From 83ded88a16a3bbc2e9a50902b0b9728e4e50aad3 Mon Sep 17 00:00:00 2001 From: root Date: Sun, 27 Sep 2015 11:48:57 +0100 Subject: working --- .gitignore | 1 + master/config | 2236 + master/endstop | 1458 + master/feeds | 813817 +++++++++++++++++++++++++++++ master/fix-mjpg-streamer-stack-smashing | 19 + master/kkmoon | 47 + master/series | 5 + master/status | 0 8 files changed, 817583 insertions(+) create mode 100644 .gitignore create mode 100644 master/config create mode 100644 master/endstop create mode 100644 master/feeds create mode 100644 master/fix-mjpg-streamer-stack-smashing create mode 100644 master/kkmoon create mode 100644 master/series create mode 100644 master/status diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..b25c15b --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +*~ diff --git a/master/config b/master/config new file mode 100644 index 0000000..f855adf --- /dev/null +++ b/master/config @@ -0,0 +1,2236 @@ +diff --git a/.config b/.config +new file mode 100644 +index 0000000..e9f4329 +--- /dev/null ++++ b/.config +@@ -0,0 +1,2230 @@ ++# ++# Automatically generated file; DO NOT EDIT. ++# OpenWrt Configuration ++# ++CONFIG_MODULES=y ++CONFIG_HAVE_DOT_CONFIG=y ++# CONFIG_TARGET_ppc44x is not set ++# CONFIG_TARGET_realview is not set ++# CONFIG_TARGET_arm64 is not set ++# CONFIG_TARGET_sunxi is not set ++# CONFIG_TARGET_ath25 is not set ++# CONFIG_TARGET_ar71xx is not set ++# CONFIG_TARGET_at91 is not set ++# CONFIG_TARGET_brcm2708 is not set ++# CONFIG_TARGET_bcm53xx is not set ++# CONFIG_TARGET_brcm47xx is not set ++# CONFIG_TARGET_brcm63xx is not set ++# CONFIG_TARGET_netlogic is not set ++# CONFIG_TARGET_cns3xxx is not set ++# CONFIG_TARGET_octeon is not set ++# CONFIG_TARGET_gemini is not set ++# CONFIG_TARGET_mpc85xx is not set ++# CONFIG_TARGET_imx6 is not set ++# CONFIG_TARGET_mxs is not set ++# CONFIG_TARGET_adm8668 is not set ++# CONFIG_TARGET_adm5120 is not set ++# CONFIG_TARGET_xburst is not set ++# CONFIG_TARGET_ixp4xx is not set ++# CONFIG_TARGET_lantiq is not set ++# CONFIG_TARGET_malta is not set ++# CONFIG_TARGET_mvebu is not set ++# CONFIG_TARGET_kirkwood is not set ++# CONFIG_TARGET_rb532 is not set ++# CONFIG_TARGET_mcs814x is not set ++# CONFIG_TARGET_oxnas is not set ++# CONFIG_TARGET_ipq806x is not set ++# CONFIG_TARGET_au1000 is not set ++CONFIG_TARGET_ramips=y ++# CONFIG_TARGET_ar7 is not set ++# CONFIG_TARGET_omap is not set ++# CONFIG_TARGET_uml is not set ++# CONFIG_TARGET_x86 is not set ++CONFIG_TARGET_ramips_rt305x=y ++# CONFIG_TARGET_ramips_mt7620 is not set ++# CONFIG_TARGET_ramips_mt7621 is not set ++# CONFIG_TARGET_ramips_mt7628 is not set ++# CONFIG_TARGET_ramips_mt7688 is not set ++# CONFIG_TARGET_ramips_rt3883 is not set ++# CONFIG_TARGET_ramips_rt288x is not set ++# CONFIG_TARGET_ramips_rt305x_Default is not set ++# CONFIG_TARGET_ramips_rt305x_ALL02393G is not set ++# CONFIG_TARGET_ramips_rt305x_ALL0256N is not set ++# CONFIG_TARGET_ramips_rt305x_ALL5002 is not set ++# CONFIG_TARGET_ramips_rt305x_ALL5003 is not set ++# CONFIG_TARGET_ramips_rt305x_ASL26555 is not set ++# CONFIG_TARGET_ramips_rt305x_FREESTATION5 is not set ++# CONFIG_TARGET_ramips_rt305x_AWAPN2403 is not set ++# CONFIG_TARGET_ramips_rt305x_AWM002EVB is not set ++# CONFIG_TARGET_ramips_rt305x_AWM003EVB is not set ++# CONFIG_TARGET_ramips_rt305x_RTN10PLUS is not set ++# CONFIG_TARGET_ramips_rt305x_RT-N13U is not set ++# CONFIG_TARGET_ramips_rt305x_MR102N is not set ++# CONFIG_TARGET_ramips_rt305x_HW550-3G is not set ++# CONFIG_TARGET_ramips_rt305x_F5D8235V2 is not set ++# CONFIG_TARGET_ramips_rt305x_F7C027 is not set ++# CONFIG_TARGET_ramips_rt305x_BROADWAY is not set ++# CONFIG_TARGET_ramips_rt305x_DCS930 is not set ++# CONFIG_TARGET_ramips_rt305x_DCS930LB1 is not set ++# CONFIG_TARGET_ramips_rt305x_DIR610A1 is not set ++# CONFIG_TARGET_ramips_rt305x_DIR-615-D is not set ++# CONFIG_TARGET_ramips_rt305x_DIR615H1 is not set ++# CONFIG_TARGET_ramips_rt305x_WIZARD8800 is not set ++# CONFIG_TARGET_ramips_rt305x_ESR-9753 is not set ++# CONFIG_TARGET_ramips_rt305x_FONERA20N is not set ++# CONFIG_TARGET_ramips_rt305x_MPRA1 is not set ++# CONFIG_TARGET_ramips_rt305x_MPRA2 is not set ++# CONFIG_TARGET_ramips_rt305x_HLKRM04 is not set ++# CONFIG_TARGET_ramips_rt305x_HT-TM02 is not set ++# CONFIG_TARGET_ramips_rt305x_HG255D is not set ++# CONFIG_TARGET_ramips_rt305x_M2M is not set ++# CONFIG_TARGET_ramips_rt305x_A5-V11 is not set ++# CONFIG_TARGET_ramips_rt305x_WT1520 is not set ++# CONFIG_TARGET_ramips_rt305x_RT5350F-OLINUXINO is not set ++# CONFIG_TARGET_ramips_rt305x_RT5350F-OLINUXINO-EVB is not set ++# CONFIG_TARGET_ramips_rt305x_MZK-DP150N is not set ++# CONFIG_TARGET_ramips_rt305x_IP2202 is not set ++# CONFIG_TARGET_ramips_rt305x_M3 is not set ++# CONFIG_TARGET_ramips_rt305x_M4 is not set ++# CONFIG_TARGET_ramips_rt305x_X5 is not set ++# CONFIG_TARGET_ramips_rt305x_X8 is not set ++# CONFIG_TARGET_ramips_rt305x_PX-4885 is not set ++# CONFIG_TARGET_ramips_rt305x_3G150B is not set ++# CONFIG_TARGET_ramips_rt305x_3G300M is not set ++# CONFIG_TARGET_ramips_rt305x_W306R_V20 is not set ++# CONFIG_TARGET_ramips_rt305x_UR-326N4G is not set ++# CONFIG_TARGET_ramips_rt305x_UR-336UN is not set ++# CONFIG_TARGET_ramips_rt305x_VOCORE is not set ++CONFIG_TARGET_ramips_rt305x_NCS601W=y ++# CONFIG_TARGET_ramips_rt305x_WIZFI630A is not set ++CONFIG_HAS_SUBTARGETS=y ++CONFIG_TARGET_BOARD="ramips" ++CONFIG_TARGET_ARCH_PACKAGES="ramips_24kec" ++CONFIG_DEFAULT_TARGET_OPTIMIZATION="-Os -pipe -mno-branch-likely -mips32r2 -mtune=24kec -mdsp" ++CONFIG_CPU_TYPE="24kec+dsp" ++CONFIG_LINUX_3_18=y ++CONFIG_DEFAULT_base-files=y ++CONFIG_DEFAULT_busybox=y ++CONFIG_DEFAULT_dnsmasq=y ++CONFIG_DEFAULT_dropbear=y ++CONFIG_DEFAULT_firewall=y ++CONFIG_DEFAULT_fstools=y ++CONFIG_DEFAULT_ip6tables=y ++CONFIG_DEFAULT_iptables=y ++CONFIG_DEFAULT_iwinfo=y ++CONFIG_DEFAULT_kmod-gpio-button-hotplug=y ++CONFIG_DEFAULT_kmod-leds-gpio=y ++CONFIG_DEFAULT_kmod-nf-nathelper=y ++CONFIG_DEFAULT_kmod-rt2800-soc=y ++CONFIG_DEFAULT_kmod-usb-core=y ++CONFIG_DEFAULT_kmod-usb-ohci=y ++CONFIG_DEFAULT_kmod-video-core=y ++CONFIG_DEFAULT_kmod-video-uvc=y ++CONFIG_DEFAULT_libc=y ++CONFIG_DEFAULT_libgcc=y ++CONFIG_DEFAULT_mtd=y ++CONFIG_DEFAULT_netifd=y ++CONFIG_DEFAULT_odhcp6c=y ++CONFIG_DEFAULT_odhcpd=y ++CONFIG_DEFAULT_opkg=y ++CONFIG_DEFAULT_ppp=y ++CONFIG_DEFAULT_ppp-mod-pppoe=y ++CONFIG_DEFAULT_swconfig=y ++CONFIG_DEFAULT_uci=y ++CONFIG_DEFAULT_wpad-mini=y ++CONFIG_AUDIO_SUPPORT=y ++CONFIG_GPIO_SUPPORT=y ++CONFIG_USB_SUPPORT=y ++CONFIG_USES_DEVICETREE=y ++CONFIG_USES_INITRAMFS=y ++CONFIG_USES_SQUASHFS=y ++CONFIG_mipsel=y ++CONFIG_ARCH="mipsel" ++ ++# ++# Target Images ++# ++CONFIG_TARGET_ROOTFS_INITRAMFS=y ++# CONFIG_TARGET_INITRAMFS_COMPRESSION_NONE is not set ++# CONFIG_TARGET_INITRAMFS_COMPRESSION_GZIP is not set ++# CONFIG_TARGET_INITRAMFS_COMPRESSION_BZIP2 is not set ++CONFIG_TARGET_INITRAMFS_COMPRESSION_LZMA=y ++# CONFIG_TARGET_INITRAMFS_COMPRESSION_LZO is not set ++# CONFIG_TARGET_INITRAMFS_COMPRESSION_LZ4 is not set ++# CONFIG_TARGET_INITRAMFS_COMPRESSION_XZ is not set ++CONFIG_EXTERNAL_CPIO="" ++ ++# ++# Root filesystem archives ++# ++# CONFIG_TARGET_ROOTFS_CPIOGZ is not set ++# CONFIG_TARGET_ROOTFS_TARGZ is not set ++ ++# ++# Root filesystem images ++# ++# CONFIG_TARGET_ROOTFS_EXT4FS is not set ++# CONFIG_TARGET_ROOTFS_JFFS2 is not set ++CONFIG_TARGET_ROOTFS_SQUASHFS=y ++CONFIG_TARGET_SQUASHFS_BLOCK_SIZE=256 ++CONFIG_TARGET_UBIFS_FREE_SPACE_FIXUP=y ++CONFIG_TARGET_UBIFS_JOURNAL_SIZE="" ++ ++# ++# Image Options ++# ++CONFIG_TARGET_ROOTFS_INCLUDE_UIMAGE=y ++CONFIG_TARGET_ROOTFS_INCLUDE_ZIMAGE=y ++CONFIG_TARGET_ROOTFS_INCLUDE_FIT=y ++ ++# ++# Global build settings ++# ++# CONFIG_ALL_KMODS is not set ++# CONFIG_ALL is not set ++CONFIG_SIGNED_PACKAGES=y ++ ++# ++# General build options ++# ++# CONFIG_DISPLAY_SUPPORT is not set ++CONFIG_BUILD_PATENTED=y ++# CONFIG_BUILD_NLS is not set ++CONFIG_SHADOW_PASSWORDS=y ++# CONFIG_CLEAN_IPKG is not set ++# CONFIG_COLLECT_KERNEL_DEBUG is not set ++ ++# ++# Kernel build options ++# ++CONFIG_KERNEL_PRINTK=y ++CONFIG_KERNEL_CRASHLOG=y ++CONFIG_KERNEL_SWAP=y ++CONFIG_KERNEL_DEBUG_FS=y ++# CONFIG_KERNEL_PERF_EVENTS is not set ++# CONFIG_KERNEL_PROFILING is not set ++CONFIG_KERNEL_KALLSYMS=y ++# CONFIG_KERNEL_FTRACE is not set ++CONFIG_KERNEL_DEBUG_KERNEL=y ++CONFIG_KERNEL_DEBUG_INFO=y ++# CONFIG_KERNEL_DYNAMIC_DEBUG is not set ++# CONFIG_KERNEL_KPROBES is not set ++# CONFIG_KERNEL_AIO is not set ++# CONFIG_KERNEL_DIRECT_IO is not set ++# CONFIG_KERNEL_FHANDLE is not set ++# CONFIG_KERNEL_FANOTIFY is not set ++# CONFIG_KERNEL_BLK_DEV_BSG is not set ++CONFIG_KERNEL_MAGIC_SYSRQ=y ++CONFIG_KERNEL_COREDUMP=y ++CONFIG_KERNEL_ELF_CORE=y ++# CONFIG_KERNEL_PROVE_LOCKING is not set ++CONFIG_KERNEL_PRINTK_TIME=y ++# CONFIG_KERNEL_SLABINFO is not set ++# CONFIG_KERNEL_PROC_PAGE_MONITOR is not set ++# CONFIG_KERNEL_KEXEC is not set ++# CONFIG_USE_RFKILL is not set ++# CONFIG_USE_SPARSE is not set ++# CONFIG_KERNEL_DEVTMPFS is not set ++# CONFIG_KERNEL_CGROUPS is not set ++# CONFIG_KERNEL_NAMESPACES is not set ++# CONFIG_KERNEL_LXC_MISC is not set ++# CONFIG_KERNEL_SECCOMP_FILTER is not set ++# CONFIG_KERNEL_SECCOMP is not set ++ ++# ++# Package build options ++# ++# CONFIG_DEBUG is not set ++CONFIG_IPV6=y ++CONFIG_PKG_BUILD_PARALLEL=y ++CONFIG_PKG_BUILD_USE_JOBSERVER=y ++ ++# ++# Stripping options ++# ++# CONFIG_NO_STRIP is not set ++CONFIG_USE_STRIP=y ++# CONFIG_USE_SSTRIP is not set ++CONFIG_STRIP_ARGS="--strip-all" ++# CONFIG_STRIP_KERNEL_EXPORTS is not set ++# CONFIG_USE_MKLIBS is not set ++CONFIG_USE_UCLIBCXX=y ++# CONFIG_USE_LIBSTDCXX is not set ++ ++# ++# Hardening build options ++# ++CONFIG_PKG_CHECK_FORMAT_SECURITY=y ++# CONFIG_PKG_CC_STACKPROTECTOR_NONE is not set ++CONFIG_PKG_CC_STACKPROTECTOR_REGULAR=y ++# CONFIG_KERNEL_CC_STACKPROTECTOR_NONE is not set ++CONFIG_KERNEL_CC_STACKPROTECTOR_REGULAR=y ++# CONFIG_PKG_FORTIFY_SOURCE_NONE is not set ++CONFIG_PKG_FORTIFY_SOURCE_1=y ++# CONFIG_PKG_FORTIFY_SOURCE_2 is not set ++# CONFIG_PKG_RELRO_NONE is not set ++# CONFIG_PKG_RELRO_PARTIAL is not set ++CONFIG_PKG_RELRO_FULL=y ++# CONFIG_DEVEL is not set ++# CONFIG_BROKEN is not set ++CONFIG_BINARY_FOLDER="" ++CONFIG_DOWNLOAD_FOLDER="" ++CONFIG_LOCALMIRROR="" ++CONFIG_AUTOREBUILD=y ++CONFIG_BUILD_SUFFIX="" ++CONFIG_TARGET_ROOTFS_DIR="" ++# CONFIG_CCACHE is not set ++CONFIG_EXTERNAL_KERNEL_TREE="" ++CONFIG_KERNEL_GIT_CLONE_URI="" ++CONFIG_EXTRA_OPTIMIZATION="-fno-caller-saves" ++CONFIG_TARGET_OPTIMIZATION="-Os -pipe -mno-branch-likely -mips32r2 -mtune=24kec -mdsp" ++CONFIG_SOFT_FLOAT=y ++# CONFIG_EXTRA_TARGET_ARCH is not set ++CONFIG_EXTRA_BINUTILS_CONFIG_OPTIONS="" ++CONFIG_BINUTILS_VERSION="linaro" ++CONFIG_EXTRA_GCC_CONFIG_OPTIONS="" ++# CONFIG_SJLJ_EXCEPTIONS is not set ++# CONFIG_INSTALL_LIBGCJ is not set ++# CONFIG_INSTALL_GFORTRAN is not set ++CONFIG_GDB=y ++# CONFIG_INSIGHT is not set ++CONFIG_USE_MUSL=y ++CONFIG_GCC_VERSION_4_8_LINARO=y ++CONFIG_GCC_VERSION="4.8-linaro" ++CONFIG_GCC_VERSION_4_8=y ++CONFIG_MUSL_VERSION="1.1.11" ++CONFIG_LIBC="musl" ++CONFIG_LIBC_VERSION="1.1.11" ++CONFIG_TARGET_SUFFIX="musl" ++# CONFIG_IB is not set ++# CONFIG_SDK is not set ++# CONFIG_MAKE_TOOLCHAIN is not set ++# CONFIG_IMAGEOPT is not set ++# CONFIG_PREINITOPT is not set ++CONFIG_TARGET_PREINIT_SUPPRESS_STDERR=y ++CONFIG_TARGET_PREINIT_TIMEOUT=2 ++# CONFIG_TARGET_PREINIT_SHOW_NETMSG is not set ++# CONFIG_TARGET_PREINIT_SUPPRESS_FAILSAFE_NETMSG is not set ++CONFIG_TARGET_PREINIT_IFNAME="" ++CONFIG_TARGET_PREINIT_IP="192.168.1.1" ++CONFIG_TARGET_PREINIT_NETMASK="255.255.255.0" ++CONFIG_TARGET_PREINIT_BROADCAST="192.168.1.255" ++# CONFIG_INITOPT is not set ++CONFIG_TARGET_INIT_PATH="/bin:/sbin:/usr/bin:/usr/sbin" ++CONFIG_TARGET_INIT_ENV="" ++CONFIG_TARGET_INIT_CMD="/sbin/init" ++CONFIG_TARGET_INIT_SUPPRESS_STDERR=y ++# CONFIG_VERSIONOPT is not set ++CONFIG_PER_FEED_REPO=y ++CONFIG_PER_FEED_REPO_ADD_DISABLED=y ++CONFIG_PER_FEED_REPO_ADD_COMMENTED=y ++# CONFIG_FEED_packages is not set ++# CONFIG_FEED_luci is not set ++# CONFIG_FEED_routing is not set ++# CONFIG_FEED_telephony is not set ++# CONFIG_FEED_management is not set ++# CONFIG_FEED_targets is not set ++# CONFIG_SMIMEOPT is not set ++CONFIG_OPKGSMIME_PASSPHRASE=y ++ ++# ++# Base system ++# ++CONFIG_PACKAGE_base-files=y ++# CONFIG_PACKAGE_block-mount is not set ++CONFIG_PACKAGE_busybox=y ++# CONFIG_BUSYBOX_CUSTOM is not set ++CONFIG_BUSYBOX_DEFAULT_HAVE_DOT_CONFIG=y ++# CONFIG_BUSYBOX_DEFAULT_DESKTOP is not set ++# CONFIG_BUSYBOX_DEFAULT_EXTRA_COMPAT is not set ++CONFIG_BUSYBOX_DEFAULT_INCLUDE_SUSv2=y ++# CONFIG_BUSYBOX_DEFAULT_USE_PORTABLE_CODE is not set ++CONFIG_BUSYBOX_DEFAULT_PLATFORM_LINUX=y ++# CONFIG_BUSYBOX_DEFAULT_FEATURE_BUFFERS_USE_MALLOC is not set ++CONFIG_BUSYBOX_DEFAULT_FEATURE_BUFFERS_GO_ON_STACK=y ++# CONFIG_BUSYBOX_DEFAULT_FEATURE_BUFFERS_GO_IN_BSS is not set ++CONFIG_BUSYBOX_DEFAULT_SHOW_USAGE=y ++CONFIG_BUSYBOX_DEFAULT_FEATURE_VERBOSE_USAGE=y ++CONFIG_BUSYBOX_DEFAULT_FEATURE_COMPRESS_USAGE=y ++# CONFIG_BUSYBOX_DEFAULT_FEATURE_INSTALLER is not set ++# CONFIG_BUSYBOX_DEFAULT_INSTALL_NO_USR is not set ++# CONFIG_BUSYBOX_DEFAULT_LOCALE_SUPPORT is not set ++# CONFIG_BUSYBOX_DEFAULT_UNICODE_SUPPORT is not set ++# CONFIG_BUSYBOX_DEFAULT_UNICODE_USING_LOCALE is not set ++# CONFIG_BUSYBOX_DEFAULT_FEATURE_CHECK_UNICODE_IN_ENV is not set ++CONFIG_BUSYBOX_DEFAULT_SUBST_WCHAR=0 ++CONFIG_BUSYBOX_DEFAULT_LAST_SUPPORTED_WCHAR=0 ++# CONFIG_BUSYBOX_DEFAULT_UNICODE_COMBINING_WCHARS is not set ++# CONFIG_BUSYBOX_DEFAULT_UNICODE_WIDE_WCHARS is not set ++# CONFIG_BUSYBOX_DEFAULT_UNICODE_BIDI_SUPPORT is not set ++# CONFIG_BUSYBOX_DEFAULT_UNICODE_NEUTRAL_TABLE is not set ++# CONFIG_BUSYBOX_DEFAULT_UNICODE_PRESERVE_BROKEN is not set ++# CONFIG_BUSYBOX_DEFAULT_PAM is not set ++# CONFIG_BUSYBOX_DEFAULT_FEATURE_USE_SENDFILE is not set ++CONFIG_BUSYBOX_DEFAULT_LONG_OPTS=y ++CONFIG_BUSYBOX_DEFAULT_FEATURE_DEVPTS=y ++# CONFIG_BUSYBOX_DEFAULT_FEATURE_CLEAN_UP is not set ++# CONFIG_BUSYBOX_DEFAULT_FEATURE_UTMP is not set ++# CONFIG_BUSYBOX_DEFAULT_FEATURE_WTMP is not set ++CONFIG_BUSYBOX_DEFAULT_FEATURE_PIDFILE=y ++CONFIG_BUSYBOX_DEFAULT_PID_FILE_PATH="/var/run" ++CONFIG_BUSYBOX_DEFAULT_FEATURE_SUID=y ++# CONFIG_BUSYBOX_DEFAULT_FEATURE_SUID_CONFIG is not set ++# CONFIG_BUSYBOX_DEFAULT_FEATURE_SUID_CONFIG_QUIET is not set ++# CONFIG_BUSYBOX_DEFAULT_SELINUX is not set ++CONFIG_BUSYBOX_DEFAULT_FEATURE_PREFER_APPLETS=y ++CONFIG_BUSYBOX_DEFAULT_BUSYBOX_EXEC_PATH="/proc/self/exe" ++CONFIG_BUSYBOX_DEFAULT_FEATURE_SYSLOG=y ++# CONFIG_BUSYBOX_DEFAULT_FEATURE_HAVE_RPC is not set ++# CONFIG_BUSYBOX_DEFAULT_STATIC is not set ++# CONFIG_BUSYBOX_DEFAULT_PIE is not set ++# CONFIG_BUSYBOX_DEFAULT_NOMMU is not set ++# CONFIG_BUSYBOX_DEFAULT_BUILD_LIBBUSYBOX is not set ++# CONFIG_BUSYBOX_DEFAULT_FEATURE_INDIVIDUAL is not set ++# CONFIG_BUSYBOX_DEFAULT_FEATURE_SHARED_BUSYBOX is not set ++CONFIG_BUSYBOX_DEFAULT_LFS=y ++CONFIG_BUSYBOX_DEFAULT_CROSS_COMPILER_PREFIX="" ++CONFIG_BUSYBOX_DEFAULT_SYSROOT="" ++CONFIG_BUSYBOX_DEFAULT_EXTRA_CFLAGS="" ++CONFIG_BUSYBOX_DEFAULT_EXTRA_LDFLAGS="" ++CONFIG_BUSYBOX_DEFAULT_EXTRA_LDLIBS="" ++# CONFIG_BUSYBOX_DEFAULT_DEBUG is not set ++# CONFIG_BUSYBOX_DEFAULT_DEBUG_PESSIMIZE is not set ++# CONFIG_BUSYBOX_DEFAULT_UNIT_TEST is not set ++# CONFIG_BUSYBOX_DEFAULT_WERROR is not set ++CONFIG_BUSYBOX_DEFAULT_NO_DEBUG_LIB=y ++# CONFIG_BUSYBOX_DEFAULT_DMALLOC is not set ++# CONFIG_BUSYBOX_DEFAULT_EFENCE is not set ++CONFIG_BUSYBOX_DEFAULT_INSTALL_APPLET_SYMLINKS=y ++# CONFIG_BUSYBOX_DEFAULT_INSTALL_APPLET_HARDLINKS is not set ++# CONFIG_BUSYBOX_DEFAULT_INSTALL_APPLET_SCRIPT_WRAPPERS is not set ++# CONFIG_BUSYBOX_DEFAULT_INSTALL_APPLET_DONT is not set ++# CONFIG_BUSYBOX_DEFAULT_INSTALL_SH_APPLET_SYMLINK is not set ++# CONFIG_BUSYBOX_DEFAULT_INSTALL_SH_APPLET_HARDLINK is not set ++# CONFIG_BUSYBOX_DEFAULT_INSTALL_SH_APPLET_SCRIPT_WRAPPER is not set ++CONFIG_BUSYBOX_DEFAULT_PREFIX="./_install" ++# CONFIG_BUSYBOX_DEFAULT_FEATURE_SYSTEMD is not set ++# CONFIG_BUSYBOX_DEFAULT_FEATURE_RTMINMAX is not set ++CONFIG_BUSYBOX_DEFAULT_PASSWORD_MINLEN=6 ++CONFIG_BUSYBOX_DEFAULT_MD5_SMALL=1 ++CONFIG_BUSYBOX_DEFAULT_SHA3_SMALL=1 ++CONFIG_BUSYBOX_DEFAULT_FEATURE_FAST_TOP=y ++# CONFIG_BUSYBOX_DEFAULT_FEATURE_ETC_NETWORKS is not set ++# CONFIG_BUSYBOX_DEFAULT_FEATURE_USE_TERMIOS is not set ++CONFIG_BUSYBOX_DEFAULT_FEATURE_EDITING=y ++CONFIG_BUSYBOX_DEFAULT_FEATURE_EDITING_MAX_LEN=512 ++# CONFIG_BUSYBOX_DEFAULT_FEATURE_EDITING_VI is not set ++CONFIG_BUSYBOX_DEFAULT_FEATURE_EDITING_HISTORY=256 ++# CONFIG_BUSYBOX_DEFAULT_FEATURE_EDITING_SAVEHISTORY is not set ++# CONFIG_BUSYBOX_DEFAULT_FEATURE_EDITING_SAVE_ON_EXIT is not set ++# CONFIG_BUSYBOX_DEFAULT_FEATURE_REVERSE_SEARCH is not set ++CONFIG_BUSYBOX_DEFAULT_FEATURE_TAB_COMPLETION=y ++# CONFIG_BUSYBOX_DEFAULT_FEATURE_USERNAME_COMPLETION is not set ++CONFIG_BUSYBOX_DEFAULT_FEATURE_EDITING_FANCY_PROMPT=y ++# CONFIG_BUSYBOX_DEFAULT_FEATURE_EDITING_ASK_TERMINAL is not set ++CONFIG_BUSYBOX_DEFAULT_FEATURE_NON_POSIX_CP=y ++# CONFIG_BUSYBOX_DEFAULT_FEATURE_VERBOSE_CP_MESSAGE is not set ++CONFIG_BUSYBOX_DEFAULT_FEATURE_COPYBUF_KB=4 ++# CONFIG_BUSYBOX_DEFAULT_FEATURE_SKIP_ROOTFS is not set ++# CONFIG_BUSYBOX_DEFAULT_MONOTONIC_SYSCALL is not set ++CONFIG_BUSYBOX_DEFAULT_IOCTL_HEX2STR_ERROR=y ++# CONFIG_BUSYBOX_DEFAULT_FEATURE_HWIB is not set ++# CONFIG_BUSYBOX_DEFAULT_FEATURE_SEAMLESS_XZ is not set ++# CONFIG_BUSYBOX_DEFAULT_FEATURE_SEAMLESS_LZMA is not set ++# CONFIG_BUSYBOX_DEFAULT_FEATURE_SEAMLESS_BZ2 is not set ++CONFIG_BUSYBOX_DEFAULT_FEATURE_SEAMLESS_GZ=y ++# CONFIG_BUSYBOX_DEFAULT_FEATURE_SEAMLESS_Z is not set ++# CONFIG_BUSYBOX_DEFAULT_AR is not set ++# CONFIG_BUSYBOX_DEFAULT_FEATURE_AR_LONG_FILENAMES is not set ++# CONFIG_BUSYBOX_DEFAULT_FEATURE_AR_CREATE is not set ++# CONFIG_BUSYBOX_DEFAULT_UNCOMPRESS is not set ++CONFIG_BUSYBOX_DEFAULT_GUNZIP=y ++CONFIG_BUSYBOX_DEFAULT_BUNZIP2=y ++# CONFIG_BUSYBOX_DEFAULT_UNLZMA is not set ++# CONFIG_BUSYBOX_DEFAULT_FEATURE_LZMA_FAST is not set ++# CONFIG_BUSYBOX_DEFAULT_LZMA is not set ++# CONFIG_BUSYBOX_DEFAULT_UNXZ is not set ++# CONFIG_BUSYBOX_DEFAULT_XZ is not set ++# CONFIG_BUSYBOX_DEFAULT_BZIP2 is not set ++# CONFIG_BUSYBOX_DEFAULT_CPIO is not set ++# CONFIG_BUSYBOX_DEFAULT_FEATURE_CPIO_O is not set ++# CONFIG_BUSYBOX_DEFAULT_FEATURE_CPIO_P is not set ++# CONFIG_BUSYBOX_DEFAULT_DPKG is not set ++# CONFIG_BUSYBOX_DEFAULT_DPKG_DEB is not set ++# CONFIG_BUSYBOX_DEFAULT_FEATURE_DPKG_DEB_EXTRACT_ONLY is not set ++CONFIG_BUSYBOX_DEFAULT_GZIP=y ++# CONFIG_BUSYBOX_DEFAULT_FEATURE_GZIP_LONG_OPTIONS is not set ++CONFIG_BUSYBOX_DEFAULT_GZIP_FAST=0 ++# CONFIG_BUSYBOX_DEFAULT_LZOP is not set ++# CONFIG_BUSYBOX_DEFAULT_LZOP_COMPR_HIGH is not set ++# CONFIG_BUSYBOX_DEFAULT_RPM is not set ++# CONFIG_BUSYBOX_DEFAULT_RPM2CPIO is not set ++CONFIG_BUSYBOX_DEFAULT_TAR=y ++CONFIG_BUSYBOX_DEFAULT_FEATURE_TAR_CREATE=y ++# CONFIG_BUSYBOX_DEFAULT_FEATURE_TAR_AUTODETECT is not set ++CONFIG_BUSYBOX_DEFAULT_FEATURE_TAR_FROM=y ++# CONFIG_BUSYBOX_DEFAULT_FEATURE_TAR_OLDGNU_COMPATIBILITY is not set ++# CONFIG_BUSYBOX_DEFAULT_FEATURE_TAR_OLDSUN_COMPATIBILITY is not set ++CONFIG_BUSYBOX_DEFAULT_FEATURE_TAR_GNU_EXTENSIONS=y ++# CONFIG_BUSYBOX_DEFAULT_FEATURE_TAR_LONG_OPTIONS is not set ++# CONFIG_BUSYBOX_DEFAULT_FEATURE_TAR_TO_COMMAND is not set ++# CONFIG_BUSYBOX_DEFAULT_FEATURE_TAR_UNAME_GNAME is not set ++# CONFIG_BUSYBOX_DEFAULT_FEATURE_TAR_NOPRESERVE_TIME is not set ++# CONFIG_BUSYBOX_DEFAULT_FEATURE_TAR_SELINUX is not set ++# CONFIG_BUSYBOX_DEFAULT_UNZIP is not set ++CONFIG_BUSYBOX_DEFAULT_BASENAME=y ++CONFIG_BUSYBOX_DEFAULT_CAT=y ++CONFIG_BUSYBOX_DEFAULT_DATE=y ++CONFIG_BUSYBOX_DEFAULT_FEATURE_DATE_ISOFMT=y ++# CONFIG_BUSYBOX_DEFAULT_FEATURE_DATE_NANO is not set ++# CONFIG_BUSYBOX_DEFAULT_FEATURE_DATE_COMPAT is not set ++# CONFIG_BUSYBOX_DEFAULT_HOSTID is not set ++CONFIG_BUSYBOX_DEFAULT_ID=y ++# CONFIG_BUSYBOX_DEFAULT_GROUPS is not set ++# CONFIG_BUSYBOX_DEFAULT_SHUF is not set ++CONFIG_BUSYBOX_DEFAULT_TEST=y ++CONFIG_BUSYBOX_DEFAULT_FEATURE_TEST_64=y ++CONFIG_BUSYBOX_DEFAULT_TOUCH=y ++# CONFIG_BUSYBOX_DEFAULT_FEATURE_TOUCH_NODEREF is not set ++CONFIG_BUSYBOX_DEFAULT_FEATURE_TOUCH_SUSV3=y ++CONFIG_BUSYBOX_DEFAULT_TR=y ++# CONFIG_BUSYBOX_DEFAULT_FEATURE_TR_CLASSES is not set ++# CONFIG_BUSYBOX_DEFAULT_FEATURE_TR_EQUIV is not set ++# CONFIG_BUSYBOX_DEFAULT_UNLINK is not set ++# CONFIG_BUSYBOX_DEFAULT_BASE64 is not set ++# CONFIG_BUSYBOX_DEFAULT_WHO is not set ++# CONFIG_BUSYBOX_DEFAULT_USERS is not set ++# CONFIG_BUSYBOX_DEFAULT_CAL is not set ++# CONFIG_BUSYBOX_DEFAULT_CATV is not set ++CONFIG_BUSYBOX_DEFAULT_CHGRP=y ++CONFIG_BUSYBOX_DEFAULT_CHMOD=y ++CONFIG_BUSYBOX_DEFAULT_CHOWN=y ++# CONFIG_BUSYBOX_DEFAULT_FEATURE_CHOWN_LONG_OPTIONS is not set ++CONFIG_BUSYBOX_DEFAULT_CHROOT=y ++# CONFIG_BUSYBOX_DEFAULT_CKSUM is not set ++# CONFIG_BUSYBOX_DEFAULT_COMM is not set ++CONFIG_BUSYBOX_DEFAULT_CP=y ++# CONFIG_BUSYBOX_DEFAULT_FEATURE_CP_LONG_OPTIONS is not set ++CONFIG_BUSYBOX_DEFAULT_CUT=y ++CONFIG_BUSYBOX_DEFAULT_DD=y ++CONFIG_BUSYBOX_DEFAULT_FEATURE_DD_SIGNAL_HANDLING=y ++# CONFIG_BUSYBOX_DEFAULT_FEATURE_DD_THIRD_STATUS_LINE is not set ++CONFIG_BUSYBOX_DEFAULT_FEATURE_DD_IBS_OBS=y ++CONFIG_BUSYBOX_DEFAULT_DF=y ++# CONFIG_BUSYBOX_DEFAULT_FEATURE_DF_FANCY is not set ++CONFIG_BUSYBOX_DEFAULT_DIRNAME=y ++# CONFIG_BUSYBOX_DEFAULT_DOS2UNIX is not set ++# CONFIG_BUSYBOX_DEFAULT_UNIX2DOS is not set ++CONFIG_BUSYBOX_DEFAULT_DU=y ++CONFIG_BUSYBOX_DEFAULT_FEATURE_DU_DEFAULT_BLOCKSIZE_1K=y ++CONFIG_BUSYBOX_DEFAULT_ECHO=y ++CONFIG_BUSYBOX_DEFAULT_FEATURE_FANCY_ECHO=y ++CONFIG_BUSYBOX_DEFAULT_ENV=y ++# CONFIG_BUSYBOX_DEFAULT_FEATURE_ENV_LONG_OPTIONS is not set ++# CONFIG_BUSYBOX_DEFAULT_EXPAND is not set ++# CONFIG_BUSYBOX_DEFAULT_FEATURE_EXPAND_LONG_OPTIONS is not set ++CONFIG_BUSYBOX_DEFAULT_EXPR=y ++CONFIG_BUSYBOX_DEFAULT_EXPR_MATH_SUPPORT_64=y ++CONFIG_BUSYBOX_DEFAULT_FALSE=y ++# CONFIG_BUSYBOX_DEFAULT_FOLD is not set ++CONFIG_BUSYBOX_DEFAULT_FSYNC=y ++CONFIG_BUSYBOX_DEFAULT_HEAD=y ++CONFIG_BUSYBOX_DEFAULT_FEATURE_FANCY_HEAD=y ++# CONFIG_BUSYBOX_DEFAULT_INSTALL is not set ++# CONFIG_BUSYBOX_DEFAULT_FEATURE_INSTALL_LONG_OPTIONS is not set ++CONFIG_BUSYBOX_DEFAULT_LN=y ++# CONFIG_BUSYBOX_DEFAULT_LOGNAME is not set ++CONFIG_BUSYBOX_DEFAULT_LS=y ++CONFIG_BUSYBOX_DEFAULT_FEATURE_LS_FILETYPES=y ++CONFIG_BUSYBOX_DEFAULT_FEATURE_LS_FOLLOWLINKS=y ++CONFIG_BUSYBOX_DEFAULT_FEATURE_LS_RECURSIVE=y ++CONFIG_BUSYBOX_DEFAULT_FEATURE_LS_SORTFILES=y ++CONFIG_BUSYBOX_DEFAULT_FEATURE_LS_TIMESTAMPS=y ++CONFIG_BUSYBOX_DEFAULT_FEATURE_LS_USERNAME=y ++CONFIG_BUSYBOX_DEFAULT_FEATURE_LS_COLOR=y ++CONFIG_BUSYBOX_DEFAULT_FEATURE_LS_COLOR_IS_DEFAULT=y ++CONFIG_BUSYBOX_DEFAULT_MD5SUM=y ++CONFIG_BUSYBOX_DEFAULT_MKDIR=y ++# CONFIG_BUSYBOX_DEFAULT_FEATURE_MKDIR_LONG_OPTIONS is not set ++CONFIG_BUSYBOX_DEFAULT_MKFIFO=y ++CONFIG_BUSYBOX_DEFAULT_MKNOD=y ++CONFIG_BUSYBOX_DEFAULT_MV=y ++# CONFIG_BUSYBOX_DEFAULT_FEATURE_MV_LONG_OPTIONS is not set ++CONFIG_BUSYBOX_DEFAULT_NICE=y ++# CONFIG_BUSYBOX_DEFAULT_NOHUP is not set ++# CONFIG_BUSYBOX_DEFAULT_OD is not set ++# CONFIG_BUSYBOX_DEFAULT_PRINTENV is not set ++CONFIG_BUSYBOX_DEFAULT_PRINTF=y ++CONFIG_BUSYBOX_DEFAULT_PWD=y ++CONFIG_BUSYBOX_DEFAULT_READLINK=y ++CONFIG_BUSYBOX_DEFAULT_FEATURE_READLINK_FOLLOW=y ++# CONFIG_BUSYBOX_DEFAULT_REALPATH is not set ++CONFIG_BUSYBOX_DEFAULT_RM=y ++CONFIG_BUSYBOX_DEFAULT_RMDIR=y ++# CONFIG_BUSYBOX_DEFAULT_FEATURE_RMDIR_LONG_OPTIONS is not set ++CONFIG_BUSYBOX_DEFAULT_SEQ=y ++# CONFIG_BUSYBOX_DEFAULT_SHA1SUM is not set ++# CONFIG_BUSYBOX_DEFAULT_SHA256SUM is not set ++# CONFIG_BUSYBOX_DEFAULT_SHA512SUM is not set ++# CONFIG_BUSYBOX_DEFAULT_SHA3SUM is not set ++CONFIG_BUSYBOX_DEFAULT_SLEEP=y ++CONFIG_BUSYBOX_DEFAULT_FEATURE_FANCY_SLEEP=y ++# CONFIG_BUSYBOX_DEFAULT_FEATURE_FLOAT_SLEEP is not set ++CONFIG_BUSYBOX_DEFAULT_SORT=y ++# CONFIG_BUSYBOX_DEFAULT_FEATURE_SORT_BIG is not set ++# CONFIG_BUSYBOX_DEFAULT_SPLIT is not set ++# CONFIG_BUSYBOX_DEFAULT_FEATURE_SPLIT_FANCY is not set ++# CONFIG_BUSYBOX_DEFAULT_STAT is not set ++# CONFIG_BUSYBOX_DEFAULT_FEATURE_STAT_FORMAT is not set ++# CONFIG_BUSYBOX_DEFAULT_STTY is not set ++# CONFIG_BUSYBOX_DEFAULT_SUM is not set ++CONFIG_BUSYBOX_DEFAULT_SYNC=y ++# CONFIG_BUSYBOX_DEFAULT_TAC is not set ++CONFIG_BUSYBOX_DEFAULT_TAIL=y ++CONFIG_BUSYBOX_DEFAULT_FEATURE_FANCY_TAIL=y ++CONFIG_BUSYBOX_DEFAULT_TEE=y ++CONFIG_BUSYBOX_DEFAULT_FEATURE_TEE_USE_BLOCK_IO=y ++CONFIG_BUSYBOX_DEFAULT_TRUE=y ++# CONFIG_BUSYBOX_DEFAULT_TTY is not set ++CONFIG_BUSYBOX_DEFAULT_UNAME=y ++# CONFIG_BUSYBOX_DEFAULT_UNEXPAND is not set ++# CONFIG_BUSYBOX_DEFAULT_FEATURE_UNEXPAND_LONG_OPTIONS is not set ++CONFIG_BUSYBOX_DEFAULT_UNIQ=y ++# CONFIG_BUSYBOX_DEFAULT_USLEEP is not set ++# CONFIG_BUSYBOX_DEFAULT_UUDECODE is not set ++# CONFIG_BUSYBOX_DEFAULT_UUENCODE is not set ++CONFIG_BUSYBOX_DEFAULT_WC=y ++# CONFIG_BUSYBOX_DEFAULT_FEATURE_WC_LARGE is not set ++# CONFIG_BUSYBOX_DEFAULT_WHOAMI is not set ++CONFIG_BUSYBOX_DEFAULT_YES=y ++# CONFIG_BUSYBOX_DEFAULT_FEATURE_VERBOSE is not set ++CONFIG_BUSYBOX_DEFAULT_FEATURE_PRESERVE_HARDLINKS=y ++CONFIG_BUSYBOX_DEFAULT_FEATURE_AUTOWIDTH=y ++CONFIG_BUSYBOX_DEFAULT_FEATURE_HUMAN_READABLE=y ++CONFIG_BUSYBOX_DEFAULT_FEATURE_MD5_SHA1_SUM_CHECK=y ++# CONFIG_BUSYBOX_DEFAULT_CHVT is not set ++# CONFIG_BUSYBOX_DEFAULT_FGCONSOLE is not set ++CONFIG_BUSYBOX_DEFAULT_CLEAR=y ++# CONFIG_BUSYBOX_DEFAULT_DEALLOCVT is not set ++# CONFIG_BUSYBOX_DEFAULT_DUMPKMAP is not set ++# CONFIG_BUSYBOX_DEFAULT_KBD_MODE is not set ++# CONFIG_BUSYBOX_DEFAULT_LOADFONT is not set ++# CONFIG_BUSYBOX_DEFAULT_LOADKMAP is not set ++# CONFIG_BUSYBOX_DEFAULT_OPENVT is not set ++CONFIG_BUSYBOX_DEFAULT_RESET=y ++# CONFIG_BUSYBOX_DEFAULT_RESIZE is not set ++# CONFIG_BUSYBOX_DEFAULT_FEATURE_RESIZE_PRINT is not set ++# CONFIG_BUSYBOX_DEFAULT_SETCONSOLE is not set ++# CONFIG_BUSYBOX_DEFAULT_FEATURE_SETCONSOLE_LONG_OPTIONS is not set ++# CONFIG_BUSYBOX_DEFAULT_SETFONT is not set ++# CONFIG_BUSYBOX_DEFAULT_FEATURE_SETFONT_TEXTUAL_MAP is not set ++CONFIG_BUSYBOX_DEFAULT_DEFAULT_SETFONT_DIR="" ++# CONFIG_BUSYBOX_DEFAULT_SETKEYCODES is not set ++# CONFIG_BUSYBOX_DEFAULT_SETLOGCONS is not set ++# CONFIG_BUSYBOX_DEFAULT_SHOWKEY is not set ++# CONFIG_BUSYBOX_DEFAULT_FEATURE_LOADFONT_PSF2 is not set ++# CONFIG_BUSYBOX_DEFAULT_FEATURE_LOADFONT_RAW is not set ++CONFIG_BUSYBOX_DEFAULT_MKTEMP=y ++# CONFIG_BUSYBOX_DEFAULT_PIPE_PROGRESS is not set ++# CONFIG_BUSYBOX_DEFAULT_RUN_PARTS is not set ++# CONFIG_BUSYBOX_DEFAULT_FEATURE_RUN_PARTS_LONG_OPTIONS is not set ++# CONFIG_BUSYBOX_DEFAULT_FEATURE_RUN_PARTS_FANCY is not set ++CONFIG_BUSYBOX_DEFAULT_START_STOP_DAEMON=y ++# CONFIG_BUSYBOX_DEFAULT_FEATURE_START_STOP_DAEMON_FANCY is not set ++# CONFIG_BUSYBOX_DEFAULT_FEATURE_START_STOP_DAEMON_LONG_OPTIONS is not set ++CONFIG_BUSYBOX_DEFAULT_WHICH=y ++CONFIG_BUSYBOX_DEFAULT_AWK=y ++CONFIG_BUSYBOX_DEFAULT_FEATURE_AWK_LIBM=y ++CONFIG_BUSYBOX_DEFAULT_FEATURE_AWK_GNU_EXTENSIONS=y ++CONFIG_BUSYBOX_DEFAULT_CMP=y ++# CONFIG_BUSYBOX_DEFAULT_DIFF is not set ++# CONFIG_BUSYBOX_DEFAULT_FEATURE_DIFF_LONG_OPTIONS is not set ++# CONFIG_BUSYBOX_DEFAULT_FEATURE_DIFF_DIR is not set ++# CONFIG_BUSYBOX_DEFAULT_ED is not set ++# CONFIG_BUSYBOX_DEFAULT_PATCH is not set ++CONFIG_BUSYBOX_DEFAULT_SED=y ++CONFIG_BUSYBOX_DEFAULT_VI=y ++CONFIG_BUSYBOX_DEFAULT_FEATURE_VI_MAX_LEN=1024 ++# CONFIG_BUSYBOX_DEFAULT_FEATURE_VI_8BIT is not set ++CONFIG_BUSYBOX_DEFAULT_FEATURE_VI_COLON=y ++CONFIG_BUSYBOX_DEFAULT_FEATURE_VI_YANKMARK=y ++CONFIG_BUSYBOX_DEFAULT_FEATURE_VI_SEARCH=y ++# CONFIG_BUSYBOX_DEFAULT_FEATURE_VI_REGEX_SEARCH is not set ++CONFIG_BUSYBOX_DEFAULT_FEATURE_VI_USE_SIGNALS=y ++CONFIG_BUSYBOX_DEFAULT_FEATURE_VI_DOT_CMD=y ++CONFIG_BUSYBOX_DEFAULT_FEATURE_VI_READONLY=y ++CONFIG_BUSYBOX_DEFAULT_FEATURE_VI_SETOPTS=y ++CONFIG_BUSYBOX_DEFAULT_FEATURE_VI_SET=y ++CONFIG_BUSYBOX_DEFAULT_FEATURE_VI_WIN_RESIZE=y ++CONFIG_BUSYBOX_DEFAULT_FEATURE_VI_ASK_TERMINAL=y ++# CONFIG_BUSYBOX_DEFAULT_FEATURE_VI_UNDO is not set ++# CONFIG_BUSYBOX_DEFAULT_FEATURE_VI_UNDO_QUEUE is not set ++CONFIG_BUSYBOX_DEFAULT_FEATURE_VI_UNDO_QUEUE_MAX=0 ++CONFIG_BUSYBOX_DEFAULT_FEATURE_ALLOW_EXEC=y ++CONFIG_BUSYBOX_DEFAULT_FIND=y ++CONFIG_BUSYBOX_DEFAULT_FEATURE_FIND_PRINT0=y ++# CONFIG_BUSYBOX_DEFAULT_FEATURE_FIND_MTIME is not set ++# CONFIG_BUSYBOX_DEFAULT_FEATURE_FIND_MMIN is not set ++CONFIG_BUSYBOX_DEFAULT_FEATURE_FIND_PERM=y ++CONFIG_BUSYBOX_DEFAULT_FEATURE_FIND_TYPE=y ++CONFIG_BUSYBOX_DEFAULT_FEATURE_FIND_XDEV=y ++CONFIG_BUSYBOX_DEFAULT_FEATURE_FIND_MAXDEPTH=y ++# CONFIG_BUSYBOX_DEFAULT_FEATURE_FIND_NEWER is not set ++# CONFIG_BUSYBOX_DEFAULT_FEATURE_FIND_INUM is not set ++CONFIG_BUSYBOX_DEFAULT_FEATURE_FIND_EXEC=y ++# CONFIG_BUSYBOX_DEFAULT_FEATURE_FIND_EXEC_PLUS is not set ++CONFIG_BUSYBOX_DEFAULT_FEATURE_FIND_USER=y ++CONFIG_BUSYBOX_DEFAULT_FEATURE_FIND_GROUP=y ++CONFIG_BUSYBOX_DEFAULT_FEATURE_FIND_NOT=y ++CONFIG_BUSYBOX_DEFAULT_FEATURE_FIND_DEPTH=y ++CONFIG_BUSYBOX_DEFAULT_FEATURE_FIND_PAREN=y ++CONFIG_BUSYBOX_DEFAULT_FEATURE_FIND_SIZE=y ++CONFIG_BUSYBOX_DEFAULT_FEATURE_FIND_PRUNE=y ++# CONFIG_BUSYBOX_DEFAULT_FEATURE_FIND_DELETE is not set ++CONFIG_BUSYBOX_DEFAULT_FEATURE_FIND_PATH=y ++CONFIG_BUSYBOX_DEFAULT_FEATURE_FIND_REGEX=y ++# CONFIG_BUSYBOX_DEFAULT_FEATURE_FIND_CONTEXT is not set ++# CONFIG_BUSYBOX_DEFAULT_FEATURE_FIND_LINKS is not set ++CONFIG_BUSYBOX_DEFAULT_GREP=y ++CONFIG_BUSYBOX_DEFAULT_FEATURE_GREP_EGREP_ALIAS=y ++CONFIG_BUSYBOX_DEFAULT_FEATURE_GREP_FGREP_ALIAS=y ++CONFIG_BUSYBOX_DEFAULT_FEATURE_GREP_CONTEXT=y ++CONFIG_BUSYBOX_DEFAULT_XARGS=y ++CONFIG_BUSYBOX_DEFAULT_FEATURE_XARGS_SUPPORT_CONFIRMATION=y ++CONFIG_BUSYBOX_DEFAULT_FEATURE_XARGS_SUPPORT_QUOTES=y ++CONFIG_BUSYBOX_DEFAULT_FEATURE_XARGS_SUPPORT_TERMOPT=y ++CONFIG_BUSYBOX_DEFAULT_FEATURE_XARGS_SUPPORT_ZERO_TERM=y ++# CONFIG_BUSYBOX_DEFAULT_FEATURE_XARGS_SUPPORT_REPL_STR is not set ++# CONFIG_BUSYBOX_DEFAULT_BOOTCHARTD is not set ++# CONFIG_BUSYBOX_DEFAULT_FEATURE_BOOTCHARTD_BLOATED_HEADER is not set ++# CONFIG_BUSYBOX_DEFAULT_FEATURE_BOOTCHARTD_CONFIG_FILE is not set ++CONFIG_BUSYBOX_DEFAULT_HALT=y ++# CONFIG_BUSYBOX_DEFAULT_FEATURE_CALL_TELINIT is not set ++CONFIG_BUSYBOX_DEFAULT_TELINIT_PATH="" ++# CONFIG_BUSYBOX_DEFAULT_INIT is not set ++# CONFIG_BUSYBOX_DEFAULT_FEATURE_USE_INITTAB is not set ++# CONFIG_BUSYBOX_DEFAULT_FEATURE_KILL_REMOVED is not set ++CONFIG_BUSYBOX_DEFAULT_FEATURE_KILL_DELAY=0 ++# CONFIG_BUSYBOX_DEFAULT_FEATURE_INIT_SCTTY is not set ++# CONFIG_BUSYBOX_DEFAULT_FEATURE_INIT_SYSLOG is not set ++# CONFIG_BUSYBOX_DEFAULT_FEATURE_EXTRA_QUIET is not set ++# CONFIG_BUSYBOX_DEFAULT_FEATURE_INIT_COREDUMPS is not set ++# CONFIG_BUSYBOX_DEFAULT_FEATURE_INITRD is not set ++CONFIG_BUSYBOX_DEFAULT_INIT_TERMINAL_TYPE="" ++# CONFIG_BUSYBOX_DEFAULT_MESG is not set ++# CONFIG_BUSYBOX_DEFAULT_FEATURE_MESG_ENABLE_ONLY_GROUP is not set ++# CONFIG_BUSYBOX_DEFAULT_ADD_SHELL is not set ++# CONFIG_BUSYBOX_DEFAULT_REMOVE_SHELL is not set ++CONFIG_BUSYBOX_DEFAULT_FEATURE_SHADOWPASSWDS=y ++# CONFIG_BUSYBOX_DEFAULT_USE_BB_PWD_GRP is not set ++# CONFIG_BUSYBOX_DEFAULT_USE_BB_SHADOW is not set ++# CONFIG_BUSYBOX_DEFAULT_USE_BB_CRYPT is not set ++# CONFIG_BUSYBOX_DEFAULT_USE_BB_CRYPT_SHA is not set ++# CONFIG_BUSYBOX_DEFAULT_ADDUSER is not set ++# CONFIG_BUSYBOX_DEFAULT_FEATURE_ADDUSER_LONG_OPTIONS is not set ++# CONFIG_BUSYBOX_DEFAULT_FEATURE_CHECK_NAMES is not set ++CONFIG_BUSYBOX_DEFAULT_LAST_ID=0 ++CONFIG_BUSYBOX_DEFAULT_FIRST_SYSTEM_ID=0 ++CONFIG_BUSYBOX_DEFAULT_LAST_SYSTEM_ID=0 ++# CONFIG_BUSYBOX_DEFAULT_ADDGROUP is not set ++# CONFIG_BUSYBOX_DEFAULT_FEATURE_ADDGROUP_LONG_OPTIONS is not set ++# CONFIG_BUSYBOX_DEFAULT_FEATURE_ADDUSER_TO_GROUP is not set ++# CONFIG_BUSYBOX_DEFAULT_DELUSER is not set ++# CONFIG_BUSYBOX_DEFAULT_DELGROUP is not set ++# CONFIG_BUSYBOX_DEFAULT_FEATURE_DEL_USER_FROM_GROUP is not set ++# CONFIG_BUSYBOX_DEFAULT_GETTY is not set ++# CONFIG_BUSYBOX_DEFAULT_LOGIN is not set ++# CONFIG_BUSYBOX_DEFAULT_LOGIN_SESSION_AS_CHILD is not set ++# CONFIG_BUSYBOX_DEFAULT_LOGIN_SCRIPTS is not set ++# CONFIG_BUSYBOX_DEFAULT_FEATURE_NOLOGIN is not set ++# CONFIG_BUSYBOX_DEFAULT_FEATURE_SECURETTY is not set ++CONFIG_BUSYBOX_DEFAULT_PASSWD=y ++CONFIG_BUSYBOX_DEFAULT_FEATURE_PASSWD_WEAK_CHECK=y ++# CONFIG_BUSYBOX_DEFAULT_CRYPTPW is not set ++# CONFIG_BUSYBOX_DEFAULT_CHPASSWD is not set ++CONFIG_BUSYBOX_DEFAULT_FEATURE_DEFAULT_PASSWD_ALGO="md5" ++# CONFIG_BUSYBOX_DEFAULT_SU is not set ++# CONFIG_BUSYBOX_DEFAULT_FEATURE_SU_SYSLOG is not set ++# CONFIG_BUSYBOX_DEFAULT_FEATURE_SU_CHECKS_SHELLS is not set ++# CONFIG_BUSYBOX_DEFAULT_SULOGIN is not set ++# CONFIG_BUSYBOX_DEFAULT_VLOCK is not set ++# CONFIG_BUSYBOX_DEFAULT_CHATTR is not set ++# CONFIG_BUSYBOX_DEFAULT_FSCK is not set ++# CONFIG_BUSYBOX_DEFAULT_LSATTR is not set ++# CONFIG_BUSYBOX_DEFAULT_TUNE2FS is not set ++# CONFIG_BUSYBOX_DEFAULT_MODINFO is not set ++# CONFIG_BUSYBOX_DEFAULT_MODPROBE_SMALL is not set ++# CONFIG_BUSYBOX_DEFAULT_FEATURE_MODPROBE_SMALL_OPTIONS_ON_CMDLINE is not set ++# CONFIG_BUSYBOX_DEFAULT_FEATURE_MODPROBE_SMALL_CHECK_ALREADY_LOADED is not set ++# CONFIG_BUSYBOX_DEFAULT_INSMOD is not set ++# CONFIG_BUSYBOX_DEFAULT_RMMOD is not set ++# CONFIG_BUSYBOX_DEFAULT_LSMOD is not set ++# CONFIG_BUSYBOX_DEFAULT_FEATURE_LSMOD_PRETTY_2_6_OUTPUT is not set ++# CONFIG_BUSYBOX_DEFAULT_MODPROBE is not set ++# CONFIG_BUSYBOX_DEFAULT_FEATURE_MODPROBE_BLACKLIST is not set ++# CONFIG_BUSYBOX_DEFAULT_DEPMOD is not set ++# CONFIG_BUSYBOX_DEFAULT_FEATURE_2_4_MODULES is not set ++# CONFIG_BUSYBOX_DEFAULT_FEATURE_INSMOD_TRY_MMAP is not set ++# CONFIG_BUSYBOX_DEFAULT_FEATURE_INSMOD_VERSION_CHECKING is not set ++# CONFIG_BUSYBOX_DEFAULT_FEATURE_INSMOD_KSYMOOPS_SYMBOLS is not set ++# CONFIG_BUSYBOX_DEFAULT_FEATURE_INSMOD_LOADINKMEM is not set ++# CONFIG_BUSYBOX_DEFAULT_FEATURE_INSMOD_LOAD_MAP is not set ++# CONFIG_BUSYBOX_DEFAULT_FEATURE_INSMOD_LOAD_MAP_FULL is not set ++# CONFIG_BUSYBOX_DEFAULT_FEATURE_CHECK_TAINTED_MODULE is not set ++# CONFIG_BUSYBOX_DEFAULT_FEATURE_MODUTILS_ALIAS is not set ++# CONFIG_BUSYBOX_DEFAULT_FEATURE_MODUTILS_SYMBOLS is not set ++CONFIG_BUSYBOX_DEFAULT_DEFAULT_MODULES_DIR="" ++CONFIG_BUSYBOX_DEFAULT_DEFAULT_DEPMOD_FILE="" ++# CONFIG_BUSYBOX_DEFAULT_BLOCKDEV is not set ++# CONFIG_BUSYBOX_DEFAULT_FATATTR is not set ++# CONFIG_BUSYBOX_DEFAULT_FSTRIM is not set ++# CONFIG_BUSYBOX_DEFAULT_MDEV is not set ++# CONFIG_BUSYBOX_DEFAULT_FEATURE_MDEV_CONF is not set ++# CONFIG_BUSYBOX_DEFAULT_FEATURE_MDEV_RENAME is not set ++# CONFIG_BUSYBOX_DEFAULT_FEATURE_MDEV_RENAME_REGEXP is not set ++# CONFIG_BUSYBOX_DEFAULT_FEATURE_MDEV_EXEC is not set ++# CONFIG_BUSYBOX_DEFAULT_FEATURE_MDEV_LOAD_FIRMWARE is not set ++# CONFIG_BUSYBOX_DEFAULT_REV is not set ++# CONFIG_BUSYBOX_DEFAULT_ACPID is not set ++# CONFIG_BUSYBOX_DEFAULT_FEATURE_ACPID_COMPAT is not set ++# CONFIG_BUSYBOX_DEFAULT_BLKID is not set ++# CONFIG_BUSYBOX_DEFAULT_FEATURE_BLKID_TYPE is not set ++CONFIG_BUSYBOX_DEFAULT_DMESG=y ++CONFIG_BUSYBOX_DEFAULT_FEATURE_DMESG_PRETTY=y ++# CONFIG_BUSYBOX_DEFAULT_FBSET is not set ++# CONFIG_BUSYBOX_DEFAULT_FEATURE_FBSET_FANCY is not set ++# CONFIG_BUSYBOX_DEFAULT_FEATURE_FBSET_READMODE is not set ++# CONFIG_BUSYBOX_DEFAULT_FDFLUSH is not set ++# CONFIG_BUSYBOX_DEFAULT_FDFORMAT is not set ++# CONFIG_BUSYBOX_DEFAULT_FDISK is not set ++# CONFIG_BUSYBOX_DEFAULT_FDISK_SUPPORT_LARGE_DISKS is not set ++# CONFIG_BUSYBOX_DEFAULT_FEATURE_FDISK_WRITABLE is not set ++# CONFIG_BUSYBOX_DEFAULT_FEATURE_AIX_LABEL is not set ++# CONFIG_BUSYBOX_DEFAULT_FEATURE_SGI_LABEL is not set ++# CONFIG_BUSYBOX_DEFAULT_FEATURE_SUN_LABEL is not set ++# CONFIG_BUSYBOX_DEFAULT_FEATURE_OSF_LABEL is not set ++# CONFIG_BUSYBOX_DEFAULT_FEATURE_GPT_LABEL is not set ++# CONFIG_BUSYBOX_DEFAULT_FEATURE_FDISK_ADVANCED is not set ++# CONFIG_BUSYBOX_DEFAULT_FINDFS is not set ++# CONFIG_BUSYBOX_DEFAULT_FLOCK is not set ++# CONFIG_BUSYBOX_DEFAULT_FREERAMDISK is not set ++# CONFIG_BUSYBOX_DEFAULT_FSCK_MINIX is not set ++# CONFIG_BUSYBOX_DEFAULT_MKFS_EXT2 is not set ++# CONFIG_BUSYBOX_DEFAULT_MKFS_MINIX is not set ++# CONFIG_BUSYBOX_DEFAULT_FEATURE_MINIX2 is not set ++# CONFIG_BUSYBOX_DEFAULT_MKFS_REISER is not set ++# CONFIG_BUSYBOX_DEFAULT_MKFS_VFAT is not set ++# CONFIG_BUSYBOX_DEFAULT_GETOPT is not set ++# CONFIG_BUSYBOX_DEFAULT_FEATURE_GETOPT_LONG is not set ++CONFIG_BUSYBOX_DEFAULT_HEXDUMP=y ++# CONFIG_BUSYBOX_DEFAULT_FEATURE_HEXDUMP_REVERSE is not set ++# CONFIG_BUSYBOX_DEFAULT_HD is not set ++CONFIG_BUSYBOX_DEFAULT_HWCLOCK=y ++# CONFIG_BUSYBOX_DEFAULT_FEATURE_HWCLOCK_LONG_OPTIONS is not set ++# CONFIG_BUSYBOX_DEFAULT_FEATURE_HWCLOCK_ADJTIME_FHS is not set ++# CONFIG_BUSYBOX_DEFAULT_IPCRM is not set ++# CONFIG_BUSYBOX_DEFAULT_IPCS is not set ++# CONFIG_BUSYBOX_DEFAULT_LOSETUP is not set ++# CONFIG_BUSYBOX_DEFAULT_LSPCI is not set ++# CONFIG_BUSYBOX_DEFAULT_LSUSB is not set ++CONFIG_BUSYBOX_DEFAULT_MKSWAP=y ++# CONFIG_BUSYBOX_DEFAULT_FEATURE_MKSWAP_UUID is not set ++# CONFIG_BUSYBOX_DEFAULT_MORE is not set ++CONFIG_BUSYBOX_DEFAULT_MOUNT=y ++# CONFIG_BUSYBOX_DEFAULT_FEATURE_MOUNT_FAKE is not set ++# CONFIG_BUSYBOX_DEFAULT_FEATURE_MOUNT_VERBOSE is not set ++CONFIG_BUSYBOX_DEFAULT_FEATURE_MOUNT_HELPERS=y ++# CONFIG_BUSYBOX_DEFAULT_FEATURE_MOUNT_LABEL is not set ++# CONFIG_BUSYBOX_DEFAULT_FEATURE_MOUNT_NFS is not set ++CONFIG_BUSYBOX_DEFAULT_FEATURE_MOUNT_CIFS=y ++CONFIG_BUSYBOX_DEFAULT_FEATURE_MOUNT_FLAGS=y ++CONFIG_BUSYBOX_DEFAULT_FEATURE_MOUNT_FSTAB=y ++CONFIG_BUSYBOX_DEFAULT_PIVOT_ROOT=y ++# CONFIG_BUSYBOX_DEFAULT_RDATE is not set ++# CONFIG_BUSYBOX_DEFAULT_RDEV is not set ++# CONFIG_BUSYBOX_DEFAULT_READPROFILE is not set ++# CONFIG_BUSYBOX_DEFAULT_RTCWAKE is not set ++# CONFIG_BUSYBOX_DEFAULT_SCRIPT is not set ++# CONFIG_BUSYBOX_DEFAULT_SCRIPTREPLAY is not set ++# CONFIG_BUSYBOX_DEFAULT_SETARCH is not set ++# CONFIG_BUSYBOX_DEFAULT_SWAPONOFF is not set ++# CONFIG_BUSYBOX_DEFAULT_FEATURE_SWAPON_DISCARD is not set ++# CONFIG_BUSYBOX_DEFAULT_FEATURE_SWAPON_PRI is not set ++CONFIG_BUSYBOX_DEFAULT_SWITCH_ROOT=y ++CONFIG_BUSYBOX_DEFAULT_UMOUNT=y ++CONFIG_BUSYBOX_DEFAULT_FEATURE_UMOUNT_ALL=y ++CONFIG_BUSYBOX_DEFAULT_FEATURE_MOUNT_LOOP=y ++# CONFIG_BUSYBOX_DEFAULT_FEATURE_MOUNT_LOOP_CREATE is not set ++# CONFIG_BUSYBOX_DEFAULT_FEATURE_MTAB_SUPPORT is not set ++# CONFIG_BUSYBOX_DEFAULT_VOLUMEID is not set ++# CONFIG_BUSYBOX_DEFAULT_FEATURE_VOLUMEID_BTRFS is not set ++# CONFIG_BUSYBOX_DEFAULT_FEATURE_VOLUMEID_CRAMFS is not set ++# CONFIG_BUSYBOX_DEFAULT_FEATURE_VOLUMEID_EXFAT is not set ++# CONFIG_BUSYBOX_DEFAULT_FEATURE_VOLUMEID_EXT is not set ++# CONFIG_BUSYBOX_DEFAULT_FEATURE_VOLUMEID_F2FS is not set ++# CONFIG_BUSYBOX_DEFAULT_FEATURE_VOLUMEID_FAT is not set ++# CONFIG_BUSYBOX_DEFAULT_FEATURE_VOLUMEID_HFS is not set ++# CONFIG_BUSYBOX_DEFAULT_FEATURE_VOLUMEID_ISO9660 is not set ++# CONFIG_BUSYBOX_DEFAULT_FEATURE_VOLUMEID_JFS is not set ++# CONFIG_BUSYBOX_DEFAULT_FEATURE_VOLUMEID_LINUXRAID is not set ++# CONFIG_BUSYBOX_DEFAULT_FEATURE_VOLUMEID_LINUXSWAP is not set ++# CONFIG_BUSYBOX_DEFAULT_FEATURE_VOLUMEID_LUKS is not set ++# CONFIG_BUSYBOX_DEFAULT_FEATURE_VOLUMEID_NILFS is not set ++# CONFIG_BUSYBOX_DEFAULT_FEATURE_VOLUMEID_NTFS is not set ++# CONFIG_BUSYBOX_DEFAULT_FEATURE_VOLUMEID_OCFS2 is not set ++# CONFIG_BUSYBOX_DEFAULT_FEATURE_VOLUMEID_REISERFS is not set ++# CONFIG_BUSYBOX_DEFAULT_FEATURE_VOLUMEID_ROMFS is not set ++# CONFIG_BUSYBOX_DEFAULT_FEATURE_VOLUMEID_SQUASHFS is not set ++# CONFIG_BUSYBOX_DEFAULT_FEATURE_VOLUMEID_SYSV is not set ++# CONFIG_BUSYBOX_DEFAULT_FEATURE_VOLUMEID_UDF is not set ++# CONFIG_BUSYBOX_DEFAULT_FEATURE_VOLUMEID_XFS is not set ++# CONFIG_BUSYBOX_DEFAULT_CONSPY is not set ++CONFIG_BUSYBOX_DEFAULT_CROND=y ++# CONFIG_BUSYBOX_DEFAULT_FEATURE_CROND_D is not set ++# CONFIG_BUSYBOX_DEFAULT_FEATURE_CROND_CALL_SENDMAIL is not set ++CONFIG_BUSYBOX_DEFAULT_FEATURE_CROND_DIR="/etc" ++CONFIG_BUSYBOX_DEFAULT_LESS=y ++CONFIG_BUSYBOX_DEFAULT_FEATURE_LESS_MAXLINES=9999999 ++# CONFIG_BUSYBOX_DEFAULT_FEATURE_LESS_BRACKETS is not set ++# CONFIG_BUSYBOX_DEFAULT_FEATURE_LESS_FLAGS is not set ++# CONFIG_BUSYBOX_DEFAULT_FEATURE_LESS_MARKS is not set ++# CONFIG_BUSYBOX_DEFAULT_FEATURE_LESS_REGEXP is not set ++# CONFIG_BUSYBOX_DEFAULT_FEATURE_LESS_WINCH is not set ++# CONFIG_BUSYBOX_DEFAULT_FEATURE_LESS_ASK_TERMINAL is not set ++# CONFIG_BUSYBOX_DEFAULT_FEATURE_LESS_DASHCMD is not set ++# CONFIG_BUSYBOX_DEFAULT_FEATURE_LESS_LINENUMS is not set ++# CONFIG_BUSYBOX_DEFAULT_NANDWRITE is not set ++# CONFIG_BUSYBOX_DEFAULT_NANDDUMP is not set ++# CONFIG_BUSYBOX_DEFAULT_RFKILL is not set ++# CONFIG_BUSYBOX_DEFAULT_SETSERIAL is not set ++# CONFIG_BUSYBOX_DEFAULT_TASKSET is not set ++# CONFIG_BUSYBOX_DEFAULT_FEATURE_TASKSET_FANCY is not set ++# CONFIG_BUSYBOX_DEFAULT_UBIATTACH is not set ++# CONFIG_BUSYBOX_DEFAULT_UBIDETACH is not set ++# CONFIG_BUSYBOX_DEFAULT_UBIMKVOL is not set ++# CONFIG_BUSYBOX_DEFAULT_UBIRMVOL is not set ++# CONFIG_BUSYBOX_DEFAULT_UBIRSVOL is not set ++# CONFIG_BUSYBOX_DEFAULT_UBIUPDATEVOL is not set ++# CONFIG_BUSYBOX_DEFAULT_WALL is not set ++# CONFIG_BUSYBOX_DEFAULT_ADJTIMEX is not set ++# CONFIG_BUSYBOX_DEFAULT_BBCONFIG is not set ++# CONFIG_BUSYBOX_DEFAULT_FEATURE_COMPRESS_BBCONFIG is not set ++# CONFIG_BUSYBOX_DEFAULT_BEEP is not set ++CONFIG_BUSYBOX_DEFAULT_FEATURE_BEEP_FREQ=0 ++CONFIG_BUSYBOX_DEFAULT_FEATURE_BEEP_LENGTH_MS=0 ++# CONFIG_BUSYBOX_DEFAULT_CHAT is not set ++# CONFIG_BUSYBOX_DEFAULT_FEATURE_CHAT_NOFAIL is not set ++# CONFIG_BUSYBOX_DEFAULT_FEATURE_CHAT_TTY_HIFI is not set ++# CONFIG_BUSYBOX_DEFAULT_FEATURE_CHAT_IMPLICIT_CR is not set ++# CONFIG_BUSYBOX_DEFAULT_FEATURE_CHAT_SWALLOW_OPTS is not set ++# CONFIG_BUSYBOX_DEFAULT_FEATURE_CHAT_SEND_ESCAPES is not set ++# CONFIG_BUSYBOX_DEFAULT_FEATURE_CHAT_VAR_ABORT_LEN is not set ++# CONFIG_BUSYBOX_DEFAULT_FEATURE_CHAT_CLR_ABORT is not set ++# CONFIG_BUSYBOX_DEFAULT_CHRT is not set ++CONFIG_BUSYBOX_DEFAULT_CRONTAB=y ++# CONFIG_BUSYBOX_DEFAULT_DC is not set ++# CONFIG_BUSYBOX_DEFAULT_FEATURE_DC_LIBM is not set ++# CONFIG_BUSYBOX_DEFAULT_DEVFSD is not set ++# CONFIG_BUSYBOX_DEFAULT_DEVFSD_MODLOAD is not set ++# CONFIG_BUSYBOX_DEFAULT_DEVFSD_FG_NP is not set ++# CONFIG_BUSYBOX_DEFAULT_DEVFSD_VERBOSE is not set ++# CONFIG_BUSYBOX_DEFAULT_FEATURE_DEVFS is not set ++# CONFIG_BUSYBOX_DEFAULT_DEVMEM is not set ++# CONFIG_BUSYBOX_DEFAULT_EJECT is not set ++# CONFIG_BUSYBOX_DEFAULT_FEATURE_EJECT_SCSI is not set ++# CONFIG_BUSYBOX_DEFAULT_FBSPLASH is not set ++# CONFIG_BUSYBOX_DEFAULT_FLASHCP is not set ++# CONFIG_BUSYBOX_DEFAULT_FLASH_LOCK is not set ++# CONFIG_BUSYBOX_DEFAULT_FLASH_UNLOCK is not set ++# CONFIG_BUSYBOX_DEFAULT_FLASH_ERASEALL is not set ++# CONFIG_BUSYBOX_DEFAULT_IONICE is not set ++# CONFIG_BUSYBOX_DEFAULT_INOTIFYD is not set ++# CONFIG_BUSYBOX_DEFAULT_LAST is not set ++# CONFIG_BUSYBOX_DEFAULT_FEATURE_LAST_SMALL is not set ++# CONFIG_BUSYBOX_DEFAULT_FEATURE_LAST_FANCY is not set ++# CONFIG_BUSYBOX_DEFAULT_HDPARM is not set ++# CONFIG_BUSYBOX_DEFAULT_FEATURE_HDPARM_GET_IDENTITY is not set ++# CONFIG_BUSYBOX_DEFAULT_FEATURE_HDPARM_HDIO_SCAN_HWIF is not set ++# CONFIG_BUSYBOX_DEFAULT_FEATURE_HDPARM_HDIO_UNREGISTER_HWIF is not set ++# CONFIG_BUSYBOX_DEFAULT_FEATURE_HDPARM_HDIO_DRIVE_RESET is not set ++# CONFIG_BUSYBOX_DEFAULT_FEATURE_HDPARM_HDIO_TRISTATE_HWIF is not set ++# CONFIG_BUSYBOX_DEFAULT_FEATURE_HDPARM_HDIO_GETSET_DMA is not set ++CONFIG_BUSYBOX_DEFAULT_LOCK=y ++# CONFIG_BUSYBOX_DEFAULT_MAKEDEVS is not set ++# CONFIG_BUSYBOX_DEFAULT_FEATURE_MAKEDEVS_LEAF is not set ++# CONFIG_BUSYBOX_DEFAULT_FEATURE_MAKEDEVS_TABLE is not set ++# CONFIG_BUSYBOX_DEFAULT_MAN is not set ++# CONFIG_BUSYBOX_DEFAULT_MICROCOM is not set ++# CONFIG_BUSYBOX_DEFAULT_MOUNTPOINT is not set ++# CONFIG_BUSYBOX_DEFAULT_MT is not set ++# CONFIG_BUSYBOX_DEFAULT_RAIDAUTORUN is not set ++# CONFIG_BUSYBOX_DEFAULT_READAHEAD is not set ++# CONFIG_BUSYBOX_DEFAULT_RUNLEVEL is not set ++# CONFIG_BUSYBOX_DEFAULT_RX is not set ++# CONFIG_BUSYBOX_DEFAULT_SETSID is not set ++CONFIG_BUSYBOX_DEFAULT_STRINGS=y ++CONFIG_BUSYBOX_DEFAULT_TIME=y ++# CONFIG_BUSYBOX_DEFAULT_TIMEOUT is not set ++# CONFIG_BUSYBOX_DEFAULT_TTYSIZE is not set ++# CONFIG_BUSYBOX_DEFAULT_VOLNAME is not set ++# CONFIG_BUSYBOX_DEFAULT_WATCHDOG is not set ++# CONFIG_BUSYBOX_DEFAULT_NAMEIF is not set ++# CONFIG_BUSYBOX_DEFAULT_FEATURE_NAMEIF_EXTENDED is not set ++# CONFIG_BUSYBOX_DEFAULT_NBDCLIENT is not set ++CONFIG_BUSYBOX_DEFAULT_NC=y ++# CONFIG_BUSYBOX_DEFAULT_NC_SERVER is not set ++# CONFIG_BUSYBOX_DEFAULT_NC_EXTRA is not set ++# CONFIG_BUSYBOX_DEFAULT_NC_110_COMPAT is not set ++CONFIG_BUSYBOX_DEFAULT_PING=y ++CONFIG_BUSYBOX_DEFAULT_PING6=y ++CONFIG_BUSYBOX_DEFAULT_FEATURE_FANCY_PING=y ++# CONFIG_BUSYBOX_DEFAULT_WHOIS is not set ++CONFIG_BUSYBOX_DEFAULT_FEATURE_IPV6=y ++# CONFIG_BUSYBOX_DEFAULT_FEATURE_UNIX_LOCAL is not set ++CONFIG_BUSYBOX_DEFAULT_FEATURE_PREFER_IPV4_ADDRESS=y ++CONFIG_BUSYBOX_DEFAULT_VERBOSE_RESOLUTION_ERRORS=y ++# CONFIG_BUSYBOX_DEFAULT_ARP is not set ++# CONFIG_BUSYBOX_DEFAULT_ARPING is not set ++CONFIG_BUSYBOX_DEFAULT_BRCTL=y ++CONFIG_BUSYBOX_DEFAULT_FEATURE_BRCTL_FANCY=y ++CONFIG_BUSYBOX_DEFAULT_FEATURE_BRCTL_SHOW=y ++# CONFIG_BUSYBOX_DEFAULT_DNSD is not set ++# CONFIG_BUSYBOX_DEFAULT_ETHER_WAKE is not set ++# CONFIG_BUSYBOX_DEFAULT_FAKEIDENTD is not set ++# CONFIG_BUSYBOX_DEFAULT_FTPD is not set ++# CONFIG_BUSYBOX_DEFAULT_FEATURE_FTP_WRITE is not set ++# CONFIG_BUSYBOX_DEFAULT_FEATURE_FTPD_ACCEPT_BROKEN_LIST is not set ++# CONFIG_BUSYBOX_DEFAULT_FEATURE_FTP_AUTHENTICATION is not set ++# CONFIG_BUSYBOX_DEFAULT_FTPGET is not set ++# CONFIG_BUSYBOX_DEFAULT_FTPPUT is not set ++# CONFIG_BUSYBOX_DEFAULT_FEATURE_FTPGETPUT_LONG_OPTIONS is not set ++# CONFIG_BUSYBOX_DEFAULT_HOSTNAME is not set ++# CONFIG_BUSYBOX_DEFAULT_HTTPD is not set ++# CONFIG_BUSYBOX_DEFAULT_FEATURE_HTTPD_RANGES is not set ++# CONFIG_BUSYBOX_DEFAULT_FEATURE_HTTPD_SETUID is not set ++# CONFIG_BUSYBOX_DEFAULT_FEATURE_HTTPD_BASIC_AUTH is not set ++# CONFIG_BUSYBOX_DEFAULT_FEATURE_HTTPD_AUTH_MD5 is not set ++# CONFIG_BUSYBOX_DEFAULT_FEATURE_HTTPD_CGI is not set ++# CONFIG_BUSYBOX_DEFAULT_FEATURE_HTTPD_CONFIG_WITH_SCRIPT_INTERPR is not set ++# CONFIG_BUSYBOX_DEFAULT_FEATURE_HTTPD_SET_REMOTE_PORT_TO_ENV is not set ++# CONFIG_BUSYBOX_DEFAULT_FEATURE_HTTPD_ENCODE_URL_STR is not set ++# CONFIG_BUSYBOX_DEFAULT_FEATURE_HTTPD_ERROR_PAGES is not set ++# CONFIG_BUSYBOX_DEFAULT_FEATURE_HTTPD_PROXY is not set ++# CONFIG_BUSYBOX_DEFAULT_FEATURE_HTTPD_GZIP is not set ++CONFIG_BUSYBOX_DEFAULT_IFCONFIG=y ++CONFIG_BUSYBOX_DEFAULT_FEATURE_IFCONFIG_STATUS=y ++# CONFIG_BUSYBOX_DEFAULT_FEATURE_IFCONFIG_SLIP is not set ++# CONFIG_BUSYBOX_DEFAULT_FEATURE_IFCONFIG_MEMSTART_IOADDR_IRQ is not set ++CONFIG_BUSYBOX_DEFAULT_FEATURE_IFCONFIG_HW=y ++CONFIG_BUSYBOX_DEFAULT_FEATURE_IFCONFIG_BROADCAST_PLUS=y ++# CONFIG_BUSYBOX_DEFAULT_IFENSLAVE is not set ++# CONFIG_BUSYBOX_DEFAULT_IFPLUGD is not set ++# CONFIG_BUSYBOX_DEFAULT_IFUPDOWN is not set ++CONFIG_BUSYBOX_DEFAULT_IFUPDOWN_IFSTATE_PATH="" ++# CONFIG_BUSYBOX_DEFAULT_FEATURE_IFUPDOWN_IP is not set ++# CONFIG_BUSYBOX_DEFAULT_FEATURE_IFUPDOWN_IP_BUILTIN is not set ++# CONFIG_BUSYBOX_DEFAULT_FEATURE_IFUPDOWN_IFCONFIG_BUILTIN is not set ++# CONFIG_BUSYBOX_DEFAULT_FEATURE_IFUPDOWN_IPV4 is not set ++# CONFIG_BUSYBOX_DEFAULT_FEATURE_IFUPDOWN_IPV6 is not set ++# CONFIG_BUSYBOX_DEFAULT_FEATURE_IFUPDOWN_MAPPING is not set ++# CONFIG_BUSYBOX_DEFAULT_FEATURE_IFUPDOWN_EXTERNAL_DHCP is not set ++# CONFIG_BUSYBOX_DEFAULT_INETD is not set ++# CONFIG_BUSYBOX_DEFAULT_FEATURE_INETD_SUPPORT_BUILTIN_ECHO is not set ++# CONFIG_BUSYBOX_DEFAULT_FEATURE_INETD_SUPPORT_BUILTIN_DISCARD is not set ++# CONFIG_BUSYBOX_DEFAULT_FEATURE_INETD_SUPPORT_BUILTIN_TIME is not set ++# CONFIG_BUSYBOX_DEFAULT_FEATURE_INETD_SUPPORT_BUILTIN_DAYTIME is not set ++# CONFIG_BUSYBOX_DEFAULT_FEATURE_INETD_SUPPORT_BUILTIN_CHARGEN is not set ++# CONFIG_BUSYBOX_DEFAULT_FEATURE_INETD_RPC is not set ++CONFIG_BUSYBOX_DEFAULT_IP=y ++CONFIG_BUSYBOX_DEFAULT_FEATURE_IP_ADDRESS=y ++CONFIG_BUSYBOX_DEFAULT_FEATURE_IP_LINK=y ++CONFIG_BUSYBOX_DEFAULT_FEATURE_IP_ROUTE=y ++# CONFIG_BUSYBOX_DEFAULT_FEATURE_IP_TUNNEL is not set ++# CONFIG_BUSYBOX_DEFAULT_FEATURE_IP_RULE is not set ++# CONFIG_BUSYBOX_DEFAULT_FEATURE_IP_SHORT_FORMS is not set ++# CONFIG_BUSYBOX_DEFAULT_FEATURE_IP_RARE_PROTOCOLS is not set ++# CONFIG_BUSYBOX_DEFAULT_IPADDR is not set ++# CONFIG_BUSYBOX_DEFAULT_IPLINK is not set ++# CONFIG_BUSYBOX_DEFAULT_IPROUTE is not set ++# CONFIG_BUSYBOX_DEFAULT_IPTUNNEL is not set ++# CONFIG_BUSYBOX_DEFAULT_IPRULE is not set ++# CONFIG_BUSYBOX_DEFAULT_IPCALC is not set ++# CONFIG_BUSYBOX_DEFAULT_FEATURE_IPCALC_FANCY is not set ++# CONFIG_BUSYBOX_DEFAULT_FEATURE_IPCALC_LONG_OPTIONS is not set ++CONFIG_BUSYBOX_DEFAULT_NETMSG=y ++CONFIG_BUSYBOX_DEFAULT_NETSTAT=y ++CONFIG_BUSYBOX_DEFAULT_FEATURE_NETSTAT_WIDE=y ++CONFIG_BUSYBOX_DEFAULT_FEATURE_NETSTAT_PRG=y ++CONFIG_BUSYBOX_DEFAULT_NSLOOKUP=y ++CONFIG_BUSYBOX_DEFAULT_NTPD=y ++CONFIG_BUSYBOX_DEFAULT_FEATURE_NTPD_SERVER=y ++# CONFIG_BUSYBOX_DEFAULT_FEATURE_NTPD_CONF is not set ++# CONFIG_BUSYBOX_DEFAULT_PSCAN is not set ++CONFIG_BUSYBOX_DEFAULT_ROUTE=y ++# CONFIG_BUSYBOX_DEFAULT_SLATTACH is not set ++# CONFIG_BUSYBOX_DEFAULT_TCPSVD is not set ++# CONFIG_BUSYBOX_DEFAULT_TELNET is not set ++# CONFIG_BUSYBOX_DEFAULT_FEATURE_TELNET_TTYPE is not set ++# CONFIG_BUSYBOX_DEFAULT_FEATURE_TELNET_AUTOLOGIN is not set ++# CONFIG_BUSYBOX_DEFAULT_TELNETD is not set ++# CONFIG_BUSYBOX_DEFAULT_FEATURE_TELNETD_STANDALONE is not set ++# CONFIG_BUSYBOX_DEFAULT_FEATURE_TELNETD_INETD_WAIT is not set ++# CONFIG_BUSYBOX_DEFAULT_TFTP is not set ++# CONFIG_BUSYBOX_DEFAULT_TFTPD is not set ++# CONFIG_BUSYBOX_DEFAULT_FEATURE_TFTP_GET is not set ++# CONFIG_BUSYBOX_DEFAULT_FEATURE_TFTP_PUT is not set ++# CONFIG_BUSYBOX_DEFAULT_FEATURE_TFTP_BLOCKSIZE is not set ++# CONFIG_BUSYBOX_DEFAULT_FEATURE_TFTP_PROGRESS_BAR is not set ++# CONFIG_BUSYBOX_DEFAULT_TFTP_DEBUG is not set ++CONFIG_BUSYBOX_DEFAULT_TRACEROUTE=y ++CONFIG_BUSYBOX_DEFAULT_TRACEROUTE6=y ++CONFIG_BUSYBOX_DEFAULT_FEATURE_TRACEROUTE_VERBOSE=y ++# CONFIG_BUSYBOX_DEFAULT_FEATURE_TRACEROUTE_SOURCE_ROUTE is not set ++# CONFIG_BUSYBOX_DEFAULT_FEATURE_TRACEROUTE_USE_ICMP is not set ++# CONFIG_BUSYBOX_DEFAULT_TUNCTL is not set ++# CONFIG_BUSYBOX_DEFAULT_FEATURE_TUNCTL_UG is not set ++# CONFIG_BUSYBOX_DEFAULT_UDHCPC6 is not set ++# CONFIG_BUSYBOX_DEFAULT_UDHCPD is not set ++# CONFIG_BUSYBOX_DEFAULT_DHCPRELAY is not set ++# CONFIG_BUSYBOX_DEFAULT_DUMPLEASES is not set ++# CONFIG_BUSYBOX_DEFAULT_FEATURE_UDHCPD_WRITE_LEASES_EARLY is not set ++# CONFIG_BUSYBOX_DEFAULT_FEATURE_UDHCPD_BASE_IP_ON_MAC is not set ++CONFIG_BUSYBOX_DEFAULT_DHCPD_LEASES_FILE="" ++CONFIG_BUSYBOX_DEFAULT_UDHCPC=y ++# CONFIG_BUSYBOX_DEFAULT_FEATURE_UDHCPC_ARPING is not set ++# CONFIG_BUSYBOX_DEFAULT_FEATURE_UDHCPC_SANITIZEOPT is not set ++# CONFIG_BUSYBOX_DEFAULT_FEATURE_UDHCP_PORT is not set ++CONFIG_BUSYBOX_DEFAULT_UDHCP_DEBUG=0 ++CONFIG_BUSYBOX_DEFAULT_FEATURE_UDHCP_RFC3397=y ++# CONFIG_BUSYBOX_DEFAULT_FEATURE_UDHCP_8021Q is not set ++CONFIG_BUSYBOX_DEFAULT_UDHCPC_DEFAULT_SCRIPT="/usr/share/udhcpc/default.script" ++CONFIG_BUSYBOX_DEFAULT_UDHCPC_SLACK_FOR_BUGGY_SERVERS=80 ++CONFIG_BUSYBOX_DEFAULT_IFUPDOWN_UDHCPC_CMD_OPTIONS="" ++# CONFIG_BUSYBOX_DEFAULT_UDPSVD is not set ++# CONFIG_BUSYBOX_DEFAULT_VCONFIG is not set ++CONFIG_BUSYBOX_DEFAULT_WGET=y ++CONFIG_BUSYBOX_DEFAULT_FEATURE_WGET_STATUSBAR=y ++CONFIG_BUSYBOX_DEFAULT_FEATURE_WGET_AUTHENTICATION=y ++CONFIG_BUSYBOX_DEFAULT_FEATURE_WGET_LONG_OPTIONS=y ++# CONFIG_BUSYBOX_DEFAULT_FEATURE_WGET_TIMEOUT is not set ++# CONFIG_BUSYBOX_DEFAULT_ZCIP is not set ++# CONFIG_BUSYBOX_DEFAULT_LPD is not set ++# CONFIG_BUSYBOX_DEFAULT_LPR is not set ++# CONFIG_BUSYBOX_DEFAULT_LPQ is not set ++# CONFIG_BUSYBOX_DEFAULT_MAKEMIME is not set ++CONFIG_BUSYBOX_DEFAULT_FEATURE_MIME_CHARSET="" ++# CONFIG_BUSYBOX_DEFAULT_POPMAILDIR is not set ++# CONFIG_BUSYBOX_DEFAULT_FEATURE_POPMAILDIR_DELIVERY is not set ++# CONFIG_BUSYBOX_DEFAULT_REFORMIME is not set ++# CONFIG_BUSYBOX_DEFAULT_FEATURE_REFORMIME_COMPAT is not set ++# CONFIG_BUSYBOX_DEFAULT_SENDMAIL is not set ++# CONFIG_BUSYBOX_DEFAULT_IOSTAT is not set ++# CONFIG_BUSYBOX_DEFAULT_LSOF is not set ++# CONFIG_BUSYBOX_DEFAULT_MPSTAT is not set ++# CONFIG_BUSYBOX_DEFAULT_NMETER is not set ++# CONFIG_BUSYBOX_DEFAULT_PMAP is not set ++# CONFIG_BUSYBOX_DEFAULT_POWERTOP is not set ++# CONFIG_BUSYBOX_DEFAULT_PSTREE is not set ++# CONFIG_BUSYBOX_DEFAULT_PWDX is not set ++# CONFIG_BUSYBOX_DEFAULT_SMEMCAP is not set ++CONFIG_BUSYBOX_DEFAULT_TOP=y ++CONFIG_BUSYBOX_DEFAULT_FEATURE_TOP_CPU_USAGE_PERCENTAGE=y ++CONFIG_BUSYBOX_DEFAULT_FEATURE_TOP_CPU_GLOBAL_PERCENTS=y ++# CONFIG_BUSYBOX_DEFAULT_FEATURE_TOP_SMP_CPU is not set ++# CONFIG_BUSYBOX_DEFAULT_FEATURE_TOP_DECIMALS is not set ++# CONFIG_BUSYBOX_DEFAULT_FEATURE_TOP_SMP_PROCESS is not set ++# CONFIG_BUSYBOX_DEFAULT_FEATURE_TOPMEM is not set ++CONFIG_BUSYBOX_DEFAULT_UPTIME=y ++# CONFIG_BUSYBOX_DEFAULT_FEATURE_UPTIME_UTMP_SUPPORT is not set ++CONFIG_BUSYBOX_DEFAULT_FREE=y ++# CONFIG_BUSYBOX_DEFAULT_FUSER is not set ++CONFIG_BUSYBOX_DEFAULT_KILL=y ++CONFIG_BUSYBOX_DEFAULT_KILLALL=y ++# CONFIG_BUSYBOX_DEFAULT_KILLALL5 is not set ++CONFIG_BUSYBOX_DEFAULT_PGREP=y ++CONFIG_BUSYBOX_DEFAULT_PIDOF=y ++# CONFIG_BUSYBOX_DEFAULT_FEATURE_PIDOF_SINGLE is not set ++# CONFIG_BUSYBOX_DEFAULT_FEATURE_PIDOF_OMIT is not set ++# CONFIG_BUSYBOX_DEFAULT_PKILL is not set ++CONFIG_BUSYBOX_DEFAULT_PS=y ++CONFIG_BUSYBOX_DEFAULT_FEATURE_PS_WIDE=y ++# CONFIG_BUSYBOX_DEFAULT_FEATURE_PS_LONG is not set ++# CONFIG_BUSYBOX_DEFAULT_FEATURE_PS_TIME is not set ++# CONFIG_BUSYBOX_DEFAULT_FEATURE_PS_ADDITIONAL_COLUMNS is not set ++# CONFIG_BUSYBOX_DEFAULT_FEATURE_PS_UNUSUAL_SYSTEMS is not set ++# CONFIG_BUSYBOX_DEFAULT_RENICE is not set ++CONFIG_BUSYBOX_DEFAULT_BB_SYSCTL=y ++# CONFIG_BUSYBOX_DEFAULT_FEATURE_SHOW_THREADS is not set ++# CONFIG_BUSYBOX_DEFAULT_WATCH is not set ++# CONFIG_BUSYBOX_DEFAULT_RUNSV is not set ++# CONFIG_BUSYBOX_DEFAULT_RUNSVDIR is not set ++# CONFIG_BUSYBOX_DEFAULT_FEATURE_RUNSVDIR_LOG is not set ++# CONFIG_BUSYBOX_DEFAULT_SV is not set ++CONFIG_BUSYBOX_DEFAULT_SV_DEFAULT_SERVICE_DIR="" ++# CONFIG_BUSYBOX_DEFAULT_SVLOGD is not set ++# CONFIG_BUSYBOX_DEFAULT_CHPST is not set ++# CONFIG_BUSYBOX_DEFAULT_SETUIDGID is not set ++# CONFIG_BUSYBOX_DEFAULT_ENVUIDGID is not set ++# CONFIG_BUSYBOX_DEFAULT_ENVDIR is not set ++# CONFIG_BUSYBOX_DEFAULT_SOFTLIMIT is not set ++# CONFIG_BUSYBOX_DEFAULT_CHCON is not set ++# CONFIG_BUSYBOX_DEFAULT_FEATURE_CHCON_LONG_OPTIONS is not set ++# CONFIG_BUSYBOX_DEFAULT_GETENFORCE is not set ++# CONFIG_BUSYBOX_DEFAULT_GETSEBOOL is not set ++# CONFIG_BUSYBOX_DEFAULT_LOAD_POLICY is not set ++# CONFIG_BUSYBOX_DEFAULT_MATCHPATHCON is not set ++# CONFIG_BUSYBOX_DEFAULT_RESTORECON is not set ++# CONFIG_BUSYBOX_DEFAULT_RUNCON is not set ++# CONFIG_BUSYBOX_DEFAULT_FEATURE_RUNCON_LONG_OPTIONS is not set ++# CONFIG_BUSYBOX_DEFAULT_SELINUXENABLED is not set ++# CONFIG_BUSYBOX_DEFAULT_SETENFORCE is not set ++# CONFIG_BUSYBOX_DEFAULT_SETFILES is not set ++# CONFIG_BUSYBOX_DEFAULT_FEATURE_SETFILES_CHECK_OPTION is not set ++# CONFIG_BUSYBOX_DEFAULT_SETSEBOOL is not set ++# CONFIG_BUSYBOX_DEFAULT_SESTATUS is not set ++CONFIG_BUSYBOX_DEFAULT_ASH=y ++CONFIG_BUSYBOX_DEFAULT_ASH_BASH_COMPAT=y ++# CONFIG_BUSYBOX_DEFAULT_ASH_IDLE_TIMEOUT is not set ++CONFIG_BUSYBOX_DEFAULT_ASH_JOB_CONTROL=y ++CONFIG_BUSYBOX_DEFAULT_ASH_ALIAS=y ++CONFIG_BUSYBOX_DEFAULT_ASH_GETOPTS=y ++CONFIG_BUSYBOX_DEFAULT_ASH_BUILTIN_ECHO=y ++CONFIG_BUSYBOX_DEFAULT_ASH_BUILTIN_PRINTF=y ++CONFIG_BUSYBOX_DEFAULT_ASH_BUILTIN_TEST=y ++# CONFIG_BUSYBOX_DEFAULT_ASH_HELP is not set ++CONFIG_BUSYBOX_DEFAULT_ASH_CMDCMD=y ++# CONFIG_BUSYBOX_DEFAULT_ASH_MAIL is not set ++# CONFIG_BUSYBOX_DEFAULT_ASH_OPTIMIZE_FOR_SIZE is not set ++# CONFIG_BUSYBOX_DEFAULT_ASH_RANDOM_SUPPORT is not set ++CONFIG_BUSYBOX_DEFAULT_ASH_EXPAND_PRMT=y ++# CONFIG_BUSYBOX_DEFAULT_CTTYHACK is not set ++# CONFIG_BUSYBOX_DEFAULT_HUSH is not set ++# CONFIG_BUSYBOX_DEFAULT_HUSH_BASH_COMPAT is not set ++# CONFIG_BUSYBOX_DEFAULT_HUSH_BRACE_EXPANSION is not set ++# CONFIG_BUSYBOX_DEFAULT_HUSH_HELP is not set ++# CONFIG_BUSYBOX_DEFAULT_HUSH_INTERACTIVE is not set ++# CONFIG_BUSYBOX_DEFAULT_HUSH_SAVEHISTORY is not set ++# CONFIG_BUSYBOX_DEFAULT_HUSH_JOB is not set ++# CONFIG_BUSYBOX_DEFAULT_HUSH_TICK is not set ++# CONFIG_BUSYBOX_DEFAULT_HUSH_IF is not set ++# CONFIG_BUSYBOX_DEFAULT_HUSH_LOOPS is not set ++# CONFIG_BUSYBOX_DEFAULT_HUSH_CASE is not set ++# CONFIG_BUSYBOX_DEFAULT_HUSH_FUNCTIONS is not set ++# CONFIG_BUSYBOX_DEFAULT_HUSH_LOCAL is not set ++# CONFIG_BUSYBOX_DEFAULT_HUSH_RANDOM_SUPPORT is not set ++# CONFIG_BUSYBOX_DEFAULT_HUSH_EXPORT_N is not set ++# CONFIG_BUSYBOX_DEFAULT_HUSH_MODE_X is not set ++# CONFIG_BUSYBOX_DEFAULT_MSH is not set ++CONFIG_BUSYBOX_DEFAULT_FEATURE_SH_IS_ASH=y ++# CONFIG_BUSYBOX_DEFAULT_FEATURE_SH_IS_HUSH is not set ++# CONFIG_BUSYBOX_DEFAULT_FEATURE_SH_IS_NONE is not set ++# CONFIG_BUSYBOX_DEFAULT_FEATURE_BASH_IS_ASH is not set ++# CONFIG_BUSYBOX_DEFAULT_FEATURE_BASH_IS_HUSH is not set ++CONFIG_BUSYBOX_DEFAULT_FEATURE_BASH_IS_NONE=y ++CONFIG_BUSYBOX_DEFAULT_SH_MATH_SUPPORT=y ++CONFIG_BUSYBOX_DEFAULT_SH_MATH_SUPPORT_64=y ++# CONFIG_BUSYBOX_DEFAULT_FEATURE_SH_EXTRA_QUIET is not set ++# CONFIG_BUSYBOX_DEFAULT_FEATURE_SH_STANDALONE is not set ++CONFIG_BUSYBOX_DEFAULT_FEATURE_SH_NOFORK=y ++# CONFIG_BUSYBOX_DEFAULT_FEATURE_SH_HISTFILESIZE is not set ++# CONFIG_BUSYBOX_DEFAULT_SYSLOGD is not set ++# CONFIG_BUSYBOX_DEFAULT_FEATURE_ROTATE_LOGFILE is not set ++# CONFIG_BUSYBOX_DEFAULT_FEATURE_REMOTE_LOG is not set ++# CONFIG_BUSYBOX_DEFAULT_FEATURE_SYSLOGD_DUP is not set ++# CONFIG_BUSYBOX_DEFAULT_FEATURE_SYSLOGD_CFG is not set ++CONFIG_BUSYBOX_DEFAULT_FEATURE_SYSLOGD_READ_BUFFER_SIZE=0 ++# CONFIG_BUSYBOX_DEFAULT_FEATURE_IPC_SYSLOG is not set ++CONFIG_BUSYBOX_DEFAULT_FEATURE_IPC_SYSLOG_BUFFER_SIZE=0 ++# CONFIG_BUSYBOX_DEFAULT_LOGREAD is not set ++# CONFIG_BUSYBOX_DEFAULT_FEATURE_LOGREAD_REDUCED_LOCKING is not set ++# CONFIG_BUSYBOX_DEFAULT_FEATURE_KMSG_SYSLOG is not set ++# CONFIG_BUSYBOX_DEFAULT_KLOGD is not set ++# CONFIG_BUSYBOX_DEFAULT_FEATURE_KLOGD_KLOGCTL is not set ++CONFIG_BUSYBOX_DEFAULT_LOGGER=y ++# CONFIG_PACKAGE_ca-certificates is not set ++CONFIG_PACKAGE_dnsmasq=y ++# CONFIG_PACKAGE_dnsmasq-dhcpv6 is not set ++# CONFIG_PACKAGE_dnsmasq-full is not set ++CONFIG_PACKAGE_dropbear=y ++ ++# ++# Configuration ++# ++# CONFIG_DROPBEAR_ECC is not set ++# CONFIG_PACKAGE_ead is not set ++CONFIG_PACKAGE_firewall=y ++CONFIG_PACKAGE_fstools=y ++CONFIG_PACKAGE_jsonfilter=y ++# CONFIG_PACKAGE_libatomic is not set ++CONFIG_PACKAGE_libc=y ++CONFIG_PACKAGE_libgcc=y ++CONFIG_PACKAGE_libpthread=y ++CONFIG_PACKAGE_librt=y ++# CONFIG_PACKAGE_libstdcpp is not set ++CONFIG_PACKAGE_mtd=y ++CONFIG_PACKAGE_netifd=y ++# CONFIG_PACKAGE_om-watchdog is not set ++CONFIG_PACKAGE_opkg=y ++# CONFIG_PACKAGE_opkg-smime is not set ++CONFIG_PACKAGE_procd=y ++ ++# ++# Configuration ++# ++# CONFIG_PROCD_SHOW_BOOT is not set ++# CONFIG_PROCD_ZRAM_TMPFS is not set ++# CONFIG_PACKAGE_qos-scripts is not set ++# CONFIG_PACKAGE_resolveip is not set ++# CONFIG_PACKAGE_rpcd is not set ++CONFIG_PACKAGE_swconfig=y ++CONFIG_PACKAGE_ubox=y ++CONFIG_PACKAGE_ubus=y ++CONFIG_PACKAGE_ubusd=y ++CONFIG_PACKAGE_uci=y ++# CONFIG_PACKAGE_udev is not set ++CONFIG_PACKAGE_usign=y ++# CONFIG_PACKAGE_wireless-tools is not set ++# CONFIG_PACKAGE_zram-swap is not set ++ ++# ++# Boot Loaders ++# ++ ++# ++# Development ++# ++# CONFIG_PACKAGE_ar is not set ++# CONFIG_PACKAGE_binutils is not set ++# CONFIG_PACKAGE_gdb is not set ++# CONFIG_PACKAGE_gdbserver is not set ++# CONFIG_PACKAGE_objdump is not set ++# CONFIG_PACKAGE_trace-cmd is not set ++# CONFIG_PACKAGE_trace-cmd-extra is not set ++# CONFIG_PACKAGE_valgrind is not set ++ ++# ++# Firmware ++# ++# CONFIG_PACKAGE_r8169-firmware is not set ++# CONFIG_PACKAGE_r8188eu-firmware is not set ++ ++# ++# Kernel modules ++# ++ ++# ++# Block Devices ++# ++# CONFIG_PACKAGE_kmod-aoe is not set ++# CONFIG_PACKAGE_kmod-block2mtd is not set ++# CONFIG_PACKAGE_kmod-dm is not set ++# CONFIG_PACKAGE_kmod-loop is not set ++# CONFIG_PACKAGE_kmod-md-mod is not set ++# CONFIG_PACKAGE_kmod-nbd is not set ++# CONFIG_PACKAGE_kmod-scsi-cdrom is not set ++# CONFIG_PACKAGE_kmod-scsi-core is not set ++# CONFIG_PACKAGE_kmod-scsi-generic is not set ++ ++# ++# CAN Support ++# ++# CONFIG_PACKAGE_kmod-can is not set ++ ++# ++# Cryptographic API modules ++# ++# CONFIG_PACKAGE_kmod-crypto-aead is not set ++# CONFIG_PACKAGE_kmod-crypto-authenc is not set ++# CONFIG_PACKAGE_kmod-crypto-cbc is not set ++# CONFIG_PACKAGE_kmod-crypto-ccm is not set ++# CONFIG_PACKAGE_kmod-crypto-cmac is not set ++# CONFIG_PACKAGE_kmod-crypto-crc32c is not set ++# CONFIG_PACKAGE_kmod-crypto-ctr is not set ++# CONFIG_PACKAGE_kmod-crypto-deflate is not set ++# CONFIG_PACKAGE_kmod-crypto-des is not set ++# CONFIG_PACKAGE_kmod-crypto-ecb is not set ++# CONFIG_PACKAGE_kmod-crypto-fcrypt is not set ++# CONFIG_PACKAGE_kmod-crypto-gcm is not set ++# CONFIG_PACKAGE_kmod-crypto-gf128 is not set ++# CONFIG_PACKAGE_kmod-crypto-ghash is not set ++# CONFIG_PACKAGE_kmod-crypto-hash is not set ++# CONFIG_PACKAGE_kmod-crypto-hmac is not set ++# CONFIG_PACKAGE_kmod-crypto-hw-geode is not set ++# CONFIG_PACKAGE_kmod-crypto-hw-hifn-795x is not set ++# CONFIG_PACKAGE_kmod-crypto-hw-padlock is not set ++# CONFIG_PACKAGE_kmod-crypto-hw-talitos is not set ++# CONFIG_PACKAGE_kmod-crypto-iv is not set ++# CONFIG_PACKAGE_kmod-crypto-manager is not set ++# CONFIG_PACKAGE_kmod-crypto-md4 is not set ++# CONFIG_PACKAGE_kmod-crypto-md5 is not set ++# CONFIG_PACKAGE_kmod-crypto-michael-mic is not set ++# CONFIG_PACKAGE_kmod-crypto-misc is not set ++# CONFIG_PACKAGE_kmod-crypto-null is not set ++# CONFIG_PACKAGE_kmod-crypto-ocf is not set ++# CONFIG_PACKAGE_kmod-crypto-pcbc is not set ++# CONFIG_PACKAGE_kmod-crypto-pcompress is not set ++# CONFIG_PACKAGE_kmod-crypto-rng is not set ++# CONFIG_PACKAGE_kmod-crypto-seqiv is not set ++# CONFIG_PACKAGE_kmod-crypto-sha1 is not set ++# CONFIG_PACKAGE_kmod-crypto-sha256 is not set ++# CONFIG_PACKAGE_kmod-crypto-test is not set ++# CONFIG_PACKAGE_kmod-crypto-user is not set ++# CONFIG_PACKAGE_kmod-crypto-wq is not set ++# CONFIG_PACKAGE_kmod-crypto-xts is not set ++ ++# ++# Filesystems ++# ++# CONFIG_PACKAGE_kmod-fs-afs is not set ++# CONFIG_PACKAGE_kmod-fs-autofs4 is not set ++# CONFIG_PACKAGE_kmod-fs-btrfs is not set ++# CONFIG_PACKAGE_kmod-fs-cifs is not set ++# CONFIG_PACKAGE_kmod-fs-configfs is not set ++# CONFIG_PACKAGE_kmod-fs-cramfs is not set ++# CONFIG_PACKAGE_kmod-fs-exportfs is not set ++# CONFIG_PACKAGE_kmod-fs-ext4 is not set ++# CONFIG_PACKAGE_kmod-fs-f2fs is not set ++# CONFIG_PACKAGE_kmod-fs-fscache is not set ++# CONFIG_PACKAGE_kmod-fs-hfs is not set ++# CONFIG_PACKAGE_kmod-fs-hfsplus is not set ++# CONFIG_PACKAGE_kmod-fs-isofs is not set ++# CONFIG_PACKAGE_kmod-fs-jfs is not set ++# CONFIG_PACKAGE_kmod-fs-minix is not set ++# CONFIG_PACKAGE_kmod-fs-msdos is not set ++# CONFIG_PACKAGE_kmod-fs-nfs is not set ++# CONFIG_PACKAGE_kmod-fs-nfs-common is not set ++# CONFIG_PACKAGE_kmod-fs-nfsd is not set ++# CONFIG_PACKAGE_kmod-fs-ntfs is not set ++# CONFIG_PACKAGE_kmod-fs-reiserfs is not set ++# CONFIG_PACKAGE_kmod-fs-udf is not set ++# CONFIG_PACKAGE_kmod-fs-vfat is not set ++# CONFIG_PACKAGE_kmod-fs-xfs is not set ++# CONFIG_PACKAGE_kmod-fuse is not set ++ ++# ++# FireWire support ++# ++ ++# ++# Hardware Monitoring Support ++# ++# CONFIG_PACKAGE_kmod-hwmon-core is not set ++ ++# ++# I2C support ++# ++# CONFIG_PACKAGE_kmod-i2c-core is not set ++# CONFIG_PACKAGE_kmod-i2c-gpio-custom is not set ++ ++# ++# Input modules ++# ++# CONFIG_PACKAGE_kmod-hid is not set ++# CONFIG_PACKAGE_kmod-hid-generic is not set ++CONFIG_PACKAGE_kmod-input-core=y ++# CONFIG_PACKAGE_kmod-input-evdev is not set ++# CONFIG_PACKAGE_kmod-input-gpio-encoder is not set ++# CONFIG_PACKAGE_kmod-input-gpio-keys is not set ++# CONFIG_PACKAGE_kmod-input-gpio-keys-polled is not set ++# CONFIG_PACKAGE_kmod-input-joydev is not set ++# CONFIG_PACKAGE_kmod-input-matrixkmap is not set ++# CONFIG_PACKAGE_kmod-input-polldev is not set ++# CONFIG_PACKAGE_kmod-input-uinput is not set ++ ++# ++# LED modules ++# ++CONFIG_PACKAGE_kmod-leds-gpio=y ++# CONFIG_PACKAGE_kmod-leds-pca963x is not set ++# CONFIG_PACKAGE_kmod-ledtrig-default-on is not set ++# CONFIG_PACKAGE_kmod-ledtrig-gpio is not set ++# CONFIG_PACKAGE_kmod-ledtrig-heartbeat is not set ++# CONFIG_PACKAGE_kmod-ledtrig-morse is not set ++# CONFIG_PACKAGE_kmod-ledtrig-netdev is not set ++# CONFIG_PACKAGE_kmod-ledtrig-netfilter is not set ++# CONFIG_PACKAGE_kmod-ledtrig-oneshot is not set ++# CONFIG_PACKAGE_kmod-ledtrig-timer is not set ++# CONFIG_PACKAGE_kmod-ledtrig-transient is not set ++# CONFIG_PACKAGE_kmod-ledtrig-usbdev is not set ++ ++# ++# Libraries ++# ++# CONFIG_PACKAGE_kmod-lib-cordic is not set ++CONFIG_PACKAGE_kmod-lib-crc-ccitt=y ++CONFIG_PACKAGE_kmod-lib-crc-itu-t=y ++# CONFIG_PACKAGE_kmod-lib-crc16 is not set ++# CONFIG_PACKAGE_kmod-lib-crc32c is not set ++# CONFIG_PACKAGE_kmod-lib-crc7 is not set ++# CONFIG_PACKAGE_kmod-lib-crc8 is not set ++# CONFIG_PACKAGE_kmod-lib-lz4 is not set ++# CONFIG_PACKAGE_kmod-lib-lzo is not set ++# CONFIG_PACKAGE_kmod-lib-textsearch is not set ++# CONFIG_PACKAGE_kmod-lib-zlib is not set ++ ++# ++# Native Language Support ++# ++CONFIG_PACKAGE_kmod-nls-base=y ++# CONFIG_PACKAGE_kmod-nls-cp1250 is not set ++# CONFIG_PACKAGE_kmod-nls-cp1251 is not set ++# CONFIG_PACKAGE_kmod-nls-cp437 is not set ++# CONFIG_PACKAGE_kmod-nls-cp775 is not set ++# CONFIG_PACKAGE_kmod-nls-cp850 is not set ++# CONFIG_PACKAGE_kmod-nls-cp852 is not set ++# CONFIG_PACKAGE_kmod-nls-cp862 is not set ++# CONFIG_PACKAGE_kmod-nls-cp864 is not set ++# CONFIG_PACKAGE_kmod-nls-cp866 is not set ++# CONFIG_PACKAGE_kmod-nls-cp932 is not set ++# CONFIG_PACKAGE_kmod-nls-iso8859-1 is not set ++# CONFIG_PACKAGE_kmod-nls-iso8859-13 is not set ++# CONFIG_PACKAGE_kmod-nls-iso8859-15 is not set ++# CONFIG_PACKAGE_kmod-nls-iso8859-2 is not set ++# CONFIG_PACKAGE_kmod-nls-iso8859-6 is not set ++# CONFIG_PACKAGE_kmod-nls-iso8859-8 is not set ++# CONFIG_PACKAGE_kmod-nls-koi8r is not set ++# CONFIG_PACKAGE_kmod-nls-utf8 is not set ++ ++# ++# Netfilter Extensions ++# ++# CONFIG_PACKAGE_kmod-arptables is not set ++# CONFIG_PACKAGE_kmod-ebtables is not set ++CONFIG_PACKAGE_kmod-ip6tables=y ++# CONFIG_PACKAGE_kmod-ip6tables-extra is not set ++# CONFIG_PACKAGE_kmod-ipt-account is not set ++# CONFIG_PACKAGE_kmod-ipt-chaos is not set ++# CONFIG_PACKAGE_kmod-ipt-cluster is not set ++# CONFIG_PACKAGE_kmod-ipt-clusterip is not set ++# CONFIG_PACKAGE_kmod-ipt-compat-xtables is not set ++# CONFIG_PACKAGE_kmod-ipt-condition is not set ++CONFIG_PACKAGE_kmod-ipt-conntrack=y ++# CONFIG_PACKAGE_kmod-ipt-conntrack-extra is not set ++CONFIG_PACKAGE_kmod-ipt-core=y ++# CONFIG_PACKAGE_kmod-ipt-debug is not set ++# CONFIG_PACKAGE_kmod-ipt-delude is not set ++# CONFIG_PACKAGE_kmod-ipt-dhcpmac is not set ++# CONFIG_PACKAGE_kmod-ipt-dnetmap is not set ++# CONFIG_PACKAGE_kmod-ipt-extra is not set ++# CONFIG_PACKAGE_kmod-ipt-filter is not set ++# CONFIG_PACKAGE_kmod-ipt-fuzzy is not set ++# CONFIG_PACKAGE_kmod-ipt-geoip is not set ++# CONFIG_PACKAGE_kmod-ipt-hashlimit is not set ++# CONFIG_PACKAGE_kmod-ipt-iface is not set ++# CONFIG_PACKAGE_kmod-ipt-ipmark is not set ++# CONFIG_PACKAGE_kmod-ipt-ipopt is not set ++# CONFIG_PACKAGE_kmod-ipt-ipp2p is not set ++# CONFIG_PACKAGE_kmod-ipt-iprange is not set ++# CONFIG_PACKAGE_kmod-ipt-ipsec is not set ++# CONFIG_PACKAGE_kmod-ipt-ipset is not set ++# CONFIG_PACKAGE_kmod-ipt-ipv4options is not set ++# CONFIG_PACKAGE_kmod-ipt-led is not set ++# CONFIG_PACKAGE_kmod-ipt-length2 is not set ++# CONFIG_PACKAGE_kmod-ipt-logmark is not set ++# CONFIG_PACKAGE_kmod-ipt-lscan is not set ++# CONFIG_PACKAGE_kmod-ipt-lua is not set ++CONFIG_PACKAGE_kmod-ipt-nat=y ++# CONFIG_PACKAGE_kmod-ipt-nat-extra is not set ++# CONFIG_PACKAGE_kmod-ipt-nat6 is not set ++# CONFIG_PACKAGE_kmod-ipt-nathelper-rtsp is not set ++# CONFIG_PACKAGE_kmod-ipt-nflog is not set ++# CONFIG_PACKAGE_kmod-ipt-nfqueue is not set ++# CONFIG_PACKAGE_kmod-ipt-psd is not set ++# CONFIG_PACKAGE_kmod-ipt-quota2 is not set ++# CONFIG_PACKAGE_kmod-ipt-sysrq is not set ++# CONFIG_PACKAGE_kmod-ipt-tarpit is not set ++# CONFIG_PACKAGE_kmod-ipt-tee is not set ++# CONFIG_PACKAGE_kmod-ipt-tproxy is not set ++# CONFIG_PACKAGE_kmod-ipt-u32 is not set ++# CONFIG_PACKAGE_kmod-ipt-ulog is not set ++CONFIG_PACKAGE_kmod-nf-conntrack=y ++# CONFIG_PACKAGE_kmod-nf-conntrack-netlink is not set ++CONFIG_PACKAGE_kmod-nf-conntrack6=y ++CONFIG_PACKAGE_kmod-nf-ipt=y ++CONFIG_PACKAGE_kmod-nf-ipt6=y ++CONFIG_PACKAGE_kmod-nf-nat=y ++# CONFIG_PACKAGE_kmod-nf-nat6 is not set ++CONFIG_PACKAGE_kmod-nf-nathelper=y ++# CONFIG_PACKAGE_kmod-nf-nathelper-extra is not set ++# CONFIG_PACKAGE_kmod-nfnetlink is not set ++# CONFIG_PACKAGE_kmod-nfnetlink-log is not set ++# CONFIG_PACKAGE_kmod-nfnetlink-queue is not set ++# CONFIG_PACKAGE_kmod-nft-core is not set ++# CONFIG_PACKAGE_kmod-nft-nat is not set ++# CONFIG_PACKAGE_kmod-nft-nat6 is not set ++ ++# ++# Network Devices ++# ++# CONFIG_PACKAGE_kmod-dummy is not set ++# CONFIG_PACKAGE_kmod-gigaset is not set ++# CONFIG_PACKAGE_kmod-hfcmulti is not set ++# CONFIG_PACKAGE_kmod-hfcpci is not set ++# CONFIG_PACKAGE_kmod-ifb is not set ++# CONFIG_PACKAGE_kmod-libphy is not set ++# CONFIG_PACKAGE_kmod-macvlan is not set ++# CONFIG_PACKAGE_kmod-mii is not set ++# CONFIG_PACKAGE_kmod-of-mdio is not set ++# CONFIG_PACKAGE_kmod-phy-broadcom is not set ++# CONFIG_PACKAGE_kmod-spi-ks8995 is not set ++# CONFIG_PACKAGE_kmod-swconfig is not set ++# CONFIG_PACKAGE_kmod-switch-ip17xx is not set ++# CONFIG_PACKAGE_kmod-switch-rtl8366-smi is not set ++# CONFIG_PACKAGE_kmod-switch-rtl8366rb is not set ++# CONFIG_PACKAGE_kmod-switch-rtl8366s is not set ++# CONFIG_PACKAGE_kmod-tg3 is not set ++ ++# ++# Network Support ++# ++# CONFIG_PACKAGE_kmod-8021q is not set ++# CONFIG_PACKAGE_kmod-appletalk is not set ++# CONFIG_PACKAGE_kmod-atm is not set ++# CONFIG_PACKAGE_kmod-ax25 is not set ++# CONFIG_PACKAGE_kmod-bonding is not set ++# CONFIG_PACKAGE_kmod-bridge is not set ++# CONFIG_PACKAGE_kmod-capi is not set ++# CONFIG_PACKAGE_kmod-dnsresolver is not set ++# CONFIG_PACKAGE_kmod-gre is not set ++# CONFIG_PACKAGE_kmod-gre6 is not set ++# CONFIG_PACKAGE_kmod-ip6-tunnel is not set ++# CONFIG_PACKAGE_kmod-ipip is not set ++# CONFIG_PACKAGE_kmod-ipsec is not set ++# CONFIG_PACKAGE_kmod-iptunnel6 is not set ++CONFIG_PACKAGE_kmod-ipv6=y ++# CONFIG_PACKAGE_kmod-isdn4linux is not set ++# CONFIG_PACKAGE_kmod-l2tp is not set ++# CONFIG_PACKAGE_kmod-l2tp-eth is not set ++# CONFIG_PACKAGE_kmod-l2tp-ip is not set ++# CONFIG_PACKAGE_kmod-llc is not set ++# CONFIG_PACKAGE_kmod-misdn is not set ++# CONFIG_PACKAGE_kmod-netem is not set ++# CONFIG_PACKAGE_kmod-pktgen is not set ++CONFIG_PACKAGE_kmod-ppp=y ++# CONFIG_PACKAGE_kmod-mppe is not set ++# CONFIG_PACKAGE_kmod-ppp-synctty is not set ++# CONFIG_PACKAGE_kmod-pppoa is not set ++CONFIG_PACKAGE_kmod-pppoe=y ++# CONFIG_PACKAGE_kmod-pppol2tp is not set ++CONFIG_PACKAGE_kmod-pppox=y ++# CONFIG_PACKAGE_kmod-pptp is not set ++# CONFIG_PACKAGE_kmod-rxrpc is not set ++# CONFIG_PACKAGE_kmod-sched is not set ++# CONFIG_PACKAGE_kmod-sched-connmark is not set ++# CONFIG_PACKAGE_kmod-sched-core is not set ++# CONFIG_PACKAGE_kmod-sched-esfq is not set ++# CONFIG_PACKAGE_kmod-sctp is not set ++# CONFIG_PACKAGE_kmod-sit is not set ++CONFIG_PACKAGE_kmod-slhc=y ++# CONFIG_PACKAGE_kmod-slip is not set ++# CONFIG_PACKAGE_kmod-stp is not set ++# CONFIG_PACKAGE_kmod-trelay is not set ++# CONFIG_PACKAGE_kmod-tun is not set ++# CONFIG_PACKAGE_kmod-udptunnel4 is not set ++# CONFIG_PACKAGE_kmod-udptunnel6 is not set ++# CONFIG_PACKAGE_kmod-veth is not set ++# CONFIG_PACKAGE_kmod-vxlan is not set ++ ++# ++# Other modules ++# ++# CONFIG_PACKAGE_kmod-6lowpan is not set ++# CONFIG_PACKAGE_kmod-bluetooth is not set ++# CONFIG_PACKAGE_kmod-bluetooth_6lowpan is not set ++# CONFIG_PACKAGE_kmod-button-hotplug is not set ++# CONFIG_PACKAGE_kmod-echo is not set ++CONFIG_PACKAGE_kmod-eeprom-93cx6=y ++# CONFIG_PACKAGE_kmod-eeprom-at24 is not set ++# CONFIG_PACKAGE_kmod-eeprom-at25 is not set ++# CONFIG_PACKAGE_kmod-gpio-beeper is not set ++CONFIG_PACKAGE_kmod-gpio-button-hotplug=y ++# CONFIG_PACKAGE_kmod-gpio-dev is not set ++# CONFIG_PACKAGE_kmod-gpio-mcp23s08 is not set ++# CONFIG_PACKAGE_kmod-gpio-nxp-74hc164 is not set ++# CONFIG_PACKAGE_kmod-gpio-pca953x is not set ++# CONFIG_PACKAGE_kmod-gpio-pcf857x is not set ++# CONFIG_PACKAGE_kmod-iio-core is not set ++# CONFIG_PACKAGE_kmod-ikconfig is not set ++# CONFIG_PACKAGE_kmod-lp is not set ++# CONFIG_PACKAGE_kmod-mmc is not set ++# CONFIG_PACKAGE_kmod-mmc-over-gpio is not set ++# CONFIG_PACKAGE_kmod-mtdtests is not set ++# CONFIG_PACKAGE_kmod-pps is not set ++# CONFIG_PACKAGE_kmod-pps-gpio is not set ++# CONFIG_PACKAGE_kmod-ptp is not set ++# CONFIG_PACKAGE_kmod-random-core is not set ++# CONFIG_PACKAGE_kmod-regmap is not set ++# CONFIG_PACKAGE_kmod-rotary-gpio-custom is not set ++# CONFIG_PACKAGE_kmod-sdhci is not set ++# CONFIG_PACKAGE_kmod-serial-8250 is not set ++# CONFIG_PACKAGE_kmod-softdog is not set ++# CONFIG_PACKAGE_kmod-zram is not set ++ ++# ++# PCMCIA support ++# ++ ++# ++# SPI Support ++# ++# CONFIG_PACKAGE_kmod-mmc-spi is not set ++# CONFIG_PACKAGE_kmod-spi-bitbang is not set ++# CONFIG_PACKAGE_kmod-spi-dev is not set ++# CONFIG_PACKAGE_kmod-spi-gpio is not set ++# CONFIG_PACKAGE_kmod-spi-gpio-custom is not set ++# CONFIG_PACKAGE_kmod-spi-gpio-old is not set ++ ++# ++# Sound Support ++# ++# CONFIG_PACKAGE_kmod-sound-core is not set ++ ++# ++# USB Support ++# ++# CONFIG_PACKAGE_kmod-usb-acm is not set ++# CONFIG_PACKAGE_kmod-usb-atm is not set ++# CONFIG_PACKAGE_kmod-usb-cm109 is not set ++CONFIG_PACKAGE_kmod-usb-core=y ++# CONFIG_PACKAGE_kmod-usb-dwc2 is not set ++# CONFIG_PACKAGE_kmod-usb-dwc3 is not set ++# CONFIG_PACKAGE_kmod-usb-hid is not set ++# CONFIG_PACKAGE_kmod-usb-net is not set ++CONFIG_PACKAGE_kmod-usb-ohci=y ++# CONFIG_PACKAGE_kmod-usb-printer is not set ++# CONFIG_PACKAGE_kmod-usb-serial is not set ++# CONFIG_PACKAGE_kmod-usb-storage is not set ++# CONFIG_PACKAGE_kmod-usb-storage-extras is not set ++# CONFIG_PACKAGE_kmod-usb-uhci is not set ++# CONFIG_PACKAGE_kmod-usb-wdm is not set ++# CONFIG_PACKAGE_kmod-usb-yealink is not set ++# CONFIG_PACKAGE_kmod-usb2 is not set ++# CONFIG_PACKAGE_kmod-usb3 is not set ++# CONFIG_PACKAGE_kmod-usbip is not set ++# CONFIG_PACKAGE_kmod-usbip-client is not set ++# CONFIG_PACKAGE_kmod-usbip-server is not set ++# CONFIG_PACKAGE_kmod-usbmon is not set ++ ++# ++# Video Support ++# ++CONFIG_PACKAGE_kmod-video-core=y ++# CONFIG_PACKAGE_kmod-video-cpia2 is not set ++# CONFIG_PACKAGE_kmod-video-gspca-core is not set ++# CONFIG_PACKAGE_kmod-video-pwc is not set ++CONFIG_PACKAGE_kmod-video-uvc=y ++CONFIG_PACKAGE_kmod-video-videobuf2=y ++ ++# ++# Virtualization Support ++# ++ ++# ++# Voice over IP ++# ++ ++# ++# W1 support ++# ++# CONFIG_PACKAGE_kmod-w1 is not set ++ ++# ++# WPAN 802.15.4 Support ++# ++ ++# ++# Wireless Drivers ++# ++# CONFIG_PACKAGE_kmod-ath is not set ++# CONFIG_PACKAGE_kmod-ath9k-common is not set ++# CONFIG_PACKAGE_kmod-ath9k-htc is not set ++# CONFIG_PACKAGE_kmod-brcmfmac is not set ++# CONFIG_PACKAGE_kmod-brcmutil is not set ++# CONFIG_PACKAGE_kmod-carl9170 is not set ++CONFIG_PACKAGE_kmod-cfg80211=y ++# CONFIG_PACKAGE_kmod-lib80211 is not set ++# CONFIG_PACKAGE_kmod-libertas-sdio is not set ++# CONFIG_PACKAGE_kmod-libertas-usb is not set ++CONFIG_PACKAGE_kmod-mac80211=y ++CONFIG_PACKAGE_MAC80211_DEBUGFS=y ++CONFIG_PACKAGE_MAC80211_MESH=y ++# CONFIG_PACKAGE_kmod-mac80211-hwsim is not set ++# CONFIG_PACKAGE_kmod-mt7601u is not set ++# CONFIG_PACKAGE_kmod-net-rtl8188eu is not set ++# CONFIG_PACKAGE_kmod-net-rtl8192su is not set ++# CONFIG_PACKAGE_kmod-p54-common is not set ++# CONFIG_PACKAGE_kmod-p54-usb is not set ++# CONFIG_PACKAGE_kmod-rt2500-usb is not set ++CONFIG_PACKAGE_kmod-rt2800-lib=y ++CONFIG_PACKAGE_kmod-rt2800-mmio=y ++CONFIG_PACKAGE_kmod-rt2800-soc=y ++# CONFIG_PACKAGE_kmod-rt2800-usb is not set ++CONFIG_PACKAGE_kmod-rt2x00-lib=y ++# CONFIG_PACKAGE_RT2X00_LIB_DEBUGFS is not set ++# CONFIG_PACKAGE_RT2X00_DEBUG is not set ++CONFIG_PACKAGE_kmod-rt2x00-mmio=y ++# CONFIG_PACKAGE_kmod-rt73-usb is not set ++# CONFIG_PACKAGE_kmod-rtl8187 is not set ++# CONFIG_PACKAGE_kmod-rtl8192cu is not set ++# CONFIG_PACKAGE_kmod-zd1211rw is not set ++ ++# ++# Languages ++# ++ ++# ++# Lua ++# ++# CONFIG_PACKAGE_libiwinfo-lua is not set ++# CONFIG_PACKAGE_lua is not set ++# CONFIG_PACKAGE_luac is not set ++ ++# ++# Libraries ++# ++ ++# ++# Compression ++# ++# CONFIG_PACKAGE_libbz2 is not set ++ ++# ++# Filesystem ++# ++# CONFIG_PACKAGE_libext2fs is not set ++# CONFIG_PACKAGE_libfuse is not set ++# CONFIG_PACKAGE_libsysfs is not set ++ ++# ++# Firewall ++# ++CONFIG_PACKAGE_libip4tc=y ++CONFIG_PACKAGE_libip6tc=y ++# CONFIG_PACKAGE_libiptc is not set ++CONFIG_PACKAGE_libxtables=y ++ ++# ++# SSL ++# ++# CONFIG_PACKAGE_libcyassl is not set ++# CONFIG_PACKAGE_libmbedtls is not set ++# CONFIG_PACKAGE_libopenssl is not set ++# CONFIG_PACKAGE_libpolarssl is not set ++# CONFIG_PACKAGE_argp-standalone is not set ++# CONFIG_PACKAGE_libblkid is not set ++CONFIG_PACKAGE_libblobmsg-json=y ++# CONFIG_PACKAGE_libcharset is not set ++# CONFIG_PACKAGE_libconfig is not set ++# CONFIG_PACKAGE_libelf1 is not set ++# CONFIG_PACKAGE_libbfd is not set ++# CONFIG_PACKAGE_libcurl is not set ++# CONFIG_PACKAGE_libevent2 is not set ++# CONFIG_PACKAGE_libevent2-core is not set ++# CONFIG_PACKAGE_libevent2-extra is not set ++# CONFIG_PACKAGE_libevent2-openssl is not set ++# CONFIG_PACKAGE_libevent2-pthreads is not set ++# CONFIG_PACKAGE_libgmp is not set ++# CONFIG_PACKAGE_libiconv is not set ++# CONFIG_PACKAGE_libiconv-full is not set ++# CONFIG_PACKAGE_libintl is not set ++# CONFIG_PACKAGE_libintl-full is not set ++# CONFIG_PACKAGE_libiw is not set ++CONFIG_PACKAGE_libiwinfo=y ++CONFIG_PACKAGE_libjpeg=y ++CONFIG_PACKAGE_libjson-c=y ++# CONFIG_PACKAGE_libltdl is not set ++# CONFIG_PACKAGE_liblua is not set ++# CONFIG_PACKAGE_liblzo is not set ++# CONFIG_PACKAGE_libmnl is not set ++# CONFIG_PACKAGE_libmount is not set ++# CONFIG_PACKAGE_libncurses is not set ++# CONFIG_PACKAGE_libncursesw is not set ++# CONFIG_PACKAGE_libnetfilter-conntrack is not set ++# CONFIG_PACKAGE_libnetfilter-cthelper is not set ++# CONFIG_PACKAGE_libnetfilter-cttimeout is not set ++# CONFIG_PACKAGE_libnetfilter-log is not set ++# CONFIG_PACKAGE_libnetfilter-queue is not set ++# CONFIG_PACKAGE_libnettle is not set ++# CONFIG_PACKAGE_libnfnetlink is not set ++# CONFIG_PACKAGE_libnftnl is not set ++# CONFIG_PACKAGE_libnl is not set ++# CONFIG_PACKAGE_libnl-core is not set ++# CONFIG_PACKAGE_libnl-genl is not set ++# CONFIG_PACKAGE_libnl-nf is not set ++# CONFIG_PACKAGE_libnl-route is not set ++CONFIG_PACKAGE_libnl-tiny=y ++# CONFIG_PACKAGE_libopcodes is not set ++# CONFIG_PACKAGE_libpcap is not set ++# CONFIG_PACKAGE_libpopt is not set ++# CONFIG_PACKAGE_libreadline is not set ++# CONFIG_PACKAGE_libroxml is not set ++# CONFIG_PACKAGE_librpc is not set ++# CONFIG_PACKAGE_libsmartcols is not set ++# CONFIG_PACKAGE_libsocks is not set ++CONFIG_PACKAGE_libubox=y ++# CONFIG_PACKAGE_libubox-lua is not set ++CONFIG_PACKAGE_libubus=y ++# CONFIG_PACKAGE_libubus-lua is not set ++CONFIG_PACKAGE_libuci=y ++# CONFIG_PACKAGE_libuci-lua is not set ++# CONFIG_PACKAGE_libuclient is not set ++# CONFIG_PACKAGE_libusb-1.0 is not set ++# CONFIG_PACKAGE_libusb-compat is not set ++# CONFIG_PACKAGE_libustream-cyassl is not set ++# CONFIG_PACKAGE_libustream-openssl is not set ++# CONFIG_PACKAGE_libustream-polarssl is not set ++# CONFIG_PACKAGE_libuuid is not set ++CONFIG_PACKAGE_libv4l=y ++# CONFIG_PACKAGE_linux-atm is not set ++# CONFIG_PACKAGE_terminfo is not set ++CONFIG_PACKAGE_uclibcxx=y ++# CONFIG_PACKAGE_zlib is not set ++ ++# ++# Multimedia ++# ++CONFIG_PACKAGE_mjpg-streamer=y ++CONFIG_MJPG_STREAMER_V4L2=y ++# CONFIG_MJPG_STREAMER_INPUT_FILE is not set ++CONFIG_MJPG_STREAMER_INPUT_UVC=y ++# CONFIG_MJPG_STREAMER_INPUT_TESTPICTURE is not set ++# CONFIG_MJPG_STREAMER_OUTPUT_FILE is not set ++CONFIG_MJPG_STREAMER_OUTPUT_HTTP=y ++CONFIG_MJPG_STREAMER_WWW=y ++ ++# ++# Network ++# ++ ++# ++# File Transfer ++# ++# CONFIG_PACKAGE_curl is not set ++ ++# ++# Firewall ++# ++# CONFIG_PACKAGE_arptables is not set ++# CONFIG_PACKAGE_conntrack-tools is not set ++# CONFIG_PACKAGE_ebtables is not set ++CONFIG_PACKAGE_ip6tables=y ++# CONFIG_PACKAGE_ip6tables-extra is not set ++# CONFIG_PACKAGE_ip6tables-mod-nat is not set ++CONFIG_PACKAGE_iptables=y ++# CONFIG_PACKAGE_iptables-mod-account is not set ++# CONFIG_PACKAGE_iptables-mod-chaos is not set ++# CONFIG_PACKAGE_iptables-mod-cluster is not set ++# CONFIG_PACKAGE_iptables-mod-clusterip is not set ++# CONFIG_PACKAGE_iptables-mod-condition is not set ++# CONFIG_PACKAGE_iptables-mod-conntrack-extra is not set ++# CONFIG_PACKAGE_iptables-mod-delude is not set ++# CONFIG_PACKAGE_iptables-mod-dhcpmac is not set ++# CONFIG_PACKAGE_iptables-mod-dnetmap is not set ++# CONFIG_PACKAGE_iptables-mod-extra is not set ++# CONFIG_PACKAGE_iptables-mod-filter is not set ++# CONFIG_PACKAGE_iptables-mod-fuzzy is not set ++# CONFIG_PACKAGE_iptables-mod-geoip is not set ++# CONFIG_PACKAGE_iptables-mod-hashlimit is not set ++# CONFIG_PACKAGE_iptables-mod-iface is not set ++# CONFIG_PACKAGE_iptables-mod-ipmark is not set ++# CONFIG_PACKAGE_iptables-mod-ipopt is not set ++# CONFIG_PACKAGE_iptables-mod-ipp2p is not set ++# CONFIG_PACKAGE_iptables-mod-iprange is not set ++# CONFIG_PACKAGE_iptables-mod-ipsec is not set ++# CONFIG_PACKAGE_iptables-mod-ipv4options is not set ++# CONFIG_PACKAGE_iptables-mod-led is not set ++# CONFIG_PACKAGE_iptables-mod-length2 is not set ++# CONFIG_PACKAGE_iptables-mod-logmark is not set ++# CONFIG_PACKAGE_iptables-mod-lscan is not set ++# CONFIG_PACKAGE_iptables-mod-lua is not set ++# CONFIG_PACKAGE_iptables-mod-nat-extra is not set ++# CONFIG_PACKAGE_iptables-mod-nflog is not set ++# CONFIG_PACKAGE_iptables-mod-nfqueue is not set ++# CONFIG_PACKAGE_iptables-mod-psd is not set ++# CONFIG_PACKAGE_iptables-mod-quota2 is not set ++# CONFIG_PACKAGE_iptables-mod-sysrq is not set ++# CONFIG_PACKAGE_iptables-mod-tarpit is not set ++# CONFIG_PACKAGE_iptables-mod-tee is not set ++# CONFIG_PACKAGE_iptables-mod-tproxy is not set ++# CONFIG_PACKAGE_iptables-mod-u32 is not set ++# CONFIG_PACKAGE_iptables-mod-ulog is not set ++# CONFIG_PACKAGE_iptaccount is not set ++# CONFIG_PACKAGE_nftables is not set ++ ++# ++# Linux ATM tools ++# ++# CONFIG_PACKAGE_atm-aread is not set ++# CONFIG_PACKAGE_atm-atmaddr is not set ++# CONFIG_PACKAGE_atm-atmdiag is not set ++# CONFIG_PACKAGE_atm-atmdump is not set ++# CONFIG_PACKAGE_atm-atmloop is not set ++# CONFIG_PACKAGE_atm-atmsigd is not set ++# CONFIG_PACKAGE_atm-atmswitch is not set ++# CONFIG_PACKAGE_atm-atmtcp is not set ++# CONFIG_PACKAGE_atm-awrite is not set ++# CONFIG_PACKAGE_atm-bus is not set ++# CONFIG_PACKAGE_atm-debug-tools is not set ++# CONFIG_PACKAGE_atm-diagnostics is not set ++# CONFIG_PACKAGE_atm-esi is not set ++# CONFIG_PACKAGE_atm-ilmid is not set ++# CONFIG_PACKAGE_atm-ilmidiag is not set ++# CONFIG_PACKAGE_atm-lecs is not set ++# CONFIG_PACKAGE_atm-les is not set ++# CONFIG_PACKAGE_atm-mpcd is not set ++# CONFIG_PACKAGE_atm-saaldump is not set ++# CONFIG_PACKAGE_atm-sonetdiag is not set ++# CONFIG_PACKAGE_atm-svc_recv is not set ++# CONFIG_PACKAGE_atm-svc_send is not set ++# CONFIG_PACKAGE_atm-tools is not set ++# CONFIG_PACKAGE_atm-ttcp_atm is not set ++# CONFIG_PACKAGE_atm-zeppelin is not set ++# CONFIG_PACKAGE_br2684ctl is not set ++ ++# ++# Routing and Redirection ++# ++# CONFIG_PACKAGE_genl is not set ++# CONFIG_PACKAGE_igmpproxy is not set ++# CONFIG_PACKAGE_ip is not set ++# CONFIG_PACKAGE_ip-bridge is not set ++# CONFIG_PACKAGE_ip-full is not set ++# CONFIG_PACKAGE_lldpd is not set ++# CONFIG_PACKAGE_relayd is not set ++# CONFIG_PACKAGE_ss is not set ++# CONFIG_PACKAGE_tc is not set ++ ++# ++# THC-IPv6 attack and analyzing toolkit ++# ++# CONFIG_PACKAGE_thc-ipv6-address6 is not set ++# CONFIG_PACKAGE_thc-ipv6-alive6 is not set ++# CONFIG_PACKAGE_thc-ipv6-covert-send6 is not set ++# CONFIG_PACKAGE_thc-ipv6-covert-send6d is not set ++# CONFIG_PACKAGE_thc-ipv6-denial6 is not set ++# CONFIG_PACKAGE_thc-ipv6-detect-new-ip6 is not set ++# CONFIG_PACKAGE_thc-ipv6-detect-sniffer6 is not set ++# CONFIG_PACKAGE_thc-ipv6-dnsdict6 is not set ++# CONFIG_PACKAGE_thc-ipv6-dnsrevenum6 is not set ++# CONFIG_PACKAGE_thc-ipv6-dos-new-ip6 is not set ++# CONFIG_PACKAGE_thc-ipv6-dump-router6 is not set ++# CONFIG_PACKAGE_thc-ipv6-exploit6 is not set ++# CONFIG_PACKAGE_thc-ipv6-fake-advertise6 is not set ++# CONFIG_PACKAGE_thc-ipv6-fake-dhcps6 is not set ++# CONFIG_PACKAGE_thc-ipv6-fake-dns6d is not set ++# CONFIG_PACKAGE_thc-ipv6-fake-dnsupdate6 is not set ++# CONFIG_PACKAGE_thc-ipv6-fake-mipv6 is not set ++# CONFIG_PACKAGE_thc-ipv6-fake-mld26 is not set ++# CONFIG_PACKAGE_thc-ipv6-fake-mld6 is not set ++# CONFIG_PACKAGE_thc-ipv6-fake-mldrouter6 is not set ++# CONFIG_PACKAGE_thc-ipv6-fake-router26 is not set ++# CONFIG_PACKAGE_thc-ipv6-fake-router6 is not set ++# CONFIG_PACKAGE_thc-ipv6-fake-solicitate6 is not set ++# CONFIG_PACKAGE_thc-ipv6-flood-advertise6 is not set ++# CONFIG_PACKAGE_thc-ipv6-flood-dhcpc6 is not set ++# CONFIG_PACKAGE_thc-ipv6-flood-mld26 is not set ++# CONFIG_PACKAGE_thc-ipv6-flood-mld6 is not set ++# CONFIG_PACKAGE_thc-ipv6-flood-mldrouter6 is not set ++# CONFIG_PACKAGE_thc-ipv6-flood-router26 is not set ++# CONFIG_PACKAGE_thc-ipv6-flood-router6 is not set ++# CONFIG_PACKAGE_thc-ipv6-flood-solicitate6 is not set ++# CONFIG_PACKAGE_thc-ipv6-fragmentation6 is not set ++# CONFIG_PACKAGE_thc-ipv6-fuzz-dhcpc6 is not set ++# CONFIG_PACKAGE_thc-ipv6-fuzz-dhcps6 is not set ++# CONFIG_PACKAGE_thc-ipv6-fuzz-ip6 is not set ++# CONFIG_PACKAGE_thc-ipv6-implementation6 is not set ++# CONFIG_PACKAGE_thc-ipv6-implementation6d is not set ++# CONFIG_PACKAGE_thc-ipv6-inverse-lookup6 is not set ++# CONFIG_PACKAGE_thc-ipv6-kill-router6 is not set ++# CONFIG_PACKAGE_thc-ipv6-ndpexhaust6 is not set ++# CONFIG_PACKAGE_thc-ipv6-node-query6 is not set ++# CONFIG_PACKAGE_thc-ipv6-parasite6 is not set ++# CONFIG_PACKAGE_thc-ipv6-passive-discovery6 is not set ++# CONFIG_PACKAGE_thc-ipv6-randicmp6 is not set ++# CONFIG_PACKAGE_thc-ipv6-redir6 is not set ++# CONFIG_PACKAGE_thc-ipv6-rsmurf6 is not set ++# CONFIG_PACKAGE_thc-ipv6-sendpees6 is not set ++# CONFIG_PACKAGE_thc-ipv6-sendpeesmp6 is not set ++# CONFIG_PACKAGE_thc-ipv6-smurf6 is not set ++# CONFIG_PACKAGE_thc-ipv6-thcping6 is not set ++# CONFIG_PACKAGE_thc-ipv6-toobig6 is not set ++# CONFIG_PACKAGE_thc-ipv6-trace6 is not set ++ ++# ++# VPN ++# ++# CONFIG_PACKAGE_openvpn-easy-rsa is not set ++# CONFIG_PACKAGE_openvpn-nossl is not set ++# CONFIG_PACKAGE_openvpn-openssl is not set ++# CONFIG_PACKAGE_openvpn-polarssl is not set ++ ++# ++# Web Servers/Proxies ++# ++# CONFIG_PACKAGE_sockd is not set ++# CONFIG_PACKAGE_socksify is not set ++# CONFIG_PACKAGE_uhttpd is not set ++# CONFIG_PACKAGE_uhttpd_debug is not set ++# CONFIG_PACKAGE_6in4 is not set ++# CONFIG_PACKAGE_6rd is not set ++# CONFIG_PACKAGE_6to4 is not set ++# CONFIG_PACKAGE_authsae is not set ++# CONFIG_PACKAGE_chat is not set ++# CONFIG_PACKAGE_ds-lite is not set ++# CONFIG_PACKAGE_eapol-test is not set ++# CONFIG_PACKAGE_gre is not set ++# CONFIG_PACKAGE_hostapd is not set ++CONFIG_PACKAGE_hostapd-common=y ++# CONFIG_PACKAGE_hostapd-common-old is not set ++# CONFIG_PACKAGE_hostapd-mini is not set ++# CONFIG_PACKAGE_hostapd-utils is not set ++# CONFIG_PACKAGE_iftop is not set ++# CONFIG_PACKAGE_iperf is not set ++# CONFIG_PACKAGE_iperf-mt is not set ++# CONFIG_PACKAGE_iperf3 is not set ++# CONFIG_PACKAGE_ipip is not set ++# CONFIG_PACKAGE_ipset is not set ++# CONFIG_PACKAGE_ipset-dns is not set ++# CONFIG_PACKAGE_iputils-arping is not set ++# CONFIG_PACKAGE_iputils-clockdiff is not set ++# CONFIG_PACKAGE_iputils-ping is not set ++# CONFIG_PACKAGE_iputils-ping6 is not set ++# CONFIG_PACKAGE_iputils-tftpd is not set ++# CONFIG_PACKAGE_iputils-tracepath is not set ++# CONFIG_PACKAGE_iputils-tracepath6 is not set ++# CONFIG_PACKAGE_iputils-traceroute6 is not set ++CONFIG_PACKAGE_iw=y ++# CONFIG_PACKAGE_map is not set ++# CONFIG_PACKAGE_mdns is not set ++CONFIG_PACKAGE_odhcp6c=y ++CONFIG_PACKAGE_odhcp6c_ext_cer_id=0 ++CONFIG_PACKAGE_odhcpd=y ++CONFIG_PACKAGE_odhcpd_ext_cer_id=0 ++# CONFIG_PACKAGE_omcproxy is not set ++CONFIG_PACKAGE_ppp=y ++# CONFIG_PACKAGE_ppp-mod-pppoa is not set ++CONFIG_PACKAGE_ppp-mod-pppoe=y ++# CONFIG_PACKAGE_ppp-mod-pppol2tp is not set ++# CONFIG_PACKAGE_ppp-mod-pptp is not set ++# CONFIG_PACKAGE_ppp-mod-radius is not set ++# CONFIG_PACKAGE_ppp-multilink is not set ++# CONFIG_PACKAGE_pppdump is not set ++# CONFIG_PACKAGE_pppstats is not set ++# CONFIG_PACKAGE_rssileds is not set ++# CONFIG_PACKAGE_samba36-client is not set ++# CONFIG_PACKAGE_samba36-server is not set ++# CONFIG_PACKAGE_tcpdump is not set ++# CONFIG_PACKAGE_tcpdump-mini is not set ++# CONFIG_PACKAGE_uclient-fetch is not set ++# CONFIG_PACKAGE_umbim is not set ++# CONFIG_PACKAGE_uqmi is not set ++# CONFIG_PACKAGE_wpa-cli is not set ++# CONFIG_PACKAGE_wpa-supplicant is not set ++# CONFIG_WPA_SUPPLICANT_NO_TIMESTAMP_CHECK is not set ++# CONFIG_WPA_RFKILL_SUPPORT is not set ++CONFIG_WPA_MSG_MIN_PRIORITY=3 ++# CONFIG_DRIVER_WEXT_SUPPORT is not set ++CONFIG_DRIVER_11N_SUPPORT=y ++# CONFIG_DRIVER_11W_SUPPORT is not set ++# CONFIG_PACKAGE_wpa-supplicant-mesh is not set ++# CONFIG_PACKAGE_wpa-supplicant-mini is not set ++# CONFIG_PACKAGE_wpa-supplicant-p2p is not set ++# CONFIG_PACKAGE_wpad is not set ++# CONFIG_PACKAGE_wpad-mesh is not set ++CONFIG_PACKAGE_wpad-mini=y ++# CONFIG_PACKAGE_wpan-tools is not set ++# CONFIG_PACKAGE_wwan is not set ++ ++# ++# Utilities ++# ++ ++# ++# Boot Loaders ++# ++ ++# ++# Compression ++# ++# CONFIG_PACKAGE_bzip2 is not set ++ ++# ++# Filesystem ++# ++# CONFIG_PACKAGE_badblocks is not set ++# CONFIG_PACKAGE_debugfs is not set ++# CONFIG_PACKAGE_dumpe2fs is not set ++# CONFIG_PACKAGE_e2freefrag is not set ++# CONFIG_PACKAGE_e2fsprogs is not set ++# CONFIG_PACKAGE_filefrag is not set ++# CONFIG_PACKAGE_fuse-utils is not set ++# CONFIG_PACKAGE_resize2fs is not set ++# CONFIG_PACKAGE_sysfsutils is not set ++# CONFIG_PACKAGE_tune2fs is not set ++# CONFIG_PACKAGE_xfs-fsck is not set ++# CONFIG_PACKAGE_xfs-growfs is not set ++# CONFIG_PACKAGE_xfs-mkfs is not set ++ ++# ++# Terminal ++# ++# CONFIG_PACKAGE_agetty is not set ++# CONFIG_PACKAGE_script-utils is not set ++# CONFIG_PACKAGE_setterm is not set ++# CONFIG_PACKAGE_wall is not set ++ ++# ++# disc ++# ++# CONFIG_PACKAGE_blkid is not set ++# CONFIG_PACKAGE_cfdisk is not set ++# CONFIG_PACKAGE_fdisk is not set ++# CONFIG_PACKAGE_findfs is not set ++# CONFIG_PACKAGE_lsblk is not set ++# CONFIG_PACKAGE_partx-utils is not set ++# CONFIG_PACKAGE_sfdisk is not set ++# CONFIG_PACKAGE_swap-utils is not set ++# CONFIG_PACKAGE_wipefs is not set ++# CONFIG_PACKAGE_cal is not set ++# CONFIG_PACKAGE_comgt is not set ++# CONFIG_PACKAGE_comgt-directip is not set ++# CONFIG_PACKAGE_comgt-ncm is not set ++# CONFIG_PACKAGE_dmesg is not set ++# CONFIG_PACKAGE_dropbearconvert is not set ++# CONFIG_PACKAGE_fconfig is not set ++# CONFIG_PACKAGE_flock is not set ++# CONFIG_PACKAGE_getopt is not set ++# CONFIG_PACKAGE_hwclock is not set ++# CONFIG_PACKAGE_iconv is not set ++# CONFIG_PACKAGE_iwcap is not set ++CONFIG_PACKAGE_iwinfo=y ++CONFIG_PACKAGE_jpeg-tools=y ++CONFIG_PACKAGE_jshn=y ++CONFIG_PACKAGE_libjson-script=y ++# CONFIG_PACKAGE_logger is not set ++# CONFIG_PACKAGE_look is not set ++# CONFIG_PACKAGE_losetup is not set ++# CONFIG_PACKAGE_maccalc is not set ++# CONFIG_PACKAGE_mcookie is not set ++# CONFIG_PACKAGE_mdadm is not set ++# CONFIG_PACKAGE_mount-utils is not set ++# CONFIG_PACKAGE_mountd is not set ++# CONFIG_PACKAGE_namei is not set ++# CONFIG_PACKAGE_ocf-crypto-headers is not set ++# CONFIG_PACKAGE_openssl-util is not set ++# CONFIG_PACKAGE_owipcalc is not set ++# CONFIG_PACKAGE_prlimit is not set ++# CONFIG_PACKAGE_px5g is not set ++# CONFIG_PACKAGE_px5g-standalone is not set ++# CONFIG_PACKAGE_rename is not set ++# CONFIG_PACKAGE_spidev-test is not set ++# CONFIG_PACKAGE_strace is not set ++# CONFIG_PACKAGE_uboot-envtools is not set ++# CONFIG_PACKAGE_ugps is not set ++# CONFIG_PACKAGE_usb-modeswitch is not set ++# CONFIG_PACKAGE_usbreset is not set ++# CONFIG_PACKAGE_usbutils is not set ++# CONFIG_PACKAGE_uuidd is not set ++# CONFIG_PACKAGE_uuidgen is not set ++CONFIG_PACKAGE_v4l-utils=y ++# CONFIG_PACKAGE_whereis is not set diff --git a/master/endstop b/master/endstop new file mode 100644 index 0000000..a88ece6 --- /dev/null +++ b/master/endstop @@ -0,0 +1,1458 @@ +diff --git a/.config b/.config +index e9f4329..0d33ce6 100644 +--- a/.config ++++ b/.config +@@ -78,6 +78,7 @@ CONFIG_TARGET_ramips_rt305x=y + # CONFIG_TARGET_ramips_rt305x_HT-TM02 is not set + # CONFIG_TARGET_ramips_rt305x_HG255D is not set + # CONFIG_TARGET_ramips_rt305x_M2M is not set ++CONFIG_TARGET_ramips_rt305x_TP-C516W=y + # CONFIG_TARGET_ramips_rt305x_A5-V11 is not set + # CONFIG_TARGET_ramips_rt305x_WT1520 is not set + # CONFIG_TARGET_ramips_rt305x_RT5350F-OLINUXINO is not set +@@ -95,7 +96,7 @@ CONFIG_TARGET_ramips_rt305x=y + # CONFIG_TARGET_ramips_rt305x_UR-326N4G is not set + # CONFIG_TARGET_ramips_rt305x_UR-336UN is not set + # CONFIG_TARGET_ramips_rt305x_VOCORE is not set +-CONFIG_TARGET_ramips_rt305x_NCS601W=y ++# CONFIG_TARGET_ramips_rt305x_NCS601W is not set + # CONFIG_TARGET_ramips_rt305x_WIZFI630A is not set + CONFIG_HAS_SUBTARGETS=y + CONFIG_TARGET_BOARD="ramips" +@@ -122,6 +123,7 @@ CONFIG_DEFAULT_kmod-video-core=y + CONFIG_DEFAULT_kmod-video-uvc=y + CONFIG_DEFAULT_libc=y + CONFIG_DEFAULT_libgcc=y ++CONFIG_DEFAULT_mjg-streamer=y + CONFIG_DEFAULT_mtd=y + CONFIG_DEFAULT_netifd=y + CONFIG_DEFAULT_odhcp6c=y +@@ -164,7 +166,7 @@ CONFIG_EXTERNAL_CPIO="" + # Root filesystem images + # + # CONFIG_TARGET_ROOTFS_EXT4FS is not set +-# CONFIG_TARGET_ROOTFS_JFFS2 is not set ++CONFIG_TARGET_ROOTFS_JFFS2=y + CONFIG_TARGET_ROOTFS_SQUASHFS=y + CONFIG_TARGET_SQUASHFS_BLOCK_SIZE=256 + CONFIG_TARGET_UBIFS_FREE_SPACE_FIXUP=y +@@ -299,7 +301,7 @@ CONFIG_TARGET_SUFFIX="musl" + # CONFIG_IB is not set + # CONFIG_SDK is not set + # CONFIG_MAKE_TOOLCHAIN is not set +-# CONFIG_IMAGEOPT is not set ++CONFIG_IMAGEOPT=y + # CONFIG_PREINITOPT is not set + CONFIG_TARGET_PREINIT_SUPPRESS_STDERR=y + CONFIG_TARGET_PREINIT_TIMEOUT=2 +@@ -314,16 +316,16 @@ CONFIG_TARGET_INIT_PATH="/bin:/sbin:/usr/bin:/usr/sbin" + CONFIG_TARGET_INIT_ENV="" + CONFIG_TARGET_INIT_CMD="/sbin/init" + CONFIG_TARGET_INIT_SUPPRESS_STDERR=y +-# CONFIG_VERSIONOPT is not set +-CONFIG_PER_FEED_REPO=y +-CONFIG_PER_FEED_REPO_ADD_DISABLED=y +-CONFIG_PER_FEED_REPO_ADD_COMMENTED=y +-# CONFIG_FEED_packages is not set +-# CONFIG_FEED_luci is not set +-# CONFIG_FEED_routing is not set +-# CONFIG_FEED_telephony is not set +-# CONFIG_FEED_management is not set +-# CONFIG_FEED_targets is not set ++CONFIG_VERSIONOPT=y ++CONFIG_VERSION_DIST="OpenWrt" ++CONFIG_VERSION_NICK="" ++CONFIG_VERSION_NUMBER="" ++CONFIG_VERSION_REPO="http://openwrt.panaceas.org/repos/tl-c516w/%v/%T/packages" ++CONFIG_VERSION_MANUFACTURER="" ++CONFIG_VERSION_PRODUCT="" ++CONFIG_VERSION_HWREV="" ++# CONFIG_VERSION_FILENAMES is not set ++# CONFIG_PER_FEED_REPO is not set + # CONFIG_SMIMEOPT is not set + CONFIG_OPKGSMIME_PASSPHRASE=y + +@@ -1296,7 +1298,7 @@ CONFIG_PACKAGE_usign=y + # CONFIG_PACKAGE_ar is not set + # CONFIG_PACKAGE_binutils is not set + # CONFIG_PACKAGE_gdb is not set +-# CONFIG_PACKAGE_gdbserver is not set ++CONFIG_PACKAGE_gdbserver=m + # CONFIG_PACKAGE_objdump is not set + # CONFIG_PACKAGE_trace-cmd is not set + # CONFIG_PACKAGE_trace-cmd-extra is not set +diff --git a/feeds/packages/multimedia/mjpg-streamer/Makefile b/feeds/packages/multimedia/mjpg-streamer/Makefile +index e1e0e20..ff98b4d 100644 +--- a/feeds/packages/multimedia/mjpg-streamer/Makefile ++++ b/feeds/packages/multimedia/mjpg-streamer/Makefile +@@ -88,6 +88,7 @@ ifeq ($(CONFIG_MJPG_STREAMER_INPUT_FILE),y) + endif + ifeq ($(CONFIG_MJPG_STREAMER_INPUT_UVC),y) + $(CP) $(PKG_BUILD_DIR)/input_uvc.so $(1)/usr/lib ++ $(CP) $(PKG_BUILD_DIR)/input_motors.so $(1)/usr/lib + endif + ifeq ($(CONFIG_MJPG_STREAMER_INPUT_TESTPICTURE),y) + $(CP) $(PKG_BUILD_DIR)/input_testpicture.so $(1)/usr/lib +diff --git a/feeds/packages/multimedia/mjpg-streamer/files/mjpg-streamer.init b/feeds/packages/multimedia/mjpg-streamer/files/mjpg-streamer.init +index 06630d4..ea83303 100644 +--- a/feeds/packages/multimedia/mjpg-streamer/files/mjpg-streamer.init ++++ b/feeds/packages/multimedia/mjpg-streamer/files/mjpg-streamer.init +@@ -83,7 +83,7 @@ start_instance() { + fi + + procd_open_instance +- procd_set_param command "$PROG" --input "$input_arg" --output "$output_arg" ++ procd_set_param command "$PROG" --input "$input_arg" --input "input_motors.so" --output "$output_arg" + procd_close_instance + } + +diff --git a/feeds/packages/multimedia/mjpg-streamer/patches/998-fix-stack-smashing.patch b/feeds/packages/multimedia/mjpg-streamer/patches/998-fix-stack-smashing.patch +new file mode 100644 +index 0000000..a1a2239 +--- /dev/null ++++ b/feeds/packages/multimedia/mjpg-streamer/patches/998-fix-stack-smashing.patch +@@ -0,0 +1,13 @@ ++Index: mjpg-streamer-r182/plugins/input_uvc/v4l2uvc.c ++=================================================================== ++--- a/plugins/input_uvc/v4l2uvc.c +++++ b/plugins/input_uvc/v4l2uvc.c ++@@ -130,7 +130,7 @@ int init_videoIn(struct vdIn *vd, char * ++ return -1; ++ } ++ ++- memcpy(&pglobal->in[id].in_formats[pglobal->in[id].formatCount], &fmtdesc, sizeof(input_format)); +++ memcpy(&pglobal->in[id].in_formats[pglobal->in[id].formatCount], &fmtdesc, sizeof(struct v4l2_fmtdesc)); ++ ++ if(fmtdesc.pixelformat == format) ++ pglobal->in[id].currentFormat = pglobal->in[id].formatCount; +diff --git a/feeds/packages/multimedia/mjpg-streamer/patches/999-fix-stack-smashing.patch b/feeds/packages/multimedia/mjpg-streamer/patches/999-fix-stack-smashing.patch +deleted file mode 100644 +index 24ef14e..0000000 +--- a/feeds/packages/multimedia/mjpg-streamer/patches/999-fix-stack-smashing.patch ++++ /dev/null +@@ -1,13 +0,0 @@ +-Index: mjpg-streamer-r182/plugins/input_uvc/v4l2uvc.c +-=================================================================== +---- a/mjpg-streamer-r182/plugins/input_uvc/v4l2uvc.c +-+++ b/mjpg-streamer-r182/plugins/input_uvc/v4l2uvc.c +-@@ -130,7 +130,7 @@ int init_videoIn(struct vdIn *vd, char * +- return -1; +- } +- +-- memcpy(&pglobal->in[id].in_formats[pglobal->in[id].formatCount], &fmtdesc, sizeof(input_format)); +-+ memcpy(&pglobal->in[id].in_formats[pglobal->in[id].formatCount], &fmtdesc, sizeof(struct v4l2_fmtdesc)); +- +- if(fmtdesc.pixelformat == format) +- pglobal->in[id].currentFormat = pglobal->in[id].formatCount; +diff --git a/feeds/packages/multimedia/mjpg-streamer/patches/999-motors.patch b/feeds/packages/multimedia/mjpg-streamer/patches/999-motors.patch +new file mode 100644 +index 0000000..5ffdc58 +--- /dev/null ++++ b/feeds/packages/multimedia/mjpg-streamer/patches/999-motors.patch +@@ -0,0 +1,906 @@ ++Index: bar/Makefile ++=================================================================== ++--- bar.orig/Makefile +++++ bar/Makefile ++@@ -33,6 +33,7 @@ APP_BINARY = mjpg_streamer ++ ++ # define the names and targets of the plugins ++ PLUGINS = input_uvc.so +++PLUGINS += input_motors.so ++ PLUGINS += output_file.so ++ #PLUGINS += output_udp.so ++ PLUGINS += output_http.so ++@@ -71,6 +72,9 @@ input_testpicture.so: mjpg_streamer.h ut ++ make -C plugins/input_testpicture all ++ cp plugins/input_testpicture/input_testpicture.so . ++ +++input_motors.so: mjpg_streamer.h utils.h +++ make -C plugins/input_motors +++ cp plugins/input_motors/input_motors.so . ++ ++ ifeq ($(USE_LIBV4L2),true) ++ input_uvc.so: mjpg_streamer.h utils.h ++Index: bar/plugins/input_motors/input_motors.c ++=================================================================== ++--- /dev/null +++++ bar/plugins/input_motors/input_motors.c ++@@ -0,0 +1,708 @@ +++/******************************************************************************* +++# Linux-UVC streaming input-plugin for MJPG-streamer # +++# # +++# This package work with the Logitech UVC based webcams with the mjpeg feature # +++# # +++# Copyright (C) 2005 2006 Laurent Pinchart && Michel Xhaard # +++# 2007 Lucas van Staden # +++# 2007 Tom Stöveken # +++# # +++# 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. # +++# # +++# This program is distributed in the hope that it will be useful, # +++# but WITHOUT ANY WARRANTY; without even the implied warranty of # +++# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # +++# GNU General Public License for more details. # +++# # +++# You should have received a copy of the GNU General Public License # +++# along with this program; if not, write to the Free Software # +++# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA # +++# # +++*******************************************************************************/ +++ +++#include +++#include +++#include +++#include +++#include +++#include +++#include +++#include +++#include +++#include +++#include +++#include +++#include +++#include +++#include +++ +++#include "../../utils.h" +++#include "../../mjpg_streamer.h" +++ +++#define INPUT_PLUGIN_NAME "KKMoon motors control" +++ +++#define MIN_RES 5 +++ +++#if 0 +++#undef DBG +++#define DBG(a...) do { fprintf(stderr,a); } while (0) +++#endif +++ +++ +++#define V_MIN -175 +++#define V_MAX 455 +++ +++#define H_MIN -1040 +++#define H_MAX 1030 +++ +++#define H_STEPS (1+(H_MAX)-(H_MIN)) +++#define V_STEPS (1+(V_MAX)-(V_MIN)) +++ +++ +++ +++typedef struct input_motors +++{ +++ int fd; +++ char *device; +++ int min_res; +++} input_motors; +++ +++/* private functions and variables to this plugin */ +++static pthread_t worker; +++static pthread_mutex_t motor_mutex = PTHREAD_MUTEX_INITIALIZER; +++static pthread_mutex_t worker_mutex = PTHREAD_MUTEX_INITIALIZER; +++static pthread_cond_t worker_cond = PTHREAD_COND_INITIALIZER; +++static input_motors *this; +++static globals *pglobal; +++static int plugin_number; +++ +++ +++static volatile int worker_pan, worker_tilt; +++ +++static void +++motor_cmd (int fd, char m, size_t n) +++{ +++ static char buf[8192]; +++ size_t l; +++ +++ DBG ("motor: %c for %d\n", m, (int) n); +++ +++ while (n) +++ { +++ l = (n > sizeof (buf)) ? sizeof (buf) : n; +++ pthread_mutex_lock (&motor_mutex); +++ memset (buf, m, l); +++ write (fd, buf, l); +++ pthread_mutex_unlock (&motor_mutex); +++ n -= l; +++ } +++} +++ +++static int pan_valid, pan; +++ +++static void +++pan_move (int fd, int m) +++{ +++ DBG ("pan_move: %d\n", m); +++ if (m < 0) +++ motor_cmd (fd, 'L', -m); +++ else +++ motor_cmd (fd, 'R', m); +++} +++ +++ +++static void +++pan_abs (int fd, int p) +++{ +++ DBG ("pan_abs: pan_valid=%d pan=%d requested=%d\n", pan_valid, pan, p); +++ +++ if (!pan_valid) +++ { +++ pan_move (fd, -H_STEPS); +++ pan_valid = 1; +++ pan = H_MIN; +++ } +++ +++ if (p < H_MIN) +++ p = H_MIN; +++ if (p > H_MAX) +++ p = H_MAX; +++ +++ pan_move (fd, p - pan); +++ +++ pan = p; +++} +++ +++static void +++pan_rel (int fd, int m) +++{ +++ DBG ("pan_rel: pan_valid=%d pan=%d requested=%d\n", pan_valid, pan, m); +++ if (pan_valid) +++ { +++ pan_abs (fd, pan + m); +++ } +++ else +++ { +++ pan_move (fd, m); +++ } +++} +++ +++ +++ +++static int tilt_valid, tilt; +++ +++static void +++tilt_move (int fd, int m) +++{ +++ DBG ("tilt_move: %d\n", m); +++ if (m < 0) +++ motor_cmd (fd, 'D', -m); +++ else +++ motor_cmd (fd, 'U', m); +++} +++ +++ +++static void +++tilt_abs (int fd, int p) +++{ +++ DBG ("tilt_abs tilt_valid=%d tilt=%d requested=%d\n", tilt_valid, tilt, p); +++ if (!tilt_valid) +++ { +++ tilt_move (fd, -V_STEPS); +++ tilt_valid = 1; +++ tilt = V_MIN; +++ } +++ +++ if (p < V_MIN) +++ p = V_MIN; +++ if (p > V_MAX) +++ p = V_MAX; +++ +++ tilt_move (fd, p - tilt); +++ +++ tilt = p; +++} +++ +++static void +++tilt_rel (int fd, int m) +++{ +++ DBG ("tilt_rel tilt_valid=%d tilt=%d requested=%d\n", tilt_valid, tilt, m); +++ if (tilt_valid) +++ { +++ tilt_abs (fd, tilt + m); +++ } +++ else +++ { +++ tilt_move (fd, m); +++ } +++} +++ +++ +++ +++ +++static void +++help (void) +++{ +++ fprintf (stderr, +++ " ---------------------------------------------------------------\n" +++ " Help for input plugin..: " INPUT_PLUGIN_NAME "\n" +++ " ---------------------------------------------------------------\n" +++ " The following parameters can be passed to this plugin:\n\n" +++ " [-d | --device ]...: video device to open (your camera)\n" +++ " [-m | --min ]......: set the minimum step size in phases (defalt 5)\n"); +++} +++ +++ +++ +++ +++static void +++worker_cleanup (void *arg) +++{ +++ static unsigned char first_run = 1; +++ +++ if (!first_run) +++ { +++ DBG ("already cleaned up ressources\n"); +++ return; +++ } +++ +++ first_run = 0; +++} +++ +++ +++ +++ +++static void * +++worker_thread (void *arg) +++{ +++ struct timespec ts = { 0 }; +++ int err; +++ +++ +++ /* set cleanup handler to cleanup allocated ressources */ +++ pthread_cleanup_push (worker_cleanup, NULL); +++ +++ while (!pglobal->stop) +++ { +++ +++ clock_gettime (CLOCK_MONOTONIC, &ts); +++ +++ ts.tv_sec += 1; +++ +++ pthread_mutex_lock (&worker_mutex); +++ pthread_cond_timedwait (&worker_cond, &worker_mutex, &ts); +++ pthread_mutex_unlock (&worker_mutex); +++ while (worker_pan || worker_tilt) +++ { +++ if (worker_pan) +++ pan_rel (this->fd, worker_pan); +++ if (worker_tilt) +++ tilt_rel (this->fd, worker_tilt); +++ } +++ +++ pthread_cond_broadcast (&pglobal->in[plugin_number].db_update); //this keeps the output stream alive +++ DBG ("spin loop\n"); +++ } +++ +++ DBG ("leaving input thread, calling cleanup function now\n"); +++ pthread_cleanup_pop (1); +++ +++ return NULL; +++} +++ +++ +++void +++add_control (int plugin_number, control c) +++{ +++ if (!pglobal->in[plugin_number].in_parameters) +++ { +++ pglobal->in[plugin_number].in_parameters = +++ (control *) calloc (1, sizeof (control)); +++ } +++ else +++ { +++ pglobal->in[plugin_number].in_parameters = +++ (control *) realloc (pglobal->in[plugin_number].in_parameters, +++ (pglobal->in[plugin_number].parametercount + +++ 1) * sizeof (control)); +++ } +++ +++ if (pglobal->in[plugin_number].in_parameters == NULL) +++ { +++ DBG ("Calloc failed\n"); +++ return; +++ } +++ +++ pglobal->in[plugin_number].in_parameters[pglobal->in[plugin_number]. +++ parametercount] = c; +++ +++ pglobal->in[plugin_number].parametercount++; +++ +++} +++ +++ +++ +++static void +++add_btn (int plugin_number, unsigned int id, char *name) +++{ +++ +++ control btn; +++ +++ btn.group = IN_CMD_GENERIC; +++ btn.menuitems = NULL; +++ btn.value = 0.0; +++ btn.class_id = 0; +++ +++ btn.ctrl.id = id; +++ btn.ctrl.type = V4L2_CTRL_TYPE_BUTTON; +++ strcpy ((char *) btn.ctrl.name, name); +++ btn.ctrl.minimum = 0; +++ btn.ctrl.maximum = 1; +++ btn.ctrl.step = 1; +++ btn.ctrl.default_value = 0; +++ btn.ctrl.flags = V4L2_CTRL_FLAG_VOLATILE; +++ +++ add_control (plugin_number, btn); +++ +++} +++ +++static void +++add_bool (int plugin_number, unsigned int id, char *name) +++{ +++ +++ control btn; +++ +++ btn.group = IN_CMD_GENERIC; +++ btn.menuitems = NULL; +++ btn.value = 0.0; +++ btn.class_id = 0; +++ +++ btn.ctrl.id = id; +++ btn.ctrl.type = V4L2_CTRL_TYPE_BOOLEAN; +++ strcpy ((char *) btn.ctrl.name, name); +++ btn.ctrl.minimum = 0; +++ btn.ctrl.maximum = 1; +++ btn.ctrl.step = 1; +++ btn.ctrl.default_value = 0; +++ btn.ctrl.flags = V4L2_CTRL_FLAG_VOLATILE; +++ +++ add_control (plugin_number, btn); +++ +++} +++ +++ +++static void +++add_abs (int plugin_number, unsigned int id, char *name, int max) +++{ +++ +++ control abs; +++ +++ abs.group = IN_CMD_GENERIC; +++ abs.menuitems = NULL; +++ abs.value = 0xffffff; +++ abs.class_id = 0; +++ +++ abs.ctrl.id = id; +++ abs.ctrl.type = V4L2_CTRL_TYPE_INTEGER; +++ strcpy ((char *) abs.ctrl.name, name); +++ abs.ctrl.minimum = -max / 2; +++ abs.ctrl.maximum = max / 2; +++ abs.ctrl.step = 1; +++ abs.ctrl.default_value = 0; +++ abs.ctrl.flags = V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_SLIDER; +++ +++ add_control (plugin_number, abs); +++ +++} +++ +++ +++static void +++add_controls (int plugin_number) +++{ +++ add_btn (plugin_number, IN_CMD_RESET_PAN_TILT, "Reset"); +++#ifdef USE_BUTTONS +++ add_btn (plugin_number, IN_CMD_PAN_MINUS, "Pan-"); +++ add_btn (plugin_number, IN_CMD_PAN_PLUS, "Pan+"); +++ add_btn (plugin_number, IN_CMD_TILT_MINUS, "Tilt-"); +++ add_btn (plugin_number, IN_CMD_TILT_PLUS, "Tilt+"); +++#else +++ add_bool (plugin_number, IN_CMD_PAN_MINUS, "Pan-"); +++ add_bool (plugin_number, IN_CMD_PAN_PLUS, "Pan+"); +++ add_bool (plugin_number, IN_CMD_TILT_MINUS, "Tilt-"); +++ add_bool (plugin_number, IN_CMD_TILT_PLUS, "Tilt+"); +++#endif +++ add_abs (plugin_number, IN_CMD_PAN_SET, "Pan", H_STEPS); +++ add_abs (plugin_number, IN_CMD_TILT_SET, "Tilt", V_STEPS); +++ +++} +++ +++ +++ +++/*** plugin interface functions ***/ +++ +++ +++int +++input_init (input_parameter * param, int id) +++{ +++ int i; +++ char *dev = "/dev/motors"; +++ +++ plugin_number = id; +++ +++ if (pthread_mutex_init (&motor_mutex, NULL) != 0) +++ { +++ IPRINT ("could not initialize mutex variable\n"); +++ exit (EXIT_FAILURE); +++ } +++ +++ if (pthread_mutex_init (&worker_mutex, NULL) != 0) +++ { +++ IPRINT ("could not initialize mutex variable\n"); +++ exit (EXIT_FAILURE); +++ } +++ +++ +++ { +++ pthread_condattr_t attr; +++ pthread_condattr_init (&attr); +++ pthread_condattr_setclock (&attr, CLOCK_MONOTONIC); +++ +++ if (pthread_cond_init (&worker_cond, &attr) != 0) +++ { +++ IPRINT ("could not initialize cond variable\n"); +++ exit (EXIT_FAILURE); +++ } +++ +++ } +++ +++ +++ +++ /* keep a pointer to the global variables */ +++ pglobal = param->global; +++ +++ /* allocate webcam datastructure */ +++ this = malloc (sizeof (struct input_motors)); +++ if (this == NULL) +++ { +++ IPRINT ("not enough memory for videoIn\n"); +++ exit (EXIT_FAILURE); +++ } +++ memset (this, 0, sizeof (struct input_motors)); +++ this->min_res = MIN_RES; +++ +++ /* display the parsed values */ +++ IPRINT ("Using motors device.: %s\n", dev); +++ +++ param->argv[0] = INPUT_PLUGIN_NAME; +++ asprintf (¶m->global->in[id].name, "%s", INPUT_PLUGIN_NAME); +++ +++ /* show all parameters for DBG purposes */ +++ for (i = 0; i < param->argc; i++) +++ { +++ DBG ("argv[%d]=%s\n", i, param->argv[i]); +++ } +++ +++ /* parse the parameters */ +++ reset_getopt (); +++ while (1) +++ { +++ int option_index = 0, c = 0; +++ static struct option long_options[] = { +++ {"h", no_argument, 0, 0}, +++ {"help", no_argument, 0, 0}, +++ {"d", required_argument, 0, 0}, +++ {"device", required_argument, 0, 0}, +++ {"m", required_argument, 0, 0}, +++ {"min", required_argument, 0, 0}, +++ {0, 0, 0, 0} +++ }; +++ +++ /* parsing all parameters according to the list above is sufficent */ +++ c = +++ getopt_long_only (param->argc, param->argv, "", long_options, +++ &option_index); +++ +++ /* no more options to parse */ +++ if (c == -1) +++ break; +++ +++ /* unrecognized option */ +++ if (c == '?') +++ { +++ help (); +++ return 1; +++ } +++ +++ /* dispatch the given options */ +++ switch (option_index) +++ { +++ /* h, help */ +++ case 0: +++ case 1: +++ DBG ("case 0,1\n"); +++ help (); +++ return 1; +++ break; +++ +++ /* d, device */ +++ case 2: +++ case 3: +++ DBG ("case 2,3\n"); +++ dev = strdup (optarg); +++ break; +++ +++ case 4: +++ case 5: +++ DBG ("case 4,5\n"); +++ this->min_res = atoi (optarg); +++ break; +++ +++ default: +++ DBG ("default case\n"); +++ help (); +++ return 1; +++ } +++ } +++ +++ asprintf (&this->device, "%s", dev); +++ +++ if ((this->fd = open (this->device, O_RDWR)) == -1) +++ { +++ perror ("ERROR opening motor interface"); +++ return -1; +++ } +++ +++ +++ add_controls (plugin_number); +++ +++ return 0; +++} +++ +++/****************************************************************************** +++Description.: Stops the execution of worker thread +++Input Value.: - +++Return Value: always 0 +++******************************************************************************/ +++int +++input_stop (void) +++{ +++ DBG ("will cancel input thread\n"); +++ pthread_cancel (worker); +++ +++ return 0; +++} +++ +++/****************************************************************************** +++Description.: spins of a worker thread +++Input Value.: - +++Return Value: always 0 +++******************************************************************************/ +++int +++input_run (void) +++{ +++ +++ pthread_create (&worker, 0, worker_thread, NULL); +++ pthread_detach (worker); +++ +++ return 0; +++} +++ +++/****************************************************************************** +++Description.: process commands, allows to set certain runtime configurations +++ and settings like pan/tilt, colors, saturation etc. +++Input Value.: * cmd specifies the command, a complete list is maintained in +++ the file "input.h" +++ * value is used for commands that make use of a parameter. +++Return Value: depends in the command, for most cases 0 means no errors and +++ -1 signals an error. This is just rule of thumb, not more! +++******************************************************************************/ +++int +++input_cmd_old (in_cmd_type cmd, int value) +++{ +++ int res = 0; +++ +++ +++ switch (cmd) +++ { +++ case IN_CMD_HELLO: +++ fprintf (stderr, "Hello from input plugin\n"); +++ break; +++ +++ case IN_CMD_RESET_PAN_TILT: +++ case IN_CMD_RESET_PAN_TILT_NO_MUTEX: +++ DBG ("about to set pan/tilt to default position\n"); +++ +++ pan_abs (this->fd, 0); +++ tilt_abs (this->fd, 0); +++ +++ break; +++ +++ case IN_CMD_PAN_SET: +++ DBG ("set pan to %d steps\n", value); +++ +++ pan_abs (this->fd, value); +++ +++ res = value; +++ break; +++ +++ case IN_CMD_PAN_PLUS: +++ DBG ("pan + %d\n", value); +++#ifdef USE_BUTTONS +++ pan_rel (this->fd, this->min_res); +++ res = this->min_res; +++#else +++ worker_pan = value ? this->min_res : 0; +++ pthread_cond_broadcast (&worker_cond); +++ res = value; +++#endif +++ break; +++ +++ case IN_CMD_PAN_MINUS: +++ DBG ("pan - %d\n", value); +++#ifdef USE_BUTTONS +++ pan_rel (this->fd, -this->min_res); +++ res = this->min_res; +++#else +++ worker_pan = value ? -this->min_res : 0; +++ pthread_cond_broadcast (&worker_cond); +++ res = value; +++#endif +++ +++ break; +++ +++ case IN_CMD_TILT_SET: +++ DBG ("set tilt to %d degrees\n", value); +++ +++ tilt_abs (this->fd, value); +++ res = value; +++ break; +++ +++ case IN_CMD_TILT_PLUS: +++ DBG ("tilt + %d\n", value); +++#ifdef USE_BUTTONS +++ tilt_rel (this->fd, this->min_res); +++ +++ res = this->min_res; +++#else +++ worker_tilt = value ? this->min_res : 0; +++ pthread_cond_broadcast (&worker_cond); +++ res = value; +++#endif +++ +++ break; +++ +++ case IN_CMD_TILT_MINUS: +++ DBG ("tilt - %d\n", value); +++ +++#ifdef USE_BUTTONS +++ tilt_rel (this->fd, -this->min_res); +++ +++ res = this->min_res; +++#else +++ worker_tilt = value ? -this->min_res : 0; +++ pthread_cond_broadcast (&worker_cond); +++ res = value; +++#endif +++ +++ break; +++ +++ default: +++ DBG ("nothing matched\n"); +++ res = -1; +++ } +++ +++ +++ return res; +++} +++ +++ +++ +++int +++input_cmd (int plugin_number, unsigned int control_id, unsigned int group, +++ int value, char *value_string) +++{ +++ int ret = -1; +++ DBG ("Requested cmd (id: %d) for the %d plugin. Group: %d value: %d\n", +++ control_id, plugin_number, group, value); +++ +++ if (group != IN_CMD_GENERIC) +++ return -1; +++ +++ switch (control_id) +++ { +++ case IN_CMD_PAN_MINUS: +++ case IN_CMD_PAN_PLUS: +++ case IN_CMD_TILT_MINUS: +++ case IN_CMD_TILT_PLUS: +++ case IN_CMD_TILT_SET: +++ case IN_CMD_PAN_SET: +++ case IN_CMD_RESET_PAN_TILT: +++ ret = input_cmd_old (control_id, value); +++ break; +++ } +++ +++ return ret; +++} ++Index: bar/plugins/input_motors/Makefile ++=================================================================== ++--- /dev/null +++++ bar/plugins/input_motors/Makefile ++@@ -0,0 +1,24 @@ +++############################################################### +++# +++# Purpose: Makefile for "M-JPEG Streamer" +++# Author.: Tom Stoeveken (TST) +++# Version: 0.3 +++# License: GPL +++# +++############################################################### +++ +++CC = gcc +++ +++OTHER_HEADERS = ../../mjpg_streamer.h ../../utils.h ../output.h ../input.h +++ +++CFLAGS += -O2 -DLINUX -D_GNU_SOURCE -Wall -shared -fPIC +++#CFLAGS += -DDEBUG +++ +++all: input_motors.so +++ +++clean: +++ rm -f *.a *.o core *~ *.so *.lo +++ +++input_motors.so: $(OTHER_HEADERS) +++ $(CC) $(CFLAGS) $(LFLAGS) -o $@ input_motors.c +++ ++Index: bar/www/index.html ++=================================================================== ++--- bar.orig/www/index.html +++++ bar/www/index.html ++@@ -3,53 +3,87 @@ ++ ++ ++ MJPG-streamer ++- ++- +++ +++ +++ +++ ++ ++ ++- +++ ++ ++- ++- ++-
++-

About

++-

Details about the M-JPEG streamer

++- ++-

Congratulations

++-

You sucessfully managed to install this streaming webserver. If you can see this page, you can also access the stream of JPGs, which can originate from your webcam for example. This installation consists of these example pages and you may customize the look and content.

++- ++- just an image ++-

The reason for developing this software was the need of a simple and ressource friendly streaming application for Linux-UVC compatible webcams. The predecessor uvc-streamer is working well, but i wanted to implement a few more ideas. For instance, plugins can be used to process the images. One input plugin copies images to a global variable, multiple output plugins can access those images. For example this webpage is served by the output_http.so plugin.

++- ++- static image example ++-

The image displayed here was grabbed by the input plugin. The HTTP request contains the GET parameters action=snapshot. This requests one single picture from the image-input. To display another example, just click on the picture.

++ ++-

About the examples

++-

To view the stream with any browser you may try the javascript or java subpages. Firefox is able to display the M-JPEG-stream directly.

+++

+++ +++

+++ +++ +++ +++
+++
    +++
    +++ +++

    +++ ↠+++ ↑ +++ ↓ +++ → +++

    ++ ++-

    About this server

    ++-

    This server is running a software written for the MJPG-streamer project. The MJPG-streamer developers can not be made responsible for installations of this software.

    +++ ++ ++-

    © The MJPG-streamer team | Design by Andreas Viklund

    ++-
    ++ ++ ++Index: bar/www/index.html ++=================================================================== ++--- /dev/null +++++ bar/www/index.css ++@@ -0,0 +1,5 @@ +++img.x-rotated-180 { +++ -moz-transform: rotate(180deg); +++ -webkit-transform: rotate(180deg); +++} +++ +diff --git a/target/linux/ramips/base-files/lib/upgrade/platform.sh b/target/linux/ramips/base-files/lib/upgrade/platform.sh +index 2f6c624..059aae2 100755 +--- a/target/linux/ramips/base-files/lib/upgrade/platform.sh ++++ b/target/linux/ramips/base-files/lib/upgrade/platform.sh +@@ -15,6 +15,8 @@ platform_check_image() { + + case "$board" in + 3g150b|\ ++ ncs601w|\ ++ tp-c516w|\ + 3g300m|\ + 3g-6200n|\ + 3g-6200nl|\ +diff --git a/target/linux/ramips/dts/rt5350.dtsi b/target/linux/ramips/dts/rt5350.dtsi +index 5282e5b..208a962 100644 +--- a/target/linux/ramips/dts/rt5350.dtsi ++++ b/target/linux/ramips/dts/rt5350.dtsi +@@ -119,6 +119,9 @@ + compatible = "ralink,rt5350-gpio", "ralink,rt2880-gpio"; + reg = <0x660 0x24>; + ++ resets = <&rstctrl 13>; ++ reset-names = "pio"; ++ + interrupt-parent = <&intc>; + interrupts = <6>; + +@@ -131,7 +134,7 @@ + 10 14 18 1c + 20 24 ]; + +- status = "disabled"; ++ /*status = "disabled";*/ + }; + + i2c@900 { +@@ -165,6 +168,7 @@ + + status = "disabled"; + }; ++ + + uartlite@c00 { + compatible = "ralink,rt5350-uart", "ralink,rt2880-uart", "ns16550a"; +@@ -189,6 +193,16 @@ + interrupt-parent = <&cpuintc>; + interrupts = <7>; + }; ++ ++ ++ /* phydummy { ++ compatible = "ralink,phydummy"; ++ ++ pinctrl-names = "default"; ++ pinctrl-0 = <&led_pins>; ++ ++ }; */ ++ + }; + + pinctrl { +@@ -214,13 +228,6 @@ + }; + }; + +- phy_led_pins: phy_led { +- phy_led { +- ralink,group = "led"; +- ralink,function = "led"; +- }; +- }; +- + uartlite_pins: uartlite { + uart { + ralink,group = "uartlite"; +@@ -241,6 +248,13 @@ + ralink,function = "spi_cs1"; + }; + }; ++ ++ led_pins: phy_led { ++ phy_led { ++ ralink,group = "led"; ++ ralink,function = "led"; ++ }; ++ }; + }; + + rstctrl: rstctrl { +diff --git a/target/linux/ramips/image/Makefile b/target/linux/ramips/image/Makefile +index ffff29f..2400261 100644 +--- a/target/linux/ramips/image/Makefile ++++ b/target/linux/ramips/image/Makefile +@@ -745,6 +745,7 @@ define Image/Build/Profile/Default + $(call Image/Build/Profile/MZKW300NH2,$(1)) + $(call Image/Build/Profile/NBG-419N,$(1)) + $(call Image/Build/Profile/NCS601W,$(1)) ++ $(call Image/Build/Profile/TP-C516W,$(1)) + $(call Image/Build/Profile/NW718,$(1)) + $(call Image/Build/Profile/MINIEMBWIFI,$(1)) + $(call Image/Build/Profile/MINIEMBPLUG,$(1)) +diff --git a/target/linux/ramips/patches-3.18/9999-kkmoon-motors.patch b/target/linux/ramips/patches-3.18/9999-kkmoon-motors.patch +new file mode 100644 +index 0000000..2266282 +--- /dev/null ++++ b/target/linux/ramips/patches-3.18/9999-kkmoon-motors.patch +@@ -0,0 +1,284 @@ ++Index: linux-3.18.21/drivers/misc/Kconfig ++=================================================================== ++--- linux-3.18.21.orig/drivers/misc/Kconfig +++++ linux-3.18.21/drivers/misc/Kconfig ++@@ -515,6 +515,13 @@ config VEXPRESS_SYSCFG ++ bus. System Configuration interface is one of the possible means ++ of generating transactions on this bus. ++ +++config KKMOON_MOTORS +++ tristate "kkmoon motor support" +++ depends on GPIOLIB +++ default m +++ help +++ kkmoon motors +++ ++ source "drivers/misc/c2port/Kconfig" ++ source "drivers/misc/eeprom/Kconfig" ++ source "drivers/misc/cb710/Kconfig" ++Index: linux-3.18.21/drivers/misc/Makefile ++=================================================================== ++--- linux-3.18.21.orig/drivers/misc/Makefile +++++ linux-3.18.21/drivers/misc/Makefile ++@@ -56,3 +56,4 @@ obj-$(CONFIG_GENWQE) += genwqe/ ++ obj-$(CONFIG_ECHO) += echo/ ++ obj-$(CONFIG_VEXPRESS_SYSCFG) += vexpress-syscfg.o ++ obj-$(CONFIG_CXL_BASE) += cxl/ +++obj-$(CONFIG_KKMOON_MOTORS) += kkmoon-motors.o ++Index: linux-3.18.21/drivers/misc/kkmoon-motors.c ++=================================================================== ++--- /dev/null +++++ linux-3.18.21/drivers/misc/kkmoon-motors.c ++@@ -0,0 +1,235 @@ +++#include +++#include +++#include +++#include +++#include +++#include +++#include +++#include +++#include +++ +++MODULE_LICENSE ("GPL"); +++MODULE_AUTHOR ("James McKenzie"); +++MODULE_DESCRIPTION ("KKMoon motor control"); +++MODULE_VERSION ("0.1"); +++ +++#define GPIO_A0 22 +++#define GPIO_A1 23 +++#define GPIO_A2 24 +++#define GPIO_D 26 +++ +++ +++static int h_phase; +++static int v_phase; +++ +++ +++static void +++latch_addr (int a) +++{ +++ gpio_set_value (GPIO_A0, ! !(a & 1)); +++ gpio_set_value (GPIO_A1, ! !(a & 2)); +++ gpio_set_value (GPIO_A2, ! !(a & 4)); +++ ndelay (100); +++} +++ +++ +++static void +++latch_off (void) +++{ +++ int i; +++ gpio_set_value (GPIO_D, 0); +++ for (i = 0; i < 8; ++i) +++ latch_addr (i); +++} +++ +++ +++static void +++latch_set (int a) +++{ +++ latch_off (); +++ latch_addr (a); +++ gpio_set_value (GPIO_D, 1); +++} +++ +++static int +++inc (int p) +++{ +++ p++; +++ p %= 4; +++ return p; +++} +++ +++ +++static int +++dec (int p) +++{ +++ p += 3; +++ p %= 4; +++ return p; +++} +++ +++static void +++turret_left (void) +++{ +++ latch_set (h_phase+4); +++ h_phase = dec (h_phase); +++ latch_set (h_phase+4); +++} +++ +++static void +++turret_right (void) +++{ +++ latch_set (h_phase+4); +++ h_phase = inc (h_phase); +++ latch_set (h_phase+4); +++} +++ +++ +++static void +++turret_down (void) +++{ +++ latch_set (v_phase); +++ v_phase = inc (v_phase); +++ latch_set (v_phase); +++} +++ +++ +++ +++static void +++turrent_up (void) +++{ +++ latch_set (v_phase); +++ v_phase = dec (v_phase); +++ latch_set (v_phase); +++} +++ +++void +++pause (void) +++{ +++ set_current_state(TASK_UNINTERRUPTIBLE); +++ schedule_timeout (HZ / 50); +++} +++ +++static ssize_t +++motors_write (struct file *file, const char __user * data, size_t count, +++ loff_t * ppos) +++{ +++ char c; +++ size_t red = 0; +++ +++ while (count--) +++ { +++ +++#if 1 +++ if (copy_from_user (&c, data++, 1)) +++ return EFAULT; +++#else +++ printk("cfu=%d\n",(int) copy_from_user (&c, data++, 1)); +++#endif +++ +++ switch (c) +++ { +++ case 'U': +++ turrent_up (); +++ pause (); +++ break; +++ case 'D': +++ turret_down (); +++ pause (); +++ break; +++ case 'L': +++ turret_left (); +++ pause (); +++ break; +++ case 'R': +++ turret_right (); +++ pause (); +++ break; +++ +++ } +++ +++ +++ red++; +++ +++ } +++ +++ latch_off (); +++ +++ *ppos = red; +++ +++ return red; +++} +++ +++ +++static const struct file_operations motors_fops = { +++ .owner = THIS_MODULE, +++ .write = motors_write, +++}; +++ +++ +++static struct miscdevice motors_dev = { +++ MISC_DYNAMIC_MINOR, +++ "motors", +++ &motors_fops +++}; +++ +++ +++ +++ +++ +++ +++ +++ +++static int __init +++motors_init (void) +++{ +++ int ret; +++ printk (KERN_INFO "KKMOON_MOTOR: Initializing\n"); +++ +++ ret = misc_register (&motors_dev); +++ if (ret) +++ return ret; +++ +++ +++ gpio_request (GPIO_A0, "sysfs"); +++ gpio_request (GPIO_A1, "sysfs"); +++ gpio_request (GPIO_A2, "sysfs"); +++ gpio_request (GPIO_D, "sysfs"); +++ +++ gpio_export (GPIO_A0, false); +++ gpio_export (GPIO_A1, false); +++ gpio_export (GPIO_A2, false); +++ gpio_export (GPIO_D, false); +++ +++ gpio_direction_output (GPIO_A0, 0); +++ gpio_direction_output (GPIO_A1, 0); +++ gpio_direction_output (GPIO_A2, 0); +++ gpio_direction_output (GPIO_D, 0); +++ +++ +++ latch_off (); +++ +++ return 0; +++} +++ +++static void __exit +++motors_exit (void) +++{ +++ +++ latch_off (); +++ +++ gpio_unexport (GPIO_D); +++ gpio_unexport (GPIO_A2); +++ gpio_unexport (GPIO_A1); +++ gpio_unexport (GPIO_A0); +++ +++ gpio_free (GPIO_D); +++ gpio_free (GPIO_A2); +++ gpio_free (GPIO_A1); +++ gpio_free (GPIO_A0); +++ +++ misc_deregister (&motors_dev); +++} +++ +++module_init (motors_init); +++module_exit (motors_exit); ++Index: linux-3.18.21/drivers/pinctrl/pinctrl-rt2880.c ++=================================================================== ++--- linux-3.18.21.orig/drivers/pinctrl/pinctrl-rt2880.c +++++ linux-3.18.21/drivers/pinctrl/pinctrl-rt2880.c ++@@ -372,6 +372,12 @@ static int rt2880_pinmux_pins(struct rt2 ++ /* pin 0 is always a gpio */ ++ p->gpio[0] = 1; ++ +++ /*ditto pins 22,23,24,and 26 as we don't have a driver to represent the phy*/ +++ p->gpio[22] = 1; +++ p->gpio[23] = 1; +++ p->gpio[24] = 1; +++ p->gpio[26] = 1; +++ ++ /* set the pads */ ++ for (i = 0; i < p->max_pins; i++) { ++ /* strlen("ioXY") + 1 = 5 */ +diff --git a/target/linux/ramips/rt305x/config-3.18 b/target/linux/ramips/rt305x/config-3.18 +index 9c03767..20b69ed 100644 +--- a/target/linux/ramips/rt305x/config-3.18 ++++ b/target/linux/ramips/rt305x/config-3.18 +@@ -169,3 +169,4 @@ CONFIG_USB_SUPPORT=y + CONFIG_USE_OF=y + CONFIG_WATCHDOG_CORE=y + CONFIG_ZONE_DMA_FLAG=0 ++CONFIG_KKMOON_MOTORS=y diff --git a/master/feeds b/master/feeds new file mode 100644 index 0000000..16efb4b --- /dev/null +++ b/master/feeds @@ -0,0 +1,813817 @@ +diff --git a/feeds/luci/.buildpath b/feeds/luci/.buildpath +new file mode 100644 +index 0000000..81fa646 +--- /dev/null ++++ b/feeds/luci/.buildpath +@@ -0,0 +1,5 @@ ++ ++ ++ ++ ++ +diff --git a/feeds/luci/.cproject b/feeds/luci/.cproject +new file mode 100644 +index 0000000..e1a4774 +--- /dev/null ++++ b/feeds/luci/.cproject +@@ -0,0 +1,221 @@ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ +diff --git a/feeds/luci/.gitignore b/feeds/luci/.gitignore +new file mode 100644 +index 0000000..07494e9 +--- /dev/null ++++ b/feeds/luci/.gitignore +@@ -0,0 +1,8 @@ ++dist/ ++/host ++*.o ++*.so ++*.swp ++*.po~ ++/docs ++modules/luci-base/src/po2lmo +diff --git a/feeds/luci/.project b/feeds/luci/.project +new file mode 100644 +index 0000000..11b398b +--- /dev/null ++++ b/feeds/luci/.project +@@ -0,0 +1,78 @@ ++ ++ ++ luci ++ ++ ++ ++ ++ ++ org.eclipse.cdt.managedbuilder.core.genmakebuilder ++ clean,full,incremental, ++ ++ ++ ?name? ++ ++ ++ ++ org.eclipse.cdt.make.core.append_environment ++ true ++ ++ ++ org.eclipse.cdt.make.core.autoBuildTarget ++ all ++ ++ ++ org.eclipse.cdt.make.core.buildArguments ++ ++ ++ ++ org.eclipse.cdt.make.core.buildCommand ++ make ++ ++ ++ org.eclipse.cdt.make.core.cleanBuildTarget ++ clean ++ ++ ++ org.eclipse.cdt.make.core.contents ++ org.eclipse.cdt.make.core.activeConfigSettings ++ ++ ++ org.eclipse.cdt.make.core.enableAutoBuild ++ false ++ ++ ++ org.eclipse.cdt.make.core.enableCleanBuild ++ true ++ ++ ++ org.eclipse.cdt.make.core.enableFullBuild ++ true ++ ++ ++ org.eclipse.cdt.make.core.fullBuildTarget ++ all ++ ++ ++ org.eclipse.cdt.make.core.stopOnError ++ true ++ ++ ++ org.eclipse.cdt.make.core.useDefaultBuildCmd ++ true ++ ++ ++ ++ ++ org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder ++ ++ ++ ++ ++ ++ org.eclipse.cdt.managedbuilder.core.ScannerConfigNature ++ org.eclipse.cdt.managedbuilder.core.managedBuildNature ++ org.eclipse.cdt.core.cnature ++ org.eclipse.dltk.lua.core.nature ++ ++ +diff --git a/feeds/luci/CONTRIBUTING.md b/feeds/luci/CONTRIBUTING.md +new file mode 100644 +index 0000000..7c42913 +--- /dev/null ++++ b/feeds/luci/CONTRIBUTING.md +@@ -0,0 +1,43 @@ ++# Contributing Guidelines ++ ++Patches and pull-requests: ++ ++If you want to contribute a change to LuCI, please either send a patch using git send-email ++or open a pull request against the openwrt/luci repository. ++ ++Regardless of whether you send a patch or open a pull request, please try to follow these rules: ++ ++* Have a useful subject prefixed with the component name ++ (E.g.: "modules/admin-full: fix wifi channel selection on multiple STA networks") ++* Shortly explain the changes made and - if applicable - the reasoning behind them ++* Include Signed-off-by in the comment ++ (See ) ++ ++In case you like to send patches by mail, please use the [LuCI mailinglist](https://lists.subsignal.org/mailman/listinfo/luci) ++or the [OpenWrt Development List](https://lists.openwrt.org/cgi-bin/mailman/listinfo/openwrt-devel). ++ ++If you send via the OpenWrt list, include a "[luci]" tag in your subject line. ++For general information on patch submission, follow the [OpenWrt patch submission guideline](https://dev.openwrt.org/wiki/SubmittingPatches). ++ ++ ++If you have commit access: ++ ++* Do NOT use git push --force. ++* Use Pull Requests if you are unsure and to suggest changes to other developers. ++ ++Gaining commit access: ++ ++* Commit access will be granted to responsible contributors who have made ++ useful pull requests and / or feedback or patches to this repository or ++ OpenWrt in general. Please include your request for commit access in your ++ next pull request or ticket. ++ ++Release Branches: ++ ++* Branches named "luci-X.Y" (e.g. luci-0.12) are release branches. ++* These branches are built with the respective OpenWrt release and are created ++ during the release stabilisation phase. ++* Please ONLY cherry-pick or commit security and bug-fixes to these branches. ++* Do NOT add new packages and do NOT do major upgrades of packages here. ++* If you are unsure if your change is suitable, please use a pull request. ++ +diff --git a/feeds/luci/LICENSE b/feeds/luci/LICENSE +new file mode 100644 +index 0000000..f49a4e1 +--- /dev/null ++++ b/feeds/luci/LICENSE +@@ -0,0 +1,201 @@ ++ Apache License ++ Version 2.0, January 2004 ++ http://www.apache.org/licenses/ ++ ++ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION ++ ++ 1. Definitions. ++ ++ "License" shall mean the terms and conditions for use, reproduction, ++ and distribution as defined by Sections 1 through 9 of this document. ++ ++ "Licensor" shall mean the copyright owner or entity authorized by ++ the copyright owner that is granting the License. ++ ++ "Legal Entity" shall mean the union of the acting entity and all ++ other entities that control, are controlled by, or are under common ++ control with that entity. For the purposes of this definition, ++ "control" means (i) the power, direct or indirect, to cause the ++ direction or management of such entity, whether by contract or ++ otherwise, or (ii) ownership of fifty percent (50%) or more of the ++ outstanding shares, or (iii) beneficial ownership of such entity. ++ ++ "You" (or "Your") shall mean an individual or Legal Entity ++ exercising permissions granted by this License. ++ ++ "Source" form shall mean the preferred form for making modifications, ++ including but not limited to software source code, documentation ++ source, and configuration files. ++ ++ "Object" form shall mean any form resulting from mechanical ++ transformation or translation of a Source form, including but ++ not limited to compiled object code, generated documentation, ++ and conversions to other media types. ++ ++ "Work" shall mean the work of authorship, whether in Source or ++ Object form, made available under the License, as indicated by a ++ copyright notice that is included in or attached to the work ++ (an example is provided in the Appendix below). ++ ++ "Derivative Works" shall mean any work, whether in Source or Object ++ form, that is based on (or derived from) the Work and for which the ++ editorial revisions, annotations, elaborations, or other modifications ++ represent, as a whole, an original work of authorship. For the purposes ++ of this License, Derivative Works shall not include works that remain ++ separable from, or merely link (or bind by name) to the interfaces of, ++ the Work and Derivative Works thereof. ++ ++ "Contribution" shall mean any work of authorship, including ++ the original version of the Work and any modifications or additions ++ to that Work or Derivative Works thereof, that is intentionally ++ submitted to Licensor for inclusion in the Work by the copyright owner ++ or by an individual or Legal Entity authorized to submit on behalf of ++ the copyright owner. For the purposes of this definition, "submitted" ++ means any form of electronic, verbal, or written communication sent ++ to the Licensor or its representatives, including but not limited to ++ communication on electronic mailing lists, source code control systems, ++ and issue tracking systems that are managed by, or on behalf of, the ++ Licensor for the purpose of discussing and improving the Work, but ++ excluding communication that is conspicuously marked or otherwise ++ designated in writing by the copyright owner as "Not a Contribution." ++ ++ "Contributor" shall mean Licensor and any individual or Legal Entity ++ on behalf of whom a Contribution has been received by Licensor and ++ subsequently incorporated within the Work. ++ ++ 2. Grant of Copyright License. Subject to the terms and conditions of ++ this License, each Contributor hereby grants to You a perpetual, ++ worldwide, non-exclusive, no-charge, royalty-free, irrevocable ++ copyright license to reproduce, prepare Derivative Works of, ++ publicly display, publicly perform, sublicense, and distribute the ++ Work and such Derivative Works in Source or Object form. ++ ++ 3. Grant of Patent License. Subject to the terms and conditions of ++ this License, each Contributor hereby grants to You a perpetual, ++ worldwide, non-exclusive, no-charge, royalty-free, irrevocable ++ (except as stated in this section) patent license to make, have made, ++ use, offer to sell, sell, import, and otherwise transfer the Work, ++ where such license applies only to those patent claims licensable ++ by such Contributor that are necessarily infringed by their ++ Contribution(s) alone or by combination of their Contribution(s) ++ with the Work to which such Contribution(s) was submitted. If You ++ institute patent litigation against any entity (including a ++ cross-claim or counterclaim in a lawsuit) alleging that the Work ++ or a Contribution incorporated within the Work constitutes direct ++ or contributory patent infringement, then any patent licenses ++ granted to You under this License for that Work shall terminate ++ as of the date such litigation is filed. ++ ++ 4. Redistribution. You may reproduce and distribute copies of the ++ Work or Derivative Works thereof in any medium, with or without ++ modifications, and in Source or Object form, provided that You ++ meet the following conditions: ++ ++ (a) You must give any other recipients of the Work or ++ Derivative Works a copy of this License; and ++ ++ (b) You must cause any modified files to carry prominent notices ++ stating that You changed the files; and ++ ++ (c) You must retain, in the Source form of any Derivative Works ++ that You distribute, all copyright, patent, trademark, and ++ attribution notices from the Source form of the Work, ++ excluding those notices that do not pertain to any part of ++ the Derivative Works; and ++ ++ (d) If the Work includes a "NOTICE" text file as part of its ++ distribution, then any Derivative Works that You distribute must ++ include a readable copy of the attribution notices contained ++ within such NOTICE file, excluding those notices that do not ++ pertain to any part of the Derivative Works, in at least one ++ of the following places: within a NOTICE text file distributed ++ as part of the Derivative Works; within the Source form or ++ documentation, if provided along with the Derivative Works; or, ++ within a display generated by the Derivative Works, if and ++ wherever such third-party notices normally appear. The contents ++ of the NOTICE file are for informational purposes only and ++ do not modify the License. You may add Your own attribution ++ notices within Derivative Works that You distribute, alongside ++ or as an addendum to the NOTICE text from the Work, provided ++ that such additional attribution notices cannot be construed ++ as modifying the License. ++ ++ You may add Your own copyright statement to Your modifications and ++ may provide additional or different license terms and conditions ++ for use, reproduction, or distribution of Your modifications, or ++ for any such Derivative Works as a whole, provided Your use, ++ reproduction, and distribution of the Work otherwise complies with ++ the conditions stated in this License. ++ ++ 5. Submission of Contributions. Unless You explicitly state otherwise, ++ any Contribution intentionally submitted for inclusion in the Work ++ by You to the Licensor shall be under the terms and conditions of ++ this License, without any additional terms or conditions. ++ Notwithstanding the above, nothing herein shall supersede or modify ++ the terms of any separate license agreement you may have executed ++ with Licensor regarding such Contributions. ++ ++ 6. Trademarks. This License does not grant permission to use the trade ++ names, trademarks, service marks, or product names of the Licensor, ++ except as required for reasonable and customary use in describing the ++ origin of the Work and reproducing the content of the NOTICE file. ++ ++ 7. Disclaimer of Warranty. Unless required by applicable law or ++ agreed to in writing, Licensor provides the Work (and each ++ Contributor provides its Contributions) on an "AS IS" BASIS, ++ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or ++ implied, including, without limitation, any warranties or conditions ++ of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A ++ PARTICULAR PURPOSE. You are solely responsible for determining the ++ appropriateness of using or redistributing the Work and assume any ++ risks associated with Your exercise of permissions under this License. ++ ++ 8. Limitation of Liability. In no event and under no legal theory, ++ whether in tort (including negligence), contract, or otherwise, ++ unless required by applicable law (such as deliberate and grossly ++ negligent acts) or agreed to in writing, shall any Contributor be ++ liable to You for damages, including any direct, indirect, special, ++ incidental, or consequential damages of any character arising as a ++ result of this License or out of the use or inability to use the ++ Work (including but not limited to damages for loss of goodwill, ++ work stoppage, computer failure or malfunction, or any and all ++ other commercial damages or losses), even if such Contributor ++ has been advised of the possibility of such damages. ++ ++ 9. Accepting Warranty or Additional Liability. While redistributing ++ the Work or Derivative Works thereof, You may choose to offer, ++ and charge a fee for, acceptance of support, warranty, indemnity, ++ or other liability obligations and/or rights consistent with this ++ License. However, in accepting such obligations, You may act only ++ on Your own behalf and on Your sole responsibility, not on behalf ++ of any other Contributor, and only if You agree to indemnify, ++ defend, and hold each Contributor harmless for any liability ++ incurred by, or claims asserted against, such Contributor by reason ++ of your accepting any such warranty or additional liability. ++ ++ END OF TERMS AND CONDITIONS ++ ++ APPENDIX: How to apply the Apache License to your work. ++ ++ To apply the Apache License to your work, attach the following ++ boilerplate notice, with the fields enclosed by brackets "[]" ++ replaced with your own identifying information. (Don't include ++ the brackets!) The text should be enclosed in the appropriate ++ comment syntax for the file format. We also recommend that a ++ file or class name and description of purpose be included on the ++ same "printed page" as the copyright notice for easier ++ identification within third-party archives. ++ ++ Copyright [yyyy] [name of copyright owner] ++ ++ Licensed under the Apache License, Version 2.0 (the "License"); ++ you may not use this file except in compliance with the License. ++ You may obtain a copy of the License at ++ ++ http://www.apache.org/licenses/LICENSE-2.0 ++ ++ Unless required by applicable law or agreed to in writing, software ++ distributed under the License is distributed on an "AS IS" BASIS, ++ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. ++ See the License for the specific language governing permissions and ++ limitations under the License. +\ No newline at end of file +diff --git a/feeds/luci/NOTICE b/feeds/luci/NOTICE +new file mode 100644 +index 0000000..47e1969 +--- /dev/null ++++ b/feeds/luci/NOTICE +@@ -0,0 +1,9 @@ ++LuCI - Lua Configuration Interface ++Copyright 2008 Steven Barth ++Copyright 2008 Jo-Philipp Wich ++Licensed under the Apache License, Version 2.0. ++ ++Contains code from: ++coxpcall - Copyright 2005 - Kepler Project (www.keplerproject.org) ++ltn12/luasocket - Copyright 2004-2007 Diego Nehab ++axTLS - Copyright 2008 Cameron Rich +diff --git a/feeds/luci/README.md b/feeds/luci/README.md +new file mode 100644 +index 0000000..371cee2 +--- /dev/null ++++ b/feeds/luci/README.md +@@ -0,0 +1,26 @@ ++# OpenWrt luci feed ++ ++## Description ++ ++This is the OpenWrt "luci"-feed containing LuCI - OpenWrt Configuration Interface. ++ ++## Usage ++ ++This feed is enabled by default. Your feeds.conf.default (or feeds.conf) should contain a line like: ++``` ++src-git luci https://github.com/openwrt/luci.git ++``` ++ ++To install all its package definitions, run: ++``` ++./scripts/feeds update luci ++./scripts/feeds install -a -p luci ++``` ++ ++## License ++ ++See [LICENSE](LICENSE) file. ++ ++## Package Guidelines ++ ++See [CONTRIBUTING.md](CONTRIBUTING.md) file. +diff --git a/feeds/luci/THANKYOU b/feeds/luci/THANKYOU +new file mode 100644 +index 0000000..f0519bd +--- /dev/null ++++ b/feeds/luci/THANKYOU +@@ -0,0 +1,26 @@ ++I'd like to thank the following people for contributing to this software: ++ ++* Anton Popov ++ - for rewriting the openwrt.org theme ++ ++* Florian Fainelli (OpenWrt) ++ - for the french translation ++ ++* Alina Friedrichsen ++ - for the reworked translation system, help on standards compliance and accessibility ++ ++* Yanira ++ - several applications and bugreports ++ ++ ++Also a big thank you goes to: ++ ++* Mono (Freifunk Halle) ++ - for donating a Linksys WRT54GL for development purposes ++ ++* tetzlav (Freifunk Leipzig) ++ - for donating several boards for testing and his feedback ++ ++* Mickey (Freifunk Hannover) ++ - for his feedback and fixes for the OpenWrt builds ++ +diff --git a/feeds/luci/applications/luci-app-ahcp/Makefile b/feeds/luci/applications/luci-app-ahcp/Makefile +new file mode 100644 +index 0000000..bb4d415 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-ahcp/Makefile +@@ -0,0 +1,14 @@ ++# ++# Copyright (C) 2008-2014 The LuCI Team ++# ++# This is free software, licensed under the Apache License, Version 2.0 . ++# ++ ++include $(TOPDIR)/rules.mk ++ ++LUCI_TITLE:=LuCI Support for AHCPd ++LUCI_DEPENDS:=+ahcpd ++ ++include ../../luci.mk ++ ++# call BuildPackage - OpenWrt buildroot signature +diff --git a/feeds/luci/applications/luci-app-ahcp/luasrc/controller/ahcp.lua b/feeds/luci/applications/luci-app-ahcp/luasrc/controller/ahcp.lua +new file mode 100644 +index 0000000..e97da55 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-ahcp/luasrc/controller/ahcp.lua +@@ -0,0 +1,49 @@ ++-- Copyright 2011 Jo-Philipp Wich ++-- Licensed to the public under the Apache License 2.0. ++ ++module("luci.controller.ahcp", package.seeall) ++ ++function index() ++ if not nixio.fs.access("/etc/config/ahcpd") then ++ return ++ end ++ ++ entry({"admin", "network", "ahcpd"}, cbi("ahcp"), _("AHCP Server"), 90) ++ entry({"admin", "network", "ahcpd", "status"}, call("ahcp_status")) ++end ++ ++function ahcp_status() ++ local nfs = require "nixio.fs" ++ local uci = require "luci.model.uci".cursor() ++ local lsd = uci:get_first("ahcpd", "ahcpd", "lease_dir") or "/var/lib/leases" ++ local idf = uci:get_first("ahcpd", "ahcpd", "id_file") or "/var/lib/ahcpd-unique-id" ++ ++ local rv = { ++ uid = "00:00:00:00:00:00:00:00", ++ leases = { } ++ } ++ ++ idf = nfs.readfile(idf) ++ if idf and #idf == 8 then ++ rv.uid = "%02X:%02X:%02X:%02X:%02X:%02X:%02X:%02X" %{ idf:byte(1, 8) } ++ end ++ ++ local itr = nfs.dir(lsd) ++ if itr then ++ local addr ++ for addr in itr do ++ if addr:match("^%d+%.%d+%.%d+%.%d+$") then ++ local s = nfs.stat(lsd .. "/" .. addr) ++ rv.leases[#rv.leases+1] = { ++ addr = addr, ++ age = s and (os.time() - s.mtime) or 0 ++ } ++ end ++ end ++ end ++ ++ table.sort(rv.leases, function(a, b) return a.age < b.age end) ++ ++ luci.http.prepare_content("application/json") ++ luci.http.write_json(rv) ++end +diff --git a/feeds/luci/applications/luci-app-ahcp/luasrc/model/cbi/ahcp.lua b/feeds/luci/applications/luci-app-ahcp/luasrc/model/cbi/ahcp.lua +new file mode 100644 +index 0000000..30897eb +--- /dev/null ++++ b/feeds/luci/applications/luci-app-ahcp/luasrc/model/cbi/ahcp.lua +@@ -0,0 +1,110 @@ ++-- Copyright 2011 Jo-Philipp Wich ++-- Licensed to the public under the Apache License 2.0. ++ ++m = Map("ahcpd", translate("AHCP Server"), translate("AHCP is an autoconfiguration protocol " .. ++ "for IPv6 and dual-stack IPv6/IPv4 networks designed to be used in place of router " .. ++ "discovery or DHCP on networks where it is difficult or impossible to configure a " .. ++ "server within every link-layer broadcast domain, for example mobile ad-hoc networks.")) ++ ++ ++m:section(SimpleSection).template = "ahcp_status" ++ ++s = m:section(TypedSection, "ahcpd") ++s:tab("general", translate("General Setup")) ++s:tab("advanced", translate("Advanced Settings")) ++s.addremove = false ++s.anonymous = true ++ ++ ++mode = s:taboption("general", ListValue, "mode", translate("Operation mode")) ++mode:value("server", translate("Server")) ++mode:value("forwarder", translate("Forwarder")) ++ ++net = s:taboption("general", Value, "interface", translate("Served interfaces")) ++net.template = "cbi/network_netlist" ++net.widget = "checkbox" ++net.nocreate = true ++ ++function net.cfgvalue(self, section) ++ return m.uci:get("ahcpd", section, "interface") ++end ++ ++pfx = s:taboption("general", DynamicList, "prefix", translate("Announced prefixes"), ++ translate("Specifies the announced IPv4 and IPv6 network prefixes in CIDR notation")) ++pfx.optional = true ++pfx.datatype = "ipaddr" ++pfx:depends("mode", "server") ++ ++nss = s:taboption("general", DynamicList, "name_server", translate("Announced DNS servers"), ++ translate("Specifies the announced IPv4 and IPv6 name servers")) ++nss.optional = true ++nss.datatype = "ipaddr" ++nss:depends("mode", "server") ++ ++ntp = s:taboption("general", DynamicList, "ntp_server", translate("Announced NTP servers"), ++ translate("Specifies the announced IPv4 and IPv6 NTP servers")) ++ntp.optional = true ++ntp.datatype = "ipaddr" ++ntp:depends("mode", "server") ++ ++mca = s:taboption("general", Value, "multicast_address", translate("Multicast address")) ++mca.optional = true ++mca.placeholder = "ff02::cca6:c0f9:e182:5359" ++mca.datatype = "ip6addr" ++ ++port = s:taboption("general", Value, "port", translate("Port")) ++port.optional = true ++port.placeholder = 5359 ++port.datatype = "port" ++ ++fam = s:taboption("general", ListValue, "_family", translate("Protocol family")) ++fam:value("", translate("IPv4 and IPv6")) ++fam:value("ipv4", translate("IPv4 only")) ++fam:value("ipv6", translate("IPv6 only")) ++ ++function fam.cfgvalue(self, section) ++ local v4 = m.uci:get_bool("ahcpd", section, "ipv4_only") ++ local v6 = m.uci:get_bool("ahcpd", section, "ipv6_only") ++ if v4 then ++ return "ipv4" ++ elseif v6 then ++ return "ipv6" ++ end ++ return "" ++end ++ ++function fam.write(self, section, value) ++ if value == "ipv4" then ++ m.uci:set("ahcpd", section, "ipv4_only", "true") ++ m.uci:delete("ahcpd", section, "ipv6_only") ++ elseif value == "ipv6" then ++ m.uci:set("ahcpd", section, "ipv6_only", "true") ++ m.uci:delete("ahcpd", section, "ipv4_only") ++ end ++end ++ ++function fam.remove(self, section) ++ m.uci:delete("ahcpd", section, "ipv4_only") ++ m.uci:delete("ahcpd", section, "ipv6_only") ++end ++ ++ltime = s:taboption("general", Value, "lease_time", translate("Lease validity time")) ++ltime.optional = true ++ltime.placeholder = 3666 ++ltime.datatype = "uinteger" ++ ++ ++ld = s:taboption("advanced", Value, "lease_dir", translate("Lease directory")) ++ld.datatype = "directory" ++ld.placeholder = "/var/lib/leases" ++ ++id = s:taboption("advanced", Value, "id_file", translate("Unique ID file")) ++--id.datatype = "file" ++id.placeholder = "/var/lib/ahcpd-unique-id" ++ ++log = s:taboption("advanced", Value, "log_file", translate("Log file")) ++--log.datatype = "file" ++log.placeholder = "/var/log/ahcpd.log" ++ ++ ++return m +diff --git a/feeds/luci/applications/luci-app-ahcp/luasrc/view/admin_status/index/ahcp.htm b/feeds/luci/applications/luci-app-ahcp/luasrc/view/admin_status/index/ahcp.htm +new file mode 100644 +index 0000000..ef4cfca +--- /dev/null ++++ b/feeds/luci/applications/luci-app-ahcp/luasrc/view/admin_status/index/ahcp.htm +@@ -0,0 +1 @@ ++<%+ahcp_status%> +diff --git a/feeds/luci/applications/luci-app-ahcp/luasrc/view/ahcp_status.htm b/feeds/luci/applications/luci-app-ahcp/luasrc/view/ahcp_status.htm +new file mode 100644 +index 0000000..88796cb +--- /dev/null ++++ b/feeds/luci/applications/luci-app-ahcp/luasrc/view/ahcp_status.htm +@@ -0,0 +1,53 @@ ++ ++ ++
    ++ <%:Active AHCP Leases%> ++

    ++ ++ ++ ++ ++ ++ ++ ++ ++
    <%:Address%><%:Age%>

    <%:Collecting data...%>
    ++
    +diff --git a/feeds/luci/applications/luci-app-ahcp/po/ca/ahcp.po b/feeds/luci/applications/luci-app-ahcp/po/ca/ahcp.po +new file mode 100644 +index 0000000..89108fd +--- /dev/null ++++ b/feeds/luci/applications/luci-app-ahcp/po/ca/ahcp.po +@@ -0,0 +1,117 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"PO-Revision-Date: 2014-06-02 21:34+0200\n" ++"Last-Translator: Alex \n" ++"Language-Team: none\n" ++"Language: ca\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n != 1);\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "AHCP Server" ++msgstr "Servidor AHCP" ++ ++# Minor misspelling corrections ++#, fuzzy ++msgid "" ++"AHCP is an autoconfiguration protocol for IPv6 and dual-stack IPv6/IPv4 " ++"networks designed to be used in place of router discovery or DHCP on " ++"networks where it is difficult or impossible to configure a server within " ++"every link-layer broadcast domain, for example mobile ad-hoc networks." ++msgstr "" ++"AHCP és un protocol de configuració automàtica per IPv6 i xarxes de pila " ++"dual IPv6/IPv4 dissenyat per fer servir en lloc del descobriment de rutes o " ++"DHCP en xarxes on es difícil o impossible configurar un servidor dins de " ++"tots els dominis de difusió a la capa d'enllaç, per exemple xarxes mòbils ad-" ++"hoc." ++ ++# apòstrof+acrònims http://ca.wikipedia.org/wiki/Ap%C3%B2strof#Observacions ++msgid "Active AHCP Leases" ++msgstr "Leases actius d'AHCP" ++ ++msgid "Address" ++msgstr "Adreça" ++ ++msgid "Advanced Settings" ++msgstr "Configuració avançada" ++ ++msgid "Age" ++msgstr "Edat" ++ ++msgid "Announced DNS servers" ++msgstr "Servidors DNS anunciats" ++ ++msgid "Announced NTP servers" ++msgstr "Servidors NTP anunciats" ++ ++msgid "Announced prefixes" ++msgstr "Prefixos anunciats" ++ ++msgid "Collecting data..." ++msgstr "Recopilant informació..." ++ ++msgid "Forwarder" ++msgstr "Retransmissor" ++ ++msgid "General Setup" ++msgstr "Configuració general" ++ ++msgid "IPv4 and IPv6" ++msgstr "IPv4 i IPv6" ++ ++msgid "IPv4 only" ++msgstr "Només IPv4" ++ ++msgid "IPv6 only" ++msgstr "Només IPv6" ++ ++msgid "Lease directory" ++msgstr "Directori d'arrendament" ++ ++msgid "Lease validity time" ++msgstr "Duració d'arrendament" ++ ++msgid "Log file" ++msgstr "Fitxer de registre" ++ ++msgid "Multicast address" ++msgstr "Adreça de difusió selectiva" ++ ++msgid "Operation mode" ++msgstr "Mode d'operació" ++ ++msgid "Port" ++msgstr "Port" ++ ++msgid "Protocol family" ++msgstr "Família de protocol" ++ ++msgid "Served interfaces" ++msgstr "Interfícies servides" ++ ++msgid "Server" ++msgstr "Servidor" ++ ++msgid "Specifies the announced IPv4 and IPv6 NTP servers" ++msgstr "Especifica els servidors NTP IPv4 i IPv6 anunciats" ++ ++msgid "Specifies the announced IPv4 and IPv6 name servers" ++msgstr "Especifica els servidors de noms IPv4 i IPv6 anunciats" ++ ++msgid "Specifies the announced IPv4 and IPv6 network prefixes in CIDR notation" ++msgstr "Especifica els prefixos de xarxa IPv4 i IPv6 anunciats en notació CIDR" ++ ++msgid "The AHCP Service is not running." ++msgstr "El servidor AHCP no està funcionant." ++ ++msgid "The AHCP Service is running with ID %s." ++msgstr "El servei AHCP està funcionant amb el ID %s." ++ ++msgid "There are no active leases." ++msgstr "No hi ha arrendaments actius." ++ ++msgid "Unique ID file" ++msgstr "Fitxer ID únic" +diff --git a/feeds/luci/applications/luci-app-ahcp/po/cs/ahcp.po b/feeds/luci/applications/luci-app-ahcp/po/cs/ahcp.po +new file mode 100644 +index 0000000..0a9e0af +--- /dev/null ++++ b/feeds/luci/applications/luci-app-ahcp/po/cs/ahcp.po +@@ -0,0 +1,114 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"PO-Revision-Date: 2014-04-23 23:01+0200\n" ++"Last-Translator: koli \n" ++"Language-Team: none\n" ++"Language: cs\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "AHCP Server" ++msgstr "AHCP Server" ++ ++#, fuzzy ++msgid "" ++"AHCP is an autoconfiguration protocol for IPv6 and dual-stack IPv6/IPv4 " ++"networks designed to be used in place of router discovery or DHCP on " ++"networks where it is difficult or impossible to configure a server within " ++"every link-layer broadcast domain, for example mobile ad-hoc networks." ++msgstr "" ++"AHCP je autokonfiguraÄní protokol pro IPv6 a dual-stack IPv6/IPv4 sítÄ›, " ++"vytvoÅ™ený pro použití vedle funkcí router discovery (Vyhledávání smÄ›rovaÄů " ++"pomocí ICMP zpráv) a DHCP na sítích kde je obtížné Äi nemožné nakonfigurovat " ++"server v každé vrstvÄ› broadcast domény, například mobilní ad-hoc sítÄ›." ++ ++msgid "Active AHCP Leases" ++msgstr "Aktivní AHCP zapůjÄení" ++ ++msgid "Address" ++msgstr "Adresa" ++ ++msgid "Advanced Settings" ++msgstr "PokroÄilé nastavení" ++ ++msgid "Age" ++msgstr "Stáří" ++ ++msgid "Announced DNS servers" ++msgstr "Oznámené DNS servery" ++ ++msgid "Announced NTP servers" ++msgstr "Oznámené NTP servery" ++ ++msgid "Announced prefixes" ++msgstr "Oznámené pÅ™edÄíslí" ++ ++msgid "Collecting data..." ++msgstr "Probíhá shromažÄování dat..." ++ ++msgid "Forwarder" ++msgstr "PÅ™esmÄ›rování" ++ ++msgid "General Setup" ++msgstr "Obecné nastavení" ++ ++msgid "IPv4 and IPv6" ++msgstr "IPv4 a IPv6" ++ ++msgid "IPv4 only" ++msgstr "pouze IPv4" ++ ++msgid "IPv6 only" ++msgstr "Pouze IPv6" ++ ++msgid "Lease directory" ++msgstr "ZapůjÄené adresáře" ++ ++msgid "Lease validity time" ++msgstr "Doba platnosti zapujÄení" ++ ++msgid "Log file" ++msgstr "Soubor protokolu" ++ ++msgid "Multicast address" ++msgstr "VícesmÄ›rové adresy" ++ ++msgid "Operation mode" ++msgstr "Pracovní režim" ++ ++msgid "Port" ++msgstr "Port" ++ ++msgid "Protocol family" ++msgstr "Rodina protokolů" ++ ++msgid "Served interfaces" ++msgstr "Obsluhované rozhraní" ++ ++msgid "Server" ++msgstr "Servr" ++ ++msgid "Specifies the announced IPv4 and IPv6 NTP servers" ++msgstr "Specifikuje ohlášené IPv4 a IPv6 NTP servery" ++ ++msgid "Specifies the announced IPv4 and IPv6 name servers" ++msgstr "Specifikuje ohlášené IPv4 a IPv6 názvové servery" ++ ++msgid "Specifies the announced IPv4 and IPv6 network prefixes in CIDR notation" ++msgstr "Specifikuje ohlášené IPv4 a IPv6 sítÄ› pÅ™edpony v CIDR notaci" ++ ++msgid "The AHCP Service is not running." ++msgstr "Služba AHCP neběží" ++ ++msgid "The AHCP Service is running with ID %s." ++msgstr "Služba AHCP je spuÅ¡tÄ›na s ID %s." ++ ++msgid "There are no active leases." ++msgstr "Neexistují žádná aktivní pronajmutí." ++ ++msgid "Unique ID file" ++msgstr "JedineÄný ID soubor" +diff --git a/feeds/luci/applications/luci-app-ahcp/po/de/ahcp.po b/feeds/luci/applications/luci-app-ahcp/po/de/ahcp.po +new file mode 100644 +index 0000000..6df34d8 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-ahcp/po/de/ahcp.po +@@ -0,0 +1,115 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"PO-Revision-Date: 2013-01-30 18:21+0200\n" ++"Last-Translator: DAC324 \n" ++"Language-Team: none\n" ++"Language: de\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n != 1);\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "AHCP Server" ++msgstr "AHCP Server" ++ ++#, fuzzy ++msgid "" ++"AHCP is an autoconfiguration protocol for IPv6 and dual-stack IPv6/IPv4 " ++"networks designed to be used in place of router discovery or DHCP on " ++"networks where it is difficult or impossible to configure a server within " ++"every link-layer broadcast domain, for example mobile ad-hoc networks." ++msgstr "" ++"AHCP ist ein Autokonfigurationsprotokoll für IPv6- und IPv4/IPv6 Dualstack-" ++"Netzwerke. Es ist darauf ausgelegt anstelle von Router Advertisements und " ++"DHCP-Servern in Ad-Hoc Netzwerken eingesetzt zu werden." ++ ++msgid "Active AHCP Leases" ++msgstr "Aktive AHCP-Leases" ++ ++msgid "Address" ++msgstr "Adresse" ++ ++msgid "Advanced Settings" ++msgstr "Erweiterte Einstellungen" ++ ++msgid "Age" ++msgstr "Alter" ++ ++msgid "Announced DNS servers" ++msgstr "Angekündigte DNS-Server" ++ ++msgid "Announced NTP servers" ++msgstr "Angekündigte NTP-Server" ++ ++msgid "Announced prefixes" ++msgstr "Angekündigte Prefixe" ++ ++msgid "Collecting data..." ++msgstr "Sammle Daten..." ++ ++msgid "Forwarder" ++msgstr "Forwarder" ++ ++msgid "General Setup" ++msgstr "Allgemeine Einstellungen" ++ ++msgid "IPv4 and IPv6" ++msgstr "IPv4 und IPv6" ++ ++msgid "IPv4 only" ++msgstr "nur IPv4" ++ ++msgid "IPv6 only" ++msgstr "nur IPv6" ++ ++msgid "Lease directory" ++msgstr "Lease-Verzeichnis" ++ ++msgid "Lease validity time" ++msgstr "Lease-Gültigkeitsdauer" ++ ++msgid "Log file" ++msgstr "Protokolldatei" ++ ++msgid "Multicast address" ++msgstr "Mutlicast-Adresse" ++ ++msgid "Operation mode" ++msgstr "Betriebsmodus" ++ ++msgid "Port" ++msgstr "Port" ++ ++msgid "Protocol family" ++msgstr "Protokollfamilie" ++ ++msgid "Served interfaces" ++msgstr "Verwendete Schnittstellen" ++ ++msgid "Server" ++msgstr "Server" ++ ++msgid "Specifies the announced IPv4 and IPv6 NTP servers" ++msgstr "Konfiguriert die bekannt gegebenen IPv4- und IPv6-NTP-Server" ++ ++msgid "Specifies the announced IPv4 and IPv6 name servers" ++msgstr "Konfiguriert die bekannt gegebenen IPv4- und IPv6-DNS-Server" ++ ++msgid "Specifies the announced IPv4 and IPv6 network prefixes in CIDR notation" ++msgstr "" ++"Konfiguriert die bekannt gegebenen IPv4- und IPv6-Netzwerkprefixe. Angabe in " ++"CIDR-Notation." ++ ++msgid "The AHCP Service is not running." ++msgstr "Der AHCP-Dienst läuft nicht." ++ ++msgid "The AHCP Service is running with ID %s." ++msgstr "Der AHCP-Dienst läuft mit ID %s." ++ ++msgid "There are no active leases." ++msgstr "Es gibt keine aktiven Leases." ++ ++msgid "Unique ID file" ++msgstr "UID-Datei" +diff --git a/feeds/luci/applications/luci-app-ahcp/po/el/ahcp.po b/feeds/luci/applications/luci-app-ahcp/po/el/ahcp.po +new file mode 100644 +index 0000000..0d7d6bd +--- /dev/null ++++ b/feeds/luci/applications/luci-app-ahcp/po/el/ahcp.po +@@ -0,0 +1,114 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"PO-Revision-Date: 2012-03-18 16:25+0200\n" ++"Last-Translator: Vasilis \n" ++"Language-Team: none\n" ++"Language: el\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n != 1);\n" ++"X-Generator: Pootle 2.0.4\n" ++ ++msgid "AHCP Server" ++msgstr "ΕξυπηÏετητής AHCP" ++ ++msgid "" ++"AHCP is an autoconfiguration protocol for IPv6 and dual-stack IPv6/IPv4 " ++"networks designed to be used in place of router discovery or DHCP on " ++"networks where it is difficult or impossible to configure a server within " ++"every link-layer broadcast domain, for example mobile ad-hoc networks." ++msgstr "" ++ ++msgid "Active AHCP Leases" ++msgstr "ΕνεÏγά AHCP Leases" ++ ++msgid "Address" ++msgstr "ΔιεÏθυνση" ++ ++msgid "Advanced Settings" ++msgstr "" ++ ++msgid "Age" ++msgstr "" ++ ++msgid "Announced DNS servers" ++msgstr "" ++ ++msgid "Announced NTP servers" ++msgstr "" ++ ++msgid "Announced prefixes" ++msgstr "" ++ ++msgid "Collecting data..." ++msgstr "Συλλέγονται δεδομένα..." ++ ++msgid "Forwarder" ++msgstr "ΠÏοωθητής" ++ ++msgid "General Setup" ++msgstr "Γενικές Ïυθμίσεις" ++ ++msgid "IPv4 and IPv6" ++msgstr "IPv4 και IPv6" ++ ++msgid "IPv4 only" ++msgstr "μόνο IPv4" ++ ++msgid "IPv6 only" ++msgstr "μόνο IPv6" ++ ++#, fuzzy ++msgid "Lease directory" ++msgstr "Κατάλογος leases" ++ ++msgid "Lease validity time" ++msgstr "ΧÏόνος εγκυÏότητας lease" ++ ++msgid "Log file" ++msgstr "ΑÏχείο καταγÏαφής" ++ ++msgid "Multicast address" ++msgstr "ΔιεÏθυνση multicast" ++ ++msgid "Operation mode" ++msgstr "" ++ ++msgid "Port" ++msgstr "ΘÏÏα" ++ ++msgid "Protocol family" ++msgstr "Οικογένεια Ï€Ïωτοκόλλου" ++ ++msgid "Served interfaces" ++msgstr "ΕξυπηÏετοÏμενες διεπαφές" ++ ++msgid "Server" ++msgstr "ΕξυπηÏετητής" ++ ++msgid "Specifies the announced IPv4 and IPv6 NTP servers" ++msgstr "ΚαθοÏίζει τους εξυπηÏετητές NTP σε IPv4 και IPv6 που ανακοινώνονται" ++ ++msgid "Specifies the announced IPv4 and IPv6 name servers" ++msgstr "ΚαθοÏίζει τους εξυπηÏετητές DNS σε IPv4 και IPv6 που ανακοινώνονται" ++ ++#, fuzzy ++msgid "Specifies the announced IPv4 and IPv6 network prefixes in CIDR notation" ++msgstr "" ++"ΚαθοÏίζει τα Ï€Ïοθέματα διευθÏνσεων IPv4 και IPv6 που ανακοινώνονται, σε " ++"μοÏφή CIDR" ++ ++msgid "The AHCP Service is not running." ++msgstr "" ++ ++msgid "The AHCP Service is running with ID %s." ++msgstr "" ++ ++#, fuzzy ++msgid "There are no active leases." ++msgstr "Δεν υπάÏχουν ενεÏγά leases" ++ ++msgid "Unique ID file" ++msgstr "ΑÏχείο Î¼Î¿Î½Î±Î´Î¹ÎºÎ¿Ï Î±Î½Î±Î³Î½Ï‰ÏιστικοÏ" +diff --git a/feeds/luci/applications/luci-app-ahcp/po/en/ahcp.po b/feeds/luci/applications/luci-app-ahcp/po/en/ahcp.po +new file mode 100644 +index 0000000..4ad2ab2 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-ahcp/po/en/ahcp.po +@@ -0,0 +1,115 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"PO-Revision-Date: 2012-04-15 11:31+0200\n" ++"Last-Translator: madanadam \n" ++"Language-Team: none\n" ++"Language: en\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n != 1);\n" ++"X-Generator: Pootle 2.0.4\n" ++ ++msgid "AHCP Server" ++msgstr "AHCP Server" ++ ++#, fuzzy ++msgid "" ++"AHCP is an autoconfiguration protocol for IPv6 and dual-stack IPv6/IPv4 " ++"networks designed to be used in place of router discovery or DHCP on " ++"networks where it is difficult or impossible to configure a server within " ++"every link-layer broadcast domain, for example mobile ad-hoc networks." ++msgstr "" ++"AHCP is an autoconfiguration protocol for IPv6 and dual-stack IPv6/IPv4 " ++"networks designed to be used in place of router discovery and DHCP on " ++"networks where it is difficult or impossible to configure a server within " ++"every link-layer broadcast domain, for example mobile ad-hoc networks." ++ ++msgid "Active AHCP Leases" ++msgstr "Active AHCP Leases" ++ ++msgid "Address" ++msgstr "Address" ++ ++msgid "Advanced Settings" ++msgstr "Advanced Settings" ++ ++msgid "Age" ++msgstr "Age" ++ ++msgid "Announced DNS servers" ++msgstr "Announced DNS servers" ++ ++msgid "Announced NTP servers" ++msgstr "Announced NTP servers" ++ ++msgid "Announced prefixes" ++msgstr "Announced prefixes" ++ ++msgid "Collecting data..." ++msgstr "Collecting data..." ++ ++msgid "Forwarder" ++msgstr "Forwarder" ++ ++msgid "General Setup" ++msgstr "General Setup" ++ ++msgid "IPv4 and IPv6" ++msgstr "IPv4 and IPv6" ++ ++msgid "IPv4 only" ++msgstr "IPv4 only" ++ ++msgid "IPv6 only" ++msgstr "IPv6 only" ++ ++msgid "Lease directory" ++msgstr "Lease directory" ++ ++msgid "Lease validity time" ++msgstr "Lease validity time" ++ ++msgid "Log file" ++msgstr "Log file" ++ ++msgid "Multicast address" ++msgstr "Multicast address" ++ ++msgid "Operation mode" ++msgstr "Operation mode" ++ ++msgid "Port" ++msgstr "Port" ++ ++msgid "Protocol family" ++msgstr "Protocol family" ++ ++msgid "Served interfaces" ++msgstr "Served interfaces" ++ ++msgid "Server" ++msgstr "Server" ++ ++msgid "Specifies the announced IPv4 and IPv6 NTP servers" ++msgstr "Specifies the announced IPv4 and IPv6 NTP servers" ++ ++msgid "Specifies the announced IPv4 and IPv6 name servers" ++msgstr "Specifies the announced IPv4 and IPv6 name servers" ++ ++msgid "Specifies the announced IPv4 and IPv6 network prefixes in CIDR notation" ++msgstr "" ++"Specifies the announced IPv4 and IPv6 network prefixes in CIDR notation" ++ ++msgid "The AHCP Service is not running." ++msgstr "The AHCP Service is not running." ++ ++msgid "The AHCP Service is running with ID %s." ++msgstr "The AHCP Service is running with ID %s." ++ ++msgid "There are no active leases." ++msgstr "There are no active leases." ++ ++msgid "Unique ID file" ++msgstr "Unique ID file" +diff --git a/feeds/luci/applications/luci-app-ahcp/po/es/ahcp.po b/feeds/luci/applications/luci-app-ahcp/po/es/ahcp.po +new file mode 100644 +index 0000000..512606a +--- /dev/null ++++ b/feeds/luci/applications/luci-app-ahcp/po/es/ahcp.po +@@ -0,0 +1,115 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"PO-Revision-Date: 2013-09-14 19:30+0200\n" ++"Last-Translator: José Vicente \n" ++"Language-Team: none\n" ++"Language: es\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n != 1);\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "AHCP Server" ++msgstr "Servidor AHCP" ++ ++#, fuzzy ++msgid "" ++"AHCP is an autoconfiguration protocol for IPv6 and dual-stack IPv6/IPv4 " ++"networks designed to be used in place of router discovery or DHCP on " ++"networks where it is difficult or impossible to configure a server within " ++"every link-layer broadcast domain, for example mobile ad-hoc networks." ++msgstr "" ++"AHCP es un protocolo de autoconfiguración para redes con IPv6 o duales IPv6/" ++"IPv4 diseñado para ser usado en lugar de router discovery o DHCP en redes en " ++"las que es difícil o imposible configurar un servidor en cada capa de enlace " ++"del dominio de propagación como las redes móviles ad-hoc." ++ ++# "Lease" en el sentido usado en DHCP no tiene una traducción clara en español y se puede usar la misma palabra en que en inglés. ++msgid "Active AHCP Leases" ++msgstr "Cesiones activas AHCP" ++ ++msgid "Address" ++msgstr "Dirección" ++ ++msgid "Advanced Settings" ++msgstr "Configuración avanzada" ++ ++msgid "Age" ++msgstr "Vida" ++ ++msgid "Announced DNS servers" ++msgstr "Servidores DNS declarados" ++ ++msgid "Announced NTP servers" ++msgstr "Servidores NTP declarados" ++ ++msgid "Announced prefixes" ++msgstr "Prefijos declarados" ++ ++msgid "Collecting data..." ++msgstr "Obteniendo datos..." ++ ++msgid "Forwarder" ++msgstr "Transmisor" ++ ++msgid "General Setup" ++msgstr "Configuración general" ++ ++msgid "IPv4 and IPv6" ++msgstr "IPv4 e IPv6" ++ ++msgid "IPv4 only" ++msgstr "Sólo IPv4" ++ ++msgid "IPv6 only" ++msgstr "Sólo IPv6" ++ ++msgid "Lease directory" ++msgstr "Directorio de cesiones" ++ ++msgid "Lease validity time" ++msgstr "Tiempo de validez de la cesión" ++ ++msgid "Log file" ++msgstr "Fichero de registro" ++ ++msgid "Multicast address" ++msgstr "Dirección multicast" ++ ++msgid "Operation mode" ++msgstr "Modo de funcionamiento" ++ ++msgid "Port" ++msgstr "Puerto" ++ ++msgid "Protocol family" ++msgstr "Familia de protocolos" ++ ++msgid "Served interfaces" ++msgstr "Interfaces configurados" ++ ++msgid "Server" ++msgstr "Servidor" ++ ++msgid "Specifies the announced IPv4 and IPv6 NTP servers" ++msgstr "Especifica los servidores NTP IPv4 e IPv6 declarados" ++ ++msgid "Specifies the announced IPv4 and IPv6 name servers" ++msgstr "Especifica los servidores de nombres IPv4 e IPv6 declarados" ++ ++msgid "Specifies the announced IPv4 and IPv6 network prefixes in CIDR notation" ++msgstr "Especifica los prefijos de red IPv4 e IPv6 declarados en notación CIDR" ++ ++msgid "The AHCP Service is not running." ++msgstr "El Servicio AHCP no está funcionando." ++ ++msgid "The AHCP Service is running with ID %s." ++msgstr "El Servicio AHCP está funcionando con el ID %s." ++ ++msgid "There are no active leases." ++msgstr "No hay cesiones activas." ++ ++msgid "Unique ID file" ++msgstr "ID único de fichero" +diff --git a/feeds/luci/applications/luci-app-ahcp/po/fr/ahcp.po b/feeds/luci/applications/luci-app-ahcp/po/fr/ahcp.po +new file mode 100644 +index 0000000..1163518 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-ahcp/po/fr/ahcp.po +@@ -0,0 +1,115 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"PO-Revision-Date: 2012-11-06 13:06+0200\n" ++"Last-Translator: hogsim \n" ++"Language-Team: none\n" ++"Language: fr\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n > 1);\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "AHCP Server" ++msgstr "Serveur AHCP" ++ ++#, fuzzy ++msgid "" ++"AHCP is an autoconfiguration protocol for IPv6 and dual-stack IPv6/IPv4 " ++"networks designed to be used in place of router discovery or DHCP on " ++"networks where it is difficult or impossible to configure a server within " ++"every link-layer broadcast domain, for example mobile ad-hoc networks." ++msgstr "" ++"AHCP est un protocole d'auto-configuration pour les réseaux IPv6 et double-" ++"pile IPv6/IPv4, destiné à remplacer la recherche de routeur et le service " ++"DHCP sur des réseaux où il est difficile, voire impossible de configurer un " ++"tel serveur pour tous les domaines de diffusion au niveau lien, par exemple " ++"pour des réseaux ad-hoc mobiles." ++ ++msgid "Active AHCP Leases" ++msgstr "Baux AHCP actifs" ++ ++msgid "Address" ++msgstr "Adresse" ++ ++msgid "Advanced Settings" ++msgstr "Paramètres avancés" ++ ++msgid "Age" ++msgstr "Age" ++ ++msgid "Announced DNS servers" ++msgstr "Serveurs DNS publiés" ++ ++msgid "Announced NTP servers" ++msgstr "Serveurs NTP publiés" ++ ++msgid "Announced prefixes" ++msgstr "Préfixes publiés" ++ ++msgid "Collecting data..." ++msgstr "Récupération des données…" ++ ++msgid "Forwarder" ++msgstr "Transmetteur" ++ ++msgid "General Setup" ++msgstr "Paramètres principaux" ++ ++msgid "IPv4 and IPv6" ++msgstr "IPv4 et IPv6" ++ ++msgid "IPv4 only" ++msgstr "IPv4 seulement" ++ ++msgid "IPv6 only" ++msgstr "IPv6 seulement" ++ ++msgid "Lease directory" ++msgstr "Répertoire d'un bail" ++ ++msgid "Lease validity time" ++msgstr "Date de validité d'un bail" ++ ++msgid "Log file" ++msgstr "Fichier journal" ++ ++msgid "Multicast address" ++msgstr "Adresse multidiffusion" ++ ++msgid "Operation mode" ++msgstr "Mode de fonctionnement" ++ ++msgid "Port" ++msgstr "Port" ++ ++msgid "Protocol family" ++msgstr "Famille de protocole" ++ ++msgid "Served interfaces" ++msgstr "Interfaces gérés" ++ ++msgid "Server" ++msgstr "Serveur" ++ ++msgid "Specifies the announced IPv4 and IPv6 NTP servers" ++msgstr "Décrit les serveurs NTP IPv4 et IPv6 publiés" ++ ++msgid "Specifies the announced IPv4 and IPv6 name servers" ++msgstr "Décrit les serveurs de noms IPv4 et IPv6 publiés" ++ ++msgid "Specifies the announced IPv4 and IPv6 network prefixes in CIDR notation" ++msgstr "Décrit les préfixes réseaux IPv4 et IPv6 publiés en notation CIDR" ++ ++msgid "The AHCP Service is not running." ++msgstr "Le service AHCP n'est pas en fonctionnement." ++ ++msgid "The AHCP Service is running with ID %s." ++msgstr "Le service AHCP est en fonctionnement avec l'ID s." ++ ++msgid "There are no active leases." ++msgstr "Il n'y a aucun bail actif." ++ ++msgid "Unique ID file" ++msgstr "Fichier de l'ID unique" +diff --git a/feeds/luci/applications/luci-app-ahcp/po/he/ahcp.po b/feeds/luci/applications/luci-app-ahcp/po/he/ahcp.po +new file mode 100644 +index 0000000..1c45cc8 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-ahcp/po/he/ahcp.po +@@ -0,0 +1,118 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"PO-Revision-Date: 2012-09-10 03:44+0200\n" ++"Last-Translator: Snoof \n" ++"Language-Team: none\n" ++"Language: he\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n != 1);\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "AHCP Server" ++msgstr "שרת AHCP" ++ ++# מי שמבין ×ת ×”×ž×•× ×—×™× ×”×˜×›× ×™×™× ×©×™×¢×‘×•×¨ על ×–×” ויתקן. ++#, fuzzy ++msgid "" ++"AHCP is an autoconfiguration protocol for IPv6 and dual-stack IPv6/IPv4 " ++"networks designed to be used in place of router discovery or DHCP on " ++"networks where it is difficult or impossible to configure a server within " ++"every link-layer broadcast domain, for example mobile ad-hoc networks." ++msgstr "" ++"AHCP ×”×•× ×¤×¨×•×˜×•×§×•×œ להגדרה ×וטומטית של רשתות IPV6 ו- dual-stack IPv6/IPv4, ×שר " ++"עוצב לשימוש כתחליף לגילוי × ×ª×‘×™× ×•×œ- DHCP ברשתות שבהן קשה ×ו בלתי ×פשרי " ++"להגדיר שרת בתוך כל ×©× ×ž×ª×—× ×œ×©×™×“×•×¨ שכבת קישור, לדוגמה רשתות ×ד-הוק ניידות." ++ ++#, fuzzy ++msgid "Active AHCP Leases" ++msgstr "החכרות AHCP קיימות" ++ ++msgid "Address" ++msgstr "כתובת" ++ ++msgid "Advanced Settings" ++msgstr "הגדרות מתקדמות" ++ ++msgid "Age" ++msgstr "גיל" ++ ++msgid "Announced DNS servers" ++msgstr "שרתי DNS מוכרזי×" ++ ++msgid "Announced NTP servers" ++msgstr "שרתי NTP מוכרזי×" ++ ++msgid "Announced prefixes" ++msgstr "קידומות מוכרזות" ++ ++msgid "Collecting data..." ++msgstr "×וסף נתוני×..." ++ ++msgid "Forwarder" ++msgstr "" ++ ++msgid "General Setup" ++msgstr "התקנה כללית" ++ ++msgid "IPv4 and IPv6" ++msgstr "IPv4 ו- IPv6" ++ ++msgid "IPv4 only" ++msgstr "IPv4 בלבד" ++ ++msgid "IPv6 only" ++msgstr "IPv6 בלבד" ++ ++#, fuzzy ++msgid "Lease directory" ++msgstr "ספריית החכרות" ++ ++# תו ++msgid "Lease validity time" ++msgstr "תוקף ההקצ××”" ++ ++msgid "Log file" ++msgstr "קובץ רישו×" ++ ++msgid "Multicast address" ++msgstr "כתובת Multicast" ++ ++# ×פשר ×’× ×ž×¦×‘ פעולה ++msgid "Operation mode" ++msgstr "מצב הפעלה" ++ ++msgid "Port" ++msgstr "פורט" ++ ++msgid "Protocol family" ++msgstr "משפחת פרוטוקולי×" ++ ++msgid "Served interfaces" ++msgstr "×¡×™×’×ž× ×˜×™× ×ž×•×¤×¢×œ×™×" ++ ++msgid "Server" ++msgstr "שרת" ++ ++msgid "Specifies the announced IPv4 and IPv6 NTP servers" ++msgstr "שרתי NTP ברשתות IPV4 IPV6" ++ ++msgid "Specifies the announced IPv4 and IPv6 name servers" ++msgstr "שרתי DNS ברשתות IPV4 IPV6" ++ ++msgid "Specifies the announced IPv4 and IPv6 network prefixes in CIDR notation" ++msgstr "קידומת ×©×¨×ª×™× (CIDR)" ++ ++msgid "The AHCP Service is not running." ++msgstr "" ++ ++msgid "The AHCP Service is running with ID %s." ++msgstr "" ++ ++msgid "There are no active leases." ++msgstr "×ין הקצ×ות פעילות." ++ ++msgid "Unique ID file" ++msgstr "קובץ מזהה יחודי" +diff --git a/feeds/luci/applications/luci-app-ahcp/po/hu/ahcp.po b/feeds/luci/applications/luci-app-ahcp/po/hu/ahcp.po +new file mode 100644 +index 0000000..a0a91be +--- /dev/null ++++ b/feeds/luci/applications/luci-app-ahcp/po/hu/ahcp.po +@@ -0,0 +1,116 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"PO-Revision-Date: 2012-03-31 15:46+0200\n" ++"Last-Translator: juhosg \n" ++"Language-Team: none\n" ++"Language: hu\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n != 1);\n" ++"X-Generator: Pootle 2.0.4\n" ++ ++msgid "AHCP Server" ++msgstr "AHCP kiszolgáló" ++ ++#, fuzzy ++msgid "" ++"AHCP is an autoconfiguration protocol for IPv6 and dual-stack IPv6/IPv4 " ++"networks designed to be used in place of router discovery or DHCP on " ++"networks where it is difficult or impossible to configure a server within " ++"every link-layer broadcast domain, for example mobile ad-hoc networks." ++msgstr "" ++"Az AHCP egy olyan automatikus konfigurációs protokoll IPv6 és kettÅ‘s IPv6/" ++"IPv4 hálózatokhoz, mely a DHCP és a router dicovery protokoll helyett " ++"használható olyan hálózatokok ahol nehéz vagy lehetetlen beállítani külön " ++"kiszolgálót minden kapcsolati réteg tartományon belül, mint például a mobil " ++"eseti hálózatok." ++ ++msgid "Active AHCP Leases" ++msgstr "Aktív AHCP bérletek" ++ ++msgid "Address" ++msgstr "Cím" ++ ++msgid "Advanced Settings" ++msgstr "Haladó beállítások" ++ ++msgid "Age" ++msgstr "Kor" ++ ++msgid "Announced DNS servers" ++msgstr "Bejelentett névkiszolgálók" ++ ++msgid "Announced NTP servers" ++msgstr "Bejelentett NTP kiszolgálók" ++ ++msgid "Announced prefixes" ++msgstr "Bejelentett elÅ‘tagok" ++ ++msgid "Collecting data..." ++msgstr "Adatok összegyűjtése..." ++ ++msgid "Forwarder" ++msgstr "Továbbító" ++ ++msgid "General Setup" ++msgstr "Ãltalános beállítások" ++ ++msgid "IPv4 and IPv6" ++msgstr "IPv4 és IPv6" ++ ++msgid "IPv4 only" ++msgstr "csak IPv4" ++ ++msgid "IPv6 only" ++msgstr "csak IPv6" ++ ++msgid "Lease directory" ++msgstr "Bérlet könytár" ++ ++msgid "Lease validity time" ++msgstr "Bérlet érvényességi ideje" ++ ++msgid "Log file" ++msgstr "Napló fájl" ++ ++msgid "Multicast address" ++msgstr "Multicast cím" ++ ++msgid "Operation mode" ++msgstr "Működési mód" ++ ++msgid "Port" ++msgstr "Port" ++ ++msgid "Protocol family" ++msgstr "Protokoll család" ++ ++msgid "Served interfaces" ++msgstr "Kiszolgált interfészek" ++ ++msgid "Server" ++msgstr "Kiszolgáló" ++ ++msgid "Specifies the announced IPv4 and IPv6 NTP servers" ++msgstr "A bejelentett IPv4 és IPv6 NTP kiszolgálók részletezése" ++ ++msgid "Specifies the announced IPv4 and IPv6 name servers" ++msgstr "A bejelentett IPv4 és IPv6 névkiszolgálók részletezése" ++ ++msgid "Specifies the announced IPv4 and IPv6 network prefixes in CIDR notation" ++msgstr "" ++"A bejelentett IPv4 és IPv6 hálózati elÅ‘tagok részletezése CIDR jelölésben" ++ ++msgid "The AHCP Service is not running." ++msgstr "Az AHCP szolgáltatás nem fut" ++ ++msgid "The AHCP Service is running with ID %s." ++msgstr "Az AHCP szolgáltatás fut, azonosítója:%s." ++ ++msgid "There are no active leases." ++msgstr "Nincsenek aktív bérletek." ++ ++msgid "Unique ID file" ++msgstr "Egyedi azonosító fájl" +diff --git a/feeds/luci/applications/luci-app-ahcp/po/it/ahcp.po b/feeds/luci/applications/luci-app-ahcp/po/it/ahcp.po +new file mode 100644 +index 0000000..56d9516 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-ahcp/po/it/ahcp.po +@@ -0,0 +1,114 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"PO-Revision-Date: 2013-02-03 12:53+0200\n" ++"Last-Translator: Francesco <3gasas@gmail.com>\n" ++"Language-Team: none\n" ++"Language: it\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n != 1);\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "AHCP Server" ++msgstr "Server AHCP" ++ ++#, fuzzy ++msgid "" ++"AHCP is an autoconfiguration protocol for IPv6 and dual-stack IPv6/IPv4 " ++"networks designed to be used in place of router discovery or DHCP on " ++"networks where it is difficult or impossible to configure a server within " ++"every link-layer broadcast domain, for example mobile ad-hoc networks." ++msgstr "" ++"AHCP è un protocollo di configurazione automatica per reti IPv6 e dual-stack " ++"IPv6/IPv4 progettato per essere usato al posto del router discovery e DHCP " ++"su reti dove è difficile o impossibile configurare un server all'interno di " ++"ogni dominio di broadcast, per esempio reti ad-hoc mobili." ++ ++msgid "Active AHCP Leases" ++msgstr "Lease AHCP Attivi" ++ ++msgid "Address" ++msgstr "Indirizzo" ++ ++msgid "Advanced Settings" ++msgstr "Impostazioni Avanzate" ++ ++msgid "Age" ++msgstr "Età" ++ ++msgid "Announced DNS servers" ++msgstr "Server DNS indicati" ++ ++msgid "Announced NTP servers" ++msgstr "Server NTP indicati" ++ ++msgid "Announced prefixes" ++msgstr "Prefissi indicati" ++ ++msgid "Collecting data..." ++msgstr "Raccolta dei dati..." ++ ++msgid "Forwarder" ++msgstr "Mittente" ++ ++msgid "General Setup" ++msgstr "Setup Generale" ++ ++msgid "IPv4 and IPv6" ++msgstr "IPv4 e IPv6" ++ ++msgid "IPv4 only" ++msgstr "Solo IPv4" ++ ++msgid "IPv6 only" ++msgstr "Solo IPv6" ++ ++msgid "Lease directory" ++msgstr "Directory di Lease" ++ ++msgid "Lease validity time" ++msgstr "Tempo di validità del Lease" ++ ++msgid "Log file" ++msgstr "File di log" ++ ++msgid "Multicast address" ++msgstr "Indirizzo Multicast" ++ ++msgid "Operation mode" ++msgstr "Modalità di funzionamento" ++ ++msgid "Port" ++msgstr "Porta" ++ ++msgid "Protocol family" ++msgstr "Protocollo famiglia" ++ ++msgid "Served interfaces" ++msgstr "Interfacce servite" ++ ++msgid "Server" ++msgstr "Server" ++ ++msgid "Specifies the announced IPv4 and IPv6 NTP servers" ++msgstr "Specifica i server NTP IPv4 e IPv6 annunciati" ++ ++msgid "Specifies the announced IPv4 and IPv6 name servers" ++msgstr "Specifica il server dei nomi IPv4 e IPv6" ++ ++msgid "Specifies the announced IPv4 and IPv6 network prefixes in CIDR notation" ++msgstr "Specifica i prefissi delle reti IPv4 e IPv6 in notazione CIDR" ++ ++msgid "The AHCP Service is not running." ++msgstr "Il servizio AHCP non è in esecuzione." ++ ++msgid "The AHCP Service is running with ID %s." ++msgstr "Il servizio AHCP è in esecuzione con ID %s." ++ ++msgid "There are no active leases." ++msgstr "Non ci sono leases attivi." ++ ++msgid "Unique ID file" ++msgstr "File degli Unique ID" +diff --git a/feeds/luci/applications/luci-app-ahcp/po/ja/ahcp.po b/feeds/luci/applications/luci-app-ahcp/po/ja/ahcp.po +new file mode 100644 +index 0000000..dd78ccd +--- /dev/null ++++ b/feeds/luci/applications/luci-app-ahcp/po/ja/ahcp.po +@@ -0,0 +1,117 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"PO-Revision-Date: 2012-04-19 07:54+0200\n" ++"Last-Translator: Kentaro \n" ++"Language-Team: none\n" ++"Language: ja\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=1; plural=0;\n" ++"X-Generator: Pootle 2.0.4\n" ++ ++msgid "AHCP Server" ++msgstr "AHCPサーãƒãƒ¼" ++ ++#, fuzzy ++msgid "" ++"AHCP is an autoconfiguration protocol for IPv6 and dual-stack IPv6/IPv4 " ++"networks designed to be used in place of router discovery or DHCP on " ++"networks where it is difficult or impossible to configure a server within " ++"every link-layer broadcast domain, for example mobile ad-hoc networks." ++msgstr "" ++"AHCPã¯IPv6åŠã³IPv6/IPv4デュアルスタックを使用ã™ã‚‹ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ã«ãŠã„ã¦ã€ãƒ«ãƒ¼" ++"ターディスカãƒãƒªã®ä»£ã‚ã‚Šã¨ã—ã¦ä½¿ç”¨ã™ã‚‹ãŸã‚ã«ãƒ‡ã‚¶ã‚¤ãƒ³ã•ã‚ŒãŸè‡ªå‹•è¨­å®šãƒ—ロトコル" ++"ã§ã™ã€‚ã¾ãŸã€AHCPã¯ãƒ¢ãƒã‚¤ãƒ«ãƒ»ã‚¢ãƒ‰ãƒ›ãƒƒã‚¯ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ã®ã‚ˆã†ãªã€ãƒªãƒ³ã‚¯å±¤ã®ãƒ‰ãƒ¡ã‚¤" ++"ンブロードキャスト毎ã«è¨­å®šã‚’è¡Œã†ã“ã¨ãŒå›°é›£ãªãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ã§ã®DHCP機能ã¨ã—ã¦ã‚‚" ++"使用ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚" ++ ++msgid "Active AHCP Leases" ++msgstr "有効ãªAHCPリース" ++ ++msgid "Address" ++msgstr "アドレス" ++ ++msgid "Advanced Settings" ++msgstr "詳細設定" ++ ++msgid "Age" ++msgstr "Age" ++ ++msgid "Announced DNS servers" ++msgstr "通知ã™ã‚‹DNSサーãƒãƒ¼" ++ ++msgid "Announced NTP servers" ++msgstr "通知ã™ã‚‹NTPサーãƒãƒ¼" ++ ++msgid "Announced prefixes" ++msgstr "通知ã™ã‚‹ãƒ—レフィクス" ++ ++msgid "Collecting data..." ++msgstr "データåŽé›†ä¸­ã§ã™..." ++ ++msgid "Forwarder" ++msgstr "転é€" ++ ++msgid "General Setup" ++msgstr "一般設定" ++ ++msgid "IPv4 and IPv6" ++msgstr "IPv4åŠã³IPv6" ++ ++msgid "IPv4 only" ++msgstr "IPv4ã®ã¿" ++ ++msgid "IPv6 only" ++msgstr "IPv6ã®ã¿" ++ ++msgid "Lease directory" ++msgstr "リースファイル・ディレクトリ" ++ ++msgid "Lease validity time" ++msgstr "リース有効時間" ++ ++msgid "Log file" ++msgstr "ログファイル" ++ ++msgid "Multicast address" ++msgstr "マルãƒã‚­ãƒ£ã‚¹ãƒˆã‚¢ãƒ‰ãƒ¬ã‚¹" ++ ++msgid "Operation mode" ++msgstr "動作モード" ++ ++msgid "Port" ++msgstr "ãƒãƒ¼ãƒˆ" ++ ++msgid "Protocol family" ++msgstr "プロトコルファミリ" ++ ++msgid "Served interfaces" ++msgstr "対象インターフェース" ++ ++msgid "Server" ++msgstr "サーãƒãƒ¼" ++ ++msgid "Specifies the announced IPv4 and IPv6 NTP servers" ++msgstr "通知ã™ã‚‹NTPサーãƒãƒ¼ã®IPv4åŠã³IPv6アドレスを設定ã—ã¾ã™" ++ ++msgid "Specifies the announced IPv4 and IPv6 name servers" ++msgstr "通知ã™ã‚‹DNSサーãƒãƒ¼ã®IPv4åŠã³IPv6アドレスを設定ã—ã¾ã™" ++ ++msgid "Specifies the announced IPv4 and IPv6 network prefixes in CIDR notation" ++msgstr "" ++"通知ã™ã‚‹IPv4åŠã³IPv6アドレスã®ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ãƒ»ãƒ—レフィクスをCIDRå½¢å¼ã§è¨­å®šã—ã¾" ++"ã™" ++ ++msgid "The AHCP Service is not running." ++msgstr "AHCP サービスã¯ç¨¼åƒã—ã¦ã„ã¾ã›ã‚“。" ++ ++msgid "The AHCP Service is running with ID %s." ++msgstr "AHCP サービスã¯ç¨¼åƒä¸­ã§ã™ã€‚(ID %s)" ++ ++msgid "There are no active leases." ++msgstr "有効ãªãƒªãƒ¼ã‚¹ã¯ã‚ã‚Šã¾ã›ã‚“。" ++ ++msgid "Unique ID file" ++msgstr "ユニークIDファイル" +diff --git a/feeds/luci/applications/luci-app-ahcp/po/ms/ahcp.po b/feeds/luci/applications/luci-app-ahcp/po/ms/ahcp.po +new file mode 100644 +index 0000000..0b6963b +--- /dev/null ++++ b/feeds/luci/applications/luci-app-ahcp/po/ms/ahcp.po +@@ -0,0 +1,105 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Last-Translator: Automatically generated\n" ++"Language-Team: none\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++ ++msgid "AHCP Server" ++msgstr "" ++ ++msgid "" ++"AHCP is an autoconfiguration protocol for IPv6 and dual-stack IPv6/IPv4 " ++"networks designed to be used in place of router discovery or DHCP on " ++"networks where it is difficult or impossible to configure a server within " ++"every link-layer broadcast domain, for example mobile ad-hoc networks." ++msgstr "" ++ ++msgid "Active AHCP Leases" ++msgstr "" ++ ++msgid "Address" ++msgstr "" ++ ++msgid "Advanced Settings" ++msgstr "" ++ ++msgid "Age" ++msgstr "" ++ ++msgid "Announced DNS servers" ++msgstr "" ++ ++msgid "Announced NTP servers" ++msgstr "" ++ ++msgid "Announced prefixes" ++msgstr "" ++ ++msgid "Collecting data..." ++msgstr "" ++ ++msgid "Forwarder" ++msgstr "" ++ ++msgid "General Setup" ++msgstr "" ++ ++msgid "IPv4 and IPv6" ++msgstr "" ++ ++msgid "IPv4 only" ++msgstr "" ++ ++msgid "IPv6 only" ++msgstr "" ++ ++msgid "Lease directory" ++msgstr "" ++ ++msgid "Lease validity time" ++msgstr "" ++ ++msgid "Log file" ++msgstr "" ++ ++msgid "Multicast address" ++msgstr "" ++ ++msgid "Operation mode" ++msgstr "" ++ ++msgid "Port" ++msgstr "" ++ ++msgid "Protocol family" ++msgstr "" ++ ++msgid "Served interfaces" ++msgstr "" ++ ++msgid "Server" ++msgstr "" ++ ++msgid "Specifies the announced IPv4 and IPv6 NTP servers" ++msgstr "" ++ ++msgid "Specifies the announced IPv4 and IPv6 name servers" ++msgstr "" ++ ++msgid "Specifies the announced IPv4 and IPv6 network prefixes in CIDR notation" ++msgstr "" ++ ++msgid "The AHCP Service is not running." ++msgstr "" ++ ++msgid "The AHCP Service is running with ID %s." ++msgstr "" ++ ++msgid "There are no active leases." ++msgstr "" ++ ++msgid "Unique ID file" ++msgstr "" +diff --git a/feeds/luci/applications/luci-app-ahcp/po/no/ahcp.po b/feeds/luci/applications/luci-app-ahcp/po/no/ahcp.po +new file mode 100644 +index 0000000..4c3bc03 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-ahcp/po/no/ahcp.po +@@ -0,0 +1,117 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"PO-Revision-Date: 2011-06-14 20:11+0200\n" ++"Last-Translator: protx \n" ++"Language-Team: none\n" ++"Language: no\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n != 1);\n" ++"X-Generator: Pootle 2.0.4\n" ++ ++msgid "AHCP Server" ++msgstr "AHCP Server" ++ ++#, fuzzy ++msgid "" ++"AHCP is an autoconfiguration protocol for IPv6 and dual-stack IPv6/IPv4 " ++"networks designed to be used in place of router discovery or DHCP on " ++"networks where it is difficult or impossible to configure a server within " ++"every link-layer broadcast domain, for example mobile ad-hoc networks." ++msgstr "" ++"AHCP er en autokonfigurasjon protokoll for IPv6, og dual-stack IPv6/IPv4 " ++"nettverk. Det er laget for bruk der DHCP og Ruter oppdagelse er problematisk " ++"eller umulig Ã¥ bruke for hvert link-lags broadcast domene, f.eks. mobile ad-" ++"hoc nettverk." ++ ++msgid "Active AHCP Leases" ++msgstr "Aktive AHCP Leier" ++ ++msgid "Address" ++msgstr "Adresse" ++ ++msgid "Advanced Settings" ++msgstr "Avanserte Innstillinger" ++ ++msgid "Age" ++msgstr "Alder" ++ ++msgid "Announced DNS servers" ++msgstr "Annonserte DNS servere" ++ ++msgid "Announced NTP servers" ++msgstr "Annonserte NTP servere" ++ ++msgid "Announced prefixes" ++msgstr "Annonserte prefikser" ++ ++msgid "Collecting data..." ++msgstr "Henter data..." ++ ++#, fuzzy ++msgid "Forwarder" ++msgstr "Sender" ++ ++msgid "General Setup" ++msgstr "Generelt Oppsett" ++ ++msgid "IPv4 and IPv6" ++msgstr "IPv4 og IPv6" ++ ++msgid "IPv4 only" ++msgstr "Kun IPv4" ++ ++msgid "IPv6 only" ++msgstr "Kun IPv6" ++ ++#, fuzzy ++msgid "Lease directory" ++msgstr "Leie katalog" ++ ++msgid "Lease validity time" ++msgstr "Gyldig leietid" ++ ++msgid "Log file" ++msgstr "Logg fil" ++ ++msgid "Multicast address" ++msgstr "Multicast adresse" ++ ++msgid "Operation mode" ++msgstr "Driftsmodus" ++ ++msgid "Port" ++msgstr "Port" ++ ++msgid "Protocol family" ++msgstr "Protokoll familie" ++ ++#, fuzzy ++msgid "Served interfaces" ++msgstr "Utdelte grensesnitt" ++ ++msgid "Server" ++msgstr "Server" ++ ++msgid "Specifies the announced IPv4 and IPv6 NTP servers" ++msgstr "Angir annonserte IPv4 og IPv6 NTP-servere" ++ ++msgid "Specifies the announced IPv4 and IPv6 name servers" ++msgstr "Angir annonserte IPv4 og IPv6 navnetjenere" ++ ++msgid "Specifies the announced IPv4 and IPv6 network prefixes in CIDR notation" ++msgstr "Angir annonserte IPv4 og IPv6 nettverk prefikser i CIDR-notasjon" ++ ++msgid "The AHCP Service is not running." ++msgstr "" ++ ++msgid "The AHCP Service is running with ID %s." ++msgstr "" ++ ++msgid "There are no active leases." ++msgstr "Det er ingen aktive leieavtaler." ++ ++msgid "Unique ID file" ++msgstr "Unik ID fil" +diff --git a/feeds/luci/applications/luci-app-ahcp/po/pl/ahcp.po b/feeds/luci/applications/luci-app-ahcp/po/pl/ahcp.po +new file mode 100644 +index 0000000..5095224 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-ahcp/po/pl/ahcp.po +@@ -0,0 +1,115 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"PO-Revision-Date: 2012-04-14 16:40+0200\n" ++"Last-Translator: Tomecki \n" ++"Language-Team: none\n" ++"Language: pl\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 " ++"|| n%100>=20) ? 1 : 2);\n" ++"X-Generator: Pootle 2.0.4\n" ++ ++msgid "AHCP Server" ++msgstr "Serwer AHCP" ++ ++#, fuzzy ++msgid "" ++"AHCP is an autoconfiguration protocol for IPv6 and dual-stack IPv6/IPv4 " ++"networks designed to be used in place of router discovery or DHCP on " ++"networks where it is difficult or impossible to configure a server within " ++"every link-layer broadcast domain, for example mobile ad-hoc networks." ++msgstr "" ++"AHCP to protokół automatycznej konfiguracji sieci IPv6 i IPv6/IPv4 " ++"przeznaczone do stosowania zamiast DHCP w sieciach, w których jest trudne " ++"lub wrÄ™cz niemożliwe, aby skonfigurować serwer w każdej warstwie Å‚Ä…cza " ++"domeny rozgÅ‚oszeniowej, na przykÅ‚ad w mobilnych sieciach ad-hoc." ++ ++msgid "Active AHCP Leases" ++msgstr "Aktywne dzierżawy AHCP" ++ ++msgid "Address" ++msgstr "Adres" ++ ++msgid "Advanced Settings" ++msgstr "Ustawienia zaawansowane" ++ ++msgid "Age" ++msgstr "Wiek" ++ ++msgid "Announced DNS servers" ++msgstr "RozgÅ‚aszane serwery DNS" ++ ++msgid "Announced NTP servers" ++msgstr "RozgÅ‚aszane serwery NTP" ++ ++msgid "Announced prefixes" ++msgstr "RozgÅ‚aszane prefiksy" ++ ++msgid "Collecting data..." ++msgstr "Zbieranie informacji..." ++ ++msgid "Forwarder" ++msgstr "Przekierowanie" ++ ++msgid "General Setup" ++msgstr "Ustawienia podstawowe" ++ ++msgid "IPv4 and IPv6" ++msgstr "IPv4 oraz IPv6" ++ ++msgid "IPv4 only" ++msgstr "Tylko IPv4" ++ ++msgid "IPv6 only" ++msgstr "Tylko IPv6" ++ ++msgid "Lease directory" ++msgstr "Katalog dzierżaw" ++ ++msgid "Lease validity time" ++msgstr "Czas dzierżawy" ++ ++msgid "Log file" ++msgstr "Plik dziennika" ++ ++msgid "Multicast address" ++msgstr "Adres Multicast" ++ ++msgid "Operation mode" ++msgstr "Tryb pracy" ++ ++msgid "Port" ++msgstr "Port" ++ ++msgid "Protocol family" ++msgstr "Rodzina protokołów" ++ ++msgid "Served interfaces" ++msgstr "UdostÄ™pniane interfejsy" ++ ++msgid "Server" ++msgstr "Serwer" ++ ++msgid "Specifies the announced IPv4 and IPv6 NTP servers" ++msgstr "OkreÅ›la rozgÅ‚aszane adresy IPv4/6 serwerów NTP" ++ ++msgid "Specifies the announced IPv4 and IPv6 name servers" ++msgstr "OkreÅ›la rozgÅ‚aszane adresy IPv4/6 serwerów nazw" ++ ++msgid "Specifies the announced IPv4 and IPv6 network prefixes in CIDR notation" ++msgstr "OkreÅ›la rozgÅ‚aszane prefiksy sieciowe w notacji CIDR" ++ ++msgid "The AHCP Service is not running." ++msgstr "UsÅ‚uga AHCP nie jest uruchomiona." ++ ++msgid "The AHCP Service is running with ID %s." ++msgstr "UsÅ‚uga AHCP jest uruchomiona z ID %s." ++ ++msgid "There are no active leases." ++msgstr "Nie ma aktywnych dzierżaw." ++ ++msgid "Unique ID file" ++msgstr "Unikalny plik ID" +diff --git a/feeds/luci/applications/luci-app-ahcp/po/pt-br/ahcp.po b/feeds/luci/applications/luci-app-ahcp/po/pt-br/ahcp.po +new file mode 100644 +index 0000000..55ec29c +--- /dev/null ++++ b/feeds/luci/applications/luci-app-ahcp/po/pt-br/ahcp.po +@@ -0,0 +1,115 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"PO-Revision-Date: 2014-03-29 23:07+0200\n" ++"Last-Translator: Luiz Angelo \n" ++"Language-Team: none\n" ++"Language: pt_BR\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n > 1);\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "AHCP Server" ++msgstr "Servidor AHCP" ++ ++#, fuzzy ++msgid "" ++"AHCP is an autoconfiguration protocol for IPv6 and dual-stack IPv6/IPv4 " ++"networks designed to be used in place of router discovery or DHCP on " ++"networks where it is difficult or impossible to configure a server within " ++"every link-layer broadcast domain, for example mobile ad-hoc networks." ++msgstr "" ++"AHCP é um protocolo de autoconfiguração para redes IPv6 ou IPv6/IPv4 " ++"projetado para ser usado no lugar da \"descoberta de roteador\" ou DHCP em " ++"redes onde é difícil ou impossível configurar um servidor em cada camada de " ++"enlace de domínio de broadcast, como exemplo as redes móvel ad-hoc." ++ ++msgid "Active AHCP Leases" ++msgstr "Alocações AHCP Ativas" ++ ++msgid "Address" ++msgstr "Endereço" ++ ++msgid "Advanced Settings" ++msgstr "Configurações Avançadas" ++ ++msgid "Age" ++msgstr "Tempo de vida" ++ ++msgid "Announced DNS servers" ++msgstr "Servidores DNS anunciados" ++ ++msgid "Announced NTP servers" ++msgstr "Servidores NTP anunciados" ++ ++msgid "Announced prefixes" ++msgstr "Prefixos anunciados" ++ ++msgid "Collecting data..." ++msgstr "Coletando dados..." ++ ++msgid "Forwarder" ++msgstr "Forwarder" ++ ++msgid "General Setup" ++msgstr "Configurações Gerais" ++ ++msgid "IPv4 and IPv6" ++msgstr "IPv4 e IPv6" ++ ++msgid "IPv4 only" ++msgstr "Apenas IPv4" ++ ++msgid "IPv6 only" ++msgstr "Apenas IPv6" ++ ++msgid "Lease directory" ++msgstr "Diretório de atribuições" ++ ++msgid "Lease validity time" ++msgstr "Tempo de validade da atribuição" ++ ++msgid "Log file" ++msgstr "Arquivo de registro" ++ ++msgid "Multicast address" ++msgstr "Endereço multicast" ++ ++msgid "Operation mode" ++msgstr "Modo de operação" ++ ++msgid "Port" ++msgstr "Porta" ++ ++msgid "Protocol family" ++msgstr "Família de protocolos" ++ ++msgid "Served interfaces" ++msgstr "Interfaces configuradas" ++ ++msgid "Server" ++msgstr "Servidor" ++ ++msgid "Specifies the announced IPv4 and IPv6 NTP servers" ++msgstr "Especifica os servidores NTP IPv4 e IPv6 anunciados" ++ ++msgid "Specifies the announced IPv4 and IPv6 name servers" ++msgstr "Especifica os servidores de nomes IPv4 e IPv6 anunciados" ++ ++msgid "Specifies the announced IPv4 and IPv6 network prefixes in CIDR notation" ++msgstr "" ++"Especifica os prefixos de rede IPv4 e IPv6, em notação CIDR, anunciados" ++ ++msgid "The AHCP Service is not running." ++msgstr "O serviço AHCP está parado" ++ ++msgid "The AHCP Service is running with ID %s." ++msgstr "O serviço AHCP esta executando com o ID %s." ++ ++msgid "There are no active leases." ++msgstr "Não existe alocações ativas." ++ ++msgid "Unique ID file" ++msgstr "Arquivo de identificador único" +diff --git a/feeds/luci/applications/luci-app-ahcp/po/pt/ahcp.po b/feeds/luci/applications/luci-app-ahcp/po/pt/ahcp.po +new file mode 100644 +index 0000000..f96fc45 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-ahcp/po/pt/ahcp.po +@@ -0,0 +1,116 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"PO-Revision-Date: 2013-06-02 21:12+0200\n" ++"Last-Translator: joao.f.vieira \n" ++"Language-Team: none\n" ++"Language: pt\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n != 1);\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "AHCP Server" ++msgstr "Servidor AHCP" ++ ++#, fuzzy ++msgid "" ++"AHCP is an autoconfiguration protocol for IPv6 and dual-stack IPv6/IPv4 " ++"networks designed to be used in place of router discovery or DHCP on " ++"networks where it is difficult or impossible to configure a server within " ++"every link-layer broadcast domain, for example mobile ad-hoc networks." ++msgstr "" ++"O AHCP é um protocolo de auto-configuração para redes IPv6 e IPv6/IPv4 dual-" ++"stack foi desenhado para ser usado no lugar do router discovery e DHCP nas " ++"redes onde é difícil ou impossível configurar o servidor dentro de cada " ++"camada de ligação no dominio de broadcast, por exemplo, redes ad-hoc móveis." ++ ++msgid "Active AHCP Leases" ++msgstr "Concessões AHCP Ativas" ++ ++msgid "Address" ++msgstr "Endereço" ++ ++msgid "Advanced Settings" ++msgstr "Definições Avançadas" ++ ++msgid "Age" ++msgstr "Idade" ++ ++msgid "Announced DNS servers" ++msgstr "Servidores DNS anunciados" ++ ++msgid "Announced NTP servers" ++msgstr "Servidores NTP anunciados" ++ ++msgid "Announced prefixes" ++msgstr "Prefixos anunciados" ++ ++msgid "Collecting data..." ++msgstr "A obter dados..." ++ ++msgid "Forwarder" ++msgstr "Encaminhador" ++ ++msgid "General Setup" ++msgstr "Configuração Geral" ++ ++msgid "IPv4 and IPv6" ++msgstr "IPv4 e IPv6" ++ ++msgid "IPv4 only" ++msgstr "Só IPv4" ++ ++msgid "IPv6 only" ++msgstr "Só IPv6" ++ ++msgid "Lease directory" ++msgstr "Directório de concessões" ++ ++msgid "Lease validity time" ++msgstr "Prazo de validade das concessões" ++ ++msgid "Log file" ++msgstr "Ficheiro log" ++ ++msgid "Multicast address" ++msgstr "Endereço de multicast" ++ ++msgid "Operation mode" ++msgstr "Modo de operação" ++ ++msgid "Port" ++msgstr "Porta" ++ ++msgid "Protocol family" ++msgstr "Família do protocolo" ++ ++msgid "Served interfaces" ++msgstr "Interfaces servidas" ++ ++msgid "Server" ++msgstr "Servidor" ++ ++msgid "Specifies the announced IPv4 and IPv6 NTP servers" ++msgstr "Especifica os servidores NTP anunciados em IPv4 e IPv6" ++ ++msgid "Specifies the announced IPv4 and IPv6 name servers" ++msgstr "Especifica os servidores de nomes anunciados em IPv4 e IPv6" ++ ++msgid "Specifies the announced IPv4 and IPv6 network prefixes in CIDR notation" ++msgstr "" ++"Especifica os prefixos de rede na notação CIDR a serem anunciados em IPv4 e " ++"IPv6" ++ ++msgid "The AHCP Service is not running." ++msgstr "O serviço AHCP não está a correr." ++ ++msgid "The AHCP Service is running with ID %s." ++msgstr "O serviço AHCP está a correr com o ID %s" ++ ++msgid "There are no active leases." ++msgstr "Não existem concessões activas." ++ ++msgid "Unique ID file" ++msgstr "Ficheiro de ID único" +diff --git a/feeds/luci/applications/luci-app-ahcp/po/ro/ahcp.po b/feeds/luci/applications/luci-app-ahcp/po/ro/ahcp.po +new file mode 100644 +index 0000000..2882b31 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-ahcp/po/ro/ahcp.po +@@ -0,0 +1,115 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"PO-Revision-Date: 2014-06-28 19:14+0200\n" ++"Last-Translator: xxvirusxx \n" ++"Language-Team: none\n" ++"Language: ro\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=3; plural=(n==1 ? 0 : (n==0 || (n%100 > 0 && n%100 < " ++"20)) ? 1 : 2);;\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "AHCP Server" ++msgstr "Server AHCP" ++ ++#, fuzzy ++msgid "" ++"AHCP is an autoconfiguration protocol for IPv6 and dual-stack IPv6/IPv4 " ++"networks designed to be used in place of router discovery or DHCP on " ++"networks where it is difficult or impossible to configure a server within " ++"every link-layer broadcast domain, for example mobile ad-hoc networks." ++msgstr "" ++"AHCP este un protocol de autoconfigurare pentru IPv6 si IPv4 menit sa " ++"inlocuie \"router discovery\" si DHCP in retele unde este dificil de " ++"configurat un server pentru fiecare domeniu de broadcast pe fiecare " ++"legatura, de exemplu pentru retele mobile ad-hoc." ++ ++msgid "Active AHCP Leases" ++msgstr "Conexiuni active AHCP" ++ ++msgid "Address" ++msgstr "Adresă" ++ ++msgid "Advanced Settings" ++msgstr "Setări avansate" ++ ++msgid "Age" ++msgstr "Vârstă" ++ ++msgid "Announced DNS servers" ++msgstr "Servere DNS anuntate" ++ ++msgid "Announced NTP servers" ++msgstr "Servere NTP anuntate" ++ ++msgid "Announced prefixes" ++msgstr "Prefixe anuntate" ++ ++msgid "Collecting data..." ++msgstr "Colectare date.." ++ ++msgid "Forwarder" ++msgstr "Forwarder" ++ ++msgid "General Setup" ++msgstr "Configurare generala" ++ ++msgid "IPv4 and IPv6" ++msgstr "IPv4 si IPv6" ++ ++msgid "IPv4 only" ++msgstr "Doar IPv4 " ++ ++msgid "IPv6 only" ++msgstr "Doar IPv6 " ++ ++msgid "Lease directory" ++msgstr "Director de conexiuni" ++ ++msgid "Lease validity time" ++msgstr "Timpul pentru conexiuni valide" ++ ++msgid "Log file" ++msgstr "Fisier log" ++ ++msgid "Multicast address" ++msgstr "Adresa multicast" ++ ++msgid "Operation mode" ++msgstr "Modul de operare" ++ ++msgid "Port" ++msgstr "Port" ++ ++msgid "Protocol family" ++msgstr "Familia de protocol" ++ ++msgid "Served interfaces" ++msgstr "Interfetele servite" ++ ++msgid "Server" ++msgstr "Server" ++ ++msgid "Specifies the announced IPv4 and IPv6 NTP servers" ++msgstr "Specifica serverele de NTP IPv4 si IPv6 anuntate" ++ ++msgid "Specifies the announced IPv4 and IPv6 name servers" ++msgstr "Specifica serverele de DNS IPv4 si IPv6 anuntate" ++ ++msgid "Specifies the announced IPv4 and IPv6 network prefixes in CIDR notation" ++msgstr "Specifica prefixele IPv4 si IPv6 anuntate in format CIDR" ++ ++msgid "The AHCP Service is not running." ++msgstr "Serviciul AHCP nu ruleaza" ++ ++msgid "The AHCP Service is running with ID %s." ++msgstr "Serviciul AHCP nu ruleaza cu ID %s." ++ ++msgid "There are no active leases." ++msgstr "Nu exista conexiuni active." ++ ++msgid "Unique ID file" ++msgstr "ID de fisier unic" +diff --git a/feeds/luci/applications/luci-app-ahcp/po/ru/ahcp.po b/feeds/luci/applications/luci-app-ahcp/po/ru/ahcp.po +new file mode 100644 +index 0000000..f08cb70 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-ahcp/po/ru/ahcp.po +@@ -0,0 +1,120 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: LuCI: ahcp\n" ++"POT-Creation-Date: \n" ++"PO-Revision-Date: 2013-09-05 15:29+0200\n" ++"Last-Translator: datasheet \n" ++"Language-Team: Russian \n" ++"Language: ru\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%" ++"10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" ++"X-Generator: Pootle 2.0.6\n" ++"X-Poedit-SourceCharset: UTF-8\n" ++ ++# Ad-Hoc Configuration Protocol - протокол автоматичеÑкой конфигурации IPv6 и Ñетей IPv6/IPv4 двойного Ñтека ++msgid "AHCP Server" ++msgstr "AHCP-Ñервер" ++ ++#, fuzzy ++msgid "" ++"AHCP is an autoconfiguration protocol for IPv6 and dual-stack IPv6/IPv4 " ++"networks designed to be used in place of router discovery or DHCP on " ++"networks where it is difficult or impossible to configure a server within " ++"every link-layer broadcast domain, for example mobile ad-hoc networks." ++msgstr "" ++"AHCP - Ñто протокол автоматичеÑкой конфигурации Ñетей IPv6 и IPv6/IPv4, " ++"разработанный Ð´Ð»Ñ Ð¸ÑÐ¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Ð²Ð¼ÐµÑто DHCP и протоколов Ð¾Ð±Ð½Ð°Ñ€ÑƒÐ¶ÐµÐ½Ð¸Ñ " ++"маршрутизаторов в ÑетÑÑ…, где Ñложно или невозможно наÑтроить Ñервер внутри " ++"каждой широковещательной зоны канального уровнÑ, например, в мобильных ad-" ++"hoc ÑетÑÑ…." ++ ++msgid "Active AHCP Leases" ++msgstr "Ðктивные арендованные AHCP-адреÑа" ++ ++msgid "Address" ++msgstr "ÐдреÑ" ++ ++msgid "Advanced Settings" ++msgstr "Дополнительные наÑтройки" ++ ++msgid "Age" ++msgstr "ВозраÑÑ‚" ++ ++msgid "Announced DNS servers" ++msgstr "ÐнонÑируемые DNS-Ñерверы" ++ ++msgid "Announced NTP servers" ++msgstr "ÐнонÑируемые NTP-Ñерверы" ++ ++msgid "Announced prefixes" ++msgstr "ÐнонÑируемые префикÑÑ‹" ++ ++msgid "Collecting data..." ++msgstr "Сбор данных..." ++ ++#, fuzzy ++msgid "Forwarder" ++msgstr "Перенаправление запроÑов" ++ ++msgid "General Setup" ++msgstr "Общие наÑтройки" ++ ++msgid "IPv4 and IPv6" ++msgstr "IPv4 и IPv6" ++ ++msgid "IPv4 only" ++msgstr "Только IPv4" ++ ++msgid "IPv6 only" ++msgstr "Только IPv6" ++ ++msgid "Lease directory" ++msgstr "Ð”Ð¸Ñ€ÐµÐºÑ‚Ð¾Ñ€Ð¸Ñ Ð°Ñ€ÐµÐ½Ð´Ð¾Ð²Ð°Ð½Ð½Ñ‹Ñ… адреÑов" ++ ++msgid "Lease validity time" ++msgstr "Срок дейÑÑ‚Ð²Ð¸Ñ Ð°Ñ€ÐµÐ½Ð´Ñ‹" ++ ++msgid "Log file" ++msgstr "Файл журнала" ++ ++msgid "Multicast address" ++msgstr "Групповой адреÑ" ++ ++msgid "Operation mode" ++msgstr "Режим работы" ++ ++msgid "Port" ++msgstr "Порт" ++ ++msgid "Protocol family" ++msgstr "Протокол" ++ ++msgid "Served interfaces" ++msgstr "ИÑпользуемые интерфейÑÑ‹" ++ ++msgid "Server" ++msgstr "Сервер" ++ ++msgid "Specifies the announced IPv4 and IPv6 NTP servers" ++msgstr "ОпределÑет IPv4 и IPv6 NTP-Ñерверы" ++ ++msgid "Specifies the announced IPv4 and IPv6 name servers" ++msgstr "ОпределÑет IPv4 и IPv6 DNS-Ñерверы" ++ ++msgid "Specifies the announced IPv4 and IPv6 network prefixes in CIDR notation" ++msgstr "ОпределÑет IPv4- и IPv6-префикÑÑ‹ Ñети в нотации CIDR" ++ ++msgid "The AHCP Service is not running." ++msgstr "Служба AHCP не запущена." ++ ++msgid "The AHCP Service is running with ID %s." ++msgstr "Служба AHCP запущена Ñ ID %s." ++ ++msgid "There are no active leases." ++msgstr "Ðет активных арендованных адреÑов." ++ ++msgid "Unique ID file" ++msgstr "Файл уникального идентификатора" +diff --git a/feeds/luci/applications/luci-app-ahcp/po/sk/ahcp.po b/feeds/luci/applications/luci-app-ahcp/po/sk/ahcp.po +new file mode 100644 +index 0000000..b618490 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-ahcp/po/sk/ahcp.po +@@ -0,0 +1,106 @@ ++msgid "" ++msgstr "" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Last-Translator: Automatically generated\n" ++"Language-Team: none\n" ++"MIME-Version: 1.0\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n" ++ ++msgid "AHCP Server" ++msgstr "" ++ ++msgid "" ++"AHCP is an autoconfiguration protocol for IPv6 and dual-stack IPv6/IPv4 " ++"networks designed to be used in place of router discovery or DHCP on " ++"networks where it is difficult or impossible to configure a server within " ++"every link-layer broadcast domain, for example mobile ad-hoc networks." ++msgstr "" ++ ++msgid "Active AHCP Leases" ++msgstr "" ++ ++msgid "Address" ++msgstr "" ++ ++msgid "Advanced Settings" ++msgstr "" ++ ++msgid "Age" ++msgstr "" ++ ++msgid "Announced DNS servers" ++msgstr "" ++ ++msgid "Announced NTP servers" ++msgstr "" ++ ++msgid "Announced prefixes" ++msgstr "" ++ ++msgid "Collecting data..." ++msgstr "" ++ ++msgid "Forwarder" ++msgstr "" ++ ++msgid "General Setup" ++msgstr "" ++ ++msgid "IPv4 and IPv6" ++msgstr "" ++ ++msgid "IPv4 only" ++msgstr "" ++ ++msgid "IPv6 only" ++msgstr "" ++ ++msgid "Lease directory" ++msgstr "" ++ ++msgid "Lease validity time" ++msgstr "" ++ ++msgid "Log file" ++msgstr "" ++ ++msgid "Multicast address" ++msgstr "" ++ ++msgid "Operation mode" ++msgstr "" ++ ++msgid "Port" ++msgstr "" ++ ++msgid "Protocol family" ++msgstr "" ++ ++msgid "Served interfaces" ++msgstr "" ++ ++msgid "Server" ++msgstr "" ++ ++msgid "Specifies the announced IPv4 and IPv6 NTP servers" ++msgstr "" ++ ++msgid "Specifies the announced IPv4 and IPv6 name servers" ++msgstr "" ++ ++msgid "Specifies the announced IPv4 and IPv6 network prefixes in CIDR notation" ++msgstr "" ++ ++msgid "The AHCP Service is not running." ++msgstr "" ++ ++msgid "The AHCP Service is running with ID %s." ++msgstr "" ++ ++msgid "There are no active leases." ++msgstr "" ++ ++msgid "Unique ID file" ++msgstr "" +diff --git a/feeds/luci/applications/luci-app-ahcp/po/sv/ahcp.po b/feeds/luci/applications/luci-app-ahcp/po/sv/ahcp.po +new file mode 100644 +index 0000000..b5f0b7d +--- /dev/null ++++ b/feeds/luci/applications/luci-app-ahcp/po/sv/ahcp.po +@@ -0,0 +1,109 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"PO-Revision-Date: 2014-04-27 22:52+0200\n" ++"Last-Translator: Umeaboy \n" ++"Language-Team: none\n" ++"Language: sv\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n != 1);\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "AHCP Server" ++msgstr "AHCP-server" ++ ++msgid "" ++"AHCP is an autoconfiguration protocol for IPv6 and dual-stack IPv6/IPv4 " ++"networks designed to be used in place of router discovery or DHCP on " ++"networks where it is difficult or impossible to configure a server within " ++"every link-layer broadcast domain, for example mobile ad-hoc networks." ++msgstr "" ++ ++msgid "Active AHCP Leases" ++msgstr "" ++ ++msgid "Address" ++msgstr "Adress" ++ ++msgid "Advanced Settings" ++msgstr "Avancerade inställningar" ++ ++msgid "Age" ++msgstr "Ã…lder" ++ ++msgid "Announced DNS servers" ++msgstr "Aviserade DNS-servrar" ++ ++msgid "Announced NTP servers" ++msgstr "Aviserade NTP-servrar" ++ ++msgid "Announced prefixes" ++msgstr "" ++ ++msgid "Collecting data..." ++msgstr "Samlar in data..." ++ ++msgid "Forwarder" ++msgstr "" ++ ++msgid "General Setup" ++msgstr "Allmän inställning" ++ ++msgid "IPv4 and IPv6" ++msgstr "IPv4 och IPv6" ++ ++msgid "IPv4 only" ++msgstr "Endast IPv4" ++ ++msgid "IPv6 only" ++msgstr "Endast IPv6" ++ ++msgid "Lease directory" ++msgstr "" ++ ++msgid "Lease validity time" ++msgstr "" ++ ++msgid "Log file" ++msgstr "Logg-fil" ++ ++msgid "Multicast address" ++msgstr "" ++ ++msgid "Operation mode" ++msgstr "Driftsläge" ++ ++msgid "Port" ++msgstr "Port" ++ ++msgid "Protocol family" ++msgstr "Protokoll-familj" ++ ++msgid "Served interfaces" ++msgstr "" ++ ++msgid "Server" ++msgstr "Server" ++ ++msgid "Specifies the announced IPv4 and IPv6 NTP servers" ++msgstr "Specificerar de aviserade IPv4 och IPv6 NTP-servrarna" ++ ++msgid "Specifies the announced IPv4 and IPv6 name servers" ++msgstr "Specificerar de aviserade IPv4 och IPv6 namn-servrarna" ++ ++msgid "Specifies the announced IPv4 and IPv6 network prefixes in CIDR notation" ++msgstr "" ++ ++msgid "The AHCP Service is not running." ++msgstr "AHCP-tjänsten körs inte." ++ ++msgid "The AHCP Service is running with ID %s." ++msgstr "" ++ ++msgid "There are no active leases." ++msgstr "" ++ ++msgid "Unique ID file" ++msgstr "Unik ID-fil" +diff --git a/feeds/luci/applications/luci-app-ahcp/po/templates/ahcp.pot b/feeds/luci/applications/luci-app-ahcp/po/templates/ahcp.pot +new file mode 100644 +index 0000000..ea6bb42 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-ahcp/po/templates/ahcp.pot +@@ -0,0 +1,99 @@ ++msgid "" ++msgstr "Content-Type: text/plain; charset=UTF-8" ++ ++msgid "AHCP Server" ++msgstr "" ++ ++msgid "" ++"AHCP is an autoconfiguration protocol for IPv6 and dual-stack IPv6/IPv4 " ++"networks designed to be used in place of router discovery or DHCP on " ++"networks where it is difficult or impossible to configure a server within " ++"every link-layer broadcast domain, for example mobile ad-hoc networks." ++msgstr "" ++ ++msgid "Active AHCP Leases" ++msgstr "" ++ ++msgid "Address" ++msgstr "" ++ ++msgid "Advanced Settings" ++msgstr "" ++ ++msgid "Age" ++msgstr "" ++ ++msgid "Announced DNS servers" ++msgstr "" ++ ++msgid "Announced NTP servers" ++msgstr "" ++ ++msgid "Announced prefixes" ++msgstr "" ++ ++msgid "Collecting data..." ++msgstr "" ++ ++msgid "Forwarder" ++msgstr "" ++ ++msgid "General Setup" ++msgstr "" ++ ++msgid "IPv4 and IPv6" ++msgstr "" ++ ++msgid "IPv4 only" ++msgstr "" ++ ++msgid "IPv6 only" ++msgstr "" ++ ++msgid "Lease directory" ++msgstr "" ++ ++msgid "Lease validity time" ++msgstr "" ++ ++msgid "Log file" ++msgstr "" ++ ++msgid "Multicast address" ++msgstr "" ++ ++msgid "Operation mode" ++msgstr "" ++ ++msgid "Port" ++msgstr "" ++ ++msgid "Protocol family" ++msgstr "" ++ ++msgid "Served interfaces" ++msgstr "" ++ ++msgid "Server" ++msgstr "" ++ ++msgid "Specifies the announced IPv4 and IPv6 NTP servers" ++msgstr "" ++ ++msgid "Specifies the announced IPv4 and IPv6 name servers" ++msgstr "" ++ ++msgid "Specifies the announced IPv4 and IPv6 network prefixes in CIDR notation" ++msgstr "" ++ ++msgid "The AHCP Service is not running." ++msgstr "" ++ ++msgid "The AHCP Service is running with ID %s." ++msgstr "" ++ ++msgid "There are no active leases." ++msgstr "" ++ ++msgid "Unique ID file" ++msgstr "" +diff --git a/feeds/luci/applications/luci-app-ahcp/po/tr/ahcp.po b/feeds/luci/applications/luci-app-ahcp/po/tr/ahcp.po +new file mode 100644 +index 0000000..ca33071 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-ahcp/po/tr/ahcp.po +@@ -0,0 +1,113 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"PO-Revision-Date: 2013-11-25 14:51+0200\n" ++"Last-Translator: qbilay \n" ++"Language-Team: none\n" ++"Language: tr\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=1; plural=0;\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "AHCP Server" ++msgstr "AHCP Sunucusu" ++ ++#, fuzzy ++msgid "" ++"AHCP is an autoconfiguration protocol for IPv6 and dual-stack IPv6/IPv4 " ++"networks designed to be used in place of router discovery or DHCP on " ++"networks where it is difficult or impossible to configure a server within " ++"every link-layer broadcast domain, for example mobile ad-hoc networks." ++msgstr "" ++"AHCP bir IPv6 ve IPv4/IPv6 çift aÄŸ için otomatik yapılandırma protokolüdür. " ++"Yönlendirici Bildirimleri ve DHCP sunucuları geçici olarak yerine dağıtılmış " ++"aÄŸlar için tasarlanmıştır." ++ ++msgid "Active AHCP Leases" ++msgstr "Aktif ACHP Kiralamaları" ++ ++msgid "Address" ++msgstr "Adres" ++ ++msgid "Advanced Settings" ++msgstr "GeliÅŸmiÅŸ Ayarlar" ++ ++msgid "Age" ++msgstr "YaÅŸ" ++ ++msgid "Announced DNS servers" ++msgstr "" ++ ++msgid "Announced NTP servers" ++msgstr "" ++ ++msgid "Announced prefixes" ++msgstr "" ++ ++msgid "Collecting data..." ++msgstr "Veriler toplanıyor..." ++ ++msgid "Forwarder" ++msgstr "" ++ ++msgid "General Setup" ++msgstr "Genel Ayarlar" ++ ++msgid "IPv4 and IPv6" ++msgstr "IPv4 ve IPv6" ++ ++msgid "IPv4 only" ++msgstr "Sadece IPv4" ++ ++msgid "IPv6 only" ++msgstr "Sadece IPv6" ++ ++msgid "Lease directory" ++msgstr "Kiralama Dizini" ++ ++msgid "Lease validity time" ++msgstr "Kiralama Geçerlilik Süresi" ++ ++msgid "Log file" ++msgstr "Kayıt Dosyası" ++ ++msgid "Multicast address" ++msgstr "" ++ ++msgid "Operation mode" ++msgstr "Çalışma Modu" ++ ++msgid "Port" ++msgstr "Port" ++ ++msgid "Protocol family" ++msgstr "Protokol Ailesi" ++ ++msgid "Served interfaces" ++msgstr "Sunucu Arayüzleri" ++ ++msgid "Server" ++msgstr "Sunucu" ++ ++msgid "Specifies the announced IPv4 and IPv6 NTP servers" ++msgstr "" ++ ++msgid "Specifies the announced IPv4 and IPv6 name servers" ++msgstr "" ++ ++msgid "Specifies the announced IPv4 and IPv6 network prefixes in CIDR notation" ++msgstr "" ++ ++msgid "The AHCP Service is not running." ++msgstr " AHCP Hizmeti Çalışmıyor" ++ ++msgid "The AHCP Service is running with ID %s." ++msgstr " AHCP Hizmeti ID %ile çalışıyor" ++ ++msgid "There are no active leases." ++msgstr "Aktif Kiralama Yok" ++ ++msgid "Unique ID file" ++msgstr "Benzersiz ID Dosyası" +diff --git a/feeds/luci/applications/luci-app-ahcp/po/uk/ahcp.po b/feeds/luci/applications/luci-app-ahcp/po/uk/ahcp.po +new file mode 100644 +index 0000000..7649019 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-ahcp/po/uk/ahcp.po +@@ -0,0 +1,115 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"PO-Revision-Date: 2012-04-28 21:17+0200\n" ++"Last-Translator: Yurii \n" ++"Language-Team: none\n" ++"Language: uk\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%" ++"10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "AHCP Server" ++msgstr "Сервер AHCP" ++ ++#, fuzzy ++msgid "" ++"AHCP is an autoconfiguration protocol for IPv6 and dual-stack IPv6/IPv4 " ++"networks designed to be used in place of router discovery or DHCP on " ++"networks where it is difficult or impossible to configure a server within " ++"every link-layer broadcast domain, for example mobile ad-hoc networks." ++msgstr "" ++"AHCP Ñ” протоколом автоматичної конфігурації мереж IPv6 та IPv6/IPv4, що " ++"разраблений Ð´Ð»Ñ Ð²Ð¸ÐºÐ¾Ñ€Ð¸ÑÑ‚Ð°Ð½Ð½Ñ Ð·Ð°Ð¼Ñ–ÑÑ‚ÑŒ DHCP. Ðаприклад, він викориÑтовуєтьÑÑ Ñƒ " ++"Ñтільникових ad-hoc мережах." ++ ++msgid "Active AHCP Leases" ++msgstr "Ðктивні оренди AHCP" ++ ++msgid "Address" ++msgstr "ÐдреÑа" ++ ++msgid "Advanced Settings" ++msgstr "Додаткові параметри" ++ ++msgid "Age" ++msgstr "Вік" ++ ++msgid "Announced DNS servers" ++msgstr "Оголошені DNS-Ñервери" ++ ++msgid "Announced NTP servers" ++msgstr "Оголошені NTP-Ñервери" ++ ++msgid "Announced prefixes" ++msgstr "Оголошені префікÑи" ++ ++msgid "Collecting data..." ++msgstr "Ð—Ð±Ð¸Ñ€Ð°Ð½Ð½Ñ Ð´Ð°Ð½Ð¸Ñ…..." ++ ++msgid "Forwarder" ++msgstr "СпрÑмовувач" ++ ++msgid "General Setup" ++msgstr "Загальні параметри" ++ ++msgid "IPv4 and IPv6" ++msgstr "IPv4 та IPv6" ++ ++msgid "IPv4 only" ++msgstr "Тільки IPv4" ++ ++msgid "IPv6 only" ++msgstr "Тільки IPv6" ++ ++msgid "Lease directory" ++msgstr "Каталог оренд" ++ ++msgid "Lease validity time" ++msgstr "Термін дії оренди" ++ ++msgid "Log file" ++msgstr "Файл журналу" ++ ++msgid "Multicast address" ++msgstr "Групова адреÑа" ++ ++msgid "Operation mode" ++msgstr "Режим роботи" ++ ++msgid "Port" ++msgstr "Порт" ++ ++msgid "Protocol family" ++msgstr "Протокол" ++ ++msgid "Served interfaces" ++msgstr "ІнтерфейÑи, Ñкі обÑлуговуютьÑÑ" ++ ++msgid "Server" ++msgstr "Сервер" ++ ++msgid "Specifies the announced IPv4 and IPv6 NTP servers" ++msgstr "ДозволÑÑ” вказати оголошувані IPv4 та IPv6 NTP-Ñервери" ++ ++msgid "Specifies the announced IPv4 and IPv6 name servers" ++msgstr "ДозволÑÑ” вказати оголошувані IPv4 та IPv6 DNS-Ñервери" ++ ++msgid "Specifies the announced IPv4 and IPv6 network prefixes in CIDR notation" ++msgstr "" ++"ДозволÑÑ” вказати оголошувані IPv4 та IPv6 префікÑи мережі в нотації CIDR" ++ ++msgid "The AHCP Service is not running." ++msgstr "Ð¡ÐµÑ€Ð²Ñ–Ñ AHCP не запущено" ++ ++msgid "The AHCP Service is running with ID %s." ++msgstr "Ð¡ÐµÑ€Ð²Ñ–Ñ AHCP запущено з ID %s." ++ ++msgid "There are no active leases." ++msgstr "Ðктивних оренд немає." ++ ++msgid "Unique ID file" ++msgstr "Файл унікальних ідентифікаторів" +diff --git a/feeds/luci/applications/luci-app-ahcp/po/vi/ahcp.po b/feeds/luci/applications/luci-app-ahcp/po/vi/ahcp.po +new file mode 100644 +index 0000000..1041add +--- /dev/null ++++ b/feeds/luci/applications/luci-app-ahcp/po/vi/ahcp.po +@@ -0,0 +1,114 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"PO-Revision-Date: 2013-12-05 04:46+0200\n" ++"Last-Translator: Thành \n" ++"Language-Team: none\n" ++"Language: vi\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=1; plural=0;\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "AHCP Server" ++msgstr "AHCP Server" ++ ++#, fuzzy ++msgid "" ++"AHCP is an autoconfiguration protocol for IPv6 and dual-stack IPv6/IPv4 " ++"networks designed to be used in place of router discovery or DHCP on " ++"networks where it is difficult or impossible to configure a server within " ++"every link-layer broadcast domain, for example mobile ad-hoc networks." ++msgstr "" ++"AHCP là má»™t giao thức tá»± Ä‘á»™ng cấu hình cho IPv6 và mạng IPv6/IPv4 dual-stack " ++"thiết kế để được sá»­ dụng trong địa Ä‘iểm phát hiện router và DHCP trên mạng, " ++"nÆ¡i rất khó hoặc không thể cấu hình má»™t máy chủ trong tất cả các lÄ©nh vá»±c " ++"phát sóng liên kết lá»›p, ví dụ nhÆ° mạng Ad-hoc." ++ ++msgid "Active AHCP Leases" ++msgstr "Kích hoạt thuê AHCP" ++ ++msgid "Address" ++msgstr "Äịa chỉ" ++ ++msgid "Advanced Settings" ++msgstr "Thiết lập nâng cao" ++ ++msgid "Age" ++msgstr "Thá»i gian thuê" ++ ++msgid "Announced DNS servers" ++msgstr "Quảng bá máy chủ DNS" ++ ++msgid "Announced NTP servers" ++msgstr "Quảng bá máy chủ NTP" ++ ++msgid "Announced prefixes" ++msgstr "Quảng bá tiá»n tố" ++ ++msgid "Collecting data..." ++msgstr "Äang kết xuất dữ liệu..." ++ ++msgid "Forwarder" ++msgstr "Chuyển tiếp" ++ ++msgid "General Setup" ++msgstr "Thiết lập chung" ++ ++msgid "IPv4 and IPv6" ++msgstr "IPv4 và IPv6" ++ ++msgid "IPv4 only" ++msgstr "Chỉ IPv4" ++ ++msgid "IPv6 only" ++msgstr "Chỉ IPv6" ++ ++msgid "Lease directory" ++msgstr "ThÆ° mục cho thuê" ++ ++msgid "Lease validity time" ++msgstr "Thá»i gian cho thuê" ++ ++msgid "Log file" ++msgstr "Tệp nhật ký" ++ ++msgid "Multicast address" ++msgstr "Äa địa chỉ" ++ ++msgid "Operation mode" ++msgstr "Chế Ä‘á»™ hoạt Ä‘á»™ng" ++ ++msgid "Port" ++msgstr "Cổng" ++ ++msgid "Protocol family" ++msgstr "Giao thức" ++ ++msgid "Served interfaces" ++msgstr "Giao diện phục vụ" ++ ++msgid "Server" ++msgstr "Máy chủ" ++ ++msgid "Specifies the announced IPv4 and IPv6 NTP servers" ++msgstr "Quy định cụ thể máy chủ IPv4, IPv6 và NTP" ++ ++msgid "Specifies the announced IPv4 and IPv6 name servers" ++msgstr "Quy định cụ thể tên máy chủ IPv4, IPv6 và NTP" ++ ++msgid "Specifies the announced IPv4 and IPv6 network prefixes in CIDR notation" ++msgstr "Äịnh rõ công bố IPv4 và IPv6 mạng tiá»n tố trong ký hiệu CIDR" ++ ++msgid "The AHCP Service is not running." ++msgstr "Dịch vụ AHCP khá»™ng hoạt Ä‘á»™ng." ++ ++msgid "The AHCP Service is running with ID %s." ++msgstr "Dịch vụ AHCP Ä‘ang hoạt Ä‘á»™ng vá»›i ID %s." ++ ++msgid "There are no active leases." ++msgstr "Hiện không có ngÆ°á»i thuê" ++ ++msgid "Unique ID file" ++msgstr "Tệp Unique ID" +diff --git a/feeds/luci/applications/luci-app-ahcp/po/zh-cn/ahcp.po b/feeds/luci/applications/luci-app-ahcp/po/zh-cn/ahcp.po +new file mode 100644 +index 0000000..295bbe7 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-ahcp/po/zh-cn/ahcp.po +@@ -0,0 +1,113 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"PO-Revision-Date: 2013-10-09 03:31+0200\n" ++"Last-Translator: Tanyingyu \n" ++"Language-Team: none\n" ++"Language: zh_CN\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=1; plural=0;\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "AHCP Server" ++msgstr "AHCP æœåŠ¡å™¨" ++ ++#, fuzzy ++msgid "" ++"AHCP is an autoconfiguration protocol for IPv6 and dual-stack IPv6/IPv4 " ++"networks designed to be used in place of router discovery or DHCP on " ++"networks where it is difficult or impossible to configure a server within " ++"every link-layer broadcast domain, for example mobile ad-hoc networks." ++msgstr "" ++"AHCP是一个自动é…ç½®IPv6å’ŒIPv6/IPv4åŒæ ˆç½‘络的å议,用于在网络上进行路由探测和地" ++"å€åˆ†é…。因为在æŸäº›ç½‘络上为æ¯ä¸ªé“¾è·¯å±‚广播域å‡é…ç½®æœåŠ¡å™¨æ˜¯éžå¸¸å›°éš¾çš„,例如移动" ++"ad-hoc网络。" ++ ++msgid "Active AHCP Leases" ++msgstr "活动的AHCP租约" ++ ++msgid "Address" ++msgstr "地å€" ++ ++msgid "Advanced Settings" ++msgstr "高级设置" ++ ++msgid "Age" ++msgstr "有效期" ++ ++msgid "Announced DNS servers" ++msgstr "公布DNSæœåŠ¡å™¨" ++ ++msgid "Announced NTP servers" ++msgstr "公布NTPæœåŠ¡å™¨" ++ ++msgid "Announced prefixes" ++msgstr "公布地å€å‰ç¼€" ++ ++msgid "Collecting data..." ++msgstr "æ•°æ®æ”¶é›†ä¸­..." ++ ++msgid "Forwarder" ++msgstr "转å‘器" ++ ++msgid "General Setup" ++msgstr "通用设置" ++ ++msgid "IPv4 and IPv6" ++msgstr "IPv4å’ŒIPv6" ++ ++msgid "IPv4 only" ++msgstr "ä»…IPv4" ++ ++msgid "IPv6 only" ++msgstr "ä»…IPv6" ++ ++msgid "Lease directory" ++msgstr "租èµç›®å½•" ++ ++msgid "Lease validity time" ++msgstr "租约有效期" ++ ++msgid "Log file" ++msgstr "日志文件" ++ ++msgid "Multicast address" ++msgstr "多播地å€" ++ ++msgid "Operation mode" ++msgstr "工作模å¼" ++ ++msgid "Port" ++msgstr "端å£" ++ ++msgid "Protocol family" ++msgstr "å议簇" ++ ++msgid "Served interfaces" ++msgstr "æœåŠ¡æŽ¥å£" ++ ++msgid "Server" ++msgstr "æœåŠ¡å™¨" ++ ++msgid "Specifies the announced IPv4 and IPv6 NTP servers" ++msgstr "指定IPv4与IPv6 时间æœåŠ¡å™¨" ++ ++msgid "Specifies the announced IPv4 and IPv6 name servers" ++msgstr "指定IPv4与IPv6 域åæœåŠ¡å™¨" ++ ++msgid "Specifies the announced IPv4 and IPv6 network prefixes in CIDR notation" ++msgstr "指定IPv4与IPv6网络地å€å‰ç¼€(CIDR表示法)" ++ ++msgid "The AHCP Service is not running." ++msgstr "AHCPæœåŠ¡æ²¡æœ‰è¿è¡Œã€‚" ++ ++msgid "The AHCP Service is running with ID %s." ++msgstr "AHCPæœåŠ¡ç¨‹åºè¿›ç¨‹ID %s" ++ ++msgid "There are no active leases." ++msgstr "没有活跃租约。" ++ ++msgid "Unique ID file" ++msgstr "UID文件" +diff --git a/feeds/luci/applications/luci-app-ahcp/po/zh-tw/ahcp.po b/feeds/luci/applications/luci-app-ahcp/po/zh-tw/ahcp.po +new file mode 100644 +index 0000000..dc7f6c5 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-ahcp/po/zh-tw/ahcp.po +@@ -0,0 +1,109 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"PO-Revision-Date: 2013-08-10 12:30+0200\n" ++"Last-Translator: mp607 \n" ++"Language-Team: none\n" ++"Language: zh_TW\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=1; plural=0;\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "AHCP Server" ++msgstr "AHCP伺æœå™¨" ++ ++msgid "" ++"AHCP is an autoconfiguration protocol for IPv6 and dual-stack IPv6/IPv4 " ++"networks designed to be used in place of router discovery or DHCP on " ++"networks where it is difficult or impossible to configure a server within " ++"every link-layer broadcast domain, for example mobile ad-hoc networks." ++msgstr "" ++ ++msgid "Active AHCP Leases" ++msgstr "" ++ ++msgid "Address" ++msgstr "ä½ç½®" ++ ++msgid "Advanced Settings" ++msgstr "進階設定" ++ ++msgid "Age" ++msgstr "" ++ ++msgid "Announced DNS servers" ++msgstr "匿åçš„DNS伺æœå™¨" ++ ++msgid "Announced NTP servers" ++msgstr "匿åçš„NTP伺æœå™¨" ++ ++msgid "Announced prefixes" ++msgstr "匿åçš„å‰ç¶´" ++ ++msgid "Collecting data..." ++msgstr "收集資料" ++ ++msgid "Forwarder" ++msgstr "" ++ ++msgid "General Setup" ++msgstr "一般設定" ++ ++msgid "IPv4 and IPv6" ++msgstr "IPv4 å’Œ IPv6" ++ ++msgid "IPv4 only" ++msgstr "åªæœ‰IPv4" ++ ++msgid "IPv6 only" ++msgstr "åªæœ‰IPv6" ++ ++msgid "Lease directory" ++msgstr "租用目錄" ++ ++msgid "Lease validity time" ++msgstr "租用有效時間" ++ ++msgid "Log file" ++msgstr "記錄檔" ++ ++msgid "Multicast address" ++msgstr "多點廣播ä½ç½®" ++ ++msgid "Operation mode" ++msgstr "æ“作模å¼" ++ ++msgid "Port" ++msgstr "通訊埠" ++ ++msgid "Protocol family" ++msgstr "å”定群組" ++ ++msgid "Served interfaces" ++msgstr "æä¾›æœå‹™çš„ç•Œé¢" ++ ++msgid "Server" ++msgstr "伺æœå™¨" ++ ++msgid "Specifies the announced IPv4 and IPv6 NTP servers" ++msgstr "特別的匿åIPv4 與 IPv6 NTP 伺æœå™¨" ++ ++msgid "Specifies the announced IPv4 and IPv6 name servers" ++msgstr "特別的匿åIPv4 與 IPv6 å稱伺æœå™¨" ++ ++msgid "Specifies the announced IPv4 and IPv6 network prefixes in CIDR notation" ++msgstr "特別的匿åIPv4 與 IPv6 網路CIDRå‰ç¶´" ++ ++msgid "The AHCP Service is not running." ++msgstr "AHCPæœå‹™æ²’有é‹ä½œ" ++ ++msgid "The AHCP Service is running with ID %s." ++msgstr "AHCPæœå‹™é‹ä½œä¸­ ID為 %s" ++ ++msgid "There are no active leases." ++msgstr "沒有使用中的租用" ++ ++msgid "Unique ID file" ++msgstr "ç¨ç«‹çš„ID檔案" +diff --git a/feeds/luci/applications/luci-app-ahcp/root/etc/uci-defaults/luci-ahcp b/feeds/luci/applications/luci-app-ahcp/root/etc/uci-defaults/luci-ahcp +new file mode 100755 +index 0000000..f2b2487 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-ahcp/root/etc/uci-defaults/luci-ahcp +@@ -0,0 +1,11 @@ ++#!/bin/sh ++ ++uci -q batch <<-EOF >/dev/null ++ delete ucitrack.@ahcpd[-1] ++ add ucitrack ahcpd ++ set ucitrack.@ahcpd[-1].init=ahcpd ++ commit ucitrack ++EOF ++ ++rm -f /tmp/luci-indexcache ++exit 0 +diff --git a/feeds/luci/applications/luci-app-asterisk/Makefile b/feeds/luci/applications/luci-app-asterisk/Makefile +new file mode 100644 +index 0000000..f2f3cd1 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-asterisk/Makefile +@@ -0,0 +1,14 @@ ++# ++# Copyright (C) 2008-2014 The LuCI Team ++# ++# This is free software, licensed under the Apache License, Version 2.0 . ++# ++ ++include $(TOPDIR)/rules.mk ++ ++LUCI_TITLE:=LuCI Support for Asterisk ++LUCI_DEPENDS:=+ahcpd ++ ++include ../../luci.mk ++ ++# call BuildPackage - OpenWrt buildroot signature +diff --git a/feeds/luci/applications/luci-app-asterisk/luasrc/asterisk.lua b/feeds/luci/applications/luci-app-asterisk/luasrc/asterisk.lua +new file mode 100644 +index 0000000..ceb738d +--- /dev/null ++++ b/feeds/luci/applications/luci-app-asterisk/luasrc/asterisk.lua +@@ -0,0 +1,746 @@ ++-- Copyright 2009 Jo-Philipp Wich ++-- Licensed to the public under the Apache License 2.0. ++ ++module("luci.asterisk", package.seeall) ++require("luci.asterisk.cc_idd") ++ ++local _io = require("io") ++local uci = require("luci.model.uci").cursor() ++local sys = require("luci.sys") ++local util = require("luci.util") ++ ++AST_BIN = "/usr/sbin/asterisk" ++AST_FLAGS = "-r -x" ++ ++ ++--- LuCI Asterisk - Resync uci context ++function uci_resync() ++ uci = luci.model.uci.cursor() ++end ++ ++--- LuCI Asterisk io interface ++-- Handles low level io. ++-- @type module ++io = luci.util.class() ++ ++--- Execute command and return output ++-- @param command String containing the command to execute ++-- @return String containing the command output ++function io.exec(command) ++ local fh = _io.popen( "%s %s %q" %{ AST_BIN, AST_FLAGS, command }, "r" ) ++ assert(fh, "Failed to invoke asterisk") ++ ++ local buffer = fh:read("*a") ++ fh:close() ++ return buffer ++end ++ ++--- Execute command and invoke given callback for each readed line ++-- @param command String containing the command to execute ++-- @param callback Function to call back for each line ++-- @return Always true ++function io.execl(command, callback) ++ local ln ++ local fh = _io.popen( "%s %s %q" %{ AST_BIN, AST_FLAGS, command }, "r" ) ++ assert(fh, "Failed to invoke asterisk") ++ ++ repeat ++ ln = fh:read("*l") ++ callback(ln) ++ until not ln ++ ++ fh:close() ++ return true ++end ++ ++--- Execute command and return an iterator that returns one line per invokation ++-- @param command String containing the command to execute ++-- @return Iterator function ++function io.execi(command) ++ local fh = _io.popen( "%s %s %q" %{ AST_BIN, AST_FLAGS, command }, "r" ) ++ assert(fh, "Failed to invoke asterisk") ++ ++ return function() ++ local ln = fh:read("*l") ++ if not ln then fh:close() end ++ return ln ++ end ++end ++ ++ ++--- LuCI Asterisk - core status ++core = luci.util.class() ++ ++--- Retrive version string. ++-- @return String containing the reported asterisk version ++function core.version(self) ++ local version = io.exec("core show version") ++ return version:gsub(" *\n", "") ++end ++ ++ ++--- LuCI Asterisk - SIP information. ++-- @type module ++sip = luci.util.class() ++ ++--- Get a list of known SIP peers ++-- @return Table containing each SIP peer ++function sip.peers(self) ++ local head = false ++ local peers = { } ++ ++ for line in io.execi("sip show peers") do ++ if not head then ++ head = true ++ elseif not line:match(" sip peers ") then ++ local online, delay, id, uid ++ local name, host, dyn, nat, acl, port, status = ++ line:match("(.-) +(.-) +([D ]) ([N ]) (.) (%d+) +(.+)") ++ ++ if host == '(Unspecified)' then host = nil end ++ if port == '0' then port = nil else port = tonumber(port) end ++ ++ dyn = ( dyn == 'D' and true or false ) ++ nat = ( nat == 'N' and true or false ) ++ acl = ( acl ~= ' ' and true or false ) ++ ++ online, delay = status:match("(OK) %((%d+) ms%)") ++ ++ if online == 'OK' then ++ online = true ++ delay = tonumber(delay) ++ elseif status ~= 'Unmonitored' then ++ online = false ++ delay = 0 ++ else ++ online = nil ++ delay = 0 ++ end ++ ++ id, uid = name:match("(.+)/(.+)") ++ ++ if not ( id and uid ) then ++ id = name .. "..." ++ uid = nil ++ end ++ ++ peers[#peers+1] = { ++ online = online, ++ delay = delay, ++ name = id, ++ user = uid, ++ dynamic = dyn, ++ nat = nat, ++ acl = acl, ++ host = host, ++ port = port ++ } ++ end ++ end ++ ++ return peers ++end ++ ++--- Get informations of given SIP peer ++-- @param peer String containing the name of the SIP peer ++function sip.peer(peer) ++ local info = { } ++ local keys = { } ++ ++ for line in io.execi("sip show peer " .. peer) do ++ if #line > 0 then ++ local key, val = line:match("(.-) *: +(.*)") ++ if key and val then ++ ++ key = key:gsub("^ +",""):gsub(" +$", "") ++ val = val:gsub("^ +",""):gsub(" +$", "") ++ ++ if key == "* Name" then ++ key = "Name" ++ elseif key == "Addr->IP" then ++ info.address, info.port = val:match("(.+) Port (.+)") ++ info.port = tonumber(info.port) ++ elseif key == "Status" then ++ info.online, info.delay = val:match("(OK) %((%d+) ms%)") ++ if info.online == 'OK' then ++ info.online = true ++ info.delay = tonumber(info.delay) ++ elseif status ~= 'Unmonitored' then ++ info.online = false ++ info.delay = 0 ++ else ++ info.online = nil ++ info.delay = 0 ++ end ++ end ++ ++ if val == 'Yes' or val == 'yes' or val == '' then ++ val = true ++ elseif val == 'No' or val == 'no' then ++ val = false ++ elseif val == '' or val == '(none)' then ++ val = nil ++ end ++ ++ keys[#keys+1] = key ++ info[key] = val ++ end ++ end ++ end ++ ++ return info, keys ++end ++ ++ ++--- LuCI Asterisk - Internal helpers ++-- @type module ++tools = luci.util.class() ++ ++--- Convert given value to a list of tokens. Split by white space. ++-- @param val String or table value ++-- @return Table containing tokens ++function tools.parse_list(v) ++ local tokens = { } ++ ++ v = type(v) == "table" and v or { v } ++ for _, v in ipairs(v) do ++ if type(v) == "string" then ++ for v in v:gmatch("(%S+)") do ++ tokens[#tokens+1] = v ++ end ++ end ++ end ++ ++ return tokens ++end ++ ++--- Convert given list to a collection of hyperlinks ++-- @param list Table of tokens ++-- @param url String pattern or callback function to construct urls (optional) ++-- @param sep String containing the seperator (optional, default is ", ") ++-- @return String containing the html fragment ++function tools.hyperlinks(list, url, sep) ++ local html ++ ++ local function mkurl(p, t) ++ if type(p) == "string" then ++ return p:format(t) ++ elseif type(p) == "function" then ++ return p(t) ++ else ++ return '#' ++ end ++ end ++ ++ list = list or { } ++ url = url or "%s" ++ sep = sep or ", " ++ ++ for _, token in ipairs(list) do ++ html = ( html and html .. sep or '' ) .. ++ '%s' %{ mkurl(url, token), token } ++ end ++ ++ return html or '' ++end ++ ++ ++--- LuCI Asterisk - International Direct Dialing Prefixes ++-- @type module ++idd = luci.util.class() ++ ++--- Lookup the country name for the given IDD code. ++-- @param country String containing IDD code ++-- @return String containing the country name ++function idd.country(c) ++ for _, v in ipairs(cc_idd.CC_IDD) do ++ if type(v[3]) == "table" then ++ for _, v2 in ipairs(v[3]) do ++ if v2 == tostring(c) then ++ return v[1] ++ end ++ end ++ elseif v[3] == tostring(c) then ++ return v[1] ++ end ++ end ++end ++ ++--- Lookup the country code for the given IDD code. ++-- @param country String containing IDD code ++-- @return Table containing the country code(s) ++function idd.cc(c) ++ for _, v in ipairs(cc_idd.CC_IDD) do ++ if type(v[3]) == "table" then ++ for _, v2 in ipairs(v[3]) do ++ if v2 == tostring(c) then ++ return type(v[2]) == "table" ++ and v[2] or { v[2] } ++ end ++ end ++ elseif v[3] == tostring(c) then ++ return type(v[2]) == "table" ++ and v[2] or { v[2] } ++ end ++ end ++end ++ ++--- Lookup the IDD code(s) for the given country. ++-- @param idd String containing the country name ++-- @return Table containing the IDD code(s) ++function idd.idd(c) ++ for _, v in ipairs(cc_idd.CC_IDD) do ++ if v[1]:lower():match(c:lower()) then ++ return type(v[3]) == "table" ++ and v[3] or { v[3] } ++ end ++ end ++end ++ ++--- Populate given CBI field with IDD codes. ++-- @param field CBI option object ++-- @return (nothing) ++function idd.cbifill(o) ++ for i, v in ipairs(cc_idd.CC_IDD) do ++ o:value("_%i" % i, util.pcdata(v[1])) ++ end ++ ++ o.formvalue = function(...) ++ local val = luci.cbi.Value.formvalue(...) ++ if val:sub(1,1) == "_" then ++ val = tonumber((val:gsub("^_", ""))) ++ if val then ++ return type(cc_idd.CC_IDD[val][3]) == "table" ++ and cc_idd.CC_IDD[val][3] or { cc_idd.CC_IDD[val][3] } ++ end ++ end ++ return val ++ end ++ ++ o.cfgvalue = function(...) ++ local val = luci.cbi.Value.cfgvalue(...) ++ if val then ++ val = tools.parse_list(val) ++ for i, v in ipairs(cc_idd.CC_IDD) do ++ if type(v[3]) == "table" then ++ if v[3][1] == val[1] then ++ return "_%i" % i ++ end ++ else ++ if v[3] == val[1] then ++ return "_%i" % i ++ end ++ end ++ end ++ end ++ return val ++ end ++end ++ ++ ++--- LuCI Asterisk - Country Code Prefixes ++-- @type module ++cc = luci.util.class() ++ ++--- Lookup the country name for the given CC code. ++-- @param country String containing CC code ++-- @return String containing the country name ++function cc.country(c) ++ for _, v in ipairs(cc_idd.CC_IDD) do ++ if type(v[2]) == "table" then ++ for _, v2 in ipairs(v[2]) do ++ if v2 == tostring(c) then ++ return v[1] ++ end ++ end ++ elseif v[2] == tostring(c) then ++ return v[1] ++ end ++ end ++end ++ ++--- Lookup the international dialing code for the given CC code. ++-- @param cc String containing CC code ++-- @return String containing IDD code ++function cc.idd(c) ++ for _, v in ipairs(cc_idd.CC_IDD) do ++ if type(v[2]) == "table" then ++ for _, v2 in ipairs(v[2]) do ++ if v2 == tostring(c) then ++ return type(v[3]) == "table" ++ and v[3] or { v[3] } ++ end ++ end ++ elseif v[2] == tostring(c) then ++ return type(v[3]) == "table" ++ and v[3] or { v[3] } ++ end ++ end ++end ++ ++--- Lookup the CC code(s) for the given country. ++-- @param country String containing the country name ++-- @return Table containing the CC code(s) ++function cc.cc(c) ++ for _, v in ipairs(cc_idd.CC_IDD) do ++ if v[1]:lower():match(c:lower()) then ++ return type(v[2]) == "table" ++ and v[2] or { v[2] } ++ end ++ end ++end ++ ++--- Populate given CBI field with CC codes. ++-- @param field CBI option object ++-- @return (nothing) ++function cc.cbifill(o) ++ for i, v in ipairs(cc_idd.CC_IDD) do ++ o:value("_%i" % i, util.pcdata(v[1])) ++ end ++ ++ o.formvalue = function(...) ++ local val = luci.cbi.Value.formvalue(...) ++ if val:sub(1,1) == "_" then ++ val = tonumber((val:gsub("^_", ""))) ++ if val then ++ return type(cc_idd.CC_IDD[val][2]) == "table" ++ and cc_idd.CC_IDD[val][2] or { cc_idd.CC_IDD[val][2] } ++ end ++ end ++ return val ++ end ++ ++ o.cfgvalue = function(...) ++ local val = luci.cbi.Value.cfgvalue(...) ++ if val then ++ val = tools.parse_list(val) ++ for i, v in ipairs(cc_idd.CC_IDD) do ++ if type(v[2]) == "table" then ++ if v[2][1] == val[1] then ++ return "_%i" % i ++ end ++ else ++ if v[2] == val[1] then ++ return "_%i" % i ++ end ++ end ++ end ++ end ++ return val ++ end ++end ++ ++ ++--- LuCI Asterisk - Dialzone ++-- @type module ++dialzone = luci.util.class() ++ ++--- Parse a dialzone section ++-- @param zone Table containing the zone info ++-- @return Table with parsed information ++function dialzone.parse(z) ++ if z['.name'] then ++ return { ++ trunks = tools.parse_list(z.uses), ++ name = z['.name'], ++ description = z.description or z['.name'], ++ addprefix = z.addprefix, ++ matches = tools.parse_list(z.match), ++ intlmatches = tools.parse_list(z.international), ++ countrycode = z.countrycode, ++ localzone = z.localzone, ++ localprefix = z.localprefix ++ } ++ end ++end ++ ++--- Get a list of known dial zones ++-- @return Associative table of zones and table of zone names ++function dialzone.zones() ++ local zones = { } ++ local znames = { } ++ uci:foreach("asterisk", "dialzone", ++ function(z) ++ zones[z['.name']] = dialzone.parse(z) ++ znames[#znames+1] = z['.name'] ++ end) ++ return zones, znames ++end ++ ++--- Get a specific dial zone ++-- @param name Name of the dial zone ++-- @return Table containing zone information ++function dialzone.zone(n) ++ local zone ++ uci:foreach("asterisk", "dialzone", ++ function(z) ++ if z['.name'] == n then ++ zone = dialzone.parse(z) ++ end ++ end) ++ return zone ++end ++ ++--- Find uci section hash for given zone number ++-- @param idx Zone number ++-- @return String containing the uci hash pointing to the section ++function dialzone.ucisection(i) ++ local hash ++ local index = 1 ++ i = tonumber(i) ++ uci:foreach("asterisk", "dialzone", ++ function(z) ++ if not hash and index == i then ++ hash = z['.name'] ++ end ++ index = index + 1 ++ end) ++ return hash ++end ++ ++ ++--- LuCI Asterisk - Voicemailbox ++-- @type module ++voicemail = luci.util.class() ++ ++--- Parse a voicemail section ++-- @param zone Table containing the mailbox info ++-- @return Table with parsed information ++function voicemail.parse(z) ++ if z.number and #z.number > 0 then ++ local v = { ++ id = '%s@%s' %{ z.number, z.context or 'default' }, ++ number = z.number, ++ context = z.context or 'default', ++ name = z.name or z['.name'] or 'OpenWrt', ++ zone = z.zone or 'homeloc', ++ password = z.password or '0000', ++ email = z.email or '', ++ page = z.page or '', ++ dialplans = { } ++ } ++ ++ uci:foreach("asterisk", "dialplanvoice", ++ function(s) ++ if s.dialplan and #s.dialplan > 0 and ++ s.voicebox == v.number ++ then ++ v.dialplans[#v.dialplans+1] = s.dialplan ++ end ++ end) ++ ++ return v ++ end ++end ++ ++--- Get a list of known voicemail boxes ++-- @return Associative table of boxes and table of box numbers ++function voicemail.boxes() ++ local vboxes = { } ++ local vnames = { } ++ uci:foreach("asterisk", "voicemail", ++ function(z) ++ local v = voicemail.parse(z) ++ if v then ++ local n = '%s@%s' %{ v.number, v.context } ++ vboxes[n] = v ++ vnames[#vnames+1] = n ++ end ++ end) ++ return vboxes, vnames ++end ++ ++--- Get a specific voicemailbox ++-- @param number Number of the voicemailbox ++-- @return Table containing mailbox information ++function voicemail.box(n) ++ local box ++ n = n:gsub("@.+$","") ++ uci:foreach("asterisk", "voicemail", ++ function(z) ++ if z.number == tostring(n) then ++ box = voicemail.parse(z) ++ end ++ end) ++ return box ++end ++ ++--- Find all voicemailboxes within the given dialplan ++-- @param plan Dialplan name or table ++-- @return Associative table containing extensions mapped to mailbox info ++function voicemail.in_dialplan(p) ++ local plan = type(p) == "string" and p or p.name ++ local boxes = { } ++ uci:foreach("asterisk", "dialplanvoice", ++ function(s) ++ if s.extension and #s.extension > 0 and s.dialplan == plan then ++ local box = voicemail.box(s.voicebox) ++ if box then ++ boxes[s.extension] = box ++ end ++ end ++ end) ++ return boxes ++end ++ ++--- Remove voicemailbox and associated extensions from config ++-- @param box Voicemailbox number or table ++-- @param ctx UCI context to use (optional) ++-- @return Boolean indicating success ++function voicemail.remove(v, ctx) ++ ctx = ctx or uci ++ local box = type(v) == "string" and v or v.number ++ local ok1 = ctx:delete_all("asterisk", "voicemail", {number=box}) ++ local ok2 = ctx:delete_all("asterisk", "dialplanvoice", {voicebox=box}) ++ return ( ok1 or ok2 ) and true or false ++end ++ ++ ++--- LuCI Asterisk - MeetMe Conferences ++-- @type module ++meetme = luci.util.class() ++ ++--- Parse a meetme section ++-- @param room Table containing the room info ++-- @return Table with parsed information ++function meetme.parse(r) ++ if r.room and #r.room > 0 then ++ local v = { ++ room = r.room, ++ pin = r.pin or '', ++ adminpin = r.adminpin or '', ++ description = r._description or '', ++ dialplans = { } ++ } ++ ++ uci:foreach("asterisk", "dialplanmeetme", ++ function(s) ++ if s.dialplan and #s.dialplan > 0 and s.room == v.room then ++ v.dialplans[#v.dialplans+1] = s.dialplan ++ end ++ end) ++ ++ return v ++ end ++end ++ ++--- Get a list of known meetme rooms ++-- @return Associative table of rooms and table of room numbers ++function meetme.rooms() ++ local mrooms = { } ++ local mnames = { } ++ uci:foreach("asterisk", "meetme", ++ function(r) ++ local v = meetme.parse(r) ++ if v then ++ mrooms[v.room] = v ++ mnames[#mnames+1] = v.room ++ end ++ end) ++ return mrooms, mnames ++end ++ ++--- Get a specific meetme room ++-- @param number Number of the room ++-- @return Table containing room information ++function meetme.room(n) ++ local room ++ uci:foreach("asterisk", "meetme", ++ function(r) ++ if r.room == tostring(n) then ++ room = meetme.parse(r) ++ end ++ end) ++ return room ++end ++ ++--- Find all meetme rooms within the given dialplan ++-- @param plan Dialplan name or table ++-- @return Associative table containing extensions mapped to room info ++function meetme.in_dialplan(p) ++ local plan = type(p) == "string" and p or p.name ++ local rooms = { } ++ uci:foreach("asterisk", "dialplanmeetme", ++ function(s) ++ if s.extension and #s.extension > 0 and s.dialplan == plan then ++ local room = meetme.room(s.room) ++ if room then ++ rooms[s.extension] = room ++ end ++ end ++ end) ++ return rooms ++end ++ ++--- Remove meetme room and associated extensions from config ++-- @param room Voicemailbox number or table ++-- @param ctx UCI context to use (optional) ++-- @return Boolean indicating success ++function meetme.remove(v, ctx) ++ ctx = ctx or uci ++ local room = type(v) == "string" and v or v.number ++ local ok1 = ctx:delete_all("asterisk", "meetme", {room=room}) ++ local ok2 = ctx:delete_all("asterisk", "dialplanmeetme", {room=room}) ++ return ( ok1 or ok2 ) and true or false ++end ++ ++ ++--- LuCI Asterisk - Dialplan ++-- @type module ++dialplan = luci.util.class() ++ ++--- Parse a dialplan section ++-- @param plan Table containing the plan info ++-- @return Table with parsed information ++function dialplan.parse(z) ++ if z['.name'] then ++ local plan = { ++ zones = { }, ++ name = z['.name'], ++ description = z.description or z['.name'] ++ } ++ ++ -- dialzones ++ for _, name in ipairs(tools.parse_list(z.include)) do ++ local zone = dialzone.zone(name) ++ if zone then ++ plan.zones[#plan.zones+1] = zone ++ end ++ end ++ ++ -- voicemailboxes ++ plan.voicemailboxes = voicemail.in_dialplan(plan) ++ ++ -- meetme conferences ++ plan.meetmerooms = meetme.in_dialplan(plan) ++ ++ return plan ++ end ++end ++ ++--- Get a list of known dial plans ++-- @return Associative table of plans and table of plan names ++function dialplan.plans() ++ local plans = { } ++ local pnames = { } ++ uci:foreach("asterisk", "dialplan", ++ function(p) ++ plans[p['.name']] = dialplan.parse(p) ++ pnames[#pnames+1] = p['.name'] ++ end) ++ return plans, pnames ++end ++ ++--- Get a specific dial plan ++-- @param name Name of the dial plan ++-- @return Table containing plan information ++function dialplan.plan(n) ++ local plan ++ uci:foreach("asterisk", "dialplan", ++ function(p) ++ if p['.name'] == n then ++ plan = dialplan.parse(p) ++ end ++ end) ++ return plan ++end +diff --git a/feeds/luci/applications/luci-app-asterisk/luasrc/asterisk/cc_idd.lua b/feeds/luci/applications/luci-app-asterisk/luasrc/asterisk/cc_idd.lua +new file mode 100644 +index 0000000..6ed8dfd +--- /dev/null ++++ b/feeds/luci/applications/luci-app-asterisk/luasrc/asterisk/cc_idd.lua +@@ -0,0 +1,245 @@ ++-- Licensed to the public under the Apache License 2.0. ++ ++module "luci.asterisk.cc_idd" ++ ++CC_IDD = { ++-- Country, CC, IDD ++ { "Afghanistan", "93", "00" }, ++ { "Albania", "355", "00" }, ++ { "Algeria", "213", "00" }, ++ { "American Samoa", "684", "00" }, ++ { "Andorra", "376", "00" }, ++ { "Angola", "244", "00" }, ++ { "Anguilla", "264", "011" }, ++ { "Antarctica", "672", "" }, ++ { "Antigua", "268", "011" }, ++ { "Argentina", "54", "00" }, ++ { "Armenia", "374", "00" }, ++ { "Aruba", "297", "00" }, ++ { "Ascension Island", "247", "00" }, ++ { "Australia", "61", "0011" }, ++ { "Austria", "43", "00" }, ++ { "Azberbaijan", "994", "00" }, ++ { "Bahamas", "242", "011" }, ++ { "Bahrain", "973", "00" }, ++ { "Bangladesh", "880", "00" }, ++ { "Barbados", "246", "011" }, ++ { "Barbuda", "268", "011" }, ++ { "Belarus", "375", "810" }, ++ { "Belgium", "32", "00" }, ++ { "Belize", "501", "00" }, ++ { "Benin", "229", "00" }, ++ { "Bermuda", "441", "011" }, ++ { "Bhutan", "975", "00" }, ++ { "Bolivia", "591", "00" }, ++ { "Bosnia", "387", "00" }, ++ { "Botswana", "267", "00" }, ++ { "Brazil", "55", "00" }, ++ { "British Virgin Islands", "284", "011" }, ++ { "Brunei", "673", "00" }, ++ { "Bulgaria", "359", "00" }, ++ { "Burkina Faso", "226", "00" }, ++ { "Burma (Myanmar)", "95", "00" }, ++ { "Burundi", "257", "00" }, ++ { "Cambodia", "855", "001" }, ++ { "Cameroon", "237", "00" }, ++ { "Canada", "1", "011" }, ++ { "Cape Verde Islands", "238", "0" }, ++ { "Cayman Islands", "345", "011" }, ++ { "Central African Rep.", "236", "00" }, ++ { "Chad", "235", "15" }, ++ { "Chile", "56", "00" }, ++ { "China", "86", "00" }, ++ { "Christmas Island", "61", "0011" }, ++ { "Cocos Islands", "61", "0011" }, ++ { "Colombia", "57", "00" }, ++ { "Comoros", "269", "00" }, ++ { "Congo", "242", "00" }, ++ { "Congo, Dem. Rep. of", "243", "00" }, ++ { "Cook Islands", "682", "00" }, ++ { "Costa Rica", "506", "00" }, ++ { "Croatia", "385", "00" }, ++ { "Cuba", "53", "119" }, ++ { "Cyprus", "357", "00" }, ++ { "Czech Republic", "420", "00" }, ++ { "Denmark", "45", "00" }, ++ { "Diego Garcia", "246", "00" }, ++ { "Djibouti", "253", "00" }, ++ { "Dominica", "767", "011" }, ++ { "Dominican Rep.", "809", "011" }, ++ { "Ecuador", "593", "00" }, ++ { "Egypt", "20", "00" }, ++ { "El Salvador", "503", "00" }, ++ { "Equatorial Guinea", "240", "00" }, ++ { "Eritrea", "291", "00" }, ++ { "Estonia", "372", "00" }, ++ { "Ethiopia", "251", "00" }, ++ { "Faeroe Islands", "298", "00" }, ++ { "Falkland Islands", "500", "00" }, ++ { "Fiji Islands", "679", "00" }, ++ { "Finland", "358", "00" }, ++ { "France", "33", "00" }, ++ { "French Antilles", "596", "00" }, ++ { "French Guiana", "594", "00" }, ++ { "French Polynesia", "689", "00" }, ++ { "Gabon", "241", "00" }, ++ { "Gambia", "220", "00" }, ++ { "Georgia", "995", "810" }, ++ { "Germany", "49", "00" }, ++ { "Ghana", "233", "00" }, ++ { "Gibraltar", "350", "00" }, ++ { "Greece", "30", "00" }, ++ { "Greenland", "299", "00" }, ++ { "Grenada", "473", "011" }, ++ { "Guadeloupe", "590", "00" }, ++ { "Guam", "671", "011" }, ++ { "Guantanamo Bay", "5399", "00" }, ++ { "Guatemala", "502", "00" }, ++ { "Guinea", "224", "00" }, ++ { "Guinea Bissau", "245", "00" }, ++ { "Guyana", "592", "001" }, ++ { "Haiti", "509", "00" }, ++ { "Honduras", "504", "00" }, ++ { "Hong Kong", "852", "001" }, ++ { "Hungary", "36", "00" }, ++ { "Iceland", "354", "00" }, ++ { "India", "91", "00" }, ++ { "Indonesia", "62", { "001", "008" } }, ++ { "Iran", "98", "00" }, ++ { "Iraq", "964", "00" }, ++ { "Ireland", "353", "00" }, ++ { "Israel", "972", "00" }, ++ { "Italy", "39", "00" }, ++ { "Ivory Coast", "225", "00" }, ++ { "Jamaica", "876", "011" }, ++ { "Japan", "81", "001" }, ++ { "Jordan", "962", "00" }, ++ { "Kazakhstan", "7", "810" }, ++ { "Kenya", "254", "000" }, ++ { "Kiribati", "686", "00" }, ++ { "Korea, North", "850", "00" }, ++ { "Korea, South", "82", "001" }, ++ { "Kuwait", "965", "00" }, ++ { "Kyrgyzstan", "996", "00" }, ++ { "Laos", "856", "00" }, ++ { "Latvia", "371", "00" }, ++ { "Lebanon", "961", "00" }, ++ { "Lesotho", "266", "00" }, ++ { "Liberia", "231", "00" }, ++ { "Libya", "218", "00" }, ++ { "Liechtenstein", "423", "00" }, ++ { "Lithuania", "370", "00" }, ++ { "Luxembourg", "352", "00" }, ++ { "Macau", "853", "00" }, ++ { "Macedonia", "389", "00" }, ++ { "Madagascar", "261", "00" }, ++ { "Malawi", "265", "00" }, ++ { "Malaysia", "60", "00" }, ++ { "Maldives", "960", "00" }, ++ { "Mali", "223", "00" }, ++ { "Malta", "356", "00" }, ++ { "Mariana Islands", "670", "011" }, ++ { "Marshall Islands", "692", "011" }, ++ { "Martinique", "596", "00" }, ++ { "Mauritania", "222", "00" }, ++ { "Mauritius", "230", "00" }, ++ { "Mayotte Islands", "269", "00" }, ++ { "Mexico", "52", "00" }, ++ { "Micronesia", "691", "011" }, ++ { "Midway Island", "808", "011" }, ++ { "Moldova", "373", "00" }, ++ { "Monaco", "377", "00" }, ++ { "Mongolia", "976", "001" }, ++ { "Montserrat", "664", "011" }, ++ { "Morocco", "212", "00" }, ++ { "Mozambique", "258", "00" }, ++ { "Myanmar (Burma)", "95", "00" }, ++ { "Namibia", "264", "00" }, ++ { "Nauru", "674", "00" }, ++ { "Nepal", "977", "00" }, ++ { "Netherlands", "31", "00" }, ++ { "Netherlands Antilles", "599", "00" }, ++ { "Nevis", "869", "011" }, ++ { "New Caledonia", "687", "00" }, ++ { "New Zealand", "64", "00" }, ++ { "Nicaragua", "505", "00" }, ++ { "Niger", "227", "00" }, ++ { "Nigeria", "234", "009" }, ++ { "Niue", "683", "00" }, ++ { "Norfolk Island", "672", "00" }, ++ { "Norway", "47", "00" }, ++ { "Oman", "968", "00" }, ++ { "Pakistan", "92", "00" }, ++ { "Palau", "680", "011" }, ++ { "Palestine", "970", "00" }, ++ { "Panama", "507", "00" }, ++ { "Papua New Guinea", "675", "05" }, ++ { "Paraguay", "595", "002" }, ++ { "Peru", "51", "00" }, ++ { "Philippines", "63", "00" }, ++ { "Poland", "48", "00" }, ++ { "Portugal", "351", "00" }, ++ { "Puerto Rico", { "787", "939" }, "011" }, ++ { "Qatar", "974", "00" }, ++ { "Reunion Island", "262", "00" }, ++ { "Romania", "40", "00" }, ++ { "Russia", "7", "810" }, ++ { "Rwanda", "250", "00" }, ++ { "St. Helena", "290", "00" }, ++ { "St. Kitts", "869", "011" }, ++ { "St. Lucia", "758", "011" }, ++ { "St. Perre & Miquelon", "508", "00" }, ++ { "St. Vincent", "784", "011" }, ++ { "San Marino", "378", "00" }, ++ { "Sao Tome & Principe", "239", "00" }, ++ { "Saudi Arabia", "966", "00" }, ++ { "Senegal", "221", "00" }, ++ { "Serbia", "381", "99" }, ++ { "Seychelles", "248", "00" }, ++ { "Sierra Leone", "232", "00" }, ++ { "Singapore", "65", "001" }, ++ { "Slovakia", "421", "00" }, ++ { "Slovenia", "386", "00" }, ++ { "Solomon Islands", "677", "00" }, ++ { "Somalia", "252", "00" }, ++ { "South Africa", "27", "09" }, ++ { "Spain", "34", "00" }, ++ { "Sri Lanka", "94", "00" }, ++ { "Sudan", "249", "00" }, ++ { "Suriname", "597", "00" }, ++ { "Swaziland", "268", "00" }, ++ { "Sweden", "46", "00" }, ++ { "Switzerland", "41", "00" }, ++ { "Syria", "963", "00" }, ++ { "Taiwan", "886", "002" }, ++ { "Tajikistan", "992", "810" }, ++ { "Tanzania", "255", "00" }, ++ { "Thailand", "66", "001" }, ++ { "Togo", "228", "00" }, ++ { "Tonga", "676", "00" }, ++ { "Trinidad & Tobago", "868", "011" }, ++ { "Tunisia", "216", "00" }, ++ { "Turkey", "90", "00" }, ++ { "Turkmenistan", "993", "810" }, ++ { "Turks & Caicos", "649", "011" }, ++ { "Tuvalu", "688", "00" }, ++ { "Uganda", "256", "000" }, ++ { "Ukraine", "380", "810" }, ++ { "United Arab Emirates", "971", "00" }, ++ { "United Kingdom", "44", "00" }, ++ { "Uruguay", "598", "00" }, ++ { "USA", "1", "011" }, ++ { "US Virgin Islands", "340", "011" }, ++ { "Uzbekistan", "998", "810" }, ++ { "Vanuatu", "678", "00" }, ++ { "Vatican City", "39", "00" }, ++ { "Venezuela", "58", "00" }, ++ { "Vietnam", "84", "00" }, ++ { "Wake Island", "808", "00" }, ++ { "Wallis & Futuna", "681", "19" }, ++ { "Western Samoa", "685", "00" }, ++ { "Yemen", "967", "00" }, ++ { "Yugoslavia", "381", "99" }, ++ { "Zambia", "260", "00" }, ++ { "Zimbabwe", "263", "00" } ++} +diff --git a/feeds/luci/applications/luci-app-asterisk/luasrc/controller/asterisk.lua b/feeds/luci/applications/luci-app-asterisk/luasrc/controller/asterisk.lua +new file mode 100644 +index 0000000..4923584 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-asterisk/luasrc/controller/asterisk.lua +@@ -0,0 +1,194 @@ ++-- Copyright 2008 Steven Barth ++-- Copyright 2008 Jo-Philipp Wich ++-- Licensed to the public under the Apache License 2.0. ++ ++module("luci.controller.asterisk", package.seeall) ++ ++function index() ++ ++ entry({"admin", "services", "asterisk"}, cbi("asterisk"), "Asterisk", 80) ++ ++ entry({"admin", "services", "asterisk", "voice"}, cbi("asterisk-voice"), "Voice Functions", 1) ++ entry({"admin", "services", "asterisk", "meetme"}, cbi("asterisk-meetme"), "Meetme Conferences", 2) ++ ++ entry({"admin", "services", "asterisk", "iax-conns"}, cbi("asterisk-iax-connections"), "IAX Connections", 3) ++ entry({"admin", "services", "asterisk", "sip-conns"}, cbi("asterisk-sip-connections"), "SIP Connections", 4) ++ ++ entry({"admin", "services", "asterisk", "dialplans"}, cbi("asterisk-dialplans"), "Dial Plans", 5) ++ ++ entry({"admin", "services", "asterisk", "mod"}, cbi("asterisk-mod-app"), "Modules", 4) ++ entry({"admin", "services", "asterisk", "mod", "app"}, cbi("asterisk-mod-app"), "Applications", 1) ++ entry({"admin", "services", "asterisk", "mod", "cdr"}, cbi("asterisk-mod-cdr"), "Call Detail Records", 2) ++ entry({"admin", "services", "asterisk", "mod", "chan"}, cbi("asterisk-mod-chan"), "Channels", 3) ++ entry({"admin", "services", "asterisk", "mod", "codec"}, cbi("asterisk-mod-codec"), "Codecs", 4) ++ entry({"admin", "services", "asterisk", "mod", "format"}, cbi("asterisk-mod-format"), "Format", 5) ++ entry({"admin", "services", "asterisk", "mod", "func"}, cbi("asterisk-mod-func"), "Functions", 6) ++ entry({"admin", "services", "asterisk", "mod", "pbx"}, cbi("asterisk-mod-pbx"), "PBX", 7) ++ entry({"admin", "services", "asterisk", "mod", "res"}, cbi("asterisk-mod-res"), "Resources", 8) ++ entry({"admin", "services", "asterisk", "mod", "res", "feature"}, ++ cbi("asterisk-mod-res-feature"), "Feature Module Configuration", 9 ) ++ ++ ++ entry({"admin", "asterisk"}, cbi("asterisk/main"), "Asterisk", 99).i18n = "asterisk" ++ ++ entry({"admin", "asterisk", "phones"}, cbi("asterisk/phones"), "Phones", 1) ++ entry({"admin", "asterisk", "phones", "sip"}, cbi("asterisk/phone_sip"), nil, 1).leaf = true ++ --entry({"admin", "asterisk", "phones", "exten"}, cbi("asterisk/phone_exten"), "Extensions", 2).leaf = true ++ ++ entry({"admin", "asterisk", "trunks"}, cbi("asterisk/trunks"), "Trunks", 2) ++ entry({"admin", "asterisk", "trunks", "sip"}, cbi("asterisk/trunk_sip"), nil, 1).leaf = true ++ ++ entry({"admin", "asterisk", "voicemail"}, cbi("asterisk/voicemail"), "Voicemail", 3) ++ entry({"admin", "asterisk", "voicemail", "mailboxes"}, cbi("asterisk/voicemail"), "Mailboxes", 1) ++ entry({"admin", "asterisk", "voicemail", "settings"}, cbi("asterisk/voicemail_settings"), "Settings", 2) ++ ++ entry({"admin", "asterisk", "meetme"}, cbi("asterisk/meetme"), "MeetMe", 4) ++ entry({"admin", "asterisk", "meetme", "rooms"}, cbi("asterisk/meetme"), "Rooms", 1) ++ entry({"admin", "asterisk", "meetme", "settings"}, cbi("asterisk/meetme_settings"), "Settings", 2) ++ ++ entry({"admin", "asterisk", "dialplans"}, call("handle_dialplan"), "Call Routing", 5) ++ entry({"admin", "asterisk", "dialplans", "out"}, cbi("asterisk/dialplan_out"), nil, 1).leaf = true ++ entry({"admin", "asterisk", "dialplans", "zones"}, call("handle_dialzones"), "Dial Zones", 2).leaf = true ++ ++end ++ ++ ++function handle_dialplan() ++ local uci = luci.model.uci.cursor() ++ local ast = require "luci.asterisk" ++ local err = false ++ ++ for k, v in pairs(luci.http.formvaluetable("delzone")) do ++ local plan = ast.dialplan.plan(k) ++ if #v > 0 and plan then ++ local newinc = { } ++ ++ for _, z in ipairs(plan.zones) do ++ if z.name ~= v then ++ newinc[#newinc+1] = z.name ++ end ++ end ++ ++ uci:delete("asterisk", plan.name, "include") ++ ++ if #newinc > 0 then ++ uci:set("asterisk", plan.name, "include", newinc) ++ end ++ end ++ end ++ ++ for k, v in pairs(luci.http.formvaluetable("addzone")) do ++ local plan = ast.dialplan.plan(k) ++ local zone = ast.dialzone.zone(v) ++ if #v > 0 and plan and zone then ++ local newinc = { zone.name } ++ ++ for _, z in ipairs(plan.zones) do ++ newinc[#newinc+1] = z.name ++ end ++ ++ uci:delete("asterisk", plan.name, "include") ++ ++ if #newinc > 0 then ++ uci:set("asterisk", plan.name, "include", newinc) ++ end ++ end ++ end ++ ++ for k, v in pairs(luci.http.formvaluetable("delvbox")) do ++ local plan = ast.dialplan.plan(k) ++ if #v > 0 and plan then ++ uci:delete_all("asterisk", "dialplanvoice", ++ { extension=v, dialplan=plan.name }) ++ end ++ end ++ ++ for k, v in pairs(luci.http.formvaluetable("addvbox")) do ++ local plan = ast.dialplan.plan(k) ++ local vbox = ast.voicemail.box(v) ++ if plan and vbox then ++ local vext = luci.http.formvalue("addvboxext.%s" % plan.name) ++ vext = ( vext and #vext > 0 ) and vext or vbox.number ++ uci:section("asterisk", "dialplanvoice", nil, { ++ dialplan = plan.name, ++ extension = vext, ++ voicebox = vbox.number, ++ voicecontext = vbox.context ++ }) ++ end ++ end ++ ++ for k, v in pairs(luci.http.formvaluetable("delmeetme")) do ++ local plan = ast.dialplan.plan(k) ++ if #v > 0 and plan then ++ uci:delete_all("asterisk", "dialplanmeetme", ++ { extension=v, dialplan=plan.name }) ++ end ++ end ++ ++ for k, v in pairs(luci.http.formvaluetable("addmeetme")) do ++ local plan = ast.dialplan.plan(k) ++ local meetme = ast.meetme.room(v) ++ if plan and meetme then ++ local mext = luci.http.formvalue("addmeetmeext.%s" % plan.name) ++ mext = ( mext and #mext > 0 ) and mext or meetme.room ++ uci:section("asterisk", "dialplanmeetme", nil, { ++ dialplan = plan.name, ++ extension = mext, ++ room = meetme.room ++ }) ++ end ++ end ++ ++ local aname = luci.http.formvalue("addplan") ++ if aname and #aname > 0 then ++ if aname:match("^[a-zA-Z0-9_]+$") then ++ uci:section("asterisk", "dialplan", aname, { }) ++ else ++ err = true ++ end ++ end ++ ++ local dname = luci.http.formvalue("delplan") ++ if dname and #dname > 0 then ++ if uci:get("asterisk", dname) == "dialplan" then ++ uci:delete("asterisk", dname) ++ uci:delete_all("asterisk", "dialplanvoice", { dialplan=dname }) ++ uci:delete_all("asterisk", "dialplanmeetme", { dialplan=dname }) ++ end ++ end ++ ++ uci:save("asterisk") ++ ast.uci_resync() ++ ++ luci.template.render("asterisk/dialplans", { create_error = err }) ++end ++ ++function handle_dialzones() ++ local ast = require "luci.asterisk" ++ local uci = luci.model.uci.cursor() ++ local err = false ++ ++ if luci.http.formvalue("newzone") then ++ local name = luci.http.formvalue("newzone_name") ++ if name and name:match("^[a-zA-Z0-9_]+$") then ++ uci:section("asterisk", "dialzone", name, { ++ uses = ast.tools.parse_list(luci.http.formvalue("newzone_uses") or {}), ++ match = ast.tools.parse_list(luci.http.formvalue("newzone_match") or {}) ++ }) ++ uci:save("asterisk") ++ else ++ err = true ++ end ++ end ++ ++ if luci.http.formvalue("delzone") then ++ local name = luci.http.formvalue("delzone") ++ if uci:get("asterisk", name) == "dialzone" then ++ uci:delete("asterisk", name) ++ uci:save("asterisk") ++ end ++ end ++ ++ luci.template.render("asterisk/dialzones", { create_error = err }) ++end +diff --git a/feeds/luci/applications/luci-app-asterisk/luasrc/model/cbi/asterisk-dialplans.lua b/feeds/luci/applications/luci-app-asterisk/luasrc/model/cbi/asterisk-dialplans.lua +new file mode 100644 +index 0000000..d4daa68 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-asterisk/luasrc/model/cbi/asterisk-dialplans.lua +@@ -0,0 +1,91 @@ ++-- Copyright 2008 Steven Barth ++-- Copyright 2008 Jo-Philipp Wich ++-- Licensed to the public under the Apache License 2.0. ++ ++cbimap = Map("asterisk", "asterisk", "") ++ ++dialplan = cbimap:section(TypedSection, "dialplan", "Section dialplan", "") ++dialplan.addremove = true ++dialplan.dynamic = true ++ ++include = dialplan:option(MultiValue, "include", "Include zones and plans", "") ++cbimap.uci:foreach( "asterisk", "dialplan", function(s) include:value(s['.name']) end ) ++cbimap.uci:foreach( "asterisk", "dialzone", function(s) include:value(s['.name']) end ) ++ ++dialplanexten = cbimap:section(TypedSection, "dialplanexten", "Dialplan Extension", "") ++dialplanexten.anonymous = true ++dialplanexten.addremove = true ++dialplanexten.dynamic = true ++ ++ ++dialplangeneral = cbimap:section(TypedSection, "dialplangeneral", "Dialplan General Options", "") ++dialplangeneral.anonymous = true ++dialplangeneral.addremove = true ++ ++allowtransfer = dialplangeneral:option(Flag, "allowtransfer", "Allow transfer", "") ++allowtransfer.rmempty = true ++ ++canreinvite = dialplangeneral:option(ListValue, "canreinvite", "Reinvite/redirect media connections", "") ++canreinvite:value("yes", "Yes") ++canreinvite:value("nonat", "Yes when not behind NAT") ++canreinvite:value("update", "Use UPDATE rather than INVITE for path redirection") ++canreinvite:value("no", "No") ++canreinvite.rmempty = true ++ ++clearglobalvars = dialplangeneral:option(Flag, "clearglobalvars", "Clear global vars", "") ++clearglobalvars.rmempty = true ++ ++ ++dialplangoto = cbimap:section(TypedSection, "dialplangoto", "Dialplan Goto", "") ++dialplangoto.anonymous = true ++dialplangoto.addremove = true ++dialplangoto.dynamic = true ++ ++ ++dialplanmeetme = cbimap:section(TypedSection, "dialplanmeetme", "Dialplan Conference", "") ++dialplanmeetme.anonymous = true ++dialplanmeetme.addremove = true ++dialplanmeetme.dynamic = true ++ ++ ++dialplansaytime = cbimap:section(TypedSection, "dialplansaytime", "Dialplan Time", "") ++dialplansaytime.anonymous = true ++dialplansaytime.addremove = true ++dialplansaytime.dynamic = true ++ ++ ++dialplanvoice = cbimap:section(TypedSection, "dialplanvoice", "Dialplan Voicemail", "") ++dialplanvoice.anonymous = true ++dialplanvoice.addremove = true ++dialplanvoice.dynamic = true ++ ++ ++dialzone = cbimap:section(TypedSection, "dialzone", "Dial Zones for Dialplan", "") ++dialzone.addremove = true ++dialzone.template = "cbi/tblsection" ++ ++addprefix = dialzone:option(Value, "addprefix", "Prefix to add matching dialplans", "") ++addprefix.rmempty = true ++ ++--international = dialzone:option(DynamicList, "international", "Match International prefix", "") ++international = dialzone:option(Value, "international", "Match International prefix", "") ++international.rmempty = true ++ ++localprefix = dialzone:option(Value, "localprefix", "Prefix (0) to add/remove to/from intl. numbers", "") ++localprefix.rmempty = true ++ ++localzone = dialzone:option(Value, "localzone", "Dialzone for intl. numbers matched as local", "") ++localzone.titleref = luci.dispatcher.build_url( "admin", "services", "asterisk", "dialplans" ) ++cbimap.uci:foreach( "asterisk", "dialplan", function(s) localzone:value(s['.name']) end ) ++cbimap.uci:foreach( "asterisk", "dialzone", function(s) localzone:value(s['.name']) end ) ++ ++match = dialzone:option(Value, "match", "Match plan", "") ++match.rmempty = true ++ ++uses = dialzone:option(ListValue, "uses", "Connection to use", "") ++uses.titleref = luci.dispatcher.build_url( "admin", "services", "asterisk", "sip-conns" ) ++cbimap.uci:foreach( "asterisk", "sip", function(s) uses:value('SIP/'..s['.name']) end ) ++cbimap.uci:foreach( "asterisk", "iax", function(s) uses:value('IAX/'..s['.name']) end ) ++ ++ ++return cbimap +diff --git a/feeds/luci/applications/luci-app-asterisk/luasrc/model/cbi/asterisk-iax-connections.lua b/feeds/luci/applications/luci-app-asterisk/luasrc/model/cbi/asterisk-iax-connections.lua +new file mode 100644 +index 0000000..d0eaf34 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-asterisk/luasrc/model/cbi/asterisk-iax-connections.lua +@@ -0,0 +1,49 @@ ++-- Copyright 2008 Steven Barth ++-- Copyright 2008 Jo-Philipp Wich ++-- Licensed to the public under the Apache License 2.0. ++ ++cbimap = Map("asterisk", "asterisk", "") ++ ++iax = cbimap:section(TypedSection, "iax", "IAX Connection", "") ++iax.addremove = true ++ ++alwaysinternational = iax:option(Flag, "alwaysinternational", "Always Dial International", "") ++alwaysinternational.optional = true ++ ++context = iax:option(ListValue, "context", "Context to use", "") ++context.titleref = luci.dispatcher.build_url( "admin", "services", "asterisk", "dialplans" ) ++cbimap.uci:foreach( "asterisk", "dialplan", function(s) context:value(s['.name']) end ) ++cbimap.uci:foreach( "asterisk", "dialzone", function(s) context:value(s['.name']) end ) ++ ++countrycode = iax:option(Value, "countrycode", "Country Code for connection", "") ++countrycode.optional = true ++ ++extension = iax:option(Value, "extension", "Add as Extension", "") ++extension.optional = true ++ ++host = iax:option(Value, "host", "Host name (or blank)", "") ++host.optional = true ++ ++internationalprefix = iax:option(Value, "internationalprefix", "International Dial Prefix", "") ++internationalprefix.optional = true ++ ++prefix = iax:option(Value, "prefix", "Dial Prefix (for external line)", "") ++prefix.optional = true ++ ++secret = iax:option(Value, "secret", "Secret", "") ++secret.optional = true ++ ++timeout = iax:option(Value, "timeout", "Dial Timeout (sec)", "") ++timeout.optional = true ++ ++type = iax:option(ListValue, "type", "Option type", "") ++type:value("friend", "Friend (outbound/inbound)") ++type:value("user", "User (inbound - authenticate by \"from\")") ++type:value("peer", "Peer (outbound - match by host)") ++type.optional = true ++ ++username = iax:option(Value, "username", "User name", "") ++username.optional = true ++ ++ ++return cbimap +diff --git a/feeds/luci/applications/luci-app-asterisk/luasrc/model/cbi/asterisk-meetme.lua b/feeds/luci/applications/luci-app-asterisk/luasrc/model/cbi/asterisk-meetme.lua +new file mode 100644 +index 0000000..dd79e46 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-asterisk/luasrc/model/cbi/asterisk-meetme.lua +@@ -0,0 +1,22 @@ ++-- Copyright 2008 Steven Barth ++-- Copyright 2008 Jo-Philipp Wich ++-- Licensed to the public under the Apache License 2.0. ++ ++cbimap = Map("asterisk", "asterisk", "") ++ ++meetmegeneral = cbimap:section(TypedSection, "meetmegeneral", "Meetme Conference General Options", "") ++ ++audiobuffers = meetmegeneral:option(Value, "audiobuffers", "Number of 20ms audio buffers to be used", "") ++ ++ ++meetme = cbimap:section(TypedSection, "meetme", "Meetme Conference", "") ++meetme.addremove = true ++ ++adminpin = meetme:option(Value, "adminpin", "Admin PIN", "") ++adminpin.password = true ++ ++pin = meetme:option(Value, "pin", "Meeting PIN", "") ++pin.password = true ++ ++ ++return cbimap +diff --git a/feeds/luci/applications/luci-app-asterisk/luasrc/model/cbi/asterisk-mod-app.lua b/feeds/luci/applications/luci-app-asterisk/luasrc/model/cbi/asterisk-mod-app.lua +new file mode 100644 +index 0000000..0a0a2d5 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-asterisk/luasrc/model/cbi/asterisk-mod-app.lua +@@ -0,0 +1,391 @@ ++cbimap = Map("asterisk", "asterisk", "") ++ ++module = cbimap:section(TypedSection, "module", "Modules", "") ++module.anonymous = true ++ ++app_alarmreceiver = module:option(ListValue, "app_alarmreceiver", "Alarm Receiver Application", "") ++app_alarmreceiver:value("yes", "Load") ++app_alarmreceiver:value("no", "Do Not Load") ++app_alarmreceiver:value("auto", "Load as Required") ++app_alarmreceiver.rmempty = true ++ ++app_authenticate = module:option(ListValue, "app_authenticate", "Authentication Application", "") ++app_authenticate:value("yes", "Load") ++app_authenticate:value("no", "Do Not Load") ++app_authenticate:value("auto", "Load as Required") ++app_authenticate.rmempty = true ++ ++app_cdr = module:option(ListValue, "app_cdr", "Make sure asterisk doesnt save CDR", "") ++app_cdr:value("yes", "Load") ++app_cdr:value("no", "Do Not Load") ++app_cdr:value("auto", "Load as Required") ++app_cdr.rmempty = true ++ ++app_chanisavail = module:option(ListValue, "app_chanisavail", "Check if channel is available", "") ++app_chanisavail:value("yes", "Load") ++app_chanisavail:value("no", "Do Not Load") ++app_chanisavail:value("auto", "Load as Required") ++app_chanisavail.rmempty = true ++ ++app_chanspy = module:option(ListValue, "app_chanspy", "Listen in on any channel", "") ++app_chanspy:value("yes", "Load") ++app_chanspy:value("no", "Do Not Load") ++app_chanspy:value("auto", "Load as Required") ++app_chanspy.rmempty = true ++ ++app_controlplayback = module:option(ListValue, "app_controlplayback", "Control Playback Application", "") ++app_controlplayback:value("yes", "Load") ++app_controlplayback:value("no", "Do Not Load") ++app_controlplayback:value("auto", "Load as Required") ++app_controlplayback.rmempty = true ++ ++app_cut = module:option(ListValue, "app_cut", "Cuts up variables", "") ++app_cut:value("yes", "Load") ++app_cut:value("no", "Do Not Load") ++app_cut:value("auto", "Load as Required") ++app_cut.rmempty = true ++ ++app_db = module:option(ListValue, "app_db", "Database access functions", "") ++app_db:value("yes", "Load") ++app_db:value("no", "Do Not Load") ++app_db:value("auto", "Load as Required") ++app_db.rmempty = true ++ ++app_dial = module:option(ListValue, "app_dial", "Dialing Application", "") ++app_dial:value("yes", "Load") ++app_dial:value("no", "Do Not Load") ++app_dial:value("auto", "Load as Required") ++app_dial.rmempty = true ++ ++app_dictate = module:option(ListValue, "app_dictate", "Virtual Dictation Machine Application", "") ++app_dictate:value("yes", "Load") ++app_dictate:value("no", "Do Not Load") ++app_dictate:value("auto", "Load as Required") ++app_dictate.rmempty = true ++ ++app_directed_pickup = module:option(ListValue, "app_directed_pickup", "Directed Call Pickup Support", "") ++app_directed_pickup:value("yes", "Load") ++app_directed_pickup:value("no", "Do Not Load") ++app_directed_pickup:value("auto", "Load as Required") ++app_directed_pickup.rmempty = true ++ ++app_directory = module:option(ListValue, "app_directory", "Extension Directory", "") ++app_directory:value("yes", "Load") ++app_directory:value("no", "Do Not Load") ++app_directory:value("auto", "Load as Required") ++app_directory.rmempty = true ++ ++app_disa = module:option(ListValue, "app_disa", "DISA (Direct Inward System Access) Application", "") ++app_disa:value("yes", "Load") ++app_disa:value("no", "Do Not Load") ++app_disa:value("auto", "Load as Required") ++app_disa.rmempty = true ++ ++app_dumpchan = module:option(ListValue, "app_dumpchan", "Dump channel variables Application", "") ++app_dumpchan:value("yes", "Load") ++app_dumpchan:value("no", "Do Not Load") ++app_dumpchan:value("auto", "Load as Required") ++app_dumpchan.rmempty = true ++ ++app_echo = module:option(ListValue, "app_echo", "Simple Echo Application", "") ++app_echo:value("yes", "Load") ++app_echo:value("no", "Do Not Load") ++app_echo:value("auto", "Load as Required") ++app_echo.rmempty = true ++ ++app_enumlookup = module:option(ListValue, "app_enumlookup", "ENUM Lookup", "") ++app_enumlookup:value("yes", "Load") ++app_enumlookup:value("no", "Do Not Load") ++app_enumlookup:value("auto", "Load as Required") ++app_enumlookup.rmempty = true ++ ++app_eval = module:option(ListValue, "app_eval", "Reevaluates strings", "") ++app_eval:value("yes", "Load") ++app_eval:value("no", "Do Not Load") ++app_eval:value("auto", "Load as Required") ++app_eval.rmempty = true ++ ++app_exec = module:option(ListValue, "app_exec", "Executes applications", "") ++app_exec:value("yes", "Load") ++app_exec:value("no", "Do Not Load") ++app_exec:value("auto", "Load as Required") ++app_exec.rmempty = true ++ ++app_externalivr = module:option(ListValue, "app_externalivr", "External IVR application interface", "") ++app_externalivr:value("yes", "Load") ++app_externalivr:value("no", "Do Not Load") ++app_externalivr:value("auto", "Load as Required") ++app_externalivr.rmempty = true ++ ++app_forkcdr = module:option(ListValue, "app_forkcdr", "Fork The CDR into 2 seperate entities", "") ++app_forkcdr:value("yes", "Load") ++app_forkcdr:value("no", "Do Not Load") ++app_forkcdr:value("auto", "Load as Required") ++app_forkcdr.rmempty = true ++ ++app_getcpeid = module:option(ListValue, "app_getcpeid", "Get ADSI CPE ID", "") ++app_getcpeid:value("yes", "Load") ++app_getcpeid:value("no", "Do Not Load") ++app_getcpeid:value("auto", "Load as Required") ++app_getcpeid.rmempty = true ++ ++app_groupcount = module:option(ListValue, "app_groupcount", "Group Management Routines", "") ++app_groupcount:value("yes", "Load") ++app_groupcount:value("no", "Do Not Load") ++app_groupcount:value("auto", "Load as Required") ++app_groupcount.rmempty = true ++ ++app_ices = module:option(ListValue, "app_ices", "Encode and Stream via icecast and ices", "") ++app_ices:value("yes", "Load") ++app_ices:value("no", "Do Not Load") ++app_ices:value("auto", "Load as Required") ++app_ices.rmempty = true ++ ++app_image = module:option(ListValue, "app_image", "Image Transmission Application", "") ++app_image:value("yes", "Load") ++app_image:value("no", "Do Not Load") ++app_image:value("auto", "Load as Required") ++app_image.rmempty = true ++ ++app_lookupblacklist = module:option(ListValue, "app_lookupblacklist", "Look up Caller*ID name/number from black", "") ++app_lookupblacklist:value("yes", "Load") ++app_lookupblacklist:value("no", "Do Not Load") ++app_lookupblacklist:value("auto", "Load as Required") ++app_lookupblacklist.rmempty = true ++ ++app_lookupcidname = module:option(ListValue, "app_lookupcidname", "Look up CallerID Name from local databas", "") ++app_lookupcidname:value("yes", "Load") ++app_lookupcidname:value("no", "Do Not Load") ++app_lookupcidname:value("auto", "Load as Required") ++app_lookupcidname.rmempty = true ++ ++app_macro = module:option(ListValue, "app_macro", "Extension Macros", "") ++app_macro:value("yes", "Load") ++app_macro:value("no", "Do Not Load") ++app_macro:value("auto", "Load as Required") ++app_macro.rmempty = true ++ ++app_math = module:option(ListValue, "app_math", "A simple math Application", "") ++app_math:value("yes", "Load") ++app_math:value("no", "Do Not Load") ++app_math:value("auto", "Load as Required") ++app_math.rmempty = true ++ ++app_md5 = module:option(ListValue, "app_md5", "MD5 checksum Application", "") ++app_md5:value("yes", "Load") ++app_md5:value("no", "Do Not Load") ++app_md5:value("auto", "Load as Required") ++app_md5.rmempty = true ++ ++app_milliwatt = module:option(ListValue, "app_milliwatt", "Digital Milliwatt (mu-law) Test Application", "") ++app_milliwatt:value("yes", "Load") ++app_milliwatt:value("no", "Do Not Load") ++app_milliwatt:value("auto", "Load as Required") ++app_milliwatt.rmempty = true ++ ++app_mixmonitor = module:option(ListValue, "app_mixmonitor", "Record a call and mix the audio during the recording", "") ++app_mixmonitor:value("yes", "Load") ++app_mixmonitor:value("no", "Do Not Load") ++app_mixmonitor:value("auto", "Load as Required") ++app_mixmonitor.rmempty = true ++ ++app_parkandannounce = module:option(ListValue, "app_parkandannounce", "Call Parking and Announce Application", "") ++app_parkandannounce:value("yes", "Load") ++app_parkandannounce:value("no", "Do Not Load") ++app_parkandannounce:value("auto", "Load as Required") ++app_parkandannounce.rmempty = true ++ ++app_playback = module:option(ListValue, "app_playback", "Trivial Playback Application", "") ++app_playback:value("yes", "Load") ++app_playback:value("no", "Do Not Load") ++app_playback:value("auto", "Load as Required") ++app_playback.rmempty = true ++ ++app_privacy = module:option(ListValue, "app_privacy", "Require phone number to be entered", "") ++app_privacy:value("yes", "Load") ++app_privacy:value("no", "Do Not Load") ++app_privacy:value("auto", "Load as Required") ++app_privacy.rmempty = true ++ ++app_queue = module:option(ListValue, "app_queue", "True Call Queueing", "") ++app_queue:value("yes", "Load") ++app_queue:value("no", "Do Not Load") ++app_queue:value("auto", "Load as Required") ++app_queue.rmempty = true ++ ++app_random = module:option(ListValue, "app_random", "Random goto", "") ++app_random:value("yes", "Load") ++app_random:value("no", "Do Not Load") ++app_random:value("auto", "Load as Required") ++app_random.rmempty = true ++ ++app_read = module:option(ListValue, "app_read", "Read Variable Application", "") ++app_read:value("yes", "Load") ++app_read:value("no", "Do Not Load") ++app_read:value("auto", "Load as Required") ++app_read.rmempty = true ++ ++app_readfile = module:option(ListValue, "app_readfile", "Read in a file", "") ++app_readfile:value("yes", "Load") ++app_readfile:value("no", "Do Not Load") ++app_readfile:value("auto", "Load as Required") ++app_readfile.rmempty = true ++ ++app_realtime = module:option(ListValue, "app_realtime", "Realtime Data Lookup/Rewrite", "") ++app_realtime:value("yes", "Load") ++app_realtime:value("no", "Do Not Load") ++app_realtime:value("auto", "Load as Required") ++app_realtime.rmempty = true ++ ++app_record = module:option(ListValue, "app_record", "Trivial Record Application", "") ++app_record:value("yes", "Load") ++app_record:value("no", "Do Not Load") ++app_record:value("auto", "Load as Required") ++app_record.rmempty = true ++ ++app_sayunixtime = module:option(ListValue, "app_sayunixtime", "Say time", "") ++app_sayunixtime:value("yes", "Load") ++app_sayunixtime:value("no", "Do Not Load") ++app_sayunixtime:value("auto", "Load as Required") ++app_sayunixtime.rmempty = true ++ ++app_senddtmf = module:option(ListValue, "app_senddtmf", "Send DTMF digits Application", "") ++app_senddtmf:value("yes", "Load") ++app_senddtmf:value("no", "Do Not Load") ++app_senddtmf:value("auto", "Load as Required") ++app_senddtmf.rmempty = true ++ ++app_sendtext = module:option(ListValue, "app_sendtext", "Send Text Applications", "") ++app_sendtext:value("yes", "Load") ++app_sendtext:value("no", "Do Not Load") ++app_sendtext:value("auto", "Load as Required") ++app_sendtext.rmempty = true ++ ++app_setcallerid = module:option(ListValue, "app_setcallerid", "Set CallerID Application", "") ++app_setcallerid:value("yes", "Load") ++app_setcallerid:value("no", "Do Not Load") ++app_setcallerid:value("auto", "Load as Required") ++app_setcallerid.rmempty = true ++ ++app_setcdruserfield = module:option(ListValue, "app_setcdruserfield", "CDR user field apps", "") ++app_setcdruserfield:value("yes", "Load") ++app_setcdruserfield:value("no", "Do Not Load") ++app_setcdruserfield:value("auto", "Load as Required") ++app_setcdruserfield.rmempty = true ++ ++app_setcidname = module:option(ListValue, "app_setcidname", "load => .so ; Set CallerID Name", "") ++app_setcidname:value("yes", "Load") ++app_setcidname:value("no", "Do Not Load") ++app_setcidname:value("auto", "Load as Required") ++app_setcidname.rmempty = true ++ ++app_setcidnum = module:option(ListValue, "app_setcidnum", "load => .so ; Set CallerID Number", "") ++app_setcidnum:value("yes", "Load") ++app_setcidnum:value("no", "Do Not Load") ++app_setcidnum:value("auto", "Load as Required") ++app_setcidnum.rmempty = true ++ ++app_setrdnis = module:option(ListValue, "app_setrdnis", "Set RDNIS Number", "") ++app_setrdnis:value("yes", "Load") ++app_setrdnis:value("no", "Do Not Load") ++app_setrdnis:value("auto", "Load as Required") ++app_setrdnis.rmempty = true ++ ++app_settransfercapability = module:option(ListValue, "app_settransfercapability", "Set ISDN Transfer Capability", "") ++app_settransfercapability:value("yes", "Load") ++app_settransfercapability:value("no", "Do Not Load") ++app_settransfercapability:value("auto", "Load as Required") ++app_settransfercapability.rmempty = true ++ ++app_sms = module:option(ListValue, "app_sms", "SMS/PSTN handler", "") ++app_sms:value("yes", "Load") ++app_sms:value("no", "Do Not Load") ++app_sms:value("auto", "Load as Required") ++app_sms.rmempty = true ++ ++app_softhangup = module:option(ListValue, "app_softhangup", "Hangs up the requested channel", "") ++app_softhangup:value("yes", "Load") ++app_softhangup:value("no", "Do Not Load") ++app_softhangup:value("auto", "Load as Required") ++app_softhangup.rmempty = true ++ ++app_stack = module:option(ListValue, "app_stack", "Stack Routines", "") ++app_stack:value("yes", "Load") ++app_stack:value("no", "Do Not Load") ++app_stack:value("auto", "Load as Required") ++app_stack.rmempty = true ++ ++app_system = module:option(ListValue, "app_system", "Generic System() application", "") ++app_system:value("yes", "Load") ++app_system:value("no", "Do Not Load") ++app_system:value("auto", "Load as Required") ++app_system.rmempty = true ++ ++app_talkdetect = module:option(ListValue, "app_talkdetect", "Playback with Talk Detection", "") ++app_talkdetect:value("yes", "Load") ++app_talkdetect:value("no", "Do Not Load") ++app_talkdetect:value("auto", "Load as Required") ++app_talkdetect.rmempty = true ++ ++app_test = module:option(ListValue, "app_test", "Interface Test Application", "") ++app_test:value("yes", "Load") ++app_test:value("no", "Do Not Load") ++app_test:value("auto", "Load as Required") ++app_test.rmempty = true ++ ++app_transfer = module:option(ListValue, "app_transfer", "Transfer", "") ++app_transfer:value("yes", "Load") ++app_transfer:value("no", "Do Not Load") ++app_transfer:value("auto", "Load as Required") ++app_transfer.rmempty = true ++ ++app_txtcidname = module:option(ListValue, "app_txtcidname", "TXTCIDName", "") ++app_txtcidname:value("yes", "Load") ++app_txtcidname:value("no", "Do Not Load") ++app_txtcidname:value("auto", "Load as Required") ++app_txtcidname.rmempty = true ++ ++app_url = module:option(ListValue, "app_url", "Send URL Applications", "") ++app_url:value("yes", "Load") ++app_url:value("no", "Do Not Load") ++app_url:value("auto", "Load as Required") ++app_url.rmempty = true ++ ++app_userevent = module:option(ListValue, "app_userevent", "Custom User Event Application", "") ++app_userevent:value("yes", "Load") ++app_userevent:value("no", "Do Not Load") ++app_userevent:value("auto", "Load as Required") ++app_userevent.rmempty = true ++ ++app_verbose = module:option(ListValue, "app_verbose", "Send verbose output", "") ++app_verbose:value("yes", "Load") ++app_verbose:value("no", "Do Not Load") ++app_verbose:value("auto", "Load as Required") ++app_verbose.rmempty = true ++ ++app_voicemail = module:option(ListValue, "app_voicemail", "Voicemail", "") ++app_voicemail:value("yes", "Load") ++app_voicemail:value("no", "Do Not Load") ++app_voicemail:value("auto", "Load as Required") ++app_voicemail.rmempty = true ++ ++app_waitforring = module:option(ListValue, "app_waitforring", "Waits until first ring after time", "") ++app_waitforring:value("yes", "Load") ++app_waitforring:value("no", "Do Not Load") ++app_waitforring:value("auto", "Load as Required") ++app_waitforring.rmempty = true ++ ++app_waitforsilence = module:option(ListValue, "app_waitforsilence", "Wait For Silence Application", "") ++app_waitforsilence:value("yes", "Load") ++app_waitforsilence:value("no", "Do Not Load") ++app_waitforsilence:value("auto", "Load as Required") ++app_waitforsilence.rmempty = true ++ ++app_while = module:option(ListValue, "app_while", "While Loops and Conditional Execution", "") ++app_while:value("yes", "Load") ++app_while:value("no", "Do Not Load") ++app_while:value("auto", "Load as Required") ++app_while.rmempty = true ++ ++ ++return cbimap +diff --git a/feeds/luci/applications/luci-app-asterisk/luasrc/model/cbi/asterisk-mod-cdr.lua b/feeds/luci/applications/luci-app-asterisk/luasrc/model/cbi/asterisk-mod-cdr.lua +new file mode 100644 +index 0000000..13dcba5 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-asterisk/luasrc/model/cbi/asterisk-mod-cdr.lua +@@ -0,0 +1,47 @@ ++-- Copyright 2008 Steven Barth ++-- Copyright 2008 Jo-Philipp Wich ++-- Licensed to the public under the Apache License 2.0. ++ ++cbimap = Map("asterisk", "asterisk", "") ++ ++module = cbimap:section(TypedSection, "module", "Modules", "") ++module.anonymous = true ++ ++cdr_csv = module:option(ListValue, "cdr_csv", "Comma Separated Values CDR Backend", "") ++cdr_csv:value("yes", "Load") ++cdr_csv:value("no", "Do Not Load") ++cdr_csv:value("auto", "Load as Required") ++cdr_csv.rmempty = true ++ ++cdr_custom = module:option(ListValue, "cdr_custom", "Customizable Comma Separated Values CDR Backend", "") ++cdr_custom:value("yes", "Load") ++cdr_custom:value("no", "Do Not Load") ++cdr_custom:value("auto", "Load as Required") ++cdr_custom.rmempty = true ++ ++cdr_manager = module:option(ListValue, "cdr_manager", "Asterisk Call Manager CDR Backend", "") ++cdr_manager:value("yes", "Load") ++cdr_manager:value("no", "Do Not Load") ++cdr_manager:value("auto", "Load as Required") ++cdr_manager.rmempty = true ++ ++cdr_mysql = module:option(ListValue, "cdr_mysql", "MySQL CDR Backend", "") ++cdr_mysql:value("yes", "Load") ++cdr_mysql:value("no", "Do Not Load") ++cdr_mysql:value("auto", "Load as Required") ++cdr_mysql.rmempty = true ++ ++cdr_pgsql = module:option(ListValue, "cdr_pgsql", "PostgreSQL CDR Backend", "") ++cdr_pgsql:value("yes", "Load") ++cdr_pgsql:value("no", "Do Not Load") ++cdr_pgsql:value("auto", "Load as Required") ++cdr_pgsql.rmempty = true ++ ++cdr_sqlite = module:option(ListValue, "cdr_sqlite", "SQLite CDR Backend", "") ++cdr_sqlite:value("yes", "Load") ++cdr_sqlite:value("no", "Do Not Load") ++cdr_sqlite:value("auto", "Load as Required") ++cdr_sqlite.rmempty = true ++ ++ ++return cbimap +diff --git a/feeds/luci/applications/luci-app-asterisk/luasrc/model/cbi/asterisk-mod-chan.lua b/feeds/luci/applications/luci-app-asterisk/luasrc/model/cbi/asterisk-mod-chan.lua +new file mode 100644 +index 0000000..425569d +--- /dev/null ++++ b/feeds/luci/applications/luci-app-asterisk/luasrc/model/cbi/asterisk-mod-chan.lua +@@ -0,0 +1,45 @@ ++-- Copyright 2008 Steven Barth ++-- Copyright 2008 Jo-Philipp Wich ++-- Licensed to the public under the Apache License 2.0. ++ ++cbimap = Map("asterisk", "asterisk", "") ++ ++ ++module = cbimap:section(TypedSection, "module", "Modules", "") ++module.anonymous = true ++ ++chan_agent = module:option(ListValue, "chan_agent", "Agent Proxy Channel", "") ++chan_agent:value("yes", "Load") ++chan_agent:value("no", "Do Not Load") ++chan_agent:value("auto", "Load as Required") ++chan_agent.rmempty = true ++ ++chan_alsa = module:option(ListValue, "chan_alsa", "Channel driver for GTalk", "") ++chan_alsa:value("yes", "Load") ++chan_alsa:value("no", "Do Not Load") ++chan_alsa:value("auto", "Load as Required") ++chan_alsa.rmempty = true ++ ++chan_gtalk = module:option(ListValue, "chan_gtalk", "Channel driver for GTalk", "") ++chan_gtalk:value("yes", "Load") ++chan_gtalk:value("no", "Do Not Load") ++chan_gtalk:value("auto", "Load as Required") ++chan_gtalk.rmempty = true ++ ++chan_iax2 = module:option(Flag, "chan_iax2", "Option chan_iax2", "") ++chan_iax2.rmempty = true ++ ++chan_local = module:option(ListValue, "chan_local", "Local Proxy Channel", "") ++chan_local:value("yes", "Load") ++chan_local:value("no", "Do Not Load") ++chan_local:value("auto", "Load as Required") ++chan_local.rmempty = true ++ ++chan_sip = module:option(ListValue, "chan_sip", "Session Initiation Protocol (SIP)", "") ++chan_sip:value("yes", "Load") ++chan_sip:value("no", "Do Not Load") ++chan_sip:value("auto", "Load as Required") ++chan_sip.rmempty = true ++ ++ ++return cbimap +diff --git a/feeds/luci/applications/luci-app-asterisk/luasrc/model/cbi/asterisk-mod-codec.lua b/feeds/luci/applications/luci-app-asterisk/luasrc/model/cbi/asterisk-mod-codec.lua +new file mode 100644 +index 0000000..0893c0e +--- /dev/null ++++ b/feeds/luci/applications/luci-app-asterisk/luasrc/model/cbi/asterisk-mod-codec.lua +@@ -0,0 +1,53 @@ ++-- Copyright 2008 Steven Barth ++-- Copyright 2008 Jo-Philipp Wich ++-- Licensed to the public under the Apache License 2.0. ++ ++cbimap = Map("asterisk", "asterisk", "") ++ ++module = cbimap:section(TypedSection, "module", "Modules", "") ++module.anonymous = true ++ ++codec_a_mu = module:option(ListValue, "codec_a_mu", "A-law and Mulaw direct Coder/Decoder", "") ++codec_a_mu:value("yes", "Load") ++codec_a_mu:value("no", "Do Not Load") ++codec_a_mu:value("auto", "Load as Required") ++codec_a_mu.rmempty = true ++ ++codec_adpcm = module:option(ListValue, "codec_adpcm", "Adaptive Differential PCM Coder/Decoder", "") ++codec_adpcm:value("yes", "Load") ++codec_adpcm:value("no", "Do Not Load") ++codec_adpcm:value("auto", "Load as Required") ++codec_adpcm.rmempty = true ++ ++codec_alaw = module:option(ListValue, "codec_alaw", "A-law Coder/Decoder", "") ++codec_alaw:value("yes", "Load") ++codec_alaw:value("no", "Do Not Load") ++codec_alaw:value("auto", "Load as Required") ++codec_alaw.rmempty = true ++ ++codec_g726 = module:option(ListValue, "codec_g726", "ITU G.726-32kbps G726 Transcoder", "") ++codec_g726:value("yes", "Load") ++codec_g726:value("no", "Do Not Load") ++codec_g726:value("auto", "Load as Required") ++codec_g726.rmempty = true ++ ++codec_gsm = module:option(ListValue, "codec_gsm", "GSM/PCM16 (signed linear) Codec Translation", "") ++codec_gsm:value("yes", "Load") ++codec_gsm:value("no", "Do Not Load") ++codec_gsm:value("auto", "Load as Required") ++codec_gsm.rmempty = true ++ ++codec_speex = module:option(ListValue, "codec_speex", "Speex/PCM16 (signed linear) Codec Translator", "") ++codec_speex:value("yes", "Load") ++codec_speex:value("no", "Do Not Load") ++codec_speex:value("auto", "Load as Required") ++codec_speex.rmempty = true ++ ++codec_ulaw = module:option(ListValue, "codec_ulaw", "Mu-law Coder/Decoder", "") ++codec_ulaw:value("yes", "Load") ++codec_ulaw:value("no", "Do Not Load") ++codec_ulaw:value("auto", "Load as Required") ++codec_ulaw.rmempty = true ++ ++ ++return cbimap +diff --git a/feeds/luci/applications/luci-app-asterisk/luasrc/model/cbi/asterisk-mod-format.lua b/feeds/luci/applications/luci-app-asterisk/luasrc/model/cbi/asterisk-mod-format.lua +new file mode 100644 +index 0000000..9b59d94 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-asterisk/luasrc/model/cbi/asterisk-mod-format.lua +@@ -0,0 +1,89 @@ ++-- Copyright 2008 Steven Barth ++-- Copyright 2008 Jo-Philipp Wich ++-- Licensed to the public under the Apache License 2.0. ++ ++cbimap = Map("asterisk", "asterisk", "") ++ ++module = cbimap:section(TypedSection, "module", "Modules", "") ++module.anonymous = true ++ ++format_au = module:option(ListValue, "format_au", "Sun Microsystems AU format (signed linear)", "") ++format_au:value("yes", "Load") ++format_au:value("no", "Do Not Load") ++format_au:value("auto", "Load as Required") ++format_au.rmempty = true ++ ++format_g723 = module:option(ListValue, "format_g723", "G.723.1 Simple Timestamp File Format", "") ++format_g723:value("yes", "Load") ++format_g723:value("no", "Do Not Load") ++format_g723:value("auto", "Load as Required") ++format_g723.rmempty = true ++ ++format_g726 = module:option(ListValue, "format_g726", "Raw G.726 (16/24/32/40kbps) data", "") ++format_g726:value("yes", "Load") ++format_g726:value("no", "Do Not Load") ++format_g726:value("auto", "Load as Required") ++format_g726.rmempty = true ++ ++format_g729 = module:option(ListValue, "format_g729", "Raw G729 data", "") ++format_g729:value("yes", "Load") ++format_g729:value("no", "Do Not Load") ++format_g729:value("auto", "Load as Required") ++format_g729.rmempty = true ++ ++format_gsm = module:option(ListValue, "format_gsm", "Raw GSM data", "") ++format_gsm:value("yes", "Load") ++format_gsm:value("no", "Do Not Load") ++format_gsm:value("auto", "Load as Required") ++format_gsm.rmempty = true ++ ++format_h263 = module:option(ListValue, "format_h263", "Raw h263 data", "") ++format_h263:value("yes", "Load") ++format_h263:value("no", "Do Not Load") ++format_h263:value("auto", "Load as Required") ++format_h263.rmempty = true ++ ++format_jpeg = module:option(ListValue, "format_jpeg", "JPEG (Joint Picture Experts Group) Image", "") ++format_jpeg:value("yes", "Load") ++format_jpeg:value("no", "Do Not Load") ++format_jpeg:value("auto", "Load as Required") ++format_jpeg.rmempty = true ++ ++format_pcm = module:option(ListValue, "format_pcm", "Raw uLaw 8khz Audio support (PCM)", "") ++format_pcm:value("yes", "Load") ++format_pcm:value("no", "Do Not Load") ++format_pcm:value("auto", "Load as Required") ++format_pcm.rmempty = true ++ ++format_pcm_alaw = module:option(ListValue, "format_pcm_alaw", "load => .so ; Raw aLaw 8khz PCM Audio support", "") ++format_pcm_alaw:value("yes", "Load") ++format_pcm_alaw:value("no", "Do Not Load") ++format_pcm_alaw:value("auto", "Load as Required") ++format_pcm_alaw.rmempty = true ++ ++format_sln = module:option(ListValue, "format_sln", "Raw Signed Linear Audio support (SLN)", "") ++format_sln:value("yes", "Load") ++format_sln:value("no", "Do Not Load") ++format_sln:value("auto", "Load as Required") ++format_sln.rmempty = true ++ ++format_vox = module:option(ListValue, "format_vox", "Dialogic VOX (ADPCM) File Format", "") ++format_vox:value("yes", "Load") ++format_vox:value("no", "Do Not Load") ++format_vox:value("auto", "Load as Required") ++format_vox.rmempty = true ++ ++format_wav = module:option(ListValue, "format_wav", "Microsoft WAV format (8000hz Signed Line", "") ++format_wav:value("yes", "Load") ++format_wav:value("no", "Do Not Load") ++format_wav:value("auto", "Load as Required") ++format_wav.rmempty = true ++ ++format_wav_gsm = module:option(ListValue, "format_wav_gsm", "Microsoft WAV format (Proprietary GSM)", "") ++format_wav_gsm:value("yes", "Load") ++format_wav_gsm:value("no", "Do Not Load") ++format_wav_gsm:value("auto", "Load as Required") ++format_wav_gsm.rmempty = true ++ ++ ++return cbimap +diff --git a/feeds/luci/applications/luci-app-asterisk/luasrc/model/cbi/asterisk-mod-func.lua b/feeds/luci/applications/luci-app-asterisk/luasrc/model/cbi/asterisk-mod-func.lua +new file mode 100644 +index 0000000..04eb974 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-asterisk/luasrc/model/cbi/asterisk-mod-func.lua +@@ -0,0 +1,29 @@ ++-- Copyright 2008 Steven Barth ++-- Copyright 2008 Jo-Philipp Wich ++-- Licensed to the public under the Apache License 2.0. ++ ++cbimap = Map("asterisk", "asterisk", "") ++ ++module = cbimap:section(TypedSection, "module", "Modules", "") ++module.anonymous = true ++ ++func_callerid = module:option(ListValue, "func_callerid", "Caller ID related dialplan functions", "") ++func_callerid:value("yes", "Load") ++func_callerid:value("no", "Do Not Load") ++func_callerid:value("auto", "Load as Required") ++func_callerid.rmempty = true ++ ++func_enum = module:option(ListValue, "func_enum", "ENUM Functions", "") ++func_enum:value("yes", "Load") ++func_enum:value("no", "Do Not Load") ++func_enum:value("auto", "Load as Required") ++func_enum.rmempty = true ++ ++func_uri = module:option(ListValue, "func_uri", "URI encoding / decoding functions", "") ++func_uri:value("yes", "Load") ++func_uri:value("no", "Do Not Load") ++func_uri:value("auto", "Load as Required") ++func_uri.rmempty = true ++ ++ ++return cbimap +diff --git a/feeds/luci/applications/luci-app-asterisk/luasrc/model/cbi/asterisk-mod-pbx.lua b/feeds/luci/applications/luci-app-asterisk/luasrc/model/cbi/asterisk-mod-pbx.lua +new file mode 100644 +index 0000000..cca4f34 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-asterisk/luasrc/model/cbi/asterisk-mod-pbx.lua +@@ -0,0 +1,53 @@ ++-- Copyright 2008 Steven Barth ++-- Copyright 2008 Jo-Philipp Wich ++-- Licensed to the public under the Apache License 2.0. ++ ++cbimap = Map("asterisk", "asterisk", "") ++ ++module = cbimap:section(TypedSection, "module", "Modules", "") ++module.anonymous = true ++ ++pbx_ael = module:option(ListValue, "pbx_ael", "Asterisk Extension Language Compiler", "") ++pbx_ael:value("yes", "Load") ++pbx_ael:value("no", "Do Not Load") ++pbx_ael:value("auto", "Load as Required") ++pbx_ael.rmempty = true ++ ++pbx_config = module:option(ListValue, "pbx_config", "Text Extension Configuration", "") ++pbx_config:value("yes", "Load") ++pbx_config:value("no", "Do Not Load") ++pbx_config:value("auto", "Load as Required") ++pbx_config.rmempty = true ++ ++pbx_functions = module:option(ListValue, "pbx_functions", "load => .so ; Builtin dialplan functions", "") ++pbx_functions:value("yes", "Load") ++pbx_functions:value("no", "Do Not Load") ++pbx_functions:value("auto", "Load as Required") ++pbx_functions.rmempty = true ++ ++pbx_loopback = module:option(ListValue, "pbx_loopback", "Loopback Switch", "") ++pbx_loopback:value("yes", "Load") ++pbx_loopback:value("no", "Do Not Load") ++pbx_loopback:value("auto", "Load as Required") ++pbx_loopback.rmempty = true ++ ++pbx_realtime = module:option(ListValue, "pbx_realtime", "Realtime Switch", "") ++pbx_realtime:value("yes", "Load") ++pbx_realtime:value("no", "Do Not Load") ++pbx_realtime:value("auto", "Load as Required") ++pbx_realtime.rmempty = true ++ ++pbx_spool = module:option(ListValue, "pbx_spool", "Outgoing Spool Support", "") ++pbx_spool:value("yes", "Load") ++pbx_spool:value("no", "Do Not Load") ++pbx_spool:value("auto", "Load as Required") ++pbx_spool.rmempty = true ++ ++pbx_wilcalu = module:option(ListValue, "pbx_wilcalu", "Wil Cal U (Auto Dialer)", "") ++pbx_wilcalu:value("yes", "Load") ++pbx_wilcalu:value("no", "Do Not Load") ++pbx_wilcalu:value("auto", "Load as Required") ++pbx_wilcalu.rmempty = true ++ ++ ++return cbimap +diff --git a/feeds/luci/applications/luci-app-asterisk/luasrc/model/cbi/asterisk-mod-res-feature.lua b/feeds/luci/applications/luci-app-asterisk/luasrc/model/cbi/asterisk-mod-res-feature.lua +new file mode 100644 +index 0000000..783aab2 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-asterisk/luasrc/model/cbi/asterisk-mod-res-feature.lua +@@ -0,0 +1,100 @@ ++-- Copyright 2008 Steven Barth ++-- Copyright 2008 Jo-Philipp Wich ++-- Licensed to the public under the Apache License 2.0. ++ ++cbimap = Map("asterisk", "asterisk", "") ++ ++featuremap = cbimap:section(TypedSection, "featuremap", "Feature Key maps", "") ++featuremap.anonymous = true ++featuremap.addremove = true ++ ++atxfer = featuremap:option(Value, "atxfer", "Attended transfer key", "") ++atxfer.rmempty = true ++ ++blindxfer = featuremap:option(Value, "blindxfer", "Blind transfer key", "") ++blindxfer.rmempty = true ++ ++disconnect = featuremap:option(Value, "disconnect", "Key to Disconnect call", "") ++disconnect.rmempty = true ++ ++parkcall = featuremap:option(Value, "parkcall", "Key to Park call", "") ++parkcall.rmempty = true ++ ++ ++featurepark = cbimap:section(TypedSection, "featurepark", "Parking Feature", "") ++featurepark.anonymous = true ++ ++parkenabled = featurepark:option(Flag, "parkenabled", "Enable Parking", "") ++ ++adsipark = featurepark:option(Flag, "adsipark", "ADSI Park", "") ++adsipark.rmempty = true ++adsipark:depends({ parkenabled = "1" }) ++ ++atxfernoanswertimeout = featurepark:option(Value, "atxfernoanswertimeout", "Attended transfer timeout (sec)", "") ++atxfernoanswertimeout.rmempty = true ++atxfernoanswertimeout:depends({ parkenabled = "1" }) ++ ++automon = featurepark:option(Value, "automon", "One touch record key", "") ++automon.rmempty = true ++automon:depends({ parkenabled = "1" }) ++ ++context = featurepark:option(Value, "context", "Name of call context for parking", "") ++context.rmempty = true ++context:depends({ parkenabled = "1" }) ++ ++courtesytone = featurepark:option(Value, "courtesytone", "Sound file to play to parked caller", "") ++courtesytone.rmempty = true ++courtesytone:depends({ parkenabled = "1" }) ++ ++featuredigittimeout = featurepark:option(Value, "featuredigittimeout", "Max time (ms) between digits for feature activation", "") ++featuredigittimeout.rmempty = true ++featuredigittimeout:depends({ parkenabled = "1" }) ++ ++findslot = featurepark:option(ListValue, "findslot", "Method to Find Parking slot", "") ++findslot:value("first", "First available slot") ++findslot:value("next", "Next free parking space") ++findslot.rmempty = true ++findslot:depends({ parkenabled = "1" }) ++ ++parkedmusicclass = featurepark:option(ListValue, "parkedmusicclass", "Music on Hold class for the parked channel", "") ++parkedmusicclass.titleref = luci.dispatcher.build_url( "admin", "services", "asterisk" ) ++parkedmusicclass:depends({ parkenabled = "1" }) ++cbimap.uci:foreach( "asterisk", "moh", function(s) parkedmusicclass:value(s['.name']) end ) ++ ++parkedplay = featurepark:option(ListValue, "parkedplay", "Play courtesy tone to", "") ++parkedplay:value("caller", "Caller") ++parkedplay:value("parked", "Parked user") ++parkedplay:value("both", "Both") ++parkedplay.rmempty = true ++parkedplay:depends({ parkenabled = "1" }) ++ ++parkext = featurepark:option(Value, "parkext", "Extension to dial to park", "") ++parkext.rmempty = true ++parkext:depends({ parkenabled = "1" }) ++ ++parkingtime = featurepark:option(Value, "parkingtime", "Parking time (secs)", "") ++parkingtime.rmempty = true ++parkingtime:depends({ parkenabled = "1" }) ++ ++parkpos = featurepark:option(Value, "parkpos", "Range of extensions for call parking", "") ++parkpos.rmempty = true ++parkpos:depends({ parkenabled = "1" }) ++ ++pickupexten = featurepark:option(Value, "pickupexten", "Pickup extension", "") ++pickupexten.rmempty = true ++pickupexten:depends({ parkenabled = "1" }) ++ ++transferdigittimeout = featurepark:option(Value, "transferdigittimeout", "Seconds to wait bewteen digits when transferring", "") ++transferdigittimeout.rmempty = true ++transferdigittimeout:depends({ parkenabled = "1" }) ++ ++xferfailsound = featurepark:option(Value, "xferfailsound", "sound when attended transfer is complete", "") ++xferfailsound.rmempty = true ++xferfailsound:depends({ parkenabled = "1" }) ++ ++xfersound = featurepark:option(Value, "xfersound", "Sound when attended transfer fails", "") ++xfersound.rmempty = true ++xfersound:depends({ parkenabled = "1" }) ++ ++ ++return cbimap +diff --git a/feeds/luci/applications/luci-app-asterisk/luasrc/model/cbi/asterisk-mod-res.lua b/feeds/luci/applications/luci-app-asterisk/luasrc/model/cbi/asterisk-mod-res.lua +new file mode 100644 +index 0000000..4bef199 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-asterisk/luasrc/model/cbi/asterisk-mod-res.lua +@@ -0,0 +1,77 @@ ++-- Copyright 2008 Steven Barth ++-- Copyright 2008 Jo-Philipp Wich ++-- Licensed to the public under the Apache License 2.0. ++ ++cbimap = Map("asterisk", "asterisk", "") ++ ++module = cbimap:section(TypedSection, "module", "Modules", "") ++module.anonymous = true ++ ++res_config_mysql = module:option(ListValue, "res_config_mysql", "MySQL Config Resource", "") ++res_config_mysql:value("yes", "Load") ++res_config_mysql:value("no", "Do Not Load") ++res_config_mysql:value("auto", "Load as Required") ++res_config_mysql.rmempty = true ++ ++res_config_odbc = module:option(ListValue, "res_config_odbc", "ODBC Config Resource", "") ++res_config_odbc:value("yes", "Load") ++res_config_odbc:value("no", "Do Not Load") ++res_config_odbc:value("auto", "Load as Required") ++res_config_odbc.rmempty = true ++ ++res_config_pgsql = module:option(ListValue, "res_config_pgsql", "PGSQL Module", "") ++res_config_pgsql:value("yes", "Load") ++res_config_pgsql:value("no", "Do Not Load") ++res_config_pgsql:value("auto", "Load as Required") ++res_config_pgsql.rmempty = true ++ ++res_crypto = module:option(ListValue, "res_crypto", "Cryptographic Digital Signatures", "") ++res_crypto:value("yes", "Load") ++res_crypto:value("no", "Do Not Load") ++res_crypto:value("auto", "Load as Required") ++res_crypto.rmempty = true ++ ++res_features = module:option(ListValue, "res_features", "Call Parking Resource", "") ++res_features:value("yes", "Load") ++res_features:value("no", "Do Not Load") ++res_features:value("auto", "Load as Required") ++res_features.rmempty = true ++ ++res_indications = module:option(ListValue, "res_indications", "Indications Configuration", "") ++res_indications:value("yes", "Load") ++res_indications:value("no", "Do Not Load") ++res_indications:value("auto", "Load as Required") ++res_indications.rmempty = true ++ ++res_monitor = module:option(ListValue, "res_monitor", "Call Monitoring Resource", "") ++res_monitor:value("yes", "Load") ++res_monitor:value("no", "Do Not Load") ++res_monitor:value("auto", "Load as Required") ++res_monitor.rmempty = true ++ ++res_musiconhold = module:option(ListValue, "res_musiconhold", "Music On Hold Resource", "") ++res_musiconhold:value("yes", "Load") ++res_musiconhold:value("no", "Do Not Load") ++res_musiconhold:value("auto", "Load as Required") ++res_musiconhold.rmempty = true ++ ++res_odbc = module:option(ListValue, "res_odbc", "ODBC Resource", "") ++res_odbc:value("yes", "Load") ++res_odbc:value("no", "Do Not Load") ++res_odbc:value("auto", "Load as Required") ++res_odbc.rmempty = true ++ ++res_smdi = module:option(ListValue, "res_smdi", "SMDI Module", "") ++res_smdi:value("yes", "Load") ++res_smdi:value("no", "Do Not Load") ++res_smdi:value("auto", "Load as Required") ++res_smdi.rmempty = true ++ ++res_snmp = module:option(ListValue, "res_snmp", "SNMP Module", "") ++res_snmp:value("yes", "Load") ++res_snmp:value("no", "Do Not Load") ++res_snmp:value("auto", "Load as Required") ++res_snmp.rmempty = true ++ ++ ++return cbimap +diff --git a/feeds/luci/applications/luci-app-asterisk/luasrc/model/cbi/asterisk-sip-connections.lua b/feeds/luci/applications/luci-app-asterisk/luasrc/model/cbi/asterisk-sip-connections.lua +new file mode 100644 +index 0000000..a095ec3 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-asterisk/luasrc/model/cbi/asterisk-sip-connections.lua +@@ -0,0 +1,98 @@ ++-- Copyright 2008 Steven Barth ++-- Copyright 2008 Jo-Philipp Wich ++-- Licensed to the public under the Apache License 2.0. ++ ++cbimap = Map("asterisk", "asterisk", "") ++ ++sip = cbimap:section(TypedSection, "sip", "SIP Connection", "") ++sip.addremove = true ++ ++alwaysinternational = sip:option(Flag, "alwaysinternational", "Always Dial International", "") ++alwaysinternational.optional = true ++ ++canreinvite = sip:option(ListValue, "canreinvite", "Reinvite/redirect media connections", "") ++canreinvite:value("yes", "Yes") ++canreinvite:value("nonat", "Yes when not behind NAT") ++canreinvite:value("update", "Use UPDATE rather than INVITE for path redirection") ++canreinvite:value("no", "No") ++canreinvite.optional = true ++ ++context = sip:option(ListValue, "context", "Context to use", "") ++context.titleref = luci.dispatcher.build_url( "admin", "services", "asterisk", "dialplans" ) ++cbimap.uci:foreach( "asterisk", "dialplan", function(s) context:value(s['.name']) end ) ++cbimap.uci:foreach( "asterisk", "dialzone", function(s) context:value(s['.name']) end ) ++ ++countrycode = sip:option(Value, "countrycode", "Country Code for connection", "") ++countrycode.optional = true ++ ++dtmfmode = sip:option(ListValue, "dtmfmode", "DTMF mode", "") ++dtmfmode:value("info", "Use RFC2833 or INFO for the BudgeTone") ++dtmfmode:value("rfc2833", "Use RFC2833 for the BudgeTone") ++dtmfmode:value("inband", "Use Inband (only with ulaw/alaw)") ++dtmfmode.optional = true ++ ++extension = sip:option(Value, "extension", "Add as Extension", "") ++extension.optional = true ++ ++fromdomain = sip:option(Value, "fromdomain", "Primary domain identity for From: headers", "") ++fromdomain.optional = true ++ ++fromuser = sip:option(Value, "fromuser", "From user (required by many SIP providers)", "") ++fromuser.optional = true ++ ++host = sip:option(Value, "host", "Host name (or blank)", "") ++host.optional = true ++ ++incoming = sip:option(DynamicList, "incoming", "Ring on incoming dialplan contexts", "") ++incoming.optional = true ++ ++insecure = sip:option(ListValue, "insecure", "Allow Insecure for", "") ++insecure:value("port", "Allow mismatched port number") ++insecure:value("invite", "Do not require auth of incoming INVITE") ++insecure:value("port,invite", "Allow mismatched port and Do not require auth of incoming INVITE") ++insecure.optional = true ++ ++internationalprefix = sip:option(Value, "internationalprefix", "International Dial Prefix", "") ++internationalprefix.optional = true ++ ++mailbox = sip:option(Value, "mailbox", "Mailbox for MWI", "") ++mailbox.optional = true ++ ++nat = sip:option(Flag, "nat", "NAT between phone and Asterisk", "") ++nat.optional = true ++ ++pedantic = sip:option(Flag, "pedantic", "Check tags in headers", "") ++pedantic.optional = true ++ ++port = sip:option(Value, "port", "SIP Port", "") ++port.optional = true ++ ++prefix = sip:option(Value, "prefix", "Dial Prefix (for external line)", "") ++prefix.optional = true ++ ++qualify = sip:option(Value, "qualify", "Reply Timeout (ms) for down connection", "") ++qualify.optional = true ++ ++register = sip:option(Flag, "register", "Register connection", "") ++register.optional = true ++ ++secret = sip:option(Value, "secret", "Secret", "") ++secret.optional = true ++ ++selfmailbox = sip:option(Flag, "selfmailbox", "Dial own extension for mailbox", "") ++selfmailbox.optional = true ++ ++timeout = sip:option(Value, "timeout", "Dial Timeout (sec)", "") ++timeout.optional = true ++ ++type = sip:option(ListValue, "type", "Client Type", "") ++type:value("friend", "Friend (outbound/inbound)") ++type:value("user", "User (inbound - authenticate by \"from\")") ++type:value("peer", "Peer (outbound - match by host)") ++type.optional = true ++ ++username = sip:option(Value, "username", "Username", "") ++username.optional = true ++ ++ ++return cbimap +diff --git a/feeds/luci/applications/luci-app-asterisk/luasrc/model/cbi/asterisk-voice.lua b/feeds/luci/applications/luci-app-asterisk/luasrc/model/cbi/asterisk-voice.lua +new file mode 100644 +index 0000000..7341dfb +--- /dev/null ++++ b/feeds/luci/applications/luci-app-asterisk/luasrc/model/cbi/asterisk-voice.lua +@@ -0,0 +1,41 @@ ++-- Copyright 2008 Steven Barth ++-- Copyright 2008 Jo-Philipp Wich ++-- Licensed to the public under the Apache License 2.0. ++ ++cbimap = Map("asterisk", "asterisk", "") ++ ++voicegeneral = cbimap:section(TypedSection, "voicegeneral", "Voicemail general options", "") ++ ++serveremail = voicegeneral:option(Value, "serveremail", "From Email address of server", "") ++ ++ ++voicemail = cbimap:section(TypedSection, "voicemail", "Voice Mail boxes", "") ++voicemail.addremove = true ++ ++attach = voicemail:option(Flag, "attach", "Email contains attachment", "") ++attach.rmempty = true ++ ++email = voicemail:option(Value, "email", "Email", "") ++email.rmempty = true ++ ++name = voicemail:option(Value, "name", "Display Name", "") ++name.rmempty = true ++ ++password = voicemail:option(Value, "password", "Password", "") ++password.rmempty = true ++ ++zone = voicemail:option(ListValue, "zone", "Voice Zone", "") ++cbimap.uci:foreach( "asterisk", "voicezone", function(s) zone:value(s['.name']) end ) ++ ++ ++voicezone = cbimap:section(TypedSection, "voicezone", "Voice Zone settings", "") ++voicezone.addremove = true ++ ++message = voicezone:option(Value, "message", "Message Format", "") ++message.rmempty = true ++ ++zone = voicezone:option(Value, "zone", "Time Zone", "") ++zone.rmempty = true ++ ++ ++return cbimap +diff --git a/feeds/luci/applications/luci-app-asterisk/luasrc/model/cbi/asterisk.lua b/feeds/luci/applications/luci-app-asterisk/luasrc/model/cbi/asterisk.lua +new file mode 100644 +index 0000000..026aab4 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-asterisk/luasrc/model/cbi/asterisk.lua +@@ -0,0 +1,151 @@ ++-- Copyright 2008 Steven Barth ++-- Copyright 2008 Jo-Philipp Wich ++-- Licensed to the public under the Apache License 2.0. ++ ++cbimap = Map("asterisk", "asterisk", "") ++ ++asterisk = cbimap:section(TypedSection, "asterisk", "Asterisk General Options", "") ++asterisk.anonymous = true ++ ++agidir = asterisk:option(Value, "agidir", "AGI directory", "") ++agidir.rmempty = true ++ ++cache_record_files = asterisk:option(Flag, "cache_record_files", "Cache recorded sound files during recording", "") ++cache_record_files.rmempty = true ++ ++debug = asterisk:option(Value, "debug", "Debug Level", "") ++debug.rmempty = true ++ ++dontwarn = asterisk:option(Flag, "dontwarn", "Disable some warnings", "") ++dontwarn.rmempty = true ++ ++dumpcore = asterisk:option(Flag, "dumpcore", "Dump core on crash", "") ++dumpcore.rmempty = true ++ ++highpriority = asterisk:option(Flag, "highpriority", "High Priority", "") ++highpriority.rmempty = true ++ ++initcrypto = asterisk:option(Flag, "initcrypto", "Initialise Crypto", "") ++initcrypto.rmempty = true ++ ++internal_timing = asterisk:option(Flag, "internal_timing", "Use Internal Timing", "") ++internal_timing.rmempty = true ++ ++logdir = asterisk:option(Value, "logdir", "Log directory", "") ++logdir.rmempty = true ++ ++maxcalls = asterisk:option(Value, "maxcalls", "Maximum number of calls allowed", "") ++maxcalls.rmempty = true ++ ++maxload = asterisk:option(Value, "maxload", "Maximum load to stop accepting new calls", "") ++maxload.rmempty = true ++ ++nocolor = asterisk:option(Flag, "nocolor", "Disable console colors", "") ++nocolor.rmempty = true ++ ++record_cache_dir = asterisk:option(Value, "record_cache_dir", "Sound files Cache directory", "") ++record_cache_dir.rmempty = true ++record_cache_dir:depends({ ["cache_record_files"] = "true" }) ++ ++rungroup = asterisk:option(Flag, "rungroup", "The Group to run as", "") ++rungroup.rmempty = true ++ ++runuser = asterisk:option(Flag, "runuser", "The User to run as", "") ++runuser.rmempty = true ++ ++spooldir = asterisk:option(Value, "spooldir", "Voicemail Spool directory", "") ++spooldir.rmempty = true ++ ++systemname = asterisk:option(Value, "systemname", "Prefix UniquID with system name", "") ++systemname.rmempty = true ++ ++transcode_via_sln = asterisk:option(Flag, "transcode_via_sln", "Build transcode paths via SLINEAR, not directly", "") ++transcode_via_sln.rmempty = true ++ ++transmit_silence_during_record = asterisk:option(Flag, "transmit_silence_during_record", "Transmit SLINEAR silence while recording a channel", "") ++transmit_silence_during_record.rmempty = true ++ ++verbose = asterisk:option(Value, "verbose", "Verbose Level", "") ++verbose.rmempty = true ++ ++zone = asterisk:option(Value, "zone", "Time Zone", "") ++zone.rmempty = true ++ ++ ++hardwarereboot = cbimap:section(TypedSection, "hardwarereboot", "Reload Hardware Config", "") ++ ++method = hardwarereboot:option(ListValue, "method", "Reboot Method", "") ++method:value("web", "Web URL (wget)") ++method:value("system", "program to run") ++method.rmempty = true ++ ++param = hardwarereboot:option(Value, "param", "Parameter", "") ++param.rmempty = true ++ ++ ++iaxgeneral = cbimap:section(TypedSection, "iaxgeneral", "IAX General Options", "") ++iaxgeneral.anonymous = true ++iaxgeneral.addremove = true ++ ++allow = iaxgeneral:option(MultiValue, "allow", "Allow Codecs", "") ++allow:value("alaw", "alaw") ++allow:value("gsm", "gsm") ++allow:value("g726", "g726") ++allow.rmempty = true ++ ++canreinvite = iaxgeneral:option(ListValue, "canreinvite", "Reinvite/redirect media connections", "") ++canreinvite:value("yes", "Yes") ++canreinvite:value("nonat", "Yes when not behind NAT") ++canreinvite:value("update", "Use UPDATE rather than INVITE for path redirection") ++canreinvite:value("no", "No") ++canreinvite.rmempty = true ++ ++static = iaxgeneral:option(Flag, "static", "Static", "") ++static.rmempty = true ++ ++writeprotect = iaxgeneral:option(Flag, "writeprotect", "Write Protect", "") ++writeprotect.rmempty = true ++ ++ ++sipgeneral = cbimap:section(TypedSection, "sipgeneral", "Section sipgeneral", "") ++sipgeneral.anonymous = true ++sipgeneral.addremove = true ++ ++allow = sipgeneral:option(MultiValue, "allow", "Allow codecs", "") ++allow:value("ulaw", "ulaw") ++allow:value("alaw", "alaw") ++allow:value("gsm", "gsm") ++allow:value("g726", "g726") ++allow.rmempty = true ++ ++port = sipgeneral:option(Value, "port", "SIP Port", "") ++port.rmempty = true ++ ++realm = sipgeneral:option(Value, "realm", "SIP realm", "") ++realm.rmempty = true ++ ++ ++moh = cbimap:section(TypedSection, "moh", "Music On Hold", "") ++ ++application = moh:option(Value, "application", "Application", "") ++application.rmempty = true ++application:depends({ ["asterisk.moh.mode"] = "custom" }) ++ ++directory = moh:option(Value, "directory", "Directory of Music", "") ++directory.rmempty = true ++ ++mode = moh:option(ListValue, "mode", "Option mode", "") ++mode:value("system", "program to run") ++mode:value("files", "Read files from directory") ++mode:value("quietmp3", "Quite MP3") ++mode:value("mp3", "Loud MP3") ++mode:value("mp3nb", "unbuffered MP3") ++mode:value("quietmp3nb", "Quiet Unbuffered MP3") ++mode:value("custom", "Run a custom application") ++mode.rmempty = true ++ ++random = moh:option(Flag, "random", "Random Play", "") ++random.rmempty = true ++ ++ ++return cbimap +diff --git a/feeds/luci/applications/luci-app-asterisk/luasrc/model/cbi/asterisk/dialplan_out.lua b/feeds/luci/applications/luci-app-asterisk/luasrc/model/cbi/asterisk/dialplan_out.lua +new file mode 100644 +index 0000000..b4c81bb +--- /dev/null ++++ b/feeds/luci/applications/luci-app-asterisk/luasrc/model/cbi/asterisk/dialplan_out.lua +@@ -0,0 +1,125 @@ ++-- Copyright 2008 Jo-Philipp Wich ++-- Licensed to the public under the Apache License 2.0. ++ ++local ast = require("luci.asterisk") ++ ++local function find_outgoing_contexts(uci) ++ local c = { } ++ local h = { } ++ ++-- uci:foreach("asterisk", "dialplan", ++-- function(s) ++-- if not h[s['.name']] then ++-- c[#c+1] = { s['.name'], "Dialplan: %s" % s['.name'] } ++-- h[s['.name']] = true ++-- end ++-- end) ++ ++ uci:foreach("asterisk", "dialzone", ++ function(s) ++ if not h[s['.name']] then ++ c[#c+1] = { s['.name'], "Dialzone: %s" % s['.name'] } ++ h[s['.name']] = true ++ end ++ end) ++ ++ return c ++end ++ ++local function find_incoming_contexts(uci) ++ local c = { } ++ local h = { } ++ ++ uci:foreach("asterisk", "sip", ++ function(s) ++ if s.context and not h[s.context] and ++ uci:get_bool("asterisk", s['.name'], "provider") ++ then ++ c[#c+1] = { s.context, "Incoming: %s" % s['.name'] or s.context } ++ h[s.context] = true ++ end ++ end) ++ ++ return c ++end ++ ++local function find_trunks(uci) ++ local t = { } ++ ++ uci:foreach("asterisk", "sip", ++ function(s) ++ if uci:get_bool("asterisk", s['.name'], "provider") then ++ t[#t+1] = { ++ "SIP/%s" % s['.name'], ++ "SIP: %s" % s['.name'] ++ } ++ end ++ end) ++ ++ uci:foreach("asterisk", "iax", ++ function(s) ++ t[#t+1] = { ++ "IAX/%s" % s['.name'], ++ "IAX: %s" % s.extension or s['.name'] ++ } ++ end) ++ ++ return t ++end ++ ++--[[ ++ ++dialzone {name} - Outgoing zone. ++ uses - Outgoing line to use: TYPE/Name ++ match (list) - Number to match ++ countrycode - The effective country code of this dialzone ++ international (list) - International prefix to match ++ localzone - dialzone for local numbers ++ addprefix - Prexix required to dial out. ++ localprefix - Prefix for a local call ++ ++]] ++ ++ ++-- ++-- SIP dialzone configuration ++-- ++if arg[1] then ++ cbimap = Map("asterisk", "Edit Dialplan Entry") ++ ++ entry = cbimap:section(NamedSection, arg[1]) ++ ++ back = entry:option(DummyValue, "_overview", "Back to dialplan overview") ++ back.value = "" ++ back.titleref = luci.dispatcher.build_url("admin", "asterisk", "dialplans") ++ ++ desc = entry:option(Value, "description", "Description") ++ function desc.cfgvalue(self, s, ...) ++ return Value.cfgvalue(self, s, ...) or s ++ end ++ ++ match = entry:option(DynamicList, "match", "Number matches") ++ ++ intl = entry:option(DynamicList, "international", "Intl. prefix matches (optional)") ++ ++ trunk = entry:option(MultiValue, "uses", "Used trunk") ++ for _, v in ipairs(find_trunks(cbimap.uci)) do ++ trunk:value(unpack(v)) ++ end ++ ++ aprefix = entry:option(Value, "addprefix", "Add prefix to dial out (optional)") ++ --ast.idd.cbifill(aprefix) ++ ++ ccode = entry:option(Value, "countrycode", "Effective countrycode (optional)") ++ ast.cc.cbifill(ccode) ++ ++ lzone = entry:option(ListValue, "localzone", "Dialzone for local numbers") ++ lzone:value("", "no special treatment of local numbers") ++ for _, v in ipairs(find_outgoing_contexts(cbimap.uci)) do ++ lzone:value(unpack(v)) ++ end ++ ++ lprefix = entry:option(Value, "localprefix", "Prefix for local calls (optional)") ++ ++ return cbimap ++end +diff --git a/feeds/luci/applications/luci-app-asterisk/luasrc/model/cbi/asterisk/dialplans.lua b/feeds/luci/applications/luci-app-asterisk/luasrc/model/cbi/asterisk/dialplans.lua +new file mode 100644 +index 0000000..4ffeca4 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-asterisk/luasrc/model/cbi/asterisk/dialplans.lua +@@ -0,0 +1,103 @@ ++-- Copyright 2008 Jo-Philipp Wich ++-- Licensed to the public under the Apache License 2.0. ++ ++local ast = require("luci.asterisk") ++ ++cbimap = Map("asterisk", "Registered Trunks") ++cbimap.pageaction = false ++ ++local sip_peers = { } ++cbimap.uci:foreach("asterisk", "sip", ++ function(s) ++ if s.type == "peer" then ++ s.name = s['.name'] ++ s.info = ast.sip.peer(s.name) ++ sip_peers[s.name] = s ++ end ++ end) ++ ++ ++sip_table = cbimap:section(TypedSection, "sip", "SIP Trunks") ++sip_table.template = "cbi/tblsection" ++sip_table.extedit = luci.dispatcher.build_url("admin", "asterisk", "trunks", "sip", "%s") ++sip_table.addremove = true ++sip_table.sectionhead = "Extension" ++ ++function sip_table.filter(self, s) ++ return s and ( ++ cbimap.uci:get("asterisk", s, "type") == nil or ++ cbimap.uci:get_bool("asterisk", s, "provider") ++ ) ++end ++ ++function sip_table.create(self, section) ++ if TypedSection.create(self, section) then ++ created = section ++ else ++ self.invalid_cts = true ++ end ++end ++ ++function sip_table.parse(self, ...) ++ TypedSection.parse(self, ...) ++ if created then ++ cbimap.uci:tset("asterisk", created, { ++ type = "friend", ++ qualify = "yes", ++ provider = "yes" ++ }) ++ ++ cbimap.uci:save("asterisk") ++ luci.http.redirect(luci.dispatcher.build_url( ++ "admin", "asterisk", "trunks", "sip", created ++ )) ++ end ++end ++ ++ ++user = sip_table:option(DummyValue, "username", "Username") ++ ++host = sip_table:option(DummyValue, "host", "Hostname") ++function host.cfgvalue(self, s) ++ if sip_peers[s] and sip_peers[s].info.address then ++ return "%s:%i" %{ sip_peers[s].info.address, sip_peers[s].info.port } ++ else ++ return "n/a" ++ end ++end ++ ++context = sip_table:option(DummyValue, "context", "Dialplan") ++context.href = luci.dispatcher.build_url("admin", "asterisk", "dialplan") ++function context.cfgvalue(...) ++ return AbstractValue.cfgvalue(...) or "(default)" ++end ++ ++online = sip_table:option(DummyValue, "online", "Registered") ++function online.cfgvalue(self, s) ++ if sip_peers[s] and sip_peers[s].info.online == nil then ++ return "n/a" ++ else ++ return sip_peers[s] and sip_peers[s].info.online ++ and "yes" or "no (%s)" %{ ++ sip_peers[s] and sip_peers[s].info.Status:lower() or "unknown" ++ } ++ end ++end ++ ++delay = sip_table:option(DummyValue, "delay", "Delay") ++function delay.cfgvalue(self, s) ++ if sip_peers[s] and sip_peers[s].info.online then ++ return "%i ms" % sip_peers[s].info.delay ++ else ++ return "n/a" ++ end ++end ++ ++info = sip_table:option(Button, "_info", "Info") ++function info.write(self, s) ++ luci.http.redirect(luci.dispatcher.build_url( ++ "admin", "asterisk", "trunks", "sip", s, "info" ++ )) ++end ++ ++return cbimap +diff --git a/feeds/luci/applications/luci-app-asterisk/luasrc/model/cbi/asterisk/dialzones.lua b/feeds/luci/applications/luci-app-asterisk/luasrc/model/cbi/asterisk/dialzones.lua +new file mode 100644 +index 0000000..5585c06 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-asterisk/luasrc/model/cbi/asterisk/dialzones.lua +@@ -0,0 +1,123 @@ ++-- Copyright 2008 Jo-Philipp Wich ++-- Licensed to the public under the Apache License 2.0. ++ ++local ast = require("luci.asterisk") ++local uci = require("luci.model.uci").cursor() ++ ++--[[ ++ Dialzone overview table ++]] ++ ++if not arg[1] then ++ zonemap = Map("asterisk", "Dial Zones", [[ ++ Dial zones hold patterns of dialed numbers to match. ++ Each zone has one or more trunks assigned. If the first trunk is ++ congested, Asterisk will try to use the next available connection. ++ If all trunks fail, then the following zones in the parent dialplan ++ are tried. ++ ]]) ++ ++ local zones, znames = ast.dialzone.zones() ++ ++ zonetbl = zonemap:section(Table, zones, "Zone Overview") ++ zonetbl.sectionhead = "Zone" ++ zonetbl.addremove = true ++ zonetbl.anonymous = false ++ zonetbl.extedit = luci.dispatcher.build_url( ++ "admin", "asterisk", "dialplans", "zones", "%s" ++ ) ++ ++ function zonetbl.cfgsections(self) ++ return znames ++ end ++ ++ function zonetbl.parse(self) ++ for k, v in pairs(self.map:formvaluetable( ++ luci.cbi.REMOVE_PREFIX .. self.config ++ ) or {}) do ++ if k:sub(-2) == ".x" then k = k:sub(1, #k - 2) end ++ uci:delete("asterisk", k) ++ uci:save("asterisk") ++ self.data[k] = nil ++ for i = 1,#znames do ++ if znames[i] == k then ++ table.remove(znames, i) ++ break ++ end ++ end ++ end ++ ++ Table.parse(self) ++ end ++ ++ zonetbl:option(DummyValue, "description", "Description") ++ zonetbl:option(DummyValue, "addprefix") ++ ++ match = zonetbl:option(DummyValue, "matches") ++ function match.cfgvalue(self, s) ++ return table.concat(zones[s].matches, ", ") ++ end ++ ++ trunks = zonetbl:option(DummyValue, "trunk") ++ trunks.template = "asterisk/cbi/cell" ++ function trunks.cfgvalue(self, s) ++ return ast.tools.hyperlinks(zones[s].trunks) ++ end ++ ++ return zonemap ++ ++--[[ ++ Zone edit form ++]] ++ ++else ++ zoneedit = Map("asterisk", "Edit Dialzone") ++ ++ entry = zoneedit:section(NamedSection, arg[1]) ++ entry.title = "Zone %q" % arg[1]; ++ ++ back = entry:option(DummyValue, "_overview", "Back to dialzone overview") ++ back.value = "" ++ back.titleref = luci.dispatcher.build_url( ++ "admin", "asterisk", "dialplans", "zones" ++ ) ++ ++ desc = entry:option(Value, "description", "Description") ++ function desc.cfgvalue(self, s, ...) ++ return Value.cfgvalue(self, s, ...) or s ++ end ++ ++ trunks = entry:option(MultiValue, "uses", "Used trunks") ++ trunks.widget = "checkbox" ++ uci:foreach("asterisk", "sip", ++ function(s) ++ if s.provider == "yes" then ++ trunks:value( ++ "SIP/%s" % s['.name'], ++ "SIP/%s (%s)" %{ s['.name'], s.host or 'n/a' } ++ ) ++ end ++ end) ++ ++ ++ match = entry:option(DynamicList, "match", "Number matches") ++ ++ intl = entry:option(DynamicList, "international", "Intl. prefix matches (optional)") ++ ++ aprefix = entry:option(Value, "addprefix", "Add prefix to dial out (optional)") ++ ccode = entry:option(Value, "countrycode", "Effective countrycode (optional)") ++ ++ lzone = entry:option(ListValue, "localzone", "Dialzone for local numbers") ++ lzone:value("", "no special treatment of local numbers") ++ for _, z in ipairs(ast.dialzone.zones()) do ++ lzone:value(z.name, "%q (%s)" %{ z.name, z.description }) ++ end ++ --for _, v in ipairs(find_outgoing_contexts(zoneedit.uci)) do ++ -- lzone:value(unpack(v)) ++ --end ++ ++ lprefix = entry:option(Value, "localprefix", "Prefix for local calls (optional)") ++ ++ return zoneedit ++ ++end +diff --git a/feeds/luci/applications/luci-app-asterisk/luasrc/model/cbi/asterisk/meetme.lua b/feeds/luci/applications/luci-app-asterisk/luasrc/model/cbi/asterisk/meetme.lua +new file mode 100644 +index 0000000..e409d70 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-asterisk/luasrc/model/cbi/asterisk/meetme.lua +@@ -0,0 +1,38 @@ ++-- Copyright 2009 Jo-Philipp Wich ++-- Licensed to the public under the Apache License 2.0. ++ ++local ast = require "luci.asterisk" ++ ++cbimap = Map("asterisk", "MeetMe - Rooms") ++ ++meetme = cbimap:section(TypedSection, "meetme", "MeetMe Rooms") ++meetme.addremove = true ++meetme.anonymous = true ++meetme.template = "cbi/tblsection" ++meetme:option(Value, "_description", "Description", "Short room description") ++ ++room = meetme:option(Value, "room", "Room Number", "Unique room identifier") ++ ++function room.write(self, s, val) ++ if val and #val > 0 then ++ local old = self:cfgvalue(s) ++ self.map.uci:foreach("asterisk", "dialplanmeetme", ++ function(v) ++ if v.room == old then ++ self.map:set(v['.name'], "room", val) ++ end ++ end) ++ Value.write(self, s, val) ++ end ++end ++ ++ ++meetme:option(Value, "pin", "PIN", "PIN required to access") ++meetme:option(Value, "adminpin", "Admin PIN", "PIN required for administration") ++ ++function meetme.remove(self, s) ++ return ast.meetme.remove(self.map:get(s, "room"), self.map.uci) ++end ++ ++ ++return cbimap +diff --git a/feeds/luci/applications/luci-app-asterisk/luasrc/model/cbi/asterisk/meetme_settings.lua b/feeds/luci/applications/luci-app-asterisk/luasrc/model/cbi/asterisk/meetme_settings.lua +new file mode 100644 +index 0000000..9e5aed7 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-asterisk/luasrc/model/cbi/asterisk/meetme_settings.lua +@@ -0,0 +1,17 @@ ++-- Copyright 2009 Jo-Philipp Wich ++-- Licensed to the public under the Apache License 2.0. ++ ++cbimap = Map("asterisk", "MeetMe - Common Settings", ++ "Common settings for MeetMe phone conferences.") ++ ++meetme = cbimap:section(TypedSection, "meetmegeneral", "General MeetMe Options") ++meetme.addremove = false ++meetme.anonymous = true ++ ++audiobuffers = meetme:option(ListValue, "audiobuffers", ++ "Number of 20ms audio buffers to use for conferences") ++ ++for i = 2, 32 do audiobuffers:value(i) end ++ ++ ++return cbimap +diff --git a/feeds/luci/applications/luci-app-asterisk/luasrc/model/cbi/asterisk/phone_sip.lua b/feeds/luci/applications/luci-app-asterisk/luasrc/model/cbi/asterisk/phone_sip.lua +new file mode 100644 +index 0000000..01dfc16 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-asterisk/luasrc/model/cbi/asterisk/phone_sip.lua +@@ -0,0 +1,145 @@ ++-- Copyright 2008 Jo-Philipp Wich ++-- Licensed to the public under the Apache License 2.0. ++ ++local ast = require("luci.asterisk") ++ ++local function find_outgoing_contexts(uci) ++ local c = { } ++ local h = { } ++ ++ uci:foreach("asterisk", "dialplan", ++ function(s) ++ if not h[s['.name']] then ++ c[#c+1] = { s['.name'], "Dialplan: %s" % s['.name'] } ++ h[s['.name']] = true ++ end ++ end) ++ ++ return c ++end ++ ++local function find_incoming_contexts(uci) ++ local c = { } ++ local h = { } ++ ++ uci:foreach("asterisk", "sip", ++ function(s) ++ if s.context and not h[s.context] and ++ uci:get_bool("asterisk", s['.name'], "provider") ++ then ++ c[#c+1] = { s.context, "Incoming: %s" % s['.name'] or s.context } ++ h[s.context] = true ++ end ++ end) ++ ++ return c ++end ++ ++ ++-- ++-- SIP phone info ++-- ++if arg[2] == "info" then ++ form = SimpleForm("asterisk", "SIP Phone Information") ++ form.reset = false ++ form.submit = "Back to overview" ++ ++ local info, keys = ast.sip.peer(arg[1]) ++ local data = { } ++ ++ for _, key in ipairs(keys) do ++ data[#data+1] = { ++ key = key, ++ val = type(info[key]) == "boolean" ++ and ( info[key] and "yes" or "no" ) ++ or ( info[key] == nil or #info[key] == 0 ) ++ and "(none)" ++ or tostring(info[key]) ++ } ++ end ++ ++ itbl = form:section(Table, data, "SIP Phone %q" % arg[1]) ++ itbl:option(DummyValue, "key", "Key") ++ itbl:option(DummyValue, "val", "Value") ++ ++ function itbl.parse(...) ++ luci.http.redirect( ++ luci.dispatcher.build_url("admin", "asterisk", "phones") ++ ) ++ end ++ ++ return form ++ ++-- ++-- SIP phone configuration ++-- ++elseif arg[1] then ++ cbimap = Map("asterisk", "Edit SIP Client") ++ ++ peer = cbimap:section(NamedSection, arg[1]) ++ peer.hidden = { ++ type = "friend", ++ qualify = "yes", ++ host = "dynamic", ++ nat = "no", ++ canreinvite = "no" ++ } ++ ++ back = peer:option(DummyValue, "_overview", "Back to phone overview") ++ back.value = "" ++ back.titleref = luci.dispatcher.build_url("admin", "asterisk", "phones") ++ ++ active = peer:option(Flag, "disable", "Account enabled") ++ active.enabled = "yes" ++ active.disabled = "no" ++ function active.cfgvalue(...) ++ return AbstractValue.cfgvalue(...) or "yes" ++ end ++ ++ exten = peer:option(Value, "extension", "Extension Number") ++ cbimap.uci:foreach("asterisk", "dialplanexten", ++ function(s) ++ exten:value( ++ s.extension, ++ "%s (via %s/%s)" %{ s.extension, s.type:upper(), s.target } ++ ) ++ end) ++ ++ display = peer:option(Value, "callerid", "Display Name") ++ ++ username = peer:option(Value, "username", "Authorization ID") ++ password = peer:option(Value, "secret", "Authorization Password") ++ password.password = true ++ ++ regtimeout = peer:option(Value, "registertimeout", "Registration Time Value") ++ function regtimeout.cfgvalue(...) ++ return AbstractValue.cfgvalue(...) or "60" ++ end ++ ++ sipport = peer:option(Value, "port", "SIP Port") ++ function sipport.cfgvalue(...) ++ return AbstractValue.cfgvalue(...) or "5060" ++ end ++ ++ linekey = peer:option(ListValue, "_linekey", "Linekey Mode (broken)") ++ linekey:value("", "Off") ++ linekey:value("trunk", "Trunk Appearance") ++ linekey:value("call", "Call Appearance") ++ ++ dialplan = peer:option(ListValue, "context", "Assign Dialplan") ++ dialplan.titleref = luci.dispatcher.build_url("admin", "asterisk", "dialplans") ++ for _, v in ipairs(find_outgoing_contexts(cbimap.uci)) do ++ dialplan:value(unpack(v)) ++ end ++ ++ incoming = peer:option(StaticList, "incoming", "Receive incoming calls from") ++ for _, v in ipairs(find_incoming_contexts(cbimap.uci)) do ++ incoming:value(unpack(v)) ++ end ++ ++ --function incoming.cfgvalue(...) ++ --error(table.concat(MultiValue.cfgvalue(...),".")) ++ --end ++ ++ return cbimap ++end +diff --git a/feeds/luci/applications/luci-app-asterisk/luasrc/model/cbi/asterisk/phones.lua b/feeds/luci/applications/luci-app-asterisk/luasrc/model/cbi/asterisk/phones.lua +new file mode 100644 +index 0000000..a6c44f9 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-asterisk/luasrc/model/cbi/asterisk/phones.lua +@@ -0,0 +1,104 @@ ++-- Copyright 2008 Jo-Philipp Wich ++-- Licensed to the public under the Apache License 2.0. ++ ++local ast = require("luci.asterisk") ++ ++cbimap = Map("asterisk", "Registered Phones") ++cbimap.pageaction = false ++ ++local sip_peers = { } ++cbimap.uci:foreach("asterisk", "sip", ++ function(s) ++ if s.type ~= "peer" then ++ s.name = s['.name'] ++ s.info = ast.sip.peer(s.name) ++ sip_peers[s.name] = s ++ end ++ end) ++ ++ ++sip_table = cbimap:section(TypedSection, "sip", "SIP Phones") ++sip_table.template = "cbi/tblsection" ++sip_table.extedit = luci.dispatcher.build_url("admin", "asterisk", "phones", "sip", "%s") ++sip_table.addremove = true ++ ++function sip_table.filter(self, s) ++ return s and not cbimap.uci:get_bool("asterisk", s, "provider") ++end ++ ++function sip_table.create(self, section) ++ if TypedSection.create(self, section) then ++ created = section ++ cbimap.uci:tset("asterisk", section, { ++ type = "friend", ++ qualify = "yes", ++ provider = "no", ++ host = "dynamic", ++ nat = "no", ++ canreinvite = "no", ++ extension = section:match("^%d+$") and section or "", ++ username = section:match("^%d+$") and section or "" ++ }) ++ else ++ self.invalid_cts = true ++ end ++end ++ ++function sip_table.parse(self, ...) ++ TypedSection.parse(self, ...) ++ if created then ++ cbimap.uci:save("asterisk") ++ luci.http.redirect(luci.dispatcher.build_url( ++ "admin", "asterisk", "phones", "sip", created ++ )) ++ end ++end ++ ++ ++user = sip_table:option(DummyValue, "username", "Username") ++function user.cfgvalue(self, s) ++ return sip_peers[s] and sip_peers[s].callerid or ++ AbstractValue.cfgvalue(self, s) ++end ++ ++host = sip_table:option(DummyValue, "host", "Hostname") ++function host.cfgvalue(self, s) ++ if sip_peers[s] and sip_peers[s].info.address then ++ return "%s:%i" %{ sip_peers[s].info.address, sip_peers[s].info.port } ++ else ++ return "n/a" ++ end ++end ++ ++context = sip_table:option(DummyValue, "context", "Dialplan") ++context.href = luci.dispatcher.build_url("admin", "asterisk", "dialplan") ++ ++online = sip_table:option(DummyValue, "online", "Registered") ++function online.cfgvalue(self, s) ++ if sip_peers[s] and sip_peers[s].info.online == nil then ++ return "n/a" ++ else ++ return sip_peers[s] and sip_peers[s].info.online ++ and "yes" or "no (%s)" % { ++ sip_peers[s] and sip_peers[s].info.Status:lower() or "unknown" ++ } ++ end ++end ++ ++delay = sip_table:option(DummyValue, "delay", "Delay") ++function delay.cfgvalue(self, s) ++ if sip_peers[s] and sip_peers[s].info.online then ++ return "%i ms" % sip_peers[s].info.delay ++ else ++ return "n/a" ++ end ++end ++ ++info = sip_table:option(Button, "_info", "Info") ++function info.write(self, s) ++ luci.http.redirect(luci.dispatcher.build_url( ++ "admin", "asterisk", "phones", "sip", s, "info" ++ )) ++end ++ ++return cbimap +diff --git a/feeds/luci/applications/luci-app-asterisk/luasrc/model/cbi/asterisk/trunk_sip.lua b/feeds/luci/applications/luci-app-asterisk/luasrc/model/cbi/asterisk/trunk_sip.lua +new file mode 100644 +index 0000000..eedc1c2 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-asterisk/luasrc/model/cbi/asterisk/trunk_sip.lua +@@ -0,0 +1,86 @@ ++-- Copyright 2008 Jo-Philipp Wich ++-- Licensed to the public under the Apache License 2.0. ++ ++local ast = require("luci.asterisk") ++ ++-- ++-- SIP trunk info ++-- ++if arg[2] == "info" then ++ form = SimpleForm("asterisk", "SIP Trunk Information") ++ form.reset = false ++ form.submit = "Back to overview" ++ ++ local info, keys = ast.sip.peer(arg[1]) ++ local data = { } ++ ++ for _, key in ipairs(keys) do ++ data[#data+1] = { ++ key = key, ++ val = type(info[key]) == "boolean" ++ and ( info[key] and "yes" or "no" ) ++ or ( info[key] == nil or #info[key] == 0 ) ++ and "(none)" ++ or tostring(info[key]) ++ } ++ end ++ ++ itbl = form:section(Table, data, "SIP Trunk %q" % arg[1]) ++ itbl:option(DummyValue, "key", "Key") ++ itbl:option(DummyValue, "val", "Value") ++ ++ function itbl.parse(...) ++ luci.http.redirect( ++ luci.dispatcher.build_url("admin", "asterisk", "trunks") ++ ) ++ end ++ ++ return form ++ ++-- ++-- SIP trunk config ++-- ++elseif arg[1] then ++ cbimap = Map("asterisk", "Edit SIP Trunk") ++ ++ peer = cbimap:section(NamedSection, arg[1]) ++ peer.hidden = { ++ type = "peer", ++ qualify = "yes", ++ } ++ ++ back = peer:option(DummyValue, "_overview", "Back to trunk overview") ++ back.value = "" ++ back.titleref = luci.dispatcher.build_url("admin", "asterisk", "trunks") ++ ++ sipdomain = peer:option(Value, "host", "SIP Domain") ++ sipport = peer:option(Value, "port", "SIP Port") ++ function sipport.cfgvalue(...) ++ return AbstractValue.cfgvalue(...) or "5060" ++ end ++ ++ username = peer:option(Value, "username", "Authorization ID") ++ password = peer:option(Value, "secret", "Authorization Password") ++ password.password = true ++ ++ outboundproxy = peer:option(Value, "outboundproxy", "Outbound Proxy") ++ outboundport = peer:option(Value, "outboundproxyport", "Outbound Proxy Port") ++ ++ register = peer:option(Flag, "register", "Register with peer") ++ register.enabled = "yes" ++ register.disabled = "no" ++ ++ regext = peer:option(Value, "registerextension", "Extension to register (optional)") ++ regext:depends({register="1"}) ++ ++ didval = peer:option(ListValue, "_did", "Number of assigned DID numbers") ++ didval:value("", "(none)") ++ for i=1,24 do didval:value(i) end ++ ++ dialplan = peer:option(ListValue, "context", "Dialplan Context") ++ dialplan:value(arg[1] .. "_inbound", "(default)") ++ cbimap.uci:foreach("asterisk", "dialplan", ++ function(s) dialplan:value(s['.name']) end) ++ ++ return cbimap ++end +diff --git a/feeds/luci/applications/luci-app-asterisk/luasrc/model/cbi/asterisk/trunks.lua b/feeds/luci/applications/luci-app-asterisk/luasrc/model/cbi/asterisk/trunks.lua +new file mode 100644 +index 0000000..44c8ca8 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-asterisk/luasrc/model/cbi/asterisk/trunks.lua +@@ -0,0 +1,94 @@ ++-- Copyright 2008 Jo-Philipp Wich ++-- Licensed to the public under the Apache License 2.0. ++ ++local ast = require("luci.asterisk") ++ ++cbimap = Map("asterisk", "Trunks") ++cbimap.pageaction = false ++ ++local sip_peers = { } ++cbimap.uci:foreach("asterisk", "sip", ++ function(s) ++ if s.type == "peer" then ++ s.name = s['.name'] ++ s.info = ast.sip.peer(s.name) ++ sip_peers[s.name] = s ++ end ++ end) ++ ++ ++sip_table = cbimap:section(TypedSection, "sip", "SIP Trunks") ++sip_table.template = "cbi/tblsection" ++sip_table.extedit = luci.dispatcher.build_url("admin", "asterisk", "trunks", "sip", "%s") ++sip_table.addremove = true ++sip_table.sectionhead = "Extension" ++ ++function sip_table.filter(self, s) ++ return s and ( ++ cbimap.uci:get("asterisk", s, "type") == nil or ++ cbimap.uci:get_bool("asterisk", s, "provider") ++ ) ++end ++ ++function sip_table.create(self, section) ++ if TypedSection.create(self, section) then ++ created = section ++ else ++ self.invalid_cts = true ++ end ++end ++ ++function sip_table.parse(self, ...) ++ TypedSection.parse(self, ...) ++ if created then ++ cbimap.uci:tset("asterisk", created, { ++ type = "friend", ++ qualify = "yes", ++ provider = "yes" ++ }) ++ ++ cbimap.uci:save("asterisk") ++ luci.http.redirect(luci.dispatcher.build_url( ++ "admin", "asterisk", "trunks", "sip", created ++ )) ++ end ++end ++ ++ ++user = sip_table:option(DummyValue, "username", "Username") ++ ++context = sip_table:option(DummyValue, "context", "Dialplan") ++context.href = luci.dispatcher.build_url("admin", "asterisk", "dialplan") ++function context.cfgvalue(...) ++ return AbstractValue.cfgvalue(...) or "(default)" ++end ++ ++online = sip_table:option(DummyValue, "online", "Registered") ++function online.cfgvalue(self, s) ++ if sip_peers[s] and sip_peers[s].info.online == nil then ++ return "n/a" ++ else ++ return sip_peers[s] and sip_peers[s].info.online ++ and "yes" or "no (%s)" %{ ++ sip_peers[s] and sip_peers[s].info.Status:lower() or "unknown" ++ } ++ end ++end ++ ++delay = sip_table:option(DummyValue, "delay", "Delay") ++function delay.cfgvalue(self, s) ++ if sip_peers[s] and sip_peers[s].info.online then ++ return "%i ms" % sip_peers[s].info.delay ++ else ++ return "n/a" ++ end ++end ++ ++info = sip_table:option(Button, "_info", "Info") ++function info.write(self, s) ++ luci.http.redirect(luci.dispatcher.build_url( ++ "admin", "asterisk", "trunks", "sip", s, "info" ++ )) ++end ++ ++return cbimap +diff --git a/feeds/luci/applications/luci-app-asterisk/luasrc/model/cbi/asterisk/voicemail.lua b/feeds/luci/applications/luci-app-asterisk/luasrc/model/cbi/asterisk/voicemail.lua +new file mode 100644 +index 0000000..51143e6 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-asterisk/luasrc/model/cbi/asterisk/voicemail.lua +@@ -0,0 +1,48 @@ ++-- Copyright 2009 Jo-Philipp Wich ++-- Licensed to the public under the Apache License 2.0. ++ ++local ast = require "luci.asterisk" ++ ++cbimap = Map("asterisk", "Voicemail - Mailboxes") ++ ++voicemail = cbimap:section(TypedSection, "voicemail", "Voicemail Boxes") ++voicemail.addremove = true ++voicemail.anonymous = true ++voicemail.template = "cbi/tblsection" ++ ++context = voicemail:option(ListValue, "context", "Context") ++context:value("default") ++ ++number = voicemail:option(Value, "number", ++ "Mailbox Number", "Unique mailbox identifier") ++ ++function number.write(self, s, val) ++ if val and #val > 0 then ++ local old = self:cfgvalue(s) ++ self.map.uci:foreach("asterisk", "dialplanvoice", ++ function(v) ++ if v.voicebox == old then ++ self.map:set(v['.name'], "voicebox", val) ++ end ++ end) ++ Value.write(self, s, val) ++ end ++end ++ ++ ++voicemail:option(Value, "name", "Ownername", "Human readable display name") ++voicemail:option(Value, "password", "Password", "Access protection") ++voicemail:option(Value, "email", "eMail", "Where to send voice messages") ++voicemail:option(Value, "page", "Pager", "Pager number") ++ ++zone = voicemail:option(ListValue, "zone", "Timezone", "Used time format") ++zone.titleref = luci.dispatcher.build_url("admin/asterisk/voicemail/settings") ++cbimap.uci:foreach("asterisk", "voicezone", ++ function(s) zone:value(s['.name']) end) ++ ++function voicemail.remove(self, s) ++ return ast.voicemail.remove(self.map:get(s, "number"), self.map.uci) ++end ++ ++ ++return cbimap +diff --git a/feeds/luci/applications/luci-app-asterisk/luasrc/model/cbi/asterisk/voicemail_settings.lua b/feeds/luci/applications/luci-app-asterisk/luasrc/model/cbi/asterisk/voicemail_settings.lua +new file mode 100644 +index 0000000..ef52a32 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-asterisk/luasrc/model/cbi/asterisk/voicemail_settings.lua +@@ -0,0 +1,51 @@ ++-- Copyright 2009 Jo-Philipp Wich ++-- Licensed to the public under the Apache License 2.0. ++ ++require "luci.sys.zoneinfo" ++ ++ ++cbimap = Map("asterisk", "Voicemail - Common Settings") ++ ++voicegeneral = cbimap:section(TypedSection, "voicegeneral", ++ "General Voicemail Options", "Common settings for all mailboxes are " .. ++ "defined here. Most of them are optional. The storage format should " .. ++ "never be changed once set.") ++ ++voicegeneral.anonymous = true ++voicegeneral.addremove = false ++ ++format = voicegeneral:option(MultiValue, "Used storage formats") ++format.widget = "checkbox" ++format:value("wav49") ++format:value("gsm") ++format:value("wav") ++ ++voicegeneral:option(Flag, "sendvoicemail", "Enable sending of emails") ++voicegeneral:option(Flag, "attach", "Attach voice messages to emails") ++voicegeneral:option(Value, "serveremail", "Used email sender address") ++voicegeneral:option(Value, "emaildateformat", "Date format used in emails").optional = true ++voicegeneral:option(Value, "maxlogins", "Max. failed login attempts").optional = true ++voicegeneral:option(Value, "maxmsg", "Max. allowed messages per mailbox").optional = true ++voicegeneral:option(Value, "minmessage", "Min. number of seconds for voicemail").optional = true ++voicegeneral:option(Value, "maxmessage", "Max. number of seconds for voicemail").optional = true ++voicegeneral:option(Value, "maxsilence", "Seconds of silence until stop recording").optional = true ++voicegeneral:option(Value, "maxgreet", "Max. number of seconds for greetings").optional = true ++voicegeneral:option(Value, "skipms", "Milliseconds to skip for rew./ff.").optional = true ++voicegeneral:option(Value, "silencethreshold", "Threshold to detect silence").optional = true ++ ++ ++voicezone = cbimap:section(TypedSection, "voicezone", "Time Zones", ++ "Time zones define how dates and times are expressen when used in " .. ++ "an voice mails. Refer to the asterisk manual for placeholder values.") ++ ++voicezone.addremove = true ++voicezone.sectionhead = "Name" ++voicezone.template = "cbi/tblsection" ++ ++tz = voicezone:option(ListValue, "zone", "Location") ++for _, z in ipairs(luci.sys.zoneinfo.TZ) do tz:value(z[1]) end ++ ++voicezone:option(Value, "message", "Date Format") ++ ++ ++return cbimap +diff --git a/feeds/luci/applications/luci-app-asterisk/luasrc/view/asterisk/cbi/cell.htm b/feeds/luci/applications/luci-app-asterisk/luasrc/view/asterisk/cbi/cell.htm +new file mode 100644 +index 0000000..3afb26b +--- /dev/null ++++ b/feeds/luci/applications/luci-app-asterisk/luasrc/view/asterisk/cbi/cell.htm +@@ -0,0 +1,13 @@ ++<%# ++ Copyright 2008 Steven Barth ++ Copyright 2008 Jo-Philipp Wich ++ Licensed to the public under the Apache License 2.0. ++-%> ++ ++<%+cbi/valueheader%> ++<% if self.href then %><% end -%> ++ <%=self:cfgvalue(section)%> ++<%- if self.href then %><%end%> ++  ++ ++<%+cbi/valuefooter%> +diff --git a/feeds/luci/applications/luci-app-asterisk/luasrc/view/asterisk/dialplans.htm b/feeds/luci/applications/luci-app-asterisk/luasrc/view/asterisk/dialplans.htm +new file mode 100644 +index 0000000..70f986c +--- /dev/null ++++ b/feeds/luci/applications/luci-app-asterisk/luasrc/view/asterisk/dialplans.htm +@@ -0,0 +1,245 @@ ++<%# ++ Copyright 2008 Steven Barth ++ Copyright 2008 Jo-Philipp Wich ++ Licensed to the public under the Apache License 2.0. ++-%> ++ ++<%+header%> ++ ++<% ++ local uci = luci.model.uci.cursor_state() ++ local ast = require "luci.asterisk" ++ ++ function digit_pattern(s,t) ++ return "%s" ++ %{ t and " title='" .. t .. "'" or "", s } ++ end ++ ++ function rowstyle(i) ++ return "cbi-rowstyle-%i" %{ ++ ( i % 2 ) == 0 and 2 or 1 ++ } ++ end ++ ++ function format_matches(z) ++ local html = { } ++ ++ if type(z) ~= "table" then ++ z = { matches = { z } } ++ end ++ ++ if z.localprefix then ++ for _, m in ipairs(z.matches) do ++ html[#html+1] = ++ digit_pattern(z.localprefix, "local prefix") .. " " .. ++ digit_pattern(m) ++ end ++ end ++ ++ if z.intlmatches and #z.intlmatches > 0 then ++ for _, i in ipairs(z.intlmatches) do ++ for _, m in ipairs(z.matches) do ++ html[#html+1] = "%s %s" %{ ++ digit_pattern("(%s)" % i, "intl. prefix"), ++ digit_pattern(m) ++ } ++ end ++ end ++ else ++ for _, m in ipairs(z.matches) do ++ html[#html+1] = digit_pattern(m) ++ end ++ end ++ ++ return table.concat(html, "; ") ++ end ++%> ++ ++ ++
    " enctype="multipart/form-data"> ++
    ++ ++ ++ ++
    ++ ++
    ++

    Outgoing Call Routing

    ++
    ++ Here you can manage your dial plans which are used to route outgoing calls from your local extensions.

    ++ Related tasks:
    ++ Manage dialzones | ++ Manage voicemail boxes | ++ Manage meetme rooms ++
    ++ ++
    ++ ++
    ++ ++ <% for i, plan in pairs(ast.dialplan.plans()) do %> ++
    ++ ++ ++ ++ ++ ++ ++ ++ <% local zones_used = { }; local row = 0 %> ++ <% for i, zone in ipairs(plan.zones) do zones_used[zone.name] = true %> ++ ++ ++ ++ ++ <% row = row + 1; end %> ++ ++ ++ ++ <% local boxes_used = { } %> ++ <% for ext, box in luci.util.kspairs(plan.voicemailboxes) do boxes_used[box.id] = true %> ++ ++ ++ ++ ++ <% row = row + 1; end %> ++ ++ ++ ++ <% local rooms_used = { } %> ++ <% for ext, room in luci.util.kspairs(plan.meetmerooms) do rooms_used[room.room] = true %> ++ ++ ++ ++ ++ <% row = row + 1; end %> ++ ++ ++ ++ ++ ++ ++
    ++ Dialplan <%=plan.name%> ++ ++ ++ Remove this dialplan ++ ++
    ++ └ Dialzone <%=zone.name%> (<%=zone.description%>) ++

    ++ Lines: ++ <%=ast.tools.hyperlinks( ++ zone.trunks, function(v) ++ return luci.dispatcher.build_url("admin", "asterisk", "trunks", "%s") % v:lower() ++ end ++ )%>
    ++ Matches: ++ <%=format_matches(zone)%> ++

    ++
    ++ ++ Edit dialzone ++ ++ ++ Remove from this dialplan ++ ++
    ++ └ Voicemailbox <%=box.id%> (<%=box.name%>) ++

    ++ Owner: <%=box.name%> | ++ eMail: <%=#box.email > 0 and box.email or 'n/a'%> | ++ Pager: <%=#box.page > 0 and box.page or 'n/a'%>
    ++ Matches: <%=format_matches(ext)%> ++

    ++
    ++ ++ Manage mailboxes ... ++ ++ ++ Remove from this dialplan ++ ++
    ++ └ MeetMe Room <%=room.room%> ++ <% if room.description and #room.description > 0 then %> (<%=room.description%>)<% end %> ++

    ++ Matches: <%=format_matches(ext)%> ++

    ++
    ++ ++ Manage conferences ... ++ ++ ++ Remove from this dialplan ++ ++
    ++
    ++ ++ Add Dialzone:
    ++ ++

    ++ ++ Add Voicemailbox:
    ++ ++ as extension ++ ++

    ++ ++ Add MeetMe Conference:
    ++ ++ as extension ++ ++

    ++ ++ ++
    ++ ++
    ++
    ++
    ++ <% end %> ++ ++
    ++
    ++

    Create a new dialplan

    ++ The name is required and must be unique. It may only contain the characters A-Z, a-z, 0-9 and _ .
    ++ ++ <%- if create_error then %> ++
    Invalid name given!
    ++ <% end -%> ++ ++
    ++ ++ ++
    ++
    ++ ++
    ++
    ++
    ++
    ++<%+footer%> +diff --git a/feeds/luci/applications/luci-app-asterisk/luasrc/view/asterisk/dialzones.htm b/feeds/luci/applications/luci-app-asterisk/luasrc/view/asterisk/dialzones.htm +new file mode 100644 +index 0000000..ac52791 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-asterisk/luasrc/view/asterisk/dialzones.htm +@@ -0,0 +1,165 @@ ++<%# ++ Copyright 2008 Steven Barth ++ Copyright 2008 Jo-Philipp Wich ++ Licensed to the public under the Apache License 2.0. ++-%> ++ ++<%+header%> ++ ++<% ++ local uci = luci.model.uci.cursor_state() ++ local ast = require("luci.asterisk") ++ ++ function digit_pattern(s) ++ return "%s" % s ++ end ++ ++ function rowstyle(i) ++ return "cbi-rowstyle-%i" %{ ++ ( i % 2 ) == 0 and 2 or 1 ++ } ++ end ++ ++ local function find_trunks() ++ local t = { } ++ ++ uci:foreach("asterisk", "sip", ++ function(s) ++ if uci:get_bool("asterisk", s['.name'], "provider") then ++ t[#t+1] = { ++ "SIP/%s" % s['.name'], ++ "SIP: %s" % s['.name'] ++ } ++ end ++ end) ++ ++ uci:foreach("asterisk", "iax", ++ function(s) ++ t[#t+1] = { ++ "IAX/%s" % s['.name'], ++ "IAX: %s" % s.extension or s['.name'] ++ } ++ end) ++ ++ return t ++ end ++ ++%> ++ ++ ++
    " enctype="multipart/form-data"> ++
    ++ ++ ++ ++
    ++ ++
    ++

    Dial Zone Management

    ++
    ++ " class="cbi-title-ref">Back to dialplan overview

    ++ Here you can manage your dial zones. The zones are used to route outgoing calls to the destination. ++ Each zone groups multiple trunks and number matches to represent a logical destination. Zones can ++ also be used to enforce certain dial restrictions on selected extensions. ++
    ++ ++ ++
    ++
    ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ <% for i, rule in pairs(ast.dialzone.zones()) do %> ++ ++ ++ ++ ++ ++ ++ ++ ++ <% end %> ++
    ++

    Dialzone Overview

    ++
    NamePrepend- MatchTrunkDescription
    ++ <%=rule.name%> ++ ++ <% for _ in ipairs(rule.matches) do %> ++ <%=rule.addprefix and digit_pattern(rule.addprefix)%> 
    ++ <% end %> ++
    ++ <% for _, m in ipairs(rule.matches) do %> ++ <%=rule.localprefix and "%s " % digit_pattern(rule.localprefix)%> ++ <%=digit_pattern(m)%>
    ++ <% end %> ++
    ++ <%=ast.tools.hyperlinks( ++ rule.trunks, function(v) ++ return luci.dispatcher.build_url("admin", "asterisk", "trunks", "%s") % v:lower() ++ end ++ )%> ++ ++ <%=rule.description or rule.name%> ++ ++ ++ Edit entry ++ ++ ++ Delete entry ++ ++
    ++
    ++
    ++
    ++ ++
    ++
    ++

    Create a new dialzone

    ++ The name is required and must be unique. It may only contain the characters A-Z, a-z, 0-9 and _ .
    ++ You can specifiy multiple number matches by separating them with spaces.
    ++ ++ <%- if create_error then %> ++
    Invalid name given!
    ++ <% end -%> ++ ++ ++ ++ ++ ++ ++
    ++
    ++ ++

    ++ ++
    ++ ++
    ++
    ++ ++
    ++
    ++ ++ ++
    ++
    ++
    ++
    ++
    ++
    ++<%+footer%> +diff --git a/feeds/luci/applications/luci-app-asterisk/po/ca/asterisk.po b/feeds/luci/applications/luci-app-asterisk/po/ca/asterisk.po +new file mode 100644 +index 0000000..9775758 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-asterisk/po/ca/asterisk.po +@@ -0,0 +1,680 @@ ++# asterisk.pot ++# generated from ./applications/luci-asterisk/luasrc/i18n/asterisk.en.lua ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Report-Msgid-Bugs-To: \n" ++"POT-Creation-Date: 2009-06-10 03:40+0200\n" ++"PO-Revision-Date: 2009-05-31 19:18+0200\n" ++"Last-Translator: Eduard Duran \n" ++"Language-Team: LANGUAGE \n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"X-Generator: Pootle 1.1.0\n" ++ ++#~ msgid "Asterisk General Options" ++#~ msgstr "Opcions Generals d'Asterisk" ++ ++#~ msgid "AGI directory" ++#~ msgstr "Directori AGI" ++ ++#~ msgid "Cache recorded sound files during recording" ++#~ msgstr "Desa en memòria cau els sons gravats durant la gravació" ++ ++#~ msgid "Debug Level" ++#~ msgstr "Nivell de depuració" ++ ++#~ msgid "Disable some warnings" ++#~ msgstr "Desactiva algunes alertes" ++ ++#~ msgid "Dump core on crash" ++#~ msgstr "Bolca el nucli en cas de fallada" ++ ++#~ msgid "High Priority" ++#~ msgstr "Alta Prioritat" ++ ++#~ msgid "Initialise Crypto" ++#~ msgstr "Inicialitza Crypto" ++ ++#~ msgid "Use Internal Timing" ++#~ msgstr "Utilitza l'hora interna" ++ ++#~ msgid "Log directory" ++#~ msgstr "Directori de registres" ++ ++#~ msgid "Maximum number of calls allowed" ++#~ msgstr "Número màxim de trucades permeses" ++ ++#~ msgid "Maximum load to stop accepting new calls" ++#~ msgstr "Càrrega màxima per deixar d'acceptar trucades noves" ++ ++#~ msgid "Disable console colors" ++#~ msgstr "Desactiva els colors de consola" ++ ++#~ msgid "Sound files Cache directory" ++#~ msgstr "Directori de memòria cau dels fitxers de so" ++ ++#~ msgid "The Group to run as" ++#~ msgstr "Executa amb els permisos del Grup" ++ ++#~ msgid "The User to run as" ++#~ msgstr "Executa amb els permisos de l'Usuari" ++ ++#~ msgid "Voicemail Spool directory" ++#~ msgstr "Directori de bústia de correu" ++ ++#~ msgid "Prefix UniquID with system name" ++#~ msgstr "Prefixa l'UniquID amb el nom del sistema" ++ ++#~ msgid "Build transcode paths via SLINEAR, not directly" ++#~ msgstr "Munta les rutes de transcodificació via SLINEAR, no directament" ++ ++#~ msgid "Transmit SLINEAR silence while recording a channel" ++#~ msgstr "Transmet silenci SLINEAR mentre s'enregistri un canal" ++ ++#~ msgid "Verbose Level" ++#~ msgstr "Nivell de detall" ++ ++#~ msgid "Section dialplan" ++#~ msgstr "Secció Dialplan" ++ ++#~ msgid "include" ++#~ msgstr "inclou" ++ ++#~ msgid "Dialplan Extension" ++#~ msgstr "Connector Dialplan" ++ ++#~ msgid "Dialplan General Options" ++#~ msgstr "Opcions generals de Dialplan" ++ ++#~ msgid "Allow transfer" ++#~ msgstr "Permet la transferència" ++ ++#~ msgid "Clear global vars" ++#~ msgstr "Buida les variables globals" ++ ++#~ msgid "Dialplan Goto" ++#~ msgstr "Dialplan Goto" ++ ++#~ msgid "Dialplan Conference" ++#~ msgstr "Conferència Dialplan" ++ ++#~ msgid "Dialplan Time" ++#~ msgstr "Dialplan Time" ++ ++#~ msgid "Dialplan Voicemail" ++#~ msgstr "Bústia de correu Dialplan" ++ ++#~ msgid "Dial Zones for Dialplan" ++#~ msgstr "Zones de marcatge per Dialplan" ++ ++#~ msgid "Prefix to add matching dialplans" ++#~ msgstr "Prefix per afegir als Dialplan que coincideixin" ++ ++#~ msgid "Match International prefix" ++#~ msgstr "Coincideix amb el prefix Internacional" ++ ++#~ msgid "Prefix (0) to add/remove to/from international numbers" ++#~ msgstr "Prefix (0) per afegir/esborrar a/des de números internacionals" ++ ++#~ msgid "localzone" ++#~ msgstr "zona local" ++ ++#~ msgid "Match plan" ++#~ msgstr "Pla coincident" ++ ++#~ msgid "Connection to use" ++#~ msgstr "Connexió a fer servir" ++ ++#~ msgid "Feature Key maps" ++#~ msgstr "Mapa de Funcions Principals" ++ ++#~ msgid "Attended transfer key" ++#~ msgstr "Tecla de transferència assistida" ++ ++#~ msgid "Blind transfer key" ++#~ msgstr "Tecla de transferència cega" ++ ++#~ msgid "Key to Disconnect call" ++#~ msgstr "Tecla per desconnectar trucada" ++ ++#~ msgid "Key to Park call" ++#~ msgstr "Tecla per trucada en espera" ++ ++#~ msgid "Parking Feature" ++#~ msgstr "Funció de trucada en espera" ++ ++#~ msgid "ADSI Park" ++#~ msgstr "Trucada en espera ADSI" ++ ++#~ msgid "Attended transfer timeout (sec)" ++#~ msgstr "Temps d'espera de transferència assistida (seg)" ++ ++#~ msgid "One touch record key" ++#~ msgstr "Tecla de registre d'un toc" ++ ++#~ msgid "Name of call context for parking" ++#~ msgstr "Nom del context de la trucada en espera" ++ ++#~ msgid "Sound file to play to parked caller" ++#~ msgstr "Fitxer de so per reproduir a la trucada en espera" ++ ++#~ msgid "Max time (ms) between digits for feature activation" ++#~ msgstr "Temps màxim (en ms) entre dígits per l'activació de funció" ++ ++#~ msgid "Method to Find Parking slot" ++#~ msgstr "Mètode per trobar una ranura de trucada en espera" ++ ++#~ msgid "parkedmusicclass" ++#~ msgstr "parkedmusicclass" ++ ++#~ msgid "Play courtesy tone to" ++#~ msgstr "Reprodueix to de cortesia a" ++ ++#~ msgid "Enable Parking" ++#~ msgstr "Activa les trucades en espera" ++ ++#~ msgid "Extension to dial to park" ++#~ msgstr "Extensió per marcar per deixar en espera una trucada" ++ ++#~ msgid "Parking time (secs)" ++#~ msgstr "Temps de trucada en espera (secs)" ++ ++#~ msgid "Range of extensions for call parking" ++#~ msgstr "Rang d'extensions per trucada en espera" ++ ++#~ msgid "Pickup extension" ++#~ msgstr "Connector de recol·lecció" ++ ++#~ msgid "Seconds to wait bewteen digits when transferring" ++#~ msgstr "Segons a esperar entre dígits quan es transfereix" ++ ++#~ msgid "sound when attended transfer is complete" ++#~ msgstr "so quan es completa la transferència assistida" ++ ++#~ msgid "Sound when attended transfer fails" ++#~ msgstr "so quan falla la transferència assitida" ++ ++#~ msgid "Reload Hardware Config" ++#~ msgstr "Recarrega la configuració de maquinari" ++ ++#~ msgid "Reboot Method" ++#~ msgstr "Mètode de Reinici" ++ ++#~ msgid "Parameter" ++#~ msgstr "Paràmetre" ++ ++#~ msgid "Option type" ++#~ msgstr "Tipus d'opció" ++ ++#~ msgid "User name" ++#~ msgstr "Nom d'usuari" ++ ++#~ msgid "IAX General Options" ++#~ msgstr "Opcions generals IAX" ++ ++#~ msgid "Allow Codecs" ++#~ msgstr "Permet Codecs" ++ ++#~ msgid "Static" ++#~ msgstr "Estàtic" ++ ++#~ msgid "Write Protect" ++#~ msgstr "Protecció d'escriptura" ++ ++#~ msgid "Meetme Conference" ++#~ msgstr "Conferència Meetme" ++ ++#~ msgid "Admin PIN" ++#~ msgstr "PIN d'administrador" ++ ++#~ msgid "Meeting PIN" ++#~ msgstr "PIN de reunió" ++ ++#~ msgid "Meetme Conference General Options" ++#~ msgstr "Opcions generals de conferència Meetme" ++ ++#~ msgid "Number of 20ms audio buffers to be used" ++#~ msgstr "Número de memòries intermitges d'àudio de 20 ms a utilitzar" ++ ++#~ msgid "Modules" ++#~ msgstr "Mòduls" ++ ++#~ msgid "Alarm Receiver Application" ++#~ msgstr "Aplicació de recepció d'alarma" ++ ++#~ msgid "Authentication Application" ++#~ msgstr "Aplicació d'autenticació" ++ ++#~ msgid "Make sure asterisk doesnt save CDR" ++#~ msgstr "Assegura't que asterisk no desa CDR" ++ ++#~ msgid "Check if channel is available" ++#~ msgstr "Comprova que el canal estigui disponible" ++ ++#~ msgid "Listen in on any channel" ++#~ msgstr "Escolta a qualsevol canal" ++ ++#~ msgid "Control Playback Application" ++#~ msgstr "Aplicació de control de reproducció" ++ ++#~ msgid "Cuts up variables" ++#~ msgstr "Talla les variables" ++ ++#~ msgid "Database access functions" ++#~ msgstr "Funcions d'accés a base de dades" ++ ++#~ msgid "Dialing Application" ++#~ msgstr "Aplicació de marcatge" ++ ++#~ msgid "Virtual Dictation Machine Application" ++#~ msgstr "Aplicació de màquina de dictat virtual" ++ ++#~ msgid "Directed Call Pickup Support" ++#~ msgstr "Suport de recollida de trucades adreçades" ++ ++#~ msgid "Extension Directory" ++#~ msgstr "Directori de connectors" ++ ++#~ msgid "DISA (Direct Inward System Access) Application" ++#~ msgstr "Aplicació DISA (Direct Inward System Access)" ++ ++#~ msgid "Dump channel variables Application" ++#~ msgstr "Bolca les variables de canal de l'aplicació" ++ ++#~ msgid "Simple Echo Application" ++#~ msgstr "Aplicació d'eco simple" ++ ++#~ msgid "ENUM Lookup" ++#~ msgstr "Consulta ENUM" ++ ++#~ msgid "Reevaluates strings" ++#~ msgstr "Reavalua cadenes" ++ ++#~ msgid "Executes applications" ++#~ msgstr "Executa aplicacions" ++ ++#~ msgid "External IVR application interface" ++#~ msgstr "Interfície d'aplicació IVR externa" ++ ++#~ msgid "Fork The CDR into 2 seperate entities" ++#~ msgstr "Bifurca el CDR en 2 entitats separades" ++ ++#~ msgid "Get ADSI CPE ID" ++#~ msgstr "Obtingues la ADSI CPE ID" ++ ++#~ msgid "Group Management Routines" ++#~ msgstr "Rutines de gestió de grup" ++ ++#~ msgid "Encode and Stream via icecast and ices" ++#~ msgstr "Codifica i emet via icecast i ices" ++ ++#~ msgid "Image Transmission Application" ++#~ msgstr "Aplicació de transmissió d'imatge" ++ ++#~ msgid "Look up Caller*ID name/number from black" ++#~ msgstr "Cerca la ID/nom/número de qui truca de negre" ++ ++#~ msgid "Look up CallerID Name from local databas" ++#~ msgstr "Cerca la ID/nom/número de qui truca de la base de dades local" ++ ++#~ msgid "Extension Macros" ++#~ msgstr "Macros de connectors" ++ ++#~ msgid "A simple math Application" ++#~ msgstr "Una aplicació de matemàtiques simple" ++ ++#~ msgid "MD5 checksum Application" ++#~ msgstr "Aplicació de suma de verificació MD5" ++ ++#~ msgid "Digital Milliwatt (mu-law) Test Application" ++#~ msgstr "Aplicació de prova de milliwat digital (mu-law)" ++ ++#~ msgid "Record a call and mix the audio during the recording" ++#~ msgstr "Registra una trucada i mescla l'àudio durant la gravació" ++ ++#~ msgid "Call Parking and Announce Application" ++#~ msgstr "Aplicació d'anunci de trucades i trucada en espera" ++ ++#~ msgid "Trivial Playback Application" ++#~ msgstr "Aplicació de reproducció trivial" ++ ++#~ msgid "Require phone number to be entered" ++#~ msgstr "Requereix que s'entri un número de telèfon" ++ ++#~ msgid "True Call Queueing" ++#~ msgstr "Encuament de trucades real" ++ ++#~ msgid "Random goto" ++#~ msgstr "Goto aleatori" ++ ++#~ msgid "Read Variable Application" ++#~ msgstr "Aplicació de lectura de variables" ++ ++#~ msgid "Read in a file" ++#~ msgstr "Llegeix en un fitxer" ++ ++#~ msgid "Realtime Data Lookup/Rewrite" ++#~ msgstr "Cerca/reescriptura de dades en temps real" ++ ++#~ msgid "Trivial Record Application" ++#~ msgstr "Aplicació d'enregistrament trivial" ++ ++#~ msgid "Say time" ++#~ msgstr "Digues l'hora" ++ ++#~ msgid "Send DTMF digits Application" ++#~ msgstr "Envia aplicació de dígits DTMF" ++ ++#~ msgid "Send Text Applications" ++#~ msgstr "Envia aplicacions de text" ++ ++#~ msgid "Set CallerID Application" ++#~ msgstr "Estableix l'aplicació CallerID" ++ ++#~ msgid "CDR user field apps" ++#~ msgstr "Aplicacions de camp d'usuari CDR" ++ ++#~ msgid "load => .so ; Set CallerID Name" ++#~ msgstr "load => .so ; Estableix el nom CallerID" ++ ++#~ msgid "load => .so ; Set CallerID Number" ++#~ msgstr "load => .so ; Estableix el número CallerID" ++ ++#~ msgid "Set RDNIS Number" ++#~ msgstr "Estableix el número RDNIS" ++ ++#~ msgid "Set ISDN Transfer Capability" ++#~ msgstr "Estableix la capacitat de transferència XDSI" ++ ++#~ msgid "SMS/PSTN handler" ++#~ msgstr "Gestor SMS/PSTN" ++ ++#~ msgid "Hangs up the requested channel" ++#~ msgstr "Penja el canal sol·licitat" ++ ++#~ msgid "Stack Routines" ++#~ msgstr "Rutines de pila" ++ ++#~ msgid "Generic System() application" ++#~ msgstr "Aplicació genèrica de System()" ++ ++#~ msgid "Playback with Talk Detection" ++#~ msgstr "Playback amb Detecció de Parla" ++ ++#~ msgid "Interface Test Application" ++#~ msgstr "Aplicació de proves d'interfície" ++ ++#~ msgid "Transfer" ++#~ msgstr "Transfereix" ++ ++#~ msgid "TXTCIDName" ++#~ msgstr "TXTCIDName" ++ ++#~ msgid "Send URL Applications" ++#~ msgstr "Envia aplicacions d'URL" ++ ++#~ msgid "Custom User Event Application" ++#~ msgstr "Aplicació d'esdeveniments personalitzats d'usuari" ++ ++#~ msgid "Send verbose output" ++#~ msgstr "Envia sortida detallada" ++ ++#~ msgid "Voicemail" ++#~ msgstr "Bústia de veu" ++ ++#~ msgid "Waits until first ring after time" ++#~ msgstr "Espera fins el primer to després del temps" ++ ++#~ msgid "Wait For Silence Application" ++#~ msgstr "Espera l'aplicació de silenci" ++ ++#~ msgid "While Loops and Conditional Execution" ++#~ msgstr "Execució de bucles while i condicionals" ++ ++#~ msgid "Comma Separated Values CDR Backend" ++#~ msgstr "Valors de Backend CDR separats per comes" ++ ++#~ msgid "Customizable Comma Separated Values CDR Backend" ++#~ msgstr "Valors de Backend CDR personalitzats separats per comes" ++ ++#~ msgid "Asterisk Call Manager CDR Backend" ++#~ msgstr "Backend CDR del gestor de trucades Asterisk" ++ ++#~ msgid "MySQL CDR Backend" ++#~ msgstr "Backend CDR MySQL" ++ ++#~ msgid "PostgreSQL CDR Backend" ++#~ msgstr "Backend CDR PostgreSQL" ++ ++#~ msgid "SQLite CDR Backend" ++#~ msgstr "Backend CDR SQLite" ++ ++#~ msgid "Agent Proxy Channel" ++#~ msgstr "Canal de l'Agent Proxy" ++ ++#~ msgid "Option chan_iax2" ++#~ msgstr "Opció chan_iax2" ++ ++#~ msgid "Local Proxy Channel" ++#~ msgstr "Canal de proxy local" ++ ++#~ msgid "Session Initiation Protocol (SIP)" ++#~ msgstr "Protocol d'inicialització de sessió (SIP)" ++ ++#~ msgid "Adaptive Differential PCM Coder/Decoder" ++#~ msgstr "Codificador/Decodificador PCM adaptatiu diferencial" ++ ++#~ msgid "A-law Coder/Decoder" ++#~ msgstr "Codificador/Decodificador de llei A" ++ ++#~ msgid "A-law and Mulaw direct Coder/Decoder" ++#~ msgstr "Codificador/Decodificador directe de llei A i Mu" ++ ++#~ msgid "ITU G.726-32kbps G726 Transcoder" ++#~ msgstr "Transcodificador ITU G.726-32kbps G726" ++ ++#~ msgid "GSM/PCM16 (signed linear) Codec Translation" ++#~ msgstr "Còdec de traducció GSM/PCM16 (lineal amb signe)" ++ ++#~ msgid "Speex/PCM16 (signed linear) Codec Translator" ++#~ msgstr "Còdec de traducció Speex/PCM16 (lineal amb signe)" ++ ++#~ msgid "Mu-law Coder/Decoder" ++#~ msgstr "Codificador/Decodificador llei Mu" ++ ++#~ msgid "Sun Microsystems AU format (signed linear)" ++#~ msgstr "Format AU de Sun Microsystems (lineal amb signe)" ++ ++#~ msgid "G.723.1 Simple Timestamp File Format" ++#~ msgstr "Format de fitxer de marca de temps simple G.723.1" ++ ++#~ msgid "Raw G.726 (16/24/32/40kbps) data" ++#~ msgstr "Dades Raw G.726 (16/24/32/40kbps)" ++ ++#~ msgid "Raw G729 data" ++#~ msgstr "Dades Raw G729" ++ ++#~ msgid "Raw GSM data" ++#~ msgstr "Dades Raw GSM" ++ ++#~ msgid "Raw h263 data" ++#~ msgstr "Dades Raw h263" ++ ++#~ msgid "JPEG (Joint Picture Experts Group) Image" ++#~ msgstr "Imatge JPEG (Joint Picture Experts Group)" ++ ++#~ msgid "Raw uLaw 8khz Audio support (PCM)" ++#~ msgstr "Suport d'àudio Raw llei-u 8khz (PCM)" ++ ++#~ msgid "load => .so ; Raw aLaw 8khz PCM Audio support" ++#~ msgstr "load => .so ; suport d'àudio Raw llei-a 8khz PCM" ++ ++#~ msgid "Raw Signed Linear Audio support (SLN)" ++#~ msgstr "Suport d'àudio Raw amb signe lineal (SLN)" ++ ++#~ msgid "Dialogic VOX (ADPCM) File Format" ++#~ msgstr "Format de fitxer Dialogic VOX (ADPCM)" ++ ++#~ msgid "Microsoft WAV format (8000hz Signed Line" ++#~ msgstr "Format Microsoft WAV (8000hz amb signe lineal)" ++ ++#~ msgid "Microsoft WAV format (Proprietary GSM)" ++#~ msgstr "Format Microsoft WAV (GSM propietari)" ++ ++#~ msgid "Caller ID related dialplan functions" ++#~ msgstr "Functions de dialplan relacionades amb la ID de qui truca" ++ ++#~ msgid "ENUM Functions" ++#~ msgstr "Funcions ENUM" ++ ++#~ msgid "URI encoding / decoding functions" ++#~ msgstr "Funcions de codificació / decodificació d'URI" ++ ++#~ msgid "Asterisk Extension Language Compiler" ++#~ msgstr "Compilador del llenguatge de connectors d'Asterisk" ++ ++#~ msgid "Text Extension Configuration" ++#~ msgstr "Configuració del connector de text" ++ ++#~ msgid "load => .so ; Builtin dialplan functions" ++#~ msgstr "load => .s ; Funcions integrades dialplan" ++ ++#~ msgid "Loopback Switch" ++#~ msgstr "Switch loopback" ++ ++#~ msgid "Realtime Switch" ++#~ msgstr "Switch en temps real" ++ ++#~ msgid "Outgoing Spool Support" ++#~ msgstr "Suport de gestió de cues sortint" ++ ++#~ msgid "Wil Cal U (Auto Dialer)" ++#~ msgstr "Wil Cal U (Auto Marcatge)" ++ ++#~ msgid "MySQL Config Resource" ++#~ msgstr "Configuració del recurs MySQL" ++ ++#~ msgid "ODBC Config Resource" ++#~ msgstr "Configuració del recurs ODBC" ++ ++#~ msgid "PGSQL Module" ++#~ msgstr "Mòdul PGSQL" ++ ++#~ msgid "Cryptographic Digital Signatures" ++#~ msgstr "Signatures digitals criptogràfiques" ++ ++#~ msgid "Call Parking Resource" ++#~ msgstr "Recurs de trucada en espera" ++ ++#~ msgid "Indications Configuration" ++#~ msgstr "Configuració d'indicacions" ++ ++#~ msgid "Call Monitoring Resource" ++#~ msgstr "Recurs de monitoreig de trucades" ++ ++#~ msgid "Music On Hold Resource" ++#~ msgstr "Recurs de música en espera" ++ ++#~ msgid "ODBC Resource" ++#~ msgstr "Recurs ODBC" ++ ++#~ msgid "SMDI Module" ++#~ msgstr "Mòdul SMDI" ++ ++#~ msgid "SNMP Module" ++#~ msgstr "Mòdul SNMP" ++ ++#~ msgid "Music On Hold" ++#~ msgstr "Música en espera" ++ ++#~ msgid "Application" ++#~ msgstr "Aplicació" ++ ++#~ msgid "Directory of Music" ++#~ msgstr "Directori de música" ++ ++#~ msgid "Option mode" ++#~ msgstr "Mode d'opció" ++ ++#~ msgid "Random Play" ++#~ msgstr "Reproducció aleatòria" ++ ++#~ msgid "DTMF mode" ++#~ msgstr "Mode DTMF" ++ ++#~ msgid "Primary domain identity for From: headers" ++#~ msgstr "Domini d'identitat primari per les capçaleres From:" ++ ++#~ msgid "From user (required by many SIP providers)" ++#~ msgstr "Usuari d'inici (requerit per diversos proveïdors SIP)" ++ ++#~ msgid "Ring on incoming dialplan contexts" ++#~ msgstr "Truca en contextos d'entrades dialplan" ++ ++#~ msgid "Allow Insecure for" ++#~ msgstr "Permet insegur per" ++ ++#~ msgid "Mailbox for MWI" ++#~ msgstr "Bústia de veu per MWI" ++ ++#~ msgid "NAT between phone and Asterisk" ++#~ msgstr "NAT entre el telèfon i l'Asterisk" ++ ++#~ msgid "Check tags in headers" ++#~ msgstr "Comprova etiquetes a les capçaleres" ++ ++#~ msgid "Reply Timeout (ms) for down connection" ++#~ msgstr "Temps d'esperi per contestar (ms) per caigudes de connexió" ++ ++#~ msgid "Register connection" ++#~ msgstr "Registra connexió" ++ ++#~ msgid "Dial own extension for mailbox" ++#~ msgstr "Truca el propi connector per la bústia de veu" ++ ++#~ msgid "Client Type" ++#~ msgstr "Tipus de client" ++ ++#~ msgid "Username" ++#~ msgstr "Nom d'usuari" ++ ++#~ msgid "Section sipgeneral" ++#~ msgstr "Secció sipgeneral" ++ ++#~ msgid "Allow codecs" ++#~ msgstr "Permet còdecs" ++ ++#~ msgid "SIP realm" ++#~ msgstr "Reialme SIP" ++ ++#~ msgid "Voicemail general options" ++#~ msgstr "Opcions generals de bústia de veu" ++ ++#~ msgid "From Email address of server" ++#~ msgstr "Adreça de correu electrònic d'origen del servidor" ++ ++#~ msgid "Voice Mail boxes" ++#~ msgstr "Bústies de la bústia de veu" ++ ++#~ msgid "Email contains attachment" ++#~ msgstr "El correu electrònic conté fitxers adjunts" ++ ++#~ msgid "Email" ++#~ msgstr "Correu electrònic" ++ ++#~ msgid "Display Name" ++#~ msgstr "Nom a mostrar" ++ ++#~ msgid "Password" ++#~ msgstr "Contrasenya" ++ ++#~ msgid "zone" ++#~ msgstr "zona" ++ ++#~ msgid "Voice Zone settings" ++#~ msgstr "Configuració de zona de veu" ++ ++#~ msgid "Message Format" ++#~ msgstr "Format de missatge" +diff --git a/feeds/luci/applications/luci-app-asterisk/po/cs/asterisk.po b/feeds/luci/applications/luci-app-asterisk/po/cs/asterisk.po +new file mode 100644 +index 0000000..7341d57 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-asterisk/po/cs/asterisk.po +@@ -0,0 +1,11 @@ ++# asterisk.pot ++# generated from ./applications/luci-asterisk/luasrc/i18n/asterisk.en.lua ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Last-Translator: Automatically generated\n" ++"Language-Team: none\n" ++"Language: \n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" +diff --git a/feeds/luci/applications/luci-app-asterisk/po/de/asterisk.po b/feeds/luci/applications/luci-app-asterisk/po/de/asterisk.po +new file mode 100644 +index 0000000..f289849 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-asterisk/po/de/asterisk.po +@@ -0,0 +1,131 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Report-Msgid-Bugs-To: \n" ++"POT-Creation-Date: 2009-05-26 17:57+0200\n" ++"PO-Revision-Date: 2012-02-23 16:29+0200\n" ++"Last-Translator: Martin \n" ++"Language-Team: LANGUAGE \n" ++"Language: de\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n != 1);\n" ++"X-Generator: Pootle 2.0.4\n" ++ ++#~ msgid "Asterisk General Options" ++#~ msgstr "Asterisk Grundeinstellungen" ++ ++#~ msgid "AGI directory" ++#~ msgstr "AGI - Verzeichnis" ++ ++#~ msgid "Cache recorded sound files during recording" ++#~ msgstr "Audiodateien während der Aufnahme zwischenspeichern" ++ ++#~ msgid "Debug Level" ++#~ msgstr "Debug Stufe" ++ ++#~ msgid "Disable some warnings" ++#~ msgstr "Schalte einige Warnungen aus" ++ ++#~ msgid "Dump core on crash" ++#~ msgstr "Speicherabbild bei Absturz erstellen" ++ ++#~ msgid "High Priority" ++#~ msgstr "Hohe Priorität" ++ ++#~ msgid "Initialise Crypto" ++#~ msgstr "Verschlüsselung initialisieren" ++ ++#~ msgid "Use Internal Timing" ++#~ msgstr "Interne Zeitreferenz benutzen" ++ ++#~ msgid "Log directory" ++#~ msgstr "Log - Verzeichnis" ++ ++#~ msgid "Maximum number of calls allowed" ++#~ msgstr "Maximale Anruferanzahl" ++ ++#~ msgid "Maximum load to stop accepting new calls" ++#~ msgstr "Maximale CPU Auslastung um eingehende Anrufe anzunehmen" ++ ++#~ msgid "Disable console colors" ++#~ msgstr "Farbige Ausgabe auf der Konsole deaktivieren" ++ ++#~ msgid "Sound files Cache directory" ++#~ msgstr "Verzeichnis zum Zwischenspeichern von Audiodateien" ++ ++#~ msgid "The Group to run as" ++#~ msgstr "zu benutzende Gruppenkennung" ++ ++#~ msgid "The User to run as" ++#~ msgstr "zu benutzende Benutzerkennung" ++ ++#~ msgid "Voicemail Spool directory" ++#~ msgstr "Sprachnachrichten Puffer" ++ ++#~ msgid "Prefix UniquID with system name" ++#~ msgstr "Systemnamen als Präfix von UniquID benutzen" ++ ++#~ msgid "Build transcode paths via SLINEAR, not directly" ++#~ msgstr "Transcode Pfade durch SLINEAR bauen, indirekt" ++ ++#~ msgid "Transmit SLINEAR silence while recording a channel" ++#~ msgstr "Ãœbertrage Stille (SLINEAR) während der Aufnahme eines Kanals" ++ ++#~ msgid "Verbose Level" ++#~ msgstr "Detailgrad" ++ ++#~ msgid "Allow transfer" ++#~ msgstr "Ãœbertragung erlauben" ++ ++#~ msgid "Clear global vars" ++#~ msgstr "globale Variablen Zurücksetzen" ++ ++#~ msgid "localzone" ++#~ msgstr "Zeitzone" ++ ++#~ msgid "Connection to use" ++#~ msgstr "zu verwendende Verbindung" ++ ++#~ msgid "One touch record key" ++#~ msgstr "Sofortaufnahmetaste" ++ ++#~ msgid "Reload Hardware Config" ++#~ msgstr "Hardwarekonfiguration neuladen" ++ ++#~ msgid "Reboot Method" ++#~ msgstr "Neustartmethode" ++ ++#~ msgid "Parameter" ++#~ msgstr "Parameter" ++ ++#~ msgid "User name" ++#~ msgstr "Benutzername" ++ ++#~ msgid "IAX General Options" ++#~ msgstr "IAX Allgemeine Einstellungen" ++ ++#~ msgid "Allow Codecs" ++#~ msgstr "Codecs erlauben" ++ ++#~ msgid "Admin PIN" ++#~ msgstr "Admin PIN" ++ ++#~ msgid "Modules" ++#~ msgstr "Module" ++ ++#~ msgid "Check if channel is available" ++#~ msgstr "Prüfen, ob der Kanal verfügbar ist" ++ ++#~ msgid "Control Playback Application" ++#~ msgstr "Anwendung zur Wiedergabesteuerung" ++ ++#~ msgid "Executes applications" ++#~ msgstr "startet Anwendungen" ++ ++#~ msgid "A simple math Application" ++#~ msgstr "Einfache Mathe-Anwendung" ++ ++#~ msgid "MD5 checksum Application" ++#~ msgstr "MD5-Prüfsummen Anwendung" +diff --git a/feeds/luci/applications/luci-app-asterisk/po/el/asterisk.po b/feeds/luci/applications/luci-app-asterisk/po/el/asterisk.po +new file mode 100644 +index 0000000..7a0fee7 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-asterisk/po/el/asterisk.po +@@ -0,0 +1,71 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Report-Msgid-Bugs-To: \n" ++"POT-Creation-Date: 2009-06-10 03:40+0200\n" ++"PO-Revision-Date: 2012-03-19 14:55+0200\n" ++"Last-Translator: Vasilis \n" ++"Language-Team: LANGUAGE \n" ++"Language: el\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n != 1);\n" ++"X-Generator: Pootle 2.0.4\n" ++ ++#~ msgid "Asterisk General Options" ++#~ msgstr "Γενικές επιλογές του Asterisk" ++ ++#~ msgid "AGI directory" ++#~ msgstr "Φάκελος AGI" ++ ++#~ msgid "Debug Level" ++#~ msgstr "Επίπεδο αποσφαλμάτωσης" ++ ++#~ msgid "Disable some warnings" ++#~ msgstr "ΑπενεÏγοποίηση οÏισμένων μηνυμάτων" ++ ++#~ msgid "High Priority" ++#~ msgstr "Υψηλή ΠÏοτεÏαιότητα" ++ ++#~ msgid "Initialise Crypto" ++#~ msgstr "ΑÏχικοποίηση Crypto" ++ ++#~ msgid "Use Internal Timing" ++#~ msgstr "ΧÏήση εσωτεÏÎ¹ÎºÎ¿Ï Ï‡ÏονόμετÏου" ++ ++#~ msgid "Log directory" ++#~ msgstr "Φάκελος καταγÏαφής" ++ ++#~ msgid "Maximum number of calls allowed" ++#~ msgstr "Μέγιστος επιτÏεπόμενος αÏιθμός κλήσεων" ++ ++#~ msgid "Maximum load to stop accepting new calls" ++#~ msgstr "Μέγιστος φόÏτος για παÏση εισεÏχόμενων κλήσεων" ++ ++#~ msgid "Disable console colors" ++#~ msgstr "ΑπενεÏγοποίηση χÏωμάτων κονσόλας" ++ ++#~ msgid "Sound files Cache directory" ++#~ msgstr "ΚÏυφός φάκελος αÏχείων ήχου" ++ ++#~ msgid "include" ++#~ msgstr "πεÏιλαμβάνω" ++ ++#~ msgid "Clear global vars" ++#~ msgstr "ΚαθαÏισμός γενικών μεταβλητών" ++ ++#~ msgid "Connection to use" ++#~ msgstr "ΧÏήση σÏνδεσης" ++ ++#~ msgid "Reboot Method" ++#~ msgstr "Μέθοδος Επανεκκίνησης" ++ ++#~ msgid "Parameter" ++#~ msgstr "ΠαÏάμετÏος" ++ ++#~ msgid "JPEG (Joint Picture Experts Group) Image" ++#~ msgstr "Εικόνα JPEG (Joint Picture Experts Group)" ++ ++#~ msgid "Application" ++#~ msgstr "ΕφαÏμογή" +diff --git a/feeds/luci/applications/luci-app-asterisk/po/en/asterisk.po b/feeds/luci/applications/luci-app-asterisk/po/en/asterisk.po +new file mode 100644 +index 0000000..e462f56 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-asterisk/po/en/asterisk.po +@@ -0,0 +1,680 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Report-Msgid-Bugs-To: \n" ++"POT-Creation-Date: 2009-05-19 19:35+0200\n" ++"PO-Revision-Date: 2011-06-03 10:45+0200\n" ++"Last-Translator: Ladislav \n" ++"Language-Team: LANGUAGE \n" ++"Language: en\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n != 1);\n" ++"X-Generator: Pootle 2.0.4\n" ++ ++#~ msgid "Asterisk General Options" ++#~ msgstr "Asterisk General Options" ++ ++#~ msgid "AGI directory" ++#~ msgstr "AGI directory" ++ ++#~ msgid "Cache recorded sound files during recording" ++#~ msgstr "Cache recorded sound files during recording" ++ ++#~ msgid "Debug Level" ++#~ msgstr "Debug Level" ++ ++#~ msgid "Disable some warnings" ++#~ msgstr "Disable some warnings" ++ ++#~ msgid "Dump core on crash" ++#~ msgstr "Dump core on crash" ++ ++#~ msgid "High Priority" ++#~ msgstr "High Priority" ++ ++#~ msgid "Initialise Crypto" ++#~ msgstr "Initialise Crypto" ++ ++#~ msgid "Use Internal Timing" ++#~ msgstr "Use Internal Timing" ++ ++#~ msgid "Log directory" ++#~ msgstr "Log directory" ++ ++#~ msgid "Maximum number of calls allowed" ++#~ msgstr "Maximum number of calls allowed" ++ ++#~ msgid "Maximum load to stop accepting new calls" ++#~ msgstr "Maximum load to stop accepting new calls" ++ ++#~ msgid "Disable console colors" ++#~ msgstr "Disable console colors" ++ ++#~ msgid "Sound files Cache directory" ++#~ msgstr "Sound files Cache directory" ++ ++#~ msgid "The Group to run as" ++#~ msgstr "The Group to run as" ++ ++#~ msgid "The User to run as" ++#~ msgstr "The User to run as" ++ ++#~ msgid "Voicemail Spool directory" ++#~ msgstr "Voicemail Spool directory" ++ ++#~ msgid "Prefix UniquID with system name" ++#~ msgstr "Prefix UniquID with system name" ++ ++#~ msgid "Build transcode paths via SLINEAR, not directly" ++#~ msgstr "Build transcode paths via SLINEAR, not directly" ++ ++#~ msgid "Transmit SLINEAR silence while recording a channel" ++#~ msgstr "Transmit SLINEAR silence while recording a channel" ++ ++#~ msgid "Verbose Level" ++#~ msgstr "Verbose Level" ++ ++#~ msgid "Section dialplan" ++#~ msgstr "Section dialplan" ++ ++#~ msgid "include" ++#~ msgstr "include" ++ ++#~ msgid "Dialplan Extension" ++#~ msgstr "Dialplan Extension" ++ ++#~ msgid "Dialplan General Options" ++#~ msgstr "Dialplan General Options" ++ ++#~ msgid "Allow transfer" ++#~ msgstr "Allow transfer" ++ ++#~ msgid "Clear global vars" ++#~ msgstr "Clear global vars" ++ ++#~ msgid "Dialplan Goto" ++#~ msgstr "Dialplan Goto" ++ ++#~ msgid "Dialplan Conference" ++#~ msgstr "Dialplan Conference" ++ ++#~ msgid "Dialplan Time" ++#~ msgstr "Dialplan Time" ++ ++#~ msgid "Dialplan Voicemail" ++#~ msgstr "Dialplan Voicemail" ++ ++#~ msgid "Dial Zones for Dialplan" ++#~ msgstr "Dial Zones for Dialplan" ++ ++#~ msgid "Prefix to add matching dialplans" ++#~ msgstr "Prefix to add matching dialplans" ++ ++#~ msgid "Match International prefix" ++#~ msgstr "Match International prefix" ++ ++#~ msgid "Prefix (0) to add/remove to/from international numbers" ++#~ msgstr "Prefix (0) to add/remove to/from international numbers" ++ ++#~ msgid "localzone" ++#~ msgstr "localzone" ++ ++#~ msgid "Match plan" ++#~ msgstr "Match plan" ++ ++#~ msgid "Connection to use" ++#~ msgstr "Connection to use" ++ ++#~ msgid "Feature Key maps" ++#~ msgstr "Feature Key maps" ++ ++#~ msgid "Attended transfer key" ++#~ msgstr "Attended transfer key" ++ ++#~ msgid "Blind transfer key" ++#~ msgstr "Blind transfer key" ++ ++#~ msgid "Key to Disconnect call" ++#~ msgstr "Key to Disconnect call" ++ ++#~ msgid "Key to Park call" ++#~ msgstr "Key to Park call" ++ ++#~ msgid "Parking Feature" ++#~ msgstr "Parking Feature" ++ ++#~ msgid "ADSI Park" ++#~ msgstr "ADSI Park" ++ ++#~ msgid "Attended transfer timeout (sec)" ++#~ msgstr "Attended transfer timeout (sec)" ++ ++#~ msgid "One touch record key" ++#~ msgstr "One touch record key" ++ ++#~ msgid "Name of call context for parking" ++#~ msgstr "Name of call context for parking" ++ ++#~ msgid "Sound file to play to parked caller" ++#~ msgstr "Sound file to play to parked caller" ++ ++#~ msgid "Max time (ms) between digits for feature activation" ++#~ msgstr "Max time (ms) between digits for feature activation" ++ ++#~ msgid "Method to Find Parking slot" ++#~ msgstr "Method to Find Parking slot" ++ ++#~ msgid "parkedmusicclass" ++#~ msgstr "parkedmusicclass" ++ ++#~ msgid "Play courtesy tone to" ++#~ msgstr "Play courtesy tone to" ++ ++#~ msgid "Enable Parking" ++#~ msgstr "Enable Parking" ++ ++#~ msgid "Extension to dial to park" ++#~ msgstr "Extension to dial to park" ++ ++#~ msgid "Parking time (secs)" ++#~ msgstr "Parking time (secs)" ++ ++#~ msgid "Range of extensions for call parking" ++#~ msgstr "Range of extensions for call parking" ++ ++#~ msgid "Pickup extension" ++#~ msgstr "Pickup extension" ++ ++#~ msgid "Seconds to wait bewteen digits when transferring" ++#~ msgstr "Seconds to wait bewteen digits when transferring" ++ ++#~ msgid "sound when attended transfer is complete" ++#~ msgstr "sound when attended transfer is complete" ++ ++#~ msgid "Sound when attended transfer fails" ++#~ msgstr "Sound when attended transfer fails" ++ ++#~ msgid "Reload Hardware Config" ++#~ msgstr "Reload Hardware Config" ++ ++#~ msgid "Reboot Method" ++#~ msgstr "Reboot Method" ++ ++#~ msgid "Parameter" ++#~ msgstr "Parameter" ++ ++#~ msgid "Option type" ++#~ msgstr "Option type" ++ ++#~ msgid "User name" ++#~ msgstr "User name" ++ ++#~ msgid "IAX General Options" ++#~ msgstr "IAX General Options" ++ ++#~ msgid "Allow Codecs" ++#~ msgstr "Allow Codecs" ++ ++#~ msgid "Static" ++#~ msgstr "Static" ++ ++#~ msgid "Write Protect" ++#~ msgstr "Write Protect" ++ ++#~ msgid "Meetme Conference" ++#~ msgstr "Meetme Conference" ++ ++#~ msgid "Admin PIN" ++#~ msgstr "Admin PIN" ++ ++#~ msgid "Meeting PIN" ++#~ msgstr "Meeting PIN" ++ ++#~ msgid "Meetme Conference General Options" ++#~ msgstr "Meetme Conference General Options" ++ ++#~ msgid "Number of 20ms audio buffers to be used" ++#~ msgstr "Number of 20ms audio buffers to be used" ++ ++#~ msgid "Modules" ++#~ msgstr "Modules" ++ ++#~ msgid "Alarm Receiver Application" ++#~ msgstr "Alarm Receiver Application" ++ ++#~ msgid "Authentication Application" ++#~ msgstr "Authentication Application" ++ ++#~ msgid "Make sure asterisk doesnt save CDR" ++#~ msgstr "Make sure asterisk doesnt save CDR" ++ ++#~ msgid "Check if channel is available" ++#~ msgstr "Check if channel is available" ++ ++#~ msgid "Listen in on any channel" ++#~ msgstr "Listen in on any channel" ++ ++#~ msgid "Control Playback Application" ++#~ msgstr "Control Playback Application" ++ ++#~ msgid "Cuts up variables" ++#~ msgstr "Cuts up variables" ++ ++#~ msgid "Database access functions" ++#~ msgstr "Database access functions" ++ ++#~ msgid "Dialing Application" ++#~ msgstr "Dialing Application" ++ ++#~ msgid "Virtual Dictation Machine Application" ++#~ msgstr "Virtual Dictation Machine Application" ++ ++#~ msgid "Directed Call Pickup Support" ++#~ msgstr "Directed Call Pickup Support" ++ ++#~ msgid "Extension Directory" ++#~ msgstr "Extension Directory" ++ ++#~ msgid "DISA (Direct Inward System Access) Application" ++#~ msgstr "DISA (Direct Inward System Access) Application" ++ ++#~ msgid "Dump channel variables Application" ++#~ msgstr "Dump channel variables Application" ++ ++#~ msgid "Simple Echo Application" ++#~ msgstr "Simple Echo Application" ++ ++#~ msgid "ENUM Lookup" ++#~ msgstr "ENUM Lookup" ++ ++#~ msgid "Reevaluates strings" ++#~ msgstr "Reevaluates strings" ++ ++#~ msgid "Executes applications" ++#~ msgstr "Executes applications" ++ ++#~ msgid "External IVR application interface" ++#~ msgstr "External IVR application interface" ++ ++#~ msgid "Fork The CDR into 2 seperate entities" ++#~ msgstr "Fork The CDR into 2 seperate entities" ++ ++#~ msgid "Get ADSI CPE ID" ++#~ msgstr "Get ADSI CPE ID" ++ ++#~ msgid "Group Management Routines" ++#~ msgstr "Group Management Routines" ++ ++#~ msgid "Encode and Stream via icecast and ices" ++#~ msgstr "Encode and Stream via icecast and ices" ++ ++#~ msgid "Image Transmission Application" ++#~ msgstr "Image Transmission Application" ++ ++#~ msgid "Look up Caller*ID name/number from black" ++#~ msgstr "Look up Caller*ID name/number from black" ++ ++#~ msgid "Look up CallerID Name from local databas" ++#~ msgstr "Look up CallerID Name from local databas" ++ ++#~ msgid "Extension Macros" ++#~ msgstr "Extension Macros" ++ ++#~ msgid "A simple math Application" ++#~ msgstr "A simple math Application" ++ ++#~ msgid "MD5 checksum Application" ++#~ msgstr "MD5 checksum Application" ++ ++#~ msgid "Digital Milliwatt (mu-law) Test Application" ++#~ msgstr "Digital Milliwatt (mu-law) Test Application" ++ ++#~ msgid "Record a call and mix the audio during the recording" ++#~ msgstr "Record a call and mix the audio during the recording" ++ ++#~ msgid "Call Parking and Announce Application" ++#~ msgstr "Call Parking and Announce Application" ++ ++#~ msgid "Trivial Playback Application" ++#~ msgstr "Trivial Playback Application" ++ ++#~ msgid "Require phone number to be entered" ++#~ msgstr "Require phone number to be entered" ++ ++#~ msgid "True Call Queueing" ++#~ msgstr "True Call Queueing" ++ ++#~ msgid "Random goto" ++#~ msgstr "Random goto" ++ ++#~ msgid "Read Variable Application" ++#~ msgstr "Read Variable Application" ++ ++#~ msgid "Read in a file" ++#~ msgstr "Read in a file" ++ ++#~ msgid "Realtime Data Lookup/Rewrite" ++#~ msgstr "Realtime Data Lookup/Rewrite" ++ ++#~ msgid "Trivial Record Application" ++#~ msgstr "Trivial Record Application" ++ ++#~ msgid "Say time" ++#~ msgstr "Say time" ++ ++#~ msgid "Send DTMF digits Application" ++#~ msgstr "Send DTMF digits Application" ++ ++#~ msgid "Send Text Applications" ++#~ msgstr "Send Text Applications" ++ ++#~ msgid "Set CallerID Application" ++#~ msgstr "Set CallerID Application" ++ ++#~ msgid "CDR user field apps" ++#~ msgstr "CDR user field apps" ++ ++#~ msgid "load => .so ; Set CallerID Name" ++#~ msgstr "load => .so ; Set CallerID Name" ++ ++#~ msgid "load => .so ; Set CallerID Number" ++#~ msgstr "load => .so ; Set CallerID Number" ++ ++#~ msgid "Set RDNIS Number" ++#~ msgstr "Set RDNIS Number" ++ ++#~ msgid "Set ISDN Transfer Capability" ++#~ msgstr "Set ISDN Transfer Capability" ++ ++#~ msgid "SMS/PSTN handler" ++#~ msgstr "SMS/PSTN handler" ++ ++#~ msgid "Hangs up the requested channel" ++#~ msgstr "Hangs up the requested channel" ++ ++#~ msgid "Stack Routines" ++#~ msgstr "Stack Routines" ++ ++#~ msgid "Generic System() application" ++#~ msgstr "Generic System() application" ++ ++#~ msgid "Playback with Talk Detection" ++#~ msgstr "Playback with Talk Detection" ++ ++#~ msgid "Interface Test Application" ++#~ msgstr "Interface Test Application" ++ ++#~ msgid "Transfer" ++#~ msgstr "Transfer" ++ ++#~ msgid "TXTCIDName" ++#~ msgstr "TXTCIDName" ++ ++#~ msgid "Send URL Applications" ++#~ msgstr "Send URL Applications" ++ ++#~ msgid "Custom User Event Application" ++#~ msgstr "Custom User Event Application" ++ ++#~ msgid "Send verbose output" ++#~ msgstr "Send verbose output" ++ ++#~ msgid "Voicemail" ++#~ msgstr "Voicemail" ++ ++#~ msgid "Waits until first ring after time" ++#~ msgstr "Waits until first ring after time" ++ ++#~ msgid "Wait For Silence Application" ++#~ msgstr "Wait For Silence Application" ++ ++#~ msgid "While Loops and Conditional Execution" ++#~ msgstr "While Loops and Conditional Execution" ++ ++#~ msgid "Comma Separated Values CDR Backend" ++#~ msgstr "Comma Separated Values CDR Backend" ++ ++#~ msgid "Customizable Comma Separated Values CDR Backend" ++#~ msgstr "Customizable Comma Separated Values CDR Backend" ++ ++#~ msgid "Asterisk Call Manager CDR Backend" ++#~ msgstr "Asterisk Call Manager CDR Backend" ++ ++#~ msgid "MySQL CDR Backend" ++#~ msgstr "MySQL CDR Backend" ++ ++#~ msgid "PostgreSQL CDR Backend" ++#~ msgstr "PostgreSQL CDR Backend" ++ ++#~ msgid "SQLite CDR Backend" ++#~ msgstr "SQLite CDR Backend" ++ ++#~ msgid "Agent Proxy Channel" ++#~ msgstr "Agent Proxy Channel" ++ ++#~ msgid "Option chan_iax2" ++#~ msgstr "Option chan_iax2" ++ ++#~ msgid "Local Proxy Channel" ++#~ msgstr "Local Proxy Channel" ++ ++#~ msgid "Session Initiation Protocol (SIP)" ++#~ msgstr "Session Initiation Protocol (SIP)" ++ ++#~ msgid "Adaptive Differential PCM Coder/Decoder" ++#~ msgstr "Adaptive Differential PCM Coder/Decoder" ++ ++#~ msgid "A-law Coder/Decoder" ++#~ msgstr "A-law Coder/Decoder" ++ ++#~ msgid "A-law and Mulaw direct Coder/Decoder" ++#~ msgstr "A-law and Mulaw direct Coder/Decoder" ++ ++#~ msgid "ITU G.726-32kbps G726 Transcoder" ++#~ msgstr "ITU G.726-32kbps G726 Transcoder" ++ ++#~ msgid "GSM/PCM16 (signed linear) Codec Translation" ++#~ msgstr "GSM/PCM16 (signed linear) Codec Translation" ++ ++#~ msgid "Speex/PCM16 (signed linear) Codec Translator" ++#~ msgstr "Speex/PCM16 (signed linear) Codec Translator" ++ ++#~ msgid "Mu-law Coder/Decoder" ++#~ msgstr "Mu-law Coder/Decoder" ++ ++#~ msgid "Sun Microsystems AU format (signed linear)" ++#~ msgstr "Sun Microsystems AU format (signed linear)" ++ ++#~ msgid "G.723.1 Simple Timestamp File Format" ++#~ msgstr "G.723.1 Simple Timestamp File Format" ++ ++#~ msgid "Raw G.726 (16/24/32/40kbps) data" ++#~ msgstr "Raw G.726 (16/24/32/40kbps) data" ++ ++#~ msgid "Raw G729 data" ++#~ msgstr "Raw G729 data" ++ ++#~ msgid "Raw GSM data" ++#~ msgstr "Raw GSM data" ++ ++#~ msgid "Raw h263 data" ++#~ msgstr "Raw h263 data" ++ ++#~ msgid "JPEG (Joint Picture Experts Group) Image" ++#~ msgstr "JPEG (Joint Picture Experts Group) Image" ++ ++#~ msgid "Raw uLaw 8khz Audio support (PCM)" ++#~ msgstr "Raw uLaw 8khz Audio support (PCM)" ++ ++#~ msgid "load => .so ; Raw aLaw 8khz PCM Audio support" ++#~ msgstr "load => .so ; Raw aLaw 8khz PCM Audio support" ++ ++#~ msgid "Raw Signed Linear Audio support (SLN)" ++#~ msgstr "Raw Signed Linear Audio support (SLN)" ++ ++#~ msgid "Dialogic VOX (ADPCM) File Format" ++#~ msgstr "Dialogic VOX (ADPCM) File Format" ++ ++#~ msgid "Microsoft WAV format (8000hz Signed Line" ++#~ msgstr "Microsoft WAV format (8000hz Signed Line" ++ ++#~ msgid "Microsoft WAV format (Proprietary GSM)" ++#~ msgstr "Microsoft WAV format (Proprietary GSM)" ++ ++#~ msgid "Caller ID related dialplan functions" ++#~ msgstr "Caller ID related dialplan functions" ++ ++#~ msgid "ENUM Functions" ++#~ msgstr "ENUM Functions" ++ ++#~ msgid "URI encoding / decoding functions" ++#~ msgstr "URI encoding / decoding functions" ++ ++#~ msgid "Asterisk Extension Language Compiler" ++#~ msgstr "Asterisk Extension Language Compiler" ++ ++#~ msgid "Text Extension Configuration" ++#~ msgstr "Text Extension Configuration" ++ ++#~ msgid "load => .so ; Builtin dialplan functions" ++#~ msgstr "load => .so ; Builtin dialplan functions" ++ ++#~ msgid "Loopback Switch" ++#~ msgstr "Loopback Switch" ++ ++#~ msgid "Realtime Switch" ++#~ msgstr "Realtime Switch" ++ ++#~ msgid "Outgoing Spool Support" ++#~ msgstr "Outgoing Spool Support" ++ ++#~ msgid "Wil Cal U (Auto Dialer)" ++#~ msgstr "Wil Cal U (Auto Dialer)" ++ ++#~ msgid "MySQL Config Resource" ++#~ msgstr "MySQL Config Resource" ++ ++#~ msgid "ODBC Config Resource" ++#~ msgstr "ODBC Config Resource" ++ ++#~ msgid "PGSQL Module" ++#~ msgstr "PGSQL Module" ++ ++#~ msgid "Cryptographic Digital Signatures" ++#~ msgstr "Cryptographic Digital Signatures" ++ ++#~ msgid "Call Parking Resource" ++#~ msgstr "Call Parking Resource" ++ ++#~ msgid "Indications Configuration" ++#~ msgstr "Indications Configuration" ++ ++#~ msgid "Call Monitoring Resource" ++#~ msgstr "Call Monitoring Resource" ++ ++#~ msgid "Music On Hold Resource" ++#~ msgstr "Music On Hold Resource" ++ ++#~ msgid "ODBC Resource" ++#~ msgstr "ODBC Resource" ++ ++#~ msgid "SMDI Module" ++#~ msgstr "SMDI Module" ++ ++#~ msgid "SNMP Module" ++#~ msgstr "SNMP Module" ++ ++#~ msgid "Music On Hold" ++#~ msgstr "Music On Hold" ++ ++#~ msgid "Application" ++#~ msgstr "Application" ++ ++#~ msgid "Directory of Music" ++#~ msgstr "Directory of Music" ++ ++#~ msgid "Option mode" ++#~ msgstr "Option mode" ++ ++#~ msgid "Random Play" ++#~ msgstr "Random Play" ++ ++#~ msgid "DTMF mode" ++#~ msgstr "DTMF mode" ++ ++#~ msgid "Primary domain identity for From: headers" ++#~ msgstr "Primary domain identity for From: headers" ++ ++#~ msgid "From user (required by many SIP providers)" ++#~ msgstr "From user (required by many SIP providers)" ++ ++#~ msgid "Ring on incoming dialplan contexts" ++#~ msgstr "Ring on incoming dialplan contexts" ++ ++#~ msgid "Allow Insecure for" ++#~ msgstr "Allow Insecure for" ++ ++#~ msgid "Mailbox for MWI" ++#~ msgstr "Mailbox for MWI" ++ ++#~ msgid "NAT between phone and Asterisk" ++#~ msgstr "NAT between phone and Asterisk" ++ ++#~ msgid "Check tags in headers" ++#~ msgstr "Check tags in headers" ++ ++#~ msgid "Reply Timeout (ms) for down connection" ++#~ msgstr "Reply Timeout (ms) for down connection" ++ ++#~ msgid "Register connection" ++#~ msgstr "Register connection" ++ ++#~ msgid "Dial own extension for mailbox" ++#~ msgstr "Dial own extension for mailbox" ++ ++#~ msgid "Client Type" ++#~ msgstr "Client Type" ++ ++#~ msgid "Username" ++#~ msgstr "Username" ++ ++#~ msgid "Section sipgeneral" ++#~ msgstr "Section sipgeneral" ++ ++#~ msgid "Allow codecs" ++#~ msgstr "Allow codecs" ++ ++#~ msgid "SIP realm" ++#~ msgstr "SIP realm" ++ ++#~ msgid "Voicemail general options" ++#~ msgstr "Voicemail general options" ++ ++#~ msgid "From Email address of server" ++#~ msgstr "From Email address of server" ++ ++#~ msgid "Voice Mail boxes" ++#~ msgstr "Voice Mail boxes" ++ ++#~ msgid "Email contains attachment" ++#~ msgstr "Email contains attachment" ++ ++#~ msgid "Email" ++#~ msgstr "Email" ++ ++#~ msgid "Display Name" ++#~ msgstr "Display Name" ++ ++#~ msgid "Password" ++#~ msgstr "Password" ++ ++#~ msgid "zone" ++#~ msgstr "zone" ++ ++#~ msgid "Voice Zone settings" ++#~ msgstr "Voice Zone settings" ++ ++#~ msgid "Message Format" ++#~ msgstr "Message Format" +diff --git a/feeds/luci/applications/luci-app-asterisk/po/es/asterisk.po b/feeds/luci/applications/luci-app-asterisk/po/es/asterisk.po +new file mode 100644 +index 0000000..8e2fe1e +--- /dev/null ++++ b/feeds/luci/applications/luci-app-asterisk/po/es/asterisk.po +@@ -0,0 +1,355 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Report-Msgid-Bugs-To: \n" ++"POT-Creation-Date: 2009-06-10 03:41+0200\n" ++"PO-Revision-Date: 2012-04-16 00:52+0200\n" ++"Last-Translator: Jose \n" ++"Language-Team: LANGUAGE \n" ++"Language: es\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n != 1);\n" ++"X-Generator: Pootle 2.0.4\n" ++ ++#~ msgid "Asterisk General Options" ++#~ msgstr "Opciones Generales de Asterisk" ++ ++#~ msgid "AGI directory" ++#~ msgstr "Directorio AGI" ++ ++#~ msgid "Cache recorded sound files during recording" ++#~ msgstr "Almacena los ficheros de sonido mientras se graba" ++ ++#~ msgid "Debug Level" ++#~ msgstr "Nivel de Depuración" ++ ++#~ msgid "Disable some warnings" ++#~ msgstr "Desactivar algunos avisos" ++ ++#~ msgid "Dump core on crash" ++#~ msgstr "Volcar núcleo en caso de fallo" ++ ++#~ msgid "High Priority" ++#~ msgstr "Prioridad Alta" ++ ++#~ msgid "Initialise Crypto" ++#~ msgstr "Inicializar Crypto" ++ ++#~ msgid "Use Internal Timing" ++#~ msgstr "Usar temporización interna" ++ ++#~ msgid "Log directory" ++#~ msgstr "Directorio de registro" ++ ++#~ msgid "Maximum number of calls allowed" ++#~ msgstr "Número máximo de llamadas permitidas" ++ ++#~ msgid "Maximum load to stop accepting new calls" ++#~ msgstr "Carga máxima para dejar de admitir nuevas llamadas" ++ ++#~ msgid "Disable console colors" ++#~ msgstr "Desactivar colores en la consola" ++ ++#~ msgid "Sound files Cache directory" ++#~ msgstr "Directorio de caché de archivos de sonido" ++ ++#~ msgid "The Group to run as" ++#~ msgstr "Grupo en el que ejecutarse" ++ ++#~ msgid "The User to run as" ++#~ msgstr "Usuario como el que se ejecutará" ++ ++#~ msgid "Voicemail Spool directory" ++#~ msgstr "Directorio de la cola de mensajes de voz" ++ ++#~ msgid "Prefix UniquID with system name" ++#~ msgstr "Prefijo UniquID con el nombre del sistema" ++ ++#~ msgid "Build transcode paths via SLINEAR, not directly" ++#~ msgstr "" ++#~ "Construir las rutas de transcodificación usando SLINEAR, no directamente" ++ ++#~ msgid "Transmit SLINEAR silence while recording a channel" ++#~ msgstr "Transmitir silencio SLINEAR mientras graba un canal" ++ ++#~ msgid "Verbose Level" ++#~ msgstr "Nivel de detalle" ++ ++#~ msgid "Section dialplan" ++#~ msgstr "Sección Dialplan" ++ ++#~ msgid "include" ++#~ msgstr "incluir" ++ ++#~ msgid "Dialplan Extension" ++#~ msgstr "Extensión Dialplan" ++ ++#~ msgid "Dialplan General Options" ++#~ msgstr "Opciones generales de Dialplan" ++ ++#~ msgid "Allow transfer" ++#~ msgstr "Permitir transferencia" ++ ++#~ msgid "Clear global vars" ++#~ msgstr "Limpiar las variables globales" ++ ++#~ msgid "Dialplan Goto" ++#~ msgstr "Dialplan Goto" ++ ++#~ msgid "Dialplan Conference" ++#~ msgstr "Conferencia Dialplan" ++ ++#~ msgid "Dialplan Time" ++#~ msgstr "Dialplan Time" ++ ++#~ msgid "Dialplan Voicemail" ++#~ msgstr "Buzón de voz de Dialplan" ++ ++#~ msgid "Dial Zones for Dialplan" ++#~ msgstr "Zonas de marcado para Dialplan" ++ ++#~ msgid "Prefix to add matching dialplans" ++#~ msgstr "Prefijo para añadir coincidencias de plan de marcado" ++ ++#~ msgid "Match International prefix" ++#~ msgstr "Coincidir con el prefijo internacional" ++ ++#~ msgid "Prefix (0) to add/remove to/from international numbers" ++#~ msgstr "Prefijo (0) para añadir/eliminar a/de números internacionales" ++ ++#~ msgid "localzone" ++#~ msgstr "zona local" ++ ++#~ msgid "Match plan" ++#~ msgstr "Coincidir con el plan" ++ ++#~ msgid "Connection to use" ++#~ msgstr "Conexión que se utilizará" ++ ++#~ msgid "Feature Key maps" ++#~ msgstr "Mapa de Funciones Clave" ++ ++#~ msgid "Attended transfer key" ++#~ msgstr "Tecla de transferencia asistida" ++ ++#~ msgid "Blind transfer key" ++#~ msgstr "Tecla de transferencia ciega" ++ ++#~ msgid "Key to Disconnect call" ++#~ msgstr "Tecla para desconectar la llamada" ++ ++#~ msgid "Key to Park call" ++#~ msgstr "Tecla para retener la llamada" ++ ++#~ msgid "Parking Feature" ++#~ msgstr "Función de llamada en espera" ++ ++#~ msgid "ADSI Park" ++#~ msgstr "Llamada en espera ADSI" ++ ++#~ msgid "Attended transfer timeout (sec)" ++#~ msgstr "Tiempo de espera de transferencia asistida (seg)" ++ ++#~ msgid "One touch record key" ++#~ msgstr "Tecla de grabacion con una sola tecla" ++ ++#~ msgid "Name of call context for parking" ++#~ msgstr "Nombre del contexto de la llamada en espera" ++ ++#~ msgid "Sound file to play to parked caller" ++#~ msgstr "Archivo de sonido para reproducir en la llamada en espera" ++ ++#~ msgid "Max time (ms) between digits for feature activation" ++#~ msgstr "Tiempo máximo (en ms) entre digitos para la activación de funciones" ++ ++#~ msgid "Method to Find Parking slot" ++#~ msgstr "Método para encontrar una ranura de llamada en espera" ++ ++#~ msgid "parkedmusicclass" ++#~ msgstr "parkedmusicclass" ++ ++#~ msgid "Play courtesy tone to" ++#~ msgstr "Reproducir tono de cortesía en" ++ ++#~ msgid "Enable Parking" ++#~ msgstr "Activar llamadas en espera" ++ ++#~ msgid "Extension to dial to park" ++#~ msgstr "Extensión a marcar para dejar en espera una llamada" ++ ++#~ msgid "Parking time (secs)" ++#~ msgstr "Tiempo de llamada en espera (segs)" ++ ++#~ msgid "Range of extensions for call parking" ++#~ msgstr "Rango de extensiones para llamadas en espera" ++ ++#~ msgid "Pickup extension" ++#~ msgstr "Extensión de Pickup" ++ ++#~ msgid "Seconds to wait bewteen digits when transferring" ++#~ msgstr "Segundos de espera entre digitos mientras se transfiere" ++ ++#~ msgid "sound when attended transfer is complete" ++#~ msgstr "sonido cuando se completa la transferencia asistida" ++ ++#~ msgid "Sound when attended transfer fails" ++#~ msgstr "sonido para cuando falla la transferencia asistida" ++ ++#~ msgid "Reload Hardware Config" ++#~ msgstr "Recargar la configuración del Hardware" ++ ++#~ msgid "Reboot Method" ++#~ msgstr "Método de reinicio" ++ ++#~ msgid "Parameter" ++#~ msgstr "Parámetro" ++ ++#~ msgid "Option type" ++#~ msgstr "Tipo de opción" ++ ++#~ msgid "User name" ++#~ msgstr "Nombre de Usuario" ++ ++#~ msgid "IAX General Options" ++#~ msgstr "Opciones Generales de IAX" ++ ++#~ msgid "Allow Codecs" ++#~ msgstr "Permitir Codecs" ++ ++#~ msgid "Static" ++#~ msgstr "Estático" ++ ++#~ msgid "Write Protect" ++#~ msgstr "Protección contra escritura" ++ ++#~ msgid "Meetme Conference" ++#~ msgstr "Conferencia Meetme (entre dos)" ++ ++#~ msgid "Admin PIN" ++#~ msgstr "PIN de Administrador" ++ ++#~ msgid "Meeting PIN" ++#~ msgstr "PIN de Reunión (Meeting)" ++ ++#~ msgid "Meetme Conference General Options" ++#~ msgstr "Opciones generales de conferencia Meetme (entre dos)" ++ ++#~ msgid "Number of 20ms audio buffers to be used" ++#~ msgstr "Número de memorias intermedias de audio de 20 ms a utilizar" ++ ++#~ msgid "Modules" ++#~ msgstr "Módulos" ++ ++#~ msgid "Alarm Receiver Application" ++#~ msgstr "Aplicación de Recepción de Alarma" ++ ++#~ msgid "Authentication Application" ++#~ msgstr "Aplicación de autenticación" ++ ++#~ msgid "Make sure asterisk doesnt save CDR" ++#~ msgstr "Asegúrate que asterisk no graba CDR" ++ ++#~ msgid "Check if channel is available" ++#~ msgstr "Comprueba que el canal esté disponible" ++ ++#~ msgid "Listen in on any channel" ++#~ msgstr "Escuchar en cualquier canal" ++ ++#~ msgid "Control Playback Application" ++#~ msgstr "Aplicación para el control de reproducción" ++ ++#~ msgid "Cuts up variables" ++#~ msgstr "Variables de corte" ++ ++#~ msgid "Database access functions" ++#~ msgstr "Funciones de acceso a la Base de Datos" ++ ++#~ msgid "Dialing Application" ++#~ msgstr "Aplicación de marcado telefónico" ++ ++#~ msgid "Virtual Dictation Machine Application" ++#~ msgstr "Aplicación de máquina de Dictado Virtual" ++ ++#~ msgid "Directed Call Pickup Support" ++#~ msgstr "Apoyo a la captura de llamadas dirigidas" ++ ++#~ msgid "Extension Directory" ++#~ msgstr "Directorio de Extensiones" ++ ++#~ msgid "DISA (Direct Inward System Access) Application" ++#~ msgstr "Aplicación DISA (Acceso directo entrante al sistema)" ++ ++#~ msgid "Simple Echo Application" ++#~ msgstr "Aplicación de Eco Simple" ++ ++#~ msgid "ENUM Lookup" ++#~ msgstr "Consulta ENUM" ++ ++#~ msgid "Reevaluates strings" ++#~ msgstr "Reevaluar secuencia de caracteres" ++ ++#~ msgid "Executes applications" ++#~ msgstr "Ejecuta aplicaciones" ++ ++#~ msgid "External IVR application interface" ++#~ msgstr "Interfaz de aplicación IVR externa" ++ ++#~ msgid "Fork The CDR into 2 seperate entities" ++#~ msgstr "Bifurcar el CDR en 2 entidades separadas" ++ ++#~ msgid "Get ADSI CPE ID" ++#~ msgstr "Obtener el ADSI CPE ID" ++ ++#~ msgid "Group Management Routines" ++#~ msgstr "Rutinas de Administración de grupo" ++ ++#~ msgid "Encode and Stream via icecast and ices" ++#~ msgstr "Codifica y emite a través de icecast e ices" ++ ++#~ msgid "Image Transmission Application" ++#~ msgstr "Aplicación de transmisión de imagen" ++ ++#~ msgid "Look up Caller*ID name/number from black" ++#~ msgstr "Buscar la identidad del llamante nombre/número en la lista negra" ++ ++#~ msgid "Look up CallerID Name from local databas" ++#~ msgstr "" ++#~ "Buscar el nombre de identidad del llamante en las bases de datos locales" ++ ++#~ msgid "Extension Macros" ++#~ msgstr "Macros de Extensión" ++ ++#~ msgid "A simple math Application" ++#~ msgstr "Una simple aplicación matemática" ++ ++#~ msgid "MD5 checksum Application" ++#~ msgstr "Aplicación de suma de verificación MD5" ++ ++#~ msgid "Digital Milliwatt (mu-law) Test Application" ++#~ msgstr "Aplicación de testeo de Milivatios Digitales (mu-law)" ++ ++#~ msgid "Record a call and mix the audio during the recording" ++#~ msgstr "Grabar una llamada y mezclar el sonido durante la grabación" ++ ++#~ msgid "Call Parking and Announce Application" ++#~ msgstr "Aplicación de Anuncio y Llamada en Espera" ++ ++#~ msgid "Trivial Playback Application" ++#~ msgstr "Aplicación de reproducción trivial" ++ ++#~ msgid "Require phone number to be entered" ++#~ msgstr "Requiere que se introduzca un número de teléfono" ++ ++#~ msgid "True Call Queueing" ++#~ msgstr "Lista de espera real de llamadas" ++ ++#~ msgid "Random goto" ++#~ msgstr "Goto (ir a) Aleatorio" ++ ++#~ msgid "Read Variable Application" ++#~ msgstr "Aplicación de lectura de variables" ++ ++#~ msgid "Read in a file" ++#~ msgstr "Leer en un archivo" +diff --git a/feeds/luci/applications/luci-app-asterisk/po/fr/asterisk.po b/feeds/luci/applications/luci-app-asterisk/po/fr/asterisk.po +new file mode 100644 +index 0000000..75c1d38 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-asterisk/po/fr/asterisk.po +@@ -0,0 +1,569 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Report-Msgid-Bugs-To: \n" ++"POT-Creation-Date: 2009-05-19 19:36+0200\n" ++"PO-Revision-Date: 2011-11-23 22:34+0200\n" ++"Last-Translator: fredb \n" ++"Language-Team: LANGUAGE \n" ++"Language: fr\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n > 1);\n" ++"X-Generator: Pootle 2.0.4\n" ++ ++#~ msgid "Asterisk General Options" ++#~ msgstr "Paramètres généraux d'Asterisk" ++ ++#~ msgid "AGI directory" ++#~ msgstr "Répertoire AGI" ++ ++#~ msgid "Cache recorded sound files during recording" ++#~ msgstr "Mes les sons enregistrés en cache pendant l'enregistrement" ++ ++#~ msgid "Debug Level" ++#~ msgstr "Niveau de déboguage" ++ ++#~ msgid "Disable some warnings" ++#~ msgstr "Désactiver certaines alertes" ++ ++#~ msgid "Dump core on crash" ++#~ msgstr "Créer une image-core en cas de crash" ++ ++#~ msgid "High Priority" ++#~ msgstr "Priorité haute" ++ ++#~ msgid "Initialise Crypto" ++#~ msgstr "Initialise le chiffrage" ++ ++#~ msgid "Use Internal Timing" ++#~ msgstr "Utiliser un délai interne" ++ ++#~ msgid "Log directory" ++#~ msgstr "Répertoire des journaux" ++ ++#~ msgid "Maximum number of calls allowed" ++#~ msgstr "Nombre maximum d'appels autorisés" ++ ++#~ msgid "Maximum load to stop accepting new calls" ++#~ msgstr "Charge maximum jusqu'à laquelle on accepte de nouveaux appels" ++ ++#~ msgid "Disable console colors" ++#~ msgstr "Désactiver les couleurs de la console" ++ ++#~ msgid "Sound files Cache directory" ++#~ msgstr "Répertoire de cache des ficihers-sons" ++ ++#~ msgid "The Group to run as" ++#~ msgstr "Exécuté avec ce groupe" ++ ++#~ msgid "The User to run as" ++#~ msgstr "Exécuté avec cet utilisateur" ++ ++#~ msgid "Voicemail Spool directory" ++#~ msgstr "Répertoire de stockage du répondeur" ++ ++#~ msgid "Prefix UniquID with system name" ++#~ msgstr "Préfixer le « UniquID » avec le nom du système" ++ ++#~ msgid "Build transcode paths via SLINEAR, not directly" ++#~ msgstr "Construire des chemins de traduction via SLINEAR, pas directement" ++ ++#~ msgid "Transmit SLINEAR silence while recording a channel" ++#~ msgstr "Transmettre le silence SLINEAR lors de l'enregistrement d'un canal" ++ ++#~ msgid "Verbose Level" ++#~ msgstr "Niveau de verbosité" ++ ++#~ msgid "Section dialplan" ++#~ msgstr "Section du plan de numérotation" ++ ++#~ msgid "include" ++#~ msgstr "Inclure" ++ ++#~ msgid "Dialplan Extension" ++#~ msgstr "Extension du plan de numérotation" ++ ++#~ msgid "Dialplan General Options" ++#~ msgstr "Paramètres généraux du plan de numérotation" ++ ++#~ msgid "Allow transfer" ++#~ msgstr "Permettre le transfert" ++ ++#~ msgid "Clear global vars" ++#~ msgstr "Effacer les variables globales" ++ ++#~ msgid "Dialplan Conference" ++#~ msgstr "Règles d'aiguillage pour la conférence" ++ ++#~ msgid "Dialplan Time" ++#~ msgstr "Règles d'aiguillage liées au temps" ++ ++#~ msgid "Dialplan Voicemail" ++#~ msgstr "Règles d'aiguillage de la messagerie vocale" ++ ++#~ msgid "Match International prefix" ++#~ msgstr "Préfixe correspondant à l'international" ++ ++#~ msgid "Prefix (0) to add/remove to/from international numbers" ++#~ msgstr "Préfixe (0) à ajouter à/retirer d'un numéro international" ++ ++#~ msgid "localzone" ++#~ msgstr "zone locale" ++ ++#~ msgid "Match plan" ++#~ msgstr "Règle de correspondance" ++ ++#~ msgid "Connection to use" ++#~ msgstr "Connexion à utiliser" ++ ++#~ msgid "Blind transfer key" ++#~ msgstr "Touche de transfert en aveugle" ++ ++#~ msgid "Key to Disconnect call" ++#~ msgstr "Touche pour déconnecter un appel" ++ ++#~ msgid "Key to Park call" ++#~ msgstr "Touche pour parquer un appel" ++ ++#~ msgid "Parking Feature" ++#~ msgstr "Capacité de mise en parking" ++ ++#~ msgid "ADSI Park" ++#~ msgstr "Parking ADSI" ++ ++#~ msgid "Attended transfer timeout (sec)" ++#~ msgstr "Délai max d'un transfert programmé (secondes)" ++ ++#~ msgid "Name of call context for parking" ++#~ msgstr "Nom du contexte d'appel pour une mise en parking" ++ ++#~ msgid "Sound file to play to parked caller" ++#~ msgstr "Fichier-son à jouer aux appelants mis en parking" ++ ++#~ msgid "Max time (ms) between digits for feature activation" ++#~ msgstr "" ++#~ "Durée max (en ms) entre les chiffres pour l'activation d'une commande" ++ ++#~ msgid "Method to Find Parking slot" ++#~ msgstr "Méthode pour trouver une place de parking" ++ ++#~ msgid "Play courtesy tone to" ++#~ msgstr "Jouer une tonalité de courtoisie à" ++ ++#~ msgid "Enable Parking" ++#~ msgstr "Activer la mise en parking" ++ ++#~ msgid "Parking time (secs)" ++#~ msgstr "Durée de mise en parking (secondes)" ++ ++#~ msgid "Seconds to wait bewteen digits when transferring" ++#~ msgstr "Attente en secondes entre les chiffres Lors d'un transfert" ++ ++#~ msgid "sound when attended transfer is complete" ++#~ msgstr "Son joué quand un transfert programmé est effectué" ++ ++#~ msgid "Sound when attended transfer fails" ++#~ msgstr "Son joué quand nu transfert programmé rate" ++ ++#~ msgid "Reload Hardware Config" ++#~ msgstr "Relit la configuration matérielle" ++ ++#~ msgid "Reboot Method" ++#~ msgstr "Méthode de redémarrage" ++ ++#~ msgid "Parameter" ++#~ msgstr "Paramètre" ++ ++#~ msgid "Option type" ++#~ msgstr "Type d'option" ++ ++#~ msgid "User name" ++#~ msgstr "Nom d'utilisateur" ++ ++#~ msgid "IAX General Options" ++#~ msgstr "Paramètres généraux du protocole IAX" ++ ++#~ msgid "Allow Codecs" ++#~ msgstr "Codecs autorisés" ++ ++#~ msgid "Static" ++#~ msgstr "Statique" ++ ++#~ msgid "Write Protect" ++#~ msgstr "Protection contre l'écriture" ++ ++#~ msgid "Meetme Conference" ++#~ msgstr "Conférence « Meetme »" ++ ++#~ msgid "Admin PIN" ++#~ msgstr "ID d'administrateur" ++ ++#~ msgid "Meeting PIN" ++#~ msgstr "Code de conférence" ++ ++#~ msgid "Meetme Conference General Options" ++#~ msgstr "Options générales de conférence « Meetme »" ++ ++#~ msgid "Number of 20ms audio buffers to be used" ++#~ msgstr "Nombre de buffers audio de 20 ms à utiliser" ++ ++#~ msgid "Modules" ++#~ msgstr "Modules" ++ ++#~ msgid "Alarm Receiver Application" ++#~ msgstr "Application de réception d'alarme" ++ ++#~ msgid "Authentication Application" ++#~ msgstr "Application d'authentification" ++ ++#~ msgid "Make sure asterisk doesnt save CDR" ++#~ msgstr "S'assure qu'Asterisk ne sauve pas le CDR" ++ ++#~ msgid "Check if channel is available" ++#~ msgstr "Vérifie que le canal est libre" ++ ++#~ msgid "Listen in on any channel" ++#~ msgstr "Écoute sur n'importe quel canal" ++ ++#~ msgid "Database access functions" ++#~ msgstr "Fonctions d'accès aux bases de données" ++ ++#~ msgid "Dialing Application" ++#~ msgstr "Application de numérotation" ++ ++#~ msgid "Virtual Dictation Machine Application" ++#~ msgstr "Application de dictaphone virtuel" ++ ++#~ msgid "Dump channel variables Application" ++#~ msgstr "Application de copie des variables d'un canal" ++ ++#~ msgid "Simple Echo Application" ++#~ msgstr "Application de simple écho" ++ ++#~ msgid "ENUM Lookup" ++#~ msgstr "Résolution d'un ENUM" ++ ++#~ msgid "Reevaluates strings" ++#~ msgstr "Ré-évaluer les chaînes" ++ ++#~ msgid "Executes applications" ++#~ msgstr "Lance les applications" ++ ++#~ msgid "External IVR application interface" ++#~ msgstr "Interface d'application SVI externe" ++ ++#~ msgid "Fork The CDR into 2 seperate entities" ++#~ msgstr "Dupliquer le CDR en deux entités séparées" ++ ++#~ msgid "Get ADSI CPE ID" ++#~ msgstr "Obtenir le « ADSI CPE ID »" ++ ++#~ msgid "Group Management Routines" ++#~ msgstr "Fonctions de gestion des groupes" ++ ++#~ msgid "Encode and Stream via icecast and ices" ++#~ msgstr "Coder et diffuser via icecast et ices" ++ ++#~ msgid "Image Transmission Application" ++#~ msgstr "Application d'envoi d'image" ++ ++#~ msgid "Look up CallerID Name from local databas" ++#~ msgstr "Rechercher le nom de l'appelant dans la base locale" ++ ++#~ msgid "Extension Macros" ++#~ msgstr "Macros d'extension" ++ ++#~ msgid "A simple math Application" ++#~ msgstr "Une simple application mathématique" ++ ++#~ msgid "MD5 checksum Application" ++#~ msgstr "Application de signature MD5" ++ ++#~ msgid "Record a call and mix the audio during the recording" ++#~ msgstr "Enregistre un appelle et mixe le son pendant l'enregistrement" ++ ++#~ msgid "Call Parking and Announce Application" ++#~ msgstr "Application de mise en parking d'appel et annonce" ++ ++#~ msgid "Trivial Playback Application" ++#~ msgstr "Application de simple écoute" ++ ++#~ msgid "Require phone number to be entered" ++#~ msgstr "Nécessite d'entrer un numéro de téléphone" ++ ++#~ msgid "True Call Queueing" ++#~ msgstr "Véritable sérialisation des appels" ++ ++#~ msgid "Read Variable Application" ++#~ msgstr "Application de lecture d'une variable" ++ ++#~ msgid "Read in a file" ++#~ msgstr "Lire dans un fichier" ++ ++#~ msgid "Realtime Data Lookup/Rewrite" ++#~ msgstr "Recherche/ré-écriture de données en temps-réel" ++ ++#~ msgid "Trivial Record Application" ++#~ msgstr "Application de simple enregistrement" ++ ++#~ msgid "Say time" ++#~ msgstr "Dis l'heure" ++ ++#~ msgid "Send DTMF digits Application" ++#~ msgstr "Application d'envoi de chiffres en DTMF" ++ ++#~ msgid "Send Text Applications" ++#~ msgstr "Applications d'envoi de texte" ++ ++#~ msgid "Set CallerID Application" ++#~ msgstr "Application de positionnement de l'identifiant de l'appelant" ++ ++#~ msgid "load => .so ; Set CallerID Name" ++#~ msgstr "" ++#~ "charger => .so ; Positionner le nom dans l'identifiant de l'appelant" ++ ++#~ msgid "load => .so ; Set CallerID Number" ++#~ msgstr "" ++#~ "charger => .so ; Positionner le numéro dans l'identifiant de l'appelant" ++ ++#~ msgid "Set RDNIS Number" ++#~ msgstr "Positionner le numéro RDNIS" ++ ++#~ msgid "Set ISDN Transfer Capability" ++#~ msgstr "Activer la possibilité de transfert RNIS" ++ ++#~ msgid "SMS/PSTN handler" ++#~ msgstr "Gestionnaire SMS/RTC" ++ ++#~ msgid "Hangs up the requested channel" ++#~ msgstr "Raccroche le canal demandé" ++ ++#~ msgid "Stack Routines" ++#~ msgstr "Empile les routines" ++ ++#~ msgid "Generic System() application" ++#~ msgstr "Application générique System()" ++ ++#~ msgid "Playback with Talk Detection" ++#~ msgstr "Jouer un son avec la détection de parole" ++ ++#~ msgid "Interface Test Application" ++#~ msgstr "Application de test d'interface" ++ ++#~ msgid "Transfer" ++#~ msgstr "Transfert" ++ ++#~ msgid "Send URL Applications" ++#~ msgstr "Applications d'envois d'URL" ++ ++#~ msgid "Send verbose output" ++#~ msgstr "Envoyer une sortie détaillée" ++ ++#~ msgid "Voicemail" ++#~ msgstr "Répondeur" ++ ++#~ msgid "Wait For Silence Application" ++#~ msgstr "Application d'attente de silence" ++ ++#~ msgid "Session Initiation Protocol (SIP)" ++#~ msgstr "Session Initiation Protocol (SIP)" ++ ++#~ msgid "Adaptive Differential PCM Coder/Decoder" ++#~ msgstr "Codec PCM différentiel adaptatif (ADPCM)" ++ ++#~ msgid "A-law Coder/Decoder" ++#~ msgstr "Codec loi-A" ++ ++#~ msgid "A-law and Mulaw direct Coder/Decoder" ++#~ msgstr "Codec loi-A et loi-Mu directs" ++ ++#~ msgid "ITU G.726-32kbps G726 Transcoder" ++#~ msgstr "Transcodeur G726 (ITU G.726 32 kbit/s)" ++ ++#~ msgid "GSM/PCM16 (signed linear) Codec Translation" ++#~ msgstr "Codec de traduction GSM/PCM16 (linéaire signé)" ++ ++#~ msgid "Speex/PCM16 (signed linear) Codec Translator" ++#~ msgstr "Codec de traduction Speex/PCM16 (linéaire signé)" ++ ++#~ msgid "Mu-law Coder/Decoder" ++#~ msgstr "Codec loi-Mu" ++ ++#~ msgid "Sun Microsystems AU format (signed linear)" ++#~ msgstr "Format Sun Microsystems AU (linéaire signé)" ++ ++#~ msgid "G.723.1 Simple Timestamp File Format" ++#~ msgstr "Format de fichier G.723.1 à horodatage simple" ++ ++#~ msgid "Raw G.726 (16/24/32/40kbps) data" ++#~ msgstr "Données brutes G.726 (16/24/32/40 kbit/s)" ++ ++#~ msgid "Raw G729 data" ++#~ msgstr "Données brutes G729" ++ ++#~ msgid "Raw GSM data" ++#~ msgstr "Données brutes GSM" ++ ++#~ msgid "Raw h263 data" ++#~ msgstr "Données brutes h263" ++ ++#~ msgid "JPEG (Joint Picture Experts Group) Image" ++#~ msgstr "Image JPEG (Joint Picture Experts Group)" ++ ++#~ msgid "Raw uLaw 8khz Audio support (PCM)" ++#~ msgstr "Gestion de l'audio en loi-µ 8 kHz brute (PCM)" ++ ++#~ msgid "load => .so ; Raw aLaw 8khz PCM Audio support" ++#~ msgstr "Charger => .so ; Gestion de l'audio en loi-A brute PCM 8 kHz" ++ ++#~ msgid "Raw Signed Linear Audio support (SLN)" ++#~ msgstr "Gestion de l'audio en linéaire signé brut (SLN)" ++ ++#~ msgid "Dialogic VOX (ADPCM) File Format" ++#~ msgstr "Format de fichier Dialogic VOX (ADPCM)" ++ ++#~ msgid "Microsoft WAV format (8000hz Signed Line" ++#~ msgstr "Format Microsoft WAV (8 kHz linéaire signé)" ++ ++#~ msgid "Microsoft WAV format (Proprietary GSM)" ++#~ msgstr "Format Microsoft WAV (GSM propriétaire)" ++ ++#~ msgid "Caller ID related dialplan functions" ++#~ msgstr "Fonctions d'aiguillage des appels liées à l'identifiant d'appel" ++ ++#~ msgid "ENUM Functions" ++#~ msgstr "Fonctions ENUM" ++ ++#~ msgid "URI encoding / decoding functions" ++#~ msgstr "Fonctions de codage/décodage des URI" ++ ++#~ msgid "Asterisk Extension Language Compiler" ++#~ msgstr "Compilateur du langage d'extension d'Asterisk" ++ ++#~ msgid "Text Extension Configuration" ++#~ msgstr "Configuration de l'extension Texte" ++ ++#~ msgid "load => .so ; Builtin dialplan functions" ++#~ msgstr "charger => .so ; fonctions natives d'aiguillages des appels" ++ ++#~ msgid "Outgoing Spool Support" ++#~ msgstr "Gestion d'un spool sortant" ++ ++#~ msgid "Wil Cal U (Auto Dialer)" ++#~ msgstr "Wil Cal U (composeur automatique)" ++ ++#~ msgid "MySQL Config Resource" ++#~ msgstr "Ressource de configuration de MySQL" ++ ++#~ msgid "ODBC Config Resource" ++#~ msgstr "Ressource de configuration d'ODBC" ++ ++#~ msgid "PGSQL Module" ++#~ msgstr "Module PGSQL" ++ ++#~ msgid "Cryptographic Digital Signatures" ++#~ msgstr "Signatures de chiffrage numérique" ++ ++#~ msgid "Call Parking Resource" ++#~ msgstr "Ressource de mise en parking des appels" ++ ++#~ msgid "Call Monitoring Resource" ++#~ msgstr "Ressource de supervision des appels" ++ ++#~ msgid "Music On Hold Resource" ++#~ msgstr "Ressource de mise en attente musicale" ++ ++#~ msgid "ODBC Resource" ++#~ msgstr "Ressource ODBC" ++ ++#~ msgid "SMDI Module" ++#~ msgstr "Module SMDI" ++ ++#~ msgid "SNMP Module" ++#~ msgstr "Module SNMP" ++ ++#~ msgid "Music On Hold" ++#~ msgstr "Mise en attente musicale" ++ ++#~ msgid "Application" ++#~ msgstr "Application" ++ ++#~ msgid "Directory of Music" ++#~ msgstr "Répertoire sonore" ++ ++#~ msgid "Random Play" ++#~ msgstr "morceau choisi aléatoirement" ++ ++#~ msgid "DTMF mode" ++#~ msgstr "Mode DTMF" ++ ++#~ msgid "Primary domain identity for From: headers" ++#~ msgstr "Identité du domaine primaire pour les entêtes « From: »" ++ ++#~ msgid "From user (required by many SIP providers)" ++#~ msgstr "Utilisateur « From » (requis par de nombreux fournisseurs SIP)" ++ ++#~ msgid "Allow Insecure for" ++#~ msgstr "Autoriser le mode non sécurisé pour" ++ ++#~ msgid "Mailbox for MWI" ++#~ msgstr "Boîte aux lettres pour MWI" ++ ++#~ msgid "NAT between phone and Asterisk" ++#~ msgstr "NAT entre le téléphone et Asterisk" ++ ++#~ msgid "Check tags in headers" ++#~ msgstr "Vérifier les « tags » dans les entêtes" ++ ++#~ msgid "Reply Timeout (ms) for down connection" ++#~ msgstr "Délai de réponse (en ms) indiquant une connexion tombée" ++ ++#~ msgid "Register connection" ++#~ msgstr "Connexion au registre" ++ ++#~ msgid "Client Type" ++#~ msgstr "Type de client" ++ ++#~ msgid "Username" ++#~ msgstr "Nom d'utilisateur" ++ ++#~ msgid "Section sipgeneral" ++#~ msgstr "Section générale SIP" ++ ++#~ msgid "Allow codecs" ++#~ msgstr "Codecs autorisés" ++ ++#~ msgid "SIP realm" ++#~ msgstr "Domaine SIP" ++ ++#~ msgid "Voicemail general options" ++#~ msgstr "Options générales de la messagerie vocale" ++ ++#~ msgid "From Email address of server" ++#~ msgstr "Adresse de courrier électronique source du serveur" ++ ++#~ msgid "Voice Mail boxes" ++#~ msgstr "Boîtes de messagerie vocale" ++ ++#~ msgid "Email contains attachment" ++#~ msgstr "Courriel contenant une pièce-jointe" ++ ++#~ msgid "Email" ++#~ msgstr "Courriel" ++ ++#~ msgid "Display Name" ++#~ msgstr "Nom affiché" ++ ++#~ msgid "Password" ++#~ msgstr "Mot de passe" ++ ++#~ msgid "zone" ++#~ msgstr "zone" ++ ++#~ msgid "Voice Zone settings" ++#~ msgstr "Paramètres de la zone Voix" ++ ++#~ msgid "Message Format" ++#~ msgstr "Format de message" +diff --git a/feeds/luci/applications/luci-app-asterisk/po/he/asterisk.po b/feeds/luci/applications/luci-app-asterisk/po/he/asterisk.po +new file mode 100644 +index 0000000..25ed5bb +--- /dev/null ++++ b/feeds/luci/applications/luci-app-asterisk/po/he/asterisk.po +@@ -0,0 +1,194 @@ ++# asterisk.pot ++# generated from ./applications/luci-asterisk/luasrc/i18n/asterisk.en.lua ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"PO-Revision-Date: 2011-07-14 12:48+0200\n" ++"Last-Translator: zstorch \n" ++"Language-Team: none\n" ++"Language: he\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n != 1);\n" ++"X-Generator: Pootle 2.0.4\n" ++ ++#~ msgid "Asterisk General Options" ++#~ msgstr "הגדרות כלליות של Asterisk" ++ ++#~ msgid "AGI directory" ++#~ msgstr "תיקית AGI" ++ ++#~ msgid "Cache recorded sound files during recording" ++#~ msgstr "שמור ×ת קבצי הקול במהלך ההקלטה" ++ ++#~ msgid "Debug Level" ++#~ msgstr "רמת מצב ניפוי שגי×ות" ++ ++#~ msgid "Disable some warnings" ++#~ msgstr "בטל חלק מה×זהרות" ++ ++#~ msgid "Dump core on crash" ++#~ msgstr "תעד ×ת מצב הליבה בעת נפילת המערכת" ++ ++#~ msgid "High Priority" ++#~ msgstr "עדיפות גבוהה" ++ ++#~ msgid "Initialise Crypto" ++#~ msgstr "מפעיל ×ת Crypto" ++ ++#~ msgid "Use Internal Timing" ++#~ msgstr "השתמש בשעון הפנימי" ++ ++#~ msgid "Log directory" ++#~ msgstr "תיקית התיעוד" ++ ++# צריך לבדוק ×× ×ž×“×•×‘×¨ על שיחות "בו זמנית" ×× ×›×Ÿ חשוב לציין ×× ×œ× ×”× ×œ טעות חמורה ++#, fuzzy ++#~ msgid "Maximum number of calls allowed" ++#~ msgstr "×ž×§×¡×™×ž×•× ×©×™×—×•×ª בו זמנית" ++ ++#~ msgid "Maximum load to stop accepting new calls" ++#~ msgstr "מקסימות שיחות שבו המערכת תדחה שיחות נוספות" ++ ++#~ msgid "Disable console colors" ++#~ msgstr "בטל ×¦×‘×¢×™× ×‘×ž×¡×•×£" ++ ++#~ msgid "Sound files Cache directory" ++#~ msgstr "תיקית קבצי הקול" ++ ++#~ msgid "The Group to run as" ++#~ msgstr "הפעל ×¢× ×”×¨×©×ות קבוצת" ++ ++#~ msgid "The User to run as" ++#~ msgstr "הפעל ×¢× ×”×¨×©×ות משתמש" ++ ++#~ msgid "Voicemail Spool directory" ++#~ msgstr "תיקית ×”×ª× ×§×•×œ×™" ++ ++#~ msgid "Prefix UniquID with system name" ++#~ msgstr "הוסף לUniquID ×ת ×©× ×”×ž×¢×¨×›×ª" ++ ++#~ msgid "Build transcode paths via SLINEAR, not directly" ++#~ msgstr "המר תבניות קול ישירות ×¢× SLINEAR" ++ ++#~ msgid "Transmit SLINEAR silence while recording a channel" ++#~ msgstr "שדר שקט של SLINEAR במהלך הקלטה" ++ ++#~ msgid "Verbose Level" ++#~ msgstr "רמת דו\"×— המערכת" ++ ++#~ msgid "Time Zone" ++#~ msgstr "×זור זמן" ++ ++#~ msgid "Section dialplan" ++#~ msgstr "מחלקה בתוכנית השיחות" ++ ++#~ msgid "include" ++#~ msgstr "כולל" ++ ++#~ msgid "Dialplan Extension" ++#~ msgstr "שלוחה בתוכנית השיחות" ++ ++#~ msgid "Dialplan General Options" ++#~ msgstr "הגדרות כללית של תוכנית השיחות" ++ ++#~ msgid "Allow transfer" ++#~ msgstr "×פשר העברה" ++ ++#~ msgid "Clear global vars" ++#~ msgstr "נקה ×ž×©×ª× ×™× ×›×œ×œ×™×" ++ ++#~ msgid "Dialplan Goto" ++#~ msgstr "\"לך ×ל\" בתוכנית השיחות" ++ ++#~ msgid "Dialplan Conference" ++#~ msgstr "שיחת ועידה בתוכנית השיחות" ++ ++#~ msgid "Dialplan Time" ++#~ msgstr "זמן בתוכנית השיחות" ++ ++#~ msgid "Dialplan Voicemail" ++#~ msgstr "×ª× ×§×•×œ×™ בתוכנית השיחות" ++ ++#~ msgid "Dial Zones for Dialplan" ++#~ msgstr "×זורי חיוג עבור תוכנית השיחות" ++ ++#~ msgid "Prefix to add matching dialplans" ++#~ msgstr "קידומת להוספה עבור תוכניות שיחה דומות" ++ ++#~ msgid "Match International prefix" ++#~ msgstr "השווה קידומת בין ל×ומית" ++ ++#~ msgid "Prefix (0) to add/remove to/from international numbers" ++#~ msgstr "קידומת (0) להוספה ×ו הסרה במספר בין ל×ומי" ++ ++#~ msgid "localzone" ++#~ msgstr "מיקו×" ++ ++#~ msgid "Match plan" ++#~ msgstr "תוכנית מת×ימה" ++ ++#~ msgid "Connection to use" ++#~ msgstr "השתמש בחיבור מסוג" ++ ++#~ msgid "Feature Key maps" ++#~ msgstr "מיפוי ×ž×§×©×™× ×™×¢×•×“×™×™×" ++ ++#~ msgid "NAT between phone and Asterisk" ++#~ msgstr "נתב (NAT) בין מכשיר הטלפון לAsterisk" ++ ++#~ msgid "Check tags in headers" ++#~ msgstr "בדוק ×ת התגיות בהקדמה" ++ ++#, fuzzy ++#~ msgid "Reply Timeout (ms) for down connection" ++#~ msgstr "החזר ×ת פרק זמן (timeout) במילישניות עבור ×—×‘×•×¨×™× ×¡×’×•×¨×™×" ++ ++#~ msgid "Register connection" ++#~ msgstr "חיבור ×¨×©×•× (מנוי)" ++ ++#~ msgid "Dial own extension for mailbox" ++#~ msgstr "חיוג סיפרה בודדת עבור ×ª× ×“×•×ר" ++ ++#~ msgid "Client Type" ++#~ msgstr "סוג הלקוח" ++ ++#~ msgid "Username" ++#~ msgstr "×©× ×ž×©×ª×ž×©" ++ ++#~ msgid "Allow codecs" ++#~ msgstr "×ž×§×•×“×“×™× ×ž×ושרי×" ++ ++#~ msgid "SIP realm" ++#~ msgstr "×ž×ª×—× SIP" ++ ++#~ msgid "Voicemail general options" ++#~ msgstr "הגדרות כלליות עבור ×”×ª× ×§×•×œ×™" ++ ++#~ msgid "From Email address of server" ++#~ msgstr "שדה דו×ר ×לקטרוני מ×ת (של השרת)" ++ ++#~ msgid "Voice Mail boxes" ++#~ msgstr "ת××™× ×§×•×œ×™×™×" ++ ++#~ msgid "Email contains attachment" ++#~ msgstr "מצורף תוכן ההודעה" ++ ++#~ msgid "Email" ++#~ msgstr "דו×ר ×לקטרוני" ++ ++#~ msgid "Display Name" ++#~ msgstr "×©× ×ª×¦×•×’×”" ++ ++#~ msgid "Password" ++#~ msgstr "סיסמה" ++ ++#~ msgid "zone" ++#~ msgstr "×זור" ++ ++#~ msgid "Voice Zone settings" ++#~ msgstr "הגדרות ×זוריות עבור הקול" ++ ++#~ msgid "Message Format" ++#~ msgstr "תבנית ההודעה" +diff --git a/feeds/luci/applications/luci-app-asterisk/po/hu/asterisk.po b/feeds/luci/applications/luci-app-asterisk/po/hu/asterisk.po +new file mode 100644 +index 0000000..c6a5d81 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-asterisk/po/hu/asterisk.po +@@ -0,0 +1,134 @@ ++# asterisk.pot ++# generated from ./applications/luci-asterisk/luasrc/i18n/asterisk.en.lua ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"PO-Revision-Date: 2012-04-18 23:18+0200\n" ++"Last-Translator: Anonymous Pootle User\n" ++"Language-Team: none\n" ++"Language: hu\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n != 1);\n" ++"X-Generator: Pootle 2.0.4\n" ++ ++#~ msgid "Asterisk General Options" ++#~ msgstr "Ãltalános Asterisk beállítások" ++ ++#~ msgid "AGI directory" ++#~ msgstr "AGI könyvtár" ++ ++#~ msgid "Cache recorded sound files during recording" ++#~ msgstr "A felvett hang fájlok gyorsítótárazása a felvétel alatt" ++ ++#~ msgid "Debug Level" ++#~ msgstr "Nyomkövetési szint" ++ ++#~ msgid "Disable some warnings" ++#~ msgstr "Néhány figyelmeztetés letilása" ++ ++#~ msgid "Dump core on crash" ++#~ msgstr "Memóriatartalom kiírása összeomláskor" ++ ++#~ msgid "High Priority" ++#~ msgstr "Magas prioritás" ++ ++#~ msgid "Initialise Crypto" ++#~ msgstr "Titkosítás inicializálása" ++ ++#~ msgid "Use Internal Timing" ++#~ msgstr "BelsÅ‘ idÅ‘zítés használata" ++ ++#~ msgid "Log directory" ++#~ msgstr "Napló könyvtár" ++ ++#~ msgid "Maximum number of calls allowed" ++#~ msgstr "A hivások megengedett maximális száma" ++ ++#~ msgid "Maximum load to stop accepting new calls" ++#~ msgstr "A CPU maximális terhelése új hívások fogadásához" ++ ++#~ msgid "Disable console colors" ++#~ msgstr "Konzol színek letiltása" ++ ++#~ msgid "Sound files Cache directory" ++#~ msgstr "A gyorsítótárazott hang fájlok könyvtára" ++ ++#~ msgid "The Group to run as" ++#~ msgstr "Csoport futtatása mint" ++ ++#~ msgid "The User to run as" ++#~ msgstr "Felhasználó futtatása mint" ++ ++#~ msgid "Voicemail Spool directory" ++#~ msgstr "Hangposta puffer könyvtár" ++ ++#~ msgid "Prefix UniquID with system name" ++#~ msgstr "Rendszer név használata UniquID elÅ‘tagként" ++ ++#~ msgid "Verbose Level" ++#~ msgstr "Részletes szint" ++ ++#~ msgid "Time Zone" ++#~ msgstr "IdÅ‘zóna" ++ ++#~ msgid "include" ++#~ msgstr "tartalmaz" ++ ++#~ msgid "Allow transfer" ++#~ msgstr "Ãtvitel engedélyezése" ++ ++#~ msgid "Clear global vars" ++#~ msgstr "Globális változók törlése" ++ ++#~ msgid "Enable Parking" ++#~ msgstr "Várakoztatás engedélyezése" ++ ++#~ msgid "Parking time (secs)" ++#~ msgstr "Várakoztatási idÅ‘ (másodperc)" ++ ++#~ msgid "Reboot Method" ++#~ msgstr "Újraindítás módja" ++ ++#~ msgid "Parameter" ++#~ msgstr "Paraméter" ++ ++#~ msgid "IAX General Options" ++#~ msgstr "Ãltalános IAX beállítások" ++ ++#~ msgid "Static" ++#~ msgstr "Statikus" ++ ++#~ msgid "Write Protect" ++#~ msgstr "Ãrásvédelem" ++ ++#~ msgid "Modules" ++#~ msgstr "Modulok" ++ ++#~ msgid "DTMF mode" ++#~ msgstr "DTMF mód" ++ ++#~ msgid "Client Type" ++#~ msgstr "Ãœgyfél típusa" ++ ++#~ msgid "Username" ++#~ msgstr "Felhasználónév" ++ ++#~ msgid "Email" ++#~ msgstr "E-mail" ++ ++#~ msgid "Display Name" ++#~ msgstr "MegjelenítendÅ‘ név" ++ ++#~ msgid "Password" ++#~ msgstr "Jelszó" ++ ++#~ msgid "zone" ++#~ msgstr "zóna" ++ ++#~ msgid "Voice Zone settings" ++#~ msgstr "Hang zóna beállítások" ++ ++#~ msgid "Message Format" ++#~ msgstr "Ãœzenet formátuma" +diff --git a/feeds/luci/applications/luci-app-asterisk/po/it/asterisk.po b/feeds/luci/applications/luci-app-asterisk/po/it/asterisk.po +new file mode 100644 +index 0000000..9eb24da +--- /dev/null ++++ b/feeds/luci/applications/luci-app-asterisk/po/it/asterisk.po +@@ -0,0 +1,162 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Report-Msgid-Bugs-To: \n" ++"POT-Creation-Date: 2009-06-10 03:40+0200\n" ++"PO-Revision-Date: 2012-04-19 23:40+0200\n" ++"Last-Translator: claudyus \n" ++"Language-Team: LANGUAGE \n" ++"Language: it\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n != 1);\n" ++"X-Generator: Pootle 2.0.4\n" ++ ++#~ msgid "Asterisk General Options" ++#~ msgstr "Asterisk Opzioni Generali" ++ ++#~ msgid "AGI directory" ++#~ msgstr "AGI directory" ++ ++#~ msgid "Cache recorded sound files during recording" ++#~ msgstr "Cache dei file audio registrati durante la registrazione" ++ ++#~ msgid "Debug Level" ++#~ msgstr "Livello di debug" ++ ++#~ msgid "Disable some warnings" ++#~ msgstr "Disattivare alcuni avvis" ++ ++#~ msgid "Dump core on crash" ++#~ msgstr "Effettua il core dump al crash" ++ ++#~ msgid "High Priority" ++#~ msgstr "Alta Priorità" ++ ++#~ msgid "Use Internal Timing" ++#~ msgstr "Usa temporizzazione interna" ++ ++#~ msgid "Log directory" ++#~ msgstr "Accedi alla directory" ++ ++#~ msgid "Maximum number of calls allowed" ++#~ msgstr "Numero massimo di chiamate consentite" ++ ++#~ msgid "Maximum load to stop accepting new calls" ++#~ msgstr "Smettere di accettare carico massimo di nuove chiamate" ++ ++#~ msgid "Disable console colors" ++#~ msgstr "Disabilitare la console dei colori" ++ ++#~ msgid "Sound files Cache directory" ++#~ msgstr "Cache directori files suoni" ++ ++#~ msgid "Prefix UniquID with system name" ++#~ msgstr "Prefisso UniquID con il nome di sistema" ++ ++#~ msgid "Build transcode paths via SLINEAR, not directly" ++#~ msgstr "Costruire percorsi di transcodifica via SLINEAR, non direttamente" ++ ++#~ msgid "Verbose Level" ++#~ msgstr "Livello verbose" ++ ++#~ msgid "Section dialplan" ++#~ msgstr "Sezione dialplan" ++ ++#~ msgid "include" ++#~ msgstr "include" ++ ++#~ msgid "Dialplan Extension" ++#~ msgstr "Estensione Dialplan" ++ ++#~ msgid "Dialplan General Options" ++#~ msgstr "Opzioni generali Dialplan" ++ ++#~ msgid "Allow transfer" ++#~ msgstr "Permettere il trasferimento" ++ ++#~ msgid "Clear global vars" ++#~ msgstr "Cancella le variabili globali" ++ ++#~ msgid "Dialplan Conference" ++#~ msgstr "Conferenza Dialplan" ++ ++#~ msgid "Prefix to add matching dialplans" ++#~ msgstr "Aggiungere il prefisso corrispondente per Dialplans" ++ ++#~ msgid "Prefix (0) to add/remove to/from international numbers" ++#~ msgstr "" ++#~ "Prefisso (0) per aggiungere / rimuovere a / da numeri internazionali" ++ ++#~ msgid "localzone" ++#~ msgstr "localzone" ++ ++#~ msgid "Connection to use" ++#~ msgstr "Connessione da utilizzare" ++ ++#~ msgid "Feature Key maps" ++#~ msgstr "Caratteristica chiave delle mappe" ++ ++#~ msgid "Key to Disconnect call" ++#~ msgstr "Chiave per disconnettere una chiamata" ++ ++#~ msgid "Key to Park call" ++#~ msgstr "Chiave di riserva per chiamata" ++ ++#~ msgid "Parking Feature" ++#~ msgstr "Riserva futura" ++ ++#~ msgid "ADSI Park" ++#~ msgstr "Riserva ADSI" ++ ++#~ msgid "Play courtesy tone to" ++#~ msgstr "Ascolta il tono di cortesia per" ++ ++#~ msgid "Enable Parking" ++#~ msgstr "Abilita la sosta" ++ ++#~ msgid "Parking time (secs)" ++#~ msgstr "Ora di sosta (in secondi)" ++ ++#~ msgid "Range of extensions for call parking" ++#~ msgstr "Gamma di estensioni per la sosta di chiamata" ++ ++#~ msgid "Pickup extension" ++#~ msgstr "Estensione Pickup" ++ ++#~ msgid "Seconds to wait bewteen digits when transferring" ++#~ msgstr "Secondi di attesa tra le cifre per il trasferimento" ++ ++#~ msgid "Sound when attended transfer fails" ++#~ msgstr "Suono quando il trasferimento non ha partecipato" ++ ++#~ msgid "Reload Hardware Config" ++#~ msgstr "Ricarica Hardware Config" ++ ++#~ msgid "Reboot Method" ++#~ msgstr "Metodo per riavviare" ++ ++#~ msgid "Parameter" ++#~ msgstr "Parametro" ++ ++#~ msgid "Option type" ++#~ msgstr "Tipo di opzione" ++ ++#~ msgid "User name" ++#~ msgstr "Usare il nome" ++ ++#~ msgid "IAX General Options" ++#~ msgstr "Opzione generale per IAX" ++ ++#~ msgid "Allow Codecs" ++#~ msgstr "Lasciare il codec" ++ ++#~ msgid "Static" ++#~ msgstr "Statico" ++ ++#~ msgid "Write Protect" ++#~ msgstr "Protezione da scrittura" ++ ++#~ msgid "Message Format" ++#~ msgstr "Formato messaggio" +diff --git a/feeds/luci/applications/luci-app-asterisk/po/ja/asterisk.po b/feeds/luci/applications/luci-app-asterisk/po/ja/asterisk.po +new file mode 100644 +index 0000000..98bd10b +--- /dev/null ++++ b/feeds/luci/applications/luci-app-asterisk/po/ja/asterisk.po +@@ -0,0 +1,44 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Report-Msgid-Bugs-To: \n" ++"POT-Creation-Date: 2009-05-19 19:36+0200\n" ++"PO-Revision-Date: 2012-01-08 13:20+0200\n" ++"Last-Translator: Kentaro \n" ++"Language-Team: LANGUAGE \n" ++"Language: ja\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=1; plural=0;\n" ++"X-Generator: Pootle 2.0.4\n" ++ ++#~ msgid "Asterisk General Options" ++#~ msgstr "Asterisk ã®å…¨èˆ¬ã‚ªãƒ—ション" ++ ++#~ msgid "AGI directory" ++#~ msgstr "AGI ディレクトリ" ++ ++#~ msgid "Cache recorded sound files during recording" ++#~ msgstr "録音ã•ã‚ŒãŸã‚µã‚¦ãƒ³ãƒ‰ã‚’録音中ã«ã‚­ãƒ£ãƒƒã‚·ãƒ¥" ++ ++#~ msgid "Debug Level" ++#~ msgstr "デãƒãƒƒã‚°ãƒ¬ãƒ™ãƒ«" ++ ++#~ msgid "Disable some warnings" ++#~ msgstr "ã„ãã¤ã‹ã®è­¦å‘Šã‚’無効ã«ã™ã‚‹" ++ ++#~ msgid "Dump core on crash" ++#~ msgstr "クラッシュ時ã«ã‚³ã‚¢ãƒ€ãƒ³ãƒ—を出力ã™ã‚‹" ++ ++#~ msgid "High Priority" ++#~ msgstr "高優先度" ++ ++#~ msgid "Log directory" ++#~ msgstr "ログ ディレクトリ" ++ ++#~ msgid "Allow transfer" ++#~ msgstr "転é€ã‚’許å¯" ++ ++#~ msgid "Clear global vars" ++#~ msgstr "グローãƒãƒ«å¤‰æ•°ã‚’消去" +diff --git a/feeds/luci/applications/luci-app-asterisk/po/ms/asterisk.po b/feeds/luci/applications/luci-app-asterisk/po/ms/asterisk.po +new file mode 100644 +index 0000000..e1260e1 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-asterisk/po/ms/asterisk.po +@@ -0,0 +1,611 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Report-Msgid-Bugs-To: \n" ++"POT-Creation-Date: 2010-05-03 12:40+1000\n" ++"PO-Revision-Date: 2010-05-05 23:32+1000\n" ++"Last-Translator: Wai Chet Teow \n" ++"Language-Team: LANGUAGE\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"X-Generator: Pootle 1.1.0\n" ++ ++#~ msgid "Asterisk General Options" ++#~ msgstr "Pilihan Umum Asterisk" ++ ++#~ msgid "AGI directory" ++#~ msgstr "AGI Direktori" ++ ++#, fuzzy ++#~ msgid "Cache recorded sound files during recording" ++#~ msgstr "Cache dicatat semasa rakaman fail bunyi" ++ ++#, fuzzy ++#~ msgid "Debug Level" ++#~ msgstr "Tingkatan debug" ++ ++#~ msgid "Disable some warnings" ++#~ msgstr "Mematikan beberapa amaran" ++ ++#, fuzzy ++#~ msgid "Dump core on crash" ++#~ msgstr "Dump teras dalam kemalangan" ++ ++#~ msgid "High Priority" ++#~ msgstr "Keutamaan Tinggi" ++ ++#~ msgid "Initialise Crypto" ++#~ msgstr "Menginisialisasinya Crypto" ++ ++#~ msgid "Use Internal Timing" ++#~ msgstr "Gunakan Intern pemilihan waktu" ++ ++#, fuzzy ++#~ msgid "Log directory" ++#~ msgstr "Direktori log" ++ ++#, fuzzy ++#~ msgid "Maximum number of calls allowed" ++#~ msgstr "Jumlah maksimum panggilan dibenarkan" ++ ++#, fuzzy ++#~ msgid "Maximum load to stop accepting new calls" ++#~ msgstr "beban maksimum untuk berhenti menerima panggilan baru" ++ ++#, fuzzy ++#~ msgid "Disable console colors" ++#~ msgstr "Matikan warna konsol" ++ ++#~ msgid "Sound files Cache directory" ++#~ msgstr "Sound fail Direktori Cache" ++ ++#, fuzzy ++#~ msgid "The Group to run as" ++#~ msgstr "Kumpulan untuk menjalankan sebagai" ++ ++#, fuzzy ++#~ msgid "The User to run as" ++#~ msgstr "Pengguna untuk menjalankan sebagai" ++ ++#, fuzzy ++#~ msgid "Voicemail Spool directory" ++#~ msgstr "Surat suara spool Direktori" ++ ++#~ msgid "Prefix UniquID with system name" ++#~ msgstr "Awalan UniquID dengan nama sistem" ++ ++#~ msgid "Build transcode paths via SLINEAR, not directly" ++#~ msgstr "Membangun transcode jalan melalui SLINEAR, tidak secara langsung" ++ ++#~ msgid "Transmit SLINEAR silence while recording a channel" ++#~ msgstr "Transmit SLINEAR keheningan ketika sedang merakam saluran" ++ ++#, fuzzy ++#~ msgid "Verbose Level" ++#~ msgstr "Tingkat verbose" ++ ++#~ msgid "Section dialplan" ++#~ msgstr "Bahagian dial rencana" ++ ++#~ msgid "include" ++#~ msgstr "memasukkan" ++ ++#~ msgid "Dialplan Extension" ++#~ msgstr "Ekstensi dial rencana" ++ ++#~ msgid "Dialplan General Options" ++#~ msgstr "Pilihan Umum Dialplan" ++ ++#~ msgid "Allow transfer" ++#~ msgstr "Membolehkan pemindahan" ++ ++#~ msgid "Clear global vars" ++#~ msgstr "Hapus variable global" ++ ++#~ msgid "Dialplan Goto" ++#~ msgstr "Buka dial rencana" ++ ++#~ msgid "Dialplan Conference" ++#~ msgstr "Persidangan dial rencana" ++ ++#~ msgid "Dialplan Time" ++#~ msgstr "Masa dial rencana" ++ ++#~ msgid "Dialplan Voicemail" ++#~ msgstr "Surat suara dial rencana" ++ ++#~ msgid "Dial Zones for Dialplan" ++#~ msgstr "Dial Zon untuk dial rencana" ++ ++#~ msgid "Prefix to add matching dialplans" ++#~ msgstr "Prefix untuk menambah pencocokan dial rencana" ++ ++#~ msgid "Match International prefix" ++#~ msgstr "Awalan Antarabangsa Match" ++ ++#~ msgid "Prefix (0) to add/remove to/from international numbers" ++#~ msgstr "Awalan (0) untuk menambah / memadam ke / dari nombor antarabangsa" ++ ++#~ msgid "localzone" ++#~ msgstr "zon tempatan" ++ ++#~ msgid "Match plan" ++#~ msgstr "Rencana sesuai" ++ ++#~ msgid "Connection to use" ++#~ msgstr "Sambungan yang digunakan" ++ ++#~ msgid "Feature Key maps" ++#~ msgstr "Ciri-ciri kunci peta" ++ ++#~ msgid "Attended transfer key" ++#~ msgstr "Mengikuti memindahkan kunci" ++ ++#~ msgid "Blind transfer key" ++#~ msgstr "kunci pemindahkan buta" ++ ++#~ msgid "Key to Disconnect call" ++#~ msgstr "Kunci untuk Putus panggilan" ++ ++#~ msgid "Key to Park call" ++#~ msgstr "Kunci untuk Park panggilan" ++ ++#~ msgid "Parking Feature" ++#~ msgstr "Parkir Ciri-ciri" ++ ++#~ msgid "ADSI Park" ++#~ msgstr "ADSI Park" ++ ++#~ msgid "Attended transfer timeout (sec)" ++#~ msgstr "Mengikuti pemindahan timeout (saat)" ++ ++#~ msgid "One touch record key" ++#~ msgstr "Satu nota sentuh butang" ++ ++#~ msgid "Name of call context for parking" ++#~ msgstr "Nama konteks panggilan untuk parkir" ++ ++#~ msgid "Sound file to play to parked caller" ++#~ msgstr "Fail bunyi untuk memainkan ke pemanggil parkir" ++ ++#~ msgid "Max time (ms) between digits for feature activation" ++#~ msgstr "Maksimum masa (milidetik) antara nombor untuk pengaktifan ciri" ++ ++#~ msgid "Method to Find Parking slot" ++#~ msgstr "Kaedah untuk Menemukan slot Parkir" ++ ++#~ msgid "parkedmusicclass" ++#~ msgstr "parkir muzik kelas" ++ ++#~ msgid "Play courtesy tone to" ++#~ msgstr "Nada kebaikan yang dimainkan untuk" ++ ++#~ msgid "Enable Parking" ++#~ msgstr "Aktifkan Parkir" ++ ++#~ msgid "Extension to dial to park" ++#~ msgstr "Extension untuk dial ke taman" ++ ++#~ msgid "Parking time (secs)" ++#~ msgstr "Parkir waktu (saat)" ++ ++#~ msgid "Range of extensions for call parking" ++#~ msgstr "Rentang sambungan untuk parkir panggilan" ++ ++#~ msgid "Pickup extension" ++#~ msgstr "Angkat sambungan" ++ ++#~ msgid "Seconds to wait bewteen digits when transferring" ++#~ msgstr "Detik untuk menunggu antara nombor ketika memindahkan" ++ ++#~ msgid "sound when attended transfer is complete" ++#~ msgstr "suara saat menghadiri pemindahan selesai" ++ ++#~ msgid "Sound when attended transfer fails" ++#~ msgstr "Suara saat menghadiri gagal transfer" ++ ++#~ msgid "Reload Hardware Config" ++#~ msgstr "Beban kembali menatarajah peranti keras" ++ ++#~ msgid "Reboot Method" ++#~ msgstr "Kaedah Reboot" ++ ++#~ msgid "Parameter" ++#~ msgstr "Parameter" ++ ++#~ msgid "Option type" ++#~ msgstr "Pilihan jenis" ++ ++#~ msgid "User name" ++#~ msgstr "Nama pemakai" ++ ++#~ msgid "IAX General Options" ++#~ msgstr "Pilihan Umum IAX" ++ ++#~ msgid "Allow Codecs" ++#~ msgstr "Izinkan Codec" ++ ++#~ msgid "Static" ++#~ msgstr "Statik" ++ ++#~ msgid "Write Protect" ++#~ msgstr "Dilindungi Menulis" ++ ++#~ msgid "Meetme Conference" ++#~ msgstr "Persidangan Meetme" ++ ++#~ msgid "Admin PIN" ++#~ msgstr "PIN Admin" ++ ++#~ msgid "Meeting PIN" ++#~ msgstr "PIN Pertemuan" ++ ++#~ msgid "Meetme Conference General Options" ++#~ msgstr "Pilihan Umum Persidangan Meetme" ++ ++#~ msgid "Number of 20ms audio buffers to be used" ++#~ msgstr "Jumlah buffer audio yang akan digunakan dalam 20 mili detik" ++ ++#~ msgid "Modules" ++#~ msgstr "Modul" ++ ++#~ msgid "Alarm Receiver Application" ++#~ msgstr "Penggera Aplikasi Penerima" ++ ++#~ msgid "Authentication Application" ++#~ msgstr "Pengesahan Aplikasi" ++ ++#~ msgid "Make sure asterisk doesnt save CDR" ++#~ msgstr "Membuat asterisk yakin tidak menyimpan CDR" ++ ++#~ msgid "Check if channel is available" ++#~ msgstr "Periksa sama ada saluran sedia" ++ ++#~ msgid "Listen in on any channel" ++#~ msgstr "Mendengar pada setiap saluran" ++ ++#~ msgid "Control Playback Application" ++#~ msgstr "Kawalan Main Aplikasi" ++ ++#~ msgid "Cuts up variables" ++#~ msgstr "Memotong pembolehubah" ++ ++#~ msgid "Database access functions" ++#~ msgstr "fungsi untuk mengakses dasar data" ++ ++#~ msgid "Dialing Application" ++#~ msgstr "Aplikasi Panggilan" ++ ++#~ msgid "Virtual Dictation Machine Application" ++#~ msgstr "Aplikasi Dikte Virtual Machine" ++ ++#~ msgid "Directed Call Pickup Support" ++#~ msgstr "Sokongan Pengarah Angkatan Pangillan" ++ ++#~ msgid "Extension Directory" ++#~ msgstr "Extension Direktori" ++ ++#~ msgid "DISA (Direct Inward System Access) Application" ++#~ msgstr "Aplikasi DISA (Direct Inward System Access)" ++ ++#~ msgid "Dump channel variables Application" ++#~ msgstr "Aplikasi membuang variable saluran" ++ ++#~ msgid "Simple Echo Application" ++#~ msgstr "Echo Aplikasi Mudah" ++ ++#~ msgid "ENUM Lookup" ++#~ msgstr "Pencarian ENUM" ++ ++#~ msgid "Reevaluates strings" ++#~ msgstr "Menilai semula string" ++ ++#~ msgid "Executes applications" ++#~ msgstr "Menjalankan aplikasi" ++ ++#~ msgid "External IVR application interface" ++#~ msgstr "IVR aplikasi antara muka luaran" ++ ++#~ msgid "Fork The CDR into 2 seperate entities" ++#~ msgstr "CDR garpu menjadi 2 entiti yang berasingan" ++ ++#~ msgid "Get ADSI CPE ID" ++#~ msgstr "Dapatkan ADSI CPE ID" ++ ++#~ msgid "Group Management Routines" ++#~ msgstr "Pengurusan Kumpulan Rutinitas" ++ ++#~ msgid "Encode and Stream via icecast and ices" ++#~ msgstr "Menyandi dan Stream melalui icecast dan es" ++ ++#~ msgid "Image Transmission Application" ++#~ msgstr "Aplikasi Transmisi Gambar" ++ ++#~ msgid "Look up Caller*ID name/number from black" ++#~ msgstr "Mencari nama / nombor Pemangil dari hitam" ++ ++#~ msgid "Look up CallerID Name from local databas" ++#~ msgstr "Mencari Nama Pemangil dari database tempatan" ++ ++#~ msgid "Extension Macros" ++#~ msgstr "Makro Extension" ++ ++#~ msgid "A simple math Application" ++#~ msgstr "Sebuah Aplikasi matematik senang" ++ ++#~ msgid "MD5 checksum Application" ++#~ msgstr "Aplikasi MD5 checksum" ++ ++#~ msgid "Digital Milliwatt (mu-law) Test Application" ++#~ msgstr "Milliwatt digital (mu-law) Aplikasi Uji" ++ ++#~ msgid "Record a call and mix the audio during the recording" ++#~ msgstr "Merakam panggilan dan campuran audio semasa rakaman" ++ ++#~ msgid "Call Parking and Announce Application" ++#~ msgstr "Panggilan Parkir dan Aplikasi Pengumuman" ++ ++#~ msgid "Trivial Playback Application" ++#~ msgstr "Aplikasi Pemain Trivial" ++ ++#~ msgid "Require phone number to be entered" ++#~ msgstr "Nombor telefon diperlukan untuk dimasuk" ++ ++#~ msgid "True Call Queueing" ++#~ msgstr "Panggilan antrian benar" ++ ++#~ msgid "Random goto" ++#~ msgstr "Pergi ke random" ++ ++#~ msgid "Read Variable Application" ++#~ msgstr "Aplikasi Baca Variabel" ++ ++#~ msgid "Read in a file" ++#~ msgstr "Baca dalam fail" ++ ++#~ msgid "Realtime Data Lookup/Rewrite" ++#~ msgstr "Masa benar mencari / menulis kembali data " ++ ++#~ msgid "Trivial Record Application" ++#~ msgstr "Aplikasi Trivial Rakam" ++ ++#~ msgid "Say time" ++#~ msgstr "Katakan masa" ++ ++#~ msgid "Send DTMF digits Application" ++#~ msgstr "Aplikasi Hantar DTMF angka" ++ ++#~ msgid "Send Text Applications" ++#~ msgstr "Aplikasi Kirim Mesej" ++ ++#~ msgid "Set CallerID Application" ++#~ msgstr "Aplikasi menetapkan CallerID" ++ ++#~ msgid "CDR user field apps" ++#~ msgstr "Aplikasi CDR bidang pengguna" ++ ++#~ msgid "load => .so ; Set CallerID Name" ++#~ msgstr "beban => .so ; Menetapkan Nama CallerID" ++ ++#~ msgid "Set RDNIS Number" ++#~ msgstr "Menetapkan Nombor RDNIS" ++ ++#~ msgid "Set ISDN Transfer Capability" ++#~ msgstr "Menetapkan Kemampuan Transfer ISDN" ++ ++#~ msgid "SMS/PSTN handler" ++#~ msgstr "Penangan SMS/PSTN" ++ ++#~ msgid "Hangs up the requested channel" ++#~ msgstr "Menutup saluran yang diminta" ++ ++#~ msgid "Stack Routines" ++#~ msgstr "Rutinitas Stack" ++ ++#~ msgid "Generic System() application" ++#~ msgstr "Aplikasi Generic Sistem()" ++ ++#~ msgid "Playback with Talk Detection" ++#~ msgstr "Putar dengan Pengesanan Bicara" ++ ++#~ msgid "Interface Test Application" ++#~ msgstr "Aplikasi Antarmuka Test" ++ ++#~ msgid "Transfer" ++#~ msgstr "Transfer" ++ ++#~ msgid "TXTCIDName" ++#~ msgstr "Nama TXTCID" ++ ++#~ msgid "Send URL Applications" ++#~ msgstr "Aplikasi Kirim URL" ++ ++#~ msgid "Custom User Event Application" ++#~ msgstr "Aplikasi Acara Pengguna Tersuai" ++ ++#~ msgid "Send verbose output" ++#~ msgstr "Kirim keluaran verbose" ++ ++#~ msgid "Voicemail" ++#~ msgstr "Voicemail" ++ ++#~ msgid "Waits until first ring after time" ++#~ msgstr "Menunggu waktu sampai setelah deringan pertama" ++ ++#~ msgid "Wait For Silence Application" ++#~ msgstr "Aplikasi Tunggu Untuk Tenang" ++ ++#~ msgid "While Loops and Conditional Execution" ++#~ msgstr "Sementara Loops dan Pelaksanaan bersyarat" ++ ++#~ msgid "Comma Separated Values CDR Backend" ++#~ msgstr "Hujung belakang nilai-nilai dipisahkan koma CDR" ++ ++#~ msgid "Customizable Comma Separated Values CDR Backend" ++#~ msgstr "Nilai-nilai dipisahkan koma CDR hujung belakang yang disesuaikan" ++ ++#~ msgid "Asterisk Call Manager CDR Backend" ++#~ msgstr "Hujung belakang asterisk panggilan pengurus CDR " ++ ++#~ msgid "MySQL CDR Backend" ++#~ msgstr "Hujung belakang MySQL CDR" ++ ++#~ msgid "PostgreSQL CDR Backend" ++#~ msgstr "Hujung belakang PostgreSQL CDR" ++ ++#~ msgid "SQLite CDR Backend" ++#~ msgstr "Hujung belakang SQLite CDR" ++ ++#~ msgid "Agent Proxy Channel" ++#~ msgstr "Agen Proksi Saluran" ++ ++#~ msgid "Option chan_iax2" ++#~ msgstr "Pilihan chan_iax2" ++ ++#~ msgid "Local Proxy Channel" ++#~ msgstr "Saluran Proksi Tempatan" ++ ++#~ msgid "Session Initiation Protocol (SIP)" ++#~ msgstr "Session Initiation Protocol (SIP)" ++ ++#~ msgid "Adaptive Differential PCM Coder/Decoder" ++#~ msgstr "Adaptif Pengkamiran PCM Coder/Decoder" ++ ++#~ msgid "GSM/PCM16 (signed linear) Codec Translation" ++#~ msgstr "GSM/PCM16 (ditandatangani linier) Codec Terjemahan" ++ ++#~ msgid "Speex/PCM16 (signed linear) Codec Translator" ++#~ msgstr "Speex/PCM16 (ditandatangani linier) Codec Terjemahan" ++ ++#~ msgid "Sun Microsystems AU format (signed linear)" ++#~ msgstr "Sun Microsystems AU format (ditandatangani linier)" ++ ++#~ msgid "Asterisk Extension Language Compiler" ++#~ msgstr "Asterisk Sambungan Bahasa Compiler" ++ ++#~ msgid "Text Extension Configuration" ++#~ msgstr "Teks Sambungan Tatarajah" ++ ++#~ msgid "Loopback Switch" ++#~ msgstr "Loop Beralih Kembali" ++ ++#~ msgid "MySQL Config Resource" ++#~ msgstr "MySQL menatarajah sumber daya" ++ ++#~ msgid "ODBC Config Resource" ++#~ msgstr "ODBC tatarajah sumber daya" ++ ++#~ msgid "PGSQL Module" ++#~ msgstr "Modul PGSQL" ++ ++#~ msgid "Cryptographic Digital Signatures" ++#~ msgstr "tanda tangan digital kriptografi" ++ ++#~ msgid "Call Parking Resource" ++#~ msgstr "Panggilan Parkir Sumber Daya" ++ ++#~ msgid "Indications Configuration" ++#~ msgstr "Penunjuk Konfigurasi" ++ ++#~ msgid "Call Monitoring Resource" ++#~ msgstr "panggilan pemantauan sumber daya" ++ ++#~ msgid "Music On Hold Resource" ++#~ msgstr "Muzik Pada Sumber Daya Tahan" ++ ++#~ msgid "ODBC Resource" ++#~ msgstr "Sumber ODBC" ++ ++#~ msgid "SMDI Module" ++#~ msgstr "Modul SMDI" ++ ++#~ msgid "SNMP Module" ++#~ msgstr "Modul SNMP" ++ ++#~ msgid "Music On Hold" ++#~ msgstr "Muzik Di Tahan" ++ ++#~ msgid "Application" ++#~ msgstr "Aplikasi" ++ ++#~ msgid "Directory of Music" ++#~ msgstr "Direktori Muzik" ++ ++#~ msgid "Option mode" ++#~ msgstr "Pilihan mod" ++ ++#~ msgid "Random Play" ++#~ msgstr "Bermain Rawak" ++ ++#~ msgid "DTMF mode" ++#~ msgstr "Mode DTMF" ++ ++#~ msgid "Primary domain identity for From: headers" ++#~ msgstr "Domain utama identiti untuk Dari: header" ++ ++#~ msgid "From user (required by many SIP providers)" ++#~ msgstr "Dari pengguna (diperlukan oleh banyak pembekal SIP)" ++ ++#~ msgid "Ring on incoming dialplan contexts" ++#~ msgstr "Dering pada konteks rancangan panggilan masuk" ++ ++#~ msgid "Allow Insecure for" ++#~ msgstr "Biarkan tidak selamat untuk" ++ ++#~ msgid "Mailbox for MWI" ++#~ msgstr "Peti mel untuk MWI" ++ ++#~ msgid "NAT between phone and Asterisk" ++#~ msgstr "NAT antara telefon dan asterisk" ++ ++#~ msgid "Check tags in headers" ++#~ msgstr "Menyemak tag di header" ++ ++#~ msgid "Reply Timeout (ms) for down connection" ++#~ msgstr "Balas Masa tamat (ms) untuk sambungan ke bawah" ++ ++#~ msgid "Register connection" ++#~ msgstr "Register sambungan" ++ ++#~ msgid "Dial own extension for mailbox" ++#~ msgstr "Dial perpanjangan sendiri untuk peti mel" ++ ++#~ msgid "Client Type" ++#~ msgstr "Pelanggan Jenis" ++ ++#~ msgid "Section sipgeneral" ++#~ msgstr "Bahagian sipgeneral" ++ ++#~ msgid "Allow codecs" ++#~ msgstr "Membenarkan codec" ++ ++#~ msgid "SIP realm" ++#~ msgstr "Dunia SIP" ++ ++#~ msgid "Voicemail general options" ++#~ msgstr "Pilihan umum Voicemail" ++ ++#~ msgid "From Email address of server" ++#~ msgstr "Dari alamat email server" ++ ++#~ msgid "Voice Mail boxes" ++#~ msgstr "Kotak mail suara" ++ ++#~ msgid "Email contains attachment" ++#~ msgstr "Email mengandungi lampiran" ++ ++#~ msgid "Display Name" ++#~ msgstr "Nama Paparan" ++ ++#~ msgid "Password" ++#~ msgstr "Kata laluan" ++ ++#~ msgid "zone" ++#~ msgstr "daerah" ++ ++#~ msgid "Voice Zone settings" ++#~ msgstr "Tetapan Zon Suara" ++ ++#~ msgid "Message Format" ++#~ msgstr "Format Mesej" +diff --git a/feeds/luci/applications/luci-app-asterisk/po/no/asterisk.po b/feeds/luci/applications/luci-app-asterisk/po/no/asterisk.po +new file mode 100644 +index 0000000..70c448d +--- /dev/null ++++ b/feeds/luci/applications/luci-app-asterisk/po/no/asterisk.po +@@ -0,0 +1,12 @@ ++# asterisk.pot ++# generated from ./applications/luci-asterisk/luasrc/i18n/asterisk.en.lua ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Last-Translator: Automatically generated\n" ++"Language-Team: none\n" ++"Language: \n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n != 1);\n" +diff --git a/feeds/luci/applications/luci-app-asterisk/po/pl/asterisk.po b/feeds/luci/applications/luci-app-asterisk/po/pl/asterisk.po +new file mode 100644 +index 0000000..f092853 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-asterisk/po/pl/asterisk.po +@@ -0,0 +1,75 @@ ++# asterisk.pot ++# generated from ./applications/luci-asterisk/luasrc/i18n/asterisk.en.lua ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"PO-Revision-Date: 2012-04-18 01:39+0200\n" ++"Last-Translator: MichaÅ‚ \n" ++"Language-Team: none\n" ++"Language: pl\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 " ++"|| n%100>=20) ? 1 : 2);\n" ++"X-Generator: Pootle 2.0.4\n" ++ ++#~ msgid "Asterisk General Options" ++#~ msgstr "Ustawienia Asterisk" ++ ++#~ msgid "AGI directory" ++#~ msgstr "Katalog AGI" ++ ++#~ msgid "Cache recorded sound files during recording" ++#~ msgstr "Buforuj nagrane pliki podczas nagrywania" ++ ++#~ msgid "Debug Level" ++#~ msgstr "Poziom debugowania" ++ ++#~ msgid "Disable some warnings" ++#~ msgstr "WyÅ‚Ä…cz niektóre ostrzeżenia" ++ ++#~ msgid "Dump core on crash" ++#~ msgstr "Wykonaj zrzut pamiÄ™ci podczas awarii" ++ ++#~ msgid "High Priority" ++#~ msgstr "Wysoki Priorytet" ++ ++#~ msgid "Initialise Crypto" ++#~ msgstr "Uruchom Crypto" ++ ++#~ msgid "Use Internal Timing" ++#~ msgstr "Użyj wbudowanego próbkowania" ++ ++#~ msgid "Log directory" ++#~ msgstr "Katalog logów" ++ ++#~ msgid "Maximum number of calls allowed" ++#~ msgstr "Max. dozwolona ilość poÅ‚Ä…czeÅ„" ++ ++#~ msgid "Maximum load to stop accepting new calls" ++#~ msgstr "Max. obciążenie powodujÄ…ce odrzucanie nowych poÅ‚Ä…czeÅ„" ++ ++#~ msgid "Disable console colors" ++#~ msgstr "WyÅ‚Ä…cz kolory konsoli" ++ ++#~ msgid "Sound files Cache directory" ++#~ msgstr "Katalog tymczasowy dla plików dźwiÄ™kowych" ++ ++#~ msgid "The Group to run as" ++#~ msgstr "Grupa dla uruchamiania" ++ ++#~ msgid "The User to run as" ++#~ msgstr "Użytkownik dla uruchamiania" ++ ++#~ msgid "Voicemail Spool directory" ++#~ msgstr "Katalog bufora poczty gÅ‚osowej" ++ ++#~ msgid "Time Zone" ++#~ msgstr "Strefa Czasowa" ++ ++#~ msgid "localzone" ++#~ msgstr "localzone" ++ ++#~ msgid "parkedmusicclass" ++#~ msgstr "parkedmusicclass" +diff --git a/feeds/luci/applications/luci-app-asterisk/po/pt-br/asterisk.po b/feeds/luci/applications/luci-app-asterisk/po/pt-br/asterisk.po +new file mode 100644 +index 0000000..07d7052 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-asterisk/po/pt-br/asterisk.po +@@ -0,0 +1,691 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Report-Msgid-Bugs-To: \n" ++"POT-Creation-Date: 2009-06-10 03:41+0200\n" ++"PO-Revision-Date: 2011-10-18 22:20+0200\n" ++"Last-Translator: Luiz Angelo \n" ++"Language-Team: LANGUAGE \n" ++"Language: pt_BR\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n > 1);\n" ++"X-Generator: Pootle 2.0.4\n" ++ ++#~ msgid "Asterisk General Options" ++#~ msgstr "Opções Gerais do Asterisk" ++ ++#~ msgid "AGI directory" ++#~ msgstr "Diretório do AGI" ++ ++#~ msgid "Cache recorded sound files during recording" ++#~ msgstr "Guardar em cache os arquivos de som durante a gravação" ++ ++#~ msgid "Debug Level" ++#~ msgstr "Nível de detalhamento" ++ ++#~ msgid "Disable some warnings" ++#~ msgstr "Desativar alguns avisos" ++ ++#~ msgid "Dump core on crash" ++#~ msgstr "Guardar o core quando o programa estourar" ++ ++#~ msgid "High Priority" ++#~ msgstr "Alta Prioridade" ++ ++#~ msgid "Initialise Crypto" ++#~ msgstr "Inicializar Crypto" ++ ++#~ msgid "Use Internal Timing" ++#~ msgstr "Usar Temporização Interna" ++ ++#~ msgid "Log directory" ++#~ msgstr "Diretório de registos" ++ ++#~ msgid "Maximum number of calls allowed" ++#~ msgstr "Número máximo de chamadas permitidas" ++ ++#~ msgid "Maximum load to stop accepting new calls" ++#~ msgstr "Carga máxima para deixar de aceitar novas chamadas" ++ ++#~ msgid "Disable console colors" ++#~ msgstr "Desativar cores no console" ++ ++#~ msgid "Sound files Cache directory" ++#~ msgstr "Diretório de cache para arquivos de som" ++ ++#~ msgid "The Group to run as" ++#~ msgstr "O grupo sob o qual o asterisk será executado" ++ ++#~ msgid "The User to run as" ++#~ msgstr "O usuário sob o qual o asterisk será executado" ++ ++#~ msgid "Voicemail Spool directory" ++#~ msgstr "Directorio da spool de voicemail" ++ ++#~ msgid "Prefix UniquID with system name" ++#~ msgstr "Prefixar o nome de sistema à UniquID" ++ ++#~ msgid "Build transcode paths via SLINEAR, not directly" ++#~ msgstr "" ++#~ "Construir os caminhos de transcode atraves de SLINEAR e não directamente" ++ ++#~ msgid "Transmit SLINEAR silence while recording a channel" ++#~ msgstr "Transmitir silencio SLINEAR durante a gravação de um canal" ++ ++#~ msgid "Verbose Level" ++#~ msgstr "Nível de Detalhamento" ++ ++#~ msgid "Time Zone" ++#~ msgstr "Fuso Horário" ++ ++#~ msgid "Section dialplan" ++#~ msgstr "Seção do Plano de Marcação" ++ ++#~ msgid "include" ++#~ msgstr "incluir" ++ ++#~ msgid "Dialplan Extension" ++#~ msgstr "Extensão do Plano de Discagem" ++ ++#~ msgid "Dialplan General Options" ++#~ msgstr "Opções Gerais do Plano de Discagem" ++ ++#~ msgid "Allow transfer" ++#~ msgstr "Permitir transferência" ++ ++#~ msgid "Reinvite/redirect media connections" ++#~ msgstr "Reconvidar/redirecionar conexões multimídia" ++ ++#~ msgid "Clear global vars" ++#~ msgstr "Limpar variáveis globais" ++ ++#~ msgid "Dialplan Goto" ++#~ msgstr "Encaminhamento do Plano de Discagem" ++ ++#~ msgid "Dialplan Conference" ++#~ msgstr "Conferência do Plano de Discagem" ++ ++#~ msgid "Dialplan Time" ++#~ msgstr "Tempo do Plano de Discagem" ++ ++#~ msgid "Dialplan Voicemail" ++#~ msgstr "Correio de voz do Plano de Discagem" ++ ++#~ msgid "Dial Zones for Dialplan" ++#~ msgstr "Zonas do Plano de Discagem" ++ ++#~ msgid "Prefix to add matching dialplans" ++#~ msgstr "Prefixo para adicionar aos planos de discagem correspondentes" ++ ++#~ msgid "Match International prefix" ++#~ msgstr "Coincidir com o prefixo internacional" ++ ++#~ msgid "Prefix (0) to add/remove to/from international numbers" ++#~ msgstr "Prefixo (0) para adicionar/remover para/de números internacionais" ++ ++#~ msgid "localzone" ++#~ msgstr "zona local" ++ ++#~ msgid "Match plan" ++#~ msgstr "Plano de combinação" ++ ++#~ msgid "Connection to use" ++#~ msgstr "Conexão usada" ++ ++#~ msgid "Feature Key maps" ++#~ msgstr "Mapeamentos de Tecla de Função" ++ ++#~ msgid "Attended transfer key" ++#~ msgstr "Tecla de transferência assistida" ++ ++#~ msgid "Blind transfer key" ++#~ msgstr "Tecla de transferência cega" ++ ++#~ msgid "Key to Disconnect call" ++#~ msgstr "Tecla para Desligar a chamada" ++ ++#~ msgid "Key to Park call" ++#~ msgstr "Tecla para Estacionar a chamada" ++ ++#~ msgid "Parking Feature" ++#~ msgstr "Recurso de Estacionamento" ++ ++#~ msgid "ADSI Park" ++#~ msgstr "Estacionamento ADSI" ++ ++#~ msgid "Attended transfer timeout (sec)" ++#~ msgstr "Tempo limite (seg) da transferência assistida" ++ ++#~ msgid "One touch record key" ++#~ msgstr "Tecla de gravação em um toque" ++ ++#~ msgid "Name of call context for parking" ++#~ msgstr "Nome do contexto de chamada para o estacionamento" ++ ++#~ msgid "Sound file to play to parked caller" ++#~ msgstr "Arquivo de som para tocar para o chamador estacionado" ++ ++#~ msgid "Max time (ms) between digits for feature activation" ++#~ msgstr "Tempo máximo (ms) entre os dígitos para ativação de recursos" ++ ++#~ msgid "Method to Find Parking slot" ++#~ msgstr "Método para Encontrar uma Vaga de Estacionamento" ++ ++#~ msgid "parkedmusicclass" ++#~ msgstr "parkedmusicclass" ++ ++#~ msgid "Play courtesy tone to" ++#~ msgstr "Toque o tom de cortesia para" ++ ++#~ msgid "Enable Parking" ++#~ msgstr "Habilitar Estacionamento" ++ ++#~ msgid "Extension to dial to park" ++#~ msgstr "Extensão para discar para estacionar" ++ ++#~ msgid "Parking time (secs)" ++#~ msgstr "Tempo de estacionamento (seg)" ++ ++#~ msgid "Range of extensions for call parking" ++#~ msgstr "faixa de extensões para o estacionamento de chamada" ++ ++#~ msgid "Pickup extension" ++#~ msgstr "Extensão de captura" ++ ++#~ msgid "Seconds to wait bewteen digits when transferring" ++#~ msgstr "Segundos para esperar entre os dígitos quando transferindo" ++ ++#~ msgid "sound when attended transfer is complete" ++#~ msgstr "emitir som quando a transferência assistida estiver completa" ++ ++#~ msgid "Sound when attended transfer fails" ++#~ msgstr "Emitir som quando a transferência assistida falhar" ++ ++#~ msgid "Reload Hardware Config" ++#~ msgstr "Recarregar a Configuração de Hardware" ++ ++#~ msgid "Reboot Method" ++#~ msgstr "Método de Reinicialização" ++ ++#~ msgid "Parameter" ++#~ msgstr "Parâmetro" ++ ++#~ msgid "Option type" ++#~ msgstr "Tipo de Opção" ++ ++#~ msgid "User name" ++#~ msgstr "Nome do usuário" ++ ++#~ msgid "IAX General Options" ++#~ msgstr "Opções Gerais do Plano de Discagem" ++ ++#~ msgid "Allow Codecs" ++#~ msgstr "Permitir Codificadores (codecs)" ++ ++#~ msgid "Static" ++#~ msgstr "Estático" ++ ++#~ msgid "Write Protect" ++#~ msgstr "Proteção à Escrita" ++ ++#~ msgid "Meetme Conference" ++#~ msgstr "Conferência Encontre-me" ++ ++#~ msgid "Admin PIN" ++#~ msgstr "PIN do Administrador" ++ ++#~ msgid "Meeting PIN" ++#~ msgstr "PIN da Conferência" ++ ++#~ msgid "Meetme Conference General Options" ++#~ msgstr "Opções Gerais da Conferência Encontre-me" ++ ++#~ msgid "Number of 20ms audio buffers to be used" ++#~ msgstr "Número de buffers de 20ms que serão usados" ++ ++#~ msgid "Modules" ++#~ msgstr "Módulos" ++ ++#~ msgid "Alarm Receiver Application" ++#~ msgstr "Aplicativo de Recepção de Alarmes" ++ ++#~ msgid "Authentication Application" ++#~ msgstr "Aplicativo de Autenticação" ++ ++#~ msgid "Make sure asterisk doesnt save CDR" ++#~ msgstr "Garanta que o asterisk não salva o CDR" ++ ++#~ msgid "Check if channel is available" ++#~ msgstr "Verifique se o canal está disponível" ++ ++#~ msgid "Listen in on any channel" ++#~ msgstr "Escute em qualquer canal" ++ ++#~ msgid "Control Playback Application" ++#~ msgstr "Controlar o Aplicativo de Reprodução" ++ ++#~ msgid "Cuts up variables" ++#~ msgstr "Variáveis de Cortes" ++ ++#~ msgid "Database access functions" ++#~ msgstr "Funções de acesso ao banco de dados" ++ ++#~ msgid "Dialing Application" ++#~ msgstr "Aplicativo de Discagem" ++ ++#~ msgid "Virtual Dictation Machine Application" ++#~ msgstr "Aplicativo de Máquina de Ditado Virtual" ++ ++#~ msgid "Directed Call Pickup Support" ++#~ msgstr "Suporte a Captura de Chamadas Direcionadas" ++ ++#~ msgid "Extension Directory" ++#~ msgstr "Diretório de Extensão" ++ ++#~ msgid "DISA (Direct Inward System Access) Application" ++#~ msgstr "Aplicativo DISA (Acesso Direto ao Sistema Interior)" ++ ++#~ msgid "Dump channel variables Application" ++#~ msgstr "Descarregar Aplicativo de variáveis do canal" ++ ++#~ msgid "Simple Echo Application" ++#~ msgstr "Aplicativo de Eco Simples" ++ ++#~ msgid "ENUM Lookup" ++#~ msgstr "Pesquisa ENUM" ++ ++#~ msgid "Reevaluates strings" ++#~ msgstr "Reavaliar sequências de caracteres" ++ ++#~ msgid "Executes applications" ++#~ msgstr "Executa aplicativos" ++ ++#~ msgid "External IVR application interface" ++#~ msgstr "Interface de aplicativo IVR externo" ++ ++#~ msgid "Fork The CDR into 2 seperate entities" ++#~ msgstr "Bifurcar o CDR em duas entidades separadas" ++ ++#~ msgid "Get ADSI CPE ID" ++#~ msgstr "Pegar o ID do CPE ADSI" ++ ++#~ msgid "Group Management Routines" ++#~ msgstr "Rotinas de Gerenciamento e Grupo" ++ ++#~ msgid "Encode and Stream via icecast and ices" ++#~ msgstr "Codificar e Transmitir através do icecast e ices" ++ ++#~ msgid "Image Transmission Application" ++#~ msgstr "Aplicativo de Transmissão de Imagem" ++ ++# what is this black? Seems to be truncated! ++#~ msgid "Look up Caller*ID name/number from black" ++#~ msgstr "Buscar o Identificador de chamadas/nome/número do preto" ++ ++#~ msgid "Look up CallerID Name from local databas" ++#~ msgstr "Buscar o Identificador de chamadas/nome/número do banco de dados" ++ ++#~ msgid "Extension Macros" ++#~ msgstr "Macros de extensão" ++ ++#~ msgid "A simple math Application" ++#~ msgstr "Um Aplicativo simples de matemática" ++ ++#~ msgid "MD5 checksum Application" ++#~ msgstr "Aplicativo de soma de verificação MD5" ++ ++#~ msgid "Digital Milliwatt (mu-law) Test Application" ++#~ msgstr "Aplicativo de Teste de Miliwatt (mu-law) Digital" ++ ++#~ msgid "Record a call and mix the audio during the recording" ++#~ msgstr "Gravar uma ligação e mixar o áudio durante a gravação" ++ ++#~ msgid "Call Parking and Announce Application" ++#~ msgstr "Aplicativo de Anúncio e Estacionamento de Chamada" ++ ++#~ msgid "Trivial Playback Application" ++#~ msgstr "Aplicativo de Reprodução Trivial" ++ ++#~ msgid "Require phone number to be entered" ++#~ msgstr "Requer que seja informado um número de telefone" ++ ++#~ msgid "True Call Queueing" ++#~ msgstr "Enfileiramento Real da Chamada" ++ ++#~ msgid "Random goto" ++#~ msgstr "Vá para aleatório" ++ ++#~ msgid "Read Variable Application" ++#~ msgstr "Aplicativo de Leitura de Variável" ++ ++#~ msgid "Read in a file" ++#~ msgstr "Ler em um arquivo" ++ ++#~ msgid "Realtime Data Lookup/Rewrite" ++#~ msgstr "Escrita/Consulta de Dados em Tempo Real" ++ ++#~ msgid "Trivial Record Application" ++#~ msgstr "Aplicativo de Gravação Trivial" ++ ++#~ msgid "Say time" ++#~ msgstr "Dizer a hora" ++ ++#~ msgid "Send DTMF digits Application" ++#~ msgstr "Aplicativo para Enviar dígitos DTMF" ++ ++#~ msgid "Send Text Applications" ++#~ msgstr "Aplicativos para Enviar Texto" ++ ++#~ msgid "Set CallerID Application" ++#~ msgstr "Aplicativo de Definir a Identificação da Chamada" ++ ++# I guess there is something wrong with English here ++#~ msgid "CDR user field apps" ++#~ msgstr "Aplicativos do campo do usuário no CDR" ++ ++#~ msgid "load => .so ; Set CallerID Name" ++#~ msgstr "Carregar => .so ; Definir o Nome na Identificação da Chamada" ++ ++#~ msgid "load => .so ; Set CallerID Number" ++#~ msgstr "Carregar => .so ; Definir o Número na Identificação da Chamada" ++ ++#~ msgid "Set RDNIS Number" ++#~ msgstr "Definir o Número do RDNIS" ++ ++#~ msgid "Set ISDN Transfer Capability" ++#~ msgstr "Definir Capacidade de Transferência ISDN" ++ ++#~ msgid "SMS/PSTN handler" ++#~ msgstr "Tratador do SMS/PSTN" ++ ++#~ msgid "Hangs up the requested channel" ++#~ msgstr "Termina a ligação no canal requisitado" ++ ++#~ msgid "Stack Routines" ++#~ msgstr "Rotinas de Empilhamento" ++ ++#~ msgid "Generic System() application" ++#~ msgstr "Aplicativo de Sistema Genérico" ++ ++#~ msgid "Playback with Talk Detection" ++#~ msgstr "Reprodução com Detecção de Conversa" ++ ++#~ msgid "Interface Test Application" ++#~ msgstr "Aplicativo de Teste de Interface" ++ ++#~ msgid "Transfer" ++#~ msgstr "Transferir" ++ ++#~ msgid "TXTCIDName" ++#~ msgstr "TXTCIDName" ++ ++#~ msgid "Send URL Applications" ++#~ msgstr "Aplicativo para Enviar URL" ++ ++#~ msgid "Custom User Event Application" ++#~ msgstr "Aplicativo para Eventos do Usuário Personalizados" ++ ++#~ msgid "Send verbose output" ++#~ msgstr "Enviar saída detalhada" ++ ++#~ msgid "Voicemail" ++#~ msgstr "Correio de Voz" ++ ++#~ msgid "Waits until first ring after time" ++#~ msgstr "Espere até o primeiro toque após tempo" ++ ++#~ msgid "Wait For Silence Application" ++#~ msgstr "Aplicativo para Esperar Por Silêncio" ++ ++#~ msgid "While Loops and Conditional Execution" ++#~ msgstr "Laços de Repetição e Execução Condicional" ++ ++#~ msgid "Comma Separated Values CDR Backend" ++#~ msgstr "Serviço de CDR em Valores Separados por Vírgula" ++ ++#~ msgid "Customizable Comma Separated Values CDR Backend" ++#~ msgstr "Serviço de CDR em Valores Separados por Vírgula Personalizável" ++ ++#~ msgid "Asterisk Call Manager CDR Backend" ++#~ msgstr "Serviço de CDR de Gerenciamento de Chamadas Asterisk" ++ ++#~ msgid "MySQL CDR Backend" ++#~ msgstr "Serviço de CDR em MySQL" ++ ++#~ msgid "PostgreSQL CDR Backend" ++#~ msgstr "Serviço de CDR em PostgreSQL" ++ ++#~ msgid "SQLite CDR Backend" ++#~ msgstr "Serviço de CDR em SQLite" ++ ++#~ msgid "Agent Proxy Channel" ++#~ msgstr "Canal de Proxy do Agente" ++ ++#~ msgid "Option chan_iax2" ++#~ msgstr "Opção chan_iax2" ++ ++#~ msgid "Local Proxy Channel" ++#~ msgstr "Canal de Proxy Local" ++ ++#~ msgid "Session Initiation Protocol (SIP)" ++#~ msgstr "Protocolo de Iniciação de Sessão (SIP)" ++ ++#~ msgid "Adaptive Differential PCM Coder/Decoder" ++#~ msgstr "Codificador/Decodificador PCM Diferencial Adaptativo" ++ ++#~ msgid "A-law Coder/Decoder" ++#~ msgstr "Codificador/Decodificador A-law" ++ ++#~ msgid "A-law and Mulaw direct Coder/Decoder" ++#~ msgstr "Codificador/Decodificador direto A-law e Mulaw" ++ ++#~ msgid "ITU G.726-32kbps G726 Transcoder" ++#~ msgstr "Transcodificador G726 ITU G.726-32kbps" ++ ++#~ msgid "GSM/PCM16 (signed linear) Codec Translation" ++#~ msgstr "Tradutor de codificação GSM/PCM16 (linear com sinal)" ++ ++#~ msgid "Speex/PCM16 (signed linear) Codec Translator" ++#~ msgstr "Tradutor de codificação Speex/PCM16 (linear com sinal)" ++ ++#~ msgid "Mu-law Coder/Decoder" ++#~ msgstr "Codificador/Decodificador Mu-law" ++ ++#~ msgid "Sun Microsystems AU format (signed linear)" ++#~ msgstr "Formato AU Sun Microsystems (linear com sinal)" ++ ++#~ msgid "G.723.1 Simple Timestamp File Format" ++#~ msgstr "Formato de Arquivo de Selo Temporal Simples G.723.1" ++ ++#~ msgid "Raw G.726 (16/24/32/40kbps) data" ++#~ msgstr "Dado G.726 bruto (16/24/32/40kbps)" ++ ++#~ msgid "Raw G729 data" ++#~ msgstr "Dado G729 bruto" ++ ++#~ msgid "Raw GSM data" ++#~ msgstr "Dado GSM bruto" ++ ++#~ msgid "Raw h263 data" ++#~ msgstr "Dado h263 bruto" ++ ++#~ msgid "JPEG (Joint Picture Experts Group) Image" ++#~ msgstr "Imagem JPEG ((Joint Picture Experts Group)" ++ ++#~ msgid "Raw uLaw 8khz Audio support (PCM)" ++#~ msgstr "Suporte a uLaw 8khz Ãudio bruto (PCM)" ++ ++#~ msgid "load => .so ; Raw aLaw 8khz PCM Audio support" ++#~ msgstr "carregar => .so ; Suporte a uLaw 8khz Ãudio PCM bruto" ++ ++#~ msgid "Raw Signed Linear Audio support (SLN)" ++#~ msgstr "Suporte a Ãudio Linear com Sinal (SLN)" ++ ++#~ msgid "Dialogic VOX (ADPCM) File Format" ++#~ msgstr "Formato de Arquivo Dialogic VOX (ADPCM)" ++ ++#~ msgid "Microsoft WAV format (8000hz Signed Line" ++#~ msgstr "Formato WAV da Microsoft (8000hz Linear com Sinal)" ++ ++#~ msgid "Microsoft WAV format (Proprietary GSM)" ++#~ msgstr "Formato WAV da Microsoft (GSM Proprietário) " ++ ++#~ msgid "Caller ID related dialplan functions" ++#~ msgstr "" ++#~ "Funções do plano de discagem relacionadas ao identificador da chamada" ++ ++#~ msgid "ENUM Functions" ++#~ msgstr "Funções ENUM" ++ ++#~ msgid "URI encoding / decoding functions" ++#~ msgstr "Funções de codificação / decodificação de URI" ++ ++#~ msgid "Asterisk Extension Language Compiler" ++#~ msgstr "Compilador da Linguagem de Extensão do Asterisk" ++ ++#~ msgid "Text Extension Configuration" ++#~ msgstr "Configuração da Extensão de Texto" ++ ++#~ msgid "load => .so ; Builtin dialplan functions" ++#~ msgstr "carregar => .so ; Funções de plano de discagem embutidas" ++ ++#~ msgid "Loopback Switch" ++#~ msgstr "Interruptor loopback" ++ ++#~ msgid "Realtime Switch" ++#~ msgstr "Interruptor de Tempo Real" ++ ++#~ msgid "Outgoing Spool Support" ++#~ msgstr "Suporte a bufferização da Saída" ++ ++#~ msgid "Wil Cal U (Auto Dialer)" ++#~ msgstr "Wil Cal U (Discador Automático)" ++ ++#~ msgid "MySQL Config Resource" ++#~ msgstr "Recurso de Configuração do Mysql" ++ ++#~ msgid "ODBC Config Resource" ++#~ msgstr "Recurso de Configuração do ODBC" ++ ++#~ msgid "PGSQL Module" ++#~ msgstr "Módulo do PGSQL" ++ ++#~ msgid "Cryptographic Digital Signatures" ++#~ msgstr "Assinaturas Digitais Criptográficas" ++ ++#~ msgid "Call Parking Resource" ++#~ msgstr "Recurso de Estacionamento de Chamadas" ++ ++#~ msgid "Indications Configuration" ++#~ msgstr "Configuração dos Indicadores" ++ ++#~ msgid "Call Monitoring Resource" ++#~ msgstr "Recurso de Monitoramento de Chamada" ++ ++#~ msgid "Music On Hold Resource" ++#~ msgstr "Recurso da Música de Espera" ++ ++#~ msgid "ODBC Resource" ++#~ msgstr "Recurso do ODBC" ++ ++#~ msgid "SMDI Module" ++#~ msgstr "Módulo SMDI" ++ ++#~ msgid "SNMP Module" ++#~ msgstr "Módulo SNMP" ++ ++#~ msgid "Music On Hold" ++#~ msgstr "Música de Espera" ++ ++#~ msgid "Application" ++#~ msgstr "Aplicativo" ++ ++#~ msgid "Directory of Music" ++#~ msgstr "Diretório de Música" ++ ++#~ msgid "Option mode" ++#~ msgstr "Modo da opção" ++ ++#~ msgid "Random Play" ++#~ msgstr "Toque Aleatoriamente" ++ ++#~ msgid "DTMF mode" ++#~ msgstr "Modo DTMF" ++ ++#~ msgid "Primary domain identity for From: headers" ++#~ msgstr "Identidade do primeiro domínio para cabeçalhos De:" ++ ++#~ msgid "From user (required by many SIP providers)" ++#~ msgstr "Do usuário (necessário para muitos provedores de SIP)" ++ ++# I didn't undestand this one ++#~ msgid "Ring on incoming dialplan contexts" ++#~ msgstr "Tocar no contextos de plano de discagem recebidas" ++ ++#~ msgid "Allow Insecure for" ++#~ msgstr "Permitir Inseguro para" ++ ++#~ msgid "Mailbox for MWI" ++#~ msgstr "Caixa de Correio para MWI" ++ ++#~ msgid "NAT between phone and Asterisk" ++#~ msgstr "NAT entre o telefone e o Asterisk" ++ ++#~ msgid "Check tags in headers" ++#~ msgstr "Verifique as etiquetas nos cabeçalhos" ++ ++#~ msgid "Reply Timeout (ms) for down connection" ++#~ msgstr "Tempo Limite da Resposta (ms) para conexões desconectadas" ++ ++#~ msgid "Register connection" ++#~ msgstr "Registro da conexão" ++ ++#~ msgid "Dial own extension for mailbox" ++#~ msgstr "Discar extensão própria para a caixa de correio" ++ ++#~ msgid "Client Type" ++#~ msgstr "Tipo de Cliente" ++ ++#~ msgid "Username" ++#~ msgstr "Usuário" ++ ++#~ msgid "Section sipgeneral" ++#~ msgstr "Opções Gerais do SIP" ++ ++#~ msgid "Allow codecs" ++#~ msgstr "Permitir codificações" ++ ++#~ msgid "SIP realm" ++#~ msgstr "Domínio do SIP (realm)" ++ ++#~ msgid "Voicemail general options" ++#~ msgstr "Opções gerais do correio de voz" ++ ++#~ msgid "From Email address of server" ++#~ msgstr "Endereço do email de origem do servidor" ++ ++#~ msgid "Voice Mail boxes" ++#~ msgstr "Caixas de Correio de Voz" ++ ++#~ msgid "Email contains attachment" ++#~ msgstr "O email contém anexos" ++ ++#~ msgid "Email" ++#~ msgstr "Email" ++ ++#~ msgid "Display Name" ++#~ msgstr "Nome para exibição" ++ ++#~ msgid "Password" ++#~ msgstr "Senha" ++ ++#~ msgid "zone" ++#~ msgstr "zona" ++ ++#~ msgid "Voice Zone settings" ++#~ msgstr "Configuração de Zona da Voz" ++ ++#~ msgid "Message Format" ++#~ msgstr "Formato da Mensagem" +diff --git a/feeds/luci/applications/luci-app-asterisk/po/pt/asterisk.po b/feeds/luci/applications/luci-app-asterisk/po/pt/asterisk.po +new file mode 100644 +index 0000000..d1b9836 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-asterisk/po/pt/asterisk.po +@@ -0,0 +1,150 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Report-Msgid-Bugs-To: \n" ++"POT-Creation-Date: 2009-05-26 19:03+0200\n" ++"PO-Revision-Date: 2009-05-20 11:54+0200\n" ++"Last-Translator: Jose Monteiro \n" ++"Language-Team: LANGUAGE \n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"X-Generator: Pootle 1.1.0\n" ++ ++#~ msgid "Asterisk General Options" ++#~ msgstr "Opções Gerais do Asterisk" ++ ++#~ msgid "AGI directory" ++#~ msgstr "Directorio AGI" ++ ++#~ msgid "Cache recorded sound files during recording" ++#~ msgstr "Guardar em cache os ficheiros de som durante a gravação" ++ ++#~ msgid "Debug Level" ++#~ msgstr "Nível de debug" ++ ++#~ msgid "Disable some warnings" ++#~ msgstr "Desactivar alguns avisos" ++ ++#~ msgid "Dump core on crash" ++#~ msgstr "Guardar o core quando houver crash" ++ ++#~ msgid "High Priority" ++#~ msgstr "Alta Prioridade" ++ ++#~ msgid "Initialise Crypto" ++#~ msgstr "Inicializar Crypto" ++ ++#~ msgid "Use Internal Timing" ++#~ msgstr "Usar temporizações internas" ++ ++#~ msgid "Log directory" ++#~ msgstr "Directorio de registos" ++ ++#~ msgid "Maximum number of calls allowed" ++#~ msgstr "Maximo de chamadas permitidas" ++ ++#~ msgid "Maximum load to stop accepting new calls" ++#~ msgstr "Maximo de carga para deixar de aceitar novas chamadas" ++ ++#~ msgid "Disable console colors" ++#~ msgstr "Desactivar cores na consola" ++ ++#~ msgid "Sound files Cache directory" ++#~ msgstr "Directorio de cache para ficheiros de som" ++ ++#~ msgid "The Group to run as" ++#~ msgstr "O grupo sob o qual o asterisk será executado" ++ ++#~ msgid "The User to run as" ++#~ msgstr "O utilizador sob o qual o asterisk será executado" ++ ++#~ msgid "Voicemail Spool directory" ++#~ msgstr "Directorio da spool de voicemail" ++ ++#~ msgid "Prefix UniquID with system name" ++#~ msgstr "Prefixar o nome de sistema à UniquID" ++ ++#~ msgid "Build transcode paths via SLINEAR, not directly" ++#~ msgstr "" ++#~ "Construir os caminhos de transcode atraves de SLINEAR e não directamente" ++ ++#~ msgid "Transmit SLINEAR silence while recording a channel" ++#~ msgstr "Transmitir silencio SLINEAR durante a gravação de um canal" ++ ++#~ msgid "Verbose Level" ++#~ msgstr "Nivel de verbosidade" ++ ++#~ msgid "Time Zone" ++#~ msgstr "Fuso Horário" ++ ++#~ msgid "Section dialplan" ++#~ msgstr "Secção do Plano de Marcação" ++ ++#~ msgid "include" ++#~ msgstr "incluir" ++ ++#~ msgid "Dialplan Extension" ++#~ msgstr "Extensão do Plano de Marcação" ++ ++#~ msgid "Dialplan General Options" ++#~ msgstr "Opções Gerais do Plano de Marcação" ++ ++#~ msgid "Allow transfer" ++#~ msgstr "Permitir transferência" ++ ++#~ msgid "Reinvite/redirect media connections" ++#~ msgstr "Redirigir/Repetir ligações multimedia" ++ ++#~ msgid "Clear global vars" ++#~ msgstr "Limpar variaveis globais" ++ ++#~ msgid "Dialplan Goto" ++#~ msgstr "Encaminhamento do Plano de Marcação" ++ ++#~ msgid "Dialplan Conference" ++#~ msgstr "Conferencia do Plano de Marcação" ++ ++#, fuzzy ++#~ msgid "Dialplan Time" ++#~ msgstr "Conferencia do Plano de Marcação" ++ ++#, fuzzy ++#~ msgid "Dialplan Voicemail" ++#~ msgstr "Encaminhamento do Plano de Marcação" ++ ++#, fuzzy ++#~ msgid "Dial Zones for Dialplan" ++#~ msgstr "Secção do Plano de Marcação" ++ ++#, fuzzy ++#~ msgid "Connection to use" ++#~ msgstr "Secção do Plano de Marcação" ++ ++#, fuzzy ++#~ msgid "IAX General Options" ++#~ msgstr "Opções Gerais do Plano de Marcação" ++ ++#, fuzzy ++#~ msgid "Allow Codecs" ++#~ msgstr "Opções Gerais do Plano de Marcação" ++ ++#, fuzzy ++#~ msgid "Section sipgeneral" ++#~ msgstr "Opções Gerais do Plano de Marcação" ++ ++#, fuzzy ++#~ msgid "Allow codecs" ++#~ msgstr "Opções Gerais do Plano de Marcação" ++ ++#, fuzzy ++#~ msgid "SIP realm" ++#~ msgstr "Opções Gerais do Plano de Marcação" ++ ++#, fuzzy ++#~ msgid "Voicemail general options" ++#~ msgstr "Opções Gerais do Plano de Marcação" ++ ++#, fuzzy ++#~ msgid "Voice Zone settings" ++#~ msgstr "Secção do Plano de Marcação" +diff --git a/feeds/luci/applications/luci-app-asterisk/po/ro/asterisk.po b/feeds/luci/applications/luci-app-asterisk/po/ro/asterisk.po +new file mode 100644 +index 0000000..e271370 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-asterisk/po/ro/asterisk.po +@@ -0,0 +1,54 @@ ++# asterisk.pot ++# generated from ./applications/luci-asterisk/luasrc/i18n/asterisk.en.lua ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"PO-Revision-Date: 2011-10-07 00:35+0200\n" ++"Last-Translator: Daniel \n" ++"Language-Team: none\n" ++"Language: ro\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=3; plural=(n==1 ? 0 : (n==0 || (n%100 > 0 && n%100 < " ++"20)) ? 1 : 2);;\n" ++"X-Generator: Pootle 2.0.4\n" ++ ++#~ msgid "Asterisk General Options" ++#~ msgstr "Optiunile generale Asterisk" ++ ++#~ msgid "AGI directory" ++#~ msgstr "Director AGI" ++ ++#~ msgid "Disable some warnings" ++#~ msgstr "Dezactiveaza cateva avertizari" ++ ++#~ msgid "High Priority" ++#~ msgstr "Prioritate inalta" ++ ++#~ msgid "Log directory" ++#~ msgstr "Director de loguri" ++ ++#~ msgid "Maximum load to stop accepting new calls" ++#~ msgstr "Incarcarea maxima de cand se refuza apeluri noi" ++ ++#~ msgid "Disable console colors" ++#~ msgstr "Dezactiveaza culorile in consola" ++ ++#~ msgid "The Group to run as" ++#~ msgstr "Ruleaza sub grupul" ++ ++#~ msgid "The User to run as" ++#~ msgstr "Ruleaza sub utilizatorul" ++ ++#~ msgid "Time Zone" ++#~ msgstr "Fusul orar" ++ ++#~ msgid "Allow transfer" ++#~ msgstr "Permite transferul" ++ ++#~ msgid "Clear global vars" ++#~ msgstr "Goleste variabilele globale" ++ ++#~ msgid "Connection to use" ++#~ msgstr "Conexiunea pentru folosire" +diff --git a/feeds/luci/applications/luci-app-asterisk/po/ru/asterisk.po b/feeds/luci/applications/luci-app-asterisk/po/ru/asterisk.po +new file mode 100644 +index 0000000..acedb82 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-asterisk/po/ru/asterisk.po +@@ -0,0 +1,515 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Report-Msgid-Bugs-To: \n" ++"POT-Creation-Date: 2009-05-19 19:36+0200\n" ++"PO-Revision-Date: 2012-04-02 15:02+0200\n" ++"Last-Translator: Kamal \n" ++"Language-Team: LANGUAGE \n" ++"Language: ru\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%" ++"10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" ++"X-Generator: Pootle 2.0.4\n" ++ ++#~ msgid "Asterisk General Options" ++#~ msgstr "Общие наÑтройки Asterisk" ++ ++#~ msgid "AGI directory" ++#~ msgstr "Каталог AGI" ++ ++#~ msgid "Cache recorded sound files during recording" ++#~ msgstr "КÑшировать звуковые файлы во Ð²Ñ€ÐµÐ¼Ñ Ð·Ð°Ð¿Ð¸Ñи" ++ ++#~ msgid "Debug Level" ++#~ msgstr "Уровень отладки" ++ ++#~ msgid "Disable some warnings" ++#~ msgstr "Отключить некоторые предупреждениÑ" ++ ++#~ msgid "Dump core on crash" ++#~ msgstr "СохранÑÑ‚ÑŒ дамп Ñдра при фатальной ошибке" ++ ++#~ msgid "High Priority" ++#~ msgstr "Ð’Ñ‹Ñокий приоритет" ++ ++#~ msgid "Initialise Crypto" ++#~ msgstr "Включить шифрование" ++ ++#~ msgid "Use Internal Timing" ++#~ msgstr "ИÑпользовать внутренние тайминги" ++ ++#~ msgid "Log directory" ++#~ msgstr "Каталог файлов журнала" ++ ++#~ msgid "Maximum number of calls allowed" ++#~ msgstr "МакÑимальное разрешённое количеÑтво вызовов" ++ ++#~ msgid "Maximum load to stop accepting new calls" ++#~ msgstr "МакÑÐ¸Ð¼Ð°Ð»ÑŒÐ½Ð°Ñ Ð½Ð°Ð³Ñ€ÑƒÐ·ÐºÐ° Ð´Ð»Ñ Ð·Ð°Ð¿Ñ€ÐµÑ‚Ð° приёма новых вызовов" ++ ++#~ msgid "Disable console colors" ++#~ msgstr "Выключить цвета конÑоли" ++ ++#~ msgid "Sound files Cache directory" ++#~ msgstr "Каталог кÑша звуковых файлов" ++ ++#~ msgid "The Group to run as" ++#~ msgstr "Группа, от имени которой запуÑкать" ++ ++#~ msgid "The User to run as" ++#~ msgstr "Пользователь, от имени которого запуÑкать" ++ ++#~ msgid "Prefix UniquID with system name" ++#~ msgstr "ДобавлÑÑ‚ÑŒ Ð¸Ð¼Ñ ÑиÑтемы к уникальному идентификатору (UID)" ++ ++#~ msgid "Transmit SLINEAR silence while recording a channel" ++#~ msgstr "Передавать тишину в формате SLINEAR при запиÑи канала" ++ ++#~ msgid "Section dialplan" ++#~ msgstr "Раздел правил набора" ++ ++#~ msgid "include" ++#~ msgstr "включить" ++ ++#~ msgid "Dialplan Extension" ++#~ msgstr "Раcширение правила набора" ++ ++#~ msgid "Dialplan General Options" ++#~ msgstr "Общие наÑтройки правил набора" ++ ++#~ msgid "Allow transfer" ++#~ msgstr "Разрешить перевод" ++ ++#~ msgid "Clear global vars" ++#~ msgstr "ОчиÑтить глобальные переменные" ++ ++#~ msgid "Dialplan Conference" ++#~ msgstr "Правила набора Ð´Ð»Ñ ÐºÐ¾Ð½Ñ„ÐµÑ€ÐµÐ½Ñ†Ð¸Ð¸" ++ ++#~ msgid "Dialplan Time" ++#~ msgstr "Ð’Ñ€ÐµÐ¼Ñ Ð¿Ñ€Ð°Ð²Ð¸Ð» набора" ++ ++#~ msgid "Dialplan Voicemail" ++#~ msgstr "Правила набора Ð´Ð»Ñ Ð³Ð¾Ð»Ð¾Ñовой почты" ++ ++#~ msgid "Dial Zones for Dialplan" ++#~ msgstr "Зоны Ð´Ð»Ñ Ð¿Ñ€Ð°Ð²Ð¸Ð» набора" ++ ++#~ msgid "Prefix (0) to add/remove to/from international numbers" ++#~ msgstr "ÐŸÑ€ÐµÑ„Ð¸ÐºÑ (0) Ð´Ð»Ñ Ð´Ð¾Ð±Ð°Ð²Ð»ÐµÐ½Ð¸Ñ/ÑƒÐ´Ð°Ð»ÐµÐ½Ð¸Ñ Ðº/из международных номеров" ++ ++#~ msgid "localzone" ++#~ msgstr "меÑÑ‚Ð½Ð°Ñ Ð·Ð¾Ð½Ð°" ++ ++#~ msgid "Connection to use" ++#~ msgstr "ИÑпользовать Ñоединение" ++ ++#~ msgid "Feature Key maps" ++#~ msgstr "ÐÐ°Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ Ñ„ÑƒÐ½ÐºÑ†Ð¸Ð»Ð½Ð°Ð»ÑŒÐ½Ñ‹Ñ… клавиш" ++ ++#~ msgid "Key to Disconnect call" ++#~ msgstr "Клавиша Ð´Ð»Ñ Ñ€Ð°Ð·Ñ€Ñ‹Ð²Ð° ÑоединениÑ" ++ ++#~ msgid "Key to Park call" ++#~ msgstr "Клавиша Ð´Ð»Ñ \"парковки\" вызова " ++ ++#~ msgid "Parking Feature" ++#~ msgstr "Ð¤ÑƒÐ½ÐºÑ†Ð¸Ñ \"Парковка\"" ++ ++#~ msgid "One touch record key" ++#~ msgstr "Клавиша запиÑи в одно каÑание" ++ ++#~ msgid "Sound file to play to parked caller" ++#~ msgstr "Ðудио файл, проигрываемый \"припаркованному\"" ++ ++#~ msgid "Max time (ms) between digits for feature activation" ++#~ msgstr "МакÑимальное Ð²Ñ€ÐµÐ¼Ñ (мÑ) между нажатиÑми Ð´Ð»Ñ Ð°ÐºÑ‚Ð¸Ð²Ð°Ñ†Ð¸Ð¸ функции" ++ ++#~ msgid "Method to Find Parking slot" ++#~ msgstr "Метод поиÑка Ñлота Ð´Ð»Ñ Ð¿Ð°Ñ€ÐºÐ¾Ð²ÐºÐ¸" ++ ++#~ msgid "Play courtesy tone to" ++#~ msgstr "Играть тон вежливоÑти длÑ" ++ ++#~ msgid "Enable Parking" ++#~ msgstr "Разрешить \"Парковку\"" ++ ++#~ msgid "Extension to dial to park" ++#~ msgstr "РаÑширение набора Ð´Ð»Ñ \"парковки\"" ++ ++#~ msgid "Parking time (secs)" ++#~ msgstr "Ð’Ñ€ÐµÐ¼Ñ \"Парковки\" (Ñекунды)" ++ ++#~ msgid "Range of extensions for call parking" ++#~ msgstr "Диапазон раÑширений Ð´Ð»Ñ \"парковки\" вызова" ++ ++#~ msgid "Reload Hardware Config" ++#~ msgstr "Перезагрузить конфигурацию оборудованиÑ" ++ ++#~ msgid "Reboot Method" ++#~ msgstr "Метод перезагрузки" ++ ++#~ msgid "Parameter" ++#~ msgstr "Параметр" ++ ++#~ msgid "Option type" ++#~ msgstr "Тип параметра" ++ ++#~ msgid "User name" ++#~ msgstr "Ð˜Ð¼Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ" ++ ++#~ msgid "IAX General Options" ++#~ msgstr "Общие параметры IAX" ++ ++#~ msgid "Allow Codecs" ++#~ msgstr "Разрешить кодеки" ++ ++#~ msgid "Static" ++#~ msgstr "СтатичеÑкий" ++ ++#~ msgid "Write Protect" ++#~ msgstr "Защита от запиÑи" ++ ++#~ msgid "Meetme Conference" ++#~ msgstr "ÐšÐ¾Ð½Ñ„ÐµÑ€ÐµÐ½Ñ†Ð¸Ñ Meetme" ++ ++#~ msgid "Admin PIN" ++#~ msgstr "PIN админиÑтратора" ++ ++#~ msgid "Meeting PIN" ++#~ msgstr "PIN ÑовещаниÑ" ++ ++#~ msgid "Meetme Conference General Options" ++#~ msgstr "Общие параметры конференции Meetme" ++ ++#~ msgid "Number of 20ms audio buffers to be used" ++#~ msgstr "КоличеÑтво иÑпользуемых 20 Ð¼Ñ Ð±ÑƒÑ„ÐµÑ€Ð¾Ð²" ++ ++#~ msgid "Modules" ++#~ msgstr "Модули" ++ ++#~ msgid "Alarm Receiver Application" ++#~ msgstr "Приложение Ñбора Ñигналов тревоги" ++ ++#~ msgid "Authentication Application" ++#~ msgstr "Приложение аутентификации" ++ ++#~ msgid "Make sure asterisk doesnt save CDR" ++#~ msgstr "УбедитеÑÑŒ что Asterisk не ÑохранÑет CDR" ++ ++#~ msgid "Check if channel is available" ++#~ msgstr "Проверить канал на доÑтупноÑÑ‚ÑŒ" ++ ++#~ msgid "Listen in on any channel" ++#~ msgstr "Слашать на любом канале" ++ ++#~ msgid "Database access functions" ++#~ msgstr "Функции доÑтупа базы данных" ++ ++#~ msgid "Dialing Application" ++#~ msgstr "Приложение набора" ++ ++#~ msgid "DISA (Direct Inward System Access) Application" ++#~ msgstr "" ++#~ "Приложение доÑтупа к добавочной линии путем прÑмого уÑÑ‚Ð°Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ " ++#~ "входÑщего ÑÐ¾ÐµÐ´Ð¸Ð½ÐµÐ½Ð¸Ñ (DISA)" ++ ++#~ msgid "Dump channel variables Application" ++#~ msgstr "Приложение Ñбора переменных канала" ++ ++#~ msgid "Simple Echo Application" ++#~ msgstr "Приложение Ñха" ++ ++#~ msgid "Executes applications" ++#~ msgstr "ВыполнÑет приложение" ++ ++#~ msgid "External IVR application interface" ++#~ msgstr "Ð˜Ð½Ñ‚ÐµÑ€Ñ„ÐµÐ¹Ñ Ð²Ð½ÐµÑˆÐ½ÐµÐ³Ð¾ IVR приложениÑ" ++ ++#~ msgid "Group Management Routines" ++#~ msgstr "Операции ÑƒÐ¿Ñ€Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ð³Ñ€ÑƒÐ¿Ð¿Ð¾Ð¹" ++ ++#~ msgid "Image Transmission Application" ++#~ msgstr "Приложение передачи изображений" ++ ++#~ msgid "Look up Caller*ID name/number from black" ++#~ msgstr "ИÑкать Ð¸Ð¼Ñ CallerID в \"черном\" ÑпиÑке" ++ ++#~ msgid "Look up CallerID Name from local databas" ++#~ msgstr "ИÑкать Ð¸Ð¼Ñ CallerID в локальной базе" ++ ++#~ msgid "Extension Macros" ++#~ msgstr "ÐœÐ°ÐºÑ€Ð¾Ñ Ñ€Ð°ÑширениÑ" ++ ++#~ msgid "A simple math Application" ++#~ msgstr "ПроÑтое математичеÑкое приложение" ++ ++#~ msgid "MD5 checksum Application" ++#~ msgstr "Приложение MD5" ++ ++#~ msgid "Record a call and mix the audio during the recording" ++#~ msgstr "ЗапиÑать вызов и микшировать аудио во Ð²Ñ€ÐµÐ¼Ñ Ð·Ð°Ð¿Ð¸Ñи" ++ ++#~ msgid "Trivial Playback Application" ++#~ msgstr "Приложение Ð´Ð»Ñ Ð²Ð¾ÑпроизведениÑ" ++ ++#~ msgid "Require phone number to be entered" ++#~ msgstr "Требовать номер телефона, который необходимо ввеÑти" ++ ++#~ msgid "True Call Queueing" ++#~ msgstr "ПоÑтановка вызовов на ожидание" ++ ++#~ msgid "Read Variable Application" ++#~ msgstr "Приложение Ñ‡Ñ‚ÐµÐ½Ð¸Ñ Ð¿ÐµÑ€ÐµÐ¼ÐµÐ½Ð½Ñ‹Ñ…" ++ ++#~ msgid "Read in a file" ++#~ msgstr "Читать в файл" ++ ++#~ msgid "Trivial Record Application" ++#~ msgstr "ÐŸÑ€Ð¸Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ Ð´Ð»Ñ Ð·Ð°Ð¿Ð¸Ñи" ++ ++#~ msgid "Send DTMF digits Application" ++#~ msgstr "Приложение отправки DTMF" ++ ++#~ msgid "Send Text Applications" ++#~ msgstr "ÐŸÑ€Ð¸Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ Ð¾Ñ‚Ð¿Ñ€Ð°Ð²ÐºÐ¸ текÑта" ++ ++#~ msgid "Set CallerID Application" ++#~ msgstr "Приложение уÑтановки CallerID" ++ ++#~ msgid "Set RDNIS Number" ++#~ msgstr "УÑтановить номер RDNIS" ++ ++#~ msgid "Set ISDN Transfer Capability" ++#~ msgstr "УÑтановить возможноÑти передачи ISDN " ++ ++#~ msgid "SMS/PSTN handler" ++#~ msgstr "Обработчик SMS/PSTN" ++ ++#~ msgid "Hangs up the requested channel" ++#~ msgstr "ОтÑоединÑет запрошенный канал" ++ ++#~ msgid "Stack Routines" ++#~ msgstr "Функции Ñтека" ++ ++#~ msgid "Generic System() application" ++#~ msgstr "Приложение System()" ++ ++#~ msgid "Playback with Talk Detection" ++#~ msgstr "ВоÑпроизведение Ñ Ð¾Ð±Ð½Ð°Ñ€ÑƒÐ¶ÐµÐ½Ð¸ÐµÐ¼ разговора" ++ ++#~ msgid "Interface Test Application" ++#~ msgstr "Приложение Ð´Ð»Ñ Ñ‚ÐµÑÑ‚Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ð¸Ð½Ñ‚ÐµÑ€Ñ„ÐµÐ¹Ñа" ++ ++#~ msgid "Transfer" ++#~ msgstr "ПереÑылка" ++ ++#~ msgid "TXTCIDName" ++#~ msgstr "Ð˜Ð¼Ñ TXTCID" ++ ++#~ msgid "Send URL Applications" ++#~ msgstr "ÐŸÑ€Ð¸Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ Ð¾Ñ‚Ñылки URL" ++ ++#~ msgid "Custom User Event Application" ++#~ msgstr "Приложение пользовательÑких Ñобытий" ++ ++#~ msgid "Send verbose output" ++#~ msgstr "ОтправлÑÑ‚ÑŒ подробный вывод" ++ ++#~ msgid "Voicemail" ++#~ msgstr "ГолоÑÐ¾Ð²Ð°Ñ Ð¿Ð¾Ñ‡Ñ‚Ð°" ++ ++#~ msgid "While Loops and Conditional Execution" ++#~ msgstr "Циклы while и уÑловное выполнение" ++ ++#~ msgid "Asterisk Call Manager CDR Backend" ++#~ msgstr "БÑкенд CDR менеджера вызовов Asterisk" ++ ++#~ msgid "MySQL CDR Backend" ++#~ msgstr "БÑкенд MySQL CDR" ++ ++#~ msgid "PostgreSQL CDR Backend" ++#~ msgstr "БÑкенд PostgreSQL CDR" ++ ++#~ msgid "SQLite CDR Backend" ++#~ msgstr "БÑкенд SQLite CDR" ++ ++#~ msgid "Local Proxy Channel" ++#~ msgstr "Локальный прокÑи-канал" ++ ++#~ msgid "Session Initiation Protocol (SIP)" ++#~ msgstr "Session Initiation Protocol - протокол уÑÑ‚Ð°Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ ÑеанÑа (SIP)" ++ ++#~ msgid "Adaptive Differential PCM Coder/Decoder" ++#~ msgstr "Ðдаптивный дифференциальный PCM кодер/декодер" ++ ++#~ msgid "A-law Coder/Decoder" ++#~ msgstr "A-law кодер/декодер" ++ ++#~ msgid "A-law and Mulaw direct Coder/Decoder" ++#~ msgstr "A-law и Mu-law прÑмой кодер/декодер" ++ ++#~ msgid "ITU G.726-32kbps G726 Transcoder" ++#~ msgstr "ITU G.726-32кбит/Ñ G726 транÑкодер" ++ ++#~ msgid "GSM/PCM16 (signed linear) Codec Translation" ++#~ msgstr "ТранÑлÑтор кодека GSM/PCM16 (знаковый линейный)" ++ ++#~ msgid "Speex/PCM16 (signed linear) Codec Translator" ++#~ msgstr "ТранÑлÑтор кодека Speex/PCM16 (знаковый линейный)" ++ ++#~ msgid "Mu-law Coder/Decoder" ++#~ msgstr "Mu-law кодер/декодер" ++ ++#~ msgid "Sun Microsystems AU format (signed linear)" ++#~ msgstr "Формат Sun Microsystems AU (знаковый линейный)" ++ ++#~ msgid "Raw G.726 (16/24/32/40kbps) data" ++#~ msgstr "Ðеобработанные данные G.726 (16/24/32/40кбит/Ñ)" ++ ++#~ msgid "Raw G729 data" ++#~ msgstr "Ðеобработанные данные G729" ++ ++#~ msgid "Raw GSM data" ++#~ msgstr "Ðеобработанные данные GSM" ++ ++#~ msgid "Raw h263 data" ++#~ msgstr "Ðеобработанные данные h263" ++ ++#~ msgid "JPEG (Joint Picture Experts Group) Image" ++#~ msgstr "Изображение JPEG (Joint Picture Experts Group) " ++ ++#~ msgid "Dialogic VOX (ADPCM) File Format" ++#~ msgstr "Формат Dialogic VOX (ADPCM)" ++ ++#~ msgid "Microsoft WAV format (8000hz Signed Line" ++#~ msgstr "Формат Microsoft WAV (800Гц, линейный знаковый)" ++ ++#~ msgid "Microsoft WAV format (Proprietary GSM)" ++#~ msgstr "Формат Microsoft WAV (проприетарный GSM)" ++ ++#~ msgid "Caller ID related dialplan functions" ++#~ msgstr "Функции правил набора Caller ID" ++ ++#~ msgid "ENUM Functions" ++#~ msgstr "Функции ENUM" ++ ++#~ msgid "URI encoding / decoding functions" ++#~ msgstr "Функции кодированиÑ/Ð´ÐµÐºÐ¾Ð´Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ URI" ++ ++#~ msgid "Asterisk Extension Language Compiler" ++#~ msgstr "КомпилÑтор Ñзыка раÑширений Asterisk" ++ ++#~ msgid "Text Extension Configuration" ++#~ msgstr "ÐаÑтройка текÑтового раÑширениÑ" ++ ++#~ msgid "Wil Cal U (Auto Dialer)" ++#~ msgstr "Позвоню тебе (Wil Cal U, автодозвонщик)" ++ ++#~ msgid "MySQL Config Resource" ++#~ msgstr "РеÑÑƒÑ€Ñ ÐºÐ¾Ð½Ñ„Ð¸Ð³ÑƒÑ€Ð°Ñ†Ð¸Ð¸ MySQL" ++ ++#~ msgid "ODBC Config Resource" ++#~ msgstr "РеÑÑƒÑ€Ñ ÐºÐ¾Ð½Ñ„Ð¸Ð³ÑƒÑ€Ð°Ñ†Ð¸Ð¸ ODBC" ++ ++#~ msgid "PGSQL Module" ++#~ msgstr "PGSQL модуль" ++ ++#~ msgid "Cryptographic Digital Signatures" ++#~ msgstr "Цифровые подпиÑи" ++ ++#~ msgid "Call Parking Resource" ++#~ msgstr "РеÑÑƒÑ€Ñ \"парковки\"" ++ ++#~ msgid "Indications Configuration" ++#~ msgstr "ÐšÐ¾Ð½Ñ„Ð¸Ð³ÑƒÑ€Ð°Ñ†Ð¸Ñ Ð¸Ð½Ð´Ð¸ÐºÐ°Ñ†Ð¸Ð¹" ++ ++#~ msgid "Call Monitoring Resource" ++#~ msgstr "РеÑÑƒÑ€Ñ Ð¼Ð¾Ð½Ð¸Ñ‚Ð¾Ñ€Ð¸Ð½Ð³Ð° вызова" ++ ++#~ msgid "ODBC Resource" ++#~ msgstr "РеÑÑƒÑ€Ñ ODBC" ++ ++#~ msgid "SMDI Module" ++#~ msgstr "Модуль SMDI" ++ ++#~ msgid "SNMP Module" ++#~ msgstr "Модуль SNMP" ++ ++#~ msgid "Music On Hold" ++#~ msgstr "Музыка при ожидании" ++ ++#~ msgid "Application" ++#~ msgstr "Приложение" ++ ++#~ msgid "Directory of Music" ++#~ msgstr "Ð”Ð¸Ñ€ÐµÐºÑ‚Ð¾Ñ€Ð¸Ñ Ð¼ÑƒÐ·Ñ‹ÐºÐ¸" ++ ++#~ msgid "Random Play" ++#~ msgstr "ВоÑпроизведение в Ñлучайном порÑдке" ++ ++#~ msgid "DTMF mode" ++#~ msgstr "DTMF режим" ++ ++#~ msgid "From user (required by many SIP providers)" ++#~ msgstr "From user (от пользователÑ, требуетÑÑ Ð¼Ð½Ð¾Ð³Ð¸Ð¼Ð¸ SIP-провайдерами)" ++ ++#~ msgid "Allow Insecure for" ++#~ msgstr "Разрешить небезопаÑные длÑ" ++ ++#~ msgid "Mailbox for MWI" ++#~ msgstr "Почтовый Ñщик Ð´Ð»Ñ MWI" ++ ++#~ msgid "NAT between phone and Asterisk" ++#~ msgstr "NAT между телефоном и Asterisk" ++ ++#~ msgid "Check tags in headers" ++#~ msgstr "ПроверÑÑ‚ÑŒ метки в заголовках" ++ ++#~ msgid "Register connection" ++#~ msgstr "ЗарегиÑтрировать Ñоединение" ++ ++#~ msgid "Client Type" ++#~ msgstr "Тип клиента" ++ ++#~ msgid "Username" ++#~ msgstr "Ð˜Ð¼Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ" ++ ++#~ msgid "Section sipgeneral" ++#~ msgstr "Общие SIP" ++ ++#~ msgid "SIP realm" ++#~ msgstr "SIP realm" ++ ++#~ msgid "Voicemail general options" ++#~ msgstr "Общие наÑтройки голоÑовой почты" ++ ++#~ msgid "From Email address of server" ++#~ msgstr "От адреÑа Ñл. почты Ñервера" ++ ++#~ msgid "Voice Mail boxes" ++#~ msgstr "Ящики голоÑовой почты" ++ ++#~ msgid "Email contains attachment" ++#~ msgstr "ПиÑьмо Ñодержит вложение" ++ ++#~ msgid "Email" ++#~ msgstr "Эл. почта" ++ ++#~ msgid "Display Name" ++#~ msgstr "Отображаемое имÑ" ++ ++#~ msgid "Password" ++#~ msgstr "Пароль" ++ ++#~ msgid "zone" ++#~ msgstr "зона" ++ ++#~ msgid "Voice Zone settings" ++#~ msgstr "ÐаÑтройки голоÑовой зоны" ++ ++#~ msgid "Message Format" ++#~ msgstr "Формат ÑообщениÑ" +diff --git a/feeds/luci/applications/luci-app-asterisk/po/sk/asterisk.po b/feeds/luci/applications/luci-app-asterisk/po/sk/asterisk.po +new file mode 100644 +index 0000000..e69de29 +diff --git a/feeds/luci/applications/luci-app-asterisk/po/sv/asterisk.po b/feeds/luci/applications/luci-app-asterisk/po/sv/asterisk.po +new file mode 100644 +index 0000000..e69de29 +diff --git a/feeds/luci/applications/luci-app-asterisk/po/templates/asterisk.pot b/feeds/luci/applications/luci-app-asterisk/po/templates/asterisk.pot +new file mode 100644 +index 0000000..e69de29 +diff --git a/feeds/luci/applications/luci-app-asterisk/po/tr/asterisk.po b/feeds/luci/applications/luci-app-asterisk/po/tr/asterisk.po +new file mode 100644 +index 0000000..c8b4e58 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-asterisk/po/tr/asterisk.po +@@ -0,0 +1,12 @@ ++# asterisk.pot ++# generated from ./applications/luci-asterisk/luasrc/i18n/asterisk.en.lua ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Last-Translator: Automatically generated\n" ++"Language-Team: none\n" ++"Language: \n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=1; plural=0;\n" +diff --git a/feeds/luci/applications/luci-app-asterisk/po/uk/asterisk.po b/feeds/luci/applications/luci-app-asterisk/po/uk/asterisk.po +new file mode 100644 +index 0000000..d6dd63e +--- /dev/null ++++ b/feeds/luci/applications/luci-app-asterisk/po/uk/asterisk.po +@@ -0,0 +1,79 @@ ++# asterisk.pot ++# generated from ./applications/luci-asterisk/luasrc/i18n/asterisk.en.lua ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"PO-Revision-Date: 2012-03-21 14:22+0200\n" ++"Last-Translator: Anonymous Pootle User\n" ++"Language-Team: none\n" ++"Language: uk\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%" ++"10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" ++"X-Generator: Pootle 2.0.4\n" ++ ++#~ msgid "Asterisk General Options" ++#~ msgstr "Головні Ð½Ð°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ Asterisk" ++ ++#~ msgid "AGI directory" ++#~ msgstr "AGI тека " ++ ++#~ msgid "Cache recorded sound files during recording" ++#~ msgstr "Кешувати файли запиÑів поки йде запиÑ" ++ ++#~ msgid "Debug Level" ++#~ msgstr "Рівень налагоджуваннÑ" ++ ++#~ msgid "Disable some warnings" ++#~ msgstr "Вимкнути деÑкі попередженнÑ" ++ ++#~ msgid "Dump core on crash" ++#~ msgstr "Зберегти дамп Ñдра в разі фатальної помилки" ++ ++#~ msgid "High Priority" ++#~ msgstr "ВиÑокий пріоритет" ++ ++#~ msgid "Initialise Crypto" ++#~ msgstr "Ініціалізувати шифруваннÑ" ++ ++#~ msgid "Use Internal Timing" ++#~ msgstr "ВикориÑтовувати внутрішні таймінги" ++ ++#~ msgid "Log directory" ++#~ msgstr "Тека з журналом" ++ ++#~ msgid "Maximum number of calls allowed" ++#~ msgstr "МакÑимальна кількіÑÑ‚ÑŒ дозволених дзвінків" ++ ++#~ msgid "Maximum load to stop accepting new calls" ++#~ msgstr "МакÑимальне навантаженнÑ, при Ñкому зупинÑти прийом дзвінків" ++ ++#~ msgid "Disable console colors" ++#~ msgstr "Вимкнути кольори в конÑолі" ++ ++#~ msgid "Sound files Cache directory" ++#~ msgstr "Тека з кешованими звуковими файлами" ++ ++#~ msgid "The Group to run as" ++#~ msgstr "ЗапуÑтити з правами Групи" ++ ++#~ msgid "The User to run as" ++#~ msgstr "ЗапуÑтити з правами КориÑтувача" ++ ++#~ msgid "Voicemail Spool directory" ++#~ msgstr "Тека з голоÑовою поштою" ++ ++#, fuzzy ++#~ msgid "Prefix UniquID with system name" ++#~ msgstr "ÐŸÑ€ÐµÑ„Ñ–ÐºÑ Uniquid з назвою ÑиÑтеми " ++ ++#~ msgid "Time Zone" ++#~ msgstr "ЧаÑовий поÑÑ" ++ ++#~ msgid "Allow transfer" ++#~ msgstr "Дозволити переадреÑацію" ++ ++#~ msgid "Clear global vars" ++#~ msgstr "Видалити глобальні змінні" +diff --git a/feeds/luci/applications/luci-app-asterisk/po/vi/asterisk.po b/feeds/luci/applications/luci-app-asterisk/po/vi/asterisk.po +new file mode 100644 +index 0000000..d1cc6b2 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-asterisk/po/vi/asterisk.po +@@ -0,0 +1,680 @@ ++# asterisk.pot ++# generated from ./applications/luci-asterisk/luasrc/i18n/asterisk.en.lua ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Report-Msgid-Bugs-To: \n" ++"POT-Creation-Date: 2009-08-16 06:58+0200\n" ++"PO-Revision-Date: 2009-08-16 08:36+0200\n" ++"Last-Translator: Hong Phuc Dang \n" ++"Language-Team: LANGUAGE \n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"X-Generator: Pootle 1.1.0\n" ++ ++#~ msgid "Asterisk General Options" ++#~ msgstr "Asterisk những tùy chá»n căn bản" ++ ++#~ msgid "AGI directory" ++#~ msgstr "ThÆ° mục AGI" ++ ++#~ msgid "Cache recorded sound files during recording" ++#~ msgstr "Cache ghi lại tập tin âm thanh trong suốt qua trình recording" ++ ++#~ msgid "Debug Level" ++#~ msgstr "Debug Level" ++ ++#~ msgid "Disable some warnings" ++#~ msgstr "Vô hiệu hóa má»™t số cảnh báo" ++ ++#~ msgid "Dump core on crash" ++#~ msgstr "Dump core on crash" ++ ++#~ msgid "High Priority" ++#~ msgstr "High Priority" ++ ++#~ msgid "Initialise Crypto" ++#~ msgstr "Initialise Crypto" ++ ++#~ msgid "Use Internal Timing" ++#~ msgstr "Sá»­ dụng thá»i gian ná»™i bá»™" ++ ++#~ msgid "Log directory" ++#~ msgstr "ThÆ° mục log" ++ ++#~ msgid "Maximum number of calls allowed" ++#~ msgstr "Số lượng cuá»™c gá»i tối Ä‘a cho phép" ++ ++#~ msgid "Maximum load to stop accepting new calls" ++#~ msgstr "Mức Ä‘á»™ tải tối Ä‘a để ngừng thu nhận cuá»™c gá»i má»›i" ++ ++#~ msgid "Disable console colors" ++#~ msgstr "Vô hiệu hóa bản Ä‘iá»u khiển màu sắc" ++ ++#~ msgid "Sound files Cache directory" ++#~ msgstr "ThÆ° mục sound files cache" ++ ++#~ msgid "The Group to run as" ++#~ msgstr "Nhóm vận hành nhÆ°" ++ ++#~ msgid "The User to run as" ++#~ msgstr "NgÆ°á»i sá»­ dụng vận hành nhÆ°" ++ ++#~ msgid "Voicemail Spool directory" ++#~ msgstr "ThÆ° mục Voicemail Spool " ++ ++#~ msgid "Prefix UniquID with system name" ++#~ msgstr "Tiá»n tố UniquID vá»›i tên hệ thống" ++ ++#~ msgid "Build transcode paths via SLINEAR, not directly" ++#~ msgstr "Xây dá»±ng đừng dẫn transcode via SLINEAR, không trá»±c tiếp" ++ ++#~ msgid "Transmit SLINEAR silence while recording a channel" ++#~ msgstr "Truyá»n SLINEAR silence trong khi recording má»™t channel" ++ ++#~ msgid "Verbose Level" ++#~ msgstr "Verbose Level" ++ ++#~ msgid "Section dialplan" ++#~ msgstr "Section dialplan" ++ ++#~ msgid "include" ++#~ msgstr "bao gồm" ++ ++#~ msgid "Dialplan Extension" ++#~ msgstr "Dialplan Extension" ++ ++#~ msgid "Dialplan General Options" ++#~ msgstr "Dialplan tùy chá»n tổng quát" ++ ++#~ msgid "Allow transfer" ++#~ msgstr "Cho phép chuyển đổi" ++ ++#~ msgid "Clear global vars" ++#~ msgstr "Xóa global vars" ++ ++#~ msgid "Dialplan Goto" ++#~ msgstr "Dialplan Goto" ++ ++#~ msgid "Dialplan Conference" ++#~ msgstr "Dialplan Conference" ++ ++#~ msgid "Dialplan Time" ++#~ msgstr "Dialplan Time" ++ ++#~ msgid "Dialplan Voicemail" ++#~ msgstr "Dialplan Voicemail" ++ ++#~ msgid "Dial Zones for Dialplan" ++#~ msgstr "Dial Zones cho Dialplan" ++ ++#~ msgid "Prefix to add matching dialplans" ++#~ msgstr "Tiá»n tố để thêm vào matching dialplans" ++ ++#~ msgid "Match International prefix" ++#~ msgstr "Match tiá»n tố quốc tê" ++ ++#~ msgid "Prefix (0) to add/remove to/from international numbers" ++#~ msgstr "Tiá»n tố để thêm vào/ bá» ra/ từ số gá»i quốc tế" ++ ++#~ msgid "localzone" ++#~ msgstr "vùng địa phÆ°Æ¡ng" ++ ++#~ msgid "Match plan" ++#~ msgstr "Match plan" ++ ++#~ msgid "Connection to use" ++#~ msgstr "Kết nối sá»­ dụng" ++ ++#~ msgid "Feature Key maps" ++#~ msgstr "Bản đồ phím tính năng" ++ ++#~ msgid "Attended transfer key" ++#~ msgstr "Attended transfer key" ++ ++#~ msgid "Blind transfer key" ++#~ msgstr "phím chuyển đổi ẩn" ++ ++#~ msgid "Key to Disconnect call" ++#~ msgstr "phím để vô hiệu hóa cuá»™c gá»i" ++ ++#~ msgid "Key to Park call" ++#~ msgstr "phím để định vị cuá»™c gá»i" ++ ++#~ msgid "Parking Feature" ++#~ msgstr "Tính năng định vị" ++ ++#~ msgid "ADSI Park" ++#~ msgstr "định vị ADSI" ++ ++#~ msgid "Attended transfer timeout (sec)" ++#~ msgstr "Attended transfer timeout (sec)" ++ ++#~ msgid "One touch record key" ++#~ msgstr "Phím thu chạm má»™t lần" ++ ++#~ msgid "Name of call context for parking" ++#~ msgstr "Tên của call context cho parking" ++ ++#~ msgid "Sound file to play to parked caller" ++#~ msgstr "Tập tin âm thanh để play to parked caller" ++ ++#~ msgid "Max time (ms) between digits for feature activation" ++#~ msgstr "Thá»i gian tối Ä‘a (ms) giữa các digits cho feature activation" ++ ++#~ msgid "Method to Find Parking slot" ++#~ msgstr "PhÆ°Æ¡ng pháp tìm Ä‘iểm định vị" ++ ++#~ msgid "parkedmusicclass" ++#~ msgstr "parkedmusicclass" ++ ++#~ msgid "Play courtesy tone to" ++#~ msgstr "Play courtesy tone để" ++ ++#~ msgid "Enable Parking" ++#~ msgstr "cho phép định vị" ++ ++#~ msgid "Extension to dial to park" ++#~ msgstr "nhanh số để gá»i để định vị" ++ ++#~ msgid "Parking time (secs)" ++#~ msgstr "Thá»i gian định vị" ++ ++#~ msgid "Range of extensions for call parking" ++#~ msgstr "Vùng của Ä‘uôi mở rá»™ng cho call parking" ++ ++#~ msgid "Pickup extension" ++#~ msgstr "Pickup extension" ++ ++#~ msgid "Seconds to wait bewteen digits when transferring" ++#~ msgstr "Thá»i gian chá» giữa những chữ số khi chuyển đổi" ++ ++#~ msgid "sound when attended transfer is complete" ++#~ msgstr "âm thanh khi chuyển đổi hoàn tất" ++ ++#~ msgid "Sound when attended transfer fails" ++#~ msgstr "âm thanh khi chuyển đổi không thành công" ++ ++#~ msgid "Reload Hardware Config" ++#~ msgstr "Tải lại cấu hình phần cứng" ++ ++#~ msgid "Reboot Method" ++#~ msgstr "phÆ°Æ¡ng pháp khởi Ä‘á»™ng lại" ++ ++#~ msgid "Parameter" ++#~ msgstr "Tham số" ++ ++#~ msgid "Option type" ++#~ msgstr "Lá»±a chá»n" ++ ++#~ msgid "User name" ++#~ msgstr "Tên ngÆ°á»i dùng" ++ ++#~ msgid "IAX General Options" ++#~ msgstr "Những lá»±a chá»n tổng quát IAX" ++ ++#~ msgid "Allow Codecs" ++#~ msgstr "Cho phép Codecs" ++ ++#~ msgid "Static" ++#~ msgstr "TÄ©nh" ++ ++#~ msgid "Write Protect" ++#~ msgstr "Viết bảo vệ" ++ ++#~ msgid "Meetme Conference" ++#~ msgstr "Gặp mặt thảo luận" ++ ++#~ msgid "Admin PIN" ++#~ msgstr "PIN quản trị" ++ ++#~ msgid "Meeting PIN" ++#~ msgstr "PIN cuá»™c gặp" ++ ++#~ msgid "Meetme Conference General Options" ++#~ msgstr "Lá»±u chá»n chung vá» thảo luận trá»±c tiếp" ++ ++#~ msgid "Number of 20ms audio buffers to be used" ++#~ msgstr "Số của 20ms audio buffers để được dùng" ++ ++#~ msgid "Modules" ++#~ msgstr "Modules" ++ ++#~ msgid "Alarm Receiver Application" ++#~ msgstr "Ứng dụng nhận báo thức" ++ ++#~ msgid "Authentication Application" ++#~ msgstr "Ứng dụng xác thá»±c" ++ ++#~ msgid "Make sure asterisk doesnt save CDR" ++#~ msgstr "Bảo đảm asterisk không lÆ°u CDR" ++ ++#~ msgid "Check if channel is available" ++#~ msgstr "Kiểm tra xem nếu kênh đã có sẵn" ++ ++#~ msgid "Listen in on any channel" ++#~ msgstr "Nghe trên bất kỳ kênh nào" ++ ++#~ msgid "Control Playback Application" ++#~ msgstr "Äiá»u khiển ứng dụng phát lại" ++ ++#~ msgid "Cuts up variables" ++#~ msgstr "Cuts up variables" ++ ++#~ msgid "Database access functions" ++#~ msgstr "Chức năng truy cập cÆ¡ sở dữ liệu" ++ ++#~ msgid "Dialing Application" ++#~ msgstr "Ứng dụng quay số" ++ ++#~ msgid "Virtual Dictation Machine Application" ++#~ msgstr "Ứng dụng virtual Dictation Machine " ++ ++#~ msgid "Directed Call Pickup Support" ++#~ msgstr "Directed há»— trợ call pickup" ++ ++#~ msgid "Extension Directory" ++#~ msgstr "Danh bạ nhánh số" ++ ++#~ msgid "DISA (Direct Inward System Access) Application" ++#~ msgstr "Ứng dụng DISA (Direct Inward System Access) " ++ ++#~ msgid "Dump channel variables Application" ++#~ msgstr "Dump channel variables Application" ++ ++#~ msgid "Simple Echo Application" ++#~ msgstr "Ứng dụng Echo Ä‘Æ¡n giản" ++ ++#~ msgid "ENUM Lookup" ++#~ msgstr "ENUM tra cứu" ++ ++#~ msgid "Reevaluates strings" ++#~ msgstr "Äánh giá lại strings" ++ ++#~ msgid "Executes applications" ++#~ msgstr "thá»±c thi ứng dụng" ++ ++#~ msgid "External IVR application interface" ++#~ msgstr "Ứng dụng giao diện bên ngoài IVR" ++ ++#~ msgid "Fork The CDR into 2 seperate entities" ++#~ msgstr "Fork The CDR into 2 nhân riêng biệt" ++ ++#~ msgid "Get ADSI CPE ID" ++#~ msgstr "Lấy ADSI CPE ID" ++ ++#~ msgid "Group Management Routines" ++#~ msgstr "Group Management Routines" ++ ++#~ msgid "Encode and Stream via icecast and ices" ++#~ msgstr "Encode và Stream via icecast và ices" ++ ++#~ msgid "Image Transmission Application" ++#~ msgstr "Ứng dụng truyá»n hình ảnh" ++ ++#~ msgid "Look up Caller*ID name/number from black" ++#~ msgstr "Tra cứu tên/số của ngÆ°á»i gá»i" ++ ++#~ msgid "Look up CallerID Name from local databas" ++#~ msgstr "Tra cứu tên ngÆ°á»i gá»i từ cÆ¡ sở dữ liệu địa phÆ°Æ¡ng" ++ ++#~ msgid "Extension Macros" ++#~ msgstr "Nhánh số Macro" ++ ++#~ msgid "A simple math Application" ++#~ msgstr "Ứng dụng tính toán Ä‘Æ¡n giản" ++ ++#~ msgid "MD5 checksum Application" ++#~ msgstr "Ứng dụng MD5 checksum " ++ ++#~ msgid "Digital Milliwatt (mu-law) Test Application" ++#~ msgstr "Ứng dụng kiểm tra Digital Milliwatt (mu-law) " ++ ++#~ msgid "Record a call and mix the audio during the recording" ++#~ msgstr "Thu âm cuá»™c gá»i và phối âm trong khi thu" ++ ++#~ msgid "Call Parking and Announce Application" ++#~ msgstr "Äịnh vị cuá»™c gá»i và ứng dụng thông báo" ++ ++#~ msgid "Trivial Playback Application" ++#~ msgstr "Ứng dụng trivial Playback " ++ ++#~ msgid "Require phone number to be entered" ++#~ msgstr "Yêu cầu nhập số Ä‘iện thoại" ++ ++#~ msgid "True Call Queueing" ++#~ msgstr "True Call Queueing" ++ ++#~ msgid "Random goto" ++#~ msgstr "Random goto" ++ ++#~ msgid "Read Variable Application" ++#~ msgstr "Ứng dụng Ä‘á»c variable " ++ ++#~ msgid "Read in a file" ++#~ msgstr "Äá»c trong má»™t tập tin" ++ ++#~ msgid "Realtime Data Lookup/Rewrite" ++#~ msgstr "Tra cứu dữ liệu đúng lúc/ Viết lại" ++ ++#~ msgid "Trivial Record Application" ++#~ msgstr "Ứng dụng trivial record" ++ ++#~ msgid "Say time" ++#~ msgstr "Nói thá»i gian" ++ ++#~ msgid "Send DTMF digits Application" ++#~ msgstr "Ứng dụng gá»­i những chữ số DTMF" ++ ++#~ msgid "Send Text Applications" ++#~ msgstr "Gá»­i ứng dụng tin nhắn" ++ ++#~ msgid "Set CallerID Application" ++#~ msgstr "Ứng dụng cài đặt định dạng cuá»™c gá»i" ++ ++#~ msgid "CDR user field apps" ++#~ msgstr "CDR user field apps" ++ ++#~ msgid "load => .so ; Set CallerID Name" ++#~ msgstr "load =&gt; .so ; Äặt tên CallerID " ++ ++#~ msgid "load => .so ; Set CallerID Number" ++#~ msgstr "load =&gt; .so ; Äặt số CallerID " ++ ++#~ msgid "Set RDNIS Number" ++#~ msgstr "Cài đặt số RDNIS" ++ ++#~ msgid "Set ISDN Transfer Capability" ++#~ msgstr "Cài đặt công suất truyá»n tải ISDN" ++ ++#~ msgid "SMS/PSTN handler" ++#~ msgstr "SMS/PSTN handler" ++ ++#~ msgid "Hangs up the requested channel" ++#~ msgstr "Bãi bá» kênh yêu cầu" ++ ++#~ msgid "Stack Routines" ++#~ msgstr "Ngăn xếp Routines" ++ ++#~ msgid "Generic System() application" ++#~ msgstr "Ứng dụng Genetic System" ++ ++#~ msgid "Playback with Talk Detection" ++#~ msgstr "Playback vá»›i bá»™ phát hiện tiếng nói" ++ ++#~ msgid "Interface Test Application" ++#~ msgstr "Ứng dụng kiểm tra giao diện" ++ ++#~ msgid "Transfer" ++#~ msgstr "truyá»n tải" ++ ++#~ msgid "TXTCIDName" ++#~ msgstr "TXTCIDName" ++ ++#~ msgid "Send URL Applications" ++#~ msgstr "Gá»­i những ứng dụng URL" ++ ++#~ msgid "Custom User Event Application" ++#~ msgstr "Ứng dụng Custom User Event " ++ ++#~ msgid "Send verbose output" ++#~ msgstr "Gá»­i verbose output" ++ ++#~ msgid "Voicemail" ++#~ msgstr "ThÆ° thoại" ++ ++#~ msgid "Waits until first ring after time" ++#~ msgstr "Äợi tá»›i tiếng ring đầu tiên sau khi" ++ ++#~ msgid "Wait For Silence Application" ++#~ msgstr "Äợi ứng dụng im lặng" ++ ++#~ msgid "While Loops and Conditional Execution" ++#~ msgstr "Trong khi Loops và Conditional Execution" ++ ++#~ msgid "Comma Separated Values CDR Backend" ++#~ msgstr "Comma Separated Values CDR Backend" ++ ++#~ msgid "Customizable Comma Separated Values CDR Backend" ++#~ msgstr "Tùy chỉnh Comma Separated Values CDR Backend" ++ ++#~ msgid "Asterisk Call Manager CDR Backend" ++#~ msgstr "Asterisk Call Manager CDR Backend" ++ ++#~ msgid "MySQL CDR Backend" ++#~ msgstr "MySQL CDR Backend" ++ ++#~ msgid "PostgreSQL CDR Backend" ++#~ msgstr "PostgreSQL CDR Backend" ++ ++#~ msgid "SQLite CDR Backend" ++#~ msgstr "SQLite CDR Backend" ++ ++#~ msgid "Agent Proxy Channel" ++#~ msgstr "Agent Proxy Channel" ++ ++#~ msgid "Option chan_iax2" ++#~ msgstr "Tùy chá»n chan_iax2" ++ ++#~ msgid "Local Proxy Channel" ++#~ msgstr "Local Proxy Channel" ++ ++#~ msgid "Session Initiation Protocol (SIP)" ++#~ msgstr "Session Initiation Protocol (SIP)" ++ ++#~ msgid "Adaptive Differential PCM Coder/Decoder" ++#~ msgstr "Adaptive Differential PCM Coder/Decoder" ++ ++#~ msgid "A-law Coder/Decoder" ++#~ msgstr "A-law Coder/Decoder" ++ ++#~ msgid "A-law and Mulaw direct Coder/Decoder" ++#~ msgstr "A-law and Mulaw direct Coder/Decoder" ++ ++#~ msgid "ITU G.726-32kbps G726 Transcoder" ++#~ msgstr "ITU G.726-32kbps G726 Transcoder" ++ ++#~ msgid "GSM/PCM16 (signed linear) Codec Translation" ++#~ msgstr "GSM/PCM16 (signed linear) Codec Translation" ++ ++#~ msgid "Speex/PCM16 (signed linear) Codec Translator" ++#~ msgstr "Speex/PCM16 (signed linear) Codec Translator" ++ ++#~ msgid "Mu-law Coder/Decoder" ++#~ msgstr "Mu-law Coder/Decoder" ++ ++#~ msgid "Sun Microsystems AU format (signed linear)" ++#~ msgstr "Sun Microsystems AU format (signed linear)" ++ ++#~ msgid "G.723.1 Simple Timestamp File Format" ++#~ msgstr "G.723.1 Simple Timestamp File Format" ++ ++#~ msgid "Raw G.726 (16/24/32/40kbps) data" ++#~ msgstr "Raw G.726 (16/24/32/40kbps) data" ++ ++#~ msgid "Raw G729 data" ++#~ msgstr "Raw G729 data" ++ ++#~ msgid "Raw GSM data" ++#~ msgstr "Raw GSM data" ++ ++#~ msgid "Raw h263 data" ++#~ msgstr "Raw h263 data" ++ ++#~ msgid "JPEG (Joint Picture Experts Group) Image" ++#~ msgstr "JPEG (Joint Picture Experts Group) Image" ++ ++#~ msgid "Raw uLaw 8khz Audio support (PCM)" ++#~ msgstr "Raw uLaw 8khz Audio support (PCM)" ++ ++#~ msgid "load => .so ; Raw aLaw 8khz PCM Audio support" ++#~ msgstr "load =&gt; .so ; Raw aLaw 8khz PCM Audio support" ++ ++#~ msgid "Raw Signed Linear Audio support (SLN)" ++#~ msgstr "Raw Signed Linear Audio support (SLN)" ++ ++#~ msgid "Dialogic VOX (ADPCM) File Format" ++#~ msgstr "Dialogic VOX (ADPCM) File Format" ++ ++#~ msgid "Microsoft WAV format (8000hz Signed Line" ++#~ msgstr "Microsoft WAV format (8000hz Signed Line" ++ ++#~ msgid "Microsoft WAV format (Proprietary GSM)" ++#~ msgstr "Microsoft WAV format (Proprietary GSM)" ++ ++#~ msgid "Caller ID related dialplan functions" ++#~ msgstr "Caller ID liên quan đến chức năng dialplan " ++ ++#~ msgid "ENUM Functions" ++#~ msgstr "chức năng ENUM" ++ ++#~ msgid "URI encoding / decoding functions" ++#~ msgstr "Chức năng URI encoding / decoding " ++ ++#~ msgid "Asterisk Extension Language Compiler" ++#~ msgstr "Asterisk Extension Language Compiler" ++ ++#~ msgid "Text Extension Configuration" ++#~ msgstr "Cấu hình Text Extension " ++ ++#~ msgid "load => .so ; Builtin dialplan functions" ++#~ msgstr "load =&gt; .so ; chức năng Builtin dialplan " ++ ++#~ msgid "Loopback Switch" ++#~ msgstr "Loopback Switch" ++ ++#~ msgid "Realtime Switch" ++#~ msgstr "Realtime Switch" ++ ++#~ msgid "Outgoing Spool Support" ++#~ msgstr "Há»— trợ outgoing spool" ++ ++#~ msgid "Wil Cal U (Auto Dialer)" ++#~ msgstr "Wil Cal U (Auto Dialer)" ++ ++#~ msgid "MySQL Config Resource" ++#~ msgstr "MySQL Config Resource" ++ ++#~ msgid "ODBC Config Resource" ++#~ msgstr "ODBC Config Resource" ++ ++#~ msgid "PGSQL Module" ++#~ msgstr "PGSQL Module" ++ ++#~ msgid "Cryptographic Digital Signatures" ++#~ msgstr "Cryptographic Digital Signatures" ++ ++#~ msgid "Call Parking Resource" ++#~ msgstr "Call Parking Resource" ++ ++#~ msgid "Indications Configuration" ++#~ msgstr "Cấu hình indications" ++ ++#~ msgid "Call Monitoring Resource" ++#~ msgstr "Call Monitoring Resource" ++ ++#~ msgid "Music On Hold Resource" ++#~ msgstr "Music On Hold Resource" ++ ++#~ msgid "ODBC Resource" ++#~ msgstr "ODBC Resource" ++ ++#~ msgid "SMDI Module" ++#~ msgstr "SMDI Module" ++ ++#~ msgid "SNMP Module" ++#~ msgstr "SNMP Module" ++ ++#~ msgid "Music On Hold" ++#~ msgstr "Music On Hold" ++ ++#~ msgid "Application" ++#~ msgstr "Ứng dụng" ++ ++#~ msgid "Directory of Music" ++#~ msgstr "ThÆ° mục music" ++ ++#~ msgid "Option mode" ++#~ msgstr "Chế Ä‘á»™ tùy chá»n" ++ ++#~ msgid "Random Play" ++#~ msgstr "Random Play" ++ ++#~ msgid "DTMF mode" ++#~ msgstr "chế Ä‘á»™ DTMF" ++ ++#~ msgid "Primary domain identity for From: headers" ++#~ msgstr "Nhận dạng primary domain cho From: headers" ++ ++#~ msgid "From user (required by many SIP providers)" ++#~ msgstr "Từ user (yêu cầu bởi nhiá»u nhà cung cấp SIP)" ++ ++#~ msgid "Ring on incoming dialplan contexts" ++#~ msgstr "Ring on incoming dialplan contexts" ++ ++#~ msgid "Allow Insecure for" ++#~ msgstr "Cho phép không an toàn cho" ++ ++#~ msgid "Mailbox for MWI" ++#~ msgstr "Há»™p thÆ° cho MWI" ++ ++#~ msgid "NAT between phone and Asterisk" ++#~ msgstr "NAT giữa Ä‘iện thoại và Asterisk" ++ ++#~ msgid "Check tags in headers" ++#~ msgstr "Kiểm tra tags trong headers" ++ ++#~ msgid "Reply Timeout (ms) for down connection" ++#~ msgstr "Trả lá»i Timeout (ms) cho down kết nối" ++ ++#~ msgid "Register connection" ++#~ msgstr "Äăng ký kết nối" ++ ++#~ msgid "Dial own extension for mailbox" ++#~ msgstr "Gá»i nhánh số cho há»™p thÆ°" ++ ++#~ msgid "Client Type" ++#~ msgstr "Loại Client" ++ ++#~ msgid "Username" ++#~ msgstr "Username" ++ ++#~ msgid "Section sipgeneral" ++#~ msgstr "Section sipgeneral" ++ ++#~ msgid "Allow codecs" ++#~ msgstr "Cho phép Codecs" ++ ++#~ msgid "SIP realm" ++#~ msgstr "SIP realm" ++ ++#~ msgid "Voicemail general options" ++#~ msgstr "ThÆ° thoại tùy chá»n tổng quát" ++ ++#~ msgid "From Email address of server" ++#~ msgstr "Từ địa chỉ email của server" ++ ++#~ msgid "Voice Mail boxes" ++#~ msgstr "Há»™p thÆ° thoại" ++ ++#~ msgid "Email contains attachment" ++#~ msgstr "Email bao gồm attachment" ++ ++#~ msgid "Email" ++#~ msgstr "Email" ++ ++#~ msgid "Display Name" ++#~ msgstr "Tên display" ++ ++#~ msgid "Password" ++#~ msgstr "Mật khẩu" ++ ++#~ msgid "zone" ++#~ msgstr "zone" ++ ++#~ msgid "Voice Zone settings" ++#~ msgstr "Cài đặt voice zone" ++ ++#~ msgid "Message Format" ++#~ msgstr "Message Format" +diff --git a/feeds/luci/applications/luci-app-asterisk/po/zh-cn/asterisk.po b/feeds/luci/applications/luci-app-asterisk/po/zh-cn/asterisk.po +new file mode 100644 +index 0000000..9ef2f1f +--- /dev/null ++++ b/feeds/luci/applications/luci-app-asterisk/po/zh-cn/asterisk.po +@@ -0,0 +1,171 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Report-Msgid-Bugs-To: \n" ++"POT-Creation-Date: 2009-06-10 03:40+0200\n" ++"PO-Revision-Date: 2012-04-02 19:34+0200\n" ++"Last-Translator: Anonymous Pootle User\n" ++"Language-Team: LANGUAGE \n" ++"Language: zh_CN\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=1; plural=0;\n" ++"X-Generator: Pootle 2.0.4\n" ++ ++#~ msgid "Asterisk General Options" ++#~ msgstr "Asterisk 基本选项" ++ ++# test ++#~ msgid "AGI directory" ++#~ msgstr "AGI 目录" ++ ++#~ msgid "Cache recorded sound files during recording" ++#~ msgstr "录音时缓存录音文件" ++ ++#~ msgid "Debug Level" ++#~ msgstr "调试级别" ++ ++#~ msgid "Disable some warnings" ++#~ msgstr "å±è”½éƒ¨åˆ†è­¦å‘Š" ++ ++#~ msgid "Dump core on crash" ++#~ msgstr "系统崩溃时记录错误信æ¯" ++ ++#~ msgid "High Priority" ++#~ msgstr "高优先级" ++ ++#~ msgid "Initialise Crypto" ++#~ msgstr "åˆå§‹åŒ–加密" ++ ++#~ msgid "Use Internal Timing" ++#~ msgstr "使用内部计时器" ++ ++#~ msgid "Log directory" ++#~ msgstr "日志目录" ++ ++#~ msgid "Maximum number of calls allowed" ++#~ msgstr "最大å…许呼å«æ•°" ++ ++#~ msgid "Maximum load to stop accepting new calls" ++#~ msgstr "å…许接å—新呼å«çš„最大负载" ++ ++#~ msgid "Disable console colors" ++#~ msgstr "ç¦ç”¨æŽ§åˆ¶å°è‰²å½©" ++ ++#~ msgid "Sound files Cache directory" ++#~ msgstr "音效文件缓存目录" ++ ++#~ msgid "The Group to run as" ++#~ msgstr "以此“组â€æƒé™è¿è¡Œ" ++ ++#~ msgid "The User to run as" ++#~ msgstr "以此“用户â€èº«ä»½è¿è¡Œ" ++ ++#~ msgid "Voicemail Spool directory" ++#~ msgstr "语音邮件缓存目录" ++ ++#~ msgid "Prefix UniquID with system name" ++#~ msgstr "UniquIDå‰åŠ ç³»ç»Ÿååšå‰ç¼€" ++ ++#~ msgid "Build transcode paths via SLINEAR, not directly" ++#~ msgstr "ç”±SLINEAR间接建立转ç è·¯å¾„" ++ ++#~ msgid "Transmit SLINEAR silence while recording a channel" ++#~ msgstr "对频é“录音时传é€SLINEARé™é»˜" ++ ++#~ msgid "Verbose Level" ++#~ msgstr "详细级别" ++ ++#~ msgid "Time Zone" ++#~ msgstr "时区" ++ ++#~ msgid "Section dialplan" ++#~ msgstr "段内拨å·è®¡åˆ’" ++ ++#~ msgid "include" ++#~ msgstr "包å«" ++ ++#~ msgid "Dialplan Extension" ++#~ msgstr "拨å·è®¡åˆ’ 扩展" ++ ++#~ msgid "Dialplan General Options" ++#~ msgstr "拨å·è®¡åˆ’ 基本å‚æ•°" ++ ++#~ msgid "Allow transfer" ++#~ msgstr "å…许 呼å«è½¬ç§»" ++ ++#~ msgid "Clear global vars" ++#~ msgstr "清除全局å˜é‡" ++ ++#~ msgid "Dialplan Goto" ++#~ msgstr "拨å·è®¡åˆ’至" ++ ++#~ msgid "Dialplan Conference" ++#~ msgstr "会议拨å·è®¡åˆ’" ++ ++#~ msgid "Dialplan Time" ++#~ msgstr "时间拨å·è®¡åˆ’" ++ ++#~ msgid "Dialplan Voicemail" ++#~ msgstr "语音信箱拨å·è®¡åˆ’" ++ ++#~ msgid "Dial Zones for Dialplan" ++#~ msgstr "适用拨å·è®¡åˆ’的拨å·åŒºåŸŸ" ++ ++#~ msgid "Prefix to add matching dialplans" ++#~ msgstr "用于匹é…拨å·è®¡åˆ’çš„å‰ç¼€" ++ ++#~ msgid "Match International prefix" ++#~ msgstr "匹é…的国际å‰ç¼€" ++ ++#~ msgid "localzone" ++#~ msgstr "本地区域" ++ ++#~ msgid "Match plan" ++#~ msgstr "匹é…计划" ++ ++#~ msgid "Connection to use" ++#~ msgstr "使用连接" ++ ++#~ msgid "Feature Key maps" ++#~ msgstr "特殊键映射" ++ ++#~ msgid "Attended transfer key" ++#~ msgstr "加入传输键" ++ ++#~ msgid "Blind transfer key" ++#~ msgstr "å±è”½ä¼ è¾“é”®" ++ ++#~ msgid "Key to Disconnect call" ++#~ msgstr "结æŸå‘¼å«é”®" ++ ++#~ msgid "Key to Park call" ++#~ msgstr "呼å«é©»ç•™é”®" ++ ++#~ msgid "Parking Feature" ++#~ msgstr "驻留特性" ++ ++#~ msgid "ADSI Park" ++#~ msgstr "ADSI驻留" ++ ++#~ msgid "Attended transfer timeout (sec)" ++#~ msgstr "加入传输超时(秒)" ++ ++#~ msgid "One touch record key" ++#~ msgstr "一键录制" ++ ++#~ msgid "Email" ++#~ msgstr "Email" ++ ++#~ msgid "Display Name" ++#~ msgstr "显示åå­—" ++ ++#~ msgid "Password" ++#~ msgstr "密ç " ++ ++#~ msgid "zone" ++#~ msgstr "区" ++ ++#~ msgid "Message Format" ++#~ msgstr "消æ¯æ ¼å¼" +diff --git a/feeds/luci/applications/luci-app-asterisk/po/zh-tw/asterisk.po b/feeds/luci/applications/luci-app-asterisk/po/zh-tw/asterisk.po +new file mode 100644 +index 0000000..c7eef9d +--- /dev/null ++++ b/feeds/luci/applications/luci-app-asterisk/po/zh-tw/asterisk.po +@@ -0,0 +1,13 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Report-Msgid-Bugs-To: \n" ++"POT-Creation-Date: 2013-08-06 23:52+0200\n" ++"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" ++"Last-Translator: FULL NAME \n" ++"Language-Team: LANGUAGE \n" ++"Language: \n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=utf-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"X-Generator: Translate Toolkit 1.9.0\n" +diff --git a/feeds/luci/applications/luci-app-asterisk/root/etc/config/asterisk b/feeds/luci/applications/luci-app-asterisk/root/etc/config/asterisk +new file mode 100644 +index 0000000..2484097 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-asterisk/root/etc/config/asterisk +@@ -0,0 +1,231 @@ ++config 'asterisk' ++ option 'verbose' 3 ++ option 'debug' 3 ++ option 'zone' 'Australia/Perth' ++ ++config 'hardware' 'reboot' ++ option 'method' 'web' ++ option 'param' 'http://ata.lan/admin/reboot' ++ ++config 'feature' 'park' ++ option 'parkenabled' 'yes' ++ option 'parkext' '700' ++ option 'parkpos' '701-720' ++ option 'context' 'parkedcalls' ++ option 'parkingtime' '45' ++ option 'courtesytone' 'beep' ++ option 'parkedplay' 'caller' ++ option 'adsipark' 'yes' ++ option 'findslot' 'first' ++ option 'parkedmusicclass' 'default' ++ option 'transferdigittimeout' '3' ++ option 'xfersound' 'beep' ++ option 'xferfailsound' 'beeperr' ++ option 'pickupexten' '"*8"' ++ option 'featuredigittimeout' '500' ++ option 'atxfernoanswertimeout' '15' ++ ++config 'feature' 'map' ++ option 'blindxfer' '#1' ++ option 'disconnect' '*0' ++ option 'automon' '*1' ++ option 'atxfer' '#2' ++ option 'parkcall' '#30' ++ ++config 'sipgeneral' ++ option 'realm' 'sip.mydomain.net' ++ option 'allow' 'alaw' ++ option 'extension' '102' ++ ++config 'module' ++ option 'res_config_mysql' 'no' ++ option 'res_crypto' 'auto' ++ option 'chan_iax2' 'yes' ++ ++config 'sip' 'PAP2T' ++ option 'type' 'friend' ++ option 'extension' '101' ++ option 'username' 'PAP2T' ++ option 'secret' 'mypass' ++ option 'port' '5061' ++ option 'host' '' ++ option 'dtmfmode' 'rfc2833' ++ option 'insecure' 'very' ++ option 'context' 'internal' ++ option 'mailbox' '1001@default' ++ option 'nat' 'no' ++ option 'canreinvite' 'nonat' ++ option 'selfmailbox' 'yes' ++ option 'incoming' 'provider_inbound' ++ ++config 'sip' 'PAP2T2' ++ option 'type' 'friend' ++ option 'extension' '101' ++ option 'username' 'PAP2T2' ++ option 'secret' 'mysecret' ++ option 'port' '5060' ++ option 'host' '' ++ option 'dtmfmode' 'rfc2833' ++ option 'insecure' 'very' ++ option 'context' 'internal' ++ option 'mailbox' '1001@default' ++ option 'nat' 'no' ++ option 'canreinvite' 'nonat' ++ option 'selfmailbox' 'yes' ++ option 'incoming' 'provider_inbound' ++ ++config 'sip' 'providerphone' ++ option 'provider' 'yes' ++ option 'type' 'friend' ++ option 'timeout' '55' ++ option 'internationalprefix' '0011' ++ option 'alwaysinternational' 'no' ++ option 'countrycode' '63' ++ option 'register' 'yes' ++ option 'host' '200.200.200.200' ++ option 'username' '0899999999' ++ option 'fromuser' '0899999999' ++ option 'secret' 'mysecret' ++ option 'fromdomain' 'providerphone.provider.net.au' ++ option 'context' 'provider_inbound' ++ option 'canreinvite' 'no' ++ option 'nat' 'yes' ++ option 'qualify' 'yes' ++ option 'insecure' 'very' ++ option 'pedantic' 'no' ++ option 'qualify' '1000' ++ ++config 'iaxgeneral' ++ option 'static' 'yes' ++ option 'writeprotect' 'no' ++ option 'canreinvite' 'no' ++ option 'allow' 'ulaw,gsm' ++ ++config 'iax' 'nell' ++ option 'type' 'friend' ++ option 'extension' '108' ++ option 'host' '' ++ option 'username' 'nell' ++ option 'secret' 'mypass' ++ option 'context' 'internal' ++ ++config 'iax' 'iax_vista' ++ option 'extension' '106' ++ option 'type' 'friend' ++ option 'host' '' ++ option 'username' 'vista' ++ option 'secret' 'mysecret' ++ option 'context' 'internal' ++ ++config 'iax' 'sam' ++ option 'type' 'friend' ++ option 'extension' '103' ++ option 'host' '' ++ option 'username' 'sam' ++ option 'secret' 'mysecret' ++ option 'context' 'internal' ++ ++config 'voicegeneral' ++ option 'serveremail' 'voice@sip.mydomain.net' ++ ++config 'voicemail' ++ option 'number' '1001' ++ option 'context' 'default' ++ option 'password' '0000' ++ option 'name' 'Family' ++ option 'email' 'us@mydomain.net' ++ option 'zone' 'wa' ++ option 'attach' 'no' ++ ++config 'voicezone' 'wa' ++ option 'zone' 'Australia/Perth' ++ option 'message' 'Q IMp' ++ ++config 'voicezone' 'military' ++ option 'zone' 'Zulu' ++ option 'message' '"vm-received" q "digits/at" H N "hours" "phonetic/z_p"' ++ ++config 'incominggeneral' ++ option 'allowtransfer' 'no' ++ option 'timeout' '20' ++ option 'answerfirst' 'no' ++ option 'mailbox' '1001@default' ++ ++config 'dialplangeneral' ++ option 'static' 'yes' ++ option 'writeprotect' 'no' ++ option 'canreinvite' 'no' ++ option 'clearglobalvars' 'no' ++ option 'allowtransfer' 'no' ++ ++config 'dialplan' 'internal' ++ option 'include' 'localcall interstate smartnumber emergency extensions' ++ ++config 'dialplanvoice' ++ option 'dialplan' 'internal' ++ option 'extension' '1001' ++ option 'voicecontext' 'default' ++ option 'voicebox' '1001' ++ ++config 'dialplansaytime' ++ option 'dialplan' 'internal' ++ option 'extension' '108' ++ ++config 'dialplanmeetme' ++ option 'dialplan' 'internal' ++ option 'extension' '109' ++ option 'room' '101' ++ ++config 'dialplanmeetme' ++ option 'dialplan' 'internal' ++ option 'extension' '1009' ++ option 'room' '' ++ ++config 'dialplan' 'localinternational' ++ option 'include' 'mobile interstate' ++ ++config 'dialzone' 'interstate' ++ option 'uses' 'SIP/providerphone' ++ option 'match' '0[235-8]NXXXXXXX' ++ option 'localprefix' '0' ++ ++config 'dialzone' 'mobile' ++ option 'uses' 'SIP/providerphone' ++ option 'match' '04XXXXXXXX' ++ option 'localprefix' '0' ++ ++config 'dialzone' 'smartnumber' ++ option 'uses' 'SIP/providerphone' ++ option 'match' '1[835]00.' ++ option 'match' '13ZXXX' ++ ++config 'dialzone' 'emergency' ++ option 'uses' 'SIP/providerphone' ++ option 'match' '000' ++ option 'match' '112' ++ ++config 'dialzone' 'localcall' ++ option 'uses' 'SIP/providerphone' ++ option 'match' 'NXXXXXXX' ++ option 'addprefix' '08' ++ option 'localprefix' '0' ++ ++config 'dialzone' 'international' ++ option 'uses' 'SIP/providerphone' ++ option 'international' '0011,+' ++ option 'localzone' 'localinternational' ++ option 'localprefix' '0' ++ option 'addprefix' '' ++ ++config 'meetmegeneral' ++ option 'audiobuffers' '32' ++ ++config 'meetme' ++ option 'room' '101' ++ option 'pin' '' ++ option 'adminpin' '' ++ ++config 'moh' 'default' ++ option 'mode' 'files' ++ option 'directory' '/opt/moh' ++ option 'random' 'no' +diff --git a/feeds/luci/applications/luci-app-asterisk/root/etc/uci-defaults/luci-asterisk b/feeds/luci/applications/luci-app-asterisk/root/etc/uci-defaults/luci-asterisk +new file mode 100755 +index 0000000..e45819f +--- /dev/null ++++ b/feeds/luci/applications/luci-app-asterisk/root/etc/uci-defaults/luci-asterisk +@@ -0,0 +1,11 @@ ++#!/bin/sh ++ ++uci -q batch <<-EOF >/dev/null ++ delete ucitrack.@asterisk[-1] ++ add ucitrack asterisk ++ set ucitrack.@asterisk[-1].init=asterisk ++ commit ucitrack ++EOF ++ ++rm -f /tmp/luci-indexcache ++exit 0 +diff --git a/feeds/luci/applications/luci-app-commands/Makefile b/feeds/luci/applications/luci-app-commands/Makefile +new file mode 100644 +index 0000000..dc5d0ca +--- /dev/null ++++ b/feeds/luci/applications/luci-app-commands/Makefile +@@ -0,0 +1,14 @@ ++# ++# Copyright (C) 2008-2014 The LuCI Team ++# ++# This is free software, licensed under the Apache License, Version 2.0 . ++# ++ ++include $(TOPDIR)/rules.mk ++ ++LUCI_TITLE:=LuCI Shell Command Module ++LUCI_DEPENDS:= ++ ++include ../../luci.mk ++ ++# call BuildPackage - OpenWrt buildroot signature +diff --git a/feeds/luci/applications/luci-app-commands/luasrc/controller/commands.lua b/feeds/luci/applications/luci-app-commands/luasrc/controller/commands.lua +new file mode 100644 +index 0000000..16528d1 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-commands/luasrc/controller/commands.lua +@@ -0,0 +1,227 @@ ++-- Copyright 2012 Jo-Philipp Wich ++-- Licensed to the public under the Apache License 2.0. ++ ++module("luci.controller.commands", package.seeall) ++ ++function index() ++ entry({"admin", "system", "commands"}, firstchild(), _("Custom Commands"), 80) ++ entry({"admin", "system", "commands", "dashboard"}, template("commands"), _("Dashboard"), 1) ++ entry({"admin", "system", "commands", "config"}, cbi("commands"), _("Configure"), 2) ++ entry({"admin", "system", "commands", "run"}, call("action_run"), nil, 3).leaf = true ++ entry({"admin", "system", "commands", "download"}, call("action_download"), nil, 3).leaf = true ++ ++ entry({"command"}, call("action_public"), nil, 1).leaf = true ++end ++ ++--- Decode a given string into arguments following shell quoting rules ++--- [[abc \def "foo\"bar" abc'def']] -> [[abc def]] [[foo"bar]] [[abcdef]] ++local function parse_args(str) ++ local args = { } ++ ++ local function isspace(c) ++ if c == 9 or c == 10 or c == 11 or c == 12 or c == 13 or c == 32 then ++ return c ++ end ++ end ++ ++ local function isquote(c) ++ if c == 34 or c == 39 or c == 96 then ++ return c ++ end ++ end ++ ++ local function isescape(c) ++ if c == 92 then ++ return c ++ end ++ end ++ ++ local function ismeta(c) ++ if c == 36 or c == 92 or c == 96 then ++ return c ++ end ++ end ++ ++ --- Convert given table of byte values into a Lua string and append it to ++ --- the "args" table. Segment byte value sequence into chunks of 256 values ++ --- to not trip over the parameter limit for string.char() ++ local function putstr(bytes) ++ local chunks = { } ++ local csz = 256 ++ local upk = unpack ++ local chr = string.char ++ local min = math.min ++ local len = #bytes ++ local off ++ ++ for off = 1, len, csz do ++ chunks[#chunks+1] = chr(upk(bytes, off, min(off + csz - 1, len))) ++ end ++ ++ args[#args+1] = table.concat(chunks) ++ end ++ ++ --- Scan substring defined by the indexes [s, e] of the string "str", ++ --- perform unquoting and de-escaping on the fly and store the result in ++ --- a table of byte values which is passed to putstr() ++ local function unquote(s, e) ++ local off, esc, quote ++ local res = { } ++ ++ for off = s, e do ++ local byte = str:byte(off) ++ local q = isquote(byte) ++ local e = isescape(byte) ++ local m = ismeta(byte) ++ ++ if e then ++ esc = true ++ elseif esc then ++ if m then res[#res+1] = 92 end ++ res[#res+1] = byte ++ esc = false ++ elseif q and quote and q == quote then ++ quote = nil ++ elseif q and not quote then ++ quote = q ++ else ++ if m then res[#res+1] = 92 end ++ res[#res+1] = byte ++ end ++ end ++ ++ putstr(res) ++ end ++ ++ --- Find substring boundaries in "str". Ignore escaped or quoted ++ --- whitespace, pass found start- and end-index for each substring ++ --- to unquote() ++ local off, esc, start, quote ++ for off = 1, #str + 1 do ++ local byte = str:byte(off) ++ local q = isquote(byte) ++ local s = isspace(byte) or (off > #str) ++ local e = isescape(byte) ++ ++ if esc then ++ esc = false ++ elseif e then ++ esc = true ++ elseif q and quote and q == quote then ++ quote = nil ++ elseif q and not quote then ++ start = start or off ++ quote = q ++ elseif s and not quote then ++ if start then ++ unquote(start, off - 1) ++ start = nil ++ end ++ else ++ start = start or off ++ end ++ end ++ ++ --- If the "quote" is still set we encountered an unfinished string ++ if quote then ++ unquote(start, #str) ++ end ++ ++ return args ++end ++ ++local function parse_cmdline(cmdid, args) ++ local uci = require "luci.model.uci".cursor() ++ if uci:get("luci", cmdid) == "command" then ++ local cmd = uci:get_all("luci", cmdid) ++ local argv = parse_args(cmd.command) ++ local i, v ++ ++ if cmd.param == "1" and args then ++ for i, v in ipairs(parse_args(luci.http.urldecode(args))) do ++ argv[#argv+1] = v ++ end ++ end ++ ++ for i, v in ipairs(argv) do ++ if v:match("[^%w%.%-i/]") then ++ argv[i] = '"%s"' % v:gsub('"', '\\"') ++ end ++ end ++ ++ return argv ++ end ++end ++ ++function action_run(...) ++ local fs = require "nixio.fs" ++ local argv = parse_cmdline(...) ++ if argv then ++ local outfile = os.tmpname() ++ local errfile = os.tmpname() ++ ++ local rv = os.execute(table.concat(argv, " ") .. " >%s 2>%s" %{ outfile, errfile }) ++ local stdout = fs.readfile(outfile, 1024 * 512) or "" ++ local stderr = fs.readfile(errfile, 1024 * 512) or "" ++ ++ fs.unlink(outfile) ++ fs.unlink(errfile) ++ ++ local binary = not not (stdout:match("[%z\1-\8\14-\31]")) ++ ++ luci.http.prepare_content("application/json") ++ luci.http.write_json({ ++ command = table.concat(argv, " "), ++ stdout = not binary and stdout, ++ stderr = stderr, ++ exitcode = rv, ++ binary = binary ++ }) ++ else ++ luci.http.status(404, "No such command") ++ end ++end ++ ++function action_download(...) ++ local fs = require "nixio.fs" ++ local argv = parse_cmdline(...) ++ if argv then ++ local fd = io.popen(table.concat(argv, " ") .. " 2>/dev/null") ++ if fd then ++ local chunk = fd:read(4096) or "" ++ local name ++ if chunk:match("[%z\1-\8\14-\31]") then ++ luci.http.header("Content-Disposition", "attachment; filename=%s" ++ % fs.basename(argv[1]):gsub("%W+", ".") .. ".bin") ++ luci.http.prepare_content("application/octet-stream") ++ else ++ luci.http.header("Content-Disposition", "attachment; filename=%s" ++ % fs.basename(argv[1]):gsub("%W+", ".") .. ".txt") ++ luci.http.prepare_content("text/plain") ++ end ++ ++ while chunk do ++ luci.http.write(chunk) ++ chunk = fd:read(4096) ++ end ++ ++ fd:close() ++ else ++ luci.http.status(500, "Failed to execute command") ++ end ++ else ++ luci.http.status(404, "No such command") ++ end ++end ++ ++function action_public(cmdid, args) ++ local uci = require "luci.model.uci".cursor() ++ if cmdid and ++ uci:get("luci", cmdid) == "command" and ++ uci:get("luci", cmdid, "public") == "1" ++ then ++ action_download(cmdid, args) ++ else ++ luci.http.status(403, "Access to command denied") ++ end ++end +diff --git a/feeds/luci/applications/luci-app-commands/luasrc/model/cbi/commands.lua b/feeds/luci/applications/luci-app-commands/luasrc/model/cbi/commands.lua +new file mode 100644 +index 0000000..7794f15 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-commands/luasrc/model/cbi/commands.lua +@@ -0,0 +1,27 @@ ++-- Copyright 2012 Jo-Philipp Wich ++-- Licensed to the public under the Apache License 2.0. ++ ++local m, s ++ ++m = Map("luci", translate("Custom Commands"), ++ translate("This page allows you to configure custom shell commands which can be easily invoked from the web interface.")) ++ ++s = m:section(TypedSection, "command", "") ++s.template = "cbi/tblsection" ++s.anonymous = true ++s.addremove = true ++ ++ ++s:option(Value, "name", translate("Description"), ++ translate("A short textual description of the configured command")) ++ ++s:option(Value, "command", translate("Command"), ++ translate("Command line to execute")) ++ ++s:option(Flag, "param", translate("Custom arguments"), ++ translate("Allow the user to provide additional command line arguments")) ++ ++s:option(Flag, "public", translate("Public access"), ++ translate("Allow executing the command and downloading its output without prior authentication")) ++ ++return m +diff --git a/feeds/luci/applications/luci-app-commands/luasrc/view/commands.htm b/feeds/luci/applications/luci-app-commands/luasrc/view/commands.htm +new file mode 100644 +index 0000000..72f1e1d +--- /dev/null ++++ b/feeds/luci/applications/luci-app-commands/luasrc/view/commands.htm +@@ -0,0 +1,169 @@ ++<%# ++ Copyright 2012 Jo-Philipp Wich ++ Licensed to the public under the Apache License 2.0. ++-%> ++ ++<% css = [[ ++ ++.commandbox { ++ height: 12em; ++ width: 30%; ++ float: left; ++ height: 12em; ++ margin: 5px; ++ position: relative; ++} ++ ++.commandbox h3 { ++ font-size: 1.5em !important; ++ line-height: 2em !important; ++ margin: 0 !important; ++} ++ ++.commandbox input[type="text"] { ++ width: 50% !important; ++} ++ ++.commandbox div { ++ position: absolute; ++ left: 0; ++ bottom: 1.5em; ++} ++ ++]] -%> ++ ++<%+header%> ++ ++ ++ ++ ++<% ++ local uci = require "luci.model.uci".cursor() ++ local commands = { } ++ ++ uci:foreach("luci", "command", function(s) commands[#commands+1] = s end) ++%> ++ ++
    "> ++
    ++

    <%:Custom Commands%>

    ++ ++
    ++ <% local _, command; for _, command in ipairs(commands) do %> ++
    ++

    <%=pcdata(command.name)%>

    ++

    <%:Command:%> <%=pcdata(command.command)%>

    ++ <% if command.param == "1" then %> ++

    <%:Arguments:%>

    ++ <% end %> ++
    ++ ++ ++ <% if command.public == "1" then %> ++ ++ <% end %> ++
    ++
    ++ <% end %> ++ ++

    ++ ++
    ++
    ++ ++ ++
    ++ ++<%+footer%> +diff --git a/feeds/luci/applications/luci-app-commands/po/ca/commands.po b/feeds/luci/applications/luci-app-commands/po/ca/commands.po +new file mode 100644 +index 0000000..9dc23b2 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-commands/po/ca/commands.po +@@ -0,0 +1,98 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"PO-Revision-Date: 2014-06-06 10:41+0200\n" ++"Last-Translator: Alex \n" ++"Language-Team: none\n" ++"Language: ca\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n != 1);\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "A short textual description of the configured command" ++msgstr "Una breva descripció textual de l'ordre configurat" ++ ++msgid "Access command with" ++msgstr "Accedeix l'ordre amb" ++ ++msgid "" ++"Allow executing the command and downloading its output without prior " ++"authentication" ++msgstr "" ++"Permet la execució de l'ordre i la baixada de la seva sortida sense " ++"autenticació prèvia" ++ ++msgid "Allow the user to provide additional command line arguments" ++msgstr "Permet que l'usuari proveïa paràmetres de línia de consola addicionals" ++ ++msgid "Arguments:" ++msgstr "Paràmetres:" ++ ++msgid "Binary data not displayed, download instead." ++msgstr "Els dades binaris no es mostren, descarregueu-los." ++ ++msgid "Code:" ++msgstr "Codi:" ++ ++msgid "Collecting data..." ++msgstr "Recollint dades..." ++ ++msgid "Command" ++msgstr "Ordre" ++ ++msgid "Command failed" ++msgstr "L'ordre ha fallat" ++ ++msgid "Command line to execute" ++msgstr "Línia d'ordre per executar" ++ ++msgid "Command successful" ++msgstr "L'ordre ha tingut èxit" ++ ++msgid "Command:" ++msgstr "Ordre;" ++ ++msgid "Configure" ++msgstr "Configura" ++ ++msgid "Custom Commands" ++msgstr "Ordres personalitzats" ++ ++msgid "Custom arguments" ++msgstr "Paràmetres personalitzats" ++ ++msgid "Dashboard" ++msgstr "Panell" ++ ++msgid "Description" ++msgstr "Descripció" ++ ++msgid "Download" ++msgstr "Baixa" ++ ++msgid "Failed to execute command!" ++msgstr "L'execució de l'ordre ha fallat!" ++ ++msgid "Link" ++msgstr "Enllaç" ++ ++msgid "Loading" ++msgstr "Carregant" ++ ++msgid "Public access" ++msgstr "Accés públic" ++ ++msgid "Run" ++msgstr "Executa" ++ ++msgid "" ++"This page allows you to configure custom shell commands which can be easily " ++"invoked from the web interface." ++msgstr "" ++"Aquesta pàgina us permet configurar ordres de consola personalitzats que es " ++"poden invocar fàcilment de la interfície web." ++ ++msgid "Waiting for command to complete..." ++msgstr "Esperant que l'ordre acabi..." +diff --git a/feeds/luci/applications/luci-app-commands/po/cs/commands.po b/feeds/luci/applications/luci-app-commands/po/cs/commands.po +new file mode 100644 +index 0000000..64949bd +--- /dev/null ++++ b/feeds/luci/applications/luci-app-commands/po/cs/commands.po +@@ -0,0 +1,96 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"PO-Revision-Date: 2014-08-04 19:01+0200\n" ++"Last-Translator: KubaCZ \n" ++"Language-Team: none\n" ++"Language: cs\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "A short textual description of the configured command" ++msgstr "Krátky popis nastaveného příkazu" ++ ++msgid "Access command with" ++msgstr "" ++ ++msgid "" ++"Allow executing the command and downloading its output without prior " ++"authentication" ++msgstr "Povolit vykonání příkazu a stažení výstupu bez pÅ™edchozí autentizace." ++ ++msgid "Allow the user to provide additional command line arguments" ++msgstr "Povolit uživateli poskytnout dodateÄné argumenty příkazového řádku" ++ ++msgid "Arguments:" ++msgstr "Argumenty:" ++ ++msgid "Binary data not displayed, download instead." ++msgstr "Binární data nezobrazena, stáhnÄ›te si je." ++ ++msgid "Code:" ++msgstr "Kód:" ++ ++msgid "Collecting data..." ++msgstr "Sbírání dat..." ++ ++msgid "Command" ++msgstr "Příkaz" ++ ++msgid "Command failed" ++msgstr "Příkaz selhal" ++ ++msgid "Command line to execute" ++msgstr "Příkazový řádek k vykonání" ++ ++msgid "Command successful" ++msgstr "Příkaz úspěšný." ++ ++msgid "Command:" ++msgstr "Příkaz:" ++ ++msgid "Configure" ++msgstr "Konfigurovat" ++ ++msgid "Custom Commands" ++msgstr "Vlastní příkazy" ++ ++msgid "Custom arguments" ++msgstr "Vlastní parametry" ++ ++msgid "Dashboard" ++msgstr "Řídicí panel" ++ ++msgid "Description" ++msgstr "Popis" ++ ++msgid "Download" ++msgstr "Stáhnout" ++ ++msgid "Failed to execute command!" ++msgstr "Chyba pÅ™i zpracování příkazu!" ++ ++msgid "Link" ++msgstr "Odkaz" ++ ++msgid "Loading" ++msgstr "Nahrávám" ++ ++msgid "Public access" ++msgstr "VeÅ™ejný přístup" ++ ++msgid "Run" ++msgstr "Spustit" ++ ++msgid "" ++"This page allows you to configure custom shell commands which can be easily " ++"invoked from the web interface." ++msgstr "" ++"Tato stránka umožňuje nastavit vlastní příkazy shellu, které lze snadno " ++"vyvolat z webového rozhraní." ++ ++msgid "Waiting for command to complete..." ++msgstr "ÄŒekejte na dokonÄení příkazu..." +diff --git a/feeds/luci/applications/luci-app-commands/po/de/commands.po b/feeds/luci/applications/luci-app-commands/po/de/commands.po +new file mode 100644 +index 0000000..2b7c631 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-commands/po/de/commands.po +@@ -0,0 +1,98 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"PO-Revision-Date: 2012-11-21 18:45+0200\n" ++"Last-Translator: Jo-Philipp \n" ++"Language-Team: none\n" ++"Language: de\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n != 1);\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "A short textual description of the configured command" ++msgstr "Kurze Beschreibung des abgespeicherten Kommandos" ++ ++msgid "Access command with" ++msgstr "Kommando aufrufen mit" ++ ++msgid "" ++"Allow executing the command and downloading its output without prior " ++"authentication" ++msgstr "" ++"Ausführen des Kommandos und Herunterladen der Ausgabe ohne vorherige " ++"Authentifizierung ermöglichen" ++ ++msgid "Allow the user to provide additional command line arguments" ++msgstr "Erlaube dem Nutzer zusätzliche Kommandozeilenargumente zu übergeben" ++ ++msgid "Arguments:" ++msgstr "Argumente:" ++ ++msgid "Binary data not displayed, download instead." ++msgstr "Binärdaten ausgeblendet, laden Sie die Ausgaben stattdessen herunter" ++ ++msgid "Code:" ++msgstr "Rückgabewert:" ++ ++msgid "Collecting data..." ++msgstr "Sammle Daten..." ++ ++msgid "Command" ++msgstr "Kommando" ++ ++msgid "Command failed" ++msgstr "Kommando fehlgeschlagen" ++ ++msgid "Command line to execute" ++msgstr "Auszuführende Kommandozeile" ++ ++msgid "Command successful" ++msgstr "Kommando erfolgreich" ++ ++msgid "Command:" ++msgstr "Kommando:" ++ ++msgid "Configure" ++msgstr "Konfigurieren" ++ ++msgid "Custom Commands" ++msgstr "Benutzerdefinierte Kommandos" ++ ++msgid "Custom arguments" ++msgstr "Benutzerdefinierte Argumente" ++ ++msgid "Dashboard" ++msgstr "Ãœbersicht" ++ ++msgid "Description" ++msgstr "Beschreibung" ++ ++msgid "Download" ++msgstr "Herunterladen" ++ ++msgid "Failed to execute command!" ++msgstr "Kommando konnte nicht ausgeführt werden!" ++ ++msgid "Link" ++msgstr "Link" ++ ++msgid "Loading" ++msgstr "Lade" ++ ++msgid "Public access" ++msgstr "Öffentlicher Zugriff" ++ ++msgid "Run" ++msgstr "Ausführen" ++ ++msgid "" ++"This page allows you to configure custom shell commands which can be easily " ++"invoked from the web interface." ++msgstr "" ++"Diese Seite ermöglicht die Konfiguration eigener Shell-Kommandos um diese " ++"einfach über das Webinterface ausführen zu können." ++ ++msgid "Waiting for command to complete..." ++msgstr "Warte auf die Ausführung des Kommandos..." +diff --git a/feeds/luci/applications/luci-app-commands/po/el/commands.po b/feeds/luci/applications/luci-app-commands/po/el/commands.po +new file mode 100644 +index 0000000..0e9e65d +--- /dev/null ++++ b/feeds/luci/applications/luci-app-commands/po/el/commands.po +@@ -0,0 +1,91 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Last-Translator: Automatically generated\n" ++"Language-Team: none\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n != 1);\n" ++ ++msgid "A short textual description of the configured command" ++msgstr "" ++ ++msgid "Access command with" ++msgstr "" ++ ++msgid "" ++"Allow executing the command and downloading its output without prior " ++"authentication" ++msgstr "" ++ ++msgid "Allow the user to provide additional command line arguments" ++msgstr "" ++ ++msgid "Arguments:" ++msgstr "" ++ ++msgid "Binary data not displayed, download instead." ++msgstr "" ++ ++msgid "Code:" ++msgstr "" ++ ++msgid "Collecting data..." ++msgstr "" ++ ++msgid "Command" ++msgstr "" ++ ++msgid "Command failed" ++msgstr "" ++ ++msgid "Command line to execute" ++msgstr "" ++ ++msgid "Command successful" ++msgstr "" ++ ++msgid "Command:" ++msgstr "" ++ ++msgid "Configure" ++msgstr "" ++ ++msgid "Custom Commands" ++msgstr "" ++ ++msgid "Custom arguments" ++msgstr "" ++ ++msgid "Dashboard" ++msgstr "" ++ ++msgid "Description" ++msgstr "" ++ ++msgid "Download" ++msgstr "" ++ ++msgid "Failed to execute command!" ++msgstr "" ++ ++msgid "Link" ++msgstr "" ++ ++msgid "Loading" ++msgstr "" ++ ++msgid "Public access" ++msgstr "" ++ ++msgid "Run" ++msgstr "" ++ ++msgid "" ++"This page allows you to configure custom shell commands which can be easily " ++"invoked from the web interface." ++msgstr "" ++ ++msgid "Waiting for command to complete..." ++msgstr "" +diff --git a/feeds/luci/applications/luci-app-commands/po/en/commands.po b/feeds/luci/applications/luci-app-commands/po/en/commands.po +new file mode 100644 +index 0000000..754a229 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-commands/po/en/commands.po +@@ -0,0 +1,95 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Last-Translator: Automatically generated\n" ++"Language-Team: none\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n != 1);\n" ++ ++msgid "A short textual description of the configured command" ++msgstr "A short textual description of the configured command" ++ ++msgid "Access command with" ++msgstr "Access command with" ++ ++msgid "" ++"Allow executing the command and downloading its output without prior " ++"authentication" ++msgstr "" ++"Allow executing the command and downloading its output without prior " ++"authentication" ++ ++msgid "Allow the user to provide additional command line arguments" ++msgstr "Allow the user to provide additional command line arguments" ++ ++msgid "Arguments:" ++msgstr "Arguments:" ++ ++msgid "Binary data not displayed, download instead." ++msgstr "Binary data not displayed, download instead." ++ ++msgid "Code:" ++msgstr "Code:" ++ ++msgid "Collecting data..." ++msgstr "Collecting data..." ++ ++msgid "Command" ++msgstr "Command" ++ ++msgid "Command failed" ++msgstr "Command failed" ++ ++msgid "Command line to execute" ++msgstr "Command line to execute" ++ ++msgid "Command successful" ++msgstr "Command successful" ++ ++msgid "Command:" ++msgstr "Command:" ++ ++msgid "Configure" ++msgstr "Configure" ++ ++msgid "Custom Commands" ++msgstr "Custom Commands" ++ ++msgid "Custom arguments" ++msgstr "Custom arguments" ++ ++msgid "Dashboard" ++msgstr "Dashboard" ++ ++msgid "Description" ++msgstr "Description" ++ ++msgid "Download" ++msgstr "Download" ++ ++msgid "Failed to execute command!" ++msgstr "Failed to execute command!" ++ ++msgid "Link" ++msgstr "Link" ++ ++msgid "Loading" ++msgstr "Loading" ++ ++msgid "Public access" ++msgstr "Public access" ++ ++msgid "Run" ++msgstr "Run" ++ ++msgid "" ++"This page allows you to configure custom shell commands which can be easily " ++"invoked from the web interface." ++msgstr "" ++"This page allows you to configure custom shell commands which can be easily " ++"invoked from the web interface." ++ ++msgid "Waiting for command to complete..." ++msgstr "Waiting for command to complete..." +diff --git a/feeds/luci/applications/luci-app-commands/po/es/commands.po b/feeds/luci/applications/luci-app-commands/po/es/commands.po +new file mode 100644 +index 0000000..8052452 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-commands/po/es/commands.po +@@ -0,0 +1,97 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"PO-Revision-Date: 2012-11-24 10:16+0200\n" ++"Last-Translator: José Vicente \n" ++"Language-Team: none\n" ++"Language: es\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n != 1);\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "A short textual description of the configured command" ++msgstr "Descripción breve del comando a configurar" ++ ++msgid "Access command with" ++msgstr "Acceder al comando con" ++ ++msgid "" ++"Allow executing the command and downloading its output without prior " ++"authentication" ++msgstr "" ++"Permitir ejecutar el comando y descargar su salida sin más autentificación" ++ ++msgid "Allow the user to provide additional command line arguments" ++msgstr "Permitir al usuario añadir parámetros de línea de comandos" ++ ++msgid "Arguments:" ++msgstr "Parámetros:" ++ ++msgid "Binary data not displayed, download instead." ++msgstr "No se pueden mostrar datos binarios, descárguelos." ++ ++msgid "Code:" ++msgstr "Código:" ++ ++msgid "Collecting data..." ++msgstr "Recuperando datos..." ++ ++msgid "Command" ++msgstr "Comando" ++ ++msgid "Command failed" ++msgstr "Falló" ++ ++msgid "Command line to execute" ++msgstr "Comando a ejecutar" ++ ++msgid "Command successful" ++msgstr "OK" ++ ++msgid "Command:" ++msgstr "Comando:" ++ ++msgid "Configure" ++msgstr "Configurar" ++ ++msgid "Custom Commands" ++msgstr "Comandos propios" ++ ++msgid "Custom arguments" ++msgstr "Parámetros propios" ++ ++msgid "Dashboard" ++msgstr "Panel" ++ ++msgid "Description" ++msgstr "Descripción" ++ ++msgid "Download" ++msgstr "Descarga" ++ ++msgid "Failed to execute command!" ++msgstr "¡Error al ejecutar el comando!" ++ ++msgid "Link" ++msgstr "Enlace" ++ ++msgid "Loading" ++msgstr "Cargando" ++ ++msgid "Public access" ++msgstr "Acceso público" ++ ++msgid "Run" ++msgstr "Ejecutar" ++ ++msgid "" ++"This page allows you to configure custom shell commands which can be easily " ++"invoked from the web interface." ++msgstr "" ++"Aquí puede configurar sus propios comandos shell para lanzarlos fácilmente " ++"desde el interfaz web." ++ ++msgid "Waiting for command to complete..." ++msgstr "Esperando a que termine el comando..." +diff --git a/feeds/luci/applications/luci-app-commands/po/fr/commands.po b/feeds/luci/applications/luci-app-commands/po/fr/commands.po +new file mode 100644 +index 0000000..fac1aff +--- /dev/null ++++ b/feeds/luci/applications/luci-app-commands/po/fr/commands.po +@@ -0,0 +1,100 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"PO-Revision-Date: 2013-12-12 13:36+0200\n" ++"Last-Translator: maximeguillaud \n" ++"Language-Team: none\n" ++"Language: fr\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n > 1);\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "A short textual description of the configured command" ++msgstr "Une courte description de la commande configurée" ++ ++msgid "Access command with" ++msgstr "Accéder à la commande par" ++ ++msgid "" ++"Allow executing the command and downloading its output without prior " ++"authentication" ++msgstr "" ++"Autoriser l'exécution de la commande et le téléchargement de son résultat " ++"sans authentification préalable" ++ ++msgid "Allow the user to provide additional command line arguments" ++msgstr "" ++"Autoriser l'utilisateur à fournir des arguments de ligne de commande " ++"supplémentaires" ++ ++msgid "Arguments:" ++msgstr "Arguments :" ++ ++msgid "Binary data not displayed, download instead." ++msgstr "Données binaires non affichables, elle peuvent être téléchargées." ++ ++msgid "Code:" ++msgstr "Code : " ++ ++msgid "Collecting data..." ++msgstr "Récupération des données ..." ++ ++msgid "Command" ++msgstr "Commande" ++ ++msgid "Command failed" ++msgstr "Echec de la commande" ++ ++msgid "Command line to execute" ++msgstr "Ligne de commande à exécuter" ++ ++msgid "Command successful" ++msgstr "Commande réussie" ++ ++msgid "Command:" ++msgstr "Commande :" ++ ++msgid "Configure" ++msgstr "Configurer" ++ ++msgid "Custom Commands" ++msgstr "Commandes personnalisées" ++ ++msgid "Custom arguments" ++msgstr "Arguments personnalisés" ++ ++msgid "Dashboard" ++msgstr "Tableau de bord" ++ ++msgid "Description" ++msgstr "Description" ++ ++msgid "Download" ++msgstr "Télécharger" ++ ++msgid "Failed to execute command!" ++msgstr "Echec de l'exécution de la commande ! " ++ ++msgid "Link" ++msgstr "Lien" ++ ++msgid "Loading" ++msgstr "Chargement" ++ ++msgid "Public access" ++msgstr "Accès public" ++ ++msgid "Run" ++msgstr "Exécuter" ++ ++msgid "" ++"This page allows you to configure custom shell commands which can be easily " ++"invoked from the web interface." ++msgstr "" ++"Cette page vous permet de configurer des commandes shell personnalisées, " ++"pouvant être invoquées facilement depuis l'interface web." ++ ++msgid "Waiting for command to complete..." ++msgstr "En attente de la commande pour finir..." +diff --git a/feeds/luci/applications/luci-app-commands/po/he/commands.po b/feeds/luci/applications/luci-app-commands/po/he/commands.po +new file mode 100644 +index 0000000..0e9e65d +--- /dev/null ++++ b/feeds/luci/applications/luci-app-commands/po/he/commands.po +@@ -0,0 +1,91 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Last-Translator: Automatically generated\n" ++"Language-Team: none\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n != 1);\n" ++ ++msgid "A short textual description of the configured command" ++msgstr "" ++ ++msgid "Access command with" ++msgstr "" ++ ++msgid "" ++"Allow executing the command and downloading its output without prior " ++"authentication" ++msgstr "" ++ ++msgid "Allow the user to provide additional command line arguments" ++msgstr "" ++ ++msgid "Arguments:" ++msgstr "" ++ ++msgid "Binary data not displayed, download instead." ++msgstr "" ++ ++msgid "Code:" ++msgstr "" ++ ++msgid "Collecting data..." ++msgstr "" ++ ++msgid "Command" ++msgstr "" ++ ++msgid "Command failed" ++msgstr "" ++ ++msgid "Command line to execute" ++msgstr "" ++ ++msgid "Command successful" ++msgstr "" ++ ++msgid "Command:" ++msgstr "" ++ ++msgid "Configure" ++msgstr "" ++ ++msgid "Custom Commands" ++msgstr "" ++ ++msgid "Custom arguments" ++msgstr "" ++ ++msgid "Dashboard" ++msgstr "" ++ ++msgid "Description" ++msgstr "" ++ ++msgid "Download" ++msgstr "" ++ ++msgid "Failed to execute command!" ++msgstr "" ++ ++msgid "Link" ++msgstr "" ++ ++msgid "Loading" ++msgstr "" ++ ++msgid "Public access" ++msgstr "" ++ ++msgid "Run" ++msgstr "" ++ ++msgid "" ++"This page allows you to configure custom shell commands which can be easily " ++"invoked from the web interface." ++msgstr "" ++ ++msgid "Waiting for command to complete..." ++msgstr "" +diff --git a/feeds/luci/applications/luci-app-commands/po/hu/commands.po b/feeds/luci/applications/luci-app-commands/po/hu/commands.po +new file mode 100644 +index 0000000..5cd0ec7 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-commands/po/hu/commands.po +@@ -0,0 +1,98 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"PO-Revision-Date: 2013-01-24 18:47+0200\n" ++"Last-Translator: Gábor \n" ++"Language-Team: none\n" ++"Language: hu\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n != 1);\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "A short textual description of the configured command" ++msgstr "A beállított parancs rövid szöveges leírása" ++ ++msgid "Access command with" ++msgstr "Parancs hozzáférése" ++ ++msgid "" ++"Allow executing the command and downloading its output without prior " ++"authentication" ++msgstr "" ++"Engedélyezi a parancs végrehajtását és kimenetének letöltését elÅ‘zetes " ++"hitelesítés nélkül" ++ ++msgid "Allow the user to provide additional command line arguments" ++msgstr "A felhasználó által további parancsori argumentumok adhatók meg" ++ ++msgid "Arguments:" ++msgstr "Argumentumok:" ++ ++msgid "Binary data not displayed, download instead." ++msgstr "Bináris adat nem jelenik meg, töltse le helyette." ++ ++msgid "Code:" ++msgstr "Kód:" ++ ++msgid "Collecting data..." ++msgstr "Adatgyűjtés..." ++ ++msgid "Command" ++msgstr "Paracs" ++ ++msgid "Command failed" ++msgstr "Parancs végrehajtás sikertelen" ++ ++msgid "Command line to execute" ++msgstr "Futtatandó parancssor" ++ ++msgid "Command successful" ++msgstr "Parancs végrehajtás sikeres" ++ ++msgid "Command:" ++msgstr "Parancs:" ++ ++msgid "Configure" ++msgstr "Beállítás" ++ ++msgid "Custom Commands" ++msgstr "Egyedi parancsok" ++ ++msgid "Custom arguments" ++msgstr "Egyedi argumentumok" ++ ++msgid "Dashboard" ++msgstr "VezérlÅ‘pult" ++ ++msgid "Description" ++msgstr "Leírás" ++ ++msgid "Download" ++msgstr "Letöltés" ++ ++msgid "Failed to execute command!" ++msgstr "Parancs végrehajtása sikertelen!" ++ ++msgid "Link" ++msgstr "Link" ++ ++msgid "Loading" ++msgstr "Betöltés" ++ ++msgid "Public access" ++msgstr "Nyilvános hozzáférés" ++ ++msgid "Run" ++msgstr "Futtatás" ++ ++msgid "" ++"This page allows you to configure custom shell commands which can be easily " ++"invoked from the web interface." ++msgstr "" ++"Ezen az oldalon egyéni shell parancsokat állíthat be, amelyeket könnyen " ++"felhasználhat a webes felületen." ++ ++msgid "Waiting for command to complete..." ++msgstr "Várakozás a parancs befejezésére..." +diff --git a/feeds/luci/applications/luci-app-commands/po/it/commands.po b/feeds/luci/applications/luci-app-commands/po/it/commands.po +new file mode 100644 +index 0000000..c14b910 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-commands/po/it/commands.po +@@ -0,0 +1,99 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"PO-Revision-Date: 2013-02-03 13:52+0200\n" ++"Last-Translator: Francesco <3gasas@gmail.com>\n" ++"Language-Team: none\n" ++"Language: it\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n != 1);\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "A short textual description of the configured command" ++msgstr "Una breve descrizione testuale del comando configurato" ++ ++msgid "Access command with" ++msgstr "Accesso comando con" ++ ++msgid "" ++"Allow executing the command and downloading its output without prior " ++"authentication" ++msgstr "" ++"Consentire l'esecuzione del comando e il download del suo output senza " ++"previa autenticazione" ++ ++msgid "Allow the user to provide additional command line arguments" ++msgstr "" ++"Consente all'utente di fornire ulteriori argomenti della riga di comando" ++ ++msgid "Arguments:" ++msgstr "Argomenti:" ++ ++msgid "Binary data not displayed, download instead." ++msgstr "I dati binari non vengono visualizzati, ma possono essere scaricati." ++ ++msgid "Code:" ++msgstr "Codice:" ++ ++msgid "Collecting data..." ++msgstr "Raccolta dei dati..." ++ ++msgid "Command" ++msgstr "Comando" ++ ++msgid "Command failed" ++msgstr "Comando fallito" ++ ++msgid "Command line to execute" ++msgstr "Riga di comando da eseguire" ++ ++msgid "Command successful" ++msgstr "Comando riuscito" ++ ++msgid "Command:" ++msgstr "Comando:" ++ ++msgid "Configure" ++msgstr "Configura" ++ ++msgid "Custom Commands" ++msgstr "Comandi Personalizzati" ++ ++msgid "Custom arguments" ++msgstr "Argomenti Personalizzati" ++ ++msgid "Dashboard" ++msgstr "Dashboard" ++ ++msgid "Description" ++msgstr "Descrizione" ++ ++msgid "Download" ++msgstr "Download" ++ ++msgid "Failed to execute command!" ++msgstr "Impossibile eseguire il comando!" ++ ++msgid "Link" ++msgstr "Collegamento" ++ ++msgid "Loading" ++msgstr "Caricamento" ++ ++msgid "Public access" ++msgstr "Accesso Pubblico" ++ ++msgid "Run" ++msgstr "Esegui" ++ ++msgid "" ++"This page allows you to configure custom shell commands which can be easily " ++"invoked from the web interface." ++msgstr "" ++"Questa pagina consente di configurare i comandi della shell personalizzate " ++"che possono essere facilmente richiamati dall'interfaccia web." ++ ++msgid "Waiting for command to complete..." ++msgstr "In attesa del comando da completare..." +diff --git a/feeds/luci/applications/luci-app-commands/po/ja/commands.po b/feeds/luci/applications/luci-app-commands/po/ja/commands.po +new file mode 100644 +index 0000000..3b01a35 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-commands/po/ja/commands.po +@@ -0,0 +1,94 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"PO-Revision-Date: 2013-10-05 17:15+0200\n" ++"Last-Translator: Kentaro \n" ++"Language-Team: none\n" ++"Language: ja\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=1; plural=0;\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "A short textual description of the configured command" ++msgstr "設定ã—ãŸã‚³ãƒžãƒ³ãƒ‰ã®ç°¡å˜ãªèª¬æ˜Žæ–‡ã‚’記載ã—ã¾ã™" ++ ++msgid "Access command with" ++msgstr "" ++ ++msgid "" ++"Allow executing the command and downloading its output without prior " ++"authentication" ++msgstr "" ++ ++msgid "Allow the user to provide additional command line arguments" ++msgstr "コマンドラインã«å¯¾ã™ã‚‹å¼•æ•°ã®è¿½è¨˜ã‚’許å¯ã™ã‚‹ã‹è¨­å®šã—ã¾ã™" ++ ++msgid "Arguments:" ++msgstr "引数:" ++ ++msgid "Binary data not displayed, download instead." ++msgstr "ãƒã‚¤ãƒŠãƒªãƒ‡ãƒ¼ã‚¿ã¯è¡¨ç¤ºã•ã‚Œãšã«ãƒ€ã‚¦ãƒ³ãƒ­ãƒ¼ãƒ‰ã•ã‚Œã¾ã™ã€‚" ++ ++msgid "Code:" ++msgstr "コード:" ++ ++msgid "Collecting data..." ++msgstr "データåŽé›†ä¸­ã§ã™..." ++ ++msgid "Command" ++msgstr "コマンド" ++ ++msgid "Command failed" ++msgstr "コマンド失敗" ++ ++msgid "Command line to execute" ++msgstr "実行ã™ã‚‹ã‚³ãƒžãƒ³ãƒ‰ãƒ©ã‚¤ãƒ³ã‚’記載ã—ã¾ã™" ++ ++msgid "Command successful" ++msgstr "コマンドæˆåŠŸ" ++ ++msgid "Command:" ++msgstr "コマンド:" ++ ++msgid "Configure" ++msgstr "設定" ++ ++msgid "Custom Commands" ++msgstr "カスタムコマンド" ++ ++msgid "Custom arguments" ++msgstr "カスタム引数" ++ ++msgid "Dashboard" ++msgstr "ダッシュボード" ++ ++msgid "Description" ++msgstr "説明" ++ ++msgid "Download" ++msgstr "ダウンロード" ++ ++msgid "Failed to execute command!" ++msgstr "コマンドã®å®Ÿè¡Œã«å¤±æ•—ã—ã¾ã—ãŸ!" ++ ++msgid "Link" ++msgstr "リンク" ++ ++msgid "Loading" ++msgstr "読ã¿è¾¼ã¿ä¸­" ++ ++msgid "Public access" ++msgstr "パブリック・アクセス" ++ ++msgid "Run" ++msgstr "実行" ++ ++msgid "" ++"This page allows you to configure custom shell commands which can be easily " ++"invoked from the web interface." ++msgstr "ã“ã®ãƒšãƒ¼ã‚¸ã§ã¯ã€ã‚¦ã‚§ãƒ–インターフェースã‹ã‚‰ç°¡å˜ã«ã‚·ã‚§ãƒ«ãƒ»ã‚³ãƒžãƒ³ãƒ‰ã‚’実行ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚" ++ ++msgid "Waiting for command to complete..." ++msgstr "コマンド実行中ã§ã™..." +diff --git a/feeds/luci/applications/luci-app-commands/po/ms/commands.po b/feeds/luci/applications/luci-app-commands/po/ms/commands.po +new file mode 100644 +index 0000000..6fbb983 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-commands/po/ms/commands.po +@@ -0,0 +1,90 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Last-Translator: Automatically generated\n" ++"Language-Team: none\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++ ++msgid "A short textual description of the configured command" ++msgstr "" ++ ++msgid "Access command with" ++msgstr "" ++ ++msgid "" ++"Allow executing the command and downloading its output without prior " ++"authentication" ++msgstr "" ++ ++msgid "Allow the user to provide additional command line arguments" ++msgstr "" ++ ++msgid "Arguments:" ++msgstr "" ++ ++msgid "Binary data not displayed, download instead." ++msgstr "" ++ ++msgid "Code:" ++msgstr "" ++ ++msgid "Collecting data..." ++msgstr "" ++ ++msgid "Command" ++msgstr "" ++ ++msgid "Command failed" ++msgstr "" ++ ++msgid "Command line to execute" ++msgstr "" ++ ++msgid "Command successful" ++msgstr "" ++ ++msgid "Command:" ++msgstr "" ++ ++msgid "Configure" ++msgstr "" ++ ++msgid "Custom Commands" ++msgstr "" ++ ++msgid "Custom arguments" ++msgstr "" ++ ++msgid "Dashboard" ++msgstr "" ++ ++msgid "Description" ++msgstr "" ++ ++msgid "Download" ++msgstr "" ++ ++msgid "Failed to execute command!" ++msgstr "" ++ ++msgid "Link" ++msgstr "" ++ ++msgid "Loading" ++msgstr "" ++ ++msgid "Public access" ++msgstr "" ++ ++msgid "Run" ++msgstr "" ++ ++msgid "" ++"This page allows you to configure custom shell commands which can be easily " ++"invoked from the web interface." ++msgstr "" ++ ++msgid "Waiting for command to complete..." ++msgstr "" +diff --git a/feeds/luci/applications/luci-app-commands/po/no/commands.po b/feeds/luci/applications/luci-app-commands/po/no/commands.po +new file mode 100644 +index 0000000..29b76e5 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-commands/po/no/commands.po +@@ -0,0 +1,98 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"PO-Revision-Date: 2013-03-25 23:38+0200\n" ++"Last-Translator: protx \n" ++"Language-Team: none\n" ++"Language: no\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n != 1);\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "A short textual description of the configured command" ++msgstr "En kort tekstlig beskrivelse av den konfigurerte kommandoen" ++ ++msgid "Access command with" ++msgstr "Ã…pne kommandoen med" ++ ++msgid "" ++"Allow executing the command and downloading its output without prior " ++"authentication" ++msgstr "" ++"Tillat Ã¥ utføre kommandoen og laste ned resultatet uten forutgÃ¥ende " ++"godkjenning" ++ ++msgid "Allow the user to provide additional command line arguments" ++msgstr "Tillat brukeren Ã¥ gi ytterligere kommandolinjeargumenter" ++ ++msgid "Arguments:" ++msgstr "Argumenter:" ++ ++msgid "Binary data not displayed, download instead." ++msgstr "Binære data vises ikke, last ned i stedet." ++ ++msgid "Code:" ++msgstr "Kode:" ++ ++msgid "Collecting data..." ++msgstr "Henter data..." ++ ++msgid "Command" ++msgstr "Kommando" ++ ++msgid "Command failed" ++msgstr "Kommando feilet" ++ ++msgid "Command line to execute" ++msgstr "Kommandolinje Ã¥ utføre" ++ ++msgid "Command successful" ++msgstr "Kommando vellykket" ++ ++msgid "Command:" ++msgstr "Kommando:" ++ ++msgid "Configure" ++msgstr "Konfigurer" ++ ++msgid "Custom Commands" ++msgstr "Egendefinerte Kommandoer" ++ ++msgid "Custom arguments" ++msgstr "Egendefinerte argumenter" ++ ++msgid "Dashboard" ++msgstr "Dashboard" ++ ++msgid "Description" ++msgstr "Beskrivelse" ++ ++msgid "Download" ++msgstr "Nedlasting" ++ ++msgid "Failed to execute command!" ++msgstr "Kunne ikke utføre kommandoen!" ++ ++msgid "Link" ++msgstr "Link" ++ ++msgid "Loading" ++msgstr "Laster" ++ ++msgid "Public access" ++msgstr "Tilgjengelig for alle" ++ ++msgid "Run" ++msgstr "Kjør" ++ ++msgid "" ++"This page allows you to configure custom shell commands which can be easily " ++"invoked from the web interface." ++msgstr "" ++"Denne siden lar deg konfigurere egendefinerte shell-kommandoer som lett kan " ++"startes fra webgrensesnittet." ++ ++msgid "Waiting for command to complete..." ++msgstr "Venter pÃ¥ at kommandoen fullføres..." +diff --git a/feeds/luci/applications/luci-app-commands/po/pl/commands.po b/feeds/luci/applications/luci-app-commands/po/pl/commands.po +new file mode 100644 +index 0000000..6f660ba +--- /dev/null ++++ b/feeds/luci/applications/luci-app-commands/po/pl/commands.po +@@ -0,0 +1,99 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"PO-Revision-Date: 2014-02-25 18:03+0200\n" ++"Last-Translator: TheTranslator2238 \n" ++"Language-Team: none\n" ++"Language: pl\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 " ++"|| n%100>=20) ? 1 : 2);\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "A short textual description of the configured command" ++msgstr "Krótki opis konfigurowanej komendy" ++ ++msgid "Access command with" ++msgstr "DostÄ™p do komendy przez" ++ ++msgid "" ++"Allow executing the command and downloading its output without prior " ++"authentication" ++msgstr "" ++"Zezwól na uruchomienie komendy i pobranie wyjÅ›cia bez uprzedniego " ++"uwierzytelnienia" ++ ++msgid "Allow the user to provide additional command line arguments" ++msgstr "Pozwól użytkownikowi dodać argumenty wiersza poleceÅ„" ++ ++msgid "Arguments:" ++msgstr "Argumenty:" ++ ++msgid "Binary data not displayed, download instead." ++msgstr "Nie wyÅ›wietlono danych binarnych, możesz je pobrać." ++ ++msgid "Code:" ++msgstr "Kod:" ++ ++msgid "Collecting data..." ++msgstr "Zbieram dane:" ++ ++msgid "Command" ++msgstr "Komenda" ++ ++msgid "Command failed" ++msgstr "ZÅ‚a komenda" ++ ++msgid "Command line to execute" ++msgstr "Linia Komendy do wykonania" ++ ++msgid "Command successful" ++msgstr "Komenda Wykonana" ++ ++msgid "Command:" ++msgstr "Komenda:" ++ ++msgid "Configure" ++msgstr "Konfiguracja" ++ ++msgid "Custom Commands" ++msgstr "WÅ‚asne komendy" ++ ++msgid "Custom arguments" ++msgstr "WÅ‚asne argumenty" ++ ++msgid "Dashboard" ++msgstr "Tablica" ++ ++msgid "Description" ++msgstr "Opis" ++ ++msgid "Download" ++msgstr "Download" ++ ++msgid "Failed to execute command!" ++msgstr "Nie można wykonać komendy!" ++ ++msgid "Link" ++msgstr "ÅÄ…cze" ++ ++msgid "Loading" ++msgstr "Åadowanie" ++ ++msgid "Public access" ++msgstr "Publiczny dostÄ™p" ++ ++msgid "Run" ++msgstr "Uruchom" ++ ++msgid "" ++"This page allows you to configure custom shell commands which can be easily " ++"invoked from the web interface." ++msgstr "" ++"Ta strona pozwala ci skonfigurować niestandardowÄ… komendÄ™ którÄ… można Å‚atwo " ++"użyć z Web Interfejsa" ++ ++msgid "Waiting for command to complete..." ++msgstr "Czekanie na wykonanie komendy..." +diff --git a/feeds/luci/applications/luci-app-commands/po/pt-br/commands.po b/feeds/luci/applications/luci-app-commands/po/pt-br/commands.po +new file mode 100644 +index 0000000..83c7bd5 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-commands/po/pt-br/commands.po +@@ -0,0 +1,98 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"PO-Revision-Date: 2014-03-15 22:02+0200\n" ++"Last-Translator: Luiz Angelo \n" ++"Language-Team: none\n" ++"Language: pt_BR\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n > 1);\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "A short textual description of the configured command" ++msgstr "Uma pequena descrição textual do comando configurado" ++ ++msgid "Access command with" ++msgstr "Acessar o comando com" ++ ++msgid "" ++"Allow executing the command and downloading its output without prior " ++"authentication" ++msgstr "" ++"Permitir a execução do comando e descarregar o resultado sem autenticação " ++"prévia" ++ ++msgid "Allow the user to provide additional command line arguments" ++msgstr "Permitir ao usuário inserir argumentos de linha de comando adicionais" ++ ++msgid "Arguments:" ++msgstr "Argumentos:" ++ ++msgid "Binary data not displayed, download instead." ++msgstr "Dados binários não mostrados, mas podem ser baixados." ++ ++msgid "Code:" ++msgstr "Código:" ++ ++msgid "Collecting data..." ++msgstr "Adquirindo dados..." ++ ++msgid "Command" ++msgstr "Comando" ++ ++msgid "Command failed" ++msgstr "O comando falhou" ++ ++msgid "Command line to execute" ++msgstr "Linha de comandos a executar" ++ ++msgid "Command successful" ++msgstr "Comando executado com sucesso" ++ ++msgid "Command:" ++msgstr "Comando:" ++ ++msgid "Configure" ++msgstr "Configurar" ++ ++msgid "Custom Commands" ++msgstr "Comandos Personalizados" ++ ++msgid "Custom arguments" ++msgstr "Argumentos personalizados" ++ ++msgid "Dashboard" ++msgstr "Painel de Controle" ++ ++msgid "Description" ++msgstr "Descrição" ++ ++msgid "Download" ++msgstr "Baixar" ++ ++msgid "Failed to execute command!" ++msgstr "Falha ao executar comando!" ++ ++msgid "Link" ++msgstr "Endereço" ++ ++msgid "Loading" ++msgstr "Carregando" ++ ++msgid "Public access" ++msgstr "Acesso público" ++ ++msgid "Run" ++msgstr "Executar" ++ ++msgid "" ++"This page allows you to configure custom shell commands which can be easily " ++"invoked from the web interface." ++msgstr "" ++"Esta página permite a configuração de comandos personalizados que podem ser " ++"facilmente executados através da interface web." ++ ++msgid "Waiting for command to complete..." ++msgstr "Aguardando a conclusão do comando..." +diff --git a/feeds/luci/applications/luci-app-commands/po/pt/commands.po b/feeds/luci/applications/luci-app-commands/po/pt/commands.po +new file mode 100644 +index 0000000..a46b7d2 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-commands/po/pt/commands.po +@@ -0,0 +1,99 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"PO-Revision-Date: 2013-06-02 19:17+0200\n" ++"Last-Translator: joao.f.vieira \n" ++"Language-Team: none\n" ++"Language: pt\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n != 1);\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "A short textual description of the configured command" ++msgstr "Uma pequena descrição textual do comando configurado" ++ ++msgid "Access command with" ++msgstr "Aceder ao comando com" ++ ++msgid "" ++"Allow executing the command and downloading its output without prior " ++"authentication" ++msgstr "" ++"Permitir a execução do comando e descarregar o resultado sem autenticação " ++"prévia" ++ ++msgid "Allow the user to provide additional command line arguments" ++msgstr "" ++"Permitir que o utilizador forneça argumentos adicionais na linha de comandos" ++ ++msgid "Arguments:" ++msgstr "Argumentos:" ++ ++msgid "Binary data not displayed, download instead." ++msgstr "Dados binários não mostrados, mas pode descarregar." ++ ++msgid "Code:" ++msgstr "Código:" ++ ++msgid "Collecting data..." ++msgstr "A obter dados..." ++ ++msgid "Command" ++msgstr "Comando" ++ ++msgid "Command failed" ++msgstr "O comando falhou" ++ ++msgid "Command line to execute" ++msgstr "Linha de comandos a executar" ++ ++msgid "Command successful" ++msgstr "Comando executado com sucesso" ++ ++msgid "Command:" ++msgstr "Comando:" ++ ++msgid "Configure" ++msgstr "Configurar" ++ ++msgid "Custom Commands" ++msgstr "Comandos Personalizados" ++ ++msgid "Custom arguments" ++msgstr "Argumentos personalizados" ++ ++msgid "Dashboard" ++msgstr "Painel de Controlo" ++ ++msgid "Description" ++msgstr "Descrição" ++ ++msgid "Download" ++msgstr "Descarregar" ++ ++msgid "Failed to execute command!" ++msgstr "Falha ao executar comando!" ++ ++msgid "Link" ++msgstr "Link" ++ ++msgid "Loading" ++msgstr "A carregar" ++ ++msgid "Public access" ++msgstr "Acesso público" ++ ++msgid "Run" ++msgstr "Executar" ++ ++msgid "" ++"This page allows you to configure custom shell commands which can be easily " ++"invoked from the web interface." ++msgstr "" ++"Esta página permite-lhe configurar uma linha de comandos personalizada que " ++"pode facilmente ser executada a partir da interface web." ++ ++msgid "Waiting for command to complete..." ++msgstr "A aguardar que o comando termine..." +diff --git a/feeds/luci/applications/luci-app-commands/po/ro/commands.po b/feeds/luci/applications/luci-app-commands/po/ro/commands.po +new file mode 100644 +index 0000000..05c4574 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-commands/po/ro/commands.po +@@ -0,0 +1,99 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"PO-Revision-Date: 2014-06-28 18:45+0200\n" ++"Last-Translator: xxvirusxx \n" ++"Language-Team: none\n" ++"Language: ro\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=3; plural=(n==1 ? 0 : (n==0 || (n%100 > 0 && n%100 < " ++"20)) ? 1 : 2);;\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "A short textual description of the configured command" ++msgstr "O scurta descriere textuala a comenzii configurate" ++ ++msgid "Access command with" ++msgstr "Acces la comanda cu" ++ ++msgid "" ++"Allow executing the command and downloading its output without prior " ++"authentication" ++msgstr "" ++"Permite executarea comenzii si descarcarea rezultatului fara o autentificare " ++"anterioara" ++ ++msgid "Allow the user to provide additional command line arguments" ++msgstr "Permite utilizatorului sa adauge parametrii in linia de comanda" ++ ++msgid "Arguments:" ++msgstr "Parametrii:" ++ ++msgid "Binary data not displayed, download instead." ++msgstr "Datele binare nu sunt afisate, descarcale in schimb" ++ ++msgid "Code:" ++msgstr "Cod:" ++ ++msgid "Collecting data..." ++msgstr "Colectare date..." ++ ++msgid "Command" ++msgstr "Comandă" ++ ++msgid "Command failed" ++msgstr "Comandă eÅŸuată" ++ ++msgid "Command line to execute" ++msgstr "Linie de comanda pentru a executa" ++ ++msgid "Command successful" ++msgstr "Comanda reusita" ++ ++msgid "Command:" ++msgstr "Comanda:" ++ ++msgid "Configure" ++msgstr "Configureaza" ++ ++msgid "Custom Commands" ++msgstr "Comenzi particulare" ++ ++msgid "Custom arguments" ++msgstr "Argumenta particulare" ++ ++msgid "Dashboard" ++msgstr "Dashboard" ++ ++msgid "Description" ++msgstr "Descriere" ++ ++msgid "Download" ++msgstr "Descarca" ++ ++msgid "Failed to execute command!" ++msgstr "S-a esuat executarea comenzii!!" ++ ++msgid "Link" ++msgstr "Link" ++ ++msgid "Loading" ++msgstr "Se incarca" ++ ++msgid "Public access" ++msgstr "Access public" ++ ++msgid "Run" ++msgstr "Ruleaza" ++ ++msgid "" ++"This page allows you to configure custom shell commands which can be easily " ++"invoked from the web interface." ++msgstr "" ++"Aceasta pagina permite configurarea de comenzi personale ce pot fi usor " ++"apelate din interfata grafica" ++ ++msgid "Waiting for command to complete..." ++msgstr "Astept finalizarea comenzii..." +diff --git a/feeds/luci/applications/luci-app-commands/po/ru/commands.po b/feeds/luci/applications/luci-app-commands/po/ru/commands.po +new file mode 100644 +index 0000000..6197231 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-commands/po/ru/commands.po +@@ -0,0 +1,102 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"PO-Revision-Date: 2013-10-15 16:48+0200\n" ++"Last-Translator: datasheet \n" ++"Language-Team: none\n" ++"Language: ru\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%" ++"10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "A short textual description of the configured command" ++msgstr "Короткое текÑтовое опиÑание команды" ++ ++msgid "Access command with" ++msgstr "ДоÑтуп к команде через" ++ ++#, fuzzy ++msgid "" ++"Allow executing the command and downloading its output without prior " ++"authentication" ++msgstr "" ++"Разрешить выполнение команды и загрузку ее вывода без предварительной " ++"аутентификации" ++ ++msgid "Allow the user to provide additional command line arguments" ++msgstr "" ++"Разрешить пользователÑм иÑпользовать дополнительные аргументы командной " ++"Ñтроки" ++ ++msgid "Arguments:" ++msgstr "Ðргументы:" ++ ++msgid "Binary data not displayed, download instead." ++msgstr "Двоичные данные не отображаютÑÑ, вмеÑто Ñтого - выгружаютÑÑ" ++ ++msgid "Code:" ++msgstr "Код:" ++ ++msgid "Collecting data..." ++msgstr "Сбор данных..." ++ ++msgid "Command" ++msgstr "Команда" ++ ++msgid "Command failed" ++msgstr "Команда не выполнена" ++ ++msgid "Command line to execute" ++msgstr "ÐšÐ¾Ð¼Ð°Ð½Ð´Ð½Ð°Ñ Ñтрока Ð´Ð»Ñ Ð²Ñ‹Ð¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ" ++ ++msgid "Command successful" ++msgstr "Команда выполнена" ++ ++msgid "Command:" ++msgstr "Команда:" ++ ++msgid "Configure" ++msgstr "ÐаÑтроить" ++ ++msgid "Custom Commands" ++msgstr "ПользовательÑкие команды" ++ ++msgid "Custom arguments" ++msgstr "ПользовательÑкие аргументы" ++ ++msgid "Dashboard" ++msgstr "Ð˜Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ð¾Ð½Ð½Ð°Ñ Ð¿Ð°Ð½ÐµÐ»ÑŒ" ++ ++msgid "Description" ++msgstr "ОпиÑание" ++ ++msgid "Download" ++msgstr "Скачать" ++ ++msgid "Failed to execute command!" ++msgstr "Ошибка Ð²Ñ‹Ð¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ‹!" ++ ++msgid "Link" ++msgstr "СÑылка" ++ ++msgid "Loading" ++msgstr "Загрузка" ++ ++msgid "Public access" ++msgstr "Публичный доÑтуп" ++ ++msgid "Run" ++msgstr "ЗапуÑк" ++ ++msgid "" ++"This page allows you to configure custom shell commands which can be easily " ++"invoked from the web interface." ++msgstr "" ++"Эта Ñтраница предоÑтавлÑет возможноÑÑ‚ÑŒ наÑтраивать пользовательÑкие " ++"конÑольные команды, которые могут быть легко вызваны из веб-интерфейÑа" ++ ++msgid "Waiting for command to complete..." ++msgstr "Ожидание Ð·Ð°Ð²ÐµÑ€ÑˆÐµÐ½Ð¸Ñ ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ‹..." +diff --git a/feeds/luci/applications/luci-app-commands/po/sk/commands.po b/feeds/luci/applications/luci-app-commands/po/sk/commands.po +new file mode 100644 +index 0000000..4133dfb +--- /dev/null ++++ b/feeds/luci/applications/luci-app-commands/po/sk/commands.po +@@ -0,0 +1,91 @@ ++msgid "" ++msgstr "" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Last-Translator: Automatically generated\n" ++"Language-Team: none\n" ++"MIME-Version: 1.0\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n" ++ ++msgid "A short textual description of the configured command" ++msgstr "" ++ ++msgid "Access command with" ++msgstr "" ++ ++msgid "" ++"Allow executing the command and downloading its output without prior " ++"authentication" ++msgstr "" ++ ++msgid "Allow the user to provide additional command line arguments" ++msgstr "" ++ ++msgid "Arguments:" ++msgstr "" ++ ++msgid "Binary data not displayed, download instead." ++msgstr "" ++ ++msgid "Code:" ++msgstr "" ++ ++msgid "Collecting data..." ++msgstr "" ++ ++msgid "Command" ++msgstr "" ++ ++msgid "Command failed" ++msgstr "" ++ ++msgid "Command line to execute" ++msgstr "" ++ ++msgid "Command successful" ++msgstr "" ++ ++msgid "Command:" ++msgstr "" ++ ++msgid "Configure" ++msgstr "" ++ ++msgid "Custom Commands" ++msgstr "" ++ ++msgid "Custom arguments" ++msgstr "" ++ ++msgid "Dashboard" ++msgstr "" ++ ++msgid "Description" ++msgstr "" ++ ++msgid "Download" ++msgstr "" ++ ++msgid "Failed to execute command!" ++msgstr "" ++ ++msgid "Link" ++msgstr "" ++ ++msgid "Loading" ++msgstr "" ++ ++msgid "Public access" ++msgstr "" ++ ++msgid "Run" ++msgstr "" ++ ++msgid "" ++"This page allows you to configure custom shell commands which can be easily " ++"invoked from the web interface." ++msgstr "" ++ ++msgid "Waiting for command to complete..." ++msgstr "" +diff --git a/feeds/luci/applications/luci-app-commands/po/sv/commands.po b/feeds/luci/applications/luci-app-commands/po/sv/commands.po +new file mode 100644 +index 0000000..9fbe0af +--- /dev/null ++++ b/feeds/luci/applications/luci-app-commands/po/sv/commands.po +@@ -0,0 +1,92 @@ ++msgid "" ++msgstr "" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Last-Translator: Automatically generated\n" ++"Language-Team: none\n" ++"Language: sv\n" ++"MIME-Version: 1.0\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n != 1);\n" ++ ++msgid "A short textual description of the configured command" ++msgstr "" ++ ++msgid "Access command with" ++msgstr "" ++ ++msgid "" ++"Allow executing the command and downloading its output without prior " ++"authentication" ++msgstr "" ++ ++msgid "Allow the user to provide additional command line arguments" ++msgstr "" ++ ++msgid "Arguments:" ++msgstr "" ++ ++msgid "Binary data not displayed, download instead." ++msgstr "" ++ ++msgid "Code:" ++msgstr "" ++ ++msgid "Collecting data..." ++msgstr "" ++ ++msgid "Command" ++msgstr "" ++ ++msgid "Command failed" ++msgstr "" ++ ++msgid "Command line to execute" ++msgstr "" ++ ++msgid "Command successful" ++msgstr "" ++ ++msgid "Command:" ++msgstr "" ++ ++msgid "Configure" ++msgstr "" ++ ++msgid "Custom Commands" ++msgstr "" ++ ++msgid "Custom arguments" ++msgstr "" ++ ++msgid "Dashboard" ++msgstr "" ++ ++msgid "Description" ++msgstr "" ++ ++msgid "Download" ++msgstr "" ++ ++msgid "Failed to execute command!" ++msgstr "" ++ ++msgid "Link" ++msgstr "" ++ ++msgid "Loading" ++msgstr "" ++ ++msgid "Public access" ++msgstr "" ++ ++msgid "Run" ++msgstr "" ++ ++msgid "" ++"This page allows you to configure custom shell commands which can be easily " ++"invoked from the web interface." ++msgstr "" ++ ++msgid "Waiting for command to complete..." ++msgstr "" +diff --git a/feeds/luci/applications/luci-app-commands/po/templates/commands.pot b/feeds/luci/applications/luci-app-commands/po/templates/commands.pot +new file mode 100644 +index 0000000..5d2ffae +--- /dev/null ++++ b/feeds/luci/applications/luci-app-commands/po/templates/commands.pot +@@ -0,0 +1,84 @@ ++msgid "" ++msgstr "Content-Type: text/plain; charset=UTF-8" ++ ++msgid "A short textual description of the configured command" ++msgstr "" ++ ++msgid "Access command with" ++msgstr "" ++ ++msgid "" ++"Allow executing the command and downloading its output without prior " ++"authentication" ++msgstr "" ++ ++msgid "Allow the user to provide additional command line arguments" ++msgstr "" ++ ++msgid "Arguments:" ++msgstr "" ++ ++msgid "Binary data not displayed, download instead." ++msgstr "" ++ ++msgid "Code:" ++msgstr "" ++ ++msgid "Collecting data..." ++msgstr "" ++ ++msgid "Command" ++msgstr "" ++ ++msgid "Command failed" ++msgstr "" ++ ++msgid "Command line to execute" ++msgstr "" ++ ++msgid "Command successful" ++msgstr "" ++ ++msgid "Command:" ++msgstr "" ++ ++msgid "Configure" ++msgstr "" ++ ++msgid "Custom Commands" ++msgstr "" ++ ++msgid "Custom arguments" ++msgstr "" ++ ++msgid "Dashboard" ++msgstr "" ++ ++msgid "Description" ++msgstr "" ++ ++msgid "Download" ++msgstr "" ++ ++msgid "Failed to execute command!" ++msgstr "" ++ ++msgid "Link" ++msgstr "" ++ ++msgid "Loading" ++msgstr "" ++ ++msgid "Public access" ++msgstr "" ++ ++msgid "Run" ++msgstr "" ++ ++msgid "" ++"This page allows you to configure custom shell commands which can be easily " ++"invoked from the web interface." ++msgstr "" ++ ++msgid "Waiting for command to complete..." ++msgstr "" +diff --git a/feeds/luci/applications/luci-app-commands/po/tr/commands.po b/feeds/luci/applications/luci-app-commands/po/tr/commands.po +new file mode 100644 +index 0000000..4132274 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-commands/po/tr/commands.po +@@ -0,0 +1,91 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Last-Translator: Automatically generated\n" ++"Language-Team: none\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=1; plural=0;\n" ++ ++msgid "A short textual description of the configured command" ++msgstr "" ++ ++msgid "Access command with" ++msgstr "" ++ ++msgid "" ++"Allow executing the command and downloading its output without prior " ++"authentication" ++msgstr "" ++ ++msgid "Allow the user to provide additional command line arguments" ++msgstr "" ++ ++msgid "Arguments:" ++msgstr "" ++ ++msgid "Binary data not displayed, download instead." ++msgstr "" ++ ++msgid "Code:" ++msgstr "" ++ ++msgid "Collecting data..." ++msgstr "" ++ ++msgid "Command" ++msgstr "" ++ ++msgid "Command failed" ++msgstr "" ++ ++msgid "Command line to execute" ++msgstr "" ++ ++msgid "Command successful" ++msgstr "" ++ ++msgid "Command:" ++msgstr "" ++ ++msgid "Configure" ++msgstr "" ++ ++msgid "Custom Commands" ++msgstr "" ++ ++msgid "Custom arguments" ++msgstr "" ++ ++msgid "Dashboard" ++msgstr "" ++ ++msgid "Description" ++msgstr "" ++ ++msgid "Download" ++msgstr "" ++ ++msgid "Failed to execute command!" ++msgstr "" ++ ++msgid "Link" ++msgstr "" ++ ++msgid "Loading" ++msgstr "" ++ ++msgid "Public access" ++msgstr "" ++ ++msgid "Run" ++msgstr "" ++ ++msgid "" ++"This page allows you to configure custom shell commands which can be easily " ++"invoked from the web interface." ++msgstr "" ++ ++msgid "Waiting for command to complete..." ++msgstr "" +diff --git a/feeds/luci/applications/luci-app-commands/po/uk/commands.po b/feeds/luci/applications/luci-app-commands/po/uk/commands.po +new file mode 100644 +index 0000000..74a19f3 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-commands/po/uk/commands.po +@@ -0,0 +1,103 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"PO-Revision-Date: 2013-08-14 12:14+0200\n" ++"Last-Translator: zubr_139 \n" ++"Language-Team: none\n" ++"Language: uk\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%" ++"10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++#, fuzzy ++msgid "A short textual description of the configured command" ++msgstr "Короткий Ð¾Ð¿Ð¸Ñ ÐºÐ¾Ð¼Ð°Ð½Ð´ налаштуваннÑ" ++ ++msgid "Access command with" ++msgstr "" ++ ++msgid "" ++"Allow executing the command and downloading its output without prior " ++"authentication" ++msgstr "" ++ ++msgid "Allow the user to provide additional command line arguments" ++msgstr "" ++ ++#, fuzzy ++msgid "Arguments:" ++msgstr "Ðргументи:" ++ ++msgid "Binary data not displayed, download instead." ++msgstr "" ++ ++msgid "Code:" ++msgstr "Код:" ++ ++msgid "Collecting data..." ++msgstr "Ð—Ð±Ð¸Ñ€Ð°Ð½Ð½Ñ Ð´Ð°Ð½Ð¸Ñ…..." ++ ++msgid "Command" ++msgstr "" ++ ++msgid "Command failed" ++msgstr "Команда не виконана" ++ ++msgid "Command line to execute" ++msgstr "" ++ ++msgid "Command successful" ++msgstr "" ++ ++msgid "Command:" ++msgstr "" ++ ++msgid "Configure" ++msgstr "КонфігураціÑ" ++ ++msgid "Custom Commands" ++msgstr "" ++ ++msgid "Custom arguments" ++msgstr "" ++ ++#, fuzzy ++msgid "Dashboard" ++msgstr "Панель керуваннÑ" ++ ++msgid "Description" ++msgstr "ОпиÑ" ++ ++msgid "Download" ++msgstr "Завантажити" ++ ++#, fuzzy ++msgid "Failed to execute command!" ++msgstr "Помилка під Ñ‡Ð°Ñ Ð·Ð°Ð¿ÑƒÑку команди!" ++ ++msgid "Link" ++msgstr "" ++ ++msgid "Loading" ++msgstr "Триває завантаженнÑ" ++ ++msgid "Public access" ++msgstr "Відкритий доÑтуп" ++ ++msgid "Run" ++msgstr "ЗапуÑтити" ++ ++#, fuzzy ++msgid "" ++"This page allows you to configure custom shell commands which can be easily " ++"invoked from the web interface." ++msgstr "" ++"Ð¦Ñ Ñторінка дозволÑÑ” налаштувати кориÑтувацькі команди оболонки, Ñка може " ++"бути легко запущена з веб-інтерфейÑу." ++ ++#, fuzzy ++msgid "Waiting for command to complete..." ++msgstr "ÐžÑ‡Ñ–ÐºÑƒÐ²Ð°Ð½Ð½Ñ Ð·Ð°Ð²ÐµÑ€ÑˆÐµÐ½Ð½Ñ ÐºÐ¾Ð¼Ð°Ð½Ð´Ð¸..." +diff --git a/feeds/luci/applications/luci-app-commands/po/vi/commands.po b/feeds/luci/applications/luci-app-commands/po/vi/commands.po +new file mode 100644 +index 0000000..4132274 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-commands/po/vi/commands.po +@@ -0,0 +1,91 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Last-Translator: Automatically generated\n" ++"Language-Team: none\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=1; plural=0;\n" ++ ++msgid "A short textual description of the configured command" ++msgstr "" ++ ++msgid "Access command with" ++msgstr "" ++ ++msgid "" ++"Allow executing the command and downloading its output without prior " ++"authentication" ++msgstr "" ++ ++msgid "Allow the user to provide additional command line arguments" ++msgstr "" ++ ++msgid "Arguments:" ++msgstr "" ++ ++msgid "Binary data not displayed, download instead." ++msgstr "" ++ ++msgid "Code:" ++msgstr "" ++ ++msgid "Collecting data..." ++msgstr "" ++ ++msgid "Command" ++msgstr "" ++ ++msgid "Command failed" ++msgstr "" ++ ++msgid "Command line to execute" ++msgstr "" ++ ++msgid "Command successful" ++msgstr "" ++ ++msgid "Command:" ++msgstr "" ++ ++msgid "Configure" ++msgstr "" ++ ++msgid "Custom Commands" ++msgstr "" ++ ++msgid "Custom arguments" ++msgstr "" ++ ++msgid "Dashboard" ++msgstr "" ++ ++msgid "Description" ++msgstr "" ++ ++msgid "Download" ++msgstr "" ++ ++msgid "Failed to execute command!" ++msgstr "" ++ ++msgid "Link" ++msgstr "" ++ ++msgid "Loading" ++msgstr "" ++ ++msgid "Public access" ++msgstr "" ++ ++msgid "Run" ++msgstr "" ++ ++msgid "" ++"This page allows you to configure custom shell commands which can be easily " ++"invoked from the web interface." ++msgstr "" ++ ++msgid "Waiting for command to complete..." ++msgstr "" +diff --git a/feeds/luci/applications/luci-app-commands/po/zh-cn/commands.po b/feeds/luci/applications/luci-app-commands/po/zh-cn/commands.po +new file mode 100644 +index 0000000..8b2b032 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-commands/po/zh-cn/commands.po +@@ -0,0 +1,94 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"PO-Revision-Date: 2013-10-08 15:47+0200\n" ++"Last-Translator: Tanyingyu \n" ++"Language-Team: none\n" ++"Language: zh_CN\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=1; plural=0;\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "A short textual description of the configured command" ++msgstr "简短æ述命令用途" ++ ++msgid "Access command with" ++msgstr "访问命令" ++ ++msgid "" ++"Allow executing the command and downloading its output without prior " ++"authentication" ++msgstr "å…许在ä¸è®¤è¯çš„å‰æ下执行命令,并获å–其输出。" ++ ++msgid "Allow the user to provide additional command line arguments" ++msgstr "å…许用户æä¾›é¢å¤–的命令行å‚æ•°" ++ ++msgid "Arguments:" ++msgstr "å‚数:" ++ ++msgid "Binary data not displayed, download instead." ++msgstr "ä¸æ˜¾ç¤ºäºŒè¿›åˆ¶æ•°æ®ï¼Œä½¿ç”¨ä¸‹è½½æ–¹å¼æ›¿ä»£ã€‚" ++ ++msgid "Code:" ++msgstr "代ç ï¼š" ++ ++msgid "Collecting data..." ++msgstr "收集数æ®ï¼š" ++ ++msgid "Command" ++msgstr "命令" ++ ++msgid "Command failed" ++msgstr "执行命令失败" ++ ++msgid "Command line to execute" ++msgstr "执行命令行" ++ ++msgid "Command successful" ++msgstr "执行命令æˆåŠŸ" ++ ++msgid "Command:" ++msgstr "命令:" ++ ++msgid "Configure" ++msgstr "é…ç½®" ++ ++msgid "Custom Commands" ++msgstr "自定义命令" ++ ++msgid "Custom arguments" ++msgstr "自定义å‚æ•°" ++ ++msgid "Dashboard" ++msgstr "看æ¿" ++ ++msgid "Description" ++msgstr "æè¿°" ++ ++msgid "Download" ++msgstr "下载" ++ ++msgid "Failed to execute command!" ++msgstr "执行命令失败ï¼" ++ ++msgid "Link" ++msgstr "连接" ++ ++msgid "Loading" ++msgstr "加载中" ++ ++msgid "Public access" ++msgstr "公共访问" ++ ++msgid "Run" ++msgstr "è¿è¡Œ" ++ ++msgid "" ++"This page allows you to configure custom shell commands which can be easily " ++"invoked from the web interface." ++msgstr "此页é¢å…许您é…置自定义Shell命令,并å¯ä»¥ä»ŽWebç•Œé¢è°ƒç”¨shell命令。" ++ ++msgid "Waiting for command to complete..." ++msgstr "等待命令执行完æˆ... ..." +diff --git a/feeds/luci/applications/luci-app-commands/po/zh-tw/commands.po b/feeds/luci/applications/luci-app-commands/po/zh-tw/commands.po +new file mode 100644 +index 0000000..4377ead +--- /dev/null ++++ b/feeds/luci/applications/luci-app-commands/po/zh-tw/commands.po +@@ -0,0 +1,94 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"PO-Revision-Date: 2014-05-18 19:59+0200\n" ++"Last-Translator: omnistack \n" ++"Language-Team: none\n" ++"Language: zh_TW\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=1; plural=0;\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "A short textual description of the configured command" ++msgstr "以短文æ述設定指令" ++ ++msgid "Access command with" ++msgstr "å­˜å–指令" ++ ++msgid "" ++"Allow executing the command and downloading its output without prior " ++"authentication" ++msgstr "å…許執行這指令åŠä¸‹è¼‰å®ƒçš„輸出無須事先驗證" ++ ++msgid "Allow the user to provide additional command line arguments" ++msgstr "å…許用戶æä¾›é¡å¤–的指令行åƒæ•¸" ++ ++msgid "Arguments:" ++msgstr "åƒæ•¸:" ++ ++msgid "Binary data not displayed, download instead." ++msgstr "二進進資料未顯示, 以下載替代." ++ ++msgid "Code:" ++msgstr "碼:" ++ ++msgid "Collecting data..." ++msgstr "收集資料中..." ++ ++msgid "Command" ++msgstr "指令" ++ ++msgid "Command failed" ++msgstr "命令失敗" ++ ++msgid "Command line to execute" ++msgstr "è¦åŸ·è¡Œçš„指令行" ++ ++msgid "Command successful" ++msgstr "命令æˆåŠŸ" ++ ++msgid "Command:" ++msgstr "命令:" ++ ++msgid "Configure" ++msgstr "設定" ++ ++msgid "Custom Commands" ++msgstr "自訂指令集" ++ ++msgid "Custom arguments" ++msgstr "自訂åƒæ•¸é›†" ++ ++msgid "Dashboard" ++msgstr "儀表æ¿" ++ ++msgid "Description" ++msgstr "æè¿°" ++ ++msgid "Download" ++msgstr "下載" ++ ++msgid "Failed to execute command!" ++msgstr "執行指令失敗!" ++ ++msgid "Link" ++msgstr "連çµ" ++ ++msgid "Loading" ++msgstr "掛載" ++ ++msgid "Public access" ++msgstr "公用存å–" ++ ++msgid "Run" ++msgstr "執行" ++ ++msgid "" ++"This page allows you to configure custom shell commands which can be easily " ++"invoked from the web interface." ++msgstr "åªè¦å¯ä»¥å¾žweb介輕易調用, 這é é¢å…許你自定shell指令." ++ ++msgid "Waiting for command to complete..." ++msgstr "等待完整命令中..." +diff --git a/feeds/luci/applications/luci-app-coovachilli/Makefile b/feeds/luci/applications/luci-app-coovachilli/Makefile +new file mode 100644 +index 0000000..6120991 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-coovachilli/Makefile +@@ -0,0 +1,14 @@ ++# ++# Copyright (C) 2008-2014 The LuCI Team ++# ++# This is free software, licensed under the Apache License, Version 2.0 . ++# ++ ++include $(TOPDIR)/rules.mk ++ ++LUCI_TITLE:=LuCI Support for Coova Chilli ++LUCI_DEPENDS:=@BROKEN ++ ++include ../../luci.mk ++ ++# call BuildPackage - OpenWrt buildroot signature +diff --git a/feeds/luci/applications/luci-app-coovachilli/luasrc/controller/coovachilli.lua b/feeds/luci/applications/luci-app-coovachilli/luasrc/controller/coovachilli.lua +new file mode 100644 +index 0000000..f962b9b +--- /dev/null ++++ b/feeds/luci/applications/luci-app-coovachilli/luasrc/controller/coovachilli.lua +@@ -0,0 +1,15 @@ ++-- Copyright 2008 Steven Barth ++-- Licensed to the public under the Apache License 2.0. ++ ++module("luci.controller.coovachilli", package.seeall) ++ ++function index() ++ local cc ++ ++ cc = entry( { "admin", "services", "coovachilli" }, cbi("coovachilli"), _("CoovaChilli"), 90) ++ cc.subindex = true ++ ++ entry( { "admin", "services", "coovachilli", "network" }, cbi("coovachilli_network"), _("Network Configuration"), 10) ++ entry( { "admin", "services", "coovachilli", "radius" }, cbi("coovachilli_radius"), _("RADIUS configuration"), 20) ++ entry( { "admin", "services", "coovachilli", "auth" }, cbi("coovachilli_auth"), _("UAM and MAC Authentication"), 30) ++end +diff --git a/feeds/luci/applications/luci-app-coovachilli/luasrc/model/cbi/coovachilli.lua b/feeds/luci/applications/luci-app-coovachilli/luasrc/model/cbi/coovachilli.lua +new file mode 100644 +index 0000000..7a2056c +--- /dev/null ++++ b/feeds/luci/applications/luci-app-coovachilli/luasrc/model/cbi/coovachilli.lua +@@ -0,0 +1,19 @@ ++-- Copyright 2008 Steven Barth ++-- Copyright 2008 Jo-Philipp Wich ++-- Licensed to the public under the Apache License 2.0. ++ ++m = Map("coovachilli") ++ ++-- general ++s = m:section(TypedSection, "general") ++s.anonymous = true ++ ++s:option( Flag, "debug" ) ++s:option( Value, "interval" ) ++s:option( Value, "pidfile" ).optional = true ++s:option( Value, "statedir" ).optional = true ++s:option( Value, "cmdsock" ).optional = true ++s:option( Value, "logfacility" ).optional = true ++ ++ ++return m +diff --git a/feeds/luci/applications/luci-app-coovachilli/luasrc/model/cbi/coovachilli_auth.lua b/feeds/luci/applications/luci-app-coovachilli/luasrc/model/cbi/coovachilli_auth.lua +new file mode 100644 +index 0000000..4123532 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-coovachilli/luasrc/model/cbi/coovachilli_auth.lua +@@ -0,0 +1,64 @@ ++-- Copyright 2008 Steven Barth ++-- Copyright 2008 Jo-Philipp Wich ++-- Licensed to the public under the Apache License 2.0. ++ ++m = Map("coovachilli") ++ ++-- uam config ++s1 = m:section(TypedSection, "uam") ++s1.anonymous = true ++ ++s1:option( Value, "uamserver" ) ++s1:option( Value, "uamsecret" ).password = true ++ ++s1:option( Flag, "uamanydns" ) ++s1:option( Flag, "nouamsuccess" ) ++s1:option( Flag, "nouamwispr" ) ++s1:option( Flag, "chillixml" ) ++s1:option( Flag, "uamanyip" ).optional = true ++s1:option( Flag, "dnsparanoia" ).optional = true ++s1:option( Flag, "usestatusfile" ).optional = true ++ ++s1:option( Value, "uamhomepage" ).optional = true ++s1:option( Value, "uamlisten" ).optional = true ++s1:option( Value, "uamport" ).optional = true ++s1:option( Value, "uamiport" ).optional = true ++s1:option( DynamicList, "uamdomain" ).optional = true ++s1:option( Value, "uamlogoutip" ).optional = true ++s1:option( DynamicList, "uamallowed" ).optional = true ++s1:option( Value, "uamui" ).optional = true ++ ++s1:option( Value, "wisprlogin" ).optional = true ++ ++s1:option( Value, "defsessiontimeout" ).optional = true ++s1:option( Value, "defidletimeout" ).optional = true ++s1:option( Value, "definteriminterval" ).optional = true ++ ++s1:option( Value, "ssid" ).optional = true ++s1:option( Value, "vlan" ).optional = true ++s1:option( Value, "nasip" ).optional = true ++s1:option( Value, "nasmac" ).optional = true ++s1:option( Value, "wwwdir" ).optional = true ++s1:option( Value, "wwwbin" ).optional = true ++ ++s1:option( Value, "localusers" ).optional = true ++s1:option( Value, "postauthproxy" ).optional = true ++s1:option( Value, "postauthproxyport" ).optional = true ++s1:option( Value, "locationname" ).optional = true ++ ++ ++-- mac authentication ++s2 = m:section(TypedSection, "macauth") ++s2.anonymous = true ++ ++s2:option( Flag, "macauth" ) ++s2:option( Flag, "macallowlocal" ) ++s2:option( DynamicList, "macallowed" ) ++ ++pw = s2:option( Value, "macpasswd" ) ++pw.optional = true ++pw.password = true ++ ++s2:option( Value, "macsuffix" ).optional = true ++ ++return m +diff --git a/feeds/luci/applications/luci-app-coovachilli/luasrc/model/cbi/coovachilli_network.lua b/feeds/luci/applications/luci-app-coovachilli/luasrc/model/cbi/coovachilli_network.lua +new file mode 100644 +index 0000000..025bc17 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-coovachilli/luasrc/model/cbi/coovachilli_network.lua +@@ -0,0 +1,56 @@ ++-- Copyright 2008 Steven Barth ++-- Copyright 2008 Jo-Philipp Wich ++-- Licensed to the public under the Apache License 2.0. ++ ++local sys = require"luci.sys" ++local ip = require "luci.ip" ++ ++m = Map("coovachilli") ++ ++-- tun ++s1 = m:section(TypedSection, "tun") ++s1.anonymous = true ++ ++s1:option( Flag, "usetap" ) ++s1:option( Value, "tundev" ).optional = true ++s1:option( Value, "txqlen" ).optional = true ++ ++net = s1:option( Value, "net" ) ++for _, route in ipairs(ip.routes({ family = 4, type = 1 })) do ++ if route.dest:prefix() > 0 and route.dest:prefix() < 32 then ++ net:value( route.dest:string() ) ++ end ++end ++ ++s1:option( Value, "dynip" ).optional = true ++s1:option( Value, "statip" ).optional = true ++ ++s1:option( Value, "dns1" ).optional = true ++s1:option( Value, "dns2" ).optional = true ++s1:option( Value, "domain" ).optional = true ++ ++s1:option( Value, "ipup" ).optional = true ++s1:option( Value, "ipdown" ).optional = true ++ ++s1:option( Value, "conup" ).optional = true ++s1:option( Value, "condown" ).optional = true ++ ++ ++-- dhcp config ++s2 = m:section(TypedSection, "dhcp") ++s2.anonymous = true ++ ++dif = s2:option( Value, "dhcpif" ) ++for _, nif in ipairs(sys.net.devices()) do ++ if nif ~= "lo" then dif:value(nif) end ++end ++ ++s2:option( Value, "dhcpmac" ).optional = true ++s2:option( Value, "lease" ).optional = true ++s2:option( Value, "dhcpstart" ).optional = true ++s2:option( Value, "dhcpend" ).optional = true ++ ++s2:option( Flag, "eapolenable" ) ++ ++ ++return m +diff --git a/feeds/luci/applications/luci-app-coovachilli/luasrc/model/cbi/coovachilli_radius.lua b/feeds/luci/applications/luci-app-coovachilli/luasrc/model/cbi/coovachilli_radius.lua +new file mode 100644 +index 0000000..e2cbe49 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-coovachilli/luasrc/model/cbi/coovachilli_radius.lua +@@ -0,0 +1,55 @@ ++-- Copyright 2008 Steven Barth ++-- Copyright 2008 Jo-Philipp Wich ++-- Licensed to the public under the Apache License 2.0. ++ ++m = Map("coovachilli") ++ ++-- radius server ++s1 = m:section(TypedSection, "radius") ++s1.anonymous = true ++ ++s1:option( Value, "radiusserver1" ) ++s1:option( Value, "radiusserver2" ) ++s1:option( Value, "radiussecret" ).password = true ++ ++s1:option( Value, "radiuslisten" ).optional = true ++s1:option( Value, "radiusauthport" ).optional = true ++s1:option( Value, "radiusacctport" ).optional = true ++ ++s1:option( Value, "radiusnasid" ).optional = true ++s1:option( Value, "radiusnasip" ).optional = true ++ ++s1:option( Value, "radiuscalled" ).optional = true ++s1:option( Value, "radiuslocationid" ).optional = true ++s1:option( Value, "radiuslocationname" ).optional = true ++ ++s1:option( Value, "radiusnasporttype" ).optional = true ++ ++s1:option( Flag, "radiusoriginalurl" ) ++ ++s1:option( Value, "adminuser" ).optional = true ++rs = s1:option( Value, "adminpassword" ) ++rs.optional = true ++rs.password = true ++ ++s1:option( Flag, "swapoctets" ) ++s1:option( Flag, "openidauth" ) ++s1:option( Flag, "wpaguests" ) ++s1:option( Flag, "acctupdate" ) ++ ++s1:option( Value, "coaport" ).optional = true ++s1:option( Flag, "coanoipcheck" ) ++ ++ ++-- radius proxy ++s2 = m:section(TypedSection, "proxy") ++s2.anonymous = true ++ ++s2:option( Value, "proxylisten" ).optional = true ++s2:option( Value, "proxyport" ).optional = true ++s2:option( Value, "proxyclient" ).optional = true ++ps = s2:option( Value, "proxysecret" ) ++ps.optional = true ++ps.password = true ++ ++return m +diff --git a/feeds/luci/applications/luci-app-coovachilli/po/ca/coovachilli.po b/feeds/luci/applications/luci-app-coovachilli/po/ca/coovachilli.po +new file mode 100644 +index 0000000..085d991 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-coovachilli/po/ca/coovachilli.po +@@ -0,0 +1,655 @@ ++# coovachilli.pot ++# generated from ./applications/luci-coovachilli/luasrc/i18n/coovachilli.en.lua ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Report-Msgid-Bugs-To: \n" ++"POT-Creation-Date: 2009-06-10 03:40+0200\n" ++"PO-Revision-Date: 2014-06-01 22:48+0200\n" ++"Last-Translator: Alex \n" ++"Language-Team: LANGUAGE \n" ++"Language: ca\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n != 1);\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "CoovaChilli" ++msgstr "CoovaChilli" ++ ++msgid "Network Configuration" ++msgstr "Configuració de xarxa" ++ ++msgid "RADIUS configuration" ++msgstr "Configuració RADIUS" ++ ++msgid "UAM and MAC Authentication" ++msgstr "Autenticació UAM i MAC" ++ ++#~ msgid "General configuration" ++#~ msgstr "Configuració general" ++ ++#~ msgid "General CoovaChilli settings" ++#~ msgstr "Configuració CoovaChilli general" ++ ++#~ msgid "Command socket" ++#~ msgstr "Socket de comanda" ++ ++#~ msgid "UNIX socket used for communication with chilli_query" ++#~ msgstr "SocketUNIX usat per comunicació amb chilli_query" ++ ++#~ msgid "Config refresh interval" ++#~ msgstr "Configuració d'interval de refresc" ++ ++#~ msgid "" ++#~ "Re-read configuration file and do DNS lookups every interval seconds. " ++#~ "This has the same effect as sending the HUP signal. If interval is 0 " ++#~ "(zero) this feature is disabled. " ++#~ msgstr "" ++#~ "Re-llegeix el fitxer de configuració i les consultes DNS cada interval " ++#~ "segons. Això té el mateix efecte que enviar el senyal HUP. Si l'interval " ++#~ "és 0 (zero) es deshabilita la funció." ++ ++#~ msgid "Pid file" ++#~ msgstr "Fitxer PID" ++ ++#~ msgid "Filename to put the process id" ++#~ msgstr "Nom de fitxer on posar la ID de procés" ++ ++#~ msgid "State directory" ++#~ msgstr "Directori d'estat" ++ ++#~ msgid "Directory of non-volatile data" ++#~ msgstr "Directori de dades no volàtils" ++ ++#~ msgid "TUN/TAP configuration" ++#~ msgstr "Configuració TUN/TAP" ++ ++#~ msgid "Network/Tun configuration" ++#~ msgstr "Configuració de xarxa/tun" ++ ++#~ msgid "Network down script" ++#~ msgstr "Script de baixada de xarxa" ++ ++#~ msgid "" ++#~ "Script executed after a session has moved from authorized state to " ++#~ "unauthorized" ++#~ msgstr "" ++#~ "Script executat quan es mou una sessió des de l'estat autoritzat a no " ++#~ "autoritzat" ++ ++#~ msgid "Network up script" ++#~ msgstr "Script de pujada de xarxa" ++ ++#~ msgid "Script executed after the tun network interface has been brought up" ++#~ msgstr "Script executat després que la interfície de xarxa tun s'hagi alçat" ++ ++#~ msgid "Primary DNS Server" ++#~ msgstr "Servidor DNS primari" ++ ++#~ msgid "Secondary DNS Server" ++#~ msgstr "Servidor DNS secundari" ++ ++#~ msgid "Domain name" ++#~ msgstr "Nom de domini" ++ ++#~ msgid "" ++#~ "Is used to inform the client about the domain name to use for DNS lookups" ++#~ msgstr "" ++#~ "S'utilitza per informar el client sobre el no mde domini a utilitzar per " ++#~ "les consultes DNS" ++ ++#~ msgid "Dynamic IP address pool" ++#~ msgstr "Bateria d'adreces IP dinàmiques" ++ ++#~ msgid "Specifies a pool of dynamic IP addresses" ++#~ msgstr "Especifica una bateria d'adreces IP dinàmiques" ++ ++#~ msgid "IP down script" ++#~ msgstr "Scripts de baixada IP" ++ ++#~ msgid "Script executed after the tun network interface has been taken down" ++#~ msgstr "" ++#~ "Script executat després que s'hagi abaixat la interfície de xarxa tun" ++ ++#~ msgid "IP up script" ++#~ msgstr "Script de pujada IP" ++ ++#~ msgid "" ++#~ "Script executed after the TUN/TAP network interface has been brought up" ++#~ msgstr "" ++#~ "Script executat després que s'hagi apujat la interfície de xarxa TUN/TAP" ++ ++#~ msgid "Uplink subnet" ++#~ msgstr "Subxarxa de pujada" ++ ++#~ msgid "Network address of the uplink interface (CIDR notation)" ++#~ msgstr "Adreça de xarxa de la interfície d'enllaç de pujada (notació CIDR)" ++ ++#~ msgid "Static IP address pool" ++#~ msgstr "Bateria d'adreces IP estàtiques" ++ ++#~ msgid "Specifies a pool of static IP addresses" ++#~ msgstr "Especifica una bateria d'adreces IP estàtiques" ++ ++#~ msgid "TUN/TAP device" ++#~ msgstr "Dispositiu TUN/TAP" ++ ++#~ msgid "The specific device to use for the TUN/TAP interface" ++#~ msgstr "El dispositiu específic utilitzar per la interfície TUN/TAP" ++ ++#~ msgid "TX queue length" ++#~ msgstr "Llargària de la cua TX" ++ ++#~ msgid "The TX queue length to set on the TUN/TAP interface" ++#~ msgstr "La llargària de la cua TX per establir la interfície TUN/TAP" ++ ++#~ msgid "Use TAP device" ++#~ msgstr "Utilitza dispositiu TAP" ++ ++#~ msgid "Use the TAP interface instead of TUN" ++#~ msgstr "Utilitza la interfície TAP en comptes de TUN" ++ ++#~ msgid "DHCP configuration" ++#~ msgstr "Configuració DHCP" ++ ++#~ msgid "Set DHCP options for connecting clients" ++#~ msgstr "Estebleix les opcions DHCP pels clients connectats" ++ ++#~ msgid "DHCP end number" ++#~ msgstr "Número final de DHCP" ++ ++#~ msgid "Where to stop assigning IP addresses (default 254)" ++#~ msgstr "Quan deixar d'assignar adreces IP (per defecte 254)" ++ ++#~ msgid "DHCP interface" ++#~ msgstr "Interfície DHCP" ++ ++#~ msgid "Ethernet interface to listen to for the downlink interface" ++#~ msgstr "" ++#~ "Interfície Ethernet per escoltar les connexions a la interfície de baixada" ++ ++#~ msgid "Listen MAC address" ++#~ msgstr "Escolta adreça MAC" ++ ++#~ msgid "" ++#~ "MAC address to listen to. If not specified the MAC address of the " ++#~ "interface will be used" ++#~ msgstr "" ++#~ "Adreça MAC per escoltar. Si no s'especifica, s'utilitzarà l'adreça MAC de " ++#~ "la interfície." ++ ++#~ msgid "DHCP start number" ++#~ msgstr "Número d'inici de DHCP" ++ ++#~ msgid "Where to start assigning IP addresses (default 10)" ++#~ msgstr "Quan començar a assignar adreces IP (per defecte 10)" ++ ++#~ msgid "Enable IEEE 802.1x" ++#~ msgstr "Activa IEEE 802.1x" ++ ++#~ msgid "Enable IEEE 802.1x authentication and listen for EAP requests" ++#~ msgstr "Activa l'autenticació IEEE 802.1x i escolta peticions EAP" ++ ++#~ msgid "Leasetime" ++#~ msgstr "Temps de Lease" ++ ++#~ msgid "Use a DHCP lease of seconds (default 600)" ++#~ msgstr "Utilitza un lease de segons (per defecte 600)" ++ ++#~ msgid "Allow session update through RADIUS" ++#~ msgstr "Permet l'actualització de sessió a través de RADIUS" ++ ++#~ msgid "" ++#~ "Allow updating of session parameters with RADIUS attributes sent in " ++#~ "Accounting-Response" ++#~ msgstr "" ++#~ "Permet l'actualització dels paràmetres de sessió amb atributs RADIUS " ++#~ "enviats per Accounting-Response" ++ ++#~ msgid "Admin password" ++#~ msgstr "Contrasenya d'administració" ++ ++#~ msgid "" ++#~ "Password to use for Administrative-User authentication in order to pick " ++#~ "up chilli configurations and establish a device \"system\" session" ++#~ msgstr "" ++#~ "Contrasenya per utilitzar per autenticació d'usuari administrador per " ++#~ "agafar configurcions Chilli i establir una sessió \"system\" de dispositiu" ++ ++#~ msgid "Admin user" ++#~ msgstr "Usuari administrador" ++ ++#~ msgid "" ++#~ "User-name to use for Administrative-User authentication in order to pick " ++#~ "up chilli configurations and establish a device \"system\" session" ++#~ msgstr "" ++#~ "Nom d'usuari per utilitzar per autenticació d'usuari administrador per " ++#~ "agafar configurcions Chilli i establir una sessió \"system\" de dispositiu" ++ ++#~ msgid "Do not check disconnection requests" ++#~ msgstr "No comprovis les peticions de desconnexió" ++ ++#~ msgid "Do not check the source IP address of radius disconnect requests" ++#~ msgstr "" ++#~ "No comprovis l'origen de l'adreça IP de les peticions de desconnexió " ++#~ "RADIUS" ++ ++#~ msgid "RADIUS disconnect port" ++#~ msgstr "Port de desconnexió RADIUS" ++ ++#~ msgid "UDP port to listen to for accepting radius disconnect requests" ++#~ msgstr "Port UDP per acceptar peticions de desconnexió RADIUS" ++ ++#~ msgid "NAS IP" ++#~ msgstr "NAS IP" ++ ++#~ msgid "Value to use in RADIUS NAS-IP-Address attribute" ++#~ msgstr "Valor per utilitzar a l'atribut RADIUS adreça NAS-IP" ++ ++#~ msgid "NAS MAC" ++#~ msgstr "NAS MAC" ++ ++#~ msgid "MAC address value to use in RADIUS Called-Station-ID attribute" ++#~ msgstr "" ++#~ "Valor d'adreça MAC per utilitzar a l'atribiut RADIUS Called-Station-ID" ++ ++#~ msgid "Allow OpenID authentication" ++#~ msgstr "Permet autenticació OpenID" ++ ++#~ msgid "" ++#~ "Allows OpenID authentication by sending ChilliSpot-Config=allow-" ++#~ "openidauth in RADIUS Access-Requests" ++#~ msgstr "" ++#~ "Permet autenticació OpenID enviant ChilliSpot-Config=allow-openidauth als " ++#~ "Access-Requests de RADIUS" ++ ++#~ msgid "RADIUS accounting port" ++#~ msgstr "Port d'accounting RADIUS" ++ ++#~ msgid "" ++#~ "The UDP port number to use for radius accounting requests (default 1813)" ++#~ msgstr "" ++#~ "Port UDP a utilitzar per les peticions d'accounting RADIUS (per defecte " ++#~ "1813)" ++ ++#~ msgid "RADIUS authentication port" ++#~ msgstr "Port d'autenticació RADIUS" ++ ++#~ msgid "" ++#~ "The UDP port number to use for radius authentication requests (default " ++#~ "1812)" ++#~ msgstr "" ++#~ "Port UDP a utilitzar per les peticions d'autenticació RADIUS (per defecte " ++#~ "1812)" ++ ++#~ msgid "Option radiuscalled" ++#~ msgstr "Opció radiuscalled" ++ ++#~ msgid "RADIUS listen address" ++#~ msgstr "Adreça per rebre connexions RADIUS" ++ ++#~ msgid "Local interface IP address to use for the radius interface" ++#~ msgstr "Adreça IP d'interfície local per utilitzar per la interfície RADIUS" ++ ++#~ msgid "RADIUS location ID" ++#~ msgstr "ID de localització RADIUS" ++ ++#~ msgid "WISPr Location ID" ++#~ msgstr "ID de localització WISPr" ++ ++#~ msgid "RADIUS location name" ++#~ msgstr "Nom de localització RADIUS" ++ ++#~ msgid "WISPr Location Name" ++#~ msgstr "Nom de localització WISPr" ++ ++#~ msgid "NAS ID" ++#~ msgstr "NAS ID" ++ ++#~ msgid "Network access server identifier" ++#~ msgstr "Identificació de servidor d'accés de xarxa" ++ ++#~ msgid "Option radiusnasip" ++#~ msgstr "Opció radiusnasip" ++ ++#~ msgid "NAS port type" ++#~ msgstr "Tipus de port NAS" ++ ++#~ msgid "" ++#~ "Value of NAS-Port-Type attribute. Defaults to 19 (Wireless-IEEE-802.11)" ++#~ msgstr "" ++#~ "Valor de l'atribut NAS-Port-Type. Per defecte 19 (Wireless-IEEE-802.11)" ++ ++#~ msgid "Send RADIUS VSA" ++#~ msgstr "Envia RADIUS VSA" ++ ++#~ msgid "Send the ChilliSpot-OriginalURL RADIUS VSA in Access-Request" ++#~ msgstr "Envia el RADIUS VSA ChilliSpot-OriginalURl al Access-Request" ++ ++#~ msgid "RADIUS secret" ++#~ msgstr "Secret RADIUS" ++ ++#~ msgid "Radius shared secret for both servers" ++#~ msgstr "Secret compartit RADIUS pels dos servidors" ++ ++#~ msgid "RADIUS server 1" ++#~ msgstr "Servidor RADIUS 1" ++ ++#~ msgid "The IP address of radius server 1" ++#~ msgstr "L'adreça IP del servidor RADIUS 1" ++ ++#~ msgid "RADIUS server 2" ++#~ msgstr "Servidor RADIUS 2" ++ ++#~ msgid "The IP address of radius server 2" ++#~ msgstr "L'adreça IP del servidor RADIUS 2" ++ ++#~ msgid "Swap octets" ++#~ msgstr "Intercanvia octets" ++ ++#~ msgid "" ++#~ "Swap the meaning of \"input octets\" and \"output octets\" as it related " ++#~ "to RADIUS attribtues" ++#~ msgstr "" ++#~ "Intercanvia el significat dels \"octets d'entrada\" i els \"octets de " ++#~ "sortida\" com es relacionen els atributs RADIUS" ++ ++#~ msgid "Allow WPA guests" ++#~ msgstr "Permet convidats WPA" ++ ++#~ msgid "" ++#~ "Allows WPA Guest authentication by sending ChilliSpot-Config=allow-wpa-" ++#~ "guests in RADIUS Access-Requests" ++#~ msgstr "" ++#~ "Permet l'autenticació de convidats WPA enviant un ChilliSpot-Config=allow-" ++#~ "wpa-guests als Access-Requests de RADIUS" ++ ++#~ msgid "Proxy client" ++#~ msgstr "Client proxy" ++ ++#~ msgid "" ++#~ "IP address from which radius requests are accepted. If omitted the server " ++#~ "will not accept radius requests" ++#~ msgstr "" ++#~ "Adreça IP des de la qual s'accepten les peticions RADIUS. Si s'omet, el " ++#~ "servidor no acceptarà peticions RADIUS" ++ ++#~ msgid "Proxy listen address" ++#~ msgstr "Adreça que rep connexions del proxy" ++ ++#~ msgid "Local interface IP address to use for accepting radius requests" ++#~ msgstr "" ++#~ "L'adreça IP de la interfície local a utilitzar per acceptar peticions " ++#~ "RADIUS" ++ ++#~ msgid "Proxy port" ++#~ msgstr "Port proxy" ++ ++#~ msgid "UDP Port to listen to for accepting radius requests" ++#~ msgstr "Port UDP a rebre connexions per acceptar peticions RADIUS" ++ ++#~ msgid "Proxy secret" ++#~ msgstr "Secret de proxy" ++ ++#~ msgid "Radius shared secret for clients" ++#~ msgstr "Secret compartit de RADIUS pels clients" ++ ++#~ msgid "UAM configuration" ++#~ msgstr "Configuració UAM" ++ ++#~ msgid "Unified Configuration Method settings" ++#~ msgstr "Preferències de Mètode de Configuració Unificat" ++ ++#~ msgid "Use Chilli XML" ++#~ msgstr "Utilitza XML Chilli" ++ ++#~ msgid "Return the so-called Chilli XML along with WISPr XML" ++#~ msgstr "Retorna l'XML Chilli juntament amb l'XML WISPr" ++ ++#~ msgid "Default idle timeout" ++#~ msgstr "Temps d'espera d'inactivitat màxim per defecte" ++ ++#~ msgid "Default idle timeout unless otherwise set by RADIUS (defaults to 0)" ++#~ msgstr "" ++#~ "Temps d'espera d'inactivitat màxim per defecte excepte si s'estableix pel " ++#~ "RADIUS (per defecte 0)" ++ ++#~ msgid "Default interim interval" ++#~ msgstr "Interval provisional predeterminat" ++ ++#~ msgid "" ++#~ "Default interim-interval for RADIUS accounting unless otherwise set by " ++#~ "RADIUS (defaults to 0)" ++#~ msgstr "" ++#~ "Interval provisional predeterminat per accounting RADIUS excepte si " ++#~ "s'estableix pel RADIUS (per defecte 0)" ++ ++#~ msgid "Default session timeout" ++#~ msgstr "Temps d'espera màxim de sessió per defecte" ++ ++#~ msgid "" ++#~ "Default session timeout unless otherwise set by RADIUS (defaults to 0)" ++#~ msgstr "" ++#~ "Temps d'espera màxim de sessió per defecte excepte si s'estableix pel " ++#~ "RADIUS (per defecte 0)" ++ ++#~ msgid "Inspect DNS traffic" ++#~ msgstr "Inspeccions tràfic DNS" ++ ++#~ msgid "" ++#~ "Inspect DNS packets and drop responses with any non- A, CNAME, SOA, or MX " ++#~ "records to prevent dns tunnels (experimental)" ++#~ msgstr "" ++#~ "Inspecciona paquets DNS i descarta ls respostes per qualsevol registre " ++#~ "que no sigui A, CNAME, SOA o MX per prevenir túnels DNS (experimental)" ++ ++#~ msgid "Local users file" ++#~ msgstr "Fitxers d'usuaris local" ++ ++#~ msgid "" ++#~ "A colon seperated file containing usernames and passwords of locally " ++#~ "authenticated users" ++#~ msgstr "" ++#~ "Un fitxer contenint usuaris i contrasenyes separats per punts d'usuaris " ++#~ "autenticats localment" ++ ++#~ msgid "Location name" ++#~ msgstr "Nom de localització" ++ ++#~ msgid "Human readable location name used in JSON interface" ++#~ msgstr "Nom de localització llegible utilitzat en l'interfície JSON" ++ ++#~ msgid "Do not redirect to UAM server" ++#~ msgstr "No readrecis al servidor UAM" ++ ++#~ msgid "" ++#~ "Do not return to UAM server on login success, just redirect to original " ++#~ "URL" ++#~ msgstr "" ++#~ "No retornis al servidor UAM amb quan s'iniciï la sessió amb èxit, " ++#~ "readreça només a la URL original" ++ ++#~ msgid "Do not do WISPr" ++#~ msgstr "No facis WISPr" ++ ++#~ msgid "Do not do any WISPr XML, assume the back-end is doing this instead" ++#~ msgstr "No facis cap XML WISPr, assumeix que el back-end ho està fent" ++ ++#~ msgid "Post auth proxy" ++#~ msgstr "Proxy post autenticació" ++ ++#~ msgid "" ++#~ "Used with postauthproxyport to define a post authentication HTTP proxy " ++#~ "server" ++#~ msgstr "" ++#~ "Utilitzat amb postauthproxyport per definir una autenticació HTTP " ++#~ "posterior de proxy server" ++ ++#~ msgid "Post auth proxy port" ++#~ msgstr "Port proxy post autenticació" ++ ++#~ msgid "" ++#~ "Used with postauthproxy to define a post authentication HTTP proxy server" ++#~ msgstr "" ++#~ "Utilitzat amb postauthproxy per definir un servidor proxy HTTP " ++#~ "d'autenticació posterior" ++ ++#~ msgid "Allowed resources" ++#~ msgstr "Recursos permesos" ++ ++#~ msgid "List of resources the client can access without first authenticating" ++#~ msgstr "" ++#~ "Llista dels recursos que el client pot accedir sense autenticar-se primer" ++ ++#~ msgid "Allow any DNS server" ++#~ msgstr "Permet qualsevol servidor DNS" ++ ++#~ msgid "Allow any DNS server for unauthenticated clients" ++#~ msgstr "Permet qualsevol servidor DNS per clients no autenticats" ++ ++#~ msgid "Allow any IP address" ++#~ msgstr "Permet qualsevol adreça IP" ++ ++#~ msgid "" ++#~ "Allow clients to use any IP settings they wish by spoofing ARP " ++#~ "(experimental)" ++#~ msgstr "" ++#~ "Permet que els clients utilitzin qualsevol configuració IP que vulguin " ++#~ "fent ARP spoofind (experimental)" ++ ++#~ msgid "Allowed domains" ++#~ msgstr "Dominis permesos" ++ ++#~ msgid "" ++#~ "Defines a list of domain names to automatically add to the walled garden" ++#~ msgstr "" ++#~ "Defineix una llista de noms de domini per afegir automàticament al jardí " ++#~ "tancat" ++ ++#~ msgid "UAM homepage" ++#~ msgstr "Pàgina d'inici UAM" ++ ++#~ msgid "URL of homepage to redirect unauthenticated users to" ++#~ msgstr "URL de la pàgina d'inici per readreçar usuari no autenticats" ++ ++#~ msgid "UAM static content port" ++#~ msgstr "Port de contingut estàtic UAM" ++ ++#~ msgid "TCP port to bind to for only serving embedded content" ++#~ msgstr "Port TCP on escoltar per servir només contingut empotrat" ++ ++#~ msgid "UAM listening address" ++#~ msgstr "Adreça per on escoltar UAM" ++ ++#~ msgid "IP address to listen to for authentication of clients" ++#~ msgstr "Adreça IP on escoltar pels l'autenticació dels clients" ++ ++#~ msgid "UAM logout IP" ++#~ msgstr "IP de final de sessió UAM" ++ ++#~ msgid "" ++#~ "Use this IP address to instantly logout a client accessing it (defaults " ++#~ "to 1.1.1.1)" ++#~ msgstr "" ++#~ "Utilitza aquesta adreça IP per finalitzar la sessió d'un que hi accedeix " ++#~ "instantàniament (per defecte 1.1.1.1)" ++ ++#~ msgid "UAM listening port" ++#~ msgstr "Port on escoltar UAM" ++ ++#~ msgid "TCP port to bind to for authenticating clients (default 3990)" ++#~ msgstr "" ++#~ "Port TCP per on escoltar l'autenticació de clients (per defecte 3990)" ++ ++#~ msgid "UAM secret" ++#~ msgstr "Secret UAM" ++ ++#~ msgid "Shared secret between uamserver and chilli" ++#~ msgstr "Secret compartit entre el uamserver i el chilli" ++ ++#~ msgid "UAM server" ++#~ msgstr "Servidor UAM" ++ ++#~ msgid "URL of web server to use for authenticating clients" ++#~ msgstr "URL del servidor URL a utilitzar per clients autenticats" ++ ++#~ msgid "UAM user interface" ++#~ msgstr "Interfície d'usuari UAM" ++ ++#~ msgid "" ++#~ "An init.d style program to handle local content on the uamuiport web " ++#~ "server" ++#~ msgstr "" ++#~ "Un programa de l'stil init.d per gestionar el contingut local al servidor " ++#~ "web uamuiport" ++ ++#~ msgid "Use status file" ++#~ msgstr "Utilitza fitxer d'estat" ++ ++#~ msgid "" ++#~ "Write the status of clients in a non-volatile state file (experimental)" ++#~ msgstr "" ++#~ "Escriu l'estat dels clients en un fitxer d'estat no volàtil (experimental)" ++ ++#~ msgid "WISPr login url" ++#~ msgstr "URL d'inici de sessió WISPr" ++ ++#~ msgid "Specific URL to be given in WISPr XML LoginURL" ++#~ msgstr "URL específica a donar a la URL d'inici de sessió de l'XML WISPr" ++ ++#~ msgid "CGI program" ++#~ msgstr "Programa CGI" ++ ++#~ msgid "" ++#~ "Executable to run as a CGI type program (like haserl) for URLs with " ++#~ "extention .chi" ++#~ msgstr "" ++#~ "Executable per executar com un programa de tipus CGI (com el haserl) per " ++#~ "URLs amb extensió .chi" ++ ++#~ msgid "Web content directory" ++#~ msgstr "Directori de contingut web" ++ ++#~ msgid "Directory where embedded local web content is placed" ++#~ msgstr "Directori on se situa el contingut web local empotrat" ++ ++#~ msgid "MAC configuration" ++#~ msgstr "Configuració MAC" ++ ++#~ msgid "Configure MAC authentication" ++#~ msgstr "Configura l'autenticació MAC" ++ ++#~ msgid "Allowed MAC addresses" ++#~ msgstr "Adreces MAC permeses" ++ ++#~ msgid "List of MAC addresses for which MAC authentication will be performed" ++#~ msgstr "Llista d'adreces MAC per les que es realitzarà autenticació MAC" ++ ++#~ msgid "Authenticate locally allowed MACs" ++#~ msgstr "Autentica localment les MACs permeses" ++ ++#~ msgid "Authenticate allowed MAC addresses without the use of RADIUS" ++#~ msgstr "Autentica les adreces MAC permeses sense l'ús del RADIUS" ++ ++#~ msgid "Enable MAC authentification" ++#~ msgstr "Activa l'autenticació MAC" ++ ++#~ msgid "Try to authenticate all users based on their mac address alone" ++#~ msgstr "" ++#~ "Intenta autenticar tots els usuaris basats només en la seva adreça MAC" ++ ++#~ msgid "Password" ++#~ msgstr "Contrasenya" ++ ++#~ msgid "Password used when performing MAC authentication" ++#~ msgstr "Contrasenya utilitzada quan es realitza autenticació MAC" ++ ++#~ msgid "Suffix" ++#~ msgstr "Sufix" ++ ++#~ msgid "coovachilli_macauth_macsuffix_desc" ++#~ msgstr "" ++#~ "Sufix per afegir a l'adreça MAC per formar el nm d'usuari, que s'enviarà " ++#~ "al servidor RADIUS" +diff --git a/feeds/luci/applications/luci-app-coovachilli/po/cs/coovachilli.po b/feeds/luci/applications/luci-app-coovachilli/po/cs/coovachilli.po +new file mode 100644 +index 0000000..0dc5fc0 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-coovachilli/po/cs/coovachilli.po +@@ -0,0 +1,348 @@ ++# coovachilli.pot ++# generated from ./applications/luci-coovachilli/luasrc/i18n/coovachilli.en.lua ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"PO-Revision-Date: 2013-01-30 10:33+0200\n" ++"Last-Translator: Astran \n" ++"Language-Team: none\n" ++"Language: cs\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "CoovaChilli" ++msgstr "CoovaChilli" ++ ++msgid "Network Configuration" ++msgstr "Nastavení sítÄ›" ++ ++msgid "RADIUS configuration" ++msgstr "Nastavení RADIUS" ++ ++msgid "UAM and MAC Authentication" ++msgstr "UAM a MAC ověřování" ++ ++#~ msgid "General configuration" ++#~ msgstr "Obecná konfigurace" ++ ++#~ msgid "General CoovaChilli settings" ++#~ msgstr "Obecné nastavení CoovaChilli" ++ ++#~ msgid "Command socket" ++#~ msgstr "Příkazový socket" ++ ++#~ msgid "UNIX socket used for communication with chilli_query" ++#~ msgstr "UNIX socket, používaný pro komunikaci s chilli_query" ++ ++#~ msgid "Config refresh interval" ++#~ msgstr "Interval obnovení konfigurace" ++ ++#~ msgid "Pid file" ++#~ msgstr "PID soubor" ++ ++#~ msgid "TUN/TAP configuration" ++#~ msgstr "Nastavení TUN/TAP" ++ ++#~ msgid "Network/Tun configuration" ++#~ msgstr "Nastavení sítÄ›/Tun" ++ ++#~ msgid "Network down script" ++#~ msgstr "Network down skript" ++ ++#~ msgid "Network up script" ++#~ msgstr "Network up skript" ++ ++#~ msgid "Script executed after the tun network interface has been brought up" ++#~ msgstr "Skript, spuÅ¡tÄ›ný po nahození síťového rozhraní TUN" ++ ++#~ msgid "Primary DNS Server" ++#~ msgstr "Primární DNS server" ++ ++#~ msgid "Secondary DNS Server" ++#~ msgstr "Sekundární DNS server" ++ ++#~ msgid "Domain name" ++#~ msgstr "Doménové jméno" ++ ++#~ msgid "Dynamic IP address pool" ++#~ msgstr "Pool dynamických IP adres" ++ ++#~ msgid "Specifies a pool of dynamic IP addresses" ++#~ msgstr "UrÄi rozsah, z nÄ›hož se budou pÅ™idÄ›lovat dynamické IP adresy" ++ ++#~ msgid "IP down script" ++#~ msgstr "IP down skript" ++ ++#~ msgid "IP up script" ++#~ msgstr "IP up skript" ++ ++#~ msgid "Network address of the uplink interface (CIDR notation)" ++#~ msgstr "Síťová adresa uplink rozhraní (CIDR notace)" ++ ++#~ msgid "Static IP address pool" ++#~ msgstr "Pool statických IP adres" ++ ++#~ msgid "Specifies a pool of static IP addresses" ++#~ msgstr "UrÄuje rozsah, z nÄ›hož se budou pÅ™idÄ›lovat statické IP adresy" ++ ++#~ msgid "TX queue length" ++#~ msgstr "Délka odchozí fronty" ++ ++#~ msgid "The TX queue length to set on the TUN/TAP interface" ++#~ msgstr "Délka odchozí fronty na zařízení TUN/TAP" ++ ++#~ msgid "Use TAP device" ++#~ msgstr "Použít zařízení TAP" ++ ++#~ msgid "Use the TAP interface instead of TUN" ++#~ msgstr "Použít TAP rozhraní namísto TUN" ++ ++#~ msgid "DHCP configuration" ++#~ msgstr "Nastavení DHCP" ++ ++#~ msgid "Set DHCP options for connecting clients" ++#~ msgstr "Nastavit možnosti DHCP pro příchozí klienty" ++ ++#~ msgid "DHCP end number" ++#~ msgstr "DHCP koncové Äíslo" ++ ++#~ msgid "Where to stop assigning IP addresses (default 254)" ++#~ msgstr "Kde pÅ™estat pÅ™idÄ›lovat IP adresy (standardnÄ› 254)" ++ ++#~ msgid "DHCP interface" ++#~ msgstr "DHCP rozhraní" ++ ++#~ msgid "Where to start assigning IP addresses (default 10)" ++#~ msgstr "Odkud zaÄít pÅ™idÄ›lovat IP adresy" ++ ++#~ msgid "Enable IEEE 802.1x" ++#~ msgstr "Povolit IEEE 802.1x" ++ ++#~ msgid "Enable IEEE 802.1x authentication and listen for EAP requests" ++#~ msgstr "Povolit IEEE 802.1x autentizaci a naslouchat požadavkům EAP" ++ ++#~ msgid "Admin password" ++#~ msgstr "Administrátorské heslo" ++ ++#~ msgid "Admin user" ++#~ msgstr "Administrátorský uživatel" ++ ++#~ msgid "Do not check disconnection requests" ++#~ msgstr "Neověřovat požadavky na odpojení" ++ ++#~ msgid "Do not check the source IP address of radius disconnect requests" ++#~ msgstr "" ++#~ "Neověřovat zdrojovou IP adresu požadavku na odpojení protokolu RADIUS" ++ ++#~ msgid "NAS IP" ++#~ msgstr "NAS IP" ++ ++#~ msgid "NAS MAC" ++#~ msgstr "NAS MAC" ++ ++#~ msgid "Allow OpenID authentication" ++#~ msgstr "Povolit autentizaci pomocí OpenID" ++ ++#~ msgid "RADIUS server 1" ++#~ msgstr "RADIUS server 1" ++ ++#~ msgid "The IP address of radius server 1" ++#~ msgstr "IP adresa prvního radius serveru" ++ ++#~ msgid "RADIUS server 2" ++#~ msgstr "RADIUS server 2" ++ ++#~ msgid "The IP address of radius server 2" ++#~ msgstr "IP adresa druhého radius serveru" ++ ++#~ msgid "" ++#~ "Swap the meaning of \"input octets\" and \"output octets\" as it related " ++#~ "to RADIUS attribtues" ++#~ msgstr "" ++#~ "Prohodit významy spojení \"vstupní oktety\" a \"výstupní oktety\", " ++#~ "vztahující se k atributům protokolu RADIUS" ++ ++#~ msgid "Allow WPA guests" ++#~ msgstr "Povolit WPA hosty" ++ ++#~ msgid "Proxy client" ++#~ msgstr "Proxy klient" ++ ++#~ msgid "" ++#~ "IP address from which radius requests are accepted. If omitted the server " ++#~ "will not accept radius requests" ++#~ msgstr "" ++#~ "IP adresa, ze které budou pÅ™ijímány požadavky radius. Pokud necháte " ++#~ "prázdné, server nebude pÅ™ijímat požadavky protokolu RADIUS." ++ ++#~ msgid "Proxy listen address" ++#~ msgstr "Naslouchající adresa Proxy" ++ ++#~ msgid "Local interface IP address to use for accepting radius requests" ++#~ msgstr "" ++#~ "IP adresa místního rozhraní, urÄená pro naslouchání požadavkům protokolu " ++#~ "RADIUS" ++ ++#~ msgid "Proxy port" ++#~ msgstr "Port Proxy" ++ ++#~ msgid "UDP Port to listen to for accepting radius requests" ++#~ msgstr "UDP port, urÄený pro naslouchání požadavkům protokolu RADIUS" ++ ++#~ msgid "UAM configuration" ++#~ msgstr "Konfigurace UAM" ++ ++#~ msgid "Unified Configuration Method settings" ++#~ msgstr "Nastavení 'Unified Configuration Method'" ++ ++#~ msgid "Use Chilli XML" ++#~ msgstr "Použít Chilli XML" ++ ++#~ msgid "Default idle timeout" ++#~ msgstr "Výchozí Äasový limit neÄinnosti" ++ ++#~ msgid "Default idle timeout unless otherwise set by RADIUS (defaults to 0)" ++#~ msgstr "" ++#~ "Výchozí Äasový limit neÄinnosti, pokud nebyl nastaven pomocí RADIUS " ++#~ "(standardnÄ› 0)" ++ ++#~ msgid "Default session timeout" ++#~ msgstr "Výchozí Äasový limit sezení" ++ ++#~ msgid "" ++#~ "Default session timeout unless otherwise set by RADIUS (defaults to 0)" ++#~ msgstr "" ++#~ "Výchozí Äasový limit sezení, pokud není RADIUS nastaven jinak (standardnÄ› " ++#~ "0)" ++ ++#~ msgid "Inspect DNS traffic" ++#~ msgstr "Kontrolovat DNS provoz" ++ ++#~ msgid "Local users file" ++#~ msgstr "Soubor s místními uživateli" ++ ++#~ msgid "" ++#~ "A colon seperated file containing usernames and passwords of locally " ++#~ "authenticated users" ++#~ msgstr "" ++#~ "Soubor, obsahující uživatelská jména a hesla místnÄ› ověřovaných " ++#~ "uživatelů. Jednotlivé položky jsou oddÄ›leny dvojteÄkou." ++ ++#~ msgid "Location name" ++#~ msgstr "Název umístÄ›ní" ++ ++#~ msgid "Human readable location name used in JSON interface" ++#~ msgstr "ÄŒitelný název umístÄ›ní, používán v rozhraní JSON" ++ ++#~ msgid "Do not redirect to UAM server" ++#~ msgstr "NepÅ™esmÄ›rovávat na UAM server" ++ ++#~ msgid "" ++#~ "Do not return to UAM server on login success, just redirect to original " ++#~ "URL" ++#~ msgstr "" ++#~ "PÅ™i úspěšném pÅ™ihlášení nevracet na UAM server, pouze pÅ™esmÄ›rovat na " ++#~ "původní URL" ++ ++#~ msgid "Do not do WISPr" ++#~ msgstr "NeprovádÄ›t WISPr" ++ ++#~ msgid "Allowed resources" ++#~ msgstr "Povolené zdroje" ++ ++#~ msgid "List of resources the client can access without first authenticating" ++#~ msgstr "Seznam zdrojů, jež může klient využívat bez nutnosti autentizace" ++ ++#~ msgid "Allow any DNS server" ++#~ msgstr "Povolit libovolný DNS server" ++ ++#~ msgid "Allow any DNS server for unauthenticated clients" ++#~ msgstr "Povolí libovolný DNS server neověřeným klientům" ++ ++#~ msgid "Allow any IP address" ++#~ msgstr "Povolit libovolnou IP adresu" ++ ++#~ msgid "Allowed domains" ++#~ msgstr "Povolené domény" ++ ++#~ msgid "UAM homepage" ++#~ msgstr "Domovská stránka UAM" ++ ++#~ msgid "URL of homepage to redirect unauthenticated users to" ++#~ msgstr "" ++#~ "URL domovské stránky, na kterou budou pÅ™esmÄ›rováni neověření uživatelé" ++ ++#~ msgid "IP address to listen to for authentication of clients" ++#~ msgstr "IP adresa, na které naslouchat za úÄelem ověřování klientů" ++ ++#~ msgid "UAM logout IP" ++#~ msgstr "OdhlaÅ¡ovací IP UAM" ++ ++#~ msgid "" ++#~ "Use this IP address to instantly logout a client accessing it (defaults " ++#~ "to 1.1.1.1)" ++#~ msgstr "" ++#~ "Adresa, sloužící k okamžitému odhlášení klienta, pokud na ní pÅ™istoupí " ++#~ "(standardnÄ› 1.1.1.1)" ++ ++#~ msgid "UAM listening port" ++#~ msgstr "Naslouchající port UAM" ++ ++#~ msgid "UAM server" ++#~ msgstr "UAM server" ++ ++#~ msgid "URL of web server to use for authenticating clients" ++#~ msgstr "URL web serveru, sloužícího k ověřování klientů" ++ ++#~ msgid "UAM user interface" ++#~ msgstr "Uživatelské rozhraní UAM" ++ ++#~ msgid "Use status file" ++#~ msgstr "Použít stavový soubor" ++ ++#~ msgid "" ++#~ "Write the status of clients in a non-volatile state file (experimental)" ++#~ msgstr "" ++#~ "Zapisovat stavy klientů do stálého stavového souboru (experimentální)" ++ ++#~ msgid "WISPr login url" ++#~ msgstr "PÅ™ihlaÅ¡ovací URL WISPr" ++ ++#~ msgid "CGI program" ++#~ msgstr "CGI program" ++ ++#~ msgid "Web content directory" ++#~ msgstr "Adresář s webovým obsahem" ++ ++#~ msgid "Directory where embedded local web content is placed" ++#~ msgstr "Adresář, ve kterém je umístÄ›n místní webový obsah." ++ ++#~ msgid "MAC configuration" ++#~ msgstr "Nastavení MAC" ++ ++#~ msgid "Configure MAC authentication" ++#~ msgstr "Nastavit ověřování pomocí MAC" ++ ++#~ msgid "Allowed MAC addresses" ++#~ msgstr "Povolené MAC adresy" ++ ++#~ msgid "List of MAC addresses for which MAC authentication will be performed" ++#~ msgstr "Seznam MAC adres, pro které bude provádÄ›no ověřování pomocí MAC" ++ ++#~ msgid "Authenticate locally allowed MACs" ++#~ msgstr "Ověřit lokálnÄ› povolené MAC" ++ ++#~ msgid "Authenticate allowed MAC addresses without the use of RADIUS" ++#~ msgstr "Ověří povolené MAC adresy bez použití protokolu RADIUS" ++ ++#~ msgid "Enable MAC authentification" ++#~ msgstr "Povolit ověřování pomocí MAC" ++ ++#~ msgid "Password" ++#~ msgstr "Heslo" ++ ++#~ msgid "Suffix" ++#~ msgstr "Přípona" +diff --git a/feeds/luci/applications/luci-app-coovachilli/po/de/coovachilli.po b/feeds/luci/applications/luci-app-coovachilli/po/de/coovachilli.po +new file mode 100644 +index 0000000..d8322db +--- /dev/null ++++ b/feeds/luci/applications/luci-app-coovachilli/po/de/coovachilli.po +@@ -0,0 +1,658 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Report-Msgid-Bugs-To: \n" ++"POT-Creation-Date: 2009-05-26 17:57+0200\n" ++"PO-Revision-Date: 2012-07-17 15:05+0200\n" ++"Last-Translator: Martin \n" ++"Language-Team: LANGUAGE \n" ++"Language: de\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n != 1);\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "CoovaChilli" ++msgstr "CoovaChilli" ++ ++msgid "Network Configuration" ++msgstr "Netzwerk-Konfiguration" ++ ++msgid "RADIUS configuration" ++msgstr "RADIUS Konfiguration" ++ ++msgid "UAM and MAC Authentication" ++msgstr "UAM- und MAC-Authentifizierung" ++ ++#~ msgid "General configuration" ++#~ msgstr "Allgemeine Einstellungen" ++ ++#~ msgid "General CoovaChilli settings" ++#~ msgstr "Allgemeine Einstellungen zu CoovaChilli" ++ ++#, fuzzy ++#~ msgid "Command socket" ++#~ msgstr "Eingabeschnittstelle" ++ ++#~ msgid "UNIX socket used for communication with chilli_query" ++#~ msgstr "" ++#~ "UNIX socket der fuer die Kommunikation mit chilli_query benutzt wird" ++ ++#, fuzzy ++#~ msgid "Config refresh interval" ++#~ msgstr "Zeit zwischen neuladen der Konfiguration" ++ ++#, fuzzy ++#~ msgid "" ++#~ "Re-read configuration file and do DNS lookups every interval seconds. " ++#~ "This has the same effect as sending the HUP signal. If interval is 0 " ++#~ "(zero) this feature is disabled. " ++#~ msgstr "Zeit zwischen neuladen der Konfiguration" ++ ++#~ msgid "Pid file" ++#~ msgstr "Pid-Datei" ++ ++#~ msgid "Filename to put the process id" ++#~ msgstr "" ++#~ "Name der Datei, in der die Pid gespeichert wird" ++ ++#, fuzzy ++#~ msgid "State directory" ++#~ msgstr "Statisches Verzeichniss" ++ ++#~ msgid "Directory of non-volatile data" ++#~ msgstr "Verzeichniss für statische Daten" ++ ++#, fuzzy ++#~ msgid "TUN/TAP configuration" ++#~ msgstr "TUN/TAP Konfiguration" ++ ++#, fuzzy ++#~ msgid "Network/Tun configuration" ++#~ msgstr "Netzwerk/TUN Konfiguration" ++ ++#, fuzzy ++#~ msgid "Network down script" ++#~ msgstr "" ++#~ "Script, das nach einer Umwandlung von einer autorisierten zu einer " ++#~ "unautorisierten Sitzung ausgeführt wird" ++ ++#~ msgid "" ++#~ "Script executed after a session has moved from authorized state to " ++#~ "unauthorized" ++#~ msgstr "" ++#~ "Skript, das nach einer Umwandlung von einer autorisierten zu einer " ++#~ "unautorisierten Sitzung ausgeführt wird" ++ ++#~ msgid "Network up script" ++#~ msgstr "Netzwerk Up Skript" ++ ++#, fuzzy ++#~ msgid "Script executed after the tun network interface has been brought up" ++#~ msgstr "Script, dass nach erfolgreicher tun - Verbindung ausgeführt wird" ++ ++#~ msgid "Primary DNS Server" ++#~ msgstr "Primärer DNS-Server" ++ ++#~ msgid "Secondary DNS Server" ++#~ msgstr "Sekundärer DNS-Server" ++ ++#, fuzzy ++#~ msgid "Domain name" ++#~ msgstr "Domain Name" ++ ++#~ msgid "" ++#~ "Is used to inform the client about the domain name to use for DNS lookups" ++#~ msgstr "" ++#~ "Wird benutzt um Clients ueber den zu benutzenden Domain Namen fuer DNS " ++#~ "Anfragen zu informieren" ++ ++#~ msgid "Dynamic IP address pool" ++#~ msgstr "Dynamischer IP-Adressen Pool" ++ ++#~ msgid "Specifies a pool of dynamic IP addresses" ++#~ msgstr "Legt einen Bereich von dynamischen IP-Adressen fest" ++ ++#~ msgid "IP down script" ++#~ msgstr "IP down Skript" ++ ++#, fuzzy ++#~ msgid "Script executed after the tun network interface has been taken down" ++#~ msgstr "" ++#~ "Script, das nach einer Umwandlung von einer autorisierten zu einer " ++#~ "unautorisierten Sitzung ausgeführt wird" ++ ++#, fuzzy ++#~ msgid "IP up script" ++#~ msgstr "Netzwerk/TUN Konfiguration" ++ ++#, fuzzy ++#~ msgid "" ++#~ "Script executed after the TUN/TAP network interface has been brought up" ++#~ msgstr "Script, dass nach erfolgreicher tun - Verbindung ausgeführt wird" ++ ++#, fuzzy ++#~ msgid "Uplink subnet" ++#~ msgstr "Netzwerk/TUN Konfiguration" ++ ++#, fuzzy ++#~ msgid "Network address of the uplink interface (CIDR notation)" ++#~ msgstr "" ++#~ "Zur Auflösung der Host-Namen benötigter DNS Server, die an den client " ++#~ "übertragen wird" ++ ++#, fuzzy ++#~ msgid "Static IP address pool" ++#~ msgstr "Domain Name" ++ ++#, fuzzy ++#~ msgid "Specifies a pool of static IP addresses" ++#~ msgstr "Script, dass nach erfolgreicher tun - Verbindung ausgeführt wird" ++ ++#, fuzzy ++#~ msgid "TUN/TAP device" ++#~ msgstr "Netzwerk/TUN Konfiguration" ++ ++#, fuzzy ++#~ msgid "The specific device to use for the TUN/TAP interface" ++#~ msgstr "" ++#~ "Script, das nach einer Umwandlung von einer autorisierten zu einer " ++#~ "unautorisierten Sitzung ausgeführt wird" ++ ++#, fuzzy ++#~ msgid "TX queue length" ++#~ msgstr "Domain Name" ++ ++#, fuzzy ++#~ msgid "The TX queue length to set on the TUN/TAP interface" ++#~ msgstr "" ++#~ "Script, das nach einer Umwandlung von einer autorisierten zu einer " ++#~ "unautorisierten Sitzung ausgeführt wird" ++ ++#, fuzzy ++#~ msgid "Use TAP device" ++#~ msgstr "Netzwerk/TUN Konfiguration" ++ ++#, fuzzy ++#~ msgid "Use the TAP interface instead of TUN" ++#~ msgstr "Script, dass nach erfolgreicher tun - Verbindung ausgeführt wird" ++ ++#, fuzzy ++#~ msgid "DHCP configuration" ++#~ msgstr "TUN/TAP Konfiguration" ++ ++#, fuzzy ++#~ msgid "Set DHCP options for connecting clients" ++#~ msgstr "Netzwerk/TUN Konfiguration" ++ ++#, fuzzy ++#~ msgid "DHCP end number" ++#~ msgstr "Netzwerk/TUN Konfiguration" ++ ++#, fuzzy ++#~ msgid "Where to stop assigning IP addresses (default 254)" ++#~ msgstr "Netzwerk/TUN Konfiguration" ++ ++#, fuzzy ++#~ msgid "DHCP interface" ++#~ msgstr "Netzwerk/TUN Konfiguration" ++ ++#, fuzzy ++#~ msgid "Ethernet interface to listen to for the downlink interface" ++#~ msgstr "Netzwerk/TUN Konfiguration" ++ ++#, fuzzy ++#~ msgid "Listen MAC address" ++#~ msgstr "Netzwerk/TUN Konfiguration" ++ ++#, fuzzy ++#~ msgid "" ++#~ "MAC address to listen to. If not specified the MAC address of the " ++#~ "interface will be used" ++#~ msgstr "Netzwerk/TUN Konfiguration" ++ ++#, fuzzy ++#~ msgid "DHCP start number" ++#~ msgstr "Netzwerk/TUN Konfiguration" ++ ++#, fuzzy ++#~ msgid "Where to start assigning IP addresses (default 10)" ++#~ msgstr "Netzwerk/TUN Konfiguration" ++ ++#, fuzzy ++#~ msgid "Enable IEEE 802.1x" ++#~ msgstr "Netzwerk/TUN Konfiguration" ++ ++#, fuzzy ++#~ msgid "Enable IEEE 802.1x authentication and listen for EAP requests" ++#~ msgstr "Netzwerk/TUN Konfiguration" ++ ++#, fuzzy ++#~ msgid "Leasetime" ++#~ msgstr "Vorhaltezeit" ++ ++#~ msgid "Use a DHCP lease of seconds (default 600)" ++#~ msgstr "Benutze eine DHCP-Vorhaltezeit in Sekunden (voreingestelllt 600)" ++ ++#~ msgid "Allow session update through RADIUS" ++#~ msgstr "Erlaube Sitzungsupdates durch RADIUS" ++ ++#, fuzzy ++#~ msgid "" ++#~ "Allow updating of session parameters with RADIUS attributes sent in " ++#~ "Accounting-Response" ++#~ msgstr "" ++#~ "Erlaubt das Aktuallisieren der Sitzungsparameter mit RADIUS-attributen, " ++#~ "die im der Konten-Antwort enthalten sind" ++ ++#~ msgid "Admin password" ++#~ msgstr "Administratorkennwort" ++ ++#, fuzzy ++#~ msgid "" ++#~ "Password to use for Administrative-User authentication in order to pick " ++#~ "up chilli configurations and establish a device \"system\" session" ++#~ msgstr "" ++#~ "Kennwort zur Administratoren-Authentifizierung um die chilli- " ++#~ "konfigurationen aufzunehmen und eine Systemsitzung fürs Gerät zu erstellen" ++ ++#, fuzzy ++#~ msgid "Admin user" ++#~ msgstr "Adminstratorenkennung" ++ ++#, fuzzy ++#~ msgid "" ++#~ "User-name to use for Administrative-User authentication in order to pick " ++#~ "up chilli configurations and establish a device \"system\" session" ++#~ msgstr "Benutzername des für Administration berechtigten Benutzers. " ++ ++#, fuzzy ++#~ msgid "Do not check disconnection requests" ++#~ msgstr "Ignoriere die Verbindungstrennungsanfragen" ++ ++#, fuzzy ++#~ msgid "Do not check the source IP address of radius disconnect requests" ++#~ msgstr "Prüft nicht die Quell-IP einer RADIUS Verbindungstrennungsanfrage." ++ ++#, fuzzy ++#~ msgid "RADIUS disconnect port" ++#~ msgstr "Port für die Verbindungstrennung" ++ ++#, fuzzy ++#~ msgid "UDP port to listen to for accepting radius disconnect requests" ++#~ msgstr "Netzwerk/TUN Konfiguration" ++ ++#, fuzzy ++#~ msgid "NAS IP" ++#~ msgstr "Netzwerk/TUN Konfiguration" ++ ++#, fuzzy ++#~ msgid "Value to use in RADIUS NAS-IP-Address attribute" ++#~ msgstr "Netzwerk/TUN Konfiguration" ++ ++#, fuzzy ++#~ msgid "NAS MAC" ++#~ msgstr "Netzwerk/TUN Konfiguration" ++ ++#, fuzzy ++#~ msgid "MAC address value to use in RADIUS Called-Station-ID attribute" ++#~ msgstr "Netzwerk/TUN Konfiguration" ++ ++#, fuzzy ++#~ msgid "Allow OpenID authentication" ++#~ msgstr "Netzwerk/TUN Konfiguration" ++ ++#, fuzzy ++#~ msgid "" ++#~ "Allows OpenID authentication by sending ChilliSpot-Config=allow-" ++#~ "openidauth in RADIUS Access-Requests" ++#~ msgstr "Netzwerk/TUN Konfiguration" ++ ++#, fuzzy ++#~ msgid "RADIUS accounting port" ++#~ msgstr "Netzwerk/TUN Konfiguration" ++ ++#, fuzzy ++#~ msgid "" ++#~ "The UDP port number to use for radius accounting requests (default 1813)" ++#~ msgstr "Netzwerk/TUN Konfiguration" ++ ++#, fuzzy ++#~ msgid "RADIUS authentication port" ++#~ msgstr "Netzwerk/TUN Konfiguration" ++ ++#, fuzzy ++#~ msgid "" ++#~ "The UDP port number to use for radius authentication requests (default " ++#~ "1812)" ++#~ msgstr "Netzwerk/TUN Konfiguration" ++ ++#, fuzzy ++#~ msgid "Option radiuscalled" ++#~ msgstr "Netzwerk/TUN Konfiguration" ++ ++#, fuzzy ++#~ msgid "RADIUS listen address" ++#~ msgstr "Netzwerk/TUN Konfiguration" ++ ++#, fuzzy ++#~ msgid "Local interface IP address to use for the radius interface" ++#~ msgstr "Netzwerk/TUN Konfiguration" ++ ++#, fuzzy ++#~ msgid "RADIUS location ID" ++#~ msgstr "Netzwerk/TUN Konfiguration" ++ ++#, fuzzy ++#~ msgid "WISPr Location ID" ++#~ msgstr "Netzwerk/TUN Konfiguration" ++ ++#, fuzzy ++#~ msgid "RADIUS location name" ++#~ msgstr "Netzwerk/TUN Konfiguration" ++ ++#, fuzzy ++#~ msgid "WISPr Location Name" ++#~ msgstr "Netzwerk/TUN Konfiguration" ++ ++#, fuzzy ++#~ msgid "NAS ID" ++#~ msgstr "Netzwerk/TUN Konfiguration" ++ ++#, fuzzy ++#~ msgid "Network access server identifier" ++#~ msgstr "Netzwerk/TUN Konfiguration" ++ ++#, fuzzy ++#~ msgid "Option radiusnasip" ++#~ msgstr "Netzwerk/TUN Konfiguration" ++ ++#, fuzzy ++#~ msgid "NAS port type" ++#~ msgstr "Netzwerk/TUN Konfiguration" ++ ++#, fuzzy ++#~ msgid "" ++#~ "Value of NAS-Port-Type attribute. Defaults to 19 (Wireless-IEEE-802.11)" ++#~ msgstr "Netzwerk/TUN Konfiguration" ++ ++#, fuzzy ++#~ msgid "Send RADIUS VSA" ++#~ msgstr "Netzwerk/TUN Konfiguration" ++ ++#, fuzzy ++#~ msgid "Send the ChilliSpot-OriginalURL RADIUS VSA in Access-Request" ++#~ msgstr "Netzwerk/TUN Konfiguration" ++ ++#, fuzzy ++#~ msgid "RADIUS secret" ++#~ msgstr "Netzwerk/TUN Konfiguration" ++ ++#, fuzzy ++#~ msgid "Radius shared secret for both servers" ++#~ msgstr "Netzwerk/TUN Konfiguration" ++ ++#, fuzzy ++#~ msgid "RADIUS server 1" ++#~ msgstr "Netzwerk/TUN Konfiguration" ++ ++#, fuzzy ++#~ msgid "The IP address of radius server 1" ++#~ msgstr "Netzwerk/TUN Konfiguration" ++ ++#, fuzzy ++#~ msgid "RADIUS server 2" ++#~ msgstr "Netzwerk/TUN Konfiguration" ++ ++#, fuzzy ++#~ msgid "The IP address of radius server 2" ++#~ msgstr "Netzwerk/TUN Konfiguration" ++ ++#, fuzzy ++#~ msgid "Swap octets" ++#~ msgstr "Netzwerk/TUN Konfiguration" ++ ++#, fuzzy ++#~ msgid "" ++#~ "Swap the meaning of \"input octets\" and \"output octets\" as it related " ++#~ "to RADIUS attribtues" ++#~ msgstr "Netzwerk/TUN Konfiguration" ++ ++#, fuzzy ++#~ msgid "Allow WPA guests" ++#~ msgstr "Netzwerk/TUN Konfiguration" ++ ++#, fuzzy ++#~ msgid "" ++#~ "Allows WPA Guest authentication by sending ChilliSpot-Config=allow-wpa-" ++#~ "guests in RADIUS Access-Requests" ++#~ msgstr "Netzwerk/TUN Konfiguration" ++ ++#, fuzzy ++#~ msgid "UAM configuration" ++#~ msgstr "TUN/TAP Konfiguration" ++ ++#, fuzzy ++#~ msgid "Unified Configuration Method settings" ++#~ msgstr "Netzwerk/TUN Konfiguration" ++ ++#, fuzzy ++#~ msgid "Inspect DNS traffic" ++#~ msgstr "Netzwerk/TUN Konfiguration" ++ ++#, fuzzy ++#~ msgid "" ++#~ "Inspect DNS packets and drop responses with any non- A, CNAME, SOA, or MX " ++#~ "records to prevent dns tunnels (experimental)" ++#~ msgstr "Netzwerk/TUN Konfiguration" ++ ++#, fuzzy ++#~ msgid "Local users file" ++#~ msgstr "Domain Name" ++ ++#, fuzzy ++#~ msgid "" ++#~ "A colon seperated file containing usernames and passwords of locally " ++#~ "authenticated users" ++#~ msgstr "Netzwerk/TUN Konfiguration" ++ ++#, fuzzy ++#~ msgid "Human readable location name used in JSON interface" ++#~ msgstr "Netzwerk/TUN Konfiguration" ++ ++#, fuzzy ++#~ msgid "Do not redirect to UAM server" ++#~ msgstr "Domain Name" ++ ++#, fuzzy ++#~ msgid "" ++#~ "Do not return to UAM server on login success, just redirect to original " ++#~ "URL" ++#~ msgstr "Netzwerk/TUN Konfiguration" ++ ++#, fuzzy ++#~ msgid "Do not do WISPr" ++#~ msgstr "Domain Name" ++ ++#, fuzzy ++#~ msgid "Do not do any WISPr XML, assume the back-end is doing this instead" ++#~ msgstr "Netzwerk/TUN Konfiguration" ++ ++#, fuzzy ++#~ msgid "Allowed resources" ++#~ msgstr "Domain Name" ++ ++#, fuzzy ++#~ msgid "List of resources the client can access without first authenticating" ++#~ msgstr "Netzwerk/TUN Konfiguration" ++ ++#, fuzzy ++#~ msgid "Allow any DNS server" ++#~ msgstr "Domain Name" ++ ++#, fuzzy ++#~ msgid "Allow any DNS server for unauthenticated clients" ++#~ msgstr "Domain Name" ++ ++#, fuzzy ++#~ msgid "Allow any IP address" ++#~ msgstr "Domain Name" ++ ++#, fuzzy ++#~ msgid "" ++#~ "Allow clients to use any IP settings they wish by spoofing ARP " ++#~ "(experimental)" ++#~ msgstr "Netzwerk/TUN Konfiguration" ++ ++#, fuzzy ++#~ msgid "Allowed domains" ++#~ msgstr "Domain Name" ++ ++#, fuzzy ++#~ msgid "" ++#~ "Defines a list of domain names to automatically add to the walled garden" ++#~ msgstr "Domain Name" ++ ++#, fuzzy ++#~ msgid "UAM homepage" ++#~ msgstr "Domain Name" ++ ++#, fuzzy ++#~ msgid "URL of homepage to redirect unauthenticated users to" ++#~ msgstr "Domain Name" ++ ++#, fuzzy ++#~ msgid "UAM static content port" ++#~ msgstr "Domain Name" ++ ++#, fuzzy ++#~ msgid "TCP port to bind to for only serving embedded content" ++#~ msgstr "Domain Name" ++ ++#, fuzzy ++#~ msgid "UAM listening address" ++#~ msgstr "Domain Name" ++ ++#, fuzzy ++#~ msgid "IP address to listen to for authentication of clients" ++#~ msgstr "Domain Name" ++ ++#, fuzzy ++#~ msgid "UAM logout IP" ++#~ msgstr "Domain Name" ++ ++#, fuzzy ++#~ msgid "" ++#~ "Use this IP address to instantly logout a client accessing it (defaults " ++#~ "to 1.1.1.1)" ++#~ msgstr "Domain Name" ++ ++#, fuzzy ++#~ msgid "UAM listening port" ++#~ msgstr "Domain Name" ++ ++#, fuzzy ++#~ msgid "TCP port to bind to for authenticating clients (default 3990)" ++#~ msgstr "Netzwerk/TUN Konfiguration" ++ ++#, fuzzy ++#~ msgid "UAM secret" ++#~ msgstr "Domain Name" ++ ++#, fuzzy ++#~ msgid "Shared secret between uamserver and chilli" ++#~ msgstr "Domain Name" ++ ++#, fuzzy ++#~ msgid "UAM server" ++#~ msgstr "Domain Name" ++ ++#, fuzzy ++#~ msgid "URL of web server to use for authenticating clients" ++#~ msgstr "Domain Name" ++ ++#, fuzzy ++#~ msgid "UAM user interface" ++#~ msgstr "Domain Name" ++ ++#, fuzzy ++#~ msgid "" ++#~ "An init.d style program to handle local content on the uamuiport web " ++#~ "server" ++#~ msgstr "Netzwerk/TUN Konfiguration" ++ ++#, fuzzy ++#~ msgid "WISPr login url" ++#~ msgstr "Netzwerk/TUN Konfiguration" ++ ++#, fuzzy ++#~ msgid "Specific URL to be given in WISPr XML LoginURL" ++#~ msgstr "Netzwerk/TUN Konfiguration" ++ ++#, fuzzy ++#~ msgid "CGI program" ++#~ msgstr "Domain Name" ++ ++#, fuzzy ++#~ msgid "" ++#~ "Executable to run as a CGI type program (like haserl) for URLs with " ++#~ "extention .chi" ++#~ msgstr "Netzwerk/TUN Konfiguration" ++ ++#, fuzzy ++#~ msgid "Web content directory" ++#~ msgstr "Domain Name" ++ ++#, fuzzy ++#~ msgid "Directory where embedded local web content is placed" ++#~ msgstr "Netzwerk/TUN Konfiguration" ++ ++#, fuzzy ++#~ msgid "MAC configuration" ++#~ msgstr "Netzwerk/TUN Konfiguration" ++ ++#, fuzzy ++#~ msgid "Configure MAC authentication" ++#~ msgstr "Netzwerk/TUN Konfiguration" ++ ++#, fuzzy ++#~ msgid "Allowed MAC addresses" ++#~ msgstr "Netzwerk/TUN Konfiguration" ++ ++#, fuzzy ++#~ msgid "List of MAC addresses for which MAC authentication will be performed" ++#~ msgstr "Netzwerk/TUN Konfiguration" ++ ++#, fuzzy ++#~ msgid "Authenticate locally allowed MACs" ++#~ msgstr "Netzwerk/TUN Konfiguration" ++ ++#, fuzzy ++#~ msgid "Authenticate allowed MAC addresses without the use of RADIUS" ++#~ msgstr "Netzwerk/TUN Konfiguration" ++ ++#, fuzzy ++#~ msgid "Enable MAC authentification" ++#~ msgstr "Netzwerk/TUN Konfiguration" ++ ++#, fuzzy ++#~ msgid "Try to authenticate all users based on their mac address alone" ++#~ msgstr "Netzwerk/TUN Konfiguration" ++ ++#, fuzzy ++#~ msgid "Password" ++#~ msgstr "Netzwerk/TUN Konfiguration" ++ ++#, fuzzy ++#~ msgid "Password used when performing MAC authentication" ++#~ msgstr "Netzwerk/TUN Konfiguration" ++ ++#, fuzzy ++#~ msgid "Suffix" ++#~ msgstr "Netzwerk/TUN Konfiguration" ++ ++#, fuzzy ++#~ msgid "coovachilli_macauth_macsuffix_desc" ++#~ msgstr "Netzwerk/TUN Konfiguration" +diff --git a/feeds/luci/applications/luci-app-coovachilli/po/el/coovachilli.po b/feeds/luci/applications/luci-app-coovachilli/po/el/coovachilli.po +new file mode 100644 +index 0000000..90d693d +--- /dev/null ++++ b/feeds/luci/applications/luci-app-coovachilli/po/el/coovachilli.po +@@ -0,0 +1,50 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Report-Msgid-Bugs-To: \n" ++"POT-Creation-Date: 2009-06-10 03:40+0200\n" ++"PO-Revision-Date: 2012-03-19 15:27+0200\n" ++"Last-Translator: Vasilis \n" ++"Language-Team: LANGUAGE \n" ++"Language: el\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n != 1);\n" ++"X-Generator: Pootle 2.0.4\n" ++ ++msgid "CoovaChilli" ++msgstr "CoovaChilli" ++ ++msgid "Network Configuration" ++msgstr "" ++ ++msgid "RADIUS configuration" ++msgstr "" ++ ++msgid "UAM and MAC Authentication" ++msgstr "" ++ ++#~ msgid "General configuration" ++#~ msgstr "Γενική παÏαμετÏοποίηση" ++ ++#~ msgid "DHCP configuration" ++#~ msgstr "ΠαÏαμετÏοποίηση DHCP" ++ ++#~ msgid "DHCP interface" ++#~ msgstr "Διεπαφή DHCP" ++ ++#~ msgid "Enable IEEE 802.1x" ++#~ msgstr "ΕνεÏγοποίηση IEEE 802.1x" ++ ++#~ msgid "Admin password" ++#~ msgstr "Κωδικός Ï€Ïόσβασης διαχειÏιστή" ++ ++#~ msgid "Location name" ++#~ msgstr "Όνομα τοποθεσίας" ++ ++#~ msgid "CGI program" ++#~ msgstr "ΠÏόγÏαμμα CGI" ++ ++#~ msgid "Password" ++#~ msgstr "Κωδικός Ï€Ïόσβασης" +diff --git a/feeds/luci/applications/luci-app-coovachilli/po/en/coovachilli.po b/feeds/luci/applications/luci-app-coovachilli/po/en/coovachilli.po +new file mode 100644 +index 0000000..ebaa345 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-coovachilli/po/en/coovachilli.po +@@ -0,0 +1,639 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Report-Msgid-Bugs-To: \n" ++"POT-Creation-Date: 2009-05-19 19:36+0200\n" ++"PO-Revision-Date: 2012-03-18 05:30+0200\n" ++"Last-Translator: Anonymous Pootle User\n" ++"Language-Team: LANGUAGE \n" ++"Language: en\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n != 1);\n" ++"X-Generator: Pootle 2.0.4\n" ++ ++msgid "CoovaChilli" ++msgstr "CoovaChilli" ++ ++msgid "Network Configuration" ++msgstr "" ++ ++msgid "RADIUS configuration" ++msgstr "" ++ ++msgid "UAM and MAC Authentication" ++msgstr "" ++ ++#, fuzzy ++#~ msgid "General configuration" ++#~ msgstr "General configuration" ++ ++#~ msgid "General CoovaChilli settings" ++#~ msgstr "General CoovaChilli settings" ++ ++#~ msgid "Command socket" ++#~ msgstr "Command socket" ++ ++#~ msgid "UNIX socket used for communication with chilli_query" ++#~ msgstr "UNIX socket used for communication with chilli_query" ++ ++#~ msgid "Config refresh interval" ++#~ msgstr "Config refresh interval" ++ ++#~ msgid "" ++#~ "Re-read configuration file and do DNS lookups every interval seconds. " ++#~ "This has the same effect as sending the HUP signal. If interval is 0 " ++#~ "(zero) this feature is disabled. " ++#~ msgstr "" ++#~ "Re-read configuration file and do DNS lookups every interval seconds. " ++#~ "This has the same effect as sending the HUP signal. If interval is 0 " ++#~ "(zero) this feature is disabled. " ++ ++#~ msgid "Pid file" ++#~ msgstr "Pid file" ++ ++#~ msgid "Filename to put the process id" ++#~ msgstr "Filename to put the process id" ++ ++#~ msgid "State directory" ++#~ msgstr "State directory" ++ ++#~ msgid "Directory of non-volatile data" ++#~ msgstr "Directory of non-volatile data" ++ ++#~ msgid "TUN/TAP configuration" ++#~ msgstr "TUN/TAP configuration" ++ ++#~ msgid "Network/Tun configuration" ++#~ msgstr "Network/Tun configuration" ++ ++#~ msgid "Network down script" ++#~ msgstr "Network down script" ++ ++#~ msgid "" ++#~ "Script executed after a session has moved from authorized state to " ++#~ "unauthorized" ++#~ msgstr "" ++#~ "Script executed after a session has moved from authorized state to " ++#~ "unauthorized" ++ ++#~ msgid "Network up script" ++#~ msgstr "Network up script" ++ ++#~ msgid "Script executed after the tun network interface has been brought up" ++#~ msgstr "Script executed after the tun network interface has been brought up" ++ ++#~ msgid "Primary DNS Server" ++#~ msgstr "Primary DNS Server" ++ ++#~ msgid "Secondary DNS Server" ++#~ msgstr "Secondary DNS Server" ++ ++#~ msgid "Domain name" ++#~ msgstr "Domain name" ++ ++#~ msgid "" ++#~ "Is used to inform the client about the domain name to use for DNS lookups" ++#~ msgstr "" ++#~ "Is used to inform the client about the domain name to use for DNS lookups" ++ ++#~ msgid "Dynamic IP address pool" ++#~ msgstr "Dynamic IP address pool" ++ ++#~ msgid "Specifies a pool of dynamic IP addresses" ++#~ msgstr "Specifies a pool of dynamic IP addresses" ++ ++#~ msgid "IP down script" ++#~ msgstr "IP down script" ++ ++#~ msgid "Script executed after the tun network interface has been taken down" ++#~ msgstr "Script executed after the tun network interface has been taken down" ++ ++#~ msgid "IP up script" ++#~ msgstr "IP up script" ++ ++#~ msgid "" ++#~ "Script executed after the TUN/TAP network interface has been brought up" ++#~ msgstr "" ++#~ "Script executed after the TUN/TAP network interface has been brought up" ++ ++#~ msgid "Uplink subnet" ++#~ msgstr "Uplink subnet" ++ ++#~ msgid "Network address of the uplink interface (CIDR notation)" ++#~ msgstr "Network address of the uplink interface (CIDR notation)" ++ ++#~ msgid "Static IP address pool" ++#~ msgstr "Static IP address pool" ++ ++#~ msgid "Specifies a pool of static IP addresses" ++#~ msgstr "Specifies a pool of static IP addresses" ++ ++#~ msgid "TUN/TAP device" ++#~ msgstr "TUN/TAP device" ++ ++#~ msgid "The specific device to use for the TUN/TAP interface" ++#~ msgstr "The specific device to use for the TUN/TAP interface" ++ ++#~ msgid "TX queue length" ++#~ msgstr "TX queue length" ++ ++#~ msgid "The TX queue length to set on the TUN/TAP interface" ++#~ msgstr "The TX queue length to set on the TUN/TAP interface" ++ ++#~ msgid "Use TAP device" ++#~ msgstr "Use TAP device" ++ ++#~ msgid "Use the TAP interface instead of TUN" ++#~ msgstr "Use the TAP interface instead of TUN" ++ ++#~ msgid "DHCP configuration" ++#~ msgstr "DHCP configuration" ++ ++#~ msgid "Set DHCP options for connecting clients" ++#~ msgstr "Set DHCP options for connecting clients" ++ ++#~ msgid "DHCP end number" ++#~ msgstr "DHCP end number" ++ ++#~ msgid "Where to stop assigning IP addresses (default 254)" ++#~ msgstr "Where to stop assigning IP addresses (default 254)" ++ ++#~ msgid "DHCP interface" ++#~ msgstr "DHCP interface" ++ ++#~ msgid "Ethernet interface to listen to for the downlink interface" ++#~ msgstr "Ethernet interface to listen to for the downlink interface" ++ ++#~ msgid "Listen MAC address" ++#~ msgstr "Listen MAC address" ++ ++#~ msgid "" ++#~ "MAC address to listen to. If not specified the MAC address of the " ++#~ "interface will be used" ++#~ msgstr "" ++#~ "MAC address to listen to. If not specified the MAC address of the " ++#~ "interface will be used" ++ ++#~ msgid "DHCP start number" ++#~ msgstr "DHCP start number" ++ ++#~ msgid "Where to start assigning IP addresses (default 10)" ++#~ msgstr "Where to start assigning IP addresses (default 10)" ++ ++#~ msgid "Enable IEEE 802.1x" ++#~ msgstr "Enable IEEE 802.1x" ++ ++#~ msgid "Enable IEEE 802.1x authentication and listen for EAP requests" ++#~ msgstr "Enable IEEE 802.1x authentication and listen for EAP requests" ++ ++#~ msgid "Leasetime" ++#~ msgstr "Leasetime" ++ ++#~ msgid "Use a DHCP lease of seconds (default 600)" ++#~ msgstr "Use a DHCP lease of seconds (default 600)" ++ ++#~ msgid "Allow session update through RADIUS" ++#~ msgstr "Allow session update through RADIUS" ++ ++#~ msgid "" ++#~ "Allow updating of session parameters with RADIUS attributes sent in " ++#~ "Accounting-Response" ++#~ msgstr "" ++#~ "Allow updating of session parameters with RADIUS attributes sent in " ++#~ "Accounting-Response" ++ ++#~ msgid "Admin password" ++#~ msgstr "Admin password" ++ ++#~ msgid "" ++#~ "Password to use for Administrative-User authentication in order to pick " ++#~ "up chilli configurations and establish a device \"system\" session" ++#~ msgstr "" ++#~ "Password to use for Administrative-User authentication in order to pick " ++#~ "up chilli configurations and establish a device \"system\" session" ++ ++#~ msgid "Admin user" ++#~ msgstr "Admin user" ++ ++#~ msgid "" ++#~ "User-name to use for Administrative-User authentication in order to pick " ++#~ "up chilli configurations and establish a device \"system\" session" ++#~ msgstr "" ++#~ "User-name to use for Administrative-User authentication in order to pick " ++#~ "up chilli configurations and establish a device \"system\" session" ++ ++#~ msgid "Do not check disconnection requests" ++#~ msgstr "Do not check disconnection requests" ++ ++#~ msgid "Do not check the source IP address of radius disconnect requests" ++#~ msgstr "Do not check the source IP address of radius disconnect requests" ++ ++#~ msgid "RADIUS disconnect port" ++#~ msgstr "RADIUS disconnect port" ++ ++#~ msgid "UDP port to listen to for accepting radius disconnect requests" ++#~ msgstr "UDP port to listen to for accepting radius disconnect requests" ++ ++#~ msgid "NAS IP" ++#~ msgstr "NAS IP" ++ ++#~ msgid "Value to use in RADIUS NAS-IP-Address attribute" ++#~ msgstr "Value to use in RADIUS NAS-IP-Address attribute" ++ ++#~ msgid "NAS MAC" ++#~ msgstr "NAS MAC" ++ ++#~ msgid "MAC address value to use in RADIUS Called-Station-ID attribute" ++#~ msgstr "MAC address value to use in RADIUS Called-Station-ID attribute" ++ ++#~ msgid "Allow OpenID authentication" ++#~ msgstr "Allow OpenID authentication" ++ ++#~ msgid "" ++#~ "Allows OpenID authentication by sending ChilliSpot-Config=allow-" ++#~ "openidauth in RADIUS Access-Requests" ++#~ msgstr "" ++#~ "Allows OpenID authentication by sending ChilliSpot-Config=allow-" ++#~ "openidauth in RADIUS Access-Requests" ++ ++#~ msgid "RADIUS accounting port" ++#~ msgstr "RADIUS accounting port" ++ ++#~ msgid "" ++#~ "The UDP port number to use for radius accounting requests (default 1813)" ++#~ msgstr "" ++#~ "The UDP port number to use for radius accounting requests (default 1813)" ++ ++#~ msgid "RADIUS authentication port" ++#~ msgstr "RADIUS authentication port" ++ ++#~ msgid "" ++#~ "The UDP port number to use for radius authentication requests (default " ++#~ "1812)" ++#~ msgstr "" ++#~ "The UDP port number to use for radius authentication requests (default " ++#~ "1812)" ++ ++#~ msgid "Option radiuscalled" ++#~ msgstr "Option radiuscalled" ++ ++#~ msgid "RADIUS listen address" ++#~ msgstr "RADIUS listen address" ++ ++#~ msgid "Local interface IP address to use for the radius interface" ++#~ msgstr "Local interface IP address to use for the radius interface" ++ ++#~ msgid "RADIUS location ID" ++#~ msgstr "RADIUS location ID" ++ ++#~ msgid "WISPr Location ID" ++#~ msgstr "WISPr Location ID" ++ ++#~ msgid "RADIUS location name" ++#~ msgstr "RADIUS location name" ++ ++#~ msgid "WISPr Location Name" ++#~ msgstr "WISPr Location Name" ++ ++#~ msgid "NAS ID" ++#~ msgstr "NAS ID" ++ ++#~ msgid "Network access server identifier" ++#~ msgstr "Network access server identifier" ++ ++#~ msgid "Option radiusnasip" ++#~ msgstr "Option radiusnasip" ++ ++#~ msgid "NAS port type" ++#~ msgstr "NAS port type" ++ ++#~ msgid "" ++#~ "Value of NAS-Port-Type attribute. Defaults to 19 (Wireless-IEEE-802.11)" ++#~ msgstr "" ++#~ "Value of NAS-Port-Type attribute. Defaults to 19 (Wireless-IEEE-802.11)" ++ ++#~ msgid "Send RADIUS VSA" ++#~ msgstr "Send RADIUS VSA" ++ ++#~ msgid "Send the ChilliSpot-OriginalURL RADIUS VSA in Access-Request" ++#~ msgstr "Send the ChilliSpot-OriginalURL RADIUS VSA in Access-Request" ++ ++#~ msgid "RADIUS secret" ++#~ msgstr "RADIUS secret" ++ ++#~ msgid "Radius shared secret for both servers" ++#~ msgstr "Radius shared secret for both servers" ++ ++#~ msgid "RADIUS server 1" ++#~ msgstr "RADIUS server 1" ++ ++#~ msgid "The IP address of radius server 1" ++#~ msgstr "The IP address of radius server 1" ++ ++#~ msgid "RADIUS server 2" ++#~ msgstr "RADIUS server 2" ++ ++#~ msgid "The IP address of radius server 2" ++#~ msgstr "The IP address of radius server 2" ++ ++#~ msgid "Swap octets" ++#~ msgstr "Swap octets" ++ ++#~ msgid "" ++#~ "Swap the meaning of \"input octets\" and \"output octets\" as it related " ++#~ "to RADIUS attribtues" ++#~ msgstr "" ++#~ "Swap the meaning of \"input octets\" and \"output octets\" as it related " ++#~ "to RADIUS attribtues" ++ ++#~ msgid "Allow WPA guests" ++#~ msgstr "Allow WPA guests" ++ ++#~ msgid "" ++#~ "Allows WPA Guest authentication by sending ChilliSpot-Config=allow-wpa-" ++#~ "guests in RADIUS Access-Requests" ++#~ msgstr "" ++#~ "Allows WPA Guest authentication by sending ChilliSpot-Config=allow-wpa-" ++#~ "guests in RADIUS Access-Requests" ++ ++#~ msgid "Proxy client" ++#~ msgstr "Proxy client" ++ ++#~ msgid "" ++#~ "IP address from which radius requests are accepted. If omitted the server " ++#~ "will not accept radius requests" ++#~ msgstr "" ++#~ "IP address from which radius requests are accepted. If omitted the server " ++#~ "will not accept radius requests" ++ ++#~ msgid "Proxy listen address" ++#~ msgstr "Proxy listen address" ++ ++#~ msgid "Local interface IP address to use for accepting radius requests" ++#~ msgstr "Local interface IP address to use for accepting radius requests" ++ ++#~ msgid "Proxy port" ++#~ msgstr "Proxy port" ++ ++#~ msgid "UDP Port to listen to for accepting radius requests" ++#~ msgstr "UDP Port to listen to for accepting radius requests" ++ ++#~ msgid "Proxy secret" ++#~ msgstr "Proxy secret" ++ ++#~ msgid "Radius shared secret for clients" ++#~ msgstr "Radius shared secret for clients" ++ ++#~ msgid "UAM configuration" ++#~ msgstr "UAM configuration" ++ ++#~ msgid "Unified Configuration Method settings" ++#~ msgstr "Unified Configuration Method settings" ++ ++#~ msgid "Use Chilli XML" ++#~ msgstr "Use Chilli XML" ++ ++#~ msgid "Return the so-called Chilli XML along with WISPr XML" ++#~ msgstr "Return the so-called Chilli XML along with WISPr XML" ++ ++#~ msgid "Default idle timeout" ++#~ msgstr "Default idle timeout" ++ ++#~ msgid "Default idle timeout unless otherwise set by RADIUS (defaults to 0)" ++#~ msgstr "Default idle timeout unless otherwise set by RADIUS (defaults to 0)" ++ ++#~ msgid "Default interim interval" ++#~ msgstr "Default interim interval" ++ ++#~ msgid "" ++#~ "Default interim-interval for RADIUS accounting unless otherwise set by " ++#~ "RADIUS (defaults to 0)" ++#~ msgstr "" ++#~ "Default interim-interval for RADIUS accounting unless otherwise set by " ++#~ "RADIUS (defaults to 0)" ++ ++#~ msgid "Default session timeout" ++#~ msgstr "Default session timeout" ++ ++#~ msgid "" ++#~ "Default session timeout unless otherwise set by RADIUS (defaults to 0)" ++#~ msgstr "" ++#~ "Default session timeout unless otherwise set by RADIUS (defaults to 0)" ++ ++#~ msgid "Inspect DNS traffic" ++#~ msgstr "Inspect DNS traffic" ++ ++#~ msgid "" ++#~ "Inspect DNS packets and drop responses with any non- A, CNAME, SOA, or MX " ++#~ "records to prevent dns tunnels (experimental)" ++#~ msgstr "" ++#~ "Inspect DNS packets and drop responses with any non- A, CNAME, SOA, or MX " ++#~ "records to prevent dns tunnels (experimental)" ++ ++#~ msgid "Local users file" ++#~ msgstr "Local users file" ++ ++#~ msgid "" ++#~ "A colon seperated file containing usernames and passwords of locally " ++#~ "authenticated users" ++#~ msgstr "" ++#~ "A colon seperated file containing usernames and passwords of locally " ++#~ "authenticated users" ++ ++#~ msgid "Location name" ++#~ msgstr "Location name" ++ ++#~ msgid "Human readable location name used in JSON interface" ++#~ msgstr "Human readable location name used in JSON interface" ++ ++#~ msgid "Do not redirect to UAM server" ++#~ msgstr "Do not redirect to UAM server" ++ ++#~ msgid "" ++#~ "Do not return to UAM server on login success, just redirect to original " ++#~ "URL" ++#~ msgstr "" ++#~ "Do not return to UAM server on login success, just redirect to original " ++#~ "URL" ++ ++#~ msgid "Do not do WISPr" ++#~ msgstr "Do not do WISPr" ++ ++#~ msgid "Do not do any WISPr XML, assume the back-end is doing this instead" ++#~ msgstr "Do not do any WISPr XML, assume the back-end is doing this instead" ++ ++#~ msgid "Post auth proxy" ++#~ msgstr "Post auth proxy" ++ ++#~ msgid "" ++#~ "Used with postauthproxyport to define a post authentication HTTP proxy " ++#~ "server" ++#~ msgstr "" ++#~ "Used with postauthproxyport to define a post authentication HTTP proxy " ++#~ "server" ++ ++#~ msgid "Post auth proxy port" ++#~ msgstr "Post auth proxy port" ++ ++#~ msgid "" ++#~ "Used with postauthproxy to define a post authentication HTTP proxy server" ++#~ msgstr "" ++#~ "Used with postauthproxy to define a post authentication HTTP proxy server" ++ ++#~ msgid "Allowed resources" ++#~ msgstr "Allowed resources" ++ ++#~ msgid "List of resources the client can access without first authenticating" ++#~ msgstr "" ++#~ "List of resources the client can access without first authenticating" ++ ++#~ msgid "Allow any DNS server" ++#~ msgstr "Allow any DNS server" ++ ++#~ msgid "Allow any DNS server for unauthenticated clients" ++#~ msgstr "Allow any DNS server for unauthenticated clients" ++ ++#~ msgid "Allow any IP address" ++#~ msgstr "Allow any IP address" ++ ++#~ msgid "" ++#~ "Allow clients to use any IP settings they wish by spoofing ARP " ++#~ "(experimental)" ++#~ msgstr "" ++#~ "Allow clients to use any IP settings they wish by spoofing ARP " ++#~ "(experimental)" ++ ++#~ msgid "Allowed domains" ++#~ msgstr "Allowed domains" ++ ++#~ msgid "" ++#~ "Defines a list of domain names to automatically add to the walled garden" ++#~ msgstr "" ++#~ "Defines a list of domain names to automatically add to the walled garden" ++ ++#~ msgid "UAM homepage" ++#~ msgstr "UAM homepage" ++ ++#~ msgid "URL of homepage to redirect unauthenticated users to" ++#~ msgstr "URL of homepage to redirect unauthenticated users to" ++ ++#~ msgid "UAM static content port" ++#~ msgstr "UAM static content port" ++ ++#~ msgid "TCP port to bind to for only serving embedded content" ++#~ msgstr "TCP port to bind to for only serving embedded content" ++ ++#~ msgid "UAM listening address" ++#~ msgstr "UAM listening address" ++ ++#~ msgid "IP address to listen to for authentication of clients" ++#~ msgstr "IP address to listen to for authentication of clients" ++ ++#~ msgid "UAM logout IP" ++#~ msgstr "UAM logout IP" ++ ++#~ msgid "" ++#~ "Use this IP address to instantly logout a client accessing it (defaults " ++#~ "to 1.1.1.1)" ++#~ msgstr "" ++#~ "Use this IP address to instantly logout a client accessing it (defaults " ++#~ "to 1.1.1.1)" ++ ++#~ msgid "UAM listening port" ++#~ msgstr "UAM listening port" ++ ++#~ msgid "TCP port to bind to for authenticating clients (default 3990)" ++#~ msgstr "TCP port to bind to for authenticating clients (default 3990)" ++ ++#~ msgid "UAM secret" ++#~ msgstr "UAM secret" ++ ++#~ msgid "Shared secret between uamserver and chilli" ++#~ msgstr "Shared secret between uamserver and chilli" ++ ++#~ msgid "UAM server" ++#~ msgstr "UAM server" ++ ++#~ msgid "URL of web server to use for authenticating clients" ++#~ msgstr "URL of web server to use for authenticating clients" ++ ++#~ msgid "UAM user interface" ++#~ msgstr "UAM user interface" ++ ++#~ msgid "" ++#~ "An init.d style program to handle local content on the uamuiport web " ++#~ "server" ++#~ msgstr "" ++#~ "An init.d style program to handle local content on the uamuiport web " ++#~ "server" ++ ++#~ msgid "Use status file" ++#~ msgstr "Use status file" ++ ++#~ msgid "" ++#~ "Write the status of clients in a non-volatile state file (experimental)" ++#~ msgstr "" ++#~ "Write the status of clients in a non-volatile state file (experimental)" ++ ++#~ msgid "WISPr login url" ++#~ msgstr "WISPr login url" ++ ++#~ msgid "Specific URL to be given in WISPr XML LoginURL" ++#~ msgstr "Specific URL to be given in WISPr XML LoginURL" ++ ++#~ msgid "CGI program" ++#~ msgstr "CGI program" ++ ++#~ msgid "" ++#~ "Executable to run as a CGI type program (like haserl) for URLs with " ++#~ "extention .chi" ++#~ msgstr "" ++#~ "Executable to run as a CGI type program (like haserl) for URLs with " ++#~ "extention .chi" ++ ++#~ msgid "Web content directory" ++#~ msgstr "Web content directory" ++ ++#~ msgid "Directory where embedded local web content is placed" ++#~ msgstr "Directory where embedded local web content is placed" ++ ++#~ msgid "MAC configuration" ++#~ msgstr "MAC configuration" ++ ++#~ msgid "Configure MAC authentication" ++#~ msgstr "Configure MAC authentication" ++ ++#~ msgid "Allowed MAC addresses" ++#~ msgstr "Allowed MAC addresses" ++ ++#~ msgid "List of MAC addresses for which MAC authentication will be performed" ++#~ msgstr "" ++#~ "List of MAC addresses for which MAC authentication will be performed" ++ ++#~ msgid "Authenticate locally allowed MACs" ++#~ msgstr "Authenticate locally allowed MACs" ++ ++#~ msgid "Authenticate allowed MAC addresses without the use of RADIUS" ++#~ msgstr "Authenticate allowed MAC addresses without the use of RADIUS" ++ ++#~ msgid "Enable MAC authentification" ++#~ msgstr "Enable MAC authentification" ++ ++#~ msgid "Try to authenticate all users based on their mac address alone" ++#~ msgstr "Try to authenticate all users based on their mac address alone" ++ ++#~ msgid "Password" ++#~ msgstr "Password" ++ ++#~ msgid "Password used when performing MAC authentication" ++#~ msgstr "Password used when performing MAC authentication" ++ ++#~ msgid "Suffix" ++#~ msgstr "Suffix" ++ ++#~ msgid "coovachilli_macauth_macsuffix_desc" ++#~ msgstr "" ++#~ "Suffix to add to the MAC address in order to form the User-Name, which is " ++#~ "sent to the radius server" +diff --git a/feeds/luci/applications/luci-app-coovachilli/po/es/coovachilli.po b/feeds/luci/applications/luci-app-coovachilli/po/es/coovachilli.po +new file mode 100644 +index 0000000..886da59 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-coovachilli/po/es/coovachilli.po +@@ -0,0 +1,113 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Report-Msgid-Bugs-To: \n" ++"POT-Creation-Date: 2009-06-10 03:41+0200\n" ++"PO-Revision-Date: 2012-07-28 23:18+0200\n" ++"Last-Translator: Daniel \n" ++"Language-Team: LANGUAGE \n" ++"Language: es\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n != 1);\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "CoovaChilli" ++msgstr "CoovaChilli" ++ ++msgid "Network Configuration" ++msgstr "Configuración de Red" ++ ++msgid "RADIUS configuration" ++msgstr "Configuración RADIUS" ++ ++msgid "UAM and MAC Authentication" ++msgstr "Autenticación UAM y MAC" ++ ++#~ msgid "General configuration" ++#~ msgstr "Configuración General" ++ ++#~ msgid "General CoovaChilli settings" ++#~ msgstr "Configuración General de CoovaChilli" ++ ++#~ msgid "Command socket" ++#~ msgstr "Socket de Comando" ++ ++#~ msgid "UNIX socket used for communication with chilli_query" ++#~ msgstr "SocketUNIX utilizado para comunicación con chilli_query" ++ ++#~ msgid "Config refresh interval" ++#~ msgstr "Configuración del intervalo de refresco " ++ ++#~ msgid "" ++#~ "Re-read configuration file and do DNS lookups every interval seconds. " ++#~ "This has the same effect as sending the HUP signal. If interval is 0 " ++#~ "(zero) this feature is disabled. " ++#~ msgstr "" ++#~ "Vuelve a leer el fichero de configuracion y las consultas DNS cada " ++#~ "intervalo de segundos. Eso tiene el mismo efecto que enviar la señal HUP. " ++#~ "Si el intervalo es 0 (cero) se inhabilita la función." ++ ++#~ msgid "Pid file" ++#~ msgstr "Fichero Pid" ++ ++#~ msgid "Filename to put the process id" ++#~ msgstr "Nombre de archivo donde poner el ID del proceso" ++ ++#~ msgid "State directory" ++#~ msgstr "Directorio de estado" ++ ++#~ msgid "Directory of non-volatile data" ++#~ msgstr "Directorio de datos no volátiles" ++ ++#~ msgid "TUN/TAP configuration" ++#~ msgstr "Configuración TUN / TAP" ++ ++#~ msgid "Network/Tun configuration" ++#~ msgstr "Configuración de Red / Tun" ++ ++#~ msgid "" ++#~ "Script executed after a session has moved from authorized state to " ++#~ "unauthorized" ++#~ msgstr "" ++#~ "Script ejecutado cuando el estado de una sesión es alterado de autorizado " ++#~ "a no autorizado" ++ ++#~ msgid "Network up script" ++#~ msgstr "Script de subida de red" ++ ++#~ msgid "Script executed after the tun network interface has been brought up" ++#~ msgstr "" ++#~ "Script ejecutado después de que la interfaz de red tun haya sido " ++#~ "levantado." ++ ++#~ msgid "Primary DNS Server" ++#~ msgstr "Servidor DNS primario" ++ ++#~ msgid "Secondary DNS Server" ++#~ msgstr "Servidor DNS secundario" ++ ++#~ msgid "Domain name" ++#~ msgstr "Nombre de dominio" ++ ++#~ msgid "" ++#~ "Is used to inform the client about the domain name to use for DNS lookups" ++#~ msgstr "" ++#~ "Se utiliza para informar al cliente sobre el nombre de dominio a utilizar " ++#~ "para las consultas DNS" ++ ++#~ msgid "Dynamic IP address pool" ++#~ msgstr "Conjunto de direcciones IP Dinámicas" ++ ++#~ msgid "Specifies a pool of dynamic IP addresses" ++#~ msgstr "Especifica un conjunto de direcciones IP Dinámicas" ++ ++#~ msgid "IP down script" ++#~ msgstr "Scripts de bajada IP" ++ ++#~ msgid "Script executed after the tun network interface has been taken down" ++#~ msgstr "Script ejecutado después de que la red de interfaz tun sea bajado" ++ ++#~ msgid "IP up script" ++#~ msgstr "Script de subida IP" +diff --git a/feeds/luci/applications/luci-app-coovachilli/po/fr/coovachilli.po b/feeds/luci/applications/luci-app-coovachilli/po/fr/coovachilli.po +new file mode 100644 +index 0000000..b95bb44 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-coovachilli/po/fr/coovachilli.po +@@ -0,0 +1,26 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Report-Msgid-Bugs-To: \n" ++"POT-Creation-Date: 2009-05-19 19:36+0200\n" ++"PO-Revision-Date: 2012-11-06 13:16+0200\n" ++"Last-Translator: hogsim \n" ++"Language-Team: LANGUAGE \n" ++"Language: fr\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n > 1);\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "CoovaChilli" ++msgstr "CoovaChilli" ++ ++msgid "Network Configuration" ++msgstr "Configuration Réseau" ++ ++msgid "RADIUS configuration" ++msgstr "Configuration RADIUS" ++ ++msgid "UAM and MAC Authentication" ++msgstr "Authentification UAM et MAC" +diff --git a/feeds/luci/applications/luci-app-coovachilli/po/he/coovachilli.po b/feeds/luci/applications/luci-app-coovachilli/po/he/coovachilli.po +new file mode 100644 +index 0000000..04efb54 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-coovachilli/po/he/coovachilli.po +@@ -0,0 +1,26 @@ ++# coovachilli.pot ++# generated from ./applications/luci-coovachilli/luasrc/i18n/coovachilli.en.lua ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"PO-Revision-Date: 2012-09-10 03:37+0200\n" ++"Last-Translator: Snoof \n" ++"Language-Team: none\n" ++"Language: he\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n != 1);\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "CoovaChilli" ++msgstr "" ++ ++msgid "Network Configuration" ++msgstr "תצורת רשת" ++ ++msgid "RADIUS configuration" ++msgstr "" ++ ++msgid "UAM and MAC Authentication" ++msgstr "×ימות UAM ן- MAC" +diff --git a/feeds/luci/applications/luci-app-coovachilli/po/hu/coovachilli.po b/feeds/luci/applications/luci-app-coovachilli/po/hu/coovachilli.po +new file mode 100644 +index 0000000..5ac8278 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-coovachilli/po/hu/coovachilli.po +@@ -0,0 +1,26 @@ ++# coovachilli.pot ++# generated from ./applications/luci-coovachilli/luasrc/i18n/coovachilli.en.lua ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"PO-Revision-Date: 2012-07-05 16:44+0200\n" ++"Last-Translator: Gyula \n" ++"Language-Team: none\n" ++"Language: hu\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n != 1);\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "CoovaChilli" ++msgstr "CoovaChilli" ++ ++msgid "Network Configuration" ++msgstr "Hálózati konfiguráció" ++ ++msgid "RADIUS configuration" ++msgstr "RADIUS konfiguráció" ++ ++msgid "UAM and MAC Authentication" ++msgstr "UAM és MAC azonosítás" +diff --git a/feeds/luci/applications/luci-app-coovachilli/po/it/coovachilli.po b/feeds/luci/applications/luci-app-coovachilli/po/it/coovachilli.po +new file mode 100644 +index 0000000..dbf5b96 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-coovachilli/po/it/coovachilli.po +@@ -0,0 +1,75 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Report-Msgid-Bugs-To: \n" ++"POT-Creation-Date: 2009-06-10 03:40+0200\n" ++"PO-Revision-Date: 2013-02-03 13:43+0200\n" ++"Last-Translator: Francesco <3gasas@gmail.com>\n" ++"Language-Team: LANGUAGE \n" ++"Language: it\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n != 1);\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "CoovaChilli" ++msgstr "CoovaChilli" ++ ++msgid "Network Configuration" ++msgstr "Configurazione della Rete" ++ ++msgid "RADIUS configuration" ++msgstr "Configurazione RAGGIO" ++ ++msgid "UAM and MAC Authentication" ++msgstr "Autenticazione UAM e MAC" ++ ++#~ msgid "General configuration" ++#~ msgstr "Configurazione generale" ++ ++#~ msgid "General CoovaChilli settings" ++#~ msgstr "Impostazioni generali di CoovaChilli" ++ ++#~ msgid "Command socket" ++#~ msgstr "Socket di comando" ++ ++#~ msgid "UNIX socket used for communication with chilli_query" ++#~ msgstr "Socket UNIX usato per la comunicazione con chilli_query" ++ ++#~ msgid "Config refresh interval" ++#~ msgstr "Intervallo di aggiornamento configurazione" ++ ++#~ msgid "" ++#~ "Re-read configuration file and do DNS lookups every interval seconds. " ++#~ "This has the same effect as sending the HUP signal. If interval is 0 " ++#~ "(zero) this feature is disabled. " ++#~ msgstr "" ++#~ "Rilegge il file di configurazione ed esegue una ricerca DNS ogni " ++#~ "intervallo in secondi. Questo ha lo stesso risultato dell'invio del " ++#~ "segnale HUP. Se l'intervallo è 0 (zero) questa funzionalità è " ++#~ "disabilitata." ++ ++#~ msgid "Pid file" ++#~ msgstr "File Pid" ++ ++#~ msgid "TUN/TAP configuration" ++#~ msgstr "Configurazione TUN/TAP" ++ ++#~ msgid "Network/Tun configuration" ++#~ msgstr "Configurazione Rete/TUN" ++ ++#~ msgid "Primary DNS Server" ++#~ msgstr "Server DNS Primario" ++ ++#~ msgid "Secondary DNS Server" ++#~ msgstr "Server DNS Secondario" ++ ++#~ msgid "Domain name" ++#~ msgstr "Nome di dominio" ++ ++#~ msgid "Specifies a pool of dynamic IP addresses" ++#~ msgstr "Specifica un pool di indirizzi IP dinamici" ++ ++#~ msgid "Network address of the uplink interface (CIDR notation)" ++#~ msgstr "Indirizzo di rete dell'interfaccia di uplink (CIDR notazione)" +diff --git a/feeds/luci/applications/luci-app-coovachilli/po/ja/coovachilli.po b/feeds/luci/applications/luci-app-coovachilli/po/ja/coovachilli.po +new file mode 100644 +index 0000000..9415712 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-coovachilli/po/ja/coovachilli.po +@@ -0,0 +1,25 @@ ++#, fuzzy ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Report-Msgid-Bugs-To: \n" ++"POT-Creation-Date: 2009-05-19 19:36+0200\n" ++"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" ++"Last-Translator: FULL NAME \n" ++"Language-Team: LANGUAGE \n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"X-Generator: Translate Toolkit 1.1.1\n" ++ ++msgid "CoovaChilli" ++msgstr "" ++ ++msgid "Network Configuration" ++msgstr "" ++ ++msgid "RADIUS configuration" ++msgstr "" ++ ++msgid "UAM and MAC Authentication" ++msgstr "" +diff --git a/feeds/luci/applications/luci-app-coovachilli/po/ms/coovachilli.po b/feeds/luci/applications/luci-app-coovachilli/po/ms/coovachilli.po +new file mode 100644 +index 0000000..d910ef2 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-coovachilli/po/ms/coovachilli.po +@@ -0,0 +1,22 @@ ++# coovachilli.pot ++# generated from ./applications/luci-coovachilli/luasrc/i18n/coovachilli.en.lua ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Last-Translator: Automatically generated\n" ++"Language-Team: none\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++ ++msgid "CoovaChilli" ++msgstr "" ++ ++msgid "Network Configuration" ++msgstr "" ++ ++msgid "RADIUS configuration" ++msgstr "" ++ ++msgid "UAM and MAC Authentication" ++msgstr "" +diff --git a/feeds/luci/applications/luci-app-coovachilli/po/no/coovachilli.po b/feeds/luci/applications/luci-app-coovachilli/po/no/coovachilli.po +new file mode 100644 +index 0000000..f37afdd +--- /dev/null ++++ b/feeds/luci/applications/luci-app-coovachilli/po/no/coovachilli.po +@@ -0,0 +1,26 @@ ++# coovachilli.pot ++# generated from ./applications/luci-coovachilli/luasrc/i18n/coovachilli.en.lua ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"PO-Revision-Date: 2013-04-05 08:41+0200\n" ++"Last-Translator: protx \n" ++"Language-Team: none\n" ++"Language: no\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n != 1);\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "CoovaChilli" ++msgstr "CoovaChilli" ++ ++msgid "Network Configuration" ++msgstr "Nettverk Konfigurasjon" ++ ++msgid "RADIUS configuration" ++msgstr "RADIUS Konfigurasjon" ++ ++msgid "UAM and MAC Authentication" ++msgstr "UAM og MAC Autentisering" +diff --git a/feeds/luci/applications/luci-app-coovachilli/po/pl/coovachilli.po b/feeds/luci/applications/luci-app-coovachilli/po/pl/coovachilli.po +new file mode 100644 +index 0000000..7dc2ef8 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-coovachilli/po/pl/coovachilli.po +@@ -0,0 +1,27 @@ ++# coovachilli.pot ++# generated from ./applications/luci-coovachilli/luasrc/i18n/coovachilli.en.lua ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"PO-Revision-Date: 2012-09-25 06:22+0200\n" ++"Last-Translator: obsy \n" ++"Language-Team: none\n" ++"Language: pl\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 " ++"|| n%100>=20) ? 1 : 2);\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "CoovaChilli" ++msgstr "CoovaChilli" ++ ++msgid "Network Configuration" ++msgstr "Konfiguracja sieci" ++ ++msgid "RADIUS configuration" ++msgstr "Konfiguracja RADIUS`a" ++ ++msgid "UAM and MAC Authentication" ++msgstr "Uwierzytelnianie UAM oraz MAC" +diff --git a/feeds/luci/applications/luci-app-coovachilli/po/pt-br/coovachilli.po b/feeds/luci/applications/luci-app-coovachilli/po/pt-br/coovachilli.po +new file mode 100644 +index 0000000..9c21981 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-coovachilli/po/pt-br/coovachilli.po +@@ -0,0 +1,657 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Report-Msgid-Bugs-To: \n" ++"POT-Creation-Date: 2009-06-10 03:41+0200\n" ++"PO-Revision-Date: 2011-10-18 20:37+0200\n" ++"Last-Translator: Luiz Angelo \n" ++"Language-Team: LANGUAGE \n" ++"Language: pt_BR\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n > 1);\n" ++"X-Generator: Pootle 2.0.4\n" ++ ++msgid "CoovaChilli" ++msgstr "CoovaChilli" ++ ++msgid "Network Configuration" ++msgstr "Configuração de rede" ++ ++msgid "RADIUS configuration" ++msgstr "Configuração de RADIUS" ++ ++msgid "UAM and MAC Authentication" ++msgstr "Autenticação UAM e MAC" ++ ++#~ msgid "General configuration" ++#~ msgstr "Configuração Geral" ++ ++#~ msgid "General CoovaChilli settings" ++#~ msgstr "Definições gerais do CoovaChilli" ++ ++#~ msgid "Command socket" ++#~ msgstr "Soquete de comando" ++ ++#~ msgid "UNIX socket used for communication with chilli_query" ++#~ msgstr "Soquete UNIX para comunicação com chilli_query" ++ ++#~ msgid "Config refresh interval" ++#~ msgstr "Intervalo de atualização da configuração" ++ ++#~ msgid "" ++#~ "Re-read configuration file and do DNS lookups every interval seconds. " ++#~ "This has the same effect as sending the HUP signal. If interval is 0 " ++#~ "(zero) this feature is disabled. " ++#~ msgstr "" ++#~ "Reler o arquivo de configuração e faça a busca DNS a cada intervalo de " ++#~ "segundos. Isto tem o mesmo efeito que o envio do sinal HUP. Se o " ++#~ "intervalo for 0, (zero) esta funcionalidade será desativada." ++ ++#~ msgid "Pid file" ++#~ msgstr "Arquivo de PID" ++ ++#~ msgid "Filename to put the process id" ++#~ msgstr "Nome do arquivo onde será armazenado o PID" ++ ++#~ msgid "State directory" ++#~ msgstr "Diretório de estado" ++ ++#~ msgid "Directory of non-volatile data" ++#~ msgstr "Diretório para dados não-voláteis" ++ ++#~ msgid "TUN/TAP configuration" ++#~ msgstr "Configuração TUN/TAP" ++ ++#~ msgid "Network/Tun configuration" ++#~ msgstr "Configuração de Rede/Tun" ++ ++#~ msgid "Network down script" ++#~ msgstr "Script de descida de rede" ++ ++#~ msgid "" ++#~ "Script executed after a session has moved from authorized state to " ++#~ "unauthorized" ++#~ msgstr "" ++#~ "Script executado após o estado de uma sessão ser alterado de autorizado " ++#~ "para não-autorizado" ++ ++#~ msgid "Network up script" ++#~ msgstr "Script de subida da rede" ++ ++#~ msgid "Script executed after the tun network interface has been brought up" ++#~ msgstr "Script executado após a interface tun de rede ter sido levantada" ++ ++#~ msgid "Primary DNS Server" ++#~ msgstr "Servidor DNS primário" ++ ++#~ msgid "Secondary DNS Server" ++#~ msgstr "Servidor DNS secundário" ++ ++#~ msgid "Domain name" ++#~ msgstr "Domínio" ++ ++#~ msgid "" ++#~ "Is used to inform the client about the domain name to use for DNS lookups" ++#~ msgstr "" ++#~ "Usado para informar o cliente sobre o domínio a ser utilizado para " ++#~ "consultas DNS" ++ ++#~ msgid "Dynamic IP address pool" ++#~ msgstr "Conjunto de endereços IP dinâmicos" ++ ++#~ msgid "Specifies a pool of dynamic IP addresses" ++#~ msgstr "Especifica um conjunto de endereços IP dinâmicos" ++ ++#~ msgid "IP down script" ++#~ msgstr "Script de descida da rede IP" ++ ++#~ msgid "Script executed after the tun network interface has been taken down" ++#~ msgstr "Script executado após a rede da interface tun seja baixada" ++ ++#~ msgid "IP up script" ++#~ msgstr "Script de subida da rede IP" ++ ++#~ msgid "" ++#~ "Script executed after the TUN/TAP network interface has been brought up" ++#~ msgstr "Script executado após a rede da interface TUN/TAP seja levantadas" ++ ++#~ msgid "Uplink subnet" ++#~ msgstr "Subrede do enlace superior (uplink)" ++ ++#~ msgid "Network address of the uplink interface (CIDR notation)" ++#~ msgstr "Endereço de rede da interface do enlace superior (notação CIDR)" ++ ++#~ msgid "Static IP address pool" ++#~ msgstr "Conjunto de endereços IP estáticos" ++ ++#~ msgid "Specifies a pool of static IP addresses" ++#~ msgstr "Especifica um conjunto de endereços IP estáticos" ++ ++#~ msgid "TUN/TAP device" ++#~ msgstr "Dispositivo TUN/TAP" ++ ++#~ msgid "The specific device to use for the TUN/TAP interface" ++#~ msgstr "O dispositivo especificado para ser usado pela interface TUN/TAP" ++ ++#~ msgid "TX queue length" ++#~ msgstr "Tamanho da fila de envio (TX)" ++ ++#~ msgid "The TX queue length to set on the TUN/TAP interface" ++#~ msgstr "O tamanho da fila de envio (TX) para ser usado na interface TUN/TAP" ++ ++#~ msgid "Use TAP device" ++#~ msgstr "Use dispositivo TAP" ++ ++#~ msgid "Use the TAP interface instead of TUN" ++#~ msgstr "Use o dispositivo TAP ao invés de TUN" ++ ++#~ msgid "DHCP configuration" ++#~ msgstr "Configuração do DHCP" ++ ++#~ msgid "Set DHCP options for connecting clients" ++#~ msgstr "Ajusta as opções do DHCP para clientes a se conectarem" ++ ++#~ msgid "DHCP end number" ++#~ msgstr "Número final do DHCP" ++ ++#~ msgid "Where to stop assigning IP addresses (default 254)" ++#~ msgstr "Onde terminar a atribuição de endereços IP (padrão 254)" ++ ++#~ msgid "DHCP interface" ++#~ msgstr "Interface DHCP" ++ ++#~ msgid "Ethernet interface to listen to for the downlink interface" ++#~ msgstr "Interface Ethernet para escutar por conexões dos clientes" ++ ++#~ msgid "Listen MAC address" ++#~ msgstr "Endereço MAC de escuta" ++ ++#~ msgid "" ++#~ "MAC address to listen to. If not specified the MAC address of the " ++#~ "interface will be used" ++#~ msgstr "" ++#~ "Endereço MAC de escuta. Se não especificado, o endereço MAC da interface " ++#~ "será usado" ++ ++#~ msgid "DHCP start number" ++#~ msgstr "Número inicial do DHCP" ++ ++#~ msgid "Where to start assigning IP addresses (default 10)" ++#~ msgstr "A partir de onde iniciará a atribuição de endereços IP (padrão 10)" ++ ++#~ msgid "Enable IEEE 802.1x" ++#~ msgstr "Habilite IEEE 802.1x" ++ ++#~ msgid "Enable IEEE 802.1x authentication and listen for EAP requests" ++#~ msgstr "Habilite autenticação IEEE 802.1x e escute por requisições EAP" ++ ++#~ msgid "Leasetime" ++#~ msgstr "Tempo de atribuição" ++ ++#~ msgid "Use a DHCP lease of seconds (default 600)" ++#~ msgstr "Use o tempo de atribuição do DHCP, em segundos (padrão 600)" ++ ++#~ msgid "Allow session update through RADIUS" ++#~ msgstr "Permite a atualização da sessão através do RADIUS" ++ ++#~ msgid "" ++#~ "Allow updating of session parameters with RADIUS attributes sent in " ++#~ "Accounting-Response" ++#~ msgstr "" ++#~ "Permite a atualização dos parâmetros da sessão com atributos RADIUS " ++#~ "enviados na Contabilidade-Resposta" ++ ++#~ msgid "Admin password" ++#~ msgstr "Senha do Administrador" ++ ++#~ msgid "" ++#~ "Password to use for Administrative-User authentication in order to pick " ++#~ "up chilli configurations and establish a device \"system\" session" ++#~ msgstr "" ++#~ "Senha para a autenticação do usuário administrador para pegar as " ++#~ "configurações do chili e estabelecer uma sessão de dispositivo \"sistema\"" ++ ++#~ msgid "Admin user" ++#~ msgstr "Usuário administrador" ++ ++#~ msgid "" ++#~ "User-name to use for Administrative-User authentication in order to pick " ++#~ "up chilli configurations and establish a device \"system\" session" ++#~ msgstr "" ++#~ "Nome do usuário para a autenticação do usuário administrador para pegar " ++#~ "as configurações do chili e estabelecer uma sessão de dispositivo " ++#~ "\"sistema\"" ++ ++#~ msgid "Do not check disconnection requests" ++#~ msgstr "Não verifique as requisições de desconexão" ++ ++#~ msgid "Do not check the source IP address of radius disconnect requests" ++#~ msgstr "" ++#~ "Não verifique o endereço IP de origem das requisições de desconexão do " ++#~ "radius" ++ ++#~ msgid "RADIUS disconnect port" ++#~ msgstr "Porta de desconexão do RADIUS" ++ ++#~ msgid "UDP port to listen to for accepting radius disconnect requests" ++#~ msgstr "" ++#~ "Porta UDP de escuta para aceitar requisições de desconexão do radius" ++ ++#~ msgid "NAS IP" ++#~ msgstr "IP do NAS" ++ ++#~ msgid "Value to use in RADIUS NAS-IP-Address attribute" ++#~ msgstr "Valor para usar no atributo NAS-IP-Address do RADIUS" ++ ++#~ msgid "NAS MAC" ++#~ msgstr "MAC do NAS" ++ ++#~ msgid "MAC address value to use in RADIUS Called-Station-ID attribute" ++#~ msgstr "Endereço MAC para usar no atributo Called-Station-ID do RADIUS" ++ ++#~ msgid "Allow OpenID authentication" ++#~ msgstr "Permitir autenticação OpenID" ++ ++#~ msgid "" ++#~ "Allows OpenID authentication by sending ChilliSpot-Config=allow-" ++#~ "openidauth in RADIUS Access-Requests" ++#~ msgstr "" ++#~ "Permitir autenticação OpenID enviando ChilliSpot-Config=allow-openidauth " ++#~ "na Resquisição de Acesso do Radius" ++ ++#~ msgid "RADIUS accounting port" ++#~ msgstr "Porta de contabilidade do RADIUS" ++ ++#~ msgid "" ++#~ "The UDP port number to use for radius accounting requests (default 1813)" ++#~ msgstr "" ++#~ "O número da porta UDP para ser usada pela requisição de contabilização do " ++#~ "radius (padrão 1813)" ++ ++#~ msgid "RADIUS authentication port" ++#~ msgstr "Porta de autenticação do RADIUS" ++ ++#~ msgid "" ++#~ "The UDP port number to use for radius authentication requests (default " ++#~ "1812)" ++#~ msgstr "" ++#~ "O número da porta UDP para ser usada pela requisição de autenticação do " ++#~ "radius (padrão 1812)" ++ ++#~ msgid "Option radiuscalled" ++#~ msgstr "Opção radiuscalled" ++ ++#~ msgid "RADIUS listen address" ++#~ msgstr "Endereço de escuta do RADIUS" ++ ++#~ msgid "Local interface IP address to use for the radius interface" ++#~ msgstr "Endereço IP da interface local para a interface radius" ++ ++#~ msgid "RADIUS location ID" ++#~ msgstr "ID da localização do RADIUS" ++ ++#~ msgid "WISPr Location ID" ++#~ msgstr "ID da Localização WISPr" ++ ++#~ msgid "RADIUS location name" ++#~ msgstr "Nome da localização do RADIUS" ++ ++#~ msgid "WISPr Location Name" ++#~ msgstr "Nome da localização WISPr" ++ ++#~ msgid "NAS ID" ++#~ msgstr "ID do NAS" ++ ++#~ msgid "Network access server identifier" ++#~ msgstr "Identificador do servidor de acesso à rede" ++ ++#~ msgid "Option radiusnasip" ++#~ msgstr "Opção radiusnasip" ++ ++#~ msgid "NAS port type" ++#~ msgstr "Tipo de porta NAS" ++ ++#~ msgid "" ++#~ "Value of NAS-Port-Type attribute. Defaults to 19 (Wireless-IEEE-802.11)" ++#~ msgstr "" ++#~ "Valor do atributo do NAS-Port-Type. O padrão é 19 (IEEE-802.11-Sem fio)" ++ ++#~ msgid "Send RADIUS VSA" ++#~ msgstr "Enviar VSA do RADIUS" ++ ++#~ msgid "Send the ChilliSpot-OriginalURL RADIUS VSA in Access-Request" ++#~ msgstr "" ++#~ "Enviar o ChilliSpot-OriginalURL do VSA do RADIUS na Requisição de Acesso" ++ ++#~ msgid "RADIUS secret" ++#~ msgstr "Segredo do RADIUS" ++ ++#~ msgid "Radius shared secret for both servers" ++#~ msgstr "Segredo compartilhado entre ambos os servidores Radius" ++ ++#~ msgid "RADIUS server 1" ++#~ msgstr "Servidor 1 do RADIUS" ++ ++#~ msgid "The IP address of radius server 1" ++#~ msgstr "Endereço IP do servidor 1 do radius" ++ ++#~ msgid "RADIUS server 2" ++#~ msgstr "Servidor 2 do RADIUS" ++ ++#~ msgid "The IP address of radius server 2" ++#~ msgstr "Endereço IP do servidor 2 do radius" ++ ++#~ msgid "Swap octets" ++#~ msgstr "Troque octetos" ++ ++#~ msgid "" ++#~ "Swap the meaning of \"input octets\" and \"output octets\" as it related " ++#~ "to RADIUS attribtues" ++#~ msgstr "" ++#~ "Troca o significado de \"octetos de entrada\" e \"octetos de saída\" como " ++#~ "está relatado nos atributos RADIUS" ++ ++#~ msgid "Allow WPA guests" ++#~ msgstr "Permite convidados WPA" ++ ++#~ msgid "" ++#~ "Allows WPA Guest authentication by sending ChilliSpot-Config=allow-wpa-" ++#~ "guests in RADIUS Access-Requests" ++#~ msgstr "" ++#~ "Permite a autenticação de convidados WPA enviando ChilliSpot-Config=allow-" ++#~ "wpa-guests na Requisição de Acesso do RADIUS" ++ ++#~ msgid "Proxy client" ++#~ msgstr "Cliente proxy" ++ ++#~ msgid "" ++#~ "IP address from which radius requests are accepted. If omitted the server " ++#~ "will not accept radius requests" ++#~ msgstr "" ++#~ "Endereço IP do qual as requisições radius serão aceitas. Se omitido, o " ++#~ "servidor não vai aceitar requisições radius" ++ ++#~ msgid "Proxy listen address" ++#~ msgstr "Endereço de escuta do proxy" ++ ++#~ msgid "Local interface IP address to use for accepting radius requests" ++#~ msgstr "" ++#~ "Endereço IP da interface local usado para aceitar as requisições radius" ++ ++#~ msgid "Proxy port" ++#~ msgstr "Porta do Proxy" ++ ++#~ msgid "UDP Port to listen to for accepting radius requests" ++#~ msgstr "Porta UDP para aceitar requisições radius" ++ ++#~ msgid "Proxy secret" ++#~ msgstr "Segredo do Proxy" ++ ++#~ msgid "Radius shared secret for clients" ++#~ msgstr "Segredo compartilhado do Radius para clientes" ++ ++#~ msgid "UAM configuration" ++#~ msgstr "Configuração UAM" ++ ++#~ msgid "Unified Configuration Method settings" ++#~ msgstr "Configurações do Método de Configuração Unificado" ++ ++#~ msgid "Use Chilli XML" ++#~ msgstr "Use XML do Chilli" ++ ++#~ msgid "Return the so-called Chilli XML along with WISPr XML" ++#~ msgstr "Retorna o famoso XML do Chili juntamente com o XML do WISPr" ++ ++#~ msgid "Default idle timeout" ++#~ msgstr "Estouro de tempo de ociosidade padrão" ++ ++#~ msgid "Default idle timeout unless otherwise set by RADIUS (defaults to 0)" ++#~ msgstr "" ++#~ "Estouro de tempo de ociosidade padrão, a não ser que seja definido pelo " ++#~ "RADIUS (padrão é 0)" ++ ++#~ msgid "Default interim interval" ++#~ msgstr "Intervalo padrão como interino" ++ ++#~ msgid "" ++#~ "Default interim-interval for RADIUS accounting unless otherwise set by " ++#~ "RADIUS (defaults to 0)" ++#~ msgstr "" ++#~ "Intervalo padrão como interino para a contabilidade do RADIUS, a não ser " ++#~ "que seja definido pelo RADIUS (padrão é 0)" ++ ++#~ msgid "Default session timeout" ++#~ msgstr "Estouro de tempo padrão da sessão" ++ ++#~ msgid "" ++#~ "Default session timeout unless otherwise set by RADIUS (defaults to 0)" ++#~ msgstr "" ++#~ "Estouro de tempo padrão da sessão, a não ser que seja definido pelo " ++#~ "RADIUS (padrão é 0)" ++ ++#~ msgid "Inspect DNS traffic" ++#~ msgstr "Inspeciona tráfego DNS" ++ ++#~ msgid "" ++#~ "Inspect DNS packets and drop responses with any non- A, CNAME, SOA, or MX " ++#~ "records to prevent dns tunnels (experimental)" ++#~ msgstr "" ++#~ "Inspeciona os pacotes DNS e descarta respostas para qualquer registro que " ++#~ "não seja A, CNAME, SOA ou MX. Isto evita túneis pelo DNS (experimental)" ++ ++#~ msgid "Local users file" ++#~ msgstr "Arquivo de usuários locais" ++ ++#~ msgid "" ++#~ "A colon seperated file containing usernames and passwords of locally " ++#~ "authenticated users" ++#~ msgstr "" ++#~ "Um arquivo separado por dois pontos (:) contendo o nome de usuário e " ++#~ "senhas para usuários autenticados localmente" ++ ++#~ msgid "Location name" ++#~ msgstr "Nome da localização" ++ ++#~ msgid "Human readable location name used in JSON interface" ++#~ msgstr "Nome da localização legível usado na interface JSON" ++ ++#~ msgid "Do not redirect to UAM server" ++#~ msgstr "Não redirecionar para servidor UAM" ++ ++#~ msgid "" ++#~ "Do not return to UAM server on login success, just redirect to original " ++#~ "URL" ++#~ msgstr "" ++#~ "Não redirecione para o servidor UAM quando o login for bem sucedido. " ++#~ "Somente redirecione para a URL original" ++ ++#~ msgid "Do not do WISPr" ++#~ msgstr "Não faça WISPr" ++ ++#~ msgid "Do not do any WISPr XML, assume the back-end is doing this instead" ++#~ msgstr "" ++#~ "Não faça qualquer XML do WISPr. Ao invés disto, assuma que o servidor " ++#~ "está fazendo isto" ++ ++#~ msgid "Post auth proxy" ++#~ msgstr "Proxy após a autenticação" ++ ++#~ msgid "" ++#~ "Used with postauthproxyport to define a post authentication HTTP proxy " ++#~ "server" ++#~ msgstr "" ++#~ "Usado em conjunto com postauthproxyport para definir um servidor PROXY " ++#~ "HTTP após a autenticação" ++ ++#~ msgid "Post auth proxy port" ++#~ msgstr "Porta do proxy após a autenticação" ++ ++#~ msgid "" ++#~ "Used with postauthproxy to define a post authentication HTTP proxy server" ++#~ msgstr "" ++#~ "Usado em conjunto com postauthproxyport para definir um servidor PROXY " ++#~ "HTTP após a autenticação" ++ ++#~ msgid "Allowed resources" ++#~ msgstr "Recursos permitidos" ++ ++#~ msgid "List of resources the client can access without first authenticating" ++#~ msgstr "" ++#~ "Lista de recursos que o cliente pode acessar sem antes se autenticar" ++ ++#~ msgid "Allow any DNS server" ++#~ msgstr "Permitir qualquer Servidor DNS" ++ ++#~ msgid "Allow any DNS server for unauthenticated clients" ++#~ msgstr "Permitir qualquer servidor DNS para clientes não autenticados" ++ ++#~ msgid "Allow any IP address" ++#~ msgstr "Permitir qualquer endereço IP" ++ ++#~ msgid "" ++#~ "Allow clients to use any IP settings they wish by spoofing ARP " ++#~ "(experimental)" ++#~ msgstr "" ++#~ "Permitir que clientes usem qualquer configuração de IP desejada usando a " ++#~ "técnica de falsificação de APR (experimental)" ++ ++#~ msgid "Allowed domains" ++#~ msgstr "Domínios permitidos" ++ ++#~ msgid "" ++#~ "Defines a list of domain names to automatically add to the walled garden" ++#~ msgstr "" ++#~ "Define uma lista de domínios automaticamente adicionados para acesso da " ++#~ "zona controlada" ++ ++#~ msgid "UAM homepage" ++#~ msgstr "Página do UAM" ++ ++#~ msgid "URL of homepage to redirect unauthenticated users to" ++#~ msgstr "URL da página para onde redirecionar os usuários não autenticados" ++ ++#~ msgid "UAM static content port" ++#~ msgstr "Porta de conteúdo estático do UAM" ++ ++#~ msgid "TCP port to bind to for only serving embedded content" ++#~ msgstr "Porta TCP para somente servidor conteúdo embutido" ++ ++#~ msgid "UAM listening address" ++#~ msgstr "Endereço de escuta do UAM" ++ ++#~ msgid "IP address to listen to for authentication of clients" ++#~ msgstr "Endereço IP para escutar pela autenticação dos clientes" ++ ++#~ msgid "UAM logout IP" ++#~ msgstr "IP de desautenticação do UAM" ++ ++#~ msgid "" ++#~ "Use this IP address to instantly logout a client accessing it (defaults " ++#~ "to 1.1.1.1)" ++#~ msgstr "" ++#~ "Use este endereço IP para instantaneamente desautenticar um cliente que a " ++#~ "acessar (padrão é 1.1.1.1)" ++ ++#~ msgid "UAM listening port" ++#~ msgstr "Porta de escuta do UAM" ++ ++#~ msgid "TCP port to bind to for authenticating clients (default 3990)" ++#~ msgstr "Porta de escuta do UAM para autenticar clientes (padrão é 3990)" ++ ++#~ msgid "UAM secret" ++#~ msgstr "Segredo do UAM" ++ ++#~ msgid "Shared secret between uamserver and chilli" ++#~ msgstr "Segredo compatilhado entre o servidor UAM e o chilli" ++ ++#~ msgid "UAM server" ++#~ msgstr "Servidor UAM" ++ ++#~ msgid "URL of web server to use for authenticating clients" ++#~ msgstr "URL do servidor web usado para autenticar os clientes" ++ ++#~ msgid "UAM user interface" ++#~ msgstr "Interface do usuário do UAM" ++ ++#~ msgid "" ++#~ "An init.d style program to handle local content on the uamuiport web " ++#~ "server" ++#~ msgstr "" ++#~ "Um programa estilo init.d para tratar o conteúdo local no servidor web " ++#~ "uamuiport" ++ ++#~ msgid "Use status file" ++#~ msgstr "Usar o arquivo de estado" ++ ++#~ msgid "" ++#~ "Write the status of clients in a non-volatile state file (experimental)" ++#~ msgstr "" ++#~ "Escreva o estado dos clientes em um arquivo de estado não volátil " ++#~ "(experimental)" ++ ++#~ msgid "WISPr login url" ++#~ msgstr "URL de login do WISPr" ++ ++#~ msgid "Specific URL to be given in WISPr XML LoginURL" ++#~ msgstr "Especifica a URL para ser dada no LoginURL do XML do WISPr" ++ ++#~ msgid "CGI program" ++#~ msgstr "Programa CGI" ++ ++#~ msgid "" ++#~ "Executable to run as a CGI type program (like haserl) for URLs with " ++#~ "extention .chi" ++#~ msgstr "" ++#~ "Executável para rodar como um programa do tipo CGI (como o haserl) para " ++#~ "URLs com a extensão .chi" ++ ++#~ msgid "Web content directory" ++#~ msgstr "Diretório de conteúdo Web" ++ ++#~ msgid "Directory where embedded local web content is placed" ++#~ msgstr "Diretório onde o conteúdo web local embutido fica localizado" ++ ++#~ msgid "MAC configuration" ++#~ msgstr "Configuração do MAC" ++ ++#~ msgid "Configure MAC authentication" ++#~ msgstr "Configurar a autenticação MAC" ++ ++#~ msgid "Allowed MAC addresses" ++#~ msgstr "Endereços MAC permitidos" ++ ++#~ msgid "List of MAC addresses for which MAC authentication will be performed" ++#~ msgstr "" ++#~ "Lista dos endereços MAC permitidos para os quais a autenticação MAC será " ++#~ "realizada" ++ ++#~ msgid "Authenticate locally allowed MACs" ++#~ msgstr "Autenticar MACs autorizados localmente" ++ ++#~ msgid "Authenticate allowed MAC addresses without the use of RADIUS" ++#~ msgstr "Autenticar os endereços MAC autorizados sem usar o RADIUS" ++ ++#~ msgid "Enable MAC authentification" ++#~ msgstr "Habilita a autenticação MAC" ++ ++#~ msgid "Try to authenticate all users based on their mac address alone" ++#~ msgstr "" ++#~ "Tente autenticar todos os usuários baseados somente no seu endereço MAC" ++ ++#~ msgid "Password" ++#~ msgstr "Senha" ++ ++#~ msgid "Password used when performing MAC authentication" ++#~ msgstr "Senha usada para realizar a autenticação MAC" ++ ++#~ msgid "Suffix" ++#~ msgstr "Sufixo" ++ ++#~ msgid "" ++#~ "Suffix to add to the MAC address in order to form the User-Name, which is " ++#~ "sent to the radius server" ++#~ msgstr "" ++#~ "Sufixo para adicionar ao endereço MAC que forma o nome do usuário, o qual " ++#~ "é enviado ao servidor radius" +diff --git a/feeds/luci/applications/luci-app-coovachilli/po/pt/coovachilli.po b/feeds/luci/applications/luci-app-coovachilli/po/pt/coovachilli.po +new file mode 100644 +index 0000000..115ae03 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-coovachilli/po/pt/coovachilli.po +@@ -0,0 +1,372 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Report-Msgid-Bugs-To: \n" ++"POT-Creation-Date: 2009-05-26 19:03+0200\n" ++"PO-Revision-Date: 2013-05-01 00:43+0200\n" ++"Last-Translator: pedromrgoncalves \n" ++"Language-Team: LANGUAGE \n" ++"Language: pt\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n != 1);\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "CoovaChilli" ++msgstr "CoovaChilli" ++ ++msgid "Network Configuration" ++msgstr "Configuração da Rede" ++ ++msgid "RADIUS configuration" ++msgstr "Configuração RADIUS" ++ ++msgid "UAM and MAC Authentication" ++msgstr "Autenticação UAM e MAC" ++ ++#~ msgid "General configuration" ++#~ msgstr "Configuração Geral" ++ ++#~ msgid "General CoovaChilli settings" ++#~ msgstr "Definições gerais do CoovaChilli" ++ ++#~ msgid "Command socket" ++#~ msgstr "Socket de comando" ++ ++#~ msgid "UNIX socket used for communication with chilli_query" ++#~ msgstr "Socket UNIX para comunicação com chilli_query" ++ ++#~ msgid "Config refresh interval" ++#~ msgstr "Intervalo de refrescamento da configuração" ++ ++#~ msgid "" ++#~ "Re-read configuration file and do DNS lookups every interval seconds. " ++#~ "This has the same effect as sending the HUP signal. If interval is 0 " ++#~ "(zero) this feature is disabled. " ++#~ msgstr "" ++#~ "Reler o ficheiro de configuração e executar verificações DNS n segundos " ++#~ "de intervalo. Tem o mesmo efeito que o envio do sinal HUP. Se o intervalo " ++#~ "for 0 (zero) esta funcionalidade será desactivada." ++ ++#~ msgid "Pid file" ++#~ msgstr "Ficheiro PID" ++ ++#~ msgid "Filename to put the process id" ++#~ msgstr "Nome do ficheiro onde será guardado o PID" ++ ++#~ msgid "State directory" ++#~ msgstr "Directorio de estado" ++ ++#~ msgid "Directory of non-volatile data" ++#~ msgstr "Directorio para dados não-volateis" ++ ++#~ msgid "TUN/TAP configuration" ++#~ msgstr "Configuração tun/tap" ++ ++#~ msgid "Network/Tun configuration" ++#~ msgstr "Configuração de rede/tun" ++ ++#~ msgid "Network down script" ++#~ msgstr "Script de rede/tun em baixo" ++ ++#~ msgid "" ++#~ "Script executed after a session has moved from authorized state to " ++#~ "unauthorized" ++#~ msgstr "" ++#~ "Script executado após o estado de uma sessão ser alterado de autorizado " ++#~ "para não-autorizado " ++ ++#~ msgid "Network up script" ++#~ msgstr "Script de rede/tun em cima" ++ ++#~ msgid "Script executed after the tun network interface has been brought up" ++#~ msgstr "Script executado apos o interface tun de rede ter sido levantado" ++ ++#~ msgid "Primary DNS Server" ++#~ msgstr "Servidor primário de DNS" ++ ++#~ msgid "Secondary DNS Server" ++#~ msgstr "Servidor secundário de DNS" ++ ++#~ msgid "Domain name" ++#~ msgstr "Domínio" ++ ++#~ msgid "" ++#~ "Is used to inform the client about the domain name to use for DNS lookups" ++#~ msgstr "" ++#~ "Usado para informar o cliente sobre o dominio a utilizar para pedidos DNS" ++ ++#, fuzzy ++#~ msgid "Dynamic IP address pool" ++#~ msgstr "Servidor primário de DNS" ++ ++#, fuzzy ++#~ msgid "Specifies a pool of dynamic IP addresses" ++#~ msgstr "" ++#~ "Usado para informar o cliente sobre o endereço de servidor DNS a usar " ++#~ "para a resolução de nomes" ++ ++#, fuzzy ++#~ msgid "IP down script" ++#~ msgstr "Script de rede/tun em baixo" ++ ++#, fuzzy ++#~ msgid "Script executed after the tun network interface has been taken down" ++#~ msgstr "" ++#~ "Script executado após o estado de uma sessão ser alterado de autorizado " ++#~ "para não-autorizado " ++ ++#, fuzzy ++#~ msgid "IP up script" ++#~ msgstr "Script de rede/tun em cima" ++ ++#, fuzzy ++#~ msgid "" ++#~ "Script executed after the TUN/TAP network interface has been brought up" ++#~ msgstr "Script executado apos o interface tun de rede ter sido levantado" ++ ++#, fuzzy ++#~ msgid "Uplink subnet" ++#~ msgstr "Configuração de rede/tun" ++ ++#, fuzzy ++#~ msgid "Network address of the uplink interface (CIDR notation)" ++#~ msgstr "" ++#~ "Usado para informar o cliente sobre o endereço de servidor DNS a usar " ++#~ "para a resolução de nomes" ++ ++#, fuzzy ++#~ msgid "Static IP address pool" ++#~ msgstr "Script de rede/tun em cima" ++ ++#, fuzzy ++#~ msgid "Specifies a pool of static IP addresses" ++#~ msgstr "Script executado apos o interface tun de rede ter sido levantado" ++ ++#, fuzzy ++#~ msgid "TUN/TAP device" ++#~ msgstr "Script de rede/tun em baixo" ++ ++#, fuzzy ++#~ msgid "The specific device to use for the TUN/TAP interface" ++#~ msgstr "" ++#~ "Script executado após o estado de uma sessão ser alterado de autorizado " ++#~ "para não-autorizado " ++ ++#, fuzzy ++#~ msgid "TX queue length" ++#~ msgstr "Domínio" ++ ++#, fuzzy ++#~ msgid "The TX queue length to set on the TUN/TAP interface" ++#~ msgstr "" ++#~ "Usado para informar o cliente sobre o dominio a utilizar para pedidos DNS" ++ ++#, fuzzy ++#~ msgid "Use TAP device" ++#~ msgstr "Configuração de rede/tun" ++ ++#, fuzzy ++#~ msgid "Use the TAP interface instead of TUN" ++#~ msgstr "Script executado apos o interface tun de rede ter sido levantado" ++ ++#, fuzzy ++#~ msgid "DHCP configuration" ++#~ msgstr "Configuração tun/tap" ++ ++#, fuzzy ++#~ msgid "Set DHCP options for connecting clients" ++#~ msgstr "Configuração de rede/tun" ++ ++#, fuzzy ++#~ msgid "DHCP end number" ++#~ msgstr "Configuração de rede/tun" ++ ++#, fuzzy ++#~ msgid "DHCP interface" ++#~ msgstr "Configuração de rede/tun" ++ ++#, fuzzy ++#~ msgid "Ethernet interface to listen to for the downlink interface" ++#~ msgstr "Configuração de rede/tun" ++ ++#, fuzzy ++#~ msgid "Listen MAC address" ++#~ msgstr "Configuração de rede/tun" ++ ++#, fuzzy ++#~ msgid "Leasetime" ++#~ msgstr "Configuração de rede/tun" ++ ++#, fuzzy ++#~ msgid "Use a DHCP lease of seconds (default 600)" ++#~ msgstr "Configuração de rede/tun" ++ ++#, fuzzy ++#~ msgid "Admin user" ++#~ msgstr "Configuração de rede/tun" ++ ++#, fuzzy ++#~ msgid "NAS IP" ++#~ msgstr "Configuração de rede/tun" ++ ++#, fuzzy ++#~ msgid "Value to use in RADIUS NAS-IP-Address attribute" ++#~ msgstr "Configuração de rede/tun" ++ ++#, fuzzy ++#~ msgid "NAS MAC" ++#~ msgstr "Configuração de rede/tun" ++ ++#, fuzzy ++#~ msgid "MAC address value to use in RADIUS Called-Station-ID attribute" ++#~ msgstr "Configuração de rede/tun" ++ ++#, fuzzy ++#~ msgid "Allow WPA guests" ++#~ msgstr "Configuração de rede/tun" ++ ++#, fuzzy ++#~ msgid "UAM configuration" ++#~ msgstr "Configuração tun/tap" ++ ++#, fuzzy ++#~ msgid "Unified Configuration Method settings" ++#~ msgstr "Configuração de rede/tun" ++ ++#, fuzzy ++#~ msgid "List of resources the client can access without first authenticating" ++#~ msgstr "" ++#~ "Usado para informar o cliente sobre o dominio a utilizar para pedidos DNS" ++ ++#, fuzzy ++#~ msgid "Allow any DNS server" ++#~ msgstr "" ++#~ "Usado para informar o cliente sobre o dominio a utilizar para pedidos DNS" ++ ++#, fuzzy ++#~ msgid "Allow any DNS server for unauthenticated clients" ++#~ msgstr "" ++#~ "Usado para informar o cliente sobre o dominio a utilizar para pedidos DNS" ++ ++#, fuzzy ++#~ msgid "Allow any IP address" ++#~ msgstr "Domínio" ++ ++#, fuzzy ++#~ msgid "" ++#~ "Allow clients to use any IP settings they wish by spoofing ARP " ++#~ "(experimental)" ++#~ msgstr "" ++#~ "Usado para informar o cliente sobre o dominio a utilizar para pedidos DNS" ++ ++#, fuzzy ++#~ msgid "Allowed domains" ++#~ msgstr "Domínio" ++ ++#, fuzzy ++#~ msgid "" ++#~ "Defines a list of domain names to automatically add to the walled garden" ++#~ msgstr "" ++#~ "Usado para informar o cliente sobre o dominio a utilizar para pedidos DNS" ++ ++#, fuzzy ++#~ msgid "UAM homepage" ++#~ msgstr "Domínio" ++ ++#, fuzzy ++#~ msgid "URL of homepage to redirect unauthenticated users to" ++#~ msgstr "" ++#~ "Usado para informar o cliente sobre o dominio a utilizar para pedidos DNS" ++ ++#, fuzzy ++#~ msgid "UAM static content port" ++#~ msgstr "Domínio" ++ ++#, fuzzy ++#~ msgid "TCP port to bind to for only serving embedded content" ++#~ msgstr "" ++#~ "Usado para informar o cliente sobre o dominio a utilizar para pedidos DNS" ++ ++#, fuzzy ++#~ msgid "UAM listening address" ++#~ msgstr "Domínio" ++ ++#, fuzzy ++#~ msgid "IP address to listen to for authentication of clients" ++#~ msgstr "" ++#~ "Usado para informar o cliente sobre o dominio a utilizar para pedidos DNS" ++ ++#, fuzzy ++#~ msgid "UAM logout IP" ++#~ msgstr "Domínio" ++ ++#, fuzzy ++#~ msgid "" ++#~ "Use this IP address to instantly logout a client accessing it (defaults " ++#~ "to 1.1.1.1)" ++#~ msgstr "" ++#~ "Usado para informar o cliente sobre o dominio a utilizar para pedidos DNS" ++ ++#, fuzzy ++#~ msgid "UAM listening port" ++#~ msgstr "Domínio" ++ ++#, fuzzy ++#~ msgid "TCP port to bind to for authenticating clients (default 3990)" ++#~ msgstr "" ++#~ "Usado para informar o cliente sobre o dominio a utilizar para pedidos DNS" ++ ++#, fuzzy ++#~ msgid "UAM secret" ++#~ msgstr "Domínio" ++ ++#, fuzzy ++#~ msgid "Shared secret between uamserver and chilli" ++#~ msgstr "" ++#~ "Usado para informar o cliente sobre o dominio a utilizar para pedidos DNS" ++ ++#, fuzzy ++#~ msgid "UAM server" ++#~ msgstr "Domínio" ++ ++#, fuzzy ++#~ msgid "URL of web server to use for authenticating clients" ++#~ msgstr "" ++#~ "Usado para informar o cliente sobre o dominio a utilizar para pedidos DNS" ++ ++#, fuzzy ++#~ msgid "UAM user interface" ++#~ msgstr "Domínio" ++ ++#, fuzzy ++#~ msgid "" ++#~ "An init.d style program to handle local content on the uamuiport web " ++#~ "server" ++#~ msgstr "" ++#~ "Usado para informar o cliente sobre o dominio a utilizar para pedidos DNS" ++ ++#, fuzzy ++#~ msgid "" ++#~ "Executable to run as a CGI type program (like haserl) for URLs with " ++#~ "extention .chi" ++#~ msgstr "" ++#~ "Usado para informar o cliente sobre o dominio a utilizar para pedidos DNS" ++ ++#, fuzzy ++#~ msgid "Directory where embedded local web content is placed" ++#~ msgstr "" ++#~ "Usado para informar o cliente sobre o dominio a utilizar para pedidos DNS" ++ ++#, fuzzy ++#~ msgid "MAC configuration" ++#~ msgstr "Configuração de rede/tun" ++ ++#, fuzzy ++#~ msgid "Configure MAC authentication" ++#~ msgstr "Configuração de rede/tun" ++ ++#, fuzzy ++#~ msgid "Try to authenticate all users based on their mac address alone" ++#~ msgstr "Configuração de rede/tun" +diff --git a/feeds/luci/applications/luci-app-coovachilli/po/ro/coovachilli.po b/feeds/luci/applications/luci-app-coovachilli/po/ro/coovachilli.po +new file mode 100644 +index 0000000..8f458bb +--- /dev/null ++++ b/feeds/luci/applications/luci-app-coovachilli/po/ro/coovachilli.po +@@ -0,0 +1,27 @@ ++# coovachilli.pot ++# generated from ./applications/luci-coovachilli/luasrc/i18n/coovachilli.en.lua ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"PO-Revision-Date: 2014-06-28 19:15+0200\n" ++"Last-Translator: xxvirusxx \n" ++"Language-Team: none\n" ++"Language: ro\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=3; plural=(n==1 ? 0 : (n==0 || (n%100 > 0 && n%100 < " ++"20)) ? 1 : 2);;\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "CoovaChilli" ++msgstr "CoovaChilli" ++ ++msgid "Network Configuration" ++msgstr "Configurare reÅ£ea" ++ ++msgid "RADIUS configuration" ++msgstr "Configurare RADIUS" ++ ++msgid "UAM and MAC Authentication" ++msgstr "Autentificare UAM ÅŸi MAC" +diff --git a/feeds/luci/applications/luci-app-coovachilli/po/ru/coovachilli.po b/feeds/luci/applications/luci-app-coovachilli/po/ru/coovachilli.po +new file mode 100644 +index 0000000..379ff7e +--- /dev/null ++++ b/feeds/luci/applications/luci-app-coovachilli/po/ru/coovachilli.po +@@ -0,0 +1,560 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: LuCI: coovachilli\n" ++"Report-Msgid-Bugs-To: \n" ++"POT-Creation-Date: 2009-05-19 19:36+0200\n" ++"PO-Revision-Date: 2012-08-15 11:29+0300\n" ++"Last-Translator: Roman A. aka BasicXP \n" ++"Language-Team: Russian \n" ++"Language: ru\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%" ++"10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" ++"X-Generator: Pootle 2.0.6\n" ++"X-Poedit-SourceCharset: UTF-8\n" ++ ++msgid "CoovaChilli" ++msgstr "CoovaChilli" ++ ++msgid "Network Configuration" ++msgstr "ÐšÐ¾Ð½Ñ„Ð¸Ð³ÑƒÑ€Ð°Ñ†Ð¸Ñ Ñети" ++ ++msgid "RADIUS configuration" ++msgstr "ÐšÐ¾Ð½Ñ„Ð¸Ð³ÑƒÑ€Ð°Ñ†Ð¸Ñ RADIUS" ++ ++msgid "UAM and MAC Authentication" ++msgstr "ÐÑƒÑ‚ÐµÐ½Ñ‚Ð¸Ñ„Ð¸ÐºÐ°Ñ†Ð¸Ñ Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ UAM и MAC" ++ ++#~ msgid "General configuration" ++#~ msgstr "Общие наÑтройки" ++ ++#~ msgid "General CoovaChilli settings" ++#~ msgstr "Общие наÑтройки CoovaChilli" ++ ++#~ msgid "Command socket" ++#~ msgstr "Сокет команд" ++ ++#~ msgid "UNIX socket used for communication with chilli_query" ++#~ msgstr "UNIX Ñокет Ð´Ð»Ñ ÑвÑзи Ñ chilli_query" ++ ++#~ msgid "Config refresh interval" ++#~ msgstr "Интервал Ð¾Ð±Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ ÐºÐ¾Ð½Ñ„Ð¸Ð³ÑƒÑ€Ð°Ñ†Ð¸Ð¸" ++ ++#~ msgid "" ++#~ "Re-read configuration file and do DNS lookups every interval seconds. " ++#~ "This has the same effect as sending the HUP signal. If interval is 0 " ++#~ "(zero) this feature is disabled. " ++#~ msgstr "" ++#~ "Считывание файла конфигурации и запуÑк DNS поиÑка раз в указанный " ++#~ "интервал. ДоÑтигаетÑÑ Ñ‚Ð¾Ñ‚ же Ñффект что и при отÑылке HUP Ñигнала. " ++#~ "Значение интервала выражено в Ñекундах. Ð’ Ñлучае ÑƒÐºÐ°Ð·Ð°Ð½Ð¸Ñ Ð½ÑƒÐ»ÐµÐ²Ð¾Ð³Ð¾ " ++#~ "Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ Ð¸Ð½Ñ‚ÐµÑ€Ð²Ð°Ð»Ð°, Ð´Ð°Ð½Ð½Ð°Ñ Ñ„ÑƒÐ½ÐºÑ†Ð¸Ñ ÑтановитÑÑ Ð½ÐµÐ°ÐºÑ‚Ð¸Ð²Ð½Ð¾Ð¹." ++ ++#~ msgid "Pid file" ++#~ msgstr "Pid файл" ++ ++#~ msgid "Filename to put the process id" ++#~ msgstr "Ð˜Ð¼Ñ Ñ„Ð°Ð¹Ð»Ð°, который будет Ñодержать идентификатор процеÑÑа (PID)" ++ ++#~ msgid "State directory" ++#~ msgstr "Ð”Ð¸Ñ€ÐµÐºÑ‚Ð¾Ñ€Ð¸Ñ ÑоÑтоÑниÑ" ++ ++#~ msgid "TUN/TAP configuration" ++#~ msgstr "TUN/TAP конфигурациÑ" ++ ++#~ msgid "Network down script" ++#~ msgstr "Скрипт Ð²Ñ‹ÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ Ñети" ++ ++#~ msgid "Network up script" ++#~ msgstr "Скрипт Ð²ÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ Ñети" ++ ++#~ msgid "Primary DNS Server" ++#~ msgstr "Первичный DNS Ñервер" ++ ++#~ msgid "Secondary DNS Server" ++#~ msgstr "Вторичный DNS Ñервер" ++ ++#~ msgid "Domain name" ++#~ msgstr "Доменное имÑ" ++ ++#~ msgid "" ++#~ "Is used to inform the client about the domain name to use for DNS lookups" ++#~ msgstr "ИÑпользуетÑÑ, чтобы Ñообщить клиенту Ð¸Ð¼Ñ Ð´Ð¾Ð¼ÐµÐ½Ð° при DNS поиÑках" ++ ++#~ msgid "Dynamic IP address pool" ++#~ msgstr "Диапазон динамичеÑких IP адреÑов" ++ ++#~ msgid "Specifies a pool of dynamic IP addresses" ++#~ msgstr "ОпределÑет диапазон динамичеÑких IP адреÑов" ++ ++#~ msgid "IP down script" ++#~ msgstr "Скрипт ÑброÑа IP-адреÑа" ++ ++#~ msgid "IP up script" ++#~ msgstr "Скрипт уÑтановки IP-адреÑа" ++ ++#~ msgid "" ++#~ "Script executed after the TUN/TAP network interface has been brought up" ++#~ msgstr "Скрипт, выполнÑемый поÑле Ð²ÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ Ñетевого интерфейÑа TUN/TAP" ++ ++#~ msgid "Uplink subnet" ++#~ msgstr "ПодÑеть uplink'а" ++ ++#~ msgid "Network address of the uplink interface (CIDR notation)" ++#~ msgstr "Сетевой Ð°Ð´Ñ€ÐµÑ uplink-интерфейÑа (в нотации CIDR)" ++ ++#~ msgid "Static IP address pool" ++#~ msgstr "Диапазон ÑтатичеÑких IP адреÑов" ++ ++#~ msgid "Specifies a pool of static IP addresses" ++#~ msgstr "ОпределÑет диапазон ÑтатичеÑких IP адреÑов" ++ ++#~ msgid "TUN/TAP device" ++#~ msgstr "TUN/TAP уÑтройÑтво" ++ ++#~ msgid "The specific device to use for the TUN/TAP interface" ++#~ msgstr "УÑтройÑтво Ð´Ð»Ñ TUN/TAP интерфейÑа" ++ ++#~ msgid "TX queue length" ++#~ msgstr "Длина очереди TX" ++ ++#~ msgid "The TX queue length to set on the TUN/TAP interface" ++#~ msgstr "Длина TX очереди TUN/TAP интерфейÑа" ++ ++#~ msgid "Use TAP device" ++#~ msgstr "ИÑпользовать уÑтройÑтво TAP" ++ ++#~ msgid "Use the TAP interface instead of TUN" ++#~ msgstr "ИÑпользовать Ð¸Ð½Ñ‚ÐµÑ€Ñ„ÐµÐ¹Ñ TAP вмеÑто TUN" ++ ++#~ msgid "DHCP configuration" ++#~ msgstr "ÐаÑтройки DHCP" ++ ++#~ msgid "Set DHCP options for connecting clients" ++#~ msgstr "УÑтановите параметры DHCP Ð´Ð»Ñ Ð¿Ð¾Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ ÐºÐ»Ð¸ÐµÐ½Ñ‚Ð¾Ð²" ++ ++#~ msgid "DHCP end number" ++#~ msgstr "Конечное значение DHCP" ++ ++#~ msgid "DHCP interface" ++#~ msgstr "DHCP интерфейÑ" ++ ++#~ msgid "Ethernet interface to listen to for the downlink interface" ++#~ msgstr "Ethernet Ð¸Ð½Ñ‚ÐµÑ€Ñ„ÐµÐ¹Ñ Ð´Ð»Ñ Ð¿Ñ€Ð¾ÑÐ»ÑƒÑˆÐ¸Ð²Ð°Ð½Ð¸Ñ downlink-интерфеÑа" ++ ++#~ msgid "Listen MAC address" ++#~ msgstr "ПроÑлушиваемые MAC адреÑа" ++ ++#~ msgid "DHCP start number" ++#~ msgstr "Ðачальное значение DHCP" ++ ++#~ msgid "Where to start assigning IP addresses (default 10)" ++#~ msgstr "Ðачать приÑÐ²Ð¾ÐµÐ½Ð¸Ñ IP-адреÑов Ñ (по умолчанию 10)" ++ ++#~ msgid "Enable IEEE 802.1x" ++#~ msgstr "Включить IEEE 802.1x" ++ ++#~ msgid "Enable IEEE 802.1x authentication and listen for EAP requests" ++#~ msgstr "Включить IEEE 802.1x аутентификацию и обработку запроÑов EAP" ++ ++#~ msgid "Leasetime" ++#~ msgstr "Ð’Ñ€ÐµÐ¼Ñ Ð°Ñ€ÐµÐ½Ð´Ñ‹" ++ ++#~ msgid "Use a DHCP lease of seconds (default 600)" ++#~ msgstr "ИÑпользовать DHCP аренду заданное Ð²Ñ€ÐµÐ¼Ñ (Ñекунды, 600 по умолчанию)" ++ ++#~ msgid "Allow session update through RADIUS" ++#~ msgstr "Разрешить обновление ÑеÑÑии через RADIUS" ++ ++#~ msgid "" ++#~ "Allow updating of session parameters with RADIUS attributes sent in " ++#~ "Accounting-Response" ++#~ msgstr "" ++#~ "Разрешить обновление параметров ÑеÑÑии иÑÐ¿Ð¾Ð»ÑŒÐ·ÑƒÑ RADIUS атрибуты " ++#~ "поÑланные через Accounting-Response" ++ ++#~ msgid "Admin password" ++#~ msgstr "Пароль админиÑтратора" ++ ++#~ msgid "" ++#~ "Password to use for Administrative-User authentication in order to pick " ++#~ "up chilli configurations and establish a device \"system\" session" ++#~ msgstr "" ++#~ "Пароль админиÑтратора Ð´Ð»Ñ Ð°ÑƒÑ‚ÐµÐ½Ñ‚Ð¸Ñ„Ð¸ÐºÐ°Ñ†Ð¸Ð¸ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ Ð¸ Ð¿Ñ€Ð¸Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ " ++#~ "наÑтроек chilli Ñ Ñозданием \"ÑиÑтемной\" ÑеÑÑии уÑтройÑтва" ++ ++#~ msgid "Admin user" ++#~ msgstr "ÐдминиÑтратор" ++ ++#~ msgid "" ++#~ "User-name to use for Administrative-User authentication in order to pick " ++#~ "up chilli configurations and establish a device \"system\" session" ++#~ msgstr "" ++#~ "Ð˜Ð¼Ñ Ð°Ð´Ð¼Ð¸Ð½Ð¸Ñтратора Ð´Ð»Ñ Ð°ÑƒÑ‚ÐµÐ½Ñ‚Ð¸Ñ„Ð¸ÐºÐ°Ñ†Ð¸Ð¸ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ Ð¸ Ð¿Ñ€Ð¸Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð½Ð°Ñтроек " ++#~ "chilli Ñ Ñозданием \"ÑиÑтемной\" ÑеÑÑии уÑтройÑтва" ++ ++#~ msgid "Do not check disconnection requests" ++#~ msgstr "Ðе проверÑÑ‚ÑŒ запроÑÑ‹ на разъединение" ++ ++#~ msgid "Do not check the source IP address of radius disconnect requests" ++#~ msgstr "Ðе проверÑÑ‚ÑŒ IP-Ð°Ð´Ñ€ÐµÑ Ð·Ð°Ð¿Ñ€Ð¾Ñов Ñ€Ð°Ð·ÑŠÐµÐ´Ð¸Ð½ÐµÐ½Ð¸Ñ radius" ++ ++#~ msgid "RADIUS disconnect port" ++#~ msgstr "Порт Ñ€Ð°Ð·ÑŠÐµÐ´Ð¸Ð½ÐµÐ½Ð¸Ñ RADIUS" ++ ++#~ msgid "UDP port to listen to for accepting radius disconnect requests" ++#~ msgstr "UDP порт Ð´Ð»Ñ Ð·Ð°Ð¿Ñ€Ð¾Ñов Ñ€Ð°Ð·ÑŠÐµÐ´Ð¸Ð½ÐµÐ½Ð¸Ñ RADIUS" ++ ++#~ msgid "NAS IP" ++#~ msgstr "IP-Ð°Ð´Ñ€ÐµÑ NAS" ++ ++#~ msgid "Value to use in RADIUS NAS-IP-Address attribute" ++#~ msgstr "Значение RADIUS NAS-IP-Address атрибута" ++ ++#~ msgid "NAS MAC" ++#~ msgstr "MAC Ð°Ð´Ñ€ÐµÑ NAS" ++ ++#~ msgid "MAC address value to use in RADIUS Called-Station-ID attribute" ++#~ msgstr "Значение MAC адреÑа RADIUS Called-Station-ID атрибута" ++ ++#~ msgid "Allow OpenID authentication" ++#~ msgstr "Разрешить OpenID аутентификацию" ++ ++#~ msgid "" ++#~ "Allows OpenID authentication by sending ChilliSpot-Config=allow-" ++#~ "openidauth in RADIUS Access-Requests" ++#~ msgstr "" ++#~ "Разрешает аутентификацию OpenID, поÑÑ‹Ð»Ð°Ñ ChilliSpot-Config=allow-" ++#~ "openidauth в запроÑах доÑтупа RADIUS." ++ ++#~ msgid "RADIUS accounting port" ++#~ msgstr "Порт RADIUS Accounting" ++ ++#~ msgid "" ++#~ "The UDP port number to use for radius accounting requests (default 1813)" ++#~ msgstr "Порт UDP Ð´Ð»Ñ Ð·Ð°Ð¿Ñ€Ð¾Ñов RADIUS Accounting (1813 по умолчанию)" ++ ++#~ msgid "RADIUS authentication port" ++#~ msgstr "Порт аутентификации RADIUS" ++ ++#~ msgid "" ++#~ "The UDP port number to use for radius authentication requests (default " ++#~ "1812)" ++#~ msgstr "UDP порт Ð´Ð»Ñ Ð·Ð°Ð¿Ñ€Ð¾Ñов аутентификации radius (1812 по умолчанию)" ++ ++#~ msgid "RADIUS listen address" ++#~ msgstr "Слушающий Ð°Ð´Ñ€ÐµÑ RADIUS" ++ ++#~ msgid "Local interface IP address to use for the radius interface" ++#~ msgstr "IP Ð°Ð´Ñ€ÐµÑ Ð»Ð¾ÐºÐ°Ð»ÑŒÐ½Ð¾Ð³Ð¾ интерфейÑа Ð´Ð»Ñ Ð¸Ð½Ñ‚ÐµÑ€Ñ„ÐµÐ¹Ñа radius" ++ ++#~ msgid "RADIUS location ID" ++#~ msgstr "Идентификатор раÑÐ¿Ð¾Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ RADIUS" ++ ++#~ msgid "WISPr Location ID" ++#~ msgstr "Идентификатор раÑÐ¿Ð¾Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ WISPr" ++ ++#~ msgid "RADIUS location name" ++#~ msgstr "Ð˜Ð¼Ñ Ñ€Ð°ÑÐ¿Ð¾Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ RADIUS" ++ ++#~ msgid "WISPr Location Name" ++#~ msgstr "Ð˜Ð¼Ñ Ñ€Ð°ÑÐ¿Ð¾Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ WISPr" ++ ++#~ msgid "NAS ID" ++#~ msgstr "Идентификатор NAS" ++ ++#~ msgid "Network access server identifier" ++#~ msgstr "Идентификатор Ñервера доÑтупа к Ñети (NAS)" ++ ++#~ msgid "Option radiusnasip" ++#~ msgstr "ÐžÐ¿Ñ†Ð¸Ñ radiusnasip" ++ ++#~ msgid "NAS port type" ++#~ msgstr "Тип порта NAS" ++ ++#~ msgid "" ++#~ "Value of NAS-Port-Type attribute. Defaults to 19 (Wireless-IEEE-802.11)" ++#~ msgstr "Значение аттрибута NAS-Port-Type. По умолчанию 19 (IEEE-802.11)" ++ ++#~ msgid "Send RADIUS VSA" ++#~ msgstr "ОтÑылать RADIUS VSA" ++ ++#~ msgid "Send the ChilliSpot-OriginalURL RADIUS VSA in Access-Request" ++#~ msgstr "ОтÑылать ChilliSpot-OriginalURL RADIUS VSA в запроÑах доÑтупа" ++ ++#~ msgid "RADIUS secret" ++#~ msgstr "Секрет RADIUS" ++ ++#~ msgid "Radius shared secret for both servers" ++#~ msgstr "Общий Ñекрет RADIUS Ð´Ð»Ñ Ð¾Ð±Ð¾Ð¸Ñ… Ñерверов" ++ ++#~ msgid "RADIUS server 1" ++#~ msgstr "RADIUS Ñервер 1" ++ ++#~ msgid "The IP address of radius server 1" ++#~ msgstr "IP Ð°Ð´Ñ€ÐµÑ RADIUS Ñервера 1" ++ ++#~ msgid "RADIUS server 2" ++#~ msgstr "RADIUS Ñервер 2" ++ ++#~ msgid "The IP address of radius server 2" ++#~ msgstr "IP Ð°Ð´Ñ€ÐµÑ RADIUS Ñервера 2" ++ ++#~ msgid "Swap octets" ++#~ msgstr "ПереÑтавлÑÑ‚ÑŒ октеты" ++ ++#~ msgid "" ++#~ "Swap the meaning of \"input octets\" and \"output octets\" as it related " ++#~ "to RADIUS attribtues" ++#~ msgstr "МенÑÑ‚ÑŒ меÑтами Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ \"входной октет\" и \"выходной октет\"" ++ ++#~ msgid "Allow WPA guests" ++#~ msgstr "Разрешить гоÑтевой WPA вход" ++ ++#~ msgid "" ++#~ "Allows WPA Guest authentication by sending ChilliSpot-Config=allow-wpa-" ++#~ "guests in RADIUS Access-Requests" ++#~ msgstr "" ++#~ "Разрешает гÑтевую WPA аутентификацию, отÑÑ‹Ð»Ð°Ñ ChilliSpot-Config=allow-wpa-" ++#~ "guests в запроÑах доÑтупа RADIUS" ++ ++#~ msgid "Proxy client" ++#~ msgstr "Клиент прокÑи" ++ ++#~ msgid "" ++#~ "IP address from which radius requests are accepted. If omitted the server " ++#~ "will not accept radius requests" ++#~ msgstr "" ++#~ "IP Ð°Ð´Ñ€ÐµÑ Ñ ÐºÐ¾Ñ‚Ð¾Ñ€Ð¾Ð³Ð¾ запроÑÑ‹ radius принимаютÑÑ. ЕÑли не указан, то Ñервер " ++#~ "не будет принимать запроÑÑ‹ radius" ++ ++#~ msgid "Local interface IP address to use for accepting radius requests" ++#~ msgstr "IP Ð°Ð´Ñ€ÐµÑ Ð»Ð¾ÐºÐ°Ð»ÑŒÐ½Ð¾Ð³Ð¾ интерфейÑа Ð´Ð»Ñ Ð¿Ñ€Ð¸ÐµÐ¼Ð° запроÑов radius" ++ ++#~ msgid "Proxy port" ++#~ msgstr "Порт прокÑи" ++ ++#~ msgid "UDP Port to listen to for accepting radius requests" ++#~ msgstr "Порт UDP Ð´Ð»Ñ Ð·Ð°Ð¿Ñ€Ð¾Ñов RADIUS" ++ ++#~ msgid "Proxy secret" ++#~ msgstr "Секрет прокÑи" ++ ++#~ msgid "Radius shared secret for clients" ++#~ msgstr "Общий RADIUS Ñекрет Ð´Ð»Ñ ÐºÐ»Ð¸ÐµÐ½Ñ‚Ð¾Ð²" ++ ++#~ msgid "UAM configuration" ++#~ msgstr "ÐšÐ¾Ð½Ñ„Ð¸Ð³ÑƒÑ€Ð°Ñ†Ð¸Ñ UAM" ++ ++#~ msgid "Unified Configuration Method settings" ++#~ msgstr "ÐаÑтройки UAM" ++ ++#~ msgid "Use Chilli XML" ++#~ msgstr "ИÑпользовать Chilli XML" ++ ++#~ msgid "Return the so-called Chilli XML along with WISPr XML" ++#~ msgstr "Возвращать так называемый Chilli XML вмеÑте Ñ WISPr XML" ++ ++#~ msgid "Default idle timeout" ++#~ msgstr "Таймаут Ð¾Ð¶Ð¸Ð´Ð°Ð½Ð¸Ñ Ð¿Ð¾ умолчанию" ++ ++#~ msgid "Default idle timeout unless otherwise set by RADIUS (defaults to 0)" ++#~ msgstr "" ++#~ "Таймаут Ð¾Ð¶Ð¸Ð´Ð°Ð½Ð¸Ñ Ð¿Ð¾ умолчанию еÑли не уÑтановлен RADIUS'ом (0 по " ++#~ "умолчанию)" ++ ++#~ msgid "Default session timeout" ++#~ msgstr "Таймаут ÑеÑÑии (значение по умолчанию)" ++ ++#~ msgid "" ++#~ "Default session timeout unless otherwise set by RADIUS (defaults to 0)" ++#~ msgstr "" ++#~ "Таймаут ÑеÑÑии по умолчанию еÑли не уÑтановлено RADIUS'ом (0 по умолчанию)" ++ ++#~ msgid "Inspect DNS traffic" ++#~ msgstr "ИнÑпектировать траффик DNS" ++ ++#~ msgid "" ++#~ "Inspect DNS packets and drop responses with any non- A, CNAME, SOA, or MX " ++#~ "records to prevent dns tunnels (experimental)" ++#~ msgstr "" ++#~ "ПроверÑÑ‚ÑŒ DNS пакеты и отбраÑывать ответы без A, CNAME, SOA, или MX " ++#~ "запиÑей Ð´Ð»Ñ Ð¿Ñ€ÐµÐ´Ð¾Ñ‚Ð²Ñ€Ð°Ñ‰ÐµÐ½Ð¸Ñ DNS туннелей (ÑкÑÐ¿ÐµÑ€Ð¸Ð¼ÐµÐ½Ñ‚Ð°Ð»ÑŒÐ½Ð°Ñ Ñ„-циÑ)." ++ ++#~ msgid "Local users file" ++#~ msgstr "Локальный файл пользователей" ++ ++#~ msgid "" ++#~ "A colon seperated file containing usernames and passwords of locally " ++#~ "authenticated users" ++#~ msgstr "" ++#~ "Файл, Ñодержащий логины и пароли локально авторизованных пользователей " ++#~ "(запиÑи разделены двоеточием)" ++ ++#~ msgid "Location name" ++#~ msgstr "Ð˜Ð¼Ñ Ñ€Ð°ÑположениÑ" ++ ++#~ msgid "Human readable location name used in JSON interface" ++#~ msgstr "Ð˜Ð¼Ñ Ñ€Ð°ÑположениÑ, иÑпользуемой в интерфейÑе JSON" ++ ++#~ msgid "Do not redirect to UAM server" ++#~ msgstr "Ðе перенаправлÑÑ‚ÑŒ на Ñервер UAM" ++ ++#~ msgid "" ++#~ "Do not return to UAM server on login success, just redirect to original " ++#~ "URL" ++#~ msgstr "" ++#~ "Ðе возвращатьÑÑ Ð½Ð° UAM Ñервер при удачном входе, перенаправить на " ++#~ "иÑходный URL" ++ ++#~ msgid "Do not do WISPr" ++#~ msgstr "Ðе выполнÑÑ‚ÑŒ WISPr" ++ ++#~ msgid "Do not do any WISPr XML, assume the back-end is doing this instead" ++#~ msgstr "Ðе выполнÑÑ‚ÑŒ WISPr XML, Ð¿Ñ€ÐµÐ´Ð¿Ð¾Ð»Ð°Ð³Ð°Ñ Ð²Ñ‹Ð¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ðµ в бÑкенд'е" ++ ++#~ msgid "Post auth proxy" ++#~ msgstr "ПрокÑи поÑÑ‚-аутентификации" ++ ++#~ msgid "" ++#~ "Used with postauthproxyport to define a post authentication HTTP proxy " ++#~ "server" ++#~ msgstr "" ++#~ "ИÑпользуетÑÑ Ñ Ð¿Ð¾Ñ€Ñ‚Ð¾Ð¼ прокÑи поÑÑ‚-аутентификации Ð´Ð»Ñ Ð¾Ð¿Ñ€ÐµÐ´ÐµÐ»ÐµÐ½Ð¸Ñ HTTP " ++#~ "прокÑи-Ñервера аутентификации" ++ ++#~ msgid "Post auth proxy port" ++#~ msgstr "Порт прокÑи поÑÑ‚-аутентификации" ++ ++#~ msgid "" ++#~ "Used with postauthproxy to define a post authentication HTTP proxy server" ++#~ msgstr "" ++#~ "ИпользуетÑÑ Ñ Ð¿Ñ€Ð¾ÐºÑи поÑÑ‚-аутентификации Ð´Ð»Ñ Ð¾Ð¿Ñ€ÐµÐ´ÐµÐ»ÐµÐ½Ð¸Ñ HTTP прокÑи-" ++#~ "Ñервера поÑÑ‚-аутентификации" ++ ++#~ msgid "Allowed resources" ++#~ msgstr "Разрешенные реÑурÑÑ‹" ++ ++#~ msgid "List of resources the client can access without first authenticating" ++#~ msgstr "" ++#~ "СпиÑок реÑурÑов к которым клиент может получить доÑтуп без " ++#~ "предварительной аутентификации" ++ ++#~ msgid "Allow any DNS server" ++#~ msgstr "Разрешить любой DNS Ñервер" ++ ++#~ msgid "Allow any DNS server for unauthenticated clients" ++#~ msgstr "Разрешить любой DNS Ñервер Ð´Ð»Ñ ÐºÐ»Ð¸ÐµÐ½Ñ‚Ð¾Ð² не прошедших аутентификацию" ++ ++#~ msgid "Allow any IP address" ++#~ msgstr "Разрешить любой IP-адреÑ" ++ ++#~ msgid "" ++#~ "Allow clients to use any IP settings they wish by spoofing ARP " ++#~ "(experimental)" ++#~ msgstr "" ++#~ "Разрешить клиентам иÑпользовать любые наÑтройки IP за Ñчет \"Ñпуфинга\" " ++#~ "ARP (ÑкÑÐ¿ÐµÑ€Ð¸Ð¼ÐµÐ½Ñ‚Ð°Ð»ÑŒÐ½Ð°Ñ Ñ„-циÑ)" ++ ++#~ msgid "Allowed domains" ++#~ msgstr "Разрешенные домены" ++ ++#~ msgid "UAM homepage" ++#~ msgstr "ДомашнÑÑ Ñтраница UAM" ++ ++#~ msgid "URL of homepage to redirect unauthenticated users to" ++#~ msgstr "" ++#~ "URL домашней Ñтраницы Ð´Ð»Ñ Ð¿ÐµÑ€ÐµÐ½Ð°Ð¿Ñ€Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»ÐµÐ¹ не прошедших " ++#~ "аутентификацию" ++ ++#~ msgid "UAM static content port" ++#~ msgstr "Порт UAM ÑтатичеÑкого контента" ++ ++#~ msgid "UAM listening address" ++#~ msgstr "Слашающий Ð°Ð´Ñ€ÐµÑ UAM" ++ ++#~ msgid "IP address to listen to for authentication of clients" ++#~ msgstr "IP Ð°Ð´Ñ€ÐµÑ Ð´Ð»Ñ Ð¿Ñ€Ð¸ÐµÐ¼Ð° аутентификации клиентов" ++ ++#~ msgid "UAM logout IP" ++#~ msgstr "IP-Ð°Ð´Ñ€ÐµÑ Ð²Ñ‹Ñ…Ð¾Ð´Ð° UAM" ++ ++#~ msgid "UAM listening port" ++#~ msgstr "Слушающий порт UAM" ++ ++#~ msgid "UAM secret" ++#~ msgstr "Секрет UAM" ++ ++#~ msgid "Shared secret between uamserver and chilli" ++#~ msgstr "Общий Ñекрет Ð´Ð»Ñ Ñервера UAM и Chilli" ++ ++#~ msgid "UAM server" ++#~ msgstr "Сервер UAM" ++ ++#~ msgid "URL of web server to use for authenticating clients" ++#~ msgstr "URL или веб-Ñервер Ð´Ð»Ñ Ð°ÑƒÑ‚ÐµÐ½Ñ‚Ð¸Ñ„Ð¸ÐºÐ°Ñ†Ð¸Ð¸ клиентов" ++ ++#~ msgid "UAM user interface" ++#~ msgstr "Ð˜Ð½Ñ‚ÐµÑ€Ñ„ÐµÐ¹Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ UAM" ++ ++#~ msgid "Use status file" ++#~ msgstr "ИÑпользовать ÑтатуÑ-файл" ++ ++#~ msgid "WISPr login url" ++#~ msgstr "URL входа WISPr" ++ ++#~ msgid "Specific URL to be given in WISPr XML LoginURL" ++#~ msgstr "ОÑобый URL в WISPr XML LoginURL" ++ ++#~ msgid "CGI program" ++#~ msgstr "Программа GCI" ++ ++#~ msgid "Web content directory" ++#~ msgstr "Ð”Ð¸Ñ€ÐµÐºÑ‚Ð¾Ñ€Ð¸Ñ Web-контента" ++ ++#~ msgid "Directory where embedded local web content is placed" ++#~ msgstr "Ð”Ð¸Ñ€ÐµÐºÑ‚Ð¾Ñ€Ð¸Ñ ÐºÑƒÐ´Ð° будет помещен вÑтроенный Web-контент" ++ ++#~ msgid "MAC configuration" ++#~ msgstr "ÐаÑтройка MAC" ++ ++#~ msgid "Configure MAC authentication" ++#~ msgstr "ÐаÑтройка аутентификации по MAC адреÑу" ++ ++#~ msgid "Allowed MAC addresses" ++#~ msgstr "Разрешенные MAC адреÑа" ++ ++#~ msgid "List of MAC addresses for which MAC authentication will be performed" ++#~ msgstr "СпиÑок MAC адреÑов Ð´Ð»Ñ ÐºÐ¾Ñ‚Ð¾Ñ€Ñ‹Ñ… будет производитьÑÑ Ð°ÑƒÑ‚ÐµÐ½Ñ‚Ð¸Ñ„Ð¸ÐºÐ°Ñ†Ð¸Ñ" ++ ++#~ msgid "Authenticate locally allowed MACs" ++#~ msgstr "Ðутентифицировать локально разрешенные MAC адреÑа" ++ ++#~ msgid "Authenticate allowed MAC addresses without the use of RADIUS" ++#~ msgstr "Ðутентифицировать разрешенные MAC адреÑа без иÑÐ¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ RADIUS" ++ ++#~ msgid "Enable MAC authentification" ++#~ msgstr "Разрешить MAC аутентификацию" ++ ++#~ msgid "Try to authenticate all users based on their mac address alone" ++#~ msgstr "" ++#~ "Пробовать аутентификацию вÑех пользователей только на оÑнове их MAC " ++#~ "адреÑов" ++ ++#~ msgid "Password" ++#~ msgstr "Пароль" ++ ++#~ msgid "Password used when performing MAC authentication" ++#~ msgstr "Пароль Ð´Ð»Ñ MAC аутентификации" ++ ++#~ msgid "Suffix" ++#~ msgstr "СуффикÑ" ++ ++#~ msgid "" ++#~ "Suffix to add to the MAC address in order to form the User-Name, which is " ++#~ "sent to the radius server" ++#~ msgstr "" ++#~ "СуффикÑ, добавлÑемый в MAC адреÑ, Ð´Ð»Ñ Ñ„Ð¾Ñ€Ð¼Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ð¸Ð¼ÐµÐ½Ð¸ пользователÑ, " ++#~ "которое поÑылаетÑÑ radius Ñерверу" +diff --git a/feeds/luci/applications/luci-app-coovachilli/po/sk/coovachilli.po b/feeds/luci/applications/luci-app-coovachilli/po/sk/coovachilli.po +new file mode 100644 +index 0000000..bb5b1b9 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-coovachilli/po/sk/coovachilli.po +@@ -0,0 +1,21 @@ ++msgid "" ++msgstr "" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Last-Translator: Automatically generated\n" ++"Language-Team: none\n" ++"MIME-Version: 1.0\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n" ++ ++msgid "CoovaChilli" ++msgstr "" ++ ++msgid "Network Configuration" ++msgstr "" ++ ++msgid "RADIUS configuration" ++msgstr "" ++ ++msgid "UAM and MAC Authentication" ++msgstr "" +diff --git a/feeds/luci/applications/luci-app-coovachilli/po/sv/coovachilli.po b/feeds/luci/applications/luci-app-coovachilli/po/sv/coovachilli.po +new file mode 100644 +index 0000000..8695ce5 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-coovachilli/po/sv/coovachilli.po +@@ -0,0 +1,24 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"PO-Revision-Date: 2014-04-28 06:16+0200\n" ++"Last-Translator: Umeaboy \n" ++"Language-Team: none\n" ++"Language: sv\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n != 1);\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "CoovaChilli" ++msgstr "CoovaChili" ++ ++msgid "Network Configuration" ++msgstr "Nätverkskonfiguration" ++ ++msgid "RADIUS configuration" ++msgstr "RADIUS-konfiguration" ++ ++msgid "UAM and MAC Authentication" ++msgstr "UAM och MAC-autensiering" +diff --git a/feeds/luci/applications/luci-app-coovachilli/po/templates/coovachilli.pot b/feeds/luci/applications/luci-app-coovachilli/po/templates/coovachilli.pot +new file mode 100644 +index 0000000..c1a2bed +--- /dev/null ++++ b/feeds/luci/applications/luci-app-coovachilli/po/templates/coovachilli.pot +@@ -0,0 +1,14 @@ ++msgid "" ++msgstr "Content-Type: text/plain; charset=UTF-8" ++ ++msgid "CoovaChilli" ++msgstr "" ++ ++msgid "Network Configuration" ++msgstr "" ++ ++msgid "RADIUS configuration" ++msgstr "" ++ ++msgid "UAM and MAC Authentication" ++msgstr "" +diff --git a/feeds/luci/applications/luci-app-coovachilli/po/tr/coovachilli.po b/feeds/luci/applications/luci-app-coovachilli/po/tr/coovachilli.po +new file mode 100644 +index 0000000..b70a840 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-coovachilli/po/tr/coovachilli.po +@@ -0,0 +1,26 @@ ++# coovachilli.pot ++# generated from ./applications/luci-coovachilli/luasrc/i18n/coovachilli.en.lua ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"PO-Revision-Date: 2012-10-11 23:09+0200\n" ++"Last-Translator: vincenzo \n" ++"Language-Team: none\n" ++"Language: tr\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=1; plural=0;\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "CoovaChilli" ++msgstr "CoovaChilli" ++ ++msgid "Network Configuration" ++msgstr "Network Yapılandırması" ++ ++msgid "RADIUS configuration" ++msgstr "Radius Yapılandırması" ++ ++msgid "UAM and MAC Authentication" ++msgstr "UAM ve MAC Kimlik DoÄŸrulaması" +diff --git a/feeds/luci/applications/luci-app-coovachilli/po/uk/coovachilli.po b/feeds/luci/applications/luci-app-coovachilli/po/uk/coovachilli.po +new file mode 100644 +index 0000000..07ffc55 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-coovachilli/po/uk/coovachilli.po +@@ -0,0 +1,27 @@ ++# coovachilli.pot ++# generated from ./applications/luci-coovachilli/luasrc/i18n/coovachilli.en.lua ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"PO-Revision-Date: 2012-12-29 13:00+0200\n" ++"Last-Translator: Yurii \n" ++"Language-Team: none\n" ++"Language: uk\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%" ++"10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "CoovaChilli" ++msgstr "CoovaChilli" ++ ++msgid "Network Configuration" ++msgstr "ÐšÐ¾Ð½Ñ„Ñ–Ð³ÑƒÑ€Ð°Ñ†Ñ–Ñ Ð¼ÐµÑ€ÐµÐ¶Ñ–" ++ ++msgid "RADIUS configuration" ++msgstr "ÐšÐ¾Ð½Ñ„Ñ–Ð³ÑƒÑ€Ð°Ñ†Ñ–Ñ RADIUS" ++ ++msgid "UAM and MAC Authentication" ++msgstr "ÐÐ²Ñ‚ÐµÐ½Ñ‚Ð¸Ñ„Ñ–ÐºÐ°Ñ†Ñ–Ñ Ñ‡ÐµÑ€ÐµÐ· UAM Ñ– MAC" +diff --git a/feeds/luci/applications/luci-app-coovachilli/po/vi/coovachilli.po b/feeds/luci/applications/luci-app-coovachilli/po/vi/coovachilli.po +new file mode 100644 +index 0000000..66abf0d +--- /dev/null ++++ b/feeds/luci/applications/luci-app-coovachilli/po/vi/coovachilli.po +@@ -0,0 +1,607 @@ ++# coovachilli.pot ++# generated from ./applications/luci-coovachilli/luasrc/i18n/coovachilli.en.lua ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Report-Msgid-Bugs-To: \n" ++"POT-Creation-Date: 2009-08-16 06:59+0200\n" ++"PO-Revision-Date: 2009-08-16 07:05+0200\n" ++"Last-Translator: Hong Phuc Dang \n" ++"Language-Team: LANGUAGE \n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"X-Generator: Pootle 1.1.0\n" ++ ++msgid "CoovaChilli" ++msgstr "CoovaChilli" ++ ++msgid "Network Configuration" ++msgstr "" ++ ++msgid "RADIUS configuration" ++msgstr "" ++ ++msgid "UAM and MAC Authentication" ++msgstr "" ++ ++#~ msgid "General configuration" ++#~ msgstr "Cấu hình tổng quát" ++ ++#~ msgid "General CoovaChilli settings" ++#~ msgstr "Các cài đặt CoovaChilli tổng quát" ++ ++#~ msgid "Command socket" ++#~ msgstr "Command socket" ++ ++#~ msgid "UNIX socket used for communication with chilli_query" ++#~ msgstr "UNIX socket dùng để giao tiếp vá»›i chilli_query" ++ ++#~ msgid "Config refresh interval" ++#~ msgstr "Config refresh interval" ++ ++#~ msgid "" ++#~ "Re-read configuration file and do DNS lookups every interval seconds. " ++#~ "This has the same effect as sending the HUP signal. If interval is 0 " ++#~ "(zero) this feature is disabled. " ++#~ msgstr "" ++#~ "Äá»c lại tập tin cấu hình và tra cưứ DNS má»—i giây. Cái này có ảnh hưởng " ++#~ "giống nhÆ° Ä‘ang gá»­i má»™t tín hiệu HUP. Nếu interval là 0, tính năng này sẽ " ++#~ "bị vô hiệu hóa. " ++ ++#~ msgid "Pid file" ++#~ msgstr "Tập tin Pid" ++ ++#~ msgid "Filename to put the process id" ++#~ msgstr "Tên tập tin để đặt làm ID xá»­ lý" ++ ++#~ msgid "State directory" ++#~ msgstr "Dạnh bạ vùng" ++ ++#~ msgid "Directory of non-volatile data" ++#~ msgstr "ThÆ° mục của những dữ liệu cố định" ++ ++#~ msgid "TUN/TAP configuration" ++#~ msgstr "Cấu hình TUN/TAP" ++ ++#~ msgid "Network/Tun configuration" ++#~ msgstr "Mạng lÆ°á»›i/ Cấu hình TUN" ++ ++#~ msgid "Network down script" ++#~ msgstr "Network down script" ++ ++#~ msgid "" ++#~ "Script executed after a session has moved from authorized state to " ++#~ "unauthorized" ++#~ msgstr "" ++#~ "Script đã thá»±c hiện sau khi má»™t section đã di chuyển từ nÆ¡i có thẩm quyá»n " ++#~ "đến nÆ¡i không" ++ ++#~ msgid "Network up script" ++#~ msgstr "Network up script" ++ ++#~ msgid "Script executed after the tun network interface has been brought up" ++#~ msgstr "Script thi hành sau khi giao diện mạng tun được Ä‘Æ°a lên" ++ ++#~ msgid "Primary DNS Server" ++#~ msgstr "Primary DNS Server" ++ ++#~ msgid "Secondary DNS Server" ++#~ msgstr "Secondary DNS Server" ++ ++#~ msgid "Domain name" ++#~ msgstr "Tên miá»n" ++ ++#~ msgid "" ++#~ "Is used to inform the client about the domain name to use for DNS lookups" ++#~ msgstr "" ++#~ "Äược sá»­ dụng để thông báo cho khách hàng vá» tên miá»n để dùng cho các tra " ++#~ "cứu DNS" ++ ++#~ msgid "Dynamic IP address pool" ++#~ msgstr "Dynamic IP address pool" ++ ++#~ msgid "Specifies a pool of dynamic IP addresses" ++#~ msgstr "Chỉ định má»™t pool of dynamic IP addresses" ++ ++#~ msgid "IP down script" ++#~ msgstr "IP down script" ++ ++#~ msgid "Script executed after the tun network interface has been taken down" ++#~ msgstr "Script thá»±c hiện sau khi giao diện mạng tun bị lấy xuống" ++ ++#~ msgid "IP up script" ++#~ msgstr "IP up script" ++ ++#~ msgid "" ++#~ "Script executed after the TUN/TAP network interface has been brought up" ++#~ msgstr "Script thá»±c hiện sau khi giao diện mạng TUN/TAP đã được Ä‘Æ°a lên" ++ ++#~ msgid "Uplink subnet" ++#~ msgstr "Uplink subnet" ++ ++#~ msgid "Network address of the uplink interface (CIDR notation)" ++#~ msgstr "Äịa chỉ mạng của giao diện uplink (CIDR chú thích)" ++ ++#~ msgid "Static IP address pool" ++#~ msgstr "Static IP address pool" ++ ++#~ msgid "Specifies a pool of static IP addresses" ++#~ msgstr "Chỉ định má»™t pool of static IP addresses" ++ ++#~ msgid "TUN/TAP device" ++#~ msgstr "TUN/TAP device" ++ ++#~ msgid "The specific device to use for the TUN/TAP interface" ++#~ msgstr "Thiết bị cụ thể để dùng cho giao diện TUN/TAP" ++ ++#~ msgid "TX queue length" ++#~ msgstr "Äá»™ dài của TX queue" ++ ++#~ msgid "The TX queue length to set on the TUN/TAP interface" ++#~ msgstr "Äá»™ dài TX queue để đặt trên giao diện TUN/TAP " ++ ++#~ msgid "Use TAP device" ++#~ msgstr "Dùng dụng cụ TAP" ++ ++#~ msgid "Use the TAP interface instead of TUN" ++#~ msgstr "Dùng giao diện TAP thay cho TUN" ++ ++#~ msgid "DHCP configuration" ++#~ msgstr "Cấu hình DHCP" ++ ++#~ msgid "Set DHCP options for connecting clients" ++#~ msgstr "Äặt lá»±a chá»n DHCP cho đối tượng kết nối" ++ ++#~ msgid "DHCP end number" ++#~ msgstr "Số cuối DHCP" ++ ++#~ msgid "Where to stop assigning IP addresses (default 254)" ++#~ msgstr "Chá»— để stop những gán IP (mặc định 254)" ++ ++#~ msgid "DHCP interface" ++#~ msgstr "Giao diện DHCP" ++ ++#~ msgid "Ethernet interface to listen to for the downlink interface" ++#~ msgstr "Giao diện Ethernet để listen cho những giao diện downlink " ++ ++#~ msgid "Listen MAC address" ++#~ msgstr "Nghe địa chỉ MAC" ++ ++#~ msgid "" ++#~ "MAC address to listen to. If not specified the MAC address of the " ++#~ "interface will be used" ++#~ msgstr "" ++#~ "Äịa chỉ MAC để nghe. Nếu địa chỉ MAC chỉ định của giao diện sẽ được sá»­ " ++#~ "dụng " ++ ++#~ msgid "DHCP start number" ++#~ msgstr "Số DHCP bắt đầu " ++ ++#~ msgid "Where to start assigning IP addresses (default 10)" ++#~ msgstr "Chá»— để bắt đầu gán địa chỉ IP (mặc định 10)" ++ ++#~ msgid "Enable IEEE 802.1x" ++#~ msgstr "Kích hoạt IEEE 802.1x" ++ ++#~ msgid "Enable IEEE 802.1x authentication and listen for EAP requests" ++#~ msgstr "Kích hoạt quá trình xác thá»±c IEEE 802.1x và lắng nghe yêu cầu EAP" ++ ++#~ msgid "Leasetime" ++#~ msgstr "Leasetime" ++ ++#~ msgid "Use a DHCP lease of seconds (default 600)" ++#~ msgstr "Dùng má»™t DHCP lease ở giây (600)" ++ ++#~ msgid "Allow session update through RADIUS" ++#~ msgstr "Cho phép phiên cập nhật thông qua RADIUS" ++ ++#~ msgid "" ++#~ "Allow updating of session parameters with RADIUS attributes sent in " ++#~ "Accounting-Response" ++#~ msgstr "" ++#~ "Cho phép phiên cập nhật tham số phiên vá»›i RADIUS được gá»­i trong " ++#~ "Accounting-Response" ++ ++#~ msgid "Admin password" ++#~ msgstr "Mật mã quản trị " ++ ++#~ msgid "" ++#~ "Password to use for Administrative-User authentication in order to pick " ++#~ "up chilli configurations and establish a device \"system\" session" ++#~ msgstr "" ++#~ "Mật mã dùng để xác thá»±c chế Ä‘á»™ quản trị để pick up cấu hình chilli và " ++#~ "thành lập má»™t công cụ &quot;system&quot; session" ++ ++#~ msgid "Admin user" ++#~ msgstr "NgÆ°á»i quản trị " ++ ++#~ msgid "" ++#~ "User-name to use for Administrative-User authentication in order to pick " ++#~ "up chilli configurations and establish a device \"system\" session" ++#~ msgstr "" ++#~ "User name dùng để xác thá»±c chế Ä‘á»™ quản trị để pick up cấu hình chilli và " ++#~ "thành lập má»™t công cụ &quot;system&quot; session" ++ ++#~ msgid "Do not check disconnection requests" ++#~ msgstr "Không kiểm tra yêu cầu ngừng kết nối" ++ ++#~ msgid "Do not check the source IP address of radius disconnect requests" ++#~ msgstr "" ++#~ "Không tên kiểm tra nguồn địa chỉ IP trong bán kính yêu cầu ngừng kết nối" ++ ++#~ msgid "RADIUS disconnect port" ++#~ msgstr "Cá»­a ngừng kết nối RADIUS" ++ ++#~ msgid "UDP port to listen to for accepting radius disconnect requests" ++#~ msgstr "Cá»­a UDP để nghe khi chấp nhận má»™t yêu cầu ngừng kết nối" ++ ++#~ msgid "NAS IP" ++#~ msgstr "NAS IP " ++ ++#~ msgid "Value to use in RADIUS NAS-IP-Address attribute" ++#~ msgstr "Giá trị để dùng trong RADIUS NAS-IP-Address attribute" ++ ++#~ msgid "NAS MAC" ++#~ msgstr "NAS MAC" ++ ++#~ msgid "MAC address value to use in RADIUS Called-Station-ID attribute" ++#~ msgstr "" ++#~ "Giá trị địa chỉ MAC để dùng trong RADIUS Called-Station-ID attribute" ++ ++#~ msgid "Allow OpenID authentication" ++#~ msgstr "Cho phép xác thá»±c OpenID " ++ ++#~ msgid "" ++#~ "Allows OpenID authentication by sending ChilliSpot-Config=allow-" ++#~ "openidauth in RADIUS Access-Requests" ++#~ msgstr "" ++#~ "Cho phép xác thá»±c OpenID bằng cách gá»­i ChilliSpot-Config=allow-openidauth " ++#~ "in RADIUS Access-Requests" ++ ++#~ msgid "RADIUS accounting port" ++#~ msgstr "Cổng RADIUS accounting" ++ ++#~ msgid "" ++#~ "The UDP port number to use for radius accounting requests (default 1813)" ++#~ msgstr "Số của cổng UDP dùng cho yêu cầu radius accounting (mặcđịnh 1813)" ++ ++#~ msgid "RADIUS authentication port" ++#~ msgstr "Cổng xác thá»±c RADIUS" ++ ++#~ msgid "" ++#~ "The UDP port number to use for radius authentication requests (default " ++#~ "1812)" ++#~ msgstr "Số của cổng UDP để yêu cầu xác thá»±c radius (default 1812)" ++ ++#~ msgid "Option radiuscalled" ++#~ msgstr "Tùy chá»n radiuscalled" ++ ++#~ msgid "RADIUS listen address" ++#~ msgstr "Äịa chỉ nghe RADIUS" ++ ++#~ msgid "Local interface IP address to use for the radius interface" ++#~ msgstr "Äịa chỉ IP giao diện địa phÆ°Æ¡ng để dùng cho giao diện radius" ++ ++#~ msgid "RADIUS location ID" ++#~ msgstr "RADIUS vị tri ID" ++ ++#~ msgid "WISPr Location ID" ++#~ msgstr "WISPr vị trí ID" ++ ++#~ msgid "RADIUS location name" ++#~ msgstr "Tên vị trí RADIUS" ++ ++#~ msgid "WISPr Location Name" ++#~ msgstr "Tên vị trí WISPr" ++ ++#~ msgid "NAS ID" ++#~ msgstr "NAS ID" ++ ++#~ msgid "Network access server identifier" ++#~ msgstr "Network truy cập server identifier" ++ ++#~ msgid "Option radiusnasip" ++#~ msgstr "Lá»±a chá»n radiusnasip" ++ ++#~ msgid "NAS port type" ++#~ msgstr "Loại cổng NAS" ++ ++#~ msgid "" ++#~ "Value of NAS-Port-Type attribute. Defaults to 19 (Wireless-IEEE-802.11)" ++#~ msgstr "" ++#~ "Giá trị của NAS-Port-Type attribute. Mặc định tá»›i 19 (Wireless-" ++#~ "IEEE-802.11)" ++ ++#~ msgid "Send RADIUS VSA" ++#~ msgstr "Gá»­i RADIUS VSA" ++ ++#~ msgid "Send the ChilliSpot-OriginalURL RADIUS VSA in Access-Request" ++#~ msgstr "Gá»­i ChilliSpot-OriginalURL RADIUS VSA trong yêu cầu truy cập" ++ ++#~ msgid "RADIUS secret" ++#~ msgstr "RADIUS bí mật" ++ ++#~ msgid "Radius shared secret for both servers" ++#~ msgstr "Radius chia sẻ bí mật cho cả 2 servers" ++ ++#~ msgid "RADIUS server 1" ++#~ msgstr "RADIUS server 1" ++ ++#~ msgid "The IP address of radius server 1" ++#~ msgstr "Äịa chỉ IP của radius server 1" ++ ++#~ msgid "RADIUS server 2" ++#~ msgstr "RADIUS server 2" ++ ++#~ msgid "The IP address of radius server 2" ++#~ msgstr "Äịa chỉ IP của radius server 2" ++ ++#~ msgid "Swap octets" ++#~ msgstr "Swap octets" ++ ++#~ msgid "" ++#~ "Swap the meaning of \"input octets\" and \"output octets\" as it related " ++#~ "to RADIUS attribtues" ++#~ msgstr "" ++#~ "Hoán ý nghÄ©a của &quot;input octets&quot; và &quot;output " ++#~ "octets&quot; khi nó liên quan tá»›i RADIUS attribtues" ++ ++#~ msgid "Allow WPA guests" ++#~ msgstr "Cho phép WPA guests" ++ ++#~ msgid "" ++#~ "Allows WPA Guest authentication by sending ChilliSpot-Config=allow-wpa-" ++#~ "guests in RADIUS Access-Requests" ++#~ msgstr "" ++#~ "Cho phép xác thá»±c WPA Guest bằng cách gá»­i ChilliSpot-Config=allow-wpa-" ++#~ "guests trong RADIUS yêu cầu truy cập" ++ ++#~ msgid "Proxy client" ++#~ msgstr "Proxy client" ++ ++#~ msgid "" ++#~ "IP address from which radius requests are accepted. If omitted the server " ++#~ "will not accept radius requests" ++#~ msgstr "" ++#~ "Äịa chỉ IP mà yêu cầu radius được chấp nhận. Nếu bá» qua server sẽ không " ++#~ "chấp nhận yêu cầu radius." ++ ++#~ msgid "Proxy listen address" ++#~ msgstr "Proxy listen address" ++ ++#~ msgid "Local interface IP address to use for accepting radius requests" ++#~ msgstr "Äịa chỉ giao diện IP địa phÆ°Æ¡ng dùng để chấp nhận yêu cầu radius" ++ ++#~ msgid "Proxy port" ++#~ msgstr "Proxy port" ++ ++#~ msgid "UDP Port to listen to for accepting radius requests" ++#~ msgstr "Cổng UDP để listen để chấp nhận yêu cầu radius" ++ ++#~ msgid "Proxy secret" ++#~ msgstr "Proxy bí mật" ++ ++#~ msgid "Radius shared secret for clients" ++#~ msgstr "Radius chia sẻ bí mật cho các client" ++ ++#~ msgid "UAM configuration" ++#~ msgstr "Cấu hình UAM" ++ ++#~ msgid "Unified Configuration Method settings" ++#~ msgstr "Thống nhất cấu hình phÆ°Æ¡ng pháp cài đặt" ++ ++#~ msgid "Use Chilli XML" ++#~ msgstr "Dùng Chilli XML" ++ ++#~ msgid "Return the so-called Chilli XML along with WISPr XML" ++#~ msgstr "Trở vá» cái gá»i là Chilli XML cùng vá»›i WISPr XML" ++ ++#~ msgid "Default idle timeout" ++#~ msgstr "Mặc định idle timeout" ++ ++#~ msgid "Default idle timeout unless otherwise set by RADIUS (defaults to 0)" ++#~ msgstr "Mặc định idle timeout trừ khi đặt bởi RADIUS (mặc định tá»›i 0)" ++ ++#~ msgid "Default interim interval" ++#~ msgstr "Mặc định interim interval" ++ ++#~ msgid "" ++#~ "Default interim-interval for RADIUS accounting unless otherwise set by " ++#~ "RADIUS (defaults to 0)" ++#~ msgstr "" ++#~ "Mặc định interim-interval cho RADIUS accounting trừ khi đặt bởi RADIUS " ++#~ "(defaults tá»›i 0)" ++ ++#~ msgid "Default session timeout" ++#~ msgstr "Mặc định session timeout" ++ ++#~ msgid "" ++#~ "Default session timeout unless otherwise set by RADIUS (defaults to 0)" ++#~ msgstr "Mặc định session timeout trừ khi đặt bởi RADIUS (mặc định tá»›i 0)" ++ ++#~ msgid "Inspect DNS traffic" ++#~ msgstr "Kiểm tra lÆ°u thông DNS" ++ ++#, fuzzy ++#~ msgid "Do not redirect to UAM server" ++#~ msgstr "Thống nhất cấu hình phÆ°Æ¡ng pháp cài đặt" ++ ++#, fuzzy ++#~ msgid "" ++#~ "Do not return to UAM server on login success, just redirect to original " ++#~ "URL" ++#~ msgstr "Thống nhất cấu hình phÆ°Æ¡ng pháp cài đặt" ++ ++#, fuzzy ++#~ msgid "Do not do WISPr" ++#~ msgstr "Thống nhất cấu hình phÆ°Æ¡ng pháp cài đặt" ++ ++#, fuzzy ++#~ msgid "Do not do any WISPr XML, assume the back-end is doing this instead" ++#~ msgstr "Thống nhất cấu hình phÆ°Æ¡ng pháp cài đặt" ++ ++#, fuzzy ++#~ msgid "List of resources the client can access without first authenticating" ++#~ msgstr "Thống nhất cấu hình phÆ°Æ¡ng pháp cài đặt" ++ ++#, fuzzy ++#~ msgid "Allow any DNS server" ++#~ msgstr "Thống nhất cấu hình phÆ°Æ¡ng pháp cài đặt" ++ ++#, fuzzy ++#~ msgid "Allow any DNS server for unauthenticated clients" ++#~ msgstr "Thống nhất cấu hình phÆ°Æ¡ng pháp cài đặt" ++ ++#, fuzzy ++#~ msgid "Allow any IP address" ++#~ msgstr "Thống nhất cấu hình phÆ°Æ¡ng pháp cài đặt" ++ ++#, fuzzy ++#~ msgid "" ++#~ "Allow clients to use any IP settings they wish by spoofing ARP " ++#~ "(experimental)" ++#~ msgstr "Thống nhất cấu hình phÆ°Æ¡ng pháp cài đặt" ++ ++#, fuzzy ++#~ msgid "Allowed domains" ++#~ msgstr "Tên miá»n" ++ ++#, fuzzy ++#~ msgid "" ++#~ "Defines a list of domain names to automatically add to the walled garden" ++#~ msgstr "" ++#~ "Äược sá»­ dụng để thông báo cho khách hàng vá» tên miá»n để dùng cho các tra " ++#~ "cứu DNS" ++ ++#, fuzzy ++#~ msgid "UAM homepage" ++#~ msgstr "Tên miá»n" ++ ++#, fuzzy ++#~ msgid "URL of homepage to redirect unauthenticated users to" ++#~ msgstr "" ++#~ "Äược sá»­ dụng để thông báo cho khách hàng vá» tên miá»n để dùng cho các tra " ++#~ "cứu DNS" ++ ++#, fuzzy ++#~ msgid "UAM static content port" ++#~ msgstr "Thống nhất cấu hình phÆ°Æ¡ng pháp cài đặt" ++ ++#, fuzzy ++#~ msgid "TCP port to bind to for only serving embedded content" ++#~ msgstr "Thống nhất cấu hình phÆ°Æ¡ng pháp cài đặt" ++ ++#, fuzzy ++#~ msgid "UAM listening address" ++#~ msgstr "Thống nhất cấu hình phÆ°Æ¡ng pháp cài đặt" ++ ++#, fuzzy ++#~ msgid "IP address to listen to for authentication of clients" ++#~ msgstr "Thống nhất cấu hình phÆ°Æ¡ng pháp cài đặt" ++ ++#, fuzzy ++#~ msgid "UAM logout IP" ++#~ msgstr "Thống nhất cấu hình phÆ°Æ¡ng pháp cài đặt" ++ ++#, fuzzy ++#~ msgid "" ++#~ "Use this IP address to instantly logout a client accessing it (defaults " ++#~ "to 1.1.1.1)" ++#~ msgstr "Thống nhất cấu hình phÆ°Æ¡ng pháp cài đặt" ++ ++#, fuzzy ++#~ msgid "UAM listening port" ++#~ msgstr "Thống nhất cấu hình phÆ°Æ¡ng pháp cài đặt" ++ ++#, fuzzy ++#~ msgid "TCP port to bind to for authenticating clients (default 3990)" ++#~ msgstr "Thống nhất cấu hình phÆ°Æ¡ng pháp cài đặt" ++ ++#, fuzzy ++#~ msgid "UAM secret" ++#~ msgstr "Thống nhất cấu hình phÆ°Æ¡ng pháp cài đặt" ++ ++#, fuzzy ++#~ msgid "Shared secret between uamserver and chilli" ++#~ msgstr "Thống nhất cấu hình phÆ°Æ¡ng pháp cài đặt" ++ ++#, fuzzy ++#~ msgid "UAM server" ++#~ msgstr "Thống nhất cấu hình phÆ°Æ¡ng pháp cài đặt" ++ ++#, fuzzy ++#~ msgid "URL of web server to use for authenticating clients" ++#~ msgstr "Thống nhất cấu hình phÆ°Æ¡ng pháp cài đặt" ++ ++#, fuzzy ++#~ msgid "UAM user interface" ++#~ msgstr "Thống nhất cấu hình phÆ°Æ¡ng pháp cài đặt" ++ ++#, fuzzy ++#~ msgid "" ++#~ "An init.d style program to handle local content on the uamuiport web " ++#~ "server" ++#~ msgstr "Thống nhất cấu hình phÆ°Æ¡ng pháp cài đặt" ++ ++#, fuzzy ++#~ msgid "CGI program" ++#~ msgstr "Thống nhất cấu hình phÆ°Æ¡ng pháp cài đặt" ++ ++#, fuzzy ++#~ msgid "" ++#~ "Executable to run as a CGI type program (like haserl) for URLs with " ++#~ "extention .chi" ++#~ msgstr "Thống nhất cấu hình phÆ°Æ¡ng pháp cài đặt" ++ ++#, fuzzy ++#~ msgid "Web content directory" ++#~ msgstr "Thống nhất cấu hình phÆ°Æ¡ng pháp cài đặt" ++ ++#, fuzzy ++#~ msgid "Directory where embedded local web content is placed" ++#~ msgstr "Thống nhất cấu hình phÆ°Æ¡ng pháp cài đặt" ++ ++#, fuzzy ++#~ msgid "MAC configuration" ++#~ msgstr "Cấu hình RADIUS" ++ ++#, fuzzy ++#~ msgid "Configure MAC authentication" ++#~ msgstr "Cấu hình RADIUS" ++ ++#, fuzzy ++#~ msgid "Allowed MAC addresses" ++#~ msgstr "Cấu hình RADIUS" ++ ++#, fuzzy ++#~ msgid "List of MAC addresses for which MAC authentication will be performed" ++#~ msgstr "Cấu hình RADIUS" ++ ++#, fuzzy ++#~ msgid "Authenticate allowed MAC addresses without the use of RADIUS" ++#~ msgstr "Cấu hình RADIUS" ++ ++#, fuzzy ++#~ msgid "Enable MAC authentification" ++#~ msgstr "Cấu hình RADIUS" ++ ++#, fuzzy ++#~ msgid "Try to authenticate all users based on their mac address alone" ++#~ msgstr "Cấu hình RADIUS" ++ ++#, fuzzy ++#~ msgid "Password" ++#~ msgstr "Cấu hình RADIUS" ++ ++#, fuzzy ++#~ msgid "Password used when performing MAC authentication" ++#~ msgstr "Cấu hình RADIUS" ++ ++#, fuzzy ++#~ msgid "Suffix" ++#~ msgstr "Cấu hình RADIUS" ++ ++#, fuzzy ++#~ msgid "coovachilli_macauth_macsuffix_desc" ++#~ msgstr "Cấu hình RADIUS" +diff --git a/feeds/luci/applications/luci-app-coovachilli/po/zh-cn/coovachilli.po b/feeds/luci/applications/luci-app-coovachilli/po/zh-cn/coovachilli.po +new file mode 100644 +index 0000000..7ab0032 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-coovachilli/po/zh-cn/coovachilli.po +@@ -0,0 +1,26 @@ ++# coovachilli.pot ++# generated from ./applications/luci-coovachilli/luasrc/i18n/coovachilli.en.lua ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"PO-Revision-Date: 2012-09-05 14:32+0200\n" ++"Last-Translator: nKsyn \n" ++"Language-Team: none\n" ++"Language: zh_CN\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=1; plural=0;\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "CoovaChilli" ++msgstr "CoovaChilli 网页认è¯" ++ ++msgid "Network Configuration" ++msgstr "网络é…ç½®" ++ ++msgid "RADIUS configuration" ++msgstr "RADIUSé…ç½®" ++ ++msgid "UAM and MAC Authentication" ++msgstr "UAMå’ŒMAC认è¯" +diff --git a/feeds/luci/applications/luci-app-coovachilli/po/zh-tw/coovachilli.po b/feeds/luci/applications/luci-app-coovachilli/po/zh-tw/coovachilli.po +new file mode 100644 +index 0000000..aad8a4d +--- /dev/null ++++ b/feeds/luci/applications/luci-app-coovachilli/po/zh-tw/coovachilli.po +@@ -0,0 +1,24 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"PO-Revision-Date: 2014-05-18 19:49+0200\n" ++"Last-Translator: omnistack \n" ++"Language-Team: none\n" ++"Language: zh_TW\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=1; plural=0;\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "CoovaChilli" ++msgstr "CoovaChilliæœå‹™" ++ ++msgid "Network Configuration" ++msgstr "網路設定" ++ ++msgid "RADIUS configuration" ++msgstr "RADIUS設定" ++ ++msgid "UAM and MAC Authentication" ++msgstr "微軟UAM模組和MACä½æŒ‡é©—è­‰" +diff --git a/feeds/luci/applications/luci-app-coovachilli/root/etc/config/coovachilli b/feeds/luci/applications/luci-app-coovachilli/root/etc/config/coovachilli +new file mode 100644 +index 0000000..0b6be2c +--- /dev/null ++++ b/feeds/luci/applications/luci-app-coovachilli/root/etc/config/coovachilli +@@ -0,0 +1,243 @@ ++############################################################################## ++# ++# Sample CoovaChilli configuration file ++# ++############################################################################## ++ ++# General settings ++config general ++ ++ # Enable this flag to include debug information. ++ option debug 0 ++ ++ # Re-read configuration file at this interval. Will also cause new domain ++ # name lookups to be performed. Value is given in seconds. ++ option interval 3600 ++ ++ # File to store information about the process id of the program. ++ # The program must have write access to this file/directory. ++ option pidfile /var/run/chilli.pid ++ ++ # Directory to use for nonvolatile storage. ++ # The program must have write access to this directory. ++ # This tag is currently ignored ++ #option statedir ./ ++ ++ ++# TUN parameters ++config tun ++ ++ # IP network address of external packet data network ++ # Used to allocate dynamic IP addresses and set up routing. ++ # Normally you do not need to uncomment this tag. ++ option net 192.168.182.0/24 ++ ++ # Dynamic IP address pool ++ # Used to allocate dynamic IP addresses to clients. ++ # If not set it defaults to the net tag. ++ # Do not uncomment this tag unless you are an experienced user! ++ #option dynip 192.168.182.0/24 ++ ++ # Static IP address pool ++ # Used to allocate static IP addresses to clients. ++ # Do not uncomment this tag unless you are an experienced user! ++ #option statip 192.168.182.0/24 ++ ++ # Primary DNS server. ++ # Will be suggested to the client. ++ # If omitted the system default will be used. ++ # Normally you do not need to uncomment this tag. ++ #option dns1 172.16.0.5 ++ ++ # Secondary DNS server. ++ # Will be suggested to the client. ++ # If omitted the system default will be used. ++ # Normally you do not need to uncomment this tag. ++ #option dns2 172.16.0.6 ++ ++ # Domain name ++ # Will be suggested to the client. ++ # Normally you do not need to uncomment this tag. ++ option domain key.chillispot.org ++ ++ # Script executed after network interface has been brought up. ++ # Executed with the following parameters: ++ # Normally you do not need to uncomment this tag. ++ #option ipup /etc/chilli.ipup ++ ++ # Script executed after network interface has been taken down. ++ # Executed with the following parameters: ++ # Normally you do not need to uncomment this tag. ++ #option ipdown /etc/chilli.ipdown ++ ++ # Script executed after a user has been authenticated. ++ # Executed with the following parameters: ++ # ++ # Normally you do not need to uncomment this tag. ++ #option conup /etc/chilli.conup ++ ++ # Script executed after a user has disconnected. ++ # Executed with the following parameters: ++ # ++ # Normally you do not need to uncomment this tag. ++ #option condown /etc/chilli.condown ++ ++ ++# DHCP Parameters ++config dhcp ++ ++ # Ethernet interface to listen to. ++ # This is the network interface which is connected to the access points. ++ # In a typical configuration this tag should be set to eth1. ++ option dhcpif eth1 ++ ++ # Use specified MAC address. ++ # An address in the range 00:00:5E:00:02:00 - 00:00:5E:FF:FF:FF falls ++ # within the IANA range of addresses and is not allocated for other ++ # purposes. ++ # Normally you do not need to uncomment this tag. ++ #option dhcpmac 00:00:5E:00:02:00 ++ ++ # Time before DHCP lease expires ++ # Normally you do not need to uncomment this tag. ++ #option lease 600 ++ ++ ++# Radius parameters ++config radius ++ ++ # IP address to listen to ++ # Normally you do not need to uncomment this tag. ++ #option radiuslisten 127.0.0.1 ++ ++ # IP address of radius server 1 ++ # For most installations you need to modify this tag. ++ option radiusserver1 rad01.chillispot.org ++ ++ # IP address of radius server 2 ++ # If you have only one radius server you should set radiusserver2 to the ++ # same value as radiusserver1. ++ # For most installations you need to modify this tag. ++ option radiusserver2 rad02.chillispot.org ++ ++ # Radius authentication port ++ # The UDP port number to use for radius authentication requests. ++ # The same port number is used for both radiusserver1 and radiusserver2. ++ # Normally you do not need to uncomment this tag. ++ #option radiusauthport 1812 ++ ++ # Radius accounting port ++ # The UDP port number to use for radius accounting requests. ++ # The same port number is used for both radiusserver1 and radiusserver2. ++ # Normally you do not need to uncomment this tag. ++ #option radiusacctport 1813 ++ ++ # Radius shared secret for both servers ++ # For all installations you should modify this tag. ++ #option radiussecret testing123 ++ ++ # Radius NAS-Identifier ++ # Normally you do not need to uncomment this tag. ++ #option radiusnasid nas01 ++ ++ # Radius NAS-IP-Address ++ # Normally you do not need to uncomment this tag. ++ #option radiusnasip 127.0.0.1 ++ ++ # Radius Called-Station-ID ++ # Normally you do not need to uncomment this tag. ++ #option radiuscalled 00133300 ++ ++ # WISPr Location ID. Should be in the format: isocc=, ++ # cc=,ac=,network= ++ # Normally you do not need to uncomment this tag. ++ #option radiuslocationid isocc=us,cc=1,ac=408,network=ACMEWISP_NewarkAirport ++ ++ # WISPr Location Name. Should be in the format: ++ # , ++ # Normally you do not need to uncomment this tag. ++ #option radiuslocationname ACMEWISP,Gate_14_Terminal_C_of_Newark_Airport ++ ++ ++# Radius proxy parameters ++config proxy ++ ++ # IP address to listen to ++ # Normally you do not need to uncomment this tag. ++ #option proxylisten 10.0.0.1 ++ ++ # UDP port to listen to. ++ # If not specified a port will be selected by the system ++ # Normally you do not need to uncomment this tag. ++ #option proxyport 1645 ++ ++ # Client(s) from which we accept radius requests ++ # Normally you do not need to uncomment this tag. ++ #option proxyclient 10.0.0.1/24 ++ ++ # Radius proxy shared secret for all clients ++ # If not specified defaults to radiussecret ++ # Normally you do not need to uncomment this tag. ++ #option proxysecret testing123 ++ ++ ++# Universal access method (UAM) parameters ++config uam ++ ++ # URL of web server handling authentication. ++ option uamserver https://radius.chillispot.org/hotspotlogin ++ ++ # URL of welcome homepage. ++ # Unauthenticated users will be redirected to this URL. If not specified ++ # users will be redirected to the uamserver instead. ++ # Normally you do not need to uncomment this tag. ++ #option uamhomepage http://192.168.182.1/welcome.html ++ ++ # Shared between chilli and authentication web server ++ #option uamsecret ht2eb8ej6s4et3rg1ulp ++ ++ # IP address to listen to for authentication requests ++ # Do not uncomment this tag unless you are an experienced user! ++ #option uamlisten 192.168.182.1 ++ ++ # TCP port to listen to for authentication requests ++ # Do not uncomment this tag unless you are an experienced user! ++ #option uamport 3990 ++ ++ # Comma separated list of domain names, IP addresses or network segments ++ # the client can access without first authenticating. ++ # It is possible to specify this tag multiple times. ++ # Normally you do not need to uncomment this tag. ++ #list uamallowed www.chillispot.org ++ #list uamallowed 10.11.12.0/24 ++ ++ # If this flag is given unauthenticated users are allowed to use ++ # any DNS server. ++ # Normally you do not need to uncomment this tag. ++ #uamanydns ++ ++ ++# MAC authentication ++config macauth ++ ++ # If this flag is given users will be authenticated only on their MAC ++ # address. ++ # Normally you do not need to enable this flag. ++ option macauth 0 ++ ++ # List of MAC addresses. ++ # The MAC addresses specified in this list will be authenticated only on ++ # their MAC address. ++ # This tag is ignored if the macauth tag is given. ++ # It is possible to specify this tag multiple times. ++ # Normally you do not need to uncomment this tag. ++ #list macallowed 00-0A-5E-AC-BE-51 ++ #list macallowed 00-30-1B-3C-32-E9 ++ ++ # Password to use for MAC authentication. ++ # Normally you do not need to uncomment this tag. ++ #option macpasswd password ++ ++ # Suffix to add to MAC address in order to form the username. ++ # Normally you do not need to uncomment this tag. ++ #option macsuffix suffix +diff --git a/feeds/luci/applications/luci-app-ddns/Makefile b/feeds/luci/applications/luci-app-ddns/Makefile +new file mode 100644 +index 0000000..0e1e5df +--- /dev/null ++++ b/feeds/luci/applications/luci-app-ddns/Makefile +@@ -0,0 +1,38 @@ ++# ++# Copyright (C) 2008-2015 The LuCI Team ++# ++# This is free software, licensed under the Apache License, Version 2.0 . ++# ++ ++include $(TOPDIR)/rules.mk ++ ++PKG_NAME:=luci-app-ddns ++ ++# Version == major.minor.patch ++# increase on new functionality (minor) or patches (patch) ++PKG_VERSION:=2.2.4 ++ ++# Release == build ++# increase on changes of translation files ++PKG_RELEASE:=1 ++ ++PKG_LICENSE:=Apache-2.0 ++PKG_MAINTAINER:=Christian Schoenebeck ++ ++# LuCI specific settings ++LUCI_TITLE:=LuCI Support for Dynamic DNS Client (ddns-scripts) ++LUCI_DEPENDS:=+luci-mod-admin-full +ddns-scripts ++LUCI_PKGARCH:=all ++ ++define Package/$(PKG_NAME)/config ++# shown in make menuconfig ++help ++ $(LUCI_TITLE) ++ . ++ Version: $(PKG_VERSION)-$(PKG_RELEASE) ++ $(PKG_MAINTAINER) ++endef ++ ++include $(TOPDIR)/feeds/luci/luci.mk ++ ++# call BuildPackage - OpenWrt buildroot signature +diff --git a/feeds/luci/applications/luci-app-ddns/luasrc/controller/ddns.lua b/feeds/luci/applications/luci-app-ddns/luasrc/controller/ddns.lua +new file mode 100644 +index 0000000..946dfef +--- /dev/null ++++ b/feeds/luci/applications/luci-app-ddns/luasrc/controller/ddns.lua +@@ -0,0 +1,237 @@ ++-- Copyright 2008 Steven Barth ++-- Copyright 2008 Jo-Philipp Wich ++-- Copyright 2013 Manuel Munz ++-- Copyright 2014 Christian Schoenebeck ++-- Licensed to the public under the Apache License 2.0. ++ ++module("luci.controller.ddns", package.seeall) ++ ++local NX = require "nixio" ++local NXFS = require "nixio.fs" ++local DISP = require "luci.dispatcher" ++local HTTP = require "luci.http" ++local UCI = require "luci.model.uci" ++local SYS = require "luci.sys" ++local DDNS = require "luci.tools.ddns" -- ddns multiused functions ++local UTIL = require "luci.util" ++ ++DDNS_MIN = "2.4.2-1" -- minimum version of service required ++ ++function index() ++ local nxfs = require "nixio.fs" -- global definitions not available ++ local sys = require "luci.sys" -- in function index() ++ local ddns = require "luci.tools.ddns" -- ddns multiused functions ++ local verinst = ddns.ipkg_ver_installed("ddns-scripts") ++ local verok = ddns.ipkg_ver_compare(verinst, ">=", "2.0.0-0") ++ -- do NOT start it not ddns-scripts version 2.x ++ if not verok then ++ return ++ end ++ -- no config create an empty one ++ if not nxfs.access("/etc/config/ddns") then ++ nxfs.writefile("/etc/config/ddns", "") ++ end ++ ++ entry( {"admin", "services", "ddns"}, cbi("ddns/overview"), _("Dynamic DNS"), 59) ++ entry( {"admin", "services", "ddns", "detail"}, cbi("ddns/detail"), nil ).leaf = true ++ entry( {"admin", "services", "ddns", "hints"}, cbi("ddns/hints", ++ {hideapplybtn=true, hidesavebtn=true, hideresetbtn=true}), nil ).leaf = true ++ entry( {"admin", "services", "ddns", "global"}, cbi("ddns/global"), nil ).leaf = true ++ entry( {"admin", "services", "ddns", "logview"}, call("logread") ).leaf = true ++ entry( {"admin", "services", "ddns", "startstop"}, call("startstop") ).leaf = true ++ entry( {"admin", "services", "ddns", "status"}, call("status") ).leaf = true ++end ++ ++-- function to read all sections status and return data array ++local function _get_status() ++ local uci = UCI.cursor() ++ local service = SYS.init.enabled("ddns") and 1 or 0 ++ local url_start = DISP.build_url("admin", "system", "startup") ++ local data = {} -- Array to transfer data to javascript ++ ++ data[#data+1] = { ++ enabled = service, -- service enabled ++ url_up = url_start, -- link to enable DDS (System-Startup) ++ } ++ ++ uci:foreach("ddns", "service", function (s) ++ ++ -- Get section we are looking at ++ -- and enabled state ++ local section = s[".name"] ++ local enabled = tonumber(s["enabled"]) or 0 ++ local datelast = "_empty_" -- formatted date of last update ++ local datenext = "_empty_" -- formatted date of next update ++ ++ -- get force seconds ++ local force_seconds = DDNS.calc_seconds( ++ tonumber(s["force_interval"]) or 72 , ++ s["force_unit"] or "hours" ) ++ -- get/validate pid and last update ++ local pid = DDNS.get_pid(section) ++ local uptime = SYS.uptime() ++ local lasttime = DDNS.get_lastupd(section) ++ if lasttime > uptime then -- /var might not be linked to /tmp ++ lasttime = 0 -- and/or not cleared on reboot ++ end ++ ++ -- no last update happen ++ if lasttime == 0 then ++ datelast = "_never_" ++ ++ -- we read last update ++ else ++ -- calc last update ++ -- sys.epoch - sys uptime + lastupdate(uptime) ++ local epoch = os.time() - uptime + lasttime ++ -- use linux date to convert epoch ++ datelast = DDNS.epoch2date(epoch) ++ -- calc and fill next update ++ datenext = DDNS.epoch2date(epoch + force_seconds) ++ end ++ ++ -- process running but update needs to happen ++ -- problems if force_seconds > uptime ++ force_seconds = (force_seconds > uptime) and uptime or force_seconds ++ if pid > 0 and ( lasttime + force_seconds - uptime ) <= 0 then ++ datenext = "_verify_" ++ ++ -- run once ++ elseif force_seconds == 0 then ++ datenext = "_runonce_" ++ ++ -- no process running and NOT enabled ++ elseif pid == 0 and enabled == 0 then ++ datenext = "_disabled_" ++ ++ -- no process running and enabled ++ elseif pid == 0 and enabled ~= 0 then ++ datenext = "_stopped_" ++ end ++ ++ -- get/set monitored interface and IP version ++ local iface = s["interface"] or "_nonet_" ++ local use_ipv6 = tonumber(s["use_ipv6"]) or 0 ++ if iface ~= "_nonet_" then ++ local ipv = (use_ipv6 == 1) and "IPv6" or "IPv4" ++ iface = ipv .. " / " .. iface ++ end ++ ++ -- try to get registered IP ++ local domain = s["domain"] or "_nodomain_" ++ local dnsserver = s["dns_server"] or "" ++ local force_ipversion = tonumber(s["force_ipversion"] or 0) ++ local force_dnstcp = tonumber(s["force_dnstcp"] or 0) ++ local command = [[/usr/lib/ddns/dynamic_dns_lucihelper.sh]] ++ command = command .. [[ get_registered_ip ]] .. domain .. [[ ]] .. use_ipv6 .. ++ [[ ]] .. force_ipversion .. [[ ]] .. force_dnstcp .. [[ ]] .. dnsserver ++ local reg_ip = SYS.exec(command) ++ if reg_ip == "" then ++ reg_ip = "_nodata_" ++ end ++ ++ -- fill transfer array ++ data[#data+1] = { ++ section = section, ++ enabled = enabled, ++ iface = iface, ++ domain = domain, ++ reg_ip = reg_ip, ++ pid = pid, ++ datelast = datelast, ++ datenext = datenext ++ } ++ end) ++ ++ uci:unload("ddns") ++ return data ++end ++ ++-- called by XHR.get from detail_logview.htm ++function logread(section) ++ -- read application settings ++ local uci = UCI.cursor() ++ local log_dir = uci:get("ddns", "global", "log_dir") or "/var/log/ddns" ++ local lfile = log_dir .. "/" .. section .. ".log" ++ local ldata = NXFS.readfile(lfile) ++ ++ if not ldata or #ldata == 0 then ++ ldata="_nodata_" ++ end ++ uci:unload("ddns") ++ HTTP.write(ldata) ++end ++ ++-- called by XHR.get from overview_status.htm ++function startstop(section, enabled) ++ local uci = UCI.cursor() ++ local pid = DDNS.get_pid(section) ++ local data = {} -- Array to transfer data to javascript ++ ++ -- if process running we want to stop and return ++ if pid > 0 then ++ local tmp = NX.kill(pid, 15) -- terminate ++ NX.nanosleep(2) -- 2 second "show time" ++ -- status changed so return full status ++ data = _get_status() ++ HTTP.prepare_content("application/json") ++ HTTP.write_json(data) ++ return ++ end ++ ++ -- read uncommitted changes ++ -- we don't save and commit data from other section or other options ++ -- only enabled will be done ++ local exec = true ++ local changed = uci:changes("ddns") ++ for k_config, v_section in pairs(changed) do ++ -- security check because uci.changes only gets our config ++ if k_config ~= "ddns" then ++ exec = false ++ break ++ end ++ for k_section, v_option in pairs(v_section) do ++ -- check if only section of button was changed ++ if k_section ~= section then ++ exec = false ++ break ++ end ++ for k_option, v_value in pairs(v_option) do ++ -- check if only enabled was changed ++ if k_option ~= "enabled" then ++ exec = false ++ break ++ end ++ end ++ end ++ end ++ ++ -- we can not execute because other ++ -- uncommitted changes pending, so exit here ++ if not exec then ++ HTTP.write("_uncommitted_") ++ return ++ end ++ ++ -- save enable state ++ uci:set("ddns", section, "enabled", ( (enabled == "true") and "1" or "0") ) ++ uci:save("ddns") ++ uci:commit("ddns") ++ uci:unload("ddns") ++ ++ -- start dynamic_dns_updater.sh script ++ os.execute ([[/usr/lib/ddns/dynamic_dns_updater.sh %s 0 > /dev/null 2>&1 &]] % section) ++ NX.nanosleep(3) -- 3 seconds "show time" ++ ++ -- status changed so return full status ++ data = _get_status() ++ HTTP.prepare_content("application/json") ++ HTTP.write_json(data) ++end ++ ++-- called by XHR.poll from overview_status.htm ++function status() ++ local data = _get_status() ++ HTTP.prepare_content("application/json") ++ HTTP.write_json(data) ++end +diff --git a/feeds/luci/applications/luci-app-ddns/luasrc/model/cbi/ddns/detail.lua b/feeds/luci/applications/luci-app-ddns/luasrc/model/cbi/ddns/detail.lua +new file mode 100644 +index 0000000..27f9a9f +--- /dev/null ++++ b/feeds/luci/applications/luci-app-ddns/luasrc/model/cbi/ddns/detail.lua +@@ -0,0 +1,1240 @@ ++-- Copyright 2008 Steven Barth ++-- Copyright 2008 Jo-Philipp Wich ++-- Copyright 2013 Manuel Munz ++-- Copyright 2014-2015 Christian Schoenebeck ++-- Licensed to the public under the Apache License 2.0. ++ ++local NX = require "nixio" ++local NXFS = require "nixio.fs" ++local SYS = require "luci.sys" ++local UTIL = require "luci.util" ++local DISP = require "luci.dispatcher" ++local WADM = require "luci.tools.webadmin" ++local DTYP = require "luci.cbi.datatypes" ++local DDNS = require "luci.tools.ddns" -- ddns multiused functions ++ ++-- takeover arguments -- ####################################################### ++local section = arg[1] ++ ++-- check supported options -- ################################################## ++-- saved to local vars here because doing multiple os calls slow down the system ++local has_ipv6 = DDNS.check_ipv6() -- IPv6 support ++local has_ssl = DDNS.check_ssl() -- HTTPS support ++local has_proxy = DDNS.check_proxy() -- Proxy support ++local has_dnstcp = DDNS.check_bind_host() -- DNS TCP support ++local has_force = has_ssl and has_dnstcp -- Force IP Protocoll ++ ++-- html constants -- ########################################################### ++local font_red = "" ++local font_off = "" ++local bold_on = "" ++local bold_off = "" ++ ++-- error text constants -- ##################################################### ++err_ipv6_plain = translate("IPv6 not supported") .. " - " .. ++ translate("please select 'IPv4' address version") ++err_ipv6_basic = bold_on .. ++ font_red .. ++ translate("IPv6 not supported") .. ++ font_off .. ++ "
    " .. translate("please select 'IPv4' address version") .. ++ bold_off ++err_ipv6_other = bold_on .. ++ font_red .. ++ translate("IPv6 not supported") .. ++ font_off .. ++ "
    " .. translate("please select 'IPv4' address version in") .. " " .. ++ [[]] .. ++ translate("Basic Settings") .. ++ [[]] .. ++ bold_off ++ ++function err_tab_basic(self) ++ return translate("Basic Settings") .. " - " .. self.title .. ": " ++end ++function err_tab_adv(self) ++ return translate("Advanced Settings") .. " - " .. self.title .. ": " ++end ++function err_tab_timer(self) ++ return translate("Timer Settings") .. " - " .. self.title .. ": " ++end ++ ++-- function to verify settings around ip_source ++-- will use dynamic_dns_lucihelper to check if ++-- local IP can be read ++local function _verify_ip_source() ++ -- section is globally defined here be calling agrument (see above) ++ local _network = "-" ++ local _url = "-" ++ local _interface = "-" ++ local _script = "-" ++ local _proxy = "" ++ ++ local _ipv6 = usev6:formvalue(section) ++ local _source = (_ipv6 == "1") ++ and src6:formvalue(section) ++ or src4:formvalue(section) ++ if _source == "network" then ++ _network = (_ipv6 == "1") ++ and ipn6:formvalue(section) ++ or ipn4:formvalue(section) ++ elseif _source == "web" then ++ _url = (_ipv6 == "1") ++ and iurl6:formvalue(section) ++ or iurl4:formvalue(section) ++ -- proxy only needed for checking url ++ _proxy = (pxy) and pxy:formvalue(section) or "" ++ elseif _source == "interface" then ++ _interface = ipi:formvalue(section) ++ elseif _source == "script" then ++ _script = ips:formvalue(section) ++ end ++ ++ local command = [[/usr/lib/ddns/dynamic_dns_lucihelper.sh get_local_ip ]] .. ++ _ipv6 .. [[ ]] .. _source .. [[ ]] .. _network .. [[ ]] .. ++ _url .. [[ ]] .. _interface .. [[ ']] .. _script.. [[' ]] .. _proxy ++ local ret = SYS.call(command) ++ ++ if ret == 0 then ++ return true -- valid ++ else ++ return nil -- invalid ++ end ++end ++ ++-- cbi-map definition -- ####################################################### ++m = Map("ddns") ++ ++-- first need to close from cbi map template our closed by template ++m.title = [[]] .. ++ translate("Dynamic DNS") ++ ++m.description = translate("Dynamic DNS allows that your router can be reached with " .. ++ "a fixed hostname while having a dynamically changing " .. ++ "IP address.") ++ ++m.redirect = DISP.build_url("admin", "services", "ddns") ++ ++m.on_after_commit = function(self) ++ if self.changed then -- changes ? ++ local pid = DDNS.get_pid(section) ++ if pid > 0 then -- running ? ++ local tmp = NX.kill(pid, 1) -- send SIGHUP ++ end ++ end ++end ++ ++-- read application settings -- ################################################ ++-- date format; if not set use ISO format ++date_format = m.uci:get(m.config, "global", "date_format") or "%F %R" ++-- log directory ++log_dir = m.uci:get(m.config, "global", "log_dir") or "/var/log/ddns" ++ ++-- cbi-section definition -- ################################################### ++ns = m:section( NamedSection, section, "service", ++ translate("Details for") .. ([[: %s]] % section), ++ translate("Configure here the details for selected Dynamic DNS service.") ++ .. [[
    ]] ++ .. translate("For detailed information about parameter settings look here.") ++ .. [[]] ) ++ns.instance = section -- arg [1] ++ns:tab("basic", translate("Basic Settings"), nil ) ++ns:tab("advanced", translate("Advanced Settings"), nil ) ++ns:tab("timer", translate("Timer Settings"), nil ) ++ns:tab("logview", translate("Log File Viewer"), nil ) ++ ++-- TAB: Basic ##################################################################################### ++-- enabled -- ################################################################# ++en = ns:taboption("basic", Flag, "enabled", ++ translate("Enabled"), ++ translate("If this service section is disabled it could not be started." .. "
    " .. ++ "Neither from LuCI interface nor from console") ) ++en.orientation = "horizontal" ++function en.parse(self, section) ++ DDNS.flag_parse(self, section) ++end ++ ++-- use_ipv6 (NEW) -- ########################################################## ++usev6 = ns:taboption("basic", ListValue, "use_ipv6", ++ translate("IP address version"), ++ translate("Defines which IP address 'IPv4/IPv6' is send to the DDNS provider") ) ++usev6.widget = "radio" ++usev6.default = "0" ++usev6:value("0", translate("IPv4-Address") ) ++function usev6.cfgvalue(self, section) ++ local value = AbstractValue.cfgvalue(self, section) ++ if has_ipv6 or (value == "1" and not has_ipv6) then ++ self:value("1", translate("IPv6-Address") ) ++ end ++ if value == "1" and not has_ipv6 then ++ self.description = err_ipv6_basic ++ end ++ return value ++end ++function usev6.validate(self, value) ++ if (value == "1" and has_ipv6) or value == "0" then ++ return value ++ end ++ return nil, err_tab_basic(self) .. err_ipv6_plain ++end ++function usev6.write(self, section, value) ++ if value == "0" then -- force rmempty ++ return self.map:del(section, self.option) ++ else ++ return self.map:set(section, self.option, value) ++ end ++end ++ ++-- IPv4 - service_name -- ###################################################### ++svc4 = ns:taboption("basic", ListValue, "ipv4_service_name", ++ translate("DDNS Service provider") .. " [IPv4]" ) ++svc4.default = "-" ++svc4:depends("use_ipv6", "0") -- only show on IPv4 ++ ++local services4 = { } ++local fd4 = io.open("/usr/lib/ddns/services", "r") ++ ++if fd4 then ++ local ln ++ repeat ++ ln = fd4:read("*l") ++ local s = ln and ln:match('^%s*"([^"]+)"') ++ if s then services4[#services4+1] = s end ++ until not ln ++ fd4:close() ++end ++ ++for _, v in UTIL.vspairs(services4) do svc4:value(v) end ++svc4:value("-", translate("-- custom --") ) ++ ++function svc4.cfgvalue(self, section) ++ local v = DDNS.read_value(self, section, "service_name") ++ if not v or #v == 0 then ++ return "-" ++ else ++ return v ++ end ++end ++function svc4.validate(self, value) ++ if usev6:formvalue(section) == "0" then -- do only on IPv4 ++ return value ++ else ++ return "" -- supress validate error ++ end ++end ++function svc4.write(self, section, value) ++ if usev6:formvalue(section) == "0" then -- do only IPv4 here ++ self.map:del(section, self.option) -- to be shure ++ if value ~= "-" then -- and write "service_name ++ self.map:del(section, "update_url") -- delete update_url ++ return self.map:set(section, "service_name", value) ++ else ++ return self.map:del(section, "service_name") ++ end ++ end ++end ++ ++-- IPv6 - service_name -- ###################################################### ++svc6 = ns:taboption("basic", ListValue, "ipv6_service_name", ++ translate("DDNS Service provider") .. " [IPv6]" ) ++svc6.default = "-" ++svc6:depends("use_ipv6", "1") -- only show on IPv6 ++if not has_ipv6 then ++ svc6.description = err_ipv6_basic ++end ++ ++local services6 = { } ++local fd6 = io.open("/usr/lib/ddns/services_ipv6", "r") ++ ++if fd6 then ++ local ln ++ repeat ++ ln = fd6:read("*l") ++ local s = ln and ln:match('^%s*"([^"]+)"') ++ if s then services6[#services6+1] = s end ++ until not ln ++ fd6:close() ++end ++ ++for _, v in UTIL.vspairs(services6) do svc6:value(v) end ++svc6:value("-", translate("-- custom --") ) ++ ++function svc6.cfgvalue(self, section) ++ local v = DDNS.read_value(self, section, "service_name") ++ if not v or #v == 0 then ++ return "-" ++ else ++ return v ++ end ++end ++function svc6.validate(self, value) ++ if usev6:formvalue(section) == "1" then -- do only on IPv6 ++ if has_ipv6 then return value end ++ return nil, err_tab_basic(self) .. err_ipv6_plain ++ else ++ return "" -- supress validate error ++ end ++end ++function svc6.write(self, section, value) ++ if usev6:formvalue(section) == "1" then -- do only when IPv6 ++ self.map:del(section, self.option) -- delete "ipv6_service_name" helper ++ if value ~= "-" then -- and write "service_name ++ self.map:del(section, "update_url") -- delete update_url ++ return self.map:set(section, "service_name", value) ++ else ++ return self.map:del(section, "service_name") ++ end ++ end ++end ++ ++-- IPv4/IPv6 - update_url -- ################################################### ++uurl = ns:taboption("basic", Value, "update_url", ++ translate("Custom update-URL"), ++ translate("Update URL to be used for updating your DDNS Provider." .. "
    " .. ++ "Follow instructions you will find on their WEB page.") ) ++uurl:depends("ipv4_service_name", "-") ++uurl:depends("ipv6_service_name", "-") ++function uurl.validate(self, value) ++ local script = ush:formvalue(section) ++ ++ if (usev6:formvalue(section) == "0" and svc4:formvalue(section) ~= "-") or ++ (usev6:formvalue(section) == "1" and svc6:formvalue(section) ~= "-") then ++ return "" -- suppress validate error ++ elseif not value then ++ if not script or not (#script > 0) then ++ return nil, err_tab_basic(self) .. translate("missing / required") ++ else ++ return "" -- suppress validate error / update_script is given ++ end ++ elseif (#script > 0) then ++ return nil, err_tab_basic(self) .. translate("either url or script could be set") ++ end ++ ++ local url = DDNS.parse_url(value) ++ if not url.scheme == "http" then ++ return nil, err_tab_basic(self) .. translate("must start with 'http://'") ++ elseif not url.query then ++ return nil, err_tab_basic(self) .. " " .. translate("missing / required") ++ elseif not url.host then ++ return nil, err_tab_basic(self) .. " " .. translate("missing / required") ++ elseif SYS.call([[nslookup ]] .. url.host .. [[ >/dev/null 2>&1]]) ~= 0 then ++ return nil, err_tab_basic(self) .. translate("can not resolve host: ") .. url.host ++ end ++ ++ return value ++end ++ ++-- IPv4/IPv6 - update_script -- ################################################ ++ush = ns:taboption("basic", Value, "update_script", ++ translate("Custom update-script"), ++ translate("Custom update script to be used for updating your DDNS Provider.") ) ++ush:depends("ipv4_service_name", "-") ++ush:depends("ipv6_service_name", "-") ++function ush.validate(self, value) ++ local url = uurl:formvalue(section) ++ ++ if (usev6:formvalue(section) == "0" and svc4:formvalue(section) ~= "-") or ++ (usev6:formvalue(section) == "1" and svc6:formvalue(section) ~= "-") then ++ return "" -- suppress validate error ++ elseif not value then ++ if not url or not (#url > 0) then ++ return nil, err_tab_basic(self) .. translate("missing / required") ++ else ++ return "" -- suppress validate error / update_url is given ++ end ++ elseif (#url > 0) then ++ return nil, err_tab_basic(self) .. translate("either url or script could be set") ++ elseif not NXFS.access(value) then ++ return nil, err_tab_basic(self) .. translate("File not found") ++ end ++ return value ++end ++ ++-- IPv4/IPv6 - domain -- ####################################################### ++dom = ns:taboption("basic", Value, "domain", ++ translate("Hostname/Domain"), ++ translate("Replaces [DOMAIN] in Update-URL") ) ++dom.rmempty = false ++dom.placeholder = "mypersonaldomain.dyndns.org" ++function dom.validate(self, value) ++ if not value ++ or not (#value > 0) ++ or not DTYP.hostname(value) then ++ return nil, err_tab_basic(self) .. translate("invalid - Sample") .. ": 'mypersonaldomain.dyndns.org'" ++ else ++ return value ++ end ++end ++ ++-- IPv4/IPv6 - username -- ##################################################### ++user = ns:taboption("basic", Value, "username", ++ translate("Username"), ++ translate("Replaces [USERNAME] in Update-URL") ) ++user.rmempty = false ++function user.validate(self, value) ++ if not value then ++ return nil, err_tab_basic(self) .. translate("missing / required") ++ end ++ return value ++end ++ ++-- IPv4/IPv6 - password -- ##################################################### ++pw = ns:taboption("basic", Value, "password", ++ translate("Password"), ++ translate("Replaces [PASSWORD] in Update-URL") ) ++pw.rmempty = false ++pw.password = true ++function pw.validate(self, value) ++ if not value then ++ return nil, err_tab_basic(self) .. translate("missing / required") ++ end ++ return value ++end ++ ++-- IPv4/IPv6 - use_https (NEW) -- ############################################## ++if has_ssl or ( ( m:get(section, "use_https") or "0" ) == "1" ) then ++ https = ns:taboption("basic", Flag, "use_https", ++ translate("Use HTTP Secure") ) ++ https.orientation = "horizontal" ++ https.rmempty = false -- force validate function ++ function https.cfgvalue(self, section) ++ local value = AbstractValue.cfgvalue(self, section) ++ if not has_ssl and value == "1" then ++ self.description = bold_on .. font_red .. ++ translate("HTTPS not supported") .. font_off .. "
    " .. ++ translate("please disable") .. " !" .. bold_off ++ else ++ self.description = translate("Enable secure communication with DDNS provider") ++ end ++ return value ++ end ++ function https.parse(self, section) ++ DDNS.flag_parse(self, section) ++ end ++ function https.validate(self, value) ++ if (value == "1" and has_ssl ) or value == "0" then return value end ++ return nil, err_tab_basic(self) .. translate("HTTPS not supported") .. " !" ++ end ++ function https.write(self, section, value) ++ if value == "1" then ++ return self.map:set(section, self.option, value) ++ else ++ self.map:del(section, "cacert") ++ return self.map:del(section, self.option) ++ end ++ end ++end ++ ++-- IPv4/IPv6 - cacert (NEW) -- ################################################# ++if has_ssl then ++ cert = ns:taboption("basic", Value, "cacert", ++ translate("Path to CA-Certificate"), ++ translate("directory or path/file") .. "
    " .. ++ translate("or") .. bold_on .. " IGNORE " .. bold_off .. ++ translate("to run HTTPS without verification of server certificates (insecure)") ) ++ cert:depends("use_https", "1") ++ cert.rmempty = false -- force validate function ++ cert.default = "/etc/ssl/certs" ++ function cert.validate(self, value) ++ if https:formvalue(section) == "0" then ++ return "" -- supress validate error if NOT https ++ end ++ if value then -- otherwise errors in datatype check ++ if DTYP.directory(value) ++ or DTYP.file(value) ++ or value == "IGNORE" then ++ return value ++ end ++ end ++ return nil, err_tab_basic(self) .. ++ translate("file or directory not found or not 'IGNORE'") .. " !" ++ end ++end ++ ++-- TAB: Advanced ################################################################################## ++-- IPv4 - ip_source -- ######################################################### ++src4 = ns:taboption("advanced", ListValue, "ipv4_source", ++ translate("IP address source") .. " [IPv4]", ++ translate("Defines the source to read systems IPv4-Address from, that will be send to the DDNS provider") ) ++src4:depends("use_ipv6", "0") -- IPv4 selected ++src4.default = "network" ++src4:value("network", translate("Network")) ++src4:value("web", translate("URL")) ++src4:value("interface", translate("Interface")) ++src4:value("script", translate("Script")) ++function src4.cfgvalue(self, section) ++ return DDNS.read_value(self, section, "ip_source") ++end ++function src4.validate(self, value) ++ if usev6:formvalue(section) == "1" then ++ return "" -- ignore on IPv6 selected ++ elseif not _verify_ip_source() then ++ return nil, err_tab_adv(self) .. ++ translate("can not detect local IP. Please select a different Source combination") ++ else ++ return value ++ end ++end ++function src4.write(self, section, value) ++ if usev6:formvalue(section) == "1" then ++ return true -- ignore on IPv6 selected ++ elseif value == "network" then ++ self.map:del(section, "ip_url") -- delete not need parameters ++ self.map:del(section, "ip_interface") ++ self.map:del(section, "ip_script") ++ elseif value == "web" then ++ self.map:del(section, "ip_network") -- delete not need parameters ++ self.map:del(section, "ip_interface") ++ self.map:del(section, "ip_script") ++ elseif value == "interface" then ++ self.map:del(section, "ip_network") -- delete not need parameters ++ self.map:del(section, "ip_url") ++ self.map:del(section, "ip_script") ++ elseif value == "script" then ++ self.map:del(section, "ip_network") ++ self.map:del(section, "ip_url") -- delete not need parameters ++ self.map:del(section, "ip_interface") ++ end ++ self.map:del(section, self.option) -- delete "ipv4_source" helper ++ return self.map:set(section, "ip_source", value) -- and write "ip_source ++end ++ ++-- IPv6 - ip_source -- ######################################################### ++src6 = ns:taboption("advanced", ListValue, "ipv6_source", ++ translate("IP address source") .. " [IPv6]", ++ translate("Defines the source to read systems IPv6-Address from, that will be send to the DDNS provider") ) ++src6:depends("use_ipv6", 1) -- IPv6 selected ++src6.default = "network" ++src6:value("network", translate("Network")) ++src6:value("web", translate("URL")) ++src6:value("interface", translate("Interface")) ++src6:value("script", translate("Script")) ++if not has_ipv6 then ++ src6.description = err_ipv6_other ++end ++function src6.cfgvalue(self, section) ++ return DDNS.read_value(self, section, "ip_source") ++end ++function src6.validate(self, value) ++ if usev6:formvalue(section) == "0" then ++ return "" -- ignore on IPv4 selected ++ elseif not has_ipv6 then ++ return nil, err_tab_adv(self) .. err_ipv6_plain ++ elseif not _verify_ip_source() then ++ return nil, err_tab_adv(self) .. ++ translate("can not detect local IP. Please select a different Source combination") ++ else ++ return value ++ end ++end ++function src6.write(self, section, value) ++ if usev6:formvalue(section) == "0" then ++ return true -- ignore on IPv4 selected ++ elseif value == "network" then ++ self.map:del(section, "ip_url") -- delete not need parameters ++ self.map:del(section, "ip_interface") ++ self.map:del(section, "ip_script") ++ elseif value == "web" then ++ self.map:del(section, "ip_network") -- delete not need parameters ++ self.map:del(section, "ip_interface") ++ self.map:del(section, "ip_script") ++ elseif value == "interface" then ++ self.map:del(section, "ip_network") -- delete not need parameters ++ self.map:del(section, "ip_url") ++ self.map:del(section, "ip_script") ++ elseif value == "script" then ++ self.map:del(section, "ip_network") ++ self.map:del(section, "ip_url") -- delete not need parameters ++ self.map:del(section, "ip_interface") ++ end ++ self.map:del(section, self.option) -- delete "ipv4_source" helper ++ return self.map:set(section, "ip_source", value) -- and write "ip_source ++end ++ ++-- IPv4 - ip_network (default "wan") -- ######################################## ++ipn4 = ns:taboption("advanced", ListValue, "ipv4_network", ++ translate("Network") .. " [IPv4]", ++ translate("Defines the network to read systems IPv4-Address from") ) ++ipn4:depends("ipv4_source", "network") ++ipn4.default = "wan" ++WADM.cbi_add_networks(ipn4) ++function ipn4.cfgvalue(self, section) ++ return DDNS.read_value(self, section, "ip_network") ++end ++function ipn4.validate(self, value) ++ if usev6:formvalue(section) == "1" ++ or src4:formvalue(section) ~= "network" then ++ -- ignore if IPv6 selected OR ++ -- ignore everything except "network" ++ return "" ++ else ++ return value ++ end ++end ++function ipn4.write(self, section, value) ++ if usev6:formvalue(section) == "1" ++ or src4:formvalue(section) ~= "network" then ++ -- ignore if IPv6 selected OR ++ -- ignore everything except "network" ++ return true ++ else ++ -- set also as "interface" for monitoring events changes/hot-plug ++ self.map:set(section, "interface", value) ++ self.map:del(section, self.option) -- delete "ipv4_network" helper ++ return self.map:set(section, "ip_network", value) -- and write "ip_network" ++ end ++end ++ ++-- IPv6 - ip_network (default "wan6") -- ####################################### ++ipn6 = ns:taboption("advanced", ListValue, "ipv6_network", ++ translate("Network") .. " [IPv6]" ) ++ipn6:depends("ipv6_source", "network") ++ipn6.default = "wan6" ++WADM.cbi_add_networks(ipn6) ++if has_ipv6 then ++ ipn6.description = translate("Defines the network to read systems IPv6-Address from") ++else ++ ipn6.description = err_ipv6_other ++end ++function ipn6.cfgvalue(self, section) ++ return DDNS.read_value(self, section, "ip_network") ++end ++function ipn6.validate(self, value) ++ if usev6:formvalue(section) == "0" ++ or src6:formvalue(section) ~= "network" then ++ -- ignore if IPv4 selected OR ++ -- ignore everything except "network" ++ return "" ++ elseif has_ipv6 then ++ return value ++ else ++ return nil, err_tab_adv(self) .. err_ipv6_plain ++ end ++end ++function ipn6.write(self, section, value) ++ if usev6:formvalue(section) == "0" ++ or src6:formvalue(section) ~= "network" then ++ -- ignore if IPv4 selected OR ++ -- ignore everything except "network" ++ return true ++ else ++ -- set also as "interface" for monitoring events changes/hotplug ++ self.map:set(section, "interface", value) ++ self.map:del(section, self.option) -- delete "ipv6_network" helper ++ return self.map:set(section, "ip_network", value) -- and write "ip_network" ++ end ++end ++ ++-- IPv4 - ip_url (default "checkip.dyndns.com") -- ############################# ++iurl4 = ns:taboption("advanced", Value, "ipv4_url", ++ translate("URL to detect") .. " [IPv4]", ++ translate("Defines the Web page to read systems IPv4-Address from") ) ++iurl4:depends("ipv4_source", "web") ++iurl4.default = "http://checkip.dyndns.com" ++function iurl4.cfgvalue(self, section) ++ return DDNS.read_value(self, section, "ip_url") ++end ++function iurl4.validate(self, value) ++ if usev6:formvalue(section) == "1" ++ or src4:formvalue(section) ~= "web" then ++ -- ignore if IPv6 selected OR ++ -- ignore everything except "web" ++ return "" ++ elseif not value or #value == 0 then ++ return nil, err_tab_adv(self) .. translate("missing / required") ++ end ++ ++ local url = DDNS.parse_url(value) ++ if not (url.scheme == "http" or url.scheme == "https") then ++ return nil, err_tab_adv(self) .. translate("must start with 'http://'") ++ elseif not url.host then ++ return nil, err_tab_adv(self) .. " " .. translate("missing / required") ++ elseif SYS.call([[nslookup ]] .. url.host .. [[>/dev/null 2>&1]]) ~= 0 then ++ return nil, err_tab_adv(self) .. translate("can not resolve host: ") .. url.host ++ else ++ return value ++ end ++end ++function iurl4.write(self, section, value) ++ if usev6:formvalue(section) == "1" ++ or src4:formvalue(section) ~= "web" then ++ -- ignore if IPv6 selected OR ++ -- ignore everything except "web" ++ return true ++ else ++ self.map:del(section, self.option) -- delete "ipv4_url" helper ++ return self.map:set(section, "ip_url", value) -- and write "ip_url" ++ end ++end ++ ++-- IPv6 - ip_url (default "checkipv6.dyndns.com") -- ########################### ++iurl6 = ns:taboption("advanced", Value, "ipv6_url", ++ translate("URL to detect") .. " [IPv6]" ) ++iurl6:depends("ipv6_source", "web") ++iurl6.default = "http://checkipv6.dyndns.com" ++if has_ipv6 then ++ iurl6.description = translate("Defines the Web page to read systems IPv6-Address from") ++else ++ iurl6.description = err_ipv6_other ++end ++function iurl6.cfgvalue(self, section) ++ return DDNS.read_value(self, section, "ip_url") ++end ++function iurl6.validate(self, value) ++ if usev6:formvalue(section) == "0" ++ or src6:formvalue(section) ~= "web" then ++ -- ignore if IPv4 selected OR ++ -- ignore everything except "web" ++ return "" ++ elseif not has_ipv6 then ++ return nil, err_tab_adv(self) .. err_ipv6_plain ++ elseif not value or #value == 0 then ++ return nil, err_tab_adv(self) .. translate("missing / required") ++ end ++ ++ local url = DDNS.parse_url(value) ++ if not (url.scheme == "http" or url.scheme == "https") then ++ return nil, err_tab_adv(self) .. translate("must start with 'http://'") ++ elseif not url.host then ++ return nil, err_tab_adv(self) .. " " .. translate("missing / required") ++ elseif SYS.call([[nslookup ]] .. url.host .. [[>/dev/null 2>&1]]) ~= 0 then ++ return nil, err_tab_adv(self) .. translate("can not resolve host: ") .. url.host ++ else ++ return value ++ end ++end ++function iurl6.write(self, section, value) ++ if usev6:formvalue(section) == "0" ++ or src6:formvalue(section) ~= "web" then ++ -- ignore if IPv4 selected OR ++ -- ignore everything except "web" ++ return true ++ else ++ self.map:del(section, self.option) -- delete "ipv6_url" helper ++ return self.map:set(section, "ip_url", value) -- and write "ip_url" ++ end ++end ++ ++-- IPv4 + IPv6 - ip_interface -- ############################################### ++ipi = ns:taboption("advanced", ListValue, "ip_interface", ++ translate("Interface"), ++ translate("Defines the interface to read systems IP-Address from") ) ++ipi:depends("ipv4_source", "interface") -- IPv4 ++ipi:depends("ipv6_source", "interface") -- or IPv6 ++for _, v in pairs(SYS.net.devices()) do ++ -- show only interface set to a network ++ -- and ignore loopback ++ net = WADM.iface_get_network(v) ++ if net and net ~= "loopback" then ++ ipi:value(v) ++ end ++end ++function ipi.validate(self, value) ++ if (usev6:formvalue(section) == "0" and src4:formvalue(section) ~= "interface") ++ or (usev6:formvalue(section) == "1" and src6:formvalue(section) ~= "interface") then ++ return "" ++ else ++ return value ++ end ++end ++function ipi.write(self, section, value) ++ if (usev6:formvalue(section) == "0" and src4:formvalue(section) ~= "interface") ++ or (usev6:formvalue(section) == "1" and src6:formvalue(section) ~= "interface") then ++ return true ++ else ++ -- get network from device to ++ -- set also as "interface" for monitoring events changes/hotplug ++ local net = WADM.iface_get_network(value) ++ self.map:set(section, "interface", net) ++ return self.map:set(section, self.option, value) ++ end ++end ++ ++-- IPv4 + IPv6 - ip_script (NEW) -- ############################################ ++ips = ns:taboption("advanced", Value, "ip_script", ++ translate("Script"), ++ translate("User defined script to read systems IP-Address") ) ++ips:depends("ipv4_source", "script") -- IPv4 ++ips:depends("ipv6_source", "script") -- or IPv6 ++ips.rmempty = false ++ips.placeholder = "/path/to/script.sh" ++function ips.validate(self, value) ++ local split ++ if value then split = UTIL.split(value, " ") end ++ ++ if (usev6:formvalue(section) == "0" and src4:formvalue(section) ~= "script") ++ or (usev6:formvalue(section) == "1" and src6:formvalue(section) ~= "script") then ++ return "" ++ elseif not value or not (#value > 0) or not NXFS.access(split[1], "x") then ++ return nil, err_tab_adv(self) .. ++ translate("not found or not executable - Sample: '/path/to/script.sh'") ++ else ++ return value ++ end ++end ++function ips.write(self, section, value) ++ if (usev6:formvalue(section) == "0" and src4:formvalue(section) ~= "script") ++ or (usev6:formvalue(section) == "1" and src6:formvalue(section) ~= "script") then ++ return true ++ else ++ return self.map:set(section, self.option, value) ++ end ++end ++ ++-- IPv4 - interface - default "wan" -- ######################################### ++-- event network to monitor changes/hotplug/dynamic_dns_updater.sh ++-- only needs to be set if "ip_source"="web" or "script" ++-- if "ip_source"="network" or "interface" we use their network ++eif4 = ns:taboption("advanced", ListValue, "ipv4_interface", ++ translate("Event Network") .. " [IPv4]", ++ translate("Network on which the ddns-updater scripts will be started") ) ++eif4:depends("ipv4_source", "web") ++eif4:depends("ipv4_source", "script") ++eif4.default = "wan" ++WADM.cbi_add_networks(eif4) ++function eif4.cfgvalue(self, section) ++ return DDNS.read_value(self, section, "interface") ++end ++function eif4.validate(self, value) ++ if usev6:formvalue(section) == "1" ++ or src4:formvalue(section) == "network" ++ or src4:formvalue(section) == "interface" then ++ return "" -- ignore IPv6, network, interface ++ else ++ return value ++ end ++end ++function eif4.write(self, section, value) ++ if usev6:formvalue(section) == "1" ++ or src4:formvalue(section) == "network" ++ or src4:formvalue(section) == "interface" then ++ return true -- ignore IPv6, network, interface ++ else ++ self.map:del(section, self.option) -- delete "ipv4_interface" helper ++ return self.map:set(section, "interface", value) -- and write "interface" ++ end ++end ++ ++-- IPv6 - interface (NEW) - default "wan6" -- ################################## ++-- event network to monitor changes/hotplug (NEW) ++-- only needs to be set if "ip_source"="web" or "script" ++-- if "ip_source"="network" or "interface" we use their network ++eif6 = ns:taboption("advanced", ListValue, "ipv6_interface", ++ translate("Event Network") .. " [IPv6]" ) ++eif6:depends("ipv6_source", "web") ++eif6:depends("ipv6_source", "script") ++eif6.default = "wan6" ++WADM.cbi_add_networks(eif6) ++if not has_ipv6 then ++ eif6.description = err_ipv6_other ++else ++ eif6.description = translate("Network on which the ddns-updater scripts will be started") ++end ++function eif6.cfgvalue(self, section) ++ return DDNS.read_value(self, section, "interface") ++end ++function eif6.validate(self, value) ++ if usev6:formvalue(section) == "0" ++ or src4:formvalue(section) == "network" ++ or src4:formvalue(section) == "interface" then ++ return "" -- ignore IPv4, network, interface ++ elseif not has_ipv6 then ++ return nil, err_tab_adv(self) .. err_ipv6_plain ++ else ++ return value ++ end ++end ++function eif6.write(self, section, value) ++ if usev6:formvalue(section) == "0" ++ or src4:formvalue(section) == "network" ++ or src4:formvalue(section) == "interface" then ++ return true -- ignore IPv4, network, interface ++ else ++ self.map:del(section, self.option) -- delete "ipv6_interface" helper ++ return self.map:set(section, "interface", value) -- and write "interface" ++ end ++end ++ ++-- IPv4/IPv6 - bind_network -- ################################################# ++if has_ssl or ( ( m:get(section, "bind_network") or "" ) ~= "" ) then ++ bnet = ns:taboption("advanced", ListValue, "bind_network", ++ translate("Bind Network") ) ++ bnet:depends("ipv4_source", "web") ++ bnet:depends("ipv6_source", "web") ++ bnet.rmempty = true ++ bnet.default = "" ++ bnet:value("", translate("-- default --")) ++ WADM.cbi_add_networks(bnet) ++ function bnet.cfgvalue(self, section) ++ local value = AbstractValue.cfgvalue(self, section) ++ if not has_ssl and value ~= "" then ++ self.description = bold_on .. font_red .. ++ translate("Binding to a specific network not supported") .. font_off .. "
    " .. ++ translate("please set to 'default'") .. " !" .. bold_off ++ else ++ self.description = translate("OPTIONAL: Network to use for communication") .. ++ "
    " .. translate("Casual users should not change this setting") ++ end ++ return value ++ end ++ function bnet.validate(self, value) ++ if (value ~= "" and has_ssl ) or value == "" then return value end ++ return nil, err_tab_adv(self) .. translate("Binding to a specific network not supported") .. " !" ++ end ++end ++ ++-- IPv4 + IPv6 - force_ipversion (NEW) -- ###################################### ++-- optional to force wget/curl and host to use only selected IP version ++-- command parameter "-4" or "-6" ++if has_force or ( ( m:get(section, "force_ipversion") or "0" ) ~= "0" ) then ++ fipv = ns:taboption("advanced", Flag, "force_ipversion", ++ translate("Force IP Version") ) ++ fipv.orientation = "horizontal" ++ function fipv.cfgvalue(self, section) ++ local value = AbstractValue.cfgvalue(self, section) ++ if not has_force and value ~= "0" then ++ self.description = bold_on .. font_red .. ++ translate("Force IP Version not supported") .. font_off .. "
    " .. ++ translate("please disable") .. " !" .. bold_off ++ else ++ self.description = translate("OPTIONAL: Force the usage of pure IPv4/IPv6 only communication.") ++ end ++ return value ++ end ++ function fipv.validate(self, value) ++ if (value == "1" and has_force) or value == "0" then return value end ++ return nil, err_tab_adv(self) .. translate("Force IP Version not supported") ++ end ++ function fipv.parse(self, section) ++ DDNS.flag_parse(self, section) ++ end ++ function fipv.write(self, section, value) ++ if value == "1" then ++ return self.map:set(section, self.option, value) ++ else ++ return self.map:del(section, self.option) ++ end ++ end ++end ++ ++-- IPv4 + IPv6 - dns_server (NEW) -- ########################################### ++-- optional DNS Server to use resolving my IP if "ip_source"="web" ++dns = ns:taboption("advanced", Value, "dns_server", ++ translate("DNS-Server"), ++ translate("OPTIONAL: Use non-default DNS-Server to detect 'Registered IP'.") .. "
    " .. ++ translate("Format: IP or FQDN")) ++dns.placeholder = "mydns.lan" ++function dns.validate(self, value) ++ -- if .datatype is set, then it is checked before calling this function ++ if not value then ++ return "" -- ignore on empty ++ elseif not DTYP.host(value) then ++ return nil, err_tab_adv(self) .. translate("use hostname, FQDN, IPv4- or IPv6-Address") ++ else ++ local ipv6 = usev6:formvalue(section) ++ local force = (fipv) and fipv:formvalue(section) or "0" ++ local command = [[/usr/lib/ddns/dynamic_dns_lucihelper.sh verify_dns ]] .. ++ value .. [[ ]] .. ipv6 .. [[ ]] .. force ++ local ret = SYS.call(command) ++ if ret == 0 then return value -- everything OK ++ elseif ret == 2 then return nil, err_tab_adv(self) .. translate("nslookup can not resolve host") ++ elseif ret == 3 then return nil, err_tab_adv(self) .. translate("nc (netcat) can not connect") ++ elseif ret == 4 then return nil, err_tab_adv(self) .. translate("Forced IP Version don't matched") ++ else return nil, err_tab_adv(self) .. translate("unspecific error") ++ end ++ end ++end ++ ++-- IPv4 + IPv6 - force_dnstcp (NEW) -- ######################################### ++if has_dnstcp or ( ( m:get(section, "force_dnstcp") or "0" ) ~= "0" ) then ++ tcp = ns:taboption("advanced", Flag, "force_dnstcp", ++ translate("Force TCP on DNS") ) ++ tcp.orientation = "horizontal" ++ function tcp.cfgvalue(self, section) ++ local value = AbstractValue.cfgvalue(self, section) ++ if not has_dnstcp and value ~= "0" then ++ self.description = bold_on .. font_red .. ++ translate("DNS requests via TCP not supported") .. font_off .. "
    " .. ++ translate("please disable") .. " !" .. bold_off ++ else ++ self.description = translate("OPTIONAL: Force the use of TCP instead of default UDP on DNS requests.") ++ end ++ return value ++ end ++ function tcp.validate(self, value) ++ if (value == "1" and has_dnstcp ) or value == "0" then ++ return value ++ end ++ return nil, err_tab_adv(self) .. translate("DNS requests via TCP not supported") ++ end ++ function tcp.parse(self, section) ++ DDNS.flag_parse(self, section) ++ end ++end ++ ++-- IPv4 + IPv6 - proxy (NEW) -- ################################################ ++-- optional Proxy to use for http/https requests [user:password@]proxyhost[:port] ++if has_proxy or ( ( m:get(section, "proxy") or "" ) ~= "" ) then ++ pxy = ns:taboption("advanced", Value, "proxy", ++ translate("PROXY-Server") ) ++ pxy.placeholder="user:password@myproxy.lan:8080" ++ function pxy.cfgvalue(self, section) ++ local value = AbstractValue.cfgvalue(self, section) ++ if not has_proxy and value ~= "" then ++ self.description = bold_on .. font_red .. ++ translate("PROXY-Server not supported") .. font_off .. "
    " .. ++ translate("please remove entry") .. "!" .. bold_off ++ else ++ self.description = translate("OPTIONAL: Proxy-Server for detection and updates.") .. "
    " .. ++ translate("Format") .. ": " .. bold_on .. "[user:password@]proxyhost:port" .. bold_off .. "
    " .. ++ translate("IPv6 address must be given in square brackets") .. ": " .. ++ bold_on .. " [2001:db8::1]:8080" .. bold_off ++ end ++ return value ++ end ++ function pxy.validate(self, value) ++ -- if .datatype is set, then it is checked before calling this function ++ if not value then ++ return "" -- ignore on empty ++ elseif has_proxy then ++ local ipv6 = usev6:formvalue(section) or "0" ++ local force = (fipv) and fipv:formvalue(section) or "0" ++ local command = [[/usr/lib/ddns/dynamic_dns_lucihelper.sh verify_proxy ]] .. ++ value .. [[ ]] .. ipv6 .. [[ ]] .. force ++ local ret = SYS.call(command) ++ if ret == 0 then return value ++ elseif ret == 2 then return nil, err_tab_adv(self) .. translate("nslookup can not resolve host") ++ elseif ret == 3 then return nil, err_tab_adv(self) .. translate("nc (netcat) can not connect") ++ elseif ret == 4 then return nil, err_tab_adv(self) .. translate("Forced IP Version don't matched") ++ elseif ret == 5 then return nil, err_tab_adv(self) .. translate("proxy port missing") ++ else return nil, err_tab_adv(self) .. translate("unspecific error") ++ end ++ else ++ return nil, err_tab_adv(self) .. translate("PROXY-Server not supported") ++ end ++ end ++end ++ ++-- use_syslog -- ############################################################### ++slog = ns:taboption("advanced", ListValue, "use_syslog", ++ translate("Log to syslog"), ++ translate("Writes log messages to syslog. Critical Errors will always be written to syslog.") ) ++slog.default = "2" ++slog:value("0", translate("No logging")) ++slog:value("1", translate("Info")) ++slog:value("2", translate("Notice")) ++slog:value("3", translate("Warning")) ++slog:value("4", translate("Error")) ++ ++-- use_logfile (NEW) -- ######################################################## ++logf = ns:taboption("advanced", Flag, "use_logfile", ++ translate("Log to file"), ++ translate("Writes detailed messages to log file. File will be truncated automatically.") .. "
    " .. ++ translate("File") .. [[: "]] .. log_dir .. [[/]] .. section .. [[.log"]] ) ++logf.orientation = "horizontal" ++logf.rmempty = false -- we want to save in /etc/config/ddns file on "0" because ++logf.default = "1" -- if not defined write to log by default ++function logf.parse(self, section) ++ DDNS.flag_parse(self, section) ++end ++ ++-- TAB: Timer ##################################################################################### ++-- check_interval -- ########################################################### ++ci = ns:taboption("timer", Value, "check_interval", ++ translate("Check Interval") ) ++ci.template = "ddns/detail_value" ++ci.default = 10 ++ci.rmempty = false -- validate ourselves for translatable error messages ++function ci.validate(self, value) ++ if not DTYP.uinteger(value) ++ or tonumber(value) < 1 then ++ return nil, err_tab_timer(self) .. translate("minimum value 5 minutes == 300 seconds") ++ end ++ ++ local secs = DDNS.calc_seconds(value, cu:formvalue(section)) ++ if secs >= 300 then ++ return value ++ else ++ return nil, err_tab_timer(self) .. translate("minimum value 5 minutes == 300 seconds") ++ end ++end ++function ci.write(self, section, value) ++ -- simulate rmempty=true remove default ++ local secs = DDNS.calc_seconds(value, cu:formvalue(section)) ++ if secs ~= 600 then --default 10 minutes ++ return self.map:set(section, self.option, value) ++ else ++ self.map:del(section, "check_unit") ++ return self.map:del(section, self.option) ++ end ++end ++ ++-- check_unit -- ############################################################### ++cu = ns:taboption("timer", ListValue, "check_unit", "not displayed, but needed otherwise error", ++ translate("Interval to check for changed IP" .. "
    " .. ++ "Values below 5 minutes == 300 seconds are not supported") ) ++cu.template = "ddns/detail_lvalue" ++cu.default = "minutes" ++cu.rmempty = false -- want to control write process ++cu:value("seconds", translate("seconds")) ++cu:value("minutes", translate("minutes")) ++cu:value("hours", translate("hours")) ++--cu:value("days", translate("days")) ++function cu.write(self, section, value) ++ -- simulate rmempty=true remove default ++ local secs = DDNS.calc_seconds(ci:formvalue(section), value) ++ if secs ~= 600 then --default 10 minutes ++ return self.map:set(section, self.option, value) ++ else ++ return true ++ end ++end ++ ++-- force_interval (modified) -- ################################################ ++fi = ns:taboption("timer", Value, "force_interval", ++ translate("Force Interval") ) ++fi.template = "ddns/detail_value" ++fi.default = 72 -- see dynamic_dns_updater.sh script ++fi.rmempty = false -- validate ourselves for translatable error messages ++function fi.validate(self, value) ++ if not DTYP.uinteger(value) ++ or tonumber(value) < 0 then ++ return nil, err_tab_timer(self) .. translate("minimum value '0'") ++ end ++ ++ local force_s = DDNS.calc_seconds(value, fu:formvalue(section)) ++ if force_s == 0 then ++ return value ++ end ++ ++ local ci_value = ci:formvalue(section) ++ if not DTYP.uinteger(ci_value) then ++ return "" -- ignore because error in check_interval above ++ end ++ ++ local check_s = DDNS.calc_seconds(ci_value, cu:formvalue(section)) ++ if force_s >= check_s then ++ return value ++ end ++ ++ return nil, err_tab_timer(self) .. translate("must be greater or equal 'Check Interval'") ++end ++function fi.write(self, section, value) ++ -- simulate rmempty=true remove default ++ local secs = DDNS.calc_seconds(value, fu:formvalue(section)) ++ if secs ~= 259200 then --default 72 hours == 3 days ++ return self.map:set(section, self.option, value) ++ else ++ self.map:del(section, "force_unit") ++ return self.map:del(section, self.option) ++ end ++end ++ ++-- force_unit -- ############################################################### ++fu = ns:taboption("timer", ListValue, "force_unit", "not displayed, but needed otherwise error", ++ translate("Interval to force updates send to DDNS Provider" .. "
    " .. ++ "Setting this parameter to 0 will force the script to only run once" .. "
    " .. ++ "Values lower 'Check Interval' except '0' are not supported") ) ++fu.template = "ddns/detail_lvalue" ++fu.default = "hours" ++fu.rmempty = false -- want to control write process ++--fu:value("seconds", translate("seconds")) ++fu:value("minutes", translate("minutes")) ++fu:value("hours", translate("hours")) ++fu:value("days", translate("days")) ++function fu.write(self, section, value) ++ -- simulate rmempty=true remove default ++ local secs = DDNS.calc_seconds(fi:formvalue(section), value) ++ if secs ~= 259200 and secs ~= 0 then --default 72 hours == 3 days ++ return self.map:set(section, self.option, value) ++ else ++ return true ++ end ++end ++ ++-- retry_count (NEW) -- ######################################################## ++rc = ns:taboption("timer", Value, "retry_count") ++rc.title = translate("Error Retry Counter") ++rc.description = translate("On Error the script will stop execution after given number of retrys") ++ .. "
    " ++ .. translate("The default setting of '0' will retry infinite.") ++rc.default = 0 ++rc.rmempty = false -- validate ourselves for translatable error messages ++function rc.validate(self, value) ++ if not DTYP.uinteger(value) then ++ return nil, err_tab_timer(self) .. translate("minimum value '0'") ++ else ++ return value ++ end ++end ++function rc.write(self, section, value) ++ -- simulate rmempty=true remove default ++ if tonumber(value) ~= self.default then ++ return self.map:set(section, self.option, value) ++ else ++ return self.map:del(section, self.option) ++ end ++end ++ ++-- retry_interval -- ########################################################### ++ri = ns:taboption("timer", Value, "retry_interval", ++ translate("Error Retry Interval") ) ++ri.template = "ddns/detail_value" ++ri.default = 60 ++ri.rmempty = false -- validate ourselves for translatable error messages ++function ri.validate(self, value) ++ if not DTYP.uinteger(value) ++ or tonumber(value) < 1 then ++ return nil, err_tab_timer(self) .. translate("minimum value '1'") ++ else ++ return value ++ end ++end ++function ri.write(self, section, value) ++ -- simulate rmempty=true remove default ++ local secs = DDNS.calc_seconds(value, ru:formvalue(section)) ++ if secs ~= 60 then --default 60seconds ++ return self.map:set(section, self.option, value) ++ else ++ self.map:del(section, "retry_unit") ++ return self.map:del(section, self.option) ++ end ++end ++ ++-- retry_unit -- ############################################################### ++ru = ns:taboption("timer", ListValue, "retry_unit", "not displayed, but needed otherwise error", ++ translate("On Error the script will retry the failed action after given time") ) ++ru.template = "ddns/detail_lvalue" ++ru.default = "seconds" ++ru.rmempty = false -- want to control write process ++ru:value("seconds", translate("seconds")) ++ru:value("minutes", translate("minutes")) ++--ru:value("hours", translate("hours")) ++--ru:value("days", translate("days")) ++function ru.write(self, section, value) ++ -- simulate rmempty=true remove default ++ local secs = DDNS.calc_seconds(ri:formvalue(section), value) ++ if secs ~= 60 then --default 60seconds ++ return self.map:set(section, self.option, value) ++ else ++ return true -- will be deleted by retry_interval ++ end ++end ++ ++-- TAB: LogView (NEW) ############################################################################# ++lv = ns:taboption("logview", DummyValue, "_logview") ++lv.template = "ddns/detail_logview" ++lv.inputtitle = translate("Read / Reread log file") ++lv.rows = 50 ++function lv.cfgvalue(self, section) ++ local lfile=log_dir .. "/" .. section .. ".log" ++ if NXFS.access(lfile) then ++ return lfile .. "\n" .. translate("Please press [Read] button") ++ end ++ return lfile .. "\n" .. translate("File not found or empty") ++end ++ ++return m +diff --git a/feeds/luci/applications/luci-app-ddns/luasrc/model/cbi/ddns/global.lua b/feeds/luci/applications/luci-app-ddns/luasrc/model/cbi/ddns/global.lua +new file mode 100644 +index 0000000..fbd3cb3 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-ddns/luasrc/model/cbi/ddns/global.lua +@@ -0,0 +1,156 @@ ++-- Copyright 2014 Christian Schoenebeck ++-- Licensed to the public under the Apache License 2.0. ++ ++local NX = require "nixio" ++local NXFS = require "nixio.fs" ++local DISP = require "luci.dispatcher" ++local SYS = require "luci.sys" ++local DDNS = require "luci.tools.ddns" -- ddns multiused functions ++ ++-- cbi-map definition -- ####################################################### ++local m = Map("ddns") ++ ++-- first need to close from cbi map template our closed by template ++m.title = [[]] ++ .. translate("Dynamic DNS") ++ ++m.description = translate("Dynamic DNS allows that your router can be reached with " .. ++ "a fixed hostname while having a dynamically changing IP address.") ++ ++m.redirect = DISP.build_url("admin", "services", "ddns") ++ ++function m.commit_handler(self) ++ if self.changed then -- changes ? ++ os.execute("/etc/init.d/ddns reload &") -- reload configuration ++ end ++end ++ ++-- cbi-section definition -- ################################################### ++local ns = m:section( NamedSection, "global", "ddns", ++ translate("Global Settings"), ++ translate("Configure here the details for all Dynamic DNS services including this LuCI application.") ++ .. [[
    ]] ++ .. translate("It is NOT recommended for casual users to change settings on this page.") ++ .. [[
    ]] ++ .. [[
    ]] ++ .. translate("For detailed information about parameter settings look here.") ++ .. [[]] ++ ) ++ ++-- section might not exist ++function ns.cfgvalue(self, section) ++ if not self.map:get(section) then ++ self.map:set(section, nil, self.sectiontype) ++ end ++ return self.map:get(section) ++end ++ ++-- allow_local_ip -- ########################################################## ++local ali = ns:option(Flag, "allow_local_ip") ++ali.title = translate("Allow non-public IP's") ++ali.description = translate("Non-public and by default blocked IP's") .. ":" ++ .. [[
    IPv4: ]] ++ .. "0/8, 10/8, 100.64/10, 127/8, 169.254/16, 172.16/12, 192.168/16" ++ .. [[
    IPv6: ]] ++ .. "::/32, f000::/4" ++ali.reempty = true ++ali.default = "0" ++function ali.parse(self, section) ++ DDNS.flag_parse(self, section) ++end ++function ali.validate(self, value) ++ if value == self.default then ++ return "" -- default = empty ++ end ++ return value ++end ++ ++-- date_format -- ############################################################# ++local df = ns:option(Value, "date_format") ++df.title = translate("Date format") ++df.description = [[]] ++ .. translate("For supported codes look here") ++ .. [[]] ++df.template = "ddns/global_value" ++df.rmempty = true ++df.default = "%F %R" ++df.date_string = "" ++function df.cfgvalue(self, section) ++ local value = AbstractValue.cfgvalue(self, section) or self.default ++ local epoch = os.time() ++ self.date_string = DDNS.epoch2date(epoch, value) ++ return value ++end ++function df.validate(self, value) ++ if value == self.default then ++ return "" -- default = empty ++ end ++ return value ++end ++ ++-- run_dir -- ################################################################# ++local rd = ns:option(Value, "run_dir") ++rd.title = translate("Status directory") ++rd.description = translate("Directory contains PID and other status information for each running section") ++rd.rmempty = true ++rd.default = "/var/run/ddns" ++function rd.validate(self, value) ++ if value == self.default then ++ return "" -- default = empty ++ end ++ return value ++end ++ ++-- log_dir -- ################################################################# ++local ld = ns:option(Value, "log_dir") ++ld.title = translate("Log directory") ++ld.description = translate("Directory contains Log files for each running section") ++ld.rmempty = true ++ld.default = "/var/log/ddns" ++function ld.validate(self, value) ++ if value == self.default then ++ return "" -- default = empty ++ end ++ return value ++end ++ ++-- log_lines -- ############################################################### ++local ll = ns:option(Value, "log_lines") ++ll.title = translate("Log length") ++ll.description = translate("Number of last lines stored in log files") ++ll.rmempty = true ++ll.default = "250" ++function ll.validate(self, value) ++ local n = tonumber(value) ++ if not n or math.floor(n) ~= n or n < 1 then ++ return nil, self.title .. ": " .. translate("minimum value '1'") ++ end ++ if value == self.default then ++ return "" -- default = empty ++ end ++ return value ++end ++ ++-- use_curl -- ################################################################ ++if (SYS.call([[ grep -i "\+ssl" /usr/bin/wget >/dev/null 2>&1 ]]) == 0) ++and NXFS.access("/usr/bin/curl") then ++ local pc = ns:option(Flag, "use_curl") ++ pc.title = translate("Use cURL") ++ pc.description = translate("If both cURL and GNU Wget are installed, Wget is used by default.") ++ .. [[
    ]] ++ .. translate("To use cURL activate this option.") ++ pc.orientation = "horizontal" ++ pc.rmempty = true ++ pc.default = "0" ++ function pc.parse(self, section) ++ DDNS.flag_parse(self, section) ++ end ++ function pc.validate(self, value) ++ if value == self.default then ++ return "" -- default = empty ++ end ++ return value ++ end ++end ++ ++return m +diff --git a/feeds/luci/applications/luci-app-ddns/luasrc/model/cbi/ddns/hints.lua b/feeds/luci/applications/luci-app-ddns/luasrc/model/cbi/ddns/hints.lua +new file mode 100644 +index 0000000..ff7aa7a +--- /dev/null ++++ b/feeds/luci/applications/luci-app-ddns/luasrc/model/cbi/ddns/hints.lua +@@ -0,0 +1,153 @@ ++-- Copyright 2014 Christian Schoenebeck ++-- Licensed to the public under the Apache License 2.0. ++ ++local CTRL = require "luci.controller.ddns" -- this application's controller ++local DISP = require "luci.dispatcher" ++local SYS = require "luci.sys" ++local DDNS = require "luci.tools.ddns" -- ddns multiused functions ++ ++-- check supported options -- ################################################## ++-- saved to local vars here because doing multiple os calls slow down the system ++has_ssl = DDNS.check_ssl() -- HTTPS support and --bind-network / --interface ++has_proxy = DDNS.check_proxy() -- Proxy support ++has_dnstcp = DDNS.check_bind_host() -- DNS TCP support ++-- correct ddns-scripts version ++need_update = DDNS.ipkg_ver_compare(DDNS.ipkg_ver_installed("ddns-scripts"), "<<", CTRL.DDNS_MIN) ++ ++-- html constants ++font_red = [[]] ++font_off = [[]] ++bold_on = [[]] ++bold_off = [[]] ++ ++-- cbi-map definition -- ####################################################### ++m = Map("ddns") ++ ++-- first need to close from cbi map template our closed by template ++m.title = [[]] .. ++ translate("Dynamic DNS") ++ ++m.description = translate("Dynamic DNS allows that your router can be reached with " .. ++ "a fixed hostname while having a dynamically changing " .. ++ "IP address.") ++ ++m.redirect = DISP.build_url("admin", "services", "ddns") ++ ++-- SimpleSection definition -- ################################################# ++-- show Hints to optimize installation and script usage ++s = m:section( SimpleSection, ++ translate("Hints"), ++ translate("Below a list of configuration tips for your system to run Dynamic DNS updates without limitations") ) ++ ++-- ddns_scripts needs to be updated for full functionality ++if need_update then ++ local dv = s:option(DummyValue, "_update_needed") ++ dv.titleref = DISP.build_url("admin", "system", "packages") ++ dv.rawhtml = true ++ dv.title = font_red .. bold_on .. ++ translate("Software update required") .. bold_off .. font_off ++ dv.value = translate("The currently installed 'ddns-scripts' package did not support all available settings.") .. ++ "
    " .. ++ translate("Please update to the current version!") ++end ++ ++-- DDNS Service disabled ++if not SYS.init.enabled("ddns") then ++ local dv = s:option(DummyValue, "_not_enabled") ++ dv.titleref = DISP.build_url("admin", "system", "startup") ++ dv.rawhtml = true ++ dv.title = bold_on .. ++ translate("DDNS Autostart disabled") .. bold_off ++ dv.value = translate("Currently DDNS updates are not started at boot or on interface events." .. "
    " .. ++ "This is the default if you run DDNS scripts by yourself (i.e. via cron with force_interval set to '0')" ) ++end ++ ++-- No IPv6 support ++if not DDNS.check_ipv6() then ++ local dv = s:option(DummyValue, "_no_ipv6") ++ dv.titleref = 'http://www.openwrt.org" target="_blank' ++ dv.rawhtml = true ++ dv.title = bold_on .. ++ translate("IPv6 not supported") .. bold_off ++ dv.value = translate("IPv6 is currently not (fully) supported by this system" .. "
    " .. ++ "Please follow the instructions on OpenWrt's homepage to enable IPv6 support" .. "
    " .. ++ "or update your system to the latest OpenWrt Release") ++end ++ ++-- No HTTPS support ++if not has_ssl then ++ local dv = s:option(DummyValue, "_no_https") ++ dv.titleref = DISP.build_url("admin", "system", "packages") ++ dv.rawhtml = true ++ dv.title = bold_on .. ++ translate("HTTPS not supported") .. bold_off ++ dv.value = translate("Neither GNU Wget with SSL nor cURL installed to support updates via HTTPS protocol.") .. ++ "
    - " .. ++ translate("You should install GNU Wget with SSL (prefered) or cURL package.") .. ++ "
    - " .. ++ translate("In some versions cURL/libcurl in OpenWrt is compiled without proxy support.") ++end ++ ++-- No bind_network ++if not has_ssl then ++ local dv = s:option(DummyValue, "_no_bind_network") ++ dv.titleref = DISP.build_url("admin", "system", "packages") ++ dv.rawhtml = true ++ dv.title = bold_on .. ++ translate("Binding to a specific network not supported") .. bold_off ++ dv.value = translate("Neither GNU Wget with SSL nor cURL installed to select a network to use for communication.") .. ++ "
    - " .. ++ translate("You should install GNU Wget with SSL or cURL package.") .. ++ "
    - " .. ++ translate("GNU Wget will use the IP of given network, cURL will use the physical interface.") .. ++ "
    - " .. ++ translate("In some versions cURL/libcurl in OpenWrt is compiled without proxy support.") ++end ++ ++-- cURL without proxy support ++if has_ssl and not has_proxy then ++ local dv = s:option(DummyValue, "_no_proxy") ++ dv.titleref = DISP.build_url("admin", "system", "packages") ++ dv.rawhtml = true ++ dv.title = bold_on .. ++ translate("cURL without Proxy Support") .. bold_off ++ dv.value = translate("cURL is installed, but libcurl was compiled without proxy support.") .. ++ "
    - " .. ++ translate("You should install GNU Wget with SSL or replace libcurl.") .. ++ "
    - " .. ++ translate("In some versions cURL/libcurl in OpenWrt is compiled without proxy support.") ++end ++ ++-- "Force IP Version not supported" ++if not (has_ssl and has_dnstcp) then ++ local dv = s:option(DummyValue, "_no_force_ip") ++ dv.titleref = DISP.build_url("admin", "system", "packages") ++ dv.rawhtml = true ++ dv.title = bold_on .. ++ translate("Force IP Version not supported") .. bold_off ++ local value = translate("BusyBox's nslookup and Wget do not support to specify " .. ++ "the IP version to use for communication with DDNS Provider.") ++ if not has_ssl then ++ value = value .. "
    - " .. ++ translate("You should install GNU Wget with SSL (prefered) or cURL package.") ++ end ++ if not has_dnstcp then ++ value = value .. "
    - " .. ++ translate("You should install BIND host package for DNS requests.") ++ end ++ dv.value = value ++end ++ ++-- "DNS requests via TCP not supported" ++if not has_dnstcp then ++ local dv = s:option(DummyValue, "_no_dnstcp") ++ dv.titleref = DISP.build_url("admin", "system", "packages") ++ dv.rawhtml = true ++ dv.title = bold_on .. ++ translate("DNS requests via TCP not supported") .. bold_off ++ dv.value = translate("BusyBox's nslookup does not support to specify to use TCP instead of default UDP when requesting DNS server") .. ++ "
    - " .. ++ translate("You should install BIND host package for DNS requests.") ++end ++ ++return m +diff --git a/feeds/luci/applications/luci-app-ddns/luasrc/model/cbi/ddns/overview.lua b/feeds/luci/applications/luci-app-ddns/luasrc/model/cbi/ddns/overview.lua +new file mode 100644 +index 0000000..9e8df2d +--- /dev/null ++++ b/feeds/luci/applications/luci-app-ddns/luasrc/model/cbi/ddns/overview.lua +@@ -0,0 +1,257 @@ ++-- Copyright 2014 Christian Schoenebeck ++-- Licensed to the public under the Apache License 2.0. ++ ++local NXFS = require "nixio.fs" ++local CTRL = require "luci.controller.ddns" -- this application's controller ++local DISP = require "luci.dispatcher" ++local HTTP = require "luci.http" ++local SYS = require "luci.sys" ++local DDNS = require "luci.tools.ddns" -- ddns multiused functions ++ ++-- show hints ? ++show_hints = not (DDNS.check_ipv6() -- IPv6 support ++ and DDNS.check_ssl() -- HTTPS support ++ and DDNS.check_proxy() -- Proxy support ++ and DDNS.check_bind_host() -- DNS TCP support ++ ) ++-- correct ddns-scripts version ++need_update = DDNS.ipkg_ver_compare(DDNS.ipkg_ver_installed("ddns-scripts"), "<<", CTRL.DDNS_MIN) ++ ++-- html constants ++font_red = [[]] ++font_off = [[]] ++bold_on = [[]] ++bold_off = [[]] ++ ++-- cbi-map definition -- ####################################################### ++m = Map("ddns") ++ ++-- first need to close
    from cbi map template our closed by template ++m.title = [[]] ++ .. translate("Dynamic DNS") ++ ++m.description = translate("Dynamic DNS allows that your router can be reached with " .. ++ "a fixed hostname while having a dynamically changing " .. ++ "IP address.") ++ ++m.on_after_commit = function(self) ++ if self.changed then -- changes ? ++ if SYS.init.enabled("ddns") then -- ddns service enabled, restart all ++ os.execute("/etc/init.d/ddns restart") ++ else -- ddns service disabled, send SIGHUP to running ++ os.execute("killall -1 dynamic_dns_updater.sh") ++ end ++ end ++end ++ ++-- SimpleSection definiton -- ################################################## ++-- with all the JavaScripts we need for "a good Show" ++a = m:section( SimpleSection ) ++a.template = "ddns/overview_status" ++ ++-- SimpleSection definition -- ################################################# ++-- show Hints to optimize installation and script usage ++-- only show if service not enabled ++-- or no IPv6 support ++-- or not GNU Wget and not cURL (for https support) ++-- or not GNU Wget but cURL without proxy support ++-- or not BIND's host ++-- or ddns-scripts package need update ++if show_hints or need_update or not SYS.init.enabled("ddns") then ++ s = m:section( SimpleSection, translate("Hints") ) ++ ++ -- ddns_scripts needs to be updated for full functionality ++ if need_update then ++ local dv = s:option(DummyValue, "_update_needed") ++ dv.titleref = DISP.build_url("admin", "system", "packages") ++ dv.rawhtml = true ++ dv.title = font_red .. bold_on .. ++ translate("Software update required") .. bold_off .. font_off ++ dv.value = translate("The currently installed 'ddns-scripts' package did not support all available settings.") .. ++ "
    " .. ++ translate("Please update to the current version!") ++ end ++ ++ -- DDNS Service disabled ++ if not SYS.init.enabled("ddns") then ++ local dv = s:option(DummyValue, "_not_enabled") ++ dv.titleref = DISP.build_url("admin", "system", "startup") ++ dv.rawhtml = true ++ dv.title = bold_on .. ++ translate("DDNS Autostart disabled") .. bold_off ++ dv.value = translate("Currently DDNS updates are not started at boot or on interface events." .. "
    " .. ++ "You can start/stop each configuration here. It will run until next reboot.") ++ end ++ ++ -- Show more hints on a separate page ++ if show_hints then ++ local dv = s:option(DummyValue, "_separate") ++ dv.titleref = DISP.build_url("admin", "services", "ddns", "hints") ++ dv.rawhtml = true ++ dv.title = bold_on .. ++ translate("Show more") .. bold_off ++ dv.value = translate("Follow this link" .. "
    " .. ++ "You will find more hints to optimize your system to run DDNS scripts with all options") ++ end ++end ++ ++-- TableSection definition -- ################################################## ++ts = m:section( TypedSection, "service", ++ translate("Overview"), ++ translate("Below is a list of configured DDNS configurations and their current state.") ++ .. "
    " ++ .. translate("If you want to send updates for IPv4 and IPv6 you need to define two separate Configurations " ++ .. "i.e. 'myddns_ipv4' and 'myddns_ipv6'") ++ .. "
    " ++ .. [[
    ]] ++ .. translate("To change global settings click here") .. [[]] ) ++ts.sectionhead = translate("Configuration") ++ts.template = "cbi/tblsection" ++ts.addremove = true ++ts.extedit = DISP.build_url("admin", "services", "ddns", "detail", "%s") ++function ts.create(self, name) ++ AbstractSection.create(self, name) ++ HTTP.redirect( self.extedit:format(name) ) ++end ++ ++-- Domain and registered IP -- ################################################# ++dom = ts:option(DummyValue, "_domainIP", ++ translate("Hostname/Domain") .. "
    " .. translate("Registered IP") ) ++dom.template = "ddns/overview_doubleline" ++function dom.set_one(self, section) ++ local domain = self.map:get(section, "domain") or "" ++ if domain ~= "" then ++ return domain ++ else ++ return [[]] .. translate("config error") .. [[]] ++ end ++end ++function dom.set_two(self, section) ++ local domain = self.map:get(section, "domain") or "" ++ if domain == "" then return "" end ++ local dnsserver = self.map:get(section, "dnsserver") or "" ++ local use_ipv6 = tonumber(self.map:get(section, "use_ipv6") or 0) ++ local force_ipversion = tonumber(self.map:get(section, "force_ipversion") or 0) ++ local force_dnstcp = tonumber(self.map:get(section, "force_dnstcp") or 0) ++ local command = [[/usr/lib/ddns/dynamic_dns_lucihelper.sh]] ++ if not NXFS.access(command, "rwx", "rx", "rx") then ++ NXFS.chmod(command, 755) ++ end ++ command = command .. [[ get_registered_ip ]] .. domain .. [[ ]] .. use_ipv6 .. ++ [[ ]] .. force_ipversion .. [[ ]] .. force_dnstcp .. [[ ]] .. dnsserver ++ local ip = SYS.exec(command) ++ if ip == "" then ip = translate("no data") end ++ return ip ++end ++ ++-- enabled ++ena = ts:option( Flag, "enabled", ++ translate("Enabled")) ++ena.template = "ddns/overview_enabled" ++ena.rmempty = false ++function ena.parse(self, section) ++ DDNS.flag_parse(self, section) ++end ++ ++-- show PID and next update ++upd = ts:option( DummyValue, "_update", ++ translate("Last Update") .. "
    " .. translate("Next Update")) ++upd.template = "ddns/overview_doubleline" ++function upd.set_one(self, section) -- fill Last Update ++ -- get/validate last update ++ local uptime = SYS.uptime() ++ local lasttime = DDNS.get_lastupd(section) ++ if lasttime > uptime then -- /var might not be linked to /tmp and cleared on reboot ++ lasttime = 0 ++ end ++ ++ -- no last update happen ++ if lasttime == 0 then ++ return translate("never") ++ ++ -- we read last update ++ else ++ -- calc last update ++ -- os.epoch - sys.uptime + lastupdate(uptime) ++ local epoch = os.time() - uptime + lasttime ++ -- use linux date to convert epoch ++ return DDNS.epoch2date(epoch) ++ end ++end ++function upd.set_two(self, section) -- fill Next Update ++ -- get enabled state ++ local enabled = tonumber(self.map:get(section, "enabled") or 0) ++ local datenext = translate("unknown error") -- formatted date of next update ++ ++ -- get force seconds ++ local force_interval = tonumber(self.map:get(section, "force_interval") or 72) ++ local force_unit = self.map:get(section, "force_unit") or "hours" ++ local force_seconds = DDNS.calc_seconds(force_interval, force_unit) ++ ++ -- get last update and get/validate PID ++ local uptime = SYS.uptime() ++ local lasttime = DDNS.get_lastupd(section) ++ if lasttime > uptime then -- /var might not be linked to /tmp and cleared on reboot ++ lasttime = 0 ++ end ++ local pid = DDNS.get_pid(section) ++ ++ -- calc next update ++ if lasttime > 0 then ++ local epoch = os.time() - uptime + lasttime + force_seconds ++ -- use linux date to convert epoch ++ datelast = DDNS.epoch2date(epoch) ++ end ++ ++ -- process running but update needs to happen ++ if pid > 0 and ( lasttime + force_seconds - uptime ) < 0 then ++ datenext = translate("Verify") ++ ++ -- run once ++ elseif force_seconds == 0 then ++ datenext = translate("Run once") ++ ++ -- no process running and NOT enabled ++ elseif pid == 0 and enabled == 0 then ++ datenext = translate("Disabled") ++ ++ -- no process running and NOT ++ elseif pid == 0 and enabled ~= 0 then ++ datenext = translate("Stopped") ++ end ++ ++ return datenext ++end ++ ++-- start/stop button ++btn = ts:option( Button, "_startstop", ++ translate("Process ID") .. "
    " .. translate("Start / Stop") ) ++btn.template = "ddns/overview_startstop" ++function btn.cfgvalue(self, section) ++ local pid = DDNS.get_pid(section) ++ if pid > 0 then ++ btn.inputtitle = "PID: " .. pid ++ btn.inputstyle = "reset" ++ btn.disabled = false ++ elseif (self.map:get(section, "enabled") or "0") ~= "0" then ++ btn.inputtitle = translate("Start") ++ btn.inputstyle = "apply" ++ btn.disabled = false ++ else ++ btn.inputtitle = "----------" ++ btn.inputstyle = "button" ++ btn.disabled = true ++ end ++ return true ++end ++ ++return m +diff --git a/feeds/luci/applications/luci-app-ddns/luasrc/tools/ddns.lua b/feeds/luci/applications/luci-app-ddns/luasrc/tools/ddns.lua +new file mode 100644 +index 0000000..4466063 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-ddns/luasrc/tools/ddns.lua +@@ -0,0 +1,303 @@ ++-- Copyright 2014 Christian Schoenebeck ++-- Licensed to the public under the Apache License 2.0. ++ ++module("luci.tools.ddns", package.seeall) ++ ++local NX = require "nixio" ++local NXFS = require "nixio.fs" ++local OPKG = require "luci.model.ipkg" ++local UCI = require "luci.model.uci" ++local SYS = require "luci.sys" ++local UTIL = require "luci.util" ++ ++-- function to calculate seconds from given interval and unit ++function calc_seconds(interval, unit) ++ if not tonumber(interval) then ++ return nil ++ elseif unit == "days" then ++ return (tonumber(interval) * 86400) -- 60 sec * 60 min * 24 h ++ elseif unit == "hours" then ++ return (tonumber(interval) * 3600) -- 60 sec * 60 min ++ elseif unit == "minutes" then ++ return (tonumber(interval) * 60) -- 60 sec ++ elseif unit == "seconds" then ++ return tonumber(interval) ++ else ++ return nil ++ end ++end ++ ++-- check if IPv6 supported by OpenWrt ++function check_ipv6() ++ return NXFS.access("/proc/net/ipv6_route") ++ and NXFS.access("/usr/sbin/ip6tables") ++end ++ ++-- check if Wget with SSL support or cURL installed ++function check_ssl() ++ if (SYS.call([[ grep -i "\+ssl" /usr/bin/wget >/dev/null 2>&1 ]]) == 0) then ++ return true ++ else ++ return NXFS.access("/usr/bin/curl") ++ end ++end ++ ++-- check if Wget with SSL or cURL with proxy support installed ++function check_proxy() ++ -- we prefere GNU Wget for communication ++ if (SYS.call([[ grep -i "\+ssl" /usr/bin/wget >/dev/null 2>&1 ]]) == 0) then ++ return true ++ ++ -- if not installed cURL must support proxy ++ elseif NXFS.access("/usr/bin/curl") then ++ return (SYS.call([[ grep -i all_proxy /usr/lib/libcurl.so* >/dev/null 2>&1 ]]) == 0) ++ ++ -- only BusyBox Wget is installed ++ else ++ return NXFS.access("/usr/bin/wget") ++ end ++end ++ ++-- check if BIND host installed ++function check_bind_host() ++ return NXFS.access("/usr/bin/host") ++end ++ ++-- convert epoch date to given format ++function epoch2date(epoch, format) ++ if not format or #format < 2 then ++ local uci = UCI.cursor() ++ format = uci:get("ddns", "global", "date_format") or "%F %R" ++ uci:unload("ddns") ++ end ++ format = format:gsub("%%n", "
    ") -- replace newline ++ format = format:gsub("%%t", " ") -- replace tab ++ return os.date(format, epoch) ++end ++ ++-- read lastupdate from [section].update file ++function get_lastupd(section) ++ local uci = UCI.cursor() ++ local run_dir = uci:get("ddns", "global", "run_dir") or "/var/run/ddns" ++ local etime = tonumber(NXFS.readfile("%s/%s.update" % { run_dir, section } ) or 0 ) ++ uci:unload("ddns") ++ return etime ++end ++ ++-- read PID from run file and verify if still running ++function get_pid(section) ++ local uci = UCI.cursor() ++ local run_dir = uci:get("ddns", "global", "run_dir") or "/var/run/ddns" ++ local pid = tonumber(NXFS.readfile("%s/%s.pid" % { run_dir, section } ) or 0 ) ++ if pid > 0 and not NX.kill(pid, 0) then ++ pid = 0 ++ end ++ uci:unload("ddns") ++ return pid ++end ++ ++-- compare versions using "<=" "<" ">" ">=" "=" "<<" ">>" ++function ipkg_ver_compare(ver1, comp, ver2) ++ if not ver1 or not ver2 ++ or not comp or not (#comp > 0) then return nil end ++ -- correct compare string ++ if comp == "<>" or comp == "><" or comp == "!=" or comp == "~=" then comp = "~=" ++ elseif comp == "<=" or comp == "<" or comp == "=<" then comp = "<=" ++ elseif comp == ">=" or comp == ">" or comp == "=>" then comp = ">=" ++ elseif comp == "=" or comp == "==" then comp = "==" ++ elseif comp == "<<" then comp = "<" ++ elseif comp == ">>" then comp = ">" ++ else return nil end ++ ++ local av1 = UTIL.split(ver1, "[%.%-]", nil, true) ++ local av2 = UTIL.split(ver2, "[%.%-]", nil, true) ++ ++ for i = 1, math.max(table.getn(av1),table.getn(av2)), 1 do ++ local s1 = av1[i] or "" ++ local s2 = av2[i] or "" ++ ++ -- first "not equal" found return true ++ if comp == "~=" and (s1 ~= s2) then return true end ++ -- first "lower" found return true ++ if (comp == "<" or comp == "<=") and (s1 < s2) then return true end ++ -- first "greater" found return true ++ if (comp == ">" or comp == ">=") and (s1 > s2) then return true end ++ -- not equal then return false ++ if (s1 ~= s2) then return false end ++ end ++ ++ -- all equal and not compare greater or lower then true ++ return not (comp == "<" or comp == ">") ++end ++ ++-- read version information for given package if installed ++function ipkg_ver_installed(pkg) ++ local version = nil ++ local control = io.open("/usr/lib/opkg/info/%s.control" % pkg, "r") ++ if control then ++ local ln ++ repeat ++ ln = control:read("*l") ++ if ln and ln:match("^Version: ") then ++ version = ln:gsub("^Version: ", "") ++ break ++ end ++ until not ln ++ control:close() ++ end ++ return version ++end ++ ++-- replacement of build-in read of UCI option ++-- modified AbstractValue.cfgvalue(self, section) from cbi.lua ++-- needed to read from other option then current value definition ++function read_value(self, section, option) ++ local value ++ if self.tag_error[section] then ++ value = self:formvalue(section) ++ else ++ value = self.map:get(section, option) ++ end ++ ++ if not value then ++ return nil ++ elseif not self.cast or self.cast == type(value) then ++ return value ++ elseif self.cast == "string" then ++ if type(value) == "table" then ++ return value[1] ++ end ++ elseif self.cast == "table" then ++ return { value } ++ end ++end ++ ++-- replacement of build-in Flag.parse of cbi.lua ++-- modified to mark section as changed if value changes ++-- current parse did not do this, but it is done AbstaractValue.parse() ++function flag_parse(self, section) ++ local fexists = self.map:formvalue( ++ luci.cbi.FEXIST_PREFIX .. self.config .. "." .. section .. "." .. self.option) ++ ++ if fexists then ++ local fvalue = self:formvalue(section) and self.enabled or self.disabled ++ local cvalue = self:cfgvalue(section) ++ if fvalue ~= self.default or (not self.optional and not self.rmempty) then ++ self:write(section, fvalue) ++ else ++ self:remove(section) ++ end ++ if (fvalue ~= cvalue) then self.section.changed = true end ++ else ++ self:remove(section) ++ self.section.changed = true ++ end ++end ++ ++----------------------------------------------------------------------------- ++-- copied from https://svn.nmap.org/nmap/nselib/url.lua ++-- @author Diego Nehab ++-- @author Eddie Bell ++--[[ ++ URI parsing, composition and relative URL resolution ++ LuaSocket toolkit. ++ Author: Diego Nehab ++ RCS ID: $Id: url.lua,v 1.37 2005/11/22 08:33:29 diego Exp $ ++ parse_query and build_query added For nmap (Eddie Bell ) ++]]-- ++--- ++-- Parses a URL and returns a table with all its parts according to RFC 2396. ++-- ++-- The following grammar describes the names given to the URL parts. ++-- ++-- ::= :///;?# ++-- ::= @: ++-- ::= [:] ++-- :: = {/} ++-- ++-- ++-- The leading / in / is considered part of ++-- . ++-- @param url URL of request. ++-- @param default Table with default values for each field. ++-- @return A table with the following fields, where RFC naming conventions have ++-- been preserved: ++-- scheme, authority, userinfo, ++-- user, password, host, ++-- port, path, params, ++-- query, and fragment. ++----------------------------------------------------------------------------- ++function parse_url(url) --, default) ++ -- initialize default parameters ++ local parsed = {} ++-- for i,v in base.pairs(default or parsed) do ++-- parsed[i] = v ++-- end ++ ++ -- remove whitespace ++-- url = string.gsub(url, "%s", "") ++ -- get fragment ++ url = string.gsub(url, "#(.*)$", ++ function(f) ++ parsed.fragment = f ++ return "" ++ end) ++ -- get scheme. Lower-case according to RFC 3986 section 3.1. ++ url = string.gsub(url, "^([%w][%w%+%-%.]*)%:", ++ function(s) ++ parsed.scheme = string.lower(s); ++ return "" ++ end) ++ -- get authority ++ url = string.gsub(url, "^//([^/]*)", ++ function(n) ++ parsed.authority = n ++ return "" ++ end) ++ -- get query stringing ++ url = string.gsub(url, "%?(.*)", ++ function(q) ++ parsed.query = q ++ return "" ++ end) ++ -- get params ++ url = string.gsub(url, "%;(.*)", ++ function(p) ++ parsed.params = p ++ return "" ++ end) ++ -- path is whatever was left ++ parsed.path = url ++ ++ local authority = parsed.authority ++ if not authority then ++ return parsed ++ end ++ authority = string.gsub(authority,"^([^@]*)@", ++ function(u) ++ parsed.userinfo = u; ++ return "" ++ end) ++ authority = string.gsub(authority, ":([0-9]*)$", ++ function(p) ++ if p ~= "" then ++ parsed.port = p ++ end; ++ return "" ++ end) ++ if authority ~= "" then ++ parsed.host = authority ++ end ++ ++ local userinfo = parsed.userinfo ++ if not userinfo then ++ return parsed ++ end ++ userinfo = string.gsub(userinfo, ":([^:]*)$", ++ function(p) ++ parsed.password = p; ++ return "" ++ end) ++ parsed.user = userinfo ++ return parsed ++end +diff --git a/feeds/luci/applications/luci-app-ddns/luasrc/view/admin_status/index/ddns.htm b/feeds/luci/applications/luci-app-ddns/luasrc/view/admin_status/index/ddns.htm +new file mode 100644 +index 0000000..9791065 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-ddns/luasrc/view/admin_status/index/ddns.htm +@@ -0,0 +1 @@ ++<%+ddns/system_status%> +diff --git a/feeds/luci/applications/luci-app-ddns/luasrc/view/ddns/detail_logview.htm b/feeds/luci/applications/luci-app-ddns/luasrc/view/ddns/detail_logview.htm +new file mode 100644 +index 0000000..494b743 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-ddns/luasrc/view/ddns/detail_logview.htm +@@ -0,0 +1,56 @@ ++ ++ ++ ++ ++<%+cbi/valueheader%> ++ ++
    ++ ++<% ++-- one button on top, one at the buttom ++%> ++ /> ++ ++

    ++ ++<% ++-- set a readable style taken from openwrt theme for textarea#syslog ++-- in openwrt theme there are problems with a width of 100 so we check for theme and set to lower value ++%> ++ ++

    ++ ++<% ++-- one button on top, one at the buttom ++%> ++ /> ++ ++<%+cbi/valuefooter%> ++ +diff --git a/feeds/luci/applications/luci-app-ddns/luasrc/view/ddns/detail_lvalue.htm b/feeds/luci/applications/luci-app-ddns/luasrc/view/ddns/detail_lvalue.htm +new file mode 100644 +index 0000000..0bcfd44 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-ddns/luasrc/view/ddns/detail_lvalue.htm +@@ -0,0 +1,22 @@ ++ ++ ++ ++  ++<% if self.widget == "select" then %> ++ ++<% elseif self.widget == "radio" then ++ local c = 0 ++ for i, key in pairs(self.keylist) do ++ c = c + 1 ++%> ++ /> ++ ><%=self.vallist[i]%> ++<% if c == self.size then c = 0 %><% if self.orientation == "horizontal" then %> <% else %>
    <% end %> ++<% end end %> ++<% end %> ++<%+cbi/valuefooter%> ++ +diff --git a/feeds/luci/applications/luci-app-ddns/luasrc/view/ddns/detail_value.htm b/feeds/luci/applications/luci-app-ddns/luasrc/view/ddns/detail_value.htm +new file mode 100644 +index 0000000..cbe76ab +--- /dev/null ++++ b/feeds/luci/applications/luci-app-ddns/luasrc/view/ddns/detail_value.htm +@@ -0,0 +1,9 @@ ++ ++ ++<%+cbi/valueheader%> ++ /> ++ ++ +diff --git a/feeds/luci/applications/luci-app-ddns/luasrc/view/ddns/global_value.htm b/feeds/luci/applications/luci-app-ddns/luasrc/view/ddns/global_value.htm +new file mode 100644 +index 0000000..159cb60 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-ddns/luasrc/view/ddns/global_value.htm +@@ -0,0 +1,34 @@ ++ ++ ++<%+cbi/valueheader%> ++ ++ ++ ++/> ++
    ++
    ++ <%:help%><%=self.description%> ++
    ++ <%:Current setting%>: <%=self.date_string%> ++
    ++ ++ ++ +diff --git a/feeds/luci/applications/luci-app-ddns/luasrc/view/ddns/overview_doubleline.htm b/feeds/luci/applications/luci-app-ddns/luasrc/view/ddns/overview_doubleline.htm +new file mode 100644 +index 0000000..1d1b4be +--- /dev/null ++++ b/feeds/luci/applications/luci-app-ddns/luasrc/view/ddns/overview_doubleline.htm +@@ -0,0 +1,10 @@ ++ ++ ++<%+cbi/valueheader%> ++ ++<%=self:set_one(section)%> ++
    ++<%=self:set_two(section)%> ++ ++<%+cbi/valuefooter%> ++ +diff --git a/feeds/luci/applications/luci-app-ddns/luasrc/view/ddns/overview_enabled.htm b/feeds/luci/applications/luci-app-ddns/luasrc/view/ddns/overview_enabled.htm +new file mode 100644 +index 0000000..64b3dae +--- /dev/null ++++ b/feeds/luci/applications/luci-app-ddns/luasrc/view/ddns/overview_enabled.htm +@@ -0,0 +1,15 @@ ++ ++ ++<%+cbi/valueheader%> ++ ++ /> ++ ++ /> ++ ++<%+cbi/valuefooter%> ++ +diff --git a/feeds/luci/applications/luci-app-ddns/luasrc/view/ddns/overview_startstop.htm b/feeds/luci/applications/luci-app-ddns/luasrc/view/ddns/overview_startstop.htm +new file mode 100644 +index 0000000..327028c +--- /dev/null ++++ b/feeds/luci/applications/luci-app-ddns/luasrc/view/ddns/overview_startstop.htm +@@ -0,0 +1,17 @@ ++ ++ ++<%+cbi/valueheader%> ++ ++<% if self:cfgvalue(section) ~= false then ++-- We need to garantie that function cfgvalue run first to set missing parameters ++%> ++ ++ ++ " style="font-size: 100%;" type="button" onclick="onclick_startstop(this.id)" ++ <%= ++ attr("name", section) .. attr("id", cbid) .. attr("value", self.inputtitle) .. ifattr(self.disabled, "disabled") ++ %> /> ++<% end %> ++ ++<%+cbi/valuefooter%> ++ +diff --git a/feeds/luci/applications/luci-app-ddns/luasrc/view/ddns/overview_status.htm b/feeds/luci/applications/luci-app-ddns/luasrc/view/ddns/overview_status.htm +new file mode 100644 +index 0000000..ea8e4a1 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-ddns/luasrc/view/ddns/overview_status.htm +@@ -0,0 +1,180 @@ ++ ++ ++ ++ ++ ++ +diff --git a/feeds/luci/applications/luci-app-ddns/luasrc/view/ddns/system_status.htm b/feeds/luci/applications/luci-app-ddns/luasrc/view/ddns/system_status.htm +new file mode 100644 +index 0000000..4ca0abb +--- /dev/null ++++ b/feeds/luci/applications/luci-app-ddns/luasrc/view/ddns/system_status.htm +@@ -0,0 +1,144 @@ ++ ++ ++ ++ ++
    ++ <%:Dynamic DNS%> ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
    <%:Configuration%><%:Next Update%><%:Hostname/Domain%><%:Registered IP%><%:Network%>

    <%:Collecting data...%>
    ++
    ++ +diff --git a/feeds/luci/applications/luci-app-ddns/po/ca/ddns.po b/feeds/luci/applications/luci-app-ddns/po/ca/ddns.po +new file mode 100644 +index 0000000..35f13eb +--- /dev/null ++++ b/feeds/luci/applications/luci-app-ddns/po/ca/ddns.po +@@ -0,0 +1,703 @@ ++# ddns.pot ++# generated from ./applications/luci-ddns/luasrc/i18n/ddns.en.lua ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Report-Msgid-Bugs-To: \n" ++"POT-Creation-Date: 2010-04-02 13:44+0100\n" ++"PO-Revision-Date: 2014-07-03 20:30+0200\n" ++"Last-Translator: Alex \n" ++"Language-Team: LANGUAGE \n" ++"Language: ca\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n != 1);\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "&" ++msgstr "" ++ ++msgid "-- custom --" ++msgstr "" ++ ++msgid "-- default --" ++msgstr "" ++ ++msgid "Advanced Settings" ++msgstr "" ++ ++msgid "Allow non-public IP's" ++msgstr "" ++ ++msgid "Applying changes" ++msgstr "" ++ ++msgid "Basic Settings" ++msgstr "" ++ ++msgid "" ++"Below a list of configuration tips for your system to run Dynamic DNS " ++"updates without limitations" ++msgstr "" ++ ++msgid "" ++"Below is a list of configured DDNS configurations and their current state." ++msgstr "" ++ ++msgid "Bind Network" ++msgstr "" ++ ++msgid "Binding to a specific network not supported" ++msgstr "" ++ ++msgid "" ++"BusyBox's nslookup and Wget do not support to specify the IP version to use " ++"for communication with DDNS Provider." ++msgstr "" ++ ++msgid "" ++"BusyBox's nslookup does not support to specify to use TCP instead of default " ++"UDP when requesting DNS server" ++msgstr "" ++ ++msgid "Casual users should not change this setting" ++msgstr "" ++ ++msgid "Check Interval" ++msgstr "" ++ ++msgid "Collecting data..." ++msgstr "" ++ ++msgid "Config error" ++msgstr "" ++ ++msgid "Configuration" ++msgstr "" ++ ++msgid "" ++"Configure here the details for all Dynamic DNS services including this LuCI " ++"application." ++msgstr "" ++ ++msgid "Configure here the details for selected Dynamic DNS service." ++msgstr "" ++ ++msgid "Current setting" ++msgstr "" ++ ++msgid "" ++"Currently DDNS updates are not started at boot or on interface events.
    This is the default if you run DDNS scripts by yourself (i.e. via cron with " ++"force_interval set to '0')" ++msgstr "" ++ ++msgid "" ++"Currently DDNS updates are not started at boot or on interface events.
    You can start/stop each configuration here. It will run until next reboot." ++msgstr "" ++ ++msgid "Custom update script to be used for updating your DDNS Provider." ++msgstr "" ++ ++#, fuzzy ++msgid "Custom update-URL" ++msgstr "URL d'actualització personalitzada" ++ ++msgid "Custom update-script" ++msgstr "" ++ ++msgid "DDNS Autostart disabled" ++msgstr "" ++ ++msgid "DDNS Service provider" ++msgstr "" ++ ++msgid "DNS requests via TCP not supported" ++msgstr "" ++ ++msgid "DNS-Server" ++msgstr "" ++ ++msgid "Date format" ++msgstr "" ++ ++msgid "Defines the Web page to read systems IPv4-Address from" ++msgstr "" ++ ++msgid "Defines the Web page to read systems IPv6-Address from" ++msgstr "" ++ ++msgid "Defines the interface to read systems IP-Address from" ++msgstr "" ++ ++msgid "Defines the network to read systems IPv4-Address from" ++msgstr "" ++ ++msgid "Defines the network to read systems IPv6-Address from" ++msgstr "" ++ ++msgid "" ++"Defines the source to read systems IPv4-Address from, that will be send to " ++"the DDNS provider" ++msgstr "" ++ ++msgid "" ++"Defines the source to read systems IPv6-Address from, that will be send to " ++"the DDNS provider" ++msgstr "" ++ ++msgid "Defines which IP address 'IPv4/IPv6' is send to the DDNS provider" ++msgstr "" ++ ++msgid "Details for" ++msgstr "" ++ ++msgid "Directory contains Log files for each running section" ++msgstr "" ++ ++msgid "" ++"Directory contains PID and other status information for each running section" ++msgstr "" ++ ++msgid "Disabled" ++msgstr "" ++ ++msgid "Dynamic DNS" ++msgstr "DNS dinàmic" ++ ++#, fuzzy ++msgid "" ++"Dynamic DNS allows that your router can be reached with a fixed hostname " ++"while having a dynamically changing IP address." ++msgstr "" ++"El DNS dinàmic permet que el teu router sigui localitzable amb un nom de " ++"màquin fix mentre té una adreça IP dinàmica." ++ ++msgid "Enable secure communication with DDNS provider" ++msgstr "" ++ ++msgid "Enabled" ++msgstr "" ++ ++msgid "Error" ++msgstr "" ++ ++msgid "Error Retry Counter" ++msgstr "" ++ ++msgid "Error Retry Interval" ++msgstr "" ++ ++msgid "Event Network" ++msgstr "" ++ ++msgid "File" ++msgstr "" ++ ++msgid "File not found" ++msgstr "" ++ ++msgid "File not found or empty" ++msgstr "" ++ ++msgid "" ++"Follow this link
    You will find more hints to optimize your system to " ++"run DDNS scripts with all options" ++msgstr "" ++ ++msgid "For detailed information about parameter settings look here." ++msgstr "" ++ ++msgid "For supported codes look here" ++msgstr "" ++ ++msgid "Force IP Version" ++msgstr "" ++ ++msgid "Force IP Version not supported" ++msgstr "" ++ ++msgid "Force Interval" ++msgstr "" ++ ++msgid "Force TCP on DNS" ++msgstr "" ++ ++msgid "Forced IP Version don't matched" ++msgstr "" ++ ++msgid "Format" ++msgstr "" ++ ++msgid "Format: IP or FQDN" ++msgstr "" ++ ++msgid "" ++"GNU Wget will use the IP of given network, cURL will use the physical " ++"interface." ++msgstr "" ++ ++msgid "Global Settings" ++msgstr "" ++ ++msgid "HTTPS not supported" ++msgstr "" ++ ++msgid "Hints" ++msgstr "" ++ ++msgid "Hostname/Domain" ++msgstr "" ++ ++msgid "IP address source" ++msgstr "" ++ ++msgid "IP address version" ++msgstr "" ++ ++msgid "IPv4-Address" ++msgstr "" ++ ++msgid "IPv6 address must be given in square brackets" ++msgstr "" ++ ++msgid "" ++"IPv6 is currently not (fully) supported by this system
    Please follow " ++"the instructions on OpenWrt's homepage to enable IPv6 support
    or update " ++"your system to the latest OpenWrt Release" ++msgstr "" ++ ++msgid "IPv6 not supported" ++msgstr "" ++ ++msgid "IPv6-Address" ++msgstr "" ++ ++msgid "If both cURL and GNU Wget are installed, Wget is used by default." ++msgstr "" ++ ++msgid "" ++"If this service section is disabled it could not be started.
    Neither " ++"from LuCI interface nor from console" ++msgstr "" ++ ++msgid "" ++"If you want to send updates for IPv4 and IPv6 you need to define two " ++"separate Configurations i.e. 'myddns_ipv4' and 'myddns_ipv6'" ++msgstr "" ++ ++msgid "" ++"In some versions cURL/libcurl in OpenWrt is compiled without proxy support." ++msgstr "" ++ ++msgid "Info" ++msgstr "" ++ ++msgid "Interface" ++msgstr "Interfície" ++ ++msgid "" ++"Interval to check for changed IP
    Values below 5 minutes == 300 seconds " ++"are not supported" ++msgstr "" ++ ++msgid "" ++"Interval to force updates send to DDNS Provider
    Setting this parameter " ++"to 0 will force the script to only run once
    Values lower 'Check " ++"Interval' except '0' are not supported" ++msgstr "" ++ ++msgid "It is NOT recommended for casual users to change settings on this page." ++msgstr "" ++ ++msgid "Last Update" ++msgstr "" ++ ++msgid "Loading" ++msgstr "" ++ ++msgid "Log File Viewer" ++msgstr "" ++ ++msgid "Log directory" ++msgstr "" ++ ++msgid "Log length" ++msgstr "" ++ ++msgid "Log to file" ++msgstr "" ++ ++msgid "Log to syslog" ++msgstr "" ++ ++msgid "" ++"Neither GNU Wget with SSL nor cURL installed to select a network to use for " ++"communication." ++msgstr "" ++ ++msgid "" ++"Neither GNU Wget with SSL nor cURL installed to support updates via HTTPS " ++"protocol." ++msgstr "" ++ ++msgid "Network" ++msgstr "Xarxa" ++ ++msgid "Network on which the ddns-updater scripts will be started" ++msgstr "" ++ ++msgid "Never" ++msgstr "" ++ ++msgid "Next Update" ++msgstr "" ++ ++msgid "No data" ++msgstr "" ++ ++msgid "No logging" ++msgstr "" ++ ++msgid "Non-public and by default blocked IP's" ++msgstr "" ++ ++msgid "Notice" ++msgstr "" ++ ++msgid "Number of last lines stored in log files" ++msgstr "" ++ ++msgid "OPTIONAL: Force the usage of pure IPv4/IPv6 only communication." ++msgstr "" ++ ++msgid "OPTIONAL: Force the use of TCP instead of default UDP on DNS requests." ++msgstr "" ++ ++msgid "OPTIONAL: Network to use for communication" ++msgstr "" ++ ++msgid "OPTIONAL: Proxy-Server for detection and updates." ++msgstr "" ++ ++msgid "OPTIONAL: Use non-default DNS-Server to detect 'Registered IP'." ++msgstr "" ++ ++msgid "On Error the script will retry the failed action after given time" ++msgstr "" ++ ++msgid "On Error the script will stop execution after given number of retrys" ++msgstr "" ++ ++msgid "Overview" ++msgstr "" ++ ++msgid "PROXY-Server" ++msgstr "" ++ ++msgid "PROXY-Server not supported" ++msgstr "" ++ ++msgid "Password" ++msgstr "Contrasenya" ++ ++msgid "Path to CA-Certificate" ++msgstr "" ++ ++msgid "Please [Save & Apply] your changes first" ++msgstr "" ++ ++msgid "Please press [Read] button" ++msgstr "" ++ ++msgid "Please update to the current version!" ++msgstr "" ++ ++msgid "Process ID" ++msgstr "" ++ ++msgid "Read / Reread log file" ++msgstr "" ++ ++msgid "Registered IP" ++msgstr "" ++ ++msgid "Replaces [DOMAIN] in Update-URL" ++msgstr "" ++ ++msgid "Replaces [PASSWORD] in Update-URL" ++msgstr "" ++ ++msgid "Replaces [USERNAME] in Update-URL" ++msgstr "" ++ ++msgid "Run once" ++msgstr "" ++ ++msgid "Script" ++msgstr "" ++ ++msgid "Show more" ++msgstr "" ++ ++msgid "Software update required" ++msgstr "" ++ ++msgid "Start" ++msgstr "" ++ ++msgid "Start / Stop" ++msgstr "" ++ ++msgid "Status directory" ++msgstr "" ++ ++msgid "Stopped" ++msgstr "" ++ ++msgid "" ++"The currently installed 'ddns-scripts' package did not support all available " ++"settings." ++msgstr "" ++ ++msgid "There is no service configured." ++msgstr "" ++ ++msgid "Timer Settings" ++msgstr "" ++ ++msgid "To change global settings click here" ++msgstr "" ++ ++msgid "To use cURL activate this option." ++msgstr "" ++ ++msgid "URL" ++msgstr "" ++ ++msgid "URL to detect" ++msgstr "" ++ ++msgid "Unknown error" ++msgstr "" ++ ++msgid "" ++"Update URL to be used for updating your DDNS Provider.
    Follow " ++"instructions you will find on their WEB page." ++msgstr "" ++ ++msgid "Update error" ++msgstr "" ++ ++msgid "Use HTTP Secure" ++msgstr "" ++ ++msgid "Use cURL" ++msgstr "" ++ ++msgid "User defined script to read systems IP-Address" ++msgstr "" ++ ++msgid "Username" ++msgstr "Nom d'usuari" ++ ++msgid "Verify" ++msgstr "" ++ ++msgid "Version" ++msgstr "" ++ ++msgid "Version Information" ++msgstr "" ++ ++msgid "Waiting for changes to be applied..." ++msgstr "" ++ ++msgid "Warning" ++msgstr "" ++ ++msgid "" ++"Writes detailed messages to log file. File will be truncated automatically." ++msgstr "" ++ ++msgid "" ++"Writes log messages to syslog. Critical Errors will always be written to " ++"syslog." ++msgstr "" ++ ++msgid "You should install BIND host package for DNS requests." ++msgstr "" ++ ++msgid "You should install GNU Wget with SSL (prefered) or cURL package." ++msgstr "" ++ ++msgid "You should install GNU Wget with SSL or cURL package." ++msgstr "" ++ ++msgid "You should install GNU Wget with SSL or replace libcurl." ++msgstr "" ++ ++msgid "cURL is installed, but libcurl was compiled without proxy support." ++msgstr "" ++ ++msgid "cURL without Proxy Support" ++msgstr "" ++ ++msgid "can not detect local IP. Please select a different Source combination" ++msgstr "" ++ ++msgid "can not resolve host:" ++msgstr "" ++ ++msgid "config error" ++msgstr "" ++ ++msgid "days" ++msgstr "" ++ ++msgid "directory or path/file" ++msgstr "" ++ ++msgid "either url or script could be set" ++msgstr "" ++ ++msgid "enable here" ++msgstr "" ++ ++msgid "file or directory not found or not 'IGNORE'" ++msgstr "" ++ ++msgid "help" ++msgstr "" ++ ++msgid "hours" ++msgstr "" ++ ++msgid "installed" ++msgstr "" ++ ++msgid "invalid - Sample" ++msgstr "" ++ ++msgid "minimum value '0'" ++msgstr "" ++ ++msgid "minimum value '1'" ++msgstr "" ++ ++msgid "minimum value 5 minutes == 300 seconds" ++msgstr "" ++ ++msgid "minutes" ++msgstr "" ++ ++msgid "missing / required" ++msgstr "" ++ ++msgid "must be greater or equal 'Check Interval'" ++msgstr "" ++ ++msgid "must start with 'http://'" ++msgstr "" ++ ++msgid "nc (netcat) can not connect" ++msgstr "" ++ ++msgid "never" ++msgstr "" ++ ++msgid "no data" ++msgstr "" ++ ++msgid "not found or not executable - Sample: '/path/to/script.sh'" ++msgstr "" ++ ++msgid "nslookup can not resolve host" ++msgstr "" ++ ++msgid "or" ++msgstr "" ++ ++msgid "or higher" ++msgstr "" ++ ++msgid "please disable" ++msgstr "" ++ ++msgid "please remove entry" ++msgstr "" ++ ++msgid "please select 'IPv4' address version" ++msgstr "" ++ ++msgid "please select 'IPv4' address version in" ++msgstr "" ++ ++msgid "please set to 'default'" ++msgstr "" ++ ++msgid "proxy port missing" ++msgstr "" ++ ++msgid "required" ++msgstr "" ++ ++msgid "seconds" ++msgstr "" ++ ++msgid "to run HTTPS without verification of server certificates (insecure)" ++msgstr "" ++ ++msgid "unknown error" ++msgstr "" ++ ++msgid "unspecific error" ++msgstr "" ++ ++msgid "use hostname, FQDN, IPv4- or IPv6-Address" ++msgstr "" ++ ++#~ msgid "Check for changed IP every" ++#~ msgstr "Comprova si s'ha canviat la IP cada" ++ ++#, fuzzy ++#~ msgid "Check-time unit" ++#~ msgstr "Unitat de temps de comprovació" ++ ++#~ msgid "Enable" ++#~ msgstr "Habilita" ++ ++#~ msgid "Force update every" ++#~ msgstr "Força actualització cada" ++ ++#, fuzzy ++#~ msgid "Force-time unit" ++#~ msgstr "Unitat de temps de forceig" ++ ++#~ msgid "Service" ++#~ msgstr "Servei" ++ ++#~ msgid "Source of IP address" ++#~ msgstr "Origen de l'adreça IP" ++ ++#~ msgid "custom" ++#~ msgstr "personalitzat" ++ ++# Hours ++#~ msgid "h" ++#~ msgstr "h" ++ ++#~ msgid "interface" ++#~ msgstr "interfície" ++ ++# Minutes (not minimum) ++#~ msgid "min" ++#~ msgstr "min" ++ ++#~ msgid "network" ++#~ msgstr "xarxa" ++ ++#~ msgid "Event interface" ++#~ msgstr "Interfície d'esdeveniment" +diff --git a/feeds/luci/applications/luci-app-ddns/po/cs/ddns.po b/feeds/luci/applications/luci-app-ddns/po/cs/ddns.po +new file mode 100644 +index 0000000..455c72a +--- /dev/null ++++ b/feeds/luci/applications/luci-app-ddns/po/cs/ddns.po +@@ -0,0 +1,701 @@ ++# Generated from applications/luci-ddns/luasrc/model/cbi/ddns/ddns.lua ++# ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Report-Msgid-Bugs-To: \n" ++"POT-Creation-Date: 2010-04-02 13:44+0100\n" ++"PO-Revision-Date: 2014-06-20 23:22+0200\n" ++"Last-Translator: koli \n" ++"Language-Team: none\n" ++"Language: cs\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "&" ++msgstr "" ++ ++msgid "-- custom --" ++msgstr "" ++ ++msgid "-- default --" ++msgstr "" ++ ++msgid "Advanced Settings" ++msgstr "" ++ ++msgid "Allow non-public IP's" ++msgstr "" ++ ++msgid "Applying changes" ++msgstr "" ++ ++msgid "Basic Settings" ++msgstr "" ++ ++msgid "" ++"Below a list of configuration tips for your system to run Dynamic DNS " ++"updates without limitations" ++msgstr "" ++ ++msgid "" ++"Below is a list of configured DDNS configurations and their current state." ++msgstr "" ++ ++msgid "Bind Network" ++msgstr "" ++ ++msgid "Binding to a specific network not supported" ++msgstr "" ++ ++msgid "" ++"BusyBox's nslookup and Wget do not support to specify the IP version to use " ++"for communication with DDNS Provider." ++msgstr "" ++ ++msgid "" ++"BusyBox's nslookup does not support to specify to use TCP instead of default " ++"UDP when requesting DNS server" ++msgstr "" ++ ++msgid "Casual users should not change this setting" ++msgstr "" ++ ++msgid "Check Interval" ++msgstr "" ++ ++msgid "Collecting data..." ++msgstr "" ++ ++msgid "Config error" ++msgstr "" ++ ++msgid "Configuration" ++msgstr "" ++ ++msgid "" ++"Configure here the details for all Dynamic DNS services including this LuCI " ++"application." ++msgstr "" ++ ++msgid "Configure here the details for selected Dynamic DNS service." ++msgstr "" ++ ++msgid "Current setting" ++msgstr "" ++ ++msgid "" ++"Currently DDNS updates are not started at boot or on interface events.
    This is the default if you run DDNS scripts by yourself (i.e. via cron with " ++"force_interval set to '0')" ++msgstr "" ++ ++msgid "" ++"Currently DDNS updates are not started at boot or on interface events.
    You can start/stop each configuration here. It will run until next reboot." ++msgstr "" ++ ++msgid "Custom update script to be used for updating your DDNS Provider." ++msgstr "" ++ ++msgid "Custom update-URL" ++msgstr "Vlastní aktualizaÄní-URL" ++ ++msgid "Custom update-script" ++msgstr "" ++ ++msgid "DDNS Autostart disabled" ++msgstr "" ++ ++msgid "DDNS Service provider" ++msgstr "" ++ ++msgid "DNS requests via TCP not supported" ++msgstr "" ++ ++msgid "DNS-Server" ++msgstr "" ++ ++msgid "Date format" ++msgstr "" ++ ++msgid "Defines the Web page to read systems IPv4-Address from" ++msgstr "" ++ ++msgid "Defines the Web page to read systems IPv6-Address from" ++msgstr "" ++ ++msgid "Defines the interface to read systems IP-Address from" ++msgstr "" ++ ++msgid "Defines the network to read systems IPv4-Address from" ++msgstr "" ++ ++msgid "Defines the network to read systems IPv6-Address from" ++msgstr "" ++ ++msgid "" ++"Defines the source to read systems IPv4-Address from, that will be send to " ++"the DDNS provider" ++msgstr "" ++ ++msgid "" ++"Defines the source to read systems IPv6-Address from, that will be send to " ++"the DDNS provider" ++msgstr "" ++ ++msgid "Defines which IP address 'IPv4/IPv6' is send to the DDNS provider" ++msgstr "" ++ ++msgid "Details for" ++msgstr "" ++ ++msgid "Directory contains Log files for each running section" ++msgstr "" ++ ++msgid "" ++"Directory contains PID and other status information for each running section" ++msgstr "" ++ ++msgid "Disabled" ++msgstr "" ++ ++msgid "Dynamic DNS" ++msgstr "Dynamické DNS" ++ ++msgid "" ++"Dynamic DNS allows that your router can be reached with a fixed hostname " ++"while having a dynamically changing IP address." ++msgstr "" ++"Dynamické DNS umožňuje, aby mohl být váš router dostupný pod pevným " ++"hostname, zatímco se jeho IP adresa dynamicky mÄ›ní." ++ ++msgid "Enable secure communication with DDNS provider" ++msgstr "" ++ ++msgid "Enabled" ++msgstr "" ++ ++msgid "Error" ++msgstr "" ++ ++msgid "Error Retry Counter" ++msgstr "" ++ ++msgid "Error Retry Interval" ++msgstr "" ++ ++msgid "Event Network" ++msgstr "" ++ ++msgid "File" ++msgstr "" ++ ++msgid "File not found" ++msgstr "" ++ ++msgid "File not found or empty" ++msgstr "" ++ ++msgid "" ++"Follow this link
    You will find more hints to optimize your system to " ++"run DDNS scripts with all options" ++msgstr "" ++ ++msgid "For detailed information about parameter settings look here." ++msgstr "" ++ ++msgid "For supported codes look here" ++msgstr "" ++ ++msgid "Force IP Version" ++msgstr "" ++ ++msgid "Force IP Version not supported" ++msgstr "" ++ ++msgid "Force Interval" ++msgstr "" ++ ++msgid "Force TCP on DNS" ++msgstr "" ++ ++msgid "Forced IP Version don't matched" ++msgstr "" ++ ++msgid "Format" ++msgstr "" ++ ++msgid "Format: IP or FQDN" ++msgstr "" ++ ++msgid "" ++"GNU Wget will use the IP of given network, cURL will use the physical " ++"interface." ++msgstr "" ++ ++msgid "Global Settings" ++msgstr "" ++ ++msgid "HTTPS not supported" ++msgstr "" ++ ++msgid "Hints" ++msgstr "" ++ ++msgid "Hostname/Domain" ++msgstr "" ++ ++msgid "IP address source" ++msgstr "" ++ ++msgid "IP address version" ++msgstr "" ++ ++msgid "IPv4-Address" ++msgstr "" ++ ++msgid "IPv6 address must be given in square brackets" ++msgstr "" ++ ++msgid "" ++"IPv6 is currently not (fully) supported by this system
    Please follow " ++"the instructions on OpenWrt's homepage to enable IPv6 support
    or update " ++"your system to the latest OpenWrt Release" ++msgstr "" ++ ++msgid "IPv6 not supported" ++msgstr "" ++ ++msgid "IPv6-Address" ++msgstr "" ++ ++msgid "If both cURL and GNU Wget are installed, Wget is used by default." ++msgstr "" ++ ++msgid "" ++"If this service section is disabled it could not be started.
    Neither " ++"from LuCI interface nor from console" ++msgstr "" ++ ++msgid "" ++"If you want to send updates for IPv4 and IPv6 you need to define two " ++"separate Configurations i.e. 'myddns_ipv4' and 'myddns_ipv6'" ++msgstr "" ++ ++msgid "" ++"In some versions cURL/libcurl in OpenWrt is compiled without proxy support." ++msgstr "" ++ ++msgid "Info" ++msgstr "" ++ ++msgid "Interface" ++msgstr "Rozhraní" ++ ++msgid "" ++"Interval to check for changed IP
    Values below 5 minutes == 300 seconds " ++"are not supported" ++msgstr "" ++ ++msgid "" ++"Interval to force updates send to DDNS Provider
    Setting this parameter " ++"to 0 will force the script to only run once
    Values lower 'Check " ++"Interval' except '0' are not supported" ++msgstr "" ++ ++msgid "It is NOT recommended for casual users to change settings on this page." ++msgstr "" ++ ++msgid "Last Update" ++msgstr "" ++ ++msgid "Loading" ++msgstr "" ++ ++msgid "Log File Viewer" ++msgstr "" ++ ++msgid "Log directory" ++msgstr "" ++ ++msgid "Log length" ++msgstr "" ++ ++msgid "Log to file" ++msgstr "" ++ ++msgid "Log to syslog" ++msgstr "" ++ ++msgid "" ++"Neither GNU Wget with SSL nor cURL installed to select a network to use for " ++"communication." ++msgstr "" ++ ++msgid "" ++"Neither GNU Wget with SSL nor cURL installed to support updates via HTTPS " ++"protocol." ++msgstr "" ++ ++msgid "Network" ++msgstr "Síť" ++ ++msgid "Network on which the ddns-updater scripts will be started" ++msgstr "" ++ ++msgid "Never" ++msgstr "" ++ ++msgid "Next Update" ++msgstr "" ++ ++msgid "No data" ++msgstr "" ++ ++msgid "No logging" ++msgstr "" ++ ++msgid "Non-public and by default blocked IP's" ++msgstr "" ++ ++msgid "Notice" ++msgstr "" ++ ++msgid "Number of last lines stored in log files" ++msgstr "" ++ ++msgid "OPTIONAL: Force the usage of pure IPv4/IPv6 only communication." ++msgstr "" ++ ++msgid "OPTIONAL: Force the use of TCP instead of default UDP on DNS requests." ++msgstr "" ++ ++msgid "OPTIONAL: Network to use for communication" ++msgstr "" ++ ++msgid "OPTIONAL: Proxy-Server for detection and updates." ++msgstr "" ++ ++msgid "OPTIONAL: Use non-default DNS-Server to detect 'Registered IP'." ++msgstr "" ++ ++msgid "On Error the script will retry the failed action after given time" ++msgstr "" ++ ++msgid "On Error the script will stop execution after given number of retrys" ++msgstr "" ++ ++msgid "Overview" ++msgstr "" ++ ++msgid "PROXY-Server" ++msgstr "" ++ ++msgid "PROXY-Server not supported" ++msgstr "" ++ ++msgid "Password" ++msgstr "Heslo" ++ ++msgid "Path to CA-Certificate" ++msgstr "" ++ ++msgid "Please [Save & Apply] your changes first" ++msgstr "" ++ ++msgid "Please press [Read] button" ++msgstr "" ++ ++msgid "Please update to the current version!" ++msgstr "" ++ ++msgid "Process ID" ++msgstr "" ++ ++msgid "Read / Reread log file" ++msgstr "" ++ ++msgid "Registered IP" ++msgstr "" ++ ++msgid "Replaces [DOMAIN] in Update-URL" ++msgstr "" ++ ++msgid "Replaces [PASSWORD] in Update-URL" ++msgstr "" ++ ++msgid "Replaces [USERNAME] in Update-URL" ++msgstr "" ++ ++msgid "Run once" ++msgstr "" ++ ++msgid "Script" ++msgstr "" ++ ++msgid "Show more" ++msgstr "" ++ ++msgid "Software update required" ++msgstr "" ++ ++msgid "Start" ++msgstr "" ++ ++msgid "Start / Stop" ++msgstr "" ++ ++msgid "Status directory" ++msgstr "" ++ ++msgid "Stopped" ++msgstr "" ++ ++msgid "" ++"The currently installed 'ddns-scripts' package did not support all available " ++"settings." ++msgstr "" ++ ++msgid "There is no service configured." ++msgstr "" ++ ++msgid "Timer Settings" ++msgstr "" ++ ++msgid "To change global settings click here" ++msgstr "" ++ ++msgid "To use cURL activate this option." ++msgstr "" ++ ++msgid "URL" ++msgstr "URL" ++ ++msgid "URL to detect" ++msgstr "" ++ ++msgid "Unknown error" ++msgstr "" ++ ++msgid "" ++"Update URL to be used for updating your DDNS Provider.
    Follow " ++"instructions you will find on their WEB page." ++msgstr "" ++ ++msgid "Update error" ++msgstr "" ++ ++msgid "Use HTTP Secure" ++msgstr "" ++ ++msgid "Use cURL" ++msgstr "" ++ ++msgid "User defined script to read systems IP-Address" ++msgstr "" ++ ++msgid "Username" ++msgstr "Uživatelské jméno" ++ ++msgid "Verify" ++msgstr "" ++ ++msgid "Version" ++msgstr "" ++ ++msgid "Version Information" ++msgstr "" ++ ++msgid "Waiting for changes to be applied..." ++msgstr "" ++ ++msgid "Warning" ++msgstr "" ++ ++msgid "" ++"Writes detailed messages to log file. File will be truncated automatically." ++msgstr "" ++ ++msgid "" ++"Writes log messages to syslog. Critical Errors will always be written to " ++"syslog." ++msgstr "" ++ ++msgid "You should install BIND host package for DNS requests." ++msgstr "" ++ ++msgid "You should install GNU Wget with SSL (prefered) or cURL package." ++msgstr "" ++ ++msgid "You should install GNU Wget with SSL or cURL package." ++msgstr "" ++ ++msgid "You should install GNU Wget with SSL or replace libcurl." ++msgstr "" ++ ++msgid "cURL is installed, but libcurl was compiled without proxy support." ++msgstr "" ++ ++msgid "cURL without Proxy Support" ++msgstr "" ++ ++msgid "can not detect local IP. Please select a different Source combination" ++msgstr "" ++ ++msgid "can not resolve host:" ++msgstr "" ++ ++msgid "config error" ++msgstr "" ++ ++msgid "days" ++msgstr "" ++ ++msgid "directory or path/file" ++msgstr "" ++ ++msgid "either url or script could be set" ++msgstr "" ++ ++msgid "enable here" ++msgstr "" ++ ++msgid "file or directory not found or not 'IGNORE'" ++msgstr "" ++ ++msgid "help" ++msgstr "" ++ ++msgid "hours" ++msgstr "" ++ ++msgid "installed" ++msgstr "" ++ ++msgid "invalid - Sample" ++msgstr "" ++ ++msgid "minimum value '0'" ++msgstr "" ++ ++msgid "minimum value '1'" ++msgstr "" ++ ++msgid "minimum value 5 minutes == 300 seconds" ++msgstr "" ++ ++msgid "minutes" ++msgstr "" ++ ++msgid "missing / required" ++msgstr "" ++ ++msgid "must be greater or equal 'Check Interval'" ++msgstr "" ++ ++msgid "must start with 'http://'" ++msgstr "" ++ ++msgid "nc (netcat) can not connect" ++msgstr "" ++ ++msgid "never" ++msgstr "" ++ ++msgid "no data" ++msgstr "" ++ ++msgid "not found or not executable - Sample: '/path/to/script.sh'" ++msgstr "" ++ ++msgid "nslookup can not resolve host" ++msgstr "" ++ ++msgid "or" ++msgstr "" ++ ++msgid "or higher" ++msgstr "" ++ ++msgid "please disable" ++msgstr "" ++ ++msgid "please remove entry" ++msgstr "" ++ ++msgid "please select 'IPv4' address version" ++msgstr "" ++ ++msgid "please select 'IPv4' address version in" ++msgstr "" ++ ++msgid "please set to 'default'" ++msgstr "" ++ ++msgid "proxy port missing" ++msgstr "" ++ ++msgid "required" ++msgstr "" ++ ++msgid "seconds" ++msgstr "" ++ ++msgid "to run HTTPS without verification of server certificates (insecure)" ++msgstr "" ++ ++msgid "unknown error" ++msgstr "" ++ ++msgid "unspecific error" ++msgstr "" ++ ++msgid "use hostname, FQDN, IPv4- or IPv6-Address" ++msgstr "" ++ ++#~ msgid "Check for changed IP every" ++#~ msgstr "Zkontrolovat změnu IP každých" ++ ++#~ msgid "Check-time unit" ++#~ msgstr "Check-time jednotka" ++ ++#~ msgid "Enable" ++#~ msgstr "Povolit" ++ ++#~ msgid "Force update every" ++#~ msgstr "Vynutit aktualizaci každých" ++ ++#~ msgid "Force-time unit" ++#~ msgstr "Force-time jednotka" ++ ++#~ msgid "Hostname" ++#~ msgstr "Hostname" ++ ++#~ msgid "Service" ++#~ msgstr "Služba" ++ ++#~ msgid "Source of IP address" ++#~ msgstr "Zdroj IP adresy" ++ ++#~ msgid "custom" ++#~ msgstr "vlastní" ++ ++# Hours ++# Hodin ++#~ msgid "h" ++#~ msgstr "h" ++ ++#~ msgid "interface" ++#~ msgstr "rozhraní" ++ ++# Minutes (not minimum) ++# Minut ++#~ msgid "min" ++#~ msgstr "min" ++ ++#~ msgid "network" ++#~ msgstr "síť" +diff --git a/feeds/luci/applications/luci-app-ddns/po/de/ddns.po b/feeds/luci/applications/luci-app-ddns/po/de/ddns.po +new file mode 100644 +index 0000000..6ffde5d +--- /dev/null ++++ b/feeds/luci/applications/luci-app-ddns/po/de/ddns.po +@@ -0,0 +1,745 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: luci-app-ddns\n" ++"POT-Creation-Date: 2015-05-08 21:29+0100\n" ++"PO-Revision-Date: 2015-05-08 21:47+0100\n" ++"Last-Translator: Christian Schoenebeck \n" ++"Language-Team: \n" ++"Language: de\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"X-Generator: Poedit 1.7.5\n" ++"Plural-Forms: nplurals=2; plural=(n != 1);\n" ++"X-Poedit-SourceCharset: UTF-8\n" ++"X-Poedit-Basepath: .\n" ++ ++msgid "&" ++msgstr "&" ++ ++msgid "-- custom --" ++msgstr "-- benutzerdefiniert --" ++ ++msgid "-- default --" ++msgstr "-- Standard --" ++ ++msgid "Advanced Settings" ++msgstr "Erweiterte Einstellungen" ++ ++msgid "Allow non-public IP's" ++msgstr "Erlaube Nicht-öffentliche IPs" ++ ++msgid "Applying changes" ++msgstr "Änderungen anwenden" ++ ++msgid "Basic Settings" ++msgstr "Grundlegende Einstellungen" ++ ++msgid "" ++"Below a list of configuration tips for your system to run Dynamic DNS " ++"updates without limitations" ++msgstr "" ++"Liste der Konfigurationshinweise um Dynamische DNS Aktualisierungen ohne " ++"Einschränkungen zu nutzen" ++ ++msgid "" ++"Below is a list of configured DDNS configurations and their current state." ++msgstr "" ++"Liste der konfigurierten DDNS Konfigurationen und ihr momentaner Status." ++ ++msgid "Bind Network" ++msgstr "Bind-Netzwerk" ++ ++msgid "Binding to a specific network not supported" ++msgstr "'Bind' an ein bestimmtes Netzwerk wird nicht unterstützt" ++ ++msgid "" ++"BusyBox's nslookup and Wget do not support to specify the IP version to use " ++"for communication with DDNS Provider." ++msgstr "" ++"BusyBox's nslookup und Wget unterstützen nicht die IP Version für die " ++"Kommunikation festzulegen." ++ ++msgid "" ++"BusyBox's nslookup does not support to specify to use TCP instead of default " ++"UDP when requesting DNS server" ++msgstr "" ++"BusyBox's nslookup unterstützt es nicht das TCP-Protokoll für DNS Anfragen " ++"anstelle des standardmäßigen UDP-Protokolls." ++ ++msgid "Casual users should not change this setting" ++msgstr "Standard Benutzer sollten diese Einstellung nicht ändern." ++ ++msgid "Check Interval" ++msgstr "Prüfinterval" ++ ++msgid "Collecting data..." ++msgstr "Sammle Daten..." ++ ++msgid "Config error" ++msgstr "Konfigurationsfehler" ++ ++msgid "Configuration" ++msgstr "Einstellungen" ++ ++msgid "" ++"Configure here the details for all Dynamic DNS services including this LuCI " ++"application." ++msgstr "" ++"Konfiguriere hier die Details für alle Dynamik DNS Dienste einschließlich " ++"dieser LuCI Anwendung." ++ ++msgid "Configure here the details for selected Dynamic DNS service." ++msgstr "Konfiguriere hier die Details für den gewählten Dynamik DNS Dienst." ++ ++msgid "Current setting" ++msgstr "Aktuelle Einstellung" ++ ++msgid "" ++"Currently DDNS updates are not started at boot or on interface events.
    This is the default if you run DDNS scripts by yourself (i.e. via cron with " ++"force_interval set to '0')" ++msgstr "" ++"Aktuell werden keine DDNS Aktualisierungen beim Systemstart oder bei " ++"Netzwerkereignissen gestartet.
    Dieses ist der Standard, wenn Sie die " ++"DDSN Skripte über eigene Routinen (z.B. cron und Erzwungener Aktualisierung " ++"von '0') starten." ++ ++msgid "" ++"Currently DDNS updates are not started at boot or on interface events.
    You can start/stop each configuration here. It will run until next reboot." ++msgstr "" ++"Aktuell werden DDNS Aktualisierungen nicht bei Systemstart oder bei " ++"Netzwerkereignissen gestartet.
    Sie können jede Konfiguration hier " ++"starten und stoppen. Sie wird bis zum nächsten Neustart ausgeführt." ++ ++msgid "Custom update script to be used for updating your DDNS Provider." ++msgstr "Update-Skript um Aktualisierungen an Ihren DDNS Anbieter zu senden." ++ ++msgid "Custom update-URL" ++msgstr "Eigene Update-URL" ++ ++msgid "Custom update-script" ++msgstr "Eigenes Update-Skript" ++ ++msgid "DDNS Autostart disabled" ++msgstr "DDNS Autostart deaktiviert" ++ ++msgid "DDNS Service provider" ++msgstr "DDNS-Dienstanbieter" ++ ++msgid "DNS requests via TCP not supported" ++msgstr "DNS Anfragen über TCP nicht unterstützt" ++ ++msgid "DNS-Server" ++msgstr "DNS-Server" ++ ++msgid "Date format" ++msgstr "Datumsformat " ++ ++msgid "Defines the Web page to read systems IPv4-Address from" ++msgstr "" ++"Definiert die Web-Seite von der die aktuelle IPv4-Adresse des System gelesen " ++"wird." ++ ++msgid "Defines the Web page to read systems IPv6-Address from" ++msgstr "" ++"Definiert die Web-Seite von der die aktuelle IPv6-Adresse des System gelesen " ++"wird." ++ ++msgid "Defines the interface to read systems IP-Address from" ++msgstr "" ++"Definiert die Schnittstelle von der die aktuelle IP-Adresse des System " ++"gelesen wird." ++ ++msgid "Defines the network to read systems IPv4-Address from" ++msgstr "" ++"Definiert das Netzwerk von dem die aktuelle IPv4-Adresse des System gelesen " ++"wird." ++ ++msgid "Defines the network to read systems IPv6-Address from" ++msgstr "" ++"Definiert das Netzwerk von dem die aktuelle IPv6-Adresse des System gelesen " ++"wird." ++ ++msgid "" ++"Defines the source to read systems IPv4-Address from, that will be send to " ++"the DDNS provider" ++msgstr "" ++"Definiert die Quelle von der die aktuelle IPv4-Adresse des Systems gelesen " ++"wird, die an Ihren DDNS Anbieter gesendet wird." ++ ++msgid "" ++"Defines the source to read systems IPv6-Address from, that will be send to " ++"the DDNS provider" ++msgstr "" ++"Definiert die Quelle von der die aktuelle IPv6-Adresse des Systems gelesen " ++"wird, die an Ihren DDNS Anbieter gesendet wird." ++ ++msgid "Defines which IP address 'IPv4/IPv6' is send to the DDNS provider" ++msgstr "" ++"Legt fest welche IP-Adresse 'IPv4/IPv6' zum DDNS Anbieter gesendet wird" ++ ++msgid "Details for" ++msgstr "Details für" ++ ++msgid "Directory contains Log files for each running section" ++msgstr "" ++"Das Verzeichnis enthält die Protokolldateien aller laufenden Konfigurationen." ++ ++msgid "" ++"Directory contains PID and other status information for each running section" ++msgstr "" ++"Das Verzeichnis enthält die PID und andere Statusinformationen aller " ++"laufenden Konfigurationen." ++ ++msgid "Disabled" ++msgstr "Deaktiviert" ++ ++msgid "Dynamic DNS" ++msgstr "Dynamisches DNS" ++ ++msgid "" ++"Dynamic DNS allows that your router can be reached with a fixed hostname " ++"while having a dynamically changing IP address." ++msgstr "" ++"Dynamisches DNS erlaubt es, den Router bei dynamischer IP-Adresse über einen " ++"festen DNS-Namen zu erreichen." ++ ++msgid "Enable secure communication with DDNS provider" ++msgstr "Aktiviert sichere Kommunikation mit dem DDNS Anbieter" ++ ++msgid "Enabled" ++msgstr "Aktiviert" ++ ++msgid "Error" ++msgstr "Fehler" ++ ++msgid "Error Retry Counter" ++msgstr "Wiederholungszähler bei Fehler" ++ ++msgid "Error Retry Interval" ++msgstr "Wiederholungsintervall bei Fehler" ++ ++msgid "Event Network" ++msgstr "Ereignis Netzwerk" ++ ++msgid "File" ++msgstr "Datei" ++ ++msgid "File not found" ++msgstr "Datei nicht gefunden" ++ ++msgid "File not found or empty" ++msgstr "Datei nicht gefunden oder leer" ++ ++msgid "" ++"Follow this link
    You will find more hints to optimize your system to " ++"run DDNS scripts with all options" ++msgstr "" ++"Folgen Sie dem Link
    Hier finden Sie weitere Hinweise um Ihr System für " ++"die Nutzung aller Optionen der DDNS Skripte zu optimieren." ++ ++msgid "For detailed information about parameter settings look here." ++msgstr "" ++"Detaillierte Informationen zu den Parametereinstellungen finden Sie hier." ++ ++msgid "For supported codes look here" ++msgstr "Unterstützte Kodierungen finden Sie hier." ++ ++msgid "Force IP Version" ++msgstr "Erzwinge IP-Version" ++ ++msgid "Force IP Version not supported" ++msgstr "Erzwinge IP-Version nicht unterstützt" ++ ++msgid "Force Interval" ++msgstr "Erzwungene Aktualisierung" ++ ++msgid "Force TCP on DNS" ++msgstr "Erzwinge TCP bei DNS-Anfragen" ++ ++msgid "Forced IP Version don't matched" ++msgstr "Erzwungene IP Version stimmt nicht überein" ++ ++msgid "Format" ++msgstr "Format" ++ ++msgid "Format: IP or FQDN" ++msgstr "Format: IP-Adresse oder FQDN" ++ ++msgid "" ++"GNU Wget will use the IP of given network, cURL will use the physical " ++"interface." ++msgstr "" ++"GNU Wget verwendet die IP des gewählten Netzwerkes; cURL verwendet die " ++"physikalische Schnittstelle." ++ ++msgid "Global Settings" ++msgstr "Globale Einstellungen" ++ ++msgid "HTTPS not supported" ++msgstr "HTTPS nicht unterstützt" ++ ++msgid "Hints" ++msgstr "Hinweise" ++ ++msgid "Hostname/Domain" ++msgstr "Rechnername/Domäne" ++ ++msgid "IP address source" ++msgstr "IP-Adressquelle" ++ ++msgid "IP address version" ++msgstr "IP-Adressversion" ++ ++msgid "IPv4-Address" ++msgstr "IPv4-Adresse" ++ ++msgid "IPv6 address must be given in square brackets" ++msgstr "Eine IPv6 Adresse muss in eckigen Klammern angegeben werden" ++ ++msgid "" ++"IPv6 is currently not (fully) supported by this system
    Please follow " ++"the instructions on OpenWrt's homepage to enable IPv6 support
    or update " ++"your system to the latest OpenWrt Release" ++msgstr "" ++"IPv6 wird vom System nicht (voll) unterstützt.
    Bitte folgen Sie den " ++"Hinweisen auf der Homepage von OpenWrt um die volle IPv6-Unterstützung zu " ++"aktivieren
    oder installieren Sie die aktuellste OpenWrt Version." ++ ++msgid "IPv6 not supported" ++msgstr "IPv6 nicht unterstützt" ++ ++msgid "IPv6-Address" ++msgstr "IPv6-Adresse" ++ ++msgid "If both cURL and GNU Wget are installed, Wget is used by default." ++msgstr "Wenn cURL und GNU Wget installiert sind, wird Wget verwendet." ++ ++msgid "" ++"If this service section is disabled it could not be started.
    Neither " ++"from LuCI interface nor from console" ++msgstr "" ++"Wenn deaktiviert kann die Aktualisierung nicht gestartet werden.
    Weder " ++"über das LuCI Web Interface noch von der Geräte-Konsole" ++ ++msgid "" ++"If you want to send updates for IPv4 and IPv6 you need to define two " ++"separate Configurations i.e. 'myddns_ipv4' and 'myddns_ipv6'" ++msgstr "" ++"Wenn Sie Aktualisierungen für IPv4 und IPv6 senden möchten benötigen Sie " ++"zwei Konfigurationen z.B. 'myddns_ipv4' und 'myddns_ipv6'" ++ ++msgid "" ++"In some versions cURL/libcurl in OpenWrt is compiled without proxy support." ++msgstr "" ++"In einigen Versionen von OpenWrt wurde cURL/libcurl ohne Proxy Unterstützung " ++"compiliert." ++ ++msgid "Info" ++msgstr "Informationen" ++ ++msgid "Interface" ++msgstr "Schnittstelle" ++ ++msgid "" ++"Interval to check for changed IP
    Values below 5 minutes == 300 seconds " ++"are not supported" ++msgstr "" ++"Intervall zur Prüfung auf geänderte IP-Adresse
    Minimum Wert 5 Minuten " ++"== 300 Sekunden" ++ ++msgid "" ++"Interval to force updates send to DDNS Provider
    Setting this parameter " ++"to 0 will force the script to only run once
    Values lower 'Check " ++"Interval' except '0' are not supported" ++msgstr "" ++"Intervall mit dem Aktualisierungen erzwungen an den DDNS Anbieter gesendet " ++"werden.
    Ein Wert von '0' führt das Skript nur einmalig aus.
    Der " ++"Wert muss größer als das Prüfintervall sein oder '0'." ++ ++msgid "It is NOT recommended for casual users to change settings on this page." ++msgstr "" ++"Es wird nicht empfohlen, dass Standard Benutzer die Einstellungen auf dieser " ++"Seite ändern." ++ ++msgid "Last Update" ++msgstr "Letztes Aktualisierung" ++ ++msgid "Loading" ++msgstr "Lade" ++ ++msgid "Log File Viewer" ++msgstr "Protokolldatei" ++ ++msgid "Log directory" ++msgstr "Protokoll-Verzeichnis" ++ ++msgid "Log length" ++msgstr "Protokolllänge" ++ ++msgid "Log to file" ++msgstr "Protokoll in Datei schreiben" ++ ++msgid "Log to syslog" ++msgstr "Systemprotokoll verwenden" ++ ++msgid "" ++"Neither GNU Wget with SSL nor cURL installed to select a network to use for " ++"communication." ++msgstr "" ++"Weder GNU Wget mit SSL noch cURL sind installiert um ein Netzwerk zur " ++"Kommunikation festzulegen." ++ ++msgid "" ++"Neither GNU Wget with SSL nor cURL installed to support updates via HTTPS " ++"protocol." ++msgstr "" ++"Weder GNU Wget mit SSL noch cURL sind installiert um Aktualisierungen über " ++"HTTPS Protokoll zu unterstützen." ++ ++msgid "Network" ++msgstr "Netzwerk" ++ ++msgid "Network on which the ddns-updater scripts will be started" ++msgstr "Netzwerk auf dem Ereignisse die ddns-updater Skripte starten" ++ ++msgid "Never" ++msgstr "Nie" ++ ++msgid "Next Update" ++msgstr "Nächste Aktualisierung" ++ ++msgid "No data" ++msgstr "Keine Daten" ++ ++msgid "No logging" ++msgstr "Keine Protokollierung" ++ ++msgid "Non-public and by default blocked IP's" ++msgstr "Nicht-öffentliche und standardmäßig blockierte IPs." ++ ++msgid "Notice" ++msgstr "Notiz" ++ ++msgid "Number of last lines stored in log files" ++msgstr "" ++"Anzahl der letzten Zeilen die in der Protokolldatei gespeichert werden." ++ ++msgid "OPTIONAL: Force the usage of pure IPv4/IPv6 only communication." ++msgstr "" ++"OPTIONAL: Erzwingt die Verwendung einer reinen IPv4/IPv6 Kommunikation." ++ ++msgid "OPTIONAL: Force the use of TCP instead of default UDP on DNS requests." ++msgstr "" ++"OPTIONAL: Erzwingt die Verwendung von TCP anstelle von UDP bei DNS Anfragen." ++ ++msgid "OPTIONAL: Network to use for communication" ++msgstr "OPTIONAL: Netzwerk das zur Kommunikation verwendet werden soll." ++ ++msgid "OPTIONAL: Proxy-Server for detection and updates." ++msgstr "OPTIONAL: Proxy-Server für Adresserkennung und Aktualisierungen" ++ ++msgid "OPTIONAL: Use non-default DNS-Server to detect 'Registered IP'." ++msgstr "" ++"OPTIONAL: Ersetzt den voreingestellten DNS-Server um die 'Registrierte IP' " ++"zu ermitteln." ++ ++msgid "On Error the script will retry the failed action after given time" ++msgstr "" ++"Bei Fehlern wird das Skript die fehlerhafte Aktion nach der gegebenen Zeit " ++"wiederholen" ++ ++msgid "On Error the script will stop execution after given number of retrys" ++msgstr "Das Skript wird nach der gegebenen Anzahl von Fehlversuchen beendet." ++ ++msgid "Overview" ++msgstr "Übersicht" ++ ++msgid "PROXY-Server" ++msgstr "Proxy-Server" ++ ++msgid "PROXY-Server not supported" ++msgstr "Proxy-Server nicht unterstützt" ++ ++msgid "Password" ++msgstr "Passwort" ++ ++msgid "Path to CA-Certificate" ++msgstr "Pfad zum CA-Zertifikat" ++ ++msgid "Please [Save & Apply] your changes first" ++msgstr "Bitte [Speichern & Anwenden] Sie Änderungen zunächst" ++ ++msgid "Please press [Read] button" ++msgstr "Bitte Protokolldatei einlesen" ++ ++msgid "Please update to the current version!" ++msgstr "Aktualisieren Sie bitte auf die aktuelle Version!" ++ ++msgid "Process ID" ++msgstr "Prozess ID" ++ ++msgid "Read / Reread log file" ++msgstr "Protokolldatei (neu) einlesen" ++ ++msgid "Registered IP" ++msgstr "Registrierte IP" ++ ++msgid "Replaces [DOMAIN] in Update-URL" ++msgstr "Ersetzt [DOMAIN] in der Update-URL" ++ ++msgid "Replaces [PASSWORD] in Update-URL" ++msgstr "Ersetzt [PASSWORD] in der Update-URL" ++ ++msgid "Replaces [USERNAME] in Update-URL" ++msgstr "Ersetzt [USERNAME] in der Update-URL" ++ ++msgid "Run once" ++msgstr "Einmalig ausführen" ++ ++msgid "Script" ++msgstr "Skript" ++ ++msgid "Show more" ++msgstr "Zeige mehr" ++ ++msgid "Software update required" ++msgstr "Softwareaktualisierung nötig" ++ ++msgid "Start" ++msgstr "Start" ++ ++msgid "Start / Stop" ++msgstr "Start / Stopp" ++ ++msgid "Status directory" ++msgstr "Status-Verzeichnis" ++ ++msgid "Stopped" ++msgstr "Angehalten" ++ ++msgid "" ++"The currently installed 'ddns-scripts' package did not support all available " ++"settings." ++msgstr "" ++"Die installierte Software 'ddns-scripts' unterstützt nicht alle verfügbaren " ++"Optionen." ++ ++msgid "The default setting of '0' will retry infinite." ++msgstr "Der Standard-Wert von '0' wird es endlosen erneut versuchen." ++ ++msgid "There is no service configured." ++msgstr "Kein Dienst konfiguriert" ++ ++msgid "Timer Settings" ++msgstr "Zeitgeber Einstellungen" ++ ++msgid "To change global settings click here" ++msgstr "Globale Einstellungen können sie hier ändern." ++ ++msgid "To use cURL activate this option." ++msgstr "Um cURL zu verwenden aktivieren sie diese Einstellung." ++ ++msgid "URL" ++msgstr "URL" ++ ++msgid "URL to detect" ++msgstr "URL zur Adresserkennung für" ++ ++msgid "Unknown error" ++msgstr "Unbekannter Fehler" ++ ++msgid "" ++"Update URL to be used for updating your DDNS Provider.
    Follow " ++"instructions you will find on their WEB page." ++msgstr "" ++"Update-URL um Aktualisierungen an Ihren DDNS Anbieter zu senden.
    Folgen " ++"Sie der Anleitung auf der Internet Seite des Anbieters." ++ ++msgid "Update error" ++msgstr "Aktualisierungsfehler" ++ ++msgid "Use HTTP Secure" ++msgstr "Verwende sicheres HTTP" ++ ++msgid "Use cURL" ++msgstr "Verwende cURL" ++ ++msgid "User defined script to read systems IP-Address" ++msgstr "" ++"Definiert das Skript mit dem die aktuelle IP-Adresse des System gelesen " ++"wird." ++ ++msgid "Username" ++msgstr "Benutzername" ++ ++msgid "Verify" ++msgstr "überprüfen" ++ ++msgid "Version" ++msgstr "Version" ++ ++msgid "Version Information" ++msgstr "Versionsinformationen" ++ ++msgid "Waiting for changes to be applied..." ++msgstr "Änderungen werden angewandt..." ++ ++msgid "Warning" ++msgstr "Warnung" ++ ++msgid "" ++"Writes detailed messages to log file. File will be truncated automatically." ++msgstr "" ++"Schreibt detaillierte Meldungen in die Protokolldatei. Die Datei wird " ++"automatisch gekürzt." ++ ++msgid "" ++"Writes log messages to syslog. Critical Errors will always be written to " ++"syslog." ++msgstr "" ++"Schreibt Meldungen ins Systemprotokoll. Kritische Fehler werden immer in das " ++"Systemprotokoll geschrieben." ++ ++msgid "You should install BIND host package for DNS requests." ++msgstr "" ++"Sie sollten das Programmpakete BIND host for DNS Anfragen installieren." ++ ++msgid "You should install GNU Wget with SSL (prefered) or cURL package." ++msgstr "" ++"Sie sollten das Programmpaket GNU Wget mit SSL (bevorzugt) oder cURL " ++"installieren." ++ ++msgid "You should install GNU Wget with SSL or cURL package." ++msgstr "Sie sollten das Programmpaket GNU Wget mit SSL oder cURL installieren." ++ ++msgid "You should install GNU Wget with SSL or replace libcurl." ++msgstr "" ++"Sie sollten das Programmpaket GNU Wget mit SSL installieren oder libcurl " ++"austauschen." ++ ++msgid "cURL is installed, but libcurl was compiled without proxy support." ++msgstr "" ++"cURL ist installiert, aber libcurl wurde ohne Proxy Unterstützung compiliert" ++ ++msgid "cURL without Proxy Support" ++msgstr "cURL ohne Proxy Unterstützung" ++ ++msgid "can not detect local IP. Please select a different Source combination" ++msgstr "" ++"kann lokale IP-Adresse nicht ermitteln. Bitte wählen Sie eine andere Quelle." ++ ++msgid "can not resolve host:" ++msgstr "Konnte Server nicht finden:" ++ ++msgid "config error" ++msgstr "Konfigurationsfehler" ++ ++msgid "days" ++msgstr "Tage" ++ ++msgid "directory or path/file" ++msgstr "Verzeichnis oder Pfad/zur/Datei" ++ ++msgid "either url or script could be set" ++msgstr "Weder Url noch Script ist definiert" ++ ++msgid "enable here" ++msgstr "hier aktivieren" ++ ++msgid "file or directory not found or not 'IGNORE'" ++msgstr "Datei oder Verzeichnis nicht gefunden oder nicht 'IGNORE'" ++ ++msgid "help" ++msgstr "Hilfe" ++ ++msgid "hours" ++msgstr "Stunden" ++ ++msgid "installed" ++msgstr "installiert" ++ ++msgid "invalid - Sample" ++msgstr "ungültig - Beispiel" ++ ++msgid "minimum value '0'" ++msgstr "Minimum Wert '0'" ++ ++msgid "minimum value '1'" ++msgstr "Minimum Wert '1'" ++ ++msgid "minimum value 5 minutes == 300 seconds" ++msgstr "Minimum Wert 5 Minuten == 300 Sekunden" ++ ++msgid "minutes" ++msgstr "Minuten" ++ ++msgid "missing / required" ++msgstr "fehlt / Pflichteingabe" ++ ++msgid "must be greater or equal 'Check Interval'" ++msgstr "muss größer als das Prüfintervall sein" ++ ++msgid "must start with 'http://'" ++msgstr "muss mit 'http://' beginnen" ++ ++msgid "nc (netcat) can not connect" ++msgstr "nc (netcat) kann keine Verbindung herstellen" ++ ++msgid "never" ++msgstr "nie" ++ ++msgid "no data" ++msgstr "Keine Daten" ++ ++msgid "not found or not executable - Sample: '/path/to/script.sh'" ++msgstr "" ++"Skript nicht gefunden oder nicht ausführbar. - Beispiel: 'Pfad/zum/Skript.sh'" ++ ++msgid "nslookup can not resolve host" ++msgstr "nslookup kann den Namen nicht auflösen" ++ ++msgid "or" ++msgstr "oder" ++ ++msgid "or higher" ++msgstr "oder höher" ++ ++msgid "please disable" ++msgstr "Bitte deaktivieren" ++ ++msgid "please remove entry" ++msgstr "Bitte Eintrag entfernen" ++ ++msgid "please select 'IPv4' address version" ++msgstr "Bitte 'IPv4' Adressversion auswählen" ++ ++msgid "please select 'IPv4' address version in" ++msgstr "Bitte 'IPv4' Adressversion auswählen in den" ++ ++msgid "please set to 'default'" ++msgstr "Bitte auf 'Standard' setzen" ++ ++msgid "proxy port missing" ++msgstr "Proxy-Port fehlt" ++ ++msgid "required" ++msgstr "erforderlich" ++ ++msgid "seconds" ++msgstr "Sekunden" ++ ++msgid "to run HTTPS without verification of server certificates (insecure)" ++msgstr "" ++"um HTTPS ohne Überprüfung der Server Zertifikate auszuführen (unsicher)" ++ ++msgid "unknown error" ++msgstr "Unbekannter Fehler" ++ ++msgid "unspecific error" ++msgstr "Unspezifischer Fehler" ++ ++msgid "use hostname, FQDN, IPv4- or IPv6-Address" ++msgstr "verwende Rechnername, FQDN, IPv4- oder IPv6-Adresse" +diff --git a/feeds/luci/applications/luci-app-ddns/po/el/ddns.po b/feeds/luci/applications/luci-app-ddns/po/el/ddns.po +new file mode 100644 +index 0000000..edbe19d +--- /dev/null ++++ b/feeds/luci/applications/luci-app-ddns/po/el/ddns.po +@@ -0,0 +1,704 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Report-Msgid-Bugs-To: \n" ++"POT-Creation-Date: 2010-04-02 13:44+0100\n" ++"PO-Revision-Date: 2012-03-18 17:08+0200\n" ++"Last-Translator: Vasilis \n" ++"Language-Team: LANGUAGE \n" ++"Language: el\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n != 1);\n" ++"X-Generator: Pootle 2.0.4\n" ++ ++msgid "&" ++msgstr "" ++ ++msgid "-- custom --" ++msgstr "" ++ ++msgid "-- default --" ++msgstr "" ++ ++msgid "Advanced Settings" ++msgstr "" ++ ++msgid "Allow non-public IP's" ++msgstr "" ++ ++msgid "Applying changes" ++msgstr "" ++ ++msgid "Basic Settings" ++msgstr "" ++ ++msgid "" ++"Below a list of configuration tips for your system to run Dynamic DNS " ++"updates without limitations" ++msgstr "" ++ ++msgid "" ++"Below is a list of configured DDNS configurations and their current state." ++msgstr "" ++ ++msgid "Bind Network" ++msgstr "" ++ ++msgid "Binding to a specific network not supported" ++msgstr "" ++ ++msgid "" ++"BusyBox's nslookup and Wget do not support to specify the IP version to use " ++"for communication with DDNS Provider." ++msgstr "" ++ ++msgid "" ++"BusyBox's nslookup does not support to specify to use TCP instead of default " ++"UDP when requesting DNS server" ++msgstr "" ++ ++msgid "Casual users should not change this setting" ++msgstr "" ++ ++msgid "Check Interval" ++msgstr "" ++ ++msgid "Collecting data..." ++msgstr "" ++ ++msgid "Config error" ++msgstr "" ++ ++msgid "Configuration" ++msgstr "" ++ ++msgid "" ++"Configure here the details for all Dynamic DNS services including this LuCI " ++"application." ++msgstr "" ++ ++msgid "Configure here the details for selected Dynamic DNS service." ++msgstr "" ++ ++msgid "Current setting" ++msgstr "" ++ ++msgid "" ++"Currently DDNS updates are not started at boot or on interface events.
    This is the default if you run DDNS scripts by yourself (i.e. via cron with " ++"force_interval set to '0')" ++msgstr "" ++ ++msgid "" ++"Currently DDNS updates are not started at boot or on interface events.
    You can start/stop each configuration here. It will run until next reboot." ++msgstr "" ++ ++msgid "Custom update script to be used for updating your DDNS Provider." ++msgstr "" ++ ++msgid "Custom update-URL" ++msgstr "ΠÏοσαÏμοσμένο URL-ενημέÏωσης" ++ ++msgid "Custom update-script" ++msgstr "" ++ ++msgid "DDNS Autostart disabled" ++msgstr "" ++ ++msgid "DDNS Service provider" ++msgstr "" ++ ++msgid "DNS requests via TCP not supported" ++msgstr "" ++ ++msgid "DNS-Server" ++msgstr "" ++ ++msgid "Date format" ++msgstr "" ++ ++msgid "Defines the Web page to read systems IPv4-Address from" ++msgstr "" ++ ++msgid "Defines the Web page to read systems IPv6-Address from" ++msgstr "" ++ ++msgid "Defines the interface to read systems IP-Address from" ++msgstr "" ++ ++msgid "Defines the network to read systems IPv4-Address from" ++msgstr "" ++ ++msgid "Defines the network to read systems IPv6-Address from" ++msgstr "" ++ ++msgid "" ++"Defines the source to read systems IPv4-Address from, that will be send to " ++"the DDNS provider" ++msgstr "" ++ ++msgid "" ++"Defines the source to read systems IPv6-Address from, that will be send to " ++"the DDNS provider" ++msgstr "" ++ ++msgid "Defines which IP address 'IPv4/IPv6' is send to the DDNS provider" ++msgstr "" ++ ++msgid "Details for" ++msgstr "" ++ ++msgid "Directory contains Log files for each running section" ++msgstr "" ++ ++msgid "" ++"Directory contains PID and other status information for each running section" ++msgstr "" ++ ++msgid "Disabled" ++msgstr "" ++ ++msgid "Dynamic DNS" ++msgstr "Δυναμικό DNS" ++ ++msgid "" ++"Dynamic DNS allows that your router can be reached with a fixed hostname " ++"while having a dynamically changing IP address." ++msgstr "" ++"Το Δυναμικό DNS επιτÏέπει στον δÏομολογητή σας να είναι Ï€Ïοσβάσιμος μέσω " ++"ενός σταθεÏÎ¿Ï Î¿Î½ÏŒÎ¼Î±Ï„Î¿Ï‚ υπολογιστή παÏόλο που η διεÏθυνση IP του μποÏεί να " ++"αλλάζει δυναμικά." ++ ++msgid "Enable secure communication with DDNS provider" ++msgstr "" ++ ++msgid "Enabled" ++msgstr "" ++ ++msgid "Error" ++msgstr "" ++ ++msgid "Error Retry Counter" ++msgstr "" ++ ++msgid "Error Retry Interval" ++msgstr "" ++ ++msgid "Event Network" ++msgstr "" ++ ++msgid "File" ++msgstr "" ++ ++msgid "File not found" ++msgstr "" ++ ++msgid "File not found or empty" ++msgstr "" ++ ++msgid "" ++"Follow this link
    You will find more hints to optimize your system to " ++"run DDNS scripts with all options" ++msgstr "" ++ ++msgid "For detailed information about parameter settings look here." ++msgstr "" ++ ++msgid "For supported codes look here" ++msgstr "" ++ ++msgid "Force IP Version" ++msgstr "" ++ ++msgid "Force IP Version not supported" ++msgstr "" ++ ++msgid "Force Interval" ++msgstr "" ++ ++msgid "Force TCP on DNS" ++msgstr "" ++ ++msgid "Forced IP Version don't matched" ++msgstr "" ++ ++msgid "Format" ++msgstr "" ++ ++msgid "Format: IP or FQDN" ++msgstr "" ++ ++msgid "" ++"GNU Wget will use the IP of given network, cURL will use the physical " ++"interface." ++msgstr "" ++ ++msgid "Global Settings" ++msgstr "" ++ ++msgid "HTTPS not supported" ++msgstr "" ++ ++msgid "Hints" ++msgstr "" ++ ++msgid "Hostname/Domain" ++msgstr "" ++ ++msgid "IP address source" ++msgstr "" ++ ++msgid "IP address version" ++msgstr "" ++ ++msgid "IPv4-Address" ++msgstr "" ++ ++msgid "IPv6 address must be given in square brackets" ++msgstr "" ++ ++msgid "" ++"IPv6 is currently not (fully) supported by this system
    Please follow " ++"the instructions on OpenWrt's homepage to enable IPv6 support
    or update " ++"your system to the latest OpenWrt Release" ++msgstr "" ++ ++msgid "IPv6 not supported" ++msgstr "" ++ ++msgid "IPv6-Address" ++msgstr "" ++ ++msgid "If both cURL and GNU Wget are installed, Wget is used by default." ++msgstr "" ++ ++msgid "" ++"If this service section is disabled it could not be started.
    Neither " ++"from LuCI interface nor from console" ++msgstr "" ++ ++msgid "" ++"If you want to send updates for IPv4 and IPv6 you need to define two " ++"separate Configurations i.e. 'myddns_ipv4' and 'myddns_ipv6'" ++msgstr "" ++ ++msgid "" ++"In some versions cURL/libcurl in OpenWrt is compiled without proxy support." ++msgstr "" ++ ++msgid "Info" ++msgstr "" ++ ++msgid "Interface" ++msgstr "Διεπαφή" ++ ++msgid "" ++"Interval to check for changed IP
    Values below 5 minutes == 300 seconds " ++"are not supported" ++msgstr "" ++ ++msgid "" ++"Interval to force updates send to DDNS Provider
    Setting this parameter " ++"to 0 will force the script to only run once
    Values lower 'Check " ++"Interval' except '0' are not supported" ++msgstr "" ++ ++msgid "It is NOT recommended for casual users to change settings on this page." ++msgstr "" ++ ++msgid "Last Update" ++msgstr "" ++ ++msgid "Loading" ++msgstr "" ++ ++msgid "Log File Viewer" ++msgstr "" ++ ++msgid "Log directory" ++msgstr "" ++ ++msgid "Log length" ++msgstr "" ++ ++msgid "Log to file" ++msgstr "" ++ ++msgid "Log to syslog" ++msgstr "" ++ ++msgid "" ++"Neither GNU Wget with SSL nor cURL installed to select a network to use for " ++"communication." ++msgstr "" ++ ++msgid "" ++"Neither GNU Wget with SSL nor cURL installed to support updates via HTTPS " ++"protocol." ++msgstr "" ++ ++msgid "Network" ++msgstr "Δίκτυο" ++ ++msgid "Network on which the ddns-updater scripts will be started" ++msgstr "" ++ ++msgid "Never" ++msgstr "" ++ ++msgid "Next Update" ++msgstr "" ++ ++msgid "No data" ++msgstr "" ++ ++msgid "No logging" ++msgstr "" ++ ++msgid "Non-public and by default blocked IP's" ++msgstr "" ++ ++msgid "Notice" ++msgstr "" ++ ++msgid "Number of last lines stored in log files" ++msgstr "" ++ ++msgid "OPTIONAL: Force the usage of pure IPv4/IPv6 only communication." ++msgstr "" ++ ++msgid "OPTIONAL: Force the use of TCP instead of default UDP on DNS requests." ++msgstr "" ++ ++msgid "OPTIONAL: Network to use for communication" ++msgstr "" ++ ++msgid "OPTIONAL: Proxy-Server for detection and updates." ++msgstr "" ++ ++msgid "OPTIONAL: Use non-default DNS-Server to detect 'Registered IP'." ++msgstr "" ++ ++msgid "On Error the script will retry the failed action after given time" ++msgstr "" ++ ++msgid "On Error the script will stop execution after given number of retrys" ++msgstr "" ++ ++msgid "Overview" ++msgstr "" ++ ++msgid "PROXY-Server" ++msgstr "" ++ ++msgid "PROXY-Server not supported" ++msgstr "" ++ ++msgid "Password" ++msgstr "Κωδικός Ï€Ïόσβασης" ++ ++msgid "Path to CA-Certificate" ++msgstr "" ++ ++msgid "Please [Save & Apply] your changes first" ++msgstr "" ++ ++msgid "Please press [Read] button" ++msgstr "" ++ ++msgid "Please update to the current version!" ++msgstr "" ++ ++msgid "Process ID" ++msgstr "" ++ ++msgid "Read / Reread log file" ++msgstr "" ++ ++msgid "Registered IP" ++msgstr "" ++ ++msgid "Replaces [DOMAIN] in Update-URL" ++msgstr "" ++ ++msgid "Replaces [PASSWORD] in Update-URL" ++msgstr "" ++ ++msgid "Replaces [USERNAME] in Update-URL" ++msgstr "" ++ ++msgid "Run once" ++msgstr "" ++ ++msgid "Script" ++msgstr "" ++ ++msgid "Show more" ++msgstr "" ++ ++msgid "Software update required" ++msgstr "" ++ ++msgid "Start" ++msgstr "" ++ ++msgid "Start / Stop" ++msgstr "" ++ ++msgid "Status directory" ++msgstr "" ++ ++msgid "Stopped" ++msgstr "" ++ ++msgid "" ++"The currently installed 'ddns-scripts' package did not support all available " ++"settings." ++msgstr "" ++ ++msgid "There is no service configured." ++msgstr "" ++ ++msgid "Timer Settings" ++msgstr "" ++ ++msgid "To change global settings click here" ++msgstr "" ++ ++msgid "To use cURL activate this option." ++msgstr "" ++ ++msgid "URL" ++msgstr "URL" ++ ++msgid "URL to detect" ++msgstr "" ++ ++msgid "Unknown error" ++msgstr "" ++ ++msgid "" ++"Update URL to be used for updating your DDNS Provider.
    Follow " ++"instructions you will find on their WEB page." ++msgstr "" ++ ++msgid "Update error" ++msgstr "" ++ ++msgid "Use HTTP Secure" ++msgstr "" ++ ++msgid "Use cURL" ++msgstr "" ++ ++msgid "User defined script to read systems IP-Address" ++msgstr "" ++ ++msgid "Username" ++msgstr "Όνομα χÏήστη" ++ ++msgid "Verify" ++msgstr "" ++ ++msgid "Version" ++msgstr "" ++ ++msgid "Version Information" ++msgstr "" ++ ++msgid "Waiting for changes to be applied..." ++msgstr "" ++ ++msgid "Warning" ++msgstr "" ++ ++msgid "" ++"Writes detailed messages to log file. File will be truncated automatically." ++msgstr "" ++ ++msgid "" ++"Writes log messages to syslog. Critical Errors will always be written to " ++"syslog." ++msgstr "" ++ ++msgid "You should install BIND host package for DNS requests." ++msgstr "" ++ ++msgid "You should install GNU Wget with SSL (prefered) or cURL package." ++msgstr "" ++ ++msgid "You should install GNU Wget with SSL or cURL package." ++msgstr "" ++ ++msgid "You should install GNU Wget with SSL or replace libcurl." ++msgstr "" ++ ++msgid "cURL is installed, but libcurl was compiled without proxy support." ++msgstr "" ++ ++msgid "cURL without Proxy Support" ++msgstr "" ++ ++msgid "can not detect local IP. Please select a different Source combination" ++msgstr "" ++ ++msgid "can not resolve host:" ++msgstr "" ++ ++msgid "config error" ++msgstr "" ++ ++msgid "days" ++msgstr "" ++ ++msgid "directory or path/file" ++msgstr "" ++ ++msgid "either url or script could be set" ++msgstr "" ++ ++msgid "enable here" ++msgstr "" ++ ++msgid "file or directory not found or not 'IGNORE'" ++msgstr "" ++ ++msgid "help" ++msgstr "" ++ ++msgid "hours" ++msgstr "" ++ ++msgid "installed" ++msgstr "" ++ ++msgid "invalid - Sample" ++msgstr "" ++ ++msgid "minimum value '0'" ++msgstr "" ++ ++msgid "minimum value '1'" ++msgstr "" ++ ++msgid "minimum value 5 minutes == 300 seconds" ++msgstr "" ++ ++msgid "minutes" ++msgstr "" ++ ++msgid "missing / required" ++msgstr "" ++ ++msgid "must be greater or equal 'Check Interval'" ++msgstr "" ++ ++msgid "must start with 'http://'" ++msgstr "" ++ ++msgid "nc (netcat) can not connect" ++msgstr "" ++ ++msgid "never" ++msgstr "" ++ ++msgid "no data" ++msgstr "" ++ ++msgid "not found or not executable - Sample: '/path/to/script.sh'" ++msgstr "" ++ ++msgid "nslookup can not resolve host" ++msgstr "" ++ ++msgid "or" ++msgstr "" ++ ++msgid "or higher" ++msgstr "" ++ ++msgid "please disable" ++msgstr "" ++ ++msgid "please remove entry" ++msgstr "" ++ ++msgid "please select 'IPv4' address version" ++msgstr "" ++ ++msgid "please select 'IPv4' address version in" ++msgstr "" ++ ++msgid "please set to 'default'" ++msgstr "" ++ ++msgid "proxy port missing" ++msgstr "" ++ ++msgid "required" ++msgstr "" ++ ++msgid "seconds" ++msgstr "" ++ ++msgid "to run HTTPS without verification of server certificates (insecure)" ++msgstr "" ++ ++msgid "unknown error" ++msgstr "" ++ ++msgid "unspecific error" ++msgstr "" ++ ++msgid "use hostname, FQDN, IPv4- or IPv6-Address" ++msgstr "" ++ ++#~ msgid "Check for changed IP every" ++#~ msgstr "Έλεγχος για αλλαγή IP κάθε" ++ ++#~ msgid "Check-time unit" ++#~ msgstr "Μονάδα χÏόνου ελέγχου" ++ ++#~ msgid "Enable" ++#~ msgstr "ΕνεÏγοποίηση" ++ ++#~ msgid "Force update every" ++#~ msgstr "Εξαναγκασμός ενημέÏωσης κάθε" ++ ++#, fuzzy ++#~ msgid "Force-time unit" ++#~ msgstr "Μονάδα χÏόνου εξαναγκαστικής ενημέÏωσης" ++ ++#~ msgid "Hostname" ++#~ msgstr "Όνομα υπολογιστή" ++ ++#~ msgid "Service" ++#~ msgstr "ΥπηÏεσία" ++ ++#, fuzzy ++#~ msgid "Source of IP address" ++#~ msgstr "Πηγή της διεÏθυνσης IP" ++ ++#~ msgid "custom" ++#~ msgstr "Ï€ÏοσαÏμοσμένο" ++ ++# Hours ++#~ msgid "h" ++#~ msgstr "ω" ++ ++#~ msgid "interface" ++#~ msgstr "διεπαφή" ++ ++# Minutes (not minimum) ++#~ msgid "min" ++#~ msgstr "λεπτά" ++ ++#~ msgid "network" ++#~ msgstr "δίκτυο" ++ ++#, fuzzy ++#~ msgid "ddns_service_updateurl" ++#~ msgstr "ΠÏοσαÏμογή URL ενημέÏωσης" +diff --git a/feeds/luci/applications/luci-app-ddns/po/en/ddns.po b/feeds/luci/applications/luci-app-ddns/po/en/ddns.po +new file mode 100644 +index 0000000..b706fa2 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-ddns/po/en/ddns.po +@@ -0,0 +1,702 @@ ++#, fuzzy ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Report-Msgid-Bugs-To: \n" ++"POT-Creation-Date: 2010-04-02 13:44+0100\n" ++"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" ++"Last-Translator: FULL NAME \n" ++"Language-Team: LANGUAGE \n" ++"Language: \n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++ ++msgid "&" ++msgstr "" ++ ++msgid "-- custom --" ++msgstr "" ++ ++msgid "-- default --" ++msgstr "" ++ ++msgid "Advanced Settings" ++msgstr "" ++ ++msgid "Allow non-public IP's" ++msgstr "" ++ ++msgid "Applying changes" ++msgstr "" ++ ++msgid "Basic Settings" ++msgstr "" ++ ++msgid "" ++"Below a list of configuration tips for your system to run Dynamic DNS " ++"updates without limitations" ++msgstr "" ++ ++msgid "" ++"Below is a list of configured DDNS configurations and their current state." ++msgstr "" ++ ++msgid "Bind Network" ++msgstr "" ++ ++msgid "Binding to a specific network not supported" ++msgstr "" ++ ++msgid "" ++"BusyBox's nslookup and Wget do not support to specify the IP version to use " ++"for communication with DDNS Provider." ++msgstr "" ++ ++msgid "" ++"BusyBox's nslookup does not support to specify to use TCP instead of default " ++"UDP when requesting DNS server" ++msgstr "" ++ ++msgid "Casual users should not change this setting" ++msgstr "" ++ ++msgid "Check Interval" ++msgstr "" ++ ++msgid "Collecting data..." ++msgstr "" ++ ++msgid "Config error" ++msgstr "" ++ ++msgid "Configuration" ++msgstr "" ++ ++msgid "" ++"Configure here the details for all Dynamic DNS services including this LuCI " ++"application." ++msgstr "" ++ ++msgid "Configure here the details for selected Dynamic DNS service." ++msgstr "" ++ ++msgid "Current setting" ++msgstr "" ++ ++msgid "" ++"Currently DDNS updates are not started at boot or on interface events.
    This is the default if you run DDNS scripts by yourself (i.e. via cron with " ++"force_interval set to '0')" ++msgstr "" ++ ++msgid "" ++"Currently DDNS updates are not started at boot or on interface events.
    You can start/stop each configuration here. It will run until next reboot." ++msgstr "" ++ ++msgid "Custom update script to be used for updating your DDNS Provider." ++msgstr "" ++ ++msgid "Custom update-URL" ++msgstr "Custom update-URL" ++ ++msgid "Custom update-script" ++msgstr "" ++ ++msgid "DDNS Autostart disabled" ++msgstr "" ++ ++msgid "DDNS Service provider" ++msgstr "" ++ ++msgid "DNS requests via TCP not supported" ++msgstr "" ++ ++msgid "DNS-Server" ++msgstr "" ++ ++msgid "Date format" ++msgstr "" ++ ++msgid "Defines the Web page to read systems IPv4-Address from" ++msgstr "" ++ ++msgid "Defines the Web page to read systems IPv6-Address from" ++msgstr "" ++ ++msgid "Defines the interface to read systems IP-Address from" ++msgstr "" ++ ++msgid "Defines the network to read systems IPv4-Address from" ++msgstr "" ++ ++msgid "Defines the network to read systems IPv6-Address from" ++msgstr "" ++ ++msgid "" ++"Defines the source to read systems IPv4-Address from, that will be send to " ++"the DDNS provider" ++msgstr "" ++ ++msgid "" ++"Defines the source to read systems IPv6-Address from, that will be send to " ++"the DDNS provider" ++msgstr "" ++ ++msgid "Defines which IP address 'IPv4/IPv6' is send to the DDNS provider" ++msgstr "" ++ ++msgid "Details for" ++msgstr "" ++ ++msgid "Directory contains Log files for each running section" ++msgstr "" ++ ++msgid "" ++"Directory contains PID and other status information for each running section" ++msgstr "" ++ ++msgid "Disabled" ++msgstr "" ++ ++msgid "Dynamic DNS" ++msgstr "Dynamic DNS" ++ ++msgid "" ++"Dynamic DNS allows that your router can be reached with a fixed hostname " ++"while having a dynamically changing IP address." ++msgstr "" ++"Dynamic DNS allows that your router can be reached with a fixed hostname " ++"while having a dynamically changing IP address." ++ ++msgid "Enable secure communication with DDNS provider" ++msgstr "" ++ ++msgid "Enabled" ++msgstr "" ++ ++msgid "Error" ++msgstr "" ++ ++msgid "Error Retry Counter" ++msgstr "" ++ ++msgid "Error Retry Interval" ++msgstr "" ++ ++msgid "Event Network" ++msgstr "" ++ ++msgid "File" ++msgstr "" ++ ++msgid "File not found" ++msgstr "" ++ ++msgid "File not found or empty" ++msgstr "" ++ ++msgid "" ++"Follow this link
    You will find more hints to optimize your system to " ++"run DDNS scripts with all options" ++msgstr "" ++ ++msgid "For detailed information about parameter settings look here." ++msgstr "" ++ ++msgid "For supported codes look here" ++msgstr "" ++ ++msgid "Force IP Version" ++msgstr "" ++ ++msgid "Force IP Version not supported" ++msgstr "" ++ ++msgid "Force Interval" ++msgstr "" ++ ++msgid "Force TCP on DNS" ++msgstr "" ++ ++msgid "Forced IP Version don't matched" ++msgstr "" ++ ++msgid "Format" ++msgstr "" ++ ++msgid "Format: IP or FQDN" ++msgstr "" ++ ++msgid "" ++"GNU Wget will use the IP of given network, cURL will use the physical " ++"interface." ++msgstr "" ++ ++msgid "Global Settings" ++msgstr "" ++ ++msgid "HTTPS not supported" ++msgstr "" ++ ++msgid "Hints" ++msgstr "" ++ ++msgid "Hostname/Domain" ++msgstr "" ++ ++msgid "IP address source" ++msgstr "" ++ ++msgid "IP address version" ++msgstr "" ++ ++msgid "IPv4-Address" ++msgstr "" ++ ++msgid "IPv6 address must be given in square brackets" ++msgstr "" ++ ++msgid "" ++"IPv6 is currently not (fully) supported by this system
    Please follow " ++"the instructions on OpenWrt's homepage to enable IPv6 support
    or update " ++"your system to the latest OpenWrt Release" ++msgstr "" ++ ++msgid "IPv6 not supported" ++msgstr "" ++ ++msgid "IPv6-Address" ++msgstr "" ++ ++msgid "If both cURL and GNU Wget are installed, Wget is used by default." ++msgstr "" ++ ++msgid "" ++"If this service section is disabled it could not be started.
    Neither " ++"from LuCI interface nor from console" ++msgstr "" ++ ++msgid "" ++"If you want to send updates for IPv4 and IPv6 you need to define two " ++"separate Configurations i.e. 'myddns_ipv4' and 'myddns_ipv6'" ++msgstr "" ++ ++msgid "" ++"In some versions cURL/libcurl in OpenWrt is compiled without proxy support." ++msgstr "" ++ ++msgid "Info" ++msgstr "" ++ ++msgid "Interface" ++msgstr "Interface" ++ ++msgid "" ++"Interval to check for changed IP
    Values below 5 minutes == 300 seconds " ++"are not supported" ++msgstr "" ++ ++msgid "" ++"Interval to force updates send to DDNS Provider
    Setting this parameter " ++"to 0 will force the script to only run once
    Values lower 'Check " ++"Interval' except '0' are not supported" ++msgstr "" ++ ++msgid "It is NOT recommended for casual users to change settings on this page." ++msgstr "" ++ ++msgid "Last Update" ++msgstr "" ++ ++msgid "Loading" ++msgstr "" ++ ++msgid "Log File Viewer" ++msgstr "" ++ ++msgid "Log directory" ++msgstr "" ++ ++msgid "Log length" ++msgstr "" ++ ++msgid "Log to file" ++msgstr "" ++ ++msgid "Log to syslog" ++msgstr "" ++ ++msgid "" ++"Neither GNU Wget with SSL nor cURL installed to select a network to use for " ++"communication." ++msgstr "" ++ ++msgid "" ++"Neither GNU Wget with SSL nor cURL installed to support updates via HTTPS " ++"protocol." ++msgstr "" ++ ++msgid "Network" ++msgstr "Network" ++ ++msgid "Network on which the ddns-updater scripts will be started" ++msgstr "" ++ ++msgid "Never" ++msgstr "" ++ ++msgid "Next Update" ++msgstr "" ++ ++msgid "No data" ++msgstr "" ++ ++msgid "No logging" ++msgstr "" ++ ++msgid "Non-public and by default blocked IP's" ++msgstr "" ++ ++msgid "Notice" ++msgstr "" ++ ++msgid "Number of last lines stored in log files" ++msgstr "" ++ ++msgid "OPTIONAL: Force the usage of pure IPv4/IPv6 only communication." ++msgstr "" ++ ++msgid "OPTIONAL: Force the use of TCP instead of default UDP on DNS requests." ++msgstr "" ++ ++msgid "OPTIONAL: Network to use for communication" ++msgstr "" ++ ++msgid "OPTIONAL: Proxy-Server for detection and updates." ++msgstr "" ++ ++msgid "OPTIONAL: Use non-default DNS-Server to detect 'Registered IP'." ++msgstr "" ++ ++msgid "On Error the script will retry the failed action after given time" ++msgstr "" ++ ++msgid "On Error the script will stop execution after given number of retrys" ++msgstr "" ++ ++msgid "Overview" ++msgstr "" ++ ++msgid "PROXY-Server" ++msgstr "" ++ ++msgid "PROXY-Server not supported" ++msgstr "" ++ ++msgid "Password" ++msgstr "Password" ++ ++msgid "Path to CA-Certificate" ++msgstr "" ++ ++msgid "Please [Save & Apply] your changes first" ++msgstr "" ++ ++msgid "Please press [Read] button" ++msgstr "" ++ ++msgid "Please update to the current version!" ++msgstr "" ++ ++msgid "Process ID" ++msgstr "" ++ ++msgid "Read / Reread log file" ++msgstr "" ++ ++msgid "Registered IP" ++msgstr "" ++ ++msgid "Replaces [DOMAIN] in Update-URL" ++msgstr "" ++ ++msgid "Replaces [PASSWORD] in Update-URL" ++msgstr "" ++ ++msgid "Replaces [USERNAME] in Update-URL" ++msgstr "" ++ ++msgid "Run once" ++msgstr "" ++ ++msgid "Script" ++msgstr "" ++ ++msgid "Show more" ++msgstr "" ++ ++msgid "Software update required" ++msgstr "" ++ ++msgid "Start" ++msgstr "" ++ ++msgid "Start / Stop" ++msgstr "" ++ ++msgid "Status directory" ++msgstr "" ++ ++msgid "Stopped" ++msgstr "" ++ ++msgid "" ++"The currently installed 'ddns-scripts' package did not support all available " ++"settings." ++msgstr "" ++ ++msgid "There is no service configured." ++msgstr "" ++ ++msgid "Timer Settings" ++msgstr "" ++ ++msgid "To change global settings click here" ++msgstr "" ++ ++msgid "To use cURL activate this option." ++msgstr "" ++ ++msgid "URL" ++msgstr "URL" ++ ++msgid "URL to detect" ++msgstr "" ++ ++msgid "Unknown error" ++msgstr "" ++ ++msgid "" ++"Update URL to be used for updating your DDNS Provider.
    Follow " ++"instructions you will find on their WEB page." ++msgstr "" ++ ++msgid "Update error" ++msgstr "" ++ ++msgid "Use HTTP Secure" ++msgstr "" ++ ++msgid "Use cURL" ++msgstr "" ++ ++msgid "User defined script to read systems IP-Address" ++msgstr "" ++ ++msgid "Username" ++msgstr "Username" ++ ++msgid "Verify" ++msgstr "" ++ ++msgid "Version" ++msgstr "" ++ ++msgid "Version Information" ++msgstr "" ++ ++msgid "Waiting for changes to be applied..." ++msgstr "" ++ ++msgid "Warning" ++msgstr "" ++ ++msgid "" ++"Writes detailed messages to log file. File will be truncated automatically." ++msgstr "" ++ ++msgid "" ++"Writes log messages to syslog. Critical Errors will always be written to " ++"syslog." ++msgstr "" ++ ++msgid "You should install BIND host package for DNS requests." ++msgstr "" ++ ++msgid "You should install GNU Wget with SSL (prefered) or cURL package." ++msgstr "" ++ ++msgid "You should install GNU Wget with SSL or cURL package." ++msgstr "" ++ ++msgid "You should install GNU Wget with SSL or replace libcurl." ++msgstr "" ++ ++msgid "cURL is installed, but libcurl was compiled without proxy support." ++msgstr "" ++ ++msgid "cURL without Proxy Support" ++msgstr "" ++ ++msgid "can not detect local IP. Please select a different Source combination" ++msgstr "" ++ ++msgid "can not resolve host:" ++msgstr "" ++ ++msgid "config error" ++msgstr "" ++ ++msgid "days" ++msgstr "" ++ ++msgid "directory or path/file" ++msgstr "" ++ ++msgid "either url or script could be set" ++msgstr "" ++ ++msgid "enable here" ++msgstr "" ++ ++msgid "file or directory not found or not 'IGNORE'" ++msgstr "" ++ ++msgid "help" ++msgstr "" ++ ++msgid "hours" ++msgstr "" ++ ++msgid "installed" ++msgstr "" ++ ++msgid "invalid - Sample" ++msgstr "" ++ ++msgid "minimum value '0'" ++msgstr "" ++ ++msgid "minimum value '1'" ++msgstr "" ++ ++msgid "minimum value 5 minutes == 300 seconds" ++msgstr "" ++ ++msgid "minutes" ++msgstr "" ++ ++msgid "missing / required" ++msgstr "" ++ ++msgid "must be greater or equal 'Check Interval'" ++msgstr "" ++ ++msgid "must start with 'http://'" ++msgstr "" ++ ++msgid "nc (netcat) can not connect" ++msgstr "" ++ ++msgid "never" ++msgstr "" ++ ++msgid "no data" ++msgstr "" ++ ++msgid "not found or not executable - Sample: '/path/to/script.sh'" ++msgstr "" ++ ++msgid "nslookup can not resolve host" ++msgstr "" ++ ++msgid "or" ++msgstr "" ++ ++msgid "or higher" ++msgstr "" ++ ++msgid "please disable" ++msgstr "" ++ ++msgid "please remove entry" ++msgstr "" ++ ++msgid "please select 'IPv4' address version" ++msgstr "" ++ ++msgid "please select 'IPv4' address version in" ++msgstr "" ++ ++msgid "please set to 'default'" ++msgstr "" ++ ++msgid "proxy port missing" ++msgstr "" ++ ++msgid "required" ++msgstr "" ++ ++msgid "seconds" ++msgstr "" ++ ++msgid "to run HTTPS without verification of server certificates (insecure)" ++msgstr "" ++ ++msgid "unknown error" ++msgstr "" ++ ++msgid "unspecific error" ++msgstr "" ++ ++msgid "use hostname, FQDN, IPv4- or IPv6-Address" ++msgstr "" ++ ++#~ msgid "Check for changed IP every" ++#~ msgstr "Check for changed IP every" ++ ++#~ msgid "Check-time unit" ++#~ msgstr "Check-time unit" ++ ++#~ msgid "Enable" ++#~ msgstr "Enable" ++ ++#~ msgid "Force update every" ++#~ msgstr "Force update every" ++ ++#~ msgid "Force-time unit" ++#~ msgstr "Force-time unit" ++ ++#~ msgid "Hostname" ++#~ msgstr "Hostname" ++ ++#~ msgid "Service" ++#~ msgstr "Service" ++ ++#~ msgid "Source of IP address" ++#~ msgstr "Source of IP address" ++ ++#~ msgid "custom" ++#~ msgstr "custom" ++ ++# Hours ++#~ msgid "h" ++#~ msgstr "h" ++ ++#~ msgid "interface" ++#~ msgstr "interface" ++ ++# Minutes (not minimum) ++#~ msgid "min" ++#~ msgstr "min" ++ ++#~ msgid "network" ++#~ msgstr "network" ++ ++#~ msgid "Event interface" ++#~ msgstr "Event interface" ++ ++#~ msgid "On which interface up should start the ddns script process." ++#~ msgstr "On which interface up should start the ddns script process." +diff --git a/feeds/luci/applications/luci-app-ddns/po/es/ddns.po b/feeds/luci/applications/luci-app-ddns/po/es/ddns.po +new file mode 100644 +index 0000000..1948155 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-ddns/po/es/ddns.po +@@ -0,0 +1,703 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Report-Msgid-Bugs-To: \n" ++"POT-Creation-Date: 2010-04-02 13:44+0100\n" ++"PO-Revision-Date: 2012-11-01 23:37+0200\n" ++"Last-Translator: José Vicente \n" ++"Language-Team: LANGUAGE \n" ++"Language: es\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n != 1);\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "&" ++msgstr "" ++ ++msgid "-- custom --" ++msgstr "" ++ ++msgid "-- default --" ++msgstr "" ++ ++msgid "Advanced Settings" ++msgstr "" ++ ++msgid "Allow non-public IP's" ++msgstr "" ++ ++msgid "Applying changes" ++msgstr "" ++ ++msgid "Basic Settings" ++msgstr "" ++ ++msgid "" ++"Below a list of configuration tips for your system to run Dynamic DNS " ++"updates without limitations" ++msgstr "" ++ ++msgid "" ++"Below is a list of configured DDNS configurations and their current state." ++msgstr "" ++ ++msgid "Bind Network" ++msgstr "" ++ ++msgid "Binding to a specific network not supported" ++msgstr "" ++ ++msgid "" ++"BusyBox's nslookup and Wget do not support to specify the IP version to use " ++"for communication with DDNS Provider." ++msgstr "" ++ ++msgid "" ++"BusyBox's nslookup does not support to specify to use TCP instead of default " ++"UDP when requesting DNS server" ++msgstr "" ++ ++msgid "Casual users should not change this setting" ++msgstr "" ++ ++msgid "Check Interval" ++msgstr "" ++ ++msgid "Collecting data..." ++msgstr "" ++ ++msgid "Config error" ++msgstr "" ++ ++msgid "Configuration" ++msgstr "" ++ ++msgid "" ++"Configure here the details for all Dynamic DNS services including this LuCI " ++"application." ++msgstr "" ++ ++msgid "Configure here the details for selected Dynamic DNS service." ++msgstr "" ++ ++msgid "Current setting" ++msgstr "" ++ ++msgid "" ++"Currently DDNS updates are not started at boot or on interface events.
    This is the default if you run DDNS scripts by yourself (i.e. via cron with " ++"force_interval set to '0')" ++msgstr "" ++ ++msgid "" ++"Currently DDNS updates are not started at boot or on interface events.
    You can start/stop each configuration here. It will run until next reboot." ++msgstr "" ++ ++msgid "Custom update script to be used for updating your DDNS Provider." ++msgstr "" ++ ++msgid "Custom update-URL" ++msgstr "URL de actualización personalizada" ++ ++msgid "Custom update-script" ++msgstr "" ++ ++msgid "DDNS Autostart disabled" ++msgstr "" ++ ++msgid "DDNS Service provider" ++msgstr "" ++ ++msgid "DNS requests via TCP not supported" ++msgstr "" ++ ++msgid "DNS-Server" ++msgstr "" ++ ++msgid "Date format" ++msgstr "" ++ ++msgid "Defines the Web page to read systems IPv4-Address from" ++msgstr "" ++ ++msgid "Defines the Web page to read systems IPv6-Address from" ++msgstr "" ++ ++msgid "Defines the interface to read systems IP-Address from" ++msgstr "" ++ ++msgid "Defines the network to read systems IPv4-Address from" ++msgstr "" ++ ++msgid "Defines the network to read systems IPv6-Address from" ++msgstr "" ++ ++msgid "" ++"Defines the source to read systems IPv4-Address from, that will be send to " ++"the DDNS provider" ++msgstr "" ++ ++msgid "" ++"Defines the source to read systems IPv6-Address from, that will be send to " ++"the DDNS provider" ++msgstr "" ++ ++msgid "Defines which IP address 'IPv4/IPv6' is send to the DDNS provider" ++msgstr "" ++ ++msgid "Details for" ++msgstr "" ++ ++msgid "Directory contains Log files for each running section" ++msgstr "" ++ ++msgid "" ++"Directory contains PID and other status information for each running section" ++msgstr "" ++ ++msgid "Disabled" ++msgstr "" ++ ++msgid "Dynamic DNS" ++msgstr "DNS dinámico" ++ ++msgid "" ++"Dynamic DNS allows that your router can be reached with a fixed hostname " ++"while having a dynamically changing IP address." ++msgstr "" ++"DNS Dinámico le permite conectar a su router con un nombre concreto aunque " ++"su dirección IP cambie dinámicamente." ++ ++msgid "Enable secure communication with DDNS provider" ++msgstr "" ++ ++msgid "Enabled" ++msgstr "" ++ ++msgid "Error" ++msgstr "" ++ ++msgid "Error Retry Counter" ++msgstr "" ++ ++msgid "Error Retry Interval" ++msgstr "" ++ ++msgid "Event Network" ++msgstr "" ++ ++msgid "File" ++msgstr "" ++ ++msgid "File not found" ++msgstr "" ++ ++msgid "File not found or empty" ++msgstr "" ++ ++msgid "" ++"Follow this link
    You will find more hints to optimize your system to " ++"run DDNS scripts with all options" ++msgstr "" ++ ++msgid "For detailed information about parameter settings look here." ++msgstr "" ++ ++msgid "For supported codes look here" ++msgstr "" ++ ++msgid "Force IP Version" ++msgstr "" ++ ++msgid "Force IP Version not supported" ++msgstr "" ++ ++msgid "Force Interval" ++msgstr "" ++ ++msgid "Force TCP on DNS" ++msgstr "" ++ ++msgid "Forced IP Version don't matched" ++msgstr "" ++ ++msgid "Format" ++msgstr "" ++ ++msgid "Format: IP or FQDN" ++msgstr "" ++ ++msgid "" ++"GNU Wget will use the IP of given network, cURL will use the physical " ++"interface." ++msgstr "" ++ ++msgid "Global Settings" ++msgstr "" ++ ++msgid "HTTPS not supported" ++msgstr "" ++ ++msgid "Hints" ++msgstr "" ++ ++msgid "Hostname/Domain" ++msgstr "" ++ ++msgid "IP address source" ++msgstr "" ++ ++msgid "IP address version" ++msgstr "" ++ ++msgid "IPv4-Address" ++msgstr "" ++ ++msgid "IPv6 address must be given in square brackets" ++msgstr "" ++ ++msgid "" ++"IPv6 is currently not (fully) supported by this system
    Please follow " ++"the instructions on OpenWrt's homepage to enable IPv6 support
    or update " ++"your system to the latest OpenWrt Release" ++msgstr "" ++ ++msgid "IPv6 not supported" ++msgstr "" ++ ++msgid "IPv6-Address" ++msgstr "" ++ ++msgid "If both cURL and GNU Wget are installed, Wget is used by default." ++msgstr "" ++ ++msgid "" ++"If this service section is disabled it could not be started.
    Neither " ++"from LuCI interface nor from console" ++msgstr "" ++ ++msgid "" ++"If you want to send updates for IPv4 and IPv6 you need to define two " ++"separate Configurations i.e. 'myddns_ipv4' and 'myddns_ipv6'" ++msgstr "" ++ ++msgid "" ++"In some versions cURL/libcurl in OpenWrt is compiled without proxy support." ++msgstr "" ++ ++msgid "Info" ++msgstr "" ++ ++msgid "Interface" ++msgstr "Interfaz" ++ ++msgid "" ++"Interval to check for changed IP
    Values below 5 minutes == 300 seconds " ++"are not supported" ++msgstr "" ++ ++msgid "" ++"Interval to force updates send to DDNS Provider
    Setting this parameter " ++"to 0 will force the script to only run once
    Values lower 'Check " ++"Interval' except '0' are not supported" ++msgstr "" ++ ++msgid "It is NOT recommended for casual users to change settings on this page." ++msgstr "" ++ ++msgid "Last Update" ++msgstr "" ++ ++msgid "Loading" ++msgstr "" ++ ++msgid "Log File Viewer" ++msgstr "" ++ ++msgid "Log directory" ++msgstr "" ++ ++msgid "Log length" ++msgstr "" ++ ++msgid "Log to file" ++msgstr "" ++ ++msgid "Log to syslog" ++msgstr "" ++ ++msgid "" ++"Neither GNU Wget with SSL nor cURL installed to select a network to use for " ++"communication." ++msgstr "" ++ ++msgid "" ++"Neither GNU Wget with SSL nor cURL installed to support updates via HTTPS " ++"protocol." ++msgstr "" ++ ++msgid "Network" ++msgstr "Red" ++ ++msgid "Network on which the ddns-updater scripts will be started" ++msgstr "" ++ ++msgid "Never" ++msgstr "" ++ ++msgid "Next Update" ++msgstr "" ++ ++msgid "No data" ++msgstr "" ++ ++msgid "No logging" ++msgstr "" ++ ++msgid "Non-public and by default blocked IP's" ++msgstr "" ++ ++msgid "Notice" ++msgstr "" ++ ++msgid "Number of last lines stored in log files" ++msgstr "" ++ ++msgid "OPTIONAL: Force the usage of pure IPv4/IPv6 only communication." ++msgstr "" ++ ++msgid "OPTIONAL: Force the use of TCP instead of default UDP on DNS requests." ++msgstr "" ++ ++msgid "OPTIONAL: Network to use for communication" ++msgstr "" ++ ++msgid "OPTIONAL: Proxy-Server for detection and updates." ++msgstr "" ++ ++msgid "OPTIONAL: Use non-default DNS-Server to detect 'Registered IP'." ++msgstr "" ++ ++msgid "On Error the script will retry the failed action after given time" ++msgstr "" ++ ++msgid "On Error the script will stop execution after given number of retrys" ++msgstr "" ++ ++msgid "Overview" ++msgstr "" ++ ++msgid "PROXY-Server" ++msgstr "" ++ ++msgid "PROXY-Server not supported" ++msgstr "" ++ ++msgid "Password" ++msgstr "Contraseña" ++ ++msgid "Path to CA-Certificate" ++msgstr "" ++ ++msgid "Please [Save & Apply] your changes first" ++msgstr "" ++ ++msgid "Please press [Read] button" ++msgstr "" ++ ++msgid "Please update to the current version!" ++msgstr "" ++ ++msgid "Process ID" ++msgstr "" ++ ++msgid "Read / Reread log file" ++msgstr "" ++ ++msgid "Registered IP" ++msgstr "" ++ ++msgid "Replaces [DOMAIN] in Update-URL" ++msgstr "" ++ ++msgid "Replaces [PASSWORD] in Update-URL" ++msgstr "" ++ ++msgid "Replaces [USERNAME] in Update-URL" ++msgstr "" ++ ++msgid "Run once" ++msgstr "" ++ ++msgid "Script" ++msgstr "" ++ ++msgid "Show more" ++msgstr "" ++ ++msgid "Software update required" ++msgstr "" ++ ++msgid "Start" ++msgstr "" ++ ++msgid "Start / Stop" ++msgstr "" ++ ++msgid "Status directory" ++msgstr "" ++ ++msgid "Stopped" ++msgstr "" ++ ++msgid "" ++"The currently installed 'ddns-scripts' package did not support all available " ++"settings." ++msgstr "" ++ ++msgid "There is no service configured." ++msgstr "" ++ ++msgid "Timer Settings" ++msgstr "" ++ ++msgid "To change global settings click here" ++msgstr "" ++ ++msgid "To use cURL activate this option." ++msgstr "" ++ ++msgid "URL" ++msgstr "URL" ++ ++msgid "URL to detect" ++msgstr "" ++ ++msgid "Unknown error" ++msgstr "" ++ ++msgid "" ++"Update URL to be used for updating your DDNS Provider.
    Follow " ++"instructions you will find on their WEB page." ++msgstr "" ++ ++msgid "Update error" ++msgstr "" ++ ++msgid "Use HTTP Secure" ++msgstr "" ++ ++msgid "Use cURL" ++msgstr "" ++ ++msgid "User defined script to read systems IP-Address" ++msgstr "" ++ ++msgid "Username" ++msgstr "Nombre de usuario" ++ ++msgid "Verify" ++msgstr "" ++ ++msgid "Version" ++msgstr "" ++ ++msgid "Version Information" ++msgstr "" ++ ++msgid "Waiting for changes to be applied..." ++msgstr "" ++ ++msgid "Warning" ++msgstr "" ++ ++msgid "" ++"Writes detailed messages to log file. File will be truncated automatically." ++msgstr "" ++ ++msgid "" ++"Writes log messages to syslog. Critical Errors will always be written to " ++"syslog." ++msgstr "" ++ ++msgid "You should install BIND host package for DNS requests." ++msgstr "" ++ ++msgid "You should install GNU Wget with SSL (prefered) or cURL package." ++msgstr "" ++ ++msgid "You should install GNU Wget with SSL or cURL package." ++msgstr "" ++ ++msgid "You should install GNU Wget with SSL or replace libcurl." ++msgstr "" ++ ++msgid "cURL is installed, but libcurl was compiled without proxy support." ++msgstr "" ++ ++msgid "cURL without Proxy Support" ++msgstr "" ++ ++msgid "can not detect local IP. Please select a different Source combination" ++msgstr "" ++ ++msgid "can not resolve host:" ++msgstr "" ++ ++msgid "config error" ++msgstr "" ++ ++msgid "days" ++msgstr "" ++ ++msgid "directory or path/file" ++msgstr "" ++ ++msgid "either url or script could be set" ++msgstr "" ++ ++msgid "enable here" ++msgstr "" ++ ++msgid "file or directory not found or not 'IGNORE'" ++msgstr "" ++ ++msgid "help" ++msgstr "" ++ ++msgid "hours" ++msgstr "" ++ ++msgid "installed" ++msgstr "" ++ ++msgid "invalid - Sample" ++msgstr "" ++ ++msgid "minimum value '0'" ++msgstr "" ++ ++msgid "minimum value '1'" ++msgstr "" ++ ++msgid "minimum value 5 minutes == 300 seconds" ++msgstr "" ++ ++msgid "minutes" ++msgstr "" ++ ++msgid "missing / required" ++msgstr "" ++ ++msgid "must be greater or equal 'Check Interval'" ++msgstr "" ++ ++msgid "must start with 'http://'" ++msgstr "" ++ ++msgid "nc (netcat) can not connect" ++msgstr "" ++ ++msgid "never" ++msgstr "" ++ ++msgid "no data" ++msgstr "" ++ ++msgid "not found or not executable - Sample: '/path/to/script.sh'" ++msgstr "" ++ ++msgid "nslookup can not resolve host" ++msgstr "" ++ ++msgid "or" ++msgstr "" ++ ++msgid "or higher" ++msgstr "" ++ ++msgid "please disable" ++msgstr "" ++ ++msgid "please remove entry" ++msgstr "" ++ ++msgid "please select 'IPv4' address version" ++msgstr "" ++ ++msgid "please select 'IPv4' address version in" ++msgstr "" ++ ++msgid "please set to 'default'" ++msgstr "" ++ ++msgid "proxy port missing" ++msgstr "" ++ ++msgid "required" ++msgstr "" ++ ++msgid "seconds" ++msgstr "" ++ ++msgid "to run HTTPS without verification of server certificates (insecure)" ++msgstr "" ++ ++msgid "unknown error" ++msgstr "" ++ ++msgid "unspecific error" ++msgstr "" ++ ++msgid "use hostname, FQDN, IPv4- or IPv6-Address" ++msgstr "" ++ ++#~ msgid "Check for changed IP every" ++#~ msgstr "Verificar cambios de IP cada" ++ ++#~ msgid "Check-time unit" ++#~ msgstr "Unidad de tiempo" ++ ++#~ msgid "Enable" ++#~ msgstr "Activar" ++ ++#~ msgid "Force update every" ++#~ msgstr "Forzar actualización cada" ++ ++#~ msgid "Force-time unit" ++#~ msgstr "Unidad de tiempo" ++ ++#~ msgid "Hostname" ++#~ msgstr "Nombre de máquina" ++ ++#~ msgid "Service" ++#~ msgstr "Servicio" ++ ++#~ msgid "Source of IP address" ++#~ msgstr "Dirección IP de origen" ++ ++#~ msgid "custom" ++#~ msgstr "personalizado" ++ ++# Hours ++#~ msgid "h" ++#~ msgstr "h" ++ ++#~ msgid "interface" ++#~ msgstr "interfaz" ++ ++# Minutes (not minimum) ++#~ msgid "min" ++#~ msgstr "min" ++ ++#~ msgid "network" ++#~ msgstr "red" ++ ++#~ msgid "Event interface" ++#~ msgstr "Interfaz de eventos" ++ ++#~ msgid "On which interface up should start the ddns script process." ++#~ msgstr "Tras qué interfaz debe arrancar ddns." +diff --git a/feeds/luci/applications/luci-app-ddns/po/fr/ddns.po b/feeds/luci/applications/luci-app-ddns/po/fr/ddns.po +new file mode 100644 +index 0000000..94b61b6 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-ddns/po/fr/ddns.po +@@ -0,0 +1,703 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Report-Msgid-Bugs-To: \n" ++"POT-Creation-Date: 2010-04-02 13:44+0100\n" ++"PO-Revision-Date: 2012-11-06 13:19+0200\n" ++"Last-Translator: hogsim \n" ++"Language-Team: LANGUAGE \n" ++"Language: fr\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n > 1);\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "&" ++msgstr "" ++ ++msgid "-- custom --" ++msgstr "" ++ ++msgid "-- default --" ++msgstr "" ++ ++msgid "Advanced Settings" ++msgstr "" ++ ++msgid "Allow non-public IP's" ++msgstr "" ++ ++msgid "Applying changes" ++msgstr "" ++ ++msgid "Basic Settings" ++msgstr "" ++ ++msgid "" ++"Below a list of configuration tips for your system to run Dynamic DNS " ++"updates without limitations" ++msgstr "" ++ ++msgid "" ++"Below is a list of configured DDNS configurations and their current state." ++msgstr "" ++ ++msgid "Bind Network" ++msgstr "" ++ ++msgid "Binding to a specific network not supported" ++msgstr "" ++ ++msgid "" ++"BusyBox's nslookup and Wget do not support to specify the IP version to use " ++"for communication with DDNS Provider." ++msgstr "" ++ ++msgid "" ++"BusyBox's nslookup does not support to specify to use TCP instead of default " ++"UDP when requesting DNS server" ++msgstr "" ++ ++msgid "Casual users should not change this setting" ++msgstr "" ++ ++msgid "Check Interval" ++msgstr "" ++ ++msgid "Collecting data..." ++msgstr "" ++ ++msgid "Config error" ++msgstr "" ++ ++msgid "Configuration" ++msgstr "" ++ ++msgid "" ++"Configure here the details for all Dynamic DNS services including this LuCI " ++"application." ++msgstr "" ++ ++msgid "Configure here the details for selected Dynamic DNS service." ++msgstr "" ++ ++msgid "Current setting" ++msgstr "" ++ ++msgid "" ++"Currently DDNS updates are not started at boot or on interface events.
    This is the default if you run DDNS scripts by yourself (i.e. via cron with " ++"force_interval set to '0')" ++msgstr "" ++ ++msgid "" ++"Currently DDNS updates are not started at boot or on interface events.
    You can start/stop each configuration here. It will run until next reboot." ++msgstr "" ++ ++msgid "Custom update script to be used for updating your DDNS Provider." ++msgstr "" ++ ++msgid "Custom update-URL" ++msgstr "URL de mise à jour personnalisée" ++ ++msgid "Custom update-script" ++msgstr "" ++ ++msgid "DDNS Autostart disabled" ++msgstr "" ++ ++msgid "DDNS Service provider" ++msgstr "" ++ ++msgid "DNS requests via TCP not supported" ++msgstr "" ++ ++msgid "DNS-Server" ++msgstr "" ++ ++msgid "Date format" ++msgstr "" ++ ++msgid "Defines the Web page to read systems IPv4-Address from" ++msgstr "" ++ ++msgid "Defines the Web page to read systems IPv6-Address from" ++msgstr "" ++ ++msgid "Defines the interface to read systems IP-Address from" ++msgstr "" ++ ++msgid "Defines the network to read systems IPv4-Address from" ++msgstr "" ++ ++msgid "Defines the network to read systems IPv6-Address from" ++msgstr "" ++ ++msgid "" ++"Defines the source to read systems IPv4-Address from, that will be send to " ++"the DDNS provider" ++msgstr "" ++ ++msgid "" ++"Defines the source to read systems IPv6-Address from, that will be send to " ++"the DDNS provider" ++msgstr "" ++ ++msgid "Defines which IP address 'IPv4/IPv6' is send to the DDNS provider" ++msgstr "" ++ ++msgid "Details for" ++msgstr "" ++ ++msgid "Directory contains Log files for each running section" ++msgstr "" ++ ++msgid "" ++"Directory contains PID and other status information for each running section" ++msgstr "" ++ ++msgid "Disabled" ++msgstr "" ++ ++msgid "Dynamic DNS" ++msgstr "DNS Dynamique" ++ ++msgid "" ++"Dynamic DNS allows that your router can be reached with a fixed hostname " ++"while having a dynamically changing IP address." ++msgstr "" ++"Le DNS Dynamique permet au routeur d'être joint avec un nom d'hôte fixe bien " ++"que changeant dynamiquement d'adresse IP." ++ ++msgid "Enable secure communication with DDNS provider" ++msgstr "" ++ ++msgid "Enabled" ++msgstr "" ++ ++msgid "Error" ++msgstr "" ++ ++msgid "Error Retry Counter" ++msgstr "" ++ ++msgid "Error Retry Interval" ++msgstr "" ++ ++msgid "Event Network" ++msgstr "" ++ ++msgid "File" ++msgstr "" ++ ++msgid "File not found" ++msgstr "" ++ ++msgid "File not found or empty" ++msgstr "" ++ ++msgid "" ++"Follow this link
    You will find more hints to optimize your system to " ++"run DDNS scripts with all options" ++msgstr "" ++ ++msgid "For detailed information about parameter settings look here." ++msgstr "" ++ ++msgid "For supported codes look here" ++msgstr "" ++ ++msgid "Force IP Version" ++msgstr "" ++ ++msgid "Force IP Version not supported" ++msgstr "" ++ ++msgid "Force Interval" ++msgstr "" ++ ++msgid "Force TCP on DNS" ++msgstr "" ++ ++msgid "Forced IP Version don't matched" ++msgstr "" ++ ++msgid "Format" ++msgstr "" ++ ++msgid "Format: IP or FQDN" ++msgstr "" ++ ++msgid "" ++"GNU Wget will use the IP of given network, cURL will use the physical " ++"interface." ++msgstr "" ++ ++msgid "Global Settings" ++msgstr "" ++ ++msgid "HTTPS not supported" ++msgstr "" ++ ++msgid "Hints" ++msgstr "" ++ ++msgid "Hostname/Domain" ++msgstr "" ++ ++msgid "IP address source" ++msgstr "" ++ ++msgid "IP address version" ++msgstr "" ++ ++msgid "IPv4-Address" ++msgstr "" ++ ++msgid "IPv6 address must be given in square brackets" ++msgstr "" ++ ++msgid "" ++"IPv6 is currently not (fully) supported by this system
    Please follow " ++"the instructions on OpenWrt's homepage to enable IPv6 support
    or update " ++"your system to the latest OpenWrt Release" ++msgstr "" ++ ++msgid "IPv6 not supported" ++msgstr "" ++ ++msgid "IPv6-Address" ++msgstr "" ++ ++msgid "If both cURL and GNU Wget are installed, Wget is used by default." ++msgstr "" ++ ++msgid "" ++"If this service section is disabled it could not be started.
    Neither " ++"from LuCI interface nor from console" ++msgstr "" ++ ++msgid "" ++"If you want to send updates for IPv4 and IPv6 you need to define two " ++"separate Configurations i.e. 'myddns_ipv4' and 'myddns_ipv6'" ++msgstr "" ++ ++msgid "" ++"In some versions cURL/libcurl in OpenWrt is compiled without proxy support." ++msgstr "" ++ ++msgid "Info" ++msgstr "" ++ ++msgid "Interface" ++msgstr "Interface" ++ ++msgid "" ++"Interval to check for changed IP
    Values below 5 minutes == 300 seconds " ++"are not supported" ++msgstr "" ++ ++msgid "" ++"Interval to force updates send to DDNS Provider
    Setting this parameter " ++"to 0 will force the script to only run once
    Values lower 'Check " ++"Interval' except '0' are not supported" ++msgstr "" ++ ++msgid "It is NOT recommended for casual users to change settings on this page." ++msgstr "" ++ ++msgid "Last Update" ++msgstr "" ++ ++msgid "Loading" ++msgstr "" ++ ++msgid "Log File Viewer" ++msgstr "" ++ ++msgid "Log directory" ++msgstr "" ++ ++msgid "Log length" ++msgstr "" ++ ++msgid "Log to file" ++msgstr "" ++ ++msgid "Log to syslog" ++msgstr "" ++ ++msgid "" ++"Neither GNU Wget with SSL nor cURL installed to select a network to use for " ++"communication." ++msgstr "" ++ ++msgid "" ++"Neither GNU Wget with SSL nor cURL installed to support updates via HTTPS " ++"protocol." ++msgstr "" ++ ++msgid "Network" ++msgstr "Réseau" ++ ++msgid "Network on which the ddns-updater scripts will be started" ++msgstr "" ++ ++msgid "Never" ++msgstr "" ++ ++msgid "Next Update" ++msgstr "" ++ ++msgid "No data" ++msgstr "" ++ ++msgid "No logging" ++msgstr "" ++ ++msgid "Non-public and by default blocked IP's" ++msgstr "" ++ ++msgid "Notice" ++msgstr "" ++ ++msgid "Number of last lines stored in log files" ++msgstr "" ++ ++msgid "OPTIONAL: Force the usage of pure IPv4/IPv6 only communication." ++msgstr "" ++ ++msgid "OPTIONAL: Force the use of TCP instead of default UDP on DNS requests." ++msgstr "" ++ ++msgid "OPTIONAL: Network to use for communication" ++msgstr "" ++ ++msgid "OPTIONAL: Proxy-Server for detection and updates." ++msgstr "" ++ ++msgid "OPTIONAL: Use non-default DNS-Server to detect 'Registered IP'." ++msgstr "" ++ ++msgid "On Error the script will retry the failed action after given time" ++msgstr "" ++ ++msgid "On Error the script will stop execution after given number of retrys" ++msgstr "" ++ ++msgid "Overview" ++msgstr "" ++ ++msgid "PROXY-Server" ++msgstr "" ++ ++msgid "PROXY-Server not supported" ++msgstr "" ++ ++msgid "Password" ++msgstr "Mot de passe" ++ ++msgid "Path to CA-Certificate" ++msgstr "" ++ ++msgid "Please [Save & Apply] your changes first" ++msgstr "" ++ ++msgid "Please press [Read] button" ++msgstr "" ++ ++msgid "Please update to the current version!" ++msgstr "" ++ ++msgid "Process ID" ++msgstr "" ++ ++msgid "Read / Reread log file" ++msgstr "" ++ ++msgid "Registered IP" ++msgstr "" ++ ++msgid "Replaces [DOMAIN] in Update-URL" ++msgstr "" ++ ++msgid "Replaces [PASSWORD] in Update-URL" ++msgstr "" ++ ++msgid "Replaces [USERNAME] in Update-URL" ++msgstr "" ++ ++msgid "Run once" ++msgstr "" ++ ++msgid "Script" ++msgstr "" ++ ++msgid "Show more" ++msgstr "" ++ ++msgid "Software update required" ++msgstr "" ++ ++msgid "Start" ++msgstr "" ++ ++msgid "Start / Stop" ++msgstr "" ++ ++msgid "Status directory" ++msgstr "" ++ ++msgid "Stopped" ++msgstr "" ++ ++msgid "" ++"The currently installed 'ddns-scripts' package did not support all available " ++"settings." ++msgstr "" ++ ++msgid "There is no service configured." ++msgstr "" ++ ++msgid "Timer Settings" ++msgstr "" ++ ++msgid "To change global settings click here" ++msgstr "" ++ ++msgid "To use cURL activate this option." ++msgstr "" ++ ++msgid "URL" ++msgstr "URL" ++ ++msgid "URL to detect" ++msgstr "" ++ ++msgid "Unknown error" ++msgstr "" ++ ++msgid "" ++"Update URL to be used for updating your DDNS Provider.
    Follow " ++"instructions you will find on their WEB page." ++msgstr "" ++ ++msgid "Update error" ++msgstr "" ++ ++msgid "Use HTTP Secure" ++msgstr "" ++ ++msgid "Use cURL" ++msgstr "" ++ ++msgid "User defined script to read systems IP-Address" ++msgstr "" ++ ++msgid "Username" ++msgstr "Nom d'utilisateur" ++ ++msgid "Verify" ++msgstr "" ++ ++msgid "Version" ++msgstr "" ++ ++msgid "Version Information" ++msgstr "" ++ ++msgid "Waiting for changes to be applied..." ++msgstr "" ++ ++msgid "Warning" ++msgstr "" ++ ++msgid "" ++"Writes detailed messages to log file. File will be truncated automatically." ++msgstr "" ++ ++msgid "" ++"Writes log messages to syslog. Critical Errors will always be written to " ++"syslog." ++msgstr "" ++ ++msgid "You should install BIND host package for DNS requests." ++msgstr "" ++ ++msgid "You should install GNU Wget with SSL (prefered) or cURL package." ++msgstr "" ++ ++msgid "You should install GNU Wget with SSL or cURL package." ++msgstr "" ++ ++msgid "You should install GNU Wget with SSL or replace libcurl." ++msgstr "" ++ ++msgid "cURL is installed, but libcurl was compiled without proxy support." ++msgstr "" ++ ++msgid "cURL without Proxy Support" ++msgstr "" ++ ++msgid "can not detect local IP. Please select a different Source combination" ++msgstr "" ++ ++msgid "can not resolve host:" ++msgstr "" ++ ++msgid "config error" ++msgstr "" ++ ++msgid "days" ++msgstr "" ++ ++msgid "directory or path/file" ++msgstr "" ++ ++msgid "either url or script could be set" ++msgstr "" ++ ++msgid "enable here" ++msgstr "" ++ ++msgid "file or directory not found or not 'IGNORE'" ++msgstr "" ++ ++msgid "help" ++msgstr "" ++ ++msgid "hours" ++msgstr "" ++ ++msgid "installed" ++msgstr "" ++ ++msgid "invalid - Sample" ++msgstr "" ++ ++msgid "minimum value '0'" ++msgstr "" ++ ++msgid "minimum value '1'" ++msgstr "" ++ ++msgid "minimum value 5 minutes == 300 seconds" ++msgstr "" ++ ++msgid "minutes" ++msgstr "" ++ ++msgid "missing / required" ++msgstr "" ++ ++msgid "must be greater or equal 'Check Interval'" ++msgstr "" ++ ++msgid "must start with 'http://'" ++msgstr "" ++ ++msgid "nc (netcat) can not connect" ++msgstr "" ++ ++msgid "never" ++msgstr "" ++ ++msgid "no data" ++msgstr "" ++ ++msgid "not found or not executable - Sample: '/path/to/script.sh'" ++msgstr "" ++ ++msgid "nslookup can not resolve host" ++msgstr "" ++ ++msgid "or" ++msgstr "" ++ ++msgid "or higher" ++msgstr "" ++ ++msgid "please disable" ++msgstr "" ++ ++msgid "please remove entry" ++msgstr "" ++ ++msgid "please select 'IPv4' address version" ++msgstr "" ++ ++msgid "please select 'IPv4' address version in" ++msgstr "" ++ ++msgid "please set to 'default'" ++msgstr "" ++ ++msgid "proxy port missing" ++msgstr "" ++ ++msgid "required" ++msgstr "" ++ ++msgid "seconds" ++msgstr "" ++ ++msgid "to run HTTPS without verification of server certificates (insecure)" ++msgstr "" ++ ++msgid "unknown error" ++msgstr "" ++ ++msgid "unspecific error" ++msgstr "" ++ ++msgid "use hostname, FQDN, IPv4- or IPv6-Address" ++msgstr "" ++ ++#~ msgid "Check for changed IP every" ++#~ msgstr "Vérifier si l'adresse IP a changé toutes les" ++ ++#~ msgid "Check-time unit" ++#~ msgstr "Unité de temps pour la vérification" ++ ++#~ msgid "Enable" ++#~ msgstr "Activer" ++ ++#~ msgid "Force update every" ++#~ msgstr "Vérification forcée toutes les" ++ ++#~ msgid "Force-time unit" ++#~ msgstr "Unité de temps pour la vérification forcée" ++ ++#~ msgid "Hostname" ++#~ msgstr "Nom d'hôte" ++ ++#~ msgid "Service" ++#~ msgstr "Service" ++ ++#~ msgid "Source of IP address" ++#~ msgstr "Source de l'adresse IP" ++ ++#~ msgid "custom" ++#~ msgstr "personnalisé" ++ ++# Hours ++#~ msgid "h" ++#~ msgstr "h" ++ ++#~ msgid "interface" ++#~ msgstr "interface" ++ ++# Minutes (not minimum) ++#~ msgid "min" ++#~ msgstr "min" ++ ++#~ msgid "network" ++#~ msgstr "réseau" ++ ++#~ msgid "Event interface" ++#~ msgstr "Événement sur l'interface" ++ ++#~ msgid "On which interface up should start the ddns script process." ++#~ msgstr "Sur quelle interface devrait démarrer le processus du script ddns." +diff --git a/feeds/luci/applications/luci-app-ddns/po/he/ddns.po b/feeds/luci/applications/luci-app-ddns/po/he/ddns.po +new file mode 100644 +index 0000000..a6d2030 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-ddns/po/he/ddns.po +@@ -0,0 +1,698 @@ ++# Generated from applications/luci-ddns/luasrc/model/cbi/ddns/ddns.lua ++# ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Report-Msgid-Bugs-To: \n" ++"POT-Creation-Date: 2010-04-02 13:44+0100\n" ++"PO-Revision-Date: 2012-09-10 04:26+0200\n" ++"Last-Translator: Snoof \n" ++"Language-Team: none\n" ++"Language: he\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n != 1);\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "&" ++msgstr "" ++ ++msgid "-- custom --" ++msgstr "" ++ ++msgid "-- default --" ++msgstr "" ++ ++msgid "Advanced Settings" ++msgstr "" ++ ++msgid "Allow non-public IP's" ++msgstr "" ++ ++msgid "Applying changes" ++msgstr "" ++ ++msgid "Basic Settings" ++msgstr "" ++ ++msgid "" ++"Below a list of configuration tips for your system to run Dynamic DNS " ++"updates without limitations" ++msgstr "" ++ ++msgid "" ++"Below is a list of configured DDNS configurations and their current state." ++msgstr "" ++ ++msgid "Bind Network" ++msgstr "" ++ ++msgid "Binding to a specific network not supported" ++msgstr "" ++ ++msgid "" ++"BusyBox's nslookup and Wget do not support to specify the IP version to use " ++"for communication with DDNS Provider." ++msgstr "" ++ ++msgid "" ++"BusyBox's nslookup does not support to specify to use TCP instead of default " ++"UDP when requesting DNS server" ++msgstr "" ++ ++msgid "Casual users should not change this setting" ++msgstr "" ++ ++msgid "Check Interval" ++msgstr "" ++ ++msgid "Collecting data..." ++msgstr "" ++ ++msgid "Config error" ++msgstr "" ++ ++msgid "Configuration" ++msgstr "" ++ ++msgid "" ++"Configure here the details for all Dynamic DNS services including this LuCI " ++"application." ++msgstr "" ++ ++msgid "Configure here the details for selected Dynamic DNS service." ++msgstr "" ++ ++msgid "Current setting" ++msgstr "" ++ ++msgid "" ++"Currently DDNS updates are not started at boot or on interface events.
    This is the default if you run DDNS scripts by yourself (i.e. via cron with " ++"force_interval set to '0')" ++msgstr "" ++ ++msgid "" ++"Currently DDNS updates are not started at boot or on interface events.
    You can start/stop each configuration here. It will run until next reboot." ++msgstr "" ++ ++msgid "Custom update script to be used for updating your DDNS Provider." ++msgstr "" ++ ++#, fuzzy ++msgid "Custom update-URL" ++msgstr "עדכן URL ב×ופן ידני" ++ ++msgid "Custom update-script" ++msgstr "" ++ ++msgid "DDNS Autostart disabled" ++msgstr "" ++ ++msgid "DDNS Service provider" ++msgstr "" ++ ++msgid "DNS requests via TCP not supported" ++msgstr "" ++ ++msgid "DNS-Server" ++msgstr "" ++ ++msgid "Date format" ++msgstr "" ++ ++msgid "Defines the Web page to read systems IPv4-Address from" ++msgstr "" ++ ++msgid "Defines the Web page to read systems IPv6-Address from" ++msgstr "" ++ ++msgid "Defines the interface to read systems IP-Address from" ++msgstr "" ++ ++msgid "Defines the network to read systems IPv4-Address from" ++msgstr "" ++ ++msgid "Defines the network to read systems IPv6-Address from" ++msgstr "" ++ ++msgid "" ++"Defines the source to read systems IPv4-Address from, that will be send to " ++"the DDNS provider" ++msgstr "" ++ ++msgid "" ++"Defines the source to read systems IPv6-Address from, that will be send to " ++"the DDNS provider" ++msgstr "" ++ ++msgid "Defines which IP address 'IPv4/IPv6' is send to the DDNS provider" ++msgstr "" ++ ++msgid "Details for" ++msgstr "" ++ ++msgid "Directory contains Log files for each running section" ++msgstr "" ++ ++msgid "" ++"Directory contains PID and other status information for each running section" ++msgstr "" ++ ++msgid "Disabled" ++msgstr "" ++ ++msgid "Dynamic DNS" ++msgstr "DNS דינ×מי" ++ ++msgid "" ++"Dynamic DNS allows that your router can be reached with a fixed hostname " ++"while having a dynamically changing IP address." ++msgstr "" ++"שירות DDNS מ×פשר גישה לנתב שלך ×¢\"×™ ×©× ×“×•×ž×™×™×Ÿ קבוע, בעוד כתובת ×”- IP שלך " ++"משתנה ב×ופן דינמי." ++ ++msgid "Enable secure communication with DDNS provider" ++msgstr "" ++ ++msgid "Enabled" ++msgstr "" ++ ++msgid "Error" ++msgstr "" ++ ++msgid "Error Retry Counter" ++msgstr "" ++ ++msgid "Error Retry Interval" ++msgstr "" ++ ++msgid "Event Network" ++msgstr "" ++ ++msgid "File" ++msgstr "" ++ ++msgid "File not found" ++msgstr "" ++ ++msgid "File not found or empty" ++msgstr "" ++ ++msgid "" ++"Follow this link
    You will find more hints to optimize your system to " ++"run DDNS scripts with all options" ++msgstr "" ++ ++msgid "For detailed information about parameter settings look here." ++msgstr "" ++ ++msgid "For supported codes look here" ++msgstr "" ++ ++msgid "Force IP Version" ++msgstr "" ++ ++msgid "Force IP Version not supported" ++msgstr "" ++ ++msgid "Force Interval" ++msgstr "" ++ ++msgid "Force TCP on DNS" ++msgstr "" ++ ++msgid "Forced IP Version don't matched" ++msgstr "" ++ ++msgid "Format" ++msgstr "" ++ ++msgid "Format: IP or FQDN" ++msgstr "" ++ ++msgid "" ++"GNU Wget will use the IP of given network, cURL will use the physical " ++"interface." ++msgstr "" ++ ++msgid "Global Settings" ++msgstr "" ++ ++msgid "HTTPS not supported" ++msgstr "" ++ ++msgid "Hints" ++msgstr "" ++ ++msgid "Hostname/Domain" ++msgstr "" ++ ++msgid "IP address source" ++msgstr "" ++ ++msgid "IP address version" ++msgstr "" ++ ++msgid "IPv4-Address" ++msgstr "" ++ ++msgid "IPv6 address must be given in square brackets" ++msgstr "" ++ ++msgid "" ++"IPv6 is currently not (fully) supported by this system
    Please follow " ++"the instructions on OpenWrt's homepage to enable IPv6 support
    or update " ++"your system to the latest OpenWrt Release" ++msgstr "" ++ ++msgid "IPv6 not supported" ++msgstr "" ++ ++msgid "IPv6-Address" ++msgstr "" ++ ++msgid "If both cURL and GNU Wget are installed, Wget is used by default." ++msgstr "" ++ ++msgid "" ++"If this service section is disabled it could not be started.
    Neither " ++"from LuCI interface nor from console" ++msgstr "" ++ ++msgid "" ++"If you want to send updates for IPv4 and IPv6 you need to define two " ++"separate Configurations i.e. 'myddns_ipv4' and 'myddns_ipv6'" ++msgstr "" ++ ++msgid "" ++"In some versions cURL/libcurl in OpenWrt is compiled without proxy support." ++msgstr "" ++ ++msgid "Info" ++msgstr "" ++ ++msgid "Interface" ++msgstr "ממשק" ++ ++msgid "" ++"Interval to check for changed IP
    Values below 5 minutes == 300 seconds " ++"are not supported" ++msgstr "" ++ ++msgid "" ++"Interval to force updates send to DDNS Provider
    Setting this parameter " ++"to 0 will force the script to only run once
    Values lower 'Check " ++"Interval' except '0' are not supported" ++msgstr "" ++ ++msgid "It is NOT recommended for casual users to change settings on this page." ++msgstr "" ++ ++msgid "Last Update" ++msgstr "" ++ ++msgid "Loading" ++msgstr "" ++ ++msgid "Log File Viewer" ++msgstr "" ++ ++msgid "Log directory" ++msgstr "" ++ ++msgid "Log length" ++msgstr "" ++ ++msgid "Log to file" ++msgstr "" ++ ++msgid "Log to syslog" ++msgstr "" ++ ++msgid "" ++"Neither GNU Wget with SSL nor cURL installed to select a network to use for " ++"communication." ++msgstr "" ++ ++msgid "" ++"Neither GNU Wget with SSL nor cURL installed to support updates via HTTPS " ++"protocol." ++msgstr "" ++ ++msgid "Network" ++msgstr "רשת" ++ ++msgid "Network on which the ddns-updater scripts will be started" ++msgstr "" ++ ++msgid "Never" ++msgstr "" ++ ++msgid "Next Update" ++msgstr "" ++ ++msgid "No data" ++msgstr "" ++ ++msgid "No logging" ++msgstr "" ++ ++msgid "Non-public and by default blocked IP's" ++msgstr "" ++ ++msgid "Notice" ++msgstr "" ++ ++msgid "Number of last lines stored in log files" ++msgstr "" ++ ++msgid "OPTIONAL: Force the usage of pure IPv4/IPv6 only communication." ++msgstr "" ++ ++msgid "OPTIONAL: Force the use of TCP instead of default UDP on DNS requests." ++msgstr "" ++ ++msgid "OPTIONAL: Network to use for communication" ++msgstr "" ++ ++msgid "OPTIONAL: Proxy-Server for detection and updates." ++msgstr "" ++ ++msgid "OPTIONAL: Use non-default DNS-Server to detect 'Registered IP'." ++msgstr "" ++ ++msgid "On Error the script will retry the failed action after given time" ++msgstr "" ++ ++msgid "On Error the script will stop execution after given number of retrys" ++msgstr "" ++ ++msgid "Overview" ++msgstr "" ++ ++msgid "PROXY-Server" ++msgstr "" ++ ++msgid "PROXY-Server not supported" ++msgstr "" ++ ++msgid "Password" ++msgstr "סיסמ×" ++ ++msgid "Path to CA-Certificate" ++msgstr "" ++ ++msgid "Please [Save & Apply] your changes first" ++msgstr "" ++ ++msgid "Please press [Read] button" ++msgstr "" ++ ++msgid "Please update to the current version!" ++msgstr "" ++ ++msgid "Process ID" ++msgstr "" ++ ++msgid "Read / Reread log file" ++msgstr "" ++ ++msgid "Registered IP" ++msgstr "" ++ ++msgid "Replaces [DOMAIN] in Update-URL" ++msgstr "" ++ ++msgid "Replaces [PASSWORD] in Update-URL" ++msgstr "" ++ ++msgid "Replaces [USERNAME] in Update-URL" ++msgstr "" ++ ++msgid "Run once" ++msgstr "" ++ ++msgid "Script" ++msgstr "" ++ ++msgid "Show more" ++msgstr "" ++ ++msgid "Software update required" ++msgstr "" ++ ++msgid "Start" ++msgstr "" ++ ++msgid "Start / Stop" ++msgstr "" ++ ++msgid "Status directory" ++msgstr "" ++ ++msgid "Stopped" ++msgstr "" ++ ++msgid "" ++"The currently installed 'ddns-scripts' package did not support all available " ++"settings." ++msgstr "" ++ ++msgid "There is no service configured." ++msgstr "" ++ ++msgid "Timer Settings" ++msgstr "" ++ ++msgid "To change global settings click here" ++msgstr "" ++ ++msgid "To use cURL activate this option." ++msgstr "" ++ ++msgid "URL" ++msgstr "URL" ++ ++msgid "URL to detect" ++msgstr "" ++ ++msgid "Unknown error" ++msgstr "" ++ ++msgid "" ++"Update URL to be used for updating your DDNS Provider.
    Follow " ++"instructions you will find on their WEB page." ++msgstr "" ++ ++msgid "Update error" ++msgstr "" ++ ++msgid "Use HTTP Secure" ++msgstr "" ++ ++msgid "Use cURL" ++msgstr "" ++ ++msgid "User defined script to read systems IP-Address" ++msgstr "" ++ ++msgid "Username" ++msgstr "×©× ×ž×©×ª×ž×©" ++ ++msgid "Verify" ++msgstr "" ++ ++msgid "Version" ++msgstr "" ++ ++msgid "Version Information" ++msgstr "" ++ ++msgid "Waiting for changes to be applied..." ++msgstr "" ++ ++msgid "Warning" ++msgstr "" ++ ++msgid "" ++"Writes detailed messages to log file. File will be truncated automatically." ++msgstr "" ++ ++msgid "" ++"Writes log messages to syslog. Critical Errors will always be written to " ++"syslog." ++msgstr "" ++ ++msgid "You should install BIND host package for DNS requests." ++msgstr "" ++ ++msgid "You should install GNU Wget with SSL (prefered) or cURL package." ++msgstr "" ++ ++msgid "You should install GNU Wget with SSL or cURL package." ++msgstr "" ++ ++msgid "You should install GNU Wget with SSL or replace libcurl." ++msgstr "" ++ ++msgid "cURL is installed, but libcurl was compiled without proxy support." ++msgstr "" ++ ++msgid "cURL without Proxy Support" ++msgstr "" ++ ++msgid "can not detect local IP. Please select a different Source combination" ++msgstr "" ++ ++msgid "can not resolve host:" ++msgstr "" ++ ++msgid "config error" ++msgstr "" ++ ++msgid "days" ++msgstr "" ++ ++msgid "directory or path/file" ++msgstr "" ++ ++msgid "either url or script could be set" ++msgstr "" ++ ++msgid "enable here" ++msgstr "" ++ ++msgid "file or directory not found or not 'IGNORE'" ++msgstr "" ++ ++msgid "help" ++msgstr "" ++ ++msgid "hours" ++msgstr "" ++ ++msgid "installed" ++msgstr "" ++ ++msgid "invalid - Sample" ++msgstr "" ++ ++msgid "minimum value '0'" ++msgstr "" ++ ++msgid "minimum value '1'" ++msgstr "" ++ ++msgid "minimum value 5 minutes == 300 seconds" ++msgstr "" ++ ++msgid "minutes" ++msgstr "" ++ ++msgid "missing / required" ++msgstr "" ++ ++msgid "must be greater or equal 'Check Interval'" ++msgstr "" ++ ++msgid "must start with 'http://'" ++msgstr "" ++ ++msgid "nc (netcat) can not connect" ++msgstr "" ++ ++msgid "never" ++msgstr "" ++ ++msgid "no data" ++msgstr "" ++ ++msgid "not found or not executable - Sample: '/path/to/script.sh'" ++msgstr "" ++ ++msgid "nslookup can not resolve host" ++msgstr "" ++ ++msgid "or" ++msgstr "" ++ ++msgid "or higher" ++msgstr "" ++ ++msgid "please disable" ++msgstr "" ++ ++msgid "please remove entry" ++msgstr "" ++ ++msgid "please select 'IPv4' address version" ++msgstr "" ++ ++msgid "please select 'IPv4' address version in" ++msgstr "" ++ ++msgid "please set to 'default'" ++msgstr "" ++ ++msgid "proxy port missing" ++msgstr "" ++ ++msgid "required" ++msgstr "" ++ ++msgid "seconds" ++msgstr "" ++ ++msgid "to run HTTPS without verification of server certificates (insecure)" ++msgstr "" ++ ++msgid "unknown error" ++msgstr "" ++ ++msgid "unspecific error" ++msgstr "" ++ ++msgid "use hostname, FQDN, IPv4- or IPv6-Address" ++msgstr "" ++ ++#~ msgid "Check for changed IP every" ++#~ msgstr "בצע בדיקה ל- IP שהתחלף כל" ++ ++#~ msgid "Check-time unit" ++#~ msgstr "בדוק-יחידת זמן" ++ ++#~ msgid "Enable" ++#~ msgstr "×פשר" ++ ++#~ msgid "Force update every" ++#~ msgstr "×לץ עדכון כל" ++ ++#, fuzzy ++#~ msgid "Force-time unit" ++#~ msgstr "יחידת זמן של ×ילוץ" ++ ++#~ msgid "Service" ++#~ msgstr "שירות" ++ ++#~ msgid "Source of IP address" ++#~ msgstr "מקור כתובת IP" ++ ++#~ msgid "custom" ++#~ msgstr "מות×× ×ישית" ++ ++# Hours ++#~ msgid "h" ++#~ msgstr "ש'" ++ ++#~ msgid "interface" ++#~ msgstr "ממשק" ++ ++# Minutes (not minimum) ++#~ msgid "min" ++#~ msgstr "דק'" ++ ++#~ msgid "network" ++#~ msgstr "רשת" +diff --git a/feeds/luci/applications/luci-app-ddns/po/hu/ddns.po b/feeds/luci/applications/luci-app-ddns/po/hu/ddns.po +new file mode 100644 +index 0000000..fdd9a17 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-ddns/po/hu/ddns.po +@@ -0,0 +1,705 @@ ++# Generated from applications/luci-ddns/luasrc/model/cbi/ddns/ddns.lua ++# ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Report-Msgid-Bugs-To: \n" ++"POT-Creation-Date: 2010-04-02 13:44+0100\n" ++"PO-Revision-Date: 2013-01-28 13:49+0200\n" ++"Last-Translator: Gábor \n" ++"Language-Team: none\n" ++"Language: hu\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n != 1);\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "&" ++msgstr "" ++ ++msgid "-- custom --" ++msgstr "" ++ ++msgid "-- default --" ++msgstr "" ++ ++msgid "Advanced Settings" ++msgstr "" ++ ++msgid "Allow non-public IP's" ++msgstr "" ++ ++msgid "Applying changes" ++msgstr "" ++ ++msgid "Basic Settings" ++msgstr "" ++ ++msgid "" ++"Below a list of configuration tips for your system to run Dynamic DNS " ++"updates without limitations" ++msgstr "" ++ ++msgid "" ++"Below is a list of configured DDNS configurations and their current state." ++msgstr "" ++ ++msgid "Bind Network" ++msgstr "" ++ ++msgid "Binding to a specific network not supported" ++msgstr "" ++ ++msgid "" ++"BusyBox's nslookup and Wget do not support to specify the IP version to use " ++"for communication with DDNS Provider." ++msgstr "" ++ ++msgid "" ++"BusyBox's nslookup does not support to specify to use TCP instead of default " ++"UDP when requesting DNS server" ++msgstr "" ++ ++msgid "Casual users should not change this setting" ++msgstr "" ++ ++msgid "Check Interval" ++msgstr "" ++ ++msgid "Collecting data..." ++msgstr "" ++ ++msgid "Config error" ++msgstr "" ++ ++msgid "Configuration" ++msgstr "" ++ ++msgid "" ++"Configure here the details for all Dynamic DNS services including this LuCI " ++"application." ++msgstr "" ++ ++msgid "Configure here the details for selected Dynamic DNS service." ++msgstr "" ++ ++msgid "Current setting" ++msgstr "" ++ ++msgid "" ++"Currently DDNS updates are not started at boot or on interface events.
    This is the default if you run DDNS scripts by yourself (i.e. via cron with " ++"force_interval set to '0')" ++msgstr "" ++ ++msgid "" ++"Currently DDNS updates are not started at boot or on interface events.
    You can start/stop each configuration here. It will run until next reboot." ++msgstr "" ++ ++msgid "Custom update script to be used for updating your DDNS Provider." ++msgstr "" ++ ++msgid "Custom update-URL" ++msgstr "Egyéni update-URL" ++ ++msgid "Custom update-script" ++msgstr "" ++ ++msgid "DDNS Autostart disabled" ++msgstr "" ++ ++msgid "DDNS Service provider" ++msgstr "" ++ ++msgid "DNS requests via TCP not supported" ++msgstr "" ++ ++msgid "DNS-Server" ++msgstr "" ++ ++msgid "Date format" ++msgstr "" ++ ++msgid "Defines the Web page to read systems IPv4-Address from" ++msgstr "" ++ ++msgid "Defines the Web page to read systems IPv6-Address from" ++msgstr "" ++ ++msgid "Defines the interface to read systems IP-Address from" ++msgstr "" ++ ++msgid "Defines the network to read systems IPv4-Address from" ++msgstr "" ++ ++msgid "Defines the network to read systems IPv6-Address from" ++msgstr "" ++ ++msgid "" ++"Defines the source to read systems IPv4-Address from, that will be send to " ++"the DDNS provider" ++msgstr "" ++ ++msgid "" ++"Defines the source to read systems IPv6-Address from, that will be send to " ++"the DDNS provider" ++msgstr "" ++ ++msgid "Defines which IP address 'IPv4/IPv6' is send to the DDNS provider" ++msgstr "" ++ ++msgid "Details for" ++msgstr "" ++ ++msgid "Directory contains Log files for each running section" ++msgstr "" ++ ++msgid "" ++"Directory contains PID and other status information for each running section" ++msgstr "" ++ ++msgid "Disabled" ++msgstr "" ++ ++msgid "Dynamic DNS" ++msgstr "Dinamikus DNS" ++ ++msgid "" ++"Dynamic DNS allows that your router can be reached with a fixed hostname " ++"while having a dynamically changing IP address." ++msgstr "" ++"A dinamikus DNS lehetővé teszi, hogy a routere elérhető legyen egy fix host " ++"névvel akkor is ha dinamikusan változó IP címmel rendelkezik." ++ ++msgid "Enable secure communication with DDNS provider" ++msgstr "" ++ ++msgid "Enabled" ++msgstr "" ++ ++msgid "Error" ++msgstr "" ++ ++msgid "Error Retry Counter" ++msgstr "" ++ ++msgid "Error Retry Interval" ++msgstr "" ++ ++msgid "Event Network" ++msgstr "" ++ ++msgid "File" ++msgstr "" ++ ++msgid "File not found" ++msgstr "" ++ ++msgid "File not found or empty" ++msgstr "" ++ ++msgid "" ++"Follow this link
    You will find more hints to optimize your system to " ++"run DDNS scripts with all options" ++msgstr "" ++ ++msgid "For detailed information about parameter settings look here." ++msgstr "" ++ ++msgid "For supported codes look here" ++msgstr "" ++ ++msgid "Force IP Version" ++msgstr "" ++ ++msgid "Force IP Version not supported" ++msgstr "" ++ ++msgid "Force Interval" ++msgstr "" ++ ++msgid "Force TCP on DNS" ++msgstr "" ++ ++msgid "Forced IP Version don't matched" ++msgstr "" ++ ++msgid "Format" ++msgstr "" ++ ++msgid "Format: IP or FQDN" ++msgstr "" ++ ++msgid "" ++"GNU Wget will use the IP of given network, cURL will use the physical " ++"interface." ++msgstr "" ++ ++msgid "Global Settings" ++msgstr "" ++ ++msgid "HTTPS not supported" ++msgstr "" ++ ++msgid "Hints" ++msgstr "" ++ ++msgid "Hostname/Domain" ++msgstr "" ++ ++msgid "IP address source" ++msgstr "" ++ ++msgid "IP address version" ++msgstr "" ++ ++msgid "IPv4-Address" ++msgstr "" ++ ++msgid "IPv6 address must be given in square brackets" ++msgstr "" ++ ++msgid "" ++"IPv6 is currently not (fully) supported by this system
    Please follow " ++"the instructions on OpenWrt's homepage to enable IPv6 support
    or update " ++"your system to the latest OpenWrt Release" ++msgstr "" ++ ++msgid "IPv6 not supported" ++msgstr "" ++ ++msgid "IPv6-Address" ++msgstr "" ++ ++msgid "If both cURL and GNU Wget are installed, Wget is used by default." ++msgstr "" ++ ++msgid "" ++"If this service section is disabled it could not be started.
    Neither " ++"from LuCI interface nor from console" ++msgstr "" ++ ++msgid "" ++"If you want to send updates for IPv4 and IPv6 you need to define two " ++"separate Configurations i.e. 'myddns_ipv4' and 'myddns_ipv6'" ++msgstr "" ++ ++msgid "" ++"In some versions cURL/libcurl in OpenWrt is compiled without proxy support." ++msgstr "" ++ ++msgid "Info" ++msgstr "" ++ ++msgid "Interface" ++msgstr "Interfész" ++ ++msgid "" ++"Interval to check for changed IP
    Values below 5 minutes == 300 seconds " ++"are not supported" ++msgstr "" ++ ++msgid "" ++"Interval to force updates send to DDNS Provider
    Setting this parameter " ++"to 0 will force the script to only run once
    Values lower 'Check " ++"Interval' except '0' are not supported" ++msgstr "" ++ ++msgid "It is NOT recommended for casual users to change settings on this page." ++msgstr "" ++ ++msgid "Last Update" ++msgstr "" ++ ++msgid "Loading" ++msgstr "" ++ ++msgid "Log File Viewer" ++msgstr "" ++ ++msgid "Log directory" ++msgstr "" ++ ++msgid "Log length" ++msgstr "" ++ ++msgid "Log to file" ++msgstr "" ++ ++msgid "Log to syslog" ++msgstr "" ++ ++msgid "" ++"Neither GNU Wget with SSL nor cURL installed to select a network to use for " ++"communication." ++msgstr "" ++ ++msgid "" ++"Neither GNU Wget with SSL nor cURL installed to support updates via HTTPS " ++"protocol." ++msgstr "" ++ ++msgid "Network" ++msgstr "Hálózat" ++ ++msgid "Network on which the ddns-updater scripts will be started" ++msgstr "" ++ ++msgid "Never" ++msgstr "" ++ ++msgid "Next Update" ++msgstr "" ++ ++msgid "No data" ++msgstr "" ++ ++msgid "No logging" ++msgstr "" ++ ++msgid "Non-public and by default blocked IP's" ++msgstr "" ++ ++msgid "Notice" ++msgstr "" ++ ++msgid "Number of last lines stored in log files" ++msgstr "" ++ ++msgid "OPTIONAL: Force the usage of pure IPv4/IPv6 only communication." ++msgstr "" ++ ++msgid "OPTIONAL: Force the use of TCP instead of default UDP on DNS requests." ++msgstr "" ++ ++msgid "OPTIONAL: Network to use for communication" ++msgstr "" ++ ++msgid "OPTIONAL: Proxy-Server for detection and updates." ++msgstr "" ++ ++msgid "OPTIONAL: Use non-default DNS-Server to detect 'Registered IP'." ++msgstr "" ++ ++msgid "On Error the script will retry the failed action after given time" ++msgstr "" ++ ++msgid "On Error the script will stop execution after given number of retrys" ++msgstr "" ++ ++msgid "Overview" ++msgstr "" ++ ++msgid "PROXY-Server" ++msgstr "" ++ ++msgid "PROXY-Server not supported" ++msgstr "" ++ ++msgid "Password" ++msgstr "Jelszó" ++ ++msgid "Path to CA-Certificate" ++msgstr "" ++ ++msgid "Please [Save & Apply] your changes first" ++msgstr "" ++ ++msgid "Please press [Read] button" ++msgstr "" ++ ++msgid "Please update to the current version!" ++msgstr "" ++ ++msgid "Process ID" ++msgstr "" ++ ++msgid "Read / Reread log file" ++msgstr "" ++ ++msgid "Registered IP" ++msgstr "" ++ ++msgid "Replaces [DOMAIN] in Update-URL" ++msgstr "" ++ ++msgid "Replaces [PASSWORD] in Update-URL" ++msgstr "" ++ ++msgid "Replaces [USERNAME] in Update-URL" ++msgstr "" ++ ++msgid "Run once" ++msgstr "" ++ ++msgid "Script" ++msgstr "" ++ ++msgid "Show more" ++msgstr "" ++ ++msgid "Software update required" ++msgstr "" ++ ++msgid "Start" ++msgstr "" ++ ++msgid "Start / Stop" ++msgstr "" ++ ++msgid "Status directory" ++msgstr "" ++ ++msgid "Stopped" ++msgstr "" ++ ++msgid "" ++"The currently installed 'ddns-scripts' package did not support all available " ++"settings." ++msgstr "" ++ ++msgid "There is no service configured." ++msgstr "" ++ ++msgid "Timer Settings" ++msgstr "" ++ ++msgid "To change global settings click here" ++msgstr "" ++ ++msgid "To use cURL activate this option." ++msgstr "" ++ ++msgid "URL" ++msgstr "URL" ++ ++msgid "URL to detect" ++msgstr "" ++ ++msgid "Unknown error" ++msgstr "" ++ ++msgid "" ++"Update URL to be used for updating your DDNS Provider.
    Follow " ++"instructions you will find on their WEB page." ++msgstr "" ++ ++msgid "Update error" ++msgstr "" ++ ++msgid "Use HTTP Secure" ++msgstr "" ++ ++msgid "Use cURL" ++msgstr "" ++ ++msgid "User defined script to read systems IP-Address" ++msgstr "" ++ ++msgid "Username" ++msgstr "Felhasználónév" ++ ++msgid "Verify" ++msgstr "" ++ ++msgid "Version" ++msgstr "" ++ ++msgid "Version Information" ++msgstr "" ++ ++msgid "Waiting for changes to be applied..." ++msgstr "" ++ ++msgid "Warning" ++msgstr "" ++ ++msgid "" ++"Writes detailed messages to log file. File will be truncated automatically." ++msgstr "" ++ ++msgid "" ++"Writes log messages to syslog. Critical Errors will always be written to " ++"syslog." ++msgstr "" ++ ++msgid "You should install BIND host package for DNS requests." ++msgstr "" ++ ++msgid "You should install GNU Wget with SSL (prefered) or cURL package." ++msgstr "" ++ ++msgid "You should install GNU Wget with SSL or cURL package." ++msgstr "" ++ ++msgid "You should install GNU Wget with SSL or replace libcurl." ++msgstr "" ++ ++msgid "cURL is installed, but libcurl was compiled without proxy support." ++msgstr "" ++ ++msgid "cURL without Proxy Support" ++msgstr "" ++ ++msgid "can not detect local IP. Please select a different Source combination" ++msgstr "" ++ ++msgid "can not resolve host:" ++msgstr "" ++ ++msgid "config error" ++msgstr "" ++ ++msgid "days" ++msgstr "" ++ ++msgid "directory or path/file" ++msgstr "" ++ ++msgid "either url or script could be set" ++msgstr "" ++ ++msgid "enable here" ++msgstr "" ++ ++msgid "file or directory not found or not 'IGNORE'" ++msgstr "" ++ ++msgid "help" ++msgstr "" ++ ++msgid "hours" ++msgstr "" ++ ++msgid "installed" ++msgstr "" ++ ++msgid "invalid - Sample" ++msgstr "" ++ ++msgid "minimum value '0'" ++msgstr "" ++ ++msgid "minimum value '1'" ++msgstr "" ++ ++msgid "minimum value 5 minutes == 300 seconds" ++msgstr "" ++ ++msgid "minutes" ++msgstr "" ++ ++msgid "missing / required" ++msgstr "" ++ ++msgid "must be greater or equal 'Check Interval'" ++msgstr "" ++ ++msgid "must start with 'http://'" ++msgstr "" ++ ++msgid "nc (netcat) can not connect" ++msgstr "" ++ ++msgid "never" ++msgstr "" ++ ++msgid "no data" ++msgstr "" ++ ++msgid "not found or not executable - Sample: '/path/to/script.sh'" ++msgstr "" ++ ++msgid "nslookup can not resolve host" ++msgstr "" ++ ++msgid "or" ++msgstr "" ++ ++msgid "or higher" ++msgstr "" ++ ++msgid "please disable" ++msgstr "" ++ ++msgid "please remove entry" ++msgstr "" ++ ++msgid "please select 'IPv4' address version" ++msgstr "" ++ ++msgid "please select 'IPv4' address version in" ++msgstr "" ++ ++msgid "please set to 'default'" ++msgstr "" ++ ++msgid "proxy port missing" ++msgstr "" ++ ++msgid "required" ++msgstr "" ++ ++msgid "seconds" ++msgstr "" ++ ++msgid "to run HTTPS without verification of server certificates (insecure)" ++msgstr "" ++ ++msgid "unknown error" ++msgstr "" ++ ++msgid "unspecific error" ++msgstr "" ++ ++msgid "use hostname, FQDN, IPv4- or IPv6-Address" ++msgstr "" ++ ++#~ msgid "Check for changed IP every" ++#~ msgstr "IP-cím változás ellenőrzése minden" ++ ++#~ msgid "Check-time unit" ++#~ msgstr "Időegység" ++ ++#~ msgid "Enable" ++#~ msgstr "Engedélyezés" ++ ++#~ msgid "Force update every" ++#~ msgstr "Frissítés erőltetése minden" ++ ++#~ msgid "Force-time unit" ++#~ msgstr "Időegység" ++ ++#~ msgid "Hostname" ++#~ msgstr "Hostnév" ++ ++#~ msgid "Service" ++#~ msgstr "Szervíz" ++ ++#~ msgid "Source of IP address" ++#~ msgstr "Az IP cím forrása" ++ ++#~ msgid "custom" ++#~ msgstr "egyéni" ++ ++# Hours ++#~ msgid "h" ++#~ msgstr "óra" ++ ++#~ msgid "interface" ++#~ msgstr "interfész" ++ ++# Minutes (not minimum) ++#~ msgid "min" ++#~ msgstr "perc" ++ ++#~ msgid "network" ++#~ msgstr "hálózat" ++ ++#~ msgid "Event interface" ++#~ msgstr "Esemény interfész" ++ ++#~ msgid "On which interface up should start the ddns script process." ++#~ msgstr "Melyik interfész indulása váltsa ki a ddns script indítását." +diff --git a/feeds/luci/applications/luci-app-ddns/po/it/ddns.po b/feeds/luci/applications/luci-app-ddns/po/it/ddns.po +new file mode 100644 +index 0000000..48e6809 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-ddns/po/it/ddns.po +@@ -0,0 +1,703 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Report-Msgid-Bugs-To: \n" ++"POT-Creation-Date: 2010-04-02 13:44+0100\n" ++"PO-Revision-Date: 2013-02-03 13:53+0200\n" ++"Last-Translator: Francesco <3gasas@gmail.com>\n" ++"Language-Team: LANGUAGE \n" ++"Language: it\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n != 1);\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "&" ++msgstr "" ++ ++msgid "-- custom --" ++msgstr "" ++ ++msgid "-- default --" ++msgstr "" ++ ++msgid "Advanced Settings" ++msgstr "" ++ ++msgid "Allow non-public IP's" ++msgstr "" ++ ++msgid "Applying changes" ++msgstr "" ++ ++msgid "Basic Settings" ++msgstr "" ++ ++msgid "" ++"Below a list of configuration tips for your system to run Dynamic DNS " ++"updates without limitations" ++msgstr "" ++ ++msgid "" ++"Below is a list of configured DDNS configurations and their current state." ++msgstr "" ++ ++msgid "Bind Network" ++msgstr "" ++ ++msgid "Binding to a specific network not supported" ++msgstr "" ++ ++msgid "" ++"BusyBox's nslookup and Wget do not support to specify the IP version to use " ++"for communication with DDNS Provider." ++msgstr "" ++ ++msgid "" ++"BusyBox's nslookup does not support to specify to use TCP instead of default " ++"UDP when requesting DNS server" ++msgstr "" ++ ++msgid "Casual users should not change this setting" ++msgstr "" ++ ++msgid "Check Interval" ++msgstr "" ++ ++msgid "Collecting data..." ++msgstr "" ++ ++msgid "Config error" ++msgstr "" ++ ++msgid "Configuration" ++msgstr "" ++ ++msgid "" ++"Configure here the details for all Dynamic DNS services including this LuCI " ++"application." ++msgstr "" ++ ++msgid "Configure here the details for selected Dynamic DNS service." ++msgstr "" ++ ++msgid "Current setting" ++msgstr "" ++ ++msgid "" ++"Currently DDNS updates are not started at boot or on interface events.
    This is the default if you run DDNS scripts by yourself (i.e. via cron with " ++"force_interval set to '0')" ++msgstr "" ++ ++msgid "" ++"Currently DDNS updates are not started at boot or on interface events.
    You can start/stop each configuration here. It will run until next reboot." ++msgstr "" ++ ++msgid "Custom update script to be used for updating your DDNS Provider." ++msgstr "" ++ ++msgid "Custom update-URL" ++msgstr "URL di aggiornamento personalizzato" ++ ++msgid "Custom update-script" ++msgstr "" ++ ++msgid "DDNS Autostart disabled" ++msgstr "" ++ ++msgid "DDNS Service provider" ++msgstr "" ++ ++msgid "DNS requests via TCP not supported" ++msgstr "" ++ ++msgid "DNS-Server" ++msgstr "" ++ ++msgid "Date format" ++msgstr "" ++ ++msgid "Defines the Web page to read systems IPv4-Address from" ++msgstr "" ++ ++msgid "Defines the Web page to read systems IPv6-Address from" ++msgstr "" ++ ++msgid "Defines the interface to read systems IP-Address from" ++msgstr "" ++ ++msgid "Defines the network to read systems IPv4-Address from" ++msgstr "" ++ ++msgid "Defines the network to read systems IPv6-Address from" ++msgstr "" ++ ++msgid "" ++"Defines the source to read systems IPv4-Address from, that will be send to " ++"the DDNS provider" ++msgstr "" ++ ++msgid "" ++"Defines the source to read systems IPv6-Address from, that will be send to " ++"the DDNS provider" ++msgstr "" ++ ++msgid "Defines which IP address 'IPv4/IPv6' is send to the DDNS provider" ++msgstr "" ++ ++msgid "Details for" ++msgstr "" ++ ++msgid "Directory contains Log files for each running section" ++msgstr "" ++ ++msgid "" ++"Directory contains PID and other status information for each running section" ++msgstr "" ++ ++msgid "Disabled" ++msgstr "" ++ ++msgid "Dynamic DNS" ++msgstr "DNS Dinamico" ++ ++msgid "" ++"Dynamic DNS allows that your router can be reached with a fixed hostname " ++"while having a dynamically changing IP address." ++msgstr "" ++"DNS Dinamico permette al tuo router di essere raggiunto con un indirizzo " ++"statico anche nel caso in cui tu disponga di un indirizzo IP dinamico." ++ ++msgid "Enable secure communication with DDNS provider" ++msgstr "" ++ ++msgid "Enabled" ++msgstr "" ++ ++msgid "Error" ++msgstr "" ++ ++msgid "Error Retry Counter" ++msgstr "" ++ ++msgid "Error Retry Interval" ++msgstr "" ++ ++msgid "Event Network" ++msgstr "" ++ ++msgid "File" ++msgstr "" ++ ++msgid "File not found" ++msgstr "" ++ ++msgid "File not found or empty" ++msgstr "" ++ ++msgid "" ++"Follow this link
    You will find more hints to optimize your system to " ++"run DDNS scripts with all options" ++msgstr "" ++ ++msgid "For detailed information about parameter settings look here." ++msgstr "" ++ ++msgid "For supported codes look here" ++msgstr "" ++ ++msgid "Force IP Version" ++msgstr "" ++ ++msgid "Force IP Version not supported" ++msgstr "" ++ ++msgid "Force Interval" ++msgstr "" ++ ++msgid "Force TCP on DNS" ++msgstr "" ++ ++msgid "Forced IP Version don't matched" ++msgstr "" ++ ++msgid "Format" ++msgstr "" ++ ++msgid "Format: IP or FQDN" ++msgstr "" ++ ++msgid "" ++"GNU Wget will use the IP of given network, cURL will use the physical " ++"interface." ++msgstr "" ++ ++msgid "Global Settings" ++msgstr "" ++ ++msgid "HTTPS not supported" ++msgstr "" ++ ++msgid "Hints" ++msgstr "" ++ ++msgid "Hostname/Domain" ++msgstr "" ++ ++msgid "IP address source" ++msgstr "" ++ ++msgid "IP address version" ++msgstr "" ++ ++msgid "IPv4-Address" ++msgstr "" ++ ++msgid "IPv6 address must be given in square brackets" ++msgstr "" ++ ++msgid "" ++"IPv6 is currently not (fully) supported by this system
    Please follow " ++"the instructions on OpenWrt's homepage to enable IPv6 support
    or update " ++"your system to the latest OpenWrt Release" ++msgstr "" ++ ++msgid "IPv6 not supported" ++msgstr "" ++ ++msgid "IPv6-Address" ++msgstr "" ++ ++msgid "If both cURL and GNU Wget are installed, Wget is used by default." ++msgstr "" ++ ++msgid "" ++"If this service section is disabled it could not be started.
    Neither " ++"from LuCI interface nor from console" ++msgstr "" ++ ++msgid "" ++"If you want to send updates for IPv4 and IPv6 you need to define two " ++"separate Configurations i.e. 'myddns_ipv4' and 'myddns_ipv6'" ++msgstr "" ++ ++msgid "" ++"In some versions cURL/libcurl in OpenWrt is compiled without proxy support." ++msgstr "" ++ ++msgid "Info" ++msgstr "" ++ ++msgid "Interface" ++msgstr "Interfaccia" ++ ++msgid "" ++"Interval to check for changed IP
    Values below 5 minutes == 300 seconds " ++"are not supported" ++msgstr "" ++ ++msgid "" ++"Interval to force updates send to DDNS Provider
    Setting this parameter " ++"to 0 will force the script to only run once
    Values lower 'Check " ++"Interval' except '0' are not supported" ++msgstr "" ++ ++msgid "It is NOT recommended for casual users to change settings on this page." ++msgstr "" ++ ++msgid "Last Update" ++msgstr "" ++ ++msgid "Loading" ++msgstr "" ++ ++msgid "Log File Viewer" ++msgstr "" ++ ++msgid "Log directory" ++msgstr "" ++ ++msgid "Log length" ++msgstr "" ++ ++msgid "Log to file" ++msgstr "" ++ ++msgid "Log to syslog" ++msgstr "" ++ ++msgid "" ++"Neither GNU Wget with SSL nor cURL installed to select a network to use for " ++"communication." ++msgstr "" ++ ++msgid "" ++"Neither GNU Wget with SSL nor cURL installed to support updates via HTTPS " ++"protocol." ++msgstr "" ++ ++msgid "Network" ++msgstr "Rete" ++ ++msgid "Network on which the ddns-updater scripts will be started" ++msgstr "" ++ ++msgid "Never" ++msgstr "" ++ ++msgid "Next Update" ++msgstr "" ++ ++msgid "No data" ++msgstr "" ++ ++msgid "No logging" ++msgstr "" ++ ++msgid "Non-public and by default blocked IP's" ++msgstr "" ++ ++msgid "Notice" ++msgstr "" ++ ++msgid "Number of last lines stored in log files" ++msgstr "" ++ ++msgid "OPTIONAL: Force the usage of pure IPv4/IPv6 only communication." ++msgstr "" ++ ++msgid "OPTIONAL: Force the use of TCP instead of default UDP on DNS requests." ++msgstr "" ++ ++msgid "OPTIONAL: Network to use for communication" ++msgstr "" ++ ++msgid "OPTIONAL: Proxy-Server for detection and updates." ++msgstr "" ++ ++msgid "OPTIONAL: Use non-default DNS-Server to detect 'Registered IP'." ++msgstr "" ++ ++msgid "On Error the script will retry the failed action after given time" ++msgstr "" ++ ++msgid "On Error the script will stop execution after given number of retrys" ++msgstr "" ++ ++msgid "Overview" ++msgstr "" ++ ++msgid "PROXY-Server" ++msgstr "" ++ ++msgid "PROXY-Server not supported" ++msgstr "" ++ ++msgid "Password" ++msgstr "Password" ++ ++msgid "Path to CA-Certificate" ++msgstr "" ++ ++msgid "Please [Save & Apply] your changes first" ++msgstr "" ++ ++msgid "Please press [Read] button" ++msgstr "" ++ ++msgid "Please update to the current version!" ++msgstr "" ++ ++msgid "Process ID" ++msgstr "" ++ ++msgid "Read / Reread log file" ++msgstr "" ++ ++msgid "Registered IP" ++msgstr "" ++ ++msgid "Replaces [DOMAIN] in Update-URL" ++msgstr "" ++ ++msgid "Replaces [PASSWORD] in Update-URL" ++msgstr "" ++ ++msgid "Replaces [USERNAME] in Update-URL" ++msgstr "" ++ ++msgid "Run once" ++msgstr "" ++ ++msgid "Script" ++msgstr "" ++ ++msgid "Show more" ++msgstr "" ++ ++msgid "Software update required" ++msgstr "" ++ ++msgid "Start" ++msgstr "" ++ ++msgid "Start / Stop" ++msgstr "" ++ ++msgid "Status directory" ++msgstr "" ++ ++msgid "Stopped" ++msgstr "" ++ ++msgid "" ++"The currently installed 'ddns-scripts' package did not support all available " ++"settings." ++msgstr "" ++ ++msgid "There is no service configured." ++msgstr "" ++ ++msgid "Timer Settings" ++msgstr "" ++ ++msgid "To change global settings click here" ++msgstr "" ++ ++msgid "To use cURL activate this option." ++msgstr "" ++ ++msgid "URL" ++msgstr "URL" ++ ++msgid "URL to detect" ++msgstr "" ++ ++msgid "Unknown error" ++msgstr "" ++ ++msgid "" ++"Update URL to be used for updating your DDNS Provider.
    Follow " ++"instructions you will find on their WEB page." ++msgstr "" ++ ++msgid "Update error" ++msgstr "" ++ ++msgid "Use HTTP Secure" ++msgstr "" ++ ++msgid "Use cURL" ++msgstr "" ++ ++msgid "User defined script to read systems IP-Address" ++msgstr "" ++ ++msgid "Username" ++msgstr "Nome Utente" ++ ++msgid "Verify" ++msgstr "" ++ ++msgid "Version" ++msgstr "" ++ ++msgid "Version Information" ++msgstr "" ++ ++msgid "Waiting for changes to be applied..." ++msgstr "" ++ ++msgid "Warning" ++msgstr "" ++ ++msgid "" ++"Writes detailed messages to log file. File will be truncated automatically." ++msgstr "" ++ ++msgid "" ++"Writes log messages to syslog. Critical Errors will always be written to " ++"syslog." ++msgstr "" ++ ++msgid "You should install BIND host package for DNS requests." ++msgstr "" ++ ++msgid "You should install GNU Wget with SSL (prefered) or cURL package." ++msgstr "" ++ ++msgid "You should install GNU Wget with SSL or cURL package." ++msgstr "" ++ ++msgid "You should install GNU Wget with SSL or replace libcurl." ++msgstr "" ++ ++msgid "cURL is installed, but libcurl was compiled without proxy support." ++msgstr "" ++ ++msgid "cURL without Proxy Support" ++msgstr "" ++ ++msgid "can not detect local IP. Please select a different Source combination" ++msgstr "" ++ ++msgid "can not resolve host:" ++msgstr "" ++ ++msgid "config error" ++msgstr "" ++ ++msgid "days" ++msgstr "" ++ ++msgid "directory or path/file" ++msgstr "" ++ ++msgid "either url or script could be set" ++msgstr "" ++ ++msgid "enable here" ++msgstr "" ++ ++msgid "file or directory not found or not 'IGNORE'" ++msgstr "" ++ ++msgid "help" ++msgstr "" ++ ++msgid "hours" ++msgstr "" ++ ++msgid "installed" ++msgstr "" ++ ++msgid "invalid - Sample" ++msgstr "" ++ ++msgid "minimum value '0'" ++msgstr "" ++ ++msgid "minimum value '1'" ++msgstr "" ++ ++msgid "minimum value 5 minutes == 300 seconds" ++msgstr "" ++ ++msgid "minutes" ++msgstr "" ++ ++msgid "missing / required" ++msgstr "" ++ ++msgid "must be greater or equal 'Check Interval'" ++msgstr "" ++ ++msgid "must start with 'http://'" ++msgstr "" ++ ++msgid "nc (netcat) can not connect" ++msgstr "" ++ ++msgid "never" ++msgstr "" ++ ++msgid "no data" ++msgstr "" ++ ++msgid "not found or not executable - Sample: '/path/to/script.sh'" ++msgstr "" ++ ++msgid "nslookup can not resolve host" ++msgstr "" ++ ++msgid "or" ++msgstr "" ++ ++msgid "or higher" ++msgstr "" ++ ++msgid "please disable" ++msgstr "" ++ ++msgid "please remove entry" ++msgstr "" ++ ++msgid "please select 'IPv4' address version" ++msgstr "" ++ ++msgid "please select 'IPv4' address version in" ++msgstr "" ++ ++msgid "please set to 'default'" ++msgstr "" ++ ++msgid "proxy port missing" ++msgstr "" ++ ++msgid "required" ++msgstr "" ++ ++msgid "seconds" ++msgstr "" ++ ++msgid "to run HTTPS without verification of server certificates (insecure)" ++msgstr "" ++ ++msgid "unknown error" ++msgstr "" ++ ++msgid "unspecific error" ++msgstr "" ++ ++msgid "use hostname, FQDN, IPv4- or IPv6-Address" ++msgstr "" ++ ++#~ msgid "Check for changed IP every" ++#~ msgstr "Controlla se cambia l'IP ogni" ++ ++#~ msgid "Check-time unit" ++#~ msgstr "Check-time unit" ++ ++#~ msgid "Enable" ++#~ msgstr "Abilita" ++ ++#~ msgid "Force update every" ++#~ msgstr "Forza aggiornamento ogni" ++ ++#~ msgid "Force-time unit" ++#~ msgstr "Unità di tempo per l'aggiornamento" ++ ++#~ msgid "Hostname" ++#~ msgstr "Nome Host" ++ ++#~ msgid "Service" ++#~ msgstr "Servizio" ++ ++#~ msgid "Source of IP address" ++#~ msgstr "Origine dell'indirizzo IP" ++ ++#~ msgid "custom" ++#~ msgstr "personalizzato" ++ ++# Hours ++#~ msgid "h" ++#~ msgstr "o" ++ ++#~ msgid "interface" ++#~ msgstr "interfaccia" ++ ++# Minutes (not minimum) ++#~ msgid "min" ++#~ msgstr "min" ++ ++#~ msgid "network" ++#~ msgstr "rete" ++ ++#~ msgid "Event interface" ++#~ msgstr "Evento interfaccia" ++ ++#~ msgid "On which interface up should start the ddns script process." ++#~ msgstr "Su quale interfaccia dovrebbe iniziare il processo di script DDNS." +diff --git a/feeds/luci/applications/luci-app-ddns/po/ja/ddns.po b/feeds/luci/applications/luci-app-ddns/po/ja/ddns.po +new file mode 100644 +index 0000000..488bac9 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-ddns/po/ja/ddns.po +@@ -0,0 +1,705 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Report-Msgid-Bugs-To: \n" ++"POT-Creation-Date: 2010-04-02 13:44+0100\n" ++"PO-Revision-Date: 2013-10-05 17:19+0200\n" ++"Last-Translator: Kentaro \n" ++"Language-Team: LANGUAGE \n" ++"Language: ja\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=1; plural=0;\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "&" ++msgstr "" ++ ++msgid "-- custom --" ++msgstr "" ++ ++msgid "-- default --" ++msgstr "" ++ ++msgid "Advanced Settings" ++msgstr "" ++ ++msgid "Allow non-public IP's" ++msgstr "" ++ ++msgid "Applying changes" ++msgstr "" ++ ++msgid "Basic Settings" ++msgstr "" ++ ++msgid "" ++"Below a list of configuration tips for your system to run Dynamic DNS " ++"updates without limitations" ++msgstr "" ++ ++msgid "" ++"Below is a list of configured DDNS configurations and their current state." ++msgstr "" ++ ++msgid "Bind Network" ++msgstr "" ++ ++msgid "Binding to a specific network not supported" ++msgstr "" ++ ++msgid "" ++"BusyBox's nslookup and Wget do not support to specify the IP version to use " ++"for communication with DDNS Provider." ++msgstr "" ++ ++msgid "" ++"BusyBox's nslookup does not support to specify to use TCP instead of default " ++"UDP when requesting DNS server" ++msgstr "" ++ ++msgid "Casual users should not change this setting" ++msgstr "" ++ ++msgid "Check Interval" ++msgstr "" ++ ++msgid "Collecting data..." ++msgstr "" ++ ++msgid "Config error" ++msgstr "" ++ ++msgid "Configuration" ++msgstr "" ++ ++msgid "" ++"Configure here the details for all Dynamic DNS services including this LuCI " ++"application." ++msgstr "" ++ ++msgid "Configure here the details for selected Dynamic DNS service." ++msgstr "" ++ ++msgid "Current setting" ++msgstr "" ++ ++msgid "" ++"Currently DDNS updates are not started at boot or on interface events.
    This is the default if you run DDNS scripts by yourself (i.e. via cron with " ++"force_interval set to '0')" ++msgstr "" ++ ++msgid "" ++"Currently DDNS updates are not started at boot or on interface events.
    You can start/stop each configuration here. It will run until next reboot." ++msgstr "" ++ ++msgid "Custom update script to be used for updating your DDNS Provider." ++msgstr "" ++ ++msgid "Custom update-URL" ++msgstr "手動アップデート-URL" ++ ++msgid "Custom update-script" ++msgstr "" ++ ++msgid "DDNS Autostart disabled" ++msgstr "" ++ ++msgid "DDNS Service provider" ++msgstr "" ++ ++msgid "DNS requests via TCP not supported" ++msgstr "" ++ ++msgid "DNS-Server" ++msgstr "" ++ ++msgid "Date format" ++msgstr "" ++ ++msgid "Defines the Web page to read systems IPv4-Address from" ++msgstr "" ++ ++msgid "Defines the Web page to read systems IPv6-Address from" ++msgstr "" ++ ++msgid "Defines the interface to read systems IP-Address from" ++msgstr "" ++ ++msgid "Defines the network to read systems IPv4-Address from" ++msgstr "" ++ ++msgid "Defines the network to read systems IPv6-Address from" ++msgstr "" ++ ++msgid "" ++"Defines the source to read systems IPv4-Address from, that will be send to " ++"the DDNS provider" ++msgstr "" ++ ++msgid "" ++"Defines the source to read systems IPv6-Address from, that will be send to " ++"the DDNS provider" ++msgstr "" ++ ++msgid "Defines which IP address 'IPv4/IPv6' is send to the DDNS provider" ++msgstr "" ++ ++msgid "Details for" ++msgstr "" ++ ++msgid "Directory contains Log files for each running section" ++msgstr "" ++ ++msgid "" ++"Directory contains PID and other status information for each running section" ++msgstr "" ++ ++msgid "Disabled" ++msgstr "" ++ ++msgid "Dynamic DNS" ++msgstr "ダイナミックDNS" ++ ++msgid "" ++"Dynamic DNS allows that your router can be reached with a fixed hostname " ++"while having a dynamically changing IP address." ++msgstr "" ++"ダイナミックDNSを使用ã™ã‚‹ã“ã¨ã§ã€IPアドレスãŒå¤‰æ›´ã•ã‚Œã¦ã‚‚固定ã®ãƒ›ã‚¹ãƒˆåを使ã£" ++"ã¦ãƒ«ãƒ¼ã‚¿ãƒ¼ã«ã‚¢ã‚¯ã‚»ã‚¹ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚" ++ ++msgid "Enable secure communication with DDNS provider" ++msgstr "" ++ ++msgid "Enabled" ++msgstr "" ++ ++msgid "Error" ++msgstr "" ++ ++msgid "Error Retry Counter" ++msgstr "" ++ ++msgid "Error Retry Interval" ++msgstr "" ++ ++msgid "Event Network" ++msgstr "" ++ ++msgid "File" ++msgstr "" ++ ++msgid "File not found" ++msgstr "" ++ ++msgid "File not found or empty" ++msgstr "" ++ ++msgid "" ++"Follow this link
    You will find more hints to optimize your system to " ++"run DDNS scripts with all options" ++msgstr "" ++ ++msgid "For detailed information about parameter settings look here." ++msgstr "" ++ ++msgid "For supported codes look here" ++msgstr "" ++ ++msgid "Force IP Version" ++msgstr "" ++ ++msgid "Force IP Version not supported" ++msgstr "" ++ ++msgid "Force Interval" ++msgstr "" ++ ++msgid "Force TCP on DNS" ++msgstr "" ++ ++msgid "Forced IP Version don't matched" ++msgstr "" ++ ++msgid "Format" ++msgstr "" ++ ++msgid "Format: IP or FQDN" ++msgstr "" ++ ++msgid "" ++"GNU Wget will use the IP of given network, cURL will use the physical " ++"interface." ++msgstr "" ++ ++msgid "Global Settings" ++msgstr "" ++ ++msgid "HTTPS not supported" ++msgstr "" ++ ++msgid "Hints" ++msgstr "" ++ ++msgid "Hostname/Domain" ++msgstr "" ++ ++msgid "IP address source" ++msgstr "" ++ ++msgid "IP address version" ++msgstr "" ++ ++msgid "IPv4-Address" ++msgstr "" ++ ++msgid "IPv6 address must be given in square brackets" ++msgstr "" ++ ++msgid "" ++"IPv6 is currently not (fully) supported by this system
    Please follow " ++"the instructions on OpenWrt's homepage to enable IPv6 support
    or update " ++"your system to the latest OpenWrt Release" ++msgstr "" ++ ++msgid "IPv6 not supported" ++msgstr "" ++ ++msgid "IPv6-Address" ++msgstr "" ++ ++msgid "If both cURL and GNU Wget are installed, Wget is used by default." ++msgstr "" ++ ++msgid "" ++"If this service section is disabled it could not be started.
    Neither " ++"from LuCI interface nor from console" ++msgstr "" ++ ++msgid "" ++"If you want to send updates for IPv4 and IPv6 you need to define two " ++"separate Configurations i.e. 'myddns_ipv4' and 'myddns_ipv6'" ++msgstr "" ++ ++msgid "" ++"In some versions cURL/libcurl in OpenWrt is compiled without proxy support." ++msgstr "" ++ ++msgid "Info" ++msgstr "" ++ ++msgid "Interface" ++msgstr "インターフェース" ++ ++msgid "" ++"Interval to check for changed IP
    Values below 5 minutes == 300 seconds " ++"are not supported" ++msgstr "" ++ ++msgid "" ++"Interval to force updates send to DDNS Provider
    Setting this parameter " ++"to 0 will force the script to only run once
    Values lower 'Check " ++"Interval' except '0' are not supported" ++msgstr "" ++ ++msgid "It is NOT recommended for casual users to change settings on this page." ++msgstr "" ++ ++msgid "Last Update" ++msgstr "" ++ ++msgid "Loading" ++msgstr "" ++ ++msgid "Log File Viewer" ++msgstr "" ++ ++msgid "Log directory" ++msgstr "" ++ ++msgid "Log length" ++msgstr "" ++ ++msgid "Log to file" ++msgstr "" ++ ++msgid "Log to syslog" ++msgstr "" ++ ++msgid "" ++"Neither GNU Wget with SSL nor cURL installed to select a network to use for " ++"communication." ++msgstr "" ++ ++msgid "" ++"Neither GNU Wget with SSL nor cURL installed to support updates via HTTPS " ++"protocol." ++msgstr "" ++ ++msgid "Network" ++msgstr "ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯" ++ ++msgid "Network on which the ddns-updater scripts will be started" ++msgstr "" ++ ++msgid "Never" ++msgstr "" ++ ++msgid "Next Update" ++msgstr "" ++ ++msgid "No data" ++msgstr "" ++ ++msgid "No logging" ++msgstr "" ++ ++msgid "Non-public and by default blocked IP's" ++msgstr "" ++ ++msgid "Notice" ++msgstr "" ++ ++msgid "Number of last lines stored in log files" ++msgstr "" ++ ++msgid "OPTIONAL: Force the usage of pure IPv4/IPv6 only communication." ++msgstr "" ++ ++msgid "OPTIONAL: Force the use of TCP instead of default UDP on DNS requests." ++msgstr "" ++ ++msgid "OPTIONAL: Network to use for communication" ++msgstr "" ++ ++msgid "OPTIONAL: Proxy-Server for detection and updates." ++msgstr "" ++ ++msgid "OPTIONAL: Use non-default DNS-Server to detect 'Registered IP'." ++msgstr "" ++ ++msgid "On Error the script will retry the failed action after given time" ++msgstr "" ++ ++msgid "On Error the script will stop execution after given number of retrys" ++msgstr "" ++ ++msgid "Overview" ++msgstr "" ++ ++msgid "PROXY-Server" ++msgstr "" ++ ++msgid "PROXY-Server not supported" ++msgstr "" ++ ++msgid "Password" ++msgstr "パスワード" ++ ++msgid "Path to CA-Certificate" ++msgstr "" ++ ++msgid "Please [Save & Apply] your changes first" ++msgstr "" ++ ++msgid "Please press [Read] button" ++msgstr "" ++ ++msgid "Please update to the current version!" ++msgstr "" ++ ++msgid "Process ID" ++msgstr "" ++ ++msgid "Read / Reread log file" ++msgstr "" ++ ++msgid "Registered IP" ++msgstr "" ++ ++msgid "Replaces [DOMAIN] in Update-URL" ++msgstr "" ++ ++msgid "Replaces [PASSWORD] in Update-URL" ++msgstr "" ++ ++msgid "Replaces [USERNAME] in Update-URL" ++msgstr "" ++ ++msgid "Run once" ++msgstr "" ++ ++msgid "Script" ++msgstr "" ++ ++msgid "Show more" ++msgstr "" ++ ++msgid "Software update required" ++msgstr "" ++ ++msgid "Start" ++msgstr "" ++ ++msgid "Start / Stop" ++msgstr "" ++ ++msgid "Status directory" ++msgstr "" ++ ++msgid "Stopped" ++msgstr "" ++ ++msgid "" ++"The currently installed 'ddns-scripts' package did not support all available " ++"settings." ++msgstr "" ++ ++msgid "There is no service configured." ++msgstr "" ++ ++msgid "Timer Settings" ++msgstr "" ++ ++msgid "To change global settings click here" ++msgstr "" ++ ++msgid "To use cURL activate this option." ++msgstr "" ++ ++msgid "URL" ++msgstr "URL" ++ ++msgid "URL to detect" ++msgstr "" ++ ++msgid "Unknown error" ++msgstr "" ++ ++msgid "" ++"Update URL to be used for updating your DDNS Provider.
    Follow " ++"instructions you will find on their WEB page." ++msgstr "" ++ ++msgid "Update error" ++msgstr "" ++ ++msgid "Use HTTP Secure" ++msgstr "" ++ ++msgid "Use cURL" ++msgstr "" ++ ++msgid "User defined script to read systems IP-Address" ++msgstr "" ++ ++msgid "Username" ++msgstr "ユーザーå" ++ ++msgid "Verify" ++msgstr "" ++ ++msgid "Version" ++msgstr "" ++ ++msgid "Version Information" ++msgstr "" ++ ++msgid "Waiting for changes to be applied..." ++msgstr "" ++ ++msgid "Warning" ++msgstr "" ++ ++msgid "" ++"Writes detailed messages to log file. File will be truncated automatically." ++msgstr "" ++ ++msgid "" ++"Writes log messages to syslog. Critical Errors will always be written to " ++"syslog." ++msgstr "" ++ ++msgid "You should install BIND host package for DNS requests." ++msgstr "" ++ ++msgid "You should install GNU Wget with SSL (prefered) or cURL package." ++msgstr "" ++ ++msgid "You should install GNU Wget with SSL or cURL package." ++msgstr "" ++ ++msgid "You should install GNU Wget with SSL or replace libcurl." ++msgstr "" ++ ++msgid "cURL is installed, but libcurl was compiled without proxy support." ++msgstr "" ++ ++msgid "cURL without Proxy Support" ++msgstr "" ++ ++msgid "can not detect local IP. Please select a different Source combination" ++msgstr "" ++ ++msgid "can not resolve host:" ++msgstr "" ++ ++msgid "config error" ++msgstr "" ++ ++msgid "days" ++msgstr "" ++ ++msgid "directory or path/file" ++msgstr "" ++ ++msgid "either url or script could be set" ++msgstr "" ++ ++msgid "enable here" ++msgstr "" ++ ++msgid "file or directory not found or not 'IGNORE'" ++msgstr "" ++ ++msgid "help" ++msgstr "" ++ ++msgid "hours" ++msgstr "" ++ ++msgid "installed" ++msgstr "" ++ ++msgid "invalid - Sample" ++msgstr "" ++ ++msgid "minimum value '0'" ++msgstr "" ++ ++msgid "minimum value '1'" ++msgstr "" ++ ++msgid "minimum value 5 minutes == 300 seconds" ++msgstr "" ++ ++msgid "minutes" ++msgstr "" ++ ++msgid "missing / required" ++msgstr "" ++ ++msgid "must be greater or equal 'Check Interval'" ++msgstr "" ++ ++msgid "must start with 'http://'" ++msgstr "" ++ ++msgid "nc (netcat) can not connect" ++msgstr "" ++ ++msgid "never" ++msgstr "" ++ ++msgid "no data" ++msgstr "" ++ ++msgid "not found or not executable - Sample: '/path/to/script.sh'" ++msgstr "" ++ ++msgid "nslookup can not resolve host" ++msgstr "" ++ ++msgid "or" ++msgstr "" ++ ++msgid "or higher" ++msgstr "" ++ ++msgid "please disable" ++msgstr "" ++ ++msgid "please remove entry" ++msgstr "" ++ ++msgid "please select 'IPv4' address version" ++msgstr "" ++ ++msgid "please select 'IPv4' address version in" ++msgstr "" ++ ++msgid "please set to 'default'" ++msgstr "" ++ ++msgid "proxy port missing" ++msgstr "" ++ ++msgid "required" ++msgstr "" ++ ++msgid "seconds" ++msgstr "" ++ ++msgid "to run HTTPS without verification of server certificates (insecure)" ++msgstr "" ++ ++msgid "unknown error" ++msgstr "" ++ ++msgid "unspecific error" ++msgstr "" ++ ++msgid "use hostname, FQDN, IPv4- or IPv6-Address" ++msgstr "" ++ ++#~ msgid "Check for changed IP every" ++#~ msgstr "IPアドレスãŒå¤‰åŒ–ã—ãŸã‹ãƒã‚§ãƒƒã‚¯ã‚’è¡Œã†é–“éš”" ++ ++#~ msgid "Check-time unit" ++#~ msgstr "ãƒã‚§ãƒƒã‚¯ã®æ™‚é–“å˜ä½" ++ ++#~ msgid "Enable" ++#~ msgstr "有効" ++ ++#~ msgid "Force update every" ++#~ msgstr "強制的ã«ã‚¢ãƒƒãƒ—デートを行ã†é–“éš”" ++ ++#~ msgid "Force-time unit" ++#~ msgstr "アップデートã®æ™‚é–“å˜ä½" ++ ++#~ msgid "Hostname" ++#~ msgstr "ホストå" ++ ++#~ msgid "Service" ++#~ msgstr "サービス" ++ ++#~ msgid "Source of IP address" ++#~ msgstr "é€ä¿¡å…ƒIPアドレス" ++ ++#~ msgid "custom" ++#~ msgstr "手動設定" ++ ++# Hours ++#~ msgid "h" ++#~ msgstr "時" ++ ++#~ msgid "interface" ++#~ msgstr "インターフェース" ++ ++# Minutes (not minimum) ++#~ msgid "min" ++#~ msgstr "分" ++ ++#~ msgid "network" ++#~ msgstr "ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯" ++ ++#~ msgid "Event interface" ++#~ msgstr "イベントインターフェース" ++ ++#~ msgid "On which interface up should start the ddns script process." ++#~ msgstr "" ++#~ "ã©ã®ã‚¤ãƒ³ã‚¿ãƒ¼ãƒ•ã‚§ãƒ¼ã‚¹ãŒèµ·å‹•ã—ãŸéš›ã«ddnsスクリプトを開始ã™ã‚‹ã‹è¨­å®šã—ã¦ãã ã•" ++#~ "ã„。" +diff --git a/feeds/luci/applications/luci-app-ddns/po/ms/ddns.po b/feeds/luci/applications/luci-app-ddns/po/ms/ddns.po +new file mode 100644 +index 0000000..5b7f0de +--- /dev/null ++++ b/feeds/luci/applications/luci-app-ddns/po/ms/ddns.po +@@ -0,0 +1,654 @@ ++# Generated from applications/luci-ddns/luasrc/model/cbi/ddns/ddns.lua ++# ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Report-Msgid-Bugs-To: \n" ++"POT-Creation-Date: 2010-04-02 13:44+0100\n" ++"PO-Revision-Date: 2010-04-02 13:44+0100\n" ++"Last-Translator: Automatically generated\n" ++"Language-Team: none\n" ++"Language: \n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++ ++msgid "&" ++msgstr "" ++ ++msgid "-- custom --" ++msgstr "" ++ ++msgid "-- default --" ++msgstr "" ++ ++msgid "Advanced Settings" ++msgstr "" ++ ++msgid "Allow non-public IP's" ++msgstr "" ++ ++msgid "Applying changes" ++msgstr "" ++ ++msgid "Basic Settings" ++msgstr "" ++ ++msgid "" ++"Below a list of configuration tips for your system to run Dynamic DNS " ++"updates without limitations" ++msgstr "" ++ ++msgid "" ++"Below is a list of configured DDNS configurations and their current state." ++msgstr "" ++ ++msgid "Bind Network" ++msgstr "" ++ ++msgid "Binding to a specific network not supported" ++msgstr "" ++ ++msgid "" ++"BusyBox's nslookup and Wget do not support to specify the IP version to use " ++"for communication with DDNS Provider." ++msgstr "" ++ ++msgid "" ++"BusyBox's nslookup does not support to specify to use TCP instead of default " ++"UDP when requesting DNS server" ++msgstr "" ++ ++msgid "Casual users should not change this setting" ++msgstr "" ++ ++msgid "Check Interval" ++msgstr "" ++ ++msgid "Collecting data..." ++msgstr "" ++ ++msgid "Config error" ++msgstr "" ++ ++msgid "Configuration" ++msgstr "" ++ ++msgid "" ++"Configure here the details for all Dynamic DNS services including this LuCI " ++"application." ++msgstr "" ++ ++msgid "Configure here the details for selected Dynamic DNS service." ++msgstr "" ++ ++msgid "Current setting" ++msgstr "" ++ ++msgid "" ++"Currently DDNS updates are not started at boot or on interface events.
    This is the default if you run DDNS scripts by yourself (i.e. via cron with " ++"force_interval set to '0')" ++msgstr "" ++ ++msgid "" ++"Currently DDNS updates are not started at boot or on interface events.
    You can start/stop each configuration here. It will run until next reboot." ++msgstr "" ++ ++msgid "Custom update script to be used for updating your DDNS Provider." ++msgstr "" ++ ++msgid "Custom update-URL" ++msgstr "" ++ ++msgid "Custom update-script" ++msgstr "" ++ ++msgid "DDNS Autostart disabled" ++msgstr "" ++ ++msgid "DDNS Service provider" ++msgstr "" ++ ++msgid "DNS requests via TCP not supported" ++msgstr "" ++ ++msgid "DNS-Server" ++msgstr "" ++ ++msgid "Date format" ++msgstr "" ++ ++msgid "Defines the Web page to read systems IPv4-Address from" ++msgstr "" ++ ++msgid "Defines the Web page to read systems IPv6-Address from" ++msgstr "" ++ ++msgid "Defines the interface to read systems IP-Address from" ++msgstr "" ++ ++msgid "Defines the network to read systems IPv4-Address from" ++msgstr "" ++ ++msgid "Defines the network to read systems IPv6-Address from" ++msgstr "" ++ ++msgid "" ++"Defines the source to read systems IPv4-Address from, that will be send to " ++"the DDNS provider" ++msgstr "" ++ ++msgid "" ++"Defines the source to read systems IPv6-Address from, that will be send to " ++"the DDNS provider" ++msgstr "" ++ ++msgid "Defines which IP address 'IPv4/IPv6' is send to the DDNS provider" ++msgstr "" ++ ++msgid "Details for" ++msgstr "" ++ ++msgid "Directory contains Log files for each running section" ++msgstr "" ++ ++msgid "" ++"Directory contains PID and other status information for each running section" ++msgstr "" ++ ++msgid "Disabled" ++msgstr "" ++ ++msgid "Dynamic DNS" ++msgstr "" ++ ++msgid "" ++"Dynamic DNS allows that your router can be reached with a fixed hostname " ++"while having a dynamically changing IP address." ++msgstr "" ++ ++msgid "Enable secure communication with DDNS provider" ++msgstr "" ++ ++msgid "Enabled" ++msgstr "" ++ ++msgid "Error" ++msgstr "" ++ ++msgid "Error Retry Counter" ++msgstr "" ++ ++msgid "Error Retry Interval" ++msgstr "" ++ ++msgid "Event Network" ++msgstr "" ++ ++msgid "File" ++msgstr "" ++ ++msgid "File not found" ++msgstr "" ++ ++msgid "File not found or empty" ++msgstr "" ++ ++msgid "" ++"Follow this link
    You will find more hints to optimize your system to " ++"run DDNS scripts with all options" ++msgstr "" ++ ++msgid "For detailed information about parameter settings look here." ++msgstr "" ++ ++msgid "For supported codes look here" ++msgstr "" ++ ++msgid "Force IP Version" ++msgstr "" ++ ++msgid "Force IP Version not supported" ++msgstr "" ++ ++msgid "Force Interval" ++msgstr "" ++ ++msgid "Force TCP on DNS" ++msgstr "" ++ ++msgid "Forced IP Version don't matched" ++msgstr "" ++ ++msgid "Format" ++msgstr "" ++ ++msgid "Format: IP or FQDN" ++msgstr "" ++ ++msgid "" ++"GNU Wget will use the IP of given network, cURL will use the physical " ++"interface." ++msgstr "" ++ ++msgid "Global Settings" ++msgstr "" ++ ++msgid "HTTPS not supported" ++msgstr "" ++ ++msgid "Hints" ++msgstr "" ++ ++msgid "Hostname/Domain" ++msgstr "" ++ ++msgid "IP address source" ++msgstr "" ++ ++msgid "IP address version" ++msgstr "" ++ ++msgid "IPv4-Address" ++msgstr "" ++ ++msgid "IPv6 address must be given in square brackets" ++msgstr "" ++ ++msgid "" ++"IPv6 is currently not (fully) supported by this system
    Please follow " ++"the instructions on OpenWrt's homepage to enable IPv6 support
    or update " ++"your system to the latest OpenWrt Release" ++msgstr "" ++ ++msgid "IPv6 not supported" ++msgstr "" ++ ++msgid "IPv6-Address" ++msgstr "" ++ ++msgid "If both cURL and GNU Wget are installed, Wget is used by default." ++msgstr "" ++ ++msgid "" ++"If this service section is disabled it could not be started.
    Neither " ++"from LuCI interface nor from console" ++msgstr "" ++ ++msgid "" ++"If you want to send updates for IPv4 and IPv6 you need to define two " ++"separate Configurations i.e. 'myddns_ipv4' and 'myddns_ipv6'" ++msgstr "" ++ ++msgid "" ++"In some versions cURL/libcurl in OpenWrt is compiled without proxy support." ++msgstr "" ++ ++msgid "Info" ++msgstr "" ++ ++msgid "Interface" ++msgstr "" ++ ++msgid "" ++"Interval to check for changed IP
    Values below 5 minutes == 300 seconds " ++"are not supported" ++msgstr "" ++ ++msgid "" ++"Interval to force updates send to DDNS Provider
    Setting this parameter " ++"to 0 will force the script to only run once
    Values lower 'Check " ++"Interval' except '0' are not supported" ++msgstr "" ++ ++msgid "It is NOT recommended for casual users to change settings on this page." ++msgstr "" ++ ++msgid "Last Update" ++msgstr "" ++ ++msgid "Loading" ++msgstr "" ++ ++msgid "Log File Viewer" ++msgstr "" ++ ++msgid "Log directory" ++msgstr "" ++ ++msgid "Log length" ++msgstr "" ++ ++msgid "Log to file" ++msgstr "" ++ ++msgid "Log to syslog" ++msgstr "" ++ ++msgid "" ++"Neither GNU Wget with SSL nor cURL installed to select a network to use for " ++"communication." ++msgstr "" ++ ++msgid "" ++"Neither GNU Wget with SSL nor cURL installed to support updates via HTTPS " ++"protocol." ++msgstr "" ++ ++msgid "Network" ++msgstr "" ++ ++msgid "Network on which the ddns-updater scripts will be started" ++msgstr "" ++ ++msgid "Never" ++msgstr "" ++ ++msgid "Next Update" ++msgstr "" ++ ++msgid "No data" ++msgstr "" ++ ++msgid "No logging" ++msgstr "" ++ ++msgid "Non-public and by default blocked IP's" ++msgstr "" ++ ++msgid "Notice" ++msgstr "" ++ ++msgid "Number of last lines stored in log files" ++msgstr "" ++ ++msgid "OPTIONAL: Force the usage of pure IPv4/IPv6 only communication." ++msgstr "" ++ ++msgid "OPTIONAL: Force the use of TCP instead of default UDP on DNS requests." ++msgstr "" ++ ++msgid "OPTIONAL: Network to use for communication" ++msgstr "" ++ ++msgid "OPTIONAL: Proxy-Server for detection and updates." ++msgstr "" ++ ++msgid "OPTIONAL: Use non-default DNS-Server to detect 'Registered IP'." ++msgstr "" ++ ++msgid "On Error the script will retry the failed action after given time" ++msgstr "" ++ ++msgid "On Error the script will stop execution after given number of retrys" ++msgstr "" ++ ++msgid "Overview" ++msgstr "" ++ ++msgid "PROXY-Server" ++msgstr "" ++ ++msgid "PROXY-Server not supported" ++msgstr "" ++ ++msgid "Password" ++msgstr "" ++ ++msgid "Path to CA-Certificate" ++msgstr "" ++ ++msgid "Please [Save & Apply] your changes first" ++msgstr "" ++ ++msgid "Please press [Read] button" ++msgstr "" ++ ++msgid "Please update to the current version!" ++msgstr "" ++ ++msgid "Process ID" ++msgstr "" ++ ++msgid "Read / Reread log file" ++msgstr "" ++ ++msgid "Registered IP" ++msgstr "" ++ ++msgid "Replaces [DOMAIN] in Update-URL" ++msgstr "" ++ ++msgid "Replaces [PASSWORD] in Update-URL" ++msgstr "" ++ ++msgid "Replaces [USERNAME] in Update-URL" ++msgstr "" ++ ++msgid "Run once" ++msgstr "" ++ ++msgid "Script" ++msgstr "" ++ ++msgid "Show more" ++msgstr "" ++ ++msgid "Software update required" ++msgstr "" ++ ++msgid "Start" ++msgstr "" ++ ++msgid "Start / Stop" ++msgstr "" ++ ++msgid "Status directory" ++msgstr "" ++ ++msgid "Stopped" ++msgstr "" ++ ++msgid "" ++"The currently installed 'ddns-scripts' package did not support all available " ++"settings." ++msgstr "" ++ ++msgid "There is no service configured." ++msgstr "" ++ ++msgid "Timer Settings" ++msgstr "" ++ ++msgid "To change global settings click here" ++msgstr "" ++ ++msgid "To use cURL activate this option." ++msgstr "" ++ ++msgid "URL" ++msgstr "" ++ ++msgid "URL to detect" ++msgstr "" ++ ++msgid "Unknown error" ++msgstr "" ++ ++msgid "" ++"Update URL to be used for updating your DDNS Provider.
    Follow " ++"instructions you will find on their WEB page." ++msgstr "" ++ ++msgid "Update error" ++msgstr "" ++ ++msgid "Use HTTP Secure" ++msgstr "" ++ ++msgid "Use cURL" ++msgstr "" ++ ++msgid "User defined script to read systems IP-Address" ++msgstr "" ++ ++msgid "Username" ++msgstr "" ++ ++msgid "Verify" ++msgstr "" ++ ++msgid "Version" ++msgstr "" ++ ++msgid "Version Information" ++msgstr "" ++ ++msgid "Waiting for changes to be applied..." ++msgstr "" ++ ++msgid "Warning" ++msgstr "" ++ ++msgid "" ++"Writes detailed messages to log file. File will be truncated automatically." ++msgstr "" ++ ++msgid "" ++"Writes log messages to syslog. Critical Errors will always be written to " ++"syslog." ++msgstr "" ++ ++msgid "You should install BIND host package for DNS requests." ++msgstr "" ++ ++msgid "You should install GNU Wget with SSL (prefered) or cURL package." ++msgstr "" ++ ++msgid "You should install GNU Wget with SSL or cURL package." ++msgstr "" ++ ++msgid "You should install GNU Wget with SSL or replace libcurl." ++msgstr "" ++ ++msgid "cURL is installed, but libcurl was compiled without proxy support." ++msgstr "" ++ ++msgid "cURL without Proxy Support" ++msgstr "" ++ ++msgid "can not detect local IP. Please select a different Source combination" ++msgstr "" ++ ++msgid "can not resolve host:" ++msgstr "" ++ ++msgid "config error" ++msgstr "" ++ ++msgid "days" ++msgstr "" ++ ++msgid "directory or path/file" ++msgstr "" ++ ++msgid "either url or script could be set" ++msgstr "" ++ ++msgid "enable here" ++msgstr "" ++ ++msgid "file or directory not found or not 'IGNORE'" ++msgstr "" ++ ++msgid "help" ++msgstr "" ++ ++msgid "hours" ++msgstr "" ++ ++msgid "installed" ++msgstr "" ++ ++msgid "invalid - Sample" ++msgstr "" ++ ++msgid "minimum value '0'" ++msgstr "" ++ ++msgid "minimum value '1'" ++msgstr "" ++ ++msgid "minimum value 5 minutes == 300 seconds" ++msgstr "" ++ ++msgid "minutes" ++msgstr "" ++ ++msgid "missing / required" ++msgstr "" ++ ++msgid "must be greater or equal 'Check Interval'" ++msgstr "" ++ ++msgid "must start with 'http://'" ++msgstr "" ++ ++msgid "nc (netcat) can not connect" ++msgstr "" ++ ++msgid "never" ++msgstr "" ++ ++msgid "no data" ++msgstr "" ++ ++msgid "not found or not executable - Sample: '/path/to/script.sh'" ++msgstr "" ++ ++msgid "nslookup can not resolve host" ++msgstr "" ++ ++msgid "or" ++msgstr "" ++ ++msgid "or higher" ++msgstr "" ++ ++msgid "please disable" ++msgstr "" ++ ++msgid "please remove entry" ++msgstr "" ++ ++msgid "please select 'IPv4' address version" ++msgstr "" ++ ++msgid "please select 'IPv4' address version in" ++msgstr "" ++ ++msgid "please set to 'default'" ++msgstr "" ++ ++msgid "proxy port missing" ++msgstr "" ++ ++msgid "required" ++msgstr "" ++ ++msgid "seconds" ++msgstr "" ++ ++msgid "to run HTTPS without verification of server certificates (insecure)" ++msgstr "" ++ ++msgid "unknown error" ++msgstr "" ++ ++msgid "unspecific error" ++msgstr "" ++ ++msgid "use hostname, FQDN, IPv4- or IPv6-Address" ++msgstr "" +diff --git a/feeds/luci/applications/luci-app-ddns/po/no/ddns.po b/feeds/luci/applications/luci-app-ddns/po/no/ddns.po +new file mode 100644 +index 0000000..b805aa4 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-ddns/po/no/ddns.po +@@ -0,0 +1,686 @@ ++msgid "" ++msgstr "" ++"Last-Translator: Lars Hardy \n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++ ++msgid "&" ++msgstr "" ++ ++msgid "-- custom --" ++msgstr "" ++ ++msgid "-- default --" ++msgstr "" ++ ++msgid "Advanced Settings" ++msgstr "" ++ ++msgid "Allow non-public IP's" ++msgstr "" ++ ++msgid "Applying changes" ++msgstr "" ++ ++msgid "Basic Settings" ++msgstr "" ++ ++msgid "" ++"Below a list of configuration tips for your system to run Dynamic DNS " ++"updates without limitations" ++msgstr "" ++ ++msgid "" ++"Below is a list of configured DDNS configurations and their current state." ++msgstr "" ++ ++msgid "Bind Network" ++msgstr "" ++ ++msgid "Binding to a specific network not supported" ++msgstr "" ++ ++msgid "" ++"BusyBox's nslookup and Wget do not support to specify the IP version to use " ++"for communication with DDNS Provider." ++msgstr "" ++ ++msgid "" ++"BusyBox's nslookup does not support to specify to use TCP instead of default " ++"UDP when requesting DNS server" ++msgstr "" ++ ++msgid "Casual users should not change this setting" ++msgstr "" ++ ++msgid "Check Interval" ++msgstr "" ++ ++msgid "Collecting data..." ++msgstr "" ++ ++msgid "Config error" ++msgstr "" ++ ++msgid "Configuration" ++msgstr "" ++ ++msgid "" ++"Configure here the details for all Dynamic DNS services including this LuCI " ++"application." ++msgstr "" ++ ++msgid "Configure here the details for selected Dynamic DNS service." ++msgstr "" ++ ++msgid "Current setting" ++msgstr "" ++ ++msgid "" ++"Currently DDNS updates are not started at boot or on interface events.
    This is the default if you run DDNS scripts by yourself (i.e. via cron with " ++"force_interval set to '0')" ++msgstr "" ++ ++msgid "" ++"Currently DDNS updates are not started at boot or on interface events.
    You can start/stop each configuration here. It will run until next reboot." ++msgstr "" ++ ++msgid "Custom update script to be used for updating your DDNS Provider." ++msgstr "" ++ ++msgid "Custom update-URL" ++msgstr "Egendefinert oppdaterings-URL" ++ ++msgid "Custom update-script" ++msgstr "" ++ ++msgid "DDNS Autostart disabled" ++msgstr "" ++ ++msgid "DDNS Service provider" ++msgstr "" ++ ++msgid "DNS requests via TCP not supported" ++msgstr "" ++ ++msgid "DNS-Server" ++msgstr "" ++ ++msgid "Date format" ++msgstr "" ++ ++msgid "Defines the Web page to read systems IPv4-Address from" ++msgstr "" ++ ++msgid "Defines the Web page to read systems IPv6-Address from" ++msgstr "" ++ ++msgid "Defines the interface to read systems IP-Address from" ++msgstr "" ++ ++msgid "Defines the network to read systems IPv4-Address from" ++msgstr "" ++ ++msgid "Defines the network to read systems IPv6-Address from" ++msgstr "" ++ ++msgid "" ++"Defines the source to read systems IPv4-Address from, that will be send to " ++"the DDNS provider" ++msgstr "" ++ ++msgid "" ++"Defines the source to read systems IPv6-Address from, that will be send to " ++"the DDNS provider" ++msgstr "" ++ ++msgid "Defines which IP address 'IPv4/IPv6' is send to the DDNS provider" ++msgstr "" ++ ++msgid "Details for" ++msgstr "" ++ ++msgid "Directory contains Log files for each running section" ++msgstr "" ++ ++msgid "" ++"Directory contains PID and other status information for each running section" ++msgstr "" ++ ++msgid "Disabled" ++msgstr "" ++ ++msgid "Dynamic DNS" ++msgstr "Dynamisk DNS" ++ ++msgid "" ++"Dynamic DNS allows that your router can be reached with a fixed hostname " ++"while having a dynamically changing IP address." ++msgstr "" ++"Dynamisk DNS tillater at enheten kan kontaktes ved hjelp av et fast " ++"vertsnavn, uavhengig av om IP adressen endres dynamisk." ++ ++msgid "Enable secure communication with DDNS provider" ++msgstr "" ++ ++msgid "Enabled" ++msgstr "" ++ ++msgid "Error" ++msgstr "" ++ ++msgid "Error Retry Counter" ++msgstr "" ++ ++msgid "Error Retry Interval" ++msgstr "" ++ ++msgid "Event Network" ++msgstr "" ++ ++msgid "File" ++msgstr "" ++ ++msgid "File not found" ++msgstr "" ++ ++msgid "File not found or empty" ++msgstr "" ++ ++msgid "" ++"Follow this link
    You will find more hints to optimize your system to " ++"run DDNS scripts with all options" ++msgstr "" ++ ++msgid "For detailed information about parameter settings look here." ++msgstr "" ++ ++msgid "For supported codes look here" ++msgstr "" ++ ++msgid "Force IP Version" ++msgstr "" ++ ++msgid "Force IP Version not supported" ++msgstr "" ++ ++msgid "Force Interval" ++msgstr "" ++ ++msgid "Force TCP on DNS" ++msgstr "" ++ ++msgid "Forced IP Version don't matched" ++msgstr "" ++ ++msgid "Format" ++msgstr "" ++ ++msgid "Format: IP or FQDN" ++msgstr "" ++ ++msgid "" ++"GNU Wget will use the IP of given network, cURL will use the physical " ++"interface." ++msgstr "" ++ ++msgid "Global Settings" ++msgstr "" ++ ++msgid "HTTPS not supported" ++msgstr "" ++ ++msgid "Hints" ++msgstr "" ++ ++msgid "Hostname/Domain" ++msgstr "" ++ ++msgid "IP address source" ++msgstr "" ++ ++msgid "IP address version" ++msgstr "" ++ ++msgid "IPv4-Address" ++msgstr "" ++ ++msgid "IPv6 address must be given in square brackets" ++msgstr "" ++ ++msgid "" ++"IPv6 is currently not (fully) supported by this system
    Please follow " ++"the instructions on OpenWrt's homepage to enable IPv6 support
    or update " ++"your system to the latest OpenWrt Release" ++msgstr "" ++ ++msgid "IPv6 not supported" ++msgstr "" ++ ++msgid "IPv6-Address" ++msgstr "" ++ ++msgid "If both cURL and GNU Wget are installed, Wget is used by default." ++msgstr "" ++ ++msgid "" ++"If this service section is disabled it could not be started.
    Neither " ++"from LuCI interface nor from console" ++msgstr "" ++ ++msgid "" ++"If you want to send updates for IPv4 and IPv6 you need to define two " ++"separate Configurations i.e. 'myddns_ipv4' and 'myddns_ipv6'" ++msgstr "" ++ ++msgid "" ++"In some versions cURL/libcurl in OpenWrt is compiled without proxy support." ++msgstr "" ++ ++msgid "Info" ++msgstr "" ++ ++msgid "Interface" ++msgstr "Grensesnitt" ++ ++msgid "" ++"Interval to check for changed IP
    Values below 5 minutes == 300 seconds " ++"are not supported" ++msgstr "" ++ ++msgid "" ++"Interval to force updates send to DDNS Provider
    Setting this parameter " ++"to 0 will force the script to only run once
    Values lower 'Check " ++"Interval' except '0' are not supported" ++msgstr "" ++ ++msgid "It is NOT recommended for casual users to change settings on this page." ++msgstr "" ++ ++msgid "Last Update" ++msgstr "" ++ ++msgid "Loading" ++msgstr "" ++ ++msgid "Log File Viewer" ++msgstr "" ++ ++msgid "Log directory" ++msgstr "" ++ ++msgid "Log length" ++msgstr "" ++ ++msgid "Log to file" ++msgstr "" ++ ++msgid "Log to syslog" ++msgstr "" ++ ++msgid "" ++"Neither GNU Wget with SSL nor cURL installed to select a network to use for " ++"communication." ++msgstr "" ++ ++msgid "" ++"Neither GNU Wget with SSL nor cURL installed to support updates via HTTPS " ++"protocol." ++msgstr "" ++ ++msgid "Network" ++msgstr "Nettverk" ++ ++msgid "Network on which the ddns-updater scripts will be started" ++msgstr "" ++ ++msgid "Never" ++msgstr "" ++ ++msgid "Next Update" ++msgstr "" ++ ++msgid "No data" ++msgstr "" ++ ++msgid "No logging" ++msgstr "" ++ ++msgid "Non-public and by default blocked IP's" ++msgstr "" ++ ++msgid "Notice" ++msgstr "" ++ ++msgid "Number of last lines stored in log files" ++msgstr "" ++ ++msgid "OPTIONAL: Force the usage of pure IPv4/IPv6 only communication." ++msgstr "" ++ ++msgid "OPTIONAL: Force the use of TCP instead of default UDP on DNS requests." ++msgstr "" ++ ++msgid "OPTIONAL: Network to use for communication" ++msgstr "" ++ ++msgid "OPTIONAL: Proxy-Server for detection and updates." ++msgstr "" ++ ++msgid "OPTIONAL: Use non-default DNS-Server to detect 'Registered IP'." ++msgstr "" ++ ++msgid "On Error the script will retry the failed action after given time" ++msgstr "" ++ ++msgid "On Error the script will stop execution after given number of retrys" ++msgstr "" ++ ++msgid "Overview" ++msgstr "" ++ ++msgid "PROXY-Server" ++msgstr "" ++ ++msgid "PROXY-Server not supported" ++msgstr "" ++ ++msgid "Password" ++msgstr "Passord" ++ ++msgid "Path to CA-Certificate" ++msgstr "" ++ ++msgid "Please [Save & Apply] your changes first" ++msgstr "" ++ ++msgid "Please press [Read] button" ++msgstr "" ++ ++msgid "Please update to the current version!" ++msgstr "" ++ ++msgid "Process ID" ++msgstr "" ++ ++msgid "Read / Reread log file" ++msgstr "" ++ ++msgid "Registered IP" ++msgstr "" ++ ++msgid "Replaces [DOMAIN] in Update-URL" ++msgstr "" ++ ++msgid "Replaces [PASSWORD] in Update-URL" ++msgstr "" ++ ++msgid "Replaces [USERNAME] in Update-URL" ++msgstr "" ++ ++msgid "Run once" ++msgstr "" ++ ++msgid "Script" ++msgstr "" ++ ++msgid "Show more" ++msgstr "" ++ ++msgid "Software update required" ++msgstr "" ++ ++msgid "Start" ++msgstr "" ++ ++msgid "Start / Stop" ++msgstr "" ++ ++msgid "Status directory" ++msgstr "" ++ ++msgid "Stopped" ++msgstr "" ++ ++msgid "" ++"The currently installed 'ddns-scripts' package did not support all available " ++"settings." ++msgstr "" ++ ++msgid "There is no service configured." ++msgstr "" ++ ++msgid "Timer Settings" ++msgstr "" ++ ++msgid "To change global settings click here" ++msgstr "" ++ ++msgid "To use cURL activate this option." ++msgstr "" ++ ++msgid "URL" ++msgstr "URL" ++ ++msgid "URL to detect" ++msgstr "" ++ ++msgid "Unknown error" ++msgstr "" ++ ++msgid "" ++"Update URL to be used for updating your DDNS Provider.
    Follow " ++"instructions you will find on their WEB page." ++msgstr "" ++ ++msgid "Update error" ++msgstr "" ++ ++msgid "Use HTTP Secure" ++msgstr "" ++ ++msgid "Use cURL" ++msgstr "" ++ ++msgid "User defined script to read systems IP-Address" ++msgstr "" ++ ++msgid "Username" ++msgstr "Brukernavn" ++ ++msgid "Verify" ++msgstr "" ++ ++msgid "Version" ++msgstr "" ++ ++msgid "Version Information" ++msgstr "" ++ ++msgid "Waiting for changes to be applied..." ++msgstr "" ++ ++msgid "Warning" ++msgstr "" ++ ++msgid "" ++"Writes detailed messages to log file. File will be truncated automatically." ++msgstr "" ++ ++msgid "" ++"Writes log messages to syslog. Critical Errors will always be written to " ++"syslog." ++msgstr "" ++ ++msgid "You should install BIND host package for DNS requests." ++msgstr "" ++ ++msgid "You should install GNU Wget with SSL (prefered) or cURL package." ++msgstr "" ++ ++msgid "You should install GNU Wget with SSL or cURL package." ++msgstr "" ++ ++msgid "You should install GNU Wget with SSL or replace libcurl." ++msgstr "" ++ ++msgid "cURL is installed, but libcurl was compiled without proxy support." ++msgstr "" ++ ++msgid "cURL without Proxy Support" ++msgstr "" ++ ++msgid "can not detect local IP. Please select a different Source combination" ++msgstr "" ++ ++msgid "can not resolve host:" ++msgstr "" ++ ++msgid "config error" ++msgstr "" ++ ++msgid "days" ++msgstr "" ++ ++msgid "directory or path/file" ++msgstr "" ++ ++msgid "either url or script could be set" ++msgstr "" ++ ++msgid "enable here" ++msgstr "" ++ ++msgid "file or directory not found or not 'IGNORE'" ++msgstr "" ++ ++msgid "help" ++msgstr "" ++ ++msgid "hours" ++msgstr "" ++ ++msgid "installed" ++msgstr "" ++ ++msgid "invalid - Sample" ++msgstr "" ++ ++msgid "minimum value '0'" ++msgstr "" ++ ++msgid "minimum value '1'" ++msgstr "" ++ ++msgid "minimum value 5 minutes == 300 seconds" ++msgstr "" ++ ++msgid "minutes" ++msgstr "" ++ ++msgid "missing / required" ++msgstr "" ++ ++msgid "must be greater or equal 'Check Interval'" ++msgstr "" ++ ++msgid "must start with 'http://'" ++msgstr "" ++ ++msgid "nc (netcat) can not connect" ++msgstr "" ++ ++msgid "never" ++msgstr "" ++ ++msgid "no data" ++msgstr "" ++ ++msgid "not found or not executable - Sample: '/path/to/script.sh'" ++msgstr "" ++ ++msgid "nslookup can not resolve host" ++msgstr "" ++ ++msgid "or" ++msgstr "" ++ ++msgid "or higher" ++msgstr "" ++ ++msgid "please disable" ++msgstr "" ++ ++msgid "please remove entry" ++msgstr "" ++ ++msgid "please select 'IPv4' address version" ++msgstr "" ++ ++msgid "please select 'IPv4' address version in" ++msgstr "" ++ ++msgid "please set to 'default'" ++msgstr "" ++ ++msgid "proxy port missing" ++msgstr "" ++ ++msgid "required" ++msgstr "" ++ ++msgid "seconds" ++msgstr "" ++ ++msgid "to run HTTPS without verification of server certificates (insecure)" ++msgstr "" ++ ++msgid "unknown error" ++msgstr "" ++ ++msgid "unspecific error" ++msgstr "" ++ ++msgid "use hostname, FQDN, IPv4- or IPv6-Address" ++msgstr "" ++ ++#~ msgid "Check for changed IP every" ++#~ msgstr "Undersøk om IP er endret hver" ++ ++#~ msgid "Check-time unit" ++#~ msgstr "Tidsenhet" ++ ++#~ msgid "Enable" ++#~ msgstr "Aktiver" ++ ++#~ msgid "Force update every" ++#~ msgstr "Tving oppdatering hver" ++ ++#~ msgid "Force-time unit" ++#~ msgstr "Tidsenhet" ++ ++#~ msgid "Hostname" ++#~ msgstr "Vertsnavn" ++ ++#~ msgid "Service" ++#~ msgstr "Tjeneste" ++ ++#~ msgid "Source of IP address" ++#~ msgstr "Kilden til IP adresse" ++ ++#~ msgid "custom" ++#~ msgstr "egendefinert" ++ ++#~ msgid "h" ++#~ msgstr "timer" ++ ++#~ msgid "interface" ++#~ msgstr "grensesnitt" ++ ++#~ msgid "min" ++#~ msgstr "minutter" ++ ++#~ msgid "network" ++#~ msgstr "nettverk" +diff --git a/feeds/luci/applications/luci-app-ddns/po/pl/ddns.po b/feeds/luci/applications/luci-app-ddns/po/pl/ddns.po +new file mode 100644 +index 0000000..e016cc4 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-ddns/po/pl/ddns.po +@@ -0,0 +1,704 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Report-Msgid-Bugs-To: \n" ++"POT-Creation-Date: 2010-04-02 13:44+0100\n" ++"PO-Revision-Date: 2013-01-06 13:08+0200\n" ++"Last-Translator: obsy \n" ++"Language-Team: LANGUAGE \n" ++"Language: pl\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 " ++"|| n%100>=20) ? 1 : 2);\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "&" ++msgstr "" ++ ++msgid "-- custom --" ++msgstr "" ++ ++msgid "-- default --" ++msgstr "" ++ ++msgid "Advanced Settings" ++msgstr "" ++ ++msgid "Allow non-public IP's" ++msgstr "" ++ ++msgid "Applying changes" ++msgstr "" ++ ++msgid "Basic Settings" ++msgstr "" ++ ++msgid "" ++"Below a list of configuration tips for your system to run Dynamic DNS " ++"updates without limitations" ++msgstr "" ++ ++msgid "" ++"Below is a list of configured DDNS configurations and their current state." ++msgstr "" ++ ++msgid "Bind Network" ++msgstr "" ++ ++msgid "Binding to a specific network not supported" ++msgstr "" ++ ++msgid "" ++"BusyBox's nslookup and Wget do not support to specify the IP version to use " ++"for communication with DDNS Provider." ++msgstr "" ++ ++msgid "" ++"BusyBox's nslookup does not support to specify to use TCP instead of default " ++"UDP when requesting DNS server" ++msgstr "" ++ ++msgid "Casual users should not change this setting" ++msgstr "" ++ ++msgid "Check Interval" ++msgstr "" ++ ++msgid "Collecting data..." ++msgstr "" ++ ++msgid "Config error" ++msgstr "" ++ ++msgid "Configuration" ++msgstr "" ++ ++msgid "" ++"Configure here the details for all Dynamic DNS services including this LuCI " ++"application." ++msgstr "" ++ ++msgid "Configure here the details for selected Dynamic DNS service." ++msgstr "" ++ ++msgid "Current setting" ++msgstr "" ++ ++msgid "" ++"Currently DDNS updates are not started at boot or on interface events.
    This is the default if you run DDNS scripts by yourself (i.e. via cron with " ++"force_interval set to '0')" ++msgstr "" ++ ++msgid "" ++"Currently DDNS updates are not started at boot or on interface events.
    You can start/stop each configuration here. It will run until next reboot." ++msgstr "" ++ ++msgid "Custom update script to be used for updating your DDNS Provider." ++msgstr "" ++ ++msgid "Custom update-URL" ++msgstr "Niestandardowy adres aktualizacyjny" ++ ++msgid "Custom update-script" ++msgstr "" ++ ++msgid "DDNS Autostart disabled" ++msgstr "" ++ ++msgid "DDNS Service provider" ++msgstr "" ++ ++msgid "DNS requests via TCP not supported" ++msgstr "" ++ ++msgid "DNS-Server" ++msgstr "" ++ ++msgid "Date format" ++msgstr "" ++ ++msgid "Defines the Web page to read systems IPv4-Address from" ++msgstr "" ++ ++msgid "Defines the Web page to read systems IPv6-Address from" ++msgstr "" ++ ++msgid "Defines the interface to read systems IP-Address from" ++msgstr "" ++ ++msgid "Defines the network to read systems IPv4-Address from" ++msgstr "" ++ ++msgid "Defines the network to read systems IPv6-Address from" ++msgstr "" ++ ++msgid "" ++"Defines the source to read systems IPv4-Address from, that will be send to " ++"the DDNS provider" ++msgstr "" ++ ++msgid "" ++"Defines the source to read systems IPv6-Address from, that will be send to " ++"the DDNS provider" ++msgstr "" ++ ++msgid "Defines which IP address 'IPv4/IPv6' is send to the DDNS provider" ++msgstr "" ++ ++msgid "Details for" ++msgstr "" ++ ++msgid "Directory contains Log files for each running section" ++msgstr "" ++ ++msgid "" ++"Directory contains PID and other status information for each running section" ++msgstr "" ++ ++msgid "Disabled" ++msgstr "" ++ ++msgid "Dynamic DNS" ++msgstr "Dynamiczny DNS" ++ ++msgid "" ++"Dynamic DNS allows that your router can be reached with a fixed hostname " ++"while having a dynamically changing IP address." ++msgstr "" ++"Dynamiczny DNS umożliwia dostęp do routera z użyciem stałej nazwy hosta, " ++"pomimo posiadania dynamicznie zmieniającego się adresu IP." ++ ++msgid "Enable secure communication with DDNS provider" ++msgstr "" ++ ++msgid "Enabled" ++msgstr "" ++ ++msgid "Error" ++msgstr "" ++ ++msgid "Error Retry Counter" ++msgstr "" ++ ++msgid "Error Retry Interval" ++msgstr "" ++ ++msgid "Event Network" ++msgstr "" ++ ++msgid "File" ++msgstr "" ++ ++msgid "File not found" ++msgstr "" ++ ++msgid "File not found or empty" ++msgstr "" ++ ++msgid "" ++"Follow this link
    You will find more hints to optimize your system to " ++"run DDNS scripts with all options" ++msgstr "" ++ ++msgid "For detailed information about parameter settings look here." ++msgstr "" ++ ++msgid "For supported codes look here" ++msgstr "" ++ ++msgid "Force IP Version" ++msgstr "" ++ ++msgid "Force IP Version not supported" ++msgstr "" ++ ++msgid "Force Interval" ++msgstr "" ++ ++msgid "Force TCP on DNS" ++msgstr "" ++ ++msgid "Forced IP Version don't matched" ++msgstr "" ++ ++msgid "Format" ++msgstr "" ++ ++msgid "Format: IP or FQDN" ++msgstr "" ++ ++msgid "" ++"GNU Wget will use the IP of given network, cURL will use the physical " ++"interface." ++msgstr "" ++ ++msgid "Global Settings" ++msgstr "" ++ ++msgid "HTTPS not supported" ++msgstr "" ++ ++msgid "Hints" ++msgstr "" ++ ++msgid "Hostname/Domain" ++msgstr "" ++ ++msgid "IP address source" ++msgstr "" ++ ++msgid "IP address version" ++msgstr "" ++ ++msgid "IPv4-Address" ++msgstr "" ++ ++msgid "IPv6 address must be given in square brackets" ++msgstr "" ++ ++msgid "" ++"IPv6 is currently not (fully) supported by this system
    Please follow " ++"the instructions on OpenWrt's homepage to enable IPv6 support
    or update " ++"your system to the latest OpenWrt Release" ++msgstr "" ++ ++msgid "IPv6 not supported" ++msgstr "" ++ ++msgid "IPv6-Address" ++msgstr "" ++ ++msgid "If both cURL and GNU Wget are installed, Wget is used by default." ++msgstr "" ++ ++msgid "" ++"If this service section is disabled it could not be started.
    Neither " ++"from LuCI interface nor from console" ++msgstr "" ++ ++msgid "" ++"If you want to send updates for IPv4 and IPv6 you need to define two " ++"separate Configurations i.e. 'myddns_ipv4' and 'myddns_ipv6'" ++msgstr "" ++ ++msgid "" ++"In some versions cURL/libcurl in OpenWrt is compiled without proxy support." ++msgstr "" ++ ++msgid "Info" ++msgstr "" ++ ++msgid "Interface" ++msgstr "Interfejs" ++ ++msgid "" ++"Interval to check for changed IP
    Values below 5 minutes == 300 seconds " ++"are not supported" ++msgstr "" ++ ++msgid "" ++"Interval to force updates send to DDNS Provider
    Setting this parameter " ++"to 0 will force the script to only run once
    Values lower 'Check " ++"Interval' except '0' are not supported" ++msgstr "" ++ ++msgid "It is NOT recommended for casual users to change settings on this page." ++msgstr "" ++ ++msgid "Last Update" ++msgstr "" ++ ++msgid "Loading" ++msgstr "" ++ ++msgid "Log File Viewer" ++msgstr "" ++ ++msgid "Log directory" ++msgstr "" ++ ++msgid "Log length" ++msgstr "" ++ ++msgid "Log to file" ++msgstr "" ++ ++msgid "Log to syslog" ++msgstr "" ++ ++msgid "" ++"Neither GNU Wget with SSL nor cURL installed to select a network to use for " ++"communication." ++msgstr "" ++ ++msgid "" ++"Neither GNU Wget with SSL nor cURL installed to support updates via HTTPS " ++"protocol." ++msgstr "" ++ ++msgid "Network" ++msgstr "Sieć" ++ ++msgid "Network on which the ddns-updater scripts will be started" ++msgstr "" ++ ++msgid "Never" ++msgstr "" ++ ++msgid "Next Update" ++msgstr "" ++ ++msgid "No data" ++msgstr "" ++ ++msgid "No logging" ++msgstr "" ++ ++msgid "Non-public and by default blocked IP's" ++msgstr "" ++ ++msgid "Notice" ++msgstr "" ++ ++msgid "Number of last lines stored in log files" ++msgstr "" ++ ++msgid "OPTIONAL: Force the usage of pure IPv4/IPv6 only communication." ++msgstr "" ++ ++msgid "OPTIONAL: Force the use of TCP instead of default UDP on DNS requests." ++msgstr "" ++ ++msgid "OPTIONAL: Network to use for communication" ++msgstr "" ++ ++msgid "OPTIONAL: Proxy-Server for detection and updates." ++msgstr "" ++ ++msgid "OPTIONAL: Use non-default DNS-Server to detect 'Registered IP'." ++msgstr "" ++ ++msgid "On Error the script will retry the failed action after given time" ++msgstr "" ++ ++msgid "On Error the script will stop execution after given number of retrys" ++msgstr "" ++ ++msgid "Overview" ++msgstr "" ++ ++msgid "PROXY-Server" ++msgstr "" ++ ++msgid "PROXY-Server not supported" ++msgstr "" ++ ++msgid "Password" ++msgstr "Hasło" ++ ++msgid "Path to CA-Certificate" ++msgstr "" ++ ++msgid "Please [Save & Apply] your changes first" ++msgstr "" ++ ++msgid "Please press [Read] button" ++msgstr "" ++ ++msgid "Please update to the current version!" ++msgstr "" ++ ++msgid "Process ID" ++msgstr "" ++ ++msgid "Read / Reread log file" ++msgstr "" ++ ++msgid "Registered IP" ++msgstr "" ++ ++msgid "Replaces [DOMAIN] in Update-URL" ++msgstr "" ++ ++msgid "Replaces [PASSWORD] in Update-URL" ++msgstr "" ++ ++msgid "Replaces [USERNAME] in Update-URL" ++msgstr "" ++ ++msgid "Run once" ++msgstr "" ++ ++msgid "Script" ++msgstr "" ++ ++msgid "Show more" ++msgstr "" ++ ++msgid "Software update required" ++msgstr "" ++ ++msgid "Start" ++msgstr "" ++ ++msgid "Start / Stop" ++msgstr "" ++ ++msgid "Status directory" ++msgstr "" ++ ++msgid "Stopped" ++msgstr "" ++ ++msgid "" ++"The currently installed 'ddns-scripts' package did not support all available " ++"settings." ++msgstr "" ++ ++msgid "There is no service configured." ++msgstr "" ++ ++msgid "Timer Settings" ++msgstr "" ++ ++msgid "To change global settings click here" ++msgstr "" ++ ++msgid "To use cURL activate this option." ++msgstr "" ++ ++msgid "URL" ++msgstr "URL" ++ ++msgid "URL to detect" ++msgstr "" ++ ++msgid "Unknown error" ++msgstr "" ++ ++msgid "" ++"Update URL to be used for updating your DDNS Provider.
    Follow " ++"instructions you will find on their WEB page." ++msgstr "" ++ ++msgid "Update error" ++msgstr "" ++ ++msgid "Use HTTP Secure" ++msgstr "" ++ ++msgid "Use cURL" ++msgstr "" ++ ++msgid "User defined script to read systems IP-Address" ++msgstr "" ++ ++msgid "Username" ++msgstr "Nazwa użytkownika" ++ ++msgid "Verify" ++msgstr "" ++ ++msgid "Version" ++msgstr "" ++ ++msgid "Version Information" ++msgstr "" ++ ++msgid "Waiting for changes to be applied..." ++msgstr "" ++ ++msgid "Warning" ++msgstr "" ++ ++msgid "" ++"Writes detailed messages to log file. File will be truncated automatically." ++msgstr "" ++ ++msgid "" ++"Writes log messages to syslog. Critical Errors will always be written to " ++"syslog." ++msgstr "" ++ ++msgid "You should install BIND host package for DNS requests." ++msgstr "" ++ ++msgid "You should install GNU Wget with SSL (prefered) or cURL package." ++msgstr "" ++ ++msgid "You should install GNU Wget with SSL or cURL package." ++msgstr "" ++ ++msgid "You should install GNU Wget with SSL or replace libcurl." ++msgstr "" ++ ++msgid "cURL is installed, but libcurl was compiled without proxy support." ++msgstr "" ++ ++msgid "cURL without Proxy Support" ++msgstr "" ++ ++msgid "can not detect local IP. Please select a different Source combination" ++msgstr "" ++ ++msgid "can not resolve host:" ++msgstr "" ++ ++msgid "config error" ++msgstr "" ++ ++msgid "days" ++msgstr "" ++ ++msgid "directory or path/file" ++msgstr "" ++ ++msgid "either url or script could be set" ++msgstr "" ++ ++msgid "enable here" ++msgstr "" ++ ++msgid "file or directory not found or not 'IGNORE'" ++msgstr "" ++ ++msgid "help" ++msgstr "" ++ ++msgid "hours" ++msgstr "" ++ ++msgid "installed" ++msgstr "" ++ ++msgid "invalid - Sample" ++msgstr "" ++ ++msgid "minimum value '0'" ++msgstr "" ++ ++msgid "minimum value '1'" ++msgstr "" ++ ++msgid "minimum value 5 minutes == 300 seconds" ++msgstr "" ++ ++msgid "minutes" ++msgstr "" ++ ++msgid "missing / required" ++msgstr "" ++ ++msgid "must be greater or equal 'Check Interval'" ++msgstr "" ++ ++msgid "must start with 'http://'" ++msgstr "" ++ ++msgid "nc (netcat) can not connect" ++msgstr "" ++ ++msgid "never" ++msgstr "" ++ ++msgid "no data" ++msgstr "" ++ ++msgid "not found or not executable - Sample: '/path/to/script.sh'" ++msgstr "" ++ ++msgid "nslookup can not resolve host" ++msgstr "" ++ ++msgid "or" ++msgstr "" ++ ++msgid "or higher" ++msgstr "" ++ ++msgid "please disable" ++msgstr "" ++ ++msgid "please remove entry" ++msgstr "" ++ ++msgid "please select 'IPv4' address version" ++msgstr "" ++ ++msgid "please select 'IPv4' address version in" ++msgstr "" ++ ++msgid "please set to 'default'" ++msgstr "" ++ ++msgid "proxy port missing" ++msgstr "" ++ ++msgid "required" ++msgstr "" ++ ++msgid "seconds" ++msgstr "" ++ ++msgid "to run HTTPS without verification of server certificates (insecure)" ++msgstr "" ++ ++msgid "unknown error" ++msgstr "" ++ ++msgid "unspecific error" ++msgstr "" ++ ++msgid "use hostname, FQDN, IPv4- or IPv6-Address" ++msgstr "" ++ ++#~ msgid "Check for changed IP every" ++#~ msgstr "Sprawdzaj zmiany adresu IP co" ++ ++#~ msgid "Check-time unit" ++#~ msgstr "Jednostka czasu sprawdzania" ++ ++#~ msgid "Enable" ++#~ msgstr "Włącz" ++ ++#~ msgid "Force update every" ++#~ msgstr "Wymuszaj aktualizację co" ++ ++#~ msgid "Force-time unit" ++#~ msgstr "Jednostka czasu wymuszania" ++ ++#~ msgid "Hostname" ++#~ msgstr "Nazwa hosta" ++ ++#~ msgid "Service" ++#~ msgstr "Usługa" ++ ++#~ msgid "Source of IP address" ++#~ msgstr "Źródło adresu IP" ++ ++#~ msgid "custom" ++#~ msgstr "niestandardowe" ++ ++# Hours ++#~ msgid "h" ++#~ msgstr "godz." ++ ++#~ msgid "interface" ++#~ msgstr "interfejs" ++ ++# Minutes (not minimum) ++#~ msgid "min" ++#~ msgstr "min" ++ ++#~ msgid "network" ++#~ msgstr "sieć" ++ ++#~ msgid "Event interface" ++#~ msgstr "Interfejs" ++ ++#~ msgid "On which interface up should start the ddns script process." ++#~ msgstr "Określa interfejs na którym zostanie uruchomiony skrypt ddns." +diff --git a/feeds/luci/applications/luci-app-ddns/po/pt-br/ddns.po b/feeds/luci/applications/luci-app-ddns/po/pt-br/ddns.po +new file mode 100644 +index 0000000..df2fff5 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-ddns/po/pt-br/ddns.po +@@ -0,0 +1,705 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Report-Msgid-Bugs-To: \n" ++"POT-Creation-Date: 2010-04-02 13:44+0100\n" ++"PO-Revision-Date: 2012-11-03 07:02+0200\n" ++"Last-Translator: Luiz Angelo \n" ++"Language-Team: LANGUAGE \n" ++"Language: pt_BR\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n > 1);\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "&" ++msgstr "" ++ ++msgid "-- custom --" ++msgstr "" ++ ++msgid "-- default --" ++msgstr "" ++ ++msgid "Advanced Settings" ++msgstr "" ++ ++msgid "Allow non-public IP's" ++msgstr "" ++ ++msgid "Applying changes" ++msgstr "" ++ ++msgid "Basic Settings" ++msgstr "" ++ ++msgid "" ++"Below a list of configuration tips for your system to run Dynamic DNS " ++"updates without limitations" ++msgstr "" ++ ++msgid "" ++"Below is a list of configured DDNS configurations and their current state." ++msgstr "" ++ ++msgid "Bind Network" ++msgstr "" ++ ++msgid "Binding to a specific network not supported" ++msgstr "" ++ ++msgid "" ++"BusyBox's nslookup and Wget do not support to specify the IP version to use " ++"for communication with DDNS Provider." ++msgstr "" ++ ++msgid "" ++"BusyBox's nslookup does not support to specify to use TCP instead of default " ++"UDP when requesting DNS server" ++msgstr "" ++ ++msgid "Casual users should not change this setting" ++msgstr "" ++ ++msgid "Check Interval" ++msgstr "" ++ ++msgid "Collecting data..." ++msgstr "" ++ ++msgid "Config error" ++msgstr "" ++ ++msgid "Configuration" ++msgstr "" ++ ++msgid "" ++"Configure here the details for all Dynamic DNS services including this LuCI " ++"application." ++msgstr "" ++ ++msgid "Configure here the details for selected Dynamic DNS service." ++msgstr "" ++ ++msgid "Current setting" ++msgstr "" ++ ++msgid "" ++"Currently DDNS updates are not started at boot or on interface events.
    This is the default if you run DDNS scripts by yourself (i.e. via cron with " ++"force_interval set to '0')" ++msgstr "" ++ ++msgid "" ++"Currently DDNS updates are not started at boot or on interface events.
    You can start/stop each configuration here. It will run until next reboot." ++msgstr "" ++ ++msgid "Custom update script to be used for updating your DDNS Provider." ++msgstr "" ++ ++msgid "Custom update-URL" ++msgstr "URL para atualização personalizada" ++ ++msgid "Custom update-script" ++msgstr "" ++ ++msgid "DDNS Autostart disabled" ++msgstr "" ++ ++msgid "DDNS Service provider" ++msgstr "" ++ ++msgid "DNS requests via TCP not supported" ++msgstr "" ++ ++msgid "DNS-Server" ++msgstr "" ++ ++msgid "Date format" ++msgstr "" ++ ++msgid "Defines the Web page to read systems IPv4-Address from" ++msgstr "" ++ ++msgid "Defines the Web page to read systems IPv6-Address from" ++msgstr "" ++ ++msgid "Defines the interface to read systems IP-Address from" ++msgstr "" ++ ++msgid "Defines the network to read systems IPv4-Address from" ++msgstr "" ++ ++msgid "Defines the network to read systems IPv6-Address from" ++msgstr "" ++ ++msgid "" ++"Defines the source to read systems IPv4-Address from, that will be send to " ++"the DDNS provider" ++msgstr "" ++ ++msgid "" ++"Defines the source to read systems IPv6-Address from, that will be send to " ++"the DDNS provider" ++msgstr "" ++ ++msgid "Defines which IP address 'IPv4/IPv6' is send to the DDNS provider" ++msgstr "" ++ ++msgid "Details for" ++msgstr "" ++ ++msgid "Directory contains Log files for each running section" ++msgstr "" ++ ++msgid "" ++"Directory contains PID and other status information for each running section" ++msgstr "" ++ ++msgid "Disabled" ++msgstr "" ++ ++msgid "Dynamic DNS" ++msgstr "DNS Dinâmico" ++ ++msgid "" ++"Dynamic DNS allows that your router can be reached with a fixed hostname " ++"while having a dynamically changing IP address." ++msgstr "" ++"O DNS dinâmico permite que o seu roteador possa ser encontrado a partir de " ++"um nome fixo, mesmo usando um Endereço IP dinâmico." ++ ++msgid "Enable secure communication with DDNS provider" ++msgstr "" ++ ++msgid "Enabled" ++msgstr "" ++ ++msgid "Error" ++msgstr "" ++ ++msgid "Error Retry Counter" ++msgstr "" ++ ++msgid "Error Retry Interval" ++msgstr "" ++ ++msgid "Event Network" ++msgstr "" ++ ++msgid "File" ++msgstr "" ++ ++msgid "File not found" ++msgstr "" ++ ++msgid "File not found or empty" ++msgstr "" ++ ++msgid "" ++"Follow this link
    You will find more hints to optimize your system to " ++"run DDNS scripts with all options" ++msgstr "" ++ ++msgid "For detailed information about parameter settings look here." ++msgstr "" ++ ++msgid "For supported codes look here" ++msgstr "" ++ ++msgid "Force IP Version" ++msgstr "" ++ ++msgid "Force IP Version not supported" ++msgstr "" ++ ++msgid "Force Interval" ++msgstr "" ++ ++msgid "Force TCP on DNS" ++msgstr "" ++ ++msgid "Forced IP Version don't matched" ++msgstr "" ++ ++msgid "Format" ++msgstr "" ++ ++msgid "Format: IP or FQDN" ++msgstr "" ++ ++msgid "" ++"GNU Wget will use the IP of given network, cURL will use the physical " ++"interface." ++msgstr "" ++ ++msgid "Global Settings" ++msgstr "" ++ ++msgid "HTTPS not supported" ++msgstr "" ++ ++msgid "Hints" ++msgstr "" ++ ++msgid "Hostname/Domain" ++msgstr "" ++ ++msgid "IP address source" ++msgstr "" ++ ++msgid "IP address version" ++msgstr "" ++ ++msgid "IPv4-Address" ++msgstr "" ++ ++msgid "IPv6 address must be given in square brackets" ++msgstr "" ++ ++msgid "" ++"IPv6 is currently not (fully) supported by this system
    Please follow " ++"the instructions on OpenWrt's homepage to enable IPv6 support
    or update " ++"your system to the latest OpenWrt Release" ++msgstr "" ++ ++msgid "IPv6 not supported" ++msgstr "" ++ ++msgid "IPv6-Address" ++msgstr "" ++ ++msgid "If both cURL and GNU Wget are installed, Wget is used by default." ++msgstr "" ++ ++msgid "" ++"If this service section is disabled it could not be started.
    Neither " ++"from LuCI interface nor from console" ++msgstr "" ++ ++msgid "" ++"If you want to send updates for IPv4 and IPv6 you need to define two " ++"separate Configurations i.e. 'myddns_ipv4' and 'myddns_ipv6'" ++msgstr "" ++ ++msgid "" ++"In some versions cURL/libcurl in OpenWrt is compiled without proxy support." ++msgstr "" ++ ++msgid "Info" ++msgstr "" ++ ++msgid "Interface" ++msgstr "Interface" ++ ++msgid "" ++"Interval to check for changed IP
    Values below 5 minutes == 300 seconds " ++"are not supported" ++msgstr "" ++ ++msgid "" ++"Interval to force updates send to DDNS Provider
    Setting this parameter " ++"to 0 will force the script to only run once
    Values lower 'Check " ++"Interval' except '0' are not supported" ++msgstr "" ++ ++msgid "It is NOT recommended for casual users to change settings on this page." ++msgstr "" ++ ++msgid "Last Update" ++msgstr "" ++ ++msgid "Loading" ++msgstr "" ++ ++msgid "Log File Viewer" ++msgstr "" ++ ++msgid "Log directory" ++msgstr "" ++ ++msgid "Log length" ++msgstr "" ++ ++msgid "Log to file" ++msgstr "" ++ ++msgid "Log to syslog" ++msgstr "" ++ ++msgid "" ++"Neither GNU Wget with SSL nor cURL installed to select a network to use for " ++"communication." ++msgstr "" ++ ++msgid "" ++"Neither GNU Wget with SSL nor cURL installed to support updates via HTTPS " ++"protocol." ++msgstr "" ++ ++msgid "Network" ++msgstr "Rede" ++ ++msgid "Network on which the ddns-updater scripts will be started" ++msgstr "" ++ ++msgid "Never" ++msgstr "" ++ ++msgid "Next Update" ++msgstr "" ++ ++msgid "No data" ++msgstr "" ++ ++msgid "No logging" ++msgstr "" ++ ++msgid "Non-public and by default blocked IP's" ++msgstr "" ++ ++msgid "Notice" ++msgstr "" ++ ++msgid "Number of last lines stored in log files" ++msgstr "" ++ ++msgid "OPTIONAL: Force the usage of pure IPv4/IPv6 only communication." ++msgstr "" ++ ++msgid "OPTIONAL: Force the use of TCP instead of default UDP on DNS requests." ++msgstr "" ++ ++msgid "OPTIONAL: Network to use for communication" ++msgstr "" ++ ++msgid "OPTIONAL: Proxy-Server for detection and updates." ++msgstr "" ++ ++msgid "OPTIONAL: Use non-default DNS-Server to detect 'Registered IP'." ++msgstr "" ++ ++msgid "On Error the script will retry the failed action after given time" ++msgstr "" ++ ++msgid "On Error the script will stop execution after given number of retrys" ++msgstr "" ++ ++msgid "Overview" ++msgstr "" ++ ++msgid "PROXY-Server" ++msgstr "" ++ ++msgid "PROXY-Server not supported" ++msgstr "" ++ ++msgid "Password" ++msgstr "Senha" ++ ++msgid "Path to CA-Certificate" ++msgstr "" ++ ++msgid "Please [Save & Apply] your changes first" ++msgstr "" ++ ++msgid "Please press [Read] button" ++msgstr "" ++ ++msgid "Please update to the current version!" ++msgstr "" ++ ++msgid "Process ID" ++msgstr "" ++ ++msgid "Read / Reread log file" ++msgstr "" ++ ++msgid "Registered IP" ++msgstr "" ++ ++msgid "Replaces [DOMAIN] in Update-URL" ++msgstr "" ++ ++msgid "Replaces [PASSWORD] in Update-URL" ++msgstr "" ++ ++msgid "Replaces [USERNAME] in Update-URL" ++msgstr "" ++ ++msgid "Run once" ++msgstr "" ++ ++msgid "Script" ++msgstr "" ++ ++msgid "Show more" ++msgstr "" ++ ++msgid "Software update required" ++msgstr "" ++ ++msgid "Start" ++msgstr "" ++ ++msgid "Start / Stop" ++msgstr "" ++ ++msgid "Status directory" ++msgstr "" ++ ++msgid "Stopped" ++msgstr "" ++ ++msgid "" ++"The currently installed 'ddns-scripts' package did not support all available " ++"settings." ++msgstr "" ++ ++msgid "There is no service configured." ++msgstr "" ++ ++msgid "Timer Settings" ++msgstr "" ++ ++msgid "To change global settings click here" ++msgstr "" ++ ++msgid "To use cURL activate this option." ++msgstr "" ++ ++msgid "URL" ++msgstr "URL" ++ ++msgid "URL to detect" ++msgstr "" ++ ++msgid "Unknown error" ++msgstr "" ++ ++msgid "" ++"Update URL to be used for updating your DDNS Provider.
    Follow " ++"instructions you will find on their WEB page." ++msgstr "" ++ ++msgid "Update error" ++msgstr "" ++ ++msgid "Use HTTP Secure" ++msgstr "" ++ ++msgid "Use cURL" ++msgstr "" ++ ++msgid "User defined script to read systems IP-Address" ++msgstr "" ++ ++msgid "Username" ++msgstr "Usuário" ++ ++msgid "Verify" ++msgstr "" ++ ++msgid "Version" ++msgstr "" ++ ++msgid "Version Information" ++msgstr "" ++ ++msgid "Waiting for changes to be applied..." ++msgstr "" ++ ++msgid "Warning" ++msgstr "" ++ ++msgid "" ++"Writes detailed messages to log file. File will be truncated automatically." ++msgstr "" ++ ++msgid "" ++"Writes log messages to syslog. Critical Errors will always be written to " ++"syslog." ++msgstr "" ++ ++msgid "You should install BIND host package for DNS requests." ++msgstr "" ++ ++msgid "You should install GNU Wget with SSL (prefered) or cURL package." ++msgstr "" ++ ++msgid "You should install GNU Wget with SSL or cURL package." ++msgstr "" ++ ++msgid "You should install GNU Wget with SSL or replace libcurl." ++msgstr "" ++ ++msgid "cURL is installed, but libcurl was compiled without proxy support." ++msgstr "" ++ ++msgid "cURL without Proxy Support" ++msgstr "" ++ ++msgid "can not detect local IP. Please select a different Source combination" ++msgstr "" ++ ++msgid "can not resolve host:" ++msgstr "" ++ ++msgid "config error" ++msgstr "" ++ ++msgid "days" ++msgstr "" ++ ++msgid "directory or path/file" ++msgstr "" ++ ++msgid "either url or script could be set" ++msgstr "" ++ ++msgid "enable here" ++msgstr "" ++ ++msgid "file or directory not found or not 'IGNORE'" ++msgstr "" ++ ++msgid "help" ++msgstr "" ++ ++msgid "hours" ++msgstr "" ++ ++msgid "installed" ++msgstr "" ++ ++msgid "invalid - Sample" ++msgstr "" ++ ++msgid "minimum value '0'" ++msgstr "" ++ ++msgid "minimum value '1'" ++msgstr "" ++ ++msgid "minimum value 5 minutes == 300 seconds" ++msgstr "" ++ ++msgid "minutes" ++msgstr "" ++ ++msgid "missing / required" ++msgstr "" ++ ++msgid "must be greater or equal 'Check Interval'" ++msgstr "" ++ ++msgid "must start with 'http://'" ++msgstr "" ++ ++msgid "nc (netcat) can not connect" ++msgstr "" ++ ++msgid "never" ++msgstr "" ++ ++msgid "no data" ++msgstr "" ++ ++msgid "not found or not executable - Sample: '/path/to/script.sh'" ++msgstr "" ++ ++msgid "nslookup can not resolve host" ++msgstr "" ++ ++msgid "or" ++msgstr "" ++ ++msgid "or higher" ++msgstr "" ++ ++msgid "please disable" ++msgstr "" ++ ++msgid "please remove entry" ++msgstr "" ++ ++msgid "please select 'IPv4' address version" ++msgstr "" ++ ++msgid "please select 'IPv4' address version in" ++msgstr "" ++ ++msgid "please set to 'default'" ++msgstr "" ++ ++msgid "proxy port missing" ++msgstr "" ++ ++msgid "required" ++msgstr "" ++ ++msgid "seconds" ++msgstr "" ++ ++msgid "to run HTTPS without verification of server certificates (insecure)" ++msgstr "" ++ ++msgid "unknown error" ++msgstr "" ++ ++msgid "unspecific error" ++msgstr "" ++ ++msgid "use hostname, FQDN, IPv4- or IPv6-Address" ++msgstr "" ++ ++#~ msgid "Check for changed IP every" ++#~ msgstr "Verifique por alterações no endereço IP a cada" ++ ++#~ msgid "Check-time unit" ++#~ msgstr "Unidade de tempo para verificação" ++ ++#~ msgid "Enable" ++#~ msgstr "Habilitar" ++ ++#~ msgid "Force update every" ++#~ msgstr "Forçar atualização a cada" ++ ++#~ msgid "Force-time unit" ++#~ msgstr "Unidade de tempo para atualização forçada" ++ ++#~ msgid "Hostname" ++#~ msgstr "Nome do computador" ++ ++#~ msgid "Service" ++#~ msgstr "Serviço" ++ ++#~ msgid "Source of IP address" ++#~ msgstr "Origem do Endereço IP" ++ ++#~ msgid "custom" ++#~ msgstr "personalizado" ++ ++# Hours ++#~ msgid "h" ++#~ msgstr "h" ++ ++#~ msgid "interface" ++#~ msgstr "interface" ++ ++# Minutes (not minimum) ++#~ msgid "min" ++#~ msgstr "min" ++ ++#~ msgid "network" ++#~ msgstr "rede" ++ ++#~ msgid "Event interface" ++#~ msgstr "Interface de eventos" ++ ++#~ msgid "On which interface up should start the ddns script process." ++#~ msgstr "" ++#~ "Na subida de qual interface que o processo do script ddns deve ser " ++#~ "iniciado" +diff --git a/feeds/luci/applications/luci-app-ddns/po/pt/ddns.po b/feeds/luci/applications/luci-app-ddns/po/pt/ddns.po +new file mode 100644 +index 0000000..5765492 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-ddns/po/pt/ddns.po +@@ -0,0 +1,708 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Report-Msgid-Bugs-To: \n" ++"POT-Creation-Date: 2010-04-02 13:44+0100\n" ++"PO-Revision-Date: 2013-05-31 23:52+0200\n" ++"Last-Translator: joao.f.vieira \n" ++"Language-Team: LANGUAGE \n" ++"Language: pt\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n != 1);\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "&" ++msgstr "" ++ ++msgid "-- custom --" ++msgstr "" ++ ++msgid "-- default --" ++msgstr "" ++ ++msgid "Advanced Settings" ++msgstr "" ++ ++msgid "Allow non-public IP's" ++msgstr "" ++ ++msgid "Applying changes" ++msgstr "" ++ ++msgid "Basic Settings" ++msgstr "" ++ ++msgid "" ++"Below a list of configuration tips for your system to run Dynamic DNS " ++"updates without limitations" ++msgstr "" ++ ++msgid "" ++"Below is a list of configured DDNS configurations and their current state." ++msgstr "" ++ ++msgid "Bind Network" ++msgstr "" ++ ++msgid "Binding to a specific network not supported" ++msgstr "" ++ ++msgid "" ++"BusyBox's nslookup and Wget do not support to specify the IP version to use " ++"for communication with DDNS Provider." ++msgstr "" ++ ++msgid "" ++"BusyBox's nslookup does not support to specify to use TCP instead of default " ++"UDP when requesting DNS server" ++msgstr "" ++ ++msgid "Casual users should not change this setting" ++msgstr "" ++ ++msgid "Check Interval" ++msgstr "" ++ ++msgid "Collecting data..." ++msgstr "" ++ ++msgid "Config error" ++msgstr "" ++ ++msgid "Configuration" ++msgstr "" ++ ++msgid "" ++"Configure here the details for all Dynamic DNS services including this LuCI " ++"application." ++msgstr "" ++ ++msgid "Configure here the details for selected Dynamic DNS service." ++msgstr "" ++ ++msgid "Current setting" ++msgstr "" ++ ++msgid "" ++"Currently DDNS updates are not started at boot or on interface events.
    This is the default if you run DDNS scripts by yourself (i.e. via cron with " ++"force_interval set to '0')" ++msgstr "" ++ ++msgid "" ++"Currently DDNS updates are not started at boot or on interface events.
    You can start/stop each configuration here. It will run until next reboot." ++msgstr "" ++ ++msgid "Custom update script to be used for updating your DDNS Provider." ++msgstr "" ++ ++#, fuzzy ++msgid "Custom update-URL" ++msgstr "URL para actualização personalizada" ++ ++msgid "Custom update-script" ++msgstr "" ++ ++msgid "DDNS Autostart disabled" ++msgstr "" ++ ++msgid "DDNS Service provider" ++msgstr "" ++ ++msgid "DNS requests via TCP not supported" ++msgstr "" ++ ++msgid "DNS-Server" ++msgstr "" ++ ++msgid "Date format" ++msgstr "" ++ ++msgid "Defines the Web page to read systems IPv4-Address from" ++msgstr "" ++ ++msgid "Defines the Web page to read systems IPv6-Address from" ++msgstr "" ++ ++msgid "Defines the interface to read systems IP-Address from" ++msgstr "" ++ ++msgid "Defines the network to read systems IPv4-Address from" ++msgstr "" ++ ++msgid "Defines the network to read systems IPv6-Address from" ++msgstr "" ++ ++msgid "" ++"Defines the source to read systems IPv4-Address from, that will be send to " ++"the DDNS provider" ++msgstr "" ++ ++msgid "" ++"Defines the source to read systems IPv6-Address from, that will be send to " ++"the DDNS provider" ++msgstr "" ++ ++msgid "Defines which IP address 'IPv4/IPv6' is send to the DDNS provider" ++msgstr "" ++ ++msgid "Details for" ++msgstr "" ++ ++msgid "Directory contains Log files for each running section" ++msgstr "" ++ ++msgid "" ++"Directory contains PID and other status information for each running section" ++msgstr "" ++ ++msgid "Disabled" ++msgstr "" ++ ++msgid "Dynamic DNS" ++msgstr "DNS Dinâmico" ++ ++#, fuzzy ++msgid "" ++"Dynamic DNS allows that your router can be reached with a fixed hostname " ++"while having a dynamically changing IP address." ++msgstr "" ++"O DNS dinâmico permite que o seu router possa ser encontrado a partir de um " ++"hostname fixo, mesmo usando um Endereço IP dinâmico." ++ ++msgid "Enable secure communication with DDNS provider" ++msgstr "" ++ ++msgid "Enabled" ++msgstr "" ++ ++msgid "Error" ++msgstr "" ++ ++msgid "Error Retry Counter" ++msgstr "" ++ ++msgid "Error Retry Interval" ++msgstr "" ++ ++msgid "Event Network" ++msgstr "" ++ ++msgid "File" ++msgstr "" ++ ++msgid "File not found" ++msgstr "" ++ ++msgid "File not found or empty" ++msgstr "" ++ ++msgid "" ++"Follow this link
    You will find more hints to optimize your system to " ++"run DDNS scripts with all options" ++msgstr "" ++ ++msgid "For detailed information about parameter settings look here." ++msgstr "" ++ ++msgid "For supported codes look here" ++msgstr "" ++ ++msgid "Force IP Version" ++msgstr "" ++ ++msgid "Force IP Version not supported" ++msgstr "" ++ ++msgid "Force Interval" ++msgstr "" ++ ++msgid "Force TCP on DNS" ++msgstr "" ++ ++msgid "Forced IP Version don't matched" ++msgstr "" ++ ++msgid "Format" ++msgstr "" ++ ++msgid "Format: IP or FQDN" ++msgstr "" ++ ++msgid "" ++"GNU Wget will use the IP of given network, cURL will use the physical " ++"interface." ++msgstr "" ++ ++msgid "Global Settings" ++msgstr "" ++ ++msgid "HTTPS not supported" ++msgstr "" ++ ++msgid "Hints" ++msgstr "" ++ ++msgid "Hostname/Domain" ++msgstr "" ++ ++msgid "IP address source" ++msgstr "" ++ ++msgid "IP address version" ++msgstr "" ++ ++msgid "IPv4-Address" ++msgstr "" ++ ++msgid "IPv6 address must be given in square brackets" ++msgstr "" ++ ++msgid "" ++"IPv6 is currently not (fully) supported by this system
    Please follow " ++"the instructions on OpenWrt's homepage to enable IPv6 support
    or update " ++"your system to the latest OpenWrt Release" ++msgstr "" ++ ++msgid "IPv6 not supported" ++msgstr "" ++ ++msgid "IPv6-Address" ++msgstr "" ++ ++msgid "If both cURL and GNU Wget are installed, Wget is used by default." ++msgstr "" ++ ++msgid "" ++"If this service section is disabled it could not be started.
    Neither " ++"from LuCI interface nor from console" ++msgstr "" ++ ++msgid "" ++"If you want to send updates for IPv4 and IPv6 you need to define two " ++"separate Configurations i.e. 'myddns_ipv4' and 'myddns_ipv6'" ++msgstr "" ++ ++msgid "" ++"In some versions cURL/libcurl in OpenWrt is compiled without proxy support." ++msgstr "" ++ ++msgid "Info" ++msgstr "" ++ ++msgid "Interface" ++msgstr "Interface" ++ ++msgid "" ++"Interval to check for changed IP
    Values below 5 minutes == 300 seconds " ++"are not supported" ++msgstr "" ++ ++msgid "" ++"Interval to force updates send to DDNS Provider
    Setting this parameter " ++"to 0 will force the script to only run once
    Values lower 'Check " ++"Interval' except '0' are not supported" ++msgstr "" ++ ++msgid "It is NOT recommended for casual users to change settings on this page." ++msgstr "" ++ ++msgid "Last Update" ++msgstr "" ++ ++msgid "Loading" ++msgstr "" ++ ++msgid "Log File Viewer" ++msgstr "" ++ ++msgid "Log directory" ++msgstr "" ++ ++msgid "Log length" ++msgstr "" ++ ++msgid "Log to file" ++msgstr "" ++ ++msgid "Log to syslog" ++msgstr "" ++ ++msgid "" ++"Neither GNU Wget with SSL nor cURL installed to select a network to use for " ++"communication." ++msgstr "" ++ ++msgid "" ++"Neither GNU Wget with SSL nor cURL installed to support updates via HTTPS " ++"protocol." ++msgstr "" ++ ++msgid "Network" ++msgstr "Rede" ++ ++msgid "Network on which the ddns-updater scripts will be started" ++msgstr "" ++ ++msgid "Never" ++msgstr "" ++ ++msgid "Next Update" ++msgstr "" ++ ++msgid "No data" ++msgstr "" ++ ++msgid "No logging" ++msgstr "" ++ ++msgid "Non-public and by default blocked IP's" ++msgstr "" ++ ++msgid "Notice" ++msgstr "" ++ ++msgid "Number of last lines stored in log files" ++msgstr "" ++ ++msgid "OPTIONAL: Force the usage of pure IPv4/IPv6 only communication." ++msgstr "" ++ ++msgid "OPTIONAL: Force the use of TCP instead of default UDP on DNS requests." ++msgstr "" ++ ++msgid "OPTIONAL: Network to use for communication" ++msgstr "" ++ ++msgid "OPTIONAL: Proxy-Server for detection and updates." ++msgstr "" ++ ++msgid "OPTIONAL: Use non-default DNS-Server to detect 'Registered IP'." ++msgstr "" ++ ++msgid "On Error the script will retry the failed action after given time" ++msgstr "" ++ ++msgid "On Error the script will stop execution after given number of retrys" ++msgstr "" ++ ++msgid "Overview" ++msgstr "" ++ ++msgid "PROXY-Server" ++msgstr "" ++ ++msgid "PROXY-Server not supported" ++msgstr "" ++ ++msgid "Password" ++msgstr "Password" ++ ++msgid "Path to CA-Certificate" ++msgstr "" ++ ++msgid "Please [Save & Apply] your changes first" ++msgstr "" ++ ++msgid "Please press [Read] button" ++msgstr "" ++ ++msgid "Please update to the current version!" ++msgstr "" ++ ++msgid "Process ID" ++msgstr "" ++ ++msgid "Read / Reread log file" ++msgstr "" ++ ++msgid "Registered IP" ++msgstr "" ++ ++msgid "Replaces [DOMAIN] in Update-URL" ++msgstr "" ++ ++msgid "Replaces [PASSWORD] in Update-URL" ++msgstr "" ++ ++msgid "Replaces [USERNAME] in Update-URL" ++msgstr "" ++ ++msgid "Run once" ++msgstr "" ++ ++msgid "Script" ++msgstr "" ++ ++msgid "Show more" ++msgstr "" ++ ++msgid "Software update required" ++msgstr "" ++ ++msgid "Start" ++msgstr "" ++ ++msgid "Start / Stop" ++msgstr "" ++ ++msgid "Status directory" ++msgstr "" ++ ++msgid "Stopped" ++msgstr "" ++ ++msgid "" ++"The currently installed 'ddns-scripts' package did not support all available " ++"settings." ++msgstr "" ++ ++msgid "There is no service configured." ++msgstr "" ++ ++msgid "Timer Settings" ++msgstr "" ++ ++msgid "To change global settings click here" ++msgstr "" ++ ++msgid "To use cURL activate this option." ++msgstr "" ++ ++msgid "URL" ++msgstr "URL" ++ ++msgid "URL to detect" ++msgstr "" ++ ++msgid "Unknown error" ++msgstr "" ++ ++msgid "" ++"Update URL to be used for updating your DDNS Provider.
    Follow " ++"instructions you will find on their WEB page." ++msgstr "" ++ ++msgid "Update error" ++msgstr "" ++ ++msgid "Use HTTP Secure" ++msgstr "" ++ ++msgid "Use cURL" ++msgstr "" ++ ++msgid "User defined script to read systems IP-Address" ++msgstr "" ++ ++msgid "Username" ++msgstr "Nome de Utilizador" ++ ++msgid "Verify" ++msgstr "" ++ ++msgid "Version" ++msgstr "" ++ ++msgid "Version Information" ++msgstr "" ++ ++msgid "Waiting for changes to be applied..." ++msgstr "" ++ ++msgid "Warning" ++msgstr "" ++ ++msgid "" ++"Writes detailed messages to log file. File will be truncated automatically." ++msgstr "" ++ ++msgid "" ++"Writes log messages to syslog. Critical Errors will always be written to " ++"syslog." ++msgstr "" ++ ++msgid "You should install BIND host package for DNS requests." ++msgstr "" ++ ++msgid "You should install GNU Wget with SSL (prefered) or cURL package." ++msgstr "" ++ ++msgid "You should install GNU Wget with SSL or cURL package." ++msgstr "" ++ ++msgid "You should install GNU Wget with SSL or replace libcurl." ++msgstr "" ++ ++msgid "cURL is installed, but libcurl was compiled without proxy support." ++msgstr "" ++ ++msgid "cURL without Proxy Support" ++msgstr "" ++ ++msgid "can not detect local IP. Please select a different Source combination" ++msgstr "" ++ ++msgid "can not resolve host:" ++msgstr "" ++ ++msgid "config error" ++msgstr "" ++ ++msgid "days" ++msgstr "" ++ ++msgid "directory or path/file" ++msgstr "" ++ ++msgid "either url or script could be set" ++msgstr "" ++ ++msgid "enable here" ++msgstr "" ++ ++msgid "file or directory not found or not 'IGNORE'" ++msgstr "" ++ ++msgid "help" ++msgstr "" ++ ++msgid "hours" ++msgstr "" ++ ++msgid "installed" ++msgstr "" ++ ++msgid "invalid - Sample" ++msgstr "" ++ ++msgid "minimum value '0'" ++msgstr "" ++ ++msgid "minimum value '1'" ++msgstr "" ++ ++msgid "minimum value 5 minutes == 300 seconds" ++msgstr "" ++ ++msgid "minutes" ++msgstr "" ++ ++msgid "missing / required" ++msgstr "" ++ ++msgid "must be greater or equal 'Check Interval'" ++msgstr "" ++ ++msgid "must start with 'http://'" ++msgstr "" ++ ++msgid "nc (netcat) can not connect" ++msgstr "" ++ ++msgid "never" ++msgstr "" ++ ++msgid "no data" ++msgstr "" ++ ++msgid "not found or not executable - Sample: '/path/to/script.sh'" ++msgstr "" ++ ++msgid "nslookup can not resolve host" ++msgstr "" ++ ++msgid "or" ++msgstr "" ++ ++msgid "or higher" ++msgstr "" ++ ++msgid "please disable" ++msgstr "" ++ ++msgid "please remove entry" ++msgstr "" ++ ++msgid "please select 'IPv4' address version" ++msgstr "" ++ ++msgid "please select 'IPv4' address version in" ++msgstr "" ++ ++msgid "please set to 'default'" ++msgstr "" ++ ++msgid "proxy port missing" ++msgstr "" ++ ++msgid "required" ++msgstr "" ++ ++msgid "seconds" ++msgstr "" ++ ++msgid "to run HTTPS without verification of server certificates (insecure)" ++msgstr "" ++ ++msgid "unknown error" ++msgstr "" ++ ++msgid "unspecific error" ++msgstr "" ++ ++msgid "use hostname, FQDN, IPv4- or IPv6-Address" ++msgstr "" ++ ++#~ msgid "Check for changed IP every" ++#~ msgstr "Intervalo para verificação de alteração do endereço IP" ++ ++#, fuzzy ++#~ msgid "Check-time unit" ++#~ msgstr "Unidade de tempo para verificação" ++ ++#~ msgid "Enable" ++#~ msgstr "Ativar" ++ ++#~ msgid "Force update every" ++#~ msgstr "Forçar actualização a cada" ++ ++#, fuzzy ++#~ msgid "Force-time unit" ++#~ msgstr "Unidade de tempo para actualização forçada" ++ ++#~ msgid "Hostname" ++#~ msgstr "Nome de Host" ++ ++#~ msgid "Service" ++#~ msgstr "Serviço" ++ ++#~ msgid "Source of IP address" ++#~ msgstr "Origem do Endereço IP" ++ ++#~ msgid "custom" ++#~ msgstr "personalizado" ++ ++# Hours ++#~ msgid "h" ++#~ msgstr "h" ++ ++#~ msgid "interface" ++#~ msgstr "interface" ++ ++# Minutes (not minimum) ++#~ msgid "min" ++#~ msgstr "min" ++ ++#~ msgid "network" ++#~ msgstr "rede" ++ ++#~ msgid "Event interface" ++#~ msgstr "Interface do evento" ++ ++#~ msgid "On which interface up should start the ddns script process." ++#~ msgstr "" ++#~ "Em que interface deve ser iniciado o script para o processo de ddns." +diff --git a/feeds/luci/applications/luci-app-ddns/po/ro/ddns.po b/feeds/luci/applications/luci-app-ddns/po/ro/ddns.po +new file mode 100644 +index 0000000..78c39d5 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-ddns/po/ro/ddns.po +@@ -0,0 +1,706 @@ ++# Generated from applications/luci-ddns/luasrc/model/cbi/ddns/ddns.lua ++# ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Report-Msgid-Bugs-To: \n" ++"POT-Creation-Date: 2010-04-02 13:44+0100\n" ++"PO-Revision-Date: 2013-09-25 19:11+0200\n" ++"Last-Translator: Mihai \n" ++"Language-Team: none\n" ++"Language: ro\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=3; plural=(n==1 ? 0 : (n==0 || (n%100 > 0 && n%100 < " ++"20)) ? 1 : 2);;\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "&" ++msgstr "" ++ ++msgid "-- custom --" ++msgstr "" ++ ++msgid "-- default --" ++msgstr "" ++ ++msgid "Advanced Settings" ++msgstr "" ++ ++msgid "Allow non-public IP's" ++msgstr "" ++ ++msgid "Applying changes" ++msgstr "" ++ ++msgid "Basic Settings" ++msgstr "" ++ ++msgid "" ++"Below a list of configuration tips for your system to run Dynamic DNS " ++"updates without limitations" ++msgstr "" ++ ++msgid "" ++"Below is a list of configured DDNS configurations and their current state." ++msgstr "" ++ ++msgid "Bind Network" ++msgstr "" ++ ++msgid "Binding to a specific network not supported" ++msgstr "" ++ ++msgid "" ++"BusyBox's nslookup and Wget do not support to specify the IP version to use " ++"for communication with DDNS Provider." ++msgstr "" ++ ++msgid "" ++"BusyBox's nslookup does not support to specify to use TCP instead of default " ++"UDP when requesting DNS server" ++msgstr "" ++ ++msgid "Casual users should not change this setting" ++msgstr "" ++ ++msgid "Check Interval" ++msgstr "" ++ ++msgid "Collecting data..." ++msgstr "" ++ ++msgid "Config error" ++msgstr "" ++ ++msgid "Configuration" ++msgstr "" ++ ++msgid "" ++"Configure here the details for all Dynamic DNS services including this LuCI " ++"application." ++msgstr "" ++ ++msgid "Configure here the details for selected Dynamic DNS service." ++msgstr "" ++ ++msgid "Current setting" ++msgstr "" ++ ++msgid "" ++"Currently DDNS updates are not started at boot or on interface events.
    This is the default if you run DDNS scripts by yourself (i.e. via cron with " ++"force_interval set to '0')" ++msgstr "" ++ ++msgid "" ++"Currently DDNS updates are not started at boot or on interface events.
    You can start/stop each configuration here. It will run until next reboot." ++msgstr "" ++ ++msgid "Custom update script to be used for updating your DDNS Provider." ++msgstr "" ++ ++msgid "Custom update-URL" ++msgstr "Adresa particularizata de actualizare" ++ ++msgid "Custom update-script" ++msgstr "" ++ ++msgid "DDNS Autostart disabled" ++msgstr "" ++ ++msgid "DDNS Service provider" ++msgstr "" ++ ++msgid "DNS requests via TCP not supported" ++msgstr "" ++ ++msgid "DNS-Server" ++msgstr "" ++ ++msgid "Date format" ++msgstr "" ++ ++msgid "Defines the Web page to read systems IPv4-Address from" ++msgstr "" ++ ++msgid "Defines the Web page to read systems IPv6-Address from" ++msgstr "" ++ ++msgid "Defines the interface to read systems IP-Address from" ++msgstr "" ++ ++msgid "Defines the network to read systems IPv4-Address from" ++msgstr "" ++ ++msgid "Defines the network to read systems IPv6-Address from" ++msgstr "" ++ ++msgid "" ++"Defines the source to read systems IPv4-Address from, that will be send to " ++"the DDNS provider" ++msgstr "" ++ ++msgid "" ++"Defines the source to read systems IPv6-Address from, that will be send to " ++"the DDNS provider" ++msgstr "" ++ ++msgid "Defines which IP address 'IPv4/IPv6' is send to the DDNS provider" ++msgstr "" ++ ++msgid "Details for" ++msgstr "" ++ ++msgid "Directory contains Log files for each running section" ++msgstr "" ++ ++msgid "" ++"Directory contains PID and other status information for each running section" ++msgstr "" ++ ++msgid "Disabled" ++msgstr "" ++ ++msgid "Dynamic DNS" ++msgstr "DNS dinamic" ++ ++msgid "" ++"Dynamic DNS allows that your router can be reached with a fixed hostname " ++"while having a dynamically changing IP address." ++msgstr "" ++"DNS-ul dinamic permite accesarea routerului printr-un nume dns fix legat de " ++"adresa dinamic IP." ++ ++msgid "Enable secure communication with DDNS provider" ++msgstr "" ++ ++msgid "Enabled" ++msgstr "" ++ ++msgid "Error" ++msgstr "" ++ ++msgid "Error Retry Counter" ++msgstr "" ++ ++msgid "Error Retry Interval" ++msgstr "" ++ ++msgid "Event Network" ++msgstr "" ++ ++msgid "File" ++msgstr "" ++ ++msgid "File not found" ++msgstr "" ++ ++msgid "File not found or empty" ++msgstr "" ++ ++msgid "" ++"Follow this link
    You will find more hints to optimize your system to " ++"run DDNS scripts with all options" ++msgstr "" ++ ++msgid "For detailed information about parameter settings look here." ++msgstr "" ++ ++msgid "For supported codes look here" ++msgstr "" ++ ++msgid "Force IP Version" ++msgstr "" ++ ++msgid "Force IP Version not supported" ++msgstr "" ++ ++msgid "Force Interval" ++msgstr "" ++ ++msgid "Force TCP on DNS" ++msgstr "" ++ ++msgid "Forced IP Version don't matched" ++msgstr "" ++ ++msgid "Format" ++msgstr "" ++ ++msgid "Format: IP or FQDN" ++msgstr "" ++ ++msgid "" ++"GNU Wget will use the IP of given network, cURL will use the physical " ++"interface." ++msgstr "" ++ ++msgid "Global Settings" ++msgstr "" ++ ++msgid "HTTPS not supported" ++msgstr "" ++ ++msgid "Hints" ++msgstr "" ++ ++msgid "Hostname/Domain" ++msgstr "" ++ ++msgid "IP address source" ++msgstr "" ++ ++msgid "IP address version" ++msgstr "" ++ ++msgid "IPv4-Address" ++msgstr "" ++ ++msgid "IPv6 address must be given in square brackets" ++msgstr "" ++ ++msgid "" ++"IPv6 is currently not (fully) supported by this system
    Please follow " ++"the instructions on OpenWrt's homepage to enable IPv6 support
    or update " ++"your system to the latest OpenWrt Release" ++msgstr "" ++ ++msgid "IPv6 not supported" ++msgstr "" ++ ++msgid "IPv6-Address" ++msgstr "" ++ ++msgid "If both cURL and GNU Wget are installed, Wget is used by default." ++msgstr "" ++ ++msgid "" ++"If this service section is disabled it could not be started.
    Neither " ++"from LuCI interface nor from console" ++msgstr "" ++ ++msgid "" ++"If you want to send updates for IPv4 and IPv6 you need to define two " ++"separate Configurations i.e. 'myddns_ipv4' and 'myddns_ipv6'" ++msgstr "" ++ ++msgid "" ++"In some versions cURL/libcurl in OpenWrt is compiled without proxy support." ++msgstr "" ++ ++msgid "Info" ++msgstr "" ++ ++msgid "Interface" ++msgstr "Interfata" ++ ++msgid "" ++"Interval to check for changed IP
    Values below 5 minutes == 300 seconds " ++"are not supported" ++msgstr "" ++ ++msgid "" ++"Interval to force updates send to DDNS Provider
    Setting this parameter " ++"to 0 will force the script to only run once
    Values lower 'Check " ++"Interval' except '0' are not supported" ++msgstr "" ++ ++msgid "It is NOT recommended for casual users to change settings on this page." ++msgstr "" ++ ++msgid "Last Update" ++msgstr "" ++ ++msgid "Loading" ++msgstr "" ++ ++msgid "Log File Viewer" ++msgstr "" ++ ++msgid "Log directory" ++msgstr "" ++ ++msgid "Log length" ++msgstr "" ++ ++msgid "Log to file" ++msgstr "" ++ ++msgid "Log to syslog" ++msgstr "" ++ ++msgid "" ++"Neither GNU Wget with SSL nor cURL installed to select a network to use for " ++"communication." ++msgstr "" ++ ++msgid "" ++"Neither GNU Wget with SSL nor cURL installed to support updates via HTTPS " ++"protocol." ++msgstr "" ++ ++msgid "Network" ++msgstr "Retea" ++ ++msgid "Network on which the ddns-updater scripts will be started" ++msgstr "" ++ ++msgid "Never" ++msgstr "" ++ ++msgid "Next Update" ++msgstr "" ++ ++msgid "No data" ++msgstr "" ++ ++msgid "No logging" ++msgstr "" ++ ++msgid "Non-public and by default blocked IP's" ++msgstr "" ++ ++msgid "Notice" ++msgstr "" ++ ++msgid "Number of last lines stored in log files" ++msgstr "" ++ ++msgid "OPTIONAL: Force the usage of pure IPv4/IPv6 only communication." ++msgstr "" ++ ++msgid "OPTIONAL: Force the use of TCP instead of default UDP on DNS requests." ++msgstr "" ++ ++msgid "OPTIONAL: Network to use for communication" ++msgstr "" ++ ++msgid "OPTIONAL: Proxy-Server for detection and updates." ++msgstr "" ++ ++msgid "OPTIONAL: Use non-default DNS-Server to detect 'Registered IP'." ++msgstr "" ++ ++msgid "On Error the script will retry the failed action after given time" ++msgstr "" ++ ++msgid "On Error the script will stop execution after given number of retrys" ++msgstr "" ++ ++msgid "Overview" ++msgstr "" ++ ++msgid "PROXY-Server" ++msgstr "" ++ ++msgid "PROXY-Server not supported" ++msgstr "" ++ ++msgid "Password" ++msgstr "Parola" ++ ++msgid "Path to CA-Certificate" ++msgstr "" ++ ++msgid "Please [Save & Apply] your changes first" ++msgstr "" ++ ++msgid "Please press [Read] button" ++msgstr "" ++ ++msgid "Please update to the current version!" ++msgstr "" ++ ++msgid "Process ID" ++msgstr "" ++ ++msgid "Read / Reread log file" ++msgstr "" ++ ++msgid "Registered IP" ++msgstr "" ++ ++msgid "Replaces [DOMAIN] in Update-URL" ++msgstr "" ++ ++msgid "Replaces [PASSWORD] in Update-URL" ++msgstr "" ++ ++msgid "Replaces [USERNAME] in Update-URL" ++msgstr "" ++ ++msgid "Run once" ++msgstr "" ++ ++msgid "Script" ++msgstr "" ++ ++msgid "Show more" ++msgstr "" ++ ++msgid "Software update required" ++msgstr "" ++ ++msgid "Start" ++msgstr "" ++ ++msgid "Start / Stop" ++msgstr "" ++ ++msgid "Status directory" ++msgstr "" ++ ++msgid "Stopped" ++msgstr "" ++ ++msgid "" ++"The currently installed 'ddns-scripts' package did not support all available " ++"settings." ++msgstr "" ++ ++msgid "There is no service configured." ++msgstr "" ++ ++msgid "Timer Settings" ++msgstr "" ++ ++msgid "To change global settings click here" ++msgstr "" ++ ++msgid "To use cURL activate this option." ++msgstr "" ++ ++msgid "URL" ++msgstr "URL" ++ ++msgid "URL to detect" ++msgstr "" ++ ++msgid "Unknown error" ++msgstr "" ++ ++msgid "" ++"Update URL to be used for updating your DDNS Provider.
    Follow " ++"instructions you will find on their WEB page." ++msgstr "" ++ ++msgid "Update error" ++msgstr "" ++ ++msgid "Use HTTP Secure" ++msgstr "" ++ ++msgid "Use cURL" ++msgstr "" ++ ++msgid "User defined script to read systems IP-Address" ++msgstr "" ++ ++msgid "Username" ++msgstr "Utilizator" ++ ++msgid "Verify" ++msgstr "" ++ ++msgid "Version" ++msgstr "" ++ ++msgid "Version Information" ++msgstr "" ++ ++msgid "Waiting for changes to be applied..." ++msgstr "" ++ ++msgid "Warning" ++msgstr "" ++ ++msgid "" ++"Writes detailed messages to log file. File will be truncated automatically." ++msgstr "" ++ ++msgid "" ++"Writes log messages to syslog. Critical Errors will always be written to " ++"syslog." ++msgstr "" ++ ++msgid "You should install BIND host package for DNS requests." ++msgstr "" ++ ++msgid "You should install GNU Wget with SSL (prefered) or cURL package." ++msgstr "" ++ ++msgid "You should install GNU Wget with SSL or cURL package." ++msgstr "" ++ ++msgid "You should install GNU Wget with SSL or replace libcurl." ++msgstr "" ++ ++msgid "cURL is installed, but libcurl was compiled without proxy support." ++msgstr "" ++ ++msgid "cURL without Proxy Support" ++msgstr "" ++ ++msgid "can not detect local IP. Please select a different Source combination" ++msgstr "" ++ ++msgid "can not resolve host:" ++msgstr "" ++ ++msgid "config error" ++msgstr "" ++ ++msgid "days" ++msgstr "" ++ ++msgid "directory or path/file" ++msgstr "" ++ ++msgid "either url or script could be set" ++msgstr "" ++ ++msgid "enable here" ++msgstr "" ++ ++msgid "file or directory not found or not 'IGNORE'" ++msgstr "" ++ ++msgid "help" ++msgstr "" ++ ++msgid "hours" ++msgstr "" ++ ++msgid "installed" ++msgstr "" ++ ++msgid "invalid - Sample" ++msgstr "" ++ ++msgid "minimum value '0'" ++msgstr "" ++ ++msgid "minimum value '1'" ++msgstr "" ++ ++msgid "minimum value 5 minutes == 300 seconds" ++msgstr "" ++ ++msgid "minutes" ++msgstr "" ++ ++msgid "missing / required" ++msgstr "" ++ ++msgid "must be greater or equal 'Check Interval'" ++msgstr "" ++ ++msgid "must start with 'http://'" ++msgstr "" ++ ++msgid "nc (netcat) can not connect" ++msgstr "" ++ ++msgid "never" ++msgstr "" ++ ++msgid "no data" ++msgstr "" ++ ++msgid "not found or not executable - Sample: '/path/to/script.sh'" ++msgstr "" ++ ++msgid "nslookup can not resolve host" ++msgstr "" ++ ++msgid "or" ++msgstr "" ++ ++msgid "or higher" ++msgstr "" ++ ++msgid "please disable" ++msgstr "" ++ ++msgid "please remove entry" ++msgstr "" ++ ++msgid "please select 'IPv4' address version" ++msgstr "" ++ ++msgid "please select 'IPv4' address version in" ++msgstr "" ++ ++msgid "please set to 'default'" ++msgstr "" ++ ++msgid "proxy port missing" ++msgstr "" ++ ++msgid "required" ++msgstr "" ++ ++msgid "seconds" ++msgstr "" ++ ++msgid "to run HTTPS without verification of server certificates (insecure)" ++msgstr "" ++ ++msgid "unknown error" ++msgstr "" ++ ++msgid "unspecific error" ++msgstr "" ++ ++msgid "use hostname, FQDN, IPv4- or IPv6-Address" ++msgstr "" ++ ++#~ msgid "Check for changed IP every" ++#~ msgstr "Verifica pentru adresa IP schimbata la fiecare" ++ ++#~ msgid "Check-time unit" ++#~ msgstr "Unitatea de verificare timp" ++ ++#~ msgid "Enable" ++#~ msgstr "Activeaza" ++ ++#~ msgid "Force update every" ++#~ msgstr "Forteaza actualizarea la fiecare" ++ ++#~ msgid "Force-time unit" ++#~ msgstr "Unitatea de timp la fortare actualizare" ++ ++#~ msgid "Hostname" ++#~ msgstr "Nume host" ++ ++#~ msgid "Service" ++#~ msgstr "Serviciu" ++ ++#~ msgid "Source of IP address" ++#~ msgstr "Sursa adresei IP" ++ ++#~ msgid "custom" ++#~ msgstr "particularizat" ++ ++# Hours ++#~ msgid "h" ++#~ msgstr "ore" ++ ++#~ msgid "interface" ++#~ msgstr "interfata" ++ ++# Minutes (not minimum) ++#~ msgid "min" ++#~ msgstr "minut(e)" ++ ++#~ msgid "network" ++#~ msgstr "retea" ++ ++#~ msgid "Event interface" ++#~ msgstr "Interfata eveniment" ++ ++#~ msgid "On which interface up should start the ddns script process." ++#~ msgstr "Pe care interfata trebuie sa porneasca scriptul ddns" +diff --git a/feeds/luci/applications/luci-app-ddns/po/ru/ddns.po b/feeds/luci/applications/luci-app-ddns/po/ru/ddns.po +new file mode 100644 +index 0000000..d4c0eb4 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-ddns/po/ru/ddns.po +@@ -0,0 +1,706 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: LuCI: ddns\n" ++"Report-Msgid-Bugs-To: \n" ++"POT-Creation-Date: 2010-04-02 13:44+0100\n" ++"PO-Revision-Date: 2012-11-01 21:54+0300\n" ++"Last-Translator: Roman A. aka BasicXP \n" ++"Language-Team: Russian \n" ++"Language: ru\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%" ++"10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" ++"X-Generator: Pootle 2.0.4\n" ++"X-Poedit-SourceCharset: UTF-8\n" ++ ++msgid "&" ++msgstr "" ++ ++msgid "-- custom --" ++msgstr "" ++ ++msgid "-- default --" ++msgstr "" ++ ++msgid "Advanced Settings" ++msgstr "" ++ ++msgid "Allow non-public IP's" ++msgstr "" ++ ++msgid "Applying changes" ++msgstr "" ++ ++msgid "Basic Settings" ++msgstr "" ++ ++msgid "" ++"Below a list of configuration tips for your system to run Dynamic DNS " ++"updates without limitations" ++msgstr "" ++ ++msgid "" ++"Below is a list of configured DDNS configurations and their current state." ++msgstr "" ++ ++msgid "Bind Network" ++msgstr "" ++ ++msgid "Binding to a specific network not supported" ++msgstr "" ++ ++msgid "" ++"BusyBox's nslookup and Wget do not support to specify the IP version to use " ++"for communication with DDNS Provider." ++msgstr "" ++ ++msgid "" ++"BusyBox's nslookup does not support to specify to use TCP instead of default " ++"UDP when requesting DNS server" ++msgstr "" ++ ++msgid "Casual users should not change this setting" ++msgstr "" ++ ++msgid "Check Interval" ++msgstr "" ++ ++msgid "Collecting data..." ++msgstr "" ++ ++msgid "Config error" ++msgstr "" ++ ++msgid "Configuration" ++msgstr "" ++ ++msgid "" ++"Configure here the details for all Dynamic DNS services including this LuCI " ++"application." ++msgstr "" ++ ++msgid "Configure here the details for selected Dynamic DNS service." ++msgstr "" ++ ++msgid "Current setting" ++msgstr "" ++ ++msgid "" ++"Currently DDNS updates are not started at boot or on interface events.
    This is the default if you run DDNS scripts by yourself (i.e. via cron with " ++"force_interval set to '0')" ++msgstr "" ++ ++msgid "" ++"Currently DDNS updates are not started at boot or on interface events.
    You can start/stop each configuration here. It will run until next reboot." ++msgstr "" ++ ++msgid "Custom update script to be used for updating your DDNS Provider." ++msgstr "" ++ ++msgid "Custom update-URL" ++msgstr "ПользовательÑкий URL обновлениÑ" ++ ++msgid "Custom update-script" ++msgstr "" ++ ++msgid "DDNS Autostart disabled" ++msgstr "" ++ ++msgid "DDNS Service provider" ++msgstr "" ++ ++msgid "DNS requests via TCP not supported" ++msgstr "" ++ ++msgid "DNS-Server" ++msgstr "" ++ ++msgid "Date format" ++msgstr "" ++ ++msgid "Defines the Web page to read systems IPv4-Address from" ++msgstr "" ++ ++msgid "Defines the Web page to read systems IPv6-Address from" ++msgstr "" ++ ++msgid "Defines the interface to read systems IP-Address from" ++msgstr "" ++ ++msgid "Defines the network to read systems IPv4-Address from" ++msgstr "" ++ ++msgid "Defines the network to read systems IPv6-Address from" ++msgstr "" ++ ++msgid "" ++"Defines the source to read systems IPv4-Address from, that will be send to " ++"the DDNS provider" ++msgstr "" ++ ++msgid "" ++"Defines the source to read systems IPv6-Address from, that will be send to " ++"the DDNS provider" ++msgstr "" ++ ++msgid "Defines which IP address 'IPv4/IPv6' is send to the DDNS provider" ++msgstr "" ++ ++msgid "Details for" ++msgstr "" ++ ++msgid "Directory contains Log files for each running section" ++msgstr "" ++ ++msgid "" ++"Directory contains PID and other status information for each running section" ++msgstr "" ++ ++msgid "Disabled" ++msgstr "" ++ ++msgid "Dynamic DNS" ++msgstr "ДинамичеÑкий DNS" ++ ++msgid "" ++"Dynamic DNS allows that your router can be reached with a fixed hostname " ++"while having a dynamically changing IP address." ++msgstr "" ++"ДинамичеÑкий DNS позволÑет вашему маршрутизатору иметь поÑтоÑнное доменное " ++"Ð¸Ð¼Ñ Ð¿Ñ€Ð¸ динамичеÑком IP-адреÑе." ++ ++msgid "Enable secure communication with DDNS provider" ++msgstr "" ++ ++msgid "Enabled" ++msgstr "" ++ ++msgid "Error" ++msgstr "" ++ ++msgid "Error Retry Counter" ++msgstr "" ++ ++msgid "Error Retry Interval" ++msgstr "" ++ ++msgid "Event Network" ++msgstr "" ++ ++msgid "File" ++msgstr "" ++ ++msgid "File not found" ++msgstr "" ++ ++msgid "File not found or empty" ++msgstr "" ++ ++msgid "" ++"Follow this link
    You will find more hints to optimize your system to " ++"run DDNS scripts with all options" ++msgstr "" ++ ++msgid "For detailed information about parameter settings look here." ++msgstr "" ++ ++msgid "For supported codes look here" ++msgstr "" ++ ++msgid "Force IP Version" ++msgstr "" ++ ++msgid "Force IP Version not supported" ++msgstr "" ++ ++msgid "Force Interval" ++msgstr "" ++ ++msgid "Force TCP on DNS" ++msgstr "" ++ ++msgid "Forced IP Version don't matched" ++msgstr "" ++ ++msgid "Format" ++msgstr "" ++ ++msgid "Format: IP or FQDN" ++msgstr "" ++ ++msgid "" ++"GNU Wget will use the IP of given network, cURL will use the physical " ++"interface." ++msgstr "" ++ ++msgid "Global Settings" ++msgstr "" ++ ++msgid "HTTPS not supported" ++msgstr "" ++ ++msgid "Hints" ++msgstr "" ++ ++msgid "Hostname/Domain" ++msgstr "" ++ ++msgid "IP address source" ++msgstr "" ++ ++msgid "IP address version" ++msgstr "" ++ ++msgid "IPv4-Address" ++msgstr "" ++ ++msgid "IPv6 address must be given in square brackets" ++msgstr "" ++ ++msgid "" ++"IPv6 is currently not (fully) supported by this system
    Please follow " ++"the instructions on OpenWrt's homepage to enable IPv6 support
    or update " ++"your system to the latest OpenWrt Release" ++msgstr "" ++ ++msgid "IPv6 not supported" ++msgstr "" ++ ++msgid "IPv6-Address" ++msgstr "" ++ ++msgid "If both cURL and GNU Wget are installed, Wget is used by default." ++msgstr "" ++ ++msgid "" ++"If this service section is disabled it could not be started.
    Neither " ++"from LuCI interface nor from console" ++msgstr "" ++ ++msgid "" ++"If you want to send updates for IPv4 and IPv6 you need to define two " ++"separate Configurations i.e. 'myddns_ipv4' and 'myddns_ipv6'" ++msgstr "" ++ ++msgid "" ++"In some versions cURL/libcurl in OpenWrt is compiled without proxy support." ++msgstr "" ++ ++msgid "Info" ++msgstr "" ++ ++msgid "Interface" ++msgstr "ИнтерфейÑ" ++ ++msgid "" ++"Interval to check for changed IP
    Values below 5 minutes == 300 seconds " ++"are not supported" ++msgstr "" ++ ++msgid "" ++"Interval to force updates send to DDNS Provider
    Setting this parameter " ++"to 0 will force the script to only run once
    Values lower 'Check " ++"Interval' except '0' are not supported" ++msgstr "" ++ ++msgid "It is NOT recommended for casual users to change settings on this page." ++msgstr "" ++ ++msgid "Last Update" ++msgstr "" ++ ++msgid "Loading" ++msgstr "" ++ ++msgid "Log File Viewer" ++msgstr "" ++ ++msgid "Log directory" ++msgstr "" ++ ++msgid "Log length" ++msgstr "" ++ ++msgid "Log to file" ++msgstr "" ++ ++msgid "Log to syslog" ++msgstr "" ++ ++msgid "" ++"Neither GNU Wget with SSL nor cURL installed to select a network to use for " ++"communication." ++msgstr "" ++ ++msgid "" ++"Neither GNU Wget with SSL nor cURL installed to support updates via HTTPS " ++"protocol." ++msgstr "" ++ ++msgid "Network" ++msgstr "Сеть" ++ ++msgid "Network on which the ddns-updater scripts will be started" ++msgstr "" ++ ++msgid "Never" ++msgstr "" ++ ++msgid "Next Update" ++msgstr "" ++ ++msgid "No data" ++msgstr "" ++ ++msgid "No logging" ++msgstr "" ++ ++msgid "Non-public and by default blocked IP's" ++msgstr "" ++ ++msgid "Notice" ++msgstr "" ++ ++msgid "Number of last lines stored in log files" ++msgstr "" ++ ++msgid "OPTIONAL: Force the usage of pure IPv4/IPv6 only communication." ++msgstr "" ++ ++msgid "OPTIONAL: Force the use of TCP instead of default UDP on DNS requests." ++msgstr "" ++ ++msgid "OPTIONAL: Network to use for communication" ++msgstr "" ++ ++msgid "OPTIONAL: Proxy-Server for detection and updates." ++msgstr "" ++ ++msgid "OPTIONAL: Use non-default DNS-Server to detect 'Registered IP'." ++msgstr "" ++ ++msgid "On Error the script will retry the failed action after given time" ++msgstr "" ++ ++msgid "On Error the script will stop execution after given number of retrys" ++msgstr "" ++ ++msgid "Overview" ++msgstr "" ++ ++msgid "PROXY-Server" ++msgstr "" ++ ++msgid "PROXY-Server not supported" ++msgstr "" ++ ++msgid "Password" ++msgstr "Пароль" ++ ++msgid "Path to CA-Certificate" ++msgstr "" ++ ++msgid "Please [Save & Apply] your changes first" ++msgstr "" ++ ++msgid "Please press [Read] button" ++msgstr "" ++ ++msgid "Please update to the current version!" ++msgstr "" ++ ++msgid "Process ID" ++msgstr "" ++ ++msgid "Read / Reread log file" ++msgstr "" ++ ++msgid "Registered IP" ++msgstr "" ++ ++msgid "Replaces [DOMAIN] in Update-URL" ++msgstr "" ++ ++msgid "Replaces [PASSWORD] in Update-URL" ++msgstr "" ++ ++msgid "Replaces [USERNAME] in Update-URL" ++msgstr "" ++ ++msgid "Run once" ++msgstr "" ++ ++msgid "Script" ++msgstr "" ++ ++msgid "Show more" ++msgstr "" ++ ++msgid "Software update required" ++msgstr "" ++ ++msgid "Start" ++msgstr "" ++ ++msgid "Start / Stop" ++msgstr "" ++ ++msgid "Status directory" ++msgstr "" ++ ++msgid "Stopped" ++msgstr "" ++ ++msgid "" ++"The currently installed 'ddns-scripts' package did not support all available " ++"settings." ++msgstr "" ++ ++msgid "There is no service configured." ++msgstr "" ++ ++msgid "Timer Settings" ++msgstr "" ++ ++msgid "To change global settings click here" ++msgstr "" ++ ++msgid "To use cURL activate this option." ++msgstr "" ++ ++msgid "URL" ++msgstr "URL" ++ ++msgid "URL to detect" ++msgstr "" ++ ++msgid "Unknown error" ++msgstr "" ++ ++msgid "" ++"Update URL to be used for updating your DDNS Provider.
    Follow " ++"instructions you will find on their WEB page." ++msgstr "" ++ ++msgid "Update error" ++msgstr "" ++ ++msgid "Use HTTP Secure" ++msgstr "" ++ ++msgid "Use cURL" ++msgstr "" ++ ++msgid "User defined script to read systems IP-Address" ++msgstr "" ++ ++msgid "Username" ++msgstr "Ð˜Ð¼Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ" ++ ++msgid "Verify" ++msgstr "" ++ ++msgid "Version" ++msgstr "" ++ ++msgid "Version Information" ++msgstr "" ++ ++msgid "Waiting for changes to be applied..." ++msgstr "" ++ ++msgid "Warning" ++msgstr "" ++ ++msgid "" ++"Writes detailed messages to log file. File will be truncated automatically." ++msgstr "" ++ ++msgid "" ++"Writes log messages to syslog. Critical Errors will always be written to " ++"syslog." ++msgstr "" ++ ++msgid "You should install BIND host package for DNS requests." ++msgstr "" ++ ++msgid "You should install GNU Wget with SSL (prefered) or cURL package." ++msgstr "" ++ ++msgid "You should install GNU Wget with SSL or cURL package." ++msgstr "" ++ ++msgid "You should install GNU Wget with SSL or replace libcurl." ++msgstr "" ++ ++msgid "cURL is installed, but libcurl was compiled without proxy support." ++msgstr "" ++ ++msgid "cURL without Proxy Support" ++msgstr "" ++ ++msgid "can not detect local IP. Please select a different Source combination" ++msgstr "" ++ ++msgid "can not resolve host:" ++msgstr "" ++ ++msgid "config error" ++msgstr "" ++ ++msgid "days" ++msgstr "" ++ ++msgid "directory or path/file" ++msgstr "" ++ ++msgid "either url or script could be set" ++msgstr "" ++ ++msgid "enable here" ++msgstr "" ++ ++msgid "file or directory not found or not 'IGNORE'" ++msgstr "" ++ ++msgid "help" ++msgstr "" ++ ++msgid "hours" ++msgstr "" ++ ++msgid "installed" ++msgstr "" ++ ++msgid "invalid - Sample" ++msgstr "" ++ ++msgid "minimum value '0'" ++msgstr "" ++ ++msgid "minimum value '1'" ++msgstr "" ++ ++msgid "minimum value 5 minutes == 300 seconds" ++msgstr "" ++ ++msgid "minutes" ++msgstr "" ++ ++msgid "missing / required" ++msgstr "" ++ ++msgid "must be greater or equal 'Check Interval'" ++msgstr "" ++ ++msgid "must start with 'http://'" ++msgstr "" ++ ++msgid "nc (netcat) can not connect" ++msgstr "" ++ ++msgid "never" ++msgstr "" ++ ++msgid "no data" ++msgstr "" ++ ++msgid "not found or not executable - Sample: '/path/to/script.sh'" ++msgstr "" ++ ++msgid "nslookup can not resolve host" ++msgstr "" ++ ++msgid "or" ++msgstr "" ++ ++msgid "or higher" ++msgstr "" ++ ++msgid "please disable" ++msgstr "" ++ ++msgid "please remove entry" ++msgstr "" ++ ++msgid "please select 'IPv4' address version" ++msgstr "" ++ ++msgid "please select 'IPv4' address version in" ++msgstr "" ++ ++msgid "please set to 'default'" ++msgstr "" ++ ++msgid "proxy port missing" ++msgstr "" ++ ++msgid "required" ++msgstr "" ++ ++msgid "seconds" ++msgstr "" ++ ++msgid "to run HTTPS without verification of server certificates (insecure)" ++msgstr "" ++ ++msgid "unknown error" ++msgstr "" ++ ++msgid "unspecific error" ++msgstr "" ++ ++msgid "use hostname, FQDN, IPv4- or IPv6-Address" ++msgstr "" ++ ++#~ msgid "Check for changed IP every" ++#~ msgstr "ПроверÑÑ‚ÑŒ, изменилÑÑ Ð»Ð¸ IP Ð°Ð´Ñ€ÐµÑ ÐºÐ°Ð¶Ð´Ñ‹Ðµ" ++ ++#~ msgid "Check-time unit" ++#~ msgstr "Единица Ð¸Ð·Ð¼ÐµÑ€ÐµÐ½Ð¸Ñ Ð¿Ñ€Ð¾Ð²ÐµÑ€ÐºÐ¸" ++ ++#~ msgid "Enable" ++#~ msgstr "Включить" ++ ++#~ msgid "Force update every" ++#~ msgstr "Принудительно обновлÑÑ‚ÑŒ каждые" ++ ++#~ msgid "Force-time unit" ++#~ msgstr "Единица Ð¸Ð·Ð¼ÐµÑ€ÐµÐ½Ð¸Ñ Ð¾Ð±Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ" ++ ++#~ msgid "Hostname" ++#~ msgstr "Ð˜Ð¼Ñ Ñ…Ð¾Ñта" ++ ++#~ msgid "Service" ++#~ msgstr "СервиÑ" ++ ++#~ msgid "Source of IP address" ++#~ msgstr "ИÑточник IP-адреÑа" ++ ++#~ msgid "custom" ++#~ msgstr "пользовательÑкий" ++ ++# Hours ++#~ msgid "h" ++#~ msgstr "ч" ++ ++#~ msgid "interface" ++#~ msgstr "интерфейÑ" ++ ++# Minutes (not minimum) ++#~ msgid "min" ++#~ msgstr "мин" ++ ++#~ msgid "network" ++#~ msgstr "Ñеть" ++ ++#~ msgid "Event interface" ++#~ msgstr "Ð˜Ð½Ñ‚ÐµÑ€Ñ„ÐµÐ¹Ñ ÑобытиÑ" ++ ++#~ msgid "On which interface up should start the ddns script process." ++#~ msgstr "" ++#~ "При включении какого интерфейÑа должен запуÑкатьÑÑ Ð¿Ñ€Ð¾Ñ†ÐµÑÑ Ñкрипта DDNS." +diff --git a/feeds/luci/applications/luci-app-ddns/po/sk/ddns.po b/feeds/luci/applications/luci-app-ddns/po/sk/ddns.po +new file mode 100644 +index 0000000..3cd0f4c +--- /dev/null ++++ b/feeds/luci/applications/luci-app-ddns/po/sk/ddns.po +@@ -0,0 +1,649 @@ ++msgid "" ++msgstr "" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Last-Translator: Automatically generated\n" ++"Language-Team: none\n" ++"MIME-Version: 1.0\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n" ++ ++msgid "&" ++msgstr "" ++ ++msgid "-- custom --" ++msgstr "" ++ ++msgid "-- default --" ++msgstr "" ++ ++msgid "Advanced Settings" ++msgstr "" ++ ++msgid "Allow non-public IP's" ++msgstr "" ++ ++msgid "Applying changes" ++msgstr "" ++ ++msgid "Basic Settings" ++msgstr "" ++ ++msgid "" ++"Below a list of configuration tips for your system to run Dynamic DNS " ++"updates without limitations" ++msgstr "" ++ ++msgid "" ++"Below is a list of configured DDNS configurations and their current state." ++msgstr "" ++ ++msgid "Bind Network" ++msgstr "" ++ ++msgid "Binding to a specific network not supported" ++msgstr "" ++ ++msgid "" ++"BusyBox's nslookup and Wget do not support to specify the IP version to use " ++"for communication with DDNS Provider." ++msgstr "" ++ ++msgid "" ++"BusyBox's nslookup does not support to specify to use TCP instead of default " ++"UDP when requesting DNS server" ++msgstr "" ++ ++msgid "Casual users should not change this setting" ++msgstr "" ++ ++msgid "Check Interval" ++msgstr "" ++ ++msgid "Collecting data..." ++msgstr "" ++ ++msgid "Config error" ++msgstr "" ++ ++msgid "Configuration" ++msgstr "" ++ ++msgid "" ++"Configure here the details for all Dynamic DNS services including this LuCI " ++"application." ++msgstr "" ++ ++msgid "Configure here the details for selected Dynamic DNS service." ++msgstr "" ++ ++msgid "Current setting" ++msgstr "" ++ ++msgid "" ++"Currently DDNS updates are not started at boot or on interface events.
    This is the default if you run DDNS scripts by yourself (i.e. via cron with " ++"force_interval set to '0')" ++msgstr "" ++ ++msgid "" ++"Currently DDNS updates are not started at boot or on interface events.
    You can start/stop each configuration here. It will run until next reboot." ++msgstr "" ++ ++msgid "Custom update script to be used for updating your DDNS Provider." ++msgstr "" ++ ++msgid "Custom update-URL" ++msgstr "" ++ ++msgid "Custom update-script" ++msgstr "" ++ ++msgid "DDNS Autostart disabled" ++msgstr "" ++ ++msgid "DDNS Service provider" ++msgstr "" ++ ++msgid "DNS requests via TCP not supported" ++msgstr "" ++ ++msgid "DNS-Server" ++msgstr "" ++ ++msgid "Date format" ++msgstr "" ++ ++msgid "Defines the Web page to read systems IPv4-Address from" ++msgstr "" ++ ++msgid "Defines the Web page to read systems IPv6-Address from" ++msgstr "" ++ ++msgid "Defines the interface to read systems IP-Address from" ++msgstr "" ++ ++msgid "Defines the network to read systems IPv4-Address from" ++msgstr "" ++ ++msgid "Defines the network to read systems IPv6-Address from" ++msgstr "" ++ ++msgid "" ++"Defines the source to read systems IPv4-Address from, that will be send to " ++"the DDNS provider" ++msgstr "" ++ ++msgid "" ++"Defines the source to read systems IPv6-Address from, that will be send to " ++"the DDNS provider" ++msgstr "" ++ ++msgid "Defines which IP address 'IPv4/IPv6' is send to the DDNS provider" ++msgstr "" ++ ++msgid "Details for" ++msgstr "" ++ ++msgid "Directory contains Log files for each running section" ++msgstr "" ++ ++msgid "" ++"Directory contains PID and other status information for each running section" ++msgstr "" ++ ++msgid "Disabled" ++msgstr "" ++ ++msgid "Dynamic DNS" ++msgstr "" ++ ++msgid "" ++"Dynamic DNS allows that your router can be reached with a fixed hostname " ++"while having a dynamically changing IP address." ++msgstr "" ++ ++msgid "Enable secure communication with DDNS provider" ++msgstr "" ++ ++msgid "Enabled" ++msgstr "" ++ ++msgid "Error" ++msgstr "" ++ ++msgid "Error Retry Counter" ++msgstr "" ++ ++msgid "Error Retry Interval" ++msgstr "" ++ ++msgid "Event Network" ++msgstr "" ++ ++msgid "File" ++msgstr "" ++ ++msgid "File not found" ++msgstr "" ++ ++msgid "File not found or empty" ++msgstr "" ++ ++msgid "" ++"Follow this link
    You will find more hints to optimize your system to " ++"run DDNS scripts with all options" ++msgstr "" ++ ++msgid "For detailed information about parameter settings look here." ++msgstr "" ++ ++msgid "For supported codes look here" ++msgstr "" ++ ++msgid "Force IP Version" ++msgstr "" ++ ++msgid "Force IP Version not supported" ++msgstr "" ++ ++msgid "Force Interval" ++msgstr "" ++ ++msgid "Force TCP on DNS" ++msgstr "" ++ ++msgid "Forced IP Version don't matched" ++msgstr "" ++ ++msgid "Format" ++msgstr "" ++ ++msgid "Format: IP or FQDN" ++msgstr "" ++ ++msgid "" ++"GNU Wget will use the IP of given network, cURL will use the physical " ++"interface." ++msgstr "" ++ ++msgid "Global Settings" ++msgstr "" ++ ++msgid "HTTPS not supported" ++msgstr "" ++ ++msgid "Hints" ++msgstr "" ++ ++msgid "Hostname/Domain" ++msgstr "" ++ ++msgid "IP address source" ++msgstr "" ++ ++msgid "IP address version" ++msgstr "" ++ ++msgid "IPv4-Address" ++msgstr "" ++ ++msgid "IPv6 address must be given in square brackets" ++msgstr "" ++ ++msgid "" ++"IPv6 is currently not (fully) supported by this system
    Please follow " ++"the instructions on OpenWrt's homepage to enable IPv6 support
    or update " ++"your system to the latest OpenWrt Release" ++msgstr "" ++ ++msgid "IPv6 not supported" ++msgstr "" ++ ++msgid "IPv6-Address" ++msgstr "" ++ ++msgid "If both cURL and GNU Wget are installed, Wget is used by default." ++msgstr "" ++ ++msgid "" ++"If this service section is disabled it could not be started.
    Neither " ++"from LuCI interface nor from console" ++msgstr "" ++ ++msgid "" ++"If you want to send updates for IPv4 and IPv6 you need to define two " ++"separate Configurations i.e. 'myddns_ipv4' and 'myddns_ipv6'" ++msgstr "" ++ ++msgid "" ++"In some versions cURL/libcurl in OpenWrt is compiled without proxy support." ++msgstr "" ++ ++msgid "Info" ++msgstr "" ++ ++msgid "Interface" ++msgstr "" ++ ++msgid "" ++"Interval to check for changed IP
    Values below 5 minutes == 300 seconds " ++"are not supported" ++msgstr "" ++ ++msgid "" ++"Interval to force updates send to DDNS Provider
    Setting this parameter " ++"to 0 will force the script to only run once
    Values lower 'Check " ++"Interval' except '0' are not supported" ++msgstr "" ++ ++msgid "It is NOT recommended for casual users to change settings on this page." ++msgstr "" ++ ++msgid "Last Update" ++msgstr "" ++ ++msgid "Loading" ++msgstr "" ++ ++msgid "Log File Viewer" ++msgstr "" ++ ++msgid "Log directory" ++msgstr "" ++ ++msgid "Log length" ++msgstr "" ++ ++msgid "Log to file" ++msgstr "" ++ ++msgid "Log to syslog" ++msgstr "" ++ ++msgid "" ++"Neither GNU Wget with SSL nor cURL installed to select a network to use for " ++"communication." ++msgstr "" ++ ++msgid "" ++"Neither GNU Wget with SSL nor cURL installed to support updates via HTTPS " ++"protocol." ++msgstr "" ++ ++msgid "Network" ++msgstr "" ++ ++msgid "Network on which the ddns-updater scripts will be started" ++msgstr "" ++ ++msgid "Never" ++msgstr "" ++ ++msgid "Next Update" ++msgstr "" ++ ++msgid "No data" ++msgstr "" ++ ++msgid "No logging" ++msgstr "" ++ ++msgid "Non-public and by default blocked IP's" ++msgstr "" ++ ++msgid "Notice" ++msgstr "" ++ ++msgid "Number of last lines stored in log files" ++msgstr "" ++ ++msgid "OPTIONAL: Force the usage of pure IPv4/IPv6 only communication." ++msgstr "" ++ ++msgid "OPTIONAL: Force the use of TCP instead of default UDP on DNS requests." ++msgstr "" ++ ++msgid "OPTIONAL: Network to use for communication" ++msgstr "" ++ ++msgid "OPTIONAL: Proxy-Server for detection and updates." ++msgstr "" ++ ++msgid "OPTIONAL: Use non-default DNS-Server to detect 'Registered IP'." ++msgstr "" ++ ++msgid "On Error the script will retry the failed action after given time" ++msgstr "" ++ ++msgid "On Error the script will stop execution after given number of retrys" ++msgstr "" ++ ++msgid "Overview" ++msgstr "" ++ ++msgid "PROXY-Server" ++msgstr "" ++ ++msgid "PROXY-Server not supported" ++msgstr "" ++ ++msgid "Password" ++msgstr "" ++ ++msgid "Path to CA-Certificate" ++msgstr "" ++ ++msgid "Please [Save & Apply] your changes first" ++msgstr "" ++ ++msgid "Please press [Read] button" ++msgstr "" ++ ++msgid "Please update to the current version!" ++msgstr "" ++ ++msgid "Process ID" ++msgstr "" ++ ++msgid "Read / Reread log file" ++msgstr "" ++ ++msgid "Registered IP" ++msgstr "" ++ ++msgid "Replaces [DOMAIN] in Update-URL" ++msgstr "" ++ ++msgid "Replaces [PASSWORD] in Update-URL" ++msgstr "" ++ ++msgid "Replaces [USERNAME] in Update-URL" ++msgstr "" ++ ++msgid "Run once" ++msgstr "" ++ ++msgid "Script" ++msgstr "" ++ ++msgid "Show more" ++msgstr "" ++ ++msgid "Software update required" ++msgstr "" ++ ++msgid "Start" ++msgstr "" ++ ++msgid "Start / Stop" ++msgstr "" ++ ++msgid "Status directory" ++msgstr "" ++ ++msgid "Stopped" ++msgstr "" ++ ++msgid "" ++"The currently installed 'ddns-scripts' package did not support all available " ++"settings." ++msgstr "" ++ ++msgid "There is no service configured." ++msgstr "" ++ ++msgid "Timer Settings" ++msgstr "" ++ ++msgid "To change global settings click here" ++msgstr "" ++ ++msgid "To use cURL activate this option." ++msgstr "" ++ ++msgid "URL" ++msgstr "" ++ ++msgid "URL to detect" ++msgstr "" ++ ++msgid "Unknown error" ++msgstr "" ++ ++msgid "" ++"Update URL to be used for updating your DDNS Provider.
    Follow " ++"instructions you will find on their WEB page." ++msgstr "" ++ ++msgid "Update error" ++msgstr "" ++ ++msgid "Use HTTP Secure" ++msgstr "" ++ ++msgid "Use cURL" ++msgstr "" ++ ++msgid "User defined script to read systems IP-Address" ++msgstr "" ++ ++msgid "Username" ++msgstr "" ++ ++msgid "Verify" ++msgstr "" ++ ++msgid "Version" ++msgstr "" ++ ++msgid "Version Information" ++msgstr "" ++ ++msgid "Waiting for changes to be applied..." ++msgstr "" ++ ++msgid "Warning" ++msgstr "" ++ ++msgid "" ++"Writes detailed messages to log file. File will be truncated automatically." ++msgstr "" ++ ++msgid "" ++"Writes log messages to syslog. Critical Errors will always be written to " ++"syslog." ++msgstr "" ++ ++msgid "You should install BIND host package for DNS requests." ++msgstr "" ++ ++msgid "You should install GNU Wget with SSL (prefered) or cURL package." ++msgstr "" ++ ++msgid "You should install GNU Wget with SSL or cURL package." ++msgstr "" ++ ++msgid "You should install GNU Wget with SSL or replace libcurl." ++msgstr "" ++ ++msgid "cURL is installed, but libcurl was compiled without proxy support." ++msgstr "" ++ ++msgid "cURL without Proxy Support" ++msgstr "" ++ ++msgid "can not detect local IP. Please select a different Source combination" ++msgstr "" ++ ++msgid "can not resolve host:" ++msgstr "" ++ ++msgid "config error" ++msgstr "" ++ ++msgid "days" ++msgstr "" ++ ++msgid "directory or path/file" ++msgstr "" ++ ++msgid "either url or script could be set" ++msgstr "" ++ ++msgid "enable here" ++msgstr "" ++ ++msgid "file or directory not found or not 'IGNORE'" ++msgstr "" ++ ++msgid "help" ++msgstr "" ++ ++msgid "hours" ++msgstr "" ++ ++msgid "installed" ++msgstr "" ++ ++msgid "invalid - Sample" ++msgstr "" ++ ++msgid "minimum value '0'" ++msgstr "" ++ ++msgid "minimum value '1'" ++msgstr "" ++ ++msgid "minimum value 5 minutes == 300 seconds" ++msgstr "" ++ ++msgid "minutes" ++msgstr "" ++ ++msgid "missing / required" ++msgstr "" ++ ++msgid "must be greater or equal 'Check Interval'" ++msgstr "" ++ ++msgid "must start with 'http://'" ++msgstr "" ++ ++msgid "nc (netcat) can not connect" ++msgstr "" ++ ++msgid "never" ++msgstr "" ++ ++msgid "no data" ++msgstr "" ++ ++msgid "not found or not executable - Sample: '/path/to/script.sh'" ++msgstr "" ++ ++msgid "nslookup can not resolve host" ++msgstr "" ++ ++msgid "or" ++msgstr "" ++ ++msgid "or higher" ++msgstr "" ++ ++msgid "please disable" ++msgstr "" ++ ++msgid "please remove entry" ++msgstr "" ++ ++msgid "please select 'IPv4' address version" ++msgstr "" ++ ++msgid "please select 'IPv4' address version in" ++msgstr "" ++ ++msgid "please set to 'default'" ++msgstr "" ++ ++msgid "proxy port missing" ++msgstr "" ++ ++msgid "required" ++msgstr "" ++ ++msgid "seconds" ++msgstr "" ++ ++msgid "to run HTTPS without verification of server certificates (insecure)" ++msgstr "" ++ ++msgid "unknown error" ++msgstr "" ++ ++msgid "unspecific error" ++msgstr "" ++ ++msgid "use hostname, FQDN, IPv4- or IPv6-Address" ++msgstr "" +diff --git a/feeds/luci/applications/luci-app-ddns/po/sv/ddns.po b/feeds/luci/applications/luci-app-ddns/po/sv/ddns.po +new file mode 100644 +index 0000000..cee36e7 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-ddns/po/sv/ddns.po +@@ -0,0 +1,650 @@ ++msgid "" ++msgstr "" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Last-Translator: Automatically generated\n" ++"Language-Team: none\n" ++"Language: sv\n" ++"MIME-Version: 1.0\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n != 1);\n" ++ ++msgid "&" ++msgstr "" ++ ++msgid "-- custom --" ++msgstr "" ++ ++msgid "-- default --" ++msgstr "" ++ ++msgid "Advanced Settings" ++msgstr "" ++ ++msgid "Allow non-public IP's" ++msgstr "" ++ ++msgid "Applying changes" ++msgstr "" ++ ++msgid "Basic Settings" ++msgstr "" ++ ++msgid "" ++"Below a list of configuration tips for your system to run Dynamic DNS " ++"updates without limitations" ++msgstr "" ++ ++msgid "" ++"Below is a list of configured DDNS configurations and their current state." ++msgstr "" ++ ++msgid "Bind Network" ++msgstr "" ++ ++msgid "Binding to a specific network not supported" ++msgstr "" ++ ++msgid "" ++"BusyBox's nslookup and Wget do not support to specify the IP version to use " ++"for communication with DDNS Provider." ++msgstr "" ++ ++msgid "" ++"BusyBox's nslookup does not support to specify to use TCP instead of default " ++"UDP when requesting DNS server" ++msgstr "" ++ ++msgid "Casual users should not change this setting" ++msgstr "" ++ ++msgid "Check Interval" ++msgstr "" ++ ++msgid "Collecting data..." ++msgstr "" ++ ++msgid "Config error" ++msgstr "" ++ ++msgid "Configuration" ++msgstr "" ++ ++msgid "" ++"Configure here the details for all Dynamic DNS services including this LuCI " ++"application." ++msgstr "" ++ ++msgid "Configure here the details for selected Dynamic DNS service." ++msgstr "" ++ ++msgid "Current setting" ++msgstr "" ++ ++msgid "" ++"Currently DDNS updates are not started at boot or on interface events.
    This is the default if you run DDNS scripts by yourself (i.e. via cron with " ++"force_interval set to '0')" ++msgstr "" ++ ++msgid "" ++"Currently DDNS updates are not started at boot or on interface events.
    You can start/stop each configuration here. It will run until next reboot." ++msgstr "" ++ ++msgid "Custom update script to be used for updating your DDNS Provider." ++msgstr "" ++ ++msgid "Custom update-URL" ++msgstr "" ++ ++msgid "Custom update-script" ++msgstr "" ++ ++msgid "DDNS Autostart disabled" ++msgstr "" ++ ++msgid "DDNS Service provider" ++msgstr "" ++ ++msgid "DNS requests via TCP not supported" ++msgstr "" ++ ++msgid "DNS-Server" ++msgstr "" ++ ++msgid "Date format" ++msgstr "" ++ ++msgid "Defines the Web page to read systems IPv4-Address from" ++msgstr "" ++ ++msgid "Defines the Web page to read systems IPv6-Address from" ++msgstr "" ++ ++msgid "Defines the interface to read systems IP-Address from" ++msgstr "" ++ ++msgid "Defines the network to read systems IPv4-Address from" ++msgstr "" ++ ++msgid "Defines the network to read systems IPv6-Address from" ++msgstr "" ++ ++msgid "" ++"Defines the source to read systems IPv4-Address from, that will be send to " ++"the DDNS provider" ++msgstr "" ++ ++msgid "" ++"Defines the source to read systems IPv6-Address from, that will be send to " ++"the DDNS provider" ++msgstr "" ++ ++msgid "Defines which IP address 'IPv4/IPv6' is send to the DDNS provider" ++msgstr "" ++ ++msgid "Details for" ++msgstr "" ++ ++msgid "Directory contains Log files for each running section" ++msgstr "" ++ ++msgid "" ++"Directory contains PID and other status information for each running section" ++msgstr "" ++ ++msgid "Disabled" ++msgstr "" ++ ++msgid "Dynamic DNS" ++msgstr "" ++ ++msgid "" ++"Dynamic DNS allows that your router can be reached with a fixed hostname " ++"while having a dynamically changing IP address." ++msgstr "" ++ ++msgid "Enable secure communication with DDNS provider" ++msgstr "" ++ ++msgid "Enabled" ++msgstr "" ++ ++msgid "Error" ++msgstr "" ++ ++msgid "Error Retry Counter" ++msgstr "" ++ ++msgid "Error Retry Interval" ++msgstr "" ++ ++msgid "Event Network" ++msgstr "" ++ ++msgid "File" ++msgstr "" ++ ++msgid "File not found" ++msgstr "" ++ ++msgid "File not found or empty" ++msgstr "" ++ ++msgid "" ++"Follow this link
    You will find more hints to optimize your system to " ++"run DDNS scripts with all options" ++msgstr "" ++ ++msgid "For detailed information about parameter settings look here." ++msgstr "" ++ ++msgid "For supported codes look here" ++msgstr "" ++ ++msgid "Force IP Version" ++msgstr "" ++ ++msgid "Force IP Version not supported" ++msgstr "" ++ ++msgid "Force Interval" ++msgstr "" ++ ++msgid "Force TCP on DNS" ++msgstr "" ++ ++msgid "Forced IP Version don't matched" ++msgstr "" ++ ++msgid "Format" ++msgstr "" ++ ++msgid "Format: IP or FQDN" ++msgstr "" ++ ++msgid "" ++"GNU Wget will use the IP of given network, cURL will use the physical " ++"interface." ++msgstr "" ++ ++msgid "Global Settings" ++msgstr "" ++ ++msgid "HTTPS not supported" ++msgstr "" ++ ++msgid "Hints" ++msgstr "" ++ ++msgid "Hostname/Domain" ++msgstr "" ++ ++msgid "IP address source" ++msgstr "" ++ ++msgid "IP address version" ++msgstr "" ++ ++msgid "IPv4-Address" ++msgstr "" ++ ++msgid "IPv6 address must be given in square brackets" ++msgstr "" ++ ++msgid "" ++"IPv6 is currently not (fully) supported by this system
    Please follow " ++"the instructions on OpenWrt's homepage to enable IPv6 support
    or update " ++"your system to the latest OpenWrt Release" ++msgstr "" ++ ++msgid "IPv6 not supported" ++msgstr "" ++ ++msgid "IPv6-Address" ++msgstr "" ++ ++msgid "If both cURL and GNU Wget are installed, Wget is used by default." ++msgstr "" ++ ++msgid "" ++"If this service section is disabled it could not be started.
    Neither " ++"from LuCI interface nor from console" ++msgstr "" ++ ++msgid "" ++"If you want to send updates for IPv4 and IPv6 you need to define two " ++"separate Configurations i.e. 'myddns_ipv4' and 'myddns_ipv6'" ++msgstr "" ++ ++msgid "" ++"In some versions cURL/libcurl in OpenWrt is compiled without proxy support." ++msgstr "" ++ ++msgid "Info" ++msgstr "" ++ ++msgid "Interface" ++msgstr "" ++ ++msgid "" ++"Interval to check for changed IP
    Values below 5 minutes == 300 seconds " ++"are not supported" ++msgstr "" ++ ++msgid "" ++"Interval to force updates send to DDNS Provider
    Setting this parameter " ++"to 0 will force the script to only run once
    Values lower 'Check " ++"Interval' except '0' are not supported" ++msgstr "" ++ ++msgid "It is NOT recommended for casual users to change settings on this page." ++msgstr "" ++ ++msgid "Last Update" ++msgstr "" ++ ++msgid "Loading" ++msgstr "" ++ ++msgid "Log File Viewer" ++msgstr "" ++ ++msgid "Log directory" ++msgstr "" ++ ++msgid "Log length" ++msgstr "" ++ ++msgid "Log to file" ++msgstr "" ++ ++msgid "Log to syslog" ++msgstr "" ++ ++msgid "" ++"Neither GNU Wget with SSL nor cURL installed to select a network to use for " ++"communication." ++msgstr "" ++ ++msgid "" ++"Neither GNU Wget with SSL nor cURL installed to support updates via HTTPS " ++"protocol." ++msgstr "" ++ ++msgid "Network" ++msgstr "" ++ ++msgid "Network on which the ddns-updater scripts will be started" ++msgstr "" ++ ++msgid "Never" ++msgstr "" ++ ++msgid "Next Update" ++msgstr "" ++ ++msgid "No data" ++msgstr "" ++ ++msgid "No logging" ++msgstr "" ++ ++msgid "Non-public and by default blocked IP's" ++msgstr "" ++ ++msgid "Notice" ++msgstr "" ++ ++msgid "Number of last lines stored in log files" ++msgstr "" ++ ++msgid "OPTIONAL: Force the usage of pure IPv4/IPv6 only communication." ++msgstr "" ++ ++msgid "OPTIONAL: Force the use of TCP instead of default UDP on DNS requests." ++msgstr "" ++ ++msgid "OPTIONAL: Network to use for communication" ++msgstr "" ++ ++msgid "OPTIONAL: Proxy-Server for detection and updates." ++msgstr "" ++ ++msgid "OPTIONAL: Use non-default DNS-Server to detect 'Registered IP'." ++msgstr "" ++ ++msgid "On Error the script will retry the failed action after given time" ++msgstr "" ++ ++msgid "On Error the script will stop execution after given number of retrys" ++msgstr "" ++ ++msgid "Overview" ++msgstr "" ++ ++msgid "PROXY-Server" ++msgstr "" ++ ++msgid "PROXY-Server not supported" ++msgstr "" ++ ++msgid "Password" ++msgstr "" ++ ++msgid "Path to CA-Certificate" ++msgstr "" ++ ++msgid "Please [Save & Apply] your changes first" ++msgstr "" ++ ++msgid "Please press [Read] button" ++msgstr "" ++ ++msgid "Please update to the current version!" ++msgstr "" ++ ++msgid "Process ID" ++msgstr "" ++ ++msgid "Read / Reread log file" ++msgstr "" ++ ++msgid "Registered IP" ++msgstr "" ++ ++msgid "Replaces [DOMAIN] in Update-URL" ++msgstr "" ++ ++msgid "Replaces [PASSWORD] in Update-URL" ++msgstr "" ++ ++msgid "Replaces [USERNAME] in Update-URL" ++msgstr "" ++ ++msgid "Run once" ++msgstr "" ++ ++msgid "Script" ++msgstr "" ++ ++msgid "Show more" ++msgstr "" ++ ++msgid "Software update required" ++msgstr "" ++ ++msgid "Start" ++msgstr "" ++ ++msgid "Start / Stop" ++msgstr "" ++ ++msgid "Status directory" ++msgstr "" ++ ++msgid "Stopped" ++msgstr "" ++ ++msgid "" ++"The currently installed 'ddns-scripts' package did not support all available " ++"settings." ++msgstr "" ++ ++msgid "There is no service configured." ++msgstr "" ++ ++msgid "Timer Settings" ++msgstr "" ++ ++msgid "To change global settings click here" ++msgstr "" ++ ++msgid "To use cURL activate this option." ++msgstr "" ++ ++msgid "URL" ++msgstr "" ++ ++msgid "URL to detect" ++msgstr "" ++ ++msgid "Unknown error" ++msgstr "" ++ ++msgid "" ++"Update URL to be used for updating your DDNS Provider.
    Follow " ++"instructions you will find on their WEB page." ++msgstr "" ++ ++msgid "Update error" ++msgstr "" ++ ++msgid "Use HTTP Secure" ++msgstr "" ++ ++msgid "Use cURL" ++msgstr "" ++ ++msgid "User defined script to read systems IP-Address" ++msgstr "" ++ ++msgid "Username" ++msgstr "" ++ ++msgid "Verify" ++msgstr "" ++ ++msgid "Version" ++msgstr "" ++ ++msgid "Version Information" ++msgstr "" ++ ++msgid "Waiting for changes to be applied..." ++msgstr "" ++ ++msgid "Warning" ++msgstr "" ++ ++msgid "" ++"Writes detailed messages to log file. File will be truncated automatically." ++msgstr "" ++ ++msgid "" ++"Writes log messages to syslog. Critical Errors will always be written to " ++"syslog." ++msgstr "" ++ ++msgid "You should install BIND host package for DNS requests." ++msgstr "" ++ ++msgid "You should install GNU Wget with SSL (prefered) or cURL package." ++msgstr "" ++ ++msgid "You should install GNU Wget with SSL or cURL package." ++msgstr "" ++ ++msgid "You should install GNU Wget with SSL or replace libcurl." ++msgstr "" ++ ++msgid "cURL is installed, but libcurl was compiled without proxy support." ++msgstr "" ++ ++msgid "cURL without Proxy Support" ++msgstr "" ++ ++msgid "can not detect local IP. Please select a different Source combination" ++msgstr "" ++ ++msgid "can not resolve host:" ++msgstr "" ++ ++msgid "config error" ++msgstr "" ++ ++msgid "days" ++msgstr "" ++ ++msgid "directory or path/file" ++msgstr "" ++ ++msgid "either url or script could be set" ++msgstr "" ++ ++msgid "enable here" ++msgstr "" ++ ++msgid "file or directory not found or not 'IGNORE'" ++msgstr "" ++ ++msgid "help" ++msgstr "" ++ ++msgid "hours" ++msgstr "" ++ ++msgid "installed" ++msgstr "" ++ ++msgid "invalid - Sample" ++msgstr "" ++ ++msgid "minimum value '0'" ++msgstr "" ++ ++msgid "minimum value '1'" ++msgstr "" ++ ++msgid "minimum value 5 minutes == 300 seconds" ++msgstr "" ++ ++msgid "minutes" ++msgstr "" ++ ++msgid "missing / required" ++msgstr "" ++ ++msgid "must be greater or equal 'Check Interval'" ++msgstr "" ++ ++msgid "must start with 'http://'" ++msgstr "" ++ ++msgid "nc (netcat) can not connect" ++msgstr "" ++ ++msgid "never" ++msgstr "" ++ ++msgid "no data" ++msgstr "" ++ ++msgid "not found or not executable - Sample: '/path/to/script.sh'" ++msgstr "" ++ ++msgid "nslookup can not resolve host" ++msgstr "" ++ ++msgid "or" ++msgstr "" ++ ++msgid "or higher" ++msgstr "" ++ ++msgid "please disable" ++msgstr "" ++ ++msgid "please remove entry" ++msgstr "" ++ ++msgid "please select 'IPv4' address version" ++msgstr "" ++ ++msgid "please select 'IPv4' address version in" ++msgstr "" ++ ++msgid "please set to 'default'" ++msgstr "" ++ ++msgid "proxy port missing" ++msgstr "" ++ ++msgid "required" ++msgstr "" ++ ++msgid "seconds" ++msgstr "" ++ ++msgid "to run HTTPS without verification of server certificates (insecure)" ++msgstr "" ++ ++msgid "unknown error" ++msgstr "" ++ ++msgid "unspecific error" ++msgstr "" ++ ++msgid "use hostname, FQDN, IPv4- or IPv6-Address" ++msgstr "" +diff --git a/feeds/luci/applications/luci-app-ddns/po/templates/ddns.pot b/feeds/luci/applications/luci-app-ddns/po/templates/ddns.pot +new file mode 100644 +index 0000000..3538680 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-ddns/po/templates/ddns.pot +@@ -0,0 +1,645 @@ ++msgid "" ++msgstr "Content-Type: text/plain; charset=UTF-8" ++ ++msgid "&" ++msgstr "" ++ ++msgid "-- custom --" ++msgstr "" ++ ++msgid "-- default --" ++msgstr "" ++ ++msgid "Advanced Settings" ++msgstr "" ++ ++msgid "Allow non-public IP's" ++msgstr "" ++ ++msgid "Applying changes" ++msgstr "" ++ ++msgid "Basic Settings" ++msgstr "" ++ ++msgid "" ++"Below a list of configuration tips for your system to run Dynamic DNS " ++"updates without limitations" ++msgstr "" ++ ++msgid "" ++"Below is a list of configured DDNS configurations and their current state." ++msgstr "" ++ ++msgid "Bind Network" ++msgstr "" ++ ++msgid "Binding to a specific network not supported" ++msgstr "" ++ ++msgid "" ++"BusyBox's nslookup and Wget do not support to specify the IP version to use " ++"for communication with DDNS Provider." ++msgstr "" ++ ++msgid "" ++"BusyBox's nslookup does not support to specify to use TCP instead of default " ++"UDP when requesting DNS server" ++msgstr "" ++ ++msgid "Casual users should not change this setting" ++msgstr "" ++ ++msgid "Check Interval" ++msgstr "" ++ ++msgid "Collecting data..." ++msgstr "" ++ ++msgid "Config error" ++msgstr "" ++ ++msgid "Configuration" ++msgstr "" ++ ++msgid "" ++"Configure here the details for all Dynamic DNS services including this LuCI " ++"application." ++msgstr "" ++ ++msgid "Configure here the details for selected Dynamic DNS service." ++msgstr "" ++ ++msgid "Current setting" ++msgstr "" ++ ++msgid "" ++"Currently DDNS updates are not started at boot or on interface events.
    This is the default if you run DDNS scripts by yourself (i.e. via cron with " ++"force_interval set to '0')" ++msgstr "" ++ ++msgid "" ++"Currently DDNS updates are not started at boot or on interface events.
    You can start/stop each configuration here. It will run until next reboot." ++msgstr "" ++ ++msgid "Custom update script to be used for updating your DDNS Provider." ++msgstr "" ++ ++msgid "Custom update-URL" ++msgstr "" ++ ++msgid "Custom update-script" ++msgstr "" ++ ++msgid "DDNS Autostart disabled" ++msgstr "" ++ ++msgid "DDNS Service provider" ++msgstr "" ++ ++msgid "DNS requests via TCP not supported" ++msgstr "" ++ ++msgid "DNS-Server" ++msgstr "" ++ ++msgid "Date format" ++msgstr "" ++ ++msgid "Defines the Web page to read systems IPv4-Address from" ++msgstr "" ++ ++msgid "Defines the Web page to read systems IPv6-Address from" ++msgstr "" ++ ++msgid "Defines the interface to read systems IP-Address from" ++msgstr "" ++ ++msgid "Defines the network to read systems IPv4-Address from" ++msgstr "" ++ ++msgid "Defines the network to read systems IPv6-Address from" ++msgstr "" ++ ++msgid "" ++"Defines the source to read systems IPv4-Address from, that will be send to " ++"the DDNS provider" ++msgstr "" ++ ++msgid "" ++"Defines the source to read systems IPv6-Address from, that will be send to " ++"the DDNS provider" ++msgstr "" ++ ++msgid "Defines which IP address 'IPv4/IPv6' is send to the DDNS provider" ++msgstr "" ++ ++msgid "Details for" ++msgstr "" ++ ++msgid "Directory contains Log files for each running section" ++msgstr "" ++ ++msgid "" ++"Directory contains PID and other status information for each running section" ++msgstr "" ++ ++msgid "Disabled" ++msgstr "" ++ ++msgid "Dynamic DNS" ++msgstr "" ++ ++msgid "" ++"Dynamic DNS allows that your router can be reached with a fixed hostname " ++"while having a dynamically changing IP address." ++msgstr "" ++ ++msgid "Enable secure communication with DDNS provider" ++msgstr "" ++ ++msgid "Enabled" ++msgstr "" ++ ++msgid "Error" ++msgstr "" ++ ++msgid "Error Retry Counter" ++msgstr "" ++ ++msgid "Error Retry Interval" ++msgstr "" ++ ++msgid "Event Network" ++msgstr "" ++ ++msgid "File" ++msgstr "" ++ ++msgid "File not found" ++msgstr "" ++ ++msgid "File not found or empty" ++msgstr "" ++ ++msgid "" ++"Follow this link
    You will find more hints to optimize your system to " ++"run DDNS scripts with all options" ++msgstr "" ++ ++msgid "For detailed information about parameter settings look here." ++msgstr "" ++ ++msgid "For supported codes look here" ++msgstr "" ++ ++msgid "Force IP Version" ++msgstr "" ++ ++msgid "Force IP Version not supported" ++msgstr "" ++ ++msgid "Force Interval" ++msgstr "" ++ ++msgid "Force TCP on DNS" ++msgstr "" ++ ++msgid "Forced IP Version don't matched" ++msgstr "" ++ ++msgid "Format" ++msgstr "" ++ ++msgid "Format: IP or FQDN" ++msgstr "" ++ ++msgid "" ++"GNU Wget will use the IP of given network, cURL will use the physical " ++"interface." ++msgstr "" ++ ++msgid "Global Settings" ++msgstr "" ++ ++msgid "HTTPS not supported" ++msgstr "" ++ ++msgid "Hints" ++msgstr "" ++ ++msgid "Hostname/Domain" ++msgstr "" ++ ++msgid "IP address source" ++msgstr "" ++ ++msgid "IP address version" ++msgstr "" ++ ++msgid "IPv4-Address" ++msgstr "" ++ ++msgid "IPv6 address must be given in square brackets" ++msgstr "" ++ ++msgid "" ++"IPv6 is currently not (fully) supported by this system
    Please follow " ++"the instructions on OpenWrt's homepage to enable IPv6 support
    or update " ++"your system to the latest OpenWrt Release" ++msgstr "" ++ ++msgid "IPv6 not supported" ++msgstr "" ++ ++msgid "IPv6-Address" ++msgstr "" ++ ++msgid "If both cURL and GNU Wget are installed, Wget is used by default." ++msgstr "" ++ ++msgid "" ++"If this service section is disabled it could not be started.
    Neither " ++"from LuCI interface nor from console" ++msgstr "" ++ ++msgid "" ++"If you want to send updates for IPv4 and IPv6 you need to define two " ++"separate Configurations i.e. 'myddns_ipv4' and 'myddns_ipv6'" ++msgstr "" ++ ++msgid "" ++"In some versions cURL/libcurl in OpenWrt is compiled without proxy support." ++msgstr "" ++ ++msgid "Info" ++msgstr "" ++ ++msgid "Interface" ++msgstr "" ++ ++msgid "" ++"Interval to check for changed IP
    Values below 5 minutes == 300 seconds " ++"are not supported" ++msgstr "" ++ ++msgid "" ++"Interval to force updates send to DDNS Provider
    Setting this parameter " ++"to 0 will force the script to only run once
    Values lower 'Check " ++"Interval' except '0' are not supported" ++msgstr "" ++ ++msgid "It is NOT recommended for casual users to change settings on this page." ++msgstr "" ++ ++msgid "Last Update" ++msgstr "" ++ ++msgid "Loading" ++msgstr "" ++ ++msgid "Log File Viewer" ++msgstr "" ++ ++msgid "Log directory" ++msgstr "" ++ ++msgid "Log length" ++msgstr "" ++ ++msgid "Log to file" ++msgstr "" ++ ++msgid "Log to syslog" ++msgstr "" ++ ++msgid "" ++"Neither GNU Wget with SSL nor cURL installed to select a network to use for " ++"communication." ++msgstr "" ++ ++msgid "" ++"Neither GNU Wget with SSL nor cURL installed to support updates via HTTPS " ++"protocol." ++msgstr "" ++ ++msgid "Network" ++msgstr "" ++ ++msgid "Network on which the ddns-updater scripts will be started" ++msgstr "" ++ ++msgid "Never" ++msgstr "" ++ ++msgid "Next Update" ++msgstr "" ++ ++msgid "No data" ++msgstr "" ++ ++msgid "No logging" ++msgstr "" ++ ++msgid "Non-public and by default blocked IP's" ++msgstr "" ++ ++msgid "Notice" ++msgstr "" ++ ++msgid "Number of last lines stored in log files" ++msgstr "" ++ ++msgid "OPTIONAL: Force the usage of pure IPv4/IPv6 only communication." ++msgstr "" ++ ++msgid "OPTIONAL: Force the use of TCP instead of default UDP on DNS requests." ++msgstr "" ++ ++msgid "OPTIONAL: Network to use for communication" ++msgstr "" ++ ++msgid "OPTIONAL: Proxy-Server for detection and updates." ++msgstr "" ++ ++msgid "OPTIONAL: Use non-default DNS-Server to detect 'Registered IP'." ++msgstr "" ++ ++msgid "On Error the script will retry the failed action after given time" ++msgstr "" ++ ++msgid "On Error the script will stop execution after given number of retrys" ++msgstr "" ++ ++msgid "Overview" ++msgstr "" ++ ++msgid "PROXY-Server" ++msgstr "" ++ ++msgid "PROXY-Server not supported" ++msgstr "" ++ ++msgid "Password" ++msgstr "" ++ ++msgid "Path to CA-Certificate" ++msgstr "" ++ ++msgid "Please [Save & Apply] your changes first" ++msgstr "" ++ ++msgid "Please press [Read] button" ++msgstr "" ++ ++msgid "Please update to the current version!" ++msgstr "" ++ ++msgid "Process ID" ++msgstr "" ++ ++msgid "Read / Reread log file" ++msgstr "" ++ ++msgid "Registered IP" ++msgstr "" ++ ++msgid "Replaces [DOMAIN] in Update-URL" ++msgstr "" ++ ++msgid "Replaces [PASSWORD] in Update-URL" ++msgstr "" ++ ++msgid "Replaces [USERNAME] in Update-URL" ++msgstr "" ++ ++msgid "Run once" ++msgstr "" ++ ++msgid "Script" ++msgstr "" ++ ++msgid "Show more" ++msgstr "" ++ ++msgid "Software update required" ++msgstr "" ++ ++msgid "Start" ++msgstr "" ++ ++msgid "Start / Stop" ++msgstr "" ++ ++msgid "Status directory" ++msgstr "" ++ ++msgid "Stopped" ++msgstr "" ++ ++msgid "" ++"The currently installed 'ddns-scripts' package did not support all available " ++"settings." ++msgstr "" ++ ++msgid "The default setting of '0' will retry infinite." ++msgstr "" ++ ++msgid "There is no service configured." ++msgstr "" ++ ++msgid "Timer Settings" ++msgstr "" ++ ++msgid "To change global settings click here" ++msgstr "" ++ ++msgid "To use cURL activate this option." ++msgstr "" ++ ++msgid "URL" ++msgstr "" ++ ++msgid "URL to detect" ++msgstr "" ++ ++msgid "Unknown error" ++msgstr "" ++ ++msgid "" ++"Update URL to be used for updating your DDNS Provider.
    Follow " ++"instructions you will find on their WEB page." ++msgstr "" ++ ++msgid "Update error" ++msgstr "" ++ ++msgid "Use HTTP Secure" ++msgstr "" ++ ++msgid "Use cURL" ++msgstr "" ++ ++msgid "User defined script to read systems IP-Address" ++msgstr "" ++ ++msgid "Username" ++msgstr "" ++ ++msgid "Verify" ++msgstr "" ++ ++msgid "Version" ++msgstr "" ++ ++msgid "Version Information" ++msgstr "" ++ ++msgid "Waiting for changes to be applied..." ++msgstr "" ++ ++msgid "Warning" ++msgstr "" ++ ++msgid "" ++"Writes detailed messages to log file. File will be truncated automatically." ++msgstr "" ++ ++msgid "" ++"Writes log messages to syslog. Critical Errors will always be written to " ++"syslog." ++msgstr "" ++ ++msgid "You should install BIND host package for DNS requests." ++msgstr "" ++ ++msgid "You should install GNU Wget with SSL (prefered) or cURL package." ++msgstr "" ++ ++msgid "You should install GNU Wget with SSL or cURL package." ++msgstr "" ++ ++msgid "You should install GNU Wget with SSL or replace libcurl." ++msgstr "" ++ ++msgid "cURL is installed, but libcurl was compiled without proxy support." ++msgstr "" ++ ++msgid "cURL without Proxy Support" ++msgstr "" ++ ++msgid "can not detect local IP. Please select a different Source combination" ++msgstr "" ++ ++msgid "can not resolve host:" ++msgstr "" ++ ++msgid "config error" ++msgstr "" ++ ++msgid "days" ++msgstr "" ++ ++msgid "directory or path/file" ++msgstr "" ++ ++msgid "either url or script could be set" ++msgstr "" ++ ++msgid "enable here" ++msgstr "" ++ ++msgid "file or directory not found or not 'IGNORE'" ++msgstr "" ++ ++msgid "help" ++msgstr "" ++ ++msgid "hours" ++msgstr "" ++ ++msgid "installed" ++msgstr "" ++ ++msgid "invalid - Sample" ++msgstr "" ++ ++msgid "minimum value '0'" ++msgstr "" ++ ++msgid "minimum value '1'" ++msgstr "" ++ ++msgid "minimum value 5 minutes == 300 seconds" ++msgstr "" ++ ++msgid "minutes" ++msgstr "" ++ ++msgid "missing / required" ++msgstr "" ++ ++msgid "must be greater or equal 'Check Interval'" ++msgstr "" ++ ++msgid "must start with 'http://'" ++msgstr "" ++ ++msgid "nc (netcat) can not connect" ++msgstr "" ++ ++msgid "never" ++msgstr "" ++ ++msgid "no data" ++msgstr "" ++ ++msgid "not found or not executable - Sample: '/path/to/script.sh'" ++msgstr "" ++ ++msgid "nslookup can not resolve host" ++msgstr "" ++ ++msgid "or" ++msgstr "" ++ ++msgid "or higher" ++msgstr "" ++ ++msgid "please disable" ++msgstr "" ++ ++msgid "please remove entry" ++msgstr "" ++ ++msgid "please select 'IPv4' address version" ++msgstr "" ++ ++msgid "please select 'IPv4' address version in" ++msgstr "" ++ ++msgid "please set to 'default'" ++msgstr "" ++ ++msgid "proxy port missing" ++msgstr "" ++ ++msgid "required" ++msgstr "" ++ ++msgid "seconds" ++msgstr "" ++ ++msgid "to run HTTPS without verification of server certificates (insecure)" ++msgstr "" ++ ++msgid "unknown error" ++msgstr "" ++ ++msgid "unspecific error" ++msgstr "" ++ ++msgid "use hostname, FQDN, IPv4- or IPv6-Address" ++msgstr "" +diff --git a/feeds/luci/applications/luci-app-ddns/po/tr/ddns.po b/feeds/luci/applications/luci-app-ddns/po/tr/ddns.po +new file mode 100644 +index 0000000..10492bc +--- /dev/null ++++ b/feeds/luci/applications/luci-app-ddns/po/tr/ddns.po +@@ -0,0 +1,669 @@ ++# Generated from applications/luci-ddns/luasrc/model/cbi/ddns/ddns.lua ++# ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Report-Msgid-Bugs-To: \n" ++"POT-Creation-Date: 2010-04-02 13:44+0100\n" ++"PO-Revision-Date: 2013-11-25 14:27+0200\n" ++"Last-Translator: qbilay \n" ++"Language-Team: none\n" ++"Language: tr\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=1; plural=0;\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "&" ++msgstr "" ++ ++msgid "-- custom --" ++msgstr "" ++ ++msgid "-- default --" ++msgstr "" ++ ++msgid "Advanced Settings" ++msgstr "" ++ ++msgid "Allow non-public IP's" ++msgstr "" ++ ++msgid "Applying changes" ++msgstr "" ++ ++msgid "Basic Settings" ++msgstr "" ++ ++msgid "" ++"Below a list of configuration tips for your system to run Dynamic DNS " ++"updates without limitations" ++msgstr "" ++ ++msgid "" ++"Below is a list of configured DDNS configurations and their current state." ++msgstr "" ++ ++msgid "Bind Network" ++msgstr "" ++ ++msgid "Binding to a specific network not supported" ++msgstr "" ++ ++msgid "" ++"BusyBox's nslookup and Wget do not support to specify the IP version to use " ++"for communication with DDNS Provider." ++msgstr "" ++ ++msgid "" ++"BusyBox's nslookup does not support to specify to use TCP instead of default " ++"UDP when requesting DNS server" ++msgstr "" ++ ++msgid "Casual users should not change this setting" ++msgstr "" ++ ++msgid "Check Interval" ++msgstr "" ++ ++msgid "Collecting data..." ++msgstr "" ++ ++msgid "Config error" ++msgstr "" ++ ++msgid "Configuration" ++msgstr "" ++ ++msgid "" ++"Configure here the details for all Dynamic DNS services including this LuCI " ++"application." ++msgstr "" ++ ++msgid "Configure here the details for selected Dynamic DNS service." ++msgstr "" ++ ++msgid "Current setting" ++msgstr "" ++ ++msgid "" ++"Currently DDNS updates are not started at boot or on interface events.
    This is the default if you run DDNS scripts by yourself (i.e. via cron with " ++"force_interval set to '0')" ++msgstr "" ++ ++msgid "" ++"Currently DDNS updates are not started at boot or on interface events.
    You can start/stop each configuration here. It will run until next reboot." ++msgstr "" ++ ++msgid "Custom update script to be used for updating your DDNS Provider." ++msgstr "" ++ ++msgid "Custom update-URL" ++msgstr "" ++ ++msgid "Custom update-script" ++msgstr "" ++ ++msgid "DDNS Autostart disabled" ++msgstr "" ++ ++msgid "DDNS Service provider" ++msgstr "" ++ ++msgid "DNS requests via TCP not supported" ++msgstr "" ++ ++msgid "DNS-Server" ++msgstr "" ++ ++msgid "Date format" ++msgstr "" ++ ++msgid "Defines the Web page to read systems IPv4-Address from" ++msgstr "" ++ ++msgid "Defines the Web page to read systems IPv6-Address from" ++msgstr "" ++ ++msgid "Defines the interface to read systems IP-Address from" ++msgstr "" ++ ++msgid "Defines the network to read systems IPv4-Address from" ++msgstr "" ++ ++msgid "Defines the network to read systems IPv6-Address from" ++msgstr "" ++ ++msgid "" ++"Defines the source to read systems IPv4-Address from, that will be send to " ++"the DDNS provider" ++msgstr "" ++ ++msgid "" ++"Defines the source to read systems IPv6-Address from, that will be send to " ++"the DDNS provider" ++msgstr "" ++ ++msgid "Defines which IP address 'IPv4/IPv6' is send to the DDNS provider" ++msgstr "" ++ ++msgid "Details for" ++msgstr "" ++ ++msgid "Directory contains Log files for each running section" ++msgstr "" ++ ++msgid "" ++"Directory contains PID and other status information for each running section" ++msgstr "" ++ ++msgid "Disabled" ++msgstr "" ++ ++msgid "Dynamic DNS" ++msgstr "" ++ ++msgid "" ++"Dynamic DNS allows that your router can be reached with a fixed hostname " ++"while having a dynamically changing IP address." ++msgstr "" ++ ++msgid "Enable secure communication with DDNS provider" ++msgstr "" ++ ++msgid "Enabled" ++msgstr "" ++ ++msgid "Error" ++msgstr "" ++ ++msgid "Error Retry Counter" ++msgstr "" ++ ++msgid "Error Retry Interval" ++msgstr "" ++ ++msgid "Event Network" ++msgstr "" ++ ++msgid "File" ++msgstr "" ++ ++msgid "File not found" ++msgstr "" ++ ++msgid "File not found or empty" ++msgstr "" ++ ++msgid "" ++"Follow this link
    You will find more hints to optimize your system to " ++"run DDNS scripts with all options" ++msgstr "" ++ ++msgid "For detailed information about parameter settings look here." ++msgstr "" ++ ++msgid "For supported codes look here" ++msgstr "" ++ ++msgid "Force IP Version" ++msgstr "" ++ ++msgid "Force IP Version not supported" ++msgstr "" ++ ++msgid "Force Interval" ++msgstr "" ++ ++msgid "Force TCP on DNS" ++msgstr "" ++ ++msgid "Forced IP Version don't matched" ++msgstr "" ++ ++msgid "Format" ++msgstr "" ++ ++msgid "Format: IP or FQDN" ++msgstr "" ++ ++msgid "" ++"GNU Wget will use the IP of given network, cURL will use the physical " ++"interface." ++msgstr "" ++ ++msgid "Global Settings" ++msgstr "" ++ ++msgid "HTTPS not supported" ++msgstr "" ++ ++msgid "Hints" ++msgstr "" ++ ++msgid "Hostname/Domain" ++msgstr "" ++ ++msgid "IP address source" ++msgstr "" ++ ++msgid "IP address version" ++msgstr "" ++ ++msgid "IPv4-Address" ++msgstr "" ++ ++msgid "IPv6 address must be given in square brackets" ++msgstr "" ++ ++msgid "" ++"IPv6 is currently not (fully) supported by this system
    Please follow " ++"the instructions on OpenWrt's homepage to enable IPv6 support
    or update " ++"your system to the latest OpenWrt Release" ++msgstr "" ++ ++msgid "IPv6 not supported" ++msgstr "" ++ ++msgid "IPv6-Address" ++msgstr "" ++ ++msgid "If both cURL and GNU Wget are installed, Wget is used by default." ++msgstr "" ++ ++msgid "" ++"If this service section is disabled it could not be started.
    Neither " ++"from LuCI interface nor from console" ++msgstr "" ++ ++msgid "" ++"If you want to send updates for IPv4 and IPv6 you need to define two " ++"separate Configurations i.e. 'myddns_ipv4' and 'myddns_ipv6'" ++msgstr "" ++ ++msgid "" ++"In some versions cURL/libcurl in OpenWrt is compiled without proxy support." ++msgstr "" ++ ++msgid "Info" ++msgstr "" ++ ++msgid "Interface" ++msgstr "Arabirim" ++ ++msgid "" ++"Interval to check for changed IP
    Values below 5 minutes == 300 seconds " ++"are not supported" ++msgstr "" ++ ++msgid "" ++"Interval to force updates send to DDNS Provider
    Setting this parameter " ++"to 0 will force the script to only run once
    Values lower 'Check " ++"Interval' except '0' are not supported" ++msgstr "" ++ ++msgid "It is NOT recommended for casual users to change settings on this page." ++msgstr "" ++ ++msgid "Last Update" ++msgstr "" ++ ++msgid "Loading" ++msgstr "" ++ ++msgid "Log File Viewer" ++msgstr "" ++ ++msgid "Log directory" ++msgstr "" ++ ++msgid "Log length" ++msgstr "" ++ ++msgid "Log to file" ++msgstr "" ++ ++msgid "Log to syslog" ++msgstr "" ++ ++msgid "" ++"Neither GNU Wget with SSL nor cURL installed to select a network to use for " ++"communication." ++msgstr "" ++ ++msgid "" ++"Neither GNU Wget with SSL nor cURL installed to support updates via HTTPS " ++"protocol." ++msgstr "" ++ ++msgid "Network" ++msgstr "AÄŸ" ++ ++msgid "Network on which the ddns-updater scripts will be started" ++msgstr "" ++ ++msgid "Never" ++msgstr "" ++ ++msgid "Next Update" ++msgstr "" ++ ++msgid "No data" ++msgstr "" ++ ++msgid "No logging" ++msgstr "" ++ ++msgid "Non-public and by default blocked IP's" ++msgstr "" ++ ++msgid "Notice" ++msgstr "" ++ ++msgid "Number of last lines stored in log files" ++msgstr "" ++ ++msgid "OPTIONAL: Force the usage of pure IPv4/IPv6 only communication." ++msgstr "" ++ ++msgid "OPTIONAL: Force the use of TCP instead of default UDP on DNS requests." ++msgstr "" ++ ++msgid "OPTIONAL: Network to use for communication" ++msgstr "" ++ ++msgid "OPTIONAL: Proxy-Server for detection and updates." ++msgstr "" ++ ++msgid "OPTIONAL: Use non-default DNS-Server to detect 'Registered IP'." ++msgstr "" ++ ++msgid "On Error the script will retry the failed action after given time" ++msgstr "" ++ ++msgid "On Error the script will stop execution after given number of retrys" ++msgstr "" ++ ++msgid "Overview" ++msgstr "" ++ ++msgid "PROXY-Server" ++msgstr "" ++ ++msgid "PROXY-Server not supported" ++msgstr "" ++ ++msgid "Password" ++msgstr "Parola" ++ ++msgid "Path to CA-Certificate" ++msgstr "" ++ ++msgid "Please [Save & Apply] your changes first" ++msgstr "" ++ ++msgid "Please press [Read] button" ++msgstr "" ++ ++msgid "Please update to the current version!" ++msgstr "" ++ ++msgid "Process ID" ++msgstr "" ++ ++msgid "Read / Reread log file" ++msgstr "" ++ ++msgid "Registered IP" ++msgstr "" ++ ++msgid "Replaces [DOMAIN] in Update-URL" ++msgstr "" ++ ++msgid "Replaces [PASSWORD] in Update-URL" ++msgstr "" ++ ++msgid "Replaces [USERNAME] in Update-URL" ++msgstr "" ++ ++msgid "Run once" ++msgstr "" ++ ++msgid "Script" ++msgstr "" ++ ++msgid "Show more" ++msgstr "" ++ ++msgid "Software update required" ++msgstr "" ++ ++msgid "Start" ++msgstr "" ++ ++msgid "Start / Stop" ++msgstr "" ++ ++msgid "Status directory" ++msgstr "" ++ ++msgid "Stopped" ++msgstr "" ++ ++msgid "" ++"The currently installed 'ddns-scripts' package did not support all available " ++"settings." ++msgstr "" ++ ++msgid "There is no service configured." ++msgstr "" ++ ++msgid "Timer Settings" ++msgstr "" ++ ++msgid "To change global settings click here" ++msgstr "" ++ ++msgid "To use cURL activate this option." ++msgstr "" ++ ++msgid "URL" ++msgstr "" ++ ++msgid "URL to detect" ++msgstr "" ++ ++msgid "Unknown error" ++msgstr "" ++ ++msgid "" ++"Update URL to be used for updating your DDNS Provider.
    Follow " ++"instructions you will find on their WEB page." ++msgstr "" ++ ++msgid "Update error" ++msgstr "" ++ ++msgid "Use HTTP Secure" ++msgstr "" ++ ++msgid "Use cURL" ++msgstr "" ++ ++msgid "User defined script to read systems IP-Address" ++msgstr "" ++ ++msgid "Username" ++msgstr "Kullanıcı adı" ++ ++msgid "Verify" ++msgstr "" ++ ++msgid "Version" ++msgstr "" ++ ++msgid "Version Information" ++msgstr "" ++ ++msgid "Waiting for changes to be applied..." ++msgstr "" ++ ++msgid "Warning" ++msgstr "" ++ ++msgid "" ++"Writes detailed messages to log file. File will be truncated automatically." ++msgstr "" ++ ++msgid "" ++"Writes log messages to syslog. Critical Errors will always be written to " ++"syslog." ++msgstr "" ++ ++msgid "You should install BIND host package for DNS requests." ++msgstr "" ++ ++msgid "You should install GNU Wget with SSL (prefered) or cURL package." ++msgstr "" ++ ++msgid "You should install GNU Wget with SSL or cURL package." ++msgstr "" ++ ++msgid "You should install GNU Wget with SSL or replace libcurl." ++msgstr "" ++ ++msgid "cURL is installed, but libcurl was compiled without proxy support." ++msgstr "" ++ ++msgid "cURL without Proxy Support" ++msgstr "" ++ ++msgid "can not detect local IP. Please select a different Source combination" ++msgstr "" ++ ++msgid "can not resolve host:" ++msgstr "" ++ ++msgid "config error" ++msgstr "" ++ ++msgid "days" ++msgstr "" ++ ++msgid "directory or path/file" ++msgstr "" ++ ++msgid "either url or script could be set" ++msgstr "" ++ ++msgid "enable here" ++msgstr "" ++ ++msgid "file or directory not found or not 'IGNORE'" ++msgstr "" ++ ++msgid "help" ++msgstr "" ++ ++msgid "hours" ++msgstr "" ++ ++msgid "installed" ++msgstr "" ++ ++msgid "invalid - Sample" ++msgstr "" ++ ++msgid "minimum value '0'" ++msgstr "" ++ ++msgid "minimum value '1'" ++msgstr "" ++ ++msgid "minimum value 5 minutes == 300 seconds" ++msgstr "" ++ ++msgid "minutes" ++msgstr "" ++ ++msgid "missing / required" ++msgstr "" ++ ++msgid "must be greater or equal 'Check Interval'" ++msgstr "" ++ ++msgid "must start with 'http://'" ++msgstr "" ++ ++msgid "nc (netcat) can not connect" ++msgstr "" ++ ++msgid "never" ++msgstr "" ++ ++msgid "no data" ++msgstr "" ++ ++msgid "not found or not executable - Sample: '/path/to/script.sh'" ++msgstr "" ++ ++msgid "nslookup can not resolve host" ++msgstr "" ++ ++msgid "or" ++msgstr "" ++ ++msgid "or higher" ++msgstr "" ++ ++msgid "please disable" ++msgstr "" ++ ++msgid "please remove entry" ++msgstr "" ++ ++msgid "please select 'IPv4' address version" ++msgstr "" ++ ++msgid "please select 'IPv4' address version in" ++msgstr "" ++ ++msgid "please set to 'default'" ++msgstr "" ++ ++msgid "proxy port missing" ++msgstr "" ++ ++msgid "required" ++msgstr "" ++ ++msgid "seconds" ++msgstr "" ++ ++msgid "to run HTTPS without verification of server certificates (insecure)" ++msgstr "" ++ ++msgid "unknown error" ++msgstr "" ++ ++msgid "unspecific error" ++msgstr "" ++ ++msgid "use hostname, FQDN, IPv4- or IPv6-Address" ++msgstr "" ++ ++#~ msgid "Service" ++#~ msgstr "Servis" ++ ++#~ msgid "Source of IP address" ++#~ msgstr "Ip adresi kaynağı" ++ ++# "arayüz" olarakta kullanılabilir. ++#~ msgid "interface" ++#~ msgstr "arabirim" ++ ++#~ msgid "network" ++#~ msgstr "ağ" +diff --git a/feeds/luci/applications/luci-app-ddns/po/uk/ddns.po b/feeds/luci/applications/luci-app-ddns/po/uk/ddns.po +new file mode 100644 +index 0000000..0e2c580 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-ddns/po/uk/ddns.po +@@ -0,0 +1,706 @@ ++# Generated from applications/luci-ddns/luasrc/model/cbi/ddns/ddns.lua ++# ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Report-Msgid-Bugs-To: \n" ++"POT-Creation-Date: 2010-04-02 13:44+0100\n" ++"PO-Revision-Date: 2012-12-29 12:47+0200\n" ++"Last-Translator: Yurii \n" ++"Language-Team: none\n" ++"Language: uk\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%" ++"10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "&" ++msgstr "" ++ ++msgid "-- custom --" ++msgstr "" ++ ++msgid "-- default --" ++msgstr "" ++ ++msgid "Advanced Settings" ++msgstr "" ++ ++msgid "Allow non-public IP's" ++msgstr "" ++ ++msgid "Applying changes" ++msgstr "" ++ ++msgid "Basic Settings" ++msgstr "" ++ ++msgid "" ++"Below a list of configuration tips for your system to run Dynamic DNS " ++"updates without limitations" ++msgstr "" ++ ++msgid "" ++"Below is a list of configured DDNS configurations and their current state." ++msgstr "" ++ ++msgid "Bind Network" ++msgstr "" ++ ++msgid "Binding to a specific network not supported" ++msgstr "" ++ ++msgid "" ++"BusyBox's nslookup and Wget do not support to specify the IP version to use " ++"for communication with DDNS Provider." ++msgstr "" ++ ++msgid "" ++"BusyBox's nslookup does not support to specify to use TCP instead of default " ++"UDP when requesting DNS server" ++msgstr "" ++ ++msgid "Casual users should not change this setting" ++msgstr "" ++ ++msgid "Check Interval" ++msgstr "" ++ ++msgid "Collecting data..." ++msgstr "" ++ ++msgid "Config error" ++msgstr "" ++ ++msgid "Configuration" ++msgstr "" ++ ++msgid "" ++"Configure here the details for all Dynamic DNS services including this LuCI " ++"application." ++msgstr "" ++ ++msgid "Configure here the details for selected Dynamic DNS service." ++msgstr "" ++ ++msgid "Current setting" ++msgstr "" ++ ++msgid "" ++"Currently DDNS updates are not started at boot or on interface events.
    This is the default if you run DDNS scripts by yourself (i.e. via cron with " ++"force_interval set to '0')" ++msgstr "" ++ ++msgid "" ++"Currently DDNS updates are not started at boot or on interface events.
    You can start/stop each configuration here. It will run until next reboot." ++msgstr "" ++ ++msgid "Custom update script to be used for updating your DDNS Provider." ++msgstr "" ++ ++msgid "Custom update-URL" ++msgstr "КориÑтувацький URL оновленнÑ" ++ ++msgid "Custom update-script" ++msgstr "" ++ ++msgid "DDNS Autostart disabled" ++msgstr "" ++ ++msgid "DDNS Service provider" ++msgstr "" ++ ++msgid "DNS requests via TCP not supported" ++msgstr "" ++ ++msgid "DNS-Server" ++msgstr "" ++ ++msgid "Date format" ++msgstr "" ++ ++msgid "Defines the Web page to read systems IPv4-Address from" ++msgstr "" ++ ++msgid "Defines the Web page to read systems IPv6-Address from" ++msgstr "" ++ ++msgid "Defines the interface to read systems IP-Address from" ++msgstr "" ++ ++msgid "Defines the network to read systems IPv4-Address from" ++msgstr "" ++ ++msgid "Defines the network to read systems IPv6-Address from" ++msgstr "" ++ ++msgid "" ++"Defines the source to read systems IPv4-Address from, that will be send to " ++"the DDNS provider" ++msgstr "" ++ ++msgid "" ++"Defines the source to read systems IPv6-Address from, that will be send to " ++"the DDNS provider" ++msgstr "" ++ ++msgid "Defines which IP address 'IPv4/IPv6' is send to the DDNS provider" ++msgstr "" ++ ++msgid "Details for" ++msgstr "" ++ ++msgid "Directory contains Log files for each running section" ++msgstr "" ++ ++msgid "" ++"Directory contains PID and other status information for each running section" ++msgstr "" ++ ++msgid "Disabled" ++msgstr "" ++ ++msgid "Dynamic DNS" ++msgstr "Динамічний DNS" ++ ++msgid "" ++"Dynamic DNS allows that your router can be reached with a fixed hostname " ++"while having a dynamically changing IP address." ++msgstr "" ++"Динамічний DNS дозволÑÑ” вашому маршрутизатору бути доÑтупним за фікÑованим " ++"доменним ім'Ñм, маючи динамічну IP-адреÑу." ++ ++msgid "Enable secure communication with DDNS provider" ++msgstr "" ++ ++msgid "Enabled" ++msgstr "" ++ ++msgid "Error" ++msgstr "" ++ ++msgid "Error Retry Counter" ++msgstr "" ++ ++msgid "Error Retry Interval" ++msgstr "" ++ ++msgid "Event Network" ++msgstr "" ++ ++msgid "File" ++msgstr "" ++ ++msgid "File not found" ++msgstr "" ++ ++msgid "File not found or empty" ++msgstr "" ++ ++msgid "" ++"Follow this link
    You will find more hints to optimize your system to " ++"run DDNS scripts with all options" ++msgstr "" ++ ++msgid "For detailed information about parameter settings look here." ++msgstr "" ++ ++msgid "For supported codes look here" ++msgstr "" ++ ++msgid "Force IP Version" ++msgstr "" ++ ++msgid "Force IP Version not supported" ++msgstr "" ++ ++msgid "Force Interval" ++msgstr "" ++ ++msgid "Force TCP on DNS" ++msgstr "" ++ ++msgid "Forced IP Version don't matched" ++msgstr "" ++ ++msgid "Format" ++msgstr "" ++ ++msgid "Format: IP or FQDN" ++msgstr "" ++ ++msgid "" ++"GNU Wget will use the IP of given network, cURL will use the physical " ++"interface." ++msgstr "" ++ ++msgid "Global Settings" ++msgstr "" ++ ++msgid "HTTPS not supported" ++msgstr "" ++ ++msgid "Hints" ++msgstr "" ++ ++msgid "Hostname/Domain" ++msgstr "" ++ ++msgid "IP address source" ++msgstr "" ++ ++msgid "IP address version" ++msgstr "" ++ ++msgid "IPv4-Address" ++msgstr "" ++ ++msgid "IPv6 address must be given in square brackets" ++msgstr "" ++ ++msgid "" ++"IPv6 is currently not (fully) supported by this system
    Please follow " ++"the instructions on OpenWrt's homepage to enable IPv6 support
    or update " ++"your system to the latest OpenWrt Release" ++msgstr "" ++ ++msgid "IPv6 not supported" ++msgstr "" ++ ++msgid "IPv6-Address" ++msgstr "" ++ ++msgid "If both cURL and GNU Wget are installed, Wget is used by default." ++msgstr "" ++ ++msgid "" ++"If this service section is disabled it could not be started.
    Neither " ++"from LuCI interface nor from console" ++msgstr "" ++ ++msgid "" ++"If you want to send updates for IPv4 and IPv6 you need to define two " ++"separate Configurations i.e. 'myddns_ipv4' and 'myddns_ipv6'" ++msgstr "" ++ ++msgid "" ++"In some versions cURL/libcurl in OpenWrt is compiled without proxy support." ++msgstr "" ++ ++msgid "Info" ++msgstr "" ++ ++msgid "Interface" ++msgstr "ІнтерфейÑ" ++ ++msgid "" ++"Interval to check for changed IP
    Values below 5 minutes == 300 seconds " ++"are not supported" ++msgstr "" ++ ++msgid "" ++"Interval to force updates send to DDNS Provider
    Setting this parameter " ++"to 0 will force the script to only run once
    Values lower 'Check " ++"Interval' except '0' are not supported" ++msgstr "" ++ ++msgid "It is NOT recommended for casual users to change settings on this page." ++msgstr "" ++ ++msgid "Last Update" ++msgstr "" ++ ++msgid "Loading" ++msgstr "" ++ ++msgid "Log File Viewer" ++msgstr "" ++ ++msgid "Log directory" ++msgstr "" ++ ++msgid "Log length" ++msgstr "" ++ ++msgid "Log to file" ++msgstr "" ++ ++msgid "Log to syslog" ++msgstr "" ++ ++msgid "" ++"Neither GNU Wget with SSL nor cURL installed to select a network to use for " ++"communication." ++msgstr "" ++ ++msgid "" ++"Neither GNU Wget with SSL nor cURL installed to support updates via HTTPS " ++"protocol." ++msgstr "" ++ ++msgid "Network" ++msgstr "Мережа" ++ ++msgid "Network on which the ddns-updater scripts will be started" ++msgstr "" ++ ++msgid "Never" ++msgstr "" ++ ++msgid "Next Update" ++msgstr "" ++ ++msgid "No data" ++msgstr "" ++ ++msgid "No logging" ++msgstr "" ++ ++msgid "Non-public and by default blocked IP's" ++msgstr "" ++ ++msgid "Notice" ++msgstr "" ++ ++msgid "Number of last lines stored in log files" ++msgstr "" ++ ++msgid "OPTIONAL: Force the usage of pure IPv4/IPv6 only communication." ++msgstr "" ++ ++msgid "OPTIONAL: Force the use of TCP instead of default UDP on DNS requests." ++msgstr "" ++ ++msgid "OPTIONAL: Network to use for communication" ++msgstr "" ++ ++msgid "OPTIONAL: Proxy-Server for detection and updates." ++msgstr "" ++ ++msgid "OPTIONAL: Use non-default DNS-Server to detect 'Registered IP'." ++msgstr "" ++ ++msgid "On Error the script will retry the failed action after given time" ++msgstr "" ++ ++msgid "On Error the script will stop execution after given number of retrys" ++msgstr "" ++ ++msgid "Overview" ++msgstr "" ++ ++msgid "PROXY-Server" ++msgstr "" ++ ++msgid "PROXY-Server not supported" ++msgstr "" ++ ++msgid "Password" ++msgstr "Пароль" ++ ++msgid "Path to CA-Certificate" ++msgstr "" ++ ++msgid "Please [Save & Apply] your changes first" ++msgstr "" ++ ++msgid "Please press [Read] button" ++msgstr "" ++ ++msgid "Please update to the current version!" ++msgstr "" ++ ++msgid "Process ID" ++msgstr "" ++ ++msgid "Read / Reread log file" ++msgstr "" ++ ++msgid "Registered IP" ++msgstr "" ++ ++msgid "Replaces [DOMAIN] in Update-URL" ++msgstr "" ++ ++msgid "Replaces [PASSWORD] in Update-URL" ++msgstr "" ++ ++msgid "Replaces [USERNAME] in Update-URL" ++msgstr "" ++ ++msgid "Run once" ++msgstr "" ++ ++msgid "Script" ++msgstr "" ++ ++msgid "Show more" ++msgstr "" ++ ++msgid "Software update required" ++msgstr "" ++ ++msgid "Start" ++msgstr "" ++ ++msgid "Start / Stop" ++msgstr "" ++ ++msgid "Status directory" ++msgstr "" ++ ++msgid "Stopped" ++msgstr "" ++ ++msgid "" ++"The currently installed 'ddns-scripts' package did not support all available " ++"settings." ++msgstr "" ++ ++msgid "There is no service configured." ++msgstr "" ++ ++msgid "Timer Settings" ++msgstr "" ++ ++msgid "To change global settings click here" ++msgstr "" ++ ++msgid "To use cURL activate this option." ++msgstr "" ++ ++msgid "URL" ++msgstr "URL" ++ ++msgid "URL to detect" ++msgstr "" ++ ++msgid "Unknown error" ++msgstr "" ++ ++msgid "" ++"Update URL to be used for updating your DDNS Provider.
    Follow " ++"instructions you will find on their WEB page." ++msgstr "" ++ ++msgid "Update error" ++msgstr "" ++ ++msgid "Use HTTP Secure" ++msgstr "" ++ ++msgid "Use cURL" ++msgstr "" ++ ++msgid "User defined script to read systems IP-Address" ++msgstr "" ++ ++msgid "Username" ++msgstr "Ім'Ñ ÐºÐ¾Ñ€Ð¸Ñтувача" ++ ++msgid "Verify" ++msgstr "" ++ ++msgid "Version" ++msgstr "" ++ ++msgid "Version Information" ++msgstr "" ++ ++msgid "Waiting for changes to be applied..." ++msgstr "" ++ ++msgid "Warning" ++msgstr "" ++ ++msgid "" ++"Writes detailed messages to log file. File will be truncated automatically." ++msgstr "" ++ ++msgid "" ++"Writes log messages to syslog. Critical Errors will always be written to " ++"syslog." ++msgstr "" ++ ++msgid "You should install BIND host package for DNS requests." ++msgstr "" ++ ++msgid "You should install GNU Wget with SSL (prefered) or cURL package." ++msgstr "" ++ ++msgid "You should install GNU Wget with SSL or cURL package." ++msgstr "" ++ ++msgid "You should install GNU Wget with SSL or replace libcurl." ++msgstr "" ++ ++msgid "cURL is installed, but libcurl was compiled without proxy support." ++msgstr "" ++ ++msgid "cURL without Proxy Support" ++msgstr "" ++ ++msgid "can not detect local IP. Please select a different Source combination" ++msgstr "" ++ ++msgid "can not resolve host:" ++msgstr "" ++ ++msgid "config error" ++msgstr "" ++ ++msgid "days" ++msgstr "" ++ ++msgid "directory or path/file" ++msgstr "" ++ ++msgid "either url or script could be set" ++msgstr "" ++ ++msgid "enable here" ++msgstr "" ++ ++msgid "file or directory not found or not 'IGNORE'" ++msgstr "" ++ ++msgid "help" ++msgstr "" ++ ++msgid "hours" ++msgstr "" ++ ++msgid "installed" ++msgstr "" ++ ++msgid "invalid - Sample" ++msgstr "" ++ ++msgid "minimum value '0'" ++msgstr "" ++ ++msgid "minimum value '1'" ++msgstr "" ++ ++msgid "minimum value 5 minutes == 300 seconds" ++msgstr "" ++ ++msgid "minutes" ++msgstr "" ++ ++msgid "missing / required" ++msgstr "" ++ ++msgid "must be greater or equal 'Check Interval'" ++msgstr "" ++ ++msgid "must start with 'http://'" ++msgstr "" ++ ++msgid "nc (netcat) can not connect" ++msgstr "" ++ ++msgid "never" ++msgstr "" ++ ++msgid "no data" ++msgstr "" ++ ++msgid "not found or not executable - Sample: '/path/to/script.sh'" ++msgstr "" ++ ++msgid "nslookup can not resolve host" ++msgstr "" ++ ++msgid "or" ++msgstr "" ++ ++msgid "or higher" ++msgstr "" ++ ++msgid "please disable" ++msgstr "" ++ ++msgid "please remove entry" ++msgstr "" ++ ++msgid "please select 'IPv4' address version" ++msgstr "" ++ ++msgid "please select 'IPv4' address version in" ++msgstr "" ++ ++msgid "please set to 'default'" ++msgstr "" ++ ++msgid "proxy port missing" ++msgstr "" ++ ++msgid "required" ++msgstr "" ++ ++msgid "seconds" ++msgstr "" ++ ++msgid "to run HTTPS without verification of server certificates (insecure)" ++msgstr "" ++ ++msgid "unknown error" ++msgstr "" ++ ++msgid "unspecific error" ++msgstr "" ++ ++msgid "use hostname, FQDN, IPv4- or IPv6-Address" ++msgstr "" ++ ++#~ msgid "Check for changed IP every" ++#~ msgstr "ПеревірÑти, чи змінилаÑÑ IP-адреÑа кожні" ++ ++#~ msgid "Check-time unit" ++#~ msgstr "ÐžÐ´Ð¸Ð½Ð¸Ñ†Ñ Ñ‡Ð°Ñу перевірки" ++ ++#~ msgid "Enable" ++#~ msgstr "Увімкнути" ++ ++#~ msgid "Force update every" ++#~ msgstr "ПримуÑово оновлювати кожні" ++ ++#~ msgid "Force-time unit" ++#~ msgstr "ÐžÐ´Ð¸Ð½Ð¸Ñ†Ñ Ñ‡Ð°Ñу оновленнÑ" ++ ++#~ msgid "Hostname" ++#~ msgstr "Ім'Ñ Ð²ÑƒÐ·Ð»Ð°" ++ ++#~ msgid "Service" ++#~ msgstr "СервіÑ" ++ ++#~ msgid "Source of IP address" ++#~ msgstr "Джерело IP-адреÑи" ++ ++#~ msgid "custom" ++#~ msgstr "кориÑтувацький" ++ ++# Hours ++#~ msgid "h" ++#~ msgstr "г" ++ ++#~ msgid "interface" ++#~ msgstr "інтерфейÑ" ++ ++# Minutes (not minimum) ++#~ msgid "min" ++#~ msgstr "хв" ++ ++#~ msgid "network" ++#~ msgstr "мережа" ++ ++#~ msgid "Event interface" ++#~ msgstr "Ð†Ð½Ñ‚ÐµÑ€Ñ„ÐµÐ¹Ñ Ð¿Ð¾Ð´Ñ–Ñ—" ++ ++#~ msgid "On which interface up should start the ddns script process." ++#~ msgstr "При вмиканні Ñкого інтерфейÑу має запуÑкатиÑÑ Ð¿Ñ€Ð¾Ñ†ÐµÑ Ñкрипта DDNS." +diff --git a/feeds/luci/applications/luci-app-ddns/po/vi/ddns.po b/feeds/luci/applications/luci-app-ddns/po/vi/ddns.po +new file mode 100644 +index 0000000..5d5a7ed +--- /dev/null ++++ b/feeds/luci/applications/luci-app-ddns/po/vi/ddns.po +@@ -0,0 +1,677 @@ ++# ddns.pot ++# generated from ./applications/luci-ddns/luasrc/i18n/ddns.en.lua ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Report-Msgid-Bugs-To: \n" ++"POT-Creation-Date: 2010-04-02 13:44+0100\n" ++"PO-Revision-Date: 2009-08-12 18:06+0200\n" ++"Last-Translator: Hong Phuc Dang \n" ++"Language-Team: LANGUAGE \n" ++"Language: \n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"X-Generator: Pootle 1.1.0\n" ++ ++msgid "&" ++msgstr "" ++ ++msgid "-- custom --" ++msgstr "" ++ ++msgid "-- default --" ++msgstr "" ++ ++msgid "Advanced Settings" ++msgstr "" ++ ++msgid "Allow non-public IP's" ++msgstr "" ++ ++msgid "Applying changes" ++msgstr "" ++ ++msgid "Basic Settings" ++msgstr "" ++ ++msgid "" ++"Below a list of configuration tips for your system to run Dynamic DNS " ++"updates without limitations" ++msgstr "" ++ ++msgid "" ++"Below is a list of configured DDNS configurations and their current state." ++msgstr "" ++ ++msgid "Bind Network" ++msgstr "" ++ ++msgid "Binding to a specific network not supported" ++msgstr "" ++ ++msgid "" ++"BusyBox's nslookup and Wget do not support to specify the IP version to use " ++"for communication with DDNS Provider." ++msgstr "" ++ ++msgid "" ++"BusyBox's nslookup does not support to specify to use TCP instead of default " ++"UDP when requesting DNS server" ++msgstr "" ++ ++msgid "Casual users should not change this setting" ++msgstr "" ++ ++msgid "Check Interval" ++msgstr "" ++ ++msgid "Collecting data..." ++msgstr "" ++ ++msgid "Config error" ++msgstr "" ++ ++msgid "Configuration" ++msgstr "" ++ ++msgid "" ++"Configure here the details for all Dynamic DNS services including this LuCI " ++"application." ++msgstr "" ++ ++msgid "Configure here the details for selected Dynamic DNS service." ++msgstr "" ++ ++msgid "Current setting" ++msgstr "" ++ ++msgid "" ++"Currently DDNS updates are not started at boot or on interface events.
    This is the default if you run DDNS scripts by yourself (i.e. via cron with " ++"force_interval set to '0')" ++msgstr "" ++ ++msgid "" ++"Currently DDNS updates are not started at boot or on interface events.
    You can start/stop each configuration here. It will run until next reboot." ++msgstr "" ++ ++msgid "Custom update script to be used for updating your DDNS Provider." ++msgstr "" ++ ++#, fuzzy ++msgid "Custom update-URL" ++msgstr "Tùy chỉnh cập nhật - URL" ++ ++msgid "Custom update-script" ++msgstr "" ++ ++msgid "DDNS Autostart disabled" ++msgstr "" ++ ++msgid "DDNS Service provider" ++msgstr "" ++ ++msgid "DNS requests via TCP not supported" ++msgstr "" ++ ++msgid "DNS-Server" ++msgstr "" ++ ++msgid "Date format" ++msgstr "" ++ ++msgid "Defines the Web page to read systems IPv4-Address from" ++msgstr "" ++ ++msgid "Defines the Web page to read systems IPv6-Address from" ++msgstr "" ++ ++msgid "Defines the interface to read systems IP-Address from" ++msgstr "" ++ ++msgid "Defines the network to read systems IPv4-Address from" ++msgstr "" ++ ++msgid "Defines the network to read systems IPv6-Address from" ++msgstr "" ++ ++msgid "" ++"Defines the source to read systems IPv4-Address from, that will be send to " ++"the DDNS provider" ++msgstr "" ++ ++msgid "" ++"Defines the source to read systems IPv6-Address from, that will be send to " ++"the DDNS provider" ++msgstr "" ++ ++msgid "Defines which IP address 'IPv4/IPv6' is send to the DDNS provider" ++msgstr "" ++ ++msgid "Details for" ++msgstr "" ++ ++msgid "Directory contains Log files for each running section" ++msgstr "" ++ ++msgid "" ++"Directory contains PID and other status information for each running section" ++msgstr "" ++ ++msgid "Disabled" ++msgstr "" ++ ++msgid "Dynamic DNS" ++msgstr "Dynamic DNS" ++ ++#, fuzzy ++msgid "" ++"Dynamic DNS allows that your router can be reached with a fixed hostname " ++"while having a dynamically changing IP address." ++msgstr "" ++"Dynamic DNS cho phép bộ định tuyến có thể được đạt đến với một hostname cố " ++"định, trong khi có một địa chỉ AP thay đổi năng động." ++ ++msgid "Enable secure communication with DDNS provider" ++msgstr "" ++ ++msgid "Enabled" ++msgstr "" ++ ++msgid "Error" ++msgstr "" ++ ++msgid "Error Retry Counter" ++msgstr "" ++ ++msgid "Error Retry Interval" ++msgstr "" ++ ++msgid "Event Network" ++msgstr "" ++ ++msgid "File" ++msgstr "" ++ ++msgid "File not found" ++msgstr "" ++ ++msgid "File not found or empty" ++msgstr "" ++ ++msgid "" ++"Follow this link
    You will find more hints to optimize your system to " ++"run DDNS scripts with all options" ++msgstr "" ++ ++msgid "For detailed information about parameter settings look here." ++msgstr "" ++ ++msgid "For supported codes look here" ++msgstr "" ++ ++msgid "Force IP Version" ++msgstr "" ++ ++msgid "Force IP Version not supported" ++msgstr "" ++ ++msgid "Force Interval" ++msgstr "" ++ ++msgid "Force TCP on DNS" ++msgstr "" ++ ++msgid "Forced IP Version don't matched" ++msgstr "" ++ ++msgid "Format" ++msgstr "" ++ ++msgid "Format: IP or FQDN" ++msgstr "" ++ ++msgid "" ++"GNU Wget will use the IP of given network, cURL will use the physical " ++"interface." ++msgstr "" ++ ++msgid "Global Settings" ++msgstr "" ++ ++msgid "HTTPS not supported" ++msgstr "" ++ ++msgid "Hints" ++msgstr "" ++ ++msgid "Hostname/Domain" ++msgstr "" ++ ++msgid "IP address source" ++msgstr "" ++ ++msgid "IP address version" ++msgstr "" ++ ++msgid "IPv4-Address" ++msgstr "" ++ ++msgid "IPv6 address must be given in square brackets" ++msgstr "" ++ ++msgid "" ++"IPv6 is currently not (fully) supported by this system
    Please follow " ++"the instructions on OpenWrt's homepage to enable IPv6 support
    or update " ++"your system to the latest OpenWrt Release" ++msgstr "" ++ ++msgid "IPv6 not supported" ++msgstr "" ++ ++msgid "IPv6-Address" ++msgstr "" ++ ++msgid "If both cURL and GNU Wget are installed, Wget is used by default." ++msgstr "" ++ ++msgid "" ++"If this service section is disabled it could not be started.
    Neither " ++"from LuCI interface nor from console" ++msgstr "" ++ ++msgid "" ++"If you want to send updates for IPv4 and IPv6 you need to define two " ++"separate Configurations i.e. 'myddns_ipv4' and 'myddns_ipv6'" ++msgstr "" ++ ++msgid "" ++"In some versions cURL/libcurl in OpenWrt is compiled without proxy support." ++msgstr "" ++ ++msgid "Info" ++msgstr "" ++ ++msgid "Interface" ++msgstr "" ++ ++msgid "" ++"Interval to check for changed IP
    Values below 5 minutes == 300 seconds " ++"are not supported" ++msgstr "" ++ ++msgid "" ++"Interval to force updates send to DDNS Provider
    Setting this parameter " ++"to 0 will force the script to only run once
    Values lower 'Check " ++"Interval' except '0' are not supported" ++msgstr "" ++ ++msgid "It is NOT recommended for casual users to change settings on this page." ++msgstr "" ++ ++msgid "Last Update" ++msgstr "" ++ ++msgid "Loading" ++msgstr "" ++ ++msgid "Log File Viewer" ++msgstr "" ++ ++msgid "Log directory" ++msgstr "" ++ ++msgid "Log length" ++msgstr "" ++ ++msgid "Log to file" ++msgstr "" ++ ++msgid "Log to syslog" ++msgstr "" ++ ++msgid "" ++"Neither GNU Wget with SSL nor cURL installed to select a network to use for " ++"communication." ++msgstr "" ++ ++msgid "" ++"Neither GNU Wget with SSL nor cURL installed to support updates via HTTPS " ++"protocol." ++msgstr "" ++ ++msgid "Network" ++msgstr "" ++ ++msgid "Network on which the ddns-updater scripts will be started" ++msgstr "" ++ ++msgid "Never" ++msgstr "" ++ ++msgid "Next Update" ++msgstr "" ++ ++msgid "No data" ++msgstr "" ++ ++msgid "No logging" ++msgstr "" ++ ++msgid "Non-public and by default blocked IP's" ++msgstr "" ++ ++msgid "Notice" ++msgstr "" ++ ++msgid "Number of last lines stored in log files" ++msgstr "" ++ ++msgid "OPTIONAL: Force the usage of pure IPv4/IPv6 only communication." ++msgstr "" ++ ++msgid "OPTIONAL: Force the use of TCP instead of default UDP on DNS requests." ++msgstr "" ++ ++msgid "OPTIONAL: Network to use for communication" ++msgstr "" ++ ++msgid "OPTIONAL: Proxy-Server for detection and updates." ++msgstr "" ++ ++msgid "OPTIONAL: Use non-default DNS-Server to detect 'Registered IP'." ++msgstr "" ++ ++msgid "On Error the script will retry the failed action after given time" ++msgstr "" ++ ++msgid "On Error the script will stop execution after given number of retrys" ++msgstr "" ++ ++msgid "Overview" ++msgstr "" ++ ++msgid "PROXY-Server" ++msgstr "" ++ ++msgid "PROXY-Server not supported" ++msgstr "" ++ ++msgid "Password" ++msgstr "" ++ ++msgid "Path to CA-Certificate" ++msgstr "" ++ ++msgid "Please [Save & Apply] your changes first" ++msgstr "" ++ ++msgid "Please press [Read] button" ++msgstr "" ++ ++msgid "Please update to the current version!" ++msgstr "" ++ ++msgid "Process ID" ++msgstr "" ++ ++msgid "Read / Reread log file" ++msgstr "" ++ ++msgid "Registered IP" ++msgstr "" ++ ++msgid "Replaces [DOMAIN] in Update-URL" ++msgstr "" ++ ++msgid "Replaces [PASSWORD] in Update-URL" ++msgstr "" ++ ++msgid "Replaces [USERNAME] in Update-URL" ++msgstr "" ++ ++msgid "Run once" ++msgstr "" ++ ++msgid "Script" ++msgstr "" ++ ++msgid "Show more" ++msgstr "" ++ ++msgid "Software update required" ++msgstr "" ++ ++msgid "Start" ++msgstr "" ++ ++msgid "Start / Stop" ++msgstr "" ++ ++msgid "Status directory" ++msgstr "" ++ ++msgid "Stopped" ++msgstr "" ++ ++msgid "" ++"The currently installed 'ddns-scripts' package did not support all available " ++"settings." ++msgstr "" ++ ++msgid "There is no service configured." ++msgstr "" ++ ++msgid "Timer Settings" ++msgstr "" ++ ++msgid "To change global settings click here" ++msgstr "" ++ ++msgid "To use cURL activate this option." ++msgstr "" ++ ++msgid "URL" ++msgstr "" ++ ++msgid "URL to detect" ++msgstr "" ++ ++msgid "Unknown error" ++msgstr "" ++ ++msgid "" ++"Update URL to be used for updating your DDNS Provider.
    Follow " ++"instructions you will find on their WEB page." ++msgstr "" ++ ++msgid "Update error" ++msgstr "" ++ ++msgid "Use HTTP Secure" ++msgstr "" ++ ++msgid "Use cURL" ++msgstr "" ++ ++msgid "User defined script to read systems IP-Address" ++msgstr "" ++ ++msgid "Username" ++msgstr "" ++ ++msgid "Verify" ++msgstr "" ++ ++msgid "Version" ++msgstr "" ++ ++msgid "Version Information" ++msgstr "" ++ ++msgid "Waiting for changes to be applied..." ++msgstr "" ++ ++msgid "Warning" ++msgstr "" ++ ++msgid "" ++"Writes detailed messages to log file. File will be truncated automatically." ++msgstr "" ++ ++msgid "" ++"Writes log messages to syslog. Critical Errors will always be written to " ++"syslog." ++msgstr "" ++ ++msgid "You should install BIND host package for DNS requests." ++msgstr "" ++ ++msgid "You should install GNU Wget with SSL (prefered) or cURL package." ++msgstr "" ++ ++msgid "You should install GNU Wget with SSL or cURL package." ++msgstr "" ++ ++msgid "You should install GNU Wget with SSL or replace libcurl." ++msgstr "" ++ ++msgid "cURL is installed, but libcurl was compiled without proxy support." ++msgstr "" ++ ++msgid "cURL without Proxy Support" ++msgstr "" ++ ++msgid "can not detect local IP. Please select a different Source combination" ++msgstr "" ++ ++msgid "can not resolve host:" ++msgstr "" ++ ++msgid "config error" ++msgstr "" ++ ++msgid "days" ++msgstr "" ++ ++msgid "directory or path/file" ++msgstr "" ++ ++msgid "either url or script could be set" ++msgstr "" ++ ++msgid "enable here" ++msgstr "" ++ ++msgid "file or directory not found or not 'IGNORE'" ++msgstr "" ++ ++msgid "help" ++msgstr "" ++ ++msgid "hours" ++msgstr "" ++ ++msgid "installed" ++msgstr "" ++ ++msgid "invalid - Sample" ++msgstr "" ++ ++msgid "minimum value '0'" ++msgstr "" ++ ++msgid "minimum value '1'" ++msgstr "" ++ ++msgid "minimum value 5 minutes == 300 seconds" ++msgstr "" ++ ++msgid "minutes" ++msgstr "" ++ ++msgid "missing / required" ++msgstr "" ++ ++msgid "must be greater or equal 'Check Interval'" ++msgstr "" ++ ++msgid "must start with 'http://'" ++msgstr "" ++ ++msgid "nc (netcat) can not connect" ++msgstr "" ++ ++msgid "never" ++msgstr "" ++ ++msgid "no data" ++msgstr "" ++ ++msgid "not found or not executable - Sample: '/path/to/script.sh'" ++msgstr "" ++ ++msgid "nslookup can not resolve host" ++msgstr "" ++ ++msgid "or" ++msgstr "" ++ ++msgid "or higher" ++msgstr "" ++ ++msgid "please disable" ++msgstr "" ++ ++msgid "please remove entry" ++msgstr "" ++ ++msgid "please select 'IPv4' address version" ++msgstr "" ++ ++msgid "please select 'IPv4' address version in" ++msgstr "" ++ ++msgid "please set to 'default'" ++msgstr "" ++ ++msgid "proxy port missing" ++msgstr "" ++ ++msgid "required" ++msgstr "" ++ ++msgid "seconds" ++msgstr "" ++ ++msgid "to run HTTPS without verification of server certificates (insecure)" ++msgstr "" ++ ++msgid "unknown error" ++msgstr "" ++ ++msgid "unspecific error" ++msgstr "" ++ ++msgid "use hostname, FQDN, IPv4- or IPv6-Address" ++msgstr "" ++ ++#~ msgid "Check for changed IP every" ++#~ msgstr "Kiểm tra má»—i thay đổi IP" ++ ++#, fuzzy ++#~ msgid "Check-time unit" ++#~ msgstr "ÄÆ¡n vị kiểm tra thá»i gian" ++ ++#~ msgid "Force update every" ++#~ msgstr "Buá»™c cập nhật má»—i" ++ ++#, fuzzy ++#~ msgid "Force-time unit" ++#~ msgstr "Force-Ä‘Æ¡n vị thá»i gian" ++ ++#, fuzzy ++#~ msgid "Source of IP address" ++#~ msgstr "Nguồn của địa chỉ IP" +diff --git a/feeds/luci/applications/luci-app-ddns/po/zh-cn/ddns.po b/feeds/luci/applications/luci-app-ddns/po/zh-cn/ddns.po +new file mode 100644 +index 0000000..862c2a0 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-ddns/po/zh-cn/ddns.po +@@ -0,0 +1,601 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: \n" ++"Report-Msgid-Bugs-To: \n" ++"POT-Creation-Date: 2010-04-02 13:44+0100\n" ++"PO-Revision-Date: 2015-04-23 13:00+0800\n" ++"Last-Translator: Syrone Wong \n" ++"Language: zh_CN\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=1; plural=0;\n" ++"X-Generator: Poedit 1.7.5\n" ++ ++msgid "-- custom --" ++msgstr "-- 自定义 --" ++ ++msgid "-- default --" ++msgstr "-- 默认 --" ++ ++msgid "Advanced Settings" ++msgstr "高级设置" ++ ++msgid "Allow non-public IP's" ++msgstr "å…许éžå…¬ç½‘IP" ++ ++msgid "Applying changes" ++msgstr "正在应用更改" ++ ++msgid "Basic Settings" ++msgstr "基础设置" ++ ++msgid "Below a list of configuration tips for your system to run Dynamic DNS updates without limitations" ++msgstr "以下是一个能够让你的系统ä¸å—é™åˆ¶åœ°è¿›è¡ŒåŠ¨æ€DNS更新的设置贴士." ++ ++msgid "Below is a list of configured DDNS configurations and their current state." ++msgstr "一下是当å‰å·²ç»é…置好的DDNS设置项列表以åŠå®ƒä»¬çš„当å‰çŠ¶æ€." ++ ++msgid "Bind Network" ++msgstr "使用的接å£" ++ ++msgid "Binding to a specific network not supported" ++msgstr "ä¸æ”¯æŒç»‘定到一个指定的网络" ++ ++msgid "BusyBox's nslookup and Wget do not support to specify the IP version to use for communication with DDNS Provider." ++msgstr "与DDNS供应商通讯时BusyBoxçš„nslookupå’ŒWgetä¸æ”¯æŒè®¾ç½®ç‰¹å®šçš„IPå议版本." ++ ++msgid "BusyBox's nslookup does not support to specify to use TCP instead of default UDP when requesting DNS server" ++msgstr "BusyBoxçš„nslookupä¸æ”¯æŒä½¿ç”¨TCPå议代替UDPå议请求DNS记录" ++ ++msgid "Casual users should not change this setting" ++msgstr "普通用户ä¸åº”该改å˜è¿™ä¸ªè®¾ç½®" ++ ++msgid "Check Interval" ++msgstr "检查时间周期" ++ ++msgid "Collecting data..." ++msgstr "正在收集数æ®..." ++ ++msgid "Config error" ++msgstr "é…置错误" ++ ++msgid "Configuration" ++msgstr "设置" ++ ++msgid "Configure here the details for all Dynamic DNS services including this LuCI application." ++msgstr "在这里修改动æ€DNSæœåŠ¡çš„详细é…ç½®" ++ ++msgid "Configure here the details for selected Dynamic DNS service." ++msgstr "在这里修改选择的DDNSæœåŠ¡çš„详细é…ç½®" ++ ++msgid "Current setting" ++msgstr "当å‰è®¾ç½®" ++ ++msgid "Currently DDNS updates are not started at boot or on interface events.
    This is the default if you run DDNS scripts by yourself (i.e. via cron with force_interval set to '0')" ++msgstr "现在,DDNS更新在开机或者接å£åŠ¨ä½œæ—¶ä¸ä¼šè¢«è§¦å‘
    如果你手工è¿è¡ŒDDNS脚本的è¯(例如使用cron时把force_interval设置为0),这是默认设置." ++ ++msgid "Currently DDNS updates are not started at boot or on interface events.
    You can start/stop each configuration here. It will run until next reboot." ++msgstr "现在,DDNS更新在开机或者接å£åŠ¨ä½œæ—¶ä¸ä¼šè¢«è§¦å‘
    ä½ å¯ä»¥åœ¨è¿™é‡Œå¼€å§‹/åœæ­¢æ¯ä¸€ä¸ªè®¾ç½®çš„æ¡ç›®.它在下次é‡å¯ä¹‹å‰ä¸€ç›´æœ‰æ•ˆ." ++ ++msgid "Custom update script to be used for updating your DDNS Provider." ++msgstr "用æ¥æ›´æ–°åŠ¨æ€DNS的自定义脚本" ++ ++msgid "Custom update-URL" ++msgstr "自定义更新URL" ++ ++msgid "Custom update-script" ++msgstr "自定义更新脚本" ++ ++msgid "DDNS Autostart disabled" ++msgstr "DDNS自动å¯åŠ¨å·²ç¦ç”¨." ++ ++msgid "DDNS Service provider" ++msgstr "DDNSæœåŠ¡æ供商" ++ ++msgid "DNS requests via TCP not supported" ++msgstr "ä¸æ”¯æŒä½¿ç”¨TCP进行DNS解æž" ++ ++msgid "DNS-Server" ++msgstr "DNSæœåŠ¡å™¨" ++ ++msgid "Date format" ++msgstr "日期格å¼" ++ ++msgid "Defines the Web page to read systems IPv4-Address from" ++msgstr "设定用æ¥è¯»å–系统IPv4地å€çš„网页" ++ ++msgid "Defines the Web page to read systems IPv6-Address from" ++msgstr "设定用æ¥è¯»å–系统IPv6地å€çš„网页" ++ ++msgid "Defines the interface to read systems IP-Address from" ++msgstr "设定用æ¥è¯»å–系统IP地å€çš„接å£" ++ ++msgid "Defines the network to read systems IPv4-Address from" ++msgstr "设定用æ¥è¯»å–系统IPv4地å€çš„网络" ++ ++msgid "Defines the network to read systems IPv6-Address from" ++msgstr "设定用æ¥è¯»å–系统IPv6地å€çš„网络" ++ ++msgid "Defines the source to read systems IPv4-Address from, that will be send to the DDNS provider" ++msgstr "设定IPv4地å€çš„æ¥æº.这将会被å‘é€ç»™DDNSæ供商" ++ ++msgid "Defines the source to read systems IPv6-Address from, that will be send to the DDNS provider" ++msgstr "设定IPv6地å€çš„æ¥æº.这将会被å‘é€ç»™DDNSæ供商" ++ ++msgid "Defines which IP address 'IPv4/IPv6' is send to the DDNS provider" ++msgstr "设定哪一个IP地å€(IPv4或IPv6)会被å‘é€ç»™DDNSæ供商" ++ ++msgid "Details for" ++msgstr "详情:" ++ ++msgid "Directory contains Log files for each running section" ++msgstr "ä¿å­˜æ¯ä¸€ä¸ªè¿è¡Œä¸­çš„设置的è¿è¡Œæ—¥å¿—的目录" ++ ++msgid "Directory contains PID and other status information for each running section" ++msgstr "ä¿å­˜æ¯ä¸ªè¿è¡Œä¸­çš„设置的PID以åŠå…¶å®ƒçŠ¶æ€ä¿¡æ¯çš„目录" ++ ++msgid "Disabled" ++msgstr "å·²ç¦ç”¨" ++ ++msgid "Dynamic DNS" ++msgstr "动æ€DNS" ++ ++msgid "Dynamic DNS allows that your router can be reached with a fixed hostname while having a dynamically changing IP address." ++msgstr "动æ€DNSå…许为拥有动æ€IP的主机é…置一个固定的å¯è®¿é—®åŸŸå." ++ ++msgid "Enable secure communication with DDNS provider" ++msgstr "å¯ç”¨å®‰å…¨è¿žæŽ¥ä¸ŽDDNS供应商è”ç³»" ++ ++msgid "Enabled" ++msgstr "å·²å¯ç”¨" ++ ++msgid "Error" ++msgstr "错误" ++ ++msgid "Error Retry Counter" ++msgstr "错误é‡è¯•è®¡æ•°" ++ ++msgid "Error Retry Interval" ++msgstr "错误é‡è¯•é—´éš”" ++ ++msgid "Event Network" ++msgstr "事件网络" ++ ++msgid "File" ++msgstr "文件" ++ ++msgid "File not found" ++msgstr "文件未找到" ++ ++msgid "File not found or empty" ++msgstr "文件未找到或为空" ++ ++msgid "Follow this link
    You will find more hints to optimize your system to run DDNS scripts with all options" ++msgstr "打开这个链接
    你将会得到更多关于如何通过所有设置项优化你的系统以è¿è¡ŒDDNS脚本的æ示." ++ ++msgid "For detailed information about parameter settings look here." ++msgstr "请看这里获得关于å‚数设置的详细信æ¯" ++ ++msgid "For supported codes look here" ++msgstr "查看这里获å–支æŒçš„ç¼–ç " ++ ++msgid "Force IP Version" ++msgstr "强制设定IP版本" ++ ++msgid "Force IP Version not supported" ++msgstr "ä¸æ”¯æŒå¼ºåˆ¶è®¾å®šIP版本" ++ ++msgid "Force Interval" ++msgstr "设定周期" ++ ++msgid "Force TCP on DNS" ++msgstr "强制使用TCP进行DNS查询" ++ ++msgid "Forced IP Version don't matched" ++msgstr "强制设定的IP版本ä¸åŒ¹é…" ++ ++msgid "Format" ++msgstr "æ ¼å¼" ++ ++msgid "Format: IP or FQDN" ++msgstr "æ ¼å¼:IP或者FQDN" ++ ++msgid "GNU Wget will use the IP of given network, cURL will use the physical interface." ++msgstr "GNU Wget将会使用给定的网络的IP地å€,而cURL将会使用物ç†æŽ¥å£" ++ ++msgid "Global Settings" ++msgstr "全局设置" ++ ++msgid "HTTPS not supported" ++msgstr "ä¸æ”¯æŒHTTPS" ++ ++msgid "Hints" ++msgstr "æ示" ++ ++msgid "Hostname/Domain" ++msgstr "主机å/域å" ++ ++msgid "IP address source" ++msgstr "IP地å€æ¥æº" ++ ++msgid "IP address version" ++msgstr "IP地å€ç‰ˆæœ¬" ++ ++msgid "IPv4-Address" ++msgstr "IPv4地å€" ++ ++msgid "IPv6 address must be given in square brackets" ++msgstr "IPv6地å€å¿…须填写在中括å·(\"[ ]\")内" ++ ++msgid "IPv6 is currently not (fully) supported by this system
    Please follow the instructions on OpenWrt's homepage to enable IPv6 support
    or update your system to the latest OpenWrt Release" ++msgstr "当å‰ç³»ç»Ÿæš‚æ—¶ä¸èƒ½(完整地)支æŒIPv6
    请查看OpenWrt首页的介ç»ä»¥å¯ç”¨IPv6支æŒ
    或者更新你的系统到最新OpenWrt版本" ++ ++msgid "IPv6 not supported" ++msgstr "IPv6ä¸è¢«æ”¯æŒ" ++ ++msgid "IPv6-Address" ++msgstr "IPv6地å€" ++ ++msgid "If both cURL and GNU Wget are installed, Wget is used by default." ++msgstr "如果cURLå’ŒGNU WgetåŒæ—¶è¢«å®‰è£…,那么Wget将会被优先使用." ++ ++msgid "If this service section is disabled it could not be started.
    Neither from LuCI interface nor from console" ++msgstr "如果æœåŠ¡é…置被ç¦ç”¨é‚£ä¹ˆå®ƒå°†ä¸èƒ½è¢«å¯åŠ¨.
    无论是通过LuCI页é¢æˆ–者是通过终端." ++ ++msgid "If you want to send updates for IPv4 and IPv6 you need to define two separate Configurations i.e. 'myddns_ipv4' and 'myddns_ipv6'" ++msgstr "如果你需è¦åŒæ—¶æ›´æ–°IPv4å’ŒIPv6地å€,你需è¦å•ç‹¬æ·»åŠ ä¸¤ä¸ªé…置项(例如'myddns_ipv4'å’Œ'myddns_ipv6')" ++ ++msgid "In some versions cURL/libcurl in OpenWrt is compiled without proxy support." ++msgstr "OpenWrt中,cURL/libcurlçš„æŸäº›ç‰ˆæœ¬ç¼–译时没有å¯ç”¨ä»£ç†æœåŠ¡å™¨æ”¯æŒ" ++ ++msgid "Info" ++msgstr "ä¿¡æ¯" ++ ++msgid "Interface" ++msgstr "接å£" ++ ++msgid "Interval to check for changed IP
    Values below 5 minutes == 300 seconds are not supported" ++msgstr "检查IP是å¦æ”¹å˜çš„时间隔
    ä¸æ”¯æŒä½ŽäºŽ5分钟(300秒)的数值." ++ ++msgid "Interval to force updates send to DDNS Provider
    Setting this parameter to 0 will force the script to only run once
    Values lower 'Check Interval' except '0' are not supported" ++msgstr "强制å‘æ供商更新DDNS的时间周期
    把这个å‚数设置为0将会让脚本仅执行一次
    ä¸æ”¯æŒä½ŽäºŽ\"检查时间周期\"的数值(除了0)." ++ ++msgid "It is NOT recommended for casual users to change settings on this page." ++msgstr "强烈ä¸å»ºè®®åˆæ¬¡ä½¿ç”¨çš„用户修改本页设定." ++ ++msgid "Last Update" ++msgstr "上次更新" ++ ++msgid "Loading" ++msgstr "加载中" ++ ++msgid "Log File Viewer" ++msgstr "日志查看器" ++ ++msgid "Log directory" ++msgstr "日志目录" ++ ++msgid "Log length" ++msgstr "日志长度" ++ ++msgid "Log to file" ++msgstr "把日志记录到文件" ++ ++msgid "Log to syslog" ++msgstr "把日志记录到系统日志" ++ ++msgid "Neither GNU Wget with SSL nor cURL installed to select a network to use for communication." ++msgstr "包å«SSL支æŒçš„GNU Wget或者cURLå‡æœªè¢«å®‰è£….无法选择一个网络用于通信." ++ ++msgid "Neither GNU Wget with SSL nor cURL installed to support updates via HTTPS protocol." ++msgstr "包å«SSL支æŒçš„GNU Wget或者cURLå‡æœªè¢«å®‰è£….无法使用HTTPSæ›´æ–°DDNS" ++ ++msgid "Network" ++msgstr "网络" ++ ++msgid "Network on which the ddns-updater scripts will be started" ++msgstr "DDNS更新脚本将会被è¿è¡ŒäºŽè¯¥ç½‘络" ++ ++msgid "Never" ++msgstr "从ä¸" ++ ++msgid "Next Update" ++msgstr "下次更新" ++ ++msgid "No data" ++msgstr "æ— æ•°æ®" ++ ++msgid "No logging" ++msgstr "无日志" ++ ++msgid "Non-public and by default blocked IP's" ++msgstr "éžå…¬ç½‘IP以åŠé»˜è®¤è¢«é”定的IP" ++ ++msgid "Notice" ++msgstr "æ示" ++ ++msgid "Number of last lines stored in log files" ++msgstr "日志文件中的最åŽå‡ è¡Œ" ++ ++msgid "OPTIONAL: Force the usage of pure IPv4/IPv6 only communication." ++msgstr "å¯é€‰:强制使用仅IPv4/IPv6通信." ++ ++msgid "OPTIONAL: Force the use of TCP instead of default UDP on DNS requests." ++msgstr "å¯é€‰:强制使用TCP而éžUDP请求DNS." ++ ++msgid "OPTIONAL: Network to use for communication" ++msgstr "å¯é€‰:用于通信的网络" ++ ++msgid "OPTIONAL: Proxy-Server for detection and updates." ++msgstr "å¯é€‰:用于检测以åŠæ›´æ–°çš„代ç†æœåŠ¡å™¨" ++ ++msgid "OPTIONAL: Use non-default DNS-Server to detect 'Registered IP'." ++msgstr "å¯é€‰:使用éžé»˜è®¤DNSæœåŠ¡å™¨æ£€æµ‹\"已注册的IP地å€\"" ++ ++msgid "On Error the script will retry the failed action after given time" ++msgstr "当出错时,脚本将会é‡è¯•å¤±è´¥çš„动作的次数" ++ ++msgid "On Error the script will stop execution after given number of retrys" ++msgstr "当出错时,脚本将会é‡è¯•è¯¥æ¬¡æ•°ä¹‹åŽé€€å‡º" ++ ++msgid "Overview" ++msgstr "总览" ++ ++msgid "PROXY-Server" ++msgstr "代ç†æœåŠ¡å™¨" ++ ++msgid "PROXY-Server not supported" ++msgstr "ä¸æ”¯æŒä»£ç†æœåŠ¡å™¨" ++ ++msgid "Password" ++msgstr "密ç " ++ ++msgid "Path to CA-Certificate" ++msgstr "CAè¯ä¹¦è·¯å¾„" ++ ++msgid "Please [Save & Apply] your changes first" ++msgstr "请先ä¿å­˜å¹¶åº”用您的设置" ++ ++msgid "Please press [Read] button" ++msgstr "请按下\"读å–\"按钮" ++ ++msgid "Please update to the current version!" ++msgstr "请更新到最新版本!" ++ ++msgid "Process ID" ++msgstr "处ç†ID" ++ ++msgid "Read / Reread log file" ++msgstr "读å–/é‡æ–°è¯»å–日志文件" ++ ++msgid "Registered IP" ++msgstr "已注册的IP地å€" ++ ++msgid "Replaces [DOMAIN] in Update-URL" ++msgstr "在更新URL中使用[DOMAIN]替æ¢åŸŸå" ++ ++msgid "Replaces [PASSWORD] in Update-URL" ++msgstr "在更新URL中使用[PASSWORD]替æ¢å¯†ç " ++ ++msgid "Replaces [USERNAME] in Update-URL" ++msgstr "在更新URL中使用[USERNAME]替æ¢ç”¨æˆ·å" ++ ++msgid "Run once" ++msgstr "è¿è¡Œä¸€æ¬¡" ++ ++msgid "Script" ++msgstr "脚本" ++ ++msgid "Show more" ++msgstr "查看更多" ++ ++msgid "Software update required" ++msgstr "需è¦è¿›è¡Œè½¯ä»¶æ›´æ–°" ++ ++msgid "Start" ++msgstr "å¯ç”¨" ++ ++msgid "Start / Stop" ++msgstr "å¯ç”¨/ç¦ç”¨" ++ ++msgid "Status directory" ++msgstr "状æ€ç›®å½•" ++ ++msgid "Stopped" ++msgstr "å·²åœæ­¢" ++ ++msgid "The currently installed 'ddns-scripts' package did not support all available settings." ++msgstr "当å‰å·²å®‰è£…çš„'ddns-scripts'软件包暂ä¸æ”¯æŒæ‰€æœ‰å¯ç”¨è®¾ç½®é¡¹" ++ ++msgid "There is no service configured." ++msgstr "没有已ç»é…置好的æœåŠ¡é¡¹" ++ ++msgid "Timer Settings" ++msgstr "计时器设定" ++ ++msgid "To change global settings click here" ++msgstr "点击这里以更改全局设置" ++ ++msgid "To use cURL activate this option." ++msgstr "选中这个项以使用cURL" ++ ++msgid "URL" ++msgstr "URL" ++ ++msgid "URL to detect" ++msgstr "用于检测的URL" ++ ++msgid "Unknown error" ++msgstr "未知错误" ++ ++msgid "Update URL to be used for updating your DDNS Provider.
    Follow instructions you will find on their WEB page." ++msgstr "DDNSæ供商用于更新DDNSçš„URL
    è·Ÿéšæ•™ç¨‹ä½ å°†ä¼šåœ¨å®ƒä»¬çš„网站上æ供这个URL." ++ ++msgid "Update error" ++msgstr "更新错误" ++ ++msgid "Use HTTP Secure" ++msgstr "使用HTTPS" ++ ++msgid "Use cURL" ++msgstr "使用cURL" ++ ++msgid "User defined script to read systems IP-Address" ++msgstr "使用设定的脚本æ¥è¯»å–系统IP地å€" ++ ++msgid "Username" ++msgstr "用户å" ++ ++msgid "Verify" ++msgstr "验è¯" ++ ++msgid "Version" ++msgstr "版本" ++ ++msgid "Version Information" ++msgstr "版本信æ¯" ++ ++msgid "Waiting for changes to be applied..." ++msgstr "正在应用更改..." ++ ++msgid "Warning" ++msgstr "等待" ++ ++msgid "Writes detailed messages to log file. File will be truncated automatically." ++msgstr "å‘日志中写入详细信æ¯.文件将会被自动å‡å°." ++ ++msgid "Writes log messages to syslog. Critical Errors will always be written to syslog." ++msgstr "把日志写入系统日志.无论是å¦å¯ç”¨è¿™é¡¹,错误信æ¯æ€»æ˜¯ä¼šè¢«å†™å…¥ç³»ç»Ÿæ—¥å¿—" ++ ++msgid "You should install BIND host package for DNS requests." ++msgstr "你需è¦å®‰è£…BIND以请求DNS记录." ++ ++msgid "You should install GNU Wget with SSL (prefered) or cURL package." ++msgstr "你需è¦å®‰è£…包å«SSL支æŒçš„GNU Wget(推è)或是cURL软件包." ++ ++msgid "You should install GNU Wget with SSL or cURL package." ++msgstr "你需è¦å®‰è£…包å«SSL支æŒçš„GNU Wget或是cURL软件包." ++ ++msgid "You should install GNU Wget with SSL or replace libcurl." ++msgstr "你需è¦å®‰è£…包å«SSL支æŒçš„GNU Wget或替æ¢libcurl." ++ ++msgid "cURL is installed, but libcurl was compiled without proxy support." ++msgstr "cURLå·²ç»å®‰è£…,但是libcurl编译时没有å¯ç”¨ä»£ç†æ”¯æŒ." ++ ++msgid "cURL without Proxy Support" ++msgstr "cURLä¸åŒ…å«ä»£ç†æ”¯æŒ" ++ ++msgid "can not detect local IP. Please select a different Source combination" ++msgstr "ä¸èƒ½ç¡®å®šæœ¬åœ°IP.请更æ¢IPæ¥æº." ++ ++msgid "can not resolve host:" ++msgstr "ä¸èƒ½è§£æžä¸»æœº:" ++ ++msgid "config error" ++msgstr "é…置错误" ++ ++msgid "days" ++msgstr "天" ++ ++msgid "directory or path/file" ++msgstr "目录或者到文件的路径" ++ ++msgid "either url or script could be set" ++msgstr "接å—URL或者脚本" ++ ++msgid "enable here" ++msgstr "在这里å¯ç”¨" ++ ++msgid "file or directory not found or not 'IGNORE'" ++msgstr "文件或目录未找到或未\"被忽视\"" ++ ++msgid "help" ++msgstr "帮助" ++ ++msgid "hours" ++msgstr "å°æ—¶" ++ ++msgid "installed" ++msgstr "已安装" ++ ++msgid "invalid - Sample" ++msgstr "ä¸åˆæ³• - 示例" ++ ++msgid "minimum value '0'" ++msgstr "最å°å€¼0" ++ ++msgid "minimum value '1'" ++msgstr "最å°å€¼1" ++ ++msgid "minimum value 5 minutes == 300 seconds" ++msgstr "最å°å€¼ä¸º5分钟(300秒)" ++ ++msgid "minutes" ++msgstr "分钟" ++ ++msgid "missing / required" ++msgstr "必须填写" ++ ++msgid "must be greater or equal 'Check Interval'" ++msgstr "必须大于或等于\"检查时间周期\"" ++ ++msgid "must start with 'http://'" ++msgstr "必须以'http://'开头" ++ ++msgid "nc (netcat) can not connect" ++msgstr "nc(netcat)ä¸å¯è¿žæŽ¥" ++ ++msgid "never" ++msgstr "从ä¸" ++ ++msgid "no data" ++msgstr "æ— æ•°æ®" ++ ++msgid "not found or not executable - Sample: '/path/to/script.sh'" ++msgstr "未找到或者ä¸å¯æ‰§è¡Œ - 示例: '/path/to/script.sh'" ++ ++msgid "nslookup can not resolve host" ++msgstr "nslookupä¸èƒ½è§£æžä¸»æœº" ++ ++msgid "or" ++msgstr "或者" ++ ++msgid "or higher" ++msgstr "或者更大" ++ ++msgid "please disable" ++msgstr "请ç¦ç”¨" ++ ++msgid "please remove entry" ++msgstr "请移除该字段" ++ ++msgid "please select 'IPv4' address version" ++msgstr "请设定IPv4地å€" ++ ++msgid "please select 'IPv4' address version in" ++msgstr "请设定IPv4地å€äºŽ" ++ ++msgid "please set to 'default'" ++msgstr "请设置为\"默认\"" ++ ++msgid "proxy port missing" ++msgstr "代ç†ç«¯å£æœªå¡«" ++ ++msgid "required" ++msgstr "必须填写" ++ ++msgid "seconds" ++msgstr "秒" ++ ++msgid "to run HTTPS without verification of server certificates (insecure)" ++msgstr "使用HTTPS但ä¸æ£€æŸ¥æœåŠ¡å™¨è¯ä¹¦(ä¸å®‰å…¨)" ++ ++msgid "unknown error" ++msgstr "未知错误" ++ ++msgid "unspecific error" ++msgstr "未指定的错误" ++ ++msgid "use hostname, FQDN, IPv4- or IPv6-Address" ++msgstr "使用主机å或IPv4/IPv6地å€" +diff --git a/feeds/luci/applications/luci-app-ddns/po/zh-tw/ddns.po b/feeds/luci/applications/luci-app-ddns/po/zh-tw/ddns.po +new file mode 100644 +index 0000000..ec930f4 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-ddns/po/zh-tw/ddns.po +@@ -0,0 +1,698 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"PO-Revision-Date: 2013-08-07 15:53+0200\n" ++"Last-Translator: Ethan \n" ++"Language-Team: none\n" ++"Language: zh_TW\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=1; plural=0;\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "&" ++msgstr "" ++ ++msgid "-- custom --" ++msgstr "" ++ ++msgid "-- default --" ++msgstr "" ++ ++msgid "Advanced Settings" ++msgstr "" ++ ++msgid "Allow non-public IP's" ++msgstr "" ++ ++msgid "Applying changes" ++msgstr "" ++ ++msgid "Basic Settings" ++msgstr "" ++ ++msgid "" ++"Below a list of configuration tips for your system to run Dynamic DNS " ++"updates without limitations" ++msgstr "" ++ ++msgid "" ++"Below is a list of configured DDNS configurations and their current state." ++msgstr "" ++ ++msgid "Bind Network" ++msgstr "" ++ ++msgid "Binding to a specific network not supported" ++msgstr "" ++ ++msgid "" ++"BusyBox's nslookup and Wget do not support to specify the IP version to use " ++"for communication with DDNS Provider." ++msgstr "" ++ ++msgid "" ++"BusyBox's nslookup does not support to specify to use TCP instead of default " ++"UDP when requesting DNS server" ++msgstr "" ++ ++msgid "Casual users should not change this setting" ++msgstr "" ++ ++msgid "Check Interval" ++msgstr "" ++ ++msgid "Collecting data..." ++msgstr "" ++ ++msgid "Config error" ++msgstr "" ++ ++msgid "Configuration" ++msgstr "" ++ ++msgid "" ++"Configure here the details for all Dynamic DNS services including this LuCI " ++"application." ++msgstr "" ++ ++msgid "Configure here the details for selected Dynamic DNS service." ++msgstr "" ++ ++msgid "Current setting" ++msgstr "" ++ ++msgid "" ++"Currently DDNS updates are not started at boot or on interface events.
    This is the default if you run DDNS scripts by yourself (i.e. via cron with " ++"force_interval set to '0')" ++msgstr "" ++ ++msgid "" ++"Currently DDNS updates are not started at boot or on interface events.
    You can start/stop each configuration here. It will run until next reboot." ++msgstr "" ++ ++msgid "Custom update script to be used for updating your DDNS Provider." ++msgstr "" ++ ++msgid "Custom update-URL" ++msgstr "自訂更新的URL" ++ ++msgid "Custom update-script" ++msgstr "" ++ ++msgid "DDNS Autostart disabled" ++msgstr "" ++ ++msgid "DDNS Service provider" ++msgstr "" ++ ++msgid "DNS requests via TCP not supported" ++msgstr "" ++ ++msgid "DNS-Server" ++msgstr "" ++ ++msgid "Date format" ++msgstr "" ++ ++msgid "Defines the Web page to read systems IPv4-Address from" ++msgstr "" ++ ++msgid "Defines the Web page to read systems IPv6-Address from" ++msgstr "" ++ ++msgid "Defines the interface to read systems IP-Address from" ++msgstr "" ++ ++msgid "Defines the network to read systems IPv4-Address from" ++msgstr "" ++ ++msgid "Defines the network to read systems IPv6-Address from" ++msgstr "" ++ ++msgid "" ++"Defines the source to read systems IPv4-Address from, that will be send to " ++"the DDNS provider" ++msgstr "" ++ ++msgid "" ++"Defines the source to read systems IPv6-Address from, that will be send to " ++"the DDNS provider" ++msgstr "" ++ ++msgid "Defines which IP address 'IPv4/IPv6' is send to the DDNS provider" ++msgstr "" ++ ++msgid "Details for" ++msgstr "" ++ ++msgid "Directory contains Log files for each running section" ++msgstr "" ++ ++msgid "" ++"Directory contains PID and other status information for each running section" ++msgstr "" ++ ++msgid "Disabled" ++msgstr "" ++ ++msgid "Dynamic DNS" ++msgstr "å‹•æ…‹DNS" ++ ++msgid "" ++"Dynamic DNS allows that your router can be reached with a fixed hostname " ++"while having a dynamically changing IP address." ++msgstr "" ++"å‹•æ…‹DNSå…許為主機é…置一個固定的網域å稱,但該網路å稱å»æ˜¯å°æ‡‰åˆ°å‹•æ…‹çš„IPä½ç½®" ++ ++msgid "Enable secure communication with DDNS provider" ++msgstr "" ++ ++msgid "Enabled" ++msgstr "" ++ ++msgid "Error" ++msgstr "" ++ ++msgid "Error Retry Counter" ++msgstr "" ++ ++msgid "Error Retry Interval" ++msgstr "" ++ ++msgid "Event Network" ++msgstr "" ++ ++msgid "File" ++msgstr "" ++ ++msgid "File not found" ++msgstr "" ++ ++msgid "File not found or empty" ++msgstr "" ++ ++msgid "" ++"Follow this link
    You will find more hints to optimize your system to " ++"run DDNS scripts with all options" ++msgstr "" ++ ++msgid "For detailed information about parameter settings look here." ++msgstr "" ++ ++msgid "For supported codes look here" ++msgstr "" ++ ++msgid "Force IP Version" ++msgstr "" ++ ++msgid "Force IP Version not supported" ++msgstr "" ++ ++msgid "Force Interval" ++msgstr "" ++ ++msgid "Force TCP on DNS" ++msgstr "" ++ ++msgid "Forced IP Version don't matched" ++msgstr "" ++ ++msgid "Format" ++msgstr "" ++ ++msgid "Format: IP or FQDN" ++msgstr "" ++ ++msgid "" ++"GNU Wget will use the IP of given network, cURL will use the physical " ++"interface." ++msgstr "" ++ ++msgid "Global Settings" ++msgstr "" ++ ++msgid "HTTPS not supported" ++msgstr "" ++ ++msgid "Hints" ++msgstr "" ++ ++msgid "Hostname/Domain" ++msgstr "" ++ ++msgid "IP address source" ++msgstr "" ++ ++msgid "IP address version" ++msgstr "" ++ ++msgid "IPv4-Address" ++msgstr "" ++ ++msgid "IPv6 address must be given in square brackets" ++msgstr "" ++ ++msgid "" ++"IPv6 is currently not (fully) supported by this system
    Please follow " ++"the instructions on OpenWrt's homepage to enable IPv6 support
    or update " ++"your system to the latest OpenWrt Release" ++msgstr "" ++ ++msgid "IPv6 not supported" ++msgstr "" ++ ++msgid "IPv6-Address" ++msgstr "" ++ ++msgid "If both cURL and GNU Wget are installed, Wget is used by default." ++msgstr "" ++ ++msgid "" ++"If this service section is disabled it could not be started.
    Neither " ++"from LuCI interface nor from console" ++msgstr "" ++ ++msgid "" ++"If you want to send updates for IPv4 and IPv6 you need to define two " ++"separate Configurations i.e. 'myddns_ipv4' and 'myddns_ipv6'" ++msgstr "" ++ ++msgid "" ++"In some versions cURL/libcurl in OpenWrt is compiled without proxy support." ++msgstr "" ++ ++msgid "Info" ++msgstr "" ++ ++msgid "Interface" ++msgstr "ç•Œé¢" ++ ++msgid "" ++"Interval to check for changed IP
    Values below 5 minutes == 300 seconds " ++"are not supported" ++msgstr "" ++ ++msgid "" ++"Interval to force updates send to DDNS Provider
    Setting this parameter " ++"to 0 will force the script to only run once
    Values lower 'Check " ++"Interval' except '0' are not supported" ++msgstr "" ++ ++msgid "It is NOT recommended for casual users to change settings on this page." ++msgstr "" ++ ++msgid "Last Update" ++msgstr "" ++ ++msgid "Loading" ++msgstr "" ++ ++msgid "Log File Viewer" ++msgstr "" ++ ++msgid "Log directory" ++msgstr "" ++ ++msgid "Log length" ++msgstr "" ++ ++msgid "Log to file" ++msgstr "" ++ ++msgid "Log to syslog" ++msgstr "" ++ ++msgid "" ++"Neither GNU Wget with SSL nor cURL installed to select a network to use for " ++"communication." ++msgstr "" ++ ++msgid "" ++"Neither GNU Wget with SSL nor cURL installed to support updates via HTTPS " ++"protocol." ++msgstr "" ++ ++msgid "Network" ++msgstr "網路" ++ ++msgid "Network on which the ddns-updater scripts will be started" ++msgstr "" ++ ++msgid "Never" ++msgstr "" ++ ++msgid "Next Update" ++msgstr "" ++ ++msgid "No data" ++msgstr "" ++ ++msgid "No logging" ++msgstr "" ++ ++msgid "Non-public and by default blocked IP's" ++msgstr "" ++ ++msgid "Notice" ++msgstr "" ++ ++msgid "Number of last lines stored in log files" ++msgstr "" ++ ++msgid "OPTIONAL: Force the usage of pure IPv4/IPv6 only communication." ++msgstr "" ++ ++msgid "OPTIONAL: Force the use of TCP instead of default UDP on DNS requests." ++msgstr "" ++ ++msgid "OPTIONAL: Network to use for communication" ++msgstr "" ++ ++msgid "OPTIONAL: Proxy-Server for detection and updates." ++msgstr "" ++ ++msgid "OPTIONAL: Use non-default DNS-Server to detect 'Registered IP'." ++msgstr "" ++ ++msgid "On Error the script will retry the failed action after given time" ++msgstr "" ++ ++msgid "On Error the script will stop execution after given number of retrys" ++msgstr "" ++ ++msgid "Overview" ++msgstr "" ++ ++msgid "PROXY-Server" ++msgstr "" ++ ++msgid "PROXY-Server not supported" ++msgstr "" ++ ++msgid "Password" ++msgstr "密碼" ++ ++msgid "Path to CA-Certificate" ++msgstr "" ++ ++msgid "Please [Save & Apply] your changes first" ++msgstr "" ++ ++msgid "Please press [Read] button" ++msgstr "" ++ ++msgid "Please update to the current version!" ++msgstr "" ++ ++msgid "Process ID" ++msgstr "" ++ ++msgid "Read / Reread log file" ++msgstr "" ++ ++msgid "Registered IP" ++msgstr "" ++ ++msgid "Replaces [DOMAIN] in Update-URL" ++msgstr "" ++ ++msgid "Replaces [PASSWORD] in Update-URL" ++msgstr "" ++ ++msgid "Replaces [USERNAME] in Update-URL" ++msgstr "" ++ ++msgid "Run once" ++msgstr "" ++ ++msgid "Script" ++msgstr "" ++ ++msgid "Show more" ++msgstr "" ++ ++msgid "Software update required" ++msgstr "" ++ ++msgid "Start" ++msgstr "" ++ ++msgid "Start / Stop" ++msgstr "" ++ ++msgid "Status directory" ++msgstr "" ++ ++msgid "Stopped" ++msgstr "" ++ ++msgid "" ++"The currently installed 'ddns-scripts' package did not support all available " ++"settings." ++msgstr "" ++ ++msgid "There is no service configured." ++msgstr "" ++ ++msgid "Timer Settings" ++msgstr "" ++ ++msgid "To change global settings click here" ++msgstr "" ++ ++msgid "To use cURL activate this option." ++msgstr "" ++ ++msgid "URL" ++msgstr "URL" ++ ++msgid "URL to detect" ++msgstr "" ++ ++msgid "Unknown error" ++msgstr "" ++ ++msgid "" ++"Update URL to be used for updating your DDNS Provider.
    Follow " ++"instructions you will find on their WEB page." ++msgstr "" ++ ++msgid "Update error" ++msgstr "" ++ ++msgid "Use HTTP Secure" ++msgstr "" ++ ++msgid "Use cURL" ++msgstr "" ++ ++msgid "User defined script to read systems IP-Address" ++msgstr "" ++ ++msgid "Username" ++msgstr "使用者å稱" ++ ++msgid "Verify" ++msgstr "" ++ ++msgid "Version" ++msgstr "" ++ ++msgid "Version Information" ++msgstr "" ++ ++msgid "Waiting for changes to be applied..." ++msgstr "" ++ ++msgid "Warning" ++msgstr "" ++ ++msgid "" ++"Writes detailed messages to log file. File will be truncated automatically." ++msgstr "" ++ ++msgid "" ++"Writes log messages to syslog. Critical Errors will always be written to " ++"syslog." ++msgstr "" ++ ++msgid "You should install BIND host package for DNS requests." ++msgstr "" ++ ++msgid "You should install GNU Wget with SSL (prefered) or cURL package." ++msgstr "" ++ ++msgid "You should install GNU Wget with SSL or cURL package." ++msgstr "" ++ ++msgid "You should install GNU Wget with SSL or replace libcurl." ++msgstr "" ++ ++msgid "cURL is installed, but libcurl was compiled without proxy support." ++msgstr "" ++ ++msgid "cURL without Proxy Support" ++msgstr "" ++ ++msgid "can not detect local IP. Please select a different Source combination" ++msgstr "" ++ ++msgid "can not resolve host:" ++msgstr "" ++ ++msgid "config error" ++msgstr "" ++ ++msgid "days" ++msgstr "" ++ ++msgid "directory or path/file" ++msgstr "" ++ ++msgid "either url or script could be set" ++msgstr "" ++ ++msgid "enable here" ++msgstr "" ++ ++msgid "file or directory not found or not 'IGNORE'" ++msgstr "" ++ ++msgid "help" ++msgstr "" ++ ++msgid "hours" ++msgstr "" ++ ++msgid "installed" ++msgstr "" ++ ++msgid "invalid - Sample" ++msgstr "" ++ ++msgid "minimum value '0'" ++msgstr "" ++ ++msgid "minimum value '1'" ++msgstr "" ++ ++msgid "minimum value 5 minutes == 300 seconds" ++msgstr "" ++ ++msgid "minutes" ++msgstr "" ++ ++msgid "missing / required" ++msgstr "" ++ ++msgid "must be greater or equal 'Check Interval'" ++msgstr "" ++ ++msgid "must start with 'http://'" ++msgstr "" ++ ++msgid "nc (netcat) can not connect" ++msgstr "" ++ ++msgid "never" ++msgstr "" ++ ++msgid "no data" ++msgstr "" ++ ++msgid "not found or not executable - Sample: '/path/to/script.sh'" ++msgstr "" ++ ++msgid "nslookup can not resolve host" ++msgstr "" ++ ++msgid "or" ++msgstr "" ++ ++msgid "or higher" ++msgstr "" ++ ++msgid "please disable" ++msgstr "" ++ ++msgid "please remove entry" ++msgstr "" ++ ++msgid "please select 'IPv4' address version" ++msgstr "" ++ ++msgid "please select 'IPv4' address version in" ++msgstr "" ++ ++msgid "please set to 'default'" ++msgstr "" ++ ++msgid "proxy port missing" ++msgstr "" ++ ++msgid "required" ++msgstr "" ++ ++msgid "seconds" ++msgstr "" ++ ++msgid "to run HTTPS without verification of server certificates (insecure)" ++msgstr "" ++ ++msgid "unknown error" ++msgstr "" ++ ++msgid "unspecific error" ++msgstr "" ++ ++msgid "use hostname, FQDN, IPv4- or IPv6-Address" ++msgstr "" ++ ++#~ msgid "Check for changed IP every" ++#~ msgstr "檢查IP變動的時間間隔" ++ ++#~ msgid "Check-time unit" ++#~ msgstr "時間單ä½" ++ ++#~ msgid "Enable" ++#~ msgstr "啟用" ++ ++#~ msgid "Force update every" ++#~ msgstr "強制更新間隔" ++ ++#~ msgid "Force-time unit" ++#~ msgstr "強制更新的時間單ä½" ++ ++#~ msgid "Hostname" ++#~ msgstr "主機å稱" ++ ++#~ msgid "Service" ++#~ msgstr "æœå‹™æ供者" ++ ++#~ msgid "Source of IP address" ++#~ msgstr "IPä½ç½®ä¾†æº" ++ ++#~ msgid "custom" ++#~ msgstr "自訂" ++ ++#~ msgid "h" ++#~ msgstr "å°æ™‚" ++ ++#~ msgid "interface" ++#~ msgstr "ç•Œé¢" ++ ++#~ msgid "min" ++#~ msgstr "分é˜" ++ ++#~ msgid "network" ++#~ msgstr "網路" ++ ++#~ msgid "Event interface" ++#~ msgstr "事件界é¢" ++ ++#~ msgid "On which interface up should start the ddns script process." ++#~ msgstr "介é¢æ‡‰è©²å•Ÿç”¨å‹•æ…‹DNS指令程åº" +diff --git a/feeds/luci/applications/luci-app-ddns/root/etc/uci-defaults/luci-ddns b/feeds/luci/applications/luci-app-ddns/root/etc/uci-defaults/luci-ddns +new file mode 100755 +index 0000000..9fd875e +--- /dev/null ++++ b/feeds/luci/applications/luci-app-ddns/root/etc/uci-defaults/luci-ddns +@@ -0,0 +1,10 @@ ++#!/bin/sh ++ ++# no longer needed for "Save and Apply" to restart ddns ++uci -q batch <<-EOF >/dev/null ++ delete ucitrack.@ddns[-1] ++ commit ucitrack ++EOF ++ ++rm -f /tmp/luci-indexcache ++exit 0 +diff --git a/feeds/luci/applications/luci-app-diag-core/Makefile b/feeds/luci/applications/luci-app-diag-core/Makefile +new file mode 100644 +index 0000000..ac9f499 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-diag-core/Makefile +@@ -0,0 +1,14 @@ ++# ++# Copyright (C) 2008-2014 The LuCI Team ++# ++# This is free software, licensed under the Apache License, Version 2.0 . ++# ++ ++include $(TOPDIR)/rules.mk ++ ++LUCI_TITLE:=LuCI Diagnostics Tools (Core) ++LUCI_DEPENDS:= ++ ++include ../../luci.mk ++ ++# call BuildPackage - OpenWrt buildroot signature +diff --git a/feeds/luci/applications/luci-app-diag-core/luasrc/controller/luci_diag.lua b/feeds/luci/applications/luci-app-diag-core/luasrc/controller/luci_diag.lua +new file mode 100644 +index 0000000..b662d7f +--- /dev/null ++++ b/feeds/luci/applications/luci-app-diag-core/luasrc/controller/luci_diag.lua +@@ -0,0 +1,16 @@ ++-- Copyright 2009 Daniel Dickinson ++-- Licensed to the public under the Apache License 2.0. ++ ++module("luci.controller.luci_diag", package.seeall) ++ ++function index() ++ local e ++ ++ e = entry({"admin", "network", "diag_config"}, template("diag/network_config_index") , _("Configure Diagnostics"), 120) ++ e.index = true ++ e.dependent = true ++ ++ e = entry({"mini", "diag"}, template("diag/index"), _("Diagnostics"), 120) ++ e.index = true ++ e.dependent = true ++end +diff --git a/feeds/luci/applications/luci-app-diag-core/luasrc/view/diag/index.htm b/feeds/luci/applications/luci-app-diag-core/luasrc/view/diag/index.htm +new file mode 100644 +index 0000000..328c4ec +--- /dev/null ++++ b/feeds/luci/applications/luci-app-diag-core/luasrc/view/diag/index.htm +@@ -0,0 +1,10 @@ ++<%# ++ Copyright 2009 Daniel Dickinson ++ Licensed to the public under the Apache License 2.0. ++-%> ++ ++<%+header%> ++

    <%:Diagnostics%>

    ++

    <%:The entries in the menu allow you to perform diagnostic tests on your system to aid in troubleshooting.%>

    ++

    <%:The diagnostics available under this menu depend on what modules you have installed on your device.%>

    ++<%+footer%> +diff --git a/feeds/luci/applications/luci-app-diag-core/luasrc/view/diag/network_config_index.htm b/feeds/luci/applications/luci-app-diag-core/luasrc/view/diag/network_config_index.htm +new file mode 100644 +index 0000000..595cc5f +--- /dev/null ++++ b/feeds/luci/applications/luci-app-diag-core/luasrc/view/diag/network_config_index.htm +@@ -0,0 +1,10 @@ ++<%# ++ Copyright 2009 Daniel Dickinson ++ Licensed to the public under the Apache License 2.0. ++-%> ++ ++<%+header%> ++

    <%:Diagnostics%>

    ++

    <%:With this menu you can configure network diagnostics, such as network device scans and ping tests.%>

    ++

    <%:The diagnostics available under this menu depend on what modules you have installed on your device.%>

    ++<%+footer%> +diff --git a/feeds/luci/applications/luci-app-diag-core/po/ca/diag_core.po b/feeds/luci/applications/luci-app-diag-core/po/ca/diag_core.po +new file mode 100644 +index 0000000..ffe0ded +--- /dev/null ++++ b/feeds/luci/applications/luci-app-diag-core/po/ca/diag_core.po +@@ -0,0 +1,33 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"PO-Revision-Date: 2014-06-01 23:52+0200\n" ++"Last-Translator: Alex \n" ++"Language-Team: none\n" ++"Language: ca\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n != 1);\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "Configure Diagnostics" ++msgstr "Configuració de diagnòstics" ++ ++msgid "Diagnostics" ++msgstr "Diagnòstics" ++ ++msgid "" ++"The diagnostics available under this menu depend on what modules you have " ++"installed on your device." ++msgstr "" ++ ++msgid "" ++"The entries in the menu allow you to perform diagnostic tests on your system " ++"to aid in troubleshooting." ++msgstr "" ++ ++msgid "" ++"With this menu you can configure network diagnostics, such as network device " ++"scans and ping tests." ++msgstr "" +diff --git a/feeds/luci/applications/luci-app-diag-core/po/cs/diag_core.po b/feeds/luci/applications/luci-app-diag-core/po/cs/diag_core.po +new file mode 100644 +index 0000000..dcfea77 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-diag-core/po/cs/diag_core.po +@@ -0,0 +1,39 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"PO-Revision-Date: 2014-06-20 23:19+0200\n" ++"Last-Translator: koli \n" ++"Language-Team: none\n" ++"Language: cs\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "Configure Diagnostics" ++msgstr "Nastavení diagnostiky" ++ ++msgid "Diagnostics" ++msgstr "Diagnostika" ++ ++msgid "" ++"The diagnostics available under this menu depend on what modules you have " ++"installed on your device." ++msgstr "" ++"PoÄet diagnostických testů, které jsou k dispozici v tomto menu je závislý " ++"na modulech nainstalovaných ve vaÅ¡em zařízení." ++ ++msgid "" ++"The entries in the menu allow you to perform diagnostic tests on your system " ++"to aid in troubleshooting." ++msgstr "" ++"Položky v menu vám umožní provádÄ›t systémové diagnostické testy, které vám " ++"pomohou vyÅ™eÅ¡it problémy." ++ ++msgid "" ++"With this menu you can configure network diagnostics, such as network device " ++"scans and ping tests." ++msgstr "" ++"V tomto menu můžete nastavit síťovou diagnostiku, jako je skenování síťových " ++"zařízení a ping testů." +diff --git a/feeds/luci/applications/luci-app-diag-core/po/de/diag_core.po b/feeds/luci/applications/luci-app-diag-core/po/de/diag_core.po +new file mode 100644 +index 0000000..feda0fc +--- /dev/null ++++ b/feeds/luci/applications/luci-app-diag-core/po/de/diag_core.po +@@ -0,0 +1,42 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"PO-Revision-Date: 2012-07-02 08:24+0200\n" ++"Last-Translator: dgolle \n" ++"Language-Team: none\n" ++"Language: de\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n != 1);\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "Configure Diagnostics" ++msgstr "Diagnose-Tests konfigurieren" ++ ++msgid "Diagnostics" ++msgstr "Diagnose" ++ ++msgid "" ++"The diagnostics available under this menu depend on what modules you have " ++"installed on your device." ++msgstr "" ++"Die verfügbaren Diagnose-Programme in diesem Menü hängen von den auf Ihrem " ++"Gerät installierten Modulen ab." ++ ++msgid "" ++"The entries in the menu allow you to perform diagnostic tests on your system " ++"to aid in troubleshooting." ++msgstr "" ++"Falls es mit ihrem Gerät Probleme gibt können hier Diagnose-Tests " ++"durchgeführt werden." ++ ++msgid "" ++"With this menu you can configure network diagnostics, such as network device " ++"scans and ping tests." ++msgstr "" ++"Hier werden die Netzwerk Diagnose Tools konfiguriert (zB. Netzwerkscans und " ++"Pings)." ++ ++#~ msgid "l_d_diag" ++#~ msgstr "Diagnose" +diff --git a/feeds/luci/applications/luci-app-diag-core/po/el/diag_core.po b/feeds/luci/applications/luci-app-diag-core/po/el/diag_core.po +new file mode 100644 +index 0000000..8e57c52 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-diag-core/po/el/diag_core.po +@@ -0,0 +1,38 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"PO-Revision-Date: 2012-03-18 14:53+0200\n" ++"Last-Translator: Vasilis \n" ++"Language-Team: none\n" ++"Language: el\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n != 1);\n" ++"X-Generator: Pootle 2.0.4\n" ++ ++msgid "Configure Diagnostics" ++msgstr "ΡÏθμιση Διαγνωστικών" ++ ++msgid "Diagnostics" ++msgstr "" ++ ++msgid "" ++"The diagnostics available under this menu depend on what modules you have " ++"installed on your device." ++msgstr "" ++ ++msgid "" ++"The entries in the menu allow you to perform diagnostic tests on your system " ++"to aid in troubleshooting." ++msgstr "" ++"Η καταχωÏήσεις στο μενοÏ, σας επιτÏέπουν να Ï€Ïοβαίνετε σε διαγνωστικές " ++"δοκιμές στο σÏστημά σας, για την διευκόλυνση αντιμετώπισης Ï€Ïοβλημάτων." ++ ++#, fuzzy ++msgid "" ++"With this menu you can configure network diagnostics, such as network device " ++"scans and ping tests." ++msgstr "" ++"Με αυτό το μενοÏ, μποÏείτε να παÏαμετÏοποιήσετε διαγνωστικά δικτÏου, όπως " ++"σαÏώσεις συσκευών δικτÏου και δοκιμές ping." +diff --git a/feeds/luci/applications/luci-app-diag-core/po/en/diag_core.po b/feeds/luci/applications/luci-app-diag-core/po/en/diag_core.po +new file mode 100644 +index 0000000..aa030ef +--- /dev/null ++++ b/feeds/luci/applications/luci-app-diag-core/po/en/diag_core.po +@@ -0,0 +1,42 @@ ++# Diagnostics Core. ++# Copyright (C) 2009 Daniel Dickinson. ++# Daniel Dickinson , 2009. ++# ++#, fuzzy ++msgid "" ++msgstr "" ++"Project-Id-Version: diag-core 0.1\n" ++"PO-Revision-Date: 2009-07-17 04:54-0400\n" ++"Last-Translator: Daniel Dickinson \n" ++"Language-Team: en \n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++ ++msgid "Configure Diagnostics" ++msgstr "Configure Diagnostics" ++ ++msgid "Diagnostics" ++msgstr "" ++ ++msgid "" ++"The diagnostics available under this menu depend on what modules you have " ++"installed on your device." ++msgstr "" ++ ++msgid "" ++"The entries in the menu allow you to perform diagnostic tests on your system " ++"to aid in troubleshooting." ++msgstr "" ++"The entries in the menu allow you to perform diagnostic tests on your system " ++"to aid in troubleshooting." ++ ++msgid "" ++"With this menu you can configure network diagnostics, such as network device " ++"scans and ping tests." ++msgstr "" ++"With this menu you can configure network diagnostics, such as network device " ++"scans and ping tests." ++ ++#~ msgid "l_d_diag" ++#~ msgstr "Diagnostics" +diff --git a/feeds/luci/applications/luci-app-diag-core/po/es/diag_core.po b/feeds/luci/applications/luci-app-diag-core/po/es/diag_core.po +new file mode 100644 +index 0000000..8b9b3b5 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-diag-core/po/es/diag_core.po +@@ -0,0 +1,42 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"PO-Revision-Date: 2012-07-28 23:25+0200\n" ++"Last-Translator: Daniel \n" ++"Language-Team: none\n" ++"Language: es\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n != 1);\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "Configure Diagnostics" ++msgstr "Configurar diagnósticos" ++ ++msgid "Diagnostics" ++msgstr "Diagnósticos" ++ ++msgid "" ++"The diagnostics available under this menu depend on what modules you have " ++"installed on your device." ++msgstr "" ++"Los diagnósticos disponibles bajo este menú dependen de qué módulos haya " ++"instalado en su dispositivo." ++ ++msgid "" ++"The entries in the menu allow you to perform diagnostic tests on your system " ++"to aid in troubleshooting." ++msgstr "" ++"Este menú le permite realizar test de prueba de su sistema para ayudar en la " ++"resolución de problemas." ++ ++msgid "" ++"With this menu you can configure network diagnostics, such as network device " ++"scans and ping tests." ++msgstr "" ++"En este menú puede configurar diagnósticos de red como el escaneo de equipos " ++"en red o pings." ++ ++#~ msgid "l_d_diag" ++#~ msgstr "DiagnoÅ›ticos" +diff --git a/feeds/luci/applications/luci-app-diag-core/po/fr/diag_core.po b/feeds/luci/applications/luci-app-diag-core/po/fr/diag_core.po +new file mode 100644 +index 0000000..a5b4e6a +--- /dev/null ++++ b/feeds/luci/applications/luci-app-diag-core/po/fr/diag_core.po +@@ -0,0 +1,42 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"PO-Revision-Date: 2012-11-06 13:21+0200\n" ++"Last-Translator: hogsim \n" ++"Language-Team: none\n" ++"Language: fr\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n > 1);\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "Configure Diagnostics" ++msgstr "Configuration des diagnostics" ++ ++msgid "Diagnostics" ++msgstr "Diagnostiques" ++ ++msgid "" ++"The diagnostics available under this menu depend on what modules you have " ++"installed on your device." ++msgstr "" ++"Les diagnostics disponible ci-dessous dépendent des modules que vous avez " ++"installé sur votre appareil. " ++ ++msgid "" ++"The entries in the menu allow you to perform diagnostic tests on your system " ++"to aid in troubleshooting." ++msgstr "" ++"Les items de ce menu vous permettent d'accomplir des diagnostics sur votre " ++"système pour vous aider à le dépanner." ++ ++msgid "" ++"With this menu you can configure network diagnostics, such as network device " ++"scans and ping tests." ++msgstr "" ++"Ce menu vous permet de configurer des diagnostics réseau, comme des " ++"recherches de périphérique réseau et des tests par ping." ++ ++#~ msgid "l_d_diag" ++#~ msgstr "l_d_diag" +diff --git a/feeds/luci/applications/luci-app-diag-core/po/he/diag_core.po b/feeds/luci/applications/luci-app-diag-core/po/he/diag_core.po +new file mode 100644 +index 0000000..b4d73e0 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-diag-core/po/he/diag_core.po +@@ -0,0 +1,30 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Last-Translator: Automatically generated\n" ++"Language-Team: none\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n != 1);\n" ++ ++msgid "Configure Diagnostics" ++msgstr "" ++ ++msgid "Diagnostics" ++msgstr "" ++ ++msgid "" ++"The diagnostics available under this menu depend on what modules you have " ++"installed on your device." ++msgstr "" ++ ++msgid "" ++"The entries in the menu allow you to perform diagnostic tests on your system " ++"to aid in troubleshooting." ++msgstr "" ++ ++msgid "" ++"With this menu you can configure network diagnostics, such as network device " ++"scans and ping tests." ++msgstr "" +diff --git a/feeds/luci/applications/luci-app-diag-core/po/hu/diag_core.po b/feeds/luci/applications/luci-app-diag-core/po/hu/diag_core.po +new file mode 100644 +index 0000000..f9f6e66 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-diag-core/po/hu/diag_core.po +@@ -0,0 +1,42 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"PO-Revision-Date: 2012-07-05 16:44+0200\n" ++"Last-Translator: Gyula \n" ++"Language-Team: none\n" ++"Language: hu\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n != 1);\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "Configure Diagnostics" ++msgstr "Diagnosztikai beállítások" ++ ++msgid "Diagnostics" ++msgstr "Diagnosztika" ++ ++msgid "" ++"The diagnostics available under this menu depend on what modules you have " ++"installed on your device." ++msgstr "" ++"Az itt található statisztikák attól függÅ‘en változnak, hogy milyen modulokat " ++"telepítettél az eszközödre." ++ ++msgid "" ++"The entries in the menu allow you to perform diagnostic tests on your system " ++"to aid in troubleshooting." ++msgstr "" ++"Ennek a menünek az elemei lehetÅ‘vé teszik hálózati diagnosztikai tesztek " ++"elvégzését a rendszeren a hibaelhárítás megkönnyítésére." ++ ++msgid "" ++"With this menu you can configure network diagnostics, such as network device " ++"scans and ping tests." ++msgstr "" ++"Ebben a menüben beállíthatók a hálózati diagnosztika elemei, mint például " ++"eszközök keresése és ping teszt." ++ ++#~ msgid "l_d_diag" ++#~ msgstr "l_d_diag" +diff --git a/feeds/luci/applications/luci-app-diag-core/po/it/diag_core.po b/feeds/luci/applications/luci-app-diag-core/po/it/diag_core.po +new file mode 100644 +index 0000000..39d4ced +--- /dev/null ++++ b/feeds/luci/applications/luci-app-diag-core/po/it/diag_core.po +@@ -0,0 +1,42 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"PO-Revision-Date: 2013-02-03 13:54+0200\n" ++"Last-Translator: Francesco <3gasas@gmail.com>\n" ++"Language-Team: none\n" ++"Language: it\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n != 1);\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "Configure Diagnostics" ++msgstr "Configura Diagnostici" ++ ++msgid "Diagnostics" ++msgstr "Diagnostiche" ++ ++msgid "" ++"The diagnostics available under this menu depend on what modules you have " ++"installed on your device." ++msgstr "" ++"Le funzioni di diagnostica disponibili in questo menu dipendono dai moduli " ++"che avete installato sul vostro dispositivo." ++ ++msgid "" ++"The entries in the menu allow you to perform diagnostic tests on your system " ++"to aid in troubleshooting." ++msgstr "" ++"Gli stumenti nel menù possono servirti per diagnosi e test per aiutarti " ++"nello scoprire le problematiche." ++ ++msgid "" ++"With this menu you can configure network diagnostics, such as network device " ++"scans and ping tests." ++msgstr "" ++"Con questo menu puoi configurare la diagnostica di rete, come la scansione " ++"di un dispositivo di rete o dei ping di test." ++ ++#~ msgid "l_d_diag" ++#~ msgstr "l_d_diag" +diff --git a/feeds/luci/applications/luci-app-diag-core/po/ja/diag_core.po b/feeds/luci/applications/luci-app-diag-core/po/ja/diag_core.po +new file mode 100644 +index 0000000..f67657f +--- /dev/null ++++ b/feeds/luci/applications/luci-app-diag-core/po/ja/diag_core.po +@@ -0,0 +1,33 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"PO-Revision-Date: 2012-03-18 14:36+0200\n" ++"Last-Translator: Kentaro \n" ++"Language-Team: none\n" ++"Language: ja\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=1; plural=0;\n" ++"X-Generator: Pootle 2.0.4\n" ++ ++msgid "Configure Diagnostics" ++msgstr "診断機能設定" ++ ++msgid "Diagnostics" ++msgstr "" ++ ++msgid "" ++"The diagnostics available under this menu depend on what modules you have " ++"installed on your device." ++msgstr "" ++ ++msgid "" ++"The entries in the menu allow you to perform diagnostic tests on your system " ++"to aid in troubleshooting." ++msgstr "" ++ ++msgid "" ++"With this menu you can configure network diagnostics, such as network device " ++"scans and ping tests." ++msgstr "" +diff --git a/feeds/luci/applications/luci-app-diag-core/po/ms/diag_core.po b/feeds/luci/applications/luci-app-diag-core/po/ms/diag_core.po +new file mode 100644 +index 0000000..90fefc5 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-diag-core/po/ms/diag_core.po +@@ -0,0 +1,29 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Last-Translator: Automatically generated\n" ++"Language-Team: none\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++ ++msgid "Configure Diagnostics" ++msgstr "" ++ ++msgid "Diagnostics" ++msgstr "" ++ ++msgid "" ++"The diagnostics available under this menu depend on what modules you have " ++"installed on your device." ++msgstr "" ++ ++msgid "" ++"The entries in the menu allow you to perform diagnostic tests on your system " ++"to aid in troubleshooting." ++msgstr "" ++ ++msgid "" ++"With this menu you can configure network diagnostics, such as network device " ++"scans and ping tests." ++msgstr "" +diff --git a/feeds/luci/applications/luci-app-diag-core/po/no/diag_core.po b/feeds/luci/applications/luci-app-diag-core/po/no/diag_core.po +new file mode 100644 +index 0000000..4955d47 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-diag-core/po/no/diag_core.po +@@ -0,0 +1,35 @@ ++msgid "" ++msgstr "" ++"Last-Translator: Lars Hardy \n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++ ++msgid "Configure Diagnostics" ++msgstr "Konfigurer Diagnostikk" ++ ++msgid "Diagnostics" ++msgstr "Diagnostikk" ++ ++msgid "" ++"The diagnostics available under this menu depend on what modules you have " ++"installed on your device." ++msgstr "" ++"Diagnostikken tilgjengelig under denne menyen avhenger av hvilke moduler du " ++"har installert pÃ¥ enheten." ++ ++msgid "" ++"The entries in the menu allow you to perform diagnostic tests on your system " ++"to aid in troubleshooting." ++msgstr "" ++"Oppføringene i menyen lar deg utføre diagnostiske tester pÃ¥ systemet ditt " ++"til hjelp ved feilsøking." ++ ++msgid "" ++"With this menu you can configure network diagnostics, such as network device " ++"scans and ping tests." ++msgstr "" ++"Her kan du konfigurere nettverks diagnostikk, som skanning etter nettverks " ++"enheter og ping tester." ++ ++#~ msgid "l_d_diag" ++#~ msgstr "Nettverks Diagnostikk" +diff --git a/feeds/luci/applications/luci-app-diag-core/po/pl/diag_core.po b/feeds/luci/applications/luci-app-diag-core/po/pl/diag_core.po +new file mode 100644 +index 0000000..0935fdb +--- /dev/null ++++ b/feeds/luci/applications/luci-app-diag-core/po/pl/diag_core.po +@@ -0,0 +1,43 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"PO-Revision-Date: 2012-09-08 13:17+0200\n" ++"Last-Translator: Staszek \n" ++"Language-Team: none\n" ++"Language: pl\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 " ++"|| n%100>=20) ? 1 : 2);\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "Configure Diagnostics" ++msgstr "Konfiguracja diagnostyki" ++ ++msgid "Diagnostics" ++msgstr "Diagnostyka" ++ ++msgid "" ++"The diagnostics available under this menu depend on what modules you have " ++"installed on your device." ++msgstr "" ++"Liczba testów diagnostycznych dostÄ™pnych w tym menu jest uzależniona od " ++"modułów zainstalowanych w tym urzÄ…dzeniu." ++ ++msgid "" ++"The entries in the menu allow you to perform diagnostic tests on your system " ++"to aid in troubleshooting." ++msgstr "" ++"Wpisy w menu pozwalajÄ… na wykonanie testów diagnostycznych systemu pomocnych " ++"w rozwiÄ…zywaniu problemów." ++ ++msgid "" ++"With this menu you can configure network diagnostics, such as network device " ++"scans and ping tests." ++msgstr "" ++"W tym menu można skonfigurować diagnostykÄ™ sieci, jak np. skanowanie " ++"urzÄ…dzeÅ„ sieciowych lub testy ping." ++ ++#~ msgid "l_d_diag" ++#~ msgstr "l_d_diag" +diff --git a/feeds/luci/applications/luci-app-diag-core/po/pt-br/diag_core.po b/feeds/luci/applications/luci-app-diag-core/po/pt-br/diag_core.po +new file mode 100644 +index 0000000..e27315b +--- /dev/null ++++ b/feeds/luci/applications/luci-app-diag-core/po/pt-br/diag_core.po +@@ -0,0 +1,42 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"PO-Revision-Date: 2011-10-08 03:14+0200\n" ++"Last-Translator: luizluca \n" ++"Language-Team: none\n" ++"Language: pt_BR\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n > 1);\n" ++"X-Generator: Pootle 2.0.4\n" ++ ++msgid "Configure Diagnostics" ++msgstr "Configura os Diagnósticos" ++ ++msgid "Diagnostics" ++msgstr "Diagnósticos" ++ ++msgid "" ++"The diagnostics available under this menu depend on what modules you have " ++"installed on your device." ++msgstr "" ++"Os diagnósticos disponíveis neste menu dependem de quais módulos você tem " ++"instalado no seu dispositivo." ++ ++msgid "" ++"The entries in the menu allow you to perform diagnostic tests on your system " ++"to aid in troubleshooting." ++msgstr "" ++"As entradas no menu permitem que você realize diagnósticos em seu sistema " ++"para ajudar na resolução de problemas." ++ ++msgid "" ++"With this menu you can configure network diagnostics, such as network device " ++"scans and ping tests." ++msgstr "" ++"Com este menu, você pode configurar o diagnóstico de rede como varredura de " ++"dispositivos e testes de ping." ++ ++#~ msgid "l_d_diag" ++#~ msgstr "l_d_diag" +diff --git a/feeds/luci/applications/luci-app-diag-core/po/pt/diag_core.po b/feeds/luci/applications/luci-app-diag-core/po/pt/diag_core.po +new file mode 100644 +index 0000000..6083f28 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-diag-core/po/pt/diag_core.po +@@ -0,0 +1,39 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"PO-Revision-Date: 2013-05-30 22:57+0200\n" ++"Last-Translator: joao.f.vieira \n" ++"Language-Team: none\n" ++"Language: pt\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n != 1);\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "Configure Diagnostics" ++msgstr "Configurar Diagnósticos" ++ ++msgid "Diagnostics" ++msgstr "Diagnósticos " ++ ++msgid "" ++"The diagnostics available under this menu depend on what modules you have " ++"installed on your device." ++msgstr "" ++"Os diagnósticos disponíveis neste menu dependem dos módulos que tem " ++"instalados no seu dispositivo. " ++ ++msgid "" ++"The entries in the menu allow you to perform diagnostic tests on your system " ++"to aid in troubleshooting." ++msgstr "" ++"As entradas neste menu permitem levar a cabo testes de diagnóstico no seu " ++"sistema para o ajudar na resolução de problemas." ++ ++msgid "" ++"With this menu you can configure network diagnostics, such as network device " ++"scans and ping tests." ++msgstr "" ++"Com este menu pode configurar o diagnóstico de rede, tal como explorar " ++"dispositivos de rede e testes ping." +diff --git a/feeds/luci/applications/luci-app-diag-core/po/ro/diag_core.po b/feeds/luci/applications/luci-app-diag-core/po/ro/diag_core.po +new file mode 100644 +index 0000000..604841e +--- /dev/null ++++ b/feeds/luci/applications/luci-app-diag-core/po/ro/diag_core.po +@@ -0,0 +1,45 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"PO-Revision-Date: 2014-07-09 14:24+0200\n" ++"Last-Translator: lex404 \n" ++"Language-Team: none\n" ++"Language: ro\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=3; plural=(n==1 ? 0 : (n==0 || (n%100 > 0 && n%100 < " ++"20)) ? 1 : 2);;\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "Configure Diagnostics" ++msgstr "Configurează diagnozele" ++ ++# diagnostic/ diagnostice; suna oricum prea medical. Tehnic se foloseste diagnoza, din cate stiu. ++msgid "Diagnostics" ++msgstr "Diagnoze" ++ ++# . ++msgid "" ++"The diagnostics available under this menu depend on what modules you have " ++"installed on your device." ++msgstr "" ++"Diagnozele disponibile sub acest meniu depind de ce module aveÈ›i instalate " ++"pe device-ul dumneavoastră." ++ ++msgid "" ++"The entries in the menu allow you to perform diagnostic tests on your system " ++"to aid in troubleshooting." ++msgstr "" ++"Intrările din acest meniu permit utilizarea testelor de diagnoză în sistem " ++"pentru a vă ajuta la rezolvarea problemelor." ++ ++msgid "" ++"With this menu you can configure network diagnostics, such as network device " ++"scans and ping tests." ++msgstr "" ++"Cu acest meniu poÈ›i configura diagnoza în reÈ›ea, cum ar fi scanarea unor " ++"dispozitive din reÈ›ea sau teste ping." ++ ++#~ msgid "l_d_diag" ++#~ msgstr "l_d_diag" +diff --git a/feeds/luci/applications/luci-app-diag-core/po/ru/diag_core.po b/feeds/luci/applications/luci-app-diag-core/po/ru/diag_core.po +new file mode 100644 +index 0000000..1abaa8c +--- /dev/null ++++ b/feeds/luci/applications/luci-app-diag-core/po/ru/diag_core.po +@@ -0,0 +1,45 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: LuCI: diag_core\n" ++"POT-Creation-Date: \n" ++"PO-Revision-Date: 2012-08-15 11:44+0300\n" ++"Last-Translator: Roman A. aka BasicXP \n" ++"Language-Team: Russian \n" ++"Language: ru\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%" ++"10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" ++"X-Generator: Pootle 2.0.6\n" ++"X-Poedit-SourceCharset: UTF-8\n" ++ ++msgid "Configure Diagnostics" ++msgstr "ÐаÑтройки диагноÑтики" ++ ++msgid "Diagnostics" ++msgstr "ДиагноÑтика" ++ ++msgid "" ++"The diagnostics available under this menu depend on what modules you have " ++"installed on your device." ++msgstr "" ++"ДоÑтупные в данном меню виды диагноÑтики завиÑÑÑ‚ от уÑтановленных на вашем " ++"уÑтройÑтве модулей. " ++ ++msgid "" ++"The entries in the menu allow you to perform diagnostic tests on your system " ++"to aid in troubleshooting." ++msgstr "" ++"ЗапиÑи в меню позволÑÑ‚ÑŒ вам выполнить диагноÑтику ÑиÑтемы, чтобы помочь в " ++"обнаружении проблем." ++ ++msgid "" ++"With this menu you can configure network diagnostics, such as network device " ++"scans and ping tests." ++msgstr "" ++"ИÑÐ¿Ð¾Ð»ÑŒÐ·ÑƒÑ Ñто меню, вы можете наÑтроить диагноÑтику Ñети, например, " ++"Ñканирование Ñетевых уÑтройÑтв или ping-теÑÑ‚." ++ ++#~ msgid "l_d_diag" ++#~ msgstr "l_d_diag" +diff --git a/feeds/luci/applications/luci-app-diag-core/po/sk/diag_core.po b/feeds/luci/applications/luci-app-diag-core/po/sk/diag_core.po +new file mode 100644 +index 0000000..389516f +--- /dev/null ++++ b/feeds/luci/applications/luci-app-diag-core/po/sk/diag_core.po +@@ -0,0 +1,30 @@ ++msgid "" ++msgstr "" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Last-Translator: Automatically generated\n" ++"Language-Team: none\n" ++"MIME-Version: 1.0\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n" ++ ++msgid "Configure Diagnostics" ++msgstr "" ++ ++msgid "Diagnostics" ++msgstr "" ++ ++msgid "" ++"The diagnostics available under this menu depend on what modules you have " ++"installed on your device." ++msgstr "" ++ ++msgid "" ++"The entries in the menu allow you to perform diagnostic tests on your system " ++"to aid in troubleshooting." ++msgstr "" ++ ++msgid "" ++"With this menu you can configure network diagnostics, such as network device " ++"scans and ping tests." ++msgstr "" +diff --git a/feeds/luci/applications/luci-app-diag-core/po/sv/diag_core.po b/feeds/luci/applications/luci-app-diag-core/po/sv/diag_core.po +new file mode 100644 +index 0000000..dd0a81a +--- /dev/null ++++ b/feeds/luci/applications/luci-app-diag-core/po/sv/diag_core.po +@@ -0,0 +1,31 @@ ++msgid "" ++msgstr "" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Last-Translator: Automatically generated\n" ++"Language-Team: none\n" ++"Language: sv\n" ++"MIME-Version: 1.0\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n != 1);\n" ++ ++msgid "Configure Diagnostics" ++msgstr "" ++ ++msgid "Diagnostics" ++msgstr "" ++ ++msgid "" ++"The diagnostics available under this menu depend on what modules you have " ++"installed on your device." ++msgstr "" ++ ++msgid "" ++"The entries in the menu allow you to perform diagnostic tests on your system " ++"to aid in troubleshooting." ++msgstr "" ++ ++msgid "" ++"With this menu you can configure network diagnostics, such as network device " ++"scans and ping tests." ++msgstr "" +diff --git a/feeds/luci/applications/luci-app-diag-core/po/templates/diag_core.pot b/feeds/luci/applications/luci-app-diag-core/po/templates/diag_core.pot +new file mode 100644 +index 0000000..1b34f83 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-diag-core/po/templates/diag_core.pot +@@ -0,0 +1,23 @@ ++msgid "" ++msgstr "Content-Type: text/plain; charset=UTF-8" ++ ++msgid "Configure Diagnostics" ++msgstr "" ++ ++msgid "Diagnostics" ++msgstr "" ++ ++msgid "" ++"The diagnostics available under this menu depend on what modules you have " ++"installed on your device." ++msgstr "" ++ ++msgid "" ++"The entries in the menu allow you to perform diagnostic tests on your system " ++"to aid in troubleshooting." ++msgstr "" ++ ++msgid "" ++"With this menu you can configure network diagnostics, such as network device " ++"scans and ping tests." ++msgstr "" +diff --git a/feeds/luci/applications/luci-app-diag-core/po/tr/diag_core.po b/feeds/luci/applications/luci-app-diag-core/po/tr/diag_core.po +new file mode 100644 +index 0000000..d0b6211 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-diag-core/po/tr/diag_core.po +@@ -0,0 +1,30 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Last-Translator: Automatically generated\n" ++"Language-Team: none\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=1; plural=0;\n" ++ ++msgid "Configure Diagnostics" ++msgstr "" ++ ++msgid "Diagnostics" ++msgstr "" ++ ++msgid "" ++"The diagnostics available under this menu depend on what modules you have " ++"installed on your device." ++msgstr "" ++ ++msgid "" ++"The entries in the menu allow you to perform diagnostic tests on your system " ++"to aid in troubleshooting." ++msgstr "" ++ ++msgid "" ++"With this menu you can configure network diagnostics, such as network device " ++"scans and ping tests." ++msgstr "" +diff --git a/feeds/luci/applications/luci-app-diag-core/po/uk/diag_core.po b/feeds/luci/applications/luci-app-diag-core/po/uk/diag_core.po +new file mode 100644 +index 0000000..eae9886 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-diag-core/po/uk/diag_core.po +@@ -0,0 +1,40 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"PO-Revision-Date: 2013-05-26 17:55+0200\n" ++"Last-Translator: Yurii \n" ++"Language-Team: none\n" ++"Language: uk\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%" ++"10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "Configure Diagnostics" ++msgstr "ÐšÐ¾Ð½Ñ„Ñ–Ð³ÑƒÑ€ÑƒÐ²Ð°Ð½Ð½Ñ Ð´Ñ–Ð°Ð³Ð½Ð¾Ñтики" ++ ++msgid "Diagnostics" ++msgstr "ДіагноÑтика" ++ ++msgid "" ++"The diagnostics available under this menu depend on what modules you have " ++"installed on your device." ++msgstr "" ++"ДоÑтупні в цьому меню види діагноÑтики залежать від того, Ñкі модулі " ++"інÑтальовані на вашому приÑтроі." ++ ++msgid "" ++"The entries in the menu allow you to perform diagnostic tests on your system " ++"to aid in troubleshooting." ++msgstr "" ++"Пункти меню дозволÑÑŽÑ‚ÑŒ виконувати діагноÑтичні теÑти на вашій ÑиÑтемі, щоб " ++"допомогти при уÑуненні неполадок." ++ ++msgid "" ++"With this menu you can configure network diagnostics, such as network device " ++"scans and ping tests." ++msgstr "" ++"ВикориÑтовуючи це меню, ви можете Ñконфігурувати діагноÑтику мережі, " ++"наприклад, ÑÐºÐ°Ð½ÑƒÐ²Ð°Ð½Ð½Ñ Ð¼ÐµÑ€ÐµÐ¶ÐµÐ²Ð¸Ñ… приÑтроїв та пінг-теÑти." +diff --git a/feeds/luci/applications/luci-app-diag-core/po/vi/diag_core.po b/feeds/luci/applications/luci-app-diag-core/po/vi/diag_core.po +new file mode 100644 +index 0000000..d0b6211 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-diag-core/po/vi/diag_core.po +@@ -0,0 +1,30 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Last-Translator: Automatically generated\n" ++"Language-Team: none\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=1; plural=0;\n" ++ ++msgid "Configure Diagnostics" ++msgstr "" ++ ++msgid "Diagnostics" ++msgstr "" ++ ++msgid "" ++"The diagnostics available under this menu depend on what modules you have " ++"installed on your device." ++msgstr "" ++ ++msgid "" ++"The entries in the menu allow you to perform diagnostic tests on your system " ++"to aid in troubleshooting." ++msgstr "" ++ ++msgid "" ++"With this menu you can configure network diagnostics, such as network device " ++"scans and ping tests." ++msgstr "" +diff --git a/feeds/luci/applications/luci-app-diag-core/po/zh-cn/diag_core.po b/feeds/luci/applications/luci-app-diag-core/po/zh-cn/diag_core.po +new file mode 100644 +index 0000000..e857d3d +--- /dev/null ++++ b/feeds/luci/applications/luci-app-diag-core/po/zh-cn/diag_core.po +@@ -0,0 +1,36 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"PO-Revision-Date: 2012-09-05 14:39+0200\n" ++"Last-Translator: nKsyn \n" ++"Language-Team: none\n" ++"Language: zh_CN\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=1; plural=0;\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "Configure Diagnostics" ++msgstr "é…置诊断" ++ ++msgid "Diagnostics" ++msgstr "诊断" ++ ++msgid "" ++"The diagnostics available under this menu depend on what modules you have " ++"installed on your device." ++msgstr "å¯ç”¨çš„诊断ä¾èµ–于设备上已ç»å®‰è£…的诊断模å—" ++ ++msgid "" ++"The entries in the menu allow you to perform diagnostic tests on your system " ++"to aid in troubleshooting." ++msgstr "下é¢çš„æ¡ç›®å¯ä»¥è¯Šæ–­æµ‹è¯•ç³»ç»Ÿï¼Œä¸ºæŽ’除故障æ供信æ¯" ++ ++msgid "" ++"With this menu you can configure network diagnostics, such as network device " ++"scans and ping tests." ++msgstr "在这里å¯ä»¥é…置网络诊断,例如:扫æ网络设备,进行ping测试等。" ++ ++#~ msgid "l_d_diag" ++#~ msgstr "l_d诊断" +diff --git a/feeds/luci/applications/luci-app-diag-core/po/zh-tw/diag_core.po b/feeds/luci/applications/luci-app-diag-core/po/zh-tw/diag_core.po +new file mode 100644 +index 0000000..3cb3169 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-diag-core/po/zh-tw/diag_core.po +@@ -0,0 +1,33 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"PO-Revision-Date: 2014-05-14 12:47+0200\n" ++"Last-Translator: omnistack \n" ++"Language-Team: none\n" ++"Language: zh_TW\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=1; plural=0;\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "Configure Diagnostics" ++msgstr "診斷設定" ++ ++msgid "Diagnostics" ++msgstr "診斷" ++ ++msgid "" ++"The diagnostics available under this menu depend on what modules you have " ++"installed on your device." ++msgstr "這é¸å–®ä¸‹çš„診斷機制å¯é‹ç”¨æ€§, 端看你設備上已安è£çš„模組而定" ++ ++msgid "" ++"The entries in the menu allow you to perform diagnostic tests on your system " ++"to aid in troubleshooting." ++msgstr "é¸å–®å…§çš„é …ç›®å…許你在系統內執行診斷測試以便解決疑難雜症" ++ ++msgid "" ++"With this menu you can configure network diagnostics, such as network device " ++"scans and ping tests." ++msgstr "採用這é¸é …å¯ä»¥è®“你設定網路診斷, 例如網路設備掃æè·Ÿping的測試." +diff --git a/feeds/luci/applications/luci-app-diag-devinfo/Makefile b/feeds/luci/applications/luci-app-diag-devinfo/Makefile +new file mode 100644 +index 0000000..258fdee +--- /dev/null ++++ b/feeds/luci/applications/luci-app-diag-devinfo/Makefile +@@ -0,0 +1,14 @@ ++# ++# Copyright (C) 2008-2014 The LuCI Team ++# ++# This is free software, licensed under the Apache License, Version 2.0 . ++# ++ ++include $(TOPDIR)/rules.mk ++ ++LUCI_TITLE:=LuCI Diagnostics Tools (Device Info) ++LUCI_DEPENDS:=+luci-app-diag-core +smap +netdiscover +mac-to-devinfo +httping +smap-to-devinfo +netdiscover-to-devinfo ++ ++include ../../luci.mk ++ ++# call BuildPackage - OpenWrt buildroot signature +diff --git a/feeds/luci/applications/luci-app-diag-devinfo/luasrc/controller/luci_diag/devinfo_common.lua b/feeds/luci/applications/luci-app-diag-devinfo/luasrc/controller/luci_diag/devinfo_common.lua +new file mode 100644 +index 0000000..93f735c +--- /dev/null ++++ b/feeds/luci/applications/luci-app-diag-devinfo/luasrc/controller/luci_diag/devinfo_common.lua +@@ -0,0 +1,185 @@ ++-- Copyright 2009 Daniel Dickinson ++-- Licensed to the public under the Apache License 2.0. ++ ++module("luci.controller.luci_diag.devinfo_common", package.seeall) ++ ++require("luci.i18n") ++require("luci.util") ++require("luci.sys") ++require("luci.cbi") ++require("luci.model.uci") ++ ++local translate = luci.i18n.translate ++local DummyValue = luci.cbi.DummyValue ++local SimpleSection = luci.cbi.SimpleSection ++ ++function index() ++ return -- no-op ++end ++ ++function run_processes(outnets, cmdfunc) ++ i = next(outnets, nil) ++ while (i) do ++ outnets[i]["output"] = luci.sys.exec(cmdfunc(outnets, i)) ++ i = next(outnets, i) ++ end ++end ++ ++function parse_output(devmap, outnets, haslink, type, mini, debug) ++ local curnet = next(outnets, nil) ++ ++ while (curnet) do ++ local output = outnets[curnet]["output"] ++ local subnet = outnets[curnet]["subnet"] ++ local ports = outnets[curnet]["ports"] ++ local interface = outnets[curnet]["interface"] ++ local netdevs = {} ++ devlines = luci.util.split(output) ++ if not devlines then ++ devlines = {} ++ table.insert(devlines, output) ++ end ++ ++ local j = nil ++ j = next(devlines, j) ++ ++ local found_a_device = false ++ ++ while (j) do ++ if devlines[j] and ( devlines[j] ~= "" ) then ++ found_a_device = true ++ local devtable ++ local row = {} ++ devtable = luci.util.split(devlines[j], ' | ') ++ row["ip"] = devtable[1] ++ if (not mini) then ++ row["mac"] = devtable[2] ++ end ++ if ( devtable[4] == 'unknown' ) then ++ row["vendor"] = devtable[3] ++ else ++ row["vendor"] = devtable[4] ++ end ++ row["type"] = devtable[5] ++ if (not mini) then ++ row["model"] = devtable[6] ++ end ++ if (haslink) then ++ row["config_page"] = devtable[7] ++ end ++ ++ if (debug) then ++ row["raw"] = devlines[j] ++ end ++ table.insert(netdevs, row) ++ end ++ j = next(devlines, j) ++ end ++ if not found_a_device then ++ local row = {} ++ row["ip"] = curnet ++ if (not mini) then ++ row["mac"] = "" ++ end ++ if (type == "smap") then ++ row["vendor"] = luci.i18n.translate("No SIP devices") ++ else ++ row["vendor"] = luci.i18n.translate("No devices detected") ++ end ++ row["type"] = luci.i18n.translate("check other networks") ++ if (not mini) then ++ row["model"] = "" ++ end ++ if (haslink) then ++ row["config_page"] = "" ++ end ++ if (debug) then ++ row["raw"] = output ++ end ++ table.insert(netdevs, row) ++ end ++ local s ++ if (type == "smap") then ++ if (mini) then ++ s = devmap:section(luci.cbi.Table, netdevs, luci.i18n.translate("SIP devices discovered for") .. " " .. curnet) ++ else ++ local interfacestring = "" ++ if ( interface ~= "" ) then ++ interfacestring = ", " .. interface ++ end ++ s = devmap:section(luci.cbi.Table, netdevs, luci.i18n.translate("SIP devices discovered for") .. " " .. curnet .. " (" .. subnet .. ":" .. ports .. interfacestring .. ")") ++ end ++ s.template = "diag/smapsection" ++ else ++ if (mini) then ++ s = devmap:section(luci.cbi.Table, netdevs, luci.i18n.translate("Devices discovered for") .. " " .. curnet) ++ else ++ local interfacestring = "" ++ if ( interface ~= "" ) then ++ interfacestring = ", " .. interface ++ end ++ s = devmap:section(luci.cbi.Table, netdevs, luci.i18n.translate("Devices discovered for") .. " " .. curnet .. " (" .. subnet .. interfacestring .. ")") ++ end ++ end ++ s:option(DummyValue, "ip", translate("IP Address")) ++ if (not mini) then ++ s:option(DummyValue, "mac", translate("MAC Address")) ++ end ++ s:option(DummyValue, "vendor", translate("Vendor")) ++ s:option(DummyValue, "type", translate("Device Type")) ++ if (not mini) then ++ s:option(DummyValue, "model", translate("Model")) ++ end ++ if (haslink) then ++ s:option(DummyValue, "config_page", translate("Link to Device")) ++ end ++ if (debug) then ++ s:option(DummyValue, "raw", translate("Raw")) ++ end ++ curnet = next(outnets, curnet) ++ end ++end ++ ++function get_network_device(interface) ++ local state = luci.model.uci.cursor_state() ++ state:load("network") ++ local dev ++ ++ return state:get("network", interface, "ifname") ++end ++ ++ ++function cbi_add_networks(field) ++ uci.cursor():foreach("network", "interface", ++ function (section) ++ if section[".name"] ~= "loopback" then ++ field:value(section[".name"]) ++ end ++ end ++ ) ++ field.titleref = luci.dispatcher.build_url("admin", "network", "network") ++end ++ ++function config_devinfo_scan(map, scannet) ++ local o ++ o = scannet:option(luci.cbi.Flag, "enable", translate("Enable")) ++ o.optional = false ++ o.rmempty = false ++ ++ o = scannet:option(luci.cbi.Value, "interface", translate("Interface")) ++ o.optional = false ++ luci.controller.luci_diag.devinfo_common.cbi_add_networks(o) ++ ++ local scansubnet ++ scansubnet = scannet:option(luci.cbi.Value, "subnet", translate("Subnet")) ++ scansubnet.optional = false ++ ++ o = scannet:option(luci.cbi.Value, "timeout", translate("Timeout"), translate("Time to wait for responses in seconds (default 10)")) ++ o.optional = true ++ ++ o = scannet:option(luci.cbi.Value, "repeat_count", translate("Repeat Count"), translate("Number of times to send requests (default 1)")) ++ o.optional = true ++ ++ o = scannet:option(luci.cbi.Value, "sleepreq", translate("Sleep Between Requests"), translate("Milliseconds to sleep between requests (default 100)")) ++ o.optional = true ++end +diff --git a/feeds/luci/applications/luci-app-diag-devinfo/luasrc/controller/luci_diag/luci_diag_devinfo.lua b/feeds/luci/applications/luci-app-diag-devinfo/luasrc/controller/luci_diag/luci_diag_devinfo.lua +new file mode 100644 +index 0000000..ebba03f +--- /dev/null ++++ b/feeds/luci/applications/luci-app-diag-devinfo/luasrc/controller/luci_diag/luci_diag_devinfo.lua +@@ -0,0 +1,46 @@ ++-- Copyright 2009 Daniel Dickinson ++-- Licensed to the public under the Apache License 2.0. ++ ++module("luci.controller.luci_diag.luci_diag_devinfo", package.seeall) ++ ++function index() ++ local e ++ ++ e = entry({"admin", "voice", "diag", "phones"}, arcombine(cbi("luci_diag/smap_devinfo"), cbi("luci_diag/smap_devinfo_config")), _("Phones"), 10) ++ e.leaf = true ++ e.subindex = true ++ e.dependent = true ++ ++ e = entry({"admin", "voice", "diag", "phones", "config"}, cbi("luci_diag/smap_devinfo_config"), _("Configure"), 10) ++ ++ e = entry({"admin", "status", "smap_devinfo"}, cbi("luci_diag/smap_devinfo"), _("SIP Devices on Network"), 120) ++ e.leaf = true ++ e.dependent = true ++ ++ e = entry({"admin", "network", "diag_config", "netdiscover_devinfo_config"}, cbi("luci_diag/netdiscover_devinfo_config"), _("Network Device Scan"), 100) ++ e.leaf = true ++ e.dependent = true ++ ++ e = entry({"admin", "network", "diag_config", "smap_devinfo_config"}, cbi("luci_diag/smap_devinfo_config"), _("SIP Device Scan")) ++ e.leaf = true ++ e.dependent = true ++ ++ e = entry({"admin", "status", "netdiscover_devinfo"}, cbi("luci_diag/netdiscover_devinfo"), _("Devices on Network"), 90) ++ e.dependent = true ++ ++ e = entry({"admin", "network", "mactodevinfo"}, cbi("luci_diag/mactodevinfo"), _("MAC Device Info Overrides"), 190) ++ e.dependent = true ++ ++ e = entry({"mini", "diag", "phone_scan"}, cbi("luci_diag/smap_devinfo_mini"), _("Phone Scan"), 100) ++ e.dependent = true ++ ++ e = entry({"mini", "voice", "phones", "phone_scan_config"}, cbi("luci_diag/smap_devinfo_config_mini"), _("Config Phone Scan"), 90) ++ e.dependent = true ++ ++ e = entry({"mini", "diag", "netdiscover_devinfo"}, cbi("luci_diag/netdiscover_devinfo_mini"), _("Network Device Scan"), 10) ++ e.dependent = true ++ ++ e = entry({"mini", "network", "netdiscover_devinfo_config"}, cbi("luci_diag/netdiscover_devinfo_config_mini"), _("Device Scan Config")) ++ e.dependent = true ++ ++end +diff --git a/feeds/luci/applications/luci-app-diag-devinfo/luasrc/controller/luci_diag/netdiscover_common.lua b/feeds/luci/applications/luci-app-diag-devinfo/luasrc/controller/luci_diag/netdiscover_common.lua +new file mode 100644 +index 0000000..2e879a6 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-diag-devinfo/luasrc/controller/luci_diag/netdiscover_common.lua +@@ -0,0 +1,91 @@ ++-- Copyright 2009 Daniel Dickinson ++-- Licensed to the public under the Apache License 2.0. ++ ++module("luci.controller.luci_diag.netdiscover_common", package.seeall) ++ ++require("luci.i18n") ++require("luci.util") ++require("luci.sys") ++require("luci.cbi") ++require("luci.model.uci") ++ ++local translate = luci.i18n.translate ++local DummyValue = luci.cbi.DummyValue ++local SimpleSection = luci.cbi.SimpleSection ++ ++function index() ++ return -- no-op ++end ++ ++function get_params() ++ ++ local netdiscover_uci = luci.model.uci.cursor() ++ netdiscover_uci:load("luci_devinfo") ++ local nettable = netdiscover_uci:get_all("luci_devinfo") ++ ++ local i ++ local subnet ++ local netdout ++ ++ local outnets = {} ++ ++ i = next(nettable, nil) ++ ++ while (i) do ++ if (netdiscover_uci:get("luci_devinfo", i) == "netdiscover_scannet") then ++ local scannet = netdiscover_uci:get_all("luci_devinfo", i) ++ if scannet["subnet"] and (scannet["subnet"] ~= "") and scannet["enable"] and ( scannet["enable"] == "1") then ++ local output = "" ++ local outrow = {} ++ outrow["interface"] = scannet["interface"] ++ outrow["timeout"] = 10 ++ local timeout = tonumber(scannet["timeout"]) ++ if timeout and ( timeout > 0 ) then ++ outrow["timeout"] = scannet["timeout"] ++ end ++ ++ outrow["repeat_count"] = 1 ++ local repcount = tonumber(scannet["repeat_count"]) ++ if repcount and ( repcount > 0 ) then ++ outrow["repeat_count"] = scannet["repeat_count"] ++ end ++ ++ outrow["sleepreq"] = 100 ++ local repcount = tonumber(scannet["sleepreq"]) ++ if repcount and ( repcount > 0 ) then ++ outrow["sleepreq"] = scannet["sleepreq"] ++ end ++ ++ outrow["subnet"] = scannet["subnet"] ++ outrow["output"] = output ++ outnets[i] = outrow ++ end ++ end ++ i = next(nettable, i) ++ end ++ return outnets ++end ++ ++function command_function(outnets, i) ++ local interface = luci.controller.luci_diag.devinfo_common.get_network_device(outnets[i]["interface"]) ++ ++ return "/usr/bin/netdiscover-to-devinfo " .. outnets[i]["subnet"] .. " " .. interface .. " " .. outnets[i]["timeout"] .. " -r " .. outnets[i]["repeat_count"] .. " -s " .. outnets[i]["sleepreq"] .. " 0 ) then ++ outrow["timeout"] = scannet["timeout"] ++ end ++ ++ outrow["repeat_count"] = 1 ++ local repcount = tonumber(scannet["repeat_count"]) ++ if repcount and ( repcount > 0 ) then ++ outrow["repeat_count"] = scannet["repeat_count"] ++ end ++ ++ outrow["sleepreq"] = 100 ++ local repcount = tonumber(scannet["sleepreq"]) ++ if repcount and ( repcount > 0 ) then ++ outrow["sleepreq"] = scannet["sleepreq"] ++ end ++ ++ if scannet["interface"] and ( scannet["interface"] ~= "" ) then ++ outrow["interface"] = scannet["interface"] ++ else ++ outrow["interface"] = "" ++ end ++ ++ outrow["ports"] = ports ++ outrow["output"] = output ++ outnets[i] = outrow ++ end ++ end ++ i = next(nettable, i) ++ end ++ return outnets ++end ++ ++function command_function(outnets, i) ++ ++ local interface = luci.controller.luci_diag.devinfo_common.get_network_device(outnets[i]["interface"]) ++ ++ return "/usr/bin/netsmap-to-devinfo -r " .. outnets[i]["subnet"] .. " -t " .. outnets[i]["timeout"] .. " -i " .. interface .. " -x -p " .. outnets[i]["ports"] .. " -c " .. outnets[i]["repeat_count"] .. " -s " .. outnets[i]["sleepreq"] .. " ++ ++<%- ++local rowcnt = 1 ++function rowstyle() ++ rowcnt = rowcnt + 1 ++ return (rowcnt % 2) + 1 ++end ++-%> ++ ++ ++
    ++ <% if self.title and #self.title > 0 then -%> ++ <%=self.title%> ++ <%- end %> ++
    <%=self.description%>
    ++
    ++ <%- local count = 0 -%> ++ ++ ++ <%- if not self.anonymous then -%> ++ <%- if self.sectionhead then -%> ++ ++ <%- else -%> ++ ++ <%- end -%> ++ <%- end -%> ++ <%- for i, k in pairs(self.children) do if not k.optional then -%> ++ ++ <%- count = count + 1; end; end; if self.extedit or self.addremove then -%> ++ ++ <%- count = count + 1; end -%> ++ ++ ++ <%- if not self.anonymous then -%> ++ <%- if self.sectiondesc then -%> ++ ++ <%- else -%> ++ ++ <%- end -%> ++ <%- end -%> ++ <%- for i, k in pairs(self.children) do if not k.optional then -%> ++ ++ <%- end; end; if self.extedit or self.addremove then -%> ++ ++ <%- end -%> ++ ++ <%- local isempty = true ++ for i, k in ipairs(self:cfgsections()) do ++ section = k ++ isempty = false ++ scope = { valueheader = "cbi/cell_valueheader", valuefooter = "cbi/cell_valuefooter" } ++ -%> ++ ++ <% if not self.anonymous then -%> ++ ++ <%- end %> ++ ++ <%- for k, node in ipairs(self.children) do -%> ++ <%- if not node.optional then -%> ++ <%- nodevalue = node:cfgvalue(section) -%> ++ <%- if nodevalue and ( nodevalue ~= "" ) and string.find(nodevalue, 'http://', 1, plain) then ++ node.href = nodevalue ++ node.template = "diag/smapvalue" ++ end ++ -%> ++ <%- node:render(section, scope or {}) -%> ++ <%- end -%> ++ <%- end -%> ++ ++ <%- if self.extedit or self.addremove then -%> ++ ++ <%- end -%> ++ ++ <%- end -%> ++ ++ <%- if isempty then -%> ++ ++ ++ ++ <%- end -%> ++
    <%=self.sectionhead%>  ++ <%- if k.titleref then -%><%- end -%> ++ <%-=k.title-%> ++ <%- if k.titleref then -%><%- end -%> ++  
    <%=self.sectiondesc%><%=k.description%>

    <%=k%>

    ++ <%- if self.extedit then -%> ++ ++ <%=self.extedit:format(section)%> ++ <%- elseif type(self.extedit) == "function" then -%> ++ <%=self:extedit(section)%> ++ <%- end -%> ++ " title="<%:Edit%>"><%:Edit%> ++ <%- end; if self.addremove then %> ++ ++ <%- end -%> ++

    <%:This section contains no values yet%>
    ++ ++ <% if self.error then %> ++
    ++
      <% for _, c in pairs(self.error) do for _, e in ipairs(c) do -%> ++
    • <%=luci.util.pcdata(e):gsub("\n","
      ")%>
    • ++ <%- end end %>
    ++
    ++ <% end %> ++ ++ <%- if self.addremove then -%> ++ <% if self.template_addremove then include(self.template_addremove) else -%> ++
    ++ <% if self.anonymous then %> ++ ++ <% else %> ++ <% if self.invalid_cts then -%>
    <% end %> ++ ++ ++ <% if self.invalid_cts then -%> ++
    <%:Invalid%>
    ++ <%- end %> ++ <% end %> ++
    ++ <%- end %> ++ <%- end -%> ++
    ++
    ++ +diff --git a/feeds/luci/applications/luci-app-diag-devinfo/luasrc/view/diag/smapvalue.htm b/feeds/luci/applications/luci-app-diag-devinfo/luasrc/view/diag/smapvalue.htm +new file mode 100644 +index 0000000..278985c +--- /dev/null ++++ b/feeds/luci/applications/luci-app-diag-devinfo/luasrc/view/diag/smapvalue.htm +@@ -0,0 +1,12 @@ ++<%# ++ Copyright 2009 Daniel Dickinson ++ Licensed to the public under the Apache License 2.0. ++-%> ++ ++<%+cbi/valueheader%> ++<% if self.href then %><% end -%> ++ <%=luci.util.pcdata(self:cfgvalue(section))%> ++<%- if self.href then %><%end%> ++  ++ ++<%+cbi/valuefooter%> +diff --git a/feeds/luci/applications/luci-app-diag-devinfo/po/ca/diag_devinfo.po b/feeds/luci/applications/luci-app-diag-devinfo/po/ca/diag_devinfo.po +new file mode 100644 +index 0000000..9739a4b +--- /dev/null ++++ b/feeds/luci/applications/luci-app-diag-devinfo/po/ca/diag_devinfo.po +@@ -0,0 +1,209 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"PO-Revision-Date: 2014-06-02 05:29+0200\n" ++"Last-Translator: Alex \n" ++"Language-Team: none\n" ++"Language: ca\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n != 1);\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "Actions" ++msgstr "Accions" ++ ++msgid "Add" ++msgstr "Afegeix" ++ ++msgid "Beginning of MAC address range" ++msgstr "" ++ ++msgid "Config Phone Scan" ++msgstr "" ++ ++msgid "Configure" ++msgstr "Configura" ++ ++msgid "Configure Scans" ++msgstr "" ++ ++msgid "" ++"Configure scanning for devices on specified networks. Decreasing 'Timeout', " ++"'Repeat Count', and/or 'Sleep Between Requests' may speed up scans, but also " ++"may fail to find some devices." ++msgstr "" ++ ++msgid "" ++"Configure scanning for supported SIP devices on specified networks. " ++"Decreasing 'Timeout', 'Repeat Count', and/or 'Sleep Between Requests' may " ++"speed up scans, but also may fail to find some devices." ++msgstr "" ++ ++msgid "Delete" ++msgstr "Suprimeix" ++ ++msgid "Device Scan Config" ++msgstr "" ++ ++msgid "Device Type" ++msgstr "" ++ ++msgid "Devices discovered for" ++msgstr "Devices discovered for" ++ ++msgid "Devices on Network" ++msgstr "" ++ ++msgid "Edit" ++msgstr "Edita" ++ ++msgid "Enable" ++msgstr "Habilita" ++ ++msgid "End of MAC address range" ++msgstr "" ++ ++msgid "Go to relevant configuration page" ++msgstr "" ++ ++msgid "IP Address" ++msgstr "Adreça IP" ++ ++msgid "Interface" ++msgstr "" ++ ++msgid "Invalid" ++msgstr "" ++ ++msgid "Link to Device" ++msgstr "" ++ ++msgid "MAC Address" ++msgstr "" ++ ++msgid "MAC Device Info Overrides" ++msgstr "" ++ ++msgid "MAC Device Override" ++msgstr "" ++ ++msgid "MAC range and information used to override system and IEEE databases" ++msgstr "" ++ ++msgid "Milliseconds to sleep between requests (default 100)" ++msgstr "" ++ ++msgid "Model" ++msgstr "Model" ++ ++msgid "Name" ++msgstr "Nom" ++ ++msgid "Network Device Scan" ++msgstr "" ++ ++msgid "Network Device Scanning Configuration" ++msgstr "" ++ ++msgid "Networks to scan for devices" ++msgstr "" ++ ++msgid "Networks to scan for supported devices" ++msgstr "" ++ ++msgid "No SIP devices" ++msgstr "Cap dispositiu SIP" ++ ++msgid "No devices detected" ++msgstr "Cap dispositiu detectat" ++ ++msgid "Number of times to send requests (default 1)" ++msgstr "" ++ ++msgid "OUI Owner" ++msgstr "Propietari OUI" ++ ++msgid "" ++"Override the information returned by the MAC to Device Info Script (mac-to-" ++"devinfo) for a specified range of MAC Addresses" ++msgstr "" ++ ++msgid "Perform Scans (this can take a few minutes)" ++msgstr "" ++ ++msgid "Phone Information" ++msgstr "Informació de telèfon" ++ ++msgid "Phone Scan" ++msgstr "" ++ ++msgid "Phone Scanning Configuration" ++msgstr "" ++ ++msgid "Phones" ++msgstr "Telèfons" ++ ++msgid "Ports" ++msgstr "Ports" ++ ++msgid "Raw" ++msgstr "" ++ ++msgid "Repeat Count" ++msgstr "" ++ ++msgid "Repeat Scans (this can take a few minutes)" ++msgstr "" ++ ++msgid "SIP Device Information" ++msgstr "" ++ ++msgid "SIP Device Scan" ++msgstr "" ++ ++msgid "SIP Device Scanning Configuration" ++msgstr "" ++ ++msgid "SIP Devices on Network" ++msgstr "" ++ ++msgid "SIP devices discovered for" ++msgstr "" ++ ++msgid "Scan for devices on specified networks." ++msgstr "" ++ ++msgid "Scan for supported SIP devices on specified networks." ++msgstr "" ++ ++msgid "Scanning Configuration" ++msgstr "" ++ ++msgid "Scans for devices on specified networks." ++msgstr "" ++ ++msgid "Sleep Between Requests" ++msgstr "" ++ ++msgid "Subnet" ++msgstr "Subxarxa" ++ ++msgid "This section contains no values yet" ++msgstr "Esta secció encara no conté valors" ++ ++msgid "Time to wait for responses in seconds (default 10)" ++msgstr "" ++ ++msgid "Timeout" ++msgstr "Temps d'espera" ++ ++msgid "Use Configuration" ++msgstr "" ++ ++msgid "Vendor" ++msgstr "Venedor" ++ ++msgid "check other networks" ++msgstr "" +diff --git a/feeds/luci/applications/luci-app-diag-devinfo/po/cs/diag_devinfo.po b/feeds/luci/applications/luci-app-diag-devinfo/po/cs/diag_devinfo.po +new file mode 100644 +index 0000000..73fe67e +--- /dev/null ++++ b/feeds/luci/applications/luci-app-diag-devinfo/po/cs/diag_devinfo.po +@@ -0,0 +1,209 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"PO-Revision-Date: 2014-07-11 19:32+0200\n" ++"Last-Translator: koli \n" ++"Language-Team: none\n" ++"Language: cs\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "Actions" ++msgstr "Akce" ++ ++msgid "Add" ++msgstr "PÅ™idat" ++ ++msgid "Beginning of MAC address range" ++msgstr "ZaÄátek rozsahu MAC adres" ++ ++msgid "Config Phone Scan" ++msgstr "" ++ ++msgid "Configure" ++msgstr "Konfigurace" ++ ++msgid "Configure Scans" ++msgstr "Konfigurace skenů" ++ ++msgid "" ++"Configure scanning for devices on specified networks. Decreasing 'Timeout', " ++"'Repeat Count', and/or 'Sleep Between Requests' may speed up scans, but also " ++"may fail to find some devices." ++msgstr "" ++ ++msgid "" ++"Configure scanning for supported SIP devices on specified networks. " ++"Decreasing 'Timeout', 'Repeat Count', and/or 'Sleep Between Requests' may " ++"speed up scans, but also may fail to find some devices." ++msgstr "" ++ ++msgid "Delete" ++msgstr "Odstranit" ++ ++msgid "Device Scan Config" ++msgstr "" ++ ++msgid "Device Type" ++msgstr "Typ zařízení" ++ ++msgid "Devices discovered for" ++msgstr "Devices discovered for" ++ ++msgid "Devices on Network" ++msgstr "Zařízení na síti" ++ ++msgid "Edit" ++msgstr "Upravit" ++ ++msgid "Enable" ++msgstr "Povolit" ++ ++msgid "End of MAC address range" ++msgstr "Konec rozsahu MAC adres" ++ ++msgid "Go to relevant configuration page" ++msgstr "PÅ™ejít na přísluÅ¡nou konfiguraÄní stránku" ++ ++msgid "IP Address" ++msgstr "IP adresa" ++ ++msgid "Interface" ++msgstr "Rozhraní" ++ ++msgid "Invalid" ++msgstr "Neplatný" ++ ++msgid "Link to Device" ++msgstr "Odkaz na zařízení" ++ ++msgid "MAC Address" ++msgstr "MAC adresa" ++ ++msgid "MAC Device Info Overrides" ++msgstr "" ++ ++msgid "MAC Device Override" ++msgstr "" ++ ++msgid "MAC range and information used to override system and IEEE databases" ++msgstr "" ++ ++msgid "Milliseconds to sleep between requests (default 100)" ++msgstr "Jak dlouho spát mezi požadavky (milisekundy, výchozí 100)" ++ ++msgid "Model" ++msgstr "Model" ++ ++msgid "Name" ++msgstr "Jméno" ++ ++msgid "Network Device Scan" ++msgstr "Vyhledání síťových zařízení" ++ ++msgid "Network Device Scanning Configuration" ++msgstr "" ++ ++msgid "Networks to scan for devices" ++msgstr "" ++ ++msgid "Networks to scan for supported devices" ++msgstr "" ++ ++msgid "No SIP devices" ++msgstr "Žádná zařízení SIP" ++ ++msgid "No devices detected" ++msgstr "Nebyla detekována žádná zařízení" ++ ++msgid "Number of times to send requests (default 1)" ++msgstr "Kolikrát odeslat požadavek (standardnÄ› 1)" ++ ++msgid "OUI Owner" ++msgstr "Vlastník OUI" ++ ++msgid "" ++"Override the information returned by the MAC to Device Info Script (mac-to-" ++"devinfo) for a specified range of MAC Addresses" ++msgstr "" ++ ++msgid "Perform Scans (this can take a few minutes)" ++msgstr "Provést skenování (může trvat nÄ›kolik minut)" ++ ++msgid "Phone Information" ++msgstr "Informace o telefonu" ++ ++msgid "Phone Scan" ++msgstr "Vyhledání telefonů" ++ ++msgid "Phone Scanning Configuration" ++msgstr "" ++ ++msgid "Phones" ++msgstr "Telefony" ++ ++msgid "Ports" ++msgstr "Porty" ++ ++msgid "Raw" ++msgstr "" ++ ++msgid "Repeat Count" ++msgstr "PoÄet opakování" ++ ++msgid "Repeat Scans (this can take a few minutes)" ++msgstr "Opakování skenování (může trvat nÄ›kolik minut)" ++ ++msgid "SIP Device Information" ++msgstr "Informace o zařízení SIP" ++ ++msgid "SIP Device Scan" ++msgstr "Skenování SIP zařízení" ++ ++msgid "SIP Device Scanning Configuration" ++msgstr "Konfigurace skenování SIP zařízení" ++ ++msgid "SIP Devices on Network" ++msgstr "Zařízení SIP na síti" ++ ++msgid "SIP devices discovered for" ++msgstr "" ++ ++msgid "Scan for devices on specified networks." ++msgstr "Hledat zařízení na zadané síti" ++ ++msgid "Scan for supported SIP devices on specified networks." ++msgstr "" ++ ++msgid "Scanning Configuration" ++msgstr "Nastavení skenování" ++ ++msgid "Scans for devices on specified networks." ++msgstr "" ++ ++msgid "Sleep Between Requests" ++msgstr "Uspat mezi jednotlivými požadavky" ++ ++msgid "Subnet" ++msgstr "Podsíť" ++ ++msgid "This section contains no values yet" ++msgstr "Tato sekce zatím neobsahuje žádné hodnoty" ++ ++msgid "Time to wait for responses in seconds (default 10)" ++msgstr "Doba Äekání na odpovÄ›di v sekundách (výchozí 10)" ++ ++msgid "Timeout" ++msgstr "ÄŒasový limit" ++ ++msgid "Use Configuration" ++msgstr "Použít nastavení" ++ ++msgid "Vendor" ++msgstr "Prodejce" ++ ++msgid "check other networks" ++msgstr "zkontrolovat ostatní sítÄ›" +diff --git a/feeds/luci/applications/luci-app-diag-devinfo/po/de/diag_devinfo.po b/feeds/luci/applications/luci-app-diag-devinfo/po/de/diag_devinfo.po +new file mode 100644 +index 0000000..2401ece +--- /dev/null ++++ b/feeds/luci/applications/luci-app-diag-devinfo/po/de/diag_devinfo.po +@@ -0,0 +1,221 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"PO-Revision-Date: 2012-08-10 02:08+0200\n" ++"Last-Translator: Jo-Philipp \n" ++"Language-Team: none\n" ++"Language: de\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n != 1);\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "Actions" ++msgstr "Aktionen" ++ ++msgid "Add" ++msgstr "Hinzufügen" ++ ++msgid "Beginning of MAC address range" ++msgstr "Beginn des MAC-Adress-Bereiches" ++ ++msgid "Config Phone Scan" ++msgstr "Telefonsuche konfigurieren" ++ ++msgid "Configure" ++msgstr "Konfigurieren" ++ ++msgid "Configure Scans" ++msgstr "Suche konfigurieren" ++ ++msgid "" ++"Configure scanning for devices on specified networks. Decreasing 'Timeout', " ++"'Repeat Count', and/or 'Sleep Between Requests' may speed up scans, but also " ++"may fail to find some devices." ++msgstr "" ++"Konfiguriere Suche für Geräte in gewählten Netzwerken. Das Verringern von " ++"'Zeitüberschreitung', 'Wiederholungszähler' und/oder 'Pause zwischen " ++"Anfragen' kann die Geschwindigkeit der Suche erhöhen, aber auch das Finden " ++"einzelner Geräte verhindern." ++ ++msgid "" ++"Configure scanning for supported SIP devices on specified networks. " ++"Decreasing 'Timeout', 'Repeat Count', and/or 'Sleep Between Requests' may " ++"speed up scans, but also may fail to find some devices." ++msgstr "" ++"Konfiguriere Suche für SIP-Gerätein gewählten Netzwerken. Das Verringern von " ++"'Zeitüberschreitung', 'Wiederholungszähler' und/oder 'Pause zwischen " ++"Anfragen' kann die Geschwindigkeit der Suche erhöhen, aber auch das Finden " ++"einzelner Geräte verhindern." ++ ++msgid "Delete" ++msgstr "Löschen" ++ ++msgid "Device Scan Config" ++msgstr "Gerätesuche konfigurieren" ++ ++msgid "Device Type" ++msgstr "Geräte-Typ" ++ ++msgid "Devices discovered for" ++msgstr "Geräte gefunden für" ++ ++msgid "Devices on Network" ++msgstr "Geräte im Netzwerk" ++ ++msgid "Edit" ++msgstr "Bearbeiten" ++ ++msgid "Enable" ++msgstr "Aktivieren" ++ ++msgid "End of MAC address range" ++msgstr "Ende des MAC-Adress-Bereiches" ++ ++msgid "Go to relevant configuration page" ++msgstr "Gehe zu entsprechender Konfigurations-Seite" ++ ++msgid "IP Address" ++msgstr "IP-Adresse" ++ ++msgid "Interface" ++msgstr "Schnittstelle" ++ ++msgid "Invalid" ++msgstr "Ungültig" ++ ++msgid "Link to Device" ++msgstr "Verknüpfung zu Gerät" ++ ++msgid "MAC Address" ++msgstr "MAC-Adresse" ++ ++msgid "MAC Device Info Overrides" ++msgstr "Benutzerdefinierte MAC-zu-Gerät-Benennungen" ++ ++msgid "MAC Device Override" ++msgstr "Benutzerdefinierte MAC-zu-Gerät-Benennung" ++ ++msgid "MAC range and information used to override system and IEEE databases" ++msgstr "" ++"MAC-Adressbereich und Benennungen um die Informationen der System- und IEEE-" ++"Datenbanken zu überschreiben" ++ ++msgid "Milliseconds to sleep between requests (default 100)" ++msgstr "Wartezeit zwischen den Anfragen in Millisekunden (Standard 100)" ++ ++msgid "Model" ++msgstr "Modell" ++ ++msgid "Name" ++msgstr "Name" ++ ++msgid "Network Device Scan" ++msgstr "Netzwerkgerätesuche" ++ ++msgid "Network Device Scanning Configuration" ++msgstr "Konfiguration der Netzwerkgerätesuche" ++ ++msgid "Networks to scan for devices" ++msgstr "Zu durchsuchende Netzwerke" ++ ++msgid "Networks to scan for supported devices" ++msgstr "Nach unterstützten Geräten zu durchsuchende Netzwerke" ++ ++msgid "No SIP devices" ++msgstr "keine SIP-Geräte" ++ ++msgid "No devices detected" ++msgstr "keine Geräte gefunden" ++ ++msgid "Number of times to send requests (default 1)" ++msgstr "Anzahl der Versuche Anfragen zu senden (Standard 1)" ++ ++msgid "OUI Owner" ++msgstr "OUI-Organisation" ++ ++msgid "" ++"Override the information returned by the MAC to Device Info Script (mac-to-" ++"devinfo) for a specified range of MAC Addresses" ++msgstr "" ++"Ãœberschreibt die Informationen die durch das MAC-zu-Gerätename-Programm (mac-" ++"to-devinfo) für einen bestimmten MAC-Adressbereich zurückgegeben werden" ++ ++msgid "Perform Scans (this can take a few minutes)" ++msgstr "Führe Suche aus (Dies kann einige Minuten dauern)" ++ ++msgid "Phone Information" ++msgstr "Informationen zum Telefon" ++ ++msgid "Phone Scan" ++msgstr "Telefonsuche" ++ ++msgid "Phone Scanning Configuration" ++msgstr "Konfiguration der Telefonsuche" ++ ++msgid "Phones" ++msgstr "Telefone" ++ ++msgid "Ports" ++msgstr "Ports" ++ ++msgid "Raw" ++msgstr "Rohdaten" ++ ++msgid "Repeat Count" ++msgstr "Wiederholungsanzahl" ++ ++msgid "Repeat Scans (this can take a few minutes)" ++msgstr "Wiederhole Suche (Dies kann einige Minuten dauern)" ++ ++msgid "SIP Device Information" ++msgstr "SIP-Geräteinformationen" ++ ++msgid "SIP Device Scan" ++msgstr "SIP-Gerätesuche" ++ ++msgid "SIP Device Scanning Configuration" ++msgstr "Konfiguration der SIP-Gerätesuche" ++ ++msgid "SIP Devices on Network" ++msgstr "SIP-Geräte im Netzwerk" ++ ++msgid "SIP devices discovered for" ++msgstr "SIP-Geräte entdeckt für" ++ ++msgid "Scan for devices on specified networks." ++msgstr "Suche nach Geräten im spezifizierten Netzwerk" ++ ++msgid "Scan for supported SIP devices on specified networks." ++msgstr "Suche nach SIP-unterstützenden Geräten im spezifizierten Netzwerk" ++ ++msgid "Scanning Configuration" ++msgstr "Such-Konfiguration" ++ ++msgid "Scans for devices on specified networks." ++msgstr "Scans for devices on specified networks." ++ ++msgid "Sleep Between Requests" ++msgstr "Wartezeit zwischen den Versuchen" ++ ++msgid "Subnet" ++msgstr "Subnetz" ++ ++msgid "This section contains no values yet" ++msgstr "Dieser Abschnitt enthält noch keine Werte" ++ ++msgid "Time to wait for responses in seconds (default 10)" ++msgstr "Antwortwartezeit in Sekunden (Standard: 10)" ++ ++msgid "Timeout" ++msgstr "Zeitüberschreitung" ++ ++msgid "Use Configuration" ++msgstr "Verwende Konfiguration" ++ ++msgid "Vendor" ++msgstr "Hersteller" ++ ++msgid "check other networks" ++msgstr "Prüfe andere Netzwerke" +diff --git a/feeds/luci/applications/luci-app-diag-devinfo/po/el/diag_devinfo.po b/feeds/luci/applications/luci-app-diag-devinfo/po/el/diag_devinfo.po +new file mode 100644 +index 0000000..7a247cb +--- /dev/null ++++ b/feeds/luci/applications/luci-app-diag-devinfo/po/el/diag_devinfo.po +@@ -0,0 +1,209 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"PO-Revision-Date: 2012-03-19 15:30+0200\n" ++"Last-Translator: Vasilis \n" ++"Language-Team: none\n" ++"Language: el\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n != 1);\n" ++"X-Generator: Pootle 2.0.4\n" ++ ++msgid "Actions" ++msgstr "" ++ ++msgid "Add" ++msgstr "ΠÏοσθήκη" ++ ++msgid "Beginning of MAC address range" ++msgstr "ΑÏχή εÏÏους διευθÏνσεων MAC" ++ ++msgid "Config Phone Scan" ++msgstr "ΡÏθμιση ΣάÏωσης Τηλεφώνων" ++ ++msgid "Configure" ++msgstr "ΠαÏαμετÏοποίηση" ++ ++msgid "Configure Scans" ++msgstr "" ++ ++msgid "" ++"Configure scanning for devices on specified networks. Decreasing 'Timeout', " ++"'Repeat Count', and/or 'Sleep Between Requests' may speed up scans, but also " ++"may fail to find some devices." ++msgstr "" ++ ++msgid "" ++"Configure scanning for supported SIP devices on specified networks. " ++"Decreasing 'Timeout', 'Repeat Count', and/or 'Sleep Between Requests' may " ++"speed up scans, but also may fail to find some devices." ++msgstr "" ++ ++msgid "Delete" ++msgstr "ΔιαγÏαφή" ++ ++msgid "Device Scan Config" ++msgstr "ΡÏθμιση ΣάÏωσης Συσκευών" ++ ++msgid "Device Type" ++msgstr "" ++ ++msgid "Devices discovered for" ++msgstr "Devices discovered for" ++ ++msgid "Devices on Network" ++msgstr "Συσκευές στο Δίκτυο" ++ ++msgid "Edit" ++msgstr "ΕπεξεÏγασία" ++ ++msgid "Enable" ++msgstr "ΕνεÏγοποίηση" ++ ++msgid "End of MAC address range" ++msgstr "Τέλος εÏÏους διευθÏνσεων MAC" ++ ++msgid "Go to relevant configuration page" ++msgstr "" ++ ++msgid "IP Address" ++msgstr "ΔιεÏθυνση IP" ++ ++msgid "Interface" ++msgstr "Διεπαφή" ++ ++msgid "Invalid" ++msgstr "Μη έγκυÏο" ++ ++msgid "Link to Device" ++msgstr "ΖεÏξη με Συσκευή" ++ ++msgid "MAC Address" ++msgstr "ΔιεÏθυνση MAC" ++ ++msgid "MAC Device Info Overrides" ++msgstr "" ++ ++msgid "MAC Device Override" ++msgstr "" ++ ++msgid "MAC range and information used to override system and IEEE databases" ++msgstr "" ++ ++msgid "Milliseconds to sleep between requests (default 100)" ++msgstr "" ++ ++msgid "Model" ++msgstr "" ++ ++msgid "Name" ++msgstr "Όνομα" ++ ++msgid "Network Device Scan" ++msgstr "" ++ ++msgid "Network Device Scanning Configuration" ++msgstr "" ++ ++msgid "Networks to scan for devices" ++msgstr "" ++ ++msgid "Networks to scan for supported devices" ++msgstr "" ++ ++msgid "No SIP devices" ++msgstr "Δεν υπάÏχουν συσκευές SIP" ++ ++msgid "No devices detected" ++msgstr "Δεν ανιχνεÏτηκαν συσκευές" ++ ++msgid "Number of times to send requests (default 1)" ++msgstr "" ++ ++msgid "OUI Owner" ++msgstr "Ιδιοκτήτης OUI" ++ ++msgid "" ++"Override the information returned by the MAC to Device Info Script (mac-to-" ++"devinfo) for a specified range of MAC Addresses" ++msgstr "" ++ ++msgid "Perform Scans (this can take a few minutes)" ++msgstr "" ++ ++msgid "Phone Information" ++msgstr "ΠληÏοφοÏίες Τηλεφώνου" ++ ++msgid "Phone Scan" ++msgstr "ΣάÏωση Τηλεφώνων" ++ ++msgid "Phone Scanning Configuration" ++msgstr "ΠαÏαμετÏοποίηση ΣάÏωσης Τηλεφώνων" ++ ++msgid "Phones" ++msgstr "Τηλέφωνα" ++ ++msgid "Ports" ++msgstr "" ++ ++msgid "Raw" ++msgstr "ΑνεπεξέÏγαστα" ++ ++msgid "Repeat Count" ++msgstr "Επανάληψη ΜέτÏησης" ++ ++msgid "Repeat Scans (this can take a few minutes)" ++msgstr "" ++ ++msgid "SIP Device Information" ++msgstr "ΠληÏοφοÏίες Συσκευής SIP" ++ ++msgid "SIP Device Scan" ++msgstr "ΣάÏωση για συσκευές SIP" ++ ++msgid "SIP Device Scanning Configuration" ++msgstr "ΠαÏαμετÏοποίηση ΣάÏωσης Συσκευών SIP" ++ ++msgid "SIP Devices on Network" ++msgstr "Συσκευές SIP στο Δίκτυο" ++ ++msgid "SIP devices discovered for" ++msgstr "" ++ ++msgid "Scan for devices on specified networks." ++msgstr "ΣάÏωση για συσκευές σε καθοÏισμένα δίκτυα." ++ ++msgid "Scan for supported SIP devices on specified networks." ++msgstr "" ++ ++msgid "Scanning Configuration" ++msgstr "" ++ ++msgid "Scans for devices on specified networks." ++msgstr "Scans for devices on specified networks." ++ ++msgid "Sleep Between Requests" ++msgstr "" ++ ++msgid "Subnet" ++msgstr "Υποδίκτυο" ++ ++msgid "This section contains no values yet" ++msgstr "" ++ ++msgid "Time to wait for responses in seconds (default 10)" ++msgstr "" ++ ++msgid "Timeout" ++msgstr "" ++ ++msgid "Use Configuration" ++msgstr "" ++ ++msgid "Vendor" ++msgstr "" ++ ++msgid "check other networks" ++msgstr "έλεγχος άλλων δικτÏων" +diff --git a/feeds/luci/applications/luci-app-diag-devinfo/po/en/diag_devinfo.po b/feeds/luci/applications/luci-app-diag-devinfo/po/en/diag_devinfo.po +new file mode 100644 +index 0000000..7adbbea +--- /dev/null ++++ b/feeds/luci/applications/luci-app-diag-devinfo/po/en/diag_devinfo.po +@@ -0,0 +1,213 @@ ++# Diagnostics (Device Info). ++# Copyright (C) 2009 Daniel Dickinson ++# Daniel Dickinson , 2009. ++# ++#, fuzzy ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"PO-Revision-Date: 2009-07-17 04:22-0400\n" ++"Last-Translator: FULL NAME \n" ++"Language-Team: LANGUAGE \n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++ ++msgid "Actions" ++msgstr "" ++ ++msgid "Add" ++msgstr "Add" ++ ++msgid "Beginning of MAC address range" ++msgstr "Beginning of MAC address range" ++ ++msgid "Config Phone Scan" ++msgstr "Config Phone Scan" ++ ++msgid "Configure" ++msgstr "Configure" ++ ++msgid "Configure Scans" ++msgstr "" ++ ++msgid "" ++"Configure scanning for devices on specified networks. Decreasing 'Timeout', " ++"'Repeat Count', and/or 'Sleep Between Requests' may speed up scans, but also " ++"may fail to find some devices." ++msgstr "" ++ ++msgid "" ++"Configure scanning for supported SIP devices on specified networks. " ++"Decreasing 'Timeout', 'Repeat Count', and/or 'Sleep Between Requests' may " ++"speed up scans, but also may fail to find some devices." ++msgstr "" ++ ++msgid "Delete" ++msgstr "Delete" ++ ++msgid "Device Scan Config" ++msgstr "Device Scan Config" ++ ++msgid "Device Type" ++msgstr "" ++ ++msgid "Devices discovered for" ++msgstr "" ++ ++msgid "Devices on Network" ++msgstr "Devices on Network" ++ ++msgid "Edit" ++msgstr "Edit" ++ ++msgid "Enable" ++msgstr "Enable" ++ ++msgid "End of MAC address range" ++msgstr "End of MAC address range" ++ ++msgid "Go to relevant configuration page" ++msgstr "" ++ ++msgid "IP Address" ++msgstr "IP Address" ++ ++msgid "Interface" ++msgstr "Interface" ++ ++msgid "Invalid" ++msgstr "Invalid" ++ ++msgid "Link to Device" ++msgstr "Link to Device" ++ ++msgid "MAC Address" ++msgstr "MAC Address" ++ ++msgid "MAC Device Info Overrides" ++msgstr "" ++ ++msgid "MAC Device Override" ++msgstr "MAC Device Override" ++ ++msgid "MAC range and information used to override system and IEEE databases" ++msgstr "MAC range and information used to override system and IEEE databases" ++ ++msgid "Milliseconds to sleep between requests (default 100)" ++msgstr "Milliseconds to sleep between requests (default 100)" ++ ++msgid "Model" ++msgstr "" ++ ++msgid "Name" ++msgstr "Name" ++ ++msgid "Network Device Scan" ++msgstr "" ++ ++msgid "Network Device Scanning Configuration" ++msgstr "" ++ ++msgid "Networks to scan for devices" ++msgstr "" ++ ++msgid "Networks to scan for supported devices" ++msgstr "" ++ ++msgid "No SIP devices" ++msgstr "No SIP devices" ++ ++msgid "No devices detected" ++msgstr "No devices detected" ++ ++msgid "Number of times to send requests (default 1)" ++msgstr "Number of times to send requests (default 1)" ++ ++msgid "OUI Owner" ++msgstr "OUI Owner" ++ ++msgid "" ++"Override the information returned by the MAC to Device Info Script (mac-to-" ++"devinfo) for a specified range of MAC Addresses" ++msgstr "" ++"Override the information returned by the MAC to Device Info Script (mac-to-" ++"devinfo) for a specified range of MAC Addresses" ++ ++msgid "Perform Scans (this can take a few minutes)" ++msgstr "" ++ ++msgid "Phone Information" ++msgstr "Phone Information" ++ ++msgid "Phone Scan" ++msgstr "Phone Scan" ++ ++msgid "Phone Scanning Configuration" ++msgstr "Phone Scanning Configuration" ++ ++msgid "Phones" ++msgstr "Phones" ++ ++msgid "Ports" ++msgstr "" ++ ++msgid "Raw" ++msgstr "Raw" ++ ++msgid "Repeat Count" ++msgstr "Repeat Count" ++ ++msgid "Repeat Scans (this can take a few minutes)" ++msgstr "" ++ ++msgid "SIP Device Information" ++msgstr "SIP Device Information" ++ ++msgid "SIP Device Scan" ++msgstr "SIP Device Scan" ++ ++msgid "SIP Device Scanning Configuration" ++msgstr "SIP Device Scanning Configuration" ++ ++msgid "SIP Devices on Network" ++msgstr "SIP Devices on Network" ++ ++msgid "SIP devices discovered for" ++msgstr "" ++ ++msgid "Scan for devices on specified networks." ++msgstr "Scan for devices on specified networks." ++ ++msgid "Scan for supported SIP devices on specified networks." ++msgstr "" ++ ++msgid "Scanning Configuration" ++msgstr "" ++ ++msgid "Scans for devices on specified networks." ++msgstr "Scans for devices on specified networks." ++ ++msgid "Sleep Between Requests" ++msgstr "Sleep Between Requests" ++ ++msgid "Subnet" ++msgstr "Subnet" ++ ++msgid "This section contains no values yet" ++msgstr "" ++ ++msgid "Time to wait for responses in seconds (default 10)" ++msgstr "Time to wait for responses in seconds (default 10)" ++ ++msgid "Timeout" ++msgstr "Timeout" ++ ++msgid "Use Configuration" ++msgstr "" ++ ++msgid "Vendor" ++msgstr "" ++ ++msgid "check other networks" ++msgstr "check other networks" +diff --git a/feeds/luci/applications/luci-app-diag-devinfo/po/es/diag_devinfo.po b/feeds/luci/applications/luci-app-diag-devinfo/po/es/diag_devinfo.po +new file mode 100644 +index 0000000..0b44ff3 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-diag-devinfo/po/es/diag_devinfo.po +@@ -0,0 +1,222 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"PO-Revision-Date: 2012-08-26 20:14+0200\n" ++"Last-Translator: José Vicente \n" ++"Language-Team: none\n" ++"Language: es\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n != 1);\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "Actions" ++msgstr "Acciones" ++ ++msgid "Add" ++msgstr "Añadir" ++ ++msgid "Beginning of MAC address range" ++msgstr "Inicio del rango de direcciones MAC" ++ ++msgid "Config Phone Scan" ++msgstr "Configurar escaneo de teléfono" ++ ++msgid "Configure" ++msgstr "Configurar" ++ ++msgid "Configure Scans" ++msgstr "Explorar configuraciones" ++ ++msgid "" ++"Configure scanning for devices on specified networks. Decreasing 'Timeout', " ++"'Repeat Count', and/or 'Sleep Between Requests' may speed up scans, but also " ++"may fail to find some devices." ++msgstr "" ++"Configure la exploración de dispositivos en las redes especificadas. " ++"Reduciendo \"Espera\", \"Repeticiones\" y/o \"Parar entre peticiones\" puede " ++"acelerar las exploración, pero también puede que no encuentre algunos " ++"dispositivos." ++ ++msgid "" ++"Configure scanning for supported SIP devices on specified networks. " ++"Decreasing 'Timeout', 'Repeat Count', and/or 'Sleep Between Requests' may " ++"speed up scans, but also may fail to find some devices." ++msgstr "" ++"Configure la exploración de dispositivos SIP soportados en las redes " ++"especificadas. Reduciendo \"Espera\", \"Repeticiones\" y/o \"Parar entre " ++"peticiones\" puede acelerar la exploración, pero también puede que no " ++"encuentre algunos dispositivos." ++ ++msgid "Delete" ++msgstr "Borrar" ++ ++msgid "Device Scan Config" ++msgstr "Configuración del escaneo de dispositivos" ++ ++msgid "Device Type" ++msgstr "Tipo de dispositivo" ++ ++msgid "Devices discovered for" ++msgstr "Dispositivos encontrados para" ++ ++msgid "Devices on Network" ++msgstr "Dispositivos en red" ++ ++msgid "Edit" ++msgstr "Editar" ++ ++msgid "Enable" ++msgstr "Activar" ++ ++msgid "End of MAC address range" ++msgstr "Fin del rango de direcciones MAC" ++ ++msgid "Go to relevant configuration page" ++msgstr "Ir a la página de configuración pertinente" ++ ++msgid "IP Address" ++msgstr "Dirección IP" ++ ++msgid "Interface" ++msgstr "Interfaz" ++ ++msgid "Invalid" ++msgstr "No válido" ++ ++msgid "Link to Device" ++msgstr "Enlazar con dispositivo" ++ ++msgid "MAC Address" ++msgstr "Dirección MAC" ++ ++msgid "MAC Device Info Overrides" ++msgstr "Ignorar la información del dispositivo MAC" ++ ++msgid "MAC Device Override" ++msgstr "Ignorar MAC del dispositivo" ++ ++msgid "MAC range and information used to override system and IEEE databases" ++msgstr "" ++"Dirección MAC e información usada para ignorar el sistema y bases de datos " ++"IEEE" ++ ++msgid "Milliseconds to sleep between requests (default 100)" ++msgstr "Milisegundos a detenerse entre peticiones (100 por defecto)" ++ ++msgid "Model" ++msgstr "Modelo" ++ ++msgid "Name" ++msgstr "Nombre" ++ ++msgid "Network Device Scan" ++msgstr "Exploración de dispositivos de red" ++ ++msgid "Network Device Scanning Configuration" ++msgstr "Configuración de la exploración de dispositivos de red" ++ ++msgid "Networks to scan for devices" ++msgstr "Redes en las que escanear dispositivos" ++ ++msgid "Networks to scan for supported devices" ++msgstr "Redes en las que escanear dispositivos soportados" ++ ++msgid "No SIP devices" ++msgstr "No hay dispositivos SIP" ++ ++msgid "No devices detected" ++msgstr "No se detectan dispositivos" ++ ++msgid "Number of times to send requests (default 1)" ++msgstr "Número de veces que se enviarán peticiones (1 por defecto)" ++ ++msgid "OUI Owner" ++msgstr "Propietario del OUI" ++ ++msgid "" ++"Override the information returned by the MAC to Device Info Script (mac-to-" ++"devinfo) for a specified range of MAC Addresses" ++msgstr "" ++"Ignorar la información devuelta por el script de información MAC a " ++"dispositivo (mac-to-devinfo) para el rango de direcciones MAC que se " ++"especifica" ++ ++msgid "Perform Scans (this can take a few minutes)" ++msgstr "Realizar exploraciones (puede llevar unos minutos)" ++ ++msgid "Phone Information" ++msgstr "Información de teléfono" ++ ++msgid "Phone Scan" ++msgstr "Escanear teléfono" ++ ++msgid "Phone Scanning Configuration" ++msgstr "Configuración del escaneo telefónico" ++ ++msgid "Phones" ++msgstr "Teléfonos" ++ ++msgid "Ports" ++msgstr "Puertos" ++ ++msgid "Raw" ++msgstr "Sin tratar" ++ ++msgid "Repeat Count" ++msgstr "Número de repeticiones" ++ ++msgid "Repeat Scans (this can take a few minutes)" ++msgstr "Repetir exploraciones (puede llevar unos minutos)" ++ ++msgid "SIP Device Information" ++msgstr "Información de dispositivos SIP" ++ ++msgid "SIP Device Scan" ++msgstr "Escanear dispositivos SIP" ++ ++msgid "SIP Device Scanning Configuration" ++msgstr "Configuración de escaneo de dispositivos SIP" ++ ++msgid "SIP Devices on Network" ++msgstr "Dispositivos SIP en red" ++ ++msgid "SIP devices discovered for" ++msgstr "Dispositivos SIP para los que descubrir" ++ ++msgid "Scan for devices on specified networks." ++msgstr "Buscar dispositivos en las redes especificadas." ++ ++msgid "Scan for supported SIP devices on specified networks." ++msgstr "Explorar dispositivos SIP soportados en las redes especificadas." ++ ++msgid "Scanning Configuration" ++msgstr "Configuración de la exploración" ++ ++msgid "Scans for devices on specified networks." ++msgstr "Explora dispositivos en las redes especificadas." ++ ++msgid "Sleep Between Requests" ++msgstr "Detenerse entre peticiones" ++ ++msgid "Subnet" ++msgstr "Subred" ++ ++msgid "This section contains no values yet" ++msgstr "Esta sección aún no tiene valores" ++ ++msgid "Time to wait for responses in seconds (default 10)" ++msgstr "Esperar de respuestas en segundos (10 por defecto)" ++ ++msgid "Timeout" ++msgstr "Espera" ++ ++msgid "Use Configuration" ++msgstr "Use la configuración" ++ ++msgid "Vendor" ++msgstr "Vendedor" ++ ++msgid "check other networks" ++msgstr "comprueba otras redes" +diff --git a/feeds/luci/applications/luci-app-diag-devinfo/po/fr/diag_devinfo.po b/feeds/luci/applications/luci-app-diag-devinfo/po/fr/diag_devinfo.po +new file mode 100644 +index 0000000..e3d3809 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-diag-devinfo/po/fr/diag_devinfo.po +@@ -0,0 +1,220 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"PO-Revision-Date: 2014-01-26 12:49+0200\n" ++"Last-Translator: kyas \n" ++"Language-Team: none\n" ++"Language: fr\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n > 1);\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "Actions" ++msgstr "Actions" ++ ++msgid "Add" ++msgstr "Ajouter" ++ ++msgid "Beginning of MAC address range" ++msgstr "Début de la plage d'adresses MAC" ++ ++msgid "Config Phone Scan" ++msgstr "Configurer la recherche de téléphone" ++ ++msgid "Configure" ++msgstr "Configurer" ++ ++msgid "Configure Scans" ++msgstr "Configurer la recherche" ++ ++msgid "" ++"Configure scanning for devices on specified networks. Decreasing 'Timeout', " ++"'Repeat Count', and/or 'Sleep Between Requests' may speed up scans, but also " ++"may fail to find some devices." ++msgstr "" ++"Configurer la recherche d'appareils sur un réseau spécifié. Réduire le " ++"'Timeout', 'Repeat Count', et/ou 'Sleep Between Requests' peut augmenter la " ++"vitesse des scans, mais peut aussi ne pas trouver certains appareils." ++ ++msgid "" ++"Configure scanning for supported SIP devices on specified networks. " ++"Decreasing 'Timeout', 'Repeat Count', and/or 'Sleep Between Requests' may " ++"speed up scans, but also may fail to find some devices." ++msgstr "" ++"Configurer la recherche d'appareils SIP supporté sur un réseau spécifié. " ++"Réduire le 'Timeout', 'Repeat Count', et/ou 'Sleep Between Requests' peut " ++"augmenter la vitesse des scans, mais peut aussi ne pas trouver certains " ++"appareils." ++ ++msgid "Delete" ++msgstr "Supprimer" ++ ++msgid "Device Scan Config" ++msgstr "Configuration de la recherche de périphériques" ++ ++msgid "Device Type" ++msgstr "Type d'appareil" ++ ++msgid "Devices discovered for" ++msgstr "Devices discovered for" ++ ++msgid "Devices on Network" ++msgstr "Périphériques sur le réseau" ++ ++msgid "Edit" ++msgstr "Éditer" ++ ++msgid "Enable" ++msgstr "Activer" ++ ++msgid "End of MAC address range" ++msgstr "Fin de la plage d'adresses MAC" ++ ++msgid "Go to relevant configuration page" ++msgstr "Aller à la page de configuration appropriée" ++ ++msgid "IP Address" ++msgstr "Adresse IP" ++ ++msgid "Interface" ++msgstr "Interface" ++ ++msgid "Invalid" ++msgstr "Invalide" ++ ++msgid "Link to Device" ++msgstr "Lien vers le périphérique" ++ ++msgid "MAC Address" ++msgstr "Adresse MAC" ++ ++msgid "MAC Device Info Overrides" ++msgstr "Modification info MAC du périphérique" ++ ++msgid "MAC Device Override" ++msgstr "Modification de MAC de périphériques" ++ ++msgid "MAC range and information used to override system and IEEE databases" ++msgstr "" ++"Gamme d'adresses MAC et informations utilisées pour modifier les bases " ++"système et IEEE" ++ ++msgid "Milliseconds to sleep between requests (default 100)" ++msgstr "Durée d'attente en millisecondes entre les requêtes (par défaut 100)" ++ ++msgid "Model" ++msgstr "Modèle" ++ ++msgid "Name" ++msgstr "Nom" ++ ++msgid "Network Device Scan" ++msgstr "Analyse des périphériques réseau" ++ ++msgid "Network Device Scanning Configuration" ++msgstr "Configuration de l'analyse des périphériques réseau" ++ ++msgid "Networks to scan for devices" ++msgstr "Réseaux à scanner pour les périphériques " ++ ++msgid "Networks to scan for supported devices" ++msgstr "Réseaux à scanner pour les périphériques supporté" ++ ++msgid "No SIP devices" ++msgstr "Pas de périphérique SIP" ++ ++msgid "No devices detected" ++msgstr "Pas de périphérique détecté" ++ ++msgid "Number of times to send requests (default 1)" ++msgstr "Nombre de tentatives d'envois des requêtes (1 par défaut)" ++ ++msgid "OUI Owner" ++msgstr "OUI du fabricant" ++ ++msgid "" ++"Override the information returned by the MAC to Device Info Script (mac-to-" ++"devinfo) for a specified range of MAC Addresses" ++msgstr "" ++"Modifie les informations renvoyées par le script d'information « MAC vers " ++"Périphérique » (mac-to-devinfo) pour une gamme donnée d'adresses MAC" ++ ++msgid "Perform Scans (this can take a few minutes)" ++msgstr "Faire un scan ( Cela peut prendre quelques minutes)" ++ ++msgid "Phone Information" ++msgstr "Informations concernant le téléphone" ++ ++msgid "Phone Scan" ++msgstr "Recherche d'un téléphone" ++ ++msgid "Phone Scanning Configuration" ++msgstr "Configuration de la recherche d'un téléphone" ++ ++msgid "Phones" ++msgstr "Téléphones" ++ ++msgid "Ports" ++msgstr "Ports" ++ ++msgid "Raw" ++msgstr "Brut" ++ ++msgid "Repeat Count" ++msgstr "Nombre de tentatives" ++ ++msgid "Repeat Scans (this can take a few minutes)" ++msgstr "Refaire scans (cela peut prendre quelques minutes )" ++ ++msgid "SIP Device Information" ++msgstr "Informations concernant le périphérique SIP" ++ ++msgid "SIP Device Scan" ++msgstr "Recherche de périphérique SIP" ++ ++msgid "SIP Device Scanning Configuration" ++msgstr "Configuration de la recherche de périphériques SIP" ++ ++msgid "SIP Devices on Network" ++msgstr "Périphériques SIP sur le réseau" ++ ++msgid "SIP devices discovered for" ++msgstr "Périphériques SIP découvert pour" ++ ++msgid "Scan for devices on specified networks." ++msgstr "Rechercher des périphériques sur les réseaux spécifiés." ++ ++msgid "Scan for supported SIP devices on specified networks." ++msgstr "Rechercher des périphériques SIP supportés sur les réseaux spécifiés." ++ ++msgid "Scanning Configuration" ++msgstr "Analyse de la configuration" ++ ++msgid "Scans for devices on specified networks." ++msgstr "Recherches des périphériques sur les réseaux spécifiés." ++ ++msgid "Sleep Between Requests" ++msgstr "Attente entre les requêtes" ++ ++msgid "Subnet" ++msgstr "Sous-réseau" ++ ++msgid "This section contains no values yet" ++msgstr "Cette partie ne contient pas encore de valeur." ++ ++msgid "Time to wait for responses in seconds (default 10)" ++msgstr "Durée d'attente des réponses en secondes (par défaut 10)" ++ ++msgid "Timeout" ++msgstr "Timeout" ++ ++msgid "Use Configuration" ++msgstr "Utiliser la configuration" ++ ++msgid "Vendor" ++msgstr "Vendeur" ++ ++msgid "check other networks" ++msgstr "Explorer d'autres réseaux" +diff --git a/feeds/luci/applications/luci-app-diag-devinfo/po/he/diag_devinfo.po b/feeds/luci/applications/luci-app-diag-devinfo/po/he/diag_devinfo.po +new file mode 100644 +index 0000000..7161955 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-diag-devinfo/po/he/diag_devinfo.po +@@ -0,0 +1,206 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Last-Translator: Automatically generated\n" ++"Language-Team: none\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n != 1);\n" ++ ++msgid "Actions" ++msgstr "" ++ ++msgid "Add" ++msgstr "" ++ ++msgid "Beginning of MAC address range" ++msgstr "" ++ ++msgid "Config Phone Scan" ++msgstr "" ++ ++msgid "Configure" ++msgstr "" ++ ++msgid "Configure Scans" ++msgstr "" ++ ++msgid "" ++"Configure scanning for devices on specified networks. Decreasing 'Timeout', " ++"'Repeat Count', and/or 'Sleep Between Requests' may speed up scans, but also " ++"may fail to find some devices." ++msgstr "" ++ ++msgid "" ++"Configure scanning for supported SIP devices on specified networks. " ++"Decreasing 'Timeout', 'Repeat Count', and/or 'Sleep Between Requests' may " ++"speed up scans, but also may fail to find some devices." ++msgstr "" ++ ++msgid "Delete" ++msgstr "" ++ ++msgid "Device Scan Config" ++msgstr "" ++ ++msgid "Device Type" ++msgstr "" ++ ++msgid "Devices discovered for" ++msgstr "Devices discovered for" ++ ++msgid "Devices on Network" ++msgstr "" ++ ++msgid "Edit" ++msgstr "" ++ ++msgid "Enable" ++msgstr "" ++ ++msgid "End of MAC address range" ++msgstr "" ++ ++msgid "Go to relevant configuration page" ++msgstr "" ++ ++msgid "IP Address" ++msgstr "" ++ ++msgid "Interface" ++msgstr "" ++ ++msgid "Invalid" ++msgstr "" ++ ++msgid "Link to Device" ++msgstr "" ++ ++msgid "MAC Address" ++msgstr "" ++ ++msgid "MAC Device Info Overrides" ++msgstr "" ++ ++msgid "MAC Device Override" ++msgstr "" ++ ++msgid "MAC range and information used to override system and IEEE databases" ++msgstr "" ++ ++msgid "Milliseconds to sleep between requests (default 100)" ++msgstr "" ++ ++msgid "Model" ++msgstr "" ++ ++msgid "Name" ++msgstr "" ++ ++msgid "Network Device Scan" ++msgstr "" ++ ++msgid "Network Device Scanning Configuration" ++msgstr "" ++ ++msgid "Networks to scan for devices" ++msgstr "" ++ ++msgid "Networks to scan for supported devices" ++msgstr "" ++ ++msgid "No SIP devices" ++msgstr "" ++ ++msgid "No devices detected" ++msgstr "" ++ ++msgid "Number of times to send requests (default 1)" ++msgstr "" ++ ++msgid "OUI Owner" ++msgstr "" ++ ++msgid "" ++"Override the information returned by the MAC to Device Info Script (mac-to-" ++"devinfo) for a specified range of MAC Addresses" ++msgstr "" ++ ++msgid "Perform Scans (this can take a few minutes)" ++msgstr "" ++ ++msgid "Phone Information" ++msgstr "" ++ ++msgid "Phone Scan" ++msgstr "" ++ ++msgid "Phone Scanning Configuration" ++msgstr "" ++ ++msgid "Phones" ++msgstr "" ++ ++msgid "Ports" ++msgstr "" ++ ++msgid "Raw" ++msgstr "" ++ ++msgid "Repeat Count" ++msgstr "" ++ ++msgid "Repeat Scans (this can take a few minutes)" ++msgstr "" ++ ++msgid "SIP Device Information" ++msgstr "" ++ ++msgid "SIP Device Scan" ++msgstr "" ++ ++msgid "SIP Device Scanning Configuration" ++msgstr "" ++ ++msgid "SIP Devices on Network" ++msgstr "" ++ ++msgid "SIP devices discovered for" ++msgstr "" ++ ++msgid "Scan for devices on specified networks." ++msgstr "" ++ ++msgid "Scan for supported SIP devices on specified networks." ++msgstr "" ++ ++msgid "Scanning Configuration" ++msgstr "" ++ ++msgid "Scans for devices on specified networks." ++msgstr "" ++ ++msgid "Sleep Between Requests" ++msgstr "" ++ ++msgid "Subnet" ++msgstr "" ++ ++msgid "This section contains no values yet" ++msgstr "" ++ ++msgid "Time to wait for responses in seconds (default 10)" ++msgstr "" ++ ++msgid "Timeout" ++msgstr "" ++ ++msgid "Use Configuration" ++msgstr "" ++ ++msgid "Vendor" ++msgstr "" ++ ++msgid "check other networks" ++msgstr "" +diff --git a/feeds/luci/applications/luci-app-diag-devinfo/po/hu/diag_devinfo.po b/feeds/luci/applications/luci-app-diag-devinfo/po/hu/diag_devinfo.po +new file mode 100644 +index 0000000..5201994 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-diag-devinfo/po/hu/diag_devinfo.po +@@ -0,0 +1,222 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"PO-Revision-Date: 2014-01-31 10:01+0200\n" ++"Last-Translator: Gabor \n" ++"Language-Team: none\n" ++"Language: hu\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n != 1);\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "Actions" ++msgstr "Műveletek" ++ ++msgid "Add" ++msgstr "Hozzáadás" ++ ++msgid "Beginning of MAC address range" ++msgstr "MAC cím tartomány kezdete" ++ ++msgid "Config Phone Scan" ++msgstr "Telefon keresés beállításai" ++ ++msgid "Configure" ++msgstr "Beállítás" ++ ++msgid "Configure Scans" ++msgstr "Keresési beállítások" ++ ++msgid "" ++"Configure scanning for devices on specified networks. Decreasing 'Timeout', " ++"'Repeat Count', and/or 'Sleep Between Requests' may speed up scans, but also " ++"may fail to find some devices." ++msgstr "" ++"Ãllítsa be az eszközkeresést a megadott hálózatokon. Az 'IdÅ‘limit', " ++"'Ismétlésszám', és/vagy 'Alvás a lekérdezések között' csökkentése " ++"felgyorsíthatja a keresést, de lehet, hogy nem talál meg néhány eszközt." ++ ++msgid "" ++"Configure scanning for supported SIP devices on specified networks. " ++"Decreasing 'Timeout', 'Repeat Count', and/or 'Sleep Between Requests' may " ++"speed up scans, but also may fail to find some devices." ++msgstr "" ++"Ãllítsa be a támogatott SIP eszközök keresését a megadott hálózatokon. Az " ++"'IdÅ‘limit', 'Ismétlésszám', és/vagy 'Alvás a lekérdezések között' " ++"csökkentése felgyorsíthatja a keresést, de lehet, hogy nem talál meg néhány " ++"eszközt." ++ ++msgid "Delete" ++msgstr "Törlés" ++ ++msgid "Device Scan Config" ++msgstr "Eszköz keresés beállításai" ++ ++msgid "Device Type" ++msgstr "Eszköztípus" ++ ++msgid "Devices discovered for" ++msgstr "Felfedezett eszközök" ++ ++msgid "Devices on Network" ++msgstr "Eszközök a hálózatban" ++ ++msgid "Edit" ++msgstr "Szerkesztés" ++ ++msgid "Enable" ++msgstr "Engedélyezés" ++ ++msgid "End of MAC address range" ++msgstr "MAC cím tartomány vége" ++ ++msgid "Go to relevant configuration page" ++msgstr "Ugrás a kapcsolódó beállítások oldalára" ++ ++msgid "IP Address" ++msgstr "IP cím" ++ ++msgid "Interface" ++msgstr "Interfész" ++ ++msgid "Invalid" ++msgstr "Érvénytelen" ++ ++msgid "Link to Device" ++msgstr "Eszközre mutató hivatkozás" ++ ++msgid "MAC Address" ++msgstr "MAC cím" ++ ++msgid "MAC Device Info Overrides" ++msgstr "MAC eszköz információ felülbírálások" ++ ++msgid "MAC Device Override" ++msgstr "MAC eszköz felülbírálása" ++ ++msgid "MAC range and information used to override system and IEEE databases" ++msgstr "" ++"A rendszer és IEEE adatbázisok felülbíráláshoz használt MAC cím tartomány és " ++"információ" ++ ++msgid "Milliseconds to sleep between requests (default 100)" ++msgstr "" ++"A kérések küldése közötti szünet idÅ‘tartama ezredmásodpercben " ++"(alapértelmezés: 100)" ++ ++msgid "Model" ++msgstr "Típus" ++ ++msgid "Name" ++msgstr "Név" ++ ++msgid "Network Device Scan" ++msgstr "Hálózati eszközök keresése" ++ ++msgid "Network Device Scanning Configuration" ++msgstr "Hálózati eszközök keresési beállításai" ++ ++msgid "Networks to scan for devices" ++msgstr "Eszközök keresése ezekben a hálózatokban" ++ ++msgid "Networks to scan for supported devices" ++msgstr "Támogatott eszközök keresése ezekben a hálózatokban" ++ ++msgid "No SIP devices" ++msgstr "Nem találhatóak SIP eszközök" ++ ++msgid "No devices detected" ++msgstr "Nem található semmilyen eszköz" ++ ++msgid "Number of times to send requests (default 1)" ++msgstr "Az elküldött kérések száma (alapértelmezés: 1)" ++ ++msgid "OUI Owner" ++msgstr "OUI tulajdonos" ++ ++msgid "" ++"Override the information returned by the MAC to Device Info Script (mac-to-" ++"devinfo) for a specified range of MAC Addresses" ++msgstr "" ++"A meghatározott tartományba tartozó MAC címeknél felülbírálja a 'MAC to " ++"Device Info' szkript (mac-to-devinfo) által visszadott információt." ++ ++msgid "Perform Scans (this can take a few minutes)" ++msgstr "Keresés (ez eltarthat néhány percig)" ++ ++msgid "Phone Information" ++msgstr "Telefon információ" ++ ++msgid "Phone Scan" ++msgstr "Telefon keresés" ++ ++msgid "Phone Scanning Configuration" ++msgstr "Telefon keresési beállítások" ++ ++msgid "Phones" ++msgstr "Telefonok" ++ ++msgid "Ports" ++msgstr "Portok" ++ ++msgid "Raw" ++msgstr "Nyers" ++ ++msgid "Repeat Count" ++msgstr "Ismétlés száma" ++ ++msgid "Repeat Scans (this can take a few minutes)" ++msgstr "Keresés megismétlése (ez eltarthat néhány percig)" ++ ++msgid "SIP Device Information" ++msgstr "SIP eszköz információ" ++ ++msgid "SIP Device Scan" ++msgstr "SIP eszközök keresése" ++ ++msgid "SIP Device Scanning Configuration" ++msgstr "SIP eszköz keresés beállításai" ++ ++msgid "SIP Devices on Network" ++msgstr "SIP eszközök a hálózatban" ++ ++msgid "SIP devices discovered for" ++msgstr "Megtalált SIP eszközök ehhez:" ++ ++msgid "Scan for devices on specified networks." ++msgstr "Eszközök keresése a megadott hálózatokban." ++ ++msgid "Scan for supported SIP devices on specified networks." ++msgstr "Támogatott SIP eszközök keresése a megadott hálózatokban." ++ ++msgid "Scanning Configuration" ++msgstr "Keresési beállítások" ++ ++msgid "Scans for devices on specified networks." ++msgstr "Scans for devices on specified networks." ++ ++msgid "Sleep Between Requests" ++msgstr "Kérések közötti szünet" ++ ++msgid "Subnet" ++msgstr "Alhálózat" ++ ++msgid "This section contains no values yet" ++msgstr "Ez a rész még nem tartlamaz értékeket" ++ ++msgid "Time to wait for responses in seconds (default 10)" ++msgstr "Várakozási idÅ‘ a válasz beérkezésére (alapértelemezés: 10)" ++ ++msgid "Timeout" ++msgstr "Várakozási idÅ‘" ++ ++msgid "Use Configuration" ++msgstr "Beállítás használata" ++ ++msgid "Vendor" ++msgstr "Gyártó" ++ ++msgid "check other networks" ++msgstr "egyéb hálózatok ellenÅ‘rzése" +diff --git a/feeds/luci/applications/luci-app-diag-devinfo/po/it/diag_devinfo.po b/feeds/luci/applications/luci-app-diag-devinfo/po/it/diag_devinfo.po +new file mode 100644 +index 0000000..767245c +--- /dev/null ++++ b/feeds/luci/applications/luci-app-diag-devinfo/po/it/diag_devinfo.po +@@ -0,0 +1,221 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"PO-Revision-Date: 2013-02-09 20:40+0200\n" ++"Last-Translator: Francesco <3gasas@gmail.com>\n" ++"Language-Team: none\n" ++"Language: it\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n != 1);\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "Actions" ++msgstr "Azioni" ++ ++msgid "Add" ++msgstr "Aggiungi" ++ ++msgid "Beginning of MAC address range" ++msgstr "Inizio del campo di indirizzi MAC" ++ ++msgid "Config Phone Scan" ++msgstr "Configura Scansione Telefono" ++ ++msgid "Configure" ++msgstr "Configura" ++ ++msgid "Configure Scans" ++msgstr "Configura Scansioni" ++ ++msgid "" ++"Configure scanning for devices on specified networks. Decreasing 'Timeout', " ++"'Repeat Count', and/or 'Sleep Between Requests' may speed up scans, but also " ++"may fail to find some devices." ++msgstr "" ++"Configurare la scansione per i dispositivi su reti specifiche. Diminuendo il " ++"'Timeout', 'Numero Ripetizioni' e/o ''Pausa tra le Richieste' è possibile " ++"aumentare la velocità delle scansioni, ma può anche non riuscire a trovare " ++"alcuni dispositivo." ++ ++msgid "" ++"Configure scanning for supported SIP devices on specified networks. " ++"Decreasing 'Timeout', 'Repeat Count', and/or 'Sleep Between Requests' may " ++"speed up scans, but also may fail to find some devices." ++msgstr "" ++"Configurare la scansione dei dispositivi SIP supportati su reti specifiche. " ++"Diminuendo il 'Timeout', 'Numero ripetizioni' e / o ''Pausa tra le " ++"richieste' è possibile aumentare la velocità delle scansioni, ma può anche " ++"non riuscire a trovare alcuni dispositivo." ++ ++msgid "Delete" ++msgstr "Elimina" ++ ++msgid "Device Scan Config" ++msgstr "Configura Scansione Periferica" ++ ++msgid "Device Type" ++msgstr "Tipo di Periferica" ++ ++msgid "Devices discovered for" ++msgstr "Devices discovered for" ++ ++msgid "Devices on Network" ++msgstr "Periferiche in Rete" ++ ++msgid "Edit" ++msgstr "Modifica" ++ ++msgid "Enable" ++msgstr "Attiva" ++ ++msgid "End of MAC address range" ++msgstr "Fine intervallo dell' indirizzo MAC" ++ ++msgid "Go to relevant configuration page" ++msgstr "Vai alla pagina di configurazione rilevanti" ++ ++msgid "IP Address" ++msgstr "Indirizzo IP" ++ ++msgid "Interface" ++msgstr "Interfaccia" ++ ++msgid "Invalid" ++msgstr "Non valido" ++ ++msgid "Link to Device" ++msgstr "Collegamento alla Periferica" ++ ++msgid "MAC Address" ++msgstr "Indirizzo MAC" ++ ++msgid "MAC Device Info Overrides" ++msgstr "Informazioni su Sostituzioni della Periferica MAC" ++ ++msgid "MAC Device Override" ++msgstr "Sostituzione del MAC del dispositivo" ++ ++msgid "MAC range and information used to override system and IEEE databases" ++msgstr "" ++"La gamma e le informazioni MAC utilizzate per eseguire la sostituzione dei " ++"database di sistema e IEEE" ++ ++msgid "Milliseconds to sleep between requests (default 100)" ++msgstr "Millisecondi di attesa tra le richieste (predefinito: 100)" ++ ++msgid "Model" ++msgstr "Modello" ++ ++msgid "Name" ++msgstr "Nome" ++ ++msgid "Network Device Scan" ++msgstr "Dispositivo Scansione della Rete" ++ ++msgid "Network Device Scanning Configuration" ++msgstr "Configurazione Dispositivo di Scansione della Rete" ++ ++msgid "Networks to scan for devices" ++msgstr "Reti da scandire per i dispositivi" ++ ++msgid "Networks to scan for supported devices" ++msgstr "Reti da scandire per i dispositivi supportati" ++ ++msgid "No SIP devices" ++msgstr "Nessun dispositivo SIP" ++ ++msgid "No devices detected" ++msgstr "Nessun dispositivo rilevato" ++ ++msgid "Number of times to send requests (default 1)" ++msgstr "Numero di volte delle richieste da inviare (predefinito: 1)" ++ ++msgid "OUI Owner" ++msgstr "Proprietario OUI" ++ ++msgid "" ++"Override the information returned by the MAC to Device Info Script (mac-to-" ++"devinfo) for a specified range of MAC Addresses" ++msgstr "" ++"Ignora le informazioni restituite dal MAC su Script per le Informazioni sul " ++"dispositivo (mac-in-devinfo) per un determinato intervallo di indirizzi MAC" ++ ++msgid "Perform Scans (this can take a few minutes)" ++msgstr "Rilevamento (richiede alcuni minuti)" ++ ++msgid "Phone Information" ++msgstr "Informazione Telefono" ++ ++msgid "Phone Scan" ++msgstr "Rilevamento Telefono" ++ ++msgid "Phone Scanning Configuration" ++msgstr "Configurazione Rilevamento Telefono" ++ ++msgid "Phones" ++msgstr "Telefoni" ++ ++msgid "Ports" ++msgstr "Porte" ++ ++msgid "Raw" ++msgstr "Raw" ++ ++msgid "Repeat Count" ++msgstr "Ripetizione Conteggio" ++ ++msgid "Repeat Scans (this can take a few minutes)" ++msgstr "Ripetizione Rilevamento (richiede alcuni minuti)" ++ ++msgid "SIP Device Information" ++msgstr "Informazioni Periferica SIP" ++ ++msgid "SIP Device Scan" ++msgstr "Rilevamento Periferica SIP" ++ ++msgid "SIP Device Scanning Configuration" ++msgstr "Configurazione Rilevamento Periferica SIP" ++ ++msgid "SIP Devices on Network" ++msgstr "Periferiche SIP in Rete" ++ ++msgid "SIP devices discovered for" ++msgstr "Periferiche SIP rilevate per" ++ ++msgid "Scan for devices on specified networks." ++msgstr "Rilevamento per periferiche su reti specificate." ++ ++msgid "Scan for supported SIP devices on specified networks." ++msgstr "Rilevamento per periferiche SIP supportate sulle reti specificate." ++ ++msgid "Scanning Configuration" ++msgstr "Configurazione Rilevamento" ++ ++msgid "Scans for devices on specified networks." ++msgstr "Rilevamento periferiche sulle reti specificate." ++ ++msgid "Sleep Between Requests" ++msgstr "Attendi tra le richieste" ++ ++msgid "Subnet" ++msgstr "Sottorete" ++ ++msgid "This section contains no values yet" ++msgstr "Questa sezione non contiene ancora valori" ++ ++msgid "Time to wait for responses in seconds (default 10)" ++msgstr "Tempo di attesa per le risposte in secondi (predefinito: 10)" ++ ++msgid "Timeout" ++msgstr "Timeout" ++ ++msgid "Use Configuration" ++msgstr "Usa Configurazione" ++ ++msgid "Vendor" ++msgstr "Produttore" ++ ++msgid "check other networks" ++msgstr "Controlla altre reti" +diff --git a/feeds/luci/applications/luci-app-diag-devinfo/po/ja/diag_devinfo.po b/feeds/luci/applications/luci-app-diag-devinfo/po/ja/diag_devinfo.po +new file mode 100644 +index 0000000..1ef3dad +--- /dev/null ++++ b/feeds/luci/applications/luci-app-diag-devinfo/po/ja/diag_devinfo.po +@@ -0,0 +1,209 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"PO-Revision-Date: 2012-04-19 07:59+0200\n" ++"Last-Translator: Kentaro \n" ++"Language-Team: none\n" ++"Language: ja\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=1; plural=0;\n" ++"X-Generator: Pootle 2.0.4\n" ++ ++msgid "Actions" ++msgstr "" ++ ++msgid "Add" ++msgstr "追加" ++ ++msgid "Beginning of MAC address range" ++msgstr "" ++ ++msgid "Config Phone Scan" ++msgstr "" ++ ++msgid "Configure" ++msgstr "設定" ++ ++msgid "Configure Scans" ++msgstr "" ++ ++msgid "" ++"Configure scanning for devices on specified networks. Decreasing 'Timeout', " ++"'Repeat Count', and/or 'Sleep Between Requests' may speed up scans, but also " ++"may fail to find some devices." ++msgstr "" ++ ++msgid "" ++"Configure scanning for supported SIP devices on specified networks. " ++"Decreasing 'Timeout', 'Repeat Count', and/or 'Sleep Between Requests' may " ++"speed up scans, but also may fail to find some devices." ++msgstr "" ++ ++msgid "Delete" ++msgstr "削除" ++ ++msgid "Device Scan Config" ++msgstr "デãƒã‚¤ã‚¹ã‚¹ã‚­ãƒ£ãƒ³è¨­å®š" ++ ++msgid "Device Type" ++msgstr "" ++ ++msgid "Devices discovered for" ++msgstr "" ++ ++msgid "Devices on Network" ++msgstr "ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ä¸Šã®ãƒ‡ãƒã‚¤ã‚¹" ++ ++msgid "Edit" ++msgstr "編集" ++ ++msgid "Enable" ++msgstr "有効" ++ ++msgid "End of MAC address range" ++msgstr "" ++ ++msgid "Go to relevant configuration page" ++msgstr "" ++ ++msgid "IP Address" ++msgstr "IPアドレス" ++ ++msgid "Interface" ++msgstr "インターフェース" ++ ++msgid "Invalid" ++msgstr "" ++ ++msgid "Link to Device" ++msgstr "" ++ ++msgid "MAC Address" ++msgstr "MACアドレス" ++ ++msgid "MAC Device Info Overrides" ++msgstr "" ++ ++msgid "MAC Device Override" ++msgstr "" ++ ++msgid "MAC range and information used to override system and IEEE databases" ++msgstr "" ++ ++msgid "Milliseconds to sleep between requests (default 100)" ++msgstr "リクエスト間ã®ã‚¹ãƒªãƒ¼ãƒ—時間 (å˜ä½:ミリ秒, 標準設定:100)" ++ ++msgid "Model" ++msgstr "" ++ ++msgid "Name" ++msgstr "" ++ ++msgid "Network Device Scan" ++msgstr "" ++ ++msgid "Network Device Scanning Configuration" ++msgstr "" ++ ++msgid "Networks to scan for devices" ++msgstr "" ++ ++msgid "Networks to scan for supported devices" ++msgstr "" ++ ++msgid "No SIP devices" ++msgstr "SIPデãƒã‚¤ã‚¹ã¯è¦‹ã¤ã‹ã‚Šã¾ã›ã‚“ã§ã—ãŸã€‚" ++ ++msgid "No devices detected" ++msgstr "デãƒã‚¤ã‚¹ã¯æ¤œå‡ºã•ã‚Œã¾ã›ã‚“ã§ã—ãŸã€‚" ++ ++msgid "Number of times to send requests (default 1)" ++msgstr "リクエストé€ä¿¡å›žæ•° (標準設定:1)" ++ ++msgid "OUI Owner" ++msgstr "" ++ ++msgid "" ++"Override the information returned by the MAC to Device Info Script (mac-to-" ++"devinfo) for a specified range of MAC Addresses" ++msgstr "" ++ ++msgid "Perform Scans (this can take a few minutes)" ++msgstr "" ++ ++msgid "Phone Information" ++msgstr "" ++ ++msgid "Phone Scan" ++msgstr "" ++ ++msgid "Phone Scanning Configuration" ++msgstr "" ++ ++msgid "Phones" ++msgstr "電話" ++ ++msgid "Ports" ++msgstr "" ++ ++msgid "Raw" ++msgstr "" ++ ++msgid "Repeat Count" ++msgstr "リピート回数" ++ ++msgid "Repeat Scans (this can take a few minutes)" ++msgstr "" ++ ++msgid "SIP Device Information" ++msgstr "SIPデãƒã‚¤ã‚¹æƒ…å ±" ++ ++msgid "SIP Device Scan" ++msgstr "SIPデãƒã‚¤ã‚¹ã®ã‚¹ã‚­ãƒ£ãƒ³" ++ ++msgid "SIP Device Scanning Configuration" ++msgstr "SIPデãƒã‚¤ã‚¹ã‚¹ã‚­ãƒ£ãƒ³è¨­å®š" ++ ++msgid "SIP Devices on Network" ++msgstr "ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ä¸Šã®SIPデãƒã‚¤ã‚¹" ++ ++msgid "SIP devices discovered for" ++msgstr "" ++ ++msgid "Scan for devices on specified networks." ++msgstr "" ++ ++msgid "Scan for supported SIP devices on specified networks." ++msgstr "" ++ ++msgid "Scanning Configuration" ++msgstr "" ++ ++msgid "Scans for devices on specified networks." ++msgstr "" ++ ++msgid "Sleep Between Requests" ++msgstr "リクエスト間ã®ã‚¹ãƒªãƒ¼ãƒ—時間" ++ ++msgid "Subnet" ++msgstr "サブãƒãƒƒãƒˆ" ++ ++msgid "This section contains no values yet" ++msgstr "" ++ ++msgid "Time to wait for responses in seconds (default 10)" ++msgstr "応答待ã¡æ™‚é–“ (å˜ä½:秒, 標準設定:10)" ++ ++msgid "Timeout" ++msgstr "タイムアウト" ++ ++msgid "Use Configuration" ++msgstr "" ++ ++msgid "Vendor" ++msgstr "" ++ ++msgid "check other networks" ++msgstr "" +diff --git a/feeds/luci/applications/luci-app-diag-devinfo/po/ms/diag_devinfo.po b/feeds/luci/applications/luci-app-diag-devinfo/po/ms/diag_devinfo.po +new file mode 100644 +index 0000000..27d2b46 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-diag-devinfo/po/ms/diag_devinfo.po +@@ -0,0 +1,205 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Last-Translator: Automatically generated\n" ++"Language-Team: none\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++ ++msgid "Actions" ++msgstr "" ++ ++msgid "Add" ++msgstr "" ++ ++msgid "Beginning of MAC address range" ++msgstr "" ++ ++msgid "Config Phone Scan" ++msgstr "" ++ ++msgid "Configure" ++msgstr "" ++ ++msgid "Configure Scans" ++msgstr "" ++ ++msgid "" ++"Configure scanning for devices on specified networks. Decreasing 'Timeout', " ++"'Repeat Count', and/or 'Sleep Between Requests' may speed up scans, but also " ++"may fail to find some devices." ++msgstr "" ++ ++msgid "" ++"Configure scanning for supported SIP devices on specified networks. " ++"Decreasing 'Timeout', 'Repeat Count', and/or 'Sleep Between Requests' may " ++"speed up scans, but also may fail to find some devices." ++msgstr "" ++ ++msgid "Delete" ++msgstr "" ++ ++msgid "Device Scan Config" ++msgstr "" ++ ++msgid "Device Type" ++msgstr "" ++ ++msgid "Devices discovered for" ++msgstr "Devices discovered for" ++ ++msgid "Devices on Network" ++msgstr "" ++ ++msgid "Edit" ++msgstr "" ++ ++msgid "Enable" ++msgstr "" ++ ++msgid "End of MAC address range" ++msgstr "" ++ ++msgid "Go to relevant configuration page" ++msgstr "" ++ ++msgid "IP Address" ++msgstr "" ++ ++msgid "Interface" ++msgstr "" ++ ++msgid "Invalid" ++msgstr "" ++ ++msgid "Link to Device" ++msgstr "" ++ ++msgid "MAC Address" ++msgstr "" ++ ++msgid "MAC Device Info Overrides" ++msgstr "" ++ ++msgid "MAC Device Override" ++msgstr "" ++ ++msgid "MAC range and information used to override system and IEEE databases" ++msgstr "" ++ ++msgid "Milliseconds to sleep between requests (default 100)" ++msgstr "" ++ ++msgid "Model" ++msgstr "" ++ ++msgid "Name" ++msgstr "" ++ ++msgid "Network Device Scan" ++msgstr "" ++ ++msgid "Network Device Scanning Configuration" ++msgstr "" ++ ++msgid "Networks to scan for devices" ++msgstr "" ++ ++msgid "Networks to scan for supported devices" ++msgstr "" ++ ++msgid "No SIP devices" ++msgstr "" ++ ++msgid "No devices detected" ++msgstr "" ++ ++msgid "Number of times to send requests (default 1)" ++msgstr "" ++ ++msgid "OUI Owner" ++msgstr "" ++ ++msgid "" ++"Override the information returned by the MAC to Device Info Script (mac-to-" ++"devinfo) for a specified range of MAC Addresses" ++msgstr "" ++ ++msgid "Perform Scans (this can take a few minutes)" ++msgstr "" ++ ++msgid "Phone Information" ++msgstr "" ++ ++msgid "Phone Scan" ++msgstr "" ++ ++msgid "Phone Scanning Configuration" ++msgstr "" ++ ++msgid "Phones" ++msgstr "" ++ ++msgid "Ports" ++msgstr "" ++ ++msgid "Raw" ++msgstr "" ++ ++msgid "Repeat Count" ++msgstr "" ++ ++msgid "Repeat Scans (this can take a few minutes)" ++msgstr "" ++ ++msgid "SIP Device Information" ++msgstr "" ++ ++msgid "SIP Device Scan" ++msgstr "" ++ ++msgid "SIP Device Scanning Configuration" ++msgstr "" ++ ++msgid "SIP Devices on Network" ++msgstr "" ++ ++msgid "SIP devices discovered for" ++msgstr "" ++ ++msgid "Scan for devices on specified networks." ++msgstr "" ++ ++msgid "Scan for supported SIP devices on specified networks." ++msgstr "" ++ ++msgid "Scanning Configuration" ++msgstr "" ++ ++msgid "Scans for devices on specified networks." ++msgstr "" ++ ++msgid "Sleep Between Requests" ++msgstr "" ++ ++msgid "Subnet" ++msgstr "" ++ ++msgid "This section contains no values yet" ++msgstr "" ++ ++msgid "Time to wait for responses in seconds (default 10)" ++msgstr "" ++ ++msgid "Timeout" ++msgstr "" ++ ++msgid "Use Configuration" ++msgstr "" ++ ++msgid "Vendor" ++msgstr "" ++ ++msgid "check other networks" ++msgstr "" +diff --git a/feeds/luci/applications/luci-app-diag-devinfo/po/no/diag_devinfo.po b/feeds/luci/applications/luci-app-diag-devinfo/po/no/diag_devinfo.po +new file mode 100644 +index 0000000..4ada96b +--- /dev/null ++++ b/feeds/luci/applications/luci-app-diag-devinfo/po/no/diag_devinfo.po +@@ -0,0 +1,213 @@ ++msgid "" ++msgstr "" ++"Last-Translator: Lars Hardy \n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++ ++msgid "Actions" ++msgstr "Handlinger" ++ ++msgid "Add" ++msgstr "Legg til" ++ ++msgid "Beginning of MAC address range" ++msgstr "Begynnelsen av MAC adresseomrÃ¥de" ++ ++msgid "Config Phone Scan" ++msgstr "Konfigurer Telefon Skanning" ++ ++msgid "Configure" ++msgstr "Konfigurer" ++ ++msgid "Configure Scans" ++msgstr "Konfigurer Skanning" ++ ++msgid "" ++"Configure scanning for devices on specified networks. Decreasing 'Timeout', " ++"'Repeat Count', and/or 'Sleep Between Requests' may speed up scans, but also " ++"may fail to find some devices." ++msgstr "" ++"Konfigurer skanning etter enheter pÃ¥ angitte nettverk. Ved Ã¥ minske verdiene " ++"til 'Tidsavbrudd', 'Gjentagelser' og/eller Tid mellom forespørsler blir " ++"skanningen utført raskere, men det kan ogsÃ¥ medføre at noen enheter ikke " ++"blir funnet." ++ ++msgid "" ++"Configure scanning for supported SIP devices on specified networks. " ++"Decreasing 'Timeout', 'Repeat Count', and/or 'Sleep Between Requests' may " ++"speed up scans, but also may fail to find some devices." ++msgstr "" ++"Konfigurer skanning etter støttede SIP enheter pÃ¥ angitte nettverk. Ved Ã¥ " ++"minske verdiene til 'Tidsavbrudd', 'Gjentagelser' og/eller tid mellom " ++"forespørsler blir skanningen utført raskere, men det kan ogsÃ¥ medføre at " ++"noen enheter ikke blir funnet." ++ ++msgid "Delete" ++msgstr "Slett" ++ ++msgid "Device Scan Config" ++msgstr "Enhets skann konfigurasjon" ++ ++msgid "Device Type" ++msgstr "Enhets type" ++ ++msgid "Devices discovered for" ++msgstr "Enheter oppdaget for" ++ ++msgid "Devices on Network" ++msgstr "Enheter i Nettverket" ++ ++msgid "Edit" ++msgstr "Rediger" ++ ++msgid "Enable" ++msgstr "Aktiver" ++ ++msgid "End of MAC address range" ++msgstr "Slutten av MAC omrÃ¥de" ++ ++msgid "Go to relevant configuration page" ++msgstr "GÃ¥ til relevant konfigurasjons side" ++ ++msgid "IP Address" ++msgstr "IP Adresse" ++ ++msgid "Interface" ++msgstr "Grensesnitt" ++ ++msgid "Invalid" ++msgstr "Ugyldig" ++ ++msgid "Link to Device" ++msgstr "Link til Enhet" ++ ++msgid "MAC Address" ++msgstr "MAC Adresse" ++ ++msgid "MAC Device Info Overrides" ++msgstr "MAC Enhets Info Overstyring" ++ ++msgid "MAC Device Override" ++msgstr "MAC Enhets Overstyring" ++ ++msgid "MAC range and information used to override system and IEEE databases" ++msgstr "" ++"MAC omrÃ¥de og informasjon brukt til Ã¥ overstyre system og IEEE databaser" ++ ++msgid "Milliseconds to sleep between requests (default 100)" ++msgstr "Antall millisekunder ventetid mellom forespørsler (standard 100)" ++ ++msgid "Model" ++msgstr "Modell" ++ ++msgid "Name" ++msgstr "Navn" ++ ++msgid "Network Device Scan" ++msgstr "Nettverks Enhets Skanning" ++ ++msgid "Network Device Scanning Configuration" ++msgstr "Nettverks Enhets Skanning Konfigurasjon" ++ ++msgid "Networks to scan for devices" ++msgstr "Nettverk som blir skannet" ++ ++msgid "Networks to scan for supported devices" ++msgstr "Nettverk som blir skannet for støttede enheter" ++ ++msgid "No SIP devices" ++msgstr "Ingen SIP enheter" ++ ++msgid "No devices detected" ++msgstr "Ingen enheter oppdaget" ++ ++msgid "Number of times to send requests (default 1)" ++msgstr "Antall ganger Ã¥ sende forespørsel (standard 1)" ++ ++msgid "OUI Owner" ++msgstr "OUI Eier" ++ ++msgid "" ++"Override the information returned by the MAC to Device Info Script (mac-to-" ++"devinfo) for a specified range of MAC Addresses" ++msgstr "" ++"Overstyr informasjonen hentet fra MAC til enhets info skriptet (mac-til-" ++"devinfo) for et gitt omrÃ¥de med MAC adresser" ++ ++msgid "Perform Scans (this can take a few minutes)" ++msgstr "Utfør Skanning (dette kan ta noen minutter)" ++ ++msgid "Phone Information" ++msgstr "Telefon Informasjon" ++ ++msgid "Phone Scan" ++msgstr "Telefon skanning" ++ ++msgid "Phone Scanning Configuration" ++msgstr "Telefon skanning konfigurasjon" ++ ++msgid "Phones" ++msgstr "Telefoner" ++ ++msgid "Ports" ++msgstr "Porter" ++ ++msgid "Raw" ++msgstr "RÃ¥" ++ ++msgid "Repeat Count" ++msgstr "Gjentagelser" ++ ++msgid "Repeat Scans (this can take a few minutes)" ++msgstr "Gjennta Skanning (dette kan ta noen minutter)" ++ ++msgid "SIP Device Information" ++msgstr "SIP Enhets Informasjon" ++ ++msgid "SIP Device Scan" ++msgstr "SIP Enhets Skanning" ++ ++msgid "SIP Device Scanning Configuration" ++msgstr "SIP Enhets Skann Konfigurasjon" ++ ++msgid "SIP Devices on Network" ++msgstr "SIP Enheter i Nettverket" ++ ++msgid "SIP devices discovered for" ++msgstr "SIP enheter oppdaget pÃ¥" ++ ++msgid "Scan for devices on specified networks." ++msgstr "Skann etter enheter pÃ¥ spesifiserte nettverk" ++ ++msgid "Scan for supported SIP devices on specified networks." ++msgstr "Skann etter SIP enheter pÃ¥ spesifiserte nettverk" ++ ++msgid "Scanning Configuration" ++msgstr "Skanning Konfigurasjon" ++ ++msgid "Scans for devices on specified networks." ++msgstr "Nettverks Skanning Informasjon" ++ ++msgid "Sleep Between Requests" ++msgstr "Tid mellom forespørsler" ++ ++msgid "Subnet" ++msgstr "Subnett" ++ ++msgid "This section contains no values yet" ++msgstr "Denne seksjonen inneholder ennÃ¥ ingen verdier" ++ ++msgid "Time to wait for responses in seconds (default 10)" ++msgstr "Tid for Ã¥ vente pÃ¥ svar i sekunder (standard 10)" ++ ++msgid "Timeout" ++msgstr "Tidsavbrudd" ++ ++msgid "Use Configuration" ++msgstr "Bruk Konfigurasjonen" ++ ++msgid "Vendor" ++msgstr "Leverandør" ++ ++msgid "check other networks" ++msgstr "skjekk andre nettverk" +diff --git a/feeds/luci/applications/luci-app-diag-devinfo/po/pl/diag_devinfo.po b/feeds/luci/applications/luci-app-diag-devinfo/po/pl/diag_devinfo.po +new file mode 100644 +index 0000000..32ccdce +--- /dev/null ++++ b/feeds/luci/applications/luci-app-diag-devinfo/po/pl/diag_devinfo.po +@@ -0,0 +1,222 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"PO-Revision-Date: 2012-10-11 13:44+0200\n" ++"Last-Translator: mesiu84 \n" ++"Language-Team: none\n" ++"Language: pl\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 " ++"|| n%100>=20) ? 1 : 2);\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "Actions" ++msgstr "Akcje" ++ ++msgid "Add" ++msgstr "Dodaj" ++ ++msgid "Beginning of MAC address range" ++msgstr "PoczÄ…tek zakresu MAC adresów" ++ ++msgid "Config Phone Scan" ++msgstr "Konfiguruj skanowanie telefonów" ++ ++msgid "Configure" ++msgstr "Konfiguruj" ++ ++msgid "Configure Scans" ++msgstr "Konfiguruj skany" ++ ++msgid "" ++"Configure scanning for devices on specified networks. Decreasing 'Timeout', " ++"'Repeat Count', and/or 'Sleep Between Requests' may speed up scans, but also " ++"may fail to find some devices." ++msgstr "" ++"Konfiguruj skanowanie dla urzÄ…dzeÅ„ w wybranych sieciach. Zmniejszanie " ++"\"Limitu czasu\", \"Liczby powtórzeÅ„\" i/lub \"Oczekiwania miÄ™dzy żądaniami" ++"\" może przyspieszyć skany, ale może też uniemożliwić wykrycie niektórych " ++"urzÄ…dzeÅ„." ++ ++msgid "" ++"Configure scanning for supported SIP devices on specified networks. " ++"Decreasing 'Timeout', 'Repeat Count', and/or 'Sleep Between Requests' may " ++"speed up scans, but also may fail to find some devices." ++msgstr "" ++"Konfiguruj skanowanie dla wspieranych urzÄ…dzeÅ„ SIP w wybranych sieciach. " ++"Zmniejszanie \"Limitu czasu\", \"Liczby powtórzeÅ„\" i/lub \"Oczekiwania " ++"miÄ™dzy żądaniami\" może przyspieszyć skany, ale może też uniemożliwić " ++"wykrycie niektórych urzÄ…dzeÅ„." ++ ++msgid "Delete" ++msgstr "UsuÅ„" ++ ++msgid "Device Scan Config" ++msgstr "Konfiguruj skanowanie urzÄ…dzeÅ„" ++ ++msgid "Device Type" ++msgstr "Typ urzÄ…dzenia" ++ ++msgid "Devices discovered for" ++msgstr "Devices discovered for" ++ ++msgid "Devices on Network" ++msgstr "UrzÄ…dzenia w sieci" ++ ++msgid "Edit" ++msgstr "Edytuj" ++ ++msgid "Enable" ++msgstr "WÅ‚Ä…cz" ++ ++msgid "End of MAC address range" ++msgstr "Koniec zakresu adresów MAC" ++ ++msgid "Go to relevant configuration page" ++msgstr "Idź do stosownej strony konfiguracyjnej" ++ ++msgid "IP Address" ++msgstr "Adres IP" ++ ++msgid "Interface" ++msgstr "Interfejs" ++ ++msgid "Invalid" ++msgstr "NieprawidÅ‚owe" ++ ++msgid "Link to Device" ++msgstr "PoÅ‚Ä…czenie do urzÄ…dzenia" ++ ++msgid "MAC Address" ++msgstr "Adres MAC" ++ ++msgid "MAC Device Info Overrides" ++msgstr "Nadpisywanie informacji o adresie MAC urzÄ…dzenia" ++ ++msgid "MAC Device Override" ++msgstr "Pomijanie adresu MAC urzÄ…dzenia" ++ ++msgid "MAC range and information used to override system and IEEE databases" ++msgstr "" ++"Zakres adresów MAC i informacje użyte do zastÄ…pienia baz danych systemowych " ++"i IEEE" ++ ++msgid "Milliseconds to sleep between requests (default 100)" ++msgstr "Ilośś milisekund pauzy pomiÄ™dzy zapytaniami (domyÅ›lnie 100)" ++ ++msgid "Model" ++msgstr "Model" ++ ++msgid "Name" ++msgstr "Nazwa" ++ ++msgid "Network Device Scan" ++msgstr "Skan urzÄ…dzeÅ„ w sieci" ++ ++msgid "Network Device Scanning Configuration" ++msgstr "Ustawienia skanowania urzÄ…dzeÅ„ w sieci" ++ ++msgid "Networks to scan for devices" ++msgstr "Sieci do skanowania w poszukiwaniu urzÄ…dzeÅ„" ++ ++msgid "Networks to scan for supported devices" ++msgstr "Sieci do skanowania w poszukiwaniu wspieranych urzÄ…dzeÅ„" ++ ++msgid "No SIP devices" ++msgstr "Brak urzÄ…dzeÅ„ SIP" ++ ++msgid "No devices detected" ++msgstr "Nie wykryto urzÄ…dzeÅ„" ++ ++msgid "Number of times to send requests (default 1)" ++msgstr "Ilość powtórzeÅ„ wysÅ‚ania żądania (domyÅ›lnie 1)" ++ ++msgid "OUI Owner" ++msgstr "WÅ‚aÅ›ciciel OUI" ++ ++msgid "" ++"Override the information returned by the MAC to Device Info Script (mac-to-" ++"devinfo) for a specified range of MAC Addresses" ++msgstr "" ++"ZastÄ…p informacje zwracanych przez skrypt MAC to Device Info Script (MAC-to-" ++"devinfo) dla okreÅ›lonego zakresu adresów MAC" ++ ++msgid "Perform Scans (this can take a few minutes)" ++msgstr "Wykonaj skany (to może potrwać kilka minut)" ++ ++msgid "Phone Information" ++msgstr "Informacje o telefonie" ++ ++msgid "Phone Scan" ++msgstr "Skanowanie telefonów" ++ ++msgid "Phone Scanning Configuration" ++msgstr "Konfiguracja skanowania telefonu" ++ ++msgid "Phones" ++msgstr "Telefony" ++ ++msgid "Ports" ++msgstr "Porty" ++ ++msgid "Raw" ++msgstr "Surowe" ++ ++msgid "Repeat Count" ++msgstr "Ilość powtórzeÅ„" ++ ++msgid "Repeat Scans (this can take a few minutes)" ++msgstr "Powtórz skany (to może potrwać kilka minut)" ++ ++msgid "SIP Device Information" ++msgstr "Informacje o urzÄ…dzeniu SIP" ++ ++msgid "SIP Device Scan" ++msgstr "Skanowanie urzÄ…dzeÅ„ SIP" ++ ++msgid "SIP Device Scanning Configuration" ++msgstr "Konfiguracja skanowania urzÄ…dzeÅ„ SIP" ++ ++msgid "SIP Devices on Network" ++msgstr "UrzÄ…dzenia SIP w sieci" ++ ++msgid "SIP devices discovered for" ++msgstr "UrzÄ…dzenia SIP znalezione dla" ++ ++msgid "Scan for devices on specified networks." ++msgstr "Skanuj w poszukiwaniu urzÄ…dzeÅ„ w wybranych sieciach." ++ ++msgid "Scan for supported SIP devices on specified networks." ++msgstr "Skanuj w poszukiwaniu wspieranych urzÄ…dzeÅ„ SIP w wybranych sieciach." ++ ++msgid "Scanning Configuration" ++msgstr "Ustawienia skanowania" ++ ++msgid "Scans for devices on specified networks." ++msgstr "Scans for devices on specified networks." ++ ++msgid "Sleep Between Requests" ++msgstr "Pauza pomiÄ™dzy zapytaniami" ++ ++msgid "Subnet" ++msgstr "Podsieć" ++ ++msgid "This section contains no values yet" ++msgstr "Ta sekcja nie zawiera jeszcze wartoÅ›ci" ++ ++msgid "Time to wait for responses in seconds (default 10)" ++msgstr "Czas oczekiwania na odpowiedź w sekundach (domyÅ›lnie 10)" ++ ++msgid "Timeout" ++msgstr "Czas oczekiwania" ++ ++msgid "Use Configuration" ++msgstr "Użyj konfiguracji" ++ ++msgid "Vendor" ++msgstr "Sprzedawca" ++ ++msgid "check other networks" ++msgstr "sprawdź inne sieci" +diff --git a/feeds/luci/applications/luci-app-diag-devinfo/po/pt-br/diag_devinfo.po b/feeds/luci/applications/luci-app-diag-devinfo/po/pt-br/diag_devinfo.po +new file mode 100644 +index 0000000..53face0 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-diag-devinfo/po/pt-br/diag_devinfo.po +@@ -0,0 +1,220 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"PO-Revision-Date: 2011-10-17 23:51+0200\n" ++"Last-Translator: Luiz Angelo \n" ++"Language-Team: none\n" ++"Language: pt_BR\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n > 1);\n" ++"X-Generator: Pootle 2.0.4\n" ++ ++msgid "Actions" ++msgstr "Ações" ++ ++msgid "Add" ++msgstr "Adicionar" ++ ++msgid "Beginning of MAC address range" ++msgstr "Começo da faixa de endereços MAC" ++ ++msgid "Config Phone Scan" ++msgstr "Configurar a Busca por Telefone" ++ ++msgid "Configure" ++msgstr "Configurar" ++ ++msgid "Configure Scans" ++msgstr "Configurar Scans" ++ ++msgid "" ++"Configure scanning for devices on specified networks. Decreasing 'Timeout', " ++"'Repeat Count', and/or 'Sleep Between Requests' may speed up scans, but also " ++"may fail to find some devices." ++msgstr "" ++"Configura busca por dispositivos em redes específicas. Ao se reduzir " ++"'Timeout', 'Repeat Count' e/ou 'Sleep Between Requests' pode-se agilizar " ++"buscas, mas também pode não encontrar alguns dispositivos." ++ ++msgid "" ++"Configure scanning for supported SIP devices on specified networks. " ++"Decreasing 'Timeout', 'Repeat Count', and/or 'Sleep Between Requests' may " ++"speed up scans, but also may fail to find some devices." ++msgstr "" ++"Configura busca por dispositivos com suporte a SIP em redes específicas. Ao " ++"se reduzir 'Timeout', 'Repeat Count' e/ou 'Sleep Between Requests' pode-se " ++"agilizar buscas, mas também pode não encontrar alguns dispositivos." ++ ++msgid "Delete" ++msgstr "Apagar" ++ ++msgid "Device Scan Config" ++msgstr "Configurar a Busca por Dispositivos" ++ ++msgid "Device Type" ++msgstr "Tipo de dispositivo" ++ ++msgid "Devices discovered for" ++msgstr "Dispositivos descobertos para" ++ ++msgid "Devices on Network" ++msgstr "Dispositivos na Rede" ++ ++msgid "Edit" ++msgstr "Editar" ++ ++msgid "Enable" ++msgstr "Habilitar" ++ ++msgid "End of MAC address range" ++msgstr "Final da faixa de endereços MAC" ++ ++msgid "Go to relevant configuration page" ++msgstr "Vá para página de configuração relevante" ++ ++msgid "IP Address" ++msgstr "Endereço IP" ++ ++msgid "Interface" ++msgstr "Interface" ++ ++msgid "Invalid" ++msgstr "Inválido" ++ ++# Link like or network link? ++msgid "Link to Device" ++msgstr "Ligar ao Dispositivo" ++ ++msgid "MAC Address" ++msgstr "Endereço MAC" ++ ++msgid "MAC Device Info Overrides" ++msgstr "Sobrescrição da informação do dispositivo MAC" ++ ++msgid "MAC Device Override" ++msgstr "Sobrescreve o Dispositivo MAC" ++ ++msgid "MAC range and information used to override system and IEEE databases" ++msgstr "" ++"Faixa MAC e informação usada para sobrescrever os bancos de dados do sistema " ++"e IEEE" ++ ++msgid "Milliseconds to sleep between requests (default 100)" ++msgstr "Milissegundos para esperar entre requisições (padrão 100)" ++ ++msgid "Model" ++msgstr "Modelo" ++ ++msgid "Name" ++msgstr "Nome" ++ ++msgid "Network Device Scan" ++msgstr "Busca por dispositivo de rede" ++ ++msgid "Network Device Scanning Configuration" ++msgstr "Configuração de busca por dispositivo de rede" ++ ++msgid "Networks to scan for devices" ++msgstr "Redes a serem pesquisadas por dispositivos" ++ ++msgid "Networks to scan for supported devices" ++msgstr "Redes a serem pesquisadas por dispositivos suportados" ++ ++msgid "No SIP devices" ++msgstr "Nenhum dispositivo SIP" ++ ++msgid "No devices detected" ++msgstr "Nenhum dispositivo detectado" ++ ++msgid "Number of times to send requests (default 1)" ++msgstr "Número de vezes para enviar requisições (padrão 1 )" ++ ++msgid "OUI Owner" ++msgstr "Dono da OUI" ++ ++msgid "" ++"Override the information returned by the MAC to Device Info Script (mac-to-" ++"devinfo) for a specified range of MAC Addresses" ++msgstr "" ++"Sobrescrever a informação retornada pelo MAC para o Script de Informação do " ++"Dispositivo (mac-to_devinfo) para uma faixa especificada de Endereços MAC" ++ ++msgid "Perform Scans (this can take a few minutes)" ++msgstr "Realiza buscas (pode levar alguns minutos)" ++ ++msgid "Phone Information" ++msgstr "Informação do Telefone" ++ ++msgid "Phone Scan" ++msgstr "Busca por Telefone" ++ ++msgid "Phone Scanning Configuration" ++msgstr "Configuração da Busca por Telefone" ++ ++msgid "Phones" ++msgstr "Telefones" ++ ++msgid "Ports" ++msgstr "Portas" ++ ++msgid "Raw" ++msgstr "Bruto" ++ ++msgid "Repeat Count" ++msgstr "Quantidade de Repetições" ++ ++msgid "Repeat Scans (this can take a few minutes)" ++msgstr "Buscas Repetidas (pode levar alguns minutos)" ++ ++msgid "SIP Device Information" ++msgstr "Informação de Dispositivo SIP" ++ ++msgid "SIP Device Scan" ++msgstr "Busca por Dispositivos SIP" ++ ++msgid "SIP Device Scanning Configuration" ++msgstr "Configuração da Busca por Dispositivos SIP" ++ ++msgid "SIP Devices on Network" ++msgstr "Dispositivos SIP na Rede" ++ ++msgid "SIP devices discovered for" ++msgstr "Dispositivos SIP descobertos para" ++ ++msgid "Scan for devices on specified networks." ++msgstr "Busca por dispositivos nas redes especificadas." ++ ++msgid "Scan for supported SIP devices on specified networks." ++msgstr "Busca por dispositivos com suporte a SIP em redes especificadas." ++ ++msgid "Scanning Configuration" ++msgstr "Configuração de busca" ++ ++msgid "Scans for devices on specified networks." ++msgstr "Busca por dispositivos nas redes especificadas." ++ ++msgid "Sleep Between Requests" ++msgstr "Espera Entre Requisições" ++ ++msgid "Subnet" ++msgstr "Subrede" ++ ++msgid "This section contains no values yet" ++msgstr "Esta seção contém nenhum valor ainda" ++ ++msgid "Time to wait for responses in seconds (default 10)" ++msgstr "Tempo para esperar por respostas em segundos (padrão 10)" ++ ++msgid "Timeout" ++msgstr "Estouro de tempo" ++ ++msgid "Use Configuration" ++msgstr "Usar configuração" ++ ++msgid "Vendor" ++msgstr "Fabricante" ++ ++msgid "check other networks" ++msgstr "verifique outras redes" +diff --git a/feeds/luci/applications/luci-app-diag-devinfo/po/pt/diag_devinfo.po b/feeds/luci/applications/luci-app-diag-devinfo/po/pt/diag_devinfo.po +new file mode 100644 +index 0000000..afe4885 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-diag-devinfo/po/pt/diag_devinfo.po +@@ -0,0 +1,209 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"PO-Revision-Date: 2013-06-03 12:23+0200\n" ++"Last-Translator: joao.f.vieira \n" ++"Language-Team: none\n" ++"Language: pt\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n != 1);\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "Actions" ++msgstr "Acções" ++ ++msgid "Add" ++msgstr "Adicionar" ++ ++msgid "Beginning of MAC address range" ++msgstr "Inicio da gama de endereços MAC" ++ ++msgid "Config Phone Scan" ++msgstr "" ++ ++msgid "Configure" ++msgstr "Configurar" ++ ++msgid "Configure Scans" ++msgstr "" ++ ++msgid "" ++"Configure scanning for devices on specified networks. Decreasing 'Timeout', " ++"'Repeat Count', and/or 'Sleep Between Requests' may speed up scans, but also " ++"may fail to find some devices." ++msgstr "" ++ ++msgid "" ++"Configure scanning for supported SIP devices on specified networks. " ++"Decreasing 'Timeout', 'Repeat Count', and/or 'Sleep Between Requests' may " ++"speed up scans, but also may fail to find some devices." ++msgstr "" ++ ++msgid "Delete" ++msgstr "Apagar" ++ ++msgid "Device Scan Config" ++msgstr "" ++ ++msgid "Device Type" ++msgstr "Tipo de Dispositivo" ++ ++msgid "Devices discovered for" ++msgstr "Dispositivos descobertos para" ++ ++msgid "Devices on Network" ++msgstr "Dispositivos na Rede" ++ ++msgid "Edit" ++msgstr "Editar" ++ ++msgid "Enable" ++msgstr "Ativar" ++ ++msgid "End of MAC address range" ++msgstr "Fim da gama de endereços MAC" ++ ++msgid "Go to relevant configuration page" ++msgstr "" ++ ++msgid "IP Address" ++msgstr "Endereço IP" ++ ++msgid "Interface" ++msgstr "Interface" ++ ++msgid "Invalid" ++msgstr "Inválido" ++ ++msgid "Link to Device" ++msgstr "" ++ ++msgid "MAC Address" ++msgstr "Endereço MAC" ++ ++msgid "MAC Device Info Overrides" ++msgstr "" ++ ++msgid "MAC Device Override" ++msgstr "" ++ ++msgid "MAC range and information used to override system and IEEE databases" ++msgstr "" ++ ++msgid "Milliseconds to sleep between requests (default 100)" ++msgstr "" ++ ++msgid "Model" ++msgstr "Modelo" ++ ++msgid "Name" ++msgstr "Nome" ++ ++msgid "Network Device Scan" ++msgstr "" ++ ++msgid "Network Device Scanning Configuration" ++msgstr "" ++ ++msgid "Networks to scan for devices" ++msgstr "" ++ ++msgid "Networks to scan for supported devices" ++msgstr "" ++ ++msgid "No SIP devices" ++msgstr "Não há dispositivos SIP" ++ ++msgid "No devices detected" ++msgstr "Não foram detetados dispositivos" ++ ++msgid "Number of times to send requests (default 1)" ++msgstr "" ++ ++msgid "OUI Owner" ++msgstr "Dono OUI" ++ ++msgid "" ++"Override the information returned by the MAC to Device Info Script (mac-to-" ++"devinfo) for a specified range of MAC Addresses" ++msgstr "" ++ ++msgid "Perform Scans (this can take a few minutes)" ++msgstr "" ++ ++msgid "Phone Information" ++msgstr "Informação do Telefone" ++ ++msgid "Phone Scan" ++msgstr "" ++ ++msgid "Phone Scanning Configuration" ++msgstr "" ++ ++msgid "Phones" ++msgstr "" ++ ++msgid "Ports" ++msgstr "Portas" ++ ++msgid "Raw" ++msgstr "" ++ ++msgid "Repeat Count" ++msgstr "Repetir Contagem" ++ ++msgid "Repeat Scans (this can take a few minutes)" ++msgstr "" ++ ++msgid "SIP Device Information" ++msgstr "" ++ ++msgid "SIP Device Scan" ++msgstr "" ++ ++msgid "SIP Device Scanning Configuration" ++msgstr "" ++ ++msgid "SIP Devices on Network" ++msgstr "" ++ ++msgid "SIP devices discovered for" ++msgstr "" ++ ++msgid "Scan for devices on specified networks." ++msgstr "" ++ ++msgid "Scan for supported SIP devices on specified networks." ++msgstr "" ++ ++msgid "Scanning Configuration" ++msgstr "" ++ ++msgid "Scans for devices on specified networks." ++msgstr "" ++ ++msgid "Sleep Between Requests" ++msgstr "" ++ ++msgid "Subnet" ++msgstr "Sub-rede" ++ ++msgid "This section contains no values yet" ++msgstr "" ++ ++msgid "Time to wait for responses in seconds (default 10)" ++msgstr "" ++ ++msgid "Timeout" ++msgstr "" ++ ++msgid "Use Configuration" ++msgstr "" ++ ++msgid "Vendor" ++msgstr "" ++ ++msgid "check other networks" ++msgstr "verificar outras redes" +diff --git a/feeds/luci/applications/luci-app-diag-devinfo/po/ro/diag_devinfo.po b/feeds/luci/applications/luci-app-diag-devinfo/po/ro/diag_devinfo.po +new file mode 100644 +index 0000000..eefbd5e +--- /dev/null ++++ b/feeds/luci/applications/luci-app-diag-devinfo/po/ro/diag_devinfo.po +@@ -0,0 +1,210 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"PO-Revision-Date: 2014-07-09 14:27+0200\n" ++"Last-Translator: lex404 \n" ++"Language-Team: none\n" ++"Language: ro\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=3; plural=(n==1 ? 0 : (n==0 || (n%100 > 0 && n%100 < " ++"20)) ? 1 : 2);;\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "Actions" ++msgstr "AcÈ›iuni" ++ ++msgid "Add" ++msgstr "Adauga" ++ ++msgid "Beginning of MAC address range" ++msgstr "" ++ ++msgid "Config Phone Scan" ++msgstr "Configureaza scanarea telefonului" ++ ++msgid "Configure" ++msgstr "Configureaza" ++ ++msgid "Configure Scans" ++msgstr "Configurează scanări" ++ ++msgid "" ++"Configure scanning for devices on specified networks. Decreasing 'Timeout', " ++"'Repeat Count', and/or 'Sleep Between Requests' may speed up scans, but also " ++"may fail to find some devices." ++msgstr "" ++ ++msgid "" ++"Configure scanning for supported SIP devices on specified networks. " ++"Decreasing 'Timeout', 'Repeat Count', and/or 'Sleep Between Requests' may " ++"speed up scans, but also may fail to find some devices." ++msgstr "" ++ ++msgid "Delete" ++msgstr "Sterge" ++ ++msgid "Device Scan Config" ++msgstr "Configureaza scanarea dispozitivului" ++ ++msgid "Device Type" ++msgstr "" ++ ++msgid "Devices discovered for" ++msgstr "Dispozitive descoperite pentru" ++ ++msgid "Devices on Network" ++msgstr "Dispozitive in retea" ++ ++msgid "Edit" ++msgstr "Editeaza" ++ ++msgid "Enable" ++msgstr "Activeaza" ++ ++msgid "End of MAC address range" ++msgstr "" ++ ++msgid "Go to relevant configuration page" ++msgstr "" ++ ++msgid "IP Address" ++msgstr "Adresa IP" ++ ++msgid "Interface" ++msgstr "Interfata" ++ ++msgid "Invalid" ++msgstr "Invalid" ++ ++msgid "Link to Device" ++msgstr "Legatura spre dispozitiv" ++ ++msgid "MAC Address" ++msgstr "Adresa MAC" ++ ++msgid "MAC Device Info Overrides" ++msgstr "" ++ ++msgid "MAC Device Override" ++msgstr "" ++ ++msgid "MAC range and information used to override system and IEEE databases" ++msgstr "" ++ ++msgid "Milliseconds to sleep between requests (default 100)" ++msgstr "Milisecunde de asteptare intre cereri (100 implicit)" ++ ++msgid "Model" ++msgstr "" ++ ++msgid "Name" ++msgstr "Nume" ++ ++msgid "Network Device Scan" ++msgstr "" ++ ++msgid "Network Device Scanning Configuration" ++msgstr "" ++ ++msgid "Networks to scan for devices" ++msgstr "" ++ ++msgid "Networks to scan for supported devices" ++msgstr "" ++ ++msgid "No SIP devices" ++msgstr "Nici un device SIP" ++ ++msgid "No devices detected" ++msgstr "Nici un dispozitiv detectat" ++ ++msgid "Number of times to send requests (default 1)" ++msgstr "Numarul de trimiteri cereri (1 implicit)" ++ ++msgid "OUI Owner" ++msgstr "" ++ ++msgid "" ++"Override the information returned by the MAC to Device Info Script (mac-to-" ++"devinfo) for a specified range of MAC Addresses" ++msgstr "" ++ ++msgid "Perform Scans (this can take a few minutes)" ++msgstr "" ++ ++msgid "Phone Information" ++msgstr "Informatii despre telefon" ++ ++msgid "Phone Scan" ++msgstr "Scanare telefon" ++ ++msgid "Phone Scanning Configuration" ++msgstr "" ++ ++msgid "Phones" ++msgstr "Telefoane" ++ ++msgid "Ports" ++msgstr "" ++ ++msgid "Raw" ++msgstr "" ++ ++msgid "Repeat Count" ++msgstr "Numarul de repetitii" ++ ++msgid "Repeat Scans (this can take a few minutes)" ++msgstr "" ++ ++msgid "SIP Device Information" ++msgstr "Informatii despre dispozitivul SIP" ++ ++msgid "SIP Device Scan" ++msgstr "Scanare dispozitiv SIP" ++ ++msgid "SIP Device Scanning Configuration" ++msgstr "Configurarea scanarii dispozitivului SIP" ++ ++msgid "SIP Devices on Network" ++msgstr "Dispozitive SIP in retea" ++ ++msgid "SIP devices discovered for" ++msgstr "" ++ ++msgid "Scan for devices on specified networks." ++msgstr "" ++ ++msgid "Scan for supported SIP devices on specified networks." ++msgstr "" ++ ++msgid "Scanning Configuration" ++msgstr "" ++ ++msgid "Scans for devices on specified networks." ++msgstr "" ++ ++msgid "Sleep Between Requests" ++msgstr "Pauza dintre cereri" ++ ++msgid "Subnet" ++msgstr "" ++ ++msgid "This section contains no values yet" ++msgstr "" ++ ++msgid "Time to wait for responses in seconds (default 10)" ++msgstr "Timpul de asteptare pentru raspunsuri in secunde (10 implicit)" ++ ++msgid "Timeout" ++msgstr "" ++ ++msgid "Use Configuration" ++msgstr "" ++ ++msgid "Vendor" ++msgstr "" ++ ++msgid "check other networks" ++msgstr "verifica alte retele" +diff --git a/feeds/luci/applications/luci-app-diag-devinfo/po/ru/diag_devinfo.po b/feeds/luci/applications/luci-app-diag-devinfo/po/ru/diag_devinfo.po +new file mode 100644 +index 0000000..7531dde +--- /dev/null ++++ b/feeds/luci/applications/luci-app-diag-devinfo/po/ru/diag_devinfo.po +@@ -0,0 +1,223 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: LuCI: diag_devinfo\n" ++"POT-Creation-Date: \n" ++"PO-Revision-Date: 2014-01-31 21:07+0200\n" ++"Last-Translator: Moon_dark \n" ++"Language-Team: Russian \n" ++"Language: ru\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%" ++"10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" ++"X-Generator: Pootle 2.0.6\n" ++"X-Poedit-SourceCharset: UTF-8\n" ++ ++msgid "Actions" ++msgstr "ДейÑтвиÑ" ++ ++msgid "Add" ++msgstr "Добавить" ++ ++msgid "Beginning of MAC address range" ++msgstr "Ðачало диапазона MAC-адреÑов" ++ ++msgid "Config Phone Scan" ++msgstr "ÐаÑтроить Ñканирование телефонов" ++ ++msgid "Configure" ++msgstr "ÐаÑтроить" ++ ++msgid "Configure Scans" ++msgstr "ÐаÑтроить Ñканирование" ++ ++msgid "" ++"Configure scanning for devices on specified networks. Decreasing 'Timeout', " ++"'Repeat Count', and/or 'Sleep Between Requests' may speed up scans, but also " ++"may fail to find some devices." ++msgstr "" ++"ÐаÑтроить Ñканирование уÑтройÑтв в указанных ÑетÑÑ…. Уменьшение таймаута, " ++"количеÑтва повторов и/или паузы между запроÑами может уÑкорить Ñканирование, " ++"но также вызвать проблемы поиÑка некоторых уÑтройÑтв." ++ ++msgid "" ++"Configure scanning for supported SIP devices on specified networks. " ++"Decreasing 'Timeout', 'Repeat Count', and/or 'Sleep Between Requests' may " ++"speed up scans, but also may fail to find some devices." ++msgstr "" ++"ÐаÑтроить Ñканирование поддерживаемых SIP-уÑтройÑтв в указанных ÑетÑÑ…. " ++"Уменьшение таймаута, количеÑтва повторов и/или паузы между запроÑами может " ++"уÑкорить Ñканирование, но также вызвать проблемы поиÑка некоторых уÑтройÑтв." ++ ++msgid "Delete" ++msgstr "Удалить" ++ ++msgid "Device Scan Config" ++msgstr "ÐšÐ¾Ð½Ñ„Ð¸Ð³ÑƒÑ€Ð°Ñ†Ð¸Ñ ÑÐºÐ°Ð½Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ ÑƒÑтройÑтва" ++ ++msgid "Device Type" ++msgstr "Тип уÑтройÑтва" ++ ++msgid "Devices discovered for" ++msgstr "УÑтройÑтва, найденные в" ++ ++msgid "Devices on Network" ++msgstr "УÑтройÑтва в Ñети" ++ ++msgid "Edit" ++msgstr "Редактировать" ++ ++msgid "Enable" ++msgstr "Включить" ++ ++msgid "End of MAC address range" ++msgstr "Конец диапазона MAC адреÑов" ++ ++msgid "Go to relevant configuration page" ++msgstr "Перейти на ÑоответÑтвующую Ñтраницу конфигурации" ++ ++msgid "IP Address" ++msgstr "IP-адреÑ" ++ ++msgid "Interface" ++msgstr "ИнтерфейÑ" ++ ++msgid "Invalid" ++msgstr "Ðеверный" ++ ++msgid "Link to Device" ++msgstr "Соединение Ñ ÑƒÑтройÑтвом" ++ ++msgid "MAC Address" ++msgstr "MAC-адреÑ" ++ ++#, fuzzy ++msgid "MAC Device Info Overrides" ++msgstr "Переопределение информации о MAC-уÑтройÑтве" ++ ++msgid "MAC Device Override" ++msgstr "Задать MAC-Ð°Ð´Ñ€ÐµÑ ÑƒÑтройÑтва" ++ ++msgid "MAC range and information used to override system and IEEE databases" ++msgstr "" ++"Диапазон MAC-адреÑов и Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð´Ð»Ñ Ð¿ÐµÑ€ÐµÐ¾Ð¿Ñ€ÐµÐ´ÐµÐ»ÐµÐ½Ð¸Ñ ÑиÑтемной базы данных " ++"и базы данных IEEE" ++ ++msgid "Milliseconds to sleep between requests (default 100)" ++msgstr "Ð’Ñ€ÐµÐ¼Ñ Ð±ÐµÐ·Ð´ÐµÐ¹ÑÑ‚Ð²Ð¸Ñ Ð¼ÐµÐ¶Ð´Ñƒ запроÑами (мÑ, 100 по умолчанию)" ++ ++msgid "Model" ++msgstr "Модель" ++ ++msgid "Name" ++msgstr "ИмÑ" ++ ++msgid "Network Device Scan" ++msgstr "Сканирование Ñетевых уÑтройÑтв" ++ ++msgid "Network Device Scanning Configuration" ++msgstr "ÐšÐ¾Ð½Ñ„Ð¸Ð³ÑƒÑ€Ð°Ñ†Ð¸Ñ ÑÐºÐ°Ð½Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ñетевых уÑтройÑтв" ++ ++msgid "Networks to scan for devices" ++msgstr "Сети, в которых производить Ñканирование уÑтройÑтв" ++ ++msgid "Networks to scan for supported devices" ++msgstr "Сети, в которых производить Ñканирование поддерживаемых уÑтройÑтв" ++ ++msgid "No SIP devices" ++msgstr "SIP-уÑтройÑтва отÑутÑтвуют" ++ ++msgid "No devices detected" ++msgstr "УÑтройÑтва не обнаружены" ++ ++msgid "Number of times to send requests (default 1)" ++msgstr "КоличеÑтво запроÑов (1 по умолчанию)" ++ ++msgid "OUI Owner" ++msgstr "Владелец OUI" ++ ++msgid "" ++"Override the information returned by the MAC to Device Info Script (mac-to-" ++"devinfo) for a specified range of MAC Addresses" ++msgstr "" ++"Переопределить значениÑ, полученные из Ñкрипта \"MAC to Device\" (mac-to-" ++"devinfo), Ð´Ð»Ñ Ð·Ð°Ð´Ð°Ð½Ð½Ð¾Ð³Ð¾ диапазона MAC-адреÑов" ++ ++msgid "Perform Scans (this can take a few minutes)" ++msgstr "ПроизвеÑти Ñканирование (Ñто может занÑÑ‚ÑŒ неÑколько минут)" ++ ++msgid "Phone Information" ++msgstr "Ð˜Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð¾ телефоне" ++ ++msgid "Phone Scan" ++msgstr "Сканировать телефоны" ++ ++msgid "Phone Scanning Configuration" ++msgstr "ÐšÐ¾Ð½Ñ„Ð¸Ð³ÑƒÑ€Ð°Ñ†Ð¸Ñ ÑÐºÐ°Ð½Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ñ‚ÐµÐ»ÐµÑ„Ð¾Ð½Ð¾Ð²" ++ ++msgid "Phones" ++msgstr "Телефоны" ++ ++msgid "Ports" ++msgstr "Порты" ++ ++msgid "Raw" ++msgstr "Ðеобработанные (Ñырые) данные" ++ ++msgid "Repeat Count" ++msgstr "КоличеÑтво повторов" ++ ++msgid "Repeat Scans (this can take a few minutes)" ++msgstr "Повторить Ñканирование (Ñто может занÑÑ‚ÑŒ неÑколько минут)" ++ ++msgid "SIP Device Information" ++msgstr "Ð˜Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð¾ SIP-уÑтройÑтве" ++ ++msgid "SIP Device Scan" ++msgstr "Сканировать SIP-уÑтройÑтва" ++ ++msgid "SIP Device Scanning Configuration" ++msgstr "ÐšÐ¾Ð½Ñ„Ð¸Ð³ÑƒÑ€Ð°Ñ†Ð¸Ñ ÑÐºÐ°Ð½Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ SIP-уÑтройÑтв" ++ ++msgid "SIP Devices on Network" ++msgstr "SIP-уÑтройÑтва в Ñети" ++ ++msgid "SIP devices discovered for" ++msgstr "SIP-уÑтройÑтва, найденные в" ++ ++msgid "Scan for devices on specified networks." ++msgstr "Сканировать уÑтройÑтва в заданных ÑетÑÑ…." ++ ++msgid "Scan for supported SIP devices on specified networks." ++msgstr "Сканировать поддерживаемые SIP-уÑтройÑтва в заданных ÑетÑÑ…." ++ ++msgid "Scanning Configuration" ++msgstr "ÐšÐ¾Ð½Ñ„Ð¸Ð³ÑƒÑ€Ð°Ñ†Ð¸Ñ ÑканированиÑ" ++ ++msgid "Scans for devices on specified networks." ++msgstr "Сканирует уÑтройÑтва в заданных ÑетÑÑ…." ++ ++msgid "Sleep Between Requests" ++msgstr "Пауза между запроÑами" ++ ++msgid "Subnet" ++msgstr "ПодÑеть" ++ ++msgid "This section contains no values yet" ++msgstr "Эта ÑÐµÐºÑ†Ð¸Ñ Ð¿Ð¾ÐºÐ° не Ñодержит значений." ++ ++msgid "Time to wait for responses in seconds (default 10)" ++msgstr "Ð’Ñ€ÐµÐ¼Ñ Ð¾Ð¶Ð¸Ð´Ð°Ð½Ð¸Ñ Ð¾Ñ‚Ð²ÐµÑ‚Ð¾Ð² (Ñек, 10 по умолчанию)" ++ ++msgid "Timeout" ++msgstr "Таймаут" ++ ++msgid "Use Configuration" ++msgstr "ИÑпользовать конфигурацию" ++ ++msgid "Vendor" ++msgstr "Производитель" ++ ++msgid "check other networks" ++msgstr "проверить другие Ñети" +diff --git a/feeds/luci/applications/luci-app-diag-devinfo/po/sk/diag_devinfo.po b/feeds/luci/applications/luci-app-diag-devinfo/po/sk/diag_devinfo.po +new file mode 100644 +index 0000000..0d62204 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-diag-devinfo/po/sk/diag_devinfo.po +@@ -0,0 +1,206 @@ ++msgid "" ++msgstr "" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Last-Translator: Automatically generated\n" ++"Language-Team: none\n" ++"MIME-Version: 1.0\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n" ++ ++msgid "Actions" ++msgstr "" ++ ++msgid "Add" ++msgstr "" ++ ++msgid "Beginning of MAC address range" ++msgstr "" ++ ++msgid "Config Phone Scan" ++msgstr "" ++ ++msgid "Configure" ++msgstr "" ++ ++msgid "Configure Scans" ++msgstr "" ++ ++msgid "" ++"Configure scanning for devices on specified networks. Decreasing 'Timeout', " ++"'Repeat Count', and/or 'Sleep Between Requests' may speed up scans, but also " ++"may fail to find some devices." ++msgstr "" ++ ++msgid "" ++"Configure scanning for supported SIP devices on specified networks. " ++"Decreasing 'Timeout', 'Repeat Count', and/or 'Sleep Between Requests' may " ++"speed up scans, but also may fail to find some devices." ++msgstr "" ++ ++msgid "Delete" ++msgstr "" ++ ++msgid "Device Scan Config" ++msgstr "" ++ ++msgid "Device Type" ++msgstr "" ++ ++msgid "Devices discovered for" ++msgstr "" ++ ++msgid "Devices on Network" ++msgstr "" ++ ++msgid "Edit" ++msgstr "" ++ ++msgid "Enable" ++msgstr "" ++ ++msgid "End of MAC address range" ++msgstr "" ++ ++msgid "Go to relevant configuration page" ++msgstr "" ++ ++msgid "IP Address" ++msgstr "" ++ ++msgid "Interface" ++msgstr "" ++ ++msgid "Invalid" ++msgstr "" ++ ++msgid "Link to Device" ++msgstr "" ++ ++msgid "MAC Address" ++msgstr "" ++ ++msgid "MAC Device Info Overrides" ++msgstr "" ++ ++msgid "MAC Device Override" ++msgstr "" ++ ++msgid "MAC range and information used to override system and IEEE databases" ++msgstr "" ++ ++msgid "Milliseconds to sleep between requests (default 100)" ++msgstr "" ++ ++msgid "Model" ++msgstr "" ++ ++msgid "Name" ++msgstr "" ++ ++msgid "Network Device Scan" ++msgstr "" ++ ++msgid "Network Device Scanning Configuration" ++msgstr "" ++ ++msgid "Networks to scan for devices" ++msgstr "" ++ ++msgid "Networks to scan for supported devices" ++msgstr "" ++ ++msgid "No SIP devices" ++msgstr "" ++ ++msgid "No devices detected" ++msgstr "" ++ ++msgid "Number of times to send requests (default 1)" ++msgstr "" ++ ++msgid "OUI Owner" ++msgstr "" ++ ++msgid "" ++"Override the information returned by the MAC to Device Info Script (mac-to-" ++"devinfo) for a specified range of MAC Addresses" ++msgstr "" ++ ++msgid "Perform Scans (this can take a few minutes)" ++msgstr "" ++ ++msgid "Phone Information" ++msgstr "" ++ ++msgid "Phone Scan" ++msgstr "" ++ ++msgid "Phone Scanning Configuration" ++msgstr "" ++ ++msgid "Phones" ++msgstr "" ++ ++msgid "Ports" ++msgstr "" ++ ++msgid "Raw" ++msgstr "" ++ ++msgid "Repeat Count" ++msgstr "" ++ ++msgid "Repeat Scans (this can take a few minutes)" ++msgstr "" ++ ++msgid "SIP Device Information" ++msgstr "" ++ ++msgid "SIP Device Scan" ++msgstr "" ++ ++msgid "SIP Device Scanning Configuration" ++msgstr "" ++ ++msgid "SIP Devices on Network" ++msgstr "" ++ ++msgid "SIP devices discovered for" ++msgstr "" ++ ++msgid "Scan for devices on specified networks." ++msgstr "" ++ ++msgid "Scan for supported SIP devices on specified networks." ++msgstr "" ++ ++msgid "Scanning Configuration" ++msgstr "" ++ ++msgid "Scans for devices on specified networks." ++msgstr "" ++ ++msgid "Sleep Between Requests" ++msgstr "" ++ ++msgid "Subnet" ++msgstr "" ++ ++msgid "This section contains no values yet" ++msgstr "" ++ ++msgid "Time to wait for responses in seconds (default 10)" ++msgstr "" ++ ++msgid "Timeout" ++msgstr "" ++ ++msgid "Use Configuration" ++msgstr "" ++ ++msgid "Vendor" ++msgstr "" ++ ++msgid "check other networks" ++msgstr "" +diff --git a/feeds/luci/applications/luci-app-diag-devinfo/po/sv/diag_devinfo.po b/feeds/luci/applications/luci-app-diag-devinfo/po/sv/diag_devinfo.po +new file mode 100644 +index 0000000..cf74fbc +--- /dev/null ++++ b/feeds/luci/applications/luci-app-diag-devinfo/po/sv/diag_devinfo.po +@@ -0,0 +1,207 @@ ++msgid "" ++msgstr "" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Last-Translator: Automatically generated\n" ++"Language-Team: none\n" ++"Language: sv\n" ++"MIME-Version: 1.0\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n != 1);\n" ++ ++msgid "Actions" ++msgstr "" ++ ++msgid "Add" ++msgstr "" ++ ++msgid "Beginning of MAC address range" ++msgstr "" ++ ++msgid "Config Phone Scan" ++msgstr "" ++ ++msgid "Configure" ++msgstr "" ++ ++msgid "Configure Scans" ++msgstr "" ++ ++msgid "" ++"Configure scanning for devices on specified networks. Decreasing 'Timeout', " ++"'Repeat Count', and/or 'Sleep Between Requests' may speed up scans, but also " ++"may fail to find some devices." ++msgstr "" ++ ++msgid "" ++"Configure scanning for supported SIP devices on specified networks. " ++"Decreasing 'Timeout', 'Repeat Count', and/or 'Sleep Between Requests' may " ++"speed up scans, but also may fail to find some devices." ++msgstr "" ++ ++msgid "Delete" ++msgstr "" ++ ++msgid "Device Scan Config" ++msgstr "" ++ ++msgid "Device Type" ++msgstr "" ++ ++msgid "Devices discovered for" ++msgstr "" ++ ++msgid "Devices on Network" ++msgstr "" ++ ++msgid "Edit" ++msgstr "" ++ ++msgid "Enable" ++msgstr "" ++ ++msgid "End of MAC address range" ++msgstr "" ++ ++msgid "Go to relevant configuration page" ++msgstr "" ++ ++msgid "IP Address" ++msgstr "" ++ ++msgid "Interface" ++msgstr "" ++ ++msgid "Invalid" ++msgstr "" ++ ++msgid "Link to Device" ++msgstr "" ++ ++msgid "MAC Address" ++msgstr "" ++ ++msgid "MAC Device Info Overrides" ++msgstr "" ++ ++msgid "MAC Device Override" ++msgstr "" ++ ++msgid "MAC range and information used to override system and IEEE databases" ++msgstr "" ++ ++msgid "Milliseconds to sleep between requests (default 100)" ++msgstr "" ++ ++msgid "Model" ++msgstr "" ++ ++msgid "Name" ++msgstr "" ++ ++msgid "Network Device Scan" ++msgstr "" ++ ++msgid "Network Device Scanning Configuration" ++msgstr "" ++ ++msgid "Networks to scan for devices" ++msgstr "" ++ ++msgid "Networks to scan for supported devices" ++msgstr "" ++ ++msgid "No SIP devices" ++msgstr "" ++ ++msgid "No devices detected" ++msgstr "" ++ ++msgid "Number of times to send requests (default 1)" ++msgstr "" ++ ++msgid "OUI Owner" ++msgstr "" ++ ++msgid "" ++"Override the information returned by the MAC to Device Info Script (mac-to-" ++"devinfo) for a specified range of MAC Addresses" ++msgstr "" ++ ++msgid "Perform Scans (this can take a few minutes)" ++msgstr "" ++ ++msgid "Phone Information" ++msgstr "" ++ ++msgid "Phone Scan" ++msgstr "" ++ ++msgid "Phone Scanning Configuration" ++msgstr "" ++ ++msgid "Phones" ++msgstr "" ++ ++msgid "Ports" ++msgstr "" ++ ++msgid "Raw" ++msgstr "" ++ ++msgid "Repeat Count" ++msgstr "" ++ ++msgid "Repeat Scans (this can take a few minutes)" ++msgstr "" ++ ++msgid "SIP Device Information" ++msgstr "" ++ ++msgid "SIP Device Scan" ++msgstr "" ++ ++msgid "SIP Device Scanning Configuration" ++msgstr "" ++ ++msgid "SIP Devices on Network" ++msgstr "" ++ ++msgid "SIP devices discovered for" ++msgstr "" ++ ++msgid "Scan for devices on specified networks." ++msgstr "" ++ ++msgid "Scan for supported SIP devices on specified networks." ++msgstr "" ++ ++msgid "Scanning Configuration" ++msgstr "" ++ ++msgid "Scans for devices on specified networks." ++msgstr "" ++ ++msgid "Sleep Between Requests" ++msgstr "" ++ ++msgid "Subnet" ++msgstr "" ++ ++msgid "This section contains no values yet" ++msgstr "" ++ ++msgid "Time to wait for responses in seconds (default 10)" ++msgstr "" ++ ++msgid "Timeout" ++msgstr "" ++ ++msgid "Use Configuration" ++msgstr "" ++ ++msgid "Vendor" ++msgstr "" ++ ++msgid "check other networks" ++msgstr "" +diff --git a/feeds/luci/applications/luci-app-diag-devinfo/po/templates/diag_devinfo.pot b/feeds/luci/applications/luci-app-diag-devinfo/po/templates/diag_devinfo.pot +new file mode 100644 +index 0000000..350466c +--- /dev/null ++++ b/feeds/luci/applications/luci-app-diag-devinfo/po/templates/diag_devinfo.pot +@@ -0,0 +1,199 @@ ++msgid "" ++msgstr "Content-Type: text/plain; charset=UTF-8" ++ ++msgid "Actions" ++msgstr "" ++ ++msgid "Add" ++msgstr "" ++ ++msgid "Beginning of MAC address range" ++msgstr "" ++ ++msgid "Config Phone Scan" ++msgstr "" ++ ++msgid "Configure" ++msgstr "" ++ ++msgid "Configure Scans" ++msgstr "" ++ ++msgid "" ++"Configure scanning for devices on specified networks. Decreasing 'Timeout', " ++"'Repeat Count', and/or 'Sleep Between Requests' may speed up scans, but also " ++"may fail to find some devices." ++msgstr "" ++ ++msgid "" ++"Configure scanning for supported SIP devices on specified networks. " ++"Decreasing 'Timeout', 'Repeat Count', and/or 'Sleep Between Requests' may " ++"speed up scans, but also may fail to find some devices." ++msgstr "" ++ ++msgid "Delete" ++msgstr "" ++ ++msgid "Device Scan Config" ++msgstr "" ++ ++msgid "Device Type" ++msgstr "" ++ ++msgid "Devices discovered for" ++msgstr "" ++ ++msgid "Devices on Network" ++msgstr "" ++ ++msgid "Edit" ++msgstr "" ++ ++msgid "Enable" ++msgstr "" ++ ++msgid "End of MAC address range" ++msgstr "" ++ ++msgid "Go to relevant configuration page" ++msgstr "" ++ ++msgid "IP Address" ++msgstr "" ++ ++msgid "Interface" ++msgstr "" ++ ++msgid "Invalid" ++msgstr "" ++ ++msgid "Link to Device" ++msgstr "" ++ ++msgid "MAC Address" ++msgstr "" ++ ++msgid "MAC Device Info Overrides" ++msgstr "" ++ ++msgid "MAC Device Override" ++msgstr "" ++ ++msgid "MAC range and information used to override system and IEEE databases" ++msgstr "" ++ ++msgid "Milliseconds to sleep between requests (default 100)" ++msgstr "" ++ ++msgid "Model" ++msgstr "" ++ ++msgid "Name" ++msgstr "" ++ ++msgid "Network Device Scan" ++msgstr "" ++ ++msgid "Network Device Scanning Configuration" ++msgstr "" ++ ++msgid "Networks to scan for devices" ++msgstr "" ++ ++msgid "Networks to scan for supported devices" ++msgstr "" ++ ++msgid "No SIP devices" ++msgstr "" ++ ++msgid "No devices detected" ++msgstr "" ++ ++msgid "Number of times to send requests (default 1)" ++msgstr "" ++ ++msgid "OUI Owner" ++msgstr "" ++ ++msgid "" ++"Override the information returned by the MAC to Device Info Script (mac-to-" ++"devinfo) for a specified range of MAC Addresses" ++msgstr "" ++ ++msgid "Perform Scans (this can take a few minutes)" ++msgstr "" ++ ++msgid "Phone Information" ++msgstr "" ++ ++msgid "Phone Scan" ++msgstr "" ++ ++msgid "Phone Scanning Configuration" ++msgstr "" ++ ++msgid "Phones" ++msgstr "" ++ ++msgid "Ports" ++msgstr "" ++ ++msgid "Raw" ++msgstr "" ++ ++msgid "Repeat Count" ++msgstr "" ++ ++msgid "Repeat Scans (this can take a few minutes)" ++msgstr "" ++ ++msgid "SIP Device Information" ++msgstr "" ++ ++msgid "SIP Device Scan" ++msgstr "" ++ ++msgid "SIP Device Scanning Configuration" ++msgstr "" ++ ++msgid "SIP Devices on Network" ++msgstr "" ++ ++msgid "SIP devices discovered for" ++msgstr "" ++ ++msgid "Scan for devices on specified networks." ++msgstr "" ++ ++msgid "Scan for supported SIP devices on specified networks." ++msgstr "" ++ ++msgid "Scanning Configuration" ++msgstr "" ++ ++msgid "Scans for devices on specified networks." ++msgstr "" ++ ++msgid "Sleep Between Requests" ++msgstr "" ++ ++msgid "Subnet" ++msgstr "" ++ ++msgid "This section contains no values yet" ++msgstr "" ++ ++msgid "Time to wait for responses in seconds (default 10)" ++msgstr "" ++ ++msgid "Timeout" ++msgstr "" ++ ++msgid "Use Configuration" ++msgstr "" ++ ++msgid "Vendor" ++msgstr "" ++ ++msgid "check other networks" ++msgstr "" +diff --git a/feeds/luci/applications/luci-app-diag-devinfo/po/tr/diag_devinfo.po b/feeds/luci/applications/luci-app-diag-devinfo/po/tr/diag_devinfo.po +new file mode 100644 +index 0000000..3251675 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-diag-devinfo/po/tr/diag_devinfo.po +@@ -0,0 +1,206 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Last-Translator: Automatically generated\n" ++"Language-Team: none\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=1; plural=0;\n" ++ ++msgid "Actions" ++msgstr "" ++ ++msgid "Add" ++msgstr "" ++ ++msgid "Beginning of MAC address range" ++msgstr "" ++ ++msgid "Config Phone Scan" ++msgstr "" ++ ++msgid "Configure" ++msgstr "" ++ ++msgid "Configure Scans" ++msgstr "" ++ ++msgid "" ++"Configure scanning for devices on specified networks. Decreasing 'Timeout', " ++"'Repeat Count', and/or 'Sleep Between Requests' may speed up scans, but also " ++"may fail to find some devices." ++msgstr "" ++ ++msgid "" ++"Configure scanning for supported SIP devices on specified networks. " ++"Decreasing 'Timeout', 'Repeat Count', and/or 'Sleep Between Requests' may " ++"speed up scans, but also may fail to find some devices." ++msgstr "" ++ ++msgid "Delete" ++msgstr "" ++ ++msgid "Device Scan Config" ++msgstr "" ++ ++msgid "Device Type" ++msgstr "" ++ ++msgid "Devices discovered for" ++msgstr "Devices discovered for" ++ ++msgid "Devices on Network" ++msgstr "" ++ ++msgid "Edit" ++msgstr "" ++ ++msgid "Enable" ++msgstr "" ++ ++msgid "End of MAC address range" ++msgstr "" ++ ++msgid "Go to relevant configuration page" ++msgstr "" ++ ++msgid "IP Address" ++msgstr "" ++ ++msgid "Interface" ++msgstr "" ++ ++msgid "Invalid" ++msgstr "" ++ ++msgid "Link to Device" ++msgstr "" ++ ++msgid "MAC Address" ++msgstr "" ++ ++msgid "MAC Device Info Overrides" ++msgstr "" ++ ++msgid "MAC Device Override" ++msgstr "" ++ ++msgid "MAC range and information used to override system and IEEE databases" ++msgstr "" ++ ++msgid "Milliseconds to sleep between requests (default 100)" ++msgstr "" ++ ++msgid "Model" ++msgstr "" ++ ++msgid "Name" ++msgstr "" ++ ++msgid "Network Device Scan" ++msgstr "" ++ ++msgid "Network Device Scanning Configuration" ++msgstr "" ++ ++msgid "Networks to scan for devices" ++msgstr "" ++ ++msgid "Networks to scan for supported devices" ++msgstr "" ++ ++msgid "No SIP devices" ++msgstr "" ++ ++msgid "No devices detected" ++msgstr "" ++ ++msgid "Number of times to send requests (default 1)" ++msgstr "" ++ ++msgid "OUI Owner" ++msgstr "" ++ ++msgid "" ++"Override the information returned by the MAC to Device Info Script (mac-to-" ++"devinfo) for a specified range of MAC Addresses" ++msgstr "" ++ ++msgid "Perform Scans (this can take a few minutes)" ++msgstr "" ++ ++msgid "Phone Information" ++msgstr "" ++ ++msgid "Phone Scan" ++msgstr "" ++ ++msgid "Phone Scanning Configuration" ++msgstr "" ++ ++msgid "Phones" ++msgstr "" ++ ++msgid "Ports" ++msgstr "" ++ ++msgid "Raw" ++msgstr "" ++ ++msgid "Repeat Count" ++msgstr "" ++ ++msgid "Repeat Scans (this can take a few minutes)" ++msgstr "" ++ ++msgid "SIP Device Information" ++msgstr "" ++ ++msgid "SIP Device Scan" ++msgstr "" ++ ++msgid "SIP Device Scanning Configuration" ++msgstr "" ++ ++msgid "SIP Devices on Network" ++msgstr "" ++ ++msgid "SIP devices discovered for" ++msgstr "" ++ ++msgid "Scan for devices on specified networks." ++msgstr "" ++ ++msgid "Scan for supported SIP devices on specified networks." ++msgstr "" ++ ++msgid "Scanning Configuration" ++msgstr "" ++ ++msgid "Scans for devices on specified networks." ++msgstr "" ++ ++msgid "Sleep Between Requests" ++msgstr "" ++ ++msgid "Subnet" ++msgstr "" ++ ++msgid "This section contains no values yet" ++msgstr "" ++ ++msgid "Time to wait for responses in seconds (default 10)" ++msgstr "" ++ ++msgid "Timeout" ++msgstr "" ++ ++msgid "Use Configuration" ++msgstr "" ++ ++msgid "Vendor" ++msgstr "" ++ ++msgid "check other networks" ++msgstr "" +diff --git a/feeds/luci/applications/luci-app-diag-devinfo/po/uk/diag_devinfo.po b/feeds/luci/applications/luci-app-diag-devinfo/po/uk/diag_devinfo.po +new file mode 100644 +index 0000000..03f49eb +--- /dev/null ++++ b/feeds/luci/applications/luci-app-diag-devinfo/po/uk/diag_devinfo.po +@@ -0,0 +1,219 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"PO-Revision-Date: 2013-08-13 15:23+0200\n" ++"Last-Translator: zubr_139 \n" ++"Language-Team: none\n" ++"Language: uk\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%" ++"10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "Actions" ++msgstr "" ++ ++msgid "Add" ++msgstr "Додати" ++ ++msgid "Beginning of MAC address range" ++msgstr "" ++ ++msgid "Config Phone Scan" ++msgstr "" ++ ++msgid "Configure" ++msgstr "КонфігураціÑ" ++ ++msgid "Configure Scans" ++msgstr "" ++ ++msgid "" ++"Configure scanning for devices on specified networks. Decreasing 'Timeout', " ++"'Repeat Count', and/or 'Sleep Between Requests' may speed up scans, but also " ++"may fail to find some devices." ++msgstr "" ++ ++msgid "" ++"Configure scanning for supported SIP devices on specified networks. " ++"Decreasing 'Timeout', 'Repeat Count', and/or 'Sleep Between Requests' may " ++"speed up scans, but also may fail to find some devices." ++msgstr "" ++ ++msgid "Delete" ++msgstr "Вилучити" ++ ++msgid "Device Scan Config" ++msgstr "ÐšÐ¾Ð½Ñ„Ñ–Ð³ÑƒÑ€Ð°Ñ†Ñ–Ñ Ð¿Ñ€Ð¸Ñтрою ÑкануваннÑ" ++ ++msgid "Device Type" ++msgstr "Тип приÑтрою" ++ ++msgid "Devices discovered for" ++msgstr "ВиÑвленні приÑтрої на" ++ ++msgid "Devices on Network" ++msgstr "ПриÑтрої в мережі" ++ ++msgid "Edit" ++msgstr "Редагувати" ++ ++msgid "Enable" ++msgstr "Ðктивувати" ++ ++msgid "End of MAC address range" ++msgstr "" ++ ++#, fuzzy ++msgid "Go to relevant configuration page" ++msgstr "Перейти до відповідної Ñторінки конфігурації" ++ ++msgid "IP Address" ++msgstr "IP-адреÑа" ++ ++msgid "Interface" ++msgstr "ІнтерфейÑ" ++ ++msgid "Invalid" ++msgstr "ÐеÑправніÑÑ‚ÑŒ" ++ ++msgid "Link to Device" ++msgstr "ПоÑÐ¸Ð»Ð°Ð½Ð½Ñ Ð½Ð° приÑтрій" ++ ++msgid "MAC Address" ++msgstr "MAC-адреÑа" ++ ++msgid "MAC Device Info Overrides" ++msgstr "" ++ ++msgid "MAC Device Override" ++msgstr "" ++ ++msgid "MAC range and information used to override system and IEEE databases" ++msgstr "" ++ ++msgid "Milliseconds to sleep between requests (default 100)" ++msgstr "" ++ ++msgid "Model" ++msgstr "Модель" ++ ++msgid "Name" ++msgstr "Ðазва" ++ ++msgid "Network Device Scan" ++msgstr "Ð¡ÐºÐ°Ð½ÑƒÐ²Ð°Ð½Ð½Ñ Ð¼ÐµÑ€ÐµÐ¶ÐµÐ²Ð¸Ñ… приÑтроїв" ++ ++msgid "Network Device Scanning Configuration" ++msgstr "Мережевий ПриÑтрій ÐšÐ¾Ð½Ñ„Ñ–Ð³ÑƒÑ€Ð°Ñ†Ñ–Ñ Ð¡ÐºÐ°Ð½ÑƒÐ²Ð°Ð½Ð½Ñ" ++ ++#, fuzzy ++msgid "Networks to scan for devices" ++msgstr "Мережі Ð´Ð»Ñ ÑÐºÐ°Ð½ÑƒÐ²Ð°Ð½Ð½Ñ Ð¿Ñ€Ð¸Ñтроїв" ++ ++#, fuzzy ++msgid "Networks to scan for supported devices" ++msgstr "Мережі Ð´Ð»Ñ Ð¿Ð¾ÑˆÑƒÐºÑƒ підтримуваних приÑтроїв" ++ ++msgid "No SIP devices" ++msgstr "Ðемає SIP приÑтроїв" ++ ++msgid "No devices detected" ++msgstr "" ++ ++msgid "Number of times to send requests (default 1)" ++msgstr "" ++ ++msgid "OUI Owner" ++msgstr "" ++ ++msgid "" ++"Override the information returned by the MAC to Device Info Script (mac-to-" ++"devinfo) for a specified range of MAC Addresses" ++msgstr "" ++ ++msgid "Perform Scans (this can take a few minutes)" ++msgstr "" ++ ++msgid "Phone Information" ++msgstr "" ++ ++msgid "Phone Scan" ++msgstr "" ++ ++msgid "Phone Scanning Configuration" ++msgstr "" ++ ++msgid "Phones" ++msgstr "" ++ ++msgid "Ports" ++msgstr "" ++ ++msgid "Raw" ++msgstr "" ++ ++msgid "Repeat Count" ++msgstr "" ++ ++msgid "Repeat Scans (this can take a few minutes)" ++msgstr "" ++ ++msgid "SIP Device Information" ++msgstr "" ++ ++msgid "SIP Device Scan" ++msgstr "" ++ ++msgid "SIP Device Scanning Configuration" ++msgstr "" ++ ++msgid "SIP Devices on Network" ++msgstr "" ++ ++msgid "SIP devices discovered for" ++msgstr "" ++ ++msgid "Scan for devices on specified networks." ++msgstr "" ++ ++msgid "Scan for supported SIP devices on specified networks." ++msgstr "" ++ ++msgid "Scanning Configuration" ++msgstr "ÐšÐ¾Ð½Ñ„Ñ–Ð³ÑƒÑ€Ð°Ñ†Ñ–Ñ Ð¡ÐºÐ°Ð½ÑƒÐ²Ð°Ð½Ð½Ñ" ++ ++#, fuzzy ++msgid "Scans for devices on specified networks." ++msgstr "Ð¡ÐºÐ°Ð½ÑƒÐ²Ð°Ð½Ð½Ñ Ð¿Ñ€Ð¸Ñтроїв у вказаних мережах." ++ ++#, fuzzy ++msgid "Sleep Between Requests" ++msgstr "Сон між запитами" ++ ++#, fuzzy ++msgid "Subnet" ++msgstr "Підмережі" ++ ++#, fuzzy ++msgid "This section contains no values yet" ++msgstr "Цей розділ ще не міÑтить значень" ++ ++msgid "Time to wait for responses in seconds (default 10)" ++msgstr "Ð§Ð°Ñ Ð¾Ñ‡Ñ–ÐºÑƒÐ²Ð°Ð½Ð½Ñ Ð²Ñ–Ð´Ð¿Ð¾Ð²Ñ–Ð´Ñ– в Ñекундах (типово 10)" ++ ++#, fuzzy ++msgid "Timeout" ++msgstr "Затримка" ++ ++#, fuzzy ++msgid "Use Configuration" ++msgstr "ВикориÑÑ‚Ð°Ð½Ð½Ñ ÐºÐ¾Ð½Ñ„Ñ–Ð³ÑƒÑ€Ð°Ñ†Ñ–Ñ—" ++ ++msgid "Vendor" ++msgstr "" ++ ++msgid "check other networks" ++msgstr "перевірити інші мережі" +diff --git a/feeds/luci/applications/luci-app-diag-devinfo/po/vi/diag_devinfo.po b/feeds/luci/applications/luci-app-diag-devinfo/po/vi/diag_devinfo.po +new file mode 100644 +index 0000000..3251675 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-diag-devinfo/po/vi/diag_devinfo.po +@@ -0,0 +1,206 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Last-Translator: Automatically generated\n" ++"Language-Team: none\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=1; plural=0;\n" ++ ++msgid "Actions" ++msgstr "" ++ ++msgid "Add" ++msgstr "" ++ ++msgid "Beginning of MAC address range" ++msgstr "" ++ ++msgid "Config Phone Scan" ++msgstr "" ++ ++msgid "Configure" ++msgstr "" ++ ++msgid "Configure Scans" ++msgstr "" ++ ++msgid "" ++"Configure scanning for devices on specified networks. Decreasing 'Timeout', " ++"'Repeat Count', and/or 'Sleep Between Requests' may speed up scans, but also " ++"may fail to find some devices." ++msgstr "" ++ ++msgid "" ++"Configure scanning for supported SIP devices on specified networks. " ++"Decreasing 'Timeout', 'Repeat Count', and/or 'Sleep Between Requests' may " ++"speed up scans, but also may fail to find some devices." ++msgstr "" ++ ++msgid "Delete" ++msgstr "" ++ ++msgid "Device Scan Config" ++msgstr "" ++ ++msgid "Device Type" ++msgstr "" ++ ++msgid "Devices discovered for" ++msgstr "Devices discovered for" ++ ++msgid "Devices on Network" ++msgstr "" ++ ++msgid "Edit" ++msgstr "" ++ ++msgid "Enable" ++msgstr "" ++ ++msgid "End of MAC address range" ++msgstr "" ++ ++msgid "Go to relevant configuration page" ++msgstr "" ++ ++msgid "IP Address" ++msgstr "" ++ ++msgid "Interface" ++msgstr "" ++ ++msgid "Invalid" ++msgstr "" ++ ++msgid "Link to Device" ++msgstr "" ++ ++msgid "MAC Address" ++msgstr "" ++ ++msgid "MAC Device Info Overrides" ++msgstr "" ++ ++msgid "MAC Device Override" ++msgstr "" ++ ++msgid "MAC range and information used to override system and IEEE databases" ++msgstr "" ++ ++msgid "Milliseconds to sleep between requests (default 100)" ++msgstr "" ++ ++msgid "Model" ++msgstr "" ++ ++msgid "Name" ++msgstr "" ++ ++msgid "Network Device Scan" ++msgstr "" ++ ++msgid "Network Device Scanning Configuration" ++msgstr "" ++ ++msgid "Networks to scan for devices" ++msgstr "" ++ ++msgid "Networks to scan for supported devices" ++msgstr "" ++ ++msgid "No SIP devices" ++msgstr "" ++ ++msgid "No devices detected" ++msgstr "" ++ ++msgid "Number of times to send requests (default 1)" ++msgstr "" ++ ++msgid "OUI Owner" ++msgstr "" ++ ++msgid "" ++"Override the information returned by the MAC to Device Info Script (mac-to-" ++"devinfo) for a specified range of MAC Addresses" ++msgstr "" ++ ++msgid "Perform Scans (this can take a few minutes)" ++msgstr "" ++ ++msgid "Phone Information" ++msgstr "" ++ ++msgid "Phone Scan" ++msgstr "" ++ ++msgid "Phone Scanning Configuration" ++msgstr "" ++ ++msgid "Phones" ++msgstr "" ++ ++msgid "Ports" ++msgstr "" ++ ++msgid "Raw" ++msgstr "" ++ ++msgid "Repeat Count" ++msgstr "" ++ ++msgid "Repeat Scans (this can take a few minutes)" ++msgstr "" ++ ++msgid "SIP Device Information" ++msgstr "" ++ ++msgid "SIP Device Scan" ++msgstr "" ++ ++msgid "SIP Device Scanning Configuration" ++msgstr "" ++ ++msgid "SIP Devices on Network" ++msgstr "" ++ ++msgid "SIP devices discovered for" ++msgstr "" ++ ++msgid "Scan for devices on specified networks." ++msgstr "" ++ ++msgid "Scan for supported SIP devices on specified networks." ++msgstr "" ++ ++msgid "Scanning Configuration" ++msgstr "" ++ ++msgid "Scans for devices on specified networks." ++msgstr "" ++ ++msgid "Sleep Between Requests" ++msgstr "" ++ ++msgid "Subnet" ++msgstr "" ++ ++msgid "This section contains no values yet" ++msgstr "" ++ ++msgid "Time to wait for responses in seconds (default 10)" ++msgstr "" ++ ++msgid "Timeout" ++msgstr "" ++ ++msgid "Use Configuration" ++msgstr "" ++ ++msgid "Vendor" ++msgstr "" ++ ++msgid "check other networks" ++msgstr "" +diff --git a/feeds/luci/applications/luci-app-diag-devinfo/po/zh-cn/diag_devinfo.po b/feeds/luci/applications/luci-app-diag-devinfo/po/zh-cn/diag_devinfo.po +new file mode 100644 +index 0000000..fe4d241 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-diag-devinfo/po/zh-cn/diag_devinfo.po +@@ -0,0 +1,210 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"PO-Revision-Date: 2013-10-10 05:33+0200\n" ++"Last-Translator: Tanyingyu \n" ++"Language-Team: none\n" ++"Language: zh_CN\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=1; plural=0;\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "Actions" ++msgstr "动作" ++ ++msgid "Add" ++msgstr "添加" ++ ++msgid "Beginning of MAC address range" ++msgstr "MAC起始地å€" ++ ++msgid "Config Phone Scan" ++msgstr "é…ç½®è¯æœºè¯†åˆ«å‚æ•°" ++ ++msgid "Configure" ++msgstr "é…ç½®" ++ ++msgid "Configure Scans" ++msgstr "识别å‚æ•°é…ç½®" ++ ++msgid "" ++"Configure scanning for devices on specified networks. Decreasing 'Timeout', " ++"'Repeat Count', and/or 'Sleep Between Requests' may speed up scans, but also " ++"may fail to find some devices." ++msgstr "é…置识别指定网络上设备的过程å‚数。å‡å°'​​超时时长','é‡å¤æ¬¡æ•°',和/或“休眠请求â€å¯åŠ å¿«è¯†åˆ«è¿‡ç¨‹ï¼Œä½†ä¹Ÿå¯èƒ½å› æ­¤å¯¼è‡´è¯†åˆ«ä¸€äº›è®¾å¤‡ä¼šå¤±è´¥ã€‚" ++ ++msgid "" ++"Configure scanning for supported SIP devices on specified networks. " ++"Decreasing 'Timeout', 'Repeat Count', and/or 'Sleep Between Requests' may " ++"speed up scans, but also may fail to find some devices." ++msgstr "" ++"é…置识别指定网络上SIP设备的过程å‚数。é™ä½Ž'​​超时时长','é‡å¤æ¬¡æ•°',和/或“休眠请求â€å¯åŠ å¿«è¯†åˆ«è¿‡ç¨‹ï¼Œä½†ä¹Ÿå¯èƒ½å› æ­¤å¯¼è‡´è¯†åˆ«ä¸€äº›è®¾å¤‡ä¼šå¤±è´¥ã€‚" ++ ++msgid "Delete" ++msgstr "删除" ++ ++msgid "Device Scan Config" ++msgstr "设备识别å‚æ•°é…ç½®" ++ ++msgid "Device Type" ++msgstr "设备类型" ++ ++msgid "Devices discovered for" ++msgstr "对å‘现​​的设备" ++ ++msgid "Devices on Network" ++msgstr "网络上的设备" ++ ++msgid "Edit" ++msgstr "编辑" ++ ++msgid "Enable" ++msgstr "å¯ç”¨" ++ ++msgid "End of MAC address range" ++msgstr "MAC地å€æ®µç»“æŸ" ++ ++msgid "Go to relevant configuration page" ++msgstr "相关é…置页é¢" ++ ++msgid "IP Address" ++msgstr "IP地å€" ++ ++msgid "Interface" ++msgstr "接å£" ++ ++msgid "Invalid" ++msgstr "ä¸åˆæ³•" ++ ++msgid "Link to Device" ++msgstr "连接到设备" ++ ++msgid "MAC Address" ++msgstr "MAC地å€" ++ ++msgid "MAC Device Info Overrides" ++msgstr "覆盖MAC设备信æ¯" ++ ++msgid "MAC Device Override" ++msgstr "覆盖MAC设备" ++ ++msgid "MAC range and information used to override system and IEEE databases" ++msgstr "MAC范围和使用信æ¯è¦†ç›–系统和IEEEæ•°æ®åº“" ++ ++msgid "Milliseconds to sleep between requests (default 100)" ++msgstr "两次请求间ç¡çœ æ¯«ç§’数(默认为100)" ++ ++msgid "Model" ++msgstr "åž‹å·" ++ ++msgid "Name" ++msgstr "åå­—" ++ ++msgid "Network Device Scan" ++msgstr "识别网络设备" ++ ++msgid "Network Device Scanning Configuration" ++msgstr "网络设备识别å‚æ•°" ++ ++msgid "Networks to scan for devices" ++msgstr "网络识别设备" ++ ++msgid "Networks to scan for supported devices" ++msgstr "网络识别支æŒçš„设备" ++ ++msgid "No SIP devices" ++msgstr "æ— SIP设备" ++ ++msgid "No devices detected" ++msgstr "没有识别到设备" ++ ++msgid "Number of times to send requests (default 1)" ++msgstr "å‘é€è¯·æ±‚次数(默认为1)" ++ ++msgid "OUI Owner" ++msgstr "OUI所有者" ++ ++msgid "" ++"Override the information returned by the MAC to Device Info Script (mac-to-" ++"devinfo) for a specified range of MAC Addresses" ++msgstr "返回指定MAC地å€èŒƒå›´å†…覆盖MAC设备信æ¯è„šæœ¬(mac-to-devinfo)çš„ä¿¡æ¯ã€‚" ++ ++msgid "Perform Scans (this can take a few minutes)" ++msgstr "执行识别过程(这å¯èƒ½éœ€è¦å‡ åˆ†é’Ÿï¼‰" ++ ++msgid "Phone Information" ++msgstr "è¯æœºä¿¡æ¯" ++ ++msgid "Phone Scan" ++msgstr "识别è¯æœº" ++ ++msgid "Phone Scanning Configuration" ++msgstr "è¯æœºè¯†åˆ«è¿‡ç¨‹å‚æ•°" ++ ++msgid "Phones" ++msgstr "è¯æœº" ++ ++msgid "Ports" ++msgstr "端å£" ++ ++msgid "Raw" ++msgstr "原始数æ®" ++ ++msgid "Repeat Count" ++msgstr "é‡å¤æ¬¡æ•°" ++ ++msgid "Repeat Scans (this can take a few minutes)" ++msgstr "é‡å¤è¯†åˆ«ï¼ˆè¿™å¯èƒ½éœ€è¦å‡ åˆ†é’Ÿï¼‰" ++ ++msgid "SIP Device Information" ++msgstr "SIP设备信æ¯" ++ ++msgid "SIP Device Scan" ++msgstr "SIP设备识别" ++ ++msgid "SIP Device Scanning Configuration" ++msgstr "SIP设备识别过程å‚æ•°é…ç½®" ++ ++msgid "SIP Devices on Network" ++msgstr "在线的SIP设备" ++ ++msgid "SIP devices discovered for" ++msgstr "å‘掘SIP设备" ++ ++msgid "Scan for devices on specified networks." ++msgstr "在指定网络上识别设备" ++ ++msgid "Scan for supported SIP devices on specified networks." ++msgstr "在指定网络上识别SIP设备" ++ ++msgid "Scanning Configuration" ++msgstr "识别过程é…ç½®" ++ ++msgid "Scans for devices on specified networks." ++msgstr "识别指定网络上的设备" ++ ++msgid "Sleep Between Requests" ++msgstr "请求间等待间隙" ++ ++msgid "Subnet" ++msgstr "å­ç½‘" ++ ++msgid "This section contains no values yet" ++msgstr "这部分任然ä¸åŒ…å«çš„值" ++ ++msgid "Time to wait for responses in seconds (default 10)" ++msgstr "等待å“应秒数(默认10)" ++ ++msgid "Timeout" ++msgstr "超时" ++ ++msgid "Use Configuration" ++msgstr "使用é…ç½®" ++ ++msgid "Vendor" ++msgstr "厂商" ++ ++msgid "check other networks" ++msgstr "检查其他网络" +diff --git a/feeds/luci/applications/luci-app-diag-devinfo/po/zh-tw/diag_devinfo.po b/feeds/luci/applications/luci-app-diag-devinfo/po/zh-tw/diag_devinfo.po +new file mode 100644 +index 0000000..fe14f68 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-diag-devinfo/po/zh-tw/diag_devinfo.po +@@ -0,0 +1,210 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"PO-Revision-Date: 2014-05-14 14:54+0200\n" ++"Last-Translator: omnistack \n" ++"Language-Team: none\n" ++"Language: zh_TW\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=1; plural=0;\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "Actions" ++msgstr "æ“作" ++ ++msgid "Add" ++msgstr "新增" ++ ++msgid "Beginning of MAC address range" ++msgstr "MACä½å€èµ·å§‹ç¯„åœ" ++ ++msgid "Config Phone Scan" ++msgstr "設定電話掃æ" ++ ++msgid "Configure" ++msgstr "設置" ++ ++msgid "Configure Scans" ++msgstr "掃æ設置" ++ ++msgid "" ++"Configure scanning for devices on specified networks. Decreasing 'Timeout', " ++"'Repeat Count', and/or 'Sleep Between Requests' may speed up scans, but also " ++"may fail to find some devices." ++msgstr "é‡å°ç‰¹å®šç¶²è·¯çš„掃æ設定值. 增加\"超時\",\"é‡è¤‡æ•¸é‡,\"並且/或者\"傳到ç¡è‘—者\"å¯ä»¥åŠ é€ŸæŽƒæ, 但也有å¯èƒ½å°‡è¦åŽ»æœå°‹æŸäº›è¨­å‚™æ™‚會失敗." ++ ++msgid "" ++"Configure scanning for supported SIP devices on specified networks. " ++"Decreasing 'Timeout', 'Repeat Count', and/or 'Sleep Between Requests' may " ++"speed up scans, but also may fail to find some devices." ++msgstr "" ++"å°æŒ‡å®šçš„網路上已支æ´çš„SIP設備設定掃æ,減少\"超時\",\"é‡è¤‡æ•¸é‡,\"並且/或者\"傳到ç¡è‘—者\"å¯ä»¥åŠ é€Ÿæ, 但也有å¯èƒ½å°‡è¦åŽ»æœå°‹æŸäº›è¨­å‚™æ™‚會失敗." ++ ++msgid "Delete" ++msgstr "刪除" ++ ++msgid "Device Scan Config" ++msgstr "設備掃æ設定" ++ ++msgid "Device Type" ++msgstr "設備型態" ++ ++msgid "Devices discovered for" ++msgstr "已發ç¾çš„設備為" ++ ++msgid "Devices on Network" ++msgstr "網路中的設備" ++ ++msgid "Edit" ++msgstr "編輯" ++ ++msgid "Enable" ++msgstr "啟用" ++ ++msgid "End of MAC address range" ++msgstr "MACä½å€çš„çµæŸç¯„åœ" ++ ++msgid "Go to relevant configuration page" ++msgstr "到相應的設定é é¢" ++ ++msgid "IP Address" ++msgstr "IPä½å€" ++ ++msgid "Interface" ++msgstr "介é¢" ++ ++msgid "Invalid" ++msgstr "無效" ++ ++msgid "Link to Device" ++msgstr "連çµåˆ°è¨­å‚™ä¸Š" ++ ++msgid "MAC Address" ++msgstr "MACä½å€" ++ ++msgid "MAC Device Info Overrides" ++msgstr "MAC設備資訊覆寫" ++ ++msgid "MAC Device Override" ++msgstr "MAC設備覆寫" ++ ++msgid "MAC range and information used to override system and IEEE databases" ++msgstr "MAC範åœåŠè³‡è¨Šç”¨ä¾†è¦†å¯«ç³»çµ±å’ŒIEEE資料庫" ++ ++msgid "Milliseconds to sleep between requests (default 100)" ++msgstr "è¦æ±‚多久(毫)秒後進入ç¡çœ " ++ ++msgid "Model" ++msgstr "型號" ++ ++msgid "Name" ++msgstr "å稱" ++ ++msgid "Network Device Scan" ++msgstr "網路設備掃æ" ++ ++msgid "Network Device Scanning Configuration" ++msgstr "網路設備掃æ設定值" ++ ++msgid "Networks to scan for devices" ++msgstr "è¦æŽƒæ的網路設備" ++ ++msgid "Networks to scan for supported devices" ++msgstr "è¦æŽƒæ的已支æ´ç¶²è·¯è¨­å‚™" ++ ++msgid "No SIP devices" ++msgstr "無任何SIP設備" ++ ++msgid "No devices detected" ++msgstr "åµæ¸¬ä¸åˆ°è¨­å‚™" ++ ++msgid "Number of times to send requests (default 1)" ++msgstr "傳é€è¦æ±‚的次數(é è¨­1)" ++ ++msgid "OUI Owner" ++msgstr "OUIæ“有者" ++ ++msgid "" ++"Override the information returned by the MAC to Device Info Script (mac-to-" ++"devinfo) for a specified range of MAC Addresses" ++msgstr "é‡å°æŒ‡å®šç¯„åœçš„MACä½å€,由設備資訊腳本回傳的MACä½å€è³‡è¨Šé€²è¡Œè¦†è“‹" ++ ++msgid "Perform Scans (this can take a few minutes)" ++msgstr "掃ææ“作(å¯èƒ½æœƒèŠ±è²»æ•¸åˆ†é˜)" ++ ++msgid "Phone Information" ++msgstr "電話資訊" ++ ++msgid "Phone Scan" ++msgstr "電話掃æ" ++ ++msgid "Phone Scanning Configuration" ++msgstr "電話掃æ設定值" ++ ++msgid "Phones" ++msgstr "電話" ++ ++msgid "Ports" ++msgstr "埠" ++ ++msgid "Raw" ++msgstr "原生RAW" ++ ++msgid "Repeat Count" ++msgstr "é‡è¤‡æ¬¡æ•¸" ++ ++msgid "Repeat Scans (this can take a few minutes)" ++msgstr "é‡è¤‡æŽƒæ(å¯èƒ½èŠ±è²»æ•¸åˆ†é˜)" ++ ++msgid "SIP Device Information" ++msgstr "SIP設備資訊" ++ ++msgid "SIP Device Scan" ++msgstr "SIP設備掃æ" ++ ++msgid "SIP Device Scanning Configuration" ++msgstr "SIP設備掃æ設定值" ++ ++msgid "SIP Devices on Network" ++msgstr "網路中的SIP設備" ++ ++msgid "SIP devices discovered for" ++msgstr "已發ç¾çš„SIP設備" ++ ++msgid "Scan for devices on specified networks." ++msgstr "é‡å°ç‰¹å®šç¶²è·¯æŽƒæ設備" ++ ++msgid "Scan for supported SIP devices on specified networks." ++msgstr "é‡å°ç‰¹å®šç¶²è·¯æŽƒæ有支æ´çš„SIP設備" ++ ++msgid "Scanning Configuration" ++msgstr "掃æ設定值" ++ ++msgid "Scans for devices on specified networks." ++msgstr "é‡å°ç‰¹å®šç¶²è·¯æŽƒæ設備" ++ ++msgid "Sleep Between Requests" ++msgstr "請求之間的ç¡çœ " ++ ++msgid "Subnet" ++msgstr "å­ç¶²è·¯" ++ ++msgid "This section contains no values yet" ++msgstr "這個部分尚無任何數值" ++ ++msgid "Time to wait for responses in seconds (default 10)" ++msgstr "秒計等待回應時間(é è¨­10)" ++ ++msgid "Timeout" ++msgstr "超時" ++ ++msgid "Use Configuration" ++msgstr "使用設定值" ++ ++msgid "Vendor" ++msgstr "供應製造商" ++ ++msgid "check other networks" ++msgstr "檢查它網" +diff --git a/feeds/luci/applications/luci-app-diag-devinfo/root/etc/config/luci_devinfo b/feeds/luci/applications/luci-app-diag-devinfo/root/etc/config/luci_devinfo +new file mode 100644 +index 0000000..1bcdc19 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-diag-devinfo/root/etc/config/luci_devinfo +@@ -0,0 +1,20 @@ ++config 'smap_scannet' 'SIP_LAN' ++ option 'enable' '0' ++ option 'interface' 'lan' ++ option 'subnet' '192.168.99.0/24' ++ ++config 'smap_scannet' 'SIP_WAN' ++ option 'enable' '0' ++ option 'interface' 'wan' ++ option 'subnet' '216.218.0.0/16' ++ ++config 'netdiscover_scannet' 'SCAN_LAN' ++ option 'enable' '0' ++ option 'interface' 'lan' ++ option 'subnet' '192.168.99.0/24' ++ ++config 'netdiscover_scannet' 'SCAN_WAN' ++ option 'enable' '0' ++ option 'interface' 'wan' ++ option 'subnet' '216.218.0.0/16' ++ +diff --git a/feeds/luci/applications/luci-app-dump1090/Makefile b/feeds/luci/applications/luci-app-dump1090/Makefile +new file mode 100644 +index 0000000..e6abd44 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-dump1090/Makefile +@@ -0,0 +1,14 @@ ++# ++# Copyright (C) 2008-2014 The LuCI Team ++# ++# This is free software, licensed under the Apache License, Version 2.0 . ++# ++ ++include $(TOPDIR)/rules.mk ++ ++LUCI_TITLE:=LuCI Support for dump1090 ++LUCI_DEPENDS:=+dump1090 ++ ++include ../../luci.mk ++ ++# call BuildPackage - OpenWrt buildroot signature +diff --git a/feeds/luci/applications/luci-app-dump1090/luasrc/controller/dump1090.lua b/feeds/luci/applications/luci-app-dump1090/luasrc/controller/dump1090.lua +new file mode 100644 +index 0000000..bc2b36d +--- /dev/null ++++ b/feeds/luci/applications/luci-app-dump1090/luasrc/controller/dump1090.lua +@@ -0,0 +1,14 @@ ++-- Copyright 2014 Ãlvaro Fernández Rojas ++-- Licensed to the public under the Apache License 2.0. ++ ++module("luci.controller.dump1090", package.seeall) ++ ++function index() ++ if not nixio.fs.access("/etc/config/dump1090") then ++ return ++ end ++ ++ local page = entry({"admin", "services", "dump1090"}, cbi("dump1090"), _("dump1090")) ++ page.dependent = true ++ ++end +diff --git a/feeds/luci/applications/luci-app-dump1090/luasrc/model/cbi/dump1090.lua b/feeds/luci/applications/luci-app-dump1090/luasrc/model/cbi/dump1090.lua +new file mode 100644 +index 0000000..6015ffe +--- /dev/null ++++ b/feeds/luci/applications/luci-app-dump1090/luasrc/model/cbi/dump1090.lua +@@ -0,0 +1,145 @@ ++-- Copyright 2014 Ãlvaro Fernández Rojas ++-- Licensed to the public under the Apache License 2.0. ++ ++m = Map("dump1090", "dump1090", translate("dump1090 is a Mode S decoder specifically designed for RTLSDR devices, here you can configure the settings.")) ++ ++s = m:section(TypedSection, "dump1090", "") ++s.addremove = true ++s.anonymous = false ++ ++enable=s:option(Flag, "disabled", translate("Enabled")) ++enable.enabled="0" ++enable.disabled="1" ++enable.default = "1" ++enable.rmempty = false ++respawn=s:option(Flag, "respawn", translate("Respawn")) ++respawn.default = false ++ ++device_index=s:option(Value, "device_index", translate("RTL device index")) ++device_index.rmempty = true ++device_index.datatype = "uinteger" ++ ++gain=s:option(Value, "gain", translate("Gain (-10 for auto-gain)")) ++gain.rmempty = true ++gain.datatype = "integer" ++ ++enable_agc=s:option(Flag, "enable_agc", translate("Enable automatic gain control")) ++enable_agc.default = false ++ ++freq=s:option(Value, "freq", translate("Frequency")) ++freq.rmempty = true ++freq.datatype = "uinteger" ++ ++ifile=s:option(Value, "ifile", translate("Data file")) ++ifile.rmempty = true ++ifile.datatype = "file" ++ ++raw=s:option(Flag, "raw", translate("Show only messages hex values")) ++raw.default = false ++ ++net=s:option(Flag, "net", translate("Enable networking")) ++ ++modeac=s:option(Flag, "modeac", translate("Enable decoding of SSR Modes 3/A & 3/C")) ++modeac.default = false ++ ++net_beast=s:option(Flag, "net_beast", translate("TCP raw output in Beast binary format")) ++net_beast.default = false ++ ++net_only=s:option(Flag, "net_only", translate("Enable just networking, no RTL device or file used")) ++net_only.default = false ++ ++net_bind_address=s:option(Value, "net_bind_address", translate("IP address to bind to")) ++net_bind_address.rmempty = true ++net_bind_address.datatype = "ipaddr" ++ ++net_http_port=s:option(Value, "net_http_port", translate("HTTP server port")) ++net_http_port.rmempty = true ++net_http_port.datatype = "port" ++ ++net_ri_port=s:option(Value, "net_ri_port", translate("TCP raw input listen port")) ++net_ri_port.rmempty = true ++net_ri_port.datatype = "port" ++ ++net_ro_port=s:option(Value, "net_ro_port", translate("TCP raw output listen port")) ++net_ro_port.rmempty = true ++net_ro_port.datatype = "port" ++ ++net_sbs_port=s:option(Value, "net_sbs_port", translate("TCP BaseStation output listen port")) ++net_sbs_port.rmempty = true ++net_sbs_port.datatype = "port" ++ ++net_bi_port=s:option(Value, "net_bi_port", translate("TCP Beast input listen port")) ++net_bi_port.rmempty = true ++net_bi_port.datatype = "port" ++ ++net_bo_port=s:option(Value, "net_bo_port", translate("TCP Beast output listen port")) ++net_bo_port.rmempty = true ++net_bo_port.datatype = "port" ++ ++net_ro_size=s:option(Value, "net_ro_size", translate("TCP raw output minimum size")) ++net_ro_size.rmempty = true ++net_ro_size.datatype = "uinteger" ++ ++net_ro_rate=s:option(Value, "net_ro_rate", translate("TCP raw output memory flush rate")) ++net_ro_rate.rmempty = true ++net_ro_rate.datatype = "uinteger" ++ ++net_heartbeat=s:option(Value, "net_heartbeat", translate("TCP heartbeat rate in seconds")) ++net_heartbeat.rmempty = true ++net_heartbeat.datatype = "uinteger" ++ ++net_buffer=s:option(Value, "net_buffer", translate("TCP buffer size 64Kb * (2^n)")) ++net_buffer.rmempty = true ++net_buffer.datatype = "uinteger" ++ ++lat=s:option(Value, "lat", translate("Reference/receiver latitude for surface posn")) ++lat.rmempty = true ++lat.datatype = "integer" ++ ++lon=s:option(Value, "lon", translate("Reference/receiver longitude for surface posn")) ++lon.rmempty = true ++lon.datatype = "integer" ++ ++fix=s:option(Flag, "fix", translate("Enable single-bits error correction using CRC")) ++fix.default = false ++ ++no_fix=s:option(Flag, "no_fix", translate("Disable single-bits error correction using CRC")) ++no_fix.default = false ++ ++no_crc_check=s:option(Flag, "no_crc_check", translate("Disable messages with broken CRC")) ++no_crc_check.default = false ++ ++phase_enhance=s:option(Flag, "phase_enhance", translate("Enable phase enhancement")) ++phase_enhance.default = false ++ ++agressive=s:option(Flag, "agressive", translate("More CPU for more messages")) ++agressive.default = false ++ ++mlat=s:option(Flag, "mlat", translate("Display raw messages in Beast ascii mode")) ++mlat.default = false ++ ++stats=s:option(Flag, "stats", translate("Print stats at exit")) ++stats.default = false ++ ++stats_every=s:option(Value, "stats_every", translate("Show and reset stats every seconds")) ++stats_every.rmempty = true ++stats_every.datatype = "uinteger" ++ ++onlyaddr=s:option(Flag, "onlyaddr", translate("Show only ICAO addresses")) ++onlyaddr.default = false ++ ++metric=s:option(Flag, "metric", translate("Use metric units")) ++metric.default = false ++ ++snip=s:option(Flag, "snip", translate("Strip IQ file removing samples")) ++snip.rmempty = true ++snip.datatype = "uinteger" ++ ++debug_mode=s:option(Flag, "debug", translate("Debug mode flags")) ++debug_mode.rmempty = true ++ ++ppm=s:option(Flag, "ppm", translate("Set receiver error in parts per million")) ++ppm.rmempty = true ++ppm.datatype = "uinteger" ++ ++return m +diff --git a/feeds/luci/applications/luci-app-dump1090/root/etc/uci-defaults/luci-dump1090 b/feeds/luci/applications/luci-app-dump1090/root/etc/uci-defaults/luci-dump1090 +new file mode 100644 +index 0000000..4475d2f +--- /dev/null ++++ b/feeds/luci/applications/luci-app-dump1090/root/etc/uci-defaults/luci-dump1090 +@@ -0,0 +1,12 @@ ++#!/bin/sh ++ ++# needed for "Save and Apply" to restart dump1090 ++uci -q batch <<-EOF >/dev/null ++ delete ucitrack.@dump1090[-1] ++ add ucitrack dump1090 ++ set ucitrack.@dump1090[-1].init="dump1090" ++ commit ucitrack ++EOF ++ ++rm -f /tmp/luci-indexcache ++exit 0 +diff --git a/feeds/luci/applications/luci-app-firewall/Makefile b/feeds/luci/applications/luci-app-firewall/Makefile +new file mode 100644 +index 0000000..21804d7 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-firewall/Makefile +@@ -0,0 +1,14 @@ ++# ++# Copyright (C) 2008-2014 The LuCI Team ++# ++# This is free software, licensed under the Apache License, Version 2.0 . ++# ++ ++include $(TOPDIR)/rules.mk ++ ++LUCI_TITLE:=Firewall and Portforwarding application ++LUCI_DEPENDS:=+firewall ++ ++include ../../luci.mk ++ ++# call BuildPackage - OpenWrt buildroot signature +diff --git a/feeds/luci/applications/luci-app-firewall/luasrc/controller/firewall.lua b/feeds/luci/applications/luci-app-firewall/luasrc/controller/firewall.lua +new file mode 100644 +index 0000000..5a6ab0a +--- /dev/null ++++ b/feeds/luci/applications/luci-app-firewall/luasrc/controller/firewall.lua +@@ -0,0 +1,23 @@ ++module("luci.controller.firewall", package.seeall) ++ ++function index() ++ entry({"admin", "network", "firewall"}, ++ alias("admin", "network", "firewall", "zones"), ++ _("Firewall"), 60) ++ ++ entry({"admin", "network", "firewall", "zones"}, ++ arcombine(cbi("firewall/zones"), cbi("firewall/zone-details")), ++ _("General Settings"), 10).leaf = true ++ ++ entry({"admin", "network", "firewall", "forwards"}, ++ arcombine(cbi("firewall/forwards"), cbi("firewall/forward-details")), ++ _("Port Forwards"), 20).leaf = true ++ ++ entry({"admin", "network", "firewall", "rules"}, ++ arcombine(cbi("firewall/rules"), cbi("firewall/rule-details")), ++ _("Traffic Rules"), 30).leaf = true ++ ++ entry({"admin", "network", "firewall", "custom"}, ++ cbi("firewall/custom"), ++ _("Custom Rules"), 40).leaf = true ++end +diff --git a/feeds/luci/applications/luci-app-firewall/luasrc/model/cbi/firewall/custom.lua b/feeds/luci/applications/luci-app-firewall/luasrc/model/cbi/firewall/custom.lua +new file mode 100644 +index 0000000..968ac36 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-firewall/luasrc/model/cbi/firewall/custom.lua +@@ -0,0 +1,27 @@ ++-- Copyright 2011 Jo-Philipp Wich ++-- Licensed to the public under the Apache License 2.0. ++ ++local fs = require "nixio.fs" ++ ++local f = SimpleForm("firewall", ++ translate("Firewall - Custom Rules"), ++ translate("Custom rules allow you to execute arbritary iptables commands \ ++ which are not otherwise covered by the firewall framework. \ ++ The commands are executed after each firewall restart, right after \ ++ the default ruleset has been loaded.")) ++ ++local o = f:field(Value, "_custom") ++ ++o.template = "cbi/tvalue" ++o.rows = 20 ++ ++function o.cfgvalue(self, section) ++ return fs.readfile("/etc/firewall.user") ++end ++ ++function o.write(self, section, value) ++ value = value:gsub("\r\n?", "\n") ++ fs.writefile("/etc/firewall.user", value) ++end ++ ++return f +diff --git a/feeds/luci/applications/luci-app-firewall/luasrc/model/cbi/firewall/forward-details.lua b/feeds/luci/applications/luci-app-firewall/luasrc/model/cbi/firewall/forward-details.lua +new file mode 100644 +index 0000000..22f1c77 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-firewall/luasrc/model/cbi/firewall/forward-details.lua +@@ -0,0 +1,150 @@ ++-- Copyright 2011 Jo-Philipp Wich ++-- Licensed to the public under the Apache License 2.0. ++ ++local sys = require "luci.sys" ++local dsp = require "luci.dispatcher" ++local ft = require "luci.tools.firewall" ++ ++local m, s, o ++ ++arg[1] = arg[1] or "" ++ ++m = Map("firewall", ++ translate("Firewall - Port Forwards"), ++ translate("This page allows you to change advanced properties of the port \ ++ forwarding entry. In most cases there is no need to modify \ ++ those settings.")) ++ ++m.redirect = dsp.build_url("admin/network/firewall/forwards") ++ ++if m.uci:get("firewall", arg[1]) ~= "redirect" then ++ luci.http.redirect(m.redirect) ++ return ++else ++ local name = m:get(arg[1], "name") or m:get(arg[1], "_name") ++ if not name or #name == 0 then ++ name = translate("(Unnamed Entry)") ++ end ++ m.title = "%s - %s" %{ translate("Firewall - Port Forwards"), name } ++end ++ ++s = m:section(NamedSection, arg[1], "redirect", "") ++s.anonymous = true ++s.addremove = false ++ ++ft.opt_enabled(s, Button) ++ft.opt_name(s, Value, translate("Name")) ++ ++ ++o = s:option(Value, "proto", translate("Protocol")) ++o:value("tcp udp", "TCP+UDP") ++o:value("tcp", "TCP") ++o:value("udp", "UDP") ++o:value("icmp", "ICMP") ++ ++function o.cfgvalue(...) ++ local v = Value.cfgvalue(...) ++ if not v or v == "tcpudp" then ++ return "tcp udp" ++ end ++ return v ++end ++ ++ ++o = s:option(Value, "src", translate("Source zone")) ++o.nocreate = true ++o.default = "wan" ++o.template = "cbi/firewall_zonelist" ++ ++ ++o = s:option(DynamicList, "src_mac", ++ translate("Source MAC address"), ++ translate("Only match incoming traffic from these MACs.")) ++o.rmempty = true ++o.datatype = "neg(macaddr)" ++o.placeholder = translate("any") ++ ++luci.sys.net.mac_hints(function(mac, name) ++ o:value(mac, "%s (%s)" %{ mac, name }) ++end) ++ ++ ++o = s:option(Value, "src_ip", ++ translate("Source IP address"), ++ translate("Only match incoming traffic from this IP or range.")) ++o.rmempty = true ++o.datatype = "neg(ip4addr)" ++o.placeholder = translate("any") ++ ++luci.sys.net.ipv4_hints(function(ip, name) ++ o:value(ip, "%s (%s)" %{ ip, name }) ++end) ++ ++ ++o = s:option(Value, "src_port", ++ translate("Source port"), ++ translate("Only match incoming traffic originating from the given source port or port range on the client host")) ++o.rmempty = true ++o.datatype = "neg(portrange)" ++o.placeholder = translate("any") ++ ++ ++o = s:option(Value, "src_dip", ++ translate("External IP address"), ++ translate("Only match incoming traffic directed at the given IP address.")) ++ ++luci.sys.net.ipv4_hints(function(ip, name) ++ o:value(ip, "%s (%s)" %{ ip, name }) ++end) ++ ++ ++o.rmempty = true ++o.datatype = "neg(ip4addr)" ++o.placeholder = translate("any") ++ ++ ++o = s:option(Value, "src_dport", translate("External port"), ++ translate("Match incoming traffic directed at the given " .. ++ "destination port or port range on this host")) ++o.datatype = "neg(portrange)" ++ ++ ++ ++o = s:option(Value, "dest", translate("Internal zone")) ++o.nocreate = true ++o.default = "lan" ++o.template = "cbi/firewall_zonelist" ++ ++ ++o = s:option(Value, "dest_ip", translate("Internal IP address"), ++ translate("Redirect matched incoming traffic to the specified \ ++ internal host")) ++o.datatype = "ip4addr" ++ ++luci.sys.net.ipv4_hints(function(ip, name) ++ o:value(ip, "%s (%s)" %{ ip, name }) ++end) ++ ++ ++o = s:option(Value, "dest_port", ++ translate("Internal port"), ++ translate("Redirect matched incoming traffic to the given port on \ ++ the internal host")) ++o.placeholder = translate("any") ++o.datatype = "portrange" ++ ++ ++o = s:option(Flag, "reflection", translate("Enable NAT Loopback")) ++o.rmempty = true ++o.default = o.enabled ++o.cfgvalue = function(...) ++ return Flag.cfgvalue(...) or "1" ++end ++ ++ ++s:option(Value, "extra", ++ translate("Extra arguments"), ++ translate("Passes additional arguments to iptables. Use with care!")) ++ ++ ++return m +diff --git a/feeds/luci/applications/luci-app-firewall/luasrc/model/cbi/firewall/forwards.lua b/feeds/luci/applications/luci-app-firewall/luasrc/model/cbi/firewall/forwards.lua +new file mode 100644 +index 0000000..e61ce73 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-firewall/luasrc/model/cbi/firewall/forwards.lua +@@ -0,0 +1,134 @@ ++-- Copyright 2008 Steven Barth ++-- Copyright 2010-2012 Jo-Philipp Wich ++-- Licensed to the public under the Apache License 2.0. ++ ++local ds = require "luci.dispatcher" ++local ft = require "luci.tools.firewall" ++ ++m = Map("firewall", translate("Firewall - Port Forwards"), ++ translate("Port forwarding allows remote computers on the Internet to \ ++ connect to a specific computer or service within the \ ++ private LAN.")) ++ ++-- ++-- Port Forwards ++-- ++ ++s = m:section(TypedSection, "redirect", translate("Port Forwards")) ++s.template = "cbi/tblsection" ++s.addremove = true ++s.anonymous = true ++s.sortable = true ++s.extedit = ds.build_url("admin/network/firewall/forwards/%s") ++s.template_addremove = "firewall/cbi_addforward" ++ ++function s.create(self, section) ++ local n = m:formvalue("_newfwd.name") ++ local p = m:formvalue("_newfwd.proto") ++ local E = m:formvalue("_newfwd.extzone") ++ local e = m:formvalue("_newfwd.extport") ++ local I = m:formvalue("_newfwd.intzone") ++ local a = m:formvalue("_newfwd.intaddr") ++ local i = m:formvalue("_newfwd.intport") ++ ++ if p == "other" or (p and a) then ++ created = TypedSection.create(self, section) ++ ++ self.map:set(created, "target", "DNAT") ++ self.map:set(created, "src", E or "wan") ++ self.map:set(created, "dest", I or "lan") ++ self.map:set(created, "proto", (p ~= "other") and p or "all") ++ self.map:set(created, "src_dport", e) ++ self.map:set(created, "dest_ip", a) ++ self.map:set(created, "dest_port", i) ++ self.map:set(created, "name", n) ++ end ++ ++ if p ~= "other" then ++ created = nil ++ end ++end ++ ++function s.parse(self, ...) ++ TypedSection.parse(self, ...) ++ if created then ++ m.uci:save("firewall") ++ luci.http.redirect(ds.build_url( ++ "admin/network/firewall/redirect", created ++ )) ++ end ++end ++ ++function s.filter(self, sid) ++ return (self.map:get(sid, "target") ~= "SNAT") ++end ++ ++ ++ft.opt_name(s, DummyValue, translate("Name")) ++ ++ ++local function forward_proto_txt(self, s) ++ return "%s-%s" %{ ++ translate("IPv4"), ++ ft.fmt_proto(self.map:get(s, "proto"), ++ self.map:get(s, "icmp_type")) or "TCP+UDP" ++ } ++end ++ ++local function forward_src_txt(self, s) ++ local z = ft.fmt_zone(self.map:get(s, "src"), translate("any zone")) ++ local a = ft.fmt_ip(self.map:get(s, "src_ip"), translate("any host")) ++ local p = ft.fmt_port(self.map:get(s, "src_port")) ++ local m = ft.fmt_mac(self.map:get(s, "src_mac")) ++ ++ if p and m then ++ return translatef("From %s in %s with source %s and %s", a, z, p, m) ++ elseif p or m then ++ return translatef("From %s in %s with source %s", a, z, p or m) ++ else ++ return translatef("From %s in %s", a, z) ++ end ++end ++ ++local function forward_via_txt(self, s) ++ local a = ft.fmt_ip(self.map:get(s, "src_dip"), translate("any router IP")) ++ local p = ft.fmt_port(self.map:get(s, "src_dport")) ++ ++ if p then ++ return translatef("Via %s at %s", a, p) ++ else ++ return translatef("Via %s", a) ++ end ++end ++ ++match = s:option(DummyValue, "match", translate("Match")) ++match.rawhtml = true ++match.width = "50%" ++function match.cfgvalue(self, s) ++ return "%s
    %s
    %s
    " % { ++ forward_proto_txt(self, s), ++ forward_src_txt(self, s), ++ forward_via_txt(self, s) ++ } ++end ++ ++ ++dest = s:option(DummyValue, "dest", translate("Forward to")) ++dest.rawhtml = true ++dest.width = "40%" ++function dest.cfgvalue(self, s) ++ local z = ft.fmt_zone(self.map:get(s, "dest"), translate("any zone")) ++ local a = ft.fmt_ip(self.map:get(s, "dest_ip"), translate("any host")) ++ local p = ft.fmt_port(self.map:get(s, "dest_port")) or ++ ft.fmt_port(self.map:get(s, "src_dport")) ++ ++ if p then ++ return translatef("%s, %s in %s", a, p, z) ++ else ++ return translatef("%s in %s", a, z) ++ end ++end ++ ++ft.opt_enabled(s, Flag, translate("Enable")).width = "1%" ++ ++return m +diff --git a/feeds/luci/applications/luci-app-firewall/luasrc/model/cbi/firewall/rule-details.lua b/feeds/luci/applications/luci-app-firewall/luasrc/model/cbi/firewall/rule-details.lua +new file mode 100644 +index 0000000..0cb30b5 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-firewall/luasrc/model/cbi/firewall/rule-details.lua +@@ -0,0 +1,319 @@ ++-- Copyright 2008 Steven Barth ++-- Copyright 2010-2012 Jo-Philipp Wich ++-- Licensed to the public under the Apache License 2.0. ++ ++local sys = require "luci.sys" ++local utl = require "luci.util" ++local dsp = require "luci.dispatcher" ++local nxo = require "nixio" ++ ++local ft = require "luci.tools.firewall" ++local nw = require "luci.model.network" ++local m, s, o, k, v ++ ++arg[1] = arg[1] or "" ++ ++m = Map("firewall", ++ translate("Firewall - Traffic Rules"), ++ translate("This page allows you to change advanced properties of the \ ++ traffic rule entry, such as matched source and destination \ ++ hosts.")) ++ ++m.redirect = dsp.build_url("admin/network/firewall/rules") ++ ++nw.init(m.uci) ++ ++local rule_type = m.uci:get("firewall", arg[1]) ++if rule_type == "redirect" and m:get(arg[1], "target") ~= "SNAT" then ++ rule_type = nil ++end ++ ++if not rule_type then ++ luci.http.redirect(m.redirect) ++ return ++ ++-- ++-- SNAT ++-- ++elseif rule_type == "redirect" then ++ ++ local name = m:get(arg[1], "name") or m:get(arg[1], "_name") ++ if not name or #name == 0 then ++ name = translate("(Unnamed SNAT)") ++ else ++ name = "SNAT %s" % name ++ end ++ ++ m.title = "%s - %s" %{ translate("Firewall - Traffic Rules"), name } ++ ++ local wan_zone = nil ++ ++ m.uci:foreach("firewall", "zone", ++ function(s) ++ local n = s.network or s.name ++ if n then ++ local i ++ for i in utl.imatch(n) do ++ if i == "wan" then ++ wan_zone = s.name ++ return false ++ end ++ end ++ end ++ end) ++ ++ s = m:section(NamedSection, arg[1], "redirect", "") ++ s.anonymous = true ++ s.addremove = false ++ ++ ++ ft.opt_enabled(s, Button) ++ ft.opt_name(s, Value, translate("Name")) ++ ++ ++ o = s:option(Value, "proto", ++ translate("Protocol"), ++ translate("You may specify multiple by selecting \"-- custom --\" and \ ++ then entering protocols separated by space.")) ++ ++ o:value("all", "All protocols") ++ o:value("tcp udp", "TCP+UDP") ++ o:value("tcp", "TCP") ++ o:value("udp", "UDP") ++ o:value("icmp", "ICMP") ++ ++ function o.cfgvalue(...) ++ local v = Value.cfgvalue(...) ++ if not v or v == "tcpudp" then ++ return "tcp udp" ++ end ++ return v ++ end ++ ++ ++ o = s:option(Value, "src", translate("Source zone")) ++ o.nocreate = true ++ o.default = "wan" ++ o.template = "cbi/firewall_zonelist" ++ ++ ++ o = s:option(Value, "src_ip", translate("Source IP address")) ++ o.rmempty = true ++ o.datatype = "neg(ipaddr)" ++ o.placeholder = translate("any") ++ ++ luci.sys.net.ipv4_hints(function(ip, name) ++ o:value(ip, "%s (%s)" %{ ip, name }) ++ end) ++ ++ ++ o = s:option(Value, "src_port", ++ translate("Source port"), ++ translate("Match incoming traffic originating from the given source \ ++ port or port range on the client host.")) ++ o.rmempty = true ++ o.datatype = "neg(portrange)" ++ o.placeholder = translate("any") ++ ++ ++ o = s:option(Value, "dest", translate("Destination zone")) ++ o.nocreate = true ++ o.default = "lan" ++ o.template = "cbi/firewall_zonelist" ++ ++ ++ o = s:option(Value, "dest_ip", translate("Destination IP address")) ++ o.datatype = "neg(ip4addr)" ++ ++ luci.sys.net.ipv4_hints(function(ip, name) ++ o:value(ip, "%s (%s)" %{ ip, name }) ++ end) ++ ++ ++ o = s:option(Value, "dest_port", ++ translate("Destination port"), ++ translate("Match forwarded traffic to the given destination port or \ ++ port range.")) ++ ++ o.rmempty = true ++ o.placeholder = translate("any") ++ o.datatype = "neg(portrange)" ++ ++ ++ o = s:option(Value, "src_dip", ++ translate("SNAT IP address"), ++ translate("Rewrite matched traffic to the given address.")) ++ o.rmempty = false ++ o.datatype = "ip4addr" ++ ++ for k, v in ipairs(nw:get_interfaces()) do ++ local a ++ for k, a in ipairs(v:ipaddrs()) do ++ o:value(a:host():string(), '%s (%s)' %{ ++ a:host():string(), v:shortname() ++ }) ++ end ++ end ++ ++ ++ o = s:option(Value, "src_dport", translate("SNAT port"), ++ translate("Rewrite matched traffic to the given source port. May be \ ++ left empty to only rewrite the IP address.")) ++ o.datatype = "portrange" ++ o.rmempty = true ++ o.placeholder = translate('Do not rewrite') ++ ++ ++ s:option(Value, "extra", ++ translate("Extra arguments"), ++ translate("Passes additional arguments to iptables. Use with care!")) ++ ++ ++-- ++-- Rule ++-- ++else ++ local name = m:get(arg[1], "name") or m:get(arg[1], "_name") ++ if not name or #name == 0 then ++ name = translate("(Unnamed Rule)") ++ end ++ ++ m.title = "%s - %s" %{ translate("Firewall - Traffic Rules"), name } ++ ++ ++ s = m:section(NamedSection, arg[1], "rule", "") ++ s.anonymous = true ++ s.addremove = false ++ ++ ft.opt_enabled(s, Button) ++ ft.opt_name(s, Value, translate("Name")) ++ ++ ++ o = s:option(ListValue, "family", translate("Restrict to address family")) ++ o.rmempty = true ++ o:value("", translate("IPv4 and IPv6")) ++ o:value("ipv4", translate("IPv4 only")) ++ o:value("ipv6", translate("IPv6 only")) ++ ++ ++ o = s:option(Value, "proto", translate("Protocol")) ++ o:value("all", translate("Any")) ++ o:value("tcp udp", "TCP+UDP") ++ o:value("tcp", "TCP") ++ o:value("udp", "UDP") ++ o:value("icmp", "ICMP") ++ ++ function o.cfgvalue(...) ++ local v = Value.cfgvalue(...) ++ if not v or v == "tcpudp" then ++ return "tcp udp" ++ end ++ return v ++ end ++ ++ ++ o = s:option(DynamicList, "icmp_type", translate("Match ICMP type")) ++ o:value("", "any") ++ o:value("echo-reply") ++ o:value("destination-unreachable") ++ o:value("network-unreachable") ++ o:value("host-unreachable") ++ o:value("protocol-unreachable") ++ o:value("port-unreachable") ++ o:value("fragmentation-needed") ++ o:value("source-route-failed") ++ o:value("network-unknown") ++ o:value("host-unknown") ++ o:value("network-prohibited") ++ o:value("host-prohibited") ++ o:value("TOS-network-unreachable") ++ o:value("TOS-host-unreachable") ++ o:value("communication-prohibited") ++ o:value("host-precedence-violation") ++ o:value("precedence-cutoff") ++ o:value("source-quench") ++ o:value("redirect") ++ o:value("network-redirect") ++ o:value("host-redirect") ++ o:value("TOS-network-redirect") ++ o:value("TOS-host-redirect") ++ o:value("echo-request") ++ o:value("router-advertisement") ++ o:value("router-solicitation") ++ o:value("time-exceeded") ++ o:value("ttl-zero-during-transit") ++ o:value("ttl-zero-during-reassembly") ++ o:value("parameter-problem") ++ o:value("ip-header-bad") ++ o:value("required-option-missing") ++ o:value("timestamp-request") ++ o:value("timestamp-reply") ++ o:value("address-mask-request") ++ o:value("address-mask-reply") ++ ++ ++ o = s:option(Value, "src", translate("Source zone")) ++ o.nocreate = true ++ o.allowany = true ++ o.default = "wan" ++ o.template = "cbi/firewall_zonelist" ++ ++ ++ o = s:option(Value, "src_mac", translate("Source MAC address")) ++ o.datatype = "list(macaddr)" ++ o.placeholder = translate("any") ++ ++ luci.sys.net.mac_hints(function(mac, name) ++ o:value(mac, "%s (%s)" %{ mac, name }) ++ end) ++ ++ ++ o = s:option(Value, "src_ip", translate("Source address")) ++ o.datatype = "neg(ipaddr)" ++ o.placeholder = translate("any") ++ ++ luci.sys.net.ipv4_hints(function(ip, name) ++ o:value(ip, "%s (%s)" %{ ip, name }) ++ end) ++ ++ ++ o = s:option(Value, "src_port", translate("Source port")) ++ o.datatype = "list(neg(portrange))" ++ o.placeholder = translate("any") ++ ++ ++ o = s:option(Value, "dest", translate("Destination zone")) ++ o.nocreate = true ++ o.allowany = true ++ o.allowlocal = true ++ o.template = "cbi/firewall_zonelist" ++ ++ ++ o = s:option(Value, "dest_ip", translate("Destination address")) ++ o.datatype = "neg(ipaddr)" ++ o.placeholder = translate("any") ++ ++ luci.sys.net.ipv4_hints(function(ip, name) ++ o:value(ip, "%s (%s)" %{ ip, name }) ++ end) ++ ++ ++ o = s:option(Value, "dest_port", translate("Destination port")) ++ o.datatype = "list(neg(portrange))" ++ o.placeholder = translate("any") ++ ++ ++ o = s:option(ListValue, "target", translate("Action")) ++ o.default = "ACCEPT" ++ o:value("DROP", translate("drop")) ++ o:value("ACCEPT", translate("accept")) ++ o:value("REJECT", translate("reject")) ++ o:value("NOTRACK", translate("don't track")) ++ ++ ++ s:option(Value, "extra", ++ translate("Extra arguments"), ++ translate("Passes additional arguments to iptables. Use with care!")) ++end ++ ++return m +diff --git a/feeds/luci/applications/luci-app-firewall/luasrc/model/cbi/firewall/rules.lua b/feeds/luci/applications/luci-app-firewall/luasrc/model/cbi/firewall/rules.lua +new file mode 100644 +index 0000000..c533491 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-firewall/luasrc/model/cbi/firewall/rules.lua +@@ -0,0 +1,259 @@ ++-- Copyright 2008 Steven Barth ++-- Copyright 2010-2012 Jo-Philipp Wich ++-- Licensed to the public under the Apache License 2.0. ++ ++local ds = require "luci.dispatcher" ++local ft = require "luci.tools.firewall" ++ ++m = Map("firewall", ++ translate("Firewall - Traffic Rules"), ++ translate("Traffic rules define policies for packets traveling between \ ++ different zones, for example to reject traffic between certain hosts \ ++ or to open WAN ports on the router.")) ++ ++-- ++-- Rules ++-- ++ ++s = m:section(TypedSection, "rule", translate("Traffic Rules")) ++s.addremove = true ++s.anonymous = true ++s.sortable = true ++s.template = "cbi/tblsection" ++s.extedit = ds.build_url("admin/network/firewall/rules/%s") ++s.defaults.target = "ACCEPT" ++s.template_addremove = "firewall/cbi_addrule" ++ ++ ++function s.create(self, section) ++ created = TypedSection.create(self, section) ++end ++ ++function s.parse(self, ...) ++ TypedSection.parse(self, ...) ++ ++ local i_n = m:formvalue("_newopen.name") ++ local i_p = m:formvalue("_newopen.proto") ++ local i_e = m:formvalue("_newopen.extport") ++ local i_x = m:formvalue("_newopen.submit") ++ ++ local f_n = m:formvalue("_newfwd.name") ++ local f_s = m:formvalue("_newfwd.src") ++ local f_d = m:formvalue("_newfwd.dest") ++ local f_x = m:formvalue("_newfwd.submit") ++ ++ if i_x then ++ created = TypedSection.create(self, section) ++ ++ self.map:set(created, "target", "ACCEPT") ++ self.map:set(created, "src", "wan") ++ self.map:set(created, "proto", (i_p ~= "other") and i_p or "all") ++ self.map:set(created, "dest_port", i_e) ++ self.map:set(created, "name", i_n) ++ ++ if i_p ~= "other" and i_e and #i_e > 0 then ++ created = nil ++ end ++ ++ elseif f_x then ++ created = TypedSection.create(self, section) ++ ++ self.map:set(created, "target", "ACCEPT") ++ self.map:set(created, "src", f_s) ++ self.map:set(created, "dest", f_d) ++ self.map:set(created, "name", f_n) ++ end ++ ++ if created then ++ m.uci:save("firewall") ++ luci.http.redirect(ds.build_url( ++ "admin/network/firewall/rules", created ++ )) ++ end ++end ++ ++ft.opt_name(s, DummyValue, translate("Name")) ++ ++local function rule_proto_txt(self, s) ++ local f = self.map:get(s, "family") ++ local p = ft.fmt_proto(self.map:get(s, "proto"), ++ self.map:get(s, "icmp_type")) or translate("traffic") ++ ++ if f and f:match("4") then ++ return "%s-%s" %{ translate("IPv4"), p } ++ elseif f and f:match("6") then ++ return "%s-%s" %{ translate("IPv6"), p } ++ else ++ return "%s %s" %{ translate("Any"), p } ++ end ++end ++ ++local function rule_src_txt(self, s) ++ local z = ft.fmt_zone(self.map:get(s, "src"), translate("any zone")) ++ local a = ft.fmt_ip(self.map:get(s, "src_ip"), translate("any host")) ++ local p = ft.fmt_port(self.map:get(s, "src_port")) ++ local m = ft.fmt_mac(self.map:get(s, "src_mac")) ++ ++ if p and m then ++ return translatef("From %s in %s with source %s and %s", a, z, p, m) ++ elseif p or m then ++ return translatef("From %s in %s with source %s", a, z, p or m) ++ else ++ return translatef("From %s in %s", a, z) ++ end ++end ++ ++local function rule_dest_txt(self, s) ++ local z = ft.fmt_zone(self.map:get(s, "dest")) ++ local p = ft.fmt_port(self.map:get(s, "dest_port")) ++ ++ -- Forward ++ if z then ++ local a = ft.fmt_ip(self.map:get(s, "dest_ip"), translate("any host")) ++ if p then ++ return translatef("To %s, %s in %s", a, p, z) ++ else ++ return translatef("To %s in %s", a, z) ++ end ++ ++ -- Input ++ else ++ local a = ft.fmt_ip(self.map:get(s, "dest_ip"), ++ translate("any router IP")) ++ ++ if p then ++ return translatef("To %s at %s on this device", a, p) ++ else ++ return translatef("To %s on this device", a) ++ end ++ end ++end ++ ++local function snat_dest_txt(self, s) ++ local z = ft.fmt_zone(self.map:get(s, "dest"), translate("any zone")) ++ local a = ft.fmt_ip(self.map:get(s, "dest_ip"), translate("any host")) ++ local p = ft.fmt_port(self.map:get(s, "dest_port")) or ++ ft.fmt_port(self.map:get(s, "src_dport")) ++ ++ if p then ++ return translatef("To %s, %s in %s", a, p, z) ++ else ++ return translatef("To %s in %s", a, z) ++ end ++end ++ ++ ++match = s:option(DummyValue, "match", translate("Match")) ++match.rawhtml = true ++match.width = "70%" ++function match.cfgvalue(self, s) ++ return "%s
    %s
    %s
    " % { ++ rule_proto_txt(self, s), ++ rule_src_txt(self, s), ++ rule_dest_txt(self, s) ++ } ++end ++ ++target = s:option(DummyValue, "target", translate("Action")) ++target.rawhtml = true ++target.width = "20%" ++function target.cfgvalue(self, s) ++ local t = ft.fmt_target(self.map:get(s, "target"), self.map:get(s, "dest")) ++ local l = ft.fmt_limit(self.map:get(s, "limit"), ++ self.map:get(s, "limit_burst")) ++ ++ if l then ++ return translatef("%s and limit to %s", t, l) ++ else ++ return "%s" % t ++ end ++end ++ ++ft.opt_enabled(s, Flag, translate("Enable")).width = "1%" ++ ++ ++-- ++-- SNAT ++-- ++ ++s = m:section(TypedSection, "redirect", ++ translate("Source NAT"), ++ translate("Source NAT is a specific form of masquerading which allows \ ++ fine grained control over the source IP used for outgoing traffic, \ ++ for example to map multiple WAN addresses to internal subnets.")) ++s.template = "cbi/tblsection" ++s.addremove = true ++s.anonymous = true ++s.sortable = true ++s.extedit = ds.build_url("admin/network/firewall/rules/%s") ++s.template_addremove = "firewall/cbi_addsnat" ++ ++function s.create(self, section) ++ created = TypedSection.create(self, section) ++end ++ ++function s.parse(self, ...) ++ TypedSection.parse(self, ...) ++ ++ local n = m:formvalue("_newsnat.name") ++ local s = m:formvalue("_newsnat.src") ++ local d = m:formvalue("_newsnat.dest") ++ local a = m:formvalue("_newsnat.dip") ++ local p = m:formvalue("_newsnat.dport") ++ local x = m:formvalue("_newsnat.submit") ++ ++ if x and a and #a > 0 then ++ created = TypedSection.create(self, section) ++ ++ self.map:set(created, "target", "SNAT") ++ self.map:set(created, "src", s) ++ self.map:set(created, "dest", d) ++ self.map:set(created, "proto", "all") ++ self.map:set(created, "src_dip", a) ++ self.map:set(created, "src_dport", p) ++ self.map:set(created, "name", n) ++ end ++ ++ if created then ++ m.uci:save("firewall") ++ luci.http.redirect(ds.build_url( ++ "admin/network/firewall/rules", created ++ )) ++ end ++end ++ ++function s.filter(self, sid) ++ return (self.map:get(sid, "target") == "SNAT") ++end ++ ++ft.opt_name(s, DummyValue, translate("Name")) ++ ++match = s:option(DummyValue, "match", translate("Match")) ++match.rawhtml = true ++match.width = "70%" ++function match.cfgvalue(self, s) ++ return "%s
    %s
    %s
    " % { ++ rule_proto_txt(self, s), ++ rule_src_txt(self, s), ++ snat_dest_txt(self, s) ++ } ++end ++ ++snat = s:option(DummyValue, "via", translate("Action")) ++snat.rawhtml = true ++snat.width = "20%" ++function snat.cfgvalue(self, s) ++ local a = ft.fmt_ip(self.map:get(s, "src_dip")) ++ local p = ft.fmt_port(self.map:get(s, "src_dport")) ++ ++ if a and p then ++ return translatef("Rewrite to source %s, %s", a, p) ++ else ++ return translatef("Rewrite to source %s", a or p) ++ end ++end ++ ++ft.opt_enabled(s, Flag, translate("Enable")).width = "1%" ++ ++ ++return m +diff --git a/feeds/luci/applications/luci-app-firewall/luasrc/model/cbi/firewall/zone-details.lua b/feeds/luci/applications/luci-app-firewall/luasrc/model/cbi/firewall/zone-details.lua +new file mode 100644 +index 0000000..6c90476 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-firewall/luasrc/model/cbi/firewall/zone-details.lua +@@ -0,0 +1,232 @@ ++-- Copyright 2008 Steven Barth ++-- Copyright 2010-2011 Jo-Philipp Wich ++-- Licensed to the public under the Apache License 2.0. ++ ++local nw = require "luci.model.network" ++local fw = require "luci.model.firewall" ++local ds = require "luci.dispatcher" ++local ut = require "luci.util" ++ ++local m, p, i, v ++local s, name, net, family, msrc, mdest, log, lim ++local s2, out, inp ++ ++ ++m = Map("firewall", translate("Firewall - Zone Settings")) ++m.redirect = luci.dispatcher.build_url("admin/network/firewall/zones") ++ ++fw.init(m.uci) ++nw.init(m.uci) ++ ++ ++local zone = fw:get_zone(arg[1]) ++if not zone then ++ luci.http.redirect(dsp.build_url("admin/network/firewall/zones")) ++ return ++else ++ m.title = "%s - %s" %{ ++ translate("Firewall - Zone Settings"), ++ translatef("Zone %q", zone:name() or "?") ++ } ++end ++ ++ ++s = m:section(NamedSection, zone.sid, "zone", ++ translatef("Zone %q", zone:name()), ++ translatef("This section defines common properties of %q. \ ++ The input and output options set the default \ ++ policies for traffic entering and leaving this zone while the \ ++ forward option describes the policy for forwarded traffic \ ++ between different networks within the zone. \ ++ Covered networks specifies which available networks are \ ++ members of this zone.", zone:name())) ++ ++s.anonymous = true ++s.addremove = false ++ ++m.on_commit = function(map) ++ local zone = fw:get_zone(arg[1]) ++ if zone then ++ s.section = zone.sid ++ s2.section = zone.sid ++ end ++end ++ ++ ++s:tab("general", translate("General Settings")) ++s:tab("advanced", translate("Advanced Settings")) ++ ++ ++name = s:taboption("general", Value, "name", translate("Name")) ++name.optional = false ++name.forcewrite = true ++name.datatype = "and(uciname,maxlength(14))" ++ ++function name.write(self, section, value) ++ if zone:name() ~= value then ++ fw:rename_zone(zone:name(), value) ++ out.exclude = value ++ inp.exclude = value ++ end ++ ++ m.redirect = ds.build_url("admin/network/firewall/zones", value) ++ m.title = "%s - %s" %{ ++ translate("Firewall - Zone Settings"), ++ translatef("Zone %q", value or "?") ++ } ++end ++ ++p = { ++ s:taboption("general", ListValue, "input", translate("Input")), ++ s:taboption("general", ListValue, "output", translate("Output")), ++ s:taboption("general", ListValue, "forward", translate("Forward")) ++} ++ ++for i, v in ipairs(p) do ++ v:value("REJECT", translate("reject")) ++ v:value("DROP", translate("drop")) ++ v:value("ACCEPT", translate("accept")) ++end ++ ++s:taboption("general", Flag, "masq", translate("Masquerading")) ++s:taboption("general", Flag, "mtu_fix", translate("MSS clamping")) ++ ++net = s:taboption("general", Value, "network", translate("Covered networks")) ++net.template = "cbi/network_netlist" ++net.widget = "checkbox" ++net.cast = "string" ++ ++function net.formvalue(self, section) ++ return Value.formvalue(self, section) or "-" ++end ++ ++function net.cfgvalue(self, section) ++ return Value.cfgvalue(self, section) or name:cfgvalue(section) ++end ++ ++function net.write(self, section, value) ++ zone:clear_networks() ++ ++ local n ++ for n in ut.imatch(value) do ++ zone:add_network(n) ++ end ++end ++ ++ ++family = s:taboption("advanced", ListValue, "family", ++ translate("Restrict to address family")) ++ ++family.rmempty = true ++family:value("", translate("IPv4 and IPv6")) ++family:value("ipv4", translate("IPv4 only")) ++family:value("ipv6", translate("IPv6 only")) ++ ++msrc = s:taboption("advanced", DynamicList, "masq_src", ++ translate("Restrict Masquerading to given source subnets")) ++ ++msrc.optional = true ++msrc.datatype = "list(neg(or(uciname,hostname,ip4addr)))" ++msrc.placeholder = "0.0.0.0/0" ++msrc:depends("family", "") ++msrc:depends("family", "ipv4") ++ ++mdest = s:taboption("advanced", DynamicList, "masq_dest", ++ translate("Restrict Masquerading to given destination subnets")) ++ ++mdest.optional = true ++mdest.datatype = "list(neg(or(uciname,hostname,ip4addr)))" ++mdest.placeholder = "0.0.0.0/0" ++mdest:depends("family", "") ++mdest:depends("family", "ipv4") ++ ++s:taboption("advanced", Flag, "conntrack", ++ translate("Force connection tracking")) ++ ++log = s:taboption("advanced", Flag, "log", ++ translate("Enable logging on this zone")) ++ ++log.rmempty = true ++log.enabled = "1" ++ ++lim = s:taboption("advanced", Value, "log_limit", ++ translate("Limit log messages")) ++ ++lim.placeholder = "10/minute" ++lim:depends("log", "1") ++ ++ ++s2 = m:section(NamedSection, zone.sid, "fwd_out", ++ translate("Inter-Zone Forwarding"), ++ translatef("The options below control the forwarding policies between \ ++ this zone (%s) and other zones. Destination zones cover \ ++ forwarded traffic originating from %q. \ ++ Source zones match forwarded traffic from other zones \ ++ targeted at %q. The forwarding rule is \ ++ unidirectional, e.g. a forward from lan to wan does \ ++ not imply a permission to forward from wan to lan as well.", ++ zone:name(), zone:name(), zone:name() ++ ++ )) ++ ++out = s2:option(Value, "out", ++ translate("Allow forward to destination zones:")) ++ ++out.nocreate = true ++out.widget = "checkbox" ++out.exclude = zone:name() ++out.template = "cbi/firewall_zonelist" ++ ++inp = s2:option(Value, "in", ++ translate("Allow forward from source zones:")) ++ ++inp.nocreate = true ++inp.widget = "checkbox" ++inp.exclude = zone:name() ++inp.template = "cbi/firewall_zonelist" ++ ++function out.cfgvalue(self, section) ++ local v = { } ++ local f ++ for _, f in ipairs(zone:get_forwardings_by("src")) do ++ v[#v+1] = f:dest() ++ end ++ return table.concat(v, " ") ++end ++ ++function inp.cfgvalue(self, section) ++ local v = { } ++ local f ++ for _, f in ipairs(zone:get_forwardings_by("dest")) do ++ v[#v+1] = f:src() ++ end ++ return v ++end ++ ++function out.formvalue(self, section) ++ return Value.formvalue(self, section) or "-" ++end ++ ++function inp.formvalue(self, section) ++ return Value.formvalue(self, section) or "-" ++end ++ ++function out.write(self, section, value) ++ zone:del_forwardings_by("src") ++ ++ local f ++ for f in ut.imatch(value) do ++ zone:add_forwarding_to(f) ++ end ++end ++ ++function inp.write(self, section, value) ++ zone:del_forwardings_by("dest") ++ ++ local f ++ for f in ut.imatch(value) do ++ zone:add_forwarding_from(f) ++ end ++end ++ ++return m +diff --git a/feeds/luci/applications/luci-app-firewall/luasrc/model/cbi/firewall/zones.lua b/feeds/luci/applications/luci-app-firewall/luasrc/model/cbi/firewall/zones.lua +new file mode 100644 +index 0000000..60968ce +--- /dev/null ++++ b/feeds/luci/applications/luci-app-firewall/luasrc/model/cbi/firewall/zones.lua +@@ -0,0 +1,77 @@ ++-- Copyright 2008 Steven Barth ++-- Licensed to the public under the Apache License 2.0. ++ ++local ds = require "luci.dispatcher" ++local fw = require "luci.model.firewall" ++ ++local m, s, o, p, i, v ++ ++m = Map("firewall", ++ translate("Firewall - Zone Settings"), ++ translate("The firewall creates zones over your network interfaces to control network traffic flow.")) ++ ++fw.init(m.uci) ++ ++s = m:section(TypedSection, "defaults", translate("General Settings")) ++s.anonymous = true ++s.addremove = false ++ ++s:option(Flag, "syn_flood", translate("Enable SYN-flood protection")) ++ ++o = s:option(Flag, "drop_invalid", translate("Drop invalid packets")) ++o.default = o.disabled ++ ++p = { ++ s:option(ListValue, "input", translate("Input")), ++ s:option(ListValue, "output", translate("Output")), ++ s:option(ListValue, "forward", translate("Forward")) ++} ++ ++for i, v in ipairs(p) do ++ v:value("REJECT", translate("reject")) ++ v:value("DROP", translate("drop")) ++ v:value("ACCEPT", translate("accept")) ++end ++ ++ ++s = m:section(TypedSection, "zone", translate("Zones")) ++s.template = "cbi/tblsection" ++s.anonymous = true ++s.addremove = true ++s.extedit = ds.build_url("admin", "network", "firewall", "zones", "%s") ++ ++function s.create(self) ++ local z = fw:new_zone() ++ if z then ++ luci.http.redirect( ++ ds.build_url("admin", "network", "firewall", "zones", z.sid) ++ ) ++ end ++end ++ ++function s.remove(self, section) ++ return fw:del_zone(section) ++end ++ ++o = s:option(DummyValue, "_info", translate("Zone ⇒ Forwardings")) ++o.template = "cbi/firewall_zoneforwards" ++o.cfgvalue = function(self, section) ++ return self.map:get(section, "name") ++end ++ ++p = { ++ s:option(ListValue, "input", translate("Input")), ++ s:option(ListValue, "output", translate("Output")), ++ s:option(ListValue, "forward", translate("Forward")) ++} ++ ++for i, v in ipairs(p) do ++ v:value("REJECT", translate("reject")) ++ v:value("DROP", translate("drop")) ++ v:value("ACCEPT", translate("accept")) ++end ++ ++s:option(Flag, "masq", translate("Masquerading")) ++s:option(Flag, "mtu_fix", translate("MSS clamping")) ++ ++return m +diff --git a/feeds/luci/applications/luci-app-firewall/luasrc/tools/firewall.lua b/feeds/luci/applications/luci-app-firewall/luasrc/tools/firewall.lua +new file mode 100644 +index 0000000..6d08fe1 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-firewall/luasrc/tools/firewall.lua +@@ -0,0 +1,279 @@ ++-- Copyright 2011-2012 Jo-Philipp Wich ++-- Licensed to the public under the Apache License 2.0. ++ ++module("luci.tools.firewall", package.seeall) ++ ++local ut = require "luci.util" ++local ip = require "luci.ip" ++local nx = require "nixio" ++ ++local translate, translatef = luci.i18n.translate, luci.i18n.translatef ++ ++local function tr(...) ++ return tostring(translate(...)) ++end ++ ++function fmt_neg(x) ++ if type(x) == "string" then ++ local v, neg = x:gsub("^ *! *", "") ++ if neg > 0 then ++ return v, "%s " % tr("not") ++ else ++ return x, "" ++ end ++ end ++ return x, "" ++end ++ ++function fmt_mac(x) ++ if x and #x > 0 then ++ local m, n ++ local l = { tr("MAC"), " " } ++ for m in ut.imatch(x) do ++ m, n = fmt_neg(m) ++ l[#l+1] = "%s%s" %{ n, m } ++ l[#l+1] = ", " ++ end ++ if #l > 1 then ++ l[#l] = nil ++ if #l > 3 then ++ l[1] = tr("MACs") ++ end ++ return table.concat(l, "") ++ end ++ end ++end ++ ++function fmt_port(x, d) ++ if x and #x > 0 then ++ local p, n ++ local l = { tr("port"), " " } ++ for p in ut.imatch(x) do ++ p, n = fmt_neg(p) ++ local a, b = p:match("(%d+)%D+(%d+)") ++ if a and b then ++ l[1] = tr("ports") ++ l[#l+1] = "%s%d-%d" %{ n, a, b } ++ else ++ l[#l+1] = "%s%d" %{ n, p } ++ end ++ l[#l+1] = ", " ++ end ++ if #l > 1 then ++ l[#l] = nil ++ if #l > 3 then ++ l[1] = tr("ports") ++ end ++ return table.concat(l, "") ++ end ++ end ++ return d and "%s" % d ++end ++ ++function fmt_ip(x, d) ++ if x and #x > 0 then ++ local l = { tr("IP"), " " } ++ local v, a, n ++ for v in ut.imatch(x) do ++ v, n = fmt_neg(v) ++ a, m = v:match("(%S+)/(%d+%.%S+)") ++ a = a or v ++ a = a:match(":") and ip.IPv6(a, m) or ip.IPv4(a, m) ++ if a and (a:is6() and a:prefix() < 128 or a:prefix() < 32) then ++ l[1] = tr("IP range") ++ l[#l+1] = "%s%s" %{ ++ a:minhost():string(), ++ a:maxhost():string(), ++ n, a:string() ++ } ++ else ++ l[#l+1] = "%s%s" %{ ++ n, ++ a and a:string() or v ++ } ++ end ++ l[#l+1] = ", " ++ end ++ if #l > 1 then ++ l[#l] = nil ++ if #l > 3 then ++ l[1] = tr("IPs") ++ end ++ return table.concat(l, "") ++ end ++ end ++ return d and "%s" % d ++end ++ ++function fmt_zone(x, d) ++ if x == "*" then ++ return "%s" % tr("any zone") ++ elseif x and #x > 0 then ++ return "%s" % x ++ elseif d then ++ return "%s" % d ++ end ++end ++ ++function fmt_icmp_type(x) ++ if x and #x > 0 then ++ local t, v, n ++ local l = { tr("type"), " " } ++ for v in ut.imatch(x) do ++ v, n = fmt_neg(v) ++ l[#l+1] = "%s%s" %{ n, v } ++ l[#l+1] = ", " ++ end ++ if #l > 1 then ++ l[#l] = nil ++ if #l > 3 then ++ l[1] = tr("types") ++ end ++ return table.concat(l, "") ++ end ++ end ++end ++ ++function fmt_proto(x, icmp_types) ++ if x and #x > 0 then ++ local v, n ++ local l = { } ++ local t = fmt_icmp_type(icmp_types) ++ for v in ut.imatch(x) do ++ v, n = fmt_neg(v) ++ if v == "tcpudp" then ++ l[#l+1] = "TCP" ++ l[#l+1] = ", " ++ l[#l+1] = "UDP" ++ l[#l+1] = ", " ++ elseif v ~= "all" then ++ local p = nx.getproto(v) ++ if p then ++ -- ICMP ++ if (p.proto == 1 or p.proto == 58) and t then ++ l[#l+1] = translatef( ++ "%s%s with %s", ++ n, p.aliases[1] or p.name, t ++ ) ++ else ++ l[#l+1] = "%s%s" %{ ++ n, ++ p.aliases[1] or p.name ++ } ++ end ++ l[#l+1] = ", " ++ end ++ end ++ end ++ if #l > 0 then ++ l[#l] = nil ++ return table.concat(l, "") ++ end ++ end ++end ++ ++function fmt_limit(limit, burst) ++ burst = tonumber(burst) ++ if limit and #limit > 0 then ++ local l, u = limit:match("(%d+)/(%w+)") ++ l = tonumber(l or limit) ++ u = u or "second" ++ if l then ++ if u:match("^s") then ++ u = tr("second") ++ elseif u:match("^m") then ++ u = tr("minute") ++ elseif u:match("^h") then ++ u = tr("hour") ++ elseif u:match("^d") then ++ u = tr("day") ++ end ++ if burst and burst > 0 then ++ return translatef("%d pkts. per %s, \ ++ burst %d pkts.", l, u, burst) ++ else ++ return translatef("%d pkts. per %s", l, u) ++ end ++ end ++ end ++end ++ ++function fmt_target(x, dest) ++ if dest and #dest > 0 then ++ if x == "ACCEPT" then ++ return tr("Accept forward") ++ elseif x == "REJECT" then ++ return tr("Refuse forward") ++ elseif x == "NOTRACK" then ++ return tr("Do not track forward") ++ else --if x == "DROP" then ++ return tr("Discard forward") ++ end ++ else ++ if x == "ACCEPT" then ++ return tr("Accept input") ++ elseif x == "REJECT" then ++ return tr("Refuse input") ++ elseif x == "NOTRACK" then ++ return tr("Do not track input") ++ else --if x == "DROP" then ++ return tr("Discard input") ++ end ++ end ++end ++ ++ ++function opt_enabled(s, t, ...) ++ if t == luci.cbi.Button then ++ local o = s:option(t, "__enabled") ++ function o.render(self, section) ++ if self.map:get(section, "enabled") ~= "0" then ++ self.title = tr("Rule is enabled") ++ self.inputtitle = tr("Disable") ++ self.inputstyle = "reset" ++ else ++ self.title = tr("Rule is disabled") ++ self.inputtitle = tr("Enable") ++ self.inputstyle = "apply" ++ end ++ t.render(self, section) ++ end ++ function o.write(self, section, value) ++ if self.map:get(section, "enabled") ~= "0" then ++ self.map:set(section, "enabled", "0") ++ else ++ self.map:del(section, "enabled") ++ end ++ end ++ return o ++ else ++ local o = s:option(t, "enabled", ...) ++ o.default = "1" ++ return o ++ end ++end ++ ++function opt_name(s, t, ...) ++ local o = s:option(t, "name", ...) ++ ++ function o.cfgvalue(self, section) ++ return self.map:get(section, "name") or ++ self.map:get(section, "_name") or "-" ++ end ++ ++ function o.write(self, section, value) ++ if value ~= "-" then ++ self.map:set(section, "name", value) ++ self.map:del(section, "_name") ++ else ++ self:remove(section) ++ end ++ end ++ ++ function o.remove(self, section) ++ self.map:del(section, "name") ++ self.map:del(section, "_name") ++ end ++ ++ return o ++end +diff --git a/feeds/luci/applications/luci-app-firewall/luasrc/view/firewall/cbi_addforward.htm b/feeds/luci/applications/luci-app-firewall/luasrc/view/firewall/cbi_addforward.htm +new file mode 100644 +index 0000000..3c46e22 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-firewall/luasrc/view/firewall/cbi_addforward.htm +@@ -0,0 +1,116 @@ ++<%- ++ local fw = require "luci.model.firewall".init() ++ local izl = { } ++ local ezl = { } ++ local _, z ++ for _, z in ipairs(fw:get_zones()) do ++ if z:name() ~= "wan" then ++ izl[#izl+1] = z ++ end ++ if z:name() ~= "lan" then ++ ezl[#ezl+1] = z ++ end ++ end ++-%> ++
    ++
    ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
    <%:New port forward%>:
    <%:Name%><%:Protocol%><%:External zone%><%:External port%><%:Internal zone%><%:Internal IP address%><%:Internal port%>
    ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
    ++ ++ ++
    +diff --git a/feeds/luci/applications/luci-app-firewall/luasrc/view/firewall/cbi_addrule.htm b/feeds/luci/applications/luci-app-firewall/luasrc/view/firewall/cbi_addrule.htm +new file mode 100644 +index 0000000..463b2e0 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-firewall/luasrc/view/firewall/cbi_addrule.htm +@@ -0,0 +1,112 @@ ++<% ++ local fw = require "luci.model.firewall".init() ++ local wz = fw:get_zone("wan") ++ local lz = fw:get_zone("lan") ++%> ++ ++
    ++ <% if wz and lz then %> ++
    ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
    <%:Open ports on router%>:
    <%:Name%><%:Protocol%><%:External port%>
    ++ ++ ++ ++ ++ ++ ++ ++
    ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++

    <%:New forward rule%>:
    <%:Name%><%:Source zone%><%:Destination zone%>
    ++ ++ ++ ++ ++ ++ ++ ++
    ++ ++ ++ <% else %> ++ ++ <% end %> ++
    +diff --git a/feeds/luci/applications/luci-app-firewall/luasrc/view/firewall/cbi_addsnat.htm b/feeds/luci/applications/luci-app-firewall/luasrc/view/firewall/cbi_addsnat.htm +new file mode 100644 +index 0000000..4e1681c +--- /dev/null ++++ b/feeds/luci/applications/luci-app-firewall/luasrc/view/firewall/cbi_addsnat.htm +@@ -0,0 +1,66 @@ ++<% ++ local fw = require "luci.model.firewall".init() ++ local nw = require "luci.model.network".init() ++ local wz = fw:get_zone("wan") ++ local lz = fw:get_zone("lan") ++%> ++ ++
    ++ <% if wz and lz then %> ++
    ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
    <%:New source NAT%>:
    <%:Name%><%:Source zone%><%:Destination zone%><%:To source IP%><%:To source port%>
    ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
    ++ ++ ++ <% else %> ++ ++ <% end %> ++
    +diff --git a/feeds/luci/applications/luci-app-firewall/po/ca/firewall.po b/feeds/luci/applications/luci-app-firewall/po/ca/firewall.po +new file mode 100644 +index 0000000..1843a16 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-firewall/po/ca/firewall.po +@@ -0,0 +1,603 @@ ++# luci-fw.pot ++# generated from ./applications/luci-fw/luasrc/i18n/luci-fw.en.lua ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Report-Msgid-Bugs-To: \n" ++"POT-Creation-Date: 2010-03-30 17:00+0200\n" ++"PO-Revision-Date: 2014-06-17 09:40+0200\n" ++"Last-Translator: Alex \n" ++"Language-Team: LANGUAGE \n" ++"Language: ca\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n != 1);\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "%s in %s" ++msgstr "%s en %s" ++ ++msgid "%s%s with %s" ++msgstr "%s%s amb %s" ++ ++msgid "%s, %s in %s" ++msgstr "%s, %s en %s" ++ ++msgid "(Unnamed Entry)" ++msgstr "(Entrada sense nom)" ++ ++msgid "(Unnamed Rule)" ++msgstr "(Regla sense nom)" ++ ++msgid "(Unnamed SNAT)" ++msgstr "(SNAT sense nom)" ++ ++msgid "-- Please choose --" ++msgstr "-- Si us plau, trieu --" ++ ++msgid "-- custom --" ++msgstr "-- personalitzats --" ++ ++msgid "%d pkts. per %s" ++msgstr "%d paquets al %s" ++ ++msgid "%d pkts. per %s, burst %d pkts." ++msgstr "" ++ ++msgid "%s and limit to %s" ++msgstr "%s i limita a %s" ++ ++msgid "Action" ++msgstr "Acció" ++ ++msgid "Add" ++msgstr "Afegeix" ++ ++msgid "Add and edit..." ++msgstr "Afegeix i edita..." ++ ++msgid "Advanced Settings" ++msgstr "Ajusts avançats" ++ ++msgid "Allow forward from source zones:" ++msgstr "Permet el reenviament des dels zones d'origen:" ++ ++msgid "Allow forward to destination zones:" ++msgstr "Permet el reenviament als zones de destí:" ++ ++msgid "Any" ++msgstr "Qualsevol" ++ ++msgid "Covered networks" ++msgstr "Xarxes cobertes" ++ ++msgid "Custom Rules" ++msgstr "Regles personalitzades" ++ ++msgid "" ++"Custom rules allow you to execute arbritary iptables commands which are not " ++"otherwise covered by the firewall framework. The commands are executed after " ++"each firewall restart, right after the default ruleset has been loaded." ++msgstr "" ++"Les regles personalitzades us permet executar ordres del iptables arbitraris " ++"que la infraestructura de tallafocs no cobreix d'altra manera. Aquests " ++"ordres s'executen després de cada reinici de tallafocs, just després el " ++"conjunt de regles per defecte s'ha carregat." ++ ++msgid "Destination IP address" ++msgstr "Adreça IP de destí" ++ ++msgid "Destination address" ++msgstr "Adreça de destí" ++ ++msgid "Destination port" ++msgstr "Port de destí" ++ ++msgid "Destination zone" ++msgstr "Zona de destí" ++ ++msgid "Do not rewrite" ++msgstr "No reescriguis" ++ ++msgid "Drop invalid packets" ++msgstr "Descarta els paquets invàlids" ++ ++msgid "Enable" ++msgstr "Habilita" ++ ++msgid "Enable NAT Loopback" ++msgstr "" ++ ++msgid "Enable SYN-flood protection" ++msgstr "Habilita protecció contra la inundació SYN" ++ ++msgid "Enable logging on this zone" ++msgstr "Habilita el registre d'aquesta zona" ++ ++msgid "External IP address" ++msgstr "Adreça IP extern" ++ ++msgid "External port" ++msgstr "Port extern" ++ ++msgid "External zone" ++msgstr "Zona extern" ++ ++msgid "Extra arguments" ++msgstr "Paràmetres extres" ++ ++msgid "Firewall" ++msgstr "Tallafocs" ++ ++msgid "Firewall - Custom Rules" ++msgstr "Tallafocs - Regles personalitzades" ++ ++msgid "Firewall - Port Forwards" ++msgstr "Tallafocs - Reenviaments de port" ++ ++msgid "Firewall - Traffic Rules" ++msgstr "Tallafocs - Regles de tràfic" ++ ++msgid "Firewall - Zone Settings" ++msgstr "Tallafocs - Ajusts de zona" ++ ++msgid "Force connection tracking" ++msgstr "Força el rastreig de connexió" ++ ++msgid "Forward" ++msgstr "Reenvia" ++ ++msgid "Forward to" ++msgstr "Reenvia a" ++ ++msgid "From %s in %s" ++msgstr "Des de %s en %s" ++ ++msgid "From %s in %s with source %s" ++msgstr "Des de %s en %s amb origen %s" ++ ++msgid "From %s in %s with source %s and %s" ++msgstr "Des de %s en %s amb orígens %s i %s" ++ ++msgid "General Settings" ++msgstr "Ajusts generals" ++ ++msgid "IPv4" ++msgstr "IPv4" ++ ++msgid "IPv4 and IPv6" ++msgstr "IPv4 i IPv6" ++ ++msgid "IPv4 only" ++msgstr "Només IPv4" ++ ++msgid "IPv6" ++msgstr "IPv6" ++ ++msgid "IPv6 only" ++msgstr "Només IPv6" ++ ++msgid "Input" ++msgstr "Entrada" ++ ++msgid "Inter-Zone Forwarding" ++msgstr "Reenviament interzonal" ++ ++msgid "Internal IP address" ++msgstr "Adreça IP interna" ++ ++msgid "Internal port" ++msgstr "Port intern" ++ ++msgid "Internal zone" ++msgstr "Zona interna" ++ ++msgid "Limit log messages" ++msgstr "Limita els missatges de registre" ++ ++msgid "MSS clamping" ++msgstr "Fixació MSS" ++ ++msgid "Masquerading" ++msgstr "Mascarada" ++ ++msgid "Match" ++msgstr "Coincideix" ++ ++msgid "Match ICMP type" ++msgstr "Coincideix amb el tipus ICMP" ++ ++msgid "Match forwarded traffic to the given destination port or port range." ++msgstr "" ++"Coincideix amb trànsit reenviat al port o rang de ports de destí donat." ++ ++msgid "" ++"Match incoming traffic directed at the given destination port or port range " ++"on this host" ++msgstr "" ++"Coincideix amb trànsit entrant dirigit al port o rang de ports de destí en " ++"aquest host donat" ++ ++msgid "" ++"Match incoming traffic originating from the given source port or port range " ++"on the client host." ++msgstr "" ++"Coincideix amb trànsit entrant originant en el host client des del port o " ++"rang de ports d'origen donat." ++ ++msgid "Name" ++msgstr "Nom" ++ ++msgid "New SNAT rule" ++msgstr "Nova regla SNAT" ++ ++msgid "New forward rule" ++msgstr "Nova regla de reenviament" ++ ++msgid "New input rule" ++msgstr "Nova regla d'entrada" ++ ++msgid "New port forward" ++msgstr "Nou reenviament de port" ++ ++msgid "New source NAT" ++msgstr "Nou origen NAT" ++ ++msgid "Only match incoming traffic directed at the given IP address." ++msgstr "Només coincideix amb trànsit entrant dirigit a la adreça IP donada." ++ ++msgid "Only match incoming traffic from these MACs." ++msgstr "Només coincideix amb trànsit entrant des d'aquests MAC." ++ ++msgid "Only match incoming traffic from this IP or range." ++msgstr "Només coincideix amb trànsit entrant des d'aquest IP o rang." ++ ++msgid "" ++"Only match incoming traffic originating from the given source port or port " ++"range on the client host" ++msgstr "" ++"Només coincideix amb trànsit originant en el host client des del port o del " ++"rang de ports d'origen donat" ++ ++msgid "Open ports on router" ++msgstr "Obre els ports en el encaminador" ++ ++msgid "Other..." ++msgstr "Altre..." ++ ++msgid "Output" ++msgstr "Sortida" ++ ++msgid "Passes additional arguments to iptables. Use with care!" ++msgstr "Passa paràmetres addicionals al iptables. Utilitzeu-ho amb cura!" ++ ++msgid "Port Forwards" ++msgstr "Reenviaments de port" ++ ++msgid "" ++"Port forwarding allows remote computers on the Internet to connect to a " ++"specific computer or service within the private LAN." ++msgstr "" ++"El reenviament de ports permet que els ordinadors remots en el Internet " ++"connectin a un ordinador o servei específic dins del LAN privat." ++ ++msgid "Protocol" ++msgstr "Protocol" ++ ++msgid "" ++"Redirect matched incoming traffic to the given port on the internal host" ++msgstr "Redirigeix trànsit entrant coincidit al port donat en el host intern" ++ ++msgid "Redirect matched incoming traffic to the specified internal host" ++msgstr "Redirigeix trànsit entrant coincidit al host intern especificat" ++ ++msgid "Restrict Masquerading to given destination subnets" ++msgstr "Restringeix la mascarada a les subxarxes de destí donades" ++ ++msgid "Restrict Masquerading to given source subnets" ++msgstr "Restringeix la mascarada a les subxarxes d'origen donades" ++ ++msgid "Restrict to address family" ++msgstr "Restringeix a la família d'adreces" ++ ++msgid "Rewrite matched traffic to the given address." ++msgstr "Reescriu el trànsit coincidint cap a la adreça donada." ++ ++msgid "" ++"Rewrite matched traffic to the given source port. May be left empty to only " ++"rewrite the IP address." ++msgstr "" ++"Reescriu el trànsit coincidint cap al port d'origen donat. Pot ser deixat en " ++"blanc per només reescriure l'adreça IP." ++ ++msgid "Rewrite to source %s" ++msgstr "Reescriu a l'origen %s" ++ ++msgid "Rewrite to source %s, %s" ++msgstr "Reescriu als orígens %s, %s" ++ ++msgid "SNAT IP address" ++msgstr "Adreça IP de SNAT" ++ ++msgid "SNAT port" ++msgstr "Port SNAT" ++ ++msgid "Source IP address" ++msgstr "Adreça IP d'origen" ++ ++msgid "Source MAC address" ++msgstr "Adreça MAC d'origen" ++ ++msgid "Source NAT" ++msgstr "NAT d'origen" ++ ++msgid "" ++"Source NAT is a specific form of masquerading which allows fine grained " ++"control over the source IP used for outgoing traffic, for example to map " ++"multiple WAN addresses to internal subnets." ++msgstr "" ++"El NAT d'origen és un forma específic de mascarada que permet control de gra " ++"fi sobre l'IP d'origen utilitzat pel trànsit sortint, per exemple per " ++"associar múltiples adreces WAN a subxarxes internes." ++ ++msgid "Source address" ++msgstr "Adreça d'origen" ++ ++msgid "Source port" ++msgstr "Port d'origen" ++ ++msgid "Source zone" ++msgstr "Zona d'origen" ++ ++msgid "" ++"The firewall creates zones over your network interfaces to control network " ++"traffic flow." ++msgstr "" ++"El tallafocs crea zones a les teves interfícies de xarxa per controlar el " ++"flux de tràfic de xarxa." ++ ++msgid "" ++"The options below control the forwarding policies between this zone (%s) and " ++"other zones. Destination zones cover forwarded traffic " ++"originating from %q. Source zones match forwarded " ++"traffic from other zones targeted at %q. The forwarding " ++"rule is unidirectional, e.g. a forward from lan to wan does " ++"not imply a permission to forward from wan to lan as well." ++msgstr "" ++"Les opcions a sota controlen les polítiques de reenviament entre aquesta " ++"zona (%s) i altres zones. Zones de destí cobreixen trànsit reenviat " ++"originant des de %q. Zones d'origen coincideixen " ++"amb trànsit reenviat des de altres zones apuntat a %q. La " ++"regla de reenviament es unidirectional, per exemple un reenviament " ++"de lan a wan no implica permís per reenviar de wan a lan també." ++ ++msgid "" ++"This page allows you to change advanced properties of the port forwarding " ++"entry. In most cases there is no need to modify those settings." ++msgstr "" ++"Aquesta pàgina us permet canviar propietats avançats de l'entrada de " ++"reenviament de port. En la majoria dels casos no hi ha necessitat de " ++"modificar aquests ajusts." ++ ++msgid "" ++"This page allows you to change advanced properties of the traffic rule " ++"entry, such as matched source and destination hosts." ++msgstr "" ++"Aquesta pàgina us permet canviar propietats avançats de l'entrada de regla " ++"de trànsit, com als hosts d'origen i de destí coincidits." ++ ++#, fuzzy ++msgid "" ++"This section defines common properties of %q. The input and " ++"output options set the default policies for traffic entering and " ++"leaving this zone while the forward option describes the policy for " ++"forwarded traffic between different networks within the zone. Covered " ++"networks specifies which available networks are members of this zone." ++msgstr "" ++"Aquesta secció defineix propietats comuns de %q. Les opcions entrada i sortida estableixen les polítiques per defecte per a trànsit " ++"entrant i sortint aquesta zona mentre l'opció reenvia descriu la " ++"política de trànsit reenviat entre xarxes distintes dins de la zona. " ++"Xarxes cobertes especifica quines xarxes disponibles són membres " ++"d'aquesta zona." ++ ++msgid "To %s at %s on this device" ++msgstr "A %s a %s en aquest dispositiu" ++ ++msgid "To %s in %s" ++msgstr "A %s en %s" ++ ++msgid "To %s on this device" ++msgstr "A %s en aquest dispositiu" ++ ++msgid "To %s, %s in %s" ++msgstr "A %s, %s en %s" ++ ++msgid "To source IP" ++msgstr "A l'IP d'origen" ++ ++msgid "To source port" ++msgstr "Al port d'origen" ++ ++msgid "Traffic Rules" ++msgstr "Regles de trànsit" ++ ++msgid "" ++"Traffic rules define policies for packets traveling between different zones, " ++"for example to reject traffic between certain hosts or to open WAN ports on " ++"the router." ++msgstr "" ++"Les regles de trànsit defineixen polítiques per als paquets viatjant entre " ++"zones distintes, per exemple per a rebutjar trànsit entre certs hosts o " ++"obrir ports WAN en el encaminador." ++ ++msgid "Via %s" ++msgstr "Via %s" ++ ++msgid "Via %s at %s" ++msgstr "Via %s a %s" ++ ++msgid "" ++"You may specify multiple by selecting \"-- custom --\" and then entering " ++"protocols separated by space." ++msgstr "" ++"Podeu especificar múltiples per seleccionar \"-- personalitzat --\" i " ++"llavors introduir protocols separats per espai." ++ ++msgid "Zone %q" ++msgstr "Zona %q" ++ ++msgid "Zone ⇒ Forwardings" ++msgstr "Zona ⇒ Reenviaments" ++ ++msgid "Zones" ++msgstr "Zones" ++ ++msgid "accept" ++msgstr "accepta" ++ ++msgid "any" ++msgstr "qualsevol" ++ ++msgid "any host" ++msgstr "qualsevol host" ++ ++msgid "any router IP" ++msgstr "qualsevol IP d'encaminador" ++ ++msgid "any zone" ++msgstr "qualsevol zona" ++ ++msgid "don't track" ++msgstr "no rastregis" ++ ++msgid "drop" ++msgstr "descarta" ++ ++msgid "reject" ++msgstr "rebutja" ++ ++msgid "traffic" ++msgstr "trànsit" ++ ++#~ msgid "Destination" ++#~ msgstr "Destí" ++ ++#~ msgid "Source" ++#~ msgstr "Origen" ++ ++#~ msgid "Internal port (optional)" ++#~ msgstr "Port intern (opcional)" ++ ++#~ msgid "Advanced Rules" ++#~ msgstr "Regles avançades" ++ ++#~ msgid "" ++#~ "Advanced rules let you customize the firewall to your needs. Only new " ++#~ "connections will be matched. Packets belonging to already open " ++#~ "connections are automatically allowed to pass the firewall." ++#~ msgstr "" ++#~ "Les regles avançades et deixen personalitzar el teu tallafocs per les " ++#~ "teves necessitats. Només s'hi correspondran les connexions noves. Als " ++#~ "paquets que pertanyen una connexió oberta se'ls permet passar el " ++#~ "tallafocs automàticament." ++ ++#~ msgid "Port forwarding" ++#~ msgstr "Readreçament de port" ++ ++#~ msgid "" ++#~ "Port forwarding allows to provide network services in the internal " ++#~ "network to an external network." ++#~ msgstr "" ++#~ "El readreçament de ports permet proveir serveis de la xarxa interna a una " ++#~ "xarxa externa." ++ ++#~ msgid "Traffic Redirection" ++#~ msgstr "Readreçament de tràfic" ++ ++#~ msgid "" ++#~ "Traffic redirection allows you to change the destination address of " ++#~ "forwarded packets." ++#~ msgstr "" ++#~ "El readreçament de tràfic et permet canviar l'adreça destí dels paquets " ++#~ "reenviats." ++ ++#, fuzzy ++#~ msgid "Network" ++#~ msgstr "Xarxes" ++ ++#~ msgid "Traffic Control" ++#~ msgstr "Control de tràfic" ++ ++#~ msgid "Zone-to-Zone traffic" ++#~ msgstr "Tràfic zona a zona" ++ ++#, fuzzy ++#~ msgid "" ++#~ "Here you can specify which network traffic is allowed to flow between " ++#~ "network zones. Only new connections will be matched. Packets belonging " ++#~ "to already open connections are automatically allowed to pass the " ++#~ "firewall. If you experience occasional connection problems try enabling " ++#~ "MSS Clamping otherwise disable it for performance reasons." ++#~ msgstr "" ++#~ "Ací pots especificar quin tràfic de xarxes es permet entre les zones de " ++#~ "xarxa. Només s'hi correspondren les connexions noves. Als paquets que " ++#~ "pertanyen una connexió oberta se'ls permet passar el tallafocs " ++#~ "automàticament. Si experimentes problemes de connexió ocasionals, intenta " ++#~ "activar el Clamping MSS, si no desactiva'l per raons de rendiment." ++ ++#~ msgid "Zone" ++#~ msgstr "Zona" ++ ++#, fuzzy ++#~ msgid "Destination IP" ++#~ msgstr "Destí" ++ ++#, fuzzy ++#~ msgid "IP address" ++#~ msgstr "Adreça IP" ++ ++#, fuzzy ++#~ msgid "Source MAC-address" ++#~ msgstr "Adreça MAC d'origen" ++ ++#~ msgid "Custom forwarding" ++#~ msgstr "Reenviament personalitzat" ++ ++#~ msgid "Input Zone" ++#~ msgstr "Zona d'entrada" ++ ++#~ msgid "Output Zone" ++#~ msgstr "Zona de sortida" ++ ++#~ msgid "External Zone" ++#~ msgstr "Zona externa" ++ ++#~ msgid "Source MAC" ++#~ msgstr "MAC origen" ++ ++#~ msgid "Defaults" ++#~ msgstr "Per defecte" ++ ++#~ msgid "" ++#~ "These are the default settings that are used if no other rules match." ++#~ msgstr "" ++#~ "Aquesta és la configuració per defecte utilitzada si no hi ha cap altra " ++#~ "regla que es correspongui." ++ ++#~ msgid "" ++#~ "Zones part the network interfaces into certain isolated areas to separate " ++#~ "network traffic. One or more networks can belong to a zone. The MASQ-flag " ++#~ "enables NAT masquerading for all outgoing traffic on this zone." ++#~ msgstr "" ++#~ "Les zones parteixen les interfícies de xarxa en certes àrees aïllades per " ++#~ "separar el tràfic de xarxa. Una o més xarxes poden pertànyer a una zona. " ++#~ "El flag MASQ activa el NAT masquerading per tot el tràfic sortint " ++#~ "d'aquesta zona." ++ ++#~ msgid "MASQ" ++#~ msgstr "MASQ" ++ ++#~ msgid "contained networks" ++#~ msgstr "Xarxes contingudes" +diff --git a/feeds/luci/applications/luci-app-firewall/po/cs/firewall.po b/feeds/luci/applications/luci-app-firewall/po/cs/firewall.po +new file mode 100644 +index 0000000..beda490 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-firewall/po/cs/firewall.po +@@ -0,0 +1,579 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"PO-Revision-Date: 2014-06-21 11:22+0200\n" ++"Last-Translator: koli \n" ++"Language-Team: none\n" ++"Language: cs\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "%s in %s" ++msgstr "%s v %s" ++ ++msgid "%s%s with %s" ++msgstr "%s%s s %s" ++ ++msgid "%s, %s in %s" ++msgstr "%s, %s v %s" ++ ++msgid "(Unnamed Entry)" ++msgstr "(Nepojmenovaný vstup)" ++ ++msgid "(Unnamed Rule)" ++msgstr "(Nepojmenované pravidlo)" ++ ++msgid "(Unnamed SNAT)" ++msgstr "(Nepojmenovaný SNAT)" ++ ++msgid "-- Please choose --" ++msgstr "-- Prosím zvolte --" ++ ++msgid "-- custom --" ++msgstr "-- vlastní --" ++ ++msgid "%d pkts. per %s" ++msgstr "%d paketů za %s" ++ ++msgid "%d pkts. per %s, burst %d pkts." ++msgstr "%d paketů za %s, burst %d paketů." ++ ++msgid "%s and limit to %s" ++msgstr "%s a omezit na %s" ++ ++msgid "Action" ++msgstr "Akce" ++ ++msgid "Add" ++msgstr "PÅ™idat" ++ ++msgid "Add and edit..." ++msgstr "PÅ™idat a upravit" ++ ++msgid "Advanced Settings" ++msgstr "PokroÄilé nastavení" ++ ++msgid "Allow forward from source zones:" ++msgstr "Povolit pÅ™esmÄ›rování ze zdrojových oblastí:" ++ ++msgid "Allow forward to destination zones:" ++msgstr "Povolit pÅ™esmÄ›rování do zdrojových oblastí:" ++ ++msgid "Any" ++msgstr "Libovolné" ++ ++msgid "Covered networks" ++msgstr "Pokryté sítÄ›" ++ ++msgid "Custom Rules" ++msgstr "Vlastní pravidla" ++ ++msgid "" ++"Custom rules allow you to execute arbritary iptables commands which are not " ++"otherwise covered by the firewall framework. The commands are executed after " ++"each firewall restart, right after the default ruleset has been loaded." ++msgstr "" ++"Vlastní pravidla vám umožňují spustit libovolné iptables příkazy, které " ++"nejsou jinak pokryté frameworkem firewallu. Příkazy jsou spuÅ¡tÄ›ny po každém " ++"restartu firewallu, právÄ› po naÄtení výchozí sady pravidel." ++ ++msgid "Destination IP address" ++msgstr "Cílová IP adresa" ++ ++msgid "Destination address" ++msgstr "Cílová adresa" ++ ++msgid "Destination port" ++msgstr "Cílový port" ++ ++msgid "Destination zone" ++msgstr "Cílová oblast" ++ ++msgid "Do not rewrite" ++msgstr "NepÅ™episovat" ++ ++msgid "Drop invalid packets" ++msgstr "Zahazovat neplatné pakety" ++ ++msgid "Enable" ++msgstr "Povolit" ++ ++msgid "Enable NAT Loopback" ++msgstr "Povolit NAT Loopback" ++ ++msgid "Enable SYN-flood protection" ++msgstr "Povolit ochranu proti SYN-flood" ++ ++msgid "Enable logging on this zone" ++msgstr "Povolit logování v této oblasti" ++ ++msgid "External IP address" ++msgstr "VnÄ›jší IP adresa" ++ ++msgid "External port" ++msgstr "VnÄ›jší port" ++ ++msgid "External zone" ++msgstr "VnÄ›jší zóna" ++ ++msgid "Extra arguments" ++msgstr "DodateÄné argumenty" ++ ++msgid "Firewall" ++msgstr "Firewall" ++ ++msgid "Firewall - Custom Rules" ++msgstr "Firewall - Vlastní pravidla" ++ ++msgid "Firewall - Port Forwards" ++msgstr "Firewall - PÅ™esmÄ›rování portů" ++ ++msgid "Firewall - Traffic Rules" ++msgstr "Firewall - Pravidla síťového provozu" ++ ++msgid "Firewall - Zone Settings" ++msgstr "Firewall - Nastavení zón" ++ ++msgid "Force connection tracking" ++msgstr "Vynutit sledování pÅ™ipojení" ++ ++msgid "Forward" ++msgstr "PÅ™esmÄ›rování" ++ ++msgid "Forward to" ++msgstr "PÅ™esmÄ›rovat na" ++ ++msgid "From %s in %s" ++msgstr "Z %s v %s" ++ ++msgid "From %s in %s with source %s" ++msgstr "Z %s v %s se zdrojovou %s" ++ ++msgid "From %s in %s with source %s and %s" ++msgstr "Z %s v %s se zdrojovou %s a %s" ++ ++msgid "General Settings" ++msgstr "Obecné nastavení" ++ ++msgid "IPv4" ++msgstr "IPv4" ++ ++msgid "IPv4 and IPv6" ++msgstr "IPv4 a IPv6" ++ ++msgid "IPv4 only" ++msgstr "pouze IPv4" ++ ++msgid "IPv6" ++msgstr "IPv6" ++ ++msgid "IPv6 only" ++msgstr "pouze IPv6" ++ ++msgid "Input" ++msgstr "Vstup" ++ ++# nebo mimo zóny? ++msgid "Inter-Zone Forwarding" ++msgstr "PÅ™esmÄ›rování mezi zónami" ++ ++msgid "Internal IP address" ++msgstr "VnitÅ™ní IP adresa" ++ ++msgid "Internal port" ++msgstr "VnitÅ™ní port" ++ ++msgid "Internal zone" ++msgstr "VnitÅ™ní zóna" ++ ++msgid "Limit log messages" ++msgstr "Omezit logovací zprávy" ++ ++msgid "MSS clamping" ++msgstr "MSS clamping" ++ ++msgid "Masquerading" ++msgstr "MaÅ¡kárádování" ++ ++msgid "Match" ++msgstr "Shoda" ++ ++msgid "Match ICMP type" ++msgstr "Odpovídá ICMP typu" ++ ++msgid "Match forwarded traffic to the given destination port or port range." ++msgstr "Vybrat provoz, pÅ™esmÄ›rovaný na zadaný port nebo rozsah portů" ++ ++msgid "" ++"Match incoming traffic directed at the given destination port or port range " ++"on this host" ++msgstr "" ++"Vybrat příchozí provoz, smÄ›rovaný na zadaný cílový port nebo rozsah portů " ++"tohoto hostitele" ++ ++msgid "" ++"Match incoming traffic originating from the given source port or port range " ++"on the client host." ++msgstr "" ++"Vybrat příchozí provoz, pocházející ze zadaného portu nebo rozsahu portů " ++"klienta." ++ ++msgid "Name" ++msgstr "Název" ++ ++msgid "New SNAT rule" ++msgstr "Nové pravidlo SNAT" ++ ++msgid "New forward rule" ++msgstr "Nové pÅ™esmÄ›rovací pravidlo" ++ ++msgid "New input rule" ++msgstr "Nové vstupní pravidlo" ++ ++msgid "New port forward" ++msgstr "Nové pÅ™esmÄ›rování portu" ++ ++msgid "New source NAT" ++msgstr "Nový zdrojový NAT (SNAT)" ++ ++msgid "Only match incoming traffic directed at the given IP address." ++msgstr "Vybrat pouze příchozí provoz, smÄ›rovaný na danou IP adresu." ++ ++msgid "Only match incoming traffic from these MACs." ++msgstr "Vybrat pouze příchozí provoz z tÄ›chto MAC adres." ++ ++msgid "Only match incoming traffic from this IP or range." ++msgstr "Vybrat pouze příchozí provoz z této IP nebo rozsahu IP adres." ++ ++msgid "" ++"Only match incoming traffic originating from the given source port or port " ++"range on the client host" ++msgstr "" ++"Vybrat pouze příchozí provoz, pocházející ze zadaného portu nebo rozsahu " ++"portů klienta." ++ ++msgid "Open ports on router" ++msgstr "OtevÅ™ené porty na routeru" ++ ++msgid "Other..." ++msgstr "Ostatní ..." ++ ++msgid "Output" ++msgstr "Výstup" ++ ++msgid "Passes additional arguments to iptables. Use with care!" ++msgstr "PÅ™edává další argumenty iptables. Používat opatrnÄ›!" ++ ++msgid "Port Forwards" ++msgstr "PÅ™esmÄ›rování portů" ++ ++msgid "" ++"Port forwarding allows remote computers on the Internet to connect to a " ++"specific computer or service within the private LAN." ++msgstr "" ++"PÅ™esmÄ›rování portů (port forwarding) umožňuje vzdáleným poÄítaÄům z " ++"Internetu pÅ™ipojení k vybraným poÄítaÄům nebo službám uvnitÅ™ privátní sítÄ› " ++"LAN." ++ ++msgid "Protocol" ++msgstr "Protokol" ++ ++msgid "" ++"Redirect matched incoming traffic to the given port on the internal host" ++msgstr "" ++"PÅ™esmÄ›rovat vybraný příchozí provoz na uvedený port vnitÅ™ního hostitele." ++ ++msgid "Redirect matched incoming traffic to the specified internal host" ++msgstr "PÅ™esmÄ›rovat vybraný příchozí provoz na uvedeného vnitÅ™ního hostitele." ++ ++msgid "Restrict Masquerading to given destination subnets" ++msgstr "Omezit maÅ¡karádování na uvedené cílové podsítÄ›" ++ ++msgid "Restrict Masquerading to given source subnets" ++msgstr "Omezit maÅ¡karádování na uvedené zdrojové podsítÄ›" ++ ++msgid "Restrict to address family" ++msgstr "Omezit na rodinu adres" ++ ++msgid "Rewrite matched traffic to the given address." ++msgstr "PÅ™epsat shodný provoz na uvedenou adresu." ++ ++msgid "" ++"Rewrite matched traffic to the given source port. May be left empty to only " ++"rewrite the IP address." ++msgstr "" ++"PÅ™epsat shodný provoz na uvedený zdrojový port. Může zůstat prázdné, pak " ++"bude pÅ™epsána pouze IP adresa." ++ ++msgid "Rewrite to source %s" ++msgstr "PÅ™epsat na zdrojovou %s" ++ ++msgid "Rewrite to source %s, %s" ++msgstr "PÅ™epsat na zdrojovou %s, %s" ++ ++msgid "SNAT IP address" ++msgstr "IP adresa SNATu" ++ ++msgid "SNAT port" ++msgstr "Port SNATu" ++ ++msgid "Source IP address" ++msgstr "Zdrojová IP adresa" ++ ++msgid "Source MAC address" ++msgstr "Zdrojová MAC adresa" ++ ++msgid "Source NAT" ++msgstr "Zdrojový NAT" ++ ++msgid "" ++"Source NAT is a specific form of masquerading which allows fine grained " ++"control over the source IP used for outgoing traffic, for example to map " ++"multiple WAN addresses to internal subnets." ++msgstr "" ++"Zdrojový NAT je specifická forma maÅ¡karádování, která umožňuje jemnozrnnou " ++"kontrolu nad zdrojovými IP, použitými pro odchozí provoz. Využívá se " ++"například pro mapování množství WAN adres do vnitÅ™ních podsítí." ++ ++msgid "Source address" ++msgstr "Zdrojová adresa" ++ ++msgid "Source port" ++msgstr "Zdrojový port" ++ ++msgid "Source zone" ++msgstr "Zdrojová zóna" ++ ++msgid "" ++"The firewall creates zones over your network interfaces to control network " ++"traffic flow." ++msgstr "" ++"Firewall vytváří zóny pÅ™es vaÅ¡e síťová rozhraní za úÄelem řízení síťového " ++"provozu." ++ ++msgid "" ++"The options below control the forwarding policies between this zone (%s) and " ++"other zones. Destination zones cover forwarded traffic " ++"originating from %q. Source zones match forwarded " ++"traffic from other zones targeted at %q. The forwarding " ++"rule is unidirectional, e.g. a forward from lan to wan does " ++"not imply a permission to forward from wan to lan as well." ++msgstr "" ++"Níže uvedené možnosti řídí pÅ™esmÄ›rovací politiky mezi touto zónou (%s) a " ++"ostatními zónami. Cílové zóny pokrývají pÅ™esmÄ›rovávaný provoz, " ++"pocházející z %q. Zdrojové zóny porovnávají " ++"pÅ™esmÄ›rovávaný provoz z ostatních zón, zaměřený na %q. " ++"PÅ™esmÄ›rovávací pravidlo je jednosmÄ›rné, například pÅ™esmÄ›rování z " ++"lan do wan nepovoluje pÅ™esmÄ›rování z wan do lan (a naopak)." ++ ++msgid "" ++"This page allows you to change advanced properties of the port forwarding " ++"entry. In most cases there is no need to modify those settings." ++msgstr "" ++"Tato stránka vám umožňuje zmÄ›nit pokroÄilé vlastností pÅ™esmÄ›rování portů. Ve " ++"vÄ›tÅ¡inÄ› případů není potÅ™eba upravovat tato nastavení." ++ ++msgid "" ++"This page allows you to change advanced properties of the traffic rule " ++"entry, such as matched source and destination hosts." ++msgstr "" ++"Tato stránka vám umožňuje zmÄ›nit pokroÄilé vlastnosti pravidla síťového " ++"provozu, například zdrojové a cílové hostitele." ++ ++#, fuzzy ++msgid "" ++"This section defines common properties of %q. The input and " ++"output options set the default policies for traffic entering and " ++"leaving this zone while the forward option describes the policy for " ++"forwarded traffic between different networks within the zone. Covered " ++"networks specifies which available networks are members of this zone." ++msgstr "" ++"Tato sekce definuje běžné možnosti %q. Vstupní a výstupní " ++"možnosti nastavují výchozí politiky pro provoz, vstupující do této zóny a " ++"vystupující z ní, zatímco pÅ™esmÄ›rovací možnosti popisují politiku " ++"pro pÅ™esmÄ›rování provozu mezi rozdílnými sítÄ›mi uvnitÅ™ jedné zóny. " ++"Pokryté sítÄ› urÄuje, které z dostupných sítí jsou Äleny této zóny." ++ ++msgid "To %s at %s on this device" ++msgstr "Na %s v %s na tomto zařízení" ++ ++msgid "To %s in %s" ++msgstr "Na %s v %s" ++ ++msgid "To %s on this device" ++msgstr "Na %s na tomto zařízení" ++ ++msgid "To %s, %s in %s" ++msgstr "Na %s, %s v %s" ++ ++msgid "To source IP" ++msgstr "Na zdrojovou IP" ++ ++msgid "To source port" ++msgstr "Na zdrojový port" ++ ++msgid "Traffic Rules" ++msgstr "Pravidla síťového provozu" ++ ++msgid "" ++"Traffic rules define policies for packets traveling between different zones, " ++"for example to reject traffic between certain hosts or to open WAN ports on " ++"the router." ++msgstr "" ++"Pravidla síťového provozu definují politiky pro cestování paketů mezi " ++"různými zónami, například pro odmítnutí provozu mezi jistými hostiteli nebo " ++"pro otevÅ™ení WAN portů na routeru." ++ ++msgid "Via %s" ++msgstr "ProstÅ™ednictvím %s" ++ ++msgid "Via %s at %s" ++msgstr "" ++ ++msgid "" ++"You may specify multiple by selecting \"-- custom --\" and then entering " ++"protocols separated by space." ++msgstr "" ++"Lze urÄit více protokolů. Vyberte \"-- vlastní --\" a vkládejte protokoly " ++"oddÄ›lené mezerou." ++ ++msgid "Zone %q" ++msgstr "Zóna %q" ++ ++msgid "Zone ⇒ Forwardings" ++msgstr "Zóna ⇒ PÅ™esmÄ›rování" ++ ++msgid "Zones" ++msgstr "Zóny" ++ ++msgid "accept" ++msgstr "pÅ™ijmout" ++ ++msgid "any" ++msgstr "libovolný" ++ ++msgid "any host" ++msgstr "libovolný hostitel" ++ ++msgid "any router IP" ++msgstr "libovolná IP routeru" ++ ++msgid "any zone" ++msgstr "libovolná zóna" ++ ++msgid "don't track" ++msgstr "nesledovat" ++ ++msgid "drop" ++msgstr "zahodit" ++ ++msgid "reject" ++msgstr "odmítnout" ++ ++msgid "traffic" ++msgstr "provoz" ++ ++#~ msgid "Destination" ++#~ msgstr "Cíl" ++ ++#~ msgid "Family" ++#~ msgstr "Rodina" ++ ++#~ msgid "Forward to %s in %s" ++#~ msgstr "PÅ™esmÄ›rovat na %s v %s" ++ ++#~ msgid "Forward to %s, %s in %s" ++#~ msgstr "PÅ™esmÄ›rovat na %s, %s v %s" ++ ++#~ msgid "SNAT" ++#~ msgstr "SNAT" ++ ++#~ msgid "Source" ++#~ msgstr "Zdroj" ++ ++#~ msgid "To %s" ++#~ msgstr "Na %s" ++ ++#~ msgid "To %s at %s" ++#~ msgstr "Na %s v %s" ++ ++#~ msgid "Via" ++#~ msgstr "pÅ™es" ++ ++#~ msgid "Accept forward" ++#~ msgstr "PÅ™ijmout pÅ™esmÄ›rování" ++ ++#~ msgid "Accept input" ++#~ msgstr "PÅ™ijmout vstup" ++ ++#~ msgid "Disable" ++#~ msgstr "Zakázat" ++ ++#~ msgid "Discard forward" ++#~ msgstr "Zahodit pÅ™esmÄ›rování" ++ ++#~ msgid "Discard input" ++#~ msgstr "Zahodit vstup" ++ ++#~ msgid "Do not track forward" ++#~ msgstr "Nesledovat pÅ™esmÄ›rování" ++ ++#~ msgid "Do not track input" ++#~ msgstr "Nesledovat vstup" ++ ++#~ msgid "IP" ++#~ msgstr "IP" ++ ++#~ msgid "IP range" ++#~ msgstr "IP rozsah" ++ ++#~ msgid "IPs" ++#~ msgstr "IP" ++ ++#~ msgid "MAC" ++#~ msgstr "MAC" ++ ++#~ msgid "MACs" ++#~ msgstr "MAC" ++ ++#~ msgid "Refuse forward" ++#~ msgstr "Odmítnout pÅ™esmÄ›rování" ++ ++#~ msgid "Refuse input" ++#~ msgstr "Odmítnout vstup" ++ ++#~ msgid "Rule is disabled" ++#~ msgstr "Pravidlo je zakázané" ++ ++#~ msgid "Rule is enabled" ++#~ msgstr "Pravidlo je povolené" ++ ++#~ msgid "day" ++#~ msgstr "den" ++ ++#~ msgid "hour" ++#~ msgstr "hodina" ++ ++#~ msgid "minute" ++#~ msgstr "minuta" ++ ++#~ msgid "not" ++#~ msgstr "ne" ++ ++#~ msgid "port" ++#~ msgstr "port" ++ ++#~ msgid "ports" ++#~ msgstr "porty" ++ ++#~ msgid "second" ++#~ msgstr "sekunda" ++ ++#~ msgid "type" ++#~ msgstr "typ" ++ ++#~ msgid "types" ++#~ msgstr "typy" +diff --git a/feeds/luci/applications/luci-app-firewall/po/de/firewall.po b/feeds/luci/applications/luci-app-firewall/po/de/firewall.po +new file mode 100644 +index 0000000..0e5ddcf +--- /dev/null ++++ b/feeds/luci/applications/luci-app-firewall/po/de/firewall.po +@@ -0,0 +1,748 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Report-Msgid-Bugs-To: \n" ++"POT-Creation-Date: 2010-03-30 17:00+0200\n" ++"PO-Revision-Date: 2014-03-25 02:04+0200\n" ++"Last-Translator: laryllian \n" ++"Language-Team: LANGUAGE \n" ++"Language: de\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n != 1);\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "%s in %s" ++msgstr "%s in %s" ++ ++msgid "%s%s with %s" ++msgstr "%s%s mit %s" ++ ++msgid "%s, %s in %s" ++msgstr "%s, %s in %s" ++ ++msgid "(Unnamed Entry)" ++msgstr "(Unbenannter Eintrag)" ++ ++msgid "(Unnamed Rule)" ++msgstr "(Unbenannte Regel)" ++ ++msgid "(Unnamed SNAT)" ++msgstr "(Unbennanter SNAT-Eintrag)" ++ ++msgid "-- Please choose --" ++msgstr "-- Bitte wählen --" ++ ++msgid "-- custom --" ++msgstr "-- benutzerdefiniert --" ++ ++msgid "%d pkts. per %s" ++msgstr "%d Pkte. pro %s" ++ ++msgid "%d pkts. per %s, burst %d pkts." ++msgstr "%d Pkte. pro %s, Häufung %d Pkte." ++ ++msgid "%s and limit to %s" ++msgstr "%s und limitieren auf %s" ++ ++msgid "Action" ++msgstr "Aktion" ++ ++msgid "Add" ++msgstr "Hinzufügen" ++ ++msgid "Add and edit..." ++msgstr "Hinzufügen und bearbeiten..." ++ ++msgid "Advanced Settings" ++msgstr "Erweiterte Einstellungen" ++ ++msgid "Allow forward from source zones:" ++msgstr "Erlaube Weiterleitung von Quellzone:" ++ ++msgid "Allow forward to destination zones:" ++msgstr "Erlaube Weiterleitung zu Zielzone:" ++ ++msgid "Any" ++msgstr "beliebig" ++ ++msgid "Covered networks" ++msgstr "Abgedeckte Netzwerke" ++ ++msgid "Custom Rules" ++msgstr "Benutzerdefinierte Regeln" ++ ++msgid "" ++"Custom rules allow you to execute arbritary iptables commands which are not " ++"otherwise covered by the firewall framework. The commands are executed after " ++"each firewall restart, right after the default ruleset has been loaded." ++msgstr "" ++"Benutzerdefinierte Regeln ermöglichen das Ausführen belieber iptables-" ++"Befehle welche durch das Firewall-Framework nicht unterstützt werden. Die " ++"Befehle werden mit jedem Firewall-Neustart abgearbeitet, direkt nach dem " ++"Laden der Basisregeln." ++ ++msgid "Destination IP address" ++msgstr "Ziel IP-Adresse" ++ ++msgid "Destination address" ++msgstr "Zieladresse" ++ ++msgid "Destination port" ++msgstr "Zielport" ++ ++msgid "Destination zone" ++msgstr "Ziel-Zone" ++ ++msgid "Do not rewrite" ++msgstr "Nicht umschreiben" ++ ++msgid "Drop invalid packets" ++msgstr "Ungültige Pakete verwerfen" ++ ++msgid "Enable" ++msgstr "Aktivieren" ++ ++msgid "Enable NAT Loopback" ++msgstr "NAT-Loopback aktivieren" ++ ++msgid "Enable SYN-flood protection" ++msgstr "Schutz vor SYN-flood-Attacken" ++ ++msgid "Enable logging on this zone" ++msgstr "Protokollierung innerhalb der Zone aktivieren" ++ ++msgid "External IP address" ++msgstr "Externe IP-Adresse" ++ ++msgid "External port" ++msgstr "Externer Port" ++ ++msgid "External zone" ++msgstr "Externe Zone" ++ ++msgid "Extra arguments" ++msgstr "Zusätzliche Argumente" ++ ++msgid "Firewall" ++msgstr "Firewall" ++ ++msgid "Firewall - Custom Rules" ++msgstr "Firewall - Benutzerdefinierte Regeln" ++ ++msgid "Firewall - Port Forwards" ++msgstr "Firewall - Portweiterleitungen" ++ ++msgid "Firewall - Traffic Rules" ++msgstr "Firewall - Verkehrsregeln" ++ ++msgid "Firewall - Zone Settings" ++msgstr "Firewall - Zoneneinstellungen" ++ ++msgid "Force connection tracking" ++msgstr "Connectiontracking erzwingen" ++ ++msgid "Forward" ++msgstr "Weitergeleitet" ++ ++msgid "Forward to" ++msgstr "Weiterleiten an" ++ ++msgid "From %s in %s" ++msgstr "Von %s in %s" ++ ++msgid "From %s in %s with source %s" ++msgstr "Von %s in %s mit Quell-%s" ++ ++msgid "From %s in %s with source %s and %s" ++msgstr "Von %s in %s mit Quell-%s und %s" ++ ++msgid "General Settings" ++msgstr "Allgemein" ++ ++msgid "IPv4" ++msgstr "IPv4" ++ ++msgid "IPv4 and IPv6" ++msgstr "IPv4 und IPv6" ++ ++msgid "IPv4 only" ++msgstr "nur IPv4" ++ ++msgid "IPv6" ++msgstr "IPv6" ++ ++msgid "IPv6 only" ++msgstr "nur IPv6" ++ ++msgid "Input" ++msgstr "Eingang" ++ ++msgid "Inter-Zone Forwarding" ++msgstr "Weiterleitungen zwischen Zonen" ++ ++msgid "Internal IP address" ++msgstr "Interne IP-Adresse" ++ ++msgid "Internal port" ++msgstr "Interner Port" ++ ++msgid "Internal zone" ++msgstr "Interne Zone" ++ ++msgid "Limit log messages" ++msgstr "Protokollnachrichten limitieren" ++ ++msgid "MSS clamping" ++msgstr "MSS Korrektur" ++ ++msgid "Masquerading" ++msgstr "NAT aktivieren" ++ ++msgid "Match" ++msgstr "Filter" ++ ++msgid "Match ICMP type" ++msgstr "Nach ICMP-Typ filtern" ++ ++msgid "Match forwarded traffic to the given destination port or port range." ++msgstr "Selektiert weitergeleiteten Verkehr nach den angegebenen Ziel-Ports." ++ ++msgid "" ++"Match incoming traffic directed at the given destination port or port range " ++"on this host" ++msgstr "" ++"Eingehende Verbindungen filtern welche an den angegebenen Port oder " ++"Portbereich auf dem lokalen Gerät gerichtet sind" ++ ++msgid "" ++"Match incoming traffic originating from the given source port or port range " ++"on the client host." ++msgstr "Selektiert eingehenden Verkehr nach den angegebenen Quell-Ports." ++ ++msgid "Name" ++msgstr "Name" ++ ++msgid "New SNAT rule" ++msgstr "Neue SNAT-Regel" ++ ++msgid "New forward rule" ++msgstr "Neuer Weiterleitungsregel" ++ ++msgid "New input rule" ++msgstr "Neue Eingangsregel" ++ ++msgid "New port forward" ++msgstr "Neue Portweiterleitung" ++ ++msgid "New source NAT" ++msgstr "Neues SNAT" ++ ++msgid "Only match incoming traffic directed at the given IP address." ++msgstr "Selektiere nur Verkehr der an die angegebene IP-Adresse gerichtet ist." ++ ++msgid "Only match incoming traffic from these MACs." ++msgstr "Selektiere nur Verkehr von den angegebenen MAC-Adressen." ++ ++msgid "Only match incoming traffic from this IP or range." ++msgstr "Selektiere nur Verkehr vom angebenem Quell-IP-Adressbereich." ++ ++msgid "" ++"Only match incoming traffic originating from the given source port or port " ++"range on the client host" ++msgstr "Selektiere nur Verkehr von den angegebenen Quell-Ports auf dem Client." ++ ++msgid "Open ports on router" ++msgstr "Ports auf dem Router öffnen" ++ ++msgid "Other..." ++msgstr "Anderes..." ++ ++msgid "Output" ++msgstr "Ausgang" ++ ++msgid "Passes additional arguments to iptables. Use with care!" ++msgstr "" ++"Gibt zusätzliche Kommandozeilenargumente an iptables weiter. Mit Vorsicht " ++"benutzen!" ++ ++msgid "Port Forwards" ++msgstr "Portweiterleitungen" ++ ++msgid "" ++"Port forwarding allows remote computers on the Internet to connect to a " ++"specific computer or service within the private LAN." ++msgstr "" ++"Portweiterleitungen ermöglichen es entfernten Rechnern im Internet auf " ++"bestimmte Computer oder Dienste im lokalen LAN zuzugreifen." ++ ++msgid "Protocol" ++msgstr "Protokoll" ++ ++msgid "" ++"Redirect matched incoming traffic to the given port on the internal host" ++msgstr "" ++"Gefilterte Verbindungen an den angegeben Port auf dem internen Host " ++"weiterleiten" ++ ++msgid "Redirect matched incoming traffic to the specified internal host" ++msgstr "Gefilterte Verbindungen an den angegeben internen Host weiterleiten" ++ ++msgid "Restrict Masquerading to given destination subnets" ++msgstr "NAT auf die angegebenen Ziel-Subnetze beschränken" ++ ++msgid "Restrict Masquerading to given source subnets" ++msgstr "NAT auf die angegebenen Quell-Subnetze beschränken" ++ ++msgid "Restrict to address family" ++msgstr "Beschränke auf Adressfamilie" ++ ++msgid "Rewrite matched traffic to the given address." ++msgstr "Schreibe selektierten Verkehr auf die angegebene Quell-IP-Adresse um." ++ ++msgid "" ++"Rewrite matched traffic to the given source port. May be left empty to only " ++"rewrite the IP address." ++msgstr "" ++"Schreibe selektierten Verkehr auf den angegebenen Qull-Port um. Kann leer " ++"gelassen werden um nur die IP-Adresse umzuschreiben." ++ ++msgid "Rewrite to source %s" ++msgstr "Schreibe um auf Quell-%s" ++ ++msgid "Rewrite to source %s, %s" ++msgstr "Schreibe um auf Quell-%s, %s" ++ ++msgid "SNAT IP address" ++msgstr "SNAT-IP-Adresse" ++ ++msgid "SNAT port" ++msgstr "SNAT-Port" ++ ++msgid "Source IP address" ++msgstr "Quell-IP-Adresse" ++ ++msgid "Source MAC address" ++msgstr "Quell-MAC-Adresse" ++ ++msgid "Source NAT" ++msgstr "Source NAT" ++ ++msgid "" ++"Source NAT is a specific form of masquerading which allows fine grained " ++"control over the source IP used for outgoing traffic, for example to map " ++"multiple WAN addresses to internal subnets." ++msgstr "" ++"Source NAT ist eine spezifische From von NAT, welche volle Kontrolle über " ++"die verwendete Quell-IP-Adresse für ausgehenden Verkehr zulässt, zum " ++"Beispiel um mehrere WAN-IP-Adressen auf interne Subnetze abzubilden." ++ ++msgid "Source address" ++msgstr "Quelladresse" ++ ++msgid "Source port" ++msgstr "Quellport" ++ ++msgid "Source zone" ++msgstr "Quell-Zone" ++ ++msgid "" ++"The firewall creates zones over your network interfaces to control network " ++"traffic flow." ++msgstr "" ++"Die Firewall erstellt Netzwerkzonen über bestimmte Netzwerkschnittstellen um " ++"den Netzverkehr zu trennen." ++ ++msgid "" ++"The options below control the forwarding policies between this zone (%s) and " ++"other zones. Destination zones cover forwarded traffic " ++"originating from %q. Source zones match forwarded " ++"traffic from other zones targeted at %q. The forwarding " ++"rule is unidirectional, e.g. a forward from lan to wan does " ++"not imply a permission to forward from wan to lan as well." ++msgstr "" ++"Die untenstehenen Optionen regeln die Verfahreinsweisen für Verkehr zwischen " ++"dieser Zone (%s) und anderen Zonen. Ziel-Zonen decken " ++"weitergeleiteten Verkehr von %q ab. Quell-Zonen " ++"treffen auf weitergeleiteten Verkehr aus anderen Zonen zu, welcher " ++"an %q gerichtet ist. Die Weiterleitung gilt nur in eine " ++"Richtung, d.h. eine erlaubte Weiterleitung von LAN nach WAN impliziert " ++"nicht zusätzlich die Erlaubnis, auch von WAN nach LAN " ++"weiterzuleiten." ++ ++msgid "" ++"This page allows you to change advanced properties of the port forwarding " ++"entry. In most cases there is no need to modify those settings." ++msgstr "" ++"Diese Seite bietet Zugriff auf die erweiterten Eigenschaften der " ++"Portweiterleitung. In den meisten Fällen ist es unnötig die Eigenschaften zu " ++"ändern." ++ ++msgid "" ++"This page allows you to change advanced properties of the traffic rule " ++"entry, such as matched source and destination hosts." ++msgstr "" ++"Diese Seite bietet Zugriff auf die erweiterten Eigenschaften der " ++"Verkehrsregel, zum Beispiel die Selektion nach Quell- und Zieladressen." ++ ++#, fuzzy ++msgid "" ++"This section defines common properties of %q. The input and " ++"output options set the default policies for traffic entering and " ++"leaving this zone while the forward option describes the policy for " ++"forwarded traffic between different networks within the zone. Covered " ++"networks specifies which available networks are members of this zone." ++msgstr "" ++"Diese Sektion definiert allgemeine Eigenschaften der %q Zone. Die " ++"Eingang und Ausgang Optionen regeln die Verfahrensweise " ++"für Verkehr der in diese Zone eintritt oder diese verlässt. " ++"Weitergeleitet trifft auf Verkehr zwischen verschiedenen " ++"Schnittstellen innerhalb dieser Zone zu. Abgedeckte Netzwerke " ++"definieren die Zugehörigkeit von Schnittstellen zu dieser Zone." ++ ++msgid "To %s at %s on this device" ++msgstr "Zu %s an %s auf diesem Gerät" ++ ++msgid "To %s in %s" ++msgstr "Zu %s in %s" ++ ++msgid "To %s on this device" ++msgstr "Zu %s auf diesem Gerät" ++ ++msgid "To %s, %s in %s" ++msgstr "Zu %s, %s in %s" ++ ++msgid "To source IP" ++msgstr "Zu Quell-IP" ++ ++msgid "To source port" ++msgstr "Zu Quell-Port" ++ ++msgid "Traffic Rules" ++msgstr "Verkehrsregeln" ++ ++msgid "" ++"Traffic rules define policies for packets traveling between different zones, " ++"for example to reject traffic between certain hosts or to open WAN ports on " ++"the router." ++msgstr "" ++"Verkehrsregeln bestimmen den Fluss der Pakete zwischen verschiedenen Zonen, " ++"zum Beispiel um Verkehr zwischen bestimmten Rechnern zu unterbinden oder um " ++"WAN-Ports auf dem Router zu öffnen." ++ ++msgid "Via %s" ++msgstr "Ãœber %s" ++ ++msgid "Via %s at %s" ++msgstr "Ãœber %s an %s" ++ ++msgid "" ++"You may specify multiple by selecting \"-- custom --\" and then entering " ++"protocols separated by space." ++msgstr "" ++"Durch die Auswahl von \"-- benutzerdefiniert --\" könnene mehrere Werte " ++"durch Leerzeichen getrennt angegeben werden." ++ ++msgid "Zone %q" ++msgstr "Zone %q" ++ ++msgid "Zone ⇒ Forwardings" ++msgstr "Zone ⇒ Weiterleitungen" ++ ++msgid "Zones" ++msgstr "Zonen" ++ ++# Die richtige Ãœbersetzung von ACCEPT im Firewallkontext ist nicht "Annehmen" sondern "Zulassen". Man kann ja keinen ++# ausgehenden Verkehr annehmen. ++msgid "accept" ++msgstr "zulassen" ++ ++msgid "any" ++msgstr "beliebig" ++ ++msgid "any host" ++msgstr "beliebiger Rechner" ++ ++msgid "any router IP" ++msgstr "beliebige Router-IP" ++ ++msgid "any zone" ++msgstr "beliebige Zone" ++ ++msgid "don't track" ++msgstr "nicht verfolgen" ++ ++msgid "drop" ++msgstr "verwerfen" ++ ++msgid "reject" ++msgstr "zurückweisen" ++ ++msgid "traffic" ++msgstr "" ++ ++#~ msgid "Destination" ++#~ msgstr "Ziel" ++ ++#~ msgid "Family" ++#~ msgstr "Adressfamilie" ++ ++#~ msgid "Forward to %s in %s" ++#~ msgstr "Weiterleiten zu %s in %s" ++ ++#~ msgid "Forward to %s, %s in %s" ++#~ msgstr "Weiterleiten zu %s, %s in %s" ++ ++#~ msgid "SNAT" ++#~ msgstr "SNAT" ++ ++#~ msgid "Source" ++#~ msgstr "Quelle" ++ ++#~ msgid "To %s" ++#~ msgstr "Zu %s" ++ ++#~ msgid "To %s at %s" ++#~ msgstr "Zu %s an %s" ++ ++#~ msgid "Via" ++#~ msgstr "Ãœber" ++ ++#~ msgid "Accept forward" ++#~ msgstr "Weiterleitung erlauben" ++ ++#~ msgid "Accept input" ++#~ msgstr "Eingang erlauben" ++ ++#~ msgid "Disable" ++#~ msgstr "Daktivieren" ++ ++#~ msgid "Discard forward" ++#~ msgstr "Weiterleitung verwerfen" ++ ++#~ msgid "Discard input" ++#~ msgstr "Eingang verwerfen" ++ ++#~ msgid "Do not track forward" ++#~ msgstr "Weiterleitung nicht verfolgen" ++ ++#~ msgid "Do not track input" ++#~ msgstr "Eingang nicht verfolgen" ++ ++#~ msgid "IP" ++#~ msgstr "IP" ++ ++#~ msgid "IP range" ++#~ msgstr "IP-Bereich" ++ ++#~ msgid "IPs" ++#~ msgstr "IPs" ++ ++#~ msgid "MAC" ++#~ msgstr "MAC" ++ ++#~ msgid "MACs" ++#~ msgstr "MACs" ++ ++#~ msgid "Refuse forward" ++#~ msgstr "Weiterleitung zurückweisen" ++ ++#~ msgid "Refuse input" ++#~ msgstr "Eingang zurückweisen" ++ ++#~ msgid "Rule is disabled" ++#~ msgstr "Regel ist deaktiviert" ++ ++#~ msgid "Rule is enabled" ++#~ msgstr "Regel ist aktiviert" ++ ++#~ msgid "day" ++#~ msgstr "Tag" ++ ++#~ msgid "hour" ++#~ msgstr "Stunde" ++ ++#~ msgid "minute" ++#~ msgstr "Minute" ++ ++#~ msgid "not" ++#~ msgstr "nicht" ++ ++#~ msgid "port" ++#~ msgstr "Port" ++ ++#~ msgid "ports" ++#~ msgstr "Ports" ++ ++#~ msgid "second" ++#~ msgstr "Sekunde" ++ ++#~ msgid "type" ++#~ msgstr "Typ" ++ ++#~ msgid "types" ++#~ msgstr "Typen" ++ ++#~ msgid "(optional)" ++#~ msgstr "(optional)" ++ ++#~ msgid "Intended destination address" ++#~ msgstr "Gewünschte Zieladresse" ++ ++#~ msgid "Internal port (optional)" ++#~ msgstr "Interner Port (optional)" ++ ++#~ msgid "Accept" ++#~ msgstr "Akzeptiere" ++ ++#~ msgid "Discard" ++#~ msgstr "Verwerfe" ++ ++#~ msgid "Advanced Options" ++#~ msgstr "Erweiterte Optionen" ++ ++#~ msgid "Advanced Rules" ++#~ msgstr "Erweiterte Regeln" ++ ++#~ msgid "" ++#~ "Advanced rules let you customize the firewall to your needs. Only new " ++#~ "connections will be matched. Packets belonging to already open " ++#~ "connections are automatically allowed to pass the firewall." ++#~ msgstr "" ++#~ "Mit erweiterten Regeln kann die Firewall an die eigenen Bedürfnisse " ++#~ "angepasst werden. Es werden nur neue Verbindungen betrachtet. Pakete, die " ++#~ "zu bereits bestehenden Verbindungen gehören werden automatisch akzeptiert." ++ ++#~ msgid "Custom Rules (/etc/firewall.user)" ++#~ msgstr "Benutzerdefinierte Regeln (/etc/firewall.user)" ++ ++#~ msgid "Device" ++#~ msgstr "Gerät" ++ ++#~ msgid "" ++#~ "For DNAT, match incoming traffic directed at the given destination ip " ++#~ "address. For SNAT rewrite the source address to the given address." ++#~ msgstr "" ++#~ "Für DNAT Regeln wird der Verkehr nach der angegeben Zieladresse " ++#~ "gefiltert. Bei SNAT Regeln ist dieses die Quelladresse für umgeschriebene " ++#~ "Pakete." ++ ++#~ msgid "" ++#~ "Match incoming traffic originating from the given source port or port " ++#~ "range on the client host" ++#~ msgstr "" ++#~ "Eingehende Verbindungen filtern welche von dem angegebenen Port oder " ++#~ "Portbereich des Clients ausgehen" ++ ++#~ msgid "Overview" ++#~ msgstr "Ãœbersicht" ++ ++#~ msgid "Port forwarding" ++#~ msgstr "Portweiterleitung" ++ ++#~ msgid "" ++#~ "Port forwarding allows to provide network services in the internal " ++#~ "network to an external network." ++#~ msgstr "" ++#~ "Portweiterleitungen ermöglichen es interne Netzwerkdienste aus einem " ++#~ "externen Netzwerk heraus erreichbar zu machen." ++ ++#~ msgid "Redirection type" ++#~ msgstr "Typ der Weiterleitung" ++ ++#~ msgid "Redirections" ++#~ msgstr "Weiterleitungen" ++ ++#~ msgid "Rules" ++#~ msgstr "Regeln" ++ ++#~ msgid "Traffic Redirection" ++#~ msgstr "Umleitungen" ++ ++#~ msgid "" ++#~ "Traffic redirection allows you to change the destination address of " ++#~ "forwarded packets." ++#~ msgstr "" ++#~ "Umleitungen erlauben es das Ziel von weitergeleiteten Paketen zu " ++#~ "verändern." ++ ++#, fuzzy ++#~ msgid "Network" ++#~ msgstr "Netzwerke" ++ ++#~ msgid "Traffic Control" ++#~ msgstr "Verkehrskontrolle" ++ ++#~ msgid "Zone-to-Zone traffic" ++#~ msgstr "Zone-zu-Zone Verkehr" ++ ++#, fuzzy ++#~ msgid "" ++#~ "Here you can specify which network traffic is allowed to flow between " ++#~ "network zones. Only new connections will be matched. Packets belonging " ++#~ "to already open connections are automatically allowed to pass the " ++#~ "firewall. If you experience occasional connection problems try enabling " ++#~ "MSS Clamping otherwise disable it for performance reasons." ++#~ msgstr "" ++#~ "An dieser Stelle kann festgelegt zwischen welchen Zonen Netzverkehr hin " ++#~ "und her fließen kann. Es werden nur neue Verbindungen betrachtet. Pakete, " ++#~ "die zu bereits bestehenden Verbindungen gehören werden automatisch " ++#~ "akzeptiert. Bei gelegentlich auftretenden Verbindungsproblemen kann MSS " ++#~ "Clamping helfen, ansonsten sollte dies aus Performancegründen deaktiviert " ++#~ "bleiben." ++ ++#~ msgid "Zone" ++#~ msgstr "Zone" ++ ++#, fuzzy ++#~ msgid "Destination IP" ++#~ msgstr "Ziel" ++ ++#, fuzzy ++#~ msgid "IP address" ++#~ msgstr "IP-Adresse" ++ ++#, fuzzy ++#~ msgid "Source MAC-address" ++#~ msgstr "Quell-MAC-Adresse" ++ ++#~ msgid "Custom forwarding" ++#~ msgstr "Erweiterte Weiterleitung" ++ ++#~ msgid "Input Zone" ++#~ msgstr "Eingangszone" ++ ++#~ msgid "Output Zone" ++#~ msgstr "Ausgangszone" ++ ++#~ msgid "External Zone" ++#~ msgstr "Externe Zone" ++ ++#~ msgid "Source MAC" ++#~ msgstr "Quell-MAC-Adresse" ++ ++#~ msgid "Defaults" ++#~ msgstr "Grundeinstellungen" ++ ++#~ msgid "" ++#~ "These are the default settings that are used if no other rules match." ++#~ msgstr "" ++#~ "Grundeinstellungen die verwendet werden, wenn keine andere Regel " ++#~ "angewandt werden kann." ++ ++#~ msgid "" ++#~ "Zones part the network interfaces into certain isolated areas to separate " ++#~ "network traffic. One or more networks can belong to a zone. The MASQ-flag " ++#~ "enables NAT masquerading for all outgoing traffic on this zone." ++#~ msgstr "" ++#~ "Zonen teilen das Netzwerk in mehrere Bereiche ein um Netzverkehr sicher " ++#~ "zu trennen. Ein oder mehrere Netzwerke gehören zu einer Zone. Das MASQ-" ++#~ "Flag legt fest, dass aller ausgehende Netzverkehr einer Zone NAT-maskiert " ++#~ "wird." ++ ++#~ msgid "MASQ" ++#~ msgstr "MASQ" ++ ++#~ msgid "contained networks" ++#~ msgstr "verbundene Netzwerke" +diff --git a/feeds/luci/applications/luci-app-firewall/po/el/firewall.po b/feeds/luci/applications/luci-app-firewall/po/el/firewall.po +new file mode 100644 +index 0000000..dbd0b9e +--- /dev/null ++++ b/feeds/luci/applications/luci-app-firewall/po/el/firewall.po +@@ -0,0 +1,638 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Report-Msgid-Bugs-To: \n" ++"POT-Creation-Date: 2010-03-30 17:00+0200\n" ++"PO-Revision-Date: 2012-03-31 15:40+0200\n" ++"Last-Translator: Vasilis \n" ++"Language-Team: LANGUAGE \n" ++"Language: el\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n != 1);\n" ++"X-Generator: Pootle 2.0.4\n" ++ ++msgid "%s in %s" ++msgstr "" ++ ++msgid "%s%s with %s" ++msgstr "%s%s με %s" ++ ++msgid "%s, %s in %s" ++msgstr "" ++ ++msgid "(Unnamed Entry)" ++msgstr "" ++ ++msgid "(Unnamed Rule)" ++msgstr "" ++ ++msgid "(Unnamed SNAT)" ++msgstr "" ++ ++msgid "-- Please choose --" ++msgstr "-- ΠαÏακαλώ επιλέξτε --" ++ ++msgid "-- custom --" ++msgstr "-- Ï€ÏοσαÏμοσμένο --" ++ ++msgid "%d pkts. per %s" ++msgstr "%d πκτ. ανά %s" ++ ++msgid "%d pkts. per %s, burst %d pkts." ++msgstr "" ++ ++msgid "%s and limit to %s" ++msgstr "" ++ ++msgid "Action" ++msgstr "ΕνέÏγεια" ++ ++msgid "Add" ++msgstr "ΠÏοσθήκη" ++ ++msgid "Add and edit..." ++msgstr "ΠÏοσθήκη και επεξεÏγασία..." ++ ++msgid "Advanced Settings" ++msgstr "Ρυθμίσεις για Ï€ÏοχωÏημένους" ++ ++msgid "Allow forward from source zones:" ++msgstr "" ++ ++msgid "Allow forward to destination zones:" ++msgstr "" ++ ++msgid "Any" ++msgstr "Οποιοδήποτε" ++ ++msgid "Covered networks" ++msgstr "" ++ ++msgid "Custom Rules" ++msgstr "ΠÏοσαÏμοσμένοι Κανόνες" ++ ++msgid "" ++"Custom rules allow you to execute arbritary iptables commands which are not " ++"otherwise covered by the firewall framework. The commands are executed after " ++"each firewall restart, right after the default ruleset has been loaded." ++msgstr "" ++ ++msgid "Destination IP address" ++msgstr "ΔιεÏθυνση IP Ï€ÏοοÏισμοÏ" ++ ++msgid "Destination address" ++msgstr "ΔιεÏθυνση Ï€ÏοοÏισμοÏ" ++ ++msgid "Destination port" ++msgstr "ΘÏÏα Ï€ÏοοÏισμοÏ" ++ ++#, fuzzy ++msgid "Destination zone" ++msgstr "Ζώνη Ï€ÏοοÏισμοÏ" ++ ++msgid "Do not rewrite" ++msgstr "" ++ ++msgid "Drop invalid packets" ++msgstr "Αγνόηση μη-έγκυÏων πακετών" ++ ++msgid "Enable" ++msgstr "ΕνεÏγοποίηση" ++ ++msgid "Enable NAT Loopback" ++msgstr "" ++ ++#, fuzzy ++msgid "Enable SYN-flood protection" ++msgstr "ΠÏοστασία SYN-flood" ++ ++msgid "Enable logging on this zone" ++msgstr "" ++ ++msgid "External IP address" ++msgstr "ΕξωτεÏική διεÏθυνση IP" ++ ++msgid "External port" ++msgstr "ΕξωτεÏική θÏÏα" ++ ++msgid "External zone" ++msgstr "" ++ ++msgid "Extra arguments" ++msgstr "Επιπλέον παÏάμετÏοι" ++ ++msgid "Firewall" ++msgstr "Τείχος Ï€Ïοστασίας" ++ ++msgid "Firewall - Custom Rules" ++msgstr "Τείχος Ï€Ïοστασίας - ΠÏοσαÏμοσμένοι Κανόνες" ++ ++msgid "Firewall - Port Forwards" ++msgstr "Τείχος Ï€Ïοστασίας - ΠÏοώθηση ΘυÏών" ++ ++msgid "Firewall - Traffic Rules" ++msgstr "Τείχος Ï€Ïοστασίας - Κανόνες Κίνησεις" ++ ++msgid "Firewall - Zone Settings" ++msgstr "Τείχος Ï€Ïοστασίας - Ρυθμίσεις Ζώνης" ++ ++msgid "Force connection tracking" ++msgstr "Επιβολή παÏακολοÏθησης σÏνδεσης" ++ ++msgid "Forward" ++msgstr "ΠÏοώθηση" ++ ++msgid "Forward to" ++msgstr "" ++ ++msgid "From %s in %s" ++msgstr "Απο %s στο %s" ++ ++msgid "From %s in %s with source %s" ++msgstr "" ++ ++msgid "From %s in %s with source %s and %s" ++msgstr "" ++ ++msgid "General Settings" ++msgstr "Γενικές Ρυθμίσεις" ++ ++msgid "IPv4" ++msgstr "IPv4" ++ ++msgid "IPv4 and IPv6" ++msgstr "IPv4 και IPv6" ++ ++msgid "IPv4 only" ++msgstr "Μόνο IPv4" ++ ++msgid "IPv6" ++msgstr "IPv6" ++ ++msgid "IPv6 only" ++msgstr "Μόνο IPv6" ++ ++msgid "Input" ++msgstr "Είσοδος" ++ ++msgid "Inter-Zone Forwarding" ++msgstr "" ++ ++#, fuzzy ++msgid "Internal IP address" ++msgstr "ΕσωτεÏική διεÏθυνση" ++ ++#, fuzzy ++msgid "Internal port" ++msgstr "ΕξωτεÏική θÏÏα" ++ ++msgid "Internal zone" ++msgstr "ΕσωτεÏική ζώνη" ++ ++msgid "Limit log messages" ++msgstr "ΠεÏιοÏισμός καταγÏαφών συστήματος" ++ ++#, fuzzy ++msgid "MSS clamping" ++msgstr "ΠεÏιοÏισμός MSS" ++ ++msgid "Masquerading" ++msgstr "" ++ ++msgid "Match" ++msgstr "" ++ ++msgid "Match ICMP type" ++msgstr "" ++ ++msgid "Match forwarded traffic to the given destination port or port range." ++msgstr "" ++ ++msgid "" ++"Match incoming traffic directed at the given destination port or port range " ++"on this host" ++msgstr "" ++ ++msgid "" ++"Match incoming traffic originating from the given source port or port range " ++"on the client host." ++msgstr "" ++ ++msgid "Name" ++msgstr "Όνομα" ++ ++msgid "New SNAT rule" ++msgstr "" ++ ++msgid "New forward rule" ++msgstr "" ++ ++msgid "New input rule" ++msgstr "" ++ ++msgid "New port forward" ++msgstr "" ++ ++msgid "New source NAT" ++msgstr "" ++ ++msgid "Only match incoming traffic directed at the given IP address." ++msgstr "" ++ ++msgid "Only match incoming traffic from these MACs." ++msgstr "" ++ ++msgid "Only match incoming traffic from this IP or range." ++msgstr "" ++ ++msgid "" ++"Only match incoming traffic originating from the given source port or port " ++"range on the client host" ++msgstr "" ++ ++msgid "Open ports on router" ++msgstr "" ++ ++msgid "Other..." ++msgstr "Άλλο..." ++ ++msgid "Output" ++msgstr "Έξοδος" ++ ++msgid "Passes additional arguments to iptables. Use with care!" ++msgstr "" ++ ++msgid "Port Forwards" ++msgstr "ΠÏοώθηση ΘυÏών" ++ ++msgid "" ++"Port forwarding allows remote computers on the Internet to connect to a " ++"specific computer or service within the private LAN." ++msgstr "" ++ ++msgid "Protocol" ++msgstr "ΠÏωτόκολλο" ++ ++msgid "" ++"Redirect matched incoming traffic to the given port on the internal host" ++msgstr "" ++ ++msgid "Redirect matched incoming traffic to the specified internal host" ++msgstr "" ++ ++msgid "Restrict Masquerading to given destination subnets" ++msgstr "" ++ ++msgid "Restrict Masquerading to given source subnets" ++msgstr "" ++ ++msgid "Restrict to address family" ++msgstr "" ++ ++msgid "Rewrite matched traffic to the given address." ++msgstr "" ++ ++msgid "" ++"Rewrite matched traffic to the given source port. May be left empty to only " ++"rewrite the IP address." ++msgstr "" ++ ++msgid "Rewrite to source %s" ++msgstr "" ++ ++msgid "Rewrite to source %s, %s" ++msgstr "" ++ ++msgid "SNAT IP address" ++msgstr "" ++ ++msgid "SNAT port" ++msgstr "" ++ ++#, fuzzy ++msgid "Source IP address" ++msgstr "ΔιεÏθυνση MAC πηγής" ++ ++msgid "Source MAC address" ++msgstr "" ++ ++msgid "Source NAT" ++msgstr "" ++ ++msgid "" ++"Source NAT is a specific form of masquerading which allows fine grained " ++"control over the source IP used for outgoing traffic, for example to map " ++"multiple WAN addresses to internal subnets." ++msgstr "" ++ ++#, fuzzy ++msgid "Source address" ++msgstr "ΔιεÏθυνση MAC πηγής" ++ ++msgid "Source port" ++msgstr "ΘÏÏα πηγής" ++ ++#, fuzzy ++msgid "Source zone" ++msgstr "ΘÏÏα πηγής" ++ ++msgid "" ++"The firewall creates zones over your network interfaces to control network " ++"traffic flow." ++msgstr "" ++"Το τείχος Ï€Ïοστασίας δημιουÏγεί ζώνες πάνω στις διεπαφές δικτÏου για να " ++"ελέγχει την δικτυακή κίνηση." ++ ++msgid "" ++"The options below control the forwarding policies between this zone (%s) and " ++"other zones. Destination zones cover forwarded traffic " ++"originating from %q. Source zones match forwarded " ++"traffic from other zones targeted at %q. The forwarding " ++"rule is unidirectional, e.g. a forward from lan to wan does " ++"not imply a permission to forward from wan to lan as well." ++msgstr "" ++ ++msgid "" ++"This page allows you to change advanced properties of the port forwarding " ++"entry. In most cases there is no need to modify those settings." ++msgstr "" ++ ++msgid "" ++"This page allows you to change advanced properties of the traffic rule " ++"entry, such as matched source and destination hosts." ++msgstr "" ++ ++msgid "" ++"This section defines common properties of %q. The input and " ++"output options set the default policies for traffic entering and " ++"leaving this zone while the forward option describes the policy for " ++"forwarded traffic between different networks within the zone. Covered " ++"networks specifies which available networks are members of this zone." ++msgstr "" ++ ++msgid "To %s at %s on this device" ++msgstr "" ++ ++msgid "To %s in %s" ++msgstr "" ++ ++msgid "To %s on this device" ++msgstr "" ++ ++msgid "To %s, %s in %s" ++msgstr "" ++ ++msgid "To source IP" ++msgstr "" ++ ++msgid "To source port" ++msgstr "" ++ ++msgid "Traffic Rules" ++msgstr "" ++ ++msgid "" ++"Traffic rules define policies for packets traveling between different zones, " ++"for example to reject traffic between certain hosts or to open WAN ports on " ++"the router." ++msgstr "" ++ ++msgid "Via %s" ++msgstr "" ++ ++msgid "Via %s at %s" ++msgstr "" ++ ++msgid "" ++"You may specify multiple by selecting \"-- custom --\" and then entering " ++"protocols separated by space." ++msgstr "" ++ ++msgid "Zone %q" ++msgstr "" ++ ++msgid "Zone ⇒ Forwardings" ++msgstr "" ++ ++msgid "Zones" ++msgstr "Ζώνες" ++ ++msgid "accept" ++msgstr "αποδοχή" ++ ++msgid "any" ++msgstr "" ++ ++msgid "any host" ++msgstr "" ++ ++msgid "any router IP" ++msgstr "" ++ ++msgid "any zone" ++msgstr "" ++ ++msgid "don't track" ++msgstr "" ++ ++msgid "drop" ++msgstr "αγνόηση" ++ ++msgid "reject" ++msgstr "απόÏÏιψη" ++ ++msgid "traffic" ++msgstr "" ++ ++#~ msgid "Destination" ++#~ msgstr "ΠÏοοÏισμός" ++ ++#~ msgid "Family" ++#~ msgstr "Οικογένεια" ++ ++#~ msgid "Forward to %s in %s" ++#~ msgstr "ΠÏοώθηση του %s στο %s" ++ ++#~ msgid "Forward to %s, %s in %s" ++#~ msgstr "ΠÏοώθηση στο %s, %s στο %s" ++ ++#~ msgid "SNAT" ++#~ msgstr "SNAT" ++ ++#~ msgid "Source" ++#~ msgstr "Πηγή" ++ ++#~ msgid "To %s" ++#~ msgstr "ΠÏος %s" ++ ++#~ msgid "Accept forward" ++#~ msgstr "Αποδοχή Ï€Ïοώθησης" ++ ++#~ msgid "Accept input" ++#~ msgstr "Αποδοχή εισόδου" ++ ++#~ msgid "Disable" ++#~ msgstr "ΑπενεÏγοποίηση" ++ ++#~ msgid "IP" ++#~ msgstr "IP" ++ ++#~ msgid "IP range" ++#~ msgstr "ΕÏÏος IP" ++ ++#~ msgid "IPs" ++#~ msgstr "IPs" ++ ++#~ msgid "MAC" ++#~ msgstr "MAC" ++ ++#~ msgid "MACs" ++#~ msgstr "MACs" ++ ++#~ msgid "Refuse forward" ++#~ msgstr "ΆÏνηση Ï€Ïοώθησης" ++ ++#~ msgid "Refuse input" ++#~ msgstr "ΆÏνηση εισόδου" ++ ++#~ msgid "day" ++#~ msgstr "ημέÏα" ++ ++#~ msgid "hour" ++#~ msgstr "ÏŽÏα" ++ ++#~ msgid "minute" ++#~ msgstr "λεπτό" ++ ++#~ msgid "port" ++#~ msgstr "θÏÏα" ++ ++#~ msgid "ports" ++#~ msgstr "θÏÏες" ++ ++#~ msgid "second" ++#~ msgstr "δευτεÏόλεπτο" ++ ++#~ msgid "type" ++#~ msgstr "Ï„Ïπος" ++ ++#~ msgid "types" ++#~ msgstr "Ï„Ïποι" ++ ++#~ msgid "Internal port (optional)" ++#~ msgstr "ΕσωτεÏική θÏÏα (Ï€ÏοαιÏετικό)" ++ ++#~ msgid "Advanced Rules" ++#~ msgstr "ΠÏοχωÏημένοι Κανόνες" ++ ++#~ msgid "" ++#~ "Advanced rules let you customize the firewall to your needs. Only new " ++#~ "connections will be matched. Packets belonging to already open " ++#~ "connections are automatically allowed to pass the firewall." ++#~ msgstr "" ++#~ "Οι Ï€ÏοχωÏημένοι κανόνες σας επιτÏέπουν να Ï€ÏοσαÏμόσετε το τείχος " ++#~ "Ï€Ïοστασίας στις δικές σας ανάγκες. Οι κανόνες θα εφαÏμόζονται μόνο στις " ++#~ "νέες συνδέσεις. Πακέτα που ανήκουν σε ήδη ανοιχτές συνδέσεις, θα πεÏνάνε " ++#~ "αυτόματα το τείχος Ï€Ïοστασίας." ++ ++#~ msgid "Port forwarding" ++#~ msgstr "ΠÏοώθηση θυÏών" ++ ++#~ msgid "" ++#~ "Port forwarding allows to provide network services in the internal " ++#~ "network to an external network." ++#~ msgstr "" ++#~ "Η Ï€Ïοώθηση θυÏών επιτÏέπει σε υπηÏεσίες δικτÏου που λειτουÏγοÏν μέσα σε " ++#~ "ένα εσωτεÏικό δίκτυο, να γίνονται διαθέσιμες και σε ένα εξωτεÏικό." ++ ++#~ msgid "Traffic Redirection" ++#~ msgstr "ΑνακατεÏθυνση Κίνησης" ++ ++#~ msgid "" ++#~ "Traffic redirection allows you to change the destination address of " ++#~ "forwarded packets." ++#~ msgstr "" ++#~ "Η ανακατεÏθυνση κίνησης σας επιτÏέπει να αλλάξετε την διεÏθυνση " ++#~ "Ï€ÏοοÏÎ¹ÏƒÎ¼Î¿Ï Ï„Ï‰Î½ Ï€Ïοωθημένων πακέτων." ++ ++#, fuzzy ++#~ msgid "Network" ++#~ msgstr "Δίκτυα" ++ ++#~ msgid "Traffic Control" ++#~ msgstr "Έλεγχος Κίνησης" ++ ++#~ msgid "Zone-to-Zone traffic" ++#~ msgstr "Κίνηση Ζώνης-Ï€Ïος-Ζώνη" ++ ++#, fuzzy ++#~ msgid "" ++#~ "Here you can specify which network traffic is allowed to flow between " ++#~ "network zones. Only new connections will be matched. Packets belonging " ++#~ "to already open connections are automatically allowed to pass the " ++#~ "firewall. If you experience occasional connection problems try enabling " ++#~ "MSS Clamping otherwise disable it for performance reasons." ++#~ msgstr "" ++#~ "Εδώ μποÏείτε να οÏίσετε τι δικτυακή κίνηση επιτÏέπεται Î¼ÎµÏ„Î±Î¾Ï Î´Î¹ÎºÏ„Ï…Î±ÎºÏŽÎ½ " ++#~ "ζωνών. Θα εφαÏμόζεται μόνο σε νέες συνδέσεις. Πακέτα που ανήκουν σε ήδη " ++#~ "ανοιχτές συνδέσεις θα πεÏνάνε αυτόματα το τείχος Ï€Ïοστασίας. Αν " ++#~ "αντιμετωπίζεται σποÏαδικά Ï€Ïοβλήματα με τη σÏνδεσή σας, δοκιμάστε να " ++#~ "ενεÏγοποιήσετε τον ΠεÏιοÏισμό MSS, αλλιώς απενεÏγοποιήστε το για " ++#~ "μεγαλÏτεÏη απόδοση." ++ ++#~ msgid "Zone" ++#~ msgstr "Ζώνη" ++ ++#, fuzzy ++#~ msgid "Destination IP" ++#~ msgstr "ΠÏοοÏισμός" ++ ++#, fuzzy ++#~ msgid "IP address" ++#~ msgstr "ΔιεÏθυνση IP" ++ ++#, fuzzy ++#~ msgid "Source MAC-address" ++#~ msgstr "ΔιεÏθυνση MAC πηγής" ++ ++#~ msgid "Custom forwarding" ++#~ msgstr "ΠÏοσαÏμοσμένη Ï€Ïοώθηση" ++ ++#~ msgid "Input Zone" ++#~ msgstr "Ζώνη Εισόδου" ++ ++#~ msgid "Output Zone" ++#~ msgstr "Ζώνη Εξόδου" ++ ++#~ msgid "External Zone" ++#~ msgstr "ΕξωτεÏική Ζώνη" ++ ++#~ msgid "Source MAC" ++#~ msgstr "MAC πηγής" ++ ++#~ msgid "Defaults" ++#~ msgstr "ΠÏοκαθοÏισμένα" ++ ++#~ msgid "" ++#~ "These are the default settings that are used if no other rules match." ++#~ msgstr "" ++#~ "Αυτές είναι οι Ï€ÏοκαθοÏισμένες Ïυθμίσεις που χÏησιμοποιοÏνται αν δεν " ++#~ "υπάÏχει κάποιος άλλος κανόνας που ταιÏιάζει." ++ ++#~ msgid "" ++#~ "Zones part the network interfaces into certain isolated areas to separate " ++#~ "network traffic. One or more networks can belong to a zone. The MASQ-flag " ++#~ "enables NAT masquerading for all outgoing traffic on this zone." ++#~ msgstr "" ++#~ "Οι ζώνες χωÏίζουν τις δικτυακές διεπαφές σε απομονωμένες πεÏιοχές ώστε να " ++#~ "διαχωÏίζεται η δικτυακή κίνηση. Σε μία ζώνη μποÏοÏν να ανήκουν ένα ή " ++#~ "πεÏισσότεÏα δίκτυα. Η σημαία MASQ ενεÏγοποιεί NAT masquerading για όλη " ++#~ "την εξεÏχόμενη κίνηση της ζώνης." ++ ++#~ msgid "MASQ" ++#~ msgstr "MASQ" ++ ++#~ msgid "contained networks" ++#~ msgstr "δίκτυα που πεÏιέχονται" +diff --git a/feeds/luci/applications/luci-app-firewall/po/en/firewall.po b/feeds/luci/applications/luci-app-firewall/po/en/firewall.po +new file mode 100644 +index 0000000..2684067 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-firewall/po/en/firewall.po +@@ -0,0 +1,635 @@ ++#, fuzzy ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Report-Msgid-Bugs-To: \n" ++"POT-Creation-Date: 2010-03-30 17:00+0200\n" ++"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" ++"Last-Translator: FULL NAME \n" ++"Language-Team: LANGUAGE \n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++ ++msgid "%s in %s" ++msgstr "" ++ ++msgid "%s%s with %s" ++msgstr "" ++ ++msgid "%s, %s in %s" ++msgstr "" ++ ++msgid "(Unnamed Entry)" ++msgstr "" ++ ++msgid "(Unnamed Rule)" ++msgstr "" ++ ++msgid "(Unnamed SNAT)" ++msgstr "" ++ ++msgid "-- Please choose --" ++msgstr "" ++ ++msgid "-- custom --" ++msgstr "" ++ ++msgid "%d pkts. per %s" ++msgstr "" ++ ++msgid "%d pkts. per %s, burst %d pkts." ++msgstr "" ++ ++msgid "%s and limit to %s" ++msgstr "" ++ ++msgid "Action" ++msgstr "Action" ++ ++msgid "Add" ++msgstr "" ++ ++msgid "Add and edit..." ++msgstr "" ++ ++msgid "Advanced Settings" ++msgstr "" ++ ++msgid "Allow forward from source zones:" ++msgstr "" ++ ++msgid "Allow forward to destination zones:" ++msgstr "" ++ ++msgid "Any" ++msgstr "" ++ ++msgid "Covered networks" ++msgstr "" ++ ++msgid "Custom Rules" ++msgstr "" ++ ++msgid "" ++"Custom rules allow you to execute arbritary iptables commands which are not " ++"otherwise covered by the firewall framework. The commands are executed after " ++"each firewall restart, right after the default ruleset has been loaded." ++msgstr "" ++ ++msgid "Destination IP address" ++msgstr "" ++ ++msgid "Destination address" ++msgstr "Destination address" ++ ++msgid "Destination port" ++msgstr "Destination port" ++ ++msgid "Destination zone" ++msgstr "Destination zone" ++ ++msgid "Do not rewrite" ++msgstr "" ++ ++msgid "Drop invalid packets" ++msgstr "Drop invalid packets" ++ ++msgid "Enable" ++msgstr "" ++ ++msgid "Enable NAT Loopback" ++msgstr "" ++ ++msgid "Enable SYN-flood protection" ++msgstr "Enable SYN-flood protection" ++ ++msgid "Enable logging on this zone" ++msgstr "" ++ ++msgid "External IP address" ++msgstr "" ++ ++msgid "External port" ++msgstr "External port" ++ ++msgid "External zone" ++msgstr "" ++ ++msgid "Extra arguments" ++msgstr "" ++ ++# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # ++# Generated from applications/luci-fw/luasrc/model/cbi/luci_fw/zones.lua # ++# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # ++# ++msgid "Firewall" ++msgstr "Firewall" ++ ++msgid "Firewall - Custom Rules" ++msgstr "" ++ ++msgid "Firewall - Port Forwards" ++msgstr "" ++ ++msgid "Firewall - Traffic Rules" ++msgstr "" ++ ++msgid "Firewall - Zone Settings" ++msgstr "" ++ ++msgid "Force connection tracking" ++msgstr "" ++ ++msgid "Forward" ++msgstr "Forward" ++ ++msgid "Forward to" ++msgstr "" ++ ++msgid "From %s in %s" ++msgstr "" ++ ++msgid "From %s in %s with source %s" ++msgstr "" ++ ++msgid "From %s in %s with source %s and %s" ++msgstr "" ++ ++msgid "General Settings" ++msgstr "" ++ ++msgid "IPv4" ++msgstr "" ++ ++msgid "IPv4 and IPv6" ++msgstr "" ++ ++msgid "IPv4 only" ++msgstr "" ++ ++msgid "IPv6" ++msgstr "" ++ ++msgid "IPv6 only" ++msgstr "" ++ ++msgid "Input" ++msgstr "Input" ++ ++msgid "Inter-Zone Forwarding" ++msgstr "" ++ ++msgid "Internal IP address" ++msgstr "Internal IP address" ++ ++msgid "Internal port" ++msgstr "Internal port" ++ ++msgid "Internal zone" ++msgstr "" ++ ++msgid "Limit log messages" ++msgstr "" ++ ++msgid "MSS clamping" ++msgstr "MSS clamping" ++ ++msgid "Masquerading" ++msgstr "Masquerading" ++ ++msgid "Match" ++msgstr "" ++ ++msgid "Match ICMP type" ++msgstr "" ++ ++msgid "Match forwarded traffic to the given destination port or port range." ++msgstr "" ++ ++msgid "" ++"Match incoming traffic directed at the given destination port or port range " ++"on this host" ++msgstr "" ++"Match incoming traffic directed at the given destination port or port range " ++"on this host" ++ ++msgid "" ++"Match incoming traffic originating from the given source port or port range " ++"on the client host." ++msgstr "" ++ ++msgid "Name" ++msgstr "Name" ++ ++msgid "New SNAT rule" ++msgstr "" ++ ++msgid "New forward rule" ++msgstr "" ++ ++msgid "New input rule" ++msgstr "" ++ ++msgid "New port forward" ++msgstr "" ++ ++msgid "New source NAT" ++msgstr "" ++ ++msgid "Only match incoming traffic directed at the given IP address." ++msgstr "" ++ ++msgid "Only match incoming traffic from these MACs." ++msgstr "" ++ ++msgid "Only match incoming traffic from this IP or range." ++msgstr "" ++ ++msgid "" ++"Only match incoming traffic originating from the given source port or port " ++"range on the client host" ++msgstr "" ++ ++msgid "Open ports on router" ++msgstr "" ++ ++msgid "Other..." ++msgstr "" ++ ++msgid "Output" ++msgstr "Output" ++ ++msgid "Passes additional arguments to iptables. Use with care!" ++msgstr "" ++ ++msgid "Port Forwards" ++msgstr "" ++ ++msgid "" ++"Port forwarding allows remote computers on the Internet to connect to a " ++"specific computer or service within the private LAN." ++msgstr "" ++ ++msgid "Protocol" ++msgstr "Protocol" ++ ++msgid "" ++"Redirect matched incoming traffic to the given port on the internal host" ++msgstr "" ++"Redirect matched incoming traffic to the given port on the internal host" ++ ++msgid "Redirect matched incoming traffic to the specified internal host" ++msgstr "Redirect matched incoming traffic to the specified internal host" ++ ++msgid "Restrict Masquerading to given destination subnets" ++msgstr "" ++ ++msgid "Restrict Masquerading to given source subnets" ++msgstr "" ++ ++msgid "Restrict to address family" ++msgstr "" ++ ++msgid "Rewrite matched traffic to the given address." ++msgstr "" ++ ++msgid "" ++"Rewrite matched traffic to the given source port. May be left empty to only " ++"rewrite the IP address." ++msgstr "" ++ ++msgid "Rewrite to source %s" ++msgstr "" ++ ++msgid "Rewrite to source %s, %s" ++msgstr "" ++ ++msgid "SNAT IP address" ++msgstr "" ++ ++msgid "SNAT port" ++msgstr "" ++ ++# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # ++# Generated from applications/luci-fw/luasrc/model/cbi/luci_fw/rrule.lua # ++# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # ++# ++# msgid "Traffic Redirection" ++# msgstr "" ++# ++# msgid "" ++# "Traffic redirection allows you to change the destination address of " ++# "forwarded packets." ++# msgstr "" ++# ++# msgid "Overview" ++# msgstr "" ++# ++# msgid "Name" ++# msgstr "" ++# ++# msgid "Source zone" ++# msgstr "" ++# ++# msgid "Source MAC-address" ++# msgstr "" ++# ++# msgid "Source port" ++# msgstr "" ++# ++# msgid "Protocol" ++# msgstr "" ++# ++msgid "Source IP address" ++msgstr "Source IP address" ++ ++msgid "Source MAC address" ++msgstr "" ++ ++msgid "Source NAT" ++msgstr "" ++ ++msgid "" ++"Source NAT is a specific form of masquerading which allows fine grained " ++"control over the source IP used for outgoing traffic, for example to map " ++"multiple WAN addresses to internal subnets." ++msgstr "" ++ ++msgid "Source address" ++msgstr "Source address" ++ ++msgid "Source port" ++msgstr "Source port" ++ ++msgid "Source zone" ++msgstr "Source zone" ++ ++msgid "" ++"The firewall creates zones over your network interfaces to control network " ++"traffic flow." ++msgstr "" ++"The firewall creates zones over your network interfaces to control network " ++"traffic flow." ++ ++msgid "" ++"The options below control the forwarding policies between this zone (%s) and " ++"other zones. Destination zones cover forwarded traffic " ++"originating from %q. Source zones match forwarded " ++"traffic from other zones targeted at %q. The forwarding " ++"rule is unidirectional, e.g. a forward from lan to wan does " ++"not imply a permission to forward from wan to lan as well." ++msgstr "" ++ ++msgid "" ++"This page allows you to change advanced properties of the port forwarding " ++"entry. In most cases there is no need to modify those settings." ++msgstr "" ++ ++msgid "" ++"This page allows you to change advanced properties of the traffic rule " ++"entry, such as matched source and destination hosts." ++msgstr "" ++ ++msgid "" ++"This section defines common properties of %q. The input and " ++"output options set the default policies for traffic entering and " ++"leaving this zone while the forward option describes the policy for " ++"forwarded traffic between different networks within the zone. Covered " ++"networks specifies which available networks are members of this zone." ++msgstr "" ++ ++msgid "To %s at %s on this device" ++msgstr "" ++ ++msgid "To %s in %s" ++msgstr "" ++ ++msgid "To %s on this device" ++msgstr "" ++ ++msgid "To %s, %s in %s" ++msgstr "" ++ ++msgid "To source IP" ++msgstr "" ++ ++msgid "To source port" ++msgstr "" ++ ++msgid "Traffic Rules" ++msgstr "" ++ ++msgid "" ++"Traffic rules define policies for packets traveling between different zones, " ++"for example to reject traffic between certain hosts or to open WAN ports on " ++"the router." ++msgstr "" ++ ++msgid "Via %s" ++msgstr "" ++ ++msgid "Via %s at %s" ++msgstr "" ++ ++msgid "" ++"You may specify multiple by selecting \"-- custom --\" and then entering " ++"protocols separated by space." ++msgstr "" ++ ++msgid "Zone %q" ++msgstr "" ++ ++msgid "Zone ⇒ Forwardings" ++msgstr "" ++ ++msgid "Zones" ++msgstr "Zones" ++ ++msgid "accept" ++msgstr "accept" ++ ++msgid "any" ++msgstr "any" ++ ++msgid "any host" ++msgstr "" ++ ++msgid "any router IP" ++msgstr "" ++ ++msgid "any zone" ++msgstr "" ++ ++msgid "don't track" ++msgstr "" ++ ++msgid "drop" ++msgstr "drop" ++ ++msgid "reject" ++msgstr "reject" ++ ++msgid "traffic" ++msgstr "" ++ ++#~ msgid "Destination" ++#~ msgstr "Destination" ++ ++#~ msgid "Source" ++#~ msgstr "Source" ++ ++#~ msgid "(optional)" ++#~ msgstr "(optional)" ++ ++#~ msgid "Internal port (optional)" ++#~ msgstr "Internal port (optional)" ++ ++# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # ++# Generated from applications/luci-fw/luasrc/model/cbi/luci_fw/trule.lua # ++# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # ++# ++# msgid "Name" ++# msgstr "" ++# ++# msgid "(optional)" ++# msgstr "" ++# ++# msgid "Protocol" ++# msgstr "" ++# ++# msgid "Source port" ++# msgstr "" ++# ++# msgid "Destination port" ++# msgstr "" ++# ++# msgid "Action" ++# msgstr "" ++# ++# msgid "drop" ++# msgstr "" ++# ++# msgid "accept" ++# msgstr "" ++# ++# msgid "reject" ++# msgstr "" ++# ++#~ msgid "Advanced Rules" ++#~ msgstr "Advanced Rules" ++ ++#~ msgid "" ++#~ "Advanced rules let you customize the firewall to your needs. Only new " ++#~ "connections will be matched. Packets belonging to already open " ++#~ "connections are automatically allowed to pass the firewall." ++#~ msgstr "" ++#~ "Advanced rules let you customize the firewall to your needs. Only new " ++#~ "connections will be matched. Packets belonging to already open " ++#~ "connections are automatically allowed to pass the firewall." ++ ++#~ msgid "Device" ++#~ msgstr "Device" ++ ++#~ msgid "" ++#~ "Match incoming traffic originating from the given source port or port " ++#~ "range on the client host" ++#~ msgstr "" ++#~ "Match incoming traffic originating from the given source port or port " ++#~ "range on the client host" ++ ++#~ msgid "Overview" ++#~ msgstr "Overview" ++ ++# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # ++# Generated from applications/luci-fw/luasrc/model/cbi/luci_fw/miniportfw.lua # ++# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # ++# ++# msgid "Name" ++# msgstr "" ++# ++# msgid "(optional)" ++# msgstr "" ++# ++# msgid "Protocol" ++# msgstr "" ++# ++# msgid "External port" ++# msgstr "" ++# ++# msgid "Internal IP address" ++# msgstr "" ++# ++#~ msgid "Port forwarding" ++#~ msgstr "Port forwarding" ++ ++#~ msgid "" ++#~ "Port forwarding allows to provide network services in the internal " ++#~ "network to an external network." ++#~ msgstr "" ++#~ "Port forwarding allows to provide network services in the internal " ++#~ "network to an external network." ++ ++#~ msgid "Rules" ++#~ msgstr "Rules" ++ ++# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # ++# Generated from applications/luci-fw/luasrc/model/cbi/luci_fw/redirect.lua # ++# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # ++# ++# msgid "Name" ++# msgstr "" ++# ++# msgid "Protocol" ++# msgstr "" ++# ++#~ msgid "Traffic Redirection" ++#~ msgstr "Traffic Redirection" ++ ++#~ msgid "" ++#~ "Traffic redirection allows you to change the destination address of " ++#~ "forwarded packets." ++#~ msgstr "" ++#~ "Traffic redirection allows you to change the destination address of " ++#~ "forwarded packets." ++ ++#~ msgid "Network" ++#~ msgstr "Network" ++ ++# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # ++# Generated from applications/luci-fw/luasrc/model/cbi/luci_fw/traffic.lua # ++# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # ++# ++# msgid "Name" ++# msgstr "" ++# ++#~ msgid "Traffic Control" ++#~ msgstr "Traffic Control" ++ ++#~ msgid "Zone-to-Zone traffic" ++#~ msgstr "Zone-to-Zone traffic" ++ ++#~ msgid "" ++#~ "Here you can specify which network traffic is allowed to flow between " ++#~ "network zones. Only new connections will be matched. Packets belonging " ++#~ "to already open connections are automatically allowed to pass the " ++#~ "firewall. If you experience occasional connection problems try enabling " ++#~ "MSS Clamping otherwise disable it for performance reasons." ++#~ msgstr "" ++#~ "Here you can specify which network traffic is allowed to flow between " ++#~ "network zones. Only new connections will be matched. Packets belonging " ++#~ "to already open connections are automatically allowed to pass the " ++#~ "firewall. If you experience occasional connection problems try enabling " ++#~ "MSS Clamping otherwise disable it for performance reasons." ++ ++#~ msgid "Zone" ++#~ msgstr "Zone" ++ ++#~ msgid "Destination IP" ++#~ msgstr "Destination IP" ++ ++#~ msgid "IP address" ++#~ msgstr "IP address" ++ ++#~ msgid "Source MAC-address" ++#~ msgstr "Source MAC-address" +diff --git a/feeds/luci/applications/luci-app-firewall/po/es/firewall.po b/feeds/luci/applications/luci-app-firewall/po/es/firewall.po +new file mode 100644 +index 0000000..452809c +--- /dev/null ++++ b/feeds/luci/applications/luci-app-firewall/po/es/firewall.po +@@ -0,0 +1,698 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Report-Msgid-Bugs-To: \n" ++"POT-Creation-Date: 2010-03-30 17:00+0200\n" ++"PO-Revision-Date: 2014-06-15 09:00+0200\n" ++"Last-Translator: José Vicente \n" ++"Language-Team: LANGUAGE \n" ++"Language: es\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n != 1);\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "%s in %s" ++msgstr "%s en %s" ++ ++msgid "%s%s with %s" ++msgstr "%s%s con %s" ++ ++msgid "%s, %s in %s" ++msgstr "%s, %s en %s" ++ ++msgid "(Unnamed Entry)" ++msgstr "(Entrada sin nombre)" ++ ++msgid "(Unnamed Rule)" ++msgstr "(Reglas sin nombre)" ++ ++msgid "(Unnamed SNAT)" ++msgstr "(SNAT sin nombre)" ++ ++msgid "-- Please choose --" ++msgstr "-- Seleccione --" ++ ++msgid "-- custom --" ++msgstr "-- propio --" ++ ++msgid "%d pkts. per %s" ++msgstr "%d paquetes por %s" ++ ++msgid "%d pkts. per %s, burst %d pkts." ++msgstr "" ++"%d paquetes por %s, máximo %d paquetes." ++ ++msgid "%s and limit to %s" ++msgstr "%s y límite a %s" ++ ++msgid "Action" ++msgstr "Acción" ++ ++msgid "Add" ++msgstr "Añadir" ++ ++msgid "Add and edit..." ++msgstr "Añadir y editar..." ++ ++msgid "Advanced Settings" ++msgstr "Configuración avanzada" ++ ++msgid "Allow forward from source zones:" ++msgstr "Permitir traspaso desde zonas de origen:" ++ ++msgid "Allow forward to destination zones:" ++msgstr "Permitir traspaso a zonas de destino:" ++ ++msgid "Any" ++msgstr "Cualquiera" ++ ++msgid "Covered networks" ++msgstr "Redes cubiertas" ++ ++msgid "Custom Rules" ++msgstr "Reglas propias" ++ ++msgid "" ++"Custom rules allow you to execute arbritary iptables commands which are not " ++"otherwise covered by the firewall framework. The commands are executed after " ++"each firewall restart, right after the default ruleset has been loaded." ++msgstr "" ++"Las reglas propias le permiten ejecutar comandos de iptables que no están " ++"disponibles en el marco del cortafuegos. Los comandos se ejecutarán tras " ++"cualquier rearranque del cortafuegos, justo tras haber cargado el conjunto " ++"de reglas por defecto." ++ ++msgid "Destination IP address" ++msgstr "Dirección IP destino" ++ ++msgid "Destination address" ++msgstr "Dirección de destino" ++ ++msgid "Destination port" ++msgstr "Puerto de destino" ++ ++msgid "Destination zone" ++msgstr "Zona de destino" ++ ++msgid "Do not rewrite" ++msgstr "No reescribir" ++ ++msgid "Drop invalid packets" ++msgstr "Descartar paquetes no válidos" ++ ++msgid "Enable" ++msgstr "Activar" ++ ++msgid "Enable NAT Loopback" ++msgstr "Activar bucle NAT" ++ ++msgid "Enable SYN-flood protection" ++msgstr "Activar protección a inundación-SYN" ++ ++msgid "Enable logging on this zone" ++msgstr "Activar registro en esta zona" ++ ++msgid "External IP address" ++msgstr "Dirección IP externa" ++ ++msgid "External port" ++msgstr "Puerto externo" ++ ++msgid "External zone" ++msgstr "Zona externa" ++ ++msgid "Extra arguments" ++msgstr "Parámetros extra" ++ ++msgid "Firewall" ++msgstr "Cortafuegos" ++ ++msgid "Firewall - Custom Rules" ++msgstr "Cortafuegos - Reglas propias" ++ ++msgid "Firewall - Port Forwards" ++msgstr "Cortafuegos - traspasos de puerto" ++ ++msgid "Firewall - Traffic Rules" ++msgstr "Cortafuegos - Reglas de tráfico" ++ ++msgid "Firewall - Zone Settings" ++msgstr "Cortafuegos - Configuración de la zona" ++ ++msgid "Force connection tracking" ++msgstr "Forzar seguimiento de conexión" ++ ++msgid "Forward" ++msgstr "Traspasar" ++ ++msgid "Forward to" ++msgstr "Traspasar a" ++ ++msgid "From %s in %s" ++msgstr "Desde %s en %s" ++ ++msgid "From %s in %s with source %s" ++msgstr "Desde %s en %s con origen %s" ++ ++msgid "From %s in %s with source %s and %s" ++msgstr "Desde %s en %s con origen %s y %s" ++ ++msgid "General Settings" ++msgstr "Configuración general" ++ ++msgid "IPv4" ++msgstr "IPv4" ++ ++msgid "IPv4 and IPv6" ++msgstr "IPv4 e IPv6" ++ ++msgid "IPv4 only" ++msgstr "Sólo IPv4" ++ ++msgid "IPv6" ++msgstr "IPv6" ++ ++msgid "IPv6 only" ++msgstr "Sñolo IPv6" ++ ++msgid "Input" ++msgstr "Entrada" ++ ++msgid "Inter-Zone Forwarding" ++msgstr "Traspaso entre zonas" ++ ++msgid "Internal IP address" ++msgstr "Dirección IP interna" ++ ++msgid "Internal port" ++msgstr "Puerto interno" ++ ++msgid "Internal zone" ++msgstr "Zona interna" ++ ++msgid "Limit log messages" ++msgstr "Limitar registro de mensajes" ++ ++msgid "MSS clamping" ++msgstr "Fijado de MSS" ++ ++msgid "Masquerading" ++msgstr "Enmascaramiento" ++ ++msgid "Match" ++msgstr "Coincidir" ++ ++msgid "Match ICMP type" ++msgstr "Coincidir con tipo ICMP" ++ ++msgid "Match forwarded traffic to the given destination port or port range." ++msgstr "Coincidir con tráfico traspasado al puerto o rango de puertos destino." ++ ++msgid "" ++"Match incoming traffic directed at the given destination port or port range " ++"on this host" ++msgstr "" ++"Coincidir con tráfico de entrada dirigido al puerto o rango de puertos " ++"destino en esta máquina" ++ ++msgid "" ++"Match incoming traffic originating from the given source port or port range " ++"on the client host." ++msgstr "" ++"Coincidir con tráfico de entrada originado desde el puerto o rango de " ++"puertos origen en la máquina cliente." ++ ++msgid "Name" ++msgstr "Nombre" ++ ++msgid "New SNAT rule" ++msgstr "Nueva regla SNAT" ++ ++msgid "New forward rule" ++msgstr "Nueva regla de traspaso" ++ ++msgid "New input rule" ++msgstr "Nueva regla de entrada" ++ ++msgid "New port forward" ++msgstr "Nuevo traspaso de puerto" ++ ++msgid "New source NAT" ++msgstr "Nuevo origen NAT" ++ ++msgid "Only match incoming traffic directed at the given IP address." ++msgstr "Coincidir sólo con tráfico de entrada a esta dirección IP." ++ ++msgid "Only match incoming traffic from these MACs." ++msgstr "Coincidir sólo con tráfico de entrada desde estas MACs." ++ ++msgid "Only match incoming traffic from this IP or range." ++msgstr "Coincidir sólo con tráfico de entrada desde esta IP o rango." ++ ++msgid "" ++"Only match incoming traffic originating from the given source port or port " ++"range on the client host" ++msgstr "" ++"Coincidir sólo con tráfico de entrada originado desde el puerto o rango de " ++"puertos origen en la máquina cliente" ++ ++msgid "Open ports on router" ++msgstr "Abrir puertos en el router" ++ ++msgid "Other..." ++msgstr "Otros..." ++ ++msgid "Output" ++msgstr "Salida" ++ ++msgid "Passes additional arguments to iptables. Use with care!" ++msgstr "Pasa más parámetros a IPTables. ¡Usar con cuidado!" ++ ++msgid "Port Forwards" ++msgstr "Traspasos de puerto" ++ ++msgid "" ++"Port forwarding allows remote computers on the Internet to connect to a " ++"specific computer or service within the private LAN." ++msgstr "" ++"El traspaso de puertos permite a ordenadores remotos en internet conectar a " ++"un ordenador o servicio específico en la LAN privada." ++ ++msgid "Protocol" ++msgstr "Protocolo" ++ ++msgid "" ++"Redirect matched incoming traffic to the given port on the internal host" ++msgstr "" ++"Redirigir el tráfico de entrada que coincida al puerto en la máquina interna" ++ ++msgid "Redirect matched incoming traffic to the specified internal host" ++msgstr "Redirigir el tráfico de entrada que coincida a la máquina interna" ++ ++msgid "Restrict Masquerading to given destination subnets" ++msgstr "Restringir enmascaramiento a las subredes destino" ++ ++msgid "Restrict Masquerading to given source subnets" ++msgstr "Restringir enmascaramiento a las subredes origen" ++ ++msgid "Restrict to address family" ++msgstr "Restringir a la familia de direcciones" ++ ++msgid "Rewrite matched traffic to the given address." ++msgstr "Reescribir el tráfico que coincida a estas direcciones." ++ ++msgid "" ++"Rewrite matched traffic to the given source port. May be left empty to only " ++"rewrite the IP address." ++msgstr "" ++"Reescribir el tráfico que coincida con este puerto origen. Deje en blanco " ++"para reescribir sólo la dirección IP." ++ ++msgid "Rewrite to source %s" ++msgstr "Reescribir a origen %s" ++ ++msgid "Rewrite to source %s, %s" ++msgstr "Reescribir a origen %s, %s" ++ ++msgid "SNAT IP address" ++msgstr "Dirección IP SNAT" ++ ++msgid "SNAT port" ++msgstr "Puerto SNAT" ++ ++msgid "Source IP address" ++msgstr "Dirección IP origen" ++ ++msgid "Source MAC address" ++msgstr "Dirección MAC origen" ++ ++msgid "Source NAT" ++msgstr "NAT origen" ++ ++msgid "" ++"Source NAT is a specific form of masquerading which allows fine grained " ++"control over the source IP used for outgoing traffic, for example to map " ++"multiple WAN addresses to internal subnets." ++msgstr "" ++"NAT origen es una forma específica de enmascaramiento que permite el control " ++"fino del origen IP que se usa en el tráfico de salida por ejemplo para " ++"dirigir múltiples direcciones WAN a las subredes internas." ++ ++msgid "Source address" ++msgstr "Dirección origen" ++ ++msgid "Source port" ++msgstr "Puerto origen" ++ ++msgid "Source zone" ++msgstr "Zona origen" ++ ++msgid "" ++"The firewall creates zones over your network interfaces to control network " ++"traffic flow." ++msgstr "" ++"El cortafuegos crea zonas sobre sus interfaces de red para controlar el " ++"flujo del tráfico." ++ ++msgid "" ++"The options below control the forwarding policies between this zone (%s) and " ++"other zones. Destination zones cover forwarded traffic " ++"originating from %q. Source zones match forwarded " ++"traffic from other zones targeted at %q. The forwarding " ++"rule is unidirectional, e.g. a forward from lan to wan does " ++"not imply a permission to forward from wan to lan as well." ++msgstr "" ++"Estas opciones controlan las políticas de traspaso entre esta zona (%s) y " ++"otras. Las zonas origen cubren el tráfico traspasado desde " ++"%q. Las zonas origen coinciden con el tráfico traspasado " ++"desde otras zonas dirigido a %q. La regla de traspaso es " ++"unidireccional, por ejemplo una regla de traspaso desde la LAN a la " ++"WAN no implica permiso para traspasar desde la WAN a la LAN también." ++ ++msgid "" ++"This page allows you to change advanced properties of the port forwarding " ++"entry. In most cases there is no need to modify those settings." ++msgstr "" ++"Propiedades avanzadas de la entrada \"traspaso de puertos\". No suele ser " ++"necesario modificar esta configuración." ++ ++msgid "" ++"This page allows you to change advanced properties of the traffic rule " ++"entry, such as matched source and destination hosts." ++msgstr "" ++"Propiedades avanzadas de la entrada \"reglas de tráfico\", como " ++"coincidencias en puertos de origen y destino." ++ ++#, fuzzy ++msgid "" ++"This section defines common properties of %q. The input and " ++"output options set the default policies for traffic entering and " ++"leaving this zone while the forward option describes the policy for " ++"forwarded traffic between different networks within the zone. Covered " ++"networks specifies which available networks are members of this zone." ++msgstr "" ++"Esta sección define propierdades comunes de %q. Las opciones de entrada y la salida marcan las políticas por defecto para el tráfico " ++"que entra y deja esta zona mientras que la opción traspaso describe " ++"la política para tráfico traspasado desde diferentes redes en la zona. " ++"Redes cubiertas especifican qué redes disponibles son miembros de " ++"esta zona." ++ ++msgid "To %s at %s on this device" ++msgstr "A %s en %s por este dispositivo" ++ ++msgid "To %s in %s" ++msgstr "A %s en %s" ++ ++msgid "To %s on this device" ++msgstr "A %s por este dispositivo" ++ ++msgid "To %s, %s in %s" ++msgstr "A %s, %s en %s" ++ ++msgid "To source IP" ++msgstr "A IP origen" ++ ++msgid "To source port" ++msgstr "A puerto origen" ++ ++msgid "Traffic Rules" ++msgstr "Reglas de tráfico" ++ ++msgid "" ++"Traffic rules define policies for packets traveling between different zones, " ++"for example to reject traffic between certain hosts or to open WAN ports on " ++"the router." ++msgstr "" ++"Las reglas de tráfico definen políticas para tramas que se mueven entre " ++"zonas diferentes, por ejemplo para rechazar tráfico entre ciertas máquinas o " ++"puertos WAN abiertos en el router." ++ ++msgid "Via %s" ++msgstr "Vía %s" ++ ++msgid "Via %s at %s" ++msgstr "Vía %s a %s" ++ ++msgid "" ++"You may specify multiple by selecting \"-- custom --\" and then entering " ++"protocols separated by space." ++msgstr "" ++"Puede poner varios seleccionando \"-- propio --\" e introduciendo los " ++"protocolos separados por espacio." ++ ++msgid "Zone %q" ++msgstr "Zona %q" ++ ++msgid "Zone ⇒ Forwardings" ++msgstr "Zona ⇒ Traspasos" ++ ++msgid "Zones" ++msgstr "Zonas" ++ ++msgid "accept" ++msgstr "aceptar" ++ ++msgid "any" ++msgstr "cualquiera" ++ ++msgid "any host" ++msgstr "cualquier máquina" ++ ++msgid "any router IP" ++msgstr "cualquier router IP" ++ ++msgid "any zone" ++msgstr "cualquier zona" ++ ++msgid "don't track" ++msgstr "no seguir" ++ ++msgid "drop" ++msgstr "descartar" ++ ++msgid "reject" ++msgstr "rechazar" ++ ++msgid "traffic" ++msgstr "tráfico" ++ ++#~ msgid "Destination" ++#~ msgstr "Destino" ++ ++#~ msgid "Family" ++#~ msgstr "Familia" ++ ++#~ msgid "Forward to %s in %s" ++#~ msgstr "Traspasar a %s en %s" ++ ++#~ msgid "Forward to %s, %s in %s" ++#~ msgstr "Traspasar a %s, %s en %s" ++ ++#~ msgid "SNAT" ++#~ msgstr "SNAT" ++ ++#~ msgid "Source" ++#~ msgstr "Origen" ++ ++#~ msgid "To %s" ++#~ msgstr "A %s" ++ ++#~ msgid "To %s at %s" ++#~ msgstr "A %s en %s" ++ ++#~ msgid "Via" ++#~ msgstr "Via" ++ ++#~ msgid "Accept forward" ++#~ msgstr "Aceptar traspaso" ++ ++#~ msgid "Accept input" ++#~ msgstr "Aceptar entrada" ++ ++#~ msgid "Disable" ++#~ msgstr "Desactivar" ++ ++#~ msgid "Discard forward" ++#~ msgstr "Descartar traspaso" ++ ++#~ msgid "Discard input" ++#~ msgstr "Descartar entrada" ++ ++#~ msgid "Do not track forward" ++#~ msgstr "No seguir traspaso" ++ ++#~ msgid "Do not track input" ++#~ msgstr "No seguir entrada" ++ ++#~ msgid "IP" ++#~ msgstr "IP" ++ ++#~ msgid "IP range" ++#~ msgstr "Rango IP" ++ ++#~ msgid "IPs" ++#~ msgstr "IPs" ++ ++#~ msgid "MAC" ++#~ msgstr "MAC" ++ ++#~ msgid "MACs" ++#~ msgstr "MACs" ++ ++#~ msgid "Refuse forward" ++#~ msgstr "Rechazar traspaso" ++ ++#~ msgid "Refuse input" ++#~ msgstr "Rechazar entrada" ++ ++#~ msgid "Rule is disabled" ++#~ msgstr "La regla está desactivada" ++ ++#~ msgid "Rule is enabled" ++#~ msgstr "La regla está activada" ++ ++#~ msgid "day" ++#~ msgstr "dia" ++ ++#~ msgid "hour" ++#~ msgstr "hora" ++ ++#~ msgid "minute" ++#~ msgstr "minuto" ++ ++#~ msgid "not" ++#~ msgstr "no" ++ ++#~ msgid "port" ++#~ msgstr "puerto" ++ ++#~ msgid "ports" ++#~ msgstr "puertos" ++ ++#~ msgid "second" ++#~ msgstr "segundo" ++ ++#~ msgid "type" ++#~ msgstr "tipo" ++ ++#~ msgid "types" ++#~ msgstr "tipos" ++ ++#~ msgid "Internal port (optional)" ++#~ msgstr "Puerto interno (opcional)" ++ ++#~ msgid "Advanced Rules" ++#~ msgstr "Reglas avanzadas" ++ ++#~ msgid "" ++#~ "Advanced rules let you customize the firewall to your needs. Only new " ++#~ "connections will be matched. Packets belonging to already open " ++#~ "connections are automatically allowed to pass the firewall." ++#~ msgstr "" ++#~ "Las reglas avanzadas le permite personalizar el corta fuego según sus " ++#~ "necesidades. Sólamente las nuevas conexiones serán afectadas por las " ++#~ "reglas. Los paquetes pertenecientes a conexiones ya abierta, se les " ++#~ "permite el libre paso por el corta fuego." ++ ++#~ msgid "Port forwarding" ++#~ msgstr "Reenvío de puerto" ++ ++#~ msgid "" ++#~ "Port forwarding allows to provide network services in the internal " ++#~ "network to an external network." ++#~ msgstr "" ++#~ "El reenvío de puerto permite proveer servicios de red en una red interna " ++#~ "a una red externa (por ejemplo Internet)" ++ ++#~ msgid "Traffic Redirection" ++#~ msgstr "Redirección de tráfico" ++ ++#~ msgid "" ++#~ "Traffic redirection allows you to change the destination address of " ++#~ "forwarded packets." ++#~ msgstr "" ++#~ "La redirección de tráfico permite cambiar la dirección de destino de los " ++#~ "paquetes reenviados." ++ ++#, fuzzy ++#~ msgid "Network" ++#~ msgstr "Redes" ++ ++#~ msgid "Traffic Control" ++#~ msgstr "Control de tráfico" ++ ++#~ msgid "Zone-to-Zone traffic" ++#~ msgstr "Tráfico Zona-a-Zona" ++ ++#, fuzzy ++#~ msgid "" ++#~ "Here you can specify which network traffic is allowed to flow between " ++#~ "network zones. Only new connections will be matched. Packets belonging " ++#~ "to already open connections are automatically allowed to pass the " ++#~ "firewall. If you experience occasional connection problems try enabling " ++#~ "MSS Clamping otherwise disable it for performance reasons." ++#~ msgstr "" ++#~ "Aquí puede especificar qué tráfico de red is permitido, discho tráfico " ++#~ "fluirá entre las zonas de red definidas. Sólamente las nuevas conexiones " ++#~ "serán aplicadas por las reglas. Los paquetes pertenecientes a conexiones " ++#~ "ya abierta se les permitirá el paso sobre el corta fuego. Si experimenta " ++#~ "ocacionalmente problemas de conexión, intente activar MSS Clamping de " ++#~ "otra forma, deshabilitelo para mejorar considerablemente la performance." ++ ++#~ msgid "Zone" ++#~ msgstr "Zona" ++ ++#, fuzzy ++#~ msgid "Destination IP" ++#~ msgstr "Destino" ++ ++#, fuzzy ++#~ msgid "IP address" ++#~ msgstr "Dirección IP" ++ ++#, fuzzy ++#~ msgid "Source MAC-address" ++#~ msgstr "Dirección MAC de origen" ++ ++#~ msgid "Custom forwarding" ++#~ msgstr "Renvío personalizado" ++ ++#~ msgid "Input Zone" ++#~ msgstr "Zona de entrada" ++ ++#~ msgid "Output Zone" ++#~ msgstr "Zona de salida" ++ ++#~ msgid "External Zone" ++#~ msgstr "Zona Externa" ++ ++#~ msgid "Source MAC" ++#~ msgstr "MAC de Origen" ++ ++#~ msgid "Defaults" ++#~ msgstr "De fábrica" ++ ++#~ msgid "" ++#~ "These are the default settings that are used if no other rules match." ++#~ msgstr "" ++#~ "Estos son los valores por defecto que son usados si no hay otra regla a " ++#~ "aplicar." ++ ++#~ msgid "" ++#~ "Zones part the network interfaces into certain isolated areas to separate " ++#~ "network traffic. One or more networks can belong to a zone. The MASQ-flag " ++#~ "enables NAT masquerading for all outgoing traffic on this zone." ++#~ msgstr "" ++#~ "Las zonas dividen las interfaces de red en varias partes aisladas para " ++#~ "separar el tráfico de red. Una o mas redes pueden pertenecer a una zona. " ++#~ "La bandera MASQ activa el enmascaramiento NAT para todo el tráfico " ++#~ "saliente sobre esa zona." ++ ++#~ msgid "MASQ" ++#~ msgstr "MASQ" ++ ++#~ msgid "contained networks" ++#~ msgstr "redes contenidas" +diff --git a/feeds/luci/applications/luci-app-firewall/po/fr/firewall.po b/feeds/luci/applications/luci-app-firewall/po/fr/firewall.po +new file mode 100644 +index 0000000..96f3f51 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-firewall/po/fr/firewall.po +@@ -0,0 +1,693 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Report-Msgid-Bugs-To: \n" ++"POT-Creation-Date: 2010-03-30 17:00+0200\n" ++"PO-Revision-Date: 2013-02-26 00:44+0200\n" ++"Last-Translator: val56 \n" ++"Language-Team: French\n" ++"Language: fr\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n > 1);\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "%s in %s" ++msgstr "" ++ ++msgid "%s%s with %s" ++msgstr "" ++ ++msgid "%s, %s in %s" ++msgstr "" ++ ++msgid "(Unnamed Entry)" ++msgstr "" ++ ++msgid "(Unnamed Rule)" ++msgstr "" ++ ++msgid "(Unnamed SNAT)" ++msgstr "" ++ ++msgid "-- Please choose --" ++msgstr "-- Choisissez SVP --" ++ ++msgid "-- custom --" ++msgstr "" ++ ++msgid "%d pkts. per %s" ++msgstr "" ++ ++msgid "%d pkts. per %s, burst %d pkts." ++msgstr "" ++ ++msgid "%s and limit to %s" ++msgstr "" ++ ++msgid "Action" ++msgstr "Action" ++ ++msgid "Add" ++msgstr "" ++ ++msgid "Add and edit..." ++msgstr "" ++ ++msgid "Advanced Settings" ++msgstr "Paramètres avancés" ++ ++msgid "Allow forward from source zones:" ++msgstr "Permettre la transmission des zones source :" ++ ++msgid "Allow forward to destination zones:" ++msgstr "Permettre la transmission vers les zones destination :" ++ ++msgid "Any" ++msgstr "N'importe lequel" ++ ++msgid "Covered networks" ++msgstr "Réseaux couverts" ++ ++msgid "Custom Rules" ++msgstr "Régles spécifiques" ++ ++msgid "" ++"Custom rules allow you to execute arbritary iptables commands which are not " ++"otherwise covered by the firewall framework. The commands are executed after " ++"each firewall restart, right after the default ruleset has been loaded." ++msgstr "" ++ ++msgid "Destination IP address" ++msgstr "Adresse IP de destination" ++ ++msgid "Destination address" ++msgstr "Adresse de destination" ++ ++msgid "Destination port" ++msgstr "Port de destination" ++ ++msgid "Destination zone" ++msgstr "Zone de destination" ++ ++msgid "Do not rewrite" ++msgstr "" ++ ++msgid "Drop invalid packets" ++msgstr "Supprimer les paquets invalides" ++ ++msgid "Enable" ++msgstr "Activer" ++ ++msgid "Enable NAT Loopback" ++msgstr "Activer le NAT sur la boucle-locale" ++ ++msgid "Enable SYN-flood protection" ++msgstr "Activer la protection contre le SYN-flood" ++ ++msgid "Enable logging on this zone" ++msgstr "Activer les traces (logs) sur cette zone" ++ ++msgid "External IP address" ++msgstr "Adresse IP externe" ++ ++msgid "External port" ++msgstr "Port externe" ++ ++msgid "External zone" ++msgstr "Zone externe" ++ ++msgid "Extra arguments" ++msgstr "" ++ ++# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # ++# applications/luci-fw/luasrc/model/cbi/luci_fw/zones.lua # ++# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # ++# ++msgid "Firewall" ++msgstr "Pare-feu" ++ ++msgid "Firewall - Custom Rules" ++msgstr "Pare-feu -- Règles personnalisées" ++ ++msgid "Firewall - Port Forwards" ++msgstr "Pare-feu -- Redirections de ports" ++ ++msgid "Firewall - Traffic Rules" ++msgstr "Pare-feu -- Règles de trafic" ++ ++msgid "Firewall - Zone Settings" ++msgstr "Pare-feu - Configuration des zones" ++ ++msgid "Force connection tracking" ++msgstr "Forcer le suivi des connexions" ++ ++msgid "Forward" ++msgstr "Transfert" ++ ++msgid "Forward to" ++msgstr "Transférer à" ++ ++msgid "From %s in %s" ++msgstr "" ++ ++msgid "From %s in %s with source %s" ++msgstr "" ++ ++msgid "From %s in %s with source %s and %s" ++msgstr "" ++ ++msgid "General Settings" ++msgstr "Paramètres généraux" ++ ++msgid "IPv4" ++msgstr "IPv4" ++ ++msgid "IPv4 and IPv6" ++msgstr "IPv4 et IPv6" ++ ++msgid "IPv4 only" ++msgstr "IPv4 seulement" ++ ++msgid "IPv6" ++msgstr "IPv6" ++ ++msgid "IPv6 only" ++msgstr "IPv6 seulement" ++ ++msgid "Input" ++msgstr "Entrée" ++ ++msgid "Inter-Zone Forwarding" ++msgstr "Transmission entre zones" ++ ++msgid "Internal IP address" ++msgstr "Adresse IP interne" ++ ++msgid "Internal port" ++msgstr "Port interne" ++ ++msgid "Internal zone" ++msgstr "Zone interne" ++ ++msgid "Limit log messages" ++msgstr "Limiter les messages de journalisation" ++ ++msgid "MSS clamping" ++msgstr "Contrainte du MSS" ++ ++msgid "Masquerading" ++msgstr "Masquage" ++ ++msgid "Match" ++msgstr "" ++ ++msgid "Match ICMP type" ++msgstr "Type ICMP correspondant" ++ ++msgid "Match forwarded traffic to the given destination port or port range." ++msgstr "" ++ ++msgid "" ++"Match incoming traffic directed at the given destination port or port range " ++"on this host" ++msgstr "" ++"Prendre en compte le trafic dirigé vers le port de destination donné (ou la " ++"gamme de ports) sur cet hôte" ++ ++msgid "" ++"Match incoming traffic originating from the given source port or port range " ++"on the client host." ++msgstr "" ++ ++msgid "Name" ++msgstr "Nom" ++ ++msgid "New SNAT rule" ++msgstr "Nouvelle règle SNAT" ++ ++msgid "New forward rule" ++msgstr "" ++ ++msgid "New input rule" ++msgstr "Nouvelle règle d'entrée" ++ ++msgid "New port forward" ++msgstr "Nouvelle redirection de port" ++ ++msgid "New source NAT" ++msgstr "Nouvelle source NAT" ++ ++msgid "Only match incoming traffic directed at the given IP address." ++msgstr "" ++ ++msgid "Only match incoming traffic from these MACs." ++msgstr "Montrer seulement le trafic entrant provenant de ces adresses MAC." ++ ++msgid "Only match incoming traffic from this IP or range." ++msgstr "" ++ ++msgid "" ++"Only match incoming traffic originating from the given source port or port " ++"range on the client host" ++msgstr "" ++ ++msgid "Open ports on router" ++msgstr "Ports ouverts sur le routeur" ++ ++msgid "Other..." ++msgstr "Autre..." ++ ++msgid "Output" ++msgstr "Sortie" ++ ++msgid "Passes additional arguments to iptables. Use with care!" ++msgstr "" ++ ++msgid "Port Forwards" ++msgstr "Redirections de port" ++ ++msgid "" ++"Port forwarding allows remote computers on the Internet to connect to a " ++"specific computer or service within the private LAN." ++msgstr "" ++"La redirection de port permet aux ordinateurs distants sur Internet, de se " ++"connecter à un ordinateur ou service spécifié dans le réseau local privé." ++ ++msgid "Protocol" ++msgstr "Protocole" ++ ++msgid "" ++"Redirect matched incoming traffic to the given port on the internal host" ++msgstr "" ++"Rediriger le trafic entrant correspondant vers le port donné sur l'hôte " ++"interne" ++ ++msgid "Redirect matched incoming traffic to the specified internal host" ++msgstr "Rediriger le trafic entrant correspondant vers l'hôte interne spécifié" ++ ++msgid "Restrict Masquerading to given destination subnets" ++msgstr "" ++"Restreindre la substitution d'adresses (Masquerade) à ces sous-réseaux " ++"destinataires" ++ ++msgid "Restrict Masquerading to given source subnets" ++msgstr "" ++"Restreindre la substitution d'adresses (Masquerade) à ces sous-réseaux " ++"sources" ++ ++msgid "Restrict to address family" ++msgstr "Restreindre à cette famille d'adresses" ++ ++msgid "Rewrite matched traffic to the given address." ++msgstr "" ++ ++msgid "" ++"Rewrite matched traffic to the given source port. May be left empty to only " ++"rewrite the IP address." ++msgstr "" ++ ++msgid "Rewrite to source %s" ++msgstr "" ++ ++msgid "Rewrite to source %s, %s" ++msgstr "" ++ ++msgid "SNAT IP address" ++msgstr "Adresse IP SNAT" ++ ++msgid "SNAT port" ++msgstr "Port SNAT" ++ ++# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # ++# applications/luci-fw/luasrc/model/cbi/luci_fw/rrule.lua # ++# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # ++# ++# msgid "Traffic Redirection" ++# msgstr "" ++# ++# msgid "" ++# "Traffic redirection allows you to change the destination address of " ++# "forwarded packets." ++# msgstr "" ++# ++# msgid "Overview" ++# msgstr "" ++# ++# msgid "Name" ++# msgstr "" ++# ++# msgid "Source zone" ++# msgstr "" ++# ++# msgid "Source MAC-address" ++# msgstr "" ++# ++# msgid "Source port" ++# msgstr "" ++# ++# msgid "Protocol" ++# msgstr "" ++# ++msgid "Source IP address" ++msgstr "Adresse IP source" ++ ++msgid "Source MAC address" ++msgstr "Adresse MAC source" ++ ++msgid "Source NAT" ++msgstr "Source NAT" ++ ++msgid "" ++"Source NAT is a specific form of masquerading which allows fine grained " ++"control over the source IP used for outgoing traffic, for example to map " ++"multiple WAN addresses to internal subnets." ++msgstr "" ++ ++msgid "Source address" ++msgstr "Adresse source" ++ ++msgid "Source port" ++msgstr "Port source" ++ ++msgid "Source zone" ++msgstr "Zone source" ++ ++msgid "" ++"The firewall creates zones over your network interfaces to control network " ++"traffic flow." ++msgstr "" ++"Le pare-feu crée des zones sur les interfaces réseau pour contrôler le flux " ++"du trafic réseau." ++ ++msgid "" ++"The options below control the forwarding policies between this zone (%s) and " ++"other zones. Destination zones cover forwarded traffic " ++"originating from %q. Source zones match forwarded " ++"traffic from other zones targeted at %q. The forwarding " ++"rule is unidirectional, e.g. a forward from lan to wan does " ++"not imply a permission to forward from wan to lan as well." ++msgstr "" ++"Les options ci-dessous contrôlent les politiques de transmission entre cette " ++"zone (%s) et les autres zones. Zones de destination couvre le " ++"trafic transfmis venant de %q. Zones source " ++"correspond au trafic transféré d'autres zones à destination de %q. La règle de transmission est unidirectionnelle, la " ++"transmission du LAN au WAN n'implique pas également l'autorisation " ++"de transmission du WAN au LAN." ++ ++msgid "" ++"This page allows you to change advanced properties of the port forwarding " ++"entry. In most cases there is no need to modify those settings." ++msgstr "" ++"Cette page vous permet de modifier les propriétés avancées parmi les entrées " ++"de redirection de port. Dans la plupart des cas, cela n'est pas nécessaire " ++"de modifier ces paramètres." ++ ++msgid "" ++"This page allows you to change advanced properties of the traffic rule " ++"entry, such as matched source and destination hosts." ++msgstr "" ++ ++#, fuzzy ++msgid "" ++"This section defines common properties of %q. The input and " ++"output options set the default policies for traffic entering and " ++"leaving this zone while the forward option describes the policy for " ++"forwarded traffic between different networks within the zone. Covered " ++"networks specifies which available networks are members of this zone." ++msgstr "" ++"Cette section définit des propriétés communes de %q. Les options entrée et sortie définissent les politiques par défaut pour le trafic " ++"entrant et sortant de cette zone, tandis que l'option transmission " ++"décrit la politique pour le trafic transmis entre différents réseaux dans " ++"cette zone. Les réseaux couverts indiquent quels réseaux " ++"disponibles sont membre de cette zone." ++ ++msgid "To %s at %s on this device" ++msgstr "" ++ ++msgid "To %s in %s" ++msgstr "" ++ ++msgid "To %s on this device" ++msgstr "" ++ ++msgid "To %s, %s in %s" ++msgstr "" ++ ++msgid "To source IP" ++msgstr "" ++ ++msgid "To source port" ++msgstr "" ++ ++msgid "Traffic Rules" ++msgstr "Règles de trafic" ++ ++msgid "" ++"Traffic rules define policies for packets traveling between different zones, " ++"for example to reject traffic between certain hosts or to open WAN ports on " ++"the router." ++msgstr "" ++ ++msgid "Via %s" ++msgstr "" ++ ++msgid "Via %s at %s" ++msgstr "" ++ ++msgid "" ++"You may specify multiple by selecting \"-- custom --\" and then entering " ++"protocols separated by space." ++msgstr "" ++ ++msgid "Zone %q" ++msgstr "Zone %q" ++ ++msgid "Zone ⇒ Forwardings" ++msgstr "Zone ⇒ Transmissions" ++ ++msgid "Zones" ++msgstr "Zones" ++ ++msgid "accept" ++msgstr "accepter" ++ ++#, fuzzy ++msgid "any" ++msgstr "tous" ++ ++msgid "any host" ++msgstr "" ++ ++msgid "any router IP" ++msgstr "" ++ ++msgid "any zone" ++msgstr "" ++ ++msgid "don't track" ++msgstr "" ++ ++msgid "drop" ++msgstr "ignorer" ++ ++msgid "reject" ++msgstr "rejeter" ++ ++msgid "traffic" ++msgstr "" ++ ++#~ msgid "Destination" ++#~ msgstr "Destination" ++ ++#~ msgid "Family" ++#~ msgstr "Famille" ++ ++#~ msgid "Source" ++#~ msgstr "Source" ++ ++#~ msgid "Via" ++#~ msgstr "Via" ++ ++#~ msgid "(optional)" ++#~ msgstr "(optionnel)" ++ ++#~ msgid "Intended destination address" ++#~ msgstr "Adresse de destination voulue" ++ ++#~ msgid "Internal port (optional)" ++#~ msgstr "Port interne (optionnel)" ++ ++#~ msgid "Advanced Options" ++#~ msgstr "Options avancées" ++ ++# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # ++# applications/luci-fw/luasrc/model/cbi/luci_fw/trule.lua # ++# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # ++# ++# msgid "Name" ++# msgstr "" ++# ++# msgid "(optional)" ++# msgstr "" ++# ++# msgid "Protocol" ++# msgstr "" ++# ++# msgid "Source port" ++# msgstr "" ++# ++# msgid "Destination port" ++# msgstr "" ++# ++# msgid "Action" ++# msgstr "" ++# ++# msgid "drop" ++# msgstr "" ++# ++# msgid "accept" ++# msgstr "" ++# ++# msgid "reject" ++# msgstr "" ++# ++#~ msgid "Advanced Rules" ++#~ msgstr "Règles avancées" ++ ++#~ msgid "" ++#~ "Advanced rules let you customize the firewall to your needs. Only new " ++#~ "connections will be matched. Packets belonging to already open " ++#~ "connections are automatically allowed to pass the firewall." ++#~ msgstr "" ++#~ "Les règles avancées vous laissent personnaliser le pare-feu selon vos " ++#~ "besoins. Seules les nouvelles connexions seront prises en compte. Les " ++#~ "paquets appartenant à des connexions déjà ouvertes sont automatiquement " ++#~ "admis à passer le pare-feu." ++ ++#~ msgid "Custom Rules (/etc/firewall.user)" ++#~ msgstr "Règles spécifiques (/etc/firewall.user)" ++ ++#~ msgid "Device" ++#~ msgstr "Équipement" ++ ++#~ msgid "" ++#~ "For DNAT, match incoming traffic directed at the given destination ip " ++#~ "address. For SNAT rewrite the source address to the given address." ++#~ msgstr "" ++#~ "Pour le DNAT, sélectionne le trafic entrant correspondant à l'adresse IP " ++#~ "destinataire. Pour le SNAT, ré-écrit l'adresse source avec l'adresse " ++#~ "donnée." ++ ++#~ msgid "" ++#~ "Match incoming traffic originating from the given source port or port " ++#~ "range on the client host" ++#~ msgstr "" ++#~ "Prendre en compte le trafic entrant provenant du port source donné (ou la " ++#~ "gamme de ports) sur l'hôte client" ++ ++#~ msgid "Overview" ++#~ msgstr "Vue d'ensemble" ++ ++# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # ++# applications/luci-fw/luasrc/model/cbi/luci_fw/miniportfw.lua # ++# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # ++# ++# msgid "Name" ++# msgstr "" ++# ++# msgid "(optional)" ++# msgstr "" ++# ++# msgid "Protocol" ++# msgstr "" ++# ++# msgid "External port" ++# msgstr "" ++# ++# msgid "Internal IP address" ++# msgstr "" ++# ++#~ msgid "Port forwarding" ++#~ msgstr "Redirection de port" ++ ++#~ msgid "" ++#~ "Port forwarding allows to provide network services in the internal " ++#~ "network to an external network." ++#~ msgstr "" ++#~ "La redirection de port vous permet d'exposer des services réseaux de " ++#~ "votre réseau local au réseau externe." ++ ++#~ msgid "Redirection type" ++#~ msgstr "Type de redirection" ++ ++#~ msgid "Redirections" ++#~ msgstr "Redirections" ++ ++#~ msgid "Rules" ++#~ msgstr "Règles" ++ ++# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # ++# applications/luci-fw/luasrc/model/cbi/luci_fw/redirect.lua # ++# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # ++# ++# msgid "Name" ++# msgstr "" ++# ++# msgid "Protocol" ++# msgstr "" ++# ++#~ msgid "Traffic Redirection" ++#~ msgstr "Redirection du trafic" ++ ++#~ msgid "" ++#~ "Traffic redirection allows you to change the destination address of " ++#~ "forwarded packets." ++#~ msgstr "" ++#~ "La redirection de trafic vous permet de changer l'adresse de destination " ++#~ "des paquets transférés." ++ ++#~ msgid "Network" ++#~ msgstr "Réseau" ++ ++# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # ++# applications/luci-fw/luasrc/model/cbi/luci_fw/traffic.lua # ++# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # ++# ++# msgid "Name" ++# msgstr "" ++# ++#~ msgid "Traffic Control" ++#~ msgstr "Contrôle de trafic" ++ ++#~ msgid "Zone-to-Zone traffic" ++#~ msgstr "Trafic zone-à-zone" ++ ++#~ msgid "" ++#~ "Here you can specify which network traffic is allowed to flow between " ++#~ "network zones. Only new connections will be matched. Packets belonging " ++#~ "to already open connections are automatically allowed to pass the " ++#~ "firewall. If you experience occasional connection problems try enabling " ++#~ "MSS Clamping otherwise disable it for performance reasons." ++#~ msgstr "" ++#~ "Ici, vous pouvez spécifier quel trafic réseau est autorisé à transiter " ++#~ "entre les zones réseau. Seules les nouvelles connexions seront prises en " ++#~ "compte. Les paquets appartenant à des connexions déjà ouvertes sont " ++#~ "automatiquement admis à passer le pare-feu. Si vous subissez des " ++#~ "problèmes de connexion occasionnels, essayer d'activer le MSS clamping; " ++#~ "sinon laissez-le désactivé pour des raisons de performance." ++ ++#~ msgid "Zone" ++#~ msgstr "Zone" ++ ++#~ msgid "Destination IP" ++#~ msgstr "IP de destination" ++ ++#~ msgid "IP address" ++#~ msgstr "Adresse IP" ++ ++#~ msgid "Source MAC-address" ++#~ msgstr "Adresse MAC source" +diff --git a/feeds/luci/applications/luci-app-firewall/po/he/firewall.po b/feeds/luci/applications/luci-app-firewall/po/he/firewall.po +new file mode 100644 +index 0000000..aec566a +--- /dev/null ++++ b/feeds/luci/applications/luci-app-firewall/po/he/firewall.po +@@ -0,0 +1,432 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Last-Translator: Automatically generated\n" ++"Language-Team: none\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n != 1);\n" ++ ++msgid "%s in %s" ++msgstr "" ++ ++msgid "%s%s with %s" ++msgstr "" ++ ++msgid "%s, %s in %s" ++msgstr "" ++ ++msgid "(Unnamed Entry)" ++msgstr "" ++ ++msgid "(Unnamed Rule)" ++msgstr "" ++ ++msgid "(Unnamed SNAT)" ++msgstr "" ++ ++msgid "-- Please choose --" ++msgstr "" ++ ++msgid "-- custom --" ++msgstr "" ++ ++msgid "%d pkts. per %s" ++msgstr "" ++ ++msgid "%d pkts. per %s, burst %d pkts." ++msgstr "" ++ ++msgid "%s and limit to %s" ++msgstr "" ++ ++msgid "Action" ++msgstr "" ++ ++msgid "Add" ++msgstr "" ++ ++msgid "Add and edit..." ++msgstr "" ++ ++msgid "Advanced Settings" ++msgstr "" ++ ++msgid "Allow forward from source zones:" ++msgstr "" ++ ++msgid "Allow forward to destination zones:" ++msgstr "" ++ ++msgid "Any" ++msgstr "" ++ ++msgid "Covered networks" ++msgstr "" ++ ++msgid "Custom Rules" ++msgstr "" ++ ++msgid "" ++"Custom rules allow you to execute arbritary iptables commands which are not " ++"otherwise covered by the firewall framework. The commands are executed after " ++"each firewall restart, right after the default ruleset has been loaded." ++msgstr "" ++ ++msgid "Destination IP address" ++msgstr "" ++ ++msgid "Destination address" ++msgstr "" ++ ++msgid "Destination port" ++msgstr "" ++ ++msgid "Destination zone" ++msgstr "" ++ ++msgid "Do not rewrite" ++msgstr "" ++ ++msgid "Drop invalid packets" ++msgstr "" ++ ++msgid "Enable" ++msgstr "" ++ ++msgid "Enable NAT Loopback" ++msgstr "" ++ ++msgid "Enable SYN-flood protection" ++msgstr "" ++ ++msgid "Enable logging on this zone" ++msgstr "" ++ ++msgid "External IP address" ++msgstr "" ++ ++msgid "External port" ++msgstr "" ++ ++msgid "External zone" ++msgstr "" ++ ++msgid "Extra arguments" ++msgstr "" ++ ++msgid "Firewall" ++msgstr "" ++ ++msgid "Firewall - Custom Rules" ++msgstr "" ++ ++msgid "Firewall - Port Forwards" ++msgstr "" ++ ++msgid "Firewall - Traffic Rules" ++msgstr "" ++ ++msgid "Firewall - Zone Settings" ++msgstr "" ++ ++msgid "Force connection tracking" ++msgstr "" ++ ++msgid "Forward" ++msgstr "" ++ ++msgid "Forward to" ++msgstr "" ++ ++msgid "From %s in %s" ++msgstr "" ++ ++msgid "From %s in %s with source %s" ++msgstr "" ++ ++msgid "From %s in %s with source %s and %s" ++msgstr "" ++ ++msgid "General Settings" ++msgstr "" ++ ++msgid "IPv4" ++msgstr "" ++ ++msgid "IPv4 and IPv6" ++msgstr "" ++ ++msgid "IPv4 only" ++msgstr "" ++ ++msgid "IPv6" ++msgstr "" ++ ++msgid "IPv6 only" ++msgstr "" ++ ++msgid "Input" ++msgstr "" ++ ++msgid "Inter-Zone Forwarding" ++msgstr "" ++ ++msgid "Internal IP address" ++msgstr "" ++ ++msgid "Internal port" ++msgstr "" ++ ++msgid "Internal zone" ++msgstr "" ++ ++msgid "Limit log messages" ++msgstr "" ++ ++msgid "MSS clamping" ++msgstr "" ++ ++msgid "Masquerading" ++msgstr "" ++ ++msgid "Match" ++msgstr "" ++ ++msgid "Match ICMP type" ++msgstr "" ++ ++msgid "Match forwarded traffic to the given destination port or port range." ++msgstr "" ++ ++msgid "" ++"Match incoming traffic directed at the given destination port or port range " ++"on this host" ++msgstr "" ++ ++msgid "" ++"Match incoming traffic originating from the given source port or port range " ++"on the client host." ++msgstr "" ++ ++msgid "Name" ++msgstr "" ++ ++msgid "New SNAT rule" ++msgstr "" ++ ++msgid "New forward rule" ++msgstr "" ++ ++msgid "New input rule" ++msgstr "" ++ ++msgid "New port forward" ++msgstr "" ++ ++msgid "New source NAT" ++msgstr "" ++ ++msgid "Only match incoming traffic directed at the given IP address." ++msgstr "" ++ ++msgid "Only match incoming traffic from these MACs." ++msgstr "" ++ ++msgid "Only match incoming traffic from this IP or range." ++msgstr "" ++ ++msgid "" ++"Only match incoming traffic originating from the given source port or port " ++"range on the client host" ++msgstr "" ++ ++msgid "Open ports on router" ++msgstr "" ++ ++msgid "Other..." ++msgstr "" ++ ++msgid "Output" ++msgstr "" ++ ++msgid "Passes additional arguments to iptables. Use with care!" ++msgstr "" ++ ++msgid "Port Forwards" ++msgstr "" ++ ++msgid "" ++"Port forwarding allows remote computers on the Internet to connect to a " ++"specific computer or service within the private LAN." ++msgstr "" ++ ++msgid "Protocol" ++msgstr "" ++ ++msgid "" ++"Redirect matched incoming traffic to the given port on the internal host" ++msgstr "" ++ ++msgid "Redirect matched incoming traffic to the specified internal host" ++msgstr "" ++ ++msgid "Restrict Masquerading to given destination subnets" ++msgstr "" ++ ++msgid "Restrict Masquerading to given source subnets" ++msgstr "" ++ ++msgid "Restrict to address family" ++msgstr "" ++ ++msgid "Rewrite matched traffic to the given address." ++msgstr "" ++ ++msgid "" ++"Rewrite matched traffic to the given source port. May be left empty to only " ++"rewrite the IP address." ++msgstr "" ++ ++msgid "Rewrite to source %s" ++msgstr "" ++ ++msgid "Rewrite to source %s, %s" ++msgstr "" ++ ++msgid "SNAT IP address" ++msgstr "" ++ ++msgid "SNAT port" ++msgstr "" ++ ++msgid "Source IP address" ++msgstr "" ++ ++msgid "Source MAC address" ++msgstr "" ++ ++msgid "Source NAT" ++msgstr "" ++ ++msgid "" ++"Source NAT is a specific form of masquerading which allows fine grained " ++"control over the source IP used for outgoing traffic, for example to map " ++"multiple WAN addresses to internal subnets." ++msgstr "" ++ ++msgid "Source address" ++msgstr "" ++ ++msgid "Source port" ++msgstr "" ++ ++msgid "Source zone" ++msgstr "" ++ ++msgid "" ++"The firewall creates zones over your network interfaces to control network " ++"traffic flow." ++msgstr "" ++ ++msgid "" ++"The options below control the forwarding policies between this zone (%s) and " ++"other zones. Destination zones cover forwarded traffic " ++"originating from %q. Source zones match forwarded " ++"traffic from other zones targeted at %q. The forwarding " ++"rule is unidirectional, e.g. a forward from lan to wan does " ++"not imply a permission to forward from wan to lan as well." ++msgstr "" ++ ++msgid "" ++"This page allows you to change advanced properties of the port forwarding " ++"entry. In most cases there is no need to modify those settings." ++msgstr "" ++ ++msgid "" ++"This page allows you to change advanced properties of the traffic rule " ++"entry, such as matched source and destination hosts." ++msgstr "" ++ ++msgid "" ++"This section defines common properties of %q. The input and " ++"output options set the default policies for traffic entering and " ++"leaving this zone while the forward option describes the policy for " ++"forwarded traffic between different networks within the zone. Covered " ++"networks specifies which available networks are members of this zone." ++msgstr "" ++ ++msgid "To %s at %s on this device" ++msgstr "" ++ ++msgid "To %s in %s" ++msgstr "" ++ ++msgid "To %s on this device" ++msgstr "" ++ ++msgid "To %s, %s in %s" ++msgstr "" ++ ++msgid "To source IP" ++msgstr "" ++ ++msgid "To source port" ++msgstr "" ++ ++msgid "Traffic Rules" ++msgstr "" ++ ++msgid "" ++"Traffic rules define policies for packets traveling between different zones, " ++"for example to reject traffic between certain hosts or to open WAN ports on " ++"the router." ++msgstr "" ++ ++msgid "Via %s" ++msgstr "" ++ ++msgid "Via %s at %s" ++msgstr "" ++ ++msgid "" ++"You may specify multiple by selecting \"-- custom --\" and then entering " ++"protocols separated by space." ++msgstr "" ++ ++msgid "Zone %q" ++msgstr "" ++ ++msgid "Zone ⇒ Forwardings" ++msgstr "" ++ ++msgid "Zones" ++msgstr "" ++ ++msgid "accept" ++msgstr "" ++ ++msgid "any" ++msgstr "" ++ ++msgid "any host" ++msgstr "" ++ ++msgid "any router IP" ++msgstr "" ++ ++msgid "any zone" ++msgstr "" ++ ++msgid "don't track" ++msgstr "" ++ ++msgid "drop" ++msgstr "" ++ ++msgid "reject" ++msgstr "" ++ ++msgid "traffic" ++msgstr "" +diff --git a/feeds/luci/applications/luci-app-firewall/po/hu/firewall.po b/feeds/luci/applications/luci-app-firewall/po/hu/firewall.po +new file mode 100644 +index 0000000..1c0ec5e +--- /dev/null ++++ b/feeds/luci/applications/luci-app-firewall/po/hu/firewall.po +@@ -0,0 +1,580 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"PO-Revision-Date: 2014-01-31 16:54+0200\n" ++"Last-Translator: Gabor \n" ++"Language-Team: none\n" ++"Language: hu\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n != 1);\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "%s in %s" ++msgstr "%s %s-ban" ++ ++msgid "%s%s with %s" ++msgstr "%s%s %s-el" ++ ++msgid "%s, %s in %s" ++msgstr "%s, %s %s-ben" ++ ++msgid "(Unnamed Entry)" ++msgstr "(Névtelen bejegyzés)" ++ ++msgid "(Unnamed Rule)" ++msgstr "(Névtelen szabály)" ++ ++msgid "(Unnamed SNAT)" ++msgstr "(Névtelen SNAT)" ++ ++msgid "-- Please choose --" ++msgstr "-- Kérem válasszon --" ++ ++msgid "-- custom --" ++msgstr "-- egyéni --" ++ ++msgid "%d pkts. per %s" ++msgstr "%d csomag/%s" ++ ++msgid "%d pkts. per %s, burst %d pkts." ++msgstr "%d csom. %s-enként, burst %d csom." ++ ++msgid "%s and limit to %s" ++msgstr "%s és korlátozás %s-re" ++ ++msgid "Action" ++msgstr "Művelet" ++ ++msgid "Add" ++msgstr "Hozzáadás" ++ ++msgid "Add and edit..." ++msgstr "Hozzáadás és szerkesztés..." ++ ++msgid "Advanced Settings" ++msgstr "Haladó beállítások" ++ ++msgid "Allow forward from source zones:" ++msgstr "Továbbítás engedélyezése ezekbÅ‘l a forrás zónákból:" ++ ++msgid "Allow forward to destination zones:" ++msgstr "Továbbítás engedélyezése ezekbe a cél zónákba:" ++ ++msgid "Any" ++msgstr "Bármelyik" ++ ++msgid "Covered networks" ++msgstr "Lefedett hálózatok" ++ ++msgid "Custom Rules" ++msgstr "Egyéni szabályok" ++ ++msgid "" ++"Custom rules allow you to execute arbritary iptables commands which are not " ++"otherwise covered by the firewall framework. The commands are executed after " ++"each firewall restart, right after the default ruleset has been loaded." ++msgstr "" ++"Az egyedi szabályok lehetÅ‘vé teszik tetszÅ‘leges iptables parancsok " ++"futtatását melyekre a tűzfal keretrendszer egyébként nem biztosít " ++"lehetÅ‘séget. A parancsok a tűzfal minden újraindításakor futtatásra " ++"kerülnek, közvetlenül az alapértelmezett szabálykészletek betöltése után." ++ ++msgid "Destination IP address" ++msgstr "Cél IP-cím" ++ ++msgid "Destination address" ++msgstr "Cél cím" ++ ++msgid "Destination port" ++msgstr "Cél port" ++ ++msgid "Destination zone" ++msgstr "Cél zóna" ++ ++msgid "Do not rewrite" ++msgstr "Ne írja felül" ++ ++msgid "Drop invalid packets" ++msgstr "Érvénytelen csomagok eldobása" ++ ++msgid "Enable" ++msgstr "Engedélyezés" ++ ++msgid "Enable NAT Loopback" ++msgstr "NAT visszacsatolás engedélyezése" ++ ++msgid "Enable SYN-flood protection" ++msgstr "SYN-flood védelem engedélyezése" ++ ++msgid "Enable logging on this zone" ++msgstr "Naplózás engeélyezése ezen a zónán" ++ ++msgid "External IP address" ++msgstr "KülsÅ‘ IP cím" ++ ++msgid "External port" ++msgstr "KülsÅ‘ port" ++ ++msgid "External zone" ++msgstr "KülsÅ‘ zóna" ++ ++msgid "Extra arguments" ++msgstr "További argumentumok" ++ ++msgid "Firewall" ++msgstr "Tűzfal" ++ ++msgid "Firewall - Custom Rules" ++msgstr "Tűzfal - Egyéni szabályok" ++ ++msgid "Firewall - Port Forwards" ++msgstr "Tűzfal - Port továbbítások" ++ ++msgid "Firewall - Traffic Rules" ++msgstr "Tűzfal - Forgalmi szabályok" ++ ++msgid "Firewall - Zone Settings" ++msgstr "Tűzfal - Zóna beállítások" ++ ++msgid "Force connection tracking" ++msgstr "Kapcsolat követés kényszerítése" ++ ++msgid "Forward" ++msgstr "Továbbítás" ++ ++msgid "Forward to" ++msgstr "Továbbítás ennek" ++ ++msgid "From %s in %s" ++msgstr "%s felÅ‘l %s-ben" ++ ++msgid "From %s in %s with source %s" ++msgstr "%s felÅ‘l %s-ben %s forrással" ++ ++msgid "From %s in %s with source %s and %s" ++msgstr "%s felÅ‘l %s-ben %s és %s forrással" ++ ++msgid "General Settings" ++msgstr "Ãltalános beállítások" ++ ++msgid "IPv4" ++msgstr "IPv4" ++ ++msgid "IPv4 and IPv6" ++msgstr "IPv4 és IPv6" ++ ++msgid "IPv4 only" ++msgstr "csak IPv4" ++ ++msgid "IPv6" ++msgstr "IPv6" ++ ++msgid "IPv6 only" ++msgstr "csak IPv6" ++ ++msgid "Input" ++msgstr "Bemenet" ++ ++msgid "Inter-Zone Forwarding" ++msgstr "Zónák-közötti továbbítás" ++ ++msgid "Internal IP address" ++msgstr "BelsÅ‘ IP cím" ++ ++msgid "Internal port" ++msgstr "BelsÅ‘ port" ++ ++msgid "Internal zone" ++msgstr "BelsÅ‘ zóna" ++ ++msgid "Limit log messages" ++msgstr "Napló üzenetek korlátozása" ++ ++msgid "MSS clamping" ++msgstr "MSS clamping engegélyezése" ++ ++msgid "Masquerading" ++msgstr "Ãlcázás" ++ ++msgid "Match" ++msgstr "Szűrés" ++ ++msgid "Match ICMP type" ++msgstr "Szűrés ICMP típus alapján" ++ ++msgid "Match forwarded traffic to the given destination port or port range." ++msgstr "" ++"Továbbított forgalom szűrése a megadott cél port, vagy port tartomány " ++"szerint." ++ ++msgid "" ++"Match incoming traffic directed at the given destination port or port range " ++"on this host" ++msgstr "" ++"Adott portra vagy port tartományra irányított bejövÅ‘ forgalom szűrése ezen a " ++"gépen" ++ ++msgid "" ++"Match incoming traffic originating from the given source port or port range " ++"on the client host." ++msgstr "" ++"Az ügyfél gép megadott portjáról, vagy port tartományából indított forgalom " ++"szűrése. " ++ ++msgid "Name" ++msgstr "Név" ++ ++msgid "New SNAT rule" ++msgstr "Új SNAT szabály" ++ ++msgid "New forward rule" ++msgstr "Új továbbítási szabály" ++ ++msgid "New input rule" ++msgstr "Új bemeneti szabály" ++ ++msgid "New port forward" ++msgstr "Új port továbbítás" ++ ++msgid "New source NAT" ++msgstr "Új forrás NAT" ++ ++msgid "Only match incoming traffic directed at the given IP address." ++msgstr "Csak a megadott IP címre irányított bejövÅ‘ forgalmat egyeztesse." ++ ++msgid "Only match incoming traffic from these MACs." ++msgstr "Csak a megadott MAC címekrÅ‘l érkezÅ‘ bejövÅ‘ forgalmat egyeztesse." ++ ++msgid "Only match incoming traffic from this IP or range." ++msgstr "" ++"Csak a megadott IP címrÅ‘l illetve IP címtartományból érkezÅ‘ bejövÅ‘ forgalmat " ++"egyeztesse." ++ ++msgid "" ++"Only match incoming traffic originating from the given source port or port " ++"range on the client host" ++msgstr "" ++"Csak az ügyfél gép megadott forrás portjáról illetve forrás port " ++"tartományába tartozó portról indított bejövÅ‘ forgalmat egyeztesse." ++ ++msgid "Open ports on router" ++msgstr "Port megnyitása a routeren" ++ ++msgid "Other..." ++msgstr "Egyéb..." ++ ++msgid "Output" ++msgstr "Kimenet" ++ ++msgid "Passes additional arguments to iptables. Use with care!" ++msgstr "" ++"További argumentumok küldése az iptables részére. Használja körültekintÅ‘en!" ++ ++msgid "Port Forwards" ++msgstr "Port továbbítás" ++ ++msgid "" ++"Port forwarding allows remote computers on the Internet to connect to a " ++"specific computer or service within the private LAN." ++msgstr "" ++"A port továbbítás lehetÅ‘vé teszi az interneten lévÅ‘ távoli számítógépeknek a " ++"privát helyi hálózat bizonyos számítógépéhez vagy szolgáltatásához történÅ‘ " ++"csatlakozását." ++ ++msgid "Protocol" ++msgstr "Protokoll" ++ ++msgid "" ++"Redirect matched incoming traffic to the given port on the internal host" ++msgstr "Ãtirányítja az egyezÅ‘ bejövÅ‘ forgalmat a belsÅ‘ gép megadott portjához" ++ ++msgid "Redirect matched incoming traffic to the specified internal host" ++msgstr "Ãtirányítja az egyezÅ‘ bejövÅ‘ forgalmat a megadott belsÅ‘ géphez" ++ ++msgid "Restrict Masquerading to given destination subnets" ++msgstr "Ãlcázás korlátozása a megadott cél alhálózatokra" ++ ++msgid "Restrict Masquerading to given source subnets" ++msgstr "Ãlcázás korlátozása a megadott forrás alhálózatokra" ++ ++msgid "Restrict to address family" ++msgstr "Korlátozás cím családra" ++ ++msgid "Rewrite matched traffic to the given address." ++msgstr "Az összeíllÅ‘ forgalom átírása a megadott címre." ++ ++msgid "" ++"Rewrite matched traffic to the given source port. May be left empty to only " ++"rewrite the IP address." ++msgstr "" ++"Az összeillÅ‘ forgalom átírása a megadott forrás portra. Amennyibe üresen van " ++"hagyva, csak az IP cím kerül átírásra." ++ ++msgid "Rewrite to source %s" ++msgstr "Ãtírás %s forrásra" ++ ++msgid "Rewrite to source %s, %s" ++msgstr "Ãtírás %s, %s forrásra" ++ ++msgid "SNAT IP address" ++msgstr "SNAT IP cím" ++ ++msgid "SNAT port" ++msgstr "SNAT port" ++ ++msgid "Source IP address" ++msgstr "Forrás IP cím" ++ ++msgid "Source MAC address" ++msgstr "Forrás MAC cím" ++ ++msgid "Source NAT" ++msgstr "Forrás NAT" ++ ++msgid "" ++"Source NAT is a specific form of masquerading which allows fine grained " ++"control over the source IP used for outgoing traffic, for example to map " ++"multiple WAN addresses to internal subnets." ++msgstr "" ++"A forrás NAT az álcázás olyan speciális formája, mely lehetÅ‘vé teszi a " ++"kimenÅ‘ forgalomhoz használt forrás IP címek aprólékos szabályozását, például " ++"több WAN cím hozzárendelését a belsÅ‘ alhálózatokhoz." ++ ++msgid "Source address" ++msgstr "Forrás cím" ++ ++msgid "Source port" ++msgstr "Forrás port" ++ ++msgid "Source zone" ++msgstr "Forrás zóna" ++ ++msgid "" ++"The firewall creates zones over your network interfaces to control network " ++"traffic flow." ++msgstr "" ++"A tűzfal zónákat határoz meg a hálózati interfészek fölött a hálózati " ++"forgalom áramlásának szabályozására." ++ ++msgid "" ++"The options below control the forwarding policies between this zone (%s) and " ++"other zones. Destination zones cover forwarded traffic " ++"originating from %q. Source zones match forwarded " ++"traffic from other zones targeted at %q. The forwarding " ++"rule is unidirectional, e.g. a forward from lan to wan does " ++"not imply a permission to forward from wan to lan as well." ++msgstr "" ++"Az alábbi beállítások vezérlik a továbbítási irányelveket a jelenlegi zóna " ++"(%s) és a többi zóna között. A cél zónák fedik le a továbbított " ++"forgalmat amelynek forrása %q. A forrás zónák " ++"szűrik a továbbított forgalmat más zónákból melynek célja %q. A továbbítási szabály egyirányú, tehát pl. egy továbbítás " ++"LAN-ból WAN-ba nem jelenti azt, hogy a továbbítás WAN-ból LAN-ba is " ++"engedélyezett." ++ ++msgid "" ++"This page allows you to change advanced properties of the port forwarding " ++"entry. In most cases there is no need to modify those settings." ++msgstr "" ++"Ez a lap lehetÅ‘vé teszi a port továbbítási bejegyzések speciális " ++"tulajdonságainak módosítását. A legtöbb esetben ezeknek a beállításoknak a " ++"módosítása nem szükséges." ++ ++msgid "" ++"This page allows you to change advanced properties of the traffic rule " ++"entry, such as matched source and destination hosts." ++msgstr "" ++"Ez a lap lehetÅ‘vé teszi a forgalmi szabály bejegyzés speciális " ++"tulajdonságainak módosítását, mint a forrás- és célgépek megfeleltetése." ++ ++#, fuzzy ++msgid "" ++"This section defines common properties of %q. The input and " ++"output options set the default policies for traffic entering and " ++"leaving this zone while the forward option describes the policy for " ++"forwarded traffic between different networks within the zone. Covered " ++"networks specifies which available networks are members of this zone." ++msgstr "" ++"Ez a rész a(z) %q általános beállításait határozza meg. A bejövÅ‘ és " ++"kimenÅ‘ beállítások határozzák meg a zónába be- és kilépÅ‘ forgalom " ++"alapértelmezett szabályait, míg a továbbítási beállítás a különbözÅ‘ " ++"hálózatok közötti forgalomtovábbítás szabályát írja le a zónán belül. A " ++"lefedett hálózatok adják meg, hogy mely elérhetÅ‘ hálózatok tagjai " ++"ennek a zónának." ++ ++msgid "To %s at %s on this device" ++msgstr "%s-re %s-nél a eszközön" ++ ++msgid "To %s in %s" ++msgstr "%s-re %s-ben" ++ ++msgid "To %s on this device" ++msgstr "%s-re a eszközön" ++ ++msgid "To %s, %s in %s" ++msgstr "%s-re, %s %s-ben" ++ ++msgid "To source IP" ++msgstr "Forrás IP-re" ++ ++msgid "To source port" ++msgstr "Forrás portra" ++ ++msgid "Traffic Rules" ++msgstr "Forgalmi szabályok" ++ ++msgid "" ++"Traffic rules define policies for packets traveling between different zones, " ++"for example to reject traffic between certain hosts or to open WAN ports on " ++"the router." ++msgstr "" ++"A forgalmi szabályok a különbözÅ‘ zónák között utazó csomagokra vonatkozó " ++"házirendet határozzák meg, például bizonyos gépek közötti forgalom " ++"megakadályozához vagy WAN portok megnyitásához a routeren." ++ ++msgid "Via %s" ++msgstr "%s-en át" ++ ++msgid "Via %s at %s" ++msgstr "%s-en át %s-nél" ++ ++msgid "" ++"You may specify multiple by selecting \"-- custom --\" and then entering " ++"protocols separated by space." ++msgstr "" ++"Az \"-- egyéni --\" lehetÅ‘ség választásával több protokoll megadása " ++"lehetséges egymástól szóközzell elválasztva." ++ ++msgid "Zone %q" ++msgstr "Zóna %q" ++ ++msgid "Zone ⇒ Forwardings" ++msgstr "Zóna ⇒ Továbbítások" ++ ++msgid "Zones" ++msgstr "Zónák" ++ ++msgid "accept" ++msgstr "elfogadás" ++ ++msgid "any" ++msgstr "bármelyik" ++ ++msgid "any host" ++msgstr "bármelyik gép" ++ ++msgid "any router IP" ++msgstr "bármelyik router IP" ++ ++msgid "any zone" ++msgstr "bármelyik zóna" ++ ++msgid "don't track" ++msgstr "ne kövesse" ++ ++msgid "drop" ++msgstr "eldobás" ++ ++msgid "reject" ++msgstr "visszautasítás" ++ ++msgid "traffic" ++msgstr "" ++ ++#~ msgid "Destination" ++#~ msgstr "Cél" ++ ++#~ msgid "Family" ++#~ msgstr "Család" ++ ++#~ msgid "Forward to %s in %s" ++#~ msgstr "Továbbítás ide:%s/%s" ++ ++#~ msgid "Forward to %s, %s in %s" ++#~ msgstr "Továbbítás ide: %s, %s/%s" ++ ++#~ msgid "SNAT" ++#~ msgstr "SNAT" ++ ++#~ msgid "Source" ++#~ msgstr "Forrás" ++ ++#~ msgid "Via" ++#~ msgstr "Keresztül" ++ ++#~ msgid "Accept forward" ++#~ msgstr "Továbbítás engedélyezése" ++ ++#~ msgid "Accept input" ++#~ msgstr "Bemenet engedélyezése" ++ ++#~ msgid "Disable" ++#~ msgstr "Letiltás" ++ ++#~ msgid "Discard forward" ++#~ msgstr "Kimenet eldobása" ++ ++#~ msgid "Discard input" ++#~ msgstr "Bemenet eldobása" ++ ++#~ msgid "Do not track forward" ++#~ msgstr "Ne kövesse a továbbítást" ++ ++#~ msgid "Do not track input" ++#~ msgstr "Ne kövesse a bemenetet" ++ ++#~ msgid "IP" ++#~ msgstr "IP" ++ ++#~ msgid "IP range" ++#~ msgstr "IP tartomány" ++ ++#~ msgid "IPs" ++#~ msgstr "IP-k" ++ ++#~ msgid "MAC" ++#~ msgstr "MAC cím" ++ ++#~ msgid "MACs" ++#~ msgstr "MAC címek" ++ ++#~ msgid "Refuse forward" ++#~ msgstr "Továbbítás megtagadása" ++ ++#~ msgid "Refuse input" ++#~ msgstr "Bemenet megtagadása" ++ ++#~ msgid "Rule is disabled" ++#~ msgstr "Szabály letiltva" ++ ++#~ msgid "Rule is enabled" ++#~ msgstr "Szabály engedélyezve" ++ ++#~ msgid "day" ++#~ msgstr "nap" ++ ++#~ msgid "hour" ++#~ msgstr "óra" ++ ++#~ msgid "minute" ++#~ msgstr "perc" ++ ++#~ msgid "not" ++#~ msgstr "nem" ++ ++#~ msgid "port" ++#~ msgstr "port" ++ ++#~ msgid "ports" ++#~ msgstr "portok" ++ ++#~ msgid "second" ++#~ msgstr "másodperc" ++ ++#~ msgid "type" ++#~ msgstr "típus" ++ ++#~ msgid "types" ++#~ msgstr "típusok" +diff --git a/feeds/luci/applications/luci-app-firewall/po/it/firewall.po b/feeds/luci/applications/luci-app-firewall/po/it/firewall.po +new file mode 100644 +index 0000000..2f87efc +--- /dev/null ++++ b/feeds/luci/applications/luci-app-firewall/po/it/firewall.po +@@ -0,0 +1,502 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Report-Msgid-Bugs-To: \n" ++"POT-Creation-Date: 2010-03-30 17:00+0200\n" ++"PO-Revision-Date: 2012-04-19 23:05+0200\n" ++"Last-Translator: claudyus \n" ++"Language-Team: LANGUAGE \n" ++"Language: it\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n != 1);\n" ++"X-Generator: Pootle 2.0.4\n" ++ ++msgid "%s in %s" ++msgstr "" ++ ++msgid "%s%s with %s" ++msgstr "%s%s con %s" ++ ++msgid "%s, %s in %s" ++msgstr "" ++ ++msgid "(Unnamed Entry)" ++msgstr "" ++ ++msgid "(Unnamed Rule)" ++msgstr "" ++ ++msgid "(Unnamed SNAT)" ++msgstr "" ++ ++msgid "-- Please choose --" ++msgstr " -- Selezionare --" ++ ++msgid "-- custom --" ++msgstr " -- personalizzata --" ++ ++msgid "%d pkts. per %s" ++msgstr "" ++ ++msgid "%d pkts. per %s, burst %d pkts." ++msgstr "" ++ ++msgid "%s and limit to %s" ++msgstr "%s e limita a %s" ++ ++msgid "Action" ++msgstr "Azione" ++ ++msgid "Add" ++msgstr "Aggiungi" ++ ++msgid "Add and edit..." ++msgstr "Aggiungi e edita..." ++ ++msgid "Advanced Settings" ++msgstr "Opzioni Avanzate" ++ ++msgid "Allow forward from source zones:" ++msgstr "Permetti routing da zone di origini:" ++ ++msgid "Allow forward to destination zones:" ++msgstr "Permetti rountin a zone di destinazione:" ++ ++msgid "Any" ++msgstr "Qualsiasi" ++ ++msgid "Covered networks" ++msgstr "" ++ ++msgid "Custom Rules" ++msgstr "Regole Personalizzate" ++ ++msgid "" ++"Custom rules allow you to execute arbritary iptables commands which are not " ++"otherwise covered by the firewall framework. The commands are executed after " ++"each firewall restart, right after the default ruleset has been loaded." ++msgstr "" ++"Le regole personalizzate ti permettorno di eseguire comandi iptables " ++"arbitrari che non solo altrimenti coperti dall'applicazione firewall. I " ++"comandi sono eseguiti dopo ogni riavvio del firewall, giusto dopo le altre " ++"regole che son state caricate." ++ ++msgid "Destination IP address" ++msgstr "Indirizzo IP destinazione" ++ ++msgid "Destination address" ++msgstr "Indirizzo di destinazione" ++ ++msgid "Destination port" ++msgstr "Porta di destinazione" ++ ++msgid "Destination zone" ++msgstr "Zona di destinazione" ++ ++msgid "Do not rewrite" ++msgstr "" ++ ++msgid "Drop invalid packets" ++msgstr "" ++ ++msgid "Enable" ++msgstr "" ++ ++msgid "Enable NAT Loopback" ++msgstr "" ++ ++msgid "Enable SYN-flood protection" ++msgstr "" ++ ++msgid "Enable logging on this zone" ++msgstr "" ++ ++msgid "External IP address" ++msgstr "" ++ ++msgid "External port" ++msgstr "Porta Esterna" ++ ++msgid "External zone" ++msgstr "" ++ ++msgid "Extra arguments" ++msgstr "" ++ ++msgid "Firewall" ++msgstr "Firewall" ++ ++msgid "Firewall - Custom Rules" ++msgstr "" ++ ++msgid "Firewall - Port Forwards" ++msgstr "" ++ ++msgid "Firewall - Traffic Rules" ++msgstr "" ++ ++msgid "Firewall - Zone Settings" ++msgstr "Firewall - Opzioni delle Zone" ++ ++msgid "Force connection tracking" ++msgstr "" ++ ++msgid "Forward" ++msgstr "" ++ ++msgid "Forward to" ++msgstr "" ++ ++msgid "From %s in %s" ++msgstr "" ++ ++msgid "From %s in %s with source %s" ++msgstr "" ++ ++msgid "From %s in %s with source %s and %s" ++msgstr "" ++ ++msgid "General Settings" ++msgstr "Opzioni Generali" ++ ++msgid "IPv4" ++msgstr "" ++ ++msgid "IPv4 and IPv6" ++msgstr "IPv4 e IPv6" ++ ++msgid "IPv4 only" ++msgstr "Solo IPv4" ++ ++msgid "IPv6" ++msgstr "" ++ ++msgid "IPv6 only" ++msgstr "Solo IPv6" ++ ++msgid "Input" ++msgstr "" ++ ++msgid "Inter-Zone Forwarding" ++msgstr "" ++ ++msgid "Internal IP address" ++msgstr "Indirizzo IP Interno" ++ ++msgid "Internal port" ++msgstr "Porta interna" ++ ++msgid "Internal zone" ++msgstr "" ++ ++msgid "Limit log messages" ++msgstr "" ++ ++msgid "MSS clamping" ++msgstr "" ++ ++msgid "Masquerading" ++msgstr "" ++ ++msgid "Match" ++msgstr "" ++ ++msgid "Match ICMP type" ++msgstr "" ++ ++msgid "Match forwarded traffic to the given destination port or port range." ++msgstr "" ++ ++msgid "" ++"Match incoming traffic directed at the given destination port or port range " ++"on this host" ++msgstr "" ++ ++msgid "" ++"Match incoming traffic originating from the given source port or port range " ++"on the client host." ++msgstr "" ++ ++msgid "Name" ++msgstr "Nome" ++ ++msgid "New SNAT rule" ++msgstr "" ++ ++msgid "New forward rule" ++msgstr "" ++ ++msgid "New input rule" ++msgstr "" ++ ++msgid "New port forward" ++msgstr "" ++ ++msgid "New source NAT" ++msgstr "" ++ ++msgid "Only match incoming traffic directed at the given IP address." ++msgstr "" ++ ++msgid "Only match incoming traffic from these MACs." ++msgstr "" ++ ++msgid "Only match incoming traffic from this IP or range." ++msgstr "" ++ ++msgid "" ++"Only match incoming traffic originating from the given source port or port " ++"range on the client host" ++msgstr "" ++ ++msgid "Open ports on router" ++msgstr "" ++ ++msgid "Other..." ++msgstr "" ++ ++msgid "Output" ++msgstr "" ++ ++msgid "Passes additional arguments to iptables. Use with care!" ++msgstr "" ++ ++msgid "Port Forwards" ++msgstr "" ++ ++msgid "" ++"Port forwarding allows remote computers on the Internet to connect to a " ++"specific computer or service within the private LAN." ++msgstr "" ++ ++msgid "Protocol" ++msgstr "Protocollo" ++ ++msgid "" ++"Redirect matched incoming traffic to the given port on the internal host" ++msgstr "" ++ ++msgid "Redirect matched incoming traffic to the specified internal host" ++msgstr "" ++ ++msgid "Restrict Masquerading to given destination subnets" ++msgstr "" ++ ++msgid "Restrict Masquerading to given source subnets" ++msgstr "" ++ ++msgid "Restrict to address family" ++msgstr "" ++ ++msgid "Rewrite matched traffic to the given address." ++msgstr "" ++ ++msgid "" ++"Rewrite matched traffic to the given source port. May be left empty to only " ++"rewrite the IP address." ++msgstr "" ++ ++msgid "Rewrite to source %s" ++msgstr "" ++ ++msgid "Rewrite to source %s, %s" ++msgstr "" ++ ++msgid "SNAT IP address" ++msgstr "" ++ ++msgid "SNAT port" ++msgstr "" ++ ++# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # ++# Generated from applications/luci-fw/luasrc/model/cbi/luci_fw/rrule.lua # ++# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # ++# msgid "Traffic Redirection" ++# msgstr "" ++# msgid "" ++# "Traffic redirection allows you to change the destination address of " ++# "forwarded packets." ++# msgstr "" ++# msgid "Overview" ++# msgstr "" ++# msgid "Name" ++# msgstr "" ++# msgid "Source zone" ++# msgstr "" ++# msgid "Source MAC-address" ++# msgstr "" ++# msgid "Source port" ++# msgstr "" ++# msgid "Protocol" ++# msgstr "" ++msgid "Source IP address" ++msgstr "Indirizzo IP di origine" ++ ++msgid "Source MAC address" ++msgstr "Indirizzo MAC di origine" ++ ++msgid "Source NAT" ++msgstr "" ++ ++msgid "" ++"Source NAT is a specific form of masquerading which allows fine grained " ++"control over the source IP used for outgoing traffic, for example to map " ++"multiple WAN addresses to internal subnets." ++msgstr "" ++ ++msgid "Source address" ++msgstr "Indirizzo di origine" ++ ++msgid "Source port" ++msgstr "Porta di origine" ++ ++msgid "Source zone" ++msgstr "Zona di origine" ++ ++msgid "" ++"The firewall creates zones over your network interfaces to control network " ++"traffic flow." ++msgstr "" ++ ++msgid "" ++"The options below control the forwarding policies between this zone (%s) and " ++"other zones. Destination zones cover forwarded traffic " ++"originating from %q. Source zones match forwarded " ++"traffic from other zones targeted at %q. The forwarding " ++"rule is unidirectional, e.g. a forward from lan to wan does " ++"not imply a permission to forward from wan to lan as well." ++msgstr "" ++ ++msgid "" ++"This page allows you to change advanced properties of the port forwarding " ++"entry. In most cases there is no need to modify those settings." ++msgstr "" ++ ++msgid "" ++"This page allows you to change advanced properties of the traffic rule " ++"entry, such as matched source and destination hosts." ++msgstr "" ++ ++msgid "" ++"This section defines common properties of %q. The input and " ++"output options set the default policies for traffic entering and " ++"leaving this zone while the forward option describes the policy for " ++"forwarded traffic between different networks within the zone. Covered " ++"networks specifies which available networks are members of this zone." ++msgstr "" ++ ++msgid "To %s at %s on this device" ++msgstr "" ++ ++msgid "To %s in %s" ++msgstr "" ++ ++msgid "To %s on this device" ++msgstr "" ++ ++msgid "To %s, %s in %s" ++msgstr "" ++ ++msgid "To source IP" ++msgstr "" ++ ++msgid "To source port" ++msgstr "" ++ ++msgid "Traffic Rules" ++msgstr "" ++ ++msgid "" ++"Traffic rules define policies for packets traveling between different zones, " ++"for example to reject traffic between certain hosts or to open WAN ports on " ++"the router." ++msgstr "" ++ ++msgid "Via %s" ++msgstr "" ++ ++msgid "Via %s at %s" ++msgstr "" ++ ++msgid "" ++"You may specify multiple by selecting \"-- custom --\" and then entering " ++"protocols separated by space." ++msgstr "" ++ ++msgid "Zone %q" ++msgstr "" ++ ++msgid "Zone ⇒ Forwardings" ++msgstr "" ++ ++msgid "Zones" ++msgstr "" ++ ++msgid "accept" ++msgstr "accetta" ++ ++msgid "any" ++msgstr "qualsiasi" ++ ++msgid "any host" ++msgstr "" ++ ++msgid "any router IP" ++msgstr "" ++ ++msgid "any zone" ++msgstr "" ++ ++msgid "don't track" ++msgstr "" ++ ++msgid "drop" ++msgstr "" ++ ++msgid "reject" ++msgstr "rifiuta" ++ ++msgid "traffic" ++msgstr "" ++ ++#~ msgid "Destination" ++#~ msgstr "Destinazione" ++ ++#~ msgid "Source" ++#~ msgstr "Origine" ++ ++#~ msgid "Accept input" ++#~ msgstr "Accetta INPUT" ++ ++#~ msgid "(optional)" ++#~ msgstr "(facoltativo)" ++ ++#~ msgid "Internal port (optional)" ++#~ msgstr "Porta interna (opzionale)" ++ ++#~ msgid "Advanced Options" ++#~ msgstr "Opzioni Avanzate" ++ ++#~ msgid "Advanced Rules" ++#~ msgstr "Regole Avanzate" ++ ++#~ msgid "" ++#~ "Advanced rules let you customize the firewall to your needs. Only new " ++#~ "connections will be matched. Packets belonging to already open " ++#~ "connections are automatically allowed to pass the firewall." ++#~ msgstr "" ++#~ "Le regole avanzate consentono di personalizzare il firewall per le tue " ++#~ "necessità. Solo le nuove connessioni saranno combinate. I pacchetti " ++#~ "appartenenti alle connessioni già aperte sono automaticamente autorizzate " ++#~ "ad oltrepassare il firewall." ++ ++#~ msgid "Custom Rules (/etc/firewall.user)" ++#~ msgstr "Regole Personalizzate (/etc/firewall.user)" ++ ++#~ msgid "Device" ++#~ msgstr "Dispositivo" ++ ++#~ msgid "Rules" ++#~ msgstr "Regole" +diff --git a/feeds/luci/applications/luci-app-firewall/po/ja/firewall.po b/feeds/luci/applications/luci-app-firewall/po/ja/firewall.po +new file mode 100644 +index 0000000..877a6f0 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-firewall/po/ja/firewall.po +@@ -0,0 +1,687 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Report-Msgid-Bugs-To: \n" ++"POT-Creation-Date: 2010-03-30 17:00+0200\n" ++"PO-Revision-Date: 2012-11-14 17:32+0200\n" ++"Last-Translator: Kentaro \n" ++"Language-Team: LANGUAGE \n" ++"Language: ja\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=1; plural=0;\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "%s in %s" ++msgstr "" ++ ++msgid "%s%s with %s" ++msgstr "%s%s ,%s" ++ ++msgid "%s, %s in %s" ++msgstr "" ++ ++msgid "(Unnamed Entry)" ++msgstr "(åå‰è¨­å®šã®ç„¡ã„エントリー)" ++ ++msgid "(Unnamed Rule)" ++msgstr "(åå‰è¨­å®šã®ç„¡ã„ルール)" ++ ++msgid "(Unnamed SNAT)" ++msgstr "(åå‰è¨­å®šã®ç„¡ã„SNAT)" ++ ++msgid "-- Please choose --" ++msgstr "-- é¸æŠžã—ã¦ãã ã•ã„ --" ++ ++msgid "-- custom --" ++msgstr "-- 手動設定 --" ++ ++msgid "%d pkts. per %s" ++msgstr "%d パケット / %s" ++ ++msgid "%d pkts. per %s, burst %d pkts." ++msgstr "" ++"%d パケット / %s, ãƒãƒ¼ã‚¹ãƒˆ %d パケット" ++ ++msgid "%s and limit to %s" ++msgstr "%s, %s を上é™ã«è¨­å®š" ++ ++msgid "Action" ++msgstr "動作" ++ ++msgid "Add" ++msgstr "追加" ++ ++msgid "Add and edit..." ++msgstr "追加åŠã³ç·¨é›†..." ++ ++msgid "Advanced Settings" ++msgstr "詳細設定" ++ ++msgid "Allow forward from source zones:" ++msgstr "é€ä¿¡å…ƒã‚¾ãƒ¼ãƒ³ã‹ã‚‰ã®è»¢é€ã‚’許å¯ã™ã‚‹:" ++ ++msgid "Allow forward to destination zones:" ++msgstr "宛先ゾーンã¸ã®è»¢é€ã‚’許å¯ã™ã‚‹:" ++ ++msgid "Any" ++msgstr "å…¨ã¦" ++ ++msgid "Covered networks" ++msgstr "対象ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯" ++ ++msgid "Custom Rules" ++msgstr "手動設定ルール" ++ ++msgid "" ++"Custom rules allow you to execute arbritary iptables commands which are not " ++"otherwise covered by the firewall framework. The commands are executed after " ++"each firewall restart, right after the default ruleset has been loaded." ++msgstr "" ++"手動設定ルールã®è¨­å®šã§ã¯ã€ãƒ•ã‚¡ã‚¤ã‚¢ã‚¦ã‚©ãƒ¼ãƒ«ã®è¨­å®šç”»é¢ã§ã¯ã‚µãƒãƒ¼ãƒˆã•ã‚Œã¦ã„ãªã„" ++"よã†ãªã€ä»»æ„ã®iptablesコマンドを実行ã™ã‚‹ã“ã¨ãŒå¯èƒ½ã§ã™ã€‚ã“れらã®ä»»æ„ã®ã‚³ãƒžãƒ³" ++"ドã¯ã€ãƒ•ã‚¡ã‚¤ã‚¢ã‚¦ã‚©ãƒ¼ãƒ«æ©Ÿèƒ½ã®èµ·å‹•ã”ã¨ã«ã€æ¨™æº–ã®ãƒ«ãƒ¼ãƒ«ãŒèª­ã¿è¾¼ã¾ã‚ŒãŸå¾Œã«å®Ÿè¡Œã•" ++"ã‚Œã¾ã™ã€‚" ++ ++msgid "Destination IP address" ++msgstr "宛先IPアドレス" ++ ++msgid "Destination address" ++msgstr "宛先アドレス" ++ ++msgid "Destination port" ++msgstr "宛先ãƒãƒ¼ãƒˆ" ++ ++msgid "Destination zone" ++msgstr "宛先ゾーン" ++ ++msgid "Do not rewrite" ++msgstr "リライトã—ãªã„" ++ ++msgid "Drop invalid packets" ++msgstr "無効ãªãƒ‘ケットをé®æ–­ã™ã‚‹" ++ ++msgid "Enable" ++msgstr "有効" ++ ++msgid "Enable NAT Loopback" ++msgstr "NATループãƒãƒƒã‚¯ã‚’有効ã«ã™ã‚‹" ++ ++msgid "Enable SYN-flood protection" ++msgstr "SYN-Floodプロテクションを有効ã«ã™ã‚‹" ++ ++msgid "Enable logging on this zone" ++msgstr "ã“ã®ã‚¾ãƒ¼ãƒ³ã®ãƒ­ã‚°è¨˜éŒ²ã‚’有効ã«ã™ã‚‹" ++ ++msgid "External IP address" ++msgstr "外部IPアドレス" ++ ++msgid "External port" ++msgstr "外部ãƒãƒ¼ãƒˆ" ++ ++msgid "External zone" ++msgstr "外部ゾーン" ++ ++msgid "Extra arguments" ++msgstr "追加設定" ++ ++msgid "Firewall" ++msgstr "ファイアウォール" ++ ++msgid "Firewall - Custom Rules" ++msgstr "ファイアウォール - 手動設定ルール" ++ ++msgid "Firewall - Port Forwards" ++msgstr "ファイアウォール - ãƒãƒ¼ãƒˆãƒ•ã‚©ãƒ¯ãƒ¼ãƒ‡ã‚£ãƒ³ã‚°" ++ ++msgid "Firewall - Traffic Rules" ++msgstr "ファイアウォール - トラフィック・ルール" ++ ++msgid "Firewall - Zone Settings" ++msgstr "ファイアウォール - ゾーン設定" ++ ++msgid "Force connection tracking" ++msgstr "強制的ã«ã‚³ãƒã‚¯ã‚·ãƒ§ãƒ³è¿½è·¡ã‚’è¡Œã†" ++ ++msgid "Forward" ++msgstr "転é€" ++ ++msgid "Forward to" ++msgstr "" ++ ++msgid "From %s in %s" ++msgstr "é€ä¿¡å…ƒ %s (%s)" ++ ++msgid "From %s in %s with source %s" ++msgstr "é€ä¿¡å…ƒ %s (%s) , é€ä¿¡å…ƒ %s" ++ ++msgid "From %s in %s with source %s and %s" ++msgstr "é€ä¿¡å…ƒ %s (%s) , é€ä¿¡å…ƒ %s, é€ä¿¡å…ƒ %s" ++ ++msgid "General Settings" ++msgstr "一般設定" ++ ++msgid "IPv4" ++msgstr "IPv4" ++ ++msgid "IPv4 and IPv6" ++msgstr "IPv4åŠã³IPv6" ++ ++msgid "IPv4 only" ++msgstr "IPv4ã®ã¿" ++ ++msgid "IPv6" ++msgstr "IPv6" ++ ++msgid "IPv6 only" ++msgstr "IPv6ã®ã¿" ++ ++msgid "Input" ++msgstr "å—ä¿¡" ++ ++msgid "Inter-Zone Forwarding" ++msgstr "内部ゾーン転é€" ++ ++msgid "Internal IP address" ++msgstr "内部IPアドレス" ++ ++msgid "Internal port" ++msgstr "内部ãƒãƒ¼ãƒˆ" ++ ++msgid "Internal zone" ++msgstr "内部ゾーン" ++ ++msgid "Limit log messages" ++msgstr "ログメッセージを制é™" ++ ++msgid "MSS clamping" ++msgstr "MSSクランプ" ++ ++msgid "Masquerading" ++msgstr "マスカレード" ++ ++msgid "Match" ++msgstr "" ++ ++msgid "Match ICMP type" ++msgstr "ICMPタイプã®ä¸€è‡´" ++ ++msgid "Match forwarded traffic to the given destination port or port range." ++msgstr "" ++"設定ã•ã‚ŒãŸå®›å…ˆãƒãƒ¼ãƒˆ(ã¾ãŸã¯ãƒãƒ¼ãƒˆç¯„囲)ã«ä¸€è‡´ã—ãŸè»¢é€ãƒˆãƒ©ãƒ•ã‚£ãƒƒã‚¯ãŒå¯¾è±¡ã«ãªã‚Š" ++"ã¾ã™" ++ ++msgid "" ++"Match incoming traffic directed at the given destination port or port range " ++"on this host" ++msgstr "" ++"設定ã•ã‚ŒãŸå®›å…ˆãƒãƒ¼ãƒˆ(ã¾ãŸã¯ãƒãƒ¼ãƒˆç¯„囲)ã«ä¸€è‡´ã—ãŸå—信トラフィックãŒå¯¾è±¡ã«ãªã‚Š" ++"ã¾ã™" ++ ++msgid "" ++"Match incoming traffic originating from the given source port or port range " ++"on the client host." ++msgstr "" ++"設定ã•ã‚ŒãŸã‚¯ãƒ©ã‚¤ã‚¢ãƒ³ãƒˆãƒ›ã‚¹ãƒˆã®é€ä¿¡å…ƒãƒãƒ¼ãƒˆ(ã¾ãŸã¯ãƒãƒ¼ãƒˆç¯„囲)ã‹ã‚‰ã®å—信トラ" ++"フィックã¨ä¸€è‡´ã—ãŸãƒˆãƒ©ãƒ•ã‚£ãƒƒã‚¯ãŒå¯¾è±¡ã«ãªã‚Šã¾ã™ã€‚" ++ ++msgid "Name" ++msgstr "åå‰" ++ ++msgid "New SNAT rule" ++msgstr "SNATルールã®æ–°è¦ä½œæˆ" ++ ++msgid "New forward rule" ++msgstr "転é€ãƒ«ãƒ¼ãƒ«ã®æ–°è¦ä½œæˆ" ++ ++msgid "New input rule" ++msgstr "å—信ルールã®æ–°è¦ä½œæˆ" ++ ++msgid "New port forward" ++msgstr "転é€è¨­å®šã®æ–°è¦ä½œæˆ" ++ ++msgid "New source NAT" ++msgstr "SNATルールã®æ–°è¦ä½œæˆ" ++ ++msgid "Only match incoming traffic directed at the given IP address." ++msgstr "設定ã•ã‚ŒãŸå®›å…ˆIPアドレスã¨ä¸€è‡´ã—ãŸå—信トラフィックãŒå¯¾è±¡ã«ãªã‚Šã¾ã™ã€‚" ++ ++msgid "Only match incoming traffic from these MACs." ++msgstr "設定ã•ã‚ŒãŸMACアドレスã¨ä¸€è‡´ã—ãŸå—ä¿¡ã—ãŸãƒˆãƒ©ãƒ•ã‚£ãƒƒã‚¯ãŒå¯¾è±¡ã«ãªã‚Šã¾ã™ã€‚" ++ ++msgid "Only match incoming traffic from this IP or range." ++msgstr "" ++"設定ã•ã‚ŒãŸIPアドレス (ã¾ãŸã¯ç¯„囲) ã¨ä¸€è‡´ã—ãŸå—ä¿¡ã—ãŸãƒˆãƒ©ãƒ•ã‚£ãƒƒã‚¯ãŒå¯¾è±¡ã«ãªã‚Š" ++"ã¾ã™ã€‚" ++ ++msgid "" ++"Only match incoming traffic originating from the given source port or port " ++"range on the client host" ++msgstr "" ++"設定ã•ã‚ŒãŸã‚¯ãƒ©ã‚¤ã‚¢ãƒ³ãƒˆãƒ›ã‚¹ãƒˆã®é€ä¿¡å…ƒãƒãƒ¼ãƒˆ(ã¾ãŸã¯ãƒãƒ¼ãƒˆç¯„囲)ã‹ã‚‰ã®å—信トラ" ++"フィックã¨ä¸€è‡´ã—ãŸãƒˆãƒ©ãƒ•ã‚£ãƒƒã‚¯ã®ã¿ã‚’対象ã«ã—ã¾ã™ã€‚" ++ ++msgid "Open ports on router" ++msgstr "ãƒãƒ¼ãƒˆã®é–‹æ”¾" ++ ++msgid "Other..." ++msgstr "ãã®ä»–ã®ãƒ—ロトコル" ++ ++msgid "Output" ++msgstr "é€ä¿¡" ++ ++msgid "Passes additional arguments to iptables. Use with care!" ++msgstr "" ++"iptablesã«ãƒ‘ススルーã™ã‚‹è¿½åŠ ã®å¼•æ•°ã‚’設定ã—ã¦ãã ã•ã„。ãŸã ã—ã€æ³¨æ„ã—ã¦è¨­å®šã—" ++"ã¦ãã ã•ã„!" ++ ++msgid "Port Forwards" ++msgstr "ãƒãƒ¼ãƒˆãƒ•ã‚©ãƒ¯ãƒ¼ãƒ‡ã‚£ãƒ³ã‚°" ++ ++msgid "" ++"Port forwarding allows remote computers on the Internet to connect to a " ++"specific computer or service within the private LAN." ++msgstr "" ++"ãƒãƒ¼ãƒˆãƒ•ã‚©ãƒ¯ãƒ¼ãƒ‡ã‚£ãƒ³ã‚°ã¯ã€ã‚¤ãƒ³ã‚¿ãƒ¼ãƒãƒƒãƒˆä¸Šã®ãƒªãƒ¢ãƒ¼ãƒˆã‚³ãƒ³ãƒ”ュータã‹ã‚‰ã€ãƒ—ライ" ++"ベートãªãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ä¸Šã®ã€ç‰¹å®šã®ã‚³ãƒ³ãƒ”ュータやサービスã¸ã®ã‚¢ã‚¯ã‚»ã‚¹ã‚’å¯èƒ½ã«ã—" ++"ã¾ã™ã€‚" ++ ++msgid "Protocol" ++msgstr "プロトコル" ++ ++msgid "" ++"Redirect matched incoming traffic to the given port on the internal host" ++msgstr "" ++"ルールã«ä¸€è‡´ã—ãŸå—信トラフィックをã€å†…部ホストã®è¨­å®šã•ã‚ŒãŸãƒãƒ¼ãƒˆã¸è»¢é€ã—ã¾ã™" ++ ++msgid "Redirect matched incoming traffic to the specified internal host" ++msgstr "ルールã«ä¸€è‡´ã—ãŸå—信トラフィックをã€è¨­å®šã•ã‚ŒãŸå†…部ホストã¸è»¢é€ã—ã¾ã™" ++ ++msgid "Restrict Masquerading to given destination subnets" ++msgstr "設定ã•ã‚ŒãŸå®›å…ˆã‚µãƒ–ãƒãƒƒãƒˆã¸ã®ãƒžã‚¹ã‚«ãƒ¬ãƒ¼ãƒ‰ã‚’制é™ã™ã‚‹" ++ ++msgid "Restrict Masquerading to given source subnets" ++msgstr "設定ã•ã‚ŒãŸé€ä¿¡å…ƒã‚µãƒ–ãƒãƒƒãƒˆã¸ã®ãƒžã‚¹ã‚«ãƒ¬ãƒ¼ãƒ‰ã‚’制é™ã™ã‚‹" ++ ++msgid "Restrict to address family" ++msgstr "アドレスファミリã®åˆ¶é™" ++ ++msgid "Rewrite matched traffic to the given address." ++msgstr "" ++"ルールã«ä¸€è‡´ã—ãŸãƒˆãƒ©ãƒ•ã‚£ãƒƒã‚¯ã®é€ä¿¡å…ƒã‚¢ãƒ‰ãƒ¬ã‚¹ã‚’設定ã—ãŸå€¤ã«ãƒªãƒ©ã‚¤ãƒˆã—ã¾ã™ã€‚" ++ ++msgid "" ++"Rewrite matched traffic to the given source port. May be left empty to only " ++"rewrite the IP address." ++msgstr "" ++"ルールã«ä¸€è‡´ã—ãŸãƒˆãƒ©ãƒ•ã‚£ãƒƒã‚¯ã®é€ä¿¡å…ƒãƒãƒ¼ãƒˆã‚’設定ã—ãŸå€¤ã«ãƒªãƒ©ã‚¤ãƒˆã—ã¾ã™ã€‚空欄" ++"ã«ã—ãŸå ´åˆã€IPアドレスã®ã¿ã‚’書ãç›´ã—ã¾ã™ã€‚" ++ ++msgid "Rewrite to source %s" ++msgstr "é€ä¿¡å…ƒ %s ã«ãƒªãƒ©ã‚¤ãƒˆ" ++ ++msgid "Rewrite to source %s, %s" ++msgstr "é€ä¿¡å…ƒ %s, %s ã«ãƒªãƒ©ã‚¤ãƒˆ" ++ ++msgid "SNAT IP address" ++msgstr "SNAT IPアドレス" ++ ++msgid "SNAT port" ++msgstr "SNAT ãƒãƒ¼ãƒˆ" ++ ++# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # ++# Generated from applications/luci-fw/luasrc/model/cbi/luci_fw/rrule.lua # ++# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # ++# ++# msgid "Traffic Redirection" ++# msgstr "" ++# ++# msgid "" ++# "Traffic redirection allows you to change the destination address of " ++# "forwarded packets." ++# msgstr "" ++# ++# msgid "Overview" ++# msgstr "" ++# ++# msgid "Name" ++# msgstr "" ++# ++# msgid "Source zone" ++# msgstr "" ++# ++# msgid "Source MAC-address" ++# msgstr "" ++# ++# msgid "Source port" ++# msgstr "" ++# ++# msgid "Protocol" ++# msgstr "" ++# ++msgid "Source IP address" ++msgstr "é€ä¿¡å…ƒIPアドレス" ++ ++msgid "Source MAC address" ++msgstr "é€ä¿¡å…ƒMACアドレス" ++ ++msgid "Source NAT" ++msgstr "é€ä¿¡å…ƒNAT" ++ ++msgid "" ++"Source NAT is a specific form of masquerading which allows fine grained " ++"control over the source IP used for outgoing traffic, for example to map " ++"multiple WAN addresses to internal subnets." ++msgstr "" ++"é€ä¿¡å…ƒNAT設定ã¯ã€è¤‡æ•°ã®WANアドレスを内部ã®ã‚µãƒ–ãƒãƒƒãƒˆã«ãƒžãƒƒãƒ”ングã™ã‚‹ã‚ˆã†ãªã€" ++"出力トラフィックã«å¯¾ã™ã‚‹é€ä¿¡å…ƒIPアドレスã®ãã‚ç´°ã‹ã„制御を行ã†ãƒžã‚¹ã‚«ãƒ¬ãƒ¼ãƒ‰ã®" ++"設定フォームã§ã™ã€‚" ++ ++msgid "Source address" ++msgstr "é€ä¿¡å…ƒã‚¢ãƒ‰ãƒ¬ã‚¹" ++ ++msgid "Source port" ++msgstr "é€ä¿¡å…ƒãƒãƒ¼ãƒˆ" ++ ++msgid "Source zone" ++msgstr "é€ä¿¡å…ƒã‚¾ãƒ¼ãƒ³" ++ ++msgid "" ++"The firewall creates zones over your network interfaces to control network " ++"traffic flow." ++msgstr "" ++"ファイアウォール機能ã¯ã€å„ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ã‚¤ãƒ³ã‚¿ãƒ¼ãƒ•ã‚§ãƒ¼ã‚¹ä¸Šã«ã‚¾ãƒ¼ãƒ³ã‚’作æˆã—ã¦ãƒˆ" ++"ラフィックã®åˆ¶å¾¡ã‚’è¡Œã„ã¾ã™ã€‚" ++ ++msgid "" ++"The options below control the forwarding policies between this zone (%s) and " ++"other zones. Destination zones cover forwarded traffic " ++"originating from %q. Source zones match forwarded " ++"traffic from other zones targeted at %q. The forwarding " ++"rule is unidirectional, e.g. a forward from lan to wan does " ++"not imply a permission to forward from wan to lan as well." ++msgstr "" ++"下記ã®è¨­å®šã¯ã€ã“ã®ã‚¾ãƒ¼ãƒ³ (%s)ã¨ãã®ä»–ã®ã‚¾ãƒ¼ãƒ³é–“ã®è»¢é€ãƒãƒªã‚·ãƒ¼ã‚’制御ã—ã¾ã™ã€‚" ++"宛先ゾーンã¸ã®è»¢é€ ã¯ã€%q ã‹ã‚‰è»¢é€ã•ã‚ŒãŸãƒˆãƒ©ãƒ•ã‚£ãƒƒ" ++"クã«å¯¾ã—ã¦è»¢é€ã‚’許å¯ã—ã¾ã™ã€‚ é€ä¿¡å…ƒã‚¾ãƒ¼ãƒ³ã‹ã‚‰ã®è»¢é€ ã¯ã€åˆ¥ã®ã‚¾ãƒ¼ãƒ³ã‹" ++"ら%q㸠ã®è»¢é€ã‚’許å¯ã—ã¾ã™ã€‚トラフィック転é€è¨­å®šã¯ã€ä¸€æ–¹" ++"å‘ã§ã‚ã‚Šã€ä¾‹ãˆã°lanã‹ã‚‰wanã¸ã®è»¢é€è¨­å®šã¯ã€wanã‹ã‚‰lanã¸ã®è»¢é€ã‚’許å¯ã—" ++"ã¾ã›ã‚“。" ++ ++msgid "" ++"This page allows you to change advanced properties of the port forwarding " ++"entry. In most cases there is no need to modify those settings." ++msgstr "" ++"ã“ã®ãƒšãƒ¼ã‚¸ã§ã¯ã€å„転é€ãƒ«ãƒ¼ãƒ«ã®è©³ç´°è¨­å®šã‚’è¡Œã†ã“ã¨ãŒã§ãã¾ã™ã€‚ãŸã ã—ã€ã»ã¨ã‚“ã©" ++"ã®ã‚±ãƒ¼ã‚¹ã¯ã€ã“れらã®è¨­å®šã‚’変更ã™ã‚‹å¿…è¦ã¯ã‚ã‚Šã¾ã›ã‚“。" ++ ++msgid "" ++"This page allows you to change advanced properties of the traffic rule " ++"entry, such as matched source and destination hosts." ++msgstr "" ++"ã“ã®ãƒšãƒ¼ã‚¸ã§ã¯ã€å„トラフィックルールã®é€ä¿¡å…ƒãƒ»å®›å…ˆãƒ›ã‚¹ãƒˆã®è¨­å®šãªã©ã®è©³ç´°è¨­å®š" ++"ã‚’è¡Œã†ã“ã¨ãŒã§ãã¾ã™ã€‚" ++ ++#, fuzzy ++msgid "" ++"This section defines common properties of %q. The input and " ++"output options set the default policies for traffic entering and " ++"leaving this zone while the forward option describes the policy for " ++"forwarded traffic between different networks within the zone. Covered " ++"networks specifies which available networks are members of this zone." ++msgstr "" ++"ã“ã®ã‚»ã‚¯ã‚·ãƒ§ãƒ³ã§ã¯ã€%sã®æ¨™æº–çš„ãªå‹•ä½œã‚’設定ã—ã¾ã™ã€‚å—ä¿¡åŠã³é€ä¿¡ã‚ªãƒ—ションã¯ã€ã“ã®ã‚¾ãƒ¼ãƒ³ã«å¯¾ã—ã¦å…¥å‡ºåŠ›ã™ã‚‹ãƒˆãƒ©ãƒ•ã‚£ãƒƒã‚¯ã«å¯¾ã™ã‚‹æ¨™æº–ã®ãƒãƒª" ++"シーを設定ã—ã€è»¢é€ã‚ªãƒ—ションã¯ã€ã‚¾ãƒ¼ãƒ³é–“ã®è»¢é€ãƒˆãƒ©ãƒ•ã‚£ãƒƒã‚¯ã«å¯¾ã™ã‚‹æ¨™" ++"準ã®ãƒãƒªã‚·ãƒ¼ã«ãªã‚Šã¾ã™ã€‚対象ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ã¯ã€ã©ã®ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯è¨­å®šãŒã“" ++"ã®ã‚¾ãƒ¼ãƒ³ã«å±žã™ã‚‹ã‹ã‚’設定ã—ã¾ã™ã€‚" ++ ++msgid "To %s at %s on this device" ++msgstr "宛先 %s, %s (デãƒã‚¤ã‚¹)" ++ ++msgid "To %s in %s" ++msgstr "宛先 %s (%s)" ++ ++msgid "To %s on this device" ++msgstr "宛先 %s (デãƒã‚¤ã‚¹)" ++ ++msgid "To %s, %s in %s" ++msgstr "宛先 %s, %s (%s)" ++ ++msgid "To source IP" ++msgstr "変æ›å¾Œé€ä¿¡å…ƒIP" ++ ++msgid "To source port" ++msgstr "変æ›å¾Œé€ä¿¡å…ƒãƒãƒ¼ãƒˆ" ++ ++msgid "Traffic Rules" ++msgstr "トラフィック・ルール" ++ ++msgid "" ++"Traffic rules define policies for packets traveling between different zones, " ++"for example to reject traffic between certain hosts or to open WAN ports on " ++"the router." ++msgstr "" ++"トラフィック・ルールã®è¨­å®šã§ã¯ã€ã‚¾ãƒ¼ãƒ³é–“ã‚’è¡Œãæ¥ã™ã‚‹ãƒ‘ケットã®ãƒãƒªã‚·ãƒ¼ã‚’設定" ++"ã—ã¾ã™ã€‚例ãˆã°ã€ç‰¹å®šã®ãƒ›ã‚¹ãƒˆé–“ã‚„ã€ãƒ«ãƒ¼ã‚¿ãƒ¼ã®WANãƒãƒ¼ãƒˆã¸ã®ãƒˆãƒ©ãƒ•ã‚£ãƒƒã‚¯ã®æ‹’å¦ã‚’" ++"設定ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚" ++ ++msgid "Via %s" ++msgstr "" ++ ++msgid "Via %s at %s" ++msgstr "" ++ ++msgid "" ++"You may specify multiple by selecting \"-- custom --\" and then entering " ++"protocols separated by space." ++msgstr "" ++"\"-- 手動設定 --\"ã‚’é¸æŠžã—ã€ãƒ—ロトコルをスペースã§åŒºåˆ‡ã£ã¦å…¥åŠ›ã™ã‚‹ã“ã¨ã§è¤‡æ•°" ++"ã®ãƒ—ロトコルを指定ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚" ++ ++msgid "Zone %q" ++msgstr "ゾーン %q" ++ ++msgid "Zone ⇒ Forwardings" ++msgstr "ゾーン ⇒ 転é€" ++ ++msgid "Zones" ++msgstr "ゾーン" ++ ++msgid "accept" ++msgstr "許å¯" ++ ++msgid "any" ++msgstr "å…¨ã¦" ++ ++msgid "any host" ++msgstr "å…¨ã¦ã®ãƒ›ã‚¹ãƒˆ" ++ ++msgid "any router IP" ++msgstr "å…¨ã¦ã®ãƒ«ãƒ¼ã‚¿ãƒ¼IP" ++ ++msgid "any zone" ++msgstr "å…¨ã¦ã®ã‚¾ãƒ¼ãƒ³" ++ ++msgid "don't track" ++msgstr "コãƒã‚¯ã‚·ãƒ§ãƒ³è¿½è·¡ã‚’è¡Œã‚ãªã„" ++ ++msgid "drop" ++msgstr "é®æ–­" ++ ++msgid "reject" ++msgstr "æ‹’å¦" ++ ++msgid "traffic" ++msgstr "" ++ ++#~ msgid "Destination" ++#~ msgstr "宛先" ++ ++#~ msgid "Family" ++#~ msgstr "アドレスファミリ" ++ ++#~ msgid "Forward to %s in %s" ++#~ msgstr "転é€å…ˆ %s (%s)" ++ ++#~ msgid "Forward to %s, %s in %s" ++#~ msgstr "転é€å…ˆ %s, %s (%s)" ++ ++#~ msgid "SNAT" ++#~ msgstr "SNAT" ++ ++#~ msgid "Source" ++#~ msgstr "é€ä¿¡å…ƒ" ++ ++#~ msgid "To %s" ++#~ msgstr "宛先 %s" ++ ++#~ msgid "To %s at %s" ++#~ msgstr "宛先 %s, %s" ++ ++#~ msgid "Via" ++#~ msgstr "経由" ++ ++#~ msgid "Accept forward" ++#~ msgstr "転é€ã‚’許å¯" ++ ++#~ msgid "Accept input" ++#~ msgstr "å—信を許å¯" ++ ++#~ msgid "Disable" ++#~ msgstr "無効" ++ ++#~ msgid "Discard forward" ++#~ msgstr "転é€ã‚’破棄" ++ ++#~ msgid "Discard input" ++#~ msgstr "入力を破棄" ++ ++#~ msgid "Do not track forward" ++#~ msgstr "転é€ã®è¿½è·¡ã‚’è¡Œã‚ãªã„" ++ ++#~ msgid "Do not track input" ++#~ msgstr "入力ã®è¿½è·¡ã‚’è¡Œã‚ãªã„" ++ ++#~ msgid "IP" ++#~ msgstr "IP" ++ ++#~ msgid "IP range" ++#~ msgstr "IPレンジ" ++ ++#~ msgid "IPs" ++#~ msgstr "IP" ++ ++#~ msgid "MAC" ++#~ msgstr "MAC" ++ ++#~ msgid "MACs" ++#~ msgstr "MAC" ++ ++#~ msgid "Refuse forward" ++#~ msgstr "転é€ã‚’æ‹’å¦" ++ ++#~ msgid "Refuse input" ++#~ msgstr "å—ä¿¡ã‚’æ‹’å¦" ++ ++#~ msgid "Rule is disabled" ++#~ msgstr "ルール設定ã¯ç„¡åŠ¹ã«ãªã£ã¦ã„ã¾ã™" ++ ++#~ msgid "Rule is enabled" ++#~ msgstr "ルール設定ã¯æœ‰åŠ¹ã«ãªã£ã¦ã„ã¾ã™" ++ ++#~ msgid "day" ++#~ msgstr "æ—¥" ++ ++#~ msgid "hour" ++#~ msgstr "時" ++ ++#~ msgid "minute" ++#~ msgstr "分" ++ ++#~ msgid "not" ++#~ msgstr "not" ++ ++#~ msgid "port" ++#~ msgstr "ãƒãƒ¼ãƒˆ" ++ ++#~ msgid "ports" ++#~ msgstr "ãƒãƒ¼ãƒˆ" ++ ++#~ msgid "second" ++#~ msgstr "秒" ++ ++#~ msgid "type" ++#~ msgstr "タイプ" ++ ++#~ msgid "types" ++#~ msgstr "タイプ" ++ ++#~ msgid "(optional)" ++#~ msgstr "(オプション)" ++ ++#~ msgid "Intended destination address" ++#~ msgstr "æ„図ã•ã‚ŒãŸå®›å…ˆã‚¢ãƒ‰ãƒ¬ã‚¹" ++ ++#~ msgid "Internal port (optional)" ++#~ msgstr "内部ãƒãƒ¼ãƒˆï¼ˆã‚ªãƒ—ション)" ++ ++#~ msgid "Advanced Options" ++#~ msgstr "詳細ãªã‚ªãƒ—ション" ++ ++#~ msgid "Advanced Rules" ++#~ msgstr "詳細ãªãƒ«ãƒ¼ãƒ«" ++ ++#~ msgid "" ++#~ "Advanced rules let you customize the firewall to your needs. Only new " ++#~ "connections will be matched. Packets belonging to already open " ++#~ "connections are automatically allowed to pass the firewall." ++#~ msgstr "" ++#~ "詳細ãªãƒ«ãƒ¼ãƒ«è¨­å®šã‚’è¡Œã†ã“ã¨ãŒã§ãã¾ã™ã€‚ãŸã ã—ã€ã™ã§ã«æŽ¥ç¶šãŒè¡Œã‚ã‚Œã¦ã„るパ" ++#~ "ケットã«é–¢ã—ã¦ã¯ã€è‡ªå‹•çš„ã«ãƒ•ã‚¡ã‚¤ã‚¢ã‚¦ã‚©ãƒ¼ãƒ«ã®é€šéŽã‚’許å¯ã•ã‚Œã¾ã™ã€‚" ++ ++#~ msgid "Custom Rules (/etc/firewall.user)" ++#~ msgstr "手動設定ルール (/etc/firewall.user)" ++ ++#~ msgid "Device" ++#~ msgstr "デãƒã‚¤ã‚¹" ++ ++#~ msgid "" ++#~ "For DNAT, match incoming traffic directed at the given destination ip " ++#~ "address. For SNAT rewrite the source address to the given address." ++#~ msgstr "" ++#~ "DNATã®å ´åˆã€è¨­å®šã•ã‚ŒãŸå®›å…ˆã‚¢ãƒ‰ãƒ¬ã‚¹ã®ãƒˆãƒ©ãƒ•ã‚£ãƒƒã‚¯ã«å¯¾ã—ã¦åˆè‡´ã‚’è¡Œã„ã¾ã™ã€‚" ++#~ "SNATã®å ´åˆã€é€ä¿¡å…ƒã‚¢ãƒ‰ãƒ¬ã‚¹ã‚’設定ã•ã‚ŒãŸã‚¢ãƒ‰ãƒ¬ã‚¹ã§ä¸Šæ›¸ãã—ã¾ã™ã€‚" ++ ++#~ msgid "Overview" ++#~ msgstr "概è¦" ++ ++#~ msgid "Port forwarding" ++#~ msgstr "ãƒãƒ¼ãƒˆãƒ•ã‚©ãƒ¯ãƒ¼ãƒ‡ã‚£ãƒ³ã‚°" ++ ++#~ msgid "" ++#~ "Port forwarding allows to provide network services in the internal " ++#~ "network to an external network." ++#~ msgstr "" ++#~ "ãƒãƒ¼ãƒˆãƒ•ã‚©ãƒ¯ãƒ¼ãƒ‡ã‚£ãƒ³ã‚°ã‚’使用ã™ã‚‹ã“ã¨ã§ã€å†…部ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ã®ã‚µãƒ¼ãƒ“スを外部ã«" ++#~ "æä¾›ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚" ++ ++#~ msgid "Redirection type" ++#~ msgstr "転é€ã‚¿ã‚¤ãƒ—" ++ ++#~ msgid "Redirections" ++#~ msgstr "転é€" ++ ++#~ msgid "Rules" ++#~ msgstr "ルール" ++ ++#~ msgid "Traffic Redirection" ++#~ msgstr "トラフィック転é€" ++ ++#~ msgid "" ++#~ "Traffic redirection allows you to change the destination address of " ++#~ "forwarded packets." ++#~ msgstr "" ++#~ "トラフィック転é€æ©Ÿèƒ½ã‚’用ã„ã‚‹ã“ã¨ã§ã€è»¢é€ã—ãŸãƒ‘ケットã®å®›å…ˆã‚¢ãƒ‰ãƒ¬ã‚¹ã‚’変更ã™" ++#~ "ã‚‹ã“ã¨ãŒå¯èƒ½ã§ã™ã€‚" +diff --git a/feeds/luci/applications/luci-app-firewall/po/ms/firewall.po b/feeds/luci/applications/luci-app-firewall/po/ms/firewall.po +new file mode 100644 +index 0000000..ccbec60 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-firewall/po/ms/firewall.po +@@ -0,0 +1,431 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Last-Translator: Automatically generated\n" ++"Language-Team: none\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++ ++msgid "%s in %s" ++msgstr "" ++ ++msgid "%s%s with %s" ++msgstr "" ++ ++msgid "%s, %s in %s" ++msgstr "" ++ ++msgid "(Unnamed Entry)" ++msgstr "" ++ ++msgid "(Unnamed Rule)" ++msgstr "" ++ ++msgid "(Unnamed SNAT)" ++msgstr "" ++ ++msgid "-- Please choose --" ++msgstr "" ++ ++msgid "-- custom --" ++msgstr "" ++ ++msgid "%d pkts. per %s" ++msgstr "" ++ ++msgid "%d pkts. per %s, burst %d pkts." ++msgstr "" ++ ++msgid "%s and limit to %s" ++msgstr "" ++ ++msgid "Action" ++msgstr "" ++ ++msgid "Add" ++msgstr "" ++ ++msgid "Add and edit..." ++msgstr "" ++ ++msgid "Advanced Settings" ++msgstr "" ++ ++msgid "Allow forward from source zones:" ++msgstr "" ++ ++msgid "Allow forward to destination zones:" ++msgstr "" ++ ++msgid "Any" ++msgstr "" ++ ++msgid "Covered networks" ++msgstr "" ++ ++msgid "Custom Rules" ++msgstr "" ++ ++msgid "" ++"Custom rules allow you to execute arbritary iptables commands which are not " ++"otherwise covered by the firewall framework. The commands are executed after " ++"each firewall restart, right after the default ruleset has been loaded." ++msgstr "" ++ ++msgid "Destination IP address" ++msgstr "" ++ ++msgid "Destination address" ++msgstr "" ++ ++msgid "Destination port" ++msgstr "" ++ ++msgid "Destination zone" ++msgstr "" ++ ++msgid "Do not rewrite" ++msgstr "" ++ ++msgid "Drop invalid packets" ++msgstr "" ++ ++msgid "Enable" ++msgstr "" ++ ++msgid "Enable NAT Loopback" ++msgstr "" ++ ++msgid "Enable SYN-flood protection" ++msgstr "" ++ ++msgid "Enable logging on this zone" ++msgstr "" ++ ++msgid "External IP address" ++msgstr "" ++ ++msgid "External port" ++msgstr "" ++ ++msgid "External zone" ++msgstr "" ++ ++msgid "Extra arguments" ++msgstr "" ++ ++msgid "Firewall" ++msgstr "" ++ ++msgid "Firewall - Custom Rules" ++msgstr "" ++ ++msgid "Firewall - Port Forwards" ++msgstr "" ++ ++msgid "Firewall - Traffic Rules" ++msgstr "" ++ ++msgid "Firewall - Zone Settings" ++msgstr "" ++ ++msgid "Force connection tracking" ++msgstr "" ++ ++msgid "Forward" ++msgstr "" ++ ++msgid "Forward to" ++msgstr "" ++ ++msgid "From %s in %s" ++msgstr "" ++ ++msgid "From %s in %s with source %s" ++msgstr "" ++ ++msgid "From %s in %s with source %s and %s" ++msgstr "" ++ ++msgid "General Settings" ++msgstr "" ++ ++msgid "IPv4" ++msgstr "" ++ ++msgid "IPv4 and IPv6" ++msgstr "" ++ ++msgid "IPv4 only" ++msgstr "" ++ ++msgid "IPv6" ++msgstr "" ++ ++msgid "IPv6 only" ++msgstr "" ++ ++msgid "Input" ++msgstr "" ++ ++msgid "Inter-Zone Forwarding" ++msgstr "" ++ ++msgid "Internal IP address" ++msgstr "" ++ ++msgid "Internal port" ++msgstr "" ++ ++msgid "Internal zone" ++msgstr "" ++ ++msgid "Limit log messages" ++msgstr "" ++ ++msgid "MSS clamping" ++msgstr "" ++ ++msgid "Masquerading" ++msgstr "" ++ ++msgid "Match" ++msgstr "" ++ ++msgid "Match ICMP type" ++msgstr "" ++ ++msgid "Match forwarded traffic to the given destination port or port range." ++msgstr "" ++ ++msgid "" ++"Match incoming traffic directed at the given destination port or port range " ++"on this host" ++msgstr "" ++ ++msgid "" ++"Match incoming traffic originating from the given source port or port range " ++"on the client host." ++msgstr "" ++ ++msgid "Name" ++msgstr "" ++ ++msgid "New SNAT rule" ++msgstr "" ++ ++msgid "New forward rule" ++msgstr "" ++ ++msgid "New input rule" ++msgstr "" ++ ++msgid "New port forward" ++msgstr "" ++ ++msgid "New source NAT" ++msgstr "" ++ ++msgid "Only match incoming traffic directed at the given IP address." ++msgstr "" ++ ++msgid "Only match incoming traffic from these MACs." ++msgstr "" ++ ++msgid "Only match incoming traffic from this IP or range." ++msgstr "" ++ ++msgid "" ++"Only match incoming traffic originating from the given source port or port " ++"range on the client host" ++msgstr "" ++ ++msgid "Open ports on router" ++msgstr "" ++ ++msgid "Other..." ++msgstr "" ++ ++msgid "Output" ++msgstr "" ++ ++msgid "Passes additional arguments to iptables. Use with care!" ++msgstr "" ++ ++msgid "Port Forwards" ++msgstr "" ++ ++msgid "" ++"Port forwarding allows remote computers on the Internet to connect to a " ++"specific computer or service within the private LAN." ++msgstr "" ++ ++msgid "Protocol" ++msgstr "" ++ ++msgid "" ++"Redirect matched incoming traffic to the given port on the internal host" ++msgstr "" ++ ++msgid "Redirect matched incoming traffic to the specified internal host" ++msgstr "" ++ ++msgid "Restrict Masquerading to given destination subnets" ++msgstr "" ++ ++msgid "Restrict Masquerading to given source subnets" ++msgstr "" ++ ++msgid "Restrict to address family" ++msgstr "" ++ ++msgid "Rewrite matched traffic to the given address." ++msgstr "" ++ ++msgid "" ++"Rewrite matched traffic to the given source port. May be left empty to only " ++"rewrite the IP address." ++msgstr "" ++ ++msgid "Rewrite to source %s" ++msgstr "" ++ ++msgid "Rewrite to source %s, %s" ++msgstr "" ++ ++msgid "SNAT IP address" ++msgstr "" ++ ++msgid "SNAT port" ++msgstr "" ++ ++msgid "Source IP address" ++msgstr "" ++ ++msgid "Source MAC address" ++msgstr "" ++ ++msgid "Source NAT" ++msgstr "" ++ ++msgid "" ++"Source NAT is a specific form of masquerading which allows fine grained " ++"control over the source IP used for outgoing traffic, for example to map " ++"multiple WAN addresses to internal subnets." ++msgstr "" ++ ++msgid "Source address" ++msgstr "" ++ ++msgid "Source port" ++msgstr "" ++ ++msgid "Source zone" ++msgstr "" ++ ++msgid "" ++"The firewall creates zones over your network interfaces to control network " ++"traffic flow." ++msgstr "" ++ ++msgid "" ++"The options below control the forwarding policies between this zone (%s) and " ++"other zones. Destination zones cover forwarded traffic " ++"originating from %q. Source zones match forwarded " ++"traffic from other zones targeted at %q. The forwarding " ++"rule is unidirectional, e.g. a forward from lan to wan does " ++"not imply a permission to forward from wan to lan as well." ++msgstr "" ++ ++msgid "" ++"This page allows you to change advanced properties of the port forwarding " ++"entry. In most cases there is no need to modify those settings." ++msgstr "" ++ ++msgid "" ++"This page allows you to change advanced properties of the traffic rule " ++"entry, such as matched source and destination hosts." ++msgstr "" ++ ++msgid "" ++"This section defines common properties of %q. The input and " ++"output options set the default policies for traffic entering and " ++"leaving this zone while the forward option describes the policy for " ++"forwarded traffic between different networks within the zone. Covered " ++"networks specifies which available networks are members of this zone." ++msgstr "" ++ ++msgid "To %s at %s on this device" ++msgstr "" ++ ++msgid "To %s in %s" ++msgstr "" ++ ++msgid "To %s on this device" ++msgstr "" ++ ++msgid "To %s, %s in %s" ++msgstr "" ++ ++msgid "To source IP" ++msgstr "" ++ ++msgid "To source port" ++msgstr "" ++ ++msgid "Traffic Rules" ++msgstr "" ++ ++msgid "" ++"Traffic rules define policies for packets traveling between different zones, " ++"for example to reject traffic between certain hosts or to open WAN ports on " ++"the router." ++msgstr "" ++ ++msgid "Via %s" ++msgstr "" ++ ++msgid "Via %s at %s" ++msgstr "" ++ ++msgid "" ++"You may specify multiple by selecting \"-- custom --\" and then entering " ++"protocols separated by space." ++msgstr "" ++ ++msgid "Zone %q" ++msgstr "" ++ ++msgid "Zone ⇒ Forwardings" ++msgstr "" ++ ++msgid "Zones" ++msgstr "" ++ ++msgid "accept" ++msgstr "" ++ ++msgid "any" ++msgstr "" ++ ++msgid "any host" ++msgstr "" ++ ++msgid "any router IP" ++msgstr "" ++ ++msgid "any zone" ++msgstr "" ++ ++msgid "don't track" ++msgstr "" ++ ++msgid "drop" ++msgstr "" ++ ++msgid "reject" ++msgstr "" ++ ++msgid "traffic" ++msgstr "" +diff --git a/feeds/luci/applications/luci-app-firewall/po/no/firewall.po b/feeds/luci/applications/luci-app-firewall/po/no/firewall.po +new file mode 100644 +index 0000000..e49f3ac +--- /dev/null ++++ b/feeds/luci/applications/luci-app-firewall/po/no/firewall.po +@@ -0,0 +1,565 @@ ++msgid "" ++msgstr "" ++"PO-Revision-Date: 2013-03-25 16:42+0200\n" ++"Last-Translator: protx \n" ++"Language: no\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n != 1);\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "%s in %s" ++msgstr "%s i %s" ++ ++msgid "%s%s with %s" ++msgstr "%s%s med %s" ++ ++msgid "%s, %s in %s" ++msgstr "%s, %s i %s" ++ ++msgid "(Unnamed Entry)" ++msgstr "(oppføring uten navn)" ++ ++msgid "(Unnamed Rule)" ++msgstr "(regel uten navn)" ++ ++msgid "(Unnamed SNAT)" ++msgstr "(SNAT uten navn)" ++ ++msgid "-- Please choose --" ++msgstr "-- Vennligst velg --" ++ ++msgid "-- custom --" ++msgstr "-- egendefinert --" ++ ++msgid "%d pkts. per %s" ++msgstr "%d pakker per %s" ++ ++msgid "%d pkts. per %s, burst %d pkts." ++msgstr "%d pakker per %s, burst %dpakker." ++ ++msgid "%s and limit to %s" ++msgstr "%s og begrens til %s" ++ ++msgid "Action" ++msgstr "Handling" ++ ++msgid "Add" ++msgstr "Legg til" ++ ++msgid "Add and edit..." ++msgstr "Legg til og redigere..." ++ ++msgid "Advanced Settings" ++msgstr "Avanserte Innstillinger" ++ ++msgid "Allow forward from source zones:" ++msgstr "Tillat videresending fra kilde soner:" ++ ++msgid "Allow forward to destination zones:" ++msgstr "Tillat videresending til destinasjon soner:" ++ ++msgid "Any" ++msgstr "Enhver" ++ ++msgid "Covered networks" ++msgstr "Gjeldene nettverk" ++ ++msgid "Custom Rules" ++msgstr "Egendefinerte Regler" ++ ++msgid "" ++"Custom rules allow you to execute arbritary iptables commands which are not " ++"otherwise covered by the firewall framework. The commands are executed after " ++"each firewall restart, right after the default ruleset has been loaded." ++msgstr "" ++"Egendefinerte regler tillater deg Ã¥ utføre vilkÃ¥rlige iptables kommandoer " ++"som ikke dekkes av brannmurens standardoppsett. Kommandoene utføres etter " ++"hver omstart av brannmuren, rett etter at standard regelsett er lastet." ++ ++msgid "Destination IP address" ++msgstr "Destinasjon IP adresse" ++ ++msgid "Destination address" ++msgstr "Destinasjon adresse" ++ ++msgid "Destination port" ++msgstr "Destinasjon port" ++ ++msgid "Destination zone" ++msgstr "Destinasjon sone" ++ ++msgid "Do not rewrite" ++msgstr "Ikke omskriv" ++ ++msgid "Drop invalid packets" ++msgstr "Forkast ugyldige pakker" ++ ++msgid "Enable" ++msgstr "Aktiver" ++ ++msgid "Enable NAT Loopback" ++msgstr "Aktiver NAT Tilbakekobling" ++ ++msgid "Enable SYN-flood protection" ++msgstr "Aktiver SYN-flood beskyttelse" ++ ++msgid "Enable logging on this zone" ++msgstr "Aktiver logging av denne sonen" ++ ++msgid "External IP address" ++msgstr "Ekstern IP adressse" ++ ++msgid "External port" ++msgstr "Ekstern port" ++ ++msgid "External zone" ++msgstr "Ekstern sone" ++ ++msgid "Extra arguments" ++msgstr "Ekstra argumenter" ++ ++msgid "Firewall" ++msgstr "Brannmur" ++ ++msgid "Firewall - Custom Rules" ++msgstr "Brannmur - Egendefinerte Regler" ++ ++msgid "Firewall - Port Forwards" ++msgstr "Brannmur - Port Videresending" ++ ++msgid "Firewall - Traffic Rules" ++msgstr "Brannmur - Trafikk Regler" ++ ++msgid "Firewall - Zone Settings" ++msgstr "Brannmur - Sone Innstillinger" ++ ++msgid "Force connection tracking" ++msgstr "" ++"Bruk forbindelse sporing" ++ ++msgid "Forward" ++msgstr "Videresend" ++ ++msgid "Forward to" ++msgstr "Videresend til" ++ ++msgid "From %s in %s" ++msgstr "Fra %s i %s" ++ ++msgid "From %s in %s with source %s" ++msgstr "Fra %s i %s med kilde %s" ++ ++msgid "From %s in %s with source %s and %s" ++msgstr "Fra %s i %s med kilde %s og %s" ++ ++msgid "General Settings" ++msgstr "Generelle Innstillinger" ++ ++msgid "IPv4" ++msgstr "IPv4" ++ ++msgid "IPv4 and IPv6" ++msgstr "IPv4 og IPv6" ++ ++msgid "IPv4 only" ++msgstr "Kun IPv4" ++ ++msgid "IPv6" ++msgstr "IPv6" ++ ++msgid "IPv6 only" ++msgstr "Kun IPv6" ++ ++msgid "Input" ++msgstr "Inndata" ++ ++msgid "Inter-Zone Forwarding" ++msgstr "Sone til Sone Videresending" ++ ++msgid "Internal IP address" ++msgstr "Intern IP adresse" ++ ++msgid "Internal port" ++msgstr "Intern port" ++ ++msgid "Internal zone" ++msgstr "Intern sone" ++ ++msgid "Limit log messages" ++msgstr "Begrens logging" ++ ++msgid "MSS clamping" ++msgstr "MSS Kontroll (Clamping)" ++ ++msgid "Masquerading" ++msgstr "Masquerading" ++ ++msgid "Match" ++msgstr "Match" ++ ++msgid "Match ICMP type" ++msgstr "Match ICMP type" ++ ++msgid "Match forwarded traffic to the given destination port or port range." ++msgstr "" ++"Match videresendt trafikk til den oppgitte destinasjonsport eller " ++"portomrÃ¥det." ++ ++msgid "" ++"Match incoming traffic directed at the given destination port or port range " ++"on this host" ++msgstr "" ++"Match innkommende trafikk rettet mot den oppgitte destinasjonsport eller " ++"portomrÃ¥det pÃ¥ denne verten" ++ ++msgid "" ++"Match incoming traffic originating from the given source port or port range " ++"on the client host." ++msgstr "" ++"Match innkommende trafikk som kommer fra den oppgitte kildeport eller " ++"portomrÃ¥det pÃ¥ klienten." ++ ++msgid "Name" ++msgstr "Navn" ++ ++msgid "New SNAT rule" ++msgstr "Ny SNAT regel" ++ ++msgid "New forward rule" ++msgstr "Ny videresending regel" ++ ++msgid "New input rule" ++msgstr "Ny inndata regel" ++ ++msgid "New port forward" ++msgstr "Ny port videresending" ++ ++msgid "New source NAT" ++msgstr "Ny kilde NAT" ++ ++msgid "Only match incoming traffic directed at the given IP address." ++msgstr "Match kun innkommende trafikk rettet mot den oppgitt IP adresse." ++ ++msgid "Only match incoming traffic from these MACs." ++msgstr "Match kun innkommende trafikk fra disse MAC adresser." ++ ++msgid "Only match incoming traffic from this IP or range." ++msgstr "Match kun innkommende trafikk fra denne IP eller IP omrÃ¥de." ++ ++msgid "" ++"Only match incoming traffic originating from the given source port or port " ++"range on the client host" ++msgstr "" ++"Match kun innkommende trafikk som kommer fra den oppgitte kildeport eller " ++"fra portomrÃ¥det til klienten" ++ ++msgid "Open ports on router" ++msgstr "Ã…pne porter pÃ¥ ruteren" ++ ++msgid "Other..." ++msgstr "Andre..." ++ ++msgid "Output" ++msgstr "Utdata" ++ ++msgid "Passes additional arguments to iptables. Use with care!" ++msgstr "Sender flere argumenter til iptables. Bruk med forsiktighet!" ++ ++msgid "Port Forwards" ++msgstr "Port Videresendinger" ++ ++msgid "" ++"Port forwarding allows remote computers on the Internet to connect to a " ++"specific computer or service within the private LAN." ++msgstr "" ++"Port videresending tillater at eksterne datamaskiner pÃ¥ Internett kan koble " ++"seg til en bestemt maskin eller tjeneste innenfor det private LAN." ++ ++msgid "Protocol" ++msgstr "Protokoll" ++ ++msgid "" ++"Redirect matched incoming traffic to the given port on the internal host" ++msgstr "" ++"Viderekoble matchet innkommende trafikk til den oppgitte porten pÃ¥ intern " ++"vert" ++ ++msgid "Redirect matched incoming traffic to the specified internal host" ++msgstr "Viderekoble matchet innkommende trafikk til den angitte interne vert" ++ ++msgid "Restrict Masquerading to given destination subnets" ++msgstr "Begrens Masquerading til oppgitt destinasjons subnett" ++ ++msgid "Restrict Masquerading to given source subnets" ++msgstr "Begrens Masqeuerading til oppgitt kilde subnett" ++ ++msgid "Restrict to address family" ++msgstr "Begrens til adresse familie" ++ ++msgid "Rewrite matched traffic to the given address." ++msgstr "Omskriv matchet trafikk til den oppgitte adressen." ++ ++msgid "" ++"Rewrite matched traffic to the given source port. May be left empty to only " ++"rewrite the IP address." ++msgstr "" ++"Omskriv matchet trafikk til den oppgitte kildeport. Kan stÃ¥ tom for kun " ++"omskriving av IP adressen." ++ ++msgid "Rewrite to source %s" ++msgstr "Omskriv til kilde %s" ++ ++msgid "Rewrite to source %s, %s" ++msgstr "Omskriv til kilde %s, %s" ++ ++msgid "SNAT IP address" ++msgstr "SNAT IP adresse" ++ ++msgid "SNAT port" ++msgstr "SNAT port" ++ ++msgid "Source IP address" ++msgstr "Kilde IP adresse" ++ ++msgid "Source MAC address" ++msgstr "Kilde MAC adresse" ++ ++msgid "Source NAT" ++msgstr "Kilde NAT" ++ ++msgid "" ++"Source NAT is a specific form of masquerading which allows fine grained " ++"control over the source IP used for outgoing traffic, for example to map " ++"multiple WAN addresses to internal subnets." ++msgstr "" ++"Kilde NAT er en spesifikk form for masquerading som tillater finkornet " ++"kontroll over kilde IP adressen som brukes for utgÃ¥ende trafikk, for " ++"eksempel for Ã¥ mappe flere WAN adresser til interne subnett." ++ ++msgid "Source address" ++msgstr "Kilde adresse" ++ ++msgid "Source port" ++msgstr "Kilde port" ++ ++msgid "Source zone" ++msgstr "Kilde sone" ++ ++msgid "" ++"The firewall creates zones over your network interfaces to control network " ++"traffic flow." ++msgstr "" ++"Brannmuren skaper soner over nettverkets grensesnitt for Ã¥ styre " ++"nettverkstrafikken." ++ ++msgid "" ++"The options below control the forwarding policies between this zone (%s) and " ++"other zones. Destination zones cover forwarded traffic " ++"originating from %q. Source zones match forwarded " ++"traffic from other zones targeted at %q. The forwarding " ++"rule is unidirectional, e.g. a forward from lan to wan does " ++"not imply a permission to forward from wan to lan as well." ++msgstr "" ++"Med valgene under konfigurerer man videresending mellom denne sone (%s) og " ++"andre soner. Destinasjons soner omhandler videresendt trafikk " ++"med opprinnelse fra %q. Kilde soner matcher " ++"videresendt trafikk fra andre soner rettet mot %q. Reglene " ++"ved videresending er enveis, d.v.s at videresending fra LAN til WAN " ++"ikke automatisk ogsÃ¥ tillater videresending fra WAN til LAN." ++ ++msgid "" ++"This page allows you to change advanced properties of the port forwarding " ++"entry. In most cases there is no need to modify those settings." ++msgstr "" ++"Denne siden lar deg endre avanserte egenskaper til port videresending " ++"oppføringer. I de fleste tilfeller er det ikke nødvendig Ã¥ endre disse " ++"innstillingene." ++ ++msgid "" ++"This page allows you to change advanced properties of the traffic rule " ++"entry, such as matched source and destination hosts." ++msgstr "" ++"Denne siden lar deg endre de avanserte egenskapene til trafikken regel " ++"oppføringer, som for eksempel matchet kilde og destinasjons vert." ++ ++#, fuzzy ++msgid "" ++"This section defines common properties of %q. The input and " ++"output options set the default policies for traffic entering and " ++"leaving this zone while the forward option describes the policy for " ++"forwarded traffic between different networks within the zone. Covered " ++"networks specifies which available networks are members of this zone." ++msgstr "" ++"Denne seksjonen definerer de vanligste valg for %q. Med Inndata og " ++"Utdata fastsetter man vanlige regler for trafikk gjennom sonen, " ++"mens videresend valget definerer regler for videresendt trafikk " ++"mellom forskjellige nettverk i sonen. Gjeldene nettverk " ++"spesifiserer hvilken av de tilgjengelige nettverk som er medlem av denne " ++"sone." ++ ++msgid "To %s at %s on this device" ++msgstr "Til %s pÃ¥ %s pÃ¥ denne enheten" ++ ++msgid "To %s in %s" ++msgstr "Til %s i %s" ++ ++msgid "To %s on this device" ++msgstr "Til %s pÃ¥ denne enheten" ++ ++msgid "To %s, %s in %s" ++msgstr "Til %s, %s i %s" ++ ++msgid "To source IP" ++msgstr "Til kilde IP" ++ ++msgid "To source port" ++msgstr "Til kilde port" ++ ++msgid "Traffic Rules" ++msgstr "Trafikk Regler" ++ ++msgid "" ++"Traffic rules define policies for packets traveling between different zones, " ++"for example to reject traffic between certain hosts or to open WAN ports on " ++"the router." ++msgstr "" ++"Trafikk regler definerer regler for sending av pakker mellom ulike soner, " ++"for eksempel for Ã¥ avvise trafikk mellom visse verter eller for Ã¥ Ã¥pne WAN " ++"porter pÃ¥ ruteren." ++ ++msgid "Via %s" ++msgstr "Via %s" ++ ++msgid "Via %s at %s" ++msgstr "Via %s pÃ¥ %s" ++ ++msgid "" ++"You may specify multiple by selecting \"-- custom --\" and then entering " ++"protocols separated by space." ++msgstr "" ++"Du kan spesifisere flere ved Ã¥ velge \"-- egendefinert --\" og deretter " ++"skrive flere protokoller atskilt med mellomrom." ++ ++msgid "Zone %q" ++msgstr "Sone %q" ++ ++msgid "Zone ⇒ Forwardings" ++msgstr "Sone = Videresendinger" ++ ++msgid "Zones" ++msgstr "Soner" ++ ++msgid "accept" ++msgstr "godta" ++ ++msgid "any" ++msgstr "enhver" ++ ++msgid "any host" ++msgstr "enhver vert" ++ ++msgid "any router IP" ++msgstr "enhver ruter IP" ++ ++msgid "any zone" ++msgstr "enhver sone" ++ ++msgid "don't track" ++msgstr "ikke track" ++ ++msgid "drop" ++msgstr "forkast" ++ ++msgid "reject" ++msgstr "avslÃ¥" ++ ++msgid "traffic" ++msgstr "" ++ ++#~ msgid "Destination" ++#~ msgstr "Destinasjon" ++ ++#~ msgid "Family" ++#~ msgstr "Adressefamilie" ++ ++#~ msgid "Source" ++#~ msgstr "Kilde" ++ ++#~ msgid "Via" ++#~ msgstr "Via" ++ ++#~ msgid "(optional)" ++#~ msgstr "(valgfritt)" ++ ++#~ msgid "Intended destination address" ++#~ msgstr "Ønsket destinasjon adresse" ++ ++#~ msgid "Internal port (optional)" ++#~ msgstr "Intern port (valgfritt)" ++ ++#~ msgid "Advanced Options" ++#~ msgstr "Avanserte Valg" ++ ++#~ msgid "Advanced Rules" ++#~ msgstr "Avanserte Regler" ++ ++#~ msgid "" ++#~ "Advanced rules let you customize the firewall to your needs. Only new " ++#~ "connections will be matched. Packets belonging to already open " ++#~ "connections are automatically allowed to pass the firewall." ++#~ msgstr "" ++#~ "Avanserte regler lar deg tilpasse brannmuren til dine behov. Kun nye " ++#~ "tilkoblinger blir berørt. Pakker som tilhører eksisterende tilkoblinger " ++#~ "slipper derfor igjennom brannmuren." ++ ++#~ msgid "Custom Rules (/etc/firewall.user)" ++#~ msgstr "Egendefinerte Regler (/etc/firewall.user)" ++ ++#~ msgid "Device" ++#~ msgstr "Enhet" ++ ++#~ msgid "" ++#~ "For DNAT, match incoming traffic directed at the given destination ip " ++#~ "address. For SNAT rewrite the source address to the given address." ++#~ msgstr "" ++#~ "DNAT: Matcher innkommende trafikk som er rettet mot destinasjons IP-" ++#~ "adressen du angir her. SNAT: Omskriver kilde IP-adressen slik at den blir " ++#~ "lik den IP-adressen du angir her." ++ ++#~ msgid "" ++#~ "Match incoming traffic originating from the given source port or port " ++#~ "range on the client host" ++#~ msgstr "Match innkommende trafikk som kommer fra dette port/portomrÃ¥de" ++ ++#~ msgid "Overview" ++#~ msgstr "Oversikt" ++ ++#~ msgid "Port forwarding" ++#~ msgstr "Port Videresending" ++ ++#~ msgid "" ++#~ "Port forwarding allows to provide network services in the internal " ++#~ "network to an external network." ++#~ msgstr "" ++#~ "Port Videresending tillater at " ++#~ "tjenester fra det interne nettverket kan tilbys et eksternt nettverk." ++ ++#~ msgid "Redirection type" ++#~ msgstr "Omadressering type" ++ ++#~ msgid "Redirections" ++#~ msgstr "Omadresseringer" ++ ++#~ msgid "Rules" ++#~ msgstr "Regler" ++ ++#~ msgid "Traffic Redirection" ++#~ msgstr "Trafikk Omadressering" ++ ++#~ msgid "" ++#~ "Traffic redirection allows you to change the destination address of " ++#~ "forwarded packets." ++#~ msgstr "" ++#~ "Trafikk Omadressering lar deg " ++#~ "endre destinasjons adresse pÃ¥ videresendte pakker." +diff --git a/feeds/luci/applications/luci-app-firewall/po/pl/firewall.po b/feeds/luci/applications/luci-app-firewall/po/pl/firewall.po +new file mode 100644 +index 0000000..2ccd25c +--- /dev/null ++++ b/feeds/luci/applications/luci-app-firewall/po/pl/firewall.po +@@ -0,0 +1,621 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Report-Msgid-Bugs-To: \n" ++"POT-Creation-Date: 2010-03-30 17:00+0200\n" ++"PO-Revision-Date: 2013-06-22 15:49+0200\n" ++"Last-Translator: obsy \n" ++"Language-Team: LANGUAGE \n" ++"Language: pl\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 " ++"|| n%100>=20) ? 1 : 2);\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "%s in %s" ++msgstr "%s w %s" ++ ++msgid "%s%s with %s" ++msgstr "%s%s z %s" ++ ++msgid "%s, %s in %s" ++msgstr "%s, %s w %s" ++ ++msgid "(Unnamed Entry)" ++msgstr "(Nienazwany wpis)" ++ ++msgid "(Unnamed Rule)" ++msgstr "(Nienazwana reguÅ‚a)" ++ ++msgid "(Unnamed SNAT)" ++msgstr "(Nienazwany SNAT)" ++ ++msgid "-- Please choose --" ++msgstr "-- ProszÄ™ wybrać --" ++ ++msgid "-- custom --" ++msgstr "-- wÅ‚asne --" ++ ++msgid "%d pkts. per %s" ++msgstr "%d pakiet. na %s" ++ ++msgid "%d pkts. per %s, burst %d pkts." ++msgstr "" ++"%d pakiet. na %s, popsutych %d pakiet." ++ ++msgid "%s and limit to %s" ++msgstr "%s i ograniczone do %s" ++ ++msgid "Action" ++msgstr "DziaÅ‚anie" ++ ++msgid "Add" ++msgstr "Dodaj" ++ ++msgid "Add and edit..." ++msgstr "Dodaj i edytuj..." ++ ++msgid "Advanced Settings" ++msgstr "Ustawienia zaawansowane" ++ ++msgid "Allow forward from source zones:" ++msgstr "Zezwól na przekazywanie z source zones:" ++ ++msgid "Allow forward to destination zones:" ++msgstr "Zezwól na przekazywanie do destination zones:" ++ ++msgid "Any" ++msgstr "Każdy" ++ ++msgid "Covered networks" ++msgstr "ObjÄ™te sieci" ++ ++msgid "Custom Rules" ++msgstr "WÅ‚asne reguÅ‚y" ++ ++msgid "" ++"Custom rules allow you to execute arbritary iptables commands which are not " ++"otherwise covered by the firewall framework. The commands are executed after " ++"each firewall restart, right after the default ruleset has been loaded." ++msgstr "" ++"WÅ‚asne reguÅ‚y pozwalajÄ… na arbitralne wykonanie poleceÅ„ iptables, które nie " ++"sÄ… objÄ™te skÅ‚adniÄ… zapory. Polecenia wykonywane sÄ… po każdym restarcie " ++"zapory, zaraz po zaÅ‚adowaniu zestawu reguÅ‚ domyÅ›lnych." ++ ++msgid "Destination IP address" ++msgstr "Docelowy adres IP" ++ ++msgid "Destination address" ++msgstr "Adres docelowy" ++ ++msgid "Destination port" ++msgstr "Port docelowy" ++ ++msgid "Destination zone" ++msgstr "Strefa docelowa" ++ ++msgid "Do not rewrite" ++msgstr "Nie przepisuj" ++ ++msgid "Drop invalid packets" ++msgstr "Porzuć wadliwe pakiety" ++ ++msgid "Enable" ++msgstr "WÅ‚Ä…cz" ++ ++msgid "Enable NAT Loopback" ++msgstr "WÅ‚Ä…cz NAT Loopback" ++ ++msgid "Enable SYN-flood protection" ++msgstr "WÅ‚Ä…cz ochronÄ™ przed atakiem SYN-flood" ++ ++msgid "Enable logging on this zone" ++msgstr "WÅ‚Ä…cz logowanie na tej strefy" ++ ++msgid "External IP address" ++msgstr "ZewnÄ™trzne adresy IP" ++ ++msgid "External port" ++msgstr "Port zewnÄ™trzny" ++ ++msgid "External zone" ++msgstr "Strefa zewnÄ™trzna" ++ ++msgid "Extra arguments" ++msgstr "Dodatkowe argumenty" ++ ++# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # ++# Generated from applications/luci-fw/luasrc/model/cbi/luci_fw/zones.lua # ++# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # ++msgid "Firewall" ++msgstr "Zapora" ++ ++msgid "Firewall - Custom Rules" ++msgstr "Zapora - ReguÅ‚y wÅ‚asne" ++ ++msgid "Firewall - Port Forwards" ++msgstr "Zapora - Przekazywanie portów" ++ ++msgid "Firewall - Traffic Rules" ++msgstr "Zapora - ReguÅ‚y ruchu" ++ ++msgid "Firewall - Zone Settings" ++msgstr "Zapora - Ustawienia strefy" ++ ++msgid "Force connection tracking" ++msgstr "WymuÅ› Å›ledzenie poÅ‚Ä…czeÅ„" ++ ++msgid "Forward" ++msgstr "Przekazuj" ++ ++msgid "Forward to" ++msgstr "Przekazuj do" ++ ++msgid "From %s in %s" ++msgstr "Z %s w %s" ++ ++msgid "From %s in %s with source %s" ++msgstr "Z %s w %s ze źródÅ‚em %s" ++ ++msgid "From %s in %s with source %s and %s" ++msgstr "Z %s w %s ze źródÅ‚em %s i %s" ++ ++msgid "General Settings" ++msgstr "Ustawienia ogólne" ++ ++msgid "IPv4" ++msgstr "IPv4" ++ ++msgid "IPv4 and IPv6" ++msgstr "IPv4 i IPv6" ++ ++msgid "IPv4 only" ++msgstr "Tylko IPv4" ++ ++msgid "IPv6" ++msgstr "IPv6" ++ ++msgid "IPv6 only" ++msgstr "Tylko IPv6" ++ ++msgid "Input" ++msgstr "Ruch przychodzÄ…cy" ++ ++msgid "Inter-Zone Forwarding" ++msgstr "Przekazywanie pomiÄ™dzy strefami" ++ ++msgid "Internal IP address" ++msgstr "WewnÄ™trzny adres IP" ++ ++msgid "Internal port" ++msgstr "WewnÄ™trzny port" ++ ++msgid "Internal zone" ++msgstr "Strefa wewnÄ™trzna" ++ ++msgid "Limit log messages" ++msgstr "Ograniczenie logowania" ++ ++msgid "MSS clamping" ++msgstr "Dostosuj MSS" ++ ++msgid "Masquerading" ++msgstr "Maskarada" ++ ++msgid "Match" ++msgstr "Dopasuj" ++ ++msgid "Match ICMP type" ++msgstr "Dopasuj typ ICMP" ++ ++msgid "Match forwarded traffic to the given destination port or port range." ++msgstr "" ++"Dopasuj przekazywany ruch do danego docelowego portu lub zakresu portów" ++ ++msgid "" ++"Match incoming traffic directed at the given destination port or port range " ++"on this host" ++msgstr "" ++"Dopasuj ruch przychodzÄ…cy do danego portu docelowego lub zakresu portów na " ++"tym hoÅ›cie" ++ ++msgid "" ++"Match incoming traffic originating from the given source port or port range " ++"on the client host." ++msgstr "" ++"Dopasuj przychodzÄ…cy ruch pochodzÄ…cy z danego portu źródÅ‚owego lub zakresu " ++"portów na hoÅ›cie klienta." ++ ++msgid "Name" ++msgstr "Nazwa" ++ ++msgid "New SNAT rule" ++msgstr "Nowa reguÅ‚a SNAT" ++ ++msgid "New forward rule" ++msgstr "Nowa reguÅ‚a przekazywania (forward)" ++ ++msgid "New input rule" ++msgstr "Nowa reguÅ‚a wejÅ›ciowa (input)" ++ ++msgid "New port forward" ++msgstr "Nowe przekierowanie portu" ++ ++msgid "New source NAT" ++msgstr "Nowy NAT źródÅ‚owy" ++ ++msgid "Only match incoming traffic directed at the given IP address." ++msgstr "Dopasuj tylko przychodzÄ…cy ruch skierowany do danego adresu IP." ++ ++msgid "Only match incoming traffic from these MACs." ++msgstr "Dopasuj tylko ruch z tych adresów MAC." ++ ++msgid "Only match incoming traffic from this IP or range." ++msgstr "Dopasuj tylko ruch przychodzÄ…cy z tego adresu IP lub zakresu adresów." ++ ++msgid "" ++"Only match incoming traffic originating from the given source port or port " ++"range on the client host" ++msgstr "" ++"Dopasuj tylko ruch przychodzÄ…cy z podanego portu źródÅ‚owego lub zakresu " ++"portów na hoÅ›cie klienta" ++ ++msgid "Open ports on router" ++msgstr "Otwarte porty na routerze" ++ ++msgid "Other..." ++msgstr "Inne..." ++ ++msgid "Output" ++msgstr "WyjÅ›cie (Output)" ++ ++msgid "Passes additional arguments to iptables. Use with care!" ++msgstr "" ++"Przekazuje dodatkowe argumenty do iptables. Zachowaj szczególnÄ… ostrożność!" ++ ++msgid "Port Forwards" ++msgstr "Przekierowania portów" ++ ++msgid "" ++"Port forwarding allows remote computers on the Internet to connect to a " ++"specific computer or service within the private LAN." ++msgstr "" ++"Przekierowanie portów pozwala komputerom z internetu na poÅ‚Ä…czenia z " ++"komputerami z sieci LAN." ++ ++msgid "Protocol" ++msgstr "Protokół" ++ ++msgid "" ++"Redirect matched incoming traffic to the given port on the internal host" ++msgstr "" ++"Przekieruj ruch przychodzÄ…cy na podany port do wskazanego hosta w sieci " ++"wewnÄ™trznej" ++ ++msgid "Redirect matched incoming traffic to the specified internal host" ++msgstr "Przekieruj ruch przychodzÄ…cy do wskazanego hosta w sieci wewnÄ™trznej" ++ ++msgid "Restrict Masquerading to given destination subnets" ++msgstr "Ogranicz maskaradÄ™ do wskazanych sieci docelowych" ++ ++msgid "Restrict Masquerading to given source subnets" ++msgstr "Ogranicz maskaradÄ™ do wskazanych sieci źródÅ‚owych" ++ ++# WstawiÅ‚em rodzinÄ™ gdyż gdzieÅ› wczeÅ›niej byÅ‚o tak opisane ale klasa pasuje mi tu bardziej. ++# Obsy - niestety ale "rodzina". W gui dotyczy to wyboru IPv4/IPv6, wiÄ™c "rodzina" a nie klasa. ++msgid "Restrict to address family" ++msgstr "Ogranicz do rodziny adresów" ++ ++# DosÅ‚ownie przetÅ‚umaczone, nie bardzo wiem czy chodzi o czynność przepisywania pakietu przez usÅ‚ugÄ™ czy to jakieÅ› ogólne sformuÅ‚owanie... ++msgid "Rewrite matched traffic to the given address." ++msgstr "Przepisz dopasowany ruch do wskazanych adresów." ++ ++# Jak wyżej chodzi o przepisanie pakietu przez usÅ‚ugÄ™? ++msgid "" ++"Rewrite matched traffic to the given source port. May be left empty to only " ++"rewrite the IP address." ++msgstr "" ++"Przepisz dopasowany ruch do danego portu źródÅ‚owego. Można zostawić puste " ++"aby przepisać tylko adres IP" ++ ++msgid "Rewrite to source %s" ++msgstr "Przepisz do źródÅ‚a %s" ++ ++msgid "Rewrite to source %s, %s" ++msgstr "Przepisz do źródÅ‚a %s, %s" ++ ++msgid "SNAT IP address" ++msgstr "Adres IP SNAT" ++ ++msgid "SNAT port" ++msgstr "Port SNAT" ++ ++msgid "Source IP address" ++msgstr "ŹródÅ‚owy adres IP" ++ ++msgid "Source MAC address" ++msgstr "ŹródÅ‚owy adres MAC" ++ ++msgid "Source NAT" ++msgstr "NAT źródÅ‚owy" ++ ++# http://www.digipedia.pl/def/doc/id/677604507/name/SNAT/ ++msgid "" ++"Source NAT is a specific form of masquerading which allows fine grained " ++"control over the source IP used for outgoing traffic, for example to map " ++"multiple WAN addresses to internal subnets." ++msgstr "" ++"SNAT używany jest wtedy, gdy zmieniane sÄ… adresy pakietów poÅ‚Ä…czenia " ++"wychodzÄ…cego, czyli pakiety źródÅ‚owe. Wykonywany jest zawsze po routowaniu " ++"(POSTROUTING), a wiÄ™c w chwili, gdy pakiety sÄ… gotowe opuÅ›cić host. " ++"IPmasquerading jest formÄ… SNAT." ++ ++msgid "Source address" ++msgstr "Adres źródÅ‚owy" ++ ++msgid "Source port" ++msgstr "Port źródÅ‚owy" ++ ++msgid "Source zone" ++msgstr "Strefa źródÅ‚owa" ++ ++msgid "" ++"The firewall creates zones over your network interfaces to control network " ++"traffic flow." ++msgstr "" ++"Firewall tworzy strefy z Twoich interfejsów sieciowych, aby kontrolować ruch " ++"sieciowy." ++ ++msgid "" ++"The options below control the forwarding policies between this zone (%s) and " ++"other zones. Destination zones cover forwarded traffic " ++"originating from %q. Source zones match forwarded " ++"traffic from other zones targeted at %q. The forwarding " ++"rule is unidirectional, e.g. a forward from lan to wan does " ++"not imply a permission to forward from wan to lan as well." ++msgstr "" ++"Opcje poniżej kontrolujÄ… politykÄ™ przekazywania pomiÄ™dzy tÄ… strefÄ… (%s) a " ++"innymi strefami. Strefy docelowe obejmujÄ… przekazywany ruch " ++"pochodzÄ…cy z %q. Strefy źródÅ‚owe match forwarded " ++"traffic from other zones skierowane do %q. ReguÅ‚a " ++"przekazywania jest jednokierunkowa, np. przekazywanie z sieci LAN " ++"do WAN nie implikuje pozwolenia na przekazywanie z sieci WAN do LAN." ++ ++msgid "" ++"This page allows you to change advanced properties of the port forwarding " ++"entry. In most cases there is no need to modify those settings." ++msgstr "" ++"Ta strona pozwala zmienić zaawansowane ustawienia przekierowania portów. W " ++"wiÄ™kszoÅ›ci przypadków nie ma potrzeby zmieniać tych ustawieÅ„." ++ ++msgid "" ++"This page allows you to change advanced properties of the traffic rule " ++"entry, such as matched source and destination hosts." ++msgstr "" ++"Ta strona pozwala zmienić zaawansowane ustawienia reguÅ‚y ruchu sieciowego, " ++"takie jak pasujÄ…ce źródÅ‚o i hosty docelowe." ++ ++#, fuzzy ++msgid "" ++"This section defines common properties of %q. The input and " ++"output options set the default policies for traffic entering and " ++"leaving this zone while the forward option describes the policy for " ++"forwarded traffic between different networks within the zone. Covered " ++"networks specifies which available networks are members of this zone." ++msgstr "" ++"Ta sekcja definiuje ustawienia ogólne %q. Opcje \"wejÅ›cie\" i " ++"\"wyjÅ›cie\" okreÅ›lajÄ… domyÅ›lnÄ… politykÄ™ dla ruchu przychodzÄ…cego i " ++"wychodzÄ…cego w tej strefie, podczas gdy \"przekazywanie\" opisuje " ++"politykÄ™ ruchu przekazywanego pomiÄ™dzy różnymi sieciami wewnÄ…trz strefy. " ++"ObjÄ™te sieci okreÅ›lajÄ… dostÄ™pne sieci bÄ™dÄ…ce czÅ‚onkami tej strefy." ++ ++msgid "To %s at %s on this device" ++msgstr "Do %s w %s na tym urzÄ…dzeniu" ++ ++msgid "To %s in %s" ++msgstr "Do %s w %s" ++ ++msgid "To %s on this device" ++msgstr "Do %s na tym urzÄ…dzeniu" ++ ++msgid "To %s, %s in %s" ++msgstr "Do %s, %s w %s" ++ ++msgid "To source IP" ++msgstr "Do źródÅ‚owego IP" ++ ++msgid "To source port" ++msgstr "Do źródÅ‚owego portu" ++ ++msgid "Traffic Rules" ++msgstr "ReguÅ‚y ruchu sieciowego" ++ ++msgid "" ++"Traffic rules define policies for packets traveling between different zones, " ++"for example to reject traffic between certain hosts or to open WAN ports on " ++"the router." ++msgstr "" ++"ReguÅ‚y ruchu sieciowego definiujÄ… politykÄ™ dla pakietów przechodzÄ…cych " ++"miÄ™dzy strefami, na przykÅ‚ad aby odrzucać ruch miÄ™dzy konkretnymi hostami " ++"albo otworzyć porty WAN routera." ++ ++msgid "Via %s" ++msgstr "Przez %s" ++ ++msgid "Via %s at %s" ++msgstr "Przez %s w %s" ++ ++msgid "" ++"You may specify multiple by selecting \"-- custom --\" and then entering " ++"protocols separated by space." ++msgstr "" ++"Możesz okreÅ›lić kilka wybierajÄ…c \"-- wÅ‚asne --\" i wpisujÄ…c protokoÅ‚y " ++"rozdzielone spacjÄ…." ++ ++msgid "Zone %q" ++msgstr "Strefa %q" ++ ++msgid "Zone ⇒ Forwardings" ++msgstr "Strefa ⇒ Przekazywanie" ++ ++msgid "Zones" ++msgstr "Strefy" ++ ++msgid "accept" ++msgstr "akceptuj" ++ ++msgid "any" ++msgstr "dowolny" ++ ++msgid "any host" ++msgstr "dowolny host" ++ ++msgid "any router IP" ++msgstr "dowolne IP routera" ++ ++msgid "any zone" ++msgstr "dowolna strefa" ++ ++msgid "don't track" ++msgstr "nie Å›ledź" ++ ++msgid "drop" ++msgstr "porzucaj" ++ ++msgid "reject" ++msgstr "odrzucaj" ++ ++msgid "traffic" ++msgstr "" ++ ++#~ msgid "Destination" ++#~ msgstr "Miejsce przeznaczenia" ++ ++#~ msgid "Family" ++#~ msgstr "Rodzina" ++ ++#~ msgid "Forward to %s in %s" ++#~ msgstr "Przekazuj do %s w %s" ++ ++#~ msgid "Forward to %s, %s in %s" ++#~ msgstr "Przekazuj d0 %s, %s w %s" ++ ++#~ msgid "SNAT" ++#~ msgstr "SNAT" ++ ++#~ msgid "Source" ++#~ msgstr "ŹródÅ‚o" ++ ++#~ msgid "To %s" ++#~ msgstr "Do %s" ++ ++#~ msgid "Via" ++#~ msgstr "przez" ++ ++#~ msgid "Accept forward" ++#~ msgstr "Akceptuj przekazywanie" ++ ++#~ msgid "Accept input" ++#~ msgstr "Akceptuj wejÅ›cie" ++ ++#~ msgid "Disable" ++#~ msgstr "WyÅ‚Ä…cz" ++ ++#~ msgid "Discard forward" ++#~ msgstr "Odrzuć przekazywanie" ++ ++#~ msgid "Discard input" ++#~ msgstr "Odrzuć wejÅ›cie" ++ ++#~ msgid "Do not track forward" ++#~ msgstr "Nie Å›ledź przekazywania" ++ ++#~ msgid "Do not track input" ++#~ msgstr "Nie Å›ledź wejÅ›cia" ++ ++#~ msgid "IP" ++#~ msgstr "IP" ++ ++#~ msgid "IP range" ++#~ msgstr "Zakres IP" ++ ++#~ msgid "IPs" ++#~ msgstr "Numery IP" ++ ++#~ msgid "MAC" ++#~ msgstr "MAC" ++ ++#~ msgid "MACs" ++#~ msgstr "Adresy MAC" ++ ++#~ msgid "Rule is disabled" ++#~ msgstr "ReguÅ‚a jest wyÅ‚Ä…czona" ++ ++#~ msgid "Rule is enabled" ++#~ msgstr "ReguÅ‚a jest wÅ‚Ä…czona" ++ ++#~ msgid "day" ++#~ msgstr "dzieÅ„" ++ ++#~ msgid "port" ++#~ msgstr "port" ++ ++#~ msgid "ports" ++#~ msgstr "porty" ++ ++#~ msgid "(optional)" ++#~ msgstr "(opcjonalne)" ++ ++#~ msgid "Internal port (optional)" ++#~ msgstr "WewnÄ™trzny port (opcjonalnie)" ++ ++#~ msgid "Advanced Options" ++#~ msgstr "Opcje zaawansowane" ++ ++# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # ++# Generated from applications/luci-fw/luasrc/model/cbi/luci_fw/trule.lua # ++# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # ++# msgid "Name" ++# msgstr "" ++# msgid "(optional)" ++# msgstr "" ++# msgid "Protocol" ++# msgstr "" ++# msgid "Source port" ++# msgstr "" ++# msgid "Destination port" ++# msgstr "" ++# msgid "Action" ++# msgstr "" ++# msgid "drop" ++# msgstr "" ++# msgid "accept" ++# msgstr "" ++# msgid "reject" ++# msgstr "" ++#~ msgid "Advanced Rules" ++#~ msgstr "ReguÅ‚y zaawansowane" ++ ++#~ msgid "" ++#~ "Advanced rules let you customize the firewall to your needs. Only new " ++#~ "connections will be matched. Packets belonging to already open " ++#~ "connections are automatically allowed to pass the firewall." ++#~ msgstr "" ++#~ "ReguÅ‚y zaawansowane pozwalajÄ… dostosować zaporÄ™ do Twoich potrzeb. Tylko " ++#~ "nowe poÅ‚Ä…czenia zostanÄ… nimi objÄ™te. Pakiety należące do poÅ‚Ä…czeÅ„ już " ++#~ "otwarte sÄ… automatycznie przepuszczane przez zaporÄ™." ++ ++#~ msgid "Custom Rules (/etc/firewall.user)" ++#~ msgstr "ReguÅ‚y wÅ‚asne (/etc/firewall.user)" ++ ++#~ msgid "Device" ++#~ msgstr "UrzÄ…dzenie" ++ ++#~ msgid "" ++#~ "For DNAT, match incoming traffic directed at the given destination ip " ++#~ "address. For SNAT rewrite the source address to the given address." ++#~ msgstr "" ++#~ "Dla DNAT, dopasuj ruch przychodzÄ…cy kierowane na podany adres IP. Dla " ++#~ "SNAT zmienić adres źródÅ‚owy na podany adres." +diff --git a/feeds/luci/applications/luci-app-firewall/po/pt-br/firewall.po b/feeds/luci/applications/luci-app-firewall/po/pt-br/firewall.po +new file mode 100644 +index 0000000..f32f70e +--- /dev/null ++++ b/feeds/luci/applications/luci-app-firewall/po/pt-br/firewall.po +@@ -0,0 +1,740 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Report-Msgid-Bugs-To: \n" ++"POT-Creation-Date: 2010-03-30 17:00+0200\n" ++"PO-Revision-Date: 2014-06-21 19:03+0200\n" ++"Last-Translator: Éder \n" ++"Language-Team: LANGUAGE \n" ++"Language: pt_BR\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n > 1);\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "%s in %s" ++msgstr "%s in %s" ++ ++msgid "%s%s with %s" ++msgstr "%s%s com %s" ++ ++msgid "%s, %s in %s" ++msgstr "%s, %s em %s" ++ ++msgid "(Unnamed Entry)" ++msgstr "(Entrada Sem Nome)" ++ ++msgid "(Unnamed Rule)" ++msgstr "(Regra Sem Nome)" ++ ++msgid "(Unnamed SNAT)" ++msgstr "(SNAT Sem Nome)" ++ ++msgid "-- Please choose --" ++msgstr "-- Por favor, escolha --" ++ ++msgid "-- custom --" ++msgstr "-- personalizado --" ++ ++msgid "%d pkts. per %s" ++msgstr "%d pcts. por %s" ++ ++msgid "%d pkts. per %s, burst %d pkts." ++msgstr "%d pcts. por %s, pico %d pcts." ++ ++msgid "%s and limit to %s" ++msgstr "%s e limite a %s" ++ ++msgid "Action" ++msgstr "Ação" ++ ++msgid "Add" ++msgstr "Adicionar" ++ ++msgid "Add and edit..." ++msgstr "Adicionar e editar..." ++ ++msgid "Advanced Settings" ++msgstr "Configurações Avançadas" ++ ++msgid "Allow forward from source zones:" ++msgstr "Permite o encaminhamento da zona de origem:" ++ ++msgid "Allow forward to destination zones:" ++msgstr "Permite o encaminhamento para a zona de destino:" ++ ++msgid "Any" ++msgstr "Qualquer" ++ ++msgid "Covered networks" ++msgstr "Redes cobertas" ++ ++msgid "Custom Rules" ++msgstr "Regras Personalizadas" ++ ++msgid "" ++"Custom rules allow you to execute arbritary iptables commands which are not " ++"otherwise covered by the firewall framework. The commands are executed after " ++"each firewall restart, right after the default ruleset has been loaded." ++msgstr "" ++"As regras personalizadas permitem executar comandos iptables arbitrários não " ++"cobertos por esta ferramenta. Os comandos serão executados após cada " ++"reinício do firewall, logo após a carga do conjunto de regras padrão." ++ ++msgid "Destination IP address" ++msgstr "Endereço IP de destino" ++ ++msgid "Destination address" ++msgstr "Endereço de destino" ++ ++msgid "Destination port" ++msgstr "Porta de destino" ++ ++msgid "Destination zone" ++msgstr "Zona de destino" ++ ++msgid "Do not rewrite" ++msgstr "Não sobrescreva" ++ ++msgid "Drop invalid packets" ++msgstr "Descartar pacotes inválidos" ++ ++msgid "Enable" ++msgstr "Habilitar" ++ ++msgid "Enable NAT Loopback" ++msgstr "Habilite o Loopback do NAT" ++ ++msgid "Enable SYN-flood protection" ++msgstr "Habilite proteção contra SYN-flood" ++ ++msgid "Enable logging on this zone" ++msgstr "Habilite o registro nesta zona" ++ ++msgid "External IP address" ++msgstr "Endereço IP externo" ++ ++msgid "External port" ++msgstr "Porta Externa" ++ ++msgid "External zone" ++msgstr "Zona externa" ++ ++msgid "Extra arguments" ++msgstr "Argumentos extras" ++ ++msgid "Firewall" ++msgstr "Firewall" ++ ++msgid "Firewall - Custom Rules" ++msgstr "Firewall - Regras personalizadas" ++ ++msgid "Firewall - Port Forwards" ++msgstr "Firewall - Encaminhamento de Portas" ++ ++msgid "Firewall - Traffic Rules" ++msgstr "Firewall - Regras de Tráfego" ++ ++msgid "Firewall - Zone Settings" ++msgstr "Firewall - Configurações de Zona" ++ ++msgid "Force connection tracking" ++msgstr "Force o rastreamento da conexão" ++ ++msgid "Forward" ++msgstr "Encaminhar" ++ ++msgid "Forward to" ++msgstr "Encaminhar para" ++ ++msgid "From %s in %s" ++msgstr "Vindo de %s em %s" ++ ++msgid "From %s in %s with source %s" ++msgstr "Vindo de %s em %s com origem %s" ++ ++msgid "From %s in %s with source %s and %s" ++msgstr "Vindo de %s em %s com origem %s e %s" ++ ++msgid "General Settings" ++msgstr "Configurações Gerais" ++ ++msgid "IPv4" ++msgstr "IPv4" ++ ++msgid "IPv4 and IPv6" ++msgstr "IPv4 e IPv6" ++ ++msgid "IPv4 only" ++msgstr "Somente IPv4" ++ ++msgid "IPv6" ++msgstr "IPv6" ++ ++msgid "IPv6 only" ++msgstr "Somente IPv6" ++ ++msgid "Input" ++msgstr "Entrada" ++ ++msgid "Inter-Zone Forwarding" ++msgstr "Encaminhamento entre Zonas" ++ ++msgid "Internal IP address" ++msgstr "Endereço IP interno" ++ ++msgid "Internal port" ++msgstr "Porta Interna" ++ ++msgid "Internal zone" ++msgstr "Zona interna" ++ ++msgid "Limit log messages" ++msgstr "Limita as mensagens de registro" ++ ++msgid "MSS clamping" ++msgstr "Ajuste do MSS" ++ ++msgid "Masquerading" ++msgstr "Mascaramento" ++ ++msgid "Match" ++msgstr "casol" ++ ++msgid "Match ICMP type" ++msgstr "Casa com ICMP tipo" ++ ++msgid "Match forwarded traffic to the given destination port or port range." ++msgstr "" ++"Casa o tráfego encaminhado para uma porta ou faixa de portas de destino " ++"específica." ++ ++msgid "" ++"Match incoming traffic directed at the given destination port or port range " ++"on this host" ++msgstr "" ++"Casa o tráfego entrante direcionado para uma porta ou faixa de portas de " ++"destino específica neste computador" ++ ++msgid "" ++"Match incoming traffic originating from the given source port or port range " ++"on the client host." ++msgstr "" ++"Casa o tráfego entrante originado de uma porta ou faixa de portas no " ++"equipamento cliente." ++ ++msgid "Name" ++msgstr "Nome" ++ ++msgid "New SNAT rule" ++msgstr "Nova regra de SNAT" ++ ++msgid "New forward rule" ++msgstr "Nova regra de encaminhamento" ++ ++msgid "New input rule" ++msgstr "Nova regra de entrada" ++ ++msgid "New port forward" ++msgstr "Novo encaminhamento de porta" ++ ++msgid "New source NAT" ++msgstr "Nova origem NAT" ++ ++msgid "Only match incoming traffic directed at the given IP address." ++msgstr "" ++"Somente case o tráfego entrante direcionado para o endereço IP fornecido." ++ ++msgid "Only match incoming traffic from these MACs." ++msgstr "Somente case o tráfego entrante destes endereços MAC." ++ ++msgid "Only match incoming traffic from this IP or range." ++msgstr "Somente case o tráfego entrante desta faixa de endereços IP." ++ ++msgid "" ++"Only match incoming traffic originating from the given source port or port " ++"range on the client host" ++msgstr "" ++"Somente case o tráfego entrante vindo da porta de origem fornecida ou " ++"intervalo de portas no equipamento cliente" ++ ++msgid "Open ports on router" ++msgstr "Abrir portas no roteador" ++ ++msgid "Other..." ++msgstr "Outro..." ++ ++msgid "Output" ++msgstr "Saída" ++ ++msgid "Passes additional arguments to iptables. Use with care!" ++msgstr "Passa argumentos adicionais para o iptables. Use com cuidado!" ++ ++msgid "Port Forwards" ++msgstr "Encaminhamentos de Porta" ++ ++msgid "" ++"Port forwarding allows remote computers on the Internet to connect to a " ++"specific computer or service within the private LAN." ++msgstr "" ++"O encaminhamento de portas permite que computadores remotos na Internet " ++"conectem a um computador ou serviço específico dentro da rede local privada." ++ ++msgid "Protocol" ++msgstr "Protocolo" ++ ++msgid "" ++"Redirect matched incoming traffic to the given port on the internal host" ++msgstr "" ++"Redireciona tráfego entrante para a porta especificada no computador interno" ++ ++msgid "Redirect matched incoming traffic to the specified internal host" ++msgstr "Redireciona tráfego entrante para o computador interno especificado" ++ ++msgid "Restrict Masquerading to given destination subnets" ++msgstr "Restringe o mascaramento para uma subrede de destino específica" ++ ++msgid "Restrict Masquerading to given source subnets" ++msgstr "Restringe o mascaramento para uma subrede de origem específica" ++ ++msgid "Restrict to address family" ++msgstr "Restringe para uma família de endereços" ++ ++msgid "Rewrite matched traffic to the given address." ++msgstr "Reescreva o tráfego correspondente para o endereço fornecido." ++ ++msgid "" ++"Rewrite matched traffic to the given source port. May be left empty to only " ++"rewrite the IP address." ++msgstr "" ++"Reescreva o tráfego correspondente para a porta de origem fornecida. Pode " ++"ficar em branco para somente reescrever o endereço IP." ++ ++msgid "Rewrite to source %s" ++msgstr "Reescrever para a origem %s" ++ ++msgid "Rewrite to source %s, %s" ++msgstr "Reescrever para a origem %s, %s" ++ ++msgid "SNAT IP address" ++msgstr "Endereço IP da SNAT" ++ ++msgid "SNAT port" ++msgstr "Porta da SNAT" ++ ++msgid "Source IP address" ++msgstr "Endereço IP de origem" ++ ++msgid "Source MAC address" ++msgstr "Endereço MAC de origem" ++ ++msgid "Source NAT" ++msgstr "NAT origem" ++ ++msgid "" ++"Source NAT is a specific form of masquerading which allows fine grained " ++"control over the source IP used for outgoing traffic, for example to map " ++"multiple WAN addresses to internal subnets." ++msgstr "" ++"NAT origem é uma forma específica de mascaramento que permite o controle " ++"fino do endereço IP de origem usado no tráfego sainte. Por exemplo, para " ++"mapear múltiplos endereços WAN para subredes internas." ++ ++msgid "Source address" ++msgstr "Endereço de origem" ++ ++msgid "Source port" ++msgstr "Porta de origem" ++ ++msgid "Source zone" ++msgstr "Zona de origem" ++ ++msgid "" ++"The firewall creates zones over your network interfaces to control network " ++"traffic flow." ++msgstr "" ++"O firewall cria zonas sobre as interfaces de rede para controlar o fluxo do " ++"tráfego de rede." ++ ++msgid "" ++"The options below control the forwarding policies between this zone (%s) and " ++"other zones. Destination zones cover forwarded traffic " ++"originating from %q. Source zones match forwarded " ++"traffic from other zones targeted at %q. The forwarding " ++"rule is unidirectional, e.g. a forward from lan to wan does " ++"not imply a permission to forward from wan to lan as well." ++msgstr "" ++"As opções abaixo controlam as políticas de encaminhamento entre esta zona " ++"(%s) e outras zonas. Zonas de destino incluem tráfego encaminhado " ++"originado de %q. Zonas de origem casam com tráfego " ++"encaminhado de outras zonas apontando para %q. A regra de " ++"encaminhamento é unidirecional, ex: um encaminhamento da LAN para " ++"WAN não implica na permissão de encaminhar da WAN para LAN." ++ ++msgid "" ++"This page allows you to change advanced properties of the port forwarding " ++"entry. In most cases there is no need to modify those settings." ++msgstr "" ++"Esta página permite que você mude propriedades avançadas da entrada do " ++"encaminhamento de porta. Na maioria dos casos, não é necessário modificar " ++"estas configurações." ++ ++msgid "" ++"This page allows you to change advanced properties of the traffic rule " ++"entry, such as matched source and destination hosts." ++msgstr "" ++"Esta página permite que você mude propriedades avançadas da entrada da regra " ++"de tráfego, como os equipamentos de origem e destino." ++ ++#, fuzzy ++msgid "" ++"This section defines common properties of %q. The input and " ++"output options set the default policies for traffic entering and " ++"leaving this zone while the forward option describes the policy for " ++"forwarded traffic between different networks within the zone. Covered " ++"networks specifies which available networks are members of this zone." ++msgstr "" ++"Esta seção define as propriedades comuns de %q. As opções de entrada e saída definem as políticas padrão para o tráfego entrando e " ++"saindo desta zona, enquanto a opção de encaminhamento descreve a " ++"política para encaminhar o tráfego entre diferentes redes dentro da zona. " ++"Redes Cobertas especificam que redes disponíveis são membros desta " ++"zona." ++ ++msgid "To %s at %s on this device" ++msgstr "Para %s em %s neste dispositivo" ++ ++msgid "To %s in %s" ++msgstr "Para %s em %s" ++ ++msgid "To %s on this device" ++msgstr "Para %s neste dispositivo" ++ ++msgid "To %s, %s in %s" ++msgstr "Para %s, %s em %s" ++ ++msgid "To source IP" ++msgstr "Para o endereço IP de origem" ++ ++msgid "To source port" ++msgstr "Para a porta de origem" ++ ++msgid "Traffic Rules" ++msgstr "Regras de tráfego" ++ ++msgid "" ++"Traffic rules define policies for packets traveling between different zones, " ++"for example to reject traffic between certain hosts or to open WAN ports on " ++"the router." ++msgstr "" ++"Regras de tráfego definem políticas para a passagem de pacotes entre as " ++"diferentes zonas. Por exemplo, rejeitar o tráfego entre certos equipamentos " ++"ou abrir portas WAN no roteador." ++ ++msgid "Via %s" ++msgstr "Via %s" ++ ++msgid "Via %s at %s" ++msgstr "Via %s at %s" ++ ++msgid "" ++"You may specify multiple by selecting \"-- custom --\" and then entering " ++"protocols separated by space." ++msgstr "" ++"Você pode especificar múltiplas entradas selecionando \"-- personalizado --" ++"\" e então entrando os protocolos separados por espaço." ++ ++msgid "Zone %q" ++msgstr "Zona %q" ++ ++msgid "Zone ⇒ Forwardings" ++msgstr "Zona ⇒ Encaminhamentos" ++ ++msgid "Zones" ++msgstr "Zonas" ++ ++msgid "accept" ++msgstr "aceitar" ++ ++msgid "any" ++msgstr "qualquer" ++ ++msgid "any host" ++msgstr "qualquer equipamento" ++ ++msgid "any router IP" ++msgstr "qualquer endereço IP do roteador" ++ ++msgid "any zone" ++msgstr "qualquer zona" ++ ++msgid "don't track" ++msgstr "não rastrear" ++ ++msgid "drop" ++msgstr "descartar" ++ ++msgid "reject" ++msgstr "rejeitar" ++ ++# 20140621: edersg: tradução ++msgid "traffic" ++msgstr "Tráfego" ++ ++#~ msgid "Destination" ++#~ msgstr "Destino" ++ ++#~ msgid "Family" ++#~ msgstr "Família" ++ ++#~ msgid "Forward to %s in %s" ++#~ msgstr "Encaminhar para %s em %s" ++ ++#~ msgid "Forward to %s, %s in %s" ++#~ msgstr "Encaminhar para %s, %s em %s" ++ ++#~ msgid "SNAT" ++#~ msgstr "SNAT" ++ ++#~ msgid "Source" ++#~ msgstr "Origem" ++ ++#~ msgid "To %s" ++#~ msgstr "Para %s" ++ ++#~ msgid "To %s at %s" ++#~ msgstr "Para %s em %s" ++ ++#~ msgid "Via" ++#~ msgstr "Via" ++ ++#~ msgid "Accept forward" ++#~ msgstr "Aceitar encaminhamento" ++ ++#~ msgid "Accept input" ++#~ msgstr "Aceitar entrada" ++ ++#~ msgid "Disable" ++#~ msgstr "Desabilitado" ++ ++#~ msgid "Discard forward" ++#~ msgstr "Descartar o encaminhamento" ++ ++#~ msgid "Discard input" ++#~ msgstr "Descartar a entrada" ++ ++#~ msgid "Do not track forward" ++#~ msgstr "Não rastreie o encaminhamento" ++ ++#~ msgid "Do not track input" ++#~ msgstr "Não rastreie a entrada" ++ ++#~ msgid "IP" ++#~ msgstr "Endereço IP" ++ ++#~ msgid "IP range" ++#~ msgstr "Faixa de endereço IP" ++ ++#~ msgid "IPs" ++#~ msgstr "Endereços IP" ++ ++#~ msgid "MAC" ++#~ msgstr "MAC" ++ ++#~ msgid "MACs" ++#~ msgstr "MACs" ++ ++#~ msgid "Refuse forward" ++#~ msgstr "Rejeitar encaminhamento" ++ ++#~ msgid "Refuse input" ++#~ msgstr "Rejeitar entrada" ++ ++#~ msgid "Rule is disabled" ++#~ msgstr "A regra está desabilitada" ++ ++#~ msgid "Rule is enabled" ++#~ msgstr "A regra está habilitada" ++ ++#~ msgid "day" ++#~ msgstr "dia" ++ ++#~ msgid "hour" ++#~ msgstr "hora" ++ ++#~ msgid "minute" ++#~ msgstr "minuto" ++ ++#~ msgid "not" ++#~ msgstr "não" ++ ++#~ msgid "port" ++#~ msgstr "porta" ++ ++#~ msgid "ports" ++#~ msgstr "portas" ++ ++#~ msgid "second" ++#~ msgstr "segundo" ++ ++#~ msgid "type" ++#~ msgstr "tipo" ++ ++#~ msgid "types" ++#~ msgstr "tipos" ++ ++#~ msgid "(optional)" ++#~ msgstr "(opcional)" ++ ++#~ msgid "Intended destination address" ++#~ msgstr "Endereço de destino planejado" ++ ++#~ msgid "Internal port (optional)" ++#~ msgstr "Porta interna (opcional)" ++ ++#~ msgid "Advanced Options" ++#~ msgstr "Opções Avançadas" ++ ++#~ msgid "Advanced Rules" ++#~ msgstr "Regras Avançadas" ++ ++#~ msgid "" ++#~ "Advanced rules let you customize the firewall to your needs. Only new " ++#~ "connections will be matched. Packets belonging to already open " ++#~ "connections are automatically allowed to pass the firewall." ++#~ msgstr "" ++#~ "As regras avançadas permitem a personalização da firewall de acordo com " ++#~ "as necessidades. Apenas as novas conexões serão processadas. Pacotes que " ++#~ "pertençam a conexões já abertas estão automaticamente autorizados a " ++#~ "passar pelo firewall." ++ ++#~ msgid "Custom Rules (/etc/firewall.user)" ++#~ msgstr "Regras Personalizadas (/etc/firewall.user)" ++ ++#~ msgid "Device" ++#~ msgstr "Dispositivo" ++ ++#~ msgid "" ++#~ "For DNAT, match incoming traffic directed at the given destination ip " ++#~ "address. For SNAT rewrite the source address to the given address." ++#~ msgstr "" ++#~ "Para DNAT, casa com tráfego entrante direcionado para um dado endereço IP " ++#~ "de destino. Para SNAT, reescreve o endereço de origem para um dado " ++#~ "endereço." ++ ++#~ msgid "" ++#~ "Match incoming traffic originating from the given source port or port " ++#~ "range on the client host" ++#~ msgstr "" ++#~ "Casa o tráfego entrante originado de uma porta ou faixa de portas de " ++#~ "origem específica no computador do cliente" ++ ++#~ msgid "Overview" ++#~ msgstr "Visão geral" ++ ++#~ msgid "Port forwarding" ++#~ msgstr "Redirecionamento de portas" ++ ++#~ msgid "" ++#~ "Port forwarding allows to provide network services in the internal " ++#~ "network to an external network." ++#~ msgstr "" ++#~ "O redirecionamento de portas permite disponibilizar serviços da rede " ++#~ "interna para uma rede externa." ++ ++#~ msgid "Redirection type" ++#~ msgstr "Tipo de redirecionamento" ++ ++#~ msgid "Redirections" ++#~ msgstr "Redirecionamentos" ++ ++#~ msgid "Rules" ++#~ msgstr "Regras" ++ ++#~ msgid "Traffic Redirection" ++#~ msgstr "Redirecionamento de Tráfego" ++ ++#~ msgid "" ++#~ "Traffic redirection allows you to change the destination address of " ++#~ "forwarded packets." ++#~ msgstr "" ++#~ "Redirecionamento do tráfego permite a alteração do endereço de destino " ++#~ "dos pacotes encaminhados." ++ ++#, fuzzy ++#~ msgid "Network" ++#~ msgstr "Redes" ++ ++#~ msgid "Traffic Control" ++#~ msgstr "Controle de Tráfego" ++ ++#~ msgid "Zone-to-Zone traffic" ++#~ msgstr "Tráfego de Zona-para-Zona" ++ ++#, fuzzy ++#~ msgid "" ++#~ "Here you can specify which network traffic is allowed to flow between " ++#~ "network zones. Only new connections will be matched. Packets belonging " ++#~ "to already open connections are automatically allowed to pass the " ++#~ "firewall. If you experience occasional connection problems try enabling " ++#~ "MSS Clamping otherwise disable it for performance reasons." ++#~ msgstr "" ++#~ "Aqui você pode especificar qual tráfego de rede será permitido para o " ++#~ "fluxo entre zonas das redes. Somente novas conexões serão processadas. " ++#~ "Pacotes pertencentes à conexões já abertas estão automaticamente " ++#~ "permitidos para passar pelo firewall." ++ ++#~ msgid "Zone" ++#~ msgstr "Zona" ++ ++#, fuzzy ++#~ msgid "Destination IP" ++#~ msgstr "Destino" ++ ++#, fuzzy ++#~ msgid "IP address" ++#~ msgstr "Endereço IP" ++ ++#, fuzzy ++#~ msgid "Source MAC-address" ++#~ msgstr "Endereço MAC de origem" ++ ++#~ msgid "Custom forwarding" ++#~ msgstr "Redirecionamento personalizado" ++ ++#~ msgid "Input Zone" ++#~ msgstr "Zona de Entrada" ++ ++#~ msgid "Output Zone" ++#~ msgstr "Zona de Saída" ++ ++#~ msgid "External Zone" ++#~ msgstr "Zona Externa" ++ ++#~ msgid "Source MAC" ++#~ msgstr "MAC de origem" ++ ++#~ msgid "Defaults" ++#~ msgstr "Padrões" ++ ++#~ msgid "" ++#~ "These are the default settings that are used if no other rules match." ++#~ msgstr "" ++#~ "Estas são as configurações padrões, que serão usadas se não houver outras " ++#~ "regras." ++ ++#~ msgid "" ++#~ "Zones part the network interfaces into certain isolated areas to separate " ++#~ "network traffic. One or more networks can belong to a zone. The MASQ-flag " ++#~ "enables NAT masquerading for all outgoing traffic on this zone." ++#~ msgstr "" ++#~ "Zonas são interfaces de redes usadas para separar o tráfego da rede. Uma " ++#~ "ou mais redes podem pertencer a uma zona. A flag-MASQ ativa o " ++#~ "mascaramento NAT para todo o tráfego de saída desta zona." ++ ++#~ msgid "MASQ" ++#~ msgstr "MASQ" ++ ++#~ msgid "contained networks" ++#~ msgstr "redes contidas" +diff --git a/feeds/luci/applications/luci-app-firewall/po/pt/firewall.po b/feeds/luci/applications/luci-app-firewall/po/pt/firewall.po +new file mode 100644 +index 0000000..304e365 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-firewall/po/pt/firewall.po +@@ -0,0 +1,585 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Report-Msgid-Bugs-To: \n" ++"POT-Creation-Date: 2010-03-30 17:00+0200\n" ++"PO-Revision-Date: 2013-06-03 13:37+0200\n" ++"Last-Translator: joao.f.vieira \n" ++"Language-Team: LANGUAGE \n" ++"Language: pt\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n != 1);\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "%s in %s" ++msgstr "%s em %s" ++ ++msgid "%s%s with %s" ++msgstr "%s%s with %s" ++ ++msgid "%s, %s in %s" ++msgstr "%s, %s em %s" ++ ++msgid "(Unnamed Entry)" ++msgstr "(Entrada Sem Nome)" ++ ++msgid "(Unnamed Rule)" ++msgstr "(Regra Sem Nome)" ++ ++msgid "(Unnamed SNAT)" ++msgstr "(SNAT Sem Nome)" ++ ++msgid "-- Please choose --" ++msgstr "-- Escolha por favor --" ++ ++msgid "-- custom --" ++msgstr "-- personalizado --" ++ ++msgid "%d pkts. per %s" ++msgstr "%d pkts. por %s" ++ ++msgid "%d pkts. per %s, burst %d pkts." ++msgstr "" ++ ++msgid "%s and limit to %s" ++msgstr "" ++ ++msgid "Action" ++msgstr "Acção" ++ ++msgid "Add" ++msgstr "Adicionar" ++ ++msgid "Add and edit..." ++msgstr "Adicionar e editar..." ++ ++msgid "Advanced Settings" ++msgstr "Definições Avançadas" ++ ++msgid "Allow forward from source zones:" ++msgstr "Permitir encaminhamento de zonas de origem" ++ ++msgid "Allow forward to destination zones:" ++msgstr "Permitir encaminhamento para zonas de destino" ++ ++msgid "Any" ++msgstr "Qualquer" ++ ++msgid "Covered networks" ++msgstr "Redes abrangidas" ++ ++msgid "Custom Rules" ++msgstr "Regras Personalizadas" ++ ++msgid "" ++"Custom rules allow you to execute arbritary iptables commands which are not " ++"otherwise covered by the firewall framework. The commands are executed after " ++"each firewall restart, right after the default ruleset has been loaded." ++msgstr "" ++"As regras personalizadas permitem-lhe executar comandos arbitrários iptables " ++"os quais não são possiveis de aplicar usando a framework da firewall. Os " ++"comandos são executados a seguir ao reinicio da firewall, logo a seguir ao " ++"conjunto de regras predefinidas serem carregadas." ++ ++msgid "Destination IP address" ++msgstr "Endereço IP de destino" ++ ++msgid "Destination address" ++msgstr "Endereço de destino" ++ ++msgid "Destination port" ++msgstr "Porta de destino" ++ ++msgid "Destination zone" ++msgstr "Zona de destino" ++ ++msgid "Do not rewrite" ++msgstr "Não re-escrever" ++ ++msgid "Drop invalid packets" ++msgstr "Cancelar pacotes inválidos" ++ ++msgid "Enable" ++msgstr "Ativar" ++ ++msgid "Enable NAT Loopback" ++msgstr "Ativar NAT Loopback" ++ ++msgid "Enable SYN-flood protection" ++msgstr "Ativar a Proteção SYN-flood" ++ ++msgid "Enable logging on this zone" ++msgstr "Ativar registo nesta zona" ++ ++msgid "External IP address" ++msgstr "Endereço IP externo" ++ ++msgid "External port" ++msgstr "Porta externa" ++ ++msgid "External zone" ++msgstr "Zona externa" ++ ++msgid "Extra arguments" ++msgstr "Argumentos extra" ++ ++msgid "Firewall" ++msgstr "Firewall" ++ ++msgid "Firewall - Custom Rules" ++msgstr "Firewall - Regras Personalizadas" ++ ++msgid "Firewall - Port Forwards" ++msgstr "Firewall - Encaminhamento de Portas" ++ ++msgid "Firewall - Traffic Rules" ++msgstr "Firewall - Regras de Tráfego" ++ ++msgid "Firewall - Zone Settings" ++msgstr "Firewall - Definições de Zona" ++ ++msgid "Force connection tracking" ++msgstr "Forçar rasto de ligação" ++ ++msgid "Forward" ++msgstr "Encaminhar" ++ ++msgid "Forward to" ++msgstr "Encaminhar para" ++ ++msgid "From %s in %s" ++msgstr "De %s em %s" ++ ++msgid "From %s in %s with source %s" ++msgstr "De %s em %s com origem %s" ++ ++msgid "From %s in %s with source %s and %s" ++msgstr "De %s em %s com origem %s e %s" ++ ++msgid "General Settings" ++msgstr "Definições Gerais" ++ ++msgid "IPv4" ++msgstr "IPv4" ++ ++msgid "IPv4 and IPv6" ++msgstr "IPv4 e IPv6" ++ ++msgid "IPv4 only" ++msgstr "Só IPv4" ++ ++msgid "IPv6" ++msgstr "IPv6" ++ ++msgid "IPv6 only" ++msgstr "Só IPv6" ++ ++msgid "Input" ++msgstr "Entrada" ++ ++msgid "Inter-Zone Forwarding" ++msgstr "Encaminhamento Inter-Zona" ++ ++msgid "Internal IP address" ++msgstr "Endereço IP interno" ++ ++msgid "Internal port" ++msgstr "Porta interna" ++ ++msgid "Internal zone" ++msgstr "Zona Interna" ++ ++msgid "Limit log messages" ++msgstr "Limitar registo de mensagens" ++ ++#, fuzzy ++msgid "MSS clamping" ++msgstr "MSS-Correction" ++ ++msgid "Masquerading" ++msgstr "" ++ ++msgid "Match" ++msgstr "Corresponder" ++ ++msgid "Match ICMP type" ++msgstr "" ++ ++msgid "Match forwarded traffic to the given destination port or port range." ++msgstr "" ++"O tráfego encaminhado corresponde a uma determinada porta de destino ou " ++"intervalo de portas." ++ ++msgid "" ++"Match incoming traffic directed at the given destination port or port range " ++"on this host" ++msgstr "" ++"O tráfego de entrada corresponde a uma dada porta de destino ou intervalo de " ++"portas neste host" ++ ++msgid "" ++"Match incoming traffic originating from the given source port or port range " ++"on the client host." ++msgstr "" ++"O tráfego de entrada corresponde a uma dada porta ou de um intervalo de " ++"portas no host cliente." ++ ++msgid "Name" ++msgstr "Nome" ++ ++msgid "New SNAT rule" ++msgstr "Nova regra SNAT" ++ ++msgid "New forward rule" ++msgstr "Nova regra de encaminhamento" ++ ++msgid "New input rule" ++msgstr "Nova regra de entrada" ++ ++msgid "New port forward" ++msgstr "Novo encaminhamento de porta" ++ ++msgid "New source NAT" ++msgstr "Nova origem de NAT" ++ ++msgid "Only match incoming traffic directed at the given IP address." ++msgstr "Só se tráfego de entrada corresponder ao endereço IP fornecido." ++ ++msgid "Only match incoming traffic from these MACs." ++msgstr "Só se o tráfego de entrada corresponder a um destes MACs." ++ ++msgid "Only match incoming traffic from this IP or range." ++msgstr "Só se o tráfego de entrada corresponder a este IP ou intervalo." ++ ++msgid "" ++"Only match incoming traffic originating from the given source port or port " ++"range on the client host" ++msgstr "" ++"Só se o tráfego de entrada corresponder à porta de origem fornecida ou de um " ++"intervalo de portas no host cliente" ++ ++msgid "Open ports on router" ++msgstr "Abrir portas no router" ++ ++msgid "Other..." ++msgstr "Outro..." ++ ++msgid "Output" ++msgstr "Saída" ++ ++msgid "Passes additional arguments to iptables. Use with care!" ++msgstr "Passa argumentos adicionais para o iptables. Usar com cuidado!" ++ ++msgid "Port Forwards" ++msgstr "Encaminhamento de Portas" ++ ++msgid "" ++"Port forwarding allows remote computers on the Internet to connect to a " ++"specific computer or service within the private LAN." ++msgstr "" ++"O Encaminhamento de Portas permite que computadores remotos na internet se " ++"liguem a um computador ou serviço especifico na rede privada (LAN)." ++ ++msgid "Protocol" ++msgstr "Protocolo" ++ ++msgid "" ++"Redirect matched incoming traffic to the given port on the internal host" ++msgstr "" ++"Redirecionar a entrada de trafego correspondente à porta fornecida no host " ++"interno" ++ ++msgid "Redirect matched incoming traffic to the specified internal host" ++msgstr "Redirecionar o tráfego de entrada correspondente para o host interno" ++ ++msgid "Restrict Masquerading to given destination subnets" ++msgstr "" ++ ++msgid "Restrict Masquerading to given source subnets" ++msgstr "" ++ ++msgid "Restrict to address family" ++msgstr "Restringir a família de endereços" ++ ++msgid "Rewrite matched traffic to the given address." ++msgstr "" ++ ++msgid "" ++"Rewrite matched traffic to the given source port. May be left empty to only " ++"rewrite the IP address." ++msgstr "" ++ ++msgid "Rewrite to source %s" ++msgstr "Re-escrever para a origem %s" ++ ++msgid "Rewrite to source %s, %s" ++msgstr "Re-escrever para a origem %s, %s" ++ ++msgid "SNAT IP address" ++msgstr "Endereço IP da SNAT" ++ ++msgid "SNAT port" ++msgstr "Porta SNAT" ++ ++msgid "Source IP address" ++msgstr "Endereço IP de origem" ++ ++msgid "Source MAC address" ++msgstr "Endereço MAC de origem" ++ ++msgid "Source NAT" ++msgstr "NAT de origem" ++ ++msgid "" ++"Source NAT is a specific form of masquerading which allows fine grained " ++"control over the source IP used for outgoing traffic, for example to map " ++"multiple WAN addresses to internal subnets." ++msgstr "" ++"NAT de origem é uma forma especifica de mascarar que permite um controlo " ++"melhorado sobre o IP de origem usado para o tráfego de saída, por exemplo, " ++"para mapear múltiplos endereços para as sub-redes internas." ++ ++msgid "Source address" ++msgstr "Endereço de origem" ++ ++msgid "Source port" ++msgstr "Porta de origem" ++ ++msgid "Source zone" ++msgstr "Zona de origem" ++ ++msgid "" ++"The firewall creates zones over your network interfaces to control network " ++"traffic flow." ++msgstr "" ++"A firewall cria zonas sobre as interfaces de rede para controlar o fluxo do " ++"tráfego." ++ ++msgid "" ++"The options below control the forwarding policies between this zone (%s) and " ++"other zones. Destination zones cover forwarded traffic " ++"originating from %q. Source zones match forwarded " ++"traffic from other zones targeted at %q. The forwarding " ++"rule is unidirectional, e.g. a forward from lan to wan does " ++"not imply a permission to forward from wan to lan as well." ++msgstr "" ++ ++msgid "" ++"This page allows you to change advanced properties of the port forwarding " ++"entry. In most cases there is no need to modify those settings." ++msgstr "" ++ ++msgid "" ++"This page allows you to change advanced properties of the traffic rule " ++"entry, such as matched source and destination hosts." ++msgstr "" ++"Esta página permite-lhe alterar as definições avançadas da regra de entrada " ++"de tráfego, tal como correspondências de hosts de origem e destino." ++ ++msgid "" ++"This section defines common properties of %q. The input and " ++"output options set the default policies for traffic entering and " ++"leaving this zone while the forward option describes the policy for " ++"forwarded traffic between different networks within the zone. Covered " ++"networks specifies which available networks are members of this zone." ++msgstr "" ++ ++msgid "To %s at %s on this device" ++msgstr "Para %s no %s em este dispositivo" ++ ++msgid "To %s in %s" ++msgstr "Para %s em %s" ++ ++msgid "To %s on this device" ++msgstr "Para %s em este dispositivo" ++ ++msgid "To %s, %s in %s" ++msgstr "Para %s, %s em %s" ++ ++msgid "To source IP" ++msgstr "Para o IP de origem" ++ ++msgid "To source port" ++msgstr "Para a porta de origem" ++ ++msgid "Traffic Rules" ++msgstr "Regras de Tráfego" ++ ++msgid "" ++"Traffic rules define policies for packets traveling between different zones, " ++"for example to reject traffic between certain hosts or to open WAN ports on " ++"the router." ++msgstr "" ++"As Regras de Tráfego definem políticas para os pacotes que viajam entre " ++"diferentes zonas, por exemplo, para rejeitar trafego entre certos hosts ou " ++"para abrir portas WAN no router." ++ ++msgid "Via %s" ++msgstr "Via %s" ++ ++msgid "Via %s at %s" ++msgstr "Via %s no %s" ++ ++msgid "" ++"You may specify multiple by selecting \"-- custom --\" and then entering " ++"protocols separated by space." ++msgstr "" ++"Pode especificar múltiplos seleccionando \"-- personalizado --\" e depois " ++"introduzir os protocolos separados por espaço." ++ ++msgid "Zone %q" ++msgstr "Zona %q" ++ ++msgid "Zone ⇒ Forwardings" ++msgstr "Zona ⇒ Encaminhamentos" ++ ++msgid "Zones" ++msgstr "Zonas" ++ ++msgid "accept" ++msgstr "aceitar" ++ ++msgid "any" ++msgstr "qualquer" ++ ++msgid "any host" ++msgstr "qualquer host" ++ ++msgid "any router IP" ++msgstr "qualquer IP do router" ++ ++msgid "any zone" ++msgstr "qualquer zona" ++ ++msgid "don't track" ++msgstr "não seguir" ++ ++msgid "drop" ++msgstr "drop" ++ ++msgid "reject" ++msgstr "rejeitar" ++ ++msgid "traffic" ++msgstr "" ++ ++#~ msgid "Destination" ++#~ msgstr "Destino" ++ ++#~ msgid "Source" ++#~ msgstr "Origem" ++ ++#~ msgid "Internal port (optional)" ++#~ msgstr "Porta interna (opcional)" ++ ++#~ msgid "Advanced Rules" ++#~ msgstr "Regras Avançadas" ++ ++#~ msgid "" ++#~ "Advanced rules let you customize the firewall to your needs. Only new " ++#~ "connections will be matched. Packets belonging to already open " ++#~ "connections are automatically allowed to pass the firewall." ++#~ msgstr "" ++#~ "As regras avançadas permitem a personalização da firewall de acordo com " ++#~ "as necessidades. Apenas as novas ligações serão processadas. Pacotes que " ++#~ "pertençam a ligações já abertas estão automaticamente autorizados a " ++#~ "passar pela firewall." ++ ++#~ msgid "Port forwarding" ++#~ msgstr "Redirecionamento de portas" ++ ++#~ msgid "" ++#~ "Port forwarding allows to provide network services in the internal " ++#~ "network to an external network." ++#~ msgstr "" ++#~ "O redirecionamento de portas permite disponibilizar serviços na rede " ++#~ "interna para uma rede externa." ++ ++#~ msgid "Traffic Redirection" ++#~ msgstr "Redirecionamento de Tráfego" ++ ++#~ msgid "" ++#~ "Traffic redirection allows you to change the destination address of " ++#~ "forwarded packets." ++#~ msgstr "" ++#~ "Redirecionamento do tráfego permite a alteração do endereço de destino " ++#~ "dos pacotes enviados." ++ ++#, fuzzy ++#~ msgid "Network" ++#~ msgstr "Redes" ++ ++#~ msgid "Traffic Control" ++#~ msgstr "Controle de Tráfego" ++ ++#~ msgid "Zone-to-Zone traffic" ++#~ msgstr "Tráfego de Zona-para-Zona" ++ ++#, fuzzy ++#~ msgid "" ++#~ "Here you can specify which network traffic is allowed to flow between " ++#~ "network zones. Only new connections will be matched. Packets belonging " ++#~ "to already open connections are automatically allowed to pass the " ++#~ "firewall. If you experience occasional connection problems try enabling " ++#~ "MSS Clamping otherwise disable it for performance reasons." ++#~ msgstr "" ++#~ "Aqui você pode especificar qual tráfego de rede será permitido para o " ++#~ "fluxo entre zonas das redes. Somente novas conexões serão processadas. " ++#~ "Pacotes pertencentes à conexões já abertas estão automaticamente " ++#~ "permitidos para passar pelo firewall." ++ ++#~ msgid "Zone" ++#~ msgstr "Zona" ++ ++#, fuzzy ++#~ msgid "Destination IP" ++#~ msgstr "Destino" ++ ++#, fuzzy ++#~ msgid "IP address" ++#~ msgstr "Endereço IP" ++ ++#, fuzzy ++#~ msgid "Source MAC-address" ++#~ msgstr "Endereço MAC de origem" ++ ++#~ msgid "Custom forwarding" ++#~ msgstr "Redirecionamento personalizado" ++ ++#~ msgid "Input Zone" ++#~ msgstr "Zona de Entrada" ++ ++#~ msgid "Output Zone" ++#~ msgstr "Zona de Saída" ++ ++#~ msgid "External Zone" ++#~ msgstr "Zona Externa" ++ ++#~ msgid "Source MAC" ++#~ msgstr "MAC de origem" ++ ++#~ msgid "Defaults" ++#~ msgstr "Padrões" ++ ++#~ msgid "" ++#~ "These are the default settings that are used if no other rules match." ++#~ msgstr "" ++#~ "Estas são as configurações padrões, que serão usadas se não houver outras " ++#~ "regras." ++ ++#~ msgid "" ++#~ "Zones part the network interfaces into certain isolated areas to separate " ++#~ "network traffic. One or more networks can belong to a zone. The MASQ-flag " ++#~ "enables NAT masquerading for all outgoing traffic on this zone." ++#~ msgstr "" ++#~ "Zonas são interfaces de redes usadas para separar o tráfego da rede. Uma " ++#~ "ou mais redes podem pertencer a uma zona. A flag-MASQ ativa o " ++#~ "mascaramento NAT para todo o tráfego de saída desta zona." ++ ++#~ msgid "MASQ" ++#~ msgstr "MASQ" ++ ++#~ msgid "contained networks" ++#~ msgstr "redes contidas" +diff --git a/feeds/luci/applications/luci-app-firewall/po/ro/firewall.po b/feeds/luci/applications/luci-app-firewall/po/ro/firewall.po +new file mode 100644 +index 0000000..391b949 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-firewall/po/ro/firewall.po +@@ -0,0 +1,503 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"PO-Revision-Date: 2014-06-29 19:33+0200\n" ++"Last-Translator: xxvirusxx \n" ++"Language-Team: none\n" ++"Language: ro\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=3; plural=(n==1 ? 0 : (n==0 || (n%100 > 0 && n%100 < " ++"20)) ? 1 : 2);;\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "%s in %s" ++msgstr "%s în %s" ++ ++msgid "%s%s with %s" ++msgstr "%s%s cu %s" ++ ++msgid "%s, %s in %s" ++msgstr "%s, %s în %s" ++ ++msgid "(Unnamed Entry)" ++msgstr "(Intrare fără nume)" ++ ++msgid "(Unnamed Rule)" ++msgstr "(Regulă fără nume)" ++ ++msgid "(Unnamed SNAT)" ++msgstr "(SNAT fără nume)" ++ ++msgid "-- Please choose --" ++msgstr "-- Alege --" ++ ++msgid "-- custom --" ++msgstr "-- personalizat --" ++ ++msgid "%d pkts. per %s" ++msgstr "" ++ ++msgid "%d pkts. per %s, burst %d pkts." ++msgstr "" ++ ++msgid "%s and limit to %s" ++msgstr "" ++ ++msgid "Action" ++msgstr "AcÅ£iune" ++ ++msgid "Add" ++msgstr "Adaugă" ++ ++msgid "Add and edit..." ++msgstr "Adaugă ÅŸi editează..." ++ ++msgid "Advanced Settings" ++msgstr "Setări avansate" ++ ++msgid "Allow forward from source zones:" ++msgstr "Permite trecerea din zonele sursa." ++ ++msgid "Allow forward to destination zones:" ++msgstr "Permite trecerea catre zonele sursa." ++ ++msgid "Any" ++msgstr "Oricare" ++ ++msgid "Covered networks" ++msgstr "Retele acoperite" ++ ++msgid "Custom Rules" ++msgstr "Reguli suplimentare" ++ ++msgid "" ++"Custom rules allow you to execute arbritary iptables commands which are not " ++"otherwise covered by the firewall framework. The commands are executed after " ++"each firewall restart, right after the default ruleset has been loaded." ++msgstr "" ++ ++msgid "Destination IP address" ++msgstr "DestinaÅ£ie adresă IP" ++ ++msgid "Destination address" ++msgstr "DestinaÅ£ie adresă" ++ ++msgid "Destination port" ++msgstr "Portul destinatie" ++ ++msgid "Destination zone" ++msgstr "Zona destinatie" ++ ++msgid "Do not rewrite" ++msgstr "Nu rescrie" ++ ++msgid "Drop invalid packets" ++msgstr "Descarcă pachetele invalide" ++ ++msgid "Enable" ++msgstr "Activează" ++ ++msgid "Enable NAT Loopback" ++msgstr "Activează loopback NAT" ++ ++msgid "Enable SYN-flood protection" ++msgstr "Activează protecÅ£ia SYN-flood" ++ ++msgid "Enable logging on this zone" ++msgstr "Activeaza log in aceasta zona" ++ ++msgid "External IP address" ++msgstr "Adresă IP externă" ++ ++msgid "External port" ++msgstr "Port extern" ++ ++msgid "External zone" ++msgstr "Zonă externă" ++ ++msgid "Extra arguments" ++msgstr "" ++ ++msgid "Firewall" ++msgstr "Firewall" ++ ++msgid "Firewall - Custom Rules" ++msgstr "Firewall - Reguli particularizate" ++ ++msgid "Firewall - Port Forwards" ++msgstr "" ++ ++msgid "Firewall - Traffic Rules" ++msgstr "" ++ ++msgid "Firewall - Zone Settings" ++msgstr "Setari zona la firewall" ++ ++msgid "Force connection tracking" ++msgstr "Forteaza urmarirea conexiunilor" ++ ++msgid "Forward" ++msgstr "Forward" ++ ++msgid "Forward to" ++msgstr "" ++ ++msgid "From %s in %s" ++msgstr "" ++ ++msgid "From %s in %s with source %s" ++msgstr "" ++ ++msgid "From %s in %s with source %s and %s" ++msgstr "" ++ ++msgid "General Settings" ++msgstr "Setari generale" ++ ++msgid "IPv4" ++msgstr "IPv4" ++ ++msgid "IPv4 and IPv6" ++msgstr "IPv4 ÅŸi IPv6" ++ ++msgid "IPv4 only" ++msgstr "doar IPv4" ++ ++msgid "IPv6" ++msgstr "IPv6" ++ ++msgid "IPv6 only" ++msgstr "doar IPv6" ++ ++msgid "Input" ++msgstr "Intrare" ++ ++msgid "Inter-Zone Forwarding" ++msgstr "Forwardare intre-zone" ++ ++msgid "Internal IP address" ++msgstr "Adresa IP interna" ++ ++msgid "Internal port" ++msgstr "Port intern" ++ ++msgid "Internal zone" ++msgstr "Zonă internă" ++ ++msgid "Limit log messages" ++msgstr "Limitează mesaje în log" ++ ++msgid "MSS clamping" ++msgstr "Ajustare MSS" ++ ++msgid "Masquerading" ++msgstr "Translatare" ++ ++msgid "Match" ++msgstr "Potrivire" ++ ++msgid "Match ICMP type" ++msgstr "Potriveste pe tipul de ICMP" ++ ++msgid "Match forwarded traffic to the given destination port or port range." ++msgstr "" ++ ++msgid "" ++"Match incoming traffic directed at the given destination port or port range " ++"on this host" ++msgstr "" ++ ++msgid "" ++"Match incoming traffic originating from the given source port or port range " ++"on the client host." ++msgstr "" ++ ++msgid "Name" ++msgstr "Nume" ++ ++msgid "New SNAT rule" ++msgstr "Regulă nouă SNAT" ++ ++msgid "New forward rule" ++msgstr "" ++ ++msgid "New input rule" ++msgstr "" ++ ++msgid "New port forward" ++msgstr "" ++ ++msgid "New source NAT" ++msgstr "" ++ ++msgid "Only match incoming traffic directed at the given IP address." ++msgstr "" ++ ++msgid "Only match incoming traffic from these MACs." ++msgstr "" ++ ++msgid "Only match incoming traffic from this IP or range." ++msgstr "" ++ ++msgid "" ++"Only match incoming traffic originating from the given source port or port " ++"range on the client host" ++msgstr "" ++ ++msgid "Open ports on router" ++msgstr "" ++ ++msgid "Other..." ++msgstr "Altele..." ++ ++msgid "Output" ++msgstr "IeÅŸire" ++ ++msgid "Passes additional arguments to iptables. Use with care!" ++msgstr "" ++ ++msgid "Port Forwards" ++msgstr "" ++ ++msgid "" ++"Port forwarding allows remote computers on the Internet to connect to a " ++"specific computer or service within the private LAN." ++msgstr "" ++ ++msgid "Protocol" ++msgstr "Protocol" ++ ++msgid "" ++"Redirect matched incoming traffic to the given port on the internal host" ++msgstr "" ++ ++msgid "Redirect matched incoming traffic to the specified internal host" ++msgstr "" ++ ++msgid "Restrict Masquerading to given destination subnets" ++msgstr "" ++ ++msgid "Restrict Masquerading to given source subnets" ++msgstr "" ++ ++msgid "Restrict to address family" ++msgstr "" ++ ++msgid "Rewrite matched traffic to the given address." ++msgstr "" ++ ++msgid "" ++"Rewrite matched traffic to the given source port. May be left empty to only " ++"rewrite the IP address." ++msgstr "" ++ ++msgid "Rewrite to source %s" ++msgstr "" ++ ++msgid "Rewrite to source %s, %s" ++msgstr "" ++ ++msgid "SNAT IP address" ++msgstr "" ++ ++msgid "SNAT port" ++msgstr "" ++ ++msgid "Source IP address" ++msgstr "Sursă adresă IP" ++ ++msgid "Source MAC address" ++msgstr "Sursă adresă MAC" ++ ++msgid "Source NAT" ++msgstr "Sursă NAT" ++ ++msgid "" ++"Source NAT is a specific form of masquerading which allows fine grained " ++"control over the source IP used for outgoing traffic, for example to map " ++"multiple WAN addresses to internal subnets." ++msgstr "" ++ ++msgid "Source address" ++msgstr "Adresa sursa" ++ ++msgid "Source port" ++msgstr "Port sursa" ++ ++msgid "Source zone" ++msgstr "Zona sursa" ++ ++msgid "" ++"The firewall creates zones over your network interfaces to control network " ++"traffic flow." ++msgstr "" ++ ++msgid "" ++"The options below control the forwarding policies between this zone (%s) and " ++"other zones. Destination zones cover forwarded traffic " ++"originating from %q. Source zones match forwarded " ++"traffic from other zones targeted at %q. The forwarding " ++"rule is unidirectional, e.g. a forward from lan to wan does " ++"not imply a permission to forward from wan to lan as well." ++msgstr "" ++ ++msgid "" ++"This page allows you to change advanced properties of the port forwarding " ++"entry. In most cases there is no need to modify those settings." ++msgstr "" ++ ++msgid "" ++"This page allows you to change advanced properties of the traffic rule " ++"entry, such as matched source and destination hosts." ++msgstr "" ++ ++msgid "" ++"This section defines common properties of %q. The input and " ++"output options set the default policies for traffic entering and " ++"leaving this zone while the forward option describes the policy for " ++"forwarded traffic between different networks within the zone. Covered " ++"networks specifies which available networks are members of this zone." ++msgstr "" ++ ++msgid "To %s at %s on this device" ++msgstr "" ++ ++msgid "To %s in %s" ++msgstr "" ++ ++msgid "To %s on this device" ++msgstr "" ++ ++msgid "To %s, %s in %s" ++msgstr "" ++ ++msgid "To source IP" ++msgstr "" ++ ++msgid "To source port" ++msgstr "" ++ ++msgid "Traffic Rules" ++msgstr "" ++ ++msgid "" ++"Traffic rules define policies for packets traveling between different zones, " ++"for example to reject traffic between certain hosts or to open WAN ports on " ++"the router." ++msgstr "" ++ ++msgid "Via %s" ++msgstr "" ++ ++msgid "Via %s at %s" ++msgstr "" ++ ++msgid "" ++"You may specify multiple by selecting \"-- custom --\" and then entering " ++"protocols separated by space." ++msgstr "" ++ ++msgid "Zone %q" ++msgstr "Zona %q" ++ ++msgid "Zone ⇒ Forwardings" ++msgstr "" ++ ++msgid "Zones" ++msgstr "Zone" ++ ++msgid "accept" ++msgstr "accept" ++ ++msgid "any" ++msgstr "oricare" ++ ++msgid "any host" ++msgstr "" ++ ++msgid "any router IP" ++msgstr "" ++ ++msgid "any zone" ++msgstr "" ++ ++msgid "don't track" ++msgstr "" ++ ++msgid "drop" ++msgstr "" ++ ++msgid "reject" ++msgstr "" ++ ++msgid "traffic" ++msgstr "" ++ ++#~ msgid "Destination" ++#~ msgstr "Destinatie" ++ ++#~ msgid "Family" ++#~ msgstr "Familia proto" ++ ++#~ msgid "Source" ++#~ msgstr "Sursa" ++ ++#~ msgid "Via" ++#~ msgstr "Prin" ++ ++#~ msgid "(optional)" ++#~ msgstr "(optional)" ++ ++#~ msgid "Intended destination address" ++#~ msgstr "Adresa destinatie intentionata" ++ ++#~ msgid "Internal port (optional)" ++#~ msgstr "Port intern (optional)" ++ ++#~ msgid "Advanced Options" ++#~ msgstr "Optiuni avansate" ++ ++#~ msgid "Advanced Rules" ++#~ msgstr "Reguli avansate" ++ ++#~ msgid "" ++#~ "Advanced rules let you customize the firewall to your needs. Only new " ++#~ "connections will be matched. Packets belonging to already open " ++#~ "connections are automatically allowed to pass the firewall." ++#~ msgstr "" ++#~ "Regulile avansate iti permit particularizarea firewall-ului dupa nevoi. " ++#~ "Numai conexiunile noi vor fi luate in calcul. Pachetele care apartin unor " ++#~ "conexiuni deja stabilite trec deja prin firewall." ++ ++#~ msgid "Custom Rules (/etc/firewall.user)" ++#~ msgstr "Reguli suplimentare (/etc/firewall.user)" ++ ++#~ msgid "Device" ++#~ msgstr "Dispozitiv" ++ ++#~ msgid "" ++#~ "For DNAT, match incoming traffic directed at the given destination ip " ++#~ "address. For SNAT rewrite the source address to the given address." ++#~ msgstr "" ++#~ "Pentru DNAT, leaga traficul venit redirectat catre destinatia IP. Pentru " ++#~ "SNAT rescrie adresa sursa ca fiind adresa IP." ++ ++#~ msgid "Overview" ++#~ msgstr "Sumar" ++ ++#~ msgid "Port forwarding" ++#~ msgstr "Forwardare catre port" ++ ++#~ msgid "Redirection type" ++#~ msgstr "Tipul de redirectare" ++ ++#~ msgid "Redirections" ++#~ msgstr "Redirectari" ++ ++#~ msgid "Rules" ++#~ msgstr "Reguli" ++ ++#~ msgid "Traffic Redirection" ++#~ msgstr "Redirectarea traficului" +diff --git a/feeds/luci/applications/luci-app-firewall/po/ru/firewall.po b/feeds/luci/applications/luci-app-firewall/po/ru/firewall.po +new file mode 100644 +index 0000000..aa5c5a8 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-firewall/po/ru/firewall.po +@@ -0,0 +1,679 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: LuCI: firewall\n" ++"Report-Msgid-Bugs-To: \n" ++"POT-Creation-Date: 2010-03-30 17:00+0200\n" ++"PO-Revision-Date: 2013-09-05 16:02+0200\n" ++"Last-Translator: datasheet \n" ++"Language-Team: Russian \n" ++"Language: ru\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%" ++"10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" ++"X-Generator: Pootle 2.0.6\n" ++"X-Poedit-SourceCharset: UTF-8\n" ++ ++msgid "%s in %s" ++msgstr "%s в %s" ++ ++msgid "%s%s with %s" ++msgstr "%s%s Ñ %s" ++ ++msgid "%s, %s in %s" ++msgstr "%s, %s в %s" ++ ++msgid "(Unnamed Entry)" ++msgstr "(ЗапиÑÑŒ без имени)" ++ ++msgid "(Unnamed Rule)" ++msgstr "(Правило без имени)" ++ ++msgid "(Unnamed SNAT)" ++msgstr "(SNAT без имени)" ++ ++msgid "-- Please choose --" ++msgstr "-- ПожалуйÑта, выберите --" ++ ++msgid "-- custom --" ++msgstr "-- пользовательÑкий --" ++ ++msgid "%d pkts. per %s" ++msgstr "%d пакетов за %s" ++ ++msgid "%d pkts. per %s, burst %d pkts." ++msgstr "%d пакетов за %s, подрÑд %d пакетов" ++ ++msgid "%s and limit to %s" ++msgstr "%s Ñ Ð¿Ñ€ÐµÐ´ÐµÐ»Ð¾Ð¼ в %s" ++ ++msgid "Action" ++msgstr "ДейÑтвие" ++ ++msgid "Add" ++msgstr "Добавить" ++ ++msgid "Add and edit..." ++msgstr "Добавить и редактировать..." ++ ++msgid "Advanced Settings" ++msgstr "РаÑширенные наÑтройки" ++ ++msgid "Allow forward from source zones:" ++msgstr "Разрешить перенаправление из зон-иÑточников:" ++ ++msgid "Allow forward to destination zones:" ++msgstr "Разрешить перенаправление в зоны назначениÑ:" ++ ++msgid "Any" ++msgstr "Любой" ++ ++msgid "Covered networks" ++msgstr "ИÑпользовать Ñети" ++ ++msgid "Custom Rules" ++msgstr "ПользовательÑкие правила" ++ ++msgid "" ++"Custom rules allow you to execute arbritary iptables commands which are not " ++"otherwise covered by the firewall framework. The commands are executed after " ++"each firewall restart, right after the default ruleset has been loaded." ++msgstr "" ++"ПользовательÑкие правила позволÑÑŽÑ‚ выполнÑÑ‚ÑŒ произвольные команды iptables, " ++"которые так или иначе не покрываютÑÑ Ð´Ð°Ð½Ð½Ñ‹Ð¼ фреймворком межÑетевого Ñкрана. " ++"Команды выполнÑÑŽÑ‚ÑÑ Ð¿Ñ€Ð¸ каждом перезапуÑке межÑетевого Ñкрана, Ñразу поÑле " ++"того, как загружен набор правил по умолчанию." ++ ++msgid "Destination IP address" ++msgstr "IP-Ð°Ð´Ñ€ÐµÑ Ð½Ð°Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ" ++ ++msgid "Destination address" ++msgstr "ÐÐ´Ñ€ÐµÑ Ð½Ð°Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ" ++ ++msgid "Destination port" ++msgstr "Порт назначениÑ" ++ ++msgid "Destination zone" ++msgstr "Зона назначениÑ" ++ ++msgid "Do not rewrite" ++msgstr "Ðе перезапиÑывать" ++ ++msgid "Drop invalid packets" ++msgstr "Ðе пропуÑкать некорректные пакеты" ++ ++msgid "Enable" ++msgstr "Включить" ++ ++#, fuzzy ++msgid "Enable NAT Loopback" ++msgstr "Включить NAT Loopback" ++ ++msgid "Enable SYN-flood protection" ++msgstr "Включить защиту от SYN-flood атак" ++ ++msgid "Enable logging on this zone" ++msgstr "Включить журналирование в Ñтой зоне" ++ ++msgid "External IP address" ++msgstr "Внешний IP-адреÑ" ++ ++msgid "External port" ++msgstr "Внешний порт" ++ ++msgid "External zone" ++msgstr "ВнешнÑÑ Ð·Ð¾Ð½Ð°" ++ ++msgid "Extra arguments" ++msgstr "Дополнительные аргументы" ++ ++msgid "Firewall" ++msgstr "МежÑетевой Ñкран" ++ ++msgid "Firewall - Custom Rules" ++msgstr "МежÑетевой Ñкран - ПользовательÑкие правила" ++ ++msgid "Firewall - Port Forwards" ++msgstr "МежÑетевой Ñкран - Перенаправление портов" ++ ++msgid "Firewall - Traffic Rules" ++msgstr "МежÑетевой Ñкран - Правила Ð´Ð»Ñ Ñ‚Ñ€Ð°Ñ„Ð¸ÐºÐ°" ++ ++msgid "Firewall - Zone Settings" ++msgstr "МежÑетевой Ñкран - ÐаÑтройка зон" ++ ++msgid "Force connection tracking" ++msgstr "Включить отÑлеживание Ñоединений" ++ ++msgid "Forward" ++msgstr "Перенаправление" ++ ++msgid "Forward to" ++msgstr "ПеренаправлÑÑ‚ÑŒ в" ++ ++msgid "From %s in %s" ++msgstr "Из %s в %s" ++ ++msgid "From %s in %s with source %s" ++msgstr "Из %s в %s Ñ Ð¸Ñточником %s" ++ ++msgid "From %s in %s with source %s and %s" ++msgstr "Из %s в %s Ñ Ð¸Ñточниками %s и %s" ++ ++msgid "General Settings" ++msgstr "Общие наÑтройки" ++ ++msgid "IPv4" ++msgstr "IPv4" ++ ++msgid "IPv4 and IPv6" ++msgstr "IPv4 и IPv6" ++ ++msgid "IPv4 only" ++msgstr "Только IPv4" ++ ++msgid "IPv6" ++msgstr "IPv6" ++ ++msgid "IPv6 only" ++msgstr "Только IPv6" ++ ++msgid "Input" ++msgstr "ВходÑщий" ++ ++msgid "Inter-Zone Forwarding" ++msgstr "Перенаправление между зонами" ++ ++msgid "Internal IP address" ++msgstr "Внутренний IP-адреÑ" ++ ++msgid "Internal port" ++msgstr "Внутренний порт" ++ ++msgid "Internal zone" ++msgstr "ВнутреннÑÑ Ð·Ð¾Ð½Ð°" ++ ++msgid "Limit log messages" ++msgstr "Ограничить журнал Ñообщений" ++ ++msgid "MSS clamping" ++msgstr "Ограничение MSS" ++ ++msgid "Masquerading" ++msgstr "МаÑкарадинг" ++ ++#, fuzzy ++msgid "Match" ++msgstr "Выбирать" ++ ++msgid "Match ICMP type" ++msgstr "СоответÑтвовать ICMP типу" ++ ++msgid "Match forwarded traffic to the given destination port or port range." ++msgstr "" ++"Перенаправить ÑоответÑтвующий трафик на определённый порт или диапазон " ++"портов. " ++ ++msgid "" ++"Match incoming traffic directed at the given destination port or port range " ++"on this host" ++msgstr "" ++"Выбирать входÑщий трафик, направленный на порт или диапазон портов данного " ++"хоÑта" ++ ++msgid "" ++"Match incoming traffic originating from the given source port or port range " ++"on the client host." ++msgstr "" ++"Выбирать входÑщий трафик, иÑходÑщий из порта или диапазона портов " ++"клиентÑкого хоÑта." ++ ++msgid "Name" ++msgstr "ИмÑ" ++ ++msgid "New SNAT rule" ++msgstr "Ðовое правило SNAT" ++ ++msgid "New forward rule" ++msgstr "Ðовое правило перенаправлениÑ" ++ ++msgid "New input rule" ++msgstr "Ðовое правило Ð´Ð»Ñ Ð²Ñ…Ð¾Ð´Ñщего трафика" ++ ++msgid "New port forward" ++msgstr "Ðовое перенаправление порта" ++ ++msgid "New source NAT" ++msgstr "Ðовый SNAT" ++ ++msgid "Only match incoming traffic directed at the given IP address." ++msgstr "Выбирать только входÑщий трафик, направленный на указанный IP-адреÑ." ++ ++msgid "Only match incoming traffic from these MACs." ++msgstr "Выбирать только входÑщий трафик от Ñтих MAC-адреÑов." ++ ++msgid "Only match incoming traffic from this IP or range." ++msgstr "" ++"Выбирать только входÑщий трафик от Ñтого IP-адреÑа или диапазона адреÑов." ++ ++msgid "" ++"Only match incoming traffic originating from the given source port or port " ++"range on the client host" ++msgstr "" ++"Выбирать только входÑщий трафик, иÑходÑщий из указанного порта или диапазона " ++"портов клиентÑкого хоÑта" ++ ++msgid "Open ports on router" ++msgstr "Открыть порты на маршрутизаторе" ++ ++msgid "Other..." ++msgstr "Другое..." ++ ++msgid "Output" ++msgstr "ИÑходÑщий" ++ ++msgid "Passes additional arguments to iptables. Use with care!" ++msgstr "" ++"Передаёт дополнительные аргументы iptables. ИÑпользуйте Ñ Ð¾ÑторожноÑтью!" ++ ++msgid "Port Forwards" ++msgstr "ÐŸÐµÑ€ÐµÐ½Ð°Ð¿Ñ€Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ð¿Ð¾Ñ€Ñ‚Ð¾Ð²" ++ ++msgid "" ++"Port forwarding allows remote computers on the Internet to connect to a " ++"specific computer or service within the private LAN." ++msgstr "" ++"Перенаправленные портов позволÑет удалённым компьютерам из Интернета " ++"ÑоединÑÑ‚ÑŒÑÑ Ñ ÐºÐ¾Ð¼Ð¿ÑŒÑŽÑ‚ÐµÑ€Ð¾Ð¼ или Ñлужбой внутри чаÑтной локальной Ñети." ++ ++msgid "Protocol" ++msgstr "Протокол" ++ ++msgid "" ++"Redirect matched incoming traffic to the given port on the internal host" ++msgstr "Перенаправить входÑщий трафик на указанный порт хоÑта внутренней Ñети" ++ ++msgid "Redirect matched incoming traffic to the specified internal host" ++msgstr "Перенаправить входÑщий трафик на указанный хоÑÑ‚ внутренней Ñети" ++ ++msgid "Restrict Masquerading to given destination subnets" ++msgstr "ИÑпользовать маÑкарадинг только Ð´Ð»Ñ ÑƒÐºÐ°Ð·Ð°Ð½Ð½Ñ‹Ñ… подÑетей-получателей" ++ ++msgid "Restrict Masquerading to given source subnets" ++msgstr "ИÑпользовать маÑкарадинг только Ð´Ð»Ñ ÑƒÐºÐ°Ð·Ð°Ð½Ð½Ñ‹Ñ… подÑетей-отправителей" ++ ++msgid "Restrict to address family" ++msgstr "ИÑпользовать только ÑемейÑтво протоколов" ++ ++msgid "Rewrite matched traffic to the given address." ++msgstr "ПеренаправлÑÑ‚ÑŒ ÑоответÑтвующий трафик к указанному адреÑу." ++ ++msgid "" ++"Rewrite matched traffic to the given source port. May be left empty to only " ++"rewrite the IP address." ++msgstr "" ++"ПеренаправлÑÑ‚ÑŒ ÑоответÑтвующий трафик к указанному порту иÑточника. Может " ++"быть пуÑтым в Ñлучае, еÑли необходимо перенаправить только IP-адреÑ." ++ ++msgid "Rewrite to source %s" ++msgstr "ПеренаправлÑÑ‚ÑŒ к иÑточнику %s" ++ ++msgid "Rewrite to source %s, %s" ++msgstr "ПеренаправлÑÑ‚ÑŒ к иÑточнику %s, %s" ++ ++msgid "SNAT IP address" ++msgstr "IP-Ð°Ð´Ñ€ÐµÑ SNAT" ++ ++msgid "SNAT port" ++msgstr "Порт SNAT" ++ ++# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # ++# Generated from applications/luci-fw/luasrc/model/cbi/luci_fw/rrule.lua # ++# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # ++# msgid "Traffic Redirection" ++# msgstr "" ++# msgid "" ++# "Traffic redirection allows you to change the destination address of " ++# "forwarded packets." ++# msgstr "" ++# msgid "Overview" ++# msgstr "" ++# msgid "Name" ++# msgstr "" ++# msgid "Source zone" ++# msgstr "" ++# msgid "Source MAC-address" ++# msgstr "" ++# msgid "Source port" ++# msgstr "" ++# msgid "Protocol" ++# msgstr "" ++msgid "Source IP address" ++msgstr "IP-Ð°Ð´Ñ€ÐµÑ Ð¸Ñточника" ++ ++msgid "Source MAC address" ++msgstr "MAC-Ð°Ð´Ñ€ÐµÑ Ð¸Ñточника" ++ ++msgid "Source NAT" ++msgstr "SNAT" ++ ++msgid "" ++"Source NAT is a specific form of masquerading which allows fine grained " ++"control over the source IP used for outgoing traffic, for example to map " ++"multiple WAN addresses to internal subnets." ++msgstr "" ++"SNAT - Ñто оÑÐ¾Ð±Ð°Ñ Ñ„Ð¾Ñ€Ð¼Ð° маÑкарадинга (masquerading), позволÑÑŽÑ‰Ð°Ñ " ++"оÑущеÑтвлÑÑ‚ÑŒ детальный контроль над IP-адреÑом иÑточника Ð´Ð»Ñ Ð¸ÑходÑщего " ++"трафика, например, перенаправление неÑкольких WAN-адреÑов во внутреннюю " ++"подÑеть." ++ ++msgid "Source address" ++msgstr "ÐÐ´Ñ€ÐµÑ Ð¸Ñточника" ++ ++msgid "Source port" ++msgstr "Порт иÑточника" ++ ++msgid "Source zone" ++msgstr "Зона-иÑточник" ++ ++msgid "" ++"The firewall creates zones over your network interfaces to control network " ++"traffic flow." ++msgstr "МежÑетевой Ñкран Ñоздает зоны в вашей Ñети Ð´Ð»Ñ ÐºÐ¾Ð½Ñ‚Ñ€Ð¾Ð»Ñ Ñ‚Ñ€Ð°Ñ„Ð¸ÐºÐ°." ++ ++msgid "" ++"The options below control the forwarding policies between this zone (%s) and " ++"other zones. Destination zones cover forwarded traffic " ++"originating from %q. Source zones match forwarded " ++"traffic from other zones targeted at %q. The forwarding " ++"rule is unidirectional, e.g. a forward from lan to wan does " ++"not imply a permission to forward from wan to lan as well." ++msgstr "" ++"Данные наÑтройки управлÑÑŽÑ‚ перенаправлением между Ñтой (%s) и другими " ++"зонами. Трафиком зон-получателей ÑвлÑетÑÑ Ñ‚Ñ€Ð°Ñ„Ð¸Ðº иÑходÑщий " ++"из %q. Трафиком зон-иÑточников ÑвлÑетÑÑ Ñ‚Ñ€Ð°Ñ„Ð¸Ðº " ++"направленый в %q. Перенаправление ÑвлÑетÑÑ " ++"однонаправленным, то еÑÑ‚ÑŒ перанаправление из lan в wan не " ++"допуÑкает перенаправление трафика из wan в lan." ++ ++msgid "" ++"This page allows you to change advanced properties of the port forwarding " ++"entry. In most cases there is no need to modify those settings." ++msgstr "" ++"Ðа Ñтой Ñтранице можно изменить раÑширенные наÑтройки Ð¿ÐµÑ€ÐµÐ½Ð°Ð¿Ñ€Ð°Ð²Ð»ÐµÐ½Ð¸Ñ " ++"портов. Ð’ большинÑтве Ñлучаев нет необходимоÑти изменÑÑ‚ÑŒ Ñти параметры." ++ ++msgid "" ++"This page allows you to change advanced properties of the traffic rule " ++"entry, such as matched source and destination hosts." ++msgstr "" ++"Ðа Ñтой Ñтранице можно изменить раÑширенные наÑтройки правил Ð´Ð»Ñ Ñ‚Ñ€Ð°Ñ„Ð¸ÐºÐ°. Ð’ " ++"большинÑтве Ñлучаев нет необходимоÑти изменÑÑ‚ÑŒ Ñти параметры." ++ ++#, fuzzy ++msgid "" ++"This section defines common properties of %q. The input and " ++"output options set the default policies for traffic entering and " ++"leaving this zone while the forward option describes the policy for " ++"forwarded traffic between different networks within the zone. Covered " ++"networks specifies which available networks are members of this zone." ++msgstr "" ++"Ð”Ð°Ð½Ð½Ð°Ñ ÑÐµÐºÑ†Ð¸Ñ Ð¿Ð¾Ð·Ð²Ð¾Ð»Ñет изменÑÑ‚ÑŒ общие наÑтройки %q. Опции входÑщий " ++"и иÑходÑщий уÑтанавливают политику по умолчанию Ð´Ð»Ñ Ð²Ñ…Ð¾Ð´Ñщего и " ++"иÑходÑщего трафика. ÐžÐ¿Ñ†Ð¸Ñ Ð¿ÐµÑ€ÐµÐ½Ð°Ð¿Ñ€Ð°Ð²Ð»ÐµÐ½Ð¸Ðµ позволÑет уÑтановить " ++"политику Ð´Ð»Ñ Ñ‚Ñ€Ð°Ñ„Ð¸ÐºÐ°, который перенаправлÑетÑÑ Ñ‡ÐµÑ€ÐµÐ· неÑколько Ñетей в зоне. " ++"Пункт иÑпользовать Ñети позволÑет указать, какие Ñети ÑвлÑÑŽÑ‚ÑÑ " ++"чаÑтью данной зоны." ++ ++msgid "To %s at %s on this device" ++msgstr "К %s, порту %s на Ñтом уÑтройÑтве" ++ ++msgid "To %s in %s" ++msgstr "К %s в %s" ++ ++msgid "To %s on this device" ++msgstr "К %s на Ñтом уÑтройÑтве" ++ ++msgid "To %s, %s in %s" ++msgstr "К %s, %s в %s" ++ ++msgid "To source IP" ++msgstr "К IP-адреÑу иÑточника" ++ ++msgid "To source port" ++msgstr "К порту иÑточника" ++ ++msgid "Traffic Rules" ++msgstr "Правила Ð´Ð»Ñ Ñ‚Ñ€Ð°Ñ„Ð¸ÐºÐ°" ++ ++msgid "" ++"Traffic rules define policies for packets traveling between different zones, " ++"for example to reject traffic between certain hosts or to open WAN ports on " ++"the router." ++msgstr "" ++"Правила Ð´Ð»Ñ Ñ‚Ñ€Ð°Ñ„Ð¸ÐºÐ° определÑÑŽÑ‚ политику Ð¿Ñ€Ð¾Ñ…Ð¾Ð¶Ð´ÐµÐ½Ð¸Ñ Ð¿Ð°ÐºÐµÑ‚Ð¾Ð² между разными " ++"зонами, например, запрет трафика между некоторыми хоÑтами или открытие WAN-" ++"портов маршрутизатора." ++ ++msgid "Via %s" ++msgstr "Через %s" ++ ++msgid "Via %s at %s" ++msgstr "Через %s, порт %s" ++ ++msgid "" ++"You may specify multiple by selecting \"-- custom --\" and then entering " ++"protocols separated by space." ++msgstr "" ++"Ð’Ñ‹ можете указать неÑколько, выбрав \"-- пользовательÑкий --\" и перечиÑлив " ++"через пробел Ð½Ð°Ð·Ð²Ð°Ð½Ð¸Ñ Ð¿Ñ€Ð¾Ñ‚Ð¾ÐºÐ¾Ð»Ð¾Ð²." ++ ++msgid "Zone %q" ++msgstr "Зона %q" ++ ++msgid "Zone ⇒ Forwardings" ++msgstr "Зона ⇒ ПеренаправлениÑ" ++ ++msgid "Zones" ++msgstr "Зоны" ++ ++msgid "accept" ++msgstr "принимать" ++ ++msgid "any" ++msgstr "любой" ++ ++msgid "any host" ++msgstr "любого хоÑта" ++ ++msgid "any router IP" ++msgstr "любой IP-Ð°Ð´Ñ€ÐµÑ Ð¼Ð°Ñ€ÑˆÑ€ÑƒÑ‚Ð¸Ð·Ð°Ñ‚Ð¾Ñ€Ð°" ++ ++msgid "any zone" ++msgstr "любой зоны" ++ ++msgid "don't track" ++msgstr "не отÑлеживать" ++ ++msgid "drop" ++msgstr "не обрабатывать" ++ ++msgid "reject" ++msgstr "отвергать" ++ ++msgid "traffic" ++msgstr "" ++ ++#~ msgid "Destination" ++#~ msgstr "Ðазначение" ++ ++#~ msgid "Family" ++#~ msgstr "СемейÑтво" ++ ++#~ msgid "SNAT" ++#~ msgstr "SNAT" ++ ++#~ msgid "Source" ++#~ msgstr "ИÑточник" ++ ++#~ msgid "To %s" ++#~ msgstr "к %s" ++ ++#~ msgid "To %s at %s" ++#~ msgstr "к %s на %s" ++ ++#~ msgid "Via" ++#~ msgstr "Через" ++ ++#~ msgid "Accept forward" ++#~ msgstr "Принимать перенаправление" ++ ++#~ msgid "Accept input" ++#~ msgstr "Принимать входÑщие" ++ ++#~ msgid "Disable" ++#~ msgstr "Отключить" ++ ++#~ msgid "Discard forward" ++#~ msgstr "Отвергать перенаправление" ++ ++#~ msgid "Discard input" ++#~ msgstr "ВыбраÑывать входÑщие пакеты" ++ ++#~ msgid "Do not track forward" ++#~ msgstr "Ðе отÑлеживать перенаправление" ++ ++#~ msgid "Do not track input" ++#~ msgstr "Ðе отÑлеживать входные пакеты" ++ ++#~ msgid "IP" ++#~ msgstr "IP-адреÑ" ++ ++#~ msgid "IP range" ++#~ msgstr "Диапазон IP-адреÑов" ++ ++#~ msgid "IPs" ++#~ msgstr "IP-адреÑа" ++ ++#~ msgid "MAC" ++#~ msgstr "MAC-адреÑ" ++ ++#~ msgid "MACs" ++#~ msgstr "MAC-адреÑа" ++ ++#~ msgid "Refuse forward" ++#~ msgstr "Отвергать перенаправление" ++ ++#~ msgid "Refuse input" ++#~ msgstr "Отвергать входÑщий трафик" ++ ++#~ msgid "Rule is disabled" ++#~ msgstr "Правило выключено" ++ ++#~ msgid "Rule is enabled" ++#~ msgstr "Правило включено" ++ ++#~ msgid "day" ++#~ msgstr "день" ++ ++#~ msgid "hour" ++#~ msgstr "чаÑ" ++ ++#~ msgid "minute" ++#~ msgstr "мин" ++ ++#~ msgid "not" ++#~ msgstr "не" ++ ++#~ msgid "port" ++#~ msgstr "порт" ++ ++#~ msgid "ports" ++#~ msgstr "порты" ++ ++#~ msgid "second" ++#~ msgstr "Ñек" ++ ++#~ msgid "type" ++#~ msgstr "тип" ++ ++#~ msgid "types" ++#~ msgstr "типы" ++ ++#~ msgid "(optional)" ++#~ msgstr "(необÑзательно)" ++ ++#~ msgid "Intended destination address" ++#~ msgstr "ÐÐ´Ñ€ÐµÑ Ð½Ð°Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ" ++ ++#~ msgid "Internal port (optional)" ++#~ msgstr "Внутренний порт (необÑзательно)" ++ ++#~ msgid "Advanced Options" ++#~ msgstr "РаÑширенные опции" ++ ++#~ msgid "Advanced Rules" ++#~ msgstr "РаÑширенные правила" ++ ++#~ msgid "" ++#~ "Advanced rules let you customize the firewall to your needs. Only new " ++#~ "connections will be matched. Packets belonging to already open " ++#~ "connections are automatically allowed to pass the firewall." ++#~ msgstr "" ++#~ "РаÑширенные правила позволÑÑŽÑ‚ наÑтроить Ñетевой Ñкран в ÑоответÑтвии Ñ " ++#~ "вашими потребноÑÑ‚Ñми. Только новые ÑÐ¾ÐµÐ´Ð¸Ð½ÐµÐ½Ð¸Ñ Ð±ÑƒÐ´ÑƒÑ‚ обработаны. Пакеты, " ++#~ "принадлежащие уже ÑущеÑтвующим ÑоединениÑм, будут автоматичеÑки пропущены " ++#~ "через Ñетевой Ñкран." ++ ++#~ msgid "Custom Rules (/etc/firewall.user)" ++#~ msgstr "ПользовательÑкие правила (/etc/firewall.user)" ++ ++#~ msgid "Device" ++#~ msgstr "УÑтройÑтво" ++ ++#~ msgid "" ++#~ "For DNAT, match incoming traffic directed at the given destination ip " ++#~ "address. For SNAT rewrite the source address to the given address." ++#~ msgstr "" ++#~ "Ð”Ð»Ñ DNAT ÑоответÑтвующий трафик перенаправлÑетÑÑ Ð½Ð° введенный Ð°Ð´Ñ€ÐµÑ " ++#~ "назначениÑ. Ð”Ð»Ñ SNAT подменÑетÑÑ Ð°Ð´Ñ€ÐµÑ Ð¸Ñточника на введенный." ++ ++#~ msgid "" ++#~ "Match incoming traffic originating from the given source port or port " ++#~ "range on the client host" ++#~ msgstr "" ++#~ "Выбирать иÑходÑщий трафик отправленный Ñ Ð¿Ð¾Ñ€Ñ‚Ð° или диапазона портов " ++#~ "внешнего хоÑта" ++ ++#~ msgid "Overview" ++#~ msgstr "Ðазад к обзору" ++ ++#~ msgid "Port forwarding" ++#~ msgstr "Перенаправление портов" ++ ++#~ msgid "" ++#~ "Port forwarding allows to provide network services in the internal " ++#~ "network to an external network." ++#~ msgstr "" ++#~ "Перенаправление портов позволÑет открыть доÑтуп к внутренним Ñлужбам из " ++#~ "внешней Ñети." ++ ++#~ msgid "Redirection type" ++#~ msgstr "Тип перенаправлениÑ" ++ ++#~ msgid "Redirections" ++#~ msgstr "ПеренаправлениÑ" ++ ++#~ msgid "Rules" ++#~ msgstr "Правила" ++ ++#~ msgid "Traffic Redirection" ++#~ msgstr "Перенаправление трафика" ++ ++#~ msgid "" ++#~ "Traffic redirection allows you to change the destination address of " ++#~ "forwarded packets." ++#~ msgstr "" ++#~ "Перенаправление трафика позволÑет изменить Ð°Ð´Ñ€ÐµÑ Ð¿Ð¾Ð»ÑƒÑ‡Ð°Ñ‚ÐµÐ»Ñ Ð´Ð»Ñ " ++#~ "проходÑщих пакетов." +diff --git a/feeds/luci/applications/luci-app-firewall/po/sk/firewall.po b/feeds/luci/applications/luci-app-firewall/po/sk/firewall.po +new file mode 100644 +index 0000000..32cd193 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-firewall/po/sk/firewall.po +@@ -0,0 +1,432 @@ ++msgid "" ++msgstr "" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Last-Translator: Automatically generated\n" ++"Language-Team: none\n" ++"MIME-Version: 1.0\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n" ++ ++msgid "%s in %s" ++msgstr "" ++ ++msgid "%s%s with %s" ++msgstr "" ++ ++msgid "%s, %s in %s" ++msgstr "" ++ ++msgid "(Unnamed Entry)" ++msgstr "" ++ ++msgid "(Unnamed Rule)" ++msgstr "" ++ ++msgid "(Unnamed SNAT)" ++msgstr "" ++ ++msgid "-- Please choose --" ++msgstr "" ++ ++msgid "-- custom --" ++msgstr "" ++ ++msgid "%d pkts. per %s" ++msgstr "" ++ ++msgid "%d pkts. per %s, burst %d pkts." ++msgstr "" ++ ++msgid "%s and limit to %s" ++msgstr "" ++ ++msgid "Action" ++msgstr "" ++ ++msgid "Add" ++msgstr "" ++ ++msgid "Add and edit..." ++msgstr "" ++ ++msgid "Advanced Settings" ++msgstr "" ++ ++msgid "Allow forward from source zones:" ++msgstr "" ++ ++msgid "Allow forward to destination zones:" ++msgstr "" ++ ++msgid "Any" ++msgstr "" ++ ++msgid "Covered networks" ++msgstr "" ++ ++msgid "Custom Rules" ++msgstr "" ++ ++msgid "" ++"Custom rules allow you to execute arbritary iptables commands which are not " ++"otherwise covered by the firewall framework. The commands are executed after " ++"each firewall restart, right after the default ruleset has been loaded." ++msgstr "" ++ ++msgid "Destination IP address" ++msgstr "" ++ ++msgid "Destination address" ++msgstr "" ++ ++msgid "Destination port" ++msgstr "" ++ ++msgid "Destination zone" ++msgstr "" ++ ++msgid "Do not rewrite" ++msgstr "" ++ ++msgid "Drop invalid packets" ++msgstr "" ++ ++msgid "Enable" ++msgstr "" ++ ++msgid "Enable NAT Loopback" ++msgstr "" ++ ++msgid "Enable SYN-flood protection" ++msgstr "" ++ ++msgid "Enable logging on this zone" ++msgstr "" ++ ++msgid "External IP address" ++msgstr "" ++ ++msgid "External port" ++msgstr "" ++ ++msgid "External zone" ++msgstr "" ++ ++msgid "Extra arguments" ++msgstr "" ++ ++msgid "Firewall" ++msgstr "" ++ ++msgid "Firewall - Custom Rules" ++msgstr "" ++ ++msgid "Firewall - Port Forwards" ++msgstr "" ++ ++msgid "Firewall - Traffic Rules" ++msgstr "" ++ ++msgid "Firewall - Zone Settings" ++msgstr "" ++ ++msgid "Force connection tracking" ++msgstr "" ++ ++msgid "Forward" ++msgstr "" ++ ++msgid "Forward to" ++msgstr "" ++ ++msgid "From %s in %s" ++msgstr "" ++ ++msgid "From %s in %s with source %s" ++msgstr "" ++ ++msgid "From %s in %s with source %s and %s" ++msgstr "" ++ ++msgid "General Settings" ++msgstr "" ++ ++msgid "IPv4" ++msgstr "" ++ ++msgid "IPv4 and IPv6" ++msgstr "" ++ ++msgid "IPv4 only" ++msgstr "" ++ ++msgid "IPv6" ++msgstr "" ++ ++msgid "IPv6 only" ++msgstr "" ++ ++msgid "Input" ++msgstr "" ++ ++msgid "Inter-Zone Forwarding" ++msgstr "" ++ ++msgid "Internal IP address" ++msgstr "" ++ ++msgid "Internal port" ++msgstr "" ++ ++msgid "Internal zone" ++msgstr "" ++ ++msgid "Limit log messages" ++msgstr "" ++ ++msgid "MSS clamping" ++msgstr "" ++ ++msgid "Masquerading" ++msgstr "" ++ ++msgid "Match" ++msgstr "" ++ ++msgid "Match ICMP type" ++msgstr "" ++ ++msgid "Match forwarded traffic to the given destination port or port range." ++msgstr "" ++ ++msgid "" ++"Match incoming traffic directed at the given destination port or port range " ++"on this host" ++msgstr "" ++ ++msgid "" ++"Match incoming traffic originating from the given source port or port range " ++"on the client host." ++msgstr "" ++ ++msgid "Name" ++msgstr "" ++ ++msgid "New SNAT rule" ++msgstr "" ++ ++msgid "New forward rule" ++msgstr "" ++ ++msgid "New input rule" ++msgstr "" ++ ++msgid "New port forward" ++msgstr "" ++ ++msgid "New source NAT" ++msgstr "" ++ ++msgid "Only match incoming traffic directed at the given IP address." ++msgstr "" ++ ++msgid "Only match incoming traffic from these MACs." ++msgstr "" ++ ++msgid "Only match incoming traffic from this IP or range." ++msgstr "" ++ ++msgid "" ++"Only match incoming traffic originating from the given source port or port " ++"range on the client host" ++msgstr "" ++ ++msgid "Open ports on router" ++msgstr "" ++ ++msgid "Other..." ++msgstr "" ++ ++msgid "Output" ++msgstr "" ++ ++msgid "Passes additional arguments to iptables. Use with care!" ++msgstr "" ++ ++msgid "Port Forwards" ++msgstr "" ++ ++msgid "" ++"Port forwarding allows remote computers on the Internet to connect to a " ++"specific computer or service within the private LAN." ++msgstr "" ++ ++msgid "Protocol" ++msgstr "" ++ ++msgid "" ++"Redirect matched incoming traffic to the given port on the internal host" ++msgstr "" ++ ++msgid "Redirect matched incoming traffic to the specified internal host" ++msgstr "" ++ ++msgid "Restrict Masquerading to given destination subnets" ++msgstr "" ++ ++msgid "Restrict Masquerading to given source subnets" ++msgstr "" ++ ++msgid "Restrict to address family" ++msgstr "" ++ ++msgid "Rewrite matched traffic to the given address." ++msgstr "" ++ ++msgid "" ++"Rewrite matched traffic to the given source port. May be left empty to only " ++"rewrite the IP address." ++msgstr "" ++ ++msgid "Rewrite to source %s" ++msgstr "" ++ ++msgid "Rewrite to source %s, %s" ++msgstr "" ++ ++msgid "SNAT IP address" ++msgstr "" ++ ++msgid "SNAT port" ++msgstr "" ++ ++msgid "Source IP address" ++msgstr "" ++ ++msgid "Source MAC address" ++msgstr "" ++ ++msgid "Source NAT" ++msgstr "" ++ ++msgid "" ++"Source NAT is a specific form of masquerading which allows fine grained " ++"control over the source IP used for outgoing traffic, for example to map " ++"multiple WAN addresses to internal subnets." ++msgstr "" ++ ++msgid "Source address" ++msgstr "" ++ ++msgid "Source port" ++msgstr "" ++ ++msgid "Source zone" ++msgstr "" ++ ++msgid "" ++"The firewall creates zones over your network interfaces to control network " ++"traffic flow." ++msgstr "" ++ ++msgid "" ++"The options below control the forwarding policies between this zone (%s) and " ++"other zones. Destination zones cover forwarded traffic " ++"originating from %q. Source zones match forwarded " ++"traffic from other zones targeted at %q. The forwarding " ++"rule is unidirectional, e.g. a forward from lan to wan does " ++"not imply a permission to forward from wan to lan as well." ++msgstr "" ++ ++msgid "" ++"This page allows you to change advanced properties of the port forwarding " ++"entry. In most cases there is no need to modify those settings." ++msgstr "" ++ ++msgid "" ++"This page allows you to change advanced properties of the traffic rule " ++"entry, such as matched source and destination hosts." ++msgstr "" ++ ++msgid "" ++"This section defines common properties of %q. The input and " ++"output options set the default policies for traffic entering and " ++"leaving this zone while the forward option describes the policy for " ++"forwarded traffic between different networks within the zone. Covered " ++"networks specifies which available networks are members of this zone." ++msgstr "" ++ ++msgid "To %s at %s on this device" ++msgstr "" ++ ++msgid "To %s in %s" ++msgstr "" ++ ++msgid "To %s on this device" ++msgstr "" ++ ++msgid "To %s, %s in %s" ++msgstr "" ++ ++msgid "To source IP" ++msgstr "" ++ ++msgid "To source port" ++msgstr "" ++ ++msgid "Traffic Rules" ++msgstr "" ++ ++msgid "" ++"Traffic rules define policies for packets traveling between different zones, " ++"for example to reject traffic between certain hosts or to open WAN ports on " ++"the router." ++msgstr "" ++ ++msgid "Via %s" ++msgstr "" ++ ++msgid "Via %s at %s" ++msgstr "" ++ ++msgid "" ++"You may specify multiple by selecting \"-- custom --\" and then entering " ++"protocols separated by space." ++msgstr "" ++ ++msgid "Zone %q" ++msgstr "" ++ ++msgid "Zone ⇒ Forwardings" ++msgstr "" ++ ++msgid "Zones" ++msgstr "" ++ ++msgid "accept" ++msgstr "" ++ ++msgid "any" ++msgstr "" ++ ++msgid "any host" ++msgstr "" ++ ++msgid "any router IP" ++msgstr "" ++ ++msgid "any zone" ++msgstr "" ++ ++msgid "don't track" ++msgstr "" ++ ++msgid "drop" ++msgstr "" ++ ++msgid "reject" ++msgstr "" ++ ++msgid "traffic" ++msgstr "" +diff --git a/feeds/luci/applications/luci-app-firewall/po/sv/firewall.po b/feeds/luci/applications/luci-app-firewall/po/sv/firewall.po +new file mode 100644 +index 0000000..f3e7fd9 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-firewall/po/sv/firewall.po +@@ -0,0 +1,433 @@ ++msgid "" ++msgstr "" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Last-Translator: Automatically generated\n" ++"Language-Team: none\n" ++"Language: sv\n" ++"MIME-Version: 1.0\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n != 1);\n" ++ ++msgid "%s in %s" ++msgstr "" ++ ++msgid "%s%s with %s" ++msgstr "" ++ ++msgid "%s, %s in %s" ++msgstr "" ++ ++msgid "(Unnamed Entry)" ++msgstr "" ++ ++msgid "(Unnamed Rule)" ++msgstr "" ++ ++msgid "(Unnamed SNAT)" ++msgstr "" ++ ++msgid "-- Please choose --" ++msgstr "" ++ ++msgid "-- custom --" ++msgstr "" ++ ++msgid "%d pkts. per %s" ++msgstr "" ++ ++msgid "%d pkts. per %s, burst %d pkts." ++msgstr "" ++ ++msgid "%s and limit to %s" ++msgstr "" ++ ++msgid "Action" ++msgstr "" ++ ++msgid "Add" ++msgstr "" ++ ++msgid "Add and edit..." ++msgstr "" ++ ++msgid "Advanced Settings" ++msgstr "" ++ ++msgid "Allow forward from source zones:" ++msgstr "" ++ ++msgid "Allow forward to destination zones:" ++msgstr "" ++ ++msgid "Any" ++msgstr "" ++ ++msgid "Covered networks" ++msgstr "" ++ ++msgid "Custom Rules" ++msgstr "" ++ ++msgid "" ++"Custom rules allow you to execute arbritary iptables commands which are not " ++"otherwise covered by the firewall framework. The commands are executed after " ++"each firewall restart, right after the default ruleset has been loaded." ++msgstr "" ++ ++msgid "Destination IP address" ++msgstr "" ++ ++msgid "Destination address" ++msgstr "" ++ ++msgid "Destination port" ++msgstr "" ++ ++msgid "Destination zone" ++msgstr "" ++ ++msgid "Do not rewrite" ++msgstr "" ++ ++msgid "Drop invalid packets" ++msgstr "" ++ ++msgid "Enable" ++msgstr "" ++ ++msgid "Enable NAT Loopback" ++msgstr "" ++ ++msgid "Enable SYN-flood protection" ++msgstr "" ++ ++msgid "Enable logging on this zone" ++msgstr "" ++ ++msgid "External IP address" ++msgstr "" ++ ++msgid "External port" ++msgstr "" ++ ++msgid "External zone" ++msgstr "" ++ ++msgid "Extra arguments" ++msgstr "" ++ ++msgid "Firewall" ++msgstr "" ++ ++msgid "Firewall - Custom Rules" ++msgstr "" ++ ++msgid "Firewall - Port Forwards" ++msgstr "" ++ ++msgid "Firewall - Traffic Rules" ++msgstr "" ++ ++msgid "Firewall - Zone Settings" ++msgstr "" ++ ++msgid "Force connection tracking" ++msgstr "" ++ ++msgid "Forward" ++msgstr "" ++ ++msgid "Forward to" ++msgstr "" ++ ++msgid "From %s in %s" ++msgstr "" ++ ++msgid "From %s in %s with source %s" ++msgstr "" ++ ++msgid "From %s in %s with source %s and %s" ++msgstr "" ++ ++msgid "General Settings" ++msgstr "" ++ ++msgid "IPv4" ++msgstr "" ++ ++msgid "IPv4 and IPv6" ++msgstr "" ++ ++msgid "IPv4 only" ++msgstr "" ++ ++msgid "IPv6" ++msgstr "" ++ ++msgid "IPv6 only" ++msgstr "" ++ ++msgid "Input" ++msgstr "" ++ ++msgid "Inter-Zone Forwarding" ++msgstr "" ++ ++msgid "Internal IP address" ++msgstr "" ++ ++msgid "Internal port" ++msgstr "" ++ ++msgid "Internal zone" ++msgstr "" ++ ++msgid "Limit log messages" ++msgstr "" ++ ++msgid "MSS clamping" ++msgstr "" ++ ++msgid "Masquerading" ++msgstr "" ++ ++msgid "Match" ++msgstr "" ++ ++msgid "Match ICMP type" ++msgstr "" ++ ++msgid "Match forwarded traffic to the given destination port or port range." ++msgstr "" ++ ++msgid "" ++"Match incoming traffic directed at the given destination port or port range " ++"on this host" ++msgstr "" ++ ++msgid "" ++"Match incoming traffic originating from the given source port or port range " ++"on the client host." ++msgstr "" ++ ++msgid "Name" ++msgstr "" ++ ++msgid "New SNAT rule" ++msgstr "" ++ ++msgid "New forward rule" ++msgstr "" ++ ++msgid "New input rule" ++msgstr "" ++ ++msgid "New port forward" ++msgstr "" ++ ++msgid "New source NAT" ++msgstr "" ++ ++msgid "Only match incoming traffic directed at the given IP address." ++msgstr "" ++ ++msgid "Only match incoming traffic from these MACs." ++msgstr "" ++ ++msgid "Only match incoming traffic from this IP or range." ++msgstr "" ++ ++msgid "" ++"Only match incoming traffic originating from the given source port or port " ++"range on the client host" ++msgstr "" ++ ++msgid "Open ports on router" ++msgstr "" ++ ++msgid "Other..." ++msgstr "" ++ ++msgid "Output" ++msgstr "" ++ ++msgid "Passes additional arguments to iptables. Use with care!" ++msgstr "" ++ ++msgid "Port Forwards" ++msgstr "" ++ ++msgid "" ++"Port forwarding allows remote computers on the Internet to connect to a " ++"specific computer or service within the private LAN." ++msgstr "" ++ ++msgid "Protocol" ++msgstr "" ++ ++msgid "" ++"Redirect matched incoming traffic to the given port on the internal host" ++msgstr "" ++ ++msgid "Redirect matched incoming traffic to the specified internal host" ++msgstr "" ++ ++msgid "Restrict Masquerading to given destination subnets" ++msgstr "" ++ ++msgid "Restrict Masquerading to given source subnets" ++msgstr "" ++ ++msgid "Restrict to address family" ++msgstr "" ++ ++msgid "Rewrite matched traffic to the given address." ++msgstr "" ++ ++msgid "" ++"Rewrite matched traffic to the given source port. May be left empty to only " ++"rewrite the IP address." ++msgstr "" ++ ++msgid "Rewrite to source %s" ++msgstr "" ++ ++msgid "Rewrite to source %s, %s" ++msgstr "" ++ ++msgid "SNAT IP address" ++msgstr "" ++ ++msgid "SNAT port" ++msgstr "" ++ ++msgid "Source IP address" ++msgstr "" ++ ++msgid "Source MAC address" ++msgstr "" ++ ++msgid "Source NAT" ++msgstr "" ++ ++msgid "" ++"Source NAT is a specific form of masquerading which allows fine grained " ++"control over the source IP used for outgoing traffic, for example to map " ++"multiple WAN addresses to internal subnets." ++msgstr "" ++ ++msgid "Source address" ++msgstr "" ++ ++msgid "Source port" ++msgstr "" ++ ++msgid "Source zone" ++msgstr "" ++ ++msgid "" ++"The firewall creates zones over your network interfaces to control network " ++"traffic flow." ++msgstr "" ++ ++msgid "" ++"The options below control the forwarding policies between this zone (%s) and " ++"other zones. Destination zones cover forwarded traffic " ++"originating from %q. Source zones match forwarded " ++"traffic from other zones targeted at %q. The forwarding " ++"rule is unidirectional, e.g. a forward from lan to wan does " ++"not imply a permission to forward from wan to lan as well." ++msgstr "" ++ ++msgid "" ++"This page allows you to change advanced properties of the port forwarding " ++"entry. In most cases there is no need to modify those settings." ++msgstr "" ++ ++msgid "" ++"This page allows you to change advanced properties of the traffic rule " ++"entry, such as matched source and destination hosts." ++msgstr "" ++ ++msgid "" ++"This section defines common properties of %q. The input and " ++"output options set the default policies for traffic entering and " ++"leaving this zone while the forward option describes the policy for " ++"forwarded traffic between different networks within the zone. Covered " ++"networks specifies which available networks are members of this zone." ++msgstr "" ++ ++msgid "To %s at %s on this device" ++msgstr "" ++ ++msgid "To %s in %s" ++msgstr "" ++ ++msgid "To %s on this device" ++msgstr "" ++ ++msgid "To %s, %s in %s" ++msgstr "" ++ ++msgid "To source IP" ++msgstr "" ++ ++msgid "To source port" ++msgstr "" ++ ++msgid "Traffic Rules" ++msgstr "" ++ ++msgid "" ++"Traffic rules define policies for packets traveling between different zones, " ++"for example to reject traffic between certain hosts or to open WAN ports on " ++"the router." ++msgstr "" ++ ++msgid "Via %s" ++msgstr "" ++ ++msgid "Via %s at %s" ++msgstr "" ++ ++msgid "" ++"You may specify multiple by selecting \"-- custom --\" and then entering " ++"protocols separated by space." ++msgstr "" ++ ++msgid "Zone %q" ++msgstr "" ++ ++msgid "Zone ⇒ Forwardings" ++msgstr "" ++ ++msgid "Zones" ++msgstr "" ++ ++msgid "accept" ++msgstr "" ++ ++msgid "any" ++msgstr "" ++ ++msgid "any host" ++msgstr "" ++ ++msgid "any router IP" ++msgstr "" ++ ++msgid "any zone" ++msgstr "" ++ ++msgid "don't track" ++msgstr "" ++ ++msgid "drop" ++msgstr "" ++ ++msgid "reject" ++msgstr "" ++ ++msgid "traffic" ++msgstr "" +diff --git a/feeds/luci/applications/luci-app-firewall/po/templates/firewall.pot b/feeds/luci/applications/luci-app-firewall/po/templates/firewall.pot +new file mode 100644 +index 0000000..402aa69 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-firewall/po/templates/firewall.pot +@@ -0,0 +1,425 @@ ++msgid "" ++msgstr "Content-Type: text/plain; charset=UTF-8" ++ ++msgid "%s in %s" ++msgstr "" ++ ++msgid "%s%s with %s" ++msgstr "" ++ ++msgid "%s, %s in %s" ++msgstr "" ++ ++msgid "(Unnamed Entry)" ++msgstr "" ++ ++msgid "(Unnamed Rule)" ++msgstr "" ++ ++msgid "(Unnamed SNAT)" ++msgstr "" ++ ++msgid "-- Please choose --" ++msgstr "" ++ ++msgid "-- custom --" ++msgstr "" ++ ++msgid "%d pkts. per %s" ++msgstr "" ++ ++msgid "%d pkts. per %s, burst %d pkts." ++msgstr "" ++ ++msgid "%s and limit to %s" ++msgstr "" ++ ++msgid "Action" ++msgstr "" ++ ++msgid "Add" ++msgstr "" ++ ++msgid "Add and edit..." ++msgstr "" ++ ++msgid "Advanced Settings" ++msgstr "" ++ ++msgid "Allow forward from source zones:" ++msgstr "" ++ ++msgid "Allow forward to destination zones:" ++msgstr "" ++ ++msgid "Any" ++msgstr "" ++ ++msgid "Covered networks" ++msgstr "" ++ ++msgid "Custom Rules" ++msgstr "" ++ ++msgid "" ++"Custom rules allow you to execute arbritary iptables commands which are not " ++"otherwise covered by the firewall framework. The commands are executed after " ++"each firewall restart, right after the default ruleset has been loaded." ++msgstr "" ++ ++msgid "Destination IP address" ++msgstr "" ++ ++msgid "Destination address" ++msgstr "" ++ ++msgid "Destination port" ++msgstr "" ++ ++msgid "Destination zone" ++msgstr "" ++ ++msgid "Do not rewrite" ++msgstr "" ++ ++msgid "Drop invalid packets" ++msgstr "" ++ ++msgid "Enable" ++msgstr "" ++ ++msgid "Enable NAT Loopback" ++msgstr "" ++ ++msgid "Enable SYN-flood protection" ++msgstr "" ++ ++msgid "Enable logging on this zone" ++msgstr "" ++ ++msgid "External IP address" ++msgstr "" ++ ++msgid "External port" ++msgstr "" ++ ++msgid "External zone" ++msgstr "" ++ ++msgid "Extra arguments" ++msgstr "" ++ ++msgid "Firewall" ++msgstr "" ++ ++msgid "Firewall - Custom Rules" ++msgstr "" ++ ++msgid "Firewall - Port Forwards" ++msgstr "" ++ ++msgid "Firewall - Traffic Rules" ++msgstr "" ++ ++msgid "Firewall - Zone Settings" ++msgstr "" ++ ++msgid "Force connection tracking" ++msgstr "" ++ ++msgid "Forward" ++msgstr "" ++ ++msgid "Forward to" ++msgstr "" ++ ++msgid "From %s in %s" ++msgstr "" ++ ++msgid "From %s in %s with source %s" ++msgstr "" ++ ++msgid "From %s in %s with source %s and %s" ++msgstr "" ++ ++msgid "General Settings" ++msgstr "" ++ ++msgid "IPv4" ++msgstr "" ++ ++msgid "IPv4 and IPv6" ++msgstr "" ++ ++msgid "IPv4 only" ++msgstr "" ++ ++msgid "IPv6" ++msgstr "" ++ ++msgid "IPv6 only" ++msgstr "" ++ ++msgid "Input" ++msgstr "" ++ ++msgid "Inter-Zone Forwarding" ++msgstr "" ++ ++msgid "Internal IP address" ++msgstr "" ++ ++msgid "Internal port" ++msgstr "" ++ ++msgid "Internal zone" ++msgstr "" ++ ++msgid "Limit log messages" ++msgstr "" ++ ++msgid "MSS clamping" ++msgstr "" ++ ++msgid "Masquerading" ++msgstr "" ++ ++msgid "Match" ++msgstr "" ++ ++msgid "Match ICMP type" ++msgstr "" ++ ++msgid "Match forwarded traffic to the given destination port or port range." ++msgstr "" ++ ++msgid "" ++"Match incoming traffic directed at the given destination port or port range " ++"on this host" ++msgstr "" ++ ++msgid "" ++"Match incoming traffic originating from the given source port or port range " ++"on the client host." ++msgstr "" ++ ++msgid "Name" ++msgstr "" ++ ++msgid "New SNAT rule" ++msgstr "" ++ ++msgid "New forward rule" ++msgstr "" ++ ++msgid "New input rule" ++msgstr "" ++ ++msgid "New port forward" ++msgstr "" ++ ++msgid "New source NAT" ++msgstr "" ++ ++msgid "Only match incoming traffic directed at the given IP address." ++msgstr "" ++ ++msgid "Only match incoming traffic from these MACs." ++msgstr "" ++ ++msgid "Only match incoming traffic from this IP or range." ++msgstr "" ++ ++msgid "" ++"Only match incoming traffic originating from the given source port or port " ++"range on the client host" ++msgstr "" ++ ++msgid "Open ports on router" ++msgstr "" ++ ++msgid "Other..." ++msgstr "" ++ ++msgid "Output" ++msgstr "" ++ ++msgid "Passes additional arguments to iptables. Use with care!" ++msgstr "" ++ ++msgid "Port Forwards" ++msgstr "" ++ ++msgid "" ++"Port forwarding allows remote computers on the Internet to connect to a " ++"specific computer or service within the private LAN." ++msgstr "" ++ ++msgid "Protocol" ++msgstr "" ++ ++msgid "" ++"Redirect matched incoming traffic to the given port on the internal host" ++msgstr "" ++ ++msgid "Redirect matched incoming traffic to the specified internal host" ++msgstr "" ++ ++msgid "Restrict Masquerading to given destination subnets" ++msgstr "" ++ ++msgid "Restrict Masquerading to given source subnets" ++msgstr "" ++ ++msgid "Restrict to address family" ++msgstr "" ++ ++msgid "Rewrite matched traffic to the given address." ++msgstr "" ++ ++msgid "" ++"Rewrite matched traffic to the given source port. May be left empty to only " ++"rewrite the IP address." ++msgstr "" ++ ++msgid "Rewrite to source %s" ++msgstr "" ++ ++msgid "Rewrite to source %s, %s" ++msgstr "" ++ ++msgid "SNAT IP address" ++msgstr "" ++ ++msgid "SNAT port" ++msgstr "" ++ ++msgid "Source IP address" ++msgstr "" ++ ++msgid "Source MAC address" ++msgstr "" ++ ++msgid "Source NAT" ++msgstr "" ++ ++msgid "" ++"Source NAT is a specific form of masquerading which allows fine grained " ++"control over the source IP used for outgoing traffic, for example to map " ++"multiple WAN addresses to internal subnets." ++msgstr "" ++ ++msgid "Source address" ++msgstr "" ++ ++msgid "Source port" ++msgstr "" ++ ++msgid "Source zone" ++msgstr "" ++ ++msgid "" ++"The firewall creates zones over your network interfaces to control network " ++"traffic flow." ++msgstr "" ++ ++msgid "" ++"The options below control the forwarding policies between this zone (%s) and " ++"other zones. Destination zones cover forwarded traffic " ++"originating from %q. Source zones match forwarded " ++"traffic from other zones targeted at %q. The forwarding " ++"rule is unidirectional, e.g. a forward from lan to wan does " ++"not imply a permission to forward from wan to lan as well." ++msgstr "" ++ ++msgid "" ++"This page allows you to change advanced properties of the port forwarding " ++"entry. In most cases there is no need to modify those settings." ++msgstr "" ++ ++msgid "" ++"This page allows you to change advanced properties of the traffic rule " ++"entry, such as matched source and destination hosts." ++msgstr "" ++ ++msgid "" ++"This section defines common properties of %q. The input and " ++"output options set the default policies for traffic entering and " ++"leaving this zone while the forward option describes the policy for " ++"forwarded traffic between different networks within the zone. Covered " ++"networks specifies which available networks are members of this zone." ++msgstr "" ++ ++msgid "To %s at %s on this device" ++msgstr "" ++ ++msgid "To %s in %s" ++msgstr "" ++ ++msgid "To %s on this device" ++msgstr "" ++ ++msgid "To %s, %s in %s" ++msgstr "" ++ ++msgid "To source IP" ++msgstr "" ++ ++msgid "To source port" ++msgstr "" ++ ++msgid "Traffic Rules" ++msgstr "" ++ ++msgid "" ++"Traffic rules define policies for packets traveling between different zones, " ++"for example to reject traffic between certain hosts or to open WAN ports on " ++"the router." ++msgstr "" ++ ++msgid "Via %s" ++msgstr "" ++ ++msgid "Via %s at %s" ++msgstr "" ++ ++msgid "" ++"You may specify multiple by selecting \"-- custom --\" and then entering " ++"protocols separated by space." ++msgstr "" ++ ++msgid "Zone %q" ++msgstr "" ++ ++msgid "Zone ⇒ Forwardings" ++msgstr "" ++ ++msgid "Zones" ++msgstr "" ++ ++msgid "accept" ++msgstr "" ++ ++msgid "any" ++msgstr "" ++ ++msgid "any host" ++msgstr "" ++ ++msgid "any router IP" ++msgstr "" ++ ++msgid "any zone" ++msgstr "" ++ ++msgid "don't track" ++msgstr "" ++ ++msgid "drop" ++msgstr "" ++ ++msgid "reject" ++msgstr "" ++ ++msgid "traffic" ++msgstr "" +diff --git a/feeds/luci/applications/luci-app-firewall/po/tr/firewall.po b/feeds/luci/applications/luci-app-firewall/po/tr/firewall.po +new file mode 100644 +index 0000000..60a2190 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-firewall/po/tr/firewall.po +@@ -0,0 +1,432 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Last-Translator: Automatically generated\n" ++"Language-Team: none\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=1; plural=0;\n" ++ ++msgid "%s in %s" ++msgstr "" ++ ++msgid "%s%s with %s" ++msgstr "" ++ ++msgid "%s, %s in %s" ++msgstr "" ++ ++msgid "(Unnamed Entry)" ++msgstr "" ++ ++msgid "(Unnamed Rule)" ++msgstr "" ++ ++msgid "(Unnamed SNAT)" ++msgstr "" ++ ++msgid "-- Please choose --" ++msgstr "" ++ ++msgid "-- custom --" ++msgstr "" ++ ++msgid "%d pkts. per %s" ++msgstr "" ++ ++msgid "%d pkts. per %s, burst %d pkts." ++msgstr "" ++ ++msgid "%s and limit to %s" ++msgstr "" ++ ++msgid "Action" ++msgstr "" ++ ++msgid "Add" ++msgstr "" ++ ++msgid "Add and edit..." ++msgstr "" ++ ++msgid "Advanced Settings" ++msgstr "" ++ ++msgid "Allow forward from source zones:" ++msgstr "" ++ ++msgid "Allow forward to destination zones:" ++msgstr "" ++ ++msgid "Any" ++msgstr "" ++ ++msgid "Covered networks" ++msgstr "" ++ ++msgid "Custom Rules" ++msgstr "" ++ ++msgid "" ++"Custom rules allow you to execute arbritary iptables commands which are not " ++"otherwise covered by the firewall framework. The commands are executed after " ++"each firewall restart, right after the default ruleset has been loaded." ++msgstr "" ++ ++msgid "Destination IP address" ++msgstr "" ++ ++msgid "Destination address" ++msgstr "" ++ ++msgid "Destination port" ++msgstr "" ++ ++msgid "Destination zone" ++msgstr "" ++ ++msgid "Do not rewrite" ++msgstr "" ++ ++msgid "Drop invalid packets" ++msgstr "" ++ ++msgid "Enable" ++msgstr "" ++ ++msgid "Enable NAT Loopback" ++msgstr "" ++ ++msgid "Enable SYN-flood protection" ++msgstr "" ++ ++msgid "Enable logging on this zone" ++msgstr "" ++ ++msgid "External IP address" ++msgstr "" ++ ++msgid "External port" ++msgstr "" ++ ++msgid "External zone" ++msgstr "" ++ ++msgid "Extra arguments" ++msgstr "" ++ ++msgid "Firewall" ++msgstr "" ++ ++msgid "Firewall - Custom Rules" ++msgstr "" ++ ++msgid "Firewall - Port Forwards" ++msgstr "" ++ ++msgid "Firewall - Traffic Rules" ++msgstr "" ++ ++msgid "Firewall - Zone Settings" ++msgstr "" ++ ++msgid "Force connection tracking" ++msgstr "" ++ ++msgid "Forward" ++msgstr "" ++ ++msgid "Forward to" ++msgstr "" ++ ++msgid "From %s in %s" ++msgstr "" ++ ++msgid "From %s in %s with source %s" ++msgstr "" ++ ++msgid "From %s in %s with source %s and %s" ++msgstr "" ++ ++msgid "General Settings" ++msgstr "" ++ ++msgid "IPv4" ++msgstr "" ++ ++msgid "IPv4 and IPv6" ++msgstr "" ++ ++msgid "IPv4 only" ++msgstr "" ++ ++msgid "IPv6" ++msgstr "" ++ ++msgid "IPv6 only" ++msgstr "" ++ ++msgid "Input" ++msgstr "" ++ ++msgid "Inter-Zone Forwarding" ++msgstr "" ++ ++msgid "Internal IP address" ++msgstr "" ++ ++msgid "Internal port" ++msgstr "" ++ ++msgid "Internal zone" ++msgstr "" ++ ++msgid "Limit log messages" ++msgstr "" ++ ++msgid "MSS clamping" ++msgstr "" ++ ++msgid "Masquerading" ++msgstr "" ++ ++msgid "Match" ++msgstr "" ++ ++msgid "Match ICMP type" ++msgstr "" ++ ++msgid "Match forwarded traffic to the given destination port or port range." ++msgstr "" ++ ++msgid "" ++"Match incoming traffic directed at the given destination port or port range " ++"on this host" ++msgstr "" ++ ++msgid "" ++"Match incoming traffic originating from the given source port or port range " ++"on the client host." ++msgstr "" ++ ++msgid "Name" ++msgstr "" ++ ++msgid "New SNAT rule" ++msgstr "" ++ ++msgid "New forward rule" ++msgstr "" ++ ++msgid "New input rule" ++msgstr "" ++ ++msgid "New port forward" ++msgstr "" ++ ++msgid "New source NAT" ++msgstr "" ++ ++msgid "Only match incoming traffic directed at the given IP address." ++msgstr "" ++ ++msgid "Only match incoming traffic from these MACs." ++msgstr "" ++ ++msgid "Only match incoming traffic from this IP or range." ++msgstr "" ++ ++msgid "" ++"Only match incoming traffic originating from the given source port or port " ++"range on the client host" ++msgstr "" ++ ++msgid "Open ports on router" ++msgstr "" ++ ++msgid "Other..." ++msgstr "" ++ ++msgid "Output" ++msgstr "" ++ ++msgid "Passes additional arguments to iptables. Use with care!" ++msgstr "" ++ ++msgid "Port Forwards" ++msgstr "" ++ ++msgid "" ++"Port forwarding allows remote computers on the Internet to connect to a " ++"specific computer or service within the private LAN." ++msgstr "" ++ ++msgid "Protocol" ++msgstr "" ++ ++msgid "" ++"Redirect matched incoming traffic to the given port on the internal host" ++msgstr "" ++ ++msgid "Redirect matched incoming traffic to the specified internal host" ++msgstr "" ++ ++msgid "Restrict Masquerading to given destination subnets" ++msgstr "" ++ ++msgid "Restrict Masquerading to given source subnets" ++msgstr "" ++ ++msgid "Restrict to address family" ++msgstr "" ++ ++msgid "Rewrite matched traffic to the given address." ++msgstr "" ++ ++msgid "" ++"Rewrite matched traffic to the given source port. May be left empty to only " ++"rewrite the IP address." ++msgstr "" ++ ++msgid "Rewrite to source %s" ++msgstr "" ++ ++msgid "Rewrite to source %s, %s" ++msgstr "" ++ ++msgid "SNAT IP address" ++msgstr "" ++ ++msgid "SNAT port" ++msgstr "" ++ ++msgid "Source IP address" ++msgstr "" ++ ++msgid "Source MAC address" ++msgstr "" ++ ++msgid "Source NAT" ++msgstr "" ++ ++msgid "" ++"Source NAT is a specific form of masquerading which allows fine grained " ++"control over the source IP used for outgoing traffic, for example to map " ++"multiple WAN addresses to internal subnets." ++msgstr "" ++ ++msgid "Source address" ++msgstr "" ++ ++msgid "Source port" ++msgstr "" ++ ++msgid "Source zone" ++msgstr "" ++ ++msgid "" ++"The firewall creates zones over your network interfaces to control network " ++"traffic flow." ++msgstr "" ++ ++msgid "" ++"The options below control the forwarding policies between this zone (%s) and " ++"other zones. Destination zones cover forwarded traffic " ++"originating from %q. Source zones match forwarded " ++"traffic from other zones targeted at %q. The forwarding " ++"rule is unidirectional, e.g. a forward from lan to wan does " ++"not imply a permission to forward from wan to lan as well." ++msgstr "" ++ ++msgid "" ++"This page allows you to change advanced properties of the port forwarding " ++"entry. In most cases there is no need to modify those settings." ++msgstr "" ++ ++msgid "" ++"This page allows you to change advanced properties of the traffic rule " ++"entry, such as matched source and destination hosts." ++msgstr "" ++ ++msgid "" ++"This section defines common properties of %q. The input and " ++"output options set the default policies for traffic entering and " ++"leaving this zone while the forward option describes the policy for " ++"forwarded traffic between different networks within the zone. Covered " ++"networks specifies which available networks are members of this zone." ++msgstr "" ++ ++msgid "To %s at %s on this device" ++msgstr "" ++ ++msgid "To %s in %s" ++msgstr "" ++ ++msgid "To %s on this device" ++msgstr "" ++ ++msgid "To %s, %s in %s" ++msgstr "" ++ ++msgid "To source IP" ++msgstr "" ++ ++msgid "To source port" ++msgstr "" ++ ++msgid "Traffic Rules" ++msgstr "" ++ ++msgid "" ++"Traffic rules define policies for packets traveling between different zones, " ++"for example to reject traffic between certain hosts or to open WAN ports on " ++"the router." ++msgstr "" ++ ++msgid "Via %s" ++msgstr "" ++ ++msgid "Via %s at %s" ++msgstr "" ++ ++msgid "" ++"You may specify multiple by selecting \"-- custom --\" and then entering " ++"protocols separated by space." ++msgstr "" ++ ++msgid "Zone %q" ++msgstr "" ++ ++msgid "Zone ⇒ Forwardings" ++msgstr "" ++ ++msgid "Zones" ++msgstr "" ++ ++msgid "accept" ++msgstr "" ++ ++msgid "any" ++msgstr "" ++ ++msgid "any host" ++msgstr "" ++ ++msgid "any router IP" ++msgstr "" ++ ++msgid "any zone" ++msgstr "" ++ ++msgid "don't track" ++msgstr "" ++ ++msgid "drop" ++msgstr "" ++ ++msgid "reject" ++msgstr "" ++ ++msgid "traffic" ++msgstr "" +diff --git a/feeds/luci/applications/luci-app-firewall/po/uk/firewall.po b/feeds/luci/applications/luci-app-firewall/po/uk/firewall.po +new file mode 100644 +index 0000000..3705306 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-firewall/po/uk/firewall.po +@@ -0,0 +1,619 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"PO-Revision-Date: 2012-12-29 12:53+0200\n" ++"Last-Translator: Yurii \n" ++"Language-Team: none\n" ++"Language: uk\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%" ++"10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "%s in %s" ++msgstr "%s у %s" ++ ++msgid "%s%s with %s" ++msgstr "%s%s із %s" ++ ++msgid "%s, %s in %s" ++msgstr "%s, %s у %s" ++ ++msgid "(Unnamed Entry)" ++msgstr "(Ð—Ð°Ð¿Ð¸Ñ Ð±ÐµÐ· імені)" ++ ++msgid "(Unnamed Rule)" ++msgstr "(Правило без імені)" ++ ++msgid "(Unnamed SNAT)" ++msgstr "(SNAT без імені)" ++ ++msgid "-- Please choose --" ++msgstr "-- Виберіть --" ++ ++msgid "-- custom --" ++msgstr "-- додатково --" ++ ++msgid "%d pkts. per %s" ++msgstr "%d пакетів за %s" ++ ++msgid "%d pkts. per %s, burst %d pkts." ++msgstr "%d пакетів за %s, підрÑд %d пакетів" ++ ++msgid "%s and limit to %s" ++msgstr "%s з лімітом %s" ++ ++msgid "Action" ++msgstr "ДіÑ" ++ ++msgid "Add" ++msgstr "Додати" ++ ++msgid "Add and edit..." ++msgstr "Додати та редагувати..." ++ ++msgid "Advanced Settings" ++msgstr "Розширені наÑтройки" ++ ++msgid "Allow forward from source zones:" ++msgstr "Дозволити ÑпрÑÐ¼Ð¾Ð²ÑƒÐ²Ð°Ð½Ð½Ñ Ð²Ñ–Ð´ зон-джерел:" ++ ++msgid "Allow forward to destination zones:" ++msgstr "Дозволити ÑпрÑÐ¼Ð¾Ð²ÑƒÐ²Ð°Ð½Ð½Ñ Ð´Ð¾ зон призначеннÑ:" ++ ++msgid "Any" ++msgstr "Будь-Ñкий" ++ ++msgid "Covered networks" ++msgstr "Покриті мережі" ++ ++msgid "Custom Rules" ++msgstr "ÐаÑтроювані правила" ++ ++msgid "" ++"Custom rules allow you to execute arbritary iptables commands which are not " ++"otherwise covered by the firewall framework. The commands are executed after " ++"each firewall restart, right after the default ruleset has been loaded." ++msgstr "" ++"ÐаÑтроювані правила дозволÑÑŽÑ‚ÑŒ виконувати довільні команди iptables, Ñкі в іншому випадку не охоплені в межах брандмауера. Команди " ++"виконуютьÑÑ Ð¿Ñ–ÑÐ»Ñ ÐºÐ¾Ð¶Ð½Ð¾Ð³Ð¾ Ð¿ÐµÑ€ÐµÐ·Ð°Ð²Ð°Ð½Ñ‚Ð°Ð¶ÐµÐ½Ð½Ñ Ð±Ñ€Ð°Ð½Ð´Ð¼Ð°ÑƒÐµÑ€Ð°, відразу піÑÐ»Ñ " ++"Ð·Ð°Ð²Ð°Ð½Ñ‚Ð°Ð¶ÐµÐ½Ð½Ñ Ñ‚Ð¸Ð¿Ð¾Ð²Ð¾Ð³Ð¾ набору правил." ++ ++msgid "Destination IP address" ++msgstr "IP-адреÑа призначеннÑ" ++ ++msgid "Destination address" ++msgstr "ÐдреÑа призначеннÑ" ++ ++msgid "Destination port" ++msgstr "Порт призначеннÑ" ++ ++msgid "Destination zone" ++msgstr "Зона призначеннÑ" ++ ++msgid "Do not rewrite" ++msgstr "Ðе перезапиÑувати" ++ ++msgid "Drop invalid packets" ++msgstr "Відкидати помилкові пакети" ++ ++msgid "Enable" ++msgstr "Увімкнути" ++ ++msgid "Enable NAT Loopback" ++msgstr "Увімкнути NAT Loopback" ++ ++msgid "Enable SYN-flood protection" ++msgstr "Увімкнути захиÑÑ‚ від SYN-flood" ++ ++msgid "Enable logging on this zone" ++msgstr "Увімкнути реєÑÑ‚Ñ€ÑƒÐ²Ð°Ð½Ð½Ñ Ñƒ цій зоні" ++ ++msgid "External IP address" ++msgstr "Ð—Ð¾Ð²Ð½Ñ–ÑˆÐ½Ñ IP-адреÑа" ++ ++msgid "External port" ++msgstr "Зовнішній порт" ++ ++msgid "External zone" ++msgstr "Ð—Ð¾Ð²Ð½Ñ–ÑˆÐ½Ñ Ð·Ð¾Ð½Ð°" ++ ++msgid "Extra arguments" ++msgstr "Додаткові аргументи" ++ ++msgid "Firewall" ++msgstr "Брандмауер" ++ ++msgid "Firewall - Custom Rules" ++msgstr "Брандмауер — ÐаÑтроювані правила" ++ ++msgid "Firewall - Port Forwards" ++msgstr "Брандмауер — СпрÑÐ¼Ð¾Ð²ÑƒÐ²Ð°Ð½Ð½Ñ Ð¿Ð¾Ñ€Ñ‚Ñ–Ð²" ++ ++msgid "Firewall - Traffic Rules" ++msgstr "Брандмауер — Правила трафіка" ++ ++msgid "Firewall - Zone Settings" ++msgstr "Брандмауер — Параметри зон" ++ ++msgid "Force connection tracking" ++msgstr "Увімкнути відÑÑ‚ÐµÐ¶ÐµÐ½Ð½Ñ Ð·'єднань" ++ ++msgid "Forward" ++msgstr "СпрÑмовуваннÑ" ++ ++msgid "Forward to" ++msgstr "ÑпрÑÐ¼Ð¾Ð²ÑƒÐ²Ð°Ð½Ð½Ñ Ð´Ð¾" ++ ++msgid "From %s in %s" ++msgstr "%s у %s" ++ ++msgid "From %s in %s with source %s" ++msgstr "%s у %s з вихідним %s" ++ ++msgid "From %s in %s with source %s and %s" ++msgstr "%s у %s з вихідним %s та %s" ++ ++msgid "General Settings" ++msgstr "Загальні наÑтройки" ++ ++msgid "IPv4" ++msgstr "IPv4" ++ ++msgid "IPv4 and IPv6" ++msgstr "IPv4 та IPv6" ++ ++msgid "IPv4 only" ++msgstr "Лише IPv4" ++ ++msgid "IPv6" ++msgstr "IPv6" ++ ++msgid "IPv6 only" ++msgstr "Лише IPv6" ++ ++msgid "Input" ++msgstr "Вхідний" ++ ++msgid "Inter-Zone Forwarding" ++msgstr "СпрÑÐ¼Ð¾Ð²ÑƒÐ²Ð°Ð½Ð½Ñ ÐºÑ€Ñ–Ð·ÑŒ зони" ++ ++msgid "Internal IP address" ++msgstr "Ð’Ð½ÑƒÑ‚Ñ€Ñ–ÑˆÐ½Ñ IP-адреÑа" ++ ++msgid "Internal port" ++msgstr "Внутрішній порт" ++ ++msgid "Internal zone" ++msgstr "Ð’Ð½ÑƒÑ‚Ñ€Ñ–ÑˆÐ½Ñ Ð·Ð¾Ð½Ð°" ++ ++msgid "Limit log messages" ++msgstr "ÐžÐ±Ð¼ÐµÐ¶ÐµÐ½Ð½Ñ Ð¿Ð¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½ÑŒ журналу" ++ ++msgid "MSS clamping" ++msgstr "ЗатиÑÐºÐ°Ð½Ð½Ñ MSS" ++ ++msgid "Masquerading" ++msgstr "Підміна" ++ ++msgid "Match" ++msgstr "ЗіÑтавлÑти" ++ ++msgid "Match ICMP type" ++msgstr "ЗіÑтавлÑти ICMP типу" ++ ++msgid "Match forwarded traffic to the given destination port or port range." ++msgstr "" ++"ЗіÑтавлÑти трафік, що ÑпрÑмовуєтьÑÑ Ð½Ð° заданий порт Ð¿Ñ€Ð¸Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð°Ð±Ð¾ діапазон " ++"портів." ++ ++msgid "" ++"Match incoming traffic directed at the given destination port or port range " ++"on this host" ++msgstr "" ++"ЗіÑтавлÑти вхідний трафік, ÑпрÑмований на заданий порт Ð¿Ñ€Ð¸Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð°Ð±Ð¾ " ++"діапазон портів цього вузла." ++ ++msgid "" ++"Match incoming traffic originating from the given source port or port range " ++"on the client host." ++msgstr "" ++"ЗіÑтавлÑти вхідний трафік, що виникає на заданому порту джерела або " ++"діапазоні портів вузла клієнта." ++ ++msgid "Name" ++msgstr "Ім'Ñ" ++ ++msgid "New SNAT rule" ++msgstr "Ðове правило SNAT" ++ ++msgid "New forward rule" ++msgstr "Ðове правило ÑпрÑмовуваннÑ" ++ ++msgid "New input rule" ++msgstr "Ðове вхідне правило" ++ ++msgid "New port forward" ++msgstr "Ðове ÑпрÑÐ¼Ð¾Ð²ÑƒÐ²Ð°Ð½Ð½Ñ Ð¿Ð¾Ñ€Ñ‚Ñƒ" ++ ++msgid "New source NAT" ++msgstr "Ðовий NAT джерела" ++ ++msgid "Only match incoming traffic directed at the given IP address." ++msgstr "ЗіÑтавлÑти тільки вхідний трафік, ÑпрÑмований на задану IP-адреÑу." ++ ++msgid "Only match incoming traffic from these MACs." ++msgstr "ЗіÑтавлÑти тільки вхідний трафік від цих MAC-адреÑ." ++ ++msgid "Only match incoming traffic from this IP or range." ++msgstr "ЗіÑтавлÑти тільки вхідний трафік від цього IP чи діапазону." ++ ++msgid "" ++"Only match incoming traffic originating from the given source port or port " ++"range on the client host" ++msgstr "" ++"ЗіÑтавлÑти тільки вхідний трафік, що виникає на заданому порту джерела або " ++"діапазоні портів вузла клієнта." ++ ++msgid "Open ports on router" ++msgstr "Відкрити порти на роутері" ++ ++msgid "Other..." ++msgstr "Інше..." ++ ++msgid "Output" ++msgstr "Вихідний" ++ ++msgid "Passes additional arguments to iptables. Use with care!" ++msgstr "" ++"Передача додаткових аргументів Ð´Ð»Ñ IPTables. ВикориÑтовуйте з обережніÑÑ‚ÑŽ!" ++ ++msgid "Port Forwards" ++msgstr "СпрÑÐ¼Ð¾Ð²ÑƒÐ²Ð°Ð½Ð½Ñ Ð¿Ð¾Ñ€Ñ‚Ñ–Ð²" ++ ++msgid "" ++"Port forwarding allows remote computers on the Internet to connect to a " ++"specific computer or service within the private LAN." ++msgstr "" ++"СпрÑÐ¼Ð¾Ð²ÑƒÐ²Ð°Ð½Ð½Ñ Ð¿Ð¾Ñ€Ñ‚Ñ–Ð² дозволÑÑ” віддаленим комп'ютерам з Інтернету " ++"підключатиÑÑ Ð´Ð¾ певного комп'ютера або Ñлужби у приватній мережі." ++ ++msgid "Protocol" ++msgstr "Протокол" ++ ++msgid "" ++"Redirect matched incoming traffic to the given port on the internal host" ++msgstr "" ++"ПереÑпрÑмувати відповідний вхідний трафік на заданий порт внутрішнього вузла" ++ ++msgid "Redirect matched incoming traffic to the specified internal host" ++msgstr "ПереÑпрÑмувати відповідний вхідний трафік на заданий внутрішній вузол" ++ ++msgid "Restrict Masquerading to given destination subnets" ++msgstr "Обмежити підміну заданими підмережами призначеннÑ" ++ ++msgid "Restrict Masquerading to given source subnets" ++msgstr "Обмежити підміну заданими вихідними підмережами" ++ ++msgid "Restrict to address family" ++msgstr "Обмежити ÑімейÑтво протоколів" ++ ++msgid "Rewrite matched traffic to the given address." ++msgstr "ПерепиÑувати зіÑтавлений трафік на вказану адреÑу." ++ ++msgid "" ++"Rewrite matched traffic to the given source port. May be left empty to only " ++"rewrite the IP address." ++msgstr "" ++"ПерепиÑувати зіÑтавлений трафік на вказаний порт джерела. Може залишатиÑÑ " ++"порожнім, щоб перепиÑувати тільки IP-адреÑу." ++ ++msgid "Rewrite to source %s" ++msgstr "Ð¿ÐµÑ€ÐµÐ·Ð°Ð¿Ð¸Ñ Ð½Ð° вихідний %s" ++ ++msgid "Rewrite to source %s, %s" ++msgstr "Ð¿ÐµÑ€ÐµÐ·Ð°Ð¿Ð¸Ñ Ð½Ð° вихідний %s, %s" ++ ++msgid "SNAT IP address" ++msgstr "IP-адреÑа SNAT" ++ ++msgid "SNAT port" ++msgstr "Порт SNAT" ++ ++msgid "Source IP address" ++msgstr "IP-адреÑа джерела" ++ ++msgid "Source MAC address" ++msgstr "MAC-адреÑа джерела" ++ ++msgid "Source NAT" ++msgstr "NAT джерела" ++ ++msgid "" ++"Source NAT is a specific form of masquerading which allows fine grained " ++"control over the source IP used for outgoing traffic, for example to map " ++"multiple WAN addresses to internal subnets." ++msgstr "" ++"NAT джерела Ñ” Ñпецифічною формою маÑкуваннÑ, Ñка дозволÑÑ” мати детальний " ++"контроль над IP джерела, що викориÑтовуютьÑÑ Ð´Ð»Ñ Ð²Ð¸Ñ…Ñ–Ð´Ð½Ð¾Ð³Ð¾ трафіку, " ++"наприклад, Ð´Ð»Ñ Ð·Ñ–ÑÑ‚Ð°Ð²Ð»ÐµÐ½Ð½Ñ ÐºÑ–Ð»ÑŒÐºÐ¾Ñ… WAN-Ð°Ð´Ñ€ÐµÑ Ð²Ð½ÑƒÑ‚Ñ€Ñ–ÑˆÐ½Ñ–Ð¼ підмережам." ++ ++msgid "Source address" ++msgstr "ÐдреÑа джерела" ++ ++msgid "Source port" ++msgstr "Порт джерела" ++ ++msgid "Source zone" ++msgstr "Зона-джерело" ++ ++msgid "" ++"The firewall creates zones over your network interfaces to control network " ++"traffic flow." ++msgstr "" ++"Брандмауер Ñтворює зони поверх ваших мережевих інтерфейÑів Ð´Ð»Ñ ÑƒÐ¿Ñ€Ð°Ð²Ð»Ñ–Ð½Ð½Ñ " ++"потоком мережевого трафіку." ++ ++msgid "" ++"The options below control the forwarding policies between this zone (%s) and " ++"other zones. Destination zones cover forwarded traffic " ++"originating from %q. Source zones match forwarded " ++"traffic from other zones targeted at %q. The forwarding " ++"rule is unidirectional, e.g. a forward from lan to wan does " ++"not imply a permission to forward from wan to lan as well." ++msgstr "" ++"Опції, наведені нижче, управлÑÑŽÑ‚ÑŒ політиками ÑпрÑÐ¼Ð¾Ð²ÑƒÐ²Ð°Ð½Ð½Ñ Ð¼Ñ–Ð¶ цією (%s) та " ++"іншими зонами. Зони Ð¿Ñ€Ð¸Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð¿Ð¾ÐºÑ€Ð¸Ð²Ð°ÑŽÑ‚ÑŒÑÑ Ñ‚Ñ€Ð°Ñ„Ñ–ÐºÐ¾Ð¼, що " ++"виходить з %q. Зони-джерела покриваютьÑÑ Ñ‚Ñ€Ð°Ñ„Ñ–ÐºÐ¾Ð¼ " ++"з інших зон, ÑпрÑмованим на %q. Правила ÑпрÑÐ¼ÑƒÐ²Ð°Ð½Ð½Ñ Ñ” " ++"одноÑпрÑмованим, тобто, ÑпрÑÐ¼ÑƒÐ²Ð°Ð½Ð½Ñ Ð²Ñ–Ð´ LAN до WAN не " ++"означає, що Ñ” також дозвіл ÑпрÑмовувати від WAN в LAN." ++ ++msgid "" ++"This page allows you to change advanced properties of the port forwarding " ++"entry. In most cases there is no need to modify those settings." ++msgstr "" ++"Ðа цій Ñторінці можна змінити додаткові влаÑтивоÑÑ‚Ñ– елемента ÑпрÑÐ¼Ð¾Ð²ÑƒÐ²Ð°Ð½Ð½Ñ " ++"портів. У більшоÑÑ‚Ñ– випадків змінювати ці параметри немає необхідноÑÑ‚Ñ–." ++ ++msgid "" ++"This page allows you to change advanced properties of the traffic rule " ++"entry, such as matched source and destination hosts." ++msgstr "" ++"Ðа цій Ñторінці можна змінити додаткові влаÑтивоÑÑ‚Ñ– елемента правил трафіка, " ++"таких Ñк відповідні параметри джерела та вузлів призначеннÑ." ++ ++#, fuzzy ++msgid "" ++"This section defines common properties of %q. The input and " ++"output options set the default policies for traffic entering and " ++"leaving this zone while the forward option describes the policy for " ++"forwarded traffic between different networks within the zone. Covered " ++"networks specifies which available networks are members of this zone." ++msgstr "" ++"Цей розділ визначає загальні влаÑтивоÑÑ‚Ñ– %q. Параметри вхідний Ñ– " ++"вихідний задають типову політику Ð´Ð»Ñ Ñ‚Ñ€Ð°Ñ„Ñ–ÐºÑƒ на вході й виході з " ++"цієї зони, а параметр \"ÑпрÑмовуваннÑ\" опиÑує політику ÑпрÑÐ¼Ð¾Ð²ÑƒÐ²Ð°Ð½Ð½Ñ " ++"трафіку між різними мережами в межах зони. Пункт вкриті мережі " ++"визначає, Ñкі доÑтупні мережі Ñ” членами цієї зони." ++ ++msgid "To %s at %s on this device" ++msgstr "%s на %s цього приÑтрою" ++ ++msgid "To %s in %s" ++msgstr "%s у %s" ++ ++msgid "To %s on this device" ++msgstr "%s на цього приÑтрою" ++ ++msgid "To %s, %s in %s" ++msgstr "%s, %s у %s" ++ ++msgid "To source IP" ++msgstr "До IP джерела" ++ ++msgid "To source port" ++msgstr "До порту джерела" ++ ++msgid "Traffic Rules" ++msgstr "Правила трафіка" ++ ++msgid "" ++"Traffic rules define policies for packets traveling between different zones, " ++"for example to reject traffic between certain hosts or to open WAN ports on " ++"the router." ++msgstr "" ++"Правила трафіка визначають політику Ð´Ð»Ñ Ð¿Ð°ÐºÐµÑ‚Ñ–Ð², що переÑилаютьÑÑ Ð¼Ñ–Ð¶ " ++"різними зонами, наприклад, відхилÑти трафік між певними вузлами або відкрити " ++"порти WAN на маршрутизаторі." ++ ++msgid "Via %s" ++msgstr "Через %s" ++ ++msgid "Via %s at %s" ++msgstr "Через %s на %s" ++ ++msgid "" ++"You may specify multiple by selecting \"-- custom --\" and then entering " ++"protocols separated by space." ++msgstr "" ++"Ви можете вказати кілька протоколів, вибравши \"-- додатково --\", а потім " ++"увівши Ñ—Ñ…, розділÑючи пробілами." ++ ++msgid "Zone %q" ++msgstr "Зона %q" ++ ++msgid "Zone ⇒ Forwardings" ++msgstr "Зона ⇒ СпрÑмовуваннÑ" ++ ++msgid "Zones" ++msgstr "Зони" ++ ++msgid "accept" ++msgstr "приймати" ++ ++msgid "any" ++msgstr "будь-Ñкий" ++ ++msgid "any host" ++msgstr "будь-Ñкий вузол" ++ ++msgid "any router IP" ++msgstr "будь-Ñкий IP роутера" ++ ++msgid "any zone" ++msgstr "будь-Ñкій зоні" ++ ++msgid "don't track" ++msgstr "не відÑтеж." ++ ++msgid "drop" ++msgstr "опуÑкати" ++ ++msgid "reject" ++msgstr "відкидати" ++ ++msgid "traffic" ++msgstr "" ++ ++#~ msgid "Destination" ++#~ msgstr "ПризначеннÑ" ++ ++#~ msgid "Family" ++#~ msgstr "СімейÑтво" ++ ++#~ msgid "Forward to %s in %s" ++#~ msgstr "ÑпрÑÐ¼Ð¾Ð²ÑƒÐ²Ð°Ð½Ð½Ñ Ð´Ð¾ %s у %s" ++ ++#~ msgid "Forward to %s, %s in %s" ++#~ msgstr "ÑпрÑÐ¼Ð¾Ð²ÑƒÐ²Ð°Ð½Ð½Ñ Ð´Ð¾ %s, %s у %s" ++ ++#~ msgid "SNAT" ++#~ msgstr "SNAT" ++ ++#~ msgid "Source" ++#~ msgstr "Джерело" ++ ++#~ msgid "To %s" ++#~ msgstr "%s" ++ ++#~ msgid "To %s at %s" ++#~ msgstr "%s через %s" ++ ++#~ msgid "Via" ++#~ msgstr "Через" ++ ++#~ msgid "Accept forward" ++#~ msgstr "Приймати ÑпрÑмовуваннÑ" ++ ++#~ msgid "Accept input" ++#~ msgstr "Приймати вхідні" ++ ++#~ msgid "Disable" ++#~ msgstr "Вимкнути" ++ ++#~ msgid "Discard forward" ++#~ msgstr "СкаÑувати ÑпрÑмовуваннÑ" ++ ++#~ msgid "Discard input" ++#~ msgstr "СкаÑувати введеннÑ" ++ ++#~ msgid "Do not track forward" ++#~ msgstr "Ðе відÑтежувати ÑпрÑмовуваннÑ" ++ ++#~ msgid "Do not track input" ++#~ msgstr "Ðе відÑтежувати введеннÑ" ++ ++#~ msgid "IP" ++#~ msgstr "IP" ++ ++#~ msgid "IP range" ++#~ msgstr "діапазон IP" ++ ++#~ msgid "IPs" ++#~ msgstr "IP" ++ ++#~ msgid "MAC" ++#~ msgstr "MAC" ++ ++#~ msgid "MACs" ++#~ msgstr "MAC" ++ ++#~ msgid "Refuse forward" ++#~ msgstr "Відкидати ÑпрÑмовуваннÑ" ++ ++#~ msgid "Refuse input" ++#~ msgstr "Відкидати вхідні дані" ++ ++#~ msgid "Rule is disabled" ++#~ msgstr "Правило вимкнене" ++ ++#~ msgid "Rule is enabled" ++#~ msgstr "Правило ввімкнене" ++ ++#~ msgid "day" ++#~ msgstr "день" ++ ++#~ msgid "hour" ++#~ msgstr "годину" ++ ++#~ msgid "minute" ++#~ msgstr "хвилину" ++ ++#~ msgid "not" ++#~ msgstr "не" ++ ++#~ msgid "port" ++#~ msgstr "порт" ++ ++#~ msgid "ports" ++#~ msgstr "порти" ++ ++#~ msgid "second" ++#~ msgstr "Ñекунду" ++ ++#~ msgid "type" ++#~ msgstr "типом" ++ ++#~ msgid "types" ++#~ msgstr "типами" ++ ++#~ msgid "(optional)" ++#~ msgstr "(необов'Ñзково)" ++ ++#~ msgid "Intended destination address" ++#~ msgstr "ÐдреÑа призначеннÑ" ++ ++#~ msgid "Internal port (optional)" ++#~ msgstr "Внутрішній порт (необов'Ñзково)" ++ ++#~ msgid "Advanced Options" ++#~ msgstr "Додаткові параметри" ++ ++#~ msgid "Advanced Rules" ++#~ msgstr "Розширені правила" ++ ++#~ msgid "" ++#~ "Advanced rules let you customize the firewall to your needs. Only new " ++#~ "connections will be matched. Packets belonging to already open " ++#~ "connections are automatically allowed to pass the firewall." ++#~ msgstr "" ++#~ "Розширені правила дозволÑÑŽÑ‚ÑŒ налаштувати брандмауер Ð´Ð»Ñ Ð²Ð°ÑˆÐ¸Ñ… потреб. " ++#~ "Лише нові з'Ñ”Ð´Ð½Ð°Ð½Ð½Ñ Ð±ÑƒÐ´ÑƒÑ‚ÑŒ узгоджені. Пакети, що належать вже відкриті " ++#~ "з'Ñ”Ð´Ð½Ð°Ð½Ð½Ñ Ð°Ð²Ñ‚Ð¾Ð¼Ð°Ñ‚Ð¸Ñ‡Ð½Ð¾ пропуÑкаютьÑÑ Ð±Ñ€Ð°Ð½Ð´Ð¼Ð°ÑƒÐµÑ€Ð¾Ð¼." ++ ++#~ msgid "Custom Rules (/etc/firewall.user)" ++#~ msgstr "КориÑтувацькі правила (/etc/firewall.user)" ++ ++#~ msgid "Device" ++#~ msgstr "ПриÑтрій" ++ ++#~ msgid "" ++#~ "For DNAT, match incoming traffic directed at the given destination ip " ++#~ "address. For SNAT rewrite the source address to the given address." ++#~ msgstr "" ++#~ "Ð”Ð»Ñ DNAT узгоджує вхідний трафік, ÑпрÑмований до відповідної IP адреÑи " ++#~ "призначеннÑ. Ð”Ð»Ñ SNAT замінÑÑ” адреÑу джерела на дану адреÑу" +diff --git a/feeds/luci/applications/luci-app-firewall/po/vi/firewall.po b/feeds/luci/applications/luci-app-firewall/po/vi/firewall.po +new file mode 100644 +index 0000000..645aa88 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-firewall/po/vi/firewall.po +@@ -0,0 +1,565 @@ ++# luci-fw.pot ++# generated from ./applications/luci-fw/luasrc/i18n/luci-fw.en.lua ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Report-Msgid-Bugs-To: \n" ++"POT-Creation-Date: 2010-03-30 17:00+0200\n" ++"PO-Revision-Date: 2009-08-16 14:02+0200\n" ++"Last-Translator: Hong Phuc Dang \n" ++"Language-Team: LANGUAGE \n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"X-Generator: Pootle 1.1.0\n" ++ ++msgid "%s in %s" ++msgstr "" ++ ++msgid "%s%s with %s" ++msgstr "" ++ ++msgid "%s, %s in %s" ++msgstr "" ++ ++msgid "(Unnamed Entry)" ++msgstr "" ++ ++msgid "(Unnamed Rule)" ++msgstr "" ++ ++msgid "(Unnamed SNAT)" ++msgstr "" ++ ++msgid "-- Please choose --" ++msgstr "" ++ ++msgid "-- custom --" ++msgstr "" ++ ++msgid "%d pkts. per %s" ++msgstr "" ++ ++msgid "%d pkts. per %s, burst %d pkts." ++msgstr "" ++ ++msgid "%s and limit to %s" ++msgstr "" ++ ++msgid "Action" ++msgstr "Action" ++ ++msgid "Add" ++msgstr "" ++ ++msgid "Add and edit..." ++msgstr "" ++ ++msgid "Advanced Settings" ++msgstr "" ++ ++msgid "Allow forward from source zones:" ++msgstr "" ++ ++msgid "Allow forward to destination zones:" ++msgstr "" ++ ++msgid "Any" ++msgstr "" ++ ++msgid "Covered networks" ++msgstr "" ++ ++msgid "Custom Rules" ++msgstr "" ++ ++msgid "" ++"Custom rules allow you to execute arbritary iptables commands which are not " ++"otherwise covered by the firewall framework. The commands are executed after " ++"each firewall restart, right after the default ruleset has been loaded." ++msgstr "" ++ ++msgid "Destination IP address" ++msgstr "" ++ ++msgid "Destination address" ++msgstr "Äịa chỉ Ä‘iểm đến" ++ ++msgid "Destination port" ++msgstr "Cổng Ä‘iểm đến" ++ ++#, fuzzy ++msgid "Destination zone" ++msgstr "Äiểm đến" ++ ++msgid "Do not rewrite" ++msgstr "" ++ ++msgid "Drop invalid packets" ++msgstr "Bá» qua nhÆ°ng gói không hợp lý" ++ ++msgid "Enable" ++msgstr "" ++ ++msgid "Enable NAT Loopback" ++msgstr "" ++ ++#, fuzzy ++msgid "Enable SYN-flood protection" ++msgstr "SYN-flood bảo vệ " ++ ++msgid "Enable logging on this zone" ++msgstr "" ++ ++msgid "External IP address" ++msgstr "" ++ ++msgid "External port" ++msgstr "External port" ++ ++msgid "External zone" ++msgstr "" ++ ++msgid "Extra arguments" ++msgstr "" ++ ++msgid "Firewall" ++msgstr "Firewall" ++ ++msgid "Firewall - Custom Rules" ++msgstr "" ++ ++msgid "Firewall - Port Forwards" ++msgstr "" ++ ++msgid "Firewall - Traffic Rules" ++msgstr "" ++ ++msgid "Firewall - Zone Settings" ++msgstr "" ++ ++msgid "Force connection tracking" ++msgstr "" ++ ++msgid "Forward" ++msgstr "" ++ ++msgid "Forward to" ++msgstr "" ++ ++msgid "From %s in %s" ++msgstr "" ++ ++msgid "From %s in %s with source %s" ++msgstr "" ++ ++msgid "From %s in %s with source %s and %s" ++msgstr "" ++ ++msgid "General Settings" ++msgstr "" ++ ++msgid "IPv4" ++msgstr "" ++ ++msgid "IPv4 and IPv6" ++msgstr "" ++ ++msgid "IPv4 only" ++msgstr "" ++ ++msgid "IPv6" ++msgstr "" ++ ++msgid "IPv6 only" ++msgstr "" ++ ++msgid "Input" ++msgstr "Input" ++ ++msgid "Inter-Zone Forwarding" ++msgstr "" ++ ++#, fuzzy ++msgid "Internal IP address" ++msgstr "Internal address" ++ ++#, fuzzy ++msgid "Internal port" ++msgstr "External port" ++ ++msgid "Internal zone" ++msgstr "" ++ ++msgid "Limit log messages" ++msgstr "" ++ ++#, fuzzy ++msgid "MSS clamping" ++msgstr "MSS Clamping" ++ ++msgid "Masquerading" ++msgstr "" ++ ++msgid "Match" ++msgstr "" ++ ++msgid "Match ICMP type" ++msgstr "" ++ ++msgid "Match forwarded traffic to the given destination port or port range." ++msgstr "" ++ ++msgid "" ++"Match incoming traffic directed at the given destination port or port range " ++"on this host" ++msgstr "" ++ ++msgid "" ++"Match incoming traffic originating from the given source port or port range " ++"on the client host." ++msgstr "" ++ ++msgid "Name" ++msgstr "" ++ ++msgid "New SNAT rule" ++msgstr "" ++ ++msgid "New forward rule" ++msgstr "" ++ ++msgid "New input rule" ++msgstr "" ++ ++msgid "New port forward" ++msgstr "" ++ ++msgid "New source NAT" ++msgstr "" ++ ++msgid "Only match incoming traffic directed at the given IP address." ++msgstr "" ++ ++msgid "Only match incoming traffic from these MACs." ++msgstr "" ++ ++msgid "Only match incoming traffic from this IP or range." ++msgstr "" ++ ++msgid "" ++"Only match incoming traffic originating from the given source port or port " ++"range on the client host" ++msgstr "" ++ ++msgid "Open ports on router" ++msgstr "" ++ ++msgid "Other..." ++msgstr "" ++ ++msgid "Output" ++msgstr "Output" ++ ++msgid "Passes additional arguments to iptables. Use with care!" ++msgstr "" ++ ++msgid "Port Forwards" ++msgstr "" ++ ++msgid "" ++"Port forwarding allows remote computers on the Internet to connect to a " ++"specific computer or service within the private LAN." ++msgstr "" ++ ++msgid "Protocol" ++msgstr "" ++ ++msgid "" ++"Redirect matched incoming traffic to the given port on the internal host" ++msgstr "" ++ ++msgid "Redirect matched incoming traffic to the specified internal host" ++msgstr "" ++ ++msgid "Restrict Masquerading to given destination subnets" ++msgstr "" ++ ++msgid "Restrict Masquerading to given source subnets" ++msgstr "" ++ ++msgid "Restrict to address family" ++msgstr "" ++ ++msgid "Rewrite matched traffic to the given address." ++msgstr "" ++ ++msgid "" ++"Rewrite matched traffic to the given source port. May be left empty to only " ++"rewrite the IP address." ++msgstr "" ++ ++msgid "Rewrite to source %s" ++msgstr "" ++ ++msgid "Rewrite to source %s, %s" ++msgstr "" ++ ++msgid "SNAT IP address" ++msgstr "" ++ ++msgid "SNAT port" ++msgstr "" ++ ++#, fuzzy ++msgid "Source IP address" ++msgstr "Äỉa chỉ MAC nguồn" ++ ++msgid "Source MAC address" ++msgstr "" ++ ++msgid "Source NAT" ++msgstr "" ++ ++msgid "" ++"Source NAT is a specific form of masquerading which allows fine grained " ++"control over the source IP used for outgoing traffic, for example to map " ++"multiple WAN addresses to internal subnets." ++msgstr "" ++ ++#, fuzzy ++msgid "Source address" ++msgstr "Äỉa chỉ MAC nguồn" ++ ++msgid "Source port" ++msgstr "Cổng nguồn" ++ ++#, fuzzy ++msgid "Source zone" ++msgstr "Cổng nguồn" ++ ++msgid "" ++"The firewall creates zones over your network interfaces to control network " ++"traffic flow." ++msgstr "" ++"The firewall tạo zones trên giao diện mạng lÆ°á»›i để Ä‘iá»u triển sá»± dòng lÆ°u " ++"thông của mạng." ++ ++msgid "" ++"The options below control the forwarding policies between this zone (%s) and " ++"other zones. Destination zones cover forwarded traffic " ++"originating from %q. Source zones match forwarded " ++"traffic from other zones targeted at %q. The forwarding " ++"rule is unidirectional, e.g. a forward from lan to wan does " ++"not imply a permission to forward from wan to lan as well." ++msgstr "" ++ ++msgid "" ++"This page allows you to change advanced properties of the port forwarding " ++"entry. In most cases there is no need to modify those settings." ++msgstr "" ++ ++msgid "" ++"This page allows you to change advanced properties of the traffic rule " ++"entry, such as matched source and destination hosts." ++msgstr "" ++ ++msgid "" ++"This section defines common properties of %q. The input and " ++"output options set the default policies for traffic entering and " ++"leaving this zone while the forward option describes the policy for " ++"forwarded traffic between different networks within the zone. Covered " ++"networks specifies which available networks are members of this zone." ++msgstr "" ++ ++msgid "To %s at %s on this device" ++msgstr "" ++ ++msgid "To %s in %s" ++msgstr "" ++ ++msgid "To %s on this device" ++msgstr "" ++ ++msgid "To %s, %s in %s" ++msgstr "" ++ ++msgid "To source IP" ++msgstr "" ++ ++msgid "To source port" ++msgstr "" ++ ++msgid "Traffic Rules" ++msgstr "" ++ ++msgid "" ++"Traffic rules define policies for packets traveling between different zones, " ++"for example to reject traffic between certain hosts or to open WAN ports on " ++"the router." ++msgstr "" ++ ++msgid "Via %s" ++msgstr "" ++ ++msgid "Via %s at %s" ++msgstr "" ++ ++msgid "" ++"You may specify multiple by selecting \"-- custom --\" and then entering " ++"protocols separated by space." ++msgstr "" ++ ++msgid "Zone %q" ++msgstr "" ++ ++msgid "Zone ⇒ Forwardings" ++msgstr "" ++ ++msgid "Zones" ++msgstr "Zones" ++ ++msgid "accept" ++msgstr "chấp nhận" ++ ++msgid "any" ++msgstr "" ++ ++msgid "any host" ++msgstr "" ++ ++msgid "any router IP" ++msgstr "" ++ ++msgid "any zone" ++msgstr "" ++ ++msgid "don't track" ++msgstr "" ++ ++msgid "drop" ++msgstr "drop" ++ ++msgid "reject" ++msgstr "Không chấp nhận" ++ ++msgid "traffic" ++msgstr "" ++ ++#~ msgid "Destination" ++#~ msgstr "Äiểm đến" ++ ++#~ msgid "Source" ++#~ msgstr "Nguồn" ++ ++#~ msgid "Internal port (optional)" ++#~ msgstr "Internal port (tùy chá»n)" ++ ++#~ msgid "Advanced Rules" ++#~ msgstr "Luật cấp cao" ++ ++#~ msgid "" ++#~ "Advanced rules let you customize the firewall to your needs. Only new " ++#~ "connections will be matched. Packets belonging to already open " ++#~ "connections are automatically allowed to pass the firewall." ++#~ msgstr "" ++#~ "Luật cấp cao để bạn tùy chỉnh firewall mà bạn cần. Chỉ những kết nối má»›i " ++#~ "sẽ được làm cho phù hợp. Các gói thuá»™c đã mở các kết nối sẽ tá»± Ä‘á»™ng cho " ++#~ "phép vượt qua firewall." ++ ++#~ msgid "Port forwarding" ++#~ msgstr "Cổng chuyển tiếp" ++ ++#~ msgid "" ++#~ "Port forwarding allows to provide network services in the internal " ++#~ "network to an external network." ++#~ msgstr "" ++#~ "Cổng chuyển tiếp cho phép cung cấp những dịch vụ mạng trong vùng tá»›i má»™t " ++#~ "ngoại mạng. " ++ ++#~ msgid "Traffic Redirection" ++#~ msgstr "Sá»± chuyển hÆ°á»›ng lÆ°u thông" ++ ++#~ msgid "" ++#~ "Traffic redirection allows you to change the destination address of " ++#~ "forwarded packets." ++#~ msgstr "" ++#~ "Sá»± chuyển hÆ°á»›ng lÆ°u thông cho phép bạn thay đổi địa chỉ Ä‘iểm đến của gói " ++#~ "chuyển tiếp. " ++ ++#, fuzzy ++#~ msgid "Network" ++#~ msgstr "Networks" ++ ++#~ msgid "Traffic Control" ++#~ msgstr "Äiá»u khiển lÆ°u thông" ++ ++#~ msgid "Zone-to-Zone traffic" ++#~ msgstr "LÆ°u thông Zone- to - Zone" ++ ++#, fuzzy ++#~ msgid "" ++#~ "Here you can specify which network traffic is allowed to flow between " ++#~ "network zones. Only new connections will be matched. Packets belonging " ++#~ "to already open connections are automatically allowed to pass the " ++#~ "firewall. If you experience occasional connection problems try enabling " ++#~ "MSS Clamping otherwise disable it for performance reasons." ++#~ msgstr "" ++#~ "Tại đây bạn có thể xác định được mạng lÆ°á»›i giao thông được phép lÆ°u lượng " ++#~ "qua network zone. Chỉ có kết nối má»›i sẽ là phù hợp. Các gói thuá»™c kết nối " ++#~ "đã mở được tá»± Ä‘á»™ng được cho phép để vượt qua firewall. Nếu bạn gặp vấn Ä‘á» " ++#~ "kết nối thá»­ kích hoạt MSS Clamping hoặc vô hiệu hóa nó vì lý do thá»±c thi." ++ ++#~ msgid "Zone" ++#~ msgstr "Zone" ++ ++#, fuzzy ++#~ msgid "Destination IP" ++#~ msgstr "Äiểm đến" ++ ++#, fuzzy ++#~ msgid "IP address" ++#~ msgstr "Äịa chỉ IP" ++ ++#, fuzzy ++#~ msgid "Source MAC-address" ++#~ msgstr "Äỉa chỉ MAC nguồn" ++ ++#~ msgid "Custom forwarding" ++#~ msgstr "Tùy chỉnh chuyển tiếp" ++ ++#~ msgid "Input Zone" ++#~ msgstr "Input Zone" ++ ++#~ msgid "Output Zone" ++#~ msgstr "Output Zone" ++ ++#~ msgid "External Zone" ++#~ msgstr "External Zone" ++ ++#~ msgid "Source MAC" ++#~ msgstr "Nguồn MAC" ++ ++#~ msgid "Defaults" ++#~ msgstr "Mặc định" ++ ++#~ msgid "" ++#~ "These are the default settings that are used if no other rules match." ++#~ msgstr "" ++#~ "Có những cài đặt mặc định được dùng nếu những cái luật khác không phù hợp" ++ ++#~ msgid "" ++#~ "Zones part the network interfaces into certain isolated areas to separate " ++#~ "network traffic. One or more networks can belong to a zone. The MASQ-flag " ++#~ "enables NAT masquerading for all outgoing traffic on this zone." ++#~ msgstr "" ++#~ "Phân vùng các phần giao diện mạng vào những khu vá»±c cô lập nhất định để " ++#~ "phân chia mạng lÆ°á»›i lÆ°u thông. Má»™t hoặc nhiá»u mạng lÆ°á»›i có thể thuá»™c vào " ++#~ "má»™t khu. Các MASQ-flag kích hoạt NAT masquerading cho tất cả các lÆ°u " ++#~ "lượng giao thông trên khu vá»±c này." ++ ++#~ msgid "MASQ" ++#~ msgstr "MASQ" ++ ++#~ msgid "contained networks" ++#~ msgstr "contained networks" +diff --git a/feeds/luci/applications/luci-app-firewall/po/zh-cn/firewall.po b/feeds/luci/applications/luci-app-firewall/po/zh-cn/firewall.po +new file mode 100644 +index 0000000..03c1b00 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-firewall/po/zh-cn/firewall.po +@@ -0,0 +1,589 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Report-Msgid-Bugs-To: \n" ++"POT-Creation-Date: 2010-03-30 17:00+0200\n" ++"PO-Revision-Date: 2014-06-14 18:05+0200\n" ++"Last-Translator: jame-he <755085131@qq.com>\n" ++"Language-Team: QQ Group 75543259 \n" ++"Language: zh_CN\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=1; plural=0;\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "%s in %s" ++msgstr "%s ä½äºŽ %s" ++ ++msgid "%s%s with %s" ++msgstr "%s%s å’Œ %s" ++ ++msgid "%s, %s in %s" ++msgstr "%s, %s ä½äºŽ %s" ++ ++msgid "(Unnamed Entry)" ++msgstr "(未命åæ¡ç›®)" ++ ++msgid "(Unnamed Rule)" ++msgstr "(未命å规则)" ++ ++msgid "(Unnamed SNAT)" ++msgstr "(未命åSNAT)" ++ ++msgid "-- Please choose --" ++msgstr "-- 请选择 --" ++ ++msgid "-- custom --" ++msgstr "-- 自定义 --" ++ ++msgid "%d pkts. per %s" ++msgstr "%d 包.æ¯ %s" ++ ++msgid "%d pkts. per %s, burst %d pkts." ++msgstr "%d 包. æ¯ %s, çªå‘ %d 包." ++ ++msgid "%s and limit to %s" ++msgstr "%s 并且é™åˆ¶åˆ° %s" ++ ++msgid "Action" ++msgstr "动作" ++ ++msgid "Add" ++msgstr "添加" ++ ++msgid "Add and edit..." ++msgstr "添加并编辑..." ++ ++msgid "Advanced Settings" ++msgstr "高级设置" ++ ++msgid "Allow forward from source zones:" ++msgstr "å…许从æºåŒºåŸŸè½¬å‘" ++ ++msgid "Allow forward to destination zones:" ++msgstr "å…许转å‘到目标区域" ++ ++msgid "Any" ++msgstr "任何" ++ ++msgid "Covered networks" ++msgstr "覆盖网络" ++ ++msgid "Custom Rules" ++msgstr "自定义规则" ++ ++msgid "" ++"Custom rules allow you to execute arbritary iptables commands which are not " ++"otherwise covered by the firewall framework. The commands are executed after " ++"each firewall restart, right after the default ruleset has been loaded." ++msgstr "" ++"自定义规则å…许è¿è¡Œä¸€äº›é˜²ç«å¢™æ²¡æœ‰åŒ…å«çš„功能。这些命令将在æ¯æ¬¡é‡å¯é˜²ç«å¢™æ—¶ï¼Œåœ¨" ++"默认的规则è¿è¡ŒåŽç«‹å³æ‰§è¡Œã€‚" ++ ++msgid "Destination IP address" ++msgstr "目标IP地å€" ++ ++msgid "Destination address" ++msgstr "目标地å€" ++ ++msgid "Destination port" ++msgstr "目标端å£" ++ ++msgid "Destination zone" ++msgstr "目标区域" ++ ++msgid "Do not rewrite" ++msgstr "ä¸å¡«å†™=(所有端å£ï¼‰" ++ ++msgid "Drop invalid packets" ++msgstr "丢弃无效数æ®åŒ…" ++ ++msgid "Enable" ++msgstr "å¯ç”¨" ++ ++msgid "Enable NAT Loopback" ++msgstr "å¯ç”¨NAT环回" ++ ++msgid "Enable SYN-flood protection" ++msgstr "å¯ç”¨SYN-flood防御" ++ ++msgid "Enable logging on this zone" ++msgstr "在此区域å…许进入" ++ ++msgid "External IP address" ++msgstr "外部IP地å€" ++ ++msgid "External port" ++msgstr "外部端å£" ++ ++msgid "External zone" ++msgstr "外部区域" ++ ++msgid "Extra arguments" ++msgstr "附加å‚æ•°" ++ ++msgid "Firewall" ++msgstr "防ç«å¢™" ++ ++msgid "Firewall - Custom Rules" ++msgstr "防ç«å¢™ - 自定义规则" ++ ++msgid "Firewall - Port Forwards" ++msgstr "防ç«å¢™ - 端å£è½¬å‘" ++ ++msgid "Firewall - Traffic Rules" ++msgstr "防ç«å¢™ - 通信规则" ++ ++msgid "Firewall - Zone Settings" ++msgstr "防ç«å¢™-区域设置" ++ ++msgid "Force connection tracking" ++msgstr "强制连接追踪" ++ ++msgid "Forward" ++msgstr "转å‘" ++ ++msgid "Forward to" ++msgstr "转å‘到" ++ ++msgid "From %s in %s" ++msgstr "æ¥è‡ª %s ä½äºŽ %s" ++ ++msgid "From %s in %s with source %s" ++msgstr "æ¥è‡ª %s ä½äºŽ %s å¸¦æº %s" ++ ++msgid "From %s in %s with source %s and %s" ++msgstr "æ¥è‡ª %s ä½äºŽ %s å¸¦æº %s 并且 %s" ++ ++msgid "General Settings" ++msgstr "基本设置" ++ ++msgid "IPv4" ++msgstr "IPv4" ++ ++msgid "IPv4 and IPv6" ++msgstr "IPv4 å’Œ IPv6" ++ ++msgid "IPv4 only" ++msgstr "ä»…IPv4" ++ ++msgid "IPv6" ++msgstr "IPv6" ++ ++msgid "IPv6 only" ++msgstr "ä»…IPv6" ++ ++msgid "Input" ++msgstr "入站数æ®" ++ ++msgid "Inter-Zone Forwarding" ++msgstr "端å£è§¦å‘" ++ ++msgid "Internal IP address" ++msgstr "内部IP地å€" ++ ++msgid "Internal port" ++msgstr "内部端å£" ++ ++msgid "Internal zone" ++msgstr "内部区域" ++ ++msgid "Limit log messages" ++msgstr "é™åˆ¶æ—¥å¿—ä¿¡æ¯" ++ ++msgid "MSS clamping" ++msgstr "MSS钳制" ++ ++msgid "Masquerading" ++msgstr "IP动æ€ä¼ªè£…" ++ ++msgid "Match" ++msgstr "匹é…规则" ++ ++msgid "Match ICMP type" ++msgstr "匹é…ICMP类型" ++ ++msgid "Match forwarded traffic to the given destination port or port range." ++msgstr "需è¦åŒ¹é…转å‘æµé‡åˆ°çš„目标端å£æˆ–端å£èŒƒå›´" ++ ++msgid "" ++"Match incoming traffic directed at the given destination port or port range " ++"on this host" ++msgstr "需è¦åŒ¹é…入站æµé‡åˆ°çš„目标端å£æˆ–端å£èŒƒå›´" ++ ++msgid "" ++"Match incoming traffic originating from the given source port or port range " ++"on the client host." ++msgstr "需è¦åŒ¹é…入站æµé‡çš„æºç«¯å£æˆ–端å£èŒƒå›´" ++ ++msgid "Name" ++msgstr "åå­—" ++ ++msgid "New SNAT rule" ++msgstr "新建SNAT规则" ++ ++msgid "New forward rule" ++msgstr "新建转å‘规则" ++ ++msgid "New input rule" ++msgstr "新建进入规则" ++ ++msgid "New port forward" ++msgstr "新建端å£è½¬å‘" ++ ++msgid "New source NAT" ++msgstr "新建Source NAT" ++ ++msgid "Only match incoming traffic directed at the given IP address." ++msgstr "需è¦åŒ¹é…入站æµé‡çš„æºIP" ++ ++msgid "Only match incoming traffic from these MACs." ++msgstr "需è¦åŒ¹é…入站æµé‡çš„æºMACs(å¯ä»¥ä¸ºå¤šä¸ªï¼‰" ++ ++msgid "Only match incoming traffic from this IP or range." ++msgstr "需è¦åŒ¹é…入站æµé‡çš„æºIP或IP范围" ++ ++msgid "" ++"Only match incoming traffic originating from the given source port or port " ++"range on the client host" ++msgstr "需è¦åŒ¹é…入站æµé‡çš„æºç«¯å£æˆ–端å£èŒƒå›´" ++ ++msgid "Open ports on router" ++msgstr "打开路由器端å£" ++ ++msgid "Other..." ++msgstr "其它..." ++ ++msgid "Output" ++msgstr "出站数æ®" ++ ++msgid "Passes additional arguments to iptables. Use with care!" ++msgstr "传递到iptablesçš„é¢å¤–å‚数。å°å¿ƒä½¿ç”¨ï¼" ++ ++msgid "Port Forwards" ++msgstr "端å£è½¬å‘" ++ ++msgid "" ++"Port forwarding allows remote computers on the Internet to connect to a " ++"specific computer or service within the private LAN." ++msgstr "端å£è½¬å‘å…许æ¥è‡ªInternet的计算机访问ç§æœ‰å±€åŸŸç½‘内的计算机或æœåŠ¡" ++ ++msgid "Protocol" ++msgstr "åè®®" ++ ++msgid "" ++"Redirect matched incoming traffic to the given port on the internal host" ++msgstr "é‡å®šå‘匹é…的入站æµé‡åˆ°å†…部主机的端å£" ++ ++msgid "Redirect matched incoming traffic to the specified internal host" ++msgstr "é‡å®šå‘匹é…的入站æµé‡åˆ°çš„内部主机" ++ ++msgid "Restrict Masquerading to given destination subnets" ++msgstr "è¦é™åˆ¶IP动æ€ä¼ªè£…的目标å­ç½‘" ++ ++msgid "Restrict Masquerading to given source subnets" ++msgstr "è¦é™åˆ¶IP动æ€ä¼ªè£…çš„æºå­ç½‘" ++ ++msgid "Restrict to address family" ++msgstr "é™åˆ¶åœ°å€" ++ ++msgid "Rewrite matched traffic to the given address." ++msgstr "将匹é…æµé‡çš„æºåœ°å€æ”¹å†™æˆæŒ‡å®šåœ°å€" ++ ++msgid "" ++"Rewrite matched traffic to the given source port. May be left empty to only " ++"rewrite the IP address." ++msgstr "将匹é…æµé‡çš„æºç«¯å£æ”¹å†™æˆæŒ‡å®šç«¯å£ã€‚也å¯ä»¥ç•™ç©ºï¼Œåªæ”¹å†™IP地å€ã€‚" ++ ++msgid "Rewrite to source %s" ++msgstr "æºåœ°å€æ”¹å†™æˆ %s" ++ ++msgid "Rewrite to source %s, %s" ++msgstr "æºåœ°å€æ”¹å†™æˆ %s, %s" ++ ++msgid "SNAT IP address" ++msgstr "SNAT IP地å€" ++ ++msgid "SNAT port" ++msgstr "SNAT 端å£" ++ ++# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # ++# Generated from applications/luci-fw/luasrc/model/cbi/luci_fw/rrule.lua # ++# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # ++# ++# msgid "Traffic Redirection" ++# msgstr "" ++# ++# msgid "" ++# "Traffic redirection allows you to change the destination address of " ++# "forwarded packets." ++# msgstr "" ++# ++# msgid "Overview" ++# msgstr "" ++# ++# msgid "Name" ++# msgstr "" ++# ++# msgid "Source zone" ++# msgstr "" ++# ++# msgid "Source MAC-address" ++# msgstr "" ++# ++# msgid "Source port" ++# msgstr "" ++# ++# msgid "Protocol" ++# msgstr "" ++# ++msgid "Source IP address" ++msgstr "æºIP地å€" ++ ++msgid "Source MAC address" ++msgstr "æºMAC地å€" ++ ++msgid "Source NAT" ++msgstr "Source NAT" ++ ++msgid "" ++"Source NAT is a specific form of masquerading which allows fine grained " ++"control over the source IP used for outgoing traffic, for example to map " ++"multiple WAN addresses to internal subnets." ++msgstr "" ++"Source NAT是一ç§ç‰¹æ®Šå½¢å¼çš„å°åŒ…伪装,它å…许精细的控制传出æµé‡çš„æºIP,例如,将" ++"多个WAN地å€æ˜ å°„到内部å­ç½‘。" ++ ++msgid "Source address" ++msgstr "æºåœ°å€" ++ ++msgid "Source port" ++msgstr "æºç«¯å£" ++ ++msgid "Source zone" ++msgstr "æºåŒºåŸŸ" ++ ++msgid "" ++"The firewall creates zones over your network interfaces to control network " ++"traffic flow." ++msgstr "防ç«å¢™æŠŠç½‘络接å£åˆ†ä¸ºä¸åŒçš„区域进行管ç†" ++ ++msgid "" ++"The options below control the forwarding policies between this zone (%s) and " ++"other zones. Destination zones cover forwarded traffic " ++"originating from %q. Source zones match forwarded " ++"traffic from other zones targeted at %q. The forwarding " ++"rule is unidirectional, e.g. a forward from lan to wan does " ++"not imply a permission to forward from wan to lan as well." ++msgstr "" ++"以下选项å¯ä»¥æŽ§åˆ¶åŒºåŸŸ(%s)和其它区域间的转å‘规则。 目标区域接收" ++"从%q转å‘çš„æµé‡ã€‚æºåŒºåŸŸåŒ¹é…从目标为%q的区域的需转å‘æµé‡ã€‚以下规则无法转å‘,例如:转å‘lanæµé‡åˆ°wan," ++"但是ä¸å…许从wan转å‘到lan。" ++ ++msgid "" ++"This page allows you to change advanced properties of the port forwarding " ++"entry. In most cases there is no need to modify those settings." ++msgstr "本页é¢å¯ä»¥æ›´æ”¹ç«¯å£è½¬å‘的高级设置。大多数情况下,ä¸éœ€è¦æ›´æ”¹è¿™äº›è®¾ç½®ã€‚" ++ ++msgid "" ++"This page allows you to change advanced properties of the traffic rule " ++"entry, such as matched source and destination hosts." ++msgstr "本页é¢å¯ä»¥æ›´æ”¹é€šä¿¡è§„则的高级设置,比如:需匹é…çš„æºä¸»æœºå’Œç›®æ ‡ä¸»æœºã€‚" ++ ++#, fuzzy ++msgid "" ++"This section defines common properties of %q. The input and " ++"output options set the default policies for traffic entering and " ++"leaving this zone while the forward option describes the policy for " ++"forwarded traffic between different networks within the zone. Covered " ++"networks specifies which available networks are members of this zone." ++msgstr "" ++"本节定义 %q 的通用属性, å…¥ç«™æ•°æ® å’Œ 出站数æ®è§„则用于设置数" ++"æ®åŒ…“进â€å’Œâ€œå‡ºâ€è·¯ç”±å™¨ï¼ˆæŸä¸ªæŽ¥å£ï¼‰é»˜è®¤çš„转å‘原则,转å‘规则用于特定(一" ++"个或多个)区域的ä¸åŒå­ç½‘之间的数æ®åŒ…转å‘。覆盖网络选择从属于这个区域" ++"的网络。" ++ ++msgid "To %s at %s on this device" ++msgstr "到 %s at %s ä½äºŽæœ¬è®¾å¤‡" ++ ++msgid "To %s in %s" ++msgstr "到 %s ä½äºŽ %s" ++ ++msgid "To %s on this device" ++msgstr "到 %s ä½äºŽæœ¬è®¾å¤‡" ++ ++msgid "To %s, %s in %s" ++msgstr "到 %s, %s ä½äºŽ %s" ++ ++msgid "To source IP" ++msgstr "到æºIP" ++ ++msgid "To source port" ++msgstr "到æºç«¯å£" ++ ++msgid "Traffic Rules" ++msgstr "通信规则" ++ ++msgid "" ++"Traffic rules define policies for packets traveling between different zones, " ++"for example to reject traffic between certain hosts or to open WAN ports on " ++"the router." ++msgstr "" ++"通信规则定义了ä¸åŒåŒºåŸŸé—´çš„æµé‡ä¼ é€ï¼Œä¾‹å¦‚:拒ç»ä¸€äº›ä¸»æœºä¹‹é—´çš„通信ã€æ‰“开到WANçš„" ++"端å£ã€‚" ++ ++msgid "Via %s" ++msgstr "通过 %s" ++ ++msgid "Via %s at %s" ++msgstr "通过 %s at %s" ++ ++msgid "" ++"You may specify multiple by selecting \"-- custom --\" and then entering " ++"protocols separated by space." ++msgstr "你也å¯ä»¥é€‰æ‹©â€œ--自定义--â€æ¥å®šä¹‰å¤šä¸ªå议,在多个å议间需加空格。" ++ ++msgid "Zone %q" ++msgstr "区域 %q" ++ ++msgid "Zone ⇒ Forwardings" ++msgstr "区域 ⇒ 转å‘" ++ ++msgid "Zones" ++msgstr "区域" ++ ++msgid "accept" ++msgstr "接å—" ++ ++msgid "any" ++msgstr "所有" ++ ++msgid "any host" ++msgstr "所有主机" ++ ++msgid "any router IP" ++msgstr "所有路由地å€" ++ ++msgid "any zone" ++msgstr "所有区域" ++ ++msgid "don't track" ++msgstr "无动作" ++ ++msgid "drop" ++msgstr "丢弃" ++ ++msgid "reject" ++msgstr "æ‹’ç»" ++ ++msgid "traffic" ++msgstr "交通" ++ ++#~ msgid "Destination" ++#~ msgstr "目标" ++ ++#~ msgid "Family" ++#~ msgstr "地å€é›†åˆ" ++ ++#~ msgid "Forward to %s in %s" ++#~ msgstr "转å‘到 %s ä½äºŽ %s" ++ ++#~ msgid "Forward to %s, %s in %s" ++#~ msgstr "转å‘到 %s, %s ä½äºŽ %s" ++ ++#~ msgid "Source" ++#~ msgstr "æº" ++ ++#~ msgid "Via" ++#~ msgstr "通过" ++ ++#~ msgid "Disable" ++#~ msgstr "ç¦ç”¨" ++ ++#~ msgid "Do not track forward" ++#~ msgstr "ä¸è¦è¿½è¸ªè½¬å‘" ++ ++#~ msgid "Do not track input" ++#~ msgstr "ä¸è¦è¿½è¸ªè¿›å…¥" ++ ++#~ msgid "IP" ++#~ msgstr "IP" ++ ++#~ msgid "IP range" ++#~ msgstr "IP范围" ++ ++#~ msgid "(optional)" ++#~ msgstr "(å¯é€‰ï¼‰" ++ ++#~ msgid "Intended destination address" ++#~ msgstr "目标地å€" ++ ++#~ msgid "Internal port (optional)" ++#~ msgstr "内部端å£ï¼ˆå¯é€‰ï¼‰" ++ ++#~ msgid "Advanced Options" ++#~ msgstr "高级选项" ++ ++#~ msgid "Advanced Rules" ++#~ msgstr "高级规则" ++ ++#~ msgid "" ++#~ "Advanced rules let you customize the firewall to your needs. Only new " ++#~ "connections will be matched. Packets belonging to already open " ++#~ "connections are automatically allowed to pass the firewall." ++#~ msgstr "" ++#~ "高级规则å…许按需定制防ç«å¢™ã€‚此规则åªé™åˆ¶æ–°å»ºç«‹çš„连接,对于已建立链路的数æ®" ++#~ "包会自动å…许通过。" ++ ++#~ msgid "Custom Rules (/etc/firewall.user)" ++#~ msgstr "自定义规则(/etc/firewall.user)" ++ ++#~ msgid "Device" ++#~ msgstr "设备" ++ ++#~ msgid "" ++#~ "For DNAT, match incoming traffic directed at the given destination ip " ++#~ "address. For SNAT rewrite the source address to the given address." ++#~ msgstr "" ++#~ "DNAT:将目标地å€è½¬æ¢ä¸ºæŒ‡å®šçš„IP地å€ï¼›SNAT:将æºåœ°å€è½¬æ¢ä¸ºæŒ‡å®šçš„IP地å€ã€‚" ++ ++#~ msgid "" ++#~ "Match incoming traffic originating from the given source port or port " ++#~ "range on the client host" ++#~ msgstr "在客户端上,比较输入通é“与给定的æºç«¯å£æ˜¯å¦ä¸€è‡´ã€‚" ++ ++#~ msgid "Overview" ++#~ msgstr "概览" ++ ++#~ msgid "Port forwarding" ++#~ msgstr "端å£è½¬å‘" ++ ++#~ msgid "" ++#~ "Port forwarding allows to provide network services in the internal " ++#~ "network to an external network." ++#~ msgstr "端å£è½¬å‘-å…许外部网络访问内部网络" ++ ++#~ msgid "Redirection type" ++#~ msgstr "é‡å®šå‘类型" ++ ++#~ msgid "Redirections" ++#~ msgstr "é‡å®šå‘" ++ ++#~ msgid "Rules" ++#~ msgstr "规则" ++ ++#~ msgid "Traffic Redirection" ++#~ msgstr "æµé‡é‡å®šå‘" ++ ++#~ msgid "" ++#~ "Traffic redirection allows you to change the destination address of " ++#~ "forwarded packets." ++#~ msgstr "æµé‡é‡å®šå‘å…许你修改数æ®åŒ…转å‘地å€" ++ ++#~ msgid "Zone" ++#~ msgstr "区" ++ ++#~ msgid "MASQ" ++#~ msgstr "MASQ" +diff --git a/feeds/luci/applications/luci-app-firewall/po/zh-tw/firewall.po b/feeds/luci/applications/luci-app-firewall/po/zh-tw/firewall.po +new file mode 100644 +index 0000000..2240675 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-firewall/po/zh-tw/firewall.po +@@ -0,0 +1,449 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"PO-Revision-Date: 2014-05-21 12:45+0200\n" ++"Last-Translator: omnistack \n" ++"Language-Team: none\n" ++"Language: zh_TW\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=1; plural=0;\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "%s in %s" ++msgstr "%s 在 %s 之中" ++ ++msgid "%s%s with %s" ++msgstr "%s%s åŒ %s" ++ ++msgid "%s, %s in %s" ++msgstr " %s, %s 在 %s 之中" ++ ++msgid "(Unnamed Entry)" ++msgstr "(未命åçš„é …ç›®)" ++ ++msgid "(Unnamed Rule)" ++msgstr "(未命åçš„è¦å‰‡)" ++ ++msgid "(Unnamed SNAT)" ++msgstr "(未命å的來æºNAT)" ++ ++msgid "-- Please choose --" ++msgstr "-- è«‹é¸æ“‡ --" ++ ++msgid "-- custom --" ++msgstr "-- 自訂 --" ++ ++msgid "%d pkts. per %s" ++msgstr "%d å°åŒ…數. æ¯%s" ++ ++msgid "%d pkts. per %s, burst %d pkts." ++msgstr "%d å°åŒ…數. æ¯%s, çˆ†é‡ %d å°åŒ…數." ++ ++msgid "%s and limit to %s" ++msgstr "%s 且é™åˆ¶åˆ° %s" ++ ++msgid "Action" ++msgstr "動作" ++ ++msgid "Add" ++msgstr "新增" ++ ++msgid "Add and edit..." ++msgstr "新增並編輯..." ++ ++msgid "Advanced Settings" ++msgstr "進階設定" ++ ++msgid "Allow forward from source zones:" ++msgstr "å…許從source zones轉發:" ++ ++msgid "Allow forward to destination zones:" ++msgstr "å…許從 destination zones轉發:" ++ ++msgid "Any" ++msgstr "ä»»æ„" ++ ++msgid "Covered networks" ++msgstr "已覆蓋的網路" ++ ++msgid "Custom Rules" ++msgstr "自訂的è¦å‰‡ç¾¤" ++ ++msgid "" ++"Custom rules allow you to execute arbritary iptables commands which are not " ++"otherwise covered by the firewall framework. The commands are executed after " ++"each firewall restart, right after the default ruleset has been loaded." ++msgstr "" ++"自定義è¦å‰‡å…許你執行這是ä¸ä»¥å…¶ä»–æ–¹å¼æ¶‰åŠçš„防ç«ç‰†æ¡†æž¶arbritaryçš„iptables命令。" ++"該命令是æ¯å€‹é˜²ç«ç‰†é‡å•Ÿå¾ŒåŸ·è¡Œï¼Œé»˜èªè¦å‰‡é›†å·²ç¶“加載之後。" ++ ++msgid "Destination IP address" ++msgstr "目標IPä½å€" ++ ++msgid "Destination address" ++msgstr "目標ä½å€" ++ ++msgid "Destination port" ++msgstr "目地埠" ++ ++msgid "Destination zone" ++msgstr "目標å€" ++ ++msgid "Do not rewrite" ++msgstr "ä¸è¦æ”¹å¯«" ++ ++msgid "Drop invalid packets" ++msgstr "丟棄ä¸æ­£ç¢ºçš„å°åŒ…群" ++ ++msgid "Enable" ++msgstr "啟用" ++ ++msgid "Enable NAT Loopback" ++msgstr "啓用NAT回傳" ++ ++msgid "Enable SYN-flood protection" ++msgstr "啟用SYN-flood攻擊的ä¿è­·" ++ ++msgid "Enable logging on this zone" ++msgstr "啟用日誌記錄這å€" ++ ++msgid "External IP address" ++msgstr "外部IPä½å€" ++ ++msgid "External port" ++msgstr "外部埠" ++ ++msgid "External zone" ++msgstr "外部å€åŸŸ" ++ ++msgid "Extra arguments" ++msgstr "é¡å¤–åƒæ•¸" ++ ++msgid "Firewall" ++msgstr "防ç«ç‰†" ++ ++msgid "Firewall - Custom Rules" ++msgstr "防ç«ç‰†-自訂è¦å‰‡" ++ ++msgid "Firewall - Port Forwards" ++msgstr "防ç«ç‰†-埠轉發" ++ ++msgid "Firewall - Traffic Rules" ++msgstr "防ç«ç‰†-æµé‡è¦å‰‡" ++ ++msgid "Firewall - Zone Settings" ++msgstr "防ç«ç‰†-å€åŸŸè¨­å®š" ++ ++msgid "Force connection tracking" ++msgstr "強制連線追蹤" ++ ++msgid "Forward" ++msgstr "轉發" ++ ++msgid "Forward to" ++msgstr "轉發到" ++ ++msgid "From %s in %s" ++msgstr "從%s在%s" ++ ++msgid "From %s in %s with source %s" ++msgstr "從%s在%s與來æºï¼…" ++ ++msgid "From %s in %s with source %s and %s" ++msgstr "從%s在%s與來æºï¼…s和%s" ++ ++msgid "General Settings" ++msgstr "一般設定" ++ ++msgid "IPv4" ++msgstr "IPv4" ++ ++msgid "IPv4 and IPv6" ++msgstr "IPv4 å’Œ IPv6" ++ ++msgid "IPv4 only" ++msgstr "僅有IPv4" ++ ++msgid "IPv6" ++msgstr "IPv6" ++ ++msgid "IPv6 only" ++msgstr "僅有IPv6" ++ ++msgid "Input" ++msgstr "輸入" ++ ++msgid "Inter-Zone Forwarding" ++msgstr "內部-å€è½‰ç™¼" ++ ++msgid "Internal IP address" ++msgstr "內部的IPä½å€" ++ ++msgid "Internal port" ++msgstr "內部的埠號" ++ ++msgid "Internal zone" ++msgstr "內部å€" ++ ++msgid "Limit log messages" ++msgstr "é™åˆ¶æ—¥èªŒè¨Šæ¯æ•¸" ++ ++msgid "MSS clamping" ++msgstr "MSS調節" ++ ++msgid "Masquerading" ++msgstr "å½è£" ++ ++msgid "Match" ++msgstr "匹é…" ++ ++msgid "Match ICMP type" ++msgstr "匹é…çš„ICMPåž‹æ…‹" ++ ++msgid "Match forwarded traffic to the given destination port or port range." ++msgstr "匹é…已轉發的æµé‡åˆ°çµ¦å®šçš„目標埠或者範åœåŸ " ++ ++msgid "" ++"Match incoming traffic directed at the given destination port or port range " ++"on this host" ++msgstr "匹é…輸入的æµé‡åˆ°ä¸»æ©Ÿä¸Šçµ¦å®šçš„目標埠或者範åœåŸ " ++ ++msgid "" ++"Match incoming traffic originating from the given source port or port range " ++"on the client host." ++msgstr "從給定的來æºåŸ æˆ–範åœåŸ åœ¨å®¢æˆ¶ç«¯ä¸»æ©Ÿä¸Šçš„匹é…傳入æµé‡å§‹ç™¼ã€‚" ++ ++msgid "Name" ++msgstr "å稱" ++ ++msgid "New SNAT rule" ++msgstr "新的來æºNATè¦å‰‡" ++ ++msgid "New forward rule" ++msgstr "新轉發è¦å‰‡" ++ ++msgid "New input rule" ++msgstr "新輸入è¦å‰‡" ++ ++msgid "New port forward" ++msgstr "新轉發埠" ++ ++msgid "New source NAT" ++msgstr "新來æºåŸ " ++ ++msgid "Only match incoming traffic directed at the given IP address." ++msgstr "僅匹é…傳入æµé‡äºˆçµ¦å®šçš„IP地å€." ++ ++msgid "Only match incoming traffic from these MACs." ++msgstr "僅匹é…從這些MAC群的傳入æµé‡." ++ ++msgid "Only match incoming traffic from this IP or range." ++msgstr "僅匹é…從這個IP或範åœIP給傳入æµé‡." ++ ++msgid "" ++"Only match incoming traffic originating from the given source port or port " ++"range on the client host" ++msgstr "僅匹é…從給定的來æºåŸ æˆ–範åœåŸ çš„客戶端主機上給傳入æµé‡." ++ ++msgid "Open ports on router" ++msgstr "開啟路由器上的埠號群" ++ ++msgid "Other..." ++msgstr "其它..." ++ ++msgid "Output" ++msgstr "輸出" ++ ++msgid "Passes additional arguments to iptables. Use with care!" ++msgstr "通行é¡å¤–çš„åƒæ•¸åˆ° iptables上. 使用è¦å°å¿ƒ!" ++ ++msgid "Port Forwards" ++msgstr "埠轉éž" ++ ++msgid "" ++"Port forwarding allows remote computers on the Internet to connect to a " ++"specific computer or service within the private LAN." ++msgstr "埠轉發å…許é ç«¯ç¶²éš›ç¶²è·¯ä¸Šçš„電腦來連接到在ç§äººå€ç¶²å…§æŒ‡å®šçš„電腦或æœå‹™." ++ ++msgid "Protocol" ++msgstr "å”定" ++ ++msgid "" ++"Redirect matched incoming traffic to the given port on the internal host" ++msgstr "é‡å°Žå‘已匹é…傳入æµé‡åˆ°å…§éƒ¨ä¸»æ©Ÿä¸Šçš„指定埠" ++ ++msgid "Redirect matched incoming traffic to the specified internal host" ++msgstr "é‡å°Žå‘已匹é…傳入æµé‡åˆ°å…§éƒ¨ä¸»æ©Ÿä¸Š" ++ ++msgid "Restrict Masquerading to given destination subnets" ++msgstr "é™åˆ¶å½è£åˆ°å·²çµ¦äºˆçš„目標å­ç¶²è·¯" ++ ++msgid "Restrict Masquerading to given source subnets" ++msgstr "é™åˆ¶å½è£åˆ°å·²çµ¦äºˆçš„來æºå­ç¶²è·¯" ++ ++msgid "Restrict to address family" ++msgstr "é™åˆ¶çš„ä½å€ç¾¤" ++ ++msgid "Rewrite matched traffic to the given address." ++msgstr "改寫已匹é…çš„æµé‡åˆ°çµ¦å®šçš„ä½å€." ++ ++msgid "" ++"Rewrite matched traffic to the given source port. May be left empty to only " ++"rewrite the IP address." ++msgstr "改寫已匹é…çš„æµé‡åˆ°çµ¦å®šçš„來æºåŸ . 或許å¯ä»¥ä¿ç•™ç©ºç™½åˆ°å”¯ä¸€æ”¹å¯«çš„IPä½å€." ++ ++msgid "Rewrite to source %s" ++msgstr "æ”¹å¯«åˆ°ä¾†æº %s" ++ ++msgid "Rewrite to source %s, %s" ++msgstr "æ”¹å¯«åˆ°ä¾†æº %s, %s" ++ ++msgid "SNAT IP address" ++msgstr "來æºNAT IP ä½å€" ++ ++msgid "SNAT port" ++msgstr "來æºNAT IP 埠" ++ ++msgid "Source IP address" ++msgstr "ä¾†æº IP ä½å€" ++ ++msgid "Source MAC address" ++msgstr "ä¾†æº MAC硬體ä½å€" ++ ++msgid "Source NAT" ++msgstr "來æºNAT" ++ ++msgid "" ++"Source NAT is a specific form of masquerading which allows fine grained " ++"control over the source IP used for outgoing traffic, for example to map " ++"multiple WAN addresses to internal subnets." ++msgstr "" ++"來æºNAT是å½è£çš„一種特殊形å¼,它å…許å°è¼¸å‡ºæµé‡çš„來æºIP進行精細控制, 例如è¦å°æ˜ " ++"到多個WANä½å€åˆ°å…§éƒ¨å­ç¶²è·¯ç¾¤ä¸Š." ++ ++msgid "Source address" ++msgstr "來æºä½å€" ++ ++msgid "Source port" ++msgstr "來æºåŸ " ++ ++msgid "Source zone" ++msgstr "來æºå€" ++ ++msgid "" ++"The firewall creates zones over your network interfaces to control network " ++"traffic flow." ++msgstr "防ç«ç‰†å°ä½ çš„網路建立å€åŸŸä»¥ä¾¿æŽ§åˆ¶ç¶²è·¯æµå‘." ++ ++msgid "" ++"The options below control the forwarding policies between this zone (%s) and " ++"other zones. Destination zones cover forwarded traffic " ++"originating from %q. Source zones match forwarded " ++"traffic from other zones targeted at %q. The forwarding " ++"rule is unidirectional, e.g. a forward from lan to wan does " ++"not imply a permission to forward from wan to lan as well." ++msgstr "" ++"下列的é¸é …控制這å€åŸŸ(%s)和其它å€è½‰ç™¼ç­–ç•¥.ç›®åœ°å€ è¦†è“‹å¾ž %q èµ·" ++"æºçš„ 已轉發的æµé‡.來æºå€åŒ¹é…從其它å€åŸŸé‡å° %q的轉發æµé‡.轉發è¦å‰‡æ˜¯å–®å‘çš„." ++ ++msgid "" ++"This page allows you to change advanced properties of the port forwarding " ++"entry. In most cases there is no need to modify those settings." ++msgstr "" ++"這é é¢å…許你修改這個轉發埠項目的進階é¸é …. 在大多數情æ³ä¸‹,ä¸éœ€è¦ä¿®æ”¹é€™äº›è¨­å®š." ++ ++msgid "" ++"This page allows you to change advanced properties of the traffic rule " ++"entry, such as matched source and destination hosts." ++msgstr "這é é¢å…許改變進階æµé‡è¦å‰‡é …目的進階設置, 例如匹é…的來æºå’Œç›®æ¨™ä¸»æ©Ÿ." ++ ++#, fuzzy ++msgid "" ++"This section defines common properties of %q. The input and " ++"output options set the default policies for traffic entering and " ++"leaving this zone while the forward option describes the policy for " ++"forwarded traffic between different networks within the zone. Covered " ++"networks specifies which available networks are members of this zone." ++msgstr "" ++"本節定義 %q 的通用屬性.在輸入和輸出é¸é …設置交通進出的默èªç­–" ++"ç•¥,而在轉發的é¸é …æ述在這å€åŸŸå…§ä¸åŒç¶²è·¯çš„轉發æµé‡.已覆蓋的網路群" ++"指定特定å€åŸŸæˆå“¡å¯ä»¥æ˜¯è¢«é‹ç”¨çš„網路." ++ ++msgid "To %s at %s on this device" ++msgstr "到%s在上的此設備的%sçš„" ++ ++msgid "To %s in %s" ++msgstr "到%s在%s" ++ ++msgid "To %s on this device" ++msgstr "到%s上的此設備的" ++ ++msgid "To %s, %s in %s" ++msgstr "到%s,%sçš„ï¼…s中" ++ ++msgid "To source IP" ++msgstr "來æºIP" ++ ++msgid "To source port" ++msgstr "來æºåŸ " ++ ++msgid "Traffic Rules" ++msgstr "æµé‡è¦å‰‡" ++ ++msgid "" ++"Traffic rules define policies for packets traveling between different zones, " ++"for example to reject traffic between certain hosts or to open WAN ports on " ++"the router." ++msgstr "" ++"æµé‡è¦å‰‡å®šç¾©åœ¨ä¸åŒå€åŸŸä¹‹é–“ç«„è¡Œå°åŒ…çš„ç­–ç•¥,例如è¦æ‹’絕特定主機群的æµé‡æˆ–者è¦æ‰“é–‹" ++"路由器上WAN埠。" ++ ++msgid "Via %s" ++msgstr "通éŽï¼…sçš„" ++ ++msgid "Via %s at %s" ++msgstr "通éŽï¼…s在%sçš„" ++ ++msgid "" ++"You may specify multiple by selecting \"-- custom --\" and then entering " ++"protocols separated by space." ++msgstr "ä½ å¯ä»¥ä»¥é¸æ“‡\"-- 自訂 --\"並且打入由空格分開的å”定來åšå¤šé‡æŒ‡å®š." ++ ++msgid "Zone %q" ++msgstr "å€åŸŸ %q" ++ ++msgid "Zone ⇒ Forwardings" ++msgstr "å€åŸŸ ⇒ 轉發進行" ++ ++msgid "Zones" ++msgstr "領域" ++ ++msgid "accept" ++msgstr "接å—" ++ ++msgid "any" ++msgstr "ä»»æ„" ++ ++msgid "any host" ++msgstr "ä»»æ„埠" ++ ++msgid "any router IP" ++msgstr "ä»»æ„路由器IP" ++ ++msgid "any zone" ++msgstr "ä»»æ„å€" ++ ++msgid "don't track" ++msgstr "ä¸è¦è¿½è¹¤" ++ ++msgid "drop" ++msgstr "丟棄" ++ ++msgid "reject" ++msgstr "拒絕" ++ ++msgid "traffic" ++msgstr "" +diff --git a/feeds/luci/applications/luci-app-freifunk-diagnostics/Makefile b/feeds/luci/applications/luci-app-freifunk-diagnostics/Makefile +new file mode 100644 +index 0000000..d511684 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-freifunk-diagnostics/Makefile +@@ -0,0 +1,14 @@ ++# ++# Copyright (C) 2008-2014 The LuCI Team ++# ++# This is free software, licensed under the Apache License, Version 2.0 . ++# ++ ++include $(TOPDIR)/rules.mk ++ ++LUCI_TITLE:=Tools for network diagnosis like traceroute and ping ++LUCI_DEPENDS:= ++ ++include ../../luci.mk ++ ++# call BuildPackage - OpenWrt buildroot signature +diff --git a/feeds/luci/applications/luci-app-freifunk-diagnostics/luasrc/controller/freifunk/diag.lua b/feeds/luci/applications/luci-app-freifunk-diagnostics/luasrc/controller/freifunk/diag.lua +new file mode 100644 +index 0000000..7bb4761 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-freifunk-diagnostics/luasrc/controller/freifunk/diag.lua +@@ -0,0 +1,72 @@ ++-- Copyright 2008 Steven Barth ++-- Copyright 2011 Jo-Philipp Wich ++-- Copyright 2013 Manuel Munz ++-- Licensed to the public under the Apache License 2.0. ++ ++module("luci.controller.freifunk.diag", package.seeall) ++ ++function index() ++ local uci = require("luci.model.uci").cursor() ++ local page ++ page = node("freifunk", "status", "diagnostics") ++ page.target = template("freifunk/diagnostics") ++ page.title = _("Diagnostics") ++ page.order = 60 ++ ++ page = entry({"freifunk", "status", "diag_ping"}, call("diag_ping"), nil) ++ page.leaf = true ++ ++ page = entry({"freifunk", "status", "diag_nslookup"}, call("diag_nslookup"), nil) ++ page.leaf = true ++ ++ page = entry({"freifunk", "status", "diag_traceroute"}, call("diag_traceroute"), nil) ++ page.leaf = true ++ ++ page = entry({"freifunk", "status", "diag_ping6"}, call("diag_ping6"), nil) ++ page.leaf = true ++ ++ page = entry({"freifunk", "status", "diag_traceroute6"}, call("diag_traceroute6"), nil) ++ page.leaf = true ++end ++ ++function diag_command(cmd, addr) ++ if addr and addr:match("^[a-zA-Z0-9%-%.:_]+$") then ++ luci.http.prepare_content("text/plain") ++ ++ local util = io.popen(cmd % addr) ++ if util then ++ while true do ++ local ln = util:read("*l") ++ if not ln then break end ++ luci.http.write(ln) ++ luci.http.write("\n") ++ end ++ ++ util:close() ++ end ++ ++ return ++ end ++ ++ luci.http.status(500, "Bad address") ++end ++ ++function diag_ping(addr) ++ diag_command("ping -c 5 -W 1 %q 2>&1", addr) ++end ++ ++function diag_traceroute(addr) ++ diag_command("traceroute -q 1 -w 1 -n %q 2>&1", addr) ++end ++ ++function diag_nslookup(addr) ++ diag_command("nslookup %q 2>&1", addr) ++end ++ ++function diag_ping6(addr) ++ diag_command("ping6 -c 5 %q 2>&1", addr) ++end ++ ++function diag_traceroute6(addr) ++ diag_command("traceroute6 -q 1 -w 2 -n %q 2>&1", addr) ++end +diff --git a/feeds/luci/applications/luci-app-freifunk-diagnostics/luasrc/view/freifunk/diagnostics.htm b/feeds/luci/applications/luci-app-freifunk-diagnostics/luasrc/view/freifunk/diagnostics.htm +new file mode 100644 +index 0000000..2f4914e +--- /dev/null ++++ b/feeds/luci/applications/luci-app-freifunk-diagnostics/luasrc/view/freifunk/diagnostics.htm +@@ -0,0 +1,111 @@ ++<%# ++ Copyright 2010 Jo-Philipp Wich ++ Licensed to the public under the Apache License 2.0. ++-%> ++ ++<%+header%> ++ ++<% ++local fs = require "nixio.fs" ++local has_ping6 = fs.access("/bin/ping6") or fs.access("/usr/bin/ping6") ++local has_traceroute6 = fs.access("/usr/bin/traceroute6") ++%> ++ ++ ++ ++ ++ ++ ++<%+footer%> +diff --git a/feeds/luci/applications/luci-app-freifunk-diagnostics/root/etc/uci-defaults/luci-freifunk-diagnostics b/feeds/luci/applications/luci-app-freifunk-diagnostics/root/etc/uci-defaults/luci-freifunk-diagnostics +new file mode 100644 +index 0000000..963d8a4 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-freifunk-diagnostics/root/etc/uci-defaults/luci-freifunk-diagnostics +@@ -0,0 +1,2 @@ ++#!/bin/sh ++rm -f /tmp/luci-indexcache +diff --git a/feeds/luci/applications/luci-app-freifunk-policyrouting/Makefile b/feeds/luci/applications/luci-app-freifunk-policyrouting/Makefile +new file mode 100644 +index 0000000..f60c2ea +--- /dev/null ++++ b/feeds/luci/applications/luci-app-freifunk-policyrouting/Makefile +@@ -0,0 +1,14 @@ ++# ++# Copyright (C) 2008-2014 The LuCI Team ++# ++# This is free software, licensed under the Apache License, Version 2.0 . ++# ++ ++include $(TOPDIR)/rules.mk ++ ++LUCI_TITLE:=Policy routing for mesh traffic ++LUCI_DEPENDS:=+freifunk-policyrouting ++ ++include ../../luci.mk ++ ++# call BuildPackage - OpenWrt buildroot signature +diff --git a/feeds/luci/applications/luci-app-freifunk-policyrouting/luasrc/controller/freifunk/policy-routing.lua b/feeds/luci/applications/luci-app-freifunk-policyrouting/luasrc/controller/freifunk/policy-routing.lua +new file mode 100644 +index 0000000..b550fc8 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-freifunk-policyrouting/luasrc/controller/freifunk/policy-routing.lua +@@ -0,0 +1,9 @@ ++-- Copyright 2011 Manuel Munz ++-- Licensed to the public under the Apache License 2.0. ++ ++module "luci.controller.freifunk.policy-routing" ++ ++function index() ++ entry({"admin", "freifunk", "policyrouting"}, cbi("freifunk/policyrouting"), ++ _("Policy Routing"), 60) ++end +diff --git a/feeds/luci/applications/luci-app-freifunk-policyrouting/luasrc/model/cbi/freifunk/policyrouting.lua b/feeds/luci/applications/luci-app-freifunk-policyrouting/luasrc/model/cbi/freifunk/policyrouting.lua +new file mode 100644 +index 0000000..b09c237 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-freifunk-policyrouting/luasrc/model/cbi/freifunk/policyrouting.lua +@@ -0,0 +1,34 @@ ++-- Copyright 2011 Manuel Munz ++-- Licensed to the public under the Apache License 2.0. ++ ++local uci = require "luci.model.uci".cursor() ++ ++m = Map("freifunk-policyrouting", translate("Policy Routing"), translate("These pages can be used to setup policy routing for certain firewall zones. ".. ++ "This is useful if you need to use your own internet connection for yourself but you don't want to share it with others (thats why it can also be ".. ++ "called 'Ego Mode'). Your own traffic is then sent via your internet connection while traffic originating from the mesh will use another gateway in the mesh. ")) ++m:chain("network") ++ ++c = m:section(NamedSection, "pr", "settings", "") ++ ++local pr = c:option(Flag, "enable", translate("Enable Policy Routing")) ++pr.rmempty = false ++ ++local strict = c:option(Flag, "strict", translate("Strict Filtering"), translate("If no default route is received from the mesh network then traffic which belongs to ".. ++ "the selected firewall zones is routed via your internet connection as a fallback. If you do not want this and instead block that traffic then you should ".. ++ "select this option.")) ++strict.rmempty = false ++ ++local fallback = c:option(Flag, "fallback", translate("Fallback to mesh"), ++ translate("If your own gateway is not available then fallback to the mesh default gateway.")) ++strict.rmempty = false ++ ++local zones = c:option(MultiValue, "zones", translate("Firewall zones"), translate("All traffic from interfaces belonging to these zones will be sent via ".. ++ "a gateway in the mesh network.")) ++uci:foreach("firewall", "zone", function(section) ++ local name = section.name ++ if not (name == "wan") then ++ zones:value(name) ++ end ++end) ++ ++return m +diff --git a/feeds/luci/applications/luci-app-freifunk-policyrouting/po/ca/freifunk-policyrouting.po b/feeds/luci/applications/luci-app-freifunk-policyrouting/po/ca/freifunk-policyrouting.po +new file mode 100644 +index 0000000..c1d96e0 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-freifunk-policyrouting/po/ca/freifunk-policyrouting.po +@@ -0,0 +1,62 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Report-Msgid-Bugs-To: \n" ++"POT-Creation-Date: 2014-06-01 23:52+0200\n" ++"PO-Revision-Date: 2014-07-03 20:37+0200\n" ++"Last-Translator: Alex \n" ++"Language-Team: LANGUAGE \n" ++"Language: ca\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n != 1);\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "" ++"All traffic from interfaces belonging to these zones will be sent via a " ++"gateway in the mesh network." ++msgstr "" ++"Tot el trànsit des de interfícies pertinent a aquestes zones s'enviarà via " ++"una passarel·la en la xarxa en malla." ++ ++msgid "Enable Policy Routing" ++msgstr "Habilita el encaminament per política" ++ ++msgid "Fallback to mesh" ++msgstr "" ++ ++msgid "Firewall zones" ++msgstr "Zones de tallafocs" ++ ++msgid "" ++"If no default route is received from the mesh network then traffic which " ++"belongs to the selected firewall zones is routed via your internet " ++"connection as a fallback. If you do not want this and instead block that " ++"traffic then you should select this option." ++msgstr "" ++ ++msgid "" ++"If your own gateway is not available then fallback to the mesh default " ++"gateway." ++msgstr "" ++ ++msgid "Policy Routing" ++msgstr "Encaminament per política" ++ ++msgid "Strict Filtering" ++msgstr "Filtració estricta" ++ ++msgid "" ++"These pages can be used to setup policy routing for certain firewall zones. " ++"This is useful if you need to use your own internet connection for yourself " ++"but you don't want to share it with others (thats why it can also be called " ++"'Ego Mode'). Your own traffic is then sent via your internet connection " ++"while traffic originating from the mesh will use another gateway in the mesh." ++msgstr "" ++"Aquestes pàgines es poden utilitzar per configurar encaminament en certes " ++"zones de tallafocs. Això és útil si necessiteu utilitzar la vostra pròpia " ++"connexió a Internet per a vós mateix però no voleu compartir-la amb altres " ++"(és per això que també es diu 'Mode egoista'). El vostre propi trànsit " ++"llavors s'envia via la vostra connexió d'Internet mentre el trànsit " ++"originant en malla utilitzarà altra passarel·la en malla." +diff --git a/feeds/luci/applications/luci-app-freifunk-policyrouting/po/cs/freifunk-policyrouting.po b/feeds/luci/applications/luci-app-freifunk-policyrouting/po/cs/freifunk-policyrouting.po +new file mode 100644 +index 0000000..4ec9f8d +--- /dev/null ++++ b/feeds/luci/applications/luci-app-freifunk-policyrouting/po/cs/freifunk-policyrouting.po +@@ -0,0 +1,52 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"PO-Revision-Date: 2014-07-26 20:27+0200\n" ++"Last-Translator: koli \n" ++"Language-Team: none\n" ++"Language: cs\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "" ++"All traffic from interfaces belonging to these zones will be sent via a " ++"gateway in the mesh network." ++msgstr "" ++ ++msgid "Enable Policy Routing" ++msgstr "Povolit politiku smÄ›rování" ++ ++msgid "Fallback to mesh" ++msgstr "Fallback do mesh" ++ ++msgid "Firewall zones" ++msgstr "Zóny firewallu" ++ ++msgid "" ++"If no default route is received from the mesh network then traffic which " ++"belongs to the selected firewall zones is routed via your internet " ++"connection as a fallback. If you do not want this and instead block that " ++"traffic then you should select this option." ++msgstr "" ++ ++msgid "" ++"If your own gateway is not available then fallback to the mesh default " ++"gateway." ++msgstr "" ++ ++msgid "Policy Routing" ++msgstr "Politika smÄ›rování" ++ ++msgid "Strict Filtering" ++msgstr "Striktní filtrování" ++ ++msgid "" ++"These pages can be used to setup policy routing for certain firewall zones. " ++"This is useful if you need to use your own internet connection for yourself " ++"but you don't want to share it with others (thats why it can also be called " ++"'Ego Mode'). Your own traffic is then sent via your internet connection " ++"while traffic originating from the mesh will use another gateway in the mesh." ++msgstr "" +diff --git a/feeds/luci/applications/luci-app-freifunk-policyrouting/po/de/freifunk-policyrouting.po b/feeds/luci/applications/luci-app-freifunk-policyrouting/po/de/freifunk-policyrouting.po +new file mode 100644 +index 0000000..bb24f61 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-freifunk-policyrouting/po/de/freifunk-policyrouting.po +@@ -0,0 +1,67 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: \n" ++"POT-Creation-Date: \n" ++"PO-Revision-Date: 2012-11-21 20:53+0200\n" ++"Last-Translator: Jo-Philipp \n" ++"Language-Team: \n" ++"Language: de\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n != 1);\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "" ++"All traffic from interfaces belonging to these zones will be sent via a " ++"gateway in the mesh network." ++msgstr "" ++"Traffic der aus diesen Zonen kommt wird über ein Internetgateway im Mesh " ++"weitergeleitet." ++ ++msgid "Enable Policy Routing" ++msgstr "Policy Routing aktivieren" ++ ++msgid "Fallback to mesh" ++msgstr "Auf Mesh zurückfallen" ++ ++msgid "Firewall zones" ++msgstr "Firewallzonen" ++ ++msgid "" ++"If no default route is received from the mesh network then traffic which " ++"belongs to the selected firewall zones is routed via your internet " ++"connection as a fallback. If you do not want this and instead block that " ++"traffic then you should select this option." ++msgstr "" ++"Falls im Mesh kein anderer Internetgateway verfügbar ist, dann wird Traffic " ++"aus den ausgewählten Zonen als Fallback über die Internetverbindung dieses " ++"Routers geleitet. Wenn das nicht gewünscht ist und dieser Traffic dann " ++"stattdessen geblockt werden soll, dann aktiviere diese Option." ++ ++msgid "" ++"If your own gateway is not available then fallback to the mesh default " ++"gateway." ++msgstr "" ++"Wenn das eigene lokale Gateway nicht verfügbar ist, dann nutze das aktuelle " ++"Mesh-Default-Gateway." ++ ++msgid "Policy Routing" ++msgstr "Policy Routing" ++ ++msgid "Strict Filtering" ++msgstr "Strenges Filtern" ++ ++msgid "" ++"These pages can be used to setup policy routing for certain firewall zones. " ++"This is useful if you need to use your own internet connection for yourself " ++"but you don't want to share it with others (thats why it can also be called " ++"'Ego Mode'). Your own traffic is then sent via your internet connection " ++"while traffic originating from the mesh will use another gateway in the mesh." ++msgstr "" ++"Auf diesen Seiten kann Policy Routing für bestimmte Firewallzonen aktiviert " ++"werden. Dies ist z.B. nützlich, wenn du deinen eigenen Internetverkehr über " ++"deine eigene Internetverbindung routen aber diese nicht mit anderen teilen " ++"willst ('Mein Gateway für mich allein'). Eigener Traffic wird dann über die " ++"eigene Internetverbindung geschickt während Traffic aus den ausgewählten " ++"Firewallzonen über einen anderen Gateway im Mesh geleitet wird." +diff --git a/feeds/luci/applications/luci-app-freifunk-policyrouting/po/el/freifunk-policyrouting.po b/feeds/luci/applications/luci-app-freifunk-policyrouting/po/el/freifunk-policyrouting.po +new file mode 100644 +index 0000000..3c9a17e +--- /dev/null ++++ b/feeds/luci/applications/luci-app-freifunk-policyrouting/po/el/freifunk-policyrouting.po +@@ -0,0 +1,39 @@ ++msgid "" ++"All traffic from interfaces belonging to these zones will be sent via a " ++"gateway in the mesh network." ++msgstr "" ++ ++msgid "Enable Policy Routing" ++msgstr "" ++ ++msgid "Fallback to mesh" ++msgstr "" ++ ++msgid "Firewall zones" ++msgstr "" ++ ++msgid "" ++"If no default route is received from the mesh network then traffic which " ++"belongs to the selected firewall zones is routed via your internet " ++"connection as a fallback. If you do not want this and instead block that " ++"traffic then you should select this option." ++msgstr "" ++ ++msgid "" ++"If your own gateway is not available then fallback to the mesh default " ++"gateway." ++msgstr "" ++ ++msgid "Policy Routing" ++msgstr "" ++ ++msgid "Strict Filtering" ++msgstr "" ++ ++msgid "" ++"These pages can be used to setup policy routing for certain firewall zones. " ++"This is useful if you need to use your own internet connection for yourself " ++"but you don't want to share it with others (thats why it can also be called " ++"'Ego Mode'). Your own traffic is then sent via your internet connection " ++"while traffic originating from the mesh will use another gateway in the mesh." ++msgstr "" +diff --git a/feeds/luci/applications/luci-app-freifunk-policyrouting/po/en/freifunk-policyrouting.po b/feeds/luci/applications/luci-app-freifunk-policyrouting/po/en/freifunk-policyrouting.po +new file mode 100644 +index 0000000..3c9a17e +--- /dev/null ++++ b/feeds/luci/applications/luci-app-freifunk-policyrouting/po/en/freifunk-policyrouting.po +@@ -0,0 +1,39 @@ ++msgid "" ++"All traffic from interfaces belonging to these zones will be sent via a " ++"gateway in the mesh network." ++msgstr "" ++ ++msgid "Enable Policy Routing" ++msgstr "" ++ ++msgid "Fallback to mesh" ++msgstr "" ++ ++msgid "Firewall zones" ++msgstr "" ++ ++msgid "" ++"If no default route is received from the mesh network then traffic which " ++"belongs to the selected firewall zones is routed via your internet " ++"connection as a fallback. If you do not want this and instead block that " ++"traffic then you should select this option." ++msgstr "" ++ ++msgid "" ++"If your own gateway is not available then fallback to the mesh default " ++"gateway." ++msgstr "" ++ ++msgid "Policy Routing" ++msgstr "" ++ ++msgid "Strict Filtering" ++msgstr "" ++ ++msgid "" ++"These pages can be used to setup policy routing for certain firewall zones. " ++"This is useful if you need to use your own internet connection for yourself " ++"but you don't want to share it with others (thats why it can also be called " ++"'Ego Mode'). Your own traffic is then sent via your internet connection " ++"while traffic originating from the mesh will use another gateway in the mesh." ++msgstr "" +diff --git a/feeds/luci/applications/luci-app-freifunk-policyrouting/po/es/freifunk-policyrouting.po b/feeds/luci/applications/luci-app-freifunk-policyrouting/po/es/freifunk-policyrouting.po +new file mode 100644 +index 0000000..8af3458 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-freifunk-policyrouting/po/es/freifunk-policyrouting.po +@@ -0,0 +1,66 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Report-Msgid-Bugs-To: \n" ++"POT-Creation-Date: 2012-08-22 22:34+0200\n" ++"PO-Revision-Date: 2012-10-14 22:49+0200\n" ++"Last-Translator: José Vicente \n" ++"Language-Team: LANGUAGE \n" ++"Language: es\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n != 1);\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "" ++"All traffic from interfaces belonging to these zones will be sent via a " ++"gateway in the mesh network." ++msgstr "" ++"Todo el tráfico desde interfaces de estas zonas se enviará por una pasarela " ++"de la red mesh." ++ ++msgid "Enable Policy Routing" ++msgstr "Activar política de enrutado" ++ ++msgid "Fallback to mesh" ++msgstr "Si falla usar mesh" ++ ++msgid "Firewall zones" ++msgstr "Zonas del cortafuegos" ++ ++msgid "" ++"If no default route is received from the mesh network then traffic which " ++"belongs to the selected firewall zones is routed via your internet " ++"connection as a fallback. If you do not want this and instead block that " ++"traffic then you should select this option." ++msgstr "" ++"Si no se recibe una ruta por defecto de la red mesh el tráfico de las zonas " ++"de cortafuegos seleccionado se enviará por esta conexión de red. Si no desea " ++"esto marque esta opción para bloquearlo." ++ ++msgid "" ++"If your own gateway is not available then fallback to the mesh default " ++"gateway." ++msgstr "" ++"Si su pasarela no está disponible cambie a la pasarela por defecto de la " ++"mesh." ++ ++msgid "Policy Routing" ++msgstr "Política de enrutamiento" ++ ++msgid "Strict Filtering" ++msgstr "Filtrado estricto" ++ ++msgid "" ++"These pages can be used to setup policy routing for certain firewall zones. " ++"This is useful if you need to use your own internet connection for yourself " ++"but you don't want to share it with others (thats why it can also be called " ++"'Ego Mode'). Your own traffic is then sent via your internet connection " ++"while traffic originating from the mesh will use another gateway in the mesh." ++msgstr "" ++"Estas páginas se pueden usar para definir la política de enrutamiento para " ++"ciertas zonas del cortafuegos. Esto es útil si quiere usar su conexión a " ++"internet pero no quiere compartirla con otros (por eso se llama \"Modo " ++"egoísta\"). Su propio tráfico se enviará por su conexión internet mientras " ++"que el tráfico del mes usará otra pasarela en la mesh." +diff --git a/feeds/luci/applications/luci-app-freifunk-policyrouting/po/fr/freifunk-policyrouting.po b/feeds/luci/applications/luci-app-freifunk-policyrouting/po/fr/freifunk-policyrouting.po +new file mode 100644 +index 0000000..3c9a17e +--- /dev/null ++++ b/feeds/luci/applications/luci-app-freifunk-policyrouting/po/fr/freifunk-policyrouting.po +@@ -0,0 +1,39 @@ ++msgid "" ++"All traffic from interfaces belonging to these zones will be sent via a " ++"gateway in the mesh network." ++msgstr "" ++ ++msgid "Enable Policy Routing" ++msgstr "" ++ ++msgid "Fallback to mesh" ++msgstr "" ++ ++msgid "Firewall zones" ++msgstr "" ++ ++msgid "" ++"If no default route is received from the mesh network then traffic which " ++"belongs to the selected firewall zones is routed via your internet " ++"connection as a fallback. If you do not want this and instead block that " ++"traffic then you should select this option." ++msgstr "" ++ ++msgid "" ++"If your own gateway is not available then fallback to the mesh default " ++"gateway." ++msgstr "" ++ ++msgid "Policy Routing" ++msgstr "" ++ ++msgid "Strict Filtering" ++msgstr "" ++ ++msgid "" ++"These pages can be used to setup policy routing for certain firewall zones. " ++"This is useful if you need to use your own internet connection for yourself " ++"but you don't want to share it with others (thats why it can also be called " ++"'Ego Mode'). Your own traffic is then sent via your internet connection " ++"while traffic originating from the mesh will use another gateway in the mesh." ++msgstr "" +diff --git a/feeds/luci/applications/luci-app-freifunk-policyrouting/po/he/freifunk-policyrouting.po b/feeds/luci/applications/luci-app-freifunk-policyrouting/po/he/freifunk-policyrouting.po +new file mode 100644 +index 0000000..8d83098 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-freifunk-policyrouting/po/he/freifunk-policyrouting.po +@@ -0,0 +1,50 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Last-Translator: Automatically generated\n" ++"Language-Team: none\n" ++"Language: \n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n != 1);\n" ++ ++msgid "" ++"All traffic from interfaces belonging to these zones will be sent via a " ++"gateway in the mesh network." ++msgstr "" ++ ++msgid "Enable Policy Routing" ++msgstr "" ++ ++msgid "Fallback to mesh" ++msgstr "" ++ ++msgid "Firewall zones" ++msgstr "" ++ ++msgid "" ++"If no default route is received from the mesh network then traffic which " ++"belongs to the selected firewall zones is routed via your internet " ++"connection as a fallback. If you do not want this and instead block that " ++"traffic then you should select this option." ++msgstr "" ++ ++msgid "" ++"If your own gateway is not available then fallback to the mesh default " ++"gateway." ++msgstr "" ++ ++msgid "Policy Routing" ++msgstr "" ++ ++msgid "Strict Filtering" ++msgstr "" ++ ++msgid "" ++"These pages can be used to setup policy routing for certain firewall zones. " ++"This is useful if you need to use your own internet connection for yourself " ++"but you don't want to share it with others (thats why it can also be called " ++"'Ego Mode'). Your own traffic is then sent via your internet connection " ++"while traffic originating from the mesh will use another gateway in the mesh." ++msgstr "" +diff --git a/feeds/luci/applications/luci-app-freifunk-policyrouting/po/hu/freifunk-policyrouting.po b/feeds/luci/applications/luci-app-freifunk-policyrouting/po/hu/freifunk-policyrouting.po +new file mode 100644 +index 0000000..8d83098 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-freifunk-policyrouting/po/hu/freifunk-policyrouting.po +@@ -0,0 +1,50 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Last-Translator: Automatically generated\n" ++"Language-Team: none\n" ++"Language: \n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n != 1);\n" ++ ++msgid "" ++"All traffic from interfaces belonging to these zones will be sent via a " ++"gateway in the mesh network." ++msgstr "" ++ ++msgid "Enable Policy Routing" ++msgstr "" ++ ++msgid "Fallback to mesh" ++msgstr "" ++ ++msgid "Firewall zones" ++msgstr "" ++ ++msgid "" ++"If no default route is received from the mesh network then traffic which " ++"belongs to the selected firewall zones is routed via your internet " ++"connection as a fallback. If you do not want this and instead block that " ++"traffic then you should select this option." ++msgstr "" ++ ++msgid "" ++"If your own gateway is not available then fallback to the mesh default " ++"gateway." ++msgstr "" ++ ++msgid "Policy Routing" ++msgstr "" ++ ++msgid "Strict Filtering" ++msgstr "" ++ ++msgid "" ++"These pages can be used to setup policy routing for certain firewall zones. " ++"This is useful if you need to use your own internet connection for yourself " ++"but you don't want to share it with others (thats why it can also be called " ++"'Ego Mode'). Your own traffic is then sent via your internet connection " ++"while traffic originating from the mesh will use another gateway in the mesh." ++msgstr "" +diff --git a/feeds/luci/applications/luci-app-freifunk-policyrouting/po/it/freifunk-policyrouting.po b/feeds/luci/applications/luci-app-freifunk-policyrouting/po/it/freifunk-policyrouting.po +new file mode 100644 +index 0000000..61ac6c0 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-freifunk-policyrouting/po/it/freifunk-policyrouting.po +@@ -0,0 +1,69 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Report-Msgid-Bugs-To: \n" ++"POT-Creation-Date: 2013-02-09 20:22+0200\n" ++"PO-Revision-Date: 2013-02-09 20:27+0200\n" ++"Last-Translator: Francesco <3gasas@gmail.com>\n" ++"Language-Team: LANGUAGE \n" ++"Language: it\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n != 1);\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "" ++"All traffic from interfaces belonging to these zones will be sent via a " ++"gateway in the mesh network." ++msgstr "" ++"Tutto il traffico dalle interfacce appartenenti a tali zone saranno inviate " ++"tramite un gateway nella rete mesh." ++ ++msgid "Enable Policy Routing" ++msgstr "Attiva la politica di instradamento" ++ ++msgid "Fallback to mesh" ++msgstr "Posizione di sicurezza in mesh" ++ ++msgid "Firewall zones" ++msgstr "Zone Firewall" ++ ++msgid "" ++"If no default route is received from the mesh network then traffic which " ++"belongs to the selected firewall zones is routed via your internet " ++"connection as a fallback. If you do not want this and instead block that " ++"traffic then you should select this option." ++msgstr "" ++"Se nessun percorso predefinito viene ricevuto dalla rete mesh, il traffico " ++"che fa parte delle zone del firewall selezionato verranno instradate tramite " ++"la connessione a Internet come ripiego. Se non si desidera questo invece " ++"di bloccare il traffico è necessario selezionare questa opzione." ++ ++msgid "" ++"If your own gateway is not available then fallback to the mesh default " ++"gateway." ++msgstr "" ++"Se il proprio gateway non è disponibile, ripiego per il gateway predefinito " ++"mash." ++ ++msgid "Policy Routing" ++msgstr "Politica di Instradamento" ++ ++msgid "Strict Filtering" ++msgstr "Livello massimo di filtraggio" ++ ++msgid "" ++"These pages can be used to setup policy routing for certain firewall zones. " ++"This is useful if you need to use your own internet connection for yourself " ++"but you don't want to share it with others (thats why it can also be called " ++"'Ego Mode'). Your own traffic is then sent via your internet connection " ++"while traffic originating from the mesh will use another gateway in the mesh." ++msgstr "" ++"Queste pagine possono essere utilizzati per impostare la politica di " ++"instradamento per le zone del firewall determinati. Questo è utile se è " ++"necessario utilizzare la vostra connessione internet per de stesso, ma non " ++"si desidera condividere con gli altri (questo è il motivo per cui può anche " ++"essere chiamato 'Modalità Ego'). Il tuo traffico viene poi inviato tramite " ++"la tua connessione a Internet mentre il traffico proveniente dalla rete " ++"utilizzerà un altro gateway in mesh." +diff --git a/feeds/luci/applications/luci-app-freifunk-policyrouting/po/ja/freifunk-policyrouting.po b/feeds/luci/applications/luci-app-freifunk-policyrouting/po/ja/freifunk-policyrouting.po +new file mode 100644 +index 0000000..3c9a17e +--- /dev/null ++++ b/feeds/luci/applications/luci-app-freifunk-policyrouting/po/ja/freifunk-policyrouting.po +@@ -0,0 +1,39 @@ ++msgid "" ++"All traffic from interfaces belonging to these zones will be sent via a " ++"gateway in the mesh network." ++msgstr "" ++ ++msgid "Enable Policy Routing" ++msgstr "" ++ ++msgid "Fallback to mesh" ++msgstr "" ++ ++msgid "Firewall zones" ++msgstr "" ++ ++msgid "" ++"If no default route is received from the mesh network then traffic which " ++"belongs to the selected firewall zones is routed via your internet " ++"connection as a fallback. If you do not want this and instead block that " ++"traffic then you should select this option." ++msgstr "" ++ ++msgid "" ++"If your own gateway is not available then fallback to the mesh default " ++"gateway." ++msgstr "" ++ ++msgid "Policy Routing" ++msgstr "" ++ ++msgid "Strict Filtering" ++msgstr "" ++ ++msgid "" ++"These pages can be used to setup policy routing for certain firewall zones. " ++"This is useful if you need to use your own internet connection for yourself " ++"but you don't want to share it with others (thats why it can also be called " ++"'Ego Mode'). Your own traffic is then sent via your internet connection " ++"while traffic originating from the mesh will use another gateway in the mesh." ++msgstr "" +diff --git a/feeds/luci/applications/luci-app-freifunk-policyrouting/po/ms/freifunk-policyrouting.po b/feeds/luci/applications/luci-app-freifunk-policyrouting/po/ms/freifunk-policyrouting.po +new file mode 100644 +index 0000000..3c9a17e +--- /dev/null ++++ b/feeds/luci/applications/luci-app-freifunk-policyrouting/po/ms/freifunk-policyrouting.po +@@ -0,0 +1,39 @@ ++msgid "" ++"All traffic from interfaces belonging to these zones will be sent via a " ++"gateway in the mesh network." ++msgstr "" ++ ++msgid "Enable Policy Routing" ++msgstr "" ++ ++msgid "Fallback to mesh" ++msgstr "" ++ ++msgid "Firewall zones" ++msgstr "" ++ ++msgid "" ++"If no default route is received from the mesh network then traffic which " ++"belongs to the selected firewall zones is routed via your internet " ++"connection as a fallback. If you do not want this and instead block that " ++"traffic then you should select this option." ++msgstr "" ++ ++msgid "" ++"If your own gateway is not available then fallback to the mesh default " ++"gateway." ++msgstr "" ++ ++msgid "Policy Routing" ++msgstr "" ++ ++msgid "Strict Filtering" ++msgstr "" ++ ++msgid "" ++"These pages can be used to setup policy routing for certain firewall zones. " ++"This is useful if you need to use your own internet connection for yourself " ++"but you don't want to share it with others (thats why it can also be called " ++"'Ego Mode'). Your own traffic is then sent via your internet connection " ++"while traffic originating from the mesh will use another gateway in the mesh." ++msgstr "" +diff --git a/feeds/luci/applications/luci-app-freifunk-policyrouting/po/no/freifunk-policyrouting.po b/feeds/luci/applications/luci-app-freifunk-policyrouting/po/no/freifunk-policyrouting.po +new file mode 100644 +index 0000000..3c9a17e +--- /dev/null ++++ b/feeds/luci/applications/luci-app-freifunk-policyrouting/po/no/freifunk-policyrouting.po +@@ -0,0 +1,39 @@ ++msgid "" ++"All traffic from interfaces belonging to these zones will be sent via a " ++"gateway in the mesh network." ++msgstr "" ++ ++msgid "Enable Policy Routing" ++msgstr "" ++ ++msgid "Fallback to mesh" ++msgstr "" ++ ++msgid "Firewall zones" ++msgstr "" ++ ++msgid "" ++"If no default route is received from the mesh network then traffic which " ++"belongs to the selected firewall zones is routed via your internet " ++"connection as a fallback. If you do not want this and instead block that " ++"traffic then you should select this option." ++msgstr "" ++ ++msgid "" ++"If your own gateway is not available then fallback to the mesh default " ++"gateway." ++msgstr "" ++ ++msgid "Policy Routing" ++msgstr "" ++ ++msgid "Strict Filtering" ++msgstr "" ++ ++msgid "" ++"These pages can be used to setup policy routing for certain firewall zones. " ++"This is useful if you need to use your own internet connection for yourself " ++"but you don't want to share it with others (thats why it can also be called " ++"'Ego Mode'). Your own traffic is then sent via your internet connection " ++"while traffic originating from the mesh will use another gateway in the mesh." ++msgstr "" +diff --git a/feeds/luci/applications/luci-app-freifunk-policyrouting/po/pl/freifunk-policyrouting.po b/feeds/luci/applications/luci-app-freifunk-policyrouting/po/pl/freifunk-policyrouting.po +new file mode 100644 +index 0000000..bcb4492 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-freifunk-policyrouting/po/pl/freifunk-policyrouting.po +@@ -0,0 +1,69 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Report-Msgid-Bugs-To: \n" ++"POT-Creation-Date: 2012-08-24 07:01+0200\n" ++"PO-Revision-Date: 2012-08-24 08:02+0200\n" ++"Last-Translator: goodgod261 \n" ++"Language-Team: LANGUAGE \n" ++"Language: pl\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 " ++"|| n%100>=20) ? 1 : 2);\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "" ++"All traffic from interfaces belonging to these zones will be sent via a " ++"gateway in the mesh network." ++msgstr "" ++"CaÅ‚y ruch sieciowy z interfejsów należących do tych stref bÄ™dzie wysyÅ‚any " ++"przez bramÄ™ w sieci mesh." ++ ++msgid "Enable Policy Routing" ++msgstr "WÅ‚Ä…cz politykÄ™ trasowania (routingu)" ++ ++msgid "Fallback to mesh" ++msgstr "Fallback do mesh" ++ ++msgid "Firewall zones" ++msgstr "Strefy firewalla" ++ ++msgid "" ++"If no default route is received from the mesh network then traffic which " ++"belongs to the selected firewall zones is routed via your internet " ++"connection as a fallback. If you do not want this and instead block that " ++"traffic then you should select this option." ++msgstr "" ++"JeÅ›li nie otrzymano domyÅ›lnej trasy z sieci mesh, ruch sieciowy należący do " ++"wybranej strefy firewalla jest trasowany przez Twoje poÅ‚Ä…czenie z internetem " ++"jako fallback. JeÅ›li tego nie chcesz i zamiast tego chciaÅ‚byÅ› blokować taki " ++"ruch sieciowy, powinieneÅ› zaznaczyć tÄ™ opcjÄ™." ++ ++msgid "" ++"If your own gateway is not available then fallback to the mesh default " ++"gateway." ++msgstr "" ++"JeÅ›li Twoja wÅ‚asna brama nie jest dostÄ™pna, wykonaj fallback do domyÅ›lnej " ++"bramy sieci mesh." ++ ++msgid "Policy Routing" ++msgstr "Polityka trasowania (routingu)" ++ ++msgid "Strict Filtering" ++msgstr "ÅšcisÅ‚e filtrowanie" ++ ++msgid "" ++"These pages can be used to setup policy routing for certain firewall zones. " ++"This is useful if you need to use your own internet connection for yourself " ++"but you don't want to share it with others (thats why it can also be called " ++"'Ego Mode'). Your own traffic is then sent via your internet connection " ++"while traffic originating from the mesh will use another gateway in the mesh." ++msgstr "" ++"Te strony mogÄ… zostać użyte do ustawienia polityki trasowania (routingu) dla " ++"wybranych stref firewalla. Jest to użyteczne jeÅ›li chcesz używać swojego " ++"poÅ‚Ä…czenia z internetem sam i nie chcesz dzielić siÄ™ nim z innymi (stÄ…d " ++"alternatywna nazwa \"tryb ego\"). Twój wÅ‚asny ruch sieciowy jest wysyÅ‚any " ++"przez Twoje poÅ‚Ä…czenie, zaÅ› ruch pochodzÄ…cy z sieci mesh bÄ™dzie używać innej " ++"bramy w sieci." +diff --git a/feeds/luci/applications/luci-app-freifunk-policyrouting/po/pt-br/freifunk-policyrouting.po b/feeds/luci/applications/luci-app-freifunk-policyrouting/po/pt-br/freifunk-policyrouting.po +new file mode 100644 +index 0000000..4aac8ca +--- /dev/null ++++ b/feeds/luci/applications/luci-app-freifunk-policyrouting/po/pt-br/freifunk-policyrouting.po +@@ -0,0 +1,68 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Report-Msgid-Bugs-To: \n" ++"POT-Creation-Date: 2011-10-12 09:13+0200\n" ++"PO-Revision-Date: 2012-09-27 00:40+0200\n" ++"Last-Translator: Luiz Angelo \n" ++"Language-Team: LANGUAGE \n" ++"Language: pt_BR\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n > 1);\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "" ++"All traffic from interfaces belonging to these zones will be sent via a " ++"gateway in the mesh network." ++msgstr "" ++"Todo o tráfego das interfaces pertencentes a estas zonas será enviado " ++"através de um roteador padrão na rede em malha." ++ ++msgid "Enable Policy Routing" ++msgstr "Habilitar a Política de Roteamento" ++ ++msgid "Fallback to mesh" ++msgstr "Se falhar, usar a malha" ++ ++msgid "Firewall zones" ++msgstr "Zonas do firewall" ++ ++msgid "" ++"If no default route is received from the mesh network then traffic which " ++"belongs to the selected firewall zones is routed via your internet " ++"connection as a fallback. If you do not want this and instead block that " ++"traffic then you should select this option." ++msgstr "" ++"Se nenhuma rota padrão for recebida da rede em malha, então o tráfego que " ++"pertencer a zona de firewall selecionada através da sua conexão internet " ++"como solução de contorno. Se você não quer isto e, ao contrário, deseja " ++"bloquear este tráfego, então você deve selecionar esta opção." ++ ++msgid "" ++"If your own gateway is not available then fallback to the mesh default " ++"gateway." ++msgstr "" ++"Se o seu roteador não estiver disponível, usar como alternativa o roteador " ++"padrão da malha." ++ ++msgid "Policy Routing" ++msgstr "Política de Roteamento" ++ ++msgid "Strict Filtering" ++msgstr "Filtragem Estrita" ++ ++msgid "" ++"These pages can be used to setup policy routing for certain firewall zones. " ++"This is useful if you need to use your own internet connection for yourself " ++"but you don't want to share it with others (thats why it can also be called " ++"'Ego Mode'). Your own traffic is then sent via your internet connection " ++"while traffic originating from the mesh will use another gateway in the mesh." ++msgstr "" ++"Estas páginas podem ser usadas para configurar a política de roteamento para " ++"certas zonas de firewall. Isto pode ser útil se você precisa usar sua " ++"própria conexão com a internet para si e não quer compartilhá-la com outros " ++"(é por isto que isto pode ser chamado de 'Modo Egocêntrico'). Seu próprio " ++"tráfego é enviado através de sua conexão com a internet enquanto o tráfego " ++"originado da rede em malha irá usar outro roteador na malha." +diff --git a/feeds/luci/applications/luci-app-freifunk-policyrouting/po/pt/freifunk-policyrouting.po b/feeds/luci/applications/luci-app-freifunk-policyrouting/po/pt/freifunk-policyrouting.po +new file mode 100644 +index 0000000..41a6b21 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-freifunk-policyrouting/po/pt/freifunk-policyrouting.po +@@ -0,0 +1,56 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Report-Msgid-Bugs-To: \n" ++"POT-Creation-Date: 2013-05-31 11:53+0200\n" ++"PO-Revision-Date: 2013-05-31 11:54+0200\n" ++"Last-Translator: joao.f.vieira \n" ++"Language-Team: LANGUAGE \n" ++"Language: pt\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n != 1);\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "" ++"All traffic from interfaces belonging to these zones will be sent via a " ++"gateway in the mesh network." ++msgstr "" ++"Todo o trafego das interfaces que pertencem a estas zonas será enviado pela " ++"gateway de rede." ++ ++msgid "Enable Policy Routing" ++msgstr "Ativar a Politica de Routing" ++ ++msgid "Fallback to mesh" ++msgstr "" ++ ++msgid "Firewall zones" ++msgstr "Zonas da Firewall" ++ ++msgid "" ++"If no default route is received from the mesh network then traffic which " ++"belongs to the selected firewall zones is routed via your internet " ++"connection as a fallback. If you do not want this and instead block that " ++"traffic then you should select this option." ++msgstr "" ++ ++msgid "" ++"If your own gateway is not available then fallback to the mesh default " ++"gateway." ++msgstr "" ++ ++msgid "Policy Routing" ++msgstr "Política de Routing" ++ ++msgid "Strict Filtering" ++msgstr "Filtragem Estrita" ++ ++msgid "" ++"These pages can be used to setup policy routing for certain firewall zones. " ++"This is useful if you need to use your own internet connection for yourself " ++"but you don't want to share it with others (thats why it can also be called " ++"'Ego Mode'). Your own traffic is then sent via your internet connection " ++"while traffic originating from the mesh will use another gateway in the mesh." ++msgstr "" +diff --git a/feeds/luci/applications/luci-app-freifunk-policyrouting/po/ro/freifunk-policyrouting.po b/feeds/luci/applications/luci-app-freifunk-policyrouting/po/ro/freifunk-policyrouting.po +new file mode 100644 +index 0000000..3386101 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-freifunk-policyrouting/po/ro/freifunk-policyrouting.po +@@ -0,0 +1,53 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"PO-Revision-Date: 2014-06-28 19:28+0200\n" ++"Last-Translator: xxvirusxx \n" ++"Language-Team: none\n" ++"Language: ro\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=3; plural=(n==1 ? 0 : (n==0 || (n%100 > 0 && n%100 < " ++"20)) ? 1 : 2);;\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "" ++"All traffic from interfaces belonging to these zones will be sent via a " ++"gateway in the mesh network." ++msgstr "" ++ ++msgid "Enable Policy Routing" ++msgstr "" ++ ++msgid "Fallback to mesh" ++msgstr "" ++ ++msgid "Firewall zones" ++msgstr "Zone de firewall" ++ ++msgid "" ++"If no default route is received from the mesh network then traffic which " ++"belongs to the selected firewall zones is routed via your internet " ++"connection as a fallback. If you do not want this and instead block that " ++"traffic then you should select this option." ++msgstr "" ++ ++msgid "" ++"If your own gateway is not available then fallback to the mesh default " ++"gateway." ++msgstr "" ++ ++msgid "Policy Routing" ++msgstr "" ++ ++msgid "Strict Filtering" ++msgstr "" ++ ++msgid "" ++"These pages can be used to setup policy routing for certain firewall zones. " ++"This is useful if you need to use your own internet connection for yourself " ++"but you don't want to share it with others (thats why it can also be called " ++"'Ego Mode'). Your own traffic is then sent via your internet connection " ++"while traffic originating from the mesh will use another gateway in the mesh." ++msgstr "" +diff --git a/feeds/luci/applications/luci-app-freifunk-policyrouting/po/ru/freifunk-policyrouting.po b/feeds/luci/applications/luci-app-freifunk-policyrouting/po/ru/freifunk-policyrouting.po +new file mode 100644 +index 0000000..a4ba704 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-freifunk-policyrouting/po/ru/freifunk-policyrouting.po +@@ -0,0 +1,70 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: LuCI: freifunk-policyrouting\n" ++"Report-Msgid-Bugs-To: \n" ++"POT-Creation-Date: 2011-07-25 12:26+0200\n" ++"PO-Revision-Date: 2012-08-15 15:27+0300\n" ++"Last-Translator: Roman A. aka BasicXP \n" ++"Language-Team: Russian \n" ++"Language: ru\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%" ++"10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" ++"X-Generator: Pootle 2.0.4\n" ++"X-Poedit-SourceCharset: UTF-8\n" ++ ++msgid "" ++"All traffic from interfaces belonging to these zones will be sent via a " ++"gateway in the mesh network." ++msgstr "" ++"ВеÑÑŒ трафик от интерфейÑов, принадлежащих Ñтим зонам, будет поÑлан через " ++"шлюз в ÑчеиÑтой Ñети." ++ ++msgid "Enable Policy Routing" ++msgstr "Разрешить политику маршрутизации" ++ ++#, fuzzy ++msgid "Fallback to mesh" ++msgstr "Откат к ÑчеиÑтой Ñети" ++ ++msgid "Firewall zones" ++msgstr "Зоны межÑетевого Ñкрана" ++ ++msgid "" ++"If no default route is received from the mesh network then traffic which " ++"belongs to the selected firewall zones is routed via your internet " ++"connection as a fallback. If you do not want this and instead block that " ++"traffic then you should select this option." ++msgstr "" ++"Трафик, принадлежащий выбранным зонам межÑетевого Ñкрана, маршрутизируетÑÑ " ++"через ваше интернет-Ñоединение, еÑли маршрут по умолчанию не был получен из " ++"ÑчеиÑтой Ñети. ЕÑли Ð²Ð°Ñ Ñто не уÑтраивает, то выберите Ñту опцию и данный " ++"трафик будет заблокирован." ++ ++msgid "" ++"If your own gateway is not available then fallback to the mesh default " ++"gateway." ++msgstr "" ++"ЕÑли ваш шлюз не доÑтупен, откатитьÑÑ Ðº иÑпользованию шлюза ÑчеиÑтой Ñети по " ++"умолчанию." ++ ++msgid "Policy Routing" ++msgstr "Политика маршрутизации" ++ ++msgid "Strict Filtering" ++msgstr "Ð¡Ñ‚Ñ€Ð¾Ð³Ð°Ñ Ñ„Ð¸Ð»ÑŒÑ‚Ñ€Ð°Ñ†Ð¸Ñ" ++ ++msgid "" ++"These pages can be used to setup policy routing for certain firewall zones. " ++"This is useful if you need to use your own internet connection for yourself " ++"but you don't want to share it with others (thats why it can also be called " ++"'Ego Mode'). Your own traffic is then sent via your internet connection " ++"while traffic originating from the mesh will use another gateway in the mesh." ++msgstr "" ++"Ðа Ñтих Ñтраницах Ð’Ñ‹ можете наÑтроить политику маршрутизации Ð´Ð»Ñ " ++"определённых зон межÑетевого Ñкрана. Это может быть полезно, еÑли вы хотите " ++"иÑпользовать интернет-ÑÐ¾ÐµÐ´Ð¸Ð½ÐµÐ½Ð¸Ñ Ñ‚Ð¾Ð»ÑŒÐºÐ¾ Ð´Ð»Ñ ÑебÑ. Ваш трафик в Ñтом Ñлучае " ++"будет иÑпользовать только ваше интернет-Ñоединение, в то Ð²Ñ€ÐµÐ¼Ñ ÐºÐ°Ðº трафик " ++"ÑчеиÑтой Ñети будет иÑпользовать другой шлюз." +diff --git a/feeds/luci/applications/luci-app-freifunk-policyrouting/po/sk/freifunk-policyrouting.po b/feeds/luci/applications/luci-app-freifunk-policyrouting/po/sk/freifunk-policyrouting.po +new file mode 100644 +index 0000000..b1a7810 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-freifunk-policyrouting/po/sk/freifunk-policyrouting.po +@@ -0,0 +1,49 @@ ++msgid "" ++msgstr "" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Last-Translator: Automatically generated\n" ++"Language-Team: none\n" ++"MIME-Version: 1.0\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n" ++ ++msgid "" ++"All traffic from interfaces belonging to these zones will be sent via a " ++"gateway in the mesh network." ++msgstr "" ++ ++msgid "Enable Policy Routing" ++msgstr "" ++ ++msgid "Fallback to mesh" ++msgstr "" ++ ++msgid "Firewall zones" ++msgstr "" ++ ++msgid "" ++"If no default route is received from the mesh network then traffic which " ++"belongs to the selected firewall zones is routed via your internet " ++"connection as a fallback. If you do not want this and instead block that " ++"traffic then you should select this option." ++msgstr "" ++ ++msgid "" ++"If your own gateway is not available then fallback to the mesh default " ++"gateway." ++msgstr "" ++ ++msgid "Policy Routing" ++msgstr "" ++ ++msgid "Strict Filtering" ++msgstr "" ++ ++msgid "" ++"These pages can be used to setup policy routing for certain firewall zones. " ++"This is useful if you need to use your own internet connection for yourself " ++"but you don't want to share it with others (thats why it can also be called " ++"'Ego Mode'). Your own traffic is then sent via your internet connection " ++"while traffic originating from the mesh will use another gateway in the mesh." ++msgstr "" +diff --git a/feeds/luci/applications/luci-app-freifunk-policyrouting/po/sv/freifunk-policyrouting.po b/feeds/luci/applications/luci-app-freifunk-policyrouting/po/sv/freifunk-policyrouting.po +new file mode 100644 +index 0000000..1310afa +--- /dev/null ++++ b/feeds/luci/applications/luci-app-freifunk-policyrouting/po/sv/freifunk-policyrouting.po +@@ -0,0 +1,50 @@ ++msgid "" ++msgstr "" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Last-Translator: Automatically generated\n" ++"Language-Team: none\n" ++"Language: sv\n" ++"MIME-Version: 1.0\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n != 1);\n" ++ ++msgid "" ++"All traffic from interfaces belonging to these zones will be sent via a " ++"gateway in the mesh network." ++msgstr "" ++ ++msgid "Enable Policy Routing" ++msgstr "" ++ ++msgid "Fallback to mesh" ++msgstr "" ++ ++msgid "Firewall zones" ++msgstr "" ++ ++msgid "" ++"If no default route is received from the mesh network then traffic which " ++"belongs to the selected firewall zones is routed via your internet " ++"connection as a fallback. If you do not want this and instead block that " ++"traffic then you should select this option." ++msgstr "" ++ ++msgid "" ++"If your own gateway is not available then fallback to the mesh default " ++"gateway." ++msgstr "" ++ ++msgid "Policy Routing" ++msgstr "" ++ ++msgid "Strict Filtering" ++msgstr "" ++ ++msgid "" ++"These pages can be used to setup policy routing for certain firewall zones. " ++"This is useful if you need to use your own internet connection for yourself " ++"but you don't want to share it with others (thats why it can also be called " ++"'Ego Mode'). Your own traffic is then sent via your internet connection " ++"while traffic originating from the mesh will use another gateway in the mesh." ++msgstr "" +diff --git a/feeds/luci/applications/luci-app-freifunk-policyrouting/po/templates/freifunk-policyrouting.pot b/feeds/luci/applications/luci-app-freifunk-policyrouting/po/templates/freifunk-policyrouting.pot +new file mode 100644 +index 0000000..b4c35c1 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-freifunk-policyrouting/po/templates/freifunk-policyrouting.pot +@@ -0,0 +1,42 @@ ++msgid "" ++msgstr "Content-Type: text/plain; charset=UTF-8" ++ ++msgid "" ++"All traffic from interfaces belonging to these zones will be sent via a " ++"gateway in the mesh network." ++msgstr "" ++ ++msgid "Enable Policy Routing" ++msgstr "" ++ ++msgid "Fallback to mesh" ++msgstr "" ++ ++msgid "Firewall zones" ++msgstr "" ++ ++msgid "" ++"If no default route is received from the mesh network then traffic which " ++"belongs to the selected firewall zones is routed via your internet " ++"connection as a fallback. If you do not want this and instead block that " ++"traffic then you should select this option." ++msgstr "" ++ ++msgid "" ++"If your own gateway is not available then fallback to the mesh default " ++"gateway." ++msgstr "" ++ ++msgid "Policy Routing" ++msgstr "" ++ ++msgid "Strict Filtering" ++msgstr "" ++ ++msgid "" ++"These pages can be used to setup policy routing for certain firewall zones. " ++"This is useful if you need to use your own internet connection for yourself " ++"but you don't want to share it with others (thats why it can also be called " ++"'Ego Mode'). Your own traffic is then sent via your internet connection " ++"while traffic originating from the mesh will use another gateway in the mesh." ++msgstr "" +diff --git a/feeds/luci/applications/luci-app-freifunk-policyrouting/po/tr/freifunk-policyrouting.po b/feeds/luci/applications/luci-app-freifunk-policyrouting/po/tr/freifunk-policyrouting.po +new file mode 100644 +index 0000000..af1616f +--- /dev/null ++++ b/feeds/luci/applications/luci-app-freifunk-policyrouting/po/tr/freifunk-policyrouting.po +@@ -0,0 +1,50 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Last-Translator: Automatically generated\n" ++"Language-Team: none\n" ++"Language: \n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=1; plural=0;\n" ++ ++msgid "" ++"All traffic from interfaces belonging to these zones will be sent via a " ++"gateway in the mesh network." ++msgstr "" ++ ++msgid "Enable Policy Routing" ++msgstr "" ++ ++msgid "Fallback to mesh" ++msgstr "" ++ ++msgid "Firewall zones" ++msgstr "" ++ ++msgid "" ++"If no default route is received from the mesh network then traffic which " ++"belongs to the selected firewall zones is routed via your internet " ++"connection as a fallback. If you do not want this and instead block that " ++"traffic then you should select this option." ++msgstr "" ++ ++msgid "" ++"If your own gateway is not available then fallback to the mesh default " ++"gateway." ++msgstr "" ++ ++msgid "Policy Routing" ++msgstr "" ++ ++msgid "Strict Filtering" ++msgstr "" ++ ++msgid "" ++"These pages can be used to setup policy routing for certain firewall zones. " ++"This is useful if you need to use your own internet connection for yourself " ++"but you don't want to share it with others (thats why it can also be called " ++"'Ego Mode'). Your own traffic is then sent via your internet connection " ++"while traffic originating from the mesh will use another gateway in the mesh." ++msgstr "" +diff --git a/feeds/luci/applications/luci-app-freifunk-policyrouting/po/uk/freifunk-policyrouting.po b/feeds/luci/applications/luci-app-freifunk-policyrouting/po/uk/freifunk-policyrouting.po +new file mode 100644 +index 0000000..e4cc687 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-freifunk-policyrouting/po/uk/freifunk-policyrouting.po +@@ -0,0 +1,72 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"PO-Revision-Date: 2013-08-13 16:14+0200\n" ++"Last-Translator: zubr_139 \n" ++"Language-Team: none\n" ++"Language: uk\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%" ++"10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++#, fuzzy ++msgid "" ++"All traffic from interfaces belonging to these zones will be sent via a " ++"gateway in the mesh network." ++msgstr "" ++"ВеÑÑŒ трафік з інтерфейÑів, прив'Ñзаних до цих зон буде відправлений через " ++"шлюз в комірчаÑÑ‚Ñ– мережі." ++ ++#, fuzzy ++msgid "Enable Policy Routing" ++msgstr "Ðктивувати політику маршрутизації" ++ ++msgid "Fallback to mesh" ++msgstr "" ++ ++#, fuzzy ++msgid "Firewall zones" ++msgstr "Зона фаєрволу" ++ ++#, fuzzy ++msgid "" ++"If no default route is received from the mesh network then traffic which " ++"belongs to the selected firewall zones is routed via your internet " ++"connection as a fallback. If you do not want this and instead block that " ++"traffic then you should select this option." ++msgstr "" ++"Якщо маршрут типово не буде отриманий з Ñітки мережі, то трафік, Ñкий " ++"належить до вибраної зони фаєрволу прÑмує через ваше інтернет-з'Ñ”Ð´Ð½Ð°Ð½Ð½Ñ Ð² " ++"ÑкоÑÑ‚Ñ– запаÑного варіанту. Якщо ви не хочете цього, а заміÑÑ‚ÑŒ цього, що " ++"блокувати трафік, то ви повинні вибрати цю опцію." ++ ++#, fuzzy ++msgid "" ++"If your own gateway is not available then fallback to the mesh default " ++"gateway." ++msgstr "" ++"Якщо ваш шлюз недоÑтупний, то відбуваєтьÑÑ Ð¿Ð¾Ð²ÐµÑ€Ð½ÐµÐ½Ð½Ñ Ð´Ð¾ оÑновного шлюзу " ++"Ñітки." ++ ++msgid "Policy Routing" ++msgstr "Політика маршрутизації" ++ ++msgid "Strict Filtering" ++msgstr "ЖорÑтка фільтраціÑ" ++ ++msgid "" ++"These pages can be used to setup policy routing for certain firewall zones. " ++"This is useful if you need to use your own internet connection for yourself " ++"but you don't want to share it with others (thats why it can also be called " ++"'Ego Mode'). Your own traffic is then sent via your internet connection " ++"while traffic originating from the mesh will use another gateway in the mesh." ++msgstr "" ++"Ці Ñторінки можна викориÑтовувати Ð´Ð»Ñ Ð½Ð°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ð¿Ð¾Ð»Ñ–Ñ‚Ð¸ÐºÐ¸ маршрутизації " ++"Ð´Ð»Ñ Ð¿ÐµÐ²Ð½Ð¸Ñ… зон фаєрволу. Це кориÑно, Ñкщо вам потрібно викориÑтовувати Ñвоє " ++"влаÑне інтернет-з'Ñ”Ð´Ð½Ð°Ð½Ð½Ñ Ð´Ð»Ñ Ñебе, Ñ– ви не хочете ділитиÑÑ Ð½Ð¸Ð¼ з іншими " ++"людьми (оÑÑŒ чому воно також називатиÑÑ 'Его режим '). Ваш влаÑний трафік " ++"потім відправлений через ваше інтернет-з'Ñ”Ð´Ð½Ð°Ð½Ð½Ñ Ð² той Ñ‡Ð°Ñ Ñк трафік, " ++"витікаючий із мережі буде викориÑтовувати інший шлюз у мережі." +diff --git a/feeds/luci/applications/luci-app-freifunk-policyrouting/po/vi/freifunk-policyrouting.po b/feeds/luci/applications/luci-app-freifunk-policyrouting/po/vi/freifunk-policyrouting.po +new file mode 100644 +index 0000000..3c9a17e +--- /dev/null ++++ b/feeds/luci/applications/luci-app-freifunk-policyrouting/po/vi/freifunk-policyrouting.po +@@ -0,0 +1,39 @@ ++msgid "" ++"All traffic from interfaces belonging to these zones will be sent via a " ++"gateway in the mesh network." ++msgstr "" ++ ++msgid "Enable Policy Routing" ++msgstr "" ++ ++msgid "Fallback to mesh" ++msgstr "" ++ ++msgid "Firewall zones" ++msgstr "" ++ ++msgid "" ++"If no default route is received from the mesh network then traffic which " ++"belongs to the selected firewall zones is routed via your internet " ++"connection as a fallback. If you do not want this and instead block that " ++"traffic then you should select this option." ++msgstr "" ++ ++msgid "" ++"If your own gateway is not available then fallback to the mesh default " ++"gateway." ++msgstr "" ++ ++msgid "Policy Routing" ++msgstr "" ++ ++msgid "Strict Filtering" ++msgstr "" ++ ++msgid "" ++"These pages can be used to setup policy routing for certain firewall zones. " ++"This is useful if you need to use your own internet connection for yourself " ++"but you don't want to share it with others (thats why it can also be called " ++"'Ego Mode'). Your own traffic is then sent via your internet connection " ++"while traffic originating from the mesh will use another gateway in the mesh." ++msgstr "" +diff --git a/feeds/luci/applications/luci-app-freifunk-policyrouting/po/zh-cn/freifunk-policyrouting.po b/feeds/luci/applications/luci-app-freifunk-policyrouting/po/zh-cn/freifunk-policyrouting.po +new file mode 100644 +index 0000000..ff0aabc +--- /dev/null ++++ b/feeds/luci/applications/luci-app-freifunk-policyrouting/po/zh-cn/freifunk-policyrouting.po +@@ -0,0 +1,57 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Report-Msgid-Bugs-To: \n" ++"POT-Creation-Date: 2013-10-09 03:50+0200\n" ++"PO-Revision-Date: 2013-10-09 04:04+0200\n" ++"Last-Translator: Tanyingyu \n" ++"Language-Team: LANGUAGE \n" ++"Language: zh_CN\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=1; plural=0;\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "" ++"All traffic from interfaces belonging to these zones will be sent via a " ++"gateway in the mesh network." ++msgstr "所有æµé‡å±žäºŽè¿™ä¸ªmesh网络区域的数æ®æµéƒ½å°†é€šè¿‡ç½‘å…³æ¥å‘é€ã€‚" ++ ++msgid "Enable Policy Routing" ++msgstr "å¯ç”¨ç­–略路由" ++ ++msgid "Fallback to mesh" ++msgstr "meshåŽå¤‡" ++ ++msgid "Firewall zones" ++msgstr "防ç«å¢™åŒºåŸŸ" ++ ++msgid "" ++"If no default route is received from the mesh network then traffic which " ++"belongs to the selected firewall zones is routed via your internet " ++"connection as a fallback. If you do not want this and instead block that " ++"traffic then you should select this option." ++msgstr "" ++"如果没有缺çœçš„mesh网络路由,则使用属于防ç«å¢™åŒºåŸŸå†…çš„Internet连接作为备用路由。如果你ä¸æƒ³è¦è¿™ä¸ªï¼Œè€Œæ˜¯é˜»æ­¢è¯¥æµé‡ï¼Œé‚£ä¹ˆä½ åº”该选择此选项。" ++ ++msgid "" ++"If your own gateway is not available then fallback to the mesh default " ++"gateway." ++msgstr "如果您自己的网关ä¸å¯ç”¨ï¼Œåˆ™é€€å›žåˆ°mesh默认网关。" ++ ++msgid "Policy Routing" ++msgstr "策略路由" ++ ++msgid "Strict Filtering" ++msgstr "严格过滤" ++ ++msgid "" ++"These pages can be used to setup policy routing for certain firewall zones. " ++"This is useful if you need to use your own internet connection for yourself " ++"but you don't want to share it with others (thats why it can also be called " ++"'Ego Mode'). Your own traffic is then sent via your internet connection " ++"while traffic originating from the mesh will use another gateway in the mesh." ++msgstr "" ++"这些页é¢ç”¨äºŽæŸäº›é˜²ç«å¢™åŒºåŸŸè®¾ç½®ç­–略路由。这是éžå¸¸æœ‰ç”¨çš„,如果你需è¦è‡ªå·±ä½¿ç”¨è‡ªå·±çš„互è”网连接,但你ä¸æƒ³æŠŠå®ƒåˆ†äº«ç»™å…¶ä»–人(这就是为什么它也被称为“自我模å¼'" ++")。你自己的æµé‡ï¼Œé€šè¿‡ä½ çš„互è”网连接å‘é€ï¼Œè€Œmesh中的数æ®åŒ…将使用mesh中å¦å¤–的网关。" +diff --git a/feeds/luci/applications/luci-app-freifunk-policyrouting/po/zh-tw/freifunk-policyrouting.po b/feeds/luci/applications/luci-app-freifunk-policyrouting/po/zh-tw/freifunk-policyrouting.po +new file mode 100644 +index 0000000..58efa74 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-freifunk-policyrouting/po/zh-tw/freifunk-policyrouting.po +@@ -0,0 +1,48 @@ ++msgid "" ++msgstr "" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Last-Translator: Automatically generated\n" ++"Language-Team: none\n" ++"MIME-Version: 1.0\n" ++"Content-Transfer-Encoding: 8bit\n" ++ ++msgid "" ++"All traffic from interfaces belonging to these zones will be sent via a " ++"gateway in the mesh network." ++msgstr "" ++ ++msgid "Enable Policy Routing" ++msgstr "" ++ ++msgid "Fallback to mesh" ++msgstr "" ++ ++msgid "Firewall zones" ++msgstr "" ++ ++msgid "" ++"If no default route is received from the mesh network then traffic which " ++"belongs to the selected firewall zones is routed via your internet " ++"connection as a fallback. If you do not want this and instead block that " ++"traffic then you should select this option." ++msgstr "" ++ ++msgid "" ++"If your own gateway is not available then fallback to the mesh default " ++"gateway." ++msgstr "" ++ ++msgid "Policy Routing" ++msgstr "" ++ ++msgid "Strict Filtering" ++msgstr "" ++ ++msgid "" ++"These pages can be used to setup policy routing for certain firewall zones. " ++"This is useful if you need to use your own internet connection for yourself " ++"but you don't want to share it with others (thats why it can also be called " ++"'Ego Mode'). Your own traffic is then sent via your internet connection " ++"while traffic originating from the mesh will use another gateway in the mesh." ++msgstr "" +diff --git a/feeds/luci/applications/luci-app-freifunk-widgets/Makefile b/feeds/luci/applications/luci-app-freifunk-widgets/Makefile +new file mode 100644 +index 0000000..d748827 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-freifunk-widgets/Makefile +@@ -0,0 +1,14 @@ ++# ++# Copyright (C) 2008-2014 The LuCI Team ++# ++# This is free software, licensed under the Apache License, Version 2.0 . ++# ++ ++include $(TOPDIR)/rules.mk ++ ++LUCI_TITLE:=Widgets for the Freifunk index page ++LUCI_DEPENDS:=+luci-mod-freifunk ++ ++include ../../luci.mk ++ ++# call BuildPackage - OpenWrt buildroot signature +diff --git a/feeds/luci/applications/luci-app-freifunk-widgets/luasrc/controller/freifunk/widgets.lua b/feeds/luci/applications/luci-app-freifunk-widgets/luasrc/controller/freifunk/widgets.lua +new file mode 100644 +index 0000000..37104fc +--- /dev/null ++++ b/feeds/luci/applications/luci-app-freifunk-widgets/luasrc/controller/freifunk/widgets.lua +@@ -0,0 +1,35 @@ ++-- Copyright 2012 Manuel Munz ++-- Licensed to the public under the Apache License 2.0. ++ ++local require = require ++module "luci.controller.freifunk.widgets" ++ ++ ++function index() ++ ++ local page = node("admin", "freifunk", "widgets") ++ page.target = cbi("freifunk/widgets/widgets_overview") ++ page.title = _("Widgets") ++ page.i18n = "widgets" ++ page.order = 30 ++ ++ local page = node("admin", "freifunk", "widgets", "widget") ++ page.target = cbi("freifunk/widgets/widget") ++ page.leaf = true ++ ++ local page = node("freifunk", "search_redirect") ++ page.target = call("search_redirect") ++ page.leaf = true ++end ++ ++function search_redirect() ++ local dsp = require "luci.dispatcher" ++ local http = require "luci.http" ++ local engine = http.formvalue("engine") ++ local searchterms = http.formvalue("searchterms") or "" ++ if engine then ++ http.redirect(engine .. searchterms) ++ else ++ http.redirect(dsp.build_url()) ++ end ++end +diff --git a/feeds/luci/applications/luci-app-freifunk-widgets/luasrc/model/cbi/freifunk/widgets/heightwidth.lua b/feeds/luci/applications/luci-app-freifunk-widgets/luasrc/model/cbi/freifunk/widgets/heightwidth.lua +new file mode 100644 +index 0000000..fc23f4b +--- /dev/null ++++ b/feeds/luci/applications/luci-app-freifunk-widgets/luasrc/model/cbi/freifunk/widgets/heightwidth.lua +@@ -0,0 +1,16 @@ ++-- Copyright 2012 Manuel Munz ++-- Licensed to the public under the Apache License 2.0. ++ ++local map, section = ... ++ ++local width = wdg:option(Value, "width", translate("Width")) ++width.rmempty = true ++ ++--[[ ++local height = wdg:option(Value, "height", translate("Height")) ++height.rmempty = true ++height.optional = true ++]]-- ++ ++local pr = wdg:option(Value, "paddingright", translate("Padding right")) ++pr.rmempty = true +diff --git a/feeds/luci/applications/luci-app-freifunk-widgets/luasrc/model/cbi/freifunk/widgets/html.lua b/feeds/luci/applications/luci-app-freifunk-widgets/luasrc/model/cbi/freifunk/widgets/html.lua +new file mode 100644 +index 0000000..adeffa9 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-freifunk-widgets/luasrc/model/cbi/freifunk/widgets/html.lua +@@ -0,0 +1,31 @@ ++-- Copyright 2012 Manuel Munz ++-- Licensed to the public under the Apache License 2.0. ++ ++local map, section = ... ++local utl = require "luci.util" ++local fs = require "nixio.fs" ++local file = "/usr/share/customtext/" .. arg[1] .. ".html" ++ ++local form, ferr = loadfile(utl.libpath() .. "/model/cbi/freifunk/widgets/heightwidth.lua") ++if form then ++ setfenv(form, getfenv(1))(m, wdg) ++end ++ ++t = wdg:option(TextValue, "_text") ++t.rmempty = true ++t.rows = 20 ++ ++ ++function t.cfgvalue() ++ return fs.readfile(file) or "" ++end ++ ++function t.write(self, section, value) ++ return fs.writefile(file, value) ++end ++ ++function t.remove(self, section) ++ return fs.unlink(file) ++end ++ ++ +diff --git a/feeds/luci/applications/luci-app-freifunk-widgets/luasrc/model/cbi/freifunk/widgets/iframe.lua b/feeds/luci/applications/luci-app-freifunk-widgets/luasrc/model/cbi/freifunk/widgets/iframe.lua +new file mode 100644 +index 0000000..68ab06d +--- /dev/null ++++ b/feeds/luci/applications/luci-app-freifunk-widgets/luasrc/model/cbi/freifunk/widgets/iframe.lua +@@ -0,0 +1,13 @@ ++-- Copyright 2012 Manuel Munz ++-- Licensed to the public under the Apache License 2.0. ++ ++local map, section = ... ++local utl = require "luci.util" ++ ++local form, ferr = loadfile(utl.libpath() .. "/model/cbi/freifunk/widgets/heightwidth.lua") ++if form then ++ setfenv(form, getfenv(1))(m, wdg) ++end ++ ++local url = wdg:option(Value, "url", translate("URL")) ++url.default = "http://www.freifunk.net" +diff --git a/feeds/luci/applications/luci-app-freifunk-widgets/luasrc/model/cbi/freifunk/widgets/rssfeed.lua b/feeds/luci/applications/luci-app-freifunk-widgets/luasrc/model/cbi/freifunk/widgets/rssfeed.lua +new file mode 100644 +index 0000000..68fa3be +--- /dev/null ++++ b/feeds/luci/applications/luci-app-freifunk-widgets/luasrc/model/cbi/freifunk/widgets/rssfeed.lua +@@ -0,0 +1,25 @@ ++-- Copyright 2012 Manuel Munz ++-- Licensed to the public under the Apache License 2.0. ++ ++local map, section = ... ++local utl = require "luci.util" ++ ++local form, ferr = loadfile(utl.libpath() .. "/model/cbi/freifunk/widgets/heightwidth.lua") ++if form then ++ setfenv(form, getfenv(1))(m, wdg) ++end ++ ++local url = wdg:option(Value, "url", translate("URL")) ++url.default = "http://global.freifunk.net/rss/all/rss.xml" ++ ++local max = wdg:option(Value, "max", translate("Maximal entries to show")) ++max.rmempty = true ++max.default = "10" ++max.datatype = "integer" ++ ++local cache = wdg:option(Value, "cache", translate("Cache Time"), translate("Cache downloaded feed for that many seconds.")) ++cache.rmempty = true ++cache.default = "3600" ++cache.datatype = "integer" ++ ++ +diff --git a/feeds/luci/applications/luci-app-freifunk-widgets/luasrc/model/cbi/freifunk/widgets/search.lua b/feeds/luci/applications/luci-app-freifunk-widgets/luasrc/model/cbi/freifunk/widgets/search.lua +new file mode 100644 +index 0000000..a027489 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-freifunk-widgets/luasrc/model/cbi/freifunk/widgets/search.lua +@@ -0,0 +1,15 @@ ++-- Copyright 2012 Manuel Munz ++-- Licensed to the public under the Apache License 2.0. ++ ++local map, section = ... ++local utl = require "luci.util" ++ ++local form, ferr = loadfile(utl.libpath() .. "/model/cbi/freifunk/widgets/heightwidth.lua") ++if form then ++ setfenv(form, getfenv(1))(m, wdg) ++end ++ ++local engine = wdg:option(DynamicList, "engine", translate("Search Engine"), ++ translate("Use the form Name|URL, where URL must be a full URL to the search engine " .. ++ "including the query GET parameter, e.g. 'Google|http://www.google.de/search?q='") ++ ) +diff --git a/feeds/luci/applications/luci-app-freifunk-widgets/luasrc/model/cbi/freifunk/widgets/widget.lua b/feeds/luci/applications/luci-app-freifunk-widgets/luasrc/model/cbi/freifunk/widgets/widget.lua +new file mode 100644 +index 0000000..7b6cd89 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-freifunk-widgets/luasrc/model/cbi/freifunk/widgets/widget.lua +@@ -0,0 +1,37 @@ ++-- Copyright 2012 Manuel Munz ++-- Licensed to the public under the Apache License 2.0. ++ ++local uci = require "luci.model.uci".cursor() ++local dsp = require "luci.dispatcher" ++local utl = require "luci.util" ++local widget = uci:get("freifunk-widgets", arg[1], "template") ++local title = uci:get("freifunk-widgets", arg[1], "title") or "" ++ ++m = Map("freifunk-widgets", translate("Widget")) ++m.redirect = luci.dispatcher.build_url("admin/freifunk/widgets") ++ ++if not arg[1] or m.uci:get("freifunk-widgets", arg[1]) ~= "widget" then ++ luci.http.redirect(m.redirect) ++ return ++end ++ ++wdg = m:section(NamedSection, arg[1], "widget", translate("Widget") .. " " .. title) ++wdg.anonymous = true ++wdg.addremove = false ++ ++local en = wdg:option(Flag, "enabled", translate("Enable")) ++en.rmempty = false ++ ++local title = wdg:option(Value, "title", translate("Title")) ++title.rmempty = true ++ ++local form = loadfile( ++ utl.libpath() .. "/model/cbi/freifunk/widgets/%s.lua" % widget ++) ++ ++if form then ++ setfenv(form, getfenv(1))(m, wdg) ++end ++ ++return m ++ +diff --git a/feeds/luci/applications/luci-app-freifunk-widgets/luasrc/model/cbi/freifunk/widgets/widgets_overview.lua b/feeds/luci/applications/luci-app-freifunk-widgets/luasrc/model/cbi/freifunk/widgets/widgets_overview.lua +new file mode 100644 +index 0000000..076d8e0 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-freifunk-widgets/luasrc/model/cbi/freifunk/widgets/widgets_overview.lua +@@ -0,0 +1,68 @@ ++-- Copyright 2012 Manuel Munz ++-- Licensed to the public under the Apache License 2.0. ++ ++local uci = require "luci.model.uci".cursor() ++local fs = require "nixio.fs" ++local utl = require "luci.util" ++m = Map("freifunk-widgets", translate("Widgets"), ++ translate("Configure installed widgets.")) ++ ++wdg = m:section(TypedSection, "widget", translate("Widgets")) ++wdg.addremove = true ++wdg.extedit = luci.dispatcher.build_url("admin/freifunk/widgets/widget/%s") ++wdg.template = "cbi/tblsection" ++wdg.sortable = true ++ ++--[[ ++function wdg.create(...) ++ local sid = TypedSection.create(...) ++ luci.http.redirect(wdg.extedit % sid) ++end ++]]-- ++ ++local en = wdg:option(Flag, "enabled", translate("Enable")) ++en.rmempty = false ++--en.default = "0" ++function en.cfgvalue(self, section) ++ return Flag.cfgvalue(self, section) or "0" ++end ++ ++local tmpl = wdg:option(ListValue, "template", translate("Template")) ++local file ++for file in fs.dir("/usr/lib/lua/luci/view/freifunk/widgets/") do ++ if file ~= "." and file ~= ".." then ++ tmpl:value(file) ++ end ++end ++ ++local title = wdg:option(Value, "title", translate("Title")) ++title.rmempty = true ++ ++local width = wdg:option(Value, "width", translate("Width")) ++width.rmempty = true ++ ++local height = wdg:option(Value, "height", translate("Height")) ++height.rmempty = true ++ ++local pr = wdg:option(Value, "paddingright", translate("Padding right")) ++pr.rmempty = true ++ ++function m.on_commit(self) ++ -- clean custom text files whose config has been deleted ++ local dir = "/usr/share/customtext/" ++ local active = {} ++ uci:foreach("freifunk-widgets", "widget", function(s) ++ if s["template"] == "html" then ++ table.insert(active, s[".name"]) ++ end ++ end ) ++ local file ++ for file in fs.dir(dir) do ++ local filename = string.gsub(file, ".html", "") ++ if not utl.contains(active, filename) then ++ fs.unlink(dir .. file) ++ end ++ end ++end ++ ++return m +diff --git a/feeds/luci/applications/luci-app-freifunk-widgets/luasrc/view/freifunk/widgets/clear/main.htm b/feeds/luci/applications/luci-app-freifunk-widgets/luasrc/view/freifunk/widgets/clear/main.htm +new file mode 100644 +index 0000000..df01839 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-freifunk-widgets/luasrc/view/freifunk/widgets/clear/main.htm +@@ -0,0 +1,15 @@ ++<% ++--[[ ++LuCI - Lua Configuration Interface ++ ++Copyright 2012 Manuel Munz ++ ++Licensed under the Apache License, Version 2.0 (the "License"); ++you may not use this file except in compliance with the License. ++You may obtain a copy of the License at ++ ++ http://www.apache.org/licenses/LICENSE-2.0 ++ ++]]-- ++%> ++
    +diff --git a/feeds/luci/applications/luci-app-freifunk-widgets/luasrc/view/freifunk/widgets/html/main.htm b/feeds/luci/applications/luci-app-freifunk-widgets/luasrc/view/freifunk/widgets/html/main.htm +new file mode 100644 +index 0000000..46e063b +--- /dev/null ++++ b/feeds/luci/applications/luci-app-freifunk-widgets/luasrc/view/freifunk/widgets/html/main.htm +@@ -0,0 +1,42 @@ ++<% ++--[[ ++LuCI - Lua Configuration Interface ++ ++Copyright 2012 Manuel Munz ++ ++Licensed under the Apache License, Version 2.0 (the "License"); ++you may not use this file except in compliance with the License. ++You may obtain a copy of the License at ++ ++ http://www.apache.org/licenses/LICENSE-2.0 ++ ++]]-- ++ ++--local utl = require "luci.util" ++local fs = require "nixio.fs" ++local title = data.title ++local name = data['.name'] ++local file = "/usr/share/customtext/" .. name .. ".html" ++local text = fs.readfile(file) ++local width = data.width or "100%" ++local pr = data.paddingright or "0" ++if type(width) == "number" then ++ width = width .. "px" ++end ++ ++%> ++ ++
    ++
    ++ <% if title then %> ++

    <%=title%>

    ++ <% end %> ++ <% if text then %> ++ <%=text%> ++ <%else%> ++ <%:Could not load the custom text from%> "<%=file%>!" ++ <%end%> ++ ++ <%=data.text%> ++
    ++
    +diff --git a/feeds/luci/applications/luci-app-freifunk-widgets/luasrc/view/freifunk/widgets/iframe/main.htm b/feeds/luci/applications/luci-app-freifunk-widgets/luasrc/view/freifunk/widgets/iframe/main.htm +new file mode 100644 +index 0000000..f0d89d7 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-freifunk-widgets/luasrc/view/freifunk/widgets/iframe/main.htm +@@ -0,0 +1,45 @@ ++<% ++--[[ ++LuCI - Lua Configuration Interface ++ ++Copyright 2012 Manuel Munz ++ ++Licensed under the Apache License, Version 2.0 (the "License"); ++you may not use this file except in compliance with the License. ++You may obtain a copy of the License at ++ ++ http://www.apache.org/licenses/LICENSE-2.0 ++ ++]]-- ++ ++local url = data['url'] ++local name = data['.name'] ++local title = data['title'] or "No title set" ++local height = data['height'] or "400px" ++if type(height) == "number" then ++ height = height .. "px" ++end ++local width = data['width'] or "100%" ++if type(width) == "number" then ++ width = width .. "px" ++end ++ ++%> ++ ++
    ++

    <%=title%>

    ++ ++<% if not url then %> ++ ++<%:No url set.%> ++ ++<% else %> ++
    ++ ++ ++<%:Sorry, your browser doesn't support the object tag and cannot display this page:%>
    ++<%=url%> ++
    ++
    ++
    ++<%end%> +diff --git a/feeds/luci/applications/luci-app-freifunk-widgets/luasrc/view/freifunk/widgets/rssfeed/main.htm b/feeds/luci/applications/luci-app-freifunk-widgets/luasrc/view/freifunk/widgets/rssfeed/main.htm +new file mode 100644 +index 0000000..ff81ba8 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-freifunk-widgets/luasrc/view/freifunk/widgets/rssfeed/main.htm +@@ -0,0 +1,84 @@ ++<% ++--[[ ++LuCI - Lua Configuration Interface ++ ++Copyright 2012 Manuel Munz ++ ++Licensed under the Apache License, Version 2.0 (the "License"); ++you may not use this file except in compliance with the License. ++You may obtain a copy of the License at ++ ++ http://www.apache.org/licenses/LICENSE-2.0 ++ ++]]-- ++ ++local sys = require "luci.sys" ++local utl = require "luci.util" ++local fs = require "nixio.fs" ++local i18n = require "luci.i18n" ++local url = data.url ++local title = data.title or i18n.translate("RSS") ++local max = tonumber(data.max) or 10 ++local rss ++local pr = data.paddingright or "0" ++local output = {} ++local width = data.width or "100%" ++if type(width) == "number" then ++ width = width .. "px" ++end ++local name = data['.name'] ++local cachetime = tonumber(data.cache) or 3600 ++cachefile = "/tmp/" .. name .. ".cache" ++%> ++
    ++
    ++

    <%=title%>

    ++ ++ <% if not url then %> ++ <%:No url found in config%> ++ <% else ++ local mtime = fs.stat(cachefile, "mtime") or 0 ++ local now = os.time() ++ expire = mtime + cachetime ++ ++ if not fs.access(cachefile) or expire < now then ++ rss = sys.httpget(url) ++ if #rss == 0 then ++ %> ++ <%:Could not get rss data from%> <%=url%> ++ <% ++ else ++ local count = 0 ++ for item in string.gmatch(rss, "(.-)") do ++ if count < max then ++ local title = item:match("(.-)") ++ local link = item:match("(.-)") ++ local desc = item:match("(.-)") or "" ++ if title and link then ++ table.insert(output, { title = utl.pcdata(title), link = utl.pcdata(link) }) ++ end ++ count = count + 1 ++ end ++ end ++ if count > 0 then ++ local file = io.open(cachefile, "w") ++ file:write(utl.serialize_data(output)) ++ file:close() ++ end ++ end ++ else ++ local file = assert(io.open(cachefile)) ++ output = utl.restore_data(file:read'*a') ++ end ++ end ++ ++ if #output > 0 then ++ %> ++
      ++ <% for k, v in ipairs(output) do %> ++
    • <%=v.title%>
    • ++ <% end %> ++
    ++ <%end%> ++
    ++
    +diff --git a/feeds/luci/applications/luci-app-freifunk-widgets/luasrc/view/freifunk/widgets/search/main.htm b/feeds/luci/applications/luci-app-freifunk-widgets/luasrc/view/freifunk/widgets/search/main.htm +new file mode 100644 +index 0000000..e319f15 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-freifunk-widgets/luasrc/view/freifunk/widgets/search/main.htm +@@ -0,0 +1,54 @@ ++<% ++--[[ ++LuCI - Lua Configuration Interface ++ ++Copyright 2012 Manuel Munz ++ ++Licensed under the Apache License, Version 2.0 (the "License"); ++you may not use this file except in compliance with the License. ++You may obtain a copy of the License at ++ ++ http://www.apache.org/licenses/LICENSE-2.0 ++ ++]]-- ++local utl = require "luci.util" ++local title = luci.i18n.translate(data.title or "Search") ++local name = data['.name'] ++local width = data.width or "100%" ++ ++if type(width) == "number" then ++ width = width .. "px" ++end ++ ++local engines = {} ++if type(data.engine) == "table" then ++ engines = data.engine ++else ++ for k, v in ipairs(string.split(data.engine, " ")) do ++ table.insert(engines, v) ++ end ++end ++%> ++ ++
    ++

    <%=title%>

    ++
    ++
    ++
    ++ <% ++ local checked = " checked" ++ for k, v in ipairs(engines) do ++ local e = utl.split(v, "|") ++ local name = e[1] ++ local url = e[2] ++ if name and url then ++ %> ++ > <%=name%>
    ++ <% end ++ checked = "" ++ end ++%> ++ ++
    ++
    ++
    +diff --git a/feeds/luci/applications/luci-app-freifunk-widgets/root/etc/config/freifunk-widgets b/feeds/luci/applications/luci-app-freifunk-widgets/root/etc/config/freifunk-widgets +new file mode 100644 +index 0000000..5a9f325 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-freifunk-widgets/root/etc/config/freifunk-widgets +@@ -0,0 +1,33 @@ ++config widget 'example_iframe' ++ option template 'iframe' ++ option url 'http://www.freifunk.net' ++ option title 'Freifunk Homepage' ++ option height '500px' ++ option width '100%' ++ option enabled '0' ++ ++config widget 'example_rss' ++ option template 'rssfeed' ++ option url 'http://global.freifunk.net/rss/all/rss.xml' ++ option max '10' ++ option cache '3600' ++ option enabled '0' ++ option title 'Globaler Freifunk RSS Feed' ++ ++config widget 'example_search' ++ option template 'search' ++ option enabled '0' ++ option title 'Search' ++ list engine 'Google|http://www.google.de/search?q=' ++ list engine 'Freifunk Wiki|http://wiki.freifunk.net/index.php?search=' ++ option width '50%' ++ option paddingright '8%' ++ ++config widget 'example_customtext' ++ option template 'html' ++ option width '50%' ++ option enabled '0' ++ ++config widget 'example_clear' ++ option enabled '0' ++ option template 'clear' +diff --git a/feeds/luci/applications/luci-app-freifunk-widgets/root/lib/upgrade/keep.d/freifunk-widgets b/feeds/luci/applications/luci-app-freifunk-widgets/root/lib/upgrade/keep.d/freifunk-widgets +new file mode 100644 +index 0000000..ce5537a +--- /dev/null ++++ b/feeds/luci/applications/luci-app-freifunk-widgets/root/lib/upgrade/keep.d/freifunk-widgets +@@ -0,0 +1 @@ ++/usr/share/customtext +diff --git a/feeds/luci/applications/luci-app-fwknopd/Makefile b/feeds/luci/applications/luci-app-fwknopd/Makefile +new file mode 100644 +index 0000000..3fbd88a +--- /dev/null ++++ b/feeds/luci/applications/luci-app-fwknopd/Makefile +@@ -0,0 +1,17 @@ ++# ++# Copyright (C) 2015 The LuCI Team ++# ++# This is free software, licensed under the GNU General Public License v2. ++# ++ ++include $(TOPDIR)/rules.mk ++ ++LUCI_TITLE:=Fwknopd config - web config for the firewall knock daemon ++LUCI_DEPENDS:=+fwknopd +qrencode ++PKG_VERSION:=1.0 ++PKG_RELEASE:=1 ++PKG_LICENSE:=GPLv2 ++PKG_MAINTAINER:=Jonathan Bennett ++include ../../luci.mk ++ ++# call BuildPackage - OpenWrt buildroot signature +diff --git a/feeds/luci/applications/luci-app-fwknopd/luasrc/controller/fwknopd.lua b/feeds/luci/applications/luci-app-fwknopd/luasrc/controller/fwknopd.lua +new file mode 100644 +index 0000000..069a77e +--- /dev/null ++++ b/feeds/luci/applications/luci-app-fwknopd/luasrc/controller/fwknopd.lua +@@ -0,0 +1,15 @@ ++-- Copyright 2015 Jonathan Bennett ++-- Licensed to the public under the GNU General Public License v2. ++ ++module("luci.controller.fwknopd", package.seeall) ++ ++function index() ++ if not nixio.fs.access("/etc/config/fwknopd") then ++ return ++ end ++ ++ local page ++ ++ page = entry({"admin", "services", "fwknopd"}, cbi("fwknopd"), _("Firewall Knock Daemon")) ++ page.dependent = true ++end +diff --git a/feeds/luci/applications/luci-app-fwknopd/luasrc/model/cbi/fwknopd.lua b/feeds/luci/applications/luci-app-fwknopd/luasrc/model/cbi/fwknopd.lua +new file mode 100644 +index 0000000..096724f +--- /dev/null ++++ b/feeds/luci/applications/luci-app-fwknopd/luasrc/model/cbi/fwknopd.lua +@@ -0,0 +1,54 @@ ++-- Copyright 2015 Jonathan Bennett ++-- Licensed to the public under the GNU General Public License v2. ++ ++m = Map("fwknopd", translate("Firewall Knock Operator")) ++ ++s = m:section(TypedSection, "global", translate("Enable Uci/Luci control")) -- Set uci control on or off ++s.anonymous=true ++s:option(Flag, "uci_enabled", translate("Enable config overwrite"), translate("When unchecked, the config files in /etc/fwknopd will be used as is, ignoring any settings here.")) ++qr = s:option(DummyValue, "note0", "dummy") ++qr.template = "fwknopd-qr" ++qr:depends("uci_enabled", "1") ++ ++s = m:section(TypedSection, "access", translate("access.conf stanzas")) -- set the access.conf settings ++s.anonymous=true ++s.addremove=true ++s.dynamic=true ++s:option(Value, "SOURCE", "SOURCE", translate("Use ANY for any source ip")) ++k1 = s:option(Value, "KEY", "KEY", translate("Define the symmetric key used for decrypting an incoming SPA packet that is encrypted by the fwknop client with Rijndael.")) ++k1:depends("keytype", translate("Normal Key")) ++k2 = s:option(Value, "KEY_BASE64", "KEY_BASE64", translate("Define the symmetric key used for decrypting an incoming SPA \ ++ packet that is encrypted by the fwknop client with Rijndael.")) ++k2:depends("keytype", translate("Base 64 key")) ++l1 = s:option(ListValue, "keytype", "Key type") ++l1:value("Normal Key", "Normal Key") ++l1:value("Base 64 key", "Base 64 key") ++k3 = s:option(Value, "HMAC_KEY", "HMAC_KEY", "The hmac key") ++k3:depends("hkeytype", "Normal Key") ++k4 = s:option(Value, "HMAC_KEY_BASE64", "HMAC_KEY_BASE64", translate("The base64 hmac key")) ++k4:depends("hkeytype", "Base 64 key") ++l2 = s:option(ListValue, "hkeytype", "HMAC Key type") ++l2:value("Normal Key", "Normal Key") ++l2:value("Base 64 key", "Base 64 key") ++s:option(Value, "OPEN_PORTS", "OPEN_PORTS", translate("Define a set of ports and protocols (tcp or udp) that will be opened if a valid knock sequence is seen. \ ++ If this entry is not set, fwknopd will attempt to honor any proto/port request specified in the SPA data \ ++ (unless of it matches any “RESTRICT_PORTS†entries). Multiple entries are comma-separated.")) ++s:option(Value, "FW_ACCESS_TIMEOUT", "FW_ACCESS_TIMEOUT", translate("Define the length of time access will be granted by fwknopd through the firewall after a \ ++ valid knock sequence from a source IP address. If “FW_ACCESS_TIMEOUT†is not set then the default \ ++ timeout of 30 seconds will automatically be set.")) ++s:option(Value, "REQUIRE_SOURCE_ADDRESS", "REQUIRE_SOURCE_ADDRESS", translate("Force all SPA packets to contain a real IP address within the encrypted data. \ ++ This makes it impossible to use the -s command line argument on the fwknop client command line, so either -R \ ++ has to be used to automatically resolve the external address (if the client behind a NAT) or the client must \ ++ know the external IP and set it via the -a argument.")) ++s:option(DummyValue, "note1", translate("Enter custom access.conf variables below:")) ++ ++s = m:section(TypedSection, "config", translate("fwknopd.conf config options")) ++s.anonymous=true ++s.dynamic=true ++s:option(Value, "MAX_SPA_PACKET_AGE", "MAX_SPA_PACKET_AGE", translate("Maximum age in seconds that an SPA packet will be accepted. defaults to 120 seconds")) ++s:option(Value, "PCAP_INTF", "PCAP_INTF", translate("Specify the ethernet interface on which fwknopd will sniff packets.")) ++s:option(Value, "ENABLE_IPT_FORWARDING", "ENABLE_IPT_FORWARDING", translate("Allow SPA clients to request access to services through an iptables firewall instead of just to it.")) ++s:option(DummyValue, "note2", translate("Enter custom fwknopd.conf variables below:")) ++ ++return m ++ +diff --git a/feeds/luci/applications/luci-app-fwknopd/luasrc/view/fwknopd-qr.htm b/feeds/luci/applications/luci-app-fwknopd/luasrc/view/fwknopd-qr.htm +new file mode 100644 +index 0000000..9e6e818 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-fwknopd/luasrc/view/fwknopd-qr.htm +@@ -0,0 +1 @@ ++<% print(luci.sys.exec("sh /usr/sbin/gen-qr.sh")) %> +diff --git a/feeds/luci/applications/luci-app-fwknopd/po/en/fwknopd.po b/feeds/luci/applications/luci-app-fwknopd/po/en/fwknopd.po +new file mode 100644 +index 0000000..d75c99d +--- /dev/null ++++ b/feeds/luci/applications/luci-app-fwknopd/po/en/fwknopd.po +@@ -0,0 +1,113 @@ ++msgid "" ++msgstr "" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Project-Id-Version: PACKAGE VERSION\n" ++"PO-Revision-Date: 2015-05-12 21:03-0500\n" ++"Last-Translator: Jonathan Bennett \n" ++"Language-Team: English\n" ++"Language: en\n" ++"MIME-Version: 1.0\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n != 1);\n" ++ ++msgid "" ++"Allow SPA clients to request access to services through an iptables firewall " ++"instead of just to it." ++msgstr "" ++"Allow SPA clients to request access to services through an iptables firewall " ++"instead of just to it." ++ ++msgid "Base 64 key" ++msgstr "Base 64 key" ++ ++msgid "" ++"Define a set of ports and protocols (tcp or udp) that will be opened if a " ++"valid knock sequence is seen. If this entry is not set, fwknopd will attempt " ++"to honor any proto/port request specified in the SPA data (unless of it " ++"matches any “RESTRICT_PORTS†entries). Multiple entries are comma-separated." ++msgstr "" ++"Define a set of ports and protocols (tcp or udp) that will be opened if a " ++"valid knock sequence is seen. If this entry is not set, fwknopd will attempt " ++"to honor any proto/port request specified in the SPA data (unless of it " ++"matches any “RESTRICT_PORTS†entries). Multiple entries are comma-separated." ++ ++msgid "" ++"Define the length of time access will be granted by fwknopd through the " ++"firewall after a valid knock sequence from a source IP address. If " ++"“FW_ACCESS_TIMEOUT†is not set then the default timeout of 30 seconds will " ++"automatically be set." ++msgstr "" ++"Define the length of time access will be granted by fwknopd through the " ++"firewall after a valid knock sequence from a source IP address. If " ++"“FW_ACCESS_TIMEOUT†is not set then the default timeout of 30 seconds will " ++"automatically be set." ++ ++msgid "" ++"Define the symmetric key used for decrypting an incoming SPA packet that is " ++"encrypted by the fwknop client with Rijndael." ++msgstr "" ++"Define the symmetric key used for decrypting an incoming SPA packet that is " ++"encrypted by the fwknop client with Rijndael." ++ ++msgid "Enable Uci/Luci control" ++msgstr "Enable Uci/Luci control" ++ ++msgid "Enable config overwrite" ++msgstr "Enable config overwrite" ++ ++msgid "Enter custom access.conf variables below:" ++msgstr "Enter custom access.conf variables below:" ++ ++msgid "Enter custom fwknopd.conf variables below:" ++msgstr "Enter custom fwknopd.conf variables below:" ++ ++msgid "Firewall Knock Daemon" ++msgstr "Firewall Knock Daemon" ++ ++msgid "Firewall Knock Operator" ++msgstr "Firewall Knock Operator" ++ ++msgid "" ++"Force all SPA packets to contain a real IP address within the encrypted " ++"data. This makes it impossible to use the -s command line argument on the " ++"fwknop client command line, so either -R has to be used to automatically " ++"resolve the external address (if the client behind a NAT) or the client must " ++"know the external IP and set it via the -a argument." ++msgstr "" ++"Force all SPA packets to contain a real IP address within the encrypted " ++"data. This makes it impossible to use the -s command line argument on the " ++"fwknop client command line, so either -R has to be used to automatically " ++"resolve the external address (if the client behind a NAT) or the client must " ++"know the external IP and set it via the -a argument." ++ ++msgid "" ++"Maximum age in seconds that an SPA packet will be accepted. defaults to 120 " ++"seconds" ++msgstr "" ++"Maximum age in seconds that an SPA packet will be accepted. defaults to 120 " ++"seconds" ++ ++msgid "Normal Key" ++msgstr "Normal Key" ++ ++msgid "Specify the ethernet interface on which fwknopd will sniff packets." ++msgstr "Specify the ethernet interface on which fwknopd will sniff packets." ++ ++msgid "The base64 hmac key" ++msgstr "The base64 hmac key" ++ ++msgid "Use ANY for any source ip" ++msgstr "Use ANY for any source ip" ++ ++msgid "" ++"When unchecked, the config files in /etc/fwknopd will be used as is, " ++"ignoring any settings here." ++msgstr "" ++"When unchecked, the config files in /etc/fwknopd will be used as is, " ++"ignoring any settings here." ++ ++msgid "access.conf stanzas" ++msgstr "access.conf stanzas" ++ ++msgid "fwknopd.conf config options" ++msgstr "fwknopd.conf config options" +diff --git a/feeds/luci/applications/luci-app-fwknopd/po/templates/fwknopd.pot b/feeds/luci/applications/luci-app-fwknopd/po/templates/fwknopd.pot +new file mode 100644 +index 0000000..4fb616f +--- /dev/null ++++ b/feeds/luci/applications/luci-app-fwknopd/po/templates/fwknopd.pot +@@ -0,0 +1,83 @@ ++msgid "" ++msgstr "Content-Type: text/plain; charset=UTF-8" ++ ++msgid "" ++"Allow SPA clients to request access to services through an iptables firewall " ++"instead of just to it." ++msgstr "" ++ ++msgid "Base 64 key" ++msgstr "" ++ ++msgid "" ++"Define a set of ports and protocols (tcp or udp) that will be opened if a " ++"valid knock sequence is seen. If this entry is not set, fwknopd will attempt " ++"to honor any proto/port request specified in the SPA data (unless of it " ++"matches any “RESTRICT_PORTS†entries). Multiple entries are comma-separated." ++msgstr "" ++ ++msgid "" ++"Define the length of time access will be granted by fwknopd through the " ++"firewall after a valid knock sequence from a source IP address. If " ++"“FW_ACCESS_TIMEOUT†is not set then the default timeout of 30 seconds will " ++"automatically be set." ++msgstr "" ++ ++msgid "" ++"Define the symmetric key used for decrypting an incoming SPA packet that is " ++"encrypted by the fwknop client with Rijndael." ++msgstr "" ++ ++msgid "Enable Uci/Luci control" ++msgstr "" ++ ++msgid "Enable config overwrite" ++msgstr "" ++ ++msgid "Enter custom access.conf variables below:" ++msgstr "" ++ ++msgid "Enter custom fwknopd.conf variables below:" ++msgstr "" ++ ++msgid "Firewall Knock Daemon" ++msgstr "" ++ ++msgid "Firewall Knock Operator" ++msgstr "" ++ ++msgid "" ++"Force all SPA packets to contain a real IP address within the encrypted " ++"data. This makes it impossible to use the -s command line argument on the " ++"fwknop client command line, so either -R has to be used to automatically " ++"resolve the external address (if the client behind a NAT) or the client must " ++"know the external IP and set it via the -a argument." ++msgstr "" ++ ++msgid "" ++"Maximum age in seconds that an SPA packet will be accepted. defaults to 120 " ++"seconds" ++msgstr "" ++ ++msgid "Normal Key" ++msgstr "" ++ ++msgid "Specify the ethernet interface on which fwknopd will sniff packets." ++msgstr "" ++ ++msgid "The base64 hmac key" ++msgstr "" ++ ++msgid "Use ANY for any source ip" ++msgstr "" ++ ++msgid "" ++"When unchecked, the config files in /etc/fwknopd will be used as is, " ++"ignoring any settings here." ++msgstr "" ++ ++msgid "access.conf stanzas" ++msgstr "" ++ ++msgid "fwknopd.conf config options" ++msgstr "" +diff --git a/feeds/luci/applications/luci-app-fwknopd/root/etc/uci-defaults/luci-fwknopd b/feeds/luci/applications/luci-app-fwknopd/root/etc/uci-defaults/luci-fwknopd +new file mode 100644 +index 0000000..01b85de +--- /dev/null ++++ b/feeds/luci/applications/luci-app-fwknopd/root/etc/uci-defaults/luci-fwknopd +@@ -0,0 +1,22 @@ ++#!/bin/sh ++#-- Copyright 2015 Jonathan Bennett ++#-- Licensed to the public under the GNU General Public License v2. ++. /lib/functions/network.sh ++ ++uci batch < ++# ++# This is free software, licensed under the Apache License, Version 2.0 . ++# ++ ++include $(TOPDIR)/rules.mk ++ ++LUCI_TITLE:=Hard Disk Idle Spin-Down module ++LUCI_DEPENDS:=+hd-idle ++ ++include ../../luci.mk ++ ++# call BuildPackage - OpenWrt buildroot signature +diff --git a/feeds/luci/applications/luci-app-hd-idle/luasrc/controller/hd_idle.lua b/feeds/luci/applications/luci-app-hd-idle/luasrc/controller/hd_idle.lua +new file mode 100644 +index 0000000..f273a55 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-hd-idle/luasrc/controller/hd_idle.lua +@@ -0,0 +1,15 @@ ++-- Copyright 2008 Yanira ++-- Licensed to the public under the Apache License 2.0. ++ ++module("luci.controller.hd_idle", package.seeall) ++ ++function index() ++ if not nixio.fs.access("/etc/config/hd-idle") then ++ return ++ end ++ ++ local page ++ ++ page = entry({"admin", "services", "hd_idle"}, cbi("hd_idle"), _("hd-idle"), 60) ++ page.dependent = true ++end +diff --git a/feeds/luci/applications/luci-app-hd-idle/luasrc/model/cbi/hd_idle.lua b/feeds/luci/applications/luci-app-hd-idle/luasrc/model/cbi/hd_idle.lua +new file mode 100644 +index 0000000..70b04af +--- /dev/null ++++ b/feeds/luci/applications/luci-app-hd-idle/luasrc/model/cbi/hd_idle.lua +@@ -0,0 +1,29 @@ ++-- Copyright 2008 Yanira ++-- Licensed to the public under the Apache License 2.0. ++ ++require("nixio.fs") ++ ++m = Map("hd-idle", "hd-idle", ++ translate("hd-idle is a utility program for spinning-down external " .. ++ "disks after a period of idle time.")) ++ ++s = m:section(TypedSection, "hd-idle", translate("Settings")) ++s.anonymous = true ++ ++s:option(Flag, "enabled", translate("Enable")) ++ ++disk = s:option(Value, "disk", translate("Disk")) ++disk.rmempty = true ++for dev in nixio.fs.glob("/dev/[sh]d[a-z]") do ++ disk:value(nixio.fs.basename(dev)) ++end ++ ++s:option(Value, "idle_time_interval", translate("Idle-time")).default = 10 ++s.rmempty = true ++unit = s:option(ListValue, "idle_time_unit", translate("Idle-time unit")) ++unit.default = "minutes" ++unit:value("minutes", translate("min")) ++unit:value("hours", translate("h")) ++unit.rmempty = true ++ ++return m +diff --git a/feeds/luci/applications/luci-app-hd-idle/po/ca/hd_idle.po b/feeds/luci/applications/luci-app-hd-idle/po/ca/hd_idle.po +new file mode 100644 +index 0000000..29618a8 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-hd-idle/po/ca/hd_idle.po +@@ -0,0 +1,52 @@ ++# hd_idle.pot ++# generated from ./applications/luci-hd_idle/luasrc/i18n/hd_idle.en.lua ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Report-Msgid-Bugs-To: \n" ++"POT-Creation-Date: 2010-04-14 10:33+0200\n" ++"PO-Revision-Date: 2014-07-01 05:48+0200\n" ++"Last-Translator: Alex \n" ++"Language-Team: LANGUAGE \n" ++"Language: ca\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n != 1);\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "Disk" ++msgstr "Disc" ++ ++msgid "Enable" ++msgstr "Habilita" ++ ++msgid "Idle-time" ++msgstr "Temps d'inactivitat" ++ ++msgid "Idle-time unit" ++msgstr "Unitat de temps d'inactivitat" ++ ++msgid "Settings" ++msgstr "Ajusts" ++ ++# Hours ++msgid "h" ++msgstr "h" ++ ++msgid "hd-idle" ++msgstr "hd-idle" ++ ++msgid "" ++"hd-idle is a utility program for spinning-down external disks after a period " ++"of idle time." ++msgstr "" ++"hd-idle és un programa per ralentitzar els discos externs després d'un " ++"període de temps inactiu." ++ ++# Minutes (not minimum) ++msgid "min" ++msgstr "min" ++ ++#~ msgid "Enable debug" ++#~ msgstr "Habilita la depuració" +diff --git a/feeds/luci/applications/luci-app-hd-idle/po/cs/hd_idle.po b/feeds/luci/applications/luci-app-hd-idle/po/cs/hd_idle.po +new file mode 100644 +index 0000000..e2deb9b +--- /dev/null ++++ b/feeds/luci/applications/luci-app-hd-idle/po/cs/hd_idle.po +@@ -0,0 +1,52 @@ ++# Generated from applications/luci-hd-idle/luasrc/model/cbi/hd_idle.lua ++# ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Report-Msgid-Bugs-To: \n" ++"POT-Creation-Date: 2010-04-14 10:33+0200\n" ++"PO-Revision-Date: 2014-04-23 22:33+0200\n" ++"Last-Translator: koli \n" ++"Language-Team: none\n" ++"Language: cs\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "Disk" ++msgstr "Disk" ++ ++msgid "Enable" ++msgstr "Povolit" ++ ++msgid "Idle-time" ++msgstr "ÄŒas neÄinnosti" ++ ++msgid "Idle-time unit" ++msgstr "ÄŒas neÄinnosti - jednotka" ++ ++msgid "Settings" ++msgstr "Nastavení" ++ ++# Hodin ++msgid "h" ++msgstr "h" ++ ++msgid "hd-idle" ++msgstr "hd-idle" ++ ++msgid "" ++"hd-idle is a utility program for spinning-down external disks after a period " ++"of idle time." ++msgstr "" ++"hd-idle je utilita pro vypnutí externích pevných disků po urÄité dobÄ› " ++"neÄinnosti." ++ ++# Minut (ne minimum) ++msgid "min" ++msgstr "min" ++ ++#~ msgid "Enable debug" ++#~ msgstr "Povolit ladÄ›ní" +diff --git a/feeds/luci/applications/luci-app-hd-idle/po/de/hd_idle.po b/feeds/luci/applications/luci-app-hd-idle/po/de/hd_idle.po +new file mode 100644 +index 0000000..fa54896 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-hd-idle/po/de/hd_idle.po +@@ -0,0 +1,50 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Report-Msgid-Bugs-To: \n" ++"POT-Creation-Date: 2010-04-14 10:33+0200\n" ++"PO-Revision-Date: 2011-06-11 01:55+0200\n" ++"Last-Translator: Jo-Philipp \n" ++"Language-Team: LANGUAGE \n" ++"Language: de\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n != 1);\n" ++"X-Generator: Pootle 2.0.4\n" ++ ++msgid "Disk" ++msgstr "Festplatte" ++ ++msgid "Enable" ++msgstr "Aktivieren" ++ ++msgid "Idle-time" ++msgstr "Leerlaufzeit" ++ ++msgid "Idle-time unit" ++msgstr "Leerlaufzeiteinheit" ++ ++msgid "Settings" ++msgstr "Einstellungen" ++ ++# Hours ++msgid "h" ++msgstr "Stunden" ++ ++msgid "hd-idle" ++msgstr "hd-idle" ++ ++msgid "" ++"hd-idle is a utility program for spinning-down external disks after a period " ++"of idle time." ++msgstr "" ++"hd-idle ist ein Hilfsprogramm um externe Festplatten nach einer festgelegten " ++"Leerlaufzeit herunter zu fahren." ++ ++# Minutes (not minimum) ++msgid "min" ++msgstr "Minuten" ++ ++#~ msgid "Enable debug" ++#~ msgstr "Debug-Ausgaben aktivieren" +diff --git a/feeds/luci/applications/luci-app-hd-idle/po/el/hd_idle.po b/feeds/luci/applications/luci-app-hd-idle/po/el/hd_idle.po +new file mode 100644 +index 0000000..4d7c23d +--- /dev/null ++++ b/feeds/luci/applications/luci-app-hd-idle/po/el/hd_idle.po +@@ -0,0 +1,48 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Report-Msgid-Bugs-To: \n" ++"POT-Creation-Date: 2010-04-14 10:33+0200\n" ++"PO-Revision-Date: 2012-03-18 15:14+0200\n" ++"Last-Translator: Vasilis \n" ++"Language-Team: LANGUAGE \n" ++"Language: el\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n != 1);\n" ++"X-Generator: Pootle 2.0.4\n" ++ ++msgid "Disk" ++msgstr "Δίσκος" ++ ++msgid "Enable" ++msgstr "ΕνεÏγοποίηση" ++ ++msgid "Idle-time" ++msgstr "" ++ ++msgid "Idle-time unit" ++msgstr "" ++ ++msgid "Settings" ++msgstr "Ρυθμίσεις" ++ ++# Hours ++msgid "h" ++msgstr "ω" ++ ++msgid "hd-idle" ++msgstr "" ++ ++msgid "" ++"hd-idle is a utility program for spinning-down external disks after a period " ++"of idle time." ++msgstr "" ++ ++# Minutes (not minimum) ++msgid "min" ++msgstr "λεπτά" ++ ++#~ msgid "Enable debug" ++#~ msgstr "ΕνεÏγοποίηση αποσφαλμάτωσης" +diff --git a/feeds/luci/applications/luci-app-hd-idle/po/en/hd_idle.po b/feeds/luci/applications/luci-app-hd-idle/po/en/hd_idle.po +new file mode 100644 +index 0000000..7aa4db5 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-hd-idle/po/en/hd_idle.po +@@ -0,0 +1,48 @@ ++#, fuzzy ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Report-Msgid-Bugs-To: \n" ++"POT-Creation-Date: 2010-04-14 10:33+0200\n" ++"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" ++"Last-Translator: FULL NAME \n" ++"Language-Team: LANGUAGE \n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++ ++msgid "Disk" ++msgstr "Disk" ++ ++msgid "Enable" ++msgstr "Enable" ++ ++msgid "Idle-time" ++msgstr "Idle-time" ++ ++msgid "Idle-time unit" ++msgstr "Idle-time unit" ++ ++msgid "Settings" ++msgstr "Settings" ++ ++# Hours ++msgid "h" ++msgstr "h" ++ ++msgid "hd-idle" ++msgstr "" ++ ++msgid "" ++"hd-idle is a utility program for spinning-down external disks after a period " ++"of idle time." ++msgstr "" ++"hd-idle is a utility program for spinning-down external disks after a period " ++"of idle time." ++ ++# Minutes (not minimum) ++msgid "min" ++msgstr "min" ++ ++#~ msgid "Enable debug" ++#~ msgstr "Enable debug" +diff --git a/feeds/luci/applications/luci-app-hd-idle/po/es/hd_idle.po b/feeds/luci/applications/luci-app-hd-idle/po/es/hd_idle.po +new file mode 100644 +index 0000000..d2bb017 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-hd-idle/po/es/hd_idle.po +@@ -0,0 +1,50 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Report-Msgid-Bugs-To: \n" ++"POT-Creation-Date: 2010-04-14 10:33+0200\n" ++"PO-Revision-Date: 2012-08-22 17:44+0200\n" ++"Last-Translator: José Vicente \n" ++"Language-Team: LANGUAGE \n" ++"Language: es\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n != 1);\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "Disk" ++msgstr "Disco" ++ ++msgid "Enable" ++msgstr "Activar" ++ ++msgid "Idle-time" ++msgstr "Tiempo de inactividad" ++ ++msgid "Idle-time unit" ++msgstr "Unidad de tiempo" ++ ++msgid "Settings" ++msgstr "Configuración" ++ ++# Hours ++msgid "h" ++msgstr "h" ++ ++msgid "hd-idle" ++msgstr "hd-idle" ++ ++msgid "" ++"hd-idle is a utility program for spinning-down external disks after a period " ++"of idle time." ++msgstr "" ++"hd-idle es un programa que gestiona el reposo de discos externos tras un " ++"tiempo de inactividad." ++ ++# Minutes (not minimum) ++msgid "min" ++msgstr "minutos" ++ ++#~ msgid "Enable debug" ++#~ msgstr "Activar depuración" +diff --git a/feeds/luci/applications/luci-app-hd-idle/po/fr/hd_idle.po b/feeds/luci/applications/luci-app-hd-idle/po/fr/hd_idle.po +new file mode 100644 +index 0000000..00c092d +--- /dev/null ++++ b/feeds/luci/applications/luci-app-hd-idle/po/fr/hd_idle.po +@@ -0,0 +1,50 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Report-Msgid-Bugs-To: \n" ++"POT-Creation-Date: 2010-04-14 10:33+0200\n" ++"PO-Revision-Date: 2012-11-06 15:20+0200\n" ++"Last-Translator: hogsim \n" ++"Language-Team: LANGUAGE \n" ++"Language: fr\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n > 1);\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "Disk" ++msgstr "Disque" ++ ++msgid "Enable" ++msgstr "Activer" ++ ++msgid "Idle-time" ++msgstr "Temps d'inactivité" ++ ++msgid "Idle-time unit" ++msgstr "Unité de temps" ++ ++msgid "Settings" ++msgstr "Réglages" ++ ++# Hours ++msgid "h" ++msgstr "h" ++ ++msgid "hd-idle" ++msgstr "hd-idle" ++ ++msgid "" ++"hd-idle is a utility program for spinning-down external disks after a period " ++"of idle time." ++msgstr "" ++"hd-idle est un utilitaire pour arrêter la rotation des disques externes " ++"après une période d'inactivité." ++ ++# Minutes (not minimum) ++msgid "min" ++msgstr "min" ++ ++#~ msgid "Enable debug" ++#~ msgstr "Activer le débogage" +diff --git a/feeds/luci/applications/luci-app-hd-idle/po/he/hd_idle.po b/feeds/luci/applications/luci-app-hd-idle/po/he/hd_idle.po +new file mode 100644 +index 0000000..0ffde90 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-hd-idle/po/he/hd_idle.po +@@ -0,0 +1,52 @@ ++# Generated from applications/luci-hd-idle/luasrc/model/cbi/hd_idle.lua ++# ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Report-Msgid-Bugs-To: \n" ++"POT-Creation-Date: 2010-04-14 10:33+0200\n" ++"PO-Revision-Date: 2011-06-25 11:35+0200\n" ++"Last-Translator: GiladL \n" ++"Language-Team: none\n" ++"Language: he\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n != 1);\n" ++"X-Generator: Pootle 2.0.4\n" ++ ++msgid "Disk" ++msgstr "כונן" ++ ++msgid "Enable" ++msgstr "×פשר" ++ ++msgid "Idle-time" ++msgstr "זמן חוסר פעילות" ++ ++msgid "Idle-time unit" ++msgstr "יחידת זמן חוסר פעילות" ++ ++msgid "Settings" ++msgstr "הגדרות" ++ ++# Hours ++msgid "h" ++msgstr "ש'" ++ ++msgid "hd-idle" ++msgstr "" ++ ++msgid "" ++"hd-idle is a utility program for spinning-down external disks after a period " ++"of idle time." ++msgstr "" ++"hd-idle ×”×™× ×” תוכנת שירות שמטרתה להקטין ×ת מהירות הסיבוב של ×›×•× × ×™× ×—×™×¦×•× ×™×™× " ++"ל×חר זמן ×ž×¡×•×™× ×©×œ חוסר פעילות." ++ ++# Minutes (not minimum) ++msgid "min" ++msgstr "דק'" ++ ++#~ msgid "Enable debug" ++#~ msgstr "×פשר ניפוי שגי×ות" +diff --git a/feeds/luci/applications/luci-app-hd-idle/po/hu/hd_idle.po b/feeds/luci/applications/luci-app-hd-idle/po/hu/hd_idle.po +new file mode 100644 +index 0000000..543a8fc +--- /dev/null ++++ b/feeds/luci/applications/luci-app-hd-idle/po/hu/hd_idle.po +@@ -0,0 +1,52 @@ ++# Generated from applications/luci-hd-idle/luasrc/model/cbi/hd_idle.lua ++# ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Report-Msgid-Bugs-To: \n" ++"POT-Creation-Date: 2010-04-14 10:33+0200\n" ++"PO-Revision-Date: 2012-07-10 21:04+0200\n" ++"Last-Translator: Gyula \n" ++"Language-Team: none\n" ++"Language: hu\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n != 1);\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "Disk" ++msgstr "Lemez" ++ ++msgid "Enable" ++msgstr "Engedélyezés" ++ ++msgid "Idle-time" ++msgstr "Ãœresjárati idÅ‘" ++ ++msgid "Idle-time unit" ++msgstr "Ãœresjárati idÅ‘ egysége" ++ ++msgid "Settings" ++msgstr "Beállítások" ++ ++# Hours ++msgid "h" ++msgstr "óra" ++ ++msgid "hd-idle" ++msgstr "hd-idle" ++ ++msgid "" ++"hd-idle is a utility program for spinning-down external disks after a period " ++"of idle time." ++msgstr "" ++"hd-idle egy a külsÅ‘ lemezek adott üresjárati idÅ‘ után történÅ‘ leállítására " ++"szolgáló segédprogram." ++ ++# Minutes (not minimum) ++msgid "min" ++msgstr "perc" ++ ++#~ msgid "Enable debug" ++#~ msgstr "Hibakeresés engedélyezése" +diff --git a/feeds/luci/applications/luci-app-hd-idle/po/it/hd_idle.po b/feeds/luci/applications/luci-app-hd-idle/po/it/hd_idle.po +new file mode 100644 +index 0000000..ffd118d +--- /dev/null ++++ b/feeds/luci/applications/luci-app-hd-idle/po/it/hd_idle.po +@@ -0,0 +1,50 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Report-Msgid-Bugs-To: \n" ++"POT-Creation-Date: 2010-04-14 10:33+0200\n" ++"PO-Revision-Date: 2013-02-03 13:54+0200\n" ++"Last-Translator: Francesco <3gasas@gmail.com>\n" ++"Language-Team: LANGUAGE \n" ++"Language: it\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n != 1);\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "Disk" ++msgstr "Disco" ++ ++msgid "Enable" ++msgstr "Abilita" ++ ++msgid "Idle-time" ++msgstr "Tempo di inattività" ++ ++msgid "Idle-time unit" ++msgstr "Unità di misura del tempo di inattività" ++ ++msgid "Settings" ++msgstr "Opzioni" ++ ++# Hours ++msgid "h" ++msgstr "ora/e" ++ ++msgid "hd-idle" ++msgstr "hd-idle" ++ ++msgid "" ++"hd-idle is a utility program for spinning-down external disks after a period " ++"of idle time." ++msgstr "" ++"HD-idle è un programma per mettere in standby i dischi esterni dopo un " ++"periodo di inattività." ++ ++# Minutes (not minimum) ++msgid "min" ++msgstr "min" ++ ++#~ msgid "Enable debug" ++#~ msgstr "Abilita debug" +diff --git a/feeds/luci/applications/luci-app-hd-idle/po/ja/hd_idle.po b/feeds/luci/applications/luci-app-hd-idle/po/ja/hd_idle.po +new file mode 100644 +index 0000000..9e724eb +--- /dev/null ++++ b/feeds/luci/applications/luci-app-hd-idle/po/ja/hd_idle.po +@@ -0,0 +1,50 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Report-Msgid-Bugs-To: \n" ++"POT-Creation-Date: 2010-04-14 10:33+0200\n" ++"PO-Revision-Date: 2012-11-14 14:40+0200\n" ++"Last-Translator: Kentaro \n" ++"Language-Team: LANGUAGE \n" ++"Language: ja\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=1; plural=0;\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "Disk" ++msgstr "ディスク" ++ ++msgid "Enable" ++msgstr "有効" ++ ++msgid "Idle-time" ++msgstr "アイドル時間" ++ ++msgid "Idle-time unit" ++msgstr "アイドル時間 (å˜ä½)" ++ ++msgid "Settings" ++msgstr "設定" ++ ++# Hours ++msgid "h" ++msgstr "時" ++ ++msgid "hd-idle" ++msgstr "hd-idle" ++ ++msgid "" ++"hd-idle is a utility program for spinning-down external disks after a period " ++"of idle time." ++msgstr "" ++"hd-idleã¯ã‚¢ã‚¤ãƒ‰ãƒ«æ™‚ã«å¤–部ディスクをスピンダウンã•ã›ã‚‹ãŸã‚ã®ã€ãƒ¦ãƒ¼ãƒ†ã‚£ãƒªãƒ†ã‚£ãƒ—" ++"ログラムã§ã™ã€‚" ++ ++# Minutes (not minimum) ++msgid "min" ++msgstr "分" ++ ++#~ msgid "Enable debug" ++#~ msgstr "デãƒãƒƒã‚°ã‚’有効ã«ã™ã‚‹" +diff --git a/feeds/luci/applications/luci-app-hd-idle/po/ms/hd_idle.po b/feeds/luci/applications/luci-app-hd-idle/po/ms/hd_idle.po +new file mode 100644 +index 0000000..45402b8 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-hd-idle/po/ms/hd_idle.po +@@ -0,0 +1,44 @@ ++# Generated from applications/luci-hd-idle/luasrc/model/cbi/hd_idle.lua ++# ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Report-Msgid-Bugs-To: \n" ++"POT-Creation-Date: 2010-04-14 10:33+0200\n" ++"PO-Revision-Date: 2010-04-14 10:33+0200\n" ++"Last-Translator: Automatically generated\n" ++"Language-Team: none\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++ ++msgid "Disk" ++msgstr "" ++ ++msgid "Enable" ++msgstr "" ++ ++msgid "Idle-time" ++msgstr "" ++ ++msgid "Idle-time unit" ++msgstr "" ++ ++msgid "Settings" ++msgstr "" ++ ++# Hours ++msgid "h" ++msgstr "" ++ ++msgid "hd-idle" ++msgstr "" ++ ++msgid "" ++"hd-idle is a utility program for spinning-down external disks after a period " ++"of idle time." ++msgstr "" ++ ++# Minutes (not minimum) ++msgid "min" ++msgstr "" +diff --git a/feeds/luci/applications/luci-app-hd-idle/po/no/hd_idle.po b/feeds/luci/applications/luci-app-hd-idle/po/no/hd_idle.po +new file mode 100644 +index 0000000..dc0c2f8 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-hd-idle/po/no/hd_idle.po +@@ -0,0 +1,39 @@ ++msgid "" ++msgstr "" ++"Last-Translator: Lars Hardy \n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++ ++msgid "Disk" ++msgstr "Disk" ++ ++msgid "Enable" ++msgstr "Aktiver" ++ ++msgid "Idle-time" ++msgstr "Tid inaktiv" ++ ++msgid "Idle-time unit" ++msgstr "Tidsenhet" ++ ++msgid "Settings" ++msgstr "Innstillinger" ++ ++msgid "h" ++msgstr "timer" ++ ++msgid "hd-idle" ++msgstr "Hd-Idle" ++ ++msgid "" ++"hd-idle is a utility program for spinning-down external disks after a period " ++"of idle time." ++msgstr "" ++"hd-idle er et verktøy for Ã¥ spinne ned eksterne disker etter en periode med " ++"inaktivitet." ++ ++msgid "min" ++msgstr "minutter" ++ ++#~ msgid "Enable debug" ++#~ msgstr "Aktiver feilsøking" +diff --git a/feeds/luci/applications/luci-app-hd-idle/po/pl/hd_idle.po b/feeds/luci/applications/luci-app-hd-idle/po/pl/hd_idle.po +new file mode 100644 +index 0000000..c6522c1 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-hd-idle/po/pl/hd_idle.po +@@ -0,0 +1,51 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Report-Msgid-Bugs-To: \n" ++"POT-Creation-Date: 2010-04-14 10:33+0200\n" ++"PO-Revision-Date: 2011-06-03 16:09+0200\n" ++"Last-Translator: Staszek \n" ++"Language-Team: LANGUAGE \n" ++"Language: pl\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 " ++"|| n%100>=20) ? 1 : 2);\n" ++"X-Generator: Pootle 2.0.4\n" ++ ++msgid "Disk" ++msgstr "Dysk" ++ ++msgid "Enable" ++msgstr "WÅ‚Ä…cz" ++ ++msgid "Idle-time" ++msgstr "Czas bezczynnoÅ›ci" ++ ++msgid "Idle-time unit" ++msgstr "Jednostka czasu bezczynnoÅ›ci" ++ ++msgid "Settings" ++msgstr "Ustawienia" ++ ++# Hours ++msgid "h" ++msgstr "godz." ++ ++msgid "hd-idle" ++msgstr "hd-idle" ++ ++msgid "" ++"hd-idle is a utility program for spinning-down external disks after a period " ++"of idle time." ++msgstr "" ++"hd-idle jest narzÄ™dziem do zwalniania obrotów zewnÄ™trznych dysków po " ++"okreÅ›lonym czasie bezczynnoÅ›ci." ++ ++# Minutes (not minimum) ++msgid "min" ++msgstr "min" ++ ++#~ msgid "Enable debug" ++#~ msgstr "WÅ‚Ä…cz tryb debugowania" +diff --git a/feeds/luci/applications/luci-app-hd-idle/po/pt-br/hd_idle.po b/feeds/luci/applications/luci-app-hd-idle/po/pt-br/hd_idle.po +new file mode 100644 +index 0000000..0aaca93 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-hd-idle/po/pt-br/hd_idle.po +@@ -0,0 +1,50 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Report-Msgid-Bugs-To: \n" ++"POT-Creation-Date: 2010-04-14 10:33+0200\n" ++"PO-Revision-Date: 2011-10-08 03:12+0200\n" ++"Last-Translator: luizluca \n" ++"Language-Team: LANGUAGE \n" ++"Language: pt_BR\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n > 1);\n" ++"X-Generator: Pootle 2.0.4\n" ++ ++msgid "Disk" ++msgstr "Disco" ++ ++msgid "Enable" ++msgstr "Habilitar" ++ ++msgid "Idle-time" ++msgstr "Tempo de ociosidade" ++ ++msgid "Idle-time unit" ++msgstr "Unidade do tempo da ociosidade" ++ ++msgid "Settings" ++msgstr "Configurações" ++ ++# Hours ++msgid "h" ++msgstr "horas" ++ ++msgid "hd-idle" ++msgstr "Hd-idle" ++ ++msgid "" ++"hd-idle is a utility program for spinning-down external disks after a period " ++"of idle time." ++msgstr "" ++"Hd-idle é um programa utilitário para ativar o modo \"economia de energia" ++"\" (spinning-down) de discos externos após um período de ociosidade." ++ ++# Minutes (not minimum) ++msgid "min" ++msgstr "minutos" ++ ++#~ msgid "Enable debug" ++#~ msgstr "Ativar depuração" +diff --git a/feeds/luci/applications/luci-app-hd-idle/po/pt/hd_idle.po b/feeds/luci/applications/luci-app-hd-idle/po/pt/hd_idle.po +new file mode 100644 +index 0000000..16cb085 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-hd-idle/po/pt/hd_idle.po +@@ -0,0 +1,50 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Report-Msgid-Bugs-To: \n" ++"POT-Creation-Date: 2010-04-14 10:33+0200\n" ++"PO-Revision-Date: 2013-05-31 15:28+0200\n" ++"Last-Translator: joao.f.vieira \n" ++"Language-Team: LANGUAGE \n" ++"Language: pt\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n != 1);\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "Disk" ++msgstr "Disco" ++ ++msgid "Enable" ++msgstr "Ativar" ++ ++msgid "Idle-time" ++msgstr "Tempo de ociosidade" ++ ++msgid "Idle-time unit" ++msgstr "Unidade de tempo de ociosidade" ++ ++msgid "Settings" ++msgstr "Configurações" ++ ++# Hours ++msgid "h" ++msgstr "h" ++ ++msgid "hd-idle" ++msgstr "hd-idle" ++ ++msgid "" ++"hd-idle is a utility program for spinning-down external disks after a period " ++"of idle time." ++msgstr "" ++"hd-idle é um programa utilitário para activar o modo \"economia de energia" ++"\" (spinning-down) de discos externos após um período de ociosidade." ++ ++# Minutes (not minimum) ++msgid "min" ++msgstr "min" ++ ++#~ msgid "Enable debug" ++#~ msgstr "Ativar debug" +diff --git a/feeds/luci/applications/luci-app-hd-idle/po/ro/hd_idle.po b/feeds/luci/applications/luci-app-hd-idle/po/ro/hd_idle.po +new file mode 100644 +index 0000000..ae6a8b0 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-hd-idle/po/ro/hd_idle.po +@@ -0,0 +1,53 @@ ++# Generated from applications/luci-hd-idle/luasrc/model/cbi/hd_idle.lua ++# ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Report-Msgid-Bugs-To: \n" ++"POT-Creation-Date: 2010-04-14 10:33+0200\n" ++"PO-Revision-Date: 2013-09-25 19:12+0200\n" ++"Last-Translator: Mihai \n" ++"Language-Team: none\n" ++"Language: ro\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=3; plural=(n==1 ? 0 : (n==0 || (n%100 > 0 && n%100 < " ++"20)) ? 1 : 2);;\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "Disk" ++msgstr "Disc" ++ ++msgid "Enable" ++msgstr "Activeaza" ++ ++msgid "Idle-time" ++msgstr "Timp de inactivitate" ++ ++msgid "Idle-time unit" ++msgstr "Unitatea de timp pentru masurarea inactivitatii" ++ ++msgid "Settings" ++msgstr "Setari" ++ ++# Hours ++msgid "h" ++msgstr "ore" ++ ++msgid "hd-idle" ++msgstr "hd-idle" ++ ++msgid "" ++"hd-idle is a utility program for spinning-down external disks after a period " ++"of idle time." ++msgstr "" ++"hd-idle este un utilitar pentru a oprit din rotatie hard disc-urile externe " ++"dupa o anumita perioada de inactivitate." ++ ++# Minutes (not minimum) ++msgid "min" ++msgstr "minute" ++ ++#~ msgid "Enable debug" ++#~ msgstr "Activeaza informatii suplimentare de tip \"debug\"" +diff --git a/feeds/luci/applications/luci-app-hd-idle/po/ru/hd_idle.po b/feeds/luci/applications/luci-app-hd-idle/po/ru/hd_idle.po +new file mode 100644 +index 0000000..45d4a51 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-hd-idle/po/ru/hd_idle.po +@@ -0,0 +1,52 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: LuCI: hd_idle\n" ++"Report-Msgid-Bugs-To: \n" ++"POT-Creation-Date: 2010-04-14 10:33+0200\n" ++"PO-Revision-Date: 2012-08-15 11:24+0300\n" ++"Last-Translator: Roman A. aka BasicXP \n" ++"Language-Team: Russian \n" ++"Language: ru\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%" ++"10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" ++"X-Generator: Pootle 2.0.6\n" ++"X-Poedit-SourceCharset: UTF-8\n" ++ ++msgid "Disk" ++msgstr "ДиÑк" ++ ++msgid "Enable" ++msgstr "Включить" ++ ++msgid "Idle-time" ++msgstr "Ð’Ñ€ÐµÐ¼Ñ Ð±ÐµÐ·Ð´ÐµÐ¹ÑтвиÑ" ++ ++msgid "Idle-time unit" ++msgstr "Единицы времени бездейÑтвиÑ" ++ ++msgid "Settings" ++msgstr "ÐаÑтройки" ++ ++# Hours ++msgid "h" ++msgstr "ч" ++ ++msgid "hd-idle" ++msgstr "hd-idle" ++ ++msgid "" ++"hd-idle is a utility program for spinning-down external disks after a period " ++"of idle time." ++msgstr "" ++"Утилита hd-idle позволÑет замедлÑÑ‚ÑŒ внешние диÑки поÑле определённого " ++"времени бездейÑтвиÑ." ++ ++# Minutes (not minimum) ++msgid "min" ++msgstr "мин" ++ ++#~ msgid "Enable debug" ++#~ msgstr "Включить отладку" +diff --git a/feeds/luci/applications/luci-app-hd-idle/po/sk/hd_idle.po b/feeds/luci/applications/luci-app-hd-idle/po/sk/hd_idle.po +new file mode 100644 +index 0000000..0ae82d8 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-hd-idle/po/sk/hd_idle.po +@@ -0,0 +1,38 @@ ++msgid "" ++msgstr "" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Last-Translator: Automatically generated\n" ++"Language-Team: none\n" ++"MIME-Version: 1.0\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n" ++ ++msgid "Disk" ++msgstr "" ++ ++msgid "Enable" ++msgstr "" ++ ++msgid "Idle-time" ++msgstr "" ++ ++msgid "Idle-time unit" ++msgstr "" ++ ++msgid "Settings" ++msgstr "" ++ ++msgid "h" ++msgstr "" ++ ++msgid "hd-idle" ++msgstr "" ++ ++msgid "" ++"hd-idle is a utility program for spinning-down external disks after a period " ++"of idle time." ++msgstr "" ++ ++msgid "min" ++msgstr "" +diff --git a/feeds/luci/applications/luci-app-hd-idle/po/sv/hd_idle.po b/feeds/luci/applications/luci-app-hd-idle/po/sv/hd_idle.po +new file mode 100644 +index 0000000..1d63095 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-hd-idle/po/sv/hd_idle.po +@@ -0,0 +1,39 @@ ++msgid "" ++msgstr "" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Last-Translator: Automatically generated\n" ++"Language-Team: none\n" ++"Language: sv\n" ++"MIME-Version: 1.0\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n != 1);\n" ++ ++msgid "Disk" ++msgstr "" ++ ++msgid "Enable" ++msgstr "" ++ ++msgid "Idle-time" ++msgstr "" ++ ++msgid "Idle-time unit" ++msgstr "" ++ ++msgid "Settings" ++msgstr "" ++ ++msgid "h" ++msgstr "" ++ ++msgid "hd-idle" ++msgstr "" ++ ++msgid "" ++"hd-idle is a utility program for spinning-down external disks after a period " ++"of idle time." ++msgstr "" ++ ++msgid "min" ++msgstr "" +diff --git a/feeds/luci/applications/luci-app-hd-idle/po/templates/hd_idle.pot b/feeds/luci/applications/luci-app-hd-idle/po/templates/hd_idle.pot +new file mode 100644 +index 0000000..56079ed +--- /dev/null ++++ b/feeds/luci/applications/luci-app-hd-idle/po/templates/hd_idle.pot +@@ -0,0 +1,31 @@ ++msgid "" ++msgstr "Content-Type: text/plain; charset=UTF-8" ++ ++msgid "Disk" ++msgstr "" ++ ++msgid "Enable" ++msgstr "" ++ ++msgid "Idle-time" ++msgstr "" ++ ++msgid "Idle-time unit" ++msgstr "" ++ ++msgid "Settings" ++msgstr "" ++ ++msgid "h" ++msgstr "" ++ ++msgid "hd-idle" ++msgstr "" ++ ++msgid "" ++"hd-idle is a utility program for spinning-down external disks after a period " ++"of idle time." ++msgstr "" ++ ++msgid "min" ++msgstr "" +diff --git a/feeds/luci/applications/luci-app-hd-idle/po/tr/hd_idle.po b/feeds/luci/applications/luci-app-hd-idle/po/tr/hd_idle.po +new file mode 100644 +index 0000000..f9ace87 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-hd-idle/po/tr/hd_idle.po +@@ -0,0 +1,52 @@ ++# Generated from applications/luci-hd-idle/luasrc/model/cbi/hd_idle.lua ++# ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Report-Msgid-Bugs-To: \n" ++"POT-Creation-Date: 2010-04-14 10:33+0200\n" ++"PO-Revision-Date: 2012-10-11 23:15+0200\n" ++"Last-Translator: vincenzo \n" ++"Language-Team: none\n" ++"Language: tr\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=1; plural=0;\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "Disk" ++msgstr "Disk" ++ ++msgid "Enable" ++msgstr "Kullanıma Aç" ++ ++msgid "Idle-time" ++msgstr "Bekleme Zamanı" ++ ++msgid "Idle-time unit" ++msgstr "bekleme zamanı birimi" ++ ++msgid "Settings" ++msgstr "Ayarlar" ++ ++# Hours ++msgid "h" ++msgstr "s" ++ ++msgid "hd-idle" ++msgstr "Harddisk-Park" ++ ++msgid "" ++"hd-idle is a utility program for spinning-down external disks after a period " ++"of idle time." ++msgstr "" ++"Harddisk-Park belirli bir zaman sonra diskleri beklemeye alan bir yardımcı " ++"programdır" ++ ++# Minutes (not minimum) ++msgid "min" ++msgstr "d" ++ ++#~ msgid "Enable debug" ++#~ msgstr "Hata Ayıklama" +diff --git a/feeds/luci/applications/luci-app-hd-idle/po/uk/hd_idle.po b/feeds/luci/applications/luci-app-hd-idle/po/uk/hd_idle.po +new file mode 100644 +index 0000000..129fd7b +--- /dev/null ++++ b/feeds/luci/applications/luci-app-hd-idle/po/uk/hd_idle.po +@@ -0,0 +1,52 @@ ++# Generated from applications/luci-hd-idle/luasrc/model/cbi/hd_idle.lua ++# ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Report-Msgid-Bugs-To: \n" ++"POT-Creation-Date: 2010-04-14 10:33+0200\n" ++"PO-Revision-Date: 2013-08-13 15:59+0200\n" ++"Last-Translator: zubr_139 \n" ++"Language-Team: none\n" ++"Language: uk\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%" ++"10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "Disk" ++msgstr "ДиÑк" ++ ++msgid "Enable" ++msgstr "Ðктивувати" ++ ++msgid "Idle-time" ++msgstr "Ð§Ð°Ñ Ð¿Ñ€Ð¾Ñтою" ++ ++msgid "Idle-time unit" ++msgstr "" ++ ++msgid "Settings" ++msgstr "ÐалаштуваннÑ" ++ ++# Hours ++msgid "h" ++msgstr "" ++ ++#, fuzzy ++msgid "hd-idle" ++msgstr "HD-проÑтій" ++ ++msgid "" ++"hd-idle is a utility program for spinning-down external disks after a period " ++"of idle time." ++msgstr "" ++ ++# Minutes (not minimum) ++msgid "min" ++msgstr "хв" ++ ++#~ msgid "Enable debug" ++#~ msgstr "Ðктивувати налагодженнÑ" +diff --git a/feeds/luci/applications/luci-app-hd-idle/po/vi/hd_idle.po b/feeds/luci/applications/luci-app-hd-idle/po/vi/hd_idle.po +new file mode 100644 +index 0000000..03ee2c1 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-hd-idle/po/vi/hd_idle.po +@@ -0,0 +1,53 @@ ++# hd_idle.pot ++# generated from ./applications/luci-hd_idle/luasrc/i18n/hd_idle.en.lua ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Report-Msgid-Bugs-To: \n" ++"POT-Creation-Date: 2010-04-14 10:33+0200\n" ++"PO-Revision-Date: 2009-08-12 17:50+0200\n" ++"Last-Translator: Hong Phuc Dang \n" ++"Language-Team: LANGUAGE \n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"X-Generator: Pootle 1.1.0\n" ++ ++msgid "Disk" ++msgstr "á»” Ä‘Ä©a" ++ ++#, fuzzy ++msgid "Enable" ++msgstr "Kích hoạt debug" ++ ++#, fuzzy ++msgid "Idle-time" ++msgstr "Thá»i gian Idle" ++ ++#, fuzzy ++msgid "Idle-time unit" ++msgstr "ÄÆ¡n vị thá»i gian Idle" ++ ++msgid "Settings" ++msgstr "Sắp đặt" ++ ++# Hours ++msgid "h" ++msgstr "" ++ ++msgid "hd-idle" ++msgstr "hd-idle" ++ ++msgid "" ++"hd-idle is a utility program for spinning-down external disks after a period " ++"of idle time." ++msgstr "" ++"hd-idle là má»™t chÆ°Æ¡ng trình tiện ích để quay các Ä‘Ä©a ngoài sau má»™t khoảng " ++"thá»i gian idle." ++ ++# Minutes (not minimum) ++msgid "min" ++msgstr "" ++ ++#~ msgid "Enable debug" ++#~ msgstr "Kích hoạt debug" +diff --git a/feeds/luci/applications/luci-app-hd-idle/po/zh-cn/hd_idle.po b/feeds/luci/applications/luci-app-hd-idle/po/zh-cn/hd_idle.po +new file mode 100644 +index 0000000..8bc14dc +--- /dev/null ++++ b/feeds/luci/applications/luci-app-hd-idle/po/zh-cn/hd_idle.po +@@ -0,0 +1,48 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Report-Msgid-Bugs-To: \n" ++"POT-Creation-Date: 2010-04-14 10:33+0200\n" ++"PO-Revision-Date: 2012-09-03 17:57+0200\n" ++"Last-Translator: nKsyn \n" ++"Language-Team: QQ Group:75543259 \n" ++"Language: zh_CN\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=1; plural=0;\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "Disk" ++msgstr "硬盘" ++ ++msgid "Enable" ++msgstr "å¼€å¯" ++ ++msgid "Idle-time" ++msgstr "空闲时间" ++ ++msgid "Idle-time unit" ++msgstr "空闲时间å•ä½" ++ ++msgid "Settings" ++msgstr "设置" ++ ++# Hours ++msgid "h" ++msgstr "å°æ—¶" ++ ++msgid "hd-idle" ++msgstr "硬盘休眠" ++ ++msgid "" ++"hd-idle is a utility program for spinning-down external disks after a period " ++"of idle time." ++msgstr "硬盘休眠是一个让硬盘在空闲一段时间åŽä¼‘眠的工具" ++ ++# Minutes (not minimum) ++msgid "min" ++msgstr "分钟" ++ ++#~ msgid "Enable debug" ++#~ msgstr "å¼€å¯è°ƒè¯•" +diff --git a/feeds/luci/applications/luci-app-hd-idle/po/zh-tw/hd_idle.po b/feeds/luci/applications/luci-app-hd-idle/po/zh-tw/hd_idle.po +new file mode 100644 +index 0000000..bd69785 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-hd-idle/po/zh-tw/hd_idle.po +@@ -0,0 +1,44 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"PO-Revision-Date: 2013-08-07 15:47+0200\n" ++"Last-Translator: Ethan \n" ++"Language-Team: none\n" ++"Language: zh_TW\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=1; plural=0;\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "Disk" ++msgstr "ç£ç¢Ÿ" ++ ++msgid "Enable" ++msgstr "啟用" ++ ++msgid "Idle-time" ++msgstr "休眠時間" ++ ++msgid "Idle-time unit" ++msgstr "休眠時間單ä½" ++ ++msgid "Settings" ++msgstr "設定" ++ ++msgid "h" ++msgstr "å°æ™‚" ++ ++msgid "hd-idle" ++msgstr "硬碟休眠" ++ ++msgid "" ++"hd-idle is a utility program for spinning-down external disks after a period " ++"of idle time." ++msgstr "硬碟休眠是控制當硬碟閒置一段時間後進入休眠模å¼çš„工具" ++ ++msgid "min" ++msgstr "分é˜" ++ ++#~ msgid "Enable debug" ++#~ msgstr "啟用åµéŒ¯æ¨¡å¼" +diff --git a/feeds/luci/applications/luci-app-hd-idle/root/etc/uci-defaults/luci-hd_idle b/feeds/luci/applications/luci-app-hd-idle/root/etc/uci-defaults/luci-hd_idle +new file mode 100755 +index 0000000..92f4356 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-hd-idle/root/etc/uci-defaults/luci-hd_idle +@@ -0,0 +1,11 @@ ++#!/bin/sh ++ ++uci -q batch <<-EOF >/dev/null ++ delete ucitrack.@hd-idle[-1] ++ add ucitrack hd-idle ++ set ucitrack.@hd-idle[-1].init=hd-idle ++ commit ucitrack ++EOF ++ ++rm -f /tmp/luci-indexcache ++exit 0 +diff --git a/feeds/luci/applications/luci-app-ltqtapi/Makefile b/feeds/luci/applications/luci-app-ltqtapi/Makefile +new file mode 100644 +index 0000000..bf4a999 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-ltqtapi/Makefile +@@ -0,0 +1,14 @@ ++# ++# Copyright (C) 2008-2014 The LuCI Team ++# ++# This is free software, licensed under the Apache License, Version 2.0 . ++# ++ ++include $(TOPDIR)/rules.mk ++ ++LUCI_TITLE:=LuCI Support for Lantiq Devices ++LUCI_DEPENDS:=@BROKEN ++ ++include ../../luci.mk ++ ++# call BuildPackage - OpenWrt buildroot signature +diff --git a/feeds/luci/applications/luci-app-ltqtapi/luasrc/controller/ltqtapi.lua b/feeds/luci/applications/luci-app-ltqtapi/luasrc/controller/ltqtapi.lua +new file mode 100644 +index 0000000..46c7684 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-ltqtapi/luasrc/controller/ltqtapi.lua +@@ -0,0 +1,40 @@ ++-- Copyright 2019 John Crispin ++-- Licensed to the public under the Apache License 2.0. ++ ++module("luci.controller.ltqtapi", package.seeall) ++ ++function index() ++ if not nixio.fs.access("/etc/config/telephony") then ++ return ++ end ++ ++ page = node("admin", "telephony") ++ page.target = firstchild() ++ page.title = _("VoIP") ++ page.order = 90 ++ ++ entry({"admin", "telephony", "account"}, cbi("luci_ltqtapi/account") , _("Account"), 10) ++ entry({"admin", "telephony", "contact"}, cbi("luci_ltqtapi/contact") , _("Contacts"), 20) ++ ++ entry({"admin", "telephony", "status"}, call("tapi_status")).leaf = true ++end ++ ++function tapi_status() ++ local st = { } ++ local state = require "luci.model.uci".cursor_state() ++ state:load("telephony") ++ ++ st.status = "Offline"; ++ if state:get("telephony", "state", "port1", "0") == "0" then ++ st.line1 = "Idle"; ++ else ++ st.line1 = "Calling"; ++ end ++ if state:get("telephony", "state", "port2", "0") == "0" then ++ st.line2 = "Idle"; ++ else ++ st.line2 = "Calling"; ++ end ++ luci.http.prepare_content("application/json") ++ luci.http.write_json(st) ++end +diff --git a/feeds/luci/applications/luci-app-ltqtapi/luasrc/model/cbi/luci_ltqtapi/account.lua b/feeds/luci/applications/luci-app-ltqtapi/luasrc/model/cbi/luci_ltqtapi/account.lua +new file mode 100644 +index 0000000..907db56 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-ltqtapi/luasrc/model/cbi/luci_ltqtapi/account.lua +@@ -0,0 +1,16 @@ ++-- Copyright 2010 John Crispin ++-- Licensed to the public under the Apache License 2.0. ++ ++m = Map("telephony", translate("VoIP")) ++m.on_after_commit = function() luci.sys.call("/etc/init.d/telephony restart") end ++ ++s = m:section(TypedSection, "account", translate("Account"), translate("Here You can specify the SIP account that you want to use.")) ++s.anonymous = true ++s.addremove = true ++ ++s:option(Value, "realm", translate("Realm")) ++s:option(Value, "username", translate("Username")) ++s:option(Value, "password", translate("Password")) ++s:option(Flag, "disabled", translate("Disabled")) ++ ++return m +diff --git a/feeds/luci/applications/luci-app-ltqtapi/luasrc/model/cbi/luci_ltqtapi/contact.lua b/feeds/luci/applications/luci-app-ltqtapi/luasrc/model/cbi/luci_ltqtapi/contact.lua +new file mode 100644 +index 0000000..b32fede +--- /dev/null ++++ b/feeds/luci/applications/luci-app-ltqtapi/luasrc/model/cbi/luci_ltqtapi/contact.lua +@@ -0,0 +1,20 @@ ++-- Copyright 2010 John Crispin ++-- Licensed to the public under the Apache License 2.0. ++ ++m = Map("telephony", translate("VoIP")) ++m.on_after_commit = function() luci.sys.call("/etc/init.d/telephony reload") end ++ ++s = m:section(TypedSection, "contact", translate("Contact"), translate("Here You can specify the SIP contacts that you want to use.")) ++s.anonymous = true ++s.addremove = true ++s.template = "cbi/tsection" ++ ++s:option(Value, "desc", translate("Name")) ++s:option(Value, "code", translate("Shortdial")) ++s:option(Value, "dial", translate("Dial")) ++ ++t = s:option(ListValue, "type", translate("Type")) ++t:value("sip", "SIP") ++t:value("realm", "Landline") ++ ++return m +diff --git a/feeds/luci/applications/luci-app-ltqtapi/luasrc/view/admin_status/index/telephony.htm b/feeds/luci/applications/luci-app-ltqtapi/luasrc/view/admin_status/index/telephony.htm +new file mode 100644 +index 0000000..c7a58dd +--- /dev/null ++++ b/feeds/luci/applications/luci-app-ltqtapi/luasrc/view/admin_status/index/telephony.htm +@@ -0,0 +1 @@ ++<%+telephony_status%> +diff --git a/feeds/luci/applications/luci-app-ltqtapi/luasrc/view/telephony_status.htm b/feeds/luci/applications/luci-app-ltqtapi/luasrc/view/telephony_status.htm +new file mode 100644 +index 0000000..234f909 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-ltqtapi/luasrc/view/telephony_status.htm +@@ -0,0 +1,32 @@ ++ ++ ++
    ++ <%:Current Telephony State%> ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
    <%:Uplink%><%:Port1%><%:Port2%>

    <%:Collecting data...%>
    ++
    +diff --git a/feeds/luci/applications/luci-app-meshwizard/Makefile b/feeds/luci/applications/luci-app-meshwizard/Makefile +new file mode 100644 +index 0000000..fb2610e +--- /dev/null ++++ b/feeds/luci/applications/luci-app-meshwizard/Makefile +@@ -0,0 +1,14 @@ ++# ++# Copyright (C) 2008-2014 The LuCI Team ++# ++# This is free software, licensed under the Apache License, Version 2.0 . ++# ++ ++include $(TOPDIR)/rules.mk ++ ++LUCI_TITLE:=Shellscript based wizard to setup mesh networks ++LUCI_DEPENDS:=+meshwizard ++ ++include ../../luci.mk ++ ++# call BuildPackage - OpenWrt buildroot signature +diff --git a/feeds/luci/applications/luci-app-meshwizard/luasrc/controller/meshwizard.lua b/feeds/luci/applications/luci-app-meshwizard/luasrc/controller/meshwizard.lua +new file mode 100644 +index 0000000..0ad76b5 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-meshwizard/luasrc/controller/meshwizard.lua +@@ -0,0 +1,9 @@ ++-- Copyright 2011 Manuel Munz ++-- Licensed to the public under the Apache License 2.0. ++ ++module "luci.controller.meshwizard" ++ ++function index() ++ entry({"admin", "freifunk", "meshwizard"}, cbi("freifunk/meshwizard"), _("Mesh Wizard"), 40) ++end ++ +diff --git a/feeds/luci/applications/luci-app-meshwizard/luasrc/model/cbi/freifunk/meshwizard.lua b/feeds/luci/applications/luci-app-meshwizard/luasrc/model/cbi/freifunk/meshwizard.lua +new file mode 100644 +index 0000000..68f7a5a +--- /dev/null ++++ b/feeds/luci/applications/luci-app-meshwizard/luasrc/model/cbi/freifunk/meshwizard.lua +@@ -0,0 +1,199 @@ ++-- wizard rewrite wip ++ ++local uci = require "luci.model.uci".cursor() ++local sys = require "luci.sys" ++local util = require "luci.util" ++local ip = require "luci.ip" ++ ++local community = "profile_" .. (uci:get("freifunk", "community", "name") or "Freifunk") ++local mesh_network = ip.IPv4(uci:get_first(community, "community", "mesh_network") or "10.0.0.0/8") ++local community_ipv6 = uci:get_first(community, "community", "ipv6") or 0 ++local community_ipv6mode = uci:get_first(community, "community", "ipv6_config") or "static" ++local meshkit_ipv6 = uci:get("meshwizard", "ipv6", "enabled") or 0 ++local community_vap = uci:get_first(community, "community", "vap") or 0 ++ ++m = Map("meshwizard", translate("Wizard"), translate("This wizard will assist you in setting up your router for Freifunk " .. ++ "or another similar wireless community network.")) ++ ++n = m:section(NamedSection, "netconfig", nil, translate("Interfaces")) ++n.anonymous = true ++ ++-- common functions ++ ++function cbi_configure(device) ++ local configure = n:taboption(device, Flag, device .. "_config", translate("Configure this interface"), ++ translate("Note: this will set up this interface for mesh operation, i.e. add it to zone 'freifunk' and enable olsr.")) ++end ++ ++function cbi_ip4addr(device) ++ local ip4addr = n:taboption(device, Value, device .. "_ip4addr", translate("Mesh IP address"), ++ translate("This is a unique address in the mesh (e.g. 10.1.1.1) and has to be registered at your local community.")) ++ ip4addr:depends(device .. "_config", 1) ++ ip4addr.datatype = "ip4addr" ++ function ip4addr.validate(self, value) ++ local x = ip.IPv4(value) ++ if mesh_network:contains(x) then ++ return value ++ else ++ return nil, translate("The given IP address is not inside the mesh network range ") .. ++ "(" .. mesh_network:string() .. ")." ++ end ++ end ++end ++ ++function cbi_ip6addr(device) ++ local ip6addr = n:taboption(device, Value, device .. "_ip6addr", translate("Mesh IPv6 address"), ++ translate("This is a unique IPv6 address in CIDR notation (e.g. 2001:1:2:3::1/64) and has to be registered at your local community.")) ++ ip6addr:depends(device .. "_config", 1) ++ ip6addr.datatype = "ip6addr" ++end ++ ++ ++function cbi_dhcp(device) ++ local dhcp = n:taboption(device, Flag, device .. "_dhcp", translate("Enable DHCP"), ++ translate("DHCP will automatically assign ip addresses to clients")) ++ dhcp:depends(device .. "_config", 1) ++ dhcp.rmempty = true ++end ++ ++function cbi_ra(device) ++ local ra = n:taboption(device, Flag, device .. "_ipv6ra", translate("Enable RA"), ++ translate("Send router advertisements on this device.")) ++ ra:depends(device .. "_config", 1) ++ ra.rmempty = true ++end ++ ++function cbi_dhcprange(device) ++ local dhcprange = n:taboption(device, Value, device .. "_dhcprange", translate("DHCP IP range"), ++ translate("The IP range from which clients are assigned ip addresses (e.g. 10.1.2.1/28). " .. ++ "If this is a range inside your mesh network range, then it will be announced as HNA. Any other range will use NAT. " .. ++ "If left empty then the defaults from the community profile will be used.")) ++ dhcprange:depends(device .. "_dhcp", "1") ++ dhcprange.rmempty = true ++ dhcprange.datatype = "ip4addr" ++end ++-- create tabs and config for wireless ++local nets={} ++uci:foreach("wireless", "wifi-device", function(section) ++ local device = section[".name"] ++ table.insert(nets, device) ++end) ++ ++local wired_nets = {} ++uci:foreach("network", "interface", function(section) ++ local device = section[".name"] ++ if not util.contains(nets, device) and device ~= "loopback" and not device:find("wireless") then ++ table.insert(nets, device) ++ table.insert(wired_nets, device) ++ end ++end) ++ ++for _, net in util.spairs(nets, function(a,b) return (nets[a] < nets[b]) end) do ++ n:tab(net, net) ++end ++ ++-- create cbi config for wireless ++uci:foreach("wireless", "wifi-device", function(section) ++ local device = section[".name"] ++ local hwtype = section.type ++ local syscc = section.country or uci:get(community, "wifi_device", "country") or ++ uci:get("freifunk", "wifi_device", "country") ++ ++ cbi_configure(device) ++ ++ -- Channel selection ++ ++ if hwtype == "atheros" then ++ local cc = util.trim(sys.exec("grep -i '" .. syscc .. "' /lib/wifi/cc_translate.txt |cut -d ' ' -f 2")) or 0 ++ sys.exec('"echo " .. cc .. " > /proc/sys/dev/" .. device .. "/countrycode"') ++ elseif hwtype == "mac80211" then ++ sys.exec("iw reg set " .. syscc) ++ elseif hwtype == "broadcom" then ++ sys.exec ("wlc country " .. syscc) ++ end ++ ++ local chan = n:taboption(device, ListValue, device .. "_channel", translate("Channel"), ++ translate("Your device and neighbouring nodes have to use the same channel.")) ++ chan:depends(device .. "_config", 1) ++ chan:value('default') ++ ++ local iwinfo = sys.wifi.getiwinfo(device) ++ if iwinfo and iwinfo.freqlist then ++ for _, f in ipairs(iwinfo.freqlist) do ++ if not f.restricted then ++ chan:value(f.channel) ++ end ++ end ++ end ++ -- IPv4 address ++ cbi_ip4addr(device) ++ ++ -- DHCP enable ++ cbi_dhcp(device) ++ ++ -- DHCP range ++ cbi_dhcprange(device) ++ ++ -- IPv6 addr and RA ++ if community_ipv6 == "1" then ++ if community_ipv6mode == "static" then ++ cbi_ip6addr(device) ++ end ++ cbi_ra(device) ++ end ++ ++ -- Enable VAP ++ local supports_vap = 0 ++ if sys.call("/usr/bin/meshwizard/helpers/supports_vap.sh " .. device .. " " .. hwtype) == 0 then ++ supports_vap = 1 ++ end ++ if supports_vap == 1 then ++ local vap = n:taboption(device, Flag, device .. "_vap", translate("Virtual Access Point (VAP)"), ++ translate("This will setup a new virtual wireless interface in Access Point mode.")) ++ vap:depends(device .. "_dhcp", "1") ++ vap.rmempty = true ++ if community_vap == "1" then ++ vap.default = "1" ++ end ++ end ++end) ++ ++for _, device in pairs(wired_nets) do ++ cbi_configure(device) ++ cbi_ip4addr(device) ++ cbi_dhcp(device) ++ cbi_dhcprange(device) ++ -- IPv6 addr and RA ++ if community_ipv6 == "1" then ++ if community_ipv6mode == "static" then ++ cbi_ip6addr(device) ++ end ++ cbi_ra(device) ++ end ++end ++ ++-- General settings ++g = m:section(TypedSection, "general", translate("General Settings")) ++g.anonymous = true ++ ++local cleanup = g:option(Flag, "cleanup", translate("Cleanup config"), ++ translate("If this is selected then config is cleaned before setting new config options.")) ++cleanup.default = "1" ++ ++local restrict = g:option(Flag, "local_restrict", translate("Protect LAN"), ++ translate("Check this to protect your LAN from other nodes or clients") .. " (" .. translate("recommended") .. ").") ++ ++local share = g:option(Flag, "sharenet", translate("Share your internet connection"), ++ translate("Select this to allow others to use your connection to access the internet.")) ++ share.rmempty = true ++ ++-- IPv6 config ++if community_ipv6 == "1" then ++ v6 = m:section(NamedSection, "ipv6", nil, translate("IPv6 Settings")) ++ local enabled = v6:option(Flag, "enabled", translate("Enabled"), ++ translate("Activate or deactivate IPv6 config globally.")) ++ enabled.default = meshkit_ipv6 ++ enabled.rmempty = false ++end ++ ++return m +diff --git a/feeds/luci/applications/luci-app-meshwizard/po/ca/meshwizard.po b/feeds/luci/applications/luci-app-meshwizard/po/ca/meshwizard.po +new file mode 100644 +index 0000000..6d7bf93 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-meshwizard/po/ca/meshwizard.po +@@ -0,0 +1,144 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Report-Msgid-Bugs-To: \n" ++"POT-Creation-Date: 2014-06-01 23:43+0200\n" ++"PO-Revision-Date: 2014-07-01 06:11+0200\n" ++"Last-Translator: Alex \n" ++"Language-Team: LANGUAGE \n" ++"Language: ca\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n != 1);\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "Activate or deactivate IPv6 config globally." ++msgstr "Activa o desactiva la configuració IPv6 globalment." ++ ++msgid "Channel" ++msgstr "Canal" ++ ++msgid "Check this to protect your LAN from other nodes or clients" ++msgstr "" ++ ++msgid "Cleanup config" ++msgstr "Neteja la configuració" ++ ++msgid "Configure this interface" ++msgstr "Configura aquesta interfície" ++ ++msgid "DHCP IP range" ++msgstr "Rang IP de DHCP" ++ ++msgid "DHCP will automatically assign ip addresses to clients" ++msgstr "DHCP assignarà automàticament adreces IP als clients" ++ ++msgid "Enable DHCP" ++msgstr "Habilita DHCP" ++ ++msgid "Enable RA" ++msgstr "Habilita RA" ++ ++msgid "Enabled" ++msgstr "Habilitat" ++ ++msgid "General Settings" ++msgstr "Ajusts generals" ++ ++msgid "IPv6 Settings" ++msgstr "Ajusts IPv6" ++ ++msgid "" ++"If this is selected then config is cleaned before setting new config options." ++msgstr "" ++"Si això està seleccionat, la configuració es neteja abans d'establir noves " ++"opcions de configuració." ++ ++msgid "Interfaces" ++msgstr "Interfícies" ++ ++msgid "Mesh IP address" ++msgstr "Adreça IP en malla" ++ ++msgid "Mesh IPv6 address" ++msgstr "Adreça IPv6 en malla" ++ ++msgid "Mesh Wizard" ++msgstr "Ajudant de malla" ++ ++#, fuzzy ++msgid "" ++"Note: this will set up this interface for mesh operation, i.e. add it to " ++"zone 'freifunk' and enable olsr." ++msgstr "" ++"Nota: això configurarà aquesta interfície per a operació en malla, és a dir, " ++"la afegirà a la zona 'freifunk' i habilitarà l'OLSR." ++ ++msgid "Protect LAN" ++msgstr "" ++ ++msgid "" ++"Select this to allow others to use your connection to access the internet." ++msgstr "" ++"Seleccioneu aquesta opció per permetre que altres utilitzin la vostra " ++"connexió per accedir a Internet." ++ ++msgid "Send router advertisements on this device." ++msgstr "Envia publicitats d'encaminador en aquest dispositiu." ++ ++msgid "Share your internet connection" ++msgstr "Comparteix la vostra connexió a Internet" ++ ++msgid "" ++"The IP range from which clients are assigned ip addresses (e.g. " ++"10.1.2.1/28). If this is a range inside your mesh network range, then it " ++"will be announced as HNA. Any other range will use NAT. If left empty then " ++"the defaults from the community profile will be used." ++msgstr "" ++"El rang IP del qual s'assignen adreces IP als clients (per exemple, " ++"10.1.2.1/28). Si aquest és un rang dins del vostre rang de xarxa en malla, " ++"s'anunciarà com HNA. Qualsevol altre rang utilitzarà NAT. Si deixat en " ++"blanc, els valors per defecte del perfil comunitari s'utilitzaran." ++ ++msgid "The given IP address is not inside the mesh network range" ++msgstr "L'adreça IP donada no està dins del rang de la xarxa en malla" ++ ++msgid "" ++"This is a unique IPv6 address in CIDR notation (e.g. 2001:1:2:3::1/64) and " ++"has to be registered at your local community." ++msgstr "" ++"Aquesta és una adreça IPv4 única en notació CIDR (per exemple, " ++"2001:1:2:3::1/64) i ha de ser registrada a la vostra comunitat local." ++ ++msgid "" ++"This is a unique address in the mesh (e.g. 10.1.1.1) and has to be " ++"registered at your local community." ++msgstr "" ++"Aquesta és una adreça única en la malla (per exemple, 10.1.1.1) i ha de ser " ++"registrada a la vostra comunitat local." ++ ++msgid "This will setup a new virtual wireless interface in Access Point mode." ++msgstr "" ++"Això configurarà una nova interfície sense fil virtual en mode de punt " ++"d'accés." ++ ++msgid "" ++"This wizard will assist you in setting up your router for Freifunk or " ++"another similar wireless community network." ++msgstr "" ++"Aquest ajudant us ajudarà a configurar el vostre encaminador per al Freifunk " ++"o altre xarxa comunitària sense fil similar." ++ ++msgid "Virtual Access Point (VAP)" ++msgstr "Punt d'accés virtual (VAP)" ++ ++msgid "Wizard" ++msgstr "Ajudant" ++ ++msgid "Your device and neighbouring nodes have to use the same channel." ++msgstr "" ++"El vostre dispositiu i els nodes veïns han d'utilitzar el mateix canal." ++ ++msgid "recommended" ++msgstr "recomanat" +diff --git a/feeds/luci/applications/luci-app-meshwizard/po/cs/meshwizard.po b/feeds/luci/applications/luci-app-meshwizard/po/cs/meshwizard.po +new file mode 100644 +index 0000000..b1253d0 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-meshwizard/po/cs/meshwizard.po +@@ -0,0 +1,122 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"PO-Revision-Date: 2014-06-21 14:39+0200\n" ++"Last-Translator: koli \n" ++"Language-Team: none\n" ++"Language: cs\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "Activate or deactivate IPv6 config globally." ++msgstr "" ++ ++msgid "Channel" ++msgstr "Kanál" ++ ++msgid "Check this to protect your LAN from other nodes or clients" ++msgstr "" ++ ++msgid "Cleanup config" ++msgstr "" ++ ++msgid "Configure this interface" ++msgstr "Nastavit toto rozhraní" ++ ++msgid "DHCP IP range" ++msgstr "DHCP IP rozsah" ++ ++msgid "DHCP will automatically assign ip addresses to clients" ++msgstr "" ++ ++msgid "Enable DHCP" ++msgstr "Povolit DHCP" ++ ++msgid "Enable RA" ++msgstr "Povolit RA" ++ ++msgid "Enabled" ++msgstr "Povoleno" ++ ++msgid "General Settings" ++msgstr "Obecné nastavení" ++ ++msgid "IPv6 Settings" ++msgstr "Nastavení IPv6" ++ ++msgid "" ++"If this is selected then config is cleaned before setting new config options." ++msgstr "" ++ ++msgid "Interfaces" ++msgstr "Rozhraní" ++ ++msgid "Mesh IP address" ++msgstr "" ++ ++msgid "Mesh IPv6 address" ++msgstr "" ++ ++msgid "Mesh Wizard" ++msgstr "Průvodce mesh" ++ ++msgid "" ++"Note: this will set up this interface for mesh operation, i.e. add it to " ++"zone 'freifunk' and enable olsr." ++msgstr "" ++ ++msgid "Protect LAN" ++msgstr "Ochrana LAN" ++ ++msgid "" ++"Select this to allow others to use your connection to access the internet." ++msgstr "" ++ ++msgid "Send router advertisements on this device." ++msgstr "" ++ ++msgid "Share your internet connection" ++msgstr "Sdílet vaÅ¡e internetové pÅ™ipojení" ++ ++msgid "" ++"The IP range from which clients are assigned ip addresses (e.g. " ++"10.1.2.1/28). If this is a range inside your mesh network range, then it " ++"will be announced as HNA. Any other range will use NAT. If left empty then " ++"the defaults from the community profile will be used." ++msgstr "" ++ ++msgid "The given IP address is not inside the mesh network range" ++msgstr "" ++ ++msgid "" ++"This is a unique IPv6 address in CIDR notation (e.g. 2001:1:2:3::1/64) and " ++"has to be registered at your local community." ++msgstr "" ++ ++msgid "" ++"This is a unique address in the mesh (e.g. 10.1.1.1) and has to be " ++"registered at your local community." ++msgstr "" ++ ++msgid "This will setup a new virtual wireless interface in Access Point mode." ++msgstr "" ++ ++msgid "" ++"This wizard will assist you in setting up your router for Freifunk or " ++"another similar wireless community network." ++msgstr "" ++ ++msgid "Virtual Access Point (VAP)" ++msgstr "Virtuální přístupový bod (VAP)" ++ ++msgid "Wizard" ++msgstr "Průvodce" ++ ++msgid "Your device and neighbouring nodes have to use the same channel." ++msgstr "" ++ ++msgid "recommended" ++msgstr "doporuÄeno" +diff --git a/feeds/luci/applications/luci-app-meshwizard/po/de/meshwizard.po b/feeds/luci/applications/luci-app-meshwizard/po/de/meshwizard.po +new file mode 100644 +index 0000000..ef7ba8a +--- /dev/null ++++ b/feeds/luci/applications/luci-app-meshwizard/po/de/meshwizard.po +@@ -0,0 +1,145 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Report-Msgid-Bugs-To: \n" ++"POT-Creation-Date: 2011-06-26 15:36+0200\n" ++"PO-Revision-Date: 2012-11-21 20:51+0200\n" ++"Last-Translator: Jo-Philipp \n" ++"Language-Team: LANGUAGE \n" ++"Language: de\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n != 1);\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "Activate or deactivate IPv6 config globally." ++msgstr "IPv6 global aktivieren oder deaktivieren" ++ ++msgid "Channel" ++msgstr "Kanal" ++ ++msgid "Check this to protect your LAN from other nodes or clients" ++msgstr "" ++"Aktivieren um Zugriff auf das LAN von anderen Knoten oder Clients zu " ++"verhindern" ++ ++msgid "Cleanup config" ++msgstr "Konfiguration aufräumen" ++ ++msgid "Configure this interface" ++msgstr "Diese Schnittstelle einrichten" ++ ++msgid "DHCP IP range" ++msgstr "DHCP-Adressbereich" ++ ++msgid "DHCP will automatically assign ip addresses to clients" ++msgstr "DHCP vergibt automatisch IP-Adressen an Clients" ++ ++msgid "Enable DHCP" ++msgstr "DHCP aktivieren" ++ ++msgid "Enable RA" ++msgstr "RAs aktivieren" ++ ++msgid "Enabled" ++msgstr "Aktiviert" ++ ++msgid "General Settings" ++msgstr "Allgemeine Einstellungen" ++ ++msgid "IPv6 Settings" ++msgstr "IPv6 Einstellungen" ++ ++msgid "" ++"If this is selected then config is cleaned before setting new config options." ++msgstr "" ++"Wenn diese Option aktiviert wird, werden eventuell vorhandene Einstellungen " ++"aufgeräumt bevor neue Optionen gesetzt werden." ++ ++msgid "Interfaces" ++msgstr "Schnittstellen" ++ ++msgid "Mesh IP address" ++msgstr "Mesh-IP-Adresse" ++ ++msgid "Mesh IPv6 address" ++msgstr "Mesh-IPv6-Adresse" ++ ++msgid "Mesh Wizard" ++msgstr "Mesh-Assistent" ++ ++#, fuzzy ++msgid "" ++"Note: this will set up this interface for mesh operation, i.e. add it to " ++"zone 'freifunk' and enable olsr." ++msgstr "" ++"Hinweis: Dies konfiguriert die Schnittstelle für den Mesh-Betrieb, d.h. sie " ++"wird zur Freifunk-Zone hinzugefügt und OLSR eingerichtet." ++ ++msgid "Protect LAN" ++msgstr "LAN schützen" ++ ++msgid "" ++"Select this to allow others to use your connection to access the internet." ++msgstr "" ++"Diese Option aktivieren um anderen den Zugriff auf die lokale " ++"Internetverbindung zu gestatten" ++ ++msgid "Send router advertisements on this device." ++msgstr "Router-Advertisements auf dieser Schnittstelle senden" ++ ++msgid "Share your internet connection" ++msgstr "Internetverbindung freigeben" ++ ++msgid "" ++"The IP range from which clients are assigned ip addresses (e.g. " ++"10.1.2.1/28). If this is a range inside your mesh network range, then it " ++"will be announced as HNA. Any other range will use NAT. If left empty then " ++"the defaults from the community profile will be used." ++msgstr "" ++"Der Adressbereich, aus welchem den Clients IP-Adressen zugewiesen werden (z." ++"B. 10.1.2.1/28). Liegt dieser Adressbereich außerhalb des Mesh-Bereiches, " ++"dann wird dieser per HNA angekündigt. Leer lassen um den Standardwert aus " ++"dem Community-Profil zu verwenden." ++ ++msgid "The given IP address is not inside the mesh network range" ++msgstr "Die angegebene IP-Adresse ist nicht Teil des Mesh-Adressbereiches" ++ ++msgid "" ++"This is a unique IPv6 address in CIDR notation (e.g. 2001:1:2:3::1/64) and " ++"has to be registered at your local community." ++msgstr "" ++"Diese ist eine eindeutige IPv6-Adresse in CIDR-Notation (z.B. " ++"2001:1:2:3::1/64) welche bei der lokalen Community registriert werden muss." ++ ++msgid "" ++"This is a unique address in the mesh (e.g. 10.1.1.1) and has to be " ++"registered at your local community." ++msgstr "" ++"Dies ist die eindeutige IP-Adresse des Mesh-Knotens (z.B. 10.1.1.1). Diese " ++"muss bei der lokalen Community registriert werden." ++ ++msgid "This will setup a new virtual wireless interface in Access Point mode." ++msgstr "" ++"Dies richtet eine weitere, virtuelle WLAN-Schnittstelle im Access-Point-" ++"Modus ein." ++ ++msgid "" ++"This wizard will assist you in setting up your router for Freifunk or " ++"another similar wireless community network." ++msgstr "" ++"Der Assistent hilft beim Einrichten des Routers für ein Freifunk- oder " ++"ähnliches Wireless-Community-Netzwerk." ++ ++msgid "Virtual Access Point (VAP)" ++msgstr "Virtueller Access-Point (VAP)" ++ ++msgid "Wizard" ++msgstr "Assistent" ++ ++msgid "Your device and neighbouring nodes have to use the same channel." ++msgstr "Dieses Gerät und benachbarte Knoten müssen den selben Kanal verwenden." ++ ++msgid "recommended" ++msgstr "empfohlen" +diff --git a/feeds/luci/applications/luci-app-meshwizard/po/el/meshwizard.po b/feeds/luci/applications/luci-app-meshwizard/po/el/meshwizard.po +new file mode 100644 +index 0000000..1aeff1e +--- /dev/null ++++ b/feeds/luci/applications/luci-app-meshwizard/po/el/meshwizard.po +@@ -0,0 +1,124 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Report-Msgid-Bugs-To: \n" ++"POT-Creation-Date: 2012-03-18 15:14+0200\n" ++"PO-Revision-Date: 2012-03-31 15:40+0200\n" ++"Last-Translator: Vasilis \n" ++"Language-Team: LANGUAGE \n" ++"Language: el\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n != 1);\n" ++"X-Generator: Pootle 2.0.4\n" ++ ++msgid "Activate or deactivate IPv6 config globally." ++msgstr "" ++ ++msgid "Channel" ++msgstr "Κανάλι" ++ ++msgid "Check this to protect your LAN from other nodes or clients" ++msgstr "" ++ ++msgid "Cleanup config" ++msgstr "ΚαθαÏισμός Ïυθμίσεων" ++ ++msgid "Configure this interface" ++msgstr "" ++ ++msgid "DHCP IP range" ++msgstr "" ++ ++msgid "DHCP will automatically assign ip addresses to clients" ++msgstr "" ++ ++msgid "Enable DHCP" ++msgstr "ΕνεÏγοποίηση DHCP" ++ ++msgid "Enable RA" ++msgstr "" ++ ++msgid "Enabled" ++msgstr "" ++ ++msgid "General Settings" ++msgstr "Γενικές Ρυθμίσεις" ++ ++msgid "IPv6 Settings" ++msgstr "" ++ ++msgid "" ++"If this is selected then config is cleaned before setting new config options." ++msgstr "" ++ ++msgid "Interfaces" ++msgstr "Διεπαφές" ++ ++msgid "Mesh IP address" ++msgstr "" ++ ++msgid "Mesh IPv6 address" ++msgstr "" ++ ++msgid "Mesh Wizard" ++msgstr "" ++ ++msgid "" ++"Note: this will set up this interface for mesh operation, i.e. add it to " ++"zone 'freifunk' and enable olsr." ++msgstr "" ++ ++msgid "Protect LAN" ++msgstr "" ++ ++msgid "" ++"Select this to allow others to use your connection to access the internet." ++msgstr "" ++ ++msgid "Send router advertisements on this device." ++msgstr "" ++ ++msgid "Share your internet connection" ++msgstr "" ++ ++msgid "" ++"The IP range from which clients are assigned ip addresses (e.g. " ++"10.1.2.1/28). If this is a range inside your mesh network range, then it " ++"will be announced as HNA. Any other range will use NAT. If left empty then " ++"the defaults from the community profile will be used." ++msgstr "" ++ ++msgid "The given IP address is not inside the mesh network range" ++msgstr "" ++ ++msgid "" ++"This is a unique IPv6 address in CIDR notation (e.g. 2001:1:2:3::1/64) and " ++"has to be registered at your local community." ++msgstr "" ++ ++msgid "" ++"This is a unique address in the mesh (e.g. 10.1.1.1) and has to be " ++"registered at your local community." ++msgstr "" ++ ++msgid "This will setup a new virtual wireless interface in Access Point mode." ++msgstr "" ++ ++msgid "" ++"This wizard will assist you in setting up your router for Freifunk or " ++"another similar wireless community network." ++msgstr "" ++ ++msgid "Virtual Access Point (VAP)" ++msgstr "" ++ ++msgid "Wizard" ++msgstr "" ++ ++msgid "Your device and neighbouring nodes have to use the same channel." ++msgstr "" ++ ++msgid "recommended" ++msgstr "" +diff --git a/feeds/luci/applications/luci-app-meshwizard/po/en/meshwizard.po b/feeds/luci/applications/luci-app-meshwizard/po/en/meshwizard.po +new file mode 100644 +index 0000000..a67c71f +--- /dev/null ++++ b/feeds/luci/applications/luci-app-meshwizard/po/en/meshwizard.po +@@ -0,0 +1,109 @@ ++msgid "Activate or deactivate IPv6 config globally." ++msgstr "" ++ ++msgid "Channel" ++msgstr "" ++ ++msgid "Check this to protect your LAN from other nodes or clients" ++msgstr "" ++ ++msgid "Cleanup config" ++msgstr "" ++ ++msgid "Configure this interface" ++msgstr "" ++ ++msgid "DHCP IP range" ++msgstr "" ++ ++msgid "DHCP will automatically assign ip addresses to clients" ++msgstr "" ++ ++msgid "Enable DHCP" ++msgstr "" ++ ++msgid "Enable RA" ++msgstr "" ++ ++msgid "Enabled" ++msgstr "" ++ ++msgid "General Settings" ++msgstr "" ++ ++msgid "IPv6 Settings" ++msgstr "" ++ ++msgid "" ++"If this is selected then config is cleaned before setting new config options." ++msgstr "" ++ ++msgid "Interfaces" ++msgstr "" ++ ++msgid "Mesh IP address" ++msgstr "" ++ ++msgid "Mesh IPv6 address" ++msgstr "" ++ ++msgid "Mesh Wizard" ++msgstr "" ++ ++msgid "" ++"Note: this will set up this interface for mesh operation, i.e. add it to " ++"zone 'freifunk' and enable olsr." ++msgstr "" ++ ++msgid "Protect LAN" ++msgstr "" ++ ++msgid "" ++"Select this to allow others to use your connection to access the internet." ++msgstr "" ++ ++msgid "Send router advertisements on this device." ++msgstr "" ++ ++msgid "Share your internet connection" ++msgstr "" ++ ++msgid "" ++"The IP range from which clients are assigned ip addresses (e.g. " ++"10.1.2.1/28). If this is a range inside your mesh network range, then it " ++"will be announced as HNA. Any other range will use NAT. If left empty then " ++"the defaults from the community profile will be used." ++msgstr "" ++ ++msgid "The given IP address is not inside the mesh network range" ++msgstr "" ++ ++msgid "" ++"This is a unique IPv6 address in CIDR notation (e.g. 2001:1:2:3::1/64) and " ++"has to be registered at your local community." ++msgstr "" ++ ++msgid "" ++"This is a unique address in the mesh (e.g. 10.1.1.1) and has to be " ++"registered at your local community." ++msgstr "" ++ ++msgid "This will setup a new virtual wireless interface in Access Point mode." ++msgstr "" ++ ++msgid "" ++"This wizard will assist you in setting up your router for Freifunk or " ++"another similar wireless community network." ++msgstr "" ++ ++msgid "Virtual Access Point (VAP)" ++msgstr "" ++ ++msgid "Wizard" ++msgstr "" ++ ++msgid "Your device and neighbouring nodes have to use the same channel." ++msgstr "" ++ ++msgid "recommended" ++msgstr "" +diff --git a/feeds/luci/applications/luci-app-meshwizard/po/es/meshwizard.po b/feeds/luci/applications/luci-app-meshwizard/po/es/meshwizard.po +new file mode 100644 +index 0000000..9471d42 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-meshwizard/po/es/meshwizard.po +@@ -0,0 +1,137 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Report-Msgid-Bugs-To: \n" ++"POT-Creation-Date: 2012-08-23 22:25+0200\n" ++"PO-Revision-Date: 2012-11-24 10:22+0200\n" ++"Last-Translator: José Vicente \n" ++"Language-Team: LANGUAGE \n" ++"Language: es\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n != 1);\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "Activate or deactivate IPv6 config globally." ++msgstr "Activar o desactivar la configuración IPv6 globalmente." ++ ++msgid "Channel" ++msgstr "Canal" ++ ++msgid "Check this to protect your LAN from other nodes or clients" ++msgstr "Proteger la LAN de otros nodos y clientes" ++ ++msgid "Cleanup config" ++msgstr "Borrar configuración" ++ ++msgid "Configure this interface" ++msgstr "Configurar esta interfaz" ++ ++msgid "DHCP IP range" ++msgstr "Rango IP de DHCP" ++ ++msgid "DHCP will automatically assign ip addresses to clients" ++msgstr "DHCP asignará direcciones IP automáticamente a los clientes" ++ ++msgid "Enable DHCP" ++msgstr "Activar DHCP" ++ ++msgid "Enable RA" ++msgstr "Activar RA" ++ ++msgid "Enabled" ++msgstr "Activado" ++ ++msgid "General Settings" ++msgstr "Configuración general" ++ ++msgid "IPv6 Settings" ++msgstr "Configuración IPv6" ++ ++msgid "" ++"If this is selected then config is cleaned before setting new config options." ++msgstr "Borrar la configuración antes de establecer una nueva." ++ ++msgid "Interfaces" ++msgstr "Interfaces" ++ ++msgid "Mesh IP address" ++msgstr "Dirección IP del mesh" ++ ++msgid "Mesh IPv6 address" ++msgstr "Dirección IPv6 del mesh" ++ ++msgid "Mesh Wizard" ++msgstr "Asistente del mesh" ++ ++#, fuzzy ++msgid "" ++"Note: this will set up this interface for mesh operation, i.e. add it to " ++"zone 'freifunk' and enable olsr." ++msgstr "" ++"Nota: esto configurará esta interfaz para uso mesh, es decir: la añadirá a " ++"la zona \"freifunk\" y activará OSLR." ++ ++msgid "Protect LAN" ++msgstr "Proteger LAN" ++ ++msgid "" ++"Select this to allow others to use your connection to access the internet." ++msgstr "Permitir a otros usar su conexión para acceder a internet." ++ ++msgid "Send router advertisements on this device." ++msgstr "Envía publicaciones de routers por este dispositivo." ++ ++msgid "Share your internet connection" ++msgstr "Compartir su conexión a internet" ++ ++msgid "" ++"The IP range from which clients are assigned ip addresses (e.g. " ++"10.1.2.1/28). If this is a range inside your mesh network range, then it " ++"will be announced as HNA. Any other range will use NAT. If left empty then " ++"the defaults from the community profile will be used." ++msgstr "" ++"Rango IP desde el que asignar direcciones IP (ej. 10.1.2.1/28). Si el rango " ++"está dentro del de la mesh se declarará como HNA. Cualquier otro rango usará " ++"NAT. Si se deja vación tomará el del perfil de la comunidad." ++ ++msgid "The given IP address is not inside the mesh network range" ++msgstr "Este rango IP no está dentro del de la red mesh" ++ ++msgid "" ++"This is a unique IPv6 address in CIDR notation (e.g. 2001:1:2:3::1/64) and " ++"has to be registered at your local community." ++msgstr "" ++"Dirección única IPv6 en notación CIDR (p.e.: 2001:1:2:3::1/64) y que tiene " ++"que estar registrada en su comunidad local." ++ ++msgid "" ++"This is a unique address in the mesh (e.g. 10.1.1.1) and has to be " ++"registered at your local community." ++msgstr "" ++"Esta dirección debe ser única en la mesh (ej. 10.1.1.1) y debe registrarse " ++"en su comunidad local." ++ ++msgid "This will setup a new virtual wireless interface in Access Point mode." ++msgstr "" ++"Configurar un nuevo interfaz virtual inalámbrico en modo punto de acceso." ++ ++msgid "" ++"This wizard will assist you in setting up your router for Freifunk or " ++"another similar wireless community network." ++msgstr "" ++"Este asistente le ayudará a configurar su ruter para Freifunk o una red " ++"comunitaria similar." ++ ++msgid "Virtual Access Point (VAP)" ++msgstr "Punto de acceso virtual (VAP)" ++ ++msgid "Wizard" ++msgstr "Asistente" ++ ++msgid "Your device and neighbouring nodes have to use the same channel." ++msgstr "Su dispositivo y los vecinos deben usar el mismo canal." ++ ++msgid "recommended" ++msgstr "recomendado" +diff --git a/feeds/luci/applications/luci-app-meshwizard/po/fr/meshwizard.po b/feeds/luci/applications/luci-app-meshwizard/po/fr/meshwizard.po +new file mode 100644 +index 0000000..c9f7b02 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-meshwizard/po/fr/meshwizard.po +@@ -0,0 +1,139 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Report-Msgid-Bugs-To: \n" ++"POT-Creation-Date: 2011-11-23 22:20+0200\n" ++"PO-Revision-Date: 2011-11-23 22:20+0200\n" ++"Last-Translator: fredb \n" ++"Language-Team: LANGUAGE \n" ++"Language: fr\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n > 1);\n" ++"X-Generator: Pootle 2.0.4\n" ++ ++msgid "Activate or deactivate IPv6 config globally." ++msgstr "" ++ ++msgid "Channel" ++msgstr "Canal" ++ ++msgid "Check this to protect your LAN from other nodes or clients" ++msgstr "Cochez ceci pour protéger votre réseau LAN des autres nÅ“uds ou clients" ++ ++msgid "Cleanup config" ++msgstr "Nettoyer la config" ++ ++msgid "Configure this interface" ++msgstr "Configurer cette interface" ++ ++msgid "DHCP IP range" ++msgstr "Gamme d'adresses IP pour DHCP" ++ ++msgid "DHCP will automatically assign ip addresses to clients" ++msgstr "Le serveur DHCP donnera automatiquement des adresses IP aux clients" ++ ++msgid "Enable DHCP" ++msgstr "Activer le serveur DHCP" ++ ++msgid "Enable RA" ++msgstr "" ++ ++msgid "Enabled" ++msgstr "" ++ ++msgid "General Settings" ++msgstr "Paramètres généraux" ++ ++msgid "IPv6 Settings" ++msgstr "" ++ ++msgid "" ++"If this is selected then config is cleaned before setting new config options." ++msgstr "" ++"Si vous sélectionnez ceci, la configuration sera nettoyée avant de " ++"positionner de nouvelles options de configuration." ++ ++msgid "Interfaces" ++msgstr "Interfaces" ++ ++msgid "Mesh IP address" ++msgstr "Adresse IP maillée" ++ ++msgid "Mesh IPv6 address" ++msgstr "" ++ ++msgid "Mesh Wizard" ++msgstr "Assistant de Maillage" ++ ++msgid "" ++"Note: this will set up this interface for mesh operation, i.e. add it to " ++"zone 'freifunk' and enable olsr." ++msgstr "" ++ ++msgid "Protect LAN" ++msgstr "Protéger le LAN" ++ ++msgid "" ++"Select this to allow others to use your connection to access the internet." ++msgstr "" ++"Sélectionnez ceci pour permettre aux autres d'utiliser votre connexion pour " ++"accéder à Internet." ++ ++msgid "Send router advertisements on this device." ++msgstr "" ++ ++msgid "Share your internet connection" ++msgstr "Partager votre connexion Internet" ++ ++msgid "" ++"The IP range from which clients are assigned ip addresses (e.g. " ++"10.1.2.1/28). If this is a range inside your mesh network range, then it " ++"will be announced as HNA. Any other range will use NAT. If left empty then " ++"the defaults from the community profile will be used." ++msgstr "" ++"La gamme d'adresses IP utilisée pour attribuer des adresses IP aux clients " ++"(par ex. 10.1.2.1/28). Si ce lot d'adresses est compris dans le réseau " ++"maillé, il sera annoncé comme HNA, sinon du NAT sera utilisé. Si ce champ " ++"reste vide, les valeurs par défaut du profil de la communauté seront " ++"utilisées." ++ ++msgid "The given IP address is not inside the mesh network range" ++msgstr "L'adresse IP donnée n'est pas dans le réseau maillé" ++ ++msgid "" ++"This is a unique IPv6 address in CIDR notation (e.g. 2001:1:2:3::1/64) and " ++"has to be registered at your local community." ++msgstr "" ++ ++msgid "" ++"This is a unique address in the mesh (e.g. 10.1.1.1) and has to be " ++"registered at your local community." ++msgstr "" ++"C'est une adresse unique dans le réseau maillé (par ex. 10.1.1.1) et doit " ++"être enregistré dans votre communauté locale." ++ ++msgid "This will setup a new virtual wireless interface in Access Point mode." ++msgstr "" ++"Cela configurera une nouvelle interface sans-fil virtuelle en mode Point " ++"d'Accès." ++ ++msgid "" ++"This wizard will assist you in setting up your router for Freifunk or " ++"another similar wireless community network." ++msgstr "" ++"Cet assistant vous aidera à configurer votre routeur pour le réseau maillé " ++"Freifunk ou un autre réseau sans-fil communautaire du même genre." ++ ++msgid "Virtual Access Point (VAP)" ++msgstr "Point d'accès virtuel (VAP)" ++ ++msgid "Wizard" ++msgstr "Assistant" ++ ++msgid "Your device and neighbouring nodes have to use the same channel." ++msgstr "Votre matériel et les nÅ“uds voisins doivent utiliser le même canal." ++ ++msgid "recommended" ++msgstr "recommandé" +diff --git a/feeds/luci/applications/luci-app-meshwizard/po/he/meshwizard.po b/feeds/luci/applications/luci-app-meshwizard/po/he/meshwizard.po +new file mode 100644 +index 0000000..acf5f10 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-meshwizard/po/he/meshwizard.po +@@ -0,0 +1,119 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Last-Translator: Automatically generated\n" ++"Language-Team: none\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n != 1);\n" ++ ++msgid "Activate or deactivate IPv6 config globally." ++msgstr "" ++ ++msgid "Channel" ++msgstr "" ++ ++msgid "Check this to protect your LAN from other nodes or clients" ++msgstr "" ++ ++msgid "Cleanup config" ++msgstr "" ++ ++msgid "Configure this interface" ++msgstr "" ++ ++msgid "DHCP IP range" ++msgstr "" ++ ++msgid "DHCP will automatically assign ip addresses to clients" ++msgstr "" ++ ++msgid "Enable DHCP" ++msgstr "" ++ ++msgid "Enable RA" ++msgstr "" ++ ++msgid "Enabled" ++msgstr "" ++ ++msgid "General Settings" ++msgstr "" ++ ++msgid "IPv6 Settings" ++msgstr "" ++ ++msgid "" ++"If this is selected then config is cleaned before setting new config options." ++msgstr "" ++ ++msgid "Interfaces" ++msgstr "" ++ ++msgid "Mesh IP address" ++msgstr "" ++ ++msgid "Mesh IPv6 address" ++msgstr "" ++ ++msgid "Mesh Wizard" ++msgstr "" ++ ++msgid "" ++"Note: this will set up this interface for mesh operation, i.e. add it to " ++"zone 'freifunk' and enable olsr." ++msgstr "" ++ ++msgid "Protect LAN" ++msgstr "" ++ ++msgid "" ++"Select this to allow others to use your connection to access the internet." ++msgstr "" ++ ++msgid "Send router advertisements on this device." ++msgstr "" ++ ++msgid "Share your internet connection" ++msgstr "" ++ ++msgid "" ++"The IP range from which clients are assigned ip addresses (e.g. " ++"10.1.2.1/28). If this is a range inside your mesh network range, then it " ++"will be announced as HNA. Any other range will use NAT. If left empty then " ++"the defaults from the community profile will be used." ++msgstr "" ++ ++msgid "The given IP address is not inside the mesh network range" ++msgstr "" ++ ++msgid "" ++"This is a unique IPv6 address in CIDR notation (e.g. 2001:1:2:3::1/64) and " ++"has to be registered at your local community." ++msgstr "" ++ ++msgid "" ++"This is a unique address in the mesh (e.g. 10.1.1.1) and has to be " ++"registered at your local community." ++msgstr "" ++ ++msgid "This will setup a new virtual wireless interface in Access Point mode." ++msgstr "" ++ ++msgid "" ++"This wizard will assist you in setting up your router for Freifunk or " ++"another similar wireless community network." ++msgstr "" ++ ++msgid "Virtual Access Point (VAP)" ++msgstr "" ++ ++msgid "Wizard" ++msgstr "" ++ ++msgid "Your device and neighbouring nodes have to use the same channel." ++msgstr "" ++ ++msgid "recommended" ++msgstr "" +diff --git a/feeds/luci/applications/luci-app-meshwizard/po/hu/meshwizard.po b/feeds/luci/applications/luci-app-meshwizard/po/hu/meshwizard.po +new file mode 100644 +index 0000000..22aecce +--- /dev/null ++++ b/feeds/luci/applications/luci-app-meshwizard/po/hu/meshwizard.po +@@ -0,0 +1,122 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"PO-Revision-Date: 2013-08-09 12:55+0200\n" ++"Last-Translator: Bgray \n" ++"Language-Team: none\n" ++"Language: hu\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n != 1);\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "Activate or deactivate IPv6 config globally." ++msgstr "Globális IPV6 konfiguráció aktiválása vagy kikapcsolása." ++ ++msgid "Channel" ++msgstr "Csatorna" ++ ++msgid "Check this to protect your LAN from other nodes or clients" ++msgstr "" ++ ++msgid "Cleanup config" ++msgstr "" ++ ++msgid "Configure this interface" ++msgstr "" ++ ++msgid "DHCP IP range" ++msgstr "" ++ ++msgid "DHCP will automatically assign ip addresses to clients" ++msgstr "" ++ ++msgid "Enable DHCP" ++msgstr "DHCP Engedélyezése" ++ ++msgid "Enable RA" ++msgstr "RA Engedélyezése" ++ ++msgid "Enabled" ++msgstr "Engedélyezés" ++ ++msgid "General Settings" ++msgstr "Ãltalános Beállítások" ++ ++msgid "IPv6 Settings" ++msgstr "" ++ ++msgid "" ++"If this is selected then config is cleaned before setting new config options." ++msgstr "" ++ ++msgid "Interfaces" ++msgstr "Interfészek" ++ ++msgid "Mesh IP address" ++msgstr "" ++ ++msgid "Mesh IPv6 address" ++msgstr "" ++ ++msgid "Mesh Wizard" ++msgstr "" ++ ++msgid "" ++"Note: this will set up this interface for mesh operation, i.e. add it to " ++"zone 'freifunk' and enable olsr." ++msgstr "" ++ ++msgid "Protect LAN" ++msgstr "" ++ ++msgid "" ++"Select this to allow others to use your connection to access the internet." ++msgstr "" ++ ++msgid "Send router advertisements on this device." ++msgstr "" ++ ++msgid "Share your internet connection" ++msgstr "" ++ ++msgid "" ++"The IP range from which clients are assigned ip addresses (e.g. " ++"10.1.2.1/28). If this is a range inside your mesh network range, then it " ++"will be announced as HNA. Any other range will use NAT. If left empty then " ++"the defaults from the community profile will be used." ++msgstr "" ++ ++msgid "The given IP address is not inside the mesh network range" ++msgstr "" ++ ++msgid "" ++"This is a unique IPv6 address in CIDR notation (e.g. 2001:1:2:3::1/64) and " ++"has to be registered at your local community." ++msgstr "" ++ ++msgid "" ++"This is a unique address in the mesh (e.g. 10.1.1.1) and has to be " ++"registered at your local community." ++msgstr "" ++ ++msgid "This will setup a new virtual wireless interface in Access Point mode." ++msgstr "" ++ ++msgid "" ++"This wizard will assist you in setting up your router for Freifunk or " ++"another similar wireless community network." ++msgstr "" ++ ++msgid "Virtual Access Point (VAP)" ++msgstr "" ++ ++msgid "Wizard" ++msgstr "" ++ ++msgid "Your device and neighbouring nodes have to use the same channel." ++msgstr "" ++ ++msgid "recommended" ++msgstr "" +diff --git a/feeds/luci/applications/luci-app-meshwizard/po/it/meshwizard.po b/feeds/luci/applications/luci-app-meshwizard/po/it/meshwizard.po +new file mode 100644 +index 0000000..b1b9799 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-meshwizard/po/it/meshwizard.po +@@ -0,0 +1,143 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Report-Msgid-Bugs-To: \n" ++"POT-Creation-Date: 2012-02-06 18:07+0200\n" ++"PO-Revision-Date: 2013-02-09 20:46+0200\n" ++"Last-Translator: Francesco <3gasas@gmail.com>\n" ++"Language-Team: LANGUAGE \n" ++"Language: it\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n != 1);\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "Activate or deactivate IPv6 config globally." ++msgstr "Attivare o disattivare la configurazione IPv6 a livello globale." ++ ++msgid "Channel" ++msgstr "Canale" ++ ++msgid "Check this to protect your LAN from other nodes or clients" ++msgstr "Abilita per proteggere la tua LAN da altri nodi o clienti" ++ ++msgid "Cleanup config" ++msgstr "Ripulisci config" ++ ++msgid "Configure this interface" ++msgstr "Configura questa interfaccia" ++ ++msgid "DHCP IP range" ++msgstr "Range DHCP IP" ++ ++msgid "DHCP will automatically assign ip addresses to clients" ++msgstr "DHCP assegnerà indirizzi ip ai client" ++ ++msgid "Enable DHCP" ++msgstr "Abilità DHCP" ++ ++msgid "Enable RA" ++msgstr "Attiva RA" ++ ++msgid "Enabled" ++msgstr "Attivato" ++ ++msgid "General Settings" ++msgstr "Impostazioni generali" ++ ++msgid "IPv6 Settings" ++msgstr "Impostazioni IPv6" ++ ++msgid "" ++"If this is selected then config is cleaned before setting new config options." ++msgstr "" ++"Se questa opzione è selezionata, config viene pulita prima di nuove opzioni " ++"di configurazione." ++ ++msgid "Interfaces" ++msgstr "Interfacce" ++ ++msgid "Mesh IP address" ++msgstr "Rete indirizzo IP" ++ ++msgid "Mesh IPv6 address" ++msgstr "Rete indirizzo IPv6" ++ ++msgid "Mesh Wizard" ++msgstr "Configurazione Rete" ++ ++#, fuzzy ++msgid "" ++"Note: this will set up this interface for mesh operation, i.e. add it to " ++"zone 'freifunk' and enable olsr." ++msgstr "" ++"Nota: questo permette di configurare questa interfaccia per il funzionamento " ++"in rete, vale a dire aggiungere nella zona 'Freifunk' e consentire OLSR." ++ ++msgid "Protect LAN" ++msgstr "Proteggi LAN" ++ ++msgid "" ++"Select this to allow others to use your connection to access the internet." ++msgstr "" ++"Selezionare per permettere ad altri di usare la tua connessione per accedere " ++"a internet." ++ ++msgid "Send router advertisements on this device." ++msgstr "Inviare annunci router su questo dispositivo." ++ ++msgid "Share your internet connection" ++msgstr "Condividi la tua connessione internet" ++ ++msgid "" ++"The IP range from which clients are assigned ip addresses (e.g. " ++"10.1.2.1/28). If this is a range inside your mesh network range, then it " ++"will be announced as HNA. Any other range will use NAT. If left empty then " ++"the defaults from the community profile will be used." ++msgstr "" ++"Il range IP dal quale i client ricevono gli indirizzi (es. 10.1.2.1/28). Se " ++"questa subnet è all'interno della tua rete mesh, sarà annunciata as HNA. " ++"Ogni altro range userà il NAT. Se lasciato vuoto allora la scelta " ++"predefinita della community sarà usata." ++ ++msgid "The given IP address is not inside the mesh network range" ++msgstr "L'IP dato non è all'interno del range degli indirizzi di rete mesh" ++ ++msgid "" ++"This is a unique IPv6 address in CIDR notation (e.g. 2001:1:2:3::1/64) and " ++"has to be registered at your local community." ++msgstr "" ++"Si tratta di un indirizzo IPv6 unico in notazione CIDR (ad esempio " ++"2001:1:2:3::1/64) e deve essere registrato presso la comunità locale." ++ ++msgid "" ++"This is a unique address in the mesh (e.g. 10.1.1.1) and has to be " ++"registered at your local community." ++msgstr "" ++"Questo è un indirizzo univoco nella mesh (es. 10.1.1.1) e deve essere " ++"accordato con la tua community." ++ ++msgid "This will setup a new virtual wireless interface in Access Point mode." ++msgstr "" ++"Questo confgurerà una nuova interfaccia wireless virtuale in modalità Access " ++"Point." ++ ++msgid "" ++"This wizard will assist you in setting up your router for Freifunk or " ++"another similar wireless community network." ++msgstr "" ++"Questo wizard ti assisterà nel setup del tuo router per l'uso in una rete " ++"wireless comunitaria come Freifunk o Ninux." ++ ++msgid "Virtual Access Point (VAP)" ++msgstr "Punto di Accesso Virtuale (VAP)" ++ ++msgid "Wizard" ++msgstr "Creazione guidata" ++ ++msgid "Your device and neighbouring nodes have to use the same channel." ++msgstr "Il tuo device a i nodi confinanti devono sare lo stesso canale." ++ ++msgid "recommended" ++msgstr "raccomandato" +diff --git a/feeds/luci/applications/luci-app-meshwizard/po/ja/meshwizard.po b/feeds/luci/applications/luci-app-meshwizard/po/ja/meshwizard.po +new file mode 100644 +index 0000000..a67c71f +--- /dev/null ++++ b/feeds/luci/applications/luci-app-meshwizard/po/ja/meshwizard.po +@@ -0,0 +1,109 @@ ++msgid "Activate or deactivate IPv6 config globally." ++msgstr "" ++ ++msgid "Channel" ++msgstr "" ++ ++msgid "Check this to protect your LAN from other nodes or clients" ++msgstr "" ++ ++msgid "Cleanup config" ++msgstr "" ++ ++msgid "Configure this interface" ++msgstr "" ++ ++msgid "DHCP IP range" ++msgstr "" ++ ++msgid "DHCP will automatically assign ip addresses to clients" ++msgstr "" ++ ++msgid "Enable DHCP" ++msgstr "" ++ ++msgid "Enable RA" ++msgstr "" ++ ++msgid "Enabled" ++msgstr "" ++ ++msgid "General Settings" ++msgstr "" ++ ++msgid "IPv6 Settings" ++msgstr "" ++ ++msgid "" ++"If this is selected then config is cleaned before setting new config options." ++msgstr "" ++ ++msgid "Interfaces" ++msgstr "" ++ ++msgid "Mesh IP address" ++msgstr "" ++ ++msgid "Mesh IPv6 address" ++msgstr "" ++ ++msgid "Mesh Wizard" ++msgstr "" ++ ++msgid "" ++"Note: this will set up this interface for mesh operation, i.e. add it to " ++"zone 'freifunk' and enable olsr." ++msgstr "" ++ ++msgid "Protect LAN" ++msgstr "" ++ ++msgid "" ++"Select this to allow others to use your connection to access the internet." ++msgstr "" ++ ++msgid "Send router advertisements on this device." ++msgstr "" ++ ++msgid "Share your internet connection" ++msgstr "" ++ ++msgid "" ++"The IP range from which clients are assigned ip addresses (e.g. " ++"10.1.2.1/28). If this is a range inside your mesh network range, then it " ++"will be announced as HNA. Any other range will use NAT. If left empty then " ++"the defaults from the community profile will be used." ++msgstr "" ++ ++msgid "The given IP address is not inside the mesh network range" ++msgstr "" ++ ++msgid "" ++"This is a unique IPv6 address in CIDR notation (e.g. 2001:1:2:3::1/64) and " ++"has to be registered at your local community." ++msgstr "" ++ ++msgid "" ++"This is a unique address in the mesh (e.g. 10.1.1.1) and has to be " ++"registered at your local community." ++msgstr "" ++ ++msgid "This will setup a new virtual wireless interface in Access Point mode." ++msgstr "" ++ ++msgid "" ++"This wizard will assist you in setting up your router for Freifunk or " ++"another similar wireless community network." ++msgstr "" ++ ++msgid "Virtual Access Point (VAP)" ++msgstr "" ++ ++msgid "Wizard" ++msgstr "" ++ ++msgid "Your device and neighbouring nodes have to use the same channel." ++msgstr "" ++ ++msgid "recommended" ++msgstr "" +diff --git a/feeds/luci/applications/luci-app-meshwizard/po/ms/meshwizard.po b/feeds/luci/applications/luci-app-meshwizard/po/ms/meshwizard.po +new file mode 100644 +index 0000000..a67c71f +--- /dev/null ++++ b/feeds/luci/applications/luci-app-meshwizard/po/ms/meshwizard.po +@@ -0,0 +1,109 @@ ++msgid "Activate or deactivate IPv6 config globally." ++msgstr "" ++ ++msgid "Channel" ++msgstr "" ++ ++msgid "Check this to protect your LAN from other nodes or clients" ++msgstr "" ++ ++msgid "Cleanup config" ++msgstr "" ++ ++msgid "Configure this interface" ++msgstr "" ++ ++msgid "DHCP IP range" ++msgstr "" ++ ++msgid "DHCP will automatically assign ip addresses to clients" ++msgstr "" ++ ++msgid "Enable DHCP" ++msgstr "" ++ ++msgid "Enable RA" ++msgstr "" ++ ++msgid "Enabled" ++msgstr "" ++ ++msgid "General Settings" ++msgstr "" ++ ++msgid "IPv6 Settings" ++msgstr "" ++ ++msgid "" ++"If this is selected then config is cleaned before setting new config options." ++msgstr "" ++ ++msgid "Interfaces" ++msgstr "" ++ ++msgid "Mesh IP address" ++msgstr "" ++ ++msgid "Mesh IPv6 address" ++msgstr "" ++ ++msgid "Mesh Wizard" ++msgstr "" ++ ++msgid "" ++"Note: this will set up this interface for mesh operation, i.e. add it to " ++"zone 'freifunk' and enable olsr." ++msgstr "" ++ ++msgid "Protect LAN" ++msgstr "" ++ ++msgid "" ++"Select this to allow others to use your connection to access the internet." ++msgstr "" ++ ++msgid "Send router advertisements on this device." ++msgstr "" ++ ++msgid "Share your internet connection" ++msgstr "" ++ ++msgid "" ++"The IP range from which clients are assigned ip addresses (e.g. " ++"10.1.2.1/28). If this is a range inside your mesh network range, then it " ++"will be announced as HNA. Any other range will use NAT. If left empty then " ++"the defaults from the community profile will be used." ++msgstr "" ++ ++msgid "The given IP address is not inside the mesh network range" ++msgstr "" ++ ++msgid "" ++"This is a unique IPv6 address in CIDR notation (e.g. 2001:1:2:3::1/64) and " ++"has to be registered at your local community." ++msgstr "" ++ ++msgid "" ++"This is a unique address in the mesh (e.g. 10.1.1.1) and has to be " ++"registered at your local community." ++msgstr "" ++ ++msgid "This will setup a new virtual wireless interface in Access Point mode." ++msgstr "" ++ ++msgid "" ++"This wizard will assist you in setting up your router for Freifunk or " ++"another similar wireless community network." ++msgstr "" ++ ++msgid "Virtual Access Point (VAP)" ++msgstr "" ++ ++msgid "Wizard" ++msgstr "" ++ ++msgid "Your device and neighbouring nodes have to use the same channel." ++msgstr "" ++ ++msgid "recommended" ++msgstr "" +diff --git a/feeds/luci/applications/luci-app-meshwizard/po/no/meshwizard.po b/feeds/luci/applications/luci-app-meshwizard/po/no/meshwizard.po +new file mode 100644 +index 0000000..a67c71f +--- /dev/null ++++ b/feeds/luci/applications/luci-app-meshwizard/po/no/meshwizard.po +@@ -0,0 +1,109 @@ ++msgid "Activate or deactivate IPv6 config globally." ++msgstr "" ++ ++msgid "Channel" ++msgstr "" ++ ++msgid "Check this to protect your LAN from other nodes or clients" ++msgstr "" ++ ++msgid "Cleanup config" ++msgstr "" ++ ++msgid "Configure this interface" ++msgstr "" ++ ++msgid "DHCP IP range" ++msgstr "" ++ ++msgid "DHCP will automatically assign ip addresses to clients" ++msgstr "" ++ ++msgid "Enable DHCP" ++msgstr "" ++ ++msgid "Enable RA" ++msgstr "" ++ ++msgid "Enabled" ++msgstr "" ++ ++msgid "General Settings" ++msgstr "" ++ ++msgid "IPv6 Settings" ++msgstr "" ++ ++msgid "" ++"If this is selected then config is cleaned before setting new config options." ++msgstr "" ++ ++msgid "Interfaces" ++msgstr "" ++ ++msgid "Mesh IP address" ++msgstr "" ++ ++msgid "Mesh IPv6 address" ++msgstr "" ++ ++msgid "Mesh Wizard" ++msgstr "" ++ ++msgid "" ++"Note: this will set up this interface for mesh operation, i.e. add it to " ++"zone 'freifunk' and enable olsr." ++msgstr "" ++ ++msgid "Protect LAN" ++msgstr "" ++ ++msgid "" ++"Select this to allow others to use your connection to access the internet." ++msgstr "" ++ ++msgid "Send router advertisements on this device." ++msgstr "" ++ ++msgid "Share your internet connection" ++msgstr "" ++ ++msgid "" ++"The IP range from which clients are assigned ip addresses (e.g. " ++"10.1.2.1/28). If this is a range inside your mesh network range, then it " ++"will be announced as HNA. Any other range will use NAT. If left empty then " ++"the defaults from the community profile will be used." ++msgstr "" ++ ++msgid "The given IP address is not inside the mesh network range" ++msgstr "" ++ ++msgid "" ++"This is a unique IPv6 address in CIDR notation (e.g. 2001:1:2:3::1/64) and " ++"has to be registered at your local community." ++msgstr "" ++ ++msgid "" ++"This is a unique address in the mesh (e.g. 10.1.1.1) and has to be " ++"registered at your local community." ++msgstr "" ++ ++msgid "This will setup a new virtual wireless interface in Access Point mode." ++msgstr "" ++ ++msgid "" ++"This wizard will assist you in setting up your router for Freifunk or " ++"another similar wireless community network." ++msgstr "" ++ ++msgid "Virtual Access Point (VAP)" ++msgstr "" ++ ++msgid "Wizard" ++msgstr "" ++ ++msgid "Your device and neighbouring nodes have to use the same channel." ++msgstr "" ++ ++msgid "recommended" ++msgstr "" +diff --git a/feeds/luci/applications/luci-app-meshwizard/po/pl/meshwizard.po b/feeds/luci/applications/luci-app-meshwizard/po/pl/meshwizard.po +new file mode 100644 +index 0000000..79409aa +--- /dev/null ++++ b/feeds/luci/applications/luci-app-meshwizard/po/pl/meshwizard.po +@@ -0,0 +1,147 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Report-Msgid-Bugs-To: \n" ++"POT-Creation-Date: 2012-04-19 21:15+0200\n" ++"PO-Revision-Date: 2014-04-23 19:18+0200\n" ++"Last-Translator: goodgod261 \n" ++"Language-Team: LANGUAGE \n" ++"Language: pl\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 " ++"|| n%100>=20) ? 1 : 2);\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "Activate or deactivate IPv6 config globally." ++msgstr "Aktywuj lub dezaktywuj ipv6 konfiguracja globalna" ++ ++msgid "Channel" ++msgstr "KanaÅ‚" ++ ++msgid "Check this to protect your LAN from other nodes or clients" ++msgstr "" ++"Zaznacz, aby zabezpieczyć sieć lokalnÄ… przed innymi wÄ™zÅ‚ami lub klientami " ++"sieci" ++ ++msgid "Cleanup config" ++msgstr "Wyczyść konfiguracjÄ™" ++ ++msgid "Configure this interface" ++msgstr "Skonfiguruj ten interfejs" ++ ++msgid "DHCP IP range" ++msgstr "Pula adresów DHCP" ++ ++msgid "DHCP will automatically assign ip addresses to clients" ++msgstr "DHCP automatycznie przypisze adresy IP klientom" ++ ++msgid "Enable DHCP" ++msgstr "WÅ‚Ä…cz DHCP" ++ ++msgid "Enable RA" ++msgstr "WÅ‚Ä…cz RA" ++ ++msgid "Enabled" ++msgstr "WÅ‚Ä…czone" ++ ++msgid "General Settings" ++msgstr "Ustawienia ogólne" ++ ++msgid "IPv6 Settings" ++msgstr "IPv6 Ustawienia" ++ ++msgid "" ++"If this is selected then config is cleaned before setting new config options." ++msgstr "" ++"JeÅ›li ta opcja jest zaznaczona to stara konfiguracja jest usuwana przed " ++"zapisaniem nowych opcji." ++ ++msgid "Interfaces" ++msgstr "Interfejsy" ++ ++msgid "Mesh IP address" ++msgstr "Adres Mesh IP" ++ ++msgid "Mesh IPv6 address" ++msgstr "Adres Mech IPv6" ++ ++msgid "Mesh Wizard" ++msgstr "Kreator Mesh" ++ ++#, fuzzy ++msgid "" ++"Note: this will set up this interface for mesh operation, i.e. add it to " ++"zone 'freifunk' and enable olsr." ++msgstr "" ++"Nota: To sÄ… ustawienia interfejsu mesh operacja i.e Dodawanie Strefy " ++"'Freifunk' oraz wÅ‚Ä…czyć olsr" ++ ++msgid "Protect LAN" ++msgstr "ChroÅ„ LAN" ++ ++msgid "" ++"Select this to allow others to use your connection to access the internet." ++msgstr "" ++"Zaznacz tÄ™ opcjÄ™ aby inni użytkownicy mogli używać twojego poÅ‚Ä…czenia do " ++"korzystania z internetu" ++ ++msgid "Send router advertisements on this device." ++msgstr "WyÅ›lij Routera ReklamÄ™ na urzÄ…dzenie" ++ ++msgid "Share your internet connection" ++msgstr "Współdziel swoje poÅ‚Ä…czenie internetowe" ++ ++msgid "" ++"The IP range from which clients are assigned ip addresses (e.g. " ++"10.1.2.1/28). If this is a range inside your mesh network range, then it " ++"will be announced as HNA. Any other range will use NAT. If left empty then " ++"the defaults from the community profile will be used." ++msgstr "" ++"Zakres adresów IP, z którego klientom sÄ… przypisywane adresy IP (np. " ++"10.1.2.1/28). Jeżeli jest to zakres wewnÄ…trz twojej sieci mesh, wówczas " ++"zostanie rozgÅ‚oszony jako HNA. Każdy inny zakres bÄ™dzie używać NAT. Jeżeli " ++"pozostanie pusty, wówczas zostanie użyty domyÅ›lny profil spoÅ‚ecznoÅ›ci." ++ ++msgid "The given IP address is not inside the mesh network range" ++msgstr "Podany adres IP nie należy do zakresu sieci mesh" ++ ++msgid "" ++"This is a unique IPv6 address in CIDR notation (e.g. 2001:1:2:3::1/64) and " ++"has to be registered at your local community." ++msgstr "" ++"To jest unikalny adres IPv6 w notacji CIDR (np. 2001:1:2:3:1/64) i musi zostać zarejestrowany w " ++"Twojej lokalnej spoÅ‚ecznoÅ›ci" ++ ++msgid "" ++"This is a unique address in the mesh (e.g. 10.1.1.1) and has to be " ++"registered at your local community." ++msgstr "" ++"Jest to unikalny adres w sieci mesh (np. 10.1.1.1) i musi być zarejestrowana " ++"w lokalnej spoÅ‚ecznoÅ›ci." ++ ++msgid "This will setup a new virtual wireless interface in Access Point mode." ++msgstr "" ++"Ta opcja skonfiguruje nowy wirtualny interfejs bezprzewodowy w trybie Access " ++"Point`a" ++ ++msgid "" ++"This wizard will assist you in setting up your router for Freifunk or " ++"another similar wireless community network." ++msgstr "" ++"Ten kreator pomoże skonfigurować router do korzystania z Freifunk lub " ++"podobnej spoÅ‚ecznej sieci bezprzewodowej (darmowe WiFi)" ++ ++msgid "Virtual Access Point (VAP)" ++msgstr "Access Point Wirtualny (VAP)" ++ ++msgid "Wizard" ++msgstr "Kreator" ++ ++msgid "Your device and neighbouring nodes have to use the same channel." ++msgstr "Twój router i sÄ…siedzkie wÄ™zÅ‚y sieci używajÄ… tego samego kanaÅ‚u." ++ ++msgid "recommended" ++msgstr "zalecane" +diff --git a/feeds/luci/applications/luci-app-meshwizard/po/pt-br/meshwizard.po b/feeds/luci/applications/luci-app-meshwizard/po/pt-br/meshwizard.po +new file mode 100644 +index 0000000..a2238e5 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-meshwizard/po/pt-br/meshwizard.po +@@ -0,0 +1,150 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Report-Msgid-Bugs-To: \n" ++"POT-Creation-Date: 2011-10-11 00:23+0200\n" ++"PO-Revision-Date: 2014-03-17 10:01+0200\n" ++"Last-Translator: Luiz Angelo \n" ++"Language-Team: LANGUAGE \n" ++"Language: pt_BR\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n > 1);\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "Activate or deactivate IPv6 config globally." ++msgstr "Habilita e desabilita a configuração IPv6 globalmente." ++ ++msgid "Channel" ++msgstr "Canal" ++ ++msgid "Check this to protect your LAN from other nodes or clients" ++msgstr "" ++"Marque isto para proteger sua rede local (LAN) de outros nós ou clientes" ++ ++msgid "Cleanup config" ++msgstr "Limpar configuração" ++ ++msgid "Configure this interface" ++msgstr "Configure esta interface" ++ ++msgid "DHCP IP range" ++msgstr "Faixa de IP do DHCP" ++ ++msgid "DHCP will automatically assign ip addresses to clients" ++msgstr "O DHCP irá atribuir automaticamente endereços IP para os clientes" ++ ++msgid "Enable DHCP" ++msgstr "Habilitar DHCP" ++ ++msgid "Enable RA" ++msgstr "" ++"Habilitar RA" ++ ++msgid "Enabled" ++msgstr "Habilitado" ++ ++msgid "General Settings" ++msgstr "Configurações Gerais" ++ ++msgid "IPv6 Settings" ++msgstr "Configurações IPv6" ++ ++msgid "" ++"If this is selected then config is cleaned before setting new config options." ++msgstr "" ++"Se selecionado, a configuração é limpa antes de definir as novas opções de " ++"configuração." ++ ++msgid "Interfaces" ++msgstr "Interfaces" ++ ++msgid "Mesh IP address" ++msgstr "Endereço IP da rede em malha" ++ ++msgid "Mesh IPv6 address" ++msgstr "Endereço IPv6 da rede em malha" ++ ++msgid "Mesh Wizard" ++msgstr "Assistente de Configuração da Rede em Malha" ++ ++#, fuzzy ++msgid "" ++"Note: this will set up this interface for mesh operation, i.e. add it to " ++"zone 'freifunk' and enable olsr." ++msgstr "" ++"Nota: Isto irá configurar a interface para operação em malha, p. ex. " ++"adicionar à zona 'freifunk' e ativar o OLSR. " ++ ++msgid "Protect LAN" ++msgstr "Proteget Rede Local (LAN)" ++ ++msgid "" ++"Select this to allow others to use your connection to access the internet." ++msgstr "" ++"Selecione isto para permitir que outros usem sua conexão para acessar a " ++"internet." ++ ++msgid "Send router advertisements on this device." ++msgstr "" ++"Envia RA a partir deste dispositivo." ++ ++msgid "Share your internet connection" ++msgstr "Compartilhar sua conexão com a internet" ++ ++msgid "" ++"The IP range from which clients are assigned ip addresses (e.g. " ++"10.1.2.1/28). If this is a range inside your mesh network range, then it " ++"will be announced as HNA. Any other range will use NAT. If left empty then " ++"the defaults from the community profile will be used." ++msgstr "" ++"Faixa de endereços IP atribuídos aos clientes (ex: 10.1.2.1/28). Se esta " ++"faixa está dentro da faixa da rede em malha, então ela será anunciada no " ++"HNA. Qualquer outra faixa irá utilizar NAT. Se deixada vazia, " ++"os padrões do perfil da comunidade será usada." ++ ++msgid "The given IP address is not inside the mesh network range" ++msgstr "" ++"O endereço IP informado não está na faixa de endereços da rede em malha" ++ ++msgid "" ++"This is a unique IPv6 address in CIDR notation (e.g. 2001:1:2:3::1/64) and " ++"has to be registered at your local community." ++msgstr "" ++"Este é um endereço IPv6 único na notação CIDR (ex: 2001:1:2:3::1/64) e deve " ++"ser registrado na sua comunidade local." ++ ++msgid "" ++"This is a unique address in the mesh (e.g. 10.1.1.1) and has to be " ++"registered at your local community." ++msgstr "" ++"Este é um endereço único na rede em malha (ex: 10.1.1.1) e tem que ser " ++"registrado na sua comunidade local." ++ ++msgid "This will setup a new virtual wireless interface in Access Point mode." ++msgstr "" ++"Isto configurará uma nova interface de rede sem fio virtual em modo de ponto " ++"de acesso." ++ ++msgid "" ++"This wizard will assist you in setting up your router for Freifunk or " ++"another similar wireless community network." ++msgstr "" ++"Este assistente irá ajudá-lo na configuração do seu roteador para Freifunk " ++"ou outra rede comunitária sem fio similar." ++ ++msgid "Virtual Access Point (VAP)" ++msgstr "Ponto de Acesso Virtual (VAP)" ++ ++msgid "Wizard" ++msgstr "Assistente" ++ ++msgid "Your device and neighbouring nodes have to use the same channel." ++msgstr "Seu dispositivo e os nós vizinhos devem utilizar o mesmo canal." ++ ++msgid "recommended" ++msgstr "recomendado" +diff --git a/feeds/luci/applications/luci-app-meshwizard/po/pt/meshwizard.po b/feeds/luci/applications/luci-app-meshwizard/po/pt/meshwizard.po +new file mode 100644 +index 0000000..4195769 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-meshwizard/po/pt/meshwizard.po +@@ -0,0 +1,133 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Report-Msgid-Bugs-To: \n" ++"POT-Creation-Date: 2013-06-03 16:20+0200\n" ++"PO-Revision-Date: 2013-06-03 18:01+0200\n" ++"Last-Translator: joao.f.vieira \n" ++"Language-Team: LANGUAGE \n" ++"Language: pt\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n != 1);\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "Activate or deactivate IPv6 config globally." ++msgstr "Ativar ou desativar a configuração IPv6 globalmente." ++ ++msgid "Channel" ++msgstr "Canal" ++ ++msgid "Check this to protect your LAN from other nodes or clients" ++msgstr "Marcar isto para proteger a sua LAN de outros nós ou clientes" ++ ++msgid "Cleanup config" ++msgstr "Limpar configuração" ++ ++msgid "Configure this interface" ++msgstr "Configurar esta interface" ++ ++msgid "DHCP IP range" ++msgstr "Intervalo de IPs DHCP" ++ ++msgid "DHCP will automatically assign ip addresses to clients" ++msgstr "O DHCP irá atribuir automaticamente endereços IP aos clientes" ++ ++msgid "Enable DHCP" ++msgstr "Ativar DHCP" ++ ++msgid "Enable RA" ++msgstr "Ativar RA" ++ ++msgid "Enabled" ++msgstr "Ativo" ++ ++msgid "General Settings" ++msgstr "Definições Gerais" ++ ++msgid "IPv6 Settings" ++msgstr "Definições IPv6" ++ ++msgid "" ++"If this is selected then config is cleaned before setting new config options." ++msgstr "" ++"Se isto estiver selecionado a configuração é limpa antes de serem definidas " ++"novas opções na configuração." ++ ++msgid "Interfaces" ++msgstr "Interfaces" ++ ++msgid "Mesh IP address" ++msgstr "" ++ ++msgid "Mesh IPv6 address" ++msgstr "" ++ ++msgid "Mesh Wizard" ++msgstr "" ++ ++#, fuzzy ++msgid "" ++"Note: this will set up this interface for mesh operation, i.e. add it to " ++"zone 'freifunk' and enable olsr." ++msgstr "" ++"Nota: Isto irá configurar a interface para operação em malha, p. ex. " ++"adicionar à zona 'freifunk' e ativar OLSR." ++ ++msgid "Protect LAN" ++msgstr "Proteger LAN" ++ ++msgid "" ++"Select this to allow others to use your connection to access the internet." ++msgstr "" ++"Ative isto para permitir que outros usem a sua ligação para aceder à " ++"internet." ++ ++msgid "Send router advertisements on this device." ++msgstr "" ++ ++msgid "Share your internet connection" ++msgstr "" ++ ++msgid "" ++"The IP range from which clients are assigned ip addresses (e.g. " ++"10.1.2.1/28). If this is a range inside your mesh network range, then it " ++"will be announced as HNA. Any other range will use NAT. If left empty then " ++"the defaults from the community profile will be used." ++msgstr "" ++ ++msgid "The given IP address is not inside the mesh network range" ++msgstr "" ++ ++msgid "" ++"This is a unique IPv6 address in CIDR notation (e.g. 2001:1:2:3::1/64) and " ++"has to be registered at your local community." ++msgstr "" ++ ++msgid "" ++"This is a unique address in the mesh (e.g. 10.1.1.1) and has to be " ++"registered at your local community." ++msgstr "" ++ ++msgid "This will setup a new virtual wireless interface in Access Point mode." ++msgstr "" ++"Irá ser configurado uma nova interface virtual wireless em modo de Ponto de " ++"Acesso." ++ ++msgid "" ++"This wizard will assist you in setting up your router for Freifunk or " ++"another similar wireless community network." ++msgstr "" ++ ++msgid "Virtual Access Point (VAP)" ++msgstr "Ponto de Acesso Virtual (VAP)" ++ ++msgid "Wizard" ++msgstr "Assistente" ++ ++msgid "Your device and neighbouring nodes have to use the same channel." ++msgstr "O seu dispositivo e os nós vizinhos têm de usar o mesmo canal." ++ ++msgid "recommended" ++msgstr "recomendado" +diff --git a/feeds/luci/applications/luci-app-meshwizard/po/ro/meshwizard.po b/feeds/luci/applications/luci-app-meshwizard/po/ro/meshwizard.po +new file mode 100644 +index 0000000..9f1c466 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-meshwizard/po/ro/meshwizard.po +@@ -0,0 +1,126 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"PO-Revision-Date: 2014-06-29 19:55+0200\n" ++"Last-Translator: xxvirusxx \n" ++"Language-Team: none\n" ++"Language: ro\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=3; plural=(n==1 ? 0 : (n==0 || (n%100 > 0 && n%100 < " ++"20)) ? 1 : 2);;\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "Activate or deactivate IPv6 config globally." ++msgstr "" ++ ++msgid "Channel" ++msgstr "Canal" ++ ++msgid "Check this to protect your LAN from other nodes or clients" ++msgstr "" ++"Bifeaza aici sa-ti protejezi reteaua locala LAN de alte noduri sau clienti" ++ ++msgid "Cleanup config" ++msgstr "" ++ ++msgid "Configure this interface" ++msgstr "Configureaza aceasta interfata" ++ ++msgid "DHCP IP range" ++msgstr "Plaja de adrese IP DHCP" ++ ++msgid "DHCP will automatically assign ip addresses to clients" ++msgstr "DHCP va aloca automat adrese IP la clienti" ++ ++msgid "Enable DHCP" ++msgstr "Activeaza DHCP" ++ ++msgid "Enable RA" ++msgstr "Activează RA" ++ ++msgid "Enabled" ++msgstr "Activat" ++ ++msgid "General Settings" ++msgstr "Setări generale" ++ ++msgid "IPv6 Settings" ++msgstr "Setări IPv6" ++ ++msgid "" ++"If this is selected then config is cleaned before setting new config options." ++msgstr "" ++ ++msgid "Interfaces" ++msgstr "Interfete" ++ ++msgid "Mesh IP address" ++msgstr "" ++ ++msgid "Mesh IPv6 address" ++msgstr "" ++ ++msgid "Mesh Wizard" ++msgstr "" ++ ++msgid "" ++"Note: this will set up this interface for mesh operation, i.e. add it to " ++"zone 'freifunk' and enable olsr." ++msgstr "" ++ ++msgid "Protect LAN" ++msgstr "Protejeaza reteaua locala LAN" ++ ++msgid "" ++"Select this to allow others to use your connection to access the internet." ++msgstr "" ++"Selecteaza aici ca sa permiti si altora sa-ti foloseasca si ei conexiunea ta " ++"de Internet." ++ ++msgid "Send router advertisements on this device." ++msgstr "" ++ ++msgid "Share your internet connection" ++msgstr "Partajeaza cu altii conexiunea ta de Internet" ++ ++msgid "" ++"The IP range from which clients are assigned ip addresses (e.g. " ++"10.1.2.1/28). If this is a range inside your mesh network range, then it " ++"will be announced as HNA. Any other range will use NAT. If left empty then " ++"the defaults from the community profile will be used." ++msgstr "" ++ ++msgid "The given IP address is not inside the mesh network range" ++msgstr "" ++ ++msgid "" ++"This is a unique IPv6 address in CIDR notation (e.g. 2001:1:2:3::1/64) and " ++"has to be registered at your local community." ++msgstr "" ++ ++msgid "" ++"This is a unique address in the mesh (e.g. 10.1.1.1) and has to be " ++"registered at your local community." ++msgstr "" ++ ++msgid "This will setup a new virtual wireless interface in Access Point mode." ++msgstr "" ++ ++msgid "" ++"This wizard will assist you in setting up your router for Freifunk or " ++"another similar wireless community network." ++msgstr "" ++ ++msgid "Virtual Access Point (VAP)" ++msgstr "" ++ ++msgid "Wizard" ++msgstr "" ++ ++msgid "Your device and neighbouring nodes have to use the same channel." ++msgstr "" ++ ++msgid "recommended" ++msgstr "recomandat" +diff --git a/feeds/luci/applications/luci-app-meshwizard/po/ru/meshwizard.po b/feeds/luci/applications/luci-app-meshwizard/po/ru/meshwizard.po +new file mode 100644 +index 0000000..876ac36 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-meshwizard/po/ru/meshwizard.po +@@ -0,0 +1,150 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: LuCI: meshwizard\n" ++"Report-Msgid-Bugs-To: \n" ++"POT-Creation-Date: 2011-07-20 09:47+0200\n" ++"PO-Revision-Date: 2013-09-06 09:43+0200\n" ++"Last-Translator: datasheet \n" ++"Language-Team: Russian \n" ++"Language: ru\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%" ++"10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" ++"X-Generator: Pootle 2.0.6\n" ++"X-Poedit-SourceCharset: UTF-8\n" ++ ++#, fuzzy ++msgid "Activate or deactivate IPv6 config globally." ++msgstr "Ðктивировать или деактивировать глобальную конфигурацию IPv6." ++ ++msgid "Channel" ++msgstr "Канал" ++ ++msgid "Check this to protect your LAN from other nodes or clients" ++msgstr "" ++"Включите Ñту опцию, чтобы защитить локальную Ñеть от других узлов или " ++"клиентов" ++ ++msgid "Cleanup config" ++msgstr "ОчиÑтить конфигурацию" ++ ++msgid "Configure this interface" ++msgstr "ÐаÑтроить Ñтот интерфейÑ" ++ ++msgid "DHCP IP range" ++msgstr "Диапазон IP-адреÑов DHCP" ++ ++msgid "DHCP will automatically assign ip addresses to clients" ++msgstr "DHCP автоматичеÑки назначит IP-адреÑа клиентам" ++ ++msgid "Enable DHCP" ++msgstr "Включить DHCP" ++ ++msgid "Enable RA" ++msgstr "Разрешить ICMPv6-ответ \"Router Advertisement\"" ++ ++msgid "Enabled" ++msgstr "Включен" ++ ++msgid "General Settings" ++msgstr "Общие наÑтройки" ++ ++msgid "IPv6 Settings" ++msgstr "ÐаÑтройки IPv6" ++ ++msgid "" ++"If this is selected then config is cleaned before setting new config options." ++msgstr "" ++"ЕÑли Ñта Ð¾Ð¿Ñ†Ð¸Ñ Ð²ÐºÐ»ÑŽÑ‡ÐµÐ½Ð°, то ÐºÐ¾Ð½Ñ„Ð¸Ð³ÑƒÑ€Ð°Ñ†Ð¸Ñ Ð¾Ñ‡Ð¸Ñ‰Ð°ÐµÑ‚ÑÑ Ð¿ÐµÑ€ÐµÐ´ уÑтановкой новых " ++"наÑтроек." ++ ++msgid "Interfaces" ++msgstr "ИнтерфейÑÑ‹" ++ ++msgid "Mesh IP address" ++msgstr "IP-Ð°Ð´Ñ€ÐµÑ Ñчейки" ++ ++msgid "Mesh IPv6 address" ++msgstr "IPv6-Ð°Ð´Ñ€ÐµÑ Ð² mesh-Ñети" ++ ++# предлагаю иÑпользовать именно термин "mesh-Ñеть", Ñ‚.к. руÑÑкий аналог Ñтого понÑÑ‚Ð¸Ñ Ñлишком длинный (Ñеть Ñ ÑчеиÑтой топологиейб ÑчеиÑÑ‚Ð°Ñ Ñеть) ++msgid "Mesh Wizard" ++msgstr "МаÑтер наÑтройки ÑчеиÑтой Ñети" ++ ++#, fuzzy ++msgid "" ++"Note: this will set up this interface for mesh operation, i.e. add it to " ++"zone 'freifunk' and enable olsr." ++msgstr "" ++"Примечание: Ñта Ð¾Ð¿Ñ†Ð¸Ñ ÑƒÑтановит данный Ð¸Ð½Ñ‚ÐµÑ€Ñ„ÐµÐ¹Ñ Ð² режим работы Ñ mesh-" ++"ÑетÑми, Ñ‚.е. добавит его в зону ''freifunk' (\"free wireless radio\") и " ++"включит протокол OLSR." ++ ++msgid "Protect LAN" ++msgstr "Защита LAN" ++ ++msgid "" ++"Select this to allow others to use your connection to access the internet." ++msgstr "" ++"Включите Ñту опцию, чтобы позволить другим клиентам иÑпользовать ваше " ++"подключение к интернету." ++ ++msgid "Send router advertisements on this device." ++msgstr "ПоÑылать ICMPv6 ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ \"Router Advertisement\" на Ñто уÑтройÑтво" ++ ++msgid "Share your internet connection" ++msgstr "Сделать интернет-подключение общедоÑтупным" ++ ++# HNA - Home Network Announcement ++msgid "" ++"The IP range from which clients are assigned ip addresses (e.g. " ++"10.1.2.1/28). If this is a range inside your mesh network range, then it " ++"will be announced as HNA. Any other range will use NAT. If left empty then " ++"the defaults from the community profile will be used." ++msgstr "" ++"Диапазон IP-адреÑов Ð´Ð»Ñ Ð¸ÑÐ¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ ÐºÐ»Ð¸ÐµÐ½Ñ‚Ð°Ð¼Ð¸ Ñети (например 10.1.2.1/28). " ++"ЕÑли указанный диапазон находитÑÑ Ð²Ð½ÑƒÑ‚Ñ€Ð¸ вашей Ñети, тогда он будет объÑвлен " ++"как HNA. Любой другой диапазон будет иÑпользовать NAT. Ð’ Ñлучае пуÑтого " ++"значение будут иÑпользоватьÑÑ Ñтандартные наÑтройки." ++ ++msgid "The given IP address is not inside the mesh network range" ++msgstr "Заданный IP-Ð°Ð´Ñ€ÐµÑ Ð½Ðµ находитÑÑ Ð²Ð½ÑƒÑ‚Ñ€Ð¸ ÑчеиÑтой Ñети" ++ ++msgid "" ++"This is a unique IPv6 address in CIDR notation (e.g. 2001:1:2:3::1/64) and " ++"has to be registered at your local community." ++msgstr "" ++ ++msgid "" ++"This is a unique address in the mesh (e.g. 10.1.1.1) and has to be " ++"registered at your local community." ++msgstr "" ++"Это уникальный Ð°Ð´Ñ€ÐµÑ Ð² ÑчеиÑтой Ñети (например 10.1.1.1), который должен " ++"быть зарегиÑтрирован в вашем меÑтном ÑообщеÑтве." ++ ++msgid "This will setup a new virtual wireless interface in Access Point mode." ++msgstr "" ++"Будет произведена наÑтройка новой виртуальной беÑпроводной Ñети в режиме " ++"точки доÑтупа." ++ ++msgid "" ++"This wizard will assist you in setting up your router for Freifunk or " ++"another similar wireless community network." ++msgstr "" ++"Данный маÑтер поможет наÑтроить ваш маршрутизатор Ð´Ð»Ñ Ñети Freifunk или " ++"другой подобной беÑпроводной Ñети." ++ ++msgid "Virtual Access Point (VAP)" ++msgstr "Ð’Ð¸Ñ€Ñ‚ÑƒÐ°Ð»ÑŒÐ½Ð°Ñ Ñ‚Ð¾Ñ‡ÐºÐ° доÑтупа (VAP)" ++ ++msgid "Wizard" ++msgstr "МаÑтер уÑтановки" ++ ++msgid "Your device and neighbouring nodes have to use the same channel." ++msgstr "" ++"Ваше уÑтройÑтво и ÑоÑедние узлы должны иÑпользовать один и тот же канал." ++ ++msgid "recommended" ++msgstr "рекомендуетÑÑ" +diff --git a/feeds/luci/applications/luci-app-meshwizard/po/sk/meshwizard.po b/feeds/luci/applications/luci-app-meshwizard/po/sk/meshwizard.po +new file mode 100644 +index 0000000..c86708a +--- /dev/null ++++ b/feeds/luci/applications/luci-app-meshwizard/po/sk/meshwizard.po +@@ -0,0 +1,119 @@ ++msgid "" ++msgstr "" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Last-Translator: Automatically generated\n" ++"Language-Team: none\n" ++"MIME-Version: 1.0\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n" ++ ++msgid "Activate or deactivate IPv6 config globally." ++msgstr "" ++ ++msgid "Channel" ++msgstr "" ++ ++msgid "Check this to protect your LAN from other nodes or clients" ++msgstr "" ++ ++msgid "Cleanup config" ++msgstr "" ++ ++msgid "Configure this interface" ++msgstr "" ++ ++msgid "DHCP IP range" ++msgstr "" ++ ++msgid "DHCP will automatically assign ip addresses to clients" ++msgstr "" ++ ++msgid "Enable DHCP" ++msgstr "" ++ ++msgid "Enable RA" ++msgstr "" ++ ++msgid "Enabled" ++msgstr "" ++ ++msgid "General Settings" ++msgstr "" ++ ++msgid "IPv6 Settings" ++msgstr "" ++ ++msgid "" ++"If this is selected then config is cleaned before setting new config options." ++msgstr "" ++ ++msgid "Interfaces" ++msgstr "" ++ ++msgid "Mesh IP address" ++msgstr "" ++ ++msgid "Mesh IPv6 address" ++msgstr "" ++ ++msgid "Mesh Wizard" ++msgstr "" ++ ++msgid "" ++"Note: this will set up this interface for mesh operation, i.e. add it to " ++"zone 'freifunk' and enable olsr." ++msgstr "" ++ ++msgid "Protect LAN" ++msgstr "" ++ ++msgid "" ++"Select this to allow others to use your connection to access the internet." ++msgstr "" ++ ++msgid "Send router advertisements on this device." ++msgstr "" ++ ++msgid "Share your internet connection" ++msgstr "" ++ ++msgid "" ++"The IP range from which clients are assigned ip addresses (e.g. " ++"10.1.2.1/28). If this is a range inside your mesh network range, then it " ++"will be announced as HNA. Any other range will use NAT. If left empty then " ++"the defaults from the community profile will be used." ++msgstr "" ++ ++msgid "The given IP address is not inside the mesh network range" ++msgstr "" ++ ++msgid "" ++"This is a unique IPv6 address in CIDR notation (e.g. 2001:1:2:3::1/64) and " ++"has to be registered at your local community." ++msgstr "" ++ ++msgid "" ++"This is a unique address in the mesh (e.g. 10.1.1.1) and has to be " ++"registered at your local community." ++msgstr "" ++ ++msgid "This will setup a new virtual wireless interface in Access Point mode." ++msgstr "" ++ ++msgid "" ++"This wizard will assist you in setting up your router for Freifunk or " ++"another similar wireless community network." ++msgstr "" ++ ++msgid "Virtual Access Point (VAP)" ++msgstr "" ++ ++msgid "Wizard" ++msgstr "" ++ ++msgid "Your device and neighbouring nodes have to use the same channel." ++msgstr "" ++ ++msgid "recommended" ++msgstr "" +diff --git a/feeds/luci/applications/luci-app-meshwizard/po/sv/meshwizard.po b/feeds/luci/applications/luci-app-meshwizard/po/sv/meshwizard.po +new file mode 100644 +index 0000000..b898024 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-meshwizard/po/sv/meshwizard.po +@@ -0,0 +1,120 @@ ++msgid "" ++msgstr "" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Last-Translator: Automatically generated\n" ++"Language-Team: none\n" ++"Language: sv\n" ++"MIME-Version: 1.0\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n != 1);\n" ++ ++msgid "Activate or deactivate IPv6 config globally." ++msgstr "" ++ ++msgid "Channel" ++msgstr "" ++ ++msgid "Check this to protect your LAN from other nodes or clients" ++msgstr "" ++ ++msgid "Cleanup config" ++msgstr "" ++ ++msgid "Configure this interface" ++msgstr "" ++ ++msgid "DHCP IP range" ++msgstr "" ++ ++msgid "DHCP will automatically assign ip addresses to clients" ++msgstr "" ++ ++msgid "Enable DHCP" ++msgstr "" ++ ++msgid "Enable RA" ++msgstr "" ++ ++msgid "Enabled" ++msgstr "" ++ ++msgid "General Settings" ++msgstr "" ++ ++msgid "IPv6 Settings" ++msgstr "" ++ ++msgid "" ++"If this is selected then config is cleaned before setting new config options." ++msgstr "" ++ ++msgid "Interfaces" ++msgstr "" ++ ++msgid "Mesh IP address" ++msgstr "" ++ ++msgid "Mesh IPv6 address" ++msgstr "" ++ ++msgid "Mesh Wizard" ++msgstr "" ++ ++msgid "" ++"Note: this will set up this interface for mesh operation, i.e. add it to " ++"zone 'freifunk' and enable olsr." ++msgstr "" ++ ++msgid "Protect LAN" ++msgstr "" ++ ++msgid "" ++"Select this to allow others to use your connection to access the internet." ++msgstr "" ++ ++msgid "Send router advertisements on this device." ++msgstr "" ++ ++msgid "Share your internet connection" ++msgstr "" ++ ++msgid "" ++"The IP range from which clients are assigned ip addresses (e.g. " ++"10.1.2.1/28). If this is a range inside your mesh network range, then it " ++"will be announced as HNA. Any other range will use NAT. If left empty then " ++"the defaults from the community profile will be used." ++msgstr "" ++ ++msgid "The given IP address is not inside the mesh network range" ++msgstr "" ++ ++msgid "" ++"This is a unique IPv6 address in CIDR notation (e.g. 2001:1:2:3::1/64) and " ++"has to be registered at your local community." ++msgstr "" ++ ++msgid "" ++"This is a unique address in the mesh (e.g. 10.1.1.1) and has to be " ++"registered at your local community." ++msgstr "" ++ ++msgid "This will setup a new virtual wireless interface in Access Point mode." ++msgstr "" ++ ++msgid "" ++"This wizard will assist you in setting up your router for Freifunk or " ++"another similar wireless community network." ++msgstr "" ++ ++msgid "Virtual Access Point (VAP)" ++msgstr "" ++ ++msgid "Wizard" ++msgstr "" ++ ++msgid "Your device and neighbouring nodes have to use the same channel." ++msgstr "" ++ ++msgid "recommended" ++msgstr "" +diff --git a/feeds/luci/applications/luci-app-meshwizard/po/templates/meshwizard.pot b/feeds/luci/applications/luci-app-meshwizard/po/templates/meshwizard.pot +new file mode 100644 +index 0000000..9dfdec5 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-meshwizard/po/templates/meshwizard.pot +@@ -0,0 +1,112 @@ ++msgid "" ++msgstr "Content-Type: text/plain; charset=UTF-8" ++ ++msgid "Activate or deactivate IPv6 config globally." ++msgstr "" ++ ++msgid "Channel" ++msgstr "" ++ ++msgid "Check this to protect your LAN from other nodes or clients" ++msgstr "" ++ ++msgid "Cleanup config" ++msgstr "" ++ ++msgid "Configure this interface" ++msgstr "" ++ ++msgid "DHCP IP range" ++msgstr "" ++ ++msgid "DHCP will automatically assign ip addresses to clients" ++msgstr "" ++ ++msgid "Enable DHCP" ++msgstr "" ++ ++msgid "Enable RA" ++msgstr "" ++ ++msgid "Enabled" ++msgstr "" ++ ++msgid "General Settings" ++msgstr "" ++ ++msgid "IPv6 Settings" ++msgstr "" ++ ++msgid "" ++"If this is selected then config is cleaned before setting new config options." ++msgstr "" ++ ++msgid "Interfaces" ++msgstr "" ++ ++msgid "Mesh IP address" ++msgstr "" ++ ++msgid "Mesh IPv6 address" ++msgstr "" ++ ++msgid "Mesh Wizard" ++msgstr "" ++ ++msgid "" ++"Note: this will set up this interface for mesh operation, i.e. add it to " ++"zone 'freifunk' and enable olsr." ++msgstr "" ++ ++msgid "Protect LAN" ++msgstr "" ++ ++msgid "" ++"Select this to allow others to use your connection to access the internet." ++msgstr "" ++ ++msgid "Send router advertisements on this device." ++msgstr "" ++ ++msgid "Share your internet connection" ++msgstr "" ++ ++msgid "" ++"The IP range from which clients are assigned ip addresses (e.g. " ++"10.1.2.1/28). If this is a range inside your mesh network range, then it " ++"will be announced as HNA. Any other range will use NAT. If left empty then " ++"the defaults from the community profile will be used." ++msgstr "" ++ ++msgid "The given IP address is not inside the mesh network range" ++msgstr "" ++ ++msgid "" ++"This is a unique IPv6 address in CIDR notation (e.g. 2001:1:2:3::1/64) and " ++"has to be registered at your local community." ++msgstr "" ++ ++msgid "" ++"This is a unique address in the mesh (e.g. 10.1.1.1) and has to be " ++"registered at your local community." ++msgstr "" ++ ++msgid "This will setup a new virtual wireless interface in Access Point mode." ++msgstr "" ++ ++msgid "" ++"This wizard will assist you in setting up your router for Freifunk or " ++"another similar wireless community network." ++msgstr "" ++ ++msgid "Virtual Access Point (VAP)" ++msgstr "" ++ ++msgid "Wizard" ++msgstr "" ++ ++msgid "Your device and neighbouring nodes have to use the same channel." ++msgstr "" ++ ++msgid "recommended" ++msgstr "" +diff --git a/feeds/luci/applications/luci-app-meshwizard/po/tr/meshwizard.po b/feeds/luci/applications/luci-app-meshwizard/po/tr/meshwizard.po +new file mode 100644 +index 0000000..92cabd4 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-meshwizard/po/tr/meshwizard.po +@@ -0,0 +1,119 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Last-Translator: Automatically generated\n" ++"Language-Team: none\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=1; plural=0;\n" ++ ++msgid "Activate or deactivate IPv6 config globally." ++msgstr "" ++ ++msgid "Channel" ++msgstr "" ++ ++msgid "Check this to protect your LAN from other nodes or clients" ++msgstr "" ++ ++msgid "Cleanup config" ++msgstr "" ++ ++msgid "Configure this interface" ++msgstr "" ++ ++msgid "DHCP IP range" ++msgstr "" ++ ++msgid "DHCP will automatically assign ip addresses to clients" ++msgstr "" ++ ++msgid "Enable DHCP" ++msgstr "" ++ ++msgid "Enable RA" ++msgstr "" ++ ++msgid "Enabled" ++msgstr "" ++ ++msgid "General Settings" ++msgstr "" ++ ++msgid "IPv6 Settings" ++msgstr "" ++ ++msgid "" ++"If this is selected then config is cleaned before setting new config options." ++msgstr "" ++ ++msgid "Interfaces" ++msgstr "" ++ ++msgid "Mesh IP address" ++msgstr "" ++ ++msgid "Mesh IPv6 address" ++msgstr "" ++ ++msgid "Mesh Wizard" ++msgstr "" ++ ++msgid "" ++"Note: this will set up this interface for mesh operation, i.e. add it to " ++"zone 'freifunk' and enable olsr." ++msgstr "" ++ ++msgid "Protect LAN" ++msgstr "" ++ ++msgid "" ++"Select this to allow others to use your connection to access the internet." ++msgstr "" ++ ++msgid "Send router advertisements on this device." ++msgstr "" ++ ++msgid "Share your internet connection" ++msgstr "" ++ ++msgid "" ++"The IP range from which clients are assigned ip addresses (e.g. " ++"10.1.2.1/28). If this is a range inside your mesh network range, then it " ++"will be announced as HNA. Any other range will use NAT. If left empty then " ++"the defaults from the community profile will be used." ++msgstr "" ++ ++msgid "The given IP address is not inside the mesh network range" ++msgstr "" ++ ++msgid "" ++"This is a unique IPv6 address in CIDR notation (e.g. 2001:1:2:3::1/64) and " ++"has to be registered at your local community." ++msgstr "" ++ ++msgid "" ++"This is a unique address in the mesh (e.g. 10.1.1.1) and has to be " ++"registered at your local community." ++msgstr "" ++ ++msgid "This will setup a new virtual wireless interface in Access Point mode." ++msgstr "" ++ ++msgid "" ++"This wizard will assist you in setting up your router for Freifunk or " ++"another similar wireless community network." ++msgstr "" ++ ++msgid "Virtual Access Point (VAP)" ++msgstr "" ++ ++msgid "Wizard" ++msgstr "" ++ ++msgid "Your device and neighbouring nodes have to use the same channel." ++msgstr "" ++ ++msgid "recommended" ++msgstr "" +diff --git a/feeds/luci/applications/luci-app-meshwizard/po/uk/meshwizard.po b/feeds/luci/applications/luci-app-meshwizard/po/uk/meshwizard.po +new file mode 100644 +index 0000000..9a317b7 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-meshwizard/po/uk/meshwizard.po +@@ -0,0 +1,126 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"PO-Revision-Date: 2013-09-21 15:47+0200\n" ++"Last-Translator: zubr_139 \n" ++"Language-Team: none\n" ++"Language: uk\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%" ++"10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "Activate or deactivate IPv6 config globally." ++msgstr "" ++ ++msgid "Channel" ++msgstr "Канал" ++ ++msgid "Check this to protect your LAN from other nodes or clients" ++msgstr "" ++ ++msgid "Cleanup config" ++msgstr "" ++ ++msgid "Configure this interface" ++msgstr "" ++ ++msgid "DHCP IP range" ++msgstr "DHCP IP-діапазон" ++ ++msgid "DHCP will automatically assign ip addresses to clients" ++msgstr "DHCP автоматично призначить IP-адреÑи клієнтам" ++ ++msgid "Enable DHCP" ++msgstr "Ðктивувати DHCP" ++ ++msgid "Enable RA" ++msgstr "Ðктивувати RA" ++ ++msgid "Enabled" ++msgstr "Ðктивувати" ++ ++msgid "General Settings" ++msgstr "Загальні налаштуваннÑ" ++ ++msgid "IPv6 Settings" ++msgstr "ÐÐ°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ IPv6" ++ ++msgid "" ++"If this is selected then config is cleaned before setting new config options." ++msgstr "" ++ ++msgid "Interfaces" ++msgstr "ІнтерфейÑи" ++ ++msgid "Mesh IP address" ++msgstr "" ++ ++msgid "Mesh IPv6 address" ++msgstr "" ++ ++msgid "Mesh Wizard" ++msgstr "" ++ ++msgid "" ++"Note: this will set up this interface for mesh operation, i.e. add it to " ++"zone 'freifunk' and enable olsr." ++msgstr "" ++ ++msgid "Protect LAN" ++msgstr "ЗахиÑÑ‚ локальної мережі" ++ ++#, fuzzy ++msgid "" ++"Select this to allow others to use your connection to access the internet." ++msgstr "" ++"Оберіть це, щоб дозволити іншим викориÑтовувати з'Ñ”Ð´Ð½Ð°Ð½Ð½Ñ Ð´Ð»Ñ Ð´Ð¾Ñтупу в " ++"Інтернет." ++ ++msgid "Send router advertisements on this device." ++msgstr "" ++ ++msgid "Share your internet connection" ++msgstr "" ++ ++msgid "" ++"The IP range from which clients are assigned ip addresses (e.g. " ++"10.1.2.1/28). If this is a range inside your mesh network range, then it " ++"will be announced as HNA. Any other range will use NAT. If left empty then " ++"the defaults from the community profile will be used." ++msgstr "" ++ ++msgid "The given IP address is not inside the mesh network range" ++msgstr "" ++ ++msgid "" ++"This is a unique IPv6 address in CIDR notation (e.g. 2001:1:2:3::1/64) and " ++"has to be registered at your local community." ++msgstr "" ++ ++msgid "" ++"This is a unique address in the mesh (e.g. 10.1.1.1) and has to be " ++"registered at your local community." ++msgstr "" ++ ++msgid "This will setup a new virtual wireless interface in Access Point mode." ++msgstr "" ++ ++msgid "" ++"This wizard will assist you in setting up your router for Freifunk or " ++"another similar wireless community network." ++msgstr "" ++ ++msgid "Virtual Access Point (VAP)" ++msgstr "" ++ ++msgid "Wizard" ++msgstr "" ++ ++msgid "Your device and neighbouring nodes have to use the same channel." ++msgstr "" ++ ++msgid "recommended" ++msgstr "" +diff --git a/feeds/luci/applications/luci-app-meshwizard/po/vi/meshwizard.po b/feeds/luci/applications/luci-app-meshwizard/po/vi/meshwizard.po +new file mode 100644 +index 0000000..a67c71f +--- /dev/null ++++ b/feeds/luci/applications/luci-app-meshwizard/po/vi/meshwizard.po +@@ -0,0 +1,109 @@ ++msgid "Activate or deactivate IPv6 config globally." ++msgstr "" ++ ++msgid "Channel" ++msgstr "" ++ ++msgid "Check this to protect your LAN from other nodes or clients" ++msgstr "" ++ ++msgid "Cleanup config" ++msgstr "" ++ ++msgid "Configure this interface" ++msgstr "" ++ ++msgid "DHCP IP range" ++msgstr "" ++ ++msgid "DHCP will automatically assign ip addresses to clients" ++msgstr "" ++ ++msgid "Enable DHCP" ++msgstr "" ++ ++msgid "Enable RA" ++msgstr "" ++ ++msgid "Enabled" ++msgstr "" ++ ++msgid "General Settings" ++msgstr "" ++ ++msgid "IPv6 Settings" ++msgstr "" ++ ++msgid "" ++"If this is selected then config is cleaned before setting new config options." ++msgstr "" ++ ++msgid "Interfaces" ++msgstr "" ++ ++msgid "Mesh IP address" ++msgstr "" ++ ++msgid "Mesh IPv6 address" ++msgstr "" ++ ++msgid "Mesh Wizard" ++msgstr "" ++ ++msgid "" ++"Note: this will set up this interface for mesh operation, i.e. add it to " ++"zone 'freifunk' and enable olsr." ++msgstr "" ++ ++msgid "Protect LAN" ++msgstr "" ++ ++msgid "" ++"Select this to allow others to use your connection to access the internet." ++msgstr "" ++ ++msgid "Send router advertisements on this device." ++msgstr "" ++ ++msgid "Share your internet connection" ++msgstr "" ++ ++msgid "" ++"The IP range from which clients are assigned ip addresses (e.g. " ++"10.1.2.1/28). If this is a range inside your mesh network range, then it " ++"will be announced as HNA. Any other range will use NAT. If left empty then " ++"the defaults from the community profile will be used." ++msgstr "" ++ ++msgid "The given IP address is not inside the mesh network range" ++msgstr "" ++ ++msgid "" ++"This is a unique IPv6 address in CIDR notation (e.g. 2001:1:2:3::1/64) and " ++"has to be registered at your local community." ++msgstr "" ++ ++msgid "" ++"This is a unique address in the mesh (e.g. 10.1.1.1) and has to be " ++"registered at your local community." ++msgstr "" ++ ++msgid "This will setup a new virtual wireless interface in Access Point mode." ++msgstr "" ++ ++msgid "" ++"This wizard will assist you in setting up your router for Freifunk or " ++"another similar wireless community network." ++msgstr "" ++ ++msgid "Virtual Access Point (VAP)" ++msgstr "" ++ ++msgid "Wizard" ++msgstr "" ++ ++msgid "Your device and neighbouring nodes have to use the same channel." ++msgstr "" ++ ++msgid "recommended" ++msgstr "" +diff --git a/feeds/luci/applications/luci-app-meshwizard/po/zh-cn/meshwizard.po b/feeds/luci/applications/luci-app-meshwizard/po/zh-cn/meshwizard.po +new file mode 100644 +index 0000000..d5d0707 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-meshwizard/po/zh-cn/meshwizard.po +@@ -0,0 +1,126 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Report-Msgid-Bugs-To: \n" ++"POT-Creation-Date: 2012-09-24 18:01+0200\n" ++"PO-Revision-Date: 2014-03-25 04:25+0200\n" ++"Last-Translator: hewenhao \n" ++"Language-Team: LANGUAGE \n" ++"Language: zh_CN\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=1; plural=0;\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "Activate or deactivate IPv6 config globally." ++msgstr "å¯ç”¨æˆ–åœç”¨å…¨çƒIPv6设置" ++ ++msgid "Channel" ++msgstr "频é“" ++ ++msgid "Check this to protect your LAN from other nodes or clients" ++msgstr "选择此项,隔离其他节点或客户端的攻击æ¥ä¿æŠ¤ä½ çš„局域网" ++ ++msgid "Cleanup config" ++msgstr "清空é…ç½®" ++ ++msgid "Configure this interface" ++msgstr "é…置当å‰ç•Œé¢" ++ ++msgid "DHCP IP range" ++msgstr "DHCP IP 范围" ++ ++msgid "DHCP will automatically assign ip addresses to clients" ++msgstr "DHCP将自动给客户端分é…IP地å€" ++ ++msgid "Enable DHCP" ++msgstr "å¯åŠ¨DHCP" ++ ++msgid "Enable RA" ++msgstr "å¯ç”¨RA" ++ ++msgid "Enabled" ++msgstr "å¯ç”¨" ++ ++msgid "General Settings" ++msgstr "总体设置" ++ ++msgid "IPv6 Settings" ++msgstr "IPv6设置" ++ ++msgid "" ++"If this is selected then config is cleaned before setting new config options." ++msgstr "如果此项被选中,在设置新选项之å‰ï¼Œé…置将被清空。" ++ ++msgid "Interfaces" ++msgstr "ç•Œé¢" ++ ++msgid "Mesh IP address" ++msgstr "Mesh IP 地å€" ++ ++msgid "Mesh IPv6 address" ++msgstr "Mesh IPv6地å€" ++ ++msgid "Mesh Wizard" ++msgstr "Mesh 导引" ++ ++#, fuzzy ++msgid "" ++"Note: this will set up this interface for mesh operation, i.e. add it to " ++"zone 'freifunk' and enable olsr." ++msgstr "注æ„:这将为meshæ“作建立一个接å£ï¼Œå¦‚:增加到‘freifunk’区域并使能olsr" ++ ++msgid "Protect LAN" ++msgstr "ä¿æŠ¤LANå£" ++ ++msgid "" ++"Select this to allow others to use your connection to access the internet." ++msgstr "选择这项æ¥å…许其它程åºç”¨ä½ è¿™ä¸ªè¿žæŽ¥æ¥æŽ¥å…¥å› ç‰¹ç½‘" ++ ++#, fuzzy ++msgid "Send router advertisements on this device." ++msgstr "在这个设备上å‘é€è·¯ç”±å¹¿æ’­" ++ ++msgid "Share your internet connection" ++msgstr "分享你的Internet连接" ++ ++msgid "" ++"The IP range from which clients are assigned ip addresses (e.g. " ++"10.1.2.1/28). If this is a range inside your mesh network range, then it " ++"will be announced as HNA. Any other range will use NAT. If left empty then " ++"the defaults from the community profile will be used." ++msgstr "" ++ ++msgid "The given IP address is not inside the mesh network range" ++msgstr "" ++ ++msgid "" ++"This is a unique IPv6 address in CIDR notation (e.g. 2001:1:2:3::1/64) and " ++"has to be registered at your local community." ++msgstr "" ++ ++msgid "" ++"This is a unique address in the mesh (e.g. 10.1.1.1) and has to be " ++"registered at your local community." ++msgstr "" ++ ++msgid "This will setup a new virtual wireless interface in Access Point mode." ++msgstr "这将会在接入点模å¼è®¾ç½®ä¸€ä¸ªæ–°çš„虚拟无线网络接å£" ++ ++msgid "" ++"This wizard will assist you in setting up your router for Freifunk or " ++"another similar wireless community network." ++msgstr "" ++ ++msgid "Virtual Access Point (VAP)" ++msgstr "虚拟接入点" ++ ++msgid "Wizard" ++msgstr "" ++ ++msgid "Your device and neighbouring nodes have to use the same channel." ++msgstr "" ++ ++msgid "recommended" ++msgstr "推è" +diff --git a/feeds/luci/applications/luci-app-meshwizard/po/zh-tw/meshwizard.po b/feeds/luci/applications/luci-app-meshwizard/po/zh-tw/meshwizard.po +new file mode 100644 +index 0000000..a4d29e8 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-meshwizard/po/zh-tw/meshwizard.po +@@ -0,0 +1,118 @@ ++msgid "" ++msgstr "" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Last-Translator: Automatically generated\n" ++"Language-Team: none\n" ++"MIME-Version: 1.0\n" ++"Content-Transfer-Encoding: 8bit\n" ++ ++msgid "Activate or deactivate IPv6 config globally." ++msgstr "" ++ ++msgid "Channel" ++msgstr "" ++ ++msgid "Check this to protect your LAN from other nodes or clients" ++msgstr "" ++ ++msgid "Cleanup config" ++msgstr "" ++ ++msgid "Configure this interface" ++msgstr "" ++ ++msgid "DHCP IP range" ++msgstr "" ++ ++msgid "DHCP will automatically assign ip addresses to clients" ++msgstr "" ++ ++msgid "Enable DHCP" ++msgstr "" ++ ++msgid "Enable RA" ++msgstr "" ++ ++msgid "Enabled" ++msgstr "" ++ ++msgid "General Settings" ++msgstr "" ++ ++msgid "IPv6 Settings" ++msgstr "" ++ ++msgid "" ++"If this is selected then config is cleaned before setting new config options." ++msgstr "" ++ ++msgid "Interfaces" ++msgstr "" ++ ++msgid "Mesh IP address" ++msgstr "" ++ ++msgid "Mesh IPv6 address" ++msgstr "" ++ ++msgid "Mesh Wizard" ++msgstr "" ++ ++msgid "" ++"Note: this will set up this interface for mesh operation, i.e. add it to " ++"zone 'freifunk' and enable olsr." ++msgstr "" ++ ++msgid "Protect LAN" ++msgstr "" ++ ++msgid "" ++"Select this to allow others to use your connection to access the internet." ++msgstr "" ++ ++msgid "Send router advertisements on this device." ++msgstr "" ++ ++msgid "Share your internet connection" ++msgstr "" ++ ++msgid "" ++"The IP range from which clients are assigned ip addresses (e.g. " ++"10.1.2.1/28). If this is a range inside your mesh network range, then it " ++"will be announced as HNA. Any other range will use NAT. If left empty then " ++"the defaults from the community profile will be used." ++msgstr "" ++ ++msgid "The given IP address is not inside the mesh network range" ++msgstr "" ++ ++msgid "" ++"This is a unique IPv6 address in CIDR notation (e.g. 2001:1:2:3::1/64) and " ++"has to be registered at your local community." ++msgstr "" ++ ++msgid "" ++"This is a unique address in the mesh (e.g. 10.1.1.1) and has to be " ++"registered at your local community." ++msgstr "" ++ ++msgid "This will setup a new virtual wireless interface in Access Point mode." ++msgstr "" ++ ++msgid "" ++"This wizard will assist you in setting up your router for Freifunk or " ++"another similar wireless community network." ++msgstr "" ++ ++msgid "Virtual Access Point (VAP)" ++msgstr "" ++ ++msgid "Wizard" ++msgstr "" ++ ++msgid "Your device and neighbouring nodes have to use the same channel." ++msgstr "" ++ ++msgid "recommended" ++msgstr "" +diff --git a/feeds/luci/applications/luci-app-meshwizard/root/etc/uci-defaults/meshwizard b/feeds/luci/applications/luci-app-meshwizard/root/etc/uci-defaults/meshwizard +new file mode 100644 +index 0000000..6ceb1b7 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-meshwizard/root/etc/uci-defaults/meshwizard +@@ -0,0 +1,8 @@ ++#!/bin/sh ++uci batch < ++# ++# This is free software, licensed under the Apache License, Version 2.0 . ++# ++ ++include $(TOPDIR)/rules.mk ++ ++LUCI_TITLE:=LuCI Support for miniDLNA ++LUCI_DEPENDS:=+minidlna ++ ++include ../../luci.mk ++ ++# call BuildPackage - OpenWrt buildroot signature +diff --git a/feeds/luci/applications/luci-app-minidlna/luasrc/controller/minidlna.lua b/feeds/luci/applications/luci-app-minidlna/luasrc/controller/minidlna.lua +new file mode 100644 +index 0000000..9200796 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-minidlna/luasrc/controller/minidlna.lua +@@ -0,0 +1,46 @@ ++-- Copyright 2012 Gabor Juhos ++-- Licensed to the public under the Apache License 2.0. ++ ++module("luci.controller.minidlna", package.seeall) ++ ++function index() ++ if not nixio.fs.access("/etc/config/minidlna") then ++ return ++ end ++ ++ local page ++ ++ page = entry({"admin", "services", "minidlna"}, cbi("minidlna"), _("miniDLNA")) ++ page.dependent = true ++ ++ entry({"admin", "services", "minidlna_status"}, call("minidlna_status")) ++end ++ ++function minidlna_status() ++ local sys = require "luci.sys" ++ local uci = require "luci.model.uci".cursor() ++ local port = tonumber(uci:get_first("minidlna", "minidlna", "port")) ++ ++ local status = { ++ running = (sys.call("pidof minidlna >/dev/null") == 0), ++ audio = 0, ++ video = 0, ++ image = 0 ++ } ++ ++ if status.running then ++ local fd = sys.httpget("http://127.0.0.1:%d/" % (port or 8200), true) ++ if fd then ++ local html = fd:read("*a") ++ if html then ++ status.audio = (tonumber(html:match("Audio files(%d+)")) or 0) ++ status.video = (tonumber(html:match("Video files(%d+)")) or 0) ++ status.image = (tonumber(html:match("Image files(%d+)")) or 0) ++ end ++ fd:close() ++ end ++ end ++ ++ luci.http.prepare_content("application/json") ++ luci.http.write_json(status) ++end +diff --git a/feeds/luci/applications/luci-app-minidlna/luasrc/model/cbi/minidlna.lua b/feeds/luci/applications/luci-app-minidlna/luasrc/model/cbi/minidlna.lua +new file mode 100644 +index 0000000..99ef68c +--- /dev/null ++++ b/feeds/luci/applications/luci-app-minidlna/luasrc/model/cbi/minidlna.lua +@@ -0,0 +1,165 @@ ++-- Copyright 2012 Gabor Juhos ++-- Licensed to the public under the Apache License 2.0. ++ ++local m, s, o ++ ++m = Map("minidlna", translate("miniDLNA"), ++ translate("MiniDLNA is server software with the aim of being fully compliant with DLNA/UPnP-AV clients.")) ++ ++m:section(SimpleSection).template = "minidlna_status" ++ ++s = m:section(TypedSection, "minidlna", "miniDLNA Settings") ++s.addremove = false ++s.anonymous = true ++ ++s:tab("general", translate("General Settings")) ++s:tab("advanced", translate("Advanced Settings")) ++ ++o = s:taboption("general", Flag, "enabled", translate("Enable:")) ++o.rmempty = false ++ ++function o.cfgvalue(self, section) ++ return luci.sys.init.enabled("minidlna") and self.enabled or self.disabled ++end ++ ++function o.write(self, section, value) ++ if value == "1" then ++ luci.sys.init.enable("minidlna") ++ luci.sys.call("/etc/init.d/minidlna start >/dev/null") ++ else ++ luci.sys.call("/etc/init.d/minidlna stop >/dev/null") ++ luci.sys.init.disable("minidlna") ++ end ++ ++ return Flag.write(self, section, value) ++end ++ ++o = s:taboption("general", Value, "port", translate("Port:"), ++ translate("Port for HTTP (descriptions, SOAP, media transfer) traffic.")) ++o.datatype = "port" ++o.default = 8200 ++ ++ ++o = s:taboption("general", Value, "interface", translate("Interfaces:"), ++ translate("Network interfaces to serve.")) ++ ++o.template = "cbi/network_ifacelist" ++o.widget = "checkbox" ++o.nocreate = true ++ ++function o.cfgvalue(self, section) ++ local rv = { } ++ local val = Value.cfgvalue(self, section) ++ if val then ++ local ifc ++ for ifc in val:gmatch("[^,%s]+") do ++ rv[#rv+1] = ifc ++ end ++ end ++ return rv ++end ++ ++function o.write(self, section, value) ++ local rv = { } ++ local ifc ++ for ifc in luci.util.imatch(value) do ++ rv[#rv+1] = ifc ++ end ++ Value.write(self, section, table.concat(rv, ",")) ++end ++ ++ ++o = s:taboption("general", Value, "friendly_name", translate("Friendly name:"), ++ translate("Set this if you want to customize the name that shows up on your clients.")) ++o.rmempty = true ++o.placeholder = "OpenWrt DLNA Server" ++ ++o = s:taboption("advanced", Value, "db_dir", translate("Database directory:"), ++ translate("Set this if you would like to specify the directory where you want MiniDLNA to store its database and album art cache.")) ++o.rmempty = true ++o.placeholder = "/var/cache/minidlna" ++ ++o = s:taboption("advanced", Value, "log_dir", translate("Log directory:"), ++ translate("Set this if you would like to specify the directory where you want MiniDLNA to store its log file.")) ++o.rmempty = true ++o.placeholder = "/var/log" ++ ++s:taboption("advanced", Flag, "inotify", translate("Enable inotify:"), ++ translate("Set this to enable inotify monitoring to automatically discover new files.")) ++ ++s:taboption("advanced", Flag, "enable_tivo", translate("Enable TIVO:"), ++ translate("Set this to enable support for streaming .jpg and .mp3 files to a TiVo supporting HMO.")) ++o.rmempty = true ++ ++o = s:taboption("advanced", Flag, "strict_dlna", translate("Strict to DLNA standard:"), ++ translate("Set this to strictly adhere to DLNA standards. This will allow server-side downscaling of very large JPEG images, which may hurt JPEG serving performance on (at least) Sony DLNA products.")) ++o.rmempty = true ++ ++o = s:taboption("advanced", Value, "presentation_url", translate("Presentation URL:")) ++o.rmempty = true ++o.placeholder = "http://192.168.1.1/" ++ ++o = s:taboption("advanced", Value, "notify_interval", translate("Notify interval:"), ++ translate("Notify interval in seconds.")) ++o.datatype = "uinteger" ++o.placeholder = 900 ++ ++o = s:taboption("advanced", Value, "serial", translate("Announced serial number:"), ++ translate("Serial number the miniDLNA daemon will report to clients in its XML description.")) ++o.placeholder = "12345678" ++ ++s:taboption("advanced", Value, "model_number", translate("Announced model number:"), ++ translate("Model number the miniDLNA daemon will report to clients in its XML description.")) ++o.placholder = "1" ++ ++o = s:taboption("advanced", Value, "minissdpsocket", translate("miniSSDP socket:"), ++ translate("Specify the path to the MiniSSDPd socket.")) ++o.rmempty = true ++o.placeholder = "/var/run/minissdpd.sock" ++ ++o = s:taboption("general", ListValue, "root_container", translate("Root container:")) ++o:value(".", translate("Standard container")) ++o:value("B", translate("Browse directory")) ++o:value("M", translate("Music")) ++o:value("V", translate("Video")) ++o:value("P", translate("Pictures")) ++ ++ ++s:taboption("general", DynamicList, "media_dir", translate("Media directories:"), ++ translate("Set this to the directory you want scanned. If you want to restrict the directory to a specific content type, you can prepend the type ('A' for audio, 'V' for video, 'P' for images), followed by a comma, to the directory (eg. media_dir=A,/mnt/media/Music). Multiple directories can be specified.")) ++ ++ ++o = s:taboption("general", DynamicList, "album_art_names", translate("Album art names:"), ++ translate("This is a list of file names to check for when searching for album art.")) ++o.rmempty = true ++o.placeholder = "Cover.jpg" ++ ++function o.cfgvalue(self, section) ++ local rv = { } ++ ++ local val = Value.cfgvalue(self, section) ++ if type(val) == "table" then ++ val = table.concat(val, "/") ++ elseif not val then ++ val = "" ++ end ++ ++ local file ++ for file in val:gmatch("[^/%s]+") do ++ rv[#rv+1] = file ++ end ++ ++ return rv ++end ++ ++function o.write(self, section, value) ++ local rv = { } ++ local file ++ for file in luci.util.imatch(value) do ++ rv[#rv+1] = file ++ end ++ Value.write(self, section, table.concat(rv, "/")) ++end ++ ++ ++return m +diff --git a/feeds/luci/applications/luci-app-minidlna/luasrc/view/admin_status/index/minidlna.htm b/feeds/luci/applications/luci-app-minidlna/luasrc/view/admin_status/index/minidlna.htm +new file mode 100644 +index 0000000..b2feeb2 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-minidlna/luasrc/view/admin_status/index/minidlna.htm +@@ -0,0 +1 @@ ++<%+minidlna_status%> +diff --git a/feeds/luci/applications/luci-app-minidlna/luasrc/view/minidlna_status.htm b/feeds/luci/applications/luci-app-minidlna/luasrc/view/minidlna_status.htm +new file mode 100644 +index 0000000..098a72a +--- /dev/null ++++ b/feeds/luci/applications/luci-app-minidlna/luasrc/view/minidlna_status.htm +@@ -0,0 +1,29 @@ ++ ++ ++
    ++ <%:miniDLNA Status%> ++

    ++ <%:Collecting data...%> ++

    ++
    +diff --git a/feeds/luci/applications/luci-app-minidlna/po/ca/minidlna.po b/feeds/luci/applications/luci-app-minidlna/po/ca/minidlna.po +new file mode 100644 +index 0000000..bf16008 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-minidlna/po/ca/minidlna.po +@@ -0,0 +1,167 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"PO-Revision-Date: 2014-07-01 05:45+0200\n" ++"Last-Translator: Alex \n" ++"Language-Team: none\n" ++"Language: ca\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n != 1);\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "Advanced Settings" ++msgstr "Ajusts avançats" ++ ++msgid "Album art names:" ++msgstr "" ++ ++msgid "Announced model number:" ++msgstr "" ++ ++msgid "Announced serial number:" ++msgstr "" ++ ++msgid "Browse directory" ++msgstr "" ++ ++msgid "Collecting data..." ++msgstr "" ++ ++msgid "Database directory:" ++msgstr "" ++ ++msgid "Enable TIVO:" ++msgstr "Habilita TIVO:" ++ ++msgid "Enable inotify:" ++msgstr "Habilita inotify:" ++ ++msgid "Enable:" ++msgstr "Habilita:" ++ ++msgid "Friendly name:" ++msgstr "Nom amistós:" ++ ++msgid "General Settings" ++msgstr "Ajusts generals" ++ ++msgid "Interfaces:" ++msgstr "Interfícies" ++ ++msgid "Log directory:" ++msgstr "Directori de registre:" ++ ++msgid "Media directories:" ++msgstr "Directoris de medis:" ++ ++msgid "" ++"MiniDLNA is server software with the aim of being fully compliant with DLNA/" ++"UPnP-AV clients." ++msgstr "" ++ ++msgid "" ++"Model number the miniDLNA daemon will report to clients in its XML " ++"description." ++msgstr "" ++ ++msgid "Music" ++msgstr "Música" ++ ++msgid "Network interfaces to serve." ++msgstr "" ++ ++msgid "Notify interval in seconds." ++msgstr "Interval de notificació en segons." ++ ++msgid "Notify interval:" ++msgstr "Interval de notificació:" ++ ++msgid "Pictures" ++msgstr "Imatges" ++ ++msgid "Port for HTTP (descriptions, SOAP, media transfer) traffic." ++msgstr "Port de tràfic HTTP (descripcions, SOAP, transferència de medis)" ++ ++msgid "Port:" ++msgstr "Port:" ++ ++msgid "Presentation URL:" ++msgstr "" ++ ++msgid "Root container:" ++msgstr "" ++ ++msgid "" ++"Serial number the miniDLNA daemon will report to clients in its XML " ++"description." ++msgstr "" ++ ++msgid "" ++"Set this if you want to customize the name that shows up on your clients." ++msgstr "" ++ ++msgid "" ++"Set this if you would like to specify the directory where you want MiniDLNA " ++"to store its database and album art cache." ++msgstr "" ++ ++msgid "" ++"Set this if you would like to specify the directory where you want MiniDLNA " ++"to store its log file." ++msgstr "" ++ ++msgid "" ++"Set this to enable inotify monitoring to automatically discover new files." ++msgstr "" ++ ++msgid "" ++"Set this to enable support for streaming .jpg and .mp3 files to a TiVo " ++"supporting HMO." ++msgstr "" ++ ++msgid "" ++"Set this to strictly adhere to DLNA standards. This will allow server-side " ++"downscaling of very large JPEG images, which may hurt JPEG serving " ++"performance on (at least) Sony DLNA products." ++msgstr "" ++ ++msgid "" ++"Set this to the directory you want scanned. If you want to restrict the " ++"directory to a specific content type, you can prepend the type ('A' for " ++"audio, 'V' for video, 'P' for images), followed by a comma, to the directory " ++"(eg. media_dir=A,/mnt/media/Music). Multiple directories can be specified." ++msgstr "" ++ ++msgid "Specify the path to the MiniSSDPd socket." ++msgstr "Especifiqueu la ruta a l'endoll de MiniSSDPd." ++ ++msgid "Standard container" ++msgstr "Contenidor estàndard" ++ ++msgid "Strict to DLNA standard:" ++msgstr "" ++ ++msgid "" ++"The miniDLNA service is active, serving %d audio, %d video and %d image " ++"files." ++msgstr "" ++ ++msgid "The miniDLNA service is not running." ++msgstr "" ++ ++msgid "This is a list of file names to check for when searching for album art." ++msgstr "" ++ ++msgid "Video" ++msgstr "Vídeo" ++ ++msgid "miniDLNA" ++msgstr "miniDLNA" ++ ++msgid "miniDLNA Status" ++msgstr "Estat de miniDLNA" ++ ++msgid "miniSSDP socket:" ++msgstr "" +diff --git a/feeds/luci/applications/luci-app-minidlna/po/cs/minidlna.po b/feeds/luci/applications/luci-app-minidlna/po/cs/minidlna.po +new file mode 100644 +index 0000000..bf5a7f4 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-minidlna/po/cs/minidlna.po +@@ -0,0 +1,171 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"PO-Revision-Date: 2014-08-04 19:18+0200\n" ++"Last-Translator: KubaCZ \n" ++"Language-Team: none\n" ++"Language: cs\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "Advanced Settings" ++msgstr "PokroÄilé nastavení" ++ ++msgid "Album art names:" ++msgstr "" ++ ++msgid "Announced model number:" ++msgstr "" ++ ++msgid "Announced serial number:" ++msgstr "" ++ ++msgid "Browse directory" ++msgstr "Procházet adresář" ++ ++msgid "Collecting data..." ++msgstr "ShromažÄování dat ..." ++ ++msgid "Database directory:" ++msgstr "Adresář databáze:" ++ ++msgid "Enable TIVO:" ++msgstr "Povolit TIVO:" ++ ++msgid "Enable inotify:" ++msgstr "Povolit inotify:" ++ ++msgid "Enable:" ++msgstr "Povolit:" ++ ++msgid "Friendly name:" ++msgstr "Popisek:" ++ ++msgid "General Settings" ++msgstr "Obecné nastavení" ++ ++msgid "Interfaces:" ++msgstr "Rozhraní:" ++ ++msgid "Log directory:" ++msgstr "Log adresář:" ++ ++msgid "Media directories:" ++msgstr "Media adresáře:" ++ ++msgid "" ++"MiniDLNA is server software with the aim of being fully compliant with DLNA/" ++"UPnP-AV clients." ++msgstr "" ++"MiniDLNA je serverový software s cílem být plnÄ› kompatibilní s DLNA / UPnP-" ++"AV klienty." ++ ++msgid "" ++"Model number the miniDLNA daemon will report to clients in its XML " ++"description." ++msgstr "" ++ ++msgid "Music" ++msgstr "Hudba" ++ ++msgid "Network interfaces to serve." ++msgstr "" ++ ++msgid "Notify interval in seconds." ++msgstr "NotifikaÄní interval v sekundách." ++ ++msgid "Notify interval:" ++msgstr "NotifikaÄní interval:" ++ ++msgid "Pictures" ++msgstr "Obrázky" ++ ++msgid "Port for HTTP (descriptions, SOAP, media transfer) traffic." ++msgstr "Port pro HTTP (popisy, SOAP, pÅ™enos médií) provoz." ++ ++msgid "Port:" ++msgstr "Port:" ++ ++msgid "Presentation URL:" ++msgstr "PrezentaÄní URL:" ++ ++msgid "Root container:" ++msgstr "KoÅ™enový/root kontejner:" ++ ++msgid "" ++"Serial number the miniDLNA daemon will report to clients in its XML " ++"description." ++msgstr "" ++ ++msgid "" ++"Set this if you want to customize the name that shows up on your clients." ++msgstr "" ++ ++msgid "" ++"Set this if you would like to specify the directory where you want MiniDLNA " ++"to store its database and album art cache." ++msgstr "" ++ ++msgid "" ++"Set this if you would like to specify the directory where you want MiniDLNA " ++"to store its log file." ++msgstr "" ++ ++msgid "" ++"Set this to enable inotify monitoring to automatically discover new files." ++msgstr "" ++ ++msgid "" ++"Set this to enable support for streaming .jpg and .mp3 files to a TiVo " ++"supporting HMO." ++msgstr "" ++ ++msgid "" ++"Set this to strictly adhere to DLNA standards. This will allow server-side " ++"downscaling of very large JPEG images, which may hurt JPEG serving " ++"performance on (at least) Sony DLNA products." ++msgstr "" ++ ++msgid "" ++"Set this to the directory you want scanned. If you want to restrict the " ++"directory to a specific content type, you can prepend the type ('A' for " ++"audio, 'V' for video, 'P' for images), followed by a comma, to the directory " ++"(eg. media_dir=A,/mnt/media/Music). Multiple directories can be specified." ++msgstr "" ++ ++msgid "Specify the path to the MiniSSDPd socket." ++msgstr "" ++ ++msgid "Standard container" ++msgstr "Standardní kontejner" ++ ++msgid "Strict to DLNA standard:" ++msgstr "StriktnÄ› se držet standardu DLNA:" ++ ++msgid "" ++"The miniDLNA service is active, serving %d audio, %d video and %d image " ++"files." ++msgstr "" ++"Služba miniDLNA je aktivní, poskytuje %d audio, %d video a %d obrázkových " ++"souborů." ++ ++msgid "The miniDLNA service is not running." ++msgstr "Služba miniDLNA není spuÅ¡tÄ›na." ++ ++msgid "This is a list of file names to check for when searching for album art." ++msgstr "" ++ ++msgid "Video" ++msgstr "Video" ++ ++msgid "miniDLNA" ++msgstr "miniDLNA" ++ ++msgid "miniDLNA Status" ++msgstr "Stav miniDLNA" ++ ++msgid "miniSSDP socket:" ++msgstr "miniSSDP socket:" +diff --git a/feeds/luci/applications/luci-app-minidlna/po/de/minidlna.po b/feeds/luci/applications/luci-app-minidlna/po/de/minidlna.po +new file mode 100644 +index 0000000..22cb0f7 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-minidlna/po/de/minidlna.po +@@ -0,0 +1,205 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"PO-Revision-Date: 2012-04-09 14:39+0200\n" ++"Last-Translator: Jo-Philipp \n" ++"Language-Team: none\n" ++"Language: de\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n != 1);\n" ++"X-Generator: Pootle 2.0.4\n" ++ ++msgid "Advanced Settings" ++msgstr "Erweiterte Einstellungen" ++ ++msgid "Album art names:" ++msgstr "Dateinamen für Cover-Bilder:" ++ ++msgid "Announced model number:" ++msgstr "Angekündigte Modellnummer:" ++ ++msgid "Announced serial number:" ++msgstr "Angekündigte Seriennummer:" ++ ++msgid "Browse directory" ++msgstr "Browse-Verzeichnis" ++ ++msgid "Collecting data..." ++msgstr "Sammle Daten..." ++ ++msgid "Database directory:" ++msgstr "Datenbankverzeichnis:" ++ ++msgid "Enable TIVO:" ++msgstr "TIVO aktivieren:" ++ ++msgid "Enable inotify:" ++msgstr "Inotify aktivieren:" ++ ++msgid "Enable:" ++msgstr "Aktivieren:" ++ ++msgid "Friendly name:" ++msgstr "Spitzname:" ++ ++msgid "General Settings" ++msgstr "Allgemeine Einstellungen" ++ ++msgid "Interfaces:" ++msgstr "Schnittstellen:" ++ ++msgid "Log directory:" ++msgstr "Protokollverzeichnis:" ++ ++msgid "Media directories:" ++msgstr "Medienverzeichnisse:" ++ ++msgid "" ++"MiniDLNA is server software with the aim of being fully compliant with DLNA/" ++"UPnP-AV clients." ++msgstr "" ++"MiniDLNA ist eine Serversoftware mit dem Ziel voll kompatibel mit DLNA/UPnP-" ++"AV-Klienten zu sein." ++ ++msgid "" ++"Model number the miniDLNA daemon will report to clients in its XML " ++"description." ++msgstr "" ++"Spezifiziert die Modellnummer welche der miniDLNA-Dienst als Teil seiner XML-" ++"Beschreibung an Clients versendet." ++ ++msgid "Music" ++msgstr "Musik" ++ ++msgid "Network interfaces to serve." ++msgstr "Zu bedienende Netzwerkschnittstellen." ++ ++msgid "Notify interval in seconds." ++msgstr "Ankündigungsinterval in Sekunden." ++ ++msgid "Notify interval:" ++msgstr "Ankündigunsintervall" ++ ++msgid "Pictures" ++msgstr "Bilder" ++ ++msgid "Port for HTTP (descriptions, SOAP, media transfer) traffic." ++msgstr "Port für HTTP-Verkehr (Beschreibungen, SOAP, Mediendaten)." ++ ++msgid "Port:" ++msgstr "Port:" ++ ++msgid "Presentation URL:" ++msgstr "Präsentations-URL:" ++ ++msgid "Root container:" ++msgstr "Root-Container:" ++ ++msgid "" ++"Serial number the miniDLNA daemon will report to clients in its XML " ++"description." ++msgstr "" ++"Spezifiziert die Seriennummer welche der miniDLNA-Dienst als Teil seiner XML-" ++"Beschreibung an Clients versendet." ++ ++msgid "" ++"Set this if you want to customize the name that shows up on your clients." ++msgstr "Diesen Wert setzen um den auf Clients angezeigten Namen zu verändern." ++ ++msgid "" ++"Set this if you would like to specify the directory where you want MiniDLNA " ++"to store its database and album art cache." ++msgstr "" ++"Diesen Wert setzen um das Verzeichnis zu bestimmen in dem miniDLNA seine " ++"Datenbank und den Cover-Bild-Speicher ablegt." ++ ++msgid "" ++"Set this if you would like to specify the directory where you want MiniDLNA " ++"to store its log file." ++msgstr "" ++"Diesen Wert setzen um das Verzeichnis zu bestimmen in dem miniDLNA seine " ++"Protokolldateien ablegt." ++ ++msgid "" ++"Set this to enable inotify monitoring to automatically discover new files." ++msgstr "" ++"Diese Option aktivieren um den Inotify-Mechanismus zum Entdecken neuer " ++"Dateien zu benutzen." ++ ++msgid "" ++"Set this to enable support for streaming .jpg and .mp3 files to a TiVo " ++"supporting HMO." ++msgstr "" ++"Diese Option aktivieren um die Unterstützung von JPEG- und MP3-Streaming zu " ++"HMO-TiVo-Geräten zu aktivieren." ++ ++msgid "" ++"Set this to strictly adhere to DLNA standards. This will allow server-side " ++"downscaling of very large JPEG images, which may hurt JPEG serving " ++"performance on (at least) Sony DLNA products." ++msgstr "" ++"Diese Option setzen um den DLNA-Standard strikt einzuhalten. Damit wird " ++"serverseitiges Herunterskalieren von JPEG-Bildern aktviert was die " ++"Auslieferunsgeschwindigkeit in Verbindung mit Sony DLNA-Produkten negativ " ++"beeinflussen kann." ++ ++msgid "" ++"Set this to the directory you want scanned. If you want to restrict the " ++"directory to a specific content type, you can prepend the type ('A' for " ++"audio, 'V' for video, 'P' for images), followed by a comma, to the directory " ++"(eg. media_dir=A,/mnt/media/Music). Multiple directories can be specified." ++msgstr "" ++"Spezifiziert die zu durchsuchenden Medienverzeichnisse. Durch Voranstellung " ++"eines Buchstaben gefolgt von einem Komma kann ein Verzeichnis auf einen " ++"bestimmten Typ eingeschränkt werden; 'A' für Audio-, 'V' für Video- und 'P' " ++"für Bild-Verzeichnisse. Es können mehrere Verzeichnisse angegeben werden." ++ ++msgid "Specify the path to the MiniSSDPd socket." ++msgstr "Spezifiziert den Pfad zur MiniSSDPd-Socket-Datei." ++ ++msgid "Standard container" ++msgstr "Standard-Container" ++ ++msgid "Strict to DLNA standard:" ++msgstr "Stikt nach DLNA-Standard:" ++ ++msgid "" ++"The miniDLNA service is active, serving %d audio, %d video and %d image " ++"files." ++msgstr "" ++"Der miniDLNA-Dienst ist aktiv und publiziert %d Audio-, %d Video- und %d " ++"Bild-Dateien." ++ ++msgid "The miniDLNA service is not running." ++msgstr "Der miniDLNA-Dienst ist inaktiv." ++ ++msgid "This is a list of file names to check for when searching for album art." ++msgstr "" ++"Dies ist eine Liste von Dateinamen, die geprüft werden sollen wenn nach " ++"Cover-Bildern gesucht wird." ++ ++msgid "Video" ++msgstr "Video" ++ ++msgid "miniDLNA" ++msgstr "miniDLNA" ++ ++msgid "miniDLNA Status" ++msgstr "miniDLNA-Status" ++ ++msgid "miniSSDP socket:" ++msgstr "miniSSDP-Socket:" ++ ++#~ msgid "Network interfaces to serve, comma delimited list." ++#~ msgstr "" ++#~ "Lister dee bedienten Netzwerkschnittstellen als Komma-getrennte Liste." ++ ++#~ msgid "" ++#~ "This is a list of file names to check for when searching for album art. " ++#~ "Note: names must be delimited with a forward slash '/'" ++#~ msgstr "" ++#~ "Dies ist eine Liste von zu prüfenden Dateinamen wenn nach Album-Covern " ++#~ "gesucht wird. Hinweis: Namen müssen mit einem Schrägstrich ('/') getrennt " ++#~ "werden." +diff --git a/feeds/luci/applications/luci-app-minidlna/po/el/minidlna.po b/feeds/luci/applications/luci-app-minidlna/po/el/minidlna.po +new file mode 100644 +index 0000000..48c6188 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-minidlna/po/el/minidlna.po +@@ -0,0 +1,164 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Last-Translator: Automatically generated\n" ++"Language-Team: none\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n != 1);\n" ++ ++msgid "Advanced Settings" ++msgstr "" ++ ++msgid "Album art names:" ++msgstr "" ++ ++msgid "Announced model number:" ++msgstr "" ++ ++msgid "Announced serial number:" ++msgstr "" ++ ++msgid "Browse directory" ++msgstr "" ++ ++msgid "Collecting data..." ++msgstr "" ++ ++msgid "Database directory:" ++msgstr "" ++ ++msgid "Enable TIVO:" ++msgstr "" ++ ++msgid "Enable inotify:" ++msgstr "" ++ ++msgid "Enable:" ++msgstr "" ++ ++msgid "Friendly name:" ++msgstr "" ++ ++msgid "General Settings" ++msgstr "" ++ ++msgid "Interfaces:" ++msgstr "" ++ ++msgid "Log directory:" ++msgstr "" ++ ++msgid "Media directories:" ++msgstr "" ++ ++msgid "" ++"MiniDLNA is server software with the aim of being fully compliant with DLNA/" ++"UPnP-AV clients." ++msgstr "" ++ ++msgid "" ++"Model number the miniDLNA daemon will report to clients in its XML " ++"description." ++msgstr "" ++ ++msgid "Music" ++msgstr "" ++ ++msgid "Network interfaces to serve." ++msgstr "" ++ ++msgid "Notify interval in seconds." ++msgstr "" ++ ++msgid "Notify interval:" ++msgstr "" ++ ++msgid "Pictures" ++msgstr "" ++ ++msgid "Port for HTTP (descriptions, SOAP, media transfer) traffic." ++msgstr "" ++ ++msgid "Port:" ++msgstr "" ++ ++msgid "Presentation URL:" ++msgstr "" ++ ++msgid "Root container:" ++msgstr "" ++ ++msgid "" ++"Serial number the miniDLNA daemon will report to clients in its XML " ++"description." ++msgstr "" ++ ++msgid "" ++"Set this if you want to customize the name that shows up on your clients." ++msgstr "" ++ ++msgid "" ++"Set this if you would like to specify the directory where you want MiniDLNA " ++"to store its database and album art cache." ++msgstr "" ++ ++msgid "" ++"Set this if you would like to specify the directory where you want MiniDLNA " ++"to store its log file." ++msgstr "" ++ ++msgid "" ++"Set this to enable inotify monitoring to automatically discover new files." ++msgstr "" ++ ++msgid "" ++"Set this to enable support for streaming .jpg and .mp3 files to a TiVo " ++"supporting HMO." ++msgstr "" ++ ++msgid "" ++"Set this to strictly adhere to DLNA standards. This will allow server-side " ++"downscaling of very large JPEG images, which may hurt JPEG serving " ++"performance on (at least) Sony DLNA products." ++msgstr "" ++ ++msgid "" ++"Set this to the directory you want scanned. If you want to restrict the " ++"directory to a specific content type, you can prepend the type ('A' for " ++"audio, 'V' for video, 'P' for images), followed by a comma, to the directory " ++"(eg. media_dir=A,/mnt/media/Music). Multiple directories can be specified." ++msgstr "" ++ ++msgid "Specify the path to the MiniSSDPd socket." ++msgstr "" ++ ++msgid "Standard container" ++msgstr "" ++ ++msgid "Strict to DLNA standard:" ++msgstr "" ++ ++msgid "" ++"The miniDLNA service is active, serving %d audio, %d video and %d image " ++"files." ++msgstr "" ++ ++msgid "The miniDLNA service is not running." ++msgstr "" ++ ++msgid "This is a list of file names to check for when searching for album art." ++msgstr "" ++ ++msgid "Video" ++msgstr "" ++ ++msgid "miniDLNA" ++msgstr "" ++ ++msgid "miniDLNA Status" ++msgstr "" ++ ++msgid "miniSSDP socket:" ++msgstr "" +diff --git a/feeds/luci/applications/luci-app-minidlna/po/en/minidlna.po b/feeds/luci/applications/luci-app-minidlna/po/en/minidlna.po +new file mode 100644 +index 0000000..5934d42 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-minidlna/po/en/minidlna.po +@@ -0,0 +1,195 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Last-Translator: Automatically generated\n" ++"Language-Team: none\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n != 1);\n" ++ ++msgid "Advanced Settings" ++msgstr "" ++ ++msgid "Album art names:" ++msgstr "Album art names:" ++ ++msgid "Announced model number:" ++msgstr "Announced model number:" ++ ++msgid "Announced serial number:" ++msgstr "Announced serial number:" ++ ++msgid "Browse directory" ++msgstr "Browse directory" ++ ++msgid "Collecting data..." ++msgstr "" ++ ++msgid "Database directory:" ++msgstr "Database directory:" ++ ++msgid "Enable TIVO:" ++msgstr "Enable TIVO:" ++ ++msgid "Enable inotify:" ++msgstr "Enable inotify:" ++ ++msgid "Enable:" ++msgstr "Enable:" ++ ++msgid "Friendly name:" ++msgstr "Friendly name:" ++ ++msgid "General Settings" ++msgstr "" ++ ++msgid "Interfaces:" ++msgstr "Interfaces:" ++ ++msgid "Log directory:" ++msgstr "Log directory:" ++ ++msgid "Media directories:" ++msgstr "Media directories:" ++ ++msgid "" ++"MiniDLNA is server software with the aim of being fully compliant with DLNA/" ++"UPnP-AV clients." ++msgstr "" ++"MiniDLNA is server software with the aim of being fully compliant with DLNA/" ++"UPnP-AV clients." ++ ++msgid "" ++"Model number the miniDLNA daemon will report to clients in its XML " ++"description." ++msgstr "" ++"Model number the miniDLNA daemon will report to clients in its XML " ++"description." ++ ++msgid "Music" ++msgstr "Music" ++ ++msgid "Network interfaces to serve." ++msgstr "" ++ ++msgid "Notify interval in seconds." ++msgstr "Notify interval in seconds." ++ ++msgid "Notify interval:" ++msgstr "Notify interval:" ++ ++msgid "Pictures" ++msgstr "Pictures" ++ ++msgid "Port for HTTP (descriptions, SOAP, media transfer) traffic." ++msgstr "Port for HTTP (descriptions, SOAP, media transfer) traffic." ++ ++msgid "Port:" ++msgstr "Port:" ++ ++msgid "Presentation URL:" ++msgstr "Presentation URL:" ++ ++msgid "Root container:" ++msgstr "Root container:" ++ ++msgid "" ++"Serial number the miniDLNA daemon will report to clients in its XML " ++"description." ++msgstr "" ++"Serial number the miniDLNA daemon will report to clients in its XML " ++"description." ++ ++msgid "" ++"Set this if you want to customize the name that shows up on your clients." ++msgstr "" ++"Set this if you want to customize the name that shows up on your clients." ++ ++msgid "" ++"Set this if you would like to specify the directory where you want MiniDLNA " ++"to store its database and album art cache." ++msgstr "" ++"Set this if you would like to specify the directory where you want MiniDLNA " ++"to store its database and album art cache." ++ ++msgid "" ++"Set this if you would like to specify the directory where you want MiniDLNA " ++"to store its log file." ++msgstr "" ++"Set this if you would like to specify the directory where you want MiniDLNA " ++"to store its log file." ++ ++msgid "" ++"Set this to enable inotify monitoring to automatically discover new files." ++msgstr "" ++"Set this to enable inotify monitoring to automatically discover new files." ++ ++msgid "" ++"Set this to enable support for streaming .jpg and .mp3 files to a TiVo " ++"supporting HMO." ++msgstr "" ++"Set this to enable support for streaming .jpg and .mp3 files to a TiVo " ++"supporting HMO." ++ ++msgid "" ++"Set this to strictly adhere to DLNA standards. This will allow server-side " ++"downscaling of very large JPEG images, which may hurt JPEG serving " ++"performance on (at least) Sony DLNA products." ++msgstr "" ++"Set this to strictly adhere to DLNA standards. This will allow server-side " ++"downscaling of very large JPEG images, which may hurt JPEG serving " ++"performance on (at least) Sony DLNA products." ++ ++msgid "" ++"Set this to the directory you want scanned. If you want to restrict the " ++"directory to a specific content type, you can prepend the type ('A' for " ++"audio, 'V' for video, 'P' for images), followed by a comma, to the directory " ++"(eg. media_dir=A,/mnt/media/Music). Multiple directories can be specified." ++msgstr "" ++"Set this to the directory you want scanned. If you want to restrict the " ++"directory to a specific content type, you can prepend the type ('A' for " ++"audio, 'V' for video, 'P' for images), followed by a comma, to the directory " ++"(eg. media_dir=A,/mnt/media/Music). Multiple directories can be specified." ++ ++msgid "Specify the path to the MiniSSDPd socket." ++msgstr "Specify the path to the MiniSSDPd socket." ++ ++msgid "Standard container" ++msgstr "Standard container" ++ ++msgid "Strict to DLNA standard:" ++msgstr "Strict to DLNA standard:" ++ ++msgid "" ++"The miniDLNA service is active, serving %d audio, %d video and %d image " ++"files." ++msgstr "" ++ ++msgid "The miniDLNA service is not running." ++msgstr "" ++ ++msgid "This is a list of file names to check for when searching for album art." ++msgstr "" ++ ++msgid "Video" ++msgstr "Video" ++ ++msgid "miniDLNA" ++msgstr "miniDLNA" ++ ++msgid "miniDLNA Status" ++msgstr "" ++ ++msgid "miniSSDP socket:" ++msgstr "miniSSDP socket:" ++ ++#~ msgid "Network interfaces to serve, comma delimited list." ++#~ msgstr "Network interfaces to serve, comma delimited list." ++ ++#~ msgid "" ++#~ "This is a list of file names to check for when searching for album art. " ++#~ "Note: names must be delimited with a forward slash '/'" ++#~ msgstr "" ++#~ "This is a list of file names to check for when searching for album art. " ++#~ "Note: names must be delimited with a forward slash '/'" +diff --git a/feeds/luci/applications/luci-app-minidlna/po/es/minidlna.po b/feeds/luci/applications/luci-app-minidlna/po/es/minidlna.po +new file mode 100644 +index 0000000..5f6b396 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-minidlna/po/es/minidlna.po +@@ -0,0 +1,184 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"PO-Revision-Date: 2013-09-01 09:07+0200\n" ++"Last-Translator: José Vicente \n" ++"Language-Team: none\n" ++"Language: es\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n != 1);\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "Advanced Settings" ++msgstr "Configuración avanzada" ++ ++msgid "Album art names:" ++msgstr "Imágenes de álbumes:" ++ ++msgid "Announced model number:" ++msgstr "Número de modelo declarado:" ++ ++msgid "Announced serial number:" ++msgstr "Número de serie declarado:" ++ ++msgid "Browse directory" ++msgstr "Ver directorio" ++ ++msgid "Collecting data..." ++msgstr "Recopilando información..." ++ ++msgid "Database directory:" ++msgstr "Directorio de la base de datos:" ++ ++msgid "Enable TIVO:" ++msgstr "Activar TIVO:" ++ ++msgid "Enable inotify:" ++msgstr "Activar inotify:" ++ ++msgid "Enable:" ++msgstr "Activar:" ++ ++msgid "Friendly name:" ++msgstr "Nombre amigable:" ++ ++msgid "General Settings" ++msgstr "Configuración general" ++ ++msgid "Interfaces:" ++msgstr "Interfaces:" ++ ++msgid "Log directory:" ++msgstr "Directorio de registro:" ++ ++msgid "Media directories:" ++msgstr "Directorios de medios:" ++ ++msgid "" ++"MiniDLNA is server software with the aim of being fully compliant with DLNA/" ++"UPnP-AV clients." ++msgstr "" ++"MiniDLNA es un servidor que buscar ser compatible con clientes DLNA/UPnP-AV." ++ ++msgid "" ++"Model number the miniDLNA daemon will report to clients in its XML " ++"description." ++msgstr "" ++"Número de modelo que el demonio miniDLNA mostrará a los clientes en su " ++"descripción XML." ++ ++msgid "Music" ++msgstr "Música" ++ ++msgid "Network interfaces to serve." ++msgstr "Interfaces de red a usar." ++ ++msgid "Notify interval in seconds." ++msgstr "Intervalo de notificación en segundos." ++ ++msgid "Notify interval:" ++msgstr "Intervalo de notificación:" ++ ++msgid "Pictures" ++msgstr "Imágenes" ++ ++msgid "Port for HTTP (descriptions, SOAP, media transfer) traffic." ++msgstr "" ++"Puerto para tráfico HTTP (descripciones, SOAP y transferencia de medios)." ++ ++msgid "Port:" ++msgstr "Puerto:" ++ ++msgid "Presentation URL:" ++msgstr "URL de presentación:" ++ ++msgid "Root container:" ++msgstr "Raíz de contenidos:" ++ ++msgid "" ++"Serial number the miniDLNA daemon will report to clients in its XML " ++"description." ++msgstr "" ++"Número de serie que el demonio miniDLNA informará a los clientes en su " ++"descripción XML." ++ ++msgid "" ++"Set this if you want to customize the name that shows up on your clients." ++msgstr "Personalizar el nombre mostrado a los clientes." ++ ++msgid "" ++"Set this if you would like to specify the directory where you want MiniDLNA " ++"to store its database and album art cache." ++msgstr "" ++"Indicar el directorio en el que MiniDLNA guardará su base de datos y la " ++"caché de álbumes." ++ ++msgid "" ++"Set this if you would like to specify the directory where you want MiniDLNA " ++"to store its log file." ++msgstr "Indicar el directorio donde MiniDLNA guardará su archivo de registro." ++ ++msgid "" ++"Set this to enable inotify monitoring to automatically discover new files." ++msgstr "Inotify descubrirá automáticamente nuevos archivos." ++ ++msgid "" ++"Set this to enable support for streaming .jpg and .mp3 files to a TiVo " ++"supporting HMO." ++msgstr "Envío de archivos .jpg y .mp3 a un TiVo usando HMO." ++ ++msgid "" ++"Set this to strictly adhere to DLNA standards. This will allow server-side " ++"downscaling of very large JPEG images, which may hurt JPEG serving " ++"performance on (at least) Sony DLNA products." ++msgstr "" ++"Seguir estrictamente el estándar DLNA. Esto permite el reescalado desde el " ++"servidor de imágenes JPEG grandes que pueden perjudicar el rendimiento en " ++"(al menos) productos DLNA de Sony." ++ ++msgid "" ++"Set this to the directory you want scanned. If you want to restrict the " ++"directory to a specific content type, you can prepend the type ('A' for " ++"audio, 'V' for video, 'P' for images), followed by a comma, to the directory " ++"(eg. media_dir=A,/mnt/media/Music). Multiple directories can be specified." ++msgstr "" ++"Directorio a explorar. Si quiere restringir el directorio a un contenido " ++"específico puede añadir el tipo ('A' par audio, 'V' para vídeo o 'P' para " ++"imágenes), seguido por una coma al nombre del directorio (ej. media_dir=A,/" ++"mnt/media/Music). Se puede establecer varios directorios." ++ ++msgid "Specify the path to the MiniSSDPd socket." ++msgstr "Camino al socket de MiniSSDPd." ++ ++msgid "Standard container" ++msgstr "Contenedor estándar" ++ ++msgid "Strict to DLNA standard:" ++msgstr "Ceñirse al estándar DLNA:" ++ ++msgid "" ++"The miniDLNA service is active, serving %d audio, %d video and %d image " ++"files." ++msgstr "" ++"El servicio miniDLNA está activo, sirviendo %d archivos de audio, %d de " ++"vídeo y %d de imágenes." ++ ++msgid "The miniDLNA service is not running." ++msgstr "El servicio miniDLNA no está arrancado." ++ ++msgid "This is a list of file names to check for when searching for album art." ++msgstr "Lista de nombres a comprobar para buscar imágenes de álbumes." ++ ++msgid "Video" ++msgstr "Vídeo" ++ ++msgid "miniDLNA" ++msgstr "miniDLNA" ++ ++msgid "miniDLNA Status" ++msgstr "Estado de miniDLNA" ++ ++msgid "miniSSDP socket:" ++msgstr "Socket de miniSSDP:" +diff --git a/feeds/luci/applications/luci-app-minidlna/po/fr/minidlna.po b/feeds/luci/applications/luci-app-minidlna/po/fr/minidlna.po +new file mode 100644 +index 0000000..d638b0c +--- /dev/null ++++ b/feeds/luci/applications/luci-app-minidlna/po/fr/minidlna.po +@@ -0,0 +1,164 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Last-Translator: Automatically generated\n" ++"Language-Team: none\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n > 1);\n" ++ ++msgid "Advanced Settings" ++msgstr "" ++ ++msgid "Album art names:" ++msgstr "" ++ ++msgid "Announced model number:" ++msgstr "" ++ ++msgid "Announced serial number:" ++msgstr "" ++ ++msgid "Browse directory" ++msgstr "" ++ ++msgid "Collecting data..." ++msgstr "" ++ ++msgid "Database directory:" ++msgstr "" ++ ++msgid "Enable TIVO:" ++msgstr "" ++ ++msgid "Enable inotify:" ++msgstr "" ++ ++msgid "Enable:" ++msgstr "" ++ ++msgid "Friendly name:" ++msgstr "" ++ ++msgid "General Settings" ++msgstr "" ++ ++msgid "Interfaces:" ++msgstr "" ++ ++msgid "Log directory:" ++msgstr "" ++ ++msgid "Media directories:" ++msgstr "" ++ ++msgid "" ++"MiniDLNA is server software with the aim of being fully compliant with DLNA/" ++"UPnP-AV clients." ++msgstr "" ++ ++msgid "" ++"Model number the miniDLNA daemon will report to clients in its XML " ++"description." ++msgstr "" ++ ++msgid "Music" ++msgstr "" ++ ++msgid "Network interfaces to serve." ++msgstr "" ++ ++msgid "Notify interval in seconds." ++msgstr "" ++ ++msgid "Notify interval:" ++msgstr "" ++ ++msgid "Pictures" ++msgstr "" ++ ++msgid "Port for HTTP (descriptions, SOAP, media transfer) traffic." ++msgstr "" ++ ++msgid "Port:" ++msgstr "" ++ ++msgid "Presentation URL:" ++msgstr "" ++ ++msgid "Root container:" ++msgstr "" ++ ++msgid "" ++"Serial number the miniDLNA daemon will report to clients in its XML " ++"description." ++msgstr "" ++ ++msgid "" ++"Set this if you want to customize the name that shows up on your clients." ++msgstr "" ++ ++msgid "" ++"Set this if you would like to specify the directory where you want MiniDLNA " ++"to store its database and album art cache." ++msgstr "" ++ ++msgid "" ++"Set this if you would like to specify the directory where you want MiniDLNA " ++"to store its log file." ++msgstr "" ++ ++msgid "" ++"Set this to enable inotify monitoring to automatically discover new files." ++msgstr "" ++ ++msgid "" ++"Set this to enable support for streaming .jpg and .mp3 files to a TiVo " ++"supporting HMO." ++msgstr "" ++ ++msgid "" ++"Set this to strictly adhere to DLNA standards. This will allow server-side " ++"downscaling of very large JPEG images, which may hurt JPEG serving " ++"performance on (at least) Sony DLNA products." ++msgstr "" ++ ++msgid "" ++"Set this to the directory you want scanned. If you want to restrict the " ++"directory to a specific content type, you can prepend the type ('A' for " ++"audio, 'V' for video, 'P' for images), followed by a comma, to the directory " ++"(eg. media_dir=A,/mnt/media/Music). Multiple directories can be specified." ++msgstr "" ++ ++msgid "Specify the path to the MiniSSDPd socket." ++msgstr "" ++ ++msgid "Standard container" ++msgstr "" ++ ++msgid "Strict to DLNA standard:" ++msgstr "" ++ ++msgid "" ++"The miniDLNA service is active, serving %d audio, %d video and %d image " ++"files." ++msgstr "" ++ ++msgid "The miniDLNA service is not running." ++msgstr "" ++ ++msgid "This is a list of file names to check for when searching for album art." ++msgstr "" ++ ++msgid "Video" ++msgstr "" ++ ++msgid "miniDLNA" ++msgstr "" ++ ++msgid "miniDLNA Status" ++msgstr "" ++ ++msgid "miniSSDP socket:" ++msgstr "" +diff --git a/feeds/luci/applications/luci-app-minidlna/po/he/minidlna.po b/feeds/luci/applications/luci-app-minidlna/po/he/minidlna.po +new file mode 100644 +index 0000000..48c6188 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-minidlna/po/he/minidlna.po +@@ -0,0 +1,164 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Last-Translator: Automatically generated\n" ++"Language-Team: none\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n != 1);\n" ++ ++msgid "Advanced Settings" ++msgstr "" ++ ++msgid "Album art names:" ++msgstr "" ++ ++msgid "Announced model number:" ++msgstr "" ++ ++msgid "Announced serial number:" ++msgstr "" ++ ++msgid "Browse directory" ++msgstr "" ++ ++msgid "Collecting data..." ++msgstr "" ++ ++msgid "Database directory:" ++msgstr "" ++ ++msgid "Enable TIVO:" ++msgstr "" ++ ++msgid "Enable inotify:" ++msgstr "" ++ ++msgid "Enable:" ++msgstr "" ++ ++msgid "Friendly name:" ++msgstr "" ++ ++msgid "General Settings" ++msgstr "" ++ ++msgid "Interfaces:" ++msgstr "" ++ ++msgid "Log directory:" ++msgstr "" ++ ++msgid "Media directories:" ++msgstr "" ++ ++msgid "" ++"MiniDLNA is server software with the aim of being fully compliant with DLNA/" ++"UPnP-AV clients." ++msgstr "" ++ ++msgid "" ++"Model number the miniDLNA daemon will report to clients in its XML " ++"description." ++msgstr "" ++ ++msgid "Music" ++msgstr "" ++ ++msgid "Network interfaces to serve." ++msgstr "" ++ ++msgid "Notify interval in seconds." ++msgstr "" ++ ++msgid "Notify interval:" ++msgstr "" ++ ++msgid "Pictures" ++msgstr "" ++ ++msgid "Port for HTTP (descriptions, SOAP, media transfer) traffic." ++msgstr "" ++ ++msgid "Port:" ++msgstr "" ++ ++msgid "Presentation URL:" ++msgstr "" ++ ++msgid "Root container:" ++msgstr "" ++ ++msgid "" ++"Serial number the miniDLNA daemon will report to clients in its XML " ++"description." ++msgstr "" ++ ++msgid "" ++"Set this if you want to customize the name that shows up on your clients." ++msgstr "" ++ ++msgid "" ++"Set this if you would like to specify the directory where you want MiniDLNA " ++"to store its database and album art cache." ++msgstr "" ++ ++msgid "" ++"Set this if you would like to specify the directory where you want MiniDLNA " ++"to store its log file." ++msgstr "" ++ ++msgid "" ++"Set this to enable inotify monitoring to automatically discover new files." ++msgstr "" ++ ++msgid "" ++"Set this to enable support for streaming .jpg and .mp3 files to a TiVo " ++"supporting HMO." ++msgstr "" ++ ++msgid "" ++"Set this to strictly adhere to DLNA standards. This will allow server-side " ++"downscaling of very large JPEG images, which may hurt JPEG serving " ++"performance on (at least) Sony DLNA products." ++msgstr "" ++ ++msgid "" ++"Set this to the directory you want scanned. If you want to restrict the " ++"directory to a specific content type, you can prepend the type ('A' for " ++"audio, 'V' for video, 'P' for images), followed by a comma, to the directory " ++"(eg. media_dir=A,/mnt/media/Music). Multiple directories can be specified." ++msgstr "" ++ ++msgid "Specify the path to the MiniSSDPd socket." ++msgstr "" ++ ++msgid "Standard container" ++msgstr "" ++ ++msgid "Strict to DLNA standard:" ++msgstr "" ++ ++msgid "" ++"The miniDLNA service is active, serving %d audio, %d video and %d image " ++"files." ++msgstr "" ++ ++msgid "The miniDLNA service is not running." ++msgstr "" ++ ++msgid "This is a list of file names to check for when searching for album art." ++msgstr "" ++ ++msgid "Video" ++msgstr "" ++ ++msgid "miniDLNA" ++msgstr "" ++ ++msgid "miniDLNA Status" ++msgstr "" ++ ++msgid "miniSSDP socket:" ++msgstr "" +diff --git a/feeds/luci/applications/luci-app-minidlna/po/hu/minidlna.po b/feeds/luci/applications/luci-app-minidlna/po/hu/minidlna.po +new file mode 100644 +index 0000000..52fbe74 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-minidlna/po/hu/minidlna.po +@@ -0,0 +1,199 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"PO-Revision-Date: 2012-04-09 19:18+0200\n" ++"Last-Translator: Gábor \n" ++"Language-Team: none\n" ++"Language: hu\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n != 1);\n" ++"X-Generator: Pootle 2.0.4\n" ++ ++msgid "Advanced Settings" ++msgstr "Haladó beállítások" ++ ++msgid "Album art names:" ++msgstr "Borító album nevek:" ++ ++msgid "Announced model number:" ++msgstr "Közölt modellszám:" ++ ++msgid "Announced serial number:" ++msgstr "Közölt sorozatszám:" ++ ++msgid "Browse directory" ++msgstr "Könyvtár tallózása" ++ ++msgid "Collecting data..." ++msgstr "Adatok gyűjtése..." ++ ++msgid "Database directory:" ++msgstr "Adatbázis könyvtár:" ++ ++msgid "Enable TIVO:" ++msgstr "TIVO engedélyezése:" ++ ++msgid "Enable inotify:" ++msgstr "Inotify engedélyezése:" ++ ++msgid "Enable:" ++msgstr "Engedélyezés:" ++ ++msgid "Friendly name:" ++msgstr "Egyéni név:" ++ ++msgid "General Settings" ++msgstr "Ãltalános beállítások" ++ ++msgid "Interfaces:" ++msgstr "Interfészek:" ++ ++msgid "Log directory:" ++msgstr "Napló könyvtár:" ++ ++msgid "Media directories:" ++msgstr "Média könyvtárak:" ++ ++msgid "" ++"MiniDLNA is server software with the aim of being fully compliant with DLNA/" ++"UPnP-AV clients." ++msgstr "" ++"A MiniDLNA egy szerver alkalmazás, ami teljes mértékben kompatibilis a DLNA/" ++"UPnP-AV képes kliensekkel." ++ ++msgid "" ++"Model number the miniDLNA daemon will report to clients in its XML " ++"description." ++msgstr "" ++"A miniDLNA által az XML leírásban jelentett modellszám a kliensek számára." ++ ++msgid "Music" ++msgstr "Zene" ++ ++msgid "Network interfaces to serve." ++msgstr "Kiszolgált hálózati interfészek." ++ ++msgid "Notify interval in seconds." ++msgstr "Értesítés intervalluma másodpercben." ++ ++msgid "Notify interval:" ++msgstr "Értesítési intervallum:" ++ ++msgid "Pictures" ++msgstr "Képek" ++ ++msgid "Port for HTTP (descriptions, SOAP, media transfer) traffic." ++msgstr "HTTP forgalom (leírások, SOAP, média átvitel) portja." ++ ++msgid "Port:" ++msgstr "Port:" ++ ++msgid "Presentation URL:" ++msgstr "Szolgáltatott URL:" ++ ++msgid "Root container:" ++msgstr "Gyökér konténer:" ++ ++msgid "" ++"Serial number the miniDLNA daemon will report to clients in its XML " ++"description." ++msgstr "" ++"A miniDLNA által az XML leírásban jelentett szériaszám a kliensek számára." ++ ++msgid "" ++"Set this if you want to customize the name that shows up on your clients." ++msgstr "" ++"Ãllítsa be, amennyiben a kliensek számára megjelenÅ‘ nevet szeretné testre " ++"szabni." ++ ++msgid "" ++"Set this if you would like to specify the directory where you want MiniDLNA " ++"to store its database and album art cache." ++msgstr "" ++"Ãllítsa be, ha meg szeretné adni azt könyvtárat, ahová a a MiniDLNA az " ++"adatbázisát, illetve az album borító gyorsítótárat rögzítse." ++ ++msgid "" ++"Set this if you would like to specify the directory where you want MiniDLNA " ++"to store its log file." ++msgstr "" ++"Ãttítsa be, ha meg szeretné adni azt a könyvtárat, ahová a MiniDLNA a napló " ++"állományait mentse." ++ ++msgid "" ++"Set this to enable inotify monitoring to automatically discover new files." ++msgstr "" ++"Engedélyezze az új fájlok automatikus felfedezéséhez szükséges inotify " ++"monitorozáshoz." ++ ++msgid "" ++"Set this to enable support for streaming .jpg and .mp3 files to a TiVo " ++"supporting HMO." ++msgstr "" ++"Engedélyezze a .jpg és .mp3 fájlok közvetítéséhez TiVo támogatott HMO-k felé." ++ ++msgid "" ++"Set this to strictly adhere to DLNA standards. This will allow server-side " ++"downscaling of very large JPEG images, which may hurt JPEG serving " ++"performance on (at least) Sony DLNA products." ++msgstr "" ++"Engedélyezze a DLNA követelmények szigorú betartásához. Ez lehetÅ‘vé teszi a " ++"nagyon nagy JPEG képek szerver oldali leméretezését, amik pl. a Sony DLNA " ++"termékek JPEG kiszolgáló teljesítményére nincsenek kedvezÅ‘ hatással." ++ ++msgid "" ++"Set this to the directory you want scanned. If you want to restrict the " ++"directory to a specific content type, you can prepend the type ('A' for " ++"audio, 'V' for video, 'P' for images), followed by a comma, to the directory " ++"(eg. media_dir=A,/mnt/media/Music). Multiple directories can be specified." ++msgstr "" ++"Ãllítsa be a vizsgálandó könyvtárra. Ha a könyvtárat egy adott típusú " ++"tartalom szerint szeretné korlátozni, akkor a neve elÅ‘tt vesszÅ‘vel " ++"elválasztva megadhatja a típust ('A' az audió, 'V' a videó, 'P' a képek " ++"számára. pl.: media_dir=A,/mnt/media/Music). Több könyvtár is megadható." ++ ++msgid "Specify the path to the MiniSSDPd socket." ++msgstr "A MiniSSDPd socket elérési útját határozza meg." ++ ++msgid "Standard container" ++msgstr "Szabvány konténer" ++ ++msgid "Strict to DLNA standard:" ++msgstr "DLNA követelmények szigorú betartása:" ++ ++msgid "" ++"The miniDLNA service is active, serving %d audio, %d video and %d image " ++"files." ++msgstr "" ++"A miniDLNA szolgáltatás aktív, %d hang, %d videó, %d kép fájl található. " ++ ++msgid "The miniDLNA service is not running." ++msgstr "A miniDLNA szolgáltatás nem aktív." ++ ++msgid "This is a list of file names to check for when searching for album art." ++msgstr "Fájlnevek listája, amik ellenÅ‘rzésre kerülnek albumborító keresésekor." ++ ++msgid "Video" ++msgstr "Videó" ++ ++msgid "miniDLNA" ++msgstr "miniDLNA" ++ ++msgid "miniDLNA Status" ++msgstr "miniDLNA állapot" ++ ++msgid "miniSSDP socket:" ++msgstr "miniSSDP socket:" ++ ++#~ msgid "Network interfaces to serve, comma delimited list." ++#~ msgstr "Kiszolgált hálózati interfészek vesszÅ‘vel elválasztott listája." ++ ++#~ msgid "" ++#~ "This is a list of file names to check for when searching for album art. " ++#~ "Note: names must be delimited with a forward slash '/'" ++#~ msgstr "" ++#~ "Ez egy lista azokról a fájlnevekrÅ‘l, amelyeket ellenÅ‘rizni kell a " ++#~ "lemezborító keresésekor. Megjegyzés: a neveket per jellel ('/') kell " ++#~ "elválasztani egymástól." +diff --git a/feeds/luci/applications/luci-app-minidlna/po/it/minidlna.po b/feeds/luci/applications/luci-app-minidlna/po/it/minidlna.po +new file mode 100644 +index 0000000..1c0abc6 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-minidlna/po/it/minidlna.po +@@ -0,0 +1,194 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"PO-Revision-Date: 2014-08-05 11:41+0200\n" ++"Last-Translator: morganfw \n" ++"Language-Team: none\n" ++"Language: it\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n != 1);\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "Advanced Settings" ++msgstr "Opzioni avanzate" ++ ++msgid "Album art names:" ++msgstr "Nome Copertina Album:" ++ ++msgid "Announced model number:" ++msgstr "Numero modello annunciato:" ++ ++msgid "Announced serial number:" ++msgstr "Numero seriale annunciato:" ++ ++msgid "Browse directory" ++msgstr "Esplora directory" ++ ++msgid "Collecting data..." ++msgstr "Recuperando i dati..." ++ ++msgid "Database directory:" ++msgstr "Directory database:" ++ ++msgid "Enable TIVO:" ++msgstr "Abilita TIVO:" ++ ++msgid "Enable inotify:" ++msgstr "Abilita inotify:" ++ ++msgid "Enable:" ++msgstr "Abilita:" ++ ++msgid "Friendly name:" ++msgstr "Nome Comune:" ++ ++msgid "General Settings" ++msgstr "Impostazioni generali" ++ ++msgid "Interfaces:" ++msgstr "Interfacce:" ++ ++msgid "Log directory:" ++msgstr "Directory di log:" ++ ++msgid "Media directories:" ++msgstr "Cartelle Supporto:" ++ ++msgid "" ++"MiniDLNA is server software with the aim of being fully compliant with DLNA/" ++"UPnP-AV clients." ++msgstr "" ++"MiniDLNA è un server il cui intento è di essere completamente compatibile " ++"con i DLNA/UPnP-AV client disponibili." ++ ++msgid "" ++"Model number the miniDLNA daemon will report to clients in its XML " ++"description." ++msgstr "" ++"Numero del modello che il demone miniDLNA riporterà ai client nella sua " ++"descrizione XML." ++ ++msgid "Music" ++msgstr "Musica" ++ ++msgid "Network interfaces to serve." ++msgstr "Interfaccia di rete usata." ++ ++msgid "Notify interval in seconds." ++msgstr "Intervallo di notifica in secondi." ++ ++msgid "Notify interval:" ++msgstr "Intervallo di notifica:" ++ ++msgid "Pictures" ++msgstr "Immagini" ++ ++msgid "Port for HTTP (descriptions, SOAP, media transfer) traffic." ++msgstr "Porta per traffico (descrizione, SOAP, trasferimento supporto) HTTP:" ++ ++msgid "Port:" ++msgstr "Porta:" ++ ++msgid "Presentation URL:" ++msgstr "URL di Presentazione:" ++ ++msgid "Root container:" ++msgstr "Contenitore Principale:" ++ ++msgid "" ++"Serial number the miniDLNA daemon will report to clients in its XML " ++"description." ++msgstr "" ++"Serial number che il server miniDLNA invierà ai client nella descrizione " ++"XML." ++ ++msgid "" ++"Set this if you want to customize the name that shows up on your clients." ++msgstr "Imposta se si desidera personalizzare il nome da mostrare ai client." ++ ++msgid "" ++"Set this if you would like to specify the directory where you want MiniDLNA " ++"to store its database and album art cache." ++msgstr "" ++"Impostare questa opzione se si desidera specificare la cartella in cui si " ++"desidera archiviare i database MiniDLNA e le copertine della cache album." ++ ++msgid "" ++"Set this if you would like to specify the directory where you want MiniDLNA " ++"to store its log file." ++msgstr "" ++"Impostare questa opzione se si desidera specificare la cartella in cui si " ++"desidera che MiniDLNA archivi i propri file di registro." ++ ++msgid "" ++"Set this to enable inotify monitoring to automatically discover new files." ++msgstr "" ++"Impostare questa opzione per consentire il monitoraggio inotify per rilevare " ++"automaticamente i nuovi file." ++ ++msgid "" ++"Set this to enable support for streaming .jpg and .mp3 files to a TiVo " ++"supporting HMO." ++msgstr "" ++"Impostare questo per abilitare il supporto per lo streaming di file .jpg e " ++".mp3 ad un supporto TiVo che supporta HMO." ++ ++msgid "" ++"Set this to strictly adhere to DLNA standards. This will allow server-side " ++"downscaling of very large JPEG images, which may hurt JPEG serving " ++"performance on (at least) Sony DLNA products." ++msgstr "" ++"Impostare questo parametro per far rispettare rigorosamente gli standard " ++"DLNA. Ciò consentirà sul lato server il ridimensionamento delle immagini " ++"JPEG di grandi dimensioni che possono influire negativamente sulle " ++"prestazioni JPEG del servizio su (almeno) i prodotti Sony DLNA." ++ ++msgid "" ++"Set this to the directory you want scanned. If you want to restrict the " ++"directory to a specific content type, you can prepend the type ('A' for " ++"audio, 'V' for video, 'P' for images), followed by a comma, to the directory " ++"(eg. media_dir=A,/mnt/media/Music). Multiple directories can be specified." ++msgstr "" ++"Impostare la cartella che si desidera sottoporre a scansione. Se si desidera " ++"limitare la directory per un tipo di contenuto specifico, è possibile " ++"anteporre il tipo ('A' per l'audio, 'V' per video, 'P' per le immagini), " ++"seguito da una virgola, nella cartella (es. media_dir = A,/mnt/media/Music). " ++"Cartelle multiple possono essere specificate." ++ ++msgid "Specify the path to the MiniSSDPd socket." ++msgstr "Specificare il percorso del socket MiniSSDPd." ++ ++msgid "Standard container" ++msgstr "Contenitore Standard" ++ ++msgid "Strict to DLNA standard:" ++msgstr "Scrupolosamente DLNA standard:" ++ ++msgid "" ++"The miniDLNA service is active, serving %d audio, %d video and %d image " ++"files." ++msgstr "" ++"Il servizio miniDLNA è attivo, servo %d audio, %d video, %d file di " ++"immagine." ++ ++msgid "The miniDLNA service is not running." ++msgstr "Il servizio miniDLNA non è in esecuzione." ++ ++msgid "This is a list of file names to check for when searching for album art." ++msgstr "" ++"Questo è un elenco di nomi di file per verificare la presenza durante la " ++"ricerca di copertine degli album." ++ ++msgid "Video" ++msgstr "Video" ++ ++msgid "miniDLNA" ++msgstr "miniDLNA" ++ ++msgid "miniDLNA Status" ++msgstr "Stato miniDLNA" ++ ++msgid "miniSSDP socket:" ++msgstr "Socket miniSSDP:" +diff --git a/feeds/luci/applications/luci-app-minidlna/po/ja/minidlna.po b/feeds/luci/applications/luci-app-minidlna/po/ja/minidlna.po +new file mode 100644 +index 0000000..4cfc338 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-minidlna/po/ja/minidlna.po +@@ -0,0 +1,198 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"PO-Revision-Date: 2012-04-10 09:10+0200\n" ++"Last-Translator: Kentaro \n" ++"Language-Team: none\n" ++"Language: ja\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=1; plural=0;\n" ++"X-Generator: Pootle 2.0.4\n" ++ ++msgid "Advanced Settings" ++msgstr "詳細設定" ++ ++msgid "Album art names:" ++msgstr "アルãƒãƒ ã‚¢ãƒ¼ãƒˆãƒ¯ãƒ¼ã‚¯ãƒ»ãƒ•ã‚¡ã‚¤ãƒ«å:" ++ ++msgid "Announced model number:" ++msgstr "通知ã™ã‚‹ãƒ¢ãƒ‡ãƒ«ç•ªå·:" ++ ++msgid "Announced serial number:" ++msgstr "通知ã™ã‚‹ã‚·ãƒªã‚¢ãƒ«ãƒŠãƒ³ãƒãƒ¼:" ++ ++msgid "Browse directory" ++msgstr "Browse directory" ++ ++msgid "Collecting data..." ++msgstr "データåŽé›†ä¸­ã§ã™..." ++ ++msgid "Database directory:" ++msgstr "データベース・ディレクトリ:" ++ ++msgid "Enable TIVO:" ++msgstr "TIVO を有効ã«ã™ã‚‹:" ++ ++msgid "Enable inotify:" ++msgstr "inotify を有効ã«ã™ã‚‹:" ++ ++msgid "Enable:" ++msgstr "サービスを有効ã«ã™ã‚‹:" ++ ++msgid "Friendly name:" ++msgstr "Friendlyå:" ++ ++msgid "General Settings" ++msgstr "基本設定" ++ ++msgid "Interfaces:" ++msgstr "インターフェース:" ++ ++msgid "Log directory:" ++msgstr "ログディレクトリ:" ++ ++msgid "Media directories:" ++msgstr "メディアディレクトリ:" ++ ++msgid "" ++"MiniDLNA is server software with the aim of being fully compliant with DLNA/" ++"UPnP-AV clients." ++msgstr "" ++"MiniDLNAã¯ã€DLNA/UPnP-AVクライアントã®å®Œå…¨äº’æ›ã‚’目的ã¨ã—ãŸã‚µãƒ¼ãƒãƒ¼ãƒ»ã‚½ãƒ•ãƒˆ" ++"ウェアã§ã™ã€‚" ++ ++msgid "" ++"Model number the miniDLNA daemon will report to clients in its XML " ++"description." ++msgstr "miniDLNAãŒã‚¯ãƒ©ã‚¤ã‚¢ãƒ³ãƒˆã«é€šçŸ¥ã™ã‚‹XML中ã®ãƒ¢ãƒ‡ãƒ«ç•ªå·ã‚’設定ã—ã¾ã™ã€‚" ++ ++msgid "Music" ++msgstr "ミュージック" ++ ++msgid "Network interfaces to serve." ++msgstr "サービスãŒä½¿ç”¨ã™ã‚‹ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ãƒ»ã‚¤ãƒ³ã‚¿ãƒ¼ãƒ•ã‚§ãƒ¼ã‚¹ã‚’設定ã—ã¾ã™ã€‚" ++ ++msgid "Notify interval in seconds." ++msgstr "通知間隔を秒å˜ä½ã§è¨­å®šã—ã¾ã™ã€‚" ++ ++msgid "Notify interval:" ++msgstr "通知間隔:" ++ ++msgid "Pictures" ++msgstr "ピクãƒãƒ£" ++ ++msgid "Port for HTTP (descriptions, SOAP, media transfer) traffic." ++msgstr "ステータス表示ã®ãŸã‚ã®HTTPãƒãƒ¼ãƒˆç•ªå·ã‚’設定ã—ã¦ãã ã•ã„。" ++ ++msgid "Port:" ++msgstr "ãƒãƒ¼ãƒˆ:" ++ ++msgid "Presentation URL:" ++msgstr "プレゼンテーションURL:" ++ ++msgid "Root container:" ++msgstr "ルート・コンテナ:" ++ ++msgid "" ++"Serial number the miniDLNA daemon will report to clients in its XML " ++"description." ++msgstr "miniDLNAãŒã‚¯ãƒ©ã‚¤ã‚¢ãƒ³ãƒˆã«é€šçŸ¥ã™ã‚‹XML中ã®ã‚·ãƒªã‚¢ãƒ«ãƒŠãƒ³ãƒãƒ¼ã‚’設定ã—ã¾ã™ã€‚" ++ ++msgid "" ++"Set this if you want to customize the name that shows up on your clients." ++msgstr "クライアント上ã§è¡¨ç¤ºã•ã‚Œã‚‹UPnPノードåを設定ã—ã¦ãã ã•ã„。" ++ ++msgid "" ++"Set this if you would like to specify the directory where you want MiniDLNA " ++"to store its database and album art cache." ++msgstr "" ++"miniDLNAãŒä½¿ç”¨ã™ã‚‹ãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹ãŠã‚ˆã³ã‚¢ãƒ«ãƒãƒ ã‚¢ãƒ¼ãƒˆã®ã‚­ãƒ£ãƒƒã‚·ãƒ¥ã‚’ä¿å­˜ã™ã‚‹ãƒ‡ã‚£" ++"レクトリパスを設定ã—ã¦ãã ã•ã„。" ++ ++msgid "" ++"Set this if you would like to specify the directory where you want MiniDLNA " ++"to store its log file." ++msgstr "miniDLNAãŒæ›¸ãã ã™ãƒ­ã‚°ãƒ•ã‚¡ã‚¤ãƒ«ã®ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªãƒ‘スを設定ã—ã¦ãã ã•ã„。" ++ ++msgid "" ++"Set this to enable inotify monitoring to automatically discover new files." ++msgstr "" ++"inotifyを使用ã—ãŸæ–°è¦ãƒ•ã‚¡ã‚¤ãƒ«ã®è‡ªå‹•æ¤œçŸ¥ã‚’有効ã«ã™ã‚‹å ´åˆã€ã“ã®ã‚ªãƒ—ションを有効" ++"ã«ã—ã¦ãã ã•ã„。" ++ ++msgid "" ++"Set this to enable support for streaming .jpg and .mp3 files to a TiVo " ++"supporting HMO." ++msgstr "" ++"TiVoサãƒãƒ¼ãƒˆã®ãŸã‚ã®.jpgãŠã‚ˆã³.mp3ファイルã®ã‚¹ãƒˆãƒªãƒ¼ãƒŸãƒ³ã‚°ã‚’è¡Œã†å ´åˆã€ã“ã®ã‚ª" ++"プションを有効ã«ã—ã¦ãã ã•ã„。" ++ ++msgid "" ++"Set this to strictly adhere to DLNA standards. This will allow server-side " ++"downscaling of very large JPEG images, which may hurt JPEG serving " ++"performance on (at least) Sony DLNA products." ++msgstr "" ++"DLNAè¦æ ¼ã‚’厳守ã™ã‚‹å ´åˆã€ã“ã®ã‚ªãƒ—ションを有効ã«ã—ã¦ãã ã•ã„。オプションを有効" ++"ã«ã™ã‚‹ã¨ã€ã‚µãƒ¼ãƒãƒ¼å´ã§ã€å¤§ãã„サイズã®JPEGファイルã®ãƒ€ã‚¦ãƒ³ã‚¹ã‚±ãƒ¼ãƒ«ã‚’è¡Œã„ã¾" ++"ã™ã€‚ã—ã‹ã—ã€ã“ã®æ©Ÿèƒ½ã¯Sonyãªã©ã®DLNA製å“ã«ãŠã„ã¦ã€JPEGサービスã®ãƒ‘フォーマン" ++"スをæãªã†å¯èƒ½æ€§ãŒã‚ã‚Šã¾ã™ã€‚" ++ ++msgid "" ++"Set this to the directory you want scanned. If you want to restrict the " ++"directory to a specific content type, you can prepend the type ('A' for " ++"audio, 'V' for video, 'P' for images), followed by a comma, to the directory " ++"(eg. media_dir=A,/mnt/media/Music). Multiple directories can be specified." ++msgstr "" ++"miniDLNA ãŒã‚¹ã‚­ãƒ£ãƒ³ã™ã‚‹ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã‚’設定ã—ã¾ã™ã€‚ディレクトリを特定ã®ã‚³ãƒ³ãƒ†ãƒ³" ++"ツã«åˆ¶é™ã—ãŸã„å ´åˆã€ã‚¿ã‚¤ãƒ—をパスã®ã¯ã˜ã‚ã«ä»˜ã‘ã€ã‚³ãƒ³ãƒžè¨˜å·ã§åŒºåˆ‡ã‚‹ã“ã¨ã§è¨­å®š" ++"ã§ãã¾ã™ ('A'=オーディオ \"audio\", 'V'=ビデオ \"video\", 'P'=写真 \"images" ++"\", 例: media_dir=A,/mnt/media/Music)。ã¾ãŸã€ã“ã®ã‚ªãƒ—ションã¯è¤‡æ•°ã®ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆ" ++"リを登録å¯èƒ½ã§ã™ã€‚" ++ ++msgid "Specify the path to the MiniSSDPd socket." ++msgstr "MiniSSDPd ソケットã®ãƒ‘スを設定ã—ã¦ãã ã•ã„。" ++ ++msgid "Standard container" ++msgstr "標準コンテナ" ++ ++msgid "Strict to DLNA standard:" ++msgstr "DLNAè¦æ ¼ã®åŽ³å®ˆ:" ++ ++msgid "" ++"The miniDLNA service is active, serving %d audio, %d video and %d image " ++"files." ++msgstr "" ++"miniDLNA サービスã¯ç¨¼åƒä¸­ã§ã™ã€‚%d 個ã®éŸ³æ¥½ãƒ•ã‚¡ã‚¤ãƒ« , %d 個ã®ãƒ“デオファイル, %" ++"d 個ã®å†™çœŸãƒ•ã‚¡ã‚¤ãƒ«ã‚’èªè­˜ã—ã¦ã„ã¾ã™ã€‚" ++ ++msgid "The miniDLNA service is not running." ++msgstr "miniDLNA サービスã¯ç¨¼åƒã—ã¦ã„ã¾ã›ã‚“。" ++ ++msgid "This is a list of file names to check for when searching for album art." ++msgstr "アルãƒãƒ ã‚¢ãƒ¼ãƒˆæ¤œç´¢æ™‚ã«ãƒã‚§ãƒƒã‚¯ã™ã‚‹ãƒ•ã‚¡ã‚¤ãƒ«åã®ãƒªã‚¹ãƒˆã‚’設定ã—ã¾ã™ã€‚" ++ ++msgid "Video" ++msgstr "ビデオ" ++ ++msgid "miniDLNA" ++msgstr "miniDLNA" ++ ++msgid "miniDLNA Status" ++msgstr "miniDLNA ステータス" ++ ++msgid "miniSSDP socket:" ++msgstr "miniSSDP ソケット:" ++ ++#~ msgid "Network interfaces to serve, comma delimited list." ++#~ msgstr "" ++#~ "サービスãŒä½¿ç”¨ã™ã‚‹ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ãƒ»ã‚¤ãƒ³ã‚¿ãƒ¼ãƒ•ã‚§ãƒ¼ã‚¹ã‚’設定ã—ã¾ã™ã€‚ã‚«ãƒ³ãƒžè¨˜å· " ++#~ "\",\" ã§åŒºåˆ‡ã£ã¦ãã ã•ã„。" ++ ++#~ msgid "" ++#~ "This is a list of file names to check for when searching for album art. " ++#~ "Note: names must be delimited with a forward slash '/'" ++#~ msgstr "" ++#~ "アルãƒãƒ ã‚¢ãƒ¼ãƒˆæ¤œç´¢æ™‚ã«ãƒã‚§ãƒƒã‚¯ã™ã‚‹ãƒ•ã‚¡ã‚¤ãƒ«åã®ãƒªã‚¹ãƒˆã‚’設定ã—ã¾ã™ã€‚注æ„: " ++#~ "ファイルåã¯ã‚¹ãƒ©ãƒƒã‚·ãƒ¥è¨˜å· '/' ã§åŒºåˆ‡ã£ã¦ãã ã•ã„。" +diff --git a/feeds/luci/applications/luci-app-minidlna/po/ms/minidlna.po b/feeds/luci/applications/luci-app-minidlna/po/ms/minidlna.po +new file mode 100644 +index 0000000..8df98a8 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-minidlna/po/ms/minidlna.po +@@ -0,0 +1,163 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Last-Translator: Automatically generated\n" ++"Language-Team: none\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++ ++msgid "Advanced Settings" ++msgstr "" ++ ++msgid "Album art names:" ++msgstr "" ++ ++msgid "Announced model number:" ++msgstr "" ++ ++msgid "Announced serial number:" ++msgstr "" ++ ++msgid "Browse directory" ++msgstr "" ++ ++msgid "Collecting data..." ++msgstr "" ++ ++msgid "Database directory:" ++msgstr "" ++ ++msgid "Enable TIVO:" ++msgstr "" ++ ++msgid "Enable inotify:" ++msgstr "" ++ ++msgid "Enable:" ++msgstr "" ++ ++msgid "Friendly name:" ++msgstr "" ++ ++msgid "General Settings" ++msgstr "" ++ ++msgid "Interfaces:" ++msgstr "" ++ ++msgid "Log directory:" ++msgstr "" ++ ++msgid "Media directories:" ++msgstr "" ++ ++msgid "" ++"MiniDLNA is server software with the aim of being fully compliant with DLNA/" ++"UPnP-AV clients." ++msgstr "" ++ ++msgid "" ++"Model number the miniDLNA daemon will report to clients in its XML " ++"description." ++msgstr "" ++ ++msgid "Music" ++msgstr "" ++ ++msgid "Network interfaces to serve." ++msgstr "" ++ ++msgid "Notify interval in seconds." ++msgstr "" ++ ++msgid "Notify interval:" ++msgstr "" ++ ++msgid "Pictures" ++msgstr "" ++ ++msgid "Port for HTTP (descriptions, SOAP, media transfer) traffic." ++msgstr "" ++ ++msgid "Port:" ++msgstr "" ++ ++msgid "Presentation URL:" ++msgstr "" ++ ++msgid "Root container:" ++msgstr "" ++ ++msgid "" ++"Serial number the miniDLNA daemon will report to clients in its XML " ++"description." ++msgstr "" ++ ++msgid "" ++"Set this if you want to customize the name that shows up on your clients." ++msgstr "" ++ ++msgid "" ++"Set this if you would like to specify the directory where you want MiniDLNA " ++"to store its database and album art cache." ++msgstr "" ++ ++msgid "" ++"Set this if you would like to specify the directory where you want MiniDLNA " ++"to store its log file." ++msgstr "" ++ ++msgid "" ++"Set this to enable inotify monitoring to automatically discover new files." ++msgstr "" ++ ++msgid "" ++"Set this to enable support for streaming .jpg and .mp3 files to a TiVo " ++"supporting HMO." ++msgstr "" ++ ++msgid "" ++"Set this to strictly adhere to DLNA standards. This will allow server-side " ++"downscaling of very large JPEG images, which may hurt JPEG serving " ++"performance on (at least) Sony DLNA products." ++msgstr "" ++ ++msgid "" ++"Set this to the directory you want scanned. If you want to restrict the " ++"directory to a specific content type, you can prepend the type ('A' for " ++"audio, 'V' for video, 'P' for images), followed by a comma, to the directory " ++"(eg. media_dir=A,/mnt/media/Music). Multiple directories can be specified." ++msgstr "" ++ ++msgid "Specify the path to the MiniSSDPd socket." ++msgstr "" ++ ++msgid "Standard container" ++msgstr "" ++ ++msgid "Strict to DLNA standard:" ++msgstr "" ++ ++msgid "" ++"The miniDLNA service is active, serving %d audio, %d video and %d image " ++"files." ++msgstr "" ++ ++msgid "The miniDLNA service is not running." ++msgstr "" ++ ++msgid "This is a list of file names to check for when searching for album art." ++msgstr "" ++ ++msgid "Video" ++msgstr "" ++ ++msgid "miniDLNA" ++msgstr "" ++ ++msgid "miniDLNA Status" ++msgstr "" ++ ++msgid "miniSSDP socket:" ++msgstr "" +diff --git a/feeds/luci/applications/luci-app-minidlna/po/no/minidlna.po b/feeds/luci/applications/luci-app-minidlna/po/no/minidlna.po +new file mode 100644 +index 0000000..4b24712 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-minidlna/po/no/minidlna.po +@@ -0,0 +1,189 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"PO-Revision-Date: 2013-03-25 17:25+0200\n" ++"Last-Translator: protx \n" ++"Language-Team: none\n" ++"Language: no\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n != 1);\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "Advanced Settings" ++msgstr "Avanserte Innstillinger" ++ ++msgid "Album art names:" ++msgstr "Albumbilder navn:" ++ ++msgid "Announced model number:" ++msgstr "Annonsert modellnummer:" ++ ++msgid "Announced serial number:" ++msgstr "Annonsert serienummer:" ++ ++msgid "Browse directory" ++msgstr "Bla katalog" ++ ++msgid "Collecting data..." ++msgstr "Samler inn data..." ++ ++msgid "Database directory:" ++msgstr "Database katalog:" ++ ++msgid "Enable TIVO:" ++msgstr "Aktiver TIVO:" ++ ++msgid "Enable inotify:" ++msgstr "Aktiver inotify:" ++ ++msgid "Enable:" ++msgstr "Aktiver:" ++ ++msgid "Friendly name:" ++msgstr "Vennlig navn:" ++ ++msgid "General Settings" ++msgstr "Generelle Innstillinger" ++ ++msgid "Interfaces:" ++msgstr "Grensesnitt:" ++ ++msgid "Log directory:" ++msgstr "Logg katalog:" ++ ++msgid "Media directories:" ++msgstr "Media kataloger:" ++ ++msgid "" ++"MiniDLNA is server software with the aim of being fully compliant with DLNA/" ++"UPnP-AV clients." ++msgstr "" ++"MiniDLNA er serverprogramvare som sikter pÃ¥ Ã¥ være fullt kompatibel med DLNA" ++"/UPnP-AV klienter." ++ ++msgid "" ++"Model number the miniDLNA daemon will report to clients in its XML " ++"description." ++msgstr "" ++"Modellnummer som MiniDLNA daemon vil rapportere til klienter. (XML " ++"beskrivelse)" ++ ++msgid "Music" ++msgstr "Musikk" ++ ++msgid "Network interfaces to serve." ++msgstr "Nettverksgrensesnittene Ã¥ tjene." ++ ++msgid "Notify interval in seconds." ++msgstr "Notify intervall i sekunder." ++ ++msgid "Notify interval:" ++msgstr "Notify intervall:" ++ ++msgid "Pictures" ++msgstr "Bilder" ++ ++msgid "Port for HTTP (descriptions, SOAP, media transfer) traffic." ++msgstr "Port for HTTP (beskrivelser, SOAP, media overføring) trafikk." ++ ++msgid "Port:" ++msgstr "Port:" ++ ++msgid "Presentation URL:" ++msgstr "Presentasjon URL:" ++ ++msgid "Root container:" ++msgstr "Root katalog:" ++ ++msgid "" ++"Serial number the miniDLNA daemon will report to clients in its XML " ++"description." ++msgstr "" ++"Serienummeret miniDLNA daemon vil rapportere til klienter. (XML beskrivelse)" ++ ++msgid "" ++"Set this if you want to customize the name that shows up on your clients." ++msgstr "Her kan en tilpasse navnet som dukker opp pÃ¥ MiniDLNA klientene." ++ ++msgid "" ++"Set this if you would like to specify the directory where you want MiniDLNA " ++"to store its database and album art cache." ++msgstr "" ++"Her kan en spesifisere hvilken katalog som MiniDLNA bruker for Ã¥ lagre sin " ++"database og albumcover cache." ++ ++msgid "" ++"Set this if you would like to specify the directory where you want MiniDLNA " ++"to store its log file." ++msgstr "" ++"Her kan en definere hvilken katalog som MiniDLNA skal bruke til Ã¥ lagre log " ++"filen i." ++ ++msgid "" ++"Set this to enable inotify monitoring to automatically discover new files." ++msgstr "" ++"Her kan en aktivere inotify som overvÃ¥ker mediakatalogene og dermed " ++"automatisk oppdage om det kommer nytt innhold." ++ ++msgid "" ++"Set this to enable support for streaming .jpg and .mp3 files to a TiVo " ++"supporting HMO." ++msgstr "" ++"Her kan en aktivere støtte for strømming av .jpg og .mp3 filer til en TiVo " ++"med HMO støtte." ++ ++msgid "" ++"Set this to strictly adhere to DLNA standards. This will allow server-side " ++"downscaling of very large JPEG images, which may hurt JPEG serving " ++"performance on (at least) Sony DLNA products." ++msgstr "" ++"Her kan en aktivere at en holder seg til DLNA-standarder. Dette vil tillate " ++"server-side nedskalering av svært store JPEG-bilder, noe som kan skade JPEG " ++"serverens ytelse pÃ¥ (minst) Sony DLNA-produkter." ++ ++msgid "" ++"Set this to the directory you want scanned. If you want to restrict the " ++"directory to a specific content type, you can prepend the type ('A' for " ++"audio, 'V' for video, 'P' for images), followed by a comma, to the directory " ++"(eg. media_dir=A,/mnt/media/Music). Multiple directories can be specified." ++msgstr "" ++"Her kan en velge den katalogen som blir skannet. Om du ønsker Ã¥ begrense " ++"katalogen til en spesifikk innholdstype kan sette en bokstav foran ('A' for " ++"lyd, 'V' for video, 'P' for bilder), etterfulgt av et komma og katalogen. " ++"(f.eks media_dir=A,/mnt/media/Musikk). Flere kataloger kan brukes." ++ ++msgid "Specify the path to the MiniSSDPd socket." ++msgstr "Angi banen til MiniSSDPd socketen." ++ ++msgid "Standard container" ++msgstr "Standard container" ++ ++msgid "Strict to DLNA standard:" ++msgstr "Streng overholdelse av DLNA-standarden:" ++ ++msgid "" ++"The miniDLNA service is active, serving %d audio, %d video and %d image " ++"files." ++msgstr "" ++"MiniDLNA tjenesten er aktiv, serverer %d lyd, %d video og %d bildefiler." ++ ++msgid "The miniDLNA service is not running." ++msgstr "MiniDLNA tjenesten kjører ikke." ++ ++msgid "This is a list of file names to check for when searching for album art." ++msgstr "" ++"Dette er en liste over filnavn for Ã¥ se etter nÃ¥r du søker etter albumcover." ++ ++msgid "Video" ++msgstr "Video" ++ ++msgid "miniDLNA" ++msgstr "MiniDLNA" ++ ++msgid "miniDLNA Status" ++msgstr "MiniDLNA Status" ++ ++msgid "miniSSDP socket:" ++msgstr "miniSSDP socket:" +diff --git a/feeds/luci/applications/luci-app-minidlna/po/pl/minidlna.po b/feeds/luci/applications/luci-app-minidlna/po/pl/minidlna.po +new file mode 100644 +index 0000000..b4a8a6f +--- /dev/null ++++ b/feeds/luci/applications/luci-app-minidlna/po/pl/minidlna.po +@@ -0,0 +1,189 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"PO-Revision-Date: 2012-08-24 07:53+0200\n" ++"Last-Translator: goodgod261 \n" ++"Language-Team: none\n" ++"Language: pl\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 " ++"|| n%100>=20) ? 1 : 2);\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "Advanced Settings" ++msgstr "Ustawienia zaawansowane" ++ ++msgid "Album art names:" ++msgstr "Nazwy okÅ‚adek albumów:" ++ ++msgid "Announced model number:" ++msgstr "RozgÅ‚aszany model:" ++ ++msgid "Announced serial number:" ++msgstr "RozgÅ‚aszany numer seryjny:" ++ ++msgid "Browse directory" ++msgstr "PrzeglÄ…daj folder" ++ ++msgid "Collecting data..." ++msgstr "Zbieranie informacji..." ++ ++msgid "Database directory:" ++msgstr "Katalog bazy danych:" ++ ++msgid "Enable TIVO:" ++msgstr "WÅ‚Ä…cz TIVO:" ++ ++msgid "Enable inotify:" ++msgstr "WÅ‚Ä…cz inotify:" ++ ++msgid "Enable:" ++msgstr "WÅ‚Ä…cz:" ++ ++msgid "Friendly name:" ++msgstr "Przyjazna nazwa:" ++ ++msgid "General Settings" ++msgstr "Ustawienia ogólne" ++ ++msgid "Interfaces:" ++msgstr "Interfejsy:" ++ ++msgid "Log directory:" ++msgstr "Katalog dzienników (logów):" ++ ++msgid "Media directories:" ++msgstr "Katalog mediów:" ++ ++msgid "" ++"MiniDLNA is server software with the aim of being fully compliant with DLNA/" ++"UPnP-AV clients." ++msgstr "" ++"MiniDLNA jest oprogramowaniem serwerowym majÄ…cym na celu peÅ‚nÄ… zgodność z " ++"klientami DLNA/UPnP-AV." ++ ++msgid "" ++"Model number the miniDLNA daemon will report to clients in its XML " ++"description." ++msgstr "Model, który demon miniDLNA zgÅ‚osi klientom w swoim opisie XML." ++ ++msgid "Music" ++msgstr "Muzyka" ++ ++msgid "Network interfaces to serve." ++msgstr "Interfejsy sieciowe do obsÅ‚ugiwania." ++ ++msgid "Notify interval in seconds." ++msgstr "InterwaÅ‚ powiadamiania w sekundach." ++ ++msgid "Notify interval:" ++msgstr "InterwaÅ‚ powiadamiania." ++ ++msgid "Pictures" ++msgstr "Obrazy" ++ ++msgid "Port for HTTP (descriptions, SOAP, media transfer) traffic." ++msgstr "Port dla ruchu HTTP (opisy, SOAP, transfer mediów)." ++ ++msgid "Port:" ++msgstr "Port:" ++ ++msgid "Presentation URL:" ++msgstr "URL prezentacyjny:" ++ ++msgid "Root container:" ++msgstr "Kontener główny (root):" ++ ++msgid "" ++"Serial number the miniDLNA daemon will report to clients in its XML " ++"description." ++msgstr "" ++"Numer seryjny, który demon miniDLNA zgÅ‚osi klientom w swoim opisie XML." ++ ++msgid "" ++"Set this if you want to customize the name that shows up on your clients." ++msgstr "Ustaw to, jeÅ›li chcesz wybrać wÅ‚asnÄ… nazwÄ™ pokazujÄ…cÄ… siÄ™ w klientach." ++ ++msgid "" ++"Set this if you would like to specify the directory where you want MiniDLNA " ++"to store its database and album art cache." ++msgstr "" ++"Ustaw to, jeÅ›li chcesz podać folder, w którym miniDLNA powinien przechowywać " ++"bazÄ™ danych i cache okÅ‚adek albumów." ++ ++msgid "" ++"Set this if you would like to specify the directory where you want MiniDLNA " ++"to store its log file." ++msgstr "" ++"Ustaw to, jeÅ›li chcesz podać folder, w którym miniDLNA powinien przechowywać " ++"dzienniki (logi)." ++ ++msgid "" ++"Set this to enable inotify monitoring to automatically discover new files." ++msgstr "" ++"Ustaw to, aby wÅ‚Ä…czyć monitorowanie inotify, by automatycznie wykrywać nowe " ++"pliki." ++ ++msgid "" ++"Set this to enable support for streaming .jpg and .mp3 files to a TiVo " ++"supporting HMO." ++msgstr "" ++"Ustaw to, aby wÅ‚Ä…czyć wsparcie dla streamingu plików .jpg i .mp3 do TiVo " ++"obsÅ‚ugujÄ…cego HMO." ++ ++msgid "" ++"Set this to strictly adhere to DLNA standards. This will allow server-side " ++"downscaling of very large JPEG images, which may hurt JPEG serving " ++"performance on (at least) Sony DLNA products." ++msgstr "" ++"Ustaw to, aby Å›ciÅ›le przestrzegać standardów DLNA. Pozwoli to na " ++"zmniejszanie wielkich plików JPEG po stronie serwera, co może obniżyć " ++"wydajność dostarczania plików JPEG (przynajmniej) na urzÄ…dzeniach DLNA Sony." ++ ++msgid "" ++"Set this to the directory you want scanned. If you want to restrict the " ++"directory to a specific content type, you can prepend the type ('A' for " ++"audio, 'V' for video, 'P' for images), followed by a comma, to the directory " ++"(eg. media_dir=A,/mnt/media/Music). Multiple directories can be specified." ++msgstr "" ++"Ustaw tu folder, który chcesz skanować. JeÅ›li chcesz ograniczyć folder do " ++"konkretnego typu zawartoÅ›ci, możesz poprzedzić Å›cieżkÄ™ typem (\"A\" dla " ++"audio, \"V\" dla wideo, \"P\" dla obrazów) i przecinkiem (np media_dir=A,/" ++"mnt/media/Muzyka). Możesz podać kilka folderów." ++ ++msgid "Specify the path to the MiniSSDPd socket." ++msgstr "Podaj Å›cieżkÄ™ do gniazda (socketu) miniSSDPd." ++ ++msgid "Standard container" ++msgstr "Standardowy kontener" ++ ++msgid "Strict to DLNA standard:" ++msgstr "ÅšciÅ›le trzymaj siÄ™ standardów DLNA:" ++ ++msgid "" ++"The miniDLNA service is active, serving %d audio, %d video and %d image " ++"files." ++msgstr "" ++"UsÅ‚uga miniDLNA jest aktywna, dostarczajÄ…c %d utworów, %d filmów i %d " ++"obrazów." ++ ++msgid "The miniDLNA service is not running." ++msgstr "UsÅ‚uga miniDLNA nie jest wÅ‚Ä…czona." ++ ++msgid "This is a list of file names to check for when searching for album art." ++msgstr "" ++"To jest lista nazw plików do sprawdzenia podczas wyszukiwania okÅ‚adki albumu." ++ ++msgid "Video" ++msgstr "Wideo" ++ ++msgid "miniDLNA" ++msgstr "miniDLNA" ++ ++msgid "miniDLNA Status" ++msgstr "Status miniDLNA" ++ ++msgid "miniSSDP socket:" ++msgstr "Gniazdo (socket) miniSSDP:" +diff --git a/feeds/luci/applications/luci-app-minidlna/po/pt-br/minidlna.po b/feeds/luci/applications/luci-app-minidlna/po/pt-br/minidlna.po +new file mode 100644 +index 0000000..3d53abd +--- /dev/null ++++ b/feeds/luci/applications/luci-app-minidlna/po/pt-br/minidlna.po +@@ -0,0 +1,193 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Last-Translator: Automatically generated\n" ++"Language-Team: none\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n > 1);\n" ++ ++msgid "Advanced Settings" ++msgstr "Configuração Avançada" ++ ++msgid "Album art names:" ++msgstr "Nomes do Ãlbum artistico: " ++ ++msgid "Announced model number:" ++msgstr "numero de modelo anunciado:" ++ ++msgid "Announced serial number:" ++msgstr "Anunciar serial:" ++ ++msgid "Browse directory" ++msgstr "Procurar diretório " ++ ++msgid "Collecting data..." ++msgstr "Coletando dados..." ++ ++msgid "Database directory:" ++msgstr "Banco de dados de diretório:" ++ ++msgid "Enable TIVO:" ++msgstr "Ativar TIVO:" ++ ++msgid "Enable inotify:" ++msgstr "Ativar inotify:" ++ ++msgid "Enable:" ++msgstr "Ativado" ++ ++msgid "Friendly name:" ++msgstr "Nome amigável:" ++ ++msgid "General Settings" ++msgstr "Configuração Geral" ++ ++msgid "Interfaces:" ++msgstr "Interfaces:" ++ ++msgid "Log directory:" ++msgstr "Diretório de Log" ++ ++msgid "Media directories:" ++msgstr "Diretórios de mídia:" ++ ++msgid "" ++"MiniDLNA is server software with the aim of being fully compliant with DLNA/" ++"UPnP-AV clients." ++msgstr "" ++"MiniDLNA é um software de servidor com o objetivo de ser totalmente " ++"compatível com os clientes DLNA / UPnP-AV." ++ ++msgid "" ++"Model number the miniDLNA daemon will report to clients in its XML " ++"description." ++msgstr "" ++"Número do modelo do daemon miniDLNA irá relatar aos clientes em sua " ++"descrição XML." ++ ++msgid "Music" ++msgstr "Musica" ++ ++msgid "Network interfaces to serve." ++msgstr "As interfaces de rede para servir." ++ ++msgid "Notify interval in seconds." ++msgstr "Notificação de intervalo em segundos." ++ ++msgid "Notify interval:" ++msgstr "Intervalo de Notificação:" ++ ++msgid "Pictures" ++msgstr "Imagems" ++ ++msgid "Port for HTTP (descriptions, SOAP, media transfer) traffic." ++msgstr "Porta para HTTP (descrições, SOAP, transferência de mídia) de tráfego." ++ ++msgid "Port:" ++msgstr "Porta:" ++ ++msgid "Presentation URL:" ++msgstr "URL para Apresentação:" ++ ++msgid "Root container:" ++msgstr "Root container:" ++ ++msgid "" ++"Serial number the miniDLNA daemon will report to clients in its XML " ++"description." ++msgstr "" ++"Numero serial do miniDLNA daemon apresentará um relatório a clientes em sua " ++"descrição XML." ++ ++msgid "" ++"Set this if you want to customize the name that shows up on your clients." ++msgstr "" ++"Defina esta opção se você quiser personalizar o nome que aparece em seus " ++"clientes." ++ ++msgid "" ++"Set this if you would like to specify the directory where you want MiniDLNA " ++"to store its database and album art cache." ++msgstr "" ++"Defina esta opção se você gostaria de especificar o diretório onde você " ++"deseja MiniDLNA para armazenar seu banco de dados e cache de arte do álbum." ++ ++msgid "" ++"Set this if you would like to specify the directory where you want MiniDLNA " ++"to store its log file." ++msgstr "" ++"Defina esta opção se você gostaria de especificar o diretório onde você " ++"deseja MiniDLNA para armazenar seu arquivo de log." ++ ++msgid "" ++"Set this to enable inotify monitoring to automatically discover new files." ++msgstr "" ++"Defina esta opção para permitir o monitoramento inotify para descobrir " ++"automaticamente novos arquivos." ++ ++msgid "" ++"Set this to enable support for streaming .jpg and .mp3 files to a TiVo " ++"supporting HMO." ++msgstr "" ++"Defina esta opção para habilitar o suporte para streaming. Jpg e. Arquivos " ++"MP3 para um TiVo suporte HMO." ++ ++msgid "" ++"Set this to strictly adhere to DLNA standards. This will allow server-side " ++"downscaling of very large JPEG images, which may hurt JPEG serving " ++"performance on (at least) Sony DLNA products." ++msgstr "" ++"Defina esta opção para aderir estritamente às normas DLNA. Isso permitirá " ++"que do lado do servidor downscaling de imagens muito grandes JPEG, que podem " ++"prejudicar o desempenho servindo em JPEG (pelo menos) os produtos da Sony " ++"DLNA." ++ ++msgid "" ++"Set this to the directory you want scanned. If you want to restrict the " ++"directory to a specific content type, you can prepend the type ('A' for " ++"audio, 'V' for video, 'P' for images), followed by a comma, to the directory " ++"(eg. media_dir=A,/mnt/media/Music). Multiple directories can be specified." ++msgstr "" ++"Defina esta opção para o diretório que você deseja verificar. Se você quiser " ++"restringir o diretório para um tipo específico de conteúdo, você pode " ++"prefixar o tipo ('A' para áudio, 'V' para o vídeo, 'P' para imagens), " ++"seguido por uma vírgula, para o diretório (por exemplo media_dir = A, / " ++"mnt / media / Música). Vários diretórios podem ser especificados." ++ ++msgid "Specify the path to the MiniSSDPd socket." ++msgstr "Especifique o caminho para o soquete MiniSSDPd." ++ ++msgid "Standard container" ++msgstr "container padrão" ++ ++msgid "Strict to DLNA standard:" ++msgstr "Strict para DLNA padrão:" ++ ++msgid "" ++"The miniDLNA service is active, serving %d audio, %d video and %d image " ++"files." ++msgstr "" ++"O serviço está ativo miniDLNA, servindo% d áudio, vídeo e arquivos% d% d " ++"imagem." ++ ++msgid "The miniDLNA service is not running." ++msgstr "O serviço miniDLNA não está funcionando." ++ ++msgid "This is a list of file names to check for when searching for album art." ++msgstr "" ++"Esta é uma lista de nomes de arquivos para verificar quando procurando arte " ++"do álbum." ++ ++msgid "Video" ++msgstr "Video" ++ ++msgid "miniDLNA" ++msgstr "miniDLNA" ++ ++msgid "miniDLNA Status" ++msgstr "miniDLNA Status" ++ ++msgid "miniSSDP socket:" ++msgstr "miniSSDP soquete:" +diff --git a/feeds/luci/applications/luci-app-minidlna/po/pt/minidlna.po b/feeds/luci/applications/luci-app-minidlna/po/pt/minidlna.po +new file mode 100644 +index 0000000..96132cd +--- /dev/null ++++ b/feeds/luci/applications/luci-app-minidlna/po/pt/minidlna.po +@@ -0,0 +1,171 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"PO-Revision-Date: 2013-06-03 23:36+0200\n" ++"Last-Translator: joao.f.vieira \n" ++"Language-Team: none\n" ++"Language: pt\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n != 1);\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "Advanced Settings" ++msgstr "Definições Avançadas" ++ ++msgid "Album art names:" ++msgstr "" ++ ++msgid "Announced model number:" ++msgstr "Número modelo anunciado:" ++ ++msgid "Announced serial number:" ++msgstr "Número de série anunciado:" ++ ++msgid "Browse directory" ++msgstr "Procurar directório" ++ ++msgid "Collecting data..." ++msgstr "A obter dados..." ++ ++msgid "Database directory:" ++msgstr "Directório da base de dados:" ++ ++msgid "Enable TIVO:" ++msgstr "Ativar TIVO:" ++ ++msgid "Enable inotify:" ++msgstr "Ativar inotify:" ++ ++msgid "Enable:" ++msgstr "Ativar:" ++ ++msgid "Friendly name:" ++msgstr "Nome amigável:" ++ ++msgid "General Settings" ++msgstr "Definições Gerais" ++ ++msgid "Interfaces:" ++msgstr "Interfaces:" ++ ++msgid "Log directory:" ++msgstr "Directório de Log:" ++ ++msgid "Media directories:" ++msgstr "Pastas multimédia:" ++ ++msgid "" ++"MiniDLNA is server software with the aim of being fully compliant with DLNA/" ++"UPnP-AV clients." ++msgstr "" ++"O MiniDLNA é um software de servidor com o objectivo de ser totalmente " ++"compatível com clientes de DLNA/UPnP-AV." ++ ++msgid "" ++"Model number the miniDLNA daemon will report to clients in its XML " ++"description." ++msgstr "" ++"Número de modelo que o serviço de miniDLNA irá reportar aos clientes na sua " ++"descrição XML." ++ ++msgid "Music" ++msgstr "Música" ++ ++msgid "Network interfaces to serve." ++msgstr "Interfaces de rede a serem seervidas." ++ ++msgid "Notify interval in seconds." ++msgstr "Intervalo de notificação em segundos." ++ ++msgid "Notify interval:" ++msgstr "Intervalo de Notificação:" ++ ++msgid "Pictures" ++msgstr "Imagens" ++ ++msgid "Port for HTTP (descriptions, SOAP, media transfer) traffic." ++msgstr "Porta para tráfego HTTP (descrições, SOAP, tranferencia de conteudos)." ++ ++msgid "Port:" ++msgstr "Porta:" ++ ++msgid "Presentation URL:" ++msgstr "" ++ ++msgid "Root container:" ++msgstr "" ++ ++msgid "" ++"Serial number the miniDLNA daemon will report to clients in its XML " ++"description." ++msgstr "" ++ ++msgid "" ++"Set this if you want to customize the name that shows up on your clients." ++msgstr "" ++ ++msgid "" ++"Set this if you would like to specify the directory where you want MiniDLNA " ++"to store its database and album art cache." ++msgstr "" ++ ++msgid "" ++"Set this if you would like to specify the directory where you want MiniDLNA " ++"to store its log file." ++msgstr "" ++ ++msgid "" ++"Set this to enable inotify monitoring to automatically discover new files." ++msgstr "" ++ ++msgid "" ++"Set this to enable support for streaming .jpg and .mp3 files to a TiVo " ++"supporting HMO." ++msgstr "" ++ ++msgid "" ++"Set this to strictly adhere to DLNA standards. This will allow server-side " ++"downscaling of very large JPEG images, which may hurt JPEG serving " ++"performance on (at least) Sony DLNA products." ++msgstr "" ++ ++msgid "" ++"Set this to the directory you want scanned. If you want to restrict the " ++"directory to a specific content type, you can prepend the type ('A' for " ++"audio, 'V' for video, 'P' for images), followed by a comma, to the directory " ++"(eg. media_dir=A,/mnt/media/Music). Multiple directories can be specified." ++msgstr "" ++ ++msgid "Specify the path to the MiniSSDPd socket." ++msgstr "" ++ ++msgid "Standard container" ++msgstr "" ++ ++msgid "Strict to DLNA standard:" ++msgstr "" ++ ++msgid "" ++"The miniDLNA service is active, serving %d audio, %d video and %d image " ++"files." ++msgstr "" ++ ++msgid "The miniDLNA service is not running." ++msgstr "" ++ ++msgid "This is a list of file names to check for when searching for album art." ++msgstr "" ++ ++msgid "Video" ++msgstr "" ++ ++msgid "miniDLNA" ++msgstr "" ++ ++msgid "miniDLNA Status" ++msgstr "" ++ ++msgid "miniSSDP socket:" ++msgstr "" +diff --git a/feeds/luci/applications/luci-app-minidlna/po/ro/minidlna.po b/feeds/luci/applications/luci-app-minidlna/po/ro/minidlna.po +new file mode 100644 +index 0000000..cba5fe6 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-minidlna/po/ro/minidlna.po +@@ -0,0 +1,168 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"PO-Revision-Date: 2014-07-09 13:35+0200\n" ++"Last-Translator: xxvirusxx \n" ++"Language-Team: none\n" ++"Language: ro\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=3; plural=(n==1 ? 0 : (n==0 || (n%100 > 0 && n%100 < " ++"20)) ? 1 : 2);;\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "Advanced Settings" ++msgstr "Setări avansate" ++ ++msgid "Album art names:" ++msgstr "" ++ ++msgid "Announced model number:" ++msgstr "" ++ ++msgid "Announced serial number:" ++msgstr "" ++ ++msgid "Browse directory" ++msgstr "Răsfoire director" ++ ++msgid "Collecting data..." ++msgstr "Colectare date..." ++ ++msgid "Database directory:" ++msgstr "" ++ ++msgid "Enable TIVO:" ++msgstr "Activare TIVO:" ++ ++msgid "Enable inotify:" ++msgstr "Activare inotify:" ++ ++msgid "Enable:" ++msgstr "Activare:" ++ ++msgid "Friendly name:" ++msgstr "Nume prieten:" ++ ++msgid "General Settings" ++msgstr "Setări generale" ++ ++msgid "Interfaces:" ++msgstr "InterfeÅ£e" ++ ++msgid "Log directory:" ++msgstr "" ++ ++msgid "Media directories:" ++msgstr "Directoare media" ++ ++msgid "" ++"MiniDLNA is server software with the aim of being fully compliant with DLNA/" ++"UPnP-AV clients." ++msgstr "" ++ ++msgid "" ++"Model number the miniDLNA daemon will report to clients in its XML " ++"description." ++msgstr "" ++ ++msgid "Music" ++msgstr "Muzică" ++ ++msgid "Network interfaces to serve." ++msgstr "" ++ ++msgid "Notify interval in seconds." ++msgstr "Notificare interval în secunde." ++ ++msgid "Notify interval:" ++msgstr "Notificare interval:" ++ ++msgid "Pictures" ++msgstr "Fotografii" ++ ++msgid "Port for HTTP (descriptions, SOAP, media transfer) traffic." ++msgstr "Port pentru HTTP (descrieri, SOAP, transfer media) trafic." ++ ++msgid "Port:" ++msgstr "Port:" ++ ++msgid "Presentation URL:" ++msgstr "URL de prezentare:" ++ ++msgid "Root container:" ++msgstr "" ++ ++msgid "" ++"Serial number the miniDLNA daemon will report to clients in its XML " ++"description." ++msgstr "" ++ ++msgid "" ++"Set this if you want to customize the name that shows up on your clients." ++msgstr "" ++ ++msgid "" ++"Set this if you would like to specify the directory where you want MiniDLNA " ++"to store its database and album art cache." ++msgstr "" ++ ++msgid "" ++"Set this if you would like to specify the directory where you want MiniDLNA " ++"to store its log file." ++msgstr "" ++ ++msgid "" ++"Set this to enable inotify monitoring to automatically discover new files." ++msgstr "" ++ ++msgid "" ++"Set this to enable support for streaming .jpg and .mp3 files to a TiVo " ++"supporting HMO." ++msgstr "" ++ ++msgid "" ++"Set this to strictly adhere to DLNA standards. This will allow server-side " ++"downscaling of very large JPEG images, which may hurt JPEG serving " ++"performance on (at least) Sony DLNA products." ++msgstr "" ++ ++msgid "" ++"Set this to the directory you want scanned. If you want to restrict the " ++"directory to a specific content type, you can prepend the type ('A' for " ++"audio, 'V' for video, 'P' for images), followed by a comma, to the directory " ++"(eg. media_dir=A,/mnt/media/Music). Multiple directories can be specified." ++msgstr "" ++ ++msgid "Specify the path to the MiniSSDPd socket." ++msgstr "" ++ ++msgid "Standard container" ++msgstr "" ++ ++msgid "Strict to DLNA standard:" ++msgstr "" ++ ++msgid "" ++"The miniDLNA service is active, serving %d audio, %d video and %d image " ++"files." ++msgstr "" ++ ++msgid "The miniDLNA service is not running." ++msgstr "" ++ ++msgid "This is a list of file names to check for when searching for album art." ++msgstr "" ++ ++msgid "Video" ++msgstr "Video" ++ ++msgid "miniDLNA" ++msgstr "miniDLNA" ++ ++msgid "miniDLNA Status" ++msgstr "Stare miniDLNA" ++ ++msgid "miniSSDP socket:" ++msgstr "" +diff --git a/feeds/luci/applications/luci-app-minidlna/po/ru/minidlna.po b/feeds/luci/applications/luci-app-minidlna/po/ru/minidlna.po +new file mode 100644 +index 0000000..539e8ca +--- /dev/null ++++ b/feeds/luci/applications/luci-app-minidlna/po/ru/minidlna.po +@@ -0,0 +1,191 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: LuCI: minidlna\n" ++"POT-Creation-Date: \n" ++"PO-Revision-Date: 2013-11-13 18:43+0200\n" ++"Last-Translator: Роман \n" ++"Language-Team: Russian \n" ++"Language: ru\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%" ++"10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" ++"X-Generator: Pootle 2.0.6\n" ++"X-Poedit-SourceCharset: UTF-8\n" ++ ++msgid "Advanced Settings" ++msgstr "РаÑширенные наÑтройки" ++ ++msgid "Album art names:" ++msgstr "Имена обложек альбома:" ++ ++msgid "Announced model number:" ++msgstr "Ðомер модели:" ++ ++msgid "Announced serial number:" ++msgstr "Серийный номер:" ++ ++msgid "Browse directory" ++msgstr "Обзор директории" ++ ++msgid "Collecting data..." ++msgstr "Сбор данных..." ++ ++msgid "Database directory:" ++msgstr "Папка базы данных:" ++ ++msgid "Enable TIVO:" ++msgstr "Включить TIVO:" ++ ++msgid "Enable inotify:" ++msgstr "Включить inotify:" ++ ++msgid "Enable:" ++msgstr "Включить:" ++ ++msgid "Friendly name:" ++msgstr "ПонÑтное имÑ:" ++ ++msgid "General Settings" ++msgstr "Общие наÑтройки" ++ ++msgid "Interfaces:" ++msgstr "ИнтерфейÑÑ‹:" ++ ++msgid "Log directory:" ++msgstr "Папка журнала:" ++ ++msgid "Media directories:" ++msgstr "Папки медиа:" ++ ++msgid "" ++"MiniDLNA is server software with the aim of being fully compliant with DLNA/" ++"UPnP-AV clients." ++msgstr "" ++"MiniDLNA - Ñто Ñерверное программное обеÑпечение, имеющее цель обеÑÐ¿ÐµÑ‡ÐµÐ½Ð¸Ñ " ++"полной ÑовмеÑтимоÑти Ñ ÐºÐ»Ð¸ÐµÐ½Ñ‚Ð°Ð¼Ð¸ DLNA/UPnP-AV." ++ ++msgid "" ++"Model number the miniDLNA daemon will report to clients in its XML " ++"description." ++msgstr "" ++"Ðомер модели который, miniDLNA будет Ñообщать клиентам в Ñвоём XML-опиÑании." ++ ++msgid "Music" ++msgstr "Музыка" ++ ++msgid "Network interfaces to serve." ++msgstr "ОбÑлуживаемые Ñетевые интерфейÑÑ‹." ++ ++msgid "Notify interval in seconds." ++msgstr "Интервал ÑƒÐ²ÐµÐ´Ð¾Ð¼Ð»ÐµÐ½Ð¸Ñ (Ñекунды)." ++ ++msgid "Notify interval:" ++msgstr "Интервал уведомлениÑ:" ++ ++msgid "Pictures" ++msgstr "Картинки" ++ ++msgid "Port for HTTP (descriptions, SOAP, media transfer) traffic." ++msgstr "Порт Ð´Ð»Ñ HTTP-трафика (опиÑаниÑ, SOAP, передача мультимедиа)" ++ ++msgid "Port:" ++msgstr "Порт:" ++ ++msgid "Presentation URL:" ++msgstr "URL предÑтавлениÑ:" ++ ++msgid "Root container:" ++msgstr "Корневой контейнер:" ++ ++msgid "" ++"Serial number the miniDLNA daemon will report to clients in its XML " ++"description." ++msgstr "" ++"Серийный номер, который miniDLNA будет Ñообщать клиентам в Ñвоём XML-" ++"опиÑании." ++ ++msgid "" ++"Set this if you want to customize the name that shows up on your clients." ++msgstr "Изменение имени Ð¾Ñ‚Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ Ð´Ð»Ñ ÐºÐ»Ð¸ÐµÐ½Ñ‚Ð¾Ð²." ++ ++msgid "" ++"Set this if you would like to specify the directory where you want MiniDLNA " ++"to store its database and album art cache." ++msgstr "" ++"Папка, в которой miniDLNA будет хранить Ñвою базу данных и кÑш обложек " ++"альбомов." ++ ++msgid "" ++"Set this if you would like to specify the directory where you want MiniDLNA " ++"to store its log file." ++msgstr "Папка, в которой miniDLNA будет хранить Ñвой файл журнала." ++ ++msgid "" ++"Set this to enable inotify monitoring to automatically discover new files." ++msgstr "" ++"Включение Ð½Ð°Ð±Ð»ÑŽÐ´ÐµÐ½Ð¸Ñ inotify Ð´Ð»Ñ Ð°Ð²Ñ‚Ð¾Ð¼Ð°Ñ‚Ð¸Ñ‡ÐµÑкого Ð¾Ð±Ð½Ð°Ñ€ÑƒÐ¶ÐµÐ½Ð¸Ñ Ð½Ð¾Ð²Ñ‹Ñ… файлов." ++ ++msgid "" ++"Set this to enable support for streaming .jpg and .mp3 files to a TiVo " ++"supporting HMO." ++msgstr "" ++"УÑтановите Ð´Ð»Ñ Ð²ÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ Ð¿Ð¾Ð´Ð´ÐµÑ€Ð¶ÐºÐ¸ потокового воÑÐ¿Ñ€Ð¾Ð¸Ð·Ð²ÐµÐ´ÐµÐ½Ð¸Ñ Ñ„Ð°Ð¹Ð»Ð¾Ð² .jpg и ." ++"mp3 Ð´Ð»Ñ TiVo Ñ Ð¿Ð¾Ð´Ð´ÐµÑ€Ð¶ÐºÐ¾Ð¹ HMO." ++ ++msgid "" ++"Set this to strictly adhere to DLNA standards. This will allow server-side " ++"downscaling of very large JPEG images, which may hurt JPEG serving " ++"performance on (at least) Sony DLNA products." ++msgstr "" ++"УÑтановите Ð´Ð»Ñ Ñтрогого ÑоответÑÑ‚Ð²Ð¸Ñ Ñтандартам DLNA. Это разрешит " ++"уменьшение размера Ñлишком больших JPEG-изображений на Ñтороне Ñервера, что " ++"может повредить производительноÑти (по крайней мере) DLNA-продуктов Sony." ++ ++#, fuzzy ++msgid "" ++"Set this to the directory you want scanned. If you want to restrict the " ++"directory to a specific content type, you can prepend the type ('A' for " ++"audio, 'V' for video, 'P' for images), followed by a comma, to the directory " ++"(eg. media_dir=A,/mnt/media/Music). Multiple directories can be specified." ++msgstr "" ++"Директории, которые необходимо Ñканировать. ЕÑли вы хотите уÑтановить " ++"ограничение на определённый тип Ñодержимого в директории, вы можете напиÑать " ++"тип ('A' Ð´Ð»Ñ Ð°ÑƒÐ´Ð¸Ð¾, 'V' Ð´Ð»Ñ Ð²Ð¸Ð´ÐµÐ¾, 'P' Ð´Ð»Ñ Ð¸Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ð¹) перед путём к " ++"директории, за которым Ñледует запÑÑ‚Ð°Ñ (напр. media_dir=A,/mnt/media/Music). " ++"Может быть указано неÑколько директорий." ++ ++msgid "Specify the path to the MiniSSDPd socket." ++msgstr "Укажите путь к Ñокету MiniSSDPd." ++ ++msgid "Standard container" ++msgstr "Стандартный контейнер" ++ ++msgid "Strict to DLNA standard:" ++msgstr "Строгий Ñтандарт DLNA:" ++ ++msgid "" ++"The miniDLNA service is active, serving %d audio, %d video and %d image " ++"files." ++msgstr "" ++"Ð¡ÐµÑ€Ð²Ð¸Ñ miniDLNA запущен, обÑлуживает %d аудио-, %d видео- и %d файлов Ñ " ++"изображениÑми." ++ ++msgid "The miniDLNA service is not running." ++msgstr "Ð¡ÐµÑ€Ð²Ð¸Ñ miniDLNA не запущен." ++ ++msgid "This is a list of file names to check for when searching for album art." ++msgstr "Это ÑпиÑок файлов, Ñреди которых необходимо иÑкать обложки альбомов." ++ ++msgid "Video" ++msgstr "Видео" ++ ++msgid "miniDLNA" ++msgstr "miniDLNA" ++ ++msgid "miniDLNA Status" ++msgstr "Ð¡Ñ‚Ð°Ñ‚ÑƒÑ miniDLNA" ++ ++msgid "miniSSDP socket:" ++msgstr "Сокет miniSSDP:" +diff --git a/feeds/luci/applications/luci-app-minidlna/po/sk/minidlna.po b/feeds/luci/applications/luci-app-minidlna/po/sk/minidlna.po +new file mode 100644 +index 0000000..19c3e53 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-minidlna/po/sk/minidlna.po +@@ -0,0 +1,164 @@ ++msgid "" ++msgstr "" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Last-Translator: Automatically generated\n" ++"Language-Team: none\n" ++"MIME-Version: 1.0\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n" ++ ++msgid "Advanced Settings" ++msgstr "" ++ ++msgid "Album art names:" ++msgstr "" ++ ++msgid "Announced model number:" ++msgstr "" ++ ++msgid "Announced serial number:" ++msgstr "" ++ ++msgid "Browse directory" ++msgstr "" ++ ++msgid "Collecting data..." ++msgstr "" ++ ++msgid "Database directory:" ++msgstr "" ++ ++msgid "Enable TIVO:" ++msgstr "" ++ ++msgid "Enable inotify:" ++msgstr "" ++ ++msgid "Enable:" ++msgstr "" ++ ++msgid "Friendly name:" ++msgstr "" ++ ++msgid "General Settings" ++msgstr "" ++ ++msgid "Interfaces:" ++msgstr "" ++ ++msgid "Log directory:" ++msgstr "" ++ ++msgid "Media directories:" ++msgstr "" ++ ++msgid "" ++"MiniDLNA is server software with the aim of being fully compliant with DLNA/" ++"UPnP-AV clients." ++msgstr "" ++ ++msgid "" ++"Model number the miniDLNA daemon will report to clients in its XML " ++"description." ++msgstr "" ++ ++msgid "Music" ++msgstr "" ++ ++msgid "Network interfaces to serve." ++msgstr "" ++ ++msgid "Notify interval in seconds." ++msgstr "" ++ ++msgid "Notify interval:" ++msgstr "" ++ ++msgid "Pictures" ++msgstr "" ++ ++msgid "Port for HTTP (descriptions, SOAP, media transfer) traffic." ++msgstr "" ++ ++msgid "Port:" ++msgstr "" ++ ++msgid "Presentation URL:" ++msgstr "" ++ ++msgid "Root container:" ++msgstr "" ++ ++msgid "" ++"Serial number the miniDLNA daemon will report to clients in its XML " ++"description." ++msgstr "" ++ ++msgid "" ++"Set this if you want to customize the name that shows up on your clients." ++msgstr "" ++ ++msgid "" ++"Set this if you would like to specify the directory where you want MiniDLNA " ++"to store its database and album art cache." ++msgstr "" ++ ++msgid "" ++"Set this if you would like to specify the directory where you want MiniDLNA " ++"to store its log file." ++msgstr "" ++ ++msgid "" ++"Set this to enable inotify monitoring to automatically discover new files." ++msgstr "" ++ ++msgid "" ++"Set this to enable support for streaming .jpg and .mp3 files to a TiVo " ++"supporting HMO." ++msgstr "" ++ ++msgid "" ++"Set this to strictly adhere to DLNA standards. This will allow server-side " ++"downscaling of very large JPEG images, which may hurt JPEG serving " ++"performance on (at least) Sony DLNA products." ++msgstr "" ++ ++msgid "" ++"Set this to the directory you want scanned. If you want to restrict the " ++"directory to a specific content type, you can prepend the type ('A' for " ++"audio, 'V' for video, 'P' for images), followed by a comma, to the directory " ++"(eg. media_dir=A,/mnt/media/Music). Multiple directories can be specified." ++msgstr "" ++ ++msgid "Specify the path to the MiniSSDPd socket." ++msgstr "" ++ ++msgid "Standard container" ++msgstr "" ++ ++msgid "Strict to DLNA standard:" ++msgstr "" ++ ++msgid "" ++"The miniDLNA service is active, serving %d audio, %d video and %d image " ++"files." ++msgstr "" ++ ++msgid "The miniDLNA service is not running." ++msgstr "" ++ ++msgid "This is a list of file names to check for when searching for album art." ++msgstr "" ++ ++msgid "Video" ++msgstr "" ++ ++msgid "miniDLNA" ++msgstr "" ++ ++msgid "miniDLNA Status" ++msgstr "" ++ ++msgid "miniSSDP socket:" ++msgstr "" +diff --git a/feeds/luci/applications/luci-app-minidlna/po/sv/minidlna.po b/feeds/luci/applications/luci-app-minidlna/po/sv/minidlna.po +new file mode 100644 +index 0000000..51a3f3a +--- /dev/null ++++ b/feeds/luci/applications/luci-app-minidlna/po/sv/minidlna.po +@@ -0,0 +1,165 @@ ++msgid "" ++msgstr "" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Last-Translator: Automatically generated\n" ++"Language-Team: none\n" ++"Language: sv\n" ++"MIME-Version: 1.0\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n != 1);\n" ++ ++msgid "Advanced Settings" ++msgstr "" ++ ++msgid "Album art names:" ++msgstr "" ++ ++msgid "Announced model number:" ++msgstr "" ++ ++msgid "Announced serial number:" ++msgstr "" ++ ++msgid "Browse directory" ++msgstr "" ++ ++msgid "Collecting data..." ++msgstr "" ++ ++msgid "Database directory:" ++msgstr "" ++ ++msgid "Enable TIVO:" ++msgstr "" ++ ++msgid "Enable inotify:" ++msgstr "" ++ ++msgid "Enable:" ++msgstr "" ++ ++msgid "Friendly name:" ++msgstr "" ++ ++msgid "General Settings" ++msgstr "" ++ ++msgid "Interfaces:" ++msgstr "" ++ ++msgid "Log directory:" ++msgstr "" ++ ++msgid "Media directories:" ++msgstr "" ++ ++msgid "" ++"MiniDLNA is server software with the aim of being fully compliant with DLNA/" ++"UPnP-AV clients." ++msgstr "" ++ ++msgid "" ++"Model number the miniDLNA daemon will report to clients in its XML " ++"description." ++msgstr "" ++ ++msgid "Music" ++msgstr "" ++ ++msgid "Network interfaces to serve." ++msgstr "" ++ ++msgid "Notify interval in seconds." ++msgstr "" ++ ++msgid "Notify interval:" ++msgstr "" ++ ++msgid "Pictures" ++msgstr "" ++ ++msgid "Port for HTTP (descriptions, SOAP, media transfer) traffic." ++msgstr "" ++ ++msgid "Port:" ++msgstr "" ++ ++msgid "Presentation URL:" ++msgstr "" ++ ++msgid "Root container:" ++msgstr "" ++ ++msgid "" ++"Serial number the miniDLNA daemon will report to clients in its XML " ++"description." ++msgstr "" ++ ++msgid "" ++"Set this if you want to customize the name that shows up on your clients." ++msgstr "" ++ ++msgid "" ++"Set this if you would like to specify the directory where you want MiniDLNA " ++"to store its database and album art cache." ++msgstr "" ++ ++msgid "" ++"Set this if you would like to specify the directory where you want MiniDLNA " ++"to store its log file." ++msgstr "" ++ ++msgid "" ++"Set this to enable inotify monitoring to automatically discover new files." ++msgstr "" ++ ++msgid "" ++"Set this to enable support for streaming .jpg and .mp3 files to a TiVo " ++"supporting HMO." ++msgstr "" ++ ++msgid "" ++"Set this to strictly adhere to DLNA standards. This will allow server-side " ++"downscaling of very large JPEG images, which may hurt JPEG serving " ++"performance on (at least) Sony DLNA products." ++msgstr "" ++ ++msgid "" ++"Set this to the directory you want scanned. If you want to restrict the " ++"directory to a specific content type, you can prepend the type ('A' for " ++"audio, 'V' for video, 'P' for images), followed by a comma, to the directory " ++"(eg. media_dir=A,/mnt/media/Music). Multiple directories can be specified." ++msgstr "" ++ ++msgid "Specify the path to the MiniSSDPd socket." ++msgstr "" ++ ++msgid "Standard container" ++msgstr "" ++ ++msgid "Strict to DLNA standard:" ++msgstr "" ++ ++msgid "" ++"The miniDLNA service is active, serving %d audio, %d video and %d image " ++"files." ++msgstr "" ++ ++msgid "The miniDLNA service is not running." ++msgstr "" ++ ++msgid "This is a list of file names to check for when searching for album art." ++msgstr "" ++ ++msgid "Video" ++msgstr "" ++ ++msgid "miniDLNA" ++msgstr "" ++ ++msgid "miniDLNA Status" ++msgstr "" ++ ++msgid "miniSSDP socket:" ++msgstr "" +diff --git a/feeds/luci/applications/luci-app-minidlna/po/templates/minidlna.pot b/feeds/luci/applications/luci-app-minidlna/po/templates/minidlna.pot +new file mode 100644 +index 0000000..2b35d1e +--- /dev/null ++++ b/feeds/luci/applications/luci-app-minidlna/po/templates/minidlna.pot +@@ -0,0 +1,157 @@ ++msgid "" ++msgstr "Content-Type: text/plain; charset=UTF-8" ++ ++msgid "Advanced Settings" ++msgstr "" ++ ++msgid "Album art names:" ++msgstr "" ++ ++msgid "Announced model number:" ++msgstr "" ++ ++msgid "Announced serial number:" ++msgstr "" ++ ++msgid "Browse directory" ++msgstr "" ++ ++msgid "Collecting data..." ++msgstr "" ++ ++msgid "Database directory:" ++msgstr "" ++ ++msgid "Enable TIVO:" ++msgstr "" ++ ++msgid "Enable inotify:" ++msgstr "" ++ ++msgid "Enable:" ++msgstr "" ++ ++msgid "Friendly name:" ++msgstr "" ++ ++msgid "General Settings" ++msgstr "" ++ ++msgid "Interfaces:" ++msgstr "" ++ ++msgid "Log directory:" ++msgstr "" ++ ++msgid "Media directories:" ++msgstr "" ++ ++msgid "" ++"MiniDLNA is server software with the aim of being fully compliant with DLNA/" ++"UPnP-AV clients." ++msgstr "" ++ ++msgid "" ++"Model number the miniDLNA daemon will report to clients in its XML " ++"description." ++msgstr "" ++ ++msgid "Music" ++msgstr "" ++ ++msgid "Network interfaces to serve." ++msgstr "" ++ ++msgid "Notify interval in seconds." ++msgstr "" ++ ++msgid "Notify interval:" ++msgstr "" ++ ++msgid "Pictures" ++msgstr "" ++ ++msgid "Port for HTTP (descriptions, SOAP, media transfer) traffic." ++msgstr "" ++ ++msgid "Port:" ++msgstr "" ++ ++msgid "Presentation URL:" ++msgstr "" ++ ++msgid "Root container:" ++msgstr "" ++ ++msgid "" ++"Serial number the miniDLNA daemon will report to clients in its XML " ++"description." ++msgstr "" ++ ++msgid "" ++"Set this if you want to customize the name that shows up on your clients." ++msgstr "" ++ ++msgid "" ++"Set this if you would like to specify the directory where you want MiniDLNA " ++"to store its database and album art cache." ++msgstr "" ++ ++msgid "" ++"Set this if you would like to specify the directory where you want MiniDLNA " ++"to store its log file." ++msgstr "" ++ ++msgid "" ++"Set this to enable inotify monitoring to automatically discover new files." ++msgstr "" ++ ++msgid "" ++"Set this to enable support for streaming .jpg and .mp3 files to a TiVo " ++"supporting HMO." ++msgstr "" ++ ++msgid "" ++"Set this to strictly adhere to DLNA standards. This will allow server-side " ++"downscaling of very large JPEG images, which may hurt JPEG serving " ++"performance on (at least) Sony DLNA products." ++msgstr "" ++ ++msgid "" ++"Set this to the directory you want scanned. If you want to restrict the " ++"directory to a specific content type, you can prepend the type ('A' for " ++"audio, 'V' for video, 'P' for images), followed by a comma, to the directory " ++"(eg. media_dir=A,/mnt/media/Music). Multiple directories can be specified." ++msgstr "" ++ ++msgid "Specify the path to the MiniSSDPd socket." ++msgstr "" ++ ++msgid "Standard container" ++msgstr "" ++ ++msgid "Strict to DLNA standard:" ++msgstr "" ++ ++msgid "" ++"The miniDLNA service is active, serving %d audio, %d video and %d image " ++"files." ++msgstr "" ++ ++msgid "The miniDLNA service is not running." ++msgstr "" ++ ++msgid "This is a list of file names to check for when searching for album art." ++msgstr "" ++ ++msgid "Video" ++msgstr "" ++ ++msgid "miniDLNA" ++msgstr "" ++ ++msgid "miniDLNA Status" ++msgstr "" ++ ++msgid "miniSSDP socket:" ++msgstr "" +diff --git a/feeds/luci/applications/luci-app-minidlna/po/tr/minidlna.po b/feeds/luci/applications/luci-app-minidlna/po/tr/minidlna.po +new file mode 100644 +index 0000000..070d64c +--- /dev/null ++++ b/feeds/luci/applications/luci-app-minidlna/po/tr/minidlna.po +@@ -0,0 +1,164 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Last-Translator: Automatically generated\n" ++"Language-Team: none\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=1; plural=0;\n" ++ ++msgid "Advanced Settings" ++msgstr "" ++ ++msgid "Album art names:" ++msgstr "" ++ ++msgid "Announced model number:" ++msgstr "" ++ ++msgid "Announced serial number:" ++msgstr "" ++ ++msgid "Browse directory" ++msgstr "" ++ ++msgid "Collecting data..." ++msgstr "" ++ ++msgid "Database directory:" ++msgstr "" ++ ++msgid "Enable TIVO:" ++msgstr "" ++ ++msgid "Enable inotify:" ++msgstr "" ++ ++msgid "Enable:" ++msgstr "" ++ ++msgid "Friendly name:" ++msgstr "" ++ ++msgid "General Settings" ++msgstr "" ++ ++msgid "Interfaces:" ++msgstr "" ++ ++msgid "Log directory:" ++msgstr "" ++ ++msgid "Media directories:" ++msgstr "" ++ ++msgid "" ++"MiniDLNA is server software with the aim of being fully compliant with DLNA/" ++"UPnP-AV clients." ++msgstr "" ++ ++msgid "" ++"Model number the miniDLNA daemon will report to clients in its XML " ++"description." ++msgstr "" ++ ++msgid "Music" ++msgstr "" ++ ++msgid "Network interfaces to serve." ++msgstr "" ++ ++msgid "Notify interval in seconds." ++msgstr "" ++ ++msgid "Notify interval:" ++msgstr "" ++ ++msgid "Pictures" ++msgstr "" ++ ++msgid "Port for HTTP (descriptions, SOAP, media transfer) traffic." ++msgstr "" ++ ++msgid "Port:" ++msgstr "" ++ ++msgid "Presentation URL:" ++msgstr "" ++ ++msgid "Root container:" ++msgstr "" ++ ++msgid "" ++"Serial number the miniDLNA daemon will report to clients in its XML " ++"description." ++msgstr "" ++ ++msgid "" ++"Set this if you want to customize the name that shows up on your clients." ++msgstr "" ++ ++msgid "" ++"Set this if you would like to specify the directory where you want MiniDLNA " ++"to store its database and album art cache." ++msgstr "" ++ ++msgid "" ++"Set this if you would like to specify the directory where you want MiniDLNA " ++"to store its log file." ++msgstr "" ++ ++msgid "" ++"Set this to enable inotify monitoring to automatically discover new files." ++msgstr "" ++ ++msgid "" ++"Set this to enable support for streaming .jpg and .mp3 files to a TiVo " ++"supporting HMO." ++msgstr "" ++ ++msgid "" ++"Set this to strictly adhere to DLNA standards. This will allow server-side " ++"downscaling of very large JPEG images, which may hurt JPEG serving " ++"performance on (at least) Sony DLNA products." ++msgstr "" ++ ++msgid "" ++"Set this to the directory you want scanned. If you want to restrict the " ++"directory to a specific content type, you can prepend the type ('A' for " ++"audio, 'V' for video, 'P' for images), followed by a comma, to the directory " ++"(eg. media_dir=A,/mnt/media/Music). Multiple directories can be specified." ++msgstr "" ++ ++msgid "Specify the path to the MiniSSDPd socket." ++msgstr "" ++ ++msgid "Standard container" ++msgstr "" ++ ++msgid "Strict to DLNA standard:" ++msgstr "" ++ ++msgid "" ++"The miniDLNA service is active, serving %d audio, %d video and %d image " ++"files." ++msgstr "" ++ ++msgid "The miniDLNA service is not running." ++msgstr "" ++ ++msgid "This is a list of file names to check for when searching for album art." ++msgstr "" ++ ++msgid "Video" ++msgstr "" ++ ++msgid "miniDLNA" ++msgstr "" ++ ++msgid "miniDLNA Status" ++msgstr "" ++ ++msgid "miniSSDP socket:" ++msgstr "" +diff --git a/feeds/luci/applications/luci-app-minidlna/po/uk/minidlna.po b/feeds/luci/applications/luci-app-minidlna/po/uk/minidlna.po +new file mode 100644 +index 0000000..7df732f +--- /dev/null ++++ b/feeds/luci/applications/luci-app-minidlna/po/uk/minidlna.po +@@ -0,0 +1,165 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Last-Translator: Automatically generated\n" ++"Language-Team: none\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n" ++"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" ++ ++msgid "Advanced Settings" ++msgstr "" ++ ++msgid "Album art names:" ++msgstr "" ++ ++msgid "Announced model number:" ++msgstr "" ++ ++msgid "Announced serial number:" ++msgstr "" ++ ++msgid "Browse directory" ++msgstr "" ++ ++msgid "Collecting data..." ++msgstr "" ++ ++msgid "Database directory:" ++msgstr "" ++ ++msgid "Enable TIVO:" ++msgstr "" ++ ++msgid "Enable inotify:" ++msgstr "" ++ ++msgid "Enable:" ++msgstr "" ++ ++msgid "Friendly name:" ++msgstr "" ++ ++msgid "General Settings" ++msgstr "" ++ ++msgid "Interfaces:" ++msgstr "" ++ ++msgid "Log directory:" ++msgstr "" ++ ++msgid "Media directories:" ++msgstr "" ++ ++msgid "" ++"MiniDLNA is server software with the aim of being fully compliant with DLNA/" ++"UPnP-AV clients." ++msgstr "" ++ ++msgid "" ++"Model number the miniDLNA daemon will report to clients in its XML " ++"description." ++msgstr "" ++ ++msgid "Music" ++msgstr "" ++ ++msgid "Network interfaces to serve." ++msgstr "" ++ ++msgid "Notify interval in seconds." ++msgstr "" ++ ++msgid "Notify interval:" ++msgstr "" ++ ++msgid "Pictures" ++msgstr "" ++ ++msgid "Port for HTTP (descriptions, SOAP, media transfer) traffic." ++msgstr "" ++ ++msgid "Port:" ++msgstr "" ++ ++msgid "Presentation URL:" ++msgstr "" ++ ++msgid "Root container:" ++msgstr "" ++ ++msgid "" ++"Serial number the miniDLNA daemon will report to clients in its XML " ++"description." ++msgstr "" ++ ++msgid "" ++"Set this if you want to customize the name that shows up on your clients." ++msgstr "" ++ ++msgid "" ++"Set this if you would like to specify the directory where you want MiniDLNA " ++"to store its database and album art cache." ++msgstr "" ++ ++msgid "" ++"Set this if you would like to specify the directory where you want MiniDLNA " ++"to store its log file." ++msgstr "" ++ ++msgid "" ++"Set this to enable inotify monitoring to automatically discover new files." ++msgstr "" ++ ++msgid "" ++"Set this to enable support for streaming .jpg and .mp3 files to a TiVo " ++"supporting HMO." ++msgstr "" ++ ++msgid "" ++"Set this to strictly adhere to DLNA standards. This will allow server-side " ++"downscaling of very large JPEG images, which may hurt JPEG serving " ++"performance on (at least) Sony DLNA products." ++msgstr "" ++ ++msgid "" ++"Set this to the directory you want scanned. If you want to restrict the " ++"directory to a specific content type, you can prepend the type ('A' for " ++"audio, 'V' for video, 'P' for images), followed by a comma, to the directory " ++"(eg. media_dir=A,/mnt/media/Music). Multiple directories can be specified." ++msgstr "" ++ ++msgid "Specify the path to the MiniSSDPd socket." ++msgstr "" ++ ++msgid "Standard container" ++msgstr "" ++ ++msgid "Strict to DLNA standard:" ++msgstr "" ++ ++msgid "" ++"The miniDLNA service is active, serving %d audio, %d video and %d image " ++"files." ++msgstr "" ++ ++msgid "The miniDLNA service is not running." ++msgstr "" ++ ++msgid "This is a list of file names to check for when searching for album art." ++msgstr "" ++ ++msgid "Video" ++msgstr "" ++ ++msgid "miniDLNA" ++msgstr "" ++ ++msgid "miniDLNA Status" ++msgstr "" ++ ++msgid "miniSSDP socket:" ++msgstr "" +diff --git a/feeds/luci/applications/luci-app-minidlna/po/vi/minidlna.po b/feeds/luci/applications/luci-app-minidlna/po/vi/minidlna.po +new file mode 100644 +index 0000000..070d64c +--- /dev/null ++++ b/feeds/luci/applications/luci-app-minidlna/po/vi/minidlna.po +@@ -0,0 +1,164 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Last-Translator: Automatically generated\n" ++"Language-Team: none\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=1; plural=0;\n" ++ ++msgid "Advanced Settings" ++msgstr "" ++ ++msgid "Album art names:" ++msgstr "" ++ ++msgid "Announced model number:" ++msgstr "" ++ ++msgid "Announced serial number:" ++msgstr "" ++ ++msgid "Browse directory" ++msgstr "" ++ ++msgid "Collecting data..." ++msgstr "" ++ ++msgid "Database directory:" ++msgstr "" ++ ++msgid "Enable TIVO:" ++msgstr "" ++ ++msgid "Enable inotify:" ++msgstr "" ++ ++msgid "Enable:" ++msgstr "" ++ ++msgid "Friendly name:" ++msgstr "" ++ ++msgid "General Settings" ++msgstr "" ++ ++msgid "Interfaces:" ++msgstr "" ++ ++msgid "Log directory:" ++msgstr "" ++ ++msgid "Media directories:" ++msgstr "" ++ ++msgid "" ++"MiniDLNA is server software with the aim of being fully compliant with DLNA/" ++"UPnP-AV clients." ++msgstr "" ++ ++msgid "" ++"Model number the miniDLNA daemon will report to clients in its XML " ++"description." ++msgstr "" ++ ++msgid "Music" ++msgstr "" ++ ++msgid "Network interfaces to serve." ++msgstr "" ++ ++msgid "Notify interval in seconds." ++msgstr "" ++ ++msgid "Notify interval:" ++msgstr "" ++ ++msgid "Pictures" ++msgstr "" ++ ++msgid "Port for HTTP (descriptions, SOAP, media transfer) traffic." ++msgstr "" ++ ++msgid "Port:" ++msgstr "" ++ ++msgid "Presentation URL:" ++msgstr "" ++ ++msgid "Root container:" ++msgstr "" ++ ++msgid "" ++"Serial number the miniDLNA daemon will report to clients in its XML " ++"description." ++msgstr "" ++ ++msgid "" ++"Set this if you want to customize the name that shows up on your clients." ++msgstr "" ++ ++msgid "" ++"Set this if you would like to specify the directory where you want MiniDLNA " ++"to store its database and album art cache." ++msgstr "" ++ ++msgid "" ++"Set this if you would like to specify the directory where you want MiniDLNA " ++"to store its log file." ++msgstr "" ++ ++msgid "" ++"Set this to enable inotify monitoring to automatically discover new files." ++msgstr "" ++ ++msgid "" ++"Set this to enable support for streaming .jpg and .mp3 files to a TiVo " ++"supporting HMO." ++msgstr "" ++ ++msgid "" ++"Set this to strictly adhere to DLNA standards. This will allow server-side " ++"downscaling of very large JPEG images, which may hurt JPEG serving " ++"performance on (at least) Sony DLNA products." ++msgstr "" ++ ++msgid "" ++"Set this to the directory you want scanned. If you want to restrict the " ++"directory to a specific content type, you can prepend the type ('A' for " ++"audio, 'V' for video, 'P' for images), followed by a comma, to the directory " ++"(eg. media_dir=A,/mnt/media/Music). Multiple directories can be specified." ++msgstr "" ++ ++msgid "Specify the path to the MiniSSDPd socket." ++msgstr "" ++ ++msgid "Standard container" ++msgstr "" ++ ++msgid "Strict to DLNA standard:" ++msgstr "" ++ ++msgid "" ++"The miniDLNA service is active, serving %d audio, %d video and %d image " ++"files." ++msgstr "" ++ ++msgid "The miniDLNA service is not running." ++msgstr "" ++ ++msgid "This is a list of file names to check for when searching for album art." ++msgstr "" ++ ++msgid "Video" ++msgstr "" ++ ++msgid "miniDLNA" ++msgstr "" ++ ++msgid "miniDLNA Status" ++msgstr "" ++ ++msgid "miniSSDP socket:" ++msgstr "" +diff --git a/feeds/luci/applications/luci-app-minidlna/po/zh-cn/minidlna.po b/feeds/luci/applications/luci-app-minidlna/po/zh-cn/minidlna.po +new file mode 100644 +index 0000000..9989756 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-minidlna/po/zh-cn/minidlna.po +@@ -0,0 +1,172 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"PO-Revision-Date: 2014-07-07 16:21+0200\n" ++"Last-Translator: qiuchengxuan \n" ++"Language-Team: none\n" ++"Language: zh_CN\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=1; plural=0;\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "Advanced Settings" ++msgstr "高级设置" ++ ++msgid "Album art names:" ++msgstr "专辑å°é¢å称:" ++ ++msgid "Announced model number:" ++msgstr "通告型å·ï¼š" ++ ++msgid "Announced serial number:" ++msgstr "通告编å·ï¼š" ++ ++msgid "Browse directory" ++msgstr "æµè§ˆç›®å½•" ++ ++msgid "Collecting data..." ++msgstr "收集数æ®..." ++ ++msgid "Database directory:" ++msgstr "æ•°æ®åº“目录:" ++ ++msgid "Enable TIVO:" ++msgstr "å¯ç”¨TIVO:" ++ ++msgid "Enable inotify:" ++msgstr "å¯ç”¨inotify:" ++ ++msgid "Enable:" ++msgstr "å¯ç”¨ï¼š" ++ ++msgid "Friendly name:" ++msgstr "å‹å¥½å称:" ++ ++msgid "General Settings" ++msgstr "基本设置" ++ ++msgid "Interfaces:" ++msgstr "接å£ï¼š" ++ ++msgid "Log directory:" ++msgstr "日志目录:" ++ ++msgid "Media directories:" ++msgstr "媒体目录:" ++ ++msgid "" ++"MiniDLNA is server software with the aim of being fully compliant with DLNA/" ++"UPnP-AV clients." ++msgstr "MiniDLNA是目标为完全兼容DLNA / UPnP-AV客户端的æœåŠ¡å™¨è½¯ä»¶ã€‚" ++ ++msgid "" ++"Model number the miniDLNA daemon will report to clients in its XML " ++"description." ++msgstr "miniDLNA守护程åºå°†åœ¨å…¶XMLæ述中å‘客户端通告型å·ã€‚" ++ ++msgid "Music" ++msgstr "音ä¹" ++ ++msgid "Network interfaces to serve." ++msgstr "æœåŠ¡çš„网络接å£ã€‚" ++ ++msgid "Notify interval in seconds." ++msgstr "通知的时间间隔,以秒为å•ä½ã€‚" ++ ++msgid "Notify interval:" ++msgstr "通知的时间间隔:" ++ ++msgid "Pictures" ++msgstr "图片" ++ ++msgid "Port for HTTP (descriptions, SOAP, media transfer) traffic." ++msgstr "Port for HTTP (descriptions, SOAP, media transfer) traffic." ++ ++msgid "Port:" ++msgstr "端å£ï¼š" ++ ++msgid "Presentation URL:" ++msgstr "æœåŠ¡ç½‘å€" ++ ++msgid "Root container:" ++msgstr "根目录:" ++ ++msgid "" ++"Serial number the miniDLNA daemon will report to clients in its XML " ++"description." ++msgstr "miniDLNA守护程åºå°†åœ¨å…¶XMLæ述中å‘客户端通告编å·ã€‚" ++ ++msgid "" ++"Set this if you want to customize the name that shows up on your clients." ++msgstr "设置自定义å称。" ++ ++msgid "" ++"Set this if you would like to specify the directory where you want MiniDLNA " ++"to store its database and album art cache." ++msgstr "设置miniDLNA缓存目录" ++ ++msgid "" ++"Set this if you would like to specify the directory where you want MiniDLNA " ++"to store its log file." ++msgstr "设置miniDLNA日志目录" ++ ++msgid "" ++"Set this to enable inotify monitoring to automatically discover new files." ++msgstr "设定å¯ç”¨inotify监控,自动å‘现新的文件。" ++ ++msgid "" ++"Set this to enable support for streaming .jpg and .mp3 files to a TiVo " ++"supporting HMO." ++msgstr "为HMO TiVoå¯ç”¨JPGå’ŒMP3æµåª’体支æŒã€‚" ++ ++msgid "" ++"Set this to strictly adhere to DLNA standards. This will allow server-side " ++"downscaling of very large JPEG images, which may hurt JPEG serving " ++"performance on (at least) Sony DLNA products." ++msgstr "" ++"设定严格éµå®ˆDLNA标准。这将å…许æœåŠ¡å™¨ç«¯é™å°å¤§å°ºå¯¸JPEG图åƒï¼Œåœ¨ï¼ˆè‡³å°‘)索尼DLNA" ++"的产å“è¿™å¯èƒ½ä¼šé™ä½ŽJPEGæœåŠ¡æ€§èƒ½ã€‚" ++ ++# 如果写æˆmedia_dir=A,/mnt/media/Music,uci会报错。实际上应该是A,/mnt/media/Music,这样生æˆçš„minidlna.conf刚好是media_dir=A,/mnt/media/Music ++msgid "" ++"Set this to the directory you want scanned. If you want to restrict the " ++"directory to a specific content type, you can prepend the type ('A' for " ++"audio, 'V' for video, 'P' for images), followed by a comma, to the directory " ++"(eg. media_dir=A,/mnt/media/Music). Multiple directories can be specified." ++msgstr "" ++"设置è¦æ‰«æ的目录。如果你想é™åˆ¶ç‰¹å®šå†…容类型的目录,你å¯ä»¥åœ¨å‰é¢åŠ ä¸Šç±»åž‹ï¼ˆç”¨äºŽéŸ³é¢‘'A','V'视频,'P'图片),其次是用逗å·åˆ†éš”的目录(如A,/mnt" ++"/媒体/音ä¹ï¼‰ã€‚å¯ä»¥æŒ‡å®šå¤šä¸ªç›®å½•ã€‚" ++ ++msgid "Specify the path to the MiniSSDPd socket." ++msgstr "指定MiniSSDPd socket的路径。" ++ ++msgid "Standard container" ++msgstr "基本目录" ++ ++msgid "Strict to DLNA standard:" ++msgstr "严格的DLNA标准:" ++ ++msgid "" ++"The miniDLNA service is active, serving %d audio, %d video and %d image " ++"files." ++msgstr "miniDLNAæœåŠ¡å·²å¯ç”¨ï¼Œæä¾› %d 音频, %d 视频 å’Œ %d 图片." ++ ++msgid "The miniDLNA service is not running." ++msgstr "miniDLNAæœåŠ¡æœªå¯ç”¨" ++ ++msgid "This is a list of file names to check for when searching for album art." ++msgstr "这是一个文件å列表,为æœç´¢ä¸“辑å°é¢ã€‚" ++ ++msgid "Video" ++msgstr "视频" ++ ++msgid "miniDLNA" ++msgstr "miniDLNA" ++ ++msgid "miniDLNA Status" ++msgstr "miniDLNA 状æ€" ++ ++msgid "miniSSDP socket:" ++msgstr "miniSSDP socket:" +diff --git a/feeds/luci/applications/luci-app-minidlna/po/zh-tw/minidlna.po b/feeds/luci/applications/luci-app-minidlna/po/zh-tw/minidlna.po +new file mode 100644 +index 0000000..1af3280 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-minidlna/po/zh-tw/minidlna.po +@@ -0,0 +1,167 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"PO-Revision-Date: 2014-05-14 13:15+0200\n" ++"Last-Translator: omnistack \n" ++"Language-Team: none\n" ++"Language: zh_TW\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=1; plural=0;\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "Advanced Settings" ++msgstr "進階設定值" ++ ++msgid "Album art names:" ++msgstr "專輯å稱" ++ ++msgid "Announced model number:" ++msgstr "已宣告型號數é‡" ++ ++msgid "Announced serial number:" ++msgstr "已宣告åºè™Ÿæ•¸é‡" ++ ++msgid "Browse directory" ++msgstr "ç€è¦½ç›®éŒ„" ++ ++msgid "Collecting data..." ++msgstr "收集資料進行中..." ++ ++msgid "Database directory:" ++msgstr "資料庫目錄所在:" ++ ++msgid "Enable TIVO:" ++msgstr "啟用TIVO代錄" ++ ++msgid "Enable inotify:" ++msgstr "啟用檔案事件監控" ++ ++msgid "Enable:" ++msgstr "啟用:" ++ ++msgid "Friendly name:" ++msgstr "å‹å–„å稱" ++ ++msgid "General Settings" ++msgstr "一般設定值" ++ ++msgid "Interfaces:" ++msgstr "介é¢" ++ ++msgid "Log directory:" ++msgstr "Log紀錄放置å€" ++ ++msgid "Media directories:" ++msgstr "媒體目錄å€:" ++ ++msgid "" ++"MiniDLNA is server software with the aim of being fully compliant with DLNA/" ++"UPnP-AV clients." ++msgstr "MiniDLNA是一個伺æœå™¨è»Ÿé«”é‡å°èƒ½å®Œå…¨å…¼å®¹DLNA/UPnP-AV用戶端." ++ ++msgid "" ++"Model number the miniDLNA daemon will report to clients in its XML " ++"description." ++msgstr "" ++ ++msgid "Music" ++msgstr "" ++ ++msgid "Network interfaces to serve." ++msgstr "" ++ ++msgid "Notify interval in seconds." ++msgstr "" ++ ++msgid "Notify interval:" ++msgstr "" ++ ++msgid "Pictures" ++msgstr "" ++ ++msgid "Port for HTTP (descriptions, SOAP, media transfer) traffic." ++msgstr "" ++ ++msgid "Port:" ++msgstr "" ++ ++msgid "Presentation URL:" ++msgstr "" ++ ++msgid "Root container:" ++msgstr "" ++ ++msgid "" ++"Serial number the miniDLNA daemon will report to clients in its XML " ++"description." ++msgstr "" ++ ++msgid "" ++"Set this if you want to customize the name that shows up on your clients." ++msgstr "" ++ ++msgid "" ++"Set this if you would like to specify the directory where you want MiniDLNA " ++"to store its database and album art cache." ++msgstr "" ++ ++msgid "" ++"Set this if you would like to specify the directory where you want MiniDLNA " ++"to store its log file." ++msgstr "" ++ ++msgid "" ++"Set this to enable inotify monitoring to automatically discover new files." ++msgstr "" ++ ++msgid "" ++"Set this to enable support for streaming .jpg and .mp3 files to a TiVo " ++"supporting HMO." ++msgstr "" ++ ++msgid "" ++"Set this to strictly adhere to DLNA standards. This will allow server-side " ++"downscaling of very large JPEG images, which may hurt JPEG serving " ++"performance on (at least) Sony DLNA products." ++msgstr "" ++ ++msgid "" ++"Set this to the directory you want scanned. If you want to restrict the " ++"directory to a specific content type, you can prepend the type ('A' for " ++"audio, 'V' for video, 'P' for images), followed by a comma, to the directory " ++"(eg. media_dir=A,/mnt/media/Music). Multiple directories can be specified." ++msgstr "" ++ ++msgid "Specify the path to the MiniSSDPd socket." ++msgstr "" ++ ++msgid "Standard container" ++msgstr "" ++ ++msgid "Strict to DLNA standard:" ++msgstr "" ++ ++msgid "" ++"The miniDLNA service is active, serving %d audio, %d video and %d image " ++"files." ++msgstr "" ++ ++msgid "The miniDLNA service is not running." ++msgstr "" ++ ++msgid "This is a list of file names to check for when searching for album art." ++msgstr "" ++ ++msgid "Video" ++msgstr "" ++ ++msgid "miniDLNA" ++msgstr "" ++ ++msgid "miniDLNA Status" ++msgstr "" ++ ++msgid "miniSSDP socket:" ++msgstr "" +diff --git a/feeds/luci/applications/luci-app-minidlna/root/etc/uci-defaults/luci-minidlna b/feeds/luci/applications/luci-app-minidlna/root/etc/uci-defaults/luci-minidlna +new file mode 100755 +index 0000000..df43c1b +--- /dev/null ++++ b/feeds/luci/applications/luci-app-minidlna/root/etc/uci-defaults/luci-minidlna +@@ -0,0 +1,15 @@ ++#!/bin/sh ++ ++/etc/init.d/minidlna enabled && { ++ /etc/init.d/minidlna stop ++ /etc/init.d/minidlna disable ++} ++ ++uci -q batch <<-EOF >/dev/null ++ delete ucitrack.minidlna ++ set ucitrack.minidlna=minidlna ++ commit ucitrack ++EOF ++ ++rm -f /tmp/luci-indexcache ++exit 0 +diff --git a/feeds/luci/applications/luci-app-mjpg-streamer/Makefile b/feeds/luci/applications/luci-app-mjpg-streamer/Makefile +new file mode 100644 +index 0000000..faa024d +--- /dev/null ++++ b/feeds/luci/applications/luci-app-mjpg-streamer/Makefile +@@ -0,0 +1,14 @@ ++# ++# Copyright (C) 2008-2014 The LuCI Team ++# ++# This is free software, licensed under the Apache License, Version 2.0 . ++# ++ ++include $(TOPDIR)/rules.mk ++ ++LUCI_TITLE:=MJPG-Streamer service configuration module ++LUCI_DEPENDS:=+mjpg-streamer ++ ++include ../../luci.mk ++ ++# call BuildPackage - OpenWrt buildroot signature +diff --git a/feeds/luci/applications/luci-app-mjpg-streamer/luasrc/controller/mjpg-streamer.lua b/feeds/luci/applications/luci-app-mjpg-streamer/luasrc/controller/mjpg-streamer.lua +new file mode 100644 +index 0000000..81fd3b3 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-mjpg-streamer/luasrc/controller/mjpg-streamer.lua +@@ -0,0 +1,17 @@ ++-- Copyright 2014 Roger D ++-- Licensed to the public under the Apache License 2.0. ++ ++module("luci.controller.mjpg-streamer", package.seeall) ++ ++function index() ++ require("luci.i18n") ++ luci.i18n.loadc("mjpg-streamer") ++ if not nixio.fs.access("/etc/config/mjpg-streamer") then ++ return ++ end ++ ++ local page = entry({"admin", "services", "mjpg-streamer"}, cbi("mjpg-streamer"), _("MJPG-streamer")) ++ page.i18n = "mjpg-streamer" ++ page.dependent = true ++ ++end +diff --git a/feeds/luci/applications/luci-app-mjpg-streamer/luasrc/model/cbi/mjpg-streamer.lua b/feeds/luci/applications/luci-app-mjpg-streamer/luasrc/model/cbi/mjpg-streamer.lua +new file mode 100644 +index 0000000..d89ab27 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-mjpg-streamer/luasrc/model/cbi/mjpg-streamer.lua +@@ -0,0 +1,223 @@ ++-- Copyright 2014 Roger D ++-- Licensed to the public under the Apache License 2.0. ++ ++m = Map("mjpg-streamer", "MJPG-streamer", translate("mjpg streamer is a streaming application for Linux-UVC compatible webcams")) ++ ++--- General settings --- ++ ++section_gen = m:section(TypedSection, "mjpg-streamer", translate("General")) ++ section_gen.addremove=false ++ section_gen.anonymous=true ++ ++enabled = section_gen:option(Flag, "enabled", translate("Enabled"), translate("Enable MJPG-streamer")) ++ ++input = section_gen:option(ListValue, "input", translate("Input plugin")) ++ input:depends("enabled", "1") ++ input:value("uvc", "UVC") ++ ---input:value("file", "File") ++ input.optional = false ++ ++output = section_gen:option(ListValue, "output", translate("Output plugin")) ++ output:depends("enabled", "1") ++ output:value("http", "HTTP") ++ output:value("file", "File") ++ output.optional = false ++ ++ ++--- Plugin settings --- ++ ++s = m:section(TypedSection, "mjpg-streamer", translate("Plugin settings")) ++ s.addremove=false ++ s.anonymous=true ++ ++ s:tab("output_http", translate("HTTP output")) ++ s:tab("output_file", translate("File output")) ++ s:tab("input_uvc", translate("UVC input")) ++ ---s:tab("input_file", translate("File input")) ++ ++ ++--- Input UVC settings --- ++ ++this_tab = "input_uvc" ++ ++device = s:taboption(this_tab, Value, "device", translate("Device")) ++ device.default="/dev/video0" ++ --device.datatype = "device" ++ device:value("/dev/video0", "/dev/video0") ++ device:value("/dev/video1", "/dev/video1") ++ device:value("/dev/video2", "/dev/video2") ++ device.optional = false ++ ++resolution = s:taboption(this_tab, Value, "resolution", translate("Resolution")) ++ resolution.default = "640x480" ++ resolution:value("320x240", "320x240") ++ resolution:value("640x480", "640x480") ++ resolution:value("800x600", "800x600") ++ resolution:value("864x480", "864x480") ++ resolution:value("960x544", "960x544") ++ resolution:value("960x720", "960x720") ++ resolution:value("1280x720", "1280x720") ++ resolution:value("1280x960", "1280x960") ++ resolution:value("1920x1080", "1920x1080") ++ resolution.optional = true ++ ++fps = s:taboption(this_tab, Value, "fps", translate("Frames per second")) ++ fps.datatype = "and(uinteger, min(1))" ++ fps.placeholder = "5" ++ fps.optional = true ++ ++yuv = s:taboption(this_tab, Flag, "yuv", translate("Enable YUYV format"), translate("Automatic disabling of MJPEG mode")) ++ ++quality = s:taboption(this_tab, Value, "quality", translate("JPEG compression quality"), translate("Set the quality in percent. This setting activates YUYV format, disables MJPEG")) ++ quality.datatype = "range(0, 100)" ++ ++minimum_size = s:taboption(this_tab, Value, "minimum_size", translate("Drop frames smaller then this limit"),translate("Set the minimum size if the webcam produces small-sized garbage frames. May happen under low light conditions")) ++ minimum_size.datatype = "uinteger" ++ ++no_dynctrl = s:taboption(this_tab, Flag, "no_dynctrl", translate("Don't initalize dynctrls"), translate("Do not initalize dynctrls of Linux-UVC driver")) ++ ++led = s:taboption(this_tab, ListValue, "led", translate("Led control")) ++ led:value("on", translate("On")) ++ led:value("off", translate("Off")) ++ led:value("blink", translate("Blink")) ++ led:value("auto", translate("Auto")) ++ led.optional = true ++ ++ ++--- Output HTTP settings --- ++ ++this_tab = "output_http" ++ ++port=s:taboption(this_tab, Value, "port", translate("Port"), translate("TCP port for this HTTP server")) ++ port.datatype = "port" ++ port.placeholder = "8080" ++ ++enable_auth = s:taboption(this_tab, Flag, "enable_auth", translate("Authentication required"), translate("Ask for username and password on connect")) ++ enable_auth.default = false ++ ++username = s:taboption(this_tab, Value, "username", translate("Username")) ++ username:depends("enable_auth", "1") ++ username.optional = false ++ ++password = s:taboption(this_tab, Value, "password", translate("Password")) ++ password:depends("enable_auth", "1") ++ password.password = true ++ password.optional = false ++ password.default = false ++ ++www = s:taboption(this_tab, Value, "www", translate("WWW folder"), translate("Folder that contains webpages")) ++ www.datatype = "directory" ++ www.default = "/www/webcam/" ++ www.optional = false ++ ++ ++--- HTTP preview --- ++ ++html = [[ ++ ++ ++
    ++ ++

    Stream unavailable

    ++
    ++ ++ ++]] ++ ++preview = s:taboption(this_tab, DummyValue, "_dummy", html) ++ preview:depends("output", "http") ++ ++--- Output file settings --- ++ ++this_tab = "output_file" ++ ++folder=s:taboption(this_tab, Value, "folder", translate("Folder"), translate("Set folder to save pictures")) ++ folder.placeholder="/tmp/images" ++ folder.datatype = "directory" ++ ++--mjpeg=s:taboption(this_tab, Value, "mjpeg", translate("Mjpeg output"), translate("Check to save the stream to an mjpeg file")) ++ ++delay=s:taboption(this_tab, Value, "delay", translate("Interval between saving pictures"), translate("Set the inteval in millisecond")) ++ delay.placeholder="5000" ++ delay.datatype = "uinteger" ++ ++ringbuffer=s:taboption(this_tab, Value, "ringbuffer", translate("Ring buffer size"), translate("Max. number of pictures to hold")) ++ ringbuffer.placeholder="10" ++ ringbuffer.datatype = "uinteger" ++ ++exceed=s:taboption(this_tab, Value, "exceed", translate("Exceed"), translate("Allow ringbuffer to exceed limit by this amount")) ++ exceed.datatype = "uinteger" ++ ++command=s:taboption(this_tab, Value, "command", translate("Command to run"), translate("Execute command after saving picture. Mjpg-streamer parse the filename as first parameter to your script.")) ++ ++ ++return m +diff --git a/feeds/luci/applications/luci-app-mjpg-streamer/po/templates/mjpg-streamer.pot b/feeds/luci/applications/luci-app-mjpg-streamer/po/templates/mjpg-streamer.pot +new file mode 100644 +index 0000000..5cd722f +--- /dev/null ++++ b/feeds/luci/applications/luci-app-mjpg-streamer/po/templates/mjpg-streamer.pot +@@ -0,0 +1,135 @@ ++msgid "" ++msgstr "Content-Type: text/plain; charset=UTF-8" ++ ++msgid "Allow ringbuffer to exceed limit by this amount" ++msgstr "" ++ ++msgid "Ask for username and password on connect" ++msgstr "" ++ ++msgid "Authentication required" ++msgstr "" ++ ++msgid "Auto" ++msgstr "" ++ ++msgid "Automatic disabling of MJPEG mode" ++msgstr "" ++ ++msgid "Blink" ++msgstr "" ++ ++msgid "Check to save the stream to an mjpeg file" ++msgstr "" ++ ++msgid "Command to run" ++msgstr "" ++ ++msgid "Device" ++msgstr "" ++ ++msgid "Do not initalize dynctrls of Linux-UVC driver" ++msgstr "" ++ ++msgid "Don't initalize dynctrls" ++msgstr "" ++ ++msgid "Drop frames smaller then this limit" ++msgstr "" ++ ++msgid "Enable YUYV format" ++msgstr "" ++ ++msgid "Exceed" ++msgstr "" ++ ++msgid "" ++"Execute command after saving picture. Mjpg-streamer parse the filename as " ++"first parameter to your script." ++msgstr "" ++ ++msgid "File input" ++msgstr "" ++ ++msgid "File output" ++msgstr "" ++ ++msgid "Folder" ++msgstr "" ++ ++msgid "Folder that contains webpages" ++msgstr "" ++ ++msgid "Frames per second" ++msgstr "" ++ ++msgid "HTTP output" ++msgstr "" ++ ++msgid "Interval between saving pictures" ++msgstr "" ++ ++msgid "JPEG compression quality" ++msgstr "" ++ ++msgid "Led control" ++msgstr "" ++ ++msgid "MJPG-streamer" ++msgstr "" ++ ++msgid "Max. number of pictures to hold" ++msgstr "" ++ ++msgid "Mjpeg output" ++msgstr "" ++ ++msgid "Off" ++msgstr "" ++ ++msgid "On" ++msgstr "" ++ ++msgid "Password" ++msgstr "" ++ ++msgid "Port" ++msgstr "" ++ ++msgid "Resolution" ++msgstr "" ++ ++msgid "Ring buffer size" ++msgstr "" ++ ++msgid "Set folder to save pictures" ++msgstr "" ++ ++msgid "Set the inteval in millisecond" ++msgstr "" ++ ++msgid "" ++"Set the minimum size if the webcam produces small-sized garbage frames. May " ++"happen under low light conditions" ++msgstr "" ++ ++msgid "" ++"Set the quality in percent. This setting activates YUYV format, disables " ++"MJPEG" ++msgstr "" ++ ++msgid "TCP port for this HTTP server" ++msgstr "" ++ ++msgid "UVC input" ++msgstr "" ++ ++msgid "Username" ++msgstr "" ++ ++msgid "WWW folder" ++msgstr "" ++ ++msgid "" ++"mjpg streamer is a streaming application for Linux-UVC compatible webcams" ++msgstr "" +diff --git a/feeds/luci/applications/luci-app-mjpg-streamer/po/zh-cn/mjpg-streamer.po b/feeds/luci/applications/luci-app-mjpg-streamer/po/zh-cn/mjpg-streamer.po +new file mode 100644 +index 0000000..3ad9a4a +--- /dev/null ++++ b/feeds/luci/applications/luci-app-mjpg-streamer/po/zh-cn/mjpg-streamer.po +@@ -0,0 +1,166 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: luci-app-mjpg-streamer\n" ++"POT-Creation-Date: 2015-06-11 21:11+0100\n" ++"PO-Revision-Date: 2015-06-11 21:11+0100\n" ++"Last-Translator: maz-1 \n" ++"Language-Team: \n" ++"Language: zh-cn\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"X-Generator: Poedit 1.5.4\n" ++"Plural-Forms: nplurals=2; plural=(n != 1);\n" ++"X-Poedit-SourceCharset: UTF-8\n" ++ ++ ++msgid "Enabled" ++msgstr "å¯ç”¨" ++ ++msgid "Enable MJPG-streamer" ++msgstr "å¯ç”¨MJPG-streamer" ++ ++msgid "General" ++msgstr "一般设置" ++ ++msgid "Plugin settings" ++msgstr "æ’件设置" ++ ++msgid "Input plugin" ++msgstr "输入æ’件" ++ ++msgid "Output plugin" ++msgstr "输出æ’件" ++ ++msgid "Allow ringbuffer to exceed limit by this amount" ++msgstr "å…许环形缓冲区最多超过这个数值" ++ ++msgid "Ask for username and password on connect" ++msgstr "连接时询问用户å和密ç " ++ ++msgid "Authentication required" ++msgstr "需è¦éªŒè¯" ++ ++msgid "Auto" ++msgstr "自动" ++ ++msgid "Automatic disabling of MJPEG mode" ++msgstr "自动ç¦ç”¨MJPEG模å¼" ++ ++msgid "Blink" ++msgstr "é—ªçƒ" ++ ++msgid "Check to save the stream to an mjpeg file" ++msgstr "勾选以ä¿å­˜è§†é¢‘æµè‡³ä¸€ä¸ªmjpeg文件" ++ ++msgid "Command to run" ++msgstr "è¿è¡Œçš„命令" ++ ++msgid "Device" ++msgstr "设备" ++ ++msgid "Do not initalize dynctrls of Linux-UVC driver" ++msgstr "ä¸è¦åˆå§‹åŒ–Linux-UVC驱动的dynctrls" ++ ++msgid "Don't initalize dynctrls" ++msgstr "ä¸è¦åˆå§‹åŒ–dynctrls" ++ ++msgid "Drop frames smaller then this limit" ++msgstr "丢弃å°äºŽè¯¥å°ºå¯¸é™åˆ¶çš„帧" ++ ++msgid "Enable YUYV format" ++msgstr "å¯ç”¨YUYVæ ¼å¼" ++ ++msgid "Exceed" ++msgstr "超出" ++ ++msgid "" ++"Execute command after saving picture. Mjpg-streamer parse the filename as " ++"first parameter to your script." ++msgstr "ä¿å­˜å›¾ç‰‡åŽæ‰§è¡Œå‘½ä»¤ã€‚文件å将作为第一个å‚数传递给命令。" ++ ++msgid "File input" ++msgstr "文件输入" ++ ++msgid "File output" ++msgstr "文件输出" ++ ++msgid "Folder" ++msgstr "文件夹" ++ ++msgid "Folder that contains webpages" ++msgstr "ä¿å­˜ç½‘页的文件夹" ++ ++msgid "Frames per second" ++msgstr "帧æ¯ç§’" ++ ++msgid "HTTP output" ++msgstr "HTTP输出" ++ ++msgid "Interval between saving pictures" ++msgstr "图片ä¿å­˜æ—¶é—´é—´éš”" ++ ++msgid "JPEG compression quality" ++msgstr "JPEG压缩å“è´¨" ++ ++msgid "Led control" ++msgstr "LED控制" ++ ++msgid "MJPG-streamer" ++msgstr "MJPG-streamer" ++ ++msgid "Max. number of pictures to hold" ++msgstr "ä¿å­˜çš„图片数é‡ä¸Šé™" ++ ++msgid "Mjpeg output" ++msgstr "Mjpeg输出" ++ ++msgid "Off" ++msgstr "å…³" ++ ++msgid "On" ++msgstr "å¼€" ++ ++msgid "Password" ++msgstr "密ç " ++ ++msgid "Port" ++msgstr "端å£" ++ ++msgid "Resolution" ++msgstr "分辨率" ++ ++msgid "Ring buffer size" ++msgstr "环形缓冲区大å°" ++ ++msgid "Set folder to save pictures" ++msgstr "图片ä¿å­˜ä½ç½®" ++ ++msgid "Set the inteval in millisecond" ++msgstr "设置时间间隔(毫秒)" ++ ++msgid "" ++"Set the minimum size if the webcam produces small-sized garbage frames. May " ++"happen under low light conditions" ++msgstr "设置无用帧的最å°å°ºå¯¸ã€‚当光照ä¸è¶³æ—¶å¯èƒ½å‡ºçŽ°æ— ç”¨å¸§ã€‚" ++ ++msgid "" ++"Set the quality in percent. This setting activates YUYV format, disables " ++"MJPEG" ++msgstr "设置å“质(百分比)。此设置会开å¯YUYVæ ¼å¼è¾“出,关闭MJPEG输出。" ++ ++msgid "TCP port for this HTTP server" ++msgstr "HTTPæœåŠ¡ç›‘å¬çš„TCP端å£" ++ ++msgid "UVC input" ++msgstr "UVC输入" ++ ++msgid "Username" ++msgstr "用户å" ++ ++msgid "WWW folder" ++msgstr "WWW文件夹" ++ ++msgid "" ++"mjpg streamer is a streaming application for Linux-UVC compatible webcams" ++msgstr "mjpg streamer是一个视频æµç¨‹åºï¼Œç”¨äºŽå…¼å®¹Linux-UVCçš„æ‘„åƒå¤´ã€‚" +diff --git a/feeds/luci/applications/luci-app-mjpg-streamer/root/etc/uci-defaults/luci-mjpg-streamer b/feeds/luci/applications/luci-app-mjpg-streamer/root/etc/uci-defaults/luci-mjpg-streamer +new file mode 100755 +index 0000000..6a380cf +--- /dev/null ++++ b/feeds/luci/applications/luci-app-mjpg-streamer/root/etc/uci-defaults/luci-mjpg-streamer +@@ -0,0 +1,11 @@ ++#!/bin/sh ++ ++uci -q batch <<-EOF >/dev/null ++ delete ucitrack.@mjpg-streamer[-1] ++ add ucitrack mjpg-streamer ++ set ucitrack.@mjpg-streamer[-1].init=mjpg-streamer ++ commit ucitrack ++EOF ++ ++rm -f /tmp/luci-indexcache ++exit 0 +diff --git a/feeds/luci/applications/luci-app-mmc-over-gpio/Makefile b/feeds/luci/applications/luci-app-mmc-over-gpio/Makefile +new file mode 100644 +index 0000000..4e7d695 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-mmc-over-gpio/Makefile +@@ -0,0 +1,14 @@ ++# ++# Copyright (C) 2008-2014 The LuCI Team ++# ++# This is free software, licensed under the Apache License, Version 2.0 . ++# ++ ++include $(TOPDIR)/rules.mk ++ ++LUCI_TITLE:=MMC-over-GPIO configuration module ++LUCI_DEPENDS:=+kmod-mmc-over-gpio ++ ++include ../../luci.mk ++ ++# call BuildPackage - OpenWrt buildroot signature +diff --git a/feeds/luci/applications/luci-app-mmc-over-gpio/luasrc/controller/mmc_over_gpio.lua b/feeds/luci/applications/luci-app-mmc-over-gpio/luasrc/controller/mmc_over_gpio.lua +new file mode 100644 +index 0000000..78ed24f +--- /dev/null ++++ b/feeds/luci/applications/luci-app-mmc-over-gpio/luasrc/controller/mmc_over_gpio.lua +@@ -0,0 +1,15 @@ ++-- Copyright 2008 Yanira ++-- Licensed to the public under the Apache License 2.0. ++ ++module("luci.controller.mmc_over_gpio", package.seeall) ++ ++function index() ++ if not nixio.fs.access("/etc/config/mmc_over_gpio") then ++ return ++ end ++ ++ local page ++ ++ page = entry({"admin", "system", "mmc_over_gpio"}, cbi("mmc_over_gpio"), _("MMC/SD driver configuration"), 60) ++ page.dependent = true ++end +diff --git a/feeds/luci/applications/luci-app-mmc-over-gpio/luasrc/model/cbi/mmc_over_gpio.lua b/feeds/luci/applications/luci-app-mmc-over-gpio/luasrc/model/cbi/mmc_over_gpio.lua +new file mode 100644 +index 0000000..fd0896c +--- /dev/null ++++ b/feeds/luci/applications/luci-app-mmc-over-gpio/luasrc/model/cbi/mmc_over_gpio.lua +@@ -0,0 +1,29 @@ ++-- Copyright 2008 Yanira ++-- Licensed to the public under the Apache License 2.0. ++ ++m = Map("mmc_over_gpio", translate("MMC/SD driver configuration"), ++ translate("MMC/SD driver configuration")) ++ ++s = m:section(TypedSection, "mmc_over_gpio", translate("Settings")) ++s.addremove = true ++s.anonymous = true ++ ++s:option(Flag, "enabled", translate("Enable")) ++ ++s:option(Value, "name", translate("Name")) ++ ++pin = s:option(Value, "DI_pin", translate("DI_pin")) ++for i = 0,7 do pin:value(i) end ++ ++pin = s:option(Value, "DO_pin", translate("DO_pin")) ++for i = 0,7 do pin:value(i) end ++ ++pin = s:option(Value, "CLK_pin", translate("CLK_pin")) ++for i = 0,7 do pin:value(i) end ++ ++pin = s:option(Value, "CS_pin", translate("CS_pin")) ++for i = 0,7 do pin:value(i) end ++ ++s:option(Value, "mode", translate("Mode")) ++ ++return m +diff --git a/feeds/luci/applications/luci-app-mmc-over-gpio/po/ca/mmc_over_gpio.po b/feeds/luci/applications/luci-app-mmc-over-gpio/po/ca/mmc_over_gpio.po +new file mode 100644 +index 0000000..558e10a +--- /dev/null ++++ b/feeds/luci/applications/luci-app-mmc-over-gpio/po/ca/mmc_over_gpio.po +@@ -0,0 +1,43 @@ ++# mmc_over_gpio.pot ++# generated from ./applications/luci-mmc_over_gpio/luasrc/i18n/mmc_over_gpio.en.lua ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Report-Msgid-Bugs-To: \n" ++"POT-Creation-Date: 2009-06-10 03:40+0200\n" ++"PO-Revision-Date: 2014-06-01 23:04+0200\n" ++"Last-Translator: Alex \n" ++"Language-Team: LANGUAGE \n" ++"Language: ca\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n != 1);\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "CLK_pin" ++msgstr "" ++ ++msgid "CS_pin" ++msgstr "" ++ ++msgid "DI_pin" ++msgstr "" ++ ++msgid "DO_pin" ++msgstr "" ++ ++msgid "Enable" ++msgstr "Habilita" ++ ++msgid "MMC/SD driver configuration" ++msgstr "Configuració de controlador MMC/SD" ++ ++msgid "Mode" ++msgstr "Mode" ++ ++msgid "Name" ++msgstr "Nom" ++ ++msgid "Settings" ++msgstr "Ajusts" +diff --git a/feeds/luci/applications/luci-app-mmc-over-gpio/po/cs/mmc_over_gpio.po b/feeds/luci/applications/luci-app-mmc-over-gpio/po/cs/mmc_over_gpio.po +new file mode 100644 +index 0000000..6a7b7b1 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-mmc-over-gpio/po/cs/mmc_over_gpio.po +@@ -0,0 +1,41 @@ ++# mmc_over_gpio.pot ++# generated from ./applications/luci-mmc_over_gpio/luasrc/i18n/mmc_over_gpio.en.lua ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"PO-Revision-Date: 2014-06-15 20:16+0200\n" ++"Last-Translator: koli \n" ++"Language-Team: none\n" ++"Language: cs\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "CLK_pin" ++msgstr "Pin CLK" ++ ++msgid "CS_pin" ++msgstr "Pin CS" ++ ++msgid "DI_pin" ++msgstr "Pin DI" ++ ++msgid "DO_pin" ++msgstr "Pin DO" ++ ++msgid "Enable" ++msgstr "Povolit" ++ ++msgid "MMC/SD driver configuration" ++msgstr "Konfigurace ovladaÄe MMC/SD" ++ ++msgid "Mode" ++msgstr "Mód" ++ ++msgid "Name" ++msgstr "Jméno" ++ ++msgid "Settings" ++msgstr "Nastavení" +diff --git a/feeds/luci/applications/luci-app-mmc-over-gpio/po/de/mmc_over_gpio.po b/feeds/luci/applications/luci-app-mmc-over-gpio/po/de/mmc_over_gpio.po +new file mode 100644 +index 0000000..3b21417 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-mmc-over-gpio/po/de/mmc_over_gpio.po +@@ -0,0 +1,42 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Report-Msgid-Bugs-To: \n" ++"POT-Creation-Date: 2009-05-26 17:57+0200\n" ++"PO-Revision-Date: 2012-11-28 10:44+0200\n" ++"Last-Translator: dunkelschunkel \n" ++"Language-Team: LANGUAGE \n" ++"Language: de\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n != 1);\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++# Das wäre der Pin für Clock, also Takt, eventuell kann das auch rein. Halte obige Variante aber für hinreichend ++msgid "CLK_pin" ++msgstr "CLK-Pin" ++ ++msgid "CS_pin" ++msgstr "CS-Pin" ++ ++msgid "DI_pin" ++msgstr "DI-Pin" ++ ++msgid "DO_pin" ++msgstr "DO-Pin" ++ ++msgid "Enable" ++msgstr "Aktivieren" ++ ++msgid "MMC/SD driver configuration" ++msgstr "MMC/SD Treibereinstellungen" ++ ++msgid "Mode" ++msgstr "Modus" ++ ++msgid "Name" ++msgstr "Name" ++ ++msgid "Settings" ++msgstr "Einstellungen" +diff --git a/feeds/luci/applications/luci-app-mmc-over-gpio/po/el/mmc_over_gpio.po b/feeds/luci/applications/luci-app-mmc-over-gpio/po/el/mmc_over_gpio.po +new file mode 100644 +index 0000000..8aadeff +--- /dev/null ++++ b/feeds/luci/applications/luci-app-mmc-over-gpio/po/el/mmc_over_gpio.po +@@ -0,0 +1,39 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Report-Msgid-Bugs-To: \n" ++"POT-Creation-Date: 2009-05-28 02:08+0200\n" ++"PO-Revision-Date: 2010-07-01 20:18+0200\n" ++"Last-Translator: Vasilis Tsiligiannis \n" ++"Language-Team: LANGUAGE \n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"X-Generator: Pootle 1.1.0\n" ++ ++msgid "CLK_pin" ++msgstr "" ++ ++msgid "CS_pin" ++msgstr "" ++ ++msgid "DI_pin" ++msgstr "" ++ ++msgid "DO_pin" ++msgstr "" ++ ++msgid "Enable" ++msgstr "" ++ ++msgid "MMC/SD driver configuration" ++msgstr "" ++ ++msgid "Mode" ++msgstr "" ++ ++msgid "Name" ++msgstr "" ++ ++msgid "Settings" ++msgstr "Ρυθμίσεις" +diff --git a/feeds/luci/applications/luci-app-mmc-over-gpio/po/en/mmc_over_gpio.po b/feeds/luci/applications/luci-app-mmc-over-gpio/po/en/mmc_over_gpio.po +new file mode 100644 +index 0000000..bd8f3c8 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-mmc-over-gpio/po/en/mmc_over_gpio.po +@@ -0,0 +1,41 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Report-Msgid-Bugs-To: \n" ++"POT-Creation-Date: 2009-05-19 19:36+0200\n" ++"PO-Revision-Date: 2012-03-21 18:31+0200\n" ++"Last-Translator: Anonymous Pootle User\n" ++"Language-Team: LANGUAGE \n" ++"Language: en\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n != 1);\n" ++"X-Generator: Pootle 2.0.4\n" ++ ++msgid "CLK_pin" ++msgstr "" ++ ++msgid "CS_pin" ++msgstr "" ++ ++msgid "DI_pin" ++msgstr "" ++ ++msgid "DO_pin" ++msgstr "" ++ ++msgid "Enable" ++msgstr "" ++ ++msgid "MMC/SD driver configuration" ++msgstr "" ++ ++msgid "Mode" ++msgstr "" ++ ++msgid "Name" ++msgstr "" ++ ++msgid "Settings" ++msgstr "Settings" +diff --git a/feeds/luci/applications/luci-app-mmc-over-gpio/po/es/mmc_over_gpio.po b/feeds/luci/applications/luci-app-mmc-over-gpio/po/es/mmc_over_gpio.po +new file mode 100644 +index 0000000..ee0b0c6 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-mmc-over-gpio/po/es/mmc_over_gpio.po +@@ -0,0 +1,41 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Report-Msgid-Bugs-To: \n" ++"POT-Creation-Date: 2009-06-10 03:41+0200\n" ++"PO-Revision-Date: 2012-08-19 21:05+0200\n" ++"Last-Translator: josevteg \n" ++"Language-Team: LANGUAGE \n" ++"Language: es\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n != 1);\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "CLK_pin" ++msgstr "Pin CLK" ++ ++msgid "CS_pin" ++msgstr "Pin CS" ++ ++msgid "DI_pin" ++msgstr "Pin DI" ++ ++msgid "DO_pin" ++msgstr "Pin DO" ++ ++msgid "Enable" ++msgstr "Activar" ++ ++msgid "MMC/SD driver configuration" ++msgstr "Configuración de controlador MMC/SD" ++ ++msgid "Mode" ++msgstr "Modo" ++ ++msgid "Name" ++msgstr "Nombre" ++ ++msgid "Settings" ++msgstr "Configuración" +diff --git a/feeds/luci/applications/luci-app-mmc-over-gpio/po/fr/mmc_over_gpio.po b/feeds/luci/applications/luci-app-mmc-over-gpio/po/fr/mmc_over_gpio.po +new file mode 100644 +index 0000000..64dc899 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-mmc-over-gpio/po/fr/mmc_over_gpio.po +@@ -0,0 +1,41 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Report-Msgid-Bugs-To: \n" ++"POT-Creation-Date: 2009-05-19 19:36+0200\n" ++"PO-Revision-Date: 2012-11-06 16:06+0200\n" ++"Last-Translator: hogsim \n" ++"Language-Team: LANGUAGE \n" ++"Language: fr\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n > 1);\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "CLK_pin" ++msgstr "CLK_pin" ++ ++msgid "CS_pin" ++msgstr "CS_pin" ++ ++msgid "DI_pin" ++msgstr "DI_pin" ++ ++msgid "DO_pin" ++msgstr "DO_pin" ++ ++msgid "Enable" ++msgstr "Activer" ++ ++msgid "MMC/SD driver configuration" ++msgstr "Configuration driver MMC/SD" ++ ++msgid "Mode" ++msgstr "Mode" ++ ++msgid "Name" ++msgstr "Nom" ++ ++msgid "Settings" ++msgstr "Configuration" +diff --git a/feeds/luci/applications/luci-app-mmc-over-gpio/po/he/mmc_over_gpio.po b/feeds/luci/applications/luci-app-mmc-over-gpio/po/he/mmc_over_gpio.po +new file mode 100644 +index 0000000..bf506c0 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-mmc-over-gpio/po/he/mmc_over_gpio.po +@@ -0,0 +1,41 @@ ++# mmc_over_gpio.pot ++# generated from ./applications/luci-mmc_over_gpio/luasrc/i18n/mmc_over_gpio.en.lua ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"PO-Revision-Date: 2012-09-10 04:34+0200\n" ++"Last-Translator: Snoof \n" ++"Language-Team: none\n" ++"Language: he\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n != 1);\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "CLK_pin" ++msgstr "" ++ ++msgid "CS_pin" ++msgstr "" ++ ++msgid "DI_pin" ++msgstr "" ++ ++msgid "DO_pin" ++msgstr "" ++ ++msgid "Enable" ++msgstr "×פשר" ++ ++msgid "MMC/SD driver configuration" ++msgstr "" ++ ++msgid "Mode" ++msgstr "" ++ ++msgid "Name" ++msgstr "ש×" ++ ++msgid "Settings" ++msgstr "הגדרות" +diff --git a/feeds/luci/applications/luci-app-mmc-over-gpio/po/hu/mmc_over_gpio.po b/feeds/luci/applications/luci-app-mmc-over-gpio/po/hu/mmc_over_gpio.po +new file mode 100644 +index 0000000..758c711 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-mmc-over-gpio/po/hu/mmc_over_gpio.po +@@ -0,0 +1,41 @@ ++# mmc_over_gpio.pot ++# generated from ./applications/luci-mmc_over_gpio/luasrc/i18n/mmc_over_gpio.en.lua ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"PO-Revision-Date: 2012-12-30 19:09+0200\n" ++"Last-Translator: romboyco \n" ++"Language-Team: none\n" ++"Language: hu\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n != 1);\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "CLK_pin" ++msgstr "CLK_pin" ++ ++msgid "CS_pin" ++msgstr "CS_pin" ++ ++msgid "DI_pin" ++msgstr "DI_pin" ++ ++msgid "DO_pin" ++msgstr "DO_pin" ++ ++msgid "Enable" ++msgstr "Bekapcsolás" ++ ++msgid "MMC/SD driver configuration" ++msgstr "MMC/SD driver konfiguráció" ++ ++msgid "Mode" ++msgstr "Mód" ++ ++msgid "Name" ++msgstr "Név" ++ ++msgid "Settings" ++msgstr "Beállítások" +diff --git a/feeds/luci/applications/luci-app-mmc-over-gpio/po/it/mmc_over_gpio.po b/feeds/luci/applications/luci-app-mmc-over-gpio/po/it/mmc_over_gpio.po +new file mode 100644 +index 0000000..e0f371a +--- /dev/null ++++ b/feeds/luci/applications/luci-app-mmc-over-gpio/po/it/mmc_over_gpio.po +@@ -0,0 +1,41 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Report-Msgid-Bugs-To: \n" ++"POT-Creation-Date: 2009-05-19 19:36+0200\n" ++"PO-Revision-Date: 2013-02-03 13:57+0200\n" ++"Last-Translator: Francesco <3gasas@gmail.com>\n" ++"Language-Team: LANGUAGE \n" ++"Language: it\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n != 1);\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "CLK_pin" ++msgstr "CLK_pin" ++ ++msgid "CS_pin" ++msgstr "CS_pin" ++ ++msgid "DI_pin" ++msgstr "DI_pin" ++ ++msgid "DO_pin" ++msgstr "DO_pin" ++ ++msgid "Enable" ++msgstr "Attiva" ++ ++msgid "MMC/SD driver configuration" ++msgstr "Configurazione driver MMC/SD" ++ ++msgid "Mode" ++msgstr "Modalità" ++ ++msgid "Name" ++msgstr "Nome" ++ ++msgid "Settings" ++msgstr "Opzioni" +diff --git a/feeds/luci/applications/luci-app-mmc-over-gpio/po/ja/mmc_over_gpio.po b/feeds/luci/applications/luci-app-mmc-over-gpio/po/ja/mmc_over_gpio.po +new file mode 100644 +index 0000000..5c0f102 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-mmc-over-gpio/po/ja/mmc_over_gpio.po +@@ -0,0 +1,41 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Report-Msgid-Bugs-To: \n" ++"POT-Creation-Date: 2009-05-19 19:36+0200\n" ++"PO-Revision-Date: 2013-10-05 16:45+0200\n" ++"Last-Translator: Kentaro \n" ++"Language-Team: LANGUAGE \n" ++"Language: ja\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=1; plural=0;\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "CLK_pin" ++msgstr "CLK_pin" ++ ++msgid "CS_pin" ++msgstr "CS_pin" ++ ++msgid "DI_pin" ++msgstr "DI_pin" ++ ++msgid "DO_pin" ++msgstr "DO_pin" ++ ++msgid "Enable" ++msgstr "有効" ++ ++msgid "MMC/SD driver configuration" ++msgstr "MMC/SD ドライãƒè¨­å®š" ++ ++msgid "Mode" ++msgstr "モード" ++ ++msgid "Name" ++msgstr "åå‰" ++ ++msgid "Settings" ++msgstr "設定" +diff --git a/feeds/luci/applications/luci-app-mmc-over-gpio/po/ms/mmc_over_gpio.po b/feeds/luci/applications/luci-app-mmc-over-gpio/po/ms/mmc_over_gpio.po +new file mode 100644 +index 0000000..edbb2ce +--- /dev/null ++++ b/feeds/luci/applications/luci-app-mmc-over-gpio/po/ms/mmc_over_gpio.po +@@ -0,0 +1,37 @@ ++# mmc_over_gpio.pot ++# generated from ./applications/luci-mmc_over_gpio/luasrc/i18n/mmc_over_gpio.en.lua ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Last-Translator: Automatically generated\n" ++"Language-Team: none\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++ ++msgid "CLK_pin" ++msgstr "" ++ ++msgid "CS_pin" ++msgstr "" ++ ++msgid "DI_pin" ++msgstr "" ++ ++msgid "DO_pin" ++msgstr "" ++ ++msgid "Enable" ++msgstr "" ++ ++msgid "MMC/SD driver configuration" ++msgstr "" ++ ++msgid "Mode" ++msgstr "" ++ ++msgid "Name" ++msgstr "" ++ ++msgid "Settings" ++msgstr "" +diff --git a/feeds/luci/applications/luci-app-mmc-over-gpio/po/no/mmc_over_gpio.po b/feeds/luci/applications/luci-app-mmc-over-gpio/po/no/mmc_over_gpio.po +new file mode 100644 +index 0000000..ea9a533 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-mmc-over-gpio/po/no/mmc_over_gpio.po +@@ -0,0 +1,32 @@ ++msgid "" ++msgstr "" ++"Last-Translator: Lars Hardy \n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++ ++msgid "CLK_pin" ++msgstr "CLK_pin" ++ ++msgid "CS_pin" ++msgstr "CS_pin" ++ ++msgid "DI_pin" ++msgstr "DI_pin" ++ ++msgid "DO_pin" ++msgstr "DO_pin" ++ ++msgid "Enable" ++msgstr "Aktiver" ++ ++msgid "MMC/SD driver configuration" ++msgstr "MMC/SD Konfigurasjon" ++ ++msgid "Mode" ++msgstr "Modus" ++ ++msgid "Name" ++msgstr "Navn" ++ ++msgid "Settings" ++msgstr "Innstillinger" +diff --git a/feeds/luci/applications/luci-app-mmc-over-gpio/po/pl/mmc_over_gpio.po b/feeds/luci/applications/luci-app-mmc-over-gpio/po/pl/mmc_over_gpio.po +new file mode 100644 +index 0000000..ff5b51b +--- /dev/null ++++ b/feeds/luci/applications/luci-app-mmc-over-gpio/po/pl/mmc_over_gpio.po +@@ -0,0 +1,42 @@ ++# mmc_over_gpio.pot ++# generated from ./applications/luci-mmc_over_gpio/luasrc/i18n/mmc_over_gpio.en.lua ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"PO-Revision-Date: 2011-08-26 12:23+0200\n" ++"Last-Translator: Staszek \n" ++"Language-Team: none\n" ++"Language: pl\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 " ++"|| n%100>=20) ? 1 : 2);\n" ++"X-Generator: Pootle 2.0.4\n" ++ ++msgid "CLK_pin" ++msgstr "Pin CLK" ++ ++msgid "CS_pin" ++msgstr "Pin CS" ++ ++msgid "DI_pin" ++msgstr "Pin DI" ++ ++msgid "DO_pin" ++msgstr "Pin DO" ++ ++msgid "Enable" ++msgstr "Uaktywnij" ++ ++msgid "MMC/SD driver configuration" ++msgstr "Konfiguracja sterownika MMC/SD" ++ ++msgid "Mode" ++msgstr "Tryb" ++ ++msgid "Name" ++msgstr "Nazwa" ++ ++msgid "Settings" ++msgstr "Ustawienia" +diff --git a/feeds/luci/applications/luci-app-mmc-over-gpio/po/pt-br/mmc_over_gpio.po b/feeds/luci/applications/luci-app-mmc-over-gpio/po/pt-br/mmc_over_gpio.po +new file mode 100644 +index 0000000..9fbbf0f +--- /dev/null ++++ b/feeds/luci/applications/luci-app-mmc-over-gpio/po/pt-br/mmc_over_gpio.po +@@ -0,0 +1,41 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Report-Msgid-Bugs-To: \n" ++"POT-Creation-Date: 2009-06-10 03:41+0200\n" ++"PO-Revision-Date: 2012-07-05 06:43+0200\n" ++"Last-Translator: rafaelff1 \n" ++"Language-Team: LANGUAGE \n" ++"Language: pt_BR\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n > 1);\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "CLK_pin" ++msgstr "CLK_pin" ++ ++msgid "CS_pin" ++msgstr "CS_pin" ++ ++msgid "DI_pin" ++msgstr "DI_pin" ++ ++msgid "DO_pin" ++msgstr "DO_pin" ++ ++msgid "Enable" ++msgstr "Habilitar" ++ ++msgid "MMC/SD driver configuration" ++msgstr "Configuração de driver MMC/SD" ++ ++msgid "Mode" ++msgstr "Modo" ++ ++msgid "Name" ++msgstr "Nome" ++ ++msgid "Settings" ++msgstr "Configurações" +diff --git a/feeds/luci/applications/luci-app-mmc-over-gpio/po/pt/mmc_over_gpio.po b/feeds/luci/applications/luci-app-mmc-over-gpio/po/pt/mmc_over_gpio.po +new file mode 100644 +index 0000000..497c0b0 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-mmc-over-gpio/po/pt/mmc_over_gpio.po +@@ -0,0 +1,41 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Report-Msgid-Bugs-To: \n" ++"POT-Creation-Date: 2009-05-26 19:03+0200\n" ++"PO-Revision-Date: 2013-05-31 15:28+0200\n" ++"Last-Translator: joao.f.vieira \n" ++"Language-Team: LANGUAGE \n" ++"Language: pt\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n != 1);\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "CLK_pin" ++msgstr "CLK_pin" ++ ++msgid "CS_pin" ++msgstr "CS_pin" ++ ++msgid "DI_pin" ++msgstr "DI_pin" ++ ++msgid "DO_pin" ++msgstr "DO_pin" ++ ++msgid "Enable" ++msgstr "Ativar" ++ ++msgid "MMC/SD driver configuration" ++msgstr "Configuração do driver MMC/SD" ++ ++msgid "Mode" ++msgstr "Modo" ++ ++msgid "Name" ++msgstr "Nome" ++ ++msgid "Settings" ++msgstr "Definições" +diff --git a/feeds/luci/applications/luci-app-mmc-over-gpio/po/ro/mmc_over_gpio.po b/feeds/luci/applications/luci-app-mmc-over-gpio/po/ro/mmc_over_gpio.po +new file mode 100644 +index 0000000..e465f0a +--- /dev/null ++++ b/feeds/luci/applications/luci-app-mmc-over-gpio/po/ro/mmc_over_gpio.po +@@ -0,0 +1,42 @@ ++# mmc_over_gpio.pot ++# generated from ./applications/luci-mmc_over_gpio/luasrc/i18n/mmc_over_gpio.en.lua ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"PO-Revision-Date: 2014-06-28 19:22+0200\n" ++"Last-Translator: xxvirusxx \n" ++"Language-Team: none\n" ++"Language: ro\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=3; plural=(n==1 ? 0 : (n==0 || (n%100 > 0 && n%100 < " ++"20)) ? 1 : 2);;\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "CLK_pin" ++msgstr "CLK_pin" ++ ++msgid "CS_pin" ++msgstr "CS_pin" ++ ++msgid "DI_pin" ++msgstr "DI_pin" ++ ++msgid "DO_pin" ++msgstr "DO_pin" ++ ++msgid "Enable" ++msgstr "Activare" ++ ++msgid "MMC/SD driver configuration" ++msgstr "Configurare driver MMC/SD" ++ ++msgid "Mode" ++msgstr "Mod" ++ ++msgid "Name" ++msgstr "Nume" ++ ++msgid "Settings" ++msgstr "Setări" +diff --git a/feeds/luci/applications/luci-app-mmc-over-gpio/po/ru/mmc_over_gpio.po b/feeds/luci/applications/luci-app-mmc-over-gpio/po/ru/mmc_over_gpio.po +new file mode 100644 +index 0000000..dcc2e93 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-mmc-over-gpio/po/ru/mmc_over_gpio.po +@@ -0,0 +1,43 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: LuCI: mmc_over_gpio\n" ++"Report-Msgid-Bugs-To: \n" ++"POT-Creation-Date: 2009-05-19 19:36+0200\n" ++"PO-Revision-Date: 2012-08-15 11:23+0300\n" ++"Last-Translator: Roman A. aka BasicXP \n" ++"Language-Team: Russian \n" ++"Language: ru\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%" ++"10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" ++"X-Generator: Pootle 2.0.6\n" ++"X-Poedit-SourceCharset: UTF-8\n" ++ ++msgid "CLK_pin" ++msgstr "Вывод CLK" ++ ++msgid "CS_pin" ++msgstr "Вывод CS" ++ ++msgid "DI_pin" ++msgstr "Вывод DI" ++ ++msgid "DO_pin" ++msgstr "Вывод DO" ++ ++msgid "Enable" ++msgstr "Включить" ++ ++msgid "MMC/SD driver configuration" ++msgstr "ÐšÐ¾Ð½Ñ„Ð¸Ð³ÑƒÑ€Ð°Ñ†Ð¸Ñ Ð´Ñ€Ð°Ð¹Ð²ÐµÑ€Ð° MMC/SD" ++ ++msgid "Mode" ++msgstr "Режим" ++ ++msgid "Name" ++msgstr "ИмÑ" ++ ++msgid "Settings" ++msgstr "ÐаÑтройки" +diff --git a/feeds/luci/applications/luci-app-mmc-over-gpio/po/sk/mmc_over_gpio.po b/feeds/luci/applications/luci-app-mmc-over-gpio/po/sk/mmc_over_gpio.po +new file mode 100644 +index 0000000..587ee42 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-mmc-over-gpio/po/sk/mmc_over_gpio.po +@@ -0,0 +1,36 @@ ++msgid "" ++msgstr "" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Last-Translator: Automatically generated\n" ++"Language-Team: none\n" ++"MIME-Version: 1.0\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n" ++ ++msgid "CLK_pin" ++msgstr "" ++ ++msgid "CS_pin" ++msgstr "" ++ ++msgid "DI_pin" ++msgstr "" ++ ++msgid "DO_pin" ++msgstr "" ++ ++msgid "Enable" ++msgstr "" ++ ++msgid "MMC/SD driver configuration" ++msgstr "" ++ ++msgid "Mode" ++msgstr "" ++ ++msgid "Name" ++msgstr "" ++ ++msgid "Settings" ++msgstr "" +diff --git a/feeds/luci/applications/luci-app-mmc-over-gpio/po/sv/mmc_over_gpio.po b/feeds/luci/applications/luci-app-mmc-over-gpio/po/sv/mmc_over_gpio.po +new file mode 100644 +index 0000000..d6e5ace +--- /dev/null ++++ b/feeds/luci/applications/luci-app-mmc-over-gpio/po/sv/mmc_over_gpio.po +@@ -0,0 +1,37 @@ ++msgid "" ++msgstr "" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Last-Translator: Automatically generated\n" ++"Language-Team: none\n" ++"Language: sv\n" ++"MIME-Version: 1.0\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n != 1);\n" ++ ++msgid "CLK_pin" ++msgstr "" ++ ++msgid "CS_pin" ++msgstr "" ++ ++msgid "DI_pin" ++msgstr "" ++ ++msgid "DO_pin" ++msgstr "" ++ ++msgid "Enable" ++msgstr "" ++ ++msgid "MMC/SD driver configuration" ++msgstr "" ++ ++msgid "Mode" ++msgstr "" ++ ++msgid "Name" ++msgstr "" ++ ++msgid "Settings" ++msgstr "" +diff --git a/feeds/luci/applications/luci-app-mmc-over-gpio/po/templates/mmc_over_gpio.pot b/feeds/luci/applications/luci-app-mmc-over-gpio/po/templates/mmc_over_gpio.pot +new file mode 100644 +index 0000000..1cc8de3 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-mmc-over-gpio/po/templates/mmc_over_gpio.pot +@@ -0,0 +1,29 @@ ++msgid "" ++msgstr "Content-Type: text/plain; charset=UTF-8" ++ ++msgid "CLK_pin" ++msgstr "" ++ ++msgid "CS_pin" ++msgstr "" ++ ++msgid "DI_pin" ++msgstr "" ++ ++msgid "DO_pin" ++msgstr "" ++ ++msgid "Enable" ++msgstr "" ++ ++msgid "MMC/SD driver configuration" ++msgstr "" ++ ++msgid "Mode" ++msgstr "" ++ ++msgid "Name" ++msgstr "" ++ ++msgid "Settings" ++msgstr "" +diff --git a/feeds/luci/applications/luci-app-mmc-over-gpio/po/tr/mmc_over_gpio.po b/feeds/luci/applications/luci-app-mmc-over-gpio/po/tr/mmc_over_gpio.po +new file mode 100644 +index 0000000..349b8fc +--- /dev/null ++++ b/feeds/luci/applications/luci-app-mmc-over-gpio/po/tr/mmc_over_gpio.po +@@ -0,0 +1,41 @@ ++# mmc_over_gpio.pot ++# generated from ./applications/luci-mmc_over_gpio/luasrc/i18n/mmc_over_gpio.en.lua ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"PO-Revision-Date: 2012-10-11 23:19+0200\n" ++"Last-Translator: vincenzo \n" ++"Language-Team: none\n" ++"Language: tr\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=1; plural=0;\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "CLK_pin" ++msgstr "CLK_ayağı" ++ ++msgid "CS_pin" ++msgstr "CS_ayağı" ++ ++msgid "DI_pin" ++msgstr "DI_ayağı" ++ ++msgid "DO_pin" ++msgstr "DO_ayağı" ++ ++msgid "Enable" ++msgstr "EtkinleÅŸtir" ++ ++msgid "MMC/SD driver configuration" ++msgstr "MMC/SD Sürücü Yapılandırması" ++ ++msgid "Mode" ++msgstr "Mod" ++ ++msgid "Name" ++msgstr "isim" ++ ++msgid "Settings" ++msgstr "Ayarlar" +diff --git a/feeds/luci/applications/luci-app-mmc-over-gpio/po/uk/mmc_over_gpio.po b/feeds/luci/applications/luci-app-mmc-over-gpio/po/uk/mmc_over_gpio.po +new file mode 100644 +index 0000000..e9b37f2 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-mmc-over-gpio/po/uk/mmc_over_gpio.po +@@ -0,0 +1,42 @@ ++# mmc_over_gpio.pot ++# generated from ./applications/luci-mmc_over_gpio/luasrc/i18n/mmc_over_gpio.en.lua ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"PO-Revision-Date: 2012-12-29 13:06+0200\n" ++"Last-Translator: Yurii \n" ++"Language-Team: none\n" ++"Language: uk\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%" ++"10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "CLK_pin" ++msgstr "Вивід Ð’CLK" ++ ++msgid "CS_pin" ++msgstr "Вивід CS" ++ ++msgid "DI_pin" ++msgstr "Вивід DI" ++ ++msgid "DO_pin" ++msgstr "Вивід DO" ++ ++msgid "Enable" ++msgstr "Увімкнути" ++ ++msgid "MMC/SD driver configuration" ++msgstr "ÐšÐ¾Ð½Ñ„Ñ–Ð³ÑƒÑ€Ð°Ñ†Ñ–Ñ Ð´Ñ€Ð°Ð¹Ð²ÐµÑ€Ð° MMC/SD" ++ ++msgid "Mode" ++msgstr "Режим" ++ ++msgid "Name" ++msgstr "Ім'Ñ" ++ ++msgid "Settings" ++msgstr "ÐаÑтройки" +diff --git a/feeds/luci/applications/luci-app-mmc-over-gpio/po/vi/mmc_over_gpio.po b/feeds/luci/applications/luci-app-mmc-over-gpio/po/vi/mmc_over_gpio.po +new file mode 100644 +index 0000000..febcbc0 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-mmc-over-gpio/po/vi/mmc_over_gpio.po +@@ -0,0 +1,41 @@ ++# mmc_over_gpio.pot ++# generated from ./applications/luci-mmc_over_gpio/luasrc/i18n/mmc_over_gpio.en.lua ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Report-Msgid-Bugs-To: \n" ++"POT-Creation-Date: 2009-08-16 06:59+0200\n" ++"PO-Revision-Date: 2009-08-13 03:43+0200\n" ++"Last-Translator: Hong Phuc Dang \n" ++"Language-Team: LANGUAGE \n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"X-Generator: Pootle 1.1.0\n" ++ ++msgid "CLK_pin" ++msgstr "" ++ ++msgid "CS_pin" ++msgstr "" ++ ++msgid "DI_pin" ++msgstr "" ++ ++msgid "DO_pin" ++msgstr "" ++ ++msgid "Enable" ++msgstr "" ++ ++msgid "MMC/SD driver configuration" ++msgstr "" ++ ++msgid "Mode" ++msgstr "" ++ ++msgid "Name" ++msgstr "" ++ ++msgid "Settings" ++msgstr "Sắp đặt" +diff --git a/feeds/luci/applications/luci-app-mmc-over-gpio/po/zh-cn/mmc_over_gpio.po b/feeds/luci/applications/luci-app-mmc-over-gpio/po/zh-cn/mmc_over_gpio.po +new file mode 100644 +index 0000000..27dcefd +--- /dev/null ++++ b/feeds/luci/applications/luci-app-mmc-over-gpio/po/zh-cn/mmc_over_gpio.po +@@ -0,0 +1,41 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Report-Msgid-Bugs-To: \n" ++"POT-Creation-Date: 2009-06-10 03:40+0200\n" ++"PO-Revision-Date: 2013-10-08 15:25+0200\n" ++"Last-Translator: Tanyingyu \n" ++"Language-Team: LANGUAGE \n" ++"Language: zh_CN\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=1; plural=0;\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "CLK_pin" ++msgstr "CLK针脚" ++ ++msgid "CS_pin" ++msgstr "CS针脚" ++ ++msgid "DI_pin" ++msgstr "DI针脚" ++ ++msgid "DO_pin" ++msgstr "DO针脚" ++ ++msgid "Enable" ++msgstr "å…许" ++ ++msgid "MMC/SD driver configuration" ++msgstr "MMC/SD驱动é…ç½®" ++ ++msgid "Mode" ++msgstr "模å¼" ++ ++msgid "Name" ++msgstr "å称" ++ ++msgid "Settings" ++msgstr "设置" +diff --git a/feeds/luci/applications/luci-app-mmc-over-gpio/po/zh-tw/mmc_over_gpio.po b/feeds/luci/applications/luci-app-mmc-over-gpio/po/zh-tw/mmc_over_gpio.po +new file mode 100644 +index 0000000..fe12e66 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-mmc-over-gpio/po/zh-tw/mmc_over_gpio.po +@@ -0,0 +1,39 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"PO-Revision-Date: 2014-05-21 12:48+0200\n" ++"Last-Translator: omnistack \n" ++"Language-Team: none\n" ++"Language: zh_TW\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=1; plural=0;\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "CLK_pin" ++msgstr "CLK_pinè…³" ++ ++msgid "CS_pin" ++msgstr "CS_pinè…³" ++ ++msgid "DI_pin" ++msgstr "DI_pinè…³" ++ ++msgid "DO_pin" ++msgstr "DO_pinè…³" ++ ++msgid "Enable" ++msgstr "啟用" ++ ++msgid "MMC/SD driver configuration" ++msgstr "MMC/SD記憶å¡é©…動程å¼è¨­å®š" ++ ++msgid "Mode" ++msgstr "模å¼" ++ ++msgid "Name" ++msgstr "å稱" ++ ++msgid "Settings" ++msgstr "設定值" +diff --git a/feeds/luci/applications/luci-app-mmc-over-gpio/root/etc/uci-defaults/luci-mmc-over-gpio b/feeds/luci/applications/luci-app-mmc-over-gpio/root/etc/uci-defaults/luci-mmc-over-gpio +new file mode 100755 +index 0000000..c6e79e6 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-mmc-over-gpio/root/etc/uci-defaults/luci-mmc-over-gpio +@@ -0,0 +1,11 @@ ++#!/bin/sh ++ ++uci -q batch <<-EOF >/dev/null ++ delete ucitrack.@mmc_over_gpio[-1] ++ add ucitrack mmc_over_gpio ++ set ucitrack.@mmc_over_gpio[-1].init=mmc_over_gpio ++ commit ucitrack ++EOF ++ ++rm -f /tmp/luci-indexcache ++exit 0 +diff --git a/feeds/luci/applications/luci-app-multiwan/Makefile b/feeds/luci/applications/luci-app-multiwan/Makefile +new file mode 100644 +index 0000000..c5b731a +--- /dev/null ++++ b/feeds/luci/applications/luci-app-multiwan/Makefile +@@ -0,0 +1,14 @@ ++# ++# Copyright (C) 2008-2014 The LuCI Team ++# ++# This is free software, licensed under the Apache License, Version 2.0 . ++# ++ ++include $(TOPDIR)/rules.mk ++ ++LUCI_TITLE:=LuCI Support for the OpenWrt MultiWAN agent (obsoleted by mwan3) ++LUCI_DEPENDS:=+multiwan @BROKEN ++ ++include ../../luci.mk ++ ++# call BuildPackage - OpenWrt buildroot signature +diff --git a/feeds/luci/applications/luci-app-multiwan/luasrc/controller/multiwan.lua b/feeds/luci/applications/luci-app-multiwan/luasrc/controller/multiwan.lua +new file mode 100644 +index 0000000..523ac21 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-multiwan/luasrc/controller/multiwan.lua +@@ -0,0 +1,60 @@ ++module("luci.controller.multiwan", package.seeall) ++ ++function index() ++ local fs = require "nixio.fs" ++ if not fs.access("/etc/config/multiwan") then ++ return ++ end ++ ++ local page ++ ++ page = entry({"admin", "network", "multiwan"}, cbi("multiwan/multiwan"), _("Multi-WAN")) ++ page.dependent = true ++ ++ entry({"admin", "network", "multiwan", "status"}, call("multiwan_status")) ++ ++ page = entry({"mini", "network", "multiwan"}, cbi("multiwan/multiwanmini", {autoapply=true}), _("Multi-WAN")) ++ page.dependent = true ++end ++function multiwan_status() ++ local nfs = require "nixio.fs" ++ local cachefile = "/tmp/.mwan/cache" ++ ++ local rv = { } ++ ++ cachefile = nfs.readfile(cachefile) ++ if cachefile then ++ local ntm = require "luci.model.network".init() ++ _, _, wan_if_map = string.find(cachefile, "wan_if_map=\"([^\"]*)\"") ++ _, _, wan_fail_map = string.find(cachefile, "wan_fail_map=\"([^\"]*)\"") ++ _, _, wan_recovery_map = string.find(cachefile, "wan_recovery_map=\"([^\"]*)\"") ++ ++ rv.wans = { } ++ wansid = {} ++ ++ for wanname, wanifname in string.gfind(wan_if_map, "([^%[]+)%[([^%]]+)%]") do ++ local wanlink = ntm:get_interface(wanifname) ++ wanlink = wanlink and wanlink:get_network() ++ wanlink = wanlink and wanlink:adminlink() or "#" ++ wansid[wanname] = #rv.wans + 1 ++ rv.wans[wansid[wanname]] = { name = wanname, link = wanlink, ifname = wanifname, status = "ok", count = 0 } ++ end ++ ++ for wanname, failcount in string.gfind(wan_fail_map, "([^%[]+)%[([^%]]+)%]") do ++ if failcount == "x" then ++ rv.wans[wansid[wanname]].status = "ko" ++ else ++ rv.wans[wansid[wanname]].status = "failing" ++ rv.wans[wansid[wanname]].count = failcount ++ end ++ end ++ ++ for wanname, recoverycount in string.gfind(wan_recovery_map, "([^%[]+)%[([^%]]+)%]") do ++ rv.wans[wansid[wanname]].status = "recovering" ++ rv.wans[wansid[wanname]].count = recoverycount ++ end ++ end ++ ++ luci.http.prepare_content("application/json") ++ luci.http.write_json(rv) ++end +diff --git a/feeds/luci/applications/luci-app-multiwan/luasrc/model/cbi/multiwan/multiwan.lua b/feeds/luci/applications/luci-app-multiwan/luasrc/model/cbi/multiwan/multiwan.lua +new file mode 100644 +index 0000000..586b630 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-multiwan/luasrc/model/cbi/multiwan/multiwan.lua +@@ -0,0 +1,155 @@ ++require("luci.tools.webadmin") ++ ++m = Map("multiwan", translate("Multi-WAN"), ++ translate("Multi-WAN allows for the use of multiple uplinks for load balancing and failover.")) ++ ++s = m:section(NamedSection, "config", "multiwan", "") ++ ++e = s:option(Flag, "enabled", translate("Enable")) ++e.rmempty = false ++e.default = e.enabled ++ ++function e.write(self, section, value) ++ if value == "0" then ++ os.execute("/etc/init.d/multiwan stop") ++ else ++ os.execute("/etc/init.d/multiwan enable") ++ end ++ Flag.write(self, section, value) ++end ++ ++s = m:section(TypedSection, "interface", translate("WAN Interfaces"), ++ translate("Health Monitor detects and corrects network changes and failed connections.")) ++s.addremove = true ++ ++weight = s:option(ListValue, "weight", translate("Load Balancer Distribution")) ++weight:value("10", "10") ++weight:value("9", "9") ++weight:value("8", "8") ++weight:value("7", "7") ++weight:value("6", "6") ++weight:value("5", "5") ++weight:value("4", "4") ++weight:value("3", "3") ++weight:value("2", "2") ++weight:value("1", "1") ++weight:value("disable", translate("None")) ++weight.default = "10" ++weight.optional = false ++weight.rmempty = false ++ ++interval = s:option(ListValue, "health_interval", translate("Health Monitor Interval")) ++interval:value("disable", translate("Disable")) ++interval:value("5", "5 sec.") ++interval:value("10", "10 sec.") ++interval:value("20", "20 sec.") ++interval:value("30", "30 sec.") ++interval:value("60", "60 sec.") ++interval:value("120", "120 sec.") ++interval.default = "10" ++interval.optional = false ++interval.rmempty = false ++ ++icmp_hosts = s:option(Value, "icmp_hosts", translate("Health Monitor ICMP Host(s)")) ++icmp_hosts:value("disable", translate("Disable")) ++icmp_hosts:value("dns", "DNS Server(s)") ++icmp_hosts:value("gateway", "WAN Gateway") ++icmp_hosts.default = "dns" ++icmp_hosts.optional = false ++icmp_hosts.rmempty = false ++ ++timeout = s:option(ListValue, "timeout", translate("Health Monitor ICMP Timeout")) ++timeout:value("1", "1 sec.") ++timeout:value("2", "2 sec.") ++timeout:value("3", "3 sec.") ++timeout:value("4", "4 sec.") ++timeout:value("5", "5 sec.") ++timeout:value("10", "10 sec.") ++timeout.default = "3" ++timeout.optional = false ++timeout.rmempty = false ++ ++fail = s:option(ListValue, "health_fail_retries", translate("Attempts Before WAN Failover")) ++fail:value("1", "1") ++fail:value("3", "3") ++fail:value("5", "5") ++fail:value("10", "10") ++fail:value("15", "15") ++fail:value("20", "20") ++fail.default = "3" ++fail.optional = false ++fail.rmempty = false ++ ++recovery = s:option(ListValue, "health_recovery_retries", translate("Attempts Before WAN Recovery")) ++recovery:value("1", "1") ++recovery:value("3", "3") ++recovery:value("5", "5") ++recovery:value("10", "10") ++recovery:value("15", "15") ++recovery:value("20", "20") ++recovery.default = "5" ++recovery.optional = false ++recovery.rmempty = false ++ ++failover_to = s:option(ListValue, "failover_to", translate("Failover Traffic Destination")) ++failover_to:value("disable", translate("None")) ++luci.tools.webadmin.cbi_add_networks(failover_to) ++failover_to:value("fastbalancer", translate("Load Balancer(Performance)")) ++failover_to:value("balancer", translate("Load Balancer(Compatibility)")) ++failover_to.default = "balancer" ++failover_to.optional = false ++failover_to.rmempty = false ++ ++dns = s:option(Value, "dns", translate("DNS Server(s)")) ++dns:value("auto", translate("Auto")) ++dns.default = "auto" ++dns.optional = false ++dns.rmempty = true ++ ++s = m:section(TypedSection, "mwanfw", translate("Multi-WAN Traffic Rules"), ++ translate("Configure rules for directing outbound traffic through specified WAN Uplinks.")) ++s.template = "cbi/tblsection" ++s.anonymous = true ++s.addremove = true ++ ++src = s:option(Value, "src", translate("Source Address")) ++src.rmempty = true ++src:value("", translate("all")) ++luci.tools.webadmin.cbi_add_knownips(src) ++ ++dst = s:option(Value, "dst", translate("Destination Address")) ++dst.rmempty = true ++dst:value("", translate("all")) ++luci.tools.webadmin.cbi_add_knownips(dst) ++ ++proto = s:option(Value, "proto", translate("Protocol")) ++proto:value("", translate("all")) ++proto:value("tcp", "TCP") ++proto:value("udp", "UDP") ++proto:value("icmp", "ICMP") ++proto.rmempty = true ++ ++ports = s:option(Value, "ports", translate("Ports")) ++ports.rmempty = true ++ports:value("", translate("all", translate("all"))) ++ ++wanrule = s:option(ListValue, "wanrule", translate("WAN Uplink")) ++luci.tools.webadmin.cbi_add_networks(wanrule) ++wanrule:value("fastbalancer", translate("Load Balancer(Performance)")) ++wanrule:value("balancer", translate("Load Balancer(Compatibility)")) ++wanrule.default = "fastbalancer" ++wanrule.optional = false ++wanrule.rmempty = false ++ ++s = m:section(NamedSection, "config", "", "") ++s.addremove = false ++ ++default_route = s:option(ListValue, "default_route", translate("Default Route")) ++luci.tools.webadmin.cbi_add_networks(default_route) ++default_route:value("fastbalancer", translate("Load Balancer(Performance)")) ++default_route:value("balancer", translate("Load Balancer(Compatibility)")) ++default_route.default = "balancer" ++default_route.optional = false ++default_route.rmempty = false ++ ++return m +diff --git a/feeds/luci/applications/luci-app-multiwan/luasrc/model/cbi/multiwan/multiwanmini.lua b/feeds/luci/applications/luci-app-multiwan/luasrc/model/cbi/multiwan/multiwanmini.lua +new file mode 100644 +index 0000000..d389745 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-multiwan/luasrc/model/cbi/multiwan/multiwanmini.lua +@@ -0,0 +1,67 @@ ++require("luci.tools.webadmin") ++ ++m = Map("multiwan", translate("Multi-WAN"), ++ translate("Multi-WAN allows for the use of multiple uplinks for load balancing and failover.")) ++ ++s = m:section(NamedSection, "config", "multiwan", "") ++ ++e = s:option(Flag, "enabled", translate("Enable")) ++e.rmempty = false ++e.default = "1" ++ ++function e.write(self, section, value) ++ if value == "0" then ++ os.execute("/etc/init.d/multiwan stop") ++ else ++ os.execute("/etc/init.d/multiwan enable") ++ end ++ Flag.write(self, section, value) ++end ++ ++s = m:section(TypedSection, "mwanfw", translate("Multi-WAN Traffic Rules"), ++ translate("Configure rules for directing outbound traffic through specified WAN Uplinks.")) ++s.template = "cbi/tblsection" ++s.anonymous = true ++s.addremove = true ++ ++src = s:option(Value, "src", translate("Source Address")) ++src.rmempty = true ++src:value("", translate("all")) ++luci.tools.webadmin.cbi_add_knownips(src) ++ ++dst = s:option(Value, "dst", translate("Destination Address")) ++dst.rmempty = true ++dst:value("", translate("all")) ++luci.tools.webadmin.cbi_add_knownips(dst) ++ ++proto = s:option(Value, "proto", translate("Protocol")) ++proto:value("", translate("all")) ++proto:value("tcp", "TCP") ++proto:value("udp", "UDP") ++proto:value("icmp", "ICMP") ++proto.rmempty = true ++ ++ports = s:option(Value, "ports", translate("Ports")) ++ports.rmempty = true ++ports:value("", translate("all", translate("all"))) ++ ++wanrule = s:option(ListValue, "wanrule", translate("WAN Uplink")) ++luci.tools.webadmin.cbi_add_networks(wanrule) ++wanrule:value("fastbalancer", translate("Load Balancer(Performance)")) ++wanrule:value("balancer", translate("Load Balancer(Compatibility)")) ++wanrule.default = "fastbalancer" ++wanrule.optional = false ++wanrule.rmempty = false ++ ++s = m:section(NamedSection, "config", "", "") ++s.addremove = false ++ ++default_route = s:option(ListValue, "default_route", translate("Default Route")) ++luci.tools.webadmin.cbi_add_networks(default_route) ++default_route:value("fastbalancer", translate("Load Balancer(Performance)")) ++default_route:value("balancer", translate("Load Balancer(Compatibility)")) ++default_route.default = "balancer" ++default_route.optional = false ++default_route.rmempty = false ++ ++return m +diff --git a/feeds/luci/applications/luci-app-multiwan/luasrc/view/admin_status/index/multiwan.htm b/feeds/luci/applications/luci-app-multiwan/luasrc/view/admin_status/index/multiwan.htm +new file mode 100644 +index 0000000..79c0453 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-multiwan/luasrc/view/admin_status/index/multiwan.htm +@@ -0,0 +1 @@ ++<%+multiwan_status%> +diff --git a/feeds/luci/applications/luci-app-multiwan/luasrc/view/multiwan_status.htm b/feeds/luci/applications/luci-app-multiwan/luasrc/view/multiwan_status.htm +new file mode 100644 +index 0000000..8c4127b +--- /dev/null ++++ b/feeds/luci/applications/luci-app-multiwan/luasrc/view/multiwan_status.htm +@@ -0,0 +1,71 @@ ++ ++ ++ ++ ++
    ++ <%:Multi-WAN Status%> ++
    <%:Collecting data...%>
    ++
    +diff --git a/feeds/luci/applications/luci-app-multiwan/po/ca/multiwan.po b/feeds/luci/applications/luci-app-multiwan/po/ca/multiwan.po +new file mode 100644 +index 0000000..eb81ae8 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-multiwan/po/ca/multiwan.po +@@ -0,0 +1,124 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"PO-Revision-Date: 2014-07-01 04:22+0200\n" ++"Last-Translator: Alex \n" ++"Language-Team: none\n" ++"Language: ca\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n != 1);\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "Attempts Before WAN Failover" ++msgstr "Intents abans de commutació WAN" ++ ++msgid "Attempts Before WAN Recovery" ++msgstr "Intents abans de recuperació WAN" ++ ++msgid "Auto" ++msgstr "Auto" ++ ++msgid "Collecting data..." ++msgstr "Recollint dades..." ++ ++msgid "" ++"Configure rules for directing outbound traffic through specified WAN Uplinks." ++msgstr "" ++"Configureu les regles per dirigir trànsit sortint a través d'enllaços " ++"ascendents WAN especificats." ++ ++msgid "DNS Server(s)" ++msgstr "Servidors DNS" ++ ++msgid "Default Route" ++msgstr "Ruta per defecte" ++ ++msgid "Destination Address" ++msgstr "Adreça de destí" ++ ++msgid "Disable" ++msgstr "Inhabilita" ++ ++msgid "Enable" ++msgstr "Habilita" ++ ++msgid "Failing" ++msgstr "Fallant" ++ ++msgid "Failover Traffic Destination" ++msgstr "Destí de trànsit al commutar" ++ ++msgid "Health Monitor ICMP Host(s)" ++msgstr "Hosts ICMP de monitor de salut" ++ ++msgid "Health Monitor ICMP Timeout" ++msgstr "Temps d'espera ICMP del monitor de salut" ++ ++msgid "Health Monitor Interval" ++msgstr "Interval del monitor de salut" ++ ++msgid "" ++"Health Monitor detects and corrects network changes and failed connections." ++msgstr "" ++"El monitor de salut detecta i corregeix canvis de xarxa i connexions " ++"fallades." ++ ++msgid "KO" ++msgstr "KO" ++ ++msgid "Load Balancer Distribution" ++msgstr "Distribució de l'equilibrador de carrega" ++ ++msgid "Load Balancer(Compatibility)" ++msgstr "Equilibrador de carrega (compatibilitat)" ++ ++msgid "Load Balancer(Performance)" ++msgstr "Equilibrador de carrega (rendiment)" ++ ++msgid "Multi-WAN" ++msgstr "Multi-WAN" ++ ++msgid "Multi-WAN Status" ++msgstr "Estat de Multi-WAN" ++ ++msgid "Multi-WAN Traffic Rules" ++msgstr "Regles de trànsit de Multi-WAN" ++ ++msgid "" ++"Multi-WAN allows for the use of multiple uplinks for load balancing and " ++"failover." ++msgstr "" ++"El Multi-WAN permet el ús de múltiples enllaços ascendents per a equilibri " ++"de carrega i commutació d'errors." ++ ++msgid "None" ++msgstr "Cap" ++ ++msgid "OK" ++msgstr "D'acord" ++ ++msgid "Ports" ++msgstr "Ports" ++ ++msgid "Protocol" ++msgstr "Protocol" ++ ++msgid "Recovering" ++msgstr "Recuperant" ++ ++msgid "Source Address" ++msgstr "Adreça d'origen" ++ ++msgid "Unknown" ++msgstr "Desconegut" ++ ++msgid "WAN Interfaces" ++msgstr "Interfícies WAN" ++ ++msgid "WAN Uplink" ++msgstr "Enllaç ascendent WAN" ++ ++msgid "all" ++msgstr "tots" +diff --git a/feeds/luci/applications/luci-app-multiwan/po/cs/multiwan.po b/feeds/luci/applications/luci-app-multiwan/po/cs/multiwan.po +new file mode 100644 +index 0000000..0629827 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-multiwan/po/cs/multiwan.po +@@ -0,0 +1,124 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"PO-Revision-Date: 2014-07-11 19:45+0200\n" ++"Last-Translator: koli \n" ++"Language-Team: none\n" ++"Language: cs\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "Attempts Before WAN Failover" ++msgstr "PoÄet pokusů pÅ™ed spuÅ¡tÄ›ním záložního WAN" ++ ++msgid "Attempts Before WAN Recovery" ++msgstr "PoÄet pokusů pÅ™ed obnovou WAN" ++ ++msgid "Auto" ++msgstr "Automaticky" ++ ++msgid "Collecting data..." ++msgstr "Sbírám data..." ++ ++msgid "" ++"Configure rules for directing outbound traffic through specified WAN Uplinks." ++msgstr "" ++"Nastavit pravidla pro smÄ›rování odchozích paketů pÅ™es konkrétní WAN " ++"rozhraní." ++ ++msgid "DNS Server(s)" ++msgstr "DNS server(y)" ++ ++msgid "Default Route" ++msgstr "Výchozí brána" ++ ++msgid "Destination Address" ++msgstr "Cílová adresa" ++ ++msgid "Disable" ++msgstr "Vypnout" ++ ++msgid "Enable" ++msgstr "Povolit" ++ ++msgid "Failing" ++msgstr "Selhání" ++ ++msgid "Failover Traffic Destination" ++msgstr "Cíl záložního spojení" ++ ++msgid "Health Monitor ICMP Host(s)" ++msgstr "Monitorování dostupnosti - ICMP host(é)" ++ ++msgid "Health Monitor ICMP Timeout" ++msgstr "Monitorování dostupnosti - ICMP Äasový limit" ++ ++msgid "Health Monitor Interval" ++msgstr "Monitorování dostupnosti - interval" ++ ++msgid "" ++"Health Monitor detects and corrects network changes and failed connections." ++msgstr "" ++"Monitorování dostupnosti kontroluje a opravuje zmÄ›ny v síti a selhání " ++"pÅ™ipojení." ++ ++msgid "KO" ++msgstr "KO" ++ ++msgid "Load Balancer Distribution" ++msgstr "Load Balancer - rozdÄ›lení" ++ ++msgid "Load Balancer(Compatibility)" ++msgstr "Load Balancer(Kompatibilita)" ++ ++msgid "Load Balancer(Performance)" ++msgstr "Load Balancer(Výkon)" ++ ++msgid "Multi-WAN" ++msgstr "Multi-WAN" ++ ++msgid "Multi-WAN Status" ++msgstr "Stav Multi-WAN" ++ ++msgid "Multi-WAN Traffic Rules" ++msgstr "Multi-WAN pravidla smÄ›rování" ++ ++msgid "" ++"Multi-WAN allows for the use of multiple uplinks for load balancing and " ++"failover." ++msgstr "" ++"Multi-WAN umožňuje použít nÄ›kolik internetových pÅ™ipojení pro vyvažování " ++"zátěže a zálohy pÅ™ipojení." ++ ++msgid "None" ++msgstr "Žádný" ++ ++msgid "OK" ++msgstr "OK" ++ ++msgid "Ports" ++msgstr "Porty" ++ ++msgid "Protocol" ++msgstr "Protokol" ++ ++msgid "Recovering" ++msgstr "Obnovuji" ++ ++msgid "Source Address" ++msgstr "Zdrojová adresa" ++ ++msgid "Unknown" ++msgstr "Neznámý" ++ ++msgid "WAN Interfaces" ++msgstr "WAN rozhraní" ++ ++msgid "WAN Uplink" ++msgstr "WAN pÅ™ipojení" ++ ++msgid "all" ++msgstr "VÅ¡echny" +diff --git a/feeds/luci/applications/luci-app-multiwan/po/de/multiwan.po b/feeds/luci/applications/luci-app-multiwan/po/de/multiwan.po +new file mode 100644 +index 0000000..2fa789f +--- /dev/null ++++ b/feeds/luci/applications/luci-app-multiwan/po/de/multiwan.po +@@ -0,0 +1,124 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"PO-Revision-Date: 2012-08-10 02:55+0200\n" ++"Last-Translator: Jo-Philipp \n" ++"Language-Team: none\n" ++"Language: de\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n != 1);\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "Attempts Before WAN Failover" ++msgstr "Versuche vor Umschalten auf WAN Ersatzverbindung" ++ ++msgid "Attempts Before WAN Recovery" ++msgstr "Versuche vor dem Zurückschalten auf normale WAN Verbindung" ++ ++msgid "Auto" ++msgstr "automatisch" ++ ++msgid "Collecting data..." ++msgstr "Sammle Daten..." ++ ++msgid "" ++"Configure rules for directing outbound traffic through specified WAN Uplinks." ++msgstr "" ++"Mit diesen Regeln kann ausgehender Verkehr bestimmten WAN-Uplinks zugeordnet " ++"werden." ++ ++msgid "DNS Server(s)" ++msgstr "DNS Server" ++ ++msgid "Default Route" ++msgstr "Standardroute" ++ ++msgid "Destination Address" ++msgstr "Zieladresse" ++ ++msgid "Disable" ++msgstr "Deaktivieren" ++ ++msgid "Enable" ++msgstr "Aktivieren" ++ ++msgid "Failing" ++msgstr "Versagt" ++ ++msgid "Failover Traffic Destination" ++msgstr "Failover Traffic Ziel" ++ ++msgid "Health Monitor ICMP Host(s)" ++msgstr "ICMP Host(s) zur Verbindungsüberwachung" ++ ++msgid "Health Monitor ICMP Timeout" ++msgstr "Timeout für ICMP-Pakete zur Verbindungsüberwachung" ++ ++msgid "Health Monitor Interval" ++msgstr "Intervall für Verbindungsüberwachung" ++ ++msgid "" ++"Health Monitor detects and corrects network changes and failed connections." ++msgstr "" ++"Die Verbindungsüberwachung erkennt und behebt Netzwerkänderungen und " ++"Verbindungsabbrüche." ++ ++msgid "KO" ++msgstr "Getrennt" ++ ++msgid "Load Balancer Distribution" ++msgstr "Load Balancer Verteilung" ++ ++msgid "Load Balancer(Compatibility)" ++msgstr "Load Balancer (Kompatibilität)" ++ ++msgid "Load Balancer(Performance)" ++msgstr "Load Balancer (Performance)" ++ ++msgid "Multi-WAN" ++msgstr "Multi-WAN" ++ ++msgid "Multi-WAN Status" ++msgstr "Multi-WAN Status" ++ ++msgid "Multi-WAN Traffic Rules" ++msgstr "Multi-WAN Verkehrsregeln" ++ ++msgid "" ++"Multi-WAN allows for the use of multiple uplinks for load balancing and " ++"failover." ++msgstr "" ++"Multi-WAN erlaubt es, mehrere ISP-Verbindungen gleichzeitig oder als " ++"Ersatzverbindung beim Ausfall der Hauptverbindung zu verwenden." ++ ++msgid "None" ++msgstr "Keine" ++ ++msgid "OK" ++msgstr "OK" ++ ++msgid "Ports" ++msgstr "Ports" ++ ++msgid "Protocol" ++msgstr "Protokoll" ++ ++msgid "Recovering" ++msgstr "Neu verbunden" ++ ++msgid "Source Address" ++msgstr "Quelladresse" ++ ++msgid "Unknown" ++msgstr "Unbekannt" ++ ++msgid "WAN Interfaces" ++msgstr "WAN-Schnittstellen" ++ ++msgid "WAN Uplink" ++msgstr "WAN Uplink-Verbindung" ++ ++msgid "all" ++msgstr "alle" +diff --git a/feeds/luci/applications/luci-app-multiwan/po/el/multiwan.po b/feeds/luci/applications/luci-app-multiwan/po/el/multiwan.po +new file mode 100644 +index 0000000..48d3165 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-multiwan/po/el/multiwan.po +@@ -0,0 +1,118 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"PO-Revision-Date: 2012-03-18 15:16+0200\n" ++"Last-Translator: Vasilis \n" ++"Language-Team: none\n" ++"Language: el\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n != 1);\n" ++"X-Generator: Pootle 2.0.4\n" ++ ++msgid "Attempts Before WAN Failover" ++msgstr "" ++ ++msgid "Attempts Before WAN Recovery" ++msgstr "" ++ ++msgid "Auto" ++msgstr "" ++ ++msgid "Collecting data..." ++msgstr "" ++ ++msgid "" ++"Configure rules for directing outbound traffic through specified WAN Uplinks." ++msgstr "" ++ ++msgid "DNS Server(s)" ++msgstr "" ++ ++msgid "Default Route" ++msgstr "" ++ ++msgid "Destination Address" ++msgstr "ΔιεÏθυνση ΠÏοοÏισμοÏ" ++ ++msgid "Disable" ++msgstr "ΑπενεÏγοποίηση" ++ ++msgid "Enable" ++msgstr "ΕνεÏγοποίηση" ++ ++msgid "Failing" ++msgstr "" ++ ++msgid "Failover Traffic Destination" ++msgstr "" ++ ++msgid "Health Monitor ICMP Host(s)" ++msgstr "" ++ ++msgid "Health Monitor ICMP Timeout" ++msgstr "" ++ ++msgid "Health Monitor Interval" ++msgstr "" ++ ++msgid "" ++"Health Monitor detects and corrects network changes and failed connections." ++msgstr "" ++ ++msgid "KO" ++msgstr "" ++ ++msgid "Load Balancer Distribution" ++msgstr "" ++ ++msgid "Load Balancer(Compatibility)" ++msgstr "" ++ ++msgid "Load Balancer(Performance)" ++msgstr "" ++ ++msgid "Multi-WAN" ++msgstr "" ++ ++msgid "Multi-WAN Status" ++msgstr "" ++ ++msgid "Multi-WAN Traffic Rules" ++msgstr "" ++ ++msgid "" ++"Multi-WAN allows for the use of multiple uplinks for load balancing and " ++"failover." ++msgstr "" ++ ++msgid "None" ++msgstr "" ++ ++msgid "OK" ++msgstr "" ++ ++msgid "Ports" ++msgstr "" ++ ++msgid "Protocol" ++msgstr "ΠÏωτόκολλο" ++ ++msgid "Recovering" ++msgstr "" ++ ++msgid "Source Address" ++msgstr "" ++ ++msgid "Unknown" ++msgstr "" ++ ++msgid "WAN Interfaces" ++msgstr "" ++ ++msgid "WAN Uplink" ++msgstr "" ++ ++msgid "all" ++msgstr "" +diff --git a/feeds/luci/applications/luci-app-multiwan/po/en/multiwan.po b/feeds/luci/applications/luci-app-multiwan/po/en/multiwan.po +new file mode 100644 +index 0000000..241e6d0 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-multiwan/po/en/multiwan.po +@@ -0,0 +1,114 @@ ++# multiwan.po ++# generated from /tmp/i18n/luasrc/i18n/multiwan.en.lua ++msgid "" ++msgstr "Content-Type: text/plain; charset=UTF-8\n" ++ ++msgid "Attempts Before WAN Failover" ++msgstr "Attempts Before WAN Failover" ++ ++msgid "Attempts Before WAN Recovery" ++msgstr "Attempts Before WAN Recovery" ++ ++msgid "Auto" ++msgstr "Auto" ++ ++msgid "Collecting data..." ++msgstr "" ++ ++msgid "" ++"Configure rules for directing outbound traffic through specified WAN Uplinks." ++msgstr "" ++"Configure rules for directing outbound traffic through specified WAN Uplinks." ++ ++msgid "DNS Server(s)" ++msgstr "DNS Server(s)" ++ ++msgid "Default Route" ++msgstr "Default Route" ++ ++msgid "Destination Address" ++msgstr "Destination Address" ++ ++msgid "Disable" ++msgstr "Disable" ++ ++msgid "Enable" ++msgstr "Enable" ++ ++msgid "Failing" ++msgstr "" ++ ++msgid "Failover Traffic Destination" ++msgstr "Failover Traffic Destination" ++ ++msgid "Health Monitor ICMP Host(s)" ++msgstr "Health Monitor ICMP Host(s)" ++ ++msgid "Health Monitor ICMP Timeout" ++msgstr "Health Monitor ICMP Timeout" ++ ++msgid "Health Monitor Interval" ++msgstr "Health Monitor Interval" ++ ++msgid "" ++"Health Monitor detects and corrects network changes and failed connections." ++msgstr "" ++"Health Monitor detects and corrects network changes and failed connections." ++ ++msgid "KO" ++msgstr "" ++ ++msgid "Load Balancer Distribution" ++msgstr "Load Balancer Distribution" ++ ++msgid "Load Balancer(Compatibility)" ++msgstr "Load Balancer(Compatibility)" ++ ++msgid "Load Balancer(Performance)" ++msgstr "Load Balancer(Performance)" ++ ++msgid "Multi-WAN" ++msgstr "Multi-WAN" ++ ++msgid "Multi-WAN Status" ++msgstr "" ++ ++msgid "Multi-WAN Traffic Rules" ++msgstr "Multi-WAN Traffic Rules" ++ ++msgid "" ++"Multi-WAN allows for the use of multiple uplinks for load balancing and " ++"failover." ++msgstr "" ++"Multi-WAN allows for the use of multiple uplinks for load balancing and " ++"failover." ++ ++msgid "None" ++msgstr "None" ++ ++msgid "OK" ++msgstr "" ++ ++msgid "Ports" ++msgstr "Ports" ++ ++msgid "Protocol" ++msgstr "Protocol" ++ ++msgid "Recovering" ++msgstr "" ++ ++msgid "Source Address" ++msgstr "Source Address" ++ ++msgid "Unknown" ++msgstr "" ++ ++msgid "WAN Interfaces" ++msgstr "WAN Interfaces" ++ ++msgid "WAN Uplink" ++msgstr "WAN Uplink" ++ ++msgid "all" ++msgstr "" +diff --git a/feeds/luci/applications/luci-app-multiwan/po/es/multiwan.po b/feeds/luci/applications/luci-app-multiwan/po/es/multiwan.po +new file mode 100644 +index 0000000..1a54f75 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-multiwan/po/es/multiwan.po +@@ -0,0 +1,124 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"PO-Revision-Date: 2012-08-23 23:07+0200\n" ++"Last-Translator: José Vicente \n" ++"Language-Team: none\n" ++"Language: es\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n != 1);\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "Attempts Before WAN Failover" ++msgstr "Reintentos ante fallo de la WAN" ++ ++msgid "Attempts Before WAN Recovery" ++msgstr "Reintentos tras recuperar la WAN" ++ ++msgid "Auto" ++msgstr "Auto" ++ ++msgid "Collecting data..." ++msgstr "Recuperando datos..." ++ ++msgid "" ++"Configure rules for directing outbound traffic through specified WAN Uplinks." ++msgstr "" ++"Configure las reglas que redirigen el tráfico saliente a través de los " ++"enlaces WAN salientes especificados." ++ ++msgid "DNS Server(s)" ++msgstr "Servidor/es DNS" ++ ++msgid "Default Route" ++msgstr "Ruta por defecto" ++ ++msgid "Destination Address" ++msgstr "Dirección de destino" ++ ++msgid "Disable" ++msgstr "Desactivar" ++ ++msgid "Enable" ++msgstr "Activar" ++ ++msgid "Failing" ++msgstr "Fallando" ++ ++msgid "Failover Traffic Destination" ++msgstr "Destino del tráfico en caso de fallo" ++ ++msgid "Health Monitor ICMP Host(s)" ++msgstr "Monitores de salud ICMP" ++ ++msgid "Health Monitor ICMP Timeout" ++msgstr "Espera monitor de salud ICMP" ++ ++msgid "Health Monitor Interval" ++msgstr "Intervalo del monitor de salud" ++ ++msgid "" ++"Health Monitor detects and corrects network changes and failed connections." ++msgstr "" ++"El monitor de salud detecta y corrige cambios en la red y conexiones " ++"fallidas." ++ ++msgid "KO" ++msgstr "KO" ++ ++msgid "Load Balancer Distribution" ++msgstr "Distribución del balanceador de carga" ++ ++msgid "Load Balancer(Compatibility)" ++msgstr "Balanceador de carga (compatibilidad)" ++ ++msgid "Load Balancer(Performance)" ++msgstr "Balanceador de carga (rendimiento)" ++ ++msgid "Multi-WAN" ++msgstr "Multi-WAN" ++ ++msgid "Multi-WAN Status" ++msgstr "Estado de Multi-WAN" ++ ++msgid "Multi-WAN Traffic Rules" ++msgstr "Reglas de tráfico Multi-WAN" ++ ++msgid "" ++"Multi-WAN allows for the use of multiple uplinks for load balancing and " ++"failover." ++msgstr "" ++"Multi-WAN permite el use varios enlaces de salida para balancear la carga y " ++"control de fallos." ++ ++msgid "None" ++msgstr "Ninguno" ++ ++msgid "OK" ++msgstr "OK" ++ ++msgid "Ports" ++msgstr "Puertos" ++ ++msgid "Protocol" ++msgstr "Protocolo" ++ ++msgid "Recovering" ++msgstr "Recuperación" ++ ++msgid "Source Address" ++msgstr "Dirección origen" ++ ++msgid "Unknown" ++msgstr "Desconocido" ++ ++msgid "WAN Interfaces" ++msgstr "Interfaces WAN" ++ ++msgid "WAN Uplink" ++msgstr "Enalce saliente WAN" ++ ++msgid "all" ++msgstr "todos" +diff --git a/feeds/luci/applications/luci-app-multiwan/po/fr/multiwan.po b/feeds/luci/applications/luci-app-multiwan/po/fr/multiwan.po +new file mode 100644 +index 0000000..39b1421 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-multiwan/po/fr/multiwan.po +@@ -0,0 +1,125 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"PO-Revision-Date: 2012-11-06 16:07+0200\n" ++"Last-Translator: hogsim \n" ++"Language-Team: none\n" ++"Language: fr\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n > 1);\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "Attempts Before WAN Failover" ++msgstr "Essais avant de déclarer un WAN défaillant" ++ ++msgid "Attempts Before WAN Recovery" ++msgstr "Essais avant de déclarer qu'un WAN est rétabli" ++ ++msgid "Auto" ++msgstr "Auto" ++ ++msgid "Collecting data..." ++msgstr "Collection de données..." ++ ++msgid "" ++"Configure rules for directing outbound traffic through specified WAN Uplinks." ++msgstr "" ++"Configuration de règles pour diriger le trafic sortant à travers des liens " ++"WAN sécifiés." ++ ++msgid "DNS Server(s)" ++msgstr "Serveur(s) DNS" ++ ++msgid "Default Route" ++msgstr "Route par défaut" ++ ++msgid "Destination Address" ++msgstr "Adresse de destination" ++ ++msgid "Disable" ++msgstr "Désactiver" ++ ++msgid "Enable" ++msgstr "Activer" ++ ++msgid "Failing" ++msgstr "Défaillance" ++ ++msgid "Failover Traffic Destination" ++msgstr "Destination du trafic en cas de défaillance" ++ ++msgid "Health Monitor ICMP Host(s)" ++msgstr "Hôte(s) à pinguer pour valider le lien" ++ ++msgid "Health Monitor ICMP Timeout" ++msgstr "Delai max du ping de validation du lien" ++ ++msgid "Health Monitor Interval" ++msgstr "Invervalle de validation du lien" ++ ++msgid "" ++"Health Monitor detects and corrects network changes and failed connections." ++msgstr "" ++"La validation de liens détecte et corrige les changements du réseau et les " ++"connexions défaillantes." ++ ++msgid "KO" ++msgstr "KO" ++ ++msgid "Load Balancer Distribution" ++msgstr "Distribution d'équilibrage de charge" ++ ++msgid "Load Balancer(Compatibility)" ++msgstr "Équilibrage de charge (compatibilité)" ++ ++msgid "Load Balancer(Performance)" ++msgstr "Équilibrage de charge (performance)" ++ ++msgid "Multi-WAN" ++msgstr "Multi-WAN" ++ ++msgid "Multi-WAN Status" ++msgstr "Statut Multi-WAN" ++ ++msgid "Multi-WAN Traffic Rules" ++msgstr "Règles de trafic avec des liens sortants multiples" ++ ++msgid "" ++"Multi-WAN allows for the use of multiple uplinks for load balancing and " ++"failover." ++msgstr "" ++"Multi-WAN permet l'utilisation de liens sortants multiples pour la " ++"l'équilibrage de charge et la répartition sur les autres en cas de " ++"défaillance." ++ ++msgid "None" ++msgstr "Aucun" ++ ++msgid "OK" ++msgstr "OK" ++ ++msgid "Ports" ++msgstr "Ports" ++ ++msgid "Protocol" ++msgstr "Protocole" ++ ++msgid "Recovering" ++msgstr "Récupération" ++ ++msgid "Source Address" ++msgstr "Adresse source" ++ ++msgid "Unknown" ++msgstr "Inconnu" ++ ++msgid "WAN Interfaces" ++msgstr "Interfaces WAN" ++ ++msgid "WAN Uplink" ++msgstr "Lien remontant WAN" ++ ++msgid "all" ++msgstr "tous" +diff --git a/feeds/luci/applications/luci-app-multiwan/po/he/multiwan.po b/feeds/luci/applications/luci-app-multiwan/po/he/multiwan.po +new file mode 100644 +index 0000000..2188822 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-multiwan/po/he/multiwan.po +@@ -0,0 +1,115 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Last-Translator: Automatically generated\n" ++"Language-Team: none\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n != 1);\n" ++ ++msgid "Attempts Before WAN Failover" ++msgstr "" ++ ++msgid "Attempts Before WAN Recovery" ++msgstr "" ++ ++msgid "Auto" ++msgstr "" ++ ++msgid "Collecting data..." ++msgstr "" ++ ++msgid "" ++"Configure rules for directing outbound traffic through specified WAN Uplinks." ++msgstr "" ++ ++msgid "DNS Server(s)" ++msgstr "" ++ ++msgid "Default Route" ++msgstr "" ++ ++msgid "Destination Address" ++msgstr "" ++ ++msgid "Disable" ++msgstr "" ++ ++msgid "Enable" ++msgstr "" ++ ++msgid "Failing" ++msgstr "" ++ ++msgid "Failover Traffic Destination" ++msgstr "" ++ ++msgid "Health Monitor ICMP Host(s)" ++msgstr "" ++ ++msgid "Health Monitor ICMP Timeout" ++msgstr "" ++ ++msgid "Health Monitor Interval" ++msgstr "" ++ ++msgid "" ++"Health Monitor detects and corrects network changes and failed connections." ++msgstr "" ++ ++msgid "KO" ++msgstr "" ++ ++msgid "Load Balancer Distribution" ++msgstr "" ++ ++msgid "Load Balancer(Compatibility)" ++msgstr "" ++ ++msgid "Load Balancer(Performance)" ++msgstr "" ++ ++msgid "Multi-WAN" ++msgstr "" ++ ++msgid "Multi-WAN Status" ++msgstr "" ++ ++msgid "Multi-WAN Traffic Rules" ++msgstr "" ++ ++msgid "" ++"Multi-WAN allows for the use of multiple uplinks for load balancing and " ++"failover." ++msgstr "" ++ ++msgid "None" ++msgstr "" ++ ++msgid "OK" ++msgstr "" ++ ++msgid "Ports" ++msgstr "" ++ ++msgid "Protocol" ++msgstr "" ++ ++msgid "Recovering" ++msgstr "" ++ ++msgid "Source Address" ++msgstr "" ++ ++msgid "Unknown" ++msgstr "" ++ ++msgid "WAN Interfaces" ++msgstr "" ++ ++msgid "WAN Uplink" ++msgstr "" ++ ++msgid "all" ++msgstr "" +diff --git a/feeds/luci/applications/luci-app-multiwan/po/hu/multiwan.po b/feeds/luci/applications/luci-app-multiwan/po/hu/multiwan.po +new file mode 100644 +index 0000000..20ff8d6 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-multiwan/po/hu/multiwan.po +@@ -0,0 +1,124 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"PO-Revision-Date: 2012-12-30 19:12+0200\n" ++"Last-Translator: romboyco \n" ++"Language-Team: none\n" ++"Language: hu\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n != 1);\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "Attempts Before WAN Failover" ++msgstr "Próbálkozások WAN átállás elÅ‘tt" ++ ++msgid "Attempts Before WAN Recovery" ++msgstr "Probálkozások WAN helyreállítás elÅ‘tt" ++ ++msgid "Auto" ++msgstr "Automatikus" ++ ++msgid "Collecting data..." ++msgstr "Adatok gyűjtése..." ++ ++msgid "" ++"Configure rules for directing outbound traffic through specified WAN Uplinks." ++msgstr "" ++"Szabályok beállítása a kimenÅ‘ forgalom megadott WAN kapcsolatra " ++"irányításához." ++ ++msgid "DNS Server(s)" ++msgstr "DNS kiszolgáló(k)" ++ ++msgid "Default Route" ++msgstr "Alapértelmezett útvonal" ++ ++msgid "Destination Address" ++msgstr "Cél cím" ++ ++msgid "Disable" ++msgstr "Letiltás" ++ ++msgid "Enable" ++msgstr "Engedélyezés" ++ ++msgid "Failing" ++msgstr "CsökkenÅ‘" ++ ++msgid "Failover Traffic Destination" ++msgstr "Failover forgalom cél" ++ ++msgid "Health Monitor ICMP Host(s)" ++msgstr "ICMP gépek kapcsolat monitorozáshoz" ++ ++msgid "Health Monitor ICMP Timeout" ++msgstr "ICMP csomagok idÅ‘túllépése a kapcsolat monitorozásánál" ++ ++msgid "Health Monitor Interval" ++msgstr "Kapcsolat monitorozási intervallum" ++ ++msgid "" ++"Health Monitor detects and corrects network changes and failed connections." ++msgstr "" ++"A kapcsolat monitorozás megállapítja és korrigálja a hálózati változásokat " ++"és sikertelen kapcsolatokat." ++ ++msgid "KO" ++msgstr "KO" ++ ++msgid "Load Balancer Distribution" ++msgstr "Load balancer megosztás" ++ ++msgid "Load Balancer(Compatibility)" ++msgstr "Terhelés kiegyensúlyozás (kompatibilitás)" ++ ++msgid "Load Balancer(Performance)" ++msgstr "Terhelés kiegyensúlyozás (teljesítmény)" ++ ++msgid "Multi-WAN" ++msgstr "Többszörös WAN" ++ ++msgid "Multi-WAN Status" ++msgstr "Többszörös WAN állapot" ++ ++msgid "Multi-WAN Traffic Rules" ++msgstr "Többszörös WAN forgalmi szabályok" ++ ++msgid "" ++"Multi-WAN allows for the use of multiple uplinks for load balancing and " ++"failover." ++msgstr "" ++"A Multi-WAN lehetÅ‘vé teszi több kapcsolat használatát egyidejűleg, vagy az " ++"elsÅ‘dleges kapcsolat esetleges hibája esetén." ++ ++msgid "None" ++msgstr "Nincs" ++ ++msgid "OK" ++msgstr "OK" ++ ++msgid "Ports" ++msgstr "Portok" ++ ++msgid "Protocol" ++msgstr "Protokoll" ++ ++msgid "Recovering" ++msgstr "Helyreállítás" ++ ++msgid "Source Address" ++msgstr "Forrás cím" ++ ++msgid "Unknown" ++msgstr "Ismeretlen" ++ ++msgid "WAN Interfaces" ++msgstr "WAN interfészek" ++ ++msgid "WAN Uplink" ++msgstr "WAN kapcsolat" ++ ++msgid "all" ++msgstr "összes" +diff --git a/feeds/luci/applications/luci-app-multiwan/po/it/multiwan.po b/feeds/luci/applications/luci-app-multiwan/po/it/multiwan.po +new file mode 100644 +index 0000000..863b351 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-multiwan/po/it/multiwan.po +@@ -0,0 +1,124 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"PO-Revision-Date: 2013-02-03 14:00+0200\n" ++"Last-Translator: Francesco <3gasas@gmail.com>\n" ++"Language-Team: none\n" ++"Language: it\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n != 1);\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "Attempts Before WAN Failover" ++msgstr "Tentativi su WAN prima del Failover" ++ ++msgid "Attempts Before WAN Recovery" ++msgstr "Tentativi su WAN prima del Recovery" ++ ++msgid "Auto" ++msgstr "Auto" ++ ++msgid "Collecting data..." ++msgstr "Raccolta di dati..." ++ ++msgid "" ++"Configure rules for directing outbound traffic through specified WAN Uplinks." ++msgstr "" ++"Configura le regole per inviare direttamente in uscita il traffico su una " ++"uplink Wan specifico." ++ ++msgid "DNS Server(s)" ++msgstr "DNS Server(s)" ++ ++msgid "Default Route" ++msgstr "Default Route" ++ ++msgid "Destination Address" ++msgstr "Indirizzo di destinazione" ++ ++msgid "Disable" ++msgstr "Disable" ++ ++msgid "Enable" ++msgstr "Enable" ++ ++msgid "Failing" ++msgstr "Fallimento" ++ ++msgid "Failover Traffic Destination" ++msgstr "Destinazione del traffico in failover" ++ ++msgid "Health Monitor ICMP Host(s)" ++msgstr "Health Monitor ICMP Host(s)" ++ ++msgid "Health Monitor ICMP Timeout" ++msgstr "Health Monitor ICMP Timeout" ++ ++msgid "Health Monitor Interval" ++msgstr "Health Monitor Interval" ++ ++msgid "" ++"Health Monitor detects and corrects network changes and failed connections." ++msgstr "" ++"L'health monitor monitora e identifica i cambiamenti e la manca di " ++"connessioni." ++ ++msgid "KO" ++msgstr "KO" ++ ++msgid "Load Balancer Distribution" ++msgstr "Bilanciamento del carico" ++ ++msgid "Load Balancer(Compatibility)" ++msgstr "Carica Bilanciatore (Compatibilità)" ++ ++msgid "Load Balancer(Performance)" ++msgstr "Carica Bilanciatore (Performance)" ++ ++msgid "Multi-WAN" ++msgstr "Multi-WAN" ++ ++msgid "Multi-WAN Status" ++msgstr "Stato Multi-WAN" ++ ++msgid "Multi-WAN Traffic Rules" ++msgstr "Regole del Traffico Multi-WAN" ++ ++msgid "" ++"Multi-WAN allows for the use of multiple uplinks for load balancing and " ++"failover." ++msgstr "" ++"Multi-WAN permette di usare uplink multipi per il bilanciamento del carico e " ++"la ridondanza da failover." ++ ++msgid "None" ++msgstr "None" ++ ++msgid "OK" ++msgstr "OK" ++ ++msgid "Ports" ++msgstr "Porte" ++ ++msgid "Protocol" ++msgstr "Protocollo" ++ ++msgid "Recovering" ++msgstr "Recupero" ++ ++msgid "Source Address" ++msgstr "Indirizzo sorgente" ++ ++msgid "Unknown" ++msgstr "Sconosciuto" ++ ++msgid "WAN Interfaces" ++msgstr "Interfaccia WAN" ++ ++msgid "WAN Uplink" ++msgstr "Collegamento ascendente WAN" ++ ++msgid "all" ++msgstr "all" +diff --git a/feeds/luci/applications/luci-app-multiwan/po/ja/multiwan.po b/feeds/luci/applications/luci-app-multiwan/po/ja/multiwan.po +new file mode 100644 +index 0000000..ab41562 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-multiwan/po/ja/multiwan.po +@@ -0,0 +1,120 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"PO-Revision-Date: 2013-10-06 17:17+0200\n" ++"Last-Translator: Kentaro \n" ++"Language-Team: none\n" ++"Language: ja\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=1; plural=0;\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "Attempts Before WAN Failover" ++msgstr "" ++ ++msgid "Attempts Before WAN Recovery" ++msgstr "" ++ ++msgid "Auto" ++msgstr "自動" ++ ++msgid "Collecting data..." ++msgstr "" ++ ++msgid "" ++"Configure rules for directing outbound traffic through specified WAN Uplinks." ++msgstr "" ++ ++msgid "DNS Server(s)" ++msgstr "DNSサーãƒãƒ¼" ++ ++msgid "Default Route" ++msgstr "デフォルトルート" ++ ++msgid "Destination Address" ++msgstr "宛先アドレス" ++ ++msgid "Disable" ++msgstr "無効" ++ ++msgid "Enable" ++msgstr "有効" ++ ++msgid "Failing" ++msgstr "" ++ ++msgid "Failover Traffic Destination" ++msgstr "" ++ ++msgid "Health Monitor ICMP Host(s)" ++msgstr "ヘルスモニタ ICMP宛先" ++ ++msgid "Health Monitor ICMP Timeout" ++msgstr "ヘルスモニタ ICMP タイムアウト" ++ ++msgid "Health Monitor Interval" ++msgstr "ヘルスモニタ更新間隔" ++ ++msgid "" ++"Health Monitor detects and corrects network changes and failed connections." ++msgstr "ヘルスモニタã¯ã€ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ã®å¤‰æ›´åŠã³æŽ¥ç¶šå¤±æ•—ã®æ¤œå‡ºã¨èª¿æ•´ã‚’è¡Œã„ã¾ã™ã€‚" ++ ++msgid "KO" ++msgstr "" ++ ++msgid "Load Balancer Distribution" ++msgstr "ロードãƒãƒ©ãƒ³ã‚µ ディストリビューション" ++ ++msgid "Load Balancer(Compatibility)" ++msgstr "ロードãƒãƒ©ãƒ³ã‚µ (互æ›æ€§)" ++ ++msgid "Load Balancer(Performance)" ++msgstr "ロードãƒãƒ©ãƒ³ã‚µ (パフォーマンス)" ++ ++msgid "Multi-WAN" ++msgstr "Multi-WAN" ++ ++msgid "Multi-WAN Status" ++msgstr "" ++ ++msgid "Multi-WAN Traffic Rules" ++msgstr "Multi-WAN トラフィック・ルール" ++ ++msgid "" ++"Multi-WAN allows for the use of multiple uplinks for load balancing and " ++"failover." ++msgstr "" ++"Multi-WANを用ã„ã‚‹ã“ã¨ã§ã€è¤‡æ•°ã®ä¸Šã‚Šãƒªãƒ³ã‚¯ã‚’使用ã—ã¦ãƒ­ãƒ¼ãƒ‰ãƒãƒ©ãƒ³ã‚µã¨ãƒ•ã‚§ã‚¤ãƒ«" ++"オーãƒãƒ¼æ©Ÿèƒ½ã‚’使用ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚" ++ ++msgid "None" ++msgstr "ãªã—" ++ ++msgid "OK" ++msgstr "OK" ++ ++msgid "Ports" ++msgstr "ãƒãƒ¼ãƒˆ" ++ ++msgid "Protocol" ++msgstr "プロトコル" ++ ++msgid "Recovering" ++msgstr "" ++ ++msgid "Source Address" ++msgstr "é€ä¿¡å…ƒã‚¢ãƒ‰ãƒ¬ã‚¹" ++ ++msgid "Unknown" ++msgstr "ä¸æ˜Ž" ++ ++msgid "WAN Interfaces" ++msgstr "WAN インターフェースリスト" ++ ++msgid "WAN Uplink" ++msgstr "WAN アップリンク" ++ ++msgid "all" ++msgstr "å…¨ã¦" +diff --git a/feeds/luci/applications/luci-app-multiwan/po/ms/multiwan.po b/feeds/luci/applications/luci-app-multiwan/po/ms/multiwan.po +new file mode 100644 +index 0000000..d175246 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-multiwan/po/ms/multiwan.po +@@ -0,0 +1,114 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Last-Translator: Automatically generated\n" ++"Language-Team: none\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++ ++msgid "Attempts Before WAN Failover" ++msgstr "" ++ ++msgid "Attempts Before WAN Recovery" ++msgstr "" ++ ++msgid "Auto" ++msgstr "" ++ ++msgid "Collecting data..." ++msgstr "" ++ ++msgid "" ++"Configure rules for directing outbound traffic through specified WAN Uplinks." ++msgstr "" ++ ++msgid "DNS Server(s)" ++msgstr "" ++ ++msgid "Default Route" ++msgstr "" ++ ++msgid "Destination Address" ++msgstr "" ++ ++msgid "Disable" ++msgstr "" ++ ++msgid "Enable" ++msgstr "" ++ ++msgid "Failing" ++msgstr "" ++ ++msgid "Failover Traffic Destination" ++msgstr "" ++ ++msgid "Health Monitor ICMP Host(s)" ++msgstr "" ++ ++msgid "Health Monitor ICMP Timeout" ++msgstr "" ++ ++msgid "Health Monitor Interval" ++msgstr "" ++ ++msgid "" ++"Health Monitor detects and corrects network changes and failed connections." ++msgstr "" ++ ++msgid "KO" ++msgstr "" ++ ++msgid "Load Balancer Distribution" ++msgstr "" ++ ++msgid "Load Balancer(Compatibility)" ++msgstr "" ++ ++msgid "Load Balancer(Performance)" ++msgstr "" ++ ++msgid "Multi-WAN" ++msgstr "" ++ ++msgid "Multi-WAN Status" ++msgstr "" ++ ++msgid "Multi-WAN Traffic Rules" ++msgstr "" ++ ++msgid "" ++"Multi-WAN allows for the use of multiple uplinks for load balancing and " ++"failover." ++msgstr "" ++ ++msgid "None" ++msgstr "" ++ ++msgid "OK" ++msgstr "" ++ ++msgid "Ports" ++msgstr "" ++ ++msgid "Protocol" ++msgstr "" ++ ++msgid "Recovering" ++msgstr "" ++ ++msgid "Source Address" ++msgstr "" ++ ++msgid "Unknown" ++msgstr "" ++ ++msgid "WAN Interfaces" ++msgstr "" ++ ++msgid "WAN Uplink" ++msgstr "" ++ ++msgid "all" ++msgstr "" +diff --git a/feeds/luci/applications/luci-app-multiwan/po/no/multiwan.po b/feeds/luci/applications/luci-app-multiwan/po/no/multiwan.po +new file mode 100644 +index 0000000..a6e8bc4 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-multiwan/po/no/multiwan.po +@@ -0,0 +1,117 @@ ++msgid "" ++msgstr "" ++"Last-Translator: Lars Hardy \n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++ ++msgid "Attempts Before WAN Failover" ++msgstr "Antall forsøk før WAN feilsikkerhet" ++ ++msgid "Attempts Before WAN Recovery" ++msgstr "Antall forsøk før WAN gjenoppretting" ++ ++msgid "Auto" ++msgstr "Auto" ++ ++msgid "Collecting data..." ++msgstr "" ++ ++msgid "" ++"Configure rules for directing outbound traffic through specified WAN Uplinks." ++msgstr "" ++"Konfigurer regler for Ã¥ styre utgÃ¥ende trafikk gjennom spesifiserte WAN " ++"koblinger." ++ ++msgid "DNS Server(s)" ++msgstr "DNS Server(e)" ++ ++msgid "Default Route" ++msgstr "Standard rute" ++ ++msgid "Destination Address" ++msgstr "Destinasjonsadresse" ++ ++msgid "Disable" ++msgstr "Deaktiver" ++ ++msgid "Enable" ++msgstr "Aktiver" ++ ++msgid "Failing" ++msgstr "" ++ ++msgid "Failover Traffic Destination" ++msgstr "Feilsikkerhet trafikk destinasjon" ++ ++msgid "Health Monitor ICMP Host(s)" ++msgstr "Health monitor ICMP vert(er)" ++ ++msgid "Health Monitor ICMP Timeout" ++msgstr "Health monitor ICMP tidsavbrudd" ++ ++msgid "Health Monitor Interval" ++msgstr "Health monitor intervall" ++ ++msgid "" ++"Health Monitor detects and corrects network changes and failed connections." ++msgstr "" ++"Health monitor oppdager og korrigerer nettverks endringer og mislykkede " ++"tilkoblinger." ++ ++msgid "KO" ++msgstr "" ++ ++msgid "Load Balancer Distribution" ++msgstr "Lastbalansering fordeling" ++ ++msgid "Load Balancer(Compatibility)" ++msgstr "Lastbalansering (kompatibilitet)" ++ ++msgid "Load Balancer(Performance)" ++msgstr "Lastbalansering (ytelse)" ++ ++msgid "Multi-WAN" ++msgstr "Multi-WAN" ++ ++msgid "Multi-WAN Status" ++msgstr "" ++ ++msgid "Multi-WAN Traffic Rules" ++msgstr "Multi-WAN trafikk regler" ++ ++msgid "" ++"Multi-WAN allows for the use of multiple uplinks for load balancing and " ++"failover." ++msgstr "" ++"Multi-WAN tillater bruk av flere internett oppkoblinger for lastbalansering " ++"og feilsikkerhet." ++ ++msgid "None" ++msgstr "Ingen" ++ ++msgid "OK" ++msgstr "" ++ ++msgid "Ports" ++msgstr "Porter" ++ ++msgid "Protocol" ++msgstr "Protokoll" ++ ++msgid "Recovering" ++msgstr "" ++ ++msgid "Source Address" ++msgstr "Kildeadresse" ++ ++msgid "Unknown" ++msgstr "" ++ ++msgid "WAN Interfaces" ++msgstr "WAN Grensesnitt" ++ ++msgid "WAN Uplink" ++msgstr "WAN Opplinje" ++ ++msgid "all" ++msgstr "alle" +diff --git a/feeds/luci/applications/luci-app-multiwan/po/pl/multiwan.po b/feeds/luci/applications/luci-app-multiwan/po/pl/multiwan.po +new file mode 100644 +index 0000000..5904aed +--- /dev/null ++++ b/feeds/luci/applications/luci-app-multiwan/po/pl/multiwan.po +@@ -0,0 +1,125 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"PO-Revision-Date: 2012-09-01 15:25+0200\n" ++"Last-Translator: Staszek \n" ++"Language-Team: none\n" ++"Language: pl\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 " ++"|| n%100>=20) ? 1 : 2);\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "Attempts Before WAN Failover" ++msgstr "Liczba prób przed procedurÄ… WAN Failover (poÅ‚Ä…czenie awaryjne WAN)" ++ ++msgid "Attempts Before WAN Recovery" ++msgstr "Liczba prób przed procedurÄ… WAN Recovery (przywrócenie WAN)" ++ ++msgid "Auto" ++msgstr "Automatycznie" ++ ++msgid "Collecting data..." ++msgstr "Zbieranie informacji..." ++ ++msgid "" ++"Configure rules for directing outbound traffic through specified WAN Uplinks." ++msgstr "" ++"Skonfiguruj zasady kierowania ruchu wychodzÄ…cego za poÅ›rednictwem " ++"okreÅ›lonych Å‚Ä…czy WAN." ++ ++msgid "DNS Server(s)" ++msgstr "Serwer(y) DNS" ++ ++msgid "Default Route" ++msgstr "Trasa domyÅ›lna" ++ ++msgid "Destination Address" ++msgstr "Adres docelowy" ++ ++msgid "Disable" ++msgstr "WyÅ‚Ä…cz" ++ ++msgid "Enable" ++msgstr "WÅ‚Ä…cz" ++ ++msgid "Failing" ++msgstr "Niepowodzenie" ++ ++msgid "Failover Traffic Destination" ++msgstr "Cel ruch dla poÅ‚Ä…czenia awaryjnego" ++ ++msgid "Health Monitor ICMP Host(s)" ++msgstr "Monitorowane hosty przy użyciu protokoÅ‚u ICMP (ping)" ++ ++msgid "Health Monitor ICMP Timeout" ++msgstr "" ++"Czas nieosiÄ…galnoÅ›ci monitorowanych hostów przy użyciu protokoÅ‚u ICMP (ping)" ++ ++msgid "Health Monitor Interval" ++msgstr "OdstÄ™p pomiÄ™dzy próbami monitoringu" ++ ++msgid "" ++"Health Monitor detects and corrects network changes and failed connections." ++msgstr "" ++"Monitor stanu wykrywa i koryguje zmiany sieci oraz nieudane poÅ‚Ä…czenia." ++ ++msgid "KO" ++msgstr "KO" ++ ++msgid "Load Balancer Distribution" ++msgstr "Dystrybucja równoważenia obciążenia" ++ ++msgid "Load Balancer(Compatibility)" ++msgstr "Równoważenie obciążenia (Zgodność)" ++ ++msgid "Load Balancer(Performance)" ++msgstr "Równoważenie obciążenia (Wydajność)" ++ ++msgid "Multi-WAN" ++msgstr "Multi-WAN" ++ ++msgid "Multi-WAN Status" ++msgstr "Status Multi-WAN" ++ ++msgid "Multi-WAN Traffic Rules" ++msgstr "ReguÅ‚y ruchu Multi-WAN" ++ ++msgid "" ++"Multi-WAN allows for the use of multiple uplinks for load balancing and " ++"failover." ++msgstr "" ++"Multi-WAN pozwala na używanie kilku Å‚Ä…cz w celu równoważenia obciążenia lub " ++"omijania awarii." ++ ++msgid "None" ++msgstr "Å»aden" ++ ++msgid "OK" ++msgstr "OK" ++ ++msgid "Ports" ++msgstr "Porty" ++ ++msgid "Protocol" ++msgstr "Protokół" ++ ++msgid "Recovering" ++msgstr "Odzyskiwanie" ++ ++msgid "Source Address" ++msgstr "Adres źródÅ‚owy" ++ ++msgid "Unknown" ++msgstr "Nieznany" ++ ++msgid "WAN Interfaces" ++msgstr "Interfejsy WAN" ++ ++msgid "WAN Uplink" ++msgstr "ÅÄ…cze WAN" ++ ++msgid "all" ++msgstr "wszystkie" +diff --git a/feeds/luci/applications/luci-app-multiwan/po/pt-br/multiwan.po b/feeds/luci/applications/luci-app-multiwan/po/pt-br/multiwan.po +new file mode 100644 +index 0000000..ba72b82 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-multiwan/po/pt-br/multiwan.po +@@ -0,0 +1,124 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"PO-Revision-Date: 2012-11-11 04:01+0200\n" ++"Last-Translator: Luiz Angelo \n" ++"Language-Team: none\n" ++"Language: pt_BR\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n > 1);\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "Attempts Before WAN Failover" ++msgstr "Tentativas Antes da Solução de Contorno da WAN" ++ ++msgid "Attempts Before WAN Recovery" ++msgstr "Tentativas Antes da Recuperação da WAN" ++ ++msgid "Auto" ++msgstr "Automático" ++ ++msgid "Collecting data..." ++msgstr "Coletando dados..." ++ ++msgid "" ++"Configure rules for directing outbound traffic through specified WAN Uplinks." ++msgstr "" ++"Configurar regras para direcionar a saída de tráfego através de uma conexão " ++"WAN específica." ++ ++msgid "DNS Server(s)" ++msgstr "Servidor(es) DNS" ++ ++msgid "Default Route" ++msgstr "Rota Padrão" ++ ++msgid "Destination Address" ++msgstr "Endereço de Destino" ++ ++msgid "Disable" ++msgstr "Desabilitar" ++ ++msgid "Enable" ++msgstr "Habilitar" ++ ++msgid "Failing" ++msgstr "Falha" ++ ++msgid "Failover Traffic Destination" ++msgstr "Destino do Tráfego para a Recuperação" ++ ++msgid "Health Monitor ICMP Host(s)" ++msgstr "Equipamento(s) para Monitoramento da Saúde por ICMP" ++ ++msgid "Health Monitor ICMP Timeout" ++msgstr "Limite de tempo do Monitoramento da Saúde por ICMP" ++ ++msgid "Health Monitor Interval" ++msgstr "Intervalo do Monitoramento da Saúde" ++ ++msgid "" ++"Health Monitor detects and corrects network changes and failed connections." ++msgstr "" ++"O Monitoramento da Saúde detecta e corrige as mudanças de rede e falhas nas " ++"conexões." ++ ++msgid "KO" ++msgstr "KO" ++ ++msgid "Load Balancer Distribution" ++msgstr "Distribuição do Balanceador de Carga" ++ ++msgid "Load Balancer(Compatibility)" ++msgstr "Balanceador de Carga(Compatibilidade)" ++ ++msgid "Load Balancer(Performance)" ++msgstr "Balanceador de Carga(Desempenho)" ++ ++msgid "Multi-WAN" ++msgstr "Multi-WAN" ++ ++msgid "Multi-WAN Status" ++msgstr "Status de Multi-WAN" ++ ++msgid "Multi-WAN Traffic Rules" ++msgstr "Regras de Tráfego Multi-WAN" ++ ++msgid "" ++"Multi-WAN allows for the use of multiple uplinks for load balancing and " ++"failover." ++msgstr "" ++"O Multi-WAN permite o use de múltiplas conexões ao enlace superior (ex: " ++"internet) para o balanceamento de carga e tolerância a falha." ++ ++msgid "None" ++msgstr "Nenhum" ++ ++msgid "OK" ++msgstr "OK" ++ ++msgid "Ports" ++msgstr "Portas" ++ ++msgid "Protocol" ++msgstr "Procotolo" ++ ++msgid "Recovering" ++msgstr "Recuperação" ++ ++msgid "Source Address" ++msgstr "Endereço de Origem" ++ ++msgid "Unknown" ++msgstr "Desconhecido" ++ ++msgid "WAN Interfaces" ++msgstr "Interfaces WAN" ++ ++msgid "WAN Uplink" ++msgstr "Conexão WAN" ++ ++msgid "all" ++msgstr "todos" +diff --git a/feeds/luci/applications/luci-app-multiwan/po/pt/multiwan.po b/feeds/luci/applications/luci-app-multiwan/po/pt/multiwan.po +new file mode 100644 +index 0000000..95eeba8 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-multiwan/po/pt/multiwan.po +@@ -0,0 +1,118 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"PO-Revision-Date: 2013-09-22 18:29+0200\n" ++"Last-Translator: Low \n" ++"Language-Team: none\n" ++"Language: pt\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n != 1);\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "Attempts Before WAN Failover" ++msgstr "" ++ ++msgid "Attempts Before WAN Recovery" ++msgstr "" ++ ++msgid "Auto" ++msgstr "Automático" ++ ++msgid "Collecting data..." ++msgstr "" ++ ++msgid "" ++"Configure rules for directing outbound traffic through specified WAN Uplinks." ++msgstr "" ++ ++msgid "DNS Server(s)" ++msgstr "Servidor(s) DNS" ++ ++msgid "Default Route" ++msgstr "" ++ ++msgid "Destination Address" ++msgstr "Endereço de Destino" ++ ++msgid "Disable" ++msgstr "Desativar" ++ ++msgid "Enable" ++msgstr "Activar" ++ ++msgid "Failing" ++msgstr "" ++ ++msgid "Failover Traffic Destination" ++msgstr "" ++ ++msgid "Health Monitor ICMP Host(s)" ++msgstr "" ++ ++msgid "Health Monitor ICMP Timeout" ++msgstr "" ++ ++msgid "Health Monitor Interval" ++msgstr "" ++ ++msgid "" ++"Health Monitor detects and corrects network changes and failed connections." ++msgstr "" ++ ++msgid "KO" ++msgstr "" ++ ++msgid "Load Balancer Distribution" ++msgstr "" ++ ++msgid "Load Balancer(Compatibility)" ++msgstr "" ++ ++msgid "Load Balancer(Performance)" ++msgstr "" ++ ++msgid "Multi-WAN" ++msgstr "" ++ ++msgid "Multi-WAN Status" ++msgstr "" ++ ++msgid "Multi-WAN Traffic Rules" ++msgstr "" ++ ++msgid "" ++"Multi-WAN allows for the use of multiple uplinks for load balancing and " ++"failover." ++msgstr "" ++ ++msgid "None" ++msgstr "Nenhum" ++ ++msgid "OK" ++msgstr "" ++ ++msgid "Ports" ++msgstr "Portas" ++ ++msgid "Protocol" ++msgstr "Procotolo" ++ ++msgid "Recovering" ++msgstr "" ++ ++msgid "Source Address" ++msgstr "Endereço de Origem" ++ ++msgid "Unknown" ++msgstr "Desconhecido" ++ ++msgid "WAN Interfaces" ++msgstr "" ++ ++msgid "WAN Uplink" ++msgstr "" ++ ++msgid "all" ++msgstr "todos" +diff --git a/feeds/luci/applications/luci-app-multiwan/po/ro/multiwan.po b/feeds/luci/applications/luci-app-multiwan/po/ro/multiwan.po +new file mode 100644 +index 0000000..cd51944 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-multiwan/po/ro/multiwan.po +@@ -0,0 +1,119 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"PO-Revision-Date: 2014-07-09 13:26+0200\n" ++"Last-Translator: xxvirusxx \n" ++"Language-Team: none\n" ++"Language: ro\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=3; plural=(n==1 ? 0 : (n==0 || (n%100 > 0 && n%100 < " ++"20)) ? 1 : 2);;\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "Attempts Before WAN Failover" ++msgstr "" ++ ++msgid "Attempts Before WAN Recovery" ++msgstr "" ++ ++msgid "Auto" ++msgstr "" ++ ++msgid "Collecting data..." ++msgstr "Colectare date..." ++ ++msgid "" ++"Configure rules for directing outbound traffic through specified WAN Uplinks." ++msgstr "" ++ ++msgid "DNS Server(s)" ++msgstr "Server(e) DNS" ++ ++msgid "Default Route" ++msgstr "Ruta default" ++ ++msgid "Destination Address" ++msgstr "Adresă destinaÅ£ie" ++ ++msgid "Disable" ++msgstr "Dezactivează" ++ ++msgid "Enable" ++msgstr "Activează" ++ ++msgid "Failing" ++msgstr "" ++ ++msgid "Failover Traffic Destination" ++msgstr "" ++ ++msgid "Health Monitor ICMP Host(s)" ++msgstr "" ++ ++msgid "Health Monitor ICMP Timeout" ++msgstr "" ++ ++msgid "Health Monitor Interval" ++msgstr "" ++ ++msgid "" ++"Health Monitor detects and corrects network changes and failed connections." ++msgstr "" ++ ++msgid "KO" ++msgstr "" ++ ++msgid "Load Balancer Distribution" ++msgstr "" ++ ++msgid "Load Balancer(Compatibility)" ++msgstr "" ++ ++msgid "Load Balancer(Performance)" ++msgstr "" ++ ++msgid "Multi-WAN" ++msgstr "" ++ ++msgid "Multi-WAN Status" ++msgstr "" ++ ++msgid "Multi-WAN Traffic Rules" ++msgstr "" ++ ++msgid "" ++"Multi-WAN allows for the use of multiple uplinks for load balancing and " ++"failover." ++msgstr "" ++ ++msgid "None" ++msgstr "" ++ ++msgid "OK" ++msgstr "OK" ++ ++msgid "Ports" ++msgstr "Porturi" ++ ++msgid "Protocol" ++msgstr "Protocol" ++ ++msgid "Recovering" ++msgstr "Recuperare" ++ ++msgid "Source Address" ++msgstr "Adresa sursei" ++ ++msgid "Unknown" ++msgstr "Necunoscut" ++ ++msgid "WAN Interfaces" ++msgstr "InterfeÅ£e WAN" ++ ++msgid "WAN Uplink" ++msgstr "" ++ ++msgid "all" ++msgstr "toate" +diff --git a/feeds/luci/applications/luci-app-multiwan/po/ru/multiwan.po b/feeds/luci/applications/luci-app-multiwan/po/ru/multiwan.po +new file mode 100644 +index 0000000..c12d920 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-multiwan/po/ru/multiwan.po +@@ -0,0 +1,127 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: LuCI: multiwan\n" ++"POT-Creation-Date: \n" ++"PO-Revision-Date: 2012-08-15 14:05+0300\n" ++"Last-Translator: Roman A. aka BasicXP \n" ++"Language-Team: Russian \n" ++"Language: ru\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%" ++"10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" ++"X-Generator: Pootle 2.0.4\n" ++"X-Poedit-SourceCharset: UTF-8\n" ++ ++msgid "Attempts Before WAN Failover" ++msgstr "КоличеÑтво попыток перед обработкой отказа WAN" ++ ++msgid "Attempts Before WAN Recovery" ++msgstr "КоличеÑтво попыток перед воÑÑтановлением WAN" ++ ++msgid "Auto" ++msgstr "ÐвтоматичеÑки" ++ ++msgid "Collecting data..." ++msgstr "Сбор данных..." ++ ++msgid "" ++"Configure rules for directing outbound traffic through specified WAN Uplinks." ++msgstr "" ++"Укажите правила Ð´Ð»Ñ Ð½Ð°Ð¿Ñ€Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ð¸ÑходÑщего трафика через заданные воÑходÑщие " ++"каналы WAN." ++ ++msgid "DNS Server(s)" ++msgstr "DNS-Ñервер(Ñ‹)" ++ ++msgid "Default Route" ++msgstr "Маршрут по умолчанию" ++ ++msgid "Destination Address" ++msgstr "ÐÐ´Ñ€ÐµÑ Ð½Ð°Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ" ++ ++msgid "Disable" ++msgstr "Отключить" ++ ++msgid "Enable" ++msgstr "Включить" ++ ++msgid "Failing" ++msgstr "Отказ" ++ ++msgid "Failover Traffic Destination" ++msgstr "Ðазначение трафика при обработке отказа" ++ ++msgid "Health Monitor ICMP Host(s)" ++msgstr "ICMP-хоÑÑ‚(Ñ‹) Ð´Ð»Ñ ÐºÐ¾Ð½Ñ‚Ñ€Ð¾Ð»Ñ ÑоÑтоÑниÑ" ++ ++msgid "Health Monitor ICMP Timeout" ++msgstr "Тайм-аут ÐºÐ¾Ð½Ñ‚Ñ€Ð¾Ð»Ñ ÑоÑтоÑÐ½Ð¸Ñ Ð¿Ð¾ ICMP" ++ ++msgid "Health Monitor Interval" ++msgstr "Интервал ÐºÐ¾Ð½Ñ‚Ñ€Ð¾Ð»Ñ ÑоÑтоÑниÑ" ++ ++msgid "" ++"Health Monitor detects and corrects network changes and failed connections." ++msgstr "" ++"Контроль ÑоÑтоÑÐ½Ð¸Ñ Ð¾Ð¿Ñ€ÐµÐ´ÐµÐ»Ñет и иÑправлÑет Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ñети и неиÑправные " ++"ÑоединениÑ." ++ ++msgid "KO" ++msgstr "Ðе работает" ++ ++msgid "Load Balancer Distribution" ++msgstr "РаÑпределение баланÑировки нагрузки" ++ ++msgid "Load Balancer(Compatibility)" ++msgstr "БаланÑировка нагрузки (ÑовмеÑтимоÑÑ‚ÑŒ)" ++ ++msgid "Load Balancer(Performance)" ++msgstr "БаланÑировка нагрузки (производительноÑÑ‚ÑŒ)" ++ ++msgid "Multi-WAN" ++msgstr "Мульти-WAN" ++ ++msgid "Multi-WAN Status" ++msgstr "СоÑтоÑние мульти-WAN" ++ ++msgid "Multi-WAN Traffic Rules" ++msgstr "Правила Ð´Ð»Ñ Ð¼ÑƒÐ»ÑŒÑ‚Ð¸-WAN трафика" ++ ++msgid "" ++"Multi-WAN allows for the use of multiple uplinks for load balancing and " ++"failover." ++msgstr "" ++"Мульти-WAN позволÑет иÑпользовать неÑколько портов воÑходÑщего канала Ð´Ð»Ñ " ++"баланÑировки нагрузки и отказоуÑтойчивоÑти." ++ ++msgid "None" ++msgstr "Ðи один из" ++ ++msgid "OK" ++msgstr "OK" ++ ++msgid "Ports" ++msgstr "Порты" ++ ++msgid "Protocol" ++msgstr "Протокол" ++ ++msgid "Recovering" ++msgstr "ВоÑÑтановление" ++ ++msgid "Source Address" ++msgstr "ÐÐ´Ñ€ÐµÑ Ð¾Ñ‚Ð¿Ñ€Ð°Ð²Ð¸Ñ‚ÐµÐ»Ñ" ++ ++msgid "Unknown" ++msgstr "ÐеизвеÑтно" ++ ++msgid "WAN Interfaces" ++msgstr "WAN-интерфейÑÑ‹" ++ ++msgid "WAN Uplink" ++msgstr "ВоÑходÑщий канал WAN" ++ ++msgid "all" ++msgstr "вÑе" +diff --git a/feeds/luci/applications/luci-app-multiwan/po/sk/multiwan.po b/feeds/luci/applications/luci-app-multiwan/po/sk/multiwan.po +new file mode 100644 +index 0000000..b113eac +--- /dev/null ++++ b/feeds/luci/applications/luci-app-multiwan/po/sk/multiwan.po +@@ -0,0 +1,115 @@ ++msgid "" ++msgstr "" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Last-Translator: Automatically generated\n" ++"Language-Team: none\n" ++"MIME-Version: 1.0\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n" ++ ++msgid "Attempts Before WAN Failover" ++msgstr "" ++ ++msgid "Attempts Before WAN Recovery" ++msgstr "" ++ ++msgid "Auto" ++msgstr "" ++ ++msgid "Collecting data..." ++msgstr "" ++ ++msgid "" ++"Configure rules for directing outbound traffic through specified WAN Uplinks." ++msgstr "" ++ ++msgid "DNS Server(s)" ++msgstr "" ++ ++msgid "Default Route" ++msgstr "" ++ ++msgid "Destination Address" ++msgstr "" ++ ++msgid "Disable" ++msgstr "" ++ ++msgid "Enable" ++msgstr "" ++ ++msgid "Failing" ++msgstr "" ++ ++msgid "Failover Traffic Destination" ++msgstr "" ++ ++msgid "Health Monitor ICMP Host(s)" ++msgstr "" ++ ++msgid "Health Monitor ICMP Timeout" ++msgstr "" ++ ++msgid "Health Monitor Interval" ++msgstr "" ++ ++msgid "" ++"Health Monitor detects and corrects network changes and failed connections." ++msgstr "" ++ ++msgid "KO" ++msgstr "" ++ ++msgid "Load Balancer Distribution" ++msgstr "" ++ ++msgid "Load Balancer(Compatibility)" ++msgstr "" ++ ++msgid "Load Balancer(Performance)" ++msgstr "" ++ ++msgid "Multi-WAN" ++msgstr "" ++ ++msgid "Multi-WAN Status" ++msgstr "" ++ ++msgid "Multi-WAN Traffic Rules" ++msgstr "" ++ ++msgid "" ++"Multi-WAN allows for the use of multiple uplinks for load balancing and " ++"failover." ++msgstr "" ++ ++msgid "None" ++msgstr "" ++ ++msgid "OK" ++msgstr "" ++ ++msgid "Ports" ++msgstr "" ++ ++msgid "Protocol" ++msgstr "" ++ ++msgid "Recovering" ++msgstr "" ++ ++msgid "Source Address" ++msgstr "" ++ ++msgid "Unknown" ++msgstr "" ++ ++msgid "WAN Interfaces" ++msgstr "" ++ ++msgid "WAN Uplink" ++msgstr "" ++ ++msgid "all" ++msgstr "" +diff --git a/feeds/luci/applications/luci-app-multiwan/po/sv/multiwan.po b/feeds/luci/applications/luci-app-multiwan/po/sv/multiwan.po +new file mode 100644 +index 0000000..fae4c58 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-multiwan/po/sv/multiwan.po +@@ -0,0 +1,116 @@ ++msgid "" ++msgstr "" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Last-Translator: Automatically generated\n" ++"Language-Team: none\n" ++"Language: sv\n" ++"MIME-Version: 1.0\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n != 1);\n" ++ ++msgid "Attempts Before WAN Failover" ++msgstr "" ++ ++msgid "Attempts Before WAN Recovery" ++msgstr "" ++ ++msgid "Auto" ++msgstr "" ++ ++msgid "Collecting data..." ++msgstr "" ++ ++msgid "" ++"Configure rules for directing outbound traffic through specified WAN Uplinks." ++msgstr "" ++ ++msgid "DNS Server(s)" ++msgstr "" ++ ++msgid "Default Route" ++msgstr "" ++ ++msgid "Destination Address" ++msgstr "" ++ ++msgid "Disable" ++msgstr "" ++ ++msgid "Enable" ++msgstr "" ++ ++msgid "Failing" ++msgstr "" ++ ++msgid "Failover Traffic Destination" ++msgstr "" ++ ++msgid "Health Monitor ICMP Host(s)" ++msgstr "" ++ ++msgid "Health Monitor ICMP Timeout" ++msgstr "" ++ ++msgid "Health Monitor Interval" ++msgstr "" ++ ++msgid "" ++"Health Monitor detects and corrects network changes and failed connections." ++msgstr "" ++ ++msgid "KO" ++msgstr "" ++ ++msgid "Load Balancer Distribution" ++msgstr "" ++ ++msgid "Load Balancer(Compatibility)" ++msgstr "" ++ ++msgid "Load Balancer(Performance)" ++msgstr "" ++ ++msgid "Multi-WAN" ++msgstr "" ++ ++msgid "Multi-WAN Status" ++msgstr "" ++ ++msgid "Multi-WAN Traffic Rules" ++msgstr "" ++ ++msgid "" ++"Multi-WAN allows for the use of multiple uplinks for load balancing and " ++"failover." ++msgstr "" ++ ++msgid "None" ++msgstr "" ++ ++msgid "OK" ++msgstr "" ++ ++msgid "Ports" ++msgstr "" ++ ++msgid "Protocol" ++msgstr "" ++ ++msgid "Recovering" ++msgstr "" ++ ++msgid "Source Address" ++msgstr "" ++ ++msgid "Unknown" ++msgstr "" ++ ++msgid "WAN Interfaces" ++msgstr "" ++ ++msgid "WAN Uplink" ++msgstr "" ++ ++msgid "all" ++msgstr "" +diff --git a/feeds/luci/applications/luci-app-multiwan/po/templates/multiwan.pot b/feeds/luci/applications/luci-app-multiwan/po/templates/multiwan.pot +new file mode 100644 +index 0000000..954eed1 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-multiwan/po/templates/multiwan.pot +@@ -0,0 +1,108 @@ ++msgid "" ++msgstr "Content-Type: text/plain; charset=UTF-8" ++ ++msgid "Attempts Before WAN Failover" ++msgstr "" ++ ++msgid "Attempts Before WAN Recovery" ++msgstr "" ++ ++msgid "Auto" ++msgstr "" ++ ++msgid "Collecting data..." ++msgstr "" ++ ++msgid "" ++"Configure rules for directing outbound traffic through specified WAN Uplinks." ++msgstr "" ++ ++msgid "DNS Server(s)" ++msgstr "" ++ ++msgid "Default Route" ++msgstr "" ++ ++msgid "Destination Address" ++msgstr "" ++ ++msgid "Disable" ++msgstr "" ++ ++msgid "Enable" ++msgstr "" ++ ++msgid "Failing" ++msgstr "" ++ ++msgid "Failover Traffic Destination" ++msgstr "" ++ ++msgid "Health Monitor ICMP Host(s)" ++msgstr "" ++ ++msgid "Health Monitor ICMP Timeout" ++msgstr "" ++ ++msgid "Health Monitor Interval" ++msgstr "" ++ ++msgid "" ++"Health Monitor detects and corrects network changes and failed connections." ++msgstr "" ++ ++msgid "KO" ++msgstr "" ++ ++msgid "Load Balancer Distribution" ++msgstr "" ++ ++msgid "Load Balancer(Compatibility)" ++msgstr "" ++ ++msgid "Load Balancer(Performance)" ++msgstr "" ++ ++msgid "Multi-WAN" ++msgstr "" ++ ++msgid "Multi-WAN Status" ++msgstr "" ++ ++msgid "Multi-WAN Traffic Rules" ++msgstr "" ++ ++msgid "" ++"Multi-WAN allows for the use of multiple uplinks for load balancing and " ++"failover." ++msgstr "" ++ ++msgid "None" ++msgstr "" ++ ++msgid "OK" ++msgstr "" ++ ++msgid "Ports" ++msgstr "" ++ ++msgid "Protocol" ++msgstr "" ++ ++msgid "Recovering" ++msgstr "" ++ ++msgid "Source Address" ++msgstr "" ++ ++msgid "Unknown" ++msgstr "" ++ ++msgid "WAN Interfaces" ++msgstr "" ++ ++msgid "WAN Uplink" ++msgstr "" ++ ++msgid "all" ++msgstr "" +diff --git a/feeds/luci/applications/luci-app-multiwan/po/tr/multiwan.po b/feeds/luci/applications/luci-app-multiwan/po/tr/multiwan.po +new file mode 100644 +index 0000000..e9d6ece +--- /dev/null ++++ b/feeds/luci/applications/luci-app-multiwan/po/tr/multiwan.po +@@ -0,0 +1,115 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Last-Translator: Automatically generated\n" ++"Language-Team: none\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=1; plural=0;\n" ++ ++msgid "Attempts Before WAN Failover" ++msgstr "" ++ ++msgid "Attempts Before WAN Recovery" ++msgstr "" ++ ++msgid "Auto" ++msgstr "" ++ ++msgid "Collecting data..." ++msgstr "" ++ ++msgid "" ++"Configure rules for directing outbound traffic through specified WAN Uplinks." ++msgstr "" ++ ++msgid "DNS Server(s)" ++msgstr "" ++ ++msgid "Default Route" ++msgstr "" ++ ++msgid "Destination Address" ++msgstr "" ++ ++msgid "Disable" ++msgstr "" ++ ++msgid "Enable" ++msgstr "" ++ ++msgid "Failing" ++msgstr "" ++ ++msgid "Failover Traffic Destination" ++msgstr "" ++ ++msgid "Health Monitor ICMP Host(s)" ++msgstr "" ++ ++msgid "Health Monitor ICMP Timeout" ++msgstr "" ++ ++msgid "Health Monitor Interval" ++msgstr "" ++ ++msgid "" ++"Health Monitor detects and corrects network changes and failed connections." ++msgstr "" ++ ++msgid "KO" ++msgstr "" ++ ++msgid "Load Balancer Distribution" ++msgstr "" ++ ++msgid "Load Balancer(Compatibility)" ++msgstr "" ++ ++msgid "Load Balancer(Performance)" ++msgstr "" ++ ++msgid "Multi-WAN" ++msgstr "" ++ ++msgid "Multi-WAN Status" ++msgstr "" ++ ++msgid "Multi-WAN Traffic Rules" ++msgstr "" ++ ++msgid "" ++"Multi-WAN allows for the use of multiple uplinks for load balancing and " ++"failover." ++msgstr "" ++ ++msgid "None" ++msgstr "" ++ ++msgid "OK" ++msgstr "" ++ ++msgid "Ports" ++msgstr "" ++ ++msgid "Protocol" ++msgstr "" ++ ++msgid "Recovering" ++msgstr "" ++ ++msgid "Source Address" ++msgstr "" ++ ++msgid "Unknown" ++msgstr "" ++ ++msgid "WAN Interfaces" ++msgstr "" ++ ++msgid "WAN Uplink" ++msgstr "" ++ ++msgid "all" ++msgstr "" +diff --git a/feeds/luci/applications/luci-app-multiwan/po/uk/multiwan.po b/feeds/luci/applications/luci-app-multiwan/po/uk/multiwan.po +new file mode 100644 +index 0000000..922b402 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-multiwan/po/uk/multiwan.po +@@ -0,0 +1,119 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"PO-Revision-Date: 2013-09-21 15:52+0200\n" ++"Last-Translator: zubr_139 \n" ++"Language-Team: none\n" ++"Language: uk\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%" ++"10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "Attempts Before WAN Failover" ++msgstr "" ++ ++msgid "Attempts Before WAN Recovery" ++msgstr "" ++ ++msgid "Auto" ++msgstr "Ðвтоматично" ++ ++msgid "Collecting data..." ++msgstr "Збір даних..." ++ ++msgid "" ++"Configure rules for directing outbound traffic through specified WAN Uplinks." ++msgstr "" ++ ++msgid "DNS Server(s)" ++msgstr "DNS-Ñервер(и)" ++ ++msgid "Default Route" ++msgstr "Типовий маршрут" ++ ++msgid "Destination Address" ++msgstr "ÐдреÑа призначеннÑ" ++ ++msgid "Disable" ++msgstr "Вимкнути" ++ ++msgid "Enable" ++msgstr "Ðктивувати" ++ ++msgid "Failing" ++msgstr "" ++ ++msgid "Failover Traffic Destination" ++msgstr "" ++ ++msgid "Health Monitor ICMP Host(s)" ++msgstr "" ++ ++msgid "Health Monitor ICMP Timeout" ++msgstr "" ++ ++msgid "Health Monitor Interval" ++msgstr "" ++ ++msgid "" ++"Health Monitor detects and corrects network changes and failed connections." ++msgstr "" ++ ++msgid "KO" ++msgstr "" ++ ++msgid "Load Balancer Distribution" ++msgstr "" ++ ++msgid "Load Balancer(Compatibility)" ++msgstr "" ++ ++msgid "Load Balancer(Performance)" ++msgstr "" ++ ++msgid "Multi-WAN" ++msgstr "" ++ ++msgid "Multi-WAN Status" ++msgstr "" ++ ++msgid "Multi-WAN Traffic Rules" ++msgstr "" ++ ++msgid "" ++"Multi-WAN allows for the use of multiple uplinks for load balancing and " ++"failover." ++msgstr "" ++ ++msgid "None" ++msgstr "" ++ ++msgid "OK" ++msgstr "" ++ ++msgid "Ports" ++msgstr "" ++ ++msgid "Protocol" ++msgstr "" ++ ++msgid "Recovering" ++msgstr "" ++ ++msgid "Source Address" ++msgstr "" ++ ++msgid "Unknown" ++msgstr "" ++ ++msgid "WAN Interfaces" ++msgstr "" ++ ++msgid "WAN Uplink" ++msgstr "" ++ ++msgid "all" ++msgstr "" +diff --git a/feeds/luci/applications/luci-app-multiwan/po/vi/multiwan.po b/feeds/luci/applications/luci-app-multiwan/po/vi/multiwan.po +new file mode 100644 +index 0000000..e9d6ece +--- /dev/null ++++ b/feeds/luci/applications/luci-app-multiwan/po/vi/multiwan.po +@@ -0,0 +1,115 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Last-Translator: Automatically generated\n" ++"Language-Team: none\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=1; plural=0;\n" ++ ++msgid "Attempts Before WAN Failover" ++msgstr "" ++ ++msgid "Attempts Before WAN Recovery" ++msgstr "" ++ ++msgid "Auto" ++msgstr "" ++ ++msgid "Collecting data..." ++msgstr "" ++ ++msgid "" ++"Configure rules for directing outbound traffic through specified WAN Uplinks." ++msgstr "" ++ ++msgid "DNS Server(s)" ++msgstr "" ++ ++msgid "Default Route" ++msgstr "" ++ ++msgid "Destination Address" ++msgstr "" ++ ++msgid "Disable" ++msgstr "" ++ ++msgid "Enable" ++msgstr "" ++ ++msgid "Failing" ++msgstr "" ++ ++msgid "Failover Traffic Destination" ++msgstr "" ++ ++msgid "Health Monitor ICMP Host(s)" ++msgstr "" ++ ++msgid "Health Monitor ICMP Timeout" ++msgstr "" ++ ++msgid "Health Monitor Interval" ++msgstr "" ++ ++msgid "" ++"Health Monitor detects and corrects network changes and failed connections." ++msgstr "" ++ ++msgid "KO" ++msgstr "" ++ ++msgid "Load Balancer Distribution" ++msgstr "" ++ ++msgid "Load Balancer(Compatibility)" ++msgstr "" ++ ++msgid "Load Balancer(Performance)" ++msgstr "" ++ ++msgid "Multi-WAN" ++msgstr "" ++ ++msgid "Multi-WAN Status" ++msgstr "" ++ ++msgid "Multi-WAN Traffic Rules" ++msgstr "" ++ ++msgid "" ++"Multi-WAN allows for the use of multiple uplinks for load balancing and " ++"failover." ++msgstr "" ++ ++msgid "None" ++msgstr "" ++ ++msgid "OK" ++msgstr "" ++ ++msgid "Ports" ++msgstr "" ++ ++msgid "Protocol" ++msgstr "" ++ ++msgid "Recovering" ++msgstr "" ++ ++msgid "Source Address" ++msgstr "" ++ ++msgid "Unknown" ++msgstr "" ++ ++msgid "WAN Interfaces" ++msgstr "" ++ ++msgid "WAN Uplink" ++msgstr "" ++ ++msgid "all" ++msgstr "" +diff --git a/feeds/luci/applications/luci-app-multiwan/po/zh-cn/multiwan.po b/feeds/luci/applications/luci-app-multiwan/po/zh-cn/multiwan.po +new file mode 100644 +index 0000000..dfb4958 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-multiwan/po/zh-cn/multiwan.po +@@ -0,0 +1,118 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"PO-Revision-Date: 2013-10-08 16:16+0200\n" ++"Last-Translator: Tanyingyu \n" ++"Language-Team: none\n" ++"Language: zh_CN\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=1; plural=0;\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "Attempts Before WAN Failover" ++msgstr "WAN故障转移之å‰å°è¯•" ++ ++msgid "Attempts Before WAN Recovery" ++msgstr "WANæ•…éšœæ¢å¤ä¹‹å‰å°è¯•" ++ ++msgid "Auto" ++msgstr "自动" ++ ++msgid "Collecting data..." ++msgstr "正在收集数æ®â€¦" ++ ++msgid "" ++"Configure rules for directing outbound traffic through specified WAN Uplinks." ++msgstr "é…置规则引导出站æµé‡é€šè¿‡æŒ‡å®šçš„WAN上行链路。" ++ ++msgid "DNS Server(s)" ++msgstr "DNSæœåŠ¡å™¨" ++ ++msgid "Default Route" ++msgstr "缺çœè·¯ç”±" ++ ++msgid "Destination Address" ++msgstr "目的地å€" ++ ++msgid "Disable" ++msgstr "ç¦ç”¨" ++ ++msgid "Enable" ++msgstr "å¯ç”¨" ++ ++msgid "Failing" ++msgstr "失败" ++ ++msgid "Failover Traffic Destination" ++msgstr "故障转移目的地" ++ ++msgid "Health Monitor ICMP Host(s)" ++msgstr "å¥åº·çŠ¶å†µç›‘测ICMP主机" ++ ++msgid "Health Monitor ICMP Timeout" ++msgstr "å¥åº·çŠ¶å†µç›‘测ICMP主机超时" ++ ++msgid "Health Monitor Interval" ++msgstr "å¥åº·çŠ¶å†µç›‘测间隔" ++ ++msgid "" ++"Health Monitor detects and corrects network changes and failed connections." ++msgstr "å¥åº·ç›‘视器,检测和修正网络å˜æ›´å’Œå¤±è´¥çš„连接。" ++ ++msgid "KO" ++msgstr "好" ++ ++msgid "Load Balancer Distribution" ++msgstr "è´Ÿè½½å‡è¡¡åˆ†å¸ƒ" ++ ++msgid "Load Balancer(Compatibility)" ++msgstr "负载平衡器(兼容)" ++ ++msgid "Load Balancer(Performance)" ++msgstr "负载平衡器(性能)" ++ ++msgid "Multi-WAN" ++msgstr "多WAN" ++ ++msgid "Multi-WAN Status" ++msgstr "多WAN状æ€" ++ ++msgid "Multi-WAN Traffic Rules" ++msgstr "多WANæµé‡è§„则" ++ ++msgid "" ++"Multi-WAN allows for the use of multiple uplinks for load balancing and " ++"failover." ++msgstr "多WANå…许使用多æ¡ä¸Šè¡Œé“¾è·¯çš„è´Ÿè½½å‡è¡¡å’Œæ•…障转移。" ++ ++msgid "None" ++msgstr "空" ++ ++msgid "OK" ++msgstr "OK" ++ ++msgid "Ports" ++msgstr "端å£" ++ ++msgid "Protocol" ++msgstr "åè®®" ++ ++msgid "Recovering" ++msgstr "æ¢å¤" ++ ++msgid "Source Address" ++msgstr "æºåœ°å€" ++ ++msgid "Unknown" ++msgstr "未知" ++ ++msgid "WAN Interfaces" ++msgstr "WAN接å£" ++ ++msgid "WAN Uplink" ++msgstr "WAN上è”" ++ ++msgid "all" ++msgstr "所有" +diff --git a/feeds/luci/applications/luci-app-multiwan/po/zh-tw/multiwan.po b/feeds/luci/applications/luci-app-multiwan/po/zh-tw/multiwan.po +new file mode 100644 +index 0000000..9bfbb8f +--- /dev/null ++++ b/feeds/luci/applications/luci-app-multiwan/po/zh-tw/multiwan.po +@@ -0,0 +1,118 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"PO-Revision-Date: 2014-05-14 18:42+0200\n" ++"Last-Translator: omnistack \n" ++"Language-Team: none\n" ++"Language: zh_TW\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=1; plural=0;\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "Attempts Before WAN Failover" ++msgstr "寬頻失敗å‰å˜—試" ++ ++msgid "Attempts Before WAN Recovery" ++msgstr "寬頻復原å‰å˜—試" ++ ++msgid "Auto" ++msgstr "自動" ++ ++msgid "Collecting data..." ++msgstr "收集資料中" ++ ++msgid "" ++"Configure rules for directing outbound traffic through specified WAN Uplinks." ++msgstr "é€éŽæŒ‡å®šçš„寬頻上傳é‡å°Žè¼¸å‡ºæµé‡çš„è¦å‰‡è¨­å®š" ++ ++msgid "DNS Server(s)" ++msgstr "DNS伺æœå™¨" ++ ++msgid "Default Route" ++msgstr "é è¨­è·¯ç”±å™¨" ++ ++msgid "Destination Address" ++msgstr "目標ä½å€" ++ ++msgid "Disable" ++msgstr "關閉" ++ ++msgid "Enable" ++msgstr "啟用" ++ ++msgid "Failing" ++msgstr "失敗" ++ ++msgid "Failover Traffic Destination" ++msgstr "故障備æ´æµé‡ç›®çš„地" ++ ++msgid "Health Monitor ICMP Host(s)" ++msgstr "å¥è¨ºICMP的主機群" ++ ++msgid "Health Monitor ICMP Timeout" ++msgstr "å¥è¨ºICMP超時" ++ ++msgid "Health Monitor Interval" ++msgstr "å¥è¨ºé–“éš”" ++ ++msgid "" ++"Health Monitor detects and corrects network changes and failed connections." ++msgstr "å¥è¨ºåµæ¸¬ä¸¦æ ¡æ­£ç¶²è·¯æ”¹è®ŠåŠå¤±æ•—的連線" ++ ++msgid "KO" ++msgstr "KO" ++ ++msgid "Load Balancer Distribution" ++msgstr "分散å¼è² è¼‰å¹³è¡¡" ++ ++msgid "Load Balancer(Compatibility)" ++msgstr "(å–相容性)負載平衡" ++ ++msgid "Load Balancer(Performance)" ++msgstr "(å–最大效能)負載平衡" ++ ++msgid "Multi-WAN" ++msgstr "多元寬頻" ++ ++msgid "Multi-WAN Status" ++msgstr "多元寬頻狀態" ++ ++msgid "Multi-WAN Traffic Rules" ++msgstr "多元寬頻æµé‡è¦å‰‡" ++ ++msgid "" ++"Multi-WAN allows for the use of multiple uplinks for load balancing and " ++"failover." ++msgstr "å…許多元寬頻使用多é‡ä¸Šå‚³å¹³è¡¡è² è¼‰å’Œå‚™æ´" ++ ++msgid "None" ++msgstr "ç„¡" ++ ++msgid "OK" ++msgstr "OK" ++ ++msgid "Ports" ++msgstr "埠號" ++ ++msgid "Protocol" ++msgstr "å”定" ++ ++msgid "Recovering" ++msgstr "復原中" ++ ++msgid "Source Address" ++msgstr "來æºä½å€" ++ ++msgid "Unknown" ++msgstr "未知" ++ ++msgid "WAN Interfaces" ++msgstr "寬頻介é¢" ++ ++msgid "WAN Uplink" ++msgstr "寬頻上傳" ++ ++msgid "all" ++msgstr "全部" +diff --git a/feeds/luci/applications/luci-app-ntpc/Makefile b/feeds/luci/applications/luci-app-ntpc/Makefile +new file mode 100644 +index 0000000..b30f967 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-ntpc/Makefile +@@ -0,0 +1,14 @@ ++# ++# Copyright (C) 2008-2014 The LuCI Team ++# ++# This is free software, licensed under the Apache License, Version 2.0 . ++# ++ ++include $(TOPDIR)/rules.mk ++ ++LUCI_TITLE:=NTP time synchronisation configuration module ++LUCI_DEPENDS:=+ntpclient ++ ++include ../../luci.mk ++ ++# call BuildPackage - OpenWrt buildroot signature +diff --git a/feeds/luci/applications/luci-app-ntpc/luasrc/controller/ntpc.lua b/feeds/luci/applications/luci-app-ntpc/luasrc/controller/ntpc.lua +new file mode 100644 +index 0000000..c21d4ea +--- /dev/null ++++ b/feeds/luci/applications/luci-app-ntpc/luasrc/controller/ntpc.lua +@@ -0,0 +1,19 @@ ++-- Copyright 2008 Steven Barth ++-- Copyright 2008 Jo-Philipp Wich ++-- Licensed to the public under the Apache License 2.0. ++ ++module("luci.controller.ntpc", package.seeall) ++ ++function index() ++ if not nixio.fs.access("/etc/config/ntpclient") then ++ return ++ end ++ ++ local page ++ ++ page = entry({"admin", "system", "ntpc"}, cbi("ntpc/ntpc"), _("Time Synchronisation"), 50) ++ page.dependent = true ++ ++ page = entry({"mini", "system", "ntpc"}, cbi("ntpc/ntpcmini", {autoapply=true}), _("Time Synchronisation"), 50) ++ page.dependent = true ++end +diff --git a/feeds/luci/applications/luci-app-ntpc/luasrc/model/cbi/ntpc/ntpc.lua b/feeds/luci/applications/luci-app-ntpc/luasrc/model/cbi/ntpc/ntpc.lua +new file mode 100644 +index 0000000..21ea88e +--- /dev/null ++++ b/feeds/luci/applications/luci-app-ntpc/luasrc/model/cbi/ntpc/ntpc.lua +@@ -0,0 +1,39 @@ ++-- Copyright 2008 Steven Barth ++-- Copyright 2008 Jo-Philipp Wich ++-- Licensed to the public under the Apache License 2.0. ++ ++m = Map("ntpclient", translate("Time Synchronisation"), translate("Synchronizes the system time")) ++ ++s = m:section(TypedSection, "ntpclient", translate("General")) ++s.anonymous = true ++s.addremove = false ++ ++s:option(DummyValue, "_time", translate("Current system time")).value = os.date("%c") ++ ++interval = s:option(Value, "interval", translate("Update interval (in seconds)")) ++interval.datatype = "and(uinteger,min(1))" ++interval.rmempty = true ++ ++count = s:option(Value, "count", translate("Count of time measurements"), translate("empty = infinite")) ++count.datatype = "and(uinteger,min(1))" ++count.rmempty = true ++ ++s2 = m:section(TypedSection, "ntpdrift", translate("Clock Adjustment")) ++s2.anonymous = true ++s2.addremove = false ++ ++freq = s2:option(Value, "freq", translate("Offset frequency")) ++freq.datatype = "integer" ++freq.rmempty = true ++ ++s3 = m:section(TypedSection, "ntpserver", translate("Time Servers")) ++s3.anonymous = true ++s3.addremove = true ++s3.template = "cbi/tblsection" ++ ++s3:option(Value, "hostname", translate("Hostname")) ++port = s3:option(Value, "port", translate("Port")) ++port.datatype = "port" ++port.rmempty = true ++ ++return m +diff --git a/feeds/luci/applications/luci-app-ntpc/luasrc/model/cbi/ntpc/ntpcmini.lua b/feeds/luci/applications/luci-app-ntpc/luasrc/model/cbi/ntpc/ntpcmini.lua +new file mode 100644 +index 0000000..82811cf +--- /dev/null ++++ b/feeds/luci/applications/luci-app-ntpc/luasrc/model/cbi/ntpc/ntpcmini.lua +@@ -0,0 +1,28 @@ ++-- Copyright 2008 Steven Barth ++-- Copyright 2008 Jo-Philipp Wich ++-- Licensed to the public under the Apache License 2.0. ++ ++require("luci.tools.webadmin") ++m = Map("ntpclient", translate("Time Synchronisation"), translate("Synchronizes the system time")) ++ ++s = m:section(TypedSection, "ntpclient", translate("General")) ++s.anonymous = true ++s.addremove = false ++ ++s:option(DummyValue, "_time", translate("Current system time")).value = os.date("%c") ++ ++interval = s:option(Value, "interval", translate("Update interval (in seconds)")) ++interval.datatype = "and(uinteger,min(1))" ++interval.rmempty = true ++ ++s3 = m:section(TypedSection, "ntpserver", translate("Time Server")) ++s3.anonymous = true ++s3.addremove = true ++s3.template = "cbi/tblsection" ++ ++s3:option(Value, "hostname", translate("Hostname")) ++port = s3:option(Value, "port", translate("Port")) ++port.datatype = "port" ++port.rmempty = true ++ ++return m +diff --git a/feeds/luci/applications/luci-app-ntpc/po/ca/ntpc.po b/feeds/luci/applications/luci-app-ntpc/po/ca/ntpc.po +new file mode 100644 +index 0000000..1a0f5fb +--- /dev/null ++++ b/feeds/luci/applications/luci-app-ntpc/po/ca/ntpc.po +@@ -0,0 +1,57 @@ ++# ntpc.pot ++# generated from ./applications/luci-ntpc/luasrc/i18n/ntpc.en.lua ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Report-Msgid-Bugs-To: \n" ++"POT-Creation-Date: 2010-04-14 13:24+0200\n" ++"PO-Revision-Date: 2014-07-03 20:32+0200\n" ++"Last-Translator: Alex \n" ++"Language-Team: LANGUAGE \n" ++"Language: ca\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n != 1);\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "Clock Adjustment" ++msgstr "Ajustament de rellotge" ++ ++#, fuzzy ++msgid "Count of time measurements" ++msgstr "Compte de mesures d'horari" ++ ++msgid "Current system time" ++msgstr "Horari del sistema actual" ++ ++msgid "General" ++msgstr "General" ++ ++msgid "Hostname" ++msgstr "Nom de host" ++ ++#, fuzzy ++msgid "Offset frequency" ++msgstr "Compensació de freqüència" ++ ++msgid "Port" ++msgstr "Port" ++ ++msgid "Synchronizes the system time" ++msgstr "Sincronitza l'hora del sistema" ++ ++msgid "Time Server" ++msgstr "Servidor d'horari" ++ ++msgid "Time Servers" ++msgstr "Servidors d'horari" ++ ++msgid "Time Synchronisation" ++msgstr "Sincronització d'horari" ++ ++msgid "Update interval (in seconds)" ++msgstr "Interval d'actualització (en segons)" ++ ++msgid "empty = infinite" ++msgstr "buit = infinit" +diff --git a/feeds/luci/applications/luci-app-ntpc/po/cs/ntpc.po b/feeds/luci/applications/luci-app-ntpc/po/cs/ntpc.po +new file mode 100644 +index 0000000..8c342de +--- /dev/null ++++ b/feeds/luci/applications/luci-app-ntpc/po/cs/ntpc.po +@@ -0,0 +1,55 @@ ++# Generated from applications/luci-ntpc/luasrc/model/cbi/ntpc/*.lua ++# ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Report-Msgid-Bugs-To: \n" ++"POT-Creation-Date: 2010-04-14 13:24+0200\n" ++"PO-Revision-Date: 2014-04-14 12:47+0200\n" ++"Last-Translator: koli \n" ++"Language-Team: none\n" ++"Language: cs\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "Clock Adjustment" ++msgstr "Úprava Äasu" ++ ++msgid "Count of time measurements" ++msgstr "PoÄet měření Äasu" ++ ++msgid "Current system time" ++msgstr "Aktuální systémový Äas" ++ ++msgid "General" ++msgstr "Obecné nastavení" ++ ++msgid "Hostname" ++msgstr "Hostname" ++ ++msgid "Offset frequency" ++msgstr "Offsetová frekvence (chyba měření Äasu)" ++ ++msgid "Port" ++msgstr "Port" ++ ++msgid "Synchronizes the system time" ++msgstr "Synchronizuje systémový Äas s pÅ™esným reálným Äasem pÅ™es síť" ++ ++msgid "Time Server" ++msgstr "SynchronizaÄní server" ++ ++msgid "Time Servers" ++msgstr "SynchronizaÄní servery" ++ ++msgid "Time Synchronisation" ++msgstr "Synchronizace Äasu" ++ ++msgid "Update interval (in seconds)" ++msgstr "Interval obnovy synchronizace (v sekundách)" ++ ++msgid "empty = infinite" ++msgstr "prázdný = neustálé opakování" +diff --git a/feeds/luci/applications/luci-app-ntpc/po/de/ntpc.po b/feeds/luci/applications/luci-app-ntpc/po/de/ntpc.po +new file mode 100644 +index 0000000..b610935 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-ntpc/po/de/ntpc.po +@@ -0,0 +1,53 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Report-Msgid-Bugs-To: \n" ++"POT-Creation-Date: 2010-04-14 13:24+0200\n" ++"PO-Revision-Date: 2012-07-17 15:07+0200\n" ++"Last-Translator: Martin \n" ++"Language-Team: LANGUAGE \n" ++"Language: de\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n != 1);\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "Clock Adjustment" ++msgstr "Zeitgeberjustierung" ++ ++msgid "Count of time measurements" ++msgstr "Anzahl der Zeitmessungen" ++ ++msgid "Current system time" ++msgstr "Aktuelle Systemzeit" ++ ++msgid "General" ++msgstr "Allgemein" ++ ++msgid "Hostname" ++msgstr "Hostname" ++ ++msgid "Offset frequency" ++msgstr "Frequenzabweichung" ++ ++msgid "Port" ++msgstr "Port" ++ ++msgid "Synchronizes the system time" ++msgstr "Synchronisiert die Systemzeit" ++ ++msgid "Time Server" ++msgstr "Zeitserver" ++ ++msgid "Time Servers" ++msgstr "Zeitserver" ++ ++msgid "Time Synchronisation" ++msgstr "Zeitsynchronisation" ++ ++msgid "Update interval (in seconds)" ++msgstr "Aktualisierungsintervall (in Sekunden)" ++ ++msgid "empty = infinite" ++msgstr "leer = unendlich" +diff --git a/feeds/luci/applications/luci-app-ntpc/po/el/ntpc.po b/feeds/luci/applications/luci-app-ntpc/po/el/ntpc.po +new file mode 100644 +index 0000000..c8f22eb +--- /dev/null ++++ b/feeds/luci/applications/luci-app-ntpc/po/el/ntpc.po +@@ -0,0 +1,56 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Report-Msgid-Bugs-To: \n" ++"POT-Creation-Date: 2010-04-14 13:24+0200\n" ++"PO-Revision-Date: 2012-03-31 15:40+0200\n" ++"Last-Translator: Vasilis \n" ++"Language-Team: LANGUAGE \n" ++"Language: el\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n != 1);\n" ++"X-Generator: Pootle 2.0.4\n" ++ ++msgid "Clock Adjustment" ++msgstr "ΡÏθμιση ΡολογιοÏ" ++ ++msgid "Count of time measurements" ++msgstr "Πλήθος μετÏήσεων ÏŽÏας" ++ ++msgid "Current system time" ++msgstr "ΤÏέχουσα ÏŽÏα συστήματος" ++ ++msgid "General" ++msgstr "Γενικά" ++ ++msgid "Hostname" ++msgstr "Όνομα συστήματος" ++ ++#, fuzzy ++msgid "Offset frequency" ++msgstr "Συχνότητα μετάθεσης" ++ ++msgid "Port" ++msgstr "ΘÏÏα" ++ ++msgid "Synchronizes the system time" ++msgstr "ΣυγχÏονίζει την ÏŽÏα του συστήματος" ++ ++msgid "Time Server" ++msgstr "" ++ ++#, fuzzy ++msgid "Time Servers" ++msgstr "ΕξυπηÏετητές ÎÏας" ++ ++msgid "Time Synchronisation" ++msgstr "ΣυγχÏονισμός ÎÏας" ++ ++#, fuzzy ++msgid "Update interval (in seconds)" ++msgstr "ΠεÏίοδος ενημέÏωσης (σε δευτεÏόλεπτα)" ++ ++msgid "empty = infinite" ++msgstr "άδειο = άπειÏος" +diff --git a/feeds/luci/applications/luci-app-ntpc/po/en/ntpc.po b/feeds/luci/applications/luci-app-ntpc/po/en/ntpc.po +new file mode 100644 +index 0000000..803a996 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-ntpc/po/en/ntpc.po +@@ -0,0 +1,51 @@ ++#, fuzzy ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Report-Msgid-Bugs-To: \n" ++"POT-Creation-Date: 2010-04-14 13:24+0200\n" ++"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" ++"Last-Translator: FULL NAME \n" ++"Language-Team: LANGUAGE \n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++ ++msgid "Clock Adjustment" ++msgstr "Clock Adjustment" ++ ++msgid "Count of time measurements" ++msgstr "Count of time measurements" ++ ++msgid "Current system time" ++msgstr "Current system time" ++ ++msgid "General" ++msgstr "General" ++ ++msgid "Hostname" ++msgstr "Hostname" ++ ++msgid "Offset frequency" ++msgstr "Offset frequency" ++ ++msgid "Port" ++msgstr "Port" ++ ++msgid "Synchronizes the system time" ++msgstr "Synchronizes the system time" ++ ++msgid "Time Server" ++msgstr "" ++ ++msgid "Time Servers" ++msgstr "Time Servers" ++ ++msgid "Time Synchronisation" ++msgstr "Time Synchronisation" ++ ++msgid "Update interval (in seconds)" ++msgstr "Update interval (in seconds)" ++ ++msgid "empty = infinite" ++msgstr "empty = infinite" +diff --git a/feeds/luci/applications/luci-app-ntpc/po/es/ntpc.po b/feeds/luci/applications/luci-app-ntpc/po/es/ntpc.po +new file mode 100644 +index 0000000..40edf24 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-ntpc/po/es/ntpc.po +@@ -0,0 +1,53 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Report-Msgid-Bugs-To: \n" ++"POT-Creation-Date: 2010-04-14 13:24+0200\n" ++"PO-Revision-Date: 2012-11-25 11:14+0200\n" ++"Last-Translator: José Vicente \n" ++"Language-Team: LANGUAGE \n" ++"Language: es\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n != 1);\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "Clock Adjustment" ++msgstr "Ajuste del Reloj" ++ ++msgid "Count of time measurements" ++msgstr "Medida del tiempo" ++ ++msgid "Current system time" ++msgstr "Hora actual del sistema" ++ ++msgid "General" ++msgstr "General" ++ ++msgid "Hostname" ++msgstr "Nombre de la máquina" ++ ++msgid "Offset frequency" ++msgstr "Desplazamiento de frecuencia" ++ ++msgid "Port" ++msgstr "Puerto" ++ ++msgid "Synchronizes the system time" ++msgstr "Sincronizar la hora del sistema" ++ ++msgid "Time Server" ++msgstr "Servidor de tiempo" ++ ++msgid "Time Servers" ++msgstr "Servidores de hora" ++ ++msgid "Time Synchronisation" ++msgstr "Sincronización horaria" ++ ++msgid "Update interval (in seconds)" ++msgstr "Intervalo de actualización (en segundos)" ++ ++msgid "empty = infinite" ++msgstr "vacío = infinito" +diff --git a/feeds/luci/applications/luci-app-ntpc/po/fr/ntpc.po b/feeds/luci/applications/luci-app-ntpc/po/fr/ntpc.po +new file mode 100644 +index 0000000..d417e15 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-ntpc/po/fr/ntpc.po +@@ -0,0 +1,53 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Report-Msgid-Bugs-To: \n" ++"POT-Creation-Date: 2010-04-14 13:24+0200\n" ++"PO-Revision-Date: 2012-11-06 16:08+0200\n" ++"Last-Translator: hogsim \n" ++"Language-Team: LANGUAGE \n" ++"Language: fr\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n > 1);\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "Clock Adjustment" ++msgstr "Ajustement de l'horloge" ++ ++msgid "Count of time measurements" ++msgstr "Nombre de mesures du temps" ++ ++msgid "Current system time" ++msgstr "Temps système actuel" ++ ++msgid "General" ++msgstr "Général" ++ ++msgid "Hostname" ++msgstr "Nom d'hôte" ++ ++msgid "Offset frequency" ++msgstr "Décalage en fréquence" ++ ++msgid "Port" ++msgstr "Port" ++ ++msgid "Synchronizes the system time" ++msgstr "Synchronise le temps système" ++ ++msgid "Time Server" ++msgstr "Serveur temps " ++ ++msgid "Time Servers" ++msgstr "Serveurs de temps" ++ ++msgid "Time Synchronisation" ++msgstr "Synchronisation du temps" ++ ++msgid "Update interval (in seconds)" ++msgstr "Intervalle de mise à jour (en secondes)" ++ ++msgid "empty = infinite" ++msgstr "vide = infini" +diff --git a/feeds/luci/applications/luci-app-ntpc/po/he/ntpc.po b/feeds/luci/applications/luci-app-ntpc/po/he/ntpc.po +new file mode 100644 +index 0000000..9d2bee6 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-ntpc/po/he/ntpc.po +@@ -0,0 +1,59 @@ ++# Generated from applications/luci-ntpc/luasrc/model/cbi/ntpc/*.lua ++# ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Report-Msgid-Bugs-To: \n" ++"POT-Creation-Date: 2010-04-14 13:24+0200\n" ++"PO-Revision-Date: 2011-06-25 11:40+0200\n" ++"Last-Translator: GiladL \n" ++"Language-Team: none\n" ++"Language: he\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n != 1);\n" ++"X-Generator: Pootle 2.0.4\n" ++ ++# הת×מת שעון? ++#, fuzzy ++msgid "Clock Adjustment" ++msgstr "כיוון שעון" ++ ++#, fuzzy ++msgid "Count of time measurements" ++msgstr "ספירת יחידות זמן" ++ ++msgid "Current system time" ++msgstr "זמן מערכת נוכחי" ++ ++msgid "General" ++msgstr "כללי" ++ ++msgid "Hostname" ++msgstr "×©× ×ž×רח" ++ ++#, fuzzy ++msgid "Offset frequency" ++msgstr "תדירות סטייה" ++ ++msgid "Port" ++msgstr "פורט" ++ ++msgid "Synchronizes the system time" ++msgstr "מסנכרן ×ת זמן המערכת" ++ ++msgid "Time Server" ++msgstr "" ++ ++msgid "Time Servers" ++msgstr "שרתי זמן" ++ ++msgid "Time Synchronisation" ++msgstr "סנכרון זמן" ++ ++msgid "Update interval (in seconds)" ++msgstr "מרווח בין ×¢×“×›×•× ×™× (בשניות)" ++ ++msgid "empty = infinite" ++msgstr "ריק = ×ינסופי" +diff --git a/feeds/luci/applications/luci-app-ntpc/po/hu/ntpc.po b/feeds/luci/applications/luci-app-ntpc/po/hu/ntpc.po +new file mode 100644 +index 0000000..f69046f +--- /dev/null ++++ b/feeds/luci/applications/luci-app-ntpc/po/hu/ntpc.po +@@ -0,0 +1,55 @@ ++# Generated from applications/luci-ntpc/luasrc/model/cbi/ntpc/*.lua ++# ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Report-Msgid-Bugs-To: \n" ++"POT-Creation-Date: 2010-04-14 13:24+0200\n" ++"PO-Revision-Date: 2012-07-10 21:05+0200\n" ++"Last-Translator: Gyula \n" ++"Language-Team: none\n" ++"Language: hu\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n != 1);\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "Clock Adjustment" ++msgstr "Óra igazítás" ++ ++msgid "Count of time measurements" ++msgstr "IdÅ‘mérések száma" ++ ++msgid "Current system time" ++msgstr "Jelenlegi rendszeridÅ‘" ++ ++msgid "General" ++msgstr "Ãltalános" ++ ++msgid "Hostname" ++msgstr "Gépnév" ++ ++msgid "Offset frequency" ++msgstr "Frekvencia eltolás" ++ ++msgid "Port" ++msgstr "Port" ++ ++msgid "Synchronizes the system time" ++msgstr "A rendszeridÅ‘ szinkronizálása" ++ ++msgid "Time Server" ++msgstr "IdÅ‘szerver" ++ ++msgid "Time Servers" ++msgstr "IdÅ‘kiszolgálók" ++ ++msgid "Time Synchronisation" ++msgstr "IdÅ‘ szinkronizálás" ++ ++msgid "Update interval (in seconds)" ++msgstr "Frissítési idÅ‘köz (másodpercben)" ++ ++msgid "empty = infinite" ++msgstr "üres = végtelen" +diff --git a/feeds/luci/applications/luci-app-ntpc/po/it/ntpc.po b/feeds/luci/applications/luci-app-ntpc/po/it/ntpc.po +new file mode 100644 +index 0000000..4b027b7 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-ntpc/po/it/ntpc.po +@@ -0,0 +1,53 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Report-Msgid-Bugs-To: \n" ++"POT-Creation-Date: 2010-04-14 13:24+0200\n" ++"PO-Revision-Date: 2013-02-03 13:56+0200\n" ++"Last-Translator: Francesco <3gasas@gmail.com>\n" ++"Language-Team: LANGUAGE \n" ++"Language: it\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n != 1);\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "Clock Adjustment" ++msgstr "Impostazione Ora" ++ ++msgid "Count of time measurements" ++msgstr "Conteggio delle misure del tempo" ++ ++msgid "Current system time" ++msgstr "Ora corrente del sistema" ++ ++msgid "General" ++msgstr "Generale" ++ ++msgid "Hostname" ++msgstr "Hostname" ++ ++msgid "Offset frequency" ++msgstr "Offset delle frequenza" ++ ++msgid "Port" ++msgstr "Porta" ++ ++msgid "Synchronizes the system time" ++msgstr "Sincronizza l'ora di sistema" ++ ++msgid "Time Server" ++msgstr "Server Orologio" ++ ++msgid "Time Servers" ++msgstr "Server dell'ora" ++ ++msgid "Time Synchronisation" ++msgstr "Sincronizzazione dell'ora" ++ ++msgid "Update interval (in seconds)" ++msgstr "Intervallo di aggiornamento (in secondi)" ++ ++msgid "empty = infinite" ++msgstr "vuoto = infinito" +diff --git a/feeds/luci/applications/luci-app-ntpc/po/ja/ntpc.po b/feeds/luci/applications/luci-app-ntpc/po/ja/ntpc.po +new file mode 100644 +index 0000000..bb6135c +--- /dev/null ++++ b/feeds/luci/applications/luci-app-ntpc/po/ja/ntpc.po +@@ -0,0 +1,53 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Report-Msgid-Bugs-To: \n" ++"POT-Creation-Date: 2010-04-14 13:24+0200\n" ++"PO-Revision-Date: 2012-11-14 14:41+0200\n" ++"Last-Translator: Kentaro \n" ++"Language-Team: LANGUAGE \n" ++"Language: ja\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=1; plural=0;\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "Clock Adjustment" ++msgstr "時刻調整" ++ ++msgid "Count of time measurements" ++msgstr "時間計測回数" ++ ++msgid "Current system time" ++msgstr "ç¾åœ¨æ™‚刻" ++ ++msgid "General" ++msgstr "一般設定" ++ ++msgid "Hostname" ++msgstr "ホストå" ++ ++msgid "Offset frequency" ++msgstr "オフセット周波数" ++ ++msgid "Port" ++msgstr "ãƒãƒ¼ãƒˆ" ++ ++msgid "Synchronizes the system time" ++msgstr "システムã®æ™‚é–“ã‚’åŒæœŸã—ã¾ã™ã€‚" ++ ++msgid "Time Server" ++msgstr "時刻サーãƒãƒ¼" ++ ++msgid "Time Servers" ++msgstr "時刻サーãƒãƒ¼" ++ ++msgid "Time Synchronisation" ++msgstr "Time Synchronisation" ++ ++msgid "Update interval (in seconds)" ++msgstr "アップデート間隔 (秒)" ++ ++msgid "empty = infinite" ++msgstr "空ã®å ´åˆã€ç„¡é™å¤§ã«ãªã‚Šã¾ã™" +diff --git a/feeds/luci/applications/luci-app-ntpc/po/ms/ntpc.po b/feeds/luci/applications/luci-app-ntpc/po/ms/ntpc.po +new file mode 100644 +index 0000000..abbfdbe +--- /dev/null ++++ b/feeds/luci/applications/luci-app-ntpc/po/ms/ntpc.po +@@ -0,0 +1,52 @@ ++# Generated from applications/luci-ntpc/luasrc/model/cbi/ntpc/*.lua ++# ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Report-Msgid-Bugs-To: \n" ++"POT-Creation-Date: 2010-04-14 13:24+0200\n" ++"PO-Revision-Date: 2010-04-14 13:24+0200\n" ++"Last-Translator: Automatically generated\n" ++"Language-Team: none\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++ ++msgid "Clock Adjustment" ++msgstr "" ++ ++msgid "Count of time measurements" ++msgstr "" ++ ++msgid "Current system time" ++msgstr "" ++ ++msgid "General" ++msgstr "" ++ ++msgid "Hostname" ++msgstr "" ++ ++msgid "Offset frequency" ++msgstr "" ++ ++msgid "Port" ++msgstr "" ++ ++msgid "Synchronizes the system time" ++msgstr "" ++ ++msgid "Time Server" ++msgstr "" ++ ++msgid "Time Servers" ++msgstr "" ++ ++msgid "Time Synchronisation" ++msgstr "" ++ ++msgid "Update interval (in seconds)" ++msgstr "" ++ ++msgid "empty = infinite" ++msgstr "" +diff --git a/feeds/luci/applications/luci-app-ntpc/po/no/ntpc.po b/feeds/luci/applications/luci-app-ntpc/po/no/ntpc.po +new file mode 100644 +index 0000000..7b3fd0b +--- /dev/null ++++ b/feeds/luci/applications/luci-app-ntpc/po/no/ntpc.po +@@ -0,0 +1,44 @@ ++msgid "" ++msgstr "" ++"Last-Translator: Lars Hardy \n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++ ++msgid "Clock Adjustment" ++msgstr "Tidskorrigering" ++ ++msgid "Count of time measurements" ++msgstr "Antall tidsmÃ¥linger" ++ ++msgid "Current system time" ++msgstr "NÃ¥værende system tid" ++ ++msgid "General" ++msgstr "Generelt" ++ ++msgid "Hostname" ++msgstr "Vertsnavn" ++ ++msgid "Offset frequency" ++msgstr "Frekvens forskyvning" ++ ++msgid "Port" ++msgstr "Port" ++ ++msgid "Synchronizes the system time" ++msgstr "Synkroniserer systemets tid" ++ ++msgid "Time Server" ++msgstr "Tids Server" ++ ++msgid "Time Servers" ++msgstr "Tids Servere" ++ ++msgid "Time Synchronisation" ++msgstr "Tidssynkronisering" ++ ++msgid "Update interval (in seconds)" ++msgstr "Oppdateringsintervall (i sek)" ++ ++msgid "empty = infinite" ++msgstr "tomt = uendelig" +diff --git a/feeds/luci/applications/luci-app-ntpc/po/pl/ntpc.po b/feeds/luci/applications/luci-app-ntpc/po/pl/ntpc.po +new file mode 100644 +index 0000000..c2cb3e8 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-ntpc/po/pl/ntpc.po +@@ -0,0 +1,54 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Report-Msgid-Bugs-To: \n" ++"POT-Creation-Date: 2010-04-14 13:24+0200\n" ++"PO-Revision-Date: 2011-09-18 02:23+0200\n" ++"Last-Translator: MichaÅ‚ \n" ++"Language-Team: LANGUAGE \n" ++"Language: pl\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 " ++"|| n%100>=20) ? 1 : 2);\n" ++"X-Generator: Pootle 2.0.4\n" ++ ++msgid "Clock Adjustment" ++msgstr "Regulacja zegara" ++ ++msgid "Count of time measurements" ++msgstr "Liczba pomiarów czasu" ++ ++msgid "Current system time" ++msgstr "Aktualny czas systemowy" ++ ++msgid "General" ++msgstr "Główne" ++ ++msgid "Hostname" ++msgstr "Nazwa hosta" ++ ++msgid "Offset frequency" ++msgstr "PrzesuniÄ™cie czÄ™stotliwoÅ›ci" ++ ++msgid "Port" ++msgstr "Port" ++ ++msgid "Synchronizes the system time" ++msgstr "Synchronizuje czas systemowy" ++ ++msgid "Time Server" ++msgstr "Serwer czasu" ++ ++msgid "Time Servers" ++msgstr "Serwery czasu" ++ ++msgid "Time Synchronisation" ++msgstr "Synchronizacja czasu" ++ ++msgid "Update interval (in seconds)" ++msgstr "InterwaÅ‚ aktualizacji (w sekundach)" ++ ++msgid "empty = infinite" ++msgstr "puste = nieskoÅ„czone" +diff --git a/feeds/luci/applications/luci-app-ntpc/po/pt-br/ntpc.po b/feeds/luci/applications/luci-app-ntpc/po/pt-br/ntpc.po +new file mode 100644 +index 0000000..9e8849a +--- /dev/null ++++ b/feeds/luci/applications/luci-app-ntpc/po/pt-br/ntpc.po +@@ -0,0 +1,53 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Report-Msgid-Bugs-To: \n" ++"POT-Creation-Date: 2010-04-14 13:24+0200\n" ++"PO-Revision-Date: 2011-10-18 22:38+0200\n" ++"Last-Translator: Luiz Angelo \n" ++"Language-Team: LANGUAGE \n" ++"Language: pt_BR\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n > 1);\n" ++"X-Generator: Pootle 2.0.4\n" ++ ++msgid "Clock Adjustment" ++msgstr "Ajuste do Relógio" ++ ++msgid "Count of time measurements" ++msgstr "Quantidade de medições do tempo" ++ ++msgid "Current system time" ++msgstr "Hora atual do sistema" ++ ++msgid "General" ++msgstr "Geral" ++ ++msgid "Hostname" ++msgstr "Nome do computador" ++ ++msgid "Offset frequency" ++msgstr "Frequência da compensação" ++ ++msgid "Port" ++msgstr "Porta" ++ ++msgid "Synchronizes the system time" ++msgstr "Sincroniza a hora do sistema" ++ ++msgid "Time Server" ++msgstr "Servidor de Hora." ++ ++msgid "Time Servers" ++msgstr "Servidores de Hora" ++ ++msgid "Time Synchronisation" ++msgstr "Sincronização de Horário" ++ ++msgid "Update interval (in seconds)" ++msgstr "Intervalo de atualização (em segundos)" ++ ++msgid "empty = infinite" ++msgstr "vazio = infinito" +diff --git a/feeds/luci/applications/luci-app-ntpc/po/pt/ntpc.po b/feeds/luci/applications/luci-app-ntpc/po/pt/ntpc.po +new file mode 100644 +index 0000000..70e7952 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-ntpc/po/pt/ntpc.po +@@ -0,0 +1,53 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Report-Msgid-Bugs-To: \n" ++"POT-Creation-Date: 2010-04-14 13:24+0200\n" ++"PO-Revision-Date: 2013-05-01 01:16+0200\n" ++"Last-Translator: pedromrgoncalves \n" ++"Language-Team: LANGUAGE \n" ++"Language: pt\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n != 1);\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "Clock Adjustment" ++msgstr "Ajuste do Relógio" ++ ++msgid "Count of time measurements" ++msgstr "Quantas vezes irá atualizar" ++ ++msgid "Current system time" ++msgstr "Hora actual do sistema" ++ ++msgid "General" ++msgstr "Geral" ++ ++msgid "Hostname" ++msgstr "Nome do Host" ++ ++msgid "Offset frequency" ++msgstr "Frequência do Offset" ++ ++msgid "Port" ++msgstr "Porta" ++ ++msgid "Synchronizes the system time" ++msgstr "Sincroniza a hora do sistema" ++ ++msgid "Time Server" ++msgstr "Servidor de Hora" ++ ++msgid "Time Servers" ++msgstr "Servidores de Hora" ++ ++msgid "Time Synchronisation" ++msgstr "Sincronização de Horário" ++ ++msgid "Update interval (in seconds)" ++msgstr "Intervalo de Actualização (em s)" ++ ++msgid "empty = infinite" ++msgstr "vazio = infinito" +diff --git a/feeds/luci/applications/luci-app-ntpc/po/ro/ntpc.po b/feeds/luci/applications/luci-app-ntpc/po/ro/ntpc.po +new file mode 100644 +index 0000000..893419f +--- /dev/null ++++ b/feeds/luci/applications/luci-app-ntpc/po/ro/ntpc.po +@@ -0,0 +1,56 @@ ++# Generated from applications/luci-ntpc/luasrc/model/cbi/ntpc/*.lua ++# ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Report-Msgid-Bugs-To: \n" ++"POT-Creation-Date: 2010-04-14 13:24+0200\n" ++"PO-Revision-Date: 2012-12-01 16:08+0200\n" ++"Last-Translator: cgherman \n" ++"Language-Team: none\n" ++"Language: ro\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=3; plural=(n==1 ? 0 : (n==0 || (n%100 > 0 && n%100 < " ++"20)) ? 1 : 2);;\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "Clock Adjustment" ++msgstr "Ajustarea ceasului" ++ ++msgid "Count of time measurements" ++msgstr "Masuratori de timp" ++ ++msgid "Current system time" ++msgstr "Timpul curent de sistem" ++ ++msgid "General" ++msgstr "General" ++ ++msgid "Hostname" ++msgstr "Numele de host" ++ ++msgid "Offset frequency" ++msgstr "Frecventa de offset" ++ ++msgid "Port" ++msgstr "Port" ++ ++msgid "Synchronizes the system time" ++msgstr "Sincronizeaza timpul sistemului" ++ ++msgid "Time Server" ++msgstr "Server de timp" ++ ++msgid "Time Servers" ++msgstr "Serverele de timp" ++ ++msgid "Time Synchronisation" ++msgstr "Sincronizarea de timp" ++ ++msgid "Update interval (in seconds)" ++msgstr "Intervalul de actualizare (in secunde)" ++ ++msgid "empty = infinite" ++msgstr "gol = infinit" +diff --git a/feeds/luci/applications/luci-app-ntpc/po/ru/ntpc.po b/feeds/luci/applications/luci-app-ntpc/po/ru/ntpc.po +new file mode 100644 +index 0000000..229b610 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-ntpc/po/ru/ntpc.po +@@ -0,0 +1,55 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: LuCI: ntpc\n" ++"Report-Msgid-Bugs-To: \n" ++"POT-Creation-Date: 2010-04-14 13:24+0200\n" ++"PO-Revision-Date: 2012-08-15 11:41+0300\n" ++"Last-Translator: Roman A. aka BasicXP \n" ++"Language-Team: Russian \n" ++"Language: ru\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%" ++"10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" ++"X-Generator: Pootle 2.0.4\n" ++"X-Poedit-SourceCharset: UTF-8\n" ++ ++msgid "Clock Adjustment" ++msgstr "Корректировка чаÑов" ++ ++msgid "Count of time measurements" ++msgstr "КоличеÑтво измерений времени" ++ ++msgid "Current system time" ++msgstr "Текущее времÑ" ++ ++msgid "General" ++msgstr "Общие" ++ ++msgid "Hostname" ++msgstr "Ð˜Ð¼Ñ Ñ…Ð¾Ñта" ++ ++msgid "Offset frequency" ++msgstr "Смещение чаÑтоты" ++ ++msgid "Port" ++msgstr "Порт" ++ ++msgid "Synchronizes the system time" ++msgstr "Синхронизирует ÑиÑтемное времÑ" ++ ++msgid "Time Server" ++msgstr "Сервер времени" ++ ++msgid "Time Servers" ++msgstr "Серверы времени" ++ ++msgid "Time Synchronisation" ++msgstr "Ð¡Ð¸Ð½Ñ…Ñ€Ð¾Ð½Ð¸Ð·Ð°Ñ†Ð¸Ñ Ð²Ñ€ÐµÐ¼ÐµÐ½Ð¸" ++ ++msgid "Update interval (in seconds)" ++msgstr "Интервал Ð¾Ð±Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ (в Ñекундах)" ++ ++msgid "empty = infinite" ++msgstr "пуÑто = беÑконечно" +diff --git a/feeds/luci/applications/luci-app-ntpc/po/sk/ntpc.po b/feeds/luci/applications/luci-app-ntpc/po/sk/ntpc.po +new file mode 100644 +index 0000000..d3f8fb8 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-ntpc/po/sk/ntpc.po +@@ -0,0 +1,48 @@ ++msgid "" ++msgstr "" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Last-Translator: Automatically generated\n" ++"Language-Team: none\n" ++"MIME-Version: 1.0\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n" ++ ++msgid "Clock Adjustment" ++msgstr "" ++ ++msgid "Count of time measurements" ++msgstr "" ++ ++msgid "Current system time" ++msgstr "" ++ ++msgid "General" ++msgstr "" ++ ++msgid "Hostname" ++msgstr "" ++ ++msgid "Offset frequency" ++msgstr "" ++ ++msgid "Port" ++msgstr "" ++ ++msgid "Synchronizes the system time" ++msgstr "" ++ ++msgid "Time Server" ++msgstr "" ++ ++msgid "Time Servers" ++msgstr "" ++ ++msgid "Time Synchronisation" ++msgstr "" ++ ++msgid "Update interval (in seconds)" ++msgstr "" ++ ++msgid "empty = infinite" ++msgstr "" +diff --git a/feeds/luci/applications/luci-app-ntpc/po/sv/ntpc.po b/feeds/luci/applications/luci-app-ntpc/po/sv/ntpc.po +new file mode 100644 +index 0000000..00715e6 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-ntpc/po/sv/ntpc.po +@@ -0,0 +1,49 @@ ++msgid "" ++msgstr "" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Last-Translator: Automatically generated\n" ++"Language-Team: none\n" ++"Language: sv\n" ++"MIME-Version: 1.0\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n != 1);\n" ++ ++msgid "Clock Adjustment" ++msgstr "" ++ ++msgid "Count of time measurements" ++msgstr "" ++ ++msgid "Current system time" ++msgstr "" ++ ++msgid "General" ++msgstr "" ++ ++msgid "Hostname" ++msgstr "" ++ ++msgid "Offset frequency" ++msgstr "" ++ ++msgid "Port" ++msgstr "" ++ ++msgid "Synchronizes the system time" ++msgstr "" ++ ++msgid "Time Server" ++msgstr "" ++ ++msgid "Time Servers" ++msgstr "" ++ ++msgid "Time Synchronisation" ++msgstr "" ++ ++msgid "Update interval (in seconds)" ++msgstr "" ++ ++msgid "empty = infinite" ++msgstr "" +diff --git a/feeds/luci/applications/luci-app-ntpc/po/templates/ntpc.pot b/feeds/luci/applications/luci-app-ntpc/po/templates/ntpc.pot +new file mode 100644 +index 0000000..1ed4c40 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-ntpc/po/templates/ntpc.pot +@@ -0,0 +1,41 @@ ++msgid "" ++msgstr "Content-Type: text/plain; charset=UTF-8" ++ ++msgid "Clock Adjustment" ++msgstr "" ++ ++msgid "Count of time measurements" ++msgstr "" ++ ++msgid "Current system time" ++msgstr "" ++ ++msgid "General" ++msgstr "" ++ ++msgid "Hostname" ++msgstr "" ++ ++msgid "Offset frequency" ++msgstr "" ++ ++msgid "Port" ++msgstr "" ++ ++msgid "Synchronizes the system time" ++msgstr "" ++ ++msgid "Time Server" ++msgstr "" ++ ++msgid "Time Servers" ++msgstr "" ++ ++msgid "Time Synchronisation" ++msgstr "" ++ ++msgid "Update interval (in seconds)" ++msgstr "" ++ ++msgid "empty = infinite" ++msgstr "" +diff --git a/feeds/luci/applications/luci-app-ntpc/po/tr/ntpc.po b/feeds/luci/applications/luci-app-ntpc/po/tr/ntpc.po +new file mode 100644 +index 0000000..657b2e8 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-ntpc/po/tr/ntpc.po +@@ -0,0 +1,55 @@ ++# Generated from applications/luci-ntpc/luasrc/model/cbi/ntpc/*.lua ++# ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Report-Msgid-Bugs-To: \n" ++"POT-Creation-Date: 2010-04-14 13:24+0200\n" ++"PO-Revision-Date: 2012-10-11 22:20+0200\n" ++"Last-Translator: vincenzo \n" ++"Language-Team: none\n" ++"Language: tr\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=1; plural=0;\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "Clock Adjustment" ++msgstr "Saat Ayarı" ++ ++msgid "Count of time measurements" ++msgstr "Zaman Ölçüm Sayacı" ++ ++msgid "Current system time" ++msgstr "Mevcut Sistem Saati" ++ ++msgid "General" ++msgstr "Genel" ++ ++msgid "Hostname" ++msgstr "Sunucu Adı" ++ ++msgid "Offset frequency" ++msgstr "Denge Frekansı" ++ ++msgid "Port" ++msgstr "Port" ++ ++msgid "Synchronizes the system time" ++msgstr "Sistem Saati Senkronizasyonu" ++ ++msgid "Time Server" ++msgstr "Zaman Sunucusu" ++ ++msgid "Time Servers" ++msgstr "Zaman Sunucuları" ++ ++msgid "Time Synchronisation" ++msgstr "Saat Senkronizasyonu" ++ ++msgid "Update interval (in seconds)" ++msgstr "Güncelleme Aralığı (Saniye)" ++ ++msgid "empty = infinite" ++msgstr "BoÅŸ = Sonsuz" +diff --git a/feeds/luci/applications/luci-app-ntpc/po/uk/ntpc.po b/feeds/luci/applications/luci-app-ntpc/po/uk/ntpc.po +new file mode 100644 +index 0000000..451f783 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-ntpc/po/uk/ntpc.po +@@ -0,0 +1,56 @@ ++# Generated from applications/luci-ntpc/luasrc/model/cbi/ntpc/*.lua ++# ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Report-Msgid-Bugs-To: \n" ++"POT-Creation-Date: 2010-04-14 13:24+0200\n" ++"PO-Revision-Date: 2012-03-18 20:32+0200\n" ++"Last-Translator: YuriPet \n" ++"Language-Team: none\n" ++"Language: uk\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%" ++"10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" ++"X-Generator: Pootle 2.0.4\n" ++ ++msgid "Clock Adjustment" ++msgstr "ÐšÐ¾Ñ€Ð¸Ð³ÑƒÐ²Ð°Ð½Ð½Ñ Ð³Ð¾Ð´Ð¸Ð½Ð½Ð¸ÐºÐ°" ++ ++msgid "Count of time measurements" ++msgstr "КількіÑÑ‚ÑŒ вимірювань чаÑу" ++ ++msgid "Current system time" ++msgstr "Поточний ÑиÑтемний чаÑ" ++ ++msgid "General" ++msgstr "Загальне" ++ ++msgid "Hostname" ++msgstr "Ðазва (ім'Ñ) вузла" ++ ++msgid "Offset frequency" ++msgstr "ЗÑув чаÑтоти" ++ ++msgid "Port" ++msgstr "Порт" ++ ++msgid "Synchronizes the system time" ++msgstr "Ð¡Ð¸Ð½Ñ…Ñ€Ð¾Ð½Ñ–Ð·Ð°Ñ†Ñ–Ñ ÑиÑтемного чаÑу" ++ ++msgid "Time Server" ++msgstr "Сервер чаÑу" ++ ++msgid "Time Servers" ++msgstr "Сервери чаÑу" ++ ++msgid "Time Synchronisation" ++msgstr "Ð¡Ð¸Ð½Ñ…Ñ€Ð¾Ð½Ñ–Ð·Ð°Ñ†Ñ–Ñ Ñ‡Ð°Ñу" ++ ++msgid "Update interval (in seconds)" ++msgstr "Інтервал Ð¾Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ (в Ñекундах)" ++ ++msgid "empty = infinite" ++msgstr "пуÑто = неÑкінченно" +diff --git a/feeds/luci/applications/luci-app-ntpc/po/vi/ntpc.po b/feeds/luci/applications/luci-app-ntpc/po/vi/ntpc.po +new file mode 100644 +index 0000000..4de0971 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-ntpc/po/vi/ntpc.po +@@ -0,0 +1,57 @@ ++# ntpc.pot ++# generated from ./applications/luci-ntpc/luasrc/i18n/ntpc.en.lua ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Report-Msgid-Bugs-To: \n" ++"POT-Creation-Date: 2010-04-14 13:24+0200\n" ++"PO-Revision-Date: 2009-08-13 03:46+0200\n" ++"Last-Translator: Hong Phuc Dang \n" ++"Language-Team: LANGUAGE \n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"X-Generator: Pootle 1.1.0\n" ++ ++msgid "Clock Adjustment" ++msgstr "Äiá»u chỉnh đồng hồ" ++ ++#, fuzzy ++msgid "Count of time measurements" ++msgstr "Äếm thá»i gian" ++ ++msgid "Current system time" ++msgstr "Thá»i gian hiện tại của hệ thống" ++ ++msgid "General" ++msgstr "" ++ ++msgid "Hostname" ++msgstr "" ++ ++#, fuzzy ++msgid "Offset frequency" ++msgstr "tần số offset " ++ ++msgid "Port" ++msgstr "" ++ ++msgid "Synchronizes the system time" ++msgstr "Äồng bá»™ hóa giá» hệ thống" ++ ++msgid "Time Server" ++msgstr "" ++ ++#, fuzzy ++msgid "Time Servers" ++msgstr "Giá» server" ++ ++msgid "Time Synchronisation" ++msgstr "Thá»i gian đồng bá»™ hóa" ++ ++#, fuzzy ++msgid "Update interval (in seconds)" ++msgstr "Cập nhật Interval (giây)" ++ ++msgid "empty = infinite" ++msgstr "Rá»—ng = Vô tận" +diff --git a/feeds/luci/applications/luci-app-ntpc/po/zh-cn/ntpc.po b/feeds/luci/applications/luci-app-ntpc/po/zh-cn/ntpc.po +new file mode 100644 +index 0000000..0821c3f +--- /dev/null ++++ b/feeds/luci/applications/luci-app-ntpc/po/zh-cn/ntpc.po +@@ -0,0 +1,53 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: LuCi Chinese Translation\n" ++"Report-Msgid-Bugs-To: \n" ++"POT-Creation-Date: 2010-04-14 13:24+0200\n" ++"PO-Revision-Date: 2012-11-15 21:39+0200\n" ++"Last-Translator: Rui \n" ++"Language-Team: QQ Group 75543259\n" ++"Language: zh_CN\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=1; plural=0;\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "Clock Adjustment" ++msgstr "时钟校对" ++ ++msgid "Count of time measurements" ++msgstr "å•ä½æ—¶é—´æ•°" ++ ++msgid "Current system time" ++msgstr "当å‰ç³»ç»Ÿæ—¶é—´" ++ ++msgid "General" ++msgstr "基本设置" ++ ++msgid "Hostname" ++msgstr "主机å" ++ ++msgid "Offset frequency" ++msgstr "å移é‡" ++ ++msgid "Port" ++msgstr "端å£" ++ ++msgid "Synchronizes the system time" ++msgstr "åŒæ­¥ç³»ç»Ÿæ—¶é—´" ++ ++msgid "Time Server" ++msgstr "时间æœåŠ¡å™¨" ++ ++msgid "Time Servers" ++msgstr "时间æœåŠ¡å™¨" ++ ++msgid "Time Synchronisation" ++msgstr "时间åŒæ­¥" ++ ++msgid "Update interval (in seconds)" ++msgstr "æ›´æ–°é—´éš”(秒)" ++ ++msgid "empty = infinite" ++msgstr "空值为无é™é•¿åº¦" +diff --git a/feeds/luci/applications/luci-app-ntpc/po/zh-tw/ntpc.po b/feeds/luci/applications/luci-app-ntpc/po/zh-tw/ntpc.po +new file mode 100644 +index 0000000..a898671 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-ntpc/po/zh-tw/ntpc.po +@@ -0,0 +1,51 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"PO-Revision-Date: 2014-05-14 18:43+0200\n" ++"Last-Translator: omnistack \n" ++"Language-Team: none\n" ++"Language: zh_TW\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=1; plural=0;\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "Clock Adjustment" ++msgstr "校時修正" ++ ++msgid "Count of time measurements" ++msgstr "時間計é‡æ¬¡æ•¸" ++ ++msgid "Current system time" ++msgstr "ç›®å‰ç³»çµ±æ™‚é–“" ++ ++msgid "General" ++msgstr "一般" ++ ++msgid "Hostname" ++msgstr "主機å稱" ++ ++msgid "Offset frequency" ++msgstr "å移頻é“" ++ ++msgid "Port" ++msgstr "埠號" ++ ++msgid "Synchronizes the system time" ++msgstr "åŒæ­¥é€™å€‹ç³»çµ±æ™‚é–“" ++ ++msgid "Time Server" ++msgstr "校時伺æœå™¨" ++ ++msgid "Time Servers" ++msgstr "校時伺æœå™¨" ++ ++msgid "Time Synchronisation" ++msgstr "校時åŒæ­¥" ++ ++msgid "Update interval (in seconds)" ++msgstr "æ›´æ–°é–“éš”(秒)" ++ ++msgid "empty = infinite" ++msgstr "留白=ä¸é™åˆ¶" +diff --git a/feeds/luci/applications/luci-app-ocserv/Makefile b/feeds/luci/applications/luci-app-ocserv/Makefile +new file mode 100644 +index 0000000..3fbf4d2 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-ocserv/Makefile +@@ -0,0 +1,14 @@ ++# ++# Copyright (C) 2008-2014 The LuCI Team ++# ++# This is free software, licensed under the Apache License, Version 2.0 . ++# ++ ++include $(TOPDIR)/rules.mk ++ ++LUCI_TITLE:=LuCI Support for OpenConnect VPN ++LUCI_DEPENDS:=+ocserv +certtool ++ ++include ../../luci.mk ++ ++# call BuildPackage - OpenWrt buildroot signature +diff --git a/feeds/luci/applications/luci-app-ocserv/luasrc/controller/ocserv.lua b/feeds/luci/applications/luci-app-ocserv/luasrc/controller/ocserv.lua +new file mode 100644 +index 0000000..dbeaaf8 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-ocserv/luasrc/controller/ocserv.lua +@@ -0,0 +1,78 @@ ++-- Copyright 2014 Nikos Mavrogiannopoulos ++-- Licensed to the public under the Apache License 2.0. ++ ++module("luci.controller.ocserv", package.seeall) ++ ++function index() ++ if not nixio.fs.access("/etc/config/ocserv") then ++ return ++ end ++ ++ local page ++ ++ page = entry({"admin", "services", "ocserv"}, alias("admin", "services", "ocserv", "main"), ++ _("OpenConnect VPN")) ++ page.dependent = true ++ ++ page = entry({"admin", "services", "ocserv", "main"}, ++ cbi("ocserv/main"), ++ _("Server Settings"), 200) ++ page.dependent = true ++ ++ page = entry({"admin", "services", "ocserv", "users"}, ++ cbi("ocserv/users"), ++ _("User Settings"), 300) ++ page.dependent = true ++ ++ entry({"admin", "services", "ocserv", "status"}, ++ call("ocserv_status")).leaf = true ++ ++ entry({"admin", "services", "ocserv", "disconnect"}, ++ call("ocserv_disconnect")).leaf = true ++ ++end ++ ++function ocserv_status() ++ local ipt = io.popen("/usr/bin/occtl show users"); ++ ++ if ipt then ++ ++ local fwd = { } ++ while true do ++ ++ local ln = ipt:read("*l") ++ if not ln then break end ++ ++ local id, user, group, vpn_ip, ip, device, time, cipher, status = ++ ln:match("^%s*(%d+)%s+([-_%w]+)%s+([%(%)%.%*-_%w]+)%s+([%:%.-_%w]+)%s+([%:%.-_%w]+)%s+([%:%.-_%w]+)%s+([%:%.-_%w]+)%s+([%(%)%:%.-_%w]+)%s+([%:%.-_%w]+).*") ++ if id then ++ fwd[#fwd+1] = { ++ id = id, ++ user = user, ++ group = group, ++ vpn_ip = vpn_ip, ++ ip = ip, ++ device = device, ++ time = time, ++ cipher = cipher, ++ status = status ++ } ++ end ++ end ++ ipt:close() ++ luci.http.prepare_content("application/json") ++ luci.http.write_json(fwd) ++ end ++end ++ ++function ocserv_disconnect(num) ++ local idx = tonumber(num) ++ ++ if idx and idx > 0 then ++ luci.sys.call("/usr/bin/occtl disconnect id %d" % idx) ++ luci.http.status(200, "OK") ++ ++ return ++ end ++ luci.http.status(400, "Bad request") ++end +diff --git a/feeds/luci/applications/luci-app-ocserv/luasrc/model/cbi/ocserv/main.lua b/feeds/luci/applications/luci-app-ocserv/luasrc/model/cbi/ocserv/main.lua +new file mode 100644 +index 0000000..d1cc155 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-ocserv/luasrc/model/cbi/ocserv/main.lua +@@ -0,0 +1,175 @@ ++-- Copyright 2014 Nikos Mavrogiannopoulos ++-- Licensed to the public under the Apache License 2.0. ++ ++local fs = require "nixio.fs" ++local has_ipv6 = fs.access("/proc/net/ipv6_route") ++ ++m = Map("ocserv", translate("OpenConnect VPN")) ++ ++s = m:section(TypedSection, "ocserv", "OpenConnect") ++s.anonymous = true ++ ++s:tab("general", translate("General Settings")) ++s:tab("ca", translate("CA certificate")) ++s:tab("template", translate("Edit Template")) ++ ++local e = s:taboption("general", Flag, "enable", translate("Enable server")) ++e.rmempty = false ++e.default = "1" ++ ++local o_sha = s:taboption("general", DummyValue, "sha_hash", translate("Server's certificate SHA1 hash"), ++ translate("That value should be communicated to the client to verify the server's certificate")) ++local o_pki = s:taboption("general", DummyValue, "pkid", translate("Server's Public Key ID"), ++ translate("An alternative value to be communicated to the client to verify the server's certificate; this value only depends on the public key")) ++ ++local fd = io.popen("/usr/bin/certtool -i --infile /etc/ocserv/server-cert.pem", "r") ++if fd then local ln ++ local found_sha = false ++ local found_pki = false ++ local complete = 0 ++ while complete < 2 do ++ local ln = fd:read("*l") ++ if not ln then ++ break ++ elseif ln:match("SHA%-?1 fingerprint:") then ++ found_sha = true ++ elseif found_sha then ++ local hash = ln:match("([a-f0-9]+)") ++ o_sha.default = hash and hash:upper() ++ complete = complete + 1 ++ found_sha = false ++ elseif ln:match("Public Key I[Dd]:") then ++ found_pki = true ++ elseif found_pki then ++ local hash = ln:match("([a-f0-9]+)") ++ o_pki.default = hash and "sha1:" .. hash:upper() ++ complete = complete + 1 ++ found_pki = false ++ end ++ end ++ fd:close() ++end ++ ++function m.on_commit(map) ++ luci.sys.call("/usr/bin/occtl reload >/dev/null 2>&1") ++end ++ ++function e.write(self, section, value) ++ if value == "0" then ++ luci.sys.call("/etc/init.d/ocserv stop >/dev/null 2>&1") ++ luci.sys.call("/etc/init.d/ocserv disable >/dev/null 2>&1") ++ else ++ luci.sys.call("/etc/init.d/ocserv enable >/dev/null 2>&1") ++ luci.sys.call("/etc/init.d/ocserv restart >/dev/null 2>&1") ++ end ++ Flag.write(self, section, value) ++end ++ ++local o ++ ++o = s:taboption("general", ListValue, "auth", translate("User Authentication"), ++ translate("The authentication method for the users. The simplest is plain with a single username-password pair. Use PAM modules to authenticate using another server (e.g., LDAP, Radius).")) ++o.rmempty = false ++o.default = "plain" ++o:value("plain") ++o:value("PAM") ++ ++o = s:taboption("general", Value, "zone", translate("Firewall Zone"), ++ translate("The firewall zone that the VPN clients will be set to")) ++o.nocreate = true ++o.default = "lan" ++o.template = "cbi/firewall_zonelist" ++ ++s:taboption("general", Value, "port", translate("Port"), ++ translate("The same UDP and TCP ports will be used")) ++s:taboption("general", Value, "max_clients", translate("Max clients")) ++s:taboption("general", Value, "max_same", translate("Max same clients")) ++s:taboption("general", Value, "dpd", translate("Dead peer detection time (secs)")) ++ ++local pip = s:taboption("general", Flag, "predictable_ips", translate("Predictable IPs"), ++ translate("The assigned IPs will be selected deterministically")) ++pip.default = "1" ++ ++local compr = s:taboption("general", Flag, "compression", translate("Enable compression"), ++ translate("Enable compression")) ++compr.default = "1" ++ ++local udp = s:taboption("general", Flag, "udp", translate("Enable UDP"), ++ translate("Enable UDP channel support; this must be enabled unless you know what you are doing")) ++udp.default = "1" ++ ++local cisco = s:taboption("general", Flag, "cisco_compat", translate("AnyConnect client compatibility"), ++ translate("Enable support for CISCO AnyConnect clients")) ++cisco.default = "1" ++ ++ipaddr = s:taboption("general", Value, "ipaddr", translate("VPN IPv4-Network-Address")) ++ipaddr.datatype = "ip4addr" ++ipaddr.default = "192.168.100.1" ++ ++nm = s:taboption("general", Value, "netmask", translate("VPN IPv4-Netmask")) ++nm.datatype = "ip4addr" ++nm.default = "255.255.255.0" ++nm:value("255.255.255.0") ++nm:value("255.255.0.0") ++nm:value("255.0.0.0") ++ ++if has_ipv6 then ++ ip6addr = s:taboption("general", Value, "ip6addr", translate("VPN IPv6-Network-Address"), translate("CIDR-Notation: address/prefix")) ++ ip6addr.datatype = "ip6addr" ++end ++ ++ ++tmpl = s:taboption("template", Value, "_tmpl", ++ translate("Edit the template that is used for generating the ocserv configuration.")) ++ ++tmpl.template = "cbi/tvalue" ++tmpl.rows = 20 ++ ++function tmpl.cfgvalue(self, section) ++ return nixio.fs.readfile("/etc/ocserv/ocserv.conf.template") ++end ++ ++function tmpl.write(self, section, value) ++ value = value:gsub("\r\n?", "\n") ++ nixio.fs.writefile("/etc/ocserv/ocserv.conf.template", value) ++end ++ ++ca = s:taboption("ca", Value, "_ca", ++ translate("View the CA certificate used by this server. You will need to save it as 'ca.pem' and import it into the clients.")) ++ ++ca.template = "cbi/tvalue" ++ca.rows = 20 ++ ++function ca.cfgvalue(self, section) ++ return nixio.fs.readfile("/etc/ocserv/ca.pem") ++end ++ ++--[[DNS]]-- ++ ++s = m:section(TypedSection, "dns", translate("DNS servers"), ++ translate("The DNS servers to be provided to clients; can be either IPv6 or IPv4")) ++s.anonymous = true ++s.addremove = true ++s.template = "cbi/tblsection" ++ ++s:option(Value, "ip", translate("IP Address")).rmempty = true ++s.datatype = "ipaddr" ++ ++--[[Routes]]-- ++ ++s = m:section(TypedSection, "routes", translate("Routing table"), ++ translate("The routing table to be provided to clients; you can mix IPv4 and IPv6 routes, the server will send only the appropriate. Leave empty to set a default route")) ++s.anonymous = true ++s.addremove = true ++s.template = "cbi/tblsection" ++ ++s:option(Value, "ip", translate("IP Address")).rmempty = true ++ ++o = s:option(Value, "netmask", translate("Netmask (or IPv6-prefix)")) ++o.default = "255.255.255.0" ++o:value("255.255.255.0") ++o:value("255.255.0.0") ++o:value("255.0.0.0") ++ ++ ++return m +diff --git a/feeds/luci/applications/luci-app-ocserv/luasrc/model/cbi/ocserv/user-config.lua b/feeds/luci/applications/luci-app-ocserv/luasrc/model/cbi/ocserv/user-config.lua +new file mode 100644 +index 0000000..c50cb39 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-ocserv/luasrc/model/cbi/ocserv/user-config.lua +@@ -0,0 +1,139 @@ ++-- Copyright 2014 Nikos Mavrogiannopoulos ++-- Licensed to the public under the Apache License 2.0. ++ ++local fs = require "nixio.fs" ++local has_ipv6 = fs.access("/proc/net/ipv6_route") ++ ++m = Map("ocserv", translate("OpenConnect VPN")) ++ ++s = m:section(TypedSection, "ocserv", "OpenConnect") ++s.anonymous = true ++ ++s:tab("general", translate("General Settings")) ++s:tab("ca", translate("CA certificate")) ++s:tab("template", translate("Edit Template")) ++ ++local e = s:taboption("general", Flag, "enable", translate("Enable server")) ++e.rmempty = false ++e.default = "1" ++ ++function m.on_commit(map) ++ luci.sys.call("/usr/bin/occtl reload >/dev/null 2>&1") ++end ++ ++function e.write(self, section, value) ++ if value == "0" then ++ luci.sys.call("/etc/init.d/ocserv stop >/dev/null 2>&1") ++ luci.sys.call("/etc/init.d/ocserv disable >/dev/null 2>&1") ++ else ++ luci.sys.call("/etc/init.d/ocserv enable >/dev/null 2>&1") ++ luci.sys.call("/etc/init.d/ocserv restart >/dev/null 2>&1") ++ end ++ Flag.write(self, section, value) ++end ++ ++local o ++ ++o = s:taboption("general", ListValue, "auth", translate("User Authentication"), ++ translate("The authentication method for the users. The simplest is plain with a single username-password pair. Use PAM modules to authenticate using another server (e.g., LDAP, Radius).")) ++o.rmempty = false ++o.default = "plain" ++o:value("plain") ++o:value("PAM") ++ ++o = s:taboption("general", Value, "zone", translate("Firewall Zone"), ++ translate("The firewall zone that the VPN clients will be set to")) ++o.nocreate = true ++o.default = "lan" ++o.template = "cbi/firewall_zonelist" ++ ++s:taboption("general", Value, "port", translate("Port"), ++ translate("The same UDP and TCP ports will be used")) ++s:taboption("general", Value, "max_clients", translate("Max clients")) ++s:taboption("general", Value, "max_same", translate("Max same clients")) ++s:taboption("general", Value, "dpd", translate("Dead peer detection time (secs)")) ++ ++local pip = s:taboption("general", Flag, "predictable_ips", translate("Predictable IPs"), ++ translate("The assigned IPs will be selected deterministically")) ++pip.default = "1" ++ ++local udp = s:taboption("general", Flag, "udp", translate("Enable UDP"), ++ translate("Enable UDP channel support; this must be enabled unless you know what you are doing")) ++udp.default = "1" ++ ++local cisco = s:taboption("general", Flag, "cisco_compat", translate("AnyConnect client compatibility"), ++ translate("Enable support for CISCO AnyConnect clients")) ++cisco.default = "1" ++ ++ipaddr = s:taboption("general", Value, "ipaddr", translate("VPN IPv4-Network-Address")) ++ipaddr.default = "192.168.100.1" ++ipaddr.datatype = "ip4addr" ++ ++nm = s:taboption("general", Value, "netmask", translate("VPN IPv4-Netmask")) ++nm.default = "255.255.255.0" ++nm.datatype = "ip4addr" ++nm:value("255.255.255.0") ++nm:value("255.255.0.0") ++nm:value("255.0.0.0") ++ ++if has_ipv6 then ++ ip6addr = s:taboption("general", Value, "ip6addr", translate("VPN IPv6-Network-Address"), translate("CIDR-Notation: address/prefix")) ++end ++ ++ ++tmpl = s:taboption("template", Value, "_tmpl", ++ translate("Edit the template that is used for generating the ocserv configuration.")) ++ ++tmpl.template = "cbi/tvalue" ++tmpl.rows = 20 ++ ++function tmpl.cfgvalue(self, section) ++ return nixio.fs.readfile("/etc/ocserv/ocserv.conf.template") ++end ++ ++function tmpl.write(self, section, value) ++ value = value:gsub("\r\n?", "\n") ++ nixio.fs.writefile("/etc/ocserv/ocserv.conf.template", value) ++end ++ ++ca = s:taboption("ca", Value, "_ca", ++ translate("View the CA certificate used by this server. You will need to save it as 'ca.pem' and import it into the clients.")) ++ ++ca.template = "cbi/tvalue" ++ca.rows = 20 ++ ++function ca.cfgvalue(self, section) ++ return nixio.fs.readfile("/etc/ocserv/ca.pem") ++end ++ ++--[[DNS]]-- ++ ++s = m:section(TypedSection, "dns", translate("DNS servers"), ++ translate("The DNS servers to be provided to clients; can be either IPv6 or IPv4")) ++s.anonymous = true ++s.addremove = true ++s.template = "cbi/tblsection" ++ ++s:option(Value, "ip", translate("IP Address")).rmempty = true ++s.datatype = "ipaddr" ++ ++--[[Routes]]-- ++ ++s = m:section(TypedSection, "routes", translate("Routing table"), ++ translate("The routing table to be provided to clients; you can mix IPv4 and IPv6 routes, the server will send only the appropriate. Leave empty to set a default route")) ++s.anonymous = true ++s.addremove = true ++s.template = "cbi/tblsection" ++ ++s:option(Value, "ip", translate("IP Address")).rmempty = true ++s.datatype = "ipaddr" ++ ++o = s:option(Value, "netmask", translate("Netmask (or IPv6-prefix)")) ++o.default = "255.255.255.0" ++ ++o:value("255.255.255.0") ++o:value("255.255.0.0") ++o:value("255.0.0.0") ++ ++ ++return m +diff --git a/feeds/luci/applications/luci-app-ocserv/luasrc/model/cbi/ocserv/users.lua b/feeds/luci/applications/luci-app-ocserv/luasrc/model/cbi/ocserv/users.lua +new file mode 100644 +index 0000000..0fa997c +--- /dev/null ++++ b/feeds/luci/applications/luci-app-ocserv/luasrc/model/cbi/ocserv/users.lua +@@ -0,0 +1,75 @@ ++-- Copyright 2014 Nikos Mavrogiannopoulos ++-- Licensed to the public under the Apache License 2.0. ++ ++local dsp = require "luci.dispatcher" ++local nixio = require "nixio" ++ ++m = Map("ocserv", translate("OpenConnect VPN")) ++ ++if m.uci:get("ocserv", "config", "auth") == "plain" then ++ ++--[[Users]]-- ++ ++function m.on_commit(map) ++ luci.sys.call("/etc/init.d/ocserv restart >/dev/null 2>&1") ++end ++ ++s = m:section(TypedSection, "ocservusers", translate("Available users")) ++s.anonymous = true ++s.addremove = true ++s.template = "cbi/tblsection" ++ ++s:option(Value, "name", translate("Name")).rmempty = true ++s:option(DummyValue, "group", translate("Group")).rmempty = true ++pwd = s:option(Value, "password", translate("Password")) ++pwd.password = false ++ ++function pwd.write(self, section, value) ++ local pass ++ if string.match(value, "^\$%d\$.*") then ++ pass = value ++ else ++ local t = tonumber(nixio.getpid()*os.time()) ++ local salt = "$1$" .. t .. "$" ++ pass = nixio.crypt(value, salt) ++ end ++ Value.write(self, section, pass) ++end ++ ++--[[if plain]]-- ++end ++ ++local lusers = { } ++local fd = io.popen("/usr/bin/occtl show users", "r") ++if fd then local ln ++ repeat ++ ln = fd:read("*l") ++ if not ln then break end ++ ++ local id, user, group, vpn_ip, ip, device, time, cipher, status = ++ ln:match("^%s*(%d+)%s+([-_%w]+)%s+([%(%)%.%*-_%w]+)%s+([%:%.-_%w]+)%s+([%:%.-_%w]+)%s+([%:%.-_%w]+)%s+([%:%.-_%w]+)%s+([%(%)%:%.-_%w]+)%s+([%:%.-_%w]+).*") ++ if id then ++ table.insert(lusers, {id, user, group, vpn_ip, ip, device, time, cipher, status}) ++ end ++ until not ln ++ fd:close() ++end ++ ++ ++--[[Active Users]]-- ++ ++local s = m:section(Table, lusers, translate("Active users")) ++s.anonymous = true ++s.template = "cbi/tblsection" ++ ++s:option(DummyValue, 1, translate("ID")) ++s:option(DummyValue, 2, translate("Username")) ++s:option(DummyValue, 3, translate("Group")) ++s:option(DummyValue, 4, translate("IP")) ++s:option(DummyValue, 5, translate("VPN IP")) ++s:option(DummyValue, 6, translate("Device")) ++s:option(DummyValue, 7, translate("Time")) ++s:option(DummyValue, 8, translate("Cipher")) ++s:option(DummyValue, 9, translate("Status")) ++ ++return m +diff --git a/feeds/luci/applications/luci-app-ocserv/luasrc/view/admin_status/index/ocserv.htm b/feeds/luci/applications/luci-app-ocserv/luasrc/view/admin_status/index/ocserv.htm +new file mode 100644 +index 0000000..4575806 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-ocserv/luasrc/view/admin_status/index/ocserv.htm +@@ -0,0 +1 @@ ++<%+ocserv_status%> +diff --git a/feeds/luci/applications/luci-app-ocserv/luasrc/view/ocserv_status.htm b/feeds/luci/applications/luci-app-ocserv/luasrc/view/ocserv_status.htm +new file mode 100644 +index 0000000..fabc1bc +--- /dev/null ++++ b/feeds/luci/applications/luci-app-ocserv/luasrc/view/ocserv_status.htm +@@ -0,0 +1,76 @@ ++ ++ ++
    ++ <%:Active OpenConnect Users%> ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
    <%:User%><%:Group%><%:IP Address%><%:VPN IP Address%><%:Device%><%:Time%><%:Cipher%><%:Status%> 

    <%:Collecting data...%>
    ++
    +diff --git a/feeds/luci/applications/luci-app-olsr-services/Makefile b/feeds/luci/applications/luci-app-olsr-services/Makefile +new file mode 100644 +index 0000000..b1daf6d +--- /dev/null ++++ b/feeds/luci/applications/luci-app-olsr-services/Makefile +@@ -0,0 +1,14 @@ ++# ++# Copyright (C) 2008-2014 The LuCI Team ++# ++# This is free software, licensed under the Apache License, Version 2.0 . ++# ++ ++include $(TOPDIR)/rules.mk ++ ++LUCI_TITLE:=Show services announced with the nameservice plugin ++LUCI_DEPENDS:=+luci-app-olsr +olsrd +olsrd-mod-nameservice ++ ++include ../../luci.mk ++ ++# call BuildPackage - OpenWrt buildroot signature +diff --git a/feeds/luci/applications/luci-app-olsr-services/luasrc/controller/services.lua b/feeds/luci/applications/luci-app-olsr-services/luasrc/controller/services.lua +new file mode 100644 +index 0000000..a4636bf +--- /dev/null ++++ b/feeds/luci/applications/luci-app-olsr-services/luasrc/controller/services.lua +@@ -0,0 +1,16 @@ ++module "luci.controller.services" ++ ++function index() ++ local uci = require "luci.model.uci".cursor() ++ ++ uci:foreach("olsrd", "LoadPlugin", function(s) ++ if s.library == "olsrd_nameservice.so.0.3" then ++ has_serv = true ++ end ++ end) ++ ++ if has_serv then ++ entry({"freifunk", "services"}, template("freifunk-services/services"), _("Services"), 60) ++ end ++end ++ +diff --git a/feeds/luci/applications/luci-app-olsr-services/luasrc/view/freifunk-services/services.htm b/feeds/luci/applications/luci-app-olsr-services/luasrc/view/freifunk-services/services.htm +new file mode 100644 +index 0000000..0e59c61 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-olsr-services/luasrc/view/freifunk-services/services.htm +@@ -0,0 +1,193 @@ ++<%# ++ Copyright 2011 Manuel Munz ++ Licensed to the public under the Apache License 2.0. ++-%> ++ ++<% ++local fs = require "nixio.fs" ++local utl = require "luci.util" ++local last_update ++local i = 1 ++local rawdata ++local rawdata6 ++local services_file_empty = true ++local has_services = false ++local uci = require "luci.model.uci".cursor() ++local ip = require "luci.ip" ++ ++uci:foreach("olsrd", "LoadPlugin", function(s) ++ if s.library == "olsrd_nameservice.so.0.3" then ++ local services_file=s.services_file ++ if services_file and fs.access(services_file) then ++ has_services = true ++ rawdata = fs.readfile(s.services_file) ++ else ++ services_file="/var/run/services_olsr" ++ if fs.access(services_file) then ++ has_services = true ++ rawdata = fs.readfile(services_file) ++ end ++ end ++ services_file=services_file..".ipv6" ++ if services_file and fs.access(services_file) then ++ has_services = true ++ rawdata6 = fs.readfile(services_file) ++ else ++ services_file="/var/run/services_olsr.ipv6" ++ if fs.access(services_file) then ++ has_services = true ++ rawdata6 = fs.readfile(services_file) ++ end ++ end ++ if rawdata and #rawdata ~= 0 then ++ services_file_empty = nil ++ end ++ if rawdata6 and #rawdata6 ~= 0 then ++ services_file_empty = nil ++ end ++ end ++end) ++ ++ ++if not has_services or services_file_empty then ++%> ++ <%+header%> ++
    ++ <%:No services can be shown, because olsrd is not running or the olsrd-nameservice Plugin is not loaded.%> ++ <%+footer%> ++<% ++ return ++end ++ ++function fetch_services() ++ local tables = {} ++ if rawdata and #rawdata ~= 0 then ++ tables = utl.split(utl.trim(rawdata), "\n", nil, true) ++ -- remove first 3 lines ++ for i = 1,3 do ++ table.remove(tables,1) ++ end ++ end ++ local tables6 = {} ++ if rawdata6 and #rawdata6 ~= 0 then ++ tables6 = utl.split(utl.trim(rawdata6), "\n", nil, true) ++ -- remove first 3 lines ++ for i = 1,3 do ++ table.remove(tables6,1) ++ end ++ end ++ ++ -- store last line in last_update and remove it, then remove another empty line at the end ++ last_update=table.remove(tables) ++ table.remove(tables) ++ last_update=table.remove(tables6) ++ table.remove(tables6) ++ for k, v in ipairs(tables6) do ++ table.insert(tables, v) ++ end ++ return tables ++end ++local services = fetch_services() ++ ++if luci.http.formvalue("status") == "1" then ++ local rv = {} ++ for k, line in ipairs(services) do ++ local field = utl.split(line, "[#|]", split, true) ++ local origin_lnk = ip.IPv6(pcdata(field[4])) ++ local origin_link = "" ++ if origin_lnk and origin_lnk:is6() then ++ origin_link = "["..origin_lnk:string().."]" ++ else ++ origin_link = pcdata(field[4]) ++ end ++ local url, proto, descr, origin = pcdata(field[1]), pcdata(field[2]), utl.trim(pcdata(field[3])), pcdata(field[4]) ++ rv[#rv+1] = { ++ url = url, ++ proto = proto, ++ origin = origin, ++ origin_link = origin_link, ++ descr = descr, ++ } ++ end ++ luci.http.prepare_content("application/json") ++ luci.http.write_json(rv) ++ return ++end ++ ++%> ++ ++<%+header%> ++ ++ ++ ++ ++ ++ ++ ++

    <%:Services%>

    ++ ++
    ++ <%:Internal services%> ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ <% ++ for k, line in ipairs(services) do ++ local field = {} ++ -- split line at # and |, 1=url, 2=proto, 3=description, 4=source ++ local field = utl.split(line, "[#|]", split, true) ++ local origin_lnk = ip.IPv6(pcdata(field[4])) ++ local origin_link ++ if origin_lnk and origin_lnk:is6() then ++ origin_link = "["..origin_lnk:string().."]" ++ else ++ origin_link = pcdata(field[4]) ++ end ++ local url, proto, descr, origin = pcdata(field[1]), pcdata(field[2]), utl.trim(pcdata(field[3])), pcdata(field[4]) ++ %> ++ ++ ++ ++ ++ ++ ++ <% i = ((i % 2) + 1) ++ end %> ++ ++
    <%:Url%><%:Protocol%><%:Source%>
    <%=descr%><%=proto%><%=origin%>
    ++
    ++ <%=last_update%> ++
    ++<%+footer%> +diff --git a/feeds/luci/applications/luci-app-olsr-viz/Makefile b/feeds/luci/applications/luci-app-olsr-viz/Makefile +new file mode 100644 +index 0000000..e1a1185 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-olsr-viz/Makefile +@@ -0,0 +1,14 @@ ++# ++# Copyright (C) 2008-2014 The LuCI Team ++# ++# This is free software, licensed under the Apache License, Version 2.0 . ++# ++ ++include $(TOPDIR)/rules.mk ++ ++LUCI_TITLE:=OLSR Visualisation ++LUCI_DEPENDS:=+luci-app-olsr +olsrd +olsrd-mod-txtinfo ++ ++include ../../luci.mk ++ ++# call BuildPackage - OpenWrt buildroot signature +diff --git a/feeds/luci/applications/luci-app-olsr-viz/htdocs/cgi-bin/olsr-viz.sh b/feeds/luci/applications/luci-app-olsr-viz/htdocs/cgi-bin/olsr-viz.sh +new file mode 100755 +index 0000000..e33c632 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-olsr-viz/htdocs/cgi-bin/olsr-viz.sh +@@ -0,0 +1,40 @@ ++#!/bin/sh ++echo Content-type: text/html ++echo ++ ++cat << EOF ++ ++ ++
    ++
    ++
    ++
    ++
    ++
    ++

    Zoom +    ++|  Metrik +    ++|  Optimierung  ++|  Hostnamen  ++|  Speichern  ++|  Zurücksetzen

    ++
    ++ ++ ++ ++EOF +diff --git a/feeds/luci/applications/luci-app-olsr-viz/htdocs/cgi-bin/vizdata.sh b/feeds/luci/applications/luci-app-olsr-viz/htdocs/cgi-bin/vizdata.sh +new file mode 100755 +index 0000000..5a74f2b +--- /dev/null ++++ b/feeds/luci/applications/luci-app-olsr-viz/htdocs/cgi-bin/vizdata.sh +@@ -0,0 +1,48 @@ ++#!/bin/sh ++echo Content-type: text/html ++echo ++ ++cat< ++ ++ OLSR-VIZ Data ++ ++ ++ ++ ++ ++ ++ ++EOF +diff --git a/feeds/luci/applications/luci-app-olsr-viz/htdocs/luci-static/resources/olsr-viz.js b/feeds/luci/applications/luci-app-olsr-viz/htdocs/luci-static/resources/olsr-viz.js +new file mode 100644 +index 0000000..49435a4 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-olsr-viz/htdocs/luci-static/resources/olsr-viz.js +@@ -0,0 +1,818 @@ ++/* ++Copyright (c) 2006, Lorenz Schori ++All rights reserved (Naja: Ich hab' trotzdem was geaendert. Sven-Ola). (Naja: ++diese Rechte garantiert dir die BSD-Lizenz ja ausdrücklich. Lorenz) ++ ++Redistribution and use in source and binary forms, with or without ++modification, are permitted provided that the following conditions are met: ++ ++- Redistributions of source code must retain the above copyright notice, this ++ list of conditions and the following disclaimer. ++- 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. ++- Neither the name of the nor the names of its contributors may ++ be used to endorse or promote products derived from this software without ++ specific prior written permission. ++ ++THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" ++AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE ++IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE ++DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE ++FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL ++DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR ++SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER ++CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, ++OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE ++OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ++ ++OLSR-Viz is inspired by Wi-viz: http://wiviz.natetrue.com ++ ++Changes: ++2007-10-04: Added hostname display option -- Stefan Katerkamp . ++2007-10-04: Optimized display by moving presentation css out of js -- lo ++2010-12-11: Changed some paths to make it work with Kamikaze and Luci -- soma ++*/ ++ ++var cgi_url = "/cgi-bin/vizdata.sh"; ++ ++var maxmetric = 3; ++var iconvariant = "-mini"; ++var nodes = new Array(); ++var ncount = 0; ++var newnodes = new Array(); ++var edges = new Array(); ++var iel = 220; // ideal edge length ++var optsize = 10; // boundingbox around nodes ++ ++var vwidth = 0; ++var vheight = 0; ++ ++var xoff = 0; ++var yoff = 0; ++var scale = 1.0; ++ ++var idle_timeout = 15; ++var erase_timeout = 60; ++var dcl_timeout = 250; ++var dcllow_timeout = 500; ++var auto_declump = true; ++var showdesc = true; ++var auto_save = 1; ++var now_secs = 5; ++ ++// dom elements ++var IFrameObj; ++var maindiv; ++var nodediv; ++var edgediv; ++ ++/******* CALL TO SERVER ********/ ++function callToServer(URL) { ++ var IFrameDoc; ++ ++ if (IFrameObj.document) { ++ // For IE5 + opera ++ IFrameDoc = IFrameObj.document; ++ } ++ else if (IFrameObj.contentDocument) { ++ // For NS6 ++ IFrameDoc = IFrameObj.contentDocument; ++ } ++ else if (IFrameObj.contentWindow) { ++ // For IE5.5 and IE6 ++ IFrameDoc = IFrameObj.contentWindow.document; ++ } ++ else { ++ // opera? hmmmm ++ return true; ++ } ++ ++ IFrameDoc.location.replace(URL); ++ return false; ++} ++ ++ ++/******** EDGE CLASS ********/ ++function edge(n1,n2){ ++ this.getHTML = function() ++ { ++ var nh = ""; ++ ++ if(this.n1.metric > maxmetric || this.n2.metric > maxmetric) { ++ return ""; ++ } ++ ++ x = this.n1.x*scale; ++ y = this.n1.y*scale; ++ dx = this.n2.x*scale - x; ++ dy = this.n2.y*scale - y; ++ ++ x += xoff*scale + 75; ++ y += yoff*scale + 15; ++ ++ imgtag = " 2 && this.etx < 5) { ++ imgtag += "ok.gif'"; ++ } ++ else if(this.etx > 5 && this.etx < 10) { ++ imgtag += "weak.gif'"; ++ } ++ else { ++ imgtag += "down.gif'"; ++ } ++ imgtag += " alt='ETX: " + this.etx + "' title='ETX: " + this.etx + "' "; ++ ++ d = Math.sqrt(dx*dx+dy*dy); ++ ++ for (j = 0; j < d; j += 15) { ++ nh += imgtag + "style='top:" ++ + parseInt(y+dy * j / d) + "px; left:" ++ + parseInt(x+dx * j / d) + "px; " ++ + "width: 4px; height: 4px; position: absolute; z-index: 2' >"; ++ } ++ ++ nh += "
    " ++ + "" + this.etx + "
    "; ++ ++ return nh; ++ } ++ ++ this.isIdle = function() ++ { ++ return (now_secs - this.lastseen > idle_timeout); ++ } ++ ++ this.isDead = function() ++ { ++ return (now_secs - this.lastseen > erase_timeout); ++ } ++ ++ this.cleanup = function() ++ { ++ if(this.n1 && this.n1.weight) { ++ this.n1.weight--; ++ } ++ if(this.n2 && this.n2.weight) { ++ this.n2.weight--; ++ } ++ if(this.n1 && this.n2) { ++ delete this.n1.edges[n2.ip]; ++ delete this.n2.edges[n1.ip]; ++ } ++ } ++ ++ this.n1 = n1; ++ this.n2 = n2; ++ ++ // setup edges within node objects ++ this.n1.weight++; ++ this.n1.edges[n2.ip] = this; ++ this.n2.weight++; ++ this.n2.edges[n1.ip] = this; ++ ++ return this; ++} ++ ++function getEdgeKey(ip1,ip2) ++{ ++ key = ""; ++ if(ip1 > ip2) { ++ key = ip2 + "-" + ip1; ++ } ++ else { ++ key = ip1 + "-" + ip2; ++ } ++ return key; ++} ++ ++function touch_edge(n1,n2,etx) ++{ ++ var key = getEdgeKey(n1.ip,n2.ip); ++ var e = edges[key]; ++ if(!e) { ++ e = new edge(n1,n2); ++ edges[key] = e; ++ } ++ e.etx = etx; ++ e.lastseen = now_secs; ++ return e; ++} ++ ++/******** NODE CLASS ********/ ++function node(ip) { ++ this.getHTML = function() ++ { ++ var nh; ++ ++ if(this.metric > maxmetric) { ++ return ""; ++ } ++ var igw = 0; ++ for(h in this.hna) { ++ if(h == "0.0.0.0") { ++ igw = 1; ++ break; ++ } ++ } ++ nh = ++ "
    " ++ + "
    node " + this.ip + "
    " ++ + "" ++ + "" + this.ip + "" ++ + (showdesc && this.desc != "" ? ++ "
    " + this.desc + "" : "") ++ + "
    "; ++ return nh; ++ } ++ ++ this.isIdle = function() ++ { ++ return (now_secs - this.lastseen > idle_timeout); ++ } ++ ++ this.isDead = function() ++ { ++ return (now_secs - this.lastseen > erase_timeout); ++ } ++ ++ this.cleanup = function() ++ { ++ ncount--; ++ } ++ ++ this.set_metric = function(metric) { ++ this.metric = metric; ++ return this; ++ } ++ ++ this.set_desc = function(desc) { ++ this.desc = desc ++ return this; ++ } ++ ++ this.update = function() { ++ this.lastseen = now_secs; ++ return this; ++ } ++ ++ this.ip = ip; ++ this.x = 0; ++ this.y = 0; ++ this.dx_last=0; ++ this.dy_last=0; ++ this.placed = false; ++ this.weight = 0; ++ this.edges = new Array(); ++ this.hna = new Array(); ++ this.pinned = false; ++ this.metric = 999; ++ this.desc = ""; ++ ++ ncount++; ++ return this; ++} ++ ++function touch_node(ip) { ++ n = nodes[ip]; ++ if(!n) { ++ n = new node(ip); ++ nodes[ip] = n; ++ // newnodes.push(n); ++ // push and pop not supported in old ie. shit. ++ newnodes[newnodes.length] = n; ++ } ++ return n; ++} ++ ++function place_new_nodes() { ++ var nc = 0; ++ for(i = 0;i1){ ++ // see if we find allredy placed nodes ++ ox=0,oy=0;dx=0,dy=0;c=0; ++ for(e in n.edges){ ++ if(nodes[e] && nodes[e].placed){ ++ if(!ox && !oy) { ++ ox = nodes[e].x; ++ oy = nodes[e].y; ++ } ++ else { ++ dx += nodes[e].x - ox; ++ dy += nodes[e].y - oy; ++ } ++ c++; ++ } ++ } ++ if(c>0) { ++ n.x = ox + dx/c + Math.random()*iel/2-iel/4; ++ n.y = oy + dy/c + Math.random()*iel/2-iel/4; ++ } ++ } ++ else { ++ // beginn somewhere ++ n.x = Math.random()*400; ++ n.y = Math.random()*400; ++ } ++ n.placed = true; ++ nc++; ++ } ++ newnodes.length=0; ++ return nc; ++} ++ ++/******** HNA CLASS ********/ ++function hna(gw,net,mask) { ++ this.gw = gw; ++ this.net = net; ++ this.mask = mask; ++ return this; ++} ++ ++function touch_hna(node,net,mask) { ++ h = node.hna[net]; ++ if(!h) { ++ h = new hna(node.ip,net,mask); ++ node.hna[net] = h; ++ } ++ ++ h.lastseen = now_secs; ++ return h; ++} ++ ++/******** VIZ SETUP AND SETTINGS ********/ ++function viz_setup(iframeid,maindivid,nodedivid,edgedivid) { ++ // assign a reference to the ++ // object to our global variable IFrameObj. ++ IFrameObj=document.getElementById(iframeid); ++ if (document.frames) { ++ // this is for IE5 Mac, because it will only ++ // allow access to the document object ++ // of the IFrame if we access it through ++ // the document.frames array ++ IFrameObj = document.frames[iframeid]; ++ } ++ ++ draginit(); ++ ++ maindiv=document.getElementById(maindivid); ++ nodediv=document.getElementById(nodedivid); ++ edgediv=document.getElementById(edgedivid); ++ ++ // autosave on exit? ++ if((autosave = getCookie("prefs_autosave"))) { ++ auto_save = parseInt(autosave); ++ } ++ viz_autosave(auto_save); ++ ++ // maximum metric of surrounding nodes ++ if(mmx = getCookie("prefs_maxmetric")) { ++ set_maxmetric(mmx,true,true); ++ } ++ ++ // scale of view ++ if((savescale = getCookie("prefs_scale")) && ++ (savescale = parseFloat(savescale))) { ++ set_scale(savescale,true); ++ } ++ ++ // scroll - FIXME ++ /* ++ if(val = getCookie("prefs_innerview")) { ++ iv = val.split("x"); ++ if (iv[0] && (iv[0] = parseInt(iv[0])) && ++ iv[1] && (iv[2] = parseInt(iv[2])) && ++ iv[3] && (iv[3] = parseInt(iv[3])) && ++ iv[4] && (iv[4] = parseInt(iv[4]))) ++ { ++ maindiv.scrollLeft = iv[0] + "px"; ++ maindiv.scrollHeight = iv[1] + "px"; ++ } ++ } ++ */ ++} ++ ++function viz_save() ++{ ++ // let cookie survive a month ++ exp = new Date(); ++ exp.setTime(exp.getTime() + 2592000000); ++ // save node positions ++ for(ip in nodes) ++ { ++ if(nodes[ip].metric > maxmetric) { ++ continue; ++ } ++ setCookie("node_"+ip,nodes[ip].x+"x"+nodes[ip].y,exp); ++ } ++ ++ // save maxmetric ++ setCookie("prefs_maxmetric",maxmetric,exp); ++ ++ // save zooming ++ setCookie("prefs_scale",scale,exp); ++ ++ // save scroll - FIXME ++ setCookie("prefs_innerview", ++ parseInt(maindiv.scrollLeft)+"x"+parseInt(maindiv.scrollTop)+"x"+ ++ parseInt(vwidth*scale)+"x"+parseInt(vheight*scale),exp); ++} ++ ++function viz_autosave(autosave) ++{ ++ auto_save = autosave; ++ if(auto_save) { ++ document.body.onunload=viz_save; ++ } ++ else { ++ deleteCookie("prefs_autosave"); ++ } ++} ++ ++function viz_reset() ++{ ++ deleteAllCookies(); ++ for(ip in nodes) { ++ delete nodes[ip]; ++ } ++ for(e in edges) { ++ delete edges[e]; ++ } ++ viz_update(); ++} ++ ++var updateTimer = 0; ++function viz_update() { ++ if (updateTimer) { ++ clearTimeout(updateTimer); ++ } ++ now_secs = new Date().getTime()/1000; ++ callToServer(cgi_url); ++} ++ ++function viz_callback() { ++ if (updateTimer) { ++ clearTimeout(updateTimer); ++ } ++ ++ if(place_new_nodes() > 0 && auto_declump) { ++ declump(); ++ } ++ refresh(); ++ updateTimer = setTimeout('viz_update()', 5000); ++} ++ ++var refresh_running = false; ++function refresh() { ++ if(refresh_running) { ++ return; ++ } ++ refresh_running = true; ++ ++ var nh = ""; ++ ++ // refresh nodes ++ nh = ""; ++ for (var n in nodes) { ++ if(nodes[n].isDead()) { ++ nodes[n].cleanup(); ++ delete nodes[n]; ++ } ++ else { ++ nh += nodes[n].getHTML(); ++ } ++ } ++ nodediv.innerHTML = nh; ++ ++ // refresh edges ++ ++ nh = ""; ++ for (var e in edges) { ++ if(edges[e].isDead()) { ++ edges[e].cleanup(); ++ delete edges[e]; ++ } ++ else { ++ nh += edges[e].getHTML(); ++ } ++ } ++ edgediv.innerHTML = nh; ++ refresh_running = false; ++} ++ ++function set_showdesc(doit) ++{ ++ showdesc = doit; ++ if(!noupdate) refresh(); ++} ++ ++function set_autodeclump(doit) ++{ ++ auto_declump = doit; ++ if(doit) { ++ declump(); ++ } ++ else { ++ clearTimeout(dclTimer); ++ } ++} ++ ++function set_scale(inscale,noupdate) ++{ ++ if(!inscale) { ++ inscale = parseFloat(document.getElementById("zoom").value/2); ++ } ++ scale = Math.round(inscale*100)/100; ++ if(!scale || scale<0.1) { ++ scale = 0.1; ++ } ++ document.getElementById("zoom").value = scale*2; ++ if(!noupdate) refresh(); ++} ++ ++function set_maxmetric(inmetric,noupdate,noconfirm) ++{ ++ inmetric = parseInt(inmetric); ++ if(inmetric > 0 || !noconfirm || confirm("warning. setting the maximum metric to zero can lead to expensive calculations if you are connected to a network with many nodes. do you want to proceed?")) { ++ maxmetric = inmetric; ++ } ++ document.getElementById("maxmetric").value = maxmetric; ++ if(!noupdate) refresh(); ++} ++ ++// k = area / nodes ++function fr(x) { ++ return Math.pow((iel*iel)/x,2); ++} ++ ++function fa(x) { ++ return Math.pow((x*x)/iel,2); ++} ++ ++var dclTimer = 0; ++var declump_running = false; ++function declump(t) { ++ // clear declump timer ++ if(dclTimer) { ++ clearTimeout(dclTimer); ++ } ++ if(declump_running) { ++ return; ++ } ++ declump_running = true; ++ ++ // nodes ++ nc = 0; ++ for (var ip1 in nodes) { ++ nodes[ip1].fr_x=0; ++ nodes[ip1].fr_y=0; ++ nodes[ip1].fa_x=0; ++ nodes[ip1].fa_y=0; ++ nodes[ip1].x_next = nodes[ip1].x; ++ nodes[ip1].y_next = nodes[ip1].y; ++ nodes[ip1].randdisplace = 0; ++ } ++ for (var ip1 in nodes) { ++ if(nodes[ip1].metric > maxmetric || nodes[ip1].pinned) { ++ continue; ++ } ++ for (ip2 in nodes) { ++ if (nodes[ip2].metric > maxmetric || ip1 == ip2) { ++ continue; ++ } ++ dx = (nodes[ip1].x_next - nodes[ip2].x_next); ++ dy = (nodes[ip1].y_next - nodes[ip2].y_next); ++ d = Math.sqrt(dx*dx+dy*dy); ++ d = Math.max(d-optsize,(d+optsize)/optsize); ++ ++ nodes[ip1].fr_x += (dx/d) * fr(d); ++ nodes[ip1].fr_y += (dy/d) * fr(d); ++ } ++ ++ dx = nodes[ip1].fr_x; ++ dy = nodes[ip1].fr_y; ++ d = Math.sqrt(dx*dx+dy*dy); ++ md = Math.min(d,iel/nodes[ip1].weight); ++ nodes[ip1].x_next += (dx / d) * md; ++ nodes[ip1].y_next += (dy / d) * md; ++ nc++; ++ } ++ ++ // edges ++ ec = 0; ++ for (var e in edges) { ++ if (!edges[e].n1 || !edges[e].n2 || ++ edges[e].n1.metric > maxmetric || edges[e].n2.metric > maxmetric) { ++ continue; ++ } ++ dx = (edges[e].n1.x_next - edges[e].n2.x_next); ++ dy = (edges[e].n1.y_next - edges[e].n2.y_next); ++ d = Math.sqrt(dx*dx+dy*dy); ++// d = Math.max(d-optsize,(d+optsize)/optsize); ++ ++ edges[e].n1.fa_x -= (dx/d) * fa(d); ++ edges[e].n1.fa_y -= (dy/d) * fa(d); ++ edges[e].n2.fa_x += (dx/d) * fa(d); ++ edges[e].n2.fa_y += (dy/d) * fa(d); ++ ec++; ++ } ++ ++ // displacement ++ xmin=-20;ymin=-20;xmax=20;ymax=20;dsum=0; ++ for (var ip in nodes) { ++ if(nodes[ip].metric > maxmetric || nodes[ip].pinned) { ++ continue; ++ } ++ ++ dx = nodes[ip].fa_x; ++ dy = nodes[ip].fa_y; ++ d = Math.sqrt(dx*dx+dy*dy); ++ dx = (dx / d) * Math.min(d,iel/nodes[ip].weight) * 0.75 + nodes[ip].dx_last * 0.25; ++ dy = (dy / d) * Math.min(d,iel/nodes[ip].weight) * 0.75 + nodes[ip].dy_last * 0.25; ++ ++ nodes[ip].dx_last = dx; ++ nodes[ip].dy_last = dy; ++ nodes[ip].x_next += dx; ++ nodes[ip].y_next += dy; ++ ++ if(!nodes[ip].x_next || !nodes[ip].y_next) { ++ continue; ++ } ++ ++ dx = (nodes[ip].x - nodes[ip].x_next); ++ dy = (nodes[ip].y - nodes[ip].y_next); ++ dsum += Math.sqrt(dx*dx+dy*dy); ++ ++ nodes[ip].x = nodes[ip].x_next; ++ nodes[ip].y = nodes[ip].y_next; ++ ++ xmin = Math.min(xmin,nodes[ip].x); ++ xmax = Math.max(xmax,nodes[ip].x); ++ ymin = Math.min(ymin,nodes[ip].y); ++ ymax = Math.max(ymax,nodes[ip].y); ++ } ++ vwidth=(xmax-xmin); ++ vheight=(ymax-ymin); ++ ++ xoff=-xmin; ++ yoff=-ymin; ++ /* ++ document.getElementById('debug').innerHTML = "
    " + ++ "offset: " + xoff + "x" + yoff + " dsum: " + dsum + "
    " + ++ "nc: " + nc + " ec: " + ec + "xmax: " + xmax + " xmin: " + xmin + "
    " + ++ "optsize: " + optsize + "
    "; ++ */ ++ refresh(); ++ if(auto_declump) { ++ dclTimer = setTimeout("declump()", dsum>ncount ? dcl_timeout : dcllow_timeout ); ++ } ++ declump_running = false; ++} ++ ++//Das Objekt, das gerade bewegt wird. ++var dragip = null; ++ ++// Position, an der das Objekt angeklickt wurde. ++var dragx = 0; ++var dragy = 0; ++ ++// Mausposition ++var posx = 0; ++var posy = 0; ++ ++function draginit() { ++ // Initialisierung der ãberwachung der Events ++ ++ document.onmousemove = drag; ++ document.onmouseup = dragstop; ++} ++ ++ ++function dragstart(element) { ++ //Wird aufgerufen, wenn ein Objekt bewegt werden soll. ++ dragip = element.id.split("_")[1]; ++ dragx = posx - element.offsetLeft; ++ dragy = posy - element.offsetTop; ++ ++ n = nodes[dragip]; ++ if(n) { ++ n.pinned = true; ++ } ++} ++ ++ ++function dragstop() { ++ //Wird aufgerufen, wenn ein Objekt nicht mehr bewegt werden soll. ++ ++ n = nodes[dragip]; ++ if(n) { ++ n.pinned = false; ++ } ++ refresh(); ++ dragip=null; ++} ++ ++ ++function drag(ereignis) { ++ //Wird aufgerufen, wenn die Maus bewegt wird und bewegt bei Bedarf das Objekt. ++ ++ posx = document.all ? window.event.clientX : ereignis.pageX; ++ posy = document.all ? window.event.clientY : ereignis.pageY; ++ if(dragip != null) { ++ n = nodes[dragip]; ++ if(n) { ++ n.x = (posx - dragx)/scale - xoff; ++ n.y = (posy - dragy)/scale - yoff; ++ } ++ e = document.getElementById('node_'+dragip); ++ e.style.left = parseInt((n.x+xoff)*scale) + "px"; ++ e.style.top = parseInt((n.y+yoff)*scale) + "px"; ++ } ++} ++ ++function debug_writeln(line) ++{ ++ document.getElementById('debug').innerHTML = line + "
    " + document.getElementById('debug').innerHTML; ++} ++ ++/** ++ * Sets a Cookie with the given name and value. ++ * ++ * name Name of the cookie ++ * value Value of the cookie ++ * [expires] Expiration date of the cookie (default: end of current session) ++ * [path] Path where the cookie is valid (default: path of calling document) ++ * [domain] Domain where the cookie is valid ++ * (default: domain of calling document) ++ * [secure] Boolean value indicating if the cookie transmission requires a ++ * secure transmission ++ */ ++ ++function setCookie(name, value, expires, path, domain, secure) { ++ document.cookie= name + "=" + escape(value) + ++ ((expires) ? "; expires=" + expires.toGMTString() : "") + ++ ((path) ? "; path=" + path : "") + ++ ((domain) ? "; domain=" + domain : "") + ++ ((secure) ? "; secure" : ""); ++} ++ ++/** ++ * Gets the value of the specified cookie. ++ * ++ * name Name of the desired cookie. ++ * ++ * Returns a string containing value of specified cookie, ++ * or null if cookie does not exist. ++ */ ++ ++function getCookie(name) ++{ ++ var results = document.cookie.match ( name + '=(.*?)(;|$)' ); ++ if (results) { ++ return unescape(results[1]); ++ } ++ return null; ++} ++ ++/** ++ * Deletes the specified cookie. ++ * ++ * name name of the cookie ++ * [path] path of the cookie (must be same as path used to create cookie) ++ * [domain] domain of the cookie (must be same as domain used to create cookie) ++ */ ++ ++function deleteCookie(name, path, domain) { ++ if (getCookie(name)) { ++ document.cookie = name + "=" + ++ ((path) ? "; path=" + path : "") + ++ ((domain) ? "; domain=" + domain : "") + ++ "; expires=Thu, 01-Jan-70 00:00:01 GMT"; ++ } ++} ++ ++function deleteAllCookies() { ++ cookies = document.cookie.split("; "); ++ for(i=0;i ++ ++ ++ ++ ++<%+footer%> +diff --git a/feeds/luci/applications/luci-app-olsr/Makefile b/feeds/luci/applications/luci-app-olsr/Makefile +new file mode 100644 +index 0000000..93815a5 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-olsr/Makefile +@@ -0,0 +1,14 @@ ++# ++# Copyright (C) 2008-2014 The LuCI Team ++# ++# This is free software, licensed under the Apache License, Version 2.0 . ++# ++ ++include $(TOPDIR)/rules.mk ++ ++LUCI_TITLE:=OLSR configuration and status module ++LUCI_DEPENDS:=+olsrd +olsrd-mod-jsoninfo +luci-lib-luaneightbl +luci-lib-json ++ ++include ../../luci.mk ++ ++# call BuildPackage - OpenWrt buildroot signature +diff --git a/feeds/luci/applications/luci-app-olsr/htdocs/cgi-bin-nodes.html b/feeds/luci/applications/luci-app-olsr/htdocs/cgi-bin-nodes.html +new file mode 120000 +index 0000000..80d235f +--- /dev/null ++++ b/feeds/luci/applications/luci-app-olsr/htdocs/cgi-bin-nodes.html +@@ -0,0 +1 @@ ++cgi-bin-status.html +\ No newline at end of file +diff --git a/feeds/luci/applications/luci-app-olsr/htdocs/cgi-bin-status.html b/feeds/luci/applications/luci-app-olsr/htdocs/cgi-bin-status.html +new file mode 100644 +index 0000000..0270f4a +--- /dev/null ++++ b/feeds/luci/applications/luci-app-olsr/htdocs/cgi-bin-status.html +@@ -0,0 +1,10 @@ ++ ++ ++ ++ ++ ++ ++ ++LuCI - Lua Configuration Interface ++ ++ +diff --git a/feeds/luci/applications/luci-app-olsr/luasrc/controller/olsr.lua b/feeds/luci/applications/luci-app-olsr/luasrc/controller/olsr.lua +new file mode 100644 +index 0000000..cfadd9b +--- /dev/null ++++ b/feeds/luci/applications/luci-app-olsr/luasrc/controller/olsr.lua +@@ -0,0 +1,424 @@ ++module("luci.controller.olsr", package.seeall) ++ ++local neigh_table = nil ++local ifaddr_table = nil ++ ++function index() ++ local ipv4,ipv6 ++ if nixio.fs.access("/etc/config/olsrd") then ++ ipv4 = 1 ++ end ++ if nixio.fs.access("/etc/config/olsrd6") then ++ ipv6 = 1 ++ end ++ if not ipv4 and not ipv6 then ++ return ++ end ++ ++ require("luci.model.uci") ++ local uci = luci.model.uci.cursor_state() ++ ++ uci:foreach("olsrd", "olsrd", function(s) ++ if s.SmartGateway and s.SmartGateway == "yes" then has_smartgw = true end ++ end) ++ ++ local page = node("admin", "status", "olsr") ++ page.target = template("status-olsr/overview") ++ page.title = _("OLSR") ++ page.subindex = true ++ ++ local page = node("admin", "status", "olsr", "json") ++ page.target = call("action_json") ++ page.title = nil ++ page.leaf = true ++ ++ local page = node("admin", "status", "olsr", "neighbors") ++ page.target = call("action_neigh") ++ page.title = _("Neighbours") ++ page.subindex = true ++ page.order = 5 ++ ++ local page = node("admin", "status", "olsr", "routes") ++ page.target = call("action_routes") ++ page.title = _("Routes") ++ page.order = 10 ++ ++ local page = node("admin", "status", "olsr", "topology") ++ page.target = call("action_topology") ++ page.title = _("Topology") ++ page.order = 20 ++ ++ local page = node("admin", "status", "olsr", "hna") ++ page.target = call("action_hna") ++ page.title = _("HNA") ++ page.order = 30 ++ ++ local page = node("admin", "status", "olsr", "mid") ++ page.target = call("action_mid") ++ page.title = _("MID") ++ page.order = 50 ++ ++ if has_smartgw then ++ local page = node("admin", "status", "olsr", "smartgw") ++ page.target = call("action_smartgw") ++ page.title = _("SmartGW") ++ page.order = 60 ++ end ++ ++ local page = node("admin", "status", "olsr", "interfaces") ++ page.target = call("action_interfaces") ++ page.title = _("Interfaces") ++ page.order = 70 ++ ++ odsp = entry( ++ {"admin", "services", "olsrd", "display"}, ++ cbi("olsr/olsrddisplay"), _("Display") ++ ) ++ ++end ++ ++function action_json() ++ local http = require "luci.http" ++ local utl = require "luci.util" ++ local uci = require "luci.model.uci".cursor() ++ local jsonreq4 ++ local jsonreq6 ++ ++ local v4_port = uci:get("olsrd", "olsrd_jsoninfo", "port") or 9090 ++ local v6_port = uci:get("olsrd6", "olsrd_jsoninfo", "port") or 9090 ++ ++ jsonreq4 = utl.exec("(echo /status | nc 127.0.0.1 " .. v4_port .. ") 2>/dev/null" ) ++ jsonreq6 = utl.exec("(echo /status | nc ::1 " .. v6_port .. ") 2>/dev/null") ++ http.prepare_content("application/json") ++ if not jsonreq4 or jsonreq4 == "" then ++ jsonreq4 = "{}" ++ end ++ if not jsonreq6 or jsonreq6 == "" then ++ jsonreq6 = "{}" ++ end ++ http.write('{"v4":' .. jsonreq4 .. ', "v6":' .. jsonreq6 .. '}') ++end ++ ++ ++local function local_mac_lookup(ipaddr) ++ local _, ifa, dev ++ ++ ipaddr = tostring(ipaddr) ++ ++ if not ifaddr_table then ++ ifaddr_table = nixio.getifaddrs() ++ end ++ ++ -- ipaddr -> ifname ++ for _, ifa in ipairs(ifaddr_table) do ++ if ifa.addr == ipaddr then ++ dev = ifa.name ++ break ++ end ++ end ++ ++ -- ifname -> macaddr ++ for _, ifa in ipairs(ifaddr_table) do ++ if ifa.name == dev and ifa.family == "packet" then ++ return ifa.addr ++ end ++ end ++end ++ ++local function remote_mac_lookup(ipaddr) ++ local _, n ++ ++ if not neigh_table then ++ neigh_table = luci.ip.neighbors() ++ end ++ ++ for _, n in ipairs(neigh_table) do ++ if n.mac and n.dest and n.dest:equal(ipaddr) then ++ return n.mac ++ end ++ end ++end ++ ++function action_neigh(json) ++ local data, has_v4, has_v6, error = fetch_jsoninfo('links') ++ ++ if error then ++ return ++ end ++ ++ local uci = require "luci.model.uci".cursor_state() ++ local resolve = uci:get("luci_olsr", "general", "resolve") ++ local ntm = require "luci.model.network".init() ++ local devices = ntm:get_wifidevs() ++ local sys = require "luci.sys" ++ local assoclist = {} ++ --local neightbl = require "neightbl" ++ local ntm = require "luci.model.network" ++ local ipc = require "luci.ip" ++ local nxo = require "nixio" ++ local defaultgw ++ ++ ipc.routes({ family = 4, type = 1, dest_exact = "0.0.0.0/0" }, ++ function(rt) defaultgw = rt.gw end) ++ ++ local function compare(a,b) ++ if a.proto == b.proto then ++ return a.linkCost < b.linkCost ++ else ++ return a.proto < b.proto ++ end ++ end ++ ++ for _, dev in ipairs(devices) do ++ for _, net in ipairs(dev:get_wifinets()) do ++ assoclist[#assoclist+1] = {} ++ assoclist[#assoclist]['ifname'] = net.iwdata.ifname ++ assoclist[#assoclist]['network'] = net.iwdata.network ++ assoclist[#assoclist]['device'] = net.iwdata.device ++ assoclist[#assoclist]['list'] = net.iwinfo.assoclist ++ end ++ end ++ ++ for k, v in ipairs(data) do ++ local snr = 0 ++ local signal = 0 ++ local noise = 0 ++ local mac = "" ++ local ip ++ local neihgt = {} ++ ++ if resolve == "1" then ++ hostname = nixio.getnameinfo(v.remoteIP, nil, 100) ++ if hostname then ++ v.hostname = hostname ++ end ++ end ++ ++ local interface = ntm:get_status_by_address(v.localIP) ++ local lmac = local_mac_lookup(v.localIP) ++ local rmac = remote_mac_lookup(v.remoteIP) ++ ++ for _, val in ipairs(assoclist) do ++ if val.network == interface and val.list then ++ for assocmac, assot in pairs(val.list) do ++ assocmac = string.lower(assocmac or "") ++ if rmac == assocmac then ++ signal = tonumber(assot.signal) ++ noise = tonumber(assot.noise) ++ snr = (noise*-1) - (signal*-1) ++ end ++ end ++ end ++ end ++ if interface then ++ v.interface = interface ++ end ++ v.snr = snr ++ v.signal = signal ++ v.noise = noise ++ if rmac then ++ v.remoteMAC = rmac ++ end ++ if lmac then ++ v.localMAC = lmac ++ end ++ ++ if defaultgw == v.remoteIP then ++ v.defaultgw = 1 ++ end ++ end ++ ++ table.sort(data, compare) ++ luci.template.render("status-olsr/neighbors", {links=data, has_v4=has_v4, has_v6=has_v6}) ++end ++ ++function action_routes() ++ local data, has_v4, has_v6, error = fetch_jsoninfo('routes') ++ if error then ++ return ++ end ++ ++ local uci = require "luci.model.uci".cursor_state() ++ local resolve = uci:get("luci_olsr", "general", "resolve") ++ ++ for k, v in ipairs(data) do ++ if resolve == "1" then ++ local hostname = nixio.getnameinfo(v.gateway, nil, 100) ++ if hostname then ++ v.hostname = hostname ++ end ++ end ++ end ++ ++ local function compare(a,b) ++ if a.proto == b.proto then ++ return a.rtpMetricCost < b.rtpMetricCost ++ else ++ return a.proto < b.proto ++ end ++ end ++ ++ table.sort(data, compare) ++ luci.template.render("status-olsr/routes", {routes=data, has_v4=has_v4, has_v6=has_v6}) ++end ++ ++function action_topology() ++ local data, has_v4, has_v6, error = fetch_jsoninfo('topology') ++ if error then ++ return ++ end ++ ++ local function compare(a,b) ++ if a.proto == b.proto then ++ return a.tcEdgeCost < b.tcEdgeCost ++ else ++ return a.proto < b.proto ++ end ++ end ++ ++ table.sort(data, compare) ++ luci.template.render("status-olsr/topology", {routes=data, has_v4=has_v4, has_v6=has_v6}) ++end ++ ++function action_hna() ++ local data, has_v4, has_v6, error = fetch_jsoninfo('hna') ++ if error then ++ return ++ end ++ ++ local uci = require "luci.model.uci".cursor_state() ++ local resolve = uci:get("luci_olsr", "general", "resolve") ++ ++ local function compare(a,b) ++ if a.proto == b.proto then ++ return a.genmask < b.genmask ++ else ++ return a.proto < b.proto ++ end ++ end ++ ++ for k, v in ipairs(data) do ++ if resolve == "1" then ++ hostname = nixio.getnameinfo(v.gateway, nil, 100) ++ if hostname then ++ v.hostname = hostname ++ end ++ end ++ if v.validityTime then ++ v.validityTime = tonumber(string.format("%.0f", v.validityTime / 1000)) ++ end ++ end ++ ++ table.sort(data, compare) ++ luci.template.render("status-olsr/hna", {hna=data, has_v4=has_v4, has_v6=has_v6}) ++end ++ ++function action_mid() ++ local data, has_v4, has_v6, error = fetch_jsoninfo('mid') ++ if error then ++ return ++ end ++ ++ local function compare(a,b) ++ if a.proto == b.proto then ++ return a.ipAddress < b.ipAddress ++ else ++ return a.proto < b.proto ++ end ++ end ++ ++ table.sort(data, compare) ++ luci.template.render("status-olsr/mid", {mids=data, has_v4=has_v4, has_v6=has_v6}) ++end ++ ++function action_smartgw() ++ local data, has_v4, has_v6, error = fetch_jsoninfo('gateways') ++ if error then ++ return ++ end ++ ++ local function compare(a,b) ++ if a.proto == b.proto then ++ return a.tcPathCost < b.tcPathCost ++ else ++ return a.proto < b.proto ++ end ++ end ++ ++ table.sort(data, compare) ++ luci.template.render("status-olsr/smartgw", {gws=data, has_v4=has_v4, has_v6=has_v6}) ++end ++ ++function action_interfaces() ++ local data, has_v4, has_v6, error = fetch_jsoninfo('interfaces') ++ if error then ++ return ++ end ++ ++ local function compare(a,b) ++ return a.proto < b.proto ++ end ++ ++ table.sort(data, compare) ++ luci.template.render("status-olsr/interfaces", {iface=data, has_v4=has_v4, has_v6=has_v6}) ++end ++ ++-- Internal ++function fetch_jsoninfo(otable) ++ local uci = require "luci.model.uci".cursor_state() ++ local utl = require "luci.util" ++ local json = require "luci.json" ++ local IpVersion = uci:get_first("olsrd", "olsrd","IpVersion") ++ local jsonreq4 = "" ++ local jsonreq6 = "" ++ local v4_port = uci:get("olsrd", "olsrd_jsoninfo", "port") or 9090 ++ local v6_port = uci:get("olsrd6", "olsrd_jsoninfo", "port") or 9090 ++ ++ jsonreq4 = utl.exec("(echo /" .. otable .. " | nc 127.0.0.1 " .. v4_port .. ") 2>/dev/null") ++ jsonreq6 = utl.exec("(echo /" .. otable .. " | nc ::1 " .. v6_port .. ") 2>/dev/null") ++ local jsondata4 = {} ++ local jsondata6 = {} ++ local data4 = {} ++ local data6 = {} ++ local has_v4 = False ++ local has_v6 = False ++ ++ if jsonreq4 == '' and jsonreq6 == '' then ++ luci.template.render("status-olsr/error_olsr") ++ return nil, 0, 0, true ++ end ++ ++ if jsonreq4 ~= "" then ++ has_v4 = 1 ++ jsondata4 = json.decode(jsonreq4) ++ if otable == 'status' then ++ data4 = jsondata4 or {} ++ else ++ data4 = jsondata4[otable] or {} ++ end ++ ++ for k, v in ipairs(data4) do ++ data4[k]['proto'] = '4' ++ end ++ ++ end ++ if jsonreq6 ~= "" then ++ has_v6 = 1 ++ jsondata6 = json.decode(jsonreq6) ++ if otable == 'status' then ++ data6 = jsondata6 or {} ++ else ++ data6 = jsondata6[otable] or {} ++ end ++ for k, v in ipairs(data6) do ++ data6[k]['proto'] = '6' ++ end ++ end ++ ++ for k, v in ipairs(data6) do ++ table.insert(data4, v) ++ end ++ ++ return data4, has_v4, has_v6, false ++end ++ +diff --git a/feeds/luci/applications/luci-app-olsr/luasrc/controller/olsr4.lua b/feeds/luci/applications/luci-app-olsr/luasrc/controller/olsr4.lua +new file mode 100644 +index 0000000..31a3101 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-olsr/luasrc/controller/olsr4.lua +@@ -0,0 +1,47 @@ ++module("luci.controller.olsr4", package.seeall) ++ ++function index() ++ if not nixio.fs.access("/etc/config/olsrd") then ++ return ++ end ++ ++ require("luci.model.uci") ++ local uci = luci.model.uci.cursor_state() ++ ++ local ol = entry( ++ {"admin", "services", "olsrd"}, ++ cbi("olsr/olsrd"), "OLSR IPv4" ++ ) ++ ol.subindex = true ++ ++ entry( ++ {"admin", "services", "olsrd", "iface"}, ++ cbi("olsr/olsrdiface") ++ ).leaf = true ++ ++ entry( ++ {"admin", "services", "olsrd", "hna"}, ++ cbi("olsr/olsrdhna"), _("HNA Announcements") ++ ) ++ ++ oplg = entry( ++ {"admin", "services", "olsrd", "plugins"}, ++ cbi("olsr/olsrdplugins"), _("Plugins") ++ ) ++ ++ oplg.leaf = true ++ oplg.subindex = true ++ ++ local uci = require("luci.model.uci").cursor() ++ uci:foreach("olsrd", "LoadPlugin", ++ function (section) ++ local lib = section.library ++ entry( ++ {"admin", "services", "olsrd", "plugins", lib }, ++ cbi("olsr/olsrdplugins"), ++ nil --'Plugin "%s"' % lib:gsub("^olsrd_",""):gsub("%.so.+$","") ++ ) ++ end ++ ) ++end ++ +diff --git a/feeds/luci/applications/luci-app-olsr/luasrc/controller/olsr6.lua b/feeds/luci/applications/luci-app-olsr/luasrc/controller/olsr6.lua +new file mode 100644 +index 0000000..9fbaa04 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-olsr/luasrc/controller/olsr6.lua +@@ -0,0 +1,47 @@ ++module("luci.controller.olsr6", package.seeall) ++ ++function index() ++ if not nixio.fs.access("/etc/config/olsrd6") then ++ return ++ end ++ ++ require("luci.model.uci") ++ local uci = luci.model.uci.cursor_state() ++ ++ local ol = entry( ++ {"admin", "services", "olsrd6"}, ++ cbi("olsr/olsrd6"), "OLSR IPv6" ++ ) ++ ol.subindex = true ++ ++ entry( ++ {"admin", "services", "olsrd6", "iface"}, ++ cbi("olsr/olsrdiface6") ++ ).leaf = true ++ ++ entry( ++ {"admin", "services", "olsrd6", "hna"}, ++ cbi("olsr/olsrdhna6"), _("HNA6 Announcements") ++ ) ++ ++ oplg = entry( ++ {"admin", "services", "olsrd6", "plugins"}, ++ cbi("olsr/olsrdplugins6"), _("Plugins") ++ ) ++ ++ oplg.leaf = true ++ oplg.subindex = true ++ ++ local uci = require("luci.model.uci").cursor() ++ uci:foreach("olsrd6", "LoadPlugin", ++ function (section) ++ local lib = section.library ++ entry( ++ {"admin", "services", "olsrd6", "plugins", lib }, ++ cbi("olsr/olsrdplugins6"), ++ nil --'Plugin "%s"' % lib:gsub("^olsrd_",""):gsub("%.so.+$","") ++ ) ++ end ++ ) ++end ++ +diff --git a/feeds/luci/applications/luci-app-olsr/luasrc/model/cbi/olsr/olsrd.lua b/feeds/luci/applications/luci-app-olsr/luasrc/model/cbi/olsr/olsrd.lua +new file mode 100644 +index 0000000..a075bcf +--- /dev/null ++++ b/feeds/luci/applications/luci-app-olsr/luasrc/model/cbi/olsr/olsrd.lua +@@ -0,0 +1,409 @@ ++-- Copyright 2008 Steven Barth ++-- Copyright 2010 Jo-Philipp Wich ++-- Licensed to the public under the Apache License 2.0. ++ ++require("luci.tools.webadmin") ++local fs = require "nixio.fs" ++local util = require "luci.util" ++local ip = require "luci.ip" ++ ++local has_ipip = fs.glob("/etc/modules.d/[0-9]*-ipip")() ++ ++m = Map("olsrd", translate("OLSR Daemon"), ++ translate("The OLSR daemon is an implementation of the Optimized Link State Routing protocol. ".. ++ "As such it allows mesh routing for any network equipment. ".. ++ "It runs on any wifi card that supports ad-hoc mode and of course on any ethernet device. ".. ++ "Visit olsrd.org for help and documentation.")) ++ ++function m.on_parse() ++ local has_defaults = false ++ ++ m.uci:foreach("olsrd", "InterfaceDefaults", ++ function(s) ++ has_defaults = true ++ return false ++ end) ++ ++ if not has_defaults then ++ m.uci:section("olsrd", "InterfaceDefaults") ++ end ++end ++ ++function write_float(self, section, value) ++ local n = tonumber(value) ++ if n ~= nil then ++ return Value.write(self, section, "%.1f" % n) ++ end ++end ++ ++s = m:section(TypedSection, "olsrd", translate("General settings")) ++s.anonymous = true ++ ++s:tab("general", translate("General Settings")) ++s:tab("lquality", translate("Link Quality Settings")) ++s:tab("smartgw", translate("SmartGW"), not has_ipip and translate("Warning: kmod-ipip is not installed. Without kmod-ipip SmartGateway will not work, please install it.")) ++s:tab("advanced", translate("Advanced Settings")) ++ ++ipv = s:taboption("general", ListValue, "IpVersion", translate("Internet protocol"), ++ translate("IP-version to use. If 6and4 is selected then one olsrd instance is started for each protocol.")) ++ipv:value("4", "IPv4") ++ipv:value("6and4", "6and4") ++ ++ ++poll = s:taboption("advanced", Value, "Pollrate", translate("Pollrate"), ++ translate("Polling rate for OLSR sockets in seconds. Default is 0.05.")) ++poll.optional = true ++poll.datatype = "ufloat" ++poll.placeholder = "0.05" ++ ++nicc = s:taboption("advanced", Value, "NicChgsPollInt", translate("Nic changes poll interval"), ++ translate("Interval to poll network interfaces for configuration changes (in seconds). Default is \"2.5\".")) ++nicc.optional = true ++nicc.datatype = "ufloat" ++nicc.placeholder = "2.5" ++ ++tos = s:taboption("advanced", Value, "TosValue", translate("TOS value"), ++ translate("Type of service value for the IP header of control traffic. Default is \"16\".")) ++tos.optional = true ++tos.datatype = "uinteger" ++tos.placeholder = "16" ++ ++fib = s:taboption("general", ListValue, "FIBMetric", translate("FIB metric"), ++ translate ("FIBMetric controls the metric value of the host-routes OLSRd sets. ".. ++ "\"flat\" means that the metric value is always 2. This is the preferred value ".. ++ "because it helps the linux kernel routing to clean up older routes. ".. ++ "\"correct\" uses the hopcount as the metric value. ".. ++ "\"approx\" use the hopcount as the metric value too, but does only update the hopcount if the nexthop changes too. ".. ++ "Default is \"flat\".")) ++fib:value("flat") ++fib:value("correct") ++fib:value("approx") ++ ++lql = s:taboption("lquality", ListValue, "LinkQualityLevel", translate("LQ level"), ++ translate("Link quality level switch between hopcount and cost-based (mostly ETX) routing.
    ".. ++ "0 = do not use link quality
    ".. ++ "2 = use link quality for MPR selection and routing
    ".. ++ "Default is \"2\"")) ++lql:value("2") ++lql:value("0") ++ ++lqage = s:taboption("lquality", Value, "LinkQualityAging", translate("LQ aging"), ++ translate("Link quality aging factor (only for lq level 2). Tuning parameter for etx_float and etx_fpm, smaller values ".. ++ "mean slower changes of ETX value. (allowed values are between 0.01 and 1.0)")) ++lqage.optional = true ++lqage:depends("LinkQualityLevel", "2") ++ ++lqa = s:taboption("lquality", ListValue, "LinkQualityAlgorithm", translate("LQ algorithm"), ++ translate("Link quality algorithm (only for lq level 2).
    ".. ++ "etx_float: floating point ETX with exponential aging
    ".. ++ "etx_fpm : same as etx_float, but with integer arithmetic
    ".. ++ "etx_ff : ETX freifunk, an etx variant which use all OLSR traffic (instead of only hellos) for ETX calculation
    ".. ++ "etx_ffeth: incompatible variant of etx_ff that allows ethernet links with ETX 0.1.
    ".. ++ "Defaults to \"etx_ff\"")) ++lqa.optional = true ++lqa:value("etx_ff") ++lqa:value("etx_fpm") ++lqa:value("etx_float") ++lqa:value("etx_ffeth") ++lqa:depends("LinkQualityLevel", "2") ++lqa.optional = true ++ ++lqfish = s:taboption("lquality", Flag, "LinkQualityFishEye", translate("LQ fisheye"), ++ translate("Fisheye mechanism for TCs (checked means on). Default is \"on\"")) ++lqfish.default = "1" ++lqfish.optional = true ++ ++hyst = s:taboption("lquality", Flag, "UseHysteresis", translate("Use hysteresis"), ++ translate("Hysteresis for link sensing (only for hopcount metric). Hysteresis adds more robustness to the link sensing ".. ++ "but delays neighbor registration. Defaults is \"yes\"")) ++hyst.default = "yes" ++hyst.enabled = "yes" ++hyst.disabled = "no" ++hyst:depends("LinkQualityLevel", "0") ++hyst.optional = true ++hyst.rmempty = true ++ ++port = s:taboption("general", Value, "OlsrPort", translate("Port"), ++ translate("The port OLSR uses. This should usually stay at the IANA assigned port 698. It can have a value between 1 and 65535.")) ++port.optional = true ++port.default = "698" ++port.rmempty = true ++ ++mainip = s:taboption("general", Value, "MainIp", translate("Main IP"), ++ translate("Sets the main IP (originator ip) of the router. This IP will NEVER change during the uptime of olsrd. ".. ++ "Default is 0.0.0.0, which triggers usage of the IP of the first interface.")) ++mainip.optional = true ++mainip.rmempty = true ++mainip.datatype = "ipaddr" ++mainip.placeholder = "0.0.0.0" ++ ++sgw = s:taboption("smartgw", Flag, "SmartGateway", translate("Enable"), translate("Enable SmartGateway. If it is disabled, then " .. ++ "all other SmartGateway parameters are ignored. Default is \"no\".")) ++sgw.default="no" ++sgw.enabled="yes" ++sgw.disabled="no" ++sgw.rmempty = true ++ ++sgwnat = s:taboption("smartgw", Flag, "SmartGatewayAllowNAT", translate("Allow gateways with NAT"), translate("Allow the selection of an outgoing ipv4 gateway with NAT")) ++sgwnat:depends("SmartGateway", "yes") ++sgwnat.default="yes" ++sgwnat.enabled="yes" ++sgwnat.disabled="no" ++sgwnat.optional = true ++sgwnat.rmempty = true ++ ++sgwuplink = s:taboption("smartgw", ListValue, "SmartGatewayUplink", translate("Announce uplink"), translate("Which kind of uplink is exported to the other mesh nodes. " .. ++ "An uplink is detected by looking for a local HNA of 0.0.0.0/0, ::ffff:0:0/96 or 2000::/3. Default setting is \"both\".")) ++sgwuplink:value("none") ++sgwuplink:value("ipv4") ++sgwuplink:value("ipv6") ++sgwuplink:value("both") ++sgwuplink:depends("SmartGateway", "yes") ++sgwuplink.default="both" ++sgwuplink.optional = true ++sgwuplink.rmempty = true ++ ++sgwulnat = s:taboption("smartgw", Flag, "SmartGatewayUplinkNAT", translate("Uplink uses NAT"), translate("If this Node uses NAT for connections to the internet. " .. ++ "Default is \"yes\".")) ++sgwulnat:depends("SmartGatewayUplink", "ipv4") ++sgwulnat:depends("SmartGatewayUplink", "both") ++sgwulnat.default="yes" ++sgwulnat.enabled="yes" ++sgwulnat.disabled="no" ++sgwnat.optional = true ++sgwnat.rmempty = true ++ ++sgwspeed = s:taboption("smartgw", Value, "SmartGatewaySpeed", translate("Speed of the uplink"), translate("Specifies the speed of ".. ++ "the uplink in kilobits/s. First parameter is upstream, second parameter is downstream. Default is \"128 1024\".")) ++sgwspeed:depends("SmartGatewayUplink", "ipv4") ++sgwspeed:depends("SmartGatewayUplink", "ipv6") ++sgwspeed:depends("SmartGatewayUplink", "both") ++sgwspeed.optional = true ++sgwspeed.rmempty = true ++ ++sgwprefix = s:taboption("smartgw", Value, "SmartGatewayPrefix", translate("IPv6-Prefix of the uplink"), translate("This can be used " .. ++ "to signal the external IPv6 prefix of the uplink to the clients. This might allow a client to change it's local IPv6 address to " .. ++ "use the IPv6 gateway without any kind of address translation. The maximum prefix length is 64 bits. " .. ++ "Default is \"::/0\" (no prefix).")) ++sgwprefix:depends("SmartGatewayUplink", "ipv6") ++sgwprefix:depends("SmartGatewayUplink", "both") ++sgwprefix.optional = true ++sgwprefix.rmempty = true ++ ++willingness = s:taboption("advanced", ListValue, "Willingness", translate("Willingness"), ++ translate("The fixed willingness to use. If not set willingness will be calculated dynamically based on battery/power status. Default is \"3\".")) ++for i=0,7 do ++ willingness:value(i) ++end ++willingness.optional = true ++willingness.default = "3" ++ ++natthr = s:taboption("advanced", Value, "NatThreshold", translate("NAT threshold"), ++ translate("If the route to the current gateway is to be changed, the ETX value of this gateway is ".. ++ "multiplied with this value before it is compared to the new one. ".. ++ "The parameter can be a value between 0.1 and 1.0, but should be close to 1.0 if changed.
    ".. ++ "WARNING: This parameter should not be used together with the etx_ffeth metric!
    ".. ++ "Defaults to \"1.0\".")) ++for i=1,0.1,-0.1 do ++ natthr:value(i) ++end ++natthr:depends("LinkQualityAlgorithm", "etx_ff") ++natthr:depends("LinkQualityAlgorithm", "etx_float") ++natthr:depends("LinkQualityAlgorithm", "etx_fpm") ++natthr.default = "1.0" ++natthr.optional = true ++natthr.write = write_float ++ ++ ++i = m:section(TypedSection, "InterfaceDefaults", translate("Interfaces Defaults")) ++i.anonymous = true ++i.addremove = false ++ ++i:tab("general", translate("General Settings")) ++i:tab("addrs", translate("IP Addresses")) ++i:tab("timing", translate("Timing and Validity")) ++ ++mode = i:taboption("general", ListValue, "Mode", translate("Mode"), ++ translate("Interface Mode is used to prevent unnecessary packet forwarding on switched ethernet interfaces. ".. ++ "valid Modes are \"mesh\" and \"ether\". Default is \"mesh\".")) ++mode:value("mesh") ++mode:value("ether") ++mode.optional = true ++mode.rmempty = true ++ ++ ++weight = i:taboption("general", Value, "Weight", translate("Weight"), ++ translate("When multiple links exist between hosts the weight of interface is used to determine the link to use. ".. ++ "Normally the weight is automatically calculated by olsrd based on the characteristics of the interface, ".. ++ "but here you can specify a fixed value. Olsrd will choose links with the lowest value.
    ".. ++ "Note: Interface weight is used only when LinkQualityLevel is set to 0. ".. ++ "For any other value of LinkQualityLevel, the interface ETX value is used instead.")) ++weight.optional = true ++weight.datatype = "uinteger" ++weight.placeholder = "0" ++ ++lqmult = i:taboption("general", DynamicList, "LinkQualityMult", translate("LinkQuality Multiplicator"), ++ translate("Multiply routes with the factor given here. Allowed values are between 0.01 and 1.0. ".. ++ "It is only used when LQ-Level is greater than 0. Examples:
    ".. ++ "reduce LQ to 192.168.0.1 by half: 192.168.0.1 0.5
    ".. ++ "reduce LQ to all nodes on this interface by 20%: default 0.8")) ++lqmult.optional = true ++lqmult.rmempty = true ++lqmult.cast = "table" ++lqmult.placeholder = "default 1.0" ++ ++function lqmult.validate(self, value) ++ for _, v in pairs(value) do ++ if v ~= "" then ++ local val = util.split(v, " ") ++ local host = val[1] ++ local mult = val[2] ++ if not host or not mult then ++ return nil, translate("LQMult requires two values (IP address or 'default' and multiplicator) seperated by space.") ++ end ++ if not (host == "default" or ip.IPv4(host) or ip.IPv6(host)) then ++ return nil, translate("Can only be a valid IPv4 or IPv6 address or 'default'") ++ end ++ if not tonumber(mult) or tonumber(mult) > 1 or tonumber(mult) < 0.01 then ++ return nil, translate("Invalid Value for LQMult-Value. Must be between 0.01 and 1.0.") ++ end ++ if not mult:match("[0-1]%.[0-9]+") then ++ return nil, translate("Invalid Value for LQMult-Value. You must use a decimal number between 0.01 and 1.0 here.") ++ end ++ end ++ end ++ return value ++end ++ ++ip4b = i:taboption("addrs", Value, "Ip4Broadcast", translate("IPv4 broadcast"), ++ translate("IPv4 broadcast address for outgoing OLSR packets. One useful example would be 255.255.255.255. ".. ++ "Default is \"0.0.0.0\", which triggers the usage of the interface broadcast IP.")) ++ip4b.optional = true ++ip4b.datatype = "ip4addr" ++ip4b.placeholder = "0.0.0.0" ++ ++ip6m = i:taboption("addrs", Value, "IPv6Multicast", translate("IPv6 multicast"), ++ translate("IPv6 multicast address. Default is \"FF02::6D\", the manet-router linklocal multicast.")) ++ip6m.optional = true ++ip6m.datatype = "ip6addr" ++ip6m.placeholder = "FF02::6D" ++ ++ip4s = i:taboption("addrs", Value, "IPv4Src", translate("IPv4 source"), ++ translate("IPv4 src address for outgoing OLSR packages. Default is \"0.0.0.0\", which triggers usage of the interface IP.")) ++ip4s.optional = true ++ip4s.datatype = "ip4addr" ++ip4s.placeholder = "0.0.0.0" ++ ++ip6s = i:taboption("addrs", Value, "IPv6Src", translate("IPv6 source"), ++ translate("IPv6 src prefix. OLSRd will choose one of the interface IPs which matches the prefix of this parameter. ".. ++ "Default is \"0::/0\", which triggers the usage of a not-linklocal interface IP.")) ++ip6s.optional = true ++ip6s.datatype = "ip6addr" ++ip6s.placeholder = "0::/0" ++ ++ ++hi = i:taboption("timing", Value, "HelloInterval", translate("Hello interval")) ++hi.optional = true ++hi.datatype = "ufloat" ++hi.placeholder = "5.0" ++hi.write = write_float ++ ++hv = i:taboption("timing", Value, "HelloValidityTime", translate("Hello validity time")) ++hv.optional = true ++hv.datatype = "ufloat" ++hv.placeholder = "40.0" ++hv.write = write_float ++ ++ti = i:taboption("timing", Value, "TcInterval", translate("TC interval")) ++ti.optional = true ++ti.datatype = "ufloat" ++ti.placeholder = "2.0" ++ti.write = write_float ++ ++tv = i:taboption("timing", Value, "TcValidityTime", translate("TC validity time")) ++tv.optional = true ++tv.datatype = "ufloat" ++tv.placeholder = "256.0" ++tv.write = write_float ++ ++mi = i:taboption("timing", Value, "MidInterval", translate("MID interval")) ++mi.optional = true ++mi.datatype = "ufloat" ++mi.placeholder = "18.0" ++mi.write = write_float ++ ++mv = i:taboption("timing", Value, "MidValidityTime", translate("MID validity time")) ++mv.optional = true ++mv.datatype = "ufloat" ++mv.placeholder = "324.0" ++mv.write = write_float ++ ++ai = i:taboption("timing", Value, "HnaInterval", translate("HNA interval")) ++ai.optional = true ++ai.datatype = "ufloat" ++ai.placeholder = "18.0" ++ai.write = write_float ++ ++av = i:taboption("timing", Value, "HnaValidityTime", translate("HNA validity time")) ++av.optional = true ++av.datatype = "ufloat" ++av.placeholder = "108.0" ++av.write = write_float ++ ++ ++ifs = m:section(TypedSection, "Interface", translate("Interfaces")) ++ifs.addremove = true ++ifs.anonymous = true ++ifs.extedit = luci.dispatcher.build_url("admin/services/olsrd/iface/%s") ++ifs.template = "cbi/tblsection" ++ ++function ifs.create(...) ++ local sid = TypedSection.create(...) ++ luci.http.redirect(ifs.extedit % sid) ++end ++ ++ign = ifs:option(Flag, "ignore", translate("Enable")) ++ign.enabled = "0" ++ign.disabled = "1" ++ign.rmempty = false ++function ign.cfgvalue(self, section) ++ return Flag.cfgvalue(self, section) or "0" ++end ++ ++network = ifs:option(DummyValue, "interface", translate("Network")) ++network.template = "cbi/network_netinfo" ++ ++mode = ifs:option(DummyValue, "Mode", translate("Mode")) ++function mode.cfgvalue(...) ++ return Value.cfgvalue(...) or m.uci:get_first("olsrd", "InterfaceDefaults", "Mode", "mesh") ++end ++ ++hello = ifs:option(DummyValue, "_hello", translate("Hello")) ++function hello.cfgvalue(self, section) ++ local i = tonumber(m.uci:get("olsrd", section, "HelloInterval")) or tonumber(m.uci:get_first("olsrd", "InterfaceDefaults", "HelloInterval", 5)) ++ local v = tonumber(m.uci:get("olsrd", section, "HelloValidityTime")) or tonumber(m.uci:get_first("olsrd", "InterfaceDefaults", "HelloValidityTime", 40)) ++ return "%.01fs / %.01fs" %{ i, v } ++end ++ ++tc = ifs:option(DummyValue, "_tc", translate("TC")) ++function tc.cfgvalue(self, section) ++ local i = tonumber(m.uci:get("olsrd", section, "TcInterval")) or tonumber(m.uci:get_first("olsrd", "InterfaceDefaults", "TcInterval", 2)) ++ local v = tonumber(m.uci:get("olsrd", section, "TcValidityTime")) or tonumber(m.uci:get_first("olsrd", "InterfaceDefaults", "TcValidityTime", 256)) ++ return "%.01fs / %.01fs" %{ i, v } ++end ++ ++mid = ifs:option(DummyValue, "_mid", translate("MID")) ++function mid.cfgvalue(self, section) ++ local i = tonumber(m.uci:get("olsrd", section, "MidInterval")) or tonumber(m.uci:get_first("olsrd", "InterfaceDefaults", "MidInterval", 18)) ++ local v = tonumber(m.uci:get("olsrd", section, "MidValidityTime")) or tonumber(m.uci:get_first("olsrd", "InterfaceDefaults", "MidValidityTime", 324)) ++ return "%.01fs / %.01fs" %{ i, v } ++end ++ ++hna = ifs:option(DummyValue, "_hna", translate("HNA")) ++function hna.cfgvalue(self, section) ++ local i = tonumber(m.uci:get("olsrd", section, "HnaInterval")) or tonumber(m.uci:get_first("olsrd", "InterfaceDefaults", "HnaInterval", 18)) ++ local v = tonumber(m.uci:get("olsrd", section, "HnaValidityTime")) or tonumber(m.uci:get_first("olsrd", "InterfaceDefaults", "HnaValidityTime", 108)) ++ return "%.01fs / %.01fs" %{ i, v } ++end ++ ++return m +diff --git a/feeds/luci/applications/luci-app-olsr/luasrc/model/cbi/olsr/olsrd6.lua b/feeds/luci/applications/luci-app-olsr/luasrc/model/cbi/olsr/olsrd6.lua +new file mode 100644 +index 0000000..0007e67 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-olsr/luasrc/model/cbi/olsr/olsrd6.lua +@@ -0,0 +1,390 @@ ++-- Copyright 2008 Steven Barth ++-- Copyright 2010 Jo-Philipp Wich ++-- Licensed to the public under the Apache License 2.0. ++ ++require("luci.tools.webadmin") ++local fs = require "nixio.fs" ++local util = require "luci.util" ++local ip = require "luci.ip" ++ ++local has_ipip = fs.glob("/etc/modules.d/[0-9]*-ipip")() ++ ++m = Map("olsrd6", translate("OLSR Daemon"), ++ translate("The OLSR daemon is an implementation of the Optimized Link State Routing protocol. ".. ++ "As such it allows mesh routing for any network equipment. ".. ++ "It runs on any wifi card that supports ad-hoc mode and of course on any ethernet device. ".. ++ "Visit olsrd.org for help and documentation.")) ++ ++function m.on_parse() ++ local has_defaults = false ++ ++ m.uci:foreach("olsrd6", "InterfaceDefaults", ++ function(s) ++ has_defaults = true ++ return false ++ end) ++ ++ if not has_defaults then ++ m.uci:section("olsrd6", "InterfaceDefaults") ++ end ++end ++ ++function write_float(self, section, value) ++ local n = tonumber(value) ++ if n ~= nil then ++ return Value.write(self, section, "%.1f" % n) ++ end ++end ++ ++s = m:section(TypedSection, "olsrd6", translate("General settings")) ++s.anonymous = true ++ ++s:tab("general", translate("General Settings")) ++s:tab("lquality", translate("Link Quality Settings")) ++s:tab("smartgw", translate("SmartGW"), not has_ipip and translate("Warning: kmod-ipip is not installed. Without kmod-ipip SmartGateway will not work, please install it.")) ++s:tab("advanced", translate("Advanced Settings")) ++ ++poll = s:taboption("advanced", Value, "Pollrate", translate("Pollrate"), ++ translate("Polling rate for OLSR sockets in seconds. Default is 0.05.")) ++poll.optional = true ++poll.datatype = "ufloat" ++poll.placeholder = "0.05" ++ ++nicc = s:taboption("advanced", Value, "NicChgsPollInt", translate("Nic changes poll interval"), ++ translate("Interval to poll network interfaces for configuration changes (in seconds). Default is \"2.5\".")) ++nicc.optional = true ++nicc.datatype = "ufloat" ++nicc.placeholder = "2.5" ++ ++tos = s:taboption("advanced", Value, "TosValue", translate("TOS value"), ++ translate("Type of service value for the IP header of control traffic. Default is \"16\".")) ++tos.optional = true ++tos.datatype = "uinteger" ++tos.placeholder = "16" ++ ++fib = s:taboption("general", ListValue, "FIBMetric", translate("FIB metric"), ++ translate ("FIBMetric controls the metric value of the host-routes OLSRd sets. ".. ++ "\"flat\" means that the metric value is always 2. This is the preferred value ".. ++ "because it helps the linux kernel routing to clean up older routes. ".. ++ "\"correct\" uses the hopcount as the metric value. ".. ++ "\"approx\" use the hopcount as the metric value too, but does only update the hopcount if the nexthop changes too. ".. ++ "Default is \"flat\".")) ++fib:value("flat") ++fib:value("correct") ++fib:value("approx") ++ ++lql = s:taboption("lquality", ListValue, "LinkQualityLevel", translate("LQ level"), ++ translate("Link quality level switch between hopcount and cost-based (mostly ETX) routing.
    ".. ++ "0 = do not use link quality
    ".. ++ "2 = use link quality for MPR selection and routing
    ".. ++ "Default is \"2\"")) ++lql:value("2") ++lql:value("0") ++ ++lqage = s:taboption("lquality", Value, "LinkQualityAging", translate("LQ aging"), ++ translate("Link quality aging factor (only for lq level 2). Tuning parameter for etx_float and etx_fpm, smaller values ".. ++ "mean slower changes of ETX value. (allowed values are between 0.01 and 1.0)")) ++lqage.optional = true ++lqage:depends("LinkQualityLevel", "2") ++ ++lqa = s:taboption("lquality", ListValue, "LinkQualityAlgorithm", translate("LQ algorithm"), ++ translate("Link quality algorithm (only for lq level 2).
    ".. ++ "etx_float: floating point ETX with exponential aging
    ".. ++ "etx_fpm : same as etx_float, but with integer arithmetic
    ".. ++ "etx_ff : ETX freifunk, an etx variant which use all OLSR traffic (instead of only hellos) for ETX calculation
    ".. ++ "etx_ffeth: incompatible variant of etx_ff that allows ethernet links with ETX 0.1.
    ".. ++ "Defaults to \"etx_ff\"")) ++lqa.optional = true ++lqa:value("etx_ff") ++lqa:value("etx_fpm") ++lqa:value("etx_float") ++lqa:value("etx_ffeth") ++lqa:depends("LinkQualityLevel", "2") ++lqa.optional = true ++ ++lqfish = s:taboption("lquality", Flag, "LinkQualityFishEye", translate("LQ fisheye"), ++ translate("Fisheye mechanism for TCs (checked means on). Default is \"on\"")) ++lqfish.default = "1" ++lqfish.optional = true ++ ++hyst = s:taboption("lquality", Flag, "UseHysteresis", translate("Use hysteresis"), ++ translate("Hysteresis for link sensing (only for hopcount metric). Hysteresis adds more robustness to the link sensing ".. ++ "but delays neighbor registration. Defaults is \"yes\"")) ++hyst.default = "yes" ++hyst.enabled = "yes" ++hyst.disabled = "no" ++hyst:depends("LinkQualityLevel", "0") ++hyst.optional = true ++hyst.rmempty = true ++ ++port = s:taboption("general", Value, "OlsrPort", translate("Port"), ++ translate("The port OLSR uses. This should usually stay at the IANA assigned port 698. It can have a value between 1 and 65535.")) ++port.optional = true ++port.default = "698" ++port.rmempty = true ++ ++mainip = s:taboption("general", Value, "MainIp", translate("Main IP"), ++ translate("Sets the main IP (originator ip) of the router. This IP will NEVER change during the uptime of olsrd. ".. ++ "Default is ::, which triggers usage of the IP of the first interface.")) ++mainip.optional = true ++mainip.rmempty = true ++mainip.datatype = "ipaddr" ++mainip.placeholder = "::" ++ ++sgw = s:taboption("smartgw", Flag, "SmartGateway", translate("Enable"), translate("Enable SmartGateway. If it is disabled, then " .. ++ "all other SmartGateway parameters are ignored. Default is \"no\".")) ++sgw.default="no" ++sgw.enabled="yes" ++sgw.disabled="no" ++sgw.rmempty = true ++ ++sgwnat = s:taboption("smartgw", Flag, "SmartGatewayAllowNAT", translate("Allow gateways with NAT"), translate("Allow the selection of an outgoing ipv4 gateway with NAT")) ++sgwnat:depends("SmartGateway", "yes") ++sgwnat.default="yes" ++sgwnat.enabled="yes" ++sgwnat.disabled="no" ++sgwnat.optional = true ++sgwnat.rmempty = true ++ ++sgwuplink = s:taboption("smartgw", ListValue, "SmartGatewayUplink", translate("Announce uplink"), translate("Which kind of uplink is exported to the other mesh nodes. " .. ++ "An uplink is detected by looking for a local HNA6 ::ffff:0:0/96 or 2000::/3. Default setting is \"both\".")) ++sgwuplink:value("none") ++sgwuplink:value("ipv4") ++sgwuplink:value("ipv6") ++sgwuplink:value("both") ++sgwuplink:depends("SmartGateway", "yes") ++sgwuplink.default="both" ++sgwuplink.optional = true ++sgwuplink.rmempty = true ++ ++sgwulnat = s:taboption("smartgw", Flag, "SmartGatewayUplinkNAT", translate("Uplink uses NAT"), translate("If this Node uses NAT for connections to the internet. " .. ++ "Default is \"yes\".")) ++sgwulnat:depends("SmartGatewayUplink", "ipv4") ++sgwulnat:depends("SmartGatewayUplink", "both") ++sgwulnat.default="yes" ++sgwulnat.enabled="yes" ++sgwulnat.disabled="no" ++sgwnat.optional = true ++sgwnat.rmempty = true ++ ++sgwspeed = s:taboption("smartgw", Value, "SmartGatewaySpeed", translate("Speed of the uplink"), translate("Specifies the speed of ".. ++ "the uplink in kilobits/s. First parameter is upstream, second parameter is downstream. Default is \"128 1024\".")) ++sgwspeed:depends("SmartGatewayUplink", "ipv4") ++sgwspeed:depends("SmartGatewayUplink", "ipv6") ++sgwspeed:depends("SmartGatewayUplink", "both") ++sgwspeed.optional = true ++sgwspeed.rmempty = true ++ ++sgwprefix = s:taboption("smartgw", Value, "SmartGatewayPrefix", translate("IPv6-Prefix of the uplink"), translate("This can be used " .. ++ "to signal the external IPv6 prefix of the uplink to the clients. This might allow a client to change it's local IPv6 address to " .. ++ "use the IPv6 gateway without any kind of address translation. The maximum prefix length is 64 bits. " .. ++ "Default is \"::/0\" (no prefix).")) ++sgwprefix:depends("SmartGatewayUplink", "ipv6") ++sgwprefix:depends("SmartGatewayUplink", "both") ++sgwprefix.optional = true ++sgwprefix.rmempty = true ++ ++willingness = s:taboption("advanced", ListValue, "Willingness", translate("Willingness"), ++ translate("The fixed willingness to use. If not set willingness will be calculated dynamically based on battery/power status. Default is \"3\".")) ++for i=0,7 do ++ willingness:value(i) ++end ++willingness.optional = true ++willingness.default = "3" ++ ++natthr = s:taboption("advanced", Value, "NatThreshold", translate("NAT threshold"), ++ translate("If the route to the current gateway is to be changed, the ETX value of this gateway is ".. ++ "multiplied with this value before it is compared to the new one. ".. ++ "The parameter can be a value between 0.1 and 1.0, but should be close to 1.0 if changed.
    ".. ++ "WARNING: This parameter should not be used together with the etx_ffeth metric!
    ".. ++ "Defaults to \"1.0\".")) ++for i=1,0.1,-0.1 do ++ natthr:value(i) ++end ++natthr:depends("LinkQualityAlgorithm", "etx_ff") ++natthr:depends("LinkQualityAlgorithm", "etx_float") ++natthr:depends("LinkQualityAlgorithm", "etx_fpm") ++natthr.default = "1.0" ++natthr.optional = true ++natthr.write = write_float ++ ++ ++i = m:section(TypedSection, "InterfaceDefaults", translate("Interfaces Defaults")) ++i.anonymous = true ++i.addremove = false ++ ++i:tab("general", translate("General Settings")) ++i:tab("addrs", translate("IP Addresses")) ++i:tab("timing", translate("Timing and Validity")) ++ ++mode = i:taboption("general", ListValue, "Mode", translate("Mode"), ++ translate("Interface Mode is used to prevent unnecessary packet forwarding on switched ethernet interfaces. ".. ++ "valid Modes are \"mesh\" and \"ether\". Default is \"mesh\".")) ++mode:value("mesh") ++mode:value("ether") ++mode.optional = true ++mode.rmempty = true ++ ++ ++weight = i:taboption("general", Value, "Weight", translate("Weight"), ++ translate("When multiple links exist between hosts the weight of interface is used to determine the link to use. ".. ++ "Normally the weight is automatically calculated by olsrd based on the characteristics of the interface, ".. ++ "but here you can specify a fixed value. Olsrd will choose links with the lowest value.
    ".. ++ "Note: Interface weight is used only when LinkQualityLevel is set to 0. ".. ++ "For any other value of LinkQualityLevel, the interface ETX value is used instead.")) ++weight.optional = true ++weight.datatype = "uinteger" ++weight.placeholder = "0" ++ ++lqmult = i:taboption("general", DynamicList, "LinkQualityMult", translate("LinkQuality Multiplicator"), ++ translate("Multiply routes with the factor given here. Allowed values are between 0.01 and 1.0. ".. ++ "It is only used when LQ-Level is greater than 0. Examples:
    ".. ++ "reduce LQ to fd91:662e:3c58::1 by half: fd91:662e:3c58::1 0.5
    ".. ++ "reduce LQ to all nodes on this interface by 20%: default 0.8")) ++lqmult.optional = true ++lqmult.rmempty = true ++lqmult.cast = "table" ++lqmult.placeholder = "default 1.0" ++ ++function lqmult.validate(self, value) ++ for _, v in pairs(value) do ++ if v ~= "" then ++ local val = util.split(v, " ") ++ local host = val[1] ++ local mult = val[2] ++ if not host or not mult then ++ return nil, translate("LQMult requires two values (IP address or 'default' and multiplicator) seperated by space.") ++ end ++ if not (host == "default" or ip.IPv6(host)) then ++ return nil, translate("Can only be a valid IPv6 address or 'default'") ++ end ++ if not tonumber(mult) or tonumber(mult) > 1 or tonumber(mult) < 0.01 then ++ return nil, translate("Invalid Value for LQMult-Value. Must be between 0.01 and 1.0.") ++ end ++ if not mult:match("[0-1]%.[0-9]+") then ++ return nil, translate("Invalid Value for LQMult-Value. You must use a decimal number between 0.01 and 1.0 here.") ++ end ++ end ++ end ++ return value ++end ++ ++ip6m = i:taboption("addrs", Value, "IPv6Multicast", translate("IPv6 multicast"), ++ translate("IPv6 multicast address. Default is \"FF02::6D\", the manet-router linklocal multicast.")) ++ip6m.optional = true ++ip6m.datatype = "ip6addr" ++ip6m.placeholder = "FF02::6D" ++ ++ip6s = i:taboption("addrs", Value, "IPv6Src", translate("IPv6 source"), ++ translate("IPv6 src prefix. OLSRd will choose one of the interface IPs which matches the prefix of this parameter. ".. ++ "Default is \"0::/0\", which triggers the usage of a not-linklocal interface IP.")) ++ip6s.optional = true ++ip6s.datatype = "ip6addr" ++ip6s.placeholder = "0::/0" ++ ++ ++hi = i:taboption("timing", Value, "HelloInterval", translate("Hello interval")) ++hi.optional = true ++hi.datatype = "ufloat" ++hi.placeholder = "5.0" ++hi.write = write_float ++ ++hv = i:taboption("timing", Value, "HelloValidityTime", translate("Hello validity time")) ++hv.optional = true ++hv.datatype = "ufloat" ++hv.placeholder = "40.0" ++hv.write = write_float ++ ++ti = i:taboption("timing", Value, "TcInterval", translate("TC interval")) ++ti.optional = true ++ti.datatype = "ufloat" ++ti.placeholder = "2.0" ++ti.write = write_float ++ ++tv = i:taboption("timing", Value, "TcValidityTime", translate("TC validity time")) ++tv.optional = true ++tv.datatype = "ufloat" ++tv.placeholder = "256.0" ++tv.write = write_float ++ ++mi = i:taboption("timing", Value, "MidInterval", translate("MID interval")) ++mi.optional = true ++mi.datatype = "ufloat" ++mi.placeholder = "18.0" ++mi.write = write_float ++ ++mv = i:taboption("timing", Value, "MidValidityTime", translate("MID validity time")) ++mv.optional = true ++mv.datatype = "ufloat" ++mv.placeholder = "324.0" ++mv.write = write_float ++ ++ai = i:taboption("timing", Value, "HnaInterval", translate("HNA interval")) ++ai.optional = true ++ai.datatype = "ufloat" ++ai.placeholder = "18.0" ++ai.write = write_float ++ ++av = i:taboption("timing", Value, "HnaValidityTime", translate("HNA validity time")) ++av.optional = true ++av.datatype = "ufloat" ++av.placeholder = "108.0" ++av.write = write_float ++ ++ ++ifs = m:section(TypedSection, "Interface", translate("Interfaces")) ++ifs.addremove = true ++ifs.anonymous = true ++ifs.extedit = luci.dispatcher.build_url("admin/services/olsrd6/iface/%s") ++ifs.template = "cbi/tblsection" ++ ++function ifs.create(...) ++ local sid = TypedSection.create(...) ++ luci.http.redirect(ifs.extedit % sid) ++end ++ ++ign = ifs:option(Flag, "ignore", translate("Enable")) ++ign.enabled = "0" ++ign.disabled = "1" ++ign.rmempty = false ++function ign.cfgvalue(self, section) ++ return Flag.cfgvalue(self, section) or "0" ++end ++ ++network = ifs:option(DummyValue, "interface", translate("Network")) ++network.template = "cbi/network_netinfo" ++ ++mode = ifs:option(DummyValue, "Mode", translate("Mode")) ++function mode.cfgvalue(...) ++ return Value.cfgvalue(...) or m.uci:get_first("olsrd6", "InterfaceDefaults", "Mode", "mesh") ++end ++ ++hello = ifs:option(DummyValue, "_hello", translate("Hello")) ++function hello.cfgvalue(self, section) ++ local i = tonumber(m.uci:get("olsrd6", section, "HelloInterval")) or tonumber(m.uci:get_first("olsrd6", "InterfaceDefaults", "HelloInterval", 5)) ++ local v = tonumber(m.uci:get("olsrd6", section, "HelloValidityTime")) or tonumber(m.uci:get_first("olsrd6", "InterfaceDefaults", "HelloValidityTime", 40)) ++ return "%.01fs / %.01fs" %{ i, v } ++end ++ ++tc = ifs:option(DummyValue, "_tc", translate("TC")) ++function tc.cfgvalue(self, section) ++ local i = tonumber(m.uci:get("olsrd6", section, "TcInterval")) or tonumber(m.uci:get_first("olsrd6", "InterfaceDefaults", "TcInterval", 2)) ++ local v = tonumber(m.uci:get("olsrd6", section, "TcValidityTime")) or tonumber(m.uci:get_first("olsrd6", "InterfaceDefaults", "TcValidityTime", 256)) ++ return "%.01fs / %.01fs" %{ i, v } ++end ++ ++mid = ifs:option(DummyValue, "_mid", translate("MID")) ++function mid.cfgvalue(self, section) ++ local i = tonumber(m.uci:get("olsrd6", section, "MidInterval")) or tonumber(m.uci:get_first("olsrd6", "InterfaceDefaults", "MidInterval", 18)) ++ local v = tonumber(m.uci:get("olsrd6", section, "MidValidityTime")) or tonumber(m.uci:get_first("olsrd6", "InterfaceDefaults", "MidValidityTime", 324)) ++ return "%.01fs / %.01fs" %{ i, v } ++end ++ ++hna = ifs:option(DummyValue, "_hna", translate("HNA")) ++function hna.cfgvalue(self, section) ++ local i = tonumber(m.uci:get("olsrd6", section, "HnaInterval")) or tonumber(m.uci:get_first("olsrd6", "InterfaceDefaults", "HnaInterval", 18)) ++ local v = tonumber(m.uci:get("olsrd6", section, "HnaValidityTime")) or tonumber(m.uci:get_first("olsrd6", "InterfaceDefaults", "HnaValidityTime", 108)) ++ return "%.01fs / %.01fs" %{ i, v } ++end ++ ++return m +diff --git a/feeds/luci/applications/luci-app-olsr/luasrc/model/cbi/olsr/olsrddisplay.lua b/feeds/luci/applications/luci-app-olsr/luasrc/model/cbi/olsr/olsrddisplay.lua +new file mode 100644 +index 0000000..aadb44f +--- /dev/null ++++ b/feeds/luci/applications/luci-app-olsr/luasrc/model/cbi/olsr/olsrddisplay.lua +@@ -0,0 +1,14 @@ ++-- Copyright 2011 Manuel Munz ++-- Licensed to the public under the Apache License 2.0. ++ ++m = Map("luci_olsr", translate("OLSR - Display Options")) ++ ++s = m:section(TypedSection, "olsr") ++s.anonymous = true ++ ++res = s:option(Flag, "resolve", translate("Resolve"), ++ translate("Resolve hostnames on status pages. It is generally safe to allow this, but if you use public IPs and have unstable DNS-Setup then those pages will load really slow. In this case disable it here.")) ++res.default = "0" ++res.optional = true ++ ++return m +diff --git a/feeds/luci/applications/luci-app-olsr/luasrc/model/cbi/olsr/olsrdhna.lua b/feeds/luci/applications/luci-app-olsr/luasrc/model/cbi/olsr/olsrdhna.lua +new file mode 100644 +index 0000000..e4b093a +--- /dev/null ++++ b/feeds/luci/applications/luci-app-olsr/luasrc/model/cbi/olsr/olsrdhna.lua +@@ -0,0 +1,45 @@ ++-- Copyright 2008 Steven Barth ++-- Copyright 2011 Manuel Munz ++-- Licensed to the public under the Apache License 2.0. ++ ++local uci = require "luci.model.uci".cursor() ++local ipv = uci:get_first("olsrd", "olsrd", "IpVersion", "4") ++ ++mh = Map("olsrd", translate("OLSR - HNA-Announcements"), translate("Hosts in a OLSR routed network can announce connecitivity " .. ++ "to external networks using HNA messages.")) ++ ++if ipv == "6and4" or ipv == "4" then ++ hna4 = mh:section(TypedSection, "Hna4", translate("Hna4"), translate("Both values must use the dotted decimal notation.")) ++ hna4.addremove = true ++ hna4.anonymous = true ++ hna4.template = "cbi/tblsection" ++ ++ net4 = hna4:option(Value, "netaddr", translate("Network address")) ++ net4.datatype = "ip4addr" ++ net4.placeholder = "10.11.12.13" ++ net4.default = "10.11.12.13" ++ msk4 = hna4:option(Value, "netmask", translate("Netmask")) ++ msk4.datatype = "ip4addr" ++ msk4.placeholder = "255.255.255.255" ++ msk4.default = "255.255.255.255" ++end ++ ++if ipv == "6and4" or ipv == "6" then ++ hna6 = mh:section(TypedSection, "Hna6", translate("Hna6"), translate("IPv6 network must be given in full notation, " .. ++ "prefix must be in CIDR notation.")) ++ hna6.addremove = true ++ hna6.anonymous = true ++ hna6.template = "cbi/tblsection" ++ ++ net6 = hna6:option(Value, "netaddr", translate("Network address")) ++ net6.datatype = "ip6addr" ++ net6.placeholder = "fec0:2200:106:0:0:0:0:0" ++ net6.default = "fec0:2200:106:0:0:0:0:0" ++ msk6 = hna6:option(Value, "prefix", translate("Prefix")) ++ msk6.datatype = "range(0,128)" ++ msk6.placeholder = "128" ++ msk6.default = "128" ++end ++ ++return mh ++ +diff --git a/feeds/luci/applications/luci-app-olsr/luasrc/model/cbi/olsr/olsrdhna6.lua b/feeds/luci/applications/luci-app-olsr/luasrc/model/cbi/olsr/olsrdhna6.lua +new file mode 100644 +index 0000000..682421f +--- /dev/null ++++ b/feeds/luci/applications/luci-app-olsr/luasrc/model/cbi/olsr/olsrdhna6.lua +@@ -0,0 +1,25 @@ ++-- Copyright 2008 Steven Barth ++-- Copyright 2011 Manuel Munz ++-- Licensed to the public under the Apache License 2.0. ++ ++local uci = require "luci.model.uci".cursor() ++ ++mh = Map("olsrd6", translate("OLSR - HNA6-Announcements"), translate("Hosts in a OLSR routed network can announce connecitivity " .. ++ "to external networks using HNA6 messages.")) ++ ++ hna6 = mh:section(TypedSection, "Hna6", translate("Hna6"), translate("IPv6 network must be given in full notation, " .. ++ "prefix must be in CIDR notation.")) ++ hna6.addremove = true ++ hna6.anonymous = true ++ hna6.template = "cbi/tblsection" ++ ++ net6 = hna6:option(Value, "netaddr", translate("Network address")) ++ net6.datatype = "ip6addr" ++ net6.placeholder = "fec0:2200:106:0:0:0:0:0" ++ net6.default = "fec0:2200:106:0:0:0:0:0" ++ msk6 = hna6:option(Value, "prefix", translate("Prefix")) ++ msk6.datatype = "range(0,128)" ++ msk6.placeholder = "128" ++ msk6.default = "128" ++return mh ++ +diff --git a/feeds/luci/applications/luci-app-olsr/luasrc/model/cbi/olsr/olsrdiface.lua b/feeds/luci/applications/luci-app-olsr/luasrc/model/cbi/olsr/olsrdiface.lua +new file mode 100644 +index 0000000..d6b7cd1 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-olsr/luasrc/model/cbi/olsr/olsrdiface.lua +@@ -0,0 +1,177 @@ ++-- Copyright 2010 Jo-Philipp Wich ++-- Licensed to the public under the Apache License 2.0. ++ ++local util = require "luci.util" ++local ip = require "luci.ip" ++ ++function write_float(self, section, value) ++ local n = tonumber(value) ++ if n ~= nil then ++ return Value.write(self, section, "%.1f" % n) ++ end ++end ++ ++m = Map("olsrd", translate("OLSR Daemon - Interface"), ++ translate("The OLSR daemon is an implementation of the Optimized Link State Routing protocol. ".. ++ "As such it allows mesh routing for any network equipment. ".. ++ "It runs on any wifi card that supports ad-hoc mode and of course on any ethernet device. ".. ++ "Visit olsrd.org for help and documentation.")) ++ ++m.redirect = luci.dispatcher.build_url("admin/services/olsrd") ++ ++if not arg[1] or m.uci:get("olsrd", arg[1]) ~= "Interface" then ++ luci.http.redirect(m.redirect) ++ return ++end ++ ++i = m:section(NamedSection, arg[1], "Interface", translate("Interface")) ++i.anonymous = true ++i.addremove = false ++ ++i:tab("general", translate("General Settings")) ++i:tab("addrs", translate("IP Addresses")) ++i:tab("timing", translate("Timing and Validity")) ++ ++ign = i:taboption("general", Flag, "ignore", translate("Enable"), ++ translate("Enable this interface.")) ++ign.enabled = "0" ++ign.disabled = "1" ++ign.rmempty = false ++function ign.cfgvalue(self, section) ++ return Flag.cfgvalue(self, section) or "0" ++end ++ ++network = i:taboption("general", Value, "interface", translate("Network"), ++ translate("The interface OLSRd should serve.")) ++ ++network.template = "cbi/network_netlist" ++network.widget = "radio" ++network.nocreate = true ++ ++mode = i:taboption("general", ListValue, "Mode", translate("Mode"), ++ translate("Interface Mode is used to prevent unnecessary packet forwarding on switched ethernet interfaces. ".. ++ "valid Modes are \"mesh\" and \"ether\". Default is \"mesh\".")) ++mode:value("mesh") ++mode:value("ether") ++mode.optional = true ++mode.rmempty = true ++ ++ ++weight = i:taboption("general", Value, "Weight", translate("Weight"), ++ translate("When multiple links exist between hosts the weight of interface is used to determine the link to use. ".. ++ "Normally the weight is automatically calculated by olsrd based on the characteristics of the interface, ".. ++ "but here you can specify a fixed value. Olsrd will choose links with the lowest value.
    ".. ++ "Note: Interface weight is used only when LinkQualityLevel is set to 0. ".. ++ "For any other value of LinkQualityLevel, the interface ETX value is used instead.")) ++weight.optional = true ++weight.datatype = "uinteger" ++weight.placeholder = "0" ++ ++lqmult = i:taboption("general", DynamicList, "LinkQualityMult", translate("LinkQuality Multiplicator"), ++ translate("Multiply routes with the factor given here. Allowed values are between 0.01 and 1.0. ".. ++ "It is only used when LQ-Level is greater than 0. Examples:
    ".. ++ "reduce LQ to 192.168.0.1 by half: 192.168.0.1 0.5
    ".. ++ "reduce LQ to all nodes on this interface by 20%: default 0.8")) ++lqmult.optional = true ++lqmult.rmempty = true ++lqmult.cast = "table" ++lqmult.placeholder = "default 1.0" ++ ++function lqmult.validate(self, value) ++ for _, v in pairs(value) do ++ if v ~= "" then ++ local val = util.split(v, " ") ++ local host = val[1] ++ local mult = val[2] ++ if not host or not mult then ++ return nil, translate("LQMult requires two values (IP address or 'default' and multiplicator) seperated by space.") ++ end ++ if not (host == "default" or ip.IPv4(host) or ip.IPv6(host)) then ++ return nil, translate("Can only be a valid IPv4 or IPv6 address or 'default'") ++ end ++ if not tonumber(mult) or tonumber(mult) > 1 or tonumber(mult) < 0.01 then ++ return nil, translate("Invalid Value for LQMult-Value. Must be between 0.01 and 1.0.") ++ end ++ if not mult:match("[0-1]%.[0-9]+") then ++ return nil, translate("Invalid Value for LQMult-Value. You must use a decimal number between 0.01 and 1.0 here.") ++ end ++ end ++ end ++ return value ++end ++ ++ip4b = i:taboption("addrs", Value, "Ip4Broadcast", translate("IPv4 broadcast"), ++ translate("IPv4 broadcast address for outgoing OLSR packets. One useful example would be 255.255.255.255. ".. ++ "Default is \"0.0.0.0\", which triggers the usage of the interface broadcast IP.")) ++ip4b.optional = true ++ip4b.datatype = "ip4addr" ++ip4b.placeholder = "0.0.0.0" ++ ++ip6m = i:taboption("addrs", Value, "IPv6Multicast", translate("IPv6 multicast"), ++ translate("IPv6 multicast address. Default is \"FF02::6D\", the manet-router linklocal multicast.")) ++ip6m.optional = true ++ip6m.datatype = "ip6addr" ++ip6m.placeholder = "FF02::6D" ++ ++ip4s = i:taboption("addrs", Value, "IPv4Src", translate("IPv4 source"), ++ translate("IPv4 src address for outgoing OLSR packages. Default is \"0.0.0.0\", which triggers usage of the interface IP.")) ++ip4s.optional = true ++ip4s.datatype = "ip4addr" ++ip4s.placeholder = "0.0.0.0" ++ ++ip6s = i:taboption("addrs", Value, "IPv6Src", translate("IPv6 source"), ++ translate("IPv6 src prefix. OLSRd will choose one of the interface IPs which matches the prefix of this parameter. ".. ++ "Default is \"0::/0\", which triggers the usage of a not-linklocal interface IP.")) ++ip6s.optional = true ++ip6s.datatype = "ip6addr" ++ip6s.placeholder = "0::/0" ++ ++hi = i:taboption("timing", Value, "HelloInterval", translate("Hello interval")) ++hi.optional = true ++hi.datatype = "ufloat" ++hi.placeholder = "5.0" ++hi.write = write_float ++ ++hv = i:taboption("timing", Value, "HelloValidityTime", translate("Hello validity time")) ++hv.optional = true ++hv.datatype = "ufloat" ++hv.placeholder = "40.0" ++hv.write = write_float ++ ++ti = i:taboption("timing", Value, "TcInterval", translate("TC interval")) ++ti.optional = true ++ti.datatype = "ufloat" ++ti.placeholder = "2.0" ++ti.write = write_float ++ ++tv = i:taboption("timing", Value, "TcValidityTime", translate("TC validity time")) ++tv.optional = true ++tv.datatype = "ufloat" ++tv.placeholder = "256.0" ++tv.write = write_float ++ ++mi = i:taboption("timing", Value, "MidInterval", translate("MID interval")) ++mi.optional = true ++mi.datatype = "ufloat" ++mi.placeholder = "18.0" ++mi.write = write_float ++ ++mv = i:taboption("timing", Value, "MidValidityTime", translate("MID validity time")) ++mv.optional = true ++mv.datatype = "ufloat" ++mv.placeholder = "324.0" ++mv.write = write_float ++ ++ai = i:taboption("timing", Value, "HnaInterval", translate("HNA interval")) ++ai.optional = true ++ai.datatype = "ufloat" ++ai.placeholder = "18.0" ++ai.write = write_float ++ ++av = i:taboption("timing", Value, "HnaValidityTime", translate("HNA validity time")) ++av.optional = true ++av.datatype = "ufloat" ++av.placeholder = "108.0" ++av.write = write_float ++ ++return m +diff --git a/feeds/luci/applications/luci-app-olsr/luasrc/model/cbi/olsr/olsrdiface6.lua b/feeds/luci/applications/luci-app-olsr/luasrc/model/cbi/olsr/olsrdiface6.lua +new file mode 100644 +index 0000000..2f0fa6c +--- /dev/null ++++ b/feeds/luci/applications/luci-app-olsr/luasrc/model/cbi/olsr/olsrdiface6.lua +@@ -0,0 +1,164 @@ ++-- Copyright 2010 Jo-Philipp Wich ++-- Licensed to the public under the Apache License 2.0. ++ ++local util = require "luci.util" ++local ip = require "luci.ip" ++ ++function write_float(self, section, value) ++ local n = tonumber(value) ++ if n ~= nil then ++ return Value.write(self, section, "%.1f" % n) ++ end ++end ++ ++m = Map("olsrd6", translate("OLSR Daemon - Interface"), ++ translate("The OLSR daemon is an implementation of the Optimized Link State Routing protocol. ".. ++ "As such it allows mesh routing for any network equipment. ".. ++ "It runs on any wifi card that supports ad-hoc mode and of course on any ethernet device. ".. ++ "Visit olsrd.org for help and documentation.")) ++ ++m.redirect = luci.dispatcher.build_url("admin/services/olsrd6") ++ ++if not arg[1] or m.uci:get("olsrd6", arg[1]) ~= "Interface" then ++ luci.http.redirect(m.redirect) ++ return ++end ++ ++i = m:section(NamedSection, arg[1], "Interface", translate("Interface")) ++i.anonymous = true ++i.addremove = false ++ ++i:tab("general", translate("General Settings")) ++i:tab("addrs", translate("IP Addresses")) ++i:tab("timing", translate("Timing and Validity")) ++ ++ign = i:taboption("general", Flag, "ignore", translate("Enable"), ++ translate("Enable this interface.")) ++ign.enabled = "0" ++ign.disabled = "1" ++ign.rmempty = false ++function ign.cfgvalue(self, section) ++ return Flag.cfgvalue(self, section) or "0" ++end ++ ++network = i:taboption("general", Value, "interface", translate("Network"), ++ translate("The interface OLSRd should serve.")) ++ ++network.template = "cbi/network_netlist" ++network.widget = "radio" ++network.nocreate = true ++ ++mode = i:taboption("general", ListValue, "Mode", translate("Mode"), ++ translate("Interface Mode is used to prevent unnecessary packet forwarding on switched ethernet interfaces. ".. ++ "valid Modes are \"mesh\" and \"ether\". Default is \"mesh\".")) ++mode:value("mesh") ++mode:value("ether") ++mode.optional = true ++mode.rmempty = true ++ ++ ++weight = i:taboption("general", Value, "Weight", translate("Weight"), ++ translate("When multiple links exist between hosts the weight of interface is used to determine the link to use. ".. ++ "Normally the weight is automatically calculated by olsrd based on the characteristics of the interface, ".. ++ "but here you can specify a fixed value. Olsrd will choose links with the lowest value.
    ".. ++ "Note: Interface weight is used only when LinkQualityLevel is set to 0. ".. ++ "For any other value of LinkQualityLevel, the interface ETX value is used instead.")) ++weight.optional = true ++weight.datatype = "uinteger" ++weight.placeholder = "0" ++ ++lqmult = i:taboption("general", DynamicList, "LinkQualityMult", translate("LinkQuality Multiplicator"), ++ translate("Multiply routes with the factor given here. Allowed values are between 0.01 and 1.0. ".. ++ "It is only used when LQ-Level is greater than 0. Examples:
    ".. ++ "reduce LQ to fd91:662e:3c58::1 by half: fd91:662e:3c58::1 0.5
    ".. ++ "reduce LQ to all nodes on this interface by 20%: default 0.8")) ++lqmult.optional = true ++lqmult.rmempty = true ++lqmult.cast = "table" ++lqmult.placeholder = "default 1.0" ++ ++function lqmult.validate(self, value) ++ for _, v in pairs(value) do ++ if v ~= "" then ++ local val = util.split(v, " ") ++ local host = val[1] ++ local mult = val[2] ++ if not host or not mult then ++ return nil, translate("LQMult requires two values (IP address or 'default' and multiplicator) seperated by space.") ++ end ++ if not (host == "default" or ip.IPv6(host)) then ++ return nil, translate("Can only be a valid IPv6 address or 'default'") ++ end ++ if not tonumber(mult) or tonumber(mult) > 1 or tonumber(mult) < 0.01 then ++ return nil, translate("Invalid Value for LQMult-Value. Must be between 0.01 and 1.0.") ++ end ++ if not mult:match("[0-1]%.[0-9]+") then ++ return nil, translate("Invalid Value for LQMult-Value. You must use a decimal number between 0.01 and 1.0 here.") ++ end ++ end ++ end ++ return value ++end ++ ++ip6m = i:taboption("addrs", Value, "IPv6Multicast", translate("IPv6 multicast"), ++ translate("IPv6 multicast address. Default is \"FF02::6D\", the manet-router linklocal multicast.")) ++ip6m.optional = true ++ip6m.datatype = "ip6addr" ++ip6m.placeholder = "FF02::6D" ++ ++ip6s = i:taboption("addrs", Value, "IPv6Src", translate("IPv6 source"), ++ translate("IPv6 src prefix. OLSRd will choose one of the interface IPs which matches the prefix of this parameter. ".. ++ "Default is \"0::/0\", which triggers the usage of a not-linklocal interface IP.")) ++ip6s.optional = true ++ip6s.datatype = "ip6addr" ++ip6s.placeholder = "0::/0" ++ ++hi = i:taboption("timing", Value, "HelloInterval", translate("Hello interval")) ++hi.optional = true ++hi.datatype = "ufloat" ++hi.placeholder = "5.0" ++hi.write = write_float ++ ++hv = i:taboption("timing", Value, "HelloValidityTime", translate("Hello validity time")) ++hv.optional = true ++hv.datatype = "ufloat" ++hv.placeholder = "40.0" ++hv.write = write_float ++ ++ti = i:taboption("timing", Value, "TcInterval", translate("TC interval")) ++ti.optional = true ++ti.datatype = "ufloat" ++ti.placeholder = "2.0" ++ti.write = write_float ++ ++tv = i:taboption("timing", Value, "TcValidityTime", translate("TC validity time")) ++tv.optional = true ++tv.datatype = "ufloat" ++tv.placeholder = "256.0" ++tv.write = write_float ++ ++mi = i:taboption("timing", Value, "MidInterval", translate("MID interval")) ++mi.optional = true ++mi.datatype = "ufloat" ++mi.placeholder = "18.0" ++mi.write = write_float ++ ++mv = i:taboption("timing", Value, "MidValidityTime", translate("MID validity time")) ++mv.optional = true ++mv.datatype = "ufloat" ++mv.placeholder = "324.0" ++mv.write = write_float ++ ++ai = i:taboption("timing", Value, "HnaInterval", translate("HNA interval")) ++ai.optional = true ++ai.datatype = "ufloat" ++ai.placeholder = "18.0" ++ai.write = write_float ++ ++av = i:taboption("timing", Value, "HnaValidityTime", translate("HNA validity time")) ++av.optional = true ++av.datatype = "ufloat" ++av.placeholder = "108.0" ++av.write = write_float ++ ++return m +diff --git a/feeds/luci/applications/luci-app-olsr/luasrc/model/cbi/olsr/olsrdplugins.lua b/feeds/luci/applications/luci-app-olsr/luasrc/model/cbi/olsr/olsrdplugins.lua +new file mode 100644 +index 0000000..43d6a08 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-olsr/luasrc/model/cbi/olsr/olsrdplugins.lua +@@ -0,0 +1,259 @@ ++-- Copyright 2008 Steven Barth ++-- Copyright 2009 Jo-Philipp Wich ++-- Licensed to the public under the Apache License 2.0. ++ ++local ip = require "luci.ip" ++local fs = require "nixio.fs" ++ ++if arg[1] then ++ mp = Map("olsrd", translate("OLSR - Plugins")) ++ ++ p = mp:section(TypedSection, "LoadPlugin", translate("Plugin configuration")) ++ p:depends("library", arg[1]) ++ p.anonymous = true ++ ++ ign = p:option(Flag, "ignore", translate("Enable")) ++ ign.enabled = "0" ++ ign.disabled = "1" ++ ign.rmempty = false ++ function ign.cfgvalue(self, section) ++ return Flag.cfgvalue(self, section) or "0" ++ end ++ ++ lib = p:option(DummyValue, "library", translate("Library")) ++ lib.default = arg[1] ++ ++ local function Range(x,y) ++ local t = {} ++ for i = x, y do t[#t+1] = i end ++ return t ++ end ++ ++ local function Cidr2IpMask(val) ++ if val then ++ for i = 1, #val do ++ local cidr = ip.IPv4(val[i]) or ip.IPv6(val[i]) ++ if cidr then ++ val[i] = cidr:network():string() .. " " .. cidr:mask():string() ++ end ++ end ++ return val ++ end ++ end ++ ++ local function IpMask2Cidr(val) ++ if val then ++ for i = 1, #val do ++ local ip, mask = val[i]:gmatch("([^%s]+)%s+([^%s]+)")() ++ local cidr ++ if ip and mask and ip:match(":") then ++ cidr = ip.IPv6(ip, mask) ++ elseif ip and mask then ++ cidr = ip.IPv4(ip, mask) ++ end ++ ++ if cidr then ++ val[i] = cidr:string() ++ end ++ end ++ return val ++ end ++ end ++ ++ ++ local knownPlParams = { ++ ["olsrd_bmf.so.1.5.3"] = { ++ { Value, "BmfInterface", "bmf0" }, ++ { Value, "BmfInterfaceIp", "10.10.10.234/24" }, ++ { Flag, "DoLocalBroadcast", "no" }, ++ { Flag, "CapturePacketsOnOlsrInterfaces", "yes" }, ++ { ListValue, "BmfMechanism", { "UnicastPromiscuous", "Broadcast" } }, ++ { Value, "BroadcastRetransmitCount", "2" }, ++ { Value, "FanOutLimit", "4" }, ++ { DynamicList, "NonOlsrIf", "br-lan" } ++ }, ++ ++ ["olsrd_dyn_gw.so.0.4"] = { ++ { Value, "Interval", "40" }, ++ { DynamicList, "Ping", "141.1.1.1" }, ++ { DynamicList, "HNA", "192.168.80.0/24", IpMask2Cidr, Cidr2IpMask } ++ }, ++ ++ ["olsrd_httpinfo.so.0.1"] = { ++ { Value, "port", "80" }, ++ { DynamicList, "Host", "163.24.87.3" }, ++ { DynamicList, "Net", "0.0.0.0/0", Cidr2IpMask } ++ }, ++ ++ ["olsrd_nameservice.so.0.3"] = { ++ { DynamicList, "name", "my-name.mesh" }, ++ { DynamicList, "hosts", "1.2.3.4 name-for-other-interface.mesh" }, ++ { Value, "suffix", ".olsr" }, ++ { Value, "hosts_file", "/path/to/hosts_file" }, ++ { Value, "add_hosts", "/path/to/file" }, ++ { Value, "dns_server", "141.1.1.1" }, ++ { Value, "resolv_file", "/path/to/resolv.conf" }, ++ { Value, "interval", "120" }, ++ { Value, "timeout", "240" }, ++ { Value, "lat", "12.123" }, ++ { Value, "lon", "12.123" }, ++ { Value, "latlon_file", "/var/run/latlon.js" }, ++ { Value, "latlon_infile", "/var/run/gps.txt" }, ++ { Value, "sighup_pid_file", "/var/run/dnsmasq.pid" }, ++ { Value, "name_change_script", "/usr/local/bin/announce_new_hosts.sh" }, ++ { DynamicList, "service", "http://me.olsr:80|tcp|my little homepage" }, ++ { Value, "services_file", "/var/run/services_olsr" }, ++ { Value, "services_change_script", "/usr/local/bin/announce_new_services.sh" }, ++ { DynamicList, "mac", "xx:xx:xx:xx:xx:xx[,0-255]" }, ++ { Value, "macs_file", "/path/to/macs_file" }, ++ { Value, "macs_change_script", "/path/to/script" } ++ }, ++ ++ ["olsrd_quagga.so.0.2.2"] = { ++ { StaticList, "redistribute", { ++ "system", "kernel", "connect", "static", "rip", "ripng", "ospf", ++ "ospf6", "isis", "bgp", "hsls" ++ } }, ++ { ListValue, "ExportRoutes", { "only", "both" } }, ++ { Flag, "LocalPref", "true" }, ++ { Value, "Distance", Range(0,255) } ++ }, ++ ++ ["olsrd_secure.so.0.5"] = { ++ { Value, "Keyfile", "/etc/private-olsr.key" } ++ }, ++ ++ ["olsrd_txtinfo.so.0.1"] = { ++ { Value, "accept", "127.0.0.1" } ++ }, ++ ++ ["olsrd_jsoninfo.so.0.0"] = { ++ { Value, "accept", "127.0.0.1" }, ++ { Value, "port", "9090" }, ++ { Value, "UUIDFile", "/etc/olsrd/olsrd.uuid" }, ++ ++ }, ++ ++ ["olsrd_watchdog.so.0.1"] = { ++ { Value, "file", "/var/run/olsrd.watchdog" }, ++ { Value, "interval", "30" } ++ }, ++ ++ ["olsrd_mdns.so.1.0.0"] = { ++ { DynamicList, "NonOlsrIf", "lan" } ++ }, ++ ++ ["olsrd_p2pd.so.0.1.0"] = { ++ { DynamicList, "NonOlsrIf", "lan" }, ++ { Value, "P2pdTtl", "10" } ++ }, ++ ++ ["olsrd_arprefresh.so.0.1"] = {}, ++ ["olsrd_dot_draw.so.0.3"] = {}, ++ ["olsrd_dyn_gw_plain.so.0.4"] = {}, ++ ["olsrd_pgraph.so.1.1"] = {}, ++ ["olsrd_tas.so.0.1"] = {} ++ } ++ ++ ++ -- build plugin options with dependencies ++ if knownPlParams[arg[1]] then ++ for _, option in ipairs(knownPlParams[arg[1]]) do ++ local otype, name, default, uci2cbi, cbi2uci = unpack(option) ++ local values ++ ++ if type(default) == "table" then ++ values = default ++ default = default[1] ++ end ++ ++ if otype == Flag then ++ local bool = p:option( Flag, name, name ) ++ if default == "yes" or default == "no" then ++ bool.enabled = "yes" ++ bool.disabled = "no" ++ elseif default == "on" or default == "off" then ++ bool.enabled = "on" ++ bool.disabled = "off" ++ elseif default == "1" or default == "0" then ++ bool.enabled = "1" ++ bool.disabled = "0" ++ else ++ bool.enabled = "true" ++ bool.disabled = "false" ++ end ++ bool.optional = true ++ bool.default = default ++ bool:depends({ library = plugin }) ++ else ++ local field = p:option( otype, name, name ) ++ if values then ++ for _, value in ipairs(values) do ++ field:value( value ) ++ end ++ end ++ if type(uci2cbi) == "function" then ++ function field.cfgvalue(self, section) ++ return uci2cbi(otype.cfgvalue(self, section)) ++ end ++ end ++ if type(cbi2uci) == "function" then ++ function field.formvalue(self, section) ++ return cbi2uci(otype.formvalue(self, section)) ++ end ++ end ++ field.optional = true ++ field.default = default ++ --field:depends({ library = arg[1] }) ++ end ++ end ++ end ++ ++ return mp ++ ++else ++ ++ mpi = Map("olsrd", translate("OLSR - Plugins")) ++ ++ local plugins = {} ++ mpi.uci:foreach("olsrd", "LoadPlugin", ++ function(section) ++ if section.library and not plugins[section.library] then ++ plugins[section.library] = true ++ end ++ end ++ ) ++ ++ -- create a loadplugin section for each found plugin ++ for v in fs.dir("/usr/lib") do ++ if v:sub(1, 6) == "olsrd_" then ++ if not plugins[v] then ++ mpi.uci:section( ++ "olsrd", "LoadPlugin", nil, ++ { library = v, ignore = 1 } ++ ) ++ end ++ end ++ end ++ ++ t = mpi:section( TypedSection, "LoadPlugin", translate("Plugins") ) ++ t.anonymous = true ++ t.template = "cbi/tblsection" ++ t.override_scheme = true ++ function t.extedit(self, section) ++ local lib = self.map:get(section, "library") or "" ++ return luci.dispatcher.build_url("admin", "services", "olsrd", "plugins") .. "/" .. lib ++ end ++ ++ ign = t:option( Flag, "ignore", translate("Enabled") ) ++ ign.enabled = "0" ++ ign.disabled = "1" ++ ign.rmempty = false ++ function ign.cfgvalue(self, section) ++ return Flag.cfgvalue(self, section) or "0" ++ end ++ ++ t:option( DummyValue, "library", translate("Library") ) ++ ++ return mpi ++end +diff --git a/feeds/luci/applications/luci-app-olsr/luasrc/model/cbi/olsr/olsrdplugins6.lua b/feeds/luci/applications/luci-app-olsr/luasrc/model/cbi/olsr/olsrdplugins6.lua +new file mode 100644 +index 0000000..d1c68be +--- /dev/null ++++ b/feeds/luci/applications/luci-app-olsr/luasrc/model/cbi/olsr/olsrdplugins6.lua +@@ -0,0 +1,259 @@ ++-- Copyright 2008 Steven Barth ++-- Copyright 2009 Jo-Philipp Wich ++-- Licensed to the public under the Apache License 2.0. ++ ++local ip = require "luci.ip" ++local fs = require "nixio.fs" ++ ++if arg[1] then ++ mp = Map("olsrd6", translate("OLSR - Plugins")) ++ ++ p = mp:section(TypedSection, "LoadPlugin", translate("Plugin configuration")) ++ p:depends("library", arg[1]) ++ p.anonymous = true ++ ++ ign = p:option(Flag, "ignore", translate("Enable")) ++ ign.enabled = "0" ++ ign.disabled = "1" ++ ign.rmempty = false ++ function ign.cfgvalue(self, section) ++ return Flag.cfgvalue(self, section) or "0" ++ end ++ ++ lib = p:option(DummyValue, "library", translate("Library")) ++ lib.default = arg[1] ++ ++ local function Range(x,y) ++ local t = {} ++ for i = x, y do t[#t+1] = i end ++ return t ++ end ++ ++ local function Cidr2IpMask(val) ++ if val then ++ for i = 1, #val do ++ local cidr = ip.IPv4(val[i]) or ip.IPv6(val[i]) ++ if cidr then ++ val[i] = cidr:network():string() .. " " .. cidr:mask():string() ++ end ++ end ++ return val ++ end ++ end ++ ++ local function IpMask2Cidr(val) ++ if val then ++ for i = 1, #val do ++ local ip, mask = val[i]:gmatch("([^%s]+)%s+([^%s]+)")() ++ local cidr ++ if ip and mask and ip:match(":") then ++ cidr = ip.IPv6(ip, mask) ++ elseif ip and mask then ++ cidr = ip.IPv4(ip, mask) ++ end ++ ++ if cidr then ++ val[i] = cidr:string() ++ end ++ end ++ return val ++ end ++ end ++ ++ ++ local knownPlParams = { ++ ["olsrd_bmf.so.1.5.3"] = { ++ { Value, "BmfInterface", "bmf0" }, ++ { Value, "BmfInterfaceIp", "10.10.10.234/24" }, ++ { Flag, "DoLocalBroadcast", "no" }, ++ { Flag, "CapturePacketsOnOlsrInterfaces", "yes" }, ++ { ListValue, "BmfMechanism", { "UnicastPromiscuous", "Broadcast" } }, ++ { Value, "BroadcastRetransmitCount", "2" }, ++ { Value, "FanOutLimit", "4" }, ++ { DynamicList, "NonOlsrIf", "br-lan" } ++ }, ++ ++ ["olsrd_dyn_gw.so.0.4"] = { ++ { Value, "Interval", "40" }, ++ { DynamicList, "Ping", "141.1.1.1" }, ++ { DynamicList, "HNA", "192.168.80.0/24", IpMask2Cidr, Cidr2IpMask } ++ }, ++ ++ ["olsrd_httpinfo.so.0.1"] = { ++ { Value, "port", "80" }, ++ { DynamicList, "Host", "163.24.87.3" }, ++ { DynamicList, "Net", "0.0.0.0/0", Cidr2IpMask } ++ }, ++ ++ ["olsrd_nameservice.so.0.3"] = { ++ { DynamicList, "name", "my-name.mesh" }, ++ { DynamicList, "hosts", "1.2.3.4 name-for-other-interface.mesh" }, ++ { Value, "suffix", ".olsr" }, ++ { Value, "hosts_file", "/path/to/hosts_file" }, ++ { Value, "add_hosts", "/path/to/file" }, ++ { Value, "dns_server", "141.1.1.1" }, ++ { Value, "resolv_file", "/path/to/resolv.conf" }, ++ { Value, "interval", "120" }, ++ { Value, "timeout", "240" }, ++ { Value, "lat", "12.123" }, ++ { Value, "lon", "12.123" }, ++ { Value, "latlon_file", "/var/run/latlon.js.ipv6" }, ++ { Value, "latlon_infile", "/var/run/gps.txt" }, ++ { Value, "sighup_pid_file", "/var/run/dnsmasq.pid" }, ++ { Value, "name_change_script", "/usr/local/bin/announce_new_hosts.sh" }, ++ { DynamicList, "service", "http://me.olsr:80|tcp|my little homepage" }, ++ { Value, "services_file", "/var/run/services_olsr" }, ++ { Value, "services_change_script", "/usr/local/bin/announce_new_services.sh" }, ++ { DynamicList, "mac", "xx:xx:xx:xx:xx:xx[,0-255]" }, ++ { Value, "macs_file", "/path/to/macs_file" }, ++ { Value, "macs_change_script", "/path/to/script" } ++ }, ++ ++ ["olsrd_quagga.so.0.2.2"] = { ++ { StaticList, "redistribute", { ++ "system", "kernel", "connect", "static", "rip", "ripng", "ospf", ++ "ospf6", "isis", "bgp", "hsls" ++ } }, ++ { ListValue, "ExportRoutes", { "only", "both" } }, ++ { Flag, "LocalPref", "true" }, ++ { Value, "Distance", Range(0,255) } ++ }, ++ ++ ["olsrd_secure.so.0.5"] = { ++ { Value, "Keyfile", "/etc/private-olsr.key" } ++ }, ++ ++ ["olsrd_txtinfo.so.0.1"] = { ++ { Value, "accept", "::1/128" } ++ }, ++ ++ ["olsrd_jsoninfo.so.0.0"] = { ++ { Value, "accept", "::1/128" }, ++ { Value, "port", "9090" }, ++ { Value, "UUIDFile", "/etc/olsrd/olsrd.uuid.ipv6" }, ++ ++ }, ++ ++ ["olsrd_watchdog.so.0.1"] = { ++ { Value, "file", "/var/run/olsrd.watchdog.ipv6" }, ++ { Value, "interval", "30" } ++ }, ++ ++ ["olsrd_mdns.so.1.0.0"] = { ++ { DynamicList, "NonOlsrIf", "lan" } ++ }, ++ ++ ["olsrd_p2pd.so.0.1.0"] = { ++ { DynamicList, "NonOlsrIf", "lan" }, ++ { Value, "P2pdTtl", "10" } ++ }, ++ ++ ["olsrd_arprefresh.so.0.1"] = {}, ++ ["olsrd_dot_draw.so.0.3"] = {}, ++ ["olsrd_dyn_gw_plain.so.0.4"] = {}, ++ ["olsrd_pgraph.so.1.1"] = {}, ++ ["olsrd_tas.so.0.1"] = {} ++ } ++ ++ ++ -- build plugin options with dependencies ++ if knownPlParams[arg[1]] then ++ for _, option in ipairs(knownPlParams[arg[1]]) do ++ local otype, name, default, uci2cbi, cbi2uci = unpack(option) ++ local values ++ ++ if type(default) == "table" then ++ values = default ++ default = default[1] ++ end ++ ++ if otype == Flag then ++ local bool = p:option( Flag, name, name ) ++ if default == "yes" or default == "no" then ++ bool.enabled = "yes" ++ bool.disabled = "no" ++ elseif default == "on" or default == "off" then ++ bool.enabled = "on" ++ bool.disabled = "off" ++ elseif default == "1" or default == "0" then ++ bool.enabled = "1" ++ bool.disabled = "0" ++ else ++ bool.enabled = "true" ++ bool.disabled = "false" ++ end ++ bool.optional = true ++ bool.default = default ++ bool:depends({ library = plugin }) ++ else ++ local field = p:option( otype, name, name ) ++ if values then ++ for _, value in ipairs(values) do ++ field:value( value ) ++ end ++ end ++ if type(uci2cbi) == "function" then ++ function field.cfgvalue(self, section) ++ return uci2cbi(otype.cfgvalue(self, section)) ++ end ++ end ++ if type(cbi2uci) == "function" then ++ function field.formvalue(self, section) ++ return cbi2uci(otype.formvalue(self, section)) ++ end ++ end ++ field.optional = true ++ field.default = default ++ --field:depends({ library = arg[1] }) ++ end ++ end ++ end ++ ++ return mp ++ ++else ++ ++ mpi = Map("olsrd6", translate("OLSR - Plugins")) ++ ++ local plugins = {} ++ mpi.uci:foreach("olsrd6", "LoadPlugin", ++ function(section) ++ if section.library and not plugins[section.library] then ++ plugins[section.library] = true ++ end ++ end ++ ) ++ ++ -- create a loadplugin section for each found plugin ++ for v in fs.dir("/usr/lib") do ++ if v:sub(1, 6) == "olsrd_" then ++ if not plugins[v] then ++ mpi.uci:section( ++ "olsrd6", "LoadPlugin", nil, ++ { library = v, ignore = 1 } ++ ) ++ end ++ end ++ end ++ ++ t = mpi:section( TypedSection, "LoadPlugin", translate("Plugins") ) ++ t.anonymous = true ++ t.template = "cbi/tblsection" ++ t.override_scheme = true ++ function t.extedit(self, section) ++ local lib = self.map:get(section, "library") or "" ++ return luci.dispatcher.build_url("admin", "services", "olsrd6", "plugins") .. "/" .. lib ++ end ++ ++ ign = t:option( Flag, "ignore", translate("Enabled") ) ++ ign.enabled = "0" ++ ign.disabled = "1" ++ ign.rmempty = false ++ function ign.cfgvalue(self, section) ++ return Flag.cfgvalue(self, section) or "0" ++ end ++ ++ t:option( DummyValue, "library", translate("Library") ) ++ ++ return mpi ++end +diff --git a/feeds/luci/applications/luci-app-olsr/luasrc/tools/olsr.lua b/feeds/luci/applications/luci-app-olsr/luasrc/tools/olsr.lua +new file mode 100644 +index 0000000..781b265 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-olsr/luasrc/tools/olsr.lua +@@ -0,0 +1,33 @@ ++-- Copyright 2011 Manuel Munz ++-- Licensed to the public under the Apache License 2.0. ++ ++module("luci.tools.olsr", package.seeall) ++ ++function etx_color(etx) ++ local color = "#bb3333" ++ if etx == 0 then ++ color = "#bb3333" ++ elseif etx < 2 then ++ color = "#00cc00" ++ elseif etx < 4 then ++ color = "#ffcb05" ++ elseif etx < 10 then ++ color = "#ff6600" ++ end ++ return color ++end ++ ++function snr_color(snr) ++ local color = "#bb3333" ++ if snr == 0 then ++ color = "#bb3333" ++ elseif snr > 30 then ++ color = "#00cc00" ++ elseif snr > 20 then ++ color = "#ffcb05" ++ elseif snr > 5 then ++ color = "#ff6600" ++ end ++ return color ++end ++ +diff --git a/feeds/luci/applications/luci-app-olsr/luasrc/view/status-olsr/common_js.htm b/feeds/luci/applications/luci-app-olsr/luasrc/view/status-olsr/common_js.htm +new file mode 100644 +index 0000000..1ee763e +--- /dev/null ++++ b/feeds/luci/applications/luci-app-olsr/luasrc/view/status-olsr/common_js.htm +@@ -0,0 +1,35 @@ ++<% if has_v4 and has_v6 then %> ++ ++<%end %> +diff --git a/feeds/luci/applications/luci-app-olsr/luasrc/view/status-olsr/error_olsr.htm b/feeds/luci/applications/luci-app-olsr/luasrc/view/status-olsr/error_olsr.htm +new file mode 100644 +index 0000000..d997670 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-olsr/luasrc/view/status-olsr/error_olsr.htm +@@ -0,0 +1,11 @@ ++<%# ++ Copyright 2008 Steven Barth ++ Copyright 2008 Jo-Philipp Wich ++ Licensed to the public under the Apache License 2.0. ++-%> ++ ++<%+header%> ++

    <%:OLSR Daemon%>

    ++

    <%:Unable to connect to the OLSR daemon!%>

    ++

    <%:Make sure that OLSRd is running, the "jsoninfo" plugin is loaded, configured on port 9090 and accepts connections from "127.0.0.1".%>

    ++<%+footer%> +diff --git a/feeds/luci/applications/luci-app-olsr/luasrc/view/status-olsr/hna.htm b/feeds/luci/applications/luci-app-olsr/luasrc/view/status-olsr/hna.htm +new file mode 100644 +index 0000000..89e4436 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-olsr/luasrc/view/status-olsr/hna.htm +@@ -0,0 +1,122 @@ ++<%# ++ Copyright 2008 Steven Barth ++ Copyright 2008 Jo-Philipp Wich ++ Copyright 2011 Manuel Munz ++ Licensed to the public under the Apache License 2.0. ++-%> ++ ++<% ++local i = 1 ++ ++if luci.http.formvalue("status") == "1" then ++ local rv = {} ++ for k, hna in ipairs(hna) do ++ rv[#rv+1] = { ++ proto = hna["proto"], ++ destination = hna["destination"], ++ genmask = hna["genmask"], ++ gateway = hna["gateway"], ++ hostname = hna["hostname"], ++ validityTime = hna["validityTime"] ++ } ++ end ++ luci.http.prepare_content("application/json") ++ luci.http.write_json(rv) ++ return ++end ++%> ++ ++<%+header%> ++ ++ ++ ++ ++

    <%:Active host net announcements%>

    ++ ++
    ++
    ++ ++ <%:Overview of currently active OLSR host net announcements%> ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ <% for k, route in ipairs(hna) do %> ++ ++ ++ ++ ++ <% if hna[k].validityTime then ++ validity = hna[k].validityTime .. 's' ++ else ++ validity = '-' ++ end %> ++ ++ ++ ++ ++ <% i = ((i % 2) + 1) ++ end %> ++ ++
    <%:Announced network%><%:OLSR gateway%><%:Validity Time%>
    <%=hna[k].destination%>/<%=hna[k].genmask%> ++ <% if hna[k].proto == '6' then %> ++ <%=hna[k].gateway%> ++ <% else %> ++ <%=hna[k].gateway%> ++ <% end %> ++ <% if hna[k].hostname then %> ++ / <%=hna[k].hostname%> ++ <% end %> ++ <%=validity%>
    ++
    ++ ++<%+status-olsr/common_js%> ++<%+footer%> +diff --git a/feeds/luci/applications/luci-app-olsr/luasrc/view/status-olsr/interfaces.htm b/feeds/luci/applications/luci-app-olsr/luasrc/view/status-olsr/interfaces.htm +new file mode 100644 +index 0000000..3fb3a58 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-olsr/luasrc/view/status-olsr/interfaces.htm +@@ -0,0 +1,50 @@ ++<%# ++ Copyright 2008 Steven Barth ++ Copyright 2008 Jo-Philipp Wich ++ Copyright 2011 Manuel Munz ++ Licensed to the public under the Apache License 2.0. ++-%> ++ ++<% ++local i = 1 ++%> ++ ++<%+header%> ++ ++

    <%:Interfaces%>

    ++ ++
    ++ ++
    ++ <%:Overview of interfaces where OLSR is running%> ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ <% for k, iface in ipairs(iface) do %> ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ <% i = ((i % 2) + 1) ++ end %> ++
    <%:Interface%><%:State%><%:MTU%><%:WLAN%><%:Source address%><%:Netmask%><%:Broadcast address%>
    <%=iface.name%><%=iface.state%><%=iface.olsrMTU%><%=iface.wireless and luci.i18n.translate('yes') or luci.i18n.translate('no')%><%=iface.ipv4Address or iface.ipv6Address%><%=iface.netmask%><%=iface.broadcast or iface.multicast%>
    ++
    ++<%+status-olsr/common_js%> ++<%+footer%> ++ ++ +diff --git a/feeds/luci/applications/luci-app-olsr/luasrc/view/status-olsr/legend.htm b/feeds/luci/applications/luci-app-olsr/luasrc/view/status-olsr/legend.htm +new file mode 100644 +index 0000000..2f59848 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-olsr/luasrc/view/status-olsr/legend.htm +@@ -0,0 +1,24 @@ ++

    <%:Legend%>:

    ++
      ++
    • LQ: <%:Success rate of packages received from the neighbour%>
    • ++
    • NLQ: <%:Success rate of packages sent to the neighbour%>
    • ++
    • ETX: <%:Expected retransmission count%>
    • ++
    • ++
        ++
      • <%:Green%>:<%:Very good (ETX < 2)%>
      • ++
      • <%:Yellow%>:<%:Good (2 < ETX < 4)%>
      • ++
      • <%:Orange%>:<%:Still usable (4 < ETX < 10)%>
      • ++
      • <%:Red%>:<%:Bad (ETX > 10)%>
      • ++
      ++
    • ++
    • SNR: <%:Signal Noise Ratio in dB%>
    • ++
    • ++
        ++
      • <%:Green%>:<%:Very good (SNR > 30)%>
      • ++
      • <%:Yellow%>:<%:Good (30 > SNR > 20)%>
      • ++
      • <%:Orange%>:<%:Still usable (20 > SNR > 5)%>
      • ++
      • <%:Red%>:<%:Bad (SNR < 5)%>
      • ++
      ++
    • ++
    ++ +diff --git a/feeds/luci/applications/luci-app-olsr/luasrc/view/status-olsr/mid.htm b/feeds/luci/applications/luci-app-olsr/luasrc/view/status-olsr/mid.htm +new file mode 100644 +index 0000000..3c10bd6 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-olsr/luasrc/view/status-olsr/mid.htm +@@ -0,0 +1,50 @@ ++<%# ++ Copyright 2008 Steven Barth ++ Copyright 2008 Jo-Philipp Wich ++ Copyright 2011 Manuel Munz ++ Licensed to the public under the Apache License 2.0. ++-%> ++ ++<% ++local i = 1 ++%> ++ ++<%+header%> ++

    <%:Active MID announcements%>

    ++ ++
    ++
    ++ <%:Overview of known multiple interface announcements%> ++ ++ ++ ++ ++ ++ ++ <% for k, mid in ipairs(mids) do ++ local aliases = '' ++ for k,v in ipairs(mid.aliases) do ++ if aliases == '' then ++ sep = '' ++ else ++ sep = ', ' ++ end ++ aliases = v.ipAddress .. sep .. aliases ++ end ++ local host = mid.ipAddress ++ if mid.proto == '6' then ++ host = '[' .. mid.ipAddress .. ']' ++ end ++ %> ++ ++ ++ ++ ++ ++ ++ <% i = ((i % 2) + 1) ++ end %> ++
    <%:OLSR node%><%:Secondary OLSR interfaces%>
    <%=mid.ipAddress%><%=aliases%>
    ++
    ++<%+status-olsr/common_js%> ++<%+footer%> +diff --git a/feeds/luci/applications/luci-app-olsr/luasrc/view/status-olsr/neighbors.htm b/feeds/luci/applications/luci-app-olsr/luasrc/view/status-olsr/neighbors.htm +new file mode 100644 +index 0000000..9ad0d8f +--- /dev/null ++++ b/feeds/luci/applications/luci-app-olsr/luasrc/view/status-olsr/neighbors.htm +@@ -0,0 +1,174 @@ ++<%# ++ Copyright 2008 Steven Barth ++ Copyright 2008 Jo-Philipp Wich ++ Copyright 2011 Manuel Munz ++ Licensed to the public under the Apache License 2.0. ++-%> ++ ++<% ++local olsrtools = require "luci.tools.olsr" ++local i = 1 ++ ++if luci.http.formvalue("status") == "1" then ++ local rv = {} ++ for k, link in ipairs(links) do ++ link.linkCost = tonumber(link.linkCost)/1024 or 0 ++ if link.linkCost == 4096 then ++ link.linkCost = 0 ++ end ++ local color = olsrtools.etx_color(link.linkCost) ++ local snr_color = olsrtools.snr_color(link.snr) ++ defaultgw_color = "" ++ if link.defaultgw == 1 then ++ defaultgw_color = "#ffff99" ++ end ++ ++ rv[#rv+1] = { ++ rip = link.remoteIP, ++ hn = link.hostname, ++ lip = link.localIP, ++ ifn = link.interface, ++ lq = string.format("%.3f", link.linkQuality), ++ nlq = string.format("%.3f",link.neighborLinkQuality), ++ cost = string.format("%.3f", link.linkCost), ++ snr = link.snr, ++ signal = link.signal, ++ noise = link.noise, ++ color = color, ++ snr_color = snr_color, ++ dfgcolor = defaultgw_color, ++ proto = link.proto ++ } ++ end ++ luci.http.prepare_content("application/json") ++ luci.http.write_json(rv) ++ return ++end ++%> ++ ++<%+header%> ++ ++ ++ ++ ++ ++

    <%:OLSR connections%>

    ++ ++
    ++ ++
    ++ <%:Overview of currently established OLSR connections%> ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ <% local i = 1 ++ for k, link in ipairs(links) do ++ link.linkCost = tonumber(link.linkCost)/1024 or 0 ++ if link.linkCost == 4096 then ++ link.linkCost = 0 ++ end ++ ++ color = olsrtools.etx_color(link.linkCost) ++ snr_color = olsrtools.snr_color(link.snr) ++ ++ if link.snr == 0 then ++ link.snr = '?' ++ end ++ ++ defaultgw_color = "" ++ if link.defaultgw == 1 then ++ defaultgw_color = "#ffff99" ++ end ++ %> ++ ++ ++ <% if link.proto == "6" then %> ++ ++ <% else %> ++ ++ <% end %> ++ ++ ++ ++ ++ ++ ++ ++ ++ <% ++ i = ((i % 2) + 1) ++ end %> ++ ++
    <%:Neighbour IP%><%:Hostname%><%:Interface%><%:Local interface IP%>LQNLQETXSNR
    <%=link.remoteIP%><%=link.remoteIP%><%=link.hostname%><%=link.interface%><%=link.localIP%><%=string.format("%.3f", link.linkQuality)%><%=string.format("%.3f", link.neighborLinkQuality)%><%=string.format("%.3f", link.linkCost)%><%=link.snr%>
    ++
    ++ ++<%+status-olsr/legend%> ++
    ++<%+status-olsr/common_js%> ++<%+footer%> +diff --git a/feeds/luci/applications/luci-app-olsr/luasrc/view/status-olsr/overview.htm b/feeds/luci/applications/luci-app-olsr/luasrc/view/status-olsr/overview.htm +new file mode 100644 +index 0000000..fa32315 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-olsr/luasrc/view/status-olsr/overview.htm +@@ -0,0 +1,221 @@ ++<%# ++ Copyright 2008 Steven Barth ++ Copyright 2008 Jo-Philipp Wich ++ Copyright 2011 Manuel Munz ++ Licensed to the public under the Apache License 2.0. ++-%> ++ ++<% ++ ++has_ipv4_conf = luci.model.uci.cursor():get_first("olsrd", "olsrd", "IpVersion") ++has_ipv6_conf = luci.model.uci.cursor():get_first("olsrd6", "olsrd", "IpVersion") ++ ++function write_conf(conf, file) ++ local fs = require "nixio.fs" ++ if fs.access(conf) then ++ luci.http.header("Content-Disposition", "attachment; filename="..file) ++ luci.http.prepare_content("text/plain") ++ luci.http.write(fs.readfile(conf)) ++ end ++end ++ ++conf = luci.http.formvalue() ++ ++if conf.openwrt_v4 then ++ write_conf("/etc/config/olsrd", "olsrd") ++ return false ++end ++ ++if conf.openwrt_v6 then ++ write_conf("/etc/config/olsrd6", "olsrd6") ++ return false ++end ++ ++if conf.conf_v4 then ++ write_conf("/var/etc/olsrd.conf", "olsrd.conf") ++ return false ++end ++ ++if conf.conf_v6 then ++ write_conf("/var/etc/olsrd6.conf", "olsrd6.conf") ++ return false ++end ++ ++%> ++ ++<%+header%> ++ ++ ++ ++ ++ ++
    ++ ++

    OLSR <%:Overview%>

    ++ ++
    ++ <%:Network%> ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
    <%:Interfaces%> ++ ++ - ++ ++
    <%:Neighbors%> ++ ++ - ++ ++
    <%:Nodes%> ++ ++ - ++ ++
    <%:HNA%> ++ ++ - ++ ++
    <%:Links total%> ++ ++ - ++ ++
    <%:Links per node (average)%> ++ - ++
    ++
    ++ ++ ++
    ++ OLSR <%:Configuration%> ++ ++ ++ ++
    <%:Version%> ++ - ++
    <%:Download Config%> ++ <% if has_ipv4_conf then %> ++ OpenWrt (IPv4), ++ <% end %> ++ <% if has_ipv6_conf then %> ++ OpenWrt (IPv6), ++ <% end %> ++ <% if has_ipv4_conf then %> ++ OLSRD (IPv4), ++ <% end %> ++ <% if has_ipv6_conf then %> ++ OLSRD (IPv6) ++ <% end %> ++
    ++
    ++ ++<%+footer%> +diff --git a/feeds/luci/applications/luci-app-olsr/luasrc/view/status-olsr/routes.htm b/feeds/luci/applications/luci-app-olsr/luasrc/view/status-olsr/routes.htm +new file mode 100644 +index 0000000..d2b0c1b +--- /dev/null ++++ b/feeds/luci/applications/luci-app-olsr/luasrc/view/status-olsr/routes.htm +@@ -0,0 +1,142 @@ ++<%# ++ Copyright 2008 Steven Barth ++ Copyright 2008 Jo-Philipp Wich ++ Copyright 2011 Manuel Munz ++ Licensed to the public under the Apache License 2.0. ++-%> ++ ++<% ++ ++local olsrtools = require "luci.tools.olsr" ++local i = 1 ++ ++if luci.http.formvalue("status") == "1" then ++ local rv = {} ++ for k, route in ipairs(routes) do ++ local ETX = string.format("%.3f", tonumber(route.rtpMetricCost)/1024 or 0) ++ rv[#rv+1] = { ++ hostname = route.hostname, ++ dest = route.destination, ++ genmask = route.genmask, ++ gw = route.gateway, ++ interface = route.networkInterface, ++ metric = route.metric, ++ etx = ETX, ++ color = olsrtools.etx_color(tonumber(ETX)) ++ } ++ end ++ luci.http.prepare_content("application/json") ++ luci.http.write_json(rv) ++ return ++end ++ ++%> ++ ++<%+header%> ++ ++ ++ ++ ++ ++ ++

    <%:Known OLSR routes%>

    ++ ++
    ++ ++
    ++<%:Overview of currently known routes to other OLSR nodes%> ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ <% for k, route in ipairs(routes) do ++ ETX = tonumber(route.rtpMetricCost)/1024 or '0' ++ color = olsrtools.etx_color(ETX) ++ %> ++ ++ ++ ++ ++ ++ ++ ++ ++ <% ++ i = ((i % 2) + 1) ++ end %> ++ ++
    <%:Announced network%><%:OLSR gateway%><%:Interface%><%:Metric%>ETX
    <%=route.destination%>/<%=route.genmask%> ++ <% if route.proto == '6' then %> ++ <%=route.gateway%> ++ <% else %> ++ <%=route.gateway%> ++ <% end %> ++ <% if route.hostname then %> ++ / <%=route.hostname%> ++ <% end %> ++ <%=route.networkInterface%><%=route.metric%><%=string.format("%.3f", ETX)%>
    ++ ++<%+status-olsr/legend%> ++
    ++<%+status-olsr/common_js%> ++<%+footer%> +diff --git a/feeds/luci/applications/luci-app-olsr/luasrc/view/status-olsr/smartgw.htm b/feeds/luci/applications/luci-app-olsr/luasrc/view/status-olsr/smartgw.htm +new file mode 100644 +index 0000000..45f6515 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-olsr/luasrc/view/status-olsr/smartgw.htm +@@ -0,0 +1,152 @@ ++<%# ++ Copyright 2008 Steven Barth ++ Copyright 2008 Jo-Philipp Wich ++ Copyright 2011 Manuel Munz ++ Licensed to the public under the Apache License 2.0. ++-%> ++ ++<% ++local i = 1 ++require("luci.model.uci") ++local uci = luci.model.uci.cursor_state() ++ ++uci:foreach("olsrd", "olsrd", function(s) ++ if s.SmartGateway and s.SmartGateway == "yes" then has_smartgw = true end ++end) ++ ++ ++if luci.http.formvalue("status") == "1" then ++ local rv = {} ++ for k, gw in ipairs(gws) do ++ gw.tcPathCost = tonumber(gw.tcPathCost)/1024 or 0 ++ if gw.tcPathCost == 4096 then ++ gw.tcPathCost = 0 ++ end ++ ++ rv[#rv+1] = { ++ proto = gw.proto, ++ ipAddress = gw.ipAddress, ++ status = gw.ipv4Status or gw.ipv6Status, ++ tcPathCost = string.format("%.3f", gw.tcPathCost), ++ hopCount = gw.hopCount, ++ uplinkSpeed = gw.uplinkSpeed, ++ downlinkSpeed = gw.downlinkSpeed, ++ v4 = gw.ipv4 and luci.i18n.translate('yes') or luci.i18n.translate('no'), ++ v6 = gw.ipv6 and luci.i18n.translate('yes') or luci.i18n.translate('no'), ++ externalPrefix = gw.externalPrefix ++ } ++ end ++ luci.http.prepare_content("application/json") ++ luci.http.write_json(rv) ++ return ++end ++%> ++ ++<%+header%> ++ ++ ++ ++ ++ ++<%+header%> ++ ++

    <%:SmartGW announcements%>

    ++ ++
    ++ ++<% if has_smartgw then %> ++ ++
    ++ <%:Overview of smart gateways in this network%> ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ <% for k, gw in ipairs(gws) do ++ ++ gw.tcPathCost = tonumber(gw.tcPathCost)/1024 or 0 ++ if gw.tcPathCost == 4096 then ++ gw.tcPathCost = 0 ++ end ++ %> ++ ++ ++ <% if gw.proto == '6' then %> ++ ++ <% else %> ++ ++ <% end %> ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ <% i = ((i % 2) + 1) ++ end %> ++ ++
    <%:Gateway%><%:Status%><%:ETX%><%:Hops%><%:Uplink%><%:Downlink%><%:IPv4%><%:IPv6%><%:Prefix%>
    <%=gw.ipAddress%><%=gw.ipAddress%><%=gw.ipv4Status or gw.ipv6Status or '-' %><%=string.format("%.3f", gw.tcPathCost)%><%=gw.hopCount%><%=gw.uplinkSpeed%><%=gw.downlinkSpeed%><%=gw.ipv4 and luci.i18n.translate('yes') or luci.i18n.translate('no')%><%=gw.ipv6 and luci.i18n.translate('yes') or luci.i18n.translate('no')%><%=gw.externalPrefix%>
    ++
    ++ ++<% else %> ++ ++ <%:SmartGateway is not configured on this system.%> ++ ++<% end %> ++ ++<%+status-olsr/common_js%> ++<%+footer%> +diff --git a/feeds/luci/applications/luci-app-olsr/luasrc/view/status-olsr/topology.htm b/feeds/luci/applications/luci-app-olsr/luasrc/view/status-olsr/topology.htm +new file mode 100644 +index 0000000..ee69f72 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-olsr/luasrc/view/status-olsr/topology.htm +@@ -0,0 +1,62 @@ ++<%# ++ Copyright 2008 Steven Barth ++ Copyright 2008 Jo-Philipp Wich ++ Copyright 2011 Manuel Munz ++ Licensed to the public under the Apache License 2.0. ++-%> ++ ++<% ++local i = 1 ++local olsrtools = require "luci.tools.olsr" ++%> ++ ++<%+header%> ++

    <%:Active OLSR nodes%>

    ++ ++
    ++ ++
    ++ <%:Overview of currently known OLSR nodes%> ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ <% for k, route in ipairs(routes) do ++ local cost = string.format("%.3f", tonumber(route.tcEdgeCost/1024) or 0) ++ local color = olsrtools.etx_color(tonumber(cost)) ++ local lq = string.format("%.3f", tonumber(route.linkQuality) or 0) ++ local nlq = string.format("%.3f", tonumber(route.neighborLinkQuality) or 0) ++ %> ++ ++ ++ ++ <% if route.proto == "6" then %> ++ ++ ++ ++ ++ <% else %> ++ ++ ++ ++ ++ <%end%> ++ ++ ++ ++ ++ ++ ++ <% i = ((i % 2) + 1) ++ end %> ++
    <%:OLSR node%><%:Last hop%><%:LQ%><%:NLQ%><%:ETX%>
    <%=route.destinationIP%><%=route.lastHopIP%><%=route.destinationIP%><%=route.lastHopIP%><%=lq%><%=nlq%><%=cost%>
    ++<%+status-olsr/legend%> ++
    ++ ++<%+status-olsr/common_js%> ++<%+footer%> +diff --git a/feeds/luci/applications/luci-app-olsr/po/ca/olsr.po b/feeds/luci/applications/luci-app-olsr/po/ca/olsr.po +new file mode 100644 +index 0000000..db4bce1 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-olsr/po/ca/olsr.po +@@ -0,0 +1,707 @@ ++# olsr.pot ++# generated from ./applications/luci-olsr/luasrc/i18n/olsr.en.lua ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Report-Msgid-Bugs-To: \n" ++"POT-Creation-Date: 2009-06-10 03:40+0200\n" ++"PO-Revision-Date: 2014-06-06 11:22+0200\n" ++"Last-Translator: Alex \n" ++"Language-Team: LANGUAGE \n" ++"Language: ca\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n != 1);\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "Active MID announcements" ++msgstr "Anuncis MID actius" ++ ++msgid "Active OLSR nodes" ++msgstr "Nodes OLSR actius" ++ ++msgid "Active host net announcements" ++msgstr "Anuncis de xarxa de màquines actives" ++ ++msgid "Advanced Settings" ++msgstr "Ajusts avançats" ++ ++msgid "Allow gateways with NAT" ++msgstr "Permet els passarel·les amb NAT " ++ ++msgid "Allow the selection of an outgoing ipv4 gateway with NAT" ++msgstr "" ++ ++msgid "Announce uplink" ++msgstr "" ++ ++msgid "Announced network" ++msgstr "Xarxa anunciada" ++ ++msgid "Bad (ETX > 10)" ++msgstr "" ++ ++msgid "Bad (SNR < 5)" ++msgstr "" ++ ++msgid "Both values must use the dotted decimal notation." ++msgstr "" ++ ++msgid "Broadcast address" ++msgstr "Adreça de difusió" ++ ++msgid "Can only be a valid IPv4 or IPv6 address or 'default'" ++msgstr "" ++ ++msgid "Can only be a valid IPv6 address or 'default'" ++msgstr "" ++ ++msgid "Configuration" ++msgstr "Configuració" ++ ++msgid "" ++"Could not get any data. Make sure the jsoninfo plugin is installed and " ++"allows connections from localhost." ++msgstr "" ++ ++msgid "Display" ++msgstr "" ++ ++msgid "Downlink" ++msgstr "" ++ ++msgid "Download Config" ++msgstr "" ++ ++msgid "ETX" ++msgstr "ETX" ++ ++msgid "Enable" ++msgstr "Habilita" ++ ++msgid "" ++"Enable SmartGateway. If it is disabled, then all other SmartGateway " ++"parameters are ignored. Default is \"no\"." ++msgstr "" ++ ++msgid "Enable this interface." ++msgstr "Habilita aquesta interfície." ++ ++msgid "Enabled" ++msgstr "Habilitat" ++ ++msgid "Expected retransmission count" ++msgstr "Compte de retransmissió previst" ++ ++msgid "FIB metric" ++msgstr "Mètrica FIB" ++ ++msgid "" ++"FIBMetric controls the metric value of the host-routes OLSRd sets. \"flat\" " ++"means that the metric value is always 2. This is the preferred value because " ++"it helps the linux kernel routing to clean up older routes. \"correct\" uses " ++"the hopcount as the metric value. \"approx\" use the hopcount as the metric " ++"value too, but does only update the hopcount if the nexthop changes too. " ++"Default is \"flat\"." ++msgstr "" ++ ++msgid "Fisheye mechanism for TCs (checked means on). Default is \"on\"" ++msgstr "" ++ ++msgid "Gateway" ++msgstr "Passarel·la" ++ ++msgid "General Settings" ++msgstr "Ajusts generals" ++ ++msgid "General settings" ++msgstr "Ajusts generals" ++ ++msgid "Good (2 < ETX < 4)" ++msgstr "" ++ ++msgid "Good (30 > SNR > 20)" ++msgstr "" ++ ++msgid "Green" ++msgstr "" ++ ++msgid "HNA" ++msgstr "HNA" ++ ++msgid "HNA Announcements" ++msgstr "Anuncis HNA" ++ ++msgid "HNA interval" ++msgstr "Interval HNA" ++ ++msgid "HNA validity time" ++msgstr "Temps de validesa HNA" ++ ++#, fuzzy ++msgid "HNA6 Announcements" ++msgstr "Anuncis HNA" ++ ++msgid "Hello" ++msgstr "" ++ ++msgid "Hello interval" ++msgstr "Interval Hello" ++ ++msgid "Hello validity time" ++msgstr "Temps de validesa Hello" ++ ++msgid "Hide IPv4" ++msgstr "" ++ ++msgid "Hide IPv6" ++msgstr "" ++ ++msgid "Hna4" ++msgstr "Hna4" ++ ++msgid "Hna6" ++msgstr "Hna6" ++ ++msgid "Hops" ++msgstr "" ++ ++msgid "Hostname" ++msgstr "" ++ ++msgid "" ++"Hosts in a OLSR routed network can announce connecitivity to external " ++"networks using HNA messages." ++msgstr "" ++ ++msgid "" ++"Hosts in a OLSR routed network can announce connecitivity to external " ++"networks using HNA6 messages." ++msgstr "" ++ ++msgid "" ++"Hysteresis for link sensing (only for hopcount metric). Hysteresis adds more " ++"robustness to the link sensing but delays neighbor registration. Defaults is " ++"\"yes\"" ++msgstr "" ++ ++msgid "IP Addresses" ++msgstr "Adreces IP" ++ ++msgid "" ++"IP-version to use. If 6and4 is selected then one olsrd instance is started " ++"for each protocol." ++msgstr "" ++ ++msgid "IPv4" ++msgstr "IPv4" ++ ++msgid "IPv4 broadcast" ++msgstr "Difusió IPv4" ++ ++msgid "" ++"IPv4 broadcast address for outgoing OLSR packets. One useful example would " ++"be 255.255.255.255. Default is \"0.0.0.0\", which triggers the usage of the " ++"interface broadcast IP." ++msgstr "" ++ ++msgid "IPv4 source" ++msgstr "" ++ ++msgid "" ++"IPv4 src address for outgoing OLSR packages. Default is \"0.0.0.0\", which " ++"triggers usage of the interface IP." ++msgstr "" ++ ++msgid "IPv6" ++msgstr "IPv6" ++ ++msgid "IPv6 multicast" ++msgstr "Difusió selectiva IPv6" ++ ++msgid "" ++"IPv6 multicast address. Default is \"FF02::6D\", the manet-router linklocal " ++"multicast." ++msgstr "" ++ ++msgid "" ++"IPv6 network must be given in full notation, prefix must be in CIDR notation." ++msgstr "" ++ ++msgid "IPv6 source" ++msgstr "" ++ ++msgid "" ++"IPv6 src prefix. OLSRd will choose one of the interface IPs which matches " ++"the prefix of this parameter. Default is \"0::/0\", which triggers the usage " ++"of a not-linklocal interface IP." ++msgstr "" ++ ++msgid "IPv6-Prefix of the uplink" ++msgstr "" ++ ++msgid "" ++"If the route to the current gateway is to be changed, the ETX value of this " ++"gateway is multiplied with this value before it is compared to the new one. " ++"The parameter can be a value between 0.1 and 1.0, but should be close to 1.0 " ++"if changed.
    WARNING: This parameter should not be used together " ++"with the etx_ffeth metric!
    Defaults to \"1.0\"." ++msgstr "" ++ ++msgid "" ++"If this Node uses NAT for connections to the internet. Default is \"yes\"." ++msgstr "" ++ ++msgid "Interface" ++msgstr "Interfície" ++ ++msgid "" ++"Interface Mode is used to prevent unnecessary packet forwarding on switched " ++"ethernet interfaces. valid Modes are \"mesh\" and \"ether\". Default is " ++"\"mesh\"." ++msgstr "" ++ ++msgid "Interfaces" ++msgstr "Interfícies" ++ ++msgid "Interfaces Defaults" ++msgstr "" ++ ++msgid "Internet protocol" ++msgstr "Protocol d'Internet" ++ ++msgid "" ++"Interval to poll network interfaces for configuration changes (in seconds). " ++"Default is \"2.5\"." ++msgstr "" ++ ++msgid "Invalid Value for LQMult-Value. Must be between 0.01 and 1.0." ++msgstr "" ++ ++msgid "" ++"Invalid Value for LQMult-Value. You must use a decimal number between 0.01 " ++"and 1.0 here." ++msgstr "" ++ ++msgid "Known OLSR routes" ++msgstr "Rutes OLSR conegudes" ++ ++msgid "LQ" ++msgstr "LQ" ++ ++msgid "LQ aging" ++msgstr "Envelliment LQ" ++ ++msgid "LQ algorithm" ++msgstr "Algoritme LQ" ++ ++msgid "LQ fisheye" ++msgstr "LQ fisheye" ++ ++msgid "LQ level" ++msgstr "Nivell LQ" ++ ++msgid "" ++"LQMult requires two values (IP address or 'default' and multiplicator) " ++"seperated by space." ++msgstr "" ++ ++msgid "Last hop" ++msgstr "Últim salt" ++ ++msgid "Legend" ++msgstr "Llegenda" ++ ++msgid "Library" ++msgstr "Biblioteca" ++ ++msgid "Link Quality Settings" ++msgstr "Ajusts de qualitat d'enllaç" ++ ++msgid "" ++"Link quality aging factor (only for lq level 2). Tuning parameter for " ++"etx_float and etx_fpm, smaller values mean slower changes of ETX value. " ++"(allowed values are between 0.01 and 1.0)" ++msgstr "" ++ ++msgid "" ++"Link quality algorithm (only for lq level 2).
    etx_float: " ++"floating point ETX with exponential aging
    etx_fpm : same as " ++"etx_float, but with integer arithmetic
    etx_ff : ETX freifunk, an " ++"etx variant which use all OLSR traffic (instead of only hellos) for ETX " ++"calculation
    etx_ffeth: incompatible variant of etx_ff that " ++"allows ethernet links with ETX 0.1.
    Defaults to \"etx_ff\"" ++msgstr "" ++ ++msgid "" ++"Link quality level switch between hopcount and cost-based (mostly ETX) " ++"routing.
    0 = do not use link quality
    2 = use link " ++"quality for MPR selection and routing
    Default is \"2\"" ++msgstr "" ++ ++msgid "LinkQuality Multiplicator" ++msgstr "Multiplicador de qualitat d'enllaç" ++ ++msgid "Links per node (average)" ++msgstr "" ++ ++msgid "Links total" ++msgstr "" ++ ++msgid "Local interface IP" ++msgstr "IP d'interfície local" ++ ++msgid "MID" ++msgstr "MID" ++ ++msgid "MID interval" ++msgstr "Interval MID" ++ ++msgid "MID validity time" ++msgstr "Temps de validesa MID" ++ ++msgid "MTU" ++msgstr "MTU" ++ ++msgid "Main IP" ++msgstr "IP principal" ++ ++msgid "" ++"Make sure that OLSRd is running, the \"jsoninfo\" plugin is loaded, " ++"configured on port 9090 and accepts connections from \"127.0.0.1\"." ++msgstr "" ++ ++msgid "Metric" ++msgstr "Mètric" ++ ++msgid "Mode" ++msgstr "Mode" ++ ++msgid "" ++"Multiply routes with the factor given here. Allowed values are between 0.01 " ++"and 1.0. It is only used when LQ-Level is greater than 0. Examples:
    reduce LQ to 192.168.0.1 by half: 192.168.0.1 0.5
    reduce LQ to all " ++"nodes on this interface by 20%: default 0.8" ++msgstr "" ++ ++msgid "" ++"Multiply routes with the factor given here. Allowed values are between 0.01 " ++"and 1.0. It is only used when LQ-Level is greater than 0. Examples:
    reduce LQ to fd91:662e:3c58::1 by half: fd91:662e:3c58::1 0.5
    reduce " ++"LQ to all nodes on this interface by 20%: default 0.8" ++msgstr "" ++ ++msgid "NAT threshold" ++msgstr "Llindar NAT" ++ ++msgid "NLQ" ++msgstr "NLQ" ++ ++msgid "Neighbors" ++msgstr "Veïns" ++ ++msgid "Neighbour IP" ++msgstr "IP del veí" ++ ++msgid "Neighbours" ++msgstr "Veïns" ++ ++msgid "Netmask" ++msgstr "Màscara de xarxa" ++ ++msgid "Network" ++msgstr "Xarxa" ++ ++msgid "Network address" ++msgstr "Adreça de xarxa" ++ ++msgid "Nic changes poll interval" ++msgstr "" ++ ++msgid "Nodes" ++msgstr "" ++ ++msgid "OLSR" ++msgstr "OLSR" ++ ++msgid "OLSR - Display Options" ++msgstr "OLSR - Opcions de mostra" ++ ++msgid "OLSR - HNA-Announcements" ++msgstr "Anuncis OLSR - HNA" ++ ++#, fuzzy ++msgid "OLSR - HNA6-Announcements" ++msgstr "Anuncis OLSR - HNA" ++ ++msgid "OLSR - Plugins" ++msgstr "OLSR - Connectors" ++ ++msgid "OLSR Daemon" ++msgstr "Dimoni OLSR" ++ ++msgid "OLSR Daemon - Interface" ++msgstr "Dimoni OLSR - Interfície" ++ ++msgid "OLSR connections" ++msgstr "Connexions OLSR" ++ ++msgid "OLSR gateway" ++msgstr "Passarel·la OLSR" ++ ++msgid "OLSR node" ++msgstr "Node OLSR" ++ ++msgid "Orange" ++msgstr "" ++ ++msgid "Overview" ++msgstr "Visió de conjunt" ++ ++msgid "Overview of currently active OLSR host net announcements" ++msgstr "Visió de conjunt d'anuncis de xarxa de màquines OLSR actives" ++ ++msgid "Overview of currently established OLSR connections" ++msgstr "Visió de conjunt de les connexions OLSR establertes actualment" ++ ++msgid "Overview of currently known OLSR nodes" ++msgstr "Visió de conjunt dels nodes OLSR coneguts actualment" ++ ++msgid "Overview of currently known routes to other OLSR nodes" ++msgstr "Visió de conjunt de rutes conegudes actualment a altres nodes OLSR" ++ ++msgid "Overview of interfaces where OLSR is running" ++msgstr "Visió de conjunt de interfícies on està funcionant OLSR" ++ ++msgid "Overview of known multiple interface announcements" ++msgstr "Visió de conjunt d'anuncis d'interfície múltiple coneguts" ++ ++msgid "Overview of smart gateways in this network" ++msgstr "Visió de conjunt de les passarel·les intel·ligents en aquesta xarxa" ++ ++msgid "Plugin configuration" ++msgstr "Configuració de connector" ++ ++msgid "Plugins" ++msgstr "Connectors" ++ ++msgid "Polling rate for OLSR sockets in seconds. Default is 0.05." ++msgstr "" ++ ++msgid "Pollrate" ++msgstr "Taxa de sondeig" ++ ++msgid "Port" ++msgstr "Port" ++ ++msgid "Prefix" ++msgstr "Prefix" ++ ++msgid "Red" ++msgstr "" ++ ++msgid "Resolve" ++msgstr "" ++ ++msgid "" ++"Resolve hostnames on status pages. It is generally safe to allow this, but " ++"if you use public IPs and have unstable DNS-Setup then those pages will load " ++"really slow. In this case disable it here." ++msgstr "" ++ ++msgid "Routes" ++msgstr "" ++ ++msgid "Secondary OLSR interfaces" ++msgstr "Interfícies OSLR secundàries" ++ ++msgid "" ++"Sets the main IP (originator ip) of the router. This IP will NEVER change " ++"during the uptime of olsrd. Default is 0.0.0.0, which triggers usage of the " ++"IP of the first interface." ++msgstr "" ++ ++msgid "" ++"Sets the main IP (originator ip) of the router. This IP will NEVER change " ++"during the uptime of olsrd. Default is ::, which triggers usage of the IP of " ++"the first interface." ++msgstr "" ++ ++msgid "Show IPv4" ++msgstr "" ++ ++msgid "Show IPv6" ++msgstr "" ++ ++msgid "Signal Noise Ratio in dB" ++msgstr "" ++ ++msgid "SmartGW" ++msgstr "SmartGW" ++ ++msgid "SmartGW announcements" ++msgstr "Anuncis de SmartGW" ++ ++msgid "SmartGateway is not configured on this system." ++msgstr "" ++ ++msgid "Source address" ++msgstr "" ++ ++msgid "" ++"Specifies the speed of the uplink in kilobits/s. First parameter is " ++"upstream, second parameter is downstream. Default is \"128 1024\"." ++msgstr "" ++ ++msgid "Speed of the uplink" ++msgstr "" ++ ++msgid "State" ++msgstr "Estat" ++ ++msgid "Status" ++msgstr "Estat" ++ ++msgid "Still usable (20 > SNR > 5)" ++msgstr "" ++ ++msgid "Still usable (4 < ETX < 10)" ++msgstr "" ++ ++msgid "Success rate of packages received from the neighbour" ++msgstr "" ++ ++msgid "Success rate of packages sent to the neighbour" ++msgstr "" ++ ++msgid "TC" ++msgstr "TC" ++ ++msgid "TC interval" ++msgstr "Interval TC" ++ ++msgid "TC validity time" ++msgstr "Temps de validesa TC" ++ ++msgid "TOS value" ++msgstr "Valor TOS" ++ ++msgid "" ++"The OLSR daemon is an implementation of the Optimized Link State Routing " ++"protocol. As such it allows mesh routing for any network equipment. It runs " ++"on any wifi card that supports ad-hoc mode and of course on any ethernet " ++"device. Visit olsrd.org for help and " ++"documentation." ++msgstr "" ++ ++msgid "" ++"The fixed willingness to use. If not set willingness will be calculated " ++"dynamically based on battery/power status. Default is \"3\"." ++msgstr "" ++ ++msgid "The interface OLSRd should serve." ++msgstr "" ++ ++msgid "" ++"The port OLSR uses. This should usually stay at the IANA assigned port 698. " ++"It can have a value between 1 and 65535." ++msgstr "" ++ ++msgid "" ++"This can be used to signal the external IPv6 prefix of the uplink to the " ++"clients. This might allow a client to change it's local IPv6 address to use " ++"the IPv6 gateway without any kind of address translation. The maximum prefix " ++"length is 64 bits. Default is \"::/0\" (no prefix)." ++msgstr "" ++ ++msgid "Timing and Validity" ++msgstr "Sincronització i validitat" ++ ++msgid "Topology" ++msgstr "Topologia" ++ ++msgid "" ++"Type of service value for the IP header of control traffic. Default is " ++"\"16\"." ++msgstr "" ++ ++msgid "Unable to connect to the OLSR daemon!" ++msgstr "No s'ha pogut connectar al dimoni OLSR" ++ ++msgid "Uplink" ++msgstr "" ++ ++msgid "Uplink uses NAT" ++msgstr "" ++ ++msgid "Use hysteresis" ++msgstr "Utilitza histèresi" ++ ++msgid "Validity Time" ++msgstr "" ++ ++msgid "Version" ++msgstr "Versió" ++ ++msgid "Very good (ETX < 2)" ++msgstr "" ++ ++msgid "Very good (SNR > 30)" ++msgstr "" ++ ++msgid "WLAN" ++msgstr "WLAN" ++ ++msgid "" ++"Warning: kmod-ipip is not installed. Without kmod-ipip SmartGateway will not " ++"work, please install it." ++msgstr "" ++ ++msgid "Weight" ++msgstr "Pes" ++ ++msgid "" ++"When multiple links exist between hosts the weight of interface is used to " ++"determine the link to use. Normally the weight is automatically calculated " ++"by olsrd based on the characteristics of the interface, but here you can " ++"specify a fixed value. Olsrd will choose links with the lowest value.
    Note: Interface weight is used only when LinkQualityLevel is set to " ++"0. For any other value of LinkQualityLevel, the interface ETX value is used " ++"instead." ++msgstr "" ++ ++msgid "" ++"Which kind of uplink is exported to the other mesh nodes. An uplink is " ++"detected by looking for a local HNA of 0.0.0.0/0, ::ffff:0:0/96 or 2000::/3. " ++"Default setting is \"both\"." ++msgstr "" ++ ++msgid "" ++"Which kind of uplink is exported to the other mesh nodes. An uplink is " ++"detected by looking for a local HNA6 ::ffff:0:0/96 or 2000::/3. Default " ++"setting is \"both\"." ++msgstr "" ++ ++msgid "Willingness" ++msgstr "Voluntat" ++ ++msgid "Yellow" ++msgstr "" ++ ++msgid "no" ++msgstr "" ++ ++msgid "yes" ++msgstr "" ++ ++#~ msgid "Device" ++#~ msgstr "Dispositiu" ++ ++#~ msgid "" ++#~ "Make sure that OLSRd is running, the \"txtinfo\" plugin is loaded, " ++#~ "configured on port 2006 and accepts connections from \"127.0.0.1\"." ++#~ msgstr "" ++#~ "Assegura't que l'OLSRd està corrent, que el connector \"txtinfo\" està " ++#~ "carregat, configurat al port 2006, i que accepta connexions de " ++#~ "\"127.0.0.1\"." +diff --git a/feeds/luci/applications/luci-app-olsr/po/cs/olsr.po b/feeds/luci/applications/luci-app-olsr/po/cs/olsr.po +new file mode 100644 +index 0000000..3166907 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-olsr/po/cs/olsr.po +@@ -0,0 +1,693 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"PO-Revision-Date: 2014-06-21 14:56+0200\n" ++"Last-Translator: koli \n" ++"Language-Team: none\n" ++"Language: cs\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "Active MID announcements" ++msgstr "" ++ ++msgid "Active OLSR nodes" ++msgstr "" ++ ++msgid "Active host net announcements" ++msgstr "" ++ ++msgid "Advanced Settings" ++msgstr "PokroÄilé nastavení" ++ ++msgid "Allow gateways with NAT" ++msgstr "" ++ ++msgid "Allow the selection of an outgoing ipv4 gateway with NAT" ++msgstr "" ++ ++msgid "Announce uplink" ++msgstr "" ++ ++msgid "Announced network" ++msgstr "" ++ ++msgid "Bad (ETX > 10)" ++msgstr "Å patné (ETX > 10)" ++ ++msgid "Bad (SNR < 5)" ++msgstr "Å patné (SNR < 5)" ++ ++msgid "Both values must use the dotted decimal notation." ++msgstr "" ++ ++msgid "Broadcast address" ++msgstr "" ++ ++msgid "Can only be a valid IPv4 or IPv6 address or 'default'" ++msgstr "" ++ ++msgid "Can only be a valid IPv6 address or 'default'" ++msgstr "" ++ ++msgid "Configuration" ++msgstr "Konfigurace" ++ ++msgid "" ++"Could not get any data. Make sure the jsoninfo plugin is installed and " ++"allows connections from localhost." ++msgstr "" ++ ++msgid "Display" ++msgstr "" ++ ++msgid "Downlink" ++msgstr "Downlink" ++ ++msgid "Download Config" ++msgstr "" ++ ++msgid "ETX" ++msgstr "ETX" ++ ++msgid "Enable" ++msgstr "Povolit" ++ ++msgid "" ++"Enable SmartGateway. If it is disabled, then all other SmartGateway " ++"parameters are ignored. Default is \"no\"." ++msgstr "" ++ ++msgid "Enable this interface." ++msgstr "Povolit toto rozhraní." ++ ++msgid "Enabled" ++msgstr "Povoleno" ++ ++msgid "Expected retransmission count" ++msgstr "" ++ ++msgid "FIB metric" ++msgstr "" ++ ++msgid "" ++"FIBMetric controls the metric value of the host-routes OLSRd sets. \"flat\" " ++"means that the metric value is always 2. This is the preferred value because " ++"it helps the linux kernel routing to clean up older routes. \"correct\" uses " ++"the hopcount as the metric value. \"approx\" use the hopcount as the metric " ++"value too, but does only update the hopcount if the nexthop changes too. " ++"Default is \"flat\"." ++msgstr "" ++ ++msgid "Fisheye mechanism for TCs (checked means on). Default is \"on\"" ++msgstr "" ++ ++msgid "Gateway" ++msgstr "Gateway" ++ ++msgid "General Settings" ++msgstr "Obecné nastavení" ++ ++msgid "General settings" ++msgstr "Obecné nastavení" ++ ++msgid "Good (2 < ETX < 4)" ++msgstr "Dobré (2 < ETX < 4)" ++ ++msgid "Good (30 > SNR > 20)" ++msgstr "Dobré (30 > SNR > 20)" ++ ++msgid "Green" ++msgstr "Zelený" ++ ++msgid "HNA" ++msgstr "HNA" ++ ++msgid "HNA Announcements" ++msgstr "" ++ ++msgid "HNA interval" ++msgstr "HNA interval" ++ ++msgid "HNA validity time" ++msgstr "" ++ ++msgid "HNA6 Announcements" ++msgstr "" ++ ++msgid "Hello" ++msgstr "" ++ ++msgid "Hello interval" ++msgstr "" ++ ++msgid "Hello validity time" ++msgstr "" ++ ++msgid "Hide IPv4" ++msgstr "Skrýt IPv4" ++ ++msgid "Hide IPv6" ++msgstr "Skrýt IPv6" ++ ++msgid "Hna4" ++msgstr "Hna4" ++ ++msgid "Hna6" ++msgstr "Hna6" ++ ++msgid "Hops" ++msgstr "" ++ ++msgid "Hostname" ++msgstr "Hostname" ++ ++msgid "" ++"Hosts in a OLSR routed network can announce connecitivity to external " ++"networks using HNA messages." ++msgstr "" ++ ++msgid "" ++"Hosts in a OLSR routed network can announce connecitivity to external " ++"networks using HNA6 messages." ++msgstr "" ++ ++msgid "" ++"Hysteresis for link sensing (only for hopcount metric). Hysteresis adds more " ++"robustness to the link sensing but delays neighbor registration. Defaults is " ++"\"yes\"" ++msgstr "" ++ ++msgid "IP Addresses" ++msgstr "IP adresy" ++ ++msgid "" ++"IP-version to use. If 6and4 is selected then one olsrd instance is started " ++"for each protocol." ++msgstr "" ++ ++msgid "IPv4" ++msgstr "IPv4" ++ ++msgid "IPv4 broadcast" ++msgstr "IPv4 broadcast" ++ ++msgid "" ++"IPv4 broadcast address for outgoing OLSR packets. One useful example would " ++"be 255.255.255.255. Default is \"0.0.0.0\", which triggers the usage of the " ++"interface broadcast IP." ++msgstr "" ++ ++msgid "IPv4 source" ++msgstr "" ++ ++msgid "" ++"IPv4 src address for outgoing OLSR packages. Default is \"0.0.0.0\", which " ++"triggers usage of the interface IP." ++msgstr "" ++ ++msgid "IPv6" ++msgstr "IPv6" ++ ++msgid "IPv6 multicast" ++msgstr "IPv6 multicast" ++ ++msgid "" ++"IPv6 multicast address. Default is \"FF02::6D\", the manet-router linklocal " ++"multicast." ++msgstr "" ++ ++msgid "" ++"IPv6 network must be given in full notation, prefix must be in CIDR notation." ++msgstr "" ++ ++msgid "IPv6 source" ++msgstr "" ++ ++msgid "" ++"IPv6 src prefix. OLSRd will choose one of the interface IPs which matches " ++"the prefix of this parameter. Default is \"0::/0\", which triggers the usage " ++"of a not-linklocal interface IP." ++msgstr "" ++ ++msgid "IPv6-Prefix of the uplink" ++msgstr "" ++ ++msgid "" ++"If the route to the current gateway is to be changed, the ETX value of this " ++"gateway is multiplied with this value before it is compared to the new one. " ++"The parameter can be a value between 0.1 and 1.0, but should be close to 1.0 " ++"if changed.
    WARNING: This parameter should not be used together " ++"with the etx_ffeth metric!
    Defaults to \"1.0\"." ++msgstr "" ++ ++msgid "" ++"If this Node uses NAT for connections to the internet. Default is \"yes\"." ++msgstr "" ++ ++msgid "Interface" ++msgstr "Rozhraní" ++ ++msgid "" ++"Interface Mode is used to prevent unnecessary packet forwarding on switched " ++"ethernet interfaces. valid Modes are \"mesh\" and \"ether\". Default is " ++"\"mesh\"." ++msgstr "" ++ ++msgid "Interfaces" ++msgstr "Rozhraní" ++ ++msgid "Interfaces Defaults" ++msgstr "" ++ ++msgid "Internet protocol" ++msgstr "Internet protokol" ++ ++msgid "" ++"Interval to poll network interfaces for configuration changes (in seconds). " ++"Default is \"2.5\"." ++msgstr "" ++ ++msgid "Invalid Value for LQMult-Value. Must be between 0.01 and 1.0." ++msgstr "" ++ ++msgid "" ++"Invalid Value for LQMult-Value. You must use a decimal number between 0.01 " ++"and 1.0 here." ++msgstr "" ++ ++msgid "Known OLSR routes" ++msgstr "" ++ ++msgid "LQ" ++msgstr "LQ" ++ ++msgid "LQ aging" ++msgstr "" ++ ++msgid "LQ algorithm" ++msgstr "LQ algoritmus" ++ ++msgid "LQ fisheye" ++msgstr "" ++ ++msgid "LQ level" ++msgstr "" ++ ++msgid "" ++"LQMult requires two values (IP address or 'default' and multiplicator) " ++"seperated by space." ++msgstr "" ++ ++msgid "Last hop" ++msgstr "Poslední skok (hop)" ++ ++msgid "Legend" ++msgstr "Legenda" ++ ++msgid "Library" ++msgstr "Knihovna" ++ ++msgid "Link Quality Settings" ++msgstr "" ++ ++msgid "" ++"Link quality aging factor (only for lq level 2). Tuning parameter for " ++"etx_float and etx_fpm, smaller values mean slower changes of ETX value. " ++"(allowed values are between 0.01 and 1.0)" ++msgstr "" ++ ++msgid "" ++"Link quality algorithm (only for lq level 2).
    etx_float: " ++"floating point ETX with exponential aging
    etx_fpm : same as " ++"etx_float, but with integer arithmetic
    etx_ff : ETX freifunk, an " ++"etx variant which use all OLSR traffic (instead of only hellos) for ETX " ++"calculation
    etx_ffeth: incompatible variant of etx_ff that " ++"allows ethernet links with ETX 0.1.
    Defaults to \"etx_ff\"" ++msgstr "" ++ ++msgid "" ++"Link quality level switch between hopcount and cost-based (mostly ETX) " ++"routing.
    0 = do not use link quality
    2 = use link " ++"quality for MPR selection and routing
    Default is \"2\"" ++msgstr "" ++ ++msgid "LinkQuality Multiplicator" ++msgstr "" ++ ++msgid "Links per node (average)" ++msgstr "" ++ ++msgid "Links total" ++msgstr "" ++ ++msgid "Local interface IP" ++msgstr "IP lokálního rozhraní" ++ ++msgid "MID" ++msgstr "MID" ++ ++msgid "MID interval" ++msgstr "MID interval" ++ ++msgid "MID validity time" ++msgstr "" ++ ++msgid "MTU" ++msgstr "MTU" ++ ++msgid "Main IP" ++msgstr "Hlavní IP" ++ ++msgid "" ++"Make sure that OLSRd is running, the \"jsoninfo\" plugin is loaded, " ++"configured on port 9090 and accepts connections from \"127.0.0.1\"." ++msgstr "" ++ ++msgid "Metric" ++msgstr "" ++ ++msgid "Mode" ++msgstr "" ++ ++msgid "" ++"Multiply routes with the factor given here. Allowed values are between 0.01 " ++"and 1.0. It is only used when LQ-Level is greater than 0. Examples:
    reduce LQ to 192.168.0.1 by half: 192.168.0.1 0.5
    reduce LQ to all " ++"nodes on this interface by 20%: default 0.8" ++msgstr "" ++ ++msgid "" ++"Multiply routes with the factor given here. Allowed values are between 0.01 " ++"and 1.0. It is only used when LQ-Level is greater than 0. Examples:
    reduce LQ to fd91:662e:3c58::1 by half: fd91:662e:3c58::1 0.5
    reduce " ++"LQ to all nodes on this interface by 20%: default 0.8" ++msgstr "" ++ ++msgid "NAT threshold" ++msgstr "" ++ ++msgid "NLQ" ++msgstr "NLQ" ++ ++msgid "Neighbors" ++msgstr "Sousedé" ++ ++msgid "Neighbour IP" ++msgstr "IP souseda" ++ ++msgid "Neighbours" ++msgstr "Sousedé" ++ ++msgid "Netmask" ++msgstr "Maska sítě" ++ ++msgid "Network" ++msgstr "Síť" ++ ++msgid "Network address" ++msgstr "" ++ ++msgid "Nic changes poll interval" ++msgstr "" ++ ++msgid "Nodes" ++msgstr "" ++ ++msgid "OLSR" ++msgstr "OLSR" ++ ++msgid "OLSR - Display Options" ++msgstr "" ++ ++msgid "OLSR - HNA-Announcements" ++msgstr "" ++ ++msgid "OLSR - HNA6-Announcements" ++msgstr "" ++ ++msgid "OLSR - Plugins" ++msgstr "OLSR - pluginy" ++ ++msgid "OLSR Daemon" ++msgstr "" ++ ++msgid "OLSR Daemon - Interface" ++msgstr "" ++ ++msgid "OLSR connections" ++msgstr "" ++ ++msgid "OLSR gateway" ++msgstr "" ++ ++msgid "OLSR node" ++msgstr "" ++ ++msgid "Orange" ++msgstr "Oranžový" ++ ++msgid "Overview" ++msgstr "" ++ ++msgid "Overview of currently active OLSR host net announcements" ++msgstr "" ++ ++msgid "Overview of currently established OLSR connections" ++msgstr "" ++ ++msgid "Overview of currently known OLSR nodes" ++msgstr "" ++ ++msgid "Overview of currently known routes to other OLSR nodes" ++msgstr "" ++ ++msgid "Overview of interfaces where OLSR is running" ++msgstr "" ++ ++msgid "Overview of known multiple interface announcements" ++msgstr "" ++ ++msgid "Overview of smart gateways in this network" ++msgstr "" ++ ++msgid "Plugin configuration" ++msgstr "Konfigurace pluginu" ++ ++msgid "Plugins" ++msgstr "Pluginy" ++ ++msgid "Polling rate for OLSR sockets in seconds. Default is 0.05." ++msgstr "" ++ ++msgid "Pollrate" ++msgstr "" ++ ++msgid "Port" ++msgstr "Port" ++ ++msgid "Prefix" ++msgstr "Prefix" ++ ++msgid "Red" ++msgstr "Červený" ++ ++msgid "Resolve" ++msgstr "" ++ ++msgid "" ++"Resolve hostnames on status pages. It is generally safe to allow this, but " ++"if you use public IPs and have unstable DNS-Setup then those pages will load " ++"really slow. In this case disable it here." ++msgstr "" ++ ++msgid "Routes" ++msgstr "" ++ ++msgid "Secondary OLSR interfaces" ++msgstr "" ++ ++msgid "" ++"Sets the main IP (originator ip) of the router. This IP will NEVER change " ++"during the uptime of olsrd. Default is 0.0.0.0, which triggers usage of the " ++"IP of the first interface." ++msgstr "" ++ ++msgid "" ++"Sets the main IP (originator ip) of the router. This IP will NEVER change " ++"during the uptime of olsrd. Default is ::, which triggers usage of the IP of " ++"the first interface." ++msgstr "" ++ ++msgid "Show IPv4" ++msgstr "Zobrazit IPv4" ++ ++msgid "Show IPv6" ++msgstr "Zobrazit IPv6" ++ ++msgid "Signal Noise Ratio in dB" ++msgstr "Úroveň šumu v dB" ++ ++msgid "SmartGW" ++msgstr "SmartGW" ++ ++msgid "SmartGW announcements" ++msgstr "" ++ ++msgid "SmartGateway is not configured on this system." ++msgstr "" ++ ++msgid "Source address" ++msgstr "" ++ ++msgid "" ++"Specifies the speed of the uplink in kilobits/s. First parameter is " ++"upstream, second parameter is downstream. Default is \"128 1024\"." ++msgstr "" ++ ++msgid "Speed of the uplink" ++msgstr "" ++ ++msgid "State" ++msgstr "" ++ ++msgid "Status" ++msgstr "" ++ ++msgid "Still usable (20 > SNR > 5)" ++msgstr "Stále použitelné (4 < ETX < 10)" ++ ++msgid "Still usable (4 < ETX < 10)" ++msgstr "Stále použitelné (4 < ETX < 10)" ++ ++msgid "Success rate of packages received from the neighbour" ++msgstr "" ++ ++msgid "Success rate of packages sent to the neighbour" ++msgstr "" ++ ++msgid "TC" ++msgstr "TC" ++ ++msgid "TC interval" ++msgstr "TC interval" ++ ++msgid "TC validity time" ++msgstr "" ++ ++msgid "TOS value" ++msgstr "TOS hodnota" ++ ++msgid "" ++"The OLSR daemon is an implementation of the Optimized Link State Routing " ++"protocol. As such it allows mesh routing for any network equipment. It runs " ++"on any wifi card that supports ad-hoc mode and of course on any ethernet " ++"device. Visit olsrd.org for help and " ++"documentation." ++msgstr "" ++ ++msgid "" ++"The fixed willingness to use. If not set willingness will be calculated " ++"dynamically based on battery/power status. Default is \"3\"." ++msgstr "" ++ ++msgid "The interface OLSRd should serve." ++msgstr "" ++ ++msgid "" ++"The port OLSR uses. This should usually stay at the IANA assigned port 698. " ++"It can have a value between 1 and 65535." ++msgstr "" ++ ++msgid "" ++"This can be used to signal the external IPv6 prefix of the uplink to the " ++"clients. This might allow a client to change it's local IPv6 address to use " ++"the IPv6 gateway without any kind of address translation. The maximum prefix " ++"length is 64 bits. Default is \"::/0\" (no prefix)." ++msgstr "" ++ ++msgid "Timing and Validity" ++msgstr "" ++ ++msgid "Topology" ++msgstr "Topologie" ++ ++msgid "" ++"Type of service value for the IP header of control traffic. Default is " ++"\"16\"." ++msgstr "" ++ ++msgid "Unable to connect to the OLSR daemon!" ++msgstr "" ++ ++msgid "Uplink" ++msgstr "Uplink" ++ ++msgid "Uplink uses NAT" ++msgstr "" ++ ++msgid "Use hysteresis" ++msgstr "" ++ ++msgid "Validity Time" ++msgstr "" ++ ++msgid "Version" ++msgstr "Verze" ++ ++msgid "Very good (ETX < 2)" ++msgstr "Velmi dobré (ETX < 2)" ++ ++msgid "Very good (SNR > 30)" ++msgstr "Velmi dobré (SNR > 30)" ++ ++msgid "WLAN" ++msgstr "WLAN" ++ ++msgid "" ++"Warning: kmod-ipip is not installed. Without kmod-ipip SmartGateway will not " ++"work, please install it." ++msgstr "" ++ ++msgid "Weight" ++msgstr "Váha" ++ ++msgid "" ++"When multiple links exist between hosts the weight of interface is used to " ++"determine the link to use. Normally the weight is automatically calculated " ++"by olsrd based on the characteristics of the interface, but here you can " ++"specify a fixed value. Olsrd will choose links with the lowest value.
    Note: Interface weight is used only when LinkQualityLevel is set to " ++"0. For any other value of LinkQualityLevel, the interface ETX value is used " ++"instead." ++msgstr "" ++ ++msgid "" ++"Which kind of uplink is exported to the other mesh nodes. An uplink is " ++"detected by looking for a local HNA of 0.0.0.0/0, ::ffff:0:0/96 or 2000::/3. " ++"Default setting is \"both\"." ++msgstr "" ++ ++msgid "" ++"Which kind of uplink is exported to the other mesh nodes. An uplink is " ++"detected by looking for a local HNA6 ::ffff:0:0/96 or 2000::/3. Default " ++"setting is \"both\"." ++msgstr "" ++ ++msgid "Willingness" ++msgstr "" ++ ++msgid "Yellow" ++msgstr "Žlutý" ++ ++msgid "no" ++msgstr "ne" ++ ++msgid "yes" ++msgstr "ano" ++ ++#~ msgid "Device" ++#~ msgstr "Zařízení" +diff --git a/feeds/luci/applications/luci-app-olsr/po/de/olsr.po b/feeds/luci/applications/luci-app-olsr/po/de/olsr.po +new file mode 100644 +index 0000000..a23a20d +--- /dev/null ++++ b/feeds/luci/applications/luci-app-olsr/po/de/olsr.po +@@ -0,0 +1,814 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Report-Msgid-Bugs-To: \n" ++"POT-Creation-Date: \n" ++"PO-Revision-Date: 2012-11-21 20:54+0200\n" ++"Last-Translator: Jo-Philipp \n" ++"Language-Team: LANGUAGE \n" ++"Language: de\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n != 1);\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "Active MID announcements" ++msgstr "Aktive MID-Ankündigungen" ++ ++msgid "Active OLSR nodes" ++msgstr "Aktive OLSR-Knoten" ++ ++msgid "Active host net announcements" ++msgstr "Aktive HNA-Ankündigungen" ++ ++msgid "Advanced Settings" ++msgstr "Erweiterte Einstellungen" ++ ++msgid "Allow gateways with NAT" ++msgstr "Gateways mit NAT erlauben" ++ ++msgid "Allow the selection of an outgoing ipv4 gateway with NAT" ++msgstr "Auswahl von IPv4-Gateways erlauben, die zum Internet hin NAT verwenden" ++ ++msgid "Announce uplink" ++msgstr "Uplink ankündigen" ++ ++msgid "Announced network" ++msgstr "Angekündigtes Netzwerk" ++ ++msgid "Bad (ETX > 10)" ++msgstr "" ++ ++msgid "Bad (SNR < 5)" ++msgstr "" ++ ++msgid "Both values must use the dotted decimal notation." ++msgstr "" ++"Beide Werte müssen in der 'dotted decimal' Schreibweise angegeben werden." ++ ++msgid "Broadcast address" ++msgstr "Broadcast-Adresse" ++ ++msgid "Can only be a valid IPv4 or IPv6 address or 'default'" ++msgstr "" ++ ++msgid "Can only be a valid IPv6 address or 'default'" ++msgstr "" ++ ++msgid "Configuration" ++msgstr "Konfiguration" ++ ++msgid "" ++"Could not get any data. Make sure the jsoninfo plugin is installed and " ++"allows connections from localhost." ++msgstr "" ++ ++msgid "Display" ++msgstr "Anzeige" ++ ++msgid "Downlink" ++msgstr "Download-Bandbreite" ++ ++msgid "Download Config" ++msgstr "Konfiguration herunterladen" ++ ++msgid "ETX" ++msgstr "ETX" ++ ++msgid "Enable" ++msgstr "Aktivieren" ++ ++msgid "" ++"Enable SmartGateway. If it is disabled, then all other SmartGateway " ++"parameters are ignored. Default is \"no\"." ++msgstr "" ++"SmartGateway aktivieren. Ist diese Option deaktiviert, dann werden alle " ++"folgenden SmartGateway Einstellungen ignoriert. Der Defaultwert ist \"no\"." ++ ++msgid "Enable this interface." ++msgstr "Dieses Interface benutzen." ++ ++msgid "Enabled" ++msgstr "Aktiviert" ++ ++msgid "Expected retransmission count" ++msgstr "Zu erwartende Sendeversuche pro Paket" ++ ++msgid "FIB metric" ++msgstr "FIB-Metrik" ++ ++msgid "" ++"FIBMetric controls the metric value of the host-routes OLSRd sets. \"flat\" " ++"means that the metric value is always 2. This is the preferred value because " ++"it helps the linux kernel routing to clean up older routes. \"correct\" uses " ++"the hopcount as the metric value. \"approx\" use the hopcount as the metric " ++"value too, but does only update the hopcount if the nexthop changes too. " ++"Default is \"flat\"." ++msgstr "" ++"FIBMetric bestimmt die Metrik für Hostrouten die olsrd setzt. \"flat\" setzt " ++"die Metrik immer auf 2. Dies ist der bevorzugte Wert, da er dem Kernel dabei " ++"hilft, veraltete Routen zu löschen. \"correct\" verwendet den Hopcount als " ++"Metrik. \"approx\" benutzt ebenfalls den Hopcount als Metrik, updated diese " ++"aber nur, wenn sich auch der Nexthop verändert hat. Der Defaultwert ist " ++"\"flat\"." ++ ++msgid "Fisheye mechanism for TCs (checked means on). Default is \"on\"" ++msgstr "" ++"Fisheye Mechanismus für TC-Nachrichten (ausgewählt entspricht ein). Der " ++"Defaultwert ist \"ein\"" ++ ++msgid "Gateway" ++msgstr "Gateway" ++ ++msgid "General Settings" ++msgstr "Allgemeine Einstellungen" ++ ++msgid "General settings" ++msgstr "Allgemeine Einstellungen" ++ ++msgid "Good (2 < ETX < 4)" ++msgstr "" ++ ++msgid "Good (30 > SNR > 20)" ++msgstr "" ++ ++msgid "Green" ++msgstr "" ++ ++msgid "HNA" ++msgstr "HNA" ++ ++msgid "HNA Announcements" ++msgstr "HNA-Ankündigungen" ++ ++msgid "HNA interval" ++msgstr "HNA-Intervall" ++ ++msgid "HNA validity time" ++msgstr "HNA-Gültigkeit" ++ ++#, fuzzy ++msgid "HNA6 Announcements" ++msgstr "HNA-Ankündigungen" ++ ++msgid "Hello" ++msgstr "Hello" ++ ++msgid "Hello interval" ++msgstr "Hello-Intervall" ++ ++msgid "Hello validity time" ++msgstr "Hello-Gültigkeit" ++ ++msgid "Hide IPv4" ++msgstr "" ++ ++msgid "Hide IPv6" ++msgstr "" ++ ++msgid "Hna4" ++msgstr "Hna4" ++ ++msgid "Hna6" ++msgstr "Hna6" ++ ++msgid "Hops" ++msgstr "Sprünge" ++ ++msgid "Hostname" ++msgstr "Hostname" ++ ++msgid "" ++"Hosts in a OLSR routed network can announce connecitivity to external " ++"networks using HNA messages." ++msgstr "" ++"Rechner in einem OLSR-geroutetem Netzwerk können Konnektivität zu externen " ++"Netzwerken mittels HNA-Nachrichten ankündigen." ++ ++#, fuzzy ++msgid "" ++"Hosts in a OLSR routed network can announce connecitivity to external " ++"networks using HNA6 messages." ++msgstr "" ++"Rechner in einem OLSR-geroutetem Netzwerk können Konnektivität zu externen " ++"Netzwerken mittels HNA-Nachrichten ankündigen." ++ ++msgid "" ++"Hysteresis for link sensing (only for hopcount metric). Hysteresis adds more " ++"robustness to the link sensing but delays neighbor registration. Defaults is " ++"\"yes\"" ++msgstr "" ++"Verwende Hysterese zur Berechnung von Links (nur verfügbar für Hopcount " ++"Metric). Hysterese erhöht die Stabilität von berechneten Routen, verzögert " ++"aber das Registrieren von Nachbarknoten. Der Defaultwert ist \"eingeschaltet" ++"\"." ++ ++msgid "IP Addresses" ++msgstr "IP-Adressen" ++ ++msgid "" ++"IP-version to use. If 6and4 is selected then one olsrd instance is started " ++"for each protocol." ++msgstr "" ++"Die zu verwendende IP-Version. Wird 6and4 gewählt dann wird ein OLSRd-" ++"Prozess für jedes Protokoll gestartet." ++ ++msgid "IPv4" ++msgstr "IPv4" ++ ++msgid "IPv4 broadcast" ++msgstr "IPv4 Broadcast" ++ ++msgid "" ++"IPv4 broadcast address for outgoing OLSR packets. One useful example would " ++"be 255.255.255.255. Default is \"0.0.0.0\", which triggers the usage of the " ++"interface broadcast IP." ++msgstr "" ++"IPv4 Broadcastadresse für ausgehende OLSR-Pakete. Ein häufig verwendetes " ++"Beispiel ist 255.255.255.255. Der Defaultwert ist \"0.0.0.0\". Dies " ++"verwendet die Broadcastadresse des Interfaces." ++ ++msgid "IPv4 source" ++msgstr "IPv4 Quell-IP" ++ ++msgid "" ++"IPv4 src address for outgoing OLSR packages. Default is \"0.0.0.0\", which " ++"triggers usage of the interface IP." ++msgstr "" ++"IPv4 Quell-IP für ausgehende OLSR-Nachrichten. Der Defaultwert ist " ++"\"0.0.0.0\", dann wird die IP des Interfaces verwendet." ++ ++msgid "IPv6" ++msgstr "IPv6" ++ ++msgid "IPv6 multicast" ++msgstr "IPv6 Multicast" ++ ++msgid "" ++"IPv6 multicast address. Default is \"FF02::6D\", the manet-router linklocal " ++"multicast." ++msgstr "" ++"IPv6 Multicast-Adresse. Der Defaultwert ist \"FF02::6D\", die linklocal " ++"Multicastadresse für MANETs." ++ ++msgid "" ++"IPv6 network must be given in full notation, prefix must be in CIDR notation." ++msgstr "" ++"IPv6 Netzwerk muss in 'full notation', der Prefix in CIDR Schreibweise " ++"eingegeben werden." ++ ++msgid "IPv6 source" ++msgstr "IPv6 Quell-IP" ++ ++msgid "" ++"IPv6 src prefix. OLSRd will choose one of the interface IPs which matches " ++"the prefix of this parameter. Default is \"0::/0\", which triggers the usage " ++"of a not-linklocal interface IP." ++msgstr "" ++"IPv6 Quell-Prefix. OLSRd wählt eine IP als Quell-IP die innerhalb des " ++"angegebenen Prefix liegt. Der Defaultwert ist \"0::/0\", damit wird eine " ++"IPv6-Adresse des Interfaces verwendet die nicht linklocal ist." ++ ++msgid "IPv6-Prefix of the uplink" ++msgstr "IPv6-Präfix des Uplinks" ++ ++msgid "" ++"If the route to the current gateway is to be changed, the ETX value of this " ++"gateway is multiplied with this value before it is compared to the new one. " ++"The parameter can be a value between 0.1 and 1.0, but should be close to 1.0 " ++"if changed.
    WARNING: This parameter should not be used together " ++"with the etx_ffeth metric!
    Defaults to \"1.0\"." ++msgstr "" ++"Wenn sich die Route zum aktuellen Gateway ändert, dann wird sein ETX-Wert " ++"zunächst mit diesem Wert multipliziert bevor er mit dem neuen ETX-Wert " ++"verglichen wird. Damit kann \"flapping\" von Routen reduziert werden. Der " ++"Wert kann zwischen 0.1 und 1.0 liegen, sollte aber nahe bei 1.0 sein.
    ACHTUNG: Diese Einstellung darf nicht zusammen mit der etx_ffeth " ++"Metrik verwendet werden!
    Der Defaultwert ist \"1.0\"." ++ ++msgid "" ++"If this Node uses NAT for connections to the internet. Default is \"yes\"." ++msgstr "" ++"Benutzt dieser Knoten NAT für die Verbindung zum Internet? Der Defaultwert " ++"ist \"yes\"." ++ ++msgid "Interface" ++msgstr "Schnittstelle" ++ ++msgid "" ++"Interface Mode is used to prevent unnecessary packet forwarding on switched " ++"ethernet interfaces. valid Modes are \"mesh\" and \"ether\". Default is " ++"\"mesh\"." ++msgstr "" ++"Mit dieser Einstellung kann unnötiges Forwarden von Paketen auf geswitchten " ++"Ethernetschnittstellen unterbunden werden. Gültige Werte sind \"mesh\" und " ++"\"ether\". Der Defaultwert ist \"mesh\"." ++ ++msgid "Interfaces" ++msgstr "Schnittstellen" ++ ++msgid "Interfaces Defaults" ++msgstr "Schnittstellen-Standards" ++ ++msgid "Internet protocol" ++msgstr "Internet Protokoll" ++ ++msgid "" ++"Interval to poll network interfaces for configuration changes (in seconds). " ++"Default is \"2.5\"." ++msgstr "" ++"Intervall mit dem Netzwerkschnittstellen auf Änderungen in ihrer " ++"Konfiguration überprüft werden (in Sekunden). Der Defaultwert ist \"2.5\"." ++ ++msgid "Invalid Value for LQMult-Value. Must be between 0.01 and 1.0." ++msgstr "" ++ ++msgid "" ++"Invalid Value for LQMult-Value. You must use a decimal number between 0.01 " ++"and 1.0 here." ++msgstr "" ++ ++msgid "Known OLSR routes" ++msgstr "Bekannte OLSR-Routen" ++ ++msgid "LQ" ++msgstr "LQ" ++ ++msgid "LQ aging" ++msgstr "LQ-Alterung" ++ ++msgid "LQ algorithm" ++msgstr "LQ-Algorithmus" ++ ++msgid "LQ fisheye" ++msgstr "LQ-Fisheye" ++ ++msgid "LQ level" ++msgstr "LQ-Level" ++ ++msgid "" ++"LQMult requires two values (IP address or 'default' and multiplicator) " ++"seperated by space." ++msgstr "" ++ ++msgid "Last hop" ++msgstr "letzter Hop" ++ ++msgid "Legend" ++msgstr "Legende" ++ ++msgid "Library" ++msgstr "Bibliothek" ++ ++msgid "Link Quality Settings" ++msgstr "Linkqualitätseinstellungen" ++ ++msgid "" ++"Link quality aging factor (only for lq level 2). Tuning parameter for " ++"etx_float and etx_fpm, smaller values mean slower changes of ETX value. " ++"(allowed values are between 0.01 and 1.0)" ++msgstr "" ++"Der Linkqualitäts-Alterungsfaktor kann nur zusammen mit Linkqualitylevel 2 " ++"verwendet werden. Kleinere Werte bedeuten, dass ETX-Werte sich langsamer " ++"verändern. Erlaubte Werte sind 0.01 bis 1.0." ++ ++msgid "" ++"Link quality algorithm (only for lq level 2).
    etx_float: " ++"floating point ETX with exponential aging
    etx_fpm : same as " ++"etx_float, but with integer arithmetic
    etx_ff : ETX freifunk, an " ++"etx variant which use all OLSR traffic (instead of only hellos) for ETX " ++"calculation
    etx_ffeth: incompatible variant of etx_ff that " ++"allows ethernet links with ETX 0.1.
    Defaults to \"etx_ff\"" ++msgstr "" ++"Link Quality Algorithmus (nur für lq level 2).
    etx_float: " ++"floating point ETX mit exponentieller Alterung
    etx_fpm: Dasselbe " ++"wie etx_float, Berechnung jedoch mit Ganzzahlen
    etx_ff: ETX " ++"freifunk, eine ETX Variante die allen OLSR Traffic zur ETX Berechnung nutzt " ++"(und nicht nur Hello-Nachrichten)
    etx_ffeth: Inkompatible " ++"Variante von etx_ff die Ethernetlinks mit ETX 0.1 erlaubt
    Der Default " ++"ist \"etx_ff\"" ++ ++msgid "" ++"Link quality level switch between hopcount and cost-based (mostly ETX) " ++"routing.
    0 = do not use link quality
    2 = use link " ++"quality for MPR selection and routing
    Default is \"2\"" ++msgstr "" ++"Mit dieser Option kann der Linkquality-Algorithmus gewählt werden.
    0 = Linkquality nicht benutzen
    2 = Linkquality für die " ++"Wahl von MPRs und fürs Routing benutzen.
    Der Defaultwert ist \"2\"." ++ ++msgid "LinkQuality Multiplicator" ++msgstr "LQ-Multiplikator" ++ ++msgid "Links per node (average)" ++msgstr "Verbindungen pro Node (Durchschnitt)" ++ ++msgid "Links total" ++msgstr "Verbindungen insgesamt" ++ ++msgid "Local interface IP" ++msgstr "Lokale Interface-IP" ++ ++msgid "MID" ++msgstr "MID" ++ ++msgid "MID interval" ++msgstr "MID-Intervall" ++ ++msgid "MID validity time" ++msgstr "MID-Gültigkeit" ++ ++msgid "MTU" ++msgstr "MTU" ++ ++msgid "Main IP" ++msgstr "Haupt-IP" ++ ++msgid "" ++"Make sure that OLSRd is running, the \"jsoninfo\" plugin is loaded, " ++"configured on port 9090 and accepts connections from \"127.0.0.1\"." ++msgstr "" ++ ++msgid "Metric" ++msgstr "Metrik" ++ ++msgid "Mode" ++msgstr "Modus" ++ ++msgid "" ++"Multiply routes with the factor given here. Allowed values are between 0.01 " ++"and 1.0. It is only used when LQ-Level is greater than 0. Examples:
    reduce LQ to 192.168.0.1 by half: 192.168.0.1 0.5
    reduce LQ to all " ++"nodes on this interface by 20%: default 0.8" ++msgstr "" ++ ++#, fuzzy ++msgid "" ++"Multiply routes with the factor given here. Allowed values are between 0.01 " ++"and 1.0. It is only used when LQ-Level is greater than 0. Examples:
    reduce LQ to fd91:662e:3c58::1 by half: fd91:662e:3c58::1 0.5
    reduce " ++"LQ to all nodes on this interface by 20%: default 0.8" ++msgstr "" ++"Multipliziere die Linkquality (LQ) für Routen mit dem hier angegebenen " ++"Faktor, der zwischen 0.01 und 1 liegen kann. Beispiele:
    halbiere die LQ " ++"zu 192.168.0.1: 192.168.0.1 0.5
    reduziere die LQ für alle Nodes die mit " ++"diesem Interface kommunizieren um 20%: default 0.8" ++ ++msgid "NAT threshold" ++msgstr "NAT-Schwellenwert" ++ ++msgid "NLQ" ++msgstr "NLQ" ++ ++msgid "Neighbors" ++msgstr "Nachbarn" ++ ++msgid "Neighbour IP" ++msgstr "Nachbar-IP" ++ ++msgid "Neighbours" ++msgstr "Nachbarn" ++ ++msgid "Netmask" ++msgstr "Netzmaske" ++ ++msgid "Network" ++msgstr "Netzwerk" ++ ++msgid "Network address" ++msgstr "Netzwerk-Adresse" ++ ++msgid "Nic changes poll interval" ++msgstr "Abfrageintervall für Schnittstellenänderungen" ++ ++msgid "Nodes" ++msgstr "Knoten" ++ ++msgid "OLSR" ++msgstr "OLSR" ++ ++msgid "OLSR - Display Options" ++msgstr "OLSR - Anzeigeoptionen" ++ ++msgid "OLSR - HNA-Announcements" ++msgstr "OLSR - HNA-Ankündigungen" ++ ++#, fuzzy ++msgid "OLSR - HNA6-Announcements" ++msgstr "OLSR - HNA-Ankündigungen" ++ ++msgid "OLSR - Plugins" ++msgstr "OLSR - Plugins" ++ ++msgid "OLSR Daemon" ++msgstr "OLSR Daemon" ++ ++msgid "OLSR Daemon - Interface" ++msgstr "OLSR Daemon - Schnittstelle" ++ ++msgid "OLSR connections" ++msgstr "OLSR-Verbindungen" ++ ++msgid "OLSR gateway" ++msgstr "OLSR-Gateway" ++ ++msgid "OLSR node" ++msgstr "OLSR-Knoten" ++ ++msgid "Orange" ++msgstr "" ++ ++msgid "Overview" ++msgstr "Übersicht" ++ ++msgid "Overview of currently active OLSR host net announcements" ++msgstr "Übersicht über zur Zeit aktive OLSR-Netzwerk-Ankündigungen" ++ ++msgid "Overview of currently established OLSR connections" ++msgstr "Übersicht über aktuell bestehende OLSR-Verbindungen" ++ ++msgid "Overview of currently known OLSR nodes" ++msgstr "Übersicht über zur Zeit bekannte andere OLSR-Knoten" ++ ++msgid "Overview of currently known routes to other OLSR nodes" ++msgstr "Übersicht über zur Zeit bekannte Routen zu anderen OLSR-Knoten" ++ ++msgid "Overview of interfaces where OLSR is running" ++msgstr "Übersicht über Interfaces auf denen OLSRd läuft." ++ ++msgid "Overview of known multiple interface announcements" ++msgstr "Übersicht über bekannte Mehrfachschnittstellenmeldungen" ++ ++msgid "Overview of smart gateways in this network" ++msgstr "Übersicht über Smart Gateways in diesem Netzwerk." ++ ++msgid "Plugin configuration" ++msgstr "Pluginkonfiguration" ++ ++msgid "Plugins" ++msgstr "Plugins" ++ ++msgid "Polling rate for OLSR sockets in seconds. Default is 0.05." ++msgstr "Abfragerate für OLSRd-Sockets in Sekunden. Der Defaultwert ist 0.05." ++ ++msgid "Pollrate" ++msgstr "Abfragerate" ++ ++msgid "Port" ++msgstr "Port" ++ ++msgid "Prefix" ++msgstr "Prefix" ++ ++msgid "Red" ++msgstr "" ++ ++msgid "Resolve" ++msgstr "DNS auflösen" ++ ++msgid "" ++"Resolve hostnames on status pages. It is generally safe to allow this, but " ++"if you use public IPs and have unstable DNS-Setup then those pages will load " ++"really slow. In this case disable it here." ++msgstr "" ++"Hostnamen auf den Statusseiten auflösen. Dies ist in der Regel kein Problem, " ++"wenn aber öffentliche IPs benutzt werden und das DNS-Setup nicht stabil ist, " ++"dann werden die OLSR-Statusseiten nur sehr langsam laden. In diesem Fall " ++"sollte man diese Option deaktivieren." ++ ++msgid "Routes" ++msgstr "Routen" ++ ++msgid "Secondary OLSR interfaces" ++msgstr "Sekundäre OLSR Schnittstellen" ++ ++msgid "" ++"Sets the main IP (originator ip) of the router. This IP will NEVER change " ++"during the uptime of olsrd. Default is 0.0.0.0, which triggers usage of the " ++"IP of the first interface." ++msgstr "" ++"Setzt die Haupt-IP (originator ip) für diesen Router. Diese IP wird sich " ++"NIEMALS während der Laufzeit von OLSRD verändern. Der Defaultwert ist " ++"0.0.0.0. Damit wird die IP des ersten Interfaces verwendet." ++ ++#, fuzzy ++msgid "" ++"Sets the main IP (originator ip) of the router. This IP will NEVER change " ++"during the uptime of olsrd. Default is ::, which triggers usage of the IP of " ++"the first interface." ++msgstr "" ++"Setzt die Haupt-IP (originator ip) für diesen Router. Diese IP wird sich " ++"NIEMALS während der Laufzeit von OLSRD verändern. Der Defaultwert ist " ++"0.0.0.0. Damit wird die IP des ersten Interfaces verwendet." ++ ++msgid "Show IPv4" ++msgstr "" ++ ++msgid "Show IPv6" ++msgstr "" ++ ++msgid "Signal Noise Ratio in dB" ++msgstr "" ++ ++msgid "SmartGW" ++msgstr "Smart Gateway" ++ ++msgid "SmartGW announcements" ++msgstr "Smart Gateway Ankündigungen" ++ ++msgid "SmartGateway is not configured on this system." ++msgstr "Smart Gateway ist auf diesem System nicht konfiguriert." ++ ++msgid "Source address" ++msgstr "Quell-IP" ++ ++msgid "" ++"Specifies the speed of the uplink in kilobits/s. First parameter is " ++"upstream, second parameter is downstream. Default is \"128 1024\"." ++msgstr "" ++"Hiermit kann man die Geschwindigkeit des Uplinks dieses Knotens ankündigen. " ++"Der erste Wert ist die Upload-, der zweite Wert die Downloadgeschwindigkeit. " ++"Der Defaultwert ist \"128 1024\"." ++ ++msgid "Speed of the uplink" ++msgstr "Geschwindigkeit des Uplinks" ++ ++msgid "State" ++msgstr "Status" ++ ++msgid "Status" ++msgstr "Status" ++ ++msgid "Still usable (20 > SNR > 5)" ++msgstr "" ++ ++msgid "Still usable (4 < ETX < 10)" ++msgstr "" ++ ++msgid "Success rate of packages received from the neighbour" ++msgstr "Erfolgsquote vom Nachbarn empfangener Pakete" ++ ++msgid "Success rate of packages sent to the neighbour" ++msgstr "Erfolgsquote zum Nachbarn gesendeter Pakete" ++ ++msgid "TC" ++msgstr "TC" ++ ++msgid "TC interval" ++msgstr "TC-Intervall" ++ ++msgid "TC validity time" ++msgstr "TC-Gültigkeit" ++ ++msgid "TOS value" ++msgstr "TOS-Wert" ++ ++msgid "" ++"The OLSR daemon is an implementation of the Optimized Link State Routing " ++"protocol. As such it allows mesh routing for any network equipment. It runs " ++"on any wifi card that supports ad-hoc mode and of course on any ethernet " ++"device. Visit olsrd.org for help and " ++"documentation." ++msgstr "" ++"OLSR ist eine Implementation des Optimized Link State Routing Protokolls und " ++"erlaubt damit Mesh-Routing für jegliche Netzwerkgeräte. Besuche olsrd.org für Hilfe und Dokumentation." ++ ++msgid "" ++"The fixed willingness to use. If not set willingness will be calculated " ++"dynamically based on battery/power status. Default is \"3\"." ++msgstr "" ++"Hier kann ein Bereitschaftswert angegeben werden. Bleibt dieses Feld leer, " ++"dann wird der Bereitschaftswert automatisch anhand von Akkukapazität und " ++"Stromversorgung berechnet" ++ ++msgid "The interface OLSRd should serve." ++msgstr "Interface das OLSRd verwenden soll." ++ ++msgid "" ++"The port OLSR uses. This should usually stay at the IANA assigned port 698. " ++"It can have a value between 1 and 65535." ++msgstr "" ++"Port, den OLSRd benutzt. Dieser sollte in der Regel auf dem Defaultwert 698 " ++"bleiben, was dem von IANA zugewiesenen Port für OLSRd entspricht." ++ ++msgid "" ++"This can be used to signal the external IPv6 prefix of the uplink to the " ++"clients. This might allow a client to change it's local IPv6 address to use " ++"the IPv6 gateway without any kind of address translation. The maximum prefix " ++"length is 64 bits. Default is \"::/0\" (no prefix)." ++msgstr "" ++"Hiermit kann der externe IPv6-Präfix an Clients signalisiert werden. Dadurch " ++"können Clients ihre lokale IP-Adresse ändern, um diesen IPv6-Gateway ohne " ++"Übersetzung der IPv6-Adresse zu benutzen. Die maximale erlaubte Länge des " ++"Präfix ist 64 bit. Der Defaultwert ist \"::/0\" (kein Präfix)." ++ ++msgid "Timing and Validity" ++msgstr "Taktung und Validität" ++ ++msgid "Topology" ++msgstr "Topologie" ++ ++msgid "" ++"Type of service value for the IP header of control traffic. Default is " ++"\"16\"." ++msgstr "" ++"TOS-Wert für den IP-Header von OLSR-Nachrichten. Der Defaultwert ist \"16\"." ++ ++msgid "Unable to connect to the OLSR daemon!" ++msgstr "Es konnte keine Verbindung zum OLSR-Daemon hergestellt werden!" ++ ++msgid "Uplink" ++msgstr "Upload-Bandbreite" ++ ++msgid "Uplink uses NAT" ++msgstr "Der Uplink benutzt NAT." ++ ++msgid "Use hysteresis" ++msgstr "Hysterese aktivieren" ++ ++msgid "Validity Time" ++msgstr "" ++ ++msgid "Version" ++msgstr "Version" ++ ++msgid "Very good (ETX < 2)" ++msgstr "" ++ ++msgid "Very good (SNR > 30)" ++msgstr "" ++ ++msgid "WLAN" ++msgstr "WLAN" ++ ++msgid "" ++"Warning: kmod-ipip is not installed. Without kmod-ipip SmartGateway will not " ++"work, please install it." ++msgstr "" ++"WARNUNG: kmod-ipip ist nicht installiert. Ohne kmod-ipip wird SmartGateway " ++"nicht funktionieren!" ++ ++msgid "Weight" ++msgstr "Gewichtung" ++ ++msgid "" ++"When multiple links exist between hosts the weight of interface is used to " ++"determine the link to use. Normally the weight is automatically calculated " ++"by olsrd based on the characteristics of the interface, but here you can " ++"specify a fixed value. Olsrd will choose links with the lowest value.
    Note: Interface weight is used only when LinkQualityLevel is set to " ++"0. For any other value of LinkQualityLevel, the interface ETX value is used " ++"instead." ++msgstr "" ++"Gibt es mehrere Links zwischen einzelnen Nodes dann wird ein Gewichtungswert " ++"verwendet um zu bestimmen, welches Interface bevorzugt wird. Dieses Gewicht " ++"wird in der Regel automatisch berechnet, kann hier jedoch mit einem festen " ++"Wert überschrieben werden. OLSRd wählt den Link mit dem niedrigsten Wert. " ++"
    Hinweis: Diese Gewichtung ist nur möglich wenn " ++"LinkQualityLevel= 0 ist. Für alle anderen Werte von LinkQualityLevel wird " ++"stattdessen der ETX-Wert verwendet." ++ ++msgid "" ++"Which kind of uplink is exported to the other mesh nodes. An uplink is " ++"detected by looking for a local HNA of 0.0.0.0/0, ::ffff:0:0/96 or 2000::/3. " ++"Default setting is \"both\"." ++msgstr "" ++"Welche Art von Uplink im Mesh angekündigt wird. Ein Uplink wird automatisch " ++"anhand der lokal angekündigten HNA erkannt (0.0.0.0/0, ::ffff:0:0/96 oder " ++"2000::/3). Der Defaultwert ist \"both\" (sowohl IPv4 als auch IPv6 Uplink " ++"ankündigen sofern verfügbar)." ++ ++#, fuzzy ++msgid "" ++"Which kind of uplink is exported to the other mesh nodes. An uplink is " ++"detected by looking for a local HNA6 ::ffff:0:0/96 or 2000::/3. Default " ++"setting is \"both\"." ++msgstr "" ++"Welche Art von Uplink im Mesh angekündigt wird. Ein Uplink wird automatisch " ++"anhand der lokal angekündigten HNA erkannt (0.0.0.0/0, ::ffff:0:0/96 oder " ++"2000::/3). Der Defaultwert ist \"both\" (sowohl IPv4 als auch IPv6 Uplink " ++"ankündigen sofern verfügbar)." ++ ++msgid "Willingness" ++msgstr "Bereitschaft" ++ ++msgid "Yellow" ++msgstr "" ++ ++msgid "no" ++msgstr "" ++ ++msgid "yes" ++msgstr "" ++ ++#~ msgid "Device" ++#~ msgstr "Schnittstelle" ++ ++#~ msgid "" ++#~ "Make sure that OLSRd is running, the \"txtinfo\" plugin is loaded, " ++#~ "configured on port 2006 and accepts connections from \"127.0.0.1\"." ++#~ msgstr "" ++#~ "Stellen Sie sicher das OLSRd läuft und das \"txtinfo\" Plugin auf Port " ++#~ "2006 geladen und \"127.0.0.1\" als Accept-Host gesetzt ist." +diff --git a/feeds/luci/applications/luci-app-olsr/po/el/olsr.po b/feeds/luci/applications/luci-app-olsr/po/el/olsr.po +new file mode 100644 +index 0000000..a3cf0d2 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-olsr/po/el/olsr.po +@@ -0,0 +1,695 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Report-Msgid-Bugs-To: \n" ++"POT-Creation-Date: 2009-05-28 02:08+0200\n" ++"PO-Revision-Date: 2012-03-31 15:41+0200\n" ++"Last-Translator: Vasilis \n" ++"Language-Team: LANGUAGE \n" ++"Language: el\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n != 1);\n" ++"X-Generator: Pootle 2.0.4\n" ++ ++msgid "Active MID announcements" ++msgstr "" ++ ++msgid "Active OLSR nodes" ++msgstr "ΕνεÏγοί κόμβοι OLSR" ++ ++msgid "Active host net announcements" ++msgstr "" ++ ++msgid "Advanced Settings" ++msgstr "ΠÏοχωÏημένες Ρυθμίσεις" ++ ++msgid "Allow gateways with NAT" ++msgstr "" ++ ++msgid "Allow the selection of an outgoing ipv4 gateway with NAT" ++msgstr "" ++ ++msgid "Announce uplink" ++msgstr "" ++ ++msgid "Announced network" ++msgstr "" ++ ++msgid "Bad (ETX > 10)" ++msgstr "" ++ ++msgid "Bad (SNR < 5)" ++msgstr "" ++ ++msgid "Both values must use the dotted decimal notation." ++msgstr "" ++ ++msgid "Broadcast address" ++msgstr "" ++ ++msgid "Can only be a valid IPv4 or IPv6 address or 'default'" ++msgstr "" ++ ++msgid "Can only be a valid IPv6 address or 'default'" ++msgstr "" ++ ++msgid "Configuration" ++msgstr "" ++ ++msgid "" ++"Could not get any data. Make sure the jsoninfo plugin is installed and " ++"allows connections from localhost." ++msgstr "" ++ ++msgid "Display" ++msgstr "" ++ ++msgid "Downlink" ++msgstr "" ++ ++msgid "Download Config" ++msgstr "" ++ ++msgid "ETX" ++msgstr "ETX" ++ ++msgid "Enable" ++msgstr "ΕνεÏγοποίηση" ++ ++msgid "" ++"Enable SmartGateway. If it is disabled, then all other SmartGateway " ++"parameters are ignored. Default is \"no\"." ++msgstr "" ++ ++msgid "Enable this interface." ++msgstr "ΕνεÏγοποίηση αυτής της διεπαφής." ++ ++msgid "Enabled" ++msgstr "" ++ ++msgid "Expected retransmission count" ++msgstr "" ++ ++msgid "FIB metric" ++msgstr "" ++ ++msgid "" ++"FIBMetric controls the metric value of the host-routes OLSRd sets. \"flat\" " ++"means that the metric value is always 2. This is the preferred value because " ++"it helps the linux kernel routing to clean up older routes. \"correct\" uses " ++"the hopcount as the metric value. \"approx\" use the hopcount as the metric " ++"value too, but does only update the hopcount if the nexthop changes too. " ++"Default is \"flat\"." ++msgstr "" ++ ++msgid "Fisheye mechanism for TCs (checked means on). Default is \"on\"" ++msgstr "" ++ ++msgid "Gateway" ++msgstr "ΠÏλη" ++ ++msgid "General Settings" ++msgstr "Γενικές Ρυθμίσεις" ++ ++msgid "General settings" ++msgstr "Γενικές Ïυθμίσεις" ++ ++msgid "Good (2 < ETX < 4)" ++msgstr "" ++ ++msgid "Good (30 > SNR > 20)" ++msgstr "" ++ ++msgid "Green" ++msgstr "" ++ ++msgid "HNA" ++msgstr "HNA" ++ ++msgid "HNA Announcements" ++msgstr "" ++ ++msgid "HNA interval" ++msgstr "" ++ ++msgid "HNA validity time" ++msgstr "" ++ ++msgid "HNA6 Announcements" ++msgstr "" ++ ++msgid "Hello" ++msgstr "" ++ ++msgid "Hello interval" ++msgstr "" ++ ++msgid "Hello validity time" ++msgstr "" ++ ++msgid "Hide IPv4" ++msgstr "" ++ ++msgid "Hide IPv6" ++msgstr "" ++ ++msgid "Hna4" ++msgstr "" ++ ++msgid "Hna6" ++msgstr "" ++ ++msgid "Hops" ++msgstr "" ++ ++msgid "Hostname" ++msgstr "" ++ ++msgid "" ++"Hosts in a OLSR routed network can announce connecitivity to external " ++"networks using HNA messages." ++msgstr "" ++ ++msgid "" ++"Hosts in a OLSR routed network can announce connecitivity to external " ++"networks using HNA6 messages." ++msgstr "" ++ ++msgid "" ++"Hysteresis for link sensing (only for hopcount metric). Hysteresis adds more " ++"robustness to the link sensing but delays neighbor registration. Defaults is " ++"\"yes\"" ++msgstr "" ++ ++msgid "IP Addresses" ++msgstr "ΔιευθÏνσεις IP" ++ ++msgid "" ++"IP-version to use. If 6and4 is selected then one olsrd instance is started " ++"for each protocol." ++msgstr "" ++ ++msgid "IPv4" ++msgstr "IPv4" ++ ++msgid "IPv4 broadcast" ++msgstr "" ++ ++msgid "" ++"IPv4 broadcast address for outgoing OLSR packets. One useful example would " ++"be 255.255.255.255. Default is \"0.0.0.0\", which triggers the usage of the " ++"interface broadcast IP." ++msgstr "" ++ ++msgid "IPv4 source" ++msgstr "" ++ ++msgid "" ++"IPv4 src address for outgoing OLSR packages. Default is \"0.0.0.0\", which " ++"triggers usage of the interface IP." ++msgstr "" ++ ++msgid "IPv6" ++msgstr "IPv6" ++ ++msgid "IPv6 multicast" ++msgstr "" ++ ++msgid "" ++"IPv6 multicast address. Default is \"FF02::6D\", the manet-router linklocal " ++"multicast." ++msgstr "" ++ ++msgid "" ++"IPv6 network must be given in full notation, prefix must be in CIDR notation." ++msgstr "" ++ ++msgid "IPv6 source" ++msgstr "" ++ ++msgid "" ++"IPv6 src prefix. OLSRd will choose one of the interface IPs which matches " ++"the prefix of this parameter. Default is \"0::/0\", which triggers the usage " ++"of a not-linklocal interface IP." ++msgstr "" ++ ++msgid "IPv6-Prefix of the uplink" ++msgstr "" ++ ++msgid "" ++"If the route to the current gateway is to be changed, the ETX value of this " ++"gateway is multiplied with this value before it is compared to the new one. " ++"The parameter can be a value between 0.1 and 1.0, but should be close to 1.0 " ++"if changed.
    WARNING: This parameter should not be used together " ++"with the etx_ffeth metric!
    Defaults to \"1.0\"." ++msgstr "" ++ ++msgid "" ++"If this Node uses NAT for connections to the internet. Default is \"yes\"." ++msgstr "" ++ ++msgid "Interface" ++msgstr "Διεπαφή" ++ ++msgid "" ++"Interface Mode is used to prevent unnecessary packet forwarding on switched " ++"ethernet interfaces. valid Modes are \"mesh\" and \"ether\". Default is " ++"\"mesh\"." ++msgstr "" ++ ++msgid "Interfaces" ++msgstr "Διεπαφές" ++ ++msgid "Interfaces Defaults" ++msgstr "" ++ ++msgid "Internet protocol" ++msgstr "" ++ ++msgid "" ++"Interval to poll network interfaces for configuration changes (in seconds). " ++"Default is \"2.5\"." ++msgstr "" ++ ++msgid "Invalid Value for LQMult-Value. Must be between 0.01 and 1.0." ++msgstr "" ++ ++msgid "" ++"Invalid Value for LQMult-Value. You must use a decimal number between 0.01 " ++"and 1.0 here." ++msgstr "" ++ ++msgid "Known OLSR routes" ++msgstr "" ++ ++msgid "LQ" ++msgstr "" ++ ++msgid "LQ aging" ++msgstr "" ++ ++msgid "LQ algorithm" ++msgstr "" ++ ++msgid "LQ fisheye" ++msgstr "" ++ ++msgid "LQ level" ++msgstr "" ++ ++msgid "" ++"LQMult requires two values (IP address or 'default' and multiplicator) " ++"seperated by space." ++msgstr "" ++ ++msgid "Last hop" ++msgstr "" ++ ++msgid "Legend" ++msgstr "" ++ ++msgid "Library" ++msgstr "" ++ ++msgid "Link Quality Settings" ++msgstr "" ++ ++msgid "" ++"Link quality aging factor (only for lq level 2). Tuning parameter for " ++"etx_float and etx_fpm, smaller values mean slower changes of ETX value. " ++"(allowed values are between 0.01 and 1.0)" ++msgstr "" ++ ++msgid "" ++"Link quality algorithm (only for lq level 2).
    etx_float: " ++"floating point ETX with exponential aging
    etx_fpm : same as " ++"etx_float, but with integer arithmetic
    etx_ff : ETX freifunk, an " ++"etx variant which use all OLSR traffic (instead of only hellos) for ETX " ++"calculation
    etx_ffeth: incompatible variant of etx_ff that " ++"allows ethernet links with ETX 0.1.
    Defaults to \"etx_ff\"" ++msgstr "" ++ ++msgid "" ++"Link quality level switch between hopcount and cost-based (mostly ETX) " ++"routing.
    0 = do not use link quality
    2 = use link " ++"quality for MPR selection and routing
    Default is \"2\"" ++msgstr "" ++ ++msgid "LinkQuality Multiplicator" ++msgstr "" ++ ++msgid "Links per node (average)" ++msgstr "" ++ ++msgid "Links total" ++msgstr "Συνδέσεις σÏνολο" ++ ++msgid "Local interface IP" ++msgstr "IP τοπικής διεπαφής" ++ ++msgid "MID" ++msgstr "" ++ ++msgid "MID interval" ++msgstr "" ++ ++msgid "MID validity time" ++msgstr "" ++ ++msgid "MTU" ++msgstr "MTU" ++ ++msgid "Main IP" ++msgstr "" ++ ++msgid "" ++"Make sure that OLSRd is running, the \"jsoninfo\" plugin is loaded, " ++"configured on port 9090 and accepts connections from \"127.0.0.1\"." ++msgstr "" ++ ++msgid "Metric" ++msgstr "" ++ ++msgid "Mode" ++msgstr "" ++ ++msgid "" ++"Multiply routes with the factor given here. Allowed values are between 0.01 " ++"and 1.0. It is only used when LQ-Level is greater than 0. Examples:
    reduce LQ to 192.168.0.1 by half: 192.168.0.1 0.5
    reduce LQ to all " ++"nodes on this interface by 20%: default 0.8" ++msgstr "" ++ ++msgid "" ++"Multiply routes with the factor given here. Allowed values are between 0.01 " ++"and 1.0. It is only used when LQ-Level is greater than 0. Examples:
    reduce LQ to fd91:662e:3c58::1 by half: fd91:662e:3c58::1 0.5
    reduce " ++"LQ to all nodes on this interface by 20%: default 0.8" ++msgstr "" ++ ++msgid "NAT threshold" ++msgstr "" ++ ++msgid "NLQ" ++msgstr "" ++ ++msgid "Neighbors" ++msgstr "" ++ ++msgid "Neighbour IP" ++msgstr "" ++ ++msgid "Neighbours" ++msgstr "" ++ ++msgid "Netmask" ++msgstr "" ++ ++msgid "Network" ++msgstr "Δίκτυο" ++ ++msgid "Network address" ++msgstr "ΔιεÏθυνση δικτÏου" ++ ++msgid "Nic changes poll interval" ++msgstr "" ++ ++msgid "Nodes" ++msgstr "" ++ ++msgid "OLSR" ++msgstr "OLSR" ++ ++msgid "OLSR - Display Options" ++msgstr "" ++ ++msgid "OLSR - HNA-Announcements" ++msgstr "" ++ ++msgid "OLSR - HNA6-Announcements" ++msgstr "" ++ ++msgid "OLSR - Plugins" ++msgstr "" ++ ++msgid "OLSR Daemon" ++msgstr "OLSR Δαίμονας" ++ ++msgid "OLSR Daemon - Interface" ++msgstr "OLSR Δαίμονας - Διεπαφή" ++ ++msgid "OLSR connections" ++msgstr "OLSR συνδέσεις" ++ ++msgid "OLSR gateway" ++msgstr "OLSR Ï€Ïλη" ++ ++msgid "OLSR node" ++msgstr "" ++ ++msgid "Orange" ++msgstr "" ++ ++msgid "Overview" ++msgstr "" ++ ++msgid "Overview of currently active OLSR host net announcements" ++msgstr "" ++ ++msgid "Overview of currently established OLSR connections" ++msgstr "" ++ ++msgid "Overview of currently known OLSR nodes" ++msgstr "" ++ ++msgid "Overview of currently known routes to other OLSR nodes" ++msgstr "" ++ ++msgid "Overview of interfaces where OLSR is running" ++msgstr "" ++ ++msgid "Overview of known multiple interface announcements" ++msgstr "" ++ ++msgid "Overview of smart gateways in this network" ++msgstr "" ++ ++msgid "Plugin configuration" ++msgstr "" ++ ++msgid "Plugins" ++msgstr "" ++ ++msgid "Polling rate for OLSR sockets in seconds. Default is 0.05." ++msgstr "" ++ ++msgid "Pollrate" ++msgstr "" ++ ++msgid "Port" ++msgstr "ΠόÏτα" ++ ++msgid "Prefix" ++msgstr "" ++ ++msgid "Red" ++msgstr "" ++ ++msgid "Resolve" ++msgstr "" ++ ++msgid "" ++"Resolve hostnames on status pages. It is generally safe to allow this, but " ++"if you use public IPs and have unstable DNS-Setup then those pages will load " ++"really slow. In this case disable it here." ++msgstr "" ++ ++msgid "Routes" ++msgstr "ΔιαδÏομές" ++ ++msgid "Secondary OLSR interfaces" ++msgstr "" ++ ++msgid "" ++"Sets the main IP (originator ip) of the router. This IP will NEVER change " ++"during the uptime of olsrd. Default is 0.0.0.0, which triggers usage of the " ++"IP of the first interface." ++msgstr "" ++ ++msgid "" ++"Sets the main IP (originator ip) of the router. This IP will NEVER change " ++"during the uptime of olsrd. Default is ::, which triggers usage of the IP of " ++"the first interface." ++msgstr "" ++ ++msgid "Show IPv4" ++msgstr "" ++ ++msgid "Show IPv6" ++msgstr "" ++ ++msgid "Signal Noise Ratio in dB" ++msgstr "" ++ ++msgid "SmartGW" ++msgstr "SmartGW" ++ ++msgid "SmartGW announcements" ++msgstr "" ++ ++msgid "SmartGateway is not configured on this system." ++msgstr "" ++ ++msgid "Source address" ++msgstr "" ++ ++msgid "" ++"Specifies the speed of the uplink in kilobits/s. First parameter is " ++"upstream, second parameter is downstream. Default is \"128 1024\"." ++msgstr "" ++ ++msgid "Speed of the uplink" ++msgstr "" ++ ++msgid "State" ++msgstr "" ++ ++msgid "Status" ++msgstr "" ++ ++msgid "Still usable (20 > SNR > 5)" ++msgstr "" ++ ++msgid "Still usable (4 < ETX < 10)" ++msgstr "" ++ ++msgid "Success rate of packages received from the neighbour" ++msgstr "" ++ ++msgid "Success rate of packages sent to the neighbour" ++msgstr "" ++ ++msgid "TC" ++msgstr "" ++ ++msgid "TC interval" ++msgstr "" ++ ++msgid "TC validity time" ++msgstr "" ++ ++msgid "TOS value" ++msgstr "" ++ ++msgid "" ++"The OLSR daemon is an implementation of the Optimized Link State Routing " ++"protocol. As such it allows mesh routing for any network equipment. It runs " ++"on any wifi card that supports ad-hoc mode and of course on any ethernet " ++"device. Visit olsrd.org for help and " ++"documentation." ++msgstr "" ++ ++msgid "" ++"The fixed willingness to use. If not set willingness will be calculated " ++"dynamically based on battery/power status. Default is \"3\"." ++msgstr "" ++ ++msgid "The interface OLSRd should serve." ++msgstr "" ++ ++msgid "" ++"The port OLSR uses. This should usually stay at the IANA assigned port 698. " ++"It can have a value between 1 and 65535." ++msgstr "" ++ ++msgid "" ++"This can be used to signal the external IPv6 prefix of the uplink to the " ++"clients. This might allow a client to change it's local IPv6 address to use " ++"the IPv6 gateway without any kind of address translation. The maximum prefix " ++"length is 64 bits. Default is \"::/0\" (no prefix)." ++msgstr "" ++ ++msgid "Timing and Validity" ++msgstr "" ++ ++msgid "Topology" ++msgstr "Τοπολογία" ++ ++msgid "" ++"Type of service value for the IP header of control traffic. Default is " ++"\"16\"." ++msgstr "" ++ ++msgid "Unable to connect to the OLSR daemon!" ++msgstr "" ++ ++msgid "Uplink" ++msgstr "" ++ ++msgid "Uplink uses NAT" ++msgstr "" ++ ++msgid "Use hysteresis" ++msgstr "" ++ ++msgid "Validity Time" ++msgstr "" ++ ++msgid "Version" ++msgstr "Έκδοση" ++ ++msgid "Very good (ETX < 2)" ++msgstr "" ++ ++msgid "Very good (SNR > 30)" ++msgstr "" ++ ++msgid "WLAN" ++msgstr "" ++ ++msgid "" ++"Warning: kmod-ipip is not installed. Without kmod-ipip SmartGateway will not " ++"work, please install it." ++msgstr "" ++ ++msgid "Weight" ++msgstr "" ++ ++msgid "" ++"When multiple links exist between hosts the weight of interface is used to " ++"determine the link to use. Normally the weight is automatically calculated " ++"by olsrd based on the characteristics of the interface, but here you can " ++"specify a fixed value. Olsrd will choose links with the lowest value.
    Note: Interface weight is used only when LinkQualityLevel is set to " ++"0. For any other value of LinkQualityLevel, the interface ETX value is used " ++"instead." ++msgstr "" ++ ++msgid "" ++"Which kind of uplink is exported to the other mesh nodes. An uplink is " ++"detected by looking for a local HNA of 0.0.0.0/0, ::ffff:0:0/96 or 2000::/3. " ++"Default setting is \"both\"." ++msgstr "" ++ ++msgid "" ++"Which kind of uplink is exported to the other mesh nodes. An uplink is " ++"detected by looking for a local HNA6 ::ffff:0:0/96 or 2000::/3. Default " ++"setting is \"both\"." ++msgstr "" ++ ++msgid "Willingness" ++msgstr "" ++ ++msgid "Yellow" ++msgstr "" ++ ++msgid "no" ++msgstr "" ++ ++msgid "yes" ++msgstr "" ++ ++#~ msgid "Device" ++#~ msgstr "Συσκευή" +diff --git a/feeds/luci/applications/luci-app-olsr/po/en/olsr.po b/feeds/luci/applications/luci-app-olsr/po/en/olsr.po +new file mode 100644 +index 0000000..131005e +--- /dev/null ++++ b/feeds/luci/applications/luci-app-olsr/po/en/olsr.po +@@ -0,0 +1,701 @@ ++#, fuzzy ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Report-Msgid-Bugs-To: \n" ++"POT-Creation-Date: 2009-05-19 19:35+0200\n" ++"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" ++"Last-Translator: FULL NAME \n" ++"Language-Team: LANGUAGE \n" ++"Language: \n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"X-Generator: Translate Toolkit 1.1.1\n" ++ ++msgid "Active MID announcements" ++msgstr "Active MID announcements" ++ ++msgid "Active OLSR nodes" ++msgstr "Active OLSR nodes" ++ ++msgid "Active host net announcements" ++msgstr "Active host net announcements" ++ ++msgid "Advanced Settings" ++msgstr "" ++ ++msgid "Allow gateways with NAT" ++msgstr "" ++ ++msgid "Allow the selection of an outgoing ipv4 gateway with NAT" ++msgstr "" ++ ++msgid "Announce uplink" ++msgstr "" ++ ++msgid "Announced network" ++msgstr "Announced network" ++ ++msgid "Bad (ETX > 10)" ++msgstr "" ++ ++msgid "Bad (SNR < 5)" ++msgstr "" ++ ++msgid "Both values must use the dotted decimal notation." ++msgstr "" ++ ++msgid "Broadcast address" ++msgstr "" ++ ++msgid "Can only be a valid IPv4 or IPv6 address or 'default'" ++msgstr "" ++ ++msgid "Can only be a valid IPv6 address or 'default'" ++msgstr "" ++ ++msgid "Configuration" ++msgstr "" ++ ++msgid "" ++"Could not get any data. Make sure the jsoninfo plugin is installed and " ++"allows connections from localhost." ++msgstr "" ++ ++msgid "Display" ++msgstr "" ++ ++msgid "Downlink" ++msgstr "" ++ ++msgid "Download Config" ++msgstr "" ++ ++msgid "ETX" ++msgstr "" ++ ++msgid "Enable" ++msgstr "" ++ ++msgid "" ++"Enable SmartGateway. If it is disabled, then all other SmartGateway " ++"parameters are ignored. Default is \"no\"." ++msgstr "" ++ ++msgid "Enable this interface." ++msgstr "" ++ ++msgid "Enabled" ++msgstr "" ++ ++msgid "Expected retransmission count" ++msgstr "Expected retransmission count" ++ ++msgid "FIB metric" ++msgstr "FIB metric" ++ ++msgid "" ++"FIBMetric controls the metric value of the host-routes OLSRd sets. \"flat\" " ++"means that the metric value is always 2. This is the preferred value because " ++"it helps the linux kernel routing to clean up older routes. \"correct\" uses " ++"the hopcount as the metric value. \"approx\" use the hopcount as the metric " ++"value too, but does only update the hopcount if the nexthop changes too. " ++"Default is \"flat\"." ++msgstr "" ++ ++msgid "Fisheye mechanism for TCs (checked means on). Default is \"on\"" ++msgstr "" ++ ++msgid "Gateway" ++msgstr "" ++ ++msgid "General Settings" ++msgstr "" ++ ++msgid "General settings" ++msgstr "General settings" ++ ++msgid "Good (2 < ETX < 4)" ++msgstr "" ++ ++msgid "Good (30 > SNR > 20)" ++msgstr "" ++ ++msgid "Green" ++msgstr "" ++ ++msgid "HNA" ++msgstr "" ++ ++msgid "HNA Announcements" ++msgstr "" ++ ++msgid "HNA interval" ++msgstr "HNA interval" ++ ++msgid "HNA validity time" ++msgstr "HNA validity time" ++ ++#, fuzzy ++msgid "HNA6 Announcements" ++msgstr "OLSR - HNA-Announcements" ++ ++msgid "Hello" ++msgstr "" ++ ++msgid "Hello interval" ++msgstr "Hello interval" ++ ++msgid "Hello validity time" ++msgstr "Hello validity time" ++ ++msgid "Hide IPv4" ++msgstr "" ++ ++msgid "Hide IPv6" ++msgstr "" ++ ++msgid "Hna4" ++msgstr "" ++ ++msgid "Hna6" ++msgstr "" ++ ++msgid "Hops" ++msgstr "" ++ ++msgid "Hostname" ++msgstr "" ++ ++msgid "" ++"Hosts in a OLSR routed network can announce connecitivity to external " ++"networks using HNA messages." ++msgstr "" ++ ++msgid "" ++"Hosts in a OLSR routed network can announce connecitivity to external " ++"networks using HNA6 messages." ++msgstr "" ++ ++msgid "" ++"Hysteresis for link sensing (only for hopcount metric). Hysteresis adds more " ++"robustness to the link sensing but delays neighbor registration. Defaults is " ++"\"yes\"" ++msgstr "" ++ ++msgid "IP Addresses" ++msgstr "" ++ ++msgid "" ++"IP-version to use. If 6and4 is selected then one olsrd instance is started " ++"for each protocol." ++msgstr "" ++ ++msgid "IPv4" ++msgstr "" ++ ++msgid "IPv4 broadcast" ++msgstr "IPv4 broadcast" ++ ++msgid "" ++"IPv4 broadcast address for outgoing OLSR packets. One useful example would " ++"be 255.255.255.255. Default is \"0.0.0.0\", which triggers the usage of the " ++"interface broadcast IP." ++msgstr "" ++ ++msgid "IPv4 source" ++msgstr "" ++ ++msgid "" ++"IPv4 src address for outgoing OLSR packages. Default is \"0.0.0.0\", which " ++"triggers usage of the interface IP." ++msgstr "" ++ ++msgid "IPv6" ++msgstr "" ++ ++msgid "IPv6 multicast" ++msgstr "" ++ ++msgid "" ++"IPv6 multicast address. Default is \"FF02::6D\", the manet-router linklocal " ++"multicast." ++msgstr "" ++ ++msgid "" ++"IPv6 network must be given in full notation, prefix must be in CIDR notation." ++msgstr "" ++ ++msgid "IPv6 source" ++msgstr "" ++ ++msgid "" ++"IPv6 src prefix. OLSRd will choose one of the interface IPs which matches " ++"the prefix of this parameter. Default is \"0::/0\", which triggers the usage " ++"of a not-linklocal interface IP." ++msgstr "" ++ ++msgid "IPv6-Prefix of the uplink" ++msgstr "" ++ ++msgid "" ++"If the route to the current gateway is to be changed, the ETX value of this " ++"gateway is multiplied with this value before it is compared to the new one. " ++"The parameter can be a value between 0.1 and 1.0, but should be close to 1.0 " ++"if changed.
    WARNING: This parameter should not be used together " ++"with the etx_ffeth metric!
    Defaults to \"1.0\"." ++msgstr "" ++ ++msgid "" ++"If this Node uses NAT for connections to the internet. Default is \"yes\"." ++msgstr "" ++ ++msgid "Interface" ++msgstr "" ++ ++msgid "" ++"Interface Mode is used to prevent unnecessary packet forwarding on switched " ++"ethernet interfaces. valid Modes are \"mesh\" and \"ether\". Default is " ++"\"mesh\"." ++msgstr "" ++ ++msgid "Interfaces" ++msgstr "" ++ ++msgid "Interfaces Defaults" ++msgstr "" ++ ++msgid "Internet protocol" ++msgstr "Internet protocol" ++ ++msgid "" ++"Interval to poll network interfaces for configuration changes (in seconds). " ++"Default is \"2.5\"." ++msgstr "" ++ ++msgid "Invalid Value for LQMult-Value. Must be between 0.01 and 1.0." ++msgstr "" ++ ++msgid "" ++"Invalid Value for LQMult-Value. You must use a decimal number between 0.01 " ++"and 1.0 here." ++msgstr "" ++ ++msgid "Known OLSR routes" ++msgstr "Known OLSR routes" ++ ++msgid "LQ" ++msgstr "" ++ ++msgid "LQ aging" ++msgstr "LQ aging" ++ ++msgid "LQ algorithm" ++msgstr "LQ algorithm" ++ ++msgid "LQ fisheye" ++msgstr "LQ fisheye" ++ ++msgid "LQ level" ++msgstr "LQ level" ++ ++msgid "" ++"LQMult requires two values (IP address or 'default' and multiplicator) " ++"seperated by space." ++msgstr "" ++ ++msgid "Last hop" ++msgstr "Last hop" ++ ++msgid "Legend" ++msgstr "" ++ ++msgid "Library" ++msgstr "Library" ++ ++msgid "Link Quality Settings" ++msgstr "" ++ ++msgid "" ++"Link quality aging factor (only for lq level 2). Tuning parameter for " ++"etx_float and etx_fpm, smaller values mean slower changes of ETX value. " ++"(allowed values are between 0.01 and 1.0)" ++msgstr "" ++ ++msgid "" ++"Link quality algorithm (only for lq level 2).
    etx_float: " ++"floating point ETX with exponential aging
    etx_fpm : same as " ++"etx_float, but with integer arithmetic
    etx_ff : ETX freifunk, an " ++"etx variant which use all OLSR traffic (instead of only hellos) for ETX " ++"calculation
    etx_ffeth: incompatible variant of etx_ff that " ++"allows ethernet links with ETX 0.1.
    Defaults to \"etx_ff\"" ++msgstr "" ++ ++msgid "" ++"Link quality level switch between hopcount and cost-based (mostly ETX) " ++"routing.
    0 = do not use link quality
    2 = use link " ++"quality for MPR selection and routing
    Default is \"2\"" ++msgstr "" ++ ++msgid "LinkQuality Multiplicator" ++msgstr "" ++ ++msgid "Links per node (average)" ++msgstr "" ++ ++msgid "Links total" ++msgstr "" ++ ++msgid "Local interface IP" ++msgstr "Local interface IP" ++ ++msgid "MID" ++msgstr "" ++ ++msgid "MID interval" ++msgstr "MID interval" ++ ++msgid "MID validity time" ++msgstr "MID validity time" ++ ++msgid "MTU" ++msgstr "" ++ ++msgid "Main IP" ++msgstr "" ++ ++msgid "" ++"Make sure that OLSRd is running, the \"jsoninfo\" plugin is loaded, " ++"configured on port 9090 and accepts connections from \"127.0.0.1\"." ++msgstr "" ++ ++msgid "Metric" ++msgstr "" ++ ++msgid "Mode" ++msgstr "" ++ ++msgid "" ++"Multiply routes with the factor given here. Allowed values are between 0.01 " ++"and 1.0. It is only used when LQ-Level is greater than 0. Examples:
    reduce LQ to 192.168.0.1 by half: 192.168.0.1 0.5
    reduce LQ to all " ++"nodes on this interface by 20%: default 0.8" ++msgstr "" ++ ++msgid "" ++"Multiply routes with the factor given here. Allowed values are between 0.01 " ++"and 1.0. It is only used when LQ-Level is greater than 0. Examples:
    reduce LQ to fd91:662e:3c58::1 by half: fd91:662e:3c58::1 0.5
    reduce " ++"LQ to all nodes on this interface by 20%: default 0.8" ++msgstr "" ++ ++msgid "NAT threshold" ++msgstr "" ++ ++msgid "NLQ" ++msgstr "" ++ ++msgid "Neighbors" ++msgstr "" ++ ++msgid "Neighbour IP" ++msgstr "Neighbour IP" ++ ++msgid "Neighbours" ++msgstr "" ++ ++msgid "Netmask" ++msgstr "Netmask" ++ ++msgid "Network" ++msgstr "" ++ ++msgid "Network address" ++msgstr "" ++ ++msgid "Nic changes poll interval" ++msgstr "" ++ ++msgid "Nodes" ++msgstr "" ++ ++msgid "OLSR" ++msgstr "" ++ ++msgid "OLSR - Display Options" ++msgstr "" ++ ++msgid "OLSR - HNA-Announcements" ++msgstr "OLSR - HNA-Announcements" ++ ++#, fuzzy ++msgid "OLSR - HNA6-Announcements" ++msgstr "OLSR - HNA-Announcements" ++ ++msgid "OLSR - Plugins" ++msgstr "OLSR - Plugins" ++ ++msgid "OLSR Daemon" ++msgstr "OLSR Daemon" ++ ++msgid "OLSR Daemon - Interface" ++msgstr "" ++ ++msgid "OLSR connections" ++msgstr "OLSR connections" ++ ++msgid "OLSR gateway" ++msgstr "OLSR gateway" ++ ++msgid "OLSR node" ++msgstr "OLSR node" ++ ++msgid "Orange" ++msgstr "" ++ ++msgid "Overview" ++msgstr "" ++ ++msgid "Overview of currently active OLSR host net announcements" ++msgstr "Overview of currently active OLSR host net announcements" ++ ++msgid "Overview of currently established OLSR connections" ++msgstr "Overview of currently established OLSR connections" ++ ++msgid "Overview of currently known OLSR nodes" ++msgstr "Overview of currently known OLSR nodes" ++ ++msgid "Overview of currently known routes to other OLSR nodes" ++msgstr "Overview of currently known routes to other OLSR nodes" ++ ++msgid "Overview of interfaces where OLSR is running" ++msgstr "" ++ ++msgid "Overview of known multiple interface announcements" ++msgstr "Overview of known multiple interface announcements" ++ ++msgid "Overview of smart gateways in this network" ++msgstr "" ++ ++msgid "Plugin configuration" ++msgstr "Plugin configuration" ++ ++msgid "Plugins" ++msgstr "" ++ ++msgid "Polling rate for OLSR sockets in seconds. Default is 0.05." ++msgstr "" ++ ++msgid "Pollrate" ++msgstr "Pollrate" ++ ++msgid "Port" ++msgstr "" ++ ++msgid "Prefix" ++msgstr "Prefix" ++ ++msgid "Red" ++msgstr "" ++ ++msgid "Resolve" ++msgstr "" ++ ++msgid "" ++"Resolve hostnames on status pages. It is generally safe to allow this, but " ++"if you use public IPs and have unstable DNS-Setup then those pages will load " ++"really slow. In this case disable it here." ++msgstr "" ++ ++msgid "Routes" ++msgstr "" ++ ++msgid "Secondary OLSR interfaces" ++msgstr "Secondary OLSR interfaces" ++ ++msgid "" ++"Sets the main IP (originator ip) of the router. This IP will NEVER change " ++"during the uptime of olsrd. Default is 0.0.0.0, which triggers usage of the " ++"IP of the first interface." ++msgstr "" ++ ++msgid "" ++"Sets the main IP (originator ip) of the router. This IP will NEVER change " ++"during the uptime of olsrd. Default is ::, which triggers usage of the IP of " ++"the first interface." ++msgstr "" ++ ++msgid "Show IPv4" ++msgstr "" ++ ++msgid "Show IPv6" ++msgstr "" ++ ++msgid "Signal Noise Ratio in dB" ++msgstr "" ++ ++msgid "SmartGW" ++msgstr "" ++ ++msgid "SmartGW announcements" ++msgstr "" ++ ++msgid "SmartGateway is not configured on this system." ++msgstr "" ++ ++msgid "Source address" ++msgstr "" ++ ++msgid "" ++"Specifies the speed of the uplink in kilobits/s. First parameter is " ++"upstream, second parameter is downstream. Default is \"128 1024\"." ++msgstr "" ++ ++msgid "Speed of the uplink" ++msgstr "" ++ ++msgid "State" ++msgstr "" ++ ++msgid "Status" ++msgstr "" ++ ++msgid "Still usable (20 > SNR > 5)" ++msgstr "" ++ ++msgid "Still usable (4 < ETX < 10)" ++msgstr "" ++ ++msgid "Success rate of packages received from the neighbour" ++msgstr "" ++ ++msgid "Success rate of packages sent to the neighbour" ++msgstr "" ++ ++msgid "TC" ++msgstr "" ++ ++msgid "TC interval" ++msgstr "TC interval" ++ ++msgid "TC validity time" ++msgstr "TC validity time" ++ ++msgid "TOS value" ++msgstr "" ++ ++msgid "" ++"The OLSR daemon is an implementation of the Optimized Link State Routing " ++"protocol. As such it allows mesh routing for any network equipment. It runs " ++"on any wifi card that supports ad-hoc mode and of course on any ethernet " ++"device. Visit olsrd.org for help and " ++"documentation." ++msgstr "" ++ ++msgid "" ++"The fixed willingness to use. If not set willingness will be calculated " ++"dynamically based on battery/power status. Default is \"3\"." ++msgstr "" ++ ++msgid "The interface OLSRd should serve." ++msgstr "" ++ ++msgid "" ++"The port OLSR uses. This should usually stay at the IANA assigned port 698. " ++"It can have a value between 1 and 65535." ++msgstr "" ++ ++msgid "" ++"This can be used to signal the external IPv6 prefix of the uplink to the " ++"clients. This might allow a client to change it's local IPv6 address to use " ++"the IPv6 gateway without any kind of address translation. The maximum prefix " ++"length is 64 bits. Default is \"::/0\" (no prefix)." ++msgstr "" ++ ++msgid "Timing and Validity" ++msgstr "" ++ ++msgid "Topology" ++msgstr "" ++ ++msgid "" ++"Type of service value for the IP header of control traffic. Default is " ++"\"16\"." ++msgstr "" ++ ++msgid "Unable to connect to the OLSR daemon!" ++msgstr "Unable to connect to the OLSR daemon!" ++ ++msgid "Uplink" ++msgstr "" ++ ++msgid "Uplink uses NAT" ++msgstr "" ++ ++msgid "Use hysteresis" ++msgstr "Use hysteresis" ++ ++msgid "Validity Time" ++msgstr "" ++ ++msgid "Version" ++msgstr "" ++ ++msgid "Very good (ETX < 2)" ++msgstr "" ++ ++msgid "Very good (SNR > 30)" ++msgstr "" ++ ++msgid "WLAN" ++msgstr "" ++ ++msgid "" ++"Warning: kmod-ipip is not installed. Without kmod-ipip SmartGateway will not " ++"work, please install it." ++msgstr "" ++ ++msgid "Weight" ++msgstr "" ++ ++msgid "" ++"When multiple links exist between hosts the weight of interface is used to " ++"determine the link to use. Normally the weight is automatically calculated " ++"by olsrd based on the characteristics of the interface, but here you can " ++"specify a fixed value. Olsrd will choose links with the lowest value.
    Note: Interface weight is used only when LinkQualityLevel is set to " ++"0. For any other value of LinkQualityLevel, the interface ETX value is used " ++"instead." ++msgstr "" ++ ++msgid "" ++"Which kind of uplink is exported to the other mesh nodes. An uplink is " ++"detected by looking for a local HNA of 0.0.0.0/0, ::ffff:0:0/96 or 2000::/3. " ++"Default setting is \"both\"." ++msgstr "" ++ ++msgid "" ++"Which kind of uplink is exported to the other mesh nodes. An uplink is " ++"detected by looking for a local HNA6 ::ffff:0:0/96 or 2000::/3. Default " ++"setting is \"both\"." ++msgstr "" ++ ++msgid "Willingness" ++msgstr "Willingness" ++ ++msgid "Yellow" ++msgstr "" ++ ++msgid "no" ++msgstr "" ++ ++msgid "yes" ++msgstr "" ++ ++#~ msgid "" ++#~ "Make sure that OLSRd is running, the \"txtinfo\" plugin is loaded, " ++#~ "configured on port 2006 and accepts connections from \"127.0.0.1\"." ++#~ msgstr "" ++#~ "Make sure that OLSRd is running, the \"txtinfo\" plugin is loaded, " ++#~ "configured on port 2006 and accepts connections from \"127.0.0.1\"." +diff --git a/feeds/luci/applications/luci-app-olsr/po/es/olsr.po b/feeds/luci/applications/luci-app-olsr/po/es/olsr.po +new file mode 100644 +index 0000000..0e161bd +--- /dev/null ++++ b/feeds/luci/applications/luci-app-olsr/po/es/olsr.po +@@ -0,0 +1,830 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Report-Msgid-Bugs-To: \n" ++"POT-Creation-Date: 2009-06-10 03:41+0200\n" ++"PO-Revision-Date: 2014-06-15 13:17+0200\n" ++"Last-Translator: José Vicente \n" ++"Language-Team: LANGUAGE \n" ++"Language: es\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n != 1);\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "Active MID announcements" ++msgstr "Declaraciones MID activas" ++ ++msgid "Active OLSR nodes" ++msgstr "Nodos OLSR activos" ++ ++msgid "Active host net announcements" ++msgstr "Declaraciones activas de máquinas en la red" ++ ++msgid "Advanced Settings" ++msgstr "Configuración avanzada" ++ ++msgid "Allow gateways with NAT" ++msgstr "Permitir pasarelas con NAT" ++ ++msgid "Allow the selection of an outgoing ipv4 gateway with NAT" ++msgstr "Permitir seleccionar una pasarela IPv4 con NAT" ++ ++msgid "Announce uplink" ++msgstr "Declarar enlace de subida" ++ ++msgid "Announced network" ++msgstr "Red declarada" ++ ++msgid "Bad (ETX > 10)" ++msgstr "Mal (ETX > 10)" ++ ++msgid "Bad (SNR < 5)" ++msgstr "Mal (SNR < 5)" ++ ++msgid "Both values must use the dotted decimal notation." ++msgstr "Ambos valores en notación decimal con punto." ++ ++msgid "Broadcast address" ++msgstr "Dirección de propagación" ++ ++msgid "Can only be a valid IPv4 or IPv6 address or 'default'" ++msgstr "Sólo puede ser una dirección IPv4 o IPv6 válidas o \"por defecto\"" ++ ++#, fuzzy ++msgid "Can only be a valid IPv6 address or 'default'" ++msgstr "Sólo puede ser una dirección IPv4 o IPv6 válidas o \"por defecto\"" ++ ++msgid "Configuration" ++msgstr "Configuración" ++ ++msgid "" ++"Could not get any data. Make sure the jsoninfo plugin is installed and " ++"allows connections from localhost." ++msgstr "" ++"No pude obtener datos. Asegúrese de que el plugin jsoninfo está instalado y " ++"permite conexiones desde localhost." ++ ++msgid "Display" ++msgstr "Mostrar" ++ ++msgid "Downlink" ++msgstr "Enlace de bajada" ++ ++msgid "Download Config" ++msgstr "Configuración de descarga" ++ ++msgid "ETX" ++msgstr "ETX" ++ ++msgid "Enable" ++msgstr "Activar" ++ ++msgid "" ++"Enable SmartGateway. If it is disabled, then all other SmartGateway " ++"parameters are ignored. Default is \"no\"." ++msgstr "" ++"Activar SmartGateway. Si se desactiva el resto de parámetros de SmartGateway " ++"se ignoran. \"No\" por defecto." ++ ++msgid "Enable this interface." ++msgstr "Activar esta interfaz." ++ ++msgid "Enabled" ++msgstr "Activado" ++ ++msgid "Expected retransmission count" ++msgstr "Contador de retransmisión esperado" ++ ++msgid "FIB metric" ++msgstr "Métrica FIB" ++ ++msgid "" ++"FIBMetric controls the metric value of the host-routes OLSRd sets. \"flat\" " ++"means that the metric value is always 2. This is the preferred value because " ++"it helps the linux kernel routing to clean up older routes. \"correct\" uses " ++"the hopcount as the metric value. \"approx\" use the hopcount as the metric " ++"value too, but does only update the hopcount if the nexthop changes too. " ++"Default is \"flat\"." ++msgstr "" ++"FIBMetric controla el valor métrico de los conjuntos OLSRd. \"Plano\" " ++"significa que la métrica es siempre 2. Este es el valor preferido porque " ++"ayuda al enrutador del kernel de linux a limpiar valores antiguos. \"Correct" ++"\" usa como métrica el número de saltos. \"Approx\" usa la cuenta de saltos " ++"también, pero solo la actualiza si cambia el siguiente salto también. Por " ++"defecto \"flat\"." ++ ++msgid "Fisheye mechanism for TCs (checked means on). Default is \"on\"" ++msgstr "Mecanismo Fisheye para TCs (marcado = activado). Activado por defecto" ++ ++msgid "Gateway" ++msgstr "Pasarela" ++ ++msgid "General Settings" ++msgstr "Configuración general" ++ ++msgid "General settings" ++msgstr "Configuración general" ++ ++msgid "Good (2 < ETX < 4)" ++msgstr "Bien (2 < ETX < 4)" ++ ++msgid "Good (30 > SNR > 20)" ++msgstr "Bien (30 > SNR > 20)" ++ ++msgid "Green" ++msgstr "Verde" ++ ++msgid "HNA" ++msgstr "HNA" ++ ++msgid "HNA Announcements" ++msgstr "Declaraciones HNA" ++ ++msgid "HNA interval" ++msgstr "Intervalo HNA" ++ ++msgid "HNA validity time" ++msgstr "Tiempo de validez de HNA" ++ ++#, fuzzy ++msgid "HNA6 Announcements" ++msgstr "Declaraciones HNA" ++ ++msgid "Hello" ++msgstr "Saludo" ++ ++msgid "Hello interval" ++msgstr "Intervalo de saludo" ++ ++msgid "Hello validity time" ++msgstr "Tiempo de validez del saludo" ++ ++msgid "Hide IPv4" ++msgstr "Ocultar IPv4" ++ ++msgid "Hide IPv6" ++msgstr "Ocultar IPv6" ++ ++msgid "Hna4" ++msgstr "Hna4" ++ ++msgid "Hna6" ++msgstr "Hna6" ++ ++msgid "Hops" ++msgstr "Saltos" ++ ++msgid "Hostname" ++msgstr "Nombre de máquina" ++ ++msgid "" ++"Hosts in a OLSR routed network can announce connecitivity to external " ++"networks using HNA messages." ++msgstr "" ++"Las máquinas de una red OLSR pueden declarar conectividad con redes externas " ++"usando mensajes HNA." ++ ++#, fuzzy ++msgid "" ++"Hosts in a OLSR routed network can announce connecitivity to external " ++"networks using HNA6 messages." ++msgstr "" ++"Las máquinas de una red OLSR pueden declarar conectividad con redes externas " ++"usando mensajes HNA." ++ ++msgid "" ++"Hysteresis for link sensing (only for hopcount metric). Hysteresis adds more " ++"robustness to the link sensing but delays neighbor registration. Defaults is " ++"\"yes\"" ++msgstr "" ++"Histéresis para la sensibilidad del enlace (sólo para métrica de saltos). La " ++"histéresis da más robustez a la sensibilidad de enlace pero retrasa el " ++"registro de vecinos. \"Sí\" por defecto" ++ ++msgid "IP Addresses" ++msgstr "Direcciones IP" ++ ++msgid "" ++"IP-version to use. If 6and4 is selected then one olsrd instance is started " ++"for each protocol." ++msgstr "" ++"Versión IP a usar. Si se selecciona 6and4 se arrancarán una instancia de " ++"oslrd para cada protocolo." ++ ++msgid "IPv4" ++msgstr "IPv4" ++ ++msgid "IPv4 broadcast" ++msgstr "Propagar IPv4" ++ ++msgid "" ++"IPv4 broadcast address for outgoing OLSR packets. One useful example would " ++"be 255.255.255.255. Default is \"0.0.0.0\", which triggers the usage of the " ++"interface broadcast IP." ++msgstr "" ++"Dirección de propagación IPv4 para paquetes salientes OLSR. Por ejemplo " ++"\"255.255.255.255\". Por defecto es \"0.0.0.0\" que hace que se use la " ++"interfaz de propagación IP." ++ ++msgid "IPv4 source" ++msgstr "IPv4 origen" ++ ++msgid "" ++"IPv4 src address for outgoing OLSR packages. Default is \"0.0.0.0\", which " ++"triggers usage of the interface IP." ++msgstr "" ++"Dirección origen IPv4 para paquetes OLSR. Por defecto es \"0.0.0.0\" que " ++"hace que se use la interfaz de propagación IP." ++ ++msgid "IPv6" ++msgstr "IPv6" ++ ++msgid "IPv6 multicast" ++msgstr "Multidifusión IPv6" ++ ++msgid "" ++"IPv6 multicast address. Default is \"FF02::6D\", the manet-router linklocal " ++"multicast." ++msgstr "" ++"Dirección IPv6 de multidifusión. Por defecto es \"FF02::6D\", la dirección " ++"de multidifusión local en routers MANET." ++ ++msgid "" ++"IPv6 network must be given in full notation, prefix must be in CIDR notation." ++msgstr "" ++"La red IPv6 debe escribirse en notación completa y el prefijo debe estar en " ++"notación CIDR." ++ ++msgid "IPv6 source" ++msgstr "IPv6 origen" ++ ++msgid "" ++"IPv6 src prefix. OLSRd will choose one of the interface IPs which matches " ++"the prefix of this parameter. Default is \"0::/0\", which triggers the usage " ++"of a not-linklocal interface IP." ++msgstr "" ++"Prefijo origen IPv6. OLSRd elegirá un interfaz IP que encaje con el prefijo " ++"de este parámetro. Por defecto es \"0::/0\" que provoca el uso de un " ++"interfaz IP no local." ++ ++msgid "IPv6-Prefix of the uplink" ++msgstr "Prefijo IPv6 para el enlace de subida" ++ ++msgid "" ++"If the route to the current gateway is to be changed, the ETX value of this " ++"gateway is multiplied with this value before it is compared to the new one. " ++"The parameter can be a value between 0.1 and 1.0, but should be close to 1.0 " ++"if changed.
    WARNING: This parameter should not be used together " ++"with the etx_ffeth metric!
    Defaults to \"1.0\"." ++msgstr "" ++"Si la ruta a la pasarela actual cambia su ETX de se multiplica por este " ++"valor antes de compararse con el nuevo. El parámetro debe estar entre 0.1 y " ++"1.0, pero debería aproximarse a 1.0 si se cambia.
    AVISO: No debe " ++"usarse junto con la métrica etx_ffeth!
    Por defecto es 1.0." ++ ++msgid "" ++"If this Node uses NAT for connections to the internet. Default is \"yes\"." ++msgstr "Este nodo usa NAT para conectar a internet. \"Sí\" por defecto." ++ ++msgid "Interface" ++msgstr "Interfaz" ++ ++msgid "" ++"Interface Mode is used to prevent unnecessary packet forwarding on switched " ++"ethernet interfaces. valid Modes are \"mesh\" and \"ether\". Default is " ++"\"mesh\"." ++msgstr "" ++"El modo de interfaz se usar para evitar traspaso innecesario de paquetes en " ++"interfaces de red conmutados. Los modos válidos son \"mesh\" y \"ether\". " ++"Por defecto es \"mesh\"." ++ ++msgid "Interfaces" ++msgstr "Interfaces" ++ ++msgid "Interfaces Defaults" ++msgstr "Valores por defecto de los interfaces" ++ ++msgid "Internet protocol" ++msgstr "Protocolo de Internet" ++ ++msgid "" ++"Interval to poll network interfaces for configuration changes (in seconds). " ++"Default is \"2.5\"." ++msgstr "" ++"Intervalo de sondeo de cambios de configuración a interfaces de red (en " ++"segundos). Por defecto es \"2.5\"." ++ ++msgid "Invalid Value for LQMult-Value. Must be between 0.01 and 1.0." ++msgstr "Valor no válido para LQMult-Value. Debe ser entre 0,01 y 1,0." ++ ++msgid "" ++"Invalid Value for LQMult-Value. You must use a decimal number between 0.01 " ++"and 1.0 here." ++msgstr "" ++"Valor no válido para LQMult-Value. Debe usar un número decimal entre 0,01 y " ++"1,0." ++ ++msgid "Known OLSR routes" ++msgstr "Rutas OLSR conocidas" ++ ++msgid "LQ" ++msgstr "LQ" ++ ++msgid "LQ aging" ++msgstr "LQ - Envejecimiento" ++ ++msgid "LQ algorithm" ++msgstr "LQ - Algoritmo" ++ ++msgid "LQ fisheye" ++msgstr "LQ - Ojo de pez" ++ ++msgid "LQ level" ++msgstr "LQ - Nivel" ++ ++msgid "" ++"LQMult requires two values (IP address or 'default' and multiplicator) " ++"seperated by space." ++msgstr "" ++"LQMult precisa dos valores (dirección IP o \"por defecto\" y multiplicador) " ++"separados por un espacio." ++ ++msgid "Last hop" ++msgstr "Último salto" ++ ++msgid "Legend" ++msgstr "Leyenda" ++ ++msgid "Library" ++msgstr "Biblioteca" ++ ++msgid "Link Quality Settings" ++msgstr "Configuración de calidad de enlace" ++ ++msgid "" ++"Link quality aging factor (only for lq level 2). Tuning parameter for " ++"etx_float and etx_fpm, smaller values mean slower changes of ETX value. " ++"(allowed values are between 0.01 and 1.0)" ++msgstr "" ++"Factor de envejecimiento de la calidad del enlace (sólo para CE nivel 2). " ++"Parámetro de ajuste para etx_float y etx_fpm, valores menores implican " ++"cambios más lentos en el valor ETX. (los valores permitidos están entre 0.01 " ++"y 1.0)" ++ ++msgid "" ++"Link quality algorithm (only for lq level 2).
    etx_float: " ++"floating point ETX with exponential aging
    etx_fpm : same as " ++"etx_float, but with integer arithmetic
    etx_ff : ETX freifunk, an " ++"etx variant which use all OLSR traffic (instead of only hellos) for ETX " ++"calculation
    etx_ffeth: incompatible variant of etx_ff that " ++"allows ethernet links with ETX 0.1.
    Defaults to \"etx_ff\"" ++msgstr "" ++"Algoritmo de calidad de enlace (solo para CE nivel 2).
    etx_float: ETX en punto flotante con envejecimiento exponencial
    etx_fpm : igual que etx_float, pero con aritmética entera
    etx_ff : " ++"ETX freifunk, variante etx que usar todo el tráfico OLSR (en vez de sólo " ++"\"hellos\") para los cálculos ETX
    etx_ffeth: variante " ++"incompatible de etx_ff que permite enlaces ethernet con ETX 0.1.
    Por " ++"defecto \"etx_ff\"" ++ ++msgid "" ++"Link quality level switch between hopcount and cost-based (mostly ETX) " ++"routing.
    0 = do not use link quality
    2 = use link " ++"quality for MPR selection and routing
    Default is \"2\"" ++msgstr "" ++"Intercambio del nivel de calidad del enlace entre \"cuenta de saltos\" y " ++"enrutado \"basado en coste\" (principalmente ETX).
    0 = no usar " ++"calidad del enlace
    2 = use calidad del enlace para selección de " ++"MPR y enrutado
    Por defecto es 2" ++ ++msgid "LinkQuality Multiplicator" ++msgstr "Multilplicador de calidad de enlace" ++ ++msgid "Links per node (average)" ++msgstr "Media de enlaces por nodo" ++ ++msgid "Links total" ++msgstr "Enlaces totales" ++ ++msgid "Local interface IP" ++msgstr "IP de la interfaz local" ++ ++msgid "MID" ++msgstr "MID" ++ ++msgid "MID interval" ++msgstr "Intervalo de MID" ++ ++msgid "MID validity time" ++msgstr "Tiempo de validez de MID" ++ ++msgid "MTU" ++msgstr "MTU" ++ ++msgid "Main IP" ++msgstr "IP principal" ++ ++msgid "" ++"Make sure that OLSRd is running, the \"jsoninfo\" plugin is loaded, " ++"configured on port 9090 and accepts connections from \"127.0.0.1\"." ++msgstr "" ++"Asegúrese de que OLSRd funciona y de que el plugin \"jsoninfo\" está " ++"cargado, configurado en el puerto 9090 y que acepta conexiones desde " ++"127.0.0.1." ++ ++msgid "Metric" ++msgstr "Métrica" ++ ++msgid "Mode" ++msgstr "Modo" ++ ++msgid "" ++"Multiply routes with the factor given here. Allowed values are between 0.01 " ++"and 1.0. It is only used when LQ-Level is greater than 0. Examples:
    reduce LQ to 192.168.0.1 by half: 192.168.0.1 0.5
    reduce LQ to all " ++"nodes on this interface by 20%: default 0.8" ++msgstr "" ++"Multiplicar las rutas con el factor dado aquí. Los valores permitidos está " ++"entre 0,01 y 1,0. Se usa sólo cuando el nivel LQ es mayor que 0. Ejemplos:" ++"
    reducir LQ a 192.168.0.1 por la mitad: 192.168.0.1 0,5
    reducir LQ " ++"a todos los nodos de esta interfaz el 20%: default 0,8" ++ ++#, fuzzy ++msgid "" ++"Multiply routes with the factor given here. Allowed values are between 0.01 " ++"and 1.0. It is only used when LQ-Level is greater than 0. Examples:
    reduce LQ to fd91:662e:3c58::1 by half: fd91:662e:3c58::1 0.5
    reduce " ++"LQ to all nodes on this interface by 20%: default 0.8" ++msgstr "" ++"Multiplicar las rutas con el factor dado aquí. Los valores permitidos está " ++"entre 0,01 y 1,0. Se usa sólo cuando el nivel LQ es mayor que 0. Ejemplos:" ++"
    reducir LQ a 192.168.0.1 por la mitad: 192.168.0.1 0,5
    reducir LQ " ++"a todos los nodos de esta interfaz el 20%: default 0,8" ++ ++msgid "NAT threshold" ++msgstr "Umbral NAT" ++ ++msgid "NLQ" ++msgstr "NLQ" ++ ++msgid "Neighbors" ++msgstr "Vecinos" ++ ++msgid "Neighbour IP" ++msgstr "IP vecina" ++ ++msgid "Neighbours" ++msgstr "Vecinos" ++ ++msgid "Netmask" ++msgstr "Máscara de red" ++ ++msgid "Network" ++msgstr "Red" ++ ++msgid "Network address" ++msgstr "Dirección de red" ++ ++msgid "Nic changes poll interval" ++msgstr "Intervalo de muestreo de cambios de nic" ++ ++msgid "Nodes" ++msgstr "Nodos" ++ ++msgid "OLSR" ++msgstr "OLSR" ++ ++msgid "OLSR - Display Options" ++msgstr "OLSR - Mostrar opciones" ++ ++msgid "OLSR - HNA-Announcements" ++msgstr "OLSR - Declaraciones HNA" ++ ++#, fuzzy ++msgid "OLSR - HNA6-Announcements" ++msgstr "OLSR - Declaraciones HNA" ++ ++msgid "OLSR - Plugins" ++msgstr "OLSR - Plugins" ++ ++msgid "OLSR Daemon" ++msgstr "Demonio OLSR" ++ ++msgid "OLSR Daemon - Interface" ++msgstr "Demonio OLSR - Interfaz" ++ ++msgid "OLSR connections" ++msgstr "Conexiones OLSR" ++ ++msgid "OLSR gateway" ++msgstr "Puerta de enlace OLSR" ++ ++msgid "OLSR node" ++msgstr "Nodo OLSR" ++ ++msgid "Orange" ++msgstr "Naranja" ++ ++msgid "Overview" ++msgstr "Resumen" ++ ++msgid "Overview of currently active OLSR host net announcements" ++msgstr "Resumen de declaraciones OLSR de máquinas activas" ++ ++msgid "Overview of currently established OLSR connections" ++msgstr "Resumen de conexiones de OLSR vivas" ++ ++msgid "Overview of currently known OLSR nodes" ++msgstr "Nodos conocidos OLSR" ++ ++msgid "Overview of currently known routes to other OLSR nodes" ++msgstr "Rutas conocidas a otros nodos OLSR" ++ ++msgid "Overview of interfaces where OLSR is running" ++msgstr "Resumen de interfaces con OLSR en ejecución" ++ ++msgid "Overview of known multiple interface announcements" ++msgstr "Declaraciones de múltiples interfaces conocidas" ++ ++msgid "Overview of smart gateways in this network" ++msgstr "Pasarelas inteligentes en esta red" ++ ++msgid "Plugin configuration" ++msgstr "Configuración del plugin" ++ ++msgid "Plugins" ++msgstr "Plugins" ++ ++msgid "Polling rate for OLSR sockets in seconds. Default is 0.05." ++msgstr "Ratio de muestreo de paquetes OLSR en segundos. Por defecto es 0.05." ++ ++msgid "Pollrate" ++msgstr "Tasa de muestreo" ++ ++msgid "Port" ++msgstr "Puerto" ++ ++msgid "Prefix" ++msgstr "Prefijo" ++ ++msgid "Red" ++msgstr "Rojo" ++ ++msgid "Resolve" ++msgstr "Calcular" ++ ++msgid "" ++"Resolve hostnames on status pages. It is generally safe to allow this, but " ++"if you use public IPs and have unstable DNS-Setup then those pages will load " ++"really slow. In this case disable it here." ++msgstr "" ++"Calcula los nombres de máquina en las páginas de estado. Suele ser seguro, " ++"pero las páginas se cargarán lentamente si usa IPs públicas y tiene una " ++"configuración inestable de DNS." ++ ++msgid "Routes" ++msgstr "Rutas" ++ ++msgid "Secondary OLSR interfaces" ++msgstr "Interfaces OLSR secundarias" ++ ++msgid "" ++"Sets the main IP (originator ip) of the router. This IP will NEVER change " ++"during the uptime of olsrd. Default is 0.0.0.0, which triggers usage of the " ++"IP of the first interface." ++msgstr "" ++"Configura la dirección IP principal (IP originadora) del router. NUNCA debe " ++"cambiar mientras OLSRd esté activa. Por defecto es \"0.0.0.0\" que provoca " ++"el uso de la IP del primer interfaz." ++ ++#, fuzzy ++msgid "" ++"Sets the main IP (originator ip) of the router. This IP will NEVER change " ++"during the uptime of olsrd. Default is ::, which triggers usage of the IP of " ++"the first interface." ++msgstr "" ++"Configura la dirección IP principal (IP originadora) del router. NUNCA debe " ++"cambiar mientras OLSRd esté activa. Por defecto es \"0.0.0.0\" que provoca " ++"el uso de la IP del primer interfaz." ++ ++msgid "Show IPv4" ++msgstr "Mostrar IPv4" ++ ++msgid "Show IPv6" ++msgstr "Mostrar IPv6" ++ ++msgid "Signal Noise Ratio in dB" ++msgstr "Ratio señal / ruido en dB" ++ ++msgid "SmartGW" ++msgstr "SmartGW" ++ ++msgid "SmartGW announcements" ++msgstr "Declaraciones SmartGW" ++ ++msgid "SmartGateway is not configured on this system." ++msgstr "SmartGateway no está configurado." ++ ++msgid "Source address" ++msgstr "Dirección origen" ++ ++msgid "" ++"Specifies the speed of the uplink in kilobits/s. First parameter is " ++"upstream, second parameter is downstream. Default is \"128 1024\"." ++msgstr "" ++"Especifica la velocidad del enlace en kilobits/s. El primer parámetro es la " ++"subida y el segundo la bajada. Por defecto es \"128 1024\"." ++ ++msgid "Speed of the uplink" ++msgstr "Velocidad de subida" ++ ++msgid "State" ++msgstr "Estado" ++ ++msgid "Status" ++msgstr "Estado" ++ ++msgid "Still usable (20 > SNR > 5)" ++msgstr "Aún usable (20 > SNR > 5)" ++ ++msgid "Still usable (4 < ETX < 10)" ++msgstr "Aún usable (4 < ETX < 10)" ++ ++msgid "Success rate of packages received from the neighbour" ++msgstr "Ratio de éxito de paquetes recibidos de la vecindad" ++ ++msgid "Success rate of packages sent to the neighbour" ++msgstr "Ratio de éxito de paquetes enviados a la vecindad" ++ ++msgid "TC" ++msgstr "TC" ++ ++msgid "TC interval" ++msgstr "Intervalo TC" ++ ++msgid "TC validity time" ++msgstr "Validez de TC" ++ ++msgid "TOS value" ++msgstr "TOS" ++ ++msgid "" ++"The OLSR daemon is an implementation of the Optimized Link State Routing " ++"protocol. As such it allows mesh routing for any network equipment. It runs " ++"on any wifi card that supports ad-hoc mode and of course on any ethernet " ++"device. Visit olsrd.org for help and " ++"documentation." ++msgstr "" ++"El demonio OLSR es una implementación del protocolo Optimized Link State " ++"Routing. Permite enrutado mesh para cualquier equipo en red. Funciona sobre " ++"cualquier tarjeta wi.fi que soporte el modo ad-hoc y cualquier dispositivo " ++"ethernet. Puede visitar olsrd.org para " ++"ayuda y documentación." ++ ++msgid "" ++"The fixed willingness to use. If not set willingness will be calculated " ++"dynamically based on battery/power status. Default is \"3\"." ++msgstr "" ++"Willingness fija a usar. Si no se establece se calculará dinámicamente " ++"basándose en el estado de la batería y la corriente. Por defecto es 3." ++ ++msgid "The interface OLSRd should serve." ++msgstr "Interfaz a usar por OLSRD." ++ ++msgid "" ++"The port OLSR uses. This should usually stay at the IANA assigned port 698. " ++"It can have a value between 1 and 65535." ++msgstr "" ++"Puerto a usar por OLSR. Debería ser 698 tal y como asigna IANA. Puede tener " ++"un valor entre 1 y 65535." ++ ++msgid "" ++"This can be used to signal the external IPv6 prefix of the uplink to the " ++"clients. This might allow a client to change it's local IPv6 address to use " ++"the IPv6 gateway without any kind of address translation. The maximum prefix " ++"length is 64 bits. Default is \"::/0\" (no prefix)." ++msgstr "" ++"Prefijo IPv6 a mostrar a clientes del enlace. Puede hacer que un cliente " ++"cambio su dirección IPv6 para usar la pasarela sin ningún tipo de traducción " ++"de dirección. La longitud máxima del prefijo es 64 bits. Por defecto es " ++"\"::/0\" (sin prefijo)." ++ ++msgid "Timing and Validity" ++msgstr "Tiempo y validez" ++ ++msgid "Topology" ++msgstr "Topología" ++ ++msgid "" ++"Type of service value for the IP header of control traffic. Default is " ++"\"16\"." ++msgstr "" ++"Tipo de servicio para la cabecera de control de tráfico de IP. Por defecto " ++"es 16." ++ ++msgid "Unable to connect to the OLSR daemon!" ++msgstr "¡No puedo conectar con el demonio OLSR!" ++ ++msgid "Uplink" ++msgstr "Enlace saliente" ++ ++msgid "Uplink uses NAT" ++msgstr "El enlace saliente usa NAT" ++ ++msgid "Use hysteresis" ++msgstr "Usar histéresis" ++ ++msgid "Validity Time" ++msgstr "Tiempo de validez" ++ ++msgid "Version" ++msgstr "Versión" ++ ++msgid "Very good (ETX < 2)" ++msgstr "Muy bien (ETX < 2)" ++ ++msgid "Very good (SNR > 30)" ++msgstr "Muy bien (SNR > 30)" ++ ++msgid "WLAN" ++msgstr "WLAN" ++ ++msgid "" ++"Warning: kmod-ipip is not installed. Without kmod-ipip SmartGateway will not " ++"work, please install it." ++msgstr "" ++"Aviso: kmod-ipip no está instalado. Sin kmod-ipip SmartGateway no funcionará." ++ ++msgid "Weight" ++msgstr "Peso" ++ ++msgid "" ++"When multiple links exist between hosts the weight of interface is used to " ++"determine the link to use. Normally the weight is automatically calculated " ++"by olsrd based on the characteristics of the interface, but here you can " ++"specify a fixed value. Olsrd will choose links with the lowest value.
    Note: Interface weight is used only when LinkQualityLevel is set to " ++"0. For any other value of LinkQualityLevel, the interface ETX value is used " ++"instead." ++msgstr "" ++"Cuando hayan múltiples enlaces entre máquinas el peso del interfaz se usar " ++"para determinar qué enlace usar. Normalmente se calcula automáticamente " ++"basándose en las características de la interfaz, pero puede indicar un valor " ++"fijo. OLSRd elegirá enlaces con el valor menor.
    Nota: El peso " ++"del interfaz se usao sólo cuando LinkQualityLevel está en 0. Para otros " ++"valores se usará el valor del interfaz EXT." ++ ++msgid "" ++"Which kind of uplink is exported to the other mesh nodes. An uplink is " ++"detected by looking for a local HNA of 0.0.0.0/0, ::ffff:0:0/96 or 2000::/3. " ++"Default setting is \"both\"." ++msgstr "" ++"Tipo de enlace exportado a otros nodos del mesh. Un enlace se detecta " ++"buscando una HNA local de 0.0.0.0/0, ::ffff:0:0/96 o 2000::/3. Por defecto " ++"\"both\"." ++ ++#, fuzzy ++msgid "" ++"Which kind of uplink is exported to the other mesh nodes. An uplink is " ++"detected by looking for a local HNA6 ::ffff:0:0/96 or 2000::/3. Default " ++"setting is \"both\"." ++msgstr "" ++"Tipo de enlace exportado a otros nodos del mesh. Un enlace se detecta " ++"buscando una HNA local de 0.0.0.0/0, ::ffff:0:0/96 o 2000::/3. Por defecto " ++"\"both\"." ++ ++msgid "Willingness" ++msgstr "Willingness" ++ ++msgid "Yellow" ++msgstr "Amarillo" ++ ++msgid "no" ++msgstr "no" ++ ++msgid "yes" ++msgstr "sí" ++ ++#~ msgid "Device" ++#~ msgstr "Dispositivo" ++ ++#~ msgid "" ++#~ "Make sure that OLSRd is running, the \"txtinfo\" plugin is loaded, " ++#~ "configured on port 2006 and accepts connections from \"127.0.0.1\"." ++#~ msgstr "" ++#~ "Asegúrese de que OLSRd se está ejecutando, que el plugin \"txtinfo\" esté " ++#~ "cargado, configurado en el puerto 2006 y que acepta conexiones desde " ++#~ "127.0.0.1." ++ ++#~ msgid "" ++#~ "Multiply routes with the factor given here. Allowed values are between " ++#~ "0.01 and 1. It is only used when LQ-Level is greater than 0. Examples:" ++#~ "
    reduce LQ to 192.168.0.1 by half: 192.168.0.1 0.5
    reduce LQ to " ++#~ "all nodes on this interface by 20%: default 0.8" ++#~ msgstr "" ++#~ "Multiplicar rutas por este factor. Valores entre 0,01 y 1. Sólo se usa si " ++#~ "el nivel de CA es mayor que 0. Ejemplos:
    reducir CE a la mitad a " ++#~ "192.168.0.1: \"192.168.0.1 0.5\"
    reducir CE a todos los nodos en " ++#~ "esta interfaz el 20%: \"default 0.8\"" +diff --git a/feeds/luci/applications/luci-app-olsr/po/fr/olsr.po b/feeds/luci/applications/luci-app-olsr/po/fr/olsr.po +new file mode 100644 +index 0000000..e93a6bd +--- /dev/null ++++ b/feeds/luci/applications/luci-app-olsr/po/fr/olsr.po +@@ -0,0 +1,692 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Report-Msgid-Bugs-To: \n" ++"POT-Creation-Date: 2009-05-19 19:36+0200\n" ++"PO-Revision-Date: 2012-01-15 05:35+0200\n" ++"Last-Translator: desillu \n" ++"Language-Team: LANGUAGE \n" ++"Language: fr\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n > 1);\n" ++"X-Generator: Pootle 2.0.4\n" ++ ++msgid "Active MID announcements" ++msgstr "" ++ ++msgid "Active OLSR nodes" ++msgstr "" ++ ++msgid "Active host net announcements" ++msgstr "" ++ ++msgid "Advanced Settings" ++msgstr "" ++ ++msgid "Allow gateways with NAT" ++msgstr "" ++ ++msgid "Allow the selection of an outgoing ipv4 gateway with NAT" ++msgstr "" ++ ++msgid "Announce uplink" ++msgstr "" ++ ++msgid "Announced network" ++msgstr "" ++ ++msgid "Bad (ETX > 10)" ++msgstr "" ++ ++msgid "Bad (SNR < 5)" ++msgstr "" ++ ++msgid "Both values must use the dotted decimal notation." ++msgstr "" ++ ++msgid "Broadcast address" ++msgstr "" ++ ++msgid "Can only be a valid IPv4 or IPv6 address or 'default'" ++msgstr "" ++ ++msgid "Can only be a valid IPv6 address or 'default'" ++msgstr "" ++ ++msgid "Configuration" ++msgstr "" ++ ++msgid "" ++"Could not get any data. Make sure the jsoninfo plugin is installed and " ++"allows connections from localhost." ++msgstr "" ++ ++msgid "Display" ++msgstr "" ++ ++msgid "Downlink" ++msgstr "" ++ ++msgid "Download Config" ++msgstr "" ++ ++msgid "ETX" ++msgstr "" ++ ++msgid "Enable" ++msgstr "" ++ ++msgid "" ++"Enable SmartGateway. If it is disabled, then all other SmartGateway " ++"parameters are ignored. Default is \"no\"." ++msgstr "" ++ ++msgid "Enable this interface." ++msgstr "" ++ ++msgid "Enabled" ++msgstr "" ++ ++msgid "Expected retransmission count" ++msgstr "" ++ ++msgid "FIB metric" ++msgstr "" ++ ++msgid "" ++"FIBMetric controls the metric value of the host-routes OLSRd sets. \"flat\" " ++"means that the metric value is always 2. This is the preferred value because " ++"it helps the linux kernel routing to clean up older routes. \"correct\" uses " ++"the hopcount as the metric value. \"approx\" use the hopcount as the metric " ++"value too, but does only update the hopcount if the nexthop changes too. " ++"Default is \"flat\"." ++msgstr "" ++ ++msgid "Fisheye mechanism for TCs (checked means on). Default is \"on\"" ++msgstr "" ++ ++msgid "Gateway" ++msgstr "" ++ ++msgid "General Settings" ++msgstr "" ++ ++msgid "General settings" ++msgstr "" ++ ++msgid "Good (2 < ETX < 4)" ++msgstr "" ++ ++msgid "Good (30 > SNR > 20)" ++msgstr "" ++ ++msgid "Green" ++msgstr "" ++ ++msgid "HNA" ++msgstr "" ++ ++msgid "HNA Announcements" ++msgstr "" ++ ++msgid "HNA interval" ++msgstr "" ++ ++msgid "HNA validity time" ++msgstr "" ++ ++msgid "HNA6 Announcements" ++msgstr "" ++ ++msgid "Hello" ++msgstr "" ++ ++msgid "Hello interval" ++msgstr "" ++ ++msgid "Hello validity time" ++msgstr "" ++ ++msgid "Hide IPv4" ++msgstr "" ++ ++msgid "Hide IPv6" ++msgstr "" ++ ++msgid "Hna4" ++msgstr "" ++ ++msgid "Hna6" ++msgstr "" ++ ++msgid "Hops" ++msgstr "" ++ ++msgid "Hostname" ++msgstr "" ++ ++msgid "" ++"Hosts in a OLSR routed network can announce connecitivity to external " ++"networks using HNA messages." ++msgstr "" ++ ++msgid "" ++"Hosts in a OLSR routed network can announce connecitivity to external " ++"networks using HNA6 messages." ++msgstr "" ++ ++msgid "" ++"Hysteresis for link sensing (only for hopcount metric). Hysteresis adds more " ++"robustness to the link sensing but delays neighbor registration. Defaults is " ++"\"yes\"" ++msgstr "" ++ ++msgid "IP Addresses" ++msgstr "" ++ ++msgid "" ++"IP-version to use. If 6and4 is selected then one olsrd instance is started " ++"for each protocol." ++msgstr "" ++ ++msgid "IPv4" ++msgstr "" ++ ++msgid "IPv4 broadcast" ++msgstr "" ++ ++msgid "" ++"IPv4 broadcast address for outgoing OLSR packets. One useful example would " ++"be 255.255.255.255. Default is \"0.0.0.0\", which triggers the usage of the " ++"interface broadcast IP." ++msgstr "" ++ ++msgid "IPv4 source" ++msgstr "" ++ ++msgid "" ++"IPv4 src address for outgoing OLSR packages. Default is \"0.0.0.0\", which " ++"triggers usage of the interface IP." ++msgstr "" ++ ++msgid "IPv6" ++msgstr "" ++ ++msgid "IPv6 multicast" ++msgstr "IPv6 multidiffusion" ++ ++msgid "" ++"IPv6 multicast address. Default is \"FF02::6D\", the manet-router linklocal " ++"multicast." ++msgstr "" ++ ++msgid "" ++"IPv6 network must be given in full notation, prefix must be in CIDR notation." ++msgstr "" ++ ++msgid "IPv6 source" ++msgstr "" ++ ++msgid "" ++"IPv6 src prefix. OLSRd will choose one of the interface IPs which matches " ++"the prefix of this parameter. Default is \"0::/0\", which triggers the usage " ++"of a not-linklocal interface IP." ++msgstr "" ++ ++msgid "IPv6-Prefix of the uplink" ++msgstr "" ++ ++msgid "" ++"If the route to the current gateway is to be changed, the ETX value of this " ++"gateway is multiplied with this value before it is compared to the new one. " ++"The parameter can be a value between 0.1 and 1.0, but should be close to 1.0 " ++"if changed.
    WARNING: This parameter should not be used together " ++"with the etx_ffeth metric!
    Defaults to \"1.0\"." ++msgstr "" ++ ++msgid "" ++"If this Node uses NAT for connections to the internet. Default is \"yes\"." ++msgstr "" ++ ++msgid "Interface" ++msgstr "" ++ ++msgid "" ++"Interface Mode is used to prevent unnecessary packet forwarding on switched " ++"ethernet interfaces. valid Modes are \"mesh\" and \"ether\". Default is " ++"\"mesh\"." ++msgstr "" ++ ++msgid "Interfaces" ++msgstr "" ++ ++msgid "Interfaces Defaults" ++msgstr "" ++ ++msgid "Internet protocol" ++msgstr "" ++ ++msgid "" ++"Interval to poll network interfaces for configuration changes (in seconds). " ++"Default is \"2.5\"." ++msgstr "" ++ ++msgid "Invalid Value for LQMult-Value. Must be between 0.01 and 1.0." ++msgstr "" ++ ++msgid "" ++"Invalid Value for LQMult-Value. You must use a decimal number between 0.01 " ++"and 1.0 here." ++msgstr "" ++ ++msgid "Known OLSR routes" ++msgstr "" ++ ++msgid "LQ" ++msgstr "" ++ ++msgid "LQ aging" ++msgstr "" ++ ++msgid "LQ algorithm" ++msgstr "" ++ ++msgid "LQ fisheye" ++msgstr "" ++ ++msgid "LQ level" ++msgstr "" ++ ++msgid "" ++"LQMult requires two values (IP address or 'default' and multiplicator) " ++"seperated by space." ++msgstr "" ++ ++msgid "Last hop" ++msgstr "" ++ ++msgid "Legend" ++msgstr "" ++ ++msgid "Library" ++msgstr "" ++ ++msgid "Link Quality Settings" ++msgstr "" ++ ++msgid "" ++"Link quality aging factor (only for lq level 2). Tuning parameter for " ++"etx_float and etx_fpm, smaller values mean slower changes of ETX value. " ++"(allowed values are between 0.01 and 1.0)" ++msgstr "" ++ ++msgid "" ++"Link quality algorithm (only for lq level 2).
    etx_float: " ++"floating point ETX with exponential aging
    etx_fpm : same as " ++"etx_float, but with integer arithmetic
    etx_ff : ETX freifunk, an " ++"etx variant which use all OLSR traffic (instead of only hellos) for ETX " ++"calculation
    etx_ffeth: incompatible variant of etx_ff that " ++"allows ethernet links with ETX 0.1.
    Defaults to \"etx_ff\"" ++msgstr "" ++ ++msgid "" ++"Link quality level switch between hopcount and cost-based (mostly ETX) " ++"routing.
    0 = do not use link quality
    2 = use link " ++"quality for MPR selection and routing
    Default is \"2\"" ++msgstr "" ++ ++msgid "LinkQuality Multiplicator" ++msgstr "" ++ ++msgid "Links per node (average)" ++msgstr "" ++ ++msgid "Links total" ++msgstr "" ++ ++msgid "Local interface IP" ++msgstr "" ++ ++msgid "MID" ++msgstr "" ++ ++msgid "MID interval" ++msgstr "" ++ ++msgid "MID validity time" ++msgstr "" ++ ++msgid "MTU" ++msgstr "" ++ ++msgid "Main IP" ++msgstr "" ++ ++msgid "" ++"Make sure that OLSRd is running, the \"jsoninfo\" plugin is loaded, " ++"configured on port 9090 and accepts connections from \"127.0.0.1\"." ++msgstr "" ++ ++msgid "Metric" ++msgstr "" ++ ++msgid "Mode" ++msgstr "" ++ ++msgid "" ++"Multiply routes with the factor given here. Allowed values are between 0.01 " ++"and 1.0. It is only used when LQ-Level is greater than 0. Examples:
    reduce LQ to 192.168.0.1 by half: 192.168.0.1 0.5
    reduce LQ to all " ++"nodes on this interface by 20%: default 0.8" ++msgstr "" ++ ++msgid "" ++"Multiply routes with the factor given here. Allowed values are between 0.01 " ++"and 1.0. It is only used when LQ-Level is greater than 0. Examples:
    reduce LQ to fd91:662e:3c58::1 by half: fd91:662e:3c58::1 0.5
    reduce " ++"LQ to all nodes on this interface by 20%: default 0.8" ++msgstr "" ++ ++msgid "NAT threshold" ++msgstr "" ++ ++msgid "NLQ" ++msgstr "" ++ ++msgid "Neighbors" ++msgstr "" ++ ++msgid "Neighbour IP" ++msgstr "" ++ ++msgid "Neighbours" ++msgstr "" ++ ++msgid "Netmask" ++msgstr "" ++ ++msgid "Network" ++msgstr "" ++ ++msgid "Network address" ++msgstr "" ++ ++msgid "Nic changes poll interval" ++msgstr "" ++ ++msgid "Nodes" ++msgstr "" ++ ++msgid "OLSR" ++msgstr "" ++ ++msgid "OLSR - Display Options" ++msgstr "" ++ ++msgid "OLSR - HNA-Announcements" ++msgstr "" ++ ++msgid "OLSR - HNA6-Announcements" ++msgstr "" ++ ++msgid "OLSR - Plugins" ++msgstr "" ++ ++msgid "OLSR Daemon" ++msgstr "" ++ ++msgid "OLSR Daemon - Interface" ++msgstr "" ++ ++msgid "OLSR connections" ++msgstr "" ++ ++msgid "OLSR gateway" ++msgstr "" ++ ++msgid "OLSR node" ++msgstr "" ++ ++msgid "Orange" ++msgstr "" ++ ++msgid "Overview" ++msgstr "" ++ ++msgid "Overview of currently active OLSR host net announcements" ++msgstr "" ++ ++msgid "Overview of currently established OLSR connections" ++msgstr "" ++ ++msgid "Overview of currently known OLSR nodes" ++msgstr "" ++ ++msgid "Overview of currently known routes to other OLSR nodes" ++msgstr "" ++ ++msgid "Overview of interfaces where OLSR is running" ++msgstr "" ++ ++msgid "Overview of known multiple interface announcements" ++msgstr "" ++ ++msgid "Overview of smart gateways in this network" ++msgstr "" ++ ++msgid "Plugin configuration" ++msgstr "" ++ ++msgid "Plugins" ++msgstr "" ++ ++msgid "Polling rate for OLSR sockets in seconds. Default is 0.05." ++msgstr "" ++ ++msgid "Pollrate" ++msgstr "" ++ ++msgid "Port" ++msgstr "" ++ ++msgid "Prefix" ++msgstr "" ++ ++msgid "Red" ++msgstr "" ++ ++msgid "Resolve" ++msgstr "" ++ ++msgid "" ++"Resolve hostnames on status pages. It is generally safe to allow this, but " ++"if you use public IPs and have unstable DNS-Setup then those pages will load " ++"really slow. In this case disable it here." ++msgstr "" ++ ++msgid "Routes" ++msgstr "" ++ ++msgid "Secondary OLSR interfaces" ++msgstr "" ++ ++msgid "" ++"Sets the main IP (originator ip) of the router. This IP will NEVER change " ++"during the uptime of olsrd. Default is 0.0.0.0, which triggers usage of the " ++"IP of the first interface." ++msgstr "" ++ ++msgid "" ++"Sets the main IP (originator ip) of the router. This IP will NEVER change " ++"during the uptime of olsrd. Default is ::, which triggers usage of the IP of " ++"the first interface." ++msgstr "" ++ ++msgid "Show IPv4" ++msgstr "" ++ ++msgid "Show IPv6" ++msgstr "" ++ ++msgid "Signal Noise Ratio in dB" ++msgstr "" ++ ++msgid "SmartGW" ++msgstr "" ++ ++msgid "SmartGW announcements" ++msgstr "" ++ ++msgid "SmartGateway is not configured on this system." ++msgstr "" ++ ++msgid "Source address" ++msgstr "" ++ ++msgid "" ++"Specifies the speed of the uplink in kilobits/s. First parameter is " ++"upstream, second parameter is downstream. Default is \"128 1024\"." ++msgstr "" ++ ++msgid "Speed of the uplink" ++msgstr "" ++ ++msgid "State" ++msgstr "" ++ ++msgid "Status" ++msgstr "" ++ ++msgid "Still usable (20 > SNR > 5)" ++msgstr "" ++ ++msgid "Still usable (4 < ETX < 10)" ++msgstr "" ++ ++msgid "Success rate of packages received from the neighbour" ++msgstr "" ++ ++msgid "Success rate of packages sent to the neighbour" ++msgstr "" ++ ++msgid "TC" ++msgstr "" ++ ++msgid "TC interval" ++msgstr "" ++ ++msgid "TC validity time" ++msgstr "" ++ ++msgid "TOS value" ++msgstr "" ++ ++msgid "" ++"The OLSR daemon is an implementation of the Optimized Link State Routing " ++"protocol. As such it allows mesh routing for any network equipment. It runs " ++"on any wifi card that supports ad-hoc mode and of course on any ethernet " ++"device. Visit olsrd.org for help and " ++"documentation." ++msgstr "" ++ ++msgid "" ++"The fixed willingness to use. If not set willingness will be calculated " ++"dynamically based on battery/power status. Default is \"3\"." ++msgstr "" ++ ++msgid "The interface OLSRd should serve." ++msgstr "" ++ ++msgid "" ++"The port OLSR uses. This should usually stay at the IANA assigned port 698. " ++"It can have a value between 1 and 65535." ++msgstr "" ++ ++msgid "" ++"This can be used to signal the external IPv6 prefix of the uplink to the " ++"clients. This might allow a client to change it's local IPv6 address to use " ++"the IPv6 gateway without any kind of address translation. The maximum prefix " ++"length is 64 bits. Default is \"::/0\" (no prefix)." ++msgstr "" ++ ++msgid "Timing and Validity" ++msgstr "" ++ ++msgid "Topology" ++msgstr "" ++ ++msgid "" ++"Type of service value for the IP header of control traffic. Default is " ++"\"16\"." ++msgstr "" ++ ++msgid "Unable to connect to the OLSR daemon!" ++msgstr "" ++ ++msgid "Uplink" ++msgstr "" ++ ++msgid "Uplink uses NAT" ++msgstr "" ++ ++msgid "Use hysteresis" ++msgstr "" ++ ++msgid "Validity Time" ++msgstr "" ++ ++msgid "Version" ++msgstr "" ++ ++msgid "Very good (ETX < 2)" ++msgstr "" ++ ++msgid "Very good (SNR > 30)" ++msgstr "" ++ ++msgid "WLAN" ++msgstr "" ++ ++msgid "" ++"Warning: kmod-ipip is not installed. Without kmod-ipip SmartGateway will not " ++"work, please install it." ++msgstr "" ++ ++msgid "Weight" ++msgstr "" ++ ++msgid "" ++"When multiple links exist between hosts the weight of interface is used to " ++"determine the link to use. Normally the weight is automatically calculated " ++"by olsrd based on the characteristics of the interface, but here you can " ++"specify a fixed value. Olsrd will choose links with the lowest value.
    Note: Interface weight is used only when LinkQualityLevel is set to " ++"0. For any other value of LinkQualityLevel, the interface ETX value is used " ++"instead." ++msgstr "" ++ ++msgid "" ++"Which kind of uplink is exported to the other mesh nodes. An uplink is " ++"detected by looking for a local HNA of 0.0.0.0/0, ::ffff:0:0/96 or 2000::/3. " ++"Default setting is \"both\"." ++msgstr "" ++ ++msgid "" ++"Which kind of uplink is exported to the other mesh nodes. An uplink is " ++"detected by looking for a local HNA6 ::ffff:0:0/96 or 2000::/3. Default " ++"setting is \"both\"." ++msgstr "" ++ ++msgid "Willingness" ++msgstr "" ++ ++msgid "Yellow" ++msgstr "" ++ ++msgid "no" ++msgstr "" ++ ++msgid "yes" ++msgstr "" +diff --git a/feeds/luci/applications/luci-app-olsr/po/he/olsr.po b/feeds/luci/applications/luci-app-olsr/po/he/olsr.po +new file mode 100644 +index 0000000..38aa43b +--- /dev/null ++++ b/feeds/luci/applications/luci-app-olsr/po/he/olsr.po +@@ -0,0 +1,687 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Last-Translator: Automatically generated\n" ++"Language-Team: none\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n != 1);\n" ++ ++msgid "Active MID announcements" ++msgstr "" ++ ++msgid "Active OLSR nodes" ++msgstr "" ++ ++msgid "Active host net announcements" ++msgstr "" ++ ++msgid "Advanced Settings" ++msgstr "" ++ ++msgid "Allow gateways with NAT" ++msgstr "" ++ ++msgid "Allow the selection of an outgoing ipv4 gateway with NAT" ++msgstr "" ++ ++msgid "Announce uplink" ++msgstr "" ++ ++msgid "Announced network" ++msgstr "" ++ ++msgid "Bad (ETX > 10)" ++msgstr "" ++ ++msgid "Bad (SNR < 5)" ++msgstr "" ++ ++msgid "Both values must use the dotted decimal notation." ++msgstr "" ++ ++msgid "Broadcast address" ++msgstr "" ++ ++msgid "Can only be a valid IPv4 or IPv6 address or 'default'" ++msgstr "" ++ ++msgid "Can only be a valid IPv6 address or 'default'" ++msgstr "" ++ ++msgid "Configuration" ++msgstr "" ++ ++msgid "" ++"Could not get any data. Make sure the jsoninfo plugin is installed and " ++"allows connections from localhost." ++msgstr "" ++ ++msgid "Display" ++msgstr "" ++ ++msgid "Downlink" ++msgstr "" ++ ++msgid "Download Config" ++msgstr "" ++ ++msgid "ETX" ++msgstr "" ++ ++msgid "Enable" ++msgstr "" ++ ++msgid "" ++"Enable SmartGateway. If it is disabled, then all other SmartGateway " ++"parameters are ignored. Default is \"no\"." ++msgstr "" ++ ++msgid "Enable this interface." ++msgstr "" ++ ++msgid "Enabled" ++msgstr "" ++ ++msgid "Expected retransmission count" ++msgstr "" ++ ++msgid "FIB metric" ++msgstr "" ++ ++msgid "" ++"FIBMetric controls the metric value of the host-routes OLSRd sets. \"flat\" " ++"means that the metric value is always 2. This is the preferred value because " ++"it helps the linux kernel routing to clean up older routes. \"correct\" uses " ++"the hopcount as the metric value. \"approx\" use the hopcount as the metric " ++"value too, but does only update the hopcount if the nexthop changes too. " ++"Default is \"flat\"." ++msgstr "" ++ ++msgid "Fisheye mechanism for TCs (checked means on). Default is \"on\"" ++msgstr "" ++ ++msgid "Gateway" ++msgstr "" ++ ++msgid "General Settings" ++msgstr "" ++ ++msgid "General settings" ++msgstr "" ++ ++msgid "Good (2 < ETX < 4)" ++msgstr "" ++ ++msgid "Good (30 > SNR > 20)" ++msgstr "" ++ ++msgid "Green" ++msgstr "" ++ ++msgid "HNA" ++msgstr "" ++ ++msgid "HNA Announcements" ++msgstr "" ++ ++msgid "HNA interval" ++msgstr "" ++ ++msgid "HNA validity time" ++msgstr "" ++ ++msgid "HNA6 Announcements" ++msgstr "" ++ ++msgid "Hello" ++msgstr "" ++ ++msgid "Hello interval" ++msgstr "" ++ ++msgid "Hello validity time" ++msgstr "" ++ ++msgid "Hide IPv4" ++msgstr "" ++ ++msgid "Hide IPv6" ++msgstr "" ++ ++msgid "Hna4" ++msgstr "" ++ ++msgid "Hna6" ++msgstr "" ++ ++msgid "Hops" ++msgstr "" ++ ++msgid "Hostname" ++msgstr "" ++ ++msgid "" ++"Hosts in a OLSR routed network can announce connecitivity to external " ++"networks using HNA messages." ++msgstr "" ++ ++msgid "" ++"Hosts in a OLSR routed network can announce connecitivity to external " ++"networks using HNA6 messages." ++msgstr "" ++ ++msgid "" ++"Hysteresis for link sensing (only for hopcount metric). Hysteresis adds more " ++"robustness to the link sensing but delays neighbor registration. Defaults is " ++"\"yes\"" ++msgstr "" ++ ++msgid "IP Addresses" ++msgstr "" ++ ++msgid "" ++"IP-version to use. If 6and4 is selected then one olsrd instance is started " ++"for each protocol." ++msgstr "" ++ ++msgid "IPv4" ++msgstr "" ++ ++msgid "IPv4 broadcast" ++msgstr "" ++ ++msgid "" ++"IPv4 broadcast address for outgoing OLSR packets. One useful example would " ++"be 255.255.255.255. Default is \"0.0.0.0\", which triggers the usage of the " ++"interface broadcast IP." ++msgstr "" ++ ++msgid "IPv4 source" ++msgstr "" ++ ++msgid "" ++"IPv4 src address for outgoing OLSR packages. Default is \"0.0.0.0\", which " ++"triggers usage of the interface IP." ++msgstr "" ++ ++msgid "IPv6" ++msgstr "" ++ ++msgid "IPv6 multicast" ++msgstr "" ++ ++msgid "" ++"IPv6 multicast address. Default is \"FF02::6D\", the manet-router linklocal " ++"multicast." ++msgstr "" ++ ++msgid "" ++"IPv6 network must be given in full notation, prefix must be in CIDR notation." ++msgstr "" ++ ++msgid "IPv6 source" ++msgstr "" ++ ++msgid "" ++"IPv6 src prefix. OLSRd will choose one of the interface IPs which matches " ++"the prefix of this parameter. Default is \"0::/0\", which triggers the usage " ++"of a not-linklocal interface IP." ++msgstr "" ++ ++msgid "IPv6-Prefix of the uplink" ++msgstr "" ++ ++msgid "" ++"If the route to the current gateway is to be changed, the ETX value of this " ++"gateway is multiplied with this value before it is compared to the new one. " ++"The parameter can be a value between 0.1 and 1.0, but should be close to 1.0 " ++"if changed.
    WARNING: This parameter should not be used together " ++"with the etx_ffeth metric!
    Defaults to \"1.0\"." ++msgstr "" ++ ++msgid "" ++"If this Node uses NAT for connections to the internet. Default is \"yes\"." ++msgstr "" ++ ++msgid "Interface" ++msgstr "" ++ ++msgid "" ++"Interface Mode is used to prevent unnecessary packet forwarding on switched " ++"ethernet interfaces. valid Modes are \"mesh\" and \"ether\". Default is " ++"\"mesh\"." ++msgstr "" ++ ++msgid "Interfaces" ++msgstr "" ++ ++msgid "Interfaces Defaults" ++msgstr "" ++ ++msgid "Internet protocol" ++msgstr "" ++ ++msgid "" ++"Interval to poll network interfaces for configuration changes (in seconds). " ++"Default is \"2.5\"." ++msgstr "" ++ ++msgid "Invalid Value for LQMult-Value. Must be between 0.01 and 1.0." ++msgstr "" ++ ++msgid "" ++"Invalid Value for LQMult-Value. You must use a decimal number between 0.01 " ++"and 1.0 here." ++msgstr "" ++ ++msgid "Known OLSR routes" ++msgstr "" ++ ++msgid "LQ" ++msgstr "" ++ ++msgid "LQ aging" ++msgstr "" ++ ++msgid "LQ algorithm" ++msgstr "" ++ ++msgid "LQ fisheye" ++msgstr "" ++ ++msgid "LQ level" ++msgstr "" ++ ++msgid "" ++"LQMult requires two values (IP address or 'default' and multiplicator) " ++"seperated by space." ++msgstr "" ++ ++msgid "Last hop" ++msgstr "" ++ ++msgid "Legend" ++msgstr "" ++ ++msgid "Library" ++msgstr "" ++ ++msgid "Link Quality Settings" ++msgstr "" ++ ++msgid "" ++"Link quality aging factor (only for lq level 2). Tuning parameter for " ++"etx_float and etx_fpm, smaller values mean slower changes of ETX value. " ++"(allowed values are between 0.01 and 1.0)" ++msgstr "" ++ ++msgid "" ++"Link quality algorithm (only for lq level 2).
    etx_float: " ++"floating point ETX with exponential aging
    etx_fpm : same as " ++"etx_float, but with integer arithmetic
    etx_ff : ETX freifunk, an " ++"etx variant which use all OLSR traffic (instead of only hellos) for ETX " ++"calculation
    etx_ffeth: incompatible variant of etx_ff that " ++"allows ethernet links with ETX 0.1.
    Defaults to \"etx_ff\"" ++msgstr "" ++ ++msgid "" ++"Link quality level switch between hopcount and cost-based (mostly ETX) " ++"routing.
    0 = do not use link quality
    2 = use link " ++"quality for MPR selection and routing
    Default is \"2\"" ++msgstr "" ++ ++msgid "LinkQuality Multiplicator" ++msgstr "" ++ ++msgid "Links per node (average)" ++msgstr "" ++ ++msgid "Links total" ++msgstr "" ++ ++msgid "Local interface IP" ++msgstr "" ++ ++msgid "MID" ++msgstr "" ++ ++msgid "MID interval" ++msgstr "" ++ ++msgid "MID validity time" ++msgstr "" ++ ++msgid "MTU" ++msgstr "" ++ ++msgid "Main IP" ++msgstr "" ++ ++msgid "" ++"Make sure that OLSRd is running, the \"jsoninfo\" plugin is loaded, " ++"configured on port 9090 and accepts connections from \"127.0.0.1\"." ++msgstr "" ++ ++msgid "Metric" ++msgstr "" ++ ++msgid "Mode" ++msgstr "" ++ ++msgid "" ++"Multiply routes with the factor given here. Allowed values are between 0.01 " ++"and 1.0. It is only used when LQ-Level is greater than 0. Examples:
    reduce LQ to 192.168.0.1 by half: 192.168.0.1 0.5
    reduce LQ to all " ++"nodes on this interface by 20%: default 0.8" ++msgstr "" ++ ++msgid "" ++"Multiply routes with the factor given here. Allowed values are between 0.01 " ++"and 1.0. It is only used when LQ-Level is greater than 0. Examples:
    reduce LQ to fd91:662e:3c58::1 by half: fd91:662e:3c58::1 0.5
    reduce " ++"LQ to all nodes on this interface by 20%: default 0.8" ++msgstr "" ++ ++msgid "NAT threshold" ++msgstr "" ++ ++msgid "NLQ" ++msgstr "" ++ ++msgid "Neighbors" ++msgstr "" ++ ++msgid "Neighbour IP" ++msgstr "" ++ ++msgid "Neighbours" ++msgstr "" ++ ++msgid "Netmask" ++msgstr "" ++ ++msgid "Network" ++msgstr "" ++ ++msgid "Network address" ++msgstr "" ++ ++msgid "Nic changes poll interval" ++msgstr "" ++ ++msgid "Nodes" ++msgstr "" ++ ++msgid "OLSR" ++msgstr "" ++ ++msgid "OLSR - Display Options" ++msgstr "" ++ ++msgid "OLSR - HNA-Announcements" ++msgstr "" ++ ++msgid "OLSR - HNA6-Announcements" ++msgstr "" ++ ++msgid "OLSR - Plugins" ++msgstr "" ++ ++msgid "OLSR Daemon" ++msgstr "" ++ ++msgid "OLSR Daemon - Interface" ++msgstr "" ++ ++msgid "OLSR connections" ++msgstr "" ++ ++msgid "OLSR gateway" ++msgstr "" ++ ++msgid "OLSR node" ++msgstr "" ++ ++msgid "Orange" ++msgstr "" ++ ++msgid "Overview" ++msgstr "" ++ ++msgid "Overview of currently active OLSR host net announcements" ++msgstr "" ++ ++msgid "Overview of currently established OLSR connections" ++msgstr "" ++ ++msgid "Overview of currently known OLSR nodes" ++msgstr "" ++ ++msgid "Overview of currently known routes to other OLSR nodes" ++msgstr "" ++ ++msgid "Overview of interfaces where OLSR is running" ++msgstr "" ++ ++msgid "Overview of known multiple interface announcements" ++msgstr "" ++ ++msgid "Overview of smart gateways in this network" ++msgstr "" ++ ++msgid "Plugin configuration" ++msgstr "" ++ ++msgid "Plugins" ++msgstr "" ++ ++msgid "Polling rate for OLSR sockets in seconds. Default is 0.05." ++msgstr "" ++ ++msgid "Pollrate" ++msgstr "" ++ ++msgid "Port" ++msgstr "" ++ ++msgid "Prefix" ++msgstr "" ++ ++msgid "Red" ++msgstr "" ++ ++msgid "Resolve" ++msgstr "" ++ ++msgid "" ++"Resolve hostnames on status pages. It is generally safe to allow this, but " ++"if you use public IPs and have unstable DNS-Setup then those pages will load " ++"really slow. In this case disable it here." ++msgstr "" ++ ++msgid "Routes" ++msgstr "" ++ ++msgid "Secondary OLSR interfaces" ++msgstr "" ++ ++msgid "" ++"Sets the main IP (originator ip) of the router. This IP will NEVER change " ++"during the uptime of olsrd. Default is 0.0.0.0, which triggers usage of the " ++"IP of the first interface." ++msgstr "" ++ ++msgid "" ++"Sets the main IP (originator ip) of the router. This IP will NEVER change " ++"during the uptime of olsrd. Default is ::, which triggers usage of the IP of " ++"the first interface." ++msgstr "" ++ ++msgid "Show IPv4" ++msgstr "" ++ ++msgid "Show IPv6" ++msgstr "" ++ ++msgid "Signal Noise Ratio in dB" ++msgstr "" ++ ++msgid "SmartGW" ++msgstr "" ++ ++msgid "SmartGW announcements" ++msgstr "" ++ ++msgid "SmartGateway is not configured on this system." ++msgstr "" ++ ++msgid "Source address" ++msgstr "" ++ ++msgid "" ++"Specifies the speed of the uplink in kilobits/s. First parameter is " ++"upstream, second parameter is downstream. Default is \"128 1024\"." ++msgstr "" ++ ++msgid "Speed of the uplink" ++msgstr "" ++ ++msgid "State" ++msgstr "" ++ ++msgid "Status" ++msgstr "" ++ ++msgid "Still usable (20 > SNR > 5)" ++msgstr "" ++ ++msgid "Still usable (4 < ETX < 10)" ++msgstr "" ++ ++msgid "Success rate of packages received from the neighbour" ++msgstr "" ++ ++msgid "Success rate of packages sent to the neighbour" ++msgstr "" ++ ++msgid "TC" ++msgstr "" ++ ++msgid "TC interval" ++msgstr "" ++ ++msgid "TC validity time" ++msgstr "" ++ ++msgid "TOS value" ++msgstr "" ++ ++msgid "" ++"The OLSR daemon is an implementation of the Optimized Link State Routing " ++"protocol. As such it allows mesh routing for any network equipment. It runs " ++"on any wifi card that supports ad-hoc mode and of course on any ethernet " ++"device. Visit olsrd.org for help and " ++"documentation." ++msgstr "" ++ ++msgid "" ++"The fixed willingness to use. If not set willingness will be calculated " ++"dynamically based on battery/power status. Default is \"3\"." ++msgstr "" ++ ++msgid "The interface OLSRd should serve." ++msgstr "" ++ ++msgid "" ++"The port OLSR uses. This should usually stay at the IANA assigned port 698. " ++"It can have a value between 1 and 65535." ++msgstr "" ++ ++msgid "" ++"This can be used to signal the external IPv6 prefix of the uplink to the " ++"clients. This might allow a client to change it's local IPv6 address to use " ++"the IPv6 gateway without any kind of address translation. The maximum prefix " ++"length is 64 bits. Default is \"::/0\" (no prefix)." ++msgstr "" ++ ++msgid "Timing and Validity" ++msgstr "" ++ ++msgid "Topology" ++msgstr "" ++ ++msgid "" ++"Type of service value for the IP header of control traffic. Default is " ++"\"16\"." ++msgstr "" ++ ++msgid "Unable to connect to the OLSR daemon!" ++msgstr "" ++ ++msgid "Uplink" ++msgstr "" ++ ++msgid "Uplink uses NAT" ++msgstr "" ++ ++msgid "Use hysteresis" ++msgstr "" ++ ++msgid "Validity Time" ++msgstr "" ++ ++msgid "Version" ++msgstr "" ++ ++msgid "Very good (ETX < 2)" ++msgstr "" ++ ++msgid "Very good (SNR > 30)" ++msgstr "" ++ ++msgid "WLAN" ++msgstr "" ++ ++msgid "" ++"Warning: kmod-ipip is not installed. Without kmod-ipip SmartGateway will not " ++"work, please install it." ++msgstr "" ++ ++msgid "Weight" ++msgstr "" ++ ++msgid "" ++"When multiple links exist between hosts the weight of interface is used to " ++"determine the link to use. Normally the weight is automatically calculated " ++"by olsrd based on the characteristics of the interface, but here you can " ++"specify a fixed value. Olsrd will choose links with the lowest value.
    Note: Interface weight is used only when LinkQualityLevel is set to " ++"0. For any other value of LinkQualityLevel, the interface ETX value is used " ++"instead." ++msgstr "" ++ ++msgid "" ++"Which kind of uplink is exported to the other mesh nodes. An uplink is " ++"detected by looking for a local HNA of 0.0.0.0/0, ::ffff:0:0/96 or 2000::/3. " ++"Default setting is \"both\"." ++msgstr "" ++ ++msgid "" ++"Which kind of uplink is exported to the other mesh nodes. An uplink is " ++"detected by looking for a local HNA6 ::ffff:0:0/96 or 2000::/3. Default " ++"setting is \"both\"." ++msgstr "" ++ ++msgid "Willingness" ++msgstr "" ++ ++msgid "Yellow" ++msgstr "" ++ ++msgid "no" ++msgstr "" ++ ++msgid "yes" ++msgstr "" +diff --git a/feeds/luci/applications/luci-app-olsr/po/hu/olsr.po b/feeds/luci/applications/luci-app-olsr/po/hu/olsr.po +new file mode 100644 +index 0000000..38aa43b +--- /dev/null ++++ b/feeds/luci/applications/luci-app-olsr/po/hu/olsr.po +@@ -0,0 +1,687 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Last-Translator: Automatically generated\n" ++"Language-Team: none\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n != 1);\n" ++ ++msgid "Active MID announcements" ++msgstr "" ++ ++msgid "Active OLSR nodes" ++msgstr "" ++ ++msgid "Active host net announcements" ++msgstr "" ++ ++msgid "Advanced Settings" ++msgstr "" ++ ++msgid "Allow gateways with NAT" ++msgstr "" ++ ++msgid "Allow the selection of an outgoing ipv4 gateway with NAT" ++msgstr "" ++ ++msgid "Announce uplink" ++msgstr "" ++ ++msgid "Announced network" ++msgstr "" ++ ++msgid "Bad (ETX > 10)" ++msgstr "" ++ ++msgid "Bad (SNR < 5)" ++msgstr "" ++ ++msgid "Both values must use the dotted decimal notation." ++msgstr "" ++ ++msgid "Broadcast address" ++msgstr "" ++ ++msgid "Can only be a valid IPv4 or IPv6 address or 'default'" ++msgstr "" ++ ++msgid "Can only be a valid IPv6 address or 'default'" ++msgstr "" ++ ++msgid "Configuration" ++msgstr "" ++ ++msgid "" ++"Could not get any data. Make sure the jsoninfo plugin is installed and " ++"allows connections from localhost." ++msgstr "" ++ ++msgid "Display" ++msgstr "" ++ ++msgid "Downlink" ++msgstr "" ++ ++msgid "Download Config" ++msgstr "" ++ ++msgid "ETX" ++msgstr "" ++ ++msgid "Enable" ++msgstr "" ++ ++msgid "" ++"Enable SmartGateway. If it is disabled, then all other SmartGateway " ++"parameters are ignored. Default is \"no\"." ++msgstr "" ++ ++msgid "Enable this interface." ++msgstr "" ++ ++msgid "Enabled" ++msgstr "" ++ ++msgid "Expected retransmission count" ++msgstr "" ++ ++msgid "FIB metric" ++msgstr "" ++ ++msgid "" ++"FIBMetric controls the metric value of the host-routes OLSRd sets. \"flat\" " ++"means that the metric value is always 2. This is the preferred value because " ++"it helps the linux kernel routing to clean up older routes. \"correct\" uses " ++"the hopcount as the metric value. \"approx\" use the hopcount as the metric " ++"value too, but does only update the hopcount if the nexthop changes too. " ++"Default is \"flat\"." ++msgstr "" ++ ++msgid "Fisheye mechanism for TCs (checked means on). Default is \"on\"" ++msgstr "" ++ ++msgid "Gateway" ++msgstr "" ++ ++msgid "General Settings" ++msgstr "" ++ ++msgid "General settings" ++msgstr "" ++ ++msgid "Good (2 < ETX < 4)" ++msgstr "" ++ ++msgid "Good (30 > SNR > 20)" ++msgstr "" ++ ++msgid "Green" ++msgstr "" ++ ++msgid "HNA" ++msgstr "" ++ ++msgid "HNA Announcements" ++msgstr "" ++ ++msgid "HNA interval" ++msgstr "" ++ ++msgid "HNA validity time" ++msgstr "" ++ ++msgid "HNA6 Announcements" ++msgstr "" ++ ++msgid "Hello" ++msgstr "" ++ ++msgid "Hello interval" ++msgstr "" ++ ++msgid "Hello validity time" ++msgstr "" ++ ++msgid "Hide IPv4" ++msgstr "" ++ ++msgid "Hide IPv6" ++msgstr "" ++ ++msgid "Hna4" ++msgstr "" ++ ++msgid "Hna6" ++msgstr "" ++ ++msgid "Hops" ++msgstr "" ++ ++msgid "Hostname" ++msgstr "" ++ ++msgid "" ++"Hosts in a OLSR routed network can announce connecitivity to external " ++"networks using HNA messages." ++msgstr "" ++ ++msgid "" ++"Hosts in a OLSR routed network can announce connecitivity to external " ++"networks using HNA6 messages." ++msgstr "" ++ ++msgid "" ++"Hysteresis for link sensing (only for hopcount metric). Hysteresis adds more " ++"robustness to the link sensing but delays neighbor registration. Defaults is " ++"\"yes\"" ++msgstr "" ++ ++msgid "IP Addresses" ++msgstr "" ++ ++msgid "" ++"IP-version to use. If 6and4 is selected then one olsrd instance is started " ++"for each protocol." ++msgstr "" ++ ++msgid "IPv4" ++msgstr "" ++ ++msgid "IPv4 broadcast" ++msgstr "" ++ ++msgid "" ++"IPv4 broadcast address for outgoing OLSR packets. One useful example would " ++"be 255.255.255.255. Default is \"0.0.0.0\", which triggers the usage of the " ++"interface broadcast IP." ++msgstr "" ++ ++msgid "IPv4 source" ++msgstr "" ++ ++msgid "" ++"IPv4 src address for outgoing OLSR packages. Default is \"0.0.0.0\", which " ++"triggers usage of the interface IP." ++msgstr "" ++ ++msgid "IPv6" ++msgstr "" ++ ++msgid "IPv6 multicast" ++msgstr "" ++ ++msgid "" ++"IPv6 multicast address. Default is \"FF02::6D\", the manet-router linklocal " ++"multicast." ++msgstr "" ++ ++msgid "" ++"IPv6 network must be given in full notation, prefix must be in CIDR notation." ++msgstr "" ++ ++msgid "IPv6 source" ++msgstr "" ++ ++msgid "" ++"IPv6 src prefix. OLSRd will choose one of the interface IPs which matches " ++"the prefix of this parameter. Default is \"0::/0\", which triggers the usage " ++"of a not-linklocal interface IP." ++msgstr "" ++ ++msgid "IPv6-Prefix of the uplink" ++msgstr "" ++ ++msgid "" ++"If the route to the current gateway is to be changed, the ETX value of this " ++"gateway is multiplied with this value before it is compared to the new one. " ++"The parameter can be a value between 0.1 and 1.0, but should be close to 1.0 " ++"if changed.
    WARNING: This parameter should not be used together " ++"with the etx_ffeth metric!
    Defaults to \"1.0\"." ++msgstr "" ++ ++msgid "" ++"If this Node uses NAT for connections to the internet. Default is \"yes\"." ++msgstr "" ++ ++msgid "Interface" ++msgstr "" ++ ++msgid "" ++"Interface Mode is used to prevent unnecessary packet forwarding on switched " ++"ethernet interfaces. valid Modes are \"mesh\" and \"ether\". Default is " ++"\"mesh\"." ++msgstr "" ++ ++msgid "Interfaces" ++msgstr "" ++ ++msgid "Interfaces Defaults" ++msgstr "" ++ ++msgid "Internet protocol" ++msgstr "" ++ ++msgid "" ++"Interval to poll network interfaces for configuration changes (in seconds). " ++"Default is \"2.5\"." ++msgstr "" ++ ++msgid "Invalid Value for LQMult-Value. Must be between 0.01 and 1.0." ++msgstr "" ++ ++msgid "" ++"Invalid Value for LQMult-Value. You must use a decimal number between 0.01 " ++"and 1.0 here." ++msgstr "" ++ ++msgid "Known OLSR routes" ++msgstr "" ++ ++msgid "LQ" ++msgstr "" ++ ++msgid "LQ aging" ++msgstr "" ++ ++msgid "LQ algorithm" ++msgstr "" ++ ++msgid "LQ fisheye" ++msgstr "" ++ ++msgid "LQ level" ++msgstr "" ++ ++msgid "" ++"LQMult requires two values (IP address or 'default' and multiplicator) " ++"seperated by space." ++msgstr "" ++ ++msgid "Last hop" ++msgstr "" ++ ++msgid "Legend" ++msgstr "" ++ ++msgid "Library" ++msgstr "" ++ ++msgid "Link Quality Settings" ++msgstr "" ++ ++msgid "" ++"Link quality aging factor (only for lq level 2). Tuning parameter for " ++"etx_float and etx_fpm, smaller values mean slower changes of ETX value. " ++"(allowed values are between 0.01 and 1.0)" ++msgstr "" ++ ++msgid "" ++"Link quality algorithm (only for lq level 2).
    etx_float: " ++"floating point ETX with exponential aging
    etx_fpm : same as " ++"etx_float, but with integer arithmetic
    etx_ff : ETX freifunk, an " ++"etx variant which use all OLSR traffic (instead of only hellos) for ETX " ++"calculation
    etx_ffeth: incompatible variant of etx_ff that " ++"allows ethernet links with ETX 0.1.
    Defaults to \"etx_ff\"" ++msgstr "" ++ ++msgid "" ++"Link quality level switch between hopcount and cost-based (mostly ETX) " ++"routing.
    0 = do not use link quality
    2 = use link " ++"quality for MPR selection and routing
    Default is \"2\"" ++msgstr "" ++ ++msgid "LinkQuality Multiplicator" ++msgstr "" ++ ++msgid "Links per node (average)" ++msgstr "" ++ ++msgid "Links total" ++msgstr "" ++ ++msgid "Local interface IP" ++msgstr "" ++ ++msgid "MID" ++msgstr "" ++ ++msgid "MID interval" ++msgstr "" ++ ++msgid "MID validity time" ++msgstr "" ++ ++msgid "MTU" ++msgstr "" ++ ++msgid "Main IP" ++msgstr "" ++ ++msgid "" ++"Make sure that OLSRd is running, the \"jsoninfo\" plugin is loaded, " ++"configured on port 9090 and accepts connections from \"127.0.0.1\"." ++msgstr "" ++ ++msgid "Metric" ++msgstr "" ++ ++msgid "Mode" ++msgstr "" ++ ++msgid "" ++"Multiply routes with the factor given here. Allowed values are between 0.01 " ++"and 1.0. It is only used when LQ-Level is greater than 0. Examples:
    reduce LQ to 192.168.0.1 by half: 192.168.0.1 0.5
    reduce LQ to all " ++"nodes on this interface by 20%: default 0.8" ++msgstr "" ++ ++msgid "" ++"Multiply routes with the factor given here. Allowed values are between 0.01 " ++"and 1.0. It is only used when LQ-Level is greater than 0. Examples:
    reduce LQ to fd91:662e:3c58::1 by half: fd91:662e:3c58::1 0.5
    reduce " ++"LQ to all nodes on this interface by 20%: default 0.8" ++msgstr "" ++ ++msgid "NAT threshold" ++msgstr "" ++ ++msgid "NLQ" ++msgstr "" ++ ++msgid "Neighbors" ++msgstr "" ++ ++msgid "Neighbour IP" ++msgstr "" ++ ++msgid "Neighbours" ++msgstr "" ++ ++msgid "Netmask" ++msgstr "" ++ ++msgid "Network" ++msgstr "" ++ ++msgid "Network address" ++msgstr "" ++ ++msgid "Nic changes poll interval" ++msgstr "" ++ ++msgid "Nodes" ++msgstr "" ++ ++msgid "OLSR" ++msgstr "" ++ ++msgid "OLSR - Display Options" ++msgstr "" ++ ++msgid "OLSR - HNA-Announcements" ++msgstr "" ++ ++msgid "OLSR - HNA6-Announcements" ++msgstr "" ++ ++msgid "OLSR - Plugins" ++msgstr "" ++ ++msgid "OLSR Daemon" ++msgstr "" ++ ++msgid "OLSR Daemon - Interface" ++msgstr "" ++ ++msgid "OLSR connections" ++msgstr "" ++ ++msgid "OLSR gateway" ++msgstr "" ++ ++msgid "OLSR node" ++msgstr "" ++ ++msgid "Orange" ++msgstr "" ++ ++msgid "Overview" ++msgstr "" ++ ++msgid "Overview of currently active OLSR host net announcements" ++msgstr "" ++ ++msgid "Overview of currently established OLSR connections" ++msgstr "" ++ ++msgid "Overview of currently known OLSR nodes" ++msgstr "" ++ ++msgid "Overview of currently known routes to other OLSR nodes" ++msgstr "" ++ ++msgid "Overview of interfaces where OLSR is running" ++msgstr "" ++ ++msgid "Overview of known multiple interface announcements" ++msgstr "" ++ ++msgid "Overview of smart gateways in this network" ++msgstr "" ++ ++msgid "Plugin configuration" ++msgstr "" ++ ++msgid "Plugins" ++msgstr "" ++ ++msgid "Polling rate for OLSR sockets in seconds. Default is 0.05." ++msgstr "" ++ ++msgid "Pollrate" ++msgstr "" ++ ++msgid "Port" ++msgstr "" ++ ++msgid "Prefix" ++msgstr "" ++ ++msgid "Red" ++msgstr "" ++ ++msgid "Resolve" ++msgstr "" ++ ++msgid "" ++"Resolve hostnames on status pages. It is generally safe to allow this, but " ++"if you use public IPs and have unstable DNS-Setup then those pages will load " ++"really slow. In this case disable it here." ++msgstr "" ++ ++msgid "Routes" ++msgstr "" ++ ++msgid "Secondary OLSR interfaces" ++msgstr "" ++ ++msgid "" ++"Sets the main IP (originator ip) of the router. This IP will NEVER change " ++"during the uptime of olsrd. Default is 0.0.0.0, which triggers usage of the " ++"IP of the first interface." ++msgstr "" ++ ++msgid "" ++"Sets the main IP (originator ip) of the router. This IP will NEVER change " ++"during the uptime of olsrd. Default is ::, which triggers usage of the IP of " ++"the first interface." ++msgstr "" ++ ++msgid "Show IPv4" ++msgstr "" ++ ++msgid "Show IPv6" ++msgstr "" ++ ++msgid "Signal Noise Ratio in dB" ++msgstr "" ++ ++msgid "SmartGW" ++msgstr "" ++ ++msgid "SmartGW announcements" ++msgstr "" ++ ++msgid "SmartGateway is not configured on this system." ++msgstr "" ++ ++msgid "Source address" ++msgstr "" ++ ++msgid "" ++"Specifies the speed of the uplink in kilobits/s. First parameter is " ++"upstream, second parameter is downstream. Default is \"128 1024\"." ++msgstr "" ++ ++msgid "Speed of the uplink" ++msgstr "" ++ ++msgid "State" ++msgstr "" ++ ++msgid "Status" ++msgstr "" ++ ++msgid "Still usable (20 > SNR > 5)" ++msgstr "" ++ ++msgid "Still usable (4 < ETX < 10)" ++msgstr "" ++ ++msgid "Success rate of packages received from the neighbour" ++msgstr "" ++ ++msgid "Success rate of packages sent to the neighbour" ++msgstr "" ++ ++msgid "TC" ++msgstr "" ++ ++msgid "TC interval" ++msgstr "" ++ ++msgid "TC validity time" ++msgstr "" ++ ++msgid "TOS value" ++msgstr "" ++ ++msgid "" ++"The OLSR daemon is an implementation of the Optimized Link State Routing " ++"protocol. As such it allows mesh routing for any network equipment. It runs " ++"on any wifi card that supports ad-hoc mode and of course on any ethernet " ++"device. Visit olsrd.org for help and " ++"documentation." ++msgstr "" ++ ++msgid "" ++"The fixed willingness to use. If not set willingness will be calculated " ++"dynamically based on battery/power status. Default is \"3\"." ++msgstr "" ++ ++msgid "The interface OLSRd should serve." ++msgstr "" ++ ++msgid "" ++"The port OLSR uses. This should usually stay at the IANA assigned port 698. " ++"It can have a value between 1 and 65535." ++msgstr "" ++ ++msgid "" ++"This can be used to signal the external IPv6 prefix of the uplink to the " ++"clients. This might allow a client to change it's local IPv6 address to use " ++"the IPv6 gateway without any kind of address translation. The maximum prefix " ++"length is 64 bits. Default is \"::/0\" (no prefix)." ++msgstr "" ++ ++msgid "Timing and Validity" ++msgstr "" ++ ++msgid "Topology" ++msgstr "" ++ ++msgid "" ++"Type of service value for the IP header of control traffic. Default is " ++"\"16\"." ++msgstr "" ++ ++msgid "Unable to connect to the OLSR daemon!" ++msgstr "" ++ ++msgid "Uplink" ++msgstr "" ++ ++msgid "Uplink uses NAT" ++msgstr "" ++ ++msgid "Use hysteresis" ++msgstr "" ++ ++msgid "Validity Time" ++msgstr "" ++ ++msgid "Version" ++msgstr "" ++ ++msgid "Very good (ETX < 2)" ++msgstr "" ++ ++msgid "Very good (SNR > 30)" ++msgstr "" ++ ++msgid "WLAN" ++msgstr "" ++ ++msgid "" ++"Warning: kmod-ipip is not installed. Without kmod-ipip SmartGateway will not " ++"work, please install it." ++msgstr "" ++ ++msgid "Weight" ++msgstr "" ++ ++msgid "" ++"When multiple links exist between hosts the weight of interface is used to " ++"determine the link to use. Normally the weight is automatically calculated " ++"by olsrd based on the characteristics of the interface, but here you can " ++"specify a fixed value. Olsrd will choose links with the lowest value.
    Note: Interface weight is used only when LinkQualityLevel is set to " ++"0. For any other value of LinkQualityLevel, the interface ETX value is used " ++"instead." ++msgstr "" ++ ++msgid "" ++"Which kind of uplink is exported to the other mesh nodes. An uplink is " ++"detected by looking for a local HNA of 0.0.0.0/0, ::ffff:0:0/96 or 2000::/3. " ++"Default setting is \"both\"." ++msgstr "" ++ ++msgid "" ++"Which kind of uplink is exported to the other mesh nodes. An uplink is " ++"detected by looking for a local HNA6 ::ffff:0:0/96 or 2000::/3. Default " ++"setting is \"both\"." ++msgstr "" ++ ++msgid "Willingness" ++msgstr "" ++ ++msgid "Yellow" ++msgstr "" ++ ++msgid "no" ++msgstr "" ++ ++msgid "yes" ++msgstr "" +diff --git a/feeds/luci/applications/luci-app-olsr/po/it/olsr.po b/feeds/luci/applications/luci-app-olsr/po/it/olsr.po +new file mode 100644 +index 0000000..a88d297 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-olsr/po/it/olsr.po +@@ -0,0 +1,733 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Report-Msgid-Bugs-To: \n" ++"POT-Creation-Date: 2009-05-19 19:36+0200\n" ++"PO-Revision-Date: 2013-02-10 15:13+0200\n" ++"Last-Translator: Francesco <3gasas@gmail.com>\n" ++"Language-Team: LANGUAGE \n" ++"Language: it\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n != 1);\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "Active MID announcements" ++msgstr "Annunci MID attivi" ++ ++msgid "Active OLSR nodes" ++msgstr "Nodi OLSR attivi" ++ ++msgid "Active host net announcements" ++msgstr "Annunci rete host attiva" ++ ++msgid "Advanced Settings" ++msgstr "Opzioni avanzate" ++ ++msgid "Allow gateways with NAT" ++msgstr "Permetti gateway con NAT" ++ ++msgid "Allow the selection of an outgoing ipv4 gateway with NAT" ++msgstr "Permetti l'uso di gateway in uscita con NAT" ++ ++msgid "Announce uplink" ++msgstr "Annuncia uplink" ++ ++msgid "Announced network" ++msgstr "Rete da annnunciare" ++ ++msgid "Bad (ETX > 10)" ++msgstr "" ++ ++msgid "Bad (SNR < 5)" ++msgstr "" ++ ++msgid "Both values must use the dotted decimal notation." ++msgstr "Entrambi i valori devono essere nella notazione decimale puntata" ++ ++msgid "Broadcast address" ++msgstr "Indirizzo di broadcast" ++ ++msgid "Can only be a valid IPv4 or IPv6 address or 'default'" ++msgstr "" ++ ++msgid "Can only be a valid IPv6 address or 'default'" ++msgstr "" ++ ++msgid "Configuration" ++msgstr "Configurazione" ++ ++msgid "" ++"Could not get any data. Make sure the jsoninfo plugin is installed and " ++"allows connections from localhost." ++msgstr "" ++ ++msgid "Display" ++msgstr "Display" ++ ++msgid "Downlink" ++msgstr "Downlink" ++ ++msgid "Download Config" ++msgstr "Configurazione Download" ++ ++msgid "ETX" ++msgstr "ETX" ++ ++msgid "Enable" ++msgstr "Attiva" ++ ++msgid "" ++"Enable SmartGateway. If it is disabled, then all other SmartGateway " ++"parameters are ignored. Default is \"no\"." ++msgstr "" ++"Abitita SmartGateway. Se è disattivata, tutti gli altri parametri " ++"SmartGateway verrano ignorati. Predefinito è \"no\"." ++ ++msgid "Enable this interface." ++msgstr "Attiva questa interfaccia." ++ ++msgid "Enabled" ++msgstr "Attivato" ++ ++msgid "Expected retransmission count" ++msgstr "Expected retransmission count" ++ ++msgid "FIB metric" ++msgstr "Metrica FIB" ++ ++msgid "" ++"FIBMetric controls the metric value of the host-routes OLSRd sets. \"flat\" " ++"means that the metric value is always 2. This is the preferred value because " ++"it helps the linux kernel routing to clean up older routes. \"correct\" uses " ++"the hopcount as the metric value. \"approx\" use the hopcount as the metric " ++"value too, but does only update the hopcount if the nexthop changes too. " ++"Default is \"flat\"." ++msgstr "" ++ ++msgid "Fisheye mechanism for TCs (checked means on). Default is \"on\"" ++msgstr "" ++ ++msgid "Gateway" ++msgstr "Gateway" ++ ++msgid "General Settings" ++msgstr "Impostazioni Generali" ++ ++msgid "General settings" ++msgstr "Impostazioni Generali" ++ ++msgid "Good (2 < ETX < 4)" ++msgstr "" ++ ++msgid "Good (30 > SNR > 20)" ++msgstr "" ++ ++msgid "Green" ++msgstr "" ++ ++msgid "HNA" ++msgstr "HNA" ++ ++msgid "HNA Announcements" ++msgstr "Annuncio di HNA" ++ ++msgid "HNA interval" ++msgstr "Intervallo HNA" ++ ++msgid "HNA validity time" ++msgstr "Durata di validità HNA" ++ ++#, fuzzy ++msgid "HNA6 Announcements" ++msgstr "Annuncio di HNA" ++ ++msgid "Hello" ++msgstr "Ciao" ++ ++msgid "Hello interval" ++msgstr "Intervallo Saluto" ++ ++msgid "Hello validity time" ++msgstr "Durata validità Saluto" ++ ++msgid "Hide IPv4" ++msgstr "" ++ ++msgid "Hide IPv6" ++msgstr "" ++ ++msgid "Hna4" ++msgstr "Hna4" ++ ++msgid "Hna6" ++msgstr "Hna6" ++ ++msgid "Hops" ++msgstr "Hops" ++ ++msgid "Hostname" ++msgstr "Nome Host" ++ ++msgid "" ++"Hosts in a OLSR routed network can announce connecitivity to external " ++"networks using HNA messages." ++msgstr "" ++ ++msgid "" ++"Hosts in a OLSR routed network can announce connecitivity to external " ++"networks using HNA6 messages." ++msgstr "" ++ ++msgid "" ++"Hysteresis for link sensing (only for hopcount metric). Hysteresis adds more " ++"robustness to the link sensing but delays neighbor registration. Defaults is " ++"\"yes\"" ++msgstr "" ++"Isteresi del link (solo per la metrica hopocount). L'isteresi aggiunge " ++"robustezza alla sensibilità del link ma rallenta la registrazione dei " ++"vicini. Default è \"si\"" ++ ++msgid "IP Addresses" ++msgstr "Indirizzi IP" ++ ++msgid "" ++"IP-version to use. If 6and4 is selected then one olsrd instance is started " ++"for each protocol." ++msgstr "" ++"Versione IP da usare. Se entrambe sono selezionate una istanza di olsrd è " ++"avviata per ogni versione." ++ ++msgid "IPv4" ++msgstr "" ++ ++msgid "IPv4 broadcast" ++msgstr "" ++ ++msgid "" ++"IPv4 broadcast address for outgoing OLSR packets. One useful example would " ++"be 255.255.255.255. Default is \"0.0.0.0\", which triggers the usage of the " ++"interface broadcast IP." ++msgstr "" ++"Indirizzo di broadcast per i pacchetti OLSR. Per esempio potresti avere " ++"255.255.255.255. Default is 0.0.0.0, il che abilita l'uso dell'ip di " ++"broadcast di default." ++ ++msgid "IPv4 source" ++msgstr "IPv4 source" ++ ++msgid "" ++"IPv4 src address for outgoing OLSR packages. Default is \"0.0.0.0\", which " ++"triggers usage of the interface IP." ++msgstr "" ++"IPv4 source per i pacchetti uscenti da OLSR. Predefinito \"0.0.0.0\", il che " ++"abilita l'uso dell'IP dell'interfaccia di uscita." ++ ++msgid "IPv6" ++msgstr "IPv6" ++ ++msgid "IPv6 multicast" ++msgstr "IPv6 multicast" ++ ++msgid "" ++"IPv6 multicast address. Default is \"FF02::6D\", the manet-router linklocal " ++"multicast." ++msgstr "" ++ ++msgid "" ++"IPv6 network must be given in full notation, prefix must be in CIDR notation." ++msgstr "" ++"IPv6 network deve essere specificata in full notation, il prefisso deve " ++"essere in CIDR notation." ++ ++msgid "IPv6 source" ++msgstr "IPv6 source" ++ ++msgid "" ++"IPv6 src prefix. OLSRd will choose one of the interface IPs which matches " ++"the prefix of this parameter. Default is \"0::/0\", which triggers the usage " ++"of a not-linklocal interface IP." ++msgstr "" ++"IPv6 src prefix. OLSRd sceglierà uno degli IP dell'interfaccia che matchano " ++"questo parametro. Predefinito è \"0::/0\", il che abilita l'uso di un IP non-" ++"linklocal." ++ ++msgid "IPv6-Prefix of the uplink" ++msgstr "IPv6-Prefix dell' uplink" ++ ++msgid "" ++"If the route to the current gateway is to be changed, the ETX value of this " ++"gateway is multiplied with this value before it is compared to the new one. " ++"The parameter can be a value between 0.1 and 1.0, but should be close to 1.0 " ++"if changed.
    WARNING: This parameter should not be used together " ++"with the etx_ffeth metric!
    Defaults to \"1.0\"." ++msgstr "" ++"Se la rotta del gateway attuale viene modificata, il valore di ETX del " ++"gateway è moltiplicata per questo valore prima che sia comparato con nuovo " ++"valore.Il parametro può essere compreso tra 0.1 e 1.0, ma si consiglia un " ++"valore vicino a 1.0.
    ATTENZIONE: Questo valore non deve essere " ++"utilizzato insieme con la metrica etx_ffeth!
    Defaults a \"1.0\"." ++ ++msgid "" ++"If this Node uses NAT for connections to the internet. Default is \"yes\"." ++msgstr "" ++"Se questo nodo usa un NAT per connettersi a Internet. Predefinito è \"si\"." ++ ++msgid "Interface" ++msgstr "Interfaccia" ++ ++msgid "" ++"Interface Mode is used to prevent unnecessary packet forwarding on switched " ++"ethernet interfaces. valid Modes are \"mesh\" and \"ether\". Default is " ++"\"mesh\"." ++msgstr "" ++ ++msgid "Interfaces" ++msgstr "" ++ ++msgid "Interfaces Defaults" ++msgstr "" ++ ++msgid "Internet protocol" ++msgstr "" ++ ++msgid "" ++"Interval to poll network interfaces for configuration changes (in seconds). " ++"Default is \"2.5\"." ++msgstr "" ++ ++msgid "Invalid Value for LQMult-Value. Must be between 0.01 and 1.0." ++msgstr "" ++ ++msgid "" ++"Invalid Value for LQMult-Value. You must use a decimal number between 0.01 " ++"and 1.0 here." ++msgstr "" ++ ++msgid "Known OLSR routes" ++msgstr "" ++ ++msgid "LQ" ++msgstr "" ++ ++msgid "LQ aging" ++msgstr "" ++ ++msgid "LQ algorithm" ++msgstr "" ++ ++msgid "LQ fisheye" ++msgstr "" ++ ++msgid "LQ level" ++msgstr "" ++ ++msgid "" ++"LQMult requires two values (IP address or 'default' and multiplicator) " ++"seperated by space." ++msgstr "" ++ ++msgid "Last hop" ++msgstr "" ++ ++msgid "Legend" ++msgstr "" ++ ++msgid "Library" ++msgstr "" ++ ++msgid "Link Quality Settings" ++msgstr "" ++ ++msgid "" ++"Link quality aging factor (only for lq level 2). Tuning parameter for " ++"etx_float and etx_fpm, smaller values mean slower changes of ETX value. " ++"(allowed values are between 0.01 and 1.0)" ++msgstr "" ++ ++msgid "" ++"Link quality algorithm (only for lq level 2).
    etx_float: " ++"floating point ETX with exponential aging
    etx_fpm : same as " ++"etx_float, but with integer arithmetic
    etx_ff : ETX freifunk, an " ++"etx variant which use all OLSR traffic (instead of only hellos) for ETX " ++"calculation
    etx_ffeth: incompatible variant of etx_ff that " ++"allows ethernet links with ETX 0.1.
    Defaults to \"etx_ff\"" ++msgstr "" ++ ++msgid "" ++"Link quality level switch between hopcount and cost-based (mostly ETX) " ++"routing.
    0 = do not use link quality
    2 = use link " ++"quality for MPR selection and routing
    Default is \"2\"" ++msgstr "" ++ ++msgid "LinkQuality Multiplicator" ++msgstr "" ++ ++msgid "Links per node (average)" ++msgstr "" ++ ++msgid "Links total" ++msgstr "" ++ ++msgid "Local interface IP" ++msgstr "" ++ ++msgid "MID" ++msgstr "" ++ ++msgid "MID interval" ++msgstr "" ++ ++msgid "MID validity time" ++msgstr "" ++ ++msgid "MTU" ++msgstr "" ++ ++msgid "Main IP" ++msgstr "" ++ ++msgid "" ++"Make sure that OLSRd is running, the \"jsoninfo\" plugin is loaded, " ++"configured on port 9090 and accepts connections from \"127.0.0.1\"." ++msgstr "" ++ ++msgid "Metric" ++msgstr "" ++ ++msgid "Mode" ++msgstr "" ++ ++msgid "" ++"Multiply routes with the factor given here. Allowed values are between 0.01 " ++"and 1.0. It is only used when LQ-Level is greater than 0. Examples:
    reduce LQ to 192.168.0.1 by half: 192.168.0.1 0.5
    reduce LQ to all " ++"nodes on this interface by 20%: default 0.8" ++msgstr "" ++ ++msgid "" ++"Multiply routes with the factor given here. Allowed values are between 0.01 " ++"and 1.0. It is only used when LQ-Level is greater than 0. Examples:
    reduce LQ to fd91:662e:3c58::1 by half: fd91:662e:3c58::1 0.5
    reduce " ++"LQ to all nodes on this interface by 20%: default 0.8" ++msgstr "" ++ ++msgid "NAT threshold" ++msgstr "" ++ ++msgid "NLQ" ++msgstr "" ++ ++msgid "Neighbors" ++msgstr "" ++ ++msgid "Neighbour IP" ++msgstr "" ++ ++msgid "Neighbours" ++msgstr "" ++ ++msgid "Netmask" ++msgstr "" ++ ++msgid "Network" ++msgstr "" ++ ++msgid "Network address" ++msgstr "" ++ ++msgid "Nic changes poll interval" ++msgstr "" ++ ++msgid "Nodes" ++msgstr "" ++ ++msgid "OLSR" ++msgstr "" ++ ++msgid "OLSR - Display Options" ++msgstr "" ++ ++msgid "OLSR - HNA-Announcements" ++msgstr "" ++ ++#, fuzzy ++msgid "OLSR - HNA6-Announcements" ++msgstr "Annuncio di HNA" ++ ++msgid "OLSR - Plugins" ++msgstr "" ++ ++msgid "OLSR Daemon" ++msgstr "" ++ ++msgid "OLSR Daemon - Interface" ++msgstr "" ++ ++msgid "OLSR connections" ++msgstr "" ++ ++msgid "OLSR gateway" ++msgstr "" ++ ++msgid "OLSR node" ++msgstr "" ++ ++msgid "Orange" ++msgstr "" ++ ++msgid "Overview" ++msgstr "" ++ ++msgid "Overview of currently active OLSR host net announcements" ++msgstr "" ++ ++msgid "Overview of currently established OLSR connections" ++msgstr "" ++ ++msgid "Overview of currently known OLSR nodes" ++msgstr "" ++ ++msgid "Overview of currently known routes to other OLSR nodes" ++msgstr "" ++ ++msgid "Overview of interfaces where OLSR is running" ++msgstr "" ++ ++msgid "Overview of known multiple interface announcements" ++msgstr "" ++ ++msgid "Overview of smart gateways in this network" ++msgstr "" ++ ++msgid "Plugin configuration" ++msgstr "" ++ ++msgid "Plugins" ++msgstr "" ++ ++msgid "Polling rate for OLSR sockets in seconds. Default is 0.05." ++msgstr "" ++ ++msgid "Pollrate" ++msgstr "" ++ ++msgid "Port" ++msgstr "" ++ ++msgid "Prefix" ++msgstr "" ++ ++msgid "Red" ++msgstr "" ++ ++msgid "Resolve" ++msgstr "" ++ ++msgid "" ++"Resolve hostnames on status pages. It is generally safe to allow this, but " ++"if you use public IPs and have unstable DNS-Setup then those pages will load " ++"really slow. In this case disable it here." ++msgstr "" ++ ++msgid "Routes" ++msgstr "" ++ ++msgid "Secondary OLSR interfaces" ++msgstr "" ++ ++msgid "" ++"Sets the main IP (originator ip) of the router. This IP will NEVER change " ++"during the uptime of olsrd. Default is 0.0.0.0, which triggers usage of the " ++"IP of the first interface." ++msgstr "" ++ ++msgid "" ++"Sets the main IP (originator ip) of the router. This IP will NEVER change " ++"during the uptime of olsrd. Default is ::, which triggers usage of the IP of " ++"the first interface." ++msgstr "" ++ ++msgid "Show IPv4" ++msgstr "" ++ ++msgid "Show IPv6" ++msgstr "" ++ ++msgid "Signal Noise Ratio in dB" ++msgstr "" ++ ++msgid "SmartGW" ++msgstr "" ++ ++msgid "SmartGW announcements" ++msgstr "" ++ ++msgid "SmartGateway is not configured on this system." ++msgstr "" ++ ++msgid "Source address" ++msgstr "" ++ ++msgid "" ++"Specifies the speed of the uplink in kilobits/s. First parameter is " ++"upstream, second parameter is downstream. Default is \"128 1024\"." ++msgstr "" ++ ++msgid "Speed of the uplink" ++msgstr "" ++ ++msgid "State" ++msgstr "" ++ ++msgid "Status" ++msgstr "" ++ ++msgid "Still usable (20 > SNR > 5)" ++msgstr "" ++ ++msgid "Still usable (4 < ETX < 10)" ++msgstr "" ++ ++msgid "Success rate of packages received from the neighbour" ++msgstr "" ++ ++msgid "Success rate of packages sent to the neighbour" ++msgstr "" ++ ++msgid "TC" ++msgstr "" ++ ++msgid "TC interval" ++msgstr "" ++ ++msgid "TC validity time" ++msgstr "" ++ ++msgid "TOS value" ++msgstr "" ++ ++msgid "" ++"The OLSR daemon is an implementation of the Optimized Link State Routing " ++"protocol. As such it allows mesh routing for any network equipment. It runs " ++"on any wifi card that supports ad-hoc mode and of course on any ethernet " ++"device. Visit olsrd.org for help and " ++"documentation." ++msgstr "" ++ ++msgid "" ++"The fixed willingness to use. If not set willingness will be calculated " ++"dynamically based on battery/power status. Default is \"3\"." ++msgstr "" ++ ++msgid "The interface OLSRd should serve." ++msgstr "" ++ ++msgid "" ++"The port OLSR uses. This should usually stay at the IANA assigned port 698. " ++"It can have a value between 1 and 65535." ++msgstr "" ++ ++msgid "" ++"This can be used to signal the external IPv6 prefix of the uplink to the " ++"clients. This might allow a client to change it's local IPv6 address to use " ++"the IPv6 gateway without any kind of address translation. The maximum prefix " ++"length is 64 bits. Default is \"::/0\" (no prefix)." ++msgstr "" ++ ++msgid "Timing and Validity" ++msgstr "" ++ ++msgid "Topology" ++msgstr "" ++ ++msgid "" ++"Type of service value for the IP header of control traffic. Default is " ++"\"16\"." ++msgstr "" ++ ++msgid "Unable to connect to the OLSR daemon!" ++msgstr "Impossibile connetersi al demone OLSR!" ++ ++msgid "Uplink" ++msgstr "" ++ ++msgid "Uplink uses NAT" ++msgstr "L'uplink usa il NAT" ++ ++msgid "Use hysteresis" ++msgstr "Usa l'isteresi" ++ ++msgid "Validity Time" ++msgstr "" ++ ++msgid "Version" ++msgstr "Versione" ++ ++msgid "Very good (ETX < 2)" ++msgstr "" ++ ++msgid "Very good (SNR > 30)" ++msgstr "" ++ ++msgid "WLAN" ++msgstr "WLAN" ++ ++msgid "" ++"Warning: kmod-ipip is not installed. Without kmod-ipip SmartGateway will not " ++"work, please install it." ++msgstr "" ++ ++msgid "Weight" ++msgstr "Peso" ++ ++msgid "" ++"When multiple links exist between hosts the weight of interface is used to " ++"determine the link to use. Normally the weight is automatically calculated " ++"by olsrd based on the characteristics of the interface, but here you can " ++"specify a fixed value. Olsrd will choose links with the lowest value.
    Note: Interface weight is used only when LinkQualityLevel is set to " ++"0. For any other value of LinkQualityLevel, the interface ETX value is used " ++"instead." ++msgstr "" ++"Quando link multipli esisto tra gli hosts il peso dell'interfaccia viene " ++"usato. Normalmente il peso è automaticamente calcolato dal demone olsrd in " ++"base alle caratteristiche del link, ma qui puoi specificare un valore di " ++"contrappeso. OLSRd sceglierà il link con il più basso valore.
    Nota:Il peso dell'interfaccia è uso quando LinkQualityLevel è 0. Per ogni altro " ++"valore di LinkQualityLevel, il valore di ETX è usato." ++ ++msgid "" ++"Which kind of uplink is exported to the other mesh nodes. An uplink is " ++"detected by looking for a local HNA of 0.0.0.0/0, ::ffff:0:0/96 or 2000::/3. " ++"Default setting is \"both\"." ++msgstr "" ++"Quale tipo di uplink è mostrato agli altri nodi. Un uplink è individuato " ++"cercando un HNA del tipo 0.0.0.0/0, ::ffff:0:0/96 or 2000::/3. Default " ++"setting is \"both\"." ++ ++#, fuzzy ++msgid "" ++"Which kind of uplink is exported to the other mesh nodes. An uplink is " ++"detected by looking for a local HNA6 ::ffff:0:0/96 or 2000::/3. Default " ++"setting is \"both\"." ++msgstr "" ++"Quale tipo di uplink è mostrato agli altri nodi. Un uplink è individuato " ++"cercando un HNA del tipo 0.0.0.0/0, ::ffff:0:0/96 or 2000::/3. Default " ++"setting is \"both\"." ++ ++msgid "Willingness" ++msgstr "" ++ ++msgid "Yellow" ++msgstr "" ++ ++msgid "no" ++msgstr "" ++ ++msgid "yes" ++msgstr "" ++ ++#~ msgid "Device" ++#~ msgstr "Periferica" +diff --git a/feeds/luci/applications/luci-app-olsr/po/ja/olsr.po b/feeds/luci/applications/luci-app-olsr/po/ja/olsr.po +new file mode 100644 +index 0000000..b3f0109 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-olsr/po/ja/olsr.po +@@ -0,0 +1,800 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Report-Msgid-Bugs-To: \n" ++"POT-Creation-Date: 2009-05-19 19:36+0200\n" ++"PO-Revision-Date: 2012-11-14 14:40+0200\n" ++"Last-Translator: Kentaro \n" ++"Language-Team: LANGUAGE \n" ++"Language: ja\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=1; plural=0;\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "Active MID announcements" ++msgstr "アクティブãªMID(Multi Interface Declaration) 通知" ++ ++msgid "Active OLSR nodes" ++msgstr "アクティブãªOLSRノード" ++ ++msgid "Active host net announcements" ++msgstr "アクティブãªãƒ›ã‚¹ãƒˆãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯é€šçŸ¥" ++ ++msgid "Advanced Settings" ++msgstr "詳細設定" ++ ++msgid "Allow gateways with NAT" ++msgstr "NATを使用ã™ã‚‹ã‚²ãƒ¼ãƒˆã‚¦ã‚§ã‚¤ã‚’é¸æŠžå¯èƒ½ã«ã™ã‚‹" ++ ++msgid "Allow the selection of an outgoing ipv4 gateway with NAT" ++msgstr "NATを介ã—ã¦ãƒ‘ケットをé€ä¿¡ã™ã‚‹IPv4 ゲートウェイをé¸æŠžå¯èƒ½ã«ã—ã¾ã™" ++ ++msgid "Announce uplink" ++msgstr "通知ã™ã‚‹ã‚¢ãƒƒãƒ—リンク" ++ ++msgid "Announced network" ++msgstr "通知ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯" ++ ++msgid "Bad (ETX > 10)" ++msgstr "" ++ ++msgid "Bad (SNR < 5)" ++msgstr "" ++ ++msgid "Both values must use the dotted decimal notation." ++msgstr "ã©ã¡ã‚‰ã®å€¤ã‚‚ドット付ãå進数ã®å½¢å¼ã§å…¥åŠ›ã—ã¦ãã ã•ã„。" ++ ++msgid "Broadcast address" ++msgstr "ブロードキャストアドレス" ++ ++msgid "Can only be a valid IPv4 or IPv6 address or 'default'" ++msgstr "" ++ ++msgid "Can only be a valid IPv6 address or 'default'" ++msgstr "" ++ ++msgid "Configuration" ++msgstr "設定" ++ ++msgid "" ++"Could not get any data. Make sure the jsoninfo plugin is installed and " ++"allows connections from localhost." ++msgstr "" ++ ++msgid "Display" ++msgstr "ディスプレイ" ++ ++msgid "Downlink" ++msgstr "ダウンリンク" ++ ++msgid "Download Config" ++msgstr "設定ダウンロード" ++ ++msgid "ETX" ++msgstr "ETX" ++ ++msgid "Enable" ++msgstr "有効" ++ ++msgid "" ++"Enable SmartGateway. If it is disabled, then all other SmartGateway " ++"parameters are ignored. Default is \"no\"." ++msgstr "" ++"スマートゲートウェイを有効ã«ã—ã¾ã™ã€‚無効ã®å ´åˆã€ãã®ä»–å…¨ã¦ã®ã‚¹ãƒžãƒ¼ãƒˆã‚²ãƒ¼ãƒˆ" ++"ウェイã®è¨­å®šå€¤ã¯ç„¡è¦–ã•ã‚Œã¾ã™ã€‚標準設定ã¯\"無効\"ã§ã™ã€‚" ++ ++msgid "Enable this interface." ++msgstr "ã“ã®ã‚¤ãƒ³ã‚¿ãƒ¼ãƒ•ã‚§ãƒ¼ã‚¹ã‚’有効ã«ã—ã¾ã™ã€‚" ++ ++msgid "Enabled" ++msgstr "有効" ++ ++msgid "Expected retransmission count" ++msgstr "å†é€æ•°ã®æœŸå¾…値" ++ ++msgid "FIB metric" ++msgstr "FIB メトリック" ++ ++msgid "" ++"FIBMetric controls the metric value of the host-routes OLSRd sets. \"flat\" " ++"means that the metric value is always 2. This is the preferred value because " ++"it helps the linux kernel routing to clean up older routes. \"correct\" uses " ++"the hopcount as the metric value. \"approx\" use the hopcount as the metric " ++"value too, but does only update the hopcount if the nexthop changes too. " ++"Default is \"flat\"." ++msgstr "" ++"FIB メトリックã¯ã€OLSRdãŒè¨­å®šã™ã‚‹ãƒ›ã‚¹ãƒˆçµŒè·¯ã®ãƒ¡ãƒˆãƒªãƒƒã‚¯å€¤ã‚’コントロールã—ã¾" ++"ã™ã€‚\"flat\"ã‚’é¸æŠžã—ãŸå ´åˆã€ãƒ¡ãƒˆãƒªãƒƒã‚¯å€¤ã¯å¸¸ã«\"2\"ã¨ãªã‚Šã¾ã™ã€‚ã“ã®è¨­å®šã¯ã€" ++"Linuxカーãƒãƒ«ãŒå¤ã„経路を消去ã™ã‚‹ã®ã«æœ‰åŠ¹ãªãŸã‚ã€å¥½ã¾ã—ã„設定ã§ã™ã€‚\"correct" ++"\"ã¯ãƒ›ãƒƒãƒ—数をメトリック値ã¨ã—ã¦ä½¿ç”¨ã—ã¾ã™ã€‚\"approx\"ã‚‚åŒæ§˜ã«ãƒ›ãƒƒãƒ—数をメト" ++"リック値ã¨ã—ã¦ä½¿ç”¨ã—ã¾ã™ãŒã€æ¬¡ãƒ›ãƒƒãƒ—ãŒå¤‰æ›´ã—ãŸå ´åˆã®ã¿æ›´æ–°ã‚’è¡Œã„ã¾ã™ã€‚標準設" ++"定ã¯\"flat\"ã§ã™ã€‚" ++ ++msgid "Fisheye mechanism for TCs (checked means on). Default is \"on\"" ++msgstr "TCsã®fisheyeメカニズムを使用ã—ã¾ã™ã€‚標準設定ã¯\"有効\"ã§ã™ã€‚" ++ ++msgid "Gateway" ++msgstr "ゲートウェイ" ++ ++msgid "General Settings" ++msgstr "一般設定" ++ ++msgid "General settings" ++msgstr "一般設定" ++ ++msgid "Good (2 < ETX < 4)" ++msgstr "" ++ ++msgid "Good (30 > SNR > 20)" ++msgstr "" ++ ++msgid "Green" ++msgstr "" ++ ++msgid "HNA" ++msgstr "HNA" ++ ++msgid "HNA Announcements" ++msgstr "HNA 通知" ++ ++msgid "HNA interval" ++msgstr "HNA é€ä¿¡é–“éš”" ++ ++msgid "HNA validity time" ++msgstr "HNA 有効時間" ++ ++#, fuzzy ++msgid "HNA6 Announcements" ++msgstr "HNA 通知" ++ ++msgid "Hello" ++msgstr "Hello" ++ ++msgid "Hello interval" ++msgstr "Hello é€ä¿¡é–“éš”" ++ ++msgid "Hello validity time" ++msgstr "Hello 有効時間" ++ ++msgid "Hide IPv4" ++msgstr "" ++ ++msgid "Hide IPv6" ++msgstr "" ++ ++msgid "Hna4" ++msgstr "Hna4" ++ ++msgid "Hna6" ++msgstr "Hna6" ++ ++msgid "Hops" ++msgstr "ホップ" ++ ++msgid "Hostname" ++msgstr "ホストå" ++ ++msgid "" ++"Hosts in a OLSR routed network can announce connecitivity to external " ++"networks using HNA messages." ++msgstr "" ++ ++msgid "" ++"Hosts in a OLSR routed network can announce connecitivity to external " ++"networks using HNA6 messages." ++msgstr "" ++ ++msgid "" ++"Hysteresis for link sensing (only for hopcount metric). Hysteresis adds more " ++"robustness to the link sensing but delays neighbor registration. Defaults is " ++"\"yes\"" ++msgstr "" ++"リンク検出ã«å¯¾ã™ã‚‹ãƒ’ステリシスを設定ã—ã¾ã™ (ホップ数メトリックã®å ´åˆã®ã¿æœ‰" ++"効)。ヒステリシスã¯ãƒªãƒ³ã‚¯æ¤œå‡ºã«å¯¾ã™ã‚‹ãƒ­ãƒã‚¹ãƒˆæ€§ã‚’å‘上ã•ã›ã¾ã™ãŒã€éš£æŽ¥ãƒŽãƒ¼ãƒ‰ã®" ++"登録ãŒé…ããªã‚Šã¾ã™ã€‚標準設定ã¯\"有効\"ã§ã™ã€‚" ++ ++msgid "IP Addresses" ++msgstr "IPアドレス" ++ ++msgid "" ++"IP-version to use. If 6and4 is selected then one olsrd instance is started " ++"for each protocol." ++msgstr "" ++"使用ã™ã‚‹IPプロトコルãƒãƒ¼ã‚¸ãƒ§ãƒ³ã‚’指定ã—ã¾ã™ã€‚6and4ãŒé¸æŠžã•ã‚ŒãŸå ´åˆã€å„プロトコ" ++"ルã«å¯¾ã—ã¦1ã¤ã¥ã¤OLSRdインスタンスãŒèµ·å‹•ã—ã¾ã™ã€‚" ++ ++msgid "IPv4" ++msgstr "IPv4" ++ ++msgid "IPv4 broadcast" ++msgstr "IPv4 ブロードキャスト" ++ ++msgid "" ++"IPv4 broadcast address for outgoing OLSR packets. One useful example would " ++"be 255.255.255.255. Default is \"0.0.0.0\", which triggers the usage of the " ++"interface broadcast IP." ++msgstr "" ++"é€ä¿¡ã™ã‚‹OLSRパケットã®IPv4ブロードキャストアドレスã§ã™ã€‚便利ãªä¸€ä¾‹ã¨ã—ã¦ã€" ++"255.255.255.255ãŒæŒ™ã’られã¾ã™ã€‚標準設定ã¯\"0.0.0.0\"ã§ã‚ã‚Šã€ã‚¤ãƒ³ã‚¿ãƒ¼ãƒ•ã‚§ãƒ¼ã‚¹" ++"ã®ãƒ–ロードキャストIPを使用ã—ã¾ã™ã€‚" ++ ++msgid "IPv4 source" ++msgstr "IPv4 é€ä¿¡å…ƒ" ++ ++msgid "" ++"IPv4 src address for outgoing OLSR packages. Default is \"0.0.0.0\", which " ++"triggers usage of the interface IP." ++msgstr "" ++"é€ä¿¡ã™ã‚‹OLSRパケットã®IPv4é€ä¿¡å…ƒã‚¢ãƒ‰ãƒ¬ã‚¹ã§ã™ã€‚標準設定ã¯\"0.0.0.0\"ã§ã‚ã‚Šã€ã‚¤" ++"ンターフェースã®IPを使用ã—ã¾ã™ã€‚" ++ ++msgid "IPv6" ++msgstr "IPv6" ++ ++msgid "IPv6 multicast" ++msgstr "IPv6 マルãƒã‚­ãƒ£ã‚¹ãƒˆ" ++ ++msgid "" ++"IPv6 multicast address. Default is \"FF02::6D\", the manet-router linklocal " ++"multicast." ++msgstr "" ++"IPv6 マルãƒã‚­ãƒ£ã‚¹ãƒˆã‚¢ãƒ‰ãƒ¬ã‚¹ã‚’設定ã—ã¾ã™ã€‚標準ã¯MANETルーターãŒä½¿ç”¨ã™ã‚‹ãƒªãƒ³ã‚¯" ++"ローカル・マルãƒã‚­ãƒ£ã‚¹ãƒˆã§ã‚ã‚‹\"FF02::6D\"ã§ã™ã€‚" ++ ++msgid "" ++"IPv6 network must be given in full notation, prefix must be in CIDR notation." ++msgstr "" ++"IPv6 ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ã‚¢ãƒ‰ãƒ¬ã‚¹ã¯çœç•¥ã›ãšã«å…¥åŠ›ã—ã¦ãã ã•ã„。プレフィクスã¯CIDRå½¢å¼" ++"ã§å…¥åŠ›ã—ã¦ãã ã•ã„。" ++ ++msgid "IPv6 source" ++msgstr "IPv6 é€ä¿¡å…ƒ" ++ ++msgid "" ++"IPv6 src prefix. OLSRd will choose one of the interface IPs which matches " ++"the prefix of this parameter. Default is \"0::/0\", which triggers the usage " ++"of a not-linklocal interface IP." ++msgstr "" ++"IPv6é€ä¿¡å…ƒãƒ—レフィクスを設定ã—ã¾ã™ã€‚OLSRdã¯ã‚¤ãƒ³ã‚¿ãƒ¼ãƒ•ã‚§ãƒ¼ã‚¹ã®ä¸­ã‹ã‚‰ã€ã“ã®ãƒ—レ" ++"フィクス値ã«ä¸€è‡´ã™ã‚‹ã‚‚ã®ã‚’é¸æŠžã—ã¾ã™ã€‚標準設定ã¯\"0::/0\"ã§ã‚ã‚Šã€ãƒªãƒ³ã‚¯ãƒ­ãƒ¼ã‚«" ++"ルIPã§ãªã„インターフェースIPを使用ã—ã¾ã™ã€‚" ++ ++msgid "IPv6-Prefix of the uplink" ++msgstr "アップリンクIPv6 プレフィクス" ++ ++msgid "" ++"If the route to the current gateway is to be changed, the ETX value of this " ++"gateway is multiplied with this value before it is compared to the new one. " ++"The parameter can be a value between 0.1 and 1.0, but should be close to 1.0 " ++"if changed.
    WARNING: This parameter should not be used together " ++"with the etx_ffeth metric!
    Defaults to \"1.0\"." ++msgstr "" ++"ç¾åœ¨ã®ã‚²ãƒ¼ãƒˆã‚¦ã‚§ã‚¤ã¸ã®çµŒè·¯ãŒå¤‰ã‚ã‚‹å ´åˆã€ã“ã®ã‚²ãƒ¼ãƒˆã‚¦ã‚§ã‚¤ã®ETX値ã¯æ–°ã—ã„値ã¨æ¯”" ++"較ã•ã‚Œã‚‹å‰ã«ã€ã“ã®ãƒ‘ラメータã®å€¤ã¨ä¹—ç®—ã•ã‚Œã¾ã™ã€‚パラメータã¯0.1ã‹ã‚‰1.0ã®é–“ã§" ++"設定å¯èƒ½ã§ã™ã€‚ãŸã ã—ã€å¤‰æ›´ã™ã‚‹å ´åˆã€1.0ã«è¿‘ã„値を設定ã™ã‚‹äº‹ã‚’ãŠè–¦ã‚ã—ã¾ã™ã€‚" ++"
    警告:ã“ã®ãƒ‘ラメータã¯etx_ffeth メトリックã¨åŒæ™‚ã«ä½¿ç”¨ã—ãªã„ã§ã" ++"ã ã•ã„!
    標準設定ã¯\"1.0\"ã§ã™ã€‚" ++ ++msgid "" ++"If this Node uses NAT for connections to the internet. Default is \"yes\"." ++msgstr "" ++"ã“ã®ãƒŽãƒ¼ãƒ‰ãŒNATを使用ã—ã¦ã‚¤ãƒ³ã‚¿ãƒ¼ãƒãƒƒãƒˆã«æŽ¥ç¶šã™ã‚‹å ´åˆã€æœ‰åŠ¹ã«ã—ã¦ãã ã•ã„。標" ++"準設定ã¯\"有効\"ã§ã™ã€‚" ++ ++msgid "Interface" ++msgstr "インターフェース" ++ ++msgid "" ++"Interface Mode is used to prevent unnecessary packet forwarding on switched " ++"ethernet interfaces. valid Modes are \"mesh\" and \"ether\". Default is " ++"\"mesh\"." ++msgstr "" ++"インターフェースモードã¯ã€ã‚¹ã‚¤ãƒƒãƒä¸Šã®ã‚¤ãƒ¼ã‚µãƒãƒƒãƒˆã‚¤ãƒ³ã‚¿ãƒ¼ãƒ•ã‚§ãƒ¼ã‚¹ã«ä¸å¿…è¦ãª" ++"パケットã®é€ä¿¡ã‚’抑制ã™ã‚‹ãŸã‚ã«ä½¿ç”¨ã—ã¾ã™ã€‚有効ãªãƒ¢ãƒ¼ãƒ‰ã¯\"mesh\"åŠã³\"ether" ++"\"ã§ã™ã€‚標準設定ã¯\"mesh\"ã§ã™ã€‚" ++ ++msgid "Interfaces" ++msgstr "インターフェース" ++ ++msgid "Interfaces Defaults" ++msgstr "インターフェース デフォルト設定" ++ ++msgid "Internet protocol" ++msgstr "インターãƒãƒƒãƒˆãƒ—ロトコル" ++ ++msgid "" ++"Interval to poll network interfaces for configuration changes (in seconds). " ++"Default is \"2.5\"." ++msgstr "" ++"ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ãƒ»ã‚¤ãƒ³ã‚¿ãƒ¼ãƒ•ã‚§ãƒ¼ã‚¹ã®è¨­å®šãŒå¤‰æ›´ã•ã‚ŒãŸã‹ã‚’ãƒã‚§ãƒƒã‚¯ã™ã‚‹ãƒãƒ¼ãƒªãƒ³ã‚°é–“" ++"隔を秒å˜ä½ã§è¨­å®šã—ã¾ã™ã€‚標準設定ã¯\"2.5\"ã§ã™ã€‚" ++ ++msgid "Invalid Value for LQMult-Value. Must be between 0.01 and 1.0." ++msgstr "" ++ ++msgid "" ++"Invalid Value for LQMult-Value. You must use a decimal number between 0.01 " ++"and 1.0 here." ++msgstr "" ++ ++msgid "Known OLSR routes" ++msgstr "OLSR ルーティング" ++ ++msgid "LQ" ++msgstr "" ++ ++msgid "LQ aging" ++msgstr "LQ エイジング" ++ ++msgid "LQ algorithm" ++msgstr "LQ アルゴリズム" ++ ++msgid "LQ fisheye" ++msgstr "LQ fisheye" ++ ++msgid "LQ level" ++msgstr "LQ レベル" ++ ++msgid "" ++"LQMult requires two values (IP address or 'default' and multiplicator) " ++"seperated by space." ++msgstr "" ++ ++msgid "Last hop" ++msgstr "最終ホップ" ++ ++msgid "Legend" ++msgstr "凡例" ++ ++msgid "Library" ++msgstr "ライブラリ" ++ ++msgid "Link Quality Settings" ++msgstr "リンクå“質 (LQ) 設定" ++ ++msgid "" ++"Link quality aging factor (only for lq level 2). Tuning parameter for " ++"etx_float and etx_fpm, smaller values mean slower changes of ETX value. " ++"(allowed values are between 0.01 and 1.0)" ++msgstr "" ++"リンクå“質 (LQ) ã®ã‚¨ã‚¤ã‚¸ãƒ³ã‚°è¦ç´ ã®è¨­å®šã‚’è¡Œã„ã¾ã™ (LQ レベルãŒ2ã®å ´åˆã®ã¿æœ‰" ++"効)。etx_floatåŠã³etx_fpmã®å€¤ã®èª¿æ•´ã‚’è¡Œã„ã¾ã™ã€‚値ãŒå°ã•ããªã‚‹ã¨ã€ETX値ã®å¤‰åŒ–" ++"ãŒé…ããªã‚Šã¾ã™ã€‚設定å¯èƒ½ãªå€¤ã¯0.01-1.0ã§ã™ã€‚" ++ ++msgid "" ++"Link quality algorithm (only for lq level 2).
    etx_float: " ++"floating point ETX with exponential aging
    etx_fpm : same as " ++"etx_float, but with integer arithmetic
    etx_ff : ETX freifunk, an " ++"etx variant which use all OLSR traffic (instead of only hellos) for ETX " ++"calculation
    etx_ffeth: incompatible variant of etx_ff that " ++"allows ethernet links with ETX 0.1.
    Defaults to \"etx_ff\"" ++msgstr "" ++"リンクå“質 (LQ) アルゴリズムを設定ã—ã¾ã™ (LQ レベルãŒ2ã®å ´åˆã®ã¿æœ‰åŠ¹)。
    etx_float: 浮動å°æ•°ç‚¹æ¼”算+指数関数エイジング
    etx_fpm : " ++"etx_floatã¨åŒæ§˜ã€ãŸã ã—整数値演算を行ã„ã¾ã™
    etx_ff : ETX " ++"freifunk, ETXã®å¤‰å½¢ç‰ˆã§ã‚ã‚Šã€ETX算出ã®ãŸã‚ã«Helloパケットã ã‘ã§ãªãå…¨ã¦ã®OLSR" ++"トラフィックを使用ã—ã¾ã™
    etx_ffeth: etx_ffã¨äº’æ›æ€§ã®ãªã„変形版ã§" ++"ã™ã€‚イーサãƒãƒƒãƒˆã®ãƒªãƒ³ã‚¯ã«ETX 0.1を設定ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™
    標準設定ã¯" ++"\"etx_ff\"ã§ã™ã€‚" ++ ++msgid "" ++"Link quality level switch between hopcount and cost-based (mostly ETX) " ++"routing.
    0 = do not use link quality
    2 = use link " ++"quality for MPR selection and routing
    Default is \"2\"" ++msgstr "" ++"リンクå“質(LQ) レベルã®è¨­å®šã§ã¯ã€ãƒ›ãƒƒãƒ—数ベースã¾ãŸã¯ã‚³ã‚¹ãƒˆãƒ™ãƒ¼ã‚¹(ETX) ã®ã©ã¡" ++"らã‹ã«ãƒ«ãƒ¼ãƒ†ã‚£ãƒ³ã‚°æ–¹æ³•ã‚’切り替ãˆã¾ã™ã€‚
    0 = リンクå“質を加味ã—ãªã„" ++"
    2 = MPR集åˆåŠã³ãƒ«ãƒ¼ãƒ†ã‚£ãƒ³ã‚°ã«ãƒªãƒ³ã‚¯å“質を加味ã™ã‚‹
    標準設定" ++"ã¯\"2\"ã§ã™ã€‚" ++ ++msgid "LinkQuality Multiplicator" ++msgstr "リンクå“質 (LQ) マルãƒãƒ—リケーター" ++ ++msgid "Links per node (average)" ++msgstr "ノードã‚ãŸã‚Šã®ãƒªãƒ³ã‚¯æ•° (å¹³å‡)" ++ ++msgid "Links total" ++msgstr "リンク数ã®åˆè¨ˆ" ++ ++msgid "Local interface IP" ++msgstr "ローカルインターフェース IP" ++ ++msgid "MID" ++msgstr "MID" ++ ++msgid "MID interval" ++msgstr "MID é€ä¿¡é–“éš”" ++ ++msgid "MID validity time" ++msgstr "MID 有効時間" ++ ++msgid "MTU" ++msgstr "MTU" ++ ++msgid "Main IP" ++msgstr "メインIP" ++ ++msgid "" ++"Make sure that OLSRd is running, the \"jsoninfo\" plugin is loaded, " ++"configured on port 9090 and accepts connections from \"127.0.0.1\"." ++msgstr "" ++ ++msgid "Metric" ++msgstr "メトリック" ++ ++msgid "Mode" ++msgstr "モード" ++ ++msgid "" ++"Multiply routes with the factor given here. Allowed values are between 0.01 " ++"and 1.0. It is only used when LQ-Level is greater than 0. Examples:
    reduce LQ to 192.168.0.1 by half: 192.168.0.1 0.5
    reduce LQ to all " ++"nodes on this interface by 20%: default 0.8" ++msgstr "" ++ ++#, fuzzy ++msgid "" ++"Multiply routes with the factor given here. Allowed values are between 0.01 " ++"and 1.0. It is only used when LQ-Level is greater than 0. Examples:
    reduce LQ to fd91:662e:3c58::1 by half: fd91:662e:3c58::1 0.5
    reduce " ++"LQ to all nodes on this interface by 20%: default 0.8" ++msgstr "" ++"経路ã®LQã¨è¨­å®šå€¤ã®ä¹—ç®—ã‚’è¡Œã„ã¾ã™ã€‚設定å¯èƒ½ãªå€¤ã¯0.01-1ã§ã™ã€‚ã“ã®è¨­å®šã¯LQ レベ" ++"ルãŒ0以上ã®å ´åˆã®ã¿è¨­å®šå¯èƒ½ã§ã™ã€‚
    例:192.168.0.1ã¸ã®LQã‚’åŠåˆ†ã«ã™ã‚‹å ´åˆ: " ++"192.168.0.1 0.5
    ã“ã®ã‚¤ãƒ³ã‚¿ãƒ¼ãƒ•ã‚§ãƒ¼ã‚¹ã‹ã‚‰å…¨ã¦ã®ãƒŽãƒ¼ãƒ‰ã¸å¯¾ã—ã¦20%減らã™å ´" ++"åˆ: default 0.8" ++ ++msgid "NAT threshold" ++msgstr "NAT ã—ãã„値" ++ ++msgid "NLQ" ++msgstr "NLQ" ++ ++msgid "Neighbors" ++msgstr "隣接ノード" ++ ++msgid "Neighbour IP" ++msgstr "隣接ノード IP" ++ ++msgid "Neighbours" ++msgstr "隣接ノード" ++ ++msgid "Netmask" ++msgstr "ãƒãƒƒãƒˆãƒžã‚¹ã‚¯" ++ ++msgid "Network" ++msgstr "ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯" ++ ++msgid "Network address" ++msgstr "ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ã‚¢ãƒ‰ãƒ¬ã‚¹" ++ ++msgid "Nic changes poll interval" ++msgstr "NIC変更ãƒãƒ¼ãƒªãƒ³ã‚°é–“éš”" ++ ++msgid "Nodes" ++msgstr "ノード" ++ ++msgid "OLSR" ++msgstr "OLSR" ++ ++msgid "OLSR - Display Options" ++msgstr "OLSR - 表示オプション" ++ ++msgid "OLSR - HNA-Announcements" ++msgstr "OLSR - HNA (Host and Network Association) 通知" ++ ++#, fuzzy ++msgid "OLSR - HNA6-Announcements" ++msgstr "OLSR - HNA (Host and Network Association) 通知" ++ ++msgid "OLSR - Plugins" ++msgstr "OLSR - プラグイン" ++ ++msgid "OLSR Daemon" ++msgstr "OLSR デーモン" ++ ++msgid "OLSR Daemon - Interface" ++msgstr "OLSR デーモン - インターフェース" ++ ++msgid "OLSR connections" ++msgstr "OLSR コãƒã‚¯ã‚·ãƒ§ãƒ³" ++ ++msgid "OLSR gateway" ++msgstr "OLSR ゲートウェイ" ++ ++msgid "OLSR node" ++msgstr "OLSR ノード" ++ ++msgid "Orange" ++msgstr "" ++ ++msgid "Overview" ++msgstr "概è¦" ++ ++msgid "Overview of currently active OLSR host net announcements" ++msgstr "ç¾åœ¨ã‚¢ã‚¯ãƒ†ã‚£ãƒ–ãªOLSR HNA 一覧" ++ ++msgid "Overview of currently established OLSR connections" ++msgstr "ç¾åœ¨ç¢ºç«‹æ¸ˆã®OLSR接続一覧" ++ ++msgid "Overview of currently known OLSR nodes" ++msgstr "ç¾åœ¨æ—¢çŸ¥ã®OLSRノードã®ä¸€è¦§" ++ ++msgid "Overview of currently known routes to other OLSR nodes" ++msgstr "ç¾åœ¨ã®ãã®ä»–ã®OLSRノードã¸ã®çµŒè·¯ä¸€è¦§" ++ ++msgid "Overview of interfaces where OLSR is running" ++msgstr "OLSR稼åƒä¸­ã®ã‚¤ãƒ³ã‚¿ãƒ¼ãƒ•ã‚§ãƒ¼ã‚¹ä¸€è¦§" ++ ++msgid "Overview of known multiple interface announcements" ++msgstr "通知ã•ã‚Œã¦ã„るマルãƒãƒ»ã‚¤ãƒ³ã‚¿ãƒ¼ãƒ•ã‚§ãƒ¼ã‚¹ã®ä¸€è¦§" ++ ++msgid "Overview of smart gateways in this network" ++msgstr "ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯å†…ã®ã‚¹ãƒžãƒ¼ãƒˆãƒ»ã‚²ãƒ¼ãƒˆã‚¦ã‚§ã‚¤ä¸€è¦§" ++ ++msgid "Plugin configuration" ++msgstr "プラグイン設定" ++ ++msgid "Plugins" ++msgstr "プラグイン" ++ ++msgid "Polling rate for OLSR sockets in seconds. Default is 0.05." ++msgstr "OLSRソケットã®ãƒãƒ¼ãƒªãƒ³ã‚°é–“隔を秒å˜ä½ã§è¨­å®šã—ã¾ã™ã€‚標準ã¯0.05ã§ã™ã€‚" ++ ++msgid "Pollrate" ++msgstr "ãƒãƒ¼ãƒªãƒ³ã‚°é–“éš”" ++ ++msgid "Port" ++msgstr "ãƒãƒ¼ãƒˆ" ++ ++msgid "Prefix" ++msgstr "プレフィックス" ++ ++msgid "Red" ++msgstr "" ++ ++msgid "Resolve" ++msgstr "åå‰è§£æ±º" ++ ++msgid "" ++"Resolve hostnames on status pages. It is generally safe to allow this, but " ++"if you use public IPs and have unstable DNS-Setup then those pages will load " ++"really slow. In this case disable it here." ++msgstr "" ++"ステータス・ページã§ãƒ›ã‚¹ãƒˆåã®åå‰è§£æ±ºã‚’è¡Œã„ã¾ã™ã€‚一般的ã«ã¯æœ¬æ©Ÿèƒ½ã‚’使用ã—ã¦" ++"ã‚‚å•é¡ŒãŒèµ·ã“ã‚‹ã“ã¨ã¯ã‚ã‚Šã¾ã›ã‚“ãŒã€ã‚‚ã—ã‚ãªãŸãŒãƒ‘ブリックIPã‚„ä¸å®‰å®šãªDNS設定を" ++"使用ã—ã¦ã„ã‚‹å ´åˆã€ãƒšãƒ¼ã‚¸ã®èª­ã¿è¾¼ã¿é€Ÿåº¦ãŒæ¥µç«¯ã«é…ããªã‚Šã¾ã™ã€‚ãã®å ´åˆã¯ã“ã®æ©Ÿ" ++"能を無効ã«ã—ã¦ãã ã•ã„。" ++ ++msgid "Routes" ++msgstr "経路" ++ ++msgid "Secondary OLSR interfaces" ++msgstr "セカンダリOLSR インターフェース" ++ ++msgid "" ++"Sets the main IP (originator ip) of the router. This IP will NEVER change " ++"during the uptime of olsrd. Default is 0.0.0.0, which triggers usage of the " ++"IP of the first interface." ++msgstr "" ++"ルーターã®ãƒ¡ã‚¤ãƒ³IP (発信元IP)を設定ã—ã¦ãã ã•ã„。ã“ã®IPã¯ã€OLSRdã®ç¨¼åƒä¸­ã¯æ±º" ++"ã—ã¦å¤‰æ›´ã—ã¾ã›ã‚“。標準設定ã¯0.0.0.0ã§ã‚ã‚Šã€ãƒ—ライマリ・インターフェースã®IPã‚’" ++"自動的ã«ä½¿ç”¨ã—ã¾ã™ã€‚" ++ ++#, fuzzy ++msgid "" ++"Sets the main IP (originator ip) of the router. This IP will NEVER change " ++"during the uptime of olsrd. Default is ::, which triggers usage of the IP of " ++"the first interface." ++msgstr "" ++"ルーターã®ãƒ¡ã‚¤ãƒ³IP (発信元IP)を設定ã—ã¦ãã ã•ã„。ã“ã®IPã¯ã€OLSRdã®ç¨¼åƒä¸­ã¯æ±º" ++"ã—ã¦å¤‰æ›´ã—ã¾ã›ã‚“。標準設定ã¯0.0.0.0ã§ã‚ã‚Šã€ãƒ—ライマリ・インターフェースã®IPã‚’" ++"自動的ã«ä½¿ç”¨ã—ã¾ã™ã€‚" ++ ++msgid "Show IPv4" ++msgstr "" ++ ++msgid "Show IPv6" ++msgstr "" ++ ++msgid "Signal Noise Ratio in dB" ++msgstr "" ++ ++msgid "SmartGW" ++msgstr "SmartGW" ++ ++msgid "SmartGW announcements" ++msgstr "SmartGW 通知" ++ ++msgid "SmartGateway is not configured on this system." ++msgstr "スマート・ゲートウェイ(SmartGW)ã¯è¨­å®šã•ã‚Œã¦ã„ã¾ã›ã‚“。" ++ ++msgid "Source address" ++msgstr "é€ä¿¡å…ƒã‚¢ãƒ‰ãƒ¬ã‚¹" ++ ++msgid "" ++"Specifies the speed of the uplink in kilobits/s. First parameter is " ++"upstream, second parameter is downstream. Default is \"128 1024\"." ++msgstr "" ++"アップリンク速度をキロビット/秒ã§è¨­å®šã—ã¦ãã ã•ã„。1ã¤ç›®ã®ãƒ‘ラメータã¯ä¸Šã‚Šã€2" ++"ã¤ç›®ã®ãƒ‘ラメータã¯ä¸‹ã‚Šã®ã‚¹ãƒˆãƒªãƒ¼ãƒ ã§ã™ã€‚標準ã¯\"128 1024\"ã§ã™ã€‚" ++ ++msgid "Speed of the uplink" ++msgstr "アップリンク速度" ++ ++msgid "State" ++msgstr "状態" ++ ++msgid "Status" ++msgstr "ステータス" ++ ++msgid "Still usable (20 > SNR > 5)" ++msgstr "" ++ ++msgid "Still usable (4 < ETX < 10)" ++msgstr "" ++ ++msgid "Success rate of packages received from the neighbour" ++msgstr "隣接ノードã‹ã‚‰å—ä¿¡ã—ãŸãƒ‘ケットã®å—ä¿¡æˆåŠŸçŽ‡" ++ ++msgid "Success rate of packages sent to the neighbour" ++msgstr "隣接ノードã¸é€ä¿¡ã—ãŸãƒ‘ケットã®é€ä¿¡æˆåŠŸçŽ‡" ++ ++msgid "TC" ++msgstr "TC" ++ ++msgid "TC interval" ++msgstr "TC é€ä¿¡é–“éš”" ++ ++msgid "TC validity time" ++msgstr "TC 有効時間" ++ ++msgid "TOS value" ++msgstr "TOS値" ++ ++msgid "" ++"The OLSR daemon is an implementation of the Optimized Link State Routing " ++"protocol. As such it allows mesh routing for any network equipment. It runs " ++"on any wifi card that supports ad-hoc mode and of course on any ethernet " ++"device. Visit olsrd.org for help and " ++"documentation." ++msgstr "" ++"OLSRデーモンã¯ã€Optimized Link State Routingプロコトルを実装ã—ãŸã‚µãƒ¼ãƒ“スã§" ++"ã™ã€‚OLSRã¯ã©ã®ã‚ˆã†ãªãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ç’°å¢ƒã§ã‚‚メッシュルーティングを実ç¾ã—ã¾ã™ã€‚" ++"OLSRã¯ã‚¢ãƒ‰ãƒ›ãƒƒã‚¯ãƒ»ãƒ¢ãƒ¼ãƒ‰ã‚’サãƒãƒ¼ãƒˆã—ãŸå…¨ã¦ã®ç„¡ç·šLANカードをサãƒãƒ¼ãƒˆã—ã€ã‚‚ã¡ã‚" ++"ã‚“å…¨ã¦ã®ã‚¤ãƒ¼ã‚µãƒãƒƒãƒˆãƒ‡ãƒã‚¤ã‚¹ã§ã‚‚使用å¯èƒ½ã§ã™ã€‚olsrd.orgã«ã‚¢ã‚¯ã‚»ã‚¹ã—ã¦ã€ãƒ˜ãƒ«ãƒ—åŠã³ãƒ‰ã‚­ãƒ¥ãƒ¡ãƒ³ãƒˆã‚’å‚ç…§ã—ã¦ãã ã•ã„。" ++ ++msgid "" ++"The fixed willingness to use. If not set willingness will be calculated " ++"dynamically based on battery/power status. Default is \"3\"." ++msgstr "" ++"willingnessを固定ã™ã‚‹å ´åˆã«ä½¿ç”¨ã—ã¾ã™ã€‚willingnessãŒè¨­å®šã•ã‚Œã¦ã„ãªã„å ´åˆã€" ++"ãƒãƒƒãƒ†ãƒªã‚„é›»æºã®ã‚¹ãƒ†ãƒ¼ã‚¿ã‚¹ã«ã‚ˆã£ã¦å‹•çš„ã«è¨ˆç®—ã•ã‚Œã¾ã™ã€‚標準ã¯\"3\"ã§ã™ã€‚" ++ ++msgid "The interface OLSRd should serve." ++msgstr "OLSRdãŒä½¿ç”¨ã™ã‚‹ã‚¤ãƒ³ã‚¿ãƒ¼ãƒ•ã‚§ãƒ¼ã‚¹ã§ã™ã€‚" ++ ++msgid "" ++"The port OLSR uses. This should usually stay at the IANA assigned port 698. " ++"It can have a value between 1 and 65535." ++msgstr "" ++"OLSRãŒä½¿ç”¨ã™ã‚‹ãƒãƒ¼ãƒˆç•ªå·ã§ã™ã€‚通常ã€ã“ã®ãƒãƒ¼ãƒˆç•ªå·ã¯IANAãŒã‚¢ã‚µã‚¤ãƒ³ã—ãŸ698番ã§" ++"ã‚ã‚‹ã¹ãã§ã™ã€‚1-65535ã®é–“ã§è¨­å®šå¯èƒ½ã§ã™ã€‚" ++ ++msgid "" ++"This can be used to signal the external IPv6 prefix of the uplink to the " ++"clients. This might allow a client to change it's local IPv6 address to use " ++"the IPv6 gateway without any kind of address translation. The maximum prefix " ++"length is 64 bits. Default is \"::/0\" (no prefix)." ++msgstr "" ++ ++msgid "Timing and Validity" ++msgstr "é€ä¿¡é–“éš”åŠã³æœ‰åŠ¹æ™‚é–“" ++ ++msgid "Topology" ++msgstr "トãƒãƒ­ã‚¸ãƒ¼" ++ ++msgid "" ++"Type of service value for the IP header of control traffic. Default is " ++"\"16\"." ++msgstr "" ++"OLSRコントロールパケットã«ãŠã‘ã‚‹ã€IPヘッダã®TOS (Type Of Service) 値を設定ã—" ++"ã¾ã™ã€‚標準設定ã¯\"16\"ã§ã™ã€‚" ++ ++msgid "Unable to connect to the OLSR daemon!" ++msgstr "OLSRデーモンã«æŽ¥ç¶šã§ãã¾ã›ã‚“ï¼" ++ ++msgid "Uplink" ++msgstr "アップリンク" ++ ++msgid "Uplink uses NAT" ++msgstr "NATを使用ã—ã¦ä¸Šä½ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ã«æŽ¥ç¶šã™ã‚‹" ++ ++msgid "Use hysteresis" ++msgstr "ヒステリシスを使用ã™ã‚‹" ++ ++msgid "Validity Time" ++msgstr "" ++ ++msgid "Version" ++msgstr "ãƒãƒ¼ã‚¸ãƒ§ãƒ³" ++ ++msgid "Very good (ETX < 2)" ++msgstr "" ++ ++msgid "Very good (SNR > 30)" ++msgstr "" ++ ++msgid "WLAN" ++msgstr "WLAN" ++ ++msgid "" ++"Warning: kmod-ipip is not installed. Without kmod-ipip SmartGateway will not " ++"work, please install it." ++msgstr "" ++"警告: kmod-ipipãŒã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«ã•ã‚Œã¦ã„ã¾ã›ã‚“。スマートゲートウェイã¯kmod-ipip" ++"ãªã—ã§ã¯å‹•ä½œã—ã¾ã›ã‚“。ã¾ãšåˆã‚ã«ã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«ã‚’è¡Œãªã£ã¦ãã ã•ã„。" ++ ++msgid "Weight" ++msgstr "Weight" ++ ++msgid "" ++"When multiple links exist between hosts the weight of interface is used to " ++"determine the link to use. Normally the weight is automatically calculated " ++"by olsrd based on the characteristics of the interface, but here you can " ++"specify a fixed value. Olsrd will choose links with the lowest value.
    Note: Interface weight is used only when LinkQualityLevel is set to " ++"0. For any other value of LinkQualityLevel, the interface ETX value is used " ++"instead." ++msgstr "" ++"ホスト間ã«ãŠã„ã¦è¤‡æ•°ã®çµŒè·¯ãŒå­˜åœ¨ã™ã‚‹å ´åˆã«ã€ã©ã¡ã‚‰ã®ãƒªãƒ³ã‚¯ã‚’使用ã™ã‚‹ã‹ã®æ±ºå®š" ++"ã‚’è¡Œã†ãŸã‚ã«ã€ã‚¤ãƒ³ã‚¿ãƒ¼ãƒ•ã‚§ãƒ¼ã‚¹ã®é‡ã¿ä»˜ã‘ã‚’è¡Œã„ã¾ã™ã€‚通常ã€weightã¯ã‚¤ãƒ³ã‚¿ãƒ¼" ++"フェースã®ç‰¹æ€§ã‚’基ã«ã€OLSRdãŒè‡ªå‹•çš„ã«è¨ˆç®—ã‚’è¡Œã„ã¾ã™ãŒã€å›ºå®šå€¤ã‚’設定ã™ã‚‹ã“ã¨ã‚‚" ++"å¯èƒ½ã§ã™ã€‚OLSRdã¯æœ€ã‚‚低ã„値ã®ãƒªãƒ³ã‚¯ã‚’é¸æŠžã—ã¾ã™ã€‚
    注æ„:インター" ++"フェースã®é‡ã¿ä»˜ã‘ã¯ã€LQ レベルãŒ0ã®å ´åˆã®ã¿ã€è¨­å®šå¯èƒ½ã§ã™ã€‚LQ レベルãŒ0以外" ++"ã®å€¤ã®å ´åˆã€ã‚¤ãƒ³ã‚¿ãƒ¼ãƒ•ã‚§ãƒ¼ã‚¹ ETX値ãŒä»£ã‚ã‚Šã«ä½¿ç”¨ã•ã‚Œã¾ã™ã€‚" ++ ++msgid "" ++"Which kind of uplink is exported to the other mesh nodes. An uplink is " ++"detected by looking for a local HNA of 0.0.0.0/0, ::ffff:0:0/96 or 2000::/3. " ++"Default setting is \"both\"." ++msgstr "" ++"ã©ã®ã‚¢ãƒƒãƒ—リンクを他ã®ãƒ¡ãƒƒã‚·ãƒ¥ãƒŽãƒ¼ãƒ‰ã¸é€šçŸ¥ã™ã‚‹ã‹ã‚’設定ã—ã¾ã™ã€‚アップリンクã¯" ++"ローカルã®HNAã§ã‚ã‚‹0.0.0.0/0ã€::ffff:0:0/96ã€2000::/3を探索ã™ã‚‹ã“ã¨ã§æ¤œå‡ºã—ã¾" ++"ã™ã€‚標準設定ã¯ã€\"both\"ã§ã™ã€‚" ++ ++#, fuzzy ++msgid "" ++"Which kind of uplink is exported to the other mesh nodes. An uplink is " ++"detected by looking for a local HNA6 ::ffff:0:0/96 or 2000::/3. Default " ++"setting is \"both\"." ++msgstr "" ++"ã©ã®ã‚¢ãƒƒãƒ—リンクを他ã®ãƒ¡ãƒƒã‚·ãƒ¥ãƒŽãƒ¼ãƒ‰ã¸é€šçŸ¥ã™ã‚‹ã‹ã‚’設定ã—ã¾ã™ã€‚アップリンクã¯" ++"ローカルã®HNAã§ã‚ã‚‹0.0.0.0/0ã€::ffff:0:0/96ã€2000::/3を探索ã™ã‚‹ã“ã¨ã§æ¤œå‡ºã—ã¾" ++"ã™ã€‚標準設定ã¯ã€\"both\"ã§ã™ã€‚" ++ ++msgid "Willingness" ++msgstr "Willingness" ++ ++msgid "Yellow" ++msgstr "" ++ ++msgid "no" ++msgstr "" ++ ++msgid "yes" ++msgstr "" ++ ++#~ msgid "Device" ++#~ msgstr "デãƒã‚¤ã‚¹" ++ ++#~ msgid "" ++#~ "Make sure that OLSRd is running, the \"txtinfo\" plugin is loaded, " ++#~ "configured on port 2006 and accepts connections from \"127.0.0.1\"." ++#~ msgstr "" ++#~ "OLSRdãŒç¨¼åƒä¸­ã§ã‚ã‚‹ã“ã¨ã€\"txinfo\"プラグインãŒãƒ­ãƒ¼ãƒ‰ã•ã‚Œã¦ã„ã‚‹ã“ã¨ã€ãƒãƒ¼" ++#~ "ト2006番ãŒè¨­å®šã•ã‚Œã¦ã„ã‚‹ã“ã¨ã€\"127.0.0.1\"ã‹ã‚‰ã®æŽ¥ç¶šãŒè¨±å¯ã•ã‚Œã¦ã„ã‚‹ã“ã¨" ++#~ "を確èªã—ã¦ãã ã•ã„。" +diff --git a/feeds/luci/applications/luci-app-olsr/po/ms/olsr.po b/feeds/luci/applications/luci-app-olsr/po/ms/olsr.po +new file mode 100644 +index 0000000..c0edce1 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-olsr/po/ms/olsr.po +@@ -0,0 +1,686 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Last-Translator: Automatically generated\n" ++"Language-Team: none\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++ ++msgid "Active MID announcements" ++msgstr "" ++ ++msgid "Active OLSR nodes" ++msgstr "" ++ ++msgid "Active host net announcements" ++msgstr "" ++ ++msgid "Advanced Settings" ++msgstr "" ++ ++msgid "Allow gateways with NAT" ++msgstr "" ++ ++msgid "Allow the selection of an outgoing ipv4 gateway with NAT" ++msgstr "" ++ ++msgid "Announce uplink" ++msgstr "" ++ ++msgid "Announced network" ++msgstr "" ++ ++msgid "Bad (ETX > 10)" ++msgstr "" ++ ++msgid "Bad (SNR < 5)" ++msgstr "" ++ ++msgid "Both values must use the dotted decimal notation." ++msgstr "" ++ ++msgid "Broadcast address" ++msgstr "" ++ ++msgid "Can only be a valid IPv4 or IPv6 address or 'default'" ++msgstr "" ++ ++msgid "Can only be a valid IPv6 address or 'default'" ++msgstr "" ++ ++msgid "Configuration" ++msgstr "" ++ ++msgid "" ++"Could not get any data. Make sure the jsoninfo plugin is installed and " ++"allows connections from localhost." ++msgstr "" ++ ++msgid "Display" ++msgstr "" ++ ++msgid "Downlink" ++msgstr "" ++ ++msgid "Download Config" ++msgstr "" ++ ++msgid "ETX" ++msgstr "" ++ ++msgid "Enable" ++msgstr "" ++ ++msgid "" ++"Enable SmartGateway. If it is disabled, then all other SmartGateway " ++"parameters are ignored. Default is \"no\"." ++msgstr "" ++ ++msgid "Enable this interface." ++msgstr "" ++ ++msgid "Enabled" ++msgstr "" ++ ++msgid "Expected retransmission count" ++msgstr "" ++ ++msgid "FIB metric" ++msgstr "" ++ ++msgid "" ++"FIBMetric controls the metric value of the host-routes OLSRd sets. \"flat\" " ++"means that the metric value is always 2. This is the preferred value because " ++"it helps the linux kernel routing to clean up older routes. \"correct\" uses " ++"the hopcount as the metric value. \"approx\" use the hopcount as the metric " ++"value too, but does only update the hopcount if the nexthop changes too. " ++"Default is \"flat\"." ++msgstr "" ++ ++msgid "Fisheye mechanism for TCs (checked means on). Default is \"on\"" ++msgstr "" ++ ++msgid "Gateway" ++msgstr "" ++ ++msgid "General Settings" ++msgstr "" ++ ++msgid "General settings" ++msgstr "" ++ ++msgid "Good (2 < ETX < 4)" ++msgstr "" ++ ++msgid "Good (30 > SNR > 20)" ++msgstr "" ++ ++msgid "Green" ++msgstr "" ++ ++msgid "HNA" ++msgstr "" ++ ++msgid "HNA Announcements" ++msgstr "" ++ ++msgid "HNA interval" ++msgstr "" ++ ++msgid "HNA validity time" ++msgstr "" ++ ++msgid "HNA6 Announcements" ++msgstr "" ++ ++msgid "Hello" ++msgstr "" ++ ++msgid "Hello interval" ++msgstr "" ++ ++msgid "Hello validity time" ++msgstr "" ++ ++msgid "Hide IPv4" ++msgstr "" ++ ++msgid "Hide IPv6" ++msgstr "" ++ ++msgid "Hna4" ++msgstr "" ++ ++msgid "Hna6" ++msgstr "" ++ ++msgid "Hops" ++msgstr "" ++ ++msgid "Hostname" ++msgstr "" ++ ++msgid "" ++"Hosts in a OLSR routed network can announce connecitivity to external " ++"networks using HNA messages." ++msgstr "" ++ ++msgid "" ++"Hosts in a OLSR routed network can announce connecitivity to external " ++"networks using HNA6 messages." ++msgstr "" ++ ++msgid "" ++"Hysteresis for link sensing (only for hopcount metric). Hysteresis adds more " ++"robustness to the link sensing but delays neighbor registration. Defaults is " ++"\"yes\"" ++msgstr "" ++ ++msgid "IP Addresses" ++msgstr "" ++ ++msgid "" ++"IP-version to use. If 6and4 is selected then one olsrd instance is started " ++"for each protocol." ++msgstr "" ++ ++msgid "IPv4" ++msgstr "" ++ ++msgid "IPv4 broadcast" ++msgstr "" ++ ++msgid "" ++"IPv4 broadcast address for outgoing OLSR packets. One useful example would " ++"be 255.255.255.255. Default is \"0.0.0.0\", which triggers the usage of the " ++"interface broadcast IP." ++msgstr "" ++ ++msgid "IPv4 source" ++msgstr "" ++ ++msgid "" ++"IPv4 src address for outgoing OLSR packages. Default is \"0.0.0.0\", which " ++"triggers usage of the interface IP." ++msgstr "" ++ ++msgid "IPv6" ++msgstr "" ++ ++msgid "IPv6 multicast" ++msgstr "" ++ ++msgid "" ++"IPv6 multicast address. Default is \"FF02::6D\", the manet-router linklocal " ++"multicast." ++msgstr "" ++ ++msgid "" ++"IPv6 network must be given in full notation, prefix must be in CIDR notation." ++msgstr "" ++ ++msgid "IPv6 source" ++msgstr "" ++ ++msgid "" ++"IPv6 src prefix. OLSRd will choose one of the interface IPs which matches " ++"the prefix of this parameter. Default is \"0::/0\", which triggers the usage " ++"of a not-linklocal interface IP." ++msgstr "" ++ ++msgid "IPv6-Prefix of the uplink" ++msgstr "" ++ ++msgid "" ++"If the route to the current gateway is to be changed, the ETX value of this " ++"gateway is multiplied with this value before it is compared to the new one. " ++"The parameter can be a value between 0.1 and 1.0, but should be close to 1.0 " ++"if changed.
    WARNING: This parameter should not be used together " ++"with the etx_ffeth metric!
    Defaults to \"1.0\"." ++msgstr "" ++ ++msgid "" ++"If this Node uses NAT for connections to the internet. Default is \"yes\"." ++msgstr "" ++ ++msgid "Interface" ++msgstr "" ++ ++msgid "" ++"Interface Mode is used to prevent unnecessary packet forwarding on switched " ++"ethernet interfaces. valid Modes are \"mesh\" and \"ether\". Default is " ++"\"mesh\"." ++msgstr "" ++ ++msgid "Interfaces" ++msgstr "" ++ ++msgid "Interfaces Defaults" ++msgstr "" ++ ++msgid "Internet protocol" ++msgstr "" ++ ++msgid "" ++"Interval to poll network interfaces for configuration changes (in seconds). " ++"Default is \"2.5\"." ++msgstr "" ++ ++msgid "Invalid Value for LQMult-Value. Must be between 0.01 and 1.0." ++msgstr "" ++ ++msgid "" ++"Invalid Value for LQMult-Value. You must use a decimal number between 0.01 " ++"and 1.0 here." ++msgstr "" ++ ++msgid "Known OLSR routes" ++msgstr "" ++ ++msgid "LQ" ++msgstr "" ++ ++msgid "LQ aging" ++msgstr "" ++ ++msgid "LQ algorithm" ++msgstr "" ++ ++msgid "LQ fisheye" ++msgstr "" ++ ++msgid "LQ level" ++msgstr "" ++ ++msgid "" ++"LQMult requires two values (IP address or 'default' and multiplicator) " ++"seperated by space." ++msgstr "" ++ ++msgid "Last hop" ++msgstr "" ++ ++msgid "Legend" ++msgstr "" ++ ++msgid "Library" ++msgstr "" ++ ++msgid "Link Quality Settings" ++msgstr "" ++ ++msgid "" ++"Link quality aging factor (only for lq level 2). Tuning parameter for " ++"etx_float and etx_fpm, smaller values mean slower changes of ETX value. " ++"(allowed values are between 0.01 and 1.0)" ++msgstr "" ++ ++msgid "" ++"Link quality algorithm (only for lq level 2).
    etx_float: " ++"floating point ETX with exponential aging
    etx_fpm : same as " ++"etx_float, but with integer arithmetic
    etx_ff : ETX freifunk, an " ++"etx variant which use all OLSR traffic (instead of only hellos) for ETX " ++"calculation
    etx_ffeth: incompatible variant of etx_ff that " ++"allows ethernet links with ETX 0.1.
    Defaults to \"etx_ff\"" ++msgstr "" ++ ++msgid "" ++"Link quality level switch between hopcount and cost-based (mostly ETX) " ++"routing.
    0 = do not use link quality
    2 = use link " ++"quality for MPR selection and routing
    Default is \"2\"" ++msgstr "" ++ ++msgid "LinkQuality Multiplicator" ++msgstr "" ++ ++msgid "Links per node (average)" ++msgstr "" ++ ++msgid "Links total" ++msgstr "" ++ ++msgid "Local interface IP" ++msgstr "" ++ ++msgid "MID" ++msgstr "" ++ ++msgid "MID interval" ++msgstr "" ++ ++msgid "MID validity time" ++msgstr "" ++ ++msgid "MTU" ++msgstr "" ++ ++msgid "Main IP" ++msgstr "" ++ ++msgid "" ++"Make sure that OLSRd is running, the \"jsoninfo\" plugin is loaded, " ++"configured on port 9090 and accepts connections from \"127.0.0.1\"." ++msgstr "" ++ ++msgid "Metric" ++msgstr "" ++ ++msgid "Mode" ++msgstr "" ++ ++msgid "" ++"Multiply routes with the factor given here. Allowed values are between 0.01 " ++"and 1.0. It is only used when LQ-Level is greater than 0. Examples:
    reduce LQ to 192.168.0.1 by half: 192.168.0.1 0.5
    reduce LQ to all " ++"nodes on this interface by 20%: default 0.8" ++msgstr "" ++ ++msgid "" ++"Multiply routes with the factor given here. Allowed values are between 0.01 " ++"and 1.0. It is only used when LQ-Level is greater than 0. Examples:
    reduce LQ to fd91:662e:3c58::1 by half: fd91:662e:3c58::1 0.5
    reduce " ++"LQ to all nodes on this interface by 20%: default 0.8" ++msgstr "" ++ ++msgid "NAT threshold" ++msgstr "" ++ ++msgid "NLQ" ++msgstr "" ++ ++msgid "Neighbors" ++msgstr "" ++ ++msgid "Neighbour IP" ++msgstr "" ++ ++msgid "Neighbours" ++msgstr "" ++ ++msgid "Netmask" ++msgstr "" ++ ++msgid "Network" ++msgstr "" ++ ++msgid "Network address" ++msgstr "" ++ ++msgid "Nic changes poll interval" ++msgstr "" ++ ++msgid "Nodes" ++msgstr "" ++ ++msgid "OLSR" ++msgstr "" ++ ++msgid "OLSR - Display Options" ++msgstr "" ++ ++msgid "OLSR - HNA-Announcements" ++msgstr "" ++ ++msgid "OLSR - HNA6-Announcements" ++msgstr "" ++ ++msgid "OLSR - Plugins" ++msgstr "" ++ ++msgid "OLSR Daemon" ++msgstr "" ++ ++msgid "OLSR Daemon - Interface" ++msgstr "" ++ ++msgid "OLSR connections" ++msgstr "" ++ ++msgid "OLSR gateway" ++msgstr "" ++ ++msgid "OLSR node" ++msgstr "" ++ ++msgid "Orange" ++msgstr "" ++ ++msgid "Overview" ++msgstr "" ++ ++msgid "Overview of currently active OLSR host net announcements" ++msgstr "" ++ ++msgid "Overview of currently established OLSR connections" ++msgstr "" ++ ++msgid "Overview of currently known OLSR nodes" ++msgstr "" ++ ++msgid "Overview of currently known routes to other OLSR nodes" ++msgstr "" ++ ++msgid "Overview of interfaces where OLSR is running" ++msgstr "" ++ ++msgid "Overview of known multiple interface announcements" ++msgstr "" ++ ++msgid "Overview of smart gateways in this network" ++msgstr "" ++ ++msgid "Plugin configuration" ++msgstr "" ++ ++msgid "Plugins" ++msgstr "" ++ ++msgid "Polling rate for OLSR sockets in seconds. Default is 0.05." ++msgstr "" ++ ++msgid "Pollrate" ++msgstr "" ++ ++msgid "Port" ++msgstr "" ++ ++msgid "Prefix" ++msgstr "" ++ ++msgid "Red" ++msgstr "" ++ ++msgid "Resolve" ++msgstr "" ++ ++msgid "" ++"Resolve hostnames on status pages. It is generally safe to allow this, but " ++"if you use public IPs and have unstable DNS-Setup then those pages will load " ++"really slow. In this case disable it here." ++msgstr "" ++ ++msgid "Routes" ++msgstr "" ++ ++msgid "Secondary OLSR interfaces" ++msgstr "" ++ ++msgid "" ++"Sets the main IP (originator ip) of the router. This IP will NEVER change " ++"during the uptime of olsrd. Default is 0.0.0.0, which triggers usage of the " ++"IP of the first interface." ++msgstr "" ++ ++msgid "" ++"Sets the main IP (originator ip) of the router. This IP will NEVER change " ++"during the uptime of olsrd. Default is ::, which triggers usage of the IP of " ++"the first interface." ++msgstr "" ++ ++msgid "Show IPv4" ++msgstr "" ++ ++msgid "Show IPv6" ++msgstr "" ++ ++msgid "Signal Noise Ratio in dB" ++msgstr "" ++ ++msgid "SmartGW" ++msgstr "" ++ ++msgid "SmartGW announcements" ++msgstr "" ++ ++msgid "SmartGateway is not configured on this system." ++msgstr "" ++ ++msgid "Source address" ++msgstr "" ++ ++msgid "" ++"Specifies the speed of the uplink in kilobits/s. First parameter is " ++"upstream, second parameter is downstream. Default is \"128 1024\"." ++msgstr "" ++ ++msgid "Speed of the uplink" ++msgstr "" ++ ++msgid "State" ++msgstr "" ++ ++msgid "Status" ++msgstr "" ++ ++msgid "Still usable (20 > SNR > 5)" ++msgstr "" ++ ++msgid "Still usable (4 < ETX < 10)" ++msgstr "" ++ ++msgid "Success rate of packages received from the neighbour" ++msgstr "" ++ ++msgid "Success rate of packages sent to the neighbour" ++msgstr "" ++ ++msgid "TC" ++msgstr "" ++ ++msgid "TC interval" ++msgstr "" ++ ++msgid "TC validity time" ++msgstr "" ++ ++msgid "TOS value" ++msgstr "" ++ ++msgid "" ++"The OLSR daemon is an implementation of the Optimized Link State Routing " ++"protocol. As such it allows mesh routing for any network equipment. It runs " ++"on any wifi card that supports ad-hoc mode and of course on any ethernet " ++"device. Visit olsrd.org for help and " ++"documentation." ++msgstr "" ++ ++msgid "" ++"The fixed willingness to use. If not set willingness will be calculated " ++"dynamically based on battery/power status. Default is \"3\"." ++msgstr "" ++ ++msgid "The interface OLSRd should serve." ++msgstr "" ++ ++msgid "" ++"The port OLSR uses. This should usually stay at the IANA assigned port 698. " ++"It can have a value between 1 and 65535." ++msgstr "" ++ ++msgid "" ++"This can be used to signal the external IPv6 prefix of the uplink to the " ++"clients. This might allow a client to change it's local IPv6 address to use " ++"the IPv6 gateway without any kind of address translation. The maximum prefix " ++"length is 64 bits. Default is \"::/0\" (no prefix)." ++msgstr "" ++ ++msgid "Timing and Validity" ++msgstr "" ++ ++msgid "Topology" ++msgstr "" ++ ++msgid "" ++"Type of service value for the IP header of control traffic. Default is " ++"\"16\"." ++msgstr "" ++ ++msgid "Unable to connect to the OLSR daemon!" ++msgstr "" ++ ++msgid "Uplink" ++msgstr "" ++ ++msgid "Uplink uses NAT" ++msgstr "" ++ ++msgid "Use hysteresis" ++msgstr "" ++ ++msgid "Validity Time" ++msgstr "" ++ ++msgid "Version" ++msgstr "" ++ ++msgid "Very good (ETX < 2)" ++msgstr "" ++ ++msgid "Very good (SNR > 30)" ++msgstr "" ++ ++msgid "WLAN" ++msgstr "" ++ ++msgid "" ++"Warning: kmod-ipip is not installed. Without kmod-ipip SmartGateway will not " ++"work, please install it." ++msgstr "" ++ ++msgid "Weight" ++msgstr "" ++ ++msgid "" ++"When multiple links exist between hosts the weight of interface is used to " ++"determine the link to use. Normally the weight is automatically calculated " ++"by olsrd based on the characteristics of the interface, but here you can " ++"specify a fixed value. Olsrd will choose links with the lowest value.
    Note: Interface weight is used only when LinkQualityLevel is set to " ++"0. For any other value of LinkQualityLevel, the interface ETX value is used " ++"instead." ++msgstr "" ++ ++msgid "" ++"Which kind of uplink is exported to the other mesh nodes. An uplink is " ++"detected by looking for a local HNA of 0.0.0.0/0, ::ffff:0:0/96 or 2000::/3. " ++"Default setting is \"both\"." ++msgstr "" ++ ++msgid "" ++"Which kind of uplink is exported to the other mesh nodes. An uplink is " ++"detected by looking for a local HNA6 ::ffff:0:0/96 or 2000::/3. Default " ++"setting is \"both\"." ++msgstr "" ++ ++msgid "Willingness" ++msgstr "" ++ ++msgid "Yellow" ++msgstr "" ++ ++msgid "no" ++msgstr "" ++ ++msgid "yes" ++msgstr "" +diff --git a/feeds/luci/applications/luci-app-olsr/po/no/olsr.po b/feeds/luci/applications/luci-app-olsr/po/no/olsr.po +new file mode 100644 +index 0000000..38aa43b +--- /dev/null ++++ b/feeds/luci/applications/luci-app-olsr/po/no/olsr.po +@@ -0,0 +1,687 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Last-Translator: Automatically generated\n" ++"Language-Team: none\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n != 1);\n" ++ ++msgid "Active MID announcements" ++msgstr "" ++ ++msgid "Active OLSR nodes" ++msgstr "" ++ ++msgid "Active host net announcements" ++msgstr "" ++ ++msgid "Advanced Settings" ++msgstr "" ++ ++msgid "Allow gateways with NAT" ++msgstr "" ++ ++msgid "Allow the selection of an outgoing ipv4 gateway with NAT" ++msgstr "" ++ ++msgid "Announce uplink" ++msgstr "" ++ ++msgid "Announced network" ++msgstr "" ++ ++msgid "Bad (ETX > 10)" ++msgstr "" ++ ++msgid "Bad (SNR < 5)" ++msgstr "" ++ ++msgid "Both values must use the dotted decimal notation." ++msgstr "" ++ ++msgid "Broadcast address" ++msgstr "" ++ ++msgid "Can only be a valid IPv4 or IPv6 address or 'default'" ++msgstr "" ++ ++msgid "Can only be a valid IPv6 address or 'default'" ++msgstr "" ++ ++msgid "Configuration" ++msgstr "" ++ ++msgid "" ++"Could not get any data. Make sure the jsoninfo plugin is installed and " ++"allows connections from localhost." ++msgstr "" ++ ++msgid "Display" ++msgstr "" ++ ++msgid "Downlink" ++msgstr "" ++ ++msgid "Download Config" ++msgstr "" ++ ++msgid "ETX" ++msgstr "" ++ ++msgid "Enable" ++msgstr "" ++ ++msgid "" ++"Enable SmartGateway. If it is disabled, then all other SmartGateway " ++"parameters are ignored. Default is \"no\"." ++msgstr "" ++ ++msgid "Enable this interface." ++msgstr "" ++ ++msgid "Enabled" ++msgstr "" ++ ++msgid "Expected retransmission count" ++msgstr "" ++ ++msgid "FIB metric" ++msgstr "" ++ ++msgid "" ++"FIBMetric controls the metric value of the host-routes OLSRd sets. \"flat\" " ++"means that the metric value is always 2. This is the preferred value because " ++"it helps the linux kernel routing to clean up older routes. \"correct\" uses " ++"the hopcount as the metric value. \"approx\" use the hopcount as the metric " ++"value too, but does only update the hopcount if the nexthop changes too. " ++"Default is \"flat\"." ++msgstr "" ++ ++msgid "Fisheye mechanism for TCs (checked means on). Default is \"on\"" ++msgstr "" ++ ++msgid "Gateway" ++msgstr "" ++ ++msgid "General Settings" ++msgstr "" ++ ++msgid "General settings" ++msgstr "" ++ ++msgid "Good (2 < ETX < 4)" ++msgstr "" ++ ++msgid "Good (30 > SNR > 20)" ++msgstr "" ++ ++msgid "Green" ++msgstr "" ++ ++msgid "HNA" ++msgstr "" ++ ++msgid "HNA Announcements" ++msgstr "" ++ ++msgid "HNA interval" ++msgstr "" ++ ++msgid "HNA validity time" ++msgstr "" ++ ++msgid "HNA6 Announcements" ++msgstr "" ++ ++msgid "Hello" ++msgstr "" ++ ++msgid "Hello interval" ++msgstr "" ++ ++msgid "Hello validity time" ++msgstr "" ++ ++msgid "Hide IPv4" ++msgstr "" ++ ++msgid "Hide IPv6" ++msgstr "" ++ ++msgid "Hna4" ++msgstr "" ++ ++msgid "Hna6" ++msgstr "" ++ ++msgid "Hops" ++msgstr "" ++ ++msgid "Hostname" ++msgstr "" ++ ++msgid "" ++"Hosts in a OLSR routed network can announce connecitivity to external " ++"networks using HNA messages." ++msgstr "" ++ ++msgid "" ++"Hosts in a OLSR routed network can announce connecitivity to external " ++"networks using HNA6 messages." ++msgstr "" ++ ++msgid "" ++"Hysteresis for link sensing (only for hopcount metric). Hysteresis adds more " ++"robustness to the link sensing but delays neighbor registration. Defaults is " ++"\"yes\"" ++msgstr "" ++ ++msgid "IP Addresses" ++msgstr "" ++ ++msgid "" ++"IP-version to use. If 6and4 is selected then one olsrd instance is started " ++"for each protocol." ++msgstr "" ++ ++msgid "IPv4" ++msgstr "" ++ ++msgid "IPv4 broadcast" ++msgstr "" ++ ++msgid "" ++"IPv4 broadcast address for outgoing OLSR packets. One useful example would " ++"be 255.255.255.255. Default is \"0.0.0.0\", which triggers the usage of the " ++"interface broadcast IP." ++msgstr "" ++ ++msgid "IPv4 source" ++msgstr "" ++ ++msgid "" ++"IPv4 src address for outgoing OLSR packages. Default is \"0.0.0.0\", which " ++"triggers usage of the interface IP." ++msgstr "" ++ ++msgid "IPv6" ++msgstr "" ++ ++msgid "IPv6 multicast" ++msgstr "" ++ ++msgid "" ++"IPv6 multicast address. Default is \"FF02::6D\", the manet-router linklocal " ++"multicast." ++msgstr "" ++ ++msgid "" ++"IPv6 network must be given in full notation, prefix must be in CIDR notation." ++msgstr "" ++ ++msgid "IPv6 source" ++msgstr "" ++ ++msgid "" ++"IPv6 src prefix. OLSRd will choose one of the interface IPs which matches " ++"the prefix of this parameter. Default is \"0::/0\", which triggers the usage " ++"of a not-linklocal interface IP." ++msgstr "" ++ ++msgid "IPv6-Prefix of the uplink" ++msgstr "" ++ ++msgid "" ++"If the route to the current gateway is to be changed, the ETX value of this " ++"gateway is multiplied with this value before it is compared to the new one. " ++"The parameter can be a value between 0.1 and 1.0, but should be close to 1.0 " ++"if changed.
    WARNING: This parameter should not be used together " ++"with the etx_ffeth metric!
    Defaults to \"1.0\"." ++msgstr "" ++ ++msgid "" ++"If this Node uses NAT for connections to the internet. Default is \"yes\"." ++msgstr "" ++ ++msgid "Interface" ++msgstr "" ++ ++msgid "" ++"Interface Mode is used to prevent unnecessary packet forwarding on switched " ++"ethernet interfaces. valid Modes are \"mesh\" and \"ether\". Default is " ++"\"mesh\"." ++msgstr "" ++ ++msgid "Interfaces" ++msgstr "" ++ ++msgid "Interfaces Defaults" ++msgstr "" ++ ++msgid "Internet protocol" ++msgstr "" ++ ++msgid "" ++"Interval to poll network interfaces for configuration changes (in seconds). " ++"Default is \"2.5\"." ++msgstr "" ++ ++msgid "Invalid Value for LQMult-Value. Must be between 0.01 and 1.0." ++msgstr "" ++ ++msgid "" ++"Invalid Value for LQMult-Value. You must use a decimal number between 0.01 " ++"and 1.0 here." ++msgstr "" ++ ++msgid "Known OLSR routes" ++msgstr "" ++ ++msgid "LQ" ++msgstr "" ++ ++msgid "LQ aging" ++msgstr "" ++ ++msgid "LQ algorithm" ++msgstr "" ++ ++msgid "LQ fisheye" ++msgstr "" ++ ++msgid "LQ level" ++msgstr "" ++ ++msgid "" ++"LQMult requires two values (IP address or 'default' and multiplicator) " ++"seperated by space." ++msgstr "" ++ ++msgid "Last hop" ++msgstr "" ++ ++msgid "Legend" ++msgstr "" ++ ++msgid "Library" ++msgstr "" ++ ++msgid "Link Quality Settings" ++msgstr "" ++ ++msgid "" ++"Link quality aging factor (only for lq level 2). Tuning parameter for " ++"etx_float and etx_fpm, smaller values mean slower changes of ETX value. " ++"(allowed values are between 0.01 and 1.0)" ++msgstr "" ++ ++msgid "" ++"Link quality algorithm (only for lq level 2).
    etx_float: " ++"floating point ETX with exponential aging
    etx_fpm : same as " ++"etx_float, but with integer arithmetic
    etx_ff : ETX freifunk, an " ++"etx variant which use all OLSR traffic (instead of only hellos) for ETX " ++"calculation
    etx_ffeth: incompatible variant of etx_ff that " ++"allows ethernet links with ETX 0.1.
    Defaults to \"etx_ff\"" ++msgstr "" ++ ++msgid "" ++"Link quality level switch between hopcount and cost-based (mostly ETX) " ++"routing.
    0 = do not use link quality
    2 = use link " ++"quality for MPR selection and routing
    Default is \"2\"" ++msgstr "" ++ ++msgid "LinkQuality Multiplicator" ++msgstr "" ++ ++msgid "Links per node (average)" ++msgstr "" ++ ++msgid "Links total" ++msgstr "" ++ ++msgid "Local interface IP" ++msgstr "" ++ ++msgid "MID" ++msgstr "" ++ ++msgid "MID interval" ++msgstr "" ++ ++msgid "MID validity time" ++msgstr "" ++ ++msgid "MTU" ++msgstr "" ++ ++msgid "Main IP" ++msgstr "" ++ ++msgid "" ++"Make sure that OLSRd is running, the \"jsoninfo\" plugin is loaded, " ++"configured on port 9090 and accepts connections from \"127.0.0.1\"." ++msgstr "" ++ ++msgid "Metric" ++msgstr "" ++ ++msgid "Mode" ++msgstr "" ++ ++msgid "" ++"Multiply routes with the factor given here. Allowed values are between 0.01 " ++"and 1.0. It is only used when LQ-Level is greater than 0. Examples:
    reduce LQ to 192.168.0.1 by half: 192.168.0.1 0.5
    reduce LQ to all " ++"nodes on this interface by 20%: default 0.8" ++msgstr "" ++ ++msgid "" ++"Multiply routes with the factor given here. Allowed values are between 0.01 " ++"and 1.0. It is only used when LQ-Level is greater than 0. Examples:
    reduce LQ to fd91:662e:3c58::1 by half: fd91:662e:3c58::1 0.5
    reduce " ++"LQ to all nodes on this interface by 20%: default 0.8" ++msgstr "" ++ ++msgid "NAT threshold" ++msgstr "" ++ ++msgid "NLQ" ++msgstr "" ++ ++msgid "Neighbors" ++msgstr "" ++ ++msgid "Neighbour IP" ++msgstr "" ++ ++msgid "Neighbours" ++msgstr "" ++ ++msgid "Netmask" ++msgstr "" ++ ++msgid "Network" ++msgstr "" ++ ++msgid "Network address" ++msgstr "" ++ ++msgid "Nic changes poll interval" ++msgstr "" ++ ++msgid "Nodes" ++msgstr "" ++ ++msgid "OLSR" ++msgstr "" ++ ++msgid "OLSR - Display Options" ++msgstr "" ++ ++msgid "OLSR - HNA-Announcements" ++msgstr "" ++ ++msgid "OLSR - HNA6-Announcements" ++msgstr "" ++ ++msgid "OLSR - Plugins" ++msgstr "" ++ ++msgid "OLSR Daemon" ++msgstr "" ++ ++msgid "OLSR Daemon - Interface" ++msgstr "" ++ ++msgid "OLSR connections" ++msgstr "" ++ ++msgid "OLSR gateway" ++msgstr "" ++ ++msgid "OLSR node" ++msgstr "" ++ ++msgid "Orange" ++msgstr "" ++ ++msgid "Overview" ++msgstr "" ++ ++msgid "Overview of currently active OLSR host net announcements" ++msgstr "" ++ ++msgid "Overview of currently established OLSR connections" ++msgstr "" ++ ++msgid "Overview of currently known OLSR nodes" ++msgstr "" ++ ++msgid "Overview of currently known routes to other OLSR nodes" ++msgstr "" ++ ++msgid "Overview of interfaces where OLSR is running" ++msgstr "" ++ ++msgid "Overview of known multiple interface announcements" ++msgstr "" ++ ++msgid "Overview of smart gateways in this network" ++msgstr "" ++ ++msgid "Plugin configuration" ++msgstr "" ++ ++msgid "Plugins" ++msgstr "" ++ ++msgid "Polling rate for OLSR sockets in seconds. Default is 0.05." ++msgstr "" ++ ++msgid "Pollrate" ++msgstr "" ++ ++msgid "Port" ++msgstr "" ++ ++msgid "Prefix" ++msgstr "" ++ ++msgid "Red" ++msgstr "" ++ ++msgid "Resolve" ++msgstr "" ++ ++msgid "" ++"Resolve hostnames on status pages. It is generally safe to allow this, but " ++"if you use public IPs and have unstable DNS-Setup then those pages will load " ++"really slow. In this case disable it here." ++msgstr "" ++ ++msgid "Routes" ++msgstr "" ++ ++msgid "Secondary OLSR interfaces" ++msgstr "" ++ ++msgid "" ++"Sets the main IP (originator ip) of the router. This IP will NEVER change " ++"during the uptime of olsrd. Default is 0.0.0.0, which triggers usage of the " ++"IP of the first interface." ++msgstr "" ++ ++msgid "" ++"Sets the main IP (originator ip) of the router. This IP will NEVER change " ++"during the uptime of olsrd. Default is ::, which triggers usage of the IP of " ++"the first interface." ++msgstr "" ++ ++msgid "Show IPv4" ++msgstr "" ++ ++msgid "Show IPv6" ++msgstr "" ++ ++msgid "Signal Noise Ratio in dB" ++msgstr "" ++ ++msgid "SmartGW" ++msgstr "" ++ ++msgid "SmartGW announcements" ++msgstr "" ++ ++msgid "SmartGateway is not configured on this system." ++msgstr "" ++ ++msgid "Source address" ++msgstr "" ++ ++msgid "" ++"Specifies the speed of the uplink in kilobits/s. First parameter is " ++"upstream, second parameter is downstream. Default is \"128 1024\"." ++msgstr "" ++ ++msgid "Speed of the uplink" ++msgstr "" ++ ++msgid "State" ++msgstr "" ++ ++msgid "Status" ++msgstr "" ++ ++msgid "Still usable (20 > SNR > 5)" ++msgstr "" ++ ++msgid "Still usable (4 < ETX < 10)" ++msgstr "" ++ ++msgid "Success rate of packages received from the neighbour" ++msgstr "" ++ ++msgid "Success rate of packages sent to the neighbour" ++msgstr "" ++ ++msgid "TC" ++msgstr "" ++ ++msgid "TC interval" ++msgstr "" ++ ++msgid "TC validity time" ++msgstr "" ++ ++msgid "TOS value" ++msgstr "" ++ ++msgid "" ++"The OLSR daemon is an implementation of the Optimized Link State Routing " ++"protocol. As such it allows mesh routing for any network equipment. It runs " ++"on any wifi card that supports ad-hoc mode and of course on any ethernet " ++"device. Visit olsrd.org for help and " ++"documentation." ++msgstr "" ++ ++msgid "" ++"The fixed willingness to use. If not set willingness will be calculated " ++"dynamically based on battery/power status. Default is \"3\"." ++msgstr "" ++ ++msgid "The interface OLSRd should serve." ++msgstr "" ++ ++msgid "" ++"The port OLSR uses. This should usually stay at the IANA assigned port 698. " ++"It can have a value between 1 and 65535." ++msgstr "" ++ ++msgid "" ++"This can be used to signal the external IPv6 prefix of the uplink to the " ++"clients. This might allow a client to change it's local IPv6 address to use " ++"the IPv6 gateway without any kind of address translation. The maximum prefix " ++"length is 64 bits. Default is \"::/0\" (no prefix)." ++msgstr "" ++ ++msgid "Timing and Validity" ++msgstr "" ++ ++msgid "Topology" ++msgstr "" ++ ++msgid "" ++"Type of service value for the IP header of control traffic. Default is " ++"\"16\"." ++msgstr "" ++ ++msgid "Unable to connect to the OLSR daemon!" ++msgstr "" ++ ++msgid "Uplink" ++msgstr "" ++ ++msgid "Uplink uses NAT" ++msgstr "" ++ ++msgid "Use hysteresis" ++msgstr "" ++ ++msgid "Validity Time" ++msgstr "" ++ ++msgid "Version" ++msgstr "" ++ ++msgid "Very good (ETX < 2)" ++msgstr "" ++ ++msgid "Very good (SNR > 30)" ++msgstr "" ++ ++msgid "WLAN" ++msgstr "" ++ ++msgid "" ++"Warning: kmod-ipip is not installed. Without kmod-ipip SmartGateway will not " ++"work, please install it." ++msgstr "" ++ ++msgid "Weight" ++msgstr "" ++ ++msgid "" ++"When multiple links exist between hosts the weight of interface is used to " ++"determine the link to use. Normally the weight is automatically calculated " ++"by olsrd based on the characteristics of the interface, but here you can " ++"specify a fixed value. Olsrd will choose links with the lowest value.
    Note: Interface weight is used only when LinkQualityLevel is set to " ++"0. For any other value of LinkQualityLevel, the interface ETX value is used " ++"instead." ++msgstr "" ++ ++msgid "" ++"Which kind of uplink is exported to the other mesh nodes. An uplink is " ++"detected by looking for a local HNA of 0.0.0.0/0, ::ffff:0:0/96 or 2000::/3. " ++"Default setting is \"both\"." ++msgstr "" ++ ++msgid "" ++"Which kind of uplink is exported to the other mesh nodes. An uplink is " ++"detected by looking for a local HNA6 ::ffff:0:0/96 or 2000::/3. Default " ++"setting is \"both\"." ++msgstr "" ++ ++msgid "Willingness" ++msgstr "" ++ ++msgid "Yellow" ++msgstr "" ++ ++msgid "no" ++msgstr "" ++ ++msgid "yes" ++msgstr "" +diff --git a/feeds/luci/applications/luci-app-olsr/po/pl/olsr.po b/feeds/luci/applications/luci-app-olsr/po/pl/olsr.po +new file mode 100644 +index 0000000..64a99f6 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-olsr/po/pl/olsr.po +@@ -0,0 +1,749 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"PO-Revision-Date: 2014-05-05 03:22+0200\n" ++"Last-Translator: piosl \n" ++"Language-Team: none\n" ++"Language: pl\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 " ++"|| n%100>=20) ? 1 : 2);\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "Active MID announcements" ++msgstr "Aktywne ogłoszenia MID" ++ ++msgid "Active OLSR nodes" ++msgstr "Aktywne węzły OLSR" ++ ++msgid "Active host net announcements" ++msgstr "Aktywne ogłoszenia hostnet" ++ ++msgid "Advanced Settings" ++msgstr "Ustawienia zaawansowane" ++ ++msgid "Allow gateways with NAT" ++msgstr "Zezwól na bramy z NAT" ++ ++msgid "Allow the selection of an outgoing ipv4 gateway with NAT" ++msgstr "Zezwól na wybieranie wychodzącej bramy IPv4 przez NAT" ++ ++msgid "Announce uplink" ++msgstr "Ogłaszaj uplink" ++ ++msgid "Announced network" ++msgstr "Ogłaszana sieć" ++ ++msgid "Bad (ETX > 10)" ++msgstr "" ++ ++msgid "Bad (SNR < 5)" ++msgstr "" ++ ++msgid "Both values must use the dotted decimal notation." ++msgstr "" ++"Obie wartości muszą używać zapisu dziesiętnego z kropką przed częścią " ++"dziesiętną." ++ ++msgid "Broadcast address" ++msgstr "Adres rozgłoszeniowy (broadcast)" ++ ++msgid "Can only be a valid IPv4 or IPv6 address or 'default'" ++msgstr "" ++ ++msgid "Can only be a valid IPv6 address or 'default'" ++msgstr "" ++ ++msgid "Configuration" ++msgstr "Konfiguracja" ++ ++msgid "" ++"Could not get any data. Make sure the jsoninfo plugin is installed and " ++"allows connections from localhost." ++msgstr "" ++ ++msgid "Display" ++msgstr "Wyświetl" ++ ++msgid "Downlink" ++msgstr "Downlink" ++ ++msgid "Download Config" ++msgstr "Ustawienia pobierania" ++ ++msgid "ETX" ++msgstr "ETX" ++ ++msgid "Enable" ++msgstr "Włącz" ++ ++msgid "" ++"Enable SmartGateway. If it is disabled, then all other SmartGateway " ++"parameters are ignored. Default is \"no\"." ++msgstr "" ++"Włącz SmartGateway. Jeśli wyłączone, wszystkie inne parametry SmartGateway " ++"są ignorowane. Domyślnie jest wyłączone." ++ ++msgid "Enable this interface." ++msgstr "Włącz ten interfejs." ++ ++msgid "Enabled" ++msgstr "Włączone" ++ ++msgid "Expected retransmission count" ++msgstr "Oczekiwana wartość retransmisji" ++ ++msgid "FIB metric" ++msgstr "Metryka FIB" ++ ++msgid "" ++"FIBMetric controls the metric value of the host-routes OLSRd sets. \"flat\" " ++"means that the metric value is always 2. This is the preferred value because " ++"it helps the linux kernel routing to clean up older routes. \"correct\" uses " ++"the hopcount as the metric value. \"approx\" use the hopcount as the metric " ++"value too, but does only update the hopcount if the nexthop changes too. " ++"Default is \"flat\"." ++msgstr "" ++ ++# skorzystałem z niemieckiego tłumaczenia ++msgid "Fisheye mechanism for TCs (checked means on). Default is \"on\"" ++msgstr "" ++"Mechanizm Fisheye dla TCs (zaznaczone oznacza \"włączone\"). Domyślnie jest " ++"\"włączone\"" ++ ++msgid "Gateway" ++msgstr "Brama" ++ ++msgid "General Settings" ++msgstr "Ustawienia ogólne" ++ ++msgid "General settings" ++msgstr "Ustawienia ogólne" ++ ++msgid "Good (2 < ETX < 4)" ++msgstr "" ++ ++msgid "Good (30 > SNR > 20)" ++msgstr "" ++ ++msgid "Green" ++msgstr "" ++ ++msgid "HNA" ++msgstr "HNA" ++ ++msgid "HNA Announcements" ++msgstr "Ogłoszenia HNA" ++ ++msgid "HNA interval" ++msgstr "Interwał HNA" ++ ++msgid "HNA validity time" ++msgstr "Czas poprawności HNA" ++ ++#, fuzzy ++msgid "HNA6 Announcements" ++msgstr "Ogłoszenia HNA" ++ ++msgid "Hello" ++msgstr "Hello" ++ ++msgid "Hello interval" ++msgstr "Interwał Hello" ++ ++msgid "Hello validity time" ++msgstr "Czas poprawności Hello" ++ ++msgid "Hide IPv4" ++msgstr "" ++ ++msgid "Hide IPv6" ++msgstr "" ++ ++msgid "Hna4" ++msgstr "Hna4" ++ ++msgid "Hna6" ++msgstr "Hna6" ++ ++msgid "Hops" ++msgstr "Skoki (hops)" ++ ++msgid "Hostname" ++msgstr "Nazwa hosta" ++ ++msgid "" ++"Hosts in a OLSR routed network can announce connecitivity to external " ++"networks using HNA messages." ++msgstr "" ++"Hosty w sieci OLSR mogą ogłaszać połączenia z zewnętrznymi sieciami poprzez " ++"wiadomości HNA." ++ ++#, fuzzy ++msgid "" ++"Hosts in a OLSR routed network can announce connecitivity to external " ++"networks using HNA6 messages." ++msgstr "" ++"Hosty w sieci OLSR mogą ogłaszać połączenia z zewnętrznymi sieciami poprzez " ++"wiadomości HNA." ++ ++msgid "" ++"Hysteresis for link sensing (only for hopcount metric). Hysteresis adds more " ++"robustness to the link sensing but delays neighbor registration. Defaults is " ++"\"yes\"" ++msgstr "" ++ ++msgid "IP Addresses" ++msgstr "Adresy IP" ++ ++msgid "" ++"IP-version to use. If 6and4 is selected then one olsrd instance is started " ++"for each protocol." ++msgstr "" ++"Wersja protokołu IP. Jeśli jest wybrana 6and4 wtedy instancja olsrd jest " ++"uruchomiona dla każdego protokołu." ++ ++msgid "IPv4" ++msgstr "IPv4" ++ ++msgid "IPv4 broadcast" ++msgstr "Rozgłaszanie IPv4" ++ ++msgid "" ++"IPv4 broadcast address for outgoing OLSR packets. One useful example would " ++"be 255.255.255.255. Default is \"0.0.0.0\", which triggers the usage of the " ++"interface broadcast IP." ++msgstr "" ++"Adres rozgłoszeniowy (broadcast) IPv4 dla wychodzących pakietów OLSR. " ++"Przydatnym przykładem byłoby 255.255.255.255. Domyślna wartość to " ++"\"0.0.0.0\" - jest wtedy używany adres rozgłoszeniowy interfejsu." ++ ++msgid "IPv4 source" ++msgstr "Źródło IPv4" ++ ++msgid "" ++"IPv4 src address for outgoing OLSR packages. Default is \"0.0.0.0\", which " ++"triggers usage of the interface IP." ++msgstr "" ++"Adres źródłowy IPv4 dla wychodzących pakietów. Domyślna wartość to " ++"\"0.0.0.0\" - jest wtedy używany adres IP interfejsu." ++ ++msgid "IPv6" ++msgstr "IPv6" ++ ++msgid "IPv6 multicast" ++msgstr "Multicast IPv6" ++ ++# Nie mam pojęcia, jak to lepiej przetłumaczyć, ale w moich tłumaczeniach kieruję się zasadą "release early, release often". ++msgid "" ++"IPv6 multicast address. Default is \"FF02::6D\", the manet-router linklocal " ++"multicast." ++msgstr "" ++"Adres multicast IPv6. Domyślna wartość to \"FF02::6D\", multicast lokalnego " ++"routera." ++ ++msgid "" ++"IPv6 network must be given in full notation, prefix must be in CIDR notation." ++msgstr "" ++"Sieć IPv6 musi być podana w pełnej notacji, prefiks musi być w notacji CIDR." ++ ++msgid "IPv6 source" ++msgstr "Źródło IPv6" ++ ++msgid "" ++"IPv6 src prefix. OLSRd will choose one of the interface IPs which matches " ++"the prefix of this parameter. Default is \"0::/0\", which triggers the usage " ++"of a not-linklocal interface IP." ++msgstr "" ++"Prefiks źródła IPv6. OLSRd wybierze jeden z adresów IP interfejsów, który " ++"będzie pasował do tego prefiksu. Domyślna wartość to \"0::/0\" - jest wtedy " ++"używany adres IP interfejsu." ++ ++msgid "IPv6-Prefix of the uplink" ++msgstr "" ++ ++msgid "" ++"If the route to the current gateway is to be changed, the ETX value of this " ++"gateway is multiplied with this value before it is compared to the new one. " ++"The parameter can be a value between 0.1 and 1.0, but should be close to 1.0 " ++"if changed.
    WARNING: This parameter should not be used together " ++"with the etx_ffeth metric!
    Defaults to \"1.0\"." ++msgstr "" ++ ++msgid "" ++"If this Node uses NAT for connections to the internet. Default is \"yes\"." ++msgstr "Czy węzeł korzysta z NAT do połączenia z Internetem. Domyślnie \"Tak\"" ++ ++msgid "Interface" ++msgstr "Interfejs" ++ ++msgid "" ++"Interface Mode is used to prevent unnecessary packet forwarding on switched " ++"ethernet interfaces. valid Modes are \"mesh\" and \"ether\". Default is " ++"\"mesh\"." ++msgstr "" ++"Tryb interfejsu jest używany, aby zapobiec niepotrzebnemu przekazywaniu " ++"pakietów. Prawidłowe tryby to \"mesh\" i \"ether\". Domyślna wartość to " ++"\"mesh\"." ++ ++msgid "Interfaces" ++msgstr "Interfejsy" ++ ++# by Google :D po części ++msgid "Interfaces Defaults" ++msgstr "Standardy interfejsów" ++ ++msgid "Internet protocol" ++msgstr "Protokół internetowy" ++ ++msgid "" ++"Interval to poll network interfaces for configuration changes (in seconds). " ++"Default is \"2.5\"." ++msgstr "" ++ ++msgid "Invalid Value for LQMult-Value. Must be between 0.01 and 1.0." ++msgstr "" ++ ++msgid "" ++"Invalid Value for LQMult-Value. You must use a decimal number between 0.01 " ++"and 1.0 here." ++msgstr "" ++ ++msgid "Known OLSR routes" ++msgstr "Znane ścieżki OLSR" ++ ++msgid "LQ" ++msgstr "LQ" ++ ++msgid "LQ aging" ++msgstr "Starzenie się LQ" ++ ++msgid "LQ algorithm" ++msgstr "Algorytm LQ" ++ ++msgid "LQ fisheye" ++msgstr "LQ-Fisheye" ++ ++msgid "LQ level" ++msgstr "Poziom LQ" ++ ++msgid "" ++"LQMult requires two values (IP address or 'default' and multiplicator) " ++"seperated by space." ++msgstr "" ++ ++msgid "Last hop" ++msgstr "Ostatni skok (hop)" ++ ++msgid "Legend" ++msgstr "Legenda" ++ ++msgid "Library" ++msgstr "Biblioteka" ++ ++#, fuzzy ++msgid "Link Quality Settings" ++msgstr "Ustawienia jakości linków" ++ ++msgid "" ++"Link quality aging factor (only for lq level 2). Tuning parameter for " ++"etx_float and etx_fpm, smaller values mean slower changes of ETX value. " ++"(allowed values are between 0.01 and 1.0)" ++msgstr "" ++ ++msgid "" ++"Link quality algorithm (only for lq level 2).
    etx_float: " ++"floating point ETX with exponential aging
    etx_fpm : same as " ++"etx_float, but with integer arithmetic
    etx_ff : ETX freifunk, an " ++"etx variant which use all OLSR traffic (instead of only hellos) for ETX " ++"calculation
    etx_ffeth: incompatible variant of etx_ff that " ++"allows ethernet links with ETX 0.1.
    Defaults to \"etx_ff\"" ++msgstr "" ++ ++msgid "" ++"Link quality level switch between hopcount and cost-based (mostly ETX) " ++"routing.
    0 = do not use link quality
    2 = use link " ++"quality for MPR selection and routing
    Default is \"2\"" ++msgstr "" ++ ++msgid "LinkQuality Multiplicator" ++msgstr "Mnożnik LinkQuality" ++ ++msgid "Links per node (average)" ++msgstr "Linków na węzeł (średnio)" ++ ++msgid "Links total" ++msgstr "Linków w sumie" ++ ++msgid "Local interface IP" ++msgstr "IP lokalnego interfejsu" ++ ++msgid "MID" ++msgstr "MID" ++ ++msgid "MID interval" ++msgstr "Interwał MID" ++ ++msgid "MID validity time" ++msgstr "Czas poprawności MID" ++ ++msgid "MTU" ++msgstr "MTU" ++ ++msgid "Main IP" ++msgstr "Główny IP" ++ ++msgid "" ++"Make sure that OLSRd is running, the \"jsoninfo\" plugin is loaded, " ++"configured on port 9090 and accepts connections from \"127.0.0.1\"." ++msgstr "" ++ ++#, fuzzy ++msgid "Metric" ++msgstr "Miara" ++ ++msgid "Mode" ++msgstr "Tryb" ++ ++msgid "" ++"Multiply routes with the factor given here. Allowed values are between 0.01 " ++"and 1.0. It is only used when LQ-Level is greater than 0. Examples:
    reduce LQ to 192.168.0.1 by half: 192.168.0.1 0.5
    reduce LQ to all " ++"nodes on this interface by 20%: default 0.8" ++msgstr "" ++ ++msgid "" ++"Multiply routes with the factor given here. Allowed values are between 0.01 " ++"and 1.0. It is only used when LQ-Level is greater than 0. Examples:
    reduce LQ to fd91:662e:3c58::1 by half: fd91:662e:3c58::1 0.5
    reduce " ++"LQ to all nodes on this interface by 20%: default 0.8" ++msgstr "" ++ ++msgid "NAT threshold" ++msgstr "Próg NAT" ++ ++msgid "NLQ" ++msgstr "NLQ" ++ ++msgid "Neighbors" ++msgstr "Sąsiedzi" ++ ++msgid "Neighbour IP" ++msgstr "IP sąsiadów" ++ ++msgid "Neighbours" ++msgstr "Sąsiedzi" ++ ++msgid "Netmask" ++msgstr "Maska sieciowa" ++ ++msgid "Network" ++msgstr "Sieć" ++ ++msgid "Network address" ++msgstr "Adres sieci" ++ ++msgid "Nic changes poll interval" ++msgstr "" ++ ++msgid "Nodes" ++msgstr "Węzły" ++ ++msgid "OLSR" ++msgstr "OLSR" ++ ++msgid "OLSR - Display Options" ++msgstr "" ++ ++msgid "OLSR - HNA-Announcements" ++msgstr "OLSR - ogłoszenia HNA" ++ ++#, fuzzy ++msgid "OLSR - HNA6-Announcements" ++msgstr "OLSR - ogłoszenia HNA" ++ ++msgid "OLSR - Plugins" ++msgstr "OLSR - pluginy" ++ ++msgid "OLSR Daemon" ++msgstr "Demon OLSR" ++ ++msgid "OLSR Daemon - Interface" ++msgstr "Demon OLSR - interfejs" ++ ++msgid "OLSR connections" ++msgstr "Połączenia OLSR" ++ ++msgid "OLSR gateway" ++msgstr "Brama OLSR" ++ ++msgid "OLSR node" ++msgstr "Węzeł OLSR" ++ ++msgid "Orange" ++msgstr "" ++ ++msgid "Overview" ++msgstr "Przegląd" ++ ++msgid "Overview of currently active OLSR host net announcements" ++msgstr "Przegląd aktywnych ogłoszeń hostnet OLSR" ++ ++msgid "Overview of currently established OLSR connections" ++msgstr "Przegląd nawiązanych połączeń OLSR" ++ ++msgid "Overview of currently known OLSR nodes" ++msgstr "Przegląd znanych węzłów OLSR" ++ ++msgid "Overview of currently known routes to other OLSR nodes" ++msgstr "Przegląd znanych tras do innych węzłów OLSR" ++ ++msgid "Overview of interfaces where OLSR is running" ++msgstr "Przegląd interfejsów z włączonym OLSR" ++ ++msgid "Overview of known multiple interface announcements" ++msgstr "Przegląd znanych wielointerfejsowych ogłoszeń" ++ ++msgid "Overview of smart gateways in this network" ++msgstr "Przegląd bram SmartGateway w tej sieci" ++ ++msgid "Plugin configuration" ++msgstr "Ustawienia pluginu" ++ ++msgid "Plugins" ++msgstr "Pluginy" ++ ++msgid "Polling rate for OLSR sockets in seconds. Default is 0.05." ++msgstr "" ++ ++msgid "Pollrate" ++msgstr "" ++ ++msgid "Port" ++msgstr "Port" ++ ++msgid "Prefix" ++msgstr "Prefiks" ++ ++msgid "Red" ++msgstr "" ++ ++msgid "Resolve" ++msgstr "Rozwiąż" ++ ++msgid "" ++"Resolve hostnames on status pages. It is generally safe to allow this, but " ++"if you use public IPs and have unstable DNS-Setup then those pages will load " ++"really slow. In this case disable it here." ++msgstr "" ++ ++msgid "Routes" ++msgstr "Trasy (routes)" ++ ++msgid "Secondary OLSR interfaces" ++msgstr "Zapasowy interfejs OLSR" ++ ++msgid "" ++"Sets the main IP (originator ip) of the router. This IP will NEVER change " ++"during the uptime of olsrd. Default is 0.0.0.0, which triggers usage of the " ++"IP of the first interface." ++msgstr "" ++ ++msgid "" ++"Sets the main IP (originator ip) of the router. This IP will NEVER change " ++"during the uptime of olsrd. Default is ::, which triggers usage of the IP of " ++"the first interface." ++msgstr "" ++ ++msgid "Show IPv4" ++msgstr "" ++ ++msgid "Show IPv6" ++msgstr "" ++ ++msgid "Signal Noise Ratio in dB" ++msgstr "" ++ ++msgid "SmartGW" ++msgstr "SmartGW" ++ ++msgid "SmartGW announcements" ++msgstr "Ogłoszenia SmartGW" ++ ++msgid "SmartGateway is not configured on this system." ++msgstr "SmartGateway jest nieskonfigurowane." ++ ++msgid "Source address" ++msgstr "Adres źródłowy" ++ ++msgid "" ++"Specifies the speed of the uplink in kilobits/s. First parameter is " ++"upstream, second parameter is downstream. Default is \"128 1024\"." ++msgstr "" ++ ++msgid "Speed of the uplink" ++msgstr "" ++ ++msgid "State" ++msgstr "Stan" ++ ++msgid "Status" ++msgstr "Status" ++ ++msgid "Still usable (20 > SNR > 5)" ++msgstr "" ++ ++msgid "Still usable (4 < ETX < 10)" ++msgstr "" ++ ++#, fuzzy ++msgid "Success rate of packages received from the neighbour" ++msgstr "Wartość poprawnie otrzymanych od sąsiada pakietów" ++ ++#, fuzzy ++msgid "Success rate of packages sent to the neighbour" ++msgstr "Wartość poprawnie wysłanych pakietów do sąsiada" ++ ++msgid "TC" ++msgstr "TC" ++ ++msgid "TC interval" ++msgstr "Interwał TC" ++ ++msgid "TC validity time" ++msgstr "Czas poprawności TC" ++ ++msgid "TOS value" ++msgstr "Wartość TOS" ++ ++msgid "" ++"The OLSR daemon is an implementation of the Optimized Link State Routing " ++"protocol. As such it allows mesh routing for any network equipment. It runs " ++"on any wifi card that supports ad-hoc mode and of course on any ethernet " ++"device. Visit olsrd.org for help and " ++"documentation." ++msgstr "" ++ ++msgid "" ++"The fixed willingness to use. If not set willingness will be calculated " ++"dynamically based on battery/power status. Default is \"3\"." ++msgstr "" ++ ++msgid "The interface OLSRd should serve." ++msgstr "Interfejs, który powinien oferować OLSRd." ++ ++msgid "" ++"The port OLSR uses. This should usually stay at the IANA assigned port 698. " ++"It can have a value between 1 and 65535." ++msgstr "" ++"Port używany przez OLSR. Zwykle powinien pozostać na przydzielonym przez " ++"IANA porcie 698. Może mieć wartość pomiędzy 1 a 65535." ++ ++msgid "" ++"This can be used to signal the external IPv6 prefix of the uplink to the " ++"clients. This might allow a client to change it's local IPv6 address to use " ++"the IPv6 gateway without any kind of address translation. The maximum prefix " ++"length is 64 bits. Default is \"::/0\" (no prefix)." ++msgstr "" ++ ++msgid "Timing and Validity" ++msgstr "" ++ ++msgid "Topology" ++msgstr "Topologia" ++ ++msgid "" ++"Type of service value for the IP header of control traffic. Default is " ++"\"16\"." ++msgstr "" ++ ++msgid "Unable to connect to the OLSR daemon!" ++msgstr "Połączenie z demonem OLSR nieudane!" ++ ++msgid "Uplink" ++msgstr "Uplink" ++ ++msgid "Uplink uses NAT" ++msgstr "Uplink używa NAT" ++ ++msgid "Use hysteresis" ++msgstr "Używaj histerezy" ++ ++msgid "Validity Time" ++msgstr "" ++ ++msgid "Version" ++msgstr "Wersja" ++ ++msgid "Very good (ETX < 2)" ++msgstr "" ++ ++msgid "Very good (SNR > 30)" ++msgstr "" ++ ++msgid "WLAN" ++msgstr "WLAN" ++ ++msgid "" ++"Warning: kmod-ipip is not installed. Without kmod-ipip SmartGateway will not " ++"work, please install it." ++msgstr "" ++"Uwaga: kmod-ipip nie jest zainstalowany. Bez kmod-ipip bramy SmartGateway " ++"nie będą działać. Proszę go zainstalować." ++ ++msgid "Weight" ++msgstr "Waga" ++ ++msgid "" ++"When multiple links exist between hosts the weight of interface is used to " ++"determine the link to use. Normally the weight is automatically calculated " ++"by olsrd based on the characteristics of the interface, but here you can " ++"specify a fixed value. Olsrd will choose links with the lowest value.
    Note: Interface weight is used only when LinkQualityLevel is set to " ++"0. For any other value of LinkQualityLevel, the interface ETX value is used " ++"instead." ++msgstr "" ++"Kiedy istnieje wiele połączeń między hostami, waga interfejsów określa, " ++"którego z nich użyć. Zwykle jest liczona automatycznie przez olsrd opartym " ++"na charakterystyce interfejsu, ale tu możesz podać stałą wartość. Olsrd " ++"wybierze połączenie z najniższą wartością.
    Uwaga: Waga " ++"interfejsu jest używana tylko kiedy LinkQualityLevel jest ustawione na 0. " ++"Dla dowolnej innej wartości LinkQualityLevel, zamiast tego jest używana " ++"wartość ETX." ++ ++msgid "" ++"Which kind of uplink is exported to the other mesh nodes. An uplink is " ++"detected by looking for a local HNA of 0.0.0.0/0, ::ffff:0:0/96 or 2000::/3. " ++"Default setting is \"both\"." ++msgstr "" ++ ++msgid "" ++"Which kind of uplink is exported to the other mesh nodes. An uplink is " ++"detected by looking for a local HNA6 ::ffff:0:0/96 or 2000::/3. Default " ++"setting is \"both\"." ++msgstr "" ++ ++msgid "Willingness" ++msgstr "Gotowość" ++ ++msgid "Yellow" ++msgstr "" ++ ++msgid "no" ++msgstr "" ++ ++msgid "yes" ++msgstr "" ++ ++#~ msgid "Device" ++#~ msgstr "Urządzenie" ++ ++#~ msgid "" ++#~ "Make sure that OLSRd is running, the \"txtinfo\" plugin is loaded, " ++#~ "configured on port 2006 and accepts connections from \"127.0.0.1\"." ++#~ msgstr "" ++#~ "Upewnij się że OLSRd jest uruchomione, \"txtinfo\" plugin jest " ++#~ "załadowany, skonfigurowany na porcie 2006 i akceptuje połączenia z " ++#~ "127.0.0.1 (localhost)" +diff --git a/feeds/luci/applications/luci-app-olsr/po/pt-br/olsr.po b/feeds/luci/applications/luci-app-olsr/po/pt-br/olsr.po +new file mode 100644 +index 0000000..1461c1d +--- /dev/null ++++ b/feeds/luci/applications/luci-app-olsr/po/pt-br/olsr.po +@@ -0,0 +1,906 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Report-Msgid-Bugs-To: \n" ++"POT-Creation-Date: 2009-06-10 03:41+0200\n" ++"PO-Revision-Date: 2014-06-21 19:36+0200\n" ++"Last-Translator: Éder \n" ++"Language-Team: LANGUAGE \n" ++"Language: pt_BR\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n > 1);\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "Active MID announcements" ++msgstr "" ++"Anúncios MID ativos" ++ ++msgid "Active OLSR nodes" ++msgstr "Nós OLSR ativos" ++ ++msgid "Active host net announcements" ++msgstr "Anúncios ativos de equipamentos" ++ ++msgid "Advanced Settings" ++msgstr "Configurações Avançadas" ++ ++msgid "Allow gateways with NAT" ++msgstr "Permitir rotadores com NAT" ++ ++msgid "Allow the selection of an outgoing ipv4 gateway with NAT" ++msgstr "Permitir a seleção de rotador de saída IPv4 com NAT" ++ ++msgid "Announce uplink" ++msgstr "Anunciar enlace superior (uplink)" ++ ++msgid "Announced network" ++msgstr "Rede anunciada" ++ ++# 20140621: edersg: tradução ++msgid "Bad (ETX > 10)" ++msgstr "Ruim (ETX > 10)" ++ ++# 20140621: edersg: tradução ++msgid "Bad (SNR < 5)" ++msgstr "Ruim (SNR < 5)" ++ ++msgid "Both values must use the dotted decimal notation." ++msgstr "Ambos os valores devem usar a notação decimal com pontos." ++ ++msgid "Broadcast address" ++msgstr "Endereço de broadcast" ++ ++# 20140621: edersg: tradução ++msgid "Can only be a valid IPv4 or IPv6 address or 'default'" ++msgstr "" ++"Somente pode ser um endereço IPv4 ou IPv6 válidos ou um endereço 'padrão'" ++ ++# 20140621: edersg: tradução ++#, fuzzy ++msgid "Can only be a valid IPv6 address or 'default'" ++msgstr "" ++"Somente pode ser um endereço IPv4 ou IPv6 válidos ou um endereço 'padrão'" ++ ++msgid "Configuration" ++msgstr "Configuração" ++ ++# 20140621: edersg: tradução ++msgid "" ++"Could not get any data. Make sure the jsoninfo plugin is installed and " ++"allows connections from localhost." ++msgstr "" ++"Não foi possível obter nenhuma informação. Certifique-se que a extensão " ++"jsoninfo está instalada e permite conexões a partir da sua máquina local " ++"(localhost)." ++ ++msgid "Display" ++msgstr "Visão" ++ ++msgid "Downlink" ++msgstr "Enlace inferior (downlink)" ++ ++# I didn't find in GUI this one ++msgid "Download Config" ++msgstr "Configuração do Recebimento de Dados " ++ ++msgid "ETX" ++msgstr "ETX" ++ ++msgid "Enable" ++msgstr "Habilitar" ++ ++msgid "" ++"Enable SmartGateway. If it is disabled, then all other SmartGateway " ++"parameters are ignored. Default is \"no\"." ++msgstr "" ++"Habilita o SmartGateway. Se isto está desabilitado, então todos os demais " ++"parâmetros do SmartGateway são ignorados. Padrão é \"não\"." ++ ++msgid "Enable this interface." ++msgstr "Habilita esta interface." ++ ++msgid "Enabled" ++msgstr "Habilitado" ++ ++msgid "Expected retransmission count" ++msgstr "Contagem esperada de retransmissões" ++ ++msgid "FIB metric" ++msgstr "Métrica FIB" ++ ++msgid "" ++"FIBMetric controls the metric value of the host-routes OLSRd sets. \"flat\" " ++"means that the metric value is always 2. This is the preferred value because " ++"it helps the linux kernel routing to clean up older routes. \"correct\" uses " ++"the hopcount as the metric value. \"approx\" use the hopcount as the metric " ++"value too, but does only update the hopcount if the nexthop changes too. " ++"Default is \"flat\"." ++msgstr "" ++"A métrica FIB controla o valor da métrica dos conjuntos de equipamentos-" ++"roteadores. \"flat\" significa que o valor da métrica é sempre 2. Este é o " ++"valor preferido porque ele ajuda o roteamento do kernel do Linux limpar as " ++"rotas antigas. \"correct\" usa a contagem de saltos como valor da métrica. " ++"\"approx\" também usa a contagem de saltos como métrica, mas somente " ++"atualiza a contagem de saltos se o próximo salto também mudar. O padrão é " ++"\"flat\"." ++ ++msgid "Fisheye mechanism for TCs (checked means on). Default is \"on\"" ++msgstr "" ++"Mecanismo Fisheye para TCs (marcado significa ligado). O padrão é \"ligado\"" ++ ++msgid "Gateway" ++msgstr "Roteador" ++ ++msgid "General Settings" ++msgstr "Configurações Gerais" ++ ++msgid "General settings" ++msgstr "Configurações gerais" ++ ++# 20140621: edersg: tradução ++msgid "Good (2 < ETX < 4)" ++msgstr "Bom (2 < ETX < 4)" ++ ++# 20140621: edersg: tradução ++msgid "Good (30 > SNR > 20)" ++msgstr "Bom (30 > SNR > 20)" ++ ++# 20140621: edersg: tradução ++msgid "Green" ++msgstr "Verde" ++ ++msgid "HNA" ++msgstr "" ++"HNA" ++ ++msgid "HNA Announcements" ++msgstr "" ++"Anúncios do HNA" ++ ++msgid "HNA interval" ++msgstr "" ++"Intervalo entre HNA" ++ ++msgid "HNA validity time" ++msgstr "" ++"Validade do HNA" ++ ++#, fuzzy ++msgid "HNA6 Announcements" ++msgstr "" ++"Anúncios do HNA" ++ ++msgid "Hello" ++msgstr "Saudação (Hello)" ++ ++msgid "Hello interval" ++msgstr "Intervalo entre Saudações (Hello)" ++ ++msgid "Hello validity time" ++msgstr "Validade da Saudação (Hello)" ++ ++# 20140621: edersg: tradução ++msgid "Hide IPv4" ++msgstr "Ocultar IPv4" ++ ++# 20140621: edersg: tradução ++msgid "Hide IPv6" ++msgstr "Ocultar IPv6" ++ ++msgid "Hna4" ++msgstr "Hna4" ++ ++msgid "Hna6" ++msgstr "Hna6" ++ ++msgid "Hops" ++msgstr "Saltos" ++ ++msgid "Hostname" ++msgstr "Nome do equipamento" ++ ++msgid "" ++"Hosts in a OLSR routed network can announce connecitivity to external " ++"networks using HNA messages." ++msgstr "" ++"Equipamentos em uma rede roteada por OLSR podem anunciar conectividade para " ++"redes externas usando mensagens HNA." ++ ++#, fuzzy ++msgid "" ++"Hosts in a OLSR routed network can announce connecitivity to external " ++"networks using HNA6 messages." ++msgstr "" ++"Equipamentos em uma rede roteada por OLSR podem anunciar conectividade para " ++"redes externas usando mensagens HNA." ++ ++# Hysteresis é Histerese que significa "retardo" ++msgid "" ++"Hysteresis for link sensing (only for hopcount metric). Hysteresis adds more " ++"robustness to the link sensing but delays neighbor registration. Defaults is " ++"\"yes\"" ++msgstr "" ++"Retardo para a sensibilidade do enlace (somente para a métrica de contagem " ++"de saltos), Retardo incrementa a robustez da sensibilidade do enlace mas " ++"atrasa o registro dos vizinhos. O padrão é \"sim\"" ++ ++msgid "IP Addresses" ++msgstr "Endereços IP" ++ ++msgid "" ++"IP-version to use. If 6and4 is selected then one olsrd instance is started " ++"for each protocol." ++msgstr "" ++"Versão do IP para usar. Se 6and4 for selecionado, então uma instância é " ++"disparada para cada protocolo." ++ ++msgid "IPv4" ++msgstr "IPv4" ++ ++msgid "IPv4 broadcast" ++msgstr "Endereço IPv4 de Broadcast" ++ ++msgid "" ++"IPv4 broadcast address for outgoing OLSR packets. One useful example would " ++"be 255.255.255.255. Default is \"0.0.0.0\", which triggers the usage of the " ++"interface broadcast IP." ++msgstr "" ++"Endereço IPv5 de broadcast para a saída de pacotes OLSR. Um exemplo útil " ++"seria 255.255.255.255. O padrão é \"0.0.0.0\", que indica o uso do endereço " ++"IP de broadcast da interface." ++ ++msgid "IPv4 source" ++msgstr "Origem IPv4" ++ ++msgid "" ++"IPv4 src address for outgoing OLSR packages. Default is \"0.0.0.0\", which " ++"triggers usage of the interface IP." ++msgstr "" ++"Endereço IPv4 de origem para a saída de pacotes OLSR. Um exemplo útil seria " ++"255.255.255.255. O padrão é \"0.0.0.0\", que indica o uso do endereço IP da " ++"interface." ++ ++msgid "IPv6" ++msgstr "IPv6" ++ ++msgid "IPv6 multicast" ++msgstr "Multicast IPv6" ++ ++msgid "" ++"IPv6 multicast address. Default is \"FF02::6D\", the manet-router linklocal " ++"multicast." ++msgstr "" ++"Endereço de multicast IPv6. O padrão é \"FF02::6D\", o multicast do enlace " ++"local do roteador MANET." ++ ++msgid "" ++"IPv6 network must be given in full notation, prefix must be in CIDR notation." ++msgstr "" ++"A rede IPv6 deve ser informada em notação completa. O prefixo deve ser em " ++"notação CIDR." ++ ++msgid "IPv6 source" ++msgstr "Origem IPv6" ++ ++msgid "" ++"IPv6 src prefix. OLSRd will choose one of the interface IPs which matches " ++"the prefix of this parameter. Default is \"0::/0\", which triggers the usage " ++"of a not-linklocal interface IP." ++msgstr "" ++"Prefixo de origem IPv6. O OLSRd escolherá um dos IPs da interface que casam " ++"com o prefixo do parâmetro. O padrão é \"0::/0\", que faz com que seja usado " ++"um endereço IP não local da interface." ++ ++msgid "IPv6-Prefix of the uplink" ++msgstr "Prefixo IPv6 do enlace superior (uplink)" ++ ++msgid "" ++"If the route to the current gateway is to be changed, the ETX value of this " ++"gateway is multiplied with this value before it is compared to the new one. " ++"The parameter can be a value between 0.1 and 1.0, but should be close to 1.0 " ++"if changed.
    WARNING: This parameter should not be used together " ++"with the etx_ffeth metric!
    Defaults to \"1.0\"." ++msgstr "" ++"Se a rota para o roteador está para ser alterada, o valor ETX deste roteador " ++"é multiplicado com o este valor antes que ele seja comparado com o novo " ++"valor. O parâmetro pode ser um valor entre 0.1 e 1.0, mas deve ser próximo a " ++"1.0 se alterado..
    CUIDADO: Este parâmetro não deve ser usado em " ++"conjunto com a métrica etx_ffeth!
    O padrão é \"1.0\"." ++ ++msgid "" ++"If this Node uses NAT for connections to the internet. Default is \"yes\"." ++msgstr "Se este Nó usa NAT para conexões com a internet. Padrão é \"sim\"." ++ ++msgid "Interface" ++msgstr "Interface" ++ ++msgid "" ++"Interface Mode is used to prevent unnecessary packet forwarding on switched " ++"ethernet interfaces. valid Modes are \"mesh\" and \"ether\". Default is " ++"\"mesh\"." ++msgstr "" ++"Modo da Interface é usado para evitar o encaminhamento desnecessário de " ++"pacotes na interface ethernet em ponte. Os modos válidos são \"mesh\" e " ++"\"ether\". O padrão é \"mesh\"." ++ ++msgid "Interfaces" ++msgstr "Interfaces" ++ ++msgid "Interfaces Defaults" ++msgstr "Padrões da Interface" ++ ++msgid "Internet protocol" ++msgstr "Protocolo internet" ++ ++msgid "" ++"Interval to poll network interfaces for configuration changes (in seconds). " ++"Default is \"2.5\"." ++msgstr "" ++"Intervalo para consultar as interfaces de rede por mudanças nas " ++"configurações (em segundos). O padrão é \"2.5\"." ++ ++# 20140621: edersg: tradução ++msgid "Invalid Value for LQMult-Value. Must be between 0.01 and 1.0." ++msgstr "Valor inválido para LQMult-Value. Deve estar entre 0.01 e 1.0." ++ ++# 20140621: edersg: tradução ++msgid "" ++"Invalid Value for LQMult-Value. You must use a decimal number between 0.01 " ++"and 1.0 here." ++msgstr "" ++"Valor inválido para LQMult-Value. Você deve utilizar aqui um número decimal " ++"entre 0.01 e 1.0." ++ ++msgid "Known OLSR routes" ++msgstr "Rotas OLSR conhecidas" ++ ++msgid "LQ" ++msgstr "LQ" ++ ++msgid "LQ aging" ++msgstr "" ++"Envelhecimento do LQ" ++ ++msgid "LQ algorithm" ++msgstr "Algoritmo LQ" ++ ++msgid "LQ fisheye" ++msgstr "Fisheye LQ" ++ ++msgid "LQ level" ++msgstr "Nível LQ" ++ ++# 20140621: edersg: tradução ++msgid "" ++"LQMult requires two values (IP address or 'default' and multiplicator) " ++"seperated by space." ++msgstr "" ++"LQMult exige dois valores (endereço IP ou 'padrão' e multiplicador) " ++"separados por espaços." ++ ++msgid "Last hop" ++msgstr "Último salto" ++ ++msgid "Legend" ++msgstr "Legenda" ++ ++msgid "Library" ++msgstr "Biblioteca" ++ ++msgid "Link Quality Settings" ++msgstr "Configurações da Qualidade do Enlace" ++ ++msgid "" ++"Link quality aging factor (only for lq level 2). Tuning parameter for " ++"etx_float and etx_fpm, smaller values mean slower changes of ETX value. " ++"(allowed values are between 0.01 and 1.0)" ++msgstr "" ++"O fator de envelhecimento da qualidade do enlace (somente para LQ nível 2). Parâmtro de ajuste " ++"para etx_float e etx_fpm, Valores menores significam mudanças mais lentas do " ++"valor ETX. (permitido valores entre 0.01 e 1.0)" ++ ++msgid "" ++"Link quality algorithm (only for lq level 2).
    etx_float: " ++"floating point ETX with exponential aging
    etx_fpm : same as " ++"etx_float, but with integer arithmetic
    etx_ff : ETX freifunk, an " ++"etx variant which use all OLSR traffic (instead of only hellos) for ETX " ++"calculation
    etx_ffeth: incompatible variant of etx_ff that " ++"allows ethernet links with ETX 0.1.
    Defaults to \"etx_ff\"" ++msgstr "" ++"Algoritmo de qualidade do enlace (somente para LQ nível 2).
    etx_float: ETX ponto " ++"flutuante com o envelhecimento exponencial
    etx_fpm : o mesmo que " ++"etx_float, mas com aritmética inteira
    etx_ff : ETX freifunk, uma " ++"variante do etx que usa todo tráfego OLSE (ao invés de somente as saudações) " ++"para o cálculo do ETX
    etx_ffeth: variação incompatível do etx_ff " ++"que permite enlaces ethernet com ETX 0.1.
    O padrão é \"etx_ff\"" ++ ++msgid "" ++"Link quality level switch between hopcount and cost-based (mostly ETX) " ++"routing.
    0 = do not use link quality
    2 = use link " ++"quality for MPR selection and routing
    Default is \"2\"" ++msgstr "" ++"O nível de qualidade do enlace escolhe entre o roteamento por contagem de " ++"saltos e o roteamento baseado em custos (na sua maioria, ETX).
    0 = não use a qualidade do enlace
    2 = use a qualidade do enlace " ++"para a seleção do MPR e roteamento
    O padrão é \"2\"" ++ ++msgid "LinkQuality Multiplicator" ++msgstr "Multiplicador da Qualidade do Enlace" ++ ++msgid "Links per node (average)" ++msgstr "Enlaces por nó (média)" ++ ++msgid "Links total" ++msgstr "Total de enlaces" ++ ++msgid "Local interface IP" ++msgstr "Endereço IP da interface local" ++ ++msgid "MID" ++msgstr "" ++"MID" ++ ++msgid "MID interval" ++msgstr "" ++"Intervalo do MID" ++ ++msgid "MID validity time" ++msgstr "" ++"Validade do MID" ++ ++msgid "MTU" ++msgstr "MTU" ++ ++msgid "Main IP" ++msgstr "IP Principal" ++ ++# 20140621: edersg: tradução ++msgid "" ++"Make sure that OLSRd is running, the \"jsoninfo\" plugin is loaded, " ++"configured on port 9090 and accepts connections from \"127.0.0.1\"." ++msgstr "" ++"Certifique-se de que a extensão \"jsoninfo\" esteja carregada e o serviço " ++"OLSRd esteja rodando e configurado na porta 9090 aceitando conexões a partir " ++"de \"127.0.0.1\"." ++ ++msgid "Metric" ++msgstr "Métrica" ++ ++msgid "Mode" ++msgstr "Modo" ++ ++# 20140621: edersg: tradução ++msgid "" ++"Multiply routes with the factor given here. Allowed values are between 0.01 " ++"and 1.0. It is only used when LQ-Level is greater than 0. Examples:
    reduce LQ to 192.168.0.1 by half: 192.168.0.1 0.5
    reduce LQ to all " ++"nodes on this interface by 20%: default 0.8" ++msgstr "" ++"Múltiplas rotas com o fator configurado aqui. Os valores permitidos estão " ++"entre 0.01 e 1.0. Ele somente é utilizado quando o nível-LQ é maior que 0. " ++"Exemplos:
    reduzir LQ para 192.168.0.1 pela metade: 192.168.0.1 0.5
    reduzir LQ para todos os nós nesta interface em 20%: padrão 0.8" ++ ++# 20140621: edersg: tradução ++#, fuzzy ++msgid "" ++"Multiply routes with the factor given here. Allowed values are between 0.01 " ++"and 1.0. It is only used when LQ-Level is greater than 0. Examples:
    reduce LQ to fd91:662e:3c58::1 by half: fd91:662e:3c58::1 0.5
    reduce " ++"LQ to all nodes on this interface by 20%: default 0.8" ++msgstr "" ++"Múltiplas rotas com o fator configurado aqui. Os valores permitidos estão " ++"entre 0.01 e 1.0. Ele somente é utilizado quando o nível-LQ é maior que 0. " ++"Exemplos:
    reduzir LQ para 192.168.0.1 pela metade: 192.168.0.1 0.5
    reduzir LQ para todos os nós nesta interface em 20%: padrão 0.8" ++ ++msgid "NAT threshold" ++msgstr "Limiar do NAT" ++ ++msgid "NLQ" ++msgstr "" ++"NLQ" ++ ++msgid "Neighbors" ++msgstr "Vizinhos" ++ ++msgid "Neighbour IP" ++msgstr "Endereço IP do Vizinho" ++ ++msgid "Neighbours" ++msgstr "Vizinhos" ++ ++msgid "Netmask" ++msgstr "Máscara de rede" ++ ++msgid "Network" ++msgstr "Rede" ++ ++msgid "Network address" ++msgstr "Endereço de rede" ++ ++msgid "Nic changes poll interval" ++msgstr "Intervalo de consulta de mudanças na placa de rede" ++ ++msgid "Nodes" ++msgstr "Nós" ++ ++msgid "OLSR" ++msgstr "OLSR" ++ ++msgid "OLSR - Display Options" ++msgstr "OLSR - Opções de Visão" ++ ++msgid "OLSR - HNA-Announcements" ++msgstr "" ++"OLSR - Anúncios HNA" ++ ++#, fuzzy ++msgid "OLSR - HNA6-Announcements" ++msgstr "" ++"OLSR - Anúncios HNA" ++ ++msgid "OLSR - Plugins" ++msgstr "OLSR - Plugins" ++ ++msgid "OLSR Daemon" ++msgstr "Servidor OLSR" ++ ++msgid "OLSR Daemon - Interface" ++msgstr "Servidor OLSR - Interface" ++ ++msgid "OLSR connections" ++msgstr "Conexões do OLSR" ++ ++msgid "OLSR gateway" ++msgstr "Roteador OLSR" ++ ++msgid "OLSR node" ++msgstr "Nó OLSR" ++ ++# 20140621: edersg: tradução ++msgid "Orange" ++msgstr "Laranja" ++ ++msgid "Overview" ++msgstr "Visão Geral" ++ ++msgid "Overview of currently active OLSR host net announcements" ++msgstr "Visão geral os anúncios de rede de equipamentos OLSR atualmente ativos" ++ ++msgid "Overview of currently established OLSR connections" ++msgstr "Visão geral das conexões OLSR atualmente estabelecidas" ++ ++msgid "Overview of currently known OLSR nodes" ++msgstr "Visão geral dos nós OLSR conhecidos atualmente" ++ ++msgid "Overview of currently known routes to other OLSR nodes" ++msgstr "Visão geral das rotas conhecidas atualmente para outros nós OLSR" ++ ++msgid "Overview of interfaces where OLSR is running" ++msgstr "Visão geral das interfaces onde o OLSR está rodando" ++ ++msgid "Overview of known multiple interface announcements" ++msgstr "Visão geral de anúncios de nós com múltiplas interfaces conhecidas" ++ ++msgid "Overview of smart gateways in this network" ++msgstr "Visão geral dos SmartGateways na rede" ++ ++msgid "Plugin configuration" ++msgstr "Configuração do Plugin" ++ ++msgid "Plugins" ++msgstr "Plugins" ++ ++# Que socket? ++msgid "Polling rate for OLSR sockets in seconds. Default is 0.05." ++msgstr "Taxa de consulta por conexões OLSR, em segundos. Padrão é 0.05." ++ ++msgid "Pollrate" ++msgstr "Taxa de consulta" ++ ++msgid "Port" ++msgstr "Porta" ++ ++msgid "Prefix" ++msgstr "Prefixo" ++ ++# 20140621: edersg: tradução ++msgid "Red" ++msgstr "Vermelho" ++ ++msgid "Resolve" ++msgstr "Resolver" ++ ++msgid "" ++"Resolve hostnames on status pages. It is generally safe to allow this, but " ++"if you use public IPs and have unstable DNS-Setup then those pages will load " ++"really slow. In this case disable it here." ++msgstr "" ++"Resolve os nomes dos equipamentos na página de estado. É geralmente seguro " ++"permitir isto, mas se você usa IPs públicos e tem uma configuração DNS " ++"instável, então estas páginas podem carregar de forma extremamente lenta. " ++"Neste caso, desabilite isto aqui." ++ ++msgid "Routes" ++msgstr "Rotas" ++ ++msgid "Secondary OLSR interfaces" ++msgstr "Interfaces OLSR secundárias" ++ ++msgid "" ++"Sets the main IP (originator ip) of the router. This IP will NEVER change " ++"during the uptime of olsrd. Default is 0.0.0.0, which triggers usage of the " ++"IP of the first interface." ++msgstr "" ++"Define o IP principal (ip originador) do seu roteador. Este IP nunca muda " ++"durante o funcionamento do olsrd. O padrão é 0.0.0.0, que faz com que o " ++"endereço da primeira interface seja usado." ++ ++#, fuzzy ++msgid "" ++"Sets the main IP (originator ip) of the router. This IP will NEVER change " ++"during the uptime of olsrd. Default is ::, which triggers usage of the IP of " ++"the first interface." ++msgstr "" ++"Define o IP principal (ip originador) do seu roteador. Este IP nunca muda " ++"durante o funcionamento do olsrd. O padrão é 0.0.0.0, que faz com que o " ++"endereço da primeira interface seja usado." ++ ++# 20140621: edersg: tradução ++msgid "Show IPv4" ++msgstr "Exibir IPv4" ++ ++# 20140621: edersg: tradução ++msgid "Show IPv6" ++msgstr "Exibir IPv6" ++ ++# 20140621: edersg: tradução ++msgid "Signal Noise Ratio in dB" ++msgstr "Relação do ruído do sinal em dB" ++ ++msgid "SmartGW" ++msgstr "SmartGW" ++ ++msgid "SmartGW announcements" ++msgstr "Anúncios do SmartGW" ++ ++msgid "SmartGateway is not configured on this system." ++msgstr "SmartGateway não está configurado no seu sistema." ++ ++msgid "Source address" ++msgstr "Endereço de origem" ++ ++msgid "" ++"Specifies the speed of the uplink in kilobits/s. First parameter is " ++"upstream, second parameter is downstream. Default is \"128 1024\"." ++msgstr "" ++"Especifica a velocidade do enlace superior (uplink) em kilobits/s. O " ++"primeiro parâmetro é a taxa de envio (upstream) e o segundo parâmetro é a " ++"taxa de recebimento (downstream). O padrão é \"128 1024\"." ++ ++msgid "Speed of the uplink" ++msgstr "Velocidade do enlace superior" ++ ++msgid "State" ++msgstr "Estado" ++ ++msgid "Status" ++msgstr "Estado" ++ ++# 20140621: edersg: tradução ++msgid "Still usable (20 > SNR > 5)" ++msgstr "Ainda utilizável (20 > SNR > 5)" ++ ++# 20140621: edersg: tradução ++msgid "Still usable (4 < ETX < 10)" ++msgstr "Ainda utilizável (4 > ETX > 10)" ++ ++msgid "Success rate of packages received from the neighbour" ++msgstr "Taxa de sucesso de pacotes recebidos de vizinhos" ++ ++msgid "Success rate of packages sent to the neighbour" ++msgstr "Taxa de sucesso de pacotes enviados a vizinhos" ++ ++msgid "TC" ++msgstr "TC" ++ ++msgid "TC interval" ++msgstr "" ++"Intervalo do TC" ++ ++msgid "TC validity time" ++msgstr "" ++"Validade do TC" ++ ++msgid "TOS value" ++msgstr "Valor do TOS" ++ ++msgid "" ++"The OLSR daemon is an implementation of the Optimized Link State Routing " ++"protocol. As such it allows mesh routing for any network equipment. It runs " ++"on any wifi card that supports ad-hoc mode and of course on any ethernet " ++"device. Visit olsrd.org for help and " ++"documentation." ++msgstr "" ++"O servidor OLSR é uma implementação do protoloco de Roteamento de Estado de " ++"Enlace Otimizado. Como tal, ele permite o roteamento em malha para qualquer " ++"equipamento de rede. Ele roda sobre qualquer placa de rede sem fio que " ++"suporte o modo ad-hoc e, é claro, em qualquer dispositivo ethernet. Visite " ++"olsrd.org para ajuda e documentação." ++ ++msgid "" ++"The fixed willingness to use. If not set willingness will be calculated " ++"dynamically based on battery/power status. Default is \"3\"." ++msgstr "" ++"A disponibilidade fixa para ser usada. Se a disponibilidade não for " ++"definida, ela será dinamicamente calculada baseada no estado da energia/" ++"bateria, O padrão é \"3\"." ++ ++msgid "The interface OLSRd should serve." ++msgstr "A interface onde o OLSRd deve servir." ++ ++msgid "" ++"The port OLSR uses. This should usually stay at the IANA assigned port 698. " ++"It can have a value between 1 and 65535." ++msgstr "" ++"A porta que o OLSR usa. Isto geralmente deve ficar na porta 698, designada " ++"pela IANA. Pode ter qualquer valor entre 1 e 65535." ++ ++msgid "" ++"This can be used to signal the external IPv6 prefix of the uplink to the " ++"clients. This might allow a client to change it's local IPv6 address to use " ++"the IPv6 gateway without any kind of address translation. The maximum prefix " ++"length is 64 bits. Default is \"::/0\" (no prefix)." ++msgstr "" ++"Isto pode ser usado para sinalizar o prefixo IPv6 externo do enlace superior " ++"(uplink) para os clientes. Isto pode permitir que um cliente mude o endereço " ++"IPv6 local para usar o roteador IPv6 sem qualquer tradução de endereços. O " ++"tamanho máximo do prefixo é 64 bits. O padrão é \"::/0\" (nenhum prefixo)." ++ ++msgid "Timing and Validity" ++msgstr "Temporização e Validade" ++ ++msgid "Topology" ++msgstr "Topologia" ++ ++msgid "" ++"Type of service value for the IP header of control traffic. Default is " ++"\"16\"." ++msgstr "" ++"Valor do tipo de serviço para o cabeçalho IP para controle de tráfego. O " ++"padrao é \"16\"." ++ ++msgid "Unable to connect to the OLSR daemon!" ++msgstr "Não foi possível conectar ao servidor OLSR!" ++ ++msgid "Uplink" ++msgstr "Enlace superior (uplink)" ++ ++msgid "Uplink uses NAT" ++msgstr "Enlace superior (uplink) usa NAT" ++ ++msgid "Use hysteresis" ++msgstr "Usar retardo" ++ ++# 20140621: edersg: tradução ++msgid "Validity Time" ++msgstr "Tempo de validade" ++ ++msgid "Version" ++msgstr "Versão" ++ ++# 20140621: edersg: tradução ++msgid "Very good (ETX < 2)" ++msgstr "Muito bom (ETX < 2)" ++ ++# 20140621: edersg: tradução ++msgid "Very good (SNR > 30)" ++msgstr "Muito bom (SNR > 30)" ++ ++msgid "WLAN" ++msgstr "Rede sem fio (WLAN)" ++ ++msgid "" ++"Warning: kmod-ipip is not installed. Without kmod-ipip SmartGateway will not " ++"work, please install it." ++msgstr "" ++"Atenção: o kmod-ipip não está instalado. Sem o kmod-ipip, o SmartGateway não " ++"irá funcionar. Por favor, instale-o." ++ ++msgid "Weight" ++msgstr "Peso" ++ ++msgid "" ++"When multiple links exist between hosts the weight of interface is used to " ++"determine the link to use. Normally the weight is automatically calculated " ++"by olsrd based on the characteristics of the interface, but here you can " ++"specify a fixed value. Olsrd will choose links with the lowest value.
    Note: Interface weight is used only when LinkQualityLevel is set to " ++"0. For any other value of LinkQualityLevel, the interface ETX value is used " ++"instead." ++msgstr "" ++"Quando múltiplos enlaces existirem entre dois equipamentos, o peso da " ++"interface é usado para determinar o enlace usado. Normalmente, o peso é " ++"automaticamente calculado pelo olsrd baseado nas características da " ++"interface, mas aqui você pode especificar um valor fixo. Olsrd escolherá " ++"enlaces com o valor mais baixo.
    Nota: O peso da interface é " ++"usado somente quando o nível de qualidade do enlace está definido como 0. " ++"Para qualquer outro valor do nível de qualidade do enlace, o valor ETX da " ++"interface é usado." ++ ++msgid "" ++"Which kind of uplink is exported to the other mesh nodes. An uplink is " ++"detected by looking for a local HNA of 0.0.0.0/0, ::ffff:0:0/96 or 2000::/3. " ++"Default setting is \"both\"." ++msgstr "" ++"Que tipo de enlace superior (uplink) é exportado para outros nós da rede em " ++"malha. Um enlace superior é detectado buscando por uma HNA " ++"local de 0.0.0.0/0, ::ffff:0:0/96 ou 2000::/3. O padrão é \"ambos\"." ++ ++#, fuzzy ++msgid "" ++"Which kind of uplink is exported to the other mesh nodes. An uplink is " ++"detected by looking for a local HNA6 ::ffff:0:0/96 or 2000::/3. Default " ++"setting is \"both\"." ++msgstr "" ++"Que tipo de enlace superior (uplink) é exportado para outros nós da rede em " ++"malha. Um enlace superior é detectado buscando por uma HNA " ++"local de 0.0.0.0/0, ::ffff:0:0/96 ou 2000::/3. O padrão é \"ambos\"." ++ ++msgid "Willingness" ++msgstr "Disponibilidade" ++ ++msgid "Yellow" ++msgstr "Amarelo" ++ ++msgid "no" ++msgstr "Não" ++ ++msgid "yes" ++msgstr "Sim" ++ ++#~ msgid "Device" ++#~ msgstr "Dispositivo" ++ ++#~ msgid "" ++#~ "Make sure that OLSRd is running, the \"txtinfo\" plugin is loaded, " ++#~ "configured on port 2006 and accepts connections from \"127.0.0.1\"." ++#~ msgstr "" ++#~ "Certifique-se que o processo OLSRd está em execução, que o plugin " ++#~ "\"txtinfo\" está carregado e configurado para a porta 2006 e que aceita " ++#~ "conexões a partir de \"127.0.0.1\"." ++ ++#~ msgid "" ++#~ "Multiply routes with the factor given here. Allowed values are between " ++#~ "0.01 and 1. It is only used when LQ-Level is greater than 0. Examples:" ++#~ "
    reduce LQ to 192.168.0.1 by half: 192.168.0.1 0.5
    reduce LQ to " ++#~ "all nodes on this interface by 20%: default 0.8" ++#~ msgstr "" ++#~ "Multiplica rotas com o fator informado. Os valores válidos são entre 0.01 " ++#~ "e 1. Somente é usado quando o nível LQ é maior que 0. Exemplos:
    reduzir o LQ para 192.168.0.1 pela " ++#~ "metade: 192.168.0.1 0.5
    reduzir o LQ de todos os nós desta interface para 20%: " ++#~ "Padrão 0.8" +diff --git a/feeds/luci/applications/luci-app-olsr/po/pt/olsr.po b/feeds/luci/applications/luci-app-olsr/po/pt/olsr.po +new file mode 100644 +index 0000000..4e04248 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-olsr/po/pt/olsr.po +@@ -0,0 +1,715 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Report-Msgid-Bugs-To: \n" ++"POT-Creation-Date: 2009-05-26 19:03+0200\n" ++"PO-Revision-Date: 2013-06-03 16:17+0200\n" ++"Last-Translator: joao.f.vieira \n" ++"Language-Team: LANGUAGE \n" ++"Language: pt\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n != 1);\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "Active MID announcements" ++msgstr "Anuncios MID ativos" ++ ++msgid "Active OLSR nodes" ++msgstr "Nós OLSR ativos" ++ ++#, fuzzy ++msgid "Active host net announcements" ++msgstr "Anuncios activos de hosts" ++ ++msgid "Advanced Settings" ++msgstr "Definições Avançadas" ++ ++msgid "Allow gateways with NAT" ++msgstr "Permitir gateways com NAT" ++ ++msgid "Allow the selection of an outgoing ipv4 gateway with NAT" ++msgstr "Permitir a selecção de uma gateway IPv4 para saída com NAT" ++ ++msgid "Announce uplink" ++msgstr "Anunciar uplink" ++ ++msgid "Announced network" ++msgstr "Rede anunciada" ++ ++msgid "Bad (ETX > 10)" ++msgstr "" ++ ++msgid "Bad (SNR < 5)" ++msgstr "" ++ ++msgid "Both values must use the dotted decimal notation." ++msgstr "Os valores tem de usar a dotação decimal." ++ ++msgid "Broadcast address" ++msgstr "Endereço de broadcast" ++ ++msgid "Can only be a valid IPv4 or IPv6 address or 'default'" ++msgstr "" ++ ++msgid "Can only be a valid IPv6 address or 'default'" ++msgstr "" ++ ++msgid "Configuration" ++msgstr "Configuração" ++ ++msgid "" ++"Could not get any data. Make sure the jsoninfo plugin is installed and " ++"allows connections from localhost." ++msgstr "" ++ ++msgid "Display" ++msgstr "Mostrar" ++ ++msgid "Downlink" ++msgstr "" ++ ++msgid "Download Config" ++msgstr "Descarregar Configuração" ++ ++msgid "ETX" ++msgstr "ETX" ++ ++msgid "Enable" ++msgstr "Ativar" ++ ++msgid "" ++"Enable SmartGateway. If it is disabled, then all other SmartGateway " ++"parameters are ignored. Default is \"no\"." ++msgstr "" ++"Ativar SmartGateway. Se estiver desativado, então todos os outros parâmetros " ++"SmartGateway são ignorados. Por defeito é \"não\"" ++ ++msgid "Enable this interface." ++msgstr "Ativar esta interface." ++ ++msgid "Enabled" ++msgstr "Ativado" ++ ++msgid "Expected retransmission count" ++msgstr "Contagem de retransmissões esperada" ++ ++msgid "FIB metric" ++msgstr "métrica FIB" ++ ++msgid "" ++"FIBMetric controls the metric value of the host-routes OLSRd sets. \"flat\" " ++"means that the metric value is always 2. This is the preferred value because " ++"it helps the linux kernel routing to clean up older routes. \"correct\" uses " ++"the hopcount as the metric value. \"approx\" use the hopcount as the metric " ++"value too, but does only update the hopcount if the nexthop changes too. " ++"Default is \"flat\"." ++msgstr "" ++ ++msgid "Fisheye mechanism for TCs (checked means on). Default is \"on\"" ++msgstr "" ++ ++msgid "Gateway" ++msgstr "" ++ ++msgid "General Settings" ++msgstr "" ++ ++msgid "General settings" ++msgstr "Definições gerais" ++ ++msgid "Good (2 < ETX < 4)" ++msgstr "" ++ ++msgid "Good (30 > SNR > 20)" ++msgstr "" ++ ++msgid "Green" ++msgstr "" ++ ++msgid "HNA" ++msgstr "" ++ ++msgid "HNA Announcements" ++msgstr "" ++ ++msgid "HNA interval" ++msgstr "Intervalo entre HNA" ++ ++msgid "HNA validity time" ++msgstr "Validade de HNA" ++ ++#, fuzzy ++msgid "HNA6 Announcements" ++msgstr "OLSR - Anuncios HNA4" ++ ++msgid "Hello" ++msgstr "" ++ ++msgid "Hello interval" ++msgstr "Intervalo entre Hello" ++ ++msgid "Hello validity time" ++msgstr "Validade de Hello" ++ ++msgid "Hide IPv4" ++msgstr "" ++ ++msgid "Hide IPv6" ++msgstr "" ++ ++msgid "Hna4" ++msgstr "" ++ ++msgid "Hna6" ++msgstr "" ++ ++msgid "Hops" ++msgstr "" ++ ++msgid "Hostname" ++msgstr "" ++ ++msgid "" ++"Hosts in a OLSR routed network can announce connecitivity to external " ++"networks using HNA messages." ++msgstr "" ++ ++msgid "" ++"Hosts in a OLSR routed network can announce connecitivity to external " ++"networks using HNA6 messages." ++msgstr "" ++ ++msgid "" ++"Hysteresis for link sensing (only for hopcount metric). Hysteresis adds more " ++"robustness to the link sensing but delays neighbor registration. Defaults is " ++"\"yes\"" ++msgstr "" ++ ++msgid "IP Addresses" ++msgstr "Endereços IP" ++ ++msgid "" ++"IP-version to use. If 6and4 is selected then one olsrd instance is started " ++"for each protocol." ++msgstr "" ++ ++msgid "IPv4" ++msgstr "IPv4" ++ ++msgid "IPv4 broadcast" ++msgstr "Endereço IPv4 de Broadcast" ++ ++msgid "" ++"IPv4 broadcast address for outgoing OLSR packets. One useful example would " ++"be 255.255.255.255. Default is \"0.0.0.0\", which triggers the usage of the " ++"interface broadcast IP." ++msgstr "" ++ ++msgid "IPv4 source" ++msgstr "" ++ ++msgid "" ++"IPv4 src address for outgoing OLSR packages. Default is \"0.0.0.0\", which " ++"triggers usage of the interface IP." ++msgstr "" ++ ++msgid "IPv6" ++msgstr "IPv6" ++ ++msgid "IPv6 multicast" ++msgstr "Multicast IPv6" ++ ++msgid "" ++"IPv6 multicast address. Default is \"FF02::6D\", the manet-router linklocal " ++"multicast." ++msgstr "" ++ ++msgid "" ++"IPv6 network must be given in full notation, prefix must be in CIDR notation." ++msgstr "" ++"A rede IPv6 deve ser fornecido em dotação completa, o prefixo deve estar na " ++"notação CIDR." ++ ++msgid "IPv6 source" ++msgstr "Origem IPv6" ++ ++msgid "" ++"IPv6 src prefix. OLSRd will choose one of the interface IPs which matches " ++"the prefix of this parameter. Default is \"0::/0\", which triggers the usage " ++"of a not-linklocal interface IP." ++msgstr "" ++ ++msgid "IPv6-Prefix of the uplink" ++msgstr "" ++ ++msgid "" ++"If the route to the current gateway is to be changed, the ETX value of this " ++"gateway is multiplied with this value before it is compared to the new one. " ++"The parameter can be a value between 0.1 and 1.0, but should be close to 1.0 " ++"if changed.
    WARNING: This parameter should not be used together " ++"with the etx_ffeth metric!
    Defaults to \"1.0\"." ++msgstr "" ++ ++msgid "" ++"If this Node uses NAT for connections to the internet. Default is \"yes\"." ++msgstr "" ++ ++msgid "Interface" ++msgstr "Interface" ++ ++msgid "" ++"Interface Mode is used to prevent unnecessary packet forwarding on switched " ++"ethernet interfaces. valid Modes are \"mesh\" and \"ether\". Default is " ++"\"mesh\"." ++msgstr "" ++"O Modo de Interface é usado para para prevenir encaminhamentos " ++"desnecessários de pacotes em interfaces switched ethernet. Os Modos válidos " ++"são \"mesh\" e \"ether\". Por defeito é \"mesh\"." ++ ++msgid "Interfaces" ++msgstr "Interfaces" ++ ++msgid "Interfaces Defaults" ++msgstr "Predefinições das Interfaces" ++ ++msgid "Internet protocol" ++msgstr "Protocolo de Internet" ++ ++msgid "" ++"Interval to poll network interfaces for configuration changes (in seconds). " ++"Default is \"2.5\"." ++msgstr "" ++ ++msgid "Invalid Value for LQMult-Value. Must be between 0.01 and 1.0." ++msgstr "" ++ ++msgid "" ++"Invalid Value for LQMult-Value. You must use a decimal number between 0.01 " ++"and 1.0 here." ++msgstr "" ++ ++msgid "Known OLSR routes" ++msgstr "Rotas OLSR conhecidas" ++ ++msgid "LQ" ++msgstr "LQ" ++ ++msgid "LQ aging" ++msgstr "Envelhecimento LQ" ++ ++msgid "LQ algorithm" ++msgstr "Algoritmo LQ" ++ ++#, fuzzy ++msgid "LQ fisheye" ++msgstr "LQ Fisheye" ++ ++msgid "LQ level" ++msgstr "Nível LQ" ++ ++msgid "" ++"LQMult requires two values (IP address or 'default' and multiplicator) " ++"seperated by space." ++msgstr "" ++ ++msgid "Last hop" ++msgstr "Ultimo salto" ++ ++msgid "Legend" ++msgstr "Legenda" ++ ++msgid "Library" ++msgstr "Biblioteca" ++ ++msgid "Link Quality Settings" ++msgstr "Definições de Qualidade do Link" ++ ++msgid "" ++"Link quality aging factor (only for lq level 2). Tuning parameter for " ++"etx_float and etx_fpm, smaller values mean slower changes of ETX value. " ++"(allowed values are between 0.01 and 1.0)" ++msgstr "" ++ ++msgid "" ++"Link quality algorithm (only for lq level 2).
    etx_float: " ++"floating point ETX with exponential aging
    etx_fpm : same as " ++"etx_float, but with integer arithmetic
    etx_ff : ETX freifunk, an " ++"etx variant which use all OLSR traffic (instead of only hellos) for ETX " ++"calculation
    etx_ffeth: incompatible variant of etx_ff that " ++"allows ethernet links with ETX 0.1.
    Defaults to \"etx_ff\"" ++msgstr "" ++ ++msgid "" ++"Link quality level switch between hopcount and cost-based (mostly ETX) " ++"routing.
    0 = do not use link quality
    2 = use link " ++"quality for MPR selection and routing
    Default is \"2\"" ++msgstr "" ++ ++msgid "LinkQuality Multiplicator" ++msgstr "" ++ ++msgid "Links per node (average)" ++msgstr "" ++ ++msgid "Links total" ++msgstr "" ++ ++msgid "Local interface IP" ++msgstr "Endereço IP do interface local" ++ ++msgid "MID" ++msgstr "" ++ ++msgid "MID interval" ++msgstr "Intervalo de MID" ++ ++msgid "MID validity time" ++msgstr "Validade de MID" ++ ++msgid "MTU" ++msgstr "" ++ ++msgid "Main IP" ++msgstr "IP Principal" ++ ++msgid "" ++"Make sure that OLSRd is running, the \"jsoninfo\" plugin is loaded, " ++"configured on port 9090 and accepts connections from \"127.0.0.1\"." ++msgstr "" ++ ++msgid "Metric" ++msgstr "Métrica" ++ ++msgid "Mode" ++msgstr "Modo" ++ ++msgid "" ++"Multiply routes with the factor given here. Allowed values are between 0.01 " ++"and 1.0. It is only used when LQ-Level is greater than 0. Examples:
    reduce LQ to 192.168.0.1 by half: 192.168.0.1 0.5
    reduce LQ to all " ++"nodes on this interface by 20%: default 0.8" ++msgstr "" ++ ++msgid "" ++"Multiply routes with the factor given here. Allowed values are between 0.01 " ++"and 1.0. It is only used when LQ-Level is greater than 0. Examples:
    reduce LQ to fd91:662e:3c58::1 by half: fd91:662e:3c58::1 0.5
    reduce " ++"LQ to all nodes on this interface by 20%: default 0.8" ++msgstr "" ++ ++msgid "NAT threshold" ++msgstr "" ++ ++msgid "NLQ" ++msgstr "" ++ ++msgid "Neighbors" ++msgstr "Vizinhos" ++ ++msgid "Neighbour IP" ++msgstr "Endereço IP do Vizinho" ++ ++msgid "Neighbours" ++msgstr "Vizinhos" ++ ++msgid "Netmask" ++msgstr "Máscara de rede" ++ ++msgid "Network" ++msgstr "Rede" ++ ++msgid "Network address" ++msgstr "Endereço de rede" ++ ++msgid "Nic changes poll interval" ++msgstr "" ++ ++msgid "Nodes" ++msgstr "Nós" ++ ++msgid "OLSR" ++msgstr "" ++ ++msgid "OLSR - Display Options" ++msgstr "" ++ ++msgid "OLSR - HNA-Announcements" ++msgstr "OLSR - Anuncios HNA4" ++ ++#, fuzzy ++msgid "OLSR - HNA6-Announcements" ++msgstr "OLSR - Anuncios HNA4" ++ ++msgid "OLSR - Plugins" ++msgstr "OLSR - Plugins" ++ ++msgid "OLSR Daemon" ++msgstr "Servidor OLSR" ++ ++msgid "OLSR Daemon - Interface" ++msgstr "" ++ ++msgid "OLSR connections" ++msgstr "OLSR - Ligações" ++ ++msgid "OLSR gateway" ++msgstr "Gateway OLSR" ++ ++msgid "OLSR node" ++msgstr "Nó OLSR" ++ ++msgid "Orange" ++msgstr "" ++ ++msgid "Overview" ++msgstr "" ++ ++#, fuzzy ++msgid "Overview of currently active OLSR host net announcements" ++msgstr "Resumo de anuncios activos de hosts" ++ ++msgid "Overview of currently established OLSR connections" ++msgstr "Resumo das ligações OLSR actualmente estabelecidas" ++ ++msgid "Overview of currently known OLSR nodes" ++msgstr "Resumo dos nós OLSR conhecidos" ++ ++msgid "Overview of currently known routes to other OLSR nodes" ++msgstr "Resumo das rotas conhecidas para outros nós OLSR" ++ ++msgid "Overview of interfaces where OLSR is running" ++msgstr "" ++ ++msgid "Overview of known multiple interface announcements" ++msgstr "Resumo de anuncios de nós com multiplos interfaces activos" ++ ++msgid "Overview of smart gateways in this network" ++msgstr "" ++ ++msgid "Plugin configuration" ++msgstr "Configuração de Plugin" ++ ++msgid "Plugins" ++msgstr "" ++ ++msgid "Polling rate for OLSR sockets in seconds. Default is 0.05." ++msgstr "" ++ ++msgid "Pollrate" ++msgstr "Pollrate" ++ ++msgid "Port" ++msgstr "Porta" ++ ++msgid "Prefix" ++msgstr "Prefixo" ++ ++msgid "Red" ++msgstr "" ++ ++msgid "Resolve" ++msgstr "" ++ ++msgid "" ++"Resolve hostnames on status pages. It is generally safe to allow this, but " ++"if you use public IPs and have unstable DNS-Setup then those pages will load " ++"really slow. In this case disable it here." ++msgstr "" ++ ++msgid "Routes" ++msgstr "Rotas" ++ ++msgid "Secondary OLSR interfaces" ++msgstr "Interfaces OLSR secundários" ++ ++msgid "" ++"Sets the main IP (originator ip) of the router. This IP will NEVER change " ++"during the uptime of olsrd. Default is 0.0.0.0, which triggers usage of the " ++"IP of the first interface." ++msgstr "" ++ ++msgid "" ++"Sets the main IP (originator ip) of the router. This IP will NEVER change " ++"during the uptime of olsrd. Default is ::, which triggers usage of the IP of " ++"the first interface." ++msgstr "" ++ ++msgid "Show IPv4" ++msgstr "" ++ ++msgid "Show IPv6" ++msgstr "" ++ ++msgid "Signal Noise Ratio in dB" ++msgstr "" ++ ++msgid "SmartGW" ++msgstr "" ++ ++msgid "SmartGW announcements" ++msgstr "" ++ ++msgid "SmartGateway is not configured on this system." ++msgstr "" ++ ++msgid "Source address" ++msgstr "Endereço de origem" ++ ++msgid "" ++"Specifies the speed of the uplink in kilobits/s. First parameter is " ++"upstream, second parameter is downstream. Default is \"128 1024\"." ++msgstr "" ++ ++msgid "Speed of the uplink" ++msgstr "Velocidade do uplink" ++ ++msgid "State" ++msgstr "Estado" ++ ++msgid "Status" ++msgstr "Estado" ++ ++msgid "Still usable (20 > SNR > 5)" ++msgstr "" ++ ++msgid "Still usable (4 < ETX < 10)" ++msgstr "" ++ ++msgid "Success rate of packages received from the neighbour" ++msgstr "" ++ ++msgid "Success rate of packages sent to the neighbour" ++msgstr "" ++ ++msgid "TC" ++msgstr "" ++ ++msgid "TC interval" ++msgstr "Intervalo de TC" ++ ++msgid "TC validity time" ++msgstr "Validade de TC" ++ ++msgid "TOS value" ++msgstr "" ++ ++msgid "" ++"The OLSR daemon is an implementation of the Optimized Link State Routing " ++"protocol. As such it allows mesh routing for any network equipment. It runs " ++"on any wifi card that supports ad-hoc mode and of course on any ethernet " ++"device. Visit olsrd.org for help and " ++"documentation." ++msgstr "" ++ ++msgid "" ++"The fixed willingness to use. If not set willingness will be calculated " ++"dynamically based on battery/power status. Default is \"3\"." ++msgstr "" ++ ++msgid "The interface OLSRd should serve." ++msgstr "" ++ ++msgid "" ++"The port OLSR uses. This should usually stay at the IANA assigned port 698. " ++"It can have a value between 1 and 65535." ++msgstr "" ++ ++msgid "" ++"This can be used to signal the external IPv6 prefix of the uplink to the " ++"clients. This might allow a client to change it's local IPv6 address to use " ++"the IPv6 gateway without any kind of address translation. The maximum prefix " ++"length is 64 bits. Default is \"::/0\" (no prefix)." ++msgstr "" ++ ++msgid "Timing and Validity" ++msgstr "" ++ ++msgid "Topology" ++msgstr "Topologia" ++ ++msgid "" ++"Type of service value for the IP header of control traffic. Default is " ++"\"16\"." ++msgstr "" ++ ++msgid "Unable to connect to the OLSR daemon!" ++msgstr "Não foi possivel ligar ao servidor OLSR!" ++ ++msgid "Uplink" ++msgstr "" ++ ++msgid "Uplink uses NAT" ++msgstr "O uplink usa NAT" ++ ++msgid "Use hysteresis" ++msgstr "Usar histerese" ++ ++msgid "Validity Time" ++msgstr "" ++ ++msgid "Version" ++msgstr "Versão" ++ ++msgid "Very good (ETX < 2)" ++msgstr "" ++ ++msgid "Very good (SNR > 30)" ++msgstr "" ++ ++msgid "WLAN" ++msgstr "WLAN" ++ ++msgid "" ++"Warning: kmod-ipip is not installed. Without kmod-ipip SmartGateway will not " ++"work, please install it." ++msgstr "" ++ ++msgid "Weight" ++msgstr "" ++ ++msgid "" ++"When multiple links exist between hosts the weight of interface is used to " ++"determine the link to use. Normally the weight is automatically calculated " ++"by olsrd based on the characteristics of the interface, but here you can " ++"specify a fixed value. Olsrd will choose links with the lowest value.
    Note: Interface weight is used only when LinkQualityLevel is set to " ++"0. For any other value of LinkQualityLevel, the interface ETX value is used " ++"instead." ++msgstr "" ++ ++msgid "" ++"Which kind of uplink is exported to the other mesh nodes. An uplink is " ++"detected by looking for a local HNA of 0.0.0.0/0, ::ffff:0:0/96 or 2000::/3. " ++"Default setting is \"both\"." ++msgstr "" ++ ++msgid "" ++"Which kind of uplink is exported to the other mesh nodes. An uplink is " ++"detected by looking for a local HNA6 ::ffff:0:0/96 or 2000::/3. Default " ++"setting is \"both\"." ++msgstr "" ++ ++msgid "Willingness" ++msgstr "Disponibilidade" ++ ++msgid "Yellow" ++msgstr "" ++ ++msgid "no" ++msgstr "" ++ ++msgid "yes" ++msgstr "" ++ ++#~ msgid "Device" ++#~ msgstr "Dispositivo" ++ ++#~ msgid "" ++#~ "Make sure that OLSRd is running, the \"txtinfo\" plugin is loaded, " ++#~ "configured on port 2006 and accepts connections from \"127.0.0.1\"." ++#~ msgstr "" ++#~ "Certifique-se que o processo olsrd está em execução, que o plugin " ++#~ "\"txtinfo\" está carregado e configurado para a porta 2006 e que aceita " ++#~ "ligações a partir de \"127.0.0.1\"." +diff --git a/feeds/luci/applications/luci-app-olsr/po/ro/olsr.po b/feeds/luci/applications/luci-app-olsr/po/ro/olsr.po +new file mode 100644 +index 0000000..257fab3 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-olsr/po/ro/olsr.po +@@ -0,0 +1,691 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"PO-Revision-Date: 2014-06-28 19:40+0200\n" ++"Last-Translator: xxvirusxx \n" ++"Language-Team: none\n" ++"Language: ro\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=3; plural=(n==1 ? 0 : (n==0 || (n%100 > 0 && n%100 < " ++"20)) ? 1 : 2);;\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "Active MID announcements" ++msgstr "" ++ ++msgid "Active OLSR nodes" ++msgstr "" ++ ++msgid "Active host net announcements" ++msgstr "" ++ ++msgid "Advanced Settings" ++msgstr "Setări avansate" ++ ++msgid "Allow gateways with NAT" ++msgstr "" ++ ++msgid "Allow the selection of an outgoing ipv4 gateway with NAT" ++msgstr "" ++ ++msgid "Announce uplink" ++msgstr "" ++ ++msgid "Announced network" ++msgstr "" ++ ++msgid "Bad (ETX > 10)" ++msgstr "" ++ ++msgid "Bad (SNR < 5)" ++msgstr "" ++ ++msgid "Both values must use the dotted decimal notation." ++msgstr "" ++ ++msgid "Broadcast address" ++msgstr "" ++ ++msgid "Can only be a valid IPv4 or IPv6 address or 'default'" ++msgstr "" ++ ++msgid "Can only be a valid IPv6 address or 'default'" ++msgstr "" ++ ++msgid "Configuration" ++msgstr "Configuraţie" ++ ++msgid "" ++"Could not get any data. Make sure the jsoninfo plugin is installed and " ++"allows connections from localhost." ++msgstr "" ++ ++msgid "Display" ++msgstr "" ++ ++msgid "Downlink" ++msgstr "" ++ ++msgid "Download Config" ++msgstr "" ++ ++msgid "ETX" ++msgstr "" ++ ++msgid "Enable" ++msgstr "Activare" ++ ++msgid "" ++"Enable SmartGateway. If it is disabled, then all other SmartGateway " ++"parameters are ignored. Default is \"no\"." ++msgstr "" ++ ++msgid "Enable this interface." ++msgstr "Activează această interfaţă" ++ ++msgid "Enabled" ++msgstr "Activat" ++ ++msgid "Expected retransmission count" ++msgstr "" ++ ++msgid "FIB metric" ++msgstr "" ++ ++msgid "" ++"FIBMetric controls the metric value of the host-routes OLSRd sets. \"flat\" " ++"means that the metric value is always 2. This is the preferred value because " ++"it helps the linux kernel routing to clean up older routes. \"correct\" uses " ++"the hopcount as the metric value. \"approx\" use the hopcount as the metric " ++"value too, but does only update the hopcount if the nexthop changes too. " ++"Default is \"flat\"." ++msgstr "" ++ ++msgid "Fisheye mechanism for TCs (checked means on). Default is \"on\"" ++msgstr "" ++ ++msgid "Gateway" ++msgstr "" ++ ++msgid "General Settings" ++msgstr "Setări generale" ++ ++msgid "General settings" ++msgstr "Setări generale" ++ ++msgid "Good (2 < ETX < 4)" ++msgstr "" ++ ++msgid "Good (30 > SNR > 20)" ++msgstr "" ++ ++msgid "Green" ++msgstr "Verde" ++ ++msgid "HNA" ++msgstr "" ++ ++msgid "HNA Announcements" ++msgstr "" ++ ++msgid "HNA interval" ++msgstr "" ++ ++msgid "HNA validity time" ++msgstr "" ++ ++msgid "HNA6 Announcements" ++msgstr "" ++ ++msgid "Hello" ++msgstr "" ++ ++msgid "Hello interval" ++msgstr "" ++ ++msgid "Hello validity time" ++msgstr "" ++ ++msgid "Hide IPv4" ++msgstr "Ascunde IPv4" ++ ++msgid "Hide IPv6" ++msgstr "Ascunde IPv6" ++ ++msgid "Hna4" ++msgstr "" ++ ++msgid "Hna6" ++msgstr "" ++ ++msgid "Hops" ++msgstr "" ++ ++msgid "Hostname" ++msgstr "Nume domeniu" ++ ++msgid "" ++"Hosts in a OLSR routed network can announce connecitivity to external " ++"networks using HNA messages." ++msgstr "" ++ ++msgid "" ++"Hosts in a OLSR routed network can announce connecitivity to external " ++"networks using HNA6 messages." ++msgstr "" ++ ++msgid "" ++"Hysteresis for link sensing (only for hopcount metric). Hysteresis adds more " ++"robustness to the link sensing but delays neighbor registration. Defaults is " ++"\"yes\"" ++msgstr "" ++ ++msgid "IP Addresses" ++msgstr "Adrese IP" ++ ++msgid "" ++"IP-version to use. If 6and4 is selected then one olsrd instance is started " ++"for each protocol." ++msgstr "" ++ ++msgid "IPv4" ++msgstr "IPv4" ++ ++msgid "IPv4 broadcast" ++msgstr "" ++ ++msgid "" ++"IPv4 broadcast address for outgoing OLSR packets. One useful example would " ++"be 255.255.255.255. Default is \"0.0.0.0\", which triggers the usage of the " ++"interface broadcast IP." ++msgstr "" ++ ++msgid "IPv4 source" ++msgstr "" ++ ++msgid "" ++"IPv4 src address for outgoing OLSR packages. Default is \"0.0.0.0\", which " ++"triggers usage of the interface IP." ++msgstr "" ++ ++msgid "IPv6" ++msgstr "" ++ ++msgid "IPv6 multicast" ++msgstr "" ++ ++msgid "" ++"IPv6 multicast address. Default is \"FF02::6D\", the manet-router linklocal " ++"multicast." ++msgstr "" ++ ++msgid "" ++"IPv6 network must be given in full notation, prefix must be in CIDR notation." ++msgstr "" ++ ++msgid "IPv6 source" ++msgstr "" ++ ++msgid "" ++"IPv6 src prefix. OLSRd will choose one of the interface IPs which matches " ++"the prefix of this parameter. Default is \"0::/0\", which triggers the usage " ++"of a not-linklocal interface IP." ++msgstr "" ++ ++msgid "IPv6-Prefix of the uplink" ++msgstr "" ++ ++msgid "" ++"If the route to the current gateway is to be changed, the ETX value of this " ++"gateway is multiplied with this value before it is compared to the new one. " ++"The parameter can be a value between 0.1 and 1.0, but should be close to 1.0 " ++"if changed.
    WARNING: This parameter should not be used together " ++"with the etx_ffeth metric!
    Defaults to \"1.0\"." ++msgstr "" ++ ++msgid "" ++"If this Node uses NAT for connections to the internet. Default is \"yes\"." ++msgstr "" ++ ++msgid "Interface" ++msgstr "Interfaţă" ++ ++msgid "" ++"Interface Mode is used to prevent unnecessary packet forwarding on switched " ++"ethernet interfaces. valid Modes are \"mesh\" and \"ether\". Default is " ++"\"mesh\"." ++msgstr "" ++ ++msgid "Interfaces" ++msgstr "Interfeţe" ++ ++msgid "Interfaces Defaults" ++msgstr "Interfeţe implicite" ++ ++msgid "Internet protocol" ++msgstr "" ++ ++msgid "" ++"Interval to poll network interfaces for configuration changes (in seconds). " ++"Default is \"2.5\"." ++msgstr "" ++ ++msgid "Invalid Value for LQMult-Value. Must be between 0.01 and 1.0." ++msgstr "" ++ ++msgid "" ++"Invalid Value for LQMult-Value. You must use a decimal number between 0.01 " ++"and 1.0 here." ++msgstr "" ++ ++msgid "Known OLSR routes" ++msgstr "" ++ ++msgid "LQ" ++msgstr "" ++ ++msgid "LQ aging" ++msgstr "" ++ ++msgid "LQ algorithm" ++msgstr "Algoritm LQ" ++ ++msgid "LQ fisheye" ++msgstr "" ++ ++msgid "LQ level" ++msgstr "Nivel LQ" ++ ++msgid "" ++"LQMult requires two values (IP address or 'default' and multiplicator) " ++"seperated by space." ++msgstr "" ++ ++msgid "Last hop" ++msgstr "" ++ ++msgid "Legend" ++msgstr "Legendă" ++ ++msgid "Library" ++msgstr "" ++ ++msgid "Link Quality Settings" ++msgstr "" ++ ++msgid "" ++"Link quality aging factor (only for lq level 2). Tuning parameter for " ++"etx_float and etx_fpm, smaller values mean slower changes of ETX value. " ++"(allowed values are between 0.01 and 1.0)" ++msgstr "" ++ ++msgid "" ++"Link quality algorithm (only for lq level 2).
    etx_float: " ++"floating point ETX with exponential aging
    etx_fpm : same as " ++"etx_float, but with integer arithmetic
    etx_ff : ETX freifunk, an " ++"etx variant which use all OLSR traffic (instead of only hellos) for ETX " ++"calculation
    etx_ffeth: incompatible variant of etx_ff that " ++"allows ethernet links with ETX 0.1.
    Defaults to \"etx_ff\"" ++msgstr "" ++ ++msgid "" ++"Link quality level switch between hopcount and cost-based (mostly ETX) " ++"routing.
    0 = do not use link quality
    2 = use link " ++"quality for MPR selection and routing
    Default is \"2\"" ++msgstr "" ++ ++msgid "LinkQuality Multiplicator" ++msgstr "" ++ ++msgid "Links per node (average)" ++msgstr "" ++ ++msgid "Links total" ++msgstr "" ++ ++msgid "Local interface IP" ++msgstr "" ++ ++msgid "MID" ++msgstr "" ++ ++msgid "MID interval" ++msgstr "" ++ ++msgid "MID validity time" ++msgstr "" ++ ++msgid "MTU" ++msgstr "" ++ ++msgid "Main IP" ++msgstr "" ++ ++msgid "" ++"Make sure that OLSRd is running, the \"jsoninfo\" plugin is loaded, " ++"configured on port 9090 and accepts connections from \"127.0.0.1\"." ++msgstr "" ++ ++msgid "Metric" ++msgstr "" ++ ++msgid "Mode" ++msgstr "" ++ ++msgid "" ++"Multiply routes with the factor given here. Allowed values are between 0.01 " ++"and 1.0. It is only used when LQ-Level is greater than 0. Examples:
    reduce LQ to 192.168.0.1 by half: 192.168.0.1 0.5
    reduce LQ to all " ++"nodes on this interface by 20%: default 0.8" ++msgstr "" ++ ++msgid "" ++"Multiply routes with the factor given here. Allowed values are between 0.01 " ++"and 1.0. It is only used when LQ-Level is greater than 0. Examples:
    reduce LQ to fd91:662e:3c58::1 by half: fd91:662e:3c58::1 0.5
    reduce " ++"LQ to all nodes on this interface by 20%: default 0.8" ++msgstr "" ++ ++msgid "NAT threshold" ++msgstr "" ++ ++msgid "NLQ" ++msgstr "" ++ ++msgid "Neighbors" ++msgstr "Vecini" ++ ++msgid "Neighbour IP" ++msgstr "IP vecin" ++ ++msgid "Neighbours" ++msgstr "Vecini" ++ ++msgid "Netmask" ++msgstr "" ++ ++msgid "Network" ++msgstr "" ++ ++msgid "Network address" ++msgstr "" ++ ++msgid "Nic changes poll interval" ++msgstr "" ++ ++msgid "Nodes" ++msgstr "" ++ ++msgid "OLSR" ++msgstr "" ++ ++msgid "OLSR - Display Options" ++msgstr "" ++ ++msgid "OLSR - HNA-Announcements" ++msgstr "" ++ ++msgid "OLSR - HNA6-Announcements" ++msgstr "" ++ ++msgid "OLSR - Plugins" ++msgstr "" ++ ++msgid "OLSR Daemon" ++msgstr "" ++ ++msgid "OLSR Daemon - Interface" ++msgstr "" ++ ++msgid "OLSR connections" ++msgstr "" ++ ++msgid "OLSR gateway" ++msgstr "" ++ ++msgid "OLSR node" ++msgstr "" ++ ++msgid "Orange" ++msgstr "" ++ ++msgid "Overview" ++msgstr "" ++ ++msgid "Overview of currently active OLSR host net announcements" ++msgstr "" ++ ++msgid "Overview of currently established OLSR connections" ++msgstr "" ++ ++msgid "Overview of currently known OLSR nodes" ++msgstr "" ++ ++msgid "Overview of currently known routes to other OLSR nodes" ++msgstr "" ++ ++msgid "Overview of interfaces where OLSR is running" ++msgstr "" ++ ++msgid "Overview of known multiple interface announcements" ++msgstr "" ++ ++msgid "Overview of smart gateways in this network" ++msgstr "" ++ ++msgid "Plugin configuration" ++msgstr "" ++ ++msgid "Plugins" ++msgstr "Pluginuri" ++ ++msgid "Polling rate for OLSR sockets in seconds. Default is 0.05." ++msgstr "" ++ ++msgid "Pollrate" ++msgstr "" ++ ++msgid "Port" ++msgstr "" ++ ++msgid "Prefix" ++msgstr "" ++ ++msgid "Red" ++msgstr "" ++ ++msgid "Resolve" ++msgstr "" ++ ++msgid "" ++"Resolve hostnames on status pages. It is generally safe to allow this, but " ++"if you use public IPs and have unstable DNS-Setup then those pages will load " ++"really slow. In this case disable it here." ++msgstr "" ++ ++msgid "Routes" ++msgstr "" ++ ++msgid "Secondary OLSR interfaces" ++msgstr "" ++ ++msgid "" ++"Sets the main IP (originator ip) of the router. This IP will NEVER change " ++"during the uptime of olsrd. Default is 0.0.0.0, which triggers usage of the " ++"IP of the first interface." ++msgstr "" ++ ++msgid "" ++"Sets the main IP (originator ip) of the router. This IP will NEVER change " ++"during the uptime of olsrd. Default is ::, which triggers usage of the IP of " ++"the first interface." ++msgstr "" ++ ++msgid "Show IPv4" ++msgstr "Arată IPv4" ++ ++msgid "Show IPv6" ++msgstr "Arată IPv6" ++ ++msgid "Signal Noise Ratio in dB" ++msgstr "Raport zgomot semnal în dB" ++ ++msgid "SmartGW" ++msgstr "" ++ ++msgid "SmartGW announcements" ++msgstr "" ++ ++msgid "SmartGateway is not configured on this system." ++msgstr "" ++ ++msgid "Source address" ++msgstr "" ++ ++msgid "" ++"Specifies the speed of the uplink in kilobits/s. First parameter is " ++"upstream, second parameter is downstream. Default is \"128 1024\"." ++msgstr "" ++ ++msgid "Speed of the uplink" ++msgstr "" ++ ++msgid "State" ++msgstr "" ++ ++msgid "Status" ++msgstr "Stare" ++ ++msgid "Still usable (20 > SNR > 5)" ++msgstr "" ++ ++msgid "Still usable (4 < ETX < 10)" ++msgstr "" ++ ++msgid "Success rate of packages received from the neighbour" ++msgstr "" ++ ++msgid "Success rate of packages sent to the neighbour" ++msgstr "" ++ ++msgid "TC" ++msgstr "" ++ ++msgid "TC interval" ++msgstr "" ++ ++msgid "TC validity time" ++msgstr "" ++ ++msgid "TOS value" ++msgstr "" ++ ++msgid "" ++"The OLSR daemon is an implementation of the Optimized Link State Routing " ++"protocol. As such it allows mesh routing for any network equipment. It runs " ++"on any wifi card that supports ad-hoc mode and of course on any ethernet " ++"device. Visit olsrd.org for help and " ++"documentation." ++msgstr "" ++ ++msgid "" ++"The fixed willingness to use. If not set willingness will be calculated " ++"dynamically based on battery/power status. Default is \"3\"." ++msgstr "" ++ ++msgid "The interface OLSRd should serve." ++msgstr "" ++ ++msgid "" ++"The port OLSR uses. This should usually stay at the IANA assigned port 698. " ++"It can have a value between 1 and 65535." ++msgstr "" ++ ++msgid "" ++"This can be used to signal the external IPv6 prefix of the uplink to the " ++"clients. This might allow a client to change it's local IPv6 address to use " ++"the IPv6 gateway without any kind of address translation. The maximum prefix " ++"length is 64 bits. Default is \"::/0\" (no prefix)." ++msgstr "" ++ ++msgid "Timing and Validity" ++msgstr "" ++ ++msgid "Topology" ++msgstr "" ++ ++msgid "" ++"Type of service value for the IP header of control traffic. Default is " ++"\"16\"." ++msgstr "" ++ ++msgid "Unable to connect to the OLSR daemon!" ++msgstr "" ++ ++msgid "Uplink" ++msgstr "" ++ ++msgid "Uplink uses NAT" ++msgstr "" ++ ++msgid "Use hysteresis" ++msgstr "" ++ ++msgid "Validity Time" ++msgstr "" ++ ++msgid "Version" ++msgstr "Versiune" ++ ++msgid "Very good (ETX < 2)" ++msgstr "" ++ ++msgid "Very good (SNR > 30)" ++msgstr "" ++ ++msgid "WLAN" ++msgstr "" ++ ++msgid "" ++"Warning: kmod-ipip is not installed. Without kmod-ipip SmartGateway will not " ++"work, please install it." ++msgstr "" ++ ++msgid "Weight" ++msgstr "Greutate" ++ ++msgid "" ++"When multiple links exist between hosts the weight of interface is used to " ++"determine the link to use. Normally the weight is automatically calculated " ++"by olsrd based on the characteristics of the interface, but here you can " ++"specify a fixed value. Olsrd will choose links with the lowest value.
    Note: Interface weight is used only when LinkQualityLevel is set to " ++"0. For any other value of LinkQualityLevel, the interface ETX value is used " ++"instead." ++msgstr "" ++ ++msgid "" ++"Which kind of uplink is exported to the other mesh nodes. An uplink is " ++"detected by looking for a local HNA of 0.0.0.0/0, ::ffff:0:0/96 or 2000::/3. " ++"Default setting is \"both\"." ++msgstr "" ++ ++msgid "" ++"Which kind of uplink is exported to the other mesh nodes. An uplink is " ++"detected by looking for a local HNA6 ::ffff:0:0/96 or 2000::/3. Default " ++"setting is \"both\"." ++msgstr "" ++ ++msgid "Willingness" ++msgstr "" ++ ++msgid "Yellow" ++msgstr "Galben" ++ ++msgid "no" ++msgstr "nu" ++ ++msgid "yes" ++msgstr "da" +diff --git a/feeds/luci/applications/luci-app-olsr/po/ru/olsr.po b/feeds/luci/applications/luci-app-olsr/po/ru/olsr.po +new file mode 100644 +index 0000000..51267e0 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-olsr/po/ru/olsr.po +@@ -0,0 +1,812 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: LuCI: olsr\n" ++"Report-Msgid-Bugs-To: \n" ++"POT-Creation-Date: 2009-05-19 19:36+0200\n" ++"PO-Revision-Date: 2013-09-06 09:58+0200\n" ++"Last-Translator: datasheet \n" ++"Language-Team: Russian \n" ++"Language: ru\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%" ++"10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" ++"X-Generator: Pootle 2.0.6\n" ++"X-Poedit-SourceCharset: UTF-8\n" ++ ++msgid "Active MID announcements" ++msgstr "Ðктивные объÑÐ²Ð»ÐµÐ½Ð¸Ñ MID" ++ ++msgid "Active OLSR nodes" ++msgstr "Ðктивные OLSR-узлы" ++ ++msgid "Active host net announcements" ++msgstr "Ðктивные объÑÐ²Ð»ÐµÐ½Ð¸Ñ Ñ…Ð¾ÑÑ‚-Ñети (HNA)" ++ ++msgid "Advanced Settings" ++msgstr "РаÑширенные наÑтройки" ++ ++msgid "Allow gateways with NAT" ++msgstr "Разрешить шлюзы Ñ NAT" ++ ++msgid "Allow the selection of an outgoing ipv4 gateway with NAT" ++msgstr "Разрешить выбор иÑходÑщего IPv4-шлюза Ñ NAT" ++ ++msgid "Announce uplink" ++msgstr "ОбъÑвлÑÑ‚ÑŒ воÑходÑщий канал" ++ ++msgid "Announced network" ++msgstr "ОбъÑÐ²Ð»ÐµÐ½Ð½Ð°Ñ Ñеть" ++ ++msgid "Bad (ETX > 10)" ++msgstr "" ++ ++msgid "Bad (SNR < 5)" ++msgstr "" ++ ++msgid "Both values must use the dotted decimal notation." ++msgstr "" ++"Оба Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ Ð´Ð¾Ð»Ð¶Ð½Ñ‹ быть в деÑÑтичном предÑтавлении Ñ Ñ€Ð°Ð·Ð´ÐµÐ»Ð¸Ñ‚ÐµÐ»ÑŒÐ½Ñ‹Ð¼Ð¸ " ++"точками." ++ ++msgid "Broadcast address" ++msgstr "Широковещательный адреÑ" ++ ++msgid "Can only be a valid IPv4 or IPv6 address or 'default'" ++msgstr "" ++ ++msgid "Can only be a valid IPv6 address or 'default'" ++msgstr "" ++ ++msgid "Configuration" ++msgstr "КонфигурациÑ" ++ ++msgid "" ++"Could not get any data. Make sure the jsoninfo plugin is installed and " ++"allows connections from localhost." ++msgstr "" ++ ++msgid "Display" ++msgstr "Показать" ++ ++msgid "Downlink" ++msgstr "ÐиÑходÑщий канал" ++ ++msgid "Download Config" ++msgstr "Загрузить конфигурацию" ++ ++msgid "ETX" ++msgstr "ETX" ++ ++msgid "Enable" ++msgstr "Включить" ++ ++msgid "" ++"Enable SmartGateway. If it is disabled, then all other SmartGateway " ++"parameters are ignored. Default is \"no\"." ++msgstr "" ++"Включить SmartGateway. ЕÑли выключено, вÑе оÑтальные параметры SmartGateway " ++"игнорируютÑÑ. По умолчанию \"нет\"." ++ ++msgid "Enable this interface." ++msgstr "ИÑпользовать Ñтот интерфейÑ." ++ ++msgid "Enabled" ++msgstr "Включено" ++ ++msgid "Expected retransmission count" ++msgstr "Ожидаемое количеÑтво повторных передач" ++ ++msgid "FIB metric" ++msgstr "Метрика FIB" ++ ++msgid "" ++"FIBMetric controls the metric value of the host-routes OLSRd sets. \"flat\" " ++"means that the metric value is always 2. This is the preferred value because " ++"it helps the linux kernel routing to clean up older routes. \"correct\" uses " ++"the hopcount as the metric value. \"approx\" use the hopcount as the metric " ++"value too, but does only update the hopcount if the nexthop changes too. " ++"Default is \"flat\"." ++msgstr "" ++"Метрика FIB управлÑет значением метрики хоÑÑ‚-маршрутов, которые " ++"уÑтанавливает OLSRd. При \"flat\" значение метрики вÑегда равно 2. Это " ++"предпочтительное значение, помогающее Ñдру Linux очищать уÑтаревшие " ++"маршруты. При \"correct\" иÑпользуетÑÑ Ñчётчик прыжков в качеÑтве Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ " ++"метрики. \"approx\" также иÑпозьзует Ñчётчик прыжков, но его обновление " ++"проиÑходит только при изменении Ñледующего прыжка. По умолчанию иÑпользуетÑÑ " ++"\"flat\"." ++ ++msgid "Fisheye mechanism for TCs (checked means on). Default is \"on\"" ++msgstr "Механизм рыбьего глаза Ð´Ð»Ñ TC. По умолчанию \"включено\"" ++ ++msgid "Gateway" ++msgstr "Шлюз" ++ ++msgid "General Settings" ++msgstr "Общие наÑтройки" ++ ++msgid "General settings" ++msgstr "Общие наÑтройки" ++ ++msgid "Good (2 < ETX < 4)" ++msgstr "" ++ ++msgid "Good (30 > SNR > 20)" ++msgstr "" ++ ++msgid "Green" ++msgstr "" ++ ++msgid "HNA" ++msgstr "HNA" ++ ++msgid "HNA Announcements" ++msgstr "ОбъÑÐ²Ð»ÐµÐ½Ð¸Ñ HNA" ++ ++msgid "HNA interval" ++msgstr "HNA интервал" ++ ++msgid "HNA validity time" ++msgstr "Ð’Ñ€ÐµÐ¼Ñ Ð´ÐµÐ¹ÑÑ‚Ð²Ð¸Ñ HNA" ++ ++#, fuzzy ++msgid "HNA6 Announcements" ++msgstr "ОбъÑÐ²Ð»ÐµÐ½Ð¸Ñ HNA" ++ ++msgid "Hello" ++msgstr "ПриветÑтвенное Ñообщение" ++ ++msgid "Hello interval" ++msgstr "Интервал приветÑтвенных Ñообщений" ++ ++msgid "Hello validity time" ++msgstr "Ð’Ñ€ÐµÐ¼Ñ Ð´ÐµÐ¹ÑÑ‚Ð²Ð¸Ñ Ð¿Ñ€Ð¸Ð²ÐµÑ‚Ñтвенного ÑообщениÑ" ++ ++msgid "Hide IPv4" ++msgstr "" ++ ++msgid "Hide IPv6" ++msgstr "" ++ ++msgid "Hna4" ++msgstr "Hna4" ++ ++msgid "Hna6" ++msgstr "Hna6" ++ ++msgid "Hops" ++msgstr "Прыжки" ++ ++msgid "Hostname" ++msgstr "Ð˜Ð¼Ñ Ñ…Ð¾Ñта" ++ ++msgid "" ++"Hosts in a OLSR routed network can announce connecitivity to external " ++"networks using HNA messages." ++msgstr "" ++"ХоÑÑ‚Ñ‹ в маршрутизируемой Ñети OLSR могут извещать о подключении к внешним " ++"ÑетÑм Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ Ñообщений HNA." ++ ++#, fuzzy ++msgid "" ++"Hosts in a OLSR routed network can announce connecitivity to external " ++"networks using HNA6 messages." ++msgstr "" ++"ХоÑÑ‚Ñ‹ в маршрутизируемой Ñети OLSR могут извещать о подключении к внешним " ++"ÑетÑм Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ Ñообщений HNA." ++ ++msgid "" ++"Hysteresis for link sensing (only for hopcount metric). Hysteresis adds more " ++"robustness to the link sensing but delays neighbor registration. Defaults is " ++"\"yes\"" ++msgstr "" ++"ГиÑÑ‚ÐµÑ€ÐµÐ·Ð¸Ñ Ð´Ð»Ñ Ð°Ð²Ñ‚Ð¾Ð¾Ð¿Ñ€ÐµÐ´ÐµÐ»ÐµÐ½Ð¸Ñ ÐºÐ°Ð½Ð°Ð»Ð° (только Ð´Ð»Ñ Ð¼ÐµÑ‚Ñ€Ð¸ÐºÐ¸ кол-ва прыжков). " ++"ГиÑÑ‚ÐµÑ€ÐµÐ·Ð¸Ñ ÑƒÐ²ÐµÐ»Ð¸Ñ‡Ð¸Ð²Ð°ÐµÑ‚ надёжноÑÑ‚ÑŒ канала, но вноÑит задержку в региÑтрацию " ++"ÑоÑедних уÑтройÑтв. По умолчанию \"да\"" ++ ++msgid "IP Addresses" ++msgstr "IP-адреÑа" ++ ++msgid "" ++"IP-version to use. If 6and4 is selected then one olsrd instance is started " ++"for each protocol." ++msgstr "" ++"ВерÑÐ¸Ñ IP, ÐºÐ¾Ñ‚Ð¾Ñ€Ð°Ñ Ð±ÑƒÐ´ÐµÑ‚ иÑпользована. ЕÑли выбрано 6and4, olsrd будет " ++"запущен Ð´Ð»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð¹ верÑии." ++ ++msgid "IPv4" ++msgstr "IPv4" ++ ++msgid "IPv4 broadcast" ++msgstr "Широковещательный IPv4" ++ ++msgid "" ++"IPv4 broadcast address for outgoing OLSR packets. One useful example would " ++"be 255.255.255.255. Default is \"0.0.0.0\", which triggers the usage of the " ++"interface broadcast IP." ++msgstr "" ++"Широковещательный IPv4-Ð°Ð´Ñ€ÐµÑ Ð´Ð»Ñ Ð¸ÑходÑщих OLSR-пакетов, например, " ++"255.255.255.255. ÐÐ´Ñ€ÐµÑ Ð¿Ð¾ умолчанию \"0.0.0.0\" ведёт к иÑпользованию " ++"широковещательного IP-адреÑа интерфейÑа." ++ ++msgid "IPv4 source" ++msgstr "IPv4-иÑточник" ++ ++msgid "" ++"IPv4 src address for outgoing OLSR packages. Default is \"0.0.0.0\", which " ++"triggers usage of the interface IP." ++msgstr "" ++"IPv4-Ð°Ð´Ñ€ÐµÑ Ð¾Ñ‚Ð¿Ñ€Ð°Ð²Ð¸Ñ‚ÐµÐ»Ñ Ð´Ð»Ñ Ð¸ÑходÑщих OLSR-пакетов. ÐÐ´Ñ€ÐµÑ Ð¿Ð¾ умолчанию " ++"\"0.0.0.0\" включает иÑпользование IP-адреÑа интерфейÑа." ++ ++msgid "IPv6" ++msgstr "IPv6" ++ ++msgid "IPv6 multicast" ++msgstr "Групповой IPv6" ++ ++msgid "" ++"IPv6 multicast address. Default is \"FF02::6D\", the manet-router linklocal " ++"multicast." ++msgstr "Групповой IPv6-адреÑ. По умолчанию \"FF02::6D\"." ++ ++msgid "" ++"IPv6 network must be given in full notation, prefix must be in CIDR notation." ++msgstr "" ++"IPv6-Ñеть должна быть указана в полной нотации, Ð¿Ñ€ÐµÑ„Ð¸ÐºÑ Ð´Ð¾Ð»Ð¶ÐµÐ½ быть в " ++"нотации CIDR." ++ ++msgid "IPv6 source" ++msgstr "IPv6-иÑточник" ++ ++msgid "" ++"IPv6 src prefix. OLSRd will choose one of the interface IPs which matches " ++"the prefix of this parameter. Default is \"0::/0\", which triggers the usage " ++"of a not-linklocal interface IP." ++msgstr "" ++"ÐŸÑ€ÐµÑ„Ð¸ÐºÑ Ð¸Ñточника IPv6. OLSRd выберет один из IP-адреÑов интерфейÑа, " ++"ÑоответÑтвующий данному префикÑу. По умолчанию \"0::/0\" включает " ++"иÑпользование нелокального IP-адреÑа интерфейÑа." ++ ++msgid "IPv6-Prefix of the uplink" ++msgstr "IPv6-Ð¿Ñ€ÐµÑ„Ð¸ÐºÑ Ð²Ð¾ÑходÑщего канала" ++ ++msgid "" ++"If the route to the current gateway is to be changed, the ETX value of this " ++"gateway is multiplied with this value before it is compared to the new one. " ++"The parameter can be a value between 0.1 and 1.0, but should be close to 1.0 " ++"if changed.
    WARNING: This parameter should not be used together " ++"with the etx_ffeth metric!
    Defaults to \"1.0\"." ++msgstr "" ++"ЕÑли маршрут к текущему шлюзу должен быть изменён, значение ETX данного " ++"шлюза умножаетÑÑ Ð½Ð° указанное чиÑло перед Ñравнением Ñ Ð½Ð¾Ð²Ñ‹Ð¼ значением. " ++"Значение данного параметра может быть в пределах от 0.1 до 1.0, но при " ++"изменении должно быть ближе к 1.0.
    Ð’ÐИМÐÐИЕ:Ðе иÑпользуйте " ++"данный параметр вмеÑте Ñ Ð¼ÐµÑ‚Ñ€Ð¸ÐºÐ¾Ð¹ etx_ffeth!
    По умолчанию \"1.0\"." ++ ++msgid "" ++"If this Node uses NAT for connections to the internet. Default is \"yes\"." ++msgstr "" ++"ИÑпользует ли данный узел NAT Ð´Ð»Ñ Ð¿Ð¾Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ Ðº интернету. По умолчанию \"да" ++"\"." ++ ++msgid "Interface" ++msgstr "ИнтерфейÑ" ++ ++msgid "" ++"Interface Mode is used to prevent unnecessary packet forwarding on switched " ++"ethernet interfaces. valid Modes are \"mesh\" and \"ether\". Default is " ++"\"mesh\"." ++msgstr "" ++"Режим интерфейÑа иÑпользуетÑÑ Ð´Ð»Ñ Ð¿Ñ€ÐµÐ´Ð¾Ñ‚Ð²Ñ€Ð°Ñ‰ÐµÐ½Ð¸Ñ Ð½ÐµÐ½ÑƒÐ¶Ð½Ñ‹Ñ… перенаправлений на " ++"коммутируемых Ethernet-интерфейÑах. Возможные Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ Ñ€ÐµÐ¶Ð¸Ð¼Ð°: \"mesh\" и " ++"\"ether\". По умолчанию \"mesh\"." ++ ++msgid "Interfaces" ++msgstr "ИнтерфейÑÑ‹" ++ ++msgid "Interfaces Defaults" ++msgstr "Ð—Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ Ð¿Ð¾ умолчанию Ð´Ð»Ñ Ð¸Ð½Ñ‚ÐµÑ€Ñ„ÐµÐ¹Ñов" ++ ++msgid "Internet protocol" ++msgstr "Интернет-протокол" ++ ++msgid "" ++"Interval to poll network interfaces for configuration changes (in seconds). " ++"Default is \"2.5\"." ++msgstr "" ++"Интервал опроÑа Ñетвых интерфейÑов на наличие изменений в конфигурации " ++"(Ñек.). По умолчанию, \"2.5\"." ++ ++msgid "Invalid Value for LQMult-Value. Must be between 0.01 and 1.0." ++msgstr "" ++ ++msgid "" ++"Invalid Value for LQMult-Value. You must use a decimal number between 0.01 " ++"and 1.0 here." ++msgstr "" ++ ++msgid "Known OLSR routes" ++msgstr "ИзвеÑтные OLSR-маршруты" ++ ++msgid "LQ" ++msgstr "LQ" ++ ++msgid "LQ aging" ++msgstr "Старение LQ" ++ ++msgid "LQ algorithm" ++msgstr "Ðлгоритм LQ" ++ ++#, fuzzy ++msgid "LQ fisheye" ++msgstr "Рыбий глаз LQ" ++ ++msgid "LQ level" ++msgstr "Уровень LQ" ++ ++msgid "" ++"LQMult requires two values (IP address or 'default' and multiplicator) " ++"seperated by space." ++msgstr "" ++ ++msgid "Last hop" ++msgstr "ПоÑледний прыжок" ++ ++msgid "Legend" ++msgstr "Легенда" ++ ++msgid "Library" ++msgstr "Библиотека" ++ ++msgid "Link Quality Settings" ++msgstr "ÐаÑтройки качеÑтва ÑÐ¾ÐµÐ´Ð¸Ð½ÐµÐ½Ð¸Ñ (LQ)" ++ ++msgid "" ++"Link quality aging factor (only for lq level 2). Tuning parameter for " ++"etx_float and etx_fpm, smaller values mean slower changes of ETX value. " ++"(allowed values are between 0.01 and 1.0)" ++msgstr "" ++"КоÑффициент ÑÑ‚Ð°Ñ€ÐµÐ½Ð¸Ñ LQ (только Ð´Ð»Ñ ÑƒÑ€Ð¾Ð²Ð½Ñ LQ, равного 2). Параметр " ++"подÑтройки Ð´Ð»Ñ etx_float и etx_fpm. Чем меньше значение, тем меньше " ++"Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ ETX. Диапазон допуÑтимых значений от 0.01 до 1.0." ++ ++msgid "" ++"Link quality algorithm (only for lq level 2).
    etx_float: " ++"floating point ETX with exponential aging
    etx_fpm : same as " ++"etx_float, but with integer arithmetic
    etx_ff : ETX freifunk, an " ++"etx variant which use all OLSR traffic (instead of only hellos) for ETX " ++"calculation
    etx_ffeth: incompatible variant of etx_ff that " ++"allows ethernet links with ETX 0.1.
    Defaults to \"etx_ff\"" ++msgstr "" ++"Ðлгоритм LQ (только Ð´Ð»Ñ ÑƒÑ€Ð¾Ð²Ð½Ñ LQ, равного 2).
    etx_float: ETX Ñ " ++"плавающей точкой и ÑкÑпоненциальным Ñтарением
    etx_fpm : тоже что " ++"и etx_float, но Ñ Ñ†ÐµÐ»Ð¾Ñ‡Ð¸Ñленной арифметикой
    etx_ff : ETX " ++"freifunk, иÑпользует веÑÑŒ трафик OLSR Ð´Ð»Ñ Ñ€Ð°Ñчета ETX
    etx_ffeth: " ++"неÑовмеÑтимый вариант etx_ff, разрешающий Ethernet-ÑÐ¾ÐµÐ´Ð¸Ð½ÐµÐ½Ð¸Ñ Ñ ETX 0.1.
    По умолчанию \"etx_ff\"" ++ ++msgid "" ++"Link quality level switch between hopcount and cost-based (mostly ETX) " ++"routing.
    0 = do not use link quality
    2 = use link " ++"quality for MPR selection and routing
    Default is \"2\"" ++msgstr "" ++"Переключатель ÑƒÑ€Ð¾Ð²Ð½Ñ LQ между маршрутизацией по кол-во прыжков и ETX.
    0 = не иÑпользовать LQ
    2 = иÑпользовать LQ Ð´Ð»Ñ Ð²Ñ‹Ð±Ð¾Ñ€Ð° " ++"MPR и маршрутизации
    По умолчанию \"2\"" ++ ++msgid "LinkQuality Multiplicator" ++msgstr "Множитель LQ" ++ ++msgid "Links per node (average)" ++msgstr "Кол-во Ñоединений на узел (Ñреднее)" ++ ++msgid "Links total" ++msgstr "Общее кол-во Ñоединений" ++ ++msgid "Local interface IP" ++msgstr "IP-Ð°Ð´Ñ€ÐµÑ Ð»Ð¾ÐºÐ°Ð»ÑŒÐ½Ð¾Ð³Ð¾ интерфейÑа" ++ ++msgid "MID" ++msgstr "MID" ++ ++msgid "MID interval" ++msgstr "Интервал MID" ++ ++msgid "MID validity time" ++msgstr "Ð’Ñ€ÐµÐ¼Ñ Ð´ÐµÐ¹ÑÑ‚Ð²Ð¸Ñ MID" ++ ++msgid "MTU" ++msgstr "MTU" ++ ++msgid "Main IP" ++msgstr "ОÑновной IP-адреÑ" ++ ++msgid "" ++"Make sure that OLSRd is running, the \"jsoninfo\" plugin is loaded, " ++"configured on port 9090 and accepts connections from \"127.0.0.1\"." ++msgstr "" ++ ++msgid "Metric" ++msgstr "Метрика" ++ ++msgid "Mode" ++msgstr "Режим" ++ ++msgid "" ++"Multiply routes with the factor given here. Allowed values are between 0.01 " ++"and 1.0. It is only used when LQ-Level is greater than 0. Examples:
    reduce LQ to 192.168.0.1 by half: 192.168.0.1 0.5
    reduce LQ to all " ++"nodes on this interface by 20%: default 0.8" ++msgstr "" ++ ++#, fuzzy ++msgid "" ++"Multiply routes with the factor given here. Allowed values are between 0.01 " ++"and 1.0. It is only used when LQ-Level is greater than 0. Examples:
    reduce LQ to fd91:662e:3c58::1 by half: fd91:662e:3c58::1 0.5
    reduce " ++"LQ to all nodes on this interface by 20%: default 0.8" ++msgstr "" ++"Умножить маршруты на указанный коÑффициент в пределах от 0.01 до 1. Данный " ++"коÑффициент иÑпользуетÑÑ Ñ‚Ð¾Ð»ÑŒÐºÐ¾ в Ñлучае, еÑли LQ уровень > 0. Примеры:
    уменьшить LQ Ð´Ð»Ñ 192.168.0.1 на половину: 192.168.0.1 0.5
    уменьшить LQ " ++"Ð´Ð»Ñ Ð²Ñех узлов на данном интерфейÑе на 20%: default 0.8" ++ ++msgid "NAT threshold" ++msgstr "Порог NAT" ++ ++msgid "NLQ" ++msgstr "NLQ" ++ ++msgid "Neighbors" ++msgstr "СоÑедние узлы" ++ ++msgid "Neighbour IP" ++msgstr "СоÑедние IP-адреÑа" ++ ++msgid "Neighbours" ++msgstr "СоÑедние узлы" ++ ++msgid "Netmask" ++msgstr "МаÑка Ñети" ++ ++msgid "Network" ++msgstr "Сеть" ++ ++msgid "Network address" ++msgstr "Сетевой адреÑ" ++ ++msgid "Nic changes poll interval" ++msgstr "Интервал опроÑа изменений NIC" ++ ++msgid "Nodes" ++msgstr "Узлы" ++ ++msgid "OLSR" ++msgstr "OLSR" ++ ++msgid "OLSR - Display Options" ++msgstr "OLSR - ÐаÑтройки отображениÑ" ++ ++msgid "OLSR - HNA-Announcements" ++msgstr "OLSR - HNA-объÑвлениÑ" ++ ++#, fuzzy ++msgid "OLSR - HNA6-Announcements" ++msgstr "OLSR - HNA-объÑвлениÑ" ++ ++msgid "OLSR - Plugins" ++msgstr "OLSR - Модули" ++ ++msgid "OLSR Daemon" ++msgstr "Ð¡ÐµÑ€Ð²Ð¸Ñ OLSR" ++ ++msgid "OLSR Daemon - Interface" ++msgstr "Ð¡ÐµÑ€Ð²Ð¸Ñ OLSR - ИнтерфейÑ" ++ ++msgid "OLSR connections" ++msgstr "OLSR-ÑоединениÑ" ++ ++msgid "OLSR gateway" ++msgstr "OLSR-шлюз" ++ ++msgid "OLSR node" ++msgstr "OLSR-узел" ++ ++msgid "Orange" ++msgstr "" ++ ++msgid "Overview" ++msgstr "Обзор" ++ ++msgid "Overview of currently active OLSR host net announcements" ++msgstr "Обзор текущих активных OLSR-объÑвлений HNA" ++ ++msgid "Overview of currently established OLSR connections" ++msgstr "Обзор уÑтановленных OLSR-Ñоединений" ++ ++msgid "Overview of currently known OLSR nodes" ++msgstr "Обзор текущих извеÑтных OLSR-узлов" ++ ++msgid "Overview of currently known routes to other OLSR nodes" ++msgstr "Обзор извеÑтных маршрутов к OLSR-узлам" ++ ++msgid "Overview of interfaces where OLSR is running" ++msgstr "Обзор интерфейÑов Ñ Ð·Ð°Ð¿ÑƒÑ‰ÐµÐ½Ð½Ñ‹Ð¼ OLSR" ++ ++msgid "Overview of known multiple interface announcements" ++msgstr "Обзор извеÑтных мульти-интерфейÑных извещений" ++ ++# Может таки "умные" шлюзы? Или вообще SmartGW... ++#, fuzzy ++msgid "Overview of smart gateways in this network" ++msgstr "Обзор Ñмарт-шлюзов в Ñети" ++ ++msgid "Plugin configuration" ++msgstr "ÐаÑтройки модулей" ++ ++msgid "Plugins" ++msgstr "Модули" ++ ++msgid "Polling rate for OLSR sockets in seconds. Default is 0.05." ++msgstr "ПериодичноÑÑ‚ÑŒ опроÑа OLSR-Ñокетов в Ñекундах. 0.05 по умолчанию." ++ ++msgid "Pollrate" ++msgstr "ЧаÑтота опроÑа" ++ ++msgid "Port" ++msgstr "Порт" ++ ++msgid "Prefix" ++msgstr "ПрефикÑ" ++ ++msgid "Red" ++msgstr "" ++ ++msgid "Resolve" ++msgstr "Разрешать имена" ++ ++msgid "" ++"Resolve hostnames on status pages. It is generally safe to allow this, but " ++"if you use public IPs and have unstable DNS-Setup then those pages will load " ++"really slow. In this case disable it here." ++msgstr "" ++"Разрешать имена хоÑтов на Ñтраницах ÑоÑтоÑниÑ. Ðе иÑпользуйте данную " ++"функцию, еÑли у Ð²Ð°Ñ Ð¿ÑƒÐ±Ð»Ð¸Ñ‡Ð½Ñ‹Ð¹ IP-Ð°Ð´Ñ€ÐµÑ Ð¸ неÑтабильный DNS. Ð’ противном " ++"Ñлучае загрузка Ñтраниц ÑоÑтоÑÐ½Ð¸Ñ Ð¼Ð¾Ð¶ÐµÑ‚ проиÑходить очень медленно." ++ ++msgid "Routes" ++msgstr "Маршруты" ++ ++msgid "Secondary OLSR interfaces" ++msgstr "Вторичные OLSR-интерфейÑÑ‹" ++ ++msgid "" ++"Sets the main IP (originator ip) of the router. This IP will NEVER change " ++"during the uptime of olsrd. Default is 0.0.0.0, which triggers usage of the " ++"IP of the first interface." ++msgstr "" ++"УÑтанавливает оÑновной IP-Ð°Ð´Ñ€ÐµÑ Ð¼Ð°Ñ€ÑˆÑ€ÑƒÑ‚Ð¸Ð·Ð°Ñ‚Ð¾Ñ€Ð°. Данный Ð°Ð´Ñ€ÐµÑ ÐИКОГДРне " ++"будет изменÑÑ‚ÑŒÑÑ Ð²Ð¾ Ð²Ñ€ÐµÐ¼Ñ Ñ€Ð°Ð±Ð¾Ñ‚Ñ‹ olsrd. По умолчанию 0.0.0.0 (иÑпользуетÑÑ " ++"IP-Ð°Ð´Ñ€ÐµÑ Ð¿ÐµÑ€Ð²Ð¾Ð³Ð¾ Ñетевого интерфейÑа)." ++ ++#, fuzzy ++msgid "" ++"Sets the main IP (originator ip) of the router. This IP will NEVER change " ++"during the uptime of olsrd. Default is ::, which triggers usage of the IP of " ++"the first interface." ++msgstr "" ++"УÑтанавливает оÑновной IP-Ð°Ð´Ñ€ÐµÑ Ð¼Ð°Ñ€ÑˆÑ€ÑƒÑ‚Ð¸Ð·Ð°Ñ‚Ð¾Ñ€Ð°. Данный Ð°Ð´Ñ€ÐµÑ ÐИКОГДРне " ++"будет изменÑÑ‚ÑŒÑÑ Ð²Ð¾ Ð²Ñ€ÐµÐ¼Ñ Ñ€Ð°Ð±Ð¾Ñ‚Ñ‹ olsrd. По умолчанию 0.0.0.0 (иÑпользуетÑÑ " ++"IP-Ð°Ð´Ñ€ÐµÑ Ð¿ÐµÑ€Ð²Ð¾Ð³Ð¾ Ñетевого интерфейÑа)." ++ ++msgid "Show IPv4" ++msgstr "" ++ ++msgid "Show IPv6" ++msgstr "" ++ ++msgid "Signal Noise Ratio in dB" ++msgstr "" ++ ++msgid "SmartGW" ++msgstr "SmartGW" ++ ++msgid "SmartGW announcements" ++msgstr "ОбъÑÐ²Ð»ÐµÐ½Ð¸Ñ SmartGW" ++ ++msgid "SmartGateway is not configured on this system." ++msgstr "SmartGW не Ñконфигурирован на Ñтой ÑиÑтеме." ++ ++msgid "Source address" ++msgstr "ÐÐ´Ñ€ÐµÑ Ð¸Ñточника" ++ ++msgid "" ++"Specifies the speed of the uplink in kilobits/s. First parameter is " ++"upstream, second parameter is downstream. Default is \"128 1024\"." ++msgstr "" ++"УÑтанавливает ÑкороÑÑ‚ÑŒ воÑходÑщего канала (кбит/Ñ). Первый параметр " ++"указывает на прÑмое, а второй на обратное направление. По умолчанию \"128 " ++"1024\"." ++ ++msgid "Speed of the uplink" ++msgstr "СкороÑÑ‚ÑŒ воÑходÑщего канала" ++ ++msgid "State" ++msgstr "СоÑтоÑние" ++ ++msgid "Status" ++msgstr "СтатуÑ" ++ ++msgid "Still usable (20 > SNR > 5)" ++msgstr "" ++ ++msgid "Still usable (4 < ETX < 10)" ++msgstr "" ++ ++msgid "Success rate of packages received from the neighbour" ++msgstr "ДоÑÑ‚Ð¸Ð³Ð½ÑƒÑ‚Ð°Ñ ÑкороÑÑ‚ÑŒ приема поÑылок от ÑоÑедних узлов" ++ ++msgid "Success rate of packages sent to the neighbour" ++msgstr "ДоÑÑ‚Ð¸Ð³Ð½ÑƒÑ‚Ð°Ñ ÑкороÑÑ‚ÑŒ передачи поÑылок к ÑоÑедним узлам" ++ ++msgid "TC" ++msgstr "TC" ++ ++msgid "TC interval" ++msgstr "Интервал TC" ++ ++msgid "TC validity time" ++msgstr "Ð’Ñ€ÐµÐ¼Ñ Ð´ÐµÐ¹ÑÑ‚Ð²Ð¸Ñ TC" ++ ++msgid "TOS value" ++msgstr "Значение ToS" ++ ++msgid "" ++"The OLSR daemon is an implementation of the Optimized Link State Routing " ++"protocol. As such it allows mesh routing for any network equipment. It runs " ++"on any wifi card that supports ad-hoc mode and of course on any ethernet " ++"device. Visit olsrd.org for help and " ++"documentation." ++msgstr "" ++"Ð¡ÐµÑ€Ð²Ð¸Ñ OLSRd реализует поддержку протокола OLSR (Optimized Link State " ++"Routing) и тем Ñамым обеÑпечивает ÑчеиÑтую маршрутизацию Ð´Ð»Ñ Ð»ÑŽÐ±Ð¾Ð³Ð¾ Ñетевого " ++"оборудованиÑ. OLSRd может работать на любом Wi-Fi-адаптере или уÑтройÑтве " ++"Ethernet Ñ Ð¿Ð¾Ð´Ð´ÐµÑ€Ð¶ÐºÐ¾Ð¹ режима ad-hoc. Более подробную информацию можно найти " ++"на olsr.org." ++ ++msgid "" ++"The fixed willingness to use. If not set willingness will be calculated " ++"dynamically based on battery/power status. Default is \"3\"." ++msgstr "" ++"ФикÑированное значение готовноÑти. ЕÑли не задано, то будет раÑÑчитыватьÑÑ " ++"динамичеÑки на оÑнове ÑоÑтоÑÐ½Ð¸Ñ Ð±Ð°Ñ‚Ð°Ñ€ÐµÐ¸/питаниÑ. По умолчанию \"3\"." ++ ++msgid "The interface OLSRd should serve." ++msgstr "ИнтерфейÑ, обÑлуживаемый OLSRd." ++ ++msgid "" ++"The port OLSR uses. This should usually stay at the IANA assigned port 698. " ++"It can have a value between 1 and 65535." ++msgstr "" ++"Порт, иÑпользуемый Ð´Ð»Ñ OLSR. РекомендуетÑÑ Ð¸Ñпользовать приÑвоенный IANA " ++"порт 698. ДопуÑтимо любое значение в диапазоне от 1 до 65535." ++ ++msgid "" ++"This can be used to signal the external IPv6 prefix of the uplink to the " ++"clients. This might allow a client to change it's local IPv6 address to use " ++"the IPv6 gateway without any kind of address translation. The maximum prefix " ++"length is 64 bits. Default is \"::/0\" (no prefix)." ++msgstr "" ++"Может быть иÑпользовано Ð´Ð»Ñ Ð¾Ð¿Ð¾Ð²ÐµÑ‰ÐµÐ½Ð¸Ñ ÐºÐ»Ð¸ÐµÐ½Ñ‚Ð¾Ð² об IPv6-префикÑе воÑходÑщего " ++"канала. Это может позволить клиентам изменÑÑ‚ÑŒ Ñвой локальный IPv6-Ð°Ð´Ñ€ÐµÑ Ð´Ð»Ñ " ++"иÑÐ¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ IPv6-шлюза без какой-либо транÑлÑции адреÑов. МакÑÐ¸Ð¼Ð°Ð»ÑŒÐ½Ð°Ñ " ++"длина префикÑа - 64 бита. По умолчанию \"::/0\" (без префикÑа)." ++ ++msgid "Timing and Validity" ++msgstr "Ð’Ñ€ÐµÐ¼Ñ Ð¸ Ñроки дейÑтвиÑ" ++ ++msgid "Topology" ++msgstr "ТопологиÑ" ++ ++msgid "" ++"Type of service value for the IP header of control traffic. Default is " ++"\"16\"." ++msgstr "" ++"Значение Ð¿Ð¾Ð»Ñ ToS IP -аголовка управлÑющего трафика. По умолчанию \"16\"." ++ ++msgid "Unable to connect to the OLSR daemon!" ++msgstr "Ðе удалоÑÑŒ подключитьÑÑ Ðº ÑервиÑу OLSR!" ++ ++msgid "Uplink" ++msgstr "ВоÑходÑщий канал" ++ ++msgid "Uplink uses NAT" ++msgstr "ВоÑходÑщий канал иÑпользует NAT" ++ ++msgid "Use hysteresis" ++msgstr "ИÑпользовать гиÑтерезиÑ" ++ ++msgid "Validity Time" ++msgstr "" ++ ++msgid "Version" ++msgstr "ВерÑиÑ" ++ ++msgid "Very good (ETX < 2)" ++msgstr "" ++ ++msgid "Very good (SNR > 30)" ++msgstr "" ++ ++msgid "WLAN" ++msgstr "WLAN" ++ ++msgid "" ++"Warning: kmod-ipip is not installed. Without kmod-ipip SmartGateway will not " ++"work, please install it." ++msgstr "" ++"Внимание: kmod-ipip не уÑтановлен. Без kmod-ipip SmartGateway не будет " ++"работать, пожалуйÑта, уÑтановите Ñтот пакет." ++ ++msgid "Weight" ++msgstr "ВеÑ" ++ ++msgid "" ++"When multiple links exist between hosts the weight of interface is used to " ++"determine the link to use. Normally the weight is automatically calculated " ++"by olsrd based on the characteristics of the interface, but here you can " ++"specify a fixed value. Olsrd will choose links with the lowest value.
    Note: Interface weight is used only when LinkQualityLevel is set to " ++"0. For any other value of LinkQualityLevel, the interface ETX value is used " ++"instead." ++msgstr "" ++"При иÑпользовании неÑкольких Ñоединений между хоÑтами, Ð²ÐµÑ Ñлужит Ð´Ð»Ñ Ð²Ñ‹Ð±Ð¾Ñ€Ð° " ++"иÑпользуемого интерфейÑа. Обычно, Ð²ÐµÑ Ñ€Ð°ÑÑчитываетÑÑ Ð°Ð²Ñ‚Ð¾Ð¼Ð°Ñ‚Ð¸Ñ‡ÐµÑки olsrd на " ++"оÑнове характериÑтик интерфейÑа, но данное поле позволÑет уÑтановить Ð²ÐµÑ " ++"вручную. Olsrd выберет ÑÐ¾ÐµÐ´Ð¸Ð½ÐµÐ½Ð¸Ñ Ñ Ð½Ð°Ð¸Ð¼ÐµÐ½ÑŒÑˆÐ¸Ð¼ значением веÑа.
    Замечание: Ð²ÐµÑ Ð¸Ð½Ñ‚ÐµÑ€Ñ„ÐµÐ¹Ñа иÑпользуетÑÑ Ñ‚Ð¾Ð»ÑŒÐºÐ¾ в Ñлучае уÑтановки Ð¿Ð¾Ð»Ñ " ++"\"Уровень LQ\" в 0. Ð”Ð»Ñ Ð»ÑŽÐ±Ñ‹Ñ… других значений Ð¿Ð¾Ð»Ñ \"Уровень LQ\", " ++"иÑпользуетÑÑ Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ðµ Ð¿Ð¾Ð»Ñ ETX." ++ ++msgid "" ++"Which kind of uplink is exported to the other mesh nodes. An uplink is " ++"detected by looking for a local HNA of 0.0.0.0/0, ::ffff:0:0/96 or 2000::/3. " ++"Default setting is \"both\"." ++msgstr "" ++"Какой вид воÑходÑщего канала ÑкпортируетÑÑ Ð´Ñ€ÑƒÐ³Ð¸Ð¼ узлам ÑчеиÑтой Ñети. " ++"Определение воÑходÑщего канала проиÑходит при наличии в локальном HNA " ++"0.0.0.0/0, ::ffff:0:0/96 или 2000::/3. Значение по умолчанию: \"оба\"." ++ ++#, fuzzy ++msgid "" ++"Which kind of uplink is exported to the other mesh nodes. An uplink is " ++"detected by looking for a local HNA6 ::ffff:0:0/96 or 2000::/3. Default " ++"setting is \"both\"." ++msgstr "" ++"Какой вид воÑходÑщего канала ÑкпортируетÑÑ Ð´Ñ€ÑƒÐ³Ð¸Ð¼ узлам ÑчеиÑтой Ñети. " ++"Определение воÑходÑщего канала проиÑходит при наличии в локальном HNA " ++"0.0.0.0/0, ::ffff:0:0/96 или 2000::/3. Значение по умолчанию: \"оба\"." ++ ++msgid "Willingness" ++msgstr "ГотовноÑÑ‚ÑŒ" ++ ++msgid "Yellow" ++msgstr "" ++ ++msgid "no" ++msgstr "" ++ ++msgid "yes" ++msgstr "" ++ ++#~ msgid "Device" ++#~ msgstr "УÑтройÑтво" ++ ++#~ msgid "" ++#~ "Make sure that OLSRd is running, the \"txtinfo\" plugin is loaded, " ++#~ "configured on port 2006 and accepts connections from \"127.0.0.1\"." ++#~ msgstr "" ++#~ "УдоÑтоверьтеÑÑŒ, что OLSRd работает, модуль \"txtinfo\" загружен, наÑтроен " ++#~ "на порт 2006 и принимает ÑÐ¾ÐµÐ´Ð¸Ð½ÐµÐ½Ð¸Ñ Ð¾Ñ‚ \"127.0.0.1\"." +diff --git a/feeds/luci/applications/luci-app-olsr/po/sk/olsr.po b/feeds/luci/applications/luci-app-olsr/po/sk/olsr.po +new file mode 100644 +index 0000000..fdd37e3 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-olsr/po/sk/olsr.po +@@ -0,0 +1,687 @@ ++msgid "" ++msgstr "" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Last-Translator: Automatically generated\n" ++"Language-Team: none\n" ++"MIME-Version: 1.0\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n" ++ ++msgid "Active MID announcements" ++msgstr "" ++ ++msgid "Active OLSR nodes" ++msgstr "" ++ ++msgid "Active host net announcements" ++msgstr "" ++ ++msgid "Advanced Settings" ++msgstr "" ++ ++msgid "Allow gateways with NAT" ++msgstr "" ++ ++msgid "Allow the selection of an outgoing ipv4 gateway with NAT" ++msgstr "" ++ ++msgid "Announce uplink" ++msgstr "" ++ ++msgid "Announced network" ++msgstr "" ++ ++msgid "Bad (ETX > 10)" ++msgstr "" ++ ++msgid "Bad (SNR < 5)" ++msgstr "" ++ ++msgid "Both values must use the dotted decimal notation." ++msgstr "" ++ ++msgid "Broadcast address" ++msgstr "" ++ ++msgid "Can only be a valid IPv4 or IPv6 address or 'default'" ++msgstr "" ++ ++msgid "Can only be a valid IPv6 address or 'default'" ++msgstr "" ++ ++msgid "Configuration" ++msgstr "" ++ ++msgid "" ++"Could not get any data. Make sure the jsoninfo plugin is installed and " ++"allows connections from localhost." ++msgstr "" ++ ++msgid "Display" ++msgstr "" ++ ++msgid "Downlink" ++msgstr "" ++ ++msgid "Download Config" ++msgstr "" ++ ++msgid "ETX" ++msgstr "" ++ ++msgid "Enable" ++msgstr "" ++ ++msgid "" ++"Enable SmartGateway. If it is disabled, then all other SmartGateway " ++"parameters are ignored. Default is \"no\"." ++msgstr "" ++ ++msgid "Enable this interface." ++msgstr "" ++ ++msgid "Enabled" ++msgstr "" ++ ++msgid "Expected retransmission count" ++msgstr "" ++ ++msgid "FIB metric" ++msgstr "" ++ ++msgid "" ++"FIBMetric controls the metric value of the host-routes OLSRd sets. \"flat\" " ++"means that the metric value is always 2. This is the preferred value because " ++"it helps the linux kernel routing to clean up older routes. \"correct\" uses " ++"the hopcount as the metric value. \"approx\" use the hopcount as the metric " ++"value too, but does only update the hopcount if the nexthop changes too. " ++"Default is \"flat\"." ++msgstr "" ++ ++msgid "Fisheye mechanism for TCs (checked means on). Default is \"on\"" ++msgstr "" ++ ++msgid "Gateway" ++msgstr "" ++ ++msgid "General Settings" ++msgstr "" ++ ++msgid "General settings" ++msgstr "" ++ ++msgid "Good (2 < ETX < 4)" ++msgstr "" ++ ++msgid "Good (30 > SNR > 20)" ++msgstr "" ++ ++msgid "Green" ++msgstr "" ++ ++msgid "HNA" ++msgstr "" ++ ++msgid "HNA Announcements" ++msgstr "" ++ ++msgid "HNA interval" ++msgstr "" ++ ++msgid "HNA validity time" ++msgstr "" ++ ++msgid "HNA6 Announcements" ++msgstr "" ++ ++msgid "Hello" ++msgstr "" ++ ++msgid "Hello interval" ++msgstr "" ++ ++msgid "Hello validity time" ++msgstr "" ++ ++msgid "Hide IPv4" ++msgstr "" ++ ++msgid "Hide IPv6" ++msgstr "" ++ ++msgid "Hna4" ++msgstr "" ++ ++msgid "Hna6" ++msgstr "" ++ ++msgid "Hops" ++msgstr "" ++ ++msgid "Hostname" ++msgstr "" ++ ++msgid "" ++"Hosts in a OLSR routed network can announce connecitivity to external " ++"networks using HNA messages." ++msgstr "" ++ ++msgid "" ++"Hosts in a OLSR routed network can announce connecitivity to external " ++"networks using HNA6 messages." ++msgstr "" ++ ++msgid "" ++"Hysteresis for link sensing (only for hopcount metric). Hysteresis adds more " ++"robustness to the link sensing but delays neighbor registration. Defaults is " ++"\"yes\"" ++msgstr "" ++ ++msgid "IP Addresses" ++msgstr "" ++ ++msgid "" ++"IP-version to use. If 6and4 is selected then one olsrd instance is started " ++"for each protocol." ++msgstr "" ++ ++msgid "IPv4" ++msgstr "" ++ ++msgid "IPv4 broadcast" ++msgstr "" ++ ++msgid "" ++"IPv4 broadcast address for outgoing OLSR packets. One useful example would " ++"be 255.255.255.255. Default is \"0.0.0.0\", which triggers the usage of the " ++"interface broadcast IP." ++msgstr "" ++ ++msgid "IPv4 source" ++msgstr "" ++ ++msgid "" ++"IPv4 src address for outgoing OLSR packages. Default is \"0.0.0.0\", which " ++"triggers usage of the interface IP." ++msgstr "" ++ ++msgid "IPv6" ++msgstr "" ++ ++msgid "IPv6 multicast" ++msgstr "" ++ ++msgid "" ++"IPv6 multicast address. Default is \"FF02::6D\", the manet-router linklocal " ++"multicast." ++msgstr "" ++ ++msgid "" ++"IPv6 network must be given in full notation, prefix must be in CIDR notation." ++msgstr "" ++ ++msgid "IPv6 source" ++msgstr "" ++ ++msgid "" ++"IPv6 src prefix. OLSRd will choose one of the interface IPs which matches " ++"the prefix of this parameter. Default is \"0::/0\", which triggers the usage " ++"of a not-linklocal interface IP." ++msgstr "" ++ ++msgid "IPv6-Prefix of the uplink" ++msgstr "" ++ ++msgid "" ++"If the route to the current gateway is to be changed, the ETX value of this " ++"gateway is multiplied with this value before it is compared to the new one. " ++"The parameter can be a value between 0.1 and 1.0, but should be close to 1.0 " ++"if changed.
    WARNING: This parameter should not be used together " ++"with the etx_ffeth metric!
    Defaults to \"1.0\"." ++msgstr "" ++ ++msgid "" ++"If this Node uses NAT for connections to the internet. Default is \"yes\"." ++msgstr "" ++ ++msgid "Interface" ++msgstr "" ++ ++msgid "" ++"Interface Mode is used to prevent unnecessary packet forwarding on switched " ++"ethernet interfaces. valid Modes are \"mesh\" and \"ether\". Default is " ++"\"mesh\"." ++msgstr "" ++ ++msgid "Interfaces" ++msgstr "" ++ ++msgid "Interfaces Defaults" ++msgstr "" ++ ++msgid "Internet protocol" ++msgstr "" ++ ++msgid "" ++"Interval to poll network interfaces for configuration changes (in seconds). " ++"Default is \"2.5\"." ++msgstr "" ++ ++msgid "Invalid Value for LQMult-Value. Must be between 0.01 and 1.0." ++msgstr "" ++ ++msgid "" ++"Invalid Value for LQMult-Value. You must use a decimal number between 0.01 " ++"and 1.0 here." ++msgstr "" ++ ++msgid "Known OLSR routes" ++msgstr "" ++ ++msgid "LQ" ++msgstr "" ++ ++msgid "LQ aging" ++msgstr "" ++ ++msgid "LQ algorithm" ++msgstr "" ++ ++msgid "LQ fisheye" ++msgstr "" ++ ++msgid "LQ level" ++msgstr "" ++ ++msgid "" ++"LQMult requires two values (IP address or 'default' and multiplicator) " ++"seperated by space." ++msgstr "" ++ ++msgid "Last hop" ++msgstr "" ++ ++msgid "Legend" ++msgstr "" ++ ++msgid "Library" ++msgstr "" ++ ++msgid "Link Quality Settings" ++msgstr "" ++ ++msgid "" ++"Link quality aging factor (only for lq level 2). Tuning parameter for " ++"etx_float and etx_fpm, smaller values mean slower changes of ETX value. " ++"(allowed values are between 0.01 and 1.0)" ++msgstr "" ++ ++msgid "" ++"Link quality algorithm (only for lq level 2).
    etx_float: " ++"floating point ETX with exponential aging
    etx_fpm : same as " ++"etx_float, but with integer arithmetic
    etx_ff : ETX freifunk, an " ++"etx variant which use all OLSR traffic (instead of only hellos) for ETX " ++"calculation
    etx_ffeth: incompatible variant of etx_ff that " ++"allows ethernet links with ETX 0.1.
    Defaults to \"etx_ff\"" ++msgstr "" ++ ++msgid "" ++"Link quality level switch between hopcount and cost-based (mostly ETX) " ++"routing.
    0 = do not use link quality
    2 = use link " ++"quality for MPR selection and routing
    Default is \"2\"" ++msgstr "" ++ ++msgid "LinkQuality Multiplicator" ++msgstr "" ++ ++msgid "Links per node (average)" ++msgstr "" ++ ++msgid "Links total" ++msgstr "" ++ ++msgid "Local interface IP" ++msgstr "" ++ ++msgid "MID" ++msgstr "" ++ ++msgid "MID interval" ++msgstr "" ++ ++msgid "MID validity time" ++msgstr "" ++ ++msgid "MTU" ++msgstr "" ++ ++msgid "Main IP" ++msgstr "" ++ ++msgid "" ++"Make sure that OLSRd is running, the \"jsoninfo\" plugin is loaded, " ++"configured on port 9090 and accepts connections from \"127.0.0.1\"." ++msgstr "" ++ ++msgid "Metric" ++msgstr "" ++ ++msgid "Mode" ++msgstr "" ++ ++msgid "" ++"Multiply routes with the factor given here. Allowed values are between 0.01 " ++"and 1.0. It is only used when LQ-Level is greater than 0. Examples:
    reduce LQ to 192.168.0.1 by half: 192.168.0.1 0.5
    reduce LQ to all " ++"nodes on this interface by 20%: default 0.8" ++msgstr "" ++ ++msgid "" ++"Multiply routes with the factor given here. Allowed values are between 0.01 " ++"and 1.0. It is only used when LQ-Level is greater than 0. Examples:
    reduce LQ to fd91:662e:3c58::1 by half: fd91:662e:3c58::1 0.5
    reduce " ++"LQ to all nodes on this interface by 20%: default 0.8" ++msgstr "" ++ ++msgid "NAT threshold" ++msgstr "" ++ ++msgid "NLQ" ++msgstr "" ++ ++msgid "Neighbors" ++msgstr "" ++ ++msgid "Neighbour IP" ++msgstr "" ++ ++msgid "Neighbours" ++msgstr "" ++ ++msgid "Netmask" ++msgstr "" ++ ++msgid "Network" ++msgstr "" ++ ++msgid "Network address" ++msgstr "" ++ ++msgid "Nic changes poll interval" ++msgstr "" ++ ++msgid "Nodes" ++msgstr "" ++ ++msgid "OLSR" ++msgstr "" ++ ++msgid "OLSR - Display Options" ++msgstr "" ++ ++msgid "OLSR - HNA-Announcements" ++msgstr "" ++ ++msgid "OLSR - HNA6-Announcements" ++msgstr "" ++ ++msgid "OLSR - Plugins" ++msgstr "" ++ ++msgid "OLSR Daemon" ++msgstr "" ++ ++msgid "OLSR Daemon - Interface" ++msgstr "" ++ ++msgid "OLSR connections" ++msgstr "" ++ ++msgid "OLSR gateway" ++msgstr "" ++ ++msgid "OLSR node" ++msgstr "" ++ ++msgid "Orange" ++msgstr "" ++ ++msgid "Overview" ++msgstr "" ++ ++msgid "Overview of currently active OLSR host net announcements" ++msgstr "" ++ ++msgid "Overview of currently established OLSR connections" ++msgstr "" ++ ++msgid "Overview of currently known OLSR nodes" ++msgstr "" ++ ++msgid "Overview of currently known routes to other OLSR nodes" ++msgstr "" ++ ++msgid "Overview of interfaces where OLSR is running" ++msgstr "" ++ ++msgid "Overview of known multiple interface announcements" ++msgstr "" ++ ++msgid "Overview of smart gateways in this network" ++msgstr "" ++ ++msgid "Plugin configuration" ++msgstr "" ++ ++msgid "Plugins" ++msgstr "" ++ ++msgid "Polling rate for OLSR sockets in seconds. Default is 0.05." ++msgstr "" ++ ++msgid "Pollrate" ++msgstr "" ++ ++msgid "Port" ++msgstr "" ++ ++msgid "Prefix" ++msgstr "" ++ ++msgid "Red" ++msgstr "" ++ ++msgid "Resolve" ++msgstr "" ++ ++msgid "" ++"Resolve hostnames on status pages. It is generally safe to allow this, but " ++"if you use public IPs and have unstable DNS-Setup then those pages will load " ++"really slow. In this case disable it here." ++msgstr "" ++ ++msgid "Routes" ++msgstr "" ++ ++msgid "Secondary OLSR interfaces" ++msgstr "" ++ ++msgid "" ++"Sets the main IP (originator ip) of the router. This IP will NEVER change " ++"during the uptime of olsrd. Default is 0.0.0.0, which triggers usage of the " ++"IP of the first interface." ++msgstr "" ++ ++msgid "" ++"Sets the main IP (originator ip) of the router. This IP will NEVER change " ++"during the uptime of olsrd. Default is ::, which triggers usage of the IP of " ++"the first interface." ++msgstr "" ++ ++msgid "Show IPv4" ++msgstr "" ++ ++msgid "Show IPv6" ++msgstr "" ++ ++msgid "Signal Noise Ratio in dB" ++msgstr "" ++ ++msgid "SmartGW" ++msgstr "" ++ ++msgid "SmartGW announcements" ++msgstr "" ++ ++msgid "SmartGateway is not configured on this system." ++msgstr "" ++ ++msgid "Source address" ++msgstr "" ++ ++msgid "" ++"Specifies the speed of the uplink in kilobits/s. First parameter is " ++"upstream, second parameter is downstream. Default is \"128 1024\"." ++msgstr "" ++ ++msgid "Speed of the uplink" ++msgstr "" ++ ++msgid "State" ++msgstr "" ++ ++msgid "Status" ++msgstr "" ++ ++msgid "Still usable (20 > SNR > 5)" ++msgstr "" ++ ++msgid "Still usable (4 < ETX < 10)" ++msgstr "" ++ ++msgid "Success rate of packages received from the neighbour" ++msgstr "" ++ ++msgid "Success rate of packages sent to the neighbour" ++msgstr "" ++ ++msgid "TC" ++msgstr "" ++ ++msgid "TC interval" ++msgstr "" ++ ++msgid "TC validity time" ++msgstr "" ++ ++msgid "TOS value" ++msgstr "" ++ ++msgid "" ++"The OLSR daemon is an implementation of the Optimized Link State Routing " ++"protocol. As such it allows mesh routing for any network equipment. It runs " ++"on any wifi card that supports ad-hoc mode and of course on any ethernet " ++"device. Visit olsrd.org for help and " ++"documentation." ++msgstr "" ++ ++msgid "" ++"The fixed willingness to use. If not set willingness will be calculated " ++"dynamically based on battery/power status. Default is \"3\"." ++msgstr "" ++ ++msgid "The interface OLSRd should serve." ++msgstr "" ++ ++msgid "" ++"The port OLSR uses. This should usually stay at the IANA assigned port 698. " ++"It can have a value between 1 and 65535." ++msgstr "" ++ ++msgid "" ++"This can be used to signal the external IPv6 prefix of the uplink to the " ++"clients. This might allow a client to change it's local IPv6 address to use " ++"the IPv6 gateway without any kind of address translation. The maximum prefix " ++"length is 64 bits. Default is \"::/0\" (no prefix)." ++msgstr "" ++ ++msgid "Timing and Validity" ++msgstr "" ++ ++msgid "Topology" ++msgstr "" ++ ++msgid "" ++"Type of service value for the IP header of control traffic. Default is " ++"\"16\"." ++msgstr "" ++ ++msgid "Unable to connect to the OLSR daemon!" ++msgstr "" ++ ++msgid "Uplink" ++msgstr "" ++ ++msgid "Uplink uses NAT" ++msgstr "" ++ ++msgid "Use hysteresis" ++msgstr "" ++ ++msgid "Validity Time" ++msgstr "" ++ ++msgid "Version" ++msgstr "" ++ ++msgid "Very good (ETX < 2)" ++msgstr "" ++ ++msgid "Very good (SNR > 30)" ++msgstr "" ++ ++msgid "WLAN" ++msgstr "" ++ ++msgid "" ++"Warning: kmod-ipip is not installed. Without kmod-ipip SmartGateway will not " ++"work, please install it." ++msgstr "" ++ ++msgid "Weight" ++msgstr "" ++ ++msgid "" ++"When multiple links exist between hosts the weight of interface is used to " ++"determine the link to use. Normally the weight is automatically calculated " ++"by olsrd based on the characteristics of the interface, but here you can " ++"specify a fixed value. Olsrd will choose links with the lowest value.
    Note: Interface weight is used only when LinkQualityLevel is set to " ++"0. For any other value of LinkQualityLevel, the interface ETX value is used " ++"instead." ++msgstr "" ++ ++msgid "" ++"Which kind of uplink is exported to the other mesh nodes. An uplink is " ++"detected by looking for a local HNA of 0.0.0.0/0, ::ffff:0:0/96 or 2000::/3. " ++"Default setting is \"both\"." ++msgstr "" ++ ++msgid "" ++"Which kind of uplink is exported to the other mesh nodes. An uplink is " ++"detected by looking for a local HNA6 ::ffff:0:0/96 or 2000::/3. Default " ++"setting is \"both\"." ++msgstr "" ++ ++msgid "Willingness" ++msgstr "" ++ ++msgid "Yellow" ++msgstr "" ++ ++msgid "no" ++msgstr "" ++ ++msgid "yes" ++msgstr "" +diff --git a/feeds/luci/applications/luci-app-olsr/po/sv/olsr.po b/feeds/luci/applications/luci-app-olsr/po/sv/olsr.po +new file mode 100644 +index 0000000..9af47a4 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-olsr/po/sv/olsr.po +@@ -0,0 +1,688 @@ ++msgid "" ++msgstr "" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Last-Translator: Automatically generated\n" ++"Language-Team: none\n" ++"Language: sv\n" ++"MIME-Version: 1.0\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n != 1);\n" ++ ++msgid "Active MID announcements" ++msgstr "" ++ ++msgid "Active OLSR nodes" ++msgstr "" ++ ++msgid "Active host net announcements" ++msgstr "" ++ ++msgid "Advanced Settings" ++msgstr "" ++ ++msgid "Allow gateways with NAT" ++msgstr "" ++ ++msgid "Allow the selection of an outgoing ipv4 gateway with NAT" ++msgstr "" ++ ++msgid "Announce uplink" ++msgstr "" ++ ++msgid "Announced network" ++msgstr "" ++ ++msgid "Bad (ETX > 10)" ++msgstr "" ++ ++msgid "Bad (SNR < 5)" ++msgstr "" ++ ++msgid "Both values must use the dotted decimal notation." ++msgstr "" ++ ++msgid "Broadcast address" ++msgstr "" ++ ++msgid "Can only be a valid IPv4 or IPv6 address or 'default'" ++msgstr "" ++ ++msgid "Can only be a valid IPv6 address or 'default'" ++msgstr "" ++ ++msgid "Configuration" ++msgstr "" ++ ++msgid "" ++"Could not get any data. Make sure the jsoninfo plugin is installed and " ++"allows connections from localhost." ++msgstr "" ++ ++msgid "Display" ++msgstr "" ++ ++msgid "Downlink" ++msgstr "" ++ ++msgid "Download Config" ++msgstr "" ++ ++msgid "ETX" ++msgstr "" ++ ++msgid "Enable" ++msgstr "" ++ ++msgid "" ++"Enable SmartGateway. If it is disabled, then all other SmartGateway " ++"parameters are ignored. Default is \"no\"." ++msgstr "" ++ ++msgid "Enable this interface." ++msgstr "" ++ ++msgid "Enabled" ++msgstr "" ++ ++msgid "Expected retransmission count" ++msgstr "" ++ ++msgid "FIB metric" ++msgstr "" ++ ++msgid "" ++"FIBMetric controls the metric value of the host-routes OLSRd sets. \"flat\" " ++"means that the metric value is always 2. This is the preferred value because " ++"it helps the linux kernel routing to clean up older routes. \"correct\" uses " ++"the hopcount as the metric value. \"approx\" use the hopcount as the metric " ++"value too, but does only update the hopcount if the nexthop changes too. " ++"Default is \"flat\"." ++msgstr "" ++ ++msgid "Fisheye mechanism for TCs (checked means on). Default is \"on\"" ++msgstr "" ++ ++msgid "Gateway" ++msgstr "" ++ ++msgid "General Settings" ++msgstr "" ++ ++msgid "General settings" ++msgstr "" ++ ++msgid "Good (2 < ETX < 4)" ++msgstr "" ++ ++msgid "Good (30 > SNR > 20)" ++msgstr "" ++ ++msgid "Green" ++msgstr "" ++ ++msgid "HNA" ++msgstr "" ++ ++msgid "HNA Announcements" ++msgstr "" ++ ++msgid "HNA interval" ++msgstr "" ++ ++msgid "HNA validity time" ++msgstr "" ++ ++msgid "HNA6 Announcements" ++msgstr "" ++ ++msgid "Hello" ++msgstr "" ++ ++msgid "Hello interval" ++msgstr "" ++ ++msgid "Hello validity time" ++msgstr "" ++ ++msgid "Hide IPv4" ++msgstr "" ++ ++msgid "Hide IPv6" ++msgstr "" ++ ++msgid "Hna4" ++msgstr "" ++ ++msgid "Hna6" ++msgstr "" ++ ++msgid "Hops" ++msgstr "" ++ ++msgid "Hostname" ++msgstr "" ++ ++msgid "" ++"Hosts in a OLSR routed network can announce connecitivity to external " ++"networks using HNA messages." ++msgstr "" ++ ++msgid "" ++"Hosts in a OLSR routed network can announce connecitivity to external " ++"networks using HNA6 messages." ++msgstr "" ++ ++msgid "" ++"Hysteresis for link sensing (only for hopcount metric). Hysteresis adds more " ++"robustness to the link sensing but delays neighbor registration. Defaults is " ++"\"yes\"" ++msgstr "" ++ ++msgid "IP Addresses" ++msgstr "" ++ ++msgid "" ++"IP-version to use. If 6and4 is selected then one olsrd instance is started " ++"for each protocol." ++msgstr "" ++ ++msgid "IPv4" ++msgstr "" ++ ++msgid "IPv4 broadcast" ++msgstr "" ++ ++msgid "" ++"IPv4 broadcast address for outgoing OLSR packets. One useful example would " ++"be 255.255.255.255. Default is \"0.0.0.0\", which triggers the usage of the " ++"interface broadcast IP." ++msgstr "" ++ ++msgid "IPv4 source" ++msgstr "" ++ ++msgid "" ++"IPv4 src address for outgoing OLSR packages. Default is \"0.0.0.0\", which " ++"triggers usage of the interface IP." ++msgstr "" ++ ++msgid "IPv6" ++msgstr "" ++ ++msgid "IPv6 multicast" ++msgstr "" ++ ++msgid "" ++"IPv6 multicast address. Default is \"FF02::6D\", the manet-router linklocal " ++"multicast." ++msgstr "" ++ ++msgid "" ++"IPv6 network must be given in full notation, prefix must be in CIDR notation." ++msgstr "" ++ ++msgid "IPv6 source" ++msgstr "" ++ ++msgid "" ++"IPv6 src prefix. OLSRd will choose one of the interface IPs which matches " ++"the prefix of this parameter. Default is \"0::/0\", which triggers the usage " ++"of a not-linklocal interface IP." ++msgstr "" ++ ++msgid "IPv6-Prefix of the uplink" ++msgstr "" ++ ++msgid "" ++"If the route to the current gateway is to be changed, the ETX value of this " ++"gateway is multiplied with this value before it is compared to the new one. " ++"The parameter can be a value between 0.1 and 1.0, but should be close to 1.0 " ++"if changed.
    WARNING: This parameter should not be used together " ++"with the etx_ffeth metric!
    Defaults to \"1.0\"." ++msgstr "" ++ ++msgid "" ++"If this Node uses NAT for connections to the internet. Default is \"yes\"." ++msgstr "" ++ ++msgid "Interface" ++msgstr "" ++ ++msgid "" ++"Interface Mode is used to prevent unnecessary packet forwarding on switched " ++"ethernet interfaces. valid Modes are \"mesh\" and \"ether\". Default is " ++"\"mesh\"." ++msgstr "" ++ ++msgid "Interfaces" ++msgstr "" ++ ++msgid "Interfaces Defaults" ++msgstr "" ++ ++msgid "Internet protocol" ++msgstr "" ++ ++msgid "" ++"Interval to poll network interfaces for configuration changes (in seconds). " ++"Default is \"2.5\"." ++msgstr "" ++ ++msgid "Invalid Value for LQMult-Value. Must be between 0.01 and 1.0." ++msgstr "" ++ ++msgid "" ++"Invalid Value for LQMult-Value. You must use a decimal number between 0.01 " ++"and 1.0 here." ++msgstr "" ++ ++msgid "Known OLSR routes" ++msgstr "" ++ ++msgid "LQ" ++msgstr "" ++ ++msgid "LQ aging" ++msgstr "" ++ ++msgid "LQ algorithm" ++msgstr "" ++ ++msgid "LQ fisheye" ++msgstr "" ++ ++msgid "LQ level" ++msgstr "" ++ ++msgid "" ++"LQMult requires two values (IP address or 'default' and multiplicator) " ++"seperated by space." ++msgstr "" ++ ++msgid "Last hop" ++msgstr "" ++ ++msgid "Legend" ++msgstr "" ++ ++msgid "Library" ++msgstr "" ++ ++msgid "Link Quality Settings" ++msgstr "" ++ ++msgid "" ++"Link quality aging factor (only for lq level 2). Tuning parameter for " ++"etx_float and etx_fpm, smaller values mean slower changes of ETX value. " ++"(allowed values are between 0.01 and 1.0)" ++msgstr "" ++ ++msgid "" ++"Link quality algorithm (only for lq level 2).
    etx_float: " ++"floating point ETX with exponential aging
    etx_fpm : same as " ++"etx_float, but with integer arithmetic
    etx_ff : ETX freifunk, an " ++"etx variant which use all OLSR traffic (instead of only hellos) for ETX " ++"calculation
    etx_ffeth: incompatible variant of etx_ff that " ++"allows ethernet links with ETX 0.1.
    Defaults to \"etx_ff\"" ++msgstr "" ++ ++msgid "" ++"Link quality level switch between hopcount and cost-based (mostly ETX) " ++"routing.
    0 = do not use link quality
    2 = use link " ++"quality for MPR selection and routing
    Default is \"2\"" ++msgstr "" ++ ++msgid "LinkQuality Multiplicator" ++msgstr "" ++ ++msgid "Links per node (average)" ++msgstr "" ++ ++msgid "Links total" ++msgstr "" ++ ++msgid "Local interface IP" ++msgstr "" ++ ++msgid "MID" ++msgstr "" ++ ++msgid "MID interval" ++msgstr "" ++ ++msgid "MID validity time" ++msgstr "" ++ ++msgid "MTU" ++msgstr "" ++ ++msgid "Main IP" ++msgstr "" ++ ++msgid "" ++"Make sure that OLSRd is running, the \"jsoninfo\" plugin is loaded, " ++"configured on port 9090 and accepts connections from \"127.0.0.1\"." ++msgstr "" ++ ++msgid "Metric" ++msgstr "" ++ ++msgid "Mode" ++msgstr "" ++ ++msgid "" ++"Multiply routes with the factor given here. Allowed values are between 0.01 " ++"and 1.0. It is only used when LQ-Level is greater than 0. Examples:
    reduce LQ to 192.168.0.1 by half: 192.168.0.1 0.5
    reduce LQ to all " ++"nodes on this interface by 20%: default 0.8" ++msgstr "" ++ ++msgid "" ++"Multiply routes with the factor given here. Allowed values are between 0.01 " ++"and 1.0. It is only used when LQ-Level is greater than 0. Examples:
    reduce LQ to fd91:662e:3c58::1 by half: fd91:662e:3c58::1 0.5
    reduce " ++"LQ to all nodes on this interface by 20%: default 0.8" ++msgstr "" ++ ++msgid "NAT threshold" ++msgstr "" ++ ++msgid "NLQ" ++msgstr "" ++ ++msgid "Neighbors" ++msgstr "" ++ ++msgid "Neighbour IP" ++msgstr "" ++ ++msgid "Neighbours" ++msgstr "" ++ ++msgid "Netmask" ++msgstr "" ++ ++msgid "Network" ++msgstr "" ++ ++msgid "Network address" ++msgstr "" ++ ++msgid "Nic changes poll interval" ++msgstr "" ++ ++msgid "Nodes" ++msgstr "" ++ ++msgid "OLSR" ++msgstr "" ++ ++msgid "OLSR - Display Options" ++msgstr "" ++ ++msgid "OLSR - HNA-Announcements" ++msgstr "" ++ ++msgid "OLSR - HNA6-Announcements" ++msgstr "" ++ ++msgid "OLSR - Plugins" ++msgstr "" ++ ++msgid "OLSR Daemon" ++msgstr "" ++ ++msgid "OLSR Daemon - Interface" ++msgstr "" ++ ++msgid "OLSR connections" ++msgstr "" ++ ++msgid "OLSR gateway" ++msgstr "" ++ ++msgid "OLSR node" ++msgstr "" ++ ++msgid "Orange" ++msgstr "" ++ ++msgid "Overview" ++msgstr "" ++ ++msgid "Overview of currently active OLSR host net announcements" ++msgstr "" ++ ++msgid "Overview of currently established OLSR connections" ++msgstr "" ++ ++msgid "Overview of currently known OLSR nodes" ++msgstr "" ++ ++msgid "Overview of currently known routes to other OLSR nodes" ++msgstr "" ++ ++msgid "Overview of interfaces where OLSR is running" ++msgstr "" ++ ++msgid "Overview of known multiple interface announcements" ++msgstr "" ++ ++msgid "Overview of smart gateways in this network" ++msgstr "" ++ ++msgid "Plugin configuration" ++msgstr "" ++ ++msgid "Plugins" ++msgstr "" ++ ++msgid "Polling rate for OLSR sockets in seconds. Default is 0.05." ++msgstr "" ++ ++msgid "Pollrate" ++msgstr "" ++ ++msgid "Port" ++msgstr "" ++ ++msgid "Prefix" ++msgstr "" ++ ++msgid "Red" ++msgstr "" ++ ++msgid "Resolve" ++msgstr "" ++ ++msgid "" ++"Resolve hostnames on status pages. It is generally safe to allow this, but " ++"if you use public IPs and have unstable DNS-Setup then those pages will load " ++"really slow. In this case disable it here." ++msgstr "" ++ ++msgid "Routes" ++msgstr "" ++ ++msgid "Secondary OLSR interfaces" ++msgstr "" ++ ++msgid "" ++"Sets the main IP (originator ip) of the router. This IP will NEVER change " ++"during the uptime of olsrd. Default is 0.0.0.0, which triggers usage of the " ++"IP of the first interface." ++msgstr "" ++ ++msgid "" ++"Sets the main IP (originator ip) of the router. This IP will NEVER change " ++"during the uptime of olsrd. Default is ::, which triggers usage of the IP of " ++"the first interface." ++msgstr "" ++ ++msgid "Show IPv4" ++msgstr "" ++ ++msgid "Show IPv6" ++msgstr "" ++ ++msgid "Signal Noise Ratio in dB" ++msgstr "" ++ ++msgid "SmartGW" ++msgstr "" ++ ++msgid "SmartGW announcements" ++msgstr "" ++ ++msgid "SmartGateway is not configured on this system." ++msgstr "" ++ ++msgid "Source address" ++msgstr "" ++ ++msgid "" ++"Specifies the speed of the uplink in kilobits/s. First parameter is " ++"upstream, second parameter is downstream. Default is \"128 1024\"." ++msgstr "" ++ ++msgid "Speed of the uplink" ++msgstr "" ++ ++msgid "State" ++msgstr "" ++ ++msgid "Status" ++msgstr "" ++ ++msgid "Still usable (20 > SNR > 5)" ++msgstr "" ++ ++msgid "Still usable (4 < ETX < 10)" ++msgstr "" ++ ++msgid "Success rate of packages received from the neighbour" ++msgstr "" ++ ++msgid "Success rate of packages sent to the neighbour" ++msgstr "" ++ ++msgid "TC" ++msgstr "" ++ ++msgid "TC interval" ++msgstr "" ++ ++msgid "TC validity time" ++msgstr "" ++ ++msgid "TOS value" ++msgstr "" ++ ++msgid "" ++"The OLSR daemon is an implementation of the Optimized Link State Routing " ++"protocol. As such it allows mesh routing for any network equipment. It runs " ++"on any wifi card that supports ad-hoc mode and of course on any ethernet " ++"device. Visit olsrd.org for help and " ++"documentation." ++msgstr "" ++ ++msgid "" ++"The fixed willingness to use. If not set willingness will be calculated " ++"dynamically based on battery/power status. Default is \"3\"." ++msgstr "" ++ ++msgid "The interface OLSRd should serve." ++msgstr "" ++ ++msgid "" ++"The port OLSR uses. This should usually stay at the IANA assigned port 698. " ++"It can have a value between 1 and 65535." ++msgstr "" ++ ++msgid "" ++"This can be used to signal the external IPv6 prefix of the uplink to the " ++"clients. This might allow a client to change it's local IPv6 address to use " ++"the IPv6 gateway without any kind of address translation. The maximum prefix " ++"length is 64 bits. Default is \"::/0\" (no prefix)." ++msgstr "" ++ ++msgid "Timing and Validity" ++msgstr "" ++ ++msgid "Topology" ++msgstr "" ++ ++msgid "" ++"Type of service value for the IP header of control traffic. Default is " ++"\"16\"." ++msgstr "" ++ ++msgid "Unable to connect to the OLSR daemon!" ++msgstr "" ++ ++msgid "Uplink" ++msgstr "" ++ ++msgid "Uplink uses NAT" ++msgstr "" ++ ++msgid "Use hysteresis" ++msgstr "" ++ ++msgid "Validity Time" ++msgstr "" ++ ++msgid "Version" ++msgstr "" ++ ++msgid "Very good (ETX < 2)" ++msgstr "" ++ ++msgid "Very good (SNR > 30)" ++msgstr "" ++ ++msgid "WLAN" ++msgstr "" ++ ++msgid "" ++"Warning: kmod-ipip is not installed. Without kmod-ipip SmartGateway will not " ++"work, please install it." ++msgstr "" ++ ++msgid "Weight" ++msgstr "" ++ ++msgid "" ++"When multiple links exist between hosts the weight of interface is used to " ++"determine the link to use. Normally the weight is automatically calculated " ++"by olsrd based on the characteristics of the interface, but here you can " ++"specify a fixed value. Olsrd will choose links with the lowest value.
    Note: Interface weight is used only when LinkQualityLevel is set to " ++"0. For any other value of LinkQualityLevel, the interface ETX value is used " ++"instead." ++msgstr "" ++ ++msgid "" ++"Which kind of uplink is exported to the other mesh nodes. An uplink is " ++"detected by looking for a local HNA of 0.0.0.0/0, ::ffff:0:0/96 or 2000::/3. " ++"Default setting is \"both\"." ++msgstr "" ++ ++msgid "" ++"Which kind of uplink is exported to the other mesh nodes. An uplink is " ++"detected by looking for a local HNA6 ::ffff:0:0/96 or 2000::/3. Default " ++"setting is \"both\"." ++msgstr "" ++ ++msgid "Willingness" ++msgstr "" ++ ++msgid "Yellow" ++msgstr "" ++ ++msgid "no" ++msgstr "" ++ ++msgid "yes" ++msgstr "" +diff --git a/feeds/luci/applications/luci-app-olsr/po/templates/olsr.pot b/feeds/luci/applications/luci-app-olsr/po/templates/olsr.pot +new file mode 100644 +index 0000000..6bd63c2 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-olsr/po/templates/olsr.pot +@@ -0,0 +1,680 @@ ++msgid "" ++msgstr "Content-Type: text/plain; charset=UTF-8" ++ ++msgid "Active MID announcements" ++msgstr "" ++ ++msgid "Active OLSR nodes" ++msgstr "" ++ ++msgid "Active host net announcements" ++msgstr "" ++ ++msgid "Advanced Settings" ++msgstr "" ++ ++msgid "Allow gateways with NAT" ++msgstr "" ++ ++msgid "Allow the selection of an outgoing ipv4 gateway with NAT" ++msgstr "" ++ ++msgid "Announce uplink" ++msgstr "" ++ ++msgid "Announced network" ++msgstr "" ++ ++msgid "Bad (ETX > 10)" ++msgstr "" ++ ++msgid "Bad (SNR < 5)" ++msgstr "" ++ ++msgid "Both values must use the dotted decimal notation." ++msgstr "" ++ ++msgid "Broadcast address" ++msgstr "" ++ ++msgid "Can only be a valid IPv4 or IPv6 address or 'default'" ++msgstr "" ++ ++msgid "Can only be a valid IPv6 address or 'default'" ++msgstr "" ++ ++msgid "Configuration" ++msgstr "" ++ ++msgid "" ++"Could not get any data. Make sure the jsoninfo plugin is installed and " ++"allows connections from localhost." ++msgstr "" ++ ++msgid "Display" ++msgstr "" ++ ++msgid "Downlink" ++msgstr "" ++ ++msgid "Download Config" ++msgstr "" ++ ++msgid "ETX" ++msgstr "" ++ ++msgid "Enable" ++msgstr "" ++ ++msgid "" ++"Enable SmartGateway. If it is disabled, then all other SmartGateway " ++"parameters are ignored. Default is \"no\"." ++msgstr "" ++ ++msgid "Enable this interface." ++msgstr "" ++ ++msgid "Enabled" ++msgstr "" ++ ++msgid "Expected retransmission count" ++msgstr "" ++ ++msgid "FIB metric" ++msgstr "" ++ ++msgid "" ++"FIBMetric controls the metric value of the host-routes OLSRd sets. \"flat\" " ++"means that the metric value is always 2. This is the preferred value because " ++"it helps the linux kernel routing to clean up older routes. \"correct\" uses " ++"the hopcount as the metric value. \"approx\" use the hopcount as the metric " ++"value too, but does only update the hopcount if the nexthop changes too. " ++"Default is \"flat\"." ++msgstr "" ++ ++msgid "Fisheye mechanism for TCs (checked means on). Default is \"on\"" ++msgstr "" ++ ++msgid "Gateway" ++msgstr "" ++ ++msgid "General Settings" ++msgstr "" ++ ++msgid "General settings" ++msgstr "" ++ ++msgid "Good (2 < ETX < 4)" ++msgstr "" ++ ++msgid "Good (30 > SNR > 20)" ++msgstr "" ++ ++msgid "Green" ++msgstr "" ++ ++msgid "HNA" ++msgstr "" ++ ++msgid "HNA Announcements" ++msgstr "" ++ ++msgid "HNA interval" ++msgstr "" ++ ++msgid "HNA validity time" ++msgstr "" ++ ++msgid "HNA6 Announcements" ++msgstr "" ++ ++msgid "Hello" ++msgstr "" ++ ++msgid "Hello interval" ++msgstr "" ++ ++msgid "Hello validity time" ++msgstr "" ++ ++msgid "Hide IPv4" ++msgstr "" ++ ++msgid "Hide IPv6" ++msgstr "" ++ ++msgid "Hna4" ++msgstr "" ++ ++msgid "Hna6" ++msgstr "" ++ ++msgid "Hops" ++msgstr "" ++ ++msgid "Hostname" ++msgstr "" ++ ++msgid "" ++"Hosts in a OLSR routed network can announce connecitivity to external " ++"networks using HNA messages." ++msgstr "" ++ ++msgid "" ++"Hosts in a OLSR routed network can announce connecitivity to external " ++"networks using HNA6 messages." ++msgstr "" ++ ++msgid "" ++"Hysteresis for link sensing (only for hopcount metric). Hysteresis adds more " ++"robustness to the link sensing but delays neighbor registration. Defaults is " ++"\"yes\"" ++msgstr "" ++ ++msgid "IP Addresses" ++msgstr "" ++ ++msgid "" ++"IP-version to use. If 6and4 is selected then one olsrd instance is started " ++"for each protocol." ++msgstr "" ++ ++msgid "IPv4" ++msgstr "" ++ ++msgid "IPv4 broadcast" ++msgstr "" ++ ++msgid "" ++"IPv4 broadcast address for outgoing OLSR packets. One useful example would " ++"be 255.255.255.255. Default is \"0.0.0.0\", which triggers the usage of the " ++"interface broadcast IP." ++msgstr "" ++ ++msgid "IPv4 source" ++msgstr "" ++ ++msgid "" ++"IPv4 src address for outgoing OLSR packages. Default is \"0.0.0.0\", which " ++"triggers usage of the interface IP." ++msgstr "" ++ ++msgid "IPv6" ++msgstr "" ++ ++msgid "IPv6 multicast" ++msgstr "" ++ ++msgid "" ++"IPv6 multicast address. Default is \"FF02::6D\", the manet-router linklocal " ++"multicast." ++msgstr "" ++ ++msgid "" ++"IPv6 network must be given in full notation, prefix must be in CIDR notation." ++msgstr "" ++ ++msgid "IPv6 source" ++msgstr "" ++ ++msgid "" ++"IPv6 src prefix. OLSRd will choose one of the interface IPs which matches " ++"the prefix of this parameter. Default is \"0::/0\", which triggers the usage " ++"of a not-linklocal interface IP." ++msgstr "" ++ ++msgid "IPv6-Prefix of the uplink" ++msgstr "" ++ ++msgid "" ++"If the route to the current gateway is to be changed, the ETX value of this " ++"gateway is multiplied with this value before it is compared to the new one. " ++"The parameter can be a value between 0.1 and 1.0, but should be close to 1.0 " ++"if changed.
    WARNING: This parameter should not be used together " ++"with the etx_ffeth metric!
    Defaults to \"1.0\"." ++msgstr "" ++ ++msgid "" ++"If this Node uses NAT for connections to the internet. Default is \"yes\"." ++msgstr "" ++ ++msgid "Interface" ++msgstr "" ++ ++msgid "" ++"Interface Mode is used to prevent unnecessary packet forwarding on switched " ++"ethernet interfaces. valid Modes are \"mesh\" and \"ether\". Default is " ++"\"mesh\"." ++msgstr "" ++ ++msgid "Interfaces" ++msgstr "" ++ ++msgid "Interfaces Defaults" ++msgstr "" ++ ++msgid "Internet protocol" ++msgstr "" ++ ++msgid "" ++"Interval to poll network interfaces for configuration changes (in seconds). " ++"Default is \"2.5\"." ++msgstr "" ++ ++msgid "Invalid Value for LQMult-Value. Must be between 0.01 and 1.0." ++msgstr "" ++ ++msgid "" ++"Invalid Value for LQMult-Value. You must use a decimal number between 0.01 " ++"and 1.0 here." ++msgstr "" ++ ++msgid "Known OLSR routes" ++msgstr "" ++ ++msgid "LQ" ++msgstr "" ++ ++msgid "LQ aging" ++msgstr "" ++ ++msgid "LQ algorithm" ++msgstr "" ++ ++msgid "LQ fisheye" ++msgstr "" ++ ++msgid "LQ level" ++msgstr "" ++ ++msgid "" ++"LQMult requires two values (IP address or 'default' and multiplicator) " ++"seperated by space." ++msgstr "" ++ ++msgid "Last hop" ++msgstr "" ++ ++msgid "Legend" ++msgstr "" ++ ++msgid "Library" ++msgstr "" ++ ++msgid "Link Quality Settings" ++msgstr "" ++ ++msgid "" ++"Link quality aging factor (only for lq level 2). Tuning parameter for " ++"etx_float and etx_fpm, smaller values mean slower changes of ETX value. " ++"(allowed values are between 0.01 and 1.0)" ++msgstr "" ++ ++msgid "" ++"Link quality algorithm (only for lq level 2).
    etx_float: " ++"floating point ETX with exponential aging
    etx_fpm : same as " ++"etx_float, but with integer arithmetic
    etx_ff : ETX freifunk, an " ++"etx variant which use all OLSR traffic (instead of only hellos) for ETX " ++"calculation
    etx_ffeth: incompatible variant of etx_ff that " ++"allows ethernet links with ETX 0.1.
    Defaults to \"etx_ff\"" ++msgstr "" ++ ++msgid "" ++"Link quality level switch between hopcount and cost-based (mostly ETX) " ++"routing.
    0 = do not use link quality
    2 = use link " ++"quality for MPR selection and routing
    Default is \"2\"" ++msgstr "" ++ ++msgid "LinkQuality Multiplicator" ++msgstr "" ++ ++msgid "Links per node (average)" ++msgstr "" ++ ++msgid "Links total" ++msgstr "" ++ ++msgid "Local interface IP" ++msgstr "" ++ ++msgid "MID" ++msgstr "" ++ ++msgid "MID interval" ++msgstr "" ++ ++msgid "MID validity time" ++msgstr "" ++ ++msgid "MTU" ++msgstr "" ++ ++msgid "Main IP" ++msgstr "" ++ ++msgid "" ++"Make sure that OLSRd is running, the \"jsoninfo\" plugin is loaded, " ++"configured on port 9090 and accepts connections from \"127.0.0.1\"." ++msgstr "" ++ ++msgid "Metric" ++msgstr "" ++ ++msgid "Mode" ++msgstr "" ++ ++msgid "" ++"Multiply routes with the factor given here. Allowed values are between 0.01 " ++"and 1.0. It is only used when LQ-Level is greater than 0. Examples:
    reduce LQ to 192.168.0.1 by half: 192.168.0.1 0.5
    reduce LQ to all " ++"nodes on this interface by 20%: default 0.8" ++msgstr "" ++ ++msgid "" ++"Multiply routes with the factor given here. Allowed values are between 0.01 " ++"and 1.0. It is only used when LQ-Level is greater than 0. Examples:
    reduce LQ to fd91:662e:3c58::1 by half: fd91:662e:3c58::1 0.5
    reduce " ++"LQ to all nodes on this interface by 20%: default 0.8" ++msgstr "" ++ ++msgid "NAT threshold" ++msgstr "" ++ ++msgid "NLQ" ++msgstr "" ++ ++msgid "Neighbors" ++msgstr "" ++ ++msgid "Neighbour IP" ++msgstr "" ++ ++msgid "Neighbours" ++msgstr "" ++ ++msgid "Netmask" ++msgstr "" ++ ++msgid "Network" ++msgstr "" ++ ++msgid "Network address" ++msgstr "" ++ ++msgid "Nic changes poll interval" ++msgstr "" ++ ++msgid "Nodes" ++msgstr "" ++ ++msgid "OLSR" ++msgstr "" ++ ++msgid "OLSR - Display Options" ++msgstr "" ++ ++msgid "OLSR - HNA-Announcements" ++msgstr "" ++ ++msgid "OLSR - HNA6-Announcements" ++msgstr "" ++ ++msgid "OLSR - Plugins" ++msgstr "" ++ ++msgid "OLSR Daemon" ++msgstr "" ++ ++msgid "OLSR Daemon - Interface" ++msgstr "" ++ ++msgid "OLSR connections" ++msgstr "" ++ ++msgid "OLSR gateway" ++msgstr "" ++ ++msgid "OLSR node" ++msgstr "" ++ ++msgid "Orange" ++msgstr "" ++ ++msgid "Overview" ++msgstr "" ++ ++msgid "Overview of currently active OLSR host net announcements" ++msgstr "" ++ ++msgid "Overview of currently established OLSR connections" ++msgstr "" ++ ++msgid "Overview of currently known OLSR nodes" ++msgstr "" ++ ++msgid "Overview of currently known routes to other OLSR nodes" ++msgstr "" ++ ++msgid "Overview of interfaces where OLSR is running" ++msgstr "" ++ ++msgid "Overview of known multiple interface announcements" ++msgstr "" ++ ++msgid "Overview of smart gateways in this network" ++msgstr "" ++ ++msgid "Plugin configuration" ++msgstr "" ++ ++msgid "Plugins" ++msgstr "" ++ ++msgid "Polling rate for OLSR sockets in seconds. Default is 0.05." ++msgstr "" ++ ++msgid "Pollrate" ++msgstr "" ++ ++msgid "Port" ++msgstr "" ++ ++msgid "Prefix" ++msgstr "" ++ ++msgid "Red" ++msgstr "" ++ ++msgid "Resolve" ++msgstr "" ++ ++msgid "" ++"Resolve hostnames on status pages. It is generally safe to allow this, but " ++"if you use public IPs and have unstable DNS-Setup then those pages will load " ++"really slow. In this case disable it here." ++msgstr "" ++ ++msgid "Routes" ++msgstr "" ++ ++msgid "Secondary OLSR interfaces" ++msgstr "" ++ ++msgid "" ++"Sets the main IP (originator ip) of the router. This IP will NEVER change " ++"during the uptime of olsrd. Default is 0.0.0.0, which triggers usage of the " ++"IP of the first interface." ++msgstr "" ++ ++msgid "" ++"Sets the main IP (originator ip) of the router. This IP will NEVER change " ++"during the uptime of olsrd. Default is ::, which triggers usage of the IP of " ++"the first interface." ++msgstr "" ++ ++msgid "Show IPv4" ++msgstr "" ++ ++msgid "Show IPv6" ++msgstr "" ++ ++msgid "Signal Noise Ratio in dB" ++msgstr "" ++ ++msgid "SmartGW" ++msgstr "" ++ ++msgid "SmartGW announcements" ++msgstr "" ++ ++msgid "SmartGateway is not configured on this system." ++msgstr "" ++ ++msgid "Source address" ++msgstr "" ++ ++msgid "" ++"Specifies the speed of the uplink in kilobits/s. First parameter is " ++"upstream, second parameter is downstream. Default is \"128 1024\"." ++msgstr "" ++ ++msgid "Speed of the uplink" ++msgstr "" ++ ++msgid "State" ++msgstr "" ++ ++msgid "Status" ++msgstr "" ++ ++msgid "Still usable (20 > SNR > 5)" ++msgstr "" ++ ++msgid "Still usable (4 < ETX < 10)" ++msgstr "" ++ ++msgid "Success rate of packages received from the neighbour" ++msgstr "" ++ ++msgid "Success rate of packages sent to the neighbour" ++msgstr "" ++ ++msgid "TC" ++msgstr "" ++ ++msgid "TC interval" ++msgstr "" ++ ++msgid "TC validity time" ++msgstr "" ++ ++msgid "TOS value" ++msgstr "" ++ ++msgid "" ++"The OLSR daemon is an implementation of the Optimized Link State Routing " ++"protocol. As such it allows mesh routing for any network equipment. It runs " ++"on any wifi card that supports ad-hoc mode and of course on any ethernet " ++"device. Visit olsrd.org for help and " ++"documentation." ++msgstr "" ++ ++msgid "" ++"The fixed willingness to use. If not set willingness will be calculated " ++"dynamically based on battery/power status. Default is \"3\"." ++msgstr "" ++ ++msgid "The interface OLSRd should serve." ++msgstr "" ++ ++msgid "" ++"The port OLSR uses. This should usually stay at the IANA assigned port 698. " ++"It can have a value between 1 and 65535." ++msgstr "" ++ ++msgid "" ++"This can be used to signal the external IPv6 prefix of the uplink to the " ++"clients. This might allow a client to change it's local IPv6 address to use " ++"the IPv6 gateway without any kind of address translation. The maximum prefix " ++"length is 64 bits. Default is \"::/0\" (no prefix)." ++msgstr "" ++ ++msgid "Timing and Validity" ++msgstr "" ++ ++msgid "Topology" ++msgstr "" ++ ++msgid "" ++"Type of service value for the IP header of control traffic. Default is " ++"\"16\"." ++msgstr "" ++ ++msgid "Unable to connect to the OLSR daemon!" ++msgstr "" ++ ++msgid "Uplink" ++msgstr "" ++ ++msgid "Uplink uses NAT" ++msgstr "" ++ ++msgid "Use hysteresis" ++msgstr "" ++ ++msgid "Validity Time" ++msgstr "" ++ ++msgid "Version" ++msgstr "" ++ ++msgid "Very good (ETX < 2)" ++msgstr "" ++ ++msgid "Very good (SNR > 30)" ++msgstr "" ++ ++msgid "WLAN" ++msgstr "" ++ ++msgid "" ++"Warning: kmod-ipip is not installed. Without kmod-ipip SmartGateway will not " ++"work, please install it." ++msgstr "" ++ ++msgid "Weight" ++msgstr "" ++ ++msgid "" ++"When multiple links exist between hosts the weight of interface is used to " ++"determine the link to use. Normally the weight is automatically calculated " ++"by olsrd based on the characteristics of the interface, but here you can " ++"specify a fixed value. Olsrd will choose links with the lowest value.
    Note: Interface weight is used only when LinkQualityLevel is set to " ++"0. For any other value of LinkQualityLevel, the interface ETX value is used " ++"instead." ++msgstr "" ++ ++msgid "" ++"Which kind of uplink is exported to the other mesh nodes. An uplink is " ++"detected by looking for a local HNA of 0.0.0.0/0, ::ffff:0:0/96 or 2000::/3. " ++"Default setting is \"both\"." ++msgstr "" ++ ++msgid "" ++"Which kind of uplink is exported to the other mesh nodes. An uplink is " ++"detected by looking for a local HNA6 ::ffff:0:0/96 or 2000::/3. Default " ++"setting is \"both\"." ++msgstr "" ++ ++msgid "Willingness" ++msgstr "" ++ ++msgid "Yellow" ++msgstr "" ++ ++msgid "no" ++msgstr "" ++ ++msgid "yes" ++msgstr "" +diff --git a/feeds/luci/applications/luci-app-olsr/po/tr/olsr.po b/feeds/luci/applications/luci-app-olsr/po/tr/olsr.po +new file mode 100644 +index 0000000..1864189 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-olsr/po/tr/olsr.po +@@ -0,0 +1,687 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Last-Translator: Automatically generated\n" ++"Language-Team: none\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=1; plural=0;\n" ++ ++msgid "Active MID announcements" ++msgstr "" ++ ++msgid "Active OLSR nodes" ++msgstr "" ++ ++msgid "Active host net announcements" ++msgstr "" ++ ++msgid "Advanced Settings" ++msgstr "" ++ ++msgid "Allow gateways with NAT" ++msgstr "" ++ ++msgid "Allow the selection of an outgoing ipv4 gateway with NAT" ++msgstr "" ++ ++msgid "Announce uplink" ++msgstr "" ++ ++msgid "Announced network" ++msgstr "" ++ ++msgid "Bad (ETX > 10)" ++msgstr "" ++ ++msgid "Bad (SNR < 5)" ++msgstr "" ++ ++msgid "Both values must use the dotted decimal notation." ++msgstr "" ++ ++msgid "Broadcast address" ++msgstr "" ++ ++msgid "Can only be a valid IPv4 or IPv6 address or 'default'" ++msgstr "" ++ ++msgid "Can only be a valid IPv6 address or 'default'" ++msgstr "" ++ ++msgid "Configuration" ++msgstr "" ++ ++msgid "" ++"Could not get any data. Make sure the jsoninfo plugin is installed and " ++"allows connections from localhost." ++msgstr "" ++ ++msgid "Display" ++msgstr "" ++ ++msgid "Downlink" ++msgstr "" ++ ++msgid "Download Config" ++msgstr "" ++ ++msgid "ETX" ++msgstr "" ++ ++msgid "Enable" ++msgstr "" ++ ++msgid "" ++"Enable SmartGateway. If it is disabled, then all other SmartGateway " ++"parameters are ignored. Default is \"no\"." ++msgstr "" ++ ++msgid "Enable this interface." ++msgstr "" ++ ++msgid "Enabled" ++msgstr "" ++ ++msgid "Expected retransmission count" ++msgstr "" ++ ++msgid "FIB metric" ++msgstr "" ++ ++msgid "" ++"FIBMetric controls the metric value of the host-routes OLSRd sets. \"flat\" " ++"means that the metric value is always 2. This is the preferred value because " ++"it helps the linux kernel routing to clean up older routes. \"correct\" uses " ++"the hopcount as the metric value. \"approx\" use the hopcount as the metric " ++"value too, but does only update the hopcount if the nexthop changes too. " ++"Default is \"flat\"." ++msgstr "" ++ ++msgid "Fisheye mechanism for TCs (checked means on). Default is \"on\"" ++msgstr "" ++ ++msgid "Gateway" ++msgstr "" ++ ++msgid "General Settings" ++msgstr "" ++ ++msgid "General settings" ++msgstr "" ++ ++msgid "Good (2 < ETX < 4)" ++msgstr "" ++ ++msgid "Good (30 > SNR > 20)" ++msgstr "" ++ ++msgid "Green" ++msgstr "" ++ ++msgid "HNA" ++msgstr "" ++ ++msgid "HNA Announcements" ++msgstr "" ++ ++msgid "HNA interval" ++msgstr "" ++ ++msgid "HNA validity time" ++msgstr "" ++ ++msgid "HNA6 Announcements" ++msgstr "" ++ ++msgid "Hello" ++msgstr "" ++ ++msgid "Hello interval" ++msgstr "" ++ ++msgid "Hello validity time" ++msgstr "" ++ ++msgid "Hide IPv4" ++msgstr "" ++ ++msgid "Hide IPv6" ++msgstr "" ++ ++msgid "Hna4" ++msgstr "" ++ ++msgid "Hna6" ++msgstr "" ++ ++msgid "Hops" ++msgstr "" ++ ++msgid "Hostname" ++msgstr "" ++ ++msgid "" ++"Hosts in a OLSR routed network can announce connecitivity to external " ++"networks using HNA messages." ++msgstr "" ++ ++msgid "" ++"Hosts in a OLSR routed network can announce connecitivity to external " ++"networks using HNA6 messages." ++msgstr "" ++ ++msgid "" ++"Hysteresis for link sensing (only for hopcount metric). Hysteresis adds more " ++"robustness to the link sensing but delays neighbor registration. Defaults is " ++"\"yes\"" ++msgstr "" ++ ++msgid "IP Addresses" ++msgstr "" ++ ++msgid "" ++"IP-version to use. If 6and4 is selected then one olsrd instance is started " ++"for each protocol." ++msgstr "" ++ ++msgid "IPv4" ++msgstr "" ++ ++msgid "IPv4 broadcast" ++msgstr "" ++ ++msgid "" ++"IPv4 broadcast address for outgoing OLSR packets. One useful example would " ++"be 255.255.255.255. Default is \"0.0.0.0\", which triggers the usage of the " ++"interface broadcast IP." ++msgstr "" ++ ++msgid "IPv4 source" ++msgstr "" ++ ++msgid "" ++"IPv4 src address for outgoing OLSR packages. Default is \"0.0.0.0\", which " ++"triggers usage of the interface IP." ++msgstr "" ++ ++msgid "IPv6" ++msgstr "" ++ ++msgid "IPv6 multicast" ++msgstr "" ++ ++msgid "" ++"IPv6 multicast address. Default is \"FF02::6D\", the manet-router linklocal " ++"multicast." ++msgstr "" ++ ++msgid "" ++"IPv6 network must be given in full notation, prefix must be in CIDR notation." ++msgstr "" ++ ++msgid "IPv6 source" ++msgstr "" ++ ++msgid "" ++"IPv6 src prefix. OLSRd will choose one of the interface IPs which matches " ++"the prefix of this parameter. Default is \"0::/0\", which triggers the usage " ++"of a not-linklocal interface IP." ++msgstr "" ++ ++msgid "IPv6-Prefix of the uplink" ++msgstr "" ++ ++msgid "" ++"If the route to the current gateway is to be changed, the ETX value of this " ++"gateway is multiplied with this value before it is compared to the new one. " ++"The parameter can be a value between 0.1 and 1.0, but should be close to 1.0 " ++"if changed.
    WARNING: This parameter should not be used together " ++"with the etx_ffeth metric!
    Defaults to \"1.0\"." ++msgstr "" ++ ++msgid "" ++"If this Node uses NAT for connections to the internet. Default is \"yes\"." ++msgstr "" ++ ++msgid "Interface" ++msgstr "" ++ ++msgid "" ++"Interface Mode is used to prevent unnecessary packet forwarding on switched " ++"ethernet interfaces. valid Modes are \"mesh\" and \"ether\". Default is " ++"\"mesh\"." ++msgstr "" ++ ++msgid "Interfaces" ++msgstr "" ++ ++msgid "Interfaces Defaults" ++msgstr "" ++ ++msgid "Internet protocol" ++msgstr "" ++ ++msgid "" ++"Interval to poll network interfaces for configuration changes (in seconds). " ++"Default is \"2.5\"." ++msgstr "" ++ ++msgid "Invalid Value for LQMult-Value. Must be between 0.01 and 1.0." ++msgstr "" ++ ++msgid "" ++"Invalid Value for LQMult-Value. You must use a decimal number between 0.01 " ++"and 1.0 here." ++msgstr "" ++ ++msgid "Known OLSR routes" ++msgstr "" ++ ++msgid "LQ" ++msgstr "" ++ ++msgid "LQ aging" ++msgstr "" ++ ++msgid "LQ algorithm" ++msgstr "" ++ ++msgid "LQ fisheye" ++msgstr "" ++ ++msgid "LQ level" ++msgstr "" ++ ++msgid "" ++"LQMult requires two values (IP address or 'default' and multiplicator) " ++"seperated by space." ++msgstr "" ++ ++msgid "Last hop" ++msgstr "" ++ ++msgid "Legend" ++msgstr "" ++ ++msgid "Library" ++msgstr "" ++ ++msgid "Link Quality Settings" ++msgstr "" ++ ++msgid "" ++"Link quality aging factor (only for lq level 2). Tuning parameter for " ++"etx_float and etx_fpm, smaller values mean slower changes of ETX value. " ++"(allowed values are between 0.01 and 1.0)" ++msgstr "" ++ ++msgid "" ++"Link quality algorithm (only for lq level 2).
    etx_float: " ++"floating point ETX with exponential aging
    etx_fpm : same as " ++"etx_float, but with integer arithmetic
    etx_ff : ETX freifunk, an " ++"etx variant which use all OLSR traffic (instead of only hellos) for ETX " ++"calculation
    etx_ffeth: incompatible variant of etx_ff that " ++"allows ethernet links with ETX 0.1.
    Defaults to \"etx_ff\"" ++msgstr "" ++ ++msgid "" ++"Link quality level switch between hopcount and cost-based (mostly ETX) " ++"routing.
    0 = do not use link quality
    2 = use link " ++"quality for MPR selection and routing
    Default is \"2\"" ++msgstr "" ++ ++msgid "LinkQuality Multiplicator" ++msgstr "" ++ ++msgid "Links per node (average)" ++msgstr "" ++ ++msgid "Links total" ++msgstr "" ++ ++msgid "Local interface IP" ++msgstr "" ++ ++msgid "MID" ++msgstr "" ++ ++msgid "MID interval" ++msgstr "" ++ ++msgid "MID validity time" ++msgstr "" ++ ++msgid "MTU" ++msgstr "" ++ ++msgid "Main IP" ++msgstr "" ++ ++msgid "" ++"Make sure that OLSRd is running, the \"jsoninfo\" plugin is loaded, " ++"configured on port 9090 and accepts connections from \"127.0.0.1\"." ++msgstr "" ++ ++msgid "Metric" ++msgstr "" ++ ++msgid "Mode" ++msgstr "" ++ ++msgid "" ++"Multiply routes with the factor given here. Allowed values are between 0.01 " ++"and 1.0. It is only used when LQ-Level is greater than 0. Examples:
    reduce LQ to 192.168.0.1 by half: 192.168.0.1 0.5
    reduce LQ to all " ++"nodes on this interface by 20%: default 0.8" ++msgstr "" ++ ++msgid "" ++"Multiply routes with the factor given here. Allowed values are between 0.01 " ++"and 1.0. It is only used when LQ-Level is greater than 0. Examples:
    reduce LQ to fd91:662e:3c58::1 by half: fd91:662e:3c58::1 0.5
    reduce " ++"LQ to all nodes on this interface by 20%: default 0.8" ++msgstr "" ++ ++msgid "NAT threshold" ++msgstr "" ++ ++msgid "NLQ" ++msgstr "" ++ ++msgid "Neighbors" ++msgstr "" ++ ++msgid "Neighbour IP" ++msgstr "" ++ ++msgid "Neighbours" ++msgstr "" ++ ++msgid "Netmask" ++msgstr "" ++ ++msgid "Network" ++msgstr "" ++ ++msgid "Network address" ++msgstr "" ++ ++msgid "Nic changes poll interval" ++msgstr "" ++ ++msgid "Nodes" ++msgstr "" ++ ++msgid "OLSR" ++msgstr "" ++ ++msgid "OLSR - Display Options" ++msgstr "" ++ ++msgid "OLSR - HNA-Announcements" ++msgstr "" ++ ++msgid "OLSR - HNA6-Announcements" ++msgstr "" ++ ++msgid "OLSR - Plugins" ++msgstr "" ++ ++msgid "OLSR Daemon" ++msgstr "" ++ ++msgid "OLSR Daemon - Interface" ++msgstr "" ++ ++msgid "OLSR connections" ++msgstr "" ++ ++msgid "OLSR gateway" ++msgstr "" ++ ++msgid "OLSR node" ++msgstr "" ++ ++msgid "Orange" ++msgstr "" ++ ++msgid "Overview" ++msgstr "" ++ ++msgid "Overview of currently active OLSR host net announcements" ++msgstr "" ++ ++msgid "Overview of currently established OLSR connections" ++msgstr "" ++ ++msgid "Overview of currently known OLSR nodes" ++msgstr "" ++ ++msgid "Overview of currently known routes to other OLSR nodes" ++msgstr "" ++ ++msgid "Overview of interfaces where OLSR is running" ++msgstr "" ++ ++msgid "Overview of known multiple interface announcements" ++msgstr "" ++ ++msgid "Overview of smart gateways in this network" ++msgstr "" ++ ++msgid "Plugin configuration" ++msgstr "" ++ ++msgid "Plugins" ++msgstr "" ++ ++msgid "Polling rate for OLSR sockets in seconds. Default is 0.05." ++msgstr "" ++ ++msgid "Pollrate" ++msgstr "" ++ ++msgid "Port" ++msgstr "" ++ ++msgid "Prefix" ++msgstr "" ++ ++msgid "Red" ++msgstr "" ++ ++msgid "Resolve" ++msgstr "" ++ ++msgid "" ++"Resolve hostnames on status pages. It is generally safe to allow this, but " ++"if you use public IPs and have unstable DNS-Setup then those pages will load " ++"really slow. In this case disable it here." ++msgstr "" ++ ++msgid "Routes" ++msgstr "" ++ ++msgid "Secondary OLSR interfaces" ++msgstr "" ++ ++msgid "" ++"Sets the main IP (originator ip) of the router. This IP will NEVER change " ++"during the uptime of olsrd. Default is 0.0.0.0, which triggers usage of the " ++"IP of the first interface." ++msgstr "" ++ ++msgid "" ++"Sets the main IP (originator ip) of the router. This IP will NEVER change " ++"during the uptime of olsrd. Default is ::, which triggers usage of the IP of " ++"the first interface." ++msgstr "" ++ ++msgid "Show IPv4" ++msgstr "" ++ ++msgid "Show IPv6" ++msgstr "" ++ ++msgid "Signal Noise Ratio in dB" ++msgstr "" ++ ++msgid "SmartGW" ++msgstr "" ++ ++msgid "SmartGW announcements" ++msgstr "" ++ ++msgid "SmartGateway is not configured on this system." ++msgstr "" ++ ++msgid "Source address" ++msgstr "" ++ ++msgid "" ++"Specifies the speed of the uplink in kilobits/s. First parameter is " ++"upstream, second parameter is downstream. Default is \"128 1024\"." ++msgstr "" ++ ++msgid "Speed of the uplink" ++msgstr "" ++ ++msgid "State" ++msgstr "" ++ ++msgid "Status" ++msgstr "" ++ ++msgid "Still usable (20 > SNR > 5)" ++msgstr "" ++ ++msgid "Still usable (4 < ETX < 10)" ++msgstr "" ++ ++msgid "Success rate of packages received from the neighbour" ++msgstr "" ++ ++msgid "Success rate of packages sent to the neighbour" ++msgstr "" ++ ++msgid "TC" ++msgstr "" ++ ++msgid "TC interval" ++msgstr "" ++ ++msgid "TC validity time" ++msgstr "" ++ ++msgid "TOS value" ++msgstr "" ++ ++msgid "" ++"The OLSR daemon is an implementation of the Optimized Link State Routing " ++"protocol. As such it allows mesh routing for any network equipment. It runs " ++"on any wifi card that supports ad-hoc mode and of course on any ethernet " ++"device. Visit olsrd.org for help and " ++"documentation." ++msgstr "" ++ ++msgid "" ++"The fixed willingness to use. If not set willingness will be calculated " ++"dynamically based on battery/power status. Default is \"3\"." ++msgstr "" ++ ++msgid "The interface OLSRd should serve." ++msgstr "" ++ ++msgid "" ++"The port OLSR uses. This should usually stay at the IANA assigned port 698. " ++"It can have a value between 1 and 65535." ++msgstr "" ++ ++msgid "" ++"This can be used to signal the external IPv6 prefix of the uplink to the " ++"clients. This might allow a client to change it's local IPv6 address to use " ++"the IPv6 gateway without any kind of address translation. The maximum prefix " ++"length is 64 bits. Default is \"::/0\" (no prefix)." ++msgstr "" ++ ++msgid "Timing and Validity" ++msgstr "" ++ ++msgid "Topology" ++msgstr "" ++ ++msgid "" ++"Type of service value for the IP header of control traffic. Default is " ++"\"16\"." ++msgstr "" ++ ++msgid "Unable to connect to the OLSR daemon!" ++msgstr "" ++ ++msgid "Uplink" ++msgstr "" ++ ++msgid "Uplink uses NAT" ++msgstr "" ++ ++msgid "Use hysteresis" ++msgstr "" ++ ++msgid "Validity Time" ++msgstr "" ++ ++msgid "Version" ++msgstr "" ++ ++msgid "Very good (ETX < 2)" ++msgstr "" ++ ++msgid "Very good (SNR > 30)" ++msgstr "" ++ ++msgid "WLAN" ++msgstr "" ++ ++msgid "" ++"Warning: kmod-ipip is not installed. Without kmod-ipip SmartGateway will not " ++"work, please install it." ++msgstr "" ++ ++msgid "Weight" ++msgstr "" ++ ++msgid "" ++"When multiple links exist between hosts the weight of interface is used to " ++"determine the link to use. Normally the weight is automatically calculated " ++"by olsrd based on the characteristics of the interface, but here you can " ++"specify a fixed value. Olsrd will choose links with the lowest value.
    Note: Interface weight is used only when LinkQualityLevel is set to " ++"0. For any other value of LinkQualityLevel, the interface ETX value is used " ++"instead." ++msgstr "" ++ ++msgid "" ++"Which kind of uplink is exported to the other mesh nodes. An uplink is " ++"detected by looking for a local HNA of 0.0.0.0/0, ::ffff:0:0/96 or 2000::/3. " ++"Default setting is \"both\"." ++msgstr "" ++ ++msgid "" ++"Which kind of uplink is exported to the other mesh nodes. An uplink is " ++"detected by looking for a local HNA6 ::ffff:0:0/96 or 2000::/3. Default " ++"setting is \"both\"." ++msgstr "" ++ ++msgid "Willingness" ++msgstr "" ++ ++msgid "Yellow" ++msgstr "" ++ ++msgid "no" ++msgstr "" ++ ++msgid "yes" ++msgstr "" +diff --git a/feeds/luci/applications/luci-app-olsr/po/uk/olsr.po b/feeds/luci/applications/luci-app-olsr/po/uk/olsr.po +new file mode 100644 +index 0000000..d35fe31 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-olsr/po/uk/olsr.po +@@ -0,0 +1,688 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Last-Translator: Automatically generated\n" ++"Language-Team: none\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n" ++"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" ++ ++msgid "Active MID announcements" ++msgstr "" ++ ++msgid "Active OLSR nodes" ++msgstr "" ++ ++msgid "Active host net announcements" ++msgstr "" ++ ++msgid "Advanced Settings" ++msgstr "" ++ ++msgid "Allow gateways with NAT" ++msgstr "" ++ ++msgid "Allow the selection of an outgoing ipv4 gateway with NAT" ++msgstr "" ++ ++msgid "Announce uplink" ++msgstr "" ++ ++msgid "Announced network" ++msgstr "" ++ ++msgid "Bad (ETX > 10)" ++msgstr "" ++ ++msgid "Bad (SNR < 5)" ++msgstr "" ++ ++msgid "Both values must use the dotted decimal notation." ++msgstr "" ++ ++msgid "Broadcast address" ++msgstr "" ++ ++msgid "Can only be a valid IPv4 or IPv6 address or 'default'" ++msgstr "" ++ ++msgid "Can only be a valid IPv6 address or 'default'" ++msgstr "" ++ ++msgid "Configuration" ++msgstr "" ++ ++msgid "" ++"Could not get any data. Make sure the jsoninfo plugin is installed and " ++"allows connections from localhost." ++msgstr "" ++ ++msgid "Display" ++msgstr "" ++ ++msgid "Downlink" ++msgstr "" ++ ++msgid "Download Config" ++msgstr "" ++ ++msgid "ETX" ++msgstr "" ++ ++msgid "Enable" ++msgstr "" ++ ++msgid "" ++"Enable SmartGateway. If it is disabled, then all other SmartGateway " ++"parameters are ignored. Default is \"no\"." ++msgstr "" ++ ++msgid "Enable this interface." ++msgstr "" ++ ++msgid "Enabled" ++msgstr "" ++ ++msgid "Expected retransmission count" ++msgstr "" ++ ++msgid "FIB metric" ++msgstr "" ++ ++msgid "" ++"FIBMetric controls the metric value of the host-routes OLSRd sets. \"flat\" " ++"means that the metric value is always 2. This is the preferred value because " ++"it helps the linux kernel routing to clean up older routes. \"correct\" uses " ++"the hopcount as the metric value. \"approx\" use the hopcount as the metric " ++"value too, but does only update the hopcount if the nexthop changes too. " ++"Default is \"flat\"." ++msgstr "" ++ ++msgid "Fisheye mechanism for TCs (checked means on). Default is \"on\"" ++msgstr "" ++ ++msgid "Gateway" ++msgstr "" ++ ++msgid "General Settings" ++msgstr "" ++ ++msgid "General settings" ++msgstr "" ++ ++msgid "Good (2 < ETX < 4)" ++msgstr "" ++ ++msgid "Good (30 > SNR > 20)" ++msgstr "" ++ ++msgid "Green" ++msgstr "" ++ ++msgid "HNA" ++msgstr "" ++ ++msgid "HNA Announcements" ++msgstr "" ++ ++msgid "HNA interval" ++msgstr "" ++ ++msgid "HNA validity time" ++msgstr "" ++ ++msgid "HNA6 Announcements" ++msgstr "" ++ ++msgid "Hello" ++msgstr "" ++ ++msgid "Hello interval" ++msgstr "" ++ ++msgid "Hello validity time" ++msgstr "" ++ ++msgid "Hide IPv4" ++msgstr "" ++ ++msgid "Hide IPv6" ++msgstr "" ++ ++msgid "Hna4" ++msgstr "" ++ ++msgid "Hna6" ++msgstr "" ++ ++msgid "Hops" ++msgstr "" ++ ++msgid "Hostname" ++msgstr "" ++ ++msgid "" ++"Hosts in a OLSR routed network can announce connecitivity to external " ++"networks using HNA messages." ++msgstr "" ++ ++msgid "" ++"Hosts in a OLSR routed network can announce connecitivity to external " ++"networks using HNA6 messages." ++msgstr "" ++ ++msgid "" ++"Hysteresis for link sensing (only for hopcount metric). Hysteresis adds more " ++"robustness to the link sensing but delays neighbor registration. Defaults is " ++"\"yes\"" ++msgstr "" ++ ++msgid "IP Addresses" ++msgstr "" ++ ++msgid "" ++"IP-version to use. If 6and4 is selected then one olsrd instance is started " ++"for each protocol." ++msgstr "" ++ ++msgid "IPv4" ++msgstr "" ++ ++msgid "IPv4 broadcast" ++msgstr "" ++ ++msgid "" ++"IPv4 broadcast address for outgoing OLSR packets. One useful example would " ++"be 255.255.255.255. Default is \"0.0.0.0\", which triggers the usage of the " ++"interface broadcast IP." ++msgstr "" ++ ++msgid "IPv4 source" ++msgstr "" ++ ++msgid "" ++"IPv4 src address for outgoing OLSR packages. Default is \"0.0.0.0\", which " ++"triggers usage of the interface IP." ++msgstr "" ++ ++msgid "IPv6" ++msgstr "" ++ ++msgid "IPv6 multicast" ++msgstr "" ++ ++msgid "" ++"IPv6 multicast address. Default is \"FF02::6D\", the manet-router linklocal " ++"multicast." ++msgstr "" ++ ++msgid "" ++"IPv6 network must be given in full notation, prefix must be in CIDR notation." ++msgstr "" ++ ++msgid "IPv6 source" ++msgstr "" ++ ++msgid "" ++"IPv6 src prefix. OLSRd will choose one of the interface IPs which matches " ++"the prefix of this parameter. Default is \"0::/0\", which triggers the usage " ++"of a not-linklocal interface IP." ++msgstr "" ++ ++msgid "IPv6-Prefix of the uplink" ++msgstr "" ++ ++msgid "" ++"If the route to the current gateway is to be changed, the ETX value of this " ++"gateway is multiplied with this value before it is compared to the new one. " ++"The parameter can be a value between 0.1 and 1.0, but should be close to 1.0 " ++"if changed.
    WARNING: This parameter should not be used together " ++"with the etx_ffeth metric!
    Defaults to \"1.0\"." ++msgstr "" ++ ++msgid "" ++"If this Node uses NAT for connections to the internet. Default is \"yes\"." ++msgstr "" ++ ++msgid "Interface" ++msgstr "" ++ ++msgid "" ++"Interface Mode is used to prevent unnecessary packet forwarding on switched " ++"ethernet interfaces. valid Modes are \"mesh\" and \"ether\". Default is " ++"\"mesh\"." ++msgstr "" ++ ++msgid "Interfaces" ++msgstr "" ++ ++msgid "Interfaces Defaults" ++msgstr "" ++ ++msgid "Internet protocol" ++msgstr "" ++ ++msgid "" ++"Interval to poll network interfaces for configuration changes (in seconds). " ++"Default is \"2.5\"." ++msgstr "" ++ ++msgid "Invalid Value for LQMult-Value. Must be between 0.01 and 1.0." ++msgstr "" ++ ++msgid "" ++"Invalid Value for LQMult-Value. You must use a decimal number between 0.01 " ++"and 1.0 here." ++msgstr "" ++ ++msgid "Known OLSR routes" ++msgstr "" ++ ++msgid "LQ" ++msgstr "" ++ ++msgid "LQ aging" ++msgstr "" ++ ++msgid "LQ algorithm" ++msgstr "" ++ ++msgid "LQ fisheye" ++msgstr "" ++ ++msgid "LQ level" ++msgstr "" ++ ++msgid "" ++"LQMult requires two values (IP address or 'default' and multiplicator) " ++"seperated by space." ++msgstr "" ++ ++msgid "Last hop" ++msgstr "" ++ ++msgid "Legend" ++msgstr "" ++ ++msgid "Library" ++msgstr "" ++ ++msgid "Link Quality Settings" ++msgstr "" ++ ++msgid "" ++"Link quality aging factor (only for lq level 2). Tuning parameter for " ++"etx_float and etx_fpm, smaller values mean slower changes of ETX value. " ++"(allowed values are between 0.01 and 1.0)" ++msgstr "" ++ ++msgid "" ++"Link quality algorithm (only for lq level 2).
    etx_float: " ++"floating point ETX with exponential aging
    etx_fpm : same as " ++"etx_float, but with integer arithmetic
    etx_ff : ETX freifunk, an " ++"etx variant which use all OLSR traffic (instead of only hellos) for ETX " ++"calculation
    etx_ffeth: incompatible variant of etx_ff that " ++"allows ethernet links with ETX 0.1.
    Defaults to \"etx_ff\"" ++msgstr "" ++ ++msgid "" ++"Link quality level switch between hopcount and cost-based (mostly ETX) " ++"routing.
    0 = do not use link quality
    2 = use link " ++"quality for MPR selection and routing
    Default is \"2\"" ++msgstr "" ++ ++msgid "LinkQuality Multiplicator" ++msgstr "" ++ ++msgid "Links per node (average)" ++msgstr "" ++ ++msgid "Links total" ++msgstr "" ++ ++msgid "Local interface IP" ++msgstr "" ++ ++msgid "MID" ++msgstr "" ++ ++msgid "MID interval" ++msgstr "" ++ ++msgid "MID validity time" ++msgstr "" ++ ++msgid "MTU" ++msgstr "" ++ ++msgid "Main IP" ++msgstr "" ++ ++msgid "" ++"Make sure that OLSRd is running, the \"jsoninfo\" plugin is loaded, " ++"configured on port 9090 and accepts connections from \"127.0.0.1\"." ++msgstr "" ++ ++msgid "Metric" ++msgstr "" ++ ++msgid "Mode" ++msgstr "" ++ ++msgid "" ++"Multiply routes with the factor given here. Allowed values are between 0.01 " ++"and 1.0. It is only used when LQ-Level is greater than 0. Examples:
    reduce LQ to 192.168.0.1 by half: 192.168.0.1 0.5
    reduce LQ to all " ++"nodes on this interface by 20%: default 0.8" ++msgstr "" ++ ++msgid "" ++"Multiply routes with the factor given here. Allowed values are between 0.01 " ++"and 1.0. It is only used when LQ-Level is greater than 0. Examples:
    reduce LQ to fd91:662e:3c58::1 by half: fd91:662e:3c58::1 0.5
    reduce " ++"LQ to all nodes on this interface by 20%: default 0.8" ++msgstr "" ++ ++msgid "NAT threshold" ++msgstr "" ++ ++msgid "NLQ" ++msgstr "" ++ ++msgid "Neighbors" ++msgstr "" ++ ++msgid "Neighbour IP" ++msgstr "" ++ ++msgid "Neighbours" ++msgstr "" ++ ++msgid "Netmask" ++msgstr "" ++ ++msgid "Network" ++msgstr "" ++ ++msgid "Network address" ++msgstr "" ++ ++msgid "Nic changes poll interval" ++msgstr "" ++ ++msgid "Nodes" ++msgstr "" ++ ++msgid "OLSR" ++msgstr "" ++ ++msgid "OLSR - Display Options" ++msgstr "" ++ ++msgid "OLSR - HNA-Announcements" ++msgstr "" ++ ++msgid "OLSR - HNA6-Announcements" ++msgstr "" ++ ++msgid "OLSR - Plugins" ++msgstr "" ++ ++msgid "OLSR Daemon" ++msgstr "" ++ ++msgid "OLSR Daemon - Interface" ++msgstr "" ++ ++msgid "OLSR connections" ++msgstr "" ++ ++msgid "OLSR gateway" ++msgstr "" ++ ++msgid "OLSR node" ++msgstr "" ++ ++msgid "Orange" ++msgstr "" ++ ++msgid "Overview" ++msgstr "" ++ ++msgid "Overview of currently active OLSR host net announcements" ++msgstr "" ++ ++msgid "Overview of currently established OLSR connections" ++msgstr "" ++ ++msgid "Overview of currently known OLSR nodes" ++msgstr "" ++ ++msgid "Overview of currently known routes to other OLSR nodes" ++msgstr "" ++ ++msgid "Overview of interfaces where OLSR is running" ++msgstr "" ++ ++msgid "Overview of known multiple interface announcements" ++msgstr "" ++ ++msgid "Overview of smart gateways in this network" ++msgstr "" ++ ++msgid "Plugin configuration" ++msgstr "" ++ ++msgid "Plugins" ++msgstr "" ++ ++msgid "Polling rate for OLSR sockets in seconds. Default is 0.05." ++msgstr "" ++ ++msgid "Pollrate" ++msgstr "" ++ ++msgid "Port" ++msgstr "" ++ ++msgid "Prefix" ++msgstr "" ++ ++msgid "Red" ++msgstr "" ++ ++msgid "Resolve" ++msgstr "" ++ ++msgid "" ++"Resolve hostnames on status pages. It is generally safe to allow this, but " ++"if you use public IPs and have unstable DNS-Setup then those pages will load " ++"really slow. In this case disable it here." ++msgstr "" ++ ++msgid "Routes" ++msgstr "" ++ ++msgid "Secondary OLSR interfaces" ++msgstr "" ++ ++msgid "" ++"Sets the main IP (originator ip) of the router. This IP will NEVER change " ++"during the uptime of olsrd. Default is 0.0.0.0, which triggers usage of the " ++"IP of the first interface." ++msgstr "" ++ ++msgid "" ++"Sets the main IP (originator ip) of the router. This IP will NEVER change " ++"during the uptime of olsrd. Default is ::, which triggers usage of the IP of " ++"the first interface." ++msgstr "" ++ ++msgid "Show IPv4" ++msgstr "" ++ ++msgid "Show IPv6" ++msgstr "" ++ ++msgid "Signal Noise Ratio in dB" ++msgstr "" ++ ++msgid "SmartGW" ++msgstr "" ++ ++msgid "SmartGW announcements" ++msgstr "" ++ ++msgid "SmartGateway is not configured on this system." ++msgstr "" ++ ++msgid "Source address" ++msgstr "" ++ ++msgid "" ++"Specifies the speed of the uplink in kilobits/s. First parameter is " ++"upstream, second parameter is downstream. Default is \"128 1024\"." ++msgstr "" ++ ++msgid "Speed of the uplink" ++msgstr "" ++ ++msgid "State" ++msgstr "" ++ ++msgid "Status" ++msgstr "" ++ ++msgid "Still usable (20 > SNR > 5)" ++msgstr "" ++ ++msgid "Still usable (4 < ETX < 10)" ++msgstr "" ++ ++msgid "Success rate of packages received from the neighbour" ++msgstr "" ++ ++msgid "Success rate of packages sent to the neighbour" ++msgstr "" ++ ++msgid "TC" ++msgstr "" ++ ++msgid "TC interval" ++msgstr "" ++ ++msgid "TC validity time" ++msgstr "" ++ ++msgid "TOS value" ++msgstr "" ++ ++msgid "" ++"The OLSR daemon is an implementation of the Optimized Link State Routing " ++"protocol. As such it allows mesh routing for any network equipment. It runs " ++"on any wifi card that supports ad-hoc mode and of course on any ethernet " ++"device. Visit olsrd.org for help and " ++"documentation." ++msgstr "" ++ ++msgid "" ++"The fixed willingness to use. If not set willingness will be calculated " ++"dynamically based on battery/power status. Default is \"3\"." ++msgstr "" ++ ++msgid "The interface OLSRd should serve." ++msgstr "" ++ ++msgid "" ++"The port OLSR uses. This should usually stay at the IANA assigned port 698. " ++"It can have a value between 1 and 65535." ++msgstr "" ++ ++msgid "" ++"This can be used to signal the external IPv6 prefix of the uplink to the " ++"clients. This might allow a client to change it's local IPv6 address to use " ++"the IPv6 gateway without any kind of address translation. The maximum prefix " ++"length is 64 bits. Default is \"::/0\" (no prefix)." ++msgstr "" ++ ++msgid "Timing and Validity" ++msgstr "" ++ ++msgid "Topology" ++msgstr "" ++ ++msgid "" ++"Type of service value for the IP header of control traffic. Default is " ++"\"16\"." ++msgstr "" ++ ++msgid "Unable to connect to the OLSR daemon!" ++msgstr "" ++ ++msgid "Uplink" ++msgstr "" ++ ++msgid "Uplink uses NAT" ++msgstr "" ++ ++msgid "Use hysteresis" ++msgstr "" ++ ++msgid "Validity Time" ++msgstr "" ++ ++msgid "Version" ++msgstr "" ++ ++msgid "Very good (ETX < 2)" ++msgstr "" ++ ++msgid "Very good (SNR > 30)" ++msgstr "" ++ ++msgid "WLAN" ++msgstr "" ++ ++msgid "" ++"Warning: kmod-ipip is not installed. Without kmod-ipip SmartGateway will not " ++"work, please install it." ++msgstr "" ++ ++msgid "Weight" ++msgstr "" ++ ++msgid "" ++"When multiple links exist between hosts the weight of interface is used to " ++"determine the link to use. Normally the weight is automatically calculated " ++"by olsrd based on the characteristics of the interface, but here you can " ++"specify a fixed value. Olsrd will choose links with the lowest value.
    Note: Interface weight is used only when LinkQualityLevel is set to " ++"0. For any other value of LinkQualityLevel, the interface ETX value is used " ++"instead." ++msgstr "" ++ ++msgid "" ++"Which kind of uplink is exported to the other mesh nodes. An uplink is " ++"detected by looking for a local HNA of 0.0.0.0/0, ::ffff:0:0/96 or 2000::/3. " ++"Default setting is \"both\"." ++msgstr "" ++ ++msgid "" ++"Which kind of uplink is exported to the other mesh nodes. An uplink is " ++"detected by looking for a local HNA6 ::ffff:0:0/96 or 2000::/3. Default " ++"setting is \"both\"." ++msgstr "" ++ ++msgid "Willingness" ++msgstr "" ++ ++msgid "Yellow" ++msgstr "" ++ ++msgid "no" ++msgstr "" ++ ++msgid "yes" ++msgstr "" +diff --git a/feeds/luci/applications/luci-app-olsr/po/vi/olsr.po b/feeds/luci/applications/luci-app-olsr/po/vi/olsr.po +new file mode 100644 +index 0000000..698e528 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-olsr/po/vi/olsr.po +@@ -0,0 +1,703 @@ ++# olsr.pot ++# generated from ./applications/luci-olsr/luasrc/i18n/olsr.en.lua ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Report-Msgid-Bugs-To: \n" ++"POT-Creation-Date: 2009-08-16 06:58+0200\n" ++"PO-Revision-Date: 2009-08-16 12:39+0200\n" ++"Last-Translator: Hong Phuc Dang \n" ++"Language-Team: LANGUAGE \n" ++"Language: \n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"X-Generator: Pootle 1.1.0\n" ++ ++msgid "Active MID announcements" ++msgstr "Thông báo của các MID Ä‘ang hoạt Ä‘á»™ng" ++ ++msgid "Active OLSR nodes" ++msgstr "Những OLSR nodes Ä‘ang hoạt Ä‘á»™ng" ++ ++msgid "Active host net announcements" ++msgstr "Thông báo của mạng host Ä‘ang hoạt Ä‘á»™ng" ++ ++msgid "Advanced Settings" ++msgstr "" ++ ++msgid "Allow gateways with NAT" ++msgstr "" ++ ++msgid "Allow the selection of an outgoing ipv4 gateway with NAT" ++msgstr "" ++ ++msgid "Announce uplink" ++msgstr "" ++ ++msgid "Announced network" ++msgstr "Mạng lÆ°á»›i thông báo" ++ ++msgid "Bad (ETX > 10)" ++msgstr "" ++ ++msgid "Bad (SNR < 5)" ++msgstr "" ++ ++msgid "Both values must use the dotted decimal notation." ++msgstr "" ++ ++msgid "Broadcast address" ++msgstr "" ++ ++msgid "Can only be a valid IPv4 or IPv6 address or 'default'" ++msgstr "" ++ ++msgid "Can only be a valid IPv6 address or 'default'" ++msgstr "" ++ ++msgid "Configuration" ++msgstr "" ++ ++msgid "" ++"Could not get any data. Make sure the jsoninfo plugin is installed and " ++"allows connections from localhost." ++msgstr "" ++ ++msgid "Display" ++msgstr "" ++ ++msgid "Downlink" ++msgstr "" ++ ++msgid "Download Config" ++msgstr "" ++ ++msgid "ETX" ++msgstr "" ++ ++msgid "Enable" ++msgstr "" ++ ++msgid "" ++"Enable SmartGateway. If it is disabled, then all other SmartGateway " ++"parameters are ignored. Default is \"no\"." ++msgstr "" ++ ++msgid "Enable this interface." ++msgstr "" ++ ++msgid "Enabled" ++msgstr "" ++ ++msgid "Expected retransmission count" ++msgstr "Expected retransmission count" ++ ++msgid "FIB metric" ++msgstr "FIB metric" ++ ++msgid "" ++"FIBMetric controls the metric value of the host-routes OLSRd sets. \"flat\" " ++"means that the metric value is always 2. This is the preferred value because " ++"it helps the linux kernel routing to clean up older routes. \"correct\" uses " ++"the hopcount as the metric value. \"approx\" use the hopcount as the metric " ++"value too, but does only update the hopcount if the nexthop changes too. " ++"Default is \"flat\"." ++msgstr "" ++ ++msgid "Fisheye mechanism for TCs (checked means on). Default is \"on\"" ++msgstr "" ++ ++msgid "Gateway" ++msgstr "" ++ ++msgid "General Settings" ++msgstr "" ++ ++msgid "General settings" ++msgstr "Cài đặt tổng quát" ++ ++msgid "Good (2 < ETX < 4)" ++msgstr "" ++ ++msgid "Good (30 > SNR > 20)" ++msgstr "" ++ ++msgid "Green" ++msgstr "" ++ ++msgid "HNA" ++msgstr "" ++ ++msgid "HNA Announcements" ++msgstr "" ++ ++msgid "HNA interval" ++msgstr "Khoảng HNA" ++ ++msgid "HNA validity time" ++msgstr "Thá»i gian hợp lệ hóa HNA " ++ ++#, fuzzy ++msgid "HNA6 Announcements" ++msgstr "OLSR - HNA - Thông báo" ++ ++msgid "Hello" ++msgstr "" ++ ++msgid "Hello interval" ++msgstr "Vùng xin chào" ++ ++msgid "Hello validity time" ++msgstr "Thá»i gian hợp lệ hóa lá»i chào" ++ ++msgid "Hide IPv4" ++msgstr "" ++ ++msgid "Hide IPv6" ++msgstr "" ++ ++msgid "Hna4" ++msgstr "" ++ ++msgid "Hna6" ++msgstr "" ++ ++msgid "Hops" ++msgstr "" ++ ++msgid "Hostname" ++msgstr "" ++ ++msgid "" ++"Hosts in a OLSR routed network can announce connecitivity to external " ++"networks using HNA messages." ++msgstr "" ++ ++msgid "" ++"Hosts in a OLSR routed network can announce connecitivity to external " ++"networks using HNA6 messages." ++msgstr "" ++ ++msgid "" ++"Hysteresis for link sensing (only for hopcount metric). Hysteresis adds more " ++"robustness to the link sensing but delays neighbor registration. Defaults is " ++"\"yes\"" ++msgstr "" ++ ++msgid "IP Addresses" ++msgstr "" ++ ++msgid "" ++"IP-version to use. If 6and4 is selected then one olsrd instance is started " ++"for each protocol." ++msgstr "" ++ ++msgid "IPv4" ++msgstr "" ++ ++msgid "IPv4 broadcast" ++msgstr "IPv4 broadcast" ++ ++msgid "" ++"IPv4 broadcast address for outgoing OLSR packets. One useful example would " ++"be 255.255.255.255. Default is \"0.0.0.0\", which triggers the usage of the " ++"interface broadcast IP." ++msgstr "" ++ ++msgid "IPv4 source" ++msgstr "" ++ ++msgid "" ++"IPv4 src address for outgoing OLSR packages. Default is \"0.0.0.0\", which " ++"triggers usage of the interface IP." ++msgstr "" ++ ++msgid "IPv6" ++msgstr "" ++ ++msgid "IPv6 multicast" ++msgstr "" ++ ++msgid "" ++"IPv6 multicast address. Default is \"FF02::6D\", the manet-router linklocal " ++"multicast." ++msgstr "" ++ ++msgid "" ++"IPv6 network must be given in full notation, prefix must be in CIDR notation." ++msgstr "" ++ ++msgid "IPv6 source" ++msgstr "" ++ ++msgid "" ++"IPv6 src prefix. OLSRd will choose one of the interface IPs which matches " ++"the prefix of this parameter. Default is \"0::/0\", which triggers the usage " ++"of a not-linklocal interface IP." ++msgstr "" ++ ++msgid "IPv6-Prefix of the uplink" ++msgstr "" ++ ++msgid "" ++"If the route to the current gateway is to be changed, the ETX value of this " ++"gateway is multiplied with this value before it is compared to the new one. " ++"The parameter can be a value between 0.1 and 1.0, but should be close to 1.0 " ++"if changed.
    WARNING: This parameter should not be used together " ++"with the etx_ffeth metric!
    Defaults to \"1.0\"." ++msgstr "" ++ ++msgid "" ++"If this Node uses NAT for connections to the internet. Default is \"yes\"." ++msgstr "" ++ ++msgid "Interface" ++msgstr "" ++ ++msgid "" ++"Interface Mode is used to prevent unnecessary packet forwarding on switched " ++"ethernet interfaces. valid Modes are \"mesh\" and \"ether\". Default is " ++"\"mesh\"." ++msgstr "" ++ ++msgid "Interfaces" ++msgstr "" ++ ++msgid "Interfaces Defaults" ++msgstr "" ++ ++msgid "Internet protocol" ++msgstr "Internet protocol" ++ ++msgid "" ++"Interval to poll network interfaces for configuration changes (in seconds). " ++"Default is \"2.5\"." ++msgstr "" ++ ++msgid "Invalid Value for LQMult-Value. Must be between 0.01 and 1.0." ++msgstr "" ++ ++msgid "" ++"Invalid Value for LQMult-Value. You must use a decimal number between 0.01 " ++"and 1.0 here." ++msgstr "" ++ ++msgid "Known OLSR routes" ++msgstr "Tuyến OLRS đã biết" ++ ++msgid "LQ" ++msgstr "" ++ ++msgid "LQ aging" ++msgstr "LQ aging" ++ ++msgid "LQ algorithm" ++msgstr "LQ algorithm" ++ ++msgid "LQ fisheye" ++msgstr "LQ fisheye" ++ ++msgid "LQ level" ++msgstr "LQ level" ++ ++msgid "" ++"LQMult requires two values (IP address or 'default' and multiplicator) " ++"seperated by space." ++msgstr "" ++ ++msgid "Last hop" ++msgstr "Hop cuối " ++ ++msgid "Legend" ++msgstr "" ++ ++msgid "Library" ++msgstr "Thư viện " ++ ++msgid "Link Quality Settings" ++msgstr "" ++ ++msgid "" ++"Link quality aging factor (only for lq level 2). Tuning parameter for " ++"etx_float and etx_fpm, smaller values mean slower changes of ETX value. " ++"(allowed values are between 0.01 and 1.0)" ++msgstr "" ++ ++msgid "" ++"Link quality algorithm (only for lq level 2).
    etx_float: " ++"floating point ETX with exponential aging
    etx_fpm : same as " ++"etx_float, but with integer arithmetic
    etx_ff : ETX freifunk, an " ++"etx variant which use all OLSR traffic (instead of only hellos) for ETX " ++"calculation
    etx_ffeth: incompatible variant of etx_ff that " ++"allows ethernet links with ETX 0.1.
    Defaults to \"etx_ff\"" ++msgstr "" ++ ++msgid "" ++"Link quality level switch between hopcount and cost-based (mostly ETX) " ++"routing.
    0 = do not use link quality
    2 = use link " ++"quality for MPR selection and routing
    Default is \"2\"" ++msgstr "" ++ ++msgid "LinkQuality Multiplicator" ++msgstr "" ++ ++msgid "Links per node (average)" ++msgstr "" ++ ++msgid "Links total" ++msgstr "" ++ ++msgid "Local interface IP" ++msgstr "Giao diện địa phÆ°Æ¡ng IP" ++ ++msgid "MID" ++msgstr "" ++ ++msgid "MID interval" ++msgstr "Khoảng MID" ++ ++msgid "MID validity time" ++msgstr "Thá»i gian hợp lệ hóa MID" ++ ++msgid "MTU" ++msgstr "" ++ ++msgid "Main IP" ++msgstr "" ++ ++msgid "" ++"Make sure that OLSRd is running, the \"jsoninfo\" plugin is loaded, " ++"configured on port 9090 and accepts connections from \"127.0.0.1\"." ++msgstr "" ++ ++msgid "Metric" ++msgstr "" ++ ++msgid "Mode" ++msgstr "" ++ ++msgid "" ++"Multiply routes with the factor given here. Allowed values are between 0.01 " ++"and 1.0. It is only used when LQ-Level is greater than 0. Examples:
    reduce LQ to 192.168.0.1 by half: 192.168.0.1 0.5
    reduce LQ to all " ++"nodes on this interface by 20%: default 0.8" ++msgstr "" ++ ++msgid "" ++"Multiply routes with the factor given here. Allowed values are between 0.01 " ++"and 1.0. It is only used when LQ-Level is greater than 0. Examples:
    reduce LQ to fd91:662e:3c58::1 by half: fd91:662e:3c58::1 0.5
    reduce " ++"LQ to all nodes on this interface by 20%: default 0.8" ++msgstr "" ++ ++msgid "NAT threshold" ++msgstr "" ++ ++msgid "NLQ" ++msgstr "" ++ ++msgid "Neighbors" ++msgstr "" ++ ++msgid "Neighbour IP" ++msgstr "Lận cận IP" ++ ++msgid "Neighbours" ++msgstr "" ++ ++msgid "Netmask" ++msgstr "Netmask" ++ ++msgid "Network" ++msgstr "" ++ ++msgid "Network address" ++msgstr "" ++ ++msgid "Nic changes poll interval" ++msgstr "" ++ ++msgid "Nodes" ++msgstr "" ++ ++msgid "OLSR" ++msgstr "" ++ ++msgid "OLSR - Display Options" ++msgstr "" ++ ++msgid "OLSR - HNA-Announcements" ++msgstr "OLSR - HNA - Thông báo" ++ ++#, fuzzy ++msgid "OLSR - HNA6-Announcements" ++msgstr "OLSR - HNA - Thông báo" ++ ++msgid "OLSR - Plugins" ++msgstr "OLSR - Plugins" ++ ++msgid "OLSR Daemon" ++msgstr "OLSR Daemon" ++ ++msgid "OLSR Daemon - Interface" ++msgstr "" ++ ++msgid "OLSR connections" ++msgstr "Kết nối OLSR" ++ ++msgid "OLSR gateway" ++msgstr "Cổng OLSR" ++ ++msgid "OLSR node" ++msgstr "OLSR node" ++ ++msgid "Orange" ++msgstr "" ++ ++msgid "Overview" ++msgstr "" ++ ++msgid "Overview of currently active OLSR host net announcements" ++msgstr "Tổng quát vá» các thông báo của mạng host Ä‘ang hoạt Ä‘á»™ng" ++ ++msgid "Overview of currently established OLSR connections" ++msgstr "Tổng quát vá» kết nối OLSR hiện tại " ++ ++msgid "Overview of currently known OLSR nodes" ++msgstr "Tổng quát của các OLSR nodes đã biết hiện tại" ++ ++msgid "Overview of currently known routes to other OLSR nodes" ++msgstr "Tổng quát của các tuyến đã biết hiện tại tá»›i những OLSR nodes khác" ++ ++msgid "Overview of interfaces where OLSR is running" ++msgstr "" ++ ++msgid "Overview of known multiple interface announcements" ++msgstr "Tổng quát vá» thông báo của nhiá»u giao diện đã biết" ++ ++msgid "Overview of smart gateways in this network" ++msgstr "" ++ ++msgid "Plugin configuration" ++msgstr "Cấu hình Plugin" ++ ++msgid "Plugins" ++msgstr "" ++ ++msgid "Polling rate for OLSR sockets in seconds. Default is 0.05." ++msgstr "" ++ ++msgid "Pollrate" ++msgstr "Pollrate" ++ ++msgid "Port" ++msgstr "" ++ ++msgid "Prefix" ++msgstr "Tiá»n tố" ++ ++msgid "Red" ++msgstr "" ++ ++msgid "Resolve" ++msgstr "" ++ ++msgid "" ++"Resolve hostnames on status pages. It is generally safe to allow this, but " ++"if you use public IPs and have unstable DNS-Setup then those pages will load " ++"really slow. In this case disable it here." ++msgstr "" ++ ++msgid "Routes" ++msgstr "" ++ ++msgid "Secondary OLSR interfaces" ++msgstr "Giao diện OLSR thứ nhì" ++ ++msgid "" ++"Sets the main IP (originator ip) of the router. This IP will NEVER change " ++"during the uptime of olsrd. Default is 0.0.0.0, which triggers usage of the " ++"IP of the first interface." ++msgstr "" ++ ++msgid "" ++"Sets the main IP (originator ip) of the router. This IP will NEVER change " ++"during the uptime of olsrd. Default is ::, which triggers usage of the IP of " ++"the first interface." ++msgstr "" ++ ++msgid "Show IPv4" ++msgstr "" ++ ++msgid "Show IPv6" ++msgstr "" ++ ++msgid "Signal Noise Ratio in dB" ++msgstr "" ++ ++msgid "SmartGW" ++msgstr "" ++ ++msgid "SmartGW announcements" ++msgstr "" ++ ++msgid "SmartGateway is not configured on this system." ++msgstr "" ++ ++msgid "Source address" ++msgstr "" ++ ++msgid "" ++"Specifies the speed of the uplink in kilobits/s. First parameter is " ++"upstream, second parameter is downstream. Default is \"128 1024\"." ++msgstr "" ++ ++msgid "Speed of the uplink" ++msgstr "" ++ ++msgid "State" ++msgstr "" ++ ++msgid "Status" ++msgstr "" ++ ++msgid "Still usable (20 > SNR > 5)" ++msgstr "" ++ ++msgid "Still usable (4 < ETX < 10)" ++msgstr "" ++ ++msgid "Success rate of packages received from the neighbour" ++msgstr "" ++ ++msgid "Success rate of packages sent to the neighbour" ++msgstr "" ++ ++msgid "TC" ++msgstr "" ++ ++msgid "TC interval" ++msgstr "Khoảng TC" ++ ++msgid "TC validity time" ++msgstr "Thá»i gian hợp lệ hóa TC" ++ ++msgid "TOS value" ++msgstr "" ++ ++msgid "" ++"The OLSR daemon is an implementation of the Optimized Link State Routing " ++"protocol. As such it allows mesh routing for any network equipment. It runs " ++"on any wifi card that supports ad-hoc mode and of course on any ethernet " ++"device. Visit olsrd.org for help and " ++"documentation." ++msgstr "" ++ ++msgid "" ++"The fixed willingness to use. If not set willingness will be calculated " ++"dynamically based on battery/power status. Default is \"3\"." ++msgstr "" ++ ++msgid "The interface OLSRd should serve." ++msgstr "" ++ ++msgid "" ++"The port OLSR uses. This should usually stay at the IANA assigned port 698. " ++"It can have a value between 1 and 65535." ++msgstr "" ++ ++msgid "" ++"This can be used to signal the external IPv6 prefix of the uplink to the " ++"clients. This might allow a client to change it's local IPv6 address to use " ++"the IPv6 gateway without any kind of address translation. The maximum prefix " ++"length is 64 bits. Default is \"::/0\" (no prefix)." ++msgstr "" ++ ++msgid "Timing and Validity" ++msgstr "" ++ ++msgid "Topology" ++msgstr "" ++ ++msgid "" ++"Type of service value for the IP header of control traffic. Default is " ++"\"16\"." ++msgstr "" ++ ++msgid "Unable to connect to the OLSR daemon!" ++msgstr "Không thể kết nối vá»›i OLSR daemon!" ++ ++msgid "Uplink" ++msgstr "" ++ ++msgid "Uplink uses NAT" ++msgstr "" ++ ++msgid "Use hysteresis" ++msgstr "Dùng hysteresis" ++ ++msgid "Validity Time" ++msgstr "" ++ ++msgid "Version" ++msgstr "" ++ ++msgid "Very good (ETX < 2)" ++msgstr "" ++ ++msgid "Very good (SNR > 30)" ++msgstr "" ++ ++msgid "WLAN" ++msgstr "" ++ ++msgid "" ++"Warning: kmod-ipip is not installed. Without kmod-ipip SmartGateway will not " ++"work, please install it." ++msgstr "" ++ ++msgid "Weight" ++msgstr "" ++ ++msgid "" ++"When multiple links exist between hosts the weight of interface is used to " ++"determine the link to use. Normally the weight is automatically calculated " ++"by olsrd based on the characteristics of the interface, but here you can " ++"specify a fixed value. Olsrd will choose links with the lowest value.
    Note: Interface weight is used only when LinkQualityLevel is set to " ++"0. For any other value of LinkQualityLevel, the interface ETX value is used " ++"instead." ++msgstr "" ++ ++msgid "" ++"Which kind of uplink is exported to the other mesh nodes. An uplink is " ++"detected by looking for a local HNA of 0.0.0.0/0, ::ffff:0:0/96 or 2000::/3. " ++"Default setting is \"both\"." ++msgstr "" ++ ++msgid "" ++"Which kind of uplink is exported to the other mesh nodes. An uplink is " ++"detected by looking for a local HNA6 ::ffff:0:0/96 or 2000::/3. Default " ++"setting is \"both\"." ++msgstr "" ++ ++msgid "Willingness" ++msgstr "Sẵn sàng" ++ ++msgid "Yellow" ++msgstr "" ++ ++msgid "no" ++msgstr "" ++ ++msgid "yes" ++msgstr "" ++ ++#~ msgid "" ++#~ "Make sure that OLSRd is running, the \"txtinfo\" plugin is loaded, " ++#~ "configured on port 2006 and accepts connections from \"127.0.0.1\"." ++#~ msgstr "" ++#~ "Bảo đảm là OLSRd Ä‘ang vận hành, the &quot;txtinfo&quot; plugin " ++#~ "được tải, định cấu hình trên cổng 2006 và chấp nhận kết nối từ &" ++#~ "quot;127.0.0.1&quot;." +diff --git a/feeds/luci/applications/luci-app-olsr/po/zh-cn/olsr.po b/feeds/luci/applications/luci-app-olsr/po/zh-cn/olsr.po +new file mode 100644 +index 0000000..37264f5 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-olsr/po/zh-cn/olsr.po +@@ -0,0 +1,696 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"PO-Revision-Date: 2013-10-10 20:26+0200\n" ++"Last-Translator: Tanyingyu \n" ++"Language-Team: none\n" ++"Language: zh_CN\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=1; plural=0;\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "Active MID announcements" ++msgstr "" ++ ++msgid "Active OLSR nodes" ++msgstr "" ++ ++msgid "Active host net announcements" ++msgstr "" ++ ++msgid "Advanced Settings" ++msgstr "高级设置" ++ ++msgid "Allow gateways with NAT" ++msgstr "å…许网关使用NAT" ++ ++msgid "Allow the selection of an outgoing ipv4 gateway with NAT" ++msgstr "å…许选定的IPv4通过网关NAT" ++ ++msgid "Announce uplink" ++msgstr "广告上行" ++ ++msgid "Announced network" ++msgstr "广告网络" ++ ++msgid "Bad (ETX > 10)" ++msgstr "" ++ ++msgid "Bad (SNR < 5)" ++msgstr "" ++ ++msgid "Both values must use the dotted decimal notation." ++msgstr "两个值必须使用点分å进制表示法。" ++ ++msgid "Broadcast address" ++msgstr "广播地å€" ++ ++msgid "Can only be a valid IPv4 or IPv6 address or 'default'" ++msgstr "" ++ ++msgid "Can only be a valid IPv6 address or 'default'" ++msgstr "" ++ ++msgid "Configuration" ++msgstr "é…ç½®" ++ ++msgid "" ++"Could not get any data. Make sure the jsoninfo plugin is installed and " ++"allows connections from localhost." ++msgstr "" ++ ++msgid "Display" ++msgstr "显示" ++ ++msgid "Downlink" ++msgstr "断线" ++ ++msgid "Download Config" ++msgstr "下载é…ç½®" ++ ++msgid "ETX" ++msgstr "ETX" ++ ++msgid "Enable" ++msgstr "å…许" ++ ++msgid "" ++"Enable SmartGateway. If it is disabled, then all other SmartGateway " ++"parameters are ignored. Default is \"no\"." ++msgstr "" ++"å¯ç”¨SmartGateway。如果ç¦ç”¨ï¼Œåˆ™SmartGateway其他所有å‚数将忽略。缺çœå€¼ï¼šâ€œç¦ç”¨â€" ++ ++msgid "Enable this interface." ++msgstr "å¯ç”¨è¿™ä¸ªç«¯å£" ++ ++msgid "Enabled" ++msgstr "å¯ç”¨" ++ ++msgid "Expected retransmission count" ++msgstr "预期é‡å‘æ•°" ++ ++msgid "FIB metric" ++msgstr "FIB度é‡" ++ ++msgid "" ++"FIBMetric controls the metric value of the host-routes OLSRd sets. \"flat\" " ++"means that the metric value is always 2. This is the preferred value because " ++"it helps the linux kernel routing to clean up older routes. \"correct\" uses " ++"the hopcount as the metric value. \"approx\" use the hopcount as the metric " ++"value too, but does only update the hopcount if the nexthop changes too. " ++"Default is \"flat\"." ++msgstr "" ++ ++msgid "Fisheye mechanism for TCs (checked means on). Default is \"on\"" ++msgstr "" ++ ++msgid "Gateway" ++msgstr "网关" ++ ++msgid "General Settings" ++msgstr "通用设置" ++ ++msgid "General settings" ++msgstr "通用设置" ++ ++msgid "Good (2 < ETX < 4)" ++msgstr "" ++ ++msgid "Good (30 > SNR > 20)" ++msgstr "" ++ ++msgid "Green" ++msgstr "" ++ ++msgid "HNA" ++msgstr "HNA" ++ ++msgid "HNA Announcements" ++msgstr "HNA公告" ++ ++msgid "HNA interval" ++msgstr "HNAé—´éš™" ++ ++msgid "HNA validity time" ++msgstr "HNA有效时长" ++ ++#, fuzzy ++msgid "HNA6 Announcements" ++msgstr "HNA公告" ++ ++msgid "Hello" ++msgstr "Hello" ++ ++msgid "Hello interval" ++msgstr "Helloé—´éš™" ++ ++msgid "Hello validity time" ++msgstr "Hello有效时长" ++ ++msgid "Hide IPv4" ++msgstr "" ++ ++msgid "Hide IPv6" ++msgstr "" ++ ++msgid "Hna4" ++msgstr "Hna4" ++ ++msgid "Hna6" ++msgstr "Hna6" ++ ++msgid "Hops" ++msgstr "è·³" ++ ++msgid "Hostname" ++msgstr "主机å" ++ ++msgid "" ++"Hosts in a OLSR routed network can announce connecitivity to external " ++"networks using HNA messages." ++msgstr "" ++ ++msgid "" ++"Hosts in a OLSR routed network can announce connecitivity to external " ++"networks using HNA6 messages." ++msgstr "" ++ ++msgid "" ++"Hysteresis for link sensing (only for hopcount metric). Hysteresis adds more " ++"robustness to the link sensing but delays neighbor registration. Defaults is " ++"\"yes\"" ++msgstr "" ++ ++msgid "IP Addresses" ++msgstr "IP地å€" ++ ++msgid "" ++"IP-version to use. If 6and4 is selected then one olsrd instance is started " ++"for each protocol." ++msgstr "" ++ ++msgid "IPv4" ++msgstr "IPv4" ++ ++msgid "IPv4 broadcast" ++msgstr "IPv4广播地å€" ++ ++msgid "" ++"IPv4 broadcast address for outgoing OLSR packets. One useful example would " ++"be 255.255.255.255. Default is \"0.0.0.0\", which triggers the usage of the " ++"interface broadcast IP." ++msgstr "" ++ ++msgid "IPv4 source" ++msgstr "" ++ ++msgid "" ++"IPv4 src address for outgoing OLSR packages. Default is \"0.0.0.0\", which " ++"triggers usage of the interface IP." ++msgstr "" ++ ++msgid "IPv6" ++msgstr "" ++ ++msgid "IPv6 multicast" ++msgstr "" ++ ++msgid "" ++"IPv6 multicast address. Default is \"FF02::6D\", the manet-router linklocal " ++"multicast." ++msgstr "" ++ ++msgid "" ++"IPv6 network must be given in full notation, prefix must be in CIDR notation." ++msgstr "" ++ ++msgid "IPv6 source" ++msgstr "" ++ ++msgid "" ++"IPv6 src prefix. OLSRd will choose one of the interface IPs which matches " ++"the prefix of this parameter. Default is \"0::/0\", which triggers the usage " ++"of a not-linklocal interface IP." ++msgstr "" ++ ++msgid "IPv6-Prefix of the uplink" ++msgstr "" ++ ++msgid "" ++"If the route to the current gateway is to be changed, the ETX value of this " ++"gateway is multiplied with this value before it is compared to the new one. " ++"The parameter can be a value between 0.1 and 1.0, but should be close to 1.0 " ++"if changed.
    WARNING: This parameter should not be used together " ++"with the etx_ffeth metric!
    Defaults to \"1.0\"." ++msgstr "" ++ ++msgid "" ++"If this Node uses NAT for connections to the internet. Default is \"yes\"." ++msgstr "" ++ ++msgid "Interface" ++msgstr "" ++ ++msgid "" ++"Interface Mode is used to prevent unnecessary packet forwarding on switched " ++"ethernet interfaces. valid Modes are \"mesh\" and \"ether\". Default is " ++"\"mesh\"." ++msgstr "" ++ ++msgid "Interfaces" ++msgstr "" ++ ++msgid "Interfaces Defaults" ++msgstr "" ++ ++msgid "Internet protocol" ++msgstr "" ++ ++msgid "" ++"Interval to poll network interfaces for configuration changes (in seconds). " ++"Default is \"2.5\"." ++msgstr "" ++ ++msgid "Invalid Value for LQMult-Value. Must be between 0.01 and 1.0." ++msgstr "" ++ ++msgid "" ++"Invalid Value for LQMult-Value. You must use a decimal number between 0.01 " ++"and 1.0 here." ++msgstr "" ++ ++msgid "Known OLSR routes" ++msgstr "" ++ ++msgid "LQ" ++msgstr "" ++ ++msgid "LQ aging" ++msgstr "" ++ ++msgid "LQ algorithm" ++msgstr "" ++ ++msgid "LQ fisheye" ++msgstr "" ++ ++msgid "LQ level" ++msgstr "" ++ ++msgid "" ++"LQMult requires two values (IP address or 'default' and multiplicator) " ++"seperated by space." ++msgstr "" ++ ++msgid "Last hop" ++msgstr "" ++ ++msgid "Legend" ++msgstr "" ++ ++msgid "Library" ++msgstr "" ++ ++msgid "Link Quality Settings" ++msgstr "" ++ ++msgid "" ++"Link quality aging factor (only for lq level 2). Tuning parameter for " ++"etx_float and etx_fpm, smaller values mean slower changes of ETX value. " ++"(allowed values are between 0.01 and 1.0)" ++msgstr "" ++ ++msgid "" ++"Link quality algorithm (only for lq level 2).
    etx_float: " ++"floating point ETX with exponential aging
    etx_fpm : same as " ++"etx_float, but with integer arithmetic
    etx_ff : ETX freifunk, an " ++"etx variant which use all OLSR traffic (instead of only hellos) for ETX " ++"calculation
    etx_ffeth: incompatible variant of etx_ff that " ++"allows ethernet links with ETX 0.1.
    Defaults to \"etx_ff\"" ++msgstr "" ++ ++msgid "" ++"Link quality level switch between hopcount and cost-based (mostly ETX) " ++"routing.
    0 = do not use link quality
    2 = use link " ++"quality for MPR selection and routing
    Default is \"2\"" ++msgstr "" ++ ++msgid "LinkQuality Multiplicator" ++msgstr "" ++ ++msgid "Links per node (average)" ++msgstr "" ++ ++msgid "Links total" ++msgstr "" ++ ++msgid "Local interface IP" ++msgstr "" ++ ++msgid "MID" ++msgstr "" ++ ++msgid "MID interval" ++msgstr "" ++ ++msgid "MID validity time" ++msgstr "" ++ ++msgid "MTU" ++msgstr "" ++ ++msgid "Main IP" ++msgstr "" ++ ++msgid "" ++"Make sure that OLSRd is running, the \"jsoninfo\" plugin is loaded, " ++"configured on port 9090 and accepts connections from \"127.0.0.1\"." ++msgstr "" ++ ++msgid "Metric" ++msgstr "" ++ ++msgid "Mode" ++msgstr "" ++ ++msgid "" ++"Multiply routes with the factor given here. Allowed values are between 0.01 " ++"and 1.0. It is only used when LQ-Level is greater than 0. Examples:
    reduce LQ to 192.168.0.1 by half: 192.168.0.1 0.5
    reduce LQ to all " ++"nodes on this interface by 20%: default 0.8" ++msgstr "" ++ ++msgid "" ++"Multiply routes with the factor given here. Allowed values are between 0.01 " ++"and 1.0. It is only used when LQ-Level is greater than 0. Examples:
    reduce LQ to fd91:662e:3c58::1 by half: fd91:662e:3c58::1 0.5
    reduce " ++"LQ to all nodes on this interface by 20%: default 0.8" ++msgstr "" ++ ++msgid "NAT threshold" ++msgstr "" ++ ++msgid "NLQ" ++msgstr "" ++ ++msgid "Neighbors" ++msgstr "" ++ ++msgid "Neighbour IP" ++msgstr "" ++ ++msgid "Neighbours" ++msgstr "" ++ ++msgid "Netmask" ++msgstr "" ++ ++msgid "Network" ++msgstr "" ++ ++msgid "Network address" ++msgstr "" ++ ++msgid "Nic changes poll interval" ++msgstr "" ++ ++msgid "Nodes" ++msgstr "" ++ ++msgid "OLSR" ++msgstr "" ++ ++msgid "OLSR - Display Options" ++msgstr "" ++ ++msgid "OLSR - HNA-Announcements" ++msgstr "" ++ ++#, fuzzy ++msgid "OLSR - HNA6-Announcements" ++msgstr "HNA公告" ++ ++msgid "OLSR - Plugins" ++msgstr "" ++ ++msgid "OLSR Daemon" ++msgstr "" ++ ++msgid "OLSR Daemon - Interface" ++msgstr "" ++ ++msgid "OLSR connections" ++msgstr "" ++ ++msgid "OLSR gateway" ++msgstr "" ++ ++msgid "OLSR node" ++msgstr "" ++ ++msgid "Orange" ++msgstr "" ++ ++msgid "Overview" ++msgstr "" ++ ++msgid "Overview of currently active OLSR host net announcements" ++msgstr "" ++ ++msgid "Overview of currently established OLSR connections" ++msgstr "" ++ ++msgid "Overview of currently known OLSR nodes" ++msgstr "" ++ ++msgid "Overview of currently known routes to other OLSR nodes" ++msgstr "" ++ ++msgid "Overview of interfaces where OLSR is running" ++msgstr "" ++ ++msgid "Overview of known multiple interface announcements" ++msgstr "" ++ ++msgid "Overview of smart gateways in this network" ++msgstr "" ++ ++msgid "Plugin configuration" ++msgstr "" ++ ++msgid "Plugins" ++msgstr "" ++ ++msgid "Polling rate for OLSR sockets in seconds. Default is 0.05." ++msgstr "" ++ ++msgid "Pollrate" ++msgstr "" ++ ++msgid "Port" ++msgstr "" ++ ++msgid "Prefix" ++msgstr "" ++ ++msgid "Red" ++msgstr "" ++ ++msgid "Resolve" ++msgstr "" ++ ++msgid "" ++"Resolve hostnames on status pages. It is generally safe to allow this, but " ++"if you use public IPs and have unstable DNS-Setup then those pages will load " ++"really slow. In this case disable it here." ++msgstr "" ++ ++msgid "Routes" ++msgstr "" ++ ++msgid "Secondary OLSR interfaces" ++msgstr "" ++ ++msgid "" ++"Sets the main IP (originator ip) of the router. This IP will NEVER change " ++"during the uptime of olsrd. Default is 0.0.0.0, which triggers usage of the " ++"IP of the first interface." ++msgstr "" ++ ++msgid "" ++"Sets the main IP (originator ip) of the router. This IP will NEVER change " ++"during the uptime of olsrd. Default is ::, which triggers usage of the IP of " ++"the first interface." ++msgstr "" ++ ++msgid "Show IPv4" ++msgstr "" ++ ++msgid "Show IPv6" ++msgstr "" ++ ++msgid "Signal Noise Ratio in dB" ++msgstr "" ++ ++msgid "SmartGW" ++msgstr "" ++ ++msgid "SmartGW announcements" ++msgstr "" ++ ++msgid "SmartGateway is not configured on this system." ++msgstr "" ++ ++msgid "Source address" ++msgstr "" ++ ++msgid "" ++"Specifies the speed of the uplink in kilobits/s. First parameter is " ++"upstream, second parameter is downstream. Default is \"128 1024\"." ++msgstr "" ++ ++msgid "Speed of the uplink" ++msgstr "" ++ ++msgid "State" ++msgstr "" ++ ++msgid "Status" ++msgstr "" ++ ++msgid "Still usable (20 > SNR > 5)" ++msgstr "" ++ ++msgid "Still usable (4 < ETX < 10)" ++msgstr "" ++ ++msgid "Success rate of packages received from the neighbour" ++msgstr "" ++ ++msgid "Success rate of packages sent to the neighbour" ++msgstr "" ++ ++msgid "TC" ++msgstr "" ++ ++msgid "TC interval" ++msgstr "" ++ ++msgid "TC validity time" ++msgstr "" ++ ++msgid "TOS value" ++msgstr "" ++ ++msgid "" ++"The OLSR daemon is an implementation of the Optimized Link State Routing " ++"protocol. As such it allows mesh routing for any network equipment. It runs " ++"on any wifi card that supports ad-hoc mode and of course on any ethernet " ++"device. Visit olsrd.org for help and " ++"documentation." ++msgstr "" ++ ++msgid "" ++"The fixed willingness to use. If not set willingness will be calculated " ++"dynamically based on battery/power status. Default is \"3\"." ++msgstr "" ++ ++msgid "The interface OLSRd should serve." ++msgstr "" ++ ++msgid "" ++"The port OLSR uses. This should usually stay at the IANA assigned port 698. " ++"It can have a value between 1 and 65535." ++msgstr "" ++ ++msgid "" ++"This can be used to signal the external IPv6 prefix of the uplink to the " ++"clients. This might allow a client to change it's local IPv6 address to use " ++"the IPv6 gateway without any kind of address translation. The maximum prefix " ++"length is 64 bits. Default is \"::/0\" (no prefix)." ++msgstr "" ++ ++msgid "Timing and Validity" ++msgstr "" ++ ++msgid "Topology" ++msgstr "" ++ ++msgid "" ++"Type of service value for the IP header of control traffic. Default is " ++"\"16\"." ++msgstr "" ++ ++msgid "Unable to connect to the OLSR daemon!" ++msgstr "" ++ ++msgid "Uplink" ++msgstr "" ++ ++msgid "Uplink uses NAT" ++msgstr "" ++ ++msgid "Use hysteresis" ++msgstr "" ++ ++msgid "Validity Time" ++msgstr "" ++ ++msgid "Version" ++msgstr "" ++ ++msgid "Very good (ETX < 2)" ++msgstr "" ++ ++msgid "Very good (SNR > 30)" ++msgstr "" ++ ++msgid "WLAN" ++msgstr "" ++ ++msgid "" ++"Warning: kmod-ipip is not installed. Without kmod-ipip SmartGateway will not " ++"work, please install it." ++msgstr "" ++ ++msgid "Weight" ++msgstr "" ++ ++msgid "" ++"When multiple links exist between hosts the weight of interface is used to " ++"determine the link to use. Normally the weight is automatically calculated " ++"by olsrd based on the characteristics of the interface, but here you can " ++"specify a fixed value. Olsrd will choose links with the lowest value.
    Note: Interface weight is used only when LinkQualityLevel is set to " ++"0. For any other value of LinkQualityLevel, the interface ETX value is used " ++"instead." ++msgstr "" ++ ++msgid "" ++"Which kind of uplink is exported to the other mesh nodes. An uplink is " ++"detected by looking for a local HNA of 0.0.0.0/0, ::ffff:0:0/96 or 2000::/3. " ++"Default setting is \"both\"." ++msgstr "" ++ ++msgid "" ++"Which kind of uplink is exported to the other mesh nodes. An uplink is " ++"detected by looking for a local HNA6 ::ffff:0:0/96 or 2000::/3. Default " ++"setting is \"both\"." ++msgstr "" ++ ++msgid "Willingness" ++msgstr "" ++ ++msgid "Yellow" ++msgstr "" ++ ++msgid "no" ++msgstr "" ++ ++msgid "yes" ++msgstr "" ++ ++#~ msgid "Device" ++#~ msgstr "设备" +diff --git a/feeds/luci/applications/luci-app-olsr/po/zh-tw/olsr.po b/feeds/luci/applications/luci-app-olsr/po/zh-tw/olsr.po +new file mode 100644 +index 0000000..797874d +--- /dev/null ++++ b/feeds/luci/applications/luci-app-olsr/po/zh-tw/olsr.po +@@ -0,0 +1,700 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"PO-Revision-Date: 2014-05-15 07:15+0200\n" ++"Last-Translator: omnistack \n" ++"Language-Team: none\n" ++"Language: zh_TW\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=1; plural=0;\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "Active MID announcements" ++msgstr "啟用Mesh網狀網路ID公告" ++ ++msgid "Active OLSR nodes" ++msgstr "啟用OLSR路由å”議節點" ++ ++msgid "Active host net announcements" ++msgstr "啟用主機網路公告" ++ ++msgid "Advanced Settings" ++msgstr "進階設定" ++ ++msgid "Allow gateways with NAT" ++msgstr "å…許帶NATçš„åŒé“器" ++ ++msgid "Allow the selection of an outgoing ipv4 gateway with NAT" ++msgstr "å…許帶NATçš„åŒé“器é¸æ“‡è¼¸å‡ºipv4å°åŒ…" ++ ++msgid "Announce uplink" ++msgstr "公告上傳" ++ ++msgid "Announced network" ++msgstr "公告網路" ++ ++msgid "Bad (ETX > 10)" ++msgstr "" ++ ++msgid "Bad (SNR < 5)" ++msgstr "" ++ ++msgid "Both values must use the dotted decimal notation." ++msgstr "這兩個值都必須採用點分å進ä½åˆ¶æ ¼å¼" ++ ++msgid "Broadcast address" ++msgstr "廣播ä½å€" ++ ++msgid "Can only be a valid IPv4 or IPv6 address or 'default'" ++msgstr "" ++ ++msgid "Can only be a valid IPv6 address or 'default'" ++msgstr "" ++ ++msgid "Configuration" ++msgstr "設定" ++ ++msgid "" ++"Could not get any data. Make sure the jsoninfo plugin is installed and " ++"allows connections from localhost." ++msgstr "" ++ ++msgid "Display" ++msgstr "顯示" ++ ++msgid "Downlink" ++msgstr "下行" ++ ++msgid "Download Config" ++msgstr "下載設置" ++ ++msgid "ETX" ++msgstr "" ++ ++msgid "Enable" ++msgstr "啟用" ++ ++msgid "" ++"Enable SmartGateway. If it is disabled, then all other SmartGateway " ++"parameters are ignored. Default is \"no\"." ++msgstr "" ++"啟用機動å¼åŒé“器. å‡å¦‚它失效, 其它所有機動å¼åŒé“器åƒæ•¸å°‡è¢«å¿½è¦–. é è¨­å€¼æ˜¯\"no" ++"\"" ++ ++msgid "Enable this interface." ++msgstr "啟用這個介é¢" ++ ++msgid "Enabled" ++msgstr "啟用" ++ ++msgid "Expected retransmission count" ++msgstr "é è¨ˆé‡å‚³æ¬¡æ•¸" ++ ++msgid "FIB metric" ++msgstr "FIB指標" ++ ++msgid "" ++"FIBMetric controls the metric value of the host-routes OLSRd sets. \"flat\" " ++"means that the metric value is always 2. This is the preferred value because " ++"it helps the linux kernel routing to clean up older routes. \"correct\" uses " ++"the hopcount as the metric value. \"approx\" use the hopcount as the metric " ++"value too, but does only update the hopcount if the nexthop changes too. " ++"Default is \"flat\"." ++msgstr "" ++"FIBMetric控制OLSR主機路由的公用路由計é‡è¨­å®š. \"flat\" 代表是公用計é‡æ•¸æ°¸é æ˜¯" ++"2. 這是較å—歡迎的數值, 因為它會å”助linux核心路由清除舊的路由表. \"correct\"使" ++"用跳èºæ•¸ç•¶ä½œå…¬ç”¨è·¯ç”±è¨ˆé‡. \"approx\"也使用跳èºæ•¸ç•¶ä½œå…¬ç”¨è·¯ç”±è¨ˆé‡, 但åªä½œç”¨åœ¨" ++"è·³èºæ•¸ä¹Ÿæ›´æ–°æ™‚. é è¨­å€¼æ˜¯\"flat\"." ++ ++msgid "Fisheye mechanism for TCs (checked means on). Default is \"on\"" ++msgstr "" ++ ++msgid "Gateway" ++msgstr "åŒé“器" ++ ++msgid "General Settings" ++msgstr "一般設定" ++ ++msgid "General settings" ++msgstr "一般設定" ++ ++msgid "Good (2 < ETX < 4)" ++msgstr "" ++ ++msgid "Good (30 > SNR > 20)" ++msgstr "" ++ ++msgid "Green" ++msgstr "" ++ ++msgid "HNA" ++msgstr "" ++ ++msgid "HNA Announcements" ++msgstr "" ++ ++msgid "HNA interval" ++msgstr "" ++ ++msgid "HNA validity time" ++msgstr "" ++ ++#, fuzzy ++msgid "HNA6 Announcements" ++msgstr "啟用Mesh網狀網路ID公告" ++ ++msgid "Hello" ++msgstr "" ++ ++msgid "Hello interval" ++msgstr "" ++ ++msgid "Hello validity time" ++msgstr "" ++ ++msgid "Hide IPv4" ++msgstr "" ++ ++msgid "Hide IPv6" ++msgstr "" ++ ++msgid "Hna4" ++msgstr "" ++ ++msgid "Hna6" ++msgstr "" ++ ++msgid "Hops" ++msgstr "" ++ ++msgid "Hostname" ++msgstr "" ++ ++msgid "" ++"Hosts in a OLSR routed network can announce connecitivity to external " ++"networks using HNA messages." ++msgstr "" ++ ++msgid "" ++"Hosts in a OLSR routed network can announce connecitivity to external " ++"networks using HNA6 messages." ++msgstr "" ++ ++msgid "" ++"Hysteresis for link sensing (only for hopcount metric). Hysteresis adds more " ++"robustness to the link sensing but delays neighbor registration. Defaults is " ++"\"yes\"" ++msgstr "" ++ ++msgid "IP Addresses" ++msgstr "" ++ ++msgid "" ++"IP-version to use. If 6and4 is selected then one olsrd instance is started " ++"for each protocol." ++msgstr "" ++ ++msgid "IPv4" ++msgstr "" ++ ++msgid "IPv4 broadcast" ++msgstr "" ++ ++msgid "" ++"IPv4 broadcast address for outgoing OLSR packets. One useful example would " ++"be 255.255.255.255. Default is \"0.0.0.0\", which triggers the usage of the " ++"interface broadcast IP." ++msgstr "" ++ ++msgid "IPv4 source" ++msgstr "" ++ ++msgid "" ++"IPv4 src address for outgoing OLSR packages. Default is \"0.0.0.0\", which " ++"triggers usage of the interface IP." ++msgstr "" ++ ++msgid "IPv6" ++msgstr "" ++ ++msgid "IPv6 multicast" ++msgstr "" ++ ++msgid "" ++"IPv6 multicast address. Default is \"FF02::6D\", the manet-router linklocal " ++"multicast." ++msgstr "" ++ ++msgid "" ++"IPv6 network must be given in full notation, prefix must be in CIDR notation." ++msgstr "" ++ ++msgid "IPv6 source" ++msgstr "" ++ ++msgid "" ++"IPv6 src prefix. OLSRd will choose one of the interface IPs which matches " ++"the prefix of this parameter. Default is \"0::/0\", which triggers the usage " ++"of a not-linklocal interface IP." ++msgstr "" ++ ++msgid "IPv6-Prefix of the uplink" ++msgstr "" ++ ++msgid "" ++"If the route to the current gateway is to be changed, the ETX value of this " ++"gateway is multiplied with this value before it is compared to the new one. " ++"The parameter can be a value between 0.1 and 1.0, but should be close to 1.0 " ++"if changed.
    WARNING: This parameter should not be used together " ++"with the etx_ffeth metric!
    Defaults to \"1.0\"." ++msgstr "" ++ ++msgid "" ++"If this Node uses NAT for connections to the internet. Default is \"yes\"." ++msgstr "" ++ ++msgid "Interface" ++msgstr "" ++ ++msgid "" ++"Interface Mode is used to prevent unnecessary packet forwarding on switched " ++"ethernet interfaces. valid Modes are \"mesh\" and \"ether\". Default is " ++"\"mesh\"." ++msgstr "" ++ ++msgid "Interfaces" ++msgstr "" ++ ++msgid "Interfaces Defaults" ++msgstr "" ++ ++msgid "Internet protocol" ++msgstr "" ++ ++msgid "" ++"Interval to poll network interfaces for configuration changes (in seconds). " ++"Default is \"2.5\"." ++msgstr "" ++ ++msgid "Invalid Value for LQMult-Value. Must be between 0.01 and 1.0." ++msgstr "" ++ ++msgid "" ++"Invalid Value for LQMult-Value. You must use a decimal number between 0.01 " ++"and 1.0 here." ++msgstr "" ++ ++msgid "Known OLSR routes" ++msgstr "" ++ ++msgid "LQ" ++msgstr "" ++ ++msgid "LQ aging" ++msgstr "" ++ ++msgid "LQ algorithm" ++msgstr "" ++ ++msgid "LQ fisheye" ++msgstr "" ++ ++msgid "LQ level" ++msgstr "" ++ ++msgid "" ++"LQMult requires two values (IP address or 'default' and multiplicator) " ++"seperated by space." ++msgstr "" ++ ++msgid "Last hop" ++msgstr "" ++ ++msgid "Legend" ++msgstr "" ++ ++msgid "Library" ++msgstr "" ++ ++msgid "Link Quality Settings" ++msgstr "" ++ ++msgid "" ++"Link quality aging factor (only for lq level 2). Tuning parameter for " ++"etx_float and etx_fpm, smaller values mean slower changes of ETX value. " ++"(allowed values are between 0.01 and 1.0)" ++msgstr "" ++ ++msgid "" ++"Link quality algorithm (only for lq level 2).
    etx_float: " ++"floating point ETX with exponential aging
    etx_fpm : same as " ++"etx_float, but with integer arithmetic
    etx_ff : ETX freifunk, an " ++"etx variant which use all OLSR traffic (instead of only hellos) for ETX " ++"calculation
    etx_ffeth: incompatible variant of etx_ff that " ++"allows ethernet links with ETX 0.1.
    Defaults to \"etx_ff\"" ++msgstr "" ++ ++msgid "" ++"Link quality level switch between hopcount and cost-based (mostly ETX) " ++"routing.
    0 = do not use link quality
    2 = use link " ++"quality for MPR selection and routing
    Default is \"2\"" ++msgstr "" ++ ++msgid "LinkQuality Multiplicator" ++msgstr "" ++ ++msgid "Links per node (average)" ++msgstr "" ++ ++msgid "Links total" ++msgstr "" ++ ++msgid "Local interface IP" ++msgstr "" ++ ++msgid "MID" ++msgstr "" ++ ++msgid "MID interval" ++msgstr "" ++ ++msgid "MID validity time" ++msgstr "" ++ ++msgid "MTU" ++msgstr "" ++ ++msgid "Main IP" ++msgstr "" ++ ++msgid "" ++"Make sure that OLSRd is running, the \"jsoninfo\" plugin is loaded, " ++"configured on port 9090 and accepts connections from \"127.0.0.1\"." ++msgstr "" ++ ++msgid "Metric" ++msgstr "" ++ ++msgid "Mode" ++msgstr "" ++ ++msgid "" ++"Multiply routes with the factor given here. Allowed values are between 0.01 " ++"and 1.0. It is only used when LQ-Level is greater than 0. Examples:
    reduce LQ to 192.168.0.1 by half: 192.168.0.1 0.5
    reduce LQ to all " ++"nodes on this interface by 20%: default 0.8" ++msgstr "" ++ ++msgid "" ++"Multiply routes with the factor given here. Allowed values are between 0.01 " ++"and 1.0. It is only used when LQ-Level is greater than 0. Examples:
    reduce LQ to fd91:662e:3c58::1 by half: fd91:662e:3c58::1 0.5
    reduce " ++"LQ to all nodes on this interface by 20%: default 0.8" ++msgstr "" ++ ++msgid "NAT threshold" ++msgstr "" ++ ++msgid "NLQ" ++msgstr "" ++ ++msgid "Neighbors" ++msgstr "" ++ ++msgid "Neighbour IP" ++msgstr "" ++ ++msgid "Neighbours" ++msgstr "" ++ ++msgid "Netmask" ++msgstr "" ++ ++msgid "Network" ++msgstr "" ++ ++msgid "Network address" ++msgstr "" ++ ++msgid "Nic changes poll interval" ++msgstr "" ++ ++msgid "Nodes" ++msgstr "" ++ ++msgid "OLSR" ++msgstr "" ++ ++msgid "OLSR - Display Options" ++msgstr "" ++ ++msgid "OLSR - HNA-Announcements" ++msgstr "" ++ ++msgid "OLSR - HNA6-Announcements" ++msgstr "" ++ ++msgid "OLSR - Plugins" ++msgstr "" ++ ++msgid "OLSR Daemon" ++msgstr "" ++ ++msgid "OLSR Daemon - Interface" ++msgstr "" ++ ++msgid "OLSR connections" ++msgstr "" ++ ++msgid "OLSR gateway" ++msgstr "" ++ ++msgid "OLSR node" ++msgstr "" ++ ++msgid "Orange" ++msgstr "" ++ ++msgid "Overview" ++msgstr "" ++ ++msgid "Overview of currently active OLSR host net announcements" ++msgstr "" ++ ++msgid "Overview of currently established OLSR connections" ++msgstr "" ++ ++msgid "Overview of currently known OLSR nodes" ++msgstr "" ++ ++msgid "Overview of currently known routes to other OLSR nodes" ++msgstr "" ++ ++msgid "Overview of interfaces where OLSR is running" ++msgstr "" ++ ++msgid "Overview of known multiple interface announcements" ++msgstr "" ++ ++msgid "Overview of smart gateways in this network" ++msgstr "" ++ ++msgid "Plugin configuration" ++msgstr "" ++ ++msgid "Plugins" ++msgstr "" ++ ++msgid "Polling rate for OLSR sockets in seconds. Default is 0.05." ++msgstr "" ++ ++msgid "Pollrate" ++msgstr "" ++ ++msgid "Port" ++msgstr "" ++ ++msgid "Prefix" ++msgstr "" ++ ++msgid "Red" ++msgstr "" ++ ++msgid "Resolve" ++msgstr "" ++ ++msgid "" ++"Resolve hostnames on status pages. It is generally safe to allow this, but " ++"if you use public IPs and have unstable DNS-Setup then those pages will load " ++"really slow. In this case disable it here." ++msgstr "" ++ ++msgid "Routes" ++msgstr "" ++ ++msgid "Secondary OLSR interfaces" ++msgstr "" ++ ++msgid "" ++"Sets the main IP (originator ip) of the router. This IP will NEVER change " ++"during the uptime of olsrd. Default is 0.0.0.0, which triggers usage of the " ++"IP of the first interface." ++msgstr "" ++ ++msgid "" ++"Sets the main IP (originator ip) of the router. This IP will NEVER change " ++"during the uptime of olsrd. Default is ::, which triggers usage of the IP of " ++"the first interface." ++msgstr "" ++ ++msgid "Show IPv4" ++msgstr "" ++ ++msgid "Show IPv6" ++msgstr "" ++ ++msgid "Signal Noise Ratio in dB" ++msgstr "" ++ ++msgid "SmartGW" ++msgstr "" ++ ++msgid "SmartGW announcements" ++msgstr "" ++ ++msgid "SmartGateway is not configured on this system." ++msgstr "" ++ ++msgid "Source address" ++msgstr "" ++ ++msgid "" ++"Specifies the speed of the uplink in kilobits/s. First parameter is " ++"upstream, second parameter is downstream. Default is \"128 1024\"." ++msgstr "" ++ ++msgid "Speed of the uplink" ++msgstr "" ++ ++msgid "State" ++msgstr "" ++ ++msgid "Status" ++msgstr "" ++ ++msgid "Still usable (20 > SNR > 5)" ++msgstr "" ++ ++msgid "Still usable (4 < ETX < 10)" ++msgstr "" ++ ++msgid "Success rate of packages received from the neighbour" ++msgstr "" ++ ++msgid "Success rate of packages sent to the neighbour" ++msgstr "" ++ ++msgid "TC" ++msgstr "" ++ ++msgid "TC interval" ++msgstr "" ++ ++msgid "TC validity time" ++msgstr "" ++ ++msgid "TOS value" ++msgstr "" ++ ++msgid "" ++"The OLSR daemon is an implementation of the Optimized Link State Routing " ++"protocol. As such it allows mesh routing for any network equipment. It runs " ++"on any wifi card that supports ad-hoc mode and of course on any ethernet " ++"device. Visit olsrd.org for help and " ++"documentation." ++msgstr "" ++ ++msgid "" ++"The fixed willingness to use. If not set willingness will be calculated " ++"dynamically based on battery/power status. Default is \"3\"." ++msgstr "" ++ ++msgid "The interface OLSRd should serve." ++msgstr "" ++ ++msgid "" ++"The port OLSR uses. This should usually stay at the IANA assigned port 698. " ++"It can have a value between 1 and 65535." ++msgstr "" ++ ++msgid "" ++"This can be used to signal the external IPv6 prefix of the uplink to the " ++"clients. This might allow a client to change it's local IPv6 address to use " ++"the IPv6 gateway without any kind of address translation. The maximum prefix " ++"length is 64 bits. Default is \"::/0\" (no prefix)." ++msgstr "" ++ ++msgid "Timing and Validity" ++msgstr "" ++ ++msgid "Topology" ++msgstr "" ++ ++msgid "" ++"Type of service value for the IP header of control traffic. Default is " ++"\"16\"." ++msgstr "" ++ ++msgid "Unable to connect to the OLSR daemon!" ++msgstr "" ++ ++msgid "Uplink" ++msgstr "" ++ ++msgid "Uplink uses NAT" ++msgstr "" ++ ++msgid "Use hysteresis" ++msgstr "" ++ ++msgid "Validity Time" ++msgstr "" ++ ++msgid "Version" ++msgstr "" ++ ++msgid "Very good (ETX < 2)" ++msgstr "" ++ ++msgid "Very good (SNR > 30)" ++msgstr "" ++ ++msgid "WLAN" ++msgstr "" ++ ++msgid "" ++"Warning: kmod-ipip is not installed. Without kmod-ipip SmartGateway will not " ++"work, please install it." ++msgstr "" ++ ++msgid "Weight" ++msgstr "" ++ ++msgid "" ++"When multiple links exist between hosts the weight of interface is used to " ++"determine the link to use. Normally the weight is automatically calculated " ++"by olsrd based on the characteristics of the interface, but here you can " ++"specify a fixed value. Olsrd will choose links with the lowest value.
    Note: Interface weight is used only when LinkQualityLevel is set to " ++"0. For any other value of LinkQualityLevel, the interface ETX value is used " ++"instead." ++msgstr "" ++ ++msgid "" ++"Which kind of uplink is exported to the other mesh nodes. An uplink is " ++"detected by looking for a local HNA of 0.0.0.0/0, ::ffff:0:0/96 or 2000::/3. " ++"Default setting is \"both\"." ++msgstr "" ++ ++msgid "" ++"Which kind of uplink is exported to the other mesh nodes. An uplink is " ++"detected by looking for a local HNA6 ::ffff:0:0/96 or 2000::/3. Default " ++"setting is \"both\"." ++msgstr "" ++ ++msgid "Willingness" ++msgstr "" ++ ++msgid "Yellow" ++msgstr "" ++ ++msgid "no" ++msgstr "" ++ ++msgid "yes" ++msgstr "" ++ ++#~ msgid "Device" ++#~ msgstr "設備" +diff --git a/feeds/luci/applications/luci-app-olsr/root/etc/config/luci_olsr b/feeds/luci/applications/luci-app-olsr/root/etc/config/luci_olsr +new file mode 100644 +index 0000000..2dd4ffa +--- /dev/null ++++ b/feeds/luci/applications/luci-app-olsr/root/etc/config/luci_olsr +@@ -0,0 +1,2 @@ ++config 'olsr' 'general' ++ option 'resolve' '1' +diff --git a/feeds/luci/applications/luci-app-olsr/root/etc/uci-defaults/luci-olsr b/feeds/luci/applications/luci-app-olsr/root/etc/uci-defaults/luci-olsr +new file mode 100755 +index 0000000..63c01e4 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-olsr/root/etc/uci-defaults/luci-olsr +@@ -0,0 +1,14 @@ ++#!/bin/sh ++ ++uci -q batch <<-EOF >/dev/null ++ delete ucitrack.@olsrd[-1] ++ add ucitrack olsrd ++ set ucitrack.@olsrd[-1].init=olsrd ++ delete ucitrack.@olsrd6[-1] ++ add ucitrack olsrd6 ++ set ucitrack.@olsrd6[-1].init=olsrd6 ++ commit ucitrack ++EOF ++ ++rm -f /tmp/luci-indexcache ++exit 0 +diff --git a/feeds/luci/applications/luci-app-openvpn/Makefile b/feeds/luci/applications/luci-app-openvpn/Makefile +new file mode 100644 +index 0000000..a8070fd +--- /dev/null ++++ b/feeds/luci/applications/luci-app-openvpn/Makefile +@@ -0,0 +1,14 @@ ++# ++# Copyright (C) 2008-2014 The LuCI Team ++# ++# This is free software, licensed under the Apache License, Version 2.0 . ++# ++ ++include $(TOPDIR)/rules.mk ++ ++LUCI_TITLE:=LuCI Support for OpenVPN ++LUCI_DEPENDS:= ++ ++include ../../luci.mk ++ ++# call BuildPackage - OpenWrt buildroot signature +diff --git a/feeds/luci/applications/luci-app-openvpn/luasrc/controller/openvpn.lua b/feeds/luci/applications/luci-app-openvpn/luasrc/controller/openvpn.lua +new file mode 100644 +index 0000000..2e48a46 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-openvpn/luasrc/controller/openvpn.lua +@@ -0,0 +1,11 @@ ++-- Copyright 2008 Steven Barth ++-- Copyright 2008 Jo-Philipp Wich ++-- Licensed to the public under the Apache License 2.0. ++ ++module("luci.controller.openvpn", package.seeall) ++ ++function index() ++ entry( {"admin", "services", "openvpn"}, cbi("openvpn"), _("OpenVPN") ) ++ entry( {"admin", "services", "openvpn", "basic"}, cbi("openvpn-basic"), nil ).leaf = true ++ entry( {"admin", "services", "openvpn", "advanced"}, cbi("openvpn-advanced"), nil ).leaf = true ++end +diff --git a/feeds/luci/applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua b/feeds/luci/applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua +new file mode 100644 +index 0000000..fa15300 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-openvpn/luasrc/model/cbi/openvpn-advanced.lua +@@ -0,0 +1,262 @@ ++-- Copyright 2008 Steven Barth ++-- Licensed to the public under the Apache License 2.0. ++ ++require("luci.ip") ++require("luci.model.uci") ++ ++ ++local knownParams = { ++ -- ++ -- Widget Name Default(s) Description Option(s) ++ -- ++ ++ { "Service", { ++ -- initialisation and daemon options ++ { ListValue, "verb", { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11 }, translate("Set output verbosity") }, ++ { Flag, "mlock", 0, translate("Disable Paging") }, ++ { Flag, "disable_occ", 0, translate("Disable options consistency check") }, ++ -- { Value, "user", "root", translate("Set UID to user") }, ++ -- { Value, "group", "root", translate("Set GID to group") }, ++ { Value, "cd", "/etc/openvpn", translate("Change to directory before initialization") }, ++ { Value, "chroot", "/var/run", translate("Chroot to directory after initialization") }, ++ -- { Value, "daemon", "Instance-Name", translate("Daemonize after initialization") }, ++ -- { Value, "syslog", "Instance-Name", translate("Output to syslog and do not daemonize") }, ++ { Flag, "passtos", 0, translate("TOS passthrough (applies to IPv4 only)") }, ++ -- { Value, "inetd", "nowait Instance-Name", translate("Run as an inetd or xinetd server") }, ++ { Value, "log", "/var/log/openvpn.log", translate("Write log to file") }, ++ { Value, "log_append", "/var/log/openvpn.log", translate("Append log to file") }, ++ { Flag, "suppress_timestamps", 0, translate("Don't log timestamps") }, ++ -- { Value, "writepid", "/var/run/openvpn.pid", translate("Write process ID to file") }, ++ { Value, "nice", 0, translate("Change process priority") }, ++ { Flag, "fast_io", 0, translate("Optimize TUN/TAP/UDP writes") }, ++ { Value, "echo", "some params echoed to log", translate("Echo parameters to log") }, ++ { ListValue, "remap_usr1", { "SIGHUP", "SIGTERM" }, translate("Remap SIGUSR1 signals") }, ++ { Value, "status", "/var/run/openvpn.status 5", translate("Write status to file every n seconds") }, ++ { Value, "status_version", { 1, 2 }, translate("Status file format version") }, -- status ++ { Value, "mute", 5, translate("Limit repeated log messages") }, ++ ++ { Value, "up", "/usr/bin/ovpn-up", translate("Shell cmd to execute after tun device open") }, ++ { Value, "up_delay", 5, translate("Delay tun/tap open and up script execution") }, ++ { Value, "down", "/usr/bin/ovpn-down", translate("Shell cmd to run after tun device close") }, ++ { Flag, "down_pre", 0, translate("Call down cmd/script before TUN/TAP close") }, ++ { Flag, "up_restart", 0, translate("Run up/down scripts for all restarts") }, ++ { Value, "route_up", "/usr/bin/ovpn-routeup", translate("Execute shell cmd after routes are added") }, ++ { Value, "ipchange", "/usr/bin/ovpn-ipchange", translate("Execute shell command on remote ip change"), { mode="p2p" } }, ++ { DynamicList, "setenv", { "VAR1 value1", "VAR2 value2" }, translate("Pass environment variables to script") }, ++ { Value, "tls_verify", "/usr/bin/ovpn-tlsverify", translate("Shell command to verify X509 name") }, ++ { Value, "client_connect", "/usr/bin/ovpn-clientconnect", translate("Run script cmd on client connection") }, ++ { Flag, "client_disconnect", 0, translate("Run script cmd on client disconnection") }, ++ { Value, "learn_address", "/usr/bin/ovpn-learnaddress", translate("Executed in server mode whenever an IPv4 address/route or MAC address is added to OpenVPN's internal routing table") }, ++ { Value, "auth_user_pass_verify", "/usr/bin/ovpn-userpass via-env", translate("Executed in server mode on new client connections, when the client is still untrusted") }, ++ { ListValue, "script_security", { 0, 1, 2, 3 }, translate("Policy level over usage of external programs and scripts") }, ++ } }, ++ ++ { "Networking", { ++ -- socket config ++ { ListValue, "mode", { "p2p", "server" }, translate("Major mode") }, ++ { Value, "local", "0.0.0.0", translate("Local host name or ip address") }, ++ { Value, "port", 1194, translate("TCP/UDP port # for both local and remote") }, ++ { Value, "lport", 1194, translate("TCP/UDP port # for local (default=1194)") }, ++ { Value, "rport", 1194, translate("TCP/UDP port # for remote (default=1194)") }, ++ { Flag, "float", 0, translate("Allow remote to change its IP or port") }, ++ { Flag, "nobind", 0, translate("Do not bind to local address and port") }, ++ ++ { Value, "dev", "tun0", translate("tun/tap device") }, ++ { ListValue, "dev_type", { "tun", "tap" }, translate("Type of used device") }, ++ { Value, "dev_node", "/dev/net/tun", translate("Use tun/tap device node") }, ++ { Flag, "tun_ipv6", 0, translate("Make tun device IPv6 capable") }, ++ ++ { Value, "ifconfig", "10.200.200.3 10.200.200.1", translate("Set tun/tap adapter parameters") }, ++ { Flag, "ifconfig_noexec", 0, translate("Don't actually execute ifconfig") }, ++ { Flag, "ifconfig_nowarn", 0, translate("Don't warn on ifconfig inconsistencies") }, ++ ++ { DynamicList, "route", "10.123.0.0 255.255.0.0", translate("Add route after establishing connection") }, ++ { Value, "route_gateway", "10.234.1.1", translate("Specify a default gateway for routes") }, ++ { Value, "route_delay", 0, translate("Delay n seconds after connection") }, ++ { Flag, "route_noexec", 0, translate("Don't add routes automatically") }, ++ ++ { ListValue, "mtu_disc", { "yes", "maybe", "no" }, translate("Enable Path MTU discovery") }, ++ { Flag, "mtu_test", 0, translate("Empirically measure MTU") }, ++ { ListValue, "comp_lzo", { "yes", "no", "adaptive" }, translate("Use fast LZO compression") }, ++ { Flag, "comp_noadapt", 0, translate("Don't use adaptive lzo compression"), { comp_lzo=1 } }, ++ { Value, "link_mtu", 1500, translate("Set TCP/UDP MTU") }, ++ { Value, "tun_mtu", 1500, translate("Set tun/tap device MTU") }, ++ { Value, "tun_mtu_extra", 1500, translate("Set tun/tap device overhead") }, ++ { Value, "fragment", 1500, translate("Enable internal datagram fragmentation"), { proto="udp" } }, ++ { Value, "mssfix", 1500, translate("Set upper bound on TCP MSS"), { proto="udp" } }, ++ { Value, "sndbuf", 65536, translate("Set the TCP/UDP send buffer size") }, ++ { Value, "rcvbuf", 65536, translate("Set the TCP/UDP receive buffer size") }, ++ { Value, "txqueuelen", 100, translate("Set tun/tap TX queue length") }, ++ { Value, "shaper", 10240, translate("Shaping for peer bandwidth") }, ++ ++ { Value, "inactive", 240, translate("tun/tap inactivity timeout") }, ++ { Value, "keepalive", "10 60", translate("Helper directive to simplify the expression of --ping and --ping-restart in server mode configurations") }, ++ { Value, "ping", 30, translate("Ping remote every n seconds over TCP/UDP port") }, ++ { Value, "ping_exit", 120, translate("Remote ping timeout") }, ++ { Value, "ping_restart", 60, translate("Restart after remote ping timeout") }, ++ { Flag, "ping_timer_rem", 0, translate("Only process ping timeouts if routes exist") }, ++ ++ { Flag, "persist_tun", 0, translate("Keep tun/tap device open on restart") }, ++ { Flag, "persist_key", 0, translate("Don't re-read key on restart") }, ++ { Flag, "persist_local_ip", 0, translate("Keep local IP address on restart") }, ++ { Flag, "persist_remote_ip", 0, translate("Keep remote IP address on restart") }, ++ ++ -- management channel ++ { Value, "management", "127.0.0.1 31194 /etc/openvpn/mngmt-pwds", translate("Enable management interface on IP port") }, ++ { Flag, "management_query_passwords", 0, translate("Query management channel for private key") }, -- management ++ { Flag, "management_hold", 0, translate("Start OpenVPN in a hibernating state") }, -- management ++ { Value, "management_log_cache", 100, translate("Number of lines for log file history") }, -- management ++ { ListValue, "topology", { "net30", "p2p", "subnet" }, translate("'net30', 'p2p', or 'subnet'"), {dev_type="tun" } }, ++ } }, ++ ++ { "VPN", { ++ { Value, "server", "10.200.200.0 255.255.255.0", translate("Configure server mode"), { server_mode="1" } }, ++ { Value, "server_bridge", "10.200.200.1 255.255.255.0 10.200.200.200 10.200.200.250", translate("Configure server bridge"), { server_mode="1" } }, ++ { DynamicList, "push", { "redirect-gateway", "comp-lzo" }, translate("Push options to peer"), { server_mode="1" } }, ++ { Flag, "push_reset", 0, translate("Don't inherit global push options"), { server_mode="1" } }, ++ { Flag, "disable", 0, translate("Client is disabled"), { server_mode="1" } }, ++ { Value, "ifconfig_pool", "10.200.200.100 10.200.200.150 255.255.255.0", translate("Set aside a pool of subnets"), { server_mode="1" } }, ++ { Value, "ifconfig_pool_persist", "/etc/openvpn/ipp.txt 600", translate("Persist/unpersist ifconfig-pool"), { server_mode="1" } }, ++-- { Flag, "ifconfig_pool_linear", 0, translate("Use individual addresses rather than /30 subnets"), { server_mode="1" } }, -- deprecated and replaced by --topology p2p ++ { Value, "ifconfig_push", "10.200.200.1 255.255.255.255", translate("Push an ifconfig option to remote"), { server_mode="1" } }, ++ { Value, "iroute", "10.200.200.0 255.255.255.0", translate("Route subnet to client"), { server_mode="1" } }, ++ { Flag, "client_to_client", 0, translate("Allow client-to-client traffic"), { server_mode="1" } }, ++ { Flag, "duplicate_cn", 0, translate("Allow multiple clients with same certificate"), { server_mode="1" } }, ++ { Value, "client_config_dir", "/etc/openvpn/ccd", translate("Directory for custom client config files"), { server_mode="1" } }, ++ { Flag, "ccd_exclusive", 0, translate("Refuse connection if no custom client config"), { server_mode="1" } }, ++ { Value, "tmp_dir", "/var/run/openvpn", translate("Temporary directory for client-connect return file"), { server_mode="1" } }, ++ { Value, "hash_size", "256 256", translate("Set size of real and virtual address hash tables"), { server_mode="1" } }, ++ { Value, "bcast_buffers", 256, translate("Number of allocated broadcast buffers"), { server_mode="1" } }, ++ { Value, "tcp_queue_limit", 64, translate("Maximum number of queued TCP output packets"), { server_mode="1" } }, ++ { Value, "max_clients", 10, translate("Allowed maximum of connected clients"), { server_mode="1" } }, ++ { Value, "max_routes_per_client", 256, translate("Allowed maximum of internal"), { server_mode="1" } }, ++ { Value, "connect_freq", "3 10", translate("Allowed maximum of new connections"), { server_mode="1" } }, ++ { Flag, "client_cert_not_required", 0, translate("Don't require client certificate"), { server_mode="1" } }, ++ { Flag, "username_as_common_name", 0, translate("Use username as common name"), { server_mode="1" } }, ++ { Flag, "client", 0, translate("Configure client mode"), { server_mode="0" }, { server_mode="" } }, ++ { Flag, "pull", 0, translate("Accept options pushed from server"), { client="1" } }, ++ { Value, "auth_user_pass", "/etc/openvpn/userpass.txt", translate("Authenticate using username/password"), { client="1" } }, ++ { ListValue, "auth_retry", { "none", "nointeract", "interact" }, translate("Handling of authentication failures"), { client="1" } }, ++ { Value, "explicit_exit_notify", 1, translate("Send notification to peer on disconnect"), { client="1" } }, ++ { DynamicList, "remote", "1.2.3.4", translate("Remote host name or ip address"), { client="1" } }, ++ { Flag, "remote_random", 1, translate("Randomly choose remote server"), { client="1" } }, ++ { ListValue, "proto", { "udp", "tcp-client", "tcp-server" }, translate("Use protocol"), { client="1" } }, ++ { Value, "connect_retry", 5, translate("Connection retry interval"), { proto="tcp-client" }, { client="1" } }, ++ { Value, "http_proxy", "192.168.1.100 8080", translate("Connect to remote host through an HTTP proxy"), { client="1" } }, ++ { Flag, "http_proxy_retry", 0, translate("Retry indefinitely on HTTP proxy errors"), { client="1" } }, ++ { Value, "http_proxy_timeout", 5, translate("Proxy timeout in seconds"), { client="1" } }, ++ { DynamicList, "http_proxy_option", { "VERSION 1.0", "AGENT OpenVPN/2.0.9" }, translate("Set extended HTTP proxy options"), { client="1" } }, ++ { Value, "socks_proxy", "192.168.1.200 1080", translate("Connect through Socks5 proxy"), { client="1" } }, ++ { Value, "socks_proxy_retry", 5, translate("Retry indefinitely on Socks proxy errors"), { client="1" } }, -- client && socks_proxy ++ { Value, "resolv_retry", "infinite", translate("If hostname resolve fails, retry"), { client="1" } }, ++ { ListValue, "redirect_gateway", { "", "local", "def1", "local def1" }, translate("Automatically redirect default route"), { client="1" } }, ++ } }, ++ ++ { "Cryptography", { ++ { Value, "secret", "/etc/openvpn/secret.key 1", translate("Enable Static Key encryption mode (non-TLS)") }, ++ { Value, "auth", "SHA1", translate("HMAC authentication for packets") }, -- parse ++ { Value, "cipher", "BF-CBC", translate("Encryption cipher for packets") }, -- parse ++ { Value, "keysize", 1024, translate("Size of cipher key") }, -- parse ++ { Value, "engine", "dynamic", translate("Enable OpenSSL hardware crypto engines") }, -- parse ++ { Flag, "no_replay", 0, translate("Disable replay protection") }, ++ { Value, "replay_window", "64 15", translate("Replay protection sliding window size") }, ++ { Flag, "mute_replay_warnings", 0, translate("Silence the output of replay warnings") }, ++ { Value, "replay_persist", "/var/run/openvpn-replay-state", translate("Persist replay-protection state") }, ++ { Flag, "no_iv", 0, translate("Disable cipher initialisation vector") }, ++ { Flag, "tls_server", 0, translate("Enable TLS and assume server role"), { tls_client="" }, { tls_client="0" } }, ++ { Flag, "tls_client", 0, translate("Enable TLS and assume client role"), { tls_server="" }, { tls_server="0" } }, ++ { FileUpload, "ca", "/etc/easy-rsa/keys/ca.crt", translate("Certificate authority") }, ++ { FileUpload, "dh", "/etc/easy-rsa/keys/dh1024.pem", translate("Diffie Hellman parameters") }, ++ { FileUpload, "cert", "/etc/easy-rsa/keys/some-client.crt", translate("Local certificate") }, ++ { FileUpload, "key", "/etc/easy-rsa/keys/some-client.key", translate("Local private key") }, ++ { FileUpload, "pkcs12", "/etc/easy-rsa/keys/some-client.pk12", translate("PKCS#12 file containing keys") }, ++ { ListValue, "key_method", { 1, 2 }, translate("Enable TLS and assume client role") }, ++ { Value, "tls_cipher", "DHE-RSA-AES256-SHA:DHE-DSS-AES256-SHA:AES256-SHA:EDH-RSA-DES-CBC3-SHA:EDH-DSS-DES-CBC3-SHA:DES-CBC3-SHA:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA:AES128-SHA:RC4-SHA:RC4-MD5:EDH-RSA-DES-CBC-SHA:EDH-DSS-DES-CBC-SHA:DES-CBC-SHA:EXP-EDH-RSA-DES-CBC-SHA:EXP-EDH-DSS-DES-CBC-SHA:EXP-DES-CBC-SHA:EXP-RC2-CBC-MD5:EXP-RC4-MD5", ++ translate("TLS cipher") }, ++ { Value, "tls_timeout", 2, translate("Retransmit timeout on TLS control channel") }, ++ { Value, "reneg_bytes", 1024, translate("Renegotiate data chan. key after bytes") }, ++ { Value, "reneg_pkts", 100, translate("Renegotiate data chan. key after packets") }, ++ { Value, "reneg_sec", 3600, translate("Renegotiate data chan. key after seconds") }, ++ { Value, "hand_window", 60, translate("Timeframe for key exchange") }, ++ { Value, "tran_window", 3600, translate("Key transition window") }, ++ { Flag, "single_session", 0, translate("Allow only one session") }, ++ { Flag, "tls_exit", 0, translate("Exit on TLS negotiation failure") }, ++ { Value, "tls_auth", "/etc/openvpn/tlsauth.key 1", translate("Additional authentication over TLS") }, ++ --{ Value, "askpass", "[file]", translate("Get PEM password from controlling tty before we daemonize") }, ++ { Flag, "auth_nocache", 0, translate("Don't cache --askpass or --auth-user-pass passwords") }, ++ { Value, "tls_remote", "remote_x509_name", translate("Only accept connections from given X509 name") }, ++ { ListValue, "ns_cert_type", { "client", "server" }, translate("Require explicit designation on certificate") }, ++ { ListValue, "remote_cert_tls", { "client", "server" }, translate("Require explicit key usage on certificate") }, ++ { Value, "crl_verify", "/etc/easy-rsa/keys/crl.pem", translate("Check peer certificate against a CRL") }, ++ } } ++} ++ ++ ++local cts = { } ++local params = { } ++ ++local m = Map("openvpn") ++local p = m:section( SimpleSection ) ++ ++p.template = "openvpn/pageswitch" ++p.mode = "advanced" ++p.instance = arg[1] ++p.category = arg[2] or "Service" ++ ++for _, c in ipairs(knownParams) do ++ cts[#cts+1] = c[1] ++ if c[1] == p.category then params = c[2] end ++end ++ ++p.categories = cts ++ ++ ++local s = m:section( ++ NamedSection, arg[1], "openvpn", ++ translate("%s" % arg[2]) ++) ++ ++s.title = translate("%s" % arg[2]) ++s.addremove = false ++s.anonymous = true ++ ++ ++for _, option in ipairs(params) do ++ local o = s:option( ++ option[1], option[2], ++ option[2], option[4] ++ ) ++ ++ if option[1] == DummyValue then ++ o.value = option[3] ++ else ++ if option[1] == DynamicList then ++ o.cast = nil ++ function o.cfgvalue(...) ++ local val = AbstractValue.cfgvalue(...) ++ return ( val and type(val) ~= "table" ) and { val } or val ++ end ++ end ++ ++ o.optional = true ++ ++ if type(option[3]) == "table" then ++ if o.optional then o:value("", "-- remove --") end ++ for _, v in ipairs(option[3]) do ++ v = tostring(v) ++ o:value(v) ++ end ++ o.default = tostring(option[3][1]) ++ else ++ o.default = tostring(option[3]) ++ end ++ end ++ ++ for i=5,#option do ++ if type(option[i]) == "table" then ++ o:depends(option[i]) ++ end ++ end ++end ++ ++return m +diff --git a/feeds/luci/applications/luci-app-openvpn/luasrc/model/cbi/openvpn-basic.lua b/feeds/luci/applications/luci-app-openvpn/luasrc/model/cbi/openvpn-basic.lua +new file mode 100644 +index 0000000..561b0dd +--- /dev/null ++++ b/feeds/luci/applications/luci-app-openvpn/luasrc/model/cbi/openvpn-basic.lua +@@ -0,0 +1,91 @@ ++-- Copyright 2008 Steven Barth ++-- Licensed to the public under the Apache License 2.0. ++ ++require("luci.ip") ++require("luci.model.uci") ++ ++ ++local basicParams = { ++ -- ++ -- Widget, Name, Default(s), Description ++ -- ++ ++ { ListValue, "verb", { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11 }, translate("Set output verbosity") }, ++ { Value, "nice",0, translate("Change process priority") }, ++ { Value,"port",1194, translate("TCP/UDP port # for both local and remote") }, ++ { ListValue,"dev_type",{ "tun", "tap" }, translate("Type of used device") }, ++ { Flag,"tun_ipv6",0, translate("Make tun device IPv6 capable") }, ++ ++ { Value,"ifconfig","10.200.200.3 10.200.200.1", translate("Set tun/tap adapter parameters") }, ++ { Value,"server","10.200.200.0 255.255.255.0", translate("Configure server mode") }, ++ { Value,"server_bridge","192.168.1.1 255.255.255.0 192.168.1.128 192.168.1.254", translate("Configure server bridge") }, ++ { Flag,"nobind",0, translate("Do not bind to local address and port") }, ++ ++ { ListValue,"comp_lzo",{"yes","no","adaptive"}, translate("Use fast LZO compression") }, ++ { Value,"keepalive","10 60", translate("Helper directive to simplify the expression of --ping and --ping-restart in server mode configurations") }, ++ ++ { ListValue,"proto",{ "udp", "tcp" }, translate("Use protocol") }, ++ ++ { Flag,"client",0, translate("Configure client mode") }, ++ { Flag,"client_to_client",0, translate("Allow client-to-client traffic") }, ++ { DynamicList,"remote","vpnserver.example.org", translate("Remote host name or ip address") }, ++ ++ { FileUpload,"secret","/etc/openvpn/secret.key 1", translate("Enable Static Key encryption mode (non-TLS)") }, ++ { FileUpload,"pkcs12","/etc/easy-rsa/keys/some-client.pk12", translate("PKCS#12 file containing keys") }, ++ { FileUpload,"ca","/etc/easy-rsa/keys/ca.crt", translate("Certificate authority") }, ++ { FileUpload,"dh","/etc/easy-rsa/keys/dh1024.pem", translate("Diffie Hellman parameters") }, ++ { FileUpload,"cert","/etc/easy-rsa/keys/some-client.crt", translate("Local certificate") }, ++ { FileUpload,"key","/etc/easy-rsa/keys/some-client.key", translate("Local private key") }, ++} ++ ++ ++local m = Map("openvpn") ++local p = m:section( SimpleSection ) ++ ++p.template = "openvpn/pageswitch" ++p.mode = "basic" ++p.instance = arg[1] ++ ++ ++local s = m:section( NamedSection, arg[1], "openvpn" ) ++ ++for _, option in ipairs(basicParams) do ++ local o = s:option( ++ option[1], option[2], ++ option[2], option[4] ++ ) ++ ++ o.optional = true ++ ++ if option[1] == DummyValue then ++ o.value = option[3] ++ else ++ if option[1] == DynamicList then ++ o.cast = nil ++ function o.cfgvalue(...) ++ local val = AbstractValue.cfgvalue(...) ++ return ( val and type(val) ~= "table" ) and { val } or val ++ end ++ end ++ ++ if type(option[3]) == "table" then ++ if o.optional then o:value("", "-- remove --") end ++ for _, v in ipairs(option[3]) do ++ v = tostring(v) ++ o:value(v) ++ end ++ o.default = tostring(option[3][1]) ++ else ++ o.default = tostring(option[3]) ++ end ++ end ++ ++ for i=5,#option do ++ if type(option[i]) == "table" then ++ o:depends(option[i]) ++ end ++ end ++end ++ ++return m ++ +diff --git a/feeds/luci/applications/luci-app-openvpn/luasrc/model/cbi/openvpn.lua b/feeds/luci/applications/luci-app-openvpn/luasrc/model/cbi/openvpn.lua +new file mode 100644 +index 0000000..8b2ce5a +--- /dev/null ++++ b/feeds/luci/applications/luci-app-openvpn/luasrc/model/cbi/openvpn.lua +@@ -0,0 +1,119 @@ ++-- Copyright 2008 Steven Barth ++-- Licensed to the public under the Apache License 2.0. ++ ++local fs = require "nixio.fs" ++local sys = require "luci.sys" ++local uci = require "luci.model.uci".cursor() ++local testfullps = luci.sys.exec("ps --help 2>&1 | grep BusyBox") --check which ps do we have ++local psstring = (string.len(testfullps)>0) and "ps w" or "ps axfw" --set command we use to get pid ++ ++local m = Map("openvpn", translate("OpenVPN")) ++local s = m:section( TypedSection, "openvpn", translate("OpenVPN instances"), translate("Below is a list of configured OpenVPN instances and their current state") ) ++s.template = "cbi/tblsection" ++s.template_addremove = "openvpn/cbi-select-input-add" ++s.addremove = true ++s.add_select_options = { } ++s.extedit = luci.dispatcher.build_url( ++ "admin", "services", "openvpn", "basic", "%s" ++) ++ ++uci:load("openvpn_recipes") ++uci:foreach( "openvpn_recipes", "openvpn_recipe", ++ function(section) ++ s.add_select_options[section['.name']] = ++ section['_description'] or section['.name'] ++ end ++) ++ ++function s.parse(self, section) ++ local recipe = luci.http.formvalue( ++ luci.cbi.CREATE_PREFIX .. self.config .. "." .. ++ self.sectiontype .. ".select" ++ ) ++ ++ if recipe and not s.add_select_options[recipe] then ++ self.invalid_cts = true ++ else ++ TypedSection.parse( self, section ) ++ end ++end ++ ++function s.create(self, name) ++ local recipe = luci.http.formvalue( ++ luci.cbi.CREATE_PREFIX .. self.config .. "." .. ++ self.sectiontype .. ".select" ++ ) ++ name = luci.http.formvalue( ++ luci.cbi.CREATE_PREFIX .. self.config .. "." .. ++ self.sectiontype .. ".text" ++ ) ++ if string.len(name)>3 and not name:match("[^a-zA-Z0-9_]") then ++ uci:section( ++ "openvpn", "openvpn", name, ++ uci:get_all( "openvpn_recipes", recipe ) ++ ) ++ ++ uci:delete("openvpn", name, "_role") ++ uci:delete("openvpn", name, "_description") ++ uci:save("openvpn") ++ ++ luci.http.redirect( self.extedit:format(name) ) ++ else ++ self.invalid_cts = true ++ end ++end ++ ++ ++s:option( Flag, "enabled", translate("Enabled") ) ++ ++local active = s:option( DummyValue, "_active", translate("Started") ) ++function active.cfgvalue(self, section) ++ local pid = sys.exec("%s | grep %s | grep openvpn | grep -v grep | awk '{print $1}'" % { psstring,section} ) ++ if pid and #pid > 0 and tonumber(pid) ~= nil then ++ return (sys.process.signal(pid, 0)) ++ and translatef("yes (%i)", pid) ++ or translate("no") ++ end ++ return translate("no") ++end ++ ++local updown = s:option( Button, "_updown", translate("Start/Stop") ) ++updown._state = false ++updown.redirect = luci.dispatcher.build_url( ++ "admin", "services", "openvpn" ++) ++function updown.cbid(self, section) ++ local pid = sys.exec("%s | grep %s | grep openvpn | grep -v grep | awk '{print $1}'" % { psstring,section} ) ++ self._state = pid and #pid > 0 and sys.process.signal(pid, 0) ++ self.option = self._state and "stop" or "start" ++ return AbstractValue.cbid(self, section) ++end ++function updown.cfgvalue(self, section) ++ self.title = self._state and "stop" or "start" ++ self.inputstyle = self._state and "reset" or "reload" ++end ++function updown.write(self, section, value) ++ if self.option == "stop" then ++ local pid = sys.exec("%s | grep %s | grep openvpn | grep -v grep | awk '{print $1}'" % { psstring,section} ) ++ sys.process.signal(pid,15) ++ else ++ luci.sys.call("/etc/init.d/openvpn start %s" % section) ++ end ++ luci.http.redirect( self.redirect ) ++end ++ ++ ++local port = s:option( DummyValue, "port", translate("Port") ) ++function port.cfgvalue(self, section) ++ local val = AbstractValue.cfgvalue(self, section) ++ return val or "1194" ++end ++ ++local proto = s:option( DummyValue, "proto", translate("Protocol") ) ++function proto.cfgvalue(self, section) ++ local val = AbstractValue.cfgvalue(self, section) ++ return val or "udp" ++end ++ ++ ++return m +diff --git a/feeds/luci/applications/luci-app-openvpn/luasrc/view/openvpn/cbi-select-input-add.htm b/feeds/luci/applications/luci-app-openvpn/luasrc/view/openvpn/cbi-select-input-add.htm +new file mode 100644 +index 0000000..0166de7 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-openvpn/luasrc/view/openvpn/cbi-select-input-add.htm +@@ -0,0 +1,11 @@ ++
    ++ <% if self.invalid_cts then -%>
    <% end %> ++ ++ ++ ++ <% if self.invalid_cts then %>
    <%:Invalid%>
    <% end %> ++
    +diff --git a/feeds/luci/applications/luci-app-openvpn/luasrc/view/openvpn/pageswitch.htm b/feeds/luci/applications/luci-app-openvpn/luasrc/view/openvpn/pageswitch.htm +new file mode 100644 +index 0000000..ac5c893 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-openvpn/luasrc/view/openvpn/pageswitch.htm +@@ -0,0 +1,30 @@ ++<%# ++ Copyright 2008 Steven Barth ++ Copyright 2008 Jo-Philipp Wich ++ Licensed to the public under the Apache License 2.0. ++-%> ++ ++
    ++ ++ "><%:Overview%> » ++ <%=luci.i18n.translatef("Instance \"%s\"", self.instance)%> ++ ++ ++ <% if self.mode == "basic" then %> ++ "><%:Switch to advanced configuration »%> ++ <% else %> ++ "><%:« Switch to basic configuration%> ++
    ++ <%:Configuration category%>: ++ <% for i, c in ipairs(self.categories) do %> ++ <% if c == self.category then %> ++ <%=translate(c)%> ++ <% else %> ++ "><%=translate(c)%> ++ <% end %> ++ <% if next(self.categories, i) then %>|<% end %> ++ <% end %> ++ <% end %> ++
    +diff --git a/feeds/luci/applications/luci-app-openvpn/po/ca/openvpn.po b/feeds/luci/applications/luci-app-openvpn/po/ca/openvpn.po +new file mode 100644 +index 0000000..67de6b2 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-openvpn/po/ca/openvpn.po +@@ -0,0 +1,546 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Report-Msgid-Bugs-To: \n" ++"POT-Creation-Date: 2009-06-10 03:40+0200\n" ++"PO-Revision-Date: 2014-08-07 20:41+0200\n" ++"Last-Translator: Alex \n" ++"Language-Team: LANGUAGE \n" ++"Language: ca\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n != 1);\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "%s" ++msgstr "%s" ++ ++msgid "'net30', 'p2p', or 'subnet'" ++msgstr "'net30', 'p2p', o 'subnet'" ++ ++msgid "Accept options pushed from server" ++msgstr "Accepta opcions rebudes del servidor" ++ ++msgid "Add" ++msgstr "Afegeix" ++ ++msgid "Add route after establishing connection" ++msgstr "Afegeix ruta després d'establir connexió" ++ ++msgid "Additional authentication over TLS" ++msgstr "Autenticació addicional sobre TLS" ++ ++msgid "Allow client-to-client traffic" ++msgstr "Permet tràfic client a client" ++ ++msgid "Allow multiple clients with same certificate" ++msgstr "Permet múltiples clients amb el mateix certificat" ++ ++msgid "Allow only one session" ++msgstr "Permet només una sessió" ++ ++msgid "Allow remote to change its IP or port" ++msgstr "Permet al remot canviar la seva IP o port" ++ ++msgid "Allowed maximum of connected clients" ++msgstr "Màxim de clients connectats pemès" ++ ++msgid "Allowed maximum of internal" ++msgstr "Màxim permès d'interns" ++ ++msgid "Allowed maximum of new connections" ++msgstr "Màxim de noves connexions permesès" ++ ++msgid "Append log to file" ++msgstr "Afegeix el registre al fitxer" ++ ++msgid "Authenticate using username/password" ++msgstr "Autentica utilitzant nom d'usuari/contrasenya" ++ ++msgid "Automatically redirect default route" ++msgstr "Readreça automàticament la ruta per defecte" ++ ++msgid "Below is a list of configured OpenVPN instances and their current state" ++msgstr "" ++"A sota hi ha una llista d'instàncies OpenVPN configurades i el seu estat " ++"actual" ++ ++msgid "Call down cmd/script before TUN/TAP close" ++msgstr "" ++"Crida l'script/comanda de desactivació abans de tancar el dispositiu TUN/TAP" ++ ++msgid "Certificate authority" ++msgstr "Autoritat de certificat" ++ ++msgid "Change process priority" ++msgstr "Canvia la prioritat del procés" ++ ++msgid "Change to directory before initialization" ++msgstr "Canvia el directori abans de la inicialització" ++ ++msgid "Check peer certificate against a CRL" ++msgstr "Comprova el certificat de peer contra un CRL" ++ ++msgid "Chroot to directory after initialization" ++msgstr "Chroot al directori després de la inicialització" ++ ++msgid "Client is disabled" ++msgstr "El client està inhabilitat" ++ ++msgid "Configuration category" ++msgstr "Categoria de configuració" ++ ++msgid "Configure client mode" ++msgstr "Configura el mode client" ++ ++msgid "Configure server bridge" ++msgstr "Configura el pont de servidor" ++ ++msgid "Configure server mode" ++msgstr "Configura el mode servidor" ++ ++msgid "Connect through Socks5 proxy" ++msgstr "Connecta't a través un proxy Socks5" ++ ++msgid "Connect to remote host through an HTTP proxy" ++msgstr "Connecta al host remot a través d'un intermediari HTTP" ++ ++msgid "Connection retry interval" ++msgstr "Interval de reintent de connexió" ++ ++msgid "Daemonize after initialization" ++msgstr "Dimonitza després d'inicialitzar" ++ ++msgid "Delay n seconds after connection" ++msgstr "" ++ ++msgid "Delay tun/tap open and up script execution" ++msgstr "Retarda l'obertura tun/tap i l'execució d'script d'activació" ++ ++msgid "Diffie Hellman parameters" ++msgstr "Paràmetres Diffie-Hellman" ++ ++msgid "Directory for custom client config files" ++msgstr "Directori per fitxers de configuració de client personalitzats" ++ ++msgid "Disable Paging" ++msgstr "Desactiva Paging" ++ ++msgid "Disable cipher initialisation vector" ++msgstr "Desactiva xifratge de vector d'inicialització" ++ ++msgid "Disable options consistency check" ++msgstr "Desactiva la comprovació de consistència d'opcions" ++ ++msgid "Disable replay protection" ++msgstr "Desactiva la protecció de reproducció" ++ ++msgid "Do not bind to local address and port" ++msgstr "No vinculis a adreça i port locals" ++ ++msgid "Don't actually execute ifconfig" ++msgstr "No executis ifconfig" ++ ++msgid "Don't add routes automatically" ++msgstr "No afegeixis rutes automàticament" ++ ++msgid "Don't cache --askpass or --auth-user-pass passwords" ++msgstr "No desis a la memòria cau contrasenyes --askpass o --auth-user-pass" ++ ++msgid "Don't inherit global push options" ++msgstr "No heretis les opcions globals enviades pel servidor" ++ ++msgid "Don't log timestamps" ++msgstr "No registris les marques horàries" ++ ++msgid "Don't re-read key on restart" ++msgstr "No rellegeixis la clau al reiniciar" ++ ++msgid "Don't require client certificate" ++msgstr "No requereixis el certificat de client" ++ ++msgid "Don't use adaptive lzo compression" ++msgstr "No utilitzis compressió adaptativa LZO" ++ ++msgid "Don't warn on ifconfig inconsistencies" ++msgstr "No alertis d'inconsistències ifconfig" ++ ++msgid "Echo parameters to log" ++msgstr "Escriu els paràmetres al registre" ++ ++msgid "Empirically measure MTU" ++msgstr "Mesura empíricament l'MTU" ++ ++msgid "Enable OpenSSL hardware crypto engines" ++msgstr "Habilita els motors criptogràfics de maquinari del OpenSSL" ++ ++msgid "Enable Path MTU discovery" ++msgstr "Habilita el descobriment de ruta MTU" ++ ++msgid "Enable Static Key encryption mode (non-TLS)" ++msgstr "Activa el mode d'encriptació de Clau Estàtica (no-TLS)" ++ ++msgid "Enable TLS and assume client role" ++msgstr "Activa el TLS i assumeix el rol de client" ++ ++msgid "Enable TLS and assume server role" ++msgstr "Activa el TLS i assumeix el rol de servidor" ++ ++msgid "Enable internal datagram fragmentation" ++msgstr "Activa la fragmentació de datagrames interna" ++ ++msgid "Enable management interface on IP port" ++msgstr "Activa la interfície de gestió a IP port" ++ ++msgid "Enabled" ++msgstr "Activat" ++ ++msgid "Encryption cipher for packets" ++msgstr "Xifra d'encriptació per paquets" ++ ++msgid "Execute shell cmd after routes are added" ++msgstr "Executa comanda després d'afegir les rutes" ++ ++msgid "Execute shell command on remote ip change" ++msgstr "Executa una ordre de consola quan hi hagi un canvi d'IP remot" ++ ++msgid "" ++"Executed in server mode on new client connections, when the client is still " ++"untrusted" ++msgstr "" ++ ++msgid "" ++"Executed in server mode whenever an IPv4 address/route or MAC address is " ++"added to OpenVPN's internal routing table" ++msgstr "" ++ ++msgid "Exit on TLS negotiation failure" ++msgstr "Surt en fallar la negociació TLS" ++ ++msgid "Get PEM password from controlling tty before we daemonize" ++msgstr "Aconsegueix contrasenya PEM de controlar tty abans de dimonitzar" ++ ++msgid "HMAC authentication for packets" ++msgstr "Autenticació HMAC per paquets" ++ ++msgid "Handling of authentication failures" ++msgstr "Gestió de fallades d'autenticació" ++ ++msgid "" ++"Helper directive to simplify the expression of --ping and --ping-restart in " ++"server mode configurations" ++msgstr "" ++ ++msgid "If hostname resolve fails, retry" ++msgstr "Si la resolució del nom de màquina falla, reintenta-ho" ++ ++msgid "Instance \"%s\"" ++msgstr "Instància \"%s\"" ++ ++msgid "Invalid" ++msgstr "Invàlid" ++ ++msgid "Keep local IP address on restart" ++msgstr "Mantingues l'adreça IP local al reiniciar" ++ ++msgid "Keep remote IP address on restart" ++msgstr "Mantingues l'adreça IP remota al reiniciar" ++ ++msgid "Keep tun/tap device open on restart" ++msgstr "Mantingues el dispositiu tun/tap obert al reiniciar" ++ ++msgid "Key transition window" ++msgstr "Finestra de transició de clau" ++ ++msgid "Limit repeated log messages" ++msgstr "Limita els missatges de registre repetits" ++ ++msgid "Local certificate" ++msgstr "Certificat local" ++ ++msgid "Local host name or ip address" ++msgstr "Nom de màquina local o adreça IP" ++ ++msgid "Local private key" ++msgstr "Clau privada local" ++ ++msgid "Major mode" ++msgstr "Mode major" ++ ++msgid "Make tun device IPv6 capable" ++msgstr "Fes que el dispositiu tun sigui apte per IPv6" ++ ++msgid "Maximum number of queued TCP output packets" ++msgstr "Número màxim de paquets TCP encuats a la sortida" ++ ++msgid "Number of allocated broadcast buffers" ++msgstr "Número de memòries intermèdies de difusió assignades" ++ ++msgid "Number of lines for log file history" ++msgstr "Número de línies per historial de fitxer de registre" ++ ++msgid "Only accept connections from given X509 name" ++msgstr "Accepta connexions només d'un cert nom X509" ++ ++msgid "Only process ping timeouts if routes exist" ++msgstr "Processa l'excés de temps d'espera de pings remots si la ruta existeix" ++ ++msgid "OpenVPN" ++msgstr "OpenVPN" ++ ++msgid "OpenVPN instances" ++msgstr "Instàncies OpenVPN" ++ ++msgid "Optimize TUN/TAP/UDP writes" ++msgstr "Optimitza les escriptures TUN/TAP/UDP" ++ ++msgid "Output to syslog and do not daemonize" ++msgstr "Sortida al syslog i no dimonitzis" ++ ++msgid "Overview" ++msgstr "Visió de conjunt" ++ ++msgid "PKCS#12 file containing keys" ++msgstr "Fitxer PKCS#12 contenidor de claus" ++ ++msgid "Pass environment variables to script" ++msgstr "Passa les variables d'ambient a l'script" ++ ++msgid "Persist replay-protection state" ++msgstr "Persisteix l'estat de protecció de reproducció" ++ ++msgid "Persist/unpersist ifconfig-pool" ++msgstr "Persisteix/deixa de persistir ifconfig-pool" ++ ++msgid "Ping remote every n seconds over TCP/UDP port" ++msgstr "Ping remot cada n segons sobre port TCP/UDP" ++ ++msgid "Policy level over usage of external programs and scripts" ++msgstr "" ++ ++msgid "Port" ++msgstr "Port" ++ ++msgid "Protocol" ++msgstr "Protocol" ++ ++msgid "Proxy timeout in seconds" ++msgstr "Temps d'espera màxim de proxy en segons" ++ ++msgid "Push an ifconfig option to remote" ++msgstr "Envia una opció ifconfig al remot" ++ ++msgid "Push options to peer" ++msgstr "Envia opcions al peer" ++ ++msgid "Query management channel for private key" ++msgstr "Consulta el canal de gestió per una clau privada" ++ ++msgid "Randomly choose remote server" ++msgstr "Tria aleatòriament el servidor remot" ++ ++msgid "Refuse connection if no custom client config" ++msgstr "Refusa la connexió si no hi ha configuració de client personalitzada" ++ ++msgid "Remap SIGUSR1 signals" ++msgstr "Remapeja senyals SIGUSR1" ++ ++msgid "Remote host name or ip address" ++msgstr "Nom de màquina remot o adreça IP" ++ ++msgid "Remote ping timeout" ++msgstr "Temps d'espera màxim de ping remot" ++ ++msgid "Renegotiate data chan. key after bytes" ++msgstr "Renegocia clau de canal de dades després de bytes" ++ ++msgid "Renegotiate data chan. key after packets" ++msgstr "Renegocia clau de canal de dades després de paquets" ++ ++msgid "Renegotiate data chan. key after seconds" ++msgstr "Renegocia clau de canal de dades després de segons" ++ ++msgid "Replay protection sliding window size" ++msgstr "Mida de la finestra lliscant de protecció de reproducció" ++ ++msgid "Require explicit designation on certificate" ++msgstr "Requereix una designació explícita al certificat" ++ ++msgid "Require explicit key usage on certificate" ++msgstr "Requereix ús de clau explícit al certificat" ++ ++msgid "Restart after remote ping timeout" ++msgstr "Reinicia després d'excedir el temps d'espera de ping remot" ++ ++msgid "Retransmit timeout on TLS control channel" ++msgstr "Temps d'espera de retransmissió en canal de control TLS" ++ ++msgid "Retry indefinitely on HTTP proxy errors" ++msgstr "Reintenta indefinidament en errors de proxy HTTP" ++ ++msgid "Retry indefinitely on Socks proxy errors" ++msgstr "Reintenta indefinidament en errors de proxy Socks" ++ ++msgid "Route subnet to client" ++msgstr "Enruta subxarxa al client" ++ ++msgid "Run as an inetd or xinetd server" ++msgstr "Executa com un servidor inetd o xinetd" ++ ++msgid "Run script cmd on client connection" ++msgstr "Executa l'script en connectar-se el client" ++ ++msgid "Run script cmd on client disconnection" ++msgstr "Executa l'script en desconnectar-te el client" ++ ++msgid "Run up/down scripts for all restarts" ++msgstr "Executa els scripts d'activació/desactivació per tots els reinicis." ++ ++msgid "Send notification to peer on disconnect" ++msgstr "Envia notificació al peer en desconnectar-se" ++ ++msgid "Set GID to group" ++msgstr "Estableix el GID al grup" ++ ++msgid "Set TCP/UDP MTU" ++msgstr "Estableix la MTU de TCP/UDP" ++ ++msgid "Set UID to user" ++msgstr "Estableix l'UID per l'usuari" ++ ++msgid "Set aside a pool of subnets" ++msgstr "Deixa de banda un conjunt de subxarxes" ++ ++msgid "Set extended HTTP proxy options" ++msgstr "Estableix les opcions de proxy HTTP exteses" ++ ++msgid "Set output verbosity" ++msgstr "Estableix el detall de sortida" ++ ++msgid "Set size of real and virtual address hash tables" ++msgstr "" ++"Estableix la mida de les taules de dispersió d'adreces reals i virtuals" ++ ++msgid "Set the TCP/UDP receive buffer size" ++msgstr "Estableix la mida de memòria intermèdia de recepció TCP/UDP" ++ ++msgid "Set the TCP/UDP send buffer size" ++msgstr "Estableix la mida de memòria intermèdia d'enviament TCP/UDP" ++ ++msgid "Set tun/tap TX queue length" ++msgstr "Estableix la mida de cua TX de tun/tap" ++ ++msgid "Set tun/tap adapter parameters" ++msgstr "" ++ ++msgid "Set tun/tap device MTU" ++msgstr "Estableix la MTU del dispositiu tun/tap" ++ ++msgid "Set tun/tap device overhead" ++msgstr "Estableix la càrrega (overhead) del dispositiu tun/tap" ++ ++msgid "Set upper bound on TCP MSS" ++msgstr "Estableix el límit superior al TCP MSS" ++ ++msgid "Shaping for peer bandwidth" ++msgstr "Configuració d'ample de banda d'un peer" ++ ++msgid "Shell cmd to execute after tun device open" ++msgstr "Ordre a executar després que s'obri un dispositiu tun" ++ ++msgid "Shell cmd to run after tun device close" ++msgstr "Ordre a executar després que es tanqui un dispositiu tun" ++ ++msgid "Shell command to verify X509 name" ++msgstr "Ordre de comanda per verificar el nom X509" ++ ++msgid "Silence the output of replay warnings" ++msgstr "Silencia la sortida d'alertes de reproducció" ++ ++msgid "Size of cipher key" ++msgstr "Mida de la clau de xifratge" ++ ++msgid "Specify a default gateway for routes" ++msgstr "Especifica una passarel·la per defecte per rutes" ++ ++msgid "Start OpenVPN in a hibernating state" ++msgstr "Inicia l'OpenVPN en un estat d'hivernació" ++ ++msgid "Start/Stop" ++msgstr "" ++ ++msgid "Started" ++msgstr "Iniciat" ++ ++msgid "Status file format version" ++msgstr "Versió de format de fitxer d'estat" ++ ++msgid "Switch to advanced configuration »" ++msgstr "Canvia a configuració avançada" ++ ++msgid "TCP/UDP port # for both local and remote" ++msgstr "Port TCP/UDP tan per local com per remot" ++ ++msgid "TCP/UDP port # for local (default=1194)" ++msgstr "Port TCP/UDP per local (defecte=1194)" ++ ++msgid "TCP/UDP port # for remote (default=1194)" ++msgstr "Port TCP/UDP per remot (defecte=1194)" ++ ++msgid "TLS cipher" ++msgstr "Xifrador TLS" ++ ++msgid "TOS passthrough (applies to IPv4 only)" ++msgstr "Pas TOS (aplica només a IPv4)" ++ ++msgid "Temporary directory for client-connect return file" ++msgstr "Directori temporal pel fitxer de retorn per la connexió de client" ++ ++msgid "Timeframe for key exchange" ++msgstr "Calendari per intercanvi de claus" ++ ++msgid "Type of used device" ++msgstr "Tipus de dispositiu utilitzat" ++ ++msgid "Use fast LZO compression" ++msgstr "Utilitza compressió ràpida LZO" ++ ++msgid "Use individual addresses rather than /30 subnets" ++msgstr "Utilitza adreces individuals en comptes de subxarxes /30" ++ ++msgid "Use protocol" ++msgstr "Utilitza protocol" ++ ++msgid "Use tun/tap device node" ++msgstr "Utilitza un node de dispositiu tun/tap" ++ ++msgid "Use username as common name" ++msgstr "Utilitza el nom d'usuari com a nom comú" ++ ++msgid "Write log to file" ++msgstr "Escriu registre al fitxer" ++ ++msgid "Write process ID to file" ++msgstr "Escriu l'ID del procés al fitxer" ++ ++msgid "Write status to file every n seconds" ++msgstr "Escriu l'estat al fitxer cada n segons" ++ ++msgid "no" ++msgstr "no" ++ ++msgid "tun/tap device" ++msgstr "dispositiu tun/tap" ++ ++msgid "tun/tap inactivity timeout" ++msgstr "temps d'espera màxim d'inactivitat tun/tap" ++ ++msgid "yes (%i)" ++msgstr "sí (%i)" ++ ++msgid "« Switch to basic configuration" ++msgstr "Canvia a configuració bàsica" ++ ++#~ msgid "Cryptography" ++#~ msgstr "Criptografia" +diff --git a/feeds/luci/applications/luci-app-openvpn/po/cs/openvpn.po b/feeds/luci/applications/luci-app-openvpn/po/cs/openvpn.po +new file mode 100644 +index 0000000..c5ed42d +--- /dev/null ++++ b/feeds/luci/applications/luci-app-openvpn/po/cs/openvpn.po +@@ -0,0 +1,546 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"PO-Revision-Date: 2014-07-12 19:47+0200\n" ++"Last-Translator: koli \n" ++"Language-Team: none\n" ++"Language: cs\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "%s" ++msgstr "%s" ++ ++msgid "'net30', 'p2p', or 'subnet'" ++msgstr "'net30', 'p2p', nebo 'subnet'" ++ ++msgid "Accept options pushed from server" ++msgstr "PÅ™ijmout nastavení, pÅ™ijatá ze serveru" ++ ++msgid "Add" ++msgstr "PÅ™idat" ++ ++msgid "Add route after establishing connection" ++msgstr "PÅ™idat trasu po navázání spojení" ++ ++msgid "Additional authentication over TLS" ++msgstr "DodateÄné ověření pÅ™es TLS" ++ ++msgid "Allow client-to-client traffic" ++msgstr "Povolit provoz typu klient-klient" ++ ++msgid "Allow multiple clients with same certificate" ++msgstr "Povolit více klientů se stejným certifikátem" ++ ++msgid "Allow only one session" ++msgstr "Povolit pouze jedno sezení" ++ ++msgid "Allow remote to change its IP or port" ++msgstr "" ++ ++msgid "Allowed maximum of connected clients" ++msgstr "Maximální povolené množství pÅ™ipojených klientů" ++ ++msgid "Allowed maximum of internal" ++msgstr "" ++ ++msgid "Allowed maximum of new connections" ++msgstr "Maximální povolené množství nových pÅ™ipojení" ++ ++msgid "Append log to file" ++msgstr "PÅ™ipojit log do souboru" ++ ++msgid "Authenticate using username/password" ++msgstr "Ověřit prostÅ™ednictvím uživatelského jména / hesla" ++ ++msgid "Automatically redirect default route" ++msgstr "" ++ ++msgid "Below is a list of configured OpenVPN instances and their current state" ++msgstr "" ++ ++msgid "Call down cmd/script before TUN/TAP close" ++msgstr "" ++ ++msgid "Certificate authority" ++msgstr "CertifikaÄní autorita" ++ ++msgid "Change process priority" ++msgstr "ZmÄ›nit prioritu procesu" ++ ++msgid "Change to directory before initialization" ++msgstr "" ++ ++msgid "Check peer certificate against a CRL" ++msgstr "" ++ ++msgid "Chroot to directory after initialization" ++msgstr "" ++ ++msgid "Client is disabled" ++msgstr "Klient je zakázáný" ++ ++msgid "Configuration category" ++msgstr "Konfigurace kategorie" ++ ++msgid "Configure client mode" ++msgstr "" ++ ++msgid "Configure server bridge" ++msgstr "" ++ ++msgid "Configure server mode" ++msgstr "" ++ ++msgid "Connect through Socks5 proxy" ++msgstr "" ++ ++msgid "Connect to remote host through an HTTP proxy" ++msgstr "" ++ ++msgid "Connection retry interval" ++msgstr "" ++ ++msgid "Daemonize after initialization" ++msgstr "" ++ ++msgid "Delay n seconds after connection" ++msgstr "" ++ ++msgid "Delay tun/tap open and up script execution" ++msgstr "" ++ ++msgid "Diffie Hellman parameters" ++msgstr "Parametry Diffie Hellman" ++ ++msgid "Directory for custom client config files" ++msgstr "Adresář s uživatelskými konfiguraÄními soubory" ++ ++msgid "Disable Paging" ++msgstr "" ++ ++msgid "Disable cipher initialisation vector" ++msgstr "" ++ ++msgid "Disable options consistency check" ++msgstr "" ++ ++msgid "Disable replay protection" ++msgstr "" ++ ++msgid "Do not bind to local address and port" ++msgstr "" ++ ++msgid "Don't actually execute ifconfig" ++msgstr "" ++ ++msgid "Don't add routes automatically" ++msgstr "" ++ ++msgid "Don't cache --askpass or --auth-user-pass passwords" ++msgstr "" ++ ++msgid "Don't inherit global push options" ++msgstr "" ++ ++msgid "Don't log timestamps" ++msgstr "" ++ ++msgid "Don't re-read key on restart" ++msgstr "" ++ ++msgid "Don't require client certificate" ++msgstr "" ++ ++msgid "Don't use adaptive lzo compression" ++msgstr "" ++ ++msgid "Don't warn on ifconfig inconsistencies" ++msgstr "" ++ ++msgid "Echo parameters to log" ++msgstr "" ++ ++msgid "Empirically measure MTU" ++msgstr "" ++ ++msgid "Enable OpenSSL hardware crypto engines" ++msgstr "Povolit hardwarovou akceleraci OpenSSL" ++ ++msgid "Enable Path MTU discovery" ++msgstr "Povolit Path MTU discovery (PMTUD)" ++ ++msgid "Enable Static Key encryption mode (non-TLS)" ++msgstr "" ++ ++msgid "Enable TLS and assume client role" ++msgstr "Povolit TLS a pÅ™evzít roli klienta" ++ ++msgid "Enable TLS and assume server role" ++msgstr "Povolit TLS a pÅ™evzít roli serveru" ++ ++msgid "Enable internal datagram fragmentation" ++msgstr "Povolit interní fragmentaci datagramů" ++ ++msgid "Enable management interface on IP port" ++msgstr "" ++ ++msgid "Enabled" ++msgstr "Povoleno" ++ ++msgid "Encryption cipher for packets" ++msgstr "" ++ ++msgid "Execute shell cmd after routes are added" ++msgstr "" ++ ++msgid "Execute shell command on remote ip change" ++msgstr "" ++ ++msgid "" ++"Executed in server mode on new client connections, when the client is still " ++"untrusted" ++msgstr "" ++ ++msgid "" ++"Executed in server mode whenever an IPv4 address/route or MAC address is " ++"added to OpenVPN's internal routing table" ++msgstr "" ++ ++msgid "Exit on TLS negotiation failure" ++msgstr "" ++ ++msgid "Get PEM password from controlling tty before we daemonize" ++msgstr "" ++ ++msgid "HMAC authentication for packets" ++msgstr "" ++ ++msgid "Handling of authentication failures" ++msgstr "" ++ ++msgid "" ++"Helper directive to simplify the expression of --ping and --ping-restart in " ++"server mode configurations" ++msgstr "" ++ ++msgid "If hostname resolve fails, retry" ++msgstr "" ++ ++msgid "Instance \"%s\"" ++msgstr "Instance \"%s\"" ++ ++msgid "Invalid" ++msgstr "Neplatné" ++ ++msgid "Keep local IP address on restart" ++msgstr "" ++ ++msgid "Keep remote IP address on restart" ++msgstr "" ++ ++msgid "Keep tun/tap device open on restart" ++msgstr "" ++ ++msgid "Key transition window" ++msgstr "" ++ ++msgid "Limit repeated log messages" ++msgstr "" ++ ++msgid "Local certificate" ++msgstr "Lokální certifikát" ++ ++msgid "Local host name or ip address" ++msgstr "" ++ ++msgid "Local private key" ++msgstr "Lokální soukromý klíÄ" ++ ++msgid "Major mode" ++msgstr "" ++ ++msgid "Make tun device IPv6 capable" ++msgstr "" ++ ++msgid "Maximum number of queued TCP output packets" ++msgstr "" ++ ++msgid "Number of allocated broadcast buffers" ++msgstr "" ++ ++msgid "Number of lines for log file history" ++msgstr "" ++ ++msgid "Only accept connections from given X509 name" ++msgstr "" ++ ++msgid "Only process ping timeouts if routes exist" ++msgstr "" ++ ++msgid "OpenVPN" ++msgstr "OpenVPN" ++ ++msgid "OpenVPN instances" ++msgstr "OpenVPN instance" ++ ++msgid "Optimize TUN/TAP/UDP writes" ++msgstr "" ++ ++msgid "Output to syslog and do not daemonize" ++msgstr "" ++ ++msgid "Overview" ++msgstr "PÅ™ehled" ++ ++msgid "PKCS#12 file containing keys" ++msgstr "" ++ ++msgid "Pass environment variables to script" ++msgstr "" ++ ++msgid "Persist replay-protection state" ++msgstr "" ++ ++msgid "Persist/unpersist ifconfig-pool" ++msgstr "" ++ ++msgid "Ping remote every n seconds over TCP/UDP port" ++msgstr "" ++ ++msgid "Policy level over usage of external programs and scripts" ++msgstr "" ++ ++msgid "Port" ++msgstr "Port" ++ ++msgid "Protocol" ++msgstr "Protokol" ++ ++msgid "Proxy timeout in seconds" ++msgstr "" ++ ++msgid "Push an ifconfig option to remote" ++msgstr "" ++ ++msgid "Push options to peer" ++msgstr "" ++ ++msgid "Query management channel for private key" ++msgstr "" ++ ++msgid "Randomly choose remote server" ++msgstr "" ++ ++msgid "Refuse connection if no custom client config" ++msgstr "" ++ ++msgid "Remap SIGUSR1 signals" ++msgstr "" ++ ++msgid "Remote host name or ip address" ++msgstr "" ++ ++msgid "Remote ping timeout" ++msgstr "" ++ ++msgid "Renegotiate data chan. key after bytes" ++msgstr "" ++ ++msgid "Renegotiate data chan. key after packets" ++msgstr "" ++ ++msgid "Renegotiate data chan. key after seconds" ++msgstr "" ++ ++msgid "Replay protection sliding window size" ++msgstr "" ++ ++msgid "Require explicit designation on certificate" ++msgstr "" ++ ++msgid "Require explicit key usage on certificate" ++msgstr "" ++ ++msgid "Restart after remote ping timeout" ++msgstr "" ++ ++msgid "Retransmit timeout on TLS control channel" ++msgstr "" ++ ++msgid "Retry indefinitely on HTTP proxy errors" ++msgstr "" ++ ++msgid "Retry indefinitely on Socks proxy errors" ++msgstr "" ++ ++msgid "Route subnet to client" ++msgstr "" ++ ++msgid "Run as an inetd or xinetd server" ++msgstr "" ++ ++msgid "Run script cmd on client connection" ++msgstr "Spustit skript cmd pro pÅ™ipojení klienta" ++ ++msgid "Run script cmd on client disconnection" ++msgstr "Spustit skript cmd pro odpojení klienta" ++ ++msgid "Run up/down scripts for all restarts" ++msgstr "" ++ ++msgid "Send notification to peer on disconnect" ++msgstr "" ++ ++msgid "Set GID to group" ++msgstr "" ++ ++msgid "Set TCP/UDP MTU" ++msgstr "" ++ ++msgid "Set UID to user" ++msgstr "" ++ ++msgid "Set aside a pool of subnets" ++msgstr "" ++ ++msgid "Set extended HTTP proxy options" ++msgstr "" ++ ++msgid "Set output verbosity" ++msgstr "" ++ ++msgid "Set size of real and virtual address hash tables" ++msgstr "" ++ ++msgid "Set the TCP/UDP receive buffer size" ++msgstr "" ++ ++msgid "Set the TCP/UDP send buffer size" ++msgstr "" ++ ++msgid "Set tun/tap TX queue length" ++msgstr "" ++ ++msgid "Set tun/tap adapter parameters" ++msgstr "" ++ ++msgid "Set tun/tap device MTU" ++msgstr "" ++ ++msgid "Set tun/tap device overhead" ++msgstr "" ++ ++msgid "Set upper bound on TCP MSS" ++msgstr "" ++ ++msgid "Shaping for peer bandwidth" ++msgstr "" ++ ++msgid "Shell cmd to execute after tun device open" ++msgstr "" ++ ++msgid "Shell cmd to run after tun device close" ++msgstr "" ++ ++msgid "Shell command to verify X509 name" ++msgstr "" ++ ++msgid "Silence the output of replay warnings" ++msgstr "" ++ ++msgid "Size of cipher key" ++msgstr "Velikost Å¡ifrovacího klíÄe" ++ ++msgid "Specify a default gateway for routes" ++msgstr "" ++ ++msgid "Start OpenVPN in a hibernating state" ++msgstr "" ++ ++msgid "Start/Stop" ++msgstr "Start/Stop" ++ ++msgid "Started" ++msgstr "SpuÅ¡tÄ›no" ++ ++msgid "Status file format version" ++msgstr "" ++ ++msgid "Switch to advanced configuration »" ++msgstr "PÅ™epnout na pokroÄilou konfiguraci »" ++ ++msgid "TCP/UDP port # for both local and remote" ++msgstr "" ++ ++msgid "TCP/UDP port # for local (default=1194)" ++msgstr "" ++ ++msgid "TCP/UDP port # for remote (default=1194)" ++msgstr "" ++ ++msgid "TLS cipher" ++msgstr "TLS Å¡ifra" ++ ++msgid "TOS passthrough (applies to IPv4 only)" ++msgstr "" ++ ++msgid "Temporary directory for client-connect return file" ++msgstr "" ++ ++msgid "Timeframe for key exchange" ++msgstr "" ++ ++msgid "Type of used device" ++msgstr "" ++ ++msgid "Use fast LZO compression" ++msgstr "" ++ ++msgid "Use individual addresses rather than /30 subnets" ++msgstr "" ++ ++msgid "Use protocol" ++msgstr "" ++ ++msgid "Use tun/tap device node" ++msgstr "" ++ ++msgid "Use username as common name" ++msgstr "" ++ ++msgid "Write log to file" ++msgstr "" ++ ++msgid "Write process ID to file" ++msgstr "" ++ ++msgid "Write status to file every n seconds" ++msgstr "" ++ ++msgid "no" ++msgstr "ne" ++ ++msgid "tun/tap device" ++msgstr "" ++ ++msgid "tun/tap inactivity timeout" ++msgstr "" ++ ++msgid "yes (%i)" ++msgstr "ano (%i)" ++ ++msgid "« Switch to basic configuration" ++msgstr "« PÅ™epnout na základní konfiguraci" ++ ++#~ msgid "Cryptography" ++#~ msgstr "Å ifrování" ++ ++#~ msgid "Service" ++#~ msgstr "Služba" ++ ++#~ msgid "VPN" ++#~ msgstr "VPN" +diff --git a/feeds/luci/applications/luci-app-openvpn/po/de/openvpn.po b/feeds/luci/applications/luci-app-openvpn/po/de/openvpn.po +new file mode 100644 +index 0000000..e6cfdae +--- /dev/null ++++ b/feeds/luci/applications/luci-app-openvpn/po/de/openvpn.po +@@ -0,0 +1,560 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Report-Msgid-Bugs-To: \n" ++"POT-Creation-Date: 2009-05-26 17:57+0200\n" ++"PO-Revision-Date: 2013-01-28 22:15+0200\n" ++"Last-Translator: DAC324 \n" ++"Language-Team: LANGUAGE \n" ++"Language: de\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n != 1);\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "%s" ++msgstr "%s" ++ ++msgid "'net30', 'p2p', or 'subnet'" ++msgstr "Topologietyp" ++ ++msgid "Accept options pushed from server" ++msgstr "Vom Server übertragene Optionen lokal akzeptieren" ++ ++msgid "Add" ++msgstr "Hinzufügen" ++ ++msgid "Add route after establishing connection" ++msgstr "Netzwerkrouten nach Verbindungsaufbau einrichten" ++ ++msgid "Additional authentication over TLS" ++msgstr "Erweiterte Authentifikation über TLS" ++ ++msgid "Allow client-to-client traffic" ++msgstr "Netzwerkverkehr zwischen Teilnehmern zulassen" ++ ++msgid "Allow multiple clients with same certificate" ++msgstr "Mehrere Teilnehmer mit selbem Zertifikat erlauben" ++ ++msgid "Allow only one session" ++msgstr "Nur eine einzige Verbindung zulassen" ++ ++msgid "Allow remote to change its IP or port" ++msgstr "Address- und Port-Änderungen der Gegenstelle zulassen" ++ ++msgid "Allowed maximum of connected clients" ++msgstr "Betriebsmodus" ++ ++msgid "Allowed maximum of internal" ++msgstr "Maximal erlaubte Anzahl an Netzwerkrouten pro Teilnehmer" ++ ++msgid "Allowed maximum of new connections" ++msgstr "Wiederholrate für Verbindungversuche" ++ ++msgid "Append log to file" ++msgstr "An Protokolldatei anfügen" ++ ++msgid "Authenticate using username/password" ++msgstr "Authentifikation mittels Benutzername und Passwort" ++ ++msgid "Automatically redirect default route" ++msgstr "Automatisch die Standard-Route umleiten" ++ ++msgid "Below is a list of configured OpenVPN instances and their current state" ++msgstr "Liste der konfigurierten OpenVPN Instanzen und ihr momentaner Status" ++ ++msgid "Call down cmd/script before TUN/TAP close" ++msgstr "" ++"Shell-Kommando vor Deaktivierung der TUN/TAP Schnittstelle ausführen" ++ ++msgid "Certificate authority" ++msgstr "Zertifikat der Zertifizierungsstelle" ++ ++msgid "Change process priority" ++msgstr "Prozess-Priorität anpassen" ++ ++msgid "Change to directory before initialization" ++msgstr "Vor der Initialisierung in Verzeichnis wechseln" ++ ++msgid "Check peer certificate against a CRL" ++msgstr "Teilnehmerzertifikat mit Sperrliste abgleichen" ++ ++msgid "Chroot to directory after initialization" ++msgstr "Nach der Initialisierung in Verzeichnis wechseln" ++ ++msgid "Client is disabled" ++msgstr "Teilnehmer-Konto deaktivieren" ++ ++msgid "Configuration category" ++msgstr "Kategorie" ++ ++msgid "Configure client mode" ++msgstr "Clientmodus" ++ ++msgid "Configure server bridge" ++msgstr "Server-zu-Server Netzwerkbrücke" ++ ++msgid "Configure server mode" ++msgstr "Server-Modus" ++ ++msgid "Connect through Socks5 proxy" ++msgstr "Verbindung über einen Socks 5 - Proxy" ++ ++msgid "Connect to remote host through an HTTP proxy" ++msgstr "Verbindung zum entfernten Rechner über HTTP-Proxy aufbauen" ++ ++msgid "Connection retry interval" ++msgstr "Wiederholrate für Verbindungversuche" ++ ++msgid "Daemonize after initialization" ++msgstr "Nach der Initialisierung als Hintergrundprozess ausführen" ++ ++msgid "Delay n seconds after connection" ++msgstr "Nach dem Verbindungsaufbau um n Sekunden verzögern" ++ ++msgid "Delay tun/tap open and up script execution" ++msgstr "Shell-Kommando nach Schnittstelleneinrichtung verzögern" ++ ++msgid "Diffie Hellman parameters" ++msgstr "Diffie-Hellman-Parameter" ++ ++msgid "Directory for custom client config files" ++msgstr "Verzeichnis für eigene Konfigurationsdateien" ++ ++msgid "Disable Paging" ++msgstr "Benutzten Arbeitsspeicher sperren" ++ ++msgid "Disable cipher initialisation vector" ++msgstr "Initialisierungsvektor für Verschlüsselung deaktivieren" ++ ++msgid "Disable options consistency check" ++msgstr "Konsistenzprüfungen für Optionen durchführen" ++ ++msgid "Disable replay protection" ++msgstr "\"Replay\"-Schutz deaktivieren" ++ ++msgid "Do not bind to local address and port" ++msgstr "An keine spezielle Adresse binden" ++ ++msgid "Don't actually execute ifconfig" ++msgstr "Schnittstellenkonfiguration nicht durchführen" ++ ++msgid "Don't add routes automatically" ++msgstr "Netzwerkrouten nicht automatisch einrichten" ++ ++msgid "Don't cache --askpass or --auth-user-pass passwords" ++msgstr "Authentifikationsdaten nicht zwischenspeichern" ++ ++msgid "Don't inherit global push options" ++msgstr "Nur teilnehmerspezifische Optionen übertragen" ++ ++msgid "Don't log timestamps" ++msgstr "Keine Zeitangaben protokollieren" ++ ++msgid "Don't re-read key on restart" ++msgstr "Schlüssel bei Neustarts beibehalten" ++ ++msgid "Don't require client certificate" ++msgstr "Verbindung ohne Teilnehmerzertifikat erlauben" ++ ++msgid "Don't use adaptive lzo compression" ++msgstr "Adaptive LZO-Kompression deaktivieren" ++ ++msgid "Don't warn on ifconfig inconsistencies" ++msgstr "Keine Warnung bei inkonsistenter Schnittstellenkonfiguration" ++ ++msgid "Echo parameters to log" ++msgstr "Parameter in Protokolldatei speichern" ++ ++msgid "Empirically measure MTU" ++msgstr "MTU regelmäßig testen" ++ ++msgid "Enable OpenSSL hardware crypto engines" ++msgstr "OpenSSL-Unterstützung für Kryptographie-Hardware benutzen" ++ ++msgid "Enable Path MTU discovery" ++msgstr "MTU-Erkennung aktivieren" ++ ++msgid "Enable Static Key encryption mode (non-TLS)" ++msgstr "Verschlüsselung mittels statischer Schlüssel (kein TLS)" ++ ++msgid "Enable TLS and assume client role" ++msgstr "TLS im Client-Betriebsmodus aktivieren" ++ ++msgid "Enable TLS and assume server role" ++msgstr "TLS im Server-Betriebsmodus aktivieren" ++ ++msgid "Enable internal datagram fragmentation" ++msgstr "Datenpakete bei Bedarf fragmentieren" ++ ++msgid "Enable management interface on IP port" ++msgstr "Administratorschnittstelle aktivieren" ++ ++msgid "Enabled" ++msgstr "Einschalten" ++ ++msgid "Encryption cipher for packets" ++msgstr "Verschlüsselungsalgorithmus für Pakete" ++ ++msgid "Execute shell cmd after routes are added" ++msgstr "Shell-Befehl nach Routen-Einrichtung ausführen" ++ ++msgid "Execute shell command on remote ip change" ++msgstr "Programm bei Adressänderung der Gegenstelle aufrufen" ++ ++msgid "" ++"Executed in server mode on new client connections, when the client is still " ++"untrusted" ++msgstr "" ++"Wird bei neuen Client-Verbindungen im Servermodus ausgeführt, wenn dem " ++"Clienten noch nicht vertraut wird" ++ ++msgid "" ++"Executed in server mode whenever an IPv4 address/route or MAC address is " ++"added to OpenVPN's internal routing table" ++msgstr "" ++"Wird im Servermodus ausgeführt, wann immer eine IPv4-Adresse/Route oder MAC-" ++"Adresse zur internen Routingtabelle von OpenVPN hinzugefügt wird" ++ ++msgid "Exit on TLS negotiation failure" ++msgstr "Terminieren nach fehlgeschlagenem Schlüsselaustausch" ++ ++msgid "Get PEM password from controlling tty before we daemonize" ++msgstr "PEM-Passwort von Konsole abfragen" ++ ++msgid "HMAC authentication for packets" ++msgstr "HMAC-Authentifizierung für Pakete" ++ ++msgid "Handling of authentication failures" ++msgstr "Behandlung von Authentifikationsfehlern" ++ ++msgid "" ++"Helper directive to simplify the expression of --ping and --ping-restart in " ++"server mode configurations" ++msgstr "" ++"Helfer-Direktive, um den Ausdruck von --ping und --ping-restart in " ++"Servermodus-Konfigurationen zu vereinfachen" ++ ++msgid "If hostname resolve fails, retry" ++msgstr "Neuer Verbindungsversuch wenn Namensauflösung fehlschlägt" ++ ++msgid "Instance \"%s\"" ++msgstr "Instanz \"%s\"" ++ ++msgid "Invalid" ++msgstr "Ungültig" ++ ++msgid "Keep local IP address on restart" ++msgstr "Lokale IP-Adresse bei Neustarts beibehalten" ++ ++msgid "Keep remote IP address on restart" ++msgstr "IP-Adresse der Gegenstelle bei Neustarts beibehalten" ++ ++msgid "Keep tun/tap device open on restart" ++msgstr "TUN/TAP Schnittelle bei Neustarts offen halten" ++ ++msgid "Key transition window" ++msgstr "Maximaler Zeitraum für Schlüsselwechsel" ++ ++msgid "Limit repeated log messages" ++msgstr "Wiederholende Protokollmeldungen unterdrücken" ++ ++msgid "Local certificate" ++msgstr "Lokales Zertifikat" ++ ++msgid "Local host name or ip address" ++msgstr "Lokaler Rechnername oder IP Adresse" ++ ++msgid "Local private key" ++msgstr "Lokaler privater Schlüssel" ++ ++msgid "Major mode" ++msgstr "Betriebsmodus" ++ ++msgid "Make tun device IPv6 capable" ++msgstr "IPv6 auf TUN Schnittstellen aktivieren" ++ ++msgid "Maximum number of queued TCP output packets" ++msgstr "Maximale Anzahl an TCP-Paketen in der Warteschlange" ++ ++msgid "Number of allocated broadcast buffers" ++msgstr "Anzahl der benutzten Broadcast-Puffer" ++ ++msgid "Number of lines for log file history" ++msgstr "Anzahl der Zeilen im Protokoll-Zwischenspeicher" ++ ++msgid "Only accept connections from given X509 name" ++msgstr "Nur Verbindungen vom angegebenem X.509 Name zulassen" ++ ++msgid "Only process ping timeouts if routes exist" ++msgstr "Ping-Timeouts nur bei vorhandenen Routen auslösen" ++ ++msgid "OpenVPN" ++msgstr "OpenVPN" ++ ++msgid "OpenVPN instances" ++msgstr "OpenVPN Instanzen" ++ ++msgid "Optimize TUN/TAP/UDP writes" ++msgstr "TUN-, TAP- und UDP-Schreibvorgänge optimieren" ++ ++msgid "Output to syslog and do not daemonize" ++msgstr "Ausgaben ins Systemprotokoll umleiten und im Vordergrund ausführen" ++ ++msgid "Overview" ++msgstr "Ãœbersicht" ++ ++msgid "PKCS#12 file containing keys" ++msgstr "PKCS#12 Schlüsselarchiv" ++ ++msgid "Pass environment variables to script" ++msgstr "Umgebungsvariablen für Shell-Befehle" ++ ++msgid "Persist replay-protection state" ++msgstr "Persistenter Status für \"Replay\"-Schutz" ++ ++msgid "Persist/unpersist ifconfig-pool" ++msgstr "Persistenten IP-Adressbereich nutzen" ++ ++msgid "Ping remote every n seconds over TCP/UDP port" ++msgstr "Ping-Intervall für Gegenstellen" ++ ++msgid "Policy level over usage of external programs and scripts" ++msgstr "Policy-Ebene über Nutzung von externen Programmen und Skripten" ++ ++msgid "Port" ++msgstr "Netzwerkport" ++ ++msgid "Protocol" ++msgstr "Protokoll" ++ ++msgid "Proxy timeout in seconds" ++msgstr "Maximaler Timeout für Proxy-Verbindungen" ++ ++msgid "Push an ifconfig option to remote" ++msgstr "IP-Adresskonfiguration an Teilnehmer übertragen" ++ ++msgid "Push options to peer" ++msgstr "Optionen an Teilnehmer übertragen" ++ ++msgid "Query management channel for private key" ++msgstr "Privaten Schlüssel über Management-Kanal abfragen" ++ ++msgid "Randomly choose remote server" ++msgstr "Entfernten Server zufällig wählen" ++ ++msgid "Refuse connection if no custom client config" ++msgstr "Teilnehmer-Verbindung verweigern wenn Teilnehmer-Konfiguration fehlt" ++ ++msgid "Remap SIGUSR1 signals" ++msgstr "\"USR1\" Systemsignal umleiten" ++ ++msgid "Remote host name or ip address" ++msgstr "Entfernter Rechnername oder IP-Adresse" ++ ++msgid "Remote ping timeout" ++msgstr "Ping-Timeout für Gegenstellen" ++ ++msgid "Renegotiate data chan. key after bytes" ++msgstr "Schlüssel nach maximale Verkehrsmenge neu aushandeln" ++ ++msgid "Renegotiate data chan. key after packets" ++msgstr "Schlüssel nach maximaler Anzahl von Paketen neu aushandeln" ++ ++msgid "Renegotiate data chan. key after seconds" ++msgstr "Schlüssel nach maximaler Verbindungsdauer neu aushandeln" ++ ++msgid "Replay protection sliding window size" ++msgstr "Fenstergröße für \"Replay\"-Schutz" ++ ++msgid "Require explicit designation on certificate" ++msgstr "Verwendungszweck von Zertifikaten überprüfen" ++ ++msgid "Require explicit key usage on certificate" ++msgstr "Zertifikat explizit auf einfachen Verwendungszweck prüfen" ++ ++msgid "Restart after remote ping timeout" ++msgstr "Neu Starten nach Ping-Timeout an Gegenstellen" ++ ++msgid "Retransmit timeout on TLS control channel" ++msgstr "TLS Timeout" ++ ++msgid "Retry indefinitely on HTTP proxy errors" ++msgstr "Neue Verbindung bei Proxy-Fehlern aufbauen" ++ ++msgid "Retry indefinitely on Socks proxy errors" ++msgstr "Neue Verbindung bei Proxy-Fehlern aufbauen" ++ ++msgid "Route subnet to client" ++msgstr "Subnetz an Teilnehmer routen" ++ ++msgid "Run as an inetd or xinetd server" ++msgstr "Als inetd oder xinetd Server laufen" ++ ++msgid "Run script cmd on client connection" ++msgstr "Shell-Kommando bei neuer Teilnehmer-Verbindung ausführen" ++ ++msgid "Run script cmd on client disconnection" ++msgstr "Shell-Kommando beim Trennen von Teilnehmer-Verbindungen ausführen" ++ ++msgid "Run up/down scripts for all restarts" ++msgstr "Shell-Kommandos bei jedem Neustart ausführen" ++ ++msgid "Send notification to peer on disconnect" ++msgstr "Teilnehmer über Verbindungstrennung informieren" ++ ++msgid "Set GID to group" ++msgstr "Dienst mit Benutzergruppe laufen lassen" ++ ++msgid "Set TCP/UDP MTU" ++msgstr "MTU für TCP/UDP Protokoll festlegen" ++ ++msgid "Set UID to user" ++msgstr "Dienst als Benutzer laufen lassen" ++ ++msgid "Set aside a pool of subnets" ++msgstr "IP-Adressbereich für zu vergebende Subnetze" ++ ++msgid "Set extended HTTP proxy options" ++msgstr "Erweiterte HTTP-Proxy Einstellungen vornehmen" ++ ++msgid "Set output verbosity" ++msgstr "Detailstufe für Protokolle" ++ ++msgid "Set size of real and virtual address hash tables" ++msgstr "Größe für interne Adresstabellen" ++ ++msgid "Set the TCP/UDP receive buffer size" ++msgstr "Größe des TCP/UDP Empfangs-Puffers" ++ ++msgid "Set the TCP/UDP send buffer size" ++msgstr "Größe des TCP/UDP Sende-Puffers" ++ ++msgid "Set tun/tap TX queue length" ++msgstr "Größe der Sende-Warteschlange" ++ ++msgid "Set tun/tap adapter parameters" ++msgstr "Tun/Tap parameter einstellen" ++ ++msgid "Set tun/tap device MTU" ++msgstr "MTU für TUN/TAP Schnittstelle festlegen" ++ ++msgid "Set tun/tap device overhead" ++msgstr "Overhead für TUN/TAP Schnittstelle festlegen" ++ ++msgid "Set upper bound on TCP MSS" ++msgstr "Maximale TCP-MSS erzwingen" ++ ++msgid "Shaping for peer bandwidth" ++msgstr "Verbindungsrate von Gegenstellen limitieren" ++ ++msgid "Shell cmd to execute after tun device open" ++msgstr "Shell-Kommando nach Einrichtung von TUN/TAP Schnittstelle ausführen" ++ ++msgid "Shell cmd to run after tun device close" ++msgstr "" ++"Shell-Kommando nach Deaktivierung der TUN/TAP Schnittstelle " ++"ausführen" ++ ++msgid "Shell command to verify X509 name" ++msgstr "Shell-Kommando zum Ãœberprüfen das X.509 Namens" ++ ++msgid "Silence the output of replay warnings" ++msgstr "\"Replay\"-Warnungen unterdrücken" ++ ++msgid "Size of cipher key" ++msgstr "Größe des Schlüssels" ++ ++msgid "Specify a default gateway for routes" ++msgstr "Standard-Gateway für Netzwerkrouten" ++ ++msgid "Start OpenVPN in a hibernating state" ++msgstr "OpenVPN im Schlafmodus starten" ++ ++msgid "Start/Stop" ++msgstr "Start/Stopp" ++ ++msgid "Started" ++msgstr "Gestartet" ++ ++msgid "Status file format version" ++msgstr "Format für Status-Datei" ++ ++msgid "Switch to advanced configuration »" ++msgstr "Erweiterte Einstellungen" ++ ++msgid "TCP/UDP port # for both local and remote" ++msgstr "Benutzter TCP oder UDP Port" ++ ++msgid "TCP/UDP port # for local (default=1194)" ++msgstr "Lokaler TCP oder UDP Port" ++ ++msgid "TCP/UDP port # for remote (default=1194)" ++msgstr "TCP oder UDP Port der Gegenstelle" ++ ++msgid "TLS cipher" ++msgstr "TLS Verschlüsselungsalgorithmus" ++ ++msgid "TOS passthrough (applies to IPv4 only)" ++msgstr "\"TOS\" Durchleitung (nur für IPv4)" ++ ++msgid "Temporary directory for client-connect return file" ++msgstr "Temporäres Verzeichnis für Teilnehmer-Verbindungen" ++ ++msgid "Timeframe for key exchange" ++msgstr "Maximaler Zeitraum für Schlüsselaustausch" ++ ++msgid "Type of used device" ++msgstr "Schnittstellentyp" ++ ++msgid "Use fast LZO compression" ++msgstr "Schnelle LZO-Kompression benutzen" ++ ++msgid "Use individual addresses rather than /30 subnets" ++msgstr "Einzeladressen statt /30 Subnetze vergeben" ++ ++msgid "Use protocol" ++msgstr "Netzwerkprotokoll" ++ ++msgid "Use tun/tap device node" ++msgstr "TUN/TAP Gerätedatei" ++ ++msgid "Use username as common name" ++msgstr "Benutzernamen als Common-Name benutzen" ++ ++msgid "Write log to file" ++msgstr "In Protokolldatei schreiben" ++ ++msgid "Write process ID to file" ++msgstr "Prozess-Nummer in Datei schreiben" ++ ++msgid "Write status to file every n seconds" ++msgstr "Status-Datei schreiben" ++ ++msgid "no" ++msgstr "Nicht gestartet" ++ ++msgid "tun/tap device" ++msgstr "TUN/TAP Schnittstelle" ++ ++msgid "tun/tap inactivity timeout" ++msgstr "Inaktivitäts-Timeout für TUN/TAP Schnittstellen" ++ ++msgid "yes (%i)" ++msgstr "Gestartet (%s)" ++ ++msgid "« Switch to basic configuration" ++msgstr "« Zur vereinfachten Konfiguration wechseln" ++ ++#~ msgid "Cryptography" ++#~ msgstr "Kryptographie" ++ ++#~ msgid "Networking" ++#~ msgstr "Netzwerk" ++ ++#~ msgid "Service" ++#~ msgstr "Dienst" ++ ++#~ msgid "VPN" ++#~ msgstr "VPN" +diff --git a/feeds/luci/applications/luci-app-openvpn/po/el/openvpn.po b/feeds/luci/applications/luci-app-openvpn/po/el/openvpn.po +new file mode 100644 +index 0000000..c5368d7 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-openvpn/po/el/openvpn.po +@@ -0,0 +1,557 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Report-Msgid-Bugs-To: \n" ++"POT-Creation-Date: 2009-05-28 02:08+0200\n" ++"PO-Revision-Date: 2012-03-18 15:23+0200\n" ++"Last-Translator: Vasilis \n" ++"Language-Team: LANGUAGE \n" ++"Language: el\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n != 1);\n" ++"X-Generator: Pootle 2.0.4\n" ++ ++msgid "%s" ++msgstr "%s" ++ ++msgid "'net30', 'p2p', or 'subnet'" ++msgstr "" ++ ++msgid "Accept options pushed from server" ++msgstr "" ++ ++msgid "Add" ++msgstr "ΠÏοσθήκη" ++ ++msgid "Add route after establishing connection" ++msgstr "" ++ ++msgid "Additional authentication over TLS" ++msgstr "" ++ ++msgid "Allow client-to-client traffic" ++msgstr "" ++ ++msgid "Allow multiple clients with same certificate" ++msgstr "" ++ ++msgid "Allow only one session" ++msgstr "" ++ ++msgid "Allow remote to change its IP or port" ++msgstr "ΕπιτÏέπουμε στον απομακÏυσμένο να αλλάξει την IP ή τη θÏÏα" ++ ++msgid "Allowed maximum of connected clients" ++msgstr "" ++ ++msgid "Allowed maximum of internal" ++msgstr "" ++ ++msgid "Allowed maximum of new connections" ++msgstr "" ++ ++msgid "Append log to file" ++msgstr "" ++ ++msgid "Authenticate using username/password" ++msgstr "" ++ ++msgid "Automatically redirect default route" ++msgstr "" ++ ++msgid "Below is a list of configured OpenVPN instances and their current state" ++msgstr "" ++"ΠαÏακάτω είναι μία λίστα των Ïυθμισμένων πεÏιστατικών OpenVPN και της " ++"Ï„Ïέχουσας κατάστασής τους" ++ ++msgid "Call down cmd/script before TUN/TAP close" ++msgstr "" ++ ++msgid "Certificate authority" ++msgstr "" ++ ++msgid "Change process priority" ++msgstr "" ++ ++msgid "Change to directory before initialization" ++msgstr "" ++ ++msgid "Check peer certificate against a CRL" ++msgstr "" ++ ++msgid "Chroot to directory after initialization" ++msgstr "" ++ ++msgid "Client is disabled" ++msgstr "" ++ ++msgid "Configuration category" ++msgstr "" ++ ++msgid "Configure client mode" ++msgstr "" ++ ++msgid "Configure server bridge" ++msgstr "" ++ ++msgid "Configure server mode" ++msgstr "" ++ ++msgid "Connect through Socks5 proxy" ++msgstr "ΣÏνδεση μέσω διαμεσολαβητή Socks5" ++ ++msgid "Connect to remote host through an HTTP proxy" ++msgstr "" ++ ++msgid "Connection retry interval" ++msgstr "Διάστημα επαναπÏοσπάθειας σÏνδεσης" ++ ++msgid "Daemonize after initialization" ++msgstr "" ++ ++msgid "Delay n seconds after connection" ++msgstr "" ++ ++msgid "Delay tun/tap open and up script execution" ++msgstr "" ++ ++msgid "Diffie Hellman parameters" ++msgstr "" ++ ++msgid "Directory for custom client config files" ++msgstr "" ++ ++msgid "Disable Paging" ++msgstr "" ++ ++msgid "Disable cipher initialisation vector" ++msgstr "" ++ ++msgid "Disable options consistency check" ++msgstr "" ++ ++msgid "Disable replay protection" ++msgstr "" ++ ++msgid "Do not bind to local address and port" ++msgstr "Μη συνδέσεις σε τοπική διεÏθυνση και θÏÏα" ++ ++msgid "Don't actually execute ifconfig" ++msgstr "" ++ ++msgid "Don't add routes automatically" ++msgstr "" ++ ++msgid "Don't cache --askpass or --auth-user-pass passwords" ++msgstr "" ++ ++msgid "Don't inherit global push options" ++msgstr "" ++ ++msgid "Don't log timestamps" ++msgstr "" ++ ++msgid "Don't re-read key on restart" ++msgstr "" ++ ++msgid "Don't require client certificate" ++msgstr "" ++ ++msgid "Don't use adaptive lzo compression" ++msgstr "" ++ ++msgid "Don't warn on ifconfig inconsistencies" ++msgstr "" ++ ++msgid "Echo parameters to log" ++msgstr "" ++ ++msgid "Empirically measure MTU" ++msgstr "" ++ ++msgid "Enable OpenSSL hardware crypto engines" ++msgstr "" ++ ++msgid "Enable Path MTU discovery" ++msgstr "" ++ ++msgid "Enable Static Key encryption mode (non-TLS)" ++msgstr "" ++ ++msgid "Enable TLS and assume client role" ++msgstr "" ++ ++msgid "Enable TLS and assume server role" ++msgstr "" ++ ++msgid "Enable internal datagram fragmentation" ++msgstr "" ++ ++msgid "Enable management interface on IP port" ++msgstr "" ++ ++msgid "Enabled" ++msgstr "ΕνεÏγοποιημένο" ++ ++msgid "Encryption cipher for packets" ++msgstr "" ++ ++msgid "Execute shell cmd after routes are added" ++msgstr "" ++ ++msgid "Execute shell command on remote ip change" ++msgstr "Εκτέλεση της εντολής κελÏφους στην αλλαγή IP του απομακÏυσμένου" ++ ++msgid "" ++"Executed in server mode on new client connections, when the client is still " ++"untrusted" ++msgstr "" ++ ++msgid "" ++"Executed in server mode whenever an IPv4 address/route or MAC address is " ++"added to OpenVPN's internal routing table" ++msgstr "" ++ ++msgid "Exit on TLS negotiation failure" ++msgstr "" ++ ++msgid "Get PEM password from controlling tty before we daemonize" ++msgstr "" ++ ++msgid "HMAC authentication for packets" ++msgstr "" ++ ++msgid "Handling of authentication failures" ++msgstr "" ++ ++msgid "" ++"Helper directive to simplify the expression of --ping and --ping-restart in " ++"server mode configurations" ++msgstr "" ++ ++msgid "If hostname resolve fails, retry" ++msgstr "" ++"Αν αποτÏχει η μετατÏοπή του ονόματος του μηχανήματος σε IP, ξαναπÏοσπάθησε" ++ ++msgid "Instance \"%s\"" ++msgstr "" ++ ++msgid "Invalid" ++msgstr "" ++ ++msgid "Keep local IP address on restart" ++msgstr "" ++ ++msgid "Keep remote IP address on restart" ++msgstr "" ++ ++msgid "Keep tun/tap device open on restart" ++msgstr "" ++ ++msgid "Key transition window" ++msgstr "" ++ ++msgid "Limit repeated log messages" ++msgstr "" ++ ++msgid "Local certificate" ++msgstr "" ++ ++msgid "Local host name or ip address" ++msgstr "Όνομα Ï„Î¿Ï€Î¹ÎºÎ¿Ï Î¼Î·Ï‡Î±Î½Î®Î¼Î±Ï„Î¿Ï‚ ή διεÏθυνση IP" ++ ++msgid "Local private key" ++msgstr "" ++ ++msgid "Major mode" ++msgstr "" ++ ++msgid "Make tun device IPv6 capable" ++msgstr "" ++ ++msgid "Maximum number of queued TCP output packets" ++msgstr "" ++ ++msgid "Number of allocated broadcast buffers" ++msgstr "" ++ ++msgid "Number of lines for log file history" ++msgstr "" ++ ++msgid "Only accept connections from given X509 name" ++msgstr "" ++ ++msgid "Only process ping timeouts if routes exist" ++msgstr "" ++ ++msgid "OpenVPN" ++msgstr "OpenVPN" ++ ++msgid "OpenVPN instances" ++msgstr "ΔιεÏγασίες OpenVPN" ++ ++msgid "Optimize TUN/TAP/UDP writes" ++msgstr "" ++ ++msgid "Output to syslog and do not daemonize" ++msgstr "" ++ ++msgid "Overview" ++msgstr "" ++ ++msgid "PKCS#12 file containing keys" ++msgstr "" ++ ++msgid "Pass environment variables to script" ++msgstr "" ++ ++msgid "Persist replay-protection state" ++msgstr "" ++ ++msgid "Persist/unpersist ifconfig-pool" ++msgstr "" ++ ++msgid "Ping remote every n seconds over TCP/UDP port" ++msgstr "" ++ ++msgid "Policy level over usage of external programs and scripts" ++msgstr "" ++ ++msgid "Port" ++msgstr "ΘÏÏα" ++ ++msgid "Protocol" ++msgstr "ΠÏωτόκολλο" ++ ++msgid "Proxy timeout in seconds" ++msgstr "Τέλος χÏόνου μεσολαβητή σε δευτεÏόλεπτα" ++ ++msgid "Push an ifconfig option to remote" ++msgstr "" ++ ++msgid "Push options to peer" ++msgstr "" ++ ++msgid "Query management channel for private key" ++msgstr "" ++ ++msgid "Randomly choose remote server" ++msgstr "Τυχαία επιλογή απομακÏυσμένου διακομιστή" ++ ++msgid "Refuse connection if no custom client config" ++msgstr "" ++ ++msgid "Remap SIGUSR1 signals" ++msgstr "" ++ ++msgid "Remote host name or ip address" ++msgstr "Όνομα απομακÏυσμένου μηχανήματος ή διεÏθυνση IP" ++ ++msgid "Remote ping timeout" ++msgstr "" ++ ++msgid "Renegotiate data chan. key after bytes" ++msgstr "" ++ ++msgid "Renegotiate data chan. key after packets" ++msgstr "" ++ ++msgid "Renegotiate data chan. key after seconds" ++msgstr "" ++ ++msgid "Replay protection sliding window size" ++msgstr "" ++ ++msgid "Require explicit designation on certificate" ++msgstr "" ++ ++msgid "Require explicit key usage on certificate" ++msgstr "" ++ ++msgid "Restart after remote ping timeout" ++msgstr "" ++ ++msgid "Retransmit timeout on TLS control channel" ++msgstr "" ++ ++msgid "Retry indefinitely on HTTP proxy errors" ++msgstr "ΕπαναπÏοσπάθεια για πάντα αν υπάÏχουν λάθη HTTP στο μεσολαβητή" ++ ++msgid "Retry indefinitely on Socks proxy errors" ++msgstr "ΕπαναπÏοσπάθεια για πάντα σε πεÏίπτωση λαθών στο διαμεσολαβητή Socks5" ++ ++msgid "Route subnet to client" ++msgstr "" ++ ++msgid "Run as an inetd or xinetd server" ++msgstr "" ++ ++msgid "Run script cmd on client connection" ++msgstr "" ++ ++msgid "Run script cmd on client disconnection" ++msgstr "" ++ ++msgid "Run up/down scripts for all restarts" ++msgstr "" ++ ++msgid "Send notification to peer on disconnect" ++msgstr "" ++ ++msgid "Set GID to group" ++msgstr "" ++ ++msgid "Set TCP/UDP MTU" ++msgstr "" ++ ++msgid "Set UID to user" ++msgstr "" ++ ++msgid "Set aside a pool of subnets" ++msgstr "" ++ ++msgid "Set extended HTTP proxy options" ++msgstr "ΟÏισμός εκτεταμένων Ïυθμίσεων διαμεσολαβητή HTTP" ++ ++msgid "Set output verbosity" ++msgstr "" ++ ++msgid "Set size of real and virtual address hash tables" ++msgstr "" ++ ++msgid "Set the TCP/UDP receive buffer size" ++msgstr "" ++ ++msgid "Set the TCP/UDP send buffer size" ++msgstr "" ++ ++msgid "Set tun/tap TX queue length" ++msgstr "" ++ ++msgid "Set tun/tap adapter parameters" ++msgstr "" ++ ++msgid "Set tun/tap device MTU" ++msgstr "" ++ ++msgid "Set tun/tap device overhead" ++msgstr "" ++ ++msgid "Set upper bound on TCP MSS" ++msgstr "" ++ ++msgid "Shaping for peer bandwidth" ++msgstr "" ++ ++msgid "Shell cmd to execute after tun device open" ++msgstr "" ++ ++msgid "Shell cmd to run after tun device close" ++msgstr "" ++ ++msgid "Shell command to verify X509 name" ++msgstr "" ++ ++msgid "Silence the output of replay warnings" ++msgstr "" ++ ++msgid "Size of cipher key" ++msgstr "" ++ ++msgid "Specify a default gateway for routes" ++msgstr "" ++ ++msgid "Start OpenVPN in a hibernating state" ++msgstr "" ++ ++msgid "Start/Stop" ++msgstr "Εκκίνηση/ΤεÏματισμός" ++ ++msgid "Started" ++msgstr "Ξεκίνησε" ++ ++msgid "Status file format version" ++msgstr "" ++ ++msgid "Switch to advanced configuration »" ++msgstr "Μετάβαση στις Ï€ÏοχωÏημένες Ïυθμίσεις »" ++ ++msgid "TCP/UDP port # for both local and remote" ++msgstr "TCP/UDP νοÏμεÏο θÏÏας για το τοπικό και το απομακÏυσμένο" ++ ++msgid "TCP/UDP port # for local (default=1194)" ++msgstr "TCP/UDP αÏιθμός θÏÏας για το τοπικό (εξ'οÏισμοÏ=1194)" ++ ++msgid "TCP/UDP port # for remote (default=1194)" ++msgstr "TCP/UDP αÏιθμός θÏÏας για τον απομακÏυσμένο (εξ'οÏισμοÏ=1194)" ++ ++msgid "TLS cipher" ++msgstr "" ++ ++msgid "TOS passthrough (applies to IPv4 only)" ++msgstr "" ++ ++msgid "Temporary directory for client-connect return file" ++msgstr "" ++ ++msgid "Timeframe for key exchange" ++msgstr "" ++ ++msgid "Type of used device" ++msgstr "Είδος χÏησιμοποιοÏμενης συσκευής" ++ ++msgid "Use fast LZO compression" ++msgstr "" ++ ++msgid "Use individual addresses rather than /30 subnets" ++msgstr "" ++ ++msgid "Use protocol" ++msgstr "" ++ ++msgid "Use tun/tap device node" ++msgstr "" ++ ++msgid "Use username as common name" ++msgstr "" ++ ++msgid "Write log to file" ++msgstr "" ++ ++msgid "Write process ID to file" ++msgstr "" ++ ++msgid "Write status to file every n seconds" ++msgstr "" ++ ++msgid "no" ++msgstr "όχι" ++ ++msgid "tun/tap device" ++msgstr "Συσκευή tun/tap" ++ ++msgid "tun/tap inactivity timeout" ++msgstr "" ++ ++msgid "yes (%i)" ++msgstr "ναι (%i)" ++ ++msgid "« Switch to basic configuration" ++msgstr "« Μετάβαση στις βασικές επιλογές" ++ ++#~ msgid "Cryptography" ++#~ msgstr "ΚÏυπτογÏαφία" ++ ++#~ msgid "Service" ++#~ msgstr "ΥπηÏεσία" ++ ++#~ msgid "VPN" ++#~ msgstr "VPN" ++ ++#~ msgid "openvpn_%s" ++#~ msgstr "openvpn_%s" ++ ++#~ msgid "openvpn_%s_desc" ++#~ msgstr "openvpn_%s_desc" +diff --git a/feeds/luci/applications/luci-app-openvpn/po/en/openvpn.po b/feeds/luci/applications/luci-app-openvpn/po/en/openvpn.po +new file mode 100644 +index 0000000..e8d8961 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-openvpn/po/en/openvpn.po +@@ -0,0 +1,540 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Report-Msgid-Bugs-To: \n" ++"POT-Creation-Date: 2009-05-19 19:35+0200\n" ++"PO-Revision-Date: 2012-04-03 08:45+0200\n" ++"Last-Translator: juhosg \n" ++"Language-Team: LANGUAGE \n" ++"Language: en\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n != 1);\n" ++"X-Generator: Pootle 2.0.4\n" ++ ++msgid "%s" ++msgstr "" ++ ++msgid "'net30', 'p2p', or 'subnet'" ++msgstr "'net30', 'p2p', or 'subnet'" ++ ++msgid "Accept options pushed from server" ++msgstr "Accept options pushed from server" ++ ++msgid "Add" ++msgstr "" ++ ++msgid "Add route after establishing connection" ++msgstr "Add route after establishing connection" ++ ++msgid "Additional authentication over TLS" ++msgstr "Additional authentication over TLS" ++ ++msgid "Allow client-to-client traffic" ++msgstr "Allow client-to-client traffic" ++ ++msgid "Allow multiple clients with same certificate" ++msgstr "Allow multiple clients with same certificate" ++ ++msgid "Allow only one session" ++msgstr "Allow only one session" ++ ++msgid "Allow remote to change its IP or port" ++msgstr "Allow remote to change its IP or port" ++ ++msgid "Allowed maximum of connected clients" ++msgstr "Allowed maximum of connected clients" ++ ++msgid "Allowed maximum of internal" ++msgstr "Allowed maximum of internal" ++ ++msgid "Allowed maximum of new connections" ++msgstr "Allowed maximum of new connections" ++ ++msgid "Append log to file" ++msgstr "Append log to file" ++ ++msgid "Authenticate using username/password" ++msgstr "Authenticate using username/password" ++ ++msgid "Automatically redirect default route" ++msgstr "Automatically redirect default route" ++ ++msgid "Below is a list of configured OpenVPN instances and their current state" ++msgstr "" ++"Below is a list of configured OpenVPN instances and their current state" ++ ++msgid "Call down cmd/script before TUN/TAP close" ++msgstr "Call down cmd/script before TUN/TAP close" ++ ++msgid "Certificate authority" ++msgstr "Certificate authority" ++ ++msgid "Change process priority" ++msgstr "Change process priority" ++ ++msgid "Change to directory before initialization" ++msgstr "Change to directory before initialization" ++ ++msgid "Check peer certificate against a CRL" ++msgstr "Check peer certificate against a CRL" ++ ++msgid "Chroot to directory after initialization" ++msgstr "Chroot to directory after initialization" ++ ++msgid "Client is disabled" ++msgstr "Client is disabled" ++ ++msgid "Configuration category" ++msgstr "" ++ ++msgid "Configure client mode" ++msgstr "Configure client mode" ++ ++msgid "Configure server bridge" ++msgstr "Configure server bridge" ++ ++msgid "Configure server mode" ++msgstr "Configure server mode" ++ ++msgid "Connect through Socks5 proxy" ++msgstr "Connect through Socks5 proxy" ++ ++msgid "Connect to remote host through an HTTP proxy" ++msgstr "" ++ ++msgid "Connection retry interval" ++msgstr "Connection retry interval" ++ ++msgid "Daemonize after initialization" ++msgstr "Daemonize after initialization" ++ ++msgid "Delay n seconds after connection" ++msgstr "" ++ ++msgid "Delay tun/tap open and up script execution" ++msgstr "Delay tun/tap open and up script execution" ++ ++msgid "Diffie Hellman parameters" ++msgstr "Diffie Hellman parameters" ++ ++msgid "Directory for custom client config files" ++msgstr "Directory for custom client config files" ++ ++msgid "Disable Paging" ++msgstr "Disable Paging" ++ ++msgid "Disable cipher initialisation vector" ++msgstr "Disable cipher initialisation vector" ++ ++msgid "Disable options consistency check" ++msgstr "Disable options consistency check" ++ ++msgid "Disable replay protection" ++msgstr "Disable replay protection" ++ ++msgid "Do not bind to local address and port" ++msgstr "Do not bind to local address and port" ++ ++msgid "Don't actually execute ifconfig" ++msgstr "Don't actually execute ifconfig" ++ ++msgid "Don't add routes automatically" ++msgstr "Don't add routes automatically" ++ ++msgid "Don't cache --askpass or --auth-user-pass passwords" ++msgstr "Don't cache --askpass or --auth-user-pass passwords" ++ ++msgid "Don't inherit global push options" ++msgstr "Don't inherit global push options" ++ ++msgid "Don't log timestamps" ++msgstr "Don't log timestamps" ++ ++msgid "Don't re-read key on restart" ++msgstr "Don't re-read key on restart" ++ ++msgid "Don't require client certificate" ++msgstr "Don't require client certificate" ++ ++msgid "Don't use adaptive lzo compression" ++msgstr "Don't use adaptive lzo compression" ++ ++msgid "Don't warn on ifconfig inconsistencies" ++msgstr "Don't warn on ifconfig inconsistencies" ++ ++msgid "Echo parameters to log" ++msgstr "Echo parameters to log" ++ ++msgid "Empirically measure MTU" ++msgstr "Empirically measure MTU" ++ ++msgid "Enable OpenSSL hardware crypto engines" ++msgstr "Enable OpenSSL hardware crypto engines" ++ ++msgid "Enable Path MTU discovery" ++msgstr "Enable Path MTU discovery" ++ ++msgid "Enable Static Key encryption mode (non-TLS)" ++msgstr "Enable Static Key encryption mode (non-TLS)" ++ ++msgid "Enable TLS and assume client role" ++msgstr "Enable TLS and assume client role" ++ ++msgid "Enable TLS and assume server role" ++msgstr "Enable TLS and assume server role" ++ ++msgid "Enable internal datagram fragmentation" ++msgstr "Enable internal datagram fragmentation" ++ ++msgid "Enable management interface on IP port" ++msgstr "Enable management interface on IP port" ++ ++msgid "Enabled" ++msgstr "Enabled" ++ ++msgid "Encryption cipher for packets" ++msgstr "Encryption cipher for packets" ++ ++msgid "Execute shell cmd after routes are added" ++msgstr "Execute shell cmd after routes are added" ++ ++msgid "Execute shell command on remote ip change" ++msgstr "Execute shell command on remote ip change" ++ ++msgid "" ++"Executed in server mode on new client connections, when the client is still " ++"untrusted" ++msgstr "" ++ ++msgid "" ++"Executed in server mode whenever an IPv4 address/route or MAC address is " ++"added to OpenVPN's internal routing table" ++msgstr "" ++ ++msgid "Exit on TLS negotiation failure" ++msgstr "Exit on TLS negotiation failure" ++ ++msgid "Get PEM password from controlling tty before we daemonize" ++msgstr "Get PEM password from controlling tty before we daemonize" ++ ++msgid "HMAC authentication for packets" ++msgstr "HMAC authentication for packets" ++ ++msgid "Handling of authentication failures" ++msgstr "Handling of authentication failures" ++ ++msgid "" ++"Helper directive to simplify the expression of --ping and --ping-restart in " ++"server mode configurations" ++msgstr "" ++ ++msgid "If hostname resolve fails, retry" ++msgstr "If hostname resolve fails, retry" ++ ++msgid "Instance \"%s\"" ++msgstr "Instance \"%s\"" ++ ++msgid "Invalid" ++msgstr "" ++ ++msgid "Keep local IP address on restart" ++msgstr "Keep local IP address on restart" ++ ++msgid "Keep remote IP address on restart" ++msgstr "Keep remote IP address on restart" ++ ++msgid "Keep tun/tap device open on restart" ++msgstr "Keep tun/tap device open on restart" ++ ++msgid "Key transition window" ++msgstr "Key transition window" ++ ++msgid "Limit repeated log messages" ++msgstr "Limit repeated log messages" ++ ++msgid "Local certificate" ++msgstr "Local certificate" ++ ++msgid "Local host name or ip address" ++msgstr "Local host name or ip address" ++ ++msgid "Local private key" ++msgstr "Local private key" ++ ++msgid "Major mode" ++msgstr "Major mode" ++ ++msgid "Make tun device IPv6 capable" ++msgstr "Make tun device IPv6 capable" ++ ++msgid "Maximum number of queued TCP output packets" ++msgstr "Maximum number of queued TCP output packets" ++ ++msgid "Number of allocated broadcast buffers" ++msgstr "Number of allocated broadcast buffers" ++ ++msgid "Number of lines for log file history" ++msgstr "Number of lines for log file history" ++ ++msgid "Only accept connections from given X509 name" ++msgstr "Only accept connections from given X509 name" ++ ++msgid "Only process ping timeouts if routes exist" ++msgstr "Only process ping timeouts if routes exist" ++ ++msgid "OpenVPN" ++msgstr "OpenVPN" ++ ++msgid "OpenVPN instances" ++msgstr "OpenVPN instances" ++ ++msgid "Optimize TUN/TAP/UDP writes" ++msgstr "Optimize TUN/TAP/UDP writes" ++ ++msgid "Output to syslog and do not daemonize" ++msgstr "Output to syslog and do not daemonize" ++ ++msgid "Overview" ++msgstr "" ++ ++msgid "PKCS#12 file containing keys" ++msgstr "PKCS#12 file containing keys" ++ ++msgid "Pass environment variables to script" ++msgstr "Pass environment variables to script" ++ ++msgid "Persist replay-protection state" ++msgstr "Persist replay-protection state" ++ ++msgid "Persist/unpersist ifconfig-pool" ++msgstr "Persist/unpersist ifconfig-pool" ++ ++msgid "Ping remote every n seconds over TCP/UDP port" ++msgstr "Ping remote every n seconds over TCP/UDP port" ++ ++msgid "Policy level over usage of external programs and scripts" ++msgstr "" ++ ++msgid "Port" ++msgstr "Port" ++ ++msgid "Protocol" ++msgstr "Protocol" ++ ++msgid "Proxy timeout in seconds" ++msgstr "Proxy timeout in seconds" ++ ++msgid "Push an ifconfig option to remote" ++msgstr "Push an ifconfig option to remote" ++ ++msgid "Push options to peer" ++msgstr "Push options to peer" ++ ++msgid "Query management channel for private key" ++msgstr "Query management channel for private key" ++ ++msgid "Randomly choose remote server" ++msgstr "Randomly choose remote server" ++ ++msgid "Refuse connection if no custom client config" ++msgstr "Refuse connection if no custom client config" ++ ++msgid "Remap SIGUSR1 signals" ++msgstr "Remap SIGUSR1 signals" ++ ++msgid "Remote host name or ip address" ++msgstr "Remote host name or ip address" ++ ++msgid "Remote ping timeout" ++msgstr "Remote ping timeout" ++ ++msgid "Renegotiate data chan. key after bytes" ++msgstr "Renegotiate data chan. key after bytes" ++ ++msgid "Renegotiate data chan. key after packets" ++msgstr "Renegotiate data chan. key after packets" ++ ++msgid "Renegotiate data chan. key after seconds" ++msgstr "Renegotiate data chan. key after seconds" ++ ++msgid "Replay protection sliding window size" ++msgstr "Replay protection sliding window size" ++ ++msgid "Require explicit designation on certificate" ++msgstr "Require explicit designation on certificate" ++ ++msgid "Require explicit key usage on certificate" ++msgstr "Require explicit key usage on certificate" ++ ++msgid "Restart after remote ping timeout" ++msgstr "Restart after remote ping timeout" ++ ++msgid "Retransmit timeout on TLS control channel" ++msgstr "Retransmit timeout on TLS control channel" ++ ++msgid "Retry indefinitely on HTTP proxy errors" ++msgstr "Retry indefinitely on HTTP proxy errors" ++ ++msgid "Retry indefinitely on Socks proxy errors" ++msgstr "Retry indefinitely on Socks proxy errors" ++ ++msgid "Route subnet to client" ++msgstr "Route subnet to client" ++ ++msgid "Run as an inetd or xinetd server" ++msgstr "Run as an inetd or xinetd server" ++ ++msgid "Run script cmd on client connection" ++msgstr "Run script cmd on client connection" ++ ++msgid "Run script cmd on client disconnection" ++msgstr "Run script cmd on client disconnection" ++ ++msgid "Run up/down scripts for all restarts" ++msgstr "Run up/down scripts for all restarts" ++ ++msgid "Send notification to peer on disconnect" ++msgstr "Send notification to peer on disconnect" ++ ++msgid "Set GID to group" ++msgstr "Set GID to group" ++ ++msgid "Set TCP/UDP MTU" ++msgstr "Set TCP/UDP MTU" ++ ++msgid "Set UID to user" ++msgstr "Set UID to user" ++ ++msgid "Set aside a pool of subnets" ++msgstr "Set aside a pool of subnets" ++ ++msgid "Set extended HTTP proxy options" ++msgstr "Set extended HTTP proxy options" ++ ++msgid "Set output verbosity" ++msgstr "Set output verbosity" ++ ++msgid "Set size of real and virtual address hash tables" ++msgstr "Set size of real and virtual address hash tables" ++ ++msgid "Set the TCP/UDP receive buffer size" ++msgstr "Set the TCP/UDP receive buffer size" ++ ++msgid "Set the TCP/UDP send buffer size" ++msgstr "Set the TCP/UDP send buffer size" ++ ++msgid "Set tun/tap TX queue length" ++msgstr "Set tun/tap TX queue length" ++ ++msgid "Set tun/tap adapter parameters" ++msgstr "" ++ ++msgid "Set tun/tap device MTU" ++msgstr "Set tun/tap device MTU" ++ ++msgid "Set tun/tap device overhead" ++msgstr "Set tun/tap device overhead" ++ ++msgid "Set upper bound on TCP MSS" ++msgstr "Set upper bound on TCP MSS" ++ ++msgid "Shaping for peer bandwidth" ++msgstr "Shaping for peer bandwidth" ++ ++msgid "Shell cmd to execute after tun device open" ++msgstr "Shell cmd to execute after tun device open" ++ ++msgid "Shell cmd to run after tun device close" ++msgstr "Shell cmd to run after tun device close" ++ ++msgid "Shell command to verify X509 name" ++msgstr "Shell command to verify X509 name" ++ ++msgid "Silence the output of replay warnings" ++msgstr "Silence the output of replay warnings" ++ ++msgid "Size of cipher key" ++msgstr "Size of cipher key" ++ ++msgid "Specify a default gateway for routes" ++msgstr "Specify a default gateway for routes" ++ ++msgid "Start OpenVPN in a hibernating state" ++msgstr "Start OpenVPN in a hibernating state" ++ ++msgid "Start/Stop" ++msgstr "" ++ ++msgid "Started" ++msgstr "Started" ++ ++msgid "Status file format version" ++msgstr "Status file format version" ++ ++msgid "Switch to advanced configuration »" ++msgstr "Switch to advanced configuration »" ++ ++msgid "TCP/UDP port # for both local and remote" ++msgstr "TCP/UDP port # for both local and remote" ++ ++msgid "TCP/UDP port # for local (default=1194)" ++msgstr "TCP/UDP port # for local (default=1194)" ++ ++msgid "TCP/UDP port # for remote (default=1194)" ++msgstr "TCP/UDP port # for remote (default=1194)" ++ ++msgid "TLS cipher" ++msgstr "TLS cipher" ++ ++msgid "TOS passthrough (applies to IPv4 only)" ++msgstr "TOS passthrough (applies to IPv4 only)" ++ ++msgid "Temporary directory for client-connect return file" ++msgstr "Temporary directory for client-connect return file" ++ ++msgid "Timeframe for key exchange" ++msgstr "Timeframe for key exchange" ++ ++msgid "Type of used device" ++msgstr "Type of used device" ++ ++msgid "Use fast LZO compression" ++msgstr "Use fast LZO compression" ++ ++msgid "Use individual addresses rather than /30 subnets" ++msgstr "Use individual addresses rather than /30 subnets" ++ ++msgid "Use protocol" ++msgstr "Use protocol" ++ ++msgid "Use tun/tap device node" ++msgstr "Use tun/tap device node" ++ ++msgid "Use username as common name" ++msgstr "Use username as common name" ++ ++msgid "Write log to file" ++msgstr "Write log to file" ++ ++msgid "Write process ID to file" ++msgstr "Write process ID to file" ++ ++msgid "Write status to file every n seconds" ++msgstr "Write status to file every n seconds" ++ ++msgid "no" ++msgstr "no" ++ ++msgid "tun/tap device" ++msgstr "tun/tap device" ++ ++msgid "tun/tap inactivity timeout" ++msgstr "tun/tap inactivity timeout" ++ ++msgid "yes (%i)" ++msgstr "yes (%i)" ++ ++msgid "« Switch to basic configuration" ++msgstr "« Switch to basic configuration" +diff --git a/feeds/luci/applications/luci-app-openvpn/po/es/openvpn.po b/feeds/luci/applications/luci-app-openvpn/po/es/openvpn.po +new file mode 100644 +index 0000000..7c9a2d4 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-openvpn/po/es/openvpn.po +@@ -0,0 +1,559 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Report-Msgid-Bugs-To: \n" ++"POT-Creation-Date: 2009-06-10 03:41+0200\n" ++"PO-Revision-Date: 2013-09-01 09:09+0200\n" ++"Last-Translator: José Vicente \n" ++"Language-Team: LANGUAGE \n" ++"Language: es\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n != 1);\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "%s" ++msgstr "%s" ++ ++msgid "'net30', 'p2p', or 'subnet'" ++msgstr "'net30', 'p2p', o 'subnet'" ++ ++msgid "Accept options pushed from server" ++msgstr "Aceptar opciones envidadas desde el servidor" ++ ++msgid "Add" ++msgstr "Añadir" ++ ++msgid "Add route after establishing connection" ++msgstr "Añadir la ruta tras establecer la conexión" ++ ++msgid "Additional authentication over TLS" ++msgstr "Autentificación adicional con TLS" ++ ++msgid "Allow client-to-client traffic" ++msgstr "Permitir el tráfico cliente-a-cliente" ++ ++msgid "Allow multiple clients with same certificate" ++msgstr "Permitir múltiples clientes con el mismo certificado" ++ ++msgid "Allow only one session" ++msgstr "Permitir sólo una sesión" ++ ++msgid "Allow remote to change its IP or port" ++msgstr "Permitir al conectado cambiar su IP o puerto" ++ ++msgid "Allowed maximum of connected clients" ++msgstr "Máximo de clientes conectados" ++ ++msgid "Allowed maximum of internal" ++msgstr "Máximo de internos" ++ ++msgid "Allowed maximum of new connections" ++msgstr "Máximo de nuevas conexiones" ++ ++msgid "Append log to file" ++msgstr "Unir registro al archivo" ++ ++msgid "Authenticate using username/password" ++msgstr "Autentificar con nombre usuario y contraseña" ++ ++msgid "Automatically redirect default route" ++msgstr "Redirigir automáticamente la ruta por defecto" ++ ++msgid "Below is a list of configured OpenVPN instances and their current state" ++msgstr "Instancias OpenVPN configuradas y estado actual" ++ ++msgid "Call down cmd/script before TUN/TAP close" ++msgstr "Comando/script a llamar al cerrar el dispositivo TUn/TAP" ++ ++msgid "Certificate authority" ++msgstr "Autoridad certificativa" ++ ++msgid "Change process priority" ++msgstr "Cambiar la prioridad del proceso" ++ ++msgid "Change to directory before initialization" ++msgstr "Cambiar a este directorio antes de inicializar" ++ ++msgid "Check peer certificate against a CRL" ++msgstr "Comprobar certificados contra un CRL" ++ ++msgid "Chroot to directory after initialization" ++msgstr "Restringir a este directorio tras inicializar" ++ ++msgid "Client is disabled" ++msgstr "Cliente desactivado" ++ ++msgid "Configuration category" ++msgstr "Categoría de configuración" ++ ++msgid "Configure client mode" ++msgstr "Configurar el modo cliente" ++ ++msgid "Configure server bridge" ++msgstr "Configurar el puente servidor" ++ ++msgid "Configure server mode" ++msgstr "Configurar el modo servidor" ++ ++msgid "Connect through Socks5 proxy" ++msgstr "Conectar por un proxy Socks5" ++ ++msgid "Connect to remote host through an HTTP proxy" ++msgstr "Conectar a la máquina remota usando un proxy HTTP" ++ ++msgid "Connection retry interval" ++msgstr "Intervalo de reconexión" ++ ++msgid "Daemonize after initialization" ++msgstr "Demonizar tras inicialización" ++ ++msgid "Delay n seconds after connection" ++msgstr "Espera tras conexión (segundos)" ++ ++msgid "Delay tun/tap open and up script execution" ++msgstr "Espera para la apertura TUN/TAP y ejecución del script de arranque" ++ ++msgid "Diffie Hellman parameters" ++msgstr "Parámetros Diffie-Hellman" ++ ++msgid "Directory for custom client config files" ++msgstr "Directorio de configuraciones personalizadas" ++ ++msgid "Disable Paging" ++msgstr "Desactivar paginación" ++ ++msgid "Disable cipher initialisation vector" ++msgstr "Desactivar vector de inicialización de cifrado" ++ ++msgid "Disable options consistency check" ++msgstr "Desactivar comprobación de consistencia de opciones" ++ ++msgid "Disable replay protection" ++msgstr "Desactivar la protección contra reproducción" ++ ++msgid "Do not bind to local address and port" ++msgstr "No asociar a un puerto y dirección locales" ++ ++msgid "Don't actually execute ifconfig" ++msgstr "No ejecutar ifconfig" ++ ++msgid "Don't add routes automatically" ++msgstr "No añadir rutas automáticamente" ++ ++msgid "Don't cache --askpass or --auth-user-pass passwords" ++msgstr "No guardar las contraseñas --askpass o --auth-user-pass" ++ ++msgid "Don't inherit global push options" ++msgstr "No heredar opciones push globales" ++ ++msgid "Don't log timestamps" ++msgstr "No guardar en registro horas" ++ ++msgid "Don't re-read key on restart" ++msgstr "No releer la clave al rearrancar" ++ ++msgid "Don't require client certificate" ++msgstr "No es necesario certificado cliente" ++ ++msgid "Don't use adaptive lzo compression" ++msgstr "No usar compresión adaptativa LZO" ++ ++msgid "Don't warn on ifconfig inconsistencies" ++msgstr "No avisar de inconsistencias en ifconfig" ++ ++msgid "Echo parameters to log" ++msgstr "Guardar parámetros en el registro" ++ ++msgid "Empirically measure MTU" ++msgstr "Medir MTU empíricamente" ++ ++msgid "Enable OpenSSL hardware crypto engines" ++msgstr "Motor criptográfico por hardware OpenSSL" ++ ++msgid "Enable Path MTU discovery" ++msgstr "Detección de MTU" ++ ++msgid "Enable Static Key encryption mode (non-TLS)" ++msgstr "Modo de encriptado de clave estática (no-TLS)" ++ ++msgid "Enable TLS and assume client role" ++msgstr "Activar TLS y asumir el papel de cliente" ++ ++msgid "Enable TLS and assume server role" ++msgstr "Activar TLS y asumir el papel de servidor" ++ ++msgid "Enable internal datagram fragmentation" ++msgstr "Fragmentación de datagramas interna" ++ ++msgid "Enable management interface on IP port" ++msgstr "Interfaz de gestión en IP puerto" ++ ++msgid "Enabled" ++msgstr "Activado" ++ ++msgid "Encryption cipher for packets" ++msgstr "Cifra de encriptación de paquetes" ++ ++msgid "Execute shell cmd after routes are added" ++msgstr "Comandos a ejecutar tras añadir rutas" ++ ++msgid "Execute shell command on remote ip change" ++msgstr "Comando a ejecutar si se cambia la IP remota" ++ ++msgid "" ++"Executed in server mode on new client connections, when the client is still " ++"untrusted" ++msgstr "" ++"Ejecutado en modo servidor en nuevas conexiones de clientes, cuando no se " ++"confía aún en el cliente" ++ ++msgid "" ++"Executed in server mode whenever an IPv4 address/route or MAC address is " ++"added to OpenVPN's internal routing table" ++msgstr "" ++"Ejecutado en modo servidor cuando una ruta, dirección IPv4 o dirección MAC " ++"se añade a la tabla de rutas interna de OpenVPN" ++ ++msgid "Exit on TLS negotiation failure" ++msgstr "Salir si falla la negociación" ++ ++msgid "Get PEM password from controlling tty before we daemonize" ++msgstr "Obtener la clave PEM del tty de control antes de demonizar" ++ ++msgid "HMAC authentication for packets" ++msgstr "Autentificación HMAC de paquetes" ++ ++msgid "Handling of authentication failures" ++msgstr "Gestión de fallos de autentificación" ++ ++msgid "" ++"Helper directive to simplify the expression of --ping and --ping-restart in " ++"server mode configurations" ++msgstr "" ++"Directriz para simplificar la expresión de --ping y --ping-restart en " ++"configuraciones en modo servido" ++ ++msgid "If hostname resolve fails, retry" ++msgstr "Reintentar si falla la resolución de nombre de máquina" ++ ++msgid "Instance \"%s\"" ++msgstr "Instancia \"%s\"" ++ ++msgid "Invalid" ++msgstr "No válido" ++ ++msgid "Keep local IP address on restart" ++msgstr "Mantener la dirección IP local al rearrancar" ++ ++msgid "Keep remote IP address on restart" ++msgstr "Mantener la dirección IP remota al rearrancar" ++ ++msgid "Keep tun/tap device open on restart" ++msgstr "Mantener el dispositivo TUN/TAP abierto al rearrancar" ++ ++msgid "Key transition window" ++msgstr "Ventana de transición de clave" ++ ++msgid "Limit repeated log messages" ++msgstr "Limitar mensajes repetidos al registro" ++ ++msgid "Local certificate" ++msgstr "Certificado local" ++ ++msgid "Local host name or ip address" ++msgstr "Nombre de máquina local o dirección IP" ++ ++msgid "Local private key" ++msgstr "Clave privada local" ++ ++msgid "Major mode" ++msgstr "Modo principal" ++ ++msgid "Make tun device IPv6 capable" ++msgstr "Habilitar IPv6 en dispositivo TUN" ++ ++msgid "Maximum number of queued TCP output packets" ++msgstr "Paquetes máximos en la cola de salida TCP" ++ ++msgid "Number of allocated broadcast buffers" ++msgstr "Número de buffers de propagación" ++ ++msgid "Number of lines for log file history" ++msgstr "Líneas en el archivo de registro histórico" ++ ++msgid "Only accept connections from given X509 name" ++msgstr "Aceptar solo conexiones desde este nombre X509" ++ ++msgid "Only process ping timeouts if routes exist" ++msgstr "Procesa solo las esperas a ping si existe la ruta" ++ ++msgid "OpenVPN" ++msgstr "OpenVPN" ++ ++msgid "OpenVPN instances" ++msgstr "Instancias OpenVPN" ++ ++msgid "Optimize TUN/TAP/UDP writes" ++msgstr "Optimizar escrituras TUN/TAP/UDP" ++ ++msgid "Output to syslog and do not daemonize" ++msgstr "Escribir en SysLog y no demonizar" ++ ++msgid "Overview" ++msgstr "Resumen" ++ ++msgid "PKCS#12 file containing keys" ++msgstr "Archivo PKCS#12 de claves" ++ ++msgid "Pass environment variables to script" ++msgstr "Pasar variables de entorno al script" ++ ++msgid "Persist replay-protection state" ++msgstr "Estado continuo de protección antireproducción" ++ ++msgid "Persist/unpersist ifconfig-pool" ++msgstr "Mantener/no mantener el listado de interfaces" ++ ++msgid "Ping remote every n seconds over TCP/UDP port" ++msgstr "Ping al remoto cada n segundos sobre un puerto TCP/UDP" ++ ++msgid "Policy level over usage of external programs and scripts" ++msgstr "Política sobre el uso de programas externos y scripts" ++ ++msgid "Port" ++msgstr "Puerto" ++ ++msgid "Protocol" ++msgstr "Protocolo" ++ ++msgid "Proxy timeout in seconds" ++msgstr "Espera del proxy en segundos" ++ ++msgid "Push an ifconfig option to remote" ++msgstr "Enviar un opción de ifconfig al puesto remoto" ++ ++msgid "Push options to peer" ++msgstr "Enviar opciones al otro" ++ ++msgid "Query management channel for private key" ++msgstr "Consulta el canal de gestión por la clave privada" ++ ++msgid "Randomly choose remote server" ++msgstr "Elegir aleatoriamente un servidor remoto" ++ ++msgid "Refuse connection if no custom client config" ++msgstr "" ++"Rechazar conexión si no tiene una configuración de cliente personalizada" ++ ++msgid "Remap SIGUSR1 signals" ++msgstr "Redirigir señales SIGUSR1" ++ ++msgid "Remote host name or ip address" ++msgstr "Nombre de máquina remota o dirección IP" ++ ++msgid "Remote ping timeout" ++msgstr "Espera a ping remoto" ++ ++msgid "Renegotiate data chan. key after bytes" ++msgstr "Bytes tras los que renegociar la clave del canal del datos" ++ ++msgid "Renegotiate data chan. key after packets" ++msgstr "Paquetes tras los que renegociar la clave del canal del datos" ++ ++msgid "Renegotiate data chan. key after seconds" ++msgstr "Segundos tras los que renegociar la clave del canal del datos" ++ ++msgid "Replay protection sliding window size" ++msgstr "Tamaño de la ventana deslizante de la protección de reproducción" ++ ++msgid "Require explicit designation on certificate" ++msgstr "Designación explícita de certificado" ++ ++msgid "Require explicit key usage on certificate" ++msgstr "Clave de uso explícita de certificado" ++ ++msgid "Restart after remote ping timeout" ++msgstr "Rearrancar tras espera del ping remoto" ++ ++msgid "Retransmit timeout on TLS control channel" ++msgstr "Espera de retransmisión en el canal de control TLS" ++ ++msgid "Retry indefinitely on HTTP proxy errors" ++msgstr "Reintentar indefinidamente en errores del proxy HTTP" ++ ++msgid "Retry indefinitely on Socks proxy errors" ++msgstr "Reintentar indefinidamente en errores del proxy Socks" ++ ++msgid "Route subnet to client" ++msgstr "Enrutar subred a cliente" ++ ++msgid "Run as an inetd or xinetd server" ++msgstr "Ejecutar como servidor inetd o xinetd" ++ ++msgid "Run script cmd on client connection" ++msgstr "Script a ejecutar tras una conexión de cliente" ++ ++msgid "Run script cmd on client disconnection" ++msgstr "Script a ejecutar tras una desconexión de cliente" ++ ++msgid "Run up/down scripts for all restarts" ++msgstr "Ejecutar scripts de activación/desactivación en todos los rearranques" ++ ++msgid "Send notification to peer on disconnect" ++msgstr "Enviar notificación al otro en caso de desconexión" ++ ++msgid "Set GID to group" ++msgstr "GID del grupo" ++ ++msgid "Set TCP/UDP MTU" ++msgstr "MTU TCP/UDP" ++ ++msgid "Set UID to user" ++msgstr "UID del usuario" ++ ++msgid "Set aside a pool of subnets" ++msgstr "Reservar un bloque de subredes" ++ ++msgid "Set extended HTTP proxy options" ++msgstr "Opciones HTTP extendidas del proxy" ++ ++msgid "Set output verbosity" ++msgstr "Nivel de detalle de mensajes" ++ ++msgid "Set size of real and virtual address hash tables" ++msgstr "Tamaño de las tablas real y virtual de hashes" ++ ++msgid "Set the TCP/UDP receive buffer size" ++msgstr "Tamaño del búfer de recepción TCP/UDP" ++ ++msgid "Set the TCP/UDP send buffer size" ++msgstr "Tamaño del búfer de envío TCP/UDP" ++ ++msgid "Set tun/tap TX queue length" ++msgstr "Longitud de la cola de transmisión TUN/TAP" ++ ++msgid "Set tun/tap adapter parameters" ++msgstr "Parámetros del adaptador TUN/TAP" ++ ++msgid "Set tun/tap device MTU" ++msgstr "MTU del dispositivo TUN/TAP" ++ ++msgid "Set tun/tap device overhead" ++msgstr "Sobrecarga del dispositivo TUN/TAP" ++ ++msgid "Set upper bound on TCP MSS" ++msgstr "Límite superior de MSS de TCP" ++ ++msgid "Shaping for peer bandwidth" ++msgstr "Adaptar ancho de banda de clientes" ++ ++msgid "Shell cmd to execute after tun device open" ++msgstr "Comando shell a ejecutar tras abrir el dispositivo TUN" ++ ++msgid "Shell cmd to run after tun device close" ++msgstr "Comando shell a ejecutar tras cerrar el dispositivo TUN" ++ ++msgid "Shell command to verify X509 name" ++msgstr "Comando shell a ejecutar para verificar un nombre X509" ++ ++msgid "Silence the output of replay warnings" ++msgstr "No mostrar avisos de reproducción" ++ ++msgid "Size of cipher key" ++msgstr "Tamaño de la clave de cifrado" ++ ++msgid "Specify a default gateway for routes" ++msgstr "Gateway por defecto" ++ ++msgid "Start OpenVPN in a hibernating state" ++msgstr "Arrancar OpenVPN en estado hibernado" ++ ++msgid "Start/Stop" ++msgstr "Arrancar/Parar" ++ ++msgid "Started" ++msgstr "Arrancado" ++ ++msgid "Status file format version" ++msgstr "Versión del formato del fichero de estado" ++ ++msgid "Switch to advanced configuration »" ++msgstr "Cambiar a configuración avanzada »" ++ ++msgid "TCP/UDP port # for both local and remote" ++msgstr "Número de puerto TCP/UDP para local y remoto" ++ ++msgid "TCP/UDP port # for local (default=1194)" ++msgstr "Número de puerto TCP/UDP para local (default=1194)" ++ ++msgid "TCP/UDP port # for remote (default=1194)" ++msgstr "Número de puerto TCP/UDP para remoto (default=1194)" ++ ++msgid "TLS cipher" ++msgstr "Cifra TLS" ++ ++msgid "TOS passthrough (applies to IPv4 only)" ++msgstr "Paso a través TOS (sólo para IPv4)" ++ ++msgid "Temporary directory for client-connect return file" ++msgstr "" ++"Directorio temporal para el fichero de retorno de la conexión del cliente" ++ ++msgid "Timeframe for key exchange" ++msgstr "Tiempo de intercambio de clave" ++ ++msgid "Type of used device" ++msgstr "Tipo de dispositivo usado" ++ ++msgid "Use fast LZO compression" ++msgstr "Compresión rápida LZO" ++ ++msgid "Use individual addresses rather than /30 subnets" ++msgstr "Direcciones individuales en vez de subredes /30" ++ ++msgid "Use protocol" ++msgstr "Protocolo" ++ ++msgid "Use tun/tap device node" ++msgstr "Nodo de dispositivo TUN/TAP" ++ ++msgid "Use username as common name" ++msgstr "Nombre de usuario como nombre común" ++ ++msgid "Write log to file" ++msgstr "Escribir registro a fichero" ++ ++msgid "Write process ID to file" ++msgstr "Escribir ID del proceso a fichero" ++ ++msgid "Write status to file every n seconds" ++msgstr "Segundos tras los que escribir el fichero de estado" ++ ++msgid "no" ++msgstr "no" ++ ++msgid "tun/tap device" ++msgstr "dispositivo TUN/TAP" ++ ++msgid "tun/tap inactivity timeout" ++msgstr "Espera de inactividad tun/tap" ++ ++msgid "yes (%i)" ++msgstr "sí (%i)" ++ ++msgid "« Switch to basic configuration" ++msgstr "« Cambiar a configuración básica" ++ ++#~ msgid "Cryptography" ++#~ msgstr "Criptografía" ++ ++#~ msgid "Networking" ++#~ msgstr "Red" ++ ++#~ msgid "Service" ++#~ msgstr "Servicio" ++ ++#~ msgid "VPN" ++#~ msgstr "VPN" +diff --git a/feeds/luci/applications/luci-app-openvpn/po/fr/openvpn.po b/feeds/luci/applications/luci-app-openvpn/po/fr/openvpn.po +new file mode 100644 +index 0000000..cbfd1f5 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-openvpn/po/fr/openvpn.po +@@ -0,0 +1,580 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Report-Msgid-Bugs-To: \n" ++"POT-Creation-Date: 2009-05-19 19:36+0200\n" ++"PO-Revision-Date: 2014-01-26 12:53+0200\n" ++"Last-Translator: kyas \n" ++"Language-Team: LANGUAGE \n" ++"Language: fr\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n > 1);\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "%s" ++msgstr "%s" ++ ++msgid "'net30', 'p2p', or 'subnet'" ++msgstr "'net30', 'p2p' ou 'subnet'" ++ ++msgid "Accept options pushed from server" ++msgstr "Accepter les options envoyées par le serveur" ++ ++msgid "Add" ++msgstr "Ajouter" ++ ++msgid "Add route after establishing connection" ++msgstr "Ajouter un routage après l'établissement de la connexion" ++ ++msgid "Additional authentication over TLS" ++msgstr "Authentification supplémentaire par dessus TLS" ++ ++msgid "Allow client-to-client traffic" ++msgstr "Autoriser le trafic entre clients" ++ ++msgid "Allow multiple clients with same certificate" ++msgstr "Permettre à plusieurs clients d'utiliser le même certificat" ++ ++msgid "Allow only one session" ++msgstr "Autoriser seulement une session" ++ ++msgid "Allow remote to change its IP or port" ++msgstr "Autoriser l'hôte distant à changer d'adresse IP ou de port" ++ ++msgid "Allowed maximum of connected clients" ++msgstr "Maximum autorisé de clients connectés" ++ ++msgid "Allowed maximum of internal" ++msgstr "Admis au maximum interne" ++ ++msgid "Allowed maximum of new connections" ++msgstr "Maximum autorisé de nouvelles connexions" ++ ++msgid "Append log to file" ++msgstr "Ajouter les journaux en fin de ce fichier" ++ ++msgid "Authenticate using username/password" ++msgstr "S'authentifier par identifiant/mot-de-passe" ++ ++msgid "Automatically redirect default route" ++msgstr "Rediriger automatiquement la route par défaut" ++ ++msgid "Below is a list of configured OpenVPN instances and their current state" ++msgstr "" ++"Voici ci-dessous la liste d'instances OpenVPN configurées et leur état " ++"courant" ++ ++msgid "Call down cmd/script before TUN/TAP close" ++msgstr "" ++"Appelle une commande/script d'arrêt avant que le périphérique TUN/TAP soit " ++"fermé" ++ ++msgid "Certificate authority" ++msgstr "Autorité des certificats" ++ ++msgid "Change process priority" ++msgstr "Modifier la priorité du processus" ++ ++msgid "Change to directory before initialization" ++msgstr "Aller dans ce répertorie avant l'initialisation" ++ ++msgid "Check peer certificate against a CRL" ++msgstr "" ++"Confronter le certificat du distant à une liste des certificats révoqués " ++"(CRL)" ++ ++msgid "Chroot to directory after initialization" ++msgstr "Faire un « chroot » dans ce répertoire après initialisation" ++ ++msgid "Client is disabled" ++msgstr "Client désactivé" ++ ++msgid "Configuration category" ++msgstr "Catégorie de configuration" ++ ++msgid "Configure client mode" ++msgstr "Configurer le mode client" ++ ++msgid "Configure server bridge" ++msgstr "Configurer le mode pont" ++ ++msgid "Configure server mode" ++msgstr "Configurer le mode serveur" ++ ++msgid "Connect through Socks5 proxy" ++msgstr "Se connecter via un proxy Socks5" ++ ++msgid "Connect to remote host through an HTTP proxy" ++msgstr "Se connecter à un hôte distant via un mandataire HTTP" ++ ++msgid "Connection retry interval" ++msgstr "Intervalle entre 2 tentatives de connexion" ++ ++msgid "Daemonize after initialization" ++msgstr "Transformer en démon après l'initialisation" ++ ++msgid "Delay n seconds after connection" ++msgstr "Attends n secondes après la connexion" ++ ++msgid "Delay tun/tap open and up script execution" ++msgstr "" ++"Attends avant l'ouverture de tun/tap et l'exécution de scripts de mise en " ++"marche" ++ ++msgid "Diffie Hellman parameters" ++msgstr "Paramètres Diffie Hellman" ++ ++msgid "Directory for custom client config files" ++msgstr "Répertoire contenant vos fichiers de config client spécifiques" ++ ++msgid "Disable Paging" ++msgstr "Désactiver la pagination" ++ ++msgid "Disable cipher initialisation vector" ++msgstr "Désactivé le vecteur d'initialisation cipher" ++ ++msgid "Disable options consistency check" ++msgstr "Désactiver la vérification de la cohérence des options" ++ ++msgid "Disable replay protection" ++msgstr "Désactiver la protection anti-rejeu" ++ ++msgid "Do not bind to local address and port" ++msgstr "Ne pas attacher à l'adresse et au port local" ++ ++msgid "Don't actually execute ifconfig" ++msgstr "Ne pas exécuter réellement ifconfig" ++ ++msgid "Don't add routes automatically" ++msgstr "Ne pas ajouter de routes automatiquement" ++ ++msgid "Don't cache --askpass or --auth-user-pass passwords" ++msgstr "" ++"Ne pas copier en cache les mots de passe des options --askpass ou --auth-" ++"user-pass" ++ ++msgid "Don't inherit global push options" ++msgstr "Ne pas hériter des options d'envoi globales" ++ ++msgid "Don't log timestamps" ++msgstr "Ne pas journaliser les horodatages" ++ ++msgid "Don't re-read key on restart" ++msgstr "Ne pas relire la clef au redémarrage" ++ ++msgid "Don't require client certificate" ++msgstr "Ne pas exiger un certificat client" ++ ++msgid "Don't use adaptive lzo compression" ++msgstr "Ne pas utiliser la compression adaptative LZO" ++ ++msgid "Don't warn on ifconfig inconsistencies" ++msgstr "Ne pas alerter en cas d'incohérence d'ifconfig" ++ ++msgid "Echo parameters to log" ++msgstr "Écrire les paramètres dans le journal" ++ ++msgid "Empirically measure MTU" ++msgstr "Mesurer le MTU empiriquement" ++ ++msgid "Enable OpenSSL hardware crypto engines" ++msgstr "Activer les systèmes de cryptages OpenSSL matériels" ++ ++msgid "Enable Path MTU discovery" ++msgstr "Activer la découverte du MTU du chemin" ++ ++msgid "Enable Static Key encryption mode (non-TLS)" ++msgstr "Activer le mode de cryptage à clef statique (non TLS)" ++ ++msgid "Enable TLS and assume client role" ++msgstr "Activer le TLS et prendre le rôle du client" ++ ++msgid "Enable TLS and assume server role" ++msgstr "Activer le TLS et prendre le rôle du serveur" ++ ++msgid "Enable internal datagram fragmentation" ++msgstr "Autoriser la fragmentation des datagrammes en interne" ++ ++msgid "Enable management interface on IP port" ++msgstr "Activer l'interface de gestion sur IP port" ++ ++msgid "Enabled" ++msgstr "Activé" ++ ++msgid "Encryption cipher for packets" ++msgstr "Méthode de chiffrement des paquets" ++ ++msgid "Execute shell cmd after routes are added" ++msgstr "Exécuter une commande shell après l'ajout des routes" ++ ++msgid "Execute shell command on remote ip change" ++msgstr "" ++"Exécuter une commande Shell suite à un changement d'IP de l'hôte distant" ++ ++msgid "" ++"Executed in server mode on new client connections, when the client is still " ++"untrusted" ++msgstr "" ++"Lancé en mode serveur pour les nouvelles connexions client, quand le client " ++"n'est pas encore reconnu" ++ ++msgid "" ++"Executed in server mode whenever an IPv4 address/route or MAC address is " ++"added to OpenVPN's internal routing table" ++msgstr "" ++"Lancé en mode serveur à chaque fois qu'une adresse/route IPv4 ou une adresse " ++"MAC est ajoutée à la table de routage interne d'OpenVPN" ++ ++msgid "Exit on TLS negotiation failure" ++msgstr "Arrêter suite à l'échec de la négociation TLS" ++ ++msgid "Get PEM password from controlling tty before we daemonize" ++msgstr "" ++"Obtenir le mot de passe du certificat depuis le terminal avant de passer en " ++"mode démon" ++ ++msgid "HMAC authentication for packets" ++msgstr "Authentification HMAC des paquets" ++ ++msgid "Handling of authentication failures" ++msgstr "Gestion des erreurs d'authentification" ++ ++msgid "" ++"Helper directive to simplify the expression of --ping and --ping-restart in " ++"server mode configurations" ++msgstr "" ++"Aide pour simplifier l'expression des --ping et --ping-restart dans les " ++"configurations en mode serveur" ++ ++msgid "If hostname resolve fails, retry" ++msgstr "Si la résolution du nom de l'hôte échoue, ré-essayer" ++ ++msgid "Instance \"%s\"" ++msgstr "Instance \"%s\"" ++ ++msgid "Invalid" ++msgstr "Invalide" ++ ++msgid "Keep local IP address on restart" ++msgstr "Conserver l'adresse IP locale lors du redémarrage" ++ ++msgid "Keep remote IP address on restart" ++msgstr "Conserver l'adresse IP distante lors du redémarrage" ++ ++msgid "Keep tun/tap device open on restart" ++msgstr "Conserver le périphérique tun/tap ouvert au redémarrage" ++ ++msgid "Key transition window" ++msgstr "" ++ ++msgid "Limit repeated log messages" ++msgstr "Limiter les messages répétés dans les journaux" ++ ++msgid "Local certificate" ++msgstr "Certificat local" ++ ++msgid "Local host name or ip address" ++msgstr "Nom ou adresse IP de l'hôte local" ++ ++msgid "Local private key" ++msgstr "Clef privée locale" ++ ++msgid "Major mode" ++msgstr "Mode principal" ++ ++msgid "Make tun device IPv6 capable" ++msgstr "Rendre le périphérique tun compatible IPv6" ++ ++msgid "Maximum number of queued TCP output packets" ++msgstr "Nombre maximum de paquets TCP en attente d'émission" ++ ++msgid "Number of allocated broadcast buffers" ++msgstr "Nombre de tampons de diffusion alloués" ++ ++msgid "Number of lines for log file history" ++msgstr "Nombre de lignes de l'historique du fichier-journal" ++ ++msgid "Only accept connections from given X509 name" ++msgstr "Accepte seulement des connexions du nom X509 donné" ++ ++msgid "Only process ping timeouts if routes exist" ++msgstr "" ++"Traiter l'expiration des délais des pings seulement si les routes existent" ++ ++msgid "OpenVPN" ++msgstr "OpenVPN" ++ ++msgid "OpenVPN instances" ++msgstr "Instances OpenVPN" ++ ++msgid "Optimize TUN/TAP/UDP writes" ++msgstr "Optimiser les écritures TUN/TAP/UDP" ++ ++msgid "Output to syslog and do not daemonize" ++msgstr "Envoyer à syslog et ne pas transformer en démon" ++ ++msgid "Overview" ++msgstr "Vue d'ensemble" ++ ++msgid "PKCS#12 file containing keys" ++msgstr "Fichier au format PKCS#12 contenant les clefs" ++ ++msgid "Pass environment variables to script" ++msgstr "Transmettre les variables d'environnement au script" ++ ++msgid "Persist replay-protection state" ++msgstr "Reconduire l'état de protection anti-rejeu" ++ ++msgid "Persist/unpersist ifconfig-pool" ++msgstr "Reconduire ou non le lot d'ifconfig" ++ ++msgid "Ping remote every n seconds over TCP/UDP port" ++msgstr "" ++"Envoyer un ping à l'hôte distant toutes les n secondes sur le port TCP/UDP" ++ ++msgid "Policy level over usage of external programs and scripts" ++msgstr "Règle de sécurité appliqué à l'usage de programmes et scripts externes" ++ ++msgid "Port" ++msgstr "Port" ++ ++msgid "Protocol" ++msgstr "Protocole" ++ ++msgid "Proxy timeout in seconds" ++msgstr "Délai d'attente du mandataire, en secondes" ++ ++msgid "Push an ifconfig option to remote" ++msgstr "Envoyer une option ifconfig au distant" ++ ++msgid "Push options to peer" ++msgstr "Envoyer les options au client" ++ ++msgid "Query management channel for private key" ++msgstr "Canal de requête de gestion pour clef privée" ++ ++msgid "Randomly choose remote server" ++msgstr "Choisir au hasard un serveur distant" ++ ++msgid "Refuse connection if no custom client config" ++msgstr "Refuser la connexion en l'absence de config client spécifique" ++ ++msgid "Remap SIGUSR1 signals" ++msgstr "Rediriger les signaux SIGUSR1" ++ ++msgid "Remote host name or ip address" ++msgstr "Nom ou adresse IP de l'hôte distant" ++ ++msgid "Remote ping timeout" ++msgstr "Délai de ping du distant" ++ ++msgid "Renegotiate data chan. key after bytes" ++msgstr "Renégocier la clé du canal de données après tant d'octets" ++ ++msgid "Renegotiate data chan. key after packets" ++msgstr "Renégocier la clé du canal de données après tant de paquets" ++ ++msgid "Renegotiate data chan. key after seconds" ++msgstr "" ++"Renégocier la clé du canal de données après tant de temps (en secondes)" ++ ++msgid "Replay protection sliding window size" ++msgstr "Taille de la fenêtre glissante pour la protection anti-rejeu" ++ ++msgid "Require explicit designation on certificate" ++msgstr "Exiger l'appellation explicite sur le certificat" ++ ++msgid "Require explicit key usage on certificate" ++msgstr "Exiger l'utilisation explicite de la clé sur le certificat" ++ ++msgid "Restart after remote ping timeout" ++msgstr "Redémarrer aprés le dépassement du délai de ping du distant" ++ ++msgid "Retransmit timeout on TLS control channel" ++msgstr "Renvoyer l'expiration du délai sur le canal de contrôle TLS" ++ ++msgid "Retry indefinitely on HTTP proxy errors" ++msgstr "Ré-essayer indéfiniment suite à des erreurs du proxy HTTP" ++ ++msgid "Retry indefinitely on Socks proxy errors" ++msgstr "Ré-essayer indéfiniment suite à des erreurs du proxy Socks" ++ ++msgid "Route subnet to client" ++msgstr "Router le sous-réseau vers le client" ++ ++msgid "Run as an inetd or xinetd server" ++msgstr "Exécuter en tant que serveur inetd ou xinetd" ++ ++msgid "Run script cmd on client connection" ++msgstr "Exécuter une commande de script lors de la connexion d'un client" ++ ++msgid "Run script cmd on client disconnection" ++msgstr "Exécuter une commande de script lors de la déconnexion d'un client" ++ ++msgid "Run up/down scripts for all restarts" ++msgstr "Exécuter les scripts up/down à tous les redémarrages" ++ ++msgid "Send notification to peer on disconnect" ++msgstr "Envoyer une notification au distant à la déconnexion" ++ ++msgid "Set GID to group" ++msgstr "Utiliser le GID de ce groupe" ++ ++msgid "Set TCP/UDP MTU" ++msgstr "Définir le MTU TCP/UDP" ++ ++msgid "Set UID to user" ++msgstr "Utiliser l'UID de cet utilisateur" ++ ++msgid "Set aside a pool of subnets" ++msgstr "Mettre de coté un lot de sous-réseaux" ++ ++msgid "Set extended HTTP proxy options" ++msgstr "Définir les options de mandataire HTTP étendu" ++ ++msgid "Set output verbosity" ++msgstr "Définir la verbosité des écrits" ++ ++msgid "Set size of real and virtual address hash tables" ++msgstr "" ++"Définir la taille des tables de haché des adresses réelles et virtuelles" ++ ++msgid "Set the TCP/UDP receive buffer size" ++msgstr "Définir la taille de la pile de réception TCP/UDP" ++ ++msgid "Set the TCP/UDP send buffer size" ++msgstr "Définir la taille de la pile d'envoi TCP/UDP" ++ ++msgid "Set tun/tap TX queue length" ++msgstr "Définir la taille de la pile TX tun/tap" ++ ++msgid "Set tun/tap adapter parameters" ++msgstr "Définir les paramètres de l'adaptateur tun/tap" ++ ++msgid "Set tun/tap device MTU" ++msgstr "Définir le MTU du périphérique tun/tap" ++ ++msgid "Set tun/tap device overhead" ++msgstr "" ++ ++msgid "Set upper bound on TCP MSS" ++msgstr "Définir la borne supérieure du MSS TCP" ++ ++msgid "Shaping for peer bandwidth" ++msgstr "Gère la bande-passante du distant" ++ ++msgid "Shell cmd to execute after tun device open" ++msgstr "Commande Shell à exécuter après l'ouverture du périphérique tun" ++ ++msgid "Shell cmd to run after tun device close" ++msgstr "Commande Shell à exécuter après la fermeture du périphérique tun" ++ ++msgid "Shell command to verify X509 name" ++msgstr "Commande shell de vérification du nom X509" ++ ++msgid "Silence the output of replay warnings" ++msgstr "Supprime les messages d'alertes anti-rejeu" ++ ++msgid "Size of cipher key" ++msgstr "Taille de la clé de cryptage" ++ ++msgid "Specify a default gateway for routes" ++msgstr "Définir la passerelle par défaut des routes" ++ ++msgid "Start OpenVPN in a hibernating state" ++msgstr "Démarrer OpenVPN dans un état d'hibernation" ++ ++msgid "Start/Stop" ++msgstr "Démarrer/Arrêter" ++ ++msgid "Started" ++msgstr "Démarré" ++ ++msgid "Status file format version" ++msgstr "Version du format du fichier de status" ++ ++msgid "Switch to advanced configuration »" ++msgstr "Afficher les paramètres de configuration avancés" ++ ++msgid "TCP/UDP port # for both local and remote" ++msgstr "Numéro de port TCP/UDP valable pour l'hôte local et l'hôte distant" ++ ++msgid "TCP/UDP port # for local (default=1194)" ++msgstr "Numéro de port TCP/UDP pour l'hôte local (par défaut 1194)" ++ ++msgid "TCP/UDP port # for remote (default=1194)" ++msgstr "Numéro de port TCP/UDP pour l'hôte distant (par défaut 1194)" ++ ++msgid "TLS cipher" ++msgstr "Méthode de chiffrement TLS" ++ ++msgid "TOS passthrough (applies to IPv4 only)" ++msgstr "" ++ ++msgid "Temporary directory for client-connect return file" ++msgstr "Répertoire pour le fichier temporaire lié à la connexion d'un client" ++ ++msgid "Timeframe for key exchange" ++msgstr "Période d'un échange de clés" ++ ++msgid "Type of used device" ++msgstr "Type de périphérique utilisé" ++ ++msgid "Use fast LZO compression" ++msgstr "Utiliser la compression LZO rapide" ++ ++msgid "Use individual addresses rather than /30 subnets" ++msgstr "Utiliser des adresses individuelles plutôt que des sous-réseaux en /30" ++ ++msgid "Use protocol" ++msgstr "Utiliser le protocole" ++ ++msgid "Use tun/tap device node" ++msgstr "Utiliser le périphérique tun/tap" ++ ++msgid "Use username as common name" ++msgstr "Utiliser le nom d'utilisateur comme nom « commun » (du certificat)" ++ ++msgid "Write log to file" ++msgstr "Écrire le journal dans le fichier" ++ ++msgid "Write process ID to file" ++msgstr "Écrire le numéro de processus dans le fichier" ++ ++msgid "Write status to file every n seconds" ++msgstr "Écrire le status dans le fichier chaque n secondes" ++ ++msgid "no" ++msgstr "non" ++ ++msgid "tun/tap device" ++msgstr "Périphérique tun/tap" ++ ++msgid "tun/tap inactivity timeout" ++msgstr "Délai d'inactivité tun/tap" ++ ++msgid "yes (%i)" ++msgstr "oui (%i)" ++ ++msgid "« Switch to basic configuration" ++msgstr "Afficher les paramètres de configuration standards" ++ ++#~ msgid "Cryptography" ++#~ msgstr "Cryptage" ++ ++#~ msgid "Networking" ++#~ msgstr "Réseau" ++ ++#~ msgid "Service" ++#~ msgstr "Service" ++ ++#~ msgid "VPN" ++#~ msgstr "VPN" ++ ++#~ msgid "openvpn_%s" ++#~ msgstr "openvpn_%s" ++ ++#~ msgid "openvpn_%s_desc" ++#~ msgstr "openvpn_%s_desc" +diff --git a/feeds/luci/applications/luci-app-openvpn/po/he/openvpn.po b/feeds/luci/applications/luci-app-openvpn/po/he/openvpn.po +new file mode 100644 +index 0000000..55953b9 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-openvpn/po/he/openvpn.po +@@ -0,0 +1,535 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Last-Translator: Automatically generated\n" ++"Language-Team: none\n" ++"Language: \n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n != 1);\n" ++ ++msgid "%s" ++msgstr "" ++ ++msgid "'net30', 'p2p', or 'subnet'" ++msgstr "" ++ ++msgid "Accept options pushed from server" ++msgstr "" ++ ++msgid "Add" ++msgstr "" ++ ++msgid "Add route after establishing connection" ++msgstr "" ++ ++msgid "Additional authentication over TLS" ++msgstr "" ++ ++msgid "Allow client-to-client traffic" ++msgstr "" ++ ++msgid "Allow multiple clients with same certificate" ++msgstr "" ++ ++msgid "Allow only one session" ++msgstr "" ++ ++msgid "Allow remote to change its IP or port" ++msgstr "" ++ ++msgid "Allowed maximum of connected clients" ++msgstr "" ++ ++msgid "Allowed maximum of internal" ++msgstr "" ++ ++msgid "Allowed maximum of new connections" ++msgstr "" ++ ++msgid "Append log to file" ++msgstr "" ++ ++msgid "Authenticate using username/password" ++msgstr "" ++ ++msgid "Automatically redirect default route" ++msgstr "" ++ ++msgid "Below is a list of configured OpenVPN instances and their current state" ++msgstr "" ++ ++msgid "Call down cmd/script before TUN/TAP close" ++msgstr "" ++ ++msgid "Certificate authority" ++msgstr "" ++ ++msgid "Change process priority" ++msgstr "" ++ ++msgid "Change to directory before initialization" ++msgstr "" ++ ++msgid "Check peer certificate against a CRL" ++msgstr "" ++ ++msgid "Chroot to directory after initialization" ++msgstr "" ++ ++msgid "Client is disabled" ++msgstr "" ++ ++msgid "Configuration category" ++msgstr "" ++ ++msgid "Configure client mode" ++msgstr "" ++ ++msgid "Configure server bridge" ++msgstr "" ++ ++msgid "Configure server mode" ++msgstr "" ++ ++msgid "Connect through Socks5 proxy" ++msgstr "" ++ ++msgid "Connect to remote host through an HTTP proxy" ++msgstr "" ++ ++msgid "Connection retry interval" ++msgstr "" ++ ++msgid "Daemonize after initialization" ++msgstr "" ++ ++msgid "Delay n seconds after connection" ++msgstr "" ++ ++msgid "Delay tun/tap open and up script execution" ++msgstr "" ++ ++msgid "Diffie Hellman parameters" ++msgstr "" ++ ++msgid "Directory for custom client config files" ++msgstr "" ++ ++msgid "Disable Paging" ++msgstr "" ++ ++msgid "Disable cipher initialisation vector" ++msgstr "" ++ ++msgid "Disable options consistency check" ++msgstr "" ++ ++msgid "Disable replay protection" ++msgstr "" ++ ++msgid "Do not bind to local address and port" ++msgstr "" ++ ++msgid "Don't actually execute ifconfig" ++msgstr "" ++ ++msgid "Don't add routes automatically" ++msgstr "" ++ ++msgid "Don't cache --askpass or --auth-user-pass passwords" ++msgstr "" ++ ++msgid "Don't inherit global push options" ++msgstr "" ++ ++msgid "Don't log timestamps" ++msgstr "" ++ ++msgid "Don't re-read key on restart" ++msgstr "" ++ ++msgid "Don't require client certificate" ++msgstr "" ++ ++msgid "Don't use adaptive lzo compression" ++msgstr "" ++ ++msgid "Don't warn on ifconfig inconsistencies" ++msgstr "" ++ ++msgid "Echo parameters to log" ++msgstr "" ++ ++msgid "Empirically measure MTU" ++msgstr "" ++ ++msgid "Enable OpenSSL hardware crypto engines" ++msgstr "" ++ ++msgid "Enable Path MTU discovery" ++msgstr "" ++ ++msgid "Enable Static Key encryption mode (non-TLS)" ++msgstr "" ++ ++msgid "Enable TLS and assume client role" ++msgstr "" ++ ++msgid "Enable TLS and assume server role" ++msgstr "" ++ ++msgid "Enable internal datagram fragmentation" ++msgstr "" ++ ++msgid "Enable management interface on IP port" ++msgstr "" ++ ++msgid "Enabled" ++msgstr "" ++ ++msgid "Encryption cipher for packets" ++msgstr "" ++ ++msgid "Execute shell cmd after routes are added" ++msgstr "" ++ ++msgid "Execute shell command on remote ip change" ++msgstr "" ++ ++msgid "" ++"Executed in server mode on new client connections, when the client is still " ++"untrusted" ++msgstr "" ++ ++msgid "" ++"Executed in server mode whenever an IPv4 address/route or MAC address is " ++"added to OpenVPN's internal routing table" ++msgstr "" ++ ++msgid "Exit on TLS negotiation failure" ++msgstr "" ++ ++msgid "Get PEM password from controlling tty before we daemonize" ++msgstr "" ++ ++msgid "HMAC authentication for packets" ++msgstr "" ++ ++msgid "Handling of authentication failures" ++msgstr "" ++ ++msgid "" ++"Helper directive to simplify the expression of --ping and --ping-restart in " ++"server mode configurations" ++msgstr "" ++ ++msgid "If hostname resolve fails, retry" ++msgstr "" ++ ++msgid "Instance \"%s\"" ++msgstr "" ++ ++msgid "Invalid" ++msgstr "" ++ ++msgid "Keep local IP address on restart" ++msgstr "" ++ ++msgid "Keep remote IP address on restart" ++msgstr "" ++ ++msgid "Keep tun/tap device open on restart" ++msgstr "" ++ ++msgid "Key transition window" ++msgstr "" ++ ++msgid "Limit repeated log messages" ++msgstr "" ++ ++msgid "Local certificate" ++msgstr "" ++ ++msgid "Local host name or ip address" ++msgstr "" ++ ++msgid "Local private key" ++msgstr "" ++ ++msgid "Major mode" ++msgstr "" ++ ++msgid "Make tun device IPv6 capable" ++msgstr "" ++ ++msgid "Maximum number of queued TCP output packets" ++msgstr "" ++ ++msgid "Number of allocated broadcast buffers" ++msgstr "" ++ ++msgid "Number of lines for log file history" ++msgstr "" ++ ++msgid "Only accept connections from given X509 name" ++msgstr "" ++ ++msgid "Only process ping timeouts if routes exist" ++msgstr "" ++ ++msgid "OpenVPN" ++msgstr "" ++ ++msgid "OpenVPN instances" ++msgstr "" ++ ++msgid "Optimize TUN/TAP/UDP writes" ++msgstr "" ++ ++msgid "Output to syslog and do not daemonize" ++msgstr "" ++ ++msgid "Overview" ++msgstr "" ++ ++msgid "PKCS#12 file containing keys" ++msgstr "" ++ ++msgid "Pass environment variables to script" ++msgstr "" ++ ++msgid "Persist replay-protection state" ++msgstr "" ++ ++msgid "Persist/unpersist ifconfig-pool" ++msgstr "" ++ ++msgid "Ping remote every n seconds over TCP/UDP port" ++msgstr "" ++ ++msgid "Policy level over usage of external programs and scripts" ++msgstr "" ++ ++msgid "Port" ++msgstr "" ++ ++msgid "Protocol" ++msgstr "" ++ ++msgid "Proxy timeout in seconds" ++msgstr "" ++ ++msgid "Push an ifconfig option to remote" ++msgstr "" ++ ++msgid "Push options to peer" ++msgstr "" ++ ++msgid "Query management channel for private key" ++msgstr "" ++ ++msgid "Randomly choose remote server" ++msgstr "" ++ ++msgid "Refuse connection if no custom client config" ++msgstr "" ++ ++msgid "Remap SIGUSR1 signals" ++msgstr "" ++ ++msgid "Remote host name or ip address" ++msgstr "" ++ ++msgid "Remote ping timeout" ++msgstr "" ++ ++msgid "Renegotiate data chan. key after bytes" ++msgstr "" ++ ++msgid "Renegotiate data chan. key after packets" ++msgstr "" ++ ++msgid "Renegotiate data chan. key after seconds" ++msgstr "" ++ ++msgid "Replay protection sliding window size" ++msgstr "" ++ ++msgid "Require explicit designation on certificate" ++msgstr "" ++ ++msgid "Require explicit key usage on certificate" ++msgstr "" ++ ++msgid "Restart after remote ping timeout" ++msgstr "" ++ ++msgid "Retransmit timeout on TLS control channel" ++msgstr "" ++ ++msgid "Retry indefinitely on HTTP proxy errors" ++msgstr "" ++ ++msgid "Retry indefinitely on Socks proxy errors" ++msgstr "" ++ ++msgid "Route subnet to client" ++msgstr "" ++ ++msgid "Run as an inetd or xinetd server" ++msgstr "" ++ ++msgid "Run script cmd on client connection" ++msgstr "" ++ ++msgid "Run script cmd on client disconnection" ++msgstr "" ++ ++msgid "Run up/down scripts for all restarts" ++msgstr "" ++ ++msgid "Send notification to peer on disconnect" ++msgstr "" ++ ++msgid "Set GID to group" ++msgstr "" ++ ++msgid "Set TCP/UDP MTU" ++msgstr "" ++ ++msgid "Set UID to user" ++msgstr "" ++ ++msgid "Set aside a pool of subnets" ++msgstr "" ++ ++msgid "Set extended HTTP proxy options" ++msgstr "" ++ ++msgid "Set output verbosity" ++msgstr "" ++ ++msgid "Set size of real and virtual address hash tables" ++msgstr "" ++ ++msgid "Set the TCP/UDP receive buffer size" ++msgstr "" ++ ++msgid "Set the TCP/UDP send buffer size" ++msgstr "" ++ ++msgid "Set tun/tap TX queue length" ++msgstr "" ++ ++msgid "Set tun/tap adapter parameters" ++msgstr "" ++ ++msgid "Set tun/tap device MTU" ++msgstr "" ++ ++msgid "Set tun/tap device overhead" ++msgstr "" ++ ++msgid "Set upper bound on TCP MSS" ++msgstr "" ++ ++msgid "Shaping for peer bandwidth" ++msgstr "" ++ ++msgid "Shell cmd to execute after tun device open" ++msgstr "" ++ ++msgid "Shell cmd to run after tun device close" ++msgstr "" ++ ++msgid "Shell command to verify X509 name" ++msgstr "" ++ ++msgid "Silence the output of replay warnings" ++msgstr "" ++ ++msgid "Size of cipher key" ++msgstr "" ++ ++msgid "Specify a default gateway for routes" ++msgstr "" ++ ++msgid "Start OpenVPN in a hibernating state" ++msgstr "" ++ ++msgid "Start/Stop" ++msgstr "" ++ ++msgid "Started" ++msgstr "" ++ ++msgid "Status file format version" ++msgstr "" ++ ++msgid "Switch to advanced configuration »" ++msgstr "" ++ ++msgid "TCP/UDP port # for both local and remote" ++msgstr "" ++ ++msgid "TCP/UDP port # for local (default=1194)" ++msgstr "" ++ ++msgid "TCP/UDP port # for remote (default=1194)" ++msgstr "" ++ ++msgid "TLS cipher" ++msgstr "" ++ ++msgid "TOS passthrough (applies to IPv4 only)" ++msgstr "" ++ ++msgid "Temporary directory for client-connect return file" ++msgstr "" ++ ++msgid "Timeframe for key exchange" ++msgstr "" ++ ++msgid "Type of used device" ++msgstr "" ++ ++msgid "Use fast LZO compression" ++msgstr "" ++ ++msgid "Use individual addresses rather than /30 subnets" ++msgstr "" ++ ++msgid "Use protocol" ++msgstr "" ++ ++msgid "Use tun/tap device node" ++msgstr "" ++ ++msgid "Use username as common name" ++msgstr "" ++ ++msgid "Write log to file" ++msgstr "" ++ ++msgid "Write process ID to file" ++msgstr "" ++ ++msgid "Write status to file every n seconds" ++msgstr "" ++ ++msgid "no" ++msgstr "" ++ ++msgid "tun/tap device" ++msgstr "" ++ ++msgid "tun/tap inactivity timeout" ++msgstr "" ++ ++msgid "yes (%i)" ++msgstr "" ++ ++msgid "« Switch to basic configuration" ++msgstr "" +diff --git a/feeds/luci/applications/luci-app-openvpn/po/hu/openvpn.po b/feeds/luci/applications/luci-app-openvpn/po/hu/openvpn.po +new file mode 100644 +index 0000000..3e93918 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-openvpn/po/hu/openvpn.po +@@ -0,0 +1,557 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"PO-Revision-Date: 2014-01-31 12:06+0200\n" ++"Last-Translator: Gabor \n" ++"Language-Team: none\n" ++"Language: hu\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n != 1);\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "%s" ++msgstr "%s" ++ ++msgid "'net30', 'p2p', or 'subnet'" ++msgstr "'net30', 'p2p' vagy 'subnet'" ++ ++msgid "Accept options pushed from server" ++msgstr "A kiszolgáló által küldött opciók elfogadás" ++ ++msgid "Add" ++msgstr "Hozzáadás" ++ ++msgid "Add route after establishing connection" ++msgstr "Útvonal hozzáadása a kapcsolat létrejötte után" ++ ++msgid "Additional authentication over TLS" ++msgstr "További hitelesítés TLS-en keresztül" ++ ++msgid "Allow client-to-client traffic" ++msgstr "Ãœgyfél-ügyfél közötti kapcsolat engedélyezése" ++ ++msgid "Allow multiple clients with same certificate" ++msgstr "Több ügyfél engedélyezése ugyanazzal a tanúsítvánnyal" ++ ++msgid "Allow only one session" ++msgstr "Csak egy munkafolyamat engedélyezése" ++ ++msgid "Allow remote to change its IP or port" ++msgstr "A távoli gép IP címének vagy portjának megváltozatásának engedélyezése" ++ ++msgid "Allowed maximum of connected clients" ++msgstr "A csatlakozott ügyfelek maximális megengedett száma" ++ ++msgid "Allowed maximum of internal" ++msgstr "BelsÅ‘ kapcsolatok maximális száma" ++ ++msgid "Allowed maximum of new connections" ++msgstr "Az új kapcsolatok maximálisan megengedett száma" ++ ++msgid "Append log to file" ++msgstr "Napló hozzáfűzése fájlhoz" ++ ++msgid "Authenticate using username/password" ++msgstr "Azonosítás felhasználónév és jelszó használatával" ++ ++msgid "Automatically redirect default route" ++msgstr "Az alapértelmezett útvonal automatikus átirányítása" ++ ++msgid "Below is a list of configured OpenVPN instances and their current state" ++msgstr "" ++"Az alábbi listában találhatóak a beállított OpenVPN példányok és azok " ++"aktuális állapota" ++ ++msgid "Call down cmd/script before TUN/TAP close" ++msgstr "A TUN/TAP interfész lezárása elÅ‘tt futtatandó shell script." ++ ++msgid "Certificate authority" ++msgstr "Hitelesítésszolgáltató" ++ ++msgid "Change process priority" ++msgstr "Folyamat prioritásának módosítása" ++ ++msgid "Change to directory before initialization" ++msgstr "Váltás a könyvtárra inicializáslás elÅ‘tt" ++ ++msgid "Check peer certificate against a CRL" ++msgstr "Kliens tanúsítvány összevetése a tiltólistával." ++ ++msgid "Chroot to directory after initialization" ++msgstr "Gyökérkönyvtár váltás inicializáció után" ++ ++msgid "Client is disabled" ++msgstr "Ãœgyfél letiltva" ++ ++msgid "Configuration category" ++msgstr "Beállítások / Visszavonás" ++ ++msgid "Configure client mode" ++msgstr "Ãœgyfél mód beállítása" ++ ++msgid "Configure server bridge" ++msgstr "Kiszolgáló híd beállítása" ++ ++msgid "Configure server mode" ++msgstr "Kiszolgáló mód beállítása" ++ ++msgid "Connect through Socks5 proxy" ++msgstr "Kapcsolódás Sock5 proxy-n keresztül" ++ ++msgid "Connect to remote host through an HTTP proxy" ++msgstr "Kapcsolódás a távoli géphez HTTP proxyn keresztül" ++ ++msgid "Connection retry interval" ++msgstr "Kapcsolódás újrapróbálkozási idÅ‘köz" ++ ++msgid "Daemonize after initialization" ++msgstr "Váltás démon módba inicializálás után" ++ ++msgid "Delay n seconds after connection" ++msgstr "Kapcsolat felépítés után 'n' másodperc késleltetés" ++ ++msgid "Delay tun/tap open and up script execution" ++msgstr "" ++ ++msgid "Diffie Hellman parameters" ++msgstr "Diffie Hellman paraméterek" ++ ++msgid "Directory for custom client config files" ++msgstr "Egyéni ügyfél konfigurációs fájlok könyvtára " ++ ++msgid "Disable Paging" ++msgstr "Lapozás letiltása" ++ ++msgid "Disable cipher initialisation vector" ++msgstr "" ++ ++msgid "Disable options consistency check" ++msgstr "" ++ ++msgid "Disable replay protection" ++msgstr "Újrajátszás védelem letiltása" ++ ++msgid "Do not bind to local address and port" ++msgstr "" ++ ++msgid "Don't actually execute ifconfig" ++msgstr "" ++ ++msgid "Don't add routes automatically" ++msgstr "Ne adjon hozzá útvonalakat automatikusan " ++ ++msgid "Don't cache --askpass or --auth-user-pass passwords" ++msgstr "" ++ ++msgid "Don't inherit global push options" ++msgstr "" ++ ++msgid "Don't log timestamps" ++msgstr "IdÅ‘bélyegeket ne naplózza" ++ ++msgid "Don't re-read key on restart" ++msgstr "" ++ ++msgid "Don't require client certificate" ++msgstr "" ++ ++msgid "Don't use adaptive lzo compression" ++msgstr "Ne használjon adaptív LZO tömörítést" ++ ++msgid "Don't warn on ifconfig inconsistencies" ++msgstr "" ++ ++msgid "Echo parameters to log" ++msgstr "A paramétereket írja a naplóba" ++ ++msgid "Empirically measure MTU" ++msgstr "" ++ ++msgid "Enable OpenSSL hardware crypto engines" ++msgstr "OpenSSL hardveres titkosítás engedélyezése" ++ ++msgid "Enable Path MTU discovery" ++msgstr "" ++ ++msgid "Enable Static Key encryption mode (non-TLS)" ++msgstr "" ++ ++msgid "Enable TLS and assume client role" ++msgstr "" ++ ++msgid "Enable TLS and assume server role" ++msgstr "" ++ ++msgid "Enable internal datagram fragmentation" ++msgstr "" ++ ++msgid "Enable management interface on IP port" ++msgstr "" ++ ++msgid "Enabled" ++msgstr "Engedélyezve" ++ ++msgid "Encryption cipher for packets" ++msgstr "" ++ ++msgid "Execute shell cmd after routes are added" ++msgstr "" ++ ++msgid "Execute shell command on remote ip change" ++msgstr "" ++ ++msgid "" ++"Executed in server mode on new client connections, when the client is still " ++"untrusted" ++msgstr "" ++ ++msgid "" ++"Executed in server mode whenever an IPv4 address/route or MAC address is " ++"added to OpenVPN's internal routing table" ++msgstr "" ++ ++msgid "Exit on TLS negotiation failure" ++msgstr "" ++ ++msgid "Get PEM password from controlling tty before we daemonize" ++msgstr "" ++ ++msgid "HMAC authentication for packets" ++msgstr "" ++ ++msgid "Handling of authentication failures" ++msgstr "" ++ ++msgid "" ++"Helper directive to simplify the expression of --ping and --ping-restart in " ++"server mode configurations" ++msgstr "" ++ ++msgid "If hostname resolve fails, retry" ++msgstr "" ++ ++msgid "Instance \"%s\"" ++msgstr "" ++ ++msgid "Invalid" ++msgstr "Érvénytelen" ++ ++msgid "Keep local IP address on restart" ++msgstr "Helyi IP cím megtartása újraindításkor" ++ ++msgid "Keep remote IP address on restart" ++msgstr "Távoli IP cím megtartása újraindításkor" ++ ++msgid "Keep tun/tap device open on restart" ++msgstr "tun/tap eszközök nyitva tartása újraindításkor" ++ ++msgid "Key transition window" ++msgstr "" ++ ++msgid "Limit repeated log messages" ++msgstr "" ++ ++msgid "Local certificate" ++msgstr "Helyi tanúsítvány" ++ ++msgid "Local host name or ip address" ++msgstr "Helyi gép név vagy IP cím" ++ ++msgid "Local private key" ++msgstr "Helyi privát kulcs" ++ ++msgid "Major mode" ++msgstr "" ++ ++msgid "Make tun device IPv6 capable" ++msgstr "" ++ ++msgid "Maximum number of queued TCP output packets" ++msgstr "A sorbaállított kimenÅ‘ TCP csomagok maximális száma" ++ ++msgid "Number of allocated broadcast buffers" ++msgstr "Lefoglalt broadcast pufferek száma" ++ ++msgid "Number of lines for log file history" ++msgstr "Naplófájl történet sorainak száma" ++ ++msgid "Only accept connections from given X509 name" ++msgstr "" ++ ++msgid "Only process ping timeouts if routes exist" ++msgstr "" ++ ++msgid "OpenVPN" ++msgstr "OpenVPN" ++ ++msgid "OpenVPN instances" ++msgstr "OpenVPN példányok" ++ ++msgid "Optimize TUN/TAP/UDP writes" ++msgstr "" ++ ++msgid "Output to syslog and do not daemonize" ++msgstr "" ++ ++msgid "Overview" ++msgstr "Ãttekintés" ++ ++msgid "PKCS#12 file containing keys" ++msgstr "" ++ ++msgid "Pass environment variables to script" ++msgstr "" ++ ++msgid "Persist replay-protection state" ++msgstr "" ++ ++msgid "Persist/unpersist ifconfig-pool" ++msgstr "" ++ ++msgid "Ping remote every n seconds over TCP/UDP port" ++msgstr "" ++ ++msgid "Policy level over usage of external programs and scripts" ++msgstr "" ++ ++msgid "Port" ++msgstr "Port" ++ ++msgid "Protocol" ++msgstr "Protokoll" ++ ++msgid "Proxy timeout in seconds" ++msgstr "Proxy várakozási idÅ‘ (másodperc)" ++ ++msgid "Push an ifconfig option to remote" ++msgstr "" ++ ++msgid "Push options to peer" ++msgstr "" ++ ++msgid "Query management channel for private key" ++msgstr "" ++ ++msgid "Randomly choose remote server" ++msgstr "" ++ ++msgid "Refuse connection if no custom client config" ++msgstr "Kapcsolat megtagadás ha nincs egyéni ügyfél konfiguráció" ++ ++msgid "Remap SIGUSR1 signals" ++msgstr "" ++ ++msgid "Remote host name or ip address" ++msgstr "Távoli gép név vagy IP cím" ++ ++msgid "Remote ping timeout" ++msgstr "" ++ ++msgid "Renegotiate data chan. key after bytes" ++msgstr "" ++ ++msgid "Renegotiate data chan. key after packets" ++msgstr "" ++ ++msgid "Renegotiate data chan. key after seconds" ++msgstr "" ++ ++msgid "Replay protection sliding window size" ++msgstr "" ++ ++msgid "Require explicit designation on certificate" ++msgstr "" ++ ++msgid "Require explicit key usage on certificate" ++msgstr "" ++ ++msgid "Restart after remote ping timeout" ++msgstr "" ++ ++msgid "Retransmit timeout on TLS control channel" ++msgstr "" ++ ++msgid "Retry indefinitely on HTTP proxy errors" ++msgstr "" ++ ++msgid "Retry indefinitely on Socks proxy errors" ++msgstr "" ++ ++msgid "Route subnet to client" ++msgstr "" ++ ++msgid "Run as an inetd or xinetd server" ++msgstr "" ++ ++msgid "Run script cmd on client connection" ++msgstr "" ++ ++msgid "Run script cmd on client disconnection" ++msgstr "" ++ ++msgid "Run up/down scripts for all restarts" ++msgstr "" ++ ++msgid "Send notification to peer on disconnect" ++msgstr "" ++ ++msgid "Set GID to group" ++msgstr "" ++ ++msgid "Set TCP/UDP MTU" ++msgstr "" ++ ++msgid "Set UID to user" ++msgstr "" ++ ++msgid "Set aside a pool of subnets" ++msgstr "" ++ ++msgid "Set extended HTTP proxy options" ++msgstr "" ++ ++msgid "Set output verbosity" ++msgstr "" ++ ++msgid "Set size of real and virtual address hash tables" ++msgstr "" ++ ++msgid "Set the TCP/UDP receive buffer size" ++msgstr "" ++ ++msgid "Set the TCP/UDP send buffer size" ++msgstr "" ++ ++msgid "Set tun/tap TX queue length" ++msgstr "" ++ ++msgid "Set tun/tap adapter parameters" ++msgstr "" ++ ++msgid "Set tun/tap device MTU" ++msgstr "" ++ ++msgid "Set tun/tap device overhead" ++msgstr "" ++ ++msgid "Set upper bound on TCP MSS" ++msgstr "" ++ ++msgid "Shaping for peer bandwidth" ++msgstr "" ++ ++msgid "Shell cmd to execute after tun device open" ++msgstr "" ++ ++msgid "Shell cmd to run after tun device close" ++msgstr "" ++ ++msgid "Shell command to verify X509 name" ++msgstr "" ++ ++msgid "Silence the output of replay warnings" ++msgstr "" ++ ++msgid "Size of cipher key" ++msgstr "" ++ ++msgid "Specify a default gateway for routes" ++msgstr "" ++ ++msgid "Start OpenVPN in a hibernating state" ++msgstr "" ++ ++msgid "Start/Stop" ++msgstr "Indítás/Leállítás" ++ ++msgid "Started" ++msgstr "Elindítva" ++ ++msgid "Status file format version" ++msgstr "" ++ ++msgid "Switch to advanced configuration »" ++msgstr "Váltás haladó beállításokra »" ++ ++msgid "TCP/UDP port # for both local and remote" ++msgstr "" ++ ++msgid "TCP/UDP port # for local (default=1194)" ++msgstr "" ++ ++msgid "TCP/UDP port # for remote (default=1194)" ++msgstr "" ++ ++msgid "TLS cipher" ++msgstr "TLS titkosító" ++ ++msgid "TOS passthrough (applies to IPv4 only)" ++msgstr "" ++ ++msgid "Temporary directory for client-connect return file" ++msgstr "" ++ ++msgid "Timeframe for key exchange" ++msgstr "" ++ ++msgid "Type of used device" ++msgstr "A használt eszköz típusa" ++ ++msgid "Use fast LZO compression" ++msgstr "Gyors LZO tömörítés használata" ++ ++msgid "Use individual addresses rather than /30 subnets" ++msgstr "Egyedi címek használata /30 alhálózat helyett" ++ ++msgid "Use protocol" ++msgstr "" ++ ++msgid "Use tun/tap device node" ++msgstr "" ++ ++msgid "Use username as common name" ++msgstr "" ++ ++msgid "Write log to file" ++msgstr "Napló írása fájlba" ++ ++msgid "Write process ID to file" ++msgstr "Folyamat azonosító (PID) fájlba írása" ++ ++msgid "Write status to file every n seconds" ++msgstr "Ãllapot fájlba írása 'n' másodpercenként" ++ ++msgid "no" ++msgstr "nem" ++ ++msgid "tun/tap device" ++msgstr "tun/tap/ eszköz" ++ ++msgid "tun/tap inactivity timeout" ++msgstr "tun/tap tétlenségi idÅ‘" ++ ++msgid "yes (%i)" ++msgstr "igen (%i)" ++ ++msgid "« Switch to basic configuration" ++msgstr "« Váltás alap beállításokra" ++ ++#~ msgid "Cryptography" ++#~ msgstr "Titkosítás" ++ ++#~ msgid "Networking" ++#~ msgstr "Hálózatkezelés" ++ ++#~ msgid "Service" ++#~ msgstr "Szolgáltatás" ++ ++#~ msgid "VPN" ++#~ msgstr "VPN" ++ ++#~ msgid "openvpn_%s" ++#~ msgstr "openvpn_%s" ++ ++#~ msgid "openvpn_%s_desc" ++#~ msgstr "openvpn_%s_desc" +diff --git a/feeds/luci/applications/luci-app-openvpn/po/it/openvpn.po b/feeds/luci/applications/luci-app-openvpn/po/it/openvpn.po +new file mode 100644 +index 0000000..0304437 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-openvpn/po/it/openvpn.po +@@ -0,0 +1,541 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Report-Msgid-Bugs-To: \n" ++"POT-Creation-Date: 2009-05-19 19:36+0200\n" ++"PO-Revision-Date: 2012-04-20 10:36+0200\n" ++"Last-Translator: claudyus \n" ++"Language-Team: LANGUAGE \n" ++"Language: it\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n != 1);\n" ++"X-Generator: Pootle 2.0.4\n" ++ ++msgid "%s" ++msgstr "%s" ++ ++msgid "'net30', 'p2p', or 'subnet'" ++msgstr "" ++ ++msgid "Accept options pushed from server" ++msgstr "Accetta opzioni inviate dal server" ++ ++msgid "Add" ++msgstr "Aggiungi" ++ ++msgid "Add route after establishing connection" ++msgstr "Aggiungi rotte dopo aver stabilito la connessione" ++ ++msgid "Additional authentication over TLS" ++msgstr "Autenticazione addizionale over TLS" ++ ++msgid "Allow client-to-client traffic" ++msgstr "Permetti traffico client-client" ++ ++msgid "Allow multiple clients with same certificate" ++msgstr "Permetti più client con lo stesso certificato" ++ ++msgid "Allow only one session" ++msgstr "Permetti solo una sessione" ++ ++msgid "Allow remote to change its IP or port" ++msgstr "Permetti ai remote di cambiare il proprio IP o porta" ++ ++msgid "Allowed maximum of connected clients" ++msgstr "Numero massimo di clienti connessi" ++ ++msgid "Allowed maximum of internal" ++msgstr "" ++ ++msgid "Allowed maximum of new connections" ++msgstr "Numero massimo di nuove connessioni ammesse" ++ ++msgid "Append log to file" ++msgstr "Appendi il log al file" ++ ++msgid "Authenticate using username/password" ++msgstr "Autenticazione usando username/passoword" ++ ++msgid "Automatically redirect default route" ++msgstr "Modifica automaticamente la default route" ++ ++msgid "Below is a list of configured OpenVPN instances and their current state" ++msgstr "" ++"Sotto c'è una lista di istanze di OpenVPN configurate e il loro stato " ++"corrente" ++ ++msgid "Call down cmd/script before TUN/TAP close" ++msgstr "" ++ ++msgid "Certificate authority" ++msgstr "" ++ ++msgid "Change process priority" ++msgstr "Cambia priorità del processo" ++ ++msgid "Change to directory before initialization" ++msgstr "" ++ ++msgid "Check peer certificate against a CRL" ++msgstr "" ++ ++msgid "Chroot to directory after initialization" ++msgstr "" ++ ++msgid "Client is disabled" ++msgstr "" ++ ++msgid "Configuration category" ++msgstr "" ++ ++msgid "Configure client mode" ++msgstr "" ++ ++msgid "Configure server bridge" ++msgstr "" ++ ++msgid "Configure server mode" ++msgstr "" ++ ++msgid "Connect through Socks5 proxy" ++msgstr "Connetti attraverso un proxy Socks5" ++ ++msgid "Connect to remote host through an HTTP proxy" ++msgstr "Connetti attraverso un proxy HTTP" ++ ++msgid "Connection retry interval" ++msgstr "" ++ ++msgid "Daemonize after initialization" ++msgstr "" ++ ++msgid "Delay n seconds after connection" ++msgstr "" ++ ++msgid "Delay tun/tap open and up script execution" ++msgstr "" ++ ++msgid "Diffie Hellman parameters" ++msgstr "" ++ ++msgid "Directory for custom client config files" ++msgstr "" ++ ++msgid "Disable Paging" ++msgstr "" ++ ++msgid "Disable cipher initialisation vector" ++msgstr "" ++ ++msgid "Disable options consistency check" ++msgstr "" ++ ++msgid "Disable replay protection" ++msgstr "" ++ ++msgid "Do not bind to local address and port" ++msgstr "Non effettuare il bind sull'indirizzo/porta locale" ++ ++msgid "Don't actually execute ifconfig" ++msgstr "Non eseguire realmente ifconfig" ++ ++msgid "Don't add routes automatically" ++msgstr "Non aggiungere rotte automaticamente" ++ ++msgid "Don't cache --askpass or --auth-user-pass passwords" ++msgstr "" ++ ++msgid "Don't inherit global push options" ++msgstr "" ++ ++msgid "Don't log timestamps" ++msgstr "Non loggare il timestamps" ++ ++msgid "Don't re-read key on restart" ++msgstr "Non rileggere le chiavi al riavvio" ++ ++msgid "Don't require client certificate" ++msgstr "Non richiedere certificati dei client" ++ ++msgid "Don't use adaptive lzo compression" ++msgstr "Non usare compressione lzo adattiva" ++ ++msgid "Don't warn on ifconfig inconsistencies" ++msgstr "" ++ ++msgid "Echo parameters to log" ++msgstr "" ++ ++msgid "Empirically measure MTU" ++msgstr "Misura empericamente l'MTU" ++ ++msgid "Enable OpenSSL hardware crypto engines" ++msgstr "Abilita il supporto criptografico hardware per OpenSSL" ++ ++msgid "Enable Path MTU discovery" ++msgstr "" ++ ++msgid "Enable Static Key encryption mode (non-TLS)" ++msgstr "" ++ ++msgid "Enable TLS and assume client role" ++msgstr "" ++ ++msgid "Enable TLS and assume server role" ++msgstr "" ++ ++msgid "Enable internal datagram fragmentation" ++msgstr "Abilita frammentazione interna dei datagram" ++ ++msgid "Enable management interface on IP port" ++msgstr "" ++ ++msgid "Enabled" ++msgstr "Abilitato" ++ ++msgid "Encryption cipher for packets" ++msgstr "" ++ ++msgid "Execute shell cmd after routes are added" ++msgstr "Esegui un comando shell dopo che le rotte sono aggiunte" ++ ++msgid "Execute shell command on remote ip change" ++msgstr "Esegui un comando shell al cambio di ip remoto" ++ ++msgid "" ++"Executed in server mode on new client connections, when the client is still " ++"untrusted" ++msgstr "" ++ ++msgid "" ++"Executed in server mode whenever an IPv4 address/route or MAC address is " ++"added to OpenVPN's internal routing table" ++msgstr "" ++ ++msgid "Exit on TLS negotiation failure" ++msgstr "" ++ ++msgid "Get PEM password from controlling tty before we daemonize" ++msgstr "" ++ ++msgid "HMAC authentication for packets" ++msgstr "" ++ ++msgid "Handling of authentication failures" ++msgstr "" ++ ++msgid "" ++"Helper directive to simplify the expression of --ping and --ping-restart in " ++"server mode configurations" ++msgstr "" ++ ++msgid "If hostname resolve fails, retry" ++msgstr "" ++ ++msgid "Instance \"%s\"" ++msgstr "Istanza \"%s\"" ++ ++msgid "Invalid" ++msgstr "" ++ ++msgid "Keep local IP address on restart" ++msgstr "Mantieni l'IP local al riavvio" ++ ++msgid "Keep remote IP address on restart" ++msgstr "Mantieni l'IP remoto al riavvio" ++ ++msgid "Keep tun/tap device open on restart" ++msgstr "Mantienti il device tun/tap aperto al riavvio" ++ ++msgid "Key transition window" ++msgstr "" ++ ++msgid "Limit repeated log messages" ++msgstr "Limita le ripetizioni di messaggi nel log" ++ ++msgid "Local certificate" ++msgstr "" ++ ++msgid "Local host name or ip address" ++msgstr "" ++ ++msgid "Local private key" ++msgstr "Chiave privata local" ++ ++msgid "Major mode" ++msgstr "" ++ ++msgid "Make tun device IPv6 capable" ++msgstr "Rendi il device tun ipv6 ready" ++ ++msgid "Maximum number of queued TCP output packets" ++msgstr "" ++ ++msgid "Number of allocated broadcast buffers" ++msgstr "" ++ ++msgid "Number of lines for log file history" ++msgstr "" ++ ++msgid "Only accept connections from given X509 name" ++msgstr "" ++ ++msgid "Only process ping timeouts if routes exist" ++msgstr "" ++ ++msgid "OpenVPN" ++msgstr "OpenVPN" ++ ++msgid "OpenVPN instances" ++msgstr "OpenVPN istanze" ++ ++msgid "Optimize TUN/TAP/UDP writes" ++msgstr "Ottimizza le scritture su TUN/TAP/UDP" ++ ++msgid "Output to syslog and do not daemonize" ++msgstr "" ++ ++msgid "Overview" ++msgstr "Anteprima" ++ ++msgid "PKCS#12 file containing keys" ++msgstr "PKCS#12 file containing keys" ++ ++msgid "Pass environment variables to script" ++msgstr "Passa le variabili d'ambiente allo script" ++ ++msgid "Persist replay-protection state" ++msgstr "" ++ ++msgid "Persist/unpersist ifconfig-pool" ++msgstr "" ++ ++msgid "Ping remote every n seconds over TCP/UDP port" ++msgstr "" ++ ++msgid "Policy level over usage of external programs and scripts" ++msgstr "" ++ ++msgid "Port" ++msgstr "Porta" ++ ++msgid "Protocol" ++msgstr "Protocollo" ++ ++msgid "Proxy timeout in seconds" ++msgstr "" ++ ++msgid "Push an ifconfig option to remote" ++msgstr "" ++ ++msgid "Push options to peer" ++msgstr "" ++ ++msgid "Query management channel for private key" ++msgstr "" ++ ++msgid "Randomly choose remote server" ++msgstr "" ++ ++msgid "Refuse connection if no custom client config" ++msgstr "" ++ ++msgid "Remap SIGUSR1 signals" ++msgstr "" ++ ++msgid "Remote host name or ip address" ++msgstr "" ++ ++msgid "Remote ping timeout" ++msgstr "" ++ ++msgid "Renegotiate data chan. key after bytes" ++msgstr "" ++ ++msgid "Renegotiate data chan. key after packets" ++msgstr "" ++ ++msgid "Renegotiate data chan. key after seconds" ++msgstr "" ++ ++msgid "Replay protection sliding window size" ++msgstr "" ++ ++msgid "Require explicit designation on certificate" ++msgstr "" ++ ++msgid "Require explicit key usage on certificate" ++msgstr "" ++ ++msgid "Restart after remote ping timeout" ++msgstr "" ++ ++msgid "Retransmit timeout on TLS control channel" ++msgstr "" ++ ++msgid "Retry indefinitely on HTTP proxy errors" ++msgstr "" ++ ++msgid "Retry indefinitely on Socks proxy errors" ++msgstr "" ++ ++msgid "Route subnet to client" ++msgstr "" ++ ++msgid "Run as an inetd or xinetd server" ++msgstr "" ++ ++msgid "Run script cmd on client connection" ++msgstr "" ++ ++msgid "Run script cmd on client disconnection" ++msgstr "" ++ ++msgid "Run up/down scripts for all restarts" ++msgstr "" ++ ++msgid "Send notification to peer on disconnect" ++msgstr "" ++ ++msgid "Set GID to group" ++msgstr "" ++ ++msgid "Set TCP/UDP MTU" ++msgstr "" ++ ++msgid "Set UID to user" ++msgstr "" ++ ++msgid "Set aside a pool of subnets" ++msgstr "" ++ ++msgid "Set extended HTTP proxy options" ++msgstr "" ++ ++msgid "Set output verbosity" ++msgstr "" ++ ++msgid "Set size of real and virtual address hash tables" ++msgstr "" ++ ++msgid "Set the TCP/UDP receive buffer size" ++msgstr "" ++ ++msgid "Set the TCP/UDP send buffer size" ++msgstr "" ++ ++msgid "Set tun/tap TX queue length" ++msgstr "" ++ ++msgid "Set tun/tap adapter parameters" ++msgstr "" ++ ++msgid "Set tun/tap device MTU" ++msgstr "" ++ ++msgid "Set tun/tap device overhead" ++msgstr "" ++ ++msgid "Set upper bound on TCP MSS" ++msgstr "" ++ ++msgid "Shaping for peer bandwidth" ++msgstr "" ++ ++msgid "Shell cmd to execute after tun device open" ++msgstr "" ++ ++msgid "Shell cmd to run after tun device close" ++msgstr "" ++ ++msgid "Shell command to verify X509 name" ++msgstr "" ++ ++msgid "Silence the output of replay warnings" ++msgstr "" ++ ++msgid "Size of cipher key" ++msgstr "" ++ ++msgid "Specify a default gateway for routes" ++msgstr "" ++ ++msgid "Start OpenVPN in a hibernating state" ++msgstr "" ++ ++msgid "Start/Stop" ++msgstr "" ++ ++msgid "Started" ++msgstr "Avviato" ++ ++msgid "Status file format version" ++msgstr "" ++ ++msgid "Switch to advanced configuration »" ++msgstr "Passa alla configurazione avanzata »" ++ ++msgid "TCP/UDP port # for both local and remote" ++msgstr "" ++ ++msgid "TCP/UDP port # for local (default=1194)" ++msgstr "" ++ ++msgid "TCP/UDP port # for remote (default=1194)" ++msgstr "" ++ ++msgid "TLS cipher" ++msgstr "" ++ ++msgid "TOS passthrough (applies to IPv4 only)" ++msgstr "" ++ ++msgid "Temporary directory for client-connect return file" ++msgstr "" ++ ++msgid "Timeframe for key exchange" ++msgstr "" ++ ++msgid "Type of used device" ++msgstr "" ++ ++msgid "Use fast LZO compression" ++msgstr "" ++ ++msgid "Use individual addresses rather than /30 subnets" ++msgstr "" ++ ++msgid "Use protocol" ++msgstr "" ++ ++msgid "Use tun/tap device node" ++msgstr "" ++ ++msgid "Use username as common name" ++msgstr "" ++ ++msgid "Write log to file" ++msgstr "" ++ ++msgid "Write process ID to file" ++msgstr "" ++ ++msgid "Write status to file every n seconds" ++msgstr "" ++ ++msgid "no" ++msgstr "no" ++ ++msgid "tun/tap device" ++msgstr "" ++ ++msgid "tun/tap inactivity timeout" ++msgstr "" ++ ++msgid "yes (%i)" ++msgstr "si (%i)" ++ ++msgid "« Switch to basic configuration" ++msgstr "« Passa alla configurazione base" +diff --git a/feeds/luci/applications/luci-app-openvpn/po/ja/openvpn.po b/feeds/luci/applications/luci-app-openvpn/po/ja/openvpn.po +new file mode 100644 +index 0000000..dc558a8 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-openvpn/po/ja/openvpn.po +@@ -0,0 +1,551 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Report-Msgid-Bugs-To: \n" ++"POT-Creation-Date: 2009-05-19 19:36+0200\n" ++"PO-Revision-Date: 2012-04-09 08:12+0200\n" ++"Last-Translator: Kentaro \n" ++"Language-Team: LANGUAGE \n" ++"Language: ja\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=1; plural=0;\n" ++"X-Generator: Pootle 2.0.4\n" ++ ++msgid "%s" ++msgstr "%s" ++ ++msgid "'net30', 'p2p', or 'subnet'" ++msgstr "'net30', 'p2p', ã¾ãŸã¯ 'subnet'" ++ ++msgid "Accept options pushed from server" ++msgstr "" ++ ++msgid "Add" ++msgstr "追加" ++ ++msgid "Add route after establishing connection" ++msgstr "" ++ ++msgid "Additional authentication over TLS" ++msgstr "" ++ ++msgid "Allow client-to-client traffic" ++msgstr "クライアント間通信を許å¯ã™ã‚‹" ++ ++msgid "Allow multiple clients with same certificate" ++msgstr "" ++ ++msgid "Allow only one session" ++msgstr "1ã¤ã®ã‚»ãƒƒã‚·ãƒ§ãƒ³ã®ã¿ã‚’許å¯ã™ã‚‹" ++ ++msgid "Allow remote to change its IP or port" ++msgstr "" ++ ++msgid "Allowed maximum of connected clients" ++msgstr "" ++ ++msgid "Allowed maximum of internal" ++msgstr "" ++ ++msgid "Allowed maximum of new connections" ++msgstr "" ++ ++msgid "Append log to file" ++msgstr "" ++ ++msgid "Authenticate using username/password" ++msgstr "" ++ ++msgid "Automatically redirect default route" ++msgstr "" ++ ++msgid "Below is a list of configured OpenVPN instances and their current state" ++msgstr "ç¾åœ¨è¨­å®šæ¸ˆã®OpenVPNã®è¨­å®šã¨ã‚¹ãƒ†ãƒ¼ã‚¿ã‚¹ã‚’表示ã—ã¦ã„ã¾ã™ã€‚" ++ ++msgid "Call down cmd/script before TUN/TAP close" ++msgstr "" ++ ++msgid "Certificate authority" ++msgstr "" ++ ++msgid "Change process priority" ++msgstr "" ++ ++msgid "Change to directory before initialization" ++msgstr "" ++ ++msgid "Check peer certificate against a CRL" ++msgstr "" ++ ++msgid "Chroot to directory after initialization" ++msgstr "" ++ ++msgid "Client is disabled" ++msgstr "" ++ ++msgid "Configuration category" ++msgstr "設定カテゴリ" ++ ++msgid "Configure client mode" ++msgstr "クライアントモードã«è¨­å®š" ++ ++msgid "Configure server bridge" ++msgstr "" ++ ++msgid "Configure server mode" ++msgstr "サーãƒãƒ¼ãƒ¢ãƒ¼ãƒ‰ã«è¨­å®š" ++ ++msgid "Connect through Socks5 proxy" ++msgstr "" ++ ++msgid "Connect to remote host through an HTTP proxy" ++msgstr "" ++ ++msgid "Connection retry interval" ++msgstr "å†æŽ¥ç¶šé–“éš”" ++ ++msgid "Daemonize after initialization" ++msgstr "åˆæœŸåŒ–後ã«ãƒ‡ãƒ¼ãƒ¢ãƒ³åŒ–ã™ã‚‹" ++ ++msgid "Delay n seconds after connection" ++msgstr "セッション接続後ã€n秒ディレイã™ã‚‹" ++ ++msgid "Delay tun/tap open and up script execution" ++msgstr "" ++ ++msgid "Diffie Hellman parameters" ++msgstr "Diffie Hellman パラメータ" ++ ++msgid "Directory for custom client config files" ++msgstr "" ++ ++msgid "Disable Paging" ++msgstr "ページングを無効ã«ã™ã‚‹" ++ ++msgid "Disable cipher initialisation vector" ++msgstr "" ++ ++msgid "Disable options consistency check" ++msgstr "" ++ ++msgid "Disable replay protection" ++msgstr "" ++ ++msgid "Do not bind to local address and port" ++msgstr "" ++ ++msgid "Don't actually execute ifconfig" ++msgstr "" ++ ++msgid "Don't add routes automatically" ++msgstr "" ++ ++msgid "Don't cache --askpass or --auth-user-pass passwords" ++msgstr "" ++ ++msgid "Don't inherit global push options" ++msgstr "" ++ ++msgid "Don't log timestamps" ++msgstr "時刻をログã«æ›¸ãè¾¼ã¾ãªã„" ++ ++msgid "Don't re-read key on restart" ++msgstr "å†èµ·å‹•æ™‚ã«ã‚­ãƒ¼ã®å†èª­ã¿è¾¼ã¿ã‚’è¡Œã‚ãªã„" ++ ++msgid "Don't require client certificate" ++msgstr "" ++ ++msgid "Don't use adaptive lzo compression" ++msgstr "" ++ ++msgid "Don't warn on ifconfig inconsistencies" ++msgstr "" ++ ++msgid "Echo parameters to log" ++msgstr "" ++ ++msgid "Empirically measure MTU" ++msgstr "" ++ ++msgid "Enable OpenSSL hardware crypto engines" ++msgstr "OpenSSLæš—å·åŒ–ã®ãƒãƒ¼ãƒ‰ã‚¦ã‚§ã‚¢ã‚µãƒãƒ¼ãƒˆã‚’有効ã«ã™ã‚‹" ++ ++msgid "Enable Path MTU discovery" ++msgstr "Path MTU discovery を有効ã«ã™ã‚‹" ++ ++msgid "Enable Static Key encryption mode (non-TLS)" ++msgstr "" ++ ++msgid "Enable TLS and assume client role" ++msgstr "" ++ ++msgid "Enable TLS and assume server role" ++msgstr "" ++ ++msgid "Enable internal datagram fragmentation" ++msgstr "" ++ ++msgid "Enable management interface on IP port" ++msgstr "" ++ ++msgid "Enabled" ++msgstr "有効" ++ ++msgid "Encryption cipher for packets" ++msgstr "" ++ ++msgid "Execute shell cmd after routes are added" ++msgstr "" ++ ++msgid "Execute shell command on remote ip change" ++msgstr "" ++ ++msgid "" ++"Executed in server mode on new client connections, when the client is still " ++"untrusted" ++msgstr "" ++ ++msgid "" ++"Executed in server mode whenever an IPv4 address/route or MAC address is " ++"added to OpenVPN's internal routing table" ++msgstr "" ++ ++msgid "Exit on TLS negotiation failure" ++msgstr "" ++ ++msgid "Get PEM password from controlling tty before we daemonize" ++msgstr "" ++ ++msgid "HMAC authentication for packets" ++msgstr "" ++ ++msgid "Handling of authentication failures" ++msgstr "" ++ ++msgid "" ++"Helper directive to simplify the expression of --ping and --ping-restart in " ++"server mode configurations" ++msgstr "" ++ ++msgid "If hostname resolve fails, retry" ++msgstr "" ++ ++msgid "Instance \"%s\"" ++msgstr "設定 \"%s\"" ++ ++msgid "Invalid" ++msgstr "無効" ++ ++msgid "Keep local IP address on restart" ++msgstr "" ++ ++msgid "Keep remote IP address on restart" ++msgstr "" ++ ++msgid "Keep tun/tap device open on restart" ++msgstr "" ++ ++msgid "Key transition window" ++msgstr "" ++ ++msgid "Limit repeated log messages" ++msgstr "" ++ ++msgid "Local certificate" ++msgstr "" ++ ++msgid "Local host name or ip address" ++msgstr "" ++ ++msgid "Local private key" ++msgstr "" ++ ++msgid "Major mode" ++msgstr "" ++ ++msgid "Make tun device IPv6 capable" ++msgstr "tun デãƒã‚¤ã‚¹ã§IPv6機能を有効ã«ã™ã‚‹" ++ ++msgid "Maximum number of queued TCP output packets" ++msgstr "" ++ ++msgid "Number of allocated broadcast buffers" ++msgstr "" ++ ++msgid "Number of lines for log file history" ++msgstr "" ++ ++msgid "Only accept connections from given X509 name" ++msgstr "" ++ ++msgid "Only process ping timeouts if routes exist" ++msgstr "" ++ ++msgid "OpenVPN" ++msgstr "OpenVPN" ++ ++msgid "OpenVPN instances" ++msgstr "OpenVPN 設定" ++ ++msgid "Optimize TUN/TAP/UDP writes" ++msgstr "" ++ ++msgid "Output to syslog and do not daemonize" ++msgstr "" ++ ++msgid "Overview" ++msgstr "概è¦" ++ ++msgid "PKCS#12 file containing keys" ++msgstr "" ++ ++msgid "Pass environment variables to script" ++msgstr "" ++ ++msgid "Persist replay-protection state" ++msgstr "" ++ ++msgid "Persist/unpersist ifconfig-pool" ++msgstr "" ++ ++msgid "Ping remote every n seconds over TCP/UDP port" ++msgstr "" ++ ++msgid "Policy level over usage of external programs and scripts" ++msgstr "" ++ ++msgid "Port" ++msgstr "ãƒãƒ¼ãƒˆ" ++ ++msgid "Protocol" ++msgstr "プロトコル" ++ ++msgid "Proxy timeout in seconds" ++msgstr "" ++ ++msgid "Push an ifconfig option to remote" ++msgstr "" ++ ++msgid "Push options to peer" ++msgstr "" ++ ++msgid "Query management channel for private key" ++msgstr "" ++ ++msgid "Randomly choose remote server" ++msgstr "" ++ ++msgid "Refuse connection if no custom client config" ++msgstr "" ++ ++msgid "Remap SIGUSR1 signals" ++msgstr "" ++ ++msgid "Remote host name or ip address" ++msgstr "" ++ ++msgid "Remote ping timeout" ++msgstr "" ++ ++msgid "Renegotiate data chan. key after bytes" ++msgstr "" ++ ++msgid "Renegotiate data chan. key after packets" ++msgstr "" ++ ++msgid "Renegotiate data chan. key after seconds" ++msgstr "" ++ ++msgid "Replay protection sliding window size" ++msgstr "" ++ ++msgid "Require explicit designation on certificate" ++msgstr "" ++ ++msgid "Require explicit key usage on certificate" ++msgstr "" ++ ++msgid "Restart after remote ping timeout" ++msgstr "" ++ ++msgid "Retransmit timeout on TLS control channel" ++msgstr "" ++ ++msgid "Retry indefinitely on HTTP proxy errors" ++msgstr "" ++ ++msgid "Retry indefinitely on Socks proxy errors" ++msgstr "" ++ ++msgid "Route subnet to client" ++msgstr "" ++ ++msgid "Run as an inetd or xinetd server" ++msgstr "" ++ ++msgid "Run script cmd on client connection" ++msgstr "" ++ ++msgid "Run script cmd on client disconnection" ++msgstr "" ++ ++msgid "Run up/down scripts for all restarts" ++msgstr "" ++ ++msgid "Send notification to peer on disconnect" ++msgstr "" ++ ++msgid "Set GID to group" ++msgstr "" ++ ++msgid "Set TCP/UDP MTU" ++msgstr "TCP/UDP ã®MTUを設定" ++ ++msgid "Set UID to user" ++msgstr "" ++ ++msgid "Set aside a pool of subnets" ++msgstr "" ++ ++msgid "Set extended HTTP proxy options" ++msgstr "" ++ ++msgid "Set output verbosity" ++msgstr "ログ出力レベルã®è¨­å®š" ++ ++msgid "Set size of real and virtual address hash tables" ++msgstr "" ++ ++msgid "Set the TCP/UDP receive buffer size" ++msgstr "TCP/UDP ã®å—ä¿¡ãƒãƒƒãƒ•ã‚¡ã‚µã‚¤ã‚º" ++ ++msgid "Set the TCP/UDP send buffer size" ++msgstr "TCP/UDP ã®é€ä¿¡ãƒãƒƒãƒ•ã‚¡ã‚µã‚¤ã‚º" ++ ++msgid "Set tun/tap TX queue length" ++msgstr "tun/tap デãƒã‚¤ã‚¹ã®é€ä¿¡ã‚­ãƒ¥ãƒ¼ã‚µã‚¤ã‚º" ++ ++msgid "Set tun/tap adapter parameters" ++msgstr "" ++ ++msgid "Set tun/tap device MTU" ++msgstr "tun/tap デãƒã‚¤ã‚¹ã®MTU設定" ++ ++msgid "Set tun/tap device overhead" ++msgstr "" ++ ++msgid "Set upper bound on TCP MSS" ++msgstr "" ++ ++msgid "Shaping for peer bandwidth" ++msgstr "" ++ ++msgid "Shell cmd to execute after tun device open" ++msgstr "" ++ ++msgid "Shell cmd to run after tun device close" ++msgstr "" ++ ++msgid "Shell command to verify X509 name" ++msgstr "" ++ ++msgid "Silence the output of replay warnings" ++msgstr "" ++ ++msgid "Size of cipher key" ++msgstr "" ++ ++msgid "Specify a default gateway for routes" ++msgstr "" ++ ++msgid "Start OpenVPN in a hibernating state" ++msgstr "" ++ ++msgid "Start/Stop" ++msgstr "開始 / åœæ­¢" ++ ++msgid "Started" ++msgstr "実行中" ++ ++msgid "Status file format version" ++msgstr "" ++ ++msgid "Switch to advanced configuration »" ++msgstr "詳細設定ã¸ç§»å‹• »" ++ ++msgid "TCP/UDP port # for both local and remote" ++msgstr "TCP/UDP ãƒãƒ¼ãƒˆ (ローカル・リモート共用)" ++ ++msgid "TCP/UDP port # for local (default=1194)" ++msgstr "TCP/UDP ãƒãƒ¼ãƒˆ (ローカル, 標準設定=1194)" ++ ++msgid "TCP/UDP port # for remote (default=1194)" ++msgstr "TCP/UDP ãƒãƒ¼ãƒˆ (リモート, 標準設定=1194)" ++ ++msgid "TLS cipher" ++msgstr "TLS æš—å·åŒ–æ–¹å¼" ++ ++msgid "TOS passthrough (applies to IPv4 only)" ++msgstr "" ++ ++msgid "Temporary directory for client-connect return file" ++msgstr "" ++ ++msgid "Timeframe for key exchange" ++msgstr "" ++ ++msgid "Type of used device" ++msgstr "" ++ ++msgid "Use fast LZO compression" ++msgstr "高速LZO圧縮機能を使用ã™ã‚‹" ++ ++msgid "Use individual addresses rather than /30 subnets" ++msgstr "" ++ ++msgid "Use protocol" ++msgstr "使用ã™ã‚‹ãƒ—ロトコル" ++ ++msgid "Use tun/tap device node" ++msgstr "" ++ ++msgid "Use username as common name" ++msgstr "" ++ ++msgid "Write log to file" ++msgstr "" ++ ++msgid "Write process ID to file" ++msgstr "" ++ ++msgid "Write status to file every n seconds" ++msgstr "" ++ ++msgid "no" ++msgstr "ã„ã„ãˆ" ++ ++msgid "tun/tap device" ++msgstr "" ++ ++msgid "tun/tap inactivity timeout" ++msgstr "" ++ ++msgid "yes (%i)" ++msgstr "ã¯ã„ (%i)" ++ ++msgid "« Switch to basic configuration" ++msgstr "« 基本設定ã¸ç§»å‹•" ++ ++#~ msgid "Cryptography" ++#~ msgstr "æš—å·è¨­å®š" ++ ++#~ msgid "Networking" ++#~ msgstr "ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯" ++ ++#~ msgid "Service" ++#~ msgstr "サービス" ++ ++#~ msgid "VPN" ++#~ msgstr "VPN" +diff --git a/feeds/luci/applications/luci-app-openvpn/po/ms/openvpn.po b/feeds/luci/applications/luci-app-openvpn/po/ms/openvpn.po +new file mode 100644 +index 0000000..0ed8909 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-openvpn/po/ms/openvpn.po +@@ -0,0 +1,534 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Last-Translator: Automatically generated\n" ++"Language-Team: none\n" ++"Language: \n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++ ++msgid "%s" ++msgstr "" ++ ++msgid "'net30', 'p2p', or 'subnet'" ++msgstr "" ++ ++msgid "Accept options pushed from server" ++msgstr "" ++ ++msgid "Add" ++msgstr "" ++ ++msgid "Add route after establishing connection" ++msgstr "" ++ ++msgid "Additional authentication over TLS" ++msgstr "" ++ ++msgid "Allow client-to-client traffic" ++msgstr "" ++ ++msgid "Allow multiple clients with same certificate" ++msgstr "" ++ ++msgid "Allow only one session" ++msgstr "" ++ ++msgid "Allow remote to change its IP or port" ++msgstr "" ++ ++msgid "Allowed maximum of connected clients" ++msgstr "" ++ ++msgid "Allowed maximum of internal" ++msgstr "" ++ ++msgid "Allowed maximum of new connections" ++msgstr "" ++ ++msgid "Append log to file" ++msgstr "" ++ ++msgid "Authenticate using username/password" ++msgstr "" ++ ++msgid "Automatically redirect default route" ++msgstr "" ++ ++msgid "Below is a list of configured OpenVPN instances and their current state" ++msgstr "" ++ ++msgid "Call down cmd/script before TUN/TAP close" ++msgstr "" ++ ++msgid "Certificate authority" ++msgstr "" ++ ++msgid "Change process priority" ++msgstr "" ++ ++msgid "Change to directory before initialization" ++msgstr "" ++ ++msgid "Check peer certificate against a CRL" ++msgstr "" ++ ++msgid "Chroot to directory after initialization" ++msgstr "" ++ ++msgid "Client is disabled" ++msgstr "" ++ ++msgid "Configuration category" ++msgstr "" ++ ++msgid "Configure client mode" ++msgstr "" ++ ++msgid "Configure server bridge" ++msgstr "" ++ ++msgid "Configure server mode" ++msgstr "" ++ ++msgid "Connect through Socks5 proxy" ++msgstr "" ++ ++msgid "Connect to remote host through an HTTP proxy" ++msgstr "" ++ ++msgid "Connection retry interval" ++msgstr "" ++ ++msgid "Daemonize after initialization" ++msgstr "" ++ ++msgid "Delay n seconds after connection" ++msgstr "" ++ ++msgid "Delay tun/tap open and up script execution" ++msgstr "" ++ ++msgid "Diffie Hellman parameters" ++msgstr "" ++ ++msgid "Directory for custom client config files" ++msgstr "" ++ ++msgid "Disable Paging" ++msgstr "" ++ ++msgid "Disable cipher initialisation vector" ++msgstr "" ++ ++msgid "Disable options consistency check" ++msgstr "" ++ ++msgid "Disable replay protection" ++msgstr "" ++ ++msgid "Do not bind to local address and port" ++msgstr "" ++ ++msgid "Don't actually execute ifconfig" ++msgstr "" ++ ++msgid "Don't add routes automatically" ++msgstr "" ++ ++msgid "Don't cache --askpass or --auth-user-pass passwords" ++msgstr "" ++ ++msgid "Don't inherit global push options" ++msgstr "" ++ ++msgid "Don't log timestamps" ++msgstr "" ++ ++msgid "Don't re-read key on restart" ++msgstr "" ++ ++msgid "Don't require client certificate" ++msgstr "" ++ ++msgid "Don't use adaptive lzo compression" ++msgstr "" ++ ++msgid "Don't warn on ifconfig inconsistencies" ++msgstr "" ++ ++msgid "Echo parameters to log" ++msgstr "" ++ ++msgid "Empirically measure MTU" ++msgstr "" ++ ++msgid "Enable OpenSSL hardware crypto engines" ++msgstr "" ++ ++msgid "Enable Path MTU discovery" ++msgstr "" ++ ++msgid "Enable Static Key encryption mode (non-TLS)" ++msgstr "" ++ ++msgid "Enable TLS and assume client role" ++msgstr "" ++ ++msgid "Enable TLS and assume server role" ++msgstr "" ++ ++msgid "Enable internal datagram fragmentation" ++msgstr "" ++ ++msgid "Enable management interface on IP port" ++msgstr "" ++ ++msgid "Enabled" ++msgstr "" ++ ++msgid "Encryption cipher for packets" ++msgstr "" ++ ++msgid "Execute shell cmd after routes are added" ++msgstr "" ++ ++msgid "Execute shell command on remote ip change" ++msgstr "" ++ ++msgid "" ++"Executed in server mode on new client connections, when the client is still " ++"untrusted" ++msgstr "" ++ ++msgid "" ++"Executed in server mode whenever an IPv4 address/route or MAC address is " ++"added to OpenVPN's internal routing table" ++msgstr "" ++ ++msgid "Exit on TLS negotiation failure" ++msgstr "" ++ ++msgid "Get PEM password from controlling tty before we daemonize" ++msgstr "" ++ ++msgid "HMAC authentication for packets" ++msgstr "" ++ ++msgid "Handling of authentication failures" ++msgstr "" ++ ++msgid "" ++"Helper directive to simplify the expression of --ping and --ping-restart in " ++"server mode configurations" ++msgstr "" ++ ++msgid "If hostname resolve fails, retry" ++msgstr "" ++ ++msgid "Instance \"%s\"" ++msgstr "" ++ ++msgid "Invalid" ++msgstr "" ++ ++msgid "Keep local IP address on restart" ++msgstr "" ++ ++msgid "Keep remote IP address on restart" ++msgstr "" ++ ++msgid "Keep tun/tap device open on restart" ++msgstr "" ++ ++msgid "Key transition window" ++msgstr "" ++ ++msgid "Limit repeated log messages" ++msgstr "" ++ ++msgid "Local certificate" ++msgstr "" ++ ++msgid "Local host name or ip address" ++msgstr "" ++ ++msgid "Local private key" ++msgstr "" ++ ++msgid "Major mode" ++msgstr "" ++ ++msgid "Make tun device IPv6 capable" ++msgstr "" ++ ++msgid "Maximum number of queued TCP output packets" ++msgstr "" ++ ++msgid "Number of allocated broadcast buffers" ++msgstr "" ++ ++msgid "Number of lines for log file history" ++msgstr "" ++ ++msgid "Only accept connections from given X509 name" ++msgstr "" ++ ++msgid "Only process ping timeouts if routes exist" ++msgstr "" ++ ++msgid "OpenVPN" ++msgstr "" ++ ++msgid "OpenVPN instances" ++msgstr "" ++ ++msgid "Optimize TUN/TAP/UDP writes" ++msgstr "" ++ ++msgid "Output to syslog and do not daemonize" ++msgstr "" ++ ++msgid "Overview" ++msgstr "" ++ ++msgid "PKCS#12 file containing keys" ++msgstr "" ++ ++msgid "Pass environment variables to script" ++msgstr "" ++ ++msgid "Persist replay-protection state" ++msgstr "" ++ ++msgid "Persist/unpersist ifconfig-pool" ++msgstr "" ++ ++msgid "Ping remote every n seconds over TCP/UDP port" ++msgstr "" ++ ++msgid "Policy level over usage of external programs and scripts" ++msgstr "" ++ ++msgid "Port" ++msgstr "" ++ ++msgid "Protocol" ++msgstr "" ++ ++msgid "Proxy timeout in seconds" ++msgstr "" ++ ++msgid "Push an ifconfig option to remote" ++msgstr "" ++ ++msgid "Push options to peer" ++msgstr "" ++ ++msgid "Query management channel for private key" ++msgstr "" ++ ++msgid "Randomly choose remote server" ++msgstr "" ++ ++msgid "Refuse connection if no custom client config" ++msgstr "" ++ ++msgid "Remap SIGUSR1 signals" ++msgstr "" ++ ++msgid "Remote host name or ip address" ++msgstr "" ++ ++msgid "Remote ping timeout" ++msgstr "" ++ ++msgid "Renegotiate data chan. key after bytes" ++msgstr "" ++ ++msgid "Renegotiate data chan. key after packets" ++msgstr "" ++ ++msgid "Renegotiate data chan. key after seconds" ++msgstr "" ++ ++msgid "Replay protection sliding window size" ++msgstr "" ++ ++msgid "Require explicit designation on certificate" ++msgstr "" ++ ++msgid "Require explicit key usage on certificate" ++msgstr "" ++ ++msgid "Restart after remote ping timeout" ++msgstr "" ++ ++msgid "Retransmit timeout on TLS control channel" ++msgstr "" ++ ++msgid "Retry indefinitely on HTTP proxy errors" ++msgstr "" ++ ++msgid "Retry indefinitely on Socks proxy errors" ++msgstr "" ++ ++msgid "Route subnet to client" ++msgstr "" ++ ++msgid "Run as an inetd or xinetd server" ++msgstr "" ++ ++msgid "Run script cmd on client connection" ++msgstr "" ++ ++msgid "Run script cmd on client disconnection" ++msgstr "" ++ ++msgid "Run up/down scripts for all restarts" ++msgstr "" ++ ++msgid "Send notification to peer on disconnect" ++msgstr "" ++ ++msgid "Set GID to group" ++msgstr "" ++ ++msgid "Set TCP/UDP MTU" ++msgstr "" ++ ++msgid "Set UID to user" ++msgstr "" ++ ++msgid "Set aside a pool of subnets" ++msgstr "" ++ ++msgid "Set extended HTTP proxy options" ++msgstr "" ++ ++msgid "Set output verbosity" ++msgstr "" ++ ++msgid "Set size of real and virtual address hash tables" ++msgstr "" ++ ++msgid "Set the TCP/UDP receive buffer size" ++msgstr "" ++ ++msgid "Set the TCP/UDP send buffer size" ++msgstr "" ++ ++msgid "Set tun/tap TX queue length" ++msgstr "" ++ ++msgid "Set tun/tap adapter parameters" ++msgstr "" ++ ++msgid "Set tun/tap device MTU" ++msgstr "" ++ ++msgid "Set tun/tap device overhead" ++msgstr "" ++ ++msgid "Set upper bound on TCP MSS" ++msgstr "" ++ ++msgid "Shaping for peer bandwidth" ++msgstr "" ++ ++msgid "Shell cmd to execute after tun device open" ++msgstr "" ++ ++msgid "Shell cmd to run after tun device close" ++msgstr "" ++ ++msgid "Shell command to verify X509 name" ++msgstr "" ++ ++msgid "Silence the output of replay warnings" ++msgstr "" ++ ++msgid "Size of cipher key" ++msgstr "" ++ ++msgid "Specify a default gateway for routes" ++msgstr "" ++ ++msgid "Start OpenVPN in a hibernating state" ++msgstr "" ++ ++msgid "Start/Stop" ++msgstr "" ++ ++msgid "Started" ++msgstr "" ++ ++msgid "Status file format version" ++msgstr "" ++ ++msgid "Switch to advanced configuration »" ++msgstr "" ++ ++msgid "TCP/UDP port # for both local and remote" ++msgstr "" ++ ++msgid "TCP/UDP port # for local (default=1194)" ++msgstr "" ++ ++msgid "TCP/UDP port # for remote (default=1194)" ++msgstr "" ++ ++msgid "TLS cipher" ++msgstr "" ++ ++msgid "TOS passthrough (applies to IPv4 only)" ++msgstr "" ++ ++msgid "Temporary directory for client-connect return file" ++msgstr "" ++ ++msgid "Timeframe for key exchange" ++msgstr "" ++ ++msgid "Type of used device" ++msgstr "" ++ ++msgid "Use fast LZO compression" ++msgstr "" ++ ++msgid "Use individual addresses rather than /30 subnets" ++msgstr "" ++ ++msgid "Use protocol" ++msgstr "" ++ ++msgid "Use tun/tap device node" ++msgstr "" ++ ++msgid "Use username as common name" ++msgstr "" ++ ++msgid "Write log to file" ++msgstr "" ++ ++msgid "Write process ID to file" ++msgstr "" ++ ++msgid "Write status to file every n seconds" ++msgstr "" ++ ++msgid "no" ++msgstr "" ++ ++msgid "tun/tap device" ++msgstr "" ++ ++msgid "tun/tap inactivity timeout" ++msgstr "" ++ ++msgid "yes (%i)" ++msgstr "" ++ ++msgid "« Switch to basic configuration" ++msgstr "" +diff --git a/feeds/luci/applications/luci-app-openvpn/po/no/openvpn.po b/feeds/luci/applications/luci-app-openvpn/po/no/openvpn.po +new file mode 100644 +index 0000000..55953b9 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-openvpn/po/no/openvpn.po +@@ -0,0 +1,535 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Last-Translator: Automatically generated\n" ++"Language-Team: none\n" ++"Language: \n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n != 1);\n" ++ ++msgid "%s" ++msgstr "" ++ ++msgid "'net30', 'p2p', or 'subnet'" ++msgstr "" ++ ++msgid "Accept options pushed from server" ++msgstr "" ++ ++msgid "Add" ++msgstr "" ++ ++msgid "Add route after establishing connection" ++msgstr "" ++ ++msgid "Additional authentication over TLS" ++msgstr "" ++ ++msgid "Allow client-to-client traffic" ++msgstr "" ++ ++msgid "Allow multiple clients with same certificate" ++msgstr "" ++ ++msgid "Allow only one session" ++msgstr "" ++ ++msgid "Allow remote to change its IP or port" ++msgstr "" ++ ++msgid "Allowed maximum of connected clients" ++msgstr "" ++ ++msgid "Allowed maximum of internal" ++msgstr "" ++ ++msgid "Allowed maximum of new connections" ++msgstr "" ++ ++msgid "Append log to file" ++msgstr "" ++ ++msgid "Authenticate using username/password" ++msgstr "" ++ ++msgid "Automatically redirect default route" ++msgstr "" ++ ++msgid "Below is a list of configured OpenVPN instances and their current state" ++msgstr "" ++ ++msgid "Call down cmd/script before TUN/TAP close" ++msgstr "" ++ ++msgid "Certificate authority" ++msgstr "" ++ ++msgid "Change process priority" ++msgstr "" ++ ++msgid "Change to directory before initialization" ++msgstr "" ++ ++msgid "Check peer certificate against a CRL" ++msgstr "" ++ ++msgid "Chroot to directory after initialization" ++msgstr "" ++ ++msgid "Client is disabled" ++msgstr "" ++ ++msgid "Configuration category" ++msgstr "" ++ ++msgid "Configure client mode" ++msgstr "" ++ ++msgid "Configure server bridge" ++msgstr "" ++ ++msgid "Configure server mode" ++msgstr "" ++ ++msgid "Connect through Socks5 proxy" ++msgstr "" ++ ++msgid "Connect to remote host through an HTTP proxy" ++msgstr "" ++ ++msgid "Connection retry interval" ++msgstr "" ++ ++msgid "Daemonize after initialization" ++msgstr "" ++ ++msgid "Delay n seconds after connection" ++msgstr "" ++ ++msgid "Delay tun/tap open and up script execution" ++msgstr "" ++ ++msgid "Diffie Hellman parameters" ++msgstr "" ++ ++msgid "Directory for custom client config files" ++msgstr "" ++ ++msgid "Disable Paging" ++msgstr "" ++ ++msgid "Disable cipher initialisation vector" ++msgstr "" ++ ++msgid "Disable options consistency check" ++msgstr "" ++ ++msgid "Disable replay protection" ++msgstr "" ++ ++msgid "Do not bind to local address and port" ++msgstr "" ++ ++msgid "Don't actually execute ifconfig" ++msgstr "" ++ ++msgid "Don't add routes automatically" ++msgstr "" ++ ++msgid "Don't cache --askpass or --auth-user-pass passwords" ++msgstr "" ++ ++msgid "Don't inherit global push options" ++msgstr "" ++ ++msgid "Don't log timestamps" ++msgstr "" ++ ++msgid "Don't re-read key on restart" ++msgstr "" ++ ++msgid "Don't require client certificate" ++msgstr "" ++ ++msgid "Don't use adaptive lzo compression" ++msgstr "" ++ ++msgid "Don't warn on ifconfig inconsistencies" ++msgstr "" ++ ++msgid "Echo parameters to log" ++msgstr "" ++ ++msgid "Empirically measure MTU" ++msgstr "" ++ ++msgid "Enable OpenSSL hardware crypto engines" ++msgstr "" ++ ++msgid "Enable Path MTU discovery" ++msgstr "" ++ ++msgid "Enable Static Key encryption mode (non-TLS)" ++msgstr "" ++ ++msgid "Enable TLS and assume client role" ++msgstr "" ++ ++msgid "Enable TLS and assume server role" ++msgstr "" ++ ++msgid "Enable internal datagram fragmentation" ++msgstr "" ++ ++msgid "Enable management interface on IP port" ++msgstr "" ++ ++msgid "Enabled" ++msgstr "" ++ ++msgid "Encryption cipher for packets" ++msgstr "" ++ ++msgid "Execute shell cmd after routes are added" ++msgstr "" ++ ++msgid "Execute shell command on remote ip change" ++msgstr "" ++ ++msgid "" ++"Executed in server mode on new client connections, when the client is still " ++"untrusted" ++msgstr "" ++ ++msgid "" ++"Executed in server mode whenever an IPv4 address/route or MAC address is " ++"added to OpenVPN's internal routing table" ++msgstr "" ++ ++msgid "Exit on TLS negotiation failure" ++msgstr "" ++ ++msgid "Get PEM password from controlling tty before we daemonize" ++msgstr "" ++ ++msgid "HMAC authentication for packets" ++msgstr "" ++ ++msgid "Handling of authentication failures" ++msgstr "" ++ ++msgid "" ++"Helper directive to simplify the expression of --ping and --ping-restart in " ++"server mode configurations" ++msgstr "" ++ ++msgid "If hostname resolve fails, retry" ++msgstr "" ++ ++msgid "Instance \"%s\"" ++msgstr "" ++ ++msgid "Invalid" ++msgstr "" ++ ++msgid "Keep local IP address on restart" ++msgstr "" ++ ++msgid "Keep remote IP address on restart" ++msgstr "" ++ ++msgid "Keep tun/tap device open on restart" ++msgstr "" ++ ++msgid "Key transition window" ++msgstr "" ++ ++msgid "Limit repeated log messages" ++msgstr "" ++ ++msgid "Local certificate" ++msgstr "" ++ ++msgid "Local host name or ip address" ++msgstr "" ++ ++msgid "Local private key" ++msgstr "" ++ ++msgid "Major mode" ++msgstr "" ++ ++msgid "Make tun device IPv6 capable" ++msgstr "" ++ ++msgid "Maximum number of queued TCP output packets" ++msgstr "" ++ ++msgid "Number of allocated broadcast buffers" ++msgstr "" ++ ++msgid "Number of lines for log file history" ++msgstr "" ++ ++msgid "Only accept connections from given X509 name" ++msgstr "" ++ ++msgid "Only process ping timeouts if routes exist" ++msgstr "" ++ ++msgid "OpenVPN" ++msgstr "" ++ ++msgid "OpenVPN instances" ++msgstr "" ++ ++msgid "Optimize TUN/TAP/UDP writes" ++msgstr "" ++ ++msgid "Output to syslog and do not daemonize" ++msgstr "" ++ ++msgid "Overview" ++msgstr "" ++ ++msgid "PKCS#12 file containing keys" ++msgstr "" ++ ++msgid "Pass environment variables to script" ++msgstr "" ++ ++msgid "Persist replay-protection state" ++msgstr "" ++ ++msgid "Persist/unpersist ifconfig-pool" ++msgstr "" ++ ++msgid "Ping remote every n seconds over TCP/UDP port" ++msgstr "" ++ ++msgid "Policy level over usage of external programs and scripts" ++msgstr "" ++ ++msgid "Port" ++msgstr "" ++ ++msgid "Protocol" ++msgstr "" ++ ++msgid "Proxy timeout in seconds" ++msgstr "" ++ ++msgid "Push an ifconfig option to remote" ++msgstr "" ++ ++msgid "Push options to peer" ++msgstr "" ++ ++msgid "Query management channel for private key" ++msgstr "" ++ ++msgid "Randomly choose remote server" ++msgstr "" ++ ++msgid "Refuse connection if no custom client config" ++msgstr "" ++ ++msgid "Remap SIGUSR1 signals" ++msgstr "" ++ ++msgid "Remote host name or ip address" ++msgstr "" ++ ++msgid "Remote ping timeout" ++msgstr "" ++ ++msgid "Renegotiate data chan. key after bytes" ++msgstr "" ++ ++msgid "Renegotiate data chan. key after packets" ++msgstr "" ++ ++msgid "Renegotiate data chan. key after seconds" ++msgstr "" ++ ++msgid "Replay protection sliding window size" ++msgstr "" ++ ++msgid "Require explicit designation on certificate" ++msgstr "" ++ ++msgid "Require explicit key usage on certificate" ++msgstr "" ++ ++msgid "Restart after remote ping timeout" ++msgstr "" ++ ++msgid "Retransmit timeout on TLS control channel" ++msgstr "" ++ ++msgid "Retry indefinitely on HTTP proxy errors" ++msgstr "" ++ ++msgid "Retry indefinitely on Socks proxy errors" ++msgstr "" ++ ++msgid "Route subnet to client" ++msgstr "" ++ ++msgid "Run as an inetd or xinetd server" ++msgstr "" ++ ++msgid "Run script cmd on client connection" ++msgstr "" ++ ++msgid "Run script cmd on client disconnection" ++msgstr "" ++ ++msgid "Run up/down scripts for all restarts" ++msgstr "" ++ ++msgid "Send notification to peer on disconnect" ++msgstr "" ++ ++msgid "Set GID to group" ++msgstr "" ++ ++msgid "Set TCP/UDP MTU" ++msgstr "" ++ ++msgid "Set UID to user" ++msgstr "" ++ ++msgid "Set aside a pool of subnets" ++msgstr "" ++ ++msgid "Set extended HTTP proxy options" ++msgstr "" ++ ++msgid "Set output verbosity" ++msgstr "" ++ ++msgid "Set size of real and virtual address hash tables" ++msgstr "" ++ ++msgid "Set the TCP/UDP receive buffer size" ++msgstr "" ++ ++msgid "Set the TCP/UDP send buffer size" ++msgstr "" ++ ++msgid "Set tun/tap TX queue length" ++msgstr "" ++ ++msgid "Set tun/tap adapter parameters" ++msgstr "" ++ ++msgid "Set tun/tap device MTU" ++msgstr "" ++ ++msgid "Set tun/tap device overhead" ++msgstr "" ++ ++msgid "Set upper bound on TCP MSS" ++msgstr "" ++ ++msgid "Shaping for peer bandwidth" ++msgstr "" ++ ++msgid "Shell cmd to execute after tun device open" ++msgstr "" ++ ++msgid "Shell cmd to run after tun device close" ++msgstr "" ++ ++msgid "Shell command to verify X509 name" ++msgstr "" ++ ++msgid "Silence the output of replay warnings" ++msgstr "" ++ ++msgid "Size of cipher key" ++msgstr "" ++ ++msgid "Specify a default gateway for routes" ++msgstr "" ++ ++msgid "Start OpenVPN in a hibernating state" ++msgstr "" ++ ++msgid "Start/Stop" ++msgstr "" ++ ++msgid "Started" ++msgstr "" ++ ++msgid "Status file format version" ++msgstr "" ++ ++msgid "Switch to advanced configuration »" ++msgstr "" ++ ++msgid "TCP/UDP port # for both local and remote" ++msgstr "" ++ ++msgid "TCP/UDP port # for local (default=1194)" ++msgstr "" ++ ++msgid "TCP/UDP port # for remote (default=1194)" ++msgstr "" ++ ++msgid "TLS cipher" ++msgstr "" ++ ++msgid "TOS passthrough (applies to IPv4 only)" ++msgstr "" ++ ++msgid "Temporary directory for client-connect return file" ++msgstr "" ++ ++msgid "Timeframe for key exchange" ++msgstr "" ++ ++msgid "Type of used device" ++msgstr "" ++ ++msgid "Use fast LZO compression" ++msgstr "" ++ ++msgid "Use individual addresses rather than /30 subnets" ++msgstr "" ++ ++msgid "Use protocol" ++msgstr "" ++ ++msgid "Use tun/tap device node" ++msgstr "" ++ ++msgid "Use username as common name" ++msgstr "" ++ ++msgid "Write log to file" ++msgstr "" ++ ++msgid "Write process ID to file" ++msgstr "" ++ ++msgid "Write status to file every n seconds" ++msgstr "" ++ ++msgid "no" ++msgstr "" ++ ++msgid "tun/tap device" ++msgstr "" ++ ++msgid "tun/tap inactivity timeout" ++msgstr "" ++ ++msgid "yes (%i)" ++msgstr "" ++ ++msgid "« Switch to basic configuration" ++msgstr "" +diff --git a/feeds/luci/applications/luci-app-openvpn/po/pl/openvpn.po b/feeds/luci/applications/luci-app-openvpn/po/pl/openvpn.po +new file mode 100644 +index 0000000..7fa9fe2 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-openvpn/po/pl/openvpn.po +@@ -0,0 +1,566 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"PO-Revision-Date: 2014-05-05 03:41+0200\n" ++"Last-Translator: piosl \n" ++"Language-Team: none\n" ++"Language: pl\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 " ++"|| n%100>=20) ? 1 : 2);\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "%s" ++msgstr "%s" ++ ++msgid "'net30', 'p2p', or 'subnet'" ++msgstr "'net30', 'p2p', lub 'subnet'" ++ ++msgid "Accept options pushed from server" ++msgstr "Zaakceptuj opcje narzucone przez serwer" ++ ++msgid "Add" ++msgstr "Dodaj" ++ ++msgid "Add route after establishing connection" ++msgstr "Dodaj trasÄ™ po nawiÄ…zaniu poÅ‚Ä…czenia" ++ ++msgid "Additional authentication over TLS" ++msgstr "Dodatkowe uwierzytelnianie poprzez TLS" ++ ++msgid "Allow client-to-client traffic" ++msgstr "Zezwól na Å‚Ä…czność klient-klient" ++ ++msgid "Allow multiple clients with same certificate" ++msgstr "Zezwól na Å‚Ä…czenie wielu klientów z tym samym certyfikatem." ++ ++msgid "Allow only one session" ++msgstr "Zezwól tylko na jednÄ… sesjÄ™" ++ ++msgid "Allow remote to change its IP or port" ++msgstr "Zezwól na zmianÄ™ IP lub portu odlegÅ‚emu hostowi." ++ ++msgid "Allowed maximum of connected clients" ++msgstr "Maksymalna dozwolona liczba klientów" ++ ++msgid "Allowed maximum of internal" ++msgstr "Maksymalna dozwolona liczba wewnÄ™trznych" ++ ++msgid "Allowed maximum of new connections" ++msgstr "Maksymalna dozwolona liczba nowych poÅ‚Ä…czeÅ„" ++ ++msgid "Append log to file" ++msgstr "Dopisz log do pliku" ++ ++msgid "Authenticate using username/password" ++msgstr "Autoryzacja z użyciem loginu oraz hasÅ‚a" ++ ++msgid "Automatically redirect default route" ++msgstr "Automatycznie przekieruj domyÅ›lnÄ… trasÄ™" ++ ++msgid "Below is a list of configured OpenVPN instances and their current state" ++msgstr "" ++"Ponieżej znajduje siÄ™ lista skonfigurowanych procesów OpenVPN wraz z ich " ++"aktualnymi stanami." ++ ++msgid "Call down cmd/script before TUN/TAP close" ++msgstr "Zatrzymaj skrypt przed wyÅ‚Ä…czeniem interfejsu TUN/TAP" ++ ++msgid "Certificate authority" ++msgstr "UrzÄ…d certyfikacji" ++ ++msgid "Change process priority" ++msgstr "ZmieÅ„ priorytet procesu" ++ ++msgid "Change to directory before initialization" ++msgstr "Przejdź do katalogu przed inicjalizacjÄ…" ++ ++msgid "Check peer certificate against a CRL" ++msgstr "Sprawdź certyfikat peera na obecność w CRL" ++ ++msgid "Chroot to directory after initialization" ++msgstr "ZmieÅ„ root (chroot) na katalog po inicjalizacji" ++ ++msgid "Client is disabled" ++msgstr "Klient jest wyÅ‚Ä…czony" ++ ++msgid "Configuration category" ++msgstr "Kategoria konfiguracji" ++ ++msgid "Configure client mode" ++msgstr "Konfiguruj tryb klienta" ++ ++msgid "Configure server bridge" ++msgstr "Konfiguruj serwer w trybie mostu" ++ ++msgid "Configure server mode" ++msgstr "Konfiguruj serwer" ++ ++msgid "Connect through Socks5 proxy" ++msgstr "PoÅ‚Ä…cz poprzez SOCKS5 proxy" ++ ++msgid "Connect to remote host through an HTTP proxy" ++msgstr "PoÅ‚Ä…cz ze zdalnym hostem poprzez HTTP proxy" ++ ++msgid "Connection retry interval" ++msgstr "InterwaÅ‚ powtarzania poÅ‚Ä…czeÅ„" ++ ++msgid "Daemonize after initialization" ++msgstr "Przejdź w tryb demona po inicjalizacji" ++ ++msgid "Delay n seconds after connection" ++msgstr "Opóźnienie n sekund po nawiÄ…zaniu poÅ‚Ä…czenia" ++ ++msgid "Delay tun/tap open and up script execution" ++msgstr "Opóźnienie otwarcia interfejsu tun/tap i wykonania skryptu" ++ ++msgid "Diffie Hellman parameters" ++msgstr "Parametry Diffie Hellman" ++ ++msgid "Directory for custom client config files" ++msgstr "Katalog na pliki konfiguracyjne" ++ ++msgid "Disable Paging" ++msgstr "WyÅ‚Ä…cz stronicowanie" ++ ++msgid "Disable cipher initialisation vector" ++msgstr "WyÅ‚Ä…cz wektor inicjalizacji szyfru" ++ ++msgid "Disable options consistency check" ++msgstr "WyÅ‚Ä…cz sprawdzanie poprawnoÅ›ci ustawieÅ„" ++ ++msgid "Disable replay protection" ++msgstr "WyÅ‚Ä…cz ochronÄ™ odpowiedzi" ++ ++msgid "Do not bind to local address and port" ++msgstr "Nie zwiÄ…zuj z lokalnym adresem i portem" ++ ++msgid "Don't actually execute ifconfig" ++msgstr "Nie uruchamiaj obecnie ifconfig" ++ ++msgid "Don't add routes automatically" ++msgstr "Nie dodawaj tras (routes) automatycznie" ++ ++msgid "Don't cache --askpass or --auth-user-pass passwords" ++msgstr "Nie cacheuj haseÅ‚ --askpass lub --auth-user-pass" ++ ++msgid "Don't inherit global push options" ++msgstr "Nie dziedzicz globalnej opcji push" ++ ++msgid "Don't log timestamps" ++msgstr "Nie zapisuj czasu w logu" ++ ++msgid "Don't re-read key on restart" ++msgstr "Nie wczytuj ponownie klucza podczas restartu" ++ ++msgid "Don't require client certificate" ++msgstr "Nie wymagaj certyfikatu od klienta" ++ ++msgid "Don't use adaptive lzo compression" ++msgstr "Nie używaj adaptatywnej kompresji lzo" ++ ++msgid "Don't warn on ifconfig inconsistencies" ++msgstr "Nie ostrzegaj przed niespójnoÅ›ciÄ… w ifconfig" ++ ++msgid "Echo parameters to log" ++msgstr "Zapisuj parametry w logu" ++ ++msgid "Empirically measure MTU" ++msgstr "Mierz MTU empirycznie" ++ ++msgid "Enable OpenSSL hardware crypto engines" ++msgstr "WÅ‚Ä…cz sprzÄ™towe przyspieszenie OpenSSL" ++ ++msgid "Enable Path MTU discovery" ++msgstr "WÅ‚Ä…cz wykrywanie \"Path MTU\"" ++ ++msgid "Enable Static Key encryption mode (non-TLS)" ++msgstr "WÅ‚Ä…cz tryb szyfrowania statycznym kluczem (non-TLS)" ++ ++msgid "Enable TLS and assume client role" ++msgstr "WÅ‚Ä…cz TLS i przyjmij rolÄ™ klienta" ++ ++msgid "Enable TLS and assume server role" ++msgstr "WÅ‚Ä…cz TLS i przyjmij rolÄ™ serwera" ++ ++msgid "Enable internal datagram fragmentation" ++msgstr "WÅ‚Ä…cz wewnÄ™trznÄ… fragmentacjÄ™ datagramu" ++ ++msgid "Enable management interface on IP port" ++msgstr "WÅ‚Ä…cz interfejs zarzÄ…dzalny na IP port" ++ ++msgid "Enabled" ++msgstr "WÅ‚Ä…czone" ++ ++msgid "Encryption cipher for packets" ++msgstr "Szyfrowanie dla pakietów" ++ ++msgid "Execute shell cmd after routes are added" ++msgstr "Wykonaj komendÄ™ powÅ‚oki po dodaniu tras" ++ ++msgid "Execute shell command on remote ip change" ++msgstr "Wykonaj komendÄ™ powÅ‚oki po zmianie zdalnego IP" ++ ++msgid "" ++"Executed in server mode on new client connections, when the client is still " ++"untrusted" ++msgstr "" ++"Wykonane w trybie serwera na nowych poÅ‚Ä…czeniach klienta, gdy klient jest " ++"nadal niezaufany" ++ ++msgid "" ++"Executed in server mode whenever an IPv4 address/route or MAC address is " ++"added to OpenVPN's internal routing table" ++msgstr "" ++"Wykonane w trybie serwera, gdy adres IPv4, trasa lub adres MAC sÄ… dodane do " ++"wewnÄ™trznej tablicy routingu w OpenVPN" ++ ++msgid "Exit on TLS negotiation failure" ++msgstr "Wyjdź przy niepowodzeniu negocjacji TLS" ++ ++msgid "Get PEM password from controlling tty before we daemonize" ++msgstr "Uzyskaj hasÅ‚o PEM z kontroli tty przed demonizacjÄ…" ++ ++msgid "HMAC authentication for packets" ++msgstr "Autoryzacja HMAC dla pakietów" ++ ++msgid "Handling of authentication failures" ++msgstr "PostÄ™powanie z bÅ‚Ä™dami uwierzytelniania" ++ ++msgid "" ++"Helper directive to simplify the expression of --ping and --ping-restart in " ++"server mode configurations" ++msgstr "" ++"Dyrektywa Helper w celu uproszczenia wyrażenie --ping i --ping-restart w " ++"konfiguracjach w trybie serwera" ++ ++msgid "If hostname resolve fails, retry" ++msgstr "Jeżeli ustanowienie nazwy hosta nie powiedzie siÄ™, spróbuj ponownie" ++ ++msgid "Instance \"%s\"" ++msgstr "Instancja \"%s\"" ++ ++msgid "Invalid" ++msgstr "NieprawidÅ‚owe" ++ ++msgid "Keep local IP address on restart" ++msgstr "Zachowaj lokalny adres IP przy restarcie" ++ ++msgid "Keep remote IP address on restart" ++msgstr "Zachowaj zdalny adres IP przy restarcie" ++ ++msgid "Keep tun/tap device open on restart" ++msgstr "Utrzymaj urzÄ…dzenie tun/tap po restarcie jako otwarte" ++ ++msgid "Key transition window" ++msgstr "Okno zmiany klucza" ++ ++msgid "Limit repeated log messages" ++msgstr "Limit powtarzajÄ…cych siÄ™ wiadomoÅ›ci w logu" ++ ++msgid "Local certificate" ++msgstr "Certyfikat lokalny" ++ ++msgid "Local host name or ip address" ++msgstr "Lokalna nazwa hosta lub adres IP" ++ ++msgid "Local private key" ++msgstr "Lokalny klucz prywatny" ++ ++msgid "Major mode" ++msgstr "Tryb główny" ++ ++msgid "Make tun device IPv6 capable" ++msgstr "UrzÄ…dzenie tun zgodne z IPv6" ++ ++msgid "Maximum number of queued TCP output packets" ++msgstr "Maksymalna liczba wychodzÄ…cych pakietów TCP w kolejce" ++ ++msgid "Number of allocated broadcast buffers" ++msgstr "Liczba przydzielonych buforów nadawczych" ++ ++msgid "Number of lines for log file history" ++msgstr "Liczba linii w pliku dziennika historii" ++ ++msgid "Only accept connections from given X509 name" ++msgstr "Akceptuj tylko poÅ‚Ä…czenia z podanej nazwy X509" ++ ++msgid "Only process ping timeouts if routes exist" ++msgstr "Wykonaj procedurÄ™ \"ping timeout\" tylko jeżeli trasy istniejÄ…" ++ ++msgid "OpenVPN" ++msgstr "OpenVPN" ++ ++msgid "OpenVPN instances" ++msgstr "Instancje OpenVPN" ++ ++msgid "Optimize TUN/TAP/UDP writes" ++msgstr "Optymalizuj wpisy TUN/TAP/UDP" ++ ++msgid "Output to syslog and do not daemonize" ++msgstr "WysyÅ‚aj do syslog'a i nie demonizuj" ++ ++msgid "Overview" ++msgstr "PrzeglÄ…d" ++ ++msgid "PKCS#12 file containing keys" ++msgstr "Plik PKCS#12 zawierajÄ…cy klucze" ++ ++msgid "Pass environment variables to script" ++msgstr "Przekaż zmienne Å›rodowiskowe do skryptu" ++ ++msgid "Persist replay-protection state" ++msgstr "Utrzymaj status ochrony odpowiedzi" ++ ++msgid "Persist/unpersist ifconfig-pool" ++msgstr "Utrzymuj/Nie utrzymuj ifconfig-pool" ++ ++msgid "Ping remote every n seconds over TCP/UDP port" ++msgstr "Pinguj zdalnego co n sekund przez port TCP/UDP" ++ ++msgid "Policy level over usage of external programs and scripts" ++msgstr "" ++"Poziom zasad odnoszÄ…cych siÄ™ do używania zewnÄ™trznych programów i skryptów" ++ ++msgid "Port" ++msgstr "Port" ++ ++msgid "Protocol" ++msgstr "Protokół" ++ ++msgid "Proxy timeout in seconds" ++msgstr "Czas bezczynnoÅ›ci proxy w sekundach" ++ ++msgid "Push an ifconfig option to remote" ++msgstr "WyÅ›lij opcje ifconfig do zdalnego" ++ ++msgid "Push options to peer" ++msgstr "WyÅ›lij opcje do peera" ++ ++msgid "Query management channel for private key" ++msgstr "KanaÅ‚ zarzÄ…dzania zapytaniami dla klucza prywatnego" ++ ++msgid "Randomly choose remote server" ++msgstr "Losowo wybierz serwer zdalny" ++ ++msgid "Refuse connection if no custom client config" ++msgstr "Odmów poÅ‚Ä…czenie gdy nie standardowy klient konfiguracja" ++ ++msgid "Remap SIGUSR1 signals" ++msgstr "Przemapuj SIGUSR1" ++ ++msgid "Remote host name or ip address" ++msgstr "Nazwa lub IP zdalnego hosta" ++ ++msgid "Remote ping timeout" ++msgstr "Zdalny ping upÅ‚ynÄ…Å‚ czas" ++ ++msgid "Renegotiate data chan. key after bytes" ++msgstr "Renegocjacja danych charakteru klucza po bajtach" ++ ++msgid "Renegotiate data chan. key after packets" ++msgstr "Renegocjacja danych charakteru klucza po pakietach" ++ ++msgid "Renegotiate data chan. key after seconds" ++msgstr "Renegocjacja danych charakteru klucza po sekundach" ++ ++msgid "Replay protection sliding window size" ++msgstr "Powtórzenie osÅ‚ony okna rozmiaru" ++ ++msgid "Require explicit designation on certificate" ++msgstr "Potrzebna Podpis na Certyfikacie" ++ ++msgid "Require explicit key usage on certificate" ++msgstr "Potrzebna klucza używanego w certyfikacie" ++ ++msgid "Restart after remote ping timeout" ++msgstr "restart po zdalnym ping upÅ‚ywie czasu" ++ ++msgid "Retransmit timeout on TLS control channel" ++msgstr "Retransmisja po upÅ‚ywie czasu TLS na kanale kontrolnym" ++ ++msgid "Retry indefinitely on HTTP proxy errors" ++msgstr "Ponownie spróbować na Http proxy BÅ‚Ä™dzie" ++ ++msgid "Retry indefinitely on Socks proxy errors" ++msgstr "" ++ ++msgid "Route subnet to client" ++msgstr "Trasa podsieci do klienta" ++ ++msgid "Run as an inetd or xinetd server" ++msgstr "Uruchom jako serwer inetd lub xinetd" ++ ++msgid "Run script cmd on client connection" ++msgstr "Uruchom skrypt cmd po poÅ‚Ä…czeniu klienta" ++ ++msgid "Run script cmd on client disconnection" ++msgstr "Uruchom skrypt cmd po rozÅ‚Ä…czeniu klienta" ++ ++msgid "Run up/down scripts for all restarts" ++msgstr "Uruchom skrypty up/down dla wszystkich restartów" ++ ++#, fuzzy ++msgid "Send notification to peer on disconnect" ++msgstr "WyÅ›lij zgÅ‚oszenie o rozÅ‚Ä…czeniu do peer" ++ ++msgid "Set GID to group" ++msgstr "Ustaw GID dla grupy" ++ ++msgid "Set TCP/UDP MTU" ++msgstr "Ustaw TCP/UDP MTU" ++ ++msgid "Set UID to user" ++msgstr "Ustaw UID dla użytkownika" ++ ++#, fuzzy ++msgid "Set aside a pool of subnets" ++msgstr "OdÅ‚ożyć na bok pulÄ™ podsieci" ++ ++msgid "Set extended HTTP proxy options" ++msgstr "Ustaw rozszerzone opcje proxy HTTP" ++ ++msgid "Set output verbosity" ++msgstr "" ++ ++msgid "Set size of real and virtual address hash tables" ++msgstr "Ustaw rozmiar rzeczywistych i wirtualnych adresów tablicy hash" ++ ++#, fuzzy ++msgid "Set the TCP/UDP receive buffer size" ++msgstr "Ustaw rozmiar buforu wysyÅ‚ania TCP/UDP" ++ ++#, fuzzy ++msgid "Set the TCP/UDP send buffer size" ++msgstr "Ustaw rozmiar buforu wysyÅ‚ania TCP/UDP" ++ ++#, fuzzy ++msgid "Set tun/tap TX queue length" ++msgstr "Ustaw dÅ‚ugość kolejki tun / tap TX " ++ ++msgid "Set tun/tap adapter parameters" ++msgstr "Ustaw parametr adaptera tun/tap" ++ ++msgid "Set tun/tap device MTU" ++msgstr "" ++ ++msgid "Set tun/tap device overhead" ++msgstr "" ++ ++msgid "Set upper bound on TCP MSS" ++msgstr "Ustaw górnÄ… granicÄ™ TCP MSS" ++ ++msgid "Shaping for peer bandwidth" ++msgstr "Formowanie wzajemnego pasma" ++ ++#, fuzzy ++msgid "Shell cmd to execute after tun device open" ++msgstr "cmd Shell po uruchomieniu urzadzenie tun" ++ ++#, fuzzy ++msgid "Shell cmd to run after tun device close" ++msgstr "cmd Shell po wyÅ‚Ä…czeniu urzadzenie tun" ++ ++msgid "Shell command to verify X509 name" ++msgstr "polecenie Shell aby sprawdzić nazwÄ™ X509" ++ ++msgid "Silence the output of replay warnings" ++msgstr "Wycisz powtórne pojawianie siÄ™ ostrzeżeÅ„" ++ ++msgid "Size of cipher key" ++msgstr "Rozmiar klucza szyfrowania" ++ ++msgid "Specify a default gateway for routes" ++msgstr "OkreÅ›l domyÅ›lnÄ… bramÄ™ dla tras" ++ ++msgid "Start OpenVPN in a hibernating state" ++msgstr "Uruchom OpenVPN w stanie hibernacji" ++ ++msgid "Start/Stop" ++msgstr "Start/Stop" ++ ++msgid "Started" ++msgstr "Uruchomiono" ++ ++msgid "Status file format version" ++msgstr "Wersja formatu pliku statusu" ++ ++msgid "Switch to advanced configuration »" ++msgstr "Konfiguracja zaawansowana »" ++ ++msgid "TCP/UDP port # for both local and remote" ++msgstr "Numer portu TCP/UDP zarówno dla lokalnego jak i zdalnego" ++ ++msgid "TCP/UDP port # for local (default=1194)" ++msgstr "Numer portu TCP/UDP dla lokalnego (domyÅ›lnie=1194)" ++ ++msgid "TCP/UDP port # for remote (default=1194)" ++msgstr "Numer portu TCP/UDP dla zdalnego (domyÅ›lnie=1194)" ++ ++msgid "TLS cipher" ++msgstr "Kodowanie TLS" ++ ++msgid "TOS passthrough (applies to IPv4 only)" ++msgstr "Przepuszczanie TOS (dotyczy tylko IPv4)" ++ ++msgid "Temporary directory for client-connect return file" ++msgstr "Katalog tymczasowy dla pliku zwrotnego poÅ‚Ä…czenia klienta" ++ ++msgid "Timeframe for key exchange" ++msgstr "" ++ ++msgid "Type of used device" ++msgstr "Typ użytego urzÄ…dzenia" ++ ++msgid "Use fast LZO compression" ++msgstr "Użyj szybkiej kompresji LZO" ++ ++msgid "Use individual addresses rather than /30 subnets" ++msgstr "Użyj indywidualnego adresu zamiast podsieci /30" ++ ++msgid "Use protocol" ++msgstr "Użyj protokoÅ‚u" ++ ++msgid "Use tun/tap device node" ++msgstr "Użyj wÄ™zÅ‚a urzÄ…dzenia tun/tap" ++ ++msgid "Use username as common name" ++msgstr "Użyj nazwy użytkownika jako nazwy wspólnej" ++ ++msgid "Write log to file" ++msgstr "Zapisz log do pliku" ++ ++msgid "Write process ID to file" ++msgstr "Zapisz numer ID procesu do pliku" ++ ++msgid "Write status to file every n seconds" ++msgstr "Zapisz status do pliku co n sekund" ++ ++msgid "no" ++msgstr "nie" ++ ++msgid "tun/tap device" ++msgstr "urzÄ…dzenie tun/tap" ++ ++msgid "tun/tap inactivity timeout" ++msgstr "czas bezczynnoÅ›ci tun/tap" ++ ++msgid "yes (%i)" ++msgstr "tak (%i)" ++ ++msgid "« Switch to basic configuration" ++msgstr "« Konfiguracja podstawowa" ++ ++#~ msgid "Cryptography" ++#~ msgstr "Kryptografia" ++ ++#~ msgid "Networking" ++#~ msgstr "Ustawienia sieciowe" ++ ++#~ msgid "Service" ++#~ msgstr "Serwis" ++ ++#~ msgid "VPN" ++#~ msgstr "VPN" +diff --git a/feeds/luci/applications/luci-app-openvpn/po/pt-br/openvpn.po b/feeds/luci/applications/luci-app-openvpn/po/pt-br/openvpn.po +new file mode 100644 +index 0000000..27aef00 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-openvpn/po/pt-br/openvpn.po +@@ -0,0 +1,566 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Report-Msgid-Bugs-To: \n" ++"POT-Creation-Date: 2009-06-10 03:41+0200\n" ++"PO-Revision-Date: 2014-03-29 23:19+0200\n" ++"Last-Translator: Luiz Angelo \n" ++"Language-Team: LANGUAGE \n" ++"Language: pt_BR\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n > 1);\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "%s" ++msgstr "%s" ++ ++msgid "'net30', 'p2p', or 'subnet'" ++msgstr "'net30', 'p2p', ou 'subnet'" ++ ++msgid "Accept options pushed from server" ++msgstr "Aceitar opções enviadas pelo servidor" ++ ++msgid "Add" ++msgstr "Adicionar" ++ ++msgid "Add route after establishing connection" ++msgstr "Adicionar rota após estabelecimento da conexão" ++ ++msgid "Additional authentication over TLS" ++msgstr "Autenticação adicional por TLS" ++ ++msgid "Allow client-to-client traffic" ++msgstr "Permitir tráfego entre os clientes" ++ ++msgid "Allow multiple clients with same certificate" ++msgstr "Permitir múltiplos clientes com o mesmo certificado" ++ ++msgid "Allow only one session" ++msgstr "Permitir apenas uma sessão" ++ ++msgid "Allow remote to change its IP or port" ++msgstr "Permitir a um equipamento remoto altere o seu IP ou porta" ++ ++msgid "Allowed maximum of connected clients" ++msgstr "Máximo permitido de clientes conectados" ++ ++msgid "Allowed maximum of internal" ++msgstr "Máximo permitido internamente para rotas de clientes" ++ ++msgid "Allowed maximum of new connections" ++msgstr "Máximo permitido de novas conexões" ++ ++msgid "Append log to file" ++msgstr "Acrescentar registos ao arquivo" ++ ++msgid "Authenticate using username/password" ++msgstr "Autenticar com usuário/senha" ++ ++msgid "Automatically redirect default route" ++msgstr "Redirecionar automaticamente a rota padrão" ++ ++msgid "Below is a list of configured OpenVPN instances and their current state" ++msgstr "" ++"Abaixo está uma lista de todas as instâncias OpenVPN configuradas e o seu " ++"estado atual" ++ ++msgid "Call down cmd/script before TUN/TAP close" ++msgstr "Executar o comando/script antes do tun/tap fechar" ++ ++msgid "Certificate authority" ++msgstr "Autoridade certificadora" ++ ++msgid "Change process priority" ++msgstr "Alterar prioridade do processo" ++ ++msgid "Change to directory before initialization" ++msgstr "Mudar para o diretório antes da iniciação" ++ ++msgid "Check peer certificate against a CRL" ++msgstr "Verificar certificado do parceiro conta uma CRL" ++ ++msgid "Chroot to directory after initialization" ++msgstr "Chroot para o diretório após a iniciação" ++ ++msgid "Client is disabled" ++msgstr "Cliente desativado" ++ ++msgid "Configuration category" ++msgstr "Categoria da configuração" ++ ++msgid "Configure client mode" ++msgstr "Configurar modo cliente" ++ ++msgid "Configure server bridge" ++msgstr "Configurar ponte de servidor" ++ ++msgid "Configure server mode" ++msgstr "Configurar modo de servidor" ++ ++msgid "Connect through Socks5 proxy" ++msgstr "Conectar através de um proxy Socks5" ++ ++msgid "Connect to remote host through an HTTP proxy" ++msgstr "Conectar a equipamento remoto através de um proxy HTTP" ++ ++msgid "Connection retry interval" ++msgstr "Intervalo de reestabelecimento de conexão" ++ ++msgid "Daemonize after initialization" ++msgstr "Entre em segundo plano após a iniciação" ++ ++msgid "Delay n seconds after connection" ++msgstr "Atrase n segundos depois da conexão" ++ ++msgid "Delay tun/tap open and up script execution" ++msgstr "Retardar o script de abertura e ativação do tun/tap" ++ ++msgid "Diffie Hellman parameters" ++msgstr "Parâmetros Diffie-Hellman" ++ ++msgid "Directory for custom client config files" ++msgstr "Diretório para configurações personalizadas dos clientes" ++ ++msgid "Disable Paging" ++msgstr "Desativar paginação" ++ ++msgid "Disable cipher initialisation vector" ++msgstr "Desativar o vetor de iniciação da cifra" ++ ++msgid "Disable options consistency check" ++msgstr "Desativar opções de verificação de consistência" ++ ++msgid "Disable replay protection" ++msgstr "Desativar proteção contra replay" ++ ++msgid "Do not bind to local address and port" ++msgstr "Não ativar no endereço e porta locais" ++ ++msgid "Don't actually execute ifconfig" ++msgstr "Não executar ifconfig de verdade" ++ ++msgid "Don't add routes automatically" ++msgstr "Não adicionar rotas automaticamente" ++ ++msgid "Don't cache --askpass or --auth-user-pass passwords" ++msgstr "Não colocar em cache as senhas do --askpass ou --auth-user-pass " ++ ++msgid "Don't inherit global push options" ++msgstr "Não herdar as opções globais de envio (push)" ++ ++msgid "Don't log timestamps" ++msgstr "Não registar a data/hora" ++ ++msgid "Don't re-read key on restart" ++msgstr "Não reler a chave entre os reinícios" ++ ++msgid "Don't require client certificate" ++msgstr "Não solicitar certificado ao cliente" ++ ++msgid "Don't use adaptive lzo compression" ++msgstr "Não usar compressão LZO adaptiva" ++ ++msgid "Don't warn on ifconfig inconsistencies" ++msgstr "Não avisar quando existirem inconsistências no ifconfig" ++ ++msgid "Echo parameters to log" ++msgstr "Escrever parâmetros no registo" ++ ++msgid "Empirically measure MTU" ++msgstr "Medir empíricamente o MTU" ++ ++msgid "Enable OpenSSL hardware crypto engines" ++msgstr "Ativar motor OpenSSL por hardware" ++ ++msgid "Enable Path MTU discovery" ++msgstr "Ativar a descoberta do MTU do caminho" ++ ++msgid "Enable Static Key encryption mode (non-TLS)" ++msgstr "Ativar modo de encriptação por chave estática (não-TLS)" ++ ++msgid "Enable TLS and assume client role" ++msgstr "Ativar TLS e assumir papel de cliente" ++ ++msgid "Enable TLS and assume server role" ++msgstr "Ativar TLS e assumir papel de servidor" ++ ++msgid "Enable internal datagram fragmentation" ++msgstr "Ativar a fragmentação interna de datagramas" ++ ++msgid "Enable management interface on IP port" ++msgstr "Ativar o interface de gestão em IP porta" ++ ++msgid "Enabled" ++msgstr "Ativado" ++ ++msgid "Encryption cipher for packets" ++msgstr "Cifra de encriptação para pacotes" ++ ++msgid "Execute shell cmd after routes are added" ++msgstr "Executar o comando shell após as rotas serem adicionadas" ++ ++msgid "Execute shell command on remote ip change" ++msgstr "Executar o comando shell quando existir alteração do IP remoto" ++ ++msgid "" ++"Executed in server mode on new client connections, when the client is still " ++"untrusted" ++msgstr "" ++"Executado em modo servidor na nova conexão de cliente, enquanto o cliente " ++"ainda não é confiável" ++ ++msgid "" ++"Executed in server mode whenever an IPv4 address/route or MAC address is " ++"added to OpenVPN's internal routing table" ++msgstr "" ++"Executado em modo servidor quando um endereço/rota IPv4 é adicionao na " ++"tabela de roteamento interna do OpenVPN" ++ ++msgid "Exit on TLS negotiation failure" ++msgstr "Fechar quando existir falha na negociacao TLS" ++ ++msgid "Get PEM password from controlling tty before we daemonize" ++msgstr "Obter password PEM do terminal de controlo antes de passar a daemon" ++ ++msgid "HMAC authentication for packets" ++msgstr "Autenticação HMAC para pacotes" ++ ++msgid "Handling of authentication failures" ++msgstr "Gestão de falhas de autenticação" ++ ++msgid "" ++"Helper directive to simplify the expression of --ping and --ping-restart in " ++"server mode configurations" ++msgstr "" ++"Diretiva de ajuda para simplificar a expressão --ping e --ping-restart nas " ++"configurações de modo servidor" ++ ++msgid "If hostname resolve fails, retry" ++msgstr "Se a resolução de nomes falhar, tentar novamente" ++ ++msgid "Instance \"%s\"" ++msgstr "Instância \"%s\"" ++ ++msgid "Invalid" ++msgstr "Inválido" ++ ++msgid "Keep local IP address on restart" ++msgstr "Manter o endereço IP local entre os reinícios" ++ ++msgid "Keep remote IP address on restart" ++msgstr "Manter o endereço IP remoto entre os reinícios" ++ ++msgid "Keep tun/tap device open on restart" ++msgstr "Manter o dispositivo tun/tap aberto entre os reinícios" ++ ++msgid "Key transition window" ++msgstr "Janela para transição de chaves" ++ ++msgid "Limit repeated log messages" ++msgstr "Limitar entradas repetidas no registo" ++ ++msgid "Local certificate" ++msgstr "Certificado local" ++ ++msgid "Local host name or ip address" ++msgstr "Nome do equipamento ou endereço IP local" ++ ++msgid "Local private key" ++msgstr "Chave privada local" ++ ++msgid "Major mode" ++msgstr "Modo principal" ++ ++msgid "Make tun device IPv6 capable" ++msgstr "Tornar o dispositivo tun capaz de IPv6" ++ ++msgid "Maximum number of queued TCP output packets" ++msgstr "Número máximo de pacotes TCP na fila de saída" ++ ++msgid "Number of allocated broadcast buffers" ++msgstr "Número de buffers de broadcast alocados" ++ ++msgid "Number of lines for log file history" ++msgstr "Número de linhas para o histórico do registo" ++ ++msgid "Only accept connections from given X509 name" ++msgstr "Aceitar conexões apenas de um dado nome X509" ++ ++msgid "Only process ping timeouts if routes exist" ++msgstr "Só processe os estouros de tempo de pings se as rotas existirem" ++ ++msgid "OpenVPN" ++msgstr "OpenVPN" ++ ++msgid "OpenVPN instances" ++msgstr "Instâncias OpenVPN" ++ ++msgid "Optimize TUN/TAP/UDP writes" ++msgstr "Otimizar as escritas TUN/TAP/UDP" ++ ++msgid "Output to syslog and do not daemonize" ++msgstr "Enviar para o syslog os registos e não vá para segundo plano" ++ ++msgid "Overview" ++msgstr "Visão Geral" ++ ++msgid "PKCS#12 file containing keys" ++msgstr "Arquivo PKCS#12 com as chaves" ++ ++msgid "Pass environment variables to script" ++msgstr "Passar variáveis de ambiente ao script" ++ ++msgid "Persist replay-protection state" ++msgstr "Manter persistência da proteção replay" ++ ++msgid "Persist/unpersist ifconfig-pool" ++msgstr "Manter ou não o conjunto de subredes" ++ ++msgid "Ping remote every n seconds over TCP/UDP port" ++msgstr "Pingar o remoto a cada n segundos sobre a porta TCP/UDP" ++ ++msgid "Policy level over usage of external programs and scripts" ++msgstr "Nível da política sobre o uso de programas e scripts externos" ++ ++msgid "Port" ++msgstr "Porta" ++ ++msgid "Protocol" ++msgstr "Protocolo" ++ ++msgid "Proxy timeout in seconds" ++msgstr "Tempo limite do proxy em segundos" ++ ++msgid "Push an ifconfig option to remote" ++msgstr "Enviar uma opção ifconfig ao remoto" ++ ++msgid "Push options to peer" ++msgstr "Enviar opções ao remoto" ++ ++msgid "Query management channel for private key" ++msgstr "Solicitar chave privada ao canal de gestão" ++ ++msgid "Randomly choose remote server" ++msgstr "Escolher o server remoto aleatoriamente" ++ ++msgid "Refuse connection if no custom client config" ++msgstr "Recusar conexões de clientes que não tenham configuração personalizada" ++ ++msgid "Remap SIGUSR1 signals" ++msgstr "Remapear os sinais SIGUSR1" ++ ++msgid "Remote host name or ip address" ++msgstr "Nome do equipamento ou endereço IP remoto" ++ ++msgid "Remote ping timeout" ++msgstr "Tempo limite do ping remoto" ++ ++msgid "Renegotiate data chan. key after bytes" ++msgstr "Renegociar chave do canal de dados após n bytes" ++ ++msgid "Renegotiate data chan. key after packets" ++msgstr "Renegociar chave do canal de dados após n pacotes" ++ ++msgid "Renegotiate data chan. key after seconds" ++msgstr "Renegociar chave do canal de dados após n segundos" ++ ++msgid "Replay protection sliding window size" ++msgstr "Tamanho da janela de proteção conta replay" ++ ++msgid "Require explicit designation on certificate" ++msgstr "Requerer designação específica no certificado" ++ ++msgid "Require explicit key usage on certificate" ++msgstr "Requerer que o uso da chave seja explicitado no certificado" ++ ++msgid "Restart after remote ping timeout" ++msgstr "Reiniciar após estouro do tempo do ping remoto" ++ ++msgid "Retransmit timeout on TLS control channel" ++msgstr "Estouro de tempo de retransmissão no canal de controle TLS" ++ ++msgid "Retry indefinitely on HTTP proxy errors" ++msgstr "Tentar infinitamente a conexão quando existirem erros de proxy Socks" ++ ++msgid "Retry indefinitely on Socks proxy errors" ++msgstr "Tentar infinitamente a conexão quando existirem erros de proxy Socks" ++ ++msgid "Route subnet to client" ++msgstr "Encaminhar rota da subrede para o cliente" ++ ++msgid "Run as an inetd or xinetd server" ++msgstr "Executar através do inetd ou xinetd" ++ ++msgid "Run script cmd on client connection" ++msgstr "Executar script quando o cliente conectar" ++ ++msgid "Run script cmd on client disconnection" ++msgstr "Executar script quando o cliente desconectar" ++ ++msgid "Run up/down scripts for all restarts" ++msgstr "Executar scripts de subida/descida para todos os reinícios" ++ ++msgid "Send notification to peer on disconnect" ++msgstr "Notificar parceiro remoto ao desconectar" ++ ++msgid "Set GID to group" ++msgstr "Usar o GID do grupo" ++ ++msgid "Set TCP/UDP MTU" ++msgstr "Definir o MTU TCP/UDP" ++ ++msgid "Set UID to user" ++msgstr "Usar o UID do usuário" ++ ++msgid "Set aside a pool of subnets" ++msgstr "Reservar um conjunto de subredes" ++ ++msgid "Set extended HTTP proxy options" ++msgstr "Definir opções extendidas para o proxy HTTP" ++ ++msgid "Set output verbosity" ++msgstr "Definir detalhamento do registo" ++ ++msgid "Set size of real and virtual address hash tables" ++msgstr "Definir tamanho das tabelas hash de endereços reais e virtuais" ++ ++msgid "Set the TCP/UDP receive buffer size" ++msgstr "Definir o tamanho do buffer de recepção TCP/UDP" ++ ++msgid "Set the TCP/UDP send buffer size" ++msgstr "Definir o tamanho do buffer de envio TCP/UDP" ++ ++msgid "Set tun/tap TX queue length" ++msgstr "Definir o tamanho da fila de transmissão tun/tap" ++ ++msgid "Set tun/tap adapter parameters" ++msgstr "Definir parâmetros do adaptador TUN/TAP" ++ ++msgid "Set tun/tap device MTU" ++msgstr "Definir o MTU do dispositivo tun/tap" ++ ++msgid "Set tun/tap device overhead" ++msgstr "Definir o overhead do dispositivo tun/tap" ++ ++msgid "Set upper bound on TCP MSS" ++msgstr "Definir teto do MSS TCP" ++ ++msgid "Shaping for peer bandwidth" ++msgstr "Restringir a largura de banda ao parceiro" ++ ++msgid "Shell cmd to execute after tun device open" ++msgstr "Comando shell para executar após abertura do dispositivo tun" ++ ++msgid "Shell cmd to run after tun device close" ++msgstr "Comando shell para executar após o fechamento do dispositivo tun" ++ ++msgid "Shell command to verify X509 name" ++msgstr "Comando shell para verificar o nome do X509" ++ ++msgid "Silence the output of replay warnings" ++msgstr "Silenciar a saída dos avisos de replay" ++ ++msgid "Size of cipher key" ++msgstr "Tamanho da chave de cifragem" ++ ++msgid "Specify a default gateway for routes" ++msgstr "Especificar uma roteador padrão para as rotas" ++ ++msgid "Start OpenVPN in a hibernating state" ++msgstr "Iniciar o OpenVPN em estado de hibernação" ++ ++msgid "Start/Stop" ++msgstr "Iniciar/Parar" ++ ++msgid "Started" ++msgstr "Iniciado" ++ ++msgid "Status file format version" ++msgstr "Versão de formato do arquivo de estado" ++ ++msgid "Switch to advanced configuration »" ++msgstr "Mudar para configuração avançada »" ++ ++msgid "TCP/UDP port # for both local and remote" ++msgstr "Porta TCP/UDP tanto para local e remoto" ++ ++msgid "TCP/UDP port # for local (default=1194)" ++msgstr "Porta TCP/UDP para local (padrão=1194)" ++ ++msgid "TCP/UDP port # for remote (default=1194)" ++msgstr "Porta TCP/UDP para remoto (padrão=1194)" ++ ++msgid "TLS cipher" ++msgstr "Cifra TLS" ++ ++msgid "TOS passthrough (applies to IPv4 only)" ++msgstr "Encaminhe TOS (aplicável apenas a IPv4)" ++ ++msgid "Temporary directory for client-connect return file" ++msgstr "Diretório temporário para arquivo de retorno de conexão-cliente" ++ ++msgid "Timeframe for key exchange" ++msgstr "Janela temporal para troca de chaves" ++ ++msgid "Type of used device" ++msgstr "Tipo de dispositivo utilizado" ++ ++msgid "Use fast LZO compression" ++msgstr "Usar compressão LZO rápida" ++ ++msgid "Use individual addresses rather than /30 subnets" ++msgstr "Usar endereços individuais em vez de subredes /30" ++ ++msgid "Use protocol" ++msgstr "Usar protocolo" ++ ++msgid "Use tun/tap device node" ++msgstr "Utilizar dispositivo tun/tap" ++ ++msgid "Use username as common name" ++msgstr "Usar o nome do usuário como 'common name' (CN)" ++ ++msgid "Write log to file" ++msgstr "Escrever registo no arquivo" ++ ++msgid "Write process ID to file" ++msgstr "Escrever PID no arquivo" ++ ++msgid "Write status to file every n seconds" ++msgstr "Escrever estado para arquivo a cada n segundos" ++ ++msgid "no" ++msgstr "não" ++ ++msgid "tun/tap device" ++msgstr "Dispositivo tun/tap" ++ ++msgid "tun/tap inactivity timeout" ++msgstr "Tempo limite de inatividade tun/tap" ++ ++msgid "yes (%i)" ++msgstr "sim (%i)" ++ ++msgid "« Switch to basic configuration" ++msgstr "« Mudar para configuração básica" ++ ++#~ msgid "Cryptography" ++#~ msgstr "Criptografia" ++ ++# Which context? ++#~ msgid "Networking" ++#~ msgstr "Rede" ++ ++#~ msgid "Service" ++#~ msgstr "Serviço" ++ ++#~ msgid "VPN" ++#~ msgstr "VPN" ++ ++#~ msgid "openvpn_%s" ++#~ msgstr "openvpn_%s" ++ ++#~ msgid "openvpn_%s_desc" ++#~ msgstr "openvpn_%s_desc" +diff --git a/feeds/luci/applications/luci-app-openvpn/po/pt/openvpn.po b/feeds/luci/applications/luci-app-openvpn/po/pt/openvpn.po +new file mode 100644 +index 0000000..76d2091 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-openvpn/po/pt/openvpn.po +@@ -0,0 +1,559 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Report-Msgid-Bugs-To: \n" ++"POT-Creation-Date: 2009-05-26 19:03+0200\n" ++"PO-Revision-Date: 2013-06-03 13:43+0200\n" ++"Last-Translator: joao.f.vieira \n" ++"Language-Team: LANGUAGE \n" ++"Language: pt\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n != 1);\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "%s" ++msgstr "%s" ++ ++msgid "'net30', 'p2p', or 'subnet'" ++msgstr "'net30', 'p2p', ou 'subnet'" ++ ++msgid "Accept options pushed from server" ++msgstr "Aceitar opções enviadas pelo servidor" ++ ++msgid "Add" ++msgstr "Adicionar" ++ ++msgid "Add route after establishing connection" ++msgstr "Adicionar rota após estabelecimento da ligação" ++ ++msgid "Additional authentication over TLS" ++msgstr "Autenticação adicional por TLS" ++ ++msgid "Allow client-to-client traffic" ++msgstr "Permitir tráfego cliente-a-cliente" ++ ++msgid "Allow multiple clients with same certificate" ++msgstr "Permitir multiplos clientes com o mesmo certificado" ++ ++msgid "Allow only one session" ++msgstr "Permitir apenas uma sessão" ++ ++msgid "Allow remote to change its IP or port" ++msgstr "Permitir a um host remoto que altere o seu IP ou porta" ++ ++msgid "Allowed maximum of connected clients" ++msgstr "Máximo permitido de clientes ligados" ++ ++msgid "Allowed maximum of internal" ++msgstr "Máximo permitido internamente para rotas de clientes" ++ ++msgid "Allowed maximum of new connections" ++msgstr "Maximo permitido de novas ligações" ++ ++msgid "Append log to file" ++msgstr "Acrescentar registos ao ficheiro" ++ ++msgid "Authenticate using username/password" ++msgstr "Autenticar com username/password" ++ ++msgid "Automatically redirect default route" ++msgstr "Redireccionar automaticamente a rota pre-definida" ++ ++msgid "Below is a list of configured OpenVPN instances and their current state" ++msgstr "" ++"Abaixo está uma lista de todas as instâncias OpenVPN configuradas e o seu " ++"estado actual" ++ ++msgid "Call down cmd/script before TUN/TAP close" ++msgstr "Executar o comando/script antes do fecho tun/tap" ++ ++msgid "Certificate authority" ++msgstr "Autoridade certificadora" ++ ++msgid "Change process priority" ++msgstr "Alterar prioridade do processo" ++ ++msgid "Change to directory before initialization" ++msgstr "Mudar para o directório antes da inicialização" ++ ++msgid "Check peer certificate against a CRL" ++msgstr "Verificar certificado do remoto conta uma CRL" ++ ++msgid "Chroot to directory after initialization" ++msgstr "Chroot para o directorio apos a inicialização" ++ ++msgid "Client is disabled" ++msgstr "Cliente desativado" ++ ++msgid "Configuration category" ++msgstr "Categoria da configuração" ++ ++msgid "Configure client mode" ++msgstr "Configurar modo cliente" ++ ++msgid "Configure server bridge" ++msgstr "Configurar bridge de servidor" ++ ++msgid "Configure server mode" ++msgstr "Configurar modo de servidor" ++ ++msgid "Connect through Socks5 proxy" ++msgstr "Ligar através de um proxy Socks5" ++ ++msgid "Connect to remote host through an HTTP proxy" ++msgstr "Ligar ao host remoto através de um proxy HTTP" ++ ++msgid "Connection retry interval" ++msgstr "Intervalo de reestabelecimento de ligação" ++ ++msgid "Daemonize after initialization" ++msgstr "Passar a daemon após a inicialização" ++ ++msgid "Delay n seconds after connection" ++msgstr "Aguardar n segundos após a ligação" ++ ++msgid "Delay tun/tap open and up script execution" ++msgstr "Retardar o script de abertura/ativação tun/tap" ++ ++msgid "Diffie Hellman parameters" ++msgstr "Parametros Diffie-Hellman" ++ ++msgid "Directory for custom client config files" ++msgstr "Directório para configurações personalizadas dos clientes" ++ ++msgid "Disable Paging" ++msgstr "Desativar Paging" ++ ++msgid "Disable cipher initialisation vector" ++msgstr "Desativar o vector de inicialização da cifra" ++ ++msgid "Disable options consistency check" ++msgstr "Desativar opções de verificação de consistência" ++ ++msgid "Disable replay protection" ++msgstr "Desativar protecção contra replay" ++ ++msgid "Do not bind to local address and port" ++msgstr "Não vincular o endereço e porta locais" ++ ++msgid "Don't actually execute ifconfig" ++msgstr "Não executar ifconfig" ++ ++msgid "Don't add routes automatically" ++msgstr "Não adicionar rotas automaticamente" ++ ++msgid "Don't cache --askpass or --auth-user-pass passwords" ++msgstr "Não colocar em cache as passwords --askpass ou --auth-user-pass " ++ ++msgid "Don't inherit global push options" ++msgstr "Não herdar as opções globais de envio (push)" ++ ++msgid "Don't log timestamps" ++msgstr "Não registar timestamps" ++ ++msgid "Don't re-read key on restart" ++msgstr "Não reler a chave entre reinicios" ++ ++msgid "Don't require client certificate" ++msgstr "Não solicitar certificado ao cliente" ++ ++msgid "Don't use adaptive lzo compression" ++msgstr "Não usar compressão LZO adaptiva" ++ ++msgid "Don't warn on ifconfig inconsistencies" ++msgstr "Não avisar quando existirem inconsistencias no ifconfig" ++ ++msgid "Echo parameters to log" ++msgstr "Escrever parametros no registo" ++ ++msgid "Empirically measure MTU" ++msgstr "Medição empírica de MTU" ++ ++msgid "Enable OpenSSL hardware crypto engines" ++msgstr "Ativar motor OpenSSL por hardware" ++ ++msgid "Enable Path MTU discovery" ++msgstr "Ativar a descoberta do MTU do caminho" ++ ++msgid "Enable Static Key encryption mode (non-TLS)" ++msgstr "Ativar modo de encriptação por chave estática (não-TLS)" ++ ++msgid "Enable TLS and assume client role" ++msgstr "Activar TLS e assumir papel de cliente" ++ ++msgid "Enable TLS and assume server role" ++msgstr "Activar TLS e assumir papel de servidor" ++ ++msgid "Enable internal datagram fragmentation" ++msgstr "Activar a fragmentação interna de datagramas" ++ ++msgid "Enable management interface on IP port" ++msgstr "Activar o interface de gestão em IP porta" ++ ++msgid "Enabled" ++msgstr "Activado" ++ ++msgid "Encryption cipher for packets" ++msgstr "Cifra de encriptação para pacotes" ++ ++msgid "Execute shell cmd after routes are added" ++msgstr "Executar o comando shell após as rotas serem adicionadas" ++ ++msgid "Execute shell command on remote ip change" ++msgstr "Executar o comando shell quando existir alteração do IP remoto" ++ ++msgid "" ++"Executed in server mode on new client connections, when the client is still " ++"untrusted" ++msgstr "" ++"Executado em modo de servidor em novas ligações de cliente, quando o cliente " ++"ainda não é de confiável" ++ ++msgid "" ++"Executed in server mode whenever an IPv4 address/route or MAC address is " ++"added to OpenVPN's internal routing table" ++msgstr "" ++"Executado em modo de servidor quando um endereço IPv4/rota ou endereço MAC é " ++"adicionado à tabela interna de roteamento do OpernVPN." ++ ++msgid "Exit on TLS negotiation failure" ++msgstr "Fechar quando existir falha na negociação TLS" ++ ++msgid "Get PEM password from controlling tty before we daemonize" ++msgstr "Obter password PEM do terminal de controlo antes de passar a daemon" ++ ++msgid "HMAC authentication for packets" ++msgstr "Autenticação HMAC para pacotes" ++ ++msgid "Handling of authentication failures" ++msgstr "Gestão de falhas de autenticação" ++ ++msgid "" ++"Helper directive to simplify the expression of --ping and --ping-restart in " ++"server mode configurations" ++msgstr "" ++"Directiva auxiliar para simplificar a expressão de --ping e --ping-restart " ++"nas configurações do modo servidor" ++ ++msgid "If hostname resolve fails, retry" ++msgstr "Se a resolução de nomes falhar, tentar novamente" ++ ++msgid "Instance \"%s\"" ++msgstr "Instância \"%s\"" ++ ++msgid "Invalid" ++msgstr "Inválido" ++ ++msgid "Keep local IP address on restart" ++msgstr "Manter o endereço IP local entre reinicios" ++ ++msgid "Keep remote IP address on restart" ++msgstr "Manter o endereço IP remoto entre reinicios" ++ ++msgid "Keep tun/tap device open on restart" ++msgstr "Manter o dispositivo tun/tap aberto entre reinicios" ++ ++msgid "Key transition window" ++msgstr "Janela para transição de chaves" ++ ++msgid "Limit repeated log messages" ++msgstr "Limitar repetição de entradas no registo" ++ ++msgid "Local certificate" ++msgstr "Certificado local" ++ ++msgid "Local host name or ip address" ++msgstr "Hostname ou endereço IP local" ++ ++msgid "Local private key" ++msgstr "Chave privada local" ++ ++msgid "Major mode" ++msgstr "Modo principal" ++ ++msgid "Make tun device IPv6 capable" ++msgstr "Tornar o dispositivo tun capaz de IPv6" ++ ++msgid "Maximum number of queued TCP output packets" ++msgstr "Maximo de pacotes TCP na queue de output" ++ ++msgid "Number of allocated broadcast buffers" ++msgstr "Numero de buffers de broadcast alocados" ++ ++msgid "Number of lines for log file history" ++msgstr "Numero de linhas para o historico do registo" ++ ++msgid "Only accept connections from given X509 name" ++msgstr "Aceitar ligações apenas de um dado nome X509" ++ ++msgid "Only process ping timeouts if routes exist" ++msgstr "Só processar timeouts de pings se existirem rotas" ++ ++msgid "OpenVPN" ++msgstr "OpenVPN" ++ ++msgid "OpenVPN instances" ++msgstr "Instâncias OpenVPN" ++ ++msgid "Optimize TUN/TAP/UDP writes" ++msgstr "Optimizar as escritas TUN/TAP/UDP" ++ ++msgid "Output to syslog and do not daemonize" ++msgstr "Registos para o syslog e não passar a daemon" ++ ++msgid "Overview" ++msgstr "Visão Geral" ++ ++msgid "PKCS#12 file containing keys" ++msgstr "Ficheiro PKCS#12 com chaves" ++ ++msgid "Pass environment variables to script" ++msgstr "Passar variaveis de ambiente ao script" ++ ++msgid "Persist replay-protection state" ++msgstr "Manter persistência da protecção replay" ++ ++msgid "Persist/unpersist ifconfig-pool" ++msgstr "Manter ou não o conjunto de subredes" ++ ++msgid "Ping remote every n seconds over TCP/UDP port" ++msgstr "Pingar o remoto a cada n segundos sobre a porta TCP/UDP" ++ ++msgid "Policy level over usage of external programs and scripts" ++msgstr "Nível da política sobre o uso de programas externos e scripts" ++ ++msgid "Port" ++msgstr "Porta" ++ ++msgid "Protocol" ++msgstr "Protocolo" ++ ++msgid "Proxy timeout in seconds" ++msgstr "Timeout do proxy em segundos" ++ ++msgid "Push an ifconfig option to remote" ++msgstr "Enviar uma opção ifconfig ao remoto" ++ ++msgid "Push options to peer" ++msgstr "Enviar opções ao remoto" ++ ++msgid "Query management channel for private key" ++msgstr "Solicitar chave privada ao canal de gestão" ++ ++msgid "Randomly choose remote server" ++msgstr "Escolher o server remoto aleatoriamente" ++ ++msgid "Refuse connection if no custom client config" ++msgstr "Recusar ligações de clientes que não tenham configurações " ++ ++msgid "Remap SIGUSR1 signals" ++msgstr "Mapear os sinais SIGUSR1" ++ ++msgid "Remote host name or ip address" ++msgstr "Hostname endereço IP remoto" ++ ++msgid "Remote ping timeout" ++msgstr "Timeout do ping remoto" ++ ++msgid "Renegotiate data chan. key after bytes" ++msgstr "Renegociar chave do canal de dados após n bytes " ++ ++msgid "Renegotiate data chan. key after packets" ++msgstr "Renegociar chave do canal de dados após n pacotes" ++ ++msgid "Renegotiate data chan. key after seconds" ++msgstr "Renegociar chave do canal de dados após n segundos" ++ ++msgid "Replay protection sliding window size" ++msgstr "Tamanho da janela de protecção conta replay" ++ ++msgid "Require explicit designation on certificate" ++msgstr "Requerer designação específica no certificado" ++ ++msgid "Require explicit key usage on certificate" ++msgstr "Requerer utilização explicita de utilização de chave no certificado" ++ ++msgid "Restart after remote ping timeout" ++msgstr "Reiniciar após timeout do ping remoto" ++ ++msgid "Retransmit timeout on TLS control channel" ++msgstr "Timeout de retransmissão no canal de controlo TLS" ++ ++msgid "Retry indefinitely on HTTP proxy errors" ++msgstr "Tentar infinitamente sempre que existam erros de proxy HTTP" ++ ++msgid "Retry indefinitely on Socks proxy errors" ++msgstr "Tentar continuamente a ligação quando existirem erros de proxy Socks" ++ ++msgid "Route subnet to client" ++msgstr "Encaminhar rota da subrede para o cliente" ++ ++msgid "Run as an inetd or xinetd server" ++msgstr "Executar via inetd ou xinetd" ++ ++msgid "Run script cmd on client connection" ++msgstr "Executar script quando o cliente ligar" ++ ++msgid "Run script cmd on client disconnection" ++msgstr "Executar script quando o cliente desligar" ++ ++msgid "Run up/down scripts for all restarts" ++msgstr "Executar scripts de abertura/activação para todos os reinicios" ++ ++msgid "Send notification to peer on disconnect" ++msgstr "Notificar remoto ao desligar" ++ ++msgid "Set GID to group" ++msgstr "Assumir GID para o grupo" ++ ++msgid "Set TCP/UDP MTU" ++msgstr "Definir o MTU TCP/UDP" ++ ++msgid "Set UID to user" ++msgstr "Assumir UID para o utilizador" ++ ++msgid "Set aside a pool of subnets" ++msgstr "Reservar um conjunto de subredes" ++ ++msgid "Set extended HTTP proxy options" ++msgstr "Definir opções extra para o proxy HTTP" ++ ++msgid "Set output verbosity" ++msgstr "Definir verbosidade do registo" ++ ++msgid "Set size of real and virtual address hash tables" ++msgstr "Definir tamanho das tabelas hash de endereços reais e virtuais" ++ ++msgid "Set the TCP/UDP receive buffer size" ++msgstr "Definir o buffer de recepção TCP/UDP" ++ ++msgid "Set the TCP/UDP send buffer size" ++msgstr "Definir o buffer de envio TCP/UDP" ++ ++msgid "Set tun/tap TX queue length" ++msgstr "Definir o tamanho da queue de transmissão tun/tap" ++ ++msgid "Set tun/tap adapter parameters" ++msgstr "Definir os parâmetros do adaptador tun/tap" ++ ++msgid "Set tun/tap device MTU" ++msgstr "Definir o MTU do dispositivo tun/tap" ++ ++msgid "Set tun/tap device overhead" ++msgstr "Definir o overhead do dispositivo tun/tap" ++ ++msgid "Set upper bound on TCP MSS" ++msgstr "Definir tecto do MSS TCP" ++ ++msgid "Shaping for peer bandwidth" ++msgstr "Restringir a largura de banda ao remoto" ++ ++msgid "Shell cmd to execute after tun device open" ++msgstr "Comando shell a executar após abertura do dispositivo tun" ++ ++msgid "Shell cmd to run after tun device close" ++msgstr "Comando shell a executar após fecho do dispositivo tun" ++ ++msgid "Shell command to verify X509 name" ++msgstr "Comando shell para verificar o nome X509" ++ ++msgid "Silence the output of replay warnings" ++msgstr "Silenciar o output dos avisos de replay" ++ ++msgid "Size of cipher key" ++msgstr "Tamanho da chave de cifra" ++ ++msgid "Specify a default gateway for routes" ++msgstr "Especificar uma gateway para as rotas" ++ ++msgid "Start OpenVPN in a hibernating state" ++msgstr "Iniciar o OpenVPN em estado de hibernação" ++ ++msgid "Start/Stop" ++msgstr "Iniciar/Parar" ++ ++msgid "Started" ++msgstr "Iniciado" ++ ++msgid "Status file format version" ++msgstr "Versão de formato do ficheiro de estado" ++ ++msgid "Switch to advanced configuration »" ++msgstr "Mudar para configuração avançada" ++ ++msgid "TCP/UDP port # for both local and remote" ++msgstr "Porta TCP/UDP para local e remoto" ++ ++msgid "TCP/UDP port # for local (default=1194)" ++msgstr "Porta TCP/UDP para local (predefinição=1194)" ++ ++msgid "TCP/UDP port # for remote (default=1194)" ++msgstr "Porta TCP/UDP para remoto (predefinição=1194)" ++ ++msgid "TLS cipher" ++msgstr "Cifra TLS" ++ ++msgid "TOS passthrough (applies to IPv4 only)" ++msgstr "Passthrough TOS (aplicavel apenas a IPv4)" ++ ++msgid "Temporary directory for client-connect return file" ++msgstr "Directório temporário para ficheiro de retorno de ligação-cliente" ++ ++msgid "Timeframe for key exchange" ++msgstr "Janela temporal para troca de chaves" ++ ++msgid "Type of used device" ++msgstr "Tipo de dispositivo utilizado" ++ ++msgid "Use fast LZO compression" ++msgstr "Usar compressão LZO rápida" ++ ++msgid "Use individual addresses rather than /30 subnets" ++msgstr "Usar endereços individuais em vez de subredes /30" ++ ++msgid "Use protocol" ++msgstr "Usar protocolo" ++ ++msgid "Use tun/tap device node" ++msgstr "Utilizar dispositivo tun/tap" ++ ++msgid "Use username as common name" ++msgstr "Usar o username como nome comum" ++ ++msgid "Write log to file" ++msgstr "Escrever registo para o ficheiro" ++ ++msgid "Write process ID to file" ++msgstr "Escrever PID no ficheiro" ++ ++msgid "Write status to file every n seconds" ++msgstr "Escrever estado para ficheiro a cada n segundos" ++ ++msgid "no" ++msgstr "não" ++ ++msgid "tun/tap device" ++msgstr "Dispositivo tun/tap" ++ ++msgid "tun/tap inactivity timeout" ++msgstr "Timeout de inactividade tun/tap" ++ ++msgid "yes (%i)" ++msgstr "sim (%i)" ++ ++msgid "« Switch to basic configuration" ++msgstr "Mudar para configuração básica" ++ ++#~ msgid "Cryptography" ++#~ msgstr "Criptografia" ++ ++#~ msgid "Networking" ++#~ msgstr "Rede" ++ ++#~ msgid "Service" ++#~ msgstr "Serviço" ++ ++#~ msgid "VPN" ++#~ msgstr "VPN" +diff --git a/feeds/luci/applications/luci-app-openvpn/po/ro/openvpn.po b/feeds/luci/applications/luci-app-openvpn/po/ro/openvpn.po +new file mode 100644 +index 0000000..1ca6782 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-openvpn/po/ro/openvpn.po +@@ -0,0 +1,536 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Last-Translator: Automatically generated\n" ++"Language-Team: none\n" ++"Language: \n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=3; plural=n==1 ? 0 : (n==0 || (n%100 > 0 && n%100 < " ++"20)) ? 1 : 2;\n" ++ ++msgid "%s" ++msgstr "" ++ ++msgid "'net30', 'p2p', or 'subnet'" ++msgstr "" ++ ++msgid "Accept options pushed from server" ++msgstr "" ++ ++msgid "Add" ++msgstr "" ++ ++msgid "Add route after establishing connection" ++msgstr "" ++ ++msgid "Additional authentication over TLS" ++msgstr "" ++ ++msgid "Allow client-to-client traffic" ++msgstr "" ++ ++msgid "Allow multiple clients with same certificate" ++msgstr "" ++ ++msgid "Allow only one session" ++msgstr "" ++ ++msgid "Allow remote to change its IP or port" ++msgstr "" ++ ++msgid "Allowed maximum of connected clients" ++msgstr "" ++ ++msgid "Allowed maximum of internal" ++msgstr "" ++ ++msgid "Allowed maximum of new connections" ++msgstr "" ++ ++msgid "Append log to file" ++msgstr "" ++ ++msgid "Authenticate using username/password" ++msgstr "" ++ ++msgid "Automatically redirect default route" ++msgstr "" ++ ++msgid "Below is a list of configured OpenVPN instances and their current state" ++msgstr "" ++ ++msgid "Call down cmd/script before TUN/TAP close" ++msgstr "" ++ ++msgid "Certificate authority" ++msgstr "" ++ ++msgid "Change process priority" ++msgstr "" ++ ++msgid "Change to directory before initialization" ++msgstr "" ++ ++msgid "Check peer certificate against a CRL" ++msgstr "" ++ ++msgid "Chroot to directory after initialization" ++msgstr "" ++ ++msgid "Client is disabled" ++msgstr "" ++ ++msgid "Configuration category" ++msgstr "" ++ ++msgid "Configure client mode" ++msgstr "" ++ ++msgid "Configure server bridge" ++msgstr "" ++ ++msgid "Configure server mode" ++msgstr "" ++ ++msgid "Connect through Socks5 proxy" ++msgstr "" ++ ++msgid "Connect to remote host through an HTTP proxy" ++msgstr "" ++ ++msgid "Connection retry interval" ++msgstr "" ++ ++msgid "Daemonize after initialization" ++msgstr "" ++ ++msgid "Delay n seconds after connection" ++msgstr "" ++ ++msgid "Delay tun/tap open and up script execution" ++msgstr "" ++ ++msgid "Diffie Hellman parameters" ++msgstr "" ++ ++msgid "Directory for custom client config files" ++msgstr "" ++ ++msgid "Disable Paging" ++msgstr "" ++ ++msgid "Disable cipher initialisation vector" ++msgstr "" ++ ++msgid "Disable options consistency check" ++msgstr "" ++ ++msgid "Disable replay protection" ++msgstr "" ++ ++msgid "Do not bind to local address and port" ++msgstr "" ++ ++msgid "Don't actually execute ifconfig" ++msgstr "" ++ ++msgid "Don't add routes automatically" ++msgstr "" ++ ++msgid "Don't cache --askpass or --auth-user-pass passwords" ++msgstr "" ++ ++msgid "Don't inherit global push options" ++msgstr "" ++ ++msgid "Don't log timestamps" ++msgstr "" ++ ++msgid "Don't re-read key on restart" ++msgstr "" ++ ++msgid "Don't require client certificate" ++msgstr "" ++ ++msgid "Don't use adaptive lzo compression" ++msgstr "" ++ ++msgid "Don't warn on ifconfig inconsistencies" ++msgstr "" ++ ++msgid "Echo parameters to log" ++msgstr "" ++ ++msgid "Empirically measure MTU" ++msgstr "" ++ ++msgid "Enable OpenSSL hardware crypto engines" ++msgstr "" ++ ++msgid "Enable Path MTU discovery" ++msgstr "" ++ ++msgid "Enable Static Key encryption mode (non-TLS)" ++msgstr "" ++ ++msgid "Enable TLS and assume client role" ++msgstr "" ++ ++msgid "Enable TLS and assume server role" ++msgstr "" ++ ++msgid "Enable internal datagram fragmentation" ++msgstr "" ++ ++msgid "Enable management interface on IP port" ++msgstr "" ++ ++msgid "Enabled" ++msgstr "" ++ ++msgid "Encryption cipher for packets" ++msgstr "" ++ ++msgid "Execute shell cmd after routes are added" ++msgstr "" ++ ++msgid "Execute shell command on remote ip change" ++msgstr "" ++ ++msgid "" ++"Executed in server mode on new client connections, when the client is still " ++"untrusted" ++msgstr "" ++ ++msgid "" ++"Executed in server mode whenever an IPv4 address/route or MAC address is " ++"added to OpenVPN's internal routing table" ++msgstr "" ++ ++msgid "Exit on TLS negotiation failure" ++msgstr "" ++ ++msgid "Get PEM password from controlling tty before we daemonize" ++msgstr "" ++ ++msgid "HMAC authentication for packets" ++msgstr "" ++ ++msgid "Handling of authentication failures" ++msgstr "" ++ ++msgid "" ++"Helper directive to simplify the expression of --ping and --ping-restart in " ++"server mode configurations" ++msgstr "" ++ ++msgid "If hostname resolve fails, retry" ++msgstr "" ++ ++msgid "Instance \"%s\"" ++msgstr "" ++ ++msgid "Invalid" ++msgstr "" ++ ++msgid "Keep local IP address on restart" ++msgstr "" ++ ++msgid "Keep remote IP address on restart" ++msgstr "" ++ ++msgid "Keep tun/tap device open on restart" ++msgstr "" ++ ++msgid "Key transition window" ++msgstr "" ++ ++msgid "Limit repeated log messages" ++msgstr "" ++ ++msgid "Local certificate" ++msgstr "" ++ ++msgid "Local host name or ip address" ++msgstr "" ++ ++msgid "Local private key" ++msgstr "" ++ ++msgid "Major mode" ++msgstr "" ++ ++msgid "Make tun device IPv6 capable" ++msgstr "" ++ ++msgid "Maximum number of queued TCP output packets" ++msgstr "" ++ ++msgid "Number of allocated broadcast buffers" ++msgstr "" ++ ++msgid "Number of lines for log file history" ++msgstr "" ++ ++msgid "Only accept connections from given X509 name" ++msgstr "" ++ ++msgid "Only process ping timeouts if routes exist" ++msgstr "" ++ ++msgid "OpenVPN" ++msgstr "" ++ ++msgid "OpenVPN instances" ++msgstr "" ++ ++msgid "Optimize TUN/TAP/UDP writes" ++msgstr "" ++ ++msgid "Output to syslog and do not daemonize" ++msgstr "" ++ ++msgid "Overview" ++msgstr "" ++ ++msgid "PKCS#12 file containing keys" ++msgstr "" ++ ++msgid "Pass environment variables to script" ++msgstr "" ++ ++msgid "Persist replay-protection state" ++msgstr "" ++ ++msgid "Persist/unpersist ifconfig-pool" ++msgstr "" ++ ++msgid "Ping remote every n seconds over TCP/UDP port" ++msgstr "" ++ ++msgid "Policy level over usage of external programs and scripts" ++msgstr "" ++ ++msgid "Port" ++msgstr "" ++ ++msgid "Protocol" ++msgstr "" ++ ++msgid "Proxy timeout in seconds" ++msgstr "" ++ ++msgid "Push an ifconfig option to remote" ++msgstr "" ++ ++msgid "Push options to peer" ++msgstr "" ++ ++msgid "Query management channel for private key" ++msgstr "" ++ ++msgid "Randomly choose remote server" ++msgstr "" ++ ++msgid "Refuse connection if no custom client config" ++msgstr "" ++ ++msgid "Remap SIGUSR1 signals" ++msgstr "" ++ ++msgid "Remote host name or ip address" ++msgstr "" ++ ++msgid "Remote ping timeout" ++msgstr "" ++ ++msgid "Renegotiate data chan. key after bytes" ++msgstr "" ++ ++msgid "Renegotiate data chan. key after packets" ++msgstr "" ++ ++msgid "Renegotiate data chan. key after seconds" ++msgstr "" ++ ++msgid "Replay protection sliding window size" ++msgstr "" ++ ++msgid "Require explicit designation on certificate" ++msgstr "" ++ ++msgid "Require explicit key usage on certificate" ++msgstr "" ++ ++msgid "Restart after remote ping timeout" ++msgstr "" ++ ++msgid "Retransmit timeout on TLS control channel" ++msgstr "" ++ ++msgid "Retry indefinitely on HTTP proxy errors" ++msgstr "" ++ ++msgid "Retry indefinitely on Socks proxy errors" ++msgstr "" ++ ++msgid "Route subnet to client" ++msgstr "" ++ ++msgid "Run as an inetd or xinetd server" ++msgstr "" ++ ++msgid "Run script cmd on client connection" ++msgstr "" ++ ++msgid "Run script cmd on client disconnection" ++msgstr "" ++ ++msgid "Run up/down scripts for all restarts" ++msgstr "" ++ ++msgid "Send notification to peer on disconnect" ++msgstr "" ++ ++msgid "Set GID to group" ++msgstr "" ++ ++msgid "Set TCP/UDP MTU" ++msgstr "" ++ ++msgid "Set UID to user" ++msgstr "" ++ ++msgid "Set aside a pool of subnets" ++msgstr "" ++ ++msgid "Set extended HTTP proxy options" ++msgstr "" ++ ++msgid "Set output verbosity" ++msgstr "" ++ ++msgid "Set size of real and virtual address hash tables" ++msgstr "" ++ ++msgid "Set the TCP/UDP receive buffer size" ++msgstr "" ++ ++msgid "Set the TCP/UDP send buffer size" ++msgstr "" ++ ++msgid "Set tun/tap TX queue length" ++msgstr "" ++ ++msgid "Set tun/tap adapter parameters" ++msgstr "" ++ ++msgid "Set tun/tap device MTU" ++msgstr "" ++ ++msgid "Set tun/tap device overhead" ++msgstr "" ++ ++msgid "Set upper bound on TCP MSS" ++msgstr "" ++ ++msgid "Shaping for peer bandwidth" ++msgstr "" ++ ++msgid "Shell cmd to execute after tun device open" ++msgstr "" ++ ++msgid "Shell cmd to run after tun device close" ++msgstr "" ++ ++msgid "Shell command to verify X509 name" ++msgstr "" ++ ++msgid "Silence the output of replay warnings" ++msgstr "" ++ ++msgid "Size of cipher key" ++msgstr "" ++ ++msgid "Specify a default gateway for routes" ++msgstr "" ++ ++msgid "Start OpenVPN in a hibernating state" ++msgstr "" ++ ++msgid "Start/Stop" ++msgstr "" ++ ++msgid "Started" ++msgstr "" ++ ++msgid "Status file format version" ++msgstr "" ++ ++msgid "Switch to advanced configuration »" ++msgstr "" ++ ++msgid "TCP/UDP port # for both local and remote" ++msgstr "" ++ ++msgid "TCP/UDP port # for local (default=1194)" ++msgstr "" ++ ++msgid "TCP/UDP port # for remote (default=1194)" ++msgstr "" ++ ++msgid "TLS cipher" ++msgstr "" ++ ++msgid "TOS passthrough (applies to IPv4 only)" ++msgstr "" ++ ++msgid "Temporary directory for client-connect return file" ++msgstr "" ++ ++msgid "Timeframe for key exchange" ++msgstr "" ++ ++msgid "Type of used device" ++msgstr "" ++ ++msgid "Use fast LZO compression" ++msgstr "" ++ ++msgid "Use individual addresses rather than /30 subnets" ++msgstr "" ++ ++msgid "Use protocol" ++msgstr "" ++ ++msgid "Use tun/tap device node" ++msgstr "" ++ ++msgid "Use username as common name" ++msgstr "" ++ ++msgid "Write log to file" ++msgstr "" ++ ++msgid "Write process ID to file" ++msgstr "" ++ ++msgid "Write status to file every n seconds" ++msgstr "" ++ ++msgid "no" ++msgstr "" ++ ++msgid "tun/tap device" ++msgstr "" ++ ++msgid "tun/tap inactivity timeout" ++msgstr "" ++ ++msgid "yes (%i)" ++msgstr "" ++ ++msgid "« Switch to basic configuration" ++msgstr "" +diff --git a/feeds/luci/applications/luci-app-openvpn/po/ru/openvpn.po b/feeds/luci/applications/luci-app-openvpn/po/ru/openvpn.po +new file mode 100644 +index 0000000..8a4635a +--- /dev/null ++++ b/feeds/luci/applications/luci-app-openvpn/po/ru/openvpn.po +@@ -0,0 +1,575 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: LuCI: openvpn\n" ++"Report-Msgid-Bugs-To: \n" ++"POT-Creation-Date: 2009-05-19 19:36+0200\n" ++"PO-Revision-Date: 2013-09-06 10:01+0200\n" ++"Last-Translator: datasheet \n" ++"Language-Team: Russian \n" ++"Language: ru\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%" ++"10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" ++"X-Generator: Pootle 2.0.6\n" ++"X-Poedit-SourceCharset: UTF-8\n" ++ ++msgid "%s" ++msgstr "%s" ++ ++msgid "'net30', 'p2p', or 'subnet'" ++msgstr "'net30', 'p2p' или 'subnet'" ++ ++msgid "Accept options pushed from server" ++msgstr "Принимать опции, отправленные Ñ Ñервера" ++ ++msgid "Add" ++msgstr "Добавить" ++ ++msgid "Add route after establishing connection" ++msgstr "Добавить маршрут поÑле уÑтановки ÑоединениÑ" ++ ++msgid "Additional authentication over TLS" ++msgstr "Ð”Ð¾Ð¿Ð¾Ð»Ð½Ð¸Ñ‚ÐµÐ»ÑŒÐ½Ð°Ñ Ð°ÑƒÑ‚ÐµÐ½Ñ‚Ð¸Ñ„Ð¸ÐºÐ°Ñ†Ð¸Ñ Ñ‡ÐµÑ€ÐµÐ· TLS" ++ ++msgid "Allow client-to-client traffic" ++msgstr "Разрешить общение клиентов друг Ñ Ð´Ñ€ÑƒÐ³Ð¾Ð¼" ++ ++msgid "Allow multiple clients with same certificate" ++msgstr "Разрешить неÑколько клиентов Ñ Ð¾Ð´Ð½Ð¸Ð¼ Ñертификатом" ++ ++msgid "Allow only one session" ++msgstr "Разрешить только одну ÑеÑÑию" ++ ++msgid "Allow remote to change its IP or port" ++msgstr "Позволить удалённому хоÑту изменÑÑ‚ÑŒ IP-Ð°Ð´Ñ€ÐµÑ Ð¸Ð»Ð¸ порт" ++ ++msgid "Allowed maximum of connected clients" ++msgstr "Разрешённое макÑимальное количеÑтво подключенных клиентов" ++ ++msgid "Allowed maximum of internal" ++msgstr "Разрешённое макÑимальное количеÑтво внутренних" ++ ++msgid "Allowed maximum of new connections" ++msgstr "Разрешённое макÑимальное количеÑтво новых Ñоединений" ++ ++msgid "Append log to file" ++msgstr "ДопиÑать журнал в файл" ++ ++msgid "Authenticate using username/password" ++msgstr "ÐÑƒÑ‚ÐµÐ½Ñ‚Ð¸Ñ„Ð¸ÐºÐ°Ñ†Ð¸Ñ Ñ Ð¸Ñпользованием имени Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ Ð¸ паролÑ" ++ ++msgid "Automatically redirect default route" ++msgstr "ÐвтоматичеÑки перенаправлÑÑ‚ÑŒ маршруты по умолчанию" ++ ++msgid "Below is a list of configured OpenVPN instances and their current state" ++msgstr "СпиÑок наÑтроенных процеÑÑов OpenVPN и их текущее ÑоÑтоÑние" ++ ++msgid "Call down cmd/script before TUN/TAP close" ++msgstr "Команда/Ñкрипт, запуÑкаем(аÑ/ый) перед закрытием TUN/TAP" ++ ++msgid "Certificate authority" ++msgstr "Центр Ñертификации" ++ ++msgid "Change process priority" ++msgstr "Изменить приоритет процеÑÑа" ++ ++msgid "Change to directory before initialization" ++msgstr "Перейти в указанную директорию перед инициализацией" ++ ++msgid "Check peer certificate against a CRL" ++msgstr "Проверить Ñертификат пира в CRL" ++ ++msgid "Chroot to directory after initialization" ++msgstr "Выполнить chroot на указанную директорию поÑле инициализации" ++ ++msgid "Client is disabled" ++msgstr "Клиент выключен" ++ ++msgid "Configuration category" ++msgstr "ÐšÐ°Ñ‚ÐµÐ³Ð¾Ñ€Ð¸Ñ ÐºÐ¾Ð½Ñ„Ð¸Ð³ÑƒÑ€Ð°Ñ†Ð¸Ð¸" ++ ++msgid "Configure client mode" ++msgstr "ÐаÑтроить режим клиента" ++ ++msgid "Configure server bridge" ++msgstr "ÐаÑтроить моÑÑ‚" ++ ++msgid "Configure server mode" ++msgstr "ÐаÑтроить режим Ñервера" ++ ++msgid "Connect through Socks5 proxy" ++msgstr "СоединÑÑ‚ÑŒÑÑ Ð¸ÑÐ¿Ð¾Ð»ÑŒÐ·ÑƒÑ Socks5-прокÑи" ++ ++msgid "Connect to remote host through an HTTP proxy" ++msgstr "ПодключитьÑÑ Ðº удалённому хоÑту через HTTP-прокÑи" ++ ++msgid "Connection retry interval" ++msgstr "Интервал между попытками подключениÑ" ++ ++msgid "Daemonize after initialization" ++msgstr "Перейти в режим демона поÑле инициализации" ++ ++msgid "Delay n seconds after connection" ++msgstr "Задержка n Ñекунд поÑле подключениÑ" ++ ++msgid "Delay tun/tap open and up script execution" ++msgstr "" ++"ИÑпользовать задержку перед открытием уÑтройÑтва tun и выполнением Ñкрипта" ++ ++msgid "Diffie Hellman parameters" ++msgstr "Параметры алгоритма DH" ++ ++msgid "Directory for custom client config files" ++msgstr "Ð”Ð¸Ñ€ÐµÐºÑ‚Ð¾Ñ€Ð¸Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»ÑŒÑких файлов конфигурации клиентов" ++ ++msgid "Disable Paging" ++msgstr "Выключить пейджинг" ++ ++msgid "Disable cipher initialisation vector" ++msgstr "Выключить вектор инициализации шифра" ++ ++msgid "Disable options consistency check" ++msgstr "Выключить проверку целоÑтноÑти опций" ++ ++msgid "Disable replay protection" ++msgstr "Отключить проверку повторов" ++ ++msgid "Do not bind to local address and port" ++msgstr "Ðе выполнÑÑ‚ÑŒ привÑзку к локальному адреÑу и порту" ++ ++msgid "Don't actually execute ifconfig" ++msgstr "Ðе выполнÑÑ‚ÑŒ ifconfig" ++ ++msgid "Don't add routes automatically" ++msgstr "Ðе добавлÑÑ‚ÑŒ маршруты автоматичеÑки" ++ ++msgid "Don't cache --askpass or --auth-user-pass passwords" ++msgstr "Ðе кешировать пароли --askpass или --auth-user-pass" ++ ++#, fuzzy ++msgid "Don't inherit global push options" ++msgstr "Ðе наÑледовать глобальные параметры push" ++ ++msgid "Don't log timestamps" ++msgstr "Ðе запиÑывать отметки времени в журнал" ++ ++msgid "Don't re-read key on restart" ++msgstr "Ðе Ñчитывать заново ключ при перезапуÑке" ++ ++msgid "Don't require client certificate" ++msgstr "Ðе требовать Ñертификат у клиента" ++ ++msgid "Don't use adaptive lzo compression" ++msgstr "Ðе иÑпользовать адаптивное Ñжатие LZO" ++ ++msgid "Don't warn on ifconfig inconsistencies" ++msgstr "Ðе извещать об ошибках ifconfig" ++ ++msgid "Echo parameters to log" ++msgstr "Выводить параметры в журнал" ++ ++msgid "Empirically measure MTU" ++msgstr "ЭмпиричеÑки измерÑÑ‚ÑŒ MTU" ++ ++msgid "Enable OpenSSL hardware crypto engines" ++msgstr "Включить поддержку аппаратного ÑˆÐ¸Ñ„Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ OpenSSL" ++ ++msgid "Enable Path MTU discovery" ++msgstr "Включить обнаружение пути MTU (PMTUD)" ++ ++msgid "Enable Static Key encryption mode (non-TLS)" ++msgstr "Включить шифрование Ñ Ð¿Ð¾ÑтоÑнным ключом (не TLS)" ++ ++msgid "Enable TLS and assume client role" ++msgstr "Включить TLS в режиме клиента" ++ ++msgid "Enable TLS and assume server role" ++msgstr "Включить TLS в режиме Ñервера" ++ ++msgid "Enable internal datagram fragmentation" ++msgstr "Включить внутреннюю фрагментацию дейтаграмм" ++ ++msgid "Enable management interface on IP port" ++msgstr "Включить Ð¸Ð½Ñ‚ÐµÑ€Ñ„ÐµÐ¹Ñ ÑƒÐ¿Ñ€Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ð½Ð° IP порту" ++ ++msgid "Enabled" ++msgstr "Включено" ++ ++msgid "Encryption cipher for packets" ++msgstr "Шифрование Ð´Ð»Ñ Ð¿Ð°ÐºÐµÑ‚Ð¾Ð²" ++ ++msgid "Execute shell cmd after routes are added" ++msgstr "Выполнить shell-команду поÑле Ð´Ð¾Ð±Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ð¼Ð°Ñ€ÑˆÑ€ÑƒÑ‚Ð¾Ð²" ++ ++msgid "Execute shell command on remote ip change" ++msgstr "Выполнить shell-команду при изменении IP-адреÑа удалённого хоÑта" ++ ++msgid "" ++"Executed in server mode on new client connections, when the client is still " ++"untrusted" ++msgstr "" ++"ВыполнÑетÑÑ Ð² режиме Ñервера при поÑвлении новых клиентÑких Ñоединений, еÑли " ++"к клиенту ещё нет довериÑ" ++ ++msgid "" ++"Executed in server mode whenever an IPv4 address/route or MAC address is " ++"added to OpenVPN's internal routing table" ++msgstr "" ++"ВыполнÑетÑÑ Ð² режиме Ñервера, когда адреÑ/маршрут IPv4 или MAC-Ð°Ð´Ñ€ÐµÑ " ++"добавлен в таблицу маршрутизации OpenVPN" ++ ++msgid "Exit on TLS negotiation failure" ++msgstr "Выйти при ошибке ÑоглаÑÐ¾Ð²Ð°Ð½Ð¸Ñ TLS" ++ ++msgid "Get PEM password from controlling tty before we daemonize" ++msgstr "Получить пароль PEM от управлÑющей конÑоли перед уходом в фон" ++ ++msgid "HMAC authentication for packets" ++msgstr "HMAC-Ð°ÑƒÑ‚ÐµÐ½Ñ‚Ð¸Ñ„Ð¸ÐºÐ°Ñ†Ð¸Ñ Ð´Ð»Ñ Ð¿Ð°ÐºÐµÑ‚Ð¾Ð²" ++ ++msgid "Handling of authentication failures" ++msgstr "Обработка ошибок аутентификации" ++ ++msgid "" ++"Helper directive to simplify the expression of --ping and --ping-restart in " ++"server mode configurations" ++msgstr "" ++"Ð’ÑÐ¿Ð¾Ð¼Ð¾Ð³Ð°Ñ‚ÐµÐ»ÑŒÐ½Ð°Ñ Ð´Ð¸Ñ€ÐµÐºÑ‚Ð¸Ð²Ð° Ð´Ð»Ñ ÑƒÐ¿Ñ€Ð¾Ñ‰ÐµÐ½Ð¸Ñ Ð²Ñ‹Ñ€Ð°Ð¶ÐµÐ½Ð¸Ð¹ --ping и --ping-restart в " ++"конфигурациÑÑ… Ñерверного режима" ++ ++msgid "If hostname resolve fails, retry" ++msgstr "ПытатьÑÑ Ð·Ð°Ð½Ð¾Ð²Ð¾ подключитьÑÑ Ð¿Ñ€Ð¸ ошибке Ð¾Ð¿Ñ€ÐµÐ´ÐµÐ»ÐµÐ½Ð¸Ñ Ð¸Ð¼ÐµÐ½Ð¸ хоÑта" ++ ++msgid "Instance \"%s\"" ++msgstr "ПроцеÑÑ \"%s\"" ++ ++msgid "Invalid" ++msgstr "Ðеверный" ++ ++msgid "Keep local IP address on restart" ++msgstr "Ðе изменÑÑ‚ÑŒ локальный IP-Ð°Ð´Ñ€ÐµÑ Ð¿Ñ€Ð¸ перезапуÑке" ++ ++msgid "Keep remote IP address on restart" ++msgstr "Ðе изменÑÑ‚ÑŒ удалённый IP-Ð°Ð´Ñ€ÐµÑ Ð¿Ñ€Ð¸ перезапуÑке" ++ ++msgid "Keep tun/tap device open on restart" ++msgstr "Ðе закрывать уÑтройÑтво tun/tap при перезапуÑке" ++ ++# Может "Окно перехода ключей", надо Ñмотреть контекÑÑ‚ ++#, fuzzy ++msgid "Key transition window" ++msgstr "Окно передачи ключей" ++ ++msgid "Limit repeated log messages" ++msgstr "Ограничить повторÑющиеÑÑ ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ Ð¶ÑƒÑ€Ð½Ð°Ð»Ð°" ++ ++msgid "Local certificate" ++msgstr "Локальный Ñертификат" ++ ++msgid "Local host name or ip address" ++msgstr "Ð˜Ð¼Ñ Ð»Ð¾ÐºÐ°Ð»ÑŒÐ½Ð¾Ð³Ð¾ хоÑта или IP-адреÑ" ++ ++msgid "Local private key" ++msgstr "Локальный Ñекретный ключ" ++ ++msgid "Major mode" ++msgstr "ОÑновной режим" ++ ++msgid "Make tun device IPv6 capable" ++msgstr "Включить поддержку IPv6 Ð´Ð»Ñ ÑƒÑтройÑтва tun" ++ ++msgid "Maximum number of queued TCP output packets" ++msgstr "МакÑимальное количеÑтво иÑходÑщих TCP-пакетов в очереди" ++ ++msgid "Number of allocated broadcast buffers" ++msgstr "КоличеÑтво выделенных широковещательных буферов" ++ ++msgid "Number of lines for log file history" ++msgstr "КоличеÑтво Ñтрок в файле журнала" ++ ++msgid "Only accept connections from given X509 name" ++msgstr "Принимать ÑÐ¾ÐµÐ´Ð¸Ð½ÐµÐ½Ð¸Ñ Ñ‚Ð¾Ð»ÑŒÐºÐ¾ от данного имени X509" ++ ++msgid "Only process ping timeouts if routes exist" ++msgstr "" ++"Обрабатывать таймаут ping-запроÑов только в Ñлучае, когда ÑущеÑтвует " ++"необходимый маршрут" ++ ++msgid "OpenVPN" ++msgstr "OpenVPN" ++ ++msgid "OpenVPN instances" ++msgstr "ПроцеÑÑÑ‹ OpenVPN" ++ ++msgid "Optimize TUN/TAP/UDP writes" ++msgstr "Оптимизировать запиÑÑŒ TUN/TAP/UDP" ++ ++msgid "Output to syslog and do not daemonize" ++msgstr "Выводить ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ Ð² ÑиÑтемный журнал и не переходить в фоновый режим" ++ ++msgid "Overview" ++msgstr "Обзор" ++ ++msgid "PKCS#12 file containing keys" ++msgstr "Файл Ñ ÐºÐ»ÑŽÑ‡Ð°Ð¼Ð¸ PKCS#12" ++ ++msgid "Pass environment variables to script" ++msgstr "Передавать переменные Ð¾ÐºÑ€ÑƒÐ¶ÐµÐ½Ð¸Ñ Ñкрипту" ++ ++msgid "Persist replay-protection state" ++msgstr "СохранÑÑ‚ÑŒ ÑоÑтоÑние защищённого ответа" ++ ++#, fuzzy ++msgid "Persist/unpersist ifconfig-pool" ++msgstr "СохранÑÑ‚ÑŒ/не ÑохранÑÑ‚ÑŒ пул ifconfig" ++ ++msgid "Ping remote every n seconds over TCP/UDP port" ++msgstr "ВыполнÑÑ‚ÑŒ ping каждые n Ñекунд, иÑÐ¿Ð¾Ð»ÑŒÐ·ÑƒÑ Ð¿Ð¾Ñ€Ñ‚ TCP/UDP" ++ ++msgid "Policy level over usage of external programs and scripts" ++msgstr "Уровень безопаÑноÑти Ð´Ð»Ñ Ð²Ð½ÐµÑˆÐ½Ð¸Ñ… программ и Ñкриптов" ++ ++msgid "Port" ++msgstr "Порт" ++ ++msgid "Protocol" ++msgstr "Протокол" ++ ++msgid "Proxy timeout in seconds" ++msgstr "Таймаут прокÑи (Ñек.)" ++ ++msgid "Push an ifconfig option to remote" ++msgstr "Передавать опцию ifconfig удалённой Ñтороне" ++ ++msgid "Push options to peer" ++msgstr "Передавать опции пиру" ++ ++msgid "Query management channel for private key" ++msgstr "ЗапроÑить канал ÑƒÐ¿Ñ€Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ð´Ð»Ñ Ð·Ð°ÐºÑ€Ñ‹Ñ‚Ð¾Ð³Ð¾ ключа" ++ ++msgid "Randomly choose remote server" ++msgstr "Случайно выбирать удалённый Ñервер" ++ ++msgid "Refuse connection if no custom client config" ++msgstr "" ++"Разорвать Ñоединение, еÑли пользовательÑÐºÐ°Ñ ÐºÐ¾Ð½Ñ„Ð¸Ð³ÑƒÑ€Ð°Ñ†Ð¸Ñ ÐºÐ»Ð¸ÐµÐ½Ñ‚Ð° отÑутÑтвует" ++ ++msgid "Remap SIGUSR1 signals" ++msgstr "Обрабатывать Ñигнал SIGUSR1" ++ ++msgid "Remote host name or ip address" ++msgstr "Ð˜Ð¼Ñ ÑƒÐ´Ð°Ð»Ñ‘Ð½Ð½Ð¾Ð³Ð¾ хоÑта или IP-адреÑ" ++ ++msgid "Remote ping timeout" ++msgstr "Таймаут удалённых ping-запроÑов" ++ ++msgid "Renegotiate data chan. key after bytes" ++msgstr "ПереÑоглаÑовать ключ канала данных поÑле кол-ва байт" ++ ++msgid "Renegotiate data chan. key after packets" ++msgstr "ПереÑоглаÑовать ключ канала данных поÑле кол-ва пакетов" ++ ++msgid "Renegotiate data chan. key after seconds" ++msgstr "ПереÑоглаÑовать ключ канала данных поÑле кол-ва Ñекунд" ++ ++#, fuzzy ++msgid "Replay protection sliding window size" ++msgstr "Размер ÑкользÑщего окна защиты от повторов" ++ ++msgid "Require explicit designation on certificate" ++msgstr "Требовать Ñвного ÑƒÐºÐ°Ð·Ð°Ð½Ð¸Ñ Ð² Ñертификате" ++ ++msgid "Require explicit key usage on certificate" ++msgstr "Требовать Ñвного иÑÐ¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ ÐºÐ»ÑŽÑ‡Ð° в Ñертификате" ++ ++msgid "Restart after remote ping timeout" ++msgstr "Ðачать заново поÑле таймаута ping-запроÑа" ++ ++msgid "Retransmit timeout on TLS control channel" ++msgstr "Таймаут повторной отправки канала ÑƒÐ¿Ñ€Ð°Ð²Ð»ÐµÐ½Ð¸Ñ TLS" ++ ++msgid "Retry indefinitely on HTTP proxy errors" ++msgstr "ПоÑтоÑнно пытатьÑÑ Ð·Ð°Ð½Ð¾Ð²Ð¾ подключитьÑÑ Ð¿Ñ€Ð¸ ошибке HTTP-прокÑи" ++ ++msgid "Retry indefinitely on Socks proxy errors" ++msgstr "ПоÑтоÑнно пытатьÑÑ Ð·Ð°Ð½Ð¾Ð²Ð¾ подключитьÑÑ Ð¿Ñ€Ð¸ ошибке Socks-прокÑи" ++ ++msgid "Route subnet to client" ++msgstr "Перенаправить подÑеть клиенту" ++ ++msgid "Run as an inetd or xinetd server" ++msgstr "ЗапуÑтить как inetd- или xinetd-Ñервер" ++ ++msgid "Run script cmd on client connection" ++msgstr "Выполнить Ñкрипт при подключении клиента" ++ ++msgid "Run script cmd on client disconnection" ++msgstr "Выполнить Ñкрипт при отключении клиента" ++ ++msgid "Run up/down scripts for all restarts" ++msgstr "ЗапуÑкать up/down Ñкрипты Ð´Ð»Ñ Ð²Ñех перезапуÑков" ++ ++msgid "Send notification to peer on disconnect" ++msgstr "ПоÑлать уведомление пиру при разъединении" ++ ++msgid "Set GID to group" ++msgstr "УÑтановить GID группе" ++ ++msgid "Set TCP/UDP MTU" ++msgstr "УÑтановить TCP/UDP MTU" ++ ++msgid "Set UID to user" ++msgstr "УÑтановить UID пользователю" ++ ++#, fuzzy ++msgid "Set aside a pool of subnets" ++msgstr "УÑтановить пул подÑетей" ++ ++msgid "Set extended HTTP proxy options" ++msgstr "УÑтановить раÑширенные наÑтройки HTTP-прокÑи" ++ ++msgid "Set output verbosity" ++msgstr "УÑтановить уровень вывода" ++ ++msgid "Set size of real and virtual address hash tables" ++msgstr "УÑтановить размер реальной и виртуальной хеш-таблиц" ++ ++msgid "Set the TCP/UDP receive buffer size" ++msgstr "УÑтановить размер буфера приёма TCP/UDP" ++ ++msgid "Set the TCP/UDP send buffer size" ++msgstr "УÑтановить размер буфера передачи TCP/UDP" ++ ++msgid "Set tun/tap TX queue length" ++msgstr "УÑтановить размер очереди передачи tun/tap" ++ ++msgid "Set tun/tap adapter parameters" ++msgstr "УÑтановить параметры адаптера tun/tap" ++ ++msgid "Set tun/tap device MTU" ++msgstr "УÑтановить MTU Ð´Ð»Ñ tun/tap уÑтройÑтва" ++ ++msgid "Set tun/tap device overhead" ++msgstr "УÑтановить накладные раÑходы tun/tap уÑтройÑтва" ++ ++msgid "Set upper bound on TCP MSS" ++msgstr "УÑтановить верхнюю границу Ð´Ð»Ñ TCP MSS" ++ ++msgid "Shaping for peer bandwidth" ++msgstr "Шейпинг пропуÑкной ÑпоÑобноÑти пира" ++ ++msgid "Shell cmd to execute after tun device open" ++msgstr "Выполнить shell-команду поÑле Ð¾Ñ‚ÐºÑ€Ñ‹Ñ‚Ð¸Ñ ÑƒÑтройÑтва tun" ++ ++msgid "Shell cmd to run after tun device close" ++msgstr "Выполнить shell-команду поÑле Ð·Ð°ÐºÑ€Ñ‹Ñ‚Ð¸Ñ ÑƒÑтройÑтва tun" ++ ++msgid "Shell command to verify X509 name" ++msgstr "Shell-команда Ð´Ð»Ñ Ð¿Ñ€Ð¾Ð²ÐµÑ€ÐºÐ¸ имени X509" ++ ++msgid "Silence the output of replay warnings" ++msgstr "Заглушить вывод предупреждений повторов" ++ ++msgid "Size of cipher key" ++msgstr "Размер ключа шифрованиÑ" ++ ++msgid "Specify a default gateway for routes" ++msgstr "УÑтановить шлюз по умолчанию Ð´Ð»Ñ Ð¼Ð°Ñ€ÑˆÑ€ÑƒÑ‚Ð¾Ð²" ++ ++msgid "Start OpenVPN in a hibernating state" ++msgstr "ЗапуÑтить OpenVPN в ÑпÑщем режиме" ++ ++msgid "Start/Stop" ++msgstr "Старт/Стоп" ++ ++msgid "Started" ++msgstr "Запущено" ++ ++msgid "Status file format version" ++msgstr "ВерÑÐ¸Ñ Ñ„Ð¾Ñ€Ð¼Ð°Ñ‚Ð° ÑтатуÑного файла" ++ ++msgid "Switch to advanced configuration »" ++msgstr "Перейти к раÑширенным наÑтройкам »" ++ ++msgid "TCP/UDP port # for both local and remote" ++msgstr "Ðомер локального и удалённого TCP/UDP порта" ++ ++msgid "TCP/UDP port # for local (default=1194)" ++msgstr "Ðомер локального TCP/UDP порта (1194 по умолчанию)" ++ ++msgid "TCP/UDP port # for remote (default=1194)" ++msgstr "Ðомер удалённого TCP/UDP порта (1194 по умолчанию)" ++ ++msgid "TLS cipher" ++msgstr "Шифр TLS" ++ ++msgid "TOS passthrough (applies to IPv4 only)" ++msgstr "ПропуÑк ToS (только Ð´Ð»Ñ IPv4)" ++ ++msgid "Temporary directory for client-connect return file" ++msgstr "Ð’Ñ€ÐµÐ¼ÐµÐ½Ð½Ð°Ñ Ð´Ð¸Ñ€ÐµÐºÑ‚Ð¾Ñ€Ð¸Ñ Ð´Ð»Ñ Ñ„Ð°Ð¹Ð»Ð° возрата Ð¿Ð¾Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ ÐºÐ»Ð¸ÐµÐ½Ñ‚Ð°" ++ ++msgid "Timeframe for key exchange" ++msgstr "Временное окно Ð´Ð»Ñ Ð¾Ð±Ð¼ÐµÐ½Ð° ключами" ++ ++msgid "Type of used device" ++msgstr "Тип иÑпользуемого уÑтройÑтва" ++ ++msgid "Use fast LZO compression" ++msgstr "ИÑпользовать быÑтрое Ñжатие LZO" ++ ++msgid "Use individual addresses rather than /30 subnets" ++msgstr "ИÑпользовать адреÑа вмеÑто подÑетей /30" ++ ++msgid "Use protocol" ++msgstr "ИÑпользовать протокол" ++ ++msgid "Use tun/tap device node" ++msgstr "ИÑпользовать файл уÑтройÑтва tun/tap" ++ ++msgid "Use username as common name" ++msgstr "ИÑпользовать Ð¸Ð¼Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ ÐºÐ°Ðº общее имÑ" ++ ++msgid "Write log to file" ++msgstr "ЗапиÑать журнал в файл" ++ ++msgid "Write process ID to file" ++msgstr "ЗапиÑать ID процеÑÑа в файл" ++ ++msgid "Write status to file every n seconds" ++msgstr "ЗапиÑывать ÑÑ‚Ð°Ñ‚ÑƒÑ Ð² файл каждые n Ñекунд" ++ ++msgid "no" ++msgstr "нет" ++ ++msgid "tun/tap device" ++msgstr "уÑтройÑтво tun/tap" ++ ++msgid "tun/tap inactivity timeout" ++msgstr "таймаут проÑÑ‚Ð¾Ñ tun/tap" ++ ++msgid "yes (%i)" ++msgstr "да (%i)" ++ ++msgid "« Switch to basic configuration" ++msgstr "« Перейти к оÑновным наÑтройкам" ++ ++#~ msgid "Cryptography" ++#~ msgstr "КриптографиÑ" ++ ++#~ msgid "Networking" ++#~ msgstr "Сеть" ++ ++#~ msgid "Service" ++#~ msgstr "Служба" ++ ++#~ msgid "VPN" ++#~ msgstr "VPN" ++ ++#~ msgid "openvpn_%s" ++#~ msgstr "openvpn_%s" ++ ++#~ msgid "openvpn_%s_desc" ++#~ msgstr "openvpn_%s_опиÑание" +diff --git a/feeds/luci/applications/luci-app-openvpn/po/sk/openvpn.po b/feeds/luci/applications/luci-app-openvpn/po/sk/openvpn.po +new file mode 100644 +index 0000000..7c885a8 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-openvpn/po/sk/openvpn.po +@@ -0,0 +1,534 @@ ++msgid "" ++msgstr "" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Last-Translator: Automatically generated\n" ++"Language-Team: none\n" ++"MIME-Version: 1.0\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n" ++ ++msgid "%s" ++msgstr "" ++ ++msgid "'net30', 'p2p', or 'subnet'" ++msgstr "" ++ ++msgid "Accept options pushed from server" ++msgstr "" ++ ++msgid "Add" ++msgstr "" ++ ++msgid "Add route after establishing connection" ++msgstr "" ++ ++msgid "Additional authentication over TLS" ++msgstr "" ++ ++msgid "Allow client-to-client traffic" ++msgstr "" ++ ++msgid "Allow multiple clients with same certificate" ++msgstr "" ++ ++msgid "Allow only one session" ++msgstr "" ++ ++msgid "Allow remote to change its IP or port" ++msgstr "" ++ ++msgid "Allowed maximum of connected clients" ++msgstr "" ++ ++msgid "Allowed maximum of internal" ++msgstr "" ++ ++msgid "Allowed maximum of new connections" ++msgstr "" ++ ++msgid "Append log to file" ++msgstr "" ++ ++msgid "Authenticate using username/password" ++msgstr "" ++ ++msgid "Automatically redirect default route" ++msgstr "" ++ ++msgid "Below is a list of configured OpenVPN instances and their current state" ++msgstr "" ++ ++msgid "Call down cmd/script before TUN/TAP close" ++msgstr "" ++ ++msgid "Certificate authority" ++msgstr "" ++ ++msgid "Change process priority" ++msgstr "" ++ ++msgid "Change to directory before initialization" ++msgstr "" ++ ++msgid "Check peer certificate against a CRL" ++msgstr "" ++ ++msgid "Chroot to directory after initialization" ++msgstr "" ++ ++msgid "Client is disabled" ++msgstr "" ++ ++msgid "Configuration category" ++msgstr "" ++ ++msgid "Configure client mode" ++msgstr "" ++ ++msgid "Configure server bridge" ++msgstr "" ++ ++msgid "Configure server mode" ++msgstr "" ++ ++msgid "Connect through Socks5 proxy" ++msgstr "" ++ ++msgid "Connect to remote host through an HTTP proxy" ++msgstr "" ++ ++msgid "Connection retry interval" ++msgstr "" ++ ++msgid "Daemonize after initialization" ++msgstr "" ++ ++msgid "Delay n seconds after connection" ++msgstr "" ++ ++msgid "Delay tun/tap open and up script execution" ++msgstr "" ++ ++msgid "Diffie Hellman parameters" ++msgstr "" ++ ++msgid "Directory for custom client config files" ++msgstr "" ++ ++msgid "Disable Paging" ++msgstr "" ++ ++msgid "Disable cipher initialisation vector" ++msgstr "" ++ ++msgid "Disable options consistency check" ++msgstr "" ++ ++msgid "Disable replay protection" ++msgstr "" ++ ++msgid "Do not bind to local address and port" ++msgstr "" ++ ++msgid "Don't actually execute ifconfig" ++msgstr "" ++ ++msgid "Don't add routes automatically" ++msgstr "" ++ ++msgid "Don't cache --askpass or --auth-user-pass passwords" ++msgstr "" ++ ++msgid "Don't inherit global push options" ++msgstr "" ++ ++msgid "Don't log timestamps" ++msgstr "" ++ ++msgid "Don't re-read key on restart" ++msgstr "" ++ ++msgid "Don't require client certificate" ++msgstr "" ++ ++msgid "Don't use adaptive lzo compression" ++msgstr "" ++ ++msgid "Don't warn on ifconfig inconsistencies" ++msgstr "" ++ ++msgid "Echo parameters to log" ++msgstr "" ++ ++msgid "Empirically measure MTU" ++msgstr "" ++ ++msgid "Enable OpenSSL hardware crypto engines" ++msgstr "" ++ ++msgid "Enable Path MTU discovery" ++msgstr "" ++ ++msgid "Enable Static Key encryption mode (non-TLS)" ++msgstr "" ++ ++msgid "Enable TLS and assume client role" ++msgstr "" ++ ++msgid "Enable TLS and assume server role" ++msgstr "" ++ ++msgid "Enable internal datagram fragmentation" ++msgstr "" ++ ++msgid "Enable management interface on IP port" ++msgstr "" ++ ++msgid "Enabled" ++msgstr "" ++ ++msgid "Encryption cipher for packets" ++msgstr "" ++ ++msgid "Execute shell cmd after routes are added" ++msgstr "" ++ ++msgid "Execute shell command on remote ip change" ++msgstr "" ++ ++msgid "" ++"Executed in server mode on new client connections, when the client is still " ++"untrusted" ++msgstr "" ++ ++msgid "" ++"Executed in server mode whenever an IPv4 address/route or MAC address is " ++"added to OpenVPN's internal routing table" ++msgstr "" ++ ++msgid "Exit on TLS negotiation failure" ++msgstr "" ++ ++msgid "Get PEM password from controlling tty before we daemonize" ++msgstr "" ++ ++msgid "HMAC authentication for packets" ++msgstr "" ++ ++msgid "Handling of authentication failures" ++msgstr "" ++ ++msgid "" ++"Helper directive to simplify the expression of --ping and --ping-restart in " ++"server mode configurations" ++msgstr "" ++ ++msgid "If hostname resolve fails, retry" ++msgstr "" ++ ++msgid "Instance \"%s\"" ++msgstr "" ++ ++msgid "Invalid" ++msgstr "" ++ ++msgid "Keep local IP address on restart" ++msgstr "" ++ ++msgid "Keep remote IP address on restart" ++msgstr "" ++ ++msgid "Keep tun/tap device open on restart" ++msgstr "" ++ ++msgid "Key transition window" ++msgstr "" ++ ++msgid "Limit repeated log messages" ++msgstr "" ++ ++msgid "Local certificate" ++msgstr "" ++ ++msgid "Local host name or ip address" ++msgstr "" ++ ++msgid "Local private key" ++msgstr "" ++ ++msgid "Major mode" ++msgstr "" ++ ++msgid "Make tun device IPv6 capable" ++msgstr "" ++ ++msgid "Maximum number of queued TCP output packets" ++msgstr "" ++ ++msgid "Number of allocated broadcast buffers" ++msgstr "" ++ ++msgid "Number of lines for log file history" ++msgstr "" ++ ++msgid "Only accept connections from given X509 name" ++msgstr "" ++ ++msgid "Only process ping timeouts if routes exist" ++msgstr "" ++ ++msgid "OpenVPN" ++msgstr "" ++ ++msgid "OpenVPN instances" ++msgstr "" ++ ++msgid "Optimize TUN/TAP/UDP writes" ++msgstr "" ++ ++msgid "Output to syslog and do not daemonize" ++msgstr "" ++ ++msgid "Overview" ++msgstr "" ++ ++msgid "PKCS#12 file containing keys" ++msgstr "" ++ ++msgid "Pass environment variables to script" ++msgstr "" ++ ++msgid "Persist replay-protection state" ++msgstr "" ++ ++msgid "Persist/unpersist ifconfig-pool" ++msgstr "" ++ ++msgid "Ping remote every n seconds over TCP/UDP port" ++msgstr "" ++ ++msgid "Policy level over usage of external programs and scripts" ++msgstr "" ++ ++msgid "Port" ++msgstr "" ++ ++msgid "Protocol" ++msgstr "" ++ ++msgid "Proxy timeout in seconds" ++msgstr "" ++ ++msgid "Push an ifconfig option to remote" ++msgstr "" ++ ++msgid "Push options to peer" ++msgstr "" ++ ++msgid "Query management channel for private key" ++msgstr "" ++ ++msgid "Randomly choose remote server" ++msgstr "" ++ ++msgid "Refuse connection if no custom client config" ++msgstr "" ++ ++msgid "Remap SIGUSR1 signals" ++msgstr "" ++ ++msgid "Remote host name or ip address" ++msgstr "" ++ ++msgid "Remote ping timeout" ++msgstr "" ++ ++msgid "Renegotiate data chan. key after bytes" ++msgstr "" ++ ++msgid "Renegotiate data chan. key after packets" ++msgstr "" ++ ++msgid "Renegotiate data chan. key after seconds" ++msgstr "" ++ ++msgid "Replay protection sliding window size" ++msgstr "" ++ ++msgid "Require explicit designation on certificate" ++msgstr "" ++ ++msgid "Require explicit key usage on certificate" ++msgstr "" ++ ++msgid "Restart after remote ping timeout" ++msgstr "" ++ ++msgid "Retransmit timeout on TLS control channel" ++msgstr "" ++ ++msgid "Retry indefinitely on HTTP proxy errors" ++msgstr "" ++ ++msgid "Retry indefinitely on Socks proxy errors" ++msgstr "" ++ ++msgid "Route subnet to client" ++msgstr "" ++ ++msgid "Run as an inetd or xinetd server" ++msgstr "" ++ ++msgid "Run script cmd on client connection" ++msgstr "" ++ ++msgid "Run script cmd on client disconnection" ++msgstr "" ++ ++msgid "Run up/down scripts for all restarts" ++msgstr "" ++ ++msgid "Send notification to peer on disconnect" ++msgstr "" ++ ++msgid "Set GID to group" ++msgstr "" ++ ++msgid "Set TCP/UDP MTU" ++msgstr "" ++ ++msgid "Set UID to user" ++msgstr "" ++ ++msgid "Set aside a pool of subnets" ++msgstr "" ++ ++msgid "Set extended HTTP proxy options" ++msgstr "" ++ ++msgid "Set output verbosity" ++msgstr "" ++ ++msgid "Set size of real and virtual address hash tables" ++msgstr "" ++ ++msgid "Set the TCP/UDP receive buffer size" ++msgstr "" ++ ++msgid "Set the TCP/UDP send buffer size" ++msgstr "" ++ ++msgid "Set tun/tap TX queue length" ++msgstr "" ++ ++msgid "Set tun/tap adapter parameters" ++msgstr "" ++ ++msgid "Set tun/tap device MTU" ++msgstr "" ++ ++msgid "Set tun/tap device overhead" ++msgstr "" ++ ++msgid "Set upper bound on TCP MSS" ++msgstr "" ++ ++msgid "Shaping for peer bandwidth" ++msgstr "" ++ ++msgid "Shell cmd to execute after tun device open" ++msgstr "" ++ ++msgid "Shell cmd to run after tun device close" ++msgstr "" ++ ++msgid "Shell command to verify X509 name" ++msgstr "" ++ ++msgid "Silence the output of replay warnings" ++msgstr "" ++ ++msgid "Size of cipher key" ++msgstr "" ++ ++msgid "Specify a default gateway for routes" ++msgstr "" ++ ++msgid "Start OpenVPN in a hibernating state" ++msgstr "" ++ ++msgid "Start/Stop" ++msgstr "" ++ ++msgid "Started" ++msgstr "" ++ ++msgid "Status file format version" ++msgstr "" ++ ++msgid "Switch to advanced configuration »" ++msgstr "" ++ ++msgid "TCP/UDP port # for both local and remote" ++msgstr "" ++ ++msgid "TCP/UDP port # for local (default=1194)" ++msgstr "" ++ ++msgid "TCP/UDP port # for remote (default=1194)" ++msgstr "" ++ ++msgid "TLS cipher" ++msgstr "" ++ ++msgid "TOS passthrough (applies to IPv4 only)" ++msgstr "" ++ ++msgid "Temporary directory for client-connect return file" ++msgstr "" ++ ++msgid "Timeframe for key exchange" ++msgstr "" ++ ++msgid "Type of used device" ++msgstr "" ++ ++msgid "Use fast LZO compression" ++msgstr "" ++ ++msgid "Use individual addresses rather than /30 subnets" ++msgstr "" ++ ++msgid "Use protocol" ++msgstr "" ++ ++msgid "Use tun/tap device node" ++msgstr "" ++ ++msgid "Use username as common name" ++msgstr "" ++ ++msgid "Write log to file" ++msgstr "" ++ ++msgid "Write process ID to file" ++msgstr "" ++ ++msgid "Write status to file every n seconds" ++msgstr "" ++ ++msgid "no" ++msgstr "" ++ ++msgid "tun/tap device" ++msgstr "" ++ ++msgid "tun/tap inactivity timeout" ++msgstr "" ++ ++msgid "yes (%i)" ++msgstr "" ++ ++msgid "« Switch to basic configuration" ++msgstr "" +diff --git a/feeds/luci/applications/luci-app-openvpn/po/sv/openvpn.po b/feeds/luci/applications/luci-app-openvpn/po/sv/openvpn.po +new file mode 100644 +index 0000000..c4e30ac +--- /dev/null ++++ b/feeds/luci/applications/luci-app-openvpn/po/sv/openvpn.po +@@ -0,0 +1,535 @@ ++msgid "" ++msgstr "" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Last-Translator: Automatically generated\n" ++"Language-Team: none\n" ++"Language: sv\n" ++"MIME-Version: 1.0\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n != 1);\n" ++ ++msgid "%s" ++msgstr "" ++ ++msgid "'net30', 'p2p', or 'subnet'" ++msgstr "" ++ ++msgid "Accept options pushed from server" ++msgstr "" ++ ++msgid "Add" ++msgstr "" ++ ++msgid "Add route after establishing connection" ++msgstr "" ++ ++msgid "Additional authentication over TLS" ++msgstr "" ++ ++msgid "Allow client-to-client traffic" ++msgstr "" ++ ++msgid "Allow multiple clients with same certificate" ++msgstr "" ++ ++msgid "Allow only one session" ++msgstr "" ++ ++msgid "Allow remote to change its IP or port" ++msgstr "" ++ ++msgid "Allowed maximum of connected clients" ++msgstr "" ++ ++msgid "Allowed maximum of internal" ++msgstr "" ++ ++msgid "Allowed maximum of new connections" ++msgstr "" ++ ++msgid "Append log to file" ++msgstr "" ++ ++msgid "Authenticate using username/password" ++msgstr "" ++ ++msgid "Automatically redirect default route" ++msgstr "" ++ ++msgid "Below is a list of configured OpenVPN instances and their current state" ++msgstr "" ++ ++msgid "Call down cmd/script before TUN/TAP close" ++msgstr "" ++ ++msgid "Certificate authority" ++msgstr "" ++ ++msgid "Change process priority" ++msgstr "" ++ ++msgid "Change to directory before initialization" ++msgstr "" ++ ++msgid "Check peer certificate against a CRL" ++msgstr "" ++ ++msgid "Chroot to directory after initialization" ++msgstr "" ++ ++msgid "Client is disabled" ++msgstr "" ++ ++msgid "Configuration category" ++msgstr "" ++ ++msgid "Configure client mode" ++msgstr "" ++ ++msgid "Configure server bridge" ++msgstr "" ++ ++msgid "Configure server mode" ++msgstr "" ++ ++msgid "Connect through Socks5 proxy" ++msgstr "" ++ ++msgid "Connect to remote host through an HTTP proxy" ++msgstr "" ++ ++msgid "Connection retry interval" ++msgstr "" ++ ++msgid "Daemonize after initialization" ++msgstr "" ++ ++msgid "Delay n seconds after connection" ++msgstr "" ++ ++msgid "Delay tun/tap open and up script execution" ++msgstr "" ++ ++msgid "Diffie Hellman parameters" ++msgstr "" ++ ++msgid "Directory for custom client config files" ++msgstr "" ++ ++msgid "Disable Paging" ++msgstr "" ++ ++msgid "Disable cipher initialisation vector" ++msgstr "" ++ ++msgid "Disable options consistency check" ++msgstr "" ++ ++msgid "Disable replay protection" ++msgstr "" ++ ++msgid "Do not bind to local address and port" ++msgstr "" ++ ++msgid "Don't actually execute ifconfig" ++msgstr "" ++ ++msgid "Don't add routes automatically" ++msgstr "" ++ ++msgid "Don't cache --askpass or --auth-user-pass passwords" ++msgstr "" ++ ++msgid "Don't inherit global push options" ++msgstr "" ++ ++msgid "Don't log timestamps" ++msgstr "" ++ ++msgid "Don't re-read key on restart" ++msgstr "" ++ ++msgid "Don't require client certificate" ++msgstr "" ++ ++msgid "Don't use adaptive lzo compression" ++msgstr "" ++ ++msgid "Don't warn on ifconfig inconsistencies" ++msgstr "" ++ ++msgid "Echo parameters to log" ++msgstr "" ++ ++msgid "Empirically measure MTU" ++msgstr "" ++ ++msgid "Enable OpenSSL hardware crypto engines" ++msgstr "" ++ ++msgid "Enable Path MTU discovery" ++msgstr "" ++ ++msgid "Enable Static Key encryption mode (non-TLS)" ++msgstr "" ++ ++msgid "Enable TLS and assume client role" ++msgstr "" ++ ++msgid "Enable TLS and assume server role" ++msgstr "" ++ ++msgid "Enable internal datagram fragmentation" ++msgstr "" ++ ++msgid "Enable management interface on IP port" ++msgstr "" ++ ++msgid "Enabled" ++msgstr "" ++ ++msgid "Encryption cipher for packets" ++msgstr "" ++ ++msgid "Execute shell cmd after routes are added" ++msgstr "" ++ ++msgid "Execute shell command on remote ip change" ++msgstr "" ++ ++msgid "" ++"Executed in server mode on new client connections, when the client is still " ++"untrusted" ++msgstr "" ++ ++msgid "" ++"Executed in server mode whenever an IPv4 address/route or MAC address is " ++"added to OpenVPN's internal routing table" ++msgstr "" ++ ++msgid "Exit on TLS negotiation failure" ++msgstr "" ++ ++msgid "Get PEM password from controlling tty before we daemonize" ++msgstr "" ++ ++msgid "HMAC authentication for packets" ++msgstr "" ++ ++msgid "Handling of authentication failures" ++msgstr "" ++ ++msgid "" ++"Helper directive to simplify the expression of --ping and --ping-restart in " ++"server mode configurations" ++msgstr "" ++ ++msgid "If hostname resolve fails, retry" ++msgstr "" ++ ++msgid "Instance \"%s\"" ++msgstr "" ++ ++msgid "Invalid" ++msgstr "" ++ ++msgid "Keep local IP address on restart" ++msgstr "" ++ ++msgid "Keep remote IP address on restart" ++msgstr "" ++ ++msgid "Keep tun/tap device open on restart" ++msgstr "" ++ ++msgid "Key transition window" ++msgstr "" ++ ++msgid "Limit repeated log messages" ++msgstr "" ++ ++msgid "Local certificate" ++msgstr "" ++ ++msgid "Local host name or ip address" ++msgstr "" ++ ++msgid "Local private key" ++msgstr "" ++ ++msgid "Major mode" ++msgstr "" ++ ++msgid "Make tun device IPv6 capable" ++msgstr "" ++ ++msgid "Maximum number of queued TCP output packets" ++msgstr "" ++ ++msgid "Number of allocated broadcast buffers" ++msgstr "" ++ ++msgid "Number of lines for log file history" ++msgstr "" ++ ++msgid "Only accept connections from given X509 name" ++msgstr "" ++ ++msgid "Only process ping timeouts if routes exist" ++msgstr "" ++ ++msgid "OpenVPN" ++msgstr "" ++ ++msgid "OpenVPN instances" ++msgstr "" ++ ++msgid "Optimize TUN/TAP/UDP writes" ++msgstr "" ++ ++msgid "Output to syslog and do not daemonize" ++msgstr "" ++ ++msgid "Overview" ++msgstr "" ++ ++msgid "PKCS#12 file containing keys" ++msgstr "" ++ ++msgid "Pass environment variables to script" ++msgstr "" ++ ++msgid "Persist replay-protection state" ++msgstr "" ++ ++msgid "Persist/unpersist ifconfig-pool" ++msgstr "" ++ ++msgid "Ping remote every n seconds over TCP/UDP port" ++msgstr "" ++ ++msgid "Policy level over usage of external programs and scripts" ++msgstr "" ++ ++msgid "Port" ++msgstr "" ++ ++msgid "Protocol" ++msgstr "" ++ ++msgid "Proxy timeout in seconds" ++msgstr "" ++ ++msgid "Push an ifconfig option to remote" ++msgstr "" ++ ++msgid "Push options to peer" ++msgstr "" ++ ++msgid "Query management channel for private key" ++msgstr "" ++ ++msgid "Randomly choose remote server" ++msgstr "" ++ ++msgid "Refuse connection if no custom client config" ++msgstr "" ++ ++msgid "Remap SIGUSR1 signals" ++msgstr "" ++ ++msgid "Remote host name or ip address" ++msgstr "" ++ ++msgid "Remote ping timeout" ++msgstr "" ++ ++msgid "Renegotiate data chan. key after bytes" ++msgstr "" ++ ++msgid "Renegotiate data chan. key after packets" ++msgstr "" ++ ++msgid "Renegotiate data chan. key after seconds" ++msgstr "" ++ ++msgid "Replay protection sliding window size" ++msgstr "" ++ ++msgid "Require explicit designation on certificate" ++msgstr "" ++ ++msgid "Require explicit key usage on certificate" ++msgstr "" ++ ++msgid "Restart after remote ping timeout" ++msgstr "" ++ ++msgid "Retransmit timeout on TLS control channel" ++msgstr "" ++ ++msgid "Retry indefinitely on HTTP proxy errors" ++msgstr "" ++ ++msgid "Retry indefinitely on Socks proxy errors" ++msgstr "" ++ ++msgid "Route subnet to client" ++msgstr "" ++ ++msgid "Run as an inetd or xinetd server" ++msgstr "" ++ ++msgid "Run script cmd on client connection" ++msgstr "" ++ ++msgid "Run script cmd on client disconnection" ++msgstr "" ++ ++msgid "Run up/down scripts for all restarts" ++msgstr "" ++ ++msgid "Send notification to peer on disconnect" ++msgstr "" ++ ++msgid "Set GID to group" ++msgstr "" ++ ++msgid "Set TCP/UDP MTU" ++msgstr "" ++ ++msgid "Set UID to user" ++msgstr "" ++ ++msgid "Set aside a pool of subnets" ++msgstr "" ++ ++msgid "Set extended HTTP proxy options" ++msgstr "" ++ ++msgid "Set output verbosity" ++msgstr "" ++ ++msgid "Set size of real and virtual address hash tables" ++msgstr "" ++ ++msgid "Set the TCP/UDP receive buffer size" ++msgstr "" ++ ++msgid "Set the TCP/UDP send buffer size" ++msgstr "" ++ ++msgid "Set tun/tap TX queue length" ++msgstr "" ++ ++msgid "Set tun/tap adapter parameters" ++msgstr "" ++ ++msgid "Set tun/tap device MTU" ++msgstr "" ++ ++msgid "Set tun/tap device overhead" ++msgstr "" ++ ++msgid "Set upper bound on TCP MSS" ++msgstr "" ++ ++msgid "Shaping for peer bandwidth" ++msgstr "" ++ ++msgid "Shell cmd to execute after tun device open" ++msgstr "" ++ ++msgid "Shell cmd to run after tun device close" ++msgstr "" ++ ++msgid "Shell command to verify X509 name" ++msgstr "" ++ ++msgid "Silence the output of replay warnings" ++msgstr "" ++ ++msgid "Size of cipher key" ++msgstr "" ++ ++msgid "Specify a default gateway for routes" ++msgstr "" ++ ++msgid "Start OpenVPN in a hibernating state" ++msgstr "" ++ ++msgid "Start/Stop" ++msgstr "" ++ ++msgid "Started" ++msgstr "" ++ ++msgid "Status file format version" ++msgstr "" ++ ++msgid "Switch to advanced configuration »" ++msgstr "" ++ ++msgid "TCP/UDP port # for both local and remote" ++msgstr "" ++ ++msgid "TCP/UDP port # for local (default=1194)" ++msgstr "" ++ ++msgid "TCP/UDP port # for remote (default=1194)" ++msgstr "" ++ ++msgid "TLS cipher" ++msgstr "" ++ ++msgid "TOS passthrough (applies to IPv4 only)" ++msgstr "" ++ ++msgid "Temporary directory for client-connect return file" ++msgstr "" ++ ++msgid "Timeframe for key exchange" ++msgstr "" ++ ++msgid "Type of used device" ++msgstr "" ++ ++msgid "Use fast LZO compression" ++msgstr "" ++ ++msgid "Use individual addresses rather than /30 subnets" ++msgstr "" ++ ++msgid "Use protocol" ++msgstr "" ++ ++msgid "Use tun/tap device node" ++msgstr "" ++ ++msgid "Use username as common name" ++msgstr "" ++ ++msgid "Write log to file" ++msgstr "" ++ ++msgid "Write process ID to file" ++msgstr "" ++ ++msgid "Write status to file every n seconds" ++msgstr "" ++ ++msgid "no" ++msgstr "" ++ ++msgid "tun/tap device" ++msgstr "" ++ ++msgid "tun/tap inactivity timeout" ++msgstr "" ++ ++msgid "yes (%i)" ++msgstr "" ++ ++msgid "« Switch to basic configuration" ++msgstr "" +diff --git a/feeds/luci/applications/luci-app-openvpn/po/templates/openvpn.pot b/feeds/luci/applications/luci-app-openvpn/po/templates/openvpn.pot +new file mode 100644 +index 0000000..8fa13d1 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-openvpn/po/templates/openvpn.pot +@@ -0,0 +1,527 @@ ++msgid "" ++msgstr "Content-Type: text/plain; charset=UTF-8" ++ ++msgid "%s" ++msgstr "" ++ ++msgid "'net30', 'p2p', or 'subnet'" ++msgstr "" ++ ++msgid "Accept options pushed from server" ++msgstr "" ++ ++msgid "Add" ++msgstr "" ++ ++msgid "Add route after establishing connection" ++msgstr "" ++ ++msgid "Additional authentication over TLS" ++msgstr "" ++ ++msgid "Allow client-to-client traffic" ++msgstr "" ++ ++msgid "Allow multiple clients with same certificate" ++msgstr "" ++ ++msgid "Allow only one session" ++msgstr "" ++ ++msgid "Allow remote to change its IP or port" ++msgstr "" ++ ++msgid "Allowed maximum of connected clients" ++msgstr "" ++ ++msgid "Allowed maximum of internal" ++msgstr "" ++ ++msgid "Allowed maximum of new connections" ++msgstr "" ++ ++msgid "Append log to file" ++msgstr "" ++ ++msgid "Authenticate using username/password" ++msgstr "" ++ ++msgid "Automatically redirect default route" ++msgstr "" ++ ++msgid "Below is a list of configured OpenVPN instances and their current state" ++msgstr "" ++ ++msgid "Call down cmd/script before TUN/TAP close" ++msgstr "" ++ ++msgid "Certificate authority" ++msgstr "" ++ ++msgid "Change process priority" ++msgstr "" ++ ++msgid "Change to directory before initialization" ++msgstr "" ++ ++msgid "Check peer certificate against a CRL" ++msgstr "" ++ ++msgid "Chroot to directory after initialization" ++msgstr "" ++ ++msgid "Client is disabled" ++msgstr "" ++ ++msgid "Configuration category" ++msgstr "" ++ ++msgid "Configure client mode" ++msgstr "" ++ ++msgid "Configure server bridge" ++msgstr "" ++ ++msgid "Configure server mode" ++msgstr "" ++ ++msgid "Connect through Socks5 proxy" ++msgstr "" ++ ++msgid "Connect to remote host through an HTTP proxy" ++msgstr "" ++ ++msgid "Connection retry interval" ++msgstr "" ++ ++msgid "Daemonize after initialization" ++msgstr "" ++ ++msgid "Delay n seconds after connection" ++msgstr "" ++ ++msgid "Delay tun/tap open and up script execution" ++msgstr "" ++ ++msgid "Diffie Hellman parameters" ++msgstr "" ++ ++msgid "Directory for custom client config files" ++msgstr "" ++ ++msgid "Disable Paging" ++msgstr "" ++ ++msgid "Disable cipher initialisation vector" ++msgstr "" ++ ++msgid "Disable options consistency check" ++msgstr "" ++ ++msgid "Disable replay protection" ++msgstr "" ++ ++msgid "Do not bind to local address and port" ++msgstr "" ++ ++msgid "Don't actually execute ifconfig" ++msgstr "" ++ ++msgid "Don't add routes automatically" ++msgstr "" ++ ++msgid "Don't cache --askpass or --auth-user-pass passwords" ++msgstr "" ++ ++msgid "Don't inherit global push options" ++msgstr "" ++ ++msgid "Don't log timestamps" ++msgstr "" ++ ++msgid "Don't re-read key on restart" ++msgstr "" ++ ++msgid "Don't require client certificate" ++msgstr "" ++ ++msgid "Don't use adaptive lzo compression" ++msgstr "" ++ ++msgid "Don't warn on ifconfig inconsistencies" ++msgstr "" ++ ++msgid "Echo parameters to log" ++msgstr "" ++ ++msgid "Empirically measure MTU" ++msgstr "" ++ ++msgid "Enable OpenSSL hardware crypto engines" ++msgstr "" ++ ++msgid "Enable Path MTU discovery" ++msgstr "" ++ ++msgid "Enable Static Key encryption mode (non-TLS)" ++msgstr "" ++ ++msgid "Enable TLS and assume client role" ++msgstr "" ++ ++msgid "Enable TLS and assume server role" ++msgstr "" ++ ++msgid "Enable internal datagram fragmentation" ++msgstr "" ++ ++msgid "Enable management interface on IP port" ++msgstr "" ++ ++msgid "Enabled" ++msgstr "" ++ ++msgid "Encryption cipher for packets" ++msgstr "" ++ ++msgid "Execute shell cmd after routes are added" ++msgstr "" ++ ++msgid "Execute shell command on remote ip change" ++msgstr "" ++ ++msgid "" ++"Executed in server mode on new client connections, when the client is still " ++"untrusted" ++msgstr "" ++ ++msgid "" ++"Executed in server mode whenever an IPv4 address/route or MAC address is " ++"added to OpenVPN's internal routing table" ++msgstr "" ++ ++msgid "Exit on TLS negotiation failure" ++msgstr "" ++ ++msgid "Get PEM password from controlling tty before we daemonize" ++msgstr "" ++ ++msgid "HMAC authentication for packets" ++msgstr "" ++ ++msgid "Handling of authentication failures" ++msgstr "" ++ ++msgid "" ++"Helper directive to simplify the expression of --ping and --ping-restart in " ++"server mode configurations" ++msgstr "" ++ ++msgid "If hostname resolve fails, retry" ++msgstr "" ++ ++msgid "Instance \"%s\"" ++msgstr "" ++ ++msgid "Invalid" ++msgstr "" ++ ++msgid "Keep local IP address on restart" ++msgstr "" ++ ++msgid "Keep remote IP address on restart" ++msgstr "" ++ ++msgid "Keep tun/tap device open on restart" ++msgstr "" ++ ++msgid "Key transition window" ++msgstr "" ++ ++msgid "Limit repeated log messages" ++msgstr "" ++ ++msgid "Local certificate" ++msgstr "" ++ ++msgid "Local host name or ip address" ++msgstr "" ++ ++msgid "Local private key" ++msgstr "" ++ ++msgid "Major mode" ++msgstr "" ++ ++msgid "Make tun device IPv6 capable" ++msgstr "" ++ ++msgid "Maximum number of queued TCP output packets" ++msgstr "" ++ ++msgid "Number of allocated broadcast buffers" ++msgstr "" ++ ++msgid "Number of lines for log file history" ++msgstr "" ++ ++msgid "Only accept connections from given X509 name" ++msgstr "" ++ ++msgid "Only process ping timeouts if routes exist" ++msgstr "" ++ ++msgid "OpenVPN" ++msgstr "" ++ ++msgid "OpenVPN instances" ++msgstr "" ++ ++msgid "Optimize TUN/TAP/UDP writes" ++msgstr "" ++ ++msgid "Output to syslog and do not daemonize" ++msgstr "" ++ ++msgid "Overview" ++msgstr "" ++ ++msgid "PKCS#12 file containing keys" ++msgstr "" ++ ++msgid "Pass environment variables to script" ++msgstr "" ++ ++msgid "Persist replay-protection state" ++msgstr "" ++ ++msgid "Persist/unpersist ifconfig-pool" ++msgstr "" ++ ++msgid "Ping remote every n seconds over TCP/UDP port" ++msgstr "" ++ ++msgid "Policy level over usage of external programs and scripts" ++msgstr "" ++ ++msgid "Port" ++msgstr "" ++ ++msgid "Protocol" ++msgstr "" ++ ++msgid "Proxy timeout in seconds" ++msgstr "" ++ ++msgid "Push an ifconfig option to remote" ++msgstr "" ++ ++msgid "Push options to peer" ++msgstr "" ++ ++msgid "Query management channel for private key" ++msgstr "" ++ ++msgid "Randomly choose remote server" ++msgstr "" ++ ++msgid "Refuse connection if no custom client config" ++msgstr "" ++ ++msgid "Remap SIGUSR1 signals" ++msgstr "" ++ ++msgid "Remote host name or ip address" ++msgstr "" ++ ++msgid "Remote ping timeout" ++msgstr "" ++ ++msgid "Renegotiate data chan. key after bytes" ++msgstr "" ++ ++msgid "Renegotiate data chan. key after packets" ++msgstr "" ++ ++msgid "Renegotiate data chan. key after seconds" ++msgstr "" ++ ++msgid "Replay protection sliding window size" ++msgstr "" ++ ++msgid "Require explicit designation on certificate" ++msgstr "" ++ ++msgid "Require explicit key usage on certificate" ++msgstr "" ++ ++msgid "Restart after remote ping timeout" ++msgstr "" ++ ++msgid "Retransmit timeout on TLS control channel" ++msgstr "" ++ ++msgid "Retry indefinitely on HTTP proxy errors" ++msgstr "" ++ ++msgid "Retry indefinitely on Socks proxy errors" ++msgstr "" ++ ++msgid "Route subnet to client" ++msgstr "" ++ ++msgid "Run as an inetd or xinetd server" ++msgstr "" ++ ++msgid "Run script cmd on client connection" ++msgstr "" ++ ++msgid "Run script cmd on client disconnection" ++msgstr "" ++ ++msgid "Run up/down scripts for all restarts" ++msgstr "" ++ ++msgid "Send notification to peer on disconnect" ++msgstr "" ++ ++msgid "Set GID to group" ++msgstr "" ++ ++msgid "Set TCP/UDP MTU" ++msgstr "" ++ ++msgid "Set UID to user" ++msgstr "" ++ ++msgid "Set aside a pool of subnets" ++msgstr "" ++ ++msgid "Set extended HTTP proxy options" ++msgstr "" ++ ++msgid "Set output verbosity" ++msgstr "" ++ ++msgid "Set size of real and virtual address hash tables" ++msgstr "" ++ ++msgid "Set the TCP/UDP receive buffer size" ++msgstr "" ++ ++msgid "Set the TCP/UDP send buffer size" ++msgstr "" ++ ++msgid "Set tun/tap TX queue length" ++msgstr "" ++ ++msgid "Set tun/tap adapter parameters" ++msgstr "" ++ ++msgid "Set tun/tap device MTU" ++msgstr "" ++ ++msgid "Set tun/tap device overhead" ++msgstr "" ++ ++msgid "Set upper bound on TCP MSS" ++msgstr "" ++ ++msgid "Shaping for peer bandwidth" ++msgstr "" ++ ++msgid "Shell cmd to execute after tun device open" ++msgstr "" ++ ++msgid "Shell cmd to run after tun device close" ++msgstr "" ++ ++msgid "Shell command to verify X509 name" ++msgstr "" ++ ++msgid "Silence the output of replay warnings" ++msgstr "" ++ ++msgid "Size of cipher key" ++msgstr "" ++ ++msgid "Specify a default gateway for routes" ++msgstr "" ++ ++msgid "Start OpenVPN in a hibernating state" ++msgstr "" ++ ++msgid "Start/Stop" ++msgstr "" ++ ++msgid "Started" ++msgstr "" ++ ++msgid "Status file format version" ++msgstr "" ++ ++msgid "Switch to advanced configuration »" ++msgstr "" ++ ++msgid "TCP/UDP port # for both local and remote" ++msgstr "" ++ ++msgid "TCP/UDP port # for local (default=1194)" ++msgstr "" ++ ++msgid "TCP/UDP port # for remote (default=1194)" ++msgstr "" ++ ++msgid "TLS cipher" ++msgstr "" ++ ++msgid "TOS passthrough (applies to IPv4 only)" ++msgstr "" ++ ++msgid "Temporary directory for client-connect return file" ++msgstr "" ++ ++msgid "Timeframe for key exchange" ++msgstr "" ++ ++msgid "Type of used device" ++msgstr "" ++ ++msgid "Use fast LZO compression" ++msgstr "" ++ ++msgid "Use individual addresses rather than /30 subnets" ++msgstr "" ++ ++msgid "Use protocol" ++msgstr "" ++ ++msgid "Use tun/tap device node" ++msgstr "" ++ ++msgid "Use username as common name" ++msgstr "" ++ ++msgid "Write log to file" ++msgstr "" ++ ++msgid "Write process ID to file" ++msgstr "" ++ ++msgid "Write status to file every n seconds" ++msgstr "" ++ ++msgid "no" ++msgstr "" ++ ++msgid "tun/tap device" ++msgstr "" ++ ++msgid "tun/tap inactivity timeout" ++msgstr "" ++ ++msgid "yes (%i)" ++msgstr "" ++ ++msgid "« Switch to basic configuration" ++msgstr "" +diff --git a/feeds/luci/applications/luci-app-openvpn/po/tr/openvpn.po b/feeds/luci/applications/luci-app-openvpn/po/tr/openvpn.po +new file mode 100644 +index 0000000..dcb0ec4 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-openvpn/po/tr/openvpn.po +@@ -0,0 +1,534 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Last-Translator: Automatically generated\n" ++"Language-Team: none\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=1; plural=0;\n" ++ ++msgid "%s" ++msgstr "" ++ ++msgid "'net30', 'p2p', or 'subnet'" ++msgstr "" ++ ++msgid "Accept options pushed from server" ++msgstr "" ++ ++msgid "Add" ++msgstr "" ++ ++msgid "Add route after establishing connection" ++msgstr "" ++ ++msgid "Additional authentication over TLS" ++msgstr "" ++ ++msgid "Allow client-to-client traffic" ++msgstr "" ++ ++msgid "Allow multiple clients with same certificate" ++msgstr "" ++ ++msgid "Allow only one session" ++msgstr "" ++ ++msgid "Allow remote to change its IP or port" ++msgstr "" ++ ++msgid "Allowed maximum of connected clients" ++msgstr "" ++ ++msgid "Allowed maximum of internal" ++msgstr "" ++ ++msgid "Allowed maximum of new connections" ++msgstr "" ++ ++msgid "Append log to file" ++msgstr "" ++ ++msgid "Authenticate using username/password" ++msgstr "" ++ ++msgid "Automatically redirect default route" ++msgstr "" ++ ++msgid "Below is a list of configured OpenVPN instances and their current state" ++msgstr "" ++ ++msgid "Call down cmd/script before TUN/TAP close" ++msgstr "" ++ ++msgid "Certificate authority" ++msgstr "" ++ ++msgid "Change process priority" ++msgstr "" ++ ++msgid "Change to directory before initialization" ++msgstr "" ++ ++msgid "Check peer certificate against a CRL" ++msgstr "" ++ ++msgid "Chroot to directory after initialization" ++msgstr "" ++ ++msgid "Client is disabled" ++msgstr "" ++ ++msgid "Configuration category" ++msgstr "" ++ ++msgid "Configure client mode" ++msgstr "" ++ ++msgid "Configure server bridge" ++msgstr "" ++ ++msgid "Configure server mode" ++msgstr "" ++ ++msgid "Connect through Socks5 proxy" ++msgstr "" ++ ++msgid "Connect to remote host through an HTTP proxy" ++msgstr "" ++ ++msgid "Connection retry interval" ++msgstr "" ++ ++msgid "Daemonize after initialization" ++msgstr "" ++ ++msgid "Delay n seconds after connection" ++msgstr "" ++ ++msgid "Delay tun/tap open and up script execution" ++msgstr "" ++ ++msgid "Diffie Hellman parameters" ++msgstr "" ++ ++msgid "Directory for custom client config files" ++msgstr "" ++ ++msgid "Disable Paging" ++msgstr "" ++ ++msgid "Disable cipher initialisation vector" ++msgstr "" ++ ++msgid "Disable options consistency check" ++msgstr "" ++ ++msgid "Disable replay protection" ++msgstr "" ++ ++msgid "Do not bind to local address and port" ++msgstr "" ++ ++msgid "Don't actually execute ifconfig" ++msgstr "" ++ ++msgid "Don't add routes automatically" ++msgstr "" ++ ++msgid "Don't cache --askpass or --auth-user-pass passwords" ++msgstr "" ++ ++msgid "Don't inherit global push options" ++msgstr "" ++ ++msgid "Don't log timestamps" ++msgstr "" ++ ++msgid "Don't re-read key on restart" ++msgstr "" ++ ++msgid "Don't require client certificate" ++msgstr "" ++ ++msgid "Don't use adaptive lzo compression" ++msgstr "" ++ ++msgid "Don't warn on ifconfig inconsistencies" ++msgstr "" ++ ++msgid "Echo parameters to log" ++msgstr "" ++ ++msgid "Empirically measure MTU" ++msgstr "" ++ ++msgid "Enable OpenSSL hardware crypto engines" ++msgstr "" ++ ++msgid "Enable Path MTU discovery" ++msgstr "" ++ ++msgid "Enable Static Key encryption mode (non-TLS)" ++msgstr "" ++ ++msgid "Enable TLS and assume client role" ++msgstr "" ++ ++msgid "Enable TLS and assume server role" ++msgstr "" ++ ++msgid "Enable internal datagram fragmentation" ++msgstr "" ++ ++msgid "Enable management interface on IP port" ++msgstr "" ++ ++msgid "Enabled" ++msgstr "" ++ ++msgid "Encryption cipher for packets" ++msgstr "" ++ ++msgid "Execute shell cmd after routes are added" ++msgstr "" ++ ++msgid "Execute shell command on remote ip change" ++msgstr "" ++ ++msgid "" ++"Executed in server mode on new client connections, when the client is still " ++"untrusted" ++msgstr "" ++ ++msgid "" ++"Executed in server mode whenever an IPv4 address/route or MAC address is " ++"added to OpenVPN's internal routing table" ++msgstr "" ++ ++msgid "Exit on TLS negotiation failure" ++msgstr "" ++ ++msgid "Get PEM password from controlling tty before we daemonize" ++msgstr "" ++ ++msgid "HMAC authentication for packets" ++msgstr "" ++ ++msgid "Handling of authentication failures" ++msgstr "" ++ ++msgid "" ++"Helper directive to simplify the expression of --ping and --ping-restart in " ++"server mode configurations" ++msgstr "" ++ ++msgid "If hostname resolve fails, retry" ++msgstr "" ++ ++msgid "Instance \"%s\"" ++msgstr "" ++ ++msgid "Invalid" ++msgstr "" ++ ++msgid "Keep local IP address on restart" ++msgstr "" ++ ++msgid "Keep remote IP address on restart" ++msgstr "" ++ ++msgid "Keep tun/tap device open on restart" ++msgstr "" ++ ++msgid "Key transition window" ++msgstr "" ++ ++msgid "Limit repeated log messages" ++msgstr "" ++ ++msgid "Local certificate" ++msgstr "" ++ ++msgid "Local host name or ip address" ++msgstr "" ++ ++msgid "Local private key" ++msgstr "" ++ ++msgid "Major mode" ++msgstr "" ++ ++msgid "Make tun device IPv6 capable" ++msgstr "" ++ ++msgid "Maximum number of queued TCP output packets" ++msgstr "" ++ ++msgid "Number of allocated broadcast buffers" ++msgstr "" ++ ++msgid "Number of lines for log file history" ++msgstr "" ++ ++msgid "Only accept connections from given X509 name" ++msgstr "" ++ ++msgid "Only process ping timeouts if routes exist" ++msgstr "" ++ ++msgid "OpenVPN" ++msgstr "" ++ ++msgid "OpenVPN instances" ++msgstr "" ++ ++msgid "Optimize TUN/TAP/UDP writes" ++msgstr "" ++ ++msgid "Output to syslog and do not daemonize" ++msgstr "" ++ ++msgid "Overview" ++msgstr "" ++ ++msgid "PKCS#12 file containing keys" ++msgstr "" ++ ++msgid "Pass environment variables to script" ++msgstr "" ++ ++msgid "Persist replay-protection state" ++msgstr "" ++ ++msgid "Persist/unpersist ifconfig-pool" ++msgstr "" ++ ++msgid "Ping remote every n seconds over TCP/UDP port" ++msgstr "" ++ ++msgid "Policy level over usage of external programs and scripts" ++msgstr "" ++ ++msgid "Port" ++msgstr "" ++ ++msgid "Protocol" ++msgstr "" ++ ++msgid "Proxy timeout in seconds" ++msgstr "" ++ ++msgid "Push an ifconfig option to remote" ++msgstr "" ++ ++msgid "Push options to peer" ++msgstr "" ++ ++msgid "Query management channel for private key" ++msgstr "" ++ ++msgid "Randomly choose remote server" ++msgstr "" ++ ++msgid "Refuse connection if no custom client config" ++msgstr "" ++ ++msgid "Remap SIGUSR1 signals" ++msgstr "" ++ ++msgid "Remote host name or ip address" ++msgstr "" ++ ++msgid "Remote ping timeout" ++msgstr "" ++ ++msgid "Renegotiate data chan. key after bytes" ++msgstr "" ++ ++msgid "Renegotiate data chan. key after packets" ++msgstr "" ++ ++msgid "Renegotiate data chan. key after seconds" ++msgstr "" ++ ++msgid "Replay protection sliding window size" ++msgstr "" ++ ++msgid "Require explicit designation on certificate" ++msgstr "" ++ ++msgid "Require explicit key usage on certificate" ++msgstr "" ++ ++msgid "Restart after remote ping timeout" ++msgstr "" ++ ++msgid "Retransmit timeout on TLS control channel" ++msgstr "" ++ ++msgid "Retry indefinitely on HTTP proxy errors" ++msgstr "" ++ ++msgid "Retry indefinitely on Socks proxy errors" ++msgstr "" ++ ++msgid "Route subnet to client" ++msgstr "" ++ ++msgid "Run as an inetd or xinetd server" ++msgstr "" ++ ++msgid "Run script cmd on client connection" ++msgstr "" ++ ++msgid "Run script cmd on client disconnection" ++msgstr "" ++ ++msgid "Run up/down scripts for all restarts" ++msgstr "" ++ ++msgid "Send notification to peer on disconnect" ++msgstr "" ++ ++msgid "Set GID to group" ++msgstr "" ++ ++msgid "Set TCP/UDP MTU" ++msgstr "" ++ ++msgid "Set UID to user" ++msgstr "" ++ ++msgid "Set aside a pool of subnets" ++msgstr "" ++ ++msgid "Set extended HTTP proxy options" ++msgstr "" ++ ++msgid "Set output verbosity" ++msgstr "" ++ ++msgid "Set size of real and virtual address hash tables" ++msgstr "" ++ ++msgid "Set the TCP/UDP receive buffer size" ++msgstr "" ++ ++msgid "Set the TCP/UDP send buffer size" ++msgstr "" ++ ++msgid "Set tun/tap TX queue length" ++msgstr "" ++ ++msgid "Set tun/tap adapter parameters" ++msgstr "" ++ ++msgid "Set tun/tap device MTU" ++msgstr "" ++ ++msgid "Set tun/tap device overhead" ++msgstr "" ++ ++msgid "Set upper bound on TCP MSS" ++msgstr "" ++ ++msgid "Shaping for peer bandwidth" ++msgstr "" ++ ++msgid "Shell cmd to execute after tun device open" ++msgstr "" ++ ++msgid "Shell cmd to run after tun device close" ++msgstr "" ++ ++msgid "Shell command to verify X509 name" ++msgstr "" ++ ++msgid "Silence the output of replay warnings" ++msgstr "" ++ ++msgid "Size of cipher key" ++msgstr "" ++ ++msgid "Specify a default gateway for routes" ++msgstr "" ++ ++msgid "Start OpenVPN in a hibernating state" ++msgstr "" ++ ++msgid "Start/Stop" ++msgstr "" ++ ++msgid "Started" ++msgstr "" ++ ++msgid "Status file format version" ++msgstr "" ++ ++msgid "Switch to advanced configuration »" ++msgstr "" ++ ++msgid "TCP/UDP port # for both local and remote" ++msgstr "" ++ ++msgid "TCP/UDP port # for local (default=1194)" ++msgstr "" ++ ++msgid "TCP/UDP port # for remote (default=1194)" ++msgstr "" ++ ++msgid "TLS cipher" ++msgstr "" ++ ++msgid "TOS passthrough (applies to IPv4 only)" ++msgstr "" ++ ++msgid "Temporary directory for client-connect return file" ++msgstr "" ++ ++msgid "Timeframe for key exchange" ++msgstr "" ++ ++msgid "Type of used device" ++msgstr "" ++ ++msgid "Use fast LZO compression" ++msgstr "" ++ ++msgid "Use individual addresses rather than /30 subnets" ++msgstr "" ++ ++msgid "Use protocol" ++msgstr "" ++ ++msgid "Use tun/tap device node" ++msgstr "" ++ ++msgid "Use username as common name" ++msgstr "" ++ ++msgid "Write log to file" ++msgstr "" ++ ++msgid "Write process ID to file" ++msgstr "" ++ ++msgid "Write status to file every n seconds" ++msgstr "" ++ ++msgid "no" ++msgstr "" ++ ++msgid "tun/tap device" ++msgstr "" ++ ++msgid "tun/tap inactivity timeout" ++msgstr "" ++ ++msgid "yes (%i)" ++msgstr "" ++ ++msgid "« Switch to basic configuration" ++msgstr "" +diff --git a/feeds/luci/applications/luci-app-openvpn/po/uk/openvpn.po b/feeds/luci/applications/luci-app-openvpn/po/uk/openvpn.po +new file mode 100644 +index 0000000..e603237 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-openvpn/po/uk/openvpn.po +@@ -0,0 +1,538 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"PO-Revision-Date: 2011-11-30 09:14+0200\n" ++"Last-Translator: Pavel \n" ++"Language-Team: none\n" ++"Language: uk\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%" ++"10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" ++"X-Generator: Pootle 2.0.4\n" ++ ++msgid "%s" ++msgstr "" ++ ++msgid "'net30', 'p2p', or 'subnet'" ++msgstr "" ++ ++msgid "Accept options pushed from server" ++msgstr "" ++ ++msgid "Add" ++msgstr "" ++ ++msgid "Add route after establishing connection" ++msgstr "" ++ ++msgid "Additional authentication over TLS" ++msgstr "" ++ ++msgid "Allow client-to-client traffic" ++msgstr "Дозволити обмін трафіком між клієнтами" ++ ++msgid "Allow multiple clients with same certificate" ++msgstr "Дозволити декілька клієнтів з однаковим Ñертифікатом" ++ ++msgid "Allow only one session" ++msgstr "Дозволити лише одну ÑеÑÑ–ÑŽ" ++ ++msgid "Allow remote to change its IP or port" ++msgstr "" ++ ++msgid "Allowed maximum of connected clients" ++msgstr "" ++ ++msgid "Allowed maximum of internal" ++msgstr "" ++ ++msgid "Allowed maximum of new connections" ++msgstr "" ++ ++msgid "Append log to file" ++msgstr "" ++ ++msgid "Authenticate using username/password" ++msgstr "" ++ ++msgid "Automatically redirect default route" ++msgstr "" ++ ++msgid "Below is a list of configured OpenVPN instances and their current state" ++msgstr "" ++ ++msgid "Call down cmd/script before TUN/TAP close" ++msgstr "" ++ ++msgid "Certificate authority" ++msgstr "" ++ ++msgid "Change process priority" ++msgstr "" ++ ++msgid "Change to directory before initialization" ++msgstr "" ++ ++msgid "Check peer certificate against a CRL" ++msgstr "" ++ ++msgid "Chroot to directory after initialization" ++msgstr "" ++ ++msgid "Client is disabled" ++msgstr "" ++ ++msgid "Configuration category" ++msgstr "" ++ ++msgid "Configure client mode" ++msgstr "" ++ ++msgid "Configure server bridge" ++msgstr "" ++ ++msgid "Configure server mode" ++msgstr "" ++ ++msgid "Connect through Socks5 proxy" ++msgstr "" ++ ++msgid "Connect to remote host through an HTTP proxy" ++msgstr "" ++ ++msgid "Connection retry interval" ++msgstr "" ++ ++msgid "Daemonize after initialization" ++msgstr "" ++ ++msgid "Delay n seconds after connection" ++msgstr "" ++ ++msgid "Delay tun/tap open and up script execution" ++msgstr "" ++ ++msgid "Diffie Hellman parameters" ++msgstr "" ++ ++msgid "Directory for custom client config files" ++msgstr "" ++ ++msgid "Disable Paging" ++msgstr "" ++ ++msgid "Disable cipher initialisation vector" ++msgstr "" ++ ++msgid "Disable options consistency check" ++msgstr "" ++ ++msgid "Disable replay protection" ++msgstr "" ++ ++msgid "Do not bind to local address and port" ++msgstr "" ++ ++msgid "Don't actually execute ifconfig" ++msgstr "" ++ ++msgid "Don't add routes automatically" ++msgstr "" ++ ++msgid "Don't cache --askpass or --auth-user-pass passwords" ++msgstr "" ++ ++msgid "Don't inherit global push options" ++msgstr "" ++ ++msgid "Don't log timestamps" ++msgstr "" ++ ++msgid "Don't re-read key on restart" ++msgstr "" ++ ++msgid "Don't require client certificate" ++msgstr "" ++ ++msgid "Don't use adaptive lzo compression" ++msgstr "" ++ ++msgid "Don't warn on ifconfig inconsistencies" ++msgstr "" ++ ++msgid "Echo parameters to log" ++msgstr "" ++ ++msgid "Empirically measure MTU" ++msgstr "" ++ ++msgid "Enable OpenSSL hardware crypto engines" ++msgstr "" ++ ++msgid "Enable Path MTU discovery" ++msgstr "" ++ ++msgid "Enable Static Key encryption mode (non-TLS)" ++msgstr "" ++ ++msgid "Enable TLS and assume client role" ++msgstr "" ++ ++msgid "Enable TLS and assume server role" ++msgstr "" ++ ++msgid "Enable internal datagram fragmentation" ++msgstr "" ++ ++msgid "Enable management interface on IP port" ++msgstr "" ++ ++msgid "Enabled" ++msgstr "" ++ ++msgid "Encryption cipher for packets" ++msgstr "" ++ ++msgid "Execute shell cmd after routes are added" ++msgstr "" ++ ++msgid "Execute shell command on remote ip change" ++msgstr "" ++ ++msgid "" ++"Executed in server mode on new client connections, when the client is still " ++"untrusted" ++msgstr "" ++ ++msgid "" ++"Executed in server mode whenever an IPv4 address/route or MAC address is " ++"added to OpenVPN's internal routing table" ++msgstr "" ++ ++msgid "Exit on TLS negotiation failure" ++msgstr "" ++ ++msgid "Get PEM password from controlling tty before we daemonize" ++msgstr "" ++ ++msgid "HMAC authentication for packets" ++msgstr "" ++ ++msgid "Handling of authentication failures" ++msgstr "" ++ ++msgid "" ++"Helper directive to simplify the expression of --ping and --ping-restart in " ++"server mode configurations" ++msgstr "" ++ ++msgid "If hostname resolve fails, retry" ++msgstr "" ++ ++msgid "Instance \"%s\"" ++msgstr "" ++ ++msgid "Invalid" ++msgstr "" ++ ++msgid "Keep local IP address on restart" ++msgstr "" ++ ++msgid "Keep remote IP address on restart" ++msgstr "" ++ ++msgid "Keep tun/tap device open on restart" ++msgstr "" ++ ++msgid "Key transition window" ++msgstr "" ++ ++msgid "Limit repeated log messages" ++msgstr "" ++ ++msgid "Local certificate" ++msgstr "" ++ ++msgid "Local host name or ip address" ++msgstr "" ++ ++msgid "Local private key" ++msgstr "" ++ ++msgid "Major mode" ++msgstr "" ++ ++msgid "Make tun device IPv6 capable" ++msgstr "" ++ ++msgid "Maximum number of queued TCP output packets" ++msgstr "" ++ ++msgid "Number of allocated broadcast buffers" ++msgstr "" ++ ++msgid "Number of lines for log file history" ++msgstr "" ++ ++msgid "Only accept connections from given X509 name" ++msgstr "" ++ ++msgid "Only process ping timeouts if routes exist" ++msgstr "" ++ ++msgid "OpenVPN" ++msgstr "" ++ ++msgid "OpenVPN instances" ++msgstr "" ++ ++msgid "Optimize TUN/TAP/UDP writes" ++msgstr "" ++ ++msgid "Output to syslog and do not daemonize" ++msgstr "" ++ ++msgid "Overview" ++msgstr "" ++ ++msgid "PKCS#12 file containing keys" ++msgstr "" ++ ++msgid "Pass environment variables to script" ++msgstr "" ++ ++msgid "Persist replay-protection state" ++msgstr "" ++ ++msgid "Persist/unpersist ifconfig-pool" ++msgstr "" ++ ++msgid "Ping remote every n seconds over TCP/UDP port" ++msgstr "" ++ ++msgid "Policy level over usage of external programs and scripts" ++msgstr "" ++ ++msgid "Port" ++msgstr "" ++ ++msgid "Protocol" ++msgstr "" ++ ++msgid "Proxy timeout in seconds" ++msgstr "" ++ ++msgid "Push an ifconfig option to remote" ++msgstr "" ++ ++msgid "Push options to peer" ++msgstr "" ++ ++msgid "Query management channel for private key" ++msgstr "" ++ ++msgid "Randomly choose remote server" ++msgstr "" ++ ++msgid "Refuse connection if no custom client config" ++msgstr "" ++ ++msgid "Remap SIGUSR1 signals" ++msgstr "" ++ ++msgid "Remote host name or ip address" ++msgstr "" ++ ++msgid "Remote ping timeout" ++msgstr "" ++ ++msgid "Renegotiate data chan. key after bytes" ++msgstr "" ++ ++msgid "Renegotiate data chan. key after packets" ++msgstr "" ++ ++msgid "Renegotiate data chan. key after seconds" ++msgstr "" ++ ++msgid "Replay protection sliding window size" ++msgstr "" ++ ++msgid "Require explicit designation on certificate" ++msgstr "" ++ ++msgid "Require explicit key usage on certificate" ++msgstr "" ++ ++msgid "Restart after remote ping timeout" ++msgstr "" ++ ++msgid "Retransmit timeout on TLS control channel" ++msgstr "" ++ ++msgid "Retry indefinitely on HTTP proxy errors" ++msgstr "" ++ ++msgid "Retry indefinitely on Socks proxy errors" ++msgstr "" ++ ++msgid "Route subnet to client" ++msgstr "" ++ ++msgid "Run as an inetd or xinetd server" ++msgstr "" ++ ++msgid "Run script cmd on client connection" ++msgstr "" ++ ++msgid "Run script cmd on client disconnection" ++msgstr "" ++ ++msgid "Run up/down scripts for all restarts" ++msgstr "" ++ ++msgid "Send notification to peer on disconnect" ++msgstr "" ++ ++msgid "Set GID to group" ++msgstr "" ++ ++msgid "Set TCP/UDP MTU" ++msgstr "" ++ ++msgid "Set UID to user" ++msgstr "" ++ ++msgid "Set aside a pool of subnets" ++msgstr "" ++ ++msgid "Set extended HTTP proxy options" ++msgstr "" ++ ++msgid "Set output verbosity" ++msgstr "" ++ ++msgid "Set size of real and virtual address hash tables" ++msgstr "" ++ ++msgid "Set the TCP/UDP receive buffer size" ++msgstr "" ++ ++msgid "Set the TCP/UDP send buffer size" ++msgstr "" ++ ++msgid "Set tun/tap TX queue length" ++msgstr "" ++ ++msgid "Set tun/tap adapter parameters" ++msgstr "" ++ ++msgid "Set tun/tap device MTU" ++msgstr "" ++ ++msgid "Set tun/tap device overhead" ++msgstr "" ++ ++msgid "Set upper bound on TCP MSS" ++msgstr "" ++ ++msgid "Shaping for peer bandwidth" ++msgstr "" ++ ++msgid "Shell cmd to execute after tun device open" ++msgstr "" ++ ++msgid "Shell cmd to run after tun device close" ++msgstr "" ++ ++msgid "Shell command to verify X509 name" ++msgstr "" ++ ++msgid "Silence the output of replay warnings" ++msgstr "" ++ ++msgid "Size of cipher key" ++msgstr "" ++ ++msgid "Specify a default gateway for routes" ++msgstr "" ++ ++msgid "Start OpenVPN in a hibernating state" ++msgstr "" ++ ++msgid "Start/Stop" ++msgstr "" ++ ++msgid "Started" ++msgstr "" ++ ++msgid "Status file format version" ++msgstr "" ++ ++msgid "Switch to advanced configuration »" ++msgstr "" ++ ++msgid "TCP/UDP port # for both local and remote" ++msgstr "" ++ ++msgid "TCP/UDP port # for local (default=1194)" ++msgstr "" ++ ++msgid "TCP/UDP port # for remote (default=1194)" ++msgstr "" ++ ++msgid "TLS cipher" ++msgstr "" ++ ++msgid "TOS passthrough (applies to IPv4 only)" ++msgstr "" ++ ++msgid "Temporary directory for client-connect return file" ++msgstr "" ++ ++msgid "Timeframe for key exchange" ++msgstr "" ++ ++msgid "Type of used device" ++msgstr "" ++ ++msgid "Use fast LZO compression" ++msgstr "" ++ ++msgid "Use individual addresses rather than /30 subnets" ++msgstr "" ++ ++msgid "Use protocol" ++msgstr "" ++ ++msgid "Use tun/tap device node" ++msgstr "" ++ ++msgid "Use username as common name" ++msgstr "" ++ ++msgid "Write log to file" ++msgstr "" ++ ++msgid "Write process ID to file" ++msgstr "" ++ ++msgid "Write status to file every n seconds" ++msgstr "" ++ ++msgid "no" ++msgstr "" ++ ++msgid "tun/tap device" ++msgstr "" ++ ++msgid "tun/tap inactivity timeout" ++msgstr "" ++ ++msgid "yes (%i)" ++msgstr "" ++ ++msgid "« Switch to basic configuration" ++msgstr "" +diff --git a/feeds/luci/applications/luci-app-openvpn/po/vi/openvpn.po b/feeds/luci/applications/luci-app-openvpn/po/vi/openvpn.po +new file mode 100644 +index 0000000..2c19e69 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-openvpn/po/vi/openvpn.po +@@ -0,0 +1,540 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Report-Msgid-Bugs-To: \n" ++"POT-Creation-Date: 2009-08-16 06:58+0200\n" ++"PO-Revision-Date: 2009-08-16 12:27+0200\n" ++"Last-Translator: Hong Phuc Dang \n" ++"Language-Team: LANGUAGE \n" ++"Language: \n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"X-Generator: Pootle 1.1.0\n" ++ ++msgid "%s" ++msgstr "" ++ ++msgid "'net30', 'p2p', or 'subnet'" ++msgstr "'net30', 'p2p', or 'subnet'" ++ ++msgid "Accept options pushed from server" ++msgstr "Chấp nhận tùy chá»n được đảy từ server" ++ ++msgid "Add" ++msgstr "" ++ ++msgid "Add route after establishing connection" ++msgstr "Thêm tuyến sau khi kết nối thành lập" ++ ++msgid "Additional authentication over TLS" ++msgstr "Xác thá»±c bổ xung trên TLS" ++ ++msgid "Allow client-to-client traffic" ++msgstr "Cho phép lÆ°u thông đối tượng - đến - đối tượng" ++ ++msgid "Allow multiple clients with same certificate" ++msgstr "Cho phép nhiá»u đối tượng vá»›i cùng má»™t chứng chỉ" ++ ++msgid "Allow only one session" ++msgstr "Chỉ cho phép má»™t session" ++ ++msgid "Allow remote to change its IP or port" ++msgstr "Cho phép đối tượng ngoài vùng thay đổi IP hoặc cổng" ++ ++msgid "Allowed maximum of connected clients" ++msgstr "Cho phép tối Ä‘a đối tượng kết nối má»›i là" ++ ++msgid "Allowed maximum of internal" ++msgstr "Internal tối Ä‘a được cho phép" ++ ++msgid "Allowed maximum of new connections" ++msgstr "Cho phép tối Ä‘a kết nối má»›i là" ++ ++msgid "Append log to file" ++msgstr "Nối thêm log lên tập tin" ++ ++msgid "Authenticate using username/password" ++msgstr "Xác thá»±c username/password Ä‘ang sá»­ dụng" ++ ++msgid "Automatically redirect default route" ++msgstr "Tá»± Ä‘á»™ng chuyển hÆ°á»›ng tuyến mặc định" ++ ++msgid "Below is a list of configured OpenVPN instances and their current state" ++msgstr "" ++"DÆ°á»›i đây là má»™t list của OpenVPN instances đã được cấu hình và tình trạng " ++"hiện tại" ++ ++msgid "Call down cmd/script before TUN/TAP close" ++msgstr "Call down cmd/script trÆ°á»›c khi TUN/TAP đóng" ++ ++msgid "Certificate authority" ++msgstr "Giấy chứng nhận ủy quyá»n" ++ ++msgid "Change process priority" ++msgstr "Thay đổi quy trình Æ°u tiên" ++ ++msgid "Change to directory before initialization" ++msgstr "Chuyển qua thÆ° mục trÆ°á»›c khi khởi tạo" ++ ++msgid "Check peer certificate against a CRL" ++msgstr "Kiểm tra chứng chỉ đối tác vá»›i má»™t CRL" ++ ++msgid "Chroot to directory after initialization" ++msgstr "Chroot vào thÆ° mục sau khi khởi tạo" ++ ++msgid "Client is disabled" ++msgstr "Äối tượng bị vô hiệu hóa" ++ ++msgid "Configuration category" ++msgstr "" ++ ++msgid "Configure client mode" ++msgstr "Äịnh cấu hình chế Ä‘á»™ đối tượng " ++ ++msgid "Configure server bridge" ++msgstr "Äịnh cấu hình cầu nối server" ++ ++msgid "Configure server mode" ++msgstr "Äịnh cấu hình chế Ä‘á»™ server" ++ ++msgid "Connect through Socks5 proxy" ++msgstr "Kết nối qua Socks5 proxy" ++ ++msgid "Connect to remote host through an HTTP proxy" ++msgstr "" ++ ++msgid "Connection retry interval" ++msgstr "Khoảng thá»­ kết nối" ++ ++msgid "Daemonize after initialization" ++msgstr "Daemonize sau khi khởi tạo" ++ ++msgid "Delay n seconds after connection" ++msgstr "" ++ ++msgid "Delay tun/tap open and up script execution" ++msgstr "Trì hoãn tun/tap mở và up script execution" ++ ++msgid "Diffie Hellman parameters" ++msgstr "Tham số Diffie Hellman " ++ ++msgid "Directory for custom client config files" ++msgstr "Dạnh mục cho các tập tin config đối tÆ°Æ¡ng tùy chỉnh" ++ ++msgid "Disable Paging" ++msgstr "Vô hiệu hóa Paging" ++ ++msgid "Disable cipher initialisation vector" ++msgstr "Vô hiệu hóa cipher initialisation vector" ++ ++msgid "Disable options consistency check" ++msgstr "Vô hiệu hóa tùy chá»n kiểm tra nhất quán" ++ ++msgid "Disable replay protection" ++msgstr "Vô hiệu hóa replay protection" ++ ++msgid "Do not bind to local address and port" ++msgstr "Äừng đóng kết địa chỉ địa phÆ°Æ¡ng và cổng" ++ ++msgid "Don't actually execute ifconfig" ++msgstr "Äừng thá»±c sá»± thá»±c hiện ifconfig" ++ ++msgid "Don't add routes automatically" ++msgstr "Äừng tá»± Ä‘á»™ng thêm vào Ä‘Æ°á»ng dẫn" ++ ++msgid "Don't cache --askpass or --auth-user-pass passwords" ++msgstr "Don't cache --askpass or --auth-user-pass passwords" ++ ++msgid "Don't inherit global push options" ++msgstr "Äừng thừa hưởng tùy chá»n đẩy toàn cầu" ++ ++msgid "Don't log timestamps" ++msgstr "Äừng log timestamps" ++ ++msgid "Don't re-read key on restart" ++msgstr "Äừng Ä‘á»c lại key ở chế Ä‘á»™ khởi Ä‘á»™ng " ++ ++msgid "Don't require client certificate" ++msgstr "Äừng yêu câu chứng chỉ đối tượng" ++ ++msgid "Don't use adaptive lzo compression" ++msgstr "Äừng dùng bá»™ nén lzo thích ứng" ++ ++msgid "Don't warn on ifconfig inconsistencies" ++msgstr "Äừng cảnh báo vá» sá»± không nhất quán của ifconfig" ++ ++msgid "Echo parameters to log" ++msgstr "Báo tham số lên log" ++ ++msgid "Empirically measure MTU" ++msgstr "Äo MTU" ++ ++msgid "Enable OpenSSL hardware crypto engines" ++msgstr "Kích hoạt OpenSSL hardware crypto engines" ++ ++msgid "Enable Path MTU discovery" ++msgstr "Kích hoạt khám phá Ä‘Æ°á»ng dẫn MTU" ++ ++msgid "Enable Static Key encryption mode (non-TLS)" ++msgstr "Kích hoạt chế Ä‘á»™ mã hóa khóa tÄ©nh (non-TLS)" ++ ++msgid "Enable TLS and assume client role" ++msgstr "Kích hoạt TLS và giả định vải trò của client" ++ ++msgid "Enable TLS and assume server role" ++msgstr "Kích hoạt TLS và giả định vải trò của server" ++ ++msgid "Enable internal datagram fragmentation" ++msgstr "Kích hoạt internal datagram fragmentation" ++ ++msgid "Enable management interface on IP port" ++msgstr "Kích hoạt giao diện Ä‘iá»u hành trên IP cổng" ++ ++msgid "Enabled" ++msgstr "Kích hoạt " ++ ++msgid "Encryption cipher for packets" ++msgstr "Encryption cipher cho các gói" ++ ++msgid "Execute shell cmd after routes are added" ++msgstr "Thá»±c hiện shell cmd sau khi tuyến đã thêm vào" ++ ++msgid "Execute shell command on remote ip change" ++msgstr "Thá»±c hiện lệnh shell trên ip thay đổi từ xa" ++ ++msgid "" ++"Executed in server mode on new client connections, when the client is still " ++"untrusted" ++msgstr "" ++ ++msgid "" ++"Executed in server mode whenever an IPv4 address/route or MAC address is " ++"added to OpenVPN's internal routing table" ++msgstr "" ++ ++msgid "Exit on TLS negotiation failure" ++msgstr "Exit trên TLS khi thÆ°Æ¡ng lượng thất bại" ++ ++msgid "Get PEM password from controlling tty before we daemonize" ++msgstr "Lấy mật mã PEM từ Ä‘iá»u khiển tty trÆ°á»›c khi chúng ta daemonize" ++ ++msgid "HMAC authentication for packets" ++msgstr "Sá»± xác thá»±c HMAC cho gói" ++ ++msgid "Handling of authentication failures" ++msgstr "Xá»­ lý những sai soát khi xác thá»±c " ++ ++msgid "" ++"Helper directive to simplify the expression of --ping and --ping-restart in " ++"server mode configurations" ++msgstr "" ++ ++msgid "If hostname resolve fails, retry" ++msgstr "Nếu hostname resolve thất bại, thá»­ lại" ++ ++msgid "Instance \"%s\"" ++msgstr "Instance \"%s\"" ++ ++msgid "Invalid" ++msgstr "" ++ ++msgid "Keep local IP address on restart" ++msgstr "Giữ địa chỉ IP ở chế Ä‘á»™ khởi Ä‘á»™ng" ++ ++msgid "Keep remote IP address on restart" ++msgstr "Giữ remote địa chỉ IP ở chế Ä‘á»™ khởi Ä‘á»™ng" ++ ++msgid "Keep tun/tap device open on restart" ++msgstr "Giữ công cụ tun/tap mở khi khởi Ä‘á»™ng lại " ++ ++msgid "Key transition window" ++msgstr "Key transition window" ++ ++msgid "Limit repeated log messages" ++msgstr "Giá»›i hạn lập log tin nhắn" ++ ++msgid "Local certificate" ++msgstr "Chứng chỉ địa phÆ°Æ¡ng" ++ ++msgid "Local host name or ip address" ++msgstr "Tên host địa phÆ°Æ¡ng và địa chỉ IP" ++ ++msgid "Local private key" ++msgstr "Phím bảo mật địa phÆ°Æ¡ng" ++ ++msgid "Major mode" ++msgstr "Chế Ä‘á»™ chính" ++ ++msgid "Make tun device IPv6 capable" ++msgstr "Làm cho tun công cụ IPv6 có khả năng" ++ ++msgid "Maximum number of queued TCP output packets" ++msgstr "Số lượng tối Ä‘a của queued TCP output packets" ++ ++msgid "Number of allocated broadcast buffers" ++msgstr "Số lượng phân bổ phát sóng buffers" ++ ++msgid "Number of lines for log file history" ++msgstr "Số dòng cho tập tin log history" ++ ++msgid "Only accept connections from given X509 name" ++msgstr "Chỉ chấp nhận kết nối từ những tên X509 cho sẵn" ++ ++msgid "Only process ping timeouts if routes exist" ++msgstr "Chỉ xá»­ lý ping timouts nếu tuyến tồn tại" ++ ++msgid "OpenVPN" ++msgstr "OpenVPN" ++ ++msgid "OpenVPN instances" ++msgstr "OpenVPN instances" ++ ++msgid "Optimize TUN/TAP/UDP writes" ++msgstr "Tối Æ°u hóa TUN/TAP/UDP writes" ++ ++msgid "Output to syslog and do not daemonize" ++msgstr "Output tá»›i syslog và đừng daemonize" ++ ++msgid "Overview" ++msgstr "" ++ ++msgid "PKCS#12 file containing keys" ++msgstr "PKCS # 12 tập tin có chứa key" ++ ++msgid "Pass environment variables to script" ++msgstr "Bá» qua yếu tố môi trÆ°á»ng tá»›i script" ++ ++msgid "Persist replay-protection state" ++msgstr "Tiếp tục tình trạng replay-protection" ++ ++msgid "Persist/unpersist ifconfig-pool" ++msgstr "Persist/unpersist ifconfig-pool" ++ ++msgid "Ping remote every n seconds over TCP/UDP port" ++msgstr "Ping remote má»—i n giây trên cổng TCP/UDP" ++ ++msgid "Policy level over usage of external programs and scripts" ++msgstr "" ++ ++msgid "Port" ++msgstr "Cổng" ++ ++msgid "Protocol" ++msgstr "Protocol" ++ ++msgid "Proxy timeout in seconds" ++msgstr "Proxy timeout in seconds" ++ ++msgid "Push an ifconfig option to remote" ++msgstr "Äảy má»™t tùy chá»n ifconfig tá»›i remote" ++ ++msgid "Push options to peer" ++msgstr "Äẩy lá»±a chá»n cho đối tác" ++ ++msgid "Query management channel for private key" ++msgstr "Tra vấn kênh Ä‘iá»u hành cho phím bảo mật " ++ ++msgid "Randomly choose remote server" ++msgstr "Ngẫu nhiên chá»n server ngoài vùng" ++ ++msgid "Refuse connection if no custom client config" ++msgstr "Từ chối kết nối nêu không có config đối tượng tùy chỉnh" ++ ++msgid "Remap SIGUSR1 signals" ++msgstr "Remap tín hiệu SIGUSR1" ++ ++msgid "Remote host name or ip address" ++msgstr "Tên host ngoài vùng và địa chỉ IP" ++ ++msgid "Remote ping timeout" ++msgstr "PING timeout từ xa" ++ ++msgid "Renegotiate data chan. key after bytes" ++msgstr "ThÆ°Æ¡ng lượng lại data chan. key sau bytes" ++ ++msgid "Renegotiate data chan. key after packets" ++msgstr "ThÆ°Æ¡ng lượng lại data chan. key sau packets" ++ ++msgid "Renegotiate data chan. key after seconds" ++msgstr "ThÆ°Æ¡ng lượng lại data chan. key sau seconds" ++ ++msgid "Replay protection sliding window size" ++msgstr "Replay chế Ä‘á»™ bảo vệ kích thÆ°á»›c window trượt" ++ ++msgid "Require explicit designation on certificate" ++msgstr "Yêu cầu rõ ràng vá» giấy chứng nhận " ++ ++msgid "Require explicit key usage on certificate" ++msgstr "Yêu cầu key dùng rõ rãng trên chứng nhận" ++ ++msgid "Restart after remote ping timeout" ++msgstr "Khởi Ä‘á»™ng lại sau khi remote ping timeout" ++ ++msgid "Retransmit timeout on TLS control channel" ++msgstr "Retransmit timeout trên kênh kiểm soát TLS" ++ ++msgid "Retry indefinitely on HTTP proxy errors" ++msgstr "Thá»­ lại trên HTTP proxy lá»—i" ++ ++msgid "Retry indefinitely on Socks proxy errors" ++msgstr "Thá»­ lại trên Socks proxy lá»—i" ++ ++msgid "Route subnet to client" ++msgstr "Tuyến subnet tá»›i khách hàng" ++ ++msgid "Run as an inetd or xinetd server" ++msgstr "Chạy nhÆ° inetd hoặc xinetd server" ++ ++msgid "Run script cmd on client connection" ++msgstr "Chạy script cmd trên đối tượng kết nối" ++ ++msgid "Run script cmd on client disconnection" ++msgstr "Chạy script cmd trên đối tượng không kết nối" ++ ++msgid "Run up/down scripts for all restarts" ++msgstr "Chạy up/down scripts cho tất cả khởi Ä‘á»™ng" ++ ++msgid "Send notification to peer on disconnect" ++msgstr "Gá»­i thông báo cho bạn bè vá» ngắt kết nối" ++ ++msgid "Set GID to group" ++msgstr "Cài đặt GID tá»›i nhóm" ++ ++msgid "Set TCP/UDP MTU" ++msgstr "Cài đặt TCP/UDP MTU" ++ ++msgid "Set UID to user" ++msgstr "Cài đặt UID tá»›i ngÆ°á»i dùng" ++ ++msgid "Set aside a pool of subnets" ++msgstr "Äể sang má»™t bên má»™t pool của subnets" ++ ++msgid "Set extended HTTP proxy options" ++msgstr "Thiết lập các tùy chá»n mở rá»™ng HTTP proxy" ++ ++msgid "Set output verbosity" ++msgstr "Äặt output verbosity" ++ ++msgid "Set size of real and virtual address hash tables" ++msgstr "Äặt dung lượng của bảng address hash thá»±c và ảo" ++ ++msgid "Set the TCP/UDP receive buffer size" ++msgstr "Äặt TCP/UDP nhận dung lượng buffer" ++ ++msgid "Set the TCP/UDP send buffer size" ++msgstr "Äặt TCP/UDP gá»­i dung lượng buffer" ++ ++msgid "Set tun/tap TX queue length" ++msgstr "Äặt tun/tap Ä‘á»™ dài queue" ++ ++msgid "Set tun/tap adapter parameters" ++msgstr "" ++ ++msgid "Set tun/tap device MTU" ++msgstr "Äặt công cụ tun/tap MTU" ++ ++msgid "Set tun/tap device overhead" ++msgstr "Äặt thiết bị tun/tap overhead" ++ ++msgid "Set upper bound on TCP MSS" ++msgstr "Äặt upper bound trên TCP MSS" ++ ++msgid "Shaping for peer bandwidth" ++msgstr "Shaping cho peer bandwidth" ++ ++msgid "Shell cmd to execute after tun device open" ++msgstr "Shell cmd để thá»±c thi sau khi thiết bị tun mở" ++ ++msgid "Shell cmd to run after tun device close" ++msgstr "Shell cmd để chạy sau khi thiết bị tun đóng" ++ ++msgid "Shell command to verify X509 name" ++msgstr "Shell command để hợp thức hóa tên X509 " ++ ++msgid "Silence the output of replay warnings" ++msgstr "Silence the output của các cảnh báo reply" ++ ++msgid "Size of cipher key" ++msgstr "Dung lượng của cipher key" ++ ++msgid "Specify a default gateway for routes" ++msgstr "Chỉ định má»™t cổng mặc định cho tuyến" ++ ++msgid "Start OpenVPN in a hibernating state" ++msgstr "Bắt đầu OpenVPN trong má»™t hibernating state" ++ ++msgid "Start/Stop" ++msgstr "" ++ ++msgid "Started" ++msgstr "Bắt đầu" ++ ++msgid "Status file format version" ++msgstr "Tình trạng tập tin phiên bản format" ++ ++msgid "Switch to advanced configuration »" ++msgstr "Chuyển sang cấu hình cấp cao" ++ ++msgid "TCP/UDP port # for both local and remote" ++msgstr "Cổng TCP/UDP # cho cả địa phÆ°Æ¡ng và ngoài vùng" ++ ++msgid "TCP/UDP port # for local (default=1194)" ++msgstr "Cổng TCP/UDP # cho địa phÆ°Æ¡ng (default=1194)" ++ ++msgid "TCP/UDP port # for remote (default=1194)" ++msgstr "Cổng TCP/UDP # cho ngoài vùng (default=1194)" ++ ++msgid "TLS cipher" ++msgstr "TLS cipher" ++ ++msgid "TOS passthrough (applies to IPv4 only)" ++msgstr "TOS passthrough (chỉ áp dụng cho IPv4)" ++ ++msgid "Temporary directory for client-connect return file" ++msgstr "Danh mục tạm thá»i cho tập tin client-connect return" ++ ++msgid "Timeframe for key exchange" ++msgstr "Timeframe cho trao đổi key" ++ ++msgid "Type of used device" ++msgstr "Loại công cụ sá»­ dụng" ++ ++msgid "Use fast LZO compression" ++msgstr "Dùng LZO nén nhanh" ++ ++msgid "Use individual addresses rather than /30 subnets" ++msgstr "Nên dùng địa chỉ cá nhân hÆ¡n là /30 subnets" ++ ++msgid "Use protocol" ++msgstr "Dùng protocol" ++ ++msgid "Use tun/tap device node" ++msgstr "Dùng chế Ä‘á»™ công cụ tun/tap" ++ ++msgid "Use username as common name" ++msgstr "Dùng tên đăng nhập nhÆ° tên thông thÆ°á»ng" ++ ++msgid "Write log to file" ++msgstr "Viết log lên tập tin" ++ ++msgid "Write process ID to file" ++msgstr "Viết xá»­ lý ID lên tập tin" ++ ++msgid "Write status to file every n seconds" ++msgstr "Viết tình trạng tá»›i tập tin má»—i n giây" ++ ++msgid "no" ++msgstr "không" ++ ++msgid "tun/tap device" ++msgstr "Công cụ tun/tap" ++ ++msgid "tun/tap inactivity timeout" ++msgstr "tun/tap timeout không có hành Ä‘á»™ng" ++ ++msgid "yes (%i)" ++msgstr "Có (%i)" ++ ++msgid "« Switch to basic configuration" ++msgstr "Chuyển sang cấu hình căn bản" +diff --git a/feeds/luci/applications/luci-app-openvpn/po/zh-cn/openvpn.po b/feeds/luci/applications/luci-app-openvpn/po/zh-cn/openvpn.po +new file mode 100644 +index 0000000..1c210dc +--- /dev/null ++++ b/feeds/luci/applications/luci-app-openvpn/po/zh-cn/openvpn.po +@@ -0,0 +1,552 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Report-Msgid-Bugs-To: \n" ++"POT-Creation-Date: 2009-05-19 19:35+0200\n" ++"PO-Revision-Date: 2013-10-10 06:09+0200\n" ++"Last-Translator: Tanyingyu \n" ++"Language-Team: QQ Group 75543259 \n" ++"Language: zh_CN\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=1; plural=0;\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "%s" ++msgstr "%s" ++ ++msgid "'net30', 'p2p', or 'subnet'" ++msgstr "'net30', 'p2p', 或 'å­ç½‘'" ++ ++msgid "Accept options pushed from server" ++msgstr "接å—从æœåŠ¡å™¨å‘é€è¿‡æ¥çš„选项" ++ ++msgid "Add" ++msgstr "添加" ++ ++msgid "Add route after establishing connection" ++msgstr "建立连接åŽæ·»åŠ è·¯ç”±" ++ ++msgid "Additional authentication over TLS" ++msgstr "TLS以外的验è¯" ++ ++msgid "Allow client-to-client traffic" ++msgstr "å…许客户端到客户端的通信" ++ ++msgid "Allow multiple clients with same certificate" ++msgstr "å…许多用户共用åŒä¸€è¯ä¹¦" ++ ++msgid "Allow only one session" ++msgstr "åªå…许一个会è¯" ++ ++msgid "Allow remote to change its IP or port" ++msgstr "å…许远程修改ip和端å£" ++ ++msgid "Allowed maximum of connected clients" ++msgstr "å…许最大已连接客户端数" ++ ++msgid "Allowed maximum of internal" ++msgstr "å…许最大内部连接" ++ ++msgid "Allowed maximum of new connections" ++msgstr "å…许最大新建连接数" ++ ++msgid "Append log to file" ++msgstr "添加日志至文件" ++ ++msgid "Authenticate using username/password" ++msgstr "以用户å/密ç çš„æ–¹å¼è¿›è¡ŒéªŒè¯" ++ ++msgid "Automatically redirect default route" ++msgstr "自动é‡å®šå‘至默认路由" ++ ++msgid "Below is a list of configured OpenVPN instances and their current state" ++msgstr "Openvpnå·²é…置实例åŠå…¶å½“å‰çŠ¶æ€åˆ—表" ++ ++msgid "Call down cmd/script before TUN/TAP close" ++msgstr "TUN/TAP关闭å‰å…³é—­å‘½ä»¤è¡ŒåŠè„šæœ¬" ++ ++msgid "Certificate authority" ++msgstr "认è¯æŽˆæƒ" ++ ++msgid "Change process priority" ++msgstr "改å˜è¿›ç¨‹ä¼˜å…ˆçº§" ++ ++msgid "Change to directory before initialization" ++msgstr "åˆå§‹åŒ–å‰æ”¹å˜æ ¹ç›®å½•" ++ ++msgid "Check peer certificate against a CRL" ++msgstr "验è¯å®¢æˆ·ç«¯è¯ä¹¦ä»¥ç¡®ä¿å…¶æ˜¯å¦è¿‡æœŸ" ++ ++msgid "Chroot to directory after initialization" ++msgstr "åˆå§‹åŒ–åŽæ”¹å˜æ ¹ç›®å½•" ++ ++msgid "Client is disabled" ++msgstr "客户端已被ç¦æ­¢" ++ ++msgid "Configuration category" ++msgstr "é…置分类" ++ ++msgid "Configure client mode" ++msgstr "é…置客户端模å¼" ++ ++msgid "Configure server bridge" ++msgstr "é…ç½®æœåŠ¡å™¨æ¡¥æŽ¥" ++ ++msgid "Configure server mode" ++msgstr "é…ç½®æœåŠ¡å™¨æ¨¡å¼" ++ ++msgid "Connect through Socks5 proxy" ++msgstr "通过Sock5代ç†è¿žæŽ¥" ++ ++msgid "Connect to remote host through an HTTP proxy" ++msgstr "通过HTTP代ç†è¿žæŽ¥åˆ°è¿œç¨‹ä¸»æœº" ++ ++msgid "Connection retry interval" ++msgstr "连接é‡è¯•æ—¶é—´é—´éš”" ++ ++msgid "Daemonize after initialization" ++msgstr "åˆå§‹åŒ–åŽè¿›å…¥åŽå°è¿è¡Œ" ++ ++msgid "Delay n seconds after connection" ++msgstr "连接åŽå»¶è¿Ÿæ—¶é—´(秒)" ++ ++msgid "Delay tun/tap open and up script execution" ++msgstr "延迟tun/tap的打开并加速脚本执行" ++ ++msgid "Diffie Hellman parameters" ++msgstr "Diffie–Hellman/DHå¯†é’¥äº¤æ¢ å‚æ•°" ++ ++msgid "Directory for custom client config files" ++msgstr "自定义客户端é…置文件的目录" ++ ++msgid "Disable Paging" ++msgstr "ç¦æ­¢åˆ†é¡µ" ++ ++msgid "Disable cipher initialisation vector" ++msgstr "关闭加密的åˆå§‹åŒ–å‘é‡" ++ ++msgid "Disable options consistency check" ++msgstr "ç¦æ­¢é€‰é¡¹ä¸€è‡´æ€§æ£€æŸ¥" ++ ++msgid "Disable replay protection" ++msgstr "关闭é‡æ’­ä¿æŠ¤" ++ ++msgid "Do not bind to local address and port" ++msgstr "ä¸ç»‘定本地地å€å’Œç«¯å£" ++ ++msgid "Don't actually execute ifconfig" ++msgstr "ä¸å®žé™…执行ifconfig命令" ++ ++msgid "Don't add routes automatically" ++msgstr "ä¸è‡ªåŠ¨æ·»åŠ è·¯ç”±" ++ ++msgid "Don't cache --askpass or --auth-user-pass passwords" ++msgstr "ä¸ç¼“å­˜--askpass 或--auth-user-pass passwords" ++ ++msgid "Don't inherit global push options" ++msgstr "ä¸ç»§æ‰¿å…¨å±€ä¸»åŠ¨å‘é€é€‰é¡¹" ++ ++msgid "Don't log timestamps" ++msgstr "ä¸è®°å½•æ—¶é—´æˆ³" ++ ++msgid "Don't re-read key on restart" ++msgstr "æœåŠ¡é‡å¯æ—¶ä¸é‡è¯»å¯†é’¥å€¼" ++ ++msgid "Don't require client certificate" ++msgstr "ä¸éœ€è¦å®¢æˆ·çš„è¯ä¹¦" ++ ++msgid "Don't use adaptive lzo compression" ++msgstr "ä¸ç”¨è‡ªé€‚应的lzo压缩" ++ ++msgid "Don't warn on ifconfig inconsistencies" ++msgstr "ifconfigä¸ä¸€è‡´æ—¶ä¸è­¦å‘Š" ++ ++msgid "Echo parameters to log" ++msgstr "把å‚数写入日志" ++ ++msgid "Empirically measure MTU" ++msgstr "以历å²å€¼ä¼°ç®—MTU值" ++ ++msgid "Enable OpenSSL hardware crypto engines" ++msgstr "打开OpenSSL硬件加密引擎" ++ ++msgid "Enable Path MTU discovery" ++msgstr "å¯ç”¨è·¯å¾„MTUå‘现" ++ ++msgid "Enable Static Key encryption mode (non-TLS)" ++msgstr "å…许é™æ€å¯†é’¥åŠ å¯†æ¨¡å¼" ++ ++msgid "Enable TLS and assume client role" ++msgstr "å…许TLS并伪装为客户端" ++ ++msgid "Enable TLS and assume server role" ++msgstr "å…许TLS并伪装为æœåŠ¡å™¨" ++ ++msgid "Enable internal datagram fragmentation" ++msgstr "å…许内部数æ®æŠ¥åˆ†ç‰‡" ++ ++msgid "Enable management interface on IP port" ++msgstr "在IP port上å¯ç”¨å¯ç®¡ç†æŽ¥å£" ++ ++msgid "Enabled" ++msgstr "å¯ç”¨" ++ ++msgid "Encryption cipher for packets" ++msgstr "加密数æ®åŒ…" ++ ++msgid "Execute shell cmd after routes are added" ++msgstr "添加路由åŽæ‰§è¡Œshell命令" ++ ++msgid "Execute shell command on remote ip change" ++msgstr "当远程ip改å˜æ—¶æ‰§è¡Œshell命令" ++ ++msgid "" ++"Executed in server mode on new client connections, when the client is still " ++"untrusted" ++msgstr "在æœåŠ¡å™¨æ¨¡å¼ä¸‹æ‰§è¡Œæ–°çš„客户端连接,当客户端ä»ç„¶æ˜¯ä¸å¯ä¿¡" ++ ++msgid "" ++"Executed in server mode whenever an IPv4 address/route or MAC address is " ++"added to OpenVPN's internal routing table" ++msgstr "" ++"æœåŠ¡å™¨æ¨¡å¼ä¸‹ï¼Œå°†æ¯ä¸ªIPv4地å€/路由或MAC地å€æ·»åŠ åˆ°OpenVPN的内部路由表中。" ++ ++msgid "Exit on TLS negotiation failure" ++msgstr "TLS验è¯å¤±è´¥åŽé€€å‡º" ++ ++msgid "Get PEM password from controlling tty before we daemonize" ++msgstr "åŽå°è¿è¡Œå‰ä»ŽæŽ§åˆ¶çš„tty中获å–PEM密ç " ++ ++msgid "HMAC authentication for packets" ++msgstr "利用HMACæ°´å°ç®—法校验数æ®åŒ…" ++ ++msgid "Handling of authentication failures" ++msgstr "处ç†éªŒè¯å¤±è´¥" ++ ++msgid "" ++"Helper directive to simplify the expression of --ping and --ping-restart in " ++"server mode configurations" ++msgstr "在æœåŠ¡é…置模å¼ä¸‹Helper简明的执行--pingå’Œ--ping-restart" ++ ++msgid "If hostname resolve fails, retry" ++msgstr "如果主机å解æžé”™è¯¯ï¼Œé‡è¯•" ++ ++msgid "Instance \"%s\"" ++msgstr "实例 \"%s\"" ++ ++msgid "Invalid" ++msgstr "无效" ++ ++msgid "Keep local IP address on restart" ++msgstr "æœåŠ¡é‡å¯æ—¶ä¿æŒæœ¬åœ°IP地å€" ++ ++msgid "Keep remote IP address on restart" ++msgstr "æœåŠ¡é‡å¯æ—¶ä¿æŒè¿œç¨‹IP地å€" ++ ++msgid "Keep tun/tap device open on restart" ++msgstr "æœåŠ¡é‡å¯æ—¶è‡ªåŠ¨æ‰“å¼€ tun/tap 设备" ++ ++msgid "Key transition window" ++msgstr "密钥传输滑动窗å£" ++ ++msgid "Limit repeated log messages" ++msgstr "é™åˆ¶é‡å¤æ€§çš„日志消æ¯" ++ ++msgid "Local certificate" ++msgstr "本地è¯ä¹¦" ++ ++msgid "Local host name or ip address" ++msgstr "本地主机å或ip地å€" ++ ++msgid "Local private key" ++msgstr "本地ç§äººå¯†é’¥" ++ ++msgid "Major mode" ++msgstr "主è¦æ¨¡å¼" ++ ++msgid "Make tun device IPv6 capable" ++msgstr "使 tun 设备兼容IPv6" ++ ++msgid "Maximum number of queued TCP output packets" ++msgstr "TCP队列中输出包的最大数é‡" ++ ++msgid "Number of allocated broadcast buffers" ++msgstr "已分é…的广播缓冲区数é‡" ++ ++msgid "Number of lines for log file history" ++msgstr "历å²æ—¥å¿—文件的行数" ++ ++msgid "Only accept connections from given X509 name" ++msgstr "åªæŽ¥æ”¶å·²ç»™å®šçš„X509å称的连接" ++ ++msgid "Only process ping timeouts if routes exist" ++msgstr "当且仅当路由存在时处ç†ping超时" ++ ++msgid "OpenVPN" ++msgstr "OpenVPN" ++ ++msgid "OpenVPN instances" ++msgstr "OpenVPN 实例" ++ ++msgid "Optimize TUN/TAP/UDP writes" ++msgstr "优化 TUN/TAP/UDP 写入" ++ ++msgid "Output to syslog and do not daemonize" ++msgstr "显å¼è¾“出到syslog" ++ ++msgid "Overview" ++msgstr "概览" ++ ++msgid "PKCS#12 file containing keys" ++msgstr "PKCS#12文件包å«çš„密钥" ++ ++msgid "Pass environment variables to script" ++msgstr "传递环境å˜é‡è‡³è„šæœ¬" ++ ++msgid "Persist replay-protection state" ++msgstr "ä¿å­˜é‡æ’­ä¿æŠ¤çš„状æ€" ++ ++msgid "Persist/unpersist ifconfig-pool" ++msgstr "æŒä¹…/éžæŒä¹…ifconfigæ± " ++ ++msgid "Ping remote every n seconds over TCP/UDP port" ++msgstr "æ¯n秒ping一次远程 TCP/UDP 端å£" ++ ++msgid "Policy level over usage of external programs and scripts" ++msgstr "外部程åºå’Œè„šæœ¬è¶…出了策略å…许的使用范围" ++ ++msgid "Port" ++msgstr "端å£" ++ ++msgid "Protocol" ++msgstr "åè®®" ++ ++msgid "Proxy timeout in seconds" ++msgstr "代ç†è¶…时,å•ä½ç§’" ++ ++msgid "Push an ifconfig option to remote" ++msgstr "主动å‘远程å‘é€ifconfig选项" ++ ++msgid "Push options to peer" ++msgstr "主动å‘端点å‘é€é€‰é¡¹" ++ ++msgid "Query management channel for private key" ++msgstr "为ç§äººå¯†é’¥æŸ¥è¯¢ç®¡ç†é€šé“" ++ ++msgid "Randomly choose remote server" ++msgstr "éšæœºé€‰æ‹©è¿œç¨‹æœåŠ¡å™¨" ++ ++msgid "Refuse connection if no custom client config" ++msgstr "拒接没有自定义客户端é…置的连接" ++ ++msgid "Remap SIGUSR1 signals" ++msgstr "é‡æ˜ å°„SIGUSR1ä¿¡å·" ++ ++msgid "Remote host name or ip address" ++msgstr "远程主机å或ip地å€" ++ ++msgid "Remote ping timeout" ++msgstr "远程ping超时" ++ ++msgid "Renegotiate data chan. key after bytes" ++msgstr "传输若干字节åŽé‡æ–°éªŒè¯æ•°æ®é€šé“密钥" ++ ++msgid "Renegotiate data chan. key after packets" ++msgstr "传输若干数æ®åŒ…åŽé‡æ–°éªŒè¯æ•°æ®é€šé“密钥" ++ ++msgid "Renegotiate data chan. key after seconds" ++msgstr "传输若干秒åŽé‡æ–°éªŒè¯æ•°æ®é€šé“密钥" ++ ++msgid "Replay protection sliding window size" ++msgstr "é‡æ’­ä¿æŠ¤çš„滑动窗å£å¤§å°" ++ ++msgid "Require explicit designation on certificate" ++msgstr "è¯ä¹¦éœ€è¦æ˜¾å¼æŒ‡å®š" ++ ++msgid "Require explicit key usage on certificate" ++msgstr "è¯ä¹¦éœ€è¦æ˜Žç¡®çš„密钥" ++ ++msgid "Restart after remote ping timeout" ++msgstr "远程ping超时åŽé‡å¯" ++ ++msgid "Retransmit timeout on TLS control channel" ++msgstr "TLS控制通é“超时åŽé‡æ–°å‘é€" ++ ++msgid "Retry indefinitely on HTTP proxy errors" ++msgstr "æ— é™é‡è¯•ç›´è‡³ä»£ç†æ­£ç¡®" ++ ++msgid "Retry indefinitely on Socks proxy errors" ++msgstr "æ— é™é‡è¯•ç›´è‡³Socks代ç†æ­£ç¡®" ++ ++msgid "Route subnet to client" ++msgstr "路由å­ç½‘至客户端" ++ ++msgid "Run as an inetd or xinetd server" ++msgstr "以inetd或xinetdæœåŠ¡å™¨çš„æ–¹å¼è¿è¡Œ" ++ ++msgid "Run script cmd on client connection" ++msgstr "当客户端连接时在命令行下å…许脚本" ++ ++msgid "Run script cmd on client disconnection" ++msgstr "当客户端断开时在命令行下å…许脚本" ++ ++msgid "Run up/down scripts for all restarts" ++msgstr "æ¯æ¬¡é‡å¯éƒ½æ‰§è¡Œå¯åŠ¨/关闭脚本" ++ ++msgid "Send notification to peer on disconnect" ++msgstr "断开连接时å‘客户端å‘é€é€šçŸ¥" ++ ++msgid "Set GID to group" ++msgstr "为群组设置GID值" ++ ++msgid "Set TCP/UDP MTU" ++msgstr "设置TCP/UDPçš„MTU值" ++ ++msgid "Set UID to user" ++msgstr "为用户设置UID值" ++ ++msgid "Set aside a pool of subnets" ++msgstr "设置为拒ç»å­ç½‘线程池模å¼" ++ ++msgid "Set extended HTTP proxy options" ++msgstr "设置HTTP扩展代ç†é€‰é¡¹" ++ ++msgid "Set output verbosity" ++msgstr "设置输出冗余级别" ++ ++msgid "Set size of real and virtual address hash tables" ++msgstr "设置实际和虚拟地å€çš„哈希表大å°" ++ ++msgid "Set the TCP/UDP receive buffer size" ++msgstr "设置TCP/UDP接收缓冲区大å°" ++ ++msgid "Set the TCP/UDP send buffer size" ++msgstr "设置TCP/UDPå‘é€ç¼“冲区大å°" ++ ++msgid "Set tun/tap TX queue length" ++msgstr "设置tun/tapå‘é€é˜Ÿåˆ—长度" ++ ++msgid "Set tun/tap adapter parameters" ++msgstr "设置tun/ tap适é…器å‚æ•°" ++ ++msgid "Set tun/tap device MTU" ++msgstr "设置tun/tap设备的MTU值" ++ ++msgid "Set tun/tap device overhead" ++msgstr "设置tun/tap设备的开销" ++ ++msgid "Set upper bound on TCP MSS" ++msgstr "设置TCP MSS的上é™" ++ ++msgid "Shaping for peer bandwidth" ++msgstr "改å˜ç»“点带宽" ++ ++msgid "Shell cmd to execute after tun device open" ++msgstr "tun设备打开åŽè¿è¡Œshell命令行" ++ ++msgid "Shell cmd to run after tun device close" ++msgstr "tun设备关闭åŽè¿è¡Œshell命令行e" ++ ++msgid "Shell command to verify X509 name" ++msgstr "è¿è¡Œshell命令以验è¯X509å称" ++ ++msgid "Silence the output of replay warnings" ++msgstr "以é™éŸ³çš„æ–¹å¼å‘出é‡æ’­è­¦å‘Š" ++ ++msgid "Size of cipher key" ++msgstr "密钥大å°" ++ ++msgid "Specify a default gateway for routes" ++msgstr "指定路由默认网关" ++ ++msgid "Start OpenVPN in a hibernating state" ++msgstr "以休眠的状æ€æ‰“å¼€OpenVPN" ++ ++msgid "Start/Stop" ++msgstr "å¯åŠ¨/åœæ­¢" ++ ++msgid "Started" ++msgstr "å·²è¿è¡Œçš„" ++ ++msgid "Status file format version" ++msgstr "显å¼æ–‡ä»¶æ ¼å¼ç‰ˆæœ¬çš„状æ€" ++ ++msgid "Switch to advanced configuration »" ++msgstr "高级é…ç½® »" ++ ++msgid "TCP/UDP port # for both local and remote" ++msgstr "TCP/UDP ç«¯å£ # åŒæ—¶é’ˆå¯¹æœ¬åœ°å’Œè¿œç¨‹" ++ ++msgid "TCP/UDP port # for local (default=1194)" ++msgstr "TCP/UDP ç«¯å£ # 本地 (默认 1194)" ++ ++msgid "TCP/UDP port # for remote (default=1194)" ++msgstr "TCP/UDP ç«¯å£ # 远程 (默认 1194)" ++ ++msgid "TLS cipher" ++msgstr "TLS加密" ++ ++msgid "TOS passthrough (applies to IPv4 only)" ++msgstr "TOS ç©¿é€ (ä»…é™IPv4)" ++ ++msgid "Temporary directory for client-connect return file" ++msgstr "客户端连接返回文件的临时目录" ++ ++msgid "Timeframe for key exchange" ++msgstr "密钥交æ¢æ—¶é—´è¡¨" ++ ++msgid "Type of used device" ++msgstr "使用设备类型" ++ ++msgid "Use fast LZO compression" ++msgstr "使用快速LZO压缩" ++ ++msgid "Use individual addresses rather than /30 subnets" ++msgstr "利用个人地å€ä»£æ›¿/30 å­ç½‘" ++ ++msgid "Use protocol" ++msgstr "采用åè®®" ++ ++msgid "Use tun/tap device node" ++msgstr "使用 tun/tap 设备节点" ++ ++msgid "Use username as common name" ++msgstr "把用户å作为通用å称" ++ ++msgid "Write log to file" ++msgstr "ä¿å­˜æ—¥å¿—至文件" ++ ++msgid "Write process ID to file" ++msgstr "记录进程ID至文件" ++ ++msgid "Write status to file every n seconds" ++msgstr "æ¯n秒åŽå†™çŠ¶æ€å€¼è‡³æ–‡ä»¶" ++ ++msgid "no" ++msgstr "å¦" ++ ++msgid "tun/tap device" ++msgstr "tun/tap 设备" ++ ++msgid "tun/tap inactivity timeout" ++msgstr "tun/tap 休眠超时" ++ ++msgid "yes (%i)" ++msgstr "是 (%i)" ++ ++msgid "« Switch to basic configuration" ++msgstr "« 基本é…ç½®" ++ ++#~ msgid "Cryptography" ++#~ msgstr "加密" ++ ++#~ msgid "Networking" ++#~ msgstr "网络" ++ ++#~ msgid "Service" ++#~ msgstr "æœåŠ¡" ++ ++#~ msgid "VPN" ++#~ msgstr "VPN" +diff --git a/feeds/luci/applications/luci-app-openvpn/po/zh-tw/openvpn.po b/feeds/luci/applications/luci-app-openvpn/po/zh-tw/openvpn.po +new file mode 100644 +index 0000000..d010f4b +--- /dev/null ++++ b/feeds/luci/applications/luci-app-openvpn/po/zh-tw/openvpn.po +@@ -0,0 +1,533 @@ ++msgid "" ++msgstr "" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Last-Translator: Automatically generated\n" ++"Language-Team: none\n" ++"MIME-Version: 1.0\n" ++"Content-Transfer-Encoding: 8bit\n" ++ ++msgid "%s" ++msgstr "" ++ ++msgid "'net30', 'p2p', or 'subnet'" ++msgstr "" ++ ++msgid "Accept options pushed from server" ++msgstr "" ++ ++msgid "Add" ++msgstr "" ++ ++msgid "Add route after establishing connection" ++msgstr "" ++ ++msgid "Additional authentication over TLS" ++msgstr "" ++ ++msgid "Allow client-to-client traffic" ++msgstr "" ++ ++msgid "Allow multiple clients with same certificate" ++msgstr "" ++ ++msgid "Allow only one session" ++msgstr "" ++ ++msgid "Allow remote to change its IP or port" ++msgstr "" ++ ++msgid "Allowed maximum of connected clients" ++msgstr "" ++ ++msgid "Allowed maximum of internal" ++msgstr "" ++ ++msgid "Allowed maximum of new connections" ++msgstr "" ++ ++msgid "Append log to file" ++msgstr "" ++ ++msgid "Authenticate using username/password" ++msgstr "" ++ ++msgid "Automatically redirect default route" ++msgstr "" ++ ++msgid "Below is a list of configured OpenVPN instances and their current state" ++msgstr "" ++ ++msgid "Call down cmd/script before TUN/TAP close" ++msgstr "" ++ ++msgid "Certificate authority" ++msgstr "" ++ ++msgid "Change process priority" ++msgstr "" ++ ++msgid "Change to directory before initialization" ++msgstr "" ++ ++msgid "Check peer certificate against a CRL" ++msgstr "" ++ ++msgid "Chroot to directory after initialization" ++msgstr "" ++ ++msgid "Client is disabled" ++msgstr "" ++ ++msgid "Configuration category" ++msgstr "" ++ ++msgid "Configure client mode" ++msgstr "" ++ ++msgid "Configure server bridge" ++msgstr "" ++ ++msgid "Configure server mode" ++msgstr "" ++ ++msgid "Connect through Socks5 proxy" ++msgstr "" ++ ++msgid "Connect to remote host through an HTTP proxy" ++msgstr "" ++ ++msgid "Connection retry interval" ++msgstr "" ++ ++msgid "Daemonize after initialization" ++msgstr "" ++ ++msgid "Delay n seconds after connection" ++msgstr "" ++ ++msgid "Delay tun/tap open and up script execution" ++msgstr "" ++ ++msgid "Diffie Hellman parameters" ++msgstr "" ++ ++msgid "Directory for custom client config files" ++msgstr "" ++ ++msgid "Disable Paging" ++msgstr "" ++ ++msgid "Disable cipher initialisation vector" ++msgstr "" ++ ++msgid "Disable options consistency check" ++msgstr "" ++ ++msgid "Disable replay protection" ++msgstr "" ++ ++msgid "Do not bind to local address and port" ++msgstr "" ++ ++msgid "Don't actually execute ifconfig" ++msgstr "" ++ ++msgid "Don't add routes automatically" ++msgstr "" ++ ++msgid "Don't cache --askpass or --auth-user-pass passwords" ++msgstr "" ++ ++msgid "Don't inherit global push options" ++msgstr "" ++ ++msgid "Don't log timestamps" ++msgstr "" ++ ++msgid "Don't re-read key on restart" ++msgstr "" ++ ++msgid "Don't require client certificate" ++msgstr "" ++ ++msgid "Don't use adaptive lzo compression" ++msgstr "" ++ ++msgid "Don't warn on ifconfig inconsistencies" ++msgstr "" ++ ++msgid "Echo parameters to log" ++msgstr "" ++ ++msgid "Empirically measure MTU" ++msgstr "" ++ ++msgid "Enable OpenSSL hardware crypto engines" ++msgstr "" ++ ++msgid "Enable Path MTU discovery" ++msgstr "" ++ ++msgid "Enable Static Key encryption mode (non-TLS)" ++msgstr "" ++ ++msgid "Enable TLS and assume client role" ++msgstr "" ++ ++msgid "Enable TLS and assume server role" ++msgstr "" ++ ++msgid "Enable internal datagram fragmentation" ++msgstr "" ++ ++msgid "Enable management interface on IP port" ++msgstr "" ++ ++msgid "Enabled" ++msgstr "" ++ ++msgid "Encryption cipher for packets" ++msgstr "" ++ ++msgid "Execute shell cmd after routes are added" ++msgstr "" ++ ++msgid "Execute shell command on remote ip change" ++msgstr "" ++ ++msgid "" ++"Executed in server mode on new client connections, when the client is still " ++"untrusted" ++msgstr "" ++ ++msgid "" ++"Executed in server mode whenever an IPv4 address/route or MAC address is " ++"added to OpenVPN's internal routing table" ++msgstr "" ++ ++msgid "Exit on TLS negotiation failure" ++msgstr "" ++ ++msgid "Get PEM password from controlling tty before we daemonize" ++msgstr "" ++ ++msgid "HMAC authentication for packets" ++msgstr "" ++ ++msgid "Handling of authentication failures" ++msgstr "" ++ ++msgid "" ++"Helper directive to simplify the expression of --ping and --ping-restart in " ++"server mode configurations" ++msgstr "" ++ ++msgid "If hostname resolve fails, retry" ++msgstr "" ++ ++msgid "Instance \"%s\"" ++msgstr "" ++ ++msgid "Invalid" ++msgstr "" ++ ++msgid "Keep local IP address on restart" ++msgstr "" ++ ++msgid "Keep remote IP address on restart" ++msgstr "" ++ ++msgid "Keep tun/tap device open on restart" ++msgstr "" ++ ++msgid "Key transition window" ++msgstr "" ++ ++msgid "Limit repeated log messages" ++msgstr "" ++ ++msgid "Local certificate" ++msgstr "" ++ ++msgid "Local host name or ip address" ++msgstr "" ++ ++msgid "Local private key" ++msgstr "" ++ ++msgid "Major mode" ++msgstr "" ++ ++msgid "Make tun device IPv6 capable" ++msgstr "" ++ ++msgid "Maximum number of queued TCP output packets" ++msgstr "" ++ ++msgid "Number of allocated broadcast buffers" ++msgstr "" ++ ++msgid "Number of lines for log file history" ++msgstr "" ++ ++msgid "Only accept connections from given X509 name" ++msgstr "" ++ ++msgid "Only process ping timeouts if routes exist" ++msgstr "" ++ ++msgid "OpenVPN" ++msgstr "" ++ ++msgid "OpenVPN instances" ++msgstr "" ++ ++msgid "Optimize TUN/TAP/UDP writes" ++msgstr "" ++ ++msgid "Output to syslog and do not daemonize" ++msgstr "" ++ ++msgid "Overview" ++msgstr "" ++ ++msgid "PKCS#12 file containing keys" ++msgstr "" ++ ++msgid "Pass environment variables to script" ++msgstr "" ++ ++msgid "Persist replay-protection state" ++msgstr "" ++ ++msgid "Persist/unpersist ifconfig-pool" ++msgstr "" ++ ++msgid "Ping remote every n seconds over TCP/UDP port" ++msgstr "" ++ ++msgid "Policy level over usage of external programs and scripts" ++msgstr "" ++ ++msgid "Port" ++msgstr "" ++ ++msgid "Protocol" ++msgstr "" ++ ++msgid "Proxy timeout in seconds" ++msgstr "" ++ ++msgid "Push an ifconfig option to remote" ++msgstr "" ++ ++msgid "Push options to peer" ++msgstr "" ++ ++msgid "Query management channel for private key" ++msgstr "" ++ ++msgid "Randomly choose remote server" ++msgstr "" ++ ++msgid "Refuse connection if no custom client config" ++msgstr "" ++ ++msgid "Remap SIGUSR1 signals" ++msgstr "" ++ ++msgid "Remote host name or ip address" ++msgstr "" ++ ++msgid "Remote ping timeout" ++msgstr "" ++ ++msgid "Renegotiate data chan. key after bytes" ++msgstr "" ++ ++msgid "Renegotiate data chan. key after packets" ++msgstr "" ++ ++msgid "Renegotiate data chan. key after seconds" ++msgstr "" ++ ++msgid "Replay protection sliding window size" ++msgstr "" ++ ++msgid "Require explicit designation on certificate" ++msgstr "" ++ ++msgid "Require explicit key usage on certificate" ++msgstr "" ++ ++msgid "Restart after remote ping timeout" ++msgstr "" ++ ++msgid "Retransmit timeout on TLS control channel" ++msgstr "" ++ ++msgid "Retry indefinitely on HTTP proxy errors" ++msgstr "" ++ ++msgid "Retry indefinitely on Socks proxy errors" ++msgstr "" ++ ++msgid "Route subnet to client" ++msgstr "" ++ ++msgid "Run as an inetd or xinetd server" ++msgstr "" ++ ++msgid "Run script cmd on client connection" ++msgstr "" ++ ++msgid "Run script cmd on client disconnection" ++msgstr "" ++ ++msgid "Run up/down scripts for all restarts" ++msgstr "" ++ ++msgid "Send notification to peer on disconnect" ++msgstr "" ++ ++msgid "Set GID to group" ++msgstr "" ++ ++msgid "Set TCP/UDP MTU" ++msgstr "" ++ ++msgid "Set UID to user" ++msgstr "" ++ ++msgid "Set aside a pool of subnets" ++msgstr "" ++ ++msgid "Set extended HTTP proxy options" ++msgstr "" ++ ++msgid "Set output verbosity" ++msgstr "" ++ ++msgid "Set size of real and virtual address hash tables" ++msgstr "" ++ ++msgid "Set the TCP/UDP receive buffer size" ++msgstr "" ++ ++msgid "Set the TCP/UDP send buffer size" ++msgstr "" ++ ++msgid "Set tun/tap TX queue length" ++msgstr "" ++ ++msgid "Set tun/tap adapter parameters" ++msgstr "" ++ ++msgid "Set tun/tap device MTU" ++msgstr "" ++ ++msgid "Set tun/tap device overhead" ++msgstr "" ++ ++msgid "Set upper bound on TCP MSS" ++msgstr "" ++ ++msgid "Shaping for peer bandwidth" ++msgstr "" ++ ++msgid "Shell cmd to execute after tun device open" ++msgstr "" ++ ++msgid "Shell cmd to run after tun device close" ++msgstr "" ++ ++msgid "Shell command to verify X509 name" ++msgstr "" ++ ++msgid "Silence the output of replay warnings" ++msgstr "" ++ ++msgid "Size of cipher key" ++msgstr "" ++ ++msgid "Specify a default gateway for routes" ++msgstr "" ++ ++msgid "Start OpenVPN in a hibernating state" ++msgstr "" ++ ++msgid "Start/Stop" ++msgstr "" ++ ++msgid "Started" ++msgstr "" ++ ++msgid "Status file format version" ++msgstr "" ++ ++msgid "Switch to advanced configuration »" ++msgstr "" ++ ++msgid "TCP/UDP port # for both local and remote" ++msgstr "" ++ ++msgid "TCP/UDP port # for local (default=1194)" ++msgstr "" ++ ++msgid "TCP/UDP port # for remote (default=1194)" ++msgstr "" ++ ++msgid "TLS cipher" ++msgstr "" ++ ++msgid "TOS passthrough (applies to IPv4 only)" ++msgstr "" ++ ++msgid "Temporary directory for client-connect return file" ++msgstr "" ++ ++msgid "Timeframe for key exchange" ++msgstr "" ++ ++msgid "Type of used device" ++msgstr "" ++ ++msgid "Use fast LZO compression" ++msgstr "" ++ ++msgid "Use individual addresses rather than /30 subnets" ++msgstr "" ++ ++msgid "Use protocol" ++msgstr "" ++ ++msgid "Use tun/tap device node" ++msgstr "" ++ ++msgid "Use username as common name" ++msgstr "" ++ ++msgid "Write log to file" ++msgstr "" ++ ++msgid "Write process ID to file" ++msgstr "" ++ ++msgid "Write status to file every n seconds" ++msgstr "" ++ ++msgid "no" ++msgstr "" ++ ++msgid "tun/tap device" ++msgstr "" ++ ++msgid "tun/tap inactivity timeout" ++msgstr "" ++ ++msgid "yes (%i)" ++msgstr "" ++ ++msgid "« Switch to basic configuration" ++msgstr "" +diff --git a/feeds/luci/applications/luci-app-openvpn/root/etc/config/openvpn_recipes b/feeds/luci/applications/luci-app-openvpn/root/etc/config/openvpn_recipes +new file mode 100644 +index 0000000..1b394df +--- /dev/null ++++ b/feeds/luci/applications/luci-app-openvpn/root/etc/config/openvpn_recipes +@@ -0,0 +1,102 @@ ++# ++# Routed point-to-point server ++# ++config openvpn_recipe server_tun_ptp ++ option _description "Simple server configuration for a routed point-to-point VPN" ++ option _role "server" ++ option dev "tun" ++ option ifconfig "10.0.0.1 10.0.0.2" ++ option secret "shared-secret.key" ++ option keepalive "10 60" ++ option comp_lzo "yes" ++ option verb "3" ++ option mssfix "1420" ++ ++# ++# Routed point-to-point client ++# ++config openvpn_recipe client_tun_ptp ++ option _description "Simple client configuration for a routed point-to-point VPN" ++ option _role "client" ++ option dev "tun" ++ list remote "vpnserver.example.org" ++ option ifconfig "10.0.0.2 10.0.0.1" ++ option secret "shared-secret.key" ++ option nobind "1" ++ option comp_lzo "yes" ++ option verb "3" ++ ++# ++# Routed multi-client server ++# ++config openvpn_recipe server_tun ++ option _description "Server configuration for a routed multi-client VPN" ++ option _role "server" ++ option dev "tun" ++ option server "10.0.100.0 255.255.255.0" ++ option ca "ca.crt" ++ option cert "server.crt" ++ option key "server.key" ++ option dh "dh1024.pem" ++ option keepalive "10 60" ++ option comp_lzo "yes" ++ option verb "3" ++ option mssfix "1420" ++ ++# ++# Routed client ++# ++config openvpn_recipe client_tun ++ option _description "Client configuration for a routed multi-client VPN" ++ option _role "client" ++ option client "1" ++ option dev "tun" ++ list remote "vpnserver.example.org" ++ option pkcs12 "my_client.p12" ++ option remote_cert_tls "server" ++ option comp_lzo "yes" ++ option nobind "1" ++ option persist_key "1" ++ option persist_tun "1" ++ option verb "3" ++ option reneg_sec "0" ++ option float "1" ++ ++# ++# Multi-client ethernet bridge server ++# ++config openvpn_recipe server_tap_bridge ++ option _description "Server configuration for an ethernet bridge VPN" ++ option _role "server" ++ option dev "tap" ++ option server_bridge "192.168.1.1 255.255.255.0 192.168.1.128 192.168.1.254" ++ option ca "ca.crt" ++ option cert "server.crt" ++ option key "server.key" ++ option dh "dh1024.pem" ++ option keepalive "10 60" ++ option comp_lzo "yes" ++ option verb "3" ++ option mssfix "1420" ++ ++# ++# Ethernet bridge client ++# ++config openvpn_recipe client_tap_bridge ++ option _description "Client configuration for an ethernet bridge VPN" ++ option _role "client" ++ option client "1" ++ option dev "tap" ++ list remote "vpnserver.example.org" ++ option ca "ca.crt" ++ option cert "my_client.crt" ++ option key "my_client.key" ++ option dh "dh1024.pem" ++ option remote_cert_tls "server" ++ option comp_lzo "yes" ++ option nobind "1" ++ option persist_key "1" ++ option verb "3" ++ option reneg_sec "0" ++ option float "1" ++ +diff --git a/feeds/luci/applications/luci-app-p2pblock/Makefile b/feeds/luci/applications/luci-app-p2pblock/Makefile +new file mode 100644 +index 0000000..4dbeb5e +--- /dev/null ++++ b/feeds/luci/applications/luci-app-p2pblock/Makefile +@@ -0,0 +1,14 @@ ++# ++# Copyright (C) 2008-2014 The LuCI Team ++# ++# This is free software, licensed under the Apache License, Version 2.0 . ++# ++ ++include $(TOPDIR)/rules.mk ++ ++LUCI_TITLE:=LuCI Support for the Freifunk P2P-Block addon ++LUCI_DEPENDS:=+luci-app-firewall +freifunk-p2pblock ++ ++include ../../luci.mk ++ ++# call BuildPackage - OpenWrt buildroot signature +diff --git a/feeds/luci/applications/luci-app-p2pblock/luasrc/controller/ff_p2pblock.lua b/feeds/luci/applications/luci-app-p2pblock/luasrc/controller/ff_p2pblock.lua +new file mode 100644 +index 0000000..eaedda2 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-p2pblock/luasrc/controller/ff_p2pblock.lua +@@ -0,0 +1,9 @@ ++-- Copyright 2009 Jo-Philipp Wich ++-- Licensed to the public under the Apache License 2.0. ++ ++module("luci.controller.ff_p2pblock", package.seeall) ++ ++function index() ++ entry({"admin", "network", "firewall", "p2pblock"}, cbi("luci_fw/p2pblock"), ++ _("P2P-Block"), 40) ++end +diff --git a/feeds/luci/applications/luci-app-p2pblock/luasrc/model/cbi/luci_fw/p2pblock.lua b/feeds/luci/applications/luci-app-p2pblock/luasrc/model/cbi/luci_fw/p2pblock.lua +new file mode 100644 +index 0000000..1f21429 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-p2pblock/luasrc/model/cbi/luci_fw/p2pblock.lua +@@ -0,0 +1,66 @@ ++-- Copyright 2009 Jo-Philipp Wich ++-- Licensed to the public under the Apache License 2.0. ++ ++local sys = require "luci.sys" ++ ++m = Map("freifunk_p2pblock", translate("P2P-Block"), ++ translate("P2P-Block is a greylisting mechanism to block various peer-to-peer protocols for non-whitelisted clients.")) ++ ++s = m:section(NamedSection, "p2pblock", "settings", "Settings") ++s.anonymous = true ++s.addremove = false ++ ++en = s:option(Flag, "_enabled", translate("Enable P2P-Block")) ++en.rmempty = false ++ ++function en.cfgvalue() ++ return ( sys.init.enabled("freifunk-p2pblock") and "1" or "0" ) ++end ++ ++function en.write(self, section, val) ++ if val == "1" then ++ sys.init.enable("freifunk-p2pblock") ++ else ++ sys.init.disable("freifunk-p2pblock") ++ end ++end ++ ++s:option(Value, "portrange", translate("Portrange")) ++ ++s:option(Value, "blocktime", translate("Block Time"), ++ translate("seconds")) ++ ++s:option(DynamicList, "whitelist", translate("Whitelisted IPs")) ++ ++l7 = s:option(MultiValue, "layer7", translate("Layer7-Protocols")) ++l7.widget = "checkbox" ++l7:value("aim", "AIM Chat") ++l7:value("bittorrent", "Bittorrent") ++l7:value("edonkey", "eDonkey, eMule, Kademlia") ++l7:value("fasttrack", "Fasttrack Protocol") ++l7:value("ftp", "File Transfer Protocol") ++l7:value("gnutella", "Gnutella") ++l7:value("http", "Hypertext Transfer Protocol") ++l7:value("ident", "Ident Protocol") ++l7:value("irc", "Internet Relay Chat") ++l7:value("jabber", "Jabber/XMPP") ++l7:value("msnmessenger", "MSN Messenger") ++l7:value("ntp", "Network Time Protocol") ++l7:value("pop3", "POP3 Protocol") ++l7:value("smtp", "SMTP Protocol") ++l7:value("ssl", "SSL Protocol") ++l7:value("vnc", "VNC Protocol") ++ ++ipp2p = s:option(MultiValue, "ipp2p", translate("IP-P2P")) ++ipp2p.widget = "checkbox" ++ipp2p:value("edk", "eDonkey, eMule, Kademlia") ++ipp2p:value("kazaa", "KaZaA, FastTrack") ++ipp2p:value("gnu", "Gnutella") ++ipp2p:value("dc", "Direct Connect") ++ipp2p:value("bit", "BitTorrent, extended BT") ++ipp2p:value("apple", "AppleJuice") ++ipp2p:value("winmx", "WinMX") ++ipp2p:value("soul", "SoulSeek") ++ipp2p:value("ares", "AresLite") ++ ++return m +diff --git a/feeds/luci/applications/luci-app-p2pblock/po/ca/p2pblock.po b/feeds/luci/applications/luci-app-p2pblock/po/ca/p2pblock.po +new file mode 100644 +index 0000000..fe99a77 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-p2pblock/po/ca/p2pblock.po +@@ -0,0 +1,46 @@ ++# default.pot ++# generated from ./i18n/english/luasrc/i18n/default.en.lua ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Report-Msgid-Bugs-To: \n" ++"POT-Creation-Date: 2009-06-10 03:40+0200\n" ++"PO-Revision-Date: 2011-02-14 17:43+0100\n" ++"Last-Translator: Manuel Munz \n" ++"Language-Team: LANGUAGE \n" ++"Language: \n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"X-Generator: Pootle 1.1.0\n" ++ ++msgid "Block Time" ++msgstr "Temps de bloqueig" ++ ++msgid "Enable P2P-Block" ++msgstr "Habilita el Blocat P2P" ++ ++msgid "IP-P2P" ++msgstr "IP-P2P" ++ ++msgid "Layer7-Protocols" ++msgstr "Protocols de capa 7" ++ ++msgid "P2P-Block" ++msgstr "Blocat P2P" ++ ++msgid "" ++"P2P-Block is a greylisting mechanism to block various peer-to-peer protocols " ++"for non-whitelisted clients." ++msgstr "" ++"El Blocat P2P és un mecanisme de llista grisa per blocar diversos protocols " ++"peer-tp-peer per clients que no estiguin a la llista blanca." ++ ++msgid "Portrange" ++msgstr "Rang de ports" ++ ++msgid "Whitelisted IPs" ++msgstr "IPs a la llista blanca" ++ ++msgid "seconds" ++msgstr "segons" +diff --git a/feeds/luci/applications/luci-app-p2pblock/po/cs/p2pblock.po b/feeds/luci/applications/luci-app-p2pblock/po/cs/p2pblock.po +new file mode 100644 +index 0000000..02eafef +--- /dev/null ++++ b/feeds/luci/applications/luci-app-p2pblock/po/cs/p2pblock.po +@@ -0,0 +1,41 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"PO-Revision-Date: 2014-08-04 22:44+0200\n" ++"Last-Translator: koli \n" ++"Language-Team: none\n" ++"Language: cs\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "Block Time" ++msgstr "Doba blokování" ++ ++msgid "Enable P2P-Block" ++msgstr "Povolit P2P-Block" ++ ++msgid "IP-P2P" ++msgstr "IP-P2P" ++ ++msgid "Layer7-Protocols" ++msgstr "Layer7-Protokoly" ++ ++msgid "P2P-Block" ++msgstr "P2P-Block" ++ ++msgid "" ++"P2P-Block is a greylisting mechanism to block various peer-to-peer protocols " ++"for non-whitelisted clients." ++msgstr "" ++ ++msgid "Portrange" ++msgstr "Rozsah portů" ++ ++msgid "Whitelisted IPs" ++msgstr "Povolené IP adresy" ++ ++msgid "seconds" ++msgstr "sekundy" +diff --git a/feeds/luci/applications/luci-app-p2pblock/po/de/p2pblock.po b/feeds/luci/applications/luci-app-p2pblock/po/de/p2pblock.po +new file mode 100644 +index 0000000..e3613d6 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-p2pblock/po/de/p2pblock.po +@@ -0,0 +1,44 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Report-Msgid-Bugs-To: \n" ++"POT-Creation-Date: 2009-05-26 17:57+0200\n" ++"PO-Revision-Date: 2011-02-14 17:44+0100\n" ++"Last-Translator: Manuel Munz \n" ++"Language-Team: LANGUAGE \n" ++"Language: \n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"X-Generator: Translate Toolkit 1.1.1\n" ++ ++msgid "Block Time" ++msgstr "Sperr-Zeitraum" ++ ++msgid "Enable P2P-Block" ++msgstr "P2P-Sperr-Mechanismus aktivieren" ++ ++msgid "IP-P2P" ++msgstr "IPP2P" ++ ++msgid "Layer7-Protocols" ++msgstr "Layer7-Protokolle" ++ ++msgid "P2P-Block" ++msgstr "P2P-Sperre" ++ ++msgid "" ++"P2P-Block is a greylisting mechanism to block various peer-to-peer protocols " ++"for non-whitelisted clients." ++msgstr "" ++"P2P-Block ist ein Mechanismus zum vorrübergehendem Sperren von Peer-to-Peer " ++"Protokollen für nicht auf der Whitelist stehende Clients. " ++ ++msgid "Portrange" ++msgstr "Ãœberwachter Port-Bereich" ++ ++msgid "Whitelisted IPs" ++msgstr "Freigeschaltete IP-Adressen" ++ ++msgid "seconds" ++msgstr "Angabe in Sekunden" +diff --git a/feeds/luci/applications/luci-app-p2pblock/po/el/p2pblock.po b/feeds/luci/applications/luci-app-p2pblock/po/el/p2pblock.po +new file mode 100644 +index 0000000..9db357a +--- /dev/null ++++ b/feeds/luci/applications/luci-app-p2pblock/po/el/p2pblock.po +@@ -0,0 +1,43 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Report-Msgid-Bugs-To: \n" ++"POT-Creation-Date: 2012-03-18 15:23+0200\n" ++"PO-Revision-Date: 2012-03-18 15:23+0200\n" ++"Last-Translator: Vasilis \n" ++"Language-Team: LANGUAGE \n" ++"Language: el\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n != 1);\n" ++"X-Generator: Pootle 2.0.4\n" ++ ++msgid "Block Time" ++msgstr "" ++ ++msgid "Enable P2P-Block" ++msgstr "" ++ ++msgid "IP-P2P" ++msgstr "IP-P2P" ++ ++msgid "Layer7-Protocols" ++msgstr "" ++ ++msgid "P2P-Block" ++msgstr "" ++ ++msgid "" ++"P2P-Block is a greylisting mechanism to block various peer-to-peer protocols " ++"for non-whitelisted clients." ++msgstr "" ++ ++msgid "Portrange" ++msgstr "" ++ ++msgid "Whitelisted IPs" ++msgstr "" ++ ++msgid "seconds" ++msgstr "δευτεÏόλεπτα" +diff --git a/feeds/luci/applications/luci-app-p2pblock/po/en/p2pblock.po b/feeds/luci/applications/luci-app-p2pblock/po/en/p2pblock.po +new file mode 100644 +index 0000000..00cccc8 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-p2pblock/po/en/p2pblock.po +@@ -0,0 +1,28 @@ ++msgid "Block Time" ++msgstr "" ++ ++msgid "Enable P2P-Block" ++msgstr "" ++ ++msgid "IP-P2P" ++msgstr "" ++ ++msgid "Layer7-Protocols" ++msgstr "" ++ ++msgid "P2P-Block" ++msgstr "" ++ ++msgid "" ++"P2P-Block is a greylisting mechanism to block various peer-to-peer protocols " ++"for non-whitelisted clients." ++msgstr "" ++ ++msgid "Portrange" ++msgstr "" ++ ++msgid "Whitelisted IPs" ++msgstr "" ++ ++msgid "seconds" ++msgstr "" +diff --git a/feeds/luci/applications/luci-app-p2pblock/po/es/p2pblock.po b/feeds/luci/applications/luci-app-p2pblock/po/es/p2pblock.po +new file mode 100644 +index 0000000..1edc533 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-p2pblock/po/es/p2pblock.po +@@ -0,0 +1,45 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Report-Msgid-Bugs-To: \n" ++"POT-Creation-Date: 2012-08-19 16:56+0200\n" ++"PO-Revision-Date: 2012-08-19 16:56+0200\n" ++"Last-Translator: josevteg \n" ++"Language-Team: LANGUAGE \n" ++"Language: es\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n != 1);\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "Block Time" ++msgstr "Tiempo de bloqueo" ++ ++msgid "Enable P2P-Block" ++msgstr "Activar bloqueo P2P" ++ ++msgid "IP-P2P" ++msgstr "IP-P2P" ++ ++msgid "Layer7-Protocols" ++msgstr "Protocolo Layer7" ++ ++msgid "P2P-Block" ++msgstr "Bloqueo de P2P" ++ ++msgid "" ++"P2P-Block is a greylisting mechanism to block various peer-to-peer protocols " ++"for non-whitelisted clients." ++msgstr "" ++"El bloqueo de P2P es un mecanismo de lista gris para bloquear varios " ++"protocolos punto a punto a clientes que no están en lista blanca." ++ ++msgid "Portrange" ++msgstr "Rango de puertos" ++ ++msgid "Whitelisted IPs" ++msgstr "IPs en la lista blanca" ++ ++msgid "seconds" ++msgstr "segundos" +diff --git a/feeds/luci/applications/luci-app-p2pblock/po/fr/p2pblock.po b/feeds/luci/applications/luci-app-p2pblock/po/fr/p2pblock.po +new file mode 100644 +index 0000000..524d3d0 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-p2pblock/po/fr/p2pblock.po +@@ -0,0 +1,45 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Report-Msgid-Bugs-To: \n" ++"POT-Creation-Date: 2011-06-13 21:39+0200\n" ++"PO-Revision-Date: 2012-01-15 07:06+0200\n" ++"Last-Translator: desillu \n" ++"Language-Team: LANGUAGE \n" ++"Language: fr\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n > 1);\n" ++"X-Generator: Pootle 2.0.4\n" ++ ++msgid "Block Time" ++msgstr "Temps de blocage" ++ ++msgid "Enable P2P-Block" ++msgstr "Activer le blocage P2P" ++ ++msgid "IP-P2P" ++msgstr "IP-P2P" ++ ++msgid "Layer7-Protocols" ++msgstr "Protocoles de couche 7" ++ ++msgid "P2P-Block" ++msgstr "Blocage P2P" ++ ++msgid "" ++"P2P-Block is a greylisting mechanism to block various peer-to-peer protocols " ++"for non-whitelisted clients." ++msgstr "" ++"Le blocage P2P est un mécanisme de liste grise pour bloquer divers " ++"protocoles de pair-à-pair de clients non autorisés." ++ ++msgid "Portrange" ++msgstr "Gamme de ports" ++ ++msgid "Whitelisted IPs" ++msgstr "Adresses IP autorisées" ++ ++msgid "seconds" ++msgstr "secondes" +diff --git a/feeds/luci/applications/luci-app-p2pblock/po/he/p2pblock.po b/feeds/luci/applications/luci-app-p2pblock/po/he/p2pblock.po +new file mode 100644 +index 0000000..5b2679b +--- /dev/null ++++ b/feeds/luci/applications/luci-app-p2pblock/po/he/p2pblock.po +@@ -0,0 +1,43 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"PO-Revision-Date: 2012-09-10 03:39+0200\n" ++"Last-Translator: Snoof \n" ++"Language-Team: none\n" ++"Language: he\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n != 1);\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "Block Time" ++msgstr "זמן חסימה" ++ ++msgid "Enable P2P-Block" ++msgstr "×פשר חסימת P2P" ++ ++msgid "IP-P2P" ++msgstr "IP-P2P" ++ ++msgid "Layer7-Protocols" ++msgstr "פרוטוקולי Layer7" ++ ++msgid "P2P-Block" ++msgstr "חסימת P2P" ++ ++msgid "" ++"P2P-Block is a greylisting mechanism to block various peer-to-peer protocols " ++"for non-whitelisted clients." ++msgstr "" ++"חסימת P2P הינו מנגנון ליצירת 'רשימה ×פורה', במטרה ×œ×—×¡×•× ×¡×•×’×™× ×©×•× ×™× ×©×œ " ++"פרוטוקולי P2P עבור לקוחות ש××™× × ×‘'רשימה הלבנה'." ++ ++msgid "Portrange" ++msgstr "טווח פורטי×" ++ ++msgid "Whitelisted IPs" ++msgstr "כתובות IP ברשימה הלבנה" ++ ++msgid "seconds" ++msgstr "שניות" +diff --git a/feeds/luci/applications/luci-app-p2pblock/po/hu/p2pblock.po b/feeds/luci/applications/luci-app-p2pblock/po/hu/p2pblock.po +new file mode 100644 +index 0000000..4f1dffa +--- /dev/null ++++ b/feeds/luci/applications/luci-app-p2pblock/po/hu/p2pblock.po +@@ -0,0 +1,43 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"PO-Revision-Date: 2012-04-01 19:16+0200\n" ++"Last-Translator: juhosg \n" ++"Language-Team: none\n" ++"Language: hu\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n != 1);\n" ++"X-Generator: Pootle 2.0.4\n" ++ ++msgid "Block Time" ++msgstr "Blokkolási idÅ‘" ++ ++msgid "Enable P2P-Block" ++msgstr "P2P-Block engedélyezése" ++ ++msgid "IP-P2P" ++msgstr "IP-P2P" ++ ++msgid "Layer7-Protocols" ++msgstr "Layer7 protokollok" ++ ++msgid "P2P-Block" ++msgstr "P2P-Block" ++ ++msgid "" ++"P2P-Block is a greylisting mechanism to block various peer-to-peer protocols " ++"for non-whitelisted clients." ++msgstr "" ++"A P2P-Block különféle peer-to-peer protokollok blokkolására szolgáló " ++"mechanizmus, a fehérlistában nem szereplÅ‘ ügyfelek részére." ++ ++msgid "Portrange" ++msgstr "Port tartomány" ++ ++msgid "Whitelisted IPs" ++msgstr "Fehérlistás IP címek" ++ ++msgid "seconds" ++msgstr "másodperc" +diff --git a/feeds/luci/applications/luci-app-p2pblock/po/it/p2pblock.po b/feeds/luci/applications/luci-app-p2pblock/po/it/p2pblock.po +new file mode 100644 +index 0000000..3be5010 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-p2pblock/po/it/p2pblock.po +@@ -0,0 +1,45 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Report-Msgid-Bugs-To: \n" ++"POT-Creation-Date: 2012-04-20 10:18+0200\n" ++"PO-Revision-Date: 2012-04-20 10:21+0200\n" ++"Last-Translator: claudyus \n" ++"Language-Team: LANGUAGE \n" ++"Language: it\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n != 1);\n" ++"X-Generator: Pootle 2.0.4\n" ++ ++msgid "Block Time" ++msgstr "Periodo di censura" ++ ++msgid "Enable P2P-Block" ++msgstr "Abilita la censura del P2P" ++ ++msgid "IP-P2P" ++msgstr "IP-P2P" ++ ++msgid "Layer7-Protocols" ++msgstr "Protocolli di Layer7" ++ ++msgid "P2P-Block" ++msgstr "Censura P2P" ++ ++msgid "" ++"P2P-Block is a greylisting mechanism to block various peer-to-peer protocols " ++"for non-whitelisted clients." ++msgstr "" ++"La censura, block, del P2P è un meccanismo per bloccare diversi protocolli " ++"peer-to-peer da parte di clienti non apparteneti alla whitelist." ++ ++msgid "Portrange" ++msgstr "Range delle porte" ++ ++msgid "Whitelisted IPs" ++msgstr "IP in whitelist" ++ ++msgid "seconds" ++msgstr "secondi" +diff --git a/feeds/luci/applications/luci-app-p2pblock/po/ja/p2pblock.po b/feeds/luci/applications/luci-app-p2pblock/po/ja/p2pblock.po +new file mode 100644 +index 0000000..00cccc8 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-p2pblock/po/ja/p2pblock.po +@@ -0,0 +1,28 @@ ++msgid "Block Time" ++msgstr "" ++ ++msgid "Enable P2P-Block" ++msgstr "" ++ ++msgid "IP-P2P" ++msgstr "" ++ ++msgid "Layer7-Protocols" ++msgstr "" ++ ++msgid "P2P-Block" ++msgstr "" ++ ++msgid "" ++"P2P-Block is a greylisting mechanism to block various peer-to-peer protocols " ++"for non-whitelisted clients." ++msgstr "" ++ ++msgid "Portrange" ++msgstr "" ++ ++msgid "Whitelisted IPs" ++msgstr "" ++ ++msgid "seconds" ++msgstr "" +diff --git a/feeds/luci/applications/luci-app-p2pblock/po/ms/p2pblock.po b/feeds/luci/applications/luci-app-p2pblock/po/ms/p2pblock.po +new file mode 100644 +index 0000000..00cccc8 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-p2pblock/po/ms/p2pblock.po +@@ -0,0 +1,28 @@ ++msgid "Block Time" ++msgstr "" ++ ++msgid "Enable P2P-Block" ++msgstr "" ++ ++msgid "IP-P2P" ++msgstr "" ++ ++msgid "Layer7-Protocols" ++msgstr "" ++ ++msgid "P2P-Block" ++msgstr "" ++ ++msgid "" ++"P2P-Block is a greylisting mechanism to block various peer-to-peer protocols " ++"for non-whitelisted clients." ++msgstr "" ++ ++msgid "Portrange" ++msgstr "" ++ ++msgid "Whitelisted IPs" ++msgstr "" ++ ++msgid "seconds" ++msgstr "" +diff --git a/feeds/luci/applications/luci-app-p2pblock/po/no/p2pblock.po b/feeds/luci/applications/luci-app-p2pblock/po/no/p2pblock.po +new file mode 100644 +index 0000000..af9c25e +--- /dev/null ++++ b/feeds/luci/applications/luci-app-p2pblock/po/no/p2pblock.po +@@ -0,0 +1,36 @@ ++msgid "" ++msgstr "" ++"Last-Translator: Lars Hardy \n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++ ++msgid "Block Time" ++msgstr "Blokkerings tid" ++ ++msgid "Enable P2P-Block" ++msgstr "Aktiver P2P-Blokkering" ++ ++msgid "IP-P2P" ++msgstr "IP-P2P" ++ ++msgid "Layer7-Protocols" ++msgstr "Lag7-Protokoller" ++ ++msgid "P2P-Block" ++msgstr "P2P-Blokkering" ++ ++msgid "" ++"P2P-Block is a greylisting mechanism to block various peer-to-peer protocols " ++"for non-whitelisted clients." ++msgstr "" ++"P2P-blokkering er en mekanisme for Ã¥ blokkere ulike peer-to-peer protokoller " ++"for klienter som ikke er hvitelistede." ++ ++msgid "Portrange" ++msgstr "PortomrÃ¥de" ++ ++msgid "Whitelisted IPs" ++msgstr "Hvitelistede IP'er" ++ ++msgid "seconds" ++msgstr "sekunder" +diff --git a/feeds/luci/applications/luci-app-p2pblock/po/pl/p2pblock.po b/feeds/luci/applications/luci-app-p2pblock/po/pl/p2pblock.po +new file mode 100644 +index 0000000..9222a08 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-p2pblock/po/pl/p2pblock.po +@@ -0,0 +1,46 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Report-Msgid-Bugs-To: \n" ++"POT-Creation-Date: 2012-03-29 10:53+0200\n" ++"PO-Revision-Date: 2012-03-29 10:55+0200\n" ++"Last-Translator: Anonymous Pootle User\n" ++"Language-Team: LANGUAGE \n" ++"Language: pl\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 " ++"|| n%100>=20) ? 1 : 2);\n" ++"X-Generator: Pootle 2.0.4\n" ++ ++msgid "Block Time" ++msgstr "Czas blokowania" ++ ++msgid "Enable P2P-Block" ++msgstr "WÅ‚Ä…cz P2P-Block" ++ ++msgid "IP-P2P" ++msgstr "IP-P2P" ++ ++msgid "Layer7-Protocols" ++msgstr "ProtokoÅ‚y Layer7" ++ ++msgid "P2P-Block" ++msgstr "P2P-Block" ++ ++msgid "" ++"P2P-Block is a greylisting mechanism to block various peer-to-peer protocols " ++"for non-whitelisted clients." ++msgstr "" ++"P2P-Block jest mechanizmem który blokuje rozmaite protokoÅ‚y peer-to-peer dla " ++"klientów spoza dozwolonej listy." ++ ++msgid "Portrange" ++msgstr "Zakres portów" ++ ++msgid "Whitelisted IPs" ++msgstr "Dozwolone adresy IP" ++ ++msgid "seconds" ++msgstr "sekund" +diff --git a/feeds/luci/applications/luci-app-p2pblock/po/pt-br/p2pblock.po b/feeds/luci/applications/luci-app-p2pblock/po/pt-br/p2pblock.po +new file mode 100644 +index 0000000..de36381 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-p2pblock/po/pt-br/p2pblock.po +@@ -0,0 +1,30 @@ ++msgid "Block Time" ++msgstr "Tempo de bloqueio" ++ ++msgid "Enable P2P-Block" ++msgstr "Habilite o bloqueio P2P" ++ ++msgid "IP-P2P" ++msgstr "IP-P2P" ++ ++msgid "Layer7-Protocols" ++msgstr "Protocolos da camada de aplicação" ++ ++msgid "P2P-Block" ++msgstr "P2P-Block" ++ ++msgid "" ++"P2P-Block is a greylisting mechanism to block various peer-to-peer protocols " ++"for non-whitelisted clients." ++msgstr "" ++"P2P-Block é um mecanismo de lista cinza para bloquear vários protocolos " ++"peer-to-peer para clientes fora da lista branca." ++ ++msgid "Portrange" ++msgstr "Faixa de porta" ++ ++msgid "Whitelisted IPs" ++msgstr "IPs na lista branca" ++ ++msgid "seconds" ++msgstr "segundos" +diff --git a/feeds/luci/applications/luci-app-p2pblock/po/pt/p2pblock.po b/feeds/luci/applications/luci-app-p2pblock/po/pt/p2pblock.po +new file mode 100644 +index 0000000..365f9f2 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-p2pblock/po/pt/p2pblock.po +@@ -0,0 +1,45 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Report-Msgid-Bugs-To: \n" ++"POT-Creation-Date: 2013-05-01 01:17+0200\n" ++"PO-Revision-Date: 2013-05-01 01:30+0200\n" ++"Last-Translator: pedromrgoncalves \n" ++"Language-Team: LANGUAGE \n" ++"Language: pt\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n != 1);\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "Block Time" ++msgstr "Tempo a bloquear" ++ ++msgid "Enable P2P-Block" ++msgstr "Activar Bloqueio P2P" ++ ++msgid "IP-P2P" ++msgstr "IP-P2P" ++ ++msgid "Layer7-Protocols" ++msgstr "Portocolos Layer7" ++ ++msgid "P2P-Block" ++msgstr "Bloqueio P2P" ++ ++msgid "" ++"P2P-Block is a greylisting mechanism to block various peer-to-peer protocols " ++"for non-whitelisted clients." ++msgstr "" ++"Bloqueio P2P é um mecanismo lista verde para bloquear vários protocolos " ++"peer-to-peer para clientes que não se encontram na lista branca" ++ ++msgid "Portrange" ++msgstr "Intervalo de Portas" ++ ++msgid "Whitelisted IPs" ++msgstr "IPs na lista branca" ++ ++msgid "seconds" ++msgstr "segundos" +diff --git a/feeds/luci/applications/luci-app-p2pblock/po/ro/p2pblock.po b/feeds/luci/applications/luci-app-p2pblock/po/ro/p2pblock.po +new file mode 100644 +index 0000000..2f7d74e +--- /dev/null ++++ b/feeds/luci/applications/luci-app-p2pblock/po/ro/p2pblock.po +@@ -0,0 +1,44 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"PO-Revision-Date: 2011-10-07 17:09+0200\n" ++"Last-Translator: Daniel \n" ++"Language-Team: none\n" ++"Language: ro\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=3; plural=(n==1 ? 0 : (n==0 || (n%100 > 0 && n%100 < " ++"20)) ? 1 : 2);;\n" ++"X-Generator: Pootle 2.0.4\n" ++ ++msgid "Block Time" ++msgstr "Durata de blocare" ++ ++msgid "Enable P2P-Block" ++msgstr "Activeaza blocarea P2P" ++ ++msgid "IP-P2P" ++msgstr "IP-P2P" ++ ++msgid "Layer7-Protocols" ++msgstr "Protocoale Layer7" ++ ++msgid "P2P-Block" ++msgstr "Blocare P2P" ++ ++msgid "" ++"P2P-Block is a greylisting mechanism to block various peer-to-peer protocols " ++"for non-whitelisted clients." ++msgstr "" ++"Blocarea P2P este un mecanism de blocare a diferitelor protocoale pentru " ++"clienti necunoscuti." ++ ++msgid "Portrange" ++msgstr "Gama de porturi" ++ ++msgid "Whitelisted IPs" ++msgstr "Adrese IP de incredere" ++ ++msgid "seconds" ++msgstr "secunde" +diff --git a/feeds/luci/applications/luci-app-p2pblock/po/ru/p2pblock.po b/feeds/luci/applications/luci-app-p2pblock/po/ru/p2pblock.po +new file mode 100644 +index 0000000..f6a2740 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-p2pblock/po/ru/p2pblock.po +@@ -0,0 +1,48 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: LuCI: p2pblock\n" ++"Report-Msgid-Bugs-To: \n" ++"POT-Creation-Date: 2011-06-01 12:02+0200\n" ++"PO-Revision-Date: 2013-11-13 18:46+0200\n" ++"Last-Translator: Роман \n" ++"Language-Team: Russian \n" ++"Language: ru\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%" ++"10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" ++"X-Generator: Pootle 2.0.6\n" ++"X-Poedit-SourceCharset: UTF-8\n" ++ ++msgid "Block Time" ++msgstr "Ð’Ñ€ÐµÐ¼Ñ Ð±Ð»Ð¾ÐºÐ¸Ñ€Ð¾Ð²ÐºÐ¸" ++ ++msgid "Enable P2P-Block" ++msgstr "Включить блокировку P2P" ++ ++#, fuzzy ++msgid "IP-P2P" ++msgstr "IP-P2P" ++ ++msgid "Layer7-Protocols" ++msgstr "Протоколы 7-го уровнÑ" ++ ++msgid "P2P-Block" ++msgstr "Блокировка P2P" ++ ++msgid "" ++"P2P-Block is a greylisting mechanism to block various peer-to-peer protocols " ++"for non-whitelisted clients." ++msgstr "" ++"Блокировка P2P позволÑет запретить P2P-протоколы Ð´Ð»Ñ ÐºÐ»Ð¸ÐµÐ½Ñ‚Ð¾Ð² вне белого " ++"ÑпиÑка." ++ ++msgid "Portrange" ++msgstr "Диапазон портов" ++ ++msgid "Whitelisted IPs" ++msgstr "Белый ÑпиÑок IP" ++ ++msgid "seconds" ++msgstr "Ñекунды" +diff --git a/feeds/luci/applications/luci-app-p2pblock/po/sk/p2pblock.po b/feeds/luci/applications/luci-app-p2pblock/po/sk/p2pblock.po +new file mode 100644 +index 0000000..1881b3c +--- /dev/null ++++ b/feeds/luci/applications/luci-app-p2pblock/po/sk/p2pblock.po +@@ -0,0 +1,38 @@ ++msgid "" ++msgstr "" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Last-Translator: Automatically generated\n" ++"Language-Team: none\n" ++"MIME-Version: 1.0\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n" ++ ++msgid "Block Time" ++msgstr "" ++ ++msgid "Enable P2P-Block" ++msgstr "" ++ ++msgid "IP-P2P" ++msgstr "" ++ ++msgid "Layer7-Protocols" ++msgstr "" ++ ++msgid "P2P-Block" ++msgstr "" ++ ++msgid "" ++"P2P-Block is a greylisting mechanism to block various peer-to-peer protocols " ++"for non-whitelisted clients." ++msgstr "" ++ ++msgid "Portrange" ++msgstr "" ++ ++msgid "Whitelisted IPs" ++msgstr "" ++ ++msgid "seconds" ++msgstr "" +diff --git a/feeds/luci/applications/luci-app-p2pblock/po/sv/p2pblock.po b/feeds/luci/applications/luci-app-p2pblock/po/sv/p2pblock.po +new file mode 100644 +index 0000000..de6e66a +--- /dev/null ++++ b/feeds/luci/applications/luci-app-p2pblock/po/sv/p2pblock.po +@@ -0,0 +1,39 @@ ++msgid "" ++msgstr "" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Last-Translator: Automatically generated\n" ++"Language-Team: none\n" ++"Language: sv\n" ++"MIME-Version: 1.0\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n != 1);\n" ++ ++msgid "Block Time" ++msgstr "" ++ ++msgid "Enable P2P-Block" ++msgstr "" ++ ++msgid "IP-P2P" ++msgstr "" ++ ++msgid "Layer7-Protocols" ++msgstr "" ++ ++msgid "P2P-Block" ++msgstr "" ++ ++msgid "" ++"P2P-Block is a greylisting mechanism to block various peer-to-peer protocols " ++"for non-whitelisted clients." ++msgstr "" ++ ++msgid "Portrange" ++msgstr "" ++ ++msgid "Whitelisted IPs" ++msgstr "" ++ ++msgid "seconds" ++msgstr "" +diff --git a/feeds/luci/applications/luci-app-p2pblock/po/templates/p2pblock.pot b/feeds/luci/applications/luci-app-p2pblock/po/templates/p2pblock.pot +new file mode 100644 +index 0000000..6fa5da1 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-p2pblock/po/templates/p2pblock.pot +@@ -0,0 +1,31 @@ ++msgid "" ++msgstr "Content-Type: text/plain; charset=UTF-8" ++ ++msgid "Block Time" ++msgstr "" ++ ++msgid "Enable P2P-Block" ++msgstr "" ++ ++msgid "IP-P2P" ++msgstr "" ++ ++msgid "Layer7-Protocols" ++msgstr "" ++ ++msgid "P2P-Block" ++msgstr "" ++ ++msgid "" ++"P2P-Block is a greylisting mechanism to block various peer-to-peer protocols " ++"for non-whitelisted clients." ++msgstr "" ++ ++msgid "Portrange" ++msgstr "" ++ ++msgid "Whitelisted IPs" ++msgstr "" ++ ++msgid "seconds" ++msgstr "" +diff --git a/feeds/luci/applications/luci-app-p2pblock/po/tr/p2pblock.po b/feeds/luci/applications/luci-app-p2pblock/po/tr/p2pblock.po +new file mode 100644 +index 0000000..7c670d8 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-p2pblock/po/tr/p2pblock.po +@@ -0,0 +1,43 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"PO-Revision-Date: 2012-10-11 22:45+0200\n" ++"Last-Translator: vincenzo \n" ++"Language-Team: none\n" ++"Language: tr\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=1; plural=0;\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "Block Time" ++msgstr "Engel Zamanı" ++ ++msgid "Enable P2P-Block" ++msgstr "P2P-BloÄŸu'nu Aç" ++ ++msgid "IP-P2P" ++msgstr "iP-P2P" ++ ++msgid "Layer7-Protocols" ++msgstr "Layer7 - Protokolleri" ++ ++msgid "P2P-Block" ++msgstr "P2P-BloÄŸu" ++ ++msgid "" ++"P2P-Block is a greylisting mechanism to block various peer-to-peer protocols " ++"for non-whitelisted clients." ++msgstr "" ++"P2P-BloÄŸu bir engel (greylist) mekanizmasıdır. izin verilenler listesinde " ++"(Beyaz Liste) olmayan istemciler için p2p protokolünü engeller." ++ ++msgid "Portrange" ++msgstr "Portrange" ++ ++msgid "Whitelisted IPs" ++msgstr "Beyaz Liste iPleri" ++ ++msgid "seconds" ++msgstr "saniye" +diff --git a/feeds/luci/applications/luci-app-p2pblock/po/uk/p2pblock.po b/feeds/luci/applications/luci-app-p2pblock/po/uk/p2pblock.po +new file mode 100644 +index 0000000..3e7dff9 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-p2pblock/po/uk/p2pblock.po +@@ -0,0 +1,45 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"PO-Revision-Date: 2013-08-13 16:04+0200\n" ++"Last-Translator: zubr_139 \n" ++"Language-Team: none\n" ++"Language: uk\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%" ++"10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "Block Time" ++msgstr "Загальний чаÑ" ++ ++msgid "Enable P2P-Block" ++msgstr "Ðктивувати Ð±Ð»Ð¾ÐºÑƒÐ²Ð°Ð½Ð½Ñ P2P" ++ ++msgid "IP-P2P" ++msgstr "IP-P2P" ++ ++msgid "Layer7-Protocols" ++msgstr "Протокол Layer7" ++ ++msgid "P2P-Block" ++msgstr "P2P блоковано" ++ ++#, fuzzy ++msgid "" ++"P2P-Block is a greylisting mechanism to block various peer-to-peer protocols " ++"for non-whitelisted clients." ++msgstr "" ++"P2P-Ð±Ð»Ð¾ÐºÑƒÐ²Ð°Ð½Ð½Ñ ÑвлÑÑ” Ñобою механізм Ñірих ÑпиÑків Ð´Ð»Ñ Ð±Ð»Ð¾ÐºÑƒÐ²Ð°Ð½Ð½Ñ Ñ€Ñ–Ð·Ð½Ð¸Ñ… " ++"рівний-однотипних протоколів Ð´Ð»Ñ ÐЕ-білого ÑпиÑку клієнтів." ++ ++msgid "Portrange" ++msgstr "Діапазон портів" ++ ++msgid "Whitelisted IPs" ++msgstr "Білий ÑпиÑок IP-адреÑ" ++ ++msgid "seconds" ++msgstr "Ñекунд" +diff --git a/feeds/luci/applications/luci-app-p2pblock/po/vi/p2pblock.po b/feeds/luci/applications/luci-app-p2pblock/po/vi/p2pblock.po +new file mode 100644 +index 0000000..4bad090 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-p2pblock/po/vi/p2pblock.po +@@ -0,0 +1,42 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: \n" ++"POT-Creation-Date: \n" ++"PO-Revision-Date: \n" ++"Last-Translator: Manuel Munz \n" ++"Language-Team: \n" ++"Language: \n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++ ++msgid "Block Time" ++msgstr "Thá»Âi gian Block" ++ ++msgid "Enable P2P-Block" ++msgstr "Kích hoạt P2P-Block" ++ ++msgid "IP-P2P" ++msgstr "IP-P2P" ++ ++msgid "Layer7-Protocols" ++msgstr "Layer7-protocols" ++ ++msgid "P2P-Block" ++msgstr "P2P-Block" ++ ++msgid "" ++"P2P-Block is a greylisting mechanism to block various peer-to-peer protocols " ++"for non-whitelisted clients." ++msgstr "" ++"P2P-Block là một cÆ¡ chế greylisting để chặn các peer-to-peer " ++"protocols cho khách hàng không nằm trên whitelisted." ++ ++msgid "Portrange" ++msgstr "Portrange" ++ ++msgid "Whitelisted IPs" ++msgstr "Whitelisted IPs" ++ ++msgid "seconds" ++msgstr "giây" +diff --git a/feeds/luci/applications/luci-app-p2pblock/po/zh-cn/p2pblock.po b/feeds/luci/applications/luci-app-p2pblock/po/zh-cn/p2pblock.po +new file mode 100644 +index 0000000..66725be +--- /dev/null ++++ b/feeds/luci/applications/luci-app-p2pblock/po/zh-cn/p2pblock.po +@@ -0,0 +1,43 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Report-Msgid-Bugs-To: \n" ++"POT-Creation-Date: 2011-06-17 19:11+0200\n" ++"PO-Revision-Date: 2013-10-08 15:22+0200\n" ++"Last-Translator: Tanyingyu \n" ++"Language-Team: LANGUAGE \n" ++"Language: zh_CN\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=1; plural=0;\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "Block Time" ++msgstr "å°é”时间" ++ ++msgid "Enable P2P-Block" ++msgstr "å¯åŠ¨P2På°é”" ++ ++msgid "IP-P2P" ++msgstr "IP-P2P" ++ ++msgid "Layer7-Protocols" ++msgstr "第7层åè®®" ++ ++msgid "P2P-Block" ++msgstr "P2På°é”" ++ ++msgid "" ++"P2P-Block is a greylisting mechanism to block various peer-to-peer protocols " ++"for non-whitelisted clients." ++msgstr "P2På°é”使用ç°åå•æœºåˆ¶ï¼Œä»¥é˜»æ­¢éžç™½åå•å®¢æˆ·çš„å„ç§P2På议。" ++ ++msgid "Portrange" ++msgstr "端å£èŒƒå›´" ++ ++msgid "Whitelisted IPs" ++msgstr "白åå•IP地å€" ++ ++msgid "seconds" ++msgstr "秒" +diff --git a/feeds/luci/applications/luci-app-p2pblock/po/zh-tw/p2pblock.po b/feeds/luci/applications/luci-app-p2pblock/po/zh-tw/p2pblock.po +new file mode 100644 +index 0000000..f542f77 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-p2pblock/po/zh-tw/p2pblock.po +@@ -0,0 +1,41 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"PO-Revision-Date: 2014-05-14 11:09+0200\n" ++"Last-Translator: omnistack \n" ++"Language-Team: none\n" ++"Language: zh_TW\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=1; plural=0;\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "Block Time" ++msgstr "阻斷時間" ++ ++msgid "Enable P2P-Block" ++msgstr "啓用P2Pç¦æ–·" ++ ++msgid "IP-P2P" ++msgstr "IP點å°é»žå”定" ++ ++msgid "Layer7-Protocols" ++msgstr "第七層å”定" ++ ++msgid "P2P-Block" ++msgstr "P2Pç¦æ–·" ++ ++msgid "" ++"P2P-Block is a greylisting mechanism to block various peer-to-peer protocols " ++"for non-whitelisted clients." ++msgstr "P2P-Block是一個ç°å單機制, é‡å°ä¸åœ¨ç™½å單清單裡é¢çš„用戶, 阻斷å„種類的P2P點å°é»žå”定." ++ ++msgid "Portrange" ++msgstr "範åœåŸ " ++ ++msgid "Whitelisted IPs" ++msgstr "白å單列表IP" ++ ++msgid "seconds" ++msgstr "秒數" +diff --git a/feeds/luci/applications/luci-app-p2pblock/root/etc/uci-defaults/luci-p2pblock b/feeds/luci/applications/luci-app-p2pblock/root/etc/uci-defaults/luci-p2pblock +new file mode 100755 +index 0000000..030ebbe +--- /dev/null ++++ b/feeds/luci/applications/luci-app-p2pblock/root/etc/uci-defaults/luci-p2pblock +@@ -0,0 +1,11 @@ ++#!/bin/sh ++ ++uci -q batch <<-EOF >/dev/null ++ delete citrack.@freifunk_p2pblock[-1] ++ add ucitrack freifunk_p2pblock ++ set ucitrack.@freifunk_p2pblock[-1].init=freifunk-p2pblock ++ commit ucitrack ++EOF ++ ++rm -f /tmp/luci-indexcache ++exit 0 +diff --git a/feeds/luci/applications/luci-app-p910nd/Makefile b/feeds/luci/applications/luci-app-p910nd/Makefile +new file mode 100644 +index 0000000..adb35bd +--- /dev/null ++++ b/feeds/luci/applications/luci-app-p910nd/Makefile +@@ -0,0 +1,14 @@ ++# ++# Copyright (C) 2008-2014 The LuCI Team ++# ++# This is free software, licensed under the Apache License, Version 2.0 . ++# ++ ++include $(TOPDIR)/rules.mk ++ ++LUCI_TITLE:=p910nd - Printer server module ++LUCI_DEPENDS:=+p910nd ++ ++include ../../luci.mk ++ ++# call BuildPackage - OpenWrt buildroot signature +diff --git a/feeds/luci/applications/luci-app-p910nd/luasrc/controller/p910nd.lua b/feeds/luci/applications/luci-app-p910nd/luasrc/controller/p910nd.lua +new file mode 100644 +index 0000000..df47e9f +--- /dev/null ++++ b/feeds/luci/applications/luci-app-p910nd/luasrc/controller/p910nd.lua +@@ -0,0 +1,15 @@ ++-- Copyright 2008 Yanira ++-- Licensed to the public under the Apache License 2.0. ++ ++module("luci.controller.p910nd", package.seeall) ++ ++function index() ++ if not nixio.fs.access("/etc/config/p910nd") then ++ return ++ end ++ ++ local page ++ ++ page = entry({"admin", "services", "p910nd"}, cbi("p910nd"), _("p910nd - Printer server"), 60) ++ page.dependent = true ++end +diff --git a/feeds/luci/applications/luci-app-p910nd/luasrc/model/cbi/p910nd.lua b/feeds/luci/applications/luci-app-p910nd/luasrc/model/cbi/p910nd.lua +new file mode 100644 +index 0000000..0990138 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-p910nd/luasrc/model/cbi/p910nd.lua +@@ -0,0 +1,49 @@ ++-- Copyright 2008 Yanira ++-- Copyright 2012 Jo-Philipp Wich ++-- Licensed to the public under the Apache License 2.0. ++ ++local uci = luci.model.uci.cursor_state() ++local net = require "luci.model.network" ++local m, s, p, b ++ ++m = Map("p910nd", translate("p910nd - Printer server"), ++ translatef("First you have to install the packages to get support for USB (kmod-usb-printer) or parallel port (kmod-lp).")) ++ ++net = net.init(m.uci) ++ ++s = m:section(TypedSection, "p910nd", translate("Settings")) ++s.addremove = true ++s.anonymous = true ++ ++s:option(Flag, "enabled", translate("enable")) ++ ++s:option(Value, "device", translate("Device")).rmempty = true ++ ++b = s:option(Value, "bind", translate("Interface"), translate("Specifies the interface to listen on.")) ++b.template = "cbi/network_netlist" ++b.nocreate = true ++b.unspecified = true ++ ++function b.cfgvalue(...) ++ local v = Value.cfgvalue(...) ++ if v then ++ return (net:get_status_by_address(v)) ++ end ++end ++ ++function b.write(self, section, value) ++ local n = net:get_network(value) ++ if n and n:ipaddr() then ++ Value.write(self, section, n:ipaddr()) ++ end ++end ++ ++p = s:option(ListValue, "port", translate("Port"), translate("TCP listener port.")) ++p.rmempty = true ++for i=0,9 do ++ p:value(i, 9100+i) ++end ++ ++s:option(Flag, "bidirectional", translate("Bidirectional mode")) ++ ++return m +diff --git a/feeds/luci/applications/luci-app-p910nd/po/ca/p910nd.po b/feeds/luci/applications/luci-app-p910nd/po/ca/p910nd.po +new file mode 100644 +index 0000000..6862df4 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-p910nd/po/ca/p910nd.po +@@ -0,0 +1,55 @@ ++# p910nd.pot ++# generated from ./applications/luci-p910nd/luasrc/i18n/p910nd.en.lua ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Report-Msgid-Bugs-To: \n" ++"POT-Creation-Date: 2009-06-10 03:40+0200\n" ++"PO-Revision-Date: 2014-07-01 03:56+0200\n" ++"Last-Translator: Alex \n" ++"Language-Team: LANGUAGE \n" ++"Language: ca\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n != 1);\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "Bidirectional mode" ++msgstr "Mode bidireccional" ++ ++msgid "Device" ++msgstr "Dispositiu" ++ ++msgid "" ++"First you have to install the packages to get support for USB (kmod-usb-" ++"printer) or parallel port (kmod-lp)." ++msgstr "" ++"Primer heu d'instal·lar els paquets de suport USB (kmod-usb-printer) o de " ++"port paral·lel (kmod-lp)." ++ ++msgid "Interface" ++msgstr "Interfície" ++ ++msgid "Port" ++msgstr "Port" ++ ++msgid "Settings" ++msgstr "Ajusts" ++ ++msgid "Specifies the interface to listen on." ++msgstr "Especifica la interfície en que escoltar." ++ ++msgid "TCP listener port." ++msgstr "Port d'escolta TCP." ++ ++msgid "enable" ++msgstr "habilita" ++ ++msgid "p910nd - Printer server" ++msgstr "p910nd - Servidor d'impressió" ++ ++#~ msgid "port_help" ++#~ msgstr "" ++#~ "El p910nd escolta al port 910+N. Per exemple, 9100 per la primera " ++#~ "impressora (la 0)." +diff --git a/feeds/luci/applications/luci-app-p910nd/po/cs/p910nd.po b/feeds/luci/applications/luci-app-p910nd/po/cs/p910nd.po +new file mode 100644 +index 0000000..e4f1c71 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-p910nd/po/cs/p910nd.po +@@ -0,0 +1,49 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"PO-Revision-Date: 2014-06-20 23:28+0200\n" ++"Last-Translator: koli \n" ++"Language-Team: none\n" ++"Language: cs\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "Bidirectional mode" ++msgstr "ObousmÄ›rný režim" ++ ++msgid "Device" ++msgstr "Zařízení" ++ ++msgid "" ++"First you have to install the packages to get support for USB (kmod-usb-" ++"printer) or parallel port (kmod-lp)." ++msgstr "" ++"Nejprve je nutno nainstalovat balíÄky pÅ™inášející podporu USB (kmod-usb-" ++"printer) Äi paralelního portu (kmod-lp)." ++ ++msgid "Interface" ++msgstr "Rozhraní" ++ ++msgid "Port" ++msgstr "Port" ++ ++msgid "Settings" ++msgstr "Nastavení" ++ ++msgid "Specifies the interface to listen on." ++msgstr "Specifikuje rozhraní pro naslouchání." ++ ++msgid "TCP listener port." ++msgstr "Naslouchající TCP port" ++ ++msgid "enable" ++msgstr "Povolit" ++ ++msgid "p910nd - Printer server" ++msgstr "p910nd - tiskový server" ++ ++#~ msgid "port_help" ++#~ msgstr "NápovÄ›da pro výbÄ›r portu" +diff --git a/feeds/luci/applications/luci-app-p910nd/po/de/p910nd.po b/feeds/luci/applications/luci-app-p910nd/po/de/p910nd.po +new file mode 100644 +index 0000000..d72e858 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-p910nd/po/de/p910nd.po +@@ -0,0 +1,51 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Report-Msgid-Bugs-To: \n" ++"POT-Creation-Date: 2009-05-26 17:57+0200\n" ++"PO-Revision-Date: 2012-09-12 14:00+0200\n" ++"Last-Translator: Jo-Philipp \n" ++"Language-Team: LANGUAGE \n" ++"Language: de\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n != 1);\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "Bidirectional mode" ++msgstr "Bidirektionaler Modus" ++ ++msgid "Device" ++msgstr "Gerät" ++ ++msgid "" ++"First you have to install the packages to get support for USB (kmod-usb-" ++"printer) or parallel port (kmod-lp)." ++msgstr "" ++"Bevor p910nd verwendet werden kann muessen Pakete fuer USB (kmod-usb-" ++"printer) und Parallelport (kmod-lp) Support installiert werden." ++ ++msgid "Interface" ++msgstr "" ++ ++msgid "Port" ++msgstr "Port" ++ ++msgid "Settings" ++msgstr "Einstellungen" ++ ++msgid "Specifies the interface to listen on." ++msgstr "" ++ ++msgid "TCP listener port." ++msgstr "TCP Port" ++ ++msgid "enable" ++msgstr "aktivieren" ++ ++msgid "p910nd - Printer server" ++msgstr "p910nd - Printserver" ++ ++#~ msgid "p910nd listens on port 910+N. E.g. 9100 for the first printer." ++#~ msgstr "p910nd hoert auf Port 910+N. Z.B. 9100 fuer ersten Drucker" +diff --git a/feeds/luci/applications/luci-app-p910nd/po/el/p910nd.po b/feeds/luci/applications/luci-app-p910nd/po/el/p910nd.po +new file mode 100644 +index 0000000..13b97c0 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-p910nd/po/el/p910nd.po +@@ -0,0 +1,55 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Report-Msgid-Bugs-To: \n" ++"POT-Creation-Date: 2009-05-28 02:08+0200\n" ++"PO-Revision-Date: 2012-03-18 15:25+0200\n" ++"Last-Translator: Vasilis \n" ++"Language-Team: LANGUAGE \n" ++"Language: el\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n != 1);\n" ++"X-Generator: Pootle 2.0.4\n" ++ ++msgid "Bidirectional mode" ++msgstr "ΑμφίδÏομη μέθοδος" ++ ++msgid "Device" ++msgstr "Συσκευή" ++ ++msgid "" ++"First you have to install the packages to get support for USB (kmod-usb-" ++"printer) or parallel port (kmod-lp)." ++msgstr "" ++"ΠÏώτα Ï€Ïέπει να εγκατασταθοÏν τα πακέτα για να υπάÏξει υποστήÏιξη για USB " ++"(kmod-usb-printer) ή παÏάλληλη θÏÏα (kmod-lp)." ++ ++msgid "Interface" ++msgstr "" ++ ++msgid "Port" ++msgstr "ΘÏÏα" ++ ++msgid "Settings" ++msgstr "Ρυθμίσεις" ++ ++msgid "Specifies the interface to listen on." ++msgstr "" ++ ++msgid "TCP listener port." ++msgstr "ΘÏÏα ακÏόασης TCP" ++ ++msgid "enable" ++msgstr "ενεÏγοποίηση" ++ ++msgid "p910nd - Printer server" ++msgstr "p910nd - ΕξυπηÏετητής εκτυπώσεων" ++ ++#~ msgid "port_help" ++#~ msgstr "port_help" ++ ++#~ msgid "p910nd listens on port 910+N. E.g. 9100 for the first printer." ++#~ msgstr "" ++#~ "p910nd ανταποκÏίνεται στην πόÏτα 910+N. Ï€.χ. 9100 για τον Ï€Ïώτο εκτυπωτή" +diff --git a/feeds/luci/applications/luci-app-p910nd/po/en/p910nd.po b/feeds/luci/applications/luci-app-p910nd/po/en/p910nd.po +new file mode 100644 +index 0000000..766673a +--- /dev/null ++++ b/feeds/luci/applications/luci-app-p910nd/po/en/p910nd.po +@@ -0,0 +1,51 @@ ++#, fuzzy ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Report-Msgid-Bugs-To: \n" ++"POT-Creation-Date: 2009-05-19 19:35+0200\n" ++"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" ++"Last-Translator: FULL NAME \n" ++"Language-Team: LANGUAGE \n" ++"Language: \n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"X-Generator: Translate Toolkit 1.1.1\n" ++ ++msgid "Bidirectional mode" ++msgstr "Bidirectional mode" ++ ++msgid "Device" ++msgstr "" ++ ++msgid "" ++"First you have to install the packages to get support for USB (kmod-usb-" ++"printer) or parallel port (kmod-lp)." ++msgstr "" ++"First you have to install the packages to get support for USB (kmod-usb-" ++"printer) or parallel port (kmod-lp)." ++ ++msgid "Interface" ++msgstr "" ++ ++msgid "Port" ++msgstr "" ++ ++msgid "Settings" ++msgstr "" ++ ++msgid "Specifies the interface to listen on." ++msgstr "" ++ ++msgid "TCP listener port." ++msgstr "" ++ ++msgid "enable" ++msgstr "" ++ ++msgid "p910nd - Printer server" ++msgstr "p910nd - Printer server" ++ ++#~ msgid "p910nd listens on port 910+N. E.g. 9100 for the first printer." ++#~ msgstr "p910nd listens on port 910+N. E.g. 9100 for the first printer." +diff --git a/feeds/luci/applications/luci-app-p910nd/po/es/p910nd.po b/feeds/luci/applications/luci-app-p910nd/po/es/p910nd.po +new file mode 100644 +index 0000000..f558c99 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-p910nd/po/es/p910nd.po +@@ -0,0 +1,51 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Report-Msgid-Bugs-To: \n" ++"POT-Creation-Date: 2009-06-10 03:41+0200\n" ++"PO-Revision-Date: 2014-06-15 09:10+0200\n" ++"Last-Translator: José Vicente \n" ++"Language-Team: LANGUAGE \n" ++"Language: es\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n != 1);\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "Bidirectional mode" ++msgstr "Modo bidireccional" ++ ++msgid "Device" ++msgstr "Dispositivo" ++ ++msgid "" ++"First you have to install the packages to get support for USB (kmod-usb-" ++"printer) or parallel port (kmod-lp)." ++msgstr "" ++"Debe instalar primero el soporte para puertos USB (kmod-usb-printer) o " ++"paralelo (kmod-lp)." ++ ++msgid "Interface" ++msgstr "Interfaz" ++ ++msgid "Port" ++msgstr "Puerto" ++ ++msgid "Settings" ++msgstr "Configuración" ++ ++msgid "Specifies the interface to listen on." ++msgstr "Especifica el interfaz en el que se escucha." ++ ++msgid "TCP listener port." ++msgstr "Puerto de escucha TCP." ++ ++msgid "enable" ++msgstr "activar" ++ ++msgid "p910nd - Printer server" ++msgstr "Servidor de Impresión - p910nd" ++ ++#~ msgid "port_help" ++#~ msgstr "puerto_ayuda" +diff --git a/feeds/luci/applications/luci-app-p910nd/po/fr/p910nd.po b/feeds/luci/applications/luci-app-p910nd/po/fr/p910nd.po +new file mode 100644 +index 0000000..5621e10 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-p910nd/po/fr/p910nd.po +@@ -0,0 +1,56 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Report-Msgid-Bugs-To: \n" ++"POT-Creation-Date: 2009-05-19 19:36+0200\n" ++"PO-Revision-Date: 2012-01-15 07:08+0200\n" ++"Last-Translator: desillu \n" ++"Language-Team: LANGUAGE \n" ++"Language: fr\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n > 1);\n" ++"X-Generator: Pootle 2.0.4\n" ++ ++msgid "Bidirectional mode" ++msgstr "Mode bi-directionnel" ++ ++msgid "Device" ++msgstr "Périphérique" ++ ++msgid "" ++"First you have to install the packages to get support for USB (kmod-usb-" ++"printer) or parallel port (kmod-lp)." ++msgstr "" ++"Vous devez d'abord installer les paquets pour gérer des imprimantes USB " ++"(kmod-usb-printer) ou sur port parallèle (kmod-lp)." ++ ++msgid "Interface" ++msgstr "" ++ ++msgid "Port" ++msgstr "Port" ++ ++msgid "Settings" ++msgstr "Paramètres" ++ ++msgid "Specifies the interface to listen on." ++msgstr "" ++ ++msgid "TCP listener port." ++msgstr "Port d'écoute TCP." ++ ++msgid "enable" ++msgstr "activer" ++ ++msgid "p910nd - Printer server" ++msgstr "p910nd - Serveur d'impression" ++ ++#~ msgid "port_help" ++#~ msgstr "aide_port" ++ ++#~ msgid "p910nd listens on port 910+N. E.g. 9100 for the first printer." ++#~ msgstr "" ++#~ "p910nd écoute sur le port 910+N, par exemple 9100 pour la première " ++#~ "imprimante." +diff --git a/feeds/luci/applications/luci-app-p910nd/po/he/p910nd.po b/feeds/luci/applications/luci-app-p910nd/po/he/p910nd.po +new file mode 100644 +index 0000000..3accdca +--- /dev/null ++++ b/feeds/luci/applications/luci-app-p910nd/po/he/p910nd.po +@@ -0,0 +1,53 @@ ++# p910nd.pot ++# generated from ./applications/luci-p910nd/luasrc/i18n/p910nd.en.lua ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"PO-Revision-Date: 2012-09-10 03:43+0200\n" ++"Last-Translator: Snoof \n" ++"Language-Team: none\n" ++"Language: he\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n != 1);\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "Bidirectional mode" ++msgstr "מצב דו-כיווני." ++ ++msgid "Device" ++msgstr "התקן" ++ ++msgid "" ++"First you have to install the packages to get support for USB (kmod-usb-" ++"printer) or parallel port (kmod-lp)." ++msgstr "" ++"ר×שית עליך להתקין ×ת החבילות כדי לקבל תמיכה ב- USB (kmod-usb-printer) ×ו " ++"בחיבור מקבילי (kmod-lp)." ++ ++msgid "Interface" ++msgstr "" ++ ++# "יצי××”" ×ו "יצי×ת התקן" ? ++#, fuzzy ++msgid "Port" ++msgstr "יצי×ת התקן" ++ ++msgid "Settings" ++msgstr "הגדרות" ++ ++msgid "Specifies the interface to listen on." ++msgstr "" ++ ++msgid "TCP listener port." ++msgstr "יצי×ת ×”××–× ×” ל- TCP" ++ ++msgid "enable" ++msgstr "ל×פשר" ++ ++msgid "p910nd - Printer server" ++msgstr "p910nd - שרת מדפסות" ++ ++#~ msgid "p910nd listens on port 910+N. E.g. 9100 for the first printer." ++#~ msgstr "p910nd מ×זין לפורט 910+N (למשל 9100) עבור המדפסת הר×שונה." +diff --git a/feeds/luci/applications/luci-app-p910nd/po/hu/p910nd.po b/feeds/luci/applications/luci-app-p910nd/po/hu/p910nd.po +new file mode 100644 +index 0000000..7179871 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-p910nd/po/hu/p910nd.po +@@ -0,0 +1,49 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"PO-Revision-Date: 2012-03-28 16:41+0200\n" ++"Last-Translator: Gábor \n" ++"Language-Team: none\n" ++"Language: hu\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n != 1);\n" ++"X-Generator: Pootle 2.0.4\n" ++ ++msgid "Bidirectional mode" ++msgstr "Kétirányú mód" ++ ++msgid "Device" ++msgstr "Eszköz" ++ ++msgid "" ++"First you have to install the packages to get support for USB (kmod-usb-" ++"printer) or parallel port (kmod-lp)." ++msgstr "" ++"A p910nd használata elÅ‘tt szükséges az USB (kmod-usb-printer), vagy " ++"párhuzamos (kmod-lp) portokat támogató csomagok telepítése." ++ ++msgid "Interface" ++msgstr "" ++ ++msgid "Port" ++msgstr "Port" ++ ++msgid "Settings" ++msgstr "Beállítások" ++ ++msgid "Specifies the interface to listen on." ++msgstr "" ++ ++msgid "TCP listener port." ++msgstr "TCP port" ++ ++msgid "enable" ++msgstr "Engedélyezés" ++ ++msgid "p910nd - Printer server" ++msgstr "p910nd - Nyomtató szerver" ++ ++#~ msgid "port_help" ++#~ msgstr "port_súgó" +diff --git a/feeds/luci/applications/luci-app-p910nd/po/it/p910nd.po b/feeds/luci/applications/luci-app-p910nd/po/it/p910nd.po +new file mode 100644 +index 0000000..47bf687 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-p910nd/po/it/p910nd.po +@@ -0,0 +1,55 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Report-Msgid-Bugs-To: \n" ++"POT-Creation-Date: 2009-05-19 19:36+0200\n" ++"PO-Revision-Date: 2014-08-05 11:23+0200\n" ++"Last-Translator: morganfw \n" ++"Language-Team: LANGUAGE \n" ++"Language: it\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n != 1);\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "Bidirectional mode" ++msgstr "Modalità bidirezionale" ++ ++msgid "Device" ++msgstr "Dispositivo" ++ ++msgid "" ++"First you have to install the packages to get support for USB (kmod-usb-" ++"printer) or parallel port (kmod-lp)." ++msgstr "" ++"Devi prima aver installato i pacchetti per avere il supporto dell'USB (kmod-" ++"usb-printer) o della porta parallela (kmod-lp)." ++ ++msgid "Interface" ++msgstr "Interfaccia" ++ ++msgid "Port" ++msgstr "Porta" ++ ++msgid "Settings" ++msgstr "Impostazioni" ++ ++msgid "Specifies the interface to listen on." ++msgstr "Specifica l'interfaccia per l'ascolto." ++ ++msgid "TCP listener port." ++msgstr "Porta d'ascolto TCP." ++ ++msgid "enable" ++msgstr "Attiva" ++ ++msgid "p910nd - Printer server" ++msgstr "p910nd - Server di stampa" ++ ++#~ msgid "port_help" ++#~ msgstr "Porta d'aiuto" ++ ++#~ msgid "p910nd listens on port 910+N. E.g. 9100 for the first printer." ++#~ msgstr "" ++#~ "p910nd è in ascolto sulla porta 910+N. Ad es. 9100 per la prima stampante." +diff --git a/feeds/luci/applications/luci-app-p910nd/po/ja/p910nd.po b/feeds/luci/applications/luci-app-p910nd/po/ja/p910nd.po +new file mode 100644 +index 0000000..42335ce +--- /dev/null ++++ b/feeds/luci/applications/luci-app-p910nd/po/ja/p910nd.po +@@ -0,0 +1,51 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Report-Msgid-Bugs-To: \n" ++"POT-Creation-Date: 2009-05-19 19:36+0200\n" ++"PO-Revision-Date: 2011-11-04 18:11+0200\n" ++"Last-Translator: Kentaro \n" ++"Language-Team: LANGUAGE \n" ++"Language: ja\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=1; plural=0;\n" ++"X-Generator: Pootle 2.0.4\n" ++ ++msgid "Bidirectional mode" ++msgstr "åŒæ–¹å‘モード" ++ ++msgid "Device" ++msgstr "デãƒã‚¤ã‚¹" ++ ++msgid "" ++"First you have to install the packages to get support for USB (kmod-usb-" ++"printer) or parallel port (kmod-lp)." ++msgstr "" ++"ã¾ãšåˆã‚ã«ã€USB(kmod-usb-printer)ã¾ãŸã¯ã€ãƒ‘ラレルãƒãƒ¼ãƒˆ(kmod-lp)をサãƒãƒ¼ãƒˆã™" ++"ã‚‹ãŸã‚ã®ãƒ‘ッケージをインストールã—ã¦ãã ã•ã„。" ++ ++msgid "Interface" ++msgstr "" ++ ++msgid "Port" ++msgstr "ãƒãƒ¼ãƒˆç•ªå·" ++ ++msgid "Settings" ++msgstr "設定" ++ ++msgid "Specifies the interface to listen on." ++msgstr "" ++ ++msgid "TCP listener port." ++msgstr "TCP接続待ã¡ãƒãƒ¼ãƒˆ" ++ ++msgid "enable" ++msgstr "有効" ++ ++msgid "p910nd - Printer server" ++msgstr "p910nd - プリンタサーãƒãƒ¼" ++ ++#~ msgid "port_help" ++#~ msgstr "port_help" +diff --git a/feeds/luci/applications/luci-app-p910nd/po/ms/p910nd.po b/feeds/luci/applications/luci-app-p910nd/po/ms/p910nd.po +new file mode 100644 +index 0000000..254fc66 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-p910nd/po/ms/p910nd.po +@@ -0,0 +1,43 @@ ++# p910nd.pot ++# generated from ./applications/luci-p910nd/luasrc/i18n/p910nd.en.lua ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Last-Translator: Automatically generated\n" ++"Language-Team: none\n" ++"Language: \n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++ ++msgid "Bidirectional mode" ++msgstr "" ++ ++msgid "Device" ++msgstr "" ++ ++msgid "" ++"First you have to install the packages to get support for USB (kmod-usb-" ++"printer) or parallel port (kmod-lp)." ++msgstr "" ++ ++msgid "Interface" ++msgstr "" ++ ++msgid "Port" ++msgstr "" ++ ++msgid "Settings" ++msgstr "" ++ ++msgid "Specifies the interface to listen on." ++msgstr "" ++ ++msgid "TCP listener port." ++msgstr "" ++ ++msgid "enable" ++msgstr "" ++ ++msgid "p910nd - Printer server" ++msgstr "" +diff --git a/feeds/luci/applications/luci-app-p910nd/po/no/p910nd.po b/feeds/luci/applications/luci-app-p910nd/po/no/p910nd.po +new file mode 100644 +index 0000000..3bf49c5 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-p910nd/po/no/p910nd.po +@@ -0,0 +1,47 @@ ++msgid "" ++msgstr "" ++"PO-Revision-Date: 2013-03-21 23:05+0200\n" ++"Last-Translator: protx \n" ++"Language: no\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n != 1);\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "Bidirectional mode" ++msgstr "Toveis modus (bidirectional)" ++ ++msgid "Device" ++msgstr "Enhet" ++ ++msgid "" ++"First you have to install the packages to get support for USB (kmod-usb-" ++"printer) or parallel port (kmod-lp)." ++msgstr "" ++"Du mÃ¥ først installere pakkene som gir støtte for USB (kmod-usb-printer) " ++"eller parallellport (kmod-lp) skriver." ++ ++msgid "Interface" ++msgstr "" ++ ++msgid "Port" ++msgstr "Port" ++ ++msgid "Settings" ++msgstr "Innstillinger" ++ ++msgid "Specifies the interface to listen on." ++msgstr "" ++ ++msgid "TCP listener port." ++msgstr "TCP lytte port." ++ ++msgid "enable" ++msgstr "Aktiver" ++ ++msgid "p910nd - Printer server" ++msgstr "p910nd - Skriverserver" ++ ++#~ msgid "port_help" ++#~ msgstr "" ++#~ "p910nd lytter pÃ¥ port 910+N. (N=0 blir port 9100 for første skriver)" +diff --git a/feeds/luci/applications/luci-app-p910nd/po/pl/p910nd.po b/feeds/luci/applications/luci-app-p910nd/po/pl/p910nd.po +new file mode 100644 +index 0000000..c5f611a +--- /dev/null ++++ b/feeds/luci/applications/luci-app-p910nd/po/pl/p910nd.po +@@ -0,0 +1,56 @@ ++# p910nd.pot ++# generated from ./applications/luci-p910nd/luasrc/i18n/p910nd.en.lua ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"PO-Revision-Date: 2014-07-02 19:31+0200\n" ++"Last-Translator: obsy \n" ++"Language-Team: none\n" ++"Language: pl\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 " ++"|| n%100>=20) ? 1 : 2);\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "Bidirectional mode" ++msgstr "Tryb dwukierunkowy" ++ ++msgid "Device" ++msgstr "UrzÄ…dzenie" ++ ++msgid "" ++"First you have to install the packages to get support for USB (kmod-usb-" ++"printer) or parallel port (kmod-lp)." ++msgstr "" ++"Po pierwsze, musisz zainstalować pakiety obsÅ‚ugujÄ…ce interfejs USB (kmod-" ++"usb-printer) lub LPT (kmod-lp)." ++ ++msgid "Interface" ++msgstr "Interfejs" ++ ++msgid "Port" ++msgstr "Port" ++ ++msgid "Settings" ++msgstr "Ustawienia" ++ ++msgid "Specifies the interface to listen on." ++msgstr "OkreÅ›la interfejs do nasÅ‚uchu." ++ ++msgid "TCP listener port." ++msgstr "Port nasÅ‚uchu TCP" ++ ++msgid "enable" ++msgstr "WÅ‚Ä…czony" ++ ++# W sambie usÅ‚uga też siÄ™ nazywa "network shares", wiÄ™c nie ma specjalnie potrzeby używania nazwy wÅ‚asnej demona "p910nd". ++msgid "p910nd - Printer server" ++msgstr "Serwer wydruku" ++ ++#~ msgid "port_help" ++#~ msgstr "port_help" ++ ++#~ msgid "p910nd listens on port 910+N. E.g. 9100 for the first printer." ++#~ msgstr "p910nd nasÅ‚uchuje na porcie 910X, np. 9100 dla pierwszej drukarki." +diff --git a/feeds/luci/applications/luci-app-p910nd/po/pt-br/p910nd.po b/feeds/luci/applications/luci-app-p910nd/po/pt-br/p910nd.po +new file mode 100644 +index 0000000..de7c429 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-p910nd/po/pt-br/p910nd.po +@@ -0,0 +1,57 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Report-Msgid-Bugs-To: \n" ++"POT-Creation-Date: 2009-06-10 03:41+0200\n" ++"PO-Revision-Date: 2014-06-21 19:02+0200\n" ++"Last-Translator: Éder \n" ++"Language-Team: LANGUAGE \n" ++"Language: pt_BR\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n > 1);\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "Bidirectional mode" ++msgstr "Modo bidirecional" ++ ++msgid "Device" ++msgstr "Dispositivo" ++ ++msgid "" ++"First you have to install the packages to get support for USB (kmod-usb-" ++"printer) or parallel port (kmod-lp)." ++msgstr "" ++"Primeiro você deve instalar os pacotes para obter suporte USB (kmod-usb-" ++"printer) ou porta paralela (kmod-lp)." ++ ++# 20140621: edersg: tradução ++msgid "Interface" ++msgstr "Interface" ++ ++msgid "Port" ++msgstr "Porta" ++ ++msgid "Settings" ++msgstr "Configurações" ++ ++# 20140621: edersg: tradução ++msgid "Specifies the interface to listen on." ++msgstr "Especifica a interface para escuta." ++ ++msgid "TCP listener port." ++msgstr "Porta TCP de escuta." ++ ++msgid "enable" ++msgstr "habilitado" ++ ++msgid "p910nd - Printer server" ++msgstr "p910nd - Servidor de impressão" ++ ++#~ msgid "port_help" ++#~ msgstr "" ++#~ "p910nd escuta na porta 910x. Por exemplo, 9100 para a primeira impressora." ++ ++#~ msgid "p910nd listens on port 910+N. E.g. 9100 for the first printer." ++#~ msgstr "p910nd escuta na porta 910+N. Ex. 9100 para a primeira impressora." +diff --git a/feeds/luci/applications/luci-app-p910nd/po/pt/p910nd.po b/feeds/luci/applications/luci-app-p910nd/po/pt/p910nd.po +new file mode 100644 +index 0000000..734967e +--- /dev/null ++++ b/feeds/luci/applications/luci-app-p910nd/po/pt/p910nd.po +@@ -0,0 +1,51 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Report-Msgid-Bugs-To: \n" ++"POT-Creation-Date: 2009-05-26 19:03+0200\n" ++"PO-Revision-Date: 2013-05-01 00:41+0200\n" ++"Last-Translator: pedromrgoncalves \n" ++"Language-Team: LANGUAGE \n" ++"Language: pt\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n != 1);\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "Bidirectional mode" ++msgstr "Modo bidirecional" ++ ++msgid "Device" ++msgstr "Dispositivo" ++ ++msgid "" ++"First you have to install the packages to get support for USB (kmod-usb-" ++"printer) or parallel port (kmod-lp)." ++msgstr "" ++"Primeiro você deve instalar os pacotes para obter suporte USB (kmod-usb-" ++"printer) ou porta paralela (kmod-lp)." ++ ++msgid "Interface" ++msgstr "" ++ ++msgid "Port" ++msgstr "Porta" ++ ++msgid "Settings" ++msgstr "Definições" ++ ++msgid "Specifies the interface to listen on." ++msgstr "" ++ ++msgid "TCP listener port." ++msgstr "Porta TCP ouvinte" ++ ++msgid "enable" ++msgstr "activar" ++ ++msgid "p910nd - Printer server" ++msgstr "P910nd - Servidor de impressão" ++ ++#~ msgid "p910nd listens on port 910+N. E.g. 9100 for the first printer." ++#~ msgstr "p910nd escuta na porta 910+N. Ex. 9100 para a primeira impressora." +diff --git a/feeds/luci/applications/luci-app-p910nd/po/ro/p910nd.po b/feeds/luci/applications/luci-app-p910nd/po/ro/p910nd.po +new file mode 100644 +index 0000000..7cad5c0 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-p910nd/po/ro/p910nd.po +@@ -0,0 +1,47 @@ ++# p910nd.pot ++# generated from ./applications/luci-p910nd/luasrc/i18n/p910nd.en.lua ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"PO-Revision-Date: 2014-06-29 20:02+0200\n" ++"Last-Translator: xxvirusxx \n" ++"Language-Team: none\n" ++"Language: ro\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=3; plural=(n==1 ? 0 : (n==0 || (n%100 > 0 && n%100 < " ++"20)) ? 1 : 2);;\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "Bidirectional mode" ++msgstr "" ++ ++msgid "Device" ++msgstr "Dispozitiv" ++ ++msgid "" ++"First you have to install the packages to get support for USB (kmod-usb-" ++"printer) or parallel port (kmod-lp)." ++msgstr "" ++ ++msgid "Interface" ++msgstr "Interfaţă" ++ ++msgid "Port" ++msgstr "Port" ++ ++msgid "Settings" ++msgstr "Setări" ++ ++msgid "Specifies the interface to listen on." ++msgstr "" ++ ++msgid "TCP listener port." ++msgstr "" ++ ++msgid "enable" ++msgstr "activează" ++ ++msgid "p910nd - Printer server" ++msgstr "" +diff --git a/feeds/luci/applications/luci-app-p910nd/po/ru/p910nd.po b/feeds/luci/applications/luci-app-p910nd/po/ru/p910nd.po +new file mode 100644 +index 0000000..923b22e +--- /dev/null ++++ b/feeds/luci/applications/luci-app-p910nd/po/ru/p910nd.po +@@ -0,0 +1,57 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: LuCI: p910nd\n" ++"Report-Msgid-Bugs-To: \n" ++"POT-Creation-Date: 2009-05-19 19:36+0200\n" ++"PO-Revision-Date: 2012-08-15 11:42+0300\n" ++"Last-Translator: Roman A. aka BasicXP \n" ++"Language-Team: Russian \n" ++"Language: ru\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%" ++"10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" ++"X-Generator: Pootle 2.0.4\n" ++"X-Poedit-SourceCharset: UTF-8\n" ++ ++msgid "Bidirectional mode" ++msgstr "Двунаправленный режим" ++ ++msgid "Device" ++msgstr "УÑтройÑтво" ++ ++msgid "" ++"First you have to install the packages to get support for USB (kmod-usb-" ++"printer) or parallel port (kmod-lp)." ++msgstr "" ++"Ð”Ð»Ñ Ð½Ð°Ñ‡Ð°Ð»Ð° вам необходимо уÑтановить пакеты Ð´Ð»Ñ Ð¿Ð¾Ð´Ð´ÐµÑ€Ð¶ÐºÐ¸ USB (kmod-usb-" ++"printer) или параллельного порта (kmod-lp)." ++ ++msgid "Interface" ++msgstr "" ++ ++msgid "Port" ++msgstr "Порт" ++ ++msgid "Settings" ++msgstr "ÐаÑтройки" ++ ++msgid "Specifies the interface to listen on." ++msgstr "" ++ ++msgid "TCP listener port." ++msgstr "ПроÑлушиваемый TCP-порт." ++ ++msgid "enable" ++msgstr "включить" ++ ++msgid "p910nd - Printer server" ++msgstr "p910nd - Ñервер печати" ++ ++#~ msgid "port_help" ++#~ msgstr "Помощь по портам" ++ ++#~ msgid "p910nd listens on port 910+N. E.g. 9100 for the first printer." ++#~ msgstr "" ++#~ "p910nd проÑлушивает порт 910+N. То еÑÑ‚ÑŒ 9100 - номер первого принтера." +diff --git a/feeds/luci/applications/luci-app-p910nd/po/sk/p910nd.po b/feeds/luci/applications/luci-app-p910nd/po/sk/p910nd.po +new file mode 100644 +index 0000000..5282dd7 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-p910nd/po/sk/p910nd.po +@@ -0,0 +1,41 @@ ++msgid "" ++msgstr "" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Last-Translator: Automatically generated\n" ++"Language-Team: none\n" ++"MIME-Version: 1.0\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n" ++ ++msgid "Bidirectional mode" ++msgstr "" ++ ++msgid "Device" ++msgstr "" ++ ++msgid "" ++"First you have to install the packages to get support for USB (kmod-usb-" ++"printer) or parallel port (kmod-lp)." ++msgstr "" ++ ++msgid "Interface" ++msgstr "" ++ ++msgid "Port" ++msgstr "" ++ ++msgid "Settings" ++msgstr "" ++ ++msgid "Specifies the interface to listen on." ++msgstr "" ++ ++msgid "TCP listener port." ++msgstr "" ++ ++msgid "enable" ++msgstr "" ++ ++msgid "p910nd - Printer server" ++msgstr "" +diff --git a/feeds/luci/applications/luci-app-p910nd/po/sv/p910nd.po b/feeds/luci/applications/luci-app-p910nd/po/sv/p910nd.po +new file mode 100644 +index 0000000..98febee +--- /dev/null ++++ b/feeds/luci/applications/luci-app-p910nd/po/sv/p910nd.po +@@ -0,0 +1,42 @@ ++msgid "" ++msgstr "" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Last-Translator: Automatically generated\n" ++"Language-Team: none\n" ++"Language: sv\n" ++"MIME-Version: 1.0\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n != 1);\n" ++ ++msgid "Bidirectional mode" ++msgstr "" ++ ++msgid "Device" ++msgstr "" ++ ++msgid "" ++"First you have to install the packages to get support for USB (kmod-usb-" ++"printer) or parallel port (kmod-lp)." ++msgstr "" ++ ++msgid "Interface" ++msgstr "" ++ ++msgid "Port" ++msgstr "" ++ ++msgid "Settings" ++msgstr "" ++ ++msgid "Specifies the interface to listen on." ++msgstr "" ++ ++msgid "TCP listener port." ++msgstr "" ++ ++msgid "enable" ++msgstr "" ++ ++msgid "p910nd - Printer server" ++msgstr "" +diff --git a/feeds/luci/applications/luci-app-p910nd/po/templates/p910nd.pot b/feeds/luci/applications/luci-app-p910nd/po/templates/p910nd.pot +new file mode 100644 +index 0000000..3674fdb +--- /dev/null ++++ b/feeds/luci/applications/luci-app-p910nd/po/templates/p910nd.pot +@@ -0,0 +1,34 @@ ++msgid "" ++msgstr "Content-Type: text/plain; charset=UTF-8" ++ ++msgid "Bidirectional mode" ++msgstr "" ++ ++msgid "Device" ++msgstr "" ++ ++msgid "" ++"First you have to install the packages to get support for USB (kmod-usb-" ++"printer) or parallel port (kmod-lp)." ++msgstr "" ++ ++msgid "Interface" ++msgstr "" ++ ++msgid "Port" ++msgstr "" ++ ++msgid "Settings" ++msgstr "" ++ ++msgid "Specifies the interface to listen on." ++msgstr "" ++ ++msgid "TCP listener port." ++msgstr "" ++ ++msgid "enable" ++msgstr "" ++ ++msgid "p910nd - Printer server" ++msgstr "" +diff --git a/feeds/luci/applications/luci-app-p910nd/po/tr/p910nd.po b/feeds/luci/applications/luci-app-p910nd/po/tr/p910nd.po +new file mode 100644 +index 0000000..ed69a01 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-p910nd/po/tr/p910nd.po +@@ -0,0 +1,46 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"PO-Revision-Date: 2012-10-11 23:24+0200\n" ++"Last-Translator: vincenzo \n" ++"Language-Team: none\n" ++"Language: tr\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=1; plural=0;\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "Bidirectional mode" ++msgstr "Çift Yönlü Mod" ++ ++msgid "Device" ++msgstr "Aygıt" ++ ++msgid "" ++"First you have to install the packages to get support for USB (kmod-usb-" ++"printer) or parallel port (kmod-lp)." ++msgstr "" ++"USB (kmod-usb-yazıcı) veya paralel port (kmod-lp) kullanabilmek için destek " ++"paketi yüklemeniz gerekebilir." ++ ++msgid "Interface" ++msgstr "" ++ ++msgid "Port" ++msgstr "Port" ++ ++msgid "Settings" ++msgstr "Ayarlar" ++ ++msgid "Specifies the interface to listen on." ++msgstr "" ++ ++msgid "TCP listener port." ++msgstr "Dinlemedeki TCP portları" ++ ++msgid "enable" ++msgstr "EtkinleÅŸtir" ++ ++msgid "p910nd - Printer server" ++msgstr "P910nd_Yazıcı Sunucusu" +diff --git a/feeds/luci/applications/luci-app-p910nd/po/uk/p910nd.po b/feeds/luci/applications/luci-app-p910nd/po/uk/p910nd.po +new file mode 100644 +index 0000000..237054d +--- /dev/null ++++ b/feeds/luci/applications/luci-app-p910nd/po/uk/p910nd.po +@@ -0,0 +1,47 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"PO-Revision-Date: 2013-05-26 18:35+0200\n" ++"Last-Translator: Yurii \n" ++"Language-Team: none\n" ++"Language: uk\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%" ++"10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "Bidirectional mode" ++msgstr "Двонаправлений режим" ++ ++msgid "Device" ++msgstr "ПриÑтрій" ++ ++msgid "" ++"First you have to install the packages to get support for USB (kmod-usb-" ++"printer) or parallel port (kmod-lp)." ++msgstr "" ++"Спочатку вам Ñлід інÑталювати пакети Ð´Ð»Ñ Ð¿Ñ–Ð´Ñ‚Ñ€Ð¸Ð¼ÐºÐ¸ USB (kmod-usb-printer) " ++"або паралельного порту (kmod-lp)." ++ ++msgid "Interface" ++msgstr "" ++ ++msgid "Port" ++msgstr "Порт" ++ ++msgid "Settings" ++msgstr "Параметри" ++ ++msgid "Specifies the interface to listen on." ++msgstr "" ++ ++msgid "TCP listener port." ++msgstr "Порт TCP, що проÑлуховуєтьÑÑ" ++ ++msgid "enable" ++msgstr "Увімкнути" ++ ++msgid "p910nd - Printer server" ++msgstr "p910nd - Ñервер друку" +diff --git a/feeds/luci/applications/luci-app-p910nd/po/vi/p910nd.po b/feeds/luci/applications/luci-app-p910nd/po/vi/p910nd.po +new file mode 100644 +index 0000000..10035b8 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-p910nd/po/vi/p910nd.po +@@ -0,0 +1,52 @@ ++# p910nd.pot ++# generated from ./applications/luci-p910nd/luasrc/i18n/p910nd.en.lua ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Report-Msgid-Bugs-To: \n" ++"POT-Creation-Date: 2009-08-16 06:58+0200\n" ++"PO-Revision-Date: 2009-08-13 04:03+0200\n" ++"Last-Translator: Hong Phuc Dang \n" ++"Language-Team: LANGUAGE \n" ++"Language: \n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"X-Generator: Pootle 1.1.0\n" ++ ++msgid "Bidirectional mode" ++msgstr "Chế Ä‘á»™ 2 chiá»u" ++ ++msgid "Device" ++msgstr "" ++ ++msgid "" ++"First you have to install the packages to get support for USB (kmod-usb-" ++"printer) or parallel port (kmod-lp)." ++msgstr "" ++"TrÆ°á»›c tiên, bạn cần phải cài đặt các gói để há»— trợ cho cổng USB (kmod-usb-" ++"in), hoặc cổng song song (kmod-lp)." ++ ++msgid "Interface" ++msgstr "" ++ ++msgid "Port" ++msgstr "" ++ ++msgid "Settings" ++msgstr "" ++ ++msgid "Specifies the interface to listen on." ++msgstr "" ++ ++msgid "TCP listener port." ++msgstr "" ++ ++msgid "enable" ++msgstr "" ++ ++msgid "p910nd - Printer server" ++msgstr "p910nd - Máy in chủ" ++ ++#~ msgid "p910nd listens on port 910+N. E.g. 9100 for the first printer." ++#~ msgstr "p910nd tiếp thu ở cổng 910+N. E.g. 9100 cho máy in đầu tiên." +diff --git a/feeds/luci/applications/luci-app-p910nd/po/zh-cn/p910nd.po b/feeds/luci/applications/luci-app-p910nd/po/zh-cn/p910nd.po +new file mode 100644 +index 0000000..c14e2e7 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-p910nd/po/zh-cn/p910nd.po +@@ -0,0 +1,49 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Report-Msgid-Bugs-To: \n" ++"POT-Creation-Date: 2009-05-19 19:35+0200\n" ++"PO-Revision-Date: 2014-06-22 14:36+0200\n" ++"Last-Translator: phantasm131 \n" ++"Language-Team: QQ Group 75543259 \n" ++"Language: zh_CN\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=1; plural=0;\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "Bidirectional mode" ++msgstr "åŒå‘模å¼" ++ ++msgid "Device" ++msgstr "设备" ++ ++msgid "" ++"First you have to install the packages to get support for USB (kmod-usb-" ++"printer) or parallel port (kmod-lp)." ++msgstr "必须安装支æŒUSB打å°æœºçš„驱动(kmod-usb-printer)或者并å£é©±åŠ¨(kmod-lp)" ++ ++msgid "Interface" ++msgstr "接å£" ++ ++msgid "Port" ++msgstr "端å£" ++ ++msgid "Settings" ++msgstr "设置" ++ ++msgid "Specifies the interface to listen on." ++msgstr "指定监å¬ç«¯å£" ++ ++msgid "TCP listener port." ++msgstr "TCP监å¬ç«¯å£" ++ ++msgid "enable" ++msgstr "å¯ç”¨" ++ ++msgid "p910nd - Printer server" ++msgstr "打å°æœåŠ¡å™¨" ++ ++#~ msgid "p910nd listens on port 910+N. E.g. 9100 for the first printer." ++#~ msgstr "p910nd 的监å¬ç«¯å£æ˜¯910+N,举例:9100用于监å¬ç¬¬ä¸€å°æ‰“å°æœº" +diff --git a/feeds/luci/applications/luci-app-p910nd/po/zh-tw/p910nd.po b/feeds/luci/applications/luci-app-p910nd/po/zh-tw/p910nd.po +new file mode 100644 +index 0000000..7d6c080 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-p910nd/po/zh-tw/p910nd.po +@@ -0,0 +1,45 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"PO-Revision-Date: 2014-05-18 20:03+0200\n" ++"Last-Translator: omnistack \n" ++"Language-Team: none\n" ++"Language: zh_TW\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=1; plural=0;\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "Bidirectional mode" ++msgstr "é›™å‘模å¼" ++ ++msgid "Device" ++msgstr "設備" ++ ++msgid "" ++"First you have to install the packages to get support for USB (kmod-usb-" ++"printer) or parallel port (kmod-lp)." ++msgstr "" ++"首先你必須安è£è»Ÿé«”包以便ç²å¾—USB (kmod-usb-printer)或串列埠(kmod-lp)的支æ´." ++ ++msgid "Interface" ++msgstr "" ++ ++msgid "Port" ++msgstr "埠" ++ ++msgid "Settings" ++msgstr "設定值" ++ ++msgid "Specifies the interface to listen on." ++msgstr "" ++ ++msgid "TCP listener port." ++msgstr "è†è½TCP埠" ++ ++msgid "enable" ++msgstr "啟用" ++ ++msgid "p910nd - Printer server" ++msgstr "p910nd - å°è¡¨æ©Ÿä¼ºæœå™¨" +diff --git a/feeds/luci/applications/luci-app-p910nd/root/etc/uci-defaults/luci-p910nd b/feeds/luci/applications/luci-app-p910nd/root/etc/uci-defaults/luci-p910nd +new file mode 100755 +index 0000000..80f6d62 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-p910nd/root/etc/uci-defaults/luci-p910nd +@@ -0,0 +1,11 @@ ++#!/bin/sh ++ ++uci -q batch <<-EOF >/dev/null ++ delete ucitrack.@p910nd[-1] ++ add ucitrack p910nd ++ set ucitrack.@p910nd[-1].init=p910nd ++ commit ucitrack ++EOF ++ ++rm -f /tmp/luci-indexcache ++exit 0 +diff --git a/feeds/luci/applications/luci-app-pbx-voicemail/COPYING b/feeds/luci/applications/luci-app-pbx-voicemail/COPYING +new file mode 100644 +index 0000000..94a9ed0 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-pbx-voicemail/COPYING +@@ -0,0 +1,674 @@ ++ GNU GENERAL PUBLIC LICENSE ++ Version 3, 29 June 2007 ++ ++ Copyright (C) 2007 Free Software Foundation, Inc. ++ Everyone is permitted to copy and distribute verbatim copies ++ of this license document, but changing it is not allowed. ++ ++ Preamble ++ ++ The GNU General Public License is a free, copyleft license for ++software and other kinds of works. ++ ++ The licenses for most software and other practical works are designed ++to take away your freedom to share and change the works. By contrast, ++the GNU General Public License is intended to guarantee your freedom to ++share and change all versions of a program--to make sure it remains free ++software for all its users. We, the Free Software Foundation, use the ++GNU General Public License for most of our software; it applies also to ++any other work released this way by its authors. You can apply it to ++your programs, too. ++ ++ When we speak of free software, we are referring to freedom, not ++price. Our General Public Licenses are designed to make sure that you ++have the freedom to distribute copies of free software (and charge for ++them if you wish), that you receive source code or can get it if you ++want it, that you can change the software or use pieces of it in new ++free programs, and that you know you can do these things. ++ ++ To protect your rights, we need to prevent others from denying you ++these rights or asking you to surrender the rights. Therefore, you have ++certain responsibilities if you distribute copies of the software, or if ++you modify it: responsibilities to respect the freedom of others. ++ ++ For example, if you distribute copies of such a program, whether ++gratis or for a fee, you must pass on to the recipients the same ++freedoms that you received. You must make sure that they, too, receive ++or can get the source code. And you must show them these terms so they ++know their rights. ++ ++ Developers that use the GNU GPL protect your rights with two steps: ++(1) assert copyright on the software, and (2) offer you this License ++giving you legal permission to copy, distribute and/or modify it. ++ ++ For the developers' and authors' protection, the GPL clearly explains ++that there is no warranty for this free software. For both users' and ++authors' sake, the GPL requires that modified versions be marked as ++changed, so that their problems will not be attributed erroneously to ++authors of previous versions. ++ ++ Some devices are designed to deny users access to install or run ++modified versions of the software inside them, although the manufacturer ++can do so. This is fundamentally incompatible with the aim of ++protecting users' freedom to change the software. The systematic ++pattern of such abuse occurs in the area of products for individuals to ++use, which is precisely where it is most unacceptable. Therefore, we ++have designed this version of the GPL to prohibit the practice for those ++products. If such problems arise substantially in other domains, we ++stand ready to extend this provision to those domains in future versions ++of the GPL, as needed to protect the freedom of users. ++ ++ Finally, every program is threatened constantly by software patents. ++States should not allow patents to restrict development and use of ++software on general-purpose computers, but in those that do, we wish to ++avoid the special danger that patents applied to a free program could ++make it effectively proprietary. To prevent this, the GPL assures that ++patents cannot be used to render the program non-free. ++ ++ The precise terms and conditions for copying, distribution and ++modification follow. ++ ++ TERMS AND CONDITIONS ++ ++ 0. Definitions. ++ ++ "This License" refers to version 3 of the GNU General Public License. ++ ++ "Copyright" also means copyright-like laws that apply to other kinds of ++works, such as semiconductor masks. ++ ++ "The Program" refers to any copyrightable work licensed under this ++License. Each licensee is addressed as "you". "Licensees" and ++"recipients" may be individuals or organizations. ++ ++ To "modify" a work means to copy from or adapt all or part of the work ++in a fashion requiring copyright permission, other than the making of an ++exact copy. The resulting work is called a "modified version" of the ++earlier work or a work "based on" the earlier work. ++ ++ A "covered work" means either the unmodified Program or a work based ++on the Program. ++ ++ To "propagate" a work means to do anything with it that, without ++permission, would make you directly or secondarily liable for ++infringement under applicable copyright law, except executing it on a ++computer or modifying a private copy. Propagation includes copying, ++distribution (with or without modification), making available to the ++public, and in some countries other activities as well. ++ ++ To "convey" a work means any kind of propagation that enables other ++parties to make or receive copies. Mere interaction with a user through ++a computer network, with no transfer of a copy, is not conveying. ++ ++ An interactive user interface displays "Appropriate Legal Notices" ++to the extent that it includes a convenient and prominently visible ++feature that (1) displays an appropriate copyright notice, and (2) ++tells the user that there is no warranty for the work (except to the ++extent that warranties are provided), that licensees may convey the ++work under this License, and how to view a copy of this License. If ++the interface presents a list of user commands or options, such as a ++menu, a prominent item in the list meets this criterion. ++ ++ 1. Source Code. ++ ++ The "source code" for a work means the preferred form of the work ++for making modifications to it. "Object code" means any non-source ++form of a work. ++ ++ A "Standard Interface" means an interface that either is an official ++standard defined by a recognized standards body, or, in the case of ++interfaces specified for a particular programming language, one that ++is widely used among developers working in that language. ++ ++ The "System Libraries" of an executable work include anything, other ++than the work as a whole, that (a) is included in the normal form of ++packaging a Major Component, but which is not part of that Major ++Component, and (b) serves only to enable use of the work with that ++Major Component, or to implement a Standard Interface for which an ++implementation is available to the public in source code form. A ++"Major Component", in this context, means a major essential component ++(kernel, window system, and so on) of the specific operating system ++(if any) on which the executable work runs, or a compiler used to ++produce the work, or an object code interpreter used to run it. ++ ++ The "Corresponding Source" for a work in object code form means all ++the source code needed to generate, install, and (for an executable ++work) run the object code and to modify the work, including scripts to ++control those activities. However, it does not include the work's ++System Libraries, or general-purpose tools or generally available free ++programs which are used unmodified in performing those activities but ++which are not part of the work. For example, Corresponding Source ++includes interface definition files associated with source files for ++the work, and the source code for shared libraries and dynamically ++linked subprograms that the work is specifically designed to require, ++such as by intimate data communication or control flow between those ++subprograms and other parts of the work. ++ ++ The Corresponding Source need not include anything that users ++can regenerate automatically from other parts of the Corresponding ++Source. ++ ++ The Corresponding Source for a work in source code form is that ++same work. ++ ++ 2. Basic Permissions. ++ ++ All rights granted under this License are granted for the term of ++copyright on the Program, and are irrevocable provided the stated ++conditions are met. This License explicitly affirms your unlimited ++permission to run the unmodified Program. The output from running a ++covered work is covered by this License only if the output, given its ++content, constitutes a covered work. This License acknowledges your ++rights of fair use or other equivalent, as provided by copyright law. ++ ++ You may make, run and propagate covered works that you do not ++convey, without conditions so long as your license otherwise remains ++in force. You may convey covered works to others for the sole purpose ++of having them make modifications exclusively for you, or provide you ++with facilities for running those works, provided that you comply with ++the terms of this License in conveying all material for which you do ++not control copyright. Those thus making or running the covered works ++for you must do so exclusively on your behalf, under your direction ++and control, on terms that prohibit them from making any copies of ++your copyrighted material outside their relationship with you. ++ ++ Conveying under any other circumstances is permitted solely under ++the conditions stated below. Sublicensing is not allowed; section 10 ++makes it unnecessary. ++ ++ 3. Protecting Users' Legal Rights From Anti-Circumvention Law. ++ ++ No covered work shall be deemed part of an effective technological ++measure under any applicable law fulfilling obligations under article ++11 of the WIPO copyright treaty adopted on 20 December 1996, or ++similar laws prohibiting or restricting circumvention of such ++measures. ++ ++ When you convey a covered work, you waive any legal power to forbid ++circumvention of technological measures to the extent such circumvention ++is effected by exercising rights under this License with respect to ++the covered work, and you disclaim any intention to limit operation or ++modification of the work as a means of enforcing, against the work's ++users, your or third parties' legal rights to forbid circumvention of ++technological measures. ++ ++ 4. Conveying Verbatim Copies. ++ ++ You may convey verbatim copies of the Program's source code as you ++receive it, in any medium, provided that you conspicuously and ++appropriately publish on each copy an appropriate copyright notice; ++keep intact all notices stating that this License and any ++non-permissive terms added in accord with section 7 apply to the code; ++keep intact all notices of the absence of any warranty; and give all ++recipients a copy of this License along with the Program. ++ ++ You may charge any price or no price for each copy that you convey, ++and you may offer support or warranty protection for a fee. ++ ++ 5. Conveying Modified Source Versions. ++ ++ You may convey a work based on the Program, or the modifications to ++produce it from the Program, in the form of source code under the ++terms of section 4, provided that you also meet all of these conditions: ++ ++ a) The work must carry prominent notices stating that you modified ++ it, and giving a relevant date. ++ ++ b) The work must carry prominent notices stating that it is ++ released under this License and any conditions added under section ++ 7. This requirement modifies the requirement in section 4 to ++ "keep intact all notices". ++ ++ c) You must license the entire work, as a whole, under this ++ License to anyone who comes into possession of a copy. This ++ License will therefore apply, along with any applicable section 7 ++ additional terms, to the whole of the work, and all its parts, ++ regardless of how they are packaged. This License gives no ++ permission to license the work in any other way, but it does not ++ invalidate such permission if you have separately received it. ++ ++ d) If the work has interactive user interfaces, each must display ++ Appropriate Legal Notices; however, if the Program has interactive ++ interfaces that do not display Appropriate Legal Notices, your ++ work need not make them do so. ++ ++ A compilation of a covered work with other separate and independent ++works, which are not by their nature extensions of the covered work, ++and which are not combined with it such as to form a larger program, ++in or on a volume of a storage or distribution medium, is called an ++"aggregate" if the compilation and its resulting copyright are not ++used to limit the access or legal rights of the compilation's users ++beyond what the individual works permit. Inclusion of a covered work ++in an aggregate does not cause this License to apply to the other ++parts of the aggregate. ++ ++ 6. Conveying Non-Source Forms. ++ ++ You may convey a covered work in object code form under the terms ++of sections 4 and 5, provided that you also convey the ++machine-readable Corresponding Source under the terms of this License, ++in one of these ways: ++ ++ a) Convey the object code in, or embodied in, a physical product ++ (including a physical distribution medium), accompanied by the ++ Corresponding Source fixed on a durable physical medium ++ customarily used for software interchange. ++ ++ b) Convey the object code in, or embodied in, a physical product ++ (including a physical distribution medium), accompanied by a ++ written offer, valid for at least three years and valid for as ++ long as you offer spare parts or customer support for that product ++ model, to give anyone who possesses the object code either (1) a ++ copy of the Corresponding Source for all the software in the ++ product that is covered by this License, on a durable physical ++ medium customarily used for software interchange, for a price no ++ more than your reasonable cost of physically performing this ++ conveying of source, or (2) access to copy the ++ Corresponding Source from a network server at no charge. ++ ++ c) Convey individual copies of the object code with a copy of the ++ written offer to provide the Corresponding Source. This ++ alternative is allowed only occasionally and noncommercially, and ++ only if you received the object code with such an offer, in accord ++ with subsection 6b. ++ ++ d) Convey the object code by offering access from a designated ++ place (gratis or for a charge), and offer equivalent access to the ++ Corresponding Source in the same way through the same place at no ++ further charge. You need not require recipients to copy the ++ Corresponding Source along with the object code. If the place to ++ copy the object code is a network server, the Corresponding Source ++ may be on a different server (operated by you or a third party) ++ that supports equivalent copying facilities, provided you maintain ++ clear directions next to the object code saying where to find the ++ Corresponding Source. Regardless of what server hosts the ++ Corresponding Source, you remain obligated to ensure that it is ++ available for as long as needed to satisfy these requirements. ++ ++ e) Convey the object code using peer-to-peer transmission, provided ++ you inform other peers where the object code and Corresponding ++ Source of the work are being offered to the general public at no ++ charge under subsection 6d. ++ ++ A separable portion of the object code, whose source code is excluded ++from the Corresponding Source as a System Library, need not be ++included in conveying the object code work. ++ ++ A "User Product" is either (1) a "consumer product", which means any ++tangible personal property which is normally used for personal, family, ++or household purposes, or (2) anything designed or sold for incorporation ++into a dwelling. In determining whether a product is a consumer product, ++doubtful cases shall be resolved in favor of coverage. For a particular ++product received by a particular user, "normally used" refers to a ++typical or common use of that class of product, regardless of the status ++of the particular user or of the way in which the particular user ++actually uses, or expects or is expected to use, the product. A product ++is a consumer product regardless of whether the product has substantial ++commercial, industrial or non-consumer uses, unless such uses represent ++the only significant mode of use of the product. ++ ++ "Installation Information" for a User Product means any methods, ++procedures, authorization keys, or other information required to install ++and execute modified versions of a covered work in that User Product from ++a modified version of its Corresponding Source. The information must ++suffice to ensure that the continued functioning of the modified object ++code is in no case prevented or interfered with solely because ++modification has been made. ++ ++ If you convey an object code work under this section in, or with, or ++specifically for use in, a User Product, and the conveying occurs as ++part of a transaction in which the right of possession and use of the ++User Product is transferred to the recipient in perpetuity or for a ++fixed term (regardless of how the transaction is characterized), the ++Corresponding Source conveyed under this section must be accompanied ++by the Installation Information. But this requirement does not apply ++if neither you nor any third party retains the ability to install ++modified object code on the User Product (for example, the work has ++been installed in ROM). ++ ++ The requirement to provide Installation Information does not include a ++requirement to continue to provide support service, warranty, or updates ++for a work that has been modified or installed by the recipient, or for ++the User Product in which it has been modified or installed. Access to a ++network may be denied when the modification itself materially and ++adversely affects the operation of the network or violates the rules and ++protocols for communication across the network. ++ ++ Corresponding Source conveyed, and Installation Information provided, ++in accord with this section must be in a format that is publicly ++documented (and with an implementation available to the public in ++source code form), and must require no special password or key for ++unpacking, reading or copying. ++ ++ 7. Additional Terms. ++ ++ "Additional permissions" are terms that supplement the terms of this ++License by making exceptions from one or more of its conditions. ++Additional permissions that are applicable to the entire Program shall ++be treated as though they were included in this License, to the extent ++that they are valid under applicable law. If additional permissions ++apply only to part of the Program, that part may be used separately ++under those permissions, but the entire Program remains governed by ++this License without regard to the additional permissions. ++ ++ When you convey a copy of a covered work, you may at your option ++remove any additional permissions from that copy, or from any part of ++it. (Additional permissions may be written to require their own ++removal in certain cases when you modify the work.) You may place ++additional permissions on material, added by you to a covered work, ++for which you have or can give appropriate copyright permission. ++ ++ Notwithstanding any other provision of this License, for material you ++add to a covered work, you may (if authorized by the copyright holders of ++that material) supplement the terms of this License with terms: ++ ++ a) Disclaiming warranty or limiting liability differently from the ++ terms of sections 15 and 16 of this License; or ++ ++ b) Requiring preservation of specified reasonable legal notices or ++ author attributions in that material or in the Appropriate Legal ++ Notices displayed by works containing it; or ++ ++ c) Prohibiting misrepresentation of the origin of that material, or ++ requiring that modified versions of such material be marked in ++ reasonable ways as different from the original version; or ++ ++ d) Limiting the use for publicity purposes of names of licensors or ++ authors of the material; or ++ ++ e) Declining to grant rights under trademark law for use of some ++ trade names, trademarks, or service marks; or ++ ++ f) Requiring indemnification of licensors and authors of that ++ material by anyone who conveys the material (or modified versions of ++ it) with contractual assumptions of liability to the recipient, for ++ any liability that these contractual assumptions directly impose on ++ those licensors and authors. ++ ++ All other non-permissive additional terms are considered "further ++restrictions" within the meaning of section 10. If the Program as you ++received it, or any part of it, contains a notice stating that it is ++governed by this License along with a term that is a further ++restriction, you may remove that term. If a license document contains ++a further restriction but permits relicensing or conveying under this ++License, you may add to a covered work material governed by the terms ++of that license document, provided that the further restriction does ++not survive such relicensing or conveying. ++ ++ If you add terms to a covered work in accord with this section, you ++must place, in the relevant source files, a statement of the ++additional terms that apply to those files, or a notice indicating ++where to find the applicable terms. ++ ++ Additional terms, permissive or non-permissive, may be stated in the ++form of a separately written license, or stated as exceptions; ++the above requirements apply either way. ++ ++ 8. Termination. ++ ++ You may not propagate or modify a covered work except as expressly ++provided under this License. Any attempt otherwise to propagate or ++modify it is void, and will automatically terminate your rights under ++this License (including any patent licenses granted under the third ++paragraph of section 11). ++ ++ However, if you cease all violation of this License, then your ++license from a particular copyright holder is reinstated (a) ++provisionally, unless and until the copyright holder explicitly and ++finally terminates your license, and (b) permanently, if the copyright ++holder fails to notify you of the violation by some reasonable means ++prior to 60 days after the cessation. ++ ++ Moreover, your license from a particular copyright holder is ++reinstated permanently if the copyright holder notifies you of the ++violation by some reasonable means, this is the first time you have ++received notice of violation of this License (for any work) from that ++copyright holder, and you cure the violation prior to 30 days after ++your receipt of the notice. ++ ++ Termination of your rights under this section does not terminate the ++licenses of parties who have received copies or rights from you under ++this License. If your rights have been terminated and not permanently ++reinstated, you do not qualify to receive new licenses for the same ++material under section 10. ++ ++ 9. Acceptance Not Required for Having Copies. ++ ++ You are not required to accept this License in order to receive or ++run a copy of the Program. Ancillary propagation of a covered work ++occurring solely as a consequence of using peer-to-peer transmission ++to receive a copy likewise does not require acceptance. However, ++nothing other than this License grants you permission to propagate or ++modify any covered work. These actions infringe copyright if you do ++not accept this License. Therefore, by modifying or propagating a ++covered work, you indicate your acceptance of this License to do so. ++ ++ 10. Automatic Licensing of Downstream Recipients. ++ ++ Each time you convey a covered work, the recipient automatically ++receives a license from the original licensors, to run, modify and ++propagate that work, subject to this License. You are not responsible ++for enforcing compliance by third parties with this License. ++ ++ An "entity transaction" is a transaction transferring control of an ++organization, or substantially all assets of one, or subdividing an ++organization, or merging organizations. If propagation of a covered ++work results from an entity transaction, each party to that ++transaction who receives a copy of the work also receives whatever ++licenses to the work the party's predecessor in interest had or could ++give under the previous paragraph, plus a right to possession of the ++Corresponding Source of the work from the predecessor in interest, if ++the predecessor has it or can get it with reasonable efforts. ++ ++ You may not impose any further restrictions on the exercise of the ++rights granted or affirmed under this License. For example, you may ++not impose a license fee, royalty, or other charge for exercise of ++rights granted under this License, and you may not initiate litigation ++(including a cross-claim or counterclaim in a lawsuit) alleging that ++any patent claim is infringed by making, using, selling, offering for ++sale, or importing the Program or any portion of it. ++ ++ 11. Patents. ++ ++ A "contributor" is a copyright holder who authorizes use under this ++License of the Program or a work on which the Program is based. The ++work thus licensed is called the contributor's "contributor version". ++ ++ A contributor's "essential patent claims" are all patent claims ++owned or controlled by the contributor, whether already acquired or ++hereafter acquired, that would be infringed by some manner, permitted ++by this License, of making, using, or selling its contributor version, ++but do not include claims that would be infringed only as a ++consequence of further modification of the contributor version. For ++purposes of this definition, "control" includes the right to grant ++patent sublicenses in a manner consistent with the requirements of ++this License. ++ ++ Each contributor grants you a non-exclusive, worldwide, royalty-free ++patent license under the contributor's essential patent claims, to ++make, use, sell, offer for sale, import and otherwise run, modify and ++propagate the contents of its contributor version. ++ ++ In the following three paragraphs, a "patent license" is any express ++agreement or commitment, however denominated, not to enforce a patent ++(such as an express permission to practice a patent or covenant not to ++sue for patent infringement). To "grant" such a patent license to a ++party means to make such an agreement or commitment not to enforce a ++patent against the party. ++ ++ If you convey a covered work, knowingly relying on a patent license, ++and the Corresponding Source of the work is not available for anyone ++to copy, free of charge and under the terms of this License, through a ++publicly available network server or other readily accessible means, ++then you must either (1) cause the Corresponding Source to be so ++available, or (2) arrange to deprive yourself of the benefit of the ++patent license for this particular work, or (3) arrange, in a manner ++consistent with the requirements of this License, to extend the patent ++license to downstream recipients. "Knowingly relying" means you have ++actual knowledge that, but for the patent license, your conveying the ++covered work in a country, or your recipient's use of the covered work ++in a country, would infringe one or more identifiable patents in that ++country that you have reason to believe are valid. ++ ++ If, pursuant to or in connection with a single transaction or ++arrangement, you convey, or propagate by procuring conveyance of, a ++covered work, and grant a patent license to some of the parties ++receiving the covered work authorizing them to use, propagate, modify ++or convey a specific copy of the covered work, then the patent license ++you grant is automatically extended to all recipients of the covered ++work and works based on it. ++ ++ A patent license is "discriminatory" if it does not include within ++the scope of its coverage, prohibits the exercise of, or is ++conditioned on the non-exercise of one or more of the rights that are ++specifically granted under this License. You may not convey a covered ++work if you are a party to an arrangement with a third party that is ++in the business of distributing software, under which you make payment ++to the third party based on the extent of your activity of conveying ++the work, and under which the third party grants, to any of the ++parties who would receive the covered work from you, a discriminatory ++patent license (a) in connection with copies of the covered work ++conveyed by you (or copies made from those copies), or (b) primarily ++for and in connection with specific products or compilations that ++contain the covered work, unless you entered into that arrangement, ++or that patent license was granted, prior to 28 March 2007. ++ ++ Nothing in this License shall be construed as excluding or limiting ++any implied license or other defenses to infringement that may ++otherwise be available to you under applicable patent law. ++ ++ 12. No Surrender of Others' Freedom. ++ ++ If conditions are imposed on you (whether by court order, agreement or ++otherwise) that contradict the conditions of this License, they do not ++excuse you from the conditions of this License. If you cannot convey a ++covered work so as to satisfy simultaneously your obligations under this ++License and any other pertinent obligations, then as a consequence you may ++not convey it at all. For example, if you agree to terms that obligate you ++to collect a royalty for further conveying from those to whom you convey ++the Program, the only way you could satisfy both those terms and this ++License would be to refrain entirely from conveying the Program. ++ ++ 13. Use with the GNU Affero General Public License. ++ ++ Notwithstanding any other provision of this License, you have ++permission to link or combine any covered work with a work licensed ++under version 3 of the GNU Affero General Public License into a single ++combined work, and to convey the resulting work. The terms of this ++License will continue to apply to the part which is the covered work, ++but the special requirements of the GNU Affero General Public License, ++section 13, concerning interaction through a network will apply to the ++combination as such. ++ ++ 14. Revised Versions of this License. ++ ++ The Free Software Foundation may publish revised and/or new versions of ++the GNU General Public License from time to time. Such new versions will ++be similar in spirit to the present version, but may differ in detail to ++address new problems or concerns. ++ ++ Each version is given a distinguishing version number. If the ++Program specifies that a certain numbered version of the GNU General ++Public License "or any later version" applies to it, you have the ++option of following the terms and conditions either of that numbered ++version or of any later version published by the Free Software ++Foundation. If the Program does not specify a version number of the ++GNU General Public License, you may choose any version ever published ++by the Free Software Foundation. ++ ++ If the Program specifies that a proxy can decide which future ++versions of the GNU General Public License can be used, that proxy's ++public statement of acceptance of a version permanently authorizes you ++to choose that version for the Program. ++ ++ Later license versions may give you additional or different ++permissions. However, no additional obligations are imposed on any ++author or copyright holder as a result of your choosing to follow a ++later version. ++ ++ 15. Disclaimer of Warranty. ++ ++ THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY ++APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT ++HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY ++OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, ++THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR ++PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM ++IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ++ALL NECESSARY SERVICING, REPAIR OR CORRECTION. ++ ++ 16. Limitation of Liability. ++ ++ IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING ++WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS ++THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY ++GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE ++USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF ++DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD ++PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), ++EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF ++SUCH DAMAGES. ++ ++ 17. Interpretation of Sections 15 and 16. ++ ++ If the disclaimer of warranty and limitation of liability provided ++above cannot be given local legal effect according to their terms, ++reviewing courts shall apply local law that most closely approximates ++an absolute waiver of all civil liability in connection with the ++Program, unless a warranty or assumption of liability accompanies a ++copy of the Program in return for a fee. ++ ++ END OF TERMS AND CONDITIONS ++ ++ How to Apply These Terms to Your New Programs ++ ++ If you develop a new program, and you want it to be of the greatest ++possible use to the public, the best way to achieve this is to make it ++free software which everyone can redistribute and change under these terms. ++ ++ To do so, attach the following notices to the program. It is safest ++to attach them to the start of each source file to most effectively ++state the exclusion of warranty; and each file should have at least ++the "copyright" line and a pointer to where the full notice is found. ++ ++ ++ Copyright (C) ++ ++ This program is free software: you can redistribute it and/or modify ++ it under the terms of the GNU General Public License as published by ++ the Free Software Foundation, either version 3 of the License, or ++ (at your option) any later version. ++ ++ This program is distributed in the hope that it will be useful, ++ but WITHOUT ANY WARRANTY; without even the implied warranty of ++ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++ GNU General Public License for more details. ++ ++ You should have received a copy of the GNU General Public License ++ along with this program. If not, see . ++ ++Also add information on how to contact you by electronic and paper mail. ++ ++ If the program does terminal interaction, make it output a short ++notice like this when it starts in an interactive mode: ++ ++ Copyright (C) ++ This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. ++ This is free software, and you are welcome to redistribute it ++ under certain conditions; type `show c' for details. ++ ++The hypothetical commands `show w' and `show c' should show the appropriate ++parts of the General Public License. Of course, your program's commands ++might be different; for a GUI interface, you would use an "about box". ++ ++ You should also get your employer (if you work as a programmer) or school, ++if any, to sign a "copyright disclaimer" for the program, if necessary. ++For more information on this, and how to apply and follow the GNU GPL, see ++. ++ ++ The GNU General Public License does not permit incorporating your program ++into proprietary programs. If your program is a subroutine library, you ++may consider it more useful to permit linking proprietary applications with ++the library. If this is what you want to do, use the GNU Lesser General ++Public License instead of this License. But first, please read ++. +diff --git a/feeds/luci/applications/luci-app-pbx-voicemail/Makefile b/feeds/luci/applications/luci-app-pbx-voicemail/Makefile +new file mode 100644 +index 0000000..d31d429 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-pbx-voicemail/Makefile +@@ -0,0 +1,14 @@ ++# ++# Copyright (C) 2008-2014 The LuCI Team ++# ++# This is free software, licensed under the Apache License, Version 2.0 . ++# ++ ++include $(TOPDIR)/rules.mk ++ ++LUCI_TITLE:=LuCI PBX Administration Voicemail Support ++LUCI_DEPENDS:=+luci-app-pbx +asterisk18 +msmtp +coreutils-base64 ++ ++include ../../luci.mk ++ ++# call BuildPackage - OpenWrt buildroot signature +diff --git a/feeds/luci/applications/luci-app-pbx-voicemail/luasrc/controller/pbx-voicemail.lua b/feeds/luci/applications/luci-app-pbx-voicemail/luasrc/controller/pbx-voicemail.lua +new file mode 100644 +index 0000000..6f3dfac +--- /dev/null ++++ b/feeds/luci/applications/luci-app-pbx-voicemail/luasrc/controller/pbx-voicemail.lua +@@ -0,0 +1,24 @@ ++--[[ ++ Copyright 2011 Iordan Iordanov ++ ++ This file is part of luci-pbx-voicemail. ++ ++ luci-pbx-voicemail is free software: you can redistribute it and/or modify ++ it under the terms of the GNU General Public License as published by ++ the Free Software Foundation, either version 3 of the License, or ++ (at your option) any later version. ++ ++ luci-pbx-voicemail is distributed in the hope that it will be useful, ++ but WITHOUT ANY WARRANTY; without even the implied warranty of ++ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++ GNU General Public License for more details. ++ ++ You should have received a copy of the GNU General Public License ++ along with luci-pbx-voicemail. If not, see . ++]]-- ++ ++module("luci.controller.pbx-voicemail", package.seeall) ++ ++function index() ++ entry({"admin", "services", "pbx", "pbx-voicemail"}, cbi("pbx-voicemail"), "Voicemail", 5) ++end +diff --git a/feeds/luci/applications/luci-app-pbx-voicemail/luasrc/model/cbi/pbx-voicemail.lua b/feeds/luci/applications/luci-app-pbx-voicemail/luasrc/model/cbi/pbx-voicemail.lua +new file mode 100644 +index 0000000..9ff2ed9 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-pbx-voicemail/luasrc/model/cbi/pbx-voicemail.lua +@@ -0,0 +1,153 @@ ++--[[ ++ Copyright 2011 Iordan Iordanov ++ ++ This file is part of luci-pbx-voicemail. ++ ++ luci-pbx-voicemail is free software: you can redistribute it and/or modify ++ it under the terms of the GNU General Public License as published by ++ the Free Software Foundation, either version 3 of the License, or ++ (at your option) any later version. ++ ++ luci-pbx-voicemail is distributed in the hope that it will be useful, ++ but WITHOUT ANY WARRANTY; without even the implied warranty of ++ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++ GNU General Public License for more details. ++ ++ You should have received a copy of the GNU General Public License ++ along with luci-pbx-voicemail. If not, see . ++]]-- ++ ++if nixio.fs.access("/etc/init.d/asterisk") then ++ server = "asterisk" ++elseif nixio.fs.access("/etc/init.d/freeswitch") then ++ server = "freeswitch" ++else ++ server = "" ++end ++ ++modulename = "pbx-voicemail" ++vmlogfile = "/tmp/last_sent_voicemail.log" ++ ++m = Map (modulename, translate("Voicemail Setup"), ++ translate("Here you can configure a global voicemail for this PBX. Since this system is \ ++ intended to run on embedded systems like routers, there is no local storage of voicemail - \ ++ it must be sent out by email. Therefore you need to configure an outgoing mail (SMTP) server \ ++ (for example your ISP's, Google's, or Yahoo's SMTP server), and provide a list of \ ++ addresses that receive recorded voicemail.")) ++ ++-- Recreate the config, and restart services after changes are commited to the configuration. ++function m.on_after_commit(self) ++ luci.sys.call("/etc/init.d/pbx-" .. server .. " restart 1\>/dev/null 2\>/dev/null") ++ luci.sys.call("/etc/init.d/" .. server .. " restart 1\>/dev/null 2\>/dev/null") ++end ++ ++ ++---------------------------------------------------------------------------------------------------- ++s = m:section(NamedSection, "global_voicemail", "voicemail", translate("Global Voicemail Setup"), ++ translate("When you enable voicemail, you will have the opportunity to specify \ ++ email addresses that receive recorded voicemail. You must also set up an SMTP server below.")) ++s.anonymous = true ++ ++enable = s:option(ListValue, "enabled", translate("Enable Voicemail")) ++enable:value("yes", translate("Yes")) ++enable:value("no", translate("No")) ++enable.default = "no" ++ ++emails = s:option(DynamicList, "global_email_addresses", ++ translate("Email Addresses that Receive Voicemail")) ++emails:depends("enabled", "yes") ++ ++savepath = s:option(Value, "global_save_path", translate("Local Storage Directory"), ++ translate("You can also retain copies of voicemail messages on the device running \ ++ your PBX. The path specified here will be created if it doesn't exist. \ ++ Beware of limited space on embedded devices like routers, and enable this \ ++ option only if you know what you are doing.")) ++savepath.optional = true ++ ++if nixio.fs.access("/etc/pbx-voicemail/recordings/greeting.gsm") then ++ m1 = s:option(DummyValue, "_m1") ++ m1:depends("enabled", "yes") ++ m1.default = "NOTE: Found a voicemail greeting. To check or change your voicemail greeting, dial *789 \ ++ and the system will play back your current greeting. After that, a long beep will sound and \ ++ you can press * in order to record a new message. Hang up to avoid recording a message. \ ++ If you press *, a second long beep will sound, and you can record a new greeting. \ ++ Hang up or press # to stop recording. When # is pressed the system will play back the \ ++ new greeting." ++else ++ m1 = s:option(DummyValue, "_m1") ++ m1:depends("enabled", "yes") ++ m1.default = "WARNING: Could not find voicemail greeting. Callers will hear only a beep before \ ++ recording starts. To record a greeting, dial *789, and press * after the long beep. \ ++ If you press *, a second long beep will sound, and you can record a new greeting. \ ++ Hang up or press # to stop recording. When # is pressed the system will play back the \ ++ new greeting." ++end ++ ++ ++---------------------------------------------------------------------------------------------------- ++s = m:section(NamedSection, "voicemail_smtp", "voicemail", translate("Outgoing mail (SMTP) Server"), ++ translate("In order for this PBX to send emails containing voicemail recordings, you need to \ ++ set up an SMTP server here. Your ISP usually provides an SMTP server for that purpose. \ ++ You can also set up a third party SMTP server such as the one provided by Google or Yahoo.")) ++s.anonymous = true ++ ++serv = s:option(Value, "smtp_server", translate("SMTP Server Hostname or IP Address")) ++serv.datatype = "host" ++ ++port = s:option(Value, "smtp_port", translate("SMTP Port Number")) ++port.datatype = "port" ++port.default = "25" ++ ++tls = s:option(ListValue, "smtp_tls", translate("Secure Connection Using TLS")) ++tls:value("on", translate("Yes")) ++tls:value("off", translate("No")) ++tls.default = "on" ++ ++auth = s:option(ListValue, "smtp_auth", translate("SMTP Server Authentication")) ++auth:value("on", translate("Yes")) ++auth:value("off", translate("No")) ++auth.default = "off" ++ ++user = s:option(Value, "smtp_user", translate("SMTP User Name")) ++user:depends("smtp_auth", "on") ++ ++pwd = s:option(Value, "smtp_password", translate("SMTP Password"), ++ translate("Your real SMTP password is not shown for your protection. It will be changed \ ++ only when you change the value in this box.")) ++pwd.password = true ++pwd:depends("smtp_auth", "on") ++ ++-- We skip reading off the saved value and return nothing. ++function pwd.cfgvalue(self, section) ++ return "Password Not Displayed" ++end ++ ++-- We check the entered value against the saved one, and only write if the entered value is ++-- something other than the empty string, and it differes from the saved value. ++function pwd.write(self, section, value) ++ local orig_pwd = m:get(section, self.option) ++ if value == "Password Not Displayed" then value = "" end ++ if value and #value > 0 and orig_pwd ~= value then ++ Value.write(self, section, value) ++ end ++end ++ ++---------------------------------------------------------------------------------------------------- ++s = m:section(NamedSection, "voicemail_log", "voicemail", translate("Last Sent Voicemail Log")) ++s.anonymous = true ++ ++s:option (DummyValue, "vmlog") ++ ++sts = s:option(DummyValue, "_sts") ++sts.template = "cbi/tvalue" ++sts.rows = 5 ++ ++function sts.cfgvalue(self, section) ++ log = nixio.fs.readfile(vmlogfile) ++ if log == nil or log == "" then ++ log = "No errors or messages reported." ++ end ++ return log ++end ++ ++return m +diff --git a/feeds/luci/applications/luci-app-pbx-voicemail/po/ca/pbx-voicemail.po b/feeds/luci/applications/luci-app-pbx-voicemail/po/ca/pbx-voicemail.po +new file mode 100644 +index 0000000..c0119f7 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-pbx-voicemail/po/ca/pbx-voicemail.po +@@ -0,0 +1,100 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"PO-Revision-Date: 2014-07-01 05:47+0200\n" ++"Last-Translator: Alex \n" ++"Language-Team: none\n" ++"Language: ca\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n != 1);\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "Email Addresses that Receive Voicemail" ++msgstr "Adreces de correu electrònic que reben correu de veu" ++ ++msgid "Enable Voicemail" ++msgstr "Habilita el correu de veu" ++ ++msgid "Global Voicemail Setup" ++msgstr "" ++ ++msgid "" ++"Here you can configure a global voicemail for this PBX. Since this system is " ++"intended to run on embedded systems like routers, there is no local storage " ++"of voicemail - it must be sent out by email. Therefore you need to configure " ++"an outgoing mail (SMTP) server (for example your ISP's, Google's, or Yahoo's " ++"SMTP server), and provide a list of addresses that receive recorded " ++"voicemail." ++msgstr "" ++ ++msgid "" ++"In order for this PBX to send emails containing voicemail recordings, you " ++"need to set up an SMTP server here. Your ISP usually provides an SMTP server " ++"for that purpose. You can also set up a third party SMTP server such as the " ++"one provided by Google or Yahoo." ++msgstr "" ++ ++msgid "Last Sent Voicemail Log" ++msgstr "Registre del últim correu de veu enviat" ++ ++msgid "Local Storage Directory" ++msgstr "Directori d'emmagatzematge local" ++ ++msgid "No" ++msgstr "No" ++ ++msgid "Outgoing mail (SMTP) Server" ++msgstr "Servidor de correu sortint (SMTP)" ++ ++msgid "SMTP Password" ++msgstr "Contrasenya SMTP" ++ ++msgid "SMTP Port Number" ++msgstr "Nombre de port SMTP" ++ ++msgid "SMTP Server Authentication" ++msgstr "Autenticació del servidor SMTP" ++ ++msgid "SMTP Server Hostname or IP Address" ++msgstr "Adreça IP o nom de host del servidor SMTP" ++ ++msgid "SMTP User Name" ++msgstr "Nom d'usuari SMTP" ++ ++msgid "Secure Connection Using TLS" ++msgstr "Assegura la connexió mitjançant TLS" ++ ++msgid "Voicemail Setup" ++msgstr "" ++ ++msgid "" ++"When you enable voicemail, you will have the opportunity to specify email " ++"addresses that receive recorded voicemail. You must also set up an SMTP " ++"server below." ++msgstr "" ++"Quan habiliteu el correu de veu, tindreu l'oportunitat d'especificar adreces " ++"de correu electrònic que reben correu de veu gravat. Heu d'establir també " ++"un servidor SMTP a baix." ++ ++msgid "Yes" ++msgstr "Sí" ++ ++msgid "" ++"You can also retain copies of voicemail messages on the device running your " ++"PBX. The path specified here will be created if it doesn't exist. Beware of " ++"limited space on embedded devices like routers, and enable this option only " ++"if you know what you are doing." ++msgstr "" ++"Podeu també retenir còpies de missatges de veu en el dispositiu executant el " ++"vostre PBX. La ruta especificat aquí es crearà si no existeix. Teniu compte " ++"d'espai limitat en dispositius incrustats com els encaminadors, i habiliteu " ++"aquesta opció només si coneixeu ho que feu." ++ ++msgid "" ++"Your real SMTP password is not shown for your protection. It will be changed " ++"only when you change the value in this box." ++msgstr "" ++"La vostra contrasenya SMTP no es mostra per a la vostra protecció. Es " ++"canviarà només quan canvieu el valor en aquesta caixa." +diff --git a/feeds/luci/applications/luci-app-pbx-voicemail/po/cs/pbx-voicemail.po b/feeds/luci/applications/luci-app-pbx-voicemail/po/cs/pbx-voicemail.po +new file mode 100644 +index 0000000..6d94b35 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-pbx-voicemail/po/cs/pbx-voicemail.po +@@ -0,0 +1,91 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"PO-Revision-Date: 2014-06-05 19:16+0200\n" ++"Last-Translator: koli \n" ++"Language-Team: none\n" ++"Language: cs\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "Email Addresses that Receive Voicemail" ++msgstr "" ++ ++msgid "Enable Voicemail" ++msgstr "Povolit Voicemail" ++ ++msgid "Global Voicemail Setup" ++msgstr "" ++ ++msgid "" ++"Here you can configure a global voicemail for this PBX. Since this system is " ++"intended to run on embedded systems like routers, there is no local storage " ++"of voicemail - it must be sent out by email. Therefore you need to configure " ++"an outgoing mail (SMTP) server (for example your ISP's, Google's, or Yahoo's " ++"SMTP server), and provide a list of addresses that receive recorded " ++"voicemail." ++msgstr "" ++ ++msgid "" ++"In order for this PBX to send emails containing voicemail recordings, you " ++"need to set up an SMTP server here. Your ISP usually provides an SMTP server " ++"for that purpose. You can also set up a third party SMTP server such as the " ++"one provided by Google or Yahoo." ++msgstr "" ++ ++msgid "Last Sent Voicemail Log" ++msgstr "" ++ ++msgid "Local Storage Directory" ++msgstr "" ++ ++msgid "No" ++msgstr "Ne" ++ ++msgid "Outgoing mail (SMTP) Server" ++msgstr "" ++ ++msgid "SMTP Password" ++msgstr "SMTP heslo" ++ ++msgid "SMTP Port Number" ++msgstr "SMTP Äíslo portu" ++ ++msgid "SMTP Server Authentication" ++msgstr "" ++ ++msgid "SMTP Server Hostname or IP Address" ++msgstr "" ++ ++msgid "SMTP User Name" ++msgstr "SMTP uživatelské jméno" ++ ++msgid "Secure Connection Using TLS" ++msgstr "" ++ ++msgid "Voicemail Setup" ++msgstr "Voicemail nastavení" ++ ++msgid "" ++"When you enable voicemail, you will have the opportunity to specify email " ++"addresses that receive recorded voicemail. You must also set up an SMTP " ++"server below." ++msgstr "" ++ ++msgid "Yes" ++msgstr "Ano" ++ ++msgid "" ++"You can also retain copies of voicemail messages on the device running your " ++"PBX. The path specified here will be created if it doesn't exist. Beware of " ++"limited space on embedded devices like routers, and enable this option only " ++"if you know what you are doing." ++msgstr "" ++ ++msgid "" ++"Your real SMTP password is not shown for your protection. It will be changed " ++"only when you change the value in this box." ++msgstr "" +diff --git a/feeds/luci/applications/luci-app-pbx-voicemail/po/de/pbx-voicemail.po b/feeds/luci/applications/luci-app-pbx-voicemail/po/de/pbx-voicemail.po +new file mode 100644 +index 0000000..224b5a9 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-pbx-voicemail/po/de/pbx-voicemail.po +@@ -0,0 +1,141 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"PO-Revision-Date: 2013-01-28 22:30+0200\n" ++"Last-Translator: DAC324 \n" ++"Language-Team: none\n" ++"Language: de\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n != 1);\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "Email Addresses that Receive Voicemail" ++msgstr "E-Mail Adressen die Sprachnachrichten empfangen" ++ ++msgid "Enable Voicemail" ++msgstr "Anrufbeantworter aktivieren" ++ ++msgid "Global Voicemail Setup" ++msgstr "Allgemeine Einstellungen für Voicemail" ++ ++msgid "" ++"Here you can configure a global voicemail for this PBX. Since this system is " ++"intended to run on embedded systems like routers, there is no local storage " ++"of voicemail - it must be sent out by email. Therefore you need to configure " ++"an outgoing mail (SMTP) server (for example your ISP's, Google's, or Yahoo's " ++"SMTP server), and provide a list of addresses that receive recorded " ++"voicemail." ++msgstr "" ++"Es kann ein systemweiter Anrufbeantworter für diese Telefonanlage (PBX) konfiguriert werden. Da dieses " ++"System für den Einsatz auf embedded Systemen wie Routern optimiert wurde, " ++"gibt es keine Möglichkeit die Sprachnachrichten lokal zu speichern. Sie " ++"müssen per E-Mail versendet werden. Daher muss ein ausgehender Mail-Server " ++"(SMTP) konfiguriert " ++"werden. Hier kann zum Beispiel der SMTP-Server des Providers, aber auch ein " ++"Freemailer wie GMail eingetragen werden. Zusätzlich muss noch eine Liste von " ++"Adressen angegeben werden, an die aufgezeichnete Sprachnachrichten geschickt " ++"werden." ++ ++msgid "" ++"In order for this PBX to send emails containing voicemail recordings, you " ++"need to set up an SMTP server here. Your ISP usually provides an SMTP server " ++"for that purpose. You can also set up a third party SMTP server such as the " ++"one provided by Google or Yahoo." ++msgstr "" ++"Damit diese Telefonanlage (PBX) " ++"E-Mails mit Sprachaufnahmen senden kann, muss an dieser Stelle ein SMTP-" ++"Server eingetragen werden. Ihr Internet-Dienstanbieter (ISP) stellt normalerweise einen " ++"SMTP-Server für diesen Zweck zur Verfügung. Sie können auch einen SMTP-" ++"Server eines Drittanbieters, wie z.B. Google oder Yahoo, hier einstellen." ++ ++msgid "Last Sent Voicemail Log" ++msgstr "Log der zuletzt gesendeten Voicemails" ++ ++msgid "Local Storage Directory" ++msgstr "Lokales Speicherverzeichnis" ++ ++msgid "No" ++msgstr "Nein" ++ ++msgid "Outgoing mail (SMTP) Server" ++msgstr "Server für ausgehende Mails (SMTP)" ++ ++msgid "SMTP Password" ++msgstr "SMTP-Passwort" ++ ++msgid "SMTP Port Number" ++msgstr "SMTP-Portnummer" ++ ++msgid "SMTP Server Authentication" ++msgstr "SMTP-Server-Anmeldung" ++ ++msgid "SMTP Server Hostname or IP Address" ++msgstr "SMTP-Servername oder IP-Adresse" ++ ++msgid "SMTP User Name" ++msgstr "SMTP-Benutzername" ++ ++msgid "Secure Connection Using TLS" ++msgstr "Sichere Verbindung über TLS" ++ ++msgid "Voicemail Setup" ++msgstr "Voicemail-Einstellungen" ++ ++msgid "" ++"When you enable voicemail, you will have the opportunity to specify email " ++"addresses that receive recorded voicemail. You must also set up an SMTP " ++"server below." ++msgstr "" ++"Wenn Sie Voicemail aktivieren, können Sie E-Mail-Adressen angeben, die " ++"aufgenommene Voicemails erhalten sollen. Sie müssen ebenfalls einen SMTP-" ++"Server unten angeben." ++ ++msgid "Yes" ++msgstr "Ja" ++ ++msgid "" ++"You can also retain copies of voicemail messages on the device running your " ++"PBX. The path specified here will be created if it doesn't exist. Beware of " ++"limited space on embedded devices like routers, and enable this option only " ++"if you know what you are doing." ++msgstr "" ++"Sie können auch Kopien Ihrer Voicemail-Nachrichten auf dem Gerät speichern. " ++"Der hier angegebene Pfad wird erstellt, falls er nicht existiert. Beachten " ++"Sie, dass Geräte wie Router nur begrenzten Speicherplatz haben, und " ++"aktivieren Sie diese Option nur, wenn Sie wissen, was Sie tun." ++ ++msgid "" ++"Your real SMTP password is not shown for your protection. It will be changed " ++"only when you change the value in this box." ++msgstr "" ++"Ihr SMTP-Passwort wird zu Ihrem Schutz nicht angezeigt. Es wird nur " ++"geändert, wenn Sie dein Eintrag in diesem Kästchen verändern." ++ ++#~ msgid "Directory to save voicemail into" ++#~ msgstr "Verzeichnis für eingehende Sprachnachrichten" ++ ++#~ msgid "Enabled" ++#~ msgstr "Aktiviert" ++ ++#~ msgid "" ++#~ "Here you can configure a global voicemail for this PBX. Since this system " ++#~ "is intended to run on embedded systems like routers, there is no local " ++#~ "storage of voicemail - it must be sent out by email. Therefore you need " ++#~ "to configure an outgoing mail (SMTP) server (for example the SMTP server " ++#~ "your ISP provides, or GMail), and provide a list of addresses the " ++#~ "voicemail will be sent to." ++#~ msgstr "" ++#~ "Es kann ein systemweiter Anrufbeantworter für diese Telefonanlage (PBX) konfiguriert werden. Da " ++#~ "dieses System für den Einsatz auf embedded Systemen wie Routern optimiert " ++#~ "wurde, gibt es keine Möglichkeit die Sprachnachrichten lokal zu " ++#~ "speichern. Sie müssen per E-Mail versendet werden. Daher muss ein " ++#~ "ausgehender Mail-Server (SMTP) konfiguriert werden. Hier kann zum Beispiel der SMTP-" ++#~ "Server des Providers, aber auch ein Freemailer wie GMail verwendet " ++#~ "werden. Zusätzlich muss noch eine Liste von Adressen angegeben werden, zu " ++#~ "denen die Sprachnachrichten geschickt werden." +diff --git a/feeds/luci/applications/luci-app-pbx-voicemail/po/el/pbx-voicemail.po b/feeds/luci/applications/luci-app-pbx-voicemail/po/el/pbx-voicemail.po +new file mode 100644 +index 0000000..fc0a2e3 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-pbx-voicemail/po/el/pbx-voicemail.po +@@ -0,0 +1,94 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"PO-Revision-Date: 2012-03-18 15:26+0200\n" ++"Last-Translator: Vasilis \n" ++"Language-Team: none\n" ++"Language: el\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n != 1);\n" ++"X-Generator: Pootle 2.0.4\n" ++ ++msgid "Email Addresses that Receive Voicemail" ++msgstr "" ++ ++msgid "Enable Voicemail" ++msgstr "" ++ ++msgid "Global Voicemail Setup" ++msgstr "" ++ ++msgid "" ++"Here you can configure a global voicemail for this PBX. Since this system is " ++"intended to run on embedded systems like routers, there is no local storage " ++"of voicemail - it must be sent out by email. Therefore you need to configure " ++"an outgoing mail (SMTP) server (for example your ISP's, Google's, or Yahoo's " ++"SMTP server), and provide a list of addresses that receive recorded " ++"voicemail." ++msgstr "" ++ ++msgid "" ++"In order for this PBX to send emails containing voicemail recordings, you " ++"need to set up an SMTP server here. Your ISP usually provides an SMTP server " ++"for that purpose. You can also set up a third party SMTP server such as the " ++"one provided by Google or Yahoo." ++msgstr "" ++ ++msgid "Last Sent Voicemail Log" ++msgstr "" ++ ++msgid "Local Storage Directory" ++msgstr "" ++ ++msgid "No" ++msgstr "Όχι" ++ ++msgid "Outgoing mail (SMTP) Server" ++msgstr "" ++ ++msgid "SMTP Password" ++msgstr "" ++ ++msgid "SMTP Port Number" ++msgstr "" ++ ++msgid "SMTP Server Authentication" ++msgstr "" ++ ++msgid "SMTP Server Hostname or IP Address" ++msgstr "" ++ ++msgid "SMTP User Name" ++msgstr "" ++ ++msgid "Secure Connection Using TLS" ++msgstr "" ++ ++msgid "Voicemail Setup" ++msgstr "" ++ ++msgid "" ++"When you enable voicemail, you will have the opportunity to specify email " ++"addresses that receive recorded voicemail. You must also set up an SMTP " ++"server below." ++msgstr "" ++ ++msgid "Yes" ++msgstr "" ++ ++msgid "" ++"You can also retain copies of voicemail messages on the device running your " ++"PBX. The path specified here will be created if it doesn't exist. Beware of " ++"limited space on embedded devices like routers, and enable this option only " ++"if you know what you are doing." ++msgstr "" ++ ++msgid "" ++"Your real SMTP password is not shown for your protection. It will be changed " ++"only when you change the value in this box." ++msgstr "" ++ ++#~ msgid "Enabled" ++#~ msgstr "ΕνεÏγοποιημένο" +diff --git a/feeds/luci/applications/luci-app-pbx-voicemail/po/en/pbx-voicemail.po b/feeds/luci/applications/luci-app-pbx-voicemail/po/en/pbx-voicemail.po +new file mode 100644 +index 0000000..79c8848 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-pbx-voicemail/po/en/pbx-voicemail.po +@@ -0,0 +1,169 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Last-Translator: Automatically generated\n" ++"Language-Team: none\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n != 1);\n" ++ ++msgid "Email Addresses that Receive Voicemail" ++msgstr "Email Addresses that Receive Voicemail" ++ ++msgid "Enable Voicemail" ++msgstr "Enable Voicemail" ++ ++msgid "Global Voicemail Setup" ++msgstr "Global Voicemail Setup" ++ ++msgid "" ++"Here you can configure a global voicemail for this PBX. Since this system is " ++"intended to run on embedded systems like routers, there is no local storage " ++"of voicemail - it must be sent out by email. Therefore you need to configure " ++"an outgoing mail (SMTP) server (for example your ISP's, Google's, or Yahoo's " ++"SMTP server), and provide a list of addresses that receive recorded " ++"voicemail." ++msgstr "" ++"Here you can configure a global voicemail for this PBX. Since this system is " ++"intended to run on embedded systems like routers, there is no local storage " ++"of voicemail - it must be sent out by email. Therefore you need to configure " ++"an outgoing mail (SMTP) server (for example your ISP's, Google's, or Yahoo's " ++"SMTP server), and provide a list of addresses that receive recorded " ++"voicemail." ++ ++msgid "" ++"In order for this PBX to send emails containing voicemail recordings, you " ++"need to set up an SMTP server here. Your ISP usually provides an SMTP server " ++"for that purpose. You can also set up a third party SMTP server such as the " ++"one provided by Google or Yahoo." ++msgstr "" ++"In order for this PBX to send emails containing voicemail recordings, you " ++"need to set up an SMTP server here. Your ISP usually provides an SMTP server " ++"for that purpose. You can also set up a third party SMTP server such as the " ++"one provided by Google or Yahoo." ++ ++msgid "Last Sent Voicemail Log" ++msgstr "Last Sent Voicemail Log" ++ ++msgid "Local Storage Directory" ++msgstr "Local Storage Directory" ++ ++msgid "No" ++msgstr "No" ++ ++msgid "Outgoing mail (SMTP) Server" ++msgstr "Outgoing mail (SMTP) Server" ++ ++msgid "SMTP Password" ++msgstr "SMTP Password" ++ ++msgid "SMTP Port Number" ++msgstr "SMTP Port Number" ++ ++msgid "SMTP Server Authentication" ++msgstr "SMTP Server Authentication" ++ ++msgid "SMTP Server Hostname or IP Address" ++msgstr "SMTP Server Hostname or IP Address" ++ ++msgid "SMTP User Name" ++msgstr "SMTP User Name" ++ ++msgid "Secure Connection Using TLS" ++msgstr "Secure Connection Using TLS" ++ ++msgid "Voicemail Setup" ++msgstr "Voicemail Setup" ++ ++msgid "" ++"When you enable voicemail, you will have the opportunity to specify email " ++"addresses that receive recorded voicemail. You must also set up an SMTP " ++"server below." ++msgstr "" ++"When you enable voicemail, you will have the opportunity to specify email " ++"addresses that receive recorded voicemail. You must also set up an SMTP " ++"server below." ++ ++msgid "Yes" ++msgstr "Yes" ++ ++msgid "" ++"You can also retain copies of voicemail messages on the device running your " ++"PBX. The path specified here will be created if it doesn't exist. Beware of " ++"limited space on embedded devices like routers, and enable this option only " ++"if you know what you are doing." ++msgstr "" ++"You can also retain copies of voicemail messages on the device running your " ++"PBX. The path specified here will be created if it doesn't exist. Beware of " ++"limited space on embedded devices like routers, and enable this option only " ++"if you know what you are doing." ++ ++msgid "" ++"Your real SMTP password is not shown for your protection. It will be changed " ++"only when you change the value in this box." ++msgstr "" ++"Your real SMTP password is not shown for your protection. It will be changed " ++"only when you change the value in this box." ++ ++#~ msgid "Directory to save voicemail into" ++#~ msgstr "Directory to save voicemail into" ++ ++#~ msgid "Email addresses to forward to" ++#~ msgstr "Email addresses to forward to" ++ ++#~ msgid "Enabled" ++#~ msgstr "Enabled" ++ ++#~ msgid "" ++#~ "Here you can configure a global voicemail for this PBX. Since this system " ++#~ "is intended to run on embedded systems like routers, there is no local " ++#~ "storage of voicemail - it must be sent out by email. Therefore you need " ++#~ "to configure an outgoing mail (SMTP) server (for example the SMTP server " ++#~ "your ISP provides, or GMail), and provide a list of addresses the " ++#~ "voicemail will be sent to." ++#~ msgstr "" ++#~ "Here you can configure a global voicemail for this PBX. Since this system " ++#~ "is intended to run on embedded systems like routers, there is no local " ++#~ "storage of voicemail - it must be sent out by email. Therefore you need " ++#~ "to configure an outgoing mail (SMTP) server (for example the SMTP server " ++#~ "your ISP provides, or GMail), and provide a list of addresses the " ++#~ "voicemail will be sent to." ++ ++#~ msgid "" ++#~ "In order for this PBX to send emails containing voicemail recordings, you " ++#~ "need to set up an SMTP server here. Your ISP usually provides an SMTP " ++#~ "server for that purpose. You can also set up a GMail, Yahoo, or other 3rd " ++#~ "party SMTP server." ++#~ msgstr "" ++#~ "In order for this PBX to send emails containing voicemail recordings, you " ++#~ "need to set up an SMTP server here. Your ISP usually provides an SMTP " ++#~ "server for that purpose. You can also set up a GMail, Yahoo, or other 3rd " ++#~ "party SMTP server." ++ ++#~ msgid "SMTP port number" ++#~ msgstr "SMTP port number" ++ ++#~ msgid "SMTP server authentication" ++#~ msgstr "SMTP server authentication" ++ ++#~ msgid "SMTP server hostname or IP" ++#~ msgstr "SMTP server hostname or IP" ++ ++#~ msgid "SMTP user name" ++#~ msgstr "SMTP user name" ++ ++#~ msgid "Timeout before sending callers to voicemail" ++#~ msgstr "Timeout before sending callers to voicemail" ++ ++#~ msgid "Use TLS (secure connection)" ++#~ msgstr "Use TLS (secure connection)" ++ ++#~ msgid "" ++#~ "When you enable voicemail, you will have the opportunity to specify email " ++#~ "addresses which receive the message. You must also set up an SMTP server " ++#~ "below." ++#~ msgstr "" ++#~ "When you enable voicemail, you will have the opportunity to specify email " ++#~ "addresses which receive the message. You must also set up an SMTP server " ++#~ "below." +diff --git a/feeds/luci/applications/luci-app-pbx-voicemail/po/es/pbx-voicemail.po b/feeds/luci/applications/luci-app-pbx-voicemail/po/es/pbx-voicemail.po +new file mode 100644 +index 0000000..384e169 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-pbx-voicemail/po/es/pbx-voicemail.po +@@ -0,0 +1,106 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"PO-Revision-Date: 2012-08-23 22:44+0200\n" ++"Last-Translator: José Vicente \n" ++"Language-Team: none\n" ++"Language: es\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n != 1);\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "Email Addresses that Receive Voicemail" ++msgstr "Dirección de correo electrónica que recibe Voicemail" ++ ++msgid "Enable Voicemail" ++msgstr "Activar Voicemail" ++ ++msgid "Global Voicemail Setup" ++msgstr "Configuración global de Voicemail" ++ ++msgid "" ++"Here you can configure a global voicemail for this PBX. Since this system is " ++"intended to run on embedded systems like routers, there is no local storage " ++"of voicemail - it must be sent out by email. Therefore you need to configure " ++"an outgoing mail (SMTP) server (for example your ISP's, Google's, or Yahoo's " ++"SMTP server), and provide a list of addresses that receive recorded " ++"voicemail." ++msgstr "" ++"Configure un correo de voz global para esta PBX. Como el sistema está " ++"diseñado para sistemas integrados como routers, no tiene un almacenamiento " ++"local y debe enviarse por correo. Por este motivo debe configurar un " ++"servidor SMTP de correo saliente (como ISP, Google o el correo de Yahoo) y " ++"establecer una lista de direcciones que recibirán el correo de voz grabado." ++ ++msgid "" ++"In order for this PBX to send emails containing voicemail recordings, you " ++"need to set up an SMTP server here. Your ISP usually provides an SMTP server " ++"for that purpose. You can also set up a third party SMTP server such as the " ++"one provided by Google or Yahoo." ++msgstr "" ++"Para usar esta PBX para enviar correos con grabaciones de correos de voz " ++"tiene que configurar un servidor SMTP. Su ISP es posible que tenga uno. " ++"También puede usar otros como los de Google o Yahoo." ++ ++msgid "Last Sent Voicemail Log" ++msgstr "Último registro de Voicemail enviado" ++ ++msgid "Local Storage Directory" ++msgstr "Directorio local de almacenamiento" ++ ++msgid "No" ++msgstr "No" ++ ++msgid "Outgoing mail (SMTP) Server" ++msgstr "Servidor de correo SMTP saliente" ++ ++msgid "SMTP Password" ++msgstr "Contraseña SMTP" ++ ++msgid "SMTP Port Number" ++msgstr "Número de puerto SMTP" ++ ++msgid "SMTP Server Authentication" ++msgstr "Autentificación de servidor SMTP" ++ ++msgid "SMTP Server Hostname or IP Address" ++msgstr "Nombre del servidor SMTP o dirección IP" ++ ++msgid "SMTP User Name" ++msgstr "Nombre de usuario SMTP" ++ ++msgid "Secure Connection Using TLS" ++msgstr "Asegurar la conexión con TLS" ++ ++msgid "Voicemail Setup" ++msgstr "Configuración de Voicemail" ++ ++msgid "" ++"When you enable voicemail, you will have the opportunity to specify email " ++"addresses that receive recorded voicemail. You must also set up an SMTP " ++"server below." ++msgstr "" ++"Cuando active Voicemail tendrá que especificar direcciones de correo que " ++"recibirán los correos grabados así como un servidor SMTP." ++ ++msgid "Yes" ++msgstr "Sí" ++ ++msgid "" ++"You can also retain copies of voicemail messages on the device running your " ++"PBX. The path specified here will be created if it doesn't exist. Beware of " ++"limited space on embedded devices like routers, and enable this option only " ++"if you know what you are doing." ++msgstr "" ++"También puede guardar copias de los mensajes de Voicemail en el dispositivo. " ++"El camino se creará si no existe. Tenga cuidado de no sobrepasar el espacio " ++"disponible en dispositivos pequeños como routers." ++ ++msgid "" ++"Your real SMTP password is not shown for your protection. It will be changed " ++"only when you change the value in this box." ++msgstr "" ++"Su contraseña SMTP real no se muestra. Se cambiará solo cuando cambie el " ++"valor en esta caja." +diff --git a/feeds/luci/applications/luci-app-pbx-voicemail/po/fr/pbx-voicemail.po b/feeds/luci/applications/luci-app-pbx-voicemail/po/fr/pbx-voicemail.po +new file mode 100644 +index 0000000..0ccaa50 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-pbx-voicemail/po/fr/pbx-voicemail.po +@@ -0,0 +1,88 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Last-Translator: Automatically generated\n" ++"Language-Team: none\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n > 1);\n" ++ ++msgid "Email Addresses that Receive Voicemail" ++msgstr "" ++ ++msgid "Enable Voicemail" ++msgstr "" ++ ++msgid "Global Voicemail Setup" ++msgstr "" ++ ++msgid "" ++"Here you can configure a global voicemail for this PBX. Since this system is " ++"intended to run on embedded systems like routers, there is no local storage " ++"of voicemail - it must be sent out by email. Therefore you need to configure " ++"an outgoing mail (SMTP) server (for example your ISP's, Google's, or Yahoo's " ++"SMTP server), and provide a list of addresses that receive recorded " ++"voicemail." ++msgstr "" ++ ++msgid "" ++"In order for this PBX to send emails containing voicemail recordings, you " ++"need to set up an SMTP server here. Your ISP usually provides an SMTP server " ++"for that purpose. You can also set up a third party SMTP server such as the " ++"one provided by Google or Yahoo." ++msgstr "" ++ ++msgid "Last Sent Voicemail Log" ++msgstr "" ++ ++msgid "Local Storage Directory" ++msgstr "" ++ ++msgid "No" ++msgstr "" ++ ++msgid "Outgoing mail (SMTP) Server" ++msgstr "" ++ ++msgid "SMTP Password" ++msgstr "" ++ ++msgid "SMTP Port Number" ++msgstr "" ++ ++msgid "SMTP Server Authentication" ++msgstr "" ++ ++msgid "SMTP Server Hostname or IP Address" ++msgstr "" ++ ++msgid "SMTP User Name" ++msgstr "" ++ ++msgid "Secure Connection Using TLS" ++msgstr "" ++ ++msgid "Voicemail Setup" ++msgstr "" ++ ++msgid "" ++"When you enable voicemail, you will have the opportunity to specify email " ++"addresses that receive recorded voicemail. You must also set up an SMTP " ++"server below." ++msgstr "" ++ ++msgid "Yes" ++msgstr "" ++ ++msgid "" ++"You can also retain copies of voicemail messages on the device running your " ++"PBX. The path specified here will be created if it doesn't exist. Beware of " ++"limited space on embedded devices like routers, and enable this option only " ++"if you know what you are doing." ++msgstr "" ++ ++msgid "" ++"Your real SMTP password is not shown for your protection. It will be changed " ++"only when you change the value in this box." ++msgstr "" +diff --git a/feeds/luci/applications/luci-app-pbx-voicemail/po/he/pbx-voicemail.po b/feeds/luci/applications/luci-app-pbx-voicemail/po/he/pbx-voicemail.po +new file mode 100644 +index 0000000..be25f0b +--- /dev/null ++++ b/feeds/luci/applications/luci-app-pbx-voicemail/po/he/pbx-voicemail.po +@@ -0,0 +1,88 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Last-Translator: Automatically generated\n" ++"Language-Team: none\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n != 1);\n" ++ ++msgid "Email Addresses that Receive Voicemail" ++msgstr "" ++ ++msgid "Enable Voicemail" ++msgstr "" ++ ++msgid "Global Voicemail Setup" ++msgstr "" ++ ++msgid "" ++"Here you can configure a global voicemail for this PBX. Since this system is " ++"intended to run on embedded systems like routers, there is no local storage " ++"of voicemail - it must be sent out by email. Therefore you need to configure " ++"an outgoing mail (SMTP) server (for example your ISP's, Google's, or Yahoo's " ++"SMTP server), and provide a list of addresses that receive recorded " ++"voicemail." ++msgstr "" ++ ++msgid "" ++"In order for this PBX to send emails containing voicemail recordings, you " ++"need to set up an SMTP server here. Your ISP usually provides an SMTP server " ++"for that purpose. You can also set up a third party SMTP server such as the " ++"one provided by Google or Yahoo." ++msgstr "" ++ ++msgid "Last Sent Voicemail Log" ++msgstr "" ++ ++msgid "Local Storage Directory" ++msgstr "" ++ ++msgid "No" ++msgstr "" ++ ++msgid "Outgoing mail (SMTP) Server" ++msgstr "" ++ ++msgid "SMTP Password" ++msgstr "" ++ ++msgid "SMTP Port Number" ++msgstr "" ++ ++msgid "SMTP Server Authentication" ++msgstr "" ++ ++msgid "SMTP Server Hostname or IP Address" ++msgstr "" ++ ++msgid "SMTP User Name" ++msgstr "" ++ ++msgid "Secure Connection Using TLS" ++msgstr "" ++ ++msgid "Voicemail Setup" ++msgstr "" ++ ++msgid "" ++"When you enable voicemail, you will have the opportunity to specify email " ++"addresses that receive recorded voicemail. You must also set up an SMTP " ++"server below." ++msgstr "" ++ ++msgid "Yes" ++msgstr "" ++ ++msgid "" ++"You can also retain copies of voicemail messages on the device running your " ++"PBX. The path specified here will be created if it doesn't exist. Beware of " ++"limited space on embedded devices like routers, and enable this option only " ++"if you know what you are doing." ++msgstr "" ++ ++msgid "" ++"Your real SMTP password is not shown for your protection. It will be changed " ++"only when you change the value in this box." ++msgstr "" +diff --git a/feeds/luci/applications/luci-app-pbx-voicemail/po/hu/pbx-voicemail.po b/feeds/luci/applications/luci-app-pbx-voicemail/po/hu/pbx-voicemail.po +new file mode 100644 +index 0000000..be25f0b +--- /dev/null ++++ b/feeds/luci/applications/luci-app-pbx-voicemail/po/hu/pbx-voicemail.po +@@ -0,0 +1,88 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Last-Translator: Automatically generated\n" ++"Language-Team: none\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n != 1);\n" ++ ++msgid "Email Addresses that Receive Voicemail" ++msgstr "" ++ ++msgid "Enable Voicemail" ++msgstr "" ++ ++msgid "Global Voicemail Setup" ++msgstr "" ++ ++msgid "" ++"Here you can configure a global voicemail for this PBX. Since this system is " ++"intended to run on embedded systems like routers, there is no local storage " ++"of voicemail - it must be sent out by email. Therefore you need to configure " ++"an outgoing mail (SMTP) server (for example your ISP's, Google's, or Yahoo's " ++"SMTP server), and provide a list of addresses that receive recorded " ++"voicemail." ++msgstr "" ++ ++msgid "" ++"In order for this PBX to send emails containing voicemail recordings, you " ++"need to set up an SMTP server here. Your ISP usually provides an SMTP server " ++"for that purpose. You can also set up a third party SMTP server such as the " ++"one provided by Google or Yahoo." ++msgstr "" ++ ++msgid "Last Sent Voicemail Log" ++msgstr "" ++ ++msgid "Local Storage Directory" ++msgstr "" ++ ++msgid "No" ++msgstr "" ++ ++msgid "Outgoing mail (SMTP) Server" ++msgstr "" ++ ++msgid "SMTP Password" ++msgstr "" ++ ++msgid "SMTP Port Number" ++msgstr "" ++ ++msgid "SMTP Server Authentication" ++msgstr "" ++ ++msgid "SMTP Server Hostname or IP Address" ++msgstr "" ++ ++msgid "SMTP User Name" ++msgstr "" ++ ++msgid "Secure Connection Using TLS" ++msgstr "" ++ ++msgid "Voicemail Setup" ++msgstr "" ++ ++msgid "" ++"When you enable voicemail, you will have the opportunity to specify email " ++"addresses that receive recorded voicemail. You must also set up an SMTP " ++"server below." ++msgstr "" ++ ++msgid "Yes" ++msgstr "" ++ ++msgid "" ++"You can also retain copies of voicemail messages on the device running your " ++"PBX. The path specified here will be created if it doesn't exist. Beware of " ++"limited space on embedded devices like routers, and enable this option only " ++"if you know what you are doing." ++msgstr "" ++ ++msgid "" ++"Your real SMTP password is not shown for your protection. It will be changed " ++"only when you change the value in this box." ++msgstr "" +diff --git a/feeds/luci/applications/luci-app-pbx-voicemail/po/it/pbx-voicemail.po b/feeds/luci/applications/luci-app-pbx-voicemail/po/it/pbx-voicemail.po +new file mode 100644 +index 0000000..fe8c4bf +--- /dev/null ++++ b/feeds/luci/applications/luci-app-pbx-voicemail/po/it/pbx-voicemail.po +@@ -0,0 +1,110 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"PO-Revision-Date: 2013-02-09 21:15+0200\n" ++"Last-Translator: Francesco <3gasas@gmail.com>\n" ++"Language-Team: none\n" ++"Language: it\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n != 1);\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "Email Addresses that Receive Voicemail" ++msgstr "Indirizzi e-mail che ricevono Voicemail" ++ ++msgid "Enable Voicemail" ++msgstr "Attiva Voicemail" ++ ++msgid "Global Voicemail Setup" ++msgstr "Attiva Voicemail" ++ ++msgid "" ++"Here you can configure a global voicemail for this PBX. Since this system is " ++"intended to run on embedded systems like routers, there is no local storage " ++"of voicemail - it must be sent out by email. Therefore you need to configure " ++"an outgoing mail (SMTP) server (for example your ISP's, Google's, or Yahoo's " ++"SMTP server), and provide a list of addresses that receive recorded " ++"voicemail." ++msgstr "" ++"Qui è possibile configurare un messaggio vocale globale per questo PBX. " ++"Poiché questo sistema è destinato a girare su sistemi embedded come router, " ++"non vi è alcuna memorizzazione locale di segreteria - deve essere inviato " ++"via e-mail. Pertanto, è necessario configurare un server di posta in uscita " ++"(SMTP) (ad esempio del vostro ISP, di Google, Server Yahoo SMTP), e di " ++"fornire un elenco di indirizzi che ricevono posta vocale registrato." ++ ++msgid "" ++"In order for this PBX to send emails containing voicemail recordings, you " ++"need to set up an SMTP server here. Your ISP usually provides an SMTP server " ++"for that purpose. You can also set up a third party SMTP server such as the " ++"one provided by Google or Yahoo." ++msgstr "" ++"Affinché questo PBX possa inviare messaggi di posta elettronica contenenti " ++"le registrazioni vocali, è necessario impostare un server SMTP qui. Il tuo " ++"ISP in genere fornisce un server SMTP per tale scopo. È inoltre possibile " ++"impostare un terzo SMTP come quello fornito da Google o Yahoo." ++ ++msgid "Last Sent Voicemail Log" ++msgstr "Ultimo file di registro Voicemail inviato" ++ ++msgid "Local Storage Directory" ++msgstr "Cartella di memorizzazione Locale" ++ ++msgid "No" ++msgstr "No" ++ ++msgid "Outgoing mail (SMTP) Server" ++msgstr "Server posta in uscita (SMTP)" ++ ++msgid "SMTP Password" ++msgstr "Password SMTP" ++ ++msgid "SMTP Port Number" ++msgstr "Numero Porta SMTP" ++ ++msgid "SMTP Server Authentication" ++msgstr "Autenticazione Server SMTP" ++ ++msgid "SMTP Server Hostname or IP Address" ++msgstr "Nome Host Server SMTP o Indirizzo IP" ++ ++msgid "SMTP User Name" ++msgstr "Nome Utente SMTP" ++ ++msgid "Secure Connection Using TLS" ++msgstr "Connessione Sicura utilizzando TLS" ++ ++msgid "Voicemail Setup" ++msgstr "Impostazione Voicemail" ++ ++msgid "" ++"When you enable voicemail, you will have the opportunity to specify email " ++"addresses that receive recorded voicemail. You must also set up an SMTP " ++"server below." ++msgstr "" ++"Quando si attiva la segreteria telefonica, si avrà la possibilità di " ++"specificare gli indirizzi e-mail che ricevono i messaggi vocali registrati. " ++"È inoltre necessario impostare un server SMTP di seguito." ++ ++msgid "Yes" ++msgstr "Sì" ++ ++msgid "" ++"You can also retain copies of voicemail messages on the device running your " ++"PBX. The path specified here will be created if it doesn't exist. Beware of " ++"limited space on embedded devices like routers, and enable this option only " ++"if you know what you are doing." ++msgstr "" ++"È inoltre possibile conservare copie dei messaggi vocali sul dispositivo che " ++"esegue il PBX. Il percorso specificato in questo campo viene creato se non " ++"esiste. Attenzione lo spazio è limitato sui dispositivi embedded come " ++"router, e abilitare questa opzione solo se si sa cosa si sta facendo." ++ ++msgid "" ++"Your real SMTP password is not shown for your protection. It will be changed " ++"only when you change the value in this box." ++msgstr "" ++"La tua password SMTP reale non viene visualizzata per la vostra protezione. " ++"Verrà modificato solo quando si modifica il valore in questa casella." +diff --git a/feeds/luci/applications/luci-app-pbx-voicemail/po/ja/pbx-voicemail.po b/feeds/luci/applications/luci-app-pbx-voicemail/po/ja/pbx-voicemail.po +new file mode 100644 +index 0000000..19e26bf +--- /dev/null ++++ b/feeds/luci/applications/luci-app-pbx-voicemail/po/ja/pbx-voicemail.po +@@ -0,0 +1,88 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Last-Translator: Automatically generated\n" ++"Language-Team: none\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=1; plural=0;\n" ++ ++msgid "Email Addresses that Receive Voicemail" ++msgstr "" ++ ++msgid "Enable Voicemail" ++msgstr "" ++ ++msgid "Global Voicemail Setup" ++msgstr "" ++ ++msgid "" ++"Here you can configure a global voicemail for this PBX. Since this system is " ++"intended to run on embedded systems like routers, there is no local storage " ++"of voicemail - it must be sent out by email. Therefore you need to configure " ++"an outgoing mail (SMTP) server (for example your ISP's, Google's, or Yahoo's " ++"SMTP server), and provide a list of addresses that receive recorded " ++"voicemail." ++msgstr "" ++ ++msgid "" ++"In order for this PBX to send emails containing voicemail recordings, you " ++"need to set up an SMTP server here. Your ISP usually provides an SMTP server " ++"for that purpose. You can also set up a third party SMTP server such as the " ++"one provided by Google or Yahoo." ++msgstr "" ++ ++msgid "Last Sent Voicemail Log" ++msgstr "" ++ ++msgid "Local Storage Directory" ++msgstr "" ++ ++msgid "No" ++msgstr "" ++ ++msgid "Outgoing mail (SMTP) Server" ++msgstr "" ++ ++msgid "SMTP Password" ++msgstr "" ++ ++msgid "SMTP Port Number" ++msgstr "" ++ ++msgid "SMTP Server Authentication" ++msgstr "" ++ ++msgid "SMTP Server Hostname or IP Address" ++msgstr "" ++ ++msgid "SMTP User Name" ++msgstr "" ++ ++msgid "Secure Connection Using TLS" ++msgstr "" ++ ++msgid "Voicemail Setup" ++msgstr "" ++ ++msgid "" ++"When you enable voicemail, you will have the opportunity to specify email " ++"addresses that receive recorded voicemail. You must also set up an SMTP " ++"server below." ++msgstr "" ++ ++msgid "Yes" ++msgstr "" ++ ++msgid "" ++"You can also retain copies of voicemail messages on the device running your " ++"PBX. The path specified here will be created if it doesn't exist. Beware of " ++"limited space on embedded devices like routers, and enable this option only " ++"if you know what you are doing." ++msgstr "" ++ ++msgid "" ++"Your real SMTP password is not shown for your protection. It will be changed " ++"only when you change the value in this box." ++msgstr "" +diff --git a/feeds/luci/applications/luci-app-pbx-voicemail/po/ms/pbx-voicemail.po b/feeds/luci/applications/luci-app-pbx-voicemail/po/ms/pbx-voicemail.po +new file mode 100644 +index 0000000..bf633a6 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-pbx-voicemail/po/ms/pbx-voicemail.po +@@ -0,0 +1,87 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Last-Translator: Automatically generated\n" ++"Language-Team: none\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++ ++msgid "Email Addresses that Receive Voicemail" ++msgstr "" ++ ++msgid "Enable Voicemail" ++msgstr "" ++ ++msgid "Global Voicemail Setup" ++msgstr "" ++ ++msgid "" ++"Here you can configure a global voicemail for this PBX. Since this system is " ++"intended to run on embedded systems like routers, there is no local storage " ++"of voicemail - it must be sent out by email. Therefore you need to configure " ++"an outgoing mail (SMTP) server (for example your ISP's, Google's, or Yahoo's " ++"SMTP server), and provide a list of addresses that receive recorded " ++"voicemail." ++msgstr "" ++ ++msgid "" ++"In order for this PBX to send emails containing voicemail recordings, you " ++"need to set up an SMTP server here. Your ISP usually provides an SMTP server " ++"for that purpose. You can also set up a third party SMTP server such as the " ++"one provided by Google or Yahoo." ++msgstr "" ++ ++msgid "Last Sent Voicemail Log" ++msgstr "" ++ ++msgid "Local Storage Directory" ++msgstr "" ++ ++msgid "No" ++msgstr "" ++ ++msgid "Outgoing mail (SMTP) Server" ++msgstr "" ++ ++msgid "SMTP Password" ++msgstr "" ++ ++msgid "SMTP Port Number" ++msgstr "" ++ ++msgid "SMTP Server Authentication" ++msgstr "" ++ ++msgid "SMTP Server Hostname or IP Address" ++msgstr "" ++ ++msgid "SMTP User Name" ++msgstr "" ++ ++msgid "Secure Connection Using TLS" ++msgstr "" ++ ++msgid "Voicemail Setup" ++msgstr "" ++ ++msgid "" ++"When you enable voicemail, you will have the opportunity to specify email " ++"addresses that receive recorded voicemail. You must also set up an SMTP " ++"server below." ++msgstr "" ++ ++msgid "Yes" ++msgstr "" ++ ++msgid "" ++"You can also retain copies of voicemail messages on the device running your " ++"PBX. The path specified here will be created if it doesn't exist. Beware of " ++"limited space on embedded devices like routers, and enable this option only " ++"if you know what you are doing." ++msgstr "" ++ ++msgid "" ++"Your real SMTP password is not shown for your protection. It will be changed " ++"only when you change the value in this box." ++msgstr "" +diff --git a/feeds/luci/applications/luci-app-pbx-voicemail/po/no/pbx-voicemail.po b/feeds/luci/applications/luci-app-pbx-voicemail/po/no/pbx-voicemail.po +new file mode 100644 +index 0000000..be25f0b +--- /dev/null ++++ b/feeds/luci/applications/luci-app-pbx-voicemail/po/no/pbx-voicemail.po +@@ -0,0 +1,88 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Last-Translator: Automatically generated\n" ++"Language-Team: none\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n != 1);\n" ++ ++msgid "Email Addresses that Receive Voicemail" ++msgstr "" ++ ++msgid "Enable Voicemail" ++msgstr "" ++ ++msgid "Global Voicemail Setup" ++msgstr "" ++ ++msgid "" ++"Here you can configure a global voicemail for this PBX. Since this system is " ++"intended to run on embedded systems like routers, there is no local storage " ++"of voicemail - it must be sent out by email. Therefore you need to configure " ++"an outgoing mail (SMTP) server (for example your ISP's, Google's, or Yahoo's " ++"SMTP server), and provide a list of addresses that receive recorded " ++"voicemail." ++msgstr "" ++ ++msgid "" ++"In order for this PBX to send emails containing voicemail recordings, you " ++"need to set up an SMTP server here. Your ISP usually provides an SMTP server " ++"for that purpose. You can also set up a third party SMTP server such as the " ++"one provided by Google or Yahoo." ++msgstr "" ++ ++msgid "Last Sent Voicemail Log" ++msgstr "" ++ ++msgid "Local Storage Directory" ++msgstr "" ++ ++msgid "No" ++msgstr "" ++ ++msgid "Outgoing mail (SMTP) Server" ++msgstr "" ++ ++msgid "SMTP Password" ++msgstr "" ++ ++msgid "SMTP Port Number" ++msgstr "" ++ ++msgid "SMTP Server Authentication" ++msgstr "" ++ ++msgid "SMTP Server Hostname or IP Address" ++msgstr "" ++ ++msgid "SMTP User Name" ++msgstr "" ++ ++msgid "Secure Connection Using TLS" ++msgstr "" ++ ++msgid "Voicemail Setup" ++msgstr "" ++ ++msgid "" ++"When you enable voicemail, you will have the opportunity to specify email " ++"addresses that receive recorded voicemail. You must also set up an SMTP " ++"server below." ++msgstr "" ++ ++msgid "Yes" ++msgstr "" ++ ++msgid "" ++"You can also retain copies of voicemail messages on the device running your " ++"PBX. The path specified here will be created if it doesn't exist. Beware of " ++"limited space on embedded devices like routers, and enable this option only " ++"if you know what you are doing." ++msgstr "" ++ ++msgid "" ++"Your real SMTP password is not shown for your protection. It will be changed " ++"only when you change the value in this box." ++msgstr "" +diff --git a/feeds/luci/applications/luci-app-pbx-voicemail/po/pl/pbx-voicemail.po b/feeds/luci/applications/luci-app-pbx-voicemail/po/pl/pbx-voicemail.po +new file mode 100644 +index 0000000..3f07fe4 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-pbx-voicemail/po/pl/pbx-voicemail.po +@@ -0,0 +1,111 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"PO-Revision-Date: 2014-05-05 02:29+0200\n" ++"Last-Translator: piosl \n" ++"Language-Team: none\n" ++"Language: pl\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 " ++"|| n%100>=20) ? 1 : 2);\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "Email Addresses that Receive Voicemail" ++msgstr "Adres e-mail do odbierania poczty gÅ‚osowej" ++ ++msgid "Enable Voicemail" ++msgstr "WÅ‚Ä…cz pocztÄ™ gÅ‚osowÄ…" ++ ++msgid "Global Voicemail Setup" ++msgstr "Ustawienia globalnej poczty gÅ‚osowej" ++ ++msgid "" ++"Here you can configure a global voicemail for this PBX. Since this system is " ++"intended to run on embedded systems like routers, there is no local storage " ++"of voicemail - it must be sent out by email. Therefore you need to configure " ++"an outgoing mail (SMTP) server (for example your ISP's, Google's, or Yahoo's " ++"SMTP server), and provide a list of addresses that receive recorded " ++"voicemail." ++msgstr "" ++"Tutaj można skonfigurować globalnÄ… pocztÄ™ gÅ‚osowÄ… dla PBX. Ponieważ system " ++"ten jest przeznaczony do pracy w systemach wbudowanych, takich jak routery, " ++"nie ma możliwoÅ›ci lokalnego przechowywania poczty gÅ‚osowej - wiadomoÅ›ci " ++"muszÄ… być wysÅ‚ane e-mailem. Z tego powodu należy skonfigurować serwer poczty " ++"wychodzÄ…cej (SMTP) i podać listÄ™ adresów, które bÄ™dÄ… otrzymywać nagrania z " ++"poczty gÅ‚osowej" ++ ++msgid "" ++"In order for this PBX to send emails containing voicemail recordings, you " ++"need to set up an SMTP server here. Your ISP usually provides an SMTP server " ++"for that purpose. You can also set up a third party SMTP server such as the " ++"one provided by Google or Yahoo." ++msgstr "" ++"W celu wysyÅ‚aÅ‚o e-maili zawierajÄ…cych nagrania poczty gÅ‚osowej przez PBX, " ++"należy skonfigurować serwer SMTP. Twój dostawca usÅ‚ug internetowych " ++"zazwyczaj dostarcza serwer SMTP. Można również skonfigurować serwer SMTP " ++"firm trzecich, takich jak Google lub Yahoo." ++ ++msgid "Last Sent Voicemail Log" ++msgstr "" ++ ++msgid "Local Storage Directory" ++msgstr "Lokalny katalog przechowywania" ++ ++msgid "No" ++msgstr "Nie" ++ ++msgid "Outgoing mail (SMTP) Server" ++msgstr "Serwer poczty wychodzÄ…cej (SMTP)" ++ ++msgid "SMTP Password" ++msgstr "HasÅ‚o SMTP" ++ ++msgid "SMTP Port Number" ++msgstr "Numer portu SMTP" ++ ++msgid "SMTP Server Authentication" ++msgstr "Uwierzytelnianie serwera SMTP" ++ ++msgid "SMTP Server Hostname or IP Address" ++msgstr "Nazwa hosta serwera SMTP lub adres IP" ++ ++msgid "SMTP User Name" ++msgstr "Nazwa użytkownika SMTP" ++ ++msgid "Secure Connection Using TLS" ++msgstr "Bezpieczne poÅ‚Ä…czenie za pomocÄ… protokoÅ‚u TLS" ++ ++msgid "Voicemail Setup" ++msgstr "Ustawienia Poczty gÅ‚osowej" ++ ++msgid "" ++"When you enable voicemail, you will have the opportunity to specify email " ++"addresses that receive recorded voicemail. You must also set up an SMTP " ++"server below." ++msgstr "" ++"Po wÅ‚Ä…czeniu poczty gÅ‚osowej, bÄ™dziesz miaÅ‚ szansÄ™ na podanie adresów " ++"e-mail, które bÄ™dÄ… otrzymywać nagrane wiadomoÅ›ci gÅ‚osowe. Musisz również " ++"skonfigurować serwer SMTP." ++ ++msgid "Yes" ++msgstr "Tak" ++ ++msgid "" ++"You can also retain copies of voicemail messages on the device running your " ++"PBX. The path specified here will be created if it doesn't exist. Beware of " ++"limited space on embedded devices like routers, and enable this option only " ++"if you know what you are doing." ++msgstr "" ++"Możesz też zachować kopie nagraÅ„ poczty gÅ‚osowej na urzÄ…dzeniu, na którym " ++"dziaÅ‚a PBX. Åšcieżka okreÅ›lona tutaj zostanie utworzona, jeÅ›li nie istnieje. " ++"PamiÄ™taj o ograniczonym miejscu na urzÄ…dzeniach takich jak routery i wÅ‚Ä…cz " ++"tÄ™ opcjÄ™ tylko jeÅ›li wiesz co robisz." ++ ++msgid "" ++"Your real SMTP password is not shown for your protection. It will be changed " ++"only when you change the value in this box." ++msgstr "" ++"Twoje prawdziwe hasÅ‚o SMTP nie jest pokazane dla Twojej ochrony. Zostanie " ++"zmienione tylko jeÅ›li zmienisz wartość w tym polu." +diff --git a/feeds/luci/applications/luci-app-pbx-voicemail/po/pt-br/pbx-voicemail.po b/feeds/luci/applications/luci-app-pbx-voicemail/po/pt-br/pbx-voicemail.po +new file mode 100644 +index 0000000..2e3a51e +--- /dev/null ++++ b/feeds/luci/applications/luci-app-pbx-voicemail/po/pt-br/pbx-voicemail.po +@@ -0,0 +1,175 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"PO-Revision-Date: 2012-09-16 02:32+0200\n" ++"Last-Translator: Julio Cezar \n" ++"Language-Team: none\n" ++"Language: pt_BR\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n > 1);\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "Email Addresses that Receive Voicemail" ++msgstr "Endereços de correio eletrônicos que Recebem Correio de Voz" ++ ++msgid "Enable Voicemail" ++msgstr "Habilitar o Correio de Voz" ++ ++msgid "Global Voicemail Setup" ++msgstr "Configuração Global do Correio de Voz" ++ ++msgid "" ++"Here you can configure a global voicemail for this PBX. Since this system is " ++"intended to run on embedded systems like routers, there is no local storage " ++"of voicemail - it must be sent out by email. Therefore you need to configure " ++"an outgoing mail (SMTP) server (for example your ISP's, Google's, or Yahoo's " ++"SMTP server), and provide a list of addresses that receive recorded " ++"voicemail." ++msgstr "" ++"Aqui você pode configurar um correio de voz global para este PBX. Uma vez " ++"que este sistema é previsto para ser executado em ambientes embarcados como " ++"roteadores, não existe armazenamento local do correio de voz - ele deve ser " ++"enviado por correio eletrônico. Desta maneira, você deve configurar um " ++"servidor (SMTP) de correio eletrônico (por exemplo, o servidor SMTP do seu " ++"provedor de Internet, do Google ou do Yahool), e fornecer uma lista dos " ++"endereços para os quais o correio de voz será enviado." ++ ++msgid "" ++"In order for this PBX to send emails containing voicemail recordings, you " ++"need to set up an SMTP server here. Your ISP usually provides an SMTP server " ++"for that purpose. You can also set up a third party SMTP server such as the " ++"one provided by Google or Yahoo." ++msgstr "" ++"Para este PBX enviar mensagens eletrônicas contendo as gravações do correio " ++"de voz, você precisa definir aqui um servidor SMTP. Seu provedor de Internet " ++"geralmente fornece um servidor SMTP para este propósito. Você também pode " ++"usar um servidor de terceiros como os fornecidos pelo GMail ou Yahoo." ++ ++msgid "Last Sent Voicemail Log" ++msgstr "Registro do Último Correio de Voz Enviado" ++ ++msgid "Local Storage Directory" ++msgstr "Diretório de Armazenamento Local" ++ ++msgid "No" ++msgstr "Não" ++ ++msgid "Outgoing mail (SMTP) Server" ++msgstr "Servidor de correio eletrônico (SMTP) para envio" ++ ++msgid "SMTP Password" ++msgstr "Senha do SMTP" ++ ++msgid "SMTP Port Number" ++msgstr "Porta do SMTP" ++ ++msgid "SMTP Server Authentication" ++msgstr "Autenticação do Servidor SMTP" ++ ++msgid "SMTP Server Hostname or IP Address" ++msgstr "Nome do Equipamento ou Endereço IP do Servidor SMTP" ++ ++msgid "SMTP User Name" ++msgstr "Nome do Usuário do SMTP" ++ ++msgid "Secure Connection Using TLS" ++msgstr "Proteja a Conexão Usando TLS" ++ ++msgid "Voicemail Setup" ++msgstr "Configuração do Correio de Voz" ++ ++msgid "" ++"When you enable voicemail, you will have the opportunity to specify email " ++"addresses that receive recorded voicemail. You must also set up an SMTP " ++"server below." ++msgstr "" ++"Quando você habilita o correio de voz, você terá a oportunidade de " ++"especificar endereços de correio eletrônio que recebem o correio de voz " ++"gravado. Você precisa também configurar um servidor SMTP abaixo." ++ ++msgid "Yes" ++msgstr "Sim" ++ ++msgid "" ++"You can also retain copies of voicemail messages on the device running your " ++"PBX. The path specified here will be created if it doesn't exist. Beware of " ++"limited space on embedded devices like routers, and enable this option only " ++"if you know what you are doing." ++msgstr "" ++"Você pode também manter cópias das mensagens de correio de voz no " ++"dispositivo executando o seu PBX. O caminho especificado aqui será criado se " ++"ele não existe. Cuidado com espaço limitado em dispositivos embarcados, como " ++"roteadores, e habilite esta opção apenas se você sabe o que você está " ++"fazendo." ++ ++msgid "" ++"Your real SMTP password is not shown for your protection. It will be changed " ++"only when you change the value in this box." ++msgstr "" ++"Sua senha real do SMTP não é mostrada para a sua proteção. Ela será alterada " ++"apenas quando você modificar o valor neste campo." ++ ++#~ msgid "Directory to save voicemail into" ++#~ msgstr "Diretório para salvar o correio de voz" ++ ++#~ msgid "Email addresses to forward to" ++#~ msgstr "Endereços de correio eletrônicos para encaminhar" ++ ++#~ msgid "Enabled" ++#~ msgstr "Habilitado" ++ ++#~ msgid "" ++#~ "Here you can configure a global voicemail for this PBX. Since this system " ++#~ "is intended to run on embedded systems like routers, there is no local " ++#~ "storage of voicemail - it must be sent out by email. Therefore you need " ++#~ "to configure an outgoing mail (SMTP) server (for example the SMTP server " ++#~ "your ISP provides, or GMail), and provide a list of addresses the " ++#~ "voicemail will be sent to." ++#~ msgstr "" ++#~ "Aqui você pode configurar um correio de voz global para este PBX. Uma vez " ++#~ "que este sistema é previsto para ser executado em ambientes embarcados " ++#~ "como roteadores, não existe armazenamento local do correio de voz - ele " ++#~ "deve ser enviado por correio eletrônico. Desta maneira, você deve " ++#~ "configurar um servidor (SMTP) de correio eletrônico (por exemplo, o " ++#~ "servidor SMTP do seu provedor de Internet, ou o do GMail), e fornecer uma " ++#~ "lista dos endereços para os quais o correio de voz será enviado." ++ ++#~ msgid "" ++#~ "In order for this PBX to send emails containing voicemail recordings, you " ++#~ "need to set up an SMTP server here. Your ISP usually provides an SMTP " ++#~ "server for that purpose. You can also set up a GMail, Yahoo, or other 3rd " ++#~ "party SMTP server." ++#~ msgstr "" ++#~ "Para este PBX enviar mensagens eletrônicas contendo as gravações do " ++#~ "correio de voz, você precisa definir aqui um servidor SMTP. Seu provedor " ++#~ "de Internet geralmente fornece um servidor SMTP para este propósito. Você " ++#~ "também pode usar o servidor SMTP do GMail, Yahoo, ou outro de terceiros." ++ ++#~ msgid "SMTP port number" ++#~ msgstr "Número da porta do SMTP" ++ ++#~ msgid "SMTP server authentication" ++#~ msgstr "Autenticação do servidor SMTP" ++ ++#~ msgid "SMTP server hostname or IP" ++#~ msgstr "Nome do equipamento ou endereço IP do servidor SMTP" ++ ++#~ msgid "SMTP user name" ++#~ msgstr "Nome do usuário do SMTP" ++ ++#~ msgid "Timeout before sending callers to voicemail" ++#~ msgstr "Tempo de espera antes de enviar chamadas para correio de voz" ++ ++#~ msgid "Use TLS (secure connection)" ++#~ msgstr "Usar TLS (conexão segura)" ++ ++#~ msgid "" ++#~ "When you enable voicemail, you will have the opportunity to specify email " ++#~ "addresses which receive the message. You must also set up an SMTP server " ++#~ "below." ++#~ msgstr "" ++#~ "Quando você habilita o correio de voz, você terá a oportunidade de " ++#~ "especificar endereços de correio eletrônio que recebem a mensagem. Você " ++#~ "também deve configurar um servidor SMTP abaixo." +diff --git a/feeds/luci/applications/luci-app-pbx-voicemail/po/pt/pbx-voicemail.po b/feeds/luci/applications/luci-app-pbx-voicemail/po/pt/pbx-voicemail.po +new file mode 100644 +index 0000000..f5cfd89 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-pbx-voicemail/po/pt/pbx-voicemail.po +@@ -0,0 +1,91 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"PO-Revision-Date: 2013-06-03 18:28+0200\n" ++"Last-Translator: joao.f.vieira \n" ++"Language-Team: none\n" ++"Language: pt\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n != 1);\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "Email Addresses that Receive Voicemail" ++msgstr "" ++ ++msgid "Enable Voicemail" ++msgstr "Ativar Voicemail" ++ ++msgid "Global Voicemail Setup" ++msgstr "" ++ ++msgid "" ++"Here you can configure a global voicemail for this PBX. Since this system is " ++"intended to run on embedded systems like routers, there is no local storage " ++"of voicemail - it must be sent out by email. Therefore you need to configure " ++"an outgoing mail (SMTP) server (for example your ISP's, Google's, or Yahoo's " ++"SMTP server), and provide a list of addresses that receive recorded " ++"voicemail." ++msgstr "" ++ ++msgid "" ++"In order for this PBX to send emails containing voicemail recordings, you " ++"need to set up an SMTP server here. Your ISP usually provides an SMTP server " ++"for that purpose. You can also set up a third party SMTP server such as the " ++"one provided by Google or Yahoo." ++msgstr "" ++ ++msgid "Last Sent Voicemail Log" ++msgstr "" ++ ++msgid "Local Storage Directory" ++msgstr "" ++ ++msgid "No" ++msgstr "Não" ++ ++msgid "Outgoing mail (SMTP) Server" ++msgstr "Servidor de Envio de mail (SMTP)" ++ ++msgid "SMTP Password" ++msgstr "Password SMTP" ++ ++msgid "SMTP Port Number" ++msgstr "Porta SMTP" ++ ++msgid "SMTP Server Authentication" ++msgstr "Servidor de Autenticação SMTP" ++ ++msgid "SMTP Server Hostname or IP Address" ++msgstr "Nome ou Endereço IP do Servidor SMTP" ++ ++msgid "SMTP User Name" ++msgstr "Utilizador SMTP" ++ ++msgid "Secure Connection Using TLS" ++msgstr "Ligação Segura usando TLS" ++ ++msgid "Voicemail Setup" ++msgstr "Configuração do Voicemail" ++ ++msgid "" ++"When you enable voicemail, you will have the opportunity to specify email " ++"addresses that receive recorded voicemail. You must also set up an SMTP " ++"server below." ++msgstr "" ++ ++msgid "Yes" ++msgstr "Sim" ++ ++msgid "" ++"You can also retain copies of voicemail messages on the device running your " ++"PBX. The path specified here will be created if it doesn't exist. Beware of " ++"limited space on embedded devices like routers, and enable this option only " ++"if you know what you are doing." ++msgstr "" ++ ++msgid "" ++"Your real SMTP password is not shown for your protection. It will be changed " ++"only when you change the value in this box." ++msgstr "" +diff --git a/feeds/luci/applications/luci-app-pbx-voicemail/po/ro/pbx-voicemail.po b/feeds/luci/applications/luci-app-pbx-voicemail/po/ro/pbx-voicemail.po +new file mode 100644 +index 0000000..42b66f6 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-pbx-voicemail/po/ro/pbx-voicemail.po +@@ -0,0 +1,89 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Last-Translator: Automatically generated\n" ++"Language-Team: none\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=3; plural=n==1 ? 0 : (n==0 || (n%100 > 0 && n%100 < " ++"20)) ? 1 : 2;\n" ++ ++msgid "Email Addresses that Receive Voicemail" ++msgstr "" ++ ++msgid "Enable Voicemail" ++msgstr "" ++ ++msgid "Global Voicemail Setup" ++msgstr "" ++ ++msgid "" ++"Here you can configure a global voicemail for this PBX. Since this system is " ++"intended to run on embedded systems like routers, there is no local storage " ++"of voicemail - it must be sent out by email. Therefore you need to configure " ++"an outgoing mail (SMTP) server (for example your ISP's, Google's, or Yahoo's " ++"SMTP server), and provide a list of addresses that receive recorded " ++"voicemail." ++msgstr "" ++ ++msgid "" ++"In order for this PBX to send emails containing voicemail recordings, you " ++"need to set up an SMTP server here. Your ISP usually provides an SMTP server " ++"for that purpose. You can also set up a third party SMTP server such as the " ++"one provided by Google or Yahoo." ++msgstr "" ++ ++msgid "Last Sent Voicemail Log" ++msgstr "" ++ ++msgid "Local Storage Directory" ++msgstr "" ++ ++msgid "No" ++msgstr "" ++ ++msgid "Outgoing mail (SMTP) Server" ++msgstr "" ++ ++msgid "SMTP Password" ++msgstr "" ++ ++msgid "SMTP Port Number" ++msgstr "" ++ ++msgid "SMTP Server Authentication" ++msgstr "" ++ ++msgid "SMTP Server Hostname or IP Address" ++msgstr "" ++ ++msgid "SMTP User Name" ++msgstr "" ++ ++msgid "Secure Connection Using TLS" ++msgstr "" ++ ++msgid "Voicemail Setup" ++msgstr "" ++ ++msgid "" ++"When you enable voicemail, you will have the opportunity to specify email " ++"addresses that receive recorded voicemail. You must also set up an SMTP " ++"server below." ++msgstr "" ++ ++msgid "Yes" ++msgstr "" ++ ++msgid "" ++"You can also retain copies of voicemail messages on the device running your " ++"PBX. The path specified here will be created if it doesn't exist. Beware of " ++"limited space on embedded devices like routers, and enable this option only " ++"if you know what you are doing." ++msgstr "" ++ ++msgid "" ++"Your real SMTP password is not shown for your protection. It will be changed " ++"only when you change the value in this box." ++msgstr "" +diff --git a/feeds/luci/applications/luci-app-pbx-voicemail/po/ru/pbx-voicemail.po b/feeds/luci/applications/luci-app-pbx-voicemail/po/ru/pbx-voicemail.po +new file mode 100644 +index 0000000..ae49c6d +--- /dev/null ++++ b/feeds/luci/applications/luci-app-pbx-voicemail/po/ru/pbx-voicemail.po +@@ -0,0 +1,174 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: LuCI: pbx-voicemail\n" ++"POT-Creation-Date: \n" ++"PO-Revision-Date: 2012-08-15 17:42+0300\n" ++"Last-Translator: Roman A. aka BasicXP \n" ++"Language-Team: Russian \n" ++"Language: ru\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%" ++"10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" ++"X-Generator: Pootle 2.0.4\n" ++"X-Poedit-SourceCharset: UTF-8\n" ++ ++msgid "Email Addresses that Receive Voicemail" ++msgstr "ÐÐ´Ñ€ÐµÑ Ñл. почты Ð´Ð»Ñ Ð¿Ð¾Ð»ÑƒÑ‡ÐµÐ½Ð¸Ñ Ð³Ð¾Ð»Ð¾Ñовой почты" ++ ++msgid "Enable Voicemail" ++msgstr "Включить голоÑовую почту" ++ ++msgid "Global Voicemail Setup" ++msgstr "Глобальные наÑтройки голоÑовой почты" ++ ++msgid "" ++"Here you can configure a global voicemail for this PBX. Since this system is " ++"intended to run on embedded systems like routers, there is no local storage " ++"of voicemail - it must be sent out by email. Therefore you need to configure " ++"an outgoing mail (SMTP) server (for example your ISP's, Google's, or Yahoo's " ++"SMTP server), and provide a list of addresses that receive recorded " ++"voicemail." ++msgstr "" ++"ЗдеÑÑŒ Ð’Ñ‹ можете наÑтроить голоÑовую почту ÐТС. Так как Ð´Ð°Ð½Ð½Ð°Ñ ÑиÑтема " ++"ÑвлÑетÑÑ Ð²Ñтраиваемой и предназначена Ð´Ð»Ñ Ñ‚Ð°ÐºÐ¸Ñ… уÑтройÑтв как, например, " ++"маршрутизаторы, локальное хранилище голоÑовой почты отÑутÑтвует. ГолоÑÐ¾Ð²Ð°Ñ " ++"почта переÑылаетÑÑ Ñ‡ÐµÑ€ÐµÐ· Ñлектронную почту. Следовательно, вам нужно указать " ++"Ñервер иÑходÑщей почты (SMTP) и перечиÑлить адреÑа, на которые будет " ++"переÑылатьÑÑ Ð³Ð¾Ð»Ð¾ÑÐ¾Ð²Ð°Ñ Ð¿Ð¾Ñ‡Ñ‚Ð°." ++ ++msgid "" ++"In order for this PBX to send emails containing voicemail recordings, you " ++"need to set up an SMTP server here. Your ISP usually provides an SMTP server " ++"for that purpose. You can also set up a third party SMTP server such as the " ++"one provided by Google or Yahoo." ++msgstr "" ++"Чтобы отÑылать Ñлектронную почту Ñ Ð·Ð°Ð¿Ð¸ÑÑми голоÑовой почты, вам необходимо " ++"указать SMTP-Ñервер. Ð’Ñ‹ можете иÑпользовать SMTP-Ñервер вашего интернет-" ++"провайдера или любой другой, например, SMTP-Ñервер Google или Yahoo." ++ ++msgid "Last Sent Voicemail Log" ++msgstr "ЗапиÑÑŒ журнала поÑледнего отправленного ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ Ð³Ð¾Ð»Ð¾Ñовой почты" ++ ++msgid "Local Storage Directory" ++msgstr "Ð›Ð¾ÐºÐ°Ð»ÑŒÐ½Ð°Ñ Ð´Ð¸Ñ€ÐµÐºÑ‚Ð¾Ñ€Ð¸Ñ Ñ…Ñ€Ð°Ð½ÐµÐ½Ð¸Ñ" ++ ++msgid "No" ++msgstr "Ðет" ++ ++msgid "Outgoing mail (SMTP) Server" ++msgstr "Сервер иÑходÑщей почты (SMTP)" ++ ++msgid "SMTP Password" ++msgstr "Пароль SMTP" ++ ++msgid "SMTP Port Number" ++msgstr "Ðомер порта SMTP" ++ ++msgid "SMTP Server Authentication" ++msgstr "ÐÑƒÑ‚ÐµÐ½Ñ‚Ð¸Ñ„Ð¸ÐºÐ°Ñ†Ð¸Ñ SMTP-Ñервера" ++ ++msgid "SMTP Server Hostname or IP Address" ++msgstr "Ð˜Ð¼Ñ SMTP-Ñервера или IP-адреÑ" ++ ++msgid "SMTP User Name" ++msgstr "Ð˜Ð¼Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ SMTP" ++ ++msgid "Secure Connection Using TLS" ++msgstr "Защищенное Ñоединение Ñ Ð¸Ñпользованием TLS" ++ ++msgid "Voicemail Setup" ++msgstr "ÐаÑтройка голоÑовой почты" ++ ++msgid "" ++"When you enable voicemail, you will have the opportunity to specify email " ++"addresses that receive recorded voicemail. You must also set up an SMTP " ++"server below." ++msgstr "" ++"При включении голоÑовой почты, у Ð²Ð°Ñ Ð±ÑƒÐ´ÐµÑ‚ возможноÑÑ‚ÑŒ указать адреÑа " ++"Ñлектронной почты, на которые будут отправлÑÑ‚ÑŒÑÑ Ð·Ð°Ð¿Ð¸Ñи голоÑовой почты. Ð’Ñ‹ " ++"также должны указать SMTP-Ñервер ниже." ++ ++msgid "Yes" ++msgstr "Да" ++ ++msgid "" ++"You can also retain copies of voicemail messages on the device running your " ++"PBX. The path specified here will be created if it doesn't exist. Beware of " ++"limited space on embedded devices like routers, and enable this option only " ++"if you know what you are doing." ++msgstr "" ++"Ð’Ñ‹ также можете ÑохранÑÑ‚ÑŒ копии Ñообщений голоÑовой почты локально на " ++"уÑтройÑтве Ñ Ð·Ð°Ð¿ÑƒÑ‰ÐµÐ½Ð½Ð¾Ð¹ ÐТС. Указанный здеÑÑŒ путь будет Ñоздан в Ñлучае его " ++"отÑутÑтвиÑ. Учитывайте, что проÑтранÑтво Ð´Ð»Ñ Ñ…Ñ€Ð°Ð½ÐµÐ½Ð¸Ñ Ñообщений голоÑовой " ++"почты может быть ограничено вашим уÑтройÑтвом." ++ ++msgid "" ++"Your real SMTP password is not shown for your protection. It will be changed " ++"only when you change the value in this box." ++msgstr "" ++"Ваш наÑтоÑщий пароль SMTP здеÑÑŒ не показан. Он будет изменён только тогда, " ++"когда вы измените значение в Ñтом поле." ++ ++#~ msgid "Directory to save voicemail into" ++#~ msgstr "Ð”Ð¸Ñ€ÐµÐºÑ‚Ð¾Ñ€Ð¸Ñ Ð´Ð»Ñ ÑÐ¾Ñ…Ñ€Ð°Ð½ÐµÐ½Ð¸Ñ Ð³Ð¾Ð»Ð¾Ñовой почты" ++ ++#~ msgid "Email addresses to forward to" ++#~ msgstr "ÐÐ´Ñ€ÐµÑ Ñл. почты Ð´Ð»Ñ Ð¿ÐµÑ€ÐµÐ½Ð°Ð¿Ñ€Ð°Ð²Ð»ÐµÐ½Ð¸Ñ" ++ ++#~ msgid "Enabled" ++#~ msgstr "Включено" ++ ++#~ msgid "" ++#~ "Here you can configure a global voicemail for this PBX. Since this system " ++#~ "is intended to run on embedded systems like routers, there is no local " ++#~ "storage of voicemail - it must be sent out by email. Therefore you need " ++#~ "to configure an outgoing mail (SMTP) server (for example the SMTP server " ++#~ "your ISP provides, or GMail), and provide a list of addresses the " ++#~ "voicemail will be sent to." ++#~ msgstr "" ++#~ "ЗдеÑÑŒ Ð’Ñ‹ можете наÑтроить голоÑовую почту ÐТС. Так как Ð´Ð°Ð½Ð½Ð°Ñ ÑиÑтема " ++#~ "ÑвлÑетÑÑ Ð²Ñтраиваемой и предназначена Ð´Ð»Ñ Ñ‚Ð°ÐºÐ¸Ñ… уÑтройÑтв как, например, " ++#~ "маршрутизаторы, локальное хранилище голоÑовой почты отÑутÑтвует. " ++#~ "ГолоÑÐ¾Ð²Ð°Ñ Ð¿Ð¾Ñ‡Ñ‚Ð° переÑылаетÑÑ Ñ‡ÐµÑ€ÐµÐ· Ñлектронную почту. Следовательно, Вам " ++#~ "нужно указать Ñервер (SMTP) иÑходÑщей почты и перечиÑлить адреÑа на " ++#~ "которые будет переÑылатьÑÑ Ð³Ð¾Ð»Ð¾ÑÐ¾Ð²Ð°Ñ Ð¿Ð¾Ñ‡Ñ‚Ð°." ++ ++#~ msgid "" ++#~ "In order for this PBX to send emails containing voicemail recordings, you " ++#~ "need to set up an SMTP server here. Your ISP usually provides an SMTP " ++#~ "server for that purpose. You can also set up a GMail, Yahoo, or other 3rd " ++#~ "party SMTP server." ++#~ msgstr "" ++#~ "Чтобы отÑылать Ñлектронную почту Ñ Ð·Ð°Ð¿Ð¸ÑÑми голоÑовой почты, Вам " ++#~ "необходимо указать SMTP Ñервер. Ð’Ñ‹ можете иÑпользовать SMTP Ñервер вашего " ++#~ "интернет провайдера или любой другой, например, SMTP Ñервер GMail или " ++#~ "Yahoo." ++ ++#~ msgid "SMTP port number" ++#~ msgstr "Ðомер порта SMTP" ++ ++#~ msgid "SMTP server authentication" ++#~ msgstr "ÐÑƒÑ‚ÐµÐ½Ñ‚Ð¸Ñ„Ð¸ÐºÐ°Ñ†Ð¸Ñ SMTP Ñервера" ++ ++#~ msgid "SMTP server hostname or IP" ++#~ msgstr "Ð˜Ð¼Ñ SMTP Ñервера или IP адреÑ" ++ ++#~ msgid "SMTP user name" ++#~ msgstr "Ð˜Ð¼Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ SMTP" ++ ++#~ msgid "Timeout before sending callers to voicemail" ++#~ msgstr "Таймаут перед перенаправлением звонÑщих на голоÑовую почту" ++ ++#~ msgid "Use TLS (secure connection)" ++#~ msgstr "ИÑпользовать TLS (защищенное Ñоединение)" ++ ++#~ msgid "" ++#~ "When you enable voicemail, you will have the opportunity to specify email " ++#~ "addresses which receive the message. You must also set up an SMTP server " ++#~ "below." ++#~ msgstr "" ++#~ "При включении голоÑовой почты, у Ð’Ð°Ñ Ð±ÑƒÐ´ÐµÑ‚ возможноÑÑ‚ÑŒ указать адреÑа " ++#~ "Ñлектронной почты на которые будут отправлÑÑ‚ÑŒÑÑ Ð·Ð°Ð¿Ð¸Ñи голоÑовой почты. " ++#~ "Ð’Ñ‹ также должны указать SMTP Ñервер ниже." +diff --git a/feeds/luci/applications/luci-app-pbx-voicemail/po/sk/pbx-voicemail.po b/feeds/luci/applications/luci-app-pbx-voicemail/po/sk/pbx-voicemail.po +new file mode 100644 +index 0000000..c3a5c5f +--- /dev/null ++++ b/feeds/luci/applications/luci-app-pbx-voicemail/po/sk/pbx-voicemail.po +@@ -0,0 +1,88 @@ ++msgid "" ++msgstr "" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Last-Translator: Automatically generated\n" ++"Language-Team: none\n" ++"MIME-Version: 1.0\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n" ++ ++msgid "Email Addresses that Receive Voicemail" ++msgstr "" ++ ++msgid "Enable Voicemail" ++msgstr "" ++ ++msgid "Global Voicemail Setup" ++msgstr "" ++ ++msgid "" ++"Here you can configure a global voicemail for this PBX. Since this system is " ++"intended to run on embedded systems like routers, there is no local storage " ++"of voicemail - it must be sent out by email. Therefore you need to configure " ++"an outgoing mail (SMTP) server (for example your ISP's, Google's, or Yahoo's " ++"SMTP server), and provide a list of addresses that receive recorded " ++"voicemail." ++msgstr "" ++ ++msgid "" ++"In order for this PBX to send emails containing voicemail recordings, you " ++"need to set up an SMTP server here. Your ISP usually provides an SMTP server " ++"for that purpose. You can also set up a third party SMTP server such as the " ++"one provided by Google or Yahoo." ++msgstr "" ++ ++msgid "Last Sent Voicemail Log" ++msgstr "" ++ ++msgid "Local Storage Directory" ++msgstr "" ++ ++msgid "No" ++msgstr "" ++ ++msgid "Outgoing mail (SMTP) Server" ++msgstr "" ++ ++msgid "SMTP Password" ++msgstr "" ++ ++msgid "SMTP Port Number" ++msgstr "" ++ ++msgid "SMTP Server Authentication" ++msgstr "" ++ ++msgid "SMTP Server Hostname or IP Address" ++msgstr "" ++ ++msgid "SMTP User Name" ++msgstr "" ++ ++msgid "Secure Connection Using TLS" ++msgstr "" ++ ++msgid "Voicemail Setup" ++msgstr "" ++ ++msgid "" ++"When you enable voicemail, you will have the opportunity to specify email " ++"addresses that receive recorded voicemail. You must also set up an SMTP " ++"server below." ++msgstr "" ++ ++msgid "Yes" ++msgstr "" ++ ++msgid "" ++"You can also retain copies of voicemail messages on the device running your " ++"PBX. The path specified here will be created if it doesn't exist. Beware of " ++"limited space on embedded devices like routers, and enable this option only " ++"if you know what you are doing." ++msgstr "" ++ ++msgid "" ++"Your real SMTP password is not shown for your protection. It will be changed " ++"only when you change the value in this box." ++msgstr "" +diff --git a/feeds/luci/applications/luci-app-pbx-voicemail/po/sv/pbx-voicemail.po b/feeds/luci/applications/luci-app-pbx-voicemail/po/sv/pbx-voicemail.po +new file mode 100644 +index 0000000..ea62b39 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-pbx-voicemail/po/sv/pbx-voicemail.po +@@ -0,0 +1,89 @@ ++msgid "" ++msgstr "" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Last-Translator: Automatically generated\n" ++"Language-Team: none\n" ++"Language: sv\n" ++"MIME-Version: 1.0\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n != 1);\n" ++ ++msgid "Email Addresses that Receive Voicemail" ++msgstr "" ++ ++msgid "Enable Voicemail" ++msgstr "" ++ ++msgid "Global Voicemail Setup" ++msgstr "" ++ ++msgid "" ++"Here you can configure a global voicemail for this PBX. Since this system is " ++"intended to run on embedded systems like routers, there is no local storage " ++"of voicemail - it must be sent out by email. Therefore you need to configure " ++"an outgoing mail (SMTP) server (for example your ISP's, Google's, or Yahoo's " ++"SMTP server), and provide a list of addresses that receive recorded " ++"voicemail." ++msgstr "" ++ ++msgid "" ++"In order for this PBX to send emails containing voicemail recordings, you " ++"need to set up an SMTP server here. Your ISP usually provides an SMTP server " ++"for that purpose. You can also set up a third party SMTP server such as the " ++"one provided by Google or Yahoo." ++msgstr "" ++ ++msgid "Last Sent Voicemail Log" ++msgstr "" ++ ++msgid "Local Storage Directory" ++msgstr "" ++ ++msgid "No" ++msgstr "" ++ ++msgid "Outgoing mail (SMTP) Server" ++msgstr "" ++ ++msgid "SMTP Password" ++msgstr "" ++ ++msgid "SMTP Port Number" ++msgstr "" ++ ++msgid "SMTP Server Authentication" ++msgstr "" ++ ++msgid "SMTP Server Hostname or IP Address" ++msgstr "" ++ ++msgid "SMTP User Name" ++msgstr "" ++ ++msgid "Secure Connection Using TLS" ++msgstr "" ++ ++msgid "Voicemail Setup" ++msgstr "" ++ ++msgid "" ++"When you enable voicemail, you will have the opportunity to specify email " ++"addresses that receive recorded voicemail. You must also set up an SMTP " ++"server below." ++msgstr "" ++ ++msgid "Yes" ++msgstr "" ++ ++msgid "" ++"You can also retain copies of voicemail messages on the device running your " ++"PBX. The path specified here will be created if it doesn't exist. Beware of " ++"limited space on embedded devices like routers, and enable this option only " ++"if you know what you are doing." ++msgstr "" ++ ++msgid "" ++"Your real SMTP password is not shown for your protection. It will be changed " ++"only when you change the value in this box." ++msgstr "" +diff --git a/feeds/luci/applications/luci-app-pbx-voicemail/po/templates/pbx-voicemail.pot b/feeds/luci/applications/luci-app-pbx-voicemail/po/templates/pbx-voicemail.pot +new file mode 100644 +index 0000000..35cdca3 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-pbx-voicemail/po/templates/pbx-voicemail.pot +@@ -0,0 +1,81 @@ ++msgid "" ++msgstr "Content-Type: text/plain; charset=UTF-8" ++ ++msgid "Email Addresses that Receive Voicemail" ++msgstr "" ++ ++msgid "Enable Voicemail" ++msgstr "" ++ ++msgid "Global Voicemail Setup" ++msgstr "" ++ ++msgid "" ++"Here you can configure a global voicemail for this PBX. Since this system is " ++"intended to run on embedded systems like routers, there is no local storage " ++"of voicemail - it must be sent out by email. Therefore you need to configure " ++"an outgoing mail (SMTP) server (for example your ISP's, Google's, or Yahoo's " ++"SMTP server), and provide a list of addresses that receive recorded " ++"voicemail." ++msgstr "" ++ ++msgid "" ++"In order for this PBX to send emails containing voicemail recordings, you " ++"need to set up an SMTP server here. Your ISP usually provides an SMTP server " ++"for that purpose. You can also set up a third party SMTP server such as the " ++"one provided by Google or Yahoo." ++msgstr "" ++ ++msgid "Last Sent Voicemail Log" ++msgstr "" ++ ++msgid "Local Storage Directory" ++msgstr "" ++ ++msgid "No" ++msgstr "" ++ ++msgid "Outgoing mail (SMTP) Server" ++msgstr "" ++ ++msgid "SMTP Password" ++msgstr "" ++ ++msgid "SMTP Port Number" ++msgstr "" ++ ++msgid "SMTP Server Authentication" ++msgstr "" ++ ++msgid "SMTP Server Hostname or IP Address" ++msgstr "" ++ ++msgid "SMTP User Name" ++msgstr "" ++ ++msgid "Secure Connection Using TLS" ++msgstr "" ++ ++msgid "Voicemail Setup" ++msgstr "" ++ ++msgid "" ++"When you enable voicemail, you will have the opportunity to specify email " ++"addresses that receive recorded voicemail. You must also set up an SMTP " ++"server below." ++msgstr "" ++ ++msgid "Yes" ++msgstr "" ++ ++msgid "" ++"You can also retain copies of voicemail messages on the device running your " ++"PBX. The path specified here will be created if it doesn't exist. Beware of " ++"limited space on embedded devices like routers, and enable this option only " ++"if you know what you are doing." ++msgstr "" ++ ++msgid "" ++"Your real SMTP password is not shown for your protection. It will be changed " ++"only when you change the value in this box." ++msgstr "" +diff --git a/feeds/luci/applications/luci-app-pbx-voicemail/po/tr/pbx-voicemail.po b/feeds/luci/applications/luci-app-pbx-voicemail/po/tr/pbx-voicemail.po +new file mode 100644 +index 0000000..19e26bf +--- /dev/null ++++ b/feeds/luci/applications/luci-app-pbx-voicemail/po/tr/pbx-voicemail.po +@@ -0,0 +1,88 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Last-Translator: Automatically generated\n" ++"Language-Team: none\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=1; plural=0;\n" ++ ++msgid "Email Addresses that Receive Voicemail" ++msgstr "" ++ ++msgid "Enable Voicemail" ++msgstr "" ++ ++msgid "Global Voicemail Setup" ++msgstr "" ++ ++msgid "" ++"Here you can configure a global voicemail for this PBX. Since this system is " ++"intended to run on embedded systems like routers, there is no local storage " ++"of voicemail - it must be sent out by email. Therefore you need to configure " ++"an outgoing mail (SMTP) server (for example your ISP's, Google's, or Yahoo's " ++"SMTP server), and provide a list of addresses that receive recorded " ++"voicemail." ++msgstr "" ++ ++msgid "" ++"In order for this PBX to send emails containing voicemail recordings, you " ++"need to set up an SMTP server here. Your ISP usually provides an SMTP server " ++"for that purpose. You can also set up a third party SMTP server such as the " ++"one provided by Google or Yahoo." ++msgstr "" ++ ++msgid "Last Sent Voicemail Log" ++msgstr "" ++ ++msgid "Local Storage Directory" ++msgstr "" ++ ++msgid "No" ++msgstr "" ++ ++msgid "Outgoing mail (SMTP) Server" ++msgstr "" ++ ++msgid "SMTP Password" ++msgstr "" ++ ++msgid "SMTP Port Number" ++msgstr "" ++ ++msgid "SMTP Server Authentication" ++msgstr "" ++ ++msgid "SMTP Server Hostname or IP Address" ++msgstr "" ++ ++msgid "SMTP User Name" ++msgstr "" ++ ++msgid "Secure Connection Using TLS" ++msgstr "" ++ ++msgid "Voicemail Setup" ++msgstr "" ++ ++msgid "" ++"When you enable voicemail, you will have the opportunity to specify email " ++"addresses that receive recorded voicemail. You must also set up an SMTP " ++"server below." ++msgstr "" ++ ++msgid "Yes" ++msgstr "" ++ ++msgid "" ++"You can also retain copies of voicemail messages on the device running your " ++"PBX. The path specified here will be created if it doesn't exist. Beware of " ++"limited space on embedded devices like routers, and enable this option only " ++"if you know what you are doing." ++msgstr "" ++ ++msgid "" ++"Your real SMTP password is not shown for your protection. It will be changed " ++"only when you change the value in this box." ++msgstr "" +diff --git a/feeds/luci/applications/luci-app-pbx-voicemail/po/uk/pbx-voicemail.po b/feeds/luci/applications/luci-app-pbx-voicemail/po/uk/pbx-voicemail.po +new file mode 100644 +index 0000000..5654183 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-pbx-voicemail/po/uk/pbx-voicemail.po +@@ -0,0 +1,89 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Last-Translator: Automatically generated\n" ++"Language-Team: none\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n" ++"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" ++ ++msgid "Email Addresses that Receive Voicemail" ++msgstr "" ++ ++msgid "Enable Voicemail" ++msgstr "" ++ ++msgid "Global Voicemail Setup" ++msgstr "" ++ ++msgid "" ++"Here you can configure a global voicemail for this PBX. Since this system is " ++"intended to run on embedded systems like routers, there is no local storage " ++"of voicemail - it must be sent out by email. Therefore you need to configure " ++"an outgoing mail (SMTP) server (for example your ISP's, Google's, or Yahoo's " ++"SMTP server), and provide a list of addresses that receive recorded " ++"voicemail." ++msgstr "" ++ ++msgid "" ++"In order for this PBX to send emails containing voicemail recordings, you " ++"need to set up an SMTP server here. Your ISP usually provides an SMTP server " ++"for that purpose. You can also set up a third party SMTP server such as the " ++"one provided by Google or Yahoo." ++msgstr "" ++ ++msgid "Last Sent Voicemail Log" ++msgstr "" ++ ++msgid "Local Storage Directory" ++msgstr "" ++ ++msgid "No" ++msgstr "" ++ ++msgid "Outgoing mail (SMTP) Server" ++msgstr "" ++ ++msgid "SMTP Password" ++msgstr "" ++ ++msgid "SMTP Port Number" ++msgstr "" ++ ++msgid "SMTP Server Authentication" ++msgstr "" ++ ++msgid "SMTP Server Hostname or IP Address" ++msgstr "" ++ ++msgid "SMTP User Name" ++msgstr "" ++ ++msgid "Secure Connection Using TLS" ++msgstr "" ++ ++msgid "Voicemail Setup" ++msgstr "" ++ ++msgid "" ++"When you enable voicemail, you will have the opportunity to specify email " ++"addresses that receive recorded voicemail. You must also set up an SMTP " ++"server below." ++msgstr "" ++ ++msgid "Yes" ++msgstr "" ++ ++msgid "" ++"You can also retain copies of voicemail messages on the device running your " ++"PBX. The path specified here will be created if it doesn't exist. Beware of " ++"limited space on embedded devices like routers, and enable this option only " ++"if you know what you are doing." ++msgstr "" ++ ++msgid "" ++"Your real SMTP password is not shown for your protection. It will be changed " ++"only when you change the value in this box." ++msgstr "" +diff --git a/feeds/luci/applications/luci-app-pbx-voicemail/po/vi/pbx-voicemail.po b/feeds/luci/applications/luci-app-pbx-voicemail/po/vi/pbx-voicemail.po +new file mode 100644 +index 0000000..19e26bf +--- /dev/null ++++ b/feeds/luci/applications/luci-app-pbx-voicemail/po/vi/pbx-voicemail.po +@@ -0,0 +1,88 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Last-Translator: Automatically generated\n" ++"Language-Team: none\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=1; plural=0;\n" ++ ++msgid "Email Addresses that Receive Voicemail" ++msgstr "" ++ ++msgid "Enable Voicemail" ++msgstr "" ++ ++msgid "Global Voicemail Setup" ++msgstr "" ++ ++msgid "" ++"Here you can configure a global voicemail for this PBX. Since this system is " ++"intended to run on embedded systems like routers, there is no local storage " ++"of voicemail - it must be sent out by email. Therefore you need to configure " ++"an outgoing mail (SMTP) server (for example your ISP's, Google's, or Yahoo's " ++"SMTP server), and provide a list of addresses that receive recorded " ++"voicemail." ++msgstr "" ++ ++msgid "" ++"In order for this PBX to send emails containing voicemail recordings, you " ++"need to set up an SMTP server here. Your ISP usually provides an SMTP server " ++"for that purpose. You can also set up a third party SMTP server such as the " ++"one provided by Google or Yahoo." ++msgstr "" ++ ++msgid "Last Sent Voicemail Log" ++msgstr "" ++ ++msgid "Local Storage Directory" ++msgstr "" ++ ++msgid "No" ++msgstr "" ++ ++msgid "Outgoing mail (SMTP) Server" ++msgstr "" ++ ++msgid "SMTP Password" ++msgstr "" ++ ++msgid "SMTP Port Number" ++msgstr "" ++ ++msgid "SMTP Server Authentication" ++msgstr "" ++ ++msgid "SMTP Server Hostname or IP Address" ++msgstr "" ++ ++msgid "SMTP User Name" ++msgstr "" ++ ++msgid "Secure Connection Using TLS" ++msgstr "" ++ ++msgid "Voicemail Setup" ++msgstr "" ++ ++msgid "" ++"When you enable voicemail, you will have the opportunity to specify email " ++"addresses that receive recorded voicemail. You must also set up an SMTP " ++"server below." ++msgstr "" ++ ++msgid "Yes" ++msgstr "" ++ ++msgid "" ++"You can also retain copies of voicemail messages on the device running your " ++"PBX. The path specified here will be created if it doesn't exist. Beware of " ++"limited space on embedded devices like routers, and enable this option only " ++"if you know what you are doing." ++msgstr "" ++ ++msgid "" ++"Your real SMTP password is not shown for your protection. It will be changed " ++"only when you change the value in this box." ++msgstr "" +diff --git a/feeds/luci/applications/luci-app-pbx-voicemail/po/zh-cn/pbx-voicemail.po b/feeds/luci/applications/luci-app-pbx-voicemail/po/zh-cn/pbx-voicemail.po +new file mode 100644 +index 0000000..0be8258 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-pbx-voicemail/po/zh-cn/pbx-voicemail.po +@@ -0,0 +1,97 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"PO-Revision-Date: 2013-10-08 18:42+0200\n" ++"Last-Translator: Tanyingyu \n" ++"Language-Team: none\n" ++"Language: zh_CN\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=1; plural=0;\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "Email Addresses that Receive Voicemail" ++msgstr "接收语音邮箱的电å­é‚®ç®±åœ°å€" ++ ++msgid "Enable Voicemail" ++msgstr "å¯ç”¨è¯­éŸ³é‚®ç®±" ++ ++msgid "Global Voicemail Setup" ++msgstr "全局语音邮箱设置" ++ ++msgid "" ++"Here you can configure a global voicemail for this PBX. Since this system is " ++"intended to run on embedded systems like routers, there is no local storage " ++"of voicemail - it must be sent out by email. Therefore you need to configure " ++"an outgoing mail (SMTP) server (for example your ISP's, Google's, or Yahoo's " ++"SMTP server), and provide a list of addresses that receive recorded " ++"voicemail." ++msgstr "" ++"在这里,你å¯ä»¥ä¸ºPBXé…置一个全çƒæ€§çš„语音邮件。由于这个系统è¿è¡Œåœ¨åµŒå…¥å¼ç³»ç»Ÿä¸­ï¼Œå¦‚路由器,没有本地存储语音邮件 - 它必须通过电å­é‚®ä»¶å‘é€å‡ºåŽ»ã€‚因此,你" ++"需è¦é…置一个外å‘邮件(SMTP)æœåŠ¡å™¨ï¼ˆä¾‹å¦‚您的ISP,谷歌或雅虎的SMTPæœåŠ¡å™¨ï¼‰ï¼Œå¹¶æ供接收记录语音信箱的地å€çš„列表。" ++ ++msgid "" ++"In order for this PBX to send emails containing voicemail recordings, you " ++"need to set up an SMTP server here. Your ISP usually provides an SMTP server " ++"for that purpose. You can also set up a third party SMTP server such as the " ++"one provided by Google or Yahoo." ++msgstr "" ++"为了这个PBXå‘é€åŒ…å«è¯­éŸ³ä¿¡ç®±å½•éŸ³çš„电å­é‚®ä»¶ï¼Œä½ éœ€è¦åœ¨è¿™é‡Œè®¾ç½®ä¸€ä¸ªSMTPæœåŠ¡å™¨ã€‚您的ISP通常会æ供一个SMTPæœåŠ¡å™¨ã€‚您也å¯ä»¥è®¾ç«‹ä¸€ä¸ªç¬¬ä¸‰æ–¹çš„SMT" ++"PæœåŠ¡å™¨ï¼Œåƒè°·æ­Œæˆ–雅虎。" ++ ++msgid "Last Sent Voicemail Log" ++msgstr "最åŽå‘é€çš„语音信箱日志" ++ ++msgid "Local Storage Directory" ++msgstr "本地存储目录" ++ ++msgid "No" ++msgstr "ä¸" ++ ++msgid "Outgoing mail (SMTP) Server" ++msgstr "电å­é‚®ä»¶å‘é€æœåŠ¡å™¨ï¼ˆSMTP)" ++ ++msgid "SMTP Password" ++msgstr "SMTP登录密ç " ++ ++msgid "SMTP Port Number" ++msgstr "SMTP端å£" ++ ++msgid "SMTP Server Authentication" ++msgstr "SMTPæœåŠ¡å™¨è®¤è¯" ++ ++msgid "SMTP Server Hostname or IP Address" ++msgstr "SMTPæœåŠ¡å™¨ä¸»æœºå或IP地å€" ++ ++msgid "SMTP User Name" ++msgstr "SMTP用户å" ++ ++msgid "Secure Connection Using TLS" ++msgstr "使用TLS安全连接" ++ ++msgid "Voicemail Setup" ++msgstr "语音邮箱设置" ++ ++msgid "" ++"When you enable voicemail, you will have the opportunity to specify email " ++"addresses that receive recorded voicemail. You must also set up an SMTP " ++"server below." ++msgstr "当你å¯ç”¨äº†è¯­éŸ³ä¿¡ç®±ï¼Œä½ å°†è¦æŒ‡å®šæŽ¥æ”¶è®°å½•è¯­éŸ³ä¿¡ç®±çš„电å­é‚®ä»¶åœ°å€ã€‚您还必须设置下é¢çš„SMTPæœåŠ¡å™¨" ++ ++msgid "Yes" ++msgstr "是" ++ ++msgid "" ++"You can also retain copies of voicemail messages on the device running your " ++"PBX. The path specified here will be created if it doesn't exist. Beware of " ++"limited space on embedded devices like routers, and enable this option only " ++"if you know what you are doing." ++msgstr "" ++"您也å¯ä»¥ä¿ç•™æ‚¨çš„PBX语音信箱留言的副本在你è¿è¡Œçš„设备上。此处指定的路径当ä¸å­˜åœ¨æ—¶ï¼Œå°†è¢«åˆ›å»ºã€‚谨防嵌入å¼è®¾å¤‡ä¸Šæœ‰é™çš„å­˜å–空间,如路由器,所以此选项åªæœ‰ä½ " ++"当知é“处ç†æ—¶æ‰å¯ä½¿ç”¨ã€‚" ++ ++msgid "" ++"Your real SMTP password is not shown for your protection. It will be changed " ++"only when you change the value in this box." ++msgstr "为了ä¿æŠ¤æ‚¨çœŸæ­£çš„SMTP密ç ä¸æ˜¾ç¤ºã€‚该选项需è¦æ›´æ”¹ã€‚" +diff --git a/feeds/luci/applications/luci-app-pbx-voicemail/po/zh-tw/pbx-voicemail.po b/feeds/luci/applications/luci-app-pbx-voicemail/po/zh-tw/pbx-voicemail.po +new file mode 100644 +index 0000000..14de629 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-pbx-voicemail/po/zh-tw/pbx-voicemail.po +@@ -0,0 +1,98 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"PO-Revision-Date: 2014-05-14 18:41+0200\n" ++"Last-Translator: omnistack \n" ++"Language-Team: none\n" ++"Language: zh_TW\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=1; plural=0;\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "Email Addresses that Receive Voicemail" ++msgstr "接收語音郵件的信箱ä½å€" ++ ++msgid "Enable Voicemail" ++msgstr "啟用語音郵件功能" ++ ++msgid "Global Voicemail Setup" ++msgstr "語音郵件通用設定" ++ ++msgid "" ++"Here you can configure a global voicemail for this PBX. Since this system is " ++"intended to run on embedded systems like routers, there is no local storage " ++"of voicemail - it must be sent out by email. Therefore you need to configure " ++"an outgoing mail (SMTP) server (for example your ISP's, Google's, or Yahoo's " ++"SMTP server), and provide a list of addresses that receive recorded " ++"voicemail." ++msgstr "" ++"在這裡å¯ä»¥å¹«PBX總機設定通用語音郵件. 因為這個系統想è¦åƒè·¯ç”±å™¨ä¸€èˆ¬è·‘在嵌入å¼ç³»çµ±, 這裡並無本地語言郵件的儲存空間 - 它必須由郵件來傳é€. " ++"因此你需è¦è¨­å®šä¸€å€‹(SMTP)外寄郵件伺æœå™¨(例如你的ISP, Google, 或者Yahoo外寄郵件伺æœå™¨), " ++"並且æ供一個ä½å€æ¸…å–®å¯ä»¥æŽ¥æ”¶éŒ„音檔的語音郵件." ++ ++msgid "" ++"In order for this PBX to send emails containing voicemail recordings, you " ++"need to set up an SMTP server here. Your ISP usually provides an SMTP server " ++"for that purpose. You can also set up a third party SMTP server such as the " ++"one provided by Google or Yahoo." ++msgstr "" ++"為了幫PBX總機傳é€é™„帶語音郵件錄音檔, 你必須設定一個(SMTP)外寄郵件伺æœå™¨.通常你的ISP會æ供一個SMTP外寄郵件伺æœå™¨è®“客戶寄信,.你也å¯ä»¥" ++"設定第三方SMTP外寄郵件伺æœå™¨é¡žä¼¼Google或Yahooæ供的也行." ++ ++msgid "Last Sent Voicemail Log" ++msgstr "上一次傳é€èªžéŸ³éƒµä»¶çš„記錄" ++ ++msgid "Local Storage Directory" ++msgstr "本地端儲存目錄" ++ ++msgid "No" ++msgstr "No" ++ ++msgid "Outgoing mail (SMTP) Server" ++msgstr "外寄郵件(SMTP)伺æœå™¨" ++ ++msgid "SMTP Password" ++msgstr "外寄郵件(SMTP)伺æœå™¨å‚³é€å¯†ç¢¼" ++ ++msgid "SMTP Port Number" ++msgstr "外寄郵件(SMTP)伺æœå™¨æœå‹™åŸ è™Ÿ" ++ ++msgid "SMTP Server Authentication" ++msgstr "外寄郵件(SMTP)伺æœå™¨é©—è­‰" ++ ++msgid "SMTP Server Hostname or IP Address" ++msgstr "外寄郵件(SMTP)伺æœå™¨ä¸»æ©Ÿå稱或者IPä½å€" ++ ++msgid "SMTP User Name" ++msgstr "外寄郵件(SMTP)伺æœå™¨ç™»å…¥ä½¿ç”¨è€…å稱" ++ ++msgid "Secure Connection Using TLS" ++msgstr "採用TLS加密å”議安全連線" ++ ++msgid "Voicemail Setup" ++msgstr "設定語音郵件" ++ ++msgid "" ++"When you enable voicemail, you will have the opportunity to specify email " ++"addresses that receive recorded voicemail. You must also set up an SMTP " ++"server below." ++msgstr "當你啟用語音郵件功能, 擬將有機會指定特定å¯æŽ¥æ”¶éŒ„音檔的語音郵件的郵件ä½å€. 你也必須在下é¢è¨­å®šå¤–寄郵件(SMTP)伺æœå™¨." ++ ++msgid "Yes" ++msgstr "Yes" ++ ++msgid "" ++"You can also retain copies of voicemail messages on the device running your " ++"PBX. The path specified here will be created if it doesn't exist. Beware of " ++"limited space on embedded devices like routers, and enable this option only " ++"if you know what you are doing." ++msgstr "" ++"你也å¯ä»¥ä¿ç•™èªžéŸ³éƒµä»¶è¨Šæ¯çš„複本在PBX總機的設備上. 這裡所指定的路徑如果它ä¸å­˜åœ¨æ™‚將會被建立. 為é é˜²åƒè·¯ç”±å™¨çš„嵌入å¼è¨­å‚™æœ‰é™çš„空間é™åˆ¶, " ++"如果你確定這個用途請啟用這個é¸é …." ++ ++msgid "" ++"Your real SMTP password is not shown for your protection. It will be changed " ++"only when you change the value in this box." ++msgstr "為了ä¿è­·ä½ çš„SMTP密碼將ä¸æœƒé¡¯ç¤º. åªæœ‰ç•¶ä½ æ”¹è®Šç›’å­ä¸­çš„值時它將會被變更" +diff --git a/feeds/luci/applications/luci-app-pbx-voicemail/root/etc/config/pbx-voicemail b/feeds/luci/applications/luci-app-pbx-voicemail/root/etc/config/pbx-voicemail +new file mode 100644 +index 0000000..94e3e96 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-pbx-voicemail/root/etc/config/pbx-voicemail +@@ -0,0 +1,6 @@ ++config 'voicemail' 'global_voicemail' ++ ++config 'voicemail' 'voicemail_smtp' ++ ++config 'voicemail' 'voicemail_log' ++ +diff --git a/feeds/luci/applications/luci-app-pbx-voicemail/root/etc/pbx-voicemail/pbx-move-greeting b/feeds/luci/applications/luci-app-pbx-voicemail/root/etc/pbx-voicemail/pbx-move-greeting +new file mode 100755 +index 0000000..21fe694 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-pbx-voicemail/root/etc/pbx-voicemail/pbx-move-greeting +@@ -0,0 +1,6 @@ ++#!/bin/sh ++ ++if [ -f "/tmp/voicemail/greeting.gsm" ] ++then ++ mv /tmp/voicemail/greeting.gsm /etc/pbx-voicemail/recordings/ ++fi +diff --git a/feeds/luci/applications/luci-app-pbx-voicemail/root/etc/pbx-voicemail/pbx-msmtprc-account-auth.TEMPLATE b/feeds/luci/applications/luci-app-pbx-voicemail/root/etc/pbx-voicemail/pbx-msmtprc-account-auth.TEMPLATE +new file mode 100644 +index 0000000..6b2026c +--- /dev/null ++++ b/feeds/luci/applications/luci-app-pbx-voicemail/root/etc/pbx-voicemail/pbx-msmtprc-account-auth.TEMPLATE +@@ -0,0 +1,2 @@ ++user |USER| ++password |PASSWORD| +diff --git a/feeds/luci/applications/luci-app-pbx-voicemail/root/etc/pbx-voicemail/pbx-msmtprc-account-default.TEMPLATE b/feeds/luci/applications/luci-app-pbx-voicemail/root/etc/pbx-voicemail/pbx-msmtprc-account-default.TEMPLATE +new file mode 100644 +index 0000000..a001c64 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-pbx-voicemail/root/etc/pbx-voicemail/pbx-msmtprc-account-default.TEMPLATE +@@ -0,0 +1,2 @@ ++account default : defaultacct ++ +diff --git a/feeds/luci/applications/luci-app-pbx-voicemail/root/etc/pbx-voicemail/pbx-msmtprc-account.TEMPLATE b/feeds/luci/applications/luci-app-pbx-voicemail/root/etc/pbx-voicemail/pbx-msmtprc-account.TEMPLATE +new file mode 100644 +index 0000000..fd1f479 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-pbx-voicemail/root/etc/pbx-voicemail/pbx-msmtprc-account.TEMPLATE +@@ -0,0 +1,5 @@ ++account defaultacct ++host |HOST| ++port |PORT| ++from voicemail@pbx ++ +diff --git a/feeds/luci/applications/luci-app-pbx-voicemail/root/etc/pbx-voicemail/pbx-msmtprc-defaults.TEMPLATE b/feeds/luci/applications/luci-app-pbx-voicemail/root/etc/pbx-voicemail/pbx-msmtprc-defaults.TEMPLATE +new file mode 100644 +index 0000000..a4456b8 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-pbx-voicemail/root/etc/pbx-voicemail/pbx-msmtprc-defaults.TEMPLATE +@@ -0,0 +1,5 @@ ++defaults ++auth |AUTH| ++tls_certcheck off ++tls |TLS| ++ +diff --git a/feeds/luci/applications/luci-app-pbx-voicemail/root/etc/pbx-voicemail/pbx-send-voicemail b/feeds/luci/applications/luci-app-pbx-voicemail/root/etc/pbx-voicemail/pbx-send-voicemail +new file mode 100755 +index 0000000..ba639d0 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-pbx-voicemail/root/etc/pbx-voicemail/pbx-send-voicemail +@@ -0,0 +1,114 @@ ++#!/bin/sh ++# ++# Copyright 2011 Iordan Iordanov ++# ++# This file is part of luci-pbx-voicemail. ++# ++# luci-pbx-voicemail is free software: you can redistribute it and/or modify ++# it under the terms of the GNU General Public License as published by ++# the Free Software Foundation, either version 3 of the License, or ++# (at your option) any later version. ++# ++# luci-pbx-voicemail is distributed in the hope that it will be useful, ++# but WITHOUT ANY WARRANTY; without even the implied warranty of ++# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++# GNU General Public License for more details. ++# ++# You should have received a copy of the GNU General Public License ++# along with luci-pbx-voicemail. If not, see . ++# ++# ++# Thanks to http://www.zedwood.com for providing an excellent example of how to ++# properly assemble an email message with a base64 encoded attachment. ++# ++ ++LOGFILE=/tmp/voicemail/last_sent_voicemail.log ++ ++# Redirect standard error and standard output to a log file. ++rm -f "$LOGFILE" ++exec 1>"$LOGFILE" ++exec 2>&1 ++ ++# Appends its second argument to a file named in the first argument. ++append_to_file () ++{ ++ echo "$2">>$1; ++} ++ ++# Grab the attachment name, which should be sent as the first argument, and ++# exit with a warning if there is no voicemail to send. ++ATTACHMENT="$1" ++[ ! -f "$ATTACHMENT" ] && echo "WARNING: Found no voicemail recording to send." && exit ++ ++# Grab the callerID which should have been sent as an argument. ++CALLERID="$2" ++[ -z "$CALLERID" ] && CALLERID="An unknown caller" ++ ++# Determine addresses we would like to send the voicemail to and exit if none are found. ++TO="`uci -q get pbx-voicemail.global_voicemail.global_email_addresses | tr ' ' ','`" ++[ -z "$TO" ] && echo "WARNING: Found no addresses to send voicemail to." && exit ++ ++# See whether we should retain a copy of the voicemail. ++SAVEPATH="`uci -q get pbx-voicemail.global_voicemail.global_save_path`" ++ ++DATE="`date +%Y-%m-%d`" ++TIME="`date +%H:%M:%S`" ++FROM="voicemail@pbx" ++REPLY="do-not-reply@pbx" ++SUBJECT="Voicemail from $CALLERID, $DATE, $TIME" ++MSGBODY="$CALLERID has left voicemail for you on $DATE at $TIME." ++MIMETYPE="audio/wav" ++TMP1="/tmp/voicemail/tmpemail1.$$"; ++TMP2="/tmp/voicemail/tmpemail2.$$"; ++BOUNDARY="`date +%s | md5sum | awk '{print $1}'`" ++FILENAME="voicemail-$DATE-$TIME.WAV" ++ ++# Clean up just in case. ++rm -f $TMP1 $TMP2 ++ ++append_to_file $TMP1 "From: $FROM" ++append_to_file $TMP1 "To: $TO" ++append_to_file $TMP1 "Reply-To: $REPLY" ++append_to_file $TMP1 "Subject: $SUBJECT" ++append_to_file $TMP1 "Content-Type: multipart/mixed; boundary=\""$BOUNDARY"\"" ++append_to_file $TMP1 "" ++append_to_file $TMP1 "This is a MIME formatted message. If you see this text it means that your" ++append_to_file $TMP1 "email software does not support MIME formatted messages." ++append_to_file $TMP1 "" ++append_to_file $TMP1 "--$BOUNDARY" ++append_to_file $TMP1 "Content-Type: text/plain; charset=ISO-8859-1; format=flowed" ++append_to_file $TMP1 "Content-Transfer-Encoding: 7bit" ++append_to_file $TMP1 "Content-Disposition: inline" ++append_to_file $TMP1 "" ++append_to_file $TMP1 "$MSGBODY" ++append_to_file $TMP1 "" ++append_to_file $TMP1 "" ++append_to_file $TMP1 "--$BOUNDARY" ++append_to_file $TMP1 "Content-Type: $MIMETYPE; name=\"$FILENAME\"" ++append_to_file $TMP1 "Content-Transfer-Encoding: base64" ++append_to_file $TMP1 "Content-Disposition: attachment; filename=\"$FILENAME\";" ++append_to_file $TMP1 "" ++ ++append_to_file $TMP2 "" ++append_to_file $TMP2 "" ++append_to_file $TMP2 "--$BOUNDARY--" ++append_to_file $TMP2 "" ++append_to_file $TMP2 "" ++ ++# Cat everything together and pass to msmtprc to send out. ++( cat $TMP1 ++ cat "$ATTACHMENT" | base64 ++ cat $TMP2 ) | msmtp -t -C /etc/pbx-msmtprc ++ ++# Clean up email temp files. ++rm -f $TMP1 $TMP2 ++ ++# Either delete or move the attachment based on the SAVEPATH variable. ++if [ -z "$SAVEPATH" ] ++then ++ rm -f "$ATTACHMENT" ++else ++ mkdir -p "$SAVEPATH" ++ mv --backup=t "$ATTACHMENT" "$SAVEPATH/$FILENAME" ++fi ++ +diff --git a/feeds/luci/applications/luci-app-pbx/COPYING b/feeds/luci/applications/luci-app-pbx/COPYING +new file mode 100644 +index 0000000..94a9ed0 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-pbx/COPYING +@@ -0,0 +1,674 @@ ++ GNU GENERAL PUBLIC LICENSE ++ Version 3, 29 June 2007 ++ ++ Copyright (C) 2007 Free Software Foundation, Inc. ++ Everyone is permitted to copy and distribute verbatim copies ++ of this license document, but changing it is not allowed. ++ ++ Preamble ++ ++ The GNU General Public License is a free, copyleft license for ++software and other kinds of works. ++ ++ The licenses for most software and other practical works are designed ++to take away your freedom to share and change the works. By contrast, ++the GNU General Public License is intended to guarantee your freedom to ++share and change all versions of a program--to make sure it remains free ++software for all its users. We, the Free Software Foundation, use the ++GNU General Public License for most of our software; it applies also to ++any other work released this way by its authors. You can apply it to ++your programs, too. ++ ++ When we speak of free software, we are referring to freedom, not ++price. Our General Public Licenses are designed to make sure that you ++have the freedom to distribute copies of free software (and charge for ++them if you wish), that you receive source code or can get it if you ++want it, that you can change the software or use pieces of it in new ++free programs, and that you know you can do these things. ++ ++ To protect your rights, we need to prevent others from denying you ++these rights or asking you to surrender the rights. Therefore, you have ++certain responsibilities if you distribute copies of the software, or if ++you modify it: responsibilities to respect the freedom of others. ++ ++ For example, if you distribute copies of such a program, whether ++gratis or for a fee, you must pass on to the recipients the same ++freedoms that you received. You must make sure that they, too, receive ++or can get the source code. And you must show them these terms so they ++know their rights. ++ ++ Developers that use the GNU GPL protect your rights with two steps: ++(1) assert copyright on the software, and (2) offer you this License ++giving you legal permission to copy, distribute and/or modify it. ++ ++ For the developers' and authors' protection, the GPL clearly explains ++that there is no warranty for this free software. For both users' and ++authors' sake, the GPL requires that modified versions be marked as ++changed, so that their problems will not be attributed erroneously to ++authors of previous versions. ++ ++ Some devices are designed to deny users access to install or run ++modified versions of the software inside them, although the manufacturer ++can do so. This is fundamentally incompatible with the aim of ++protecting users' freedom to change the software. The systematic ++pattern of such abuse occurs in the area of products for individuals to ++use, which is precisely where it is most unacceptable. Therefore, we ++have designed this version of the GPL to prohibit the practice for those ++products. If such problems arise substantially in other domains, we ++stand ready to extend this provision to those domains in future versions ++of the GPL, as needed to protect the freedom of users. ++ ++ Finally, every program is threatened constantly by software patents. ++States should not allow patents to restrict development and use of ++software on general-purpose computers, but in those that do, we wish to ++avoid the special danger that patents applied to a free program could ++make it effectively proprietary. To prevent this, the GPL assures that ++patents cannot be used to render the program non-free. ++ ++ The precise terms and conditions for copying, distribution and ++modification follow. ++ ++ TERMS AND CONDITIONS ++ ++ 0. Definitions. ++ ++ "This License" refers to version 3 of the GNU General Public License. ++ ++ "Copyright" also means copyright-like laws that apply to other kinds of ++works, such as semiconductor masks. ++ ++ "The Program" refers to any copyrightable work licensed under this ++License. Each licensee is addressed as "you". "Licensees" and ++"recipients" may be individuals or organizations. ++ ++ To "modify" a work means to copy from or adapt all or part of the work ++in a fashion requiring copyright permission, other than the making of an ++exact copy. The resulting work is called a "modified version" of the ++earlier work or a work "based on" the earlier work. ++ ++ A "covered work" means either the unmodified Program or a work based ++on the Program. ++ ++ To "propagate" a work means to do anything with it that, without ++permission, would make you directly or secondarily liable for ++infringement under applicable copyright law, except executing it on a ++computer or modifying a private copy. Propagation includes copying, ++distribution (with or without modification), making available to the ++public, and in some countries other activities as well. ++ ++ To "convey" a work means any kind of propagation that enables other ++parties to make or receive copies. Mere interaction with a user through ++a computer network, with no transfer of a copy, is not conveying. ++ ++ An interactive user interface displays "Appropriate Legal Notices" ++to the extent that it includes a convenient and prominently visible ++feature that (1) displays an appropriate copyright notice, and (2) ++tells the user that there is no warranty for the work (except to the ++extent that warranties are provided), that licensees may convey the ++work under this License, and how to view a copy of this License. If ++the interface presents a list of user commands or options, such as a ++menu, a prominent item in the list meets this criterion. ++ ++ 1. Source Code. ++ ++ The "source code" for a work means the preferred form of the work ++for making modifications to it. "Object code" means any non-source ++form of a work. ++ ++ A "Standard Interface" means an interface that either is an official ++standard defined by a recognized standards body, or, in the case of ++interfaces specified for a particular programming language, one that ++is widely used among developers working in that language. ++ ++ The "System Libraries" of an executable work include anything, other ++than the work as a whole, that (a) is included in the normal form of ++packaging a Major Component, but which is not part of that Major ++Component, and (b) serves only to enable use of the work with that ++Major Component, or to implement a Standard Interface for which an ++implementation is available to the public in source code form. A ++"Major Component", in this context, means a major essential component ++(kernel, window system, and so on) of the specific operating system ++(if any) on which the executable work runs, or a compiler used to ++produce the work, or an object code interpreter used to run it. ++ ++ The "Corresponding Source" for a work in object code form means all ++the source code needed to generate, install, and (for an executable ++work) run the object code and to modify the work, including scripts to ++control those activities. However, it does not include the work's ++System Libraries, or general-purpose tools or generally available free ++programs which are used unmodified in performing those activities but ++which are not part of the work. For example, Corresponding Source ++includes interface definition files associated with source files for ++the work, and the source code for shared libraries and dynamically ++linked subprograms that the work is specifically designed to require, ++such as by intimate data communication or control flow between those ++subprograms and other parts of the work. ++ ++ The Corresponding Source need not include anything that users ++can regenerate automatically from other parts of the Corresponding ++Source. ++ ++ The Corresponding Source for a work in source code form is that ++same work. ++ ++ 2. Basic Permissions. ++ ++ All rights granted under this License are granted for the term of ++copyright on the Program, and are irrevocable provided the stated ++conditions are met. This License explicitly affirms your unlimited ++permission to run the unmodified Program. The output from running a ++covered work is covered by this License only if the output, given its ++content, constitutes a covered work. This License acknowledges your ++rights of fair use or other equivalent, as provided by copyright law. ++ ++ You may make, run and propagate covered works that you do not ++convey, without conditions so long as your license otherwise remains ++in force. You may convey covered works to others for the sole purpose ++of having them make modifications exclusively for you, or provide you ++with facilities for running those works, provided that you comply with ++the terms of this License in conveying all material for which you do ++not control copyright. Those thus making or running the covered works ++for you must do so exclusively on your behalf, under your direction ++and control, on terms that prohibit them from making any copies of ++your copyrighted material outside their relationship with you. ++ ++ Conveying under any other circumstances is permitted solely under ++the conditions stated below. Sublicensing is not allowed; section 10 ++makes it unnecessary. ++ ++ 3. Protecting Users' Legal Rights From Anti-Circumvention Law. ++ ++ No covered work shall be deemed part of an effective technological ++measure under any applicable law fulfilling obligations under article ++11 of the WIPO copyright treaty adopted on 20 December 1996, or ++similar laws prohibiting or restricting circumvention of such ++measures. ++ ++ When you convey a covered work, you waive any legal power to forbid ++circumvention of technological measures to the extent such circumvention ++is effected by exercising rights under this License with respect to ++the covered work, and you disclaim any intention to limit operation or ++modification of the work as a means of enforcing, against the work's ++users, your or third parties' legal rights to forbid circumvention of ++technological measures. ++ ++ 4. Conveying Verbatim Copies. ++ ++ You may convey verbatim copies of the Program's source code as you ++receive it, in any medium, provided that you conspicuously and ++appropriately publish on each copy an appropriate copyright notice; ++keep intact all notices stating that this License and any ++non-permissive terms added in accord with section 7 apply to the code; ++keep intact all notices of the absence of any warranty; and give all ++recipients a copy of this License along with the Program. ++ ++ You may charge any price or no price for each copy that you convey, ++and you may offer support or warranty protection for a fee. ++ ++ 5. Conveying Modified Source Versions. ++ ++ You may convey a work based on the Program, or the modifications to ++produce it from the Program, in the form of source code under the ++terms of section 4, provided that you also meet all of these conditions: ++ ++ a) The work must carry prominent notices stating that you modified ++ it, and giving a relevant date. ++ ++ b) The work must carry prominent notices stating that it is ++ released under this License and any conditions added under section ++ 7. This requirement modifies the requirement in section 4 to ++ "keep intact all notices". ++ ++ c) You must license the entire work, as a whole, under this ++ License to anyone who comes into possession of a copy. This ++ License will therefore apply, along with any applicable section 7 ++ additional terms, to the whole of the work, and all its parts, ++ regardless of how they are packaged. This License gives no ++ permission to license the work in any other way, but it does not ++ invalidate such permission if you have separately received it. ++ ++ d) If the work has interactive user interfaces, each must display ++ Appropriate Legal Notices; however, if the Program has interactive ++ interfaces that do not display Appropriate Legal Notices, your ++ work need not make them do so. ++ ++ A compilation of a covered work with other separate and independent ++works, which are not by their nature extensions of the covered work, ++and which are not combined with it such as to form a larger program, ++in or on a volume of a storage or distribution medium, is called an ++"aggregate" if the compilation and its resulting copyright are not ++used to limit the access or legal rights of the compilation's users ++beyond what the individual works permit. Inclusion of a covered work ++in an aggregate does not cause this License to apply to the other ++parts of the aggregate. ++ ++ 6. Conveying Non-Source Forms. ++ ++ You may convey a covered work in object code form under the terms ++of sections 4 and 5, provided that you also convey the ++machine-readable Corresponding Source under the terms of this License, ++in one of these ways: ++ ++ a) Convey the object code in, or embodied in, a physical product ++ (including a physical distribution medium), accompanied by the ++ Corresponding Source fixed on a durable physical medium ++ customarily used for software interchange. ++ ++ b) Convey the object code in, or embodied in, a physical product ++ (including a physical distribution medium), accompanied by a ++ written offer, valid for at least three years and valid for as ++ long as you offer spare parts or customer support for that product ++ model, to give anyone who possesses the object code either (1) a ++ copy of the Corresponding Source for all the software in the ++ product that is covered by this License, on a durable physical ++ medium customarily used for software interchange, for a price no ++ more than your reasonable cost of physically performing this ++ conveying of source, or (2) access to copy the ++ Corresponding Source from a network server at no charge. ++ ++ c) Convey individual copies of the object code with a copy of the ++ written offer to provide the Corresponding Source. This ++ alternative is allowed only occasionally and noncommercially, and ++ only if you received the object code with such an offer, in accord ++ with subsection 6b. ++ ++ d) Convey the object code by offering access from a designated ++ place (gratis or for a charge), and offer equivalent access to the ++ Corresponding Source in the same way through the same place at no ++ further charge. You need not require recipients to copy the ++ Corresponding Source along with the object code. If the place to ++ copy the object code is a network server, the Corresponding Source ++ may be on a different server (operated by you or a third party) ++ that supports equivalent copying facilities, provided you maintain ++ clear directions next to the object code saying where to find the ++ Corresponding Source. Regardless of what server hosts the ++ Corresponding Source, you remain obligated to ensure that it is ++ available for as long as needed to satisfy these requirements. ++ ++ e) Convey the object code using peer-to-peer transmission, provided ++ you inform other peers where the object code and Corresponding ++ Source of the work are being offered to the general public at no ++ charge under subsection 6d. ++ ++ A separable portion of the object code, whose source code is excluded ++from the Corresponding Source as a System Library, need not be ++included in conveying the object code work. ++ ++ A "User Product" is either (1) a "consumer product", which means any ++tangible personal property which is normally used for personal, family, ++or household purposes, or (2) anything designed or sold for incorporation ++into a dwelling. In determining whether a product is a consumer product, ++doubtful cases shall be resolved in favor of coverage. For a particular ++product received by a particular user, "normally used" refers to a ++typical or common use of that class of product, regardless of the status ++of the particular user or of the way in which the particular user ++actually uses, or expects or is expected to use, the product. A product ++is a consumer product regardless of whether the product has substantial ++commercial, industrial or non-consumer uses, unless such uses represent ++the only significant mode of use of the product. ++ ++ "Installation Information" for a User Product means any methods, ++procedures, authorization keys, or other information required to install ++and execute modified versions of a covered work in that User Product from ++a modified version of its Corresponding Source. The information must ++suffice to ensure that the continued functioning of the modified object ++code is in no case prevented or interfered with solely because ++modification has been made. ++ ++ If you convey an object code work under this section in, or with, or ++specifically for use in, a User Product, and the conveying occurs as ++part of a transaction in which the right of possession and use of the ++User Product is transferred to the recipient in perpetuity or for a ++fixed term (regardless of how the transaction is characterized), the ++Corresponding Source conveyed under this section must be accompanied ++by the Installation Information. But this requirement does not apply ++if neither you nor any third party retains the ability to install ++modified object code on the User Product (for example, the work has ++been installed in ROM). ++ ++ The requirement to provide Installation Information does not include a ++requirement to continue to provide support service, warranty, or updates ++for a work that has been modified or installed by the recipient, or for ++the User Product in which it has been modified or installed. Access to a ++network may be denied when the modification itself materially and ++adversely affects the operation of the network or violates the rules and ++protocols for communication across the network. ++ ++ Corresponding Source conveyed, and Installation Information provided, ++in accord with this section must be in a format that is publicly ++documented (and with an implementation available to the public in ++source code form), and must require no special password or key for ++unpacking, reading or copying. ++ ++ 7. Additional Terms. ++ ++ "Additional permissions" are terms that supplement the terms of this ++License by making exceptions from one or more of its conditions. ++Additional permissions that are applicable to the entire Program shall ++be treated as though they were included in this License, to the extent ++that they are valid under applicable law. If additional permissions ++apply only to part of the Program, that part may be used separately ++under those permissions, but the entire Program remains governed by ++this License without regard to the additional permissions. ++ ++ When you convey a copy of a covered work, you may at your option ++remove any additional permissions from that copy, or from any part of ++it. (Additional permissions may be written to require their own ++removal in certain cases when you modify the work.) You may place ++additional permissions on material, added by you to a covered work, ++for which you have or can give appropriate copyright permission. ++ ++ Notwithstanding any other provision of this License, for material you ++add to a covered work, you may (if authorized by the copyright holders of ++that material) supplement the terms of this License with terms: ++ ++ a) Disclaiming warranty or limiting liability differently from the ++ terms of sections 15 and 16 of this License; or ++ ++ b) Requiring preservation of specified reasonable legal notices or ++ author attributions in that material or in the Appropriate Legal ++ Notices displayed by works containing it; or ++ ++ c) Prohibiting misrepresentation of the origin of that material, or ++ requiring that modified versions of such material be marked in ++ reasonable ways as different from the original version; or ++ ++ d) Limiting the use for publicity purposes of names of licensors or ++ authors of the material; or ++ ++ e) Declining to grant rights under trademark law for use of some ++ trade names, trademarks, or service marks; or ++ ++ f) Requiring indemnification of licensors and authors of that ++ material by anyone who conveys the material (or modified versions of ++ it) with contractual assumptions of liability to the recipient, for ++ any liability that these contractual assumptions directly impose on ++ those licensors and authors. ++ ++ All other non-permissive additional terms are considered "further ++restrictions" within the meaning of section 10. If the Program as you ++received it, or any part of it, contains a notice stating that it is ++governed by this License along with a term that is a further ++restriction, you may remove that term. If a license document contains ++a further restriction but permits relicensing or conveying under this ++License, you may add to a covered work material governed by the terms ++of that license document, provided that the further restriction does ++not survive such relicensing or conveying. ++ ++ If you add terms to a covered work in accord with this section, you ++must place, in the relevant source files, a statement of the ++additional terms that apply to those files, or a notice indicating ++where to find the applicable terms. ++ ++ Additional terms, permissive or non-permissive, may be stated in the ++form of a separately written license, or stated as exceptions; ++the above requirements apply either way. ++ ++ 8. Termination. ++ ++ You may not propagate or modify a covered work except as expressly ++provided under this License. Any attempt otherwise to propagate or ++modify it is void, and will automatically terminate your rights under ++this License (including any patent licenses granted under the third ++paragraph of section 11). ++ ++ However, if you cease all violation of this License, then your ++license from a particular copyright holder is reinstated (a) ++provisionally, unless and until the copyright holder explicitly and ++finally terminates your license, and (b) permanently, if the copyright ++holder fails to notify you of the violation by some reasonable means ++prior to 60 days after the cessation. ++ ++ Moreover, your license from a particular copyright holder is ++reinstated permanently if the copyright holder notifies you of the ++violation by some reasonable means, this is the first time you have ++received notice of violation of this License (for any work) from that ++copyright holder, and you cure the violation prior to 30 days after ++your receipt of the notice. ++ ++ Termination of your rights under this section does not terminate the ++licenses of parties who have received copies or rights from you under ++this License. If your rights have been terminated and not permanently ++reinstated, you do not qualify to receive new licenses for the same ++material under section 10. ++ ++ 9. Acceptance Not Required for Having Copies. ++ ++ You are not required to accept this License in order to receive or ++run a copy of the Program. Ancillary propagation of a covered work ++occurring solely as a consequence of using peer-to-peer transmission ++to receive a copy likewise does not require acceptance. However, ++nothing other than this License grants you permission to propagate or ++modify any covered work. These actions infringe copyright if you do ++not accept this License. Therefore, by modifying or propagating a ++covered work, you indicate your acceptance of this License to do so. ++ ++ 10. Automatic Licensing of Downstream Recipients. ++ ++ Each time you convey a covered work, the recipient automatically ++receives a license from the original licensors, to run, modify and ++propagate that work, subject to this License. You are not responsible ++for enforcing compliance by third parties with this License. ++ ++ An "entity transaction" is a transaction transferring control of an ++organization, or substantially all assets of one, or subdividing an ++organization, or merging organizations. If propagation of a covered ++work results from an entity transaction, each party to that ++transaction who receives a copy of the work also receives whatever ++licenses to the work the party's predecessor in interest had or could ++give under the previous paragraph, plus a right to possession of the ++Corresponding Source of the work from the predecessor in interest, if ++the predecessor has it or can get it with reasonable efforts. ++ ++ You may not impose any further restrictions on the exercise of the ++rights granted or affirmed under this License. For example, you may ++not impose a license fee, royalty, or other charge for exercise of ++rights granted under this License, and you may not initiate litigation ++(including a cross-claim or counterclaim in a lawsuit) alleging that ++any patent claim is infringed by making, using, selling, offering for ++sale, or importing the Program or any portion of it. ++ ++ 11. Patents. ++ ++ A "contributor" is a copyright holder who authorizes use under this ++License of the Program or a work on which the Program is based. The ++work thus licensed is called the contributor's "contributor version". ++ ++ A contributor's "essential patent claims" are all patent claims ++owned or controlled by the contributor, whether already acquired or ++hereafter acquired, that would be infringed by some manner, permitted ++by this License, of making, using, or selling its contributor version, ++but do not include claims that would be infringed only as a ++consequence of further modification of the contributor version. For ++purposes of this definition, "control" includes the right to grant ++patent sublicenses in a manner consistent with the requirements of ++this License. ++ ++ Each contributor grants you a non-exclusive, worldwide, royalty-free ++patent license under the contributor's essential patent claims, to ++make, use, sell, offer for sale, import and otherwise run, modify and ++propagate the contents of its contributor version. ++ ++ In the following three paragraphs, a "patent license" is any express ++agreement or commitment, however denominated, not to enforce a patent ++(such as an express permission to practice a patent or covenant not to ++sue for patent infringement). To "grant" such a patent license to a ++party means to make such an agreement or commitment not to enforce a ++patent against the party. ++ ++ If you convey a covered work, knowingly relying on a patent license, ++and the Corresponding Source of the work is not available for anyone ++to copy, free of charge and under the terms of this License, through a ++publicly available network server or other readily accessible means, ++then you must either (1) cause the Corresponding Source to be so ++available, or (2) arrange to deprive yourself of the benefit of the ++patent license for this particular work, or (3) arrange, in a manner ++consistent with the requirements of this License, to extend the patent ++license to downstream recipients. "Knowingly relying" means you have ++actual knowledge that, but for the patent license, your conveying the ++covered work in a country, or your recipient's use of the covered work ++in a country, would infringe one or more identifiable patents in that ++country that you have reason to believe are valid. ++ ++ If, pursuant to or in connection with a single transaction or ++arrangement, you convey, or propagate by procuring conveyance of, a ++covered work, and grant a patent license to some of the parties ++receiving the covered work authorizing them to use, propagate, modify ++or convey a specific copy of the covered work, then the patent license ++you grant is automatically extended to all recipients of the covered ++work and works based on it. ++ ++ A patent license is "discriminatory" if it does not include within ++the scope of its coverage, prohibits the exercise of, or is ++conditioned on the non-exercise of one or more of the rights that are ++specifically granted under this License. You may not convey a covered ++work if you are a party to an arrangement with a third party that is ++in the business of distributing software, under which you make payment ++to the third party based on the extent of your activity of conveying ++the work, and under which the third party grants, to any of the ++parties who would receive the covered work from you, a discriminatory ++patent license (a) in connection with copies of the covered work ++conveyed by you (or copies made from those copies), or (b) primarily ++for and in connection with specific products or compilations that ++contain the covered work, unless you entered into that arrangement, ++or that patent license was granted, prior to 28 March 2007. ++ ++ Nothing in this License shall be construed as excluding or limiting ++any implied license or other defenses to infringement that may ++otherwise be available to you under applicable patent law. ++ ++ 12. No Surrender of Others' Freedom. ++ ++ If conditions are imposed on you (whether by court order, agreement or ++otherwise) that contradict the conditions of this License, they do not ++excuse you from the conditions of this License. If you cannot convey a ++covered work so as to satisfy simultaneously your obligations under this ++License and any other pertinent obligations, then as a consequence you may ++not convey it at all. For example, if you agree to terms that obligate you ++to collect a royalty for further conveying from those to whom you convey ++the Program, the only way you could satisfy both those terms and this ++License would be to refrain entirely from conveying the Program. ++ ++ 13. Use with the GNU Affero General Public License. ++ ++ Notwithstanding any other provision of this License, you have ++permission to link or combine any covered work with a work licensed ++under version 3 of the GNU Affero General Public License into a single ++combined work, and to convey the resulting work. The terms of this ++License will continue to apply to the part which is the covered work, ++but the special requirements of the GNU Affero General Public License, ++section 13, concerning interaction through a network will apply to the ++combination as such. ++ ++ 14. Revised Versions of this License. ++ ++ The Free Software Foundation may publish revised and/or new versions of ++the GNU General Public License from time to time. Such new versions will ++be similar in spirit to the present version, but may differ in detail to ++address new problems or concerns. ++ ++ Each version is given a distinguishing version number. If the ++Program specifies that a certain numbered version of the GNU General ++Public License "or any later version" applies to it, you have the ++option of following the terms and conditions either of that numbered ++version or of any later version published by the Free Software ++Foundation. If the Program does not specify a version number of the ++GNU General Public License, you may choose any version ever published ++by the Free Software Foundation. ++ ++ If the Program specifies that a proxy can decide which future ++versions of the GNU General Public License can be used, that proxy's ++public statement of acceptance of a version permanently authorizes you ++to choose that version for the Program. ++ ++ Later license versions may give you additional or different ++permissions. However, no additional obligations are imposed on any ++author or copyright holder as a result of your choosing to follow a ++later version. ++ ++ 15. Disclaimer of Warranty. ++ ++ THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY ++APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT ++HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY ++OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, ++THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR ++PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM ++IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ++ALL NECESSARY SERVICING, REPAIR OR CORRECTION. ++ ++ 16. Limitation of Liability. ++ ++ IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING ++WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS ++THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY ++GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE ++USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF ++DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD ++PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), ++EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF ++SUCH DAMAGES. ++ ++ 17. Interpretation of Sections 15 and 16. ++ ++ If the disclaimer of warranty and limitation of liability provided ++above cannot be given local legal effect according to their terms, ++reviewing courts shall apply local law that most closely approximates ++an absolute waiver of all civil liability in connection with the ++Program, unless a warranty or assumption of liability accompanies a ++copy of the Program in return for a fee. ++ ++ END OF TERMS AND CONDITIONS ++ ++ How to Apply These Terms to Your New Programs ++ ++ If you develop a new program, and you want it to be of the greatest ++possible use to the public, the best way to achieve this is to make it ++free software which everyone can redistribute and change under these terms. ++ ++ To do so, attach the following notices to the program. It is safest ++to attach them to the start of each source file to most effectively ++state the exclusion of warranty; and each file should have at least ++the "copyright" line and a pointer to where the full notice is found. ++ ++ ++ Copyright (C) ++ ++ This program is free software: you can redistribute it and/or modify ++ it under the terms of the GNU General Public License as published by ++ the Free Software Foundation, either version 3 of the License, or ++ (at your option) any later version. ++ ++ This program is distributed in the hope that it will be useful, ++ but WITHOUT ANY WARRANTY; without even the implied warranty of ++ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++ GNU General Public License for more details. ++ ++ You should have received a copy of the GNU General Public License ++ along with this program. If not, see . ++ ++Also add information on how to contact you by electronic and paper mail. ++ ++ If the program does terminal interaction, make it output a short ++notice like this when it starts in an interactive mode: ++ ++ Copyright (C) ++ This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. ++ This is free software, and you are welcome to redistribute it ++ under certain conditions; type `show c' for details. ++ ++The hypothetical commands `show w' and `show c' should show the appropriate ++parts of the General Public License. Of course, your program's commands ++might be different; for a GUI interface, you would use an "about box". ++ ++ You should also get your employer (if you work as a programmer) or school, ++if any, to sign a "copyright disclaimer" for the program, if necessary. ++For more information on this, and how to apply and follow the GNU GPL, see ++. ++ ++ The GNU General Public License does not permit incorporating your program ++into proprietary programs. If your program is a subroutine library, you ++may consider it more useful to permit linking proprietary applications with ++the library. If this is what you want to do, use the GNU Lesser General ++Public License instead of this License. But first, please read ++. +diff --git a/feeds/luci/applications/luci-app-pbx/CREDITS-SOUNDS b/feeds/luci/applications/luci-app-pbx/CREDITS-SOUNDS +new file mode 100644 +index 0000000..1fa64bc +--- /dev/null ++++ b/feeds/luci/applications/luci-app-pbx/CREDITS-SOUNDS +@@ -0,0 +1,7 @@ ++This file pertains to the sounds files included in root/etc/pbx-asterisk/sounds ++ ++Recorded by: ++Allison Smith (http://www.theivrvoice.com) ++ ++Financial Contributions by: ++Digium, Inc. (http://www.digium.com) +diff --git a/feeds/luci/applications/luci-app-pbx/LICENSE-SOUNDS b/feeds/luci/applications/luci-app-pbx/LICENSE-SOUNDS +new file mode 100644 +index 0000000..fe9c822 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-pbx/LICENSE-SOUNDS +@@ -0,0 +1,312 @@ ++This file pertains to the sounds files included in root/etc/pbx-asterisk/sounds ++ ++LICENSE FOR VOICE PROMPT FILES ++------------------------------ ++ ++The voice prompt files distributed herewith are Copyright (C) 2003-2008 ++Allison Smith, and provided under terms of the following License. For ++more information, or to purchase custom voice prompt files, please ++visit: ++ ++http://www.digium.com/ivr or http://www.theasteriskvoice.com ++ ++LICENSE ++------- ++ ++THE WORK (AS DEFINED BELOW) IS PROVIDED UNDER THE TERMS OF THIS ++CREATIVE COMMONS PUBLIC LICENSE ("CCPL" OR "LICENSE"). THE WORK IS ++PROTECTED BY COPYRIGHT AND/OR OTHER APPLICABLE LAW. ANY USE OF THE ++WORK OTHER THAN AS AUTHORIZED UNDER THIS LICENSE OR COPYRIGHT LAW IS ++PROHIBITED. ++ ++BY EXERCISING ANY RIGHTS TO THE WORK PROVIDED HERE, YOU ACCEPT AND ++AGREE TO BE BOUND BY THE TERMS OF THIS LICENSE. TO THE EXTENT THIS ++LICENSE MAY BE CONSIDERED TO BE A CONTRACT, THE LICENSOR GRANTS YOU ++THE RIGHTS CONTAINED HERE IN CONSIDERATION OF YOUR ACCEPTANCE OF SUCH ++TERMS AND CONDITIONS. ++ ++1. Definitions. ++ ++a. "Collective Work" means a work, such as a periodical issue, ++anthology or encyclopedia, in which the Work in its entirety in ++unmodified form, along with one or more other contributions, ++constituting separate and independent works in themselves, are ++assembled into a collective whole. A work that constitutes a ++Collective Work will not be considered a Derivative Work (as defined ++below) for the purposes of this License. ++ ++b. "Creative Commons Compatible License" means a license that is ++listed at http://creativecommons.org/compatiblelicenses that has been ++approved by Creative Commons as being essentially equivalent to this ++License, including, at a minimum, because that license: (i) contains ++terms that have the same purpose, meaning and effect as the License ++Elements of this License; and, (ii) explicitly permits the relicensing ++of derivatives of works made available under that license under this ++License or either a Creative Commons unported license or a Creative ++Commons jurisdiction license with the same License Elements as this ++License. ++ ++c. "Derivative Work" means a work based upon the Work or upon the Work ++and other pre-existing works, such as a translation, musical ++arrangement, dramatization, fictionalization, motion picture version, ++sound recording, art reproduction, abridgment, condensation, or any ++other form in which the Work may be recast, transformed, or adapted, ++except that a work that constitutes a Collective Work will not be ++considered a Derivative Work for the purpose of this License. For the ++avoidance of doubt, where the Work is a musical composition or sound ++recording, the synchronization of the Work in timed-relation with a ++moving image ("synching") will be considered a Derivative Work for the ++purpose of this License. ++ ++d. "License Elements" means the following high-level license ++attributes as selected by Licensor and indicated in the title of this ++License: Attribution, ShareAlike. ++ ++e. "Licensor" means the individual, individuals, entity or entities ++that offers the Work under the terms of this License. ++ ++f. "Original Author" means the individual, individuals, entity or ++entities who created the Work. ++ ++g. "Work" means the copyrighted voice prompt files recorded by Allison ++Smith for Asterisk and distributed with this License. ++ ++h. "You" means an individual or entity exercising rights under this ++License who has not previously violated the terms of this License with ++respect to the Work, or who has received express permission from the ++Licensor to exercise rights under this License despite a previous ++violation. ++ ++2. Fair Use Rights. ++ ++Nothing in this license is intended to reduce, limit, or restrict any ++rights arising from fair use, first sale or other limitations on the ++exclusive rights of the copyright owner under copyright law or other ++applicable laws. ++ ++3. License Grant. ++ ++Subject to the terms and conditions of this License, Licensor hereby ++grants You a worldwide, royalty-free, non-exclusive, perpetual (for ++the duration of the applicable copyright) license to exercise the ++rights in the Work as stated below: ++ ++a. to reproduce the Work, to incorporate the Work into one or more ++Collective Works, and to reproduce the Work as incorporated in the ++Collective Works; ++ ++b. to create and reproduce Derivative Works provided that any such ++Derivative Work, including any translation in any medium, takes ++reasonable steps to clearly label, demarcate or otherwise identify ++that changes were made to the original Work. For example, a ++translation could be marked "The original work was translated from ++English to Spanish," or a modification could indicate "The original ++work has been modified."; ++ ++c. to distribute copies or phonorecords of, display publicly, perform ++publicly, and perform publicly by means of a digital audio ++transmission the Work including as incorporated in Collective Works; ++ ++d. to distribute copies or phonorecords of, display publicly, perform ++publicly, and perform publicly by means of a digital audio ++transmission Derivative Works. ++ ++e. For the avoidance of doubt, where the Work is a musical ++composition: ++ ++ i. Performance Royalties Under Blanket Licenses. Licensor waives the ++ exclusive right to collect, whether individually or, in the event ++ that Licensor is a member of a performance rights society ++ (e.g. ASCAP, BMI, SESAC), via that society, royalties for the public ++ performance or public digital performance e.g. webcast) of the Work. ++ ++ ii.Mechanical Rights and Statutory Royalties. Licensor waives the ++ exclusive right to collect, whether individually or via a music ++ rights agency or designated agent (e.g. Harry Fox Agency), royalties ++ for any phonorecord You create from the Work ("cover version") and ++ distribute, subject to the compulsory license created by 17 USC ++ Section 115 of the US Copyright Act (or the equivalent in other ++ jurisdictions). ++ ++f. Webcasting Rights and Statutory Royalties. For the avoidance of ++doubt, where the Work is a sound recording, Licensor waives the ++exclusive right to collect, whether individually or via a ++performance-rights society (e.g. SoundExchange), royalties for the ++public digital performance (e.g. webcast) of the Work, subject to the ++compulsory license created by 17 USC Section 114 of the US Copyright ++Act (or the equivalent in other jurisdictions). ++ ++The above rights may be exercised in all media and formats whether now ++known or hereafter devised. The above rights include the right to make ++such modifications as are technically necessary to exercise the rights ++in other media and formats. All rights not expressly granted by ++Licensor are hereby reserved. ++ ++4. Restrictions. ++ ++The license granted in Section 3 above is expressly made subject to ++and limited by the following restrictions: ++ ++a. You may distribute, publicly display, publicly perform, or publicly ++digitally perform the Work only under the terms of this License, and ++You must include a copy of, or the Uniform Resource Identifier for, ++this License with every copy or phonorecord of the Work You ++distribute, publicly display, publicly perform, or publicly digitally ++perform. You may not offer or impose any terms on the Work that ++restrict the terms of this License or the ability of a recipient of ++the Work to exercise of the rights granted to that recipient under the ++terms of the License. You may not sublicense the Work. You must keep ++intact all notices that refer to this License and to the disclaimer of ++warranties. When You distribute, publicly display, publicly perform, ++or publicly digitally perform the Work, You may not impose any ++technological measures on the Work that restrict the ability of a ++recipient of the Work from You to exercise of the rights granted to ++that recipient under the terms of the License. This Section 4(a) ++applies to the Work as incorporated in a Collective Work, but this ++does not require the Collective Work apart from the Work itself to be ++made subject to the terms of this License. If You create a Collective ++Work, upon notice from any Licensor You must, to the extent ++practicable, remove from the Collective Work any credit as required by ++Section 4(c), as requested. If You create a Derivative Work, upon ++notice from any Licensor You must, to the extent practicable, remove ++from the Derivative Work any credit as required by Section 4(c), as ++requested. ++ ++b. You may distribute, publicly display, publicly perform, or publicly ++digitally perform a Derivative Work only under: (i) the terms of this ++License; (ii) a later version of this License with the same License ++Elements as this License; (iii) either the Creative Commons (Unported) ++license or a Creative Commons jurisdiction license (either this or a ++later license version) that contains the same License Elements as this ++License (e.g. Attribution-ShareAlike 3.0 (Unported)); (iv) a Creative ++Commons Compatible License. If you license the Derivative Work under ++one of the licenses mentioned in (iv), you must comply with the terms ++of that license. If you license the Derivative Work under the terms of ++any of the licenses mentioned in (i), (ii) or (iii) (the "Applicable ++License"), you must comply with the terms of the Applicable License ++generally and with the following provisions: (I) You must include a ++copy of, or the Uniform Resource Identifier for, the Applicable ++License with every copy or phonorecord of each Derivative Work You ++distribute, publicly display, publicly perform, or publicly digitally ++perform; (II) You may not offer or impose any terms on the Derivative ++Works that restrict the terms of the Applicable License or the ability ++of a recipient of the Work to exercise the rights granted to that ++recipient under the terms of the Applicable License; (III) You must ++keep intact all notices that refer to the Applicable License and to ++the disclaimer of warranties; and, (IV) when You distribute, publicly ++display, publicly perform, or publicly digitally perform the Work, You ++may not impose any technological measures on the Derivative Work that ++restrict the ability of a recipient of the Derivative Work from You to ++exercise the rights granted to that recipient under the terms of the ++Applicable License. This Section 4(b) applies to the Derivative Work ++as incorporated in a Collective Work, but this does not require the ++Collective Work apart from the Derivative Work itself to be made ++subject to the terms of the Applicable License. ++ ++c. If You distribute, publicly display, publicly perform, or publicly ++digitally perform the Work (as defined in Section 1 above) or any ++Derivative Works (as defined in Section 1 above) or Collective Works ++(as defined in Section 1 above), You must, unless a request has been ++made pursuant to Section 4(a), keep intact all copyright notices for ++the Work and provide, reasonable to the medium or means You are ++utilizing: (i) the name of the Original Author (or pseudonym, if ++applicable) if supplied, and/or (ii) if the Original Author and/or ++Licensor designate another party or parties (e.g. a sponsor institute, ++publishing entity, journal) for attribution ("Attribution Parties") in ++Licensor's copyright notice, terms of service or by other reasonable ++means, the name of such party or parties; the title of the Work if ++supplied; to the extent reasonably practicable, the Uniform Resource ++Identifier, if any, that Licensor specifies to be associated with the ++Work, unless such URI does not refer to the copyright notice or ++licensing information for the Work; and, consistent with Section 3(b) ++in the case of a Derivative Work, a credit identifying the use of the ++Work in the Derivative Work (e.g., "French translation of the Work by ++Original Author," or "Screenplay based on original Work by Original ++Author"). The credit required by this Section 4(c) may be implemented ++in any reasonable manner; provided, however, that in the case of a ++Derivative Work or Collective Work, at a minimum such credit will ++appear, if a credit for all contributing authors of the Derivative ++Work or Collective Work appears, then as part of these credits and in ++a manner at least as prominent as the credits for the other ++contributing authors. For the avoidance of doubt, You may only use the ++credit required by this Section for the purpose of attribution in the ++manner set out above and, by exercising Your rights under this ++License, You may not implicitly or explicitly assert or imply any ++connection with, sponsorship or endorsement by the Original Author, ++Licensor and/or Attribution Parties, as appropriate, of You or Your ++use of the Work, without the separate, express prior written ++permission of the Original Author, Licensor and/or Attribution ++Parties. ++ ++5. Representations, Warranties and Disclaimer. ++ ++UNLESS OTHERWISE MUTUALLY AGREED TO BY THE PARTIES IN WRITING, ++LICENSOR OFFERS THE WORK AS-IS AND ONLY TO THE EXTENT OF ANY RIGHTS ++HELD IN THE LICENSED WORK BY THE LICENSOR. THE LICENSOR MAKES NO ++REPRESENTATIONS OR WARRANTIES OF ANY KIND CONCERNING THE WORK, ++EXPRESS, IMPLIED, STATUTORY OR OTHERWISE, INCLUDING, WITHOUT ++LIMITATION, WARRANTIES OF TITLE, MARKETABILITY, MERCHANTIBILITY, ++FITNESS FOR A PARTICULAR PURPOSE, NONINFRINGEMENT, OR THE ABSENCE OF ++LATENT OR OTHER DEFECTS, ACCURACY, OR THE PRESENCE OF ABSENCE OF ++ERRORS, WHETHER OR NOT DISCOVERABLE. SOME JURISDICTIONS DO NOT ALLOW ++THE EXCLUSION OF IMPLIED WARRANTIES, SO SUCH EXCLUSION MAY NOT APPLY ++TO YOU. ++ ++6. Limitation on Liability. ++ ++EXCEPT TO THE EXTENT REQUIRED BY APPLICABLE LAW, IN NO EVENT WILL ++LICENSOR BE LIABLE TO YOU ON ANY LEGAL THEORY FOR ANY SPECIAL, ++INCIDENTAL, CONSEQUENTIAL, PUNITIVE OR EXEMPLARY DAMAGES ARISING OUT ++OF THIS LICENSE OR THE USE OF THE WORK, EVEN IF LICENSOR HAS BEEN ++ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. ++ ++7. Termination. ++ ++a. This License and the rights granted hereunder will terminate ++automatically upon any breach by You of the terms of this ++License. Individuals or entities who have received Derivative Works or ++Collective Works from You under this License, however, will not have ++their licenses terminated provided such individuals or entities remain ++in full compliance with those licenses. Sections 1, 2, 5, 6, 7, and 8 ++will survive any termination of this License. ++ ++b. Subject to the above terms and conditions, the license granted here ++is perpetual (for the duration of the applicable copyright in the ++Work). Notwithstanding the above, Licensor reserves the right to ++release the Work under different license terms or to stop distributing ++the Work at any time; provided, however that any such election will ++not serve to withdraw this License (or any other license that has ++been, or is required to be, granted under the terms of this License), ++and this License will continue in full force and effect unless ++terminated as stated above. ++ ++8. Miscellaneous. ++ ++a. Each time You distribute or publicly digitally perform the Work (as ++defined in Section 1 above) or a Collective Work (as defined in ++Section 1 above), the Licensor offers to the recipient a license to ++the Work on the same terms and conditions as the license granted to ++You under this License. ++ ++b. Each time You distribute or publicly digitally perform a Derivative ++Work, Licensor offers to the recipient a license to the original Work ++on the same terms and conditions as the license granted to You under ++this License. ++ ++c. If any provision of this License is invalid or unenforceable under ++applicable law, it shall not affect the validity or enforceability of ++the remainder of the terms of this License, and without further action ++by the parties to this agreement, such provision shall be reformed to ++the minimum extent necessary to make such provision valid and ++enforceable. ++ ++d. No term or provision of this License shall be deemed waived and no ++breach consented to unless such waiver or consent shall be in writing ++and signed by the party to be charged with such waiver or consent. ++ ++e. This License constitutes the entire agreement between the parties ++with respect to the Work licensed here. There are no understandings, ++agreements or representations with respect to the Work not specified ++here. Licensor shall not be bound by any additional provisions that ++may appear in any communication from You. This License may not be ++modified without the mutual written agreement of the Licensor and You. +diff --git a/feeds/luci/applications/luci-app-pbx/Makefile b/feeds/luci/applications/luci-app-pbx/Makefile +new file mode 100644 +index 0000000..1379dcf +--- /dev/null ++++ b/feeds/luci/applications/luci-app-pbx/Makefile +@@ -0,0 +1,19 @@ ++# ++# Copyright (C) 2008-2014 The LuCI Team ++# ++# This is free software, licensed under the Apache License, Version 2.0 . ++# ++ ++include $(TOPDIR)/rules.mk ++ ++LUCI_TITLE:=LuCI PBX Administration ++LUCI_DEPENDS:= \ ++ +asterisk18 +asterisk18-app-authenticate +asterisk18-app-disa \ ++ +asterisk18-app-setcallerid +asterisk18-app-system +asterisk18-chan-gtalk \ ++ +asterisk18-codec-a-mu +asterisk18-codec-alaw +asterisk18-func-cut \ ++ +asterisk18-res-clioriginate +asterisk18-func-channel +asterisk18-chan-local \ ++ +asterisk18-app-record +asterisk18-app-senddtmf +asterisk18-res-crypto ++ ++include ../../luci.mk ++ ++# call BuildPackage - OpenWrt buildroot signature +diff --git a/feeds/luci/applications/luci-app-pbx/luasrc/controller/pbx.lua b/feeds/luci/applications/luci-app-pbx/luasrc/controller/pbx.lua +new file mode 100644 +index 0000000..b77814b +--- /dev/null ++++ b/feeds/luci/applications/luci-app-pbx/luasrc/controller/pbx.lua +@@ -0,0 +1,29 @@ ++--[[ ++ Copyright 2011 Iordan Iordanov ++ ++ This file is part of luci-pbx. ++ ++ luci-pbx is free software: you can redistribute it and/or modify ++ it under the terms of the GNU General Public License as published by ++ the Free Software Foundation, either version 3 of the License, or ++ (at your option) any later version. ++ ++ luci-pbx is distributed in the hope that it will be useful, ++ but WITHOUT ANY WARRANTY; without even the implied warranty of ++ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++ GNU General Public License for more details. ++ ++ You should have received a copy of the GNU General Public License ++ along with luci-pbx. If not, see . ++]]-- ++ ++module("luci.controller.pbx", package.seeall) ++ ++function index() ++ entry({"admin", "services", "pbx"}, cbi("pbx"), "PBX", 80) ++ entry({"admin", "services", "pbx", "pbx-google"}, cbi("pbx-google"), "Google Accounts", 1) ++ entry({"admin", "services", "pbx", "pbx-voip"}, cbi("pbx-voip"), "SIP Accounts", 2) ++ entry({"admin", "services", "pbx", "pbx-users"}, cbi("pbx-users"), "User Accounts", 3) ++ entry({"admin", "services", "pbx", "pbx-calls"}, cbi("pbx-calls"), "Call Routing", 4) ++ entry({"admin", "services", "pbx", "pbx-advanced"}, cbi("pbx-advanced"), "Advanced Settings", 6) ++end +diff --git a/feeds/luci/applications/luci-app-pbx/luasrc/model/cbi/pbx-advanced.lua b/feeds/luci/applications/luci-app-pbx/luasrc/model/cbi/pbx-advanced.lua +new file mode 100644 +index 0000000..5d4f135 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-pbx/luasrc/model/cbi/pbx-advanced.lua +@@ -0,0 +1,293 @@ ++--[[ ++ Copyright 2011 Iordan Iordanov ++ ++ This file is part of luci-pbx. ++ ++ luci-pbx is free software: you can redistribute it and/or modify ++ it under the terms of the GNU General Public License as published by ++ the Free Software Foundation, either version 3 of the License, or ++ (at your option) any later version. ++ ++ luci-pbx is distributed in the hope that it will be useful, ++ but WITHOUT ANY WARRANTY; without even the implied warranty of ++ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++ GNU General Public License for more details. ++ ++ You should have received a copy of the GNU General Public License ++ along with luci-pbx. If not, see . ++]]-- ++ ++if nixio.fs.access("/etc/init.d/asterisk") then ++ server = "asterisk" ++elseif nixio.fs.access("/etc/init.d/freeswitch") then ++ server = "freeswitch" ++else ++ server = "" ++end ++ ++appname = "PBX" ++modulename = "pbx-advanced" ++defaultbindport = 5060 ++defaultrtpstart = 19850 ++defaultrtpend = 19900 ++ ++-- Returns all the network related settings, including a constructed RTP range ++function get_network_info() ++ externhost = m.uci:get(modulename, "advanced", "externhost") ++ ipaddr = m.uci:get("network", "lan", "ipaddr") ++ bindport = m.uci:get(modulename, "advanced", "bindport") ++ rtpstart = m.uci:get(modulename, "advanced", "rtpstart") ++ rtpend = m.uci:get(modulename, "advanced", "rtpend") ++ ++ if bindport == nil then bindport = defaultbindport end ++ if rtpstart == nil then rtpstart = defaultrtpstart end ++ if rtpend == nil then rtpend = defaultrtpend end ++ ++ if rtpstart == nil or rtpend == nil then ++ rtprange = nil ++ else ++ rtprange = rtpstart .. "-" .. rtpend ++ end ++ ++ return bindport, rtprange, ipaddr, externhost ++end ++ ++-- If not present, insert empty rules in the given config & section named PBX-SIP and PBX-RTP ++function insert_empty_sip_rtp_rules(config, section) ++ ++ -- Add rules named PBX-SIP and PBX-RTP if not existing ++ found_sip_rule = false ++ found_rtp_rule = false ++ m.uci:foreach(config, section, ++ function(s1) ++ if s1._name == 'PBX-SIP' then ++ found_sip_rule = true ++ elseif s1._name == 'PBX-RTP' then ++ found_rtp_rule = true ++ end ++ end) ++ ++ if found_sip_rule ~= true then ++ newrule=m.uci:add(config, section) ++ m.uci:set(config, newrule, '_name', 'PBX-SIP') ++ end ++ if found_rtp_rule ~= true then ++ newrule=m.uci:add(config, section) ++ m.uci:set(config, newrule, '_name', 'PBX-RTP') ++ end ++end ++ ++-- Delete rules in the given config & section named PBX-SIP and PBX-RTP ++function delete_sip_rtp_rules(config, section) ++ ++ -- Remove rules named PBX-SIP and PBX-RTP ++ commit = false ++ m.uci:foreach(config, section, ++ function(s1) ++ if s1._name == 'PBX-SIP' or s1._name == 'PBX-RTP' then ++ m.uci:delete(config, s1['.name']) ++ commit = true ++ end ++ end) ++ ++ -- If something changed, then we commit the config. ++ if commit == true then m.uci:commit(config) end ++end ++ ++-- Deletes QoS rules associated with this PBX. ++function delete_qos_rules() ++ delete_sip_rtp_rules ("qos", "classify") ++end ++ ++ ++function insert_qos_rules() ++ -- Insert empty PBX-SIP and PBX-RTP rules if not present. ++ insert_empty_sip_rtp_rules ("qos", "classify") ++ ++ -- Get the network information ++ bindport, rtprange, ipaddr, externhost = get_network_info() ++ ++ -- Iterate through the QoS rules, and if there is no other rule with the same port ++ -- range at the priority service level, insert this rule. ++ commit = false ++ m.uci:foreach("qos", "classify", ++ function(s1) ++ if s1._name == 'PBX-SIP' then ++ if s1.ports ~= bindport or s1.target ~= "Priority" or s1.proto ~= "udp" then ++ m.uci:set("qos", s1['.name'], "ports", bindport) ++ m.uci:set("qos", s1['.name'], "proto", "udp") ++ m.uci:set("qos", s1['.name'], "target", "Priority") ++ commit = true ++ end ++ elseif s1._name == 'PBX-RTP' then ++ if s1.ports ~= rtprange or s1.target ~= "Priority" or s1.proto ~= "udp" then ++ m.uci:set("qos", s1['.name'], "ports", rtprange) ++ m.uci:set("qos", s1['.name'], "proto", "udp") ++ m.uci:set("qos", s1['.name'], "target", "Priority") ++ commit = true ++ end ++ end ++ end) ++ ++ -- If something changed, then we commit the qos config. ++ if commit == true then m.uci:commit("qos") end ++end ++ ++-- This function is a (so far) unsuccessful attempt to manipulate the firewall rules from here ++-- Need to do more testing and eventually move to this mode. ++function maintain_firewall_rules() ++ -- Get the network information ++ bindport, rtprange, ipaddr, externhost = get_network_info() ++ ++ commit = false ++ -- Only if externhost is set, do we control firewall rules. ++ if externhost ~= nil and bindport ~= nil and rtprange ~= nil then ++ -- Insert empty PBX-SIP and PBX-RTP rules if not present. ++ insert_empty_sip_rtp_rules ("firewall", "rule") ++ ++ -- Iterate through the firewall rules, and if the dest_port and dest_ip setting of the\ ++ -- SIP and RTP rule do not match what we want configured, set all the entries in the rule\ ++ -- appropriately. ++ m.uci:foreach("firewall", "rule", ++ function(s1) ++ if s1._name == 'PBX-SIP' then ++ if s1.dest_port ~= bindport then ++ m.uci:set("firewall", s1['.name'], "dest_port", bindport) ++ m.uci:set("firewall", s1['.name'], "src", "wan") ++ m.uci:set("firewall", s1['.name'], "proto", "udp") ++ m.uci:set("firewall", s1['.name'], "target", "ACCEPT") ++ commit = true ++ end ++ elseif s1._name == 'PBX-RTP' then ++ if s1.dest_port ~= rtprange then ++ m.uci:set("firewall", s1['.name'], "dest_port", rtprange) ++ m.uci:set("firewall", s1['.name'], "src", "wan") ++ m.uci:set("firewall", s1['.name'], "proto", "udp") ++ m.uci:set("firewall", s1['.name'], "target", "ACCEPT") ++ commit = true ++ end ++ end ++ end) ++ else ++ -- We delete the firewall rules if one or more of the necessary parameters are not set. ++ sip_rule_name=nil ++ rtp_rule_name=nil ++ ++ -- First discover the configuration names of the rules. ++ m.uci:foreach("firewall", "rule", ++ function(s1) ++ if s1._name == 'PBX-SIP' then ++ sip_rule_name = s1['.name'] ++ elseif s1._name == 'PBX-RTP' then ++ rtp_rule_name = s1['.name'] ++ end ++ end) ++ ++ -- Then, using the names, actually delete the rules. ++ if sip_rule_name ~= nil then ++ m.uci:delete("firewall", sip_rule_name) ++ commit = true ++ end ++ if rtp_rule_name ~= nil then ++ m.uci:delete("firewall", rtp_rule_name) ++ commit = true ++ end ++ end ++ ++ -- If something changed, then we commit the firewall config. ++ if commit == true then m.uci:commit("firewall") end ++end ++ ++m = Map (modulename, translate("Advanced Settings"), ++ translate("This section contains settings that do not need to be changed under \ ++ normal circumstances. In addition, here you can configure your system \ ++ for use with remote SIP devices, and resolve call quality issues by enabling \ ++ the insertion of QoS rules.")) ++ ++-- Recreate the voip server config, and restart necessary services after changes are commited ++-- to the advanced configuration. The firewall must restart because of "Remote Usage". ++function m.on_after_commit(self) ++ ++ -- Make sure firewall rules are in place ++ maintain_firewall_rules() ++ ++ -- If insertion of QoS rules is enabled ++ if m.uci:get(modulename, "advanced", "qos_enabled") == "yes" then ++ insert_qos_rules() ++ else ++ delete_qos_rules() ++ end ++ ++ luci.sys.call("/etc/init.d/pbx-" .. server .. " restart 1\>/dev/null 2\>/dev/null") ++ luci.sys.call("/etc/init.d/" .. server .. " restart 1\>/dev/null 2\>/dev/null") ++ luci.sys.call("/etc/init.d/firewall restart 1\>/dev/null 2\>/dev/null") ++end ++ ++----------------------------------------------------------------------------- ++s = m:section(NamedSection, "advanced", "settings", translate("Advanced Settings")) ++s.anonymous = true ++ ++s:tab("general", translate("General Settings")) ++s:tab("remote_usage", translate("Remote Usage"), ++ translatef("You can use your SIP devices/softphones with this system from a remote location \ ++ as well, as long as your Internet Service Provider gives you a public IP. \ ++ You will be able to call other local users for free (e.g. other Analog Telephone Adapters (ATAs)) \ ++ and use your VoIP providers to make calls as if you were local to the PBX. \ ++ After configuring this tab, go back to where users are configured and see the new \ ++ Server and Port setting you need to configure the remote SIP devices with. Please note that if this \ ++ PBX is not running on your router/gateway, you will need to configure port forwarding (NAT) on your \ ++ router/gateway. Please forward the ports below (SIP port and RTP range) to the IP address of the \ ++ device running this PBX.")) ++ ++s:tab("qos", translate("QoS Settings"), ++ translate("If you experience jittery or high latency audio during heavy downloads, you may want \ ++ to enable QoS. QoS prioritizes traffic to and from your network for specified ports and IP \ ++ addresses, resulting in better latency and throughput for sound in our case. If enabled below, \ ++ a QoS rule for this service will be configured by the PBX automatically, but you must visit the \ ++ QoS configuration page (Network->QoS) to configure other critical QoS settings like Download \ ++ and Upload speed.")) ++ ++ringtime = s:taboption("general", Value, "ringtime", translate("Number of Seconds to Ring"), ++ translate("Set the number of seconds to ring users upon incoming calls before hanging up \ ++ or going to voicemail, if the voicemail is installed and enabled.")) ++ringtime.datatype = "port" ++ringtime.default = 30 ++ ++ua = s:taboption("general", Value, "useragent", translate("User Agent String"), ++ translate("This is the name that the VoIP server will use to identify itself when \ ++ registering to VoIP (SIP) providers. Some providers require this to a specific \ ++ string matching a hardware SIP device.")) ++ua.default = appname ++ ++h = s:taboption("remote_usage", Value, "externhost", translate("Domain/IP Address/Dynamic Domain"), ++ translate("You can enter your domain name, external IP address, or dynamic domain name here. \ ++ The best thing to input is a static IP address. If your IP address is dynamic and it changes, \ ++ your configuration will become invalid. Hence, it's recommended to set up Dynamic DNS in this case. \ ++ and enter your Dynamic DNS hostname here. You can configure Dynamic DNS with the luci-app-ddns package.")) ++h.datatype = "host" ++ ++p = s:taboption("remote_usage", Value, "bindport", translate("External SIP Port"), ++ translate("Pick a random port number between 6500 and 9500 for the service to listen on. \ ++ Do not pick the standard 5060, because it is often subject to brute-force attacks. \ ++ When finished, (1) click \"Save and Apply\", and (2) look in the \ ++ \"SIP Device/Softphone Accounts\" section for updated Server and Port settings \ ++ for your SIP Devices/Softphones.")) ++p.datatype = "port" ++ ++p = s:taboption("remote_usage", Value, "rtpstart", translate("RTP Port Range Start"), ++ translate("RTP traffic carries actual voice packets. This is the start of the port range \ ++ that will be used for setting up RTP communication. It's usually OK to leave this \ ++ at the default value.")) ++p.datatype = "port" ++p.default = defaultrtpstart ++ ++p = s:taboption("remote_usage", Value, "rtpend", translate("RTP Port Range End")) ++p.datatype = "port" ++p.default = defaultrtpend ++ ++p = s:taboption("qos", ListValue, "qos_enabled", translate("Insert QoS Rules")) ++p:value("yes", translate("Yes")) ++p:value("no", translate("No")) ++p.default = "yes" ++ ++return m +diff --git a/feeds/luci/applications/luci-app-pbx/luasrc/model/cbi/pbx-calls.lua b/feeds/luci/applications/luci-app-pbx/luasrc/model/cbi/pbx-calls.lua +new file mode 100644 +index 0000000..ca373d6 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-pbx/luasrc/model/cbi/pbx-calls.lua +@@ -0,0 +1,424 @@ ++--[[ ++ Copyright 2011 Iordan Iordanov ++ ++ This file is part of luci-pbx. ++ ++ luci-pbx is free software: you can redistribute it and/or modify ++ it under the terms of the GNU General Public License as published by ++ the Free Software Foundation, either version 3 of the License, or ++ (at your option) any later version. ++ ++ luci-pbx is distributed in the hope that it will be useful, ++ but WITHOUT ANY WARRANTY; without even the implied warranty of ++ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++ GNU General Public License for more details. ++ ++ You should have received a copy of the GNU General Public License ++ along with luci-pbx. If not, see . ++]]-- ++ ++if nixio.fs.access("/etc/init.d/asterisk") then ++ server = "asterisk" ++elseif nixio.fs.access("/etc/init.d/freeswitch") then ++ server = "freeswitch" ++else ++ server = "" ++end ++ ++modulename = "pbx-calls" ++voipmodulename = "pbx-voip" ++googlemodulename = "pbx-google" ++usersmodulename = "pbx-users" ++allvalidaccounts = {} ++nallvalidaccounts = 0 ++validoutaccounts = {} ++nvalidoutaccounts = 0 ++validinaccounts = {} ++nvalidinaccounts = 0 ++allvalidusers = {} ++nallvalidusers = 0 ++validoutusers = {} ++nvalidoutusers = 0 ++ ++ ++-- Checks whether the entered extension is valid syntactically. ++function is_valid_extension(exten) ++ return (exten:match("[#*+0-9NXZ]+$") ~= nil) ++end ++ ++ ++m = Map (modulename, translate("Call Routing"), ++ translate("This is where you indicate which Google/SIP accounts are used to call what \ ++ country/area codes, which users can use what SIP/Google accounts, how incoming \ ++ calls are routed, what numbers can get into this PBX with a password, and what \ ++ numbers are blacklisted.")) ++ ++-- Recreate the config, and restart services after changes are commited to the configuration. ++function m.on_after_commit(self) ++ luci.sys.call("/etc/init.d/pbx-" .. server .. " restart 1\>/dev/null 2\>/dev/null") ++ luci.sys.call("/etc/init.d/" .. server .. " restart 1\>/dev/null 2\>/dev/null") ++end ++ ++-- Add Google accounts to all valid accounts, and accounts valid for incoming and outgoing calls. ++m.uci:foreach(googlemodulename, "gtalk_jabber", ++ function(s1) ++ -- Add this provider to list of valid accounts. ++ if s1.username ~= nil and s1.name ~= nil then ++ allvalidaccounts[s1.name] = s1.username ++ nallvalidaccounts = nallvalidaccounts + 1 ++ ++ if s1.make_outgoing_calls == "yes" then ++ -- Add provider to the associative array of valid outgoing accounts. ++ validoutaccounts[s1.name] = s1.username ++ nvalidoutaccounts = nvalidoutaccounts + 1 ++ end ++ ++ if s1.register == "yes" then ++ -- Add provider to the associative array of valid outgoing accounts. ++ validinaccounts[s1.name] = s1.username ++ nvalidinaccounts = nvalidinaccounts + 1 ++ end ++ end ++ end) ++ ++-- Add SIP accounts to all valid accounts, and accounts valid for incoming and outgoing calls. ++m.uci:foreach(voipmodulename, "voip_provider", ++ function(s1) ++ -- Add this provider to list of valid accounts. ++ if s1.defaultuser ~= nil and s1.host ~= nil and s1.name ~= nil then ++ allvalidaccounts[s1.name] = s1.defaultuser .. "@" .. s1.host ++ nallvalidaccounts = nallvalidaccounts + 1 ++ ++ if s1.make_outgoing_calls == "yes" then ++ -- Add provider to the associative array of valid outgoing accounts. ++ validoutaccounts[s1.name] = s1.defaultuser .. "@" .. s1.host ++ nvalidoutaccounts = nvalidoutaccounts + 1 ++ end ++ ++ if s1.register == "yes" then ++ -- Add provider to the associative array of valid outgoing accounts. ++ validinaccounts[s1.name] = s1.defaultuser .. "@" .. s1.host ++ nvalidinaccounts = nvalidinaccounts + 1 ++ end ++ end ++ end) ++ ++-- Add Local User accounts to all valid users, and users allowed to make outgoing calls. ++m.uci:foreach(usersmodulename, "local_user", ++ function(s1) ++ -- Add user to list of all valid users. ++ if s1.defaultuser ~= nil then ++ allvalidusers[s1.defaultuser] = true ++ nallvalidusers = nallvalidusers + 1 ++ ++ if s1.can_call == "yes" then ++ validoutusers[s1.defaultuser] = true ++ nvalidoutusers = nvalidoutusers + 1 ++ end ++ end ++ end) ++ ++ ++---------------------------------------------------------------------------------------------------- ++-- If there are no accounts configured, or no accounts enabled for outgoing calls, display a warning. ++-- Otherwise, display the usual help text within the section. ++if nallvalidaccounts == 0 then ++ text = translate("NOTE: There are no Google or SIP provider accounts configured.") ++elseif nvalidoutaccounts == 0 then ++ text = translate("NOTE: There are no Google or SIP provider accounts enabled for outgoing calls.") ++else ++ text = translate("If you have more than one account that can make outgoing calls, you \ ++ should enter a list of phone numbers and/or prefixes in the following fields for each \ ++ provider listed. Invalid prefixes are removed silently, and only 0-9, X, Z, N, #, *, \ ++ and + are valid characters. The letter X matches 0-9, Z matches 1-9, and N matches 2-9. \ ++ For example to make calls to Germany through a provider, you can enter 49. To make calls \ ++ to North America, you can enter 1NXXNXXXXXX. If one of your providers can make \"local\" \ ++ calls to an area code like New York's 646, you can enter 646NXXXXXX for that \ ++ provider. You should leave one account with an empty list to make calls with \ ++ it by default, if no other provider's prefixes match. The system will automatically \ ++ replace an empty list with a message that the provider dials all numbers not matched by another \ ++ provider's prefixes. Be as specific as possible (i.e. 1NXXNXXXXXX is better than 1). Please note \ ++ all international dial codes are discarded (e.g. 00, 011, 010, 0011). Entries can be made in a \ ++ space-separated list, and/or one per line by hitting enter after every one.") ++end ++ ++ ++s = m:section(NamedSection, "outgoing_calls", "call_routing", translate("Outgoing Calls"), text) ++s.anonymous = true ++ ++for k,v in pairs(validoutaccounts) do ++ patterns = s:option(DynamicList, k, v) ++ ++ -- If the saved field is empty, we return a string ++ -- telling the user that this provider would dial any exten. ++ function patterns.cfgvalue(self, section) ++ value = self.map:get(section, self.option) ++ ++ if value == nil then ++ return {translate("Dials numbers unmatched elsewhere")} ++ else ++ return value ++ end ++ end ++ ++ -- Write only valid extensions into the config file. ++ function patterns.write(self, section, value) ++ newvalue = {} ++ nindex = 1 ++ for index, field in ipairs(value) do ++ val = luci.util.trim(value[index]) ++ if is_valid_extension(val) == true then ++ newvalue[nindex] = val ++ nindex = nindex + 1 ++ end ++ end ++ DynamicList.write(self, section, newvalue) ++ end ++end ++ ++---------------------------------------------------------------------------------------------------- ++-- If there are no accounts configured, or no accounts enabled for incoming calls, display a warning. ++-- Otherwise, display the usual help text within the section. ++if nallvalidaccounts == 0 then ++ text = translate("NOTE: There are no Google or SIP provider accounts configured.") ++elseif nvalidinaccounts == 0 then ++ text = translate("NOTE: There are no Google or SIP provider accounts enabled for incoming calls.") ++else ++ text = translate("For each provider enabled for incoming calls, here you can restrict which users to\ ++ ring on incoming calls. If the list is empty, the system will indicate that all users \ ++ enabled for incoming calls will ring. Invalid usernames will be rejected \ ++ silently. Also, entering a username here overrides the user's setting to not receive \ ++ incoming calls. This way, you can make certain users ring only for specific providers. \ ++ Entries can be made in a space-separated list, and/or one per line by hitting enter after \ ++ every one.") ++end ++ ++ ++s = m:section(NamedSection, "incoming_calls", "call_routing", translate("Incoming Calls"), text) ++s.anonymous = true ++ ++for k,v in pairs(validinaccounts) do ++ users = s:option(DynamicList, k, v) ++ ++ -- If the saved field is empty, we return a string telling the user that ++ -- this provider would ring all users configured for incoming calls. ++ function users.cfgvalue(self, section) ++ value = self.map:get(section, self.option) ++ ++ if value == nil then ++ return {translate("Rings users enabled for incoming calls")} ++ else ++ return value ++ end ++ end ++ ++ -- Write only valid user names. ++ function users.write(self, section, value) ++ newvalue = {} ++ nindex = 1 ++ for index, field in ipairs(value) do ++ trimuser = luci.util.trim(value[index]) ++ if allvalidusers[trimuser] == true then ++ newvalue[nindex] = trimuser ++ nindex = nindex + 1 ++ end ++ end ++ DynamicList.write(self, section, newvalue) ++ end ++end ++ ++ ++---------------------------------------------------------------------------------------------------- ++-- If there are no user accounts configured, no user accounts enabled for outgoing calls, ++-- display a warning. Otherwise, display the usual help text within the section. ++if nallvalidusers == 0 then ++ text = translate("NOTE: There are no local user accounts configured.") ++elseif nvalidoutusers == 0 then ++ text = translate("NOTE: There are no local user accounts enabled for outgoing calls.") ++else ++ text = translate("For each user enabled for outgoing calls you can restrict what providers the user \ ++ can use for outgoing calls. By default all users can use all providers. To show up in the list \ ++ below the user should be allowed to make outgoing calls in the \"User Accounts\" page. Enter VoIP \ ++ providers in the format username@some.host.name, as listed in \"Outgoing Calls\" above. It's \ ++ easiest to copy and paste the providers from above. Invalid entries, including providers not \ ++ enabled for outgoing calls, will be rejected silently. Entries can be made in a space-separated \ ++ list, and/or one per line by hitting enter after every one.") ++end ++ ++ ++s = m:section(NamedSection, "providers_user_can_use", "call_routing", ++ translate("Providers Used for Outgoing Calls"), text) ++s.anonymous = true ++ ++for k,v in pairs(validoutusers) do ++ providers = s:option(DynamicList, k, k) ++ ++ -- If the saved field is empty, we return a string telling the user ++ -- that this user uses all providers enavled for outgoing calls. ++ function providers.cfgvalue(self, section) ++ value = self.map:get(section, self.option) ++ ++ if value == nil then ++ return {translate("Uses providers enabled for outgoing calls")} ++ else ++ newvalue = {} ++ -- Convert internal names to user@host values. ++ for i,v in ipairs(value) do ++ newvalue[i] = validoutaccounts[v] ++ end ++ return newvalue ++ end ++ end ++ ++ -- Cook the new values prior to entering them into the config file. ++ -- Also, enter them only if they are valid. ++ function providers.write(self, section, value) ++ cookedvalue = {} ++ cindex = 1 ++ for index, field in ipairs(value) do ++ cooked = string.gsub(luci.util.trim(value[index]), "%W", "_") ++ if validoutaccounts[cooked] ~= nil then ++ cookedvalue[cindex] = cooked ++ cindex = cindex + 1 ++ end ++ end ++ DynamicList.write(self, section, cookedvalue) ++ end ++end ++ ++---------------------------------------------------------------------------------------------------- ++s = m:section(TypedSection, "callthrough_numbers", translate("Call-through Numbers"), ++ translate("Designate numbers that are allowed to call through this system and which user's \ ++ privileges they will have.")) ++s.anonymous = true ++s.addremove = true ++ ++num = s:option(DynamicList, "callthrough_number_list", translate("Call-through Numbers"), ++ translate("Specify numbers individually here. Press enter to add more numbers. \ ++ You will have to experiment with what country and area codes you need to add \ ++ to the number.")) ++num.datatype = "uinteger" ++ ++p = s:option(ListValue, "enabled", translate("Enabled")) ++p:value("yes", translate("Yes")) ++p:value("no", translate("No")) ++p.default = "yes" ++ ++user = s:option(Value, "defaultuser", translate("User Name"), ++ translate("The number(s) specified above will be able to dial out with this user's providers. \ ++ Invalid usernames, including users not enabled for outgoing calls, are dropped silently. \ ++ Please verify that the entry was accepted.")) ++function user.write(self, section, value) ++ trimuser = luci.util.trim(value) ++ if allvalidusers[trimuser] == true then ++ Value.write(self, section, trimuser) ++ end ++end ++ ++pwd = s:option(Value, "pin", translate("PIN"), ++ translate("Your PIN disappears when saved for your protection. It will be changed \ ++ only when you enter a value different from the saved one. Leaving the PIN \ ++ empty is possible, but please beware of the security implications.")) ++pwd.password = true ++pwd.rmempty = false ++ ++-- We skip reading off the saved value and return nothing. ++function pwd.cfgvalue(self, section) ++ return "" ++end ++ ++-- We check the entered value against the saved one, and only write if the entered value is ++-- something other than the empty string, and it differes from the saved value. ++function pwd.write(self, section, value) ++ local orig_pwd = m:get(section, self.option) ++ if value and #value > 0 and orig_pwd ~= value then ++ Value.write(self, section, value) ++ end ++end ++ ++---------------------------------------------------------------------------------------------------- ++s = m:section(TypedSection, "callback_numbers", translate("Call-back Numbers"), ++ translate("Designate numbers to whom the system will hang up and call back, which provider will \ ++ be used to call them, and which user's privileges will be granted to them.")) ++s.anonymous = true ++s.addremove = true ++ ++num = s:option(DynamicList, "callback_number_list", translate("Call-back Numbers"), ++ translate("Specify numbers individually here. Press enter to add more numbers. \ ++ You will have to experiment with what country and area codes you need to add \ ++ to the number.")) ++num.datatype = "uinteger" ++ ++p = s:option(ListValue, "enabled", translate("Enabled")) ++p:value("yes", translate("Yes")) ++p:value("no", translate("No")) ++p.default = "yes" ++ ++delay = s:option(Value, "callback_hangup_delay", translate("Hang-up Delay"), ++ translate("How long to wait before hanging up. If the provider you use to dial automatically forwards \ ++ to voicemail, you can set this value to a delay that will allow you to hang up before your call gets \ ++ forwarded and you get billed for it.")) ++delay.datatype = "uinteger" ++delay.default = 0 ++ ++user = s:option(Value, "defaultuser", translate("User Name"), ++ translate("The number(s) specified above will be able to dial out with this user's providers. \ ++ Invalid usernames, including users not enabled for outgoing calls, are dropped silently. \ ++ Please verify that the entry was accepted.")) ++function user.write(self, section, value) ++ trimuser = luci.util.trim(value) ++ if allvalidusers[trimuser] == true then ++ Value.write(self, section, trimuser) ++ end ++end ++ ++pwd = s:option(Value, "pin", translate("PIN"), ++ translate("Your PIN disappears when saved for your protection. It will be changed \ ++ only when you enter a value different from the saved one. Leaving the PIN \ ++ empty is possible, but please beware of the security implications.")) ++pwd.password = true ++pwd.rmempty = false ++ ++-- We skip reading off the saved value and return nothing. ++function pwd.cfgvalue(self, section) ++ return "" ++end ++ ++-- We check the entered value against the saved one, and only write if the entered value is ++-- something other than the empty string, and it differes from the saved value. ++function pwd.write(self, section, value) ++ local orig_pwd = m:get(section, self.option) ++ if value and #value > 0 and orig_pwd ~= value then ++ Value.write(self, section, value) ++ end ++end ++ ++provider = s:option(Value, "callback_provider", translate("Call-back Provider"), ++ translate("Enter a VoIP provider to use for call-back in the format username@some.host.name, as listed in \ ++ \"Outgoing Calls\" above. It's easiest to copy and paste the providers from above. Invalid entries, including \ ++ providers not enabled for outgoing calls, will be rejected silently.")) ++function provider.write(self, section, value) ++ cooked = string.gsub(luci.util.trim(value), "%W", "_") ++ if validoutaccounts[cooked] ~= nil then ++ Value.write(self, section, value) ++ end ++end ++ ++---------------------------------------------------------------------------------------------------- ++s = m:section(NamedSection, "blacklisting", "call_routing", translate("Blacklisted Numbers"), ++ translate("Enter phone numbers that you want to decline calls from automatically. \ ++ You should probably omit the country code and any leading zeroes, but please \ ++ experiment to make sure you are blocking numbers from your desired area successfully.")) ++s.anonymous = true ++ ++b = s:option(DynamicList, "blacklist1", translate("Dynamic List of Blacklisted Numbers"), ++ translate("Specify numbers individually here. Press enter to add more numbers.")) ++b.cast = "string" ++b.datatype = "uinteger" ++ ++b = s:option(Value, "blacklist2", translate("Space-Separated List of Blacklisted Numbers"), ++ translate("Copy-paste large lists of numbers here.")) ++b.template = "cbi/tvalue" ++b.rows = 3 ++ ++return m +diff --git a/feeds/luci/applications/luci-app-pbx/luasrc/model/cbi/pbx-google.lua b/feeds/luci/applications/luci-app-pbx/luasrc/model/cbi/pbx-google.lua +new file mode 100644 +index 0000000..3c36a16 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-pbx/luasrc/model/cbi/pbx-google.lua +@@ -0,0 +1,122 @@ ++--[[ ++ Copyright 2011 Iordan Iordanov ++ ++ This file is part of luci-pbx. ++ ++ luci-pbx is free software: you can redistribute it and/or modify ++ it under the terms of the GNU General Public License as published by ++ the Free Software Foundation, either version 3 of the License, or ++ (at your option) any later version. ++ ++ luci-pbx is distributed in the hope that it will be useful, ++ but WITHOUT ANY WARRANTY; without even the implied warranty of ++ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++ GNU General Public License for more details. ++ ++ You should have received a copy of the GNU General Public License ++ along with luci-pbx. If not, see . ++]]-- ++ ++if nixio.fs.access("/etc/init.d/asterisk") then ++ server = "asterisk" ++elseif nixio.fs.access("/etc/init.d/freeswitch") then ++ server = "freeswitch" ++else ++ server = "" ++end ++ ++modulename = "pbx-google" ++googlemodulename = "pbx-google" ++defaultstatus = "dnd" ++defaultstatusmessage = "PBX online, may lose messages" ++ ++m = Map (modulename, translate("Google Accounts"), ++ translate("This is where you set up your Google (Talk and Voice) Accounts, in order to start \ ++ using them for dialing and receiving calls (voice chat and real phone calls). Please \ ++ make at least one voice call using the Google Talk plugin installable through the \ ++ GMail interface, and then log out from your account everywhere. Click \"Add\" \ ++ to add as many accounts as you wish.")) ++ ++-- Recreate the config, and restart services after changes are commited to the configuration. ++function m.on_after_commit(self) ++ -- Create a field "name" for each account that identifies the account in the backend. ++ commit = false ++ m.uci:foreach(modulename, "gtalk_jabber", ++ function(s1) ++ if s1.username ~= nil then ++ name=string.gsub(s1.username, "%W", "_") ++ if s1.name ~= name then ++ m.uci:set(modulename, s1['.name'], "name", name) ++ commit = true ++ end ++ end ++ end) ++ if commit == true then m.uci:commit(modulename) end ++ ++ luci.sys.call("/etc/init.d/pbx-" .. server .. " restart 1\>/dev/null 2\>/dev/null") ++ luci.sys.call("/etc/init.d/asterisk restart 1\>/dev/null 2\>/dev/null") ++end ++ ++----------------------------------------------------------------------------- ++s = m:section(TypedSection, "gtalk_jabber", translate("Google Voice/Talk Accounts")) ++s.anonymous = true ++s.addremove = true ++ ++s:option(Value, "username", translate("Email")) ++ ++pwd = s:option(Value, "secret", translate("Password"), ++ translate("When your password is saved, it disappears from this field and is not displayed \ ++ for your protection. The previously saved password will be changed only when you \ ++ enter a value different from the saved one.")) ++pwd.password = true ++pwd.rmempty = false ++ ++-- We skip reading off the saved value and return nothing. ++function pwd.cfgvalue(self, section) ++ return "" ++end ++ ++-- We check the entered value against the saved one, and only write if the entered value is ++-- something other than the empty string, and it differes from the saved value. ++function pwd.write(self, section, value) ++ local orig_pwd = m:get(section, self.option) ++ if value and #value > 0 and orig_pwd ~= value then ++ Value.write(self, section, value) ++ end ++end ++ ++ ++p = s:option(ListValue, "register", ++ translate("Enable Incoming Calls (set Status below)"), ++ translate("When somebody starts voice chat with your GTalk account or calls the GVoice, \ ++ number (if you have Google Voice), the call will be forwarded to any users \ ++ that are online (registered using a SIP device or softphone) and permitted to \ ++ receive the call. If you have Google Voice, you must go to your GVoice settings and \ ++ forward calls to Google chat in order to actually receive calls made to your \ ++ GVoice number. If you have trouble receiving calls from GVoice, experiment \ ++ with the Call Screening option in your GVoice Settings. Finally, make sure no other \ ++ client is online with this account (browser in gmail, mobile/desktop Google Talk \ ++ App) as it may interfere.")) ++p:value("yes", translate("Yes")) ++p:value("no", translate("No")) ++p.default = "yes" ++ ++p = s:option(ListValue, "make_outgoing_calls", translate("Enable Outgoing Calls"), ++ translate("Use this account to make outgoing calls as configured in the \"Call Routing\" section.")) ++p:value("yes", translate("Yes")) ++p:value("no", translate("No")) ++p.default = "yes" ++ ++st = s:option(ListValue, "status", translate("Google Talk Status")) ++st:depends("register", "yes") ++st:value("dnd", translate("Do Not Disturb")) ++st:value("away", translate("Away")) ++st:value("available", translate("Available")) ++st.default = defaultstatus ++ ++stm = s:option(Value, "statusmessage", translate("Google Talk Status Message"), ++ translate("Avoid using anything but alpha-numeric characters, space, comma, and period.")) ++stm:depends("register", "yes") ++stm.default = defaultstatusmessage ++ ++return m +diff --git a/feeds/luci/applications/luci-app-pbx/luasrc/model/cbi/pbx-users.lua b/feeds/luci/applications/luci-app-pbx/luasrc/model/cbi/pbx-users.lua +new file mode 100644 +index 0000000..c7c8b4d +--- /dev/null ++++ b/feeds/luci/applications/luci-app-pbx/luasrc/model/cbi/pbx-users.lua +@@ -0,0 +1,133 @@ ++--[[ ++ Copyright 2011 Iordan Iordanov ++ ++ This file is part of luci-pbx. ++ ++ luci-pbx is free software: you can redistribute it and/or modify ++ it under the terms of the GNU General Public License as published by ++ the Free Software Foundation, either version 3 of the License, or ++ (at your option) any later version. ++ ++ luci-pbx is distributed in the hope that it will be useful, ++ but WITHOUT ANY WARRANTY; without even the implied warranty of ++ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++ GNU General Public License for more details. ++ ++ You should have received a copy of the GNU General Public License ++ along with luci-pbx. If not, see . ++]]-- ++ ++if nixio.fs.access("/etc/init.d/asterisk") then ++ server = "asterisk" ++elseif nixio.fs.access("/etc/init.d/freeswitch") then ++ server = "freeswitch" ++else ++ server = "" ++end ++ ++modulename = "pbx-users" ++modulenamecalls = "pbx-calls" ++modulenameadvanced = "pbx-advanced" ++ ++ ++m = Map (modulename, translate("User Accounts"), ++ translate("Here you must configure at least one SIP account, that you \ ++ will use to register with this service. Use this account either in an Analog Telephony \ ++ Adapter (ATA), or in a SIP software like CSipSimple, Linphone, or Sipdroid on your \ ++ smartphone, or Ekiga, Linphone, or X-Lite on your computer. By default, all SIP accounts \ ++ will ring simultaneously if a call is made to one of your VoIP provider accounts or GV \ ++ numbers.")) ++ ++-- Recreate the config, and restart services after changes are commited to the configuration. ++function m.on_after_commit(self) ++ luci.sys.call("/etc/init.d/pbx-" .. server .. " restart 1\>/dev/null 2\>/dev/null") ++ luci.sys.call("/etc/init.d/" .. server .. " restart 1\>/dev/null 2\>/dev/null") ++end ++ ++externhost = m.uci:get(modulenameadvanced, "advanced", "externhost") ++bindport = m.uci:get(modulenameadvanced, "advanced", "bindport") ++ipaddr = m.uci:get("network", "lan", "ipaddr") ++ ++----------------------------------------------------------------------------- ++s = m:section(NamedSection, "server", "user", translate("Server Setting")) ++s.anonymous = true ++ ++if ipaddr == nil or ipaddr == "" then ++ ipaddr = "(IP address not static)" ++end ++ ++if bindport ~= nil then ++ just_ipaddr = ipaddr ++ ipaddr = ipaddr .. ":" .. bindport ++end ++ ++s:option(DummyValue, "ipaddr", translate("Server Setting for Local SIP Devices"), ++ translate("Enter this IP (or IP:port) in the Server/Registrar setting of SIP devices you will \ ++ use ONLY locally and never from a remote location.")).default = ipaddr ++ ++if externhost ~= nil then ++ if bindport ~= nil then ++ just_externhost = externhost ++ externhost = externhost .. ":" .. bindport ++ end ++ s:option(DummyValue, "externhost", translate("Server Setting for Remote SIP Devices"), ++ translate("Enter this hostname (or hostname:port) in the Server/Registrar setting of SIP \ ++ devices you will use from a remote location (they will work locally too).") ++ ).default = externhost ++end ++ ++if bindport ~= nil then ++ s:option(DummyValue, "bindport", translate("Port Setting for SIP Devices"), ++ translatef("If setting Server/Registrar to %s or %s does not work for you, try setting \ ++ it to %s or %s and entering this port number in a separate field that specifies the \ ++ Server/Registrar port number. Beware that some devices have a confusing \ ++ setting that sets the port where SIP requests originate from on the SIP \ ++ device itself (the bind port). The port specified on this page is NOT this bind port \ ++ but the port this service listens on.", ++ ipaddr, externhost, just_ipaddr, just_externhost)).default = bindport ++end ++ ++----------------------------------------------------------------------------- ++s = m:section(TypedSection, "local_user", translate("SIP Device/Softphone Accounts")) ++s.anonymous = true ++s.addremove = true ++ ++s:option(Value, "fullname", translate("Full Name"), ++ translate("You can specify a real name to show up in the Caller ID here.")) ++ ++du = s:option(Value, "defaultuser", translate("User Name"), ++ translate("Use (four to five digit) numeric user name if you are connecting normal telephones \ ++ with ATAs to this system (so they can dial user names).")) ++du.datatype = "uciname" ++ ++pwd = s:option(Value, "secret", translate("Password"), ++ translate("Your password disappears when saved for your protection. It will be changed \ ++ only when you enter a value different from the saved one.")) ++pwd.password = true ++pwd.rmempty = false ++ ++-- We skip reading off the saved value and return nothing. ++function pwd.cfgvalue(self, section) ++ return "" ++end ++ ++-- We check the entered value against the saved one, and only write if the entered value is ++-- something other than the empty string, and it differes from the saved value. ++function pwd.write(self, section, value) ++ local orig_pwd = m:get(section, self.option) ++ if value and #value > 0 and orig_pwd ~= value then ++ Value.write(self, section, value) ++ end ++end ++ ++p = s:option(ListValue, "ring", translate("Receives Incoming Calls")) ++p:value("yes", translate("Yes")) ++p:value("no", translate("No")) ++p.default = "yes" ++ ++p = s:option(ListValue, "can_call", translate("Makes Outgoing Calls")) ++p:value("yes", translate("Yes")) ++p:value("no", translate("No")) ++p.default = "yes" ++ ++return m +diff --git a/feeds/luci/applications/luci-app-pbx/luasrc/model/cbi/pbx-voip.lua b/feeds/luci/applications/luci-app-pbx/luasrc/model/cbi/pbx-voip.lua +new file mode 100644 +index 0000000..ed1ed1e +--- /dev/null ++++ b/feeds/luci/applications/luci-app-pbx/luasrc/model/cbi/pbx-voip.lua +@@ -0,0 +1,116 @@ ++--[[ ++ Copyright 2011 Iordan Iordanov ++ ++ This file is part of luci-pbx. ++ ++ luci-pbx is free software: you can redistribute it and/or modify ++ it under the terms of the GNU General Public License as published by ++ the Free Software Foundation, either version 3 of the License, or ++ (at your option) any later version. ++ ++ luci-pbx is distributed in the hope that it will be useful, ++ but WITHOUT ANY WARRANTY; without even the implied warranty of ++ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++ GNU General Public License for more details. ++ ++ You should have received a copy of the GNU General Public License ++ along with luci-pbx. If not, see . ++]]-- ++ ++if nixio.fs.access("/etc/init.d/asterisk") then ++ server = "asterisk" ++elseif nixio.fs.access("/etc/init.d/freeswitch") then ++ server = "freeswitch" ++else ++ server = "" ++end ++ ++modulename = "pbx-voip" ++ ++m = Map (modulename, translate("SIP Accounts"), ++ translate("This is where you set up your SIP (VoIP) accounts ts like Sipgate, SipSorcery, \ ++ the popular Betamax providers, and any other providers with SIP settings in order to start \ ++ using them for dialing and receiving calls (SIP uri and real phone calls). Click \"Add\" to \ ++ add as many accounts as you wish.")) ++ ++-- Recreate the config, and restart services after changes are commited to the configuration. ++function m.on_after_commit(self) ++ commit = false ++ -- Create a field "name" for each account that identifies the account in the backend. ++ m.uci:foreach(modulename, "voip_provider", ++ function(s1) ++ if s1.defaultuser ~= nil and s1.host ~= nil then ++ name=string.gsub(s1.defaultuser.."_"..s1.host, "%W", "_") ++ if s1.name ~= name then ++ m.uci:set(modulename, s1['.name'], "name", name) ++ commit = true ++ end ++ end ++ end) ++ if commit == true then m.uci:commit(modulename) end ++ ++ luci.sys.call("/etc/init.d/pbx-" .. server .. " restart 1\>/dev/null 2\>/dev/null") ++ luci.sys.call("/etc/init.d/" .. server .. " restart 1\>/dev/null 2\>/dev/null") ++end ++ ++----------------------------------------------------------------------------- ++s = m:section(TypedSection, "voip_provider", translate("SIP Provider Accounts")) ++s.anonymous = true ++s.addremove = true ++ ++s:option(Value, "defaultuser", translate("User Name")) ++pwd = s:option(Value, "secret", translate("Password"), ++ translate("When your password is saved, it disappears from this field and is not displayed \ ++ for your protection. The previously saved password will be changed only when you \ ++ enter a value different from the saved one.")) ++ ++ ++ ++pwd.password = true ++pwd.rmempty = false ++ ++-- We skip reading off the saved value and return nothing. ++function pwd.cfgvalue(self, section) ++ return "" ++end ++ ++-- We check the entered value against the saved one, and only write if the entered value is ++-- something other than the empty string, and it differes from the saved value. ++function pwd.write(self, section, value) ++ local orig_pwd = m:get(section, self.option) ++ if value and #value > 0 and orig_pwd ~= value then ++ Value.write(self, section, value) ++ end ++end ++ ++h = s:option(Value, "host", translate("SIP Server/Registrar")) ++h.datatype = "host" ++ ++p = s:option(ListValue, "register", translate("Enable Incoming Calls (Register via SIP)"), ++ translate("This option should be set to \"Yes\" if you have a DID \(real telephone number\) \ ++ associated with this SIP account or want to receive SIP uri calls through this \ ++ provider.")) ++p:value("yes", translate("Yes")) ++p:value("no", translate("No")) ++p.default = "yes" ++ ++p = s:option(ListValue, "make_outgoing_calls", translate("Enable Outgoing Calls"), ++ translate("Use this account to make outgoing calls.")) ++p:value("yes", translate("Yes")) ++p:value("no", translate("No")) ++p.default = "yes" ++ ++from = s:option(Value, "fromdomain", ++ translate("SIP Realm (needed by some providers)")) ++from.optional = true ++from.datatype = "host" ++ ++port = s:option(Value, "port", translate("SIP Server/Registrar Port")) ++port.optional = true ++port.datatype = "port" ++ ++op = s:option(Value, "outboundproxy", translate("Outbound Proxy")) ++op.optional = true ++op.datatype = "host" ++ ++return m +diff --git a/feeds/luci/applications/luci-app-pbx/luasrc/model/cbi/pbx.lua b/feeds/luci/applications/luci-app-pbx/luasrc/model/cbi/pbx.lua +new file mode 100644 +index 0000000..4c5fcbd +--- /dev/null ++++ b/feeds/luci/applications/luci-app-pbx/luasrc/model/cbi/pbx.lua +@@ -0,0 +1,115 @@ ++--[[ ++ Copyright 2011 Iordan Iordanov ++ ++ This file is part of luci-pbx. ++ ++ luci-pbx is free software: you can redistribute it and/or modify ++ it under the terms of the GNU General Public License as published by ++ the Free Software Foundation, either version 3 of the License, or ++ (at your option) any later version. ++ ++ luci-pbx is distributed in the hope that it will be useful, ++ but WITHOUT ANY WARRANTY; without even the implied warranty of ++ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++ GNU General Public License for more details. ++ ++ You should have received a copy of the GNU General Public License ++ along with luci-pbx. If not, see . ++]]-- ++ ++modulename = "pbx" ++ ++ ++if nixio.fs.access("/etc/init.d/asterisk") then ++ server = "asterisk" ++elseif nixio.fs.access("/etc/init.d/freeswitch") then ++ server = "freeswitch" ++else ++ server = "" ++end ++ ++ ++-- Returns formatted output of string containing only the words at the indices ++-- specified in the table "indices". ++function format_indices(string, indices) ++ if indices == nil then ++ return "Error: No indices to format specified.\n" ++ end ++ ++ -- Split input into separate lines. ++ lines = luci.util.split(luci.util.trim(string), "\n") ++ ++ -- Split lines into separate words. ++ splitlines = {} ++ for lpos,line in ipairs(lines) do ++ splitlines[lpos] = luci.util.split(luci.util.trim(line), "%s+", nil, true) ++ end ++ ++ -- For each split line, if the word at all indices specified ++ -- to be formatted are not null, add the formatted line to the ++ -- gathered output. ++ output = "" ++ for lpos,splitline in ipairs(splitlines) do ++ loutput = "" ++ for ipos,index in ipairs(indices) do ++ if splitline[index] ~= nil then ++ loutput = loutput .. string.format("%-40s", splitline[index]) ++ else ++ loutput = nil ++ break ++ end ++ end ++ ++ if loutput ~= nil then ++ output = output .. loutput .. "\n" ++ end ++ end ++ return output ++end ++ ++ ++m = Map (modulename, translate("PBX Main Page"), ++ translate("This configuration page allows you to configure a phone system (PBX) service which \ ++ permits making phone calls through multiple Google and SIP (like Sipgate, \ ++ SipSorcery, and Betamax) accounts and sharing them among many SIP devices. \ ++ Note that Google accounts, SIP accounts, and local user accounts are configured in the \ ++ \"Google Accounts\", \"SIP Accounts\", and \"User Accounts\" sub-sections. \ ++ You must add at least one User Account to this PBX, and then configure a SIP device or \ ++ softphone to use the account, in order to make and receive calls with your Google/SIP \ ++ accounts. Configuring multiple users will allow you to make free calls between all users, \ ++ and share the configured Google and SIP accounts. If you have more than one Google and SIP \ ++ accounts set up, you should probably configure how calls to and from them are routed in \ ++ the \"Call Routing\" page. If you're interested in using your own PBX from anywhere in the \ ++ world, then visit the \"Remote Usage\" section in the \"Advanced Settings\" page.")) ++ ++----------------------------------------------------------------------------------------- ++s = m:section(NamedSection, "connection_status", "main", ++ translate("PBX Service Status")) ++s.anonymous = true ++ ++s:option (DummyValue, "status", translate("Service Status")) ++ ++sts = s:option(DummyValue, "_sts") ++sts.template = "cbi/tvalue" ++sts.rows = 20 ++ ++function sts.cfgvalue(self, section) ++ ++ if server == "asterisk" then ++ regs = luci.sys.exec("asterisk -rx 'sip show registry' | sed 's/peer-//'") ++ jabs = luci.sys.exec("asterisk -rx 'jabber show connections' | grep onnected") ++ usrs = luci.sys.exec("asterisk -rx 'sip show users'") ++ chan = luci.sys.exec("asterisk -rx 'core show channels'") ++ ++ return format_indices(regs, {1, 5}) .. ++ format_indices(jabs, {2, 4}) .. "\n" .. ++ format_indices(usrs, {1} ) .. "\n" .. chan ++ ++ elseif server == "freeswitch" then ++ return "Freeswitch is not supported yet.\n" ++ else ++ return "Neither Asterisk nor FreeSwitch discovered, please install Asterisk, as Freeswitch is not supported yet.\n" ++ end ++end ++ ++return m +diff --git a/feeds/luci/applications/luci-app-pbx/po/ca/pbx.po b/feeds/luci/applications/luci-app-pbx/po/ca/pbx.po +new file mode 100644 +index 0000000..c8a0a99 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-pbx/po/ca/pbx.po +@@ -0,0 +1,509 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"PO-Revision-Date: 2014-07-01 05:14+0200\n" ++"Last-Translator: Alex \n" ++"Language-Team: none\n" ++"Language: ca\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n != 1);\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "Advanced Settings" ++msgstr "Ajusts avançats" ++ ++msgid "Available" ++msgstr "Disponible" ++ ++msgid "" ++"Avoid using anything but alpha-numeric characters, space, comma, and period." ++msgstr "" ++"Eviteu utilitzar res excepte caràcters alfanumèrics, espai, coma, i punt." ++ ++msgid "Away" ++msgstr "Fora" ++ ++msgid "Blacklisted Numbers" ++msgstr "Nombres prohibits" ++ ++msgid "Call Routing" ++msgstr "Encaminament de trucades" ++ ++msgid "Call-back Numbers" ++msgstr "Nombres de trucada de tornada" ++ ++msgid "Call-back Provider" ++msgstr "Proveïdor de trucada de tornada" ++ ++msgid "Call-through Numbers" ++msgstr "" ++ ++msgid "Copy-paste large lists of numbers here." ++msgstr "Copieu i enganxeu llistes grans de nombres aquí." ++ ++msgid "" ++"Designate numbers that are allowed to call through this system and which " ++"user's privileges they will have." ++msgstr "" ++"Designeu els nombres que es permeten trucar a través d'aquest sistema i els " ++"privilegis de qual usuari tindran." ++ ++msgid "" ++"Designate numbers to whom the system will hang up and call back, which " ++"provider will be used to call them, and which user's privileges will be " ++"granted to them." ++msgstr "" ++"Designeu els nombres als quals el sistema penjarà i trucarà de tornada, qual " ++"proveïdor s'emprarà per a trucar-los, i els privilegis de qual usuari se " ++"lis concedirà." ++ ++msgid "Dials numbers unmatched elsewhere" ++msgstr "Truca els nombres que no coincideixen d'altra manera" ++ ++msgid "Do Not Disturb" ++msgstr "No molestis" ++ ++msgid "Domain/IP Address/Dynamic Domain" ++msgstr "" ++ ++msgid "Dynamic List of Blacklisted Numbers" ++msgstr "" ++ ++msgid "Email" ++msgstr "" ++ ++msgid "Enable Incoming Calls (Register via SIP)" ++msgstr "Habilita trucades entrants (registreu via SIP)" ++ ++msgid "Enable Incoming Calls (set Status below)" ++msgstr "Habilita trucades entrants (establiu l'Estat a baix)" ++ ++msgid "Enable Outgoing Calls" ++msgstr "Habilita trucades sortints" ++ ++msgid "Enabled" ++msgstr "Habilitat" ++ ++msgid "" ++"Enter a VoIP provider to use for call-back in the format username@some.host." ++"name, as listed in \"Outgoing Calls\" above. It's easiest to copy and paste " ++"the providers from above. Invalid entries, including providers not enabled " ++"for outgoing calls, will be rejected silently." ++msgstr "" ++ ++msgid "" ++"Enter phone numbers that you want to decline calls from automatically. You " ++"should probably omit the country code and any leading zeroes, but please " ++"experiment to make sure you are blocking numbers from your desired area " ++"successfully." ++msgstr "" ++ ++msgid "" ++"Enter this IP (or IP:port) in the Server/Registrar setting of SIP devices " ++"you will use ONLY locally and never from a remote location." ++msgstr "" ++ ++msgid "" ++"Enter this hostname (or hostname:port) in the Server/Registrar setting of " ++"SIP devices you will use from a remote location (they will work locally too)." ++msgstr "" ++ ++msgid "External SIP Port" ++msgstr "Port SIP extern" ++ ++msgid "" ++"For each provider enabled for incoming calls, here you can restrict which " ++"users to ring on incoming calls. If the list is empty, the system will " ++"indicate that all users enabled for incoming calls will ring. Invalid " ++"usernames will be rejected silently. Also, entering a username here " ++"overrides the user's setting to not receive incoming calls. This way, you " ++"can make certain users ring only for specific providers. Entries can be made " ++"in a space-separated list, and/or one per line by hitting enter after every " ++"one." ++msgstr "" ++ ++msgid "" ++"For each user enabled for outgoing calls you can restrict what providers the " ++"user can use for outgoing calls. By default all users can use all providers. " ++"To show up in the list below the user should be allowed to make outgoing " ++"calls in the \"User Accounts\" page. Enter VoIP providers in the format " ++"username@some.host.name, as listed in \"Outgoing Calls\" above. It's easiest " ++"to copy and paste the providers from above. Invalid entries, including " ++"providers not enabled for outgoing calls, will be rejected silently. Entries " ++"can be made in a space-separated list, and/or one per line by hitting enter " ++"after every one." ++msgstr "" ++ ++msgid "Full Name" ++msgstr "Nom complet" ++ ++msgid "General Settings" ++msgstr "Ajusts generals" ++ ++msgid "Google Accounts" ++msgstr "Comptes de Google" ++ ++msgid "Google Talk Status" ++msgstr "" ++ ++msgid "Google Talk Status Message" ++msgstr "" ++ ++msgid "Google Voice/Talk Accounts" ++msgstr "" ++ ++msgid "Hang-up Delay" ++msgstr "Retard de penja" ++ ++msgid "" ++"Here you must configure at least one SIP account, that you will use to " ++"register with this service. Use this account either in an Analog Telephony " ++"Adapter (ATA), or in a SIP software like CSipSimple, Linphone, or Sipdroid " ++"on your smartphone, or Ekiga, Linphone, or X-Lite on your computer. By " ++"default, all SIP accounts will ring simultaneously if a call is made to one " ++"of your VoIP provider accounts or GV numbers." ++msgstr "" ++ ++msgid "" ++"How long to wait before hanging up. If the provider you use to dial " ++"automatically forwards to voicemail, you can set this value to a delay that " ++"will allow you to hang up before your call gets forwarded and you get billed " ++"for it." ++msgstr "" ++"Quant temps per a esperar abans de penjar. Si el proveïdor que empreu per a " ++"trucar automàticament redirigeix al correu de veu, podeu estableix aquest " ++"valor a un retard que us permet penjar abans que la teva trucada es " ++"redirigeixi i s'us cobri per ella." ++ ++msgid "" ++"If setting Server/Registrar to %s or %s does not work for you, try setting " ++"it to %s or %s and entering this port number in a separate field that " ++"specifies the Server/Registrar port number. Beware that some devices have a " ++"confusing setting that sets the port where SIP requests originate from on " ++"the SIP device itself (the bind port). The port specified on this page is " ++"NOT this bind port but the port this service listens on." ++msgstr "" ++ ++msgid "" ++"If you experience jittery or high latency audio during heavy downloads, you " ++"may want to enable QoS. QoS prioritizes traffic to and from your network for " ++"specified ports and IP addresses, resulting in better latency and throughput " ++"for sound in our case. If enabled below, a QoS rule for this service will be " ++"configured by the PBX automatically, but you must visit the QoS " ++"configuration page (Network->QoS) to configure other critical QoS settings " ++"like Download and Upload speed." ++msgstr "" ++ ++msgid "" ++"If you have more than one account that can make outgoing calls, you should " ++"enter a list of phone numbers and/or prefixes in the following fields for " ++"each provider listed. Invalid prefixes are removed silently, and only 0-9, " ++"X, Z, N, #, *, and + are valid characters. The letter X matches 0-9, Z " ++"matches 1-9, and N matches 2-9. For example to make calls to Germany through " ++"a provider, you can enter 49. To make calls to North America, you can enter " ++"1NXXNXXXXXX. If one of your providers can make \"local\" calls to an area " ++"code like New York's 646, you can enter 646NXXXXXX for that provider. You " ++"should leave one account with an empty list to make calls with it by " ++"default, if no other provider's prefixes match. The system will " ++"automatically replace an empty list with a message that the provider dials " ++"all numbers not matched by another provider's prefixes. Be as specific as " ++"possible (i.e. 1NXXNXXXXXX is better than 1). Please note all international " ++"dial codes are discarded (e.g. 00, 011, 010, 0011). Entries can be made in a " ++"space-separated list, and/or one per line by hitting enter after every one." ++msgstr "" ++ ++msgid "Incoming Calls" ++msgstr "Trucades entrants" ++ ++msgid "Insert QoS Rules" ++msgstr "Insereix regles QoS" ++ ++msgid "Makes Outgoing Calls" ++msgstr "Fa trucades sortints" ++ ++msgid "NOTE: There are no Google or SIP provider accounts configured." ++msgstr "NOTA: No hi ha cap compte configurat ni del Google ni de proveïdor SIP." ++ ++msgid "" ++"NOTE: There are no Google or SIP provider accounts enabled for incoming " ++"calls." ++msgstr "" ++"NOTA: No hi ha cap compte habilitat ni del Google ni de proveïdor SIP per " ++"als trucades entrants." ++ ++msgid "" ++"NOTE: There are no Google or SIP provider accounts enabled for outgoing " ++"calls." ++msgstr "" ++"NOTA: No hi ha cap compte habilitat ni del Google ni de proveïdor SIP per " ++"als trucades sortints." ++ ++msgid "NOTE: There are no local user accounts configured." ++msgstr "NOTA: No hi ha cap compte d'usuari local configurat." ++ ++msgid "NOTE: There are no local user accounts enabled for outgoing calls." ++msgstr "" ++"NOTA: No hi ha cap compte d'usuari local habilitat per als trucades " ++"sortints." ++ ++msgid "No" ++msgstr "No" ++ ++msgid "Number of Seconds to Ring" ++msgstr "Nombre de segons a sonar" ++ ++msgid "Outbound Proxy" ++msgstr "Servidor intermediari de sortida" ++ ++msgid "Outgoing Calls" ++msgstr "Trucades sortints" ++ ++msgid "PBX Main Page" ++msgstr "Pàgina principal PBX" ++ ++msgid "PBX Service Status" ++msgstr "Estat del servei PBX" ++ ++msgid "PIN" ++msgstr "PIN" ++ ++msgid "Password" ++msgstr "Contrasenya" ++ ++msgid "" ++"Pick a random port number between 6500 and 9500 for the service to listen " ++"on. Do not pick the standard 5060, because it is often subject to brute-" ++"force attacks. When finished, (1) click \"Save and Apply\", and (2) look in " ++"the \"SIP Device/Softphone Accounts\" section for updated Server and Port " ++"settings for your SIP Devices/Softphones." ++msgstr "" ++ ++msgid "Port Setting for SIP Devices" ++msgstr "Ajust de port per als dispositius SIP" ++ ++msgid "Providers Used for Outgoing Calls" ++msgstr "Proveïdors utilitzats per als trucades sortints" ++ ++msgid "QoS Settings" ++msgstr "Ajusts QoS" ++ ++msgid "RTP Port Range End" ++msgstr "" ++ ++msgid "RTP Port Range Start" ++msgstr "" ++ ++msgid "" ++"RTP traffic carries actual voice packets. This is the start of the port " ++"range that will be used for setting up RTP communication. It's usually OK to " ++"leave this at the default value." ++msgstr "" ++ ++msgid "Receives Incoming Calls" ++msgstr "Rep trucades entrants" ++ ++msgid "Remote Usage" ++msgstr "Ús remot" ++ ++msgid "Rings users enabled for incoming calls" ++msgstr "Truca als usuaris habilitats per a rebre trucades" ++ ++msgid "SIP Accounts" ++msgstr "Comptes SIP" ++ ++msgid "SIP Device/Softphone Accounts" ++msgstr "" ++ ++msgid "SIP Provider Accounts" ++msgstr "Comptes de proveïdor SIP" ++ ++msgid "SIP Realm (needed by some providers)" ++msgstr "Regne SIP (necessitat per alguns proveïdors)" ++ ++msgid "SIP Server/Registrar" ++msgstr "Servidor/Registrador SIP" ++ ++msgid "SIP Server/Registrar Port" ++msgstr "Port del Servidor/Registrador SIP" ++ ++msgid "Server Setting" ++msgstr "Ajust de servidor" ++ ++msgid "Server Setting for Local SIP Devices" ++msgstr "Ajust de servidor pels dispositius SIP locals" ++ ++msgid "Server Setting for Remote SIP Devices" ++msgstr "Ajust de servidor pels dispositius SIP remots" ++ ++msgid "Service Status" ++msgstr "Estat de servei" ++ ++msgid "" ++"Set the number of seconds to ring users upon incoming calls before hanging " ++"up or going to voicemail, if the voicemail is installed and enabled." ++msgstr "" ++"Estableix el nombre de segons per a sonar als usuaris abans de penjar o anar " ++"al correu de veu, si el correu de veu està instal·lat i habilitat." ++ ++msgid "Space-Separated List of Blacklisted Numbers" ++msgstr "Llista de nombres prohibits separats per espai" ++ ++msgid "Specify numbers individually here. Press enter to add more numbers." ++msgstr "" ++"Especifiqueu els nombres individualment aquí. Premeu Enter per afegir més " ++"nombres." ++ ++msgid "" ++"Specify numbers individually here. Press enter to add more numbers. You will " ++"have to experiment with what country and area codes you need to add to the " ++"number." ++msgstr "" ++ ++msgid "" ++"The number(s) specified above will be able to dial out with this user's " ++"providers. Invalid usernames, including users not enabled for outgoing " ++"calls, are dropped silently. Please verify that the entry was accepted." ++msgstr "" ++ ++msgid "" ++"This configuration page allows you to configure a phone system (PBX) service " ++"which permits making phone calls through multiple Google and SIP (like " ++"Sipgate, SipSorcery, and Betamax) accounts and sharing them among many SIP " ++"devices. Note that Google accounts, SIP accounts, and local user accounts " ++"are configured in the \"Google Accounts\", \"SIP Accounts\", and \"User " ++"Accounts\" sub-sections. You must add at least one User Account to this PBX, " ++"and then configure a SIP device or softphone to use the account, in order to " ++"make and receive calls with your Google/SIP accounts. Configuring multiple " ++"users will allow you to make free calls between all users, and share the " ++"configured Google and SIP accounts. If you have more than one Google and SIP " ++"accounts set up, you should probably configure how calls to and from them " ++"are routed in the \"Call Routing\" page. If you're interested in using your " ++"own PBX from anywhere in the world, then visit the \"Remote Usage\" section " ++"in the \"Advanced Settings\" page." ++msgstr "" ++ ++msgid "" ++"This is the name that the VoIP server will use to identify itself when " ++"registering to VoIP (SIP) providers. Some providers require this to a " ++"specific string matching a hardware SIP device." ++msgstr "" ++ ++msgid "" ++"This is where you indicate which Google/SIP accounts are used to call what " ++"country/area codes, which users can use what SIP/Google accounts, how " ++"incoming calls are routed, what numbers can get into this PBX with a " ++"password, and what numbers are blacklisted." ++msgstr "" ++ ++msgid "" ++"This is where you set up your Google (Talk and Voice) Accounts, in order to " ++"start using them for dialing and receiving calls (voice chat and real phone " ++"calls). Please make at least one voice call using the Google Talk plugin " ++"installable through the GMail interface, and then log out from your account " ++"everywhere. Click \"Add\" to add as many accounts as you wish." ++msgstr "" ++ ++msgid "" ++"This is where you set up your SIP (VoIP) accounts ts like Sipgate, " ++"SipSorcery, the popular Betamax providers, and any other providers with SIP " ++"settings in order to start using them for dialing and receiving calls (SIP " ++"uri and real phone calls). Click \"Add\" to add as many accounts as you wish." ++msgstr "" ++ ++msgid "" ++"This option should be set to \"Yes\" if you have a DID (real telephone " ++"number) associated with this SIP account or want to receive SIP uri calls " ++"through this provider." ++msgstr "" ++ ++msgid "" ++"This section contains settings that do not need to be changed under normal " ++"circumstances. In addition, here you can configure your system for use with " ++"remote SIP devices, and resolve call quality issues by enabling the " ++"insertion of QoS rules." ++msgstr "" ++ ++msgid "" ++"Use (four to five digit) numeric user name if you are connecting normal " ++"telephones with ATAs to this system (so they can dial user names)." ++msgstr "" ++ ++msgid "" ++"Use this account to make outgoing calls as configured in the \"Call Routing" ++"\" section." ++msgstr "" ++"Utilitza aquest compte per fer trucades sortints com configurat en la secció " ++"\"Encaminament de trucades\"." ++ ++msgid "Use this account to make outgoing calls." ++msgstr "Utilitza aquest compte per fer trucades sortints." ++ ++msgid "User Accounts" ++msgstr "Comptes d'usuari" ++ ++msgid "User Agent String" ++msgstr "" ++ ++msgid "User Name" ++msgstr "Nom d'usuari" ++ ++msgid "Uses providers enabled for outgoing calls" ++msgstr "" ++ ++msgid "" ++"When somebody starts voice chat with your GTalk account or calls the GVoice, " ++"number (if you have Google Voice), the call will be forwarded to any users " ++"that are online (registered using a SIP device or softphone) and permitted " ++"to receive the call. If you have Google Voice, you must go to your GVoice " ++"settings and forward calls to Google chat in order to actually receive calls " ++"made to your GVoice number. If you have trouble receiving calls from GVoice, " ++"experiment with the Call Screening option in your GVoice Settings. Finally, " ++"make sure no other client is online with this account (browser in gmail, " ++"mobile/desktop Google Talk App) as it may interfere." ++msgstr "" ++ ++msgid "" ++"When your password is saved, it disappears from this field and is not " ++"displayed for your protection. The previously saved password will be changed " ++"only when you enter a value different from the saved one." ++msgstr "" ++ ++msgid "Yes" ++msgstr "Sí" ++ ++msgid "" ++"You can enter your domain name, external IP address, or dynamic domain name " ++"here. The best thing to input is a static IP address. If your IP address is " ++"dynamic and it changes, your configuration will become invalid. Hence, it's " ++"recommended to set up Dynamic DNS in this case. and enter your Dynamic DNS " ++"hostname here. You can configure Dynamic DNS with the luci-app-ddns package." ++msgstr "" ++ ++msgid "You can specify a real name to show up in the Caller ID here." ++msgstr "" ++ ++msgid "" ++"You can use your SIP devices/softphones with this system from a remote " ++"location as well, as long as your Internet Service Provider gives you a " ++"public IP. You will be able to call other local users for free (e.g. other " ++"Analog Telephone Adapters (ATAs)) and use your VoIP providers to make calls " ++"as if you were local to the PBX. After configuring this tab, go back to " ++"where users are configured and see the new Server and Port setting you need " ++"to configure the remote SIP devices with. Please note that if this PBX is " ++"not running on your router/gateway, you will need to configure port " ++"forwarding (NAT) on your router/gateway. Please forward the ports below (SIP " ++"port and RTP range) to the IP address of the device running this PBX." ++msgstr "" ++ ++msgid "" ++"Your PIN disappears when saved for your protection. It will be changed only " ++"when you enter a value different from the saved one. Leaving the PIN empty " ++"is possible, but please beware of the security implications." ++msgstr "" ++ ++msgid "" ++"Your password disappears when saved for your protection. It will be changed " ++"only when you enter a value different from the saved one." ++msgstr "" +diff --git a/feeds/luci/applications/luci-app-pbx/po/cs/pbx.po b/feeds/luci/applications/luci-app-pbx/po/cs/pbx.po +new file mode 100644 +index 0000000..8b69ef1 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-pbx/po/cs/pbx.po +@@ -0,0 +1,487 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"PO-Revision-Date: 2014-07-12 20:19+0200\n" ++"Last-Translator: koli \n" ++"Language-Team: none\n" ++"Language: cs\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "Advanced Settings" ++msgstr "PokroÄilé nastavení" ++ ++msgid "Available" ++msgstr "Dostupné" ++ ++msgid "" ++"Avoid using anything but alpha-numeric characters, space, comma, and period." ++msgstr "" ++ ++msgid "Away" ++msgstr "PryÄ" ++ ++msgid "Blacklisted Numbers" ++msgstr "" ++ ++msgid "Call Routing" ++msgstr "" ++ ++msgid "Call-back Numbers" ++msgstr "" ++ ++msgid "Call-back Provider" ++msgstr "" ++ ++msgid "Call-through Numbers" ++msgstr "" ++ ++msgid "Copy-paste large lists of numbers here." ++msgstr "" ++ ++msgid "" ++"Designate numbers that are allowed to call through this system and which " ++"user's privileges they will have." ++msgstr "" ++ ++msgid "" ++"Designate numbers to whom the system will hang up and call back, which " ++"provider will be used to call them, and which user's privileges will be " ++"granted to them." ++msgstr "" ++ ++msgid "Dials numbers unmatched elsewhere" ++msgstr "" ++ ++msgid "Do Not Disturb" ++msgstr "NevyruÅ¡ovat" ++ ++msgid "Domain/IP Address/Dynamic Domain" ++msgstr "" ++ ++msgid "Dynamic List of Blacklisted Numbers" ++msgstr "" ++ ++msgid "Email" ++msgstr "Email" ++ ++msgid "Enable Incoming Calls (Register via SIP)" ++msgstr "Povolit příchozí hovory (Registrace pÅ™es SIP)" ++ ++msgid "Enable Incoming Calls (set Status below)" ++msgstr "" ++ ++msgid "Enable Outgoing Calls" ++msgstr "Povolit odchozí hovory" ++ ++msgid "Enabled" ++msgstr "Povoleno" ++ ++msgid "" ++"Enter a VoIP provider to use for call-back in the format username@some.host." ++"name, as listed in \"Outgoing Calls\" above. It's easiest to copy and paste " ++"the providers from above. Invalid entries, including providers not enabled " ++"for outgoing calls, will be rejected silently." ++msgstr "" ++ ++msgid "" ++"Enter phone numbers that you want to decline calls from automatically. You " ++"should probably omit the country code and any leading zeroes, but please " ++"experiment to make sure you are blocking numbers from your desired area " ++"successfully." ++msgstr "" ++ ++msgid "" ++"Enter this IP (or IP:port) in the Server/Registrar setting of SIP devices " ++"you will use ONLY locally and never from a remote location." ++msgstr "" ++ ++msgid "" ++"Enter this hostname (or hostname:port) in the Server/Registrar setting of " ++"SIP devices you will use from a remote location (they will work locally too)." ++msgstr "" ++ ++msgid "External SIP Port" ++msgstr "Externí SIP port" ++ ++msgid "" ++"For each provider enabled for incoming calls, here you can restrict which " ++"users to ring on incoming calls. If the list is empty, the system will " ++"indicate that all users enabled for incoming calls will ring. Invalid " ++"usernames will be rejected silently. Also, entering a username here " ++"overrides the user's setting to not receive incoming calls. This way, you " ++"can make certain users ring only for specific providers. Entries can be made " ++"in a space-separated list, and/or one per line by hitting enter after every " ++"one." ++msgstr "" ++ ++msgid "" ++"For each user enabled for outgoing calls you can restrict what providers the " ++"user can use for outgoing calls. By default all users can use all providers. " ++"To show up in the list below the user should be allowed to make outgoing " ++"calls in the \"User Accounts\" page. Enter VoIP providers in the format " ++"username@some.host.name, as listed in \"Outgoing Calls\" above. It's easiest " ++"to copy and paste the providers from above. Invalid entries, including " ++"providers not enabled for outgoing calls, will be rejected silently. Entries " ++"can be made in a space-separated list, and/or one per line by hitting enter " ++"after every one." ++msgstr "" ++ ++msgid "Full Name" ++msgstr "Celé jméno (jméno a příjmení)" ++ ++msgid "General Settings" ++msgstr "Obecné nastavení" ++ ++msgid "Google Accounts" ++msgstr "Google úÄty" ++ ++msgid "Google Talk Status" ++msgstr "Stav Google Talk" ++ ++msgid "Google Talk Status Message" ++msgstr "" ++ ++msgid "Google Voice/Talk Accounts" ++msgstr "Google Voice/Talk úÄty" ++ ++msgid "Hang-up Delay" ++msgstr "" ++ ++msgid "" ++"Here you must configure at least one SIP account, that you will use to " ++"register with this service. Use this account either in an Analog Telephony " ++"Adapter (ATA), or in a SIP software like CSipSimple, Linphone, or Sipdroid " ++"on your smartphone, or Ekiga, Linphone, or X-Lite on your computer. By " ++"default, all SIP accounts will ring simultaneously if a call is made to one " ++"of your VoIP provider accounts or GV numbers." ++msgstr "" ++ ++msgid "" ++"How long to wait before hanging up. If the provider you use to dial " ++"automatically forwards to voicemail, you can set this value to a delay that " ++"will allow you to hang up before your call gets forwarded and you get billed " ++"for it." ++msgstr "" ++ ++msgid "" ++"If setting Server/Registrar to %s or %s does not work for you, try setting " ++"it to %s or %s and entering this port number in a separate field that " ++"specifies the Server/Registrar port number. Beware that some devices have a " ++"confusing setting that sets the port where SIP requests originate from on " ++"the SIP device itself (the bind port). The port specified on this page is " ++"NOT this bind port but the port this service listens on." ++msgstr "" ++ ++msgid "" ++"If you experience jittery or high latency audio during heavy downloads, you " ++"may want to enable QoS. QoS prioritizes traffic to and from your network for " ++"specified ports and IP addresses, resulting in better latency and throughput " ++"for sound in our case. If enabled below, a QoS rule for this service will be " ++"configured by the PBX automatically, but you must visit the QoS " ++"configuration page (Network->QoS) to configure other critical QoS settings " ++"like Download and Upload speed." ++msgstr "" ++ ++msgid "" ++"If you have more than one account that can make outgoing calls, you should " ++"enter a list of phone numbers and/or prefixes in the following fields for " ++"each provider listed. Invalid prefixes are removed silently, and only 0-9, " ++"X, Z, N, #, *, and + are valid characters. The letter X matches 0-9, Z " ++"matches 1-9, and N matches 2-9. For example to make calls to Germany through " ++"a provider, you can enter 49. To make calls to North America, you can enter " ++"1NXXNXXXXXX. If one of your providers can make \"local\" calls to an area " ++"code like New York's 646, you can enter 646NXXXXXX for that provider. You " ++"should leave one account with an empty list to make calls with it by " ++"default, if no other provider's prefixes match. The system will " ++"automatically replace an empty list with a message that the provider dials " ++"all numbers not matched by another provider's prefixes. Be as specific as " ++"possible (i.e. 1NXXNXXXXXX is better than 1). Please note all international " ++"dial codes are discarded (e.g. 00, 011, 010, 0011). Entries can be made in a " ++"space-separated list, and/or one per line by hitting enter after every one." ++msgstr "" ++ ++msgid "Incoming Calls" ++msgstr "Příchozí volání" ++ ++msgid "Insert QoS Rules" ++msgstr "Vložte QoS pravidla" ++ ++msgid "Makes Outgoing Calls" ++msgstr "" ++ ++msgid "NOTE: There are no Google or SIP provider accounts configured." ++msgstr "" ++ ++msgid "" ++"NOTE: There are no Google or SIP provider accounts enabled for incoming " ++"calls." ++msgstr "" ++ ++msgid "" ++"NOTE: There are no Google or SIP provider accounts enabled for outgoing " ++"calls." ++msgstr "" ++ ++msgid "NOTE: There are no local user accounts configured." ++msgstr "" ++ ++msgid "NOTE: There are no local user accounts enabled for outgoing calls." ++msgstr "" ++ ++msgid "No" ++msgstr "Ne" ++ ++msgid "Number of Seconds to Ring" ++msgstr "" ++ ++msgid "Outbound Proxy" ++msgstr "" ++ ++msgid "Outgoing Calls" ++msgstr "Odchozí volání" ++ ++msgid "PBX Main Page" ++msgstr "Hlavní stránka PBX" ++ ++msgid "PBX Service Status" ++msgstr "Stav PBX služby" ++ ++msgid "PIN" ++msgstr "PIN" ++ ++msgid "Password" ++msgstr "Heslo" ++ ++msgid "" ++"Pick a random port number between 6500 and 9500 for the service to listen " ++"on. Do not pick the standard 5060, because it is often subject to brute-" ++"force attacks. When finished, (1) click \"Save and Apply\", and (2) look in " ++"the \"SIP Device/Softphone Accounts\" section for updated Server and Port " ++"settings for your SIP Devices/Softphones." ++msgstr "" ++ ++msgid "Port Setting for SIP Devices" ++msgstr "" ++ ++msgid "Providers Used for Outgoing Calls" ++msgstr "" ++ ++msgid "QoS Settings" ++msgstr "Nastavení QoS" ++ ++msgid "RTP Port Range End" ++msgstr "" ++ ++msgid "RTP Port Range Start" ++msgstr "" ++ ++msgid "" ++"RTP traffic carries actual voice packets. This is the start of the port " ++"range that will be used for setting up RTP communication. It's usually OK to " ++"leave this at the default value." ++msgstr "" ++ ++msgid "Receives Incoming Calls" ++msgstr "" ++ ++msgid "Remote Usage" ++msgstr "" ++ ++msgid "Rings users enabled for incoming calls" ++msgstr "" ++ ++msgid "SIP Accounts" ++msgstr "SIP úÄty" ++ ++msgid "SIP Device/Softphone Accounts" ++msgstr "" ++ ++msgid "SIP Provider Accounts" ++msgstr "" ++ ++msgid "SIP Realm (needed by some providers)" ++msgstr "" ++ ++msgid "SIP Server/Registrar" ++msgstr "" ++ ++msgid "SIP Server/Registrar Port" ++msgstr "" ++ ++msgid "Server Setting" ++msgstr "" ++ ++msgid "Server Setting for Local SIP Devices" ++msgstr "" ++ ++msgid "Server Setting for Remote SIP Devices" ++msgstr "" ++ ++msgid "Service Status" ++msgstr "Stav služby" ++ ++msgid "" ++"Set the number of seconds to ring users upon incoming calls before hanging " ++"up or going to voicemail, if the voicemail is installed and enabled." ++msgstr "" ++ ++msgid "Space-Separated List of Blacklisted Numbers" ++msgstr "" ++ ++msgid "Specify numbers individually here. Press enter to add more numbers." ++msgstr "" ++ ++msgid "" ++"Specify numbers individually here. Press enter to add more numbers. You will " ++"have to experiment with what country and area codes you need to add to the " ++"number." ++msgstr "" ++ ++msgid "" ++"The number(s) specified above will be able to dial out with this user's " ++"providers. Invalid usernames, including users not enabled for outgoing " ++"calls, are dropped silently. Please verify that the entry was accepted." ++msgstr "" ++ ++msgid "" ++"This configuration page allows you to configure a phone system (PBX) service " ++"which permits making phone calls through multiple Google and SIP (like " ++"Sipgate, SipSorcery, and Betamax) accounts and sharing them among many SIP " ++"devices. Note that Google accounts, SIP accounts, and local user accounts " ++"are configured in the \"Google Accounts\", \"SIP Accounts\", and \"User " ++"Accounts\" sub-sections. You must add at least one User Account to this PBX, " ++"and then configure a SIP device or softphone to use the account, in order to " ++"make and receive calls with your Google/SIP accounts. Configuring multiple " ++"users will allow you to make free calls between all users, and share the " ++"configured Google and SIP accounts. If you have more than one Google and SIP " ++"accounts set up, you should probably configure how calls to and from them " ++"are routed in the \"Call Routing\" page. If you're interested in using your " ++"own PBX from anywhere in the world, then visit the \"Remote Usage\" section " ++"in the \"Advanced Settings\" page." ++msgstr "" ++ ++msgid "" ++"This is the name that the VoIP server will use to identify itself when " ++"registering to VoIP (SIP) providers. Some providers require this to a " ++"specific string matching a hardware SIP device." ++msgstr "" ++ ++msgid "" ++"This is where you indicate which Google/SIP accounts are used to call what " ++"country/area codes, which users can use what SIP/Google accounts, how " ++"incoming calls are routed, what numbers can get into this PBX with a " ++"password, and what numbers are blacklisted." ++msgstr "" ++ ++msgid "" ++"This is where you set up your Google (Talk and Voice) Accounts, in order to " ++"start using them for dialing and receiving calls (voice chat and real phone " ++"calls). Please make at least one voice call using the Google Talk plugin " ++"installable through the GMail interface, and then log out from your account " ++"everywhere. Click \"Add\" to add as many accounts as you wish." ++msgstr "" ++ ++msgid "" ++"This is where you set up your SIP (VoIP) accounts ts like Sipgate, " ++"SipSorcery, the popular Betamax providers, and any other providers with SIP " ++"settings in order to start using them for dialing and receiving calls (SIP " ++"uri and real phone calls). Click \"Add\" to add as many accounts as you wish." ++msgstr "" ++ ++msgid "" ++"This option should be set to \"Yes\" if you have a DID (real telephone " ++"number) associated with this SIP account or want to receive SIP uri calls " ++"through this provider." ++msgstr "" ++ ++msgid "" ++"This section contains settings that do not need to be changed under normal " ++"circumstances. In addition, here you can configure your system for use with " ++"remote SIP devices, and resolve call quality issues by enabling the " ++"insertion of QoS rules." ++msgstr "" ++ ++msgid "" ++"Use (four to five digit) numeric user name if you are connecting normal " ++"telephones with ATAs to this system (so they can dial user names)." ++msgstr "" ++ ++msgid "" ++"Use this account to make outgoing calls as configured in the \"Call Routing" ++"\" section." ++msgstr "" ++ ++msgid "Use this account to make outgoing calls." ++msgstr "" ++ ++msgid "User Accounts" ++msgstr "Uživatelské úÄty" ++ ++msgid "User Agent String" ++msgstr "" ++ ++msgid "User Name" ++msgstr "Uživatelské jméno" ++ ++msgid "Uses providers enabled for outgoing calls" ++msgstr "" ++ ++msgid "" ++"When somebody starts voice chat with your GTalk account or calls the GVoice, " ++"number (if you have Google Voice), the call will be forwarded to any users " ++"that are online (registered using a SIP device or softphone) and permitted " ++"to receive the call. If you have Google Voice, you must go to your GVoice " ++"settings and forward calls to Google chat in order to actually receive calls " ++"made to your GVoice number. If you have trouble receiving calls from GVoice, " ++"experiment with the Call Screening option in your GVoice Settings. Finally, " ++"make sure no other client is online with this account (browser in gmail, " ++"mobile/desktop Google Talk App) as it may interfere." ++msgstr "" ++ ++msgid "" ++"When your password is saved, it disappears from this field and is not " ++"displayed for your protection. The previously saved password will be changed " ++"only when you enter a value different from the saved one." ++msgstr "" ++ ++msgid "Yes" ++msgstr "Ano" ++ ++msgid "" ++"You can enter your domain name, external IP address, or dynamic domain name " ++"here. The best thing to input is a static IP address. If your IP address is " ++"dynamic and it changes, your configuration will become invalid. Hence, it's " ++"recommended to set up Dynamic DNS in this case. and enter your Dynamic DNS " ++"hostname here. You can configure Dynamic DNS with the luci-app-ddns package." ++msgstr "" ++ ++msgid "You can specify a real name to show up in the Caller ID here." ++msgstr "" ++ ++msgid "" ++"You can use your SIP devices/softphones with this system from a remote " ++"location as well, as long as your Internet Service Provider gives you a " ++"public IP. You will be able to call other local users for free (e.g. other " ++"Analog Telephone Adapters (ATAs)) and use your VoIP providers to make calls " ++"as if you were local to the PBX. After configuring this tab, go back to " ++"where users are configured and see the new Server and Port setting you need " ++"to configure the remote SIP devices with. Please note that if this PBX is " ++"not running on your router/gateway, you will need to configure port " ++"forwarding (NAT) on your router/gateway. Please forward the ports below (SIP " ++"port and RTP range) to the IP address of the device running this PBX." ++msgstr "" ++ ++msgid "" ++"Your PIN disappears when saved for your protection. It will be changed only " ++"when you enter a value different from the saved one. Leaving the PIN empty " ++"is possible, but please beware of the security implications." ++msgstr "" ++ ++msgid "" ++"Your password disappears when saved for your protection. It will be changed " ++"only when you enter a value different from the saved one." ++msgstr "" +diff --git a/feeds/luci/applications/luci-app-pbx/po/de/pbx.po b/feeds/luci/applications/luci-app-pbx/po/de/pbx.po +new file mode 100644 +index 0000000..3bc4bd4 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-pbx/po/de/pbx.po +@@ -0,0 +1,699 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"PO-Revision-Date: 2013-01-30 18:17+0200\n" ++"Last-Translator: DAC324 \n" ++"Language-Team: none\n" ++"Language: de\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n != 1);\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "Advanced Settings" ++msgstr "Erweiterte Einstellungen" ++ ++msgid "Available" ++msgstr "Verfügbar" ++ ++msgid "" ++"Avoid using anything but alpha-numeric characters, space, comma, and period." ++msgstr "Nur alphanumerische Zeichen, Komma, Punkt und Leerzeichen verwenden" ++ ++msgid "Away" ++msgstr "Abwesend" ++ ++msgid "Blacklisted Numbers" ++msgstr "Nicht erlaubte Nummern (Blacklist)" ++ ++msgid "Call Routing" ++msgstr "Anrufweiterleitung" ++ ++msgid "Call-back Numbers" ++msgstr "" ++ ++msgid "Call-back Provider" ++msgstr "" ++ ++msgid "Call-through Numbers" ++msgstr "Durchwahl Nummern" ++ ++msgid "Copy-paste large lists of numbers here." ++msgstr "Hier können per Copy & Paste größere Nummernlisten eingefügt werden." ++ ++msgid "" ++"Designate numbers that are allowed to call through this system and which " ++"user's privileges they will have." ++msgstr "" ++ ++msgid "" ++"Designate numbers to whom the system will hang up and call back, which " ++"provider will be used to call them, and which user's privileges will be " ++"granted to them." ++msgstr "" ++ ++msgid "Dials numbers unmatched elsewhere" ++msgstr "Wählt Nummern an, für die es keine andere Ãœbereinstimmung gibt" ++ ++msgid "Do Not Disturb" ++msgstr "Beschäftigt" ++ ++msgid "Domain/IP Address/Dynamic Domain" ++msgstr "Domäne/IP-Adresse/Dynamische Domäne" ++ ++msgid "Dynamic List of Blacklisted Numbers" ++msgstr "Dynamische Liste nicht erlaubter Nummern (Dynamische Blacklist)" ++ ++msgid "Email" ++msgstr "E-Mail" ++ ++msgid "Enable Incoming Calls (Register via SIP)" ++msgstr "Eingehende Anrufe akzeptieren (registrieren via SIP)" ++ ++msgid "Enable Incoming Calls (set Status below)" ++msgstr "Eingehende Anrufe akzeptieren (Status unten einstellen)" ++ ++msgid "Enable Outgoing Calls" ++msgstr "Ausgehende Anrufe aktivieren" ++ ++msgid "Enabled" ++msgstr "Aktiv" ++ ++msgid "" ++"Enter a VoIP provider to use for call-back in the format username@some.host." ++"name, as listed in \"Outgoing Calls\" above. It's easiest to copy and paste " ++"the providers from above. Invalid entries, including providers not enabled " ++"for outgoing calls, will be rejected silently." ++msgstr "" ++ ++msgid "" ++"Enter phone numbers that you want to decline calls from automatically. You " ++"should probably omit the country code and any leading zeroes, but please " ++"experiment to make sure you are blocking numbers from your desired area " ++"successfully." ++msgstr "" ++"Geben Sie Telefonnummern ein, von denen Anrufe automatisch zurückgewiesen " ++"werden sollen. Sie sollten die Ländervorwahl und alle führenden Nullen " ++"weglassen, aber experimentieren Sie ruhig, damit Sie auch wirklich alle " ++"Nummern blockieren, die blockiert werden sollen." ++ ++msgid "" ++"Enter this IP (or IP:port) in the Server/Registrar setting of SIP devices " ++"you will use ONLY locally and never from a remote location." ++msgstr "" ++"Geben SIe diese IP (oder IP:Port) in der Server-/Registrar-Einstellung der " ++"SIP-Geräte an, die Sie NUR local und niemals von einem entfernten Ort " ++"einsetzen werden." ++ ++msgid "" ++"Enter this hostname (or hostname:port) in the Server/Registrar setting of " ++"SIP devices you will use from a remote location (they will work locally too)." ++msgstr "" ++"Geben SIe diese IP (oder IP:Port) in der Server-/Registrar-Einstellung der " ++"SIP-Geräte an, die Sie von einem entfernten Ort einsetzen werden (sie " ++"funktionieren auch lokal)." ++ ++msgid "External SIP Port" ++msgstr "Externer SIP Port" ++ ++msgid "" ++"For each provider enabled for incoming calls, here you can restrict which " ++"users to ring on incoming calls. If the list is empty, the system will " ++"indicate that all users enabled for incoming calls will ring. Invalid " ++"usernames will be rejected silently. Also, entering a username here " ++"overrides the user's setting to not receive incoming calls. This way, you " ++"can make certain users ring only for specific providers. Entries can be made " ++"in a space-separated list, and/or one per line by hitting enter after every " ++"one." ++msgstr "" ++"Hier können Sie für jeden Dienstanbieter, der für eingehende Anrufe " ++"eingerichtet ist, festlegen, welche Nutzer ein Klingelzeichen bei " ++"eingehenden Anrufen erhalten. Ist die Liste leer, klingelt es bei allen " ++"Nutzern, die eingehende Anrufe empfangen dürfen. Ungültige Benutzernamen " ++"werden ohne Fehlermeldung zurückgewiesen. Außerdem überschreibt der Eintrag " ++"eines Benutzernamens an dieser Stelle die evtl. vorhandene Einstellung für " ++"diesen Benutzer, keine eingehenden Anrufe zu erhalten. Auf diese Weise kann " ++"eingestellt werden, dass die Nutzer nur bei bestimmten Dienstanbietern ein " ++"Klingelzeichen erhalten. Einträge in dieser Liste können entweder durch " ++"Leerzeichen getrennt oder als ein Eintrag pro Zeile (Eingabetaste nach jedem " ++"Eintrag) eingegeben werden." ++ ++msgid "" ++"For each user enabled for outgoing calls you can restrict what providers the " ++"user can use for outgoing calls. By default all users can use all providers. " ++"To show up in the list below the user should be allowed to make outgoing " ++"calls in the \"User Accounts\" page. Enter VoIP providers in the format " ++"username@some.host.name, as listed in \"Outgoing Calls\" above. It's easiest " ++"to copy and paste the providers from above. Invalid entries, including " ++"providers not enabled for outgoing calls, will be rejected silently. Entries " ++"can be made in a space-separated list, and/or one per line by hitting enter " ++"after every one." ++msgstr "" ++"Hier können Sie für jeden Benutzer, der für abgehende Anrufe eingerichtet " ++"ist, festlegen, welche Dienstanbieter verwendet werden dürfen. In der " ++"Voreinstellung dürfen alle Benutzer auch alle Dienstanbieter verwenden. Um " ++"in der Liste unten aufzutauchen, sollte dem Benutzer auf der Seite " ++"\"Benutzerkonten\" erlaubt werden, abgehende Anrufe machen zu dürfen. Geben " ++"Sie VoIP-Dienstanbieter im Format Benutzername@Servername an, wie bereits " ++"oben unter \"Abgehende Anrufe\". Am einfachsten kopieren Sie die " ++"Dienstanbieter von dort und fügen sie hier wieder ein. Ungültige Einträge, " ++"einschließlich nicht für abgehende Anrufe zugelassene Dienstanbieter, werden " ++"ohne Fehlermeldung zurückgewiesen. Einträge in dieser Liste können entweder " ++"durch Leerzeichen getrennt und/oder als ein Eintrag pro Zeile (Eingabetaste " ++"nach jedem Eintrag) eingegeben werden." ++ ++msgid "Full Name" ++msgstr "Vollständiger Name" ++ ++msgid "General Settings" ++msgstr "Allgemeine Einstellungen" ++ ++msgid "Google Accounts" ++msgstr "Google-Konten" ++ ++msgid "Google Talk Status" ++msgstr "Status für Google Talk" ++ ++msgid "Google Talk Status Message" ++msgstr "Statusbenachrichtigung für Google Talk" ++ ++msgid "Google Voice/Talk Accounts" ++msgstr "Google Voice/Talk-Konten" ++ ++msgid "Hang-up Delay" ++msgstr "" ++ ++msgid "" ++"Here you must configure at least one SIP account, that you will use to " ++"register with this service. Use this account either in an Analog Telephony " ++"Adapter (ATA), or in a SIP software like CSipSimple, Linphone, or Sipdroid " ++"on your smartphone, or Ekiga, Linphone, or X-Lite on your computer. By " ++"default, all SIP accounts will ring simultaneously if a call is made to one " ++"of your VoIP provider accounts or GV numbers." ++msgstr "" ++"Hier müssen Sie wenigstens ein SIP-Konto angeben, welches Sie zur Anmeldung " ++"an diesen Dienst nutzen. Verwenden Sie dieses Konto entweder in einem " ++"Adapter für analoges Telefonieren (ATA) oder einer SIP-Software wie " ++"CSipSimple, Linphone, oder Sipdroid auf Ihrem Smartphone, oder Ekiga, " ++"Linphone, oder X-Lite auf Ihrem Computer. In der Voreinstellung klingeln " ++"alle SIP-Konten gleichzeitig, wenn ein Anruf auf eines Ihrer VoIP-Konten " ++"oder Ihre GV-Nummern gemacht wird." ++ ++msgid "" ++"How long to wait before hanging up. If the provider you use to dial " ++"automatically forwards to voicemail, you can set this value to a delay that " ++"will allow you to hang up before your call gets forwarded and you get billed " ++"for it." ++msgstr "" ++ ++msgid "" ++"If setting Server/Registrar to %s or %s does not work for you, try setting " ++"it to %s or %s and entering this port number in a separate field that " ++"specifies the Server/Registrar port number. Beware that some devices have a " ++"confusing setting that sets the port where SIP requests originate from on " ++"the SIP device itself (the bind port). The port specified on this page is " ++"NOT this bind port but the port this service listens on." ++msgstr "" ++"Wenn EInstellen des Servers/Registrars auf %s oder %s bei Ihnen nicht " ++"funktioniert, versuchen Sie die Einstellung %s oder %s und geben Sie die " ++"Portnummer in ein separates Feld für Server/Registrat-Portnummer ein. " ++"Achtung: Einige Geräte haben eine verwirrende Einstellung, die den Port " ++"setzt, von dem die SIP-Anfragen auf dem Gerät selbst herkommen (der Bindungs-" ++"Port). Der Port auf dieser Seite meint NICHT diesen Bindungs-Port, sondern " ++"den Port, an dem der Dienst lauscht." ++ ++msgid "" ++"If you experience jittery or high latency audio during heavy downloads, you " ++"may want to enable QoS. QoS prioritizes traffic to and from your network for " ++"specified ports and IP addresses, resulting in better latency and throughput " ++"for sound in our case. If enabled below, a QoS rule for this service will be " ++"configured by the PBX automatically, but you must visit the QoS " ++"configuration page (Network->QoS) to configure other critical QoS settings " ++"like Download and Upload speed." ++msgstr "" ++"Wenn Sie stotternden oder stark verzögerten Ton während großer Downloads " ++"haben, sollten Sie QoS einschalten. QoS priorisiert Verkehr von und zu Ihrem " ++"Netzwerk für bestimmte Ports und IP-Adressen mit dem Ergebnis einer besseren " ++"Tonübertragung in unserem Fall. Wenn unten eingeschaltet, wird eine QoS-" ++"Regel automatisch vom PBX eingerichtet, aber Sie müssen die QoS-" ++"Konfigurationsseite (Netzwerk->QoS) aufrufen, um andere kritische QoS-" ++"Einstellungen wie Upload-und Download-Geschwindigkeit vorzunehmen." ++ ++msgid "" ++"If you have more than one account that can make outgoing calls, you should " ++"enter a list of phone numbers and/or prefixes in the following fields for " ++"each provider listed. Invalid prefixes are removed silently, and only 0-9, " ++"X, Z, N, #, *, and + are valid characters. The letter X matches 0-9, Z " ++"matches 1-9, and N matches 2-9. For example to make calls to Germany through " ++"a provider, you can enter 49. To make calls to North America, you can enter " ++"1NXXNXXXXXX. If one of your providers can make \"local\" calls to an area " ++"code like New York's 646, you can enter 646NXXXXXX for that provider. You " ++"should leave one account with an empty list to make calls with it by " ++"default, if no other provider's prefixes match. The system will " ++"automatically replace an empty list with a message that the provider dials " ++"all numbers not matched by another provider's prefixes. Be as specific as " ++"possible (i.e. 1NXXNXXXXXX is better than 1). Please note all international " ++"dial codes are discarded (e.g. 00, 011, 010, 0011). Entries can be made in a " ++"space-separated list, and/or one per line by hitting enter after every one." ++msgstr "" ++"Wenn Sie mehr als ein Konto für abgehende Anrufe haben, sollten Sie eine " ++"Liste von Telefonnummern/Vorwahlen in den folgenden Feldern für jeden " ++"aufgeführten Dienstanbieter eintragen. Ungültige Vorwahlen werden ohne " ++"Fehlermeldung entfernt, nur 0-9, X, Z, N, #, *, und + sind gültige Zeichen. " ++"Der Buchstabe X entspricht 0-9, Z entrpricht 1-9, N entspricht 2-9. Zum " ++"Beispiel können Sie 49 eingeben, um Anrufe nach Deutschland über einen " ++"Dienstanbieter zu tätigen. Für Anrufe nach Nordamerika geben Sie 1NXXNXXXXXX " ++"an. Unterstützt ein Dienstanbieter Ortsgespräche, wie im Gebiet 646 von New " ++"York, geben Sie 646NXXXXXX für diesen Anbieter ein. Ein Konto sollte eine " ++"leere Liste behalten, damit Sie darüber standardmäßig Anrufe tätigen können, " ++"wenn keine der Vorwahlen für die anderen Anbieter übereinstimmt. Das System " ++"ersetzt eine leere Liste automatisch mit dem Eintrag, dass dieser Anbieter " ++"alle Vorwahlen unterstützt, die von den anderen Anbietern nicht unterstützt " ++"werden. Seien Sie so spezifisch wie möglich (1NXXNXXXXXX ist besser als 1). " ++"Bitte beachten Sie, dass alle internationalen Vorwahl-Codes (wie 00, 011, " ++"010, 0011) verworfen werden. Einträge können durch Leezeichen getrennt und/" ++"oder einzeln pro Zeile (Abschließen mit Eingabe-Taste) eingegeben werden." ++ ++msgid "Incoming Calls" ++msgstr "Eingehende Anrufe" ++ ++msgid "Insert QoS Rules" ++msgstr "QoS-Regeln einfügen" ++ ++msgid "Makes Outgoing Calls" ++msgstr "Macht ausgehende Anrufe" ++ ++msgid "NOTE: There are no Google or SIP provider accounts configured." ++msgstr "" ++"ACHTUNG: Es sind keine Konten für Google oder einen SIP-Dienstanbieter " ++"eingerichtet." ++ ++msgid "" ++"NOTE: There are no Google or SIP provider accounts enabled for incoming " ++"calls." ++msgstr "" ++"ACHTUNG: Es sind keine Konten für Google oder einen SIP-Dienstanbieter für " ++"eingehende Anrufe eingerichtet." ++ ++msgid "" ++"NOTE: There are no Google or SIP provider accounts enabled for outgoing " ++"calls." ++msgstr "" ++"ACHTUNG: Es sind keine Konten für Google oder einen SIP-Dienstanbieter für " ++"abgehende Anrufe eingerichtet." ++ ++msgid "NOTE: There are no local user accounts configured." ++msgstr "ACHTUNG: Es sind keine lokalen Benutzerkonten eingerichtet." ++ ++msgid "NOTE: There are no local user accounts enabled for outgoing calls." ++msgstr "" ++"ACHTUNG: Es sind keine lokalen Benutzerkonten für abgehende Anrufe " ++"eingerichtet." ++ ++msgid "No" ++msgstr "Nein" ++ ++msgid "Number of Seconds to Ring" ++msgstr "Dauer des Klingelns in Sekunden" ++ ++msgid "Outbound Proxy" ++msgstr "Proxy für ausgehende Verbindungen" ++ ++msgid "Outgoing Calls" ++msgstr "Abgehende Anrufe" ++ ++msgid "PBX Main Page" ++msgstr "PBX-Hauptseite" ++ ++msgid "PBX Service Status" ++msgstr "PBX-Dienststatus" ++ ++msgid "PIN" ++msgstr "PIN" ++ ++msgid "Password" ++msgstr "Passwort" ++ ++msgid "" ++"Pick a random port number between 6500 and 9500 for the service to listen " ++"on. Do not pick the standard 5060, because it is often subject to brute-" ++"force attacks. When finished, (1) click \"Save and Apply\", and (2) look in " ++"the \"SIP Device/Softphone Accounts\" section for updated Server and Port " ++"settings for your SIP Devices/Softphones." ++msgstr "" ++ ++msgid "Port Setting for SIP Devices" ++msgstr "Port-Einstellung für SIP-Geräte" ++ ++msgid "Providers Used for Outgoing Calls" ++msgstr "Provider für abgehende Anrufe" ++ ++msgid "QoS Settings" ++msgstr "QoS Einstellungen" ++ ++msgid "RTP Port Range End" ++msgstr "Ende des RTP-Port-Bereichs" ++ ++msgid "RTP Port Range Start" ++msgstr "Anfang des RTP-Port-Bereichs" ++ ++msgid "" ++"RTP traffic carries actual voice packets. This is the start of the port " ++"range that will be used for setting up RTP communication. It's usually OK to " ++"leave this at the default value." ++msgstr "" ++"RTP-Verkehr überträgt die aktuellen Sprachpakete. Dies ist der Anfang des " ++"Port-Bereichs, der für die Einrichtung der RTP-Verbindung verwendet wird. " ++"Normalerweise kann hier die Voreinstellung belassen werden." ++ ++msgid "Receives Incoming Calls" ++msgstr "Empfängt eingehende Anrufe" ++ ++msgid "Remote Usage" ++msgstr "Benutzung aus der Ferne" ++ ++msgid "Rings users enabled for incoming calls" ++msgstr "Für eingehende Anrufe freigeschaltete Nutzer erhalten Klingelzeichen" ++ ++msgid "SIP Accounts" ++msgstr "SIP-Konten" ++ ++msgid "SIP Device/Softphone Accounts" ++msgstr "SIP-Geräte-/Softphone-Konten" ++ ++msgid "SIP Provider Accounts" ++msgstr "SIP-Dienstanbieter-Konten" ++ ++msgid "SIP Realm (needed by some providers)" ++msgstr "SIP-Bereich (von manchen Dienstanbietern benötigt)" ++ ++msgid "SIP Server/Registrar" ++msgstr "SIP-Server/Registrar" ++ ++msgid "SIP Server/Registrar Port" ++msgstr "SIP-Server/Registrar Port" ++ ++msgid "Server Setting" ++msgstr "Servereinstellung" ++ ++msgid "Server Setting for Local SIP Devices" ++msgstr "Servereinstellung für lokale SIP-Geräte" ++ ++msgid "Server Setting for Remote SIP Devices" ++msgstr "Servereinstellung für entfernte SIP-Geräte" ++ ++msgid "Service Status" ++msgstr "Dienst-Status" ++ ++msgid "" ++"Set the number of seconds to ring users upon incoming calls before hanging " ++"up or going to voicemail, if the voicemail is installed and enabled." ++msgstr "" ++"Stellen Sie ein (in Sekunden), wie lange es bei den Benutzern klingeln soll, " ++"bevor aufgelegt oder zur Voicemail (falls installiert und aktiv) " ++"übergegangen wird. " ++ ++msgid "Space-Separated List of Blacklisted Numbers" ++msgstr "Mit Leerzeichen unterteilte Liste gesperrter Nummern" ++ ++msgid "Specify numbers individually here. Press enter to add more numbers." ++msgstr "" ++"Geben Sie die Nummern hier einzeln an. Drücken Sie Eingabe, um weitere " ++"Nummern hinzuzufügen." ++ ++msgid "" ++"Specify numbers individually here. Press enter to add more numbers. You will " ++"have to experiment with what country and area codes you need to add to the " ++"number." ++msgstr "" ++ ++msgid "" ++"The number(s) specified above will be able to dial out with this user's " ++"providers. Invalid usernames, including users not enabled for outgoing " ++"calls, are dropped silently. Please verify that the entry was accepted." ++msgstr "" ++"Die oben angegebene(n) Nummer(n) können für ausgehende Anrufe mit den " ++"Dienstanbietern dieses Nutzers verwendet werden. Ungültige Benutzernamen, " ++"einschließlich Nutzer, die nicht für ausgehende Anrufe freigeschaltet sind, " ++"werden ohne Fehlermeldung verworfen. Bitte überprüfen Sie deshalb, ob der " ++"Eintrag akzeptiert wurde." ++ ++msgid "" ++"This configuration page allows you to configure a phone system (PBX) service " ++"which permits making phone calls through multiple Google and SIP (like " ++"Sipgate, SipSorcery, and Betamax) accounts and sharing them among many SIP " ++"devices. Note that Google accounts, SIP accounts, and local user accounts " ++"are configured in the \"Google Accounts\", \"SIP Accounts\", and \"User " ++"Accounts\" sub-sections. You must add at least one User Account to this PBX, " ++"and then configure a SIP device or softphone to use the account, in order to " ++"make and receive calls with your Google/SIP accounts. Configuring multiple " ++"users will allow you to make free calls between all users, and share the " ++"configured Google and SIP accounts. If you have more than one Google and SIP " ++"accounts set up, you should probably configure how calls to and from them " ++"are routed in the \"Call Routing\" page. If you're interested in using your " ++"own PBX from anywhere in the world, then visit the \"Remote Usage\" section " ++"in the \"Advanced Settings\" page." ++msgstr "" ++"Diese Konfigurationsseite erlaubt Ihnen die Einrichtung eines " ++"Telefonsystemdienstes (PBX), der Anrufe über mehrere Google- und SIP-Konten " ++"(wie Sipgate, SipSorcery und Betamax) erlaubt. Sie können diese Konten für " ++"viele SIP-Geräte verwenden. Beachten Sie, dass Google-, SIP- und lokale " ++"Benutzer-Konten in den Abschnitten \"Google-Konten\", \"SIP-Konten\" und " ++"\"Benutzerkonten\" eingerichtet werden. Sie müssen mindestens ein " ++"Benutzerkonto für diesen PBX vorsehen und dann ein SIP-Gerät oder Softphone " ++"für die Benutzung dieses Kontos einrichten, damit Sie Anrufe mit Ihren " ++"Google-/SIP-Konten tätigen oder empfangen können. Wenn Sie mehr als ein " ++"Google- / SIP-Konto eingerichtet haben, sollten Sie auf der Seite " ++"\"Anrufweiterleitung\" einrichten, wie diese Anrufe behandelt werden. Wenn " ++"Sie Ihr PBX von irgendwo auf der Welt nutzen wollen, schauen Sie auf den " ++"Abschnitt \"Benutzung aus der Ferne\" auf der Seite \"Erweiterte " ++"Einstellungen\". " ++ ++msgid "" ++"This is the name that the VoIP server will use to identify itself when " ++"registering to VoIP (SIP) providers. Some providers require this to a " ++"specific string matching a hardware SIP device." ++msgstr "" ++"Dies ist der Name, den der VoIP-Server verwenden wird, um sich selbst bei " ++"der Registrierung beim VoIP-Dienstanbieter zu identifizieren. Einige " ++"Anbieter verlangen, dass dies ein spezieller Begriff ist, der einem Hardware-" ++"SIP-Gerät entspricht." ++ ++msgid "" ++"This is where you indicate which Google/SIP accounts are used to call what " ++"country/area codes, which users can use what SIP/Google accounts, how " ++"incoming calls are routed, what numbers can get into this PBX with a " ++"password, and what numbers are blacklisted." ++msgstr "" ++"Hier geben Sie an, welche Google-/SIP-Konten für welche Ländervorwahlen " ++"benutzt werden sollen, welche Nutzer welche Konten verwenden dürfen, wie " ++"Anrufe weitergeleitet werden, welche Nummern mit Password in diesen PBX " ++"kommen, und welche Nummern ausgeschlossen werden." ++ ++msgid "" ++"This is where you set up your Google (Talk and Voice) Accounts, in order to " ++"start using them for dialing and receiving calls (voice chat and real phone " ++"calls). Please make at least one voice call using the Google Talk plugin " ++"installable through the GMail interface, and then log out from your account " ++"everywhere. Click \"Add\" to add as many accounts as you wish." ++msgstr "" ++"Hier stellen Sie Ihre Google (Talk und Voice) Konten ein, um sie für " ++"abgehende und ankommende Anrufe nutzen zu können (Voice Chat und Telefon-" ++"Anrufe). Bitte tätigen Sie wenigstens einen Sprach-Anruf mit dem Google-Talk-" ++"Plugin, das über das GMail-Interface zu installieren ist, und melden Sie " ++"sich dann überall aus Ihrem Konto ab. Klicken Sie auf \"Hinzufügen\" um so " ++"viele Konten hinzuzufügen, wie Sie wollen." ++ ++msgid "" ++"This is where you set up your SIP (VoIP) accounts ts like Sipgate, " ++"SipSorcery, the popular Betamax providers, and any other providers with SIP " ++"settings in order to start using them for dialing and receiving calls (SIP " ++"uri and real phone calls). Click \"Add\" to add as many accounts as you wish." ++msgstr "" ++"Hier stellen Sie Ihre SIP (VoIP) Konten, wie Sipgate, SipSorcery, die " ++"populären Betamax-Anbieter, und alle anderen Anbieter mit SIP-Einstellungen " ++"ein, um sie für abgehende und ankommende Anrufe nutzen zu können (SIP uri " ++"und Telefon-Anrufe). Klicken Sie auf \"Hinzufügen\" um so viele Konten " ++"hinzuzufügen, wie Sie wollen." ++ ++msgid "" ++"This option should be set to \"Yes\" if you have a DID (real telephone " ++"number) associated with this SIP account or want to receive SIP uri calls " ++"through this provider." ++msgstr "" ++"Diese Option sollte auf \"Ja\" gesetzt werden, wenn Sie eine DID (reale " ++"Telefonnummer) haben, die mit diesem SIP-Konto verknüpft ist, oder wenn Sie " ++"SIP-Anrufe über diesen Anbieter empfangen wollen." ++ ++msgid "" ++"This section contains settings that do not need to be changed under normal " ++"circumstances. In addition, here you can configure your system for use with " ++"remote SIP devices, and resolve call quality issues by enabling the " ++"insertion of QoS rules." ++msgstr "" ++"Dieser Abschnitt enthält Einstellungen, die unter normalen Umständen nicht " ++"geändert werden müssen. Zusätzlich konnen Sie hier Ihr System für die " ++"Verwendung mit entfernten SIP-Geräten einrichten und Probleme bei der " ++"Tonqualität beheben, indem Sie die Festlegung von QoS-Regeln aktivieren." ++ ++msgid "" ++"Use (four to five digit) numeric user name if you are connecting normal " ++"telephones with ATAs to this system (so they can dial user names)." ++msgstr "" ++"Verwenden Sie eine vier- bis fünfstellige Nummer als Benutzernamen, wenn Sie " ++"normale Telefone mit ATA an dieses System anschließen (damit diese Namen " ++"über deren Zifferntastatur eingegeben werden können)." ++ ++msgid "" ++"Use this account to make outgoing calls as configured in the \"Call Routing" ++"\" section." ++msgstr "" ++"Dieses Konto für abgehende Anrufe verwenden, wie im Abschnitt " ++"\"Anrufweiterleitung\" eingestellt." ++ ++msgid "Use this account to make outgoing calls." ++msgstr "Dieses Konto für abgehende Anrufe verwenden." ++ ++msgid "User Accounts" ++msgstr "Benutzerkonten" ++ ++msgid "User Agent String" ++msgstr "Benutzeridentifikation (User Agent)" ++ ++msgid "User Name" ++msgstr "Benutzername" ++ ++msgid "Uses providers enabled for outgoing calls" ++msgstr "Verwendet für abgehende Anrufe eingerichtete Dienstanbieter" ++ ++msgid "" ++"When somebody starts voice chat with your GTalk account or calls the GVoice, " ++"number (if you have Google Voice), the call will be forwarded to any users " ++"that are online (registered using a SIP device or softphone) and permitted " ++"to receive the call. If you have Google Voice, you must go to your GVoice " ++"settings and forward calls to Google chat in order to actually receive calls " ++"made to your GVoice number. If you have trouble receiving calls from GVoice, " ++"experiment with the Call Screening option in your GVoice Settings. Finally, " ++"make sure no other client is online with this account (browser in gmail, " ++"mobile/desktop Google Talk App) as it may interfere." ++msgstr "" ++"Wenn jemand einen Voice-Chat mit Ihrem GTalk-Konto oder die GVoice-Nummer " ++"(falls Sie Google Voice haben) anruft, wird der Anruf an jeden Benutzer " ++"weiter geleitet, der Online ist (mit SIP-Gerät oder Softphone) und den Anruf " ++"empfangen darf. Wenn Sie Google Voice haben, müssen Sie in Ihre GVoice-" ++"Einstellungen gehen und Anrufe zu Google Chat weiter leiten, damit Sie " ++"Anrufe auf Ihre GVoice-Nummer empfangen können. Bei Problemen mit dem " ++"Empfang von Anrufen über GVoice, experimentieren Sie mit der Option " ++"\"Anrufprüfung\" in den GVoice-Einstellungen. Stellen Sie schließlich " ++"sicher, dass kein anderer Client mit diesem Konto Online ist (z.B. Browser " ++"in GMail, Google Talk App mobil oder auf PC), denn das könnte Einfluss haben." ++ ++msgid "" ++"When your password is saved, it disappears from this field and is not " ++"displayed for your protection. The previously saved password will be changed " ++"only when you enter a value different from the saved one." ++msgstr "" ++"Wenn Ihr Passwort gespeichert wird, verschwindet es aus diesem Feld und wird " ++"zu Ihrem Schutz nicht angezeigt. Ein vorher gespeichertes Passwort wird nur " ++"geändert, wenn Sie ein geändertes Passwort eingeben." ++ ++msgid "Yes" ++msgstr "Ja" ++ ++msgid "" ++"You can enter your domain name, external IP address, or dynamic domain name " ++"here. The best thing to input is a static IP address. If your IP address is " ++"dynamic and it changes, your configuration will become invalid. Hence, it's " ++"recommended to set up Dynamic DNS in this case. and enter your Dynamic DNS " ++"hostname here. You can configure Dynamic DNS with the luci-app-ddns package." ++msgstr "" ++ ++msgid "You can specify a real name to show up in the Caller ID here." ++msgstr "" ++"Sie können hier einen Klarnamen angeben, der als Name des Anrufers erscheint." ++ ++msgid "" ++"You can use your SIP devices/softphones with this system from a remote " ++"location as well, as long as your Internet Service Provider gives you a " ++"public IP. You will be able to call other local users for free (e.g. other " ++"Analog Telephone Adapters (ATAs)) and use your VoIP providers to make calls " ++"as if you were local to the PBX. After configuring this tab, go back to " ++"where users are configured and see the new Server and Port setting you need " ++"to configure the remote SIP devices with. Please note that if this PBX is " ++"not running on your router/gateway, you will need to configure port " ++"forwarding (NAT) on your router/gateway. Please forward the ports below (SIP " ++"port and RTP range) to the IP address of the device running this PBX." ++msgstr "" ++"Sie können Ihre SIP-Geräte/Softphones mit diesem System auch von einem " ++"entfernten Ort aus benutzen, so lange Ihnen Ihr Internet-Dienstanbieter eine " ++"öffentliche IP-Adresse zuweist. Sie können andere lokale Benutzer kostenlos " ++"anrufen (z.B. andere Analog-Telefon-Adapter (ATA)) und Ihre VoIP-Anbieter " ++"für Anrufe verwenden, als ob Sie am lokalen PBX angeschlossen wären. Nach " ++"der Einrichtung dieses Tabs gehen Sie zu den Benutzereinstellungen zurück " ++"und schauen Sie nach den neuen Einstellungen für Server und Port, die Sie an " ++"den entfernten SIP-Geräten vornehmen müssen. Bitte beachten Sie, dass Sie " ++"NAT/Portweiterleitung auf dem Router/Gateway einrichten müssen, falls dieser " ++"PBX nicht auf Ihrem Router/Gateway läuft. Bitte leiten Sie die unten " ++"angegebenen Ports (SIP-Port und RTP-Bereich) auf die IP-Adresse dieses PBX " ++"weiter." ++ ++msgid "" ++"Your PIN disappears when saved for your protection. It will be changed only " ++"when you enter a value different from the saved one. Leaving the PIN empty " ++"is possible, but please beware of the security implications." ++msgstr "" ++"Ihre PIN verschwindet beim Speichern aus diesem Feld und wird zu Ihrem " ++"Schutz nicht angezeigt. Eine vorher gespeicherte PIN wird nur geändert, wenn " ++"Sie eine geänderte PIN eingeben. Sie können die PIN leer lassen, aber denken " ++"Sie an die Konsequenzen für die Sicherheit." ++ ++msgid "" ++"Your password disappears when saved for your protection. It will be changed " ++"only when you enter a value different from the saved one." ++msgstr "" ++"Ihr Passwort verschwindet beim Speichern und wird zu Ihrem Schutz nicht " ++"angezeigt. Es wird nur geändert, wenn Sie ein anderes Passwort eingeben." ++ ++#~ msgid "" ++#~ "Designate numbers that are allowed to call through this system and which " ++#~ "user's privileges it will have." ++#~ msgstr "" ++#~ "Nummern auswählen, die durch dieses System anrufen können, und deren " ++#~ "Benutzerrechte einstellen" ++ ++#~ msgid "" ++#~ "Pick a random port number between 6500 and 9500 for the service to listen " ++#~ "on. Do not pick the standard 5060, because it is often subject to brute-" ++#~ "force attacks. When finished, (1) click \"Save and Apply\", and (2) click " ++#~ "the \"Restart VoIP Service\" button above. Finally, (3) look in the \"SIP " ++#~ "Device/Softphone Accounts\" section for updated Server and Port settings " ++#~ "for your SIP Devices/Softphones." ++#~ msgstr "" ++#~ "Wählen Sie eine zufällige Portnummer zwischen 6500 und 9000 für den Dienst " ++#~ "aus. Nehmen Sie nicht die standardmäßige 5060, weil sie oft attackiert wird. " ++#~ "Wenn fertig (1) klicken Sie auf \"Speichern und Anwenden\" und (2) auf \"VoIP-" ++#~ "Dienst neu starten\" oben. Schließlich (3) sehen Sie im Abschnitt \"SIP-Geräte" ++#~ "/Softphone-Konten\" nach aktualisierten Einstellungen für Ihre SIP-" ++#~ "Geräte/Softphones." ++ ++#~ msgid "" ++#~ "You can enter your domain name, external IP address, or dynamic domain " ++#~ "name here Please keep in mind that if your IP address is dynamic and it " ++#~ "changes your configuration will become invalid. Hence, it's recommended " ++#~ "to set up Dynamic DNS in this case." ++#~ msgstr "" ++#~ "Sie können Ihren Domänennamen, externe IP-Adresse, oder dynamischen " ++#~ "Domänennamen hier angeben.Bitte beachten Sie, dass Ihre Konfiguration " ++#~ "ungältig wird, wenn Sie eine dynamische IP-Adresse besitzen und sich diese " ++#~ "ändert. Für diesen Fall wird deshalb die Einrichtung von dnamischem DNS " ++#~ "empfohlen." ++ ++#~ msgid "Account Status" ++#~ msgstr "Konto-Status" ++ ++#~ msgid "Account Status Message" ++#~ msgstr "Konto-Status Meldung" ++ ++#~ msgid "Domain Name/Dynamic Domain Name" ++#~ msgstr "DNS Name (auch dynamisch möglich)" +diff --git a/feeds/luci/applications/luci-app-pbx/po/el/pbx.po b/feeds/luci/applications/luci-app-pbx/po/el/pbx.po +new file mode 100644 +index 0000000..717e256 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-pbx/po/el/pbx.po +@@ -0,0 +1,493 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"PO-Revision-Date: 2012-03-31 15:41+0200\n" ++"Last-Translator: Vasilis \n" ++"Language-Team: none\n" ++"Language: el\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n != 1);\n" ++"X-Generator: Pootle 2.0.4\n" ++ ++msgid "Advanced Settings" ++msgstr "" ++ ++msgid "Available" ++msgstr "" ++ ++msgid "" ++"Avoid using anything but alpha-numeric characters, space, comma, and period." ++msgstr "" ++ ++msgid "Away" ++msgstr "" ++ ++msgid "Blacklisted Numbers" ++msgstr "" ++ ++msgid "Call Routing" ++msgstr "" ++ ++msgid "Call-back Numbers" ++msgstr "" ++ ++msgid "Call-back Provider" ++msgstr "" ++ ++msgid "Call-through Numbers" ++msgstr "" ++ ++msgid "Copy-paste large lists of numbers here." ++msgstr "" ++ ++msgid "" ++"Designate numbers that are allowed to call through this system and which " ++"user's privileges they will have." ++msgstr "" ++ ++msgid "" ++"Designate numbers to whom the system will hang up and call back, which " ++"provider will be used to call them, and which user's privileges will be " ++"granted to them." ++msgstr "" ++ ++msgid "Dials numbers unmatched elsewhere" ++msgstr "" ++ ++msgid "Do Not Disturb" ++msgstr "Μην Ενοχλείτε" ++ ++msgid "Domain/IP Address/Dynamic Domain" ++msgstr "" ++ ++msgid "Dynamic List of Blacklisted Numbers" ++msgstr "" ++ ++msgid "Email" ++msgstr "" ++ ++msgid "Enable Incoming Calls (Register via SIP)" ++msgstr "" ++ ++msgid "Enable Incoming Calls (set Status below)" ++msgstr "" ++ ++msgid "Enable Outgoing Calls" ++msgstr "" ++ ++msgid "Enabled" ++msgstr "ΕνεÏγοποιημένο" ++ ++msgid "" ++"Enter a VoIP provider to use for call-back in the format username@some.host." ++"name, as listed in \"Outgoing Calls\" above. It's easiest to copy and paste " ++"the providers from above. Invalid entries, including providers not enabled " ++"for outgoing calls, will be rejected silently." ++msgstr "" ++ ++msgid "" ++"Enter phone numbers that you want to decline calls from automatically. You " ++"should probably omit the country code and any leading zeroes, but please " ++"experiment to make sure you are blocking numbers from your desired area " ++"successfully." ++msgstr "" ++ ++msgid "" ++"Enter this IP (or IP:port) in the Server/Registrar setting of SIP devices " ++"you will use ONLY locally and never from a remote location." ++msgstr "" ++ ++msgid "" ++"Enter this hostname (or hostname:port) in the Server/Registrar setting of " ++"SIP devices you will use from a remote location (they will work locally too)." ++msgstr "" ++ ++msgid "External SIP Port" ++msgstr "" ++ ++msgid "" ++"For each provider enabled for incoming calls, here you can restrict which " ++"users to ring on incoming calls. If the list is empty, the system will " ++"indicate that all users enabled for incoming calls will ring. Invalid " ++"usernames will be rejected silently. Also, entering a username here " ++"overrides the user's setting to not receive incoming calls. This way, you " ++"can make certain users ring only for specific providers. Entries can be made " ++"in a space-separated list, and/or one per line by hitting enter after every " ++"one." ++msgstr "" ++ ++msgid "" ++"For each user enabled for outgoing calls you can restrict what providers the " ++"user can use for outgoing calls. By default all users can use all providers. " ++"To show up in the list below the user should be allowed to make outgoing " ++"calls in the \"User Accounts\" page. Enter VoIP providers in the format " ++"username@some.host.name, as listed in \"Outgoing Calls\" above. It's easiest " ++"to copy and paste the providers from above. Invalid entries, including " ++"providers not enabled for outgoing calls, will be rejected silently. Entries " ++"can be made in a space-separated list, and/or one per line by hitting enter " ++"after every one." ++msgstr "" ++ ++msgid "Full Name" ++msgstr "ΠλήÏες Όνομα" ++ ++msgid "General Settings" ++msgstr "Γενικές Ρυθμίσεις" ++ ++msgid "Google Accounts" ++msgstr "ΛογαÏιασμοί Google" ++ ++msgid "Google Talk Status" ++msgstr "" ++ ++msgid "Google Talk Status Message" ++msgstr "" ++ ++msgid "Google Voice/Talk Accounts" ++msgstr "ΛογαÏιασμοί Google Voice/Talk" ++ ++msgid "Hang-up Delay" ++msgstr "" ++ ++msgid "" ++"Here you must configure at least one SIP account, that you will use to " ++"register with this service. Use this account either in an Analog Telephony " ++"Adapter (ATA), or in a SIP software like CSipSimple, Linphone, or Sipdroid " ++"on your smartphone, or Ekiga, Linphone, or X-Lite on your computer. By " ++"default, all SIP accounts will ring simultaneously if a call is made to one " ++"of your VoIP provider accounts or GV numbers." ++msgstr "" ++ ++msgid "" ++"How long to wait before hanging up. If the provider you use to dial " ++"automatically forwards to voicemail, you can set this value to a delay that " ++"will allow you to hang up before your call gets forwarded and you get billed " ++"for it." ++msgstr "" ++ ++msgid "" ++"If setting Server/Registrar to %s or %s does not work for you, try setting " ++"it to %s or %s and entering this port number in a separate field that " ++"specifies the Server/Registrar port number. Beware that some devices have a " ++"confusing setting that sets the port where SIP requests originate from on " ++"the SIP device itself (the bind port). The port specified on this page is " ++"NOT this bind port but the port this service listens on." ++msgstr "" ++ ++msgid "" ++"If you experience jittery or high latency audio during heavy downloads, you " ++"may want to enable QoS. QoS prioritizes traffic to and from your network for " ++"specified ports and IP addresses, resulting in better latency and throughput " ++"for sound in our case. If enabled below, a QoS rule for this service will be " ++"configured by the PBX automatically, but you must visit the QoS " ++"configuration page (Network->QoS) to configure other critical QoS settings " ++"like Download and Upload speed." ++msgstr "" ++ ++msgid "" ++"If you have more than one account that can make outgoing calls, you should " ++"enter a list of phone numbers and/or prefixes in the following fields for " ++"each provider listed. Invalid prefixes are removed silently, and only 0-9, " ++"X, Z, N, #, *, and + are valid characters. The letter X matches 0-9, Z " ++"matches 1-9, and N matches 2-9. For example to make calls to Germany through " ++"a provider, you can enter 49. To make calls to North America, you can enter " ++"1NXXNXXXXXX. If one of your providers can make \"local\" calls to an area " ++"code like New York's 646, you can enter 646NXXXXXX for that provider. You " ++"should leave one account with an empty list to make calls with it by " ++"default, if no other provider's prefixes match. The system will " ++"automatically replace an empty list with a message that the provider dials " ++"all numbers not matched by another provider's prefixes. Be as specific as " ++"possible (i.e. 1NXXNXXXXXX is better than 1). Please note all international " ++"dial codes are discarded (e.g. 00, 011, 010, 0011). Entries can be made in a " ++"space-separated list, and/or one per line by hitting enter after every one." ++msgstr "" ++ ++msgid "Incoming Calls" ++msgstr "ΕισεÏχόμενες Κλήσεις" ++ ++msgid "Insert QoS Rules" ++msgstr "" ++ ++msgid "Makes Outgoing Calls" ++msgstr "" ++ ++msgid "NOTE: There are no Google or SIP provider accounts configured." ++msgstr "" ++ ++msgid "" ++"NOTE: There are no Google or SIP provider accounts enabled for incoming " ++"calls." ++msgstr "" ++ ++msgid "" ++"NOTE: There are no Google or SIP provider accounts enabled for outgoing " ++"calls." ++msgstr "" ++ ++msgid "NOTE: There are no local user accounts configured." ++msgstr "" ++ ++msgid "NOTE: There are no local user accounts enabled for outgoing calls." ++msgstr "" ++ ++msgid "No" ++msgstr "Όχι" ++ ++msgid "Number of Seconds to Ring" ++msgstr "" ++ ++msgid "Outbound Proxy" ++msgstr "" ++ ++msgid "Outgoing Calls" ++msgstr "ΕξεÏχόμενες Κλήσεις" ++ ++msgid "PBX Main Page" ++msgstr "" ++ ++msgid "PBX Service Status" ++msgstr "" ++ ++msgid "PIN" ++msgstr "PIN" ++ ++msgid "Password" ++msgstr "Κωδικός Ï€Ïόσβασης" ++ ++msgid "" ++"Pick a random port number between 6500 and 9500 for the service to listen " ++"on. Do not pick the standard 5060, because it is often subject to brute-" ++"force attacks. When finished, (1) click \"Save and Apply\", and (2) look in " ++"the \"SIP Device/Softphone Accounts\" section for updated Server and Port " ++"settings for your SIP Devices/Softphones." ++msgstr "" ++ ++msgid "Port Setting for SIP Devices" ++msgstr "" ++ ++msgid "Providers Used for Outgoing Calls" ++msgstr "" ++ ++msgid "QoS Settings" ++msgstr "" ++ ++msgid "RTP Port Range End" ++msgstr "" ++ ++msgid "RTP Port Range Start" ++msgstr "" ++ ++msgid "" ++"RTP traffic carries actual voice packets. This is the start of the port " ++"range that will be used for setting up RTP communication. It's usually OK to " ++"leave this at the default value." ++msgstr "" ++ ++msgid "Receives Incoming Calls" ++msgstr "" ++ ++msgid "Remote Usage" ++msgstr "" ++ ++msgid "Rings users enabled for incoming calls" ++msgstr "" ++ ++msgid "SIP Accounts" ++msgstr "ΛογαÏιασμοί SIP" ++ ++msgid "SIP Device/Softphone Accounts" ++msgstr "" ++ ++msgid "SIP Provider Accounts" ++msgstr "" ++ ++msgid "SIP Realm (needed by some providers)" ++msgstr "" ++ ++msgid "SIP Server/Registrar" ++msgstr "" ++ ++msgid "SIP Server/Registrar Port" ++msgstr "" ++ ++msgid "Server Setting" ++msgstr "" ++ ++msgid "Server Setting for Local SIP Devices" ++msgstr "" ++ ++msgid "Server Setting for Remote SIP Devices" ++msgstr "" ++ ++msgid "Service Status" ++msgstr "" ++ ++msgid "" ++"Set the number of seconds to ring users upon incoming calls before hanging " ++"up or going to voicemail, if the voicemail is installed and enabled." ++msgstr "" ++ ++msgid "Space-Separated List of Blacklisted Numbers" ++msgstr "" ++ ++msgid "Specify numbers individually here. Press enter to add more numbers." ++msgstr "" ++ ++msgid "" ++"Specify numbers individually here. Press enter to add more numbers. You will " ++"have to experiment with what country and area codes you need to add to the " ++"number." ++msgstr "" ++ ++msgid "" ++"The number(s) specified above will be able to dial out with this user's " ++"providers. Invalid usernames, including users not enabled for outgoing " ++"calls, are dropped silently. Please verify that the entry was accepted." ++msgstr "" ++ ++msgid "" ++"This configuration page allows you to configure a phone system (PBX) service " ++"which permits making phone calls through multiple Google and SIP (like " ++"Sipgate, SipSorcery, and Betamax) accounts and sharing them among many SIP " ++"devices. Note that Google accounts, SIP accounts, and local user accounts " ++"are configured in the \"Google Accounts\", \"SIP Accounts\", and \"User " ++"Accounts\" sub-sections. You must add at least one User Account to this PBX, " ++"and then configure a SIP device or softphone to use the account, in order to " ++"make and receive calls with your Google/SIP accounts. Configuring multiple " ++"users will allow you to make free calls between all users, and share the " ++"configured Google and SIP accounts. If you have more than one Google and SIP " ++"accounts set up, you should probably configure how calls to and from them " ++"are routed in the \"Call Routing\" page. If you're interested in using your " ++"own PBX from anywhere in the world, then visit the \"Remote Usage\" section " ++"in the \"Advanced Settings\" page." ++msgstr "" ++ ++msgid "" ++"This is the name that the VoIP server will use to identify itself when " ++"registering to VoIP (SIP) providers. Some providers require this to a " ++"specific string matching a hardware SIP device." ++msgstr "" ++ ++msgid "" ++"This is where you indicate which Google/SIP accounts are used to call what " ++"country/area codes, which users can use what SIP/Google accounts, how " ++"incoming calls are routed, what numbers can get into this PBX with a " ++"password, and what numbers are blacklisted." ++msgstr "" ++ ++msgid "" ++"This is where you set up your Google (Talk and Voice) Accounts, in order to " ++"start using them for dialing and receiving calls (voice chat and real phone " ++"calls). Please make at least one voice call using the Google Talk plugin " ++"installable through the GMail interface, and then log out from your account " ++"everywhere. Click \"Add\" to add as many accounts as you wish." ++msgstr "" ++ ++msgid "" ++"This is where you set up your SIP (VoIP) accounts ts like Sipgate, " ++"SipSorcery, the popular Betamax providers, and any other providers with SIP " ++"settings in order to start using them for dialing and receiving calls (SIP " ++"uri and real phone calls). Click \"Add\" to add as many accounts as you wish." ++msgstr "" ++ ++msgid "" ++"This option should be set to \"Yes\" if you have a DID (real telephone " ++"number) associated with this SIP account or want to receive SIP uri calls " ++"through this provider." ++msgstr "" ++ ++msgid "" ++"This section contains settings that do not need to be changed under normal " ++"circumstances. In addition, here you can configure your system for use with " ++"remote SIP devices, and resolve call quality issues by enabling the " ++"insertion of QoS rules." ++msgstr "" ++ ++msgid "" ++"Use (four to five digit) numeric user name if you are connecting normal " ++"telephones with ATAs to this system (so they can dial user names)." ++msgstr "" ++ ++msgid "" ++"Use this account to make outgoing calls as configured in the \"Call Routing" ++"\" section." ++msgstr "" ++ ++msgid "Use this account to make outgoing calls." ++msgstr "" ++ ++msgid "User Accounts" ++msgstr "" ++ ++msgid "User Agent String" ++msgstr "" ++ ++msgid "User Name" ++msgstr "" ++ ++msgid "Uses providers enabled for outgoing calls" ++msgstr "" ++ ++msgid "" ++"When somebody starts voice chat with your GTalk account or calls the GVoice, " ++"number (if you have Google Voice), the call will be forwarded to any users " ++"that are online (registered using a SIP device or softphone) and permitted " ++"to receive the call. If you have Google Voice, you must go to your GVoice " ++"settings and forward calls to Google chat in order to actually receive calls " ++"made to your GVoice number. If you have trouble receiving calls from GVoice, " ++"experiment with the Call Screening option in your GVoice Settings. Finally, " ++"make sure no other client is online with this account (browser in gmail, " ++"mobile/desktop Google Talk App) as it may interfere." ++msgstr "" ++ ++msgid "" ++"When your password is saved, it disappears from this field and is not " ++"displayed for your protection. The previously saved password will be changed " ++"only when you enter a value different from the saved one." ++msgstr "" ++ ++msgid "Yes" ++msgstr "" ++ ++msgid "" ++"You can enter your domain name, external IP address, or dynamic domain name " ++"here. The best thing to input is a static IP address. If your IP address is " ++"dynamic and it changes, your configuration will become invalid. Hence, it's " ++"recommended to set up Dynamic DNS in this case. and enter your Dynamic DNS " ++"hostname here. You can configure Dynamic DNS with the luci-app-ddns package." ++msgstr "" ++ ++msgid "You can specify a real name to show up in the Caller ID here." ++msgstr "" ++ ++msgid "" ++"You can use your SIP devices/softphones with this system from a remote " ++"location as well, as long as your Internet Service Provider gives you a " ++"public IP. You will be able to call other local users for free (e.g. other " ++"Analog Telephone Adapters (ATAs)) and use your VoIP providers to make calls " ++"as if you were local to the PBX. After configuring this tab, go back to " ++"where users are configured and see the new Server and Port setting you need " ++"to configure the remote SIP devices with. Please note that if this PBX is " ++"not running on your router/gateway, you will need to configure port " ++"forwarding (NAT) on your router/gateway. Please forward the ports below (SIP " ++"port and RTP range) to the IP address of the device running this PBX." ++msgstr "" ++ ++msgid "" ++"Your PIN disappears when saved for your protection. It will be changed only " ++"when you enter a value different from the saved one. Leaving the PIN empty " ++"is possible, but please beware of the security implications." ++msgstr "" ++ ++msgid "" ++"Your password disappears when saved for your protection. It will be changed " ++"only when you enter a value different from the saved one." ++msgstr "" ++ ++#~ msgid "Account Status" ++#~ msgstr "Κατάσταση ΛογαÏιασμοÏ" ++ ++#~ msgid "Account Status Message" ++#~ msgstr "Μήνυμα Κατάστασης ΛογαÏιασμοÏ" +diff --git a/feeds/luci/applications/luci-app-pbx/po/en/pbx.po b/feeds/luci/applications/luci-app-pbx/po/en/pbx.po +new file mode 100644 +index 0000000..8b995e1 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-pbx/po/en/pbx.po +@@ -0,0 +1,502 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Last-Translator: Automatically generated\n" ++"Language-Team: none\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n != 1);\n" ++ ++msgid "Advanced Settings" ++msgstr "Advanced Settings" ++ ++msgid "Available" ++msgstr "Available" ++ ++msgid "" ++"Avoid using anything but alpha-numeric characters, space, comma, and period." ++msgstr "" ++"Avoid using anything but alpha-numeric characters, space, comma, and period." ++ ++msgid "Away" ++msgstr "Away" ++ ++msgid "Blacklisted Numbers" ++msgstr "Blacklisted Numbers" ++ ++msgid "Call Routing" ++msgstr "Call Routing" ++ ++msgid "Call-back Numbers" ++msgstr "" ++ ++msgid "Call-back Provider" ++msgstr "" ++ ++msgid "Call-through Numbers" ++msgstr "Call-through Numbers" ++ ++msgid "Copy-paste large lists of numbers here." ++msgstr "Copy-paste large lists of numbers here." ++ ++msgid "" ++"Designate numbers that are allowed to call through this system and which " ++"user's privileges they will have." ++msgstr "" ++ ++msgid "" ++"Designate numbers to whom the system will hang up and call back, which " ++"provider will be used to call them, and which user's privileges will be " ++"granted to them." ++msgstr "" ++ ++msgid "Dials numbers unmatched elsewhere" ++msgstr "" ++ ++msgid "Do Not Disturb" ++msgstr "Do Not Disturb" ++ ++msgid "Domain/IP Address/Dynamic Domain" ++msgstr "" ++ ++msgid "Dynamic List of Blacklisted Numbers" ++msgstr "Dynamic List of Blacklisted Numbers" ++ ++msgid "Email" ++msgstr "Email" ++ ++msgid "Enable Incoming Calls (Register via SIP)" ++msgstr "Enable Incoming Calls (Register via SIP)" ++ ++msgid "Enable Incoming Calls (set Status below)" ++msgstr "" ++ ++msgid "Enable Outgoing Calls" ++msgstr "Enable Outgoing Calls" ++ ++msgid "Enabled" ++msgstr "Enabled" ++ ++msgid "" ++"Enter a VoIP provider to use for call-back in the format username@some.host." ++"name, as listed in \"Outgoing Calls\" above. It's easiest to copy and paste " ++"the providers from above. Invalid entries, including providers not enabled " ++"for outgoing calls, will be rejected silently." ++msgstr "" ++ ++msgid "" ++"Enter phone numbers that you want to decline calls from automatically. You " ++"should probably omit the country code and any leading zeroes, but please " ++"experiment to make sure you are blocking numbers from your desired area " ++"successfully." ++msgstr "" ++ ++msgid "" ++"Enter this IP (or IP:port) in the Server/Registrar setting of SIP devices " ++"you will use ONLY locally and never from a remote location." ++msgstr "" ++ ++msgid "" ++"Enter this hostname (or hostname:port) in the Server/Registrar setting of " ++"SIP devices you will use from a remote location (they will work locally too)." ++msgstr "" ++ ++msgid "External SIP Port" ++msgstr "External SIP Port" ++ ++msgid "" ++"For each provider enabled for incoming calls, here you can restrict which " ++"users to ring on incoming calls. If the list is empty, the system will " ++"indicate that all users enabled for incoming calls will ring. Invalid " ++"usernames will be rejected silently. Also, entering a username here " ++"overrides the user's setting to not receive incoming calls. This way, you " ++"can make certain users ring only for specific providers. Entries can be made " ++"in a space-separated list, and/or one per line by hitting enter after every " ++"one." ++msgstr "" ++ ++msgid "" ++"For each user enabled for outgoing calls you can restrict what providers the " ++"user can use for outgoing calls. By default all users can use all providers. " ++"To show up in the list below the user should be allowed to make outgoing " ++"calls in the \"User Accounts\" page. Enter VoIP providers in the format " ++"username@some.host.name, as listed in \"Outgoing Calls\" above. It's easiest " ++"to copy and paste the providers from above. Invalid entries, including " ++"providers not enabled for outgoing calls, will be rejected silently. Entries " ++"can be made in a space-separated list, and/or one per line by hitting enter " ++"after every one." ++msgstr "" ++ ++msgid "Full Name" ++msgstr "Full Name" ++ ++msgid "General Settings" ++msgstr "General Settings" ++ ++msgid "Google Accounts" ++msgstr "Google Accounts" ++ ++msgid "Google Talk Status" ++msgstr "" ++ ++msgid "Google Talk Status Message" ++msgstr "" ++ ++msgid "Google Voice/Talk Accounts" ++msgstr "Google Voice/Talk Accounts" ++ ++msgid "Hang-up Delay" ++msgstr "" ++ ++msgid "" ++"Here you must configure at least one SIP account, that you will use to " ++"register with this service. Use this account either in an Analog Telephony " ++"Adapter (ATA), or in a SIP software like CSipSimple, Linphone, or Sipdroid " ++"on your smartphone, or Ekiga, Linphone, or X-Lite on your computer. By " ++"default, all SIP accounts will ring simultaneously if a call is made to one " ++"of your VoIP provider accounts or GV numbers." ++msgstr "" ++ ++msgid "" ++"How long to wait before hanging up. If the provider you use to dial " ++"automatically forwards to voicemail, you can set this value to a delay that " ++"will allow you to hang up before your call gets forwarded and you get billed " ++"for it." ++msgstr "" ++ ++msgid "" ++"If setting Server/Registrar to %s or %s does not work for you, try setting " ++"it to %s or %s and entering this port number in a separate field that " ++"specifies the Server/Registrar port number. Beware that some devices have a " ++"confusing setting that sets the port where SIP requests originate from on " ++"the SIP device itself (the bind port). The port specified on this page is " ++"NOT this bind port but the port this service listens on." ++msgstr "" ++ ++msgid "" ++"If you experience jittery or high latency audio during heavy downloads, you " ++"may want to enable QoS. QoS prioritizes traffic to and from your network for " ++"specified ports and IP addresses, resulting in better latency and throughput " ++"for sound in our case. If enabled below, a QoS rule for this service will be " ++"configured by the PBX automatically, but you must visit the QoS " ++"configuration page (Network->QoS) to configure other critical QoS settings " ++"like Download and Upload speed." ++msgstr "" ++ ++msgid "" ++"If you have more than one account that can make outgoing calls, you should " ++"enter a list of phone numbers and/or prefixes in the following fields for " ++"each provider listed. Invalid prefixes are removed silently, and only 0-9, " ++"X, Z, N, #, *, and + are valid characters. The letter X matches 0-9, Z " ++"matches 1-9, and N matches 2-9. For example to make calls to Germany through " ++"a provider, you can enter 49. To make calls to North America, you can enter " ++"1NXXNXXXXXX. If one of your providers can make \"local\" calls to an area " ++"code like New York's 646, you can enter 646NXXXXXX for that provider. You " ++"should leave one account with an empty list to make calls with it by " ++"default, if no other provider's prefixes match. The system will " ++"automatically replace an empty list with a message that the provider dials " ++"all numbers not matched by another provider's prefixes. Be as specific as " ++"possible (i.e. 1NXXNXXXXXX is better than 1). Please note all international " ++"dial codes are discarded (e.g. 00, 011, 010, 0011). Entries can be made in a " ++"space-separated list, and/or one per line by hitting enter after every one." ++msgstr "" ++ ++msgid "Incoming Calls" ++msgstr "Incoming Calls" ++ ++msgid "Insert QoS Rules" ++msgstr "Insert QoS Rules" ++ ++msgid "Makes Outgoing Calls" ++msgstr "Makes Outgoing Calls" ++ ++msgid "NOTE: There are no Google or SIP provider accounts configured." ++msgstr "" ++ ++msgid "" ++"NOTE: There are no Google or SIP provider accounts enabled for incoming " ++"calls." ++msgstr "" ++ ++msgid "" ++"NOTE: There are no Google or SIP provider accounts enabled for outgoing " ++"calls." ++msgstr "" ++ ++msgid "NOTE: There are no local user accounts configured." ++msgstr "" ++ ++msgid "NOTE: There are no local user accounts enabled for outgoing calls." ++msgstr "" ++ ++msgid "No" ++msgstr "No" ++ ++msgid "Number of Seconds to Ring" ++msgstr "" ++ ++msgid "Outbound Proxy" ++msgstr "Outbound Proxy" ++ ++msgid "Outgoing Calls" ++msgstr "Outgoing Calls" ++ ++msgid "PBX Main Page" ++msgstr "PBX Main Page" ++ ++msgid "PBX Service Status" ++msgstr "" ++ ++msgid "PIN" ++msgstr "PIN" ++ ++msgid "Password" ++msgstr "Password" ++ ++msgid "" ++"Pick a random port number between 6500 and 9500 for the service to listen " ++"on. Do not pick the standard 5060, because it is often subject to brute-" ++"force attacks. When finished, (1) click \"Save and Apply\", and (2) look in " ++"the \"SIP Device/Softphone Accounts\" section for updated Server and Port " ++"settings for your SIP Devices/Softphones." ++msgstr "" ++ ++msgid "Port Setting for SIP Devices" ++msgstr "Port Setting for SIP Devices" ++ ++msgid "Providers Used for Outgoing Calls" ++msgstr "Providers Used for Outgoing Calls" ++ ++msgid "QoS Settings" ++msgstr "QoS Settings" ++ ++msgid "RTP Port Range End" ++msgstr "RTP Port Range End" ++ ++msgid "RTP Port Range Start" ++msgstr "RTP Port Range Start" ++ ++msgid "" ++"RTP traffic carries actual voice packets. This is the start of the port " ++"range that will be used for setting up RTP communication. It's usually OK to " ++"leave this at the default value." ++msgstr "" ++ ++msgid "Receives Incoming Calls" ++msgstr "Receives Incoming Calls" ++ ++msgid "Remote Usage" ++msgstr "Remote Usage" ++ ++msgid "Rings users enabled for incoming calls" ++msgstr "" ++ ++msgid "SIP Accounts" ++msgstr "SIP Accounts" ++ ++msgid "SIP Device/Softphone Accounts" ++msgstr "SIP Device/Softphone Accounts" ++ ++msgid "SIP Provider Accounts" ++msgstr "SIP Provider Accounts" ++ ++msgid "SIP Realm (needed by some providers)" ++msgstr "SIP Realm (needed by some providers)" ++ ++msgid "SIP Server/Registrar" ++msgstr "SIP Server/Registrar" ++ ++msgid "SIP Server/Registrar Port" ++msgstr "SIP Server/Registrar Port" ++ ++msgid "Server Setting" ++msgstr "Server Setting" ++ ++msgid "Server Setting for Local SIP Devices" ++msgstr "Server Setting for Local SIP Devices" ++ ++msgid "Server Setting for Remote SIP Devices" ++msgstr "Server Setting for Remote SIP Devices" ++ ++msgid "Service Status" ++msgstr "Service Status" ++ ++msgid "" ++"Set the number of seconds to ring users upon incoming calls before hanging " ++"up or going to voicemail, if the voicemail is installed and enabled." ++msgstr "" ++ ++msgid "Space-Separated List of Blacklisted Numbers" ++msgstr "Space-Separated List of Blacklisted Numbers" ++ ++msgid "Specify numbers individually here. Press enter to add more numbers." ++msgstr "Specify numbers individually here. Press enter to add more numbers." ++ ++msgid "" ++"Specify numbers individually here. Press enter to add more numbers. You will " ++"have to experiment with what country and area codes you need to add to the " ++"number." ++msgstr "" ++ ++msgid "" ++"The number(s) specified above will be able to dial out with this user's " ++"providers. Invalid usernames, including users not enabled for outgoing " ++"calls, are dropped silently. Please verify that the entry was accepted." ++msgstr "" ++ ++msgid "" ++"This configuration page allows you to configure a phone system (PBX) service " ++"which permits making phone calls through multiple Google and SIP (like " ++"Sipgate, SipSorcery, and Betamax) accounts and sharing them among many SIP " ++"devices. Note that Google accounts, SIP accounts, and local user accounts " ++"are configured in the \"Google Accounts\", \"SIP Accounts\", and \"User " ++"Accounts\" sub-sections. You must add at least one User Account to this PBX, " ++"and then configure a SIP device or softphone to use the account, in order to " ++"make and receive calls with your Google/SIP accounts. Configuring multiple " ++"users will allow you to make free calls between all users, and share the " ++"configured Google and SIP accounts. If you have more than one Google and SIP " ++"accounts set up, you should probably configure how calls to and from them " ++"are routed in the \"Call Routing\" page. If you're interested in using your " ++"own PBX from anywhere in the world, then visit the \"Remote Usage\" section " ++"in the \"Advanced Settings\" page." ++msgstr "" ++ ++msgid "" ++"This is the name that the VoIP server will use to identify itself when " ++"registering to VoIP (SIP) providers. Some providers require this to a " ++"specific string matching a hardware SIP device." ++msgstr "" ++ ++msgid "" ++"This is where you indicate which Google/SIP accounts are used to call what " ++"country/area codes, which users can use what SIP/Google accounts, how " ++"incoming calls are routed, what numbers can get into this PBX with a " ++"password, and what numbers are blacklisted." ++msgstr "" ++ ++msgid "" ++"This is where you set up your Google (Talk and Voice) Accounts, in order to " ++"start using them for dialing and receiving calls (voice chat and real phone " ++"calls). Please make at least one voice call using the Google Talk plugin " ++"installable through the GMail interface, and then log out from your account " ++"everywhere. Click \"Add\" to add as many accounts as you wish." ++msgstr "" ++ ++msgid "" ++"This is where you set up your SIP (VoIP) accounts ts like Sipgate, " ++"SipSorcery, the popular Betamax providers, and any other providers with SIP " ++"settings in order to start using them for dialing and receiving calls (SIP " ++"uri and real phone calls). Click \"Add\" to add as many accounts as you wish." ++msgstr "" ++ ++msgid "" ++"This option should be set to \"Yes\" if you have a DID (real telephone " ++"number) associated with this SIP account or want to receive SIP uri calls " ++"through this provider." ++msgstr "" ++ ++msgid "" ++"This section contains settings that do not need to be changed under normal " ++"circumstances. In addition, here you can configure your system for use with " ++"remote SIP devices, and resolve call quality issues by enabling the " ++"insertion of QoS rules." ++msgstr "" ++ ++msgid "" ++"Use (four to five digit) numeric user name if you are connecting normal " ++"telephones with ATAs to this system (so they can dial user names)." ++msgstr "" ++ ++msgid "" ++"Use this account to make outgoing calls as configured in the \"Call Routing" ++"\" section." ++msgstr "" ++"Use this account to make outgoing calls as configured in the \"Call Routing" ++"\" section." ++ ++msgid "Use this account to make outgoing calls." ++msgstr "Use this account to make outgoing calls." ++ ++msgid "User Accounts" ++msgstr "User Accounts" ++ ++msgid "User Agent String" ++msgstr "User Agent String" ++ ++msgid "User Name" ++msgstr "User Name" ++ ++msgid "Uses providers enabled for outgoing calls" ++msgstr "" ++ ++msgid "" ++"When somebody starts voice chat with your GTalk account or calls the GVoice, " ++"number (if you have Google Voice), the call will be forwarded to any users " ++"that are online (registered using a SIP device or softphone) and permitted " ++"to receive the call. If you have Google Voice, you must go to your GVoice " ++"settings and forward calls to Google chat in order to actually receive calls " ++"made to your GVoice number. If you have trouble receiving calls from GVoice, " ++"experiment with the Call Screening option in your GVoice Settings. Finally, " ++"make sure no other client is online with this account (browser in gmail, " ++"mobile/desktop Google Talk App) as it may interfere." ++msgstr "" ++ ++msgid "" ++"When your password is saved, it disappears from this field and is not " ++"displayed for your protection. The previously saved password will be changed " ++"only when you enter a value different from the saved one." ++msgstr "" ++ ++msgid "Yes" ++msgstr "Yes" ++ ++msgid "" ++"You can enter your domain name, external IP address, or dynamic domain name " ++"here. The best thing to input is a static IP address. If your IP address is " ++"dynamic and it changes, your configuration will become invalid. Hence, it's " ++"recommended to set up Dynamic DNS in this case. and enter your Dynamic DNS " ++"hostname here. You can configure Dynamic DNS with the luci-app-ddns package." ++msgstr "" ++ ++msgid "You can specify a real name to show up in the Caller ID here." ++msgstr "You can specify a real name to show up in the Caller ID here." ++ ++msgid "" ++"You can use your SIP devices/softphones with this system from a remote " ++"location as well, as long as your Internet Service Provider gives you a " ++"public IP. You will be able to call other local users for free (e.g. other " ++"Analog Telephone Adapters (ATAs)) and use your VoIP providers to make calls " ++"as if you were local to the PBX. After configuring this tab, go back to " ++"where users are configured and see the new Server and Port setting you need " ++"to configure the remote SIP devices with. Please note that if this PBX is " ++"not running on your router/gateway, you will need to configure port " ++"forwarding (NAT) on your router/gateway. Please forward the ports below (SIP " ++"port and RTP range) to the IP address of the device running this PBX." ++msgstr "" ++ ++msgid "" ++"Your PIN disappears when saved for your protection. It will be changed only " ++"when you enter a value different from the saved one. Leaving the PIN empty " ++"is possible, but please beware of the security implications." ++msgstr "" ++ ++msgid "" ++"Your password disappears when saved for your protection. It will be changed " ++"only when you enter a value different from the saved one." ++msgstr "" ++ ++#~ msgid "Account Status" ++#~ msgstr "Account Status" ++ ++#~ msgid "Account Status Message" ++#~ msgstr "Account Status Message" ++ ++#~ msgid "Domain Name/Dynamic Domain Name" ++#~ msgstr "Domain Name/Dynamic Domain Name" ++ ++#~ msgid "Enable Incoming Calls (See Status, Message below)" ++#~ msgstr "Enable Incoming Calls (See Status, Message below)" ++ ++#~ msgid "Service Control and Connection Status" ++#~ msgstr "Service Control and Connection Status" +diff --git a/feeds/luci/applications/luci-app-pbx/po/es/pbx.po b/feeds/luci/applications/luci-app-pbx/po/es/pbx.po +new file mode 100644 +index 0000000..8071b61 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-pbx/po/es/pbx.po +@@ -0,0 +1,677 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"PO-Revision-Date: 2014-06-15 13:15+0200\n" ++"Last-Translator: José Vicente \n" ++"Language-Team: none\n" ++"Language: es\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n != 1);\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "Advanced Settings" ++msgstr "Configuración avanzada" ++ ++msgid "Available" ++msgstr "Disponible" ++ ++msgid "" ++"Avoid using anything but alpha-numeric characters, space, comma, and period." ++msgstr "Usar sólo caracteres alfanuméricos, espacio, coma y punto." ++ ++msgid "Away" ++msgstr "No disponible" ++ ++msgid "Blacklisted Numbers" ++msgstr "Lista negra" ++ ++msgid "Call Routing" ++msgstr "Enrutado de llamadas" ++ ++msgid "Call-back Numbers" ++msgstr "Números de call-back" ++ ++msgid "Call-back Provider" ++msgstr "Proveedor de call-back" ++ ++msgid "Call-through Numbers" ++msgstr "Números call-through" ++ ++msgid "Copy-paste large lists of numbers here." ++msgstr "Pegue aquí grandes listas de números." ++ ++msgid "" ++"Designate numbers that are allowed to call through this system and which " ++"user's privileges they will have." ++msgstr "" ++"Listar los números a los que se permitirá llamar desde este sistema y qué " ++"privilegios de usuario tendrán." ++ ++msgid "" ++"Designate numbers to whom the system will hang up and call back, which " ++"provider will be used to call them, and which user's privileges will be " ++"granted to them." ++msgstr "" ++"Listar los números a los que el sistema colgará y volverá a llamar, qué " ++"proveedor se usará para llamarles y qué privilegios de usuario se les dará." ++ ++msgid "Dials numbers unmatched elsewhere" ++msgstr "Marca el resto de números en cualquier lugar" ++ ++msgid "Do Not Disturb" ++msgstr "No molestar" ++ ++msgid "Domain/IP Address/Dynamic Domain" ++msgstr "Dominio/Dirección IP/Dominio dinámico" ++ ++msgid "Dynamic List of Blacklisted Numbers" ++msgstr "Lista dinámica de números en lista negra" ++ ++msgid "Email" ++msgstr "e-mail" ++ ++msgid "Enable Incoming Calls (Register via SIP)" ++msgstr "Permitir llamadas entrantes (registrar vía SIP)" ++ ++msgid "Enable Incoming Calls (set Status below)" ++msgstr "Permitir llamadas entrantes (ver estado abajo)" ++ ++msgid "Enable Outgoing Calls" ++msgstr "Permitir llamadas salientes" ++ ++msgid "Enabled" ++msgstr "Activado" ++ ++msgid "" ++"Enter a VoIP provider to use for call-back in the format username@some.host." ++"name, as listed in \"Outgoing Calls\" above. It's easiest to copy and paste " ++"the providers from above. Invalid entries, including providers not enabled " ++"for outgoing calls, will be rejected silently." ++msgstr "" ++"Proveedor VoIP para callbacks en formato nombredeusuario@algun.nombre.host, " ++"tal y como se detalla arriba en \"Llamadas salientes\". Puede copiar y pegar " ++"los proveedores desde ahí. Las entradas no válidas, incluyendo a proveedores " ++"no habilitados para llamadas saliente, serán rechazadas sin mostrar aviso." ++ ++msgid "" ++"Enter phone numbers that you want to decline calls from automatically. You " ++"should probably omit the country code and any leading zeroes, but please " ++"experiment to make sure you are blocking numbers from your desired area " ++"successfully." ++msgstr "" ++"Números de teléfono de los que se reclina la llamada automáticamente. Es " ++"posible que tenga que omitir el código de país y ceros precedentes, pero " ++"experimente para asegurarse que bloquea los números correctamente." ++ ++msgid "" ++"Enter this IP (or IP:port) in the Server/Registrar setting of SIP devices " ++"you will use ONLY locally and never from a remote location." ++msgstr "" ++"Ponga esta IP (o IP:puerto) en el parámetro Servidor/Registrador de los " ++"dispositivos SIP que usará SOLO localmente y nunca desde una posición remota." ++ ++msgid "" ++"Enter this hostname (or hostname:port) in the Server/Registrar setting of " ++"SIP devices you will use from a remote location (they will work locally too)." ++msgstr "" ++"Ponga este nombre de máquina en el parámetro Servidor/Registrador de los " ++"dispositivos SIP que usará desde posiciones remotas (también vale " ++"localmente)." ++ ++msgid "External SIP Port" ++msgstr "Puerto externo SIP" ++ ++msgid "" ++"For each provider enabled for incoming calls, here you can restrict which " ++"users to ring on incoming calls. If the list is empty, the system will " ++"indicate that all users enabled for incoming calls will ring. Invalid " ++"usernames will be rejected silently. Also, entering a username here " ++"overrides the user's setting to not receive incoming calls. This way, you " ++"can make certain users ring only for specific providers. Entries can be made " ++"in a space-separated list, and/or one per line by hitting enter after every " ++"one." ++msgstr "" ++"Para cada proveedor al que se habilita a hacer llamadas entrantes puede " ++"restringir a qué usuarios llamar. Si se deja vacío el sistema indicará que " ++"llamará a todos los usuarios que puedan recibir llamadas entrantes. Los " ++"nombres de usuario no válidos se rechazarán sin aviso. Estos nombres de " ++"usuario hacen ignorar la configuración de usuario de no recibir llamadas. De " ++"esta manera puede hacer que a ciertos usuarios sólo les llamen ciertos " ++"proveedores. Puede separar los nombres con espacios o poniéndolos en líneas " ++"diferentes." ++ ++msgid "" ++"For each user enabled for outgoing calls you can restrict what providers the " ++"user can use for outgoing calls. By default all users can use all providers. " ++"To show up in the list below the user should be allowed to make outgoing " ++"calls in the \"User Accounts\" page. Enter VoIP providers in the format " ++"username@some.host.name, as listed in \"Outgoing Calls\" above. It's easiest " ++"to copy and paste the providers from above. Invalid entries, including " ++"providers not enabled for outgoing calls, will be rejected silently. Entries " ++"can be made in a space-separated list, and/or one per line by hitting enter " ++"after every one." ++msgstr "" ++"Para cada usuario habilitado a hacer llamadas salientes puede restringir qué " ++"proveedores usar. Por defecto todos los usuarios pueden usar a todos los " ++"proveedores. Para mostrarse en la lista el usuario debe poder hacer llamadas " ++"salientes (ver página \"Cuentas de usuario\"). Ponga los proveedores en " ++"formato username@some.host.name igual que se listan en \"Llamadas salientes" ++"\" arriba. Los nombres no válidos se rechazarán sin aviso.Puede separar los " ++"nombres con espacios o poniéndolos en líneas diferentes." ++ ++msgid "Full Name" ++msgstr "Nombre completo" ++ ++msgid "General Settings" ++msgstr "Configuración general" ++ ++msgid "Google Accounts" ++msgstr "Cuentas en google" ++ ++msgid "Google Talk Status" ++msgstr "Estado de Google Talk" ++ ++msgid "Google Talk Status Message" ++msgstr "Mensaje de estado de Google Talk" ++ ++msgid "Google Voice/Talk Accounts" ++msgstr "Cuentas Google Voice/Talk" ++ ++msgid "Hang-up Delay" ++msgstr "Retraso para descolgar" ++ ++msgid "" ++"Here you must configure at least one SIP account, that you will use to " ++"register with this service. Use this account either in an Analog Telephony " ++"Adapter (ATA), or in a SIP software like CSipSimple, Linphone, or Sipdroid " ++"on your smartphone, or Ekiga, Linphone, or X-Lite on your computer. By " ++"default, all SIP accounts will ring simultaneously if a call is made to one " ++"of your VoIP provider accounts or GV numbers." ++msgstr "" ++"Configure una cuenta SIP que usará para conectar con este servicio. Úsela " ++"tanpo en un adaptador de telefonía analógico (ATA) o en un programa SIP como " ++"CSipSimple, Linphone, o Sipdroid para smartphones, o Ekiga, Linphone, o X-" ++"Lite para ordenadores. Por defecto, todas las cuentas SIP sonarán a la vez " ++"si se hace una llamada desde una de las cuentas de su proveedor de VoIP o " ++"números GV." ++ ++msgid "" ++"How long to wait before hanging up. If the provider you use to dial " ++"automatically forwards to voicemail, you can set this value to a delay that " ++"will allow you to hang up before your call gets forwarded and you get billed " ++"for it." ++msgstr "" ++"Cuánto esperar antes de descolgar. Si el proveedor que usas para marcar " ++"automáticamente desvía a un correo de voz puedes ajustar este valor con un " ++"retraso que permitirá descolgar antes de que se desvíe la llamada y se " ++"facture." ++ ++msgid "" ++"If setting Server/Registrar to %s or %s does not work for you, try setting " ++"it to %s or %s and entering this port number in a separate field that " ++"specifies the Server/Registrar port number. Beware that some devices have a " ++"confusing setting that sets the port where SIP requests originate from on " ++"the SIP device itself (the bind port). The port specified on this page is " ++"NOT this bind port but the port this service listens on." ++msgstr "" ++"Si la configuración Servidor/Registrador en %s o %s no le funciona, prueba a " ++"poner %s o %s e introduzca este número de puerto en un campo separado que " ++"especifique el número de puerto del Servidor/Registrador. Algunos " ++"dispositivos tienen una configuración extraña que muestra este puerto desde " ++"el que el SIP origina peticiones en el mismo dispositivo SIP (el puerto " ++"asociado). El puerto que está configurando aquí NO es este puerto asociado " ++"sino el puerto en el que el servicio escucha." ++ ++msgid "" ++"If you experience jittery or high latency audio during heavy downloads, you " ++"may want to enable QoS. QoS prioritizes traffic to and from your network for " ++"specified ports and IP addresses, resulting in better latency and throughput " ++"for sound in our case. If enabled below, a QoS rule for this service will be " ++"configured by the PBX automatically, but you must visit the QoS " ++"configuration page (Network->QoS) to configure other critical QoS settings " ++"like Download and Upload speed." ++msgstr "" ++"Si nota saltos o retrasos en el audio mientras realiza descargas puede " ++"querer activar QoS. QoS prioriza el tráfico a y desde su red para ciertos " ++"puertos y direcciones IP mejorando la latencia y el rendimiento del sonido " ++"en dicho caso. Al activarlo el PBX creará una regla QoS para este servicio, " ++"pero deberá rellenar en la página de configuración de QoS (Red/QoS) otros " ++"parámetros necesarios como la velocidad de subida y la de bajada." ++ ++msgid "" ++"If you have more than one account that can make outgoing calls, you should " ++"enter a list of phone numbers and/or prefixes in the following fields for " ++"each provider listed. Invalid prefixes are removed silently, and only 0-9, " ++"X, Z, N, #, *, and + are valid characters. The letter X matches 0-9, Z " ++"matches 1-9, and N matches 2-9. For example to make calls to Germany through " ++"a provider, you can enter 49. To make calls to North America, you can enter " ++"1NXXNXXXXXX. If one of your providers can make \"local\" calls to an area " ++"code like New York's 646, you can enter 646NXXXXXX for that provider. You " ++"should leave one account with an empty list to make calls with it by " ++"default, if no other provider's prefixes match. The system will " ++"automatically replace an empty list with a message that the provider dials " ++"all numbers not matched by another provider's prefixes. Be as specific as " ++"possible (i.e. 1NXXNXXXXXX is better than 1). Please note all international " ++"dial codes are discarded (e.g. 00, 011, 010, 0011). Entries can be made in a " ++"space-separated list, and/or one per line by hitting enter after every one." ++msgstr "" ++"Si tiene más de una cuenta para hacer llamadas salientes, debe introducir " ++"una lista de números de teléfono y/o prefijos para cada proveedor. Los " ++"prefijos no válidos se rechazarán sin aviso y solo son caracteres válidos " ++"0-9, X, Z, N, #, *, y +. La letra X equivale a 0-9, Z a 1-9 y N a 2-9. Por " ++"ejemplo para hacer llamadas a Alemania con su proveedor debe introducir 49. " ++"Para hacer llamadas a Estados Unidos 1NXXNXXXXXX. Si uno de sus proveedores " ++"puede hacer llamadas locales a un código de área como el 646 de Nueva York " ++"debe introducir 646NXXXXXX para ese proveedor. Debería dehar una cuenta con " ++"una lista vacía para que haga las llamadas por defecto en caso de que ningún " ++"prefijo encaje. El sistema reemplazará automáticamente la lista vacía con el " ++"mensaje de que el proveedor marca todos los números que no estén en los " ++"prefijos de otros proveedores. Sea todo lo específico que pueda (ej. " ++"1NXXNXXXXXX es mejor que 1). Todos los códigos internaciones de marcado se " ++"descartan (ej. 00, 011, 010, 0011). Las entradas pueden ser una lista " ++"separada por espacios y/o cambios de línea." ++ ++msgid "Incoming Calls" ++msgstr "Llamadas entrantes" ++ ++msgid "Insert QoS Rules" ++msgstr "Reglas QoS" ++ ++msgid "Makes Outgoing Calls" ++msgstr "Realizar llamadas salientes" ++ ++msgid "NOTE: There are no Google or SIP provider accounts configured." ++msgstr "NOTA: Sin cuentas configuradas de Google o porveedor SIP." ++ ++msgid "" ++"NOTE: There are no Google or SIP provider accounts enabled for incoming " ++"calls." ++msgstr "" ++"NOTA: Sin cuentas configuradas de Google o porveedor SIP para llamadas " ++"entrantes." ++ ++msgid "" ++"NOTE: There are no Google or SIP provider accounts enabled for outgoing " ++"calls." ++msgstr "" ++"NOTA: Sin cuentas configuradas de Google o porveedor SIP para llamadas " ++"salientes." ++ ++msgid "NOTE: There are no local user accounts configured." ++msgstr "NOTA: Sin cuentas locales configuradas." ++ ++msgid "NOTE: There are no local user accounts enabled for outgoing calls." ++msgstr "NOTA: Sin cuentas locales habilitadas para llamadas saientes." ++ ++msgid "No" ++msgstr "No" ++ ++msgid "Number of Seconds to Ring" ++msgstr "Número de segundos a sonar" ++ ++msgid "Outbound Proxy" ++msgstr "Proxy saliente" ++ ++msgid "Outgoing Calls" ++msgstr "Llamadas salientes" ++ ++msgid "PBX Main Page" ++msgstr "Página principal de PBX" ++ ++msgid "PBX Service Status" ++msgstr "Estado del servicio PBX" ++ ++msgid "PIN" ++msgstr "PIN" ++ ++msgid "Password" ++msgstr "Contraseña" ++ ++msgid "" ++"Pick a random port number between 6500 and 9500 for the service to listen " ++"on. Do not pick the standard 5060, because it is often subject to brute-" ++"force attacks. When finished, (1) click \"Save and Apply\", and (2) look in " ++"the \"SIP Device/Softphone Accounts\" section for updated Server and Port " ++"settings for your SIP Devices/Softphones." ++msgstr "" ++"Escoge un número de puerto aleatorio entre 6500 y 9500 para el servicio. No " ++"elijas el estándar 5060 ya que es objeto, a menudo, de ataques por fuerza " ++"bruta. Cuando hayas terminado pulsa en \"Salvar y aplicar\" y busca en la " ++"sección \"Cuentas SIP del dispositivo/softphone\" el puerto actual para tus " ++"dispositivos/softphones SIP." ++ ++msgid "Port Setting for SIP Devices" ++msgstr "Configuración de puerto para dispositivos SIP" ++ ++msgid "Providers Used for Outgoing Calls" ++msgstr "Proveedores usados para llamadas salientess" ++ ++msgid "QoS Settings" ++msgstr "Configuración de QoS" ++ ++msgid "RTP Port Range End" ++msgstr "Fin del rango de puertos RTP" ++ ++msgid "RTP Port Range Start" ++msgstr "Inicio del rango de puertos RTP" ++ ++msgid "" ++"RTP traffic carries actual voice packets. This is the start of the port " ++"range that will be used for setting up RTP communication. It's usually OK to " ++"leave this at the default value." ++msgstr "" ++"El tráfico RTP es el que lleva los paquetes de voz. Este es el inicio del " ++"rango de puertos que se usará para comunicaciones RTP. Suele ser correcto " ++"dejar el valor por defecto." ++ ++msgid "Receives Incoming Calls" ++msgstr "Recibe llamadas entrantes" ++ ++msgid "Remote Usage" ++msgstr "Uso remoto" ++ ++msgid "Rings users enabled for incoming calls" ++msgstr "Llama a usuarios habilitados a recibir llamadas" ++ ++msgid "SIP Accounts" ++msgstr "Cuentas SIP" ++ ++msgid "SIP Device/Softphone Accounts" ++msgstr "Dispositivo SIP/Cuentas Softphone" ++ ++msgid "SIP Provider Accounts" ++msgstr "Cuentas del proveedor SIP" ++ ++msgid "SIP Realm (needed by some providers)" ++msgstr "Ãmbito SIP (necesario para algunos proveedores)" ++ ++msgid "SIP Server/Registrar" ++msgstr "Servidor/Registrador del SIP" ++ ++msgid "SIP Server/Registrar Port" ++msgstr "Puerto del Servidor/Registrador del SIP" ++ ++msgid "Server Setting" ++msgstr "Configuración del servidor" ++ ++msgid "Server Setting for Local SIP Devices" ++msgstr "Dispositivos SIP locales" ++ ++msgid "Server Setting for Remote SIP Devices" ++msgstr "Dispositivos SIP remotos" ++ ++msgid "Service Status" ++msgstr "Estado del servicio" ++ ++msgid "" ++"Set the number of seconds to ring users upon incoming calls before hanging " ++"up or going to voicemail, if the voicemail is installed and enabled." ++msgstr "" ++"Segundos que se llamará a los usuarios antes de colgar o pasar a correo voz " ++"(si el correo voz está instalado y habilitado)." ++ ++msgid "Space-Separated List of Blacklisted Numbers" ++msgstr "Lista negra (separar números con espacios)" ++ ++msgid "Specify numbers individually here. Press enter to add more numbers." ++msgstr "Números individuales. Pulse enter para añadir más." ++ ++msgid "" ++"Specify numbers individually here. Press enter to add more numbers. You will " ++"have to experiment with what country and area codes you need to add to the " ++"number." ++msgstr "" ++"Especifica números individualmente. Pulsa enter para añadir más. Tendrás que " ++"experimentar con qué códigos de país y área necesitas añadir al número." ++ ++msgid "" ++"The number(s) specified above will be able to dial out with this user's " ++"providers. Invalid usernames, including users not enabled for outgoing " ++"calls, are dropped silently. Please verify that the entry was accepted." ++msgstr "" ++"Estos números podrán llamar con los proveedores de este usuario. Los nombres " ++"de usuario no válidos se descartan sin aviso. Por favor, verifique que los " ++"números se aceptan." ++ ++msgid "" ++"This configuration page allows you to configure a phone system (PBX) service " ++"which permits making phone calls through multiple Google and SIP (like " ++"Sipgate, SipSorcery, and Betamax) accounts and sharing them among many SIP " ++"devices. Note that Google accounts, SIP accounts, and local user accounts " ++"are configured in the \"Google Accounts\", \"SIP Accounts\", and \"User " ++"Accounts\" sub-sections. You must add at least one User Account to this PBX, " ++"and then configure a SIP device or softphone to use the account, in order to " ++"make and receive calls with your Google/SIP accounts. Configuring multiple " ++"users will allow you to make free calls between all users, and share the " ++"configured Google and SIP accounts. If you have more than one Google and SIP " ++"accounts set up, you should probably configure how calls to and from them " ++"are routed in the \"Call Routing\" page. If you're interested in using your " ++"own PBX from anywhere in the world, then visit the \"Remote Usage\" section " ++"in the \"Advanced Settings\" page." ++msgstr "" ++"Aquí puede configurar un servicio de sistema telefónico (PBX) que le " ++"permitirá hacer llamadas por múltiples cuentas Google y SIP (como Sipgate, " ++"SipSorcery, and Betamax) y compartirlas entre muchos dispositivos SIP. Tenga " ++"en cuenta que las cuentas Google, SIP y locales deben configurarse en " ++"subsecciones diferentes. Debe añadir al menos una cuenta de usuarioa este " ++"PBX y configurar un dispositivo SIP o softphone para usarla para recibir las " ++"llamadas de sus cuentas Google/SIP. Configurar múltiples usuarios le " ++"permitirá hacer llamadas gratuitas entre los usuarios y compartir las " ++"cuentas Google/SIP configuradas. Si tiene más de una cuenta Google/SIP " ++"configurada tendrá que configurar cómo se enrutan en la página \"Enrutado de " ++"llamadas\". Si está interesado en usar su PBX desde cualquier sitio del " ++"mundo puede visitar la sección \"Uso remoto\" en la página \"Configuración " ++"avanzada\"." ++ ++msgid "" ++"This is the name that the VoIP server will use to identify itself when " ++"registering to VoIP (SIP) providers. Some providers require this to a " ++"specific string matching a hardware SIP device." ++msgstr "" ++"Nombre del servidor VoIP que usará para identificarse cuando se registre en " ++"proveedores de VoIP (SIP). Algunos requieres que sea una cadena específica a " ++"una dispositivo hardware." ++ ++msgid "" ++"This is where you indicate which Google/SIP accounts are used to call what " ++"country/area codes, which users can use what SIP/Google accounts, how " ++"incoming calls are routed, what numbers can get into this PBX with a " ++"password, and what numbers are blacklisted." ++msgstr "" ++"Indique las cuentas Google/SIP que usará para llamar a qué códigos de país/" ++"zona, qué usuarios pueden usuarios pueden usar qué cuentas SIP/Google y cómo " ++"se enrutan las llamadas entrantes, qué números pueden entrar en esta PBX con " ++"una contraseña y qué números están en lista negra." ++ ++msgid "" ++"This is where you set up your Google (Talk and Voice) Accounts, in order to " ++"start using them for dialing and receiving calls (voice chat and real phone " ++"calls). Please make at least one voice call using the Google Talk plugin " ++"installable through the GMail interface, and then log out from your account " ++"everywhere. Click \"Add\" to add as many accounts as you wish." ++msgstr "" ++"Configure sus cuentas Google (Talk y Voz) para empezar a usarlas para hacer " ++"y recibir llamadas (chat de voz y teléfono real). Haga al menos una llamada " ++"de voz con el plugin de Google Talk (instalable desde GMail) y desconéctese " ++"de la cuenta en cualquier otro sitio." ++ ++msgid "" ++"This is where you set up your SIP (VoIP) accounts ts like Sipgate, " ++"SipSorcery, the popular Betamax providers, and any other providers with SIP " ++"settings in order to start using them for dialing and receiving calls (SIP " ++"uri and real phone calls). Click \"Add\" to add as many accounts as you wish." ++msgstr "" ++"Configure sus cuentas SIP (VoIP) como Sipgate, SipSorcery, los popular " ++"proveedores Betamax y cualquier otro proveedor para empezar a usarlos para " ++"hacer y recibir llamadas (uri SIP y teléfono real)." ++ ++msgid "" ++"This option should be set to \"Yes\" if you have a DID (real telephone " ++"number) associated with this SIP account or want to receive SIP uri calls " ++"through this provider." ++msgstr "" ++"Debería ser \"Sí\" si tiene un DID (teléfono real) asociado a esta cuenta " ++"SIP o quiere recibir llamads uri SIP de este proveedor." ++ ++msgid "" ++"This section contains settings that do not need to be changed under normal " ++"circumstances. In addition, here you can configure your system for use with " ++"remote SIP devices, and resolve call quality issues by enabling the " ++"insertion of QoS rules." ++msgstr "" ++"Algunos de estos parámetros no suele ser necesario cambiarlos. Además puede " ++"configurar su sistema para usar con dispositivos SIP remotos y resolver " ++"problemas de calidad de llamada habilitando algunas reglas QoS." ++ ++msgid "" ++"Use (four to five digit) numeric user name if you are connecting normal " ++"telephones with ATAs to this system (so they can dial user names)." ++msgstr "" ++"Use nombre de usuario númericos (cuatro o cinco dígitos) si conecta a " ++"teléfonos normales con ATAs a este sistema (para que puedan marcar números " ++"de usuario)." ++ ++msgid "" ++"Use this account to make outgoing calls as configured in the \"Call Routing" ++"\" section." ++msgstr "" ++"Cuenta para llamadas salientes como se configura en la sección \"Enrutado de " ++"llamadas\"." ++ ++msgid "Use this account to make outgoing calls." ++msgstr "Cuenta para llamadas salientes." ++ ++msgid "User Accounts" ++msgstr "Cuentas de usuario" ++ ++msgid "User Agent String" ++msgstr "Cadena \"User Agent\"" ++ ++msgid "User Name" ++msgstr "Nombre de usuario" ++ ++msgid "Uses providers enabled for outgoing calls" ++msgstr "Usar proveedores habilitados para llamadas salientes" ++ ++msgid "" ++"When somebody starts voice chat with your GTalk account or calls the GVoice, " ++"number (if you have Google Voice), the call will be forwarded to any users " ++"that are online (registered using a SIP device or softphone) and permitted " ++"to receive the call. If you have Google Voice, you must go to your GVoice " ++"settings and forward calls to Google chat in order to actually receive calls " ++"made to your GVoice number. If you have trouble receiving calls from GVoice, " ++"experiment with the Call Screening option in your GVoice Settings. Finally, " ++"make sure no other client is online with this account (browser in gmail, " ++"mobile/desktop Google Talk App) as it may interfere." ++msgstr "" ++"Cuando alguien inicia un chat de voz con su cuenta de GTalk o llame al " ++"número de GVoice (si tiene Google Voice) la llamada se transferirá a " ++"cualquier usuario que esté conectado (registrado usando un dispositivo SIP o " ++"softphone) y se le permitirá recibir la llamada. Si tiene Google Voice debe " ++"ir a la configuración de GVoice y traspasar las llamadas a Google chat para " ++"recibir las hechas a si número de GVoice. Si tiene problemas recibiendo " ++"llamadas de GVoice pruebe con la opción \"Call Screening\" en la " ++"configuración de GVoice. Asegúrese de que ningún otro cliente esté conectado " ++"con esta cuenta (navegador en gmail, o una aplicación para móvil o " ++"escritorio) ya que podría interferir." ++ ++msgid "" ++"When your password is saved, it disappears from this field and is not " ++"displayed for your protection. The previously saved password will be changed " ++"only when you enter a value different from the saved one." ++msgstr "" ++"Cuando se salve su contraseña desaparece de este campo y no se muestra para " ++"su seguridad. La contraseña sólo se podrá cambiar si introduce un valor " ++"diferente al salvado." ++ ++msgid "Yes" ++msgstr "Sí" ++ ++msgid "" ++"You can enter your domain name, external IP address, or dynamic domain name " ++"here. The best thing to input is a static IP address. If your IP address is " ++"dynamic and it changes, your configuration will become invalid. Hence, it's " ++"recommended to set up Dynamic DNS in this case. and enter your Dynamic DNS " ++"hostname here. You can configure Dynamic DNS with the luci-app-ddns package." ++msgstr "" ++"Puedes introducir el nombre de dominio, dirección IP external o nombre " ++"dinámino aquí. Lo mejor es introducir una dirección IP estática. Si la " ++"dirección es dinámica la configuración sería inválida cuando cambiase. En " ++"estos casos es recomendable configurar Dynamic DNS e introducir tu nombre de " ++"host Dynamic DNS. Puedes instalar y configurar Dynamic DNS con el paquete " ++"luci-app-ddns." ++ ++msgid "You can specify a real name to show up in the Caller ID here." ++msgstr "Nombre real a mostrar en el \"Caller ID\"." ++ ++msgid "" ++"You can use your SIP devices/softphones with this system from a remote " ++"location as well, as long as your Internet Service Provider gives you a " ++"public IP. You will be able to call other local users for free (e.g. other " ++"Analog Telephone Adapters (ATAs)) and use your VoIP providers to make calls " ++"as if you were local to the PBX. After configuring this tab, go back to " ++"where users are configured and see the new Server and Port setting you need " ++"to configure the remote SIP devices with. Please note that if this PBX is " ++"not running on your router/gateway, you will need to configure port " ++"forwarding (NAT) on your router/gateway. Please forward the ports below (SIP " ++"port and RTP range) to the IP address of the device running this PBX." ++msgstr "" ++"Puede usar sus dispositivos SIP/softphones con este sistema desde una " ++"ubicación remota mientras su proveedor de internet le dé una dirección IP " ++"pública. Podrá llamar a usuarios locales gratis (ej. otros adaptadores de " ++"teléfonos analógicos) y podrá usar sus proveedores de VoIP para hacer " ++"llamadas como si estuviese en su PBX local. Tras configurar esta pestaña " ++"vuelva a la configuración de usuarios y veo el nuevo servidor y puerto que " ++"debe configurar en sus dispositivos SIP remotos. Tenga en cuenta que si este " ++"PBX no funciona en su router/pasarela, tendrá que configurar el traspaso de " ++"puertos (NAT) en su router/pasarela. Traspase los puertos indicados (Puerto " ++"SIP y rango RTP) hacia la dirección IP del dispositivo en que corre esta PBX." ++ ++msgid "" ++"Your PIN disappears when saved for your protection. It will be changed only " ++"when you enter a value different from the saved one. Leaving the PIN empty " ++"is possible, but please beware of the security implications." ++msgstr "" ++"Su PIN desaparecerá cuando se salve para su protección. Se cambiará solo " ++"cuando introduzca un valor diferente al salvado. No se puede dejar el PIN " ++"vacío." ++ ++msgid "" ++"Your password disappears when saved for your protection. It will be changed " ++"only when you enter a value different from the saved one." ++msgstr "" ++"Su contraseña desaparecerá cuando se salve para su protección. Sólo se puede " ++"cambiar si entra un valor diferente al salvado." ++ ++#~ msgid "" ++#~ "Designate numbers that are allowed to call through this system and which " ++#~ "user's privileges it will have." ++#~ msgstr "" ++#~ "Números a los que se permite llamar por este sistema y privilegios de " ++#~ "usuario." ++ ++#~ msgid "" ++#~ "Pick a random port number between 6500 and 9500 for the service to listen " ++#~ "on. Do not pick the standard 5060, because it is often subject to brute-" ++#~ "force attacks. When finished, (1) click \"Save and Apply\", and (2) click " ++#~ "the \"Restart VoIP Service\" button above. Finally, (3) look in the \"SIP " ++#~ "Device/Softphone Accounts\" section for updated Server and Port settings " ++#~ "for your SIP Devices/Softphones." ++#~ msgstr "" ++#~ "Puerto aleatorio entre 6500 y 9500 en el que escuche el servicio. No elija " ++#~ "el estándar 5060 porque es susceptible de ataques por fuerza bruta. Cuando " ++#~ "termine (1) pulsa \"Salvar y aplicar\" y (2) pulse \"Rearrancar servicio VoIP\". " ++#~ "Finalmente (3) busque en la sección \"Dispositivo SIP/Cuentas softphone\" la " ++#~ "configuración del puerto." ++ ++#~ msgid "" ++#~ "You can enter your domain name, external IP address, or dynamic domain " ++#~ "name here Please keep in mind that if your IP address is dynamic and it " ++#~ "changes your configuration will become invalid. Hence, it's recommended " ++#~ "to set up Dynamic DNS in this case." ++#~ msgstr "" ++#~ "Nombre de dominio, dirección IP externa o nombre de dominio dinámico. Si su " ++#~ "dirección IP es dinámica y cambia su configuración podría resultar no " ++#~ "válida. Se recomienda el uso de DNS dinámico en estos casos." +diff --git a/feeds/luci/applications/luci-app-pbx/po/fr/pbx.po b/feeds/luci/applications/luci-app-pbx/po/fr/pbx.po +new file mode 100644 +index 0000000..971a696 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-pbx/po/fr/pbx.po +@@ -0,0 +1,484 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Last-Translator: Automatically generated\n" ++"Language-Team: none\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n > 1);\n" ++ ++msgid "Advanced Settings" ++msgstr "" ++ ++msgid "Available" ++msgstr "" ++ ++msgid "" ++"Avoid using anything but alpha-numeric characters, space, comma, and period." ++msgstr "" ++ ++msgid "Away" ++msgstr "" ++ ++msgid "Blacklisted Numbers" ++msgstr "" ++ ++msgid "Call Routing" ++msgstr "" ++ ++msgid "Call-back Numbers" ++msgstr "" ++ ++msgid "Call-back Provider" ++msgstr "" ++ ++msgid "Call-through Numbers" ++msgstr "" ++ ++msgid "Copy-paste large lists of numbers here." ++msgstr "" ++ ++msgid "" ++"Designate numbers that are allowed to call through this system and which " ++"user's privileges they will have." ++msgstr "" ++ ++msgid "" ++"Designate numbers to whom the system will hang up and call back, which " ++"provider will be used to call them, and which user's privileges will be " ++"granted to them." ++msgstr "" ++ ++msgid "Dials numbers unmatched elsewhere" ++msgstr "" ++ ++msgid "Do Not Disturb" ++msgstr "" ++ ++msgid "Domain/IP Address/Dynamic Domain" ++msgstr "" ++ ++msgid "Dynamic List of Blacklisted Numbers" ++msgstr "" ++ ++msgid "Email" ++msgstr "" ++ ++msgid "Enable Incoming Calls (Register via SIP)" ++msgstr "" ++ ++msgid "Enable Incoming Calls (set Status below)" ++msgstr "" ++ ++msgid "Enable Outgoing Calls" ++msgstr "" ++ ++msgid "Enabled" ++msgstr "" ++ ++msgid "" ++"Enter a VoIP provider to use for call-back in the format username@some.host." ++"name, as listed in \"Outgoing Calls\" above. It's easiest to copy and paste " ++"the providers from above. Invalid entries, including providers not enabled " ++"for outgoing calls, will be rejected silently." ++msgstr "" ++ ++msgid "" ++"Enter phone numbers that you want to decline calls from automatically. You " ++"should probably omit the country code and any leading zeroes, but please " ++"experiment to make sure you are blocking numbers from your desired area " ++"successfully." ++msgstr "" ++ ++msgid "" ++"Enter this IP (or IP:port) in the Server/Registrar setting of SIP devices " ++"you will use ONLY locally and never from a remote location." ++msgstr "" ++ ++msgid "" ++"Enter this hostname (or hostname:port) in the Server/Registrar setting of " ++"SIP devices you will use from a remote location (they will work locally too)." ++msgstr "" ++ ++msgid "External SIP Port" ++msgstr "" ++ ++msgid "" ++"For each provider enabled for incoming calls, here you can restrict which " ++"users to ring on incoming calls. If the list is empty, the system will " ++"indicate that all users enabled for incoming calls will ring. Invalid " ++"usernames will be rejected silently. Also, entering a username here " ++"overrides the user's setting to not receive incoming calls. This way, you " ++"can make certain users ring only for specific providers. Entries can be made " ++"in a space-separated list, and/or one per line by hitting enter after every " ++"one." ++msgstr "" ++ ++msgid "" ++"For each user enabled for outgoing calls you can restrict what providers the " ++"user can use for outgoing calls. By default all users can use all providers. " ++"To show up in the list below the user should be allowed to make outgoing " ++"calls in the \"User Accounts\" page. Enter VoIP providers in the format " ++"username@some.host.name, as listed in \"Outgoing Calls\" above. It's easiest " ++"to copy and paste the providers from above. Invalid entries, including " ++"providers not enabled for outgoing calls, will be rejected silently. Entries " ++"can be made in a space-separated list, and/or one per line by hitting enter " ++"after every one." ++msgstr "" ++ ++msgid "Full Name" ++msgstr "" ++ ++msgid "General Settings" ++msgstr "" ++ ++msgid "Google Accounts" ++msgstr "" ++ ++msgid "Google Talk Status" ++msgstr "" ++ ++msgid "Google Talk Status Message" ++msgstr "" ++ ++msgid "Google Voice/Talk Accounts" ++msgstr "" ++ ++msgid "Hang-up Delay" ++msgstr "" ++ ++msgid "" ++"Here you must configure at least one SIP account, that you will use to " ++"register with this service. Use this account either in an Analog Telephony " ++"Adapter (ATA), or in a SIP software like CSipSimple, Linphone, or Sipdroid " ++"on your smartphone, or Ekiga, Linphone, or X-Lite on your computer. By " ++"default, all SIP accounts will ring simultaneously if a call is made to one " ++"of your VoIP provider accounts or GV numbers." ++msgstr "" ++ ++msgid "" ++"How long to wait before hanging up. If the provider you use to dial " ++"automatically forwards to voicemail, you can set this value to a delay that " ++"will allow you to hang up before your call gets forwarded and you get billed " ++"for it." ++msgstr "" ++ ++msgid "" ++"If setting Server/Registrar to %s or %s does not work for you, try setting " ++"it to %s or %s and entering this port number in a separate field that " ++"specifies the Server/Registrar port number. Beware that some devices have a " ++"confusing setting that sets the port where SIP requests originate from on " ++"the SIP device itself (the bind port). The port specified on this page is " ++"NOT this bind port but the port this service listens on." ++msgstr "" ++ ++msgid "" ++"If you experience jittery or high latency audio during heavy downloads, you " ++"may want to enable QoS. QoS prioritizes traffic to and from your network for " ++"specified ports and IP addresses, resulting in better latency and throughput " ++"for sound in our case. If enabled below, a QoS rule for this service will be " ++"configured by the PBX automatically, but you must visit the QoS " ++"configuration page (Network->QoS) to configure other critical QoS settings " ++"like Download and Upload speed." ++msgstr "" ++ ++msgid "" ++"If you have more than one account that can make outgoing calls, you should " ++"enter a list of phone numbers and/or prefixes in the following fields for " ++"each provider listed. Invalid prefixes are removed silently, and only 0-9, " ++"X, Z, N, #, *, and + are valid characters. The letter X matches 0-9, Z " ++"matches 1-9, and N matches 2-9. For example to make calls to Germany through " ++"a provider, you can enter 49. To make calls to North America, you can enter " ++"1NXXNXXXXXX. If one of your providers can make \"local\" calls to an area " ++"code like New York's 646, you can enter 646NXXXXXX for that provider. You " ++"should leave one account with an empty list to make calls with it by " ++"default, if no other provider's prefixes match. The system will " ++"automatically replace an empty list with a message that the provider dials " ++"all numbers not matched by another provider's prefixes. Be as specific as " ++"possible (i.e. 1NXXNXXXXXX is better than 1). Please note all international " ++"dial codes are discarded (e.g. 00, 011, 010, 0011). Entries can be made in a " ++"space-separated list, and/or one per line by hitting enter after every one." ++msgstr "" ++ ++msgid "Incoming Calls" ++msgstr "" ++ ++msgid "Insert QoS Rules" ++msgstr "" ++ ++msgid "Makes Outgoing Calls" ++msgstr "" ++ ++msgid "NOTE: There are no Google or SIP provider accounts configured." ++msgstr "" ++ ++msgid "" ++"NOTE: There are no Google or SIP provider accounts enabled for incoming " ++"calls." ++msgstr "" ++ ++msgid "" ++"NOTE: There are no Google or SIP provider accounts enabled for outgoing " ++"calls." ++msgstr "" ++ ++msgid "NOTE: There are no local user accounts configured." ++msgstr "" ++ ++msgid "NOTE: There are no local user accounts enabled for outgoing calls." ++msgstr "" ++ ++msgid "No" ++msgstr "" ++ ++msgid "Number of Seconds to Ring" ++msgstr "" ++ ++msgid "Outbound Proxy" ++msgstr "" ++ ++msgid "Outgoing Calls" ++msgstr "" ++ ++msgid "PBX Main Page" ++msgstr "" ++ ++msgid "PBX Service Status" ++msgstr "" ++ ++msgid "PIN" ++msgstr "" ++ ++msgid "Password" ++msgstr "" ++ ++msgid "" ++"Pick a random port number between 6500 and 9500 for the service to listen " ++"on. Do not pick the standard 5060, because it is often subject to brute-" ++"force attacks. When finished, (1) click \"Save and Apply\", and (2) look in " ++"the \"SIP Device/Softphone Accounts\" section for updated Server and Port " ++"settings for your SIP Devices/Softphones." ++msgstr "" ++ ++msgid "Port Setting for SIP Devices" ++msgstr "" ++ ++msgid "Providers Used for Outgoing Calls" ++msgstr "" ++ ++msgid "QoS Settings" ++msgstr "" ++ ++msgid "RTP Port Range End" ++msgstr "" ++ ++msgid "RTP Port Range Start" ++msgstr "" ++ ++msgid "" ++"RTP traffic carries actual voice packets. This is the start of the port " ++"range that will be used for setting up RTP communication. It's usually OK to " ++"leave this at the default value." ++msgstr "" ++ ++msgid "Receives Incoming Calls" ++msgstr "" ++ ++msgid "Remote Usage" ++msgstr "" ++ ++msgid "Rings users enabled for incoming calls" ++msgstr "" ++ ++msgid "SIP Accounts" ++msgstr "" ++ ++msgid "SIP Device/Softphone Accounts" ++msgstr "" ++ ++msgid "SIP Provider Accounts" ++msgstr "" ++ ++msgid "SIP Realm (needed by some providers)" ++msgstr "" ++ ++msgid "SIP Server/Registrar" ++msgstr "" ++ ++msgid "SIP Server/Registrar Port" ++msgstr "" ++ ++msgid "Server Setting" ++msgstr "" ++ ++msgid "Server Setting for Local SIP Devices" ++msgstr "" ++ ++msgid "Server Setting for Remote SIP Devices" ++msgstr "" ++ ++msgid "Service Status" ++msgstr "" ++ ++msgid "" ++"Set the number of seconds to ring users upon incoming calls before hanging " ++"up or going to voicemail, if the voicemail is installed and enabled." ++msgstr "" ++ ++msgid "Space-Separated List of Blacklisted Numbers" ++msgstr "" ++ ++msgid "Specify numbers individually here. Press enter to add more numbers." ++msgstr "" ++ ++msgid "" ++"Specify numbers individually here. Press enter to add more numbers. You will " ++"have to experiment with what country and area codes you need to add to the " ++"number." ++msgstr "" ++ ++msgid "" ++"The number(s) specified above will be able to dial out with this user's " ++"providers. Invalid usernames, including users not enabled for outgoing " ++"calls, are dropped silently. Please verify that the entry was accepted." ++msgstr "" ++ ++msgid "" ++"This configuration page allows you to configure a phone system (PBX) service " ++"which permits making phone calls through multiple Google and SIP (like " ++"Sipgate, SipSorcery, and Betamax) accounts and sharing them among many SIP " ++"devices. Note that Google accounts, SIP accounts, and local user accounts " ++"are configured in the \"Google Accounts\", \"SIP Accounts\", and \"User " ++"Accounts\" sub-sections. You must add at least one User Account to this PBX, " ++"and then configure a SIP device or softphone to use the account, in order to " ++"make and receive calls with your Google/SIP accounts. Configuring multiple " ++"users will allow you to make free calls between all users, and share the " ++"configured Google and SIP accounts. If you have more than one Google and SIP " ++"accounts set up, you should probably configure how calls to and from them " ++"are routed in the \"Call Routing\" page. If you're interested in using your " ++"own PBX from anywhere in the world, then visit the \"Remote Usage\" section " ++"in the \"Advanced Settings\" page." ++msgstr "" ++ ++msgid "" ++"This is the name that the VoIP server will use to identify itself when " ++"registering to VoIP (SIP) providers. Some providers require this to a " ++"specific string matching a hardware SIP device." ++msgstr "" ++ ++msgid "" ++"This is where you indicate which Google/SIP accounts are used to call what " ++"country/area codes, which users can use what SIP/Google accounts, how " ++"incoming calls are routed, what numbers can get into this PBX with a " ++"password, and what numbers are blacklisted." ++msgstr "" ++ ++msgid "" ++"This is where you set up your Google (Talk and Voice) Accounts, in order to " ++"start using them for dialing and receiving calls (voice chat and real phone " ++"calls). Please make at least one voice call using the Google Talk plugin " ++"installable through the GMail interface, and then log out from your account " ++"everywhere. Click \"Add\" to add as many accounts as you wish." ++msgstr "" ++ ++msgid "" ++"This is where you set up your SIP (VoIP) accounts ts like Sipgate, " ++"SipSorcery, the popular Betamax providers, and any other providers with SIP " ++"settings in order to start using them for dialing and receiving calls (SIP " ++"uri and real phone calls). Click \"Add\" to add as many accounts as you wish." ++msgstr "" ++ ++msgid "" ++"This option should be set to \"Yes\" if you have a DID (real telephone " ++"number) associated with this SIP account or want to receive SIP uri calls " ++"through this provider." ++msgstr "" ++ ++msgid "" ++"This section contains settings that do not need to be changed under normal " ++"circumstances. In addition, here you can configure your system for use with " ++"remote SIP devices, and resolve call quality issues by enabling the " ++"insertion of QoS rules." ++msgstr "" ++ ++msgid "" ++"Use (four to five digit) numeric user name if you are connecting normal " ++"telephones with ATAs to this system (so they can dial user names)." ++msgstr "" ++ ++msgid "" ++"Use this account to make outgoing calls as configured in the \"Call Routing" ++"\" section." ++msgstr "" ++ ++msgid "Use this account to make outgoing calls." ++msgstr "" ++ ++msgid "User Accounts" ++msgstr "" ++ ++msgid "User Agent String" ++msgstr "" ++ ++msgid "User Name" ++msgstr "" ++ ++msgid "Uses providers enabled for outgoing calls" ++msgstr "" ++ ++msgid "" ++"When somebody starts voice chat with your GTalk account or calls the GVoice, " ++"number (if you have Google Voice), the call will be forwarded to any users " ++"that are online (registered using a SIP device or softphone) and permitted " ++"to receive the call. If you have Google Voice, you must go to your GVoice " ++"settings and forward calls to Google chat in order to actually receive calls " ++"made to your GVoice number. If you have trouble receiving calls from GVoice, " ++"experiment with the Call Screening option in your GVoice Settings. Finally, " ++"make sure no other client is online with this account (browser in gmail, " ++"mobile/desktop Google Talk App) as it may interfere." ++msgstr "" ++ ++msgid "" ++"When your password is saved, it disappears from this field and is not " ++"displayed for your protection. The previously saved password will be changed " ++"only when you enter a value different from the saved one." ++msgstr "" ++ ++msgid "Yes" ++msgstr "" ++ ++msgid "" ++"You can enter your domain name, external IP address, or dynamic domain name " ++"here. The best thing to input is a static IP address. If your IP address is " ++"dynamic and it changes, your configuration will become invalid. Hence, it's " ++"recommended to set up Dynamic DNS in this case. and enter your Dynamic DNS " ++"hostname here. You can configure Dynamic DNS with the luci-app-ddns package." ++msgstr "" ++ ++msgid "You can specify a real name to show up in the Caller ID here." ++msgstr "" ++ ++msgid "" ++"You can use your SIP devices/softphones with this system from a remote " ++"location as well, as long as your Internet Service Provider gives you a " ++"public IP. You will be able to call other local users for free (e.g. other " ++"Analog Telephone Adapters (ATAs)) and use your VoIP providers to make calls " ++"as if you were local to the PBX. After configuring this tab, go back to " ++"where users are configured and see the new Server and Port setting you need " ++"to configure the remote SIP devices with. Please note that if this PBX is " ++"not running on your router/gateway, you will need to configure port " ++"forwarding (NAT) on your router/gateway. Please forward the ports below (SIP " ++"port and RTP range) to the IP address of the device running this PBX." ++msgstr "" ++ ++msgid "" ++"Your PIN disappears when saved for your protection. It will be changed only " ++"when you enter a value different from the saved one. Leaving the PIN empty " ++"is possible, but please beware of the security implications." ++msgstr "" ++ ++msgid "" ++"Your password disappears when saved for your protection. It will be changed " ++"only when you enter a value different from the saved one." ++msgstr "" +diff --git a/feeds/luci/applications/luci-app-pbx/po/he/pbx.po b/feeds/luci/applications/luci-app-pbx/po/he/pbx.po +new file mode 100644 +index 0000000..2a45821 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-pbx/po/he/pbx.po +@@ -0,0 +1,484 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Last-Translator: Automatically generated\n" ++"Language-Team: none\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n != 1);\n" ++ ++msgid "Advanced Settings" ++msgstr "" ++ ++msgid "Available" ++msgstr "" ++ ++msgid "" ++"Avoid using anything but alpha-numeric characters, space, comma, and period." ++msgstr "" ++ ++msgid "Away" ++msgstr "" ++ ++msgid "Blacklisted Numbers" ++msgstr "" ++ ++msgid "Call Routing" ++msgstr "" ++ ++msgid "Call-back Numbers" ++msgstr "" ++ ++msgid "Call-back Provider" ++msgstr "" ++ ++msgid "Call-through Numbers" ++msgstr "" ++ ++msgid "Copy-paste large lists of numbers here." ++msgstr "" ++ ++msgid "" ++"Designate numbers that are allowed to call through this system and which " ++"user's privileges they will have." ++msgstr "" ++ ++msgid "" ++"Designate numbers to whom the system will hang up and call back, which " ++"provider will be used to call them, and which user's privileges will be " ++"granted to them." ++msgstr "" ++ ++msgid "Dials numbers unmatched elsewhere" ++msgstr "" ++ ++msgid "Do Not Disturb" ++msgstr "" ++ ++msgid "Domain/IP Address/Dynamic Domain" ++msgstr "" ++ ++msgid "Dynamic List of Blacklisted Numbers" ++msgstr "" ++ ++msgid "Email" ++msgstr "" ++ ++msgid "Enable Incoming Calls (Register via SIP)" ++msgstr "" ++ ++msgid "Enable Incoming Calls (set Status below)" ++msgstr "" ++ ++msgid "Enable Outgoing Calls" ++msgstr "" ++ ++msgid "Enabled" ++msgstr "" ++ ++msgid "" ++"Enter a VoIP provider to use for call-back in the format username@some.host." ++"name, as listed in \"Outgoing Calls\" above. It's easiest to copy and paste " ++"the providers from above. Invalid entries, including providers not enabled " ++"for outgoing calls, will be rejected silently." ++msgstr "" ++ ++msgid "" ++"Enter phone numbers that you want to decline calls from automatically. You " ++"should probably omit the country code and any leading zeroes, but please " ++"experiment to make sure you are blocking numbers from your desired area " ++"successfully." ++msgstr "" ++ ++msgid "" ++"Enter this IP (or IP:port) in the Server/Registrar setting of SIP devices " ++"you will use ONLY locally and never from a remote location." ++msgstr "" ++ ++msgid "" ++"Enter this hostname (or hostname:port) in the Server/Registrar setting of " ++"SIP devices you will use from a remote location (they will work locally too)." ++msgstr "" ++ ++msgid "External SIP Port" ++msgstr "" ++ ++msgid "" ++"For each provider enabled for incoming calls, here you can restrict which " ++"users to ring on incoming calls. If the list is empty, the system will " ++"indicate that all users enabled for incoming calls will ring. Invalid " ++"usernames will be rejected silently. Also, entering a username here " ++"overrides the user's setting to not receive incoming calls. This way, you " ++"can make certain users ring only for specific providers. Entries can be made " ++"in a space-separated list, and/or one per line by hitting enter after every " ++"one." ++msgstr "" ++ ++msgid "" ++"For each user enabled for outgoing calls you can restrict what providers the " ++"user can use for outgoing calls. By default all users can use all providers. " ++"To show up in the list below the user should be allowed to make outgoing " ++"calls in the \"User Accounts\" page. Enter VoIP providers in the format " ++"username@some.host.name, as listed in \"Outgoing Calls\" above. It's easiest " ++"to copy and paste the providers from above. Invalid entries, including " ++"providers not enabled for outgoing calls, will be rejected silently. Entries " ++"can be made in a space-separated list, and/or one per line by hitting enter " ++"after every one." ++msgstr "" ++ ++msgid "Full Name" ++msgstr "" ++ ++msgid "General Settings" ++msgstr "" ++ ++msgid "Google Accounts" ++msgstr "" ++ ++msgid "Google Talk Status" ++msgstr "" ++ ++msgid "Google Talk Status Message" ++msgstr "" ++ ++msgid "Google Voice/Talk Accounts" ++msgstr "" ++ ++msgid "Hang-up Delay" ++msgstr "" ++ ++msgid "" ++"Here you must configure at least one SIP account, that you will use to " ++"register with this service. Use this account either in an Analog Telephony " ++"Adapter (ATA), or in a SIP software like CSipSimple, Linphone, or Sipdroid " ++"on your smartphone, or Ekiga, Linphone, or X-Lite on your computer. By " ++"default, all SIP accounts will ring simultaneously if a call is made to one " ++"of your VoIP provider accounts or GV numbers." ++msgstr "" ++ ++msgid "" ++"How long to wait before hanging up. If the provider you use to dial " ++"automatically forwards to voicemail, you can set this value to a delay that " ++"will allow you to hang up before your call gets forwarded and you get billed " ++"for it." ++msgstr "" ++ ++msgid "" ++"If setting Server/Registrar to %s or %s does not work for you, try setting " ++"it to %s or %s and entering this port number in a separate field that " ++"specifies the Server/Registrar port number. Beware that some devices have a " ++"confusing setting that sets the port where SIP requests originate from on " ++"the SIP device itself (the bind port). The port specified on this page is " ++"NOT this bind port but the port this service listens on." ++msgstr "" ++ ++msgid "" ++"If you experience jittery or high latency audio during heavy downloads, you " ++"may want to enable QoS. QoS prioritizes traffic to and from your network for " ++"specified ports and IP addresses, resulting in better latency and throughput " ++"for sound in our case. If enabled below, a QoS rule for this service will be " ++"configured by the PBX automatically, but you must visit the QoS " ++"configuration page (Network->QoS) to configure other critical QoS settings " ++"like Download and Upload speed." ++msgstr "" ++ ++msgid "" ++"If you have more than one account that can make outgoing calls, you should " ++"enter a list of phone numbers and/or prefixes in the following fields for " ++"each provider listed. Invalid prefixes are removed silently, and only 0-9, " ++"X, Z, N, #, *, and + are valid characters. The letter X matches 0-9, Z " ++"matches 1-9, and N matches 2-9. For example to make calls to Germany through " ++"a provider, you can enter 49. To make calls to North America, you can enter " ++"1NXXNXXXXXX. If one of your providers can make \"local\" calls to an area " ++"code like New York's 646, you can enter 646NXXXXXX for that provider. You " ++"should leave one account with an empty list to make calls with it by " ++"default, if no other provider's prefixes match. The system will " ++"automatically replace an empty list with a message that the provider dials " ++"all numbers not matched by another provider's prefixes. Be as specific as " ++"possible (i.e. 1NXXNXXXXXX is better than 1). Please note all international " ++"dial codes are discarded (e.g. 00, 011, 010, 0011). Entries can be made in a " ++"space-separated list, and/or one per line by hitting enter after every one." ++msgstr "" ++ ++msgid "Incoming Calls" ++msgstr "" ++ ++msgid "Insert QoS Rules" ++msgstr "" ++ ++msgid "Makes Outgoing Calls" ++msgstr "" ++ ++msgid "NOTE: There are no Google or SIP provider accounts configured." ++msgstr "" ++ ++msgid "" ++"NOTE: There are no Google or SIP provider accounts enabled for incoming " ++"calls." ++msgstr "" ++ ++msgid "" ++"NOTE: There are no Google or SIP provider accounts enabled for outgoing " ++"calls." ++msgstr "" ++ ++msgid "NOTE: There are no local user accounts configured." ++msgstr "" ++ ++msgid "NOTE: There are no local user accounts enabled for outgoing calls." ++msgstr "" ++ ++msgid "No" ++msgstr "" ++ ++msgid "Number of Seconds to Ring" ++msgstr "" ++ ++msgid "Outbound Proxy" ++msgstr "" ++ ++msgid "Outgoing Calls" ++msgstr "" ++ ++msgid "PBX Main Page" ++msgstr "" ++ ++msgid "PBX Service Status" ++msgstr "" ++ ++msgid "PIN" ++msgstr "" ++ ++msgid "Password" ++msgstr "" ++ ++msgid "" ++"Pick a random port number between 6500 and 9500 for the service to listen " ++"on. Do not pick the standard 5060, because it is often subject to brute-" ++"force attacks. When finished, (1) click \"Save and Apply\", and (2) look in " ++"the \"SIP Device/Softphone Accounts\" section for updated Server and Port " ++"settings for your SIP Devices/Softphones." ++msgstr "" ++ ++msgid "Port Setting for SIP Devices" ++msgstr "" ++ ++msgid "Providers Used for Outgoing Calls" ++msgstr "" ++ ++msgid "QoS Settings" ++msgstr "" ++ ++msgid "RTP Port Range End" ++msgstr "" ++ ++msgid "RTP Port Range Start" ++msgstr "" ++ ++msgid "" ++"RTP traffic carries actual voice packets. This is the start of the port " ++"range that will be used for setting up RTP communication. It's usually OK to " ++"leave this at the default value." ++msgstr "" ++ ++msgid "Receives Incoming Calls" ++msgstr "" ++ ++msgid "Remote Usage" ++msgstr "" ++ ++msgid "Rings users enabled for incoming calls" ++msgstr "" ++ ++msgid "SIP Accounts" ++msgstr "" ++ ++msgid "SIP Device/Softphone Accounts" ++msgstr "" ++ ++msgid "SIP Provider Accounts" ++msgstr "" ++ ++msgid "SIP Realm (needed by some providers)" ++msgstr "" ++ ++msgid "SIP Server/Registrar" ++msgstr "" ++ ++msgid "SIP Server/Registrar Port" ++msgstr "" ++ ++msgid "Server Setting" ++msgstr "" ++ ++msgid "Server Setting for Local SIP Devices" ++msgstr "" ++ ++msgid "Server Setting for Remote SIP Devices" ++msgstr "" ++ ++msgid "Service Status" ++msgstr "" ++ ++msgid "" ++"Set the number of seconds to ring users upon incoming calls before hanging " ++"up or going to voicemail, if the voicemail is installed and enabled." ++msgstr "" ++ ++msgid "Space-Separated List of Blacklisted Numbers" ++msgstr "" ++ ++msgid "Specify numbers individually here. Press enter to add more numbers." ++msgstr "" ++ ++msgid "" ++"Specify numbers individually here. Press enter to add more numbers. You will " ++"have to experiment with what country and area codes you need to add to the " ++"number." ++msgstr "" ++ ++msgid "" ++"The number(s) specified above will be able to dial out with this user's " ++"providers. Invalid usernames, including users not enabled for outgoing " ++"calls, are dropped silently. Please verify that the entry was accepted." ++msgstr "" ++ ++msgid "" ++"This configuration page allows you to configure a phone system (PBX) service " ++"which permits making phone calls through multiple Google and SIP (like " ++"Sipgate, SipSorcery, and Betamax) accounts and sharing them among many SIP " ++"devices. Note that Google accounts, SIP accounts, and local user accounts " ++"are configured in the \"Google Accounts\", \"SIP Accounts\", and \"User " ++"Accounts\" sub-sections. You must add at least one User Account to this PBX, " ++"and then configure a SIP device or softphone to use the account, in order to " ++"make and receive calls with your Google/SIP accounts. Configuring multiple " ++"users will allow you to make free calls between all users, and share the " ++"configured Google and SIP accounts. If you have more than one Google and SIP " ++"accounts set up, you should probably configure how calls to and from them " ++"are routed in the \"Call Routing\" page. If you're interested in using your " ++"own PBX from anywhere in the world, then visit the \"Remote Usage\" section " ++"in the \"Advanced Settings\" page." ++msgstr "" ++ ++msgid "" ++"This is the name that the VoIP server will use to identify itself when " ++"registering to VoIP (SIP) providers. Some providers require this to a " ++"specific string matching a hardware SIP device." ++msgstr "" ++ ++msgid "" ++"This is where you indicate which Google/SIP accounts are used to call what " ++"country/area codes, which users can use what SIP/Google accounts, how " ++"incoming calls are routed, what numbers can get into this PBX with a " ++"password, and what numbers are blacklisted." ++msgstr "" ++ ++msgid "" ++"This is where you set up your Google (Talk and Voice) Accounts, in order to " ++"start using them for dialing and receiving calls (voice chat and real phone " ++"calls). Please make at least one voice call using the Google Talk plugin " ++"installable through the GMail interface, and then log out from your account " ++"everywhere. Click \"Add\" to add as many accounts as you wish." ++msgstr "" ++ ++msgid "" ++"This is where you set up your SIP (VoIP) accounts ts like Sipgate, " ++"SipSorcery, the popular Betamax providers, and any other providers with SIP " ++"settings in order to start using them for dialing and receiving calls (SIP " ++"uri and real phone calls). Click \"Add\" to add as many accounts as you wish." ++msgstr "" ++ ++msgid "" ++"This option should be set to \"Yes\" if you have a DID (real telephone " ++"number) associated with this SIP account or want to receive SIP uri calls " ++"through this provider." ++msgstr "" ++ ++msgid "" ++"This section contains settings that do not need to be changed under normal " ++"circumstances. In addition, here you can configure your system for use with " ++"remote SIP devices, and resolve call quality issues by enabling the " ++"insertion of QoS rules." ++msgstr "" ++ ++msgid "" ++"Use (four to five digit) numeric user name if you are connecting normal " ++"telephones with ATAs to this system (so they can dial user names)." ++msgstr "" ++ ++msgid "" ++"Use this account to make outgoing calls as configured in the \"Call Routing" ++"\" section." ++msgstr "" ++ ++msgid "Use this account to make outgoing calls." ++msgstr "" ++ ++msgid "User Accounts" ++msgstr "" ++ ++msgid "User Agent String" ++msgstr "" ++ ++msgid "User Name" ++msgstr "" ++ ++msgid "Uses providers enabled for outgoing calls" ++msgstr "" ++ ++msgid "" ++"When somebody starts voice chat with your GTalk account or calls the GVoice, " ++"number (if you have Google Voice), the call will be forwarded to any users " ++"that are online (registered using a SIP device or softphone) and permitted " ++"to receive the call. If you have Google Voice, you must go to your GVoice " ++"settings and forward calls to Google chat in order to actually receive calls " ++"made to your GVoice number. If you have trouble receiving calls from GVoice, " ++"experiment with the Call Screening option in your GVoice Settings. Finally, " ++"make sure no other client is online with this account (browser in gmail, " ++"mobile/desktop Google Talk App) as it may interfere." ++msgstr "" ++ ++msgid "" ++"When your password is saved, it disappears from this field and is not " ++"displayed for your protection. The previously saved password will be changed " ++"only when you enter a value different from the saved one." ++msgstr "" ++ ++msgid "Yes" ++msgstr "" ++ ++msgid "" ++"You can enter your domain name, external IP address, or dynamic domain name " ++"here. The best thing to input is a static IP address. If your IP address is " ++"dynamic and it changes, your configuration will become invalid. Hence, it's " ++"recommended to set up Dynamic DNS in this case. and enter your Dynamic DNS " ++"hostname here. You can configure Dynamic DNS with the luci-app-ddns package." ++msgstr "" ++ ++msgid "You can specify a real name to show up in the Caller ID here." ++msgstr "" ++ ++msgid "" ++"You can use your SIP devices/softphones with this system from a remote " ++"location as well, as long as your Internet Service Provider gives you a " ++"public IP. You will be able to call other local users for free (e.g. other " ++"Analog Telephone Adapters (ATAs)) and use your VoIP providers to make calls " ++"as if you were local to the PBX. After configuring this tab, go back to " ++"where users are configured and see the new Server and Port setting you need " ++"to configure the remote SIP devices with. Please note that if this PBX is " ++"not running on your router/gateway, you will need to configure port " ++"forwarding (NAT) on your router/gateway. Please forward the ports below (SIP " ++"port and RTP range) to the IP address of the device running this PBX." ++msgstr "" ++ ++msgid "" ++"Your PIN disappears when saved for your protection. It will be changed only " ++"when you enter a value different from the saved one. Leaving the PIN empty " ++"is possible, but please beware of the security implications." ++msgstr "" ++ ++msgid "" ++"Your password disappears when saved for your protection. It will be changed " ++"only when you enter a value different from the saved one." ++msgstr "" +diff --git a/feeds/luci/applications/luci-app-pbx/po/hu/pbx.po b/feeds/luci/applications/luci-app-pbx/po/hu/pbx.po +new file mode 100644 +index 0000000..2a45821 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-pbx/po/hu/pbx.po +@@ -0,0 +1,484 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Last-Translator: Automatically generated\n" ++"Language-Team: none\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n != 1);\n" ++ ++msgid "Advanced Settings" ++msgstr "" ++ ++msgid "Available" ++msgstr "" ++ ++msgid "" ++"Avoid using anything but alpha-numeric characters, space, comma, and period." ++msgstr "" ++ ++msgid "Away" ++msgstr "" ++ ++msgid "Blacklisted Numbers" ++msgstr "" ++ ++msgid "Call Routing" ++msgstr "" ++ ++msgid "Call-back Numbers" ++msgstr "" ++ ++msgid "Call-back Provider" ++msgstr "" ++ ++msgid "Call-through Numbers" ++msgstr "" ++ ++msgid "Copy-paste large lists of numbers here." ++msgstr "" ++ ++msgid "" ++"Designate numbers that are allowed to call through this system and which " ++"user's privileges they will have." ++msgstr "" ++ ++msgid "" ++"Designate numbers to whom the system will hang up and call back, which " ++"provider will be used to call them, and which user's privileges will be " ++"granted to them." ++msgstr "" ++ ++msgid "Dials numbers unmatched elsewhere" ++msgstr "" ++ ++msgid "Do Not Disturb" ++msgstr "" ++ ++msgid "Domain/IP Address/Dynamic Domain" ++msgstr "" ++ ++msgid "Dynamic List of Blacklisted Numbers" ++msgstr "" ++ ++msgid "Email" ++msgstr "" ++ ++msgid "Enable Incoming Calls (Register via SIP)" ++msgstr "" ++ ++msgid "Enable Incoming Calls (set Status below)" ++msgstr "" ++ ++msgid "Enable Outgoing Calls" ++msgstr "" ++ ++msgid "Enabled" ++msgstr "" ++ ++msgid "" ++"Enter a VoIP provider to use for call-back in the format username@some.host." ++"name, as listed in \"Outgoing Calls\" above. It's easiest to copy and paste " ++"the providers from above. Invalid entries, including providers not enabled " ++"for outgoing calls, will be rejected silently." ++msgstr "" ++ ++msgid "" ++"Enter phone numbers that you want to decline calls from automatically. You " ++"should probably omit the country code and any leading zeroes, but please " ++"experiment to make sure you are blocking numbers from your desired area " ++"successfully." ++msgstr "" ++ ++msgid "" ++"Enter this IP (or IP:port) in the Server/Registrar setting of SIP devices " ++"you will use ONLY locally and never from a remote location." ++msgstr "" ++ ++msgid "" ++"Enter this hostname (or hostname:port) in the Server/Registrar setting of " ++"SIP devices you will use from a remote location (they will work locally too)." ++msgstr "" ++ ++msgid "External SIP Port" ++msgstr "" ++ ++msgid "" ++"For each provider enabled for incoming calls, here you can restrict which " ++"users to ring on incoming calls. If the list is empty, the system will " ++"indicate that all users enabled for incoming calls will ring. Invalid " ++"usernames will be rejected silently. Also, entering a username here " ++"overrides the user's setting to not receive incoming calls. This way, you " ++"can make certain users ring only for specific providers. Entries can be made " ++"in a space-separated list, and/or one per line by hitting enter after every " ++"one." ++msgstr "" ++ ++msgid "" ++"For each user enabled for outgoing calls you can restrict what providers the " ++"user can use for outgoing calls. By default all users can use all providers. " ++"To show up in the list below the user should be allowed to make outgoing " ++"calls in the \"User Accounts\" page. Enter VoIP providers in the format " ++"username@some.host.name, as listed in \"Outgoing Calls\" above. It's easiest " ++"to copy and paste the providers from above. Invalid entries, including " ++"providers not enabled for outgoing calls, will be rejected silently. Entries " ++"can be made in a space-separated list, and/or one per line by hitting enter " ++"after every one." ++msgstr "" ++ ++msgid "Full Name" ++msgstr "" ++ ++msgid "General Settings" ++msgstr "" ++ ++msgid "Google Accounts" ++msgstr "" ++ ++msgid "Google Talk Status" ++msgstr "" ++ ++msgid "Google Talk Status Message" ++msgstr "" ++ ++msgid "Google Voice/Talk Accounts" ++msgstr "" ++ ++msgid "Hang-up Delay" ++msgstr "" ++ ++msgid "" ++"Here you must configure at least one SIP account, that you will use to " ++"register with this service. Use this account either in an Analog Telephony " ++"Adapter (ATA), or in a SIP software like CSipSimple, Linphone, or Sipdroid " ++"on your smartphone, or Ekiga, Linphone, or X-Lite on your computer. By " ++"default, all SIP accounts will ring simultaneously if a call is made to one " ++"of your VoIP provider accounts or GV numbers." ++msgstr "" ++ ++msgid "" ++"How long to wait before hanging up. If the provider you use to dial " ++"automatically forwards to voicemail, you can set this value to a delay that " ++"will allow you to hang up before your call gets forwarded and you get billed " ++"for it." ++msgstr "" ++ ++msgid "" ++"If setting Server/Registrar to %s or %s does not work for you, try setting " ++"it to %s or %s and entering this port number in a separate field that " ++"specifies the Server/Registrar port number. Beware that some devices have a " ++"confusing setting that sets the port where SIP requests originate from on " ++"the SIP device itself (the bind port). The port specified on this page is " ++"NOT this bind port but the port this service listens on." ++msgstr "" ++ ++msgid "" ++"If you experience jittery or high latency audio during heavy downloads, you " ++"may want to enable QoS. QoS prioritizes traffic to and from your network for " ++"specified ports and IP addresses, resulting in better latency and throughput " ++"for sound in our case. If enabled below, a QoS rule for this service will be " ++"configured by the PBX automatically, but you must visit the QoS " ++"configuration page (Network->QoS) to configure other critical QoS settings " ++"like Download and Upload speed." ++msgstr "" ++ ++msgid "" ++"If you have more than one account that can make outgoing calls, you should " ++"enter a list of phone numbers and/or prefixes in the following fields for " ++"each provider listed. Invalid prefixes are removed silently, and only 0-9, " ++"X, Z, N, #, *, and + are valid characters. The letter X matches 0-9, Z " ++"matches 1-9, and N matches 2-9. For example to make calls to Germany through " ++"a provider, you can enter 49. To make calls to North America, you can enter " ++"1NXXNXXXXXX. If one of your providers can make \"local\" calls to an area " ++"code like New York's 646, you can enter 646NXXXXXX for that provider. You " ++"should leave one account with an empty list to make calls with it by " ++"default, if no other provider's prefixes match. The system will " ++"automatically replace an empty list with a message that the provider dials " ++"all numbers not matched by another provider's prefixes. Be as specific as " ++"possible (i.e. 1NXXNXXXXXX is better than 1). Please note all international " ++"dial codes are discarded (e.g. 00, 011, 010, 0011). Entries can be made in a " ++"space-separated list, and/or one per line by hitting enter after every one." ++msgstr "" ++ ++msgid "Incoming Calls" ++msgstr "" ++ ++msgid "Insert QoS Rules" ++msgstr "" ++ ++msgid "Makes Outgoing Calls" ++msgstr "" ++ ++msgid "NOTE: There are no Google or SIP provider accounts configured." ++msgstr "" ++ ++msgid "" ++"NOTE: There are no Google or SIP provider accounts enabled for incoming " ++"calls." ++msgstr "" ++ ++msgid "" ++"NOTE: There are no Google or SIP provider accounts enabled for outgoing " ++"calls." ++msgstr "" ++ ++msgid "NOTE: There are no local user accounts configured." ++msgstr "" ++ ++msgid "NOTE: There are no local user accounts enabled for outgoing calls." ++msgstr "" ++ ++msgid "No" ++msgstr "" ++ ++msgid "Number of Seconds to Ring" ++msgstr "" ++ ++msgid "Outbound Proxy" ++msgstr "" ++ ++msgid "Outgoing Calls" ++msgstr "" ++ ++msgid "PBX Main Page" ++msgstr "" ++ ++msgid "PBX Service Status" ++msgstr "" ++ ++msgid "PIN" ++msgstr "" ++ ++msgid "Password" ++msgstr "" ++ ++msgid "" ++"Pick a random port number between 6500 and 9500 for the service to listen " ++"on. Do not pick the standard 5060, because it is often subject to brute-" ++"force attacks. When finished, (1) click \"Save and Apply\", and (2) look in " ++"the \"SIP Device/Softphone Accounts\" section for updated Server and Port " ++"settings for your SIP Devices/Softphones." ++msgstr "" ++ ++msgid "Port Setting for SIP Devices" ++msgstr "" ++ ++msgid "Providers Used for Outgoing Calls" ++msgstr "" ++ ++msgid "QoS Settings" ++msgstr "" ++ ++msgid "RTP Port Range End" ++msgstr "" ++ ++msgid "RTP Port Range Start" ++msgstr "" ++ ++msgid "" ++"RTP traffic carries actual voice packets. This is the start of the port " ++"range that will be used for setting up RTP communication. It's usually OK to " ++"leave this at the default value." ++msgstr "" ++ ++msgid "Receives Incoming Calls" ++msgstr "" ++ ++msgid "Remote Usage" ++msgstr "" ++ ++msgid "Rings users enabled for incoming calls" ++msgstr "" ++ ++msgid "SIP Accounts" ++msgstr "" ++ ++msgid "SIP Device/Softphone Accounts" ++msgstr "" ++ ++msgid "SIP Provider Accounts" ++msgstr "" ++ ++msgid "SIP Realm (needed by some providers)" ++msgstr "" ++ ++msgid "SIP Server/Registrar" ++msgstr "" ++ ++msgid "SIP Server/Registrar Port" ++msgstr "" ++ ++msgid "Server Setting" ++msgstr "" ++ ++msgid "Server Setting for Local SIP Devices" ++msgstr "" ++ ++msgid "Server Setting for Remote SIP Devices" ++msgstr "" ++ ++msgid "Service Status" ++msgstr "" ++ ++msgid "" ++"Set the number of seconds to ring users upon incoming calls before hanging " ++"up or going to voicemail, if the voicemail is installed and enabled." ++msgstr "" ++ ++msgid "Space-Separated List of Blacklisted Numbers" ++msgstr "" ++ ++msgid "Specify numbers individually here. Press enter to add more numbers." ++msgstr "" ++ ++msgid "" ++"Specify numbers individually here. Press enter to add more numbers. You will " ++"have to experiment with what country and area codes you need to add to the " ++"number." ++msgstr "" ++ ++msgid "" ++"The number(s) specified above will be able to dial out with this user's " ++"providers. Invalid usernames, including users not enabled for outgoing " ++"calls, are dropped silently. Please verify that the entry was accepted." ++msgstr "" ++ ++msgid "" ++"This configuration page allows you to configure a phone system (PBX) service " ++"which permits making phone calls through multiple Google and SIP (like " ++"Sipgate, SipSorcery, and Betamax) accounts and sharing them among many SIP " ++"devices. Note that Google accounts, SIP accounts, and local user accounts " ++"are configured in the \"Google Accounts\", \"SIP Accounts\", and \"User " ++"Accounts\" sub-sections. You must add at least one User Account to this PBX, " ++"and then configure a SIP device or softphone to use the account, in order to " ++"make and receive calls with your Google/SIP accounts. Configuring multiple " ++"users will allow you to make free calls between all users, and share the " ++"configured Google and SIP accounts. If you have more than one Google and SIP " ++"accounts set up, you should probably configure how calls to and from them " ++"are routed in the \"Call Routing\" page. If you're interested in using your " ++"own PBX from anywhere in the world, then visit the \"Remote Usage\" section " ++"in the \"Advanced Settings\" page." ++msgstr "" ++ ++msgid "" ++"This is the name that the VoIP server will use to identify itself when " ++"registering to VoIP (SIP) providers. Some providers require this to a " ++"specific string matching a hardware SIP device." ++msgstr "" ++ ++msgid "" ++"This is where you indicate which Google/SIP accounts are used to call what " ++"country/area codes, which users can use what SIP/Google accounts, how " ++"incoming calls are routed, what numbers can get into this PBX with a " ++"password, and what numbers are blacklisted." ++msgstr "" ++ ++msgid "" ++"This is where you set up your Google (Talk and Voice) Accounts, in order to " ++"start using them for dialing and receiving calls (voice chat and real phone " ++"calls). Please make at least one voice call using the Google Talk plugin " ++"installable through the GMail interface, and then log out from your account " ++"everywhere. Click \"Add\" to add as many accounts as you wish." ++msgstr "" ++ ++msgid "" ++"This is where you set up your SIP (VoIP) accounts ts like Sipgate, " ++"SipSorcery, the popular Betamax providers, and any other providers with SIP " ++"settings in order to start using them for dialing and receiving calls (SIP " ++"uri and real phone calls). Click \"Add\" to add as many accounts as you wish." ++msgstr "" ++ ++msgid "" ++"This option should be set to \"Yes\" if you have a DID (real telephone " ++"number) associated with this SIP account or want to receive SIP uri calls " ++"through this provider." ++msgstr "" ++ ++msgid "" ++"This section contains settings that do not need to be changed under normal " ++"circumstances. In addition, here you can configure your system for use with " ++"remote SIP devices, and resolve call quality issues by enabling the " ++"insertion of QoS rules." ++msgstr "" ++ ++msgid "" ++"Use (four to five digit) numeric user name if you are connecting normal " ++"telephones with ATAs to this system (so they can dial user names)." ++msgstr "" ++ ++msgid "" ++"Use this account to make outgoing calls as configured in the \"Call Routing" ++"\" section." ++msgstr "" ++ ++msgid "Use this account to make outgoing calls." ++msgstr "" ++ ++msgid "User Accounts" ++msgstr "" ++ ++msgid "User Agent String" ++msgstr "" ++ ++msgid "User Name" ++msgstr "" ++ ++msgid "Uses providers enabled for outgoing calls" ++msgstr "" ++ ++msgid "" ++"When somebody starts voice chat with your GTalk account or calls the GVoice, " ++"number (if you have Google Voice), the call will be forwarded to any users " ++"that are online (registered using a SIP device or softphone) and permitted " ++"to receive the call. If you have Google Voice, you must go to your GVoice " ++"settings and forward calls to Google chat in order to actually receive calls " ++"made to your GVoice number. If you have trouble receiving calls from GVoice, " ++"experiment with the Call Screening option in your GVoice Settings. Finally, " ++"make sure no other client is online with this account (browser in gmail, " ++"mobile/desktop Google Talk App) as it may interfere." ++msgstr "" ++ ++msgid "" ++"When your password is saved, it disappears from this field and is not " ++"displayed for your protection. The previously saved password will be changed " ++"only when you enter a value different from the saved one." ++msgstr "" ++ ++msgid "Yes" ++msgstr "" ++ ++msgid "" ++"You can enter your domain name, external IP address, or dynamic domain name " ++"here. The best thing to input is a static IP address. If your IP address is " ++"dynamic and it changes, your configuration will become invalid. Hence, it's " ++"recommended to set up Dynamic DNS in this case. and enter your Dynamic DNS " ++"hostname here. You can configure Dynamic DNS with the luci-app-ddns package." ++msgstr "" ++ ++msgid "You can specify a real name to show up in the Caller ID here." ++msgstr "" ++ ++msgid "" ++"You can use your SIP devices/softphones with this system from a remote " ++"location as well, as long as your Internet Service Provider gives you a " ++"public IP. You will be able to call other local users for free (e.g. other " ++"Analog Telephone Adapters (ATAs)) and use your VoIP providers to make calls " ++"as if you were local to the PBX. After configuring this tab, go back to " ++"where users are configured and see the new Server and Port setting you need " ++"to configure the remote SIP devices with. Please note that if this PBX is " ++"not running on your router/gateway, you will need to configure port " ++"forwarding (NAT) on your router/gateway. Please forward the ports below (SIP " ++"port and RTP range) to the IP address of the device running this PBX." ++msgstr "" ++ ++msgid "" ++"Your PIN disappears when saved for your protection. It will be changed only " ++"when you enter a value different from the saved one. Leaving the PIN empty " ++"is possible, but please beware of the security implications." ++msgstr "" ++ ++msgid "" ++"Your password disappears when saved for your protection. It will be changed " ++"only when you enter a value different from the saved one." ++msgstr "" +diff --git a/feeds/luci/applications/luci-app-pbx/po/it/pbx.po b/feeds/luci/applications/luci-app-pbx/po/it/pbx.po +new file mode 100644 +index 0000000..6da8e45 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-pbx/po/it/pbx.po +@@ -0,0 +1,487 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"PO-Revision-Date: 2012-12-15 19:31+0200\n" ++"Last-Translator: claudyus \n" ++"Language-Team: none\n" ++"Language: it\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n != 1);\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "Advanced Settings" ++msgstr "Opzioni avanzate" ++ ++msgid "Available" ++msgstr "" ++ ++msgid "" ++"Avoid using anything but alpha-numeric characters, space, comma, and period." ++msgstr "" ++ ++msgid "Away" ++msgstr "" ++ ++msgid "Blacklisted Numbers" ++msgstr "" ++ ++msgid "Call Routing" ++msgstr "" ++ ++msgid "Call-back Numbers" ++msgstr "" ++ ++msgid "Call-back Provider" ++msgstr "" ++ ++msgid "Call-through Numbers" ++msgstr "" ++ ++msgid "Copy-paste large lists of numbers here." ++msgstr "" ++ ++msgid "" ++"Designate numbers that are allowed to call through this system and which " ++"user's privileges they will have." ++msgstr "" ++ ++msgid "" ++"Designate numbers to whom the system will hang up and call back, which " ++"provider will be used to call them, and which user's privileges will be " ++"granted to them." ++msgstr "" ++ ++msgid "Dials numbers unmatched elsewhere" ++msgstr "" ++ ++msgid "Do Not Disturb" ++msgstr "" ++ ++msgid "Domain/IP Address/Dynamic Domain" ++msgstr "" ++ ++msgid "Dynamic List of Blacklisted Numbers" ++msgstr "" ++ ++msgid "Email" ++msgstr "" ++ ++msgid "Enable Incoming Calls (Register via SIP)" ++msgstr "" ++ ++msgid "Enable Incoming Calls (set Status below)" ++msgstr "" ++ ++msgid "Enable Outgoing Calls" ++msgstr "" ++ ++msgid "Enabled" ++msgstr "" ++ ++msgid "" ++"Enter a VoIP provider to use for call-back in the format username@some.host." ++"name, as listed in \"Outgoing Calls\" above. It's easiest to copy and paste " ++"the providers from above. Invalid entries, including providers not enabled " ++"for outgoing calls, will be rejected silently." ++msgstr "" ++ ++msgid "" ++"Enter phone numbers that you want to decline calls from automatically. You " ++"should probably omit the country code and any leading zeroes, but please " ++"experiment to make sure you are blocking numbers from your desired area " ++"successfully." ++msgstr "" ++ ++msgid "" ++"Enter this IP (or IP:port) in the Server/Registrar setting of SIP devices " ++"you will use ONLY locally and never from a remote location." ++msgstr "" ++ ++msgid "" ++"Enter this hostname (or hostname:port) in the Server/Registrar setting of " ++"SIP devices you will use from a remote location (they will work locally too)." ++msgstr "" ++ ++msgid "External SIP Port" ++msgstr "" ++ ++msgid "" ++"For each provider enabled for incoming calls, here you can restrict which " ++"users to ring on incoming calls. If the list is empty, the system will " ++"indicate that all users enabled for incoming calls will ring. Invalid " ++"usernames will be rejected silently. Also, entering a username here " ++"overrides the user's setting to not receive incoming calls. This way, you " ++"can make certain users ring only for specific providers. Entries can be made " ++"in a space-separated list, and/or one per line by hitting enter after every " ++"one." ++msgstr "" ++ ++msgid "" ++"For each user enabled for outgoing calls you can restrict what providers the " ++"user can use for outgoing calls. By default all users can use all providers. " ++"To show up in the list below the user should be allowed to make outgoing " ++"calls in the \"User Accounts\" page. Enter VoIP providers in the format " ++"username@some.host.name, as listed in \"Outgoing Calls\" above. It's easiest " ++"to copy and paste the providers from above. Invalid entries, including " ++"providers not enabled for outgoing calls, will be rejected silently. Entries " ++"can be made in a space-separated list, and/or one per line by hitting enter " ++"after every one." ++msgstr "" ++ ++msgid "Full Name" ++msgstr "" ++ ++msgid "General Settings" ++msgstr "" ++ ++msgid "Google Accounts" ++msgstr "" ++ ++msgid "Google Talk Status" ++msgstr "" ++ ++msgid "Google Talk Status Message" ++msgstr "" ++ ++msgid "Google Voice/Talk Accounts" ++msgstr "" ++ ++msgid "Hang-up Delay" ++msgstr "" ++ ++msgid "" ++"Here you must configure at least one SIP account, that you will use to " ++"register with this service. Use this account either in an Analog Telephony " ++"Adapter (ATA), or in a SIP software like CSipSimple, Linphone, or Sipdroid " ++"on your smartphone, or Ekiga, Linphone, or X-Lite on your computer. By " ++"default, all SIP accounts will ring simultaneously if a call is made to one " ++"of your VoIP provider accounts or GV numbers." ++msgstr "" ++ ++msgid "" ++"How long to wait before hanging up. If the provider you use to dial " ++"automatically forwards to voicemail, you can set this value to a delay that " ++"will allow you to hang up before your call gets forwarded and you get billed " ++"for it." ++msgstr "" ++ ++msgid "" ++"If setting Server/Registrar to %s or %s does not work for you, try setting " ++"it to %s or %s and entering this port number in a separate field that " ++"specifies the Server/Registrar port number. Beware that some devices have a " ++"confusing setting that sets the port where SIP requests originate from on " ++"the SIP device itself (the bind port). The port specified on this page is " ++"NOT this bind port but the port this service listens on." ++msgstr "" ++ ++msgid "" ++"If you experience jittery or high latency audio during heavy downloads, you " ++"may want to enable QoS. QoS prioritizes traffic to and from your network for " ++"specified ports and IP addresses, resulting in better latency and throughput " ++"for sound in our case. If enabled below, a QoS rule for this service will be " ++"configured by the PBX automatically, but you must visit the QoS " ++"configuration page (Network->QoS) to configure other critical QoS settings " ++"like Download and Upload speed." ++msgstr "" ++ ++msgid "" ++"If you have more than one account that can make outgoing calls, you should " ++"enter a list of phone numbers and/or prefixes in the following fields for " ++"each provider listed. Invalid prefixes are removed silently, and only 0-9, " ++"X, Z, N, #, *, and + are valid characters. The letter X matches 0-9, Z " ++"matches 1-9, and N matches 2-9. For example to make calls to Germany through " ++"a provider, you can enter 49. To make calls to North America, you can enter " ++"1NXXNXXXXXX. If one of your providers can make \"local\" calls to an area " ++"code like New York's 646, you can enter 646NXXXXXX for that provider. You " ++"should leave one account with an empty list to make calls with it by " ++"default, if no other provider's prefixes match. The system will " ++"automatically replace an empty list with a message that the provider dials " ++"all numbers not matched by another provider's prefixes. Be as specific as " ++"possible (i.e. 1NXXNXXXXXX is better than 1). Please note all international " ++"dial codes are discarded (e.g. 00, 011, 010, 0011). Entries can be made in a " ++"space-separated list, and/or one per line by hitting enter after every one." ++msgstr "" ++ ++msgid "Incoming Calls" ++msgstr "" ++ ++msgid "Insert QoS Rules" ++msgstr "" ++ ++msgid "Makes Outgoing Calls" ++msgstr "" ++ ++msgid "NOTE: There are no Google or SIP provider accounts configured." ++msgstr "" ++ ++msgid "" ++"NOTE: There are no Google or SIP provider accounts enabled for incoming " ++"calls." ++msgstr "" ++ ++msgid "" ++"NOTE: There are no Google or SIP provider accounts enabled for outgoing " ++"calls." ++msgstr "" ++ ++msgid "NOTE: There are no local user accounts configured." ++msgstr "" ++ ++msgid "NOTE: There are no local user accounts enabled for outgoing calls." ++msgstr "" ++ ++msgid "No" ++msgstr "" ++ ++msgid "Number of Seconds to Ring" ++msgstr "" ++ ++msgid "Outbound Proxy" ++msgstr "" ++ ++msgid "Outgoing Calls" ++msgstr "" ++ ++msgid "PBX Main Page" ++msgstr "" ++ ++msgid "PBX Service Status" ++msgstr "" ++ ++msgid "PIN" ++msgstr "" ++ ++msgid "Password" ++msgstr "" ++ ++msgid "" ++"Pick a random port number between 6500 and 9500 for the service to listen " ++"on. Do not pick the standard 5060, because it is often subject to brute-" ++"force attacks. When finished, (1) click \"Save and Apply\", and (2) look in " ++"the \"SIP Device/Softphone Accounts\" section for updated Server and Port " ++"settings for your SIP Devices/Softphones." ++msgstr "" ++ ++msgid "Port Setting for SIP Devices" ++msgstr "" ++ ++msgid "Providers Used for Outgoing Calls" ++msgstr "" ++ ++msgid "QoS Settings" ++msgstr "" ++ ++msgid "RTP Port Range End" ++msgstr "" ++ ++msgid "RTP Port Range Start" ++msgstr "" ++ ++msgid "" ++"RTP traffic carries actual voice packets. This is the start of the port " ++"range that will be used for setting up RTP communication. It's usually OK to " ++"leave this at the default value." ++msgstr "" ++ ++msgid "Receives Incoming Calls" ++msgstr "" ++ ++msgid "Remote Usage" ++msgstr "" ++ ++msgid "Rings users enabled for incoming calls" ++msgstr "" ++ ++msgid "SIP Accounts" ++msgstr "" ++ ++msgid "SIP Device/Softphone Accounts" ++msgstr "" ++ ++msgid "SIP Provider Accounts" ++msgstr "" ++ ++msgid "SIP Realm (needed by some providers)" ++msgstr "" ++ ++msgid "SIP Server/Registrar" ++msgstr "" ++ ++msgid "SIP Server/Registrar Port" ++msgstr "" ++ ++msgid "Server Setting" ++msgstr "" ++ ++msgid "Server Setting for Local SIP Devices" ++msgstr "" ++ ++msgid "Server Setting for Remote SIP Devices" ++msgstr "" ++ ++msgid "Service Status" ++msgstr "" ++ ++msgid "" ++"Set the number of seconds to ring users upon incoming calls before hanging " ++"up or going to voicemail, if the voicemail is installed and enabled." ++msgstr "" ++ ++msgid "Space-Separated List of Blacklisted Numbers" ++msgstr "" ++ ++msgid "Specify numbers individually here. Press enter to add more numbers." ++msgstr "" ++ ++msgid "" ++"Specify numbers individually here. Press enter to add more numbers. You will " ++"have to experiment with what country and area codes you need to add to the " ++"number." ++msgstr "" ++ ++msgid "" ++"The number(s) specified above will be able to dial out with this user's " ++"providers. Invalid usernames, including users not enabled for outgoing " ++"calls, are dropped silently. Please verify that the entry was accepted." ++msgstr "" ++ ++msgid "" ++"This configuration page allows you to configure a phone system (PBX) service " ++"which permits making phone calls through multiple Google and SIP (like " ++"Sipgate, SipSorcery, and Betamax) accounts and sharing them among many SIP " ++"devices. Note that Google accounts, SIP accounts, and local user accounts " ++"are configured in the \"Google Accounts\", \"SIP Accounts\", and \"User " ++"Accounts\" sub-sections. You must add at least one User Account to this PBX, " ++"and then configure a SIP device or softphone to use the account, in order to " ++"make and receive calls with your Google/SIP accounts. Configuring multiple " ++"users will allow you to make free calls between all users, and share the " ++"configured Google and SIP accounts. If you have more than one Google and SIP " ++"accounts set up, you should probably configure how calls to and from them " ++"are routed in the \"Call Routing\" page. If you're interested in using your " ++"own PBX from anywhere in the world, then visit the \"Remote Usage\" section " ++"in the \"Advanced Settings\" page." ++msgstr "" ++ ++msgid "" ++"This is the name that the VoIP server will use to identify itself when " ++"registering to VoIP (SIP) providers. Some providers require this to a " ++"specific string matching a hardware SIP device." ++msgstr "" ++ ++msgid "" ++"This is where you indicate which Google/SIP accounts are used to call what " ++"country/area codes, which users can use what SIP/Google accounts, how " ++"incoming calls are routed, what numbers can get into this PBX with a " ++"password, and what numbers are blacklisted." ++msgstr "" ++ ++msgid "" ++"This is where you set up your Google (Talk and Voice) Accounts, in order to " ++"start using them for dialing and receiving calls (voice chat and real phone " ++"calls). Please make at least one voice call using the Google Talk plugin " ++"installable through the GMail interface, and then log out from your account " ++"everywhere. Click \"Add\" to add as many accounts as you wish." ++msgstr "" ++ ++msgid "" ++"This is where you set up your SIP (VoIP) accounts ts like Sipgate, " ++"SipSorcery, the popular Betamax providers, and any other providers with SIP " ++"settings in order to start using them for dialing and receiving calls (SIP " ++"uri and real phone calls). Click \"Add\" to add as many accounts as you wish." ++msgstr "" ++ ++msgid "" ++"This option should be set to \"Yes\" if you have a DID (real telephone " ++"number) associated with this SIP account or want to receive SIP uri calls " ++"through this provider." ++msgstr "" ++ ++msgid "" ++"This section contains settings that do not need to be changed under normal " ++"circumstances. In addition, here you can configure your system for use with " ++"remote SIP devices, and resolve call quality issues by enabling the " ++"insertion of QoS rules." ++msgstr "" ++ ++msgid "" ++"Use (four to five digit) numeric user name if you are connecting normal " ++"telephones with ATAs to this system (so they can dial user names)." ++msgstr "" ++ ++msgid "" ++"Use this account to make outgoing calls as configured in the \"Call Routing" ++"\" section." ++msgstr "" ++ ++msgid "Use this account to make outgoing calls." ++msgstr "" ++ ++msgid "User Accounts" ++msgstr "" ++ ++msgid "User Agent String" ++msgstr "" ++ ++msgid "User Name" ++msgstr "" ++ ++msgid "Uses providers enabled for outgoing calls" ++msgstr "" ++ ++msgid "" ++"When somebody starts voice chat with your GTalk account or calls the GVoice, " ++"number (if you have Google Voice), the call will be forwarded to any users " ++"that are online (registered using a SIP device or softphone) and permitted " ++"to receive the call. If you have Google Voice, you must go to your GVoice " ++"settings and forward calls to Google chat in order to actually receive calls " ++"made to your GVoice number. If you have trouble receiving calls from GVoice, " ++"experiment with the Call Screening option in your GVoice Settings. Finally, " ++"make sure no other client is online with this account (browser in gmail, " ++"mobile/desktop Google Talk App) as it may interfere." ++msgstr "" ++ ++msgid "" ++"When your password is saved, it disappears from this field and is not " ++"displayed for your protection. The previously saved password will be changed " ++"only when you enter a value different from the saved one." ++msgstr "" ++ ++msgid "Yes" ++msgstr "" ++ ++msgid "" ++"You can enter your domain name, external IP address, or dynamic domain name " ++"here. The best thing to input is a static IP address. If your IP address is " ++"dynamic and it changes, your configuration will become invalid. Hence, it's " ++"recommended to set up Dynamic DNS in this case. and enter your Dynamic DNS " ++"hostname here. You can configure Dynamic DNS with the luci-app-ddns package." ++msgstr "" ++ ++msgid "You can specify a real name to show up in the Caller ID here." ++msgstr "" ++ ++msgid "" ++"You can use your SIP devices/softphones with this system from a remote " ++"location as well, as long as your Internet Service Provider gives you a " ++"public IP. You will be able to call other local users for free (e.g. other " ++"Analog Telephone Adapters (ATAs)) and use your VoIP providers to make calls " ++"as if you were local to the PBX. After configuring this tab, go back to " ++"where users are configured and see the new Server and Port setting you need " ++"to configure the remote SIP devices with. Please note that if this PBX is " ++"not running on your router/gateway, you will need to configure port " ++"forwarding (NAT) on your router/gateway. Please forward the ports below (SIP " ++"port and RTP range) to the IP address of the device running this PBX." ++msgstr "" ++ ++msgid "" ++"Your PIN disappears when saved for your protection. It will be changed only " ++"when you enter a value different from the saved one. Leaving the PIN empty " ++"is possible, but please beware of the security implications." ++msgstr "" ++ ++msgid "" ++"Your password disappears when saved for your protection. It will be changed " ++"only when you enter a value different from the saved one." ++msgstr "" +diff --git a/feeds/luci/applications/luci-app-pbx/po/ja/pbx.po b/feeds/luci/applications/luci-app-pbx/po/ja/pbx.po +new file mode 100644 +index 0000000..76199f4 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-pbx/po/ja/pbx.po +@@ -0,0 +1,493 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"PO-Revision-Date: 2012-04-21 07:57+0200\n" ++"Last-Translator: Kentaro \n" ++"Language-Team: none\n" ++"Language: ja\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=1; plural=0;\n" ++"X-Generator: Pootle 2.0.4\n" ++ ++msgid "Advanced Settings" ++msgstr "詳細設定" ++ ++msgid "Available" ++msgstr "" ++ ++msgid "" ++"Avoid using anything but alpha-numeric characters, space, comma, and period." ++msgstr "" ++ ++msgid "Away" ++msgstr "" ++ ++msgid "Blacklisted Numbers" ++msgstr "" ++ ++msgid "Call Routing" ++msgstr "" ++ ++msgid "Call-back Numbers" ++msgstr "" ++ ++msgid "Call-back Provider" ++msgstr "" ++ ++msgid "Call-through Numbers" ++msgstr "" ++ ++msgid "Copy-paste large lists of numbers here." ++msgstr "" ++ ++msgid "" ++"Designate numbers that are allowed to call through this system and which " ++"user's privileges they will have." ++msgstr "" ++ ++msgid "" ++"Designate numbers to whom the system will hang up and call back, which " ++"provider will be used to call them, and which user's privileges will be " ++"granted to them." ++msgstr "" ++ ++msgid "Dials numbers unmatched elsewhere" ++msgstr "" ++ ++msgid "Do Not Disturb" ++msgstr "" ++ ++msgid "Domain/IP Address/Dynamic Domain" ++msgstr "" ++ ++msgid "Dynamic List of Blacklisted Numbers" ++msgstr "" ++ ++msgid "Email" ++msgstr "Eメール" ++ ++msgid "Enable Incoming Calls (Register via SIP)" ++msgstr "" ++ ++msgid "Enable Incoming Calls (set Status below)" ++msgstr "" ++ ++msgid "Enable Outgoing Calls" ++msgstr "" ++ ++msgid "Enabled" ++msgstr "" ++ ++msgid "" ++"Enter a VoIP provider to use for call-back in the format username@some.host." ++"name, as listed in \"Outgoing Calls\" above. It's easiest to copy and paste " ++"the providers from above. Invalid entries, including providers not enabled " ++"for outgoing calls, will be rejected silently." ++msgstr "" ++ ++msgid "" ++"Enter phone numbers that you want to decline calls from automatically. You " ++"should probably omit the country code and any leading zeroes, but please " ++"experiment to make sure you are blocking numbers from your desired area " ++"successfully." ++msgstr "" ++ ++msgid "" ++"Enter this IP (or IP:port) in the Server/Registrar setting of SIP devices " ++"you will use ONLY locally and never from a remote location." ++msgstr "" ++ ++msgid "" ++"Enter this hostname (or hostname:port) in the Server/Registrar setting of " ++"SIP devices you will use from a remote location (they will work locally too)." ++msgstr "" ++ ++msgid "External SIP Port" ++msgstr "外部SIPãƒãƒ¼ãƒˆ" ++ ++msgid "" ++"For each provider enabled for incoming calls, here you can restrict which " ++"users to ring on incoming calls. If the list is empty, the system will " ++"indicate that all users enabled for incoming calls will ring. Invalid " ++"usernames will be rejected silently. Also, entering a username here " ++"overrides the user's setting to not receive incoming calls. This way, you " ++"can make certain users ring only for specific providers. Entries can be made " ++"in a space-separated list, and/or one per line by hitting enter after every " ++"one." ++msgstr "" ++ ++msgid "" ++"For each user enabled for outgoing calls you can restrict what providers the " ++"user can use for outgoing calls. By default all users can use all providers. " ++"To show up in the list below the user should be allowed to make outgoing " ++"calls in the \"User Accounts\" page. Enter VoIP providers in the format " ++"username@some.host.name, as listed in \"Outgoing Calls\" above. It's easiest " ++"to copy and paste the providers from above. Invalid entries, including " ++"providers not enabled for outgoing calls, will be rejected silently. Entries " ++"can be made in a space-separated list, and/or one per line by hitting enter " ++"after every one." ++msgstr "" ++ ++msgid "Full Name" ++msgstr "" ++ ++msgid "General Settings" ++msgstr "基本設定" ++ ++msgid "Google Accounts" ++msgstr "Google アカウント" ++ ++msgid "Google Talk Status" ++msgstr "" ++ ++msgid "Google Talk Status Message" ++msgstr "" ++ ++msgid "Google Voice/Talk Accounts" ++msgstr "Google Voice/Talk アカウント" ++ ++msgid "Hang-up Delay" ++msgstr "" ++ ++msgid "" ++"Here you must configure at least one SIP account, that you will use to " ++"register with this service. Use this account either in an Analog Telephony " ++"Adapter (ATA), or in a SIP software like CSipSimple, Linphone, or Sipdroid " ++"on your smartphone, or Ekiga, Linphone, or X-Lite on your computer. By " ++"default, all SIP accounts will ring simultaneously if a call is made to one " ++"of your VoIP provider accounts or GV numbers." ++msgstr "" ++ ++msgid "" ++"How long to wait before hanging up. If the provider you use to dial " ++"automatically forwards to voicemail, you can set this value to a delay that " ++"will allow you to hang up before your call gets forwarded and you get billed " ++"for it." ++msgstr "" ++ ++msgid "" ++"If setting Server/Registrar to %s or %s does not work for you, try setting " ++"it to %s or %s and entering this port number in a separate field that " ++"specifies the Server/Registrar port number. Beware that some devices have a " ++"confusing setting that sets the port where SIP requests originate from on " ++"the SIP device itself (the bind port). The port specified on this page is " ++"NOT this bind port but the port this service listens on." ++msgstr "" ++ ++msgid "" ++"If you experience jittery or high latency audio during heavy downloads, you " ++"may want to enable QoS. QoS prioritizes traffic to and from your network for " ++"specified ports and IP addresses, resulting in better latency and throughput " ++"for sound in our case. If enabled below, a QoS rule for this service will be " ++"configured by the PBX automatically, but you must visit the QoS " ++"configuration page (Network->QoS) to configure other critical QoS settings " ++"like Download and Upload speed." ++msgstr "" ++ ++msgid "" ++"If you have more than one account that can make outgoing calls, you should " ++"enter a list of phone numbers and/or prefixes in the following fields for " ++"each provider listed. Invalid prefixes are removed silently, and only 0-9, " ++"X, Z, N, #, *, and + are valid characters. The letter X matches 0-9, Z " ++"matches 1-9, and N matches 2-9. For example to make calls to Germany through " ++"a provider, you can enter 49. To make calls to North America, you can enter " ++"1NXXNXXXXXX. If one of your providers can make \"local\" calls to an area " ++"code like New York's 646, you can enter 646NXXXXXX for that provider. You " ++"should leave one account with an empty list to make calls with it by " ++"default, if no other provider's prefixes match. The system will " ++"automatically replace an empty list with a message that the provider dials " ++"all numbers not matched by another provider's prefixes. Be as specific as " ++"possible (i.e. 1NXXNXXXXXX is better than 1). Please note all international " ++"dial codes are discarded (e.g. 00, 011, 010, 0011). Entries can be made in a " ++"space-separated list, and/or one per line by hitting enter after every one." ++msgstr "" ++ ++msgid "Incoming Calls" ++msgstr "" ++ ++msgid "Insert QoS Rules" ++msgstr "QoS ルール設定を有効ã«ã™ã‚‹" ++ ++msgid "Makes Outgoing Calls" ++msgstr "発信を許å¯ã™ã‚‹" ++ ++msgid "NOTE: There are no Google or SIP provider accounts configured." ++msgstr "" ++ ++msgid "" ++"NOTE: There are no Google or SIP provider accounts enabled for incoming " ++"calls." ++msgstr "" ++ ++msgid "" ++"NOTE: There are no Google or SIP provider accounts enabled for outgoing " ++"calls." ++msgstr "" ++ ++msgid "NOTE: There are no local user accounts configured." ++msgstr "" ++ ++msgid "NOTE: There are no local user accounts enabled for outgoing calls." ++msgstr "" ++ ++msgid "No" ++msgstr "ã„ã„ãˆ" ++ ++msgid "Number of Seconds to Ring" ++msgstr "" ++ ++msgid "Outbound Proxy" ++msgstr "" ++ ++msgid "Outgoing Calls" ++msgstr "" ++ ++msgid "PBX Main Page" ++msgstr "PBX メインページ" ++ ++msgid "PBX Service Status" ++msgstr "" ++ ++msgid "PIN" ++msgstr "PIN" ++ ++msgid "Password" ++msgstr "パスワード" ++ ++msgid "" ++"Pick a random port number between 6500 and 9500 for the service to listen " ++"on. Do not pick the standard 5060, because it is often subject to brute-" ++"force attacks. When finished, (1) click \"Save and Apply\", and (2) look in " ++"the \"SIP Device/Softphone Accounts\" section for updated Server and Port " ++"settings for your SIP Devices/Softphones." ++msgstr "" ++ ++msgid "Port Setting for SIP Devices" ++msgstr "" ++ ++msgid "Providers Used for Outgoing Calls" ++msgstr "" ++ ++msgid "QoS Settings" ++msgstr "QoS 設定" ++ ++msgid "RTP Port Range End" ++msgstr "" ++ ++msgid "RTP Port Range Start" ++msgstr "" ++ ++msgid "" ++"RTP traffic carries actual voice packets. This is the start of the port " ++"range that will be used for setting up RTP communication. It's usually OK to " ++"leave this at the default value." ++msgstr "" ++ ++msgid "Receives Incoming Calls" ++msgstr "å—信を許å¯ã™ã‚‹" ++ ++msgid "Remote Usage" ++msgstr "" ++ ++msgid "Rings users enabled for incoming calls" ++msgstr "" ++ ++msgid "SIP Accounts" ++msgstr "SIP アカウント" ++ ++msgid "SIP Device/Softphone Accounts" ++msgstr "SIP デãƒã‚¤ã‚¹/ソフトフォン アカウント" ++ ++msgid "SIP Provider Accounts" ++msgstr "" ++ ++msgid "SIP Realm (needed by some providers)" ++msgstr "" ++ ++msgid "SIP Server/Registrar" ++msgstr "" ++ ++msgid "SIP Server/Registrar Port" ++msgstr "" ++ ++msgid "Server Setting" ++msgstr "サーãƒãƒ¼è¨­å®š" ++ ++msgid "Server Setting for Local SIP Devices" ++msgstr "" ++ ++msgid "Server Setting for Remote SIP Devices" ++msgstr "" ++ ++msgid "Service Status" ++msgstr "" ++ ++msgid "" ++"Set the number of seconds to ring users upon incoming calls before hanging " ++"up or going to voicemail, if the voicemail is installed and enabled." ++msgstr "" ++ ++msgid "Space-Separated List of Blacklisted Numbers" ++msgstr "" ++ ++msgid "Specify numbers individually here. Press enter to add more numbers." ++msgstr "" ++ ++msgid "" ++"Specify numbers individually here. Press enter to add more numbers. You will " ++"have to experiment with what country and area codes you need to add to the " ++"number." ++msgstr "" ++ ++msgid "" ++"The number(s) specified above will be able to dial out with this user's " ++"providers. Invalid usernames, including users not enabled for outgoing " ++"calls, are dropped silently. Please verify that the entry was accepted." ++msgstr "" ++ ++msgid "" ++"This configuration page allows you to configure a phone system (PBX) service " ++"which permits making phone calls through multiple Google and SIP (like " ++"Sipgate, SipSorcery, and Betamax) accounts and sharing them among many SIP " ++"devices. Note that Google accounts, SIP accounts, and local user accounts " ++"are configured in the \"Google Accounts\", \"SIP Accounts\", and \"User " ++"Accounts\" sub-sections. You must add at least one User Account to this PBX, " ++"and then configure a SIP device or softphone to use the account, in order to " ++"make and receive calls with your Google/SIP accounts. Configuring multiple " ++"users will allow you to make free calls between all users, and share the " ++"configured Google and SIP accounts. If you have more than one Google and SIP " ++"accounts set up, you should probably configure how calls to and from them " ++"are routed in the \"Call Routing\" page. If you're interested in using your " ++"own PBX from anywhere in the world, then visit the \"Remote Usage\" section " ++"in the \"Advanced Settings\" page." ++msgstr "" ++ ++msgid "" ++"This is the name that the VoIP server will use to identify itself when " ++"registering to VoIP (SIP) providers. Some providers require this to a " ++"specific string matching a hardware SIP device." ++msgstr "" ++ ++msgid "" ++"This is where you indicate which Google/SIP accounts are used to call what " ++"country/area codes, which users can use what SIP/Google accounts, how " ++"incoming calls are routed, what numbers can get into this PBX with a " ++"password, and what numbers are blacklisted." ++msgstr "" ++ ++msgid "" ++"This is where you set up your Google (Talk and Voice) Accounts, in order to " ++"start using them for dialing and receiving calls (voice chat and real phone " ++"calls). Please make at least one voice call using the Google Talk plugin " ++"installable through the GMail interface, and then log out from your account " ++"everywhere. Click \"Add\" to add as many accounts as you wish." ++msgstr "" ++ ++msgid "" ++"This is where you set up your SIP (VoIP) accounts ts like Sipgate, " ++"SipSorcery, the popular Betamax providers, and any other providers with SIP " ++"settings in order to start using them for dialing and receiving calls (SIP " ++"uri and real phone calls). Click \"Add\" to add as many accounts as you wish." ++msgstr "" ++ ++msgid "" ++"This option should be set to \"Yes\" if you have a DID (real telephone " ++"number) associated with this SIP account or want to receive SIP uri calls " ++"through this provider." ++msgstr "" ++ ++msgid "" ++"This section contains settings that do not need to be changed under normal " ++"circumstances. In addition, here you can configure your system for use with " ++"remote SIP devices, and resolve call quality issues by enabling the " ++"insertion of QoS rules." ++msgstr "" ++ ++msgid "" ++"Use (four to five digit) numeric user name if you are connecting normal " ++"telephones with ATAs to this system (so they can dial user names)." ++msgstr "" ++ ++msgid "" ++"Use this account to make outgoing calls as configured in the \"Call Routing" ++"\" section." ++msgstr "" ++ ++msgid "Use this account to make outgoing calls." ++msgstr "" ++ ++msgid "User Accounts" ++msgstr "" ++ ++msgid "User Agent String" ++msgstr "ユーザーエージェントå" ++ ++msgid "User Name" ++msgstr "ユーザーå" ++ ++msgid "Uses providers enabled for outgoing calls" ++msgstr "" ++ ++msgid "" ++"When somebody starts voice chat with your GTalk account or calls the GVoice, " ++"number (if you have Google Voice), the call will be forwarded to any users " ++"that are online (registered using a SIP device or softphone) and permitted " ++"to receive the call. If you have Google Voice, you must go to your GVoice " ++"settings and forward calls to Google chat in order to actually receive calls " ++"made to your GVoice number. If you have trouble receiving calls from GVoice, " ++"experiment with the Call Screening option in your GVoice Settings. Finally, " ++"make sure no other client is online with this account (browser in gmail, " ++"mobile/desktop Google Talk App) as it may interfere." ++msgstr "" ++ ++msgid "" ++"When your password is saved, it disappears from this field and is not " ++"displayed for your protection. The previously saved password will be changed " ++"only when you enter a value different from the saved one." ++msgstr "" ++ ++msgid "Yes" ++msgstr "ã¯ã„" ++ ++msgid "" ++"You can enter your domain name, external IP address, or dynamic domain name " ++"here. The best thing to input is a static IP address. If your IP address is " ++"dynamic and it changes, your configuration will become invalid. Hence, it's " ++"recommended to set up Dynamic DNS in this case. and enter your Dynamic DNS " ++"hostname here. You can configure Dynamic DNS with the luci-app-ddns package." ++msgstr "" ++ ++msgid "You can specify a real name to show up in the Caller ID here." ++msgstr "" ++ ++msgid "" ++"You can use your SIP devices/softphones with this system from a remote " ++"location as well, as long as your Internet Service Provider gives you a " ++"public IP. You will be able to call other local users for free (e.g. other " ++"Analog Telephone Adapters (ATAs)) and use your VoIP providers to make calls " ++"as if you were local to the PBX. After configuring this tab, go back to " ++"where users are configured and see the new Server and Port setting you need " ++"to configure the remote SIP devices with. Please note that if this PBX is " ++"not running on your router/gateway, you will need to configure port " ++"forwarding (NAT) on your router/gateway. Please forward the ports below (SIP " ++"port and RTP range) to the IP address of the device running this PBX." ++msgstr "" ++ ++msgid "" ++"Your PIN disappears when saved for your protection. It will be changed only " ++"when you enter a value different from the saved one. Leaving the PIN empty " ++"is possible, but please beware of the security implications." ++msgstr "" ++ ++msgid "" ++"Your password disappears when saved for your protection. It will be changed " ++"only when you enter a value different from the saved one." ++msgstr "" ++ ++#~ msgid "Account Status" ++#~ msgstr "アカウントã®ã‚¹ãƒ†ãƒ¼ã‚¿ã‚¹" ++ ++#~ msgid "Account Status Message" ++#~ msgstr "アカウントステータス・メッセージ" +diff --git a/feeds/luci/applications/luci-app-pbx/po/ms/pbx.po b/feeds/luci/applications/luci-app-pbx/po/ms/pbx.po +new file mode 100644 +index 0000000..23403f2 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-pbx/po/ms/pbx.po +@@ -0,0 +1,483 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Last-Translator: Automatically generated\n" ++"Language-Team: none\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++ ++msgid "Advanced Settings" ++msgstr "" ++ ++msgid "Available" ++msgstr "" ++ ++msgid "" ++"Avoid using anything but alpha-numeric characters, space, comma, and period." ++msgstr "" ++ ++msgid "Away" ++msgstr "" ++ ++msgid "Blacklisted Numbers" ++msgstr "" ++ ++msgid "Call Routing" ++msgstr "" ++ ++msgid "Call-back Numbers" ++msgstr "" ++ ++msgid "Call-back Provider" ++msgstr "" ++ ++msgid "Call-through Numbers" ++msgstr "" ++ ++msgid "Copy-paste large lists of numbers here." ++msgstr "" ++ ++msgid "" ++"Designate numbers that are allowed to call through this system and which " ++"user's privileges they will have." ++msgstr "" ++ ++msgid "" ++"Designate numbers to whom the system will hang up and call back, which " ++"provider will be used to call them, and which user's privileges will be " ++"granted to them." ++msgstr "" ++ ++msgid "Dials numbers unmatched elsewhere" ++msgstr "" ++ ++msgid "Do Not Disturb" ++msgstr "" ++ ++msgid "Domain/IP Address/Dynamic Domain" ++msgstr "" ++ ++msgid "Dynamic List of Blacklisted Numbers" ++msgstr "" ++ ++msgid "Email" ++msgstr "" ++ ++msgid "Enable Incoming Calls (Register via SIP)" ++msgstr "" ++ ++msgid "Enable Incoming Calls (set Status below)" ++msgstr "" ++ ++msgid "Enable Outgoing Calls" ++msgstr "" ++ ++msgid "Enabled" ++msgstr "" ++ ++msgid "" ++"Enter a VoIP provider to use for call-back in the format username@some.host." ++"name, as listed in \"Outgoing Calls\" above. It's easiest to copy and paste " ++"the providers from above. Invalid entries, including providers not enabled " ++"for outgoing calls, will be rejected silently." ++msgstr "" ++ ++msgid "" ++"Enter phone numbers that you want to decline calls from automatically. You " ++"should probably omit the country code and any leading zeroes, but please " ++"experiment to make sure you are blocking numbers from your desired area " ++"successfully." ++msgstr "" ++ ++msgid "" ++"Enter this IP (or IP:port) in the Server/Registrar setting of SIP devices " ++"you will use ONLY locally and never from a remote location." ++msgstr "" ++ ++msgid "" ++"Enter this hostname (or hostname:port) in the Server/Registrar setting of " ++"SIP devices you will use from a remote location (they will work locally too)." ++msgstr "" ++ ++msgid "External SIP Port" ++msgstr "" ++ ++msgid "" ++"For each provider enabled for incoming calls, here you can restrict which " ++"users to ring on incoming calls. If the list is empty, the system will " ++"indicate that all users enabled for incoming calls will ring. Invalid " ++"usernames will be rejected silently. Also, entering a username here " ++"overrides the user's setting to not receive incoming calls. This way, you " ++"can make certain users ring only for specific providers. Entries can be made " ++"in a space-separated list, and/or one per line by hitting enter after every " ++"one." ++msgstr "" ++ ++msgid "" ++"For each user enabled for outgoing calls you can restrict what providers the " ++"user can use for outgoing calls. By default all users can use all providers. " ++"To show up in the list below the user should be allowed to make outgoing " ++"calls in the \"User Accounts\" page. Enter VoIP providers in the format " ++"username@some.host.name, as listed in \"Outgoing Calls\" above. It's easiest " ++"to copy and paste the providers from above. Invalid entries, including " ++"providers not enabled for outgoing calls, will be rejected silently. Entries " ++"can be made in a space-separated list, and/or one per line by hitting enter " ++"after every one." ++msgstr "" ++ ++msgid "Full Name" ++msgstr "" ++ ++msgid "General Settings" ++msgstr "" ++ ++msgid "Google Accounts" ++msgstr "" ++ ++msgid "Google Talk Status" ++msgstr "" ++ ++msgid "Google Talk Status Message" ++msgstr "" ++ ++msgid "Google Voice/Talk Accounts" ++msgstr "" ++ ++msgid "Hang-up Delay" ++msgstr "" ++ ++msgid "" ++"Here you must configure at least one SIP account, that you will use to " ++"register with this service. Use this account either in an Analog Telephony " ++"Adapter (ATA), or in a SIP software like CSipSimple, Linphone, or Sipdroid " ++"on your smartphone, or Ekiga, Linphone, or X-Lite on your computer. By " ++"default, all SIP accounts will ring simultaneously if a call is made to one " ++"of your VoIP provider accounts or GV numbers." ++msgstr "" ++ ++msgid "" ++"How long to wait before hanging up. If the provider you use to dial " ++"automatically forwards to voicemail, you can set this value to a delay that " ++"will allow you to hang up before your call gets forwarded and you get billed " ++"for it." ++msgstr "" ++ ++msgid "" ++"If setting Server/Registrar to %s or %s does not work for you, try setting " ++"it to %s or %s and entering this port number in a separate field that " ++"specifies the Server/Registrar port number. Beware that some devices have a " ++"confusing setting that sets the port where SIP requests originate from on " ++"the SIP device itself (the bind port). The port specified on this page is " ++"NOT this bind port but the port this service listens on." ++msgstr "" ++ ++msgid "" ++"If you experience jittery or high latency audio during heavy downloads, you " ++"may want to enable QoS. QoS prioritizes traffic to and from your network for " ++"specified ports and IP addresses, resulting in better latency and throughput " ++"for sound in our case. If enabled below, a QoS rule for this service will be " ++"configured by the PBX automatically, but you must visit the QoS " ++"configuration page (Network->QoS) to configure other critical QoS settings " ++"like Download and Upload speed." ++msgstr "" ++ ++msgid "" ++"If you have more than one account that can make outgoing calls, you should " ++"enter a list of phone numbers and/or prefixes in the following fields for " ++"each provider listed. Invalid prefixes are removed silently, and only 0-9, " ++"X, Z, N, #, *, and + are valid characters. The letter X matches 0-9, Z " ++"matches 1-9, and N matches 2-9. For example to make calls to Germany through " ++"a provider, you can enter 49. To make calls to North America, you can enter " ++"1NXXNXXXXXX. If one of your providers can make \"local\" calls to an area " ++"code like New York's 646, you can enter 646NXXXXXX for that provider. You " ++"should leave one account with an empty list to make calls with it by " ++"default, if no other provider's prefixes match. The system will " ++"automatically replace an empty list with a message that the provider dials " ++"all numbers not matched by another provider's prefixes. Be as specific as " ++"possible (i.e. 1NXXNXXXXXX is better than 1). Please note all international " ++"dial codes are discarded (e.g. 00, 011, 010, 0011). Entries can be made in a " ++"space-separated list, and/or one per line by hitting enter after every one." ++msgstr "" ++ ++msgid "Incoming Calls" ++msgstr "" ++ ++msgid "Insert QoS Rules" ++msgstr "" ++ ++msgid "Makes Outgoing Calls" ++msgstr "" ++ ++msgid "NOTE: There are no Google or SIP provider accounts configured." ++msgstr "" ++ ++msgid "" ++"NOTE: There are no Google or SIP provider accounts enabled for incoming " ++"calls." ++msgstr "" ++ ++msgid "" ++"NOTE: There are no Google or SIP provider accounts enabled for outgoing " ++"calls." ++msgstr "" ++ ++msgid "NOTE: There are no local user accounts configured." ++msgstr "" ++ ++msgid "NOTE: There are no local user accounts enabled for outgoing calls." ++msgstr "" ++ ++msgid "No" ++msgstr "" ++ ++msgid "Number of Seconds to Ring" ++msgstr "" ++ ++msgid "Outbound Proxy" ++msgstr "" ++ ++msgid "Outgoing Calls" ++msgstr "" ++ ++msgid "PBX Main Page" ++msgstr "" ++ ++msgid "PBX Service Status" ++msgstr "" ++ ++msgid "PIN" ++msgstr "" ++ ++msgid "Password" ++msgstr "" ++ ++msgid "" ++"Pick a random port number between 6500 and 9500 for the service to listen " ++"on. Do not pick the standard 5060, because it is often subject to brute-" ++"force attacks. When finished, (1) click \"Save and Apply\", and (2) look in " ++"the \"SIP Device/Softphone Accounts\" section for updated Server and Port " ++"settings for your SIP Devices/Softphones." ++msgstr "" ++ ++msgid "Port Setting for SIP Devices" ++msgstr "" ++ ++msgid "Providers Used for Outgoing Calls" ++msgstr "" ++ ++msgid "QoS Settings" ++msgstr "" ++ ++msgid "RTP Port Range End" ++msgstr "" ++ ++msgid "RTP Port Range Start" ++msgstr "" ++ ++msgid "" ++"RTP traffic carries actual voice packets. This is the start of the port " ++"range that will be used for setting up RTP communication. It's usually OK to " ++"leave this at the default value." ++msgstr "" ++ ++msgid "Receives Incoming Calls" ++msgstr "" ++ ++msgid "Remote Usage" ++msgstr "" ++ ++msgid "Rings users enabled for incoming calls" ++msgstr "" ++ ++msgid "SIP Accounts" ++msgstr "" ++ ++msgid "SIP Device/Softphone Accounts" ++msgstr "" ++ ++msgid "SIP Provider Accounts" ++msgstr "" ++ ++msgid "SIP Realm (needed by some providers)" ++msgstr "" ++ ++msgid "SIP Server/Registrar" ++msgstr "" ++ ++msgid "SIP Server/Registrar Port" ++msgstr "" ++ ++msgid "Server Setting" ++msgstr "" ++ ++msgid "Server Setting for Local SIP Devices" ++msgstr "" ++ ++msgid "Server Setting for Remote SIP Devices" ++msgstr "" ++ ++msgid "Service Status" ++msgstr "" ++ ++msgid "" ++"Set the number of seconds to ring users upon incoming calls before hanging " ++"up or going to voicemail, if the voicemail is installed and enabled." ++msgstr "" ++ ++msgid "Space-Separated List of Blacklisted Numbers" ++msgstr "" ++ ++msgid "Specify numbers individually here. Press enter to add more numbers." ++msgstr "" ++ ++msgid "" ++"Specify numbers individually here. Press enter to add more numbers. You will " ++"have to experiment with what country and area codes you need to add to the " ++"number." ++msgstr "" ++ ++msgid "" ++"The number(s) specified above will be able to dial out with this user's " ++"providers. Invalid usernames, including users not enabled for outgoing " ++"calls, are dropped silently. Please verify that the entry was accepted." ++msgstr "" ++ ++msgid "" ++"This configuration page allows you to configure a phone system (PBX) service " ++"which permits making phone calls through multiple Google and SIP (like " ++"Sipgate, SipSorcery, and Betamax) accounts and sharing them among many SIP " ++"devices. Note that Google accounts, SIP accounts, and local user accounts " ++"are configured in the \"Google Accounts\", \"SIP Accounts\", and \"User " ++"Accounts\" sub-sections. You must add at least one User Account to this PBX, " ++"and then configure a SIP device or softphone to use the account, in order to " ++"make and receive calls with your Google/SIP accounts. Configuring multiple " ++"users will allow you to make free calls between all users, and share the " ++"configured Google and SIP accounts. If you have more than one Google and SIP " ++"accounts set up, you should probably configure how calls to and from them " ++"are routed in the \"Call Routing\" page. If you're interested in using your " ++"own PBX from anywhere in the world, then visit the \"Remote Usage\" section " ++"in the \"Advanced Settings\" page." ++msgstr "" ++ ++msgid "" ++"This is the name that the VoIP server will use to identify itself when " ++"registering to VoIP (SIP) providers. Some providers require this to a " ++"specific string matching a hardware SIP device." ++msgstr "" ++ ++msgid "" ++"This is where you indicate which Google/SIP accounts are used to call what " ++"country/area codes, which users can use what SIP/Google accounts, how " ++"incoming calls are routed, what numbers can get into this PBX with a " ++"password, and what numbers are blacklisted." ++msgstr "" ++ ++msgid "" ++"This is where you set up your Google (Talk and Voice) Accounts, in order to " ++"start using them for dialing and receiving calls (voice chat and real phone " ++"calls). Please make at least one voice call using the Google Talk plugin " ++"installable through the GMail interface, and then log out from your account " ++"everywhere. Click \"Add\" to add as many accounts as you wish." ++msgstr "" ++ ++msgid "" ++"This is where you set up your SIP (VoIP) accounts ts like Sipgate, " ++"SipSorcery, the popular Betamax providers, and any other providers with SIP " ++"settings in order to start using them for dialing and receiving calls (SIP " ++"uri and real phone calls). Click \"Add\" to add as many accounts as you wish." ++msgstr "" ++ ++msgid "" ++"This option should be set to \"Yes\" if you have a DID (real telephone " ++"number) associated with this SIP account or want to receive SIP uri calls " ++"through this provider." ++msgstr "" ++ ++msgid "" ++"This section contains settings that do not need to be changed under normal " ++"circumstances. In addition, here you can configure your system for use with " ++"remote SIP devices, and resolve call quality issues by enabling the " ++"insertion of QoS rules." ++msgstr "" ++ ++msgid "" ++"Use (four to five digit) numeric user name if you are connecting normal " ++"telephones with ATAs to this system (so they can dial user names)." ++msgstr "" ++ ++msgid "" ++"Use this account to make outgoing calls as configured in the \"Call Routing" ++"\" section." ++msgstr "" ++ ++msgid "Use this account to make outgoing calls." ++msgstr "" ++ ++msgid "User Accounts" ++msgstr "" ++ ++msgid "User Agent String" ++msgstr "" ++ ++msgid "User Name" ++msgstr "" ++ ++msgid "Uses providers enabled for outgoing calls" ++msgstr "" ++ ++msgid "" ++"When somebody starts voice chat with your GTalk account or calls the GVoice, " ++"number (if you have Google Voice), the call will be forwarded to any users " ++"that are online (registered using a SIP device or softphone) and permitted " ++"to receive the call. If you have Google Voice, you must go to your GVoice " ++"settings and forward calls to Google chat in order to actually receive calls " ++"made to your GVoice number. If you have trouble receiving calls from GVoice, " ++"experiment with the Call Screening option in your GVoice Settings. Finally, " ++"make sure no other client is online with this account (browser in gmail, " ++"mobile/desktop Google Talk App) as it may interfere." ++msgstr "" ++ ++msgid "" ++"When your password is saved, it disappears from this field and is not " ++"displayed for your protection. The previously saved password will be changed " ++"only when you enter a value different from the saved one." ++msgstr "" ++ ++msgid "Yes" ++msgstr "" ++ ++msgid "" ++"You can enter your domain name, external IP address, or dynamic domain name " ++"here. The best thing to input is a static IP address. If your IP address is " ++"dynamic and it changes, your configuration will become invalid. Hence, it's " ++"recommended to set up Dynamic DNS in this case. and enter your Dynamic DNS " ++"hostname here. You can configure Dynamic DNS with the luci-app-ddns package." ++msgstr "" ++ ++msgid "You can specify a real name to show up in the Caller ID here." ++msgstr "" ++ ++msgid "" ++"You can use your SIP devices/softphones with this system from a remote " ++"location as well, as long as your Internet Service Provider gives you a " ++"public IP. You will be able to call other local users for free (e.g. other " ++"Analog Telephone Adapters (ATAs)) and use your VoIP providers to make calls " ++"as if you were local to the PBX. After configuring this tab, go back to " ++"where users are configured and see the new Server and Port setting you need " ++"to configure the remote SIP devices with. Please note that if this PBX is " ++"not running on your router/gateway, you will need to configure port " ++"forwarding (NAT) on your router/gateway. Please forward the ports below (SIP " ++"port and RTP range) to the IP address of the device running this PBX." ++msgstr "" ++ ++msgid "" ++"Your PIN disappears when saved for your protection. It will be changed only " ++"when you enter a value different from the saved one. Leaving the PIN empty " ++"is possible, but please beware of the security implications." ++msgstr "" ++ ++msgid "" ++"Your password disappears when saved for your protection. It will be changed " ++"only when you enter a value different from the saved one." ++msgstr "" +diff --git a/feeds/luci/applications/luci-app-pbx/po/no/pbx.po b/feeds/luci/applications/luci-app-pbx/po/no/pbx.po +new file mode 100644 +index 0000000..2a45821 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-pbx/po/no/pbx.po +@@ -0,0 +1,484 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Last-Translator: Automatically generated\n" ++"Language-Team: none\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n != 1);\n" ++ ++msgid "Advanced Settings" ++msgstr "" ++ ++msgid "Available" ++msgstr "" ++ ++msgid "" ++"Avoid using anything but alpha-numeric characters, space, comma, and period." ++msgstr "" ++ ++msgid "Away" ++msgstr "" ++ ++msgid "Blacklisted Numbers" ++msgstr "" ++ ++msgid "Call Routing" ++msgstr "" ++ ++msgid "Call-back Numbers" ++msgstr "" ++ ++msgid "Call-back Provider" ++msgstr "" ++ ++msgid "Call-through Numbers" ++msgstr "" ++ ++msgid "Copy-paste large lists of numbers here." ++msgstr "" ++ ++msgid "" ++"Designate numbers that are allowed to call through this system and which " ++"user's privileges they will have." ++msgstr "" ++ ++msgid "" ++"Designate numbers to whom the system will hang up and call back, which " ++"provider will be used to call them, and which user's privileges will be " ++"granted to them." ++msgstr "" ++ ++msgid "Dials numbers unmatched elsewhere" ++msgstr "" ++ ++msgid "Do Not Disturb" ++msgstr "" ++ ++msgid "Domain/IP Address/Dynamic Domain" ++msgstr "" ++ ++msgid "Dynamic List of Blacklisted Numbers" ++msgstr "" ++ ++msgid "Email" ++msgstr "" ++ ++msgid "Enable Incoming Calls (Register via SIP)" ++msgstr "" ++ ++msgid "Enable Incoming Calls (set Status below)" ++msgstr "" ++ ++msgid "Enable Outgoing Calls" ++msgstr "" ++ ++msgid "Enabled" ++msgstr "" ++ ++msgid "" ++"Enter a VoIP provider to use for call-back in the format username@some.host." ++"name, as listed in \"Outgoing Calls\" above. It's easiest to copy and paste " ++"the providers from above. Invalid entries, including providers not enabled " ++"for outgoing calls, will be rejected silently." ++msgstr "" ++ ++msgid "" ++"Enter phone numbers that you want to decline calls from automatically. You " ++"should probably omit the country code and any leading zeroes, but please " ++"experiment to make sure you are blocking numbers from your desired area " ++"successfully." ++msgstr "" ++ ++msgid "" ++"Enter this IP (or IP:port) in the Server/Registrar setting of SIP devices " ++"you will use ONLY locally and never from a remote location." ++msgstr "" ++ ++msgid "" ++"Enter this hostname (or hostname:port) in the Server/Registrar setting of " ++"SIP devices you will use from a remote location (they will work locally too)." ++msgstr "" ++ ++msgid "External SIP Port" ++msgstr "" ++ ++msgid "" ++"For each provider enabled for incoming calls, here you can restrict which " ++"users to ring on incoming calls. If the list is empty, the system will " ++"indicate that all users enabled for incoming calls will ring. Invalid " ++"usernames will be rejected silently. Also, entering a username here " ++"overrides the user's setting to not receive incoming calls. This way, you " ++"can make certain users ring only for specific providers. Entries can be made " ++"in a space-separated list, and/or one per line by hitting enter after every " ++"one." ++msgstr "" ++ ++msgid "" ++"For each user enabled for outgoing calls you can restrict what providers the " ++"user can use for outgoing calls. By default all users can use all providers. " ++"To show up in the list below the user should be allowed to make outgoing " ++"calls in the \"User Accounts\" page. Enter VoIP providers in the format " ++"username@some.host.name, as listed in \"Outgoing Calls\" above. It's easiest " ++"to copy and paste the providers from above. Invalid entries, including " ++"providers not enabled for outgoing calls, will be rejected silently. Entries " ++"can be made in a space-separated list, and/or one per line by hitting enter " ++"after every one." ++msgstr "" ++ ++msgid "Full Name" ++msgstr "" ++ ++msgid "General Settings" ++msgstr "" ++ ++msgid "Google Accounts" ++msgstr "" ++ ++msgid "Google Talk Status" ++msgstr "" ++ ++msgid "Google Talk Status Message" ++msgstr "" ++ ++msgid "Google Voice/Talk Accounts" ++msgstr "" ++ ++msgid "Hang-up Delay" ++msgstr "" ++ ++msgid "" ++"Here you must configure at least one SIP account, that you will use to " ++"register with this service. Use this account either in an Analog Telephony " ++"Adapter (ATA), or in a SIP software like CSipSimple, Linphone, or Sipdroid " ++"on your smartphone, or Ekiga, Linphone, or X-Lite on your computer. By " ++"default, all SIP accounts will ring simultaneously if a call is made to one " ++"of your VoIP provider accounts or GV numbers." ++msgstr "" ++ ++msgid "" ++"How long to wait before hanging up. If the provider you use to dial " ++"automatically forwards to voicemail, you can set this value to a delay that " ++"will allow you to hang up before your call gets forwarded and you get billed " ++"for it." ++msgstr "" ++ ++msgid "" ++"If setting Server/Registrar to %s or %s does not work for you, try setting " ++"it to %s or %s and entering this port number in a separate field that " ++"specifies the Server/Registrar port number. Beware that some devices have a " ++"confusing setting that sets the port where SIP requests originate from on " ++"the SIP device itself (the bind port). The port specified on this page is " ++"NOT this bind port but the port this service listens on." ++msgstr "" ++ ++msgid "" ++"If you experience jittery or high latency audio during heavy downloads, you " ++"may want to enable QoS. QoS prioritizes traffic to and from your network for " ++"specified ports and IP addresses, resulting in better latency and throughput " ++"for sound in our case. If enabled below, a QoS rule for this service will be " ++"configured by the PBX automatically, but you must visit the QoS " ++"configuration page (Network->QoS) to configure other critical QoS settings " ++"like Download and Upload speed." ++msgstr "" ++ ++msgid "" ++"If you have more than one account that can make outgoing calls, you should " ++"enter a list of phone numbers and/or prefixes in the following fields for " ++"each provider listed. Invalid prefixes are removed silently, and only 0-9, " ++"X, Z, N, #, *, and + are valid characters. The letter X matches 0-9, Z " ++"matches 1-9, and N matches 2-9. For example to make calls to Germany through " ++"a provider, you can enter 49. To make calls to North America, you can enter " ++"1NXXNXXXXXX. If one of your providers can make \"local\" calls to an area " ++"code like New York's 646, you can enter 646NXXXXXX for that provider. You " ++"should leave one account with an empty list to make calls with it by " ++"default, if no other provider's prefixes match. The system will " ++"automatically replace an empty list with a message that the provider dials " ++"all numbers not matched by another provider's prefixes. Be as specific as " ++"possible (i.e. 1NXXNXXXXXX is better than 1). Please note all international " ++"dial codes are discarded (e.g. 00, 011, 010, 0011). Entries can be made in a " ++"space-separated list, and/or one per line by hitting enter after every one." ++msgstr "" ++ ++msgid "Incoming Calls" ++msgstr "" ++ ++msgid "Insert QoS Rules" ++msgstr "" ++ ++msgid "Makes Outgoing Calls" ++msgstr "" ++ ++msgid "NOTE: There are no Google or SIP provider accounts configured." ++msgstr "" ++ ++msgid "" ++"NOTE: There are no Google or SIP provider accounts enabled for incoming " ++"calls." ++msgstr "" ++ ++msgid "" ++"NOTE: There are no Google or SIP provider accounts enabled for outgoing " ++"calls." ++msgstr "" ++ ++msgid "NOTE: There are no local user accounts configured." ++msgstr "" ++ ++msgid "NOTE: There are no local user accounts enabled for outgoing calls." ++msgstr "" ++ ++msgid "No" ++msgstr "" ++ ++msgid "Number of Seconds to Ring" ++msgstr "" ++ ++msgid "Outbound Proxy" ++msgstr "" ++ ++msgid "Outgoing Calls" ++msgstr "" ++ ++msgid "PBX Main Page" ++msgstr "" ++ ++msgid "PBX Service Status" ++msgstr "" ++ ++msgid "PIN" ++msgstr "" ++ ++msgid "Password" ++msgstr "" ++ ++msgid "" ++"Pick a random port number between 6500 and 9500 for the service to listen " ++"on. Do not pick the standard 5060, because it is often subject to brute-" ++"force attacks. When finished, (1) click \"Save and Apply\", and (2) look in " ++"the \"SIP Device/Softphone Accounts\" section for updated Server and Port " ++"settings for your SIP Devices/Softphones." ++msgstr "" ++ ++msgid "Port Setting for SIP Devices" ++msgstr "" ++ ++msgid "Providers Used for Outgoing Calls" ++msgstr "" ++ ++msgid "QoS Settings" ++msgstr "" ++ ++msgid "RTP Port Range End" ++msgstr "" ++ ++msgid "RTP Port Range Start" ++msgstr "" ++ ++msgid "" ++"RTP traffic carries actual voice packets. This is the start of the port " ++"range that will be used for setting up RTP communication. It's usually OK to " ++"leave this at the default value." ++msgstr "" ++ ++msgid "Receives Incoming Calls" ++msgstr "" ++ ++msgid "Remote Usage" ++msgstr "" ++ ++msgid "Rings users enabled for incoming calls" ++msgstr "" ++ ++msgid "SIP Accounts" ++msgstr "" ++ ++msgid "SIP Device/Softphone Accounts" ++msgstr "" ++ ++msgid "SIP Provider Accounts" ++msgstr "" ++ ++msgid "SIP Realm (needed by some providers)" ++msgstr "" ++ ++msgid "SIP Server/Registrar" ++msgstr "" ++ ++msgid "SIP Server/Registrar Port" ++msgstr "" ++ ++msgid "Server Setting" ++msgstr "" ++ ++msgid "Server Setting for Local SIP Devices" ++msgstr "" ++ ++msgid "Server Setting for Remote SIP Devices" ++msgstr "" ++ ++msgid "Service Status" ++msgstr "" ++ ++msgid "" ++"Set the number of seconds to ring users upon incoming calls before hanging " ++"up or going to voicemail, if the voicemail is installed and enabled." ++msgstr "" ++ ++msgid "Space-Separated List of Blacklisted Numbers" ++msgstr "" ++ ++msgid "Specify numbers individually here. Press enter to add more numbers." ++msgstr "" ++ ++msgid "" ++"Specify numbers individually here. Press enter to add more numbers. You will " ++"have to experiment with what country and area codes you need to add to the " ++"number." ++msgstr "" ++ ++msgid "" ++"The number(s) specified above will be able to dial out with this user's " ++"providers. Invalid usernames, including users not enabled for outgoing " ++"calls, are dropped silently. Please verify that the entry was accepted." ++msgstr "" ++ ++msgid "" ++"This configuration page allows you to configure a phone system (PBX) service " ++"which permits making phone calls through multiple Google and SIP (like " ++"Sipgate, SipSorcery, and Betamax) accounts and sharing them among many SIP " ++"devices. Note that Google accounts, SIP accounts, and local user accounts " ++"are configured in the \"Google Accounts\", \"SIP Accounts\", and \"User " ++"Accounts\" sub-sections. You must add at least one User Account to this PBX, " ++"and then configure a SIP device or softphone to use the account, in order to " ++"make and receive calls with your Google/SIP accounts. Configuring multiple " ++"users will allow you to make free calls between all users, and share the " ++"configured Google and SIP accounts. If you have more than one Google and SIP " ++"accounts set up, you should probably configure how calls to and from them " ++"are routed in the \"Call Routing\" page. If you're interested in using your " ++"own PBX from anywhere in the world, then visit the \"Remote Usage\" section " ++"in the \"Advanced Settings\" page." ++msgstr "" ++ ++msgid "" ++"This is the name that the VoIP server will use to identify itself when " ++"registering to VoIP (SIP) providers. Some providers require this to a " ++"specific string matching a hardware SIP device." ++msgstr "" ++ ++msgid "" ++"This is where you indicate which Google/SIP accounts are used to call what " ++"country/area codes, which users can use what SIP/Google accounts, how " ++"incoming calls are routed, what numbers can get into this PBX with a " ++"password, and what numbers are blacklisted." ++msgstr "" ++ ++msgid "" ++"This is where you set up your Google (Talk and Voice) Accounts, in order to " ++"start using them for dialing and receiving calls (voice chat and real phone " ++"calls). Please make at least one voice call using the Google Talk plugin " ++"installable through the GMail interface, and then log out from your account " ++"everywhere. Click \"Add\" to add as many accounts as you wish." ++msgstr "" ++ ++msgid "" ++"This is where you set up your SIP (VoIP) accounts ts like Sipgate, " ++"SipSorcery, the popular Betamax providers, and any other providers with SIP " ++"settings in order to start using them for dialing and receiving calls (SIP " ++"uri and real phone calls). Click \"Add\" to add as many accounts as you wish." ++msgstr "" ++ ++msgid "" ++"This option should be set to \"Yes\" if you have a DID (real telephone " ++"number) associated with this SIP account or want to receive SIP uri calls " ++"through this provider." ++msgstr "" ++ ++msgid "" ++"This section contains settings that do not need to be changed under normal " ++"circumstances. In addition, here you can configure your system for use with " ++"remote SIP devices, and resolve call quality issues by enabling the " ++"insertion of QoS rules." ++msgstr "" ++ ++msgid "" ++"Use (four to five digit) numeric user name if you are connecting normal " ++"telephones with ATAs to this system (so they can dial user names)." ++msgstr "" ++ ++msgid "" ++"Use this account to make outgoing calls as configured in the \"Call Routing" ++"\" section." ++msgstr "" ++ ++msgid "Use this account to make outgoing calls." ++msgstr "" ++ ++msgid "User Accounts" ++msgstr "" ++ ++msgid "User Agent String" ++msgstr "" ++ ++msgid "User Name" ++msgstr "" ++ ++msgid "Uses providers enabled for outgoing calls" ++msgstr "" ++ ++msgid "" ++"When somebody starts voice chat with your GTalk account or calls the GVoice, " ++"number (if you have Google Voice), the call will be forwarded to any users " ++"that are online (registered using a SIP device or softphone) and permitted " ++"to receive the call. If you have Google Voice, you must go to your GVoice " ++"settings and forward calls to Google chat in order to actually receive calls " ++"made to your GVoice number. If you have trouble receiving calls from GVoice, " ++"experiment with the Call Screening option in your GVoice Settings. Finally, " ++"make sure no other client is online with this account (browser in gmail, " ++"mobile/desktop Google Talk App) as it may interfere." ++msgstr "" ++ ++msgid "" ++"When your password is saved, it disappears from this field and is not " ++"displayed for your protection. The previously saved password will be changed " ++"only when you enter a value different from the saved one." ++msgstr "" ++ ++msgid "Yes" ++msgstr "" ++ ++msgid "" ++"You can enter your domain name, external IP address, or dynamic domain name " ++"here. The best thing to input is a static IP address. If your IP address is " ++"dynamic and it changes, your configuration will become invalid. Hence, it's " ++"recommended to set up Dynamic DNS in this case. and enter your Dynamic DNS " ++"hostname here. You can configure Dynamic DNS with the luci-app-ddns package." ++msgstr "" ++ ++msgid "You can specify a real name to show up in the Caller ID here." ++msgstr "" ++ ++msgid "" ++"You can use your SIP devices/softphones with this system from a remote " ++"location as well, as long as your Internet Service Provider gives you a " ++"public IP. You will be able to call other local users for free (e.g. other " ++"Analog Telephone Adapters (ATAs)) and use your VoIP providers to make calls " ++"as if you were local to the PBX. After configuring this tab, go back to " ++"where users are configured and see the new Server and Port setting you need " ++"to configure the remote SIP devices with. Please note that if this PBX is " ++"not running on your router/gateway, you will need to configure port " ++"forwarding (NAT) on your router/gateway. Please forward the ports below (SIP " ++"port and RTP range) to the IP address of the device running this PBX." ++msgstr "" ++ ++msgid "" ++"Your PIN disappears when saved for your protection. It will be changed only " ++"when you enter a value different from the saved one. Leaving the PIN empty " ++"is possible, but please beware of the security implications." ++msgstr "" ++ ++msgid "" ++"Your password disappears when saved for your protection. It will be changed " ++"only when you enter a value different from the saved one." ++msgstr "" +diff --git a/feeds/luci/applications/luci-app-pbx/po/pl/pbx.po b/feeds/luci/applications/luci-app-pbx/po/pl/pbx.po +new file mode 100644 +index 0000000..4e80a45 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-pbx/po/pl/pbx.po +@@ -0,0 +1,508 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"PO-Revision-Date: 2014-05-05 04:37+0200\n" ++"Last-Translator: piosl \n" ++"Language-Team: none\n" ++"Language: pl\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 " ++"|| n%100>=20) ? 1 : 2);\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "Advanced Settings" ++msgstr "Ustawienia zaawansowane" ++ ++msgid "Available" ++msgstr "DostÄ™pny" ++ ++msgid "" ++"Avoid using anything but alpha-numeric characters, space, comma, and period." ++msgstr "Unikaj znaków innych niż alfanumeryczne, spacja, przecinek i kropka." ++ ++msgid "Away" ++msgstr "Oddalony" ++ ++msgid "Blacklisted Numbers" ++msgstr "Numery na czarnej liÅ›cie" ++ ++msgid "Call Routing" ++msgstr "Przekierowanie poÅ‚Ä…czeÅ„" ++ ++msgid "Call-back Numbers" ++msgstr "" ++ ++msgid "Call-back Provider" ++msgstr "" ++ ++# Chodzi tu o numery, przez które dzwoni siÄ™, aby obniżyć koszta poÅ‚Ä…czeÅ„ zagranicznych. JeÅ›li ktoÅ› ma pomysÅ‚ na lepsze tÅ‚umaczenie, proszÄ™ zmienić. W sieci nie znalazÅ‚em. ++msgid "Call-through Numbers" ++msgstr "Numery poÅ›redniczÄ…ce" ++ ++msgid "Copy-paste large lists of numbers here." ++msgstr "Wklej tu wielkie listy numerów." ++ ++msgid "" ++"Designate numbers that are allowed to call through this system and which " ++"user's privileges they will have." ++msgstr "" ++ ++msgid "" ++"Designate numbers to whom the system will hang up and call back, which " ++"provider will be used to call them, and which user's privileges will be " ++"granted to them." ++msgstr "" ++ ++msgid "Dials numbers unmatched elsewhere" ++msgstr "" ++ ++msgid "Do Not Disturb" ++msgstr "Nie przeszkadzać" ++ ++msgid "Domain/IP Address/Dynamic Domain" ++msgstr "Domena/adres IP/dynamiczna domena" ++ ++msgid "Dynamic List of Blacklisted Numbers" ++msgstr "Dynamiczna czarna lista numerów" ++ ++msgid "Email" ++msgstr "E-mail" ++ ++msgid "Enable Incoming Calls (Register via SIP)" ++msgstr "WÅ‚Ä…cz poÅ‚Ä…czenia przychodzÄ…ce (rejestruj przez SIP)" ++ ++msgid "Enable Incoming Calls (set Status below)" ++msgstr "WÅ‚Ä…cz poÅ‚Ä…czenia przychodzÄ…ce (zobacz status poniżej)" ++ ++msgid "Enable Outgoing Calls" ++msgstr "WÅ‚Ä…cz poÅ‚Ä…czenia wychodzÄ…ce" ++ ++msgid "Enabled" ++msgstr "WÅ‚Ä…czone" ++ ++msgid "" ++"Enter a VoIP provider to use for call-back in the format username@some.host." ++"name, as listed in \"Outgoing Calls\" above. It's easiest to copy and paste " ++"the providers from above. Invalid entries, including providers not enabled " ++"for outgoing calls, will be rejected silently." ++msgstr "" ++ ++msgid "" ++"Enter phone numbers that you want to decline calls from automatically. You " ++"should probably omit the country code and any leading zeroes, but please " ++"experiment to make sure you are blocking numbers from your desired area " ++"successfully." ++msgstr "" ++"Podaj numery telefonów, które powinny być automatycznie odrzucane. " ++"Prawdopodobnie powinieneÅ› pominąć numer kierunkowy kraju i zera z przodu, " ++"ale samemu to przetestuj, aby upewnić siÄ™, że blokowanie dziaÅ‚a prawidÅ‚owo " ++"dla Twojego poÅ‚ożenia." ++ ++msgid "" ++"Enter this IP (or IP:port) in the Server/Registrar setting of SIP devices " ++"you will use ONLY locally and never from a remote location." ++msgstr "" ++"Podaj to IP (lub parÄ™ IP:port) w ustawieniach serwera/rejestratora urzÄ…dzeÅ„ " ++"SIP których bÄ™dziesz używać WYÅÄ„CZNIE lokalnie i nigdy z zewnÄ…trz." ++ ++msgid "" ++"Enter this hostname (or hostname:port) in the Server/Registrar setting of " ++"SIP devices you will use from a remote location (they will work locally too)." ++msgstr "" ++"Podaj tÄ™ nazwÄ™ hosta (lub parÄ™ nazwa hosta:port) w ustawieniach serwera/" ++"rejestratora urzÄ…dzeÅ„ SIP których bÄ™dziesz używać z zewnÄ…trz (bÄ™dÄ… też " ++"dziaÅ‚ać lokalnie)." ++ ++msgid "External SIP Port" ++msgstr "ZewnÄ™trzny port SIP" ++ ++msgid "" ++"For each provider enabled for incoming calls, here you can restrict which " ++"users to ring on incoming calls. If the list is empty, the system will " ++"indicate that all users enabled for incoming calls will ring. Invalid " ++"usernames will be rejected silently. Also, entering a username here " ++"overrides the user's setting to not receive incoming calls. This way, you " ++"can make certain users ring only for specific providers. Entries can be made " ++"in a space-separated list, and/or one per line by hitting enter after every " ++"one." ++msgstr "" ++ ++msgid "" ++"For each user enabled for outgoing calls you can restrict what providers the " ++"user can use for outgoing calls. By default all users can use all providers. " ++"To show up in the list below the user should be allowed to make outgoing " ++"calls in the \"User Accounts\" page. Enter VoIP providers in the format " ++"username@some.host.name, as listed in \"Outgoing Calls\" above. It's easiest " ++"to copy and paste the providers from above. Invalid entries, including " ++"providers not enabled for outgoing calls, will be rejected silently. Entries " ++"can be made in a space-separated list, and/or one per line by hitting enter " ++"after every one." ++msgstr "" ++"Dla każdego użytkownika z prawem wykonywania poÅ‚Ä…czeÅ„ wychodzÄ…cych możesz " ++"ograniczyć których operatorów mogÄ… używać do tych poÅ‚Ä…czeÅ„. DomyÅ›lnie każdy " ++"użytkownik może używać dowolnego operatora. Użytkownik musi mieć prawo " ++"wykonywania poÅ‚Ä…czeÅ„ wychodzÄ…cych ustawione na stronie \"Konta użytkowników" ++"\", aby pojawić siÄ™ na poniższej liÅ›cie. Podaj operatorów VoIP w formacie " ++"nazwa.użytkownika@jakaÅ›.nazwa.hosta, tak jak sÄ… wypisani w \"PoÅ‚Ä…czeniach " ++"wychodzÄ…cych\" powyżej. Åatwiej jest skopiować powyższych operatorów. " ++"NieprawidÅ‚owe wpisy, wÅ‚Ä…cznie z operatorami bez prawa do poÅ‚Ä…czeÅ„ " ++"wychodzÄ…cych, bÄ™dÄ… odrzucani bez komunikatów. Wpisy mogÄ… być rozdzielone " ++"spacjami albo podane po jednym w wierszu." ++ ++msgid "Full Name" ++msgstr "PeÅ‚ne imiÄ™ i nazwisko" ++ ++msgid "General Settings" ++msgstr "Ustawienia ogólne" ++ ++msgid "Google Accounts" ++msgstr "Konta Google" ++ ++msgid "Google Talk Status" ++msgstr "Status Google Talk" ++ ++msgid "Google Talk Status Message" ++msgstr "Opis Google Talk" ++ ++msgid "Google Voice/Talk Accounts" ++msgstr "Konta Google Voice/Talk" ++ ++msgid "Hang-up Delay" ++msgstr "" ++ ++msgid "" ++"Here you must configure at least one SIP account, that you will use to " ++"register with this service. Use this account either in an Analog Telephony " ++"Adapter (ATA), or in a SIP software like CSipSimple, Linphone, or Sipdroid " ++"on your smartphone, or Ekiga, Linphone, or X-Lite on your computer. By " ++"default, all SIP accounts will ring simultaneously if a call is made to one " ++"of your VoIP provider accounts or GV numbers." ++msgstr "" ++ ++msgid "" ++"How long to wait before hanging up. If the provider you use to dial " ++"automatically forwards to voicemail, you can set this value to a delay that " ++"will allow you to hang up before your call gets forwarded and you get billed " ++"for it." ++msgstr "" ++ ++msgid "" ++"If setting Server/Registrar to %s or %s does not work for you, try setting " ++"it to %s or %s and entering this port number in a separate field that " ++"specifies the Server/Registrar port number. Beware that some devices have a " ++"confusing setting that sets the port where SIP requests originate from on " ++"the SIP device itself (the bind port). The port specified on this page is " ++"NOT this bind port but the port this service listens on." ++msgstr "" ++ ++msgid "" ++"If you experience jittery or high latency audio during heavy downloads, you " ++"may want to enable QoS. QoS prioritizes traffic to and from your network for " ++"specified ports and IP addresses, resulting in better latency and throughput " ++"for sound in our case. If enabled below, a QoS rule for this service will be " ++"configured by the PBX automatically, but you must visit the QoS " ++"configuration page (Network->QoS) to configure other critical QoS settings " ++"like Download and Upload speed." ++msgstr "" ++ ++msgid "" ++"If you have more than one account that can make outgoing calls, you should " ++"enter a list of phone numbers and/or prefixes in the following fields for " ++"each provider listed. Invalid prefixes are removed silently, and only 0-9, " ++"X, Z, N, #, *, and + are valid characters. The letter X matches 0-9, Z " ++"matches 1-9, and N matches 2-9. For example to make calls to Germany through " ++"a provider, you can enter 49. To make calls to North America, you can enter " ++"1NXXNXXXXXX. If one of your providers can make \"local\" calls to an area " ++"code like New York's 646, you can enter 646NXXXXXX for that provider. You " ++"should leave one account with an empty list to make calls with it by " ++"default, if no other provider's prefixes match. The system will " ++"automatically replace an empty list with a message that the provider dials " ++"all numbers not matched by another provider's prefixes. Be as specific as " ++"possible (i.e. 1NXXNXXXXXX is better than 1). Please note all international " ++"dial codes are discarded (e.g. 00, 011, 010, 0011). Entries can be made in a " ++"space-separated list, and/or one per line by hitting enter after every one." ++msgstr "" ++ ++msgid "Incoming Calls" ++msgstr "PoÅ‚Ä…czenia przychodzÄ…ce" ++ ++msgid "Insert QoS Rules" ++msgstr "" ++ ++msgid "Makes Outgoing Calls" ++msgstr "" ++ ++msgid "NOTE: There are no Google or SIP provider accounts configured." ++msgstr "" ++ ++msgid "" ++"NOTE: There are no Google or SIP provider accounts enabled for incoming " ++"calls." ++msgstr "" ++ ++msgid "" ++"NOTE: There are no Google or SIP provider accounts enabled for outgoing " ++"calls." ++msgstr "" ++ ++msgid "NOTE: There are no local user accounts configured." ++msgstr "" ++ ++msgid "NOTE: There are no local user accounts enabled for outgoing calls." ++msgstr "" ++ ++msgid "No" ++msgstr "" ++ ++msgid "Number of Seconds to Ring" ++msgstr "" ++ ++msgid "Outbound Proxy" ++msgstr "" ++ ++msgid "Outgoing Calls" ++msgstr "" ++ ++msgid "PBX Main Page" ++msgstr "" ++ ++msgid "PBX Service Status" ++msgstr "" ++ ++msgid "PIN" ++msgstr "" ++ ++msgid "Password" ++msgstr "" ++ ++msgid "" ++"Pick a random port number between 6500 and 9500 for the service to listen " ++"on. Do not pick the standard 5060, because it is often subject to brute-" ++"force attacks. When finished, (1) click \"Save and Apply\", and (2) look in " ++"the \"SIP Device/Softphone Accounts\" section for updated Server and Port " ++"settings for your SIP Devices/Softphones." ++msgstr "" ++ ++msgid "Port Setting for SIP Devices" ++msgstr "" ++ ++msgid "Providers Used for Outgoing Calls" ++msgstr "" ++ ++msgid "QoS Settings" ++msgstr "" ++ ++msgid "RTP Port Range End" ++msgstr "" ++ ++msgid "RTP Port Range Start" ++msgstr "" ++ ++msgid "" ++"RTP traffic carries actual voice packets. This is the start of the port " ++"range that will be used for setting up RTP communication. It's usually OK to " ++"leave this at the default value." ++msgstr "" ++ ++msgid "Receives Incoming Calls" ++msgstr "" ++ ++msgid "Remote Usage" ++msgstr "" ++ ++msgid "Rings users enabled for incoming calls" ++msgstr "" ++ ++msgid "SIP Accounts" ++msgstr "" ++ ++msgid "SIP Device/Softphone Accounts" ++msgstr "" ++ ++msgid "SIP Provider Accounts" ++msgstr "" ++ ++msgid "SIP Realm (needed by some providers)" ++msgstr "" ++ ++msgid "SIP Server/Registrar" ++msgstr "" ++ ++msgid "SIP Server/Registrar Port" ++msgstr "" ++ ++msgid "Server Setting" ++msgstr "" ++ ++msgid "Server Setting for Local SIP Devices" ++msgstr "" ++ ++msgid "Server Setting for Remote SIP Devices" ++msgstr "" ++ ++msgid "Service Status" ++msgstr "" ++ ++msgid "" ++"Set the number of seconds to ring users upon incoming calls before hanging " ++"up or going to voicemail, if the voicemail is installed and enabled." ++msgstr "" ++ ++msgid "Space-Separated List of Blacklisted Numbers" ++msgstr "" ++ ++msgid "Specify numbers individually here. Press enter to add more numbers." ++msgstr "" ++ ++msgid "" ++"Specify numbers individually here. Press enter to add more numbers. You will " ++"have to experiment with what country and area codes you need to add to the " ++"number." ++msgstr "" ++ ++msgid "" ++"The number(s) specified above will be able to dial out with this user's " ++"providers. Invalid usernames, including users not enabled for outgoing " ++"calls, are dropped silently. Please verify that the entry was accepted." ++msgstr "" ++ ++msgid "" ++"This configuration page allows you to configure a phone system (PBX) service " ++"which permits making phone calls through multiple Google and SIP (like " ++"Sipgate, SipSorcery, and Betamax) accounts and sharing them among many SIP " ++"devices. Note that Google accounts, SIP accounts, and local user accounts " ++"are configured in the \"Google Accounts\", \"SIP Accounts\", and \"User " ++"Accounts\" sub-sections. You must add at least one User Account to this PBX, " ++"and then configure a SIP device or softphone to use the account, in order to " ++"make and receive calls with your Google/SIP accounts. Configuring multiple " ++"users will allow you to make free calls between all users, and share the " ++"configured Google and SIP accounts. If you have more than one Google and SIP " ++"accounts set up, you should probably configure how calls to and from them " ++"are routed in the \"Call Routing\" page. If you're interested in using your " ++"own PBX from anywhere in the world, then visit the \"Remote Usage\" section " ++"in the \"Advanced Settings\" page." ++msgstr "" ++ ++msgid "" ++"This is the name that the VoIP server will use to identify itself when " ++"registering to VoIP (SIP) providers. Some providers require this to a " ++"specific string matching a hardware SIP device." ++msgstr "" ++ ++msgid "" ++"This is where you indicate which Google/SIP accounts are used to call what " ++"country/area codes, which users can use what SIP/Google accounts, how " ++"incoming calls are routed, what numbers can get into this PBX with a " ++"password, and what numbers are blacklisted." ++msgstr "" ++ ++msgid "" ++"This is where you set up your Google (Talk and Voice) Accounts, in order to " ++"start using them for dialing and receiving calls (voice chat and real phone " ++"calls). Please make at least one voice call using the Google Talk plugin " ++"installable through the GMail interface, and then log out from your account " ++"everywhere. Click \"Add\" to add as many accounts as you wish." ++msgstr "" ++ ++msgid "" ++"This is where you set up your SIP (VoIP) accounts ts like Sipgate, " ++"SipSorcery, the popular Betamax providers, and any other providers with SIP " ++"settings in order to start using them for dialing and receiving calls (SIP " ++"uri and real phone calls). Click \"Add\" to add as many accounts as you wish." ++msgstr "" ++ ++msgid "" ++"This option should be set to \"Yes\" if you have a DID (real telephone " ++"number) associated with this SIP account or want to receive SIP uri calls " ++"through this provider." ++msgstr "" ++ ++msgid "" ++"This section contains settings that do not need to be changed under normal " ++"circumstances. In addition, here you can configure your system for use with " ++"remote SIP devices, and resolve call quality issues by enabling the " ++"insertion of QoS rules." ++msgstr "" ++ ++msgid "" ++"Use (four to five digit) numeric user name if you are connecting normal " ++"telephones with ATAs to this system (so they can dial user names)." ++msgstr "" ++ ++msgid "" ++"Use this account to make outgoing calls as configured in the \"Call Routing" ++"\" section." ++msgstr "" ++ ++msgid "Use this account to make outgoing calls." ++msgstr "" ++ ++msgid "User Accounts" ++msgstr "" ++ ++msgid "User Agent String" ++msgstr "" ++ ++msgid "User Name" ++msgstr "" ++ ++msgid "Uses providers enabled for outgoing calls" ++msgstr "" ++ ++msgid "" ++"When somebody starts voice chat with your GTalk account or calls the GVoice, " ++"number (if you have Google Voice), the call will be forwarded to any users " ++"that are online (registered using a SIP device or softphone) and permitted " ++"to receive the call. If you have Google Voice, you must go to your GVoice " ++"settings and forward calls to Google chat in order to actually receive calls " ++"made to your GVoice number. If you have trouble receiving calls from GVoice, " ++"experiment with the Call Screening option in your GVoice Settings. Finally, " ++"make sure no other client is online with this account (browser in gmail, " ++"mobile/desktop Google Talk App) as it may interfere." ++msgstr "" ++ ++msgid "" ++"When your password is saved, it disappears from this field and is not " ++"displayed for your protection. The previously saved password will be changed " ++"only when you enter a value different from the saved one." ++msgstr "" ++ ++msgid "Yes" ++msgstr "" ++ ++msgid "" ++"You can enter your domain name, external IP address, or dynamic domain name " ++"here. The best thing to input is a static IP address. If your IP address is " ++"dynamic and it changes, your configuration will become invalid. Hence, it's " ++"recommended to set up Dynamic DNS in this case. and enter your Dynamic DNS " ++"hostname here. You can configure Dynamic DNS with the luci-app-ddns package." ++msgstr "" ++ ++msgid "You can specify a real name to show up in the Caller ID here." ++msgstr "" ++ ++msgid "" ++"You can use your SIP devices/softphones with this system from a remote " ++"location as well, as long as your Internet Service Provider gives you a " ++"public IP. You will be able to call other local users for free (e.g. other " ++"Analog Telephone Adapters (ATAs)) and use your VoIP providers to make calls " ++"as if you were local to the PBX. After configuring this tab, go back to " ++"where users are configured and see the new Server and Port setting you need " ++"to configure the remote SIP devices with. Please note that if this PBX is " ++"not running on your router/gateway, you will need to configure port " ++"forwarding (NAT) on your router/gateway. Please forward the ports below (SIP " ++"port and RTP range) to the IP address of the device running this PBX." ++msgstr "" ++ ++msgid "" ++"Your PIN disappears when saved for your protection. It will be changed only " ++"when you enter a value different from the saved one. Leaving the PIN empty " ++"is possible, but please beware of the security implications." ++msgstr "" ++ ++msgid "" ++"Your password disappears when saved for your protection. It will be changed " ++"only when you enter a value different from the saved one." ++msgstr "" +diff --git a/feeds/luci/applications/luci-app-pbx/po/pt-br/pbx.po b/feeds/luci/applications/luci-app-pbx/po/pt-br/pbx.po +new file mode 100644 +index 0000000..fd93e4f +--- /dev/null ++++ b/feeds/luci/applications/luci-app-pbx/po/pt-br/pbx.po +@@ -0,0 +1,744 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"PO-Revision-Date: 2014-08-04 09:00+0200\n" ++"Last-Translator: Luiz Angelo \n" ++"Language-Team: none\n" ++"Language: pt_BR\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n > 1);\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "Advanced Settings" ++msgstr "Configurações Avançadas" ++ ++msgid "Available" ++msgstr "Disponível" ++ ++msgid "" ++"Avoid using anything but alpha-numeric characters, space, comma, and period." ++msgstr "" ++"Evite usar qualquer carácter que não seja um alfanumérico, espaço, vírgula " ++"ou ponto." ++ ++msgid "Away" ++msgstr "Ausente" ++ ++msgid "Blacklisted Numbers" ++msgstr "Números na Lista Negra" ++ ++msgid "Call Routing" ++msgstr "Roteamento de Chamada" ++ ++# 20140630: edersg: tradução ++msgid "Call-back Numbers" ++msgstr "Voltar a discar os números" ++ ++# 20140630: edersg: tradução ++msgid "Call-back Provider" ++msgstr "Voltar a chamar o provedor" ++ ++msgid "Call-through Numbers" ++msgstr "Números de Ligação Direta" ++ ++msgid "Copy-paste large lists of numbers here." ++msgstr "Copie e cole aqui listas de números extensas." ++ ++# 20140630: edersg: tradução ++msgid "" ++"Designate numbers that are allowed to call through this system and which " ++"user's privileges they will have." ++msgstr "" ++"Designar os números que estão autorizados a chamar por este sistema e quais " ++"privilégios do usuário eles terão." ++ ++# 20140630: edersg: tradução ++msgid "" ++"Designate numbers to whom the system will hang up and call back, which " ++"provider will be used to call them, and which user's privileges will be " ++"granted to them." ++msgstr "" ++"Designar números para os quais o sistema irá desligar e ligar de volta, qual " ++"provedor será utilizado para chamá-los, e quais privilégios do usuário " ++"serão concedidos a eles." ++ ++msgid "Dials numbers unmatched elsewhere" ++msgstr "Disca números que não casam em qualquer lugar." ++ ++msgid "Do Not Disturb" ++msgstr "Não Perturbe" ++ ++msgid "Domain/IP Address/Dynamic Domain" ++msgstr "Domínio/Endereço IP/Domínio Dinâmico" ++ ++msgid "Dynamic List of Blacklisted Numbers" ++msgstr "Lista Dinâmica dos Números da Lista Negra" ++ ++msgid "Email" ++msgstr "Email" ++ ++msgid "Enable Incoming Calls (Register via SIP)" ++msgstr "Habilitar Chamadas Recebidas (Registrar pelo SIP)" ++ ++msgid "Enable Incoming Calls (set Status below)" ++msgstr "Habilitar Chamadas Recebidas (defina o Estado abaixo)" ++ ++msgid "Enable Outgoing Calls" ++msgstr "Habilitar Chamadas para Fora" ++ ++msgid "Enabled" ++msgstr "Habilitado" ++ ++# 20140630: edersg: tradução ++msgid "" ++"Enter a VoIP provider to use for call-back in the format username@some.host." ++"name, as listed in \"Outgoing Calls\" above. It's easiest to copy and paste " ++"the providers from above. Invalid entries, including providers not enabled " ++"for outgoing calls, will be rejected silently." ++msgstr "" ++"Digite um provedor VoIP para utilizar para voltar a chamada no formato " ++"username@some.host.name conforme listado acima em \"Chamadas Originadas\". É " ++"mais fácil copiar e colar os provedores. As entradas inválidas, incluindo " ++"provedores não habilitados para chamadas de saída, serão rejeitados em " ++"silêncio." ++ ++msgid "" ++"Enter phone numbers that you want to decline calls from automatically. You " ++"should probably omit the country code and any leading zeroes, but please " ++"experiment to make sure you are blocking numbers from your desired area " ++"successfully." ++msgstr "" ++"Entre com os números de telefone que você deseja rejeitar automaticamente. " ++"Você pode omitir o código do país e qualquer zeros no início, mas, por " ++"favor, teste para ter certeza que você está bloqueando da área desejada com " ++"sucesso." ++ ++msgid "" ++"Enter this IP (or IP:port) in the Server/Registrar setting of SIP devices " ++"you will use ONLY locally and never from a remote location." ++msgstr "" ++"Entre este endereço IP (ou IP:porta) na configuração de servidor/registrador " ++"dos seus dispositivos SIP que você irá usar SOMENTE localmente e nunca de um " ++"local remoto." ++ ++msgid "" ++"Enter this hostname (or hostname:port) in the Server/Registrar setting of " ++"SIP devices you will use from a remote location (they will work locally too)." ++msgstr "" ++"Entre com o nome do equipamento (ou equipamento:porta) na configuração de " ++"servidor/Registrar do seus dispositivos SIP que você irá usar de um local " ++"remoto (eles também funcionarão localmente)." ++ ++msgid "External SIP Port" ++msgstr "Porta SIP Externa" ++ ++msgid "" ++"For each provider enabled for incoming calls, here you can restrict which " ++"users to ring on incoming calls. If the list is empty, the system will " ++"indicate that all users enabled for incoming calls will ring. Invalid " ++"usernames will be rejected silently. Also, entering a username here " ++"overrides the user's setting to not receive incoming calls. This way, you " ++"can make certain users ring only for specific providers. Entries can be made " ++"in a space-separated list, and/or one per line by hitting enter after every " ++"one." ++msgstr "" ++"Para cada provedor habilitado para receber chamadas, aqui você pode " ++"restringir quais usuários tocarão quando receber chamadas. Se a lista " ++"estiver vazia, o sistema indicará que todos os usuários com recepção de " ++"chamadas habilitada tocarão. Nome de usuários inválidos serão rejeitados " ++"silenciosamente. Além disto, entrar com um nome de usuário aqui sobrescreve " ++"a configuração do usuário para não receber chamadas. Desta forma, você pode " ++"fazer com que alguns usuários toquem somente para alguns provedores " ++"específicos. As entradas podem ser inseridas usando uma lista separada por " ++"espaço ou um por nova linha." ++ ++msgid "" ++"For each user enabled for outgoing calls you can restrict what providers the " ++"user can use for outgoing calls. By default all users can use all providers. " ++"To show up in the list below the user should be allowed to make outgoing " ++"calls in the \"User Accounts\" page. Enter VoIP providers in the format " ++"username@some.host.name, as listed in \"Outgoing Calls\" above. It's easiest " ++"to copy and paste the providers from above. Invalid entries, including " ++"providers not enabled for outgoing calls, will be rejected silently. Entries " ++"can be made in a space-separated list, and/or one per line by hitting enter " ++"after every one." ++msgstr "" ++"Para cada usuário habilitado para realizar chamadas externas, você pode " ++"restringir quais provedores o usuário poderá usar. Por padrão, todos os " ++"usuários podem usar todos os provedores. Para aparecer na lista abaixo, o " ++"usuário deve estar habilitado para realizar chamadas externas na página de " ++"\"Contas de Usuários\". Entre com os provedores de VoIP no formato " ++"usuário@algum.nome.de.equipamento, como listado em \"Chamadas Efetuadas\" " ++"abaixo. É mais fácil copiar e colar os provedores da lista abaixo. Entradas " ++"inválidas, includindo provedores não habilitados para chamadas externas, " ++"serão rejeitadas silenciosamente. As entradas podem ser inseridas usando uma " ++"lista separada por espaço ou um por nova linha." ++ ++msgid "Full Name" ++msgstr "Nome Completo" ++ ++msgid "General Settings" ++msgstr "Configurações Gerais" ++ ++msgid "Google Accounts" ++msgstr "Contas do Google" ++ ++msgid "Google Talk Status" ++msgstr "Estado do Google Talk" ++ ++msgid "Google Talk Status Message" ++msgstr "Mensagem de Estado do Google Talk" ++ ++msgid "Google Voice/Talk Accounts" ++msgstr "Contas do Google Voice/Talk" ++ ++# 20140630: edersg: tradução ++msgid "Hang-up Delay" ++msgstr "Atraso de hang-up" ++ ++msgid "" ++"Here you must configure at least one SIP account, that you will use to " ++"register with this service. Use this account either in an Analog Telephony " ++"Adapter (ATA), or in a SIP software like CSipSimple, Linphone, or Sipdroid " ++"on your smartphone, or Ekiga, Linphone, or X-Lite on your computer. By " ++"default, all SIP accounts will ring simultaneously if a call is made to one " ++"of your VoIP provider accounts or GV numbers." ++msgstr "" ++"Aqui você deve configurar pelo menos uma conta SIP, que você irá usar para " ++"se cadastrar neste serviço. Use essa conta, seja em um adaptador de " ++"telefonia analógica (ATA), ou em um softphone SIP como Linphone, CSipSimple, " ++"ou Sipdroid em seu smartphone, ou o Ekiga, Linphone, ou X-Lite no seu " ++"computador. Por padrão, ao receber uma chamada em uma das suas contas nos " ++"provedores VoIP ou em números GV, todas as contas SIP tocarão " ++"simultaneamente." ++ ++# 20140630: edersg: tradução ++msgid "" ++"How long to wait before hanging up. If the provider you use to dial " ++"automatically forwards to voicemail, you can set this value to a delay that " ++"will allow you to hang up before your call gets forwarded and you get billed " ++"for it." ++msgstr "" ++"Quanto tempo esperar antes de desligar. Se o provedor que você utiliza para " ++"discar automaticamente encaminha para a caixa postal de voz, você pode " ++"definir este valor para um atraso que irá permitir que você desligue sua " ++"chamada antes de ser encaminhada e cobrado financeiramente por isso." ++ ++msgid "" ++"If setting Server/Registrar to %s or %s does not work for you, try setting " ++"it to %s or %s and entering this port number in a separate field that " ++"specifies the Server/Registrar port number. Beware that some devices have a " ++"confusing setting that sets the port where SIP requests originate from on " ++"the SIP device itself (the bind port). The port specified on this page is " ++"NOT this bind port but the port this service listens on." ++msgstr "" ++"Se definir o servidor/registrador como %s ou %s não funcionar para você, " ++"tente defini-lo como %s ou %s e entre com este número de porta em um campo " ++"separado que especifica o número da porta do servidor/registrador. Fique " ++"ciente que alguns dispositivos têm uma configuração confusa que define a " ++"porta de origem das solicitações SIP no dispositivo SIP em si (a porta local " ++"no dispositivo). A porta especificada nesta página não é essa porta de " ++"ligação, mas a porta na qual o serviço escutará serviço." ++ ++msgid "" ++"If you experience jittery or high latency audio during heavy downloads, you " ++"may want to enable QoS. QoS prioritizes traffic to and from your network for " ++"specified ports and IP addresses, resulting in better latency and throughput " ++"for sound in our case. If enabled below, a QoS rule for this service will be " ++"configured by the PBX automatically, but you must visit the QoS " ++"configuration page (Network->QoS) to configure other critical QoS settings " ++"like Download and Upload speed." ++msgstr "" ++"Se você sentir falhas ou alta latência enquanto baixa conteúdos pesados​​, " ++"você pode querer habilitar o QoS. O QoS prioriza o tráfego de e para a sua rede para endereços " ++"IP e portas específicas, resultando em melhor latência e redimento de som. " ++"Se ativado, será configurada automaticamente pelo PABX uma regra de QoS para este " ++"serviço, mas você deve visitar a página de configuração de QoS (Rede -> QoS) para " ++"configurar outras configurações críticas de QoS como as velocidades da sua " ++"conexão." ++ ++msgid "" ++"If you have more than one account that can make outgoing calls, you should " ++"enter a list of phone numbers and/or prefixes in the following fields for " ++"each provider listed. Invalid prefixes are removed silently, and only 0-9, " ++"X, Z, N, #, *, and + are valid characters. The letter X matches 0-9, Z " ++"matches 1-9, and N matches 2-9. For example to make calls to Germany through " ++"a provider, you can enter 49. To make calls to North America, you can enter " ++"1NXXNXXXXXX. If one of your providers can make \"local\" calls to an area " ++"code like New York's 646, you can enter 646NXXXXXX for that provider. You " ++"should leave one account with an empty list to make calls with it by " ++"default, if no other provider's prefixes match. The system will " ++"automatically replace an empty list with a message that the provider dials " ++"all numbers not matched by another provider's prefixes. Be as specific as " ++"possible (i.e. 1NXXNXXXXXX is better than 1). Please note all international " ++"dial codes are discarded (e.g. 00, 011, 010, 0011). Entries can be made in a " ++"space-separated list, and/or one per line by hitting enter after every one." ++msgstr "" ++"Se você tiver mais de uma conta que pode fazer chamadas externas, você deve " ++"informar uma lista de números de telefone e/ou prefixos nos seguintes campos " ++"para cada provedor listados. Prefixos inválidos são removidos " ++"silênciosamente, e some os caracteres 0-9, X, Z, N, # *,, e + são válidos. A " ++"letra X corresponde a 0-9, Z corresponde a 1-9, e N corresponde a 2-9. Por " ++"exemplo, para fazer chamadas para a Alemanha através de um provedor, você " ++"pode digitar 49. Para fazer chamadas para a América do Norte, você pode " ++"entrar 1NXXNXXXXXX. Se um de seus provedores pode fazer chamadas locais para " ++"um código de área como Nova York (646), você pode entrar com 646NXXXXXX para " ++"esse provedor. Você deve deixar uma conta com uma lista vazia para fazer " ++"chamadas com ele por padrão para o caso do prefixo não casar com nenhum " ++"outro fornecedor. O sistema irá substituir automaticamente uma lista vazia " ++"com uma mensagem que os este provedor será utilizado caso nenhuma das regras " ++"dos demais provedores casem. Seja tão específico quanto possível (isto é " ++"1NXXNXXXXXX é melhor do que 1). Por favor, note que todos os códigos de " ++"discagem internacionais são descartados (por exemplo 00, 011, 010, 0011). As " ++"entradas podem ser feitas em uma lista separada por espaços ou por nova " ++"linha." ++ ++msgid "Incoming Calls" ++msgstr "Chamadas Recebidas" ++ ++msgid "Insert QoS Rules" ++msgstr "Inserir Regras QoS" ++ ++msgid "Makes Outgoing Calls" ++msgstr "Realiza Chamadas para Fora" ++ ++msgid "NOTE: There are no Google or SIP provider accounts configured." ++msgstr "NOTA: Não existe uma conta Google ou provedor SIP configurado." ++ ++msgid "" ++"NOTE: There are no Google or SIP provider accounts enabled for incoming " ++"calls." ++msgstr "" ++"NOTA: Não existe uma conta Google ou provedor SIP habilitado para receber " ++"chamadas." ++ ++msgid "" ++"NOTE: There are no Google or SIP provider accounts enabled for outgoing " ++"calls." ++msgstr "" ++"NOTA: Não existe uma conta Google ou provedor SIP habilitado para efetuar " ++"chamadas externas." ++ ++msgid "NOTE: There are no local user accounts configured." ++msgstr "NOTA: Não existe uma conta local configurada." ++ ++msgid "NOTE: There are no local user accounts enabled for outgoing calls." ++msgstr "" ++"NOTA: Não existe uma conta local configurada para efetuar chamadas externas." ++ ++msgid "No" ++msgstr "Não" ++ ++msgid "Number of Seconds to Ring" ++msgstr "Número de Segundos para Tocar" ++ ++msgid "Outbound Proxy" ++msgstr "Proxy Externo" ++ ++msgid "Outgoing Calls" ++msgstr "Chamadas Efetuadas" ++ ++msgid "PBX Main Page" ++msgstr "Página Principal do PBX" ++ ++msgid "PBX Service Status" ++msgstr "Estado do Serviço PBX" ++ ++msgid "PIN" ++msgstr "PIN" ++ ++msgid "Password" ++msgstr "Senha" ++ ++msgid "" ++"Pick a random port number between 6500 and 9500 for the service to listen " ++"on. Do not pick the standard 5060, because it is often subject to brute-" ++"force attacks. When finished, (1) click \"Save and Apply\", and (2) look in " ++"the \"SIP Device/Softphone Accounts\" section for updated Server and Port " ++"settings for your SIP Devices/Softphones." ++msgstr "" ++"Escolha uma porta aleatória entre 6500 e 9500 onde o serviço irá escutar. " ++"Não escolha a porta padrão 5060 pois ela é frequentemente alvo de ataques de " ++"força bruta. Quanto terminar, (1) clique em \"Salvar e Aplicar\", e (2) olhe " ++"na seção \"Dispositivo SIP/Contas do Softphone\" para as configurações " ++"atualizadas do servidor e porta para o seu Dispositivo SIP/Softphone." ++ ++msgid "Port Setting for SIP Devices" ++msgstr "Configuração da Porta para Dispositivos SIP" ++ ++msgid "Providers Used for Outgoing Calls" ++msgstr "Provedores Usados para as Chamadas para Fora" ++ ++msgid "QoS Settings" ++msgstr "Configurações de QoS" ++ ++msgid "RTP Port Range End" ++msgstr "Final da Faixa de Portas RTP" ++ ++msgid "RTP Port Range Start" ++msgstr "Inicio da Faixa de Portas RTP" ++ ++msgid "" ++"RTP traffic carries actual voice packets. This is the start of the port " ++"range that will be used for setting up RTP communication. It's usually OK to " ++"leave this at the default value." ++msgstr "" ++"O tráfego RTP transporta de fato os pacotes de voz. Este é o início do " ++"intervalo de portas que será usado para a estabelecer uma comunicação RTP. " ++"Geralmente não é um problema deixar esta configuração com o valor padrão." ++ ++msgid "Receives Incoming Calls" ++msgstr "Recebe Chamadas para Dentro" ++ ++msgid "Remote Usage" ++msgstr "Uso Remoto" ++ ++msgid "Rings users enabled for incoming calls" ++msgstr "Toca usuários habilitados para receber chamadas" ++ ++msgid "SIP Accounts" ++msgstr "Contas SIP" ++ ++msgid "SIP Device/Softphone Accounts" ++msgstr "Contas de Dispositivos SIP/Telefones em Software" ++ ++msgid "SIP Provider Accounts" ++msgstr "Contas dos Provedores SIP" ++ ++msgid "SIP Realm (needed by some providers)" ++msgstr "Domínio SIP (necessário para alguns provedores)" ++ ++msgid "SIP Server/Registrar" ++msgstr "Servidor SIP/Registrador" ++ ++msgid "SIP Server/Registrar Port" ++msgstr "Porta do Servidor SIP/Registrador" ++ ++msgid "Server Setting" ++msgstr "Configuração do Servidor" ++ ++msgid "Server Setting for Local SIP Devices" ++msgstr "Configuração do Servidor para Dispositivos SIP Locais" ++ ++msgid "Server Setting for Remote SIP Devices" ++msgstr "Configuração do Servidor para Dispositivos SIP Remotos" ++ ++msgid "Service Status" ++msgstr "Estado do Serviço" ++ ++msgid "" ++"Set the number of seconds to ring users upon incoming calls before hanging " ++"up or going to voicemail, if the voicemail is installed and enabled." ++msgstr "" ++"Define o número de segundos para tocar o telefone ao receber chamadas antes " ++"de desligar ou ir para a caixa postal, se o correio de voz estiver instalado " ++"e habilitado." ++ ++msgid "Space-Separated List of Blacklisted Numbers" ++msgstr "Números na Lista Negra separados por Espaço" ++ ++msgid "Specify numbers individually here. Press enter to add more numbers." ++msgstr "" ++"Especifique os números individualmente aqui. Pressione o Enter para " ++"adicionar mais números." ++ ++msgid "" ++"Specify numbers individually here. Press enter to add more numbers. You will " ++"have to experiment with what country and area codes you need to add to the " ++"number." ++msgstr "" ++"Especifique aqui os números individualmente. Pressione o \"Enter\" para " ++"adicionar mais números. Você terá que experimentar com qual código de país " ++"ou de área você precisa adicionar aos números." ++ ++msgid "" ++"The number(s) specified above will be able to dial out with this user's " ++"providers. Invalid usernames, including users not enabled for outgoing " ++"calls, are dropped silently. Please verify that the entry was accepted." ++msgstr "" ++"O número(s) acima especificados serão capazes de discar com os provedores " ++"deste usuário. Nomes inválidos, incluindo usuários não habilitados para " ++"chamadas externas, serão descartados silenciosamente. Por favor, verifique " ++"se a entrada foi aceita." ++ ++msgid "" ++"This configuration page allows you to configure a phone system (PBX) service " ++"which permits making phone calls through multiple Google and SIP (like " ++"Sipgate, SipSorcery, and Betamax) accounts and sharing them among many SIP " ++"devices. Note that Google accounts, SIP accounts, and local user accounts " ++"are configured in the \"Google Accounts\", \"SIP Accounts\", and \"User " ++"Accounts\" sub-sections. You must add at least one User Account to this PBX, " ++"and then configure a SIP device or softphone to use the account, in order to " ++"make and receive calls with your Google/SIP accounts. Configuring multiple " ++"users will allow you to make free calls between all users, and share the " ++"configured Google and SIP accounts. If you have more than one Google and SIP " ++"accounts set up, you should probably configure how calls to and from them " ++"are routed in the \"Call Routing\" page. If you're interested in using your " ++"own PBX from anywhere in the world, then visit the \"Remote Usage\" section " ++"in the \"Advanced Settings\" page." ++msgstr "" ++"Esta página de configuração permite configurar um sistema de serviço de " ++"telefone (PABX), que permite fazer chamadas telefônicas através do Google " ++"múltipla e SIP (como Sipgate, SipSorcery e Betamax) contas e compartilhá-los " ++"entre diversos dispositivos SIP. Note-se que as contas do Google, contas " ++"SIP, e contas de usuários locais são configurados em \"Contas do Google\", " ++"\"Contas SIP\" e \"Contas de Usuário\" sub-seções. Você deve adicionar pelo " ++"menos uma conta de usuário para este PABX e configurar um dispositivo SIP ou " ++"softphone para usar a conta, a fim de fazer e receber chamadas com o " ++"Google / SIP contas. Configurando vários usuários permitem que você faça " ++"chamadas gratuitas entre todos os usuários, e partilhar o Google configurado " ++"e contas SIP. Se você tem mais de um Google e contas SIP configurado, você " ++"provavelmente deve configurar como as chamadas de e para eles são " ++"encaminhados para a \"Call Routing\" página. Se você está interessado em " ++"usar o seu próprio PABX de qualquer lugar do mundo, então, visitar o " ++"\"Remote Uso\" na seção \"Advanced Settings\" página." ++ ++msgid "" ++"This is the name that the VoIP server will use to identify itself when " ++"registering to VoIP (SIP) providers. Some providers require this to a " ++"specific string matching a hardware SIP device." ++msgstr "" ++"Este é o nome que o servidor VoIP será usado para identificar-se quando se " ++"registrar para VoIP (SIP) fornecedores. Alguns provedores exigem isso para " ++"uma seqüência específica de correspondência de um dispositivo de hardware " ++"SIP." ++ ++msgid "" ++"This is where you indicate which Google/SIP accounts are used to call what " ++"country/area codes, which users can use what SIP/Google accounts, how " ++"incoming calls are routed, what numbers can get into this PBX with a " ++"password, and what numbers are blacklisted." ++msgstr "" ++"Este é o local onde você indica quais contas Google/SIP serão usadas para " ++"chamar quais códigos de área/país, que usuários poderão usar quais contas " ++"Google/SIP, como as chamadas recebidas serão roteadas, que números podem ser " ++"recebidos por este PBX com uma senha e qual números estão banidos." ++ ++msgid "" ++"This is where you set up your Google (Talk and Voice) Accounts, in order to " ++"start using them for dialing and receiving calls (voice chat and real phone " ++"calls). Please make at least one voice call using the Google Talk plugin " ++"installable through the GMail interface, and then log out from your account " ++"everywhere. Click \"Add\" to add as many accounts as you wish." ++msgstr "" ++"Este é o local onde você configura suas contas Google (Talk e Voice) para " ++"poder usá-las para realizar ou receber chamadas (conversa por voz e chamadas " ++"para telefones reais). Por favor, realize ao menos uma chamada de voz usando " ++"o plugin do Google Talk, instalável na interface do GMail. Após esta " ++"chamada, saia da sua conta em todos os serviços. Clique em \"Adicionar\" " ++"para adicionar quantas contas você desejar." ++ ++msgid "" ++"This is where you set up your SIP (VoIP) accounts ts like Sipgate, " ++"SipSorcery, the popular Betamax providers, and any other providers with SIP " ++"settings in order to start using them for dialing and receiving calls (SIP " ++"uri and real phone calls). Click \"Add\" to add as many accounts as you wish." ++msgstr "" ++"Este é o local onde você configura suas contas SIP (VoIP) como Sipgate, " ++"SipSorcery, os populares provedores Betamax, e qualquer outro provedor com " ++"suporte a SIP para permitir o uso destas contas para efetuar e receber " ++"chamadas (URI de SIP e chamads para números reais). Clique em \"Adicionar\" " ++"para adicionar quantas contas você desejar." ++ ++msgid "" ++"This option should be set to \"Yes\" if you have a DID (real telephone " ++"number) associated with this SIP account or want to receive SIP uri calls " ++"through this provider." ++msgstr "" ++"Esta opção deve estar definida como \"Sim\" se você tem um DDR (Discagem " ++"Direta a Ramal) associado com esta conta SIP or quer receber chamadas URI de " ++"SIP através deste provedor." ++ ++msgid "" ++"This section contains settings that do not need to be changed under normal " ++"circumstances. In addition, here you can configure your system for use with " ++"remote SIP devices, and resolve call quality issues by enabling the " ++"insertion of QoS rules." ++msgstr "" ++"Esta seção contém configurações que não precisam ser modificadas em " ++"condições normais. Aqui você pode configurar seu sistema para usar com " ++"dispositivos SIP remotos e resolver problemas com a qualidade das chamadas " ++"através da inserção de regras de QoS." ++ ++msgid "" ++"Use (four to five digit) numeric user name if you are connecting normal " ++"telephones with ATAs to this system (so they can dial user names)." ++msgstr "" ++"Use o nome de usuário numérico (4 a 5 dígitos) se você estiver conectando " ++"telefones normais com ATAs para este sistema (para que eles possam discar os " ++"nomes de seus usuários)." ++ ++msgid "" ++"Use this account to make outgoing calls as configured in the \"Call Routing" ++"\" section." ++msgstr "" ++"Use esta conta para realizar chamadas externas como configurado na seção de " ++"\"Roteamento de Chamada\"." ++ ++msgid "Use this account to make outgoing calls." ++msgstr "Use esta conta para realizar chamadas externas." ++ ++msgid "User Accounts" ++msgstr "Contas de Usuários" ++ ++msgid "User Agent String" ++msgstr "Texto para o Agente do Usuário" ++ ++msgid "User Name" ++msgstr "Nome do Usuário" ++ ++msgid "Uses providers enabled for outgoing calls" ++msgstr "Usa provedores habilitados para chamadas externas" ++ ++msgid "" ++"When somebody starts voice chat with your GTalk account or calls the GVoice, " ++"number (if you have Google Voice), the call will be forwarded to any users " ++"that are online (registered using a SIP device or softphone) and permitted " ++"to receive the call. If you have Google Voice, you must go to your GVoice " ++"settings and forward calls to Google chat in order to actually receive calls " ++"made to your GVoice number. If you have trouble receiving calls from GVoice, " ++"experiment with the Call Screening option in your GVoice Settings. Finally, " ++"make sure no other client is online with this account (browser in gmail, " ++"mobile/desktop Google Talk App) as it may interfere." ++msgstr "" ++"Quando alguém iniciar uma conversa por voz com sua conta do GTalk ou chamar " ++"seu número GVoice (se você tiver uma conta Google Voice), a chamada será " ++"encaminhada para qualquer usuários que estão conectados (registados " ++"utilizando um dispositivo SIP ou softphone) e autorizados a receber a " ++"chamada. Se você tiver uma conta Google Voice, você deve ir para as " ++"configurações da sua conta GVoice e encaminhar as chamadas para o Google " ++"Chat, a fim de realmente receber chamadas feitas para o seu número GVoice. " ++"Se você tiver problemas para receber chamadas oriundas do GVoice, " ++"experimente a opção \"Call Screening/Monitoramento de Chamadas\" na " ++"configurações da sua conta GVoice. Finalmente, certifique-se de nenhum outro " ++"cliente está online com essa conta (navegador contado no GMail, aplicativo " ++"Google Talk no Desktop ou Celular), pois isto pode interferir." ++ ++msgid "" ++"When your password is saved, it disappears from this field and is not " ++"displayed for your protection. The previously saved password will be changed " ++"only when you enter a value different from the saved one." ++msgstr "" ++"Quando a sua senha for salva, ela desaparece deste campo e não será exibida " ++"para sua proteção. A senha será alterada somente quando você informar uma " ++"nova senha diferente da que foi salva anteriormente." ++ ++msgid "Yes" ++msgstr "Sim" ++ ++msgid "" ++"You can enter your domain name, external IP address, or dynamic domain name " ++"here. The best thing to input is a static IP address. If your IP address is " ++"dynamic and it changes, your configuration will become invalid. Hence, it's " ++"recommended to set up Dynamic DNS in this case. and enter your Dynamic DNS " ++"hostname here. You can configure Dynamic DNS with the luci-app-ddns package." ++msgstr "" ++"Você pode informar aqui o nome do domínio, endereço IP externo, ou um nome " ++"de domínio dinâmico. O melhor é informar um endereço IP estático. Se o seu " ++"endereço IP é dinâmico e ele muda, sua configuração se tornará inválida. " ++"Desta forma, é recomendado configurar um serviço de domínios dinâmicos e " ++"utilizar este nome aqui. Você pode configurar o serviço de domínios " ++"dinâmicos com o pacote luci-app-ddns." ++ ++msgid "You can specify a real name to show up in the Caller ID here." ++msgstr "" ++"Você pode especificar um nome real para aparecer no identificador de " ++"chamadas." ++ ++msgid "" ++"You can use your SIP devices/softphones with this system from a remote " ++"location as well, as long as your Internet Service Provider gives you a " ++"public IP. You will be able to call other local users for free (e.g. other " ++"Analog Telephone Adapters (ATAs)) and use your VoIP providers to make calls " ++"as if you were local to the PBX. After configuring this tab, go back to " ++"where users are configured and see the new Server and Port setting you need " ++"to configure the remote SIP devices with. Please note that if this PBX is " ++"not running on your router/gateway, you will need to configure port " ++"forwarding (NAT) on your router/gateway. Please forward the ports below (SIP " ++"port and RTP range) to the IP address of the device running this PBX." ++msgstr "" ++"Você pode usar seus dispositivos SIP/softphones com este sistema a partir de " ++"um local remoto, desde que o seu provedor de Internet lhe forneça um " ++"endereço IP público. Você poderá ligar para outros usuários locais sem custo " ++"(por exemplo, outros adaptadores de telefone analógico (ATAs)) e usar seus " ++"provedores de VoIP para fazer chamadas como se fossem originadas do local do " ++"seu PBX. Depois de configurar esta aba, volte para onde os usuários são " ++"configurados e veja as novas configurações de servidor e porta com as quais " ++"você precisa configurar os seus dispositivos SIP remotos. Por favor, note " ++"que se este PABX não está rodando no seu roteador, você terá que configurar " ++"o redirecionamento de portas (NAT) no seu roteador. Por favor, encaminhe as " ++"portas abaixo (porta SIP e intervalo de porta RTP) para o endereço IP do " ++"dispositivo que executa este PBX." ++ ++msgid "" ++"Your PIN disappears when saved for your protection. It will be changed only " ++"when you enter a value different from the saved one. Leaving the PIN empty " ++"is possible, but please beware of the security implications." ++msgstr "" ++"Seu PIN desaparece deste campo quando for salvo e não será exibido para sua " ++"proteção. Ele será alterada somente quando você informar um PIN diferente do " ++"que foi salvo anteriormente. É possível deixá-lo em branco mas fique atento " ++"quanto as implicações na segurança." ++ ++msgid "" ++"Your password disappears when saved for your protection. It will be changed " ++"only when you enter a value different from the saved one." ++msgstr "" ++"Sua senha desaparece deste campo quando for salva e não será exibida para " ++"sua proteção. A senha será alterada somente quando você informar uma nova " ++"senha diferente da que foi salva anteriormente." ++ ++#~ msgid "" ++#~ "Designate numbers that are allowed to call through this system and which " ++#~ "user's privileges it will have." ++#~ msgstr "" ++#~ "Números definidos que poderão realizar chamadas através deste sistema e " ++#~ "quais privilégios o usuário terá." ++ ++#~ msgid "" ++#~ "Pick a random port number between 6500 and 9500 for the service to listen " ++#~ "on. Do not pick the standard 5060, because it is often subject to brute-" ++#~ "force attacks. When finished, (1) click \"Save and Apply\", and (2) click " ++#~ "the \"Restart VoIP Service\" button above. Finally, (3) look in the \"SIP " ++#~ "Device/Softphone Accounts\" section for updated Server and Port settings " ++#~ "for your SIP Devices/Softphones." ++#~ msgstr "" ++#~ "Escolha um número de porta aleatória entre 6500 e 9500 para o serviço " ++#~ "escutar. Não escolher o padrão 5060, porque é frequentemente alvo de ataques " ++#~ "de força bruta. Quando terminar, (1) clique em \"Salvar e Aplicar\", e (2) " ++#~ "clique no \"Reiniciar o serviço VoIP\" acima. Finalmente, (3) olhe na seção " ++#~ "\"Contas de Dispositivos SIP/Telefones em Software\" para atualizar o endereço " ++#~ "e porta do servidor para seu Dispositivos SIP/Telefones em Software." ++ ++#~ msgid "" ++#~ "You can enter your domain name, external IP address, or dynamic domain " ++#~ "name here Please keep in mind that if your IP address is dynamic and it " ++#~ "changes your configuration will become invalid. Hence, it's recommended " ++#~ "to set up Dynamic DNS in this case." ++#~ msgstr "" ++#~ "Você pode digitar aqui o seu nome de domínio, endereço IP externo, ou nome " ++#~ "de domínio dinâmico. Tenha em mente que se o seu endereço IP é dinâmico e " ++#~ "ele mudar, a sua configuração se tornará inválida. Por isso, é recomendado " ++#~ "configurar um DNS dinâmico neste caso." ++ ++#~ msgid "Account Status" ++#~ msgstr "Estado da Conta" ++ ++#~ msgid "Account Status Message" ++#~ msgstr "Mensagem do Estado da Conta" ++ ++#~ msgid "Domain Name/Dynamic Domain Name" ++#~ msgstr "Nome do Domínio/Nome do Domínio Dinâmico" ++ ++#~ msgid "Enable Incoming Calls (See Status, Message below)" ++#~ msgstr "Habilitar Chamadas Recebidas (Veja o Estado, Mensagem abaixo)" ++ ++#~ msgid "Service Control and Connection Status" ++#~ msgstr "Controle do Serviço e Estado da Conexão" +diff --git a/feeds/luci/applications/luci-app-pbx/po/pt/pbx.po b/feeds/luci/applications/luci-app-pbx/po/pt/pbx.po +new file mode 100644 +index 0000000..75b6c8c +--- /dev/null ++++ b/feeds/luci/applications/luci-app-pbx/po/pt/pbx.po +@@ -0,0 +1,487 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"PO-Revision-Date: 2013-09-22 19:17+0200\n" ++"Last-Translator: Low \n" ++"Language-Team: none\n" ++"Language: pt\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n != 1);\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "Advanced Settings" ++msgstr "" ++ ++msgid "Available" ++msgstr "Disponível" ++ ++msgid "" ++"Avoid using anything but alpha-numeric characters, space, comma, and period." ++msgstr "" ++ ++msgid "Away" ++msgstr "" ++ ++msgid "Blacklisted Numbers" ++msgstr "" ++ ++msgid "Call Routing" ++msgstr "" ++ ++msgid "Call-back Numbers" ++msgstr "" ++ ++msgid "Call-back Provider" ++msgstr "" ++ ++msgid "Call-through Numbers" ++msgstr "" ++ ++msgid "Copy-paste large lists of numbers here." ++msgstr "" ++ ++msgid "" ++"Designate numbers that are allowed to call through this system and which " ++"user's privileges they will have." ++msgstr "" ++ ++msgid "" ++"Designate numbers to whom the system will hang up and call back, which " ++"provider will be used to call them, and which user's privileges will be " ++"granted to them." ++msgstr "" ++ ++msgid "Dials numbers unmatched elsewhere" ++msgstr "" ++ ++msgid "Do Not Disturb" ++msgstr "" ++ ++msgid "Domain/IP Address/Dynamic Domain" ++msgstr "" ++ ++msgid "Dynamic List of Blacklisted Numbers" ++msgstr "" ++ ++msgid "Email" ++msgstr "" ++ ++msgid "Enable Incoming Calls (Register via SIP)" ++msgstr "" ++ ++msgid "Enable Incoming Calls (set Status below)" ++msgstr "" ++ ++msgid "Enable Outgoing Calls" ++msgstr "" ++ ++msgid "Enabled" ++msgstr "Ativado" ++ ++msgid "" ++"Enter a VoIP provider to use for call-back in the format username@some.host." ++"name, as listed in \"Outgoing Calls\" above. It's easiest to copy and paste " ++"the providers from above. Invalid entries, including providers not enabled " ++"for outgoing calls, will be rejected silently." ++msgstr "" ++ ++msgid "" ++"Enter phone numbers that you want to decline calls from automatically. You " ++"should probably omit the country code and any leading zeroes, but please " ++"experiment to make sure you are blocking numbers from your desired area " ++"successfully." ++msgstr "" ++ ++msgid "" ++"Enter this IP (or IP:port) in the Server/Registrar setting of SIP devices " ++"you will use ONLY locally and never from a remote location." ++msgstr "" ++ ++msgid "" ++"Enter this hostname (or hostname:port) in the Server/Registrar setting of " ++"SIP devices you will use from a remote location (they will work locally too)." ++msgstr "" ++ ++msgid "External SIP Port" ++msgstr "" ++ ++msgid "" ++"For each provider enabled for incoming calls, here you can restrict which " ++"users to ring on incoming calls. If the list is empty, the system will " ++"indicate that all users enabled for incoming calls will ring. Invalid " ++"usernames will be rejected silently. Also, entering a username here " ++"overrides the user's setting to not receive incoming calls. This way, you " ++"can make certain users ring only for specific providers. Entries can be made " ++"in a space-separated list, and/or one per line by hitting enter after every " ++"one." ++msgstr "" ++ ++msgid "" ++"For each user enabled for outgoing calls you can restrict what providers the " ++"user can use for outgoing calls. By default all users can use all providers. " ++"To show up in the list below the user should be allowed to make outgoing " ++"calls in the \"User Accounts\" page. Enter VoIP providers in the format " ++"username@some.host.name, as listed in \"Outgoing Calls\" above. It's easiest " ++"to copy and paste the providers from above. Invalid entries, including " ++"providers not enabled for outgoing calls, will be rejected silently. Entries " ++"can be made in a space-separated list, and/or one per line by hitting enter " ++"after every one." ++msgstr "" ++ ++msgid "Full Name" ++msgstr "Nome Completo" ++ ++msgid "General Settings" ++msgstr "" ++ ++msgid "Google Accounts" ++msgstr "" ++ ++msgid "Google Talk Status" ++msgstr "" ++ ++msgid "Google Talk Status Message" ++msgstr "" ++ ++msgid "Google Voice/Talk Accounts" ++msgstr "" ++ ++msgid "Hang-up Delay" ++msgstr "" ++ ++msgid "" ++"Here you must configure at least one SIP account, that you will use to " ++"register with this service. Use this account either in an Analog Telephony " ++"Adapter (ATA), or in a SIP software like CSipSimple, Linphone, or Sipdroid " ++"on your smartphone, or Ekiga, Linphone, or X-Lite on your computer. By " ++"default, all SIP accounts will ring simultaneously if a call is made to one " ++"of your VoIP provider accounts or GV numbers." ++msgstr "" ++ ++msgid "" ++"How long to wait before hanging up. If the provider you use to dial " ++"automatically forwards to voicemail, you can set this value to a delay that " ++"will allow you to hang up before your call gets forwarded and you get billed " ++"for it." ++msgstr "" ++ ++msgid "" ++"If setting Server/Registrar to %s or %s does not work for you, try setting " ++"it to %s or %s and entering this port number in a separate field that " ++"specifies the Server/Registrar port number. Beware that some devices have a " ++"confusing setting that sets the port where SIP requests originate from on " ++"the SIP device itself (the bind port). The port specified on this page is " ++"NOT this bind port but the port this service listens on." ++msgstr "" ++ ++msgid "" ++"If you experience jittery or high latency audio during heavy downloads, you " ++"may want to enable QoS. QoS prioritizes traffic to and from your network for " ++"specified ports and IP addresses, resulting in better latency and throughput " ++"for sound in our case. If enabled below, a QoS rule for this service will be " ++"configured by the PBX automatically, but you must visit the QoS " ++"configuration page (Network->QoS) to configure other critical QoS settings " ++"like Download and Upload speed." ++msgstr "" ++ ++msgid "" ++"If you have more than one account that can make outgoing calls, you should " ++"enter a list of phone numbers and/or prefixes in the following fields for " ++"each provider listed. Invalid prefixes are removed silently, and only 0-9, " ++"X, Z, N, #, *, and + are valid characters. The letter X matches 0-9, Z " ++"matches 1-9, and N matches 2-9. For example to make calls to Germany through " ++"a provider, you can enter 49. To make calls to North America, you can enter " ++"1NXXNXXXXXX. If one of your providers can make \"local\" calls to an area " ++"code like New York's 646, you can enter 646NXXXXXX for that provider. You " ++"should leave one account with an empty list to make calls with it by " ++"default, if no other provider's prefixes match. The system will " ++"automatically replace an empty list with a message that the provider dials " ++"all numbers not matched by another provider's prefixes. Be as specific as " ++"possible (i.e. 1NXXNXXXXXX is better than 1). Please note all international " ++"dial codes are discarded (e.g. 00, 011, 010, 0011). Entries can be made in a " ++"space-separated list, and/or one per line by hitting enter after every one." ++msgstr "" ++ ++msgid "Incoming Calls" ++msgstr "" ++ ++msgid "Insert QoS Rules" ++msgstr "" ++ ++msgid "Makes Outgoing Calls" ++msgstr "" ++ ++msgid "NOTE: There are no Google or SIP provider accounts configured." ++msgstr "" ++ ++msgid "" ++"NOTE: There are no Google or SIP provider accounts enabled for incoming " ++"calls." ++msgstr "" ++ ++msgid "" ++"NOTE: There are no Google or SIP provider accounts enabled for outgoing " ++"calls." ++msgstr "" ++ ++msgid "NOTE: There are no local user accounts configured." ++msgstr "" ++ ++msgid "NOTE: There are no local user accounts enabled for outgoing calls." ++msgstr "" ++ ++msgid "No" ++msgstr "Não" ++ ++msgid "Number of Seconds to Ring" ++msgstr "" ++ ++msgid "Outbound Proxy" ++msgstr "" ++ ++msgid "Outgoing Calls" ++msgstr "" ++ ++msgid "PBX Main Page" ++msgstr "" ++ ++msgid "PBX Service Status" ++msgstr "" ++ ++msgid "PIN" ++msgstr "" ++ ++msgid "Password" ++msgstr "" ++ ++msgid "" ++"Pick a random port number between 6500 and 9500 for the service to listen " ++"on. Do not pick the standard 5060, because it is often subject to brute-" ++"force attacks. When finished, (1) click \"Save and Apply\", and (2) look in " ++"the \"SIP Device/Softphone Accounts\" section for updated Server and Port " ++"settings for your SIP Devices/Softphones." ++msgstr "" ++ ++msgid "Port Setting for SIP Devices" ++msgstr "" ++ ++msgid "Providers Used for Outgoing Calls" ++msgstr "" ++ ++msgid "QoS Settings" ++msgstr "" ++ ++msgid "RTP Port Range End" ++msgstr "" ++ ++msgid "RTP Port Range Start" ++msgstr "" ++ ++msgid "" ++"RTP traffic carries actual voice packets. This is the start of the port " ++"range that will be used for setting up RTP communication. It's usually OK to " ++"leave this at the default value." ++msgstr "" ++ ++msgid "Receives Incoming Calls" ++msgstr "" ++ ++msgid "Remote Usage" ++msgstr "" ++ ++msgid "Rings users enabled for incoming calls" ++msgstr "" ++ ++msgid "SIP Accounts" ++msgstr "" ++ ++msgid "SIP Device/Softphone Accounts" ++msgstr "" ++ ++msgid "SIP Provider Accounts" ++msgstr "" ++ ++msgid "SIP Realm (needed by some providers)" ++msgstr "" ++ ++msgid "SIP Server/Registrar" ++msgstr "" ++ ++msgid "SIP Server/Registrar Port" ++msgstr "" ++ ++msgid "Server Setting" ++msgstr "" ++ ++msgid "Server Setting for Local SIP Devices" ++msgstr "" ++ ++msgid "Server Setting for Remote SIP Devices" ++msgstr "" ++ ++msgid "Service Status" ++msgstr "" ++ ++msgid "" ++"Set the number of seconds to ring users upon incoming calls before hanging " ++"up or going to voicemail, if the voicemail is installed and enabled." ++msgstr "" ++ ++msgid "Space-Separated List of Blacklisted Numbers" ++msgstr "" ++ ++msgid "Specify numbers individually here. Press enter to add more numbers." ++msgstr "" ++ ++msgid "" ++"Specify numbers individually here. Press enter to add more numbers. You will " ++"have to experiment with what country and area codes you need to add to the " ++"number." ++msgstr "" ++ ++msgid "" ++"The number(s) specified above will be able to dial out with this user's " ++"providers. Invalid usernames, including users not enabled for outgoing " ++"calls, are dropped silently. Please verify that the entry was accepted." ++msgstr "" ++ ++msgid "" ++"This configuration page allows you to configure a phone system (PBX) service " ++"which permits making phone calls through multiple Google and SIP (like " ++"Sipgate, SipSorcery, and Betamax) accounts and sharing them among many SIP " ++"devices. Note that Google accounts, SIP accounts, and local user accounts " ++"are configured in the \"Google Accounts\", \"SIP Accounts\", and \"User " ++"Accounts\" sub-sections. You must add at least one User Account to this PBX, " ++"and then configure a SIP device or softphone to use the account, in order to " ++"make and receive calls with your Google/SIP accounts. Configuring multiple " ++"users will allow you to make free calls between all users, and share the " ++"configured Google and SIP accounts. If you have more than one Google and SIP " ++"accounts set up, you should probably configure how calls to and from them " ++"are routed in the \"Call Routing\" page. If you're interested in using your " ++"own PBX from anywhere in the world, then visit the \"Remote Usage\" section " ++"in the \"Advanced Settings\" page." ++msgstr "" ++ ++msgid "" ++"This is the name that the VoIP server will use to identify itself when " ++"registering to VoIP (SIP) providers. Some providers require this to a " ++"specific string matching a hardware SIP device." ++msgstr "" ++ ++msgid "" ++"This is where you indicate which Google/SIP accounts are used to call what " ++"country/area codes, which users can use what SIP/Google accounts, how " ++"incoming calls are routed, what numbers can get into this PBX with a " ++"password, and what numbers are blacklisted." ++msgstr "" ++ ++msgid "" ++"This is where you set up your Google (Talk and Voice) Accounts, in order to " ++"start using them for dialing and receiving calls (voice chat and real phone " ++"calls). Please make at least one voice call using the Google Talk plugin " ++"installable through the GMail interface, and then log out from your account " ++"everywhere. Click \"Add\" to add as many accounts as you wish." ++msgstr "" ++ ++msgid "" ++"This is where you set up your SIP (VoIP) accounts ts like Sipgate, " ++"SipSorcery, the popular Betamax providers, and any other providers with SIP " ++"settings in order to start using them for dialing and receiving calls (SIP " ++"uri and real phone calls). Click \"Add\" to add as many accounts as you wish." ++msgstr "" ++ ++msgid "" ++"This option should be set to \"Yes\" if you have a DID (real telephone " ++"number) associated with this SIP account or want to receive SIP uri calls " ++"through this provider." ++msgstr "" ++ ++msgid "" ++"This section contains settings that do not need to be changed under normal " ++"circumstances. In addition, here you can configure your system for use with " ++"remote SIP devices, and resolve call quality issues by enabling the " ++"insertion of QoS rules." ++msgstr "" ++ ++msgid "" ++"Use (four to five digit) numeric user name if you are connecting normal " ++"telephones with ATAs to this system (so they can dial user names)." ++msgstr "" ++ ++msgid "" ++"Use this account to make outgoing calls as configured in the \"Call Routing" ++"\" section." ++msgstr "" ++ ++msgid "Use this account to make outgoing calls." ++msgstr "" ++ ++msgid "User Accounts" ++msgstr "" ++ ++msgid "User Agent String" ++msgstr "" ++ ++msgid "User Name" ++msgstr "" ++ ++msgid "Uses providers enabled for outgoing calls" ++msgstr "" ++ ++msgid "" ++"When somebody starts voice chat with your GTalk account or calls the GVoice, " ++"number (if you have Google Voice), the call will be forwarded to any users " ++"that are online (registered using a SIP device or softphone) and permitted " ++"to receive the call. If you have Google Voice, you must go to your GVoice " ++"settings and forward calls to Google chat in order to actually receive calls " ++"made to your GVoice number. If you have trouble receiving calls from GVoice, " ++"experiment with the Call Screening option in your GVoice Settings. Finally, " ++"make sure no other client is online with this account (browser in gmail, " ++"mobile/desktop Google Talk App) as it may interfere." ++msgstr "" ++ ++msgid "" ++"When your password is saved, it disappears from this field and is not " ++"displayed for your protection. The previously saved password will be changed " ++"only when you enter a value different from the saved one." ++msgstr "" ++ ++msgid "Yes" ++msgstr "Sim" ++ ++msgid "" ++"You can enter your domain name, external IP address, or dynamic domain name " ++"here. The best thing to input is a static IP address. If your IP address is " ++"dynamic and it changes, your configuration will become invalid. Hence, it's " ++"recommended to set up Dynamic DNS in this case. and enter your Dynamic DNS " ++"hostname here. You can configure Dynamic DNS with the luci-app-ddns package." ++msgstr "" ++ ++msgid "You can specify a real name to show up in the Caller ID here." ++msgstr "" ++ ++msgid "" ++"You can use your SIP devices/softphones with this system from a remote " ++"location as well, as long as your Internet Service Provider gives you a " ++"public IP. You will be able to call other local users for free (e.g. other " ++"Analog Telephone Adapters (ATAs)) and use your VoIP providers to make calls " ++"as if you were local to the PBX. After configuring this tab, go back to " ++"where users are configured and see the new Server and Port setting you need " ++"to configure the remote SIP devices with. Please note that if this PBX is " ++"not running on your router/gateway, you will need to configure port " ++"forwarding (NAT) on your router/gateway. Please forward the ports below (SIP " ++"port and RTP range) to the IP address of the device running this PBX." ++msgstr "" ++ ++msgid "" ++"Your PIN disappears when saved for your protection. It will be changed only " ++"when you enter a value different from the saved one. Leaving the PIN empty " ++"is possible, but please beware of the security implications." ++msgstr "" ++ ++msgid "" ++"Your password disappears when saved for your protection. It will be changed " ++"only when you enter a value different from the saved one." ++msgstr "" +diff --git a/feeds/luci/applications/luci-app-pbx/po/ro/pbx.po b/feeds/luci/applications/luci-app-pbx/po/ro/pbx.po +new file mode 100644 +index 0000000..49e8dac +--- /dev/null ++++ b/feeds/luci/applications/luci-app-pbx/po/ro/pbx.po +@@ -0,0 +1,488 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"PO-Revision-Date: 2014-06-28 18:50+0200\n" ++"Last-Translator: xxvirusxx \n" ++"Language-Team: none\n" ++"Language: ro\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=3; plural=(n==1 ? 0 : (n==0 || (n%100 > 0 && n%100 < " ++"20)) ? 1 : 2);;\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "Advanced Settings" ++msgstr "Setări avansate" ++ ++msgid "Available" ++msgstr "Disponibil" ++ ++msgid "" ++"Avoid using anything but alpha-numeric characters, space, comma, and period." ++msgstr "" ++ ++msgid "Away" ++msgstr "" ++ ++msgid "Blacklisted Numbers" ++msgstr "" ++ ++msgid "Call Routing" ++msgstr "" ++ ++msgid "Call-back Numbers" ++msgstr "" ++ ++msgid "Call-back Provider" ++msgstr "" ++ ++msgid "Call-through Numbers" ++msgstr "" ++ ++msgid "Copy-paste large lists of numbers here." ++msgstr "" ++ ++msgid "" ++"Designate numbers that are allowed to call through this system and which " ++"user's privileges they will have." ++msgstr "" ++ ++msgid "" ++"Designate numbers to whom the system will hang up and call back, which " ++"provider will be used to call them, and which user's privileges will be " ++"granted to them." ++msgstr "" ++ ++msgid "Dials numbers unmatched elsewhere" ++msgstr "" ++ ++msgid "Do Not Disturb" ++msgstr "Nu deranjaÅ£i" ++ ++msgid "Domain/IP Address/Dynamic Domain" ++msgstr "Domeniu/Adresă IP/Domeniu dinamic" ++ ++msgid "Dynamic List of Blacklisted Numbers" ++msgstr "" ++ ++msgid "Email" ++msgstr "" ++ ++msgid "Enable Incoming Calls (Register via SIP)" ++msgstr "" ++ ++msgid "Enable Incoming Calls (set Status below)" ++msgstr "" ++ ++msgid "Enable Outgoing Calls" ++msgstr "" ++ ++msgid "Enabled" ++msgstr "Activat" ++ ++msgid "" ++"Enter a VoIP provider to use for call-back in the format username@some.host." ++"name, as listed in \"Outgoing Calls\" above. It's easiest to copy and paste " ++"the providers from above. Invalid entries, including providers not enabled " ++"for outgoing calls, will be rejected silently." ++msgstr "" ++ ++msgid "" ++"Enter phone numbers that you want to decline calls from automatically. You " ++"should probably omit the country code and any leading zeroes, but please " ++"experiment to make sure you are blocking numbers from your desired area " ++"successfully." ++msgstr "" ++ ++msgid "" ++"Enter this IP (or IP:port) in the Server/Registrar setting of SIP devices " ++"you will use ONLY locally and never from a remote location." ++msgstr "" ++ ++msgid "" ++"Enter this hostname (or hostname:port) in the Server/Registrar setting of " ++"SIP devices you will use from a remote location (they will work locally too)." ++msgstr "" ++ ++msgid "External SIP Port" ++msgstr "" ++ ++msgid "" ++"For each provider enabled for incoming calls, here you can restrict which " ++"users to ring on incoming calls. If the list is empty, the system will " ++"indicate that all users enabled for incoming calls will ring. Invalid " ++"usernames will be rejected silently. Also, entering a username here " ++"overrides the user's setting to not receive incoming calls. This way, you " ++"can make certain users ring only for specific providers. Entries can be made " ++"in a space-separated list, and/or one per line by hitting enter after every " ++"one." ++msgstr "" ++ ++msgid "" ++"For each user enabled for outgoing calls you can restrict what providers the " ++"user can use for outgoing calls. By default all users can use all providers. " ++"To show up in the list below the user should be allowed to make outgoing " ++"calls in the \"User Accounts\" page. Enter VoIP providers in the format " ++"username@some.host.name, as listed in \"Outgoing Calls\" above. It's easiest " ++"to copy and paste the providers from above. Invalid entries, including " ++"providers not enabled for outgoing calls, will be rejected silently. Entries " ++"can be made in a space-separated list, and/or one per line by hitting enter " ++"after every one." ++msgstr "" ++ ++msgid "Full Name" ++msgstr "Nume complet" ++ ++msgid "General Settings" ++msgstr "Setări generale" ++ ++msgid "Google Accounts" ++msgstr "Conturi Google" ++ ++msgid "Google Talk Status" ++msgstr "" ++ ++msgid "Google Talk Status Message" ++msgstr "" ++ ++msgid "Google Voice/Talk Accounts" ++msgstr "" ++ ++msgid "Hang-up Delay" ++msgstr "" ++ ++msgid "" ++"Here you must configure at least one SIP account, that you will use to " ++"register with this service. Use this account either in an Analog Telephony " ++"Adapter (ATA), or in a SIP software like CSipSimple, Linphone, or Sipdroid " ++"on your smartphone, or Ekiga, Linphone, or X-Lite on your computer. By " ++"default, all SIP accounts will ring simultaneously if a call is made to one " ++"of your VoIP provider accounts or GV numbers." ++msgstr "" ++ ++msgid "" ++"How long to wait before hanging up. If the provider you use to dial " ++"automatically forwards to voicemail, you can set this value to a delay that " ++"will allow you to hang up before your call gets forwarded and you get billed " ++"for it." ++msgstr "" ++ ++msgid "" ++"If setting Server/Registrar to %s or %s does not work for you, try setting " ++"it to %s or %s and entering this port number in a separate field that " ++"specifies the Server/Registrar port number. Beware that some devices have a " ++"confusing setting that sets the port where SIP requests originate from on " ++"the SIP device itself (the bind port). The port specified on this page is " ++"NOT this bind port but the port this service listens on." ++msgstr "" ++ ++msgid "" ++"If you experience jittery or high latency audio during heavy downloads, you " ++"may want to enable QoS. QoS prioritizes traffic to and from your network for " ++"specified ports and IP addresses, resulting in better latency and throughput " ++"for sound in our case. If enabled below, a QoS rule for this service will be " ++"configured by the PBX automatically, but you must visit the QoS " ++"configuration page (Network->QoS) to configure other critical QoS settings " ++"like Download and Upload speed." ++msgstr "" ++ ++msgid "" ++"If you have more than one account that can make outgoing calls, you should " ++"enter a list of phone numbers and/or prefixes in the following fields for " ++"each provider listed. Invalid prefixes are removed silently, and only 0-9, " ++"X, Z, N, #, *, and + are valid characters. The letter X matches 0-9, Z " ++"matches 1-9, and N matches 2-9. For example to make calls to Germany through " ++"a provider, you can enter 49. To make calls to North America, you can enter " ++"1NXXNXXXXXX. If one of your providers can make \"local\" calls to an area " ++"code like New York's 646, you can enter 646NXXXXXX for that provider. You " ++"should leave one account with an empty list to make calls with it by " ++"default, if no other provider's prefixes match. The system will " ++"automatically replace an empty list with a message that the provider dials " ++"all numbers not matched by another provider's prefixes. Be as specific as " ++"possible (i.e. 1NXXNXXXXXX is better than 1). Please note all international " ++"dial codes are discarded (e.g. 00, 011, 010, 0011). Entries can be made in a " ++"space-separated list, and/or one per line by hitting enter after every one." ++msgstr "" ++ ++msgid "Incoming Calls" ++msgstr "" ++ ++msgid "Insert QoS Rules" ++msgstr "" ++ ++msgid "Makes Outgoing Calls" ++msgstr "" ++ ++msgid "NOTE: There are no Google or SIP provider accounts configured." ++msgstr "" ++ ++msgid "" ++"NOTE: There are no Google or SIP provider accounts enabled for incoming " ++"calls." ++msgstr "" ++ ++msgid "" ++"NOTE: There are no Google or SIP provider accounts enabled for outgoing " ++"calls." ++msgstr "" ++ ++msgid "NOTE: There are no local user accounts configured." ++msgstr "" ++ ++msgid "NOTE: There are no local user accounts enabled for outgoing calls." ++msgstr "" ++ ++msgid "No" ++msgstr "" ++ ++msgid "Number of Seconds to Ring" ++msgstr "" ++ ++msgid "Outbound Proxy" ++msgstr "" ++ ++msgid "Outgoing Calls" ++msgstr "" ++ ++msgid "PBX Main Page" ++msgstr "" ++ ++msgid "PBX Service Status" ++msgstr "" ++ ++msgid "PIN" ++msgstr "" ++ ++msgid "Password" ++msgstr "Parolă" ++ ++msgid "" ++"Pick a random port number between 6500 and 9500 for the service to listen " ++"on. Do not pick the standard 5060, because it is often subject to brute-" ++"force attacks. When finished, (1) click \"Save and Apply\", and (2) look in " ++"the \"SIP Device/Softphone Accounts\" section for updated Server and Port " ++"settings for your SIP Devices/Softphones." ++msgstr "" ++ ++msgid "Port Setting for SIP Devices" ++msgstr "" ++ ++msgid "Providers Used for Outgoing Calls" ++msgstr "" ++ ++msgid "QoS Settings" ++msgstr "Setări QoS" ++ ++msgid "RTP Port Range End" ++msgstr "" ++ ++msgid "RTP Port Range Start" ++msgstr "" ++ ++msgid "" ++"RTP traffic carries actual voice packets. This is the start of the port " ++"range that will be used for setting up RTP communication. It's usually OK to " ++"leave this at the default value." ++msgstr "" ++ ++msgid "Receives Incoming Calls" ++msgstr "" ++ ++msgid "Remote Usage" ++msgstr "" ++ ++msgid "Rings users enabled for incoming calls" ++msgstr "" ++ ++msgid "SIP Accounts" ++msgstr "" ++ ++msgid "SIP Device/Softphone Accounts" ++msgstr "" ++ ++msgid "SIP Provider Accounts" ++msgstr "" ++ ++msgid "SIP Realm (needed by some providers)" ++msgstr "" ++ ++msgid "SIP Server/Registrar" ++msgstr "" ++ ++msgid "SIP Server/Registrar Port" ++msgstr "" ++ ++msgid "Server Setting" ++msgstr "" ++ ++msgid "Server Setting for Local SIP Devices" ++msgstr "" ++ ++msgid "Server Setting for Remote SIP Devices" ++msgstr "" ++ ++msgid "Service Status" ++msgstr "" ++ ++msgid "" ++"Set the number of seconds to ring users upon incoming calls before hanging " ++"up or going to voicemail, if the voicemail is installed and enabled." ++msgstr "" ++ ++msgid "Space-Separated List of Blacklisted Numbers" ++msgstr "" ++ ++msgid "Specify numbers individually here. Press enter to add more numbers." ++msgstr "" ++ ++msgid "" ++"Specify numbers individually here. Press enter to add more numbers. You will " ++"have to experiment with what country and area codes you need to add to the " ++"number." ++msgstr "" ++ ++msgid "" ++"The number(s) specified above will be able to dial out with this user's " ++"providers. Invalid usernames, including users not enabled for outgoing " ++"calls, are dropped silently. Please verify that the entry was accepted." ++msgstr "" ++ ++msgid "" ++"This configuration page allows you to configure a phone system (PBX) service " ++"which permits making phone calls through multiple Google and SIP (like " ++"Sipgate, SipSorcery, and Betamax) accounts and sharing them among many SIP " ++"devices. Note that Google accounts, SIP accounts, and local user accounts " ++"are configured in the \"Google Accounts\", \"SIP Accounts\", and \"User " ++"Accounts\" sub-sections. You must add at least one User Account to this PBX, " ++"and then configure a SIP device or softphone to use the account, in order to " ++"make and receive calls with your Google/SIP accounts. Configuring multiple " ++"users will allow you to make free calls between all users, and share the " ++"configured Google and SIP accounts. If you have more than one Google and SIP " ++"accounts set up, you should probably configure how calls to and from them " ++"are routed in the \"Call Routing\" page. If you're interested in using your " ++"own PBX from anywhere in the world, then visit the \"Remote Usage\" section " ++"in the \"Advanced Settings\" page." ++msgstr "" ++ ++msgid "" ++"This is the name that the VoIP server will use to identify itself when " ++"registering to VoIP (SIP) providers. Some providers require this to a " ++"specific string matching a hardware SIP device." ++msgstr "" ++ ++msgid "" ++"This is where you indicate which Google/SIP accounts are used to call what " ++"country/area codes, which users can use what SIP/Google accounts, how " ++"incoming calls are routed, what numbers can get into this PBX with a " ++"password, and what numbers are blacklisted." ++msgstr "" ++ ++msgid "" ++"This is where you set up your Google (Talk and Voice) Accounts, in order to " ++"start using them for dialing and receiving calls (voice chat and real phone " ++"calls). Please make at least one voice call using the Google Talk plugin " ++"installable through the GMail interface, and then log out from your account " ++"everywhere. Click \"Add\" to add as many accounts as you wish." ++msgstr "" ++ ++msgid "" ++"This is where you set up your SIP (VoIP) accounts ts like Sipgate, " ++"SipSorcery, the popular Betamax providers, and any other providers with SIP " ++"settings in order to start using them for dialing and receiving calls (SIP " ++"uri and real phone calls). Click \"Add\" to add as many accounts as you wish." ++msgstr "" ++ ++msgid "" ++"This option should be set to \"Yes\" if you have a DID (real telephone " ++"number) associated with this SIP account or want to receive SIP uri calls " ++"through this provider." ++msgstr "" ++ ++msgid "" ++"This section contains settings that do not need to be changed under normal " ++"circumstances. In addition, here you can configure your system for use with " ++"remote SIP devices, and resolve call quality issues by enabling the " ++"insertion of QoS rules." ++msgstr "" ++ ++msgid "" ++"Use (four to five digit) numeric user name if you are connecting normal " ++"telephones with ATAs to this system (so they can dial user names)." ++msgstr "" ++ ++msgid "" ++"Use this account to make outgoing calls as configured in the \"Call Routing" ++"\" section." ++msgstr "" ++ ++msgid "Use this account to make outgoing calls." ++msgstr "" ++ ++msgid "User Accounts" ++msgstr "" ++ ++msgid "User Agent String" ++msgstr "" ++ ++msgid "User Name" ++msgstr "" ++ ++msgid "Uses providers enabled for outgoing calls" ++msgstr "" ++ ++msgid "" ++"When somebody starts voice chat with your GTalk account or calls the GVoice, " ++"number (if you have Google Voice), the call will be forwarded to any users " ++"that are online (registered using a SIP device or softphone) and permitted " ++"to receive the call. If you have Google Voice, you must go to your GVoice " ++"settings and forward calls to Google chat in order to actually receive calls " ++"made to your GVoice number. If you have trouble receiving calls from GVoice, " ++"experiment with the Call Screening option in your GVoice Settings. Finally, " ++"make sure no other client is online with this account (browser in gmail, " ++"mobile/desktop Google Talk App) as it may interfere." ++msgstr "" ++ ++msgid "" ++"When your password is saved, it disappears from this field and is not " ++"displayed for your protection. The previously saved password will be changed " ++"only when you enter a value different from the saved one." ++msgstr "" ++ ++msgid "Yes" ++msgstr "" ++ ++msgid "" ++"You can enter your domain name, external IP address, or dynamic domain name " ++"here. The best thing to input is a static IP address. If your IP address is " ++"dynamic and it changes, your configuration will become invalid. Hence, it's " ++"recommended to set up Dynamic DNS in this case. and enter your Dynamic DNS " ++"hostname here. You can configure Dynamic DNS with the luci-app-ddns package." ++msgstr "" ++ ++msgid "You can specify a real name to show up in the Caller ID here." ++msgstr "" ++ ++msgid "" ++"You can use your SIP devices/softphones with this system from a remote " ++"location as well, as long as your Internet Service Provider gives you a " ++"public IP. You will be able to call other local users for free (e.g. other " ++"Analog Telephone Adapters (ATAs)) and use your VoIP providers to make calls " ++"as if you were local to the PBX. After configuring this tab, go back to " ++"where users are configured and see the new Server and Port setting you need " ++"to configure the remote SIP devices with. Please note that if this PBX is " ++"not running on your router/gateway, you will need to configure port " ++"forwarding (NAT) on your router/gateway. Please forward the ports below (SIP " ++"port and RTP range) to the IP address of the device running this PBX." ++msgstr "" ++ ++msgid "" ++"Your PIN disappears when saved for your protection. It will be changed only " ++"when you enter a value different from the saved one. Leaving the PIN empty " ++"is possible, but please beware of the security implications." ++msgstr "" ++ ++msgid "" ++"Your password disappears when saved for your protection. It will be changed " ++"only when you enter a value different from the saved one." ++msgstr "" +diff --git a/feeds/luci/applications/luci-app-pbx/po/ru/pbx.po b/feeds/luci/applications/luci-app-pbx/po/ru/pbx.po +new file mode 100644 +index 0000000..e85c947 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-pbx/po/ru/pbx.po +@@ -0,0 +1,525 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"PO-Revision-Date: 2013-09-06 10:28+0200\n" ++"Last-Translator: datasheet \n" ++"Language-Team: none\n" ++"Language: ru\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%" ++"10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "Advanced Settings" ++msgstr "РаÑширенные уÑтановки" ++ ++msgid "Available" ++msgstr "ДоÑтупен" ++ ++msgid "" ++"Avoid using anything but alpha-numeric characters, space, comma, and period." ++msgstr "" ++"СтарайтеÑÑŒ не иÑпользовать ничего, кроме алфавитно-цифровых Ñимволов, " ++"пробелов, запÑÑ‚Ñ‹Ñ… и точек." ++ ++msgid "Away" ++msgstr "Отошел" ++ ++msgid "Blacklisted Numbers" ++msgstr "Ðомера в \"черном\" ÑпиÑке" ++ ++msgid "Call Routing" ++msgstr "ÐœÐ°Ñ€ÑˆÑ€ÑƒÑ‚Ð¸Ð·Ð°Ñ†Ð¸Ñ Ð²Ñ‹Ð·Ð¾Ð²Ð¾Ð²" ++ ++msgid "Call-back Numbers" ++msgstr "" ++ ++msgid "Call-back Provider" ++msgstr "" ++ ++msgid "Call-through Numbers" ++msgstr "Ðомера Ñквозных вызовов" ++ ++msgid "Copy-paste large lists of numbers here." ++msgstr "Ð’Ñтавьте большие ÑпиÑки номеров здеÑÑŒ" ++ ++msgid "" ++"Designate numbers that are allowed to call through this system and which " ++"user's privileges they will have." ++msgstr "" ++ ++msgid "" ++"Designate numbers to whom the system will hang up and call back, which " ++"provider will be used to call them, and which user's privileges will be " ++"granted to them." ++msgstr "" ++ ++msgid "Dials numbers unmatched elsewhere" ++msgstr "" ++ ++msgid "Do Not Disturb" ++msgstr "Ðе беÑпокоить" ++ ++msgid "Domain/IP Address/Dynamic Domain" ++msgstr "" ++ ++msgid "Dynamic List of Blacklisted Numbers" ++msgstr "ДинамичеÑкий ÑпиÑок запрещенных номеров" ++ ++msgid "Email" ++msgstr "Эл. почта" ++ ++msgid "Enable Incoming Calls (Register via SIP)" ++msgstr "Разрешить входÑщие вызовы (региÑÑ‚Ñ€Ð°Ñ†Ð¸Ñ Ñ‡ÐµÑ€ÐµÐ· SIP)" ++ ++msgid "Enable Incoming Calls (set Status below)" ++msgstr "Разрешить входÑщие звонки (Ñм. ниже СтатуÑ)" ++ ++msgid "Enable Outgoing Calls" ++msgstr "Разрешить иÑходÑщие вызовы" ++ ++msgid "Enabled" ++msgstr "Включено" ++ ++msgid "" ++"Enter a VoIP provider to use for call-back in the format username@some.host." ++"name, as listed in \"Outgoing Calls\" above. It's easiest to copy and paste " ++"the providers from above. Invalid entries, including providers not enabled " ++"for outgoing calls, will be rejected silently." ++msgstr "" ++ ++msgid "" ++"Enter phone numbers that you want to decline calls from automatically. You " ++"should probably omit the country code and any leading zeroes, but please " ++"experiment to make sure you are blocking numbers from your desired area " ++"successfully." ++msgstr "" ++"Введите телефонные номера, звонки Ñ ÐºÐ¾Ñ‚Ð¾Ñ€Ñ‹Ñ… вы хотите автоматичеÑки " ++"отклонÑÑ‚ÑŒ. Ð’Ñ‹, вероÑтно, не должны вводить код Ñтраны и ведущие нули, но, " ++"чтобы удоÑтоверитьÑÑ Ð² Ñтом, пожалуйÑта проверьте, что звонки из " ++"нежелательной зоны уÑпешно блокируютÑÑ." ++ ++msgid "" ++"Enter this IP (or IP:port) in the Server/Registrar setting of SIP devices " ++"you will use ONLY locally and never from a remote location." ++msgstr "" ++"Введите Ñтот IP (или IP порт) в уÑтановках Сервера/РегиÑтратора SIP " ++"уÑтройÑтв, который вы будете иÑпользовать ТОЛЬКО локально и никогда удаленно." ++ ++msgid "" ++"Enter this hostname (or hostname:port) in the Server/Registrar setting of " ++"SIP devices you will use from a remote location (they will work locally too)." ++msgstr "" ++"Введите Ñто имÑ_хоÑта (или имÑ_хоÑта:порт) в уÑтановках Сервера/РегиÑтратора " ++"тех SIP-уÑтройÑтв, которые вы будете иÑпользовать удаленно (локально они " ++"также будут работать)." ++ ++msgid "External SIP Port" ++msgstr "Внешний порт SIP" ++ ++msgid "" ++"For each provider enabled for incoming calls, here you can restrict which " ++"users to ring on incoming calls. If the list is empty, the system will " ++"indicate that all users enabled for incoming calls will ring. Invalid " ++"usernames will be rejected silently. Also, entering a username here " ++"overrides the user's setting to not receive incoming calls. This way, you " ++"can make certain users ring only for specific providers. Entries can be made " ++"in a space-separated list, and/or one per line by hitting enter after every " ++"one." ++msgstr "" ++ ++msgid "" ++"For each user enabled for outgoing calls you can restrict what providers the " ++"user can use for outgoing calls. By default all users can use all providers. " ++"To show up in the list below the user should be allowed to make outgoing " ++"calls in the \"User Accounts\" page. Enter VoIP providers in the format " ++"username@some.host.name, as listed in \"Outgoing Calls\" above. It's easiest " ++"to copy and paste the providers from above. Invalid entries, including " ++"providers not enabled for outgoing calls, will be rejected silently. Entries " ++"can be made in a space-separated list, and/or one per line by hitting enter " ++"after every one." ++msgstr "" ++ ++msgid "Full Name" ++msgstr "Полное имÑ" ++ ++msgid "General Settings" ++msgstr "Общие уÑтановки" ++ ++msgid "Google Accounts" ++msgstr "Учетные запиÑи Google" ++ ++msgid "Google Talk Status" ++msgstr "Ð¡Ñ‚Ð°Ñ‚ÑƒÑ Google Talk" ++ ++msgid "Google Talk Status Message" ++msgstr "Сообщение ÑтатуÑа Google Talk" ++ ++msgid "Google Voice/Talk Accounts" ++msgstr "Учетные запиÑи Google Voice/Talk" ++ ++msgid "Hang-up Delay" ++msgstr "" ++ ++msgid "" ++"Here you must configure at least one SIP account, that you will use to " ++"register with this service. Use this account either in an Analog Telephony " ++"Adapter (ATA), or in a SIP software like CSipSimple, Linphone, or Sipdroid " ++"on your smartphone, or Ekiga, Linphone, or X-Lite on your computer. By " ++"default, all SIP accounts will ring simultaneously if a call is made to one " ++"of your VoIP provider accounts or GV numbers." ++msgstr "" ++ ++msgid "" ++"How long to wait before hanging up. If the provider you use to dial " ++"automatically forwards to voicemail, you can set this value to a delay that " ++"will allow you to hang up before your call gets forwarded and you get billed " ++"for it." ++msgstr "" ++ ++msgid "" ++"If setting Server/Registrar to %s or %s does not work for you, try setting " ++"it to %s or %s and entering this port number in a separate field that " ++"specifies the Server/Registrar port number. Beware that some devices have a " ++"confusing setting that sets the port where SIP requests originate from on " ++"the SIP device itself (the bind port). The port specified on this page is " ++"NOT this bind port but the port this service listens on." ++msgstr "" ++ ++msgid "" ++"If you experience jittery or high latency audio during heavy downloads, you " ++"may want to enable QoS. QoS prioritizes traffic to and from your network for " ++"specified ports and IP addresses, resulting in better latency and throughput " ++"for sound in our case. If enabled below, a QoS rule for this service will be " ++"configured by the PBX automatically, but you must visit the QoS " ++"configuration page (Network->QoS) to configure other critical QoS settings " ++"like Download and Upload speed." ++msgstr "" ++ ++msgid "" ++"If you have more than one account that can make outgoing calls, you should " ++"enter a list of phone numbers and/or prefixes in the following fields for " ++"each provider listed. Invalid prefixes are removed silently, and only 0-9, " ++"X, Z, N, #, *, and + are valid characters. The letter X matches 0-9, Z " ++"matches 1-9, and N matches 2-9. For example to make calls to Germany through " ++"a provider, you can enter 49. To make calls to North America, you can enter " ++"1NXXNXXXXXX. If one of your providers can make \"local\" calls to an area " ++"code like New York's 646, you can enter 646NXXXXXX for that provider. You " ++"should leave one account with an empty list to make calls with it by " ++"default, if no other provider's prefixes match. The system will " ++"automatically replace an empty list with a message that the provider dials " ++"all numbers not matched by another provider's prefixes. Be as specific as " ++"possible (i.e. 1NXXNXXXXXX is better than 1). Please note all international " ++"dial codes are discarded (e.g. 00, 011, 010, 0011). Entries can be made in a " ++"space-separated list, and/or one per line by hitting enter after every one." ++msgstr "" ++ ++msgid "Incoming Calls" ++msgstr "ВходÑщие вызовы" ++ ++msgid "Insert QoS Rules" ++msgstr "Ð’Ñтавить правила QoS" ++ ++msgid "Makes Outgoing Calls" ++msgstr "Совершает иÑходÑщие вызовы" ++ ++msgid "NOTE: There are no Google or SIP provider accounts configured." ++msgstr "" ++ ++msgid "" ++"NOTE: There are no Google or SIP provider accounts enabled for incoming " ++"calls." ++msgstr "" ++ ++msgid "" ++"NOTE: There are no Google or SIP provider accounts enabled for outgoing " ++"calls." ++msgstr "" ++ ++msgid "NOTE: There are no local user accounts configured." ++msgstr "" ++ ++msgid "NOTE: There are no local user accounts enabled for outgoing calls." ++msgstr "" ++ ++msgid "No" ++msgstr "Ðет" ++ ++msgid "Number of Seconds to Ring" ++msgstr "" ++ ++msgid "Outbound Proxy" ++msgstr "Outbound прокÑи Ñервер" ++ ++msgid "Outgoing Calls" ++msgstr "ИÑходÑщие вызовы" ++ ++msgid "PBX Main Page" ++msgstr "Ð“Ð»Ð°Ð²Ð½Ð°Ñ Ñтраница ÐТС" ++ ++#, fuzzy ++msgid "PBX Service Status" ++msgstr "СоÑтоÑние Ñлужбы ÐТС" ++ ++msgid "PIN" ++msgstr "PIN" ++ ++msgid "Password" ++msgstr "Пароль" ++ ++msgid "" ++"Pick a random port number between 6500 and 9500 for the service to listen " ++"on. Do not pick the standard 5060, because it is often subject to brute-" ++"force attacks. When finished, (1) click \"Save and Apply\", and (2) look in " ++"the \"SIP Device/Softphone Accounts\" section for updated Server and Port " ++"settings for your SIP Devices/Softphones." ++msgstr "" ++ ++msgid "Port Setting for SIP Devices" ++msgstr "ÐаÑтройки порта уÑтройÑтв SIP" ++ ++msgid "Providers Used for Outgoing Calls" ++msgstr "Провайдеры иÑходÑщих вызовов" ++ ++msgid "QoS Settings" ++msgstr "УÑтановки QoS" ++ ++msgid "RTP Port Range End" ++msgstr "Конец диапазона портов RTP" ++ ++msgid "RTP Port Range Start" ++msgstr "Ðачало диапазоно портов RTP" ++ ++msgid "" ++"RTP traffic carries actual voice packets. This is the start of the port " ++"range that will be used for setting up RTP communication. It's usually OK to " ++"leave this at the default value." ++msgstr "" ++ ++msgid "Receives Incoming Calls" ++msgstr "Принимает входÑщие вызовы" ++ ++msgid "Remote Usage" ++msgstr "Удаленное иÑпользование" ++ ++msgid "Rings users enabled for incoming calls" ++msgstr "" ++ ++msgid "SIP Accounts" ++msgstr "Учетные запиÑи SIP" ++ ++msgid "SIP Device/Softphone Accounts" ++msgstr "Учетные запиÑи SIP уÑтройÑтва/программного телефона" ++ ++msgid "SIP Provider Accounts" ++msgstr "Учетные запиÑи SIP провайдера" ++ ++msgid "SIP Realm (needed by some providers)" ++msgstr "SIP Realm (нужен Ð´Ð»Ñ Ð½ÐµÐºÐ¾Ñ‚Ð¾Ñ€Ñ‹Ñ… провайдеров)" ++ ++msgid "SIP Server/Registrar" ++msgstr "SIP Сервер/РегиÑтратор" ++ ++msgid "SIP Server/Registrar Port" ++msgstr "Порт SIP Сервера/РегиÑтратора" ++ ++msgid "Server Setting" ++msgstr "ÐаÑтройки Ñервера" ++ ++msgid "Server Setting for Local SIP Devices" ++msgstr "УÑтановки Ñервера Ð´Ð»Ñ Ð»Ð¾ÐºÐ°Ð»ÑŒÐ½Ñ‹Ñ… SIP уÑтройÑтв" ++ ++msgid "Server Setting for Remote SIP Devices" ++msgstr "ÐаÑтройки Ñервера Ð´Ð»Ñ ÑƒÐ´Ð°Ð»ÐµÐ½Ð½Ñ‹Ñ… SIP уÑтройÑтв" ++ ++msgid "Service Status" ++msgstr "СоÑтоÑние ÑервиÑа" ++ ++msgid "" ++"Set the number of seconds to ring users upon incoming calls before hanging " ++"up or going to voicemail, if the voicemail is installed and enabled." ++msgstr "" ++ ++msgid "Space-Separated List of Blacklisted Numbers" ++msgstr "Черный ÑпиÑок номеров (пробел между номерами Ð´Ð»Ñ Ñ€Ð°Ð·Ð´ÐµÐ»ÐµÐ½Ð¸Ñ)" ++ ++msgid "Specify numbers individually here. Press enter to add more numbers." ++msgstr "" ++"Укажите отдельные номера. Ðажмите enter, чтобы добавить больше номеров." ++ ++msgid "" ++"Specify numbers individually here. Press enter to add more numbers. You will " ++"have to experiment with what country and area codes you need to add to the " ++"number." ++msgstr "" ++ ++msgid "" ++"The number(s) specified above will be able to dial out with this user's " ++"providers. Invalid usernames, including users not enabled for outgoing " ++"calls, are dropped silently. Please verify that the entry was accepted." ++msgstr "" ++ ++msgid "" ++"This configuration page allows you to configure a phone system (PBX) service " ++"which permits making phone calls through multiple Google and SIP (like " ++"Sipgate, SipSorcery, and Betamax) accounts and sharing them among many SIP " ++"devices. Note that Google accounts, SIP accounts, and local user accounts " ++"are configured in the \"Google Accounts\", \"SIP Accounts\", and \"User " ++"Accounts\" sub-sections. You must add at least one User Account to this PBX, " ++"and then configure a SIP device or softphone to use the account, in order to " ++"make and receive calls with your Google/SIP accounts. Configuring multiple " ++"users will allow you to make free calls between all users, and share the " ++"configured Google and SIP accounts. If you have more than one Google and SIP " ++"accounts set up, you should probably configure how calls to and from them " ++"are routed in the \"Call Routing\" page. If you're interested in using your " ++"own PBX from anywhere in the world, then visit the \"Remote Usage\" section " ++"in the \"Advanced Settings\" page." ++msgstr "" ++ ++msgid "" ++"This is the name that the VoIP server will use to identify itself when " ++"registering to VoIP (SIP) providers. Some providers require this to a " ++"specific string matching a hardware SIP device." ++msgstr "" ++ ++msgid "" ++"This is where you indicate which Google/SIP accounts are used to call what " ++"country/area codes, which users can use what SIP/Google accounts, how " ++"incoming calls are routed, what numbers can get into this PBX with a " ++"password, and what numbers are blacklisted." ++msgstr "" ++ ++msgid "" ++"This is where you set up your Google (Talk and Voice) Accounts, in order to " ++"start using them for dialing and receiving calls (voice chat and real phone " ++"calls). Please make at least one voice call using the Google Talk plugin " ++"installable through the GMail interface, and then log out from your account " ++"everywhere. Click \"Add\" to add as many accounts as you wish." ++msgstr "" ++ ++msgid "" ++"This is where you set up your SIP (VoIP) accounts ts like Sipgate, " ++"SipSorcery, the popular Betamax providers, and any other providers with SIP " ++"settings in order to start using them for dialing and receiving calls (SIP " ++"uri and real phone calls). Click \"Add\" to add as many accounts as you wish." ++msgstr "" ++ ++msgid "" ++"This option should be set to \"Yes\" if you have a DID (real telephone " ++"number) associated with this SIP account or want to receive SIP uri calls " ++"through this provider." ++msgstr "" ++ ++msgid "" ++"This section contains settings that do not need to be changed under normal " ++"circumstances. In addition, here you can configure your system for use with " ++"remote SIP devices, and resolve call quality issues by enabling the " ++"insertion of QoS rules." ++msgstr "" ++ ++msgid "" ++"Use (four to five digit) numeric user name if you are connecting normal " ++"telephones with ATAs to this system (so they can dial user names)." ++msgstr "" ++ ++msgid "" ++"Use this account to make outgoing calls as configured in the \"Call Routing" ++"\" section." ++msgstr "" ++"ИÑпользовать Ñту учетную запиÑÑŒ Ð´Ð»Ñ Ð¸ÑходÑщих вызовов в ÑоответÑтии Ñ " ++"наcтройками Ñекции \"ÐœÐ°Ñ€ÑˆÑ€ÑƒÑ‚Ð¸Ð·Ð°Ñ†Ð¸Ñ Ð²Ñ‹Ð·Ð¾Ð²Ð¾Ð²\"." ++ ++msgid "Use this account to make outgoing calls." ++msgstr "ИÑпользовать Ñту учетную запиÑÑŒ Ð´Ð»Ñ Ð¸ÑходÑщих вызовов" ++ ++msgid "User Accounts" ++msgstr "Учетные запиÑи пользователÑ" ++ ++msgid "User Agent String" ++msgstr "Строка агента пользователÑ" ++ ++msgid "User Name" ++msgstr "Ð˜Ð¼Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ" ++ ++msgid "Uses providers enabled for outgoing calls" ++msgstr "" ++ ++msgid "" ++"When somebody starts voice chat with your GTalk account or calls the GVoice, " ++"number (if you have Google Voice), the call will be forwarded to any users " ++"that are online (registered using a SIP device or softphone) and permitted " ++"to receive the call. If you have Google Voice, you must go to your GVoice " ++"settings and forward calls to Google chat in order to actually receive calls " ++"made to your GVoice number. If you have trouble receiving calls from GVoice, " ++"experiment with the Call Screening option in your GVoice Settings. Finally, " ++"make sure no other client is online with this account (browser in gmail, " ++"mobile/desktop Google Talk App) as it may interfere." ++msgstr "" ++ ++msgid "" ++"When your password is saved, it disappears from this field and is not " ++"displayed for your protection. The previously saved password will be changed " ++"only when you enter a value different from the saved one." ++msgstr "" ++ ++msgid "Yes" ++msgstr "Да" ++ ++msgid "" ++"You can enter your domain name, external IP address, or dynamic domain name " ++"here. The best thing to input is a static IP address. If your IP address is " ++"dynamic and it changes, your configuration will become invalid. Hence, it's " ++"recommended to set up Dynamic DNS in this case. and enter your Dynamic DNS " ++"hostname here. You can configure Dynamic DNS with the luci-app-ddns package." ++msgstr "" ++ ++msgid "You can specify a real name to show up in the Caller ID here." ++msgstr "ЗдеÑÑŒ Ð’Ñ‹ можете указать Ð¸Ð¼Ñ Ð´Ð»Ñ Ð¾Ñ‚Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ Ð²Ð¼ÐµÑто ID звонÑщего." ++ ++msgid "" ++"You can use your SIP devices/softphones with this system from a remote " ++"location as well, as long as your Internet Service Provider gives you a " ++"public IP. You will be able to call other local users for free (e.g. other " ++"Analog Telephone Adapters (ATAs)) and use your VoIP providers to make calls " ++"as if you were local to the PBX. After configuring this tab, go back to " ++"where users are configured and see the new Server and Port setting you need " ++"to configure the remote SIP devices with. Please note that if this PBX is " ++"not running on your router/gateway, you will need to configure port " ++"forwarding (NAT) on your router/gateway. Please forward the ports below (SIP " ++"port and RTP range) to the IP address of the device running this PBX." ++msgstr "" ++ ++msgid "" ++"Your PIN disappears when saved for your protection. It will be changed only " ++"when you enter a value different from the saved one. Leaving the PIN empty " ++"is possible, but please beware of the security implications." ++msgstr "" ++ ++msgid "" ++"Your password disappears when saved for your protection. It will be changed " ++"only when you enter a value different from the saved one." ++msgstr "" ++ ++#~ msgid "" ++#~ "Designate numbers that are allowed to call through this system and which " ++#~ "user's privileges it will have." ++#~ msgstr "" ++#~ "Указать телефонные номера, которым разрешено оÑущеÑтвлÑÑ‚ÑŒ звонки через Ñту " ++#~ "ÑиÑтему, а также какими они будут обладать пользовательÑкими привилегиÑми." ++ ++#~ msgid "Account Status" ++#~ msgstr "Ð¡Ñ‚Ð°Ñ‚ÑƒÑ ÑƒÑ‡ÐµÑ‚Ð½Ð¾Ð¹ запиÑи" ++ ++#~ msgid "Account Status Message" ++#~ msgstr "Ð¡Ñ‚Ð°Ñ‚ÑƒÑ Ñообщение учетной запиÑи" ++ ++#~ msgid "Domain Name/Dynamic Domain Name" ++#~ msgstr "Ð˜Ð¼Ñ Ð´Ð¾Ð¼ÐµÐ½Ð°/ДинамичеÑкое Ð¸Ð¼Ñ Ð´Ð¾Ð¼ÐµÐ½Ð°" ++ ++#~ msgid "Enable Incoming Calls (See Status, Message below)" ++#~ msgstr "Разрешить входÑщие вызовы (Ñм. ÑтатуÑ, Ñообщение ниже)" ++ ++#~ msgid "Service Control and Connection Status" ++#~ msgstr "Управление ÑервиÑом и ÑÑ‚Ð°Ñ‚ÑƒÑ ÑоединениÑ" +diff --git a/feeds/luci/applications/luci-app-pbx/po/sk/pbx.po b/feeds/luci/applications/luci-app-pbx/po/sk/pbx.po +new file mode 100644 +index 0000000..7b6d4a5 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-pbx/po/sk/pbx.po +@@ -0,0 +1,484 @@ ++msgid "" ++msgstr "" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Last-Translator: Automatically generated\n" ++"Language-Team: none\n" ++"MIME-Version: 1.0\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n" ++ ++msgid "Advanced Settings" ++msgstr "" ++ ++msgid "Available" ++msgstr "" ++ ++msgid "" ++"Avoid using anything but alpha-numeric characters, space, comma, and period." ++msgstr "" ++ ++msgid "Away" ++msgstr "" ++ ++msgid "Blacklisted Numbers" ++msgstr "" ++ ++msgid "Call Routing" ++msgstr "" ++ ++msgid "Call-back Numbers" ++msgstr "" ++ ++msgid "Call-back Provider" ++msgstr "" ++ ++msgid "Call-through Numbers" ++msgstr "" ++ ++msgid "Copy-paste large lists of numbers here." ++msgstr "" ++ ++msgid "" ++"Designate numbers that are allowed to call through this system and which " ++"user's privileges they will have." ++msgstr "" ++ ++msgid "" ++"Designate numbers to whom the system will hang up and call back, which " ++"provider will be used to call them, and which user's privileges will be " ++"granted to them." ++msgstr "" ++ ++msgid "Dials numbers unmatched elsewhere" ++msgstr "" ++ ++msgid "Do Not Disturb" ++msgstr "" ++ ++msgid "Domain/IP Address/Dynamic Domain" ++msgstr "" ++ ++msgid "Dynamic List of Blacklisted Numbers" ++msgstr "" ++ ++msgid "Email" ++msgstr "" ++ ++msgid "Enable Incoming Calls (Register via SIP)" ++msgstr "" ++ ++msgid "Enable Incoming Calls (set Status below)" ++msgstr "" ++ ++msgid "Enable Outgoing Calls" ++msgstr "" ++ ++msgid "Enabled" ++msgstr "" ++ ++msgid "" ++"Enter a VoIP provider to use for call-back in the format username@some.host." ++"name, as listed in \"Outgoing Calls\" above. It's easiest to copy and paste " ++"the providers from above. Invalid entries, including providers not enabled " ++"for outgoing calls, will be rejected silently." ++msgstr "" ++ ++msgid "" ++"Enter phone numbers that you want to decline calls from automatically. You " ++"should probably omit the country code and any leading zeroes, but please " ++"experiment to make sure you are blocking numbers from your desired area " ++"successfully." ++msgstr "" ++ ++msgid "" ++"Enter this IP (or IP:port) in the Server/Registrar setting of SIP devices " ++"you will use ONLY locally and never from a remote location." ++msgstr "" ++ ++msgid "" ++"Enter this hostname (or hostname:port) in the Server/Registrar setting of " ++"SIP devices you will use from a remote location (they will work locally too)." ++msgstr "" ++ ++msgid "External SIP Port" ++msgstr "" ++ ++msgid "" ++"For each provider enabled for incoming calls, here you can restrict which " ++"users to ring on incoming calls. If the list is empty, the system will " ++"indicate that all users enabled for incoming calls will ring. Invalid " ++"usernames will be rejected silently. Also, entering a username here " ++"overrides the user's setting to not receive incoming calls. This way, you " ++"can make certain users ring only for specific providers. Entries can be made " ++"in a space-separated list, and/or one per line by hitting enter after every " ++"one." ++msgstr "" ++ ++msgid "" ++"For each user enabled for outgoing calls you can restrict what providers the " ++"user can use for outgoing calls. By default all users can use all providers. " ++"To show up in the list below the user should be allowed to make outgoing " ++"calls in the \"User Accounts\" page. Enter VoIP providers in the format " ++"username@some.host.name, as listed in \"Outgoing Calls\" above. It's easiest " ++"to copy and paste the providers from above. Invalid entries, including " ++"providers not enabled for outgoing calls, will be rejected silently. Entries " ++"can be made in a space-separated list, and/or one per line by hitting enter " ++"after every one." ++msgstr "" ++ ++msgid "Full Name" ++msgstr "" ++ ++msgid "General Settings" ++msgstr "" ++ ++msgid "Google Accounts" ++msgstr "" ++ ++msgid "Google Talk Status" ++msgstr "" ++ ++msgid "Google Talk Status Message" ++msgstr "" ++ ++msgid "Google Voice/Talk Accounts" ++msgstr "" ++ ++msgid "Hang-up Delay" ++msgstr "" ++ ++msgid "" ++"Here you must configure at least one SIP account, that you will use to " ++"register with this service. Use this account either in an Analog Telephony " ++"Adapter (ATA), or in a SIP software like CSipSimple, Linphone, or Sipdroid " ++"on your smartphone, or Ekiga, Linphone, or X-Lite on your computer. By " ++"default, all SIP accounts will ring simultaneously if a call is made to one " ++"of your VoIP provider accounts or GV numbers." ++msgstr "" ++ ++msgid "" ++"How long to wait before hanging up. If the provider you use to dial " ++"automatically forwards to voicemail, you can set this value to a delay that " ++"will allow you to hang up before your call gets forwarded and you get billed " ++"for it." ++msgstr "" ++ ++msgid "" ++"If setting Server/Registrar to %s or %s does not work for you, try setting " ++"it to %s or %s and entering this port number in a separate field that " ++"specifies the Server/Registrar port number. Beware that some devices have a " ++"confusing setting that sets the port where SIP requests originate from on " ++"the SIP device itself (the bind port). The port specified on this page is " ++"NOT this bind port but the port this service listens on." ++msgstr "" ++ ++msgid "" ++"If you experience jittery or high latency audio during heavy downloads, you " ++"may want to enable QoS. QoS prioritizes traffic to and from your network for " ++"specified ports and IP addresses, resulting in better latency and throughput " ++"for sound in our case. If enabled below, a QoS rule for this service will be " ++"configured by the PBX automatically, but you must visit the QoS " ++"configuration page (Network->QoS) to configure other critical QoS settings " ++"like Download and Upload speed." ++msgstr "" ++ ++msgid "" ++"If you have more than one account that can make outgoing calls, you should " ++"enter a list of phone numbers and/or prefixes in the following fields for " ++"each provider listed. Invalid prefixes are removed silently, and only 0-9, " ++"X, Z, N, #, *, and + are valid characters. The letter X matches 0-9, Z " ++"matches 1-9, and N matches 2-9. For example to make calls to Germany through " ++"a provider, you can enter 49. To make calls to North America, you can enter " ++"1NXXNXXXXXX. If one of your providers can make \"local\" calls to an area " ++"code like New York's 646, you can enter 646NXXXXXX for that provider. You " ++"should leave one account with an empty list to make calls with it by " ++"default, if no other provider's prefixes match. The system will " ++"automatically replace an empty list with a message that the provider dials " ++"all numbers not matched by another provider's prefixes. Be as specific as " ++"possible (i.e. 1NXXNXXXXXX is better than 1). Please note all international " ++"dial codes are discarded (e.g. 00, 011, 010, 0011). Entries can be made in a " ++"space-separated list, and/or one per line by hitting enter after every one." ++msgstr "" ++ ++msgid "Incoming Calls" ++msgstr "" ++ ++msgid "Insert QoS Rules" ++msgstr "" ++ ++msgid "Makes Outgoing Calls" ++msgstr "" ++ ++msgid "NOTE: There are no Google or SIP provider accounts configured." ++msgstr "" ++ ++msgid "" ++"NOTE: There are no Google or SIP provider accounts enabled for incoming " ++"calls." ++msgstr "" ++ ++msgid "" ++"NOTE: There are no Google or SIP provider accounts enabled for outgoing " ++"calls." ++msgstr "" ++ ++msgid "NOTE: There are no local user accounts configured." ++msgstr "" ++ ++msgid "NOTE: There are no local user accounts enabled for outgoing calls." ++msgstr "" ++ ++msgid "No" ++msgstr "" ++ ++msgid "Number of Seconds to Ring" ++msgstr "" ++ ++msgid "Outbound Proxy" ++msgstr "" ++ ++msgid "Outgoing Calls" ++msgstr "" ++ ++msgid "PBX Main Page" ++msgstr "" ++ ++msgid "PBX Service Status" ++msgstr "" ++ ++msgid "PIN" ++msgstr "" ++ ++msgid "Password" ++msgstr "" ++ ++msgid "" ++"Pick a random port number between 6500 and 9500 for the service to listen " ++"on. Do not pick the standard 5060, because it is often subject to brute-" ++"force attacks. When finished, (1) click \"Save and Apply\", and (2) look in " ++"the \"SIP Device/Softphone Accounts\" section for updated Server and Port " ++"settings for your SIP Devices/Softphones." ++msgstr "" ++ ++msgid "Port Setting for SIP Devices" ++msgstr "" ++ ++msgid "Providers Used for Outgoing Calls" ++msgstr "" ++ ++msgid "QoS Settings" ++msgstr "" ++ ++msgid "RTP Port Range End" ++msgstr "" ++ ++msgid "RTP Port Range Start" ++msgstr "" ++ ++msgid "" ++"RTP traffic carries actual voice packets. This is the start of the port " ++"range that will be used for setting up RTP communication. It's usually OK to " ++"leave this at the default value." ++msgstr "" ++ ++msgid "Receives Incoming Calls" ++msgstr "" ++ ++msgid "Remote Usage" ++msgstr "" ++ ++msgid "Rings users enabled for incoming calls" ++msgstr "" ++ ++msgid "SIP Accounts" ++msgstr "" ++ ++msgid "SIP Device/Softphone Accounts" ++msgstr "" ++ ++msgid "SIP Provider Accounts" ++msgstr "" ++ ++msgid "SIP Realm (needed by some providers)" ++msgstr "" ++ ++msgid "SIP Server/Registrar" ++msgstr "" ++ ++msgid "SIP Server/Registrar Port" ++msgstr "" ++ ++msgid "Server Setting" ++msgstr "" ++ ++msgid "Server Setting for Local SIP Devices" ++msgstr "" ++ ++msgid "Server Setting for Remote SIP Devices" ++msgstr "" ++ ++msgid "Service Status" ++msgstr "" ++ ++msgid "" ++"Set the number of seconds to ring users upon incoming calls before hanging " ++"up or going to voicemail, if the voicemail is installed and enabled." ++msgstr "" ++ ++msgid "Space-Separated List of Blacklisted Numbers" ++msgstr "" ++ ++msgid "Specify numbers individually here. Press enter to add more numbers." ++msgstr "" ++ ++msgid "" ++"Specify numbers individually here. Press enter to add more numbers. You will " ++"have to experiment with what country and area codes you need to add to the " ++"number." ++msgstr "" ++ ++msgid "" ++"The number(s) specified above will be able to dial out with this user's " ++"providers. Invalid usernames, including users not enabled for outgoing " ++"calls, are dropped silently. Please verify that the entry was accepted." ++msgstr "" ++ ++msgid "" ++"This configuration page allows you to configure a phone system (PBX) service " ++"which permits making phone calls through multiple Google and SIP (like " ++"Sipgate, SipSorcery, and Betamax) accounts and sharing them among many SIP " ++"devices. Note that Google accounts, SIP accounts, and local user accounts " ++"are configured in the \"Google Accounts\", \"SIP Accounts\", and \"User " ++"Accounts\" sub-sections. You must add at least one User Account to this PBX, " ++"and then configure a SIP device or softphone to use the account, in order to " ++"make and receive calls with your Google/SIP accounts. Configuring multiple " ++"users will allow you to make free calls between all users, and share the " ++"configured Google and SIP accounts. If you have more than one Google and SIP " ++"accounts set up, you should probably configure how calls to and from them " ++"are routed in the \"Call Routing\" page. If you're interested in using your " ++"own PBX from anywhere in the world, then visit the \"Remote Usage\" section " ++"in the \"Advanced Settings\" page." ++msgstr "" ++ ++msgid "" ++"This is the name that the VoIP server will use to identify itself when " ++"registering to VoIP (SIP) providers. Some providers require this to a " ++"specific string matching a hardware SIP device." ++msgstr "" ++ ++msgid "" ++"This is where you indicate which Google/SIP accounts are used to call what " ++"country/area codes, which users can use what SIP/Google accounts, how " ++"incoming calls are routed, what numbers can get into this PBX with a " ++"password, and what numbers are blacklisted." ++msgstr "" ++ ++msgid "" ++"This is where you set up your Google (Talk and Voice) Accounts, in order to " ++"start using them for dialing and receiving calls (voice chat and real phone " ++"calls). Please make at least one voice call using the Google Talk plugin " ++"installable through the GMail interface, and then log out from your account " ++"everywhere. Click \"Add\" to add as many accounts as you wish." ++msgstr "" ++ ++msgid "" ++"This is where you set up your SIP (VoIP) accounts ts like Sipgate, " ++"SipSorcery, the popular Betamax providers, and any other providers with SIP " ++"settings in order to start using them for dialing and receiving calls (SIP " ++"uri and real phone calls). Click \"Add\" to add as many accounts as you wish." ++msgstr "" ++ ++msgid "" ++"This option should be set to \"Yes\" if you have a DID (real telephone " ++"number) associated with this SIP account or want to receive SIP uri calls " ++"through this provider." ++msgstr "" ++ ++msgid "" ++"This section contains settings that do not need to be changed under normal " ++"circumstances. In addition, here you can configure your system for use with " ++"remote SIP devices, and resolve call quality issues by enabling the " ++"insertion of QoS rules." ++msgstr "" ++ ++msgid "" ++"Use (four to five digit) numeric user name if you are connecting normal " ++"telephones with ATAs to this system (so they can dial user names)." ++msgstr "" ++ ++msgid "" ++"Use this account to make outgoing calls as configured in the \"Call Routing" ++"\" section." ++msgstr "" ++ ++msgid "Use this account to make outgoing calls." ++msgstr "" ++ ++msgid "User Accounts" ++msgstr "" ++ ++msgid "User Agent String" ++msgstr "" ++ ++msgid "User Name" ++msgstr "" ++ ++msgid "Uses providers enabled for outgoing calls" ++msgstr "" ++ ++msgid "" ++"When somebody starts voice chat with your GTalk account or calls the GVoice, " ++"number (if you have Google Voice), the call will be forwarded to any users " ++"that are online (registered using a SIP device or softphone) and permitted " ++"to receive the call. If you have Google Voice, you must go to your GVoice " ++"settings and forward calls to Google chat in order to actually receive calls " ++"made to your GVoice number. If you have trouble receiving calls from GVoice, " ++"experiment with the Call Screening option in your GVoice Settings. Finally, " ++"make sure no other client is online with this account (browser in gmail, " ++"mobile/desktop Google Talk App) as it may interfere." ++msgstr "" ++ ++msgid "" ++"When your password is saved, it disappears from this field and is not " ++"displayed for your protection. The previously saved password will be changed " ++"only when you enter a value different from the saved one." ++msgstr "" ++ ++msgid "Yes" ++msgstr "" ++ ++msgid "" ++"You can enter your domain name, external IP address, or dynamic domain name " ++"here. The best thing to input is a static IP address. If your IP address is " ++"dynamic and it changes, your configuration will become invalid. Hence, it's " ++"recommended to set up Dynamic DNS in this case. and enter your Dynamic DNS " ++"hostname here. You can configure Dynamic DNS with the luci-app-ddns package." ++msgstr "" ++ ++msgid "You can specify a real name to show up in the Caller ID here." ++msgstr "" ++ ++msgid "" ++"You can use your SIP devices/softphones with this system from a remote " ++"location as well, as long as your Internet Service Provider gives you a " ++"public IP. You will be able to call other local users for free (e.g. other " ++"Analog Telephone Adapters (ATAs)) and use your VoIP providers to make calls " ++"as if you were local to the PBX. After configuring this tab, go back to " ++"where users are configured and see the new Server and Port setting you need " ++"to configure the remote SIP devices with. Please note that if this PBX is " ++"not running on your router/gateway, you will need to configure port " ++"forwarding (NAT) on your router/gateway. Please forward the ports below (SIP " ++"port and RTP range) to the IP address of the device running this PBX." ++msgstr "" ++ ++msgid "" ++"Your PIN disappears when saved for your protection. It will be changed only " ++"when you enter a value different from the saved one. Leaving the PIN empty " ++"is possible, but please beware of the security implications." ++msgstr "" ++ ++msgid "" ++"Your password disappears when saved for your protection. It will be changed " ++"only when you enter a value different from the saved one." ++msgstr "" +diff --git a/feeds/luci/applications/luci-app-pbx/po/sv/pbx.po b/feeds/luci/applications/luci-app-pbx/po/sv/pbx.po +new file mode 100644 +index 0000000..400289b +--- /dev/null ++++ b/feeds/luci/applications/luci-app-pbx/po/sv/pbx.po +@@ -0,0 +1,506 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"PO-Revision-Date: 2014-04-28 06:11+0200\n" ++"Last-Translator: Umeaboy \n" ++"Language-Team: none\n" ++"Language: sv\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n != 1);\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "Advanced Settings" ++msgstr "Avancerade inställningar" ++ ++msgid "Available" ++msgstr "Tillgänglig" ++ ++msgid "" ++"Avoid using anything but alpha-numeric characters, space, comma, and period." ++msgstr "" ++"Undvik att använda allt förutom alfa-numeriska karaktärer, mellanslag, komma-" ++"tecken och punkt." ++ ++msgid "Away" ++msgstr "Borta" ++ ++msgid "Blacklisted Numbers" ++msgstr "Svartlistade nummer" ++ ++msgid "Call Routing" ++msgstr "" ++ ++msgid "Call-back Numbers" ++msgstr "" ++ ++msgid "Call-back Provider" ++msgstr "" ++ ++msgid "Call-through Numbers" ++msgstr "" ++ ++msgid "Copy-paste large lists of numbers here." ++msgstr "Kopiera och klistra in ett stort antal nummer här." ++ ++msgid "" ++"Designate numbers that are allowed to call through this system and which " ++"user's privileges they will have." ++msgstr "" ++ ++msgid "" ++"Designate numbers to whom the system will hang up and call back, which " ++"provider will be used to call them, and which user's privileges will be " ++"granted to them." ++msgstr "" ++ ++msgid "Dials numbers unmatched elsewhere" ++msgstr "Ringer upp nummer som inte passar nÃ¥gon annanstans" ++ ++msgid "Do Not Disturb" ++msgstr "Stör ej" ++ ++msgid "Domain/IP Address/Dynamic Domain" ++msgstr "Domän/IP-adress/Dynamisk domän" ++ ++msgid "Dynamic List of Blacklisted Numbers" ++msgstr "Dynamisk lista över svartlistade nummer" ++ ++msgid "Email" ++msgstr "E-post" ++ ++msgid "Enable Incoming Calls (Register via SIP)" ++msgstr "Aktivera inkommande samtal (Registrera via SIP)" ++ ++msgid "Enable Incoming Calls (set Status below)" ++msgstr "Aktivera inkommande samtal (se status nedanför)" ++ ++msgid "Enable Outgoing Calls" ++msgstr "Aktivera utgÃ¥ende samtal" ++ ++msgid "Enabled" ++msgstr "Aktiverat" ++ ++msgid "" ++"Enter a VoIP provider to use for call-back in the format username@some.host." ++"name, as listed in \"Outgoing Calls\" above. It's easiest to copy and paste " ++"the providers from above. Invalid entries, including providers not enabled " ++"for outgoing calls, will be rejected silently." ++msgstr "" ++ ++msgid "" ++"Enter phone numbers that you want to decline calls from automatically. You " ++"should probably omit the country code and any leading zeroes, but please " ++"experiment to make sure you are blocking numbers from your desired area " ++"successfully." ++msgstr "" ++"Ange telefonnummer som du vill neka samtal frÃ¥n automatiskt. Du borde " ++"förmodligen utesluta landskoden och eventuella inledande nollor, men " ++"experimentera gärna för att vara säker pÃ¥ att du lyckas blockera nummer frÃ¥n " ++"ditt önskade omrÃ¥de." ++ ++msgid "" ++"Enter this IP (or IP:port) in the Server/Registrar setting of SIP devices " ++"you will use ONLY locally and never from a remote location." ++msgstr "" ++"Ange den här IP:n (eller IP:port) i Server/Registrar-inställningarna för SIP-" ++"enheter som du endast kommer att använda LOKALT och aldrig frÃ¥n en " ++"fjärrstyrd anslutning." ++ ++msgid "" ++"Enter this hostname (or hostname:port) in the Server/Registrar setting of " ++"SIP devices you will use from a remote location (they will work locally too)." ++msgstr "" ++"Ange det här värdnamnet (eller värdnamn:port) under Server/Registrar " ++"inställningen för SIP-enheten som du kommer att använda frÃ¥n en fjärrstyrd " ++"plats (de kommer att fungera lokalt ocksÃ¥)." ++ ++msgid "External SIP Port" ++msgstr "Extern SIP-port" ++ ++msgid "" ++"For each provider enabled for incoming calls, here you can restrict which " ++"users to ring on incoming calls. If the list is empty, the system will " ++"indicate that all users enabled for incoming calls will ring. Invalid " ++"usernames will be rejected silently. Also, entering a username here " ++"overrides the user's setting to not receive incoming calls. This way, you " ++"can make certain users ring only for specific providers. Entries can be made " ++"in a space-separated list, and/or one per line by hitting enter after every " ++"one." ++msgstr "" ++ ++msgid "" ++"For each user enabled for outgoing calls you can restrict what providers the " ++"user can use for outgoing calls. By default all users can use all providers. " ++"To show up in the list below the user should be allowed to make outgoing " ++"calls in the \"User Accounts\" page. Enter VoIP providers in the format " ++"username@some.host.name, as listed in \"Outgoing Calls\" above. It's easiest " ++"to copy and paste the providers from above. Invalid entries, including " ++"providers not enabled for outgoing calls, will be rejected silently. Entries " ++"can be made in a space-separated list, and/or one per line by hitting enter " ++"after every one." ++msgstr "" ++ ++msgid "Full Name" ++msgstr "Fullständigt namn" ++ ++msgid "General Settings" ++msgstr "Allmänna inställningar" ++ ++msgid "Google Accounts" ++msgstr "Google-konton" ++ ++msgid "Google Talk Status" ++msgstr "Status för Google Talk" ++ ++msgid "Google Talk Status Message" ++msgstr "Statusmeddelande för Google Talk" ++ ++msgid "Google Voice/Talk Accounts" ++msgstr "Google Voice/Talk-konton" ++ ++msgid "Hang-up Delay" ++msgstr "" ++ ++msgid "" ++"Here you must configure at least one SIP account, that you will use to " ++"register with this service. Use this account either in an Analog Telephony " ++"Adapter (ATA), or in a SIP software like CSipSimple, Linphone, or Sipdroid " ++"on your smartphone, or Ekiga, Linphone, or X-Lite on your computer. By " ++"default, all SIP accounts will ring simultaneously if a call is made to one " ++"of your VoIP provider accounts or GV numbers." ++msgstr "" ++ ++msgid "" ++"How long to wait before hanging up. If the provider you use to dial " ++"automatically forwards to voicemail, you can set this value to a delay that " ++"will allow you to hang up before your call gets forwarded and you get billed " ++"for it." ++msgstr "" ++ ++msgid "" ++"If setting Server/Registrar to %s or %s does not work for you, try setting " ++"it to %s or %s and entering this port number in a separate field that " ++"specifies the Server/Registrar port number. Beware that some devices have a " ++"confusing setting that sets the port where SIP requests originate from on " ++"the SIP device itself (the bind port). The port specified on this page is " ++"NOT this bind port but the port this service listens on." ++msgstr "" ++ ++msgid "" ++"If you experience jittery or high latency audio during heavy downloads, you " ++"may want to enable QoS. QoS prioritizes traffic to and from your network for " ++"specified ports and IP addresses, resulting in better latency and throughput " ++"for sound in our case. If enabled below, a QoS rule for this service will be " ++"configured by the PBX automatically, but you must visit the QoS " ++"configuration page (Network->QoS) to configure other critical QoS settings " ++"like Download and Upload speed." ++msgstr "" ++ ++msgid "" ++"If you have more than one account that can make outgoing calls, you should " ++"enter a list of phone numbers and/or prefixes in the following fields for " ++"each provider listed. Invalid prefixes are removed silently, and only 0-9, " ++"X, Z, N, #, *, and + are valid characters. The letter X matches 0-9, Z " ++"matches 1-9, and N matches 2-9. For example to make calls to Germany through " ++"a provider, you can enter 49. To make calls to North America, you can enter " ++"1NXXNXXXXXX. If one of your providers can make \"local\" calls to an area " ++"code like New York's 646, you can enter 646NXXXXXX for that provider. You " ++"should leave one account with an empty list to make calls with it by " ++"default, if no other provider's prefixes match. The system will " ++"automatically replace an empty list with a message that the provider dials " ++"all numbers not matched by another provider's prefixes. Be as specific as " ++"possible (i.e. 1NXXNXXXXXX is better than 1). Please note all international " ++"dial codes are discarded (e.g. 00, 011, 010, 0011). Entries can be made in a " ++"space-separated list, and/or one per line by hitting enter after every one." ++msgstr "" ++ ++msgid "Incoming Calls" ++msgstr "Inkommande samtal" ++ ++msgid "Insert QoS Rules" ++msgstr "För in QoS-regler" ++ ++msgid "Makes Outgoing Calls" ++msgstr "Gör utgÃ¥ende samtal" ++ ++msgid "NOTE: There are no Google or SIP provider accounts configured." ++msgstr "" ++ ++msgid "" ++"NOTE: There are no Google or SIP provider accounts enabled for incoming " ++"calls." ++msgstr "" ++ ++msgid "" ++"NOTE: There are no Google or SIP provider accounts enabled for outgoing " ++"calls." ++msgstr "" ++ ++msgid "NOTE: There are no local user accounts configured." ++msgstr "NOTERA: Det finns inga lokala användarkonton konfigurerade." ++ ++msgid "NOTE: There are no local user accounts enabled for outgoing calls." ++msgstr "" ++"NOTERA: Det finns inga lokala användar-konton aktiverade för utgÃ¥ende samtal." ++ ++msgid "No" ++msgstr "Nej" ++ ++msgid "Number of Seconds to Ring" ++msgstr "Antal sekunder att ringa" ++ ++msgid "Outbound Proxy" ++msgstr "" ++ ++msgid "Outgoing Calls" ++msgstr "UtgÃ¥ende samtal" ++ ++msgid "PBX Main Page" ++msgstr "Huvudsida för PBX" ++ ++msgid "PBX Service Status" ++msgstr "Status för PBX-tjänsten" ++ ++msgid "PIN" ++msgstr "PIN-kod" ++ ++msgid "Password" ++msgstr "Lösenord" ++ ++msgid "" ++"Pick a random port number between 6500 and 9500 for the service to listen " ++"on. Do not pick the standard 5060, because it is often subject to brute-" ++"force attacks. When finished, (1) click \"Save and Apply\", and (2) look in " ++"the \"SIP Device/Softphone Accounts\" section for updated Server and Port " ++"settings for your SIP Devices/Softphones." ++msgstr "" ++ ++msgid "Port Setting for SIP Devices" ++msgstr "Port-inställning för SIP-enheter" ++ ++msgid "Providers Used for Outgoing Calls" ++msgstr "" ++ ++msgid "QoS Settings" ++msgstr "QoS-inställningar" ++ ++msgid "RTP Port Range End" ++msgstr "" ++ ++msgid "RTP Port Range Start" ++msgstr "" ++ ++msgid "" ++"RTP traffic carries actual voice packets. This is the start of the port " ++"range that will be used for setting up RTP communication. It's usually OK to " ++"leave this at the default value." ++msgstr "" ++ ++msgid "Receives Incoming Calls" ++msgstr "Tar emot inkommande samtal" ++ ++msgid "Remote Usage" ++msgstr "" ++ ++msgid "Rings users enabled for incoming calls" ++msgstr "Ringer användare som är aktiverade för inkommande samtal" ++ ++msgid "SIP Accounts" ++msgstr "SIP-konton" ++ ++msgid "SIP Device/Softphone Accounts" ++msgstr "SIP-enhet/Softphone-konton" ++ ++msgid "SIP Provider Accounts" ++msgstr "SIP-operatörskonton" ++ ++msgid "SIP Realm (needed by some providers)" ++msgstr "SIP-sfär (behövs av vissa operatörer)" ++ ++msgid "SIP Server/Registrar" ++msgstr "" ++ ++msgid "SIP Server/Registrar Port" ++msgstr "" ++ ++msgid "Server Setting" ++msgstr "Server-inställning" ++ ++msgid "Server Setting for Local SIP Devices" ++msgstr "Server-inställning för lokala SIP-enheter" ++ ++msgid "Server Setting for Remote SIP Devices" ++msgstr "Server-inställning för fjärrstyrda SIP-enheter" ++ ++msgid "Service Status" ++msgstr "Status för tjänst" ++ ++msgid "" ++"Set the number of seconds to ring users upon incoming calls before hanging " ++"up or going to voicemail, if the voicemail is installed and enabled." ++msgstr "" ++ ++msgid "Space-Separated List of Blacklisted Numbers" ++msgstr "" ++ ++msgid "Specify numbers individually here. Press enter to add more numbers." ++msgstr "" ++"Specificera nummer individuellt här. Tryck pÃ¥ enter-knappen för att lägga " ++"till fler nummer." ++ ++msgid "" ++"Specify numbers individually here. Press enter to add more numbers. You will " ++"have to experiment with what country and area codes you need to add to the " ++"number." ++msgstr "" ++ ++msgid "" ++"The number(s) specified above will be able to dial out with this user's " ++"providers. Invalid usernames, including users not enabled for outgoing " ++"calls, are dropped silently. Please verify that the entry was accepted." ++msgstr "" ++ ++msgid "" ++"This configuration page allows you to configure a phone system (PBX) service " ++"which permits making phone calls through multiple Google and SIP (like " ++"Sipgate, SipSorcery, and Betamax) accounts and sharing them among many SIP " ++"devices. Note that Google accounts, SIP accounts, and local user accounts " ++"are configured in the \"Google Accounts\", \"SIP Accounts\", and \"User " ++"Accounts\" sub-sections. You must add at least one User Account to this PBX, " ++"and then configure a SIP device or softphone to use the account, in order to " ++"make and receive calls with your Google/SIP accounts. Configuring multiple " ++"users will allow you to make free calls between all users, and share the " ++"configured Google and SIP accounts. If you have more than one Google and SIP " ++"accounts set up, you should probably configure how calls to and from them " ++"are routed in the \"Call Routing\" page. If you're interested in using your " ++"own PBX from anywhere in the world, then visit the \"Remote Usage\" section " ++"in the \"Advanced Settings\" page." ++msgstr "" ++ ++msgid "" ++"This is the name that the VoIP server will use to identify itself when " ++"registering to VoIP (SIP) providers. Some providers require this to a " ++"specific string matching a hardware SIP device." ++msgstr "" ++ ++msgid "" ++"This is where you indicate which Google/SIP accounts are used to call what " ++"country/area codes, which users can use what SIP/Google accounts, how " ++"incoming calls are routed, what numbers can get into this PBX with a " ++"password, and what numbers are blacklisted." ++msgstr "" ++ ++msgid "" ++"This is where you set up your Google (Talk and Voice) Accounts, in order to " ++"start using them for dialing and receiving calls (voice chat and real phone " ++"calls). Please make at least one voice call using the Google Talk plugin " ++"installable through the GMail interface, and then log out from your account " ++"everywhere. Click \"Add\" to add as many accounts as you wish." ++msgstr "" ++ ++msgid "" ++"This is where you set up your SIP (VoIP) accounts ts like Sipgate, " ++"SipSorcery, the popular Betamax providers, and any other providers with SIP " ++"settings in order to start using them for dialing and receiving calls (SIP " ++"uri and real phone calls). Click \"Add\" to add as many accounts as you wish." ++msgstr "" ++ ++msgid "" ++"This option should be set to \"Yes\" if you have a DID (real telephone " ++"number) associated with this SIP account or want to receive SIP uri calls " ++"through this provider." ++msgstr "" ++"Det här valet borde vara inställt pÃ¥ \"Ja\" om du har ett DID (riktigt " ++"telefonnummer) associerat med det här SIP-kontot eller om du vill ta emot " ++"SIP uri-samtal via den här operatören." ++ ++msgid "" ++"This section contains settings that do not need to be changed under normal " ++"circumstances. In addition, here you can configure your system for use with " ++"remote SIP devices, and resolve call quality issues by enabling the " ++"insertion of QoS rules." ++msgstr "" ++ ++msgid "" ++"Use (four to five digit) numeric user name if you are connecting normal " ++"telephones with ATAs to this system (so they can dial user names)." ++msgstr "" ++ ++msgid "" ++"Use this account to make outgoing calls as configured in the \"Call Routing" ++"\" section." ++msgstr "" ++ ++msgid "Use this account to make outgoing calls." ++msgstr "Använd det här kontot för att göra utgÃ¥ende samtal." ++ ++msgid "User Accounts" ++msgstr "Användar-konton" ++ ++msgid "User Agent String" ++msgstr "" ++ ++msgid "User Name" ++msgstr "Användarnamn" ++ ++msgid "Uses providers enabled for outgoing calls" ++msgstr "Använder operatörer för utgÃ¥ende samtal" ++ ++msgid "" ++"When somebody starts voice chat with your GTalk account or calls the GVoice, " ++"number (if you have Google Voice), the call will be forwarded to any users " ++"that are online (registered using a SIP device or softphone) and permitted " ++"to receive the call. If you have Google Voice, you must go to your GVoice " ++"settings and forward calls to Google chat in order to actually receive calls " ++"made to your GVoice number. If you have trouble receiving calls from GVoice, " ++"experiment with the Call Screening option in your GVoice Settings. Finally, " ++"make sure no other client is online with this account (browser in gmail, " ++"mobile/desktop Google Talk App) as it may interfere." ++msgstr "" ++ ++msgid "" ++"When your password is saved, it disappears from this field and is not " ++"displayed for your protection. The previously saved password will be changed " ++"only when you enter a value different from the saved one." ++msgstr "" ++ ++msgid "Yes" ++msgstr "Ja" ++ ++msgid "" ++"You can enter your domain name, external IP address, or dynamic domain name " ++"here. The best thing to input is a static IP address. If your IP address is " ++"dynamic and it changes, your configuration will become invalid. Hence, it's " ++"recommended to set up Dynamic DNS in this case. and enter your Dynamic DNS " ++"hostname here. You can configure Dynamic DNS with the luci-app-ddns package." ++msgstr "" ++ ++msgid "You can specify a real name to show up in the Caller ID here." ++msgstr "" ++"Du kan specifiera ett riktigt namn som visas i samband med nummret här." ++ ++msgid "" ++"You can use your SIP devices/softphones with this system from a remote " ++"location as well, as long as your Internet Service Provider gives you a " ++"public IP. You will be able to call other local users for free (e.g. other " ++"Analog Telephone Adapters (ATAs)) and use your VoIP providers to make calls " ++"as if you were local to the PBX. After configuring this tab, go back to " ++"where users are configured and see the new Server and Port setting you need " ++"to configure the remote SIP devices with. Please note that if this PBX is " ++"not running on your router/gateway, you will need to configure port " ++"forwarding (NAT) on your router/gateway. Please forward the ports below (SIP " ++"port and RTP range) to the IP address of the device running this PBX." ++msgstr "" ++ ++msgid "" ++"Your PIN disappears when saved for your protection. It will be changed only " ++"when you enter a value different from the saved one. Leaving the PIN empty " ++"is possible, but please beware of the security implications." ++msgstr "" ++ ++msgid "" ++"Your password disappears when saved for your protection. It will be changed " ++"only when you enter a value different from the saved one." ++msgstr "" +diff --git a/feeds/luci/applications/luci-app-pbx/po/templates/pbx.pot b/feeds/luci/applications/luci-app-pbx/po/templates/pbx.pot +new file mode 100644 +index 0000000..86dd2eb +--- /dev/null ++++ b/feeds/luci/applications/luci-app-pbx/po/templates/pbx.pot +@@ -0,0 +1,477 @@ ++msgid "" ++msgstr "Content-Type: text/plain; charset=UTF-8" ++ ++msgid "Advanced Settings" ++msgstr "" ++ ++msgid "Available" ++msgstr "" ++ ++msgid "" ++"Avoid using anything but alpha-numeric characters, space, comma, and period." ++msgstr "" ++ ++msgid "Away" ++msgstr "" ++ ++msgid "Blacklisted Numbers" ++msgstr "" ++ ++msgid "Call Routing" ++msgstr "" ++ ++msgid "Call-back Numbers" ++msgstr "" ++ ++msgid "Call-back Provider" ++msgstr "" ++ ++msgid "Call-through Numbers" ++msgstr "" ++ ++msgid "Copy-paste large lists of numbers here." ++msgstr "" ++ ++msgid "" ++"Designate numbers that are allowed to call through this system and which " ++"user's privileges they will have." ++msgstr "" ++ ++msgid "" ++"Designate numbers to whom the system will hang up and call back, which " ++"provider will be used to call them, and which user's privileges will be " ++"granted to them." ++msgstr "" ++ ++msgid "Dials numbers unmatched elsewhere" ++msgstr "" ++ ++msgid "Do Not Disturb" ++msgstr "" ++ ++msgid "Domain/IP Address/Dynamic Domain" ++msgstr "" ++ ++msgid "Dynamic List of Blacklisted Numbers" ++msgstr "" ++ ++msgid "Email" ++msgstr "" ++ ++msgid "Enable Incoming Calls (Register via SIP)" ++msgstr "" ++ ++msgid "Enable Incoming Calls (set Status below)" ++msgstr "" ++ ++msgid "Enable Outgoing Calls" ++msgstr "" ++ ++msgid "Enabled" ++msgstr "" ++ ++msgid "" ++"Enter a VoIP provider to use for call-back in the format username@some.host." ++"name, as listed in \"Outgoing Calls\" above. It's easiest to copy and paste " ++"the providers from above. Invalid entries, including providers not enabled " ++"for outgoing calls, will be rejected silently." ++msgstr "" ++ ++msgid "" ++"Enter phone numbers that you want to decline calls from automatically. You " ++"should probably omit the country code and any leading zeroes, but please " ++"experiment to make sure you are blocking numbers from your desired area " ++"successfully." ++msgstr "" ++ ++msgid "" ++"Enter this IP (or IP:port) in the Server/Registrar setting of SIP devices " ++"you will use ONLY locally and never from a remote location." ++msgstr "" ++ ++msgid "" ++"Enter this hostname (or hostname:port) in the Server/Registrar setting of " ++"SIP devices you will use from a remote location (they will work locally too)." ++msgstr "" ++ ++msgid "External SIP Port" ++msgstr "" ++ ++msgid "" ++"For each provider enabled for incoming calls, here you can restrict which " ++"users to ring on incoming calls. If the list is empty, the system will " ++"indicate that all users enabled for incoming calls will ring. Invalid " ++"usernames will be rejected silently. Also, entering a username here " ++"overrides the user's setting to not receive incoming calls. This way, you " ++"can make certain users ring only for specific providers. Entries can be made " ++"in a space-separated list, and/or one per line by hitting enter after every " ++"one." ++msgstr "" ++ ++msgid "" ++"For each user enabled for outgoing calls you can restrict what providers the " ++"user can use for outgoing calls. By default all users can use all providers. " ++"To show up in the list below the user should be allowed to make outgoing " ++"calls in the \"User Accounts\" page. Enter VoIP providers in the format " ++"username@some.host.name, as listed in \"Outgoing Calls\" above. It's easiest " ++"to copy and paste the providers from above. Invalid entries, including " ++"providers not enabled for outgoing calls, will be rejected silently. Entries " ++"can be made in a space-separated list, and/or one per line by hitting enter " ++"after every one." ++msgstr "" ++ ++msgid "Full Name" ++msgstr "" ++ ++msgid "General Settings" ++msgstr "" ++ ++msgid "Google Accounts" ++msgstr "" ++ ++msgid "Google Talk Status" ++msgstr "" ++ ++msgid "Google Talk Status Message" ++msgstr "" ++ ++msgid "Google Voice/Talk Accounts" ++msgstr "" ++ ++msgid "Hang-up Delay" ++msgstr "" ++ ++msgid "" ++"Here you must configure at least one SIP account, that you will use to " ++"register with this service. Use this account either in an Analog Telephony " ++"Adapter (ATA), or in a SIP software like CSipSimple, Linphone, or Sipdroid " ++"on your smartphone, or Ekiga, Linphone, or X-Lite on your computer. By " ++"default, all SIP accounts will ring simultaneously if a call is made to one " ++"of your VoIP provider accounts or GV numbers." ++msgstr "" ++ ++msgid "" ++"How long to wait before hanging up. If the provider you use to dial " ++"automatically forwards to voicemail, you can set this value to a delay that " ++"will allow you to hang up before your call gets forwarded and you get billed " ++"for it." ++msgstr "" ++ ++msgid "" ++"If setting Server/Registrar to %s or %s does not work for you, try setting " ++"it to %s or %s and entering this port number in a separate field that " ++"specifies the Server/Registrar port number. Beware that some devices have a " ++"confusing setting that sets the port where SIP requests originate from on " ++"the SIP device itself (the bind port). The port specified on this page is " ++"NOT this bind port but the port this service listens on." ++msgstr "" ++ ++msgid "" ++"If you experience jittery or high latency audio during heavy downloads, you " ++"may want to enable QoS. QoS prioritizes traffic to and from your network for " ++"specified ports and IP addresses, resulting in better latency and throughput " ++"for sound in our case. If enabled below, a QoS rule for this service will be " ++"configured by the PBX automatically, but you must visit the QoS " ++"configuration page (Network->QoS) to configure other critical QoS settings " ++"like Download and Upload speed." ++msgstr "" ++ ++msgid "" ++"If you have more than one account that can make outgoing calls, you should " ++"enter a list of phone numbers and/or prefixes in the following fields for " ++"each provider listed. Invalid prefixes are removed silently, and only 0-9, " ++"X, Z, N, #, *, and + are valid characters. The letter X matches 0-9, Z " ++"matches 1-9, and N matches 2-9. For example to make calls to Germany through " ++"a provider, you can enter 49. To make calls to North America, you can enter " ++"1NXXNXXXXXX. If one of your providers can make \"local\" calls to an area " ++"code like New York's 646, you can enter 646NXXXXXX for that provider. You " ++"should leave one account with an empty list to make calls with it by " ++"default, if no other provider's prefixes match. The system will " ++"automatically replace an empty list with a message that the provider dials " ++"all numbers not matched by another provider's prefixes. Be as specific as " ++"possible (i.e. 1NXXNXXXXXX is better than 1). Please note all international " ++"dial codes are discarded (e.g. 00, 011, 010, 0011). Entries can be made in a " ++"space-separated list, and/or one per line by hitting enter after every one." ++msgstr "" ++ ++msgid "Incoming Calls" ++msgstr "" ++ ++msgid "Insert QoS Rules" ++msgstr "" ++ ++msgid "Makes Outgoing Calls" ++msgstr "" ++ ++msgid "NOTE: There are no Google or SIP provider accounts configured." ++msgstr "" ++ ++msgid "" ++"NOTE: There are no Google or SIP provider accounts enabled for incoming " ++"calls." ++msgstr "" ++ ++msgid "" ++"NOTE: There are no Google or SIP provider accounts enabled for outgoing " ++"calls." ++msgstr "" ++ ++msgid "NOTE: There are no local user accounts configured." ++msgstr "" ++ ++msgid "NOTE: There are no local user accounts enabled for outgoing calls." ++msgstr "" ++ ++msgid "No" ++msgstr "" ++ ++msgid "Number of Seconds to Ring" ++msgstr "" ++ ++msgid "Outbound Proxy" ++msgstr "" ++ ++msgid "Outgoing Calls" ++msgstr "" ++ ++msgid "PBX Main Page" ++msgstr "" ++ ++msgid "PBX Service Status" ++msgstr "" ++ ++msgid "PIN" ++msgstr "" ++ ++msgid "Password" ++msgstr "" ++ ++msgid "" ++"Pick a random port number between 6500 and 9500 for the service to listen " ++"on. Do not pick the standard 5060, because it is often subject to brute-" ++"force attacks. When finished, (1) click \"Save and Apply\", and (2) look in " ++"the \"SIP Device/Softphone Accounts\" section for updated Server and Port " ++"settings for your SIP Devices/Softphones." ++msgstr "" ++ ++msgid "Port Setting for SIP Devices" ++msgstr "" ++ ++msgid "Providers Used for Outgoing Calls" ++msgstr "" ++ ++msgid "QoS Settings" ++msgstr "" ++ ++msgid "RTP Port Range End" ++msgstr "" ++ ++msgid "RTP Port Range Start" ++msgstr "" ++ ++msgid "" ++"RTP traffic carries actual voice packets. This is the start of the port " ++"range that will be used for setting up RTP communication. It's usually OK to " ++"leave this at the default value." ++msgstr "" ++ ++msgid "Receives Incoming Calls" ++msgstr "" ++ ++msgid "Remote Usage" ++msgstr "" ++ ++msgid "Rings users enabled for incoming calls" ++msgstr "" ++ ++msgid "SIP Accounts" ++msgstr "" ++ ++msgid "SIP Device/Softphone Accounts" ++msgstr "" ++ ++msgid "SIP Provider Accounts" ++msgstr "" ++ ++msgid "SIP Realm (needed by some providers)" ++msgstr "" ++ ++msgid "SIP Server/Registrar" ++msgstr "" ++ ++msgid "SIP Server/Registrar Port" ++msgstr "" ++ ++msgid "Server Setting" ++msgstr "" ++ ++msgid "Server Setting for Local SIP Devices" ++msgstr "" ++ ++msgid "Server Setting for Remote SIP Devices" ++msgstr "" ++ ++msgid "Service Status" ++msgstr "" ++ ++msgid "" ++"Set the number of seconds to ring users upon incoming calls before hanging " ++"up or going to voicemail, if the voicemail is installed and enabled." ++msgstr "" ++ ++msgid "Space-Separated List of Blacklisted Numbers" ++msgstr "" ++ ++msgid "Specify numbers individually here. Press enter to add more numbers." ++msgstr "" ++ ++msgid "" ++"Specify numbers individually here. Press enter to add more numbers. You will " ++"have to experiment with what country and area codes you need to add to the " ++"number." ++msgstr "" ++ ++msgid "" ++"The number(s) specified above will be able to dial out with this user's " ++"providers. Invalid usernames, including users not enabled for outgoing " ++"calls, are dropped silently. Please verify that the entry was accepted." ++msgstr "" ++ ++msgid "" ++"This configuration page allows you to configure a phone system (PBX) service " ++"which permits making phone calls through multiple Google and SIP (like " ++"Sipgate, SipSorcery, and Betamax) accounts and sharing them among many SIP " ++"devices. Note that Google accounts, SIP accounts, and local user accounts " ++"are configured in the \"Google Accounts\", \"SIP Accounts\", and \"User " ++"Accounts\" sub-sections. You must add at least one User Account to this PBX, " ++"and then configure a SIP device or softphone to use the account, in order to " ++"make and receive calls with your Google/SIP accounts. Configuring multiple " ++"users will allow you to make free calls between all users, and share the " ++"configured Google and SIP accounts. If you have more than one Google and SIP " ++"accounts set up, you should probably configure how calls to and from them " ++"are routed in the \"Call Routing\" page. If you're interested in using your " ++"own PBX from anywhere in the world, then visit the \"Remote Usage\" section " ++"in the \"Advanced Settings\" page." ++msgstr "" ++ ++msgid "" ++"This is the name that the VoIP server will use to identify itself when " ++"registering to VoIP (SIP) providers. Some providers require this to a " ++"specific string matching a hardware SIP device." ++msgstr "" ++ ++msgid "" ++"This is where you indicate which Google/SIP accounts are used to call what " ++"country/area codes, which users can use what SIP/Google accounts, how " ++"incoming calls are routed, what numbers can get into this PBX with a " ++"password, and what numbers are blacklisted." ++msgstr "" ++ ++msgid "" ++"This is where you set up your Google (Talk and Voice) Accounts, in order to " ++"start using them for dialing and receiving calls (voice chat and real phone " ++"calls). Please make at least one voice call using the Google Talk plugin " ++"installable through the GMail interface, and then log out from your account " ++"everywhere. Click \"Add\" to add as many accounts as you wish." ++msgstr "" ++ ++msgid "" ++"This is where you set up your SIP (VoIP) accounts ts like Sipgate, " ++"SipSorcery, the popular Betamax providers, and any other providers with SIP " ++"settings in order to start using them for dialing and receiving calls (SIP " ++"uri and real phone calls). Click \"Add\" to add as many accounts as you wish." ++msgstr "" ++ ++msgid "" ++"This option should be set to \"Yes\" if you have a DID (real telephone " ++"number) associated with this SIP account or want to receive SIP uri calls " ++"through this provider." ++msgstr "" ++ ++msgid "" ++"This section contains settings that do not need to be changed under normal " ++"circumstances. In addition, here you can configure your system for use with " ++"remote SIP devices, and resolve call quality issues by enabling the " ++"insertion of QoS rules." ++msgstr "" ++ ++msgid "" ++"Use (four to five digit) numeric user name if you are connecting normal " ++"telephones with ATAs to this system (so they can dial user names)." ++msgstr "" ++ ++msgid "" ++"Use this account to make outgoing calls as configured in the \"Call Routing" ++"\" section." ++msgstr "" ++ ++msgid "Use this account to make outgoing calls." ++msgstr "" ++ ++msgid "User Accounts" ++msgstr "" ++ ++msgid "User Agent String" ++msgstr "" ++ ++msgid "User Name" ++msgstr "" ++ ++msgid "Uses providers enabled for outgoing calls" ++msgstr "" ++ ++msgid "" ++"When somebody starts voice chat with your GTalk account or calls the GVoice, " ++"number (if you have Google Voice), the call will be forwarded to any users " ++"that are online (registered using a SIP device or softphone) and permitted " ++"to receive the call. If you have Google Voice, you must go to your GVoice " ++"settings and forward calls to Google chat in order to actually receive calls " ++"made to your GVoice number. If you have trouble receiving calls from GVoice, " ++"experiment with the Call Screening option in your GVoice Settings. Finally, " ++"make sure no other client is online with this account (browser in gmail, " ++"mobile/desktop Google Talk App) as it may interfere." ++msgstr "" ++ ++msgid "" ++"When your password is saved, it disappears from this field and is not " ++"displayed for your protection. The previously saved password will be changed " ++"only when you enter a value different from the saved one." ++msgstr "" ++ ++msgid "Yes" ++msgstr "" ++ ++msgid "" ++"You can enter your domain name, external IP address, or dynamic domain name " ++"here. The best thing to input is a static IP address. If your IP address is " ++"dynamic and it changes, your configuration will become invalid. Hence, it's " ++"recommended to set up Dynamic DNS in this case. and enter your Dynamic DNS " ++"hostname here. You can configure Dynamic DNS with the luci-app-ddns package." ++msgstr "" ++ ++msgid "You can specify a real name to show up in the Caller ID here." ++msgstr "" ++ ++msgid "" ++"You can use your SIP devices/softphones with this system from a remote " ++"location as well, as long as your Internet Service Provider gives you a " ++"public IP. You will be able to call other local users for free (e.g. other " ++"Analog Telephone Adapters (ATAs)) and use your VoIP providers to make calls " ++"as if you were local to the PBX. After configuring this tab, go back to " ++"where users are configured and see the new Server and Port setting you need " ++"to configure the remote SIP devices with. Please note that if this PBX is " ++"not running on your router/gateway, you will need to configure port " ++"forwarding (NAT) on your router/gateway. Please forward the ports below (SIP " ++"port and RTP range) to the IP address of the device running this PBX." ++msgstr "" ++ ++msgid "" ++"Your PIN disappears when saved for your protection. It will be changed only " ++"when you enter a value different from the saved one. Leaving the PIN empty " ++"is possible, but please beware of the security implications." ++msgstr "" ++ ++msgid "" ++"Your password disappears when saved for your protection. It will be changed " ++"only when you enter a value different from the saved one." ++msgstr "" +diff --git a/feeds/luci/applications/luci-app-pbx/po/tr/pbx.po b/feeds/luci/applications/luci-app-pbx/po/tr/pbx.po +new file mode 100644 +index 0000000..59af3e8 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-pbx/po/tr/pbx.po +@@ -0,0 +1,484 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Last-Translator: Automatically generated\n" ++"Language-Team: none\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=1; plural=0;\n" ++ ++msgid "Advanced Settings" ++msgstr "" ++ ++msgid "Available" ++msgstr "" ++ ++msgid "" ++"Avoid using anything but alpha-numeric characters, space, comma, and period." ++msgstr "" ++ ++msgid "Away" ++msgstr "" ++ ++msgid "Blacklisted Numbers" ++msgstr "" ++ ++msgid "Call Routing" ++msgstr "" ++ ++msgid "Call-back Numbers" ++msgstr "" ++ ++msgid "Call-back Provider" ++msgstr "" ++ ++msgid "Call-through Numbers" ++msgstr "" ++ ++msgid "Copy-paste large lists of numbers here." ++msgstr "" ++ ++msgid "" ++"Designate numbers that are allowed to call through this system and which " ++"user's privileges they will have." ++msgstr "" ++ ++msgid "" ++"Designate numbers to whom the system will hang up and call back, which " ++"provider will be used to call them, and which user's privileges will be " ++"granted to them." ++msgstr "" ++ ++msgid "Dials numbers unmatched elsewhere" ++msgstr "" ++ ++msgid "Do Not Disturb" ++msgstr "" ++ ++msgid "Domain/IP Address/Dynamic Domain" ++msgstr "" ++ ++msgid "Dynamic List of Blacklisted Numbers" ++msgstr "" ++ ++msgid "Email" ++msgstr "" ++ ++msgid "Enable Incoming Calls (Register via SIP)" ++msgstr "" ++ ++msgid "Enable Incoming Calls (set Status below)" ++msgstr "" ++ ++msgid "Enable Outgoing Calls" ++msgstr "" ++ ++msgid "Enabled" ++msgstr "" ++ ++msgid "" ++"Enter a VoIP provider to use for call-back in the format username@some.host." ++"name, as listed in \"Outgoing Calls\" above. It's easiest to copy and paste " ++"the providers from above. Invalid entries, including providers not enabled " ++"for outgoing calls, will be rejected silently." ++msgstr "" ++ ++msgid "" ++"Enter phone numbers that you want to decline calls from automatically. You " ++"should probably omit the country code and any leading zeroes, but please " ++"experiment to make sure you are blocking numbers from your desired area " ++"successfully." ++msgstr "" ++ ++msgid "" ++"Enter this IP (or IP:port) in the Server/Registrar setting of SIP devices " ++"you will use ONLY locally and never from a remote location." ++msgstr "" ++ ++msgid "" ++"Enter this hostname (or hostname:port) in the Server/Registrar setting of " ++"SIP devices you will use from a remote location (they will work locally too)." ++msgstr "" ++ ++msgid "External SIP Port" ++msgstr "" ++ ++msgid "" ++"For each provider enabled for incoming calls, here you can restrict which " ++"users to ring on incoming calls. If the list is empty, the system will " ++"indicate that all users enabled for incoming calls will ring. Invalid " ++"usernames will be rejected silently. Also, entering a username here " ++"overrides the user's setting to not receive incoming calls. This way, you " ++"can make certain users ring only for specific providers. Entries can be made " ++"in a space-separated list, and/or one per line by hitting enter after every " ++"one." ++msgstr "" ++ ++msgid "" ++"For each user enabled for outgoing calls you can restrict what providers the " ++"user can use for outgoing calls. By default all users can use all providers. " ++"To show up in the list below the user should be allowed to make outgoing " ++"calls in the \"User Accounts\" page. Enter VoIP providers in the format " ++"username@some.host.name, as listed in \"Outgoing Calls\" above. It's easiest " ++"to copy and paste the providers from above. Invalid entries, including " ++"providers not enabled for outgoing calls, will be rejected silently. Entries " ++"can be made in a space-separated list, and/or one per line by hitting enter " ++"after every one." ++msgstr "" ++ ++msgid "Full Name" ++msgstr "" ++ ++msgid "General Settings" ++msgstr "" ++ ++msgid "Google Accounts" ++msgstr "" ++ ++msgid "Google Talk Status" ++msgstr "" ++ ++msgid "Google Talk Status Message" ++msgstr "" ++ ++msgid "Google Voice/Talk Accounts" ++msgstr "" ++ ++msgid "Hang-up Delay" ++msgstr "" ++ ++msgid "" ++"Here you must configure at least one SIP account, that you will use to " ++"register with this service. Use this account either in an Analog Telephony " ++"Adapter (ATA), or in a SIP software like CSipSimple, Linphone, or Sipdroid " ++"on your smartphone, or Ekiga, Linphone, or X-Lite on your computer. By " ++"default, all SIP accounts will ring simultaneously if a call is made to one " ++"of your VoIP provider accounts or GV numbers." ++msgstr "" ++ ++msgid "" ++"How long to wait before hanging up. If the provider you use to dial " ++"automatically forwards to voicemail, you can set this value to a delay that " ++"will allow you to hang up before your call gets forwarded and you get billed " ++"for it." ++msgstr "" ++ ++msgid "" ++"If setting Server/Registrar to %s or %s does not work for you, try setting " ++"it to %s or %s and entering this port number in a separate field that " ++"specifies the Server/Registrar port number. Beware that some devices have a " ++"confusing setting that sets the port where SIP requests originate from on " ++"the SIP device itself (the bind port). The port specified on this page is " ++"NOT this bind port but the port this service listens on." ++msgstr "" ++ ++msgid "" ++"If you experience jittery or high latency audio during heavy downloads, you " ++"may want to enable QoS. QoS prioritizes traffic to and from your network for " ++"specified ports and IP addresses, resulting in better latency and throughput " ++"for sound in our case. If enabled below, a QoS rule for this service will be " ++"configured by the PBX automatically, but you must visit the QoS " ++"configuration page (Network->QoS) to configure other critical QoS settings " ++"like Download and Upload speed." ++msgstr "" ++ ++msgid "" ++"If you have more than one account that can make outgoing calls, you should " ++"enter a list of phone numbers and/or prefixes in the following fields for " ++"each provider listed. Invalid prefixes are removed silently, and only 0-9, " ++"X, Z, N, #, *, and + are valid characters. The letter X matches 0-9, Z " ++"matches 1-9, and N matches 2-9. For example to make calls to Germany through " ++"a provider, you can enter 49. To make calls to North America, you can enter " ++"1NXXNXXXXXX. If one of your providers can make \"local\" calls to an area " ++"code like New York's 646, you can enter 646NXXXXXX for that provider. You " ++"should leave one account with an empty list to make calls with it by " ++"default, if no other provider's prefixes match. The system will " ++"automatically replace an empty list with a message that the provider dials " ++"all numbers not matched by another provider's prefixes. Be as specific as " ++"possible (i.e. 1NXXNXXXXXX is better than 1). Please note all international " ++"dial codes are discarded (e.g. 00, 011, 010, 0011). Entries can be made in a " ++"space-separated list, and/or one per line by hitting enter after every one." ++msgstr "" ++ ++msgid "Incoming Calls" ++msgstr "" ++ ++msgid "Insert QoS Rules" ++msgstr "" ++ ++msgid "Makes Outgoing Calls" ++msgstr "" ++ ++msgid "NOTE: There are no Google or SIP provider accounts configured." ++msgstr "" ++ ++msgid "" ++"NOTE: There are no Google or SIP provider accounts enabled for incoming " ++"calls." ++msgstr "" ++ ++msgid "" ++"NOTE: There are no Google or SIP provider accounts enabled for outgoing " ++"calls." ++msgstr "" ++ ++msgid "NOTE: There are no local user accounts configured." ++msgstr "" ++ ++msgid "NOTE: There are no local user accounts enabled for outgoing calls." ++msgstr "" ++ ++msgid "No" ++msgstr "" ++ ++msgid "Number of Seconds to Ring" ++msgstr "" ++ ++msgid "Outbound Proxy" ++msgstr "" ++ ++msgid "Outgoing Calls" ++msgstr "" ++ ++msgid "PBX Main Page" ++msgstr "" ++ ++msgid "PBX Service Status" ++msgstr "" ++ ++msgid "PIN" ++msgstr "" ++ ++msgid "Password" ++msgstr "" ++ ++msgid "" ++"Pick a random port number between 6500 and 9500 for the service to listen " ++"on. Do not pick the standard 5060, because it is often subject to brute-" ++"force attacks. When finished, (1) click \"Save and Apply\", and (2) look in " ++"the \"SIP Device/Softphone Accounts\" section for updated Server and Port " ++"settings for your SIP Devices/Softphones." ++msgstr "" ++ ++msgid "Port Setting for SIP Devices" ++msgstr "" ++ ++msgid "Providers Used for Outgoing Calls" ++msgstr "" ++ ++msgid "QoS Settings" ++msgstr "" ++ ++msgid "RTP Port Range End" ++msgstr "" ++ ++msgid "RTP Port Range Start" ++msgstr "" ++ ++msgid "" ++"RTP traffic carries actual voice packets. This is the start of the port " ++"range that will be used for setting up RTP communication. It's usually OK to " ++"leave this at the default value." ++msgstr "" ++ ++msgid "Receives Incoming Calls" ++msgstr "" ++ ++msgid "Remote Usage" ++msgstr "" ++ ++msgid "Rings users enabled for incoming calls" ++msgstr "" ++ ++msgid "SIP Accounts" ++msgstr "" ++ ++msgid "SIP Device/Softphone Accounts" ++msgstr "" ++ ++msgid "SIP Provider Accounts" ++msgstr "" ++ ++msgid "SIP Realm (needed by some providers)" ++msgstr "" ++ ++msgid "SIP Server/Registrar" ++msgstr "" ++ ++msgid "SIP Server/Registrar Port" ++msgstr "" ++ ++msgid "Server Setting" ++msgstr "" ++ ++msgid "Server Setting for Local SIP Devices" ++msgstr "" ++ ++msgid "Server Setting for Remote SIP Devices" ++msgstr "" ++ ++msgid "Service Status" ++msgstr "" ++ ++msgid "" ++"Set the number of seconds to ring users upon incoming calls before hanging " ++"up or going to voicemail, if the voicemail is installed and enabled." ++msgstr "" ++ ++msgid "Space-Separated List of Blacklisted Numbers" ++msgstr "" ++ ++msgid "Specify numbers individually here. Press enter to add more numbers." ++msgstr "" ++ ++msgid "" ++"Specify numbers individually here. Press enter to add more numbers. You will " ++"have to experiment with what country and area codes you need to add to the " ++"number." ++msgstr "" ++ ++msgid "" ++"The number(s) specified above will be able to dial out with this user's " ++"providers. Invalid usernames, including users not enabled for outgoing " ++"calls, are dropped silently. Please verify that the entry was accepted." ++msgstr "" ++ ++msgid "" ++"This configuration page allows you to configure a phone system (PBX) service " ++"which permits making phone calls through multiple Google and SIP (like " ++"Sipgate, SipSorcery, and Betamax) accounts and sharing them among many SIP " ++"devices. Note that Google accounts, SIP accounts, and local user accounts " ++"are configured in the \"Google Accounts\", \"SIP Accounts\", and \"User " ++"Accounts\" sub-sections. You must add at least one User Account to this PBX, " ++"and then configure a SIP device or softphone to use the account, in order to " ++"make and receive calls with your Google/SIP accounts. Configuring multiple " ++"users will allow you to make free calls between all users, and share the " ++"configured Google and SIP accounts. If you have more than one Google and SIP " ++"accounts set up, you should probably configure how calls to and from them " ++"are routed in the \"Call Routing\" page. If you're interested in using your " ++"own PBX from anywhere in the world, then visit the \"Remote Usage\" section " ++"in the \"Advanced Settings\" page." ++msgstr "" ++ ++msgid "" ++"This is the name that the VoIP server will use to identify itself when " ++"registering to VoIP (SIP) providers. Some providers require this to a " ++"specific string matching a hardware SIP device." ++msgstr "" ++ ++msgid "" ++"This is where you indicate which Google/SIP accounts are used to call what " ++"country/area codes, which users can use what SIP/Google accounts, how " ++"incoming calls are routed, what numbers can get into this PBX with a " ++"password, and what numbers are blacklisted." ++msgstr "" ++ ++msgid "" ++"This is where you set up your Google (Talk and Voice) Accounts, in order to " ++"start using them for dialing and receiving calls (voice chat and real phone " ++"calls). Please make at least one voice call using the Google Talk plugin " ++"installable through the GMail interface, and then log out from your account " ++"everywhere. Click \"Add\" to add as many accounts as you wish." ++msgstr "" ++ ++msgid "" ++"This is where you set up your SIP (VoIP) accounts ts like Sipgate, " ++"SipSorcery, the popular Betamax providers, and any other providers with SIP " ++"settings in order to start using them for dialing and receiving calls (SIP " ++"uri and real phone calls). Click \"Add\" to add as many accounts as you wish." ++msgstr "" ++ ++msgid "" ++"This option should be set to \"Yes\" if you have a DID (real telephone " ++"number) associated with this SIP account or want to receive SIP uri calls " ++"through this provider." ++msgstr "" ++ ++msgid "" ++"This section contains settings that do not need to be changed under normal " ++"circumstances. In addition, here you can configure your system for use with " ++"remote SIP devices, and resolve call quality issues by enabling the " ++"insertion of QoS rules." ++msgstr "" ++ ++msgid "" ++"Use (four to five digit) numeric user name if you are connecting normal " ++"telephones with ATAs to this system (so they can dial user names)." ++msgstr "" ++ ++msgid "" ++"Use this account to make outgoing calls as configured in the \"Call Routing" ++"\" section." ++msgstr "" ++ ++msgid "Use this account to make outgoing calls." ++msgstr "" ++ ++msgid "User Accounts" ++msgstr "" ++ ++msgid "User Agent String" ++msgstr "" ++ ++msgid "User Name" ++msgstr "" ++ ++msgid "Uses providers enabled for outgoing calls" ++msgstr "" ++ ++msgid "" ++"When somebody starts voice chat with your GTalk account or calls the GVoice, " ++"number (if you have Google Voice), the call will be forwarded to any users " ++"that are online (registered using a SIP device or softphone) and permitted " ++"to receive the call. If you have Google Voice, you must go to your GVoice " ++"settings and forward calls to Google chat in order to actually receive calls " ++"made to your GVoice number. If you have trouble receiving calls from GVoice, " ++"experiment with the Call Screening option in your GVoice Settings. Finally, " ++"make sure no other client is online with this account (browser in gmail, " ++"mobile/desktop Google Talk App) as it may interfere." ++msgstr "" ++ ++msgid "" ++"When your password is saved, it disappears from this field and is not " ++"displayed for your protection. The previously saved password will be changed " ++"only when you enter a value different from the saved one." ++msgstr "" ++ ++msgid "Yes" ++msgstr "" ++ ++msgid "" ++"You can enter your domain name, external IP address, or dynamic domain name " ++"here. The best thing to input is a static IP address. If your IP address is " ++"dynamic and it changes, your configuration will become invalid. Hence, it's " ++"recommended to set up Dynamic DNS in this case. and enter your Dynamic DNS " ++"hostname here. You can configure Dynamic DNS with the luci-app-ddns package." ++msgstr "" ++ ++msgid "You can specify a real name to show up in the Caller ID here." ++msgstr "" ++ ++msgid "" ++"You can use your SIP devices/softphones with this system from a remote " ++"location as well, as long as your Internet Service Provider gives you a " ++"public IP. You will be able to call other local users for free (e.g. other " ++"Analog Telephone Adapters (ATAs)) and use your VoIP providers to make calls " ++"as if you were local to the PBX. After configuring this tab, go back to " ++"where users are configured and see the new Server and Port setting you need " ++"to configure the remote SIP devices with. Please note that if this PBX is " ++"not running on your router/gateway, you will need to configure port " ++"forwarding (NAT) on your router/gateway. Please forward the ports below (SIP " ++"port and RTP range) to the IP address of the device running this PBX." ++msgstr "" ++ ++msgid "" ++"Your PIN disappears when saved for your protection. It will be changed only " ++"when you enter a value different from the saved one. Leaving the PIN empty " ++"is possible, but please beware of the security implications." ++msgstr "" ++ ++msgid "" ++"Your password disappears when saved for your protection. It will be changed " ++"only when you enter a value different from the saved one." ++msgstr "" +diff --git a/feeds/luci/applications/luci-app-pbx/po/uk/pbx.po b/feeds/luci/applications/luci-app-pbx/po/uk/pbx.po +new file mode 100644 +index 0000000..d65a784 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-pbx/po/uk/pbx.po +@@ -0,0 +1,501 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"PO-Revision-Date: 2013-08-13 15:47+0200\n" ++"Last-Translator: zubr_139 \n" ++"Language-Team: none\n" ++"Language: uk\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%" ++"10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "Advanced Settings" ++msgstr "Розширені налаштуваннÑ" ++ ++msgid "Available" ++msgstr "ДоÑтупний" ++ ++msgid "" ++"Avoid using anything but alpha-numeric characters, space, comma, and period." ++msgstr "" ++"ÐамагайтеÑÑ Ð½Ðµ викориÑтовувати нічого, крім алфавітно-цифрових Ñимволів, " ++"пропуÑків, ком Ñ– крапок." ++ ++msgid "Away" ++msgstr "" ++ ++msgid "Blacklisted Numbers" ++msgstr "" ++ ++msgid "Call Routing" ++msgstr "ÐœÐ°Ñ€ÑˆÑ€ÑƒÑ‚Ð¸Ð·Ð°Ñ†Ñ–Ñ Ð’Ð¸ÐºÐ»Ð¸ÐºÑ–Ð²" ++ ++msgid "Call-back Numbers" ++msgstr "" ++ ++msgid "Call-back Provider" ++msgstr "" ++ ++msgid "Call-through Numbers" ++msgstr "Виклик через номери" ++ ++msgid "Copy-paste large lists of numbers here." ++msgstr "" ++ ++msgid "" ++"Designate numbers that are allowed to call through this system and which " ++"user's privileges they will have." ++msgstr "" ++ ++msgid "" ++"Designate numbers to whom the system will hang up and call back, which " ++"provider will be used to call them, and which user's privileges will be " ++"granted to them." ++msgstr "" ++ ++msgid "Dials numbers unmatched elsewhere" ++msgstr "" ++ ++#, fuzzy ++msgid "Do Not Disturb" ++msgstr "Ðе турбувати" ++ ++msgid "Domain/IP Address/Dynamic Domain" ++msgstr "" ++ ++#, fuzzy ++msgid "Dynamic List of Blacklisted Numbers" ++msgstr "Динамічний ÑпиÑок небажаних дзвінків" ++ ++msgid "Email" ++msgstr "Електронна Ñкринька" ++ ++#, fuzzy ++msgid "Enable Incoming Calls (Register via SIP)" ++msgstr "Ðктивувати вхідні дзвінки (зареєÑтруватиÑÑ Ñ‡ÐµÑ€ÐµÐ· SIP)" ++ ++#, fuzzy ++msgid "Enable Incoming Calls (set Status below)" ++msgstr "Ðктивувати вхідні дзвінки (Ð’Ñтановити низький ÑтатуÑ)" ++ ++msgid "Enable Outgoing Calls" ++msgstr "Ðктивувати вихідні виклики" ++ ++msgid "Enabled" ++msgstr "Ðктивувати" ++ ++msgid "" ++"Enter a VoIP provider to use for call-back in the format username@some.host." ++"name, as listed in \"Outgoing Calls\" above. It's easiest to copy and paste " ++"the providers from above. Invalid entries, including providers not enabled " ++"for outgoing calls, will be rejected silently." ++msgstr "" ++ ++msgid "" ++"Enter phone numbers that you want to decline calls from automatically. You " ++"should probably omit the country code and any leading zeroes, but please " ++"experiment to make sure you are blocking numbers from your desired area " ++"successfully." ++msgstr "" ++ ++#, fuzzy ++msgid "" ++"Enter this IP (or IP:port) in the Server/Registrar setting of SIP devices " ++"you will use ONLY locally and never from a remote location." ++msgstr "" ++"Введіть цей IP (або IP:порт) Сервера/РеєÑтратор Ð½Ð°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ SIP приÑтрою ви " ++"будете викориÑтовувати тільки локально й ніколи з віддаленого міÑцÑ." ++ ++#, fuzzy ++msgid "" ++"Enter this hostname (or hostname:port) in the Server/Registrar setting of " ++"SIP devices you will use from a remote location (they will work locally too)." ++msgstr "" ++"Введіть це хоÑÑ‚ ім'Ñ (або ім'Ñ Ñ…Ð¾Ñта:порт) Ñервер/РеєÑтратор Ð½Ð°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ " ++"SIP приÑтрою ви будете викориÑтовувати з віддаленого міÑÑ†Ñ Ñ€Ð¾Ð·Ñ‚Ð°ÑˆÑƒÐ²Ð°Ð½Ð½Ñ " ++"(воно також буде працювати локально)." ++ ++msgid "External SIP Port" ++msgstr "Зовнішній порт SIP" ++ ++msgid "" ++"For each provider enabled for incoming calls, here you can restrict which " ++"users to ring on incoming calls. If the list is empty, the system will " ++"indicate that all users enabled for incoming calls will ring. Invalid " ++"usernames will be rejected silently. Also, entering a username here " ++"overrides the user's setting to not receive incoming calls. This way, you " ++"can make certain users ring only for specific providers. Entries can be made " ++"in a space-separated list, and/or one per line by hitting enter after every " ++"one." ++msgstr "" ++ ++msgid "" ++"For each user enabled for outgoing calls you can restrict what providers the " ++"user can use for outgoing calls. By default all users can use all providers. " ++"To show up in the list below the user should be allowed to make outgoing " ++"calls in the \"User Accounts\" page. Enter VoIP providers in the format " ++"username@some.host.name, as listed in \"Outgoing Calls\" above. It's easiest " ++"to copy and paste the providers from above. Invalid entries, including " ++"providers not enabled for outgoing calls, will be rejected silently. Entries " ++"can be made in a space-separated list, and/or one per line by hitting enter " ++"after every one." ++msgstr "" ++ ++msgid "Full Name" ++msgstr "Повне Ім'Ñ" ++ ++msgid "General Settings" ++msgstr "Загальні ÐалаштуваннÑ" ++ ++msgid "Google Accounts" ++msgstr "Облікові запиÑи Google" ++ ++msgid "Google Talk Status" ++msgstr "" ++ ++msgid "Google Talk Status Message" ++msgstr "" ++ ++msgid "Google Voice/Talk Accounts" ++msgstr "" ++ ++msgid "Hang-up Delay" ++msgstr "" ++ ++msgid "" ++"Here you must configure at least one SIP account, that you will use to " ++"register with this service. Use this account either in an Analog Telephony " ++"Adapter (ATA), or in a SIP software like CSipSimple, Linphone, or Sipdroid " ++"on your smartphone, or Ekiga, Linphone, or X-Lite on your computer. By " ++"default, all SIP accounts will ring simultaneously if a call is made to one " ++"of your VoIP provider accounts or GV numbers." ++msgstr "" ++ ++msgid "" ++"How long to wait before hanging up. If the provider you use to dial " ++"automatically forwards to voicemail, you can set this value to a delay that " ++"will allow you to hang up before your call gets forwarded and you get billed " ++"for it." ++msgstr "" ++ ++msgid "" ++"If setting Server/Registrar to %s or %s does not work for you, try setting " ++"it to %s or %s and entering this port number in a separate field that " ++"specifies the Server/Registrar port number. Beware that some devices have a " ++"confusing setting that sets the port where SIP requests originate from on " ++"the SIP device itself (the bind port). The port specified on this page is " ++"NOT this bind port but the port this service listens on." ++msgstr "" ++ ++msgid "" ++"If you experience jittery or high latency audio during heavy downloads, you " ++"may want to enable QoS. QoS prioritizes traffic to and from your network for " ++"specified ports and IP addresses, resulting in better latency and throughput " ++"for sound in our case. If enabled below, a QoS rule for this service will be " ++"configured by the PBX automatically, but you must visit the QoS " ++"configuration page (Network->QoS) to configure other critical QoS settings " ++"like Download and Upload speed." ++msgstr "" ++ ++msgid "" ++"If you have more than one account that can make outgoing calls, you should " ++"enter a list of phone numbers and/or prefixes in the following fields for " ++"each provider listed. Invalid prefixes are removed silently, and only 0-9, " ++"X, Z, N, #, *, and + are valid characters. The letter X matches 0-9, Z " ++"matches 1-9, and N matches 2-9. For example to make calls to Germany through " ++"a provider, you can enter 49. To make calls to North America, you can enter " ++"1NXXNXXXXXX. If one of your providers can make \"local\" calls to an area " ++"code like New York's 646, you can enter 646NXXXXXX for that provider. You " ++"should leave one account with an empty list to make calls with it by " ++"default, if no other provider's prefixes match. The system will " ++"automatically replace an empty list with a message that the provider dials " ++"all numbers not matched by another provider's prefixes. Be as specific as " ++"possible (i.e. 1NXXNXXXXXX is better than 1). Please note all international " ++"dial codes are discarded (e.g. 00, 011, 010, 0011). Entries can be made in a " ++"space-separated list, and/or one per line by hitting enter after every one." ++msgstr "" ++ ++msgid "Incoming Calls" ++msgstr "" ++ ++msgid "Insert QoS Rules" ++msgstr "" ++ ++msgid "Makes Outgoing Calls" ++msgstr "" ++ ++msgid "NOTE: There are no Google or SIP provider accounts configured." ++msgstr "" ++ ++msgid "" ++"NOTE: There are no Google or SIP provider accounts enabled for incoming " ++"calls." ++msgstr "" ++ ++msgid "" ++"NOTE: There are no Google or SIP provider accounts enabled for outgoing " ++"calls." ++msgstr "" ++ ++msgid "NOTE: There are no local user accounts configured." ++msgstr "" ++ ++msgid "NOTE: There are no local user accounts enabled for outgoing calls." ++msgstr "" ++ ++msgid "No" ++msgstr "ÐÑ–" ++ ++msgid "Number of Seconds to Ring" ++msgstr "" ++ ++msgid "Outbound Proxy" ++msgstr "" ++ ++msgid "Outgoing Calls" ++msgstr "" ++ ++msgid "PBX Main Page" ++msgstr "" ++ ++msgid "PBX Service Status" ++msgstr "" ++ ++msgid "PIN" ++msgstr "" ++ ++msgid "Password" ++msgstr "" ++ ++msgid "" ++"Pick a random port number between 6500 and 9500 for the service to listen " ++"on. Do not pick the standard 5060, because it is often subject to brute-" ++"force attacks. When finished, (1) click \"Save and Apply\", and (2) look in " ++"the \"SIP Device/Softphone Accounts\" section for updated Server and Port " ++"settings for your SIP Devices/Softphones." ++msgstr "" ++ ++msgid "Port Setting for SIP Devices" ++msgstr "" ++ ++msgid "Providers Used for Outgoing Calls" ++msgstr "" ++ ++msgid "QoS Settings" ++msgstr "" ++ ++msgid "RTP Port Range End" ++msgstr "" ++ ++msgid "RTP Port Range Start" ++msgstr "" ++ ++msgid "" ++"RTP traffic carries actual voice packets. This is the start of the port " ++"range that will be used for setting up RTP communication. It's usually OK to " ++"leave this at the default value." ++msgstr "" ++ ++msgid "Receives Incoming Calls" ++msgstr "" ++ ++msgid "Remote Usage" ++msgstr "" ++ ++msgid "Rings users enabled for incoming calls" ++msgstr "" ++ ++msgid "SIP Accounts" ++msgstr "" ++ ++msgid "SIP Device/Softphone Accounts" ++msgstr "" ++ ++msgid "SIP Provider Accounts" ++msgstr "" ++ ++msgid "SIP Realm (needed by some providers)" ++msgstr "" ++ ++msgid "SIP Server/Registrar" ++msgstr "" ++ ++msgid "SIP Server/Registrar Port" ++msgstr "" ++ ++msgid "Server Setting" ++msgstr "" ++ ++msgid "Server Setting for Local SIP Devices" ++msgstr "" ++ ++msgid "Server Setting for Remote SIP Devices" ++msgstr "" ++ ++msgid "Service Status" ++msgstr "" ++ ++msgid "" ++"Set the number of seconds to ring users upon incoming calls before hanging " ++"up or going to voicemail, if the voicemail is installed and enabled." ++msgstr "" ++ ++msgid "Space-Separated List of Blacklisted Numbers" ++msgstr "" ++ ++msgid "Specify numbers individually here. Press enter to add more numbers." ++msgstr "" ++ ++msgid "" ++"Specify numbers individually here. Press enter to add more numbers. You will " ++"have to experiment with what country and area codes you need to add to the " ++"number." ++msgstr "" ++ ++msgid "" ++"The number(s) specified above will be able to dial out with this user's " ++"providers. Invalid usernames, including users not enabled for outgoing " ++"calls, are dropped silently. Please verify that the entry was accepted." ++msgstr "" ++ ++msgid "" ++"This configuration page allows you to configure a phone system (PBX) service " ++"which permits making phone calls through multiple Google and SIP (like " ++"Sipgate, SipSorcery, and Betamax) accounts and sharing them among many SIP " ++"devices. Note that Google accounts, SIP accounts, and local user accounts " ++"are configured in the \"Google Accounts\", \"SIP Accounts\", and \"User " ++"Accounts\" sub-sections. You must add at least one User Account to this PBX, " ++"and then configure a SIP device or softphone to use the account, in order to " ++"make and receive calls with your Google/SIP accounts. Configuring multiple " ++"users will allow you to make free calls between all users, and share the " ++"configured Google and SIP accounts. If you have more than one Google and SIP " ++"accounts set up, you should probably configure how calls to and from them " ++"are routed in the \"Call Routing\" page. If you're interested in using your " ++"own PBX from anywhere in the world, then visit the \"Remote Usage\" section " ++"in the \"Advanced Settings\" page." ++msgstr "" ++ ++msgid "" ++"This is the name that the VoIP server will use to identify itself when " ++"registering to VoIP (SIP) providers. Some providers require this to a " ++"specific string matching a hardware SIP device." ++msgstr "" ++ ++msgid "" ++"This is where you indicate which Google/SIP accounts are used to call what " ++"country/area codes, which users can use what SIP/Google accounts, how " ++"incoming calls are routed, what numbers can get into this PBX with a " ++"password, and what numbers are blacklisted." ++msgstr "" ++ ++msgid "" ++"This is where you set up your Google (Talk and Voice) Accounts, in order to " ++"start using them for dialing and receiving calls (voice chat and real phone " ++"calls). Please make at least one voice call using the Google Talk plugin " ++"installable through the GMail interface, and then log out from your account " ++"everywhere. Click \"Add\" to add as many accounts as you wish." ++msgstr "" ++ ++msgid "" ++"This is where you set up your SIP (VoIP) accounts ts like Sipgate, " ++"SipSorcery, the popular Betamax providers, and any other providers with SIP " ++"settings in order to start using them for dialing and receiving calls (SIP " ++"uri and real phone calls). Click \"Add\" to add as many accounts as you wish." ++msgstr "" ++ ++msgid "" ++"This option should be set to \"Yes\" if you have a DID (real telephone " ++"number) associated with this SIP account or want to receive SIP uri calls " ++"through this provider." ++msgstr "" ++ ++msgid "" ++"This section contains settings that do not need to be changed under normal " ++"circumstances. In addition, here you can configure your system for use with " ++"remote SIP devices, and resolve call quality issues by enabling the " ++"insertion of QoS rules." ++msgstr "" ++ ++msgid "" ++"Use (four to five digit) numeric user name if you are connecting normal " ++"telephones with ATAs to this system (so they can dial user names)." ++msgstr "" ++ ++msgid "" ++"Use this account to make outgoing calls as configured in the \"Call Routing" ++"\" section." ++msgstr "" ++ ++msgid "Use this account to make outgoing calls." ++msgstr "" ++ ++msgid "User Accounts" ++msgstr "Облікові запиÑи кориÑтувачів" ++ ++msgid "User Agent String" ++msgstr "" ++ ++msgid "User Name" ++msgstr "Ім'Ñ ÐºÐ¾Ñ€Ð¸Ñтувача" ++ ++msgid "Uses providers enabled for outgoing calls" ++msgstr "" ++ ++msgid "" ++"When somebody starts voice chat with your GTalk account or calls the GVoice, " ++"number (if you have Google Voice), the call will be forwarded to any users " ++"that are online (registered using a SIP device or softphone) and permitted " ++"to receive the call. If you have Google Voice, you must go to your GVoice " ++"settings and forward calls to Google chat in order to actually receive calls " ++"made to your GVoice number. If you have trouble receiving calls from GVoice, " ++"experiment with the Call Screening option in your GVoice Settings. Finally, " ++"make sure no other client is online with this account (browser in gmail, " ++"mobile/desktop Google Talk App) as it may interfere." ++msgstr "" ++ ++msgid "" ++"When your password is saved, it disappears from this field and is not " ++"displayed for your protection. The previously saved password will be changed " ++"only when you enter a value different from the saved one." ++msgstr "" ++ ++msgid "Yes" ++msgstr "Так" ++ ++msgid "" ++"You can enter your domain name, external IP address, or dynamic domain name " ++"here. The best thing to input is a static IP address. If your IP address is " ++"dynamic and it changes, your configuration will become invalid. Hence, it's " ++"recommended to set up Dynamic DNS in this case. and enter your Dynamic DNS " ++"hostname here. You can configure Dynamic DNS with the luci-app-ddns package." ++msgstr "" ++ ++msgid "You can specify a real name to show up in the Caller ID here." ++msgstr "" ++ ++msgid "" ++"You can use your SIP devices/softphones with this system from a remote " ++"location as well, as long as your Internet Service Provider gives you a " ++"public IP. You will be able to call other local users for free (e.g. other " ++"Analog Telephone Adapters (ATAs)) and use your VoIP providers to make calls " ++"as if you were local to the PBX. After configuring this tab, go back to " ++"where users are configured and see the new Server and Port setting you need " ++"to configure the remote SIP devices with. Please note that if this PBX is " ++"not running on your router/gateway, you will need to configure port " ++"forwarding (NAT) on your router/gateway. Please forward the ports below (SIP " ++"port and RTP range) to the IP address of the device running this PBX." ++msgstr "" ++ ++msgid "" ++"Your PIN disappears when saved for your protection. It will be changed only " ++"when you enter a value different from the saved one. Leaving the PIN empty " ++"is possible, but please beware of the security implications." ++msgstr "" ++ ++msgid "" ++"Your password disappears when saved for your protection. It will be changed " ++"only when you enter a value different from the saved one." ++msgstr "" +diff --git a/feeds/luci/applications/luci-app-pbx/po/vi/pbx.po b/feeds/luci/applications/luci-app-pbx/po/vi/pbx.po +new file mode 100644 +index 0000000..59af3e8 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-pbx/po/vi/pbx.po +@@ -0,0 +1,484 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Last-Translator: Automatically generated\n" ++"Language-Team: none\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=1; plural=0;\n" ++ ++msgid "Advanced Settings" ++msgstr "" ++ ++msgid "Available" ++msgstr "" ++ ++msgid "" ++"Avoid using anything but alpha-numeric characters, space, comma, and period." ++msgstr "" ++ ++msgid "Away" ++msgstr "" ++ ++msgid "Blacklisted Numbers" ++msgstr "" ++ ++msgid "Call Routing" ++msgstr "" ++ ++msgid "Call-back Numbers" ++msgstr "" ++ ++msgid "Call-back Provider" ++msgstr "" ++ ++msgid "Call-through Numbers" ++msgstr "" ++ ++msgid "Copy-paste large lists of numbers here." ++msgstr "" ++ ++msgid "" ++"Designate numbers that are allowed to call through this system and which " ++"user's privileges they will have." ++msgstr "" ++ ++msgid "" ++"Designate numbers to whom the system will hang up and call back, which " ++"provider will be used to call them, and which user's privileges will be " ++"granted to them." ++msgstr "" ++ ++msgid "Dials numbers unmatched elsewhere" ++msgstr "" ++ ++msgid "Do Not Disturb" ++msgstr "" ++ ++msgid "Domain/IP Address/Dynamic Domain" ++msgstr "" ++ ++msgid "Dynamic List of Blacklisted Numbers" ++msgstr "" ++ ++msgid "Email" ++msgstr "" ++ ++msgid "Enable Incoming Calls (Register via SIP)" ++msgstr "" ++ ++msgid "Enable Incoming Calls (set Status below)" ++msgstr "" ++ ++msgid "Enable Outgoing Calls" ++msgstr "" ++ ++msgid "Enabled" ++msgstr "" ++ ++msgid "" ++"Enter a VoIP provider to use for call-back in the format username@some.host." ++"name, as listed in \"Outgoing Calls\" above. It's easiest to copy and paste " ++"the providers from above. Invalid entries, including providers not enabled " ++"for outgoing calls, will be rejected silently." ++msgstr "" ++ ++msgid "" ++"Enter phone numbers that you want to decline calls from automatically. You " ++"should probably omit the country code and any leading zeroes, but please " ++"experiment to make sure you are blocking numbers from your desired area " ++"successfully." ++msgstr "" ++ ++msgid "" ++"Enter this IP (or IP:port) in the Server/Registrar setting of SIP devices " ++"you will use ONLY locally and never from a remote location." ++msgstr "" ++ ++msgid "" ++"Enter this hostname (or hostname:port) in the Server/Registrar setting of " ++"SIP devices you will use from a remote location (they will work locally too)." ++msgstr "" ++ ++msgid "External SIP Port" ++msgstr "" ++ ++msgid "" ++"For each provider enabled for incoming calls, here you can restrict which " ++"users to ring on incoming calls. If the list is empty, the system will " ++"indicate that all users enabled for incoming calls will ring. Invalid " ++"usernames will be rejected silently. Also, entering a username here " ++"overrides the user's setting to not receive incoming calls. This way, you " ++"can make certain users ring only for specific providers. Entries can be made " ++"in a space-separated list, and/or one per line by hitting enter after every " ++"one." ++msgstr "" ++ ++msgid "" ++"For each user enabled for outgoing calls you can restrict what providers the " ++"user can use for outgoing calls. By default all users can use all providers. " ++"To show up in the list below the user should be allowed to make outgoing " ++"calls in the \"User Accounts\" page. Enter VoIP providers in the format " ++"username@some.host.name, as listed in \"Outgoing Calls\" above. It's easiest " ++"to copy and paste the providers from above. Invalid entries, including " ++"providers not enabled for outgoing calls, will be rejected silently. Entries " ++"can be made in a space-separated list, and/or one per line by hitting enter " ++"after every one." ++msgstr "" ++ ++msgid "Full Name" ++msgstr "" ++ ++msgid "General Settings" ++msgstr "" ++ ++msgid "Google Accounts" ++msgstr "" ++ ++msgid "Google Talk Status" ++msgstr "" ++ ++msgid "Google Talk Status Message" ++msgstr "" ++ ++msgid "Google Voice/Talk Accounts" ++msgstr "" ++ ++msgid "Hang-up Delay" ++msgstr "" ++ ++msgid "" ++"Here you must configure at least one SIP account, that you will use to " ++"register with this service. Use this account either in an Analog Telephony " ++"Adapter (ATA), or in a SIP software like CSipSimple, Linphone, or Sipdroid " ++"on your smartphone, or Ekiga, Linphone, or X-Lite on your computer. By " ++"default, all SIP accounts will ring simultaneously if a call is made to one " ++"of your VoIP provider accounts or GV numbers." ++msgstr "" ++ ++msgid "" ++"How long to wait before hanging up. If the provider you use to dial " ++"automatically forwards to voicemail, you can set this value to a delay that " ++"will allow you to hang up before your call gets forwarded and you get billed " ++"for it." ++msgstr "" ++ ++msgid "" ++"If setting Server/Registrar to %s or %s does not work for you, try setting " ++"it to %s or %s and entering this port number in a separate field that " ++"specifies the Server/Registrar port number. Beware that some devices have a " ++"confusing setting that sets the port where SIP requests originate from on " ++"the SIP device itself (the bind port). The port specified on this page is " ++"NOT this bind port but the port this service listens on." ++msgstr "" ++ ++msgid "" ++"If you experience jittery or high latency audio during heavy downloads, you " ++"may want to enable QoS. QoS prioritizes traffic to and from your network for " ++"specified ports and IP addresses, resulting in better latency and throughput " ++"for sound in our case. If enabled below, a QoS rule for this service will be " ++"configured by the PBX automatically, but you must visit the QoS " ++"configuration page (Network->QoS) to configure other critical QoS settings " ++"like Download and Upload speed." ++msgstr "" ++ ++msgid "" ++"If you have more than one account that can make outgoing calls, you should " ++"enter a list of phone numbers and/or prefixes in the following fields for " ++"each provider listed. Invalid prefixes are removed silently, and only 0-9, " ++"X, Z, N, #, *, and + are valid characters. The letter X matches 0-9, Z " ++"matches 1-9, and N matches 2-9. For example to make calls to Germany through " ++"a provider, you can enter 49. To make calls to North America, you can enter " ++"1NXXNXXXXXX. If one of your providers can make \"local\" calls to an area " ++"code like New York's 646, you can enter 646NXXXXXX for that provider. You " ++"should leave one account with an empty list to make calls with it by " ++"default, if no other provider's prefixes match. The system will " ++"automatically replace an empty list with a message that the provider dials " ++"all numbers not matched by another provider's prefixes. Be as specific as " ++"possible (i.e. 1NXXNXXXXXX is better than 1). Please note all international " ++"dial codes are discarded (e.g. 00, 011, 010, 0011). Entries can be made in a " ++"space-separated list, and/or one per line by hitting enter after every one." ++msgstr "" ++ ++msgid "Incoming Calls" ++msgstr "" ++ ++msgid "Insert QoS Rules" ++msgstr "" ++ ++msgid "Makes Outgoing Calls" ++msgstr "" ++ ++msgid "NOTE: There are no Google or SIP provider accounts configured." ++msgstr "" ++ ++msgid "" ++"NOTE: There are no Google or SIP provider accounts enabled for incoming " ++"calls." ++msgstr "" ++ ++msgid "" ++"NOTE: There are no Google or SIP provider accounts enabled for outgoing " ++"calls." ++msgstr "" ++ ++msgid "NOTE: There are no local user accounts configured." ++msgstr "" ++ ++msgid "NOTE: There are no local user accounts enabled for outgoing calls." ++msgstr "" ++ ++msgid "No" ++msgstr "" ++ ++msgid "Number of Seconds to Ring" ++msgstr "" ++ ++msgid "Outbound Proxy" ++msgstr "" ++ ++msgid "Outgoing Calls" ++msgstr "" ++ ++msgid "PBX Main Page" ++msgstr "" ++ ++msgid "PBX Service Status" ++msgstr "" ++ ++msgid "PIN" ++msgstr "" ++ ++msgid "Password" ++msgstr "" ++ ++msgid "" ++"Pick a random port number between 6500 and 9500 for the service to listen " ++"on. Do not pick the standard 5060, because it is often subject to brute-" ++"force attacks. When finished, (1) click \"Save and Apply\", and (2) look in " ++"the \"SIP Device/Softphone Accounts\" section for updated Server and Port " ++"settings for your SIP Devices/Softphones." ++msgstr "" ++ ++msgid "Port Setting for SIP Devices" ++msgstr "" ++ ++msgid "Providers Used for Outgoing Calls" ++msgstr "" ++ ++msgid "QoS Settings" ++msgstr "" ++ ++msgid "RTP Port Range End" ++msgstr "" ++ ++msgid "RTP Port Range Start" ++msgstr "" ++ ++msgid "" ++"RTP traffic carries actual voice packets. This is the start of the port " ++"range that will be used for setting up RTP communication. It's usually OK to " ++"leave this at the default value." ++msgstr "" ++ ++msgid "Receives Incoming Calls" ++msgstr "" ++ ++msgid "Remote Usage" ++msgstr "" ++ ++msgid "Rings users enabled for incoming calls" ++msgstr "" ++ ++msgid "SIP Accounts" ++msgstr "" ++ ++msgid "SIP Device/Softphone Accounts" ++msgstr "" ++ ++msgid "SIP Provider Accounts" ++msgstr "" ++ ++msgid "SIP Realm (needed by some providers)" ++msgstr "" ++ ++msgid "SIP Server/Registrar" ++msgstr "" ++ ++msgid "SIP Server/Registrar Port" ++msgstr "" ++ ++msgid "Server Setting" ++msgstr "" ++ ++msgid "Server Setting for Local SIP Devices" ++msgstr "" ++ ++msgid "Server Setting for Remote SIP Devices" ++msgstr "" ++ ++msgid "Service Status" ++msgstr "" ++ ++msgid "" ++"Set the number of seconds to ring users upon incoming calls before hanging " ++"up or going to voicemail, if the voicemail is installed and enabled." ++msgstr "" ++ ++msgid "Space-Separated List of Blacklisted Numbers" ++msgstr "" ++ ++msgid "Specify numbers individually here. Press enter to add more numbers." ++msgstr "" ++ ++msgid "" ++"Specify numbers individually here. Press enter to add more numbers. You will " ++"have to experiment with what country and area codes you need to add to the " ++"number." ++msgstr "" ++ ++msgid "" ++"The number(s) specified above will be able to dial out with this user's " ++"providers. Invalid usernames, including users not enabled for outgoing " ++"calls, are dropped silently. Please verify that the entry was accepted." ++msgstr "" ++ ++msgid "" ++"This configuration page allows you to configure a phone system (PBX) service " ++"which permits making phone calls through multiple Google and SIP (like " ++"Sipgate, SipSorcery, and Betamax) accounts and sharing them among many SIP " ++"devices. Note that Google accounts, SIP accounts, and local user accounts " ++"are configured in the \"Google Accounts\", \"SIP Accounts\", and \"User " ++"Accounts\" sub-sections. You must add at least one User Account to this PBX, " ++"and then configure a SIP device or softphone to use the account, in order to " ++"make and receive calls with your Google/SIP accounts. Configuring multiple " ++"users will allow you to make free calls between all users, and share the " ++"configured Google and SIP accounts. If you have more than one Google and SIP " ++"accounts set up, you should probably configure how calls to and from them " ++"are routed in the \"Call Routing\" page. If you're interested in using your " ++"own PBX from anywhere in the world, then visit the \"Remote Usage\" section " ++"in the \"Advanced Settings\" page." ++msgstr "" ++ ++msgid "" ++"This is the name that the VoIP server will use to identify itself when " ++"registering to VoIP (SIP) providers. Some providers require this to a " ++"specific string matching a hardware SIP device." ++msgstr "" ++ ++msgid "" ++"This is where you indicate which Google/SIP accounts are used to call what " ++"country/area codes, which users can use what SIP/Google accounts, how " ++"incoming calls are routed, what numbers can get into this PBX with a " ++"password, and what numbers are blacklisted." ++msgstr "" ++ ++msgid "" ++"This is where you set up your Google (Talk and Voice) Accounts, in order to " ++"start using them for dialing and receiving calls (voice chat and real phone " ++"calls). Please make at least one voice call using the Google Talk plugin " ++"installable through the GMail interface, and then log out from your account " ++"everywhere. Click \"Add\" to add as many accounts as you wish." ++msgstr "" ++ ++msgid "" ++"This is where you set up your SIP (VoIP) accounts ts like Sipgate, " ++"SipSorcery, the popular Betamax providers, and any other providers with SIP " ++"settings in order to start using them for dialing and receiving calls (SIP " ++"uri and real phone calls). Click \"Add\" to add as many accounts as you wish." ++msgstr "" ++ ++msgid "" ++"This option should be set to \"Yes\" if you have a DID (real telephone " ++"number) associated with this SIP account or want to receive SIP uri calls " ++"through this provider." ++msgstr "" ++ ++msgid "" ++"This section contains settings that do not need to be changed under normal " ++"circumstances. In addition, here you can configure your system for use with " ++"remote SIP devices, and resolve call quality issues by enabling the " ++"insertion of QoS rules." ++msgstr "" ++ ++msgid "" ++"Use (four to five digit) numeric user name if you are connecting normal " ++"telephones with ATAs to this system (so they can dial user names)." ++msgstr "" ++ ++msgid "" ++"Use this account to make outgoing calls as configured in the \"Call Routing" ++"\" section." ++msgstr "" ++ ++msgid "Use this account to make outgoing calls." ++msgstr "" ++ ++msgid "User Accounts" ++msgstr "" ++ ++msgid "User Agent String" ++msgstr "" ++ ++msgid "User Name" ++msgstr "" ++ ++msgid "Uses providers enabled for outgoing calls" ++msgstr "" ++ ++msgid "" ++"When somebody starts voice chat with your GTalk account or calls the GVoice, " ++"number (if you have Google Voice), the call will be forwarded to any users " ++"that are online (registered using a SIP device or softphone) and permitted " ++"to receive the call. If you have Google Voice, you must go to your GVoice " ++"settings and forward calls to Google chat in order to actually receive calls " ++"made to your GVoice number. If you have trouble receiving calls from GVoice, " ++"experiment with the Call Screening option in your GVoice Settings. Finally, " ++"make sure no other client is online with this account (browser in gmail, " ++"mobile/desktop Google Talk App) as it may interfere." ++msgstr "" ++ ++msgid "" ++"When your password is saved, it disappears from this field and is not " ++"displayed for your protection. The previously saved password will be changed " ++"only when you enter a value different from the saved one." ++msgstr "" ++ ++msgid "Yes" ++msgstr "" ++ ++msgid "" ++"You can enter your domain name, external IP address, or dynamic domain name " ++"here. The best thing to input is a static IP address. If your IP address is " ++"dynamic and it changes, your configuration will become invalid. Hence, it's " ++"recommended to set up Dynamic DNS in this case. and enter your Dynamic DNS " ++"hostname here. You can configure Dynamic DNS with the luci-app-ddns package." ++msgstr "" ++ ++msgid "You can specify a real name to show up in the Caller ID here." ++msgstr "" ++ ++msgid "" ++"You can use your SIP devices/softphones with this system from a remote " ++"location as well, as long as your Internet Service Provider gives you a " ++"public IP. You will be able to call other local users for free (e.g. other " ++"Analog Telephone Adapters (ATAs)) and use your VoIP providers to make calls " ++"as if you were local to the PBX. After configuring this tab, go back to " ++"where users are configured and see the new Server and Port setting you need " ++"to configure the remote SIP devices with. Please note that if this PBX is " ++"not running on your router/gateway, you will need to configure port " ++"forwarding (NAT) on your router/gateway. Please forward the ports below (SIP " ++"port and RTP range) to the IP address of the device running this PBX." ++msgstr "" ++ ++msgid "" ++"Your PIN disappears when saved for your protection. It will be changed only " ++"when you enter a value different from the saved one. Leaving the PIN empty " ++"is possible, but please beware of the security implications." ++msgstr "" ++ ++msgid "" ++"Your password disappears when saved for your protection. It will be changed " ++"only when you enter a value different from the saved one." ++msgstr "" +diff --git a/feeds/luci/applications/luci-app-pbx/po/zh-cn/pbx.po b/feeds/luci/applications/luci-app-pbx/po/zh-cn/pbx.po +new file mode 100644 +index 0000000..8ac03e1 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-pbx/po/zh-cn/pbx.po +@@ -0,0 +1,495 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"PO-Revision-Date: 2014-07-15 16:11+0200\n" ++"Last-Translator: Tanyingyu \n" ++"Language-Team: none\n" ++"Language: zh_CN\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=1; plural=0;\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "Advanced Settings" ++msgstr "高级设置" ++ ++msgid "Available" ++msgstr "å¯ç”¨" ++ ++msgid "" ++"Avoid using anything but alpha-numeric characters, space, comma, and period." ++msgstr "é¿å…使用除字æ¯ï¼Œæ•°å­—,空格,逗å·å’Œå¥å·å¤–的其他字符。" ++ ++msgid "Away" ++msgstr "外" ++ ++msgid "Blacklisted Numbers" ++msgstr "黑åå•" ++ ++msgid "Call Routing" ++msgstr "呼å«è·¯ç”±" ++ ++msgid "Call-back Numbers" ++msgstr "回调数" ++ ++msgid "Call-back Provider" ++msgstr "回呼æ供者" ++ ++msgid "Call-through Numbers" ++msgstr "通过数字呼å«" ++ ++msgid "Copy-paste large lists of numbers here." ++msgstr "å¤åˆ¶ç²˜è´´æ•°å­—大åå•ã€‚" ++ ++msgid "" ++"Designate numbers that are allowed to call through this system and which " ++"user's privileges they will have." ++msgstr "" ++ ++msgid "" ++"Designate numbers to whom the system will hang up and call back, which " ++"provider will be used to call them, and which user's privileges will be " ++"granted to them." ++msgstr "" ++ ++msgid "Dials numbers unmatched elsewhere" ++msgstr "其他地方无法匹é…拨å·å·ç " ++ ++msgid "Do Not Disturb" ++msgstr "请勿打扰" ++ ++msgid "Domain/IP Address/Dynamic Domain" ++msgstr "域å/ IP地å€/动æ€åŸŸå" ++ ++msgid "Dynamic List of Blacklisted Numbers" ++msgstr "动æ€é»‘åå•å·ç åˆ—表" ++ ++msgid "Email" ++msgstr "电å­é‚®ä»¶" ++ ++msgid "Enable Incoming Calls (Register via SIP)" ++msgstr "å…许电è¯å‘¼å…¥ï¼ˆSIP注册者)" ++ ++msgid "Enable Incoming Calls (set Status below)" ++msgstr "å…许电è¯å‘¼å…¥ï¼ˆä¸‹é¢è®¾ç½®çŠ¶æ€ï¼‰" ++ ++msgid "Enable Outgoing Calls" ++msgstr "å…许电è¯å¤–呼" ++ ++msgid "Enabled" ++msgstr "å…许" ++ ++msgid "" ++"Enter a VoIP provider to use for call-back in the format username@some.host." ++"name, as listed in \"Outgoing Calls\" above. It's easiest to copy and paste " ++"the providers from above. Invalid entries, including providers not enabled " ++"for outgoing calls, will be rejected silently." ++msgstr "" ++ ++msgid "" ++"Enter phone numbers that you want to decline calls from automatically. You " ++"should probably omit the country code and any leading zeroes, but please " ++"experiment to make sure you are blocking numbers from your desired area " ++"successfully." ++msgstr "" ++"输入你想自动å±è”½çš„电è¯å·ç ã€‚你应该忽略国家代ç å’Œä»»ä½•å‰å¯¼é›¶,但请测试æ¥ç¡®ä¿ä½ æˆ" ++"功å±è”½äº†æƒ³è¦å±è”½çš„å·ç ã€‚" ++ ++msgid "" ++"Enter this IP (or IP:port) in the Server/Registrar setting of SIP devices " ++"you will use ONLY locally and never from a remote location." ++msgstr "" ++"在SIP设备注册æœåŠ¡å™¨ä¸­è¾“å…¥IP(或IP:端å£),仅在本地使用,ä¸å¯ä»¥åœ¨è¿œç¨‹ä½¿ç”¨ã€‚" ++ ++msgid "" ++"Enter this hostname (or hostname:port) in the Server/Registrar setting of " ++"SIP devices you will use from a remote location (they will work locally too)." ++msgstr "" ++ ++msgid "External SIP Port" ++msgstr "外部SIP端å£" ++ ++msgid "" ++"For each provider enabled for incoming calls, here you can restrict which " ++"users to ring on incoming calls. If the list is empty, the system will " ++"indicate that all users enabled for incoming calls will ring. Invalid " ++"usernames will be rejected silently. Also, entering a username here " ++"overrides the user's setting to not receive incoming calls. This way, you " ++"can make certain users ring only for specific providers. Entries can be made " ++"in a space-separated list, and/or one per line by hitting enter after every " ++"one." ++msgstr "" ++ ++msgid "" ++"For each user enabled for outgoing calls you can restrict what providers the " ++"user can use for outgoing calls. By default all users can use all providers. " ++"To show up in the list below the user should be allowed to make outgoing " ++"calls in the \"User Accounts\" page. Enter VoIP providers in the format " ++"username@some.host.name, as listed in \"Outgoing Calls\" above. It's easiest " ++"to copy and paste the providers from above. Invalid entries, including " ++"providers not enabled for outgoing calls, will be rejected silently. Entries " ++"can be made in a space-separated list, and/or one per line by hitting enter " ++"after every one." ++msgstr "" ++ ++msgid "Full Name" ++msgstr "å…¨å" ++ ++msgid "General Settings" ++msgstr "通用设置" ++ ++msgid "Google Accounts" ++msgstr "googleè´¦å·" ++ ++msgid "Google Talk Status" ++msgstr "google Talk状æ€" ++ ++msgid "Google Talk Status Message" ++msgstr "google Talk状æ€æ¶ˆæ¯" ++ ++msgid "Google Voice/Talk Accounts" ++msgstr "Google Voice/Talkè´¦å·" ++ ++msgid "Hang-up Delay" ++msgstr "" ++ ++msgid "" ++"Here you must configure at least one SIP account, that you will use to " ++"register with this service. Use this account either in an Analog Telephony " ++"Adapter (ATA), or in a SIP software like CSipSimple, Linphone, or Sipdroid " ++"on your smartphone, or Ekiga, Linphone, or X-Lite on your computer. By " ++"default, all SIP accounts will ring simultaneously if a call is made to one " ++"of your VoIP provider accounts or GV numbers." ++msgstr "" ++ ++msgid "" ++"How long to wait before hanging up. If the provider you use to dial " ++"automatically forwards to voicemail, you can set this value to a delay that " ++"will allow you to hang up before your call gets forwarded and you get billed " ++"for it." ++msgstr "" ++ ++msgid "" ++"If setting Server/Registrar to %s or %s does not work for you, try setting " ++"it to %s or %s and entering this port number in a separate field that " ++"specifies the Server/Registrar port number. Beware that some devices have a " ++"confusing setting that sets the port where SIP requests originate from on " ++"the SIP device itself (the bind port). The port specified on this page is " ++"NOT this bind port but the port this service listens on." ++msgstr "" ++ ++msgid "" ++"If you experience jittery or high latency audio during heavy downloads, you " ++"may want to enable QoS. QoS prioritizes traffic to and from your network for " ++"specified ports and IP addresses, resulting in better latency and throughput " ++"for sound in our case. If enabled below, a QoS rule for this service will be " ++"configured by the PBX automatically, but you must visit the QoS " ++"configuration page (Network->QoS) to configure other critical QoS settings " ++"like Download and Upload speed." ++msgstr "" ++ ++msgid "" ++"If you have more than one account that can make outgoing calls, you should " ++"enter a list of phone numbers and/or prefixes in the following fields for " ++"each provider listed. Invalid prefixes are removed silently, and only 0-9, " ++"X, Z, N, #, *, and + are valid characters. The letter X matches 0-9, Z " ++"matches 1-9, and N matches 2-9. For example to make calls to Germany through " ++"a provider, you can enter 49. To make calls to North America, you can enter " ++"1NXXNXXXXXX. If one of your providers can make \"local\" calls to an area " ++"code like New York's 646, you can enter 646NXXXXXX for that provider. You " ++"should leave one account with an empty list to make calls with it by " ++"default, if no other provider's prefixes match. The system will " ++"automatically replace an empty list with a message that the provider dials " ++"all numbers not matched by another provider's prefixes. Be as specific as " ++"possible (i.e. 1NXXNXXXXXX is better than 1). Please note all international " ++"dial codes are discarded (e.g. 00, 011, 010, 0011). Entries can be made in a " ++"space-separated list, and/or one per line by hitting enter after every one." ++msgstr "" ++ ++msgid "Incoming Calls" ++msgstr "呼入电è¯" ++ ++msgid "Insert QoS Rules" ++msgstr "æ’å…¥QoS规则" ++ ++msgid "Makes Outgoing Calls" ++msgstr "安排外呼列表" ++ ++msgid "NOTE: There are no Google or SIP provider accounts configured." ++msgstr "注æ„:没有google或SIPæ供者账户é…置。" ++ ++msgid "" ++"NOTE: There are no Google or SIP provider accounts enabled for incoming " ++"calls." ++msgstr "注æ„:没有google或SIPæ供者账户å…许呼入电è¯ã€‚" ++ ++msgid "" ++"NOTE: There are no Google or SIP provider accounts enabled for outgoing " ++"calls." ++msgstr "注æ„:没有google或SIPæ供者账户å…许外呼电è¯ã€‚" ++ ++msgid "NOTE: There are no local user accounts configured." ++msgstr "注æ„:没有本地用户设置。" ++ ++msgid "NOTE: There are no local user accounts enabled for outgoing calls." ++msgstr "注æ„:没有本地用户å…许外呼电è¯ã€‚" ++ ++msgid "No" ++msgstr "ä¸" ++ ++msgid "Number of Seconds to Ring" ++msgstr "多少秒振铃" ++ ++msgid "Outbound Proxy" ++msgstr "外呼代ç†" ++ ++msgid "Outgoing Calls" ++msgstr "外呼电è¯" ++ ++msgid "PBX Main Page" ++msgstr "PBX主页" ++ ++msgid "PBX Service Status" ++msgstr "PBXæœåŠ¡çŠ¶æ€" ++ ++msgid "PIN" ++msgstr "PIN" ++ ++msgid "Password" ++msgstr "密ç " ++ ++msgid "" ++"Pick a random port number between 6500 and 9500 for the service to listen " ++"on. Do not pick the standard 5060, because it is often subject to brute-" ++"force attacks. When finished, (1) click \"Save and Apply\", and (2) look in " ++"the \"SIP Device/Softphone Accounts\" section for updated Server and Port " ++"settings for your SIP Devices/Softphones." ++msgstr "" ++ ++msgid "Port Setting for SIP Devices" ++msgstr "SIP设备端å£è®¾ç½®" ++ ++msgid "Providers Used for Outgoing Calls" ++msgstr "用于外呼电è¯çš„æ供者" ++ ++msgid "QoS Settings" ++msgstr "QoS设置" ++ ++msgid "RTP Port Range End" ++msgstr "RTP结æŸç«¯å£" ++ ++msgid "RTP Port Range Start" ++msgstr "RTP起始端å£" ++ ++msgid "" ++"RTP traffic carries actual voice packets. This is the start of the port " ++"range that will be used for setting up RTP communication. It's usually OK to " ++"leave this at the default value." ++msgstr "" ++ ++msgid "Receives Incoming Calls" ++msgstr "收到呼入电è¯" ++ ++msgid "Remote Usage" ++msgstr "远程使用" ++ ++msgid "Rings users enabled for incoming calls" ++msgstr "" ++ ++msgid "SIP Accounts" ++msgstr "SIPè´¦å·" ++ ++msgid "SIP Device/Softphone Accounts" ++msgstr "SIP 设备/软电è¯è´¦å·" ++ ++msgid "SIP Provider Accounts" ++msgstr "SIPæ供者账户" ++ ++msgid "SIP Realm (needed by some providers)" ++msgstr "SIP Realm(一些供应商需è¦ï¼‰" ++ ++msgid "SIP Server/Registrar" ++msgstr "SIP注册æœåŠ¡å™¨" ++ ++msgid "SIP Server/Registrar Port" ++msgstr "SIP注册æœåŠ¡å™¨ç«¯å£" ++ ++msgid "Server Setting" ++msgstr "" ++ ++msgid "Server Setting for Local SIP Devices" ++msgstr "" ++ ++msgid "Server Setting for Remote SIP Devices" ++msgstr "" ++ ++msgid "Service Status" ++msgstr "" ++ ++msgid "" ++"Set the number of seconds to ring users upon incoming calls before hanging " ++"up or going to voicemail, if the voicemail is installed and enabled." ++msgstr "" ++ ++msgid "Space-Separated List of Blacklisted Numbers" ++msgstr "" ++ ++msgid "Specify numbers individually here. Press enter to add more numbers." ++msgstr "" ++ ++msgid "" ++"Specify numbers individually here. Press enter to add more numbers. You will " ++"have to experiment with what country and area codes you need to add to the " ++"number." ++msgstr "" ++ ++msgid "" ++"The number(s) specified above will be able to dial out with this user's " ++"providers. Invalid usernames, including users not enabled for outgoing " ++"calls, are dropped silently. Please verify that the entry was accepted." ++msgstr "" ++ ++msgid "" ++"This configuration page allows you to configure a phone system (PBX) service " ++"which permits making phone calls through multiple Google and SIP (like " ++"Sipgate, SipSorcery, and Betamax) accounts and sharing them among many SIP " ++"devices. Note that Google accounts, SIP accounts, and local user accounts " ++"are configured in the \"Google Accounts\", \"SIP Accounts\", and \"User " ++"Accounts\" sub-sections. You must add at least one User Account to this PBX, " ++"and then configure a SIP device or softphone to use the account, in order to " ++"make and receive calls with your Google/SIP accounts. Configuring multiple " ++"users will allow you to make free calls between all users, and share the " ++"configured Google and SIP accounts. If you have more than one Google and SIP " ++"accounts set up, you should probably configure how calls to and from them " ++"are routed in the \"Call Routing\" page. If you're interested in using your " ++"own PBX from anywhere in the world, then visit the \"Remote Usage\" section " ++"in the \"Advanced Settings\" page." ++msgstr "" ++ ++msgid "" ++"This is the name that the VoIP server will use to identify itself when " ++"registering to VoIP (SIP) providers. Some providers require this to a " ++"specific string matching a hardware SIP device." ++msgstr "" ++ ++msgid "" ++"This is where you indicate which Google/SIP accounts are used to call what " ++"country/area codes, which users can use what SIP/Google accounts, how " ++"incoming calls are routed, what numbers can get into this PBX with a " ++"password, and what numbers are blacklisted." ++msgstr "" ++ ++msgid "" ++"This is where you set up your Google (Talk and Voice) Accounts, in order to " ++"start using them for dialing and receiving calls (voice chat and real phone " ++"calls). Please make at least one voice call using the Google Talk plugin " ++"installable through the GMail interface, and then log out from your account " ++"everywhere. Click \"Add\" to add as many accounts as you wish." ++msgstr "" ++ ++msgid "" ++"This is where you set up your SIP (VoIP) accounts ts like Sipgate, " ++"SipSorcery, the popular Betamax providers, and any other providers with SIP " ++"settings in order to start using them for dialing and receiving calls (SIP " ++"uri and real phone calls). Click \"Add\" to add as many accounts as you wish." ++msgstr "" ++ ++msgid "" ++"This option should be set to \"Yes\" if you have a DID (real telephone " ++"number) associated with this SIP account or want to receive SIP uri calls " ++"through this provider." ++msgstr "" ++ ++msgid "" ++"This section contains settings that do not need to be changed under normal " ++"circumstances. In addition, here you can configure your system for use with " ++"remote SIP devices, and resolve call quality issues by enabling the " ++"insertion of QoS rules." ++msgstr "" ++ ++msgid "" ++"Use (four to five digit) numeric user name if you are connecting normal " ++"telephones with ATAs to this system (so they can dial user names)." ++msgstr "" ++ ++msgid "" ++"Use this account to make outgoing calls as configured in the \"Call Routing" ++"\" section." ++msgstr "" ++ ++msgid "Use this account to make outgoing calls." ++msgstr "" ++ ++msgid "User Accounts" ++msgstr "" ++ ++msgid "User Agent String" ++msgstr "" ++ ++msgid "User Name" ++msgstr "" ++ ++msgid "Uses providers enabled for outgoing calls" ++msgstr "" ++ ++msgid "" ++"When somebody starts voice chat with your GTalk account or calls the GVoice, " ++"number (if you have Google Voice), the call will be forwarded to any users " ++"that are online (registered using a SIP device or softphone) and permitted " ++"to receive the call. If you have Google Voice, you must go to your GVoice " ++"settings and forward calls to Google chat in order to actually receive calls " ++"made to your GVoice number. If you have trouble receiving calls from GVoice, " ++"experiment with the Call Screening option in your GVoice Settings. Finally, " ++"make sure no other client is online with this account (browser in gmail, " ++"mobile/desktop Google Talk App) as it may interfere." ++msgstr "" ++ ++msgid "" ++"When your password is saved, it disappears from this field and is not " ++"displayed for your protection. The previously saved password will be changed " ++"only when you enter a value different from the saved one." ++msgstr "" ++ ++msgid "Yes" ++msgstr "" ++ ++msgid "" ++"You can enter your domain name, external IP address, or dynamic domain name " ++"here. The best thing to input is a static IP address. If your IP address is " ++"dynamic and it changes, your configuration will become invalid. Hence, it's " ++"recommended to set up Dynamic DNS in this case. and enter your Dynamic DNS " ++"hostname here. You can configure Dynamic DNS with the luci-app-ddns package." ++msgstr "" ++ ++msgid "You can specify a real name to show up in the Caller ID here." ++msgstr "" ++ ++msgid "" ++"You can use your SIP devices/softphones with this system from a remote " ++"location as well, as long as your Internet Service Provider gives you a " ++"public IP. You will be able to call other local users for free (e.g. other " ++"Analog Telephone Adapters (ATAs)) and use your VoIP providers to make calls " ++"as if you were local to the PBX. After configuring this tab, go back to " ++"where users are configured and see the new Server and Port setting you need " ++"to configure the remote SIP devices with. Please note that if this PBX is " ++"not running on your router/gateway, you will need to configure port " ++"forwarding (NAT) on your router/gateway. Please forward the ports below (SIP " ++"port and RTP range) to the IP address of the device running this PBX." ++msgstr "" ++ ++msgid "" ++"Your PIN disappears when saved for your protection. It will be changed only " ++"when you enter a value different from the saved one. Leaving the PIN empty " ++"is possible, but please beware of the security implications." ++msgstr "" ++ ++msgid "" ++"Your password disappears when saved for your protection. It will be changed " ++"only when you enter a value different from the saved one." ++msgstr "" ++ ++#~ msgid "" ++#~ "Designate numbers that are allowed to call through this system and which " ++#~ "user's privileges it will have." ++#~ msgstr "设定å·ç ä½œä¸ºç”¨æˆ·æ‹¥æœ‰ä½¿ç”¨äº¤æ¢æœºå‘¼å«çš„æƒé™ã€‚" +diff --git a/feeds/luci/applications/luci-app-pbx/po/zh-tw/pbx.po b/feeds/luci/applications/luci-app-pbx/po/zh-tw/pbx.po +new file mode 100644 +index 0000000..aa05be7 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-pbx/po/zh-tw/pbx.po +@@ -0,0 +1,507 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"PO-Revision-Date: 2014-05-16 13:59+0200\n" ++"Last-Translator: omnistack \n" ++"Language-Team: none\n" ++"Language: zh_TW\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=1; plural=0;\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "Advanced Settings" ++msgstr "進階設定" ++ ++msgid "Available" ++msgstr "å¯é‹ç”¨" ++ ++msgid "" ++"Avoid using anything but alpha-numeric characters, space, comma, and period." ++msgstr "除了字æ¯æ•¸å­—字符,空格,逗號和å¥è™Ÿå…¶å®ƒä¸€æ¦‚ä¸ç”¨." ++ ++msgid "Away" ++msgstr "離線" ++ ++msgid "Blacklisted Numbers" ++msgstr "列入黑å單號碼" ++ ++msgid "Call Routing" ++msgstr "路由呼å«" ++ ++msgid "Call-back Numbers" ++msgstr "" ++ ++msgid "Call-back Provider" ++msgstr "" ++ ++msgid "Call-through Numbers" ++msgstr "通話接通號碼" ++ ++msgid "Copy-paste large lists of numbers here." ++msgstr "號碼大型清單複製貼上此地" ++ ++msgid "" ++"Designate numbers that are allowed to call through this system and which " ++"user's privileges they will have." ++msgstr "" ++ ++msgid "" ++"Designate numbers to whom the system will hang up and call back, which " ++"provider will be used to call them, and which user's privileges will be " ++"granted to them." ++msgstr "" ++ ++msgid "Dials numbers unmatched elsewhere" ++msgstr "撥號它處號碼ä¸ç¬¦" ++ ++msgid "Do Not Disturb" ++msgstr "勿擾中" ++ ++msgid "Domain/IP Address/Dynamic Domain" ++msgstr "網域/IPä½å€/動態網域" ++ ++msgid "Dynamic List of Blacklisted Numbers" ++msgstr "黑å單動態列表" ++ ++msgid "Email" ++msgstr "郵件信箱" ++ ++msgid "Enable Incoming Calls (Register via SIP)" ++msgstr "啟用來話呼å«(é€éŽSIP註冊)" ++ ++msgid "Enable Incoming Calls (set Status below)" ++msgstr "啟用來話呼å«(在下é¢è¨­å®šç‹€æ…‹)" ++ ++msgid "Enable Outgoing Calls" ++msgstr "啟用外撥" ++ ++msgid "Enabled" ++msgstr "已啟用" ++ ++msgid "" ++"Enter a VoIP provider to use for call-back in the format username@some.host." ++"name, as listed in \"Outgoing Calls\" above. It's easiest to copy and paste " ++"the providers from above. Invalid entries, including providers not enabled " ++"for outgoing calls, will be rejected silently." ++msgstr "" ++ ++msgid "" ++"Enter phone numbers that you want to decline calls from automatically. You " ++"should probably omit the country code and any leading zeroes, but please " ++"experiment to make sure you are blocking numbers from your desired area " ++"successfully." ++msgstr "" ++"打入你å…許自動通話的號碼. 你或許å¯ä»¥å¿½ç•¥åœ‹ç¢¼å’Œ0å­—é–‹é ­, 但僅供實驗以確ä¿æœŸæœ›å€" ++"的號碼被阻斷æˆåŠŸ." ++ ++msgid "" ++"Enter this IP (or IP:port) in the Server/Registrar setting of SIP devices " ++"you will use ONLY locally and never from a remote location." ++msgstr "" ++"è¦è¨­å®šSIP設備在Server/Registrar內打入IP(或IP:埠號)你僅能本地端使用絕ä¸è¦æ‰“å…¥" ++"é ç«¯ä½ç½®" ++ ++msgid "" ++"Enter this hostname (or hostname:port) in the Server/Registrar setting of " ++"SIP devices you will use from a remote location (they will work locally too)." ++msgstr "" ++"è¦è¨­å®šSIP設備從é ç«¯ä½¿ç”¨(在本地端也一樣能執行),在Server/Registrar內打入主機å" ++"稱(或主機å稱:埠號)" ++ ++msgid "External SIP Port" ++msgstr "外部SIP埠號" ++ ++msgid "" ++"For each provider enabled for incoming calls, here you can restrict which " ++"users to ring on incoming calls. If the list is empty, the system will " ++"indicate that all users enabled for incoming calls will ring. Invalid " ++"usernames will be rejected silently. Also, entering a username here " ++"overrides the user's setting to not receive incoming calls. This way, you " ++"can make certain users ring only for specific providers. Entries can be made " ++"in a space-separated list, and/or one per line by hitting enter after every " ++"one." ++msgstr "" ++ ++msgid "" ++"For each user enabled for outgoing calls you can restrict what providers the " ++"user can use for outgoing calls. By default all users can use all providers. " ++"To show up in the list below the user should be allowed to make outgoing " ++"calls in the \"User Accounts\" page. Enter VoIP providers in the format " ++"username@some.host.name, as listed in \"Outgoing Calls\" above. It's easiest " ++"to copy and paste the providers from above. Invalid entries, including " ++"providers not enabled for outgoing calls, will be rejected silently. Entries " ++"can be made in a space-separated list, and/or one per line by hitting enter " ++"after every one." ++msgstr "" ++ ++msgid "Full Name" ++msgstr "å…¨å" ++ ++msgid "General Settings" ++msgstr "一般設定" ++ ++msgid "Google Accounts" ++msgstr "Google帳戶" ++ ++msgid "Google Talk Status" ++msgstr "Google Talk狀態" ++ ++msgid "Google Talk Status Message" ++msgstr "Google Talk訊æ¯ç‹€æ…‹" ++ ++msgid "Google Voice/Talk Accounts" ++msgstr "Google 語音/簡訊帳戶" ++ ++msgid "Hang-up Delay" ++msgstr "" ++ ++msgid "" ++"Here you must configure at least one SIP account, that you will use to " ++"register with this service. Use this account either in an Analog Telephony " ++"Adapter (ATA), or in a SIP software like CSipSimple, Linphone, or Sipdroid " ++"on your smartphone, or Ekiga, Linphone, or X-Lite on your computer. By " ++"default, all SIP accounts will ring simultaneously if a call is made to one " ++"of your VoIP provider accounts or GV numbers." ++msgstr "" ++ ++msgid "" ++"How long to wait before hanging up. If the provider you use to dial " ++"automatically forwards to voicemail, you can set this value to a delay that " ++"will allow you to hang up before your call gets forwarded and you get billed " ++"for it." ++msgstr "" ++ ++msgid "" ++"If setting Server/Registrar to %s or %s does not work for you, try setting " ++"it to %s or %s and entering this port number in a separate field that " ++"specifies the Server/Registrar port number. Beware that some devices have a " ++"confusing setting that sets the port where SIP requests originate from on " ++"the SIP device itself (the bind port). The port specified on this page is " ++"NOT this bind port but the port this service listens on." ++msgstr "" ++ ++msgid "" ++"If you experience jittery or high latency audio during heavy downloads, you " ++"may want to enable QoS. QoS prioritizes traffic to and from your network for " ++"specified ports and IP addresses, resulting in better latency and throughput " ++"for sound in our case. If enabled below, a QoS rule for this service will be " ++"configured by the PBX automatically, but you must visit the QoS " ++"configuration page (Network->QoS) to configure other critical QoS settings " ++"like Download and Upload speed." ++msgstr "" ++ ++msgid "" ++"If you have more than one account that can make outgoing calls, you should " ++"enter a list of phone numbers and/or prefixes in the following fields for " ++"each provider listed. Invalid prefixes are removed silently, and only 0-9, " ++"X, Z, N, #, *, and + are valid characters. The letter X matches 0-9, Z " ++"matches 1-9, and N matches 2-9. For example to make calls to Germany through " ++"a provider, you can enter 49. To make calls to North America, you can enter " ++"1NXXNXXXXXX. If one of your providers can make \"local\" calls to an area " ++"code like New York's 646, you can enter 646NXXXXXX for that provider. You " ++"should leave one account with an empty list to make calls with it by " ++"default, if no other provider's prefixes match. The system will " ++"automatically replace an empty list with a message that the provider dials " ++"all numbers not matched by another provider's prefixes. Be as specific as " ++"possible (i.e. 1NXXNXXXXXX is better than 1). Please note all international " ++"dial codes are discarded (e.g. 00, 011, 010, 0011). Entries can be made in a " ++"space-separated list, and/or one per line by hitting enter after every one." ++msgstr "" ++ ++msgid "Incoming Calls" ++msgstr "來電呼å«" ++ ++msgid "Insert QoS Rules" ++msgstr "æ’å…¥QoSè¦å‰‡" ++ ++msgid "Makes Outgoing Calls" ++msgstr "開啟外撥" ++ ++msgid "NOTE: There are no Google or SIP provider accounts configured." ++msgstr "注æ„:尚缺Google或者SIPæ供者帳戶被設置" ++ ++msgid "" ++"NOTE: There are no Google or SIP provider accounts enabled for incoming " ++"calls." ++msgstr "注æ„:尚缺Google或者SIP供應商帳戶被啟用æ‰èƒ½æŽ¥æ”¶ä¾†é›»å‘¼å«" ++ ++msgid "" ++"NOTE: There are no Google or SIP provider accounts enabled for outgoing " ++"calls." ++msgstr "注æ„:尚缺Google或者SIP供應商帳戶被啟用æ‰èƒ½å¤–æ’¥." ++ ++msgid "NOTE: There are no local user accounts configured." ++msgstr "注æ„:尚未設置本地端帳戶" ++ ++msgid "NOTE: There are no local user accounts enabled for outgoing calls." ++msgstr "注æ„:啟用本地端帳戶æ‰èƒ½å¤–æ’¥" ++ ++msgid "No" ++msgstr "ä¸" ++ ++msgid "Number of Seconds to Ring" ++msgstr "響鈴秒數" ++ ++msgid "Outbound Proxy" ++msgstr "外連代ç†" ++ ++msgid "Outgoing Calls" ++msgstr "去電外撥" ++ ++msgid "PBX Main Page" ++msgstr "PBX總機主é " ++ ++msgid "PBX Service Status" ++msgstr "PBXæœå‹™ç‹€æ…‹" ++ ++msgid "PIN" ++msgstr "PIN碼" ++ ++msgid "Password" ++msgstr "密碼" ++ ++msgid "" ++"Pick a random port number between 6500 and 9500 for the service to listen " ++"on. Do not pick the standard 5060, because it is often subject to brute-" ++"force attacks. When finished, (1) click \"Save and Apply\", and (2) look in " ++"the \"SIP Device/Softphone Accounts\" section for updated Server and Port " ++"settings for your SIP Devices/Softphones." ++msgstr "" ++ ++msgid "Port Setting for SIP Devices" ++msgstr "SIP設備的埠號設置" ++ ++msgid "Providers Used for Outgoing Calls" ++msgstr "已採用的外撥供應商" ++ ++msgid "QoS Settings" ++msgstr "QoS語音å“質設置" ++ ++msgid "RTP Port Range End" ++msgstr "RTPå”定埠域çµæŸ" ++ ++msgid "RTP Port Range Start" ++msgstr "RTPå”定埠域啟始" ++ ++msgid "" ++"RTP traffic carries actual voice packets. This is the start of the port " ++"range that will be used for setting up RTP communication. It's usually OK to " ++"leave this at the default value." ++msgstr "" ++ ++msgid "Receives Incoming Calls" ++msgstr "接å—來電呼å«" ++ ++msgid "Remote Usage" ++msgstr "é ç«¯å•Ÿç”¨" ++ ++msgid "Rings users enabled for incoming calls" ++msgstr "來電呼å«æ™‚震鈴通知使用者" ++ ++msgid "SIP Accounts" ++msgstr "SIP帳戶" ++ ++msgid "SIP Device/Softphone Accounts" ++msgstr "SIP設備/軟體å¼æ‰‹æ©Ÿå¸³æˆ¶" ++ ++msgid "SIP Provider Accounts" ++msgstr "SIP供應商帳戶" ++ ++msgid "SIP Realm (needed by some providers)" ++msgstr "SIP領域(æŸäº›ä¾›æ‡‰å•†éœ€ç”¨åˆ°)" ++ ++msgid "SIP Server/Registrar" ++msgstr "SIP伺æœå™¨/登記處" ++ ++msgid "SIP Server/Registrar Port" ++msgstr "SIP伺æœå™¨/登記埠" ++ ++msgid "Server Setting" ++msgstr "伺æœå™¨è¨­ç½®" ++ ++msgid "Server Setting for Local SIP Devices" ++msgstr "本地SIP設備的伺æœå™¨è¨­ç½®" ++ ++msgid "Server Setting for Remote SIP Devices" ++msgstr "é ç«¯SIP設備的伺æœå™¨è¨­ç½®" ++ ++msgid "Service Status" ++msgstr "æœå‹™ç‹€æ…‹" ++ ++msgid "" ++"Set the number of seconds to ring users upon incoming calls before hanging " ++"up or going to voicemail, if the voicemail is installed and enabled." ++msgstr "" ++ ++msgid "Space-Separated List of Blacklisted Numbers" ++msgstr "以空格分隔的黑å單號碼列表" ++ ++msgid "Specify numbers individually here. Press enter to add more numbers." ++msgstr "在此指定ç¨ç«‹è™Ÿç¢¼. 按enter å¯æ–°å¢žæ›´å¤šè™Ÿç¢¼" ++ ++msgid "" ++"Specify numbers individually here. Press enter to add more numbers. You will " ++"have to experiment with what country and area codes you need to add to the " ++"number." ++msgstr "" ++ ++msgid "" ++"The number(s) specified above will be able to dial out with this user's " ++"providers. Invalid usernames, including users not enabled for outgoing " ++"calls, are dropped silently. Please verify that the entry was accepted." ++msgstr "" ++ ++msgid "" ++"This configuration page allows you to configure a phone system (PBX) service " ++"which permits making phone calls through multiple Google and SIP (like " ++"Sipgate, SipSorcery, and Betamax) accounts and sharing them among many SIP " ++"devices. Note that Google accounts, SIP accounts, and local user accounts " ++"are configured in the \"Google Accounts\", \"SIP Accounts\", and \"User " ++"Accounts\" sub-sections. You must add at least one User Account to this PBX, " ++"and then configure a SIP device or softphone to use the account, in order to " ++"make and receive calls with your Google/SIP accounts. Configuring multiple " ++"users will allow you to make free calls between all users, and share the " ++"configured Google and SIP accounts. If you have more than one Google and SIP " ++"accounts set up, you should probably configure how calls to and from them " ++"are routed in the \"Call Routing\" page. If you're interested in using your " ++"own PBX from anywhere in the world, then visit the \"Remote Usage\" section " ++"in the \"Advanced Settings\" page." ++msgstr "" ++ ++msgid "" ++"This is the name that the VoIP server will use to identify itself when " ++"registering to VoIP (SIP) providers. Some providers require this to a " ++"specific string matching a hardware SIP device." ++msgstr "" ++ ++msgid "" ++"This is where you indicate which Google/SIP accounts are used to call what " ++"country/area codes, which users can use what SIP/Google accounts, how " ++"incoming calls are routed, what numbers can get into this PBX with a " ++"password, and what numbers are blacklisted." ++msgstr "" ++ ++msgid "" ++"This is where you set up your Google (Talk and Voice) Accounts, in order to " ++"start using them for dialing and receiving calls (voice chat and real phone " ++"calls). Please make at least one voice call using the Google Talk plugin " ++"installable through the GMail interface, and then log out from your account " ++"everywhere. Click \"Add\" to add as many accounts as you wish." ++msgstr "" ++ ++msgid "" ++"This is where you set up your SIP (VoIP) accounts ts like Sipgate, " ++"SipSorcery, the popular Betamax providers, and any other providers with SIP " ++"settings in order to start using them for dialing and receiving calls (SIP " ++"uri and real phone calls). Click \"Add\" to add as many accounts as you wish." ++msgstr "" ++ ++msgid "" ++"This option should be set to \"Yes\" if you have a DID (real telephone " ++"number) associated with this SIP account or want to receive SIP uri calls " ++"through this provider." ++msgstr "" ++ ++msgid "" ++"This section contains settings that do not need to be changed under normal " ++"circumstances. In addition, here you can configure your system for use with " ++"remote SIP devices, and resolve call quality issues by enabling the " ++"insertion of QoS rules." ++msgstr "" ++ ++msgid "" ++"Use (four to five digit) numeric user name if you are connecting normal " ++"telephones with ATAs to this system (so they can dial user names)." ++msgstr "" ++ ++msgid "" ++"Use this account to make outgoing calls as configured in the \"Call Routing" ++"\" section." ++msgstr "" ++ ++msgid "Use this account to make outgoing calls." ++msgstr "使用這個帳號外撥." ++ ++msgid "User Accounts" ++msgstr "使用者帳號" ++ ++msgid "User Agent String" ++msgstr "用戶代ç†å­—串" ++ ++msgid "User Name" ++msgstr "用戶å稱" ++ ++msgid "Uses providers enabled for outgoing calls" ++msgstr "採用供應商啟用以便外撥" ++ ++msgid "" ++"When somebody starts voice chat with your GTalk account or calls the GVoice, " ++"number (if you have Google Voice), the call will be forwarded to any users " ++"that are online (registered using a SIP device or softphone) and permitted " ++"to receive the call. If you have Google Voice, you must go to your GVoice " ++"settings and forward calls to Google chat in order to actually receive calls " ++"made to your GVoice number. If you have trouble receiving calls from GVoice, " ++"experiment with the Call Screening option in your GVoice Settings. Finally, " ++"make sure no other client is online with this account (browser in gmail, " ++"mobile/desktop Google Talk App) as it may interfere." ++msgstr "" ++ ++msgid "" ++"When your password is saved, it disappears from this field and is not " ++"displayed for your protection. The previously saved password will be changed " ++"only when you enter a value different from the saved one." ++msgstr "" ++ ++msgid "Yes" ++msgstr "是" ++ ++msgid "" ++"You can enter your domain name, external IP address, or dynamic domain name " ++"here. The best thing to input is a static IP address. If your IP address is " ++"dynamic and it changes, your configuration will become invalid. Hence, it's " ++"recommended to set up Dynamic DNS in this case. and enter your Dynamic DNS " ++"hostname here. You can configure Dynamic DNS with the luci-app-ddns package." ++msgstr "" ++ ++msgid "You can specify a real name to show up in the Caller ID here." ++msgstr "ä½ å¯ä»¥åœ¨æ­¤æŒ‡å®šä¸€å€‹çœŸå¯¦å稱以便顯示在來電ID" ++ ++msgid "" ++"You can use your SIP devices/softphones with this system from a remote " ++"location as well, as long as your Internet Service Provider gives you a " ++"public IP. You will be able to call other local users for free (e.g. other " ++"Analog Telephone Adapters (ATAs)) and use your VoIP providers to make calls " ++"as if you were local to the PBX. After configuring this tab, go back to " ++"where users are configured and see the new Server and Port setting you need " ++"to configure the remote SIP devices with. Please note that if this PBX is " ++"not running on your router/gateway, you will need to configure port " ++"forwarding (NAT) on your router/gateway. Please forward the ports below (SIP " ++"port and RTP range) to the IP address of the device running this PBX." ++msgstr "" ++"ä¸ç®¡å¤šé ,åªè¦èƒ½å–å¾—ISPæ供的公眾åˆæ³•IP,ä¾ç„¶å¯ä»¥ä½¿ç”¨é€™å€‹ç³»çµ±çš„SIP設備/PC電話表" ++"ç¾ä¸€æ¨£çš„好.你將能夠å…費呼å«å…¶ä»–本地端用戶(e.g 其它類比電話機(ATAs)和使用你的" ++"VoIP供應商講電話就åƒä½ åœ¨ä½¿ç”¨æœ¬åœ°çš„PBX總機電話一樣.在設定這個標籤後, 需回到用" ++"戶設定並且查看新的伺æœå™¨å’ŒåŸ è¨­å®šä»¥ä¾¿èƒ½è¨­å®šé ç«¯SIP設備.請注æ„å‡å¦‚PBX總機若ä¸åœ¨" ++"你的路由器/GW上執行,你將必須在你的路由器/GW上設定埠轉發(NAT).在PBX主機上請轉" ++"發下列(SIP埠+RTP所採用的範åœåŸ )埠號å€å®šåˆ°è·‘PBXæœå‹™è¨­å‚™ä¸Šçš„IPä½å€." ++ ++msgid "" ++"Your PIN disappears when saved for your protection. It will be changed only " ++"when you enter a value different from the saved one. Leaving the PIN empty " ++"is possible, but please beware of the security implications." ++msgstr "" ++"當存檔時為ä¿è­·èµ·è¦‹ä½ çš„PIN碼將ä¸æœƒé¡¯ç¤º. 除éžä½ æ‰“å…¥ä¸åŒæ–¼åŽŸå§‹å­˜æª”的值它æ‰æœƒè®Š" ++"æ›´. 也å¯ä»¥æŠŠPIN碼ä¿ç•™ç©ºç™½, 但è¦æ防會有安全的隱憂." ++ ++msgid "" ++"Your password disappears when saved for your protection. It will be changed " ++"only when you enter a value different from the saved one." ++msgstr "" ++"當存檔時為ä¿è­·èµ·è¦‹ä½ çš„密碼將ä¸æœƒé¡¯ç¤º. 除éžä½ æ‰“å…¥ä¸åŒæ–¼åŽŸå§‹å­˜æª”的值它æ‰æœƒè®Šæ›´." ++ ++#~ msgid "" ++#~ "Designate numbers that are allowed to call through this system and which " ++#~ "user's privileges it will have." ++#~ msgstr "ä¾æ“šç³»çµ±å’Œæˆ¶ç”¨çš„權é™å…許通話的指定號碼" +diff --git a/feeds/luci/applications/luci-app-pbx/root/etc/config/pbx b/feeds/luci/applications/luci-app-pbx/root/etc/config/pbx +new file mode 100644 +index 0000000..ca7c166 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-pbx/root/etc/config/pbx +@@ -0,0 +1 @@ ++config 'main' 'connection_status' +diff --git a/feeds/luci/applications/luci-app-pbx/root/etc/config/pbx-advanced b/feeds/luci/applications/luci-app-pbx/root/etc/config/pbx-advanced +new file mode 100644 +index 0000000..39da6f8 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-pbx/root/etc/config/pbx-advanced +@@ -0,0 +1,5 @@ ++config 'settings' 'advanced' ++ option 'useragent' 'PBX' ++ option 'ringtime' '30' ++ option 'rtpstart' '19850' ++ option 'rtpend' '19900' +diff --git a/feeds/luci/applications/luci-app-pbx/root/etc/config/pbx-calls b/feeds/luci/applications/luci-app-pbx/root/etc/config/pbx-calls +new file mode 100644 +index 0000000..822bd4a +--- /dev/null ++++ b/feeds/luci/applications/luci-app-pbx/root/etc/config/pbx-calls +@@ -0,0 +1,7 @@ ++config 'call_routing' 'outgoing_calls' ++ ++config 'call_routing' 'incoming_calls' ++ ++config 'call_routing' 'providers_user_can_use' ++ ++config 'call_routing' 'blacklisting' +diff --git a/feeds/luci/applications/luci-app-pbx/root/etc/config/pbx-google b/feeds/luci/applications/luci-app-pbx/root/etc/config/pbx-google +new file mode 100644 +index 0000000..e69de29 +diff --git a/feeds/luci/applications/luci-app-pbx/root/etc/config/pbx-users b/feeds/luci/applications/luci-app-pbx/root/etc/config/pbx-users +new file mode 100644 +index 0000000..a4277b1 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-pbx/root/etc/config/pbx-users +@@ -0,0 +1 @@ ++config 'user' 'server' +diff --git a/feeds/luci/applications/luci-app-pbx/root/etc/config/pbx-voip b/feeds/luci/applications/luci-app-pbx/root/etc/config/pbx-voip +new file mode 100644 +index 0000000..e69de29 +diff --git a/feeds/luci/applications/luci-app-pbx/root/etc/init.d/pbx-asterisk b/feeds/luci/applications/luci-app-pbx/root/etc/init.d/pbx-asterisk +new file mode 100755 +index 0000000..e05ae11 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-pbx/root/etc/init.d/pbx-asterisk +@@ -0,0 +1,837 @@ ++#!/bin/sh /etc/rc.common ++# ++# Copyright 2011 Iordan Iordanov ++# ++# This file is part of luci-pbx. ++# ++# luci-pbx is free software: you can redistribute it and/or modify ++# it under the terms of the GNU General Public License as published by ++# the Free Software Foundation, either version 3 of the License, or ++# (at your option) any later version. ++# ++# luci-pbx is distributed in the hope that it will be useful, ++# but WITHOUT ANY WARRANTY; without even the implied warranty of ++# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++# GNU General Public License for more details. ++# ++# You should have received a copy of the GNU General Public License ++# along with luci-pbx. If not, see . ++ ++. /lib/functions.sh ++ ++START=60 ++ ++# Some global variables ++MODULENAME=pbx ++USERAGENT="PBX" ++HANGUPCNTXT=hangup-call-context ++GTALKUNVL=unavailable ++ ++ASTUSER=nobody ++ASTGROUP=nogroup ++ASTDIRSRECURSIVE="/var/run/asterisk /var/log/asterisk /var/spool/asterisk" ++ASTDIRS="/usr/lib/asterisk" ++ASTSOUNDSDIR="/usr/lib/asterisk/sounds" ++ ++TEMPLATEDIR=/etc/${MODULENAME}-asterisk ++PBXSOUNDSDIR=$TEMPLATEDIR/sounds ++VMTEMPLATEDIR=/etc/${MODULENAME}-voicemail ++VMSOUNDSDIR=$VMTEMPLATEDIR/sounds ++ASTERISKDIR=/etc/asterisk ++WORKDIR=/tmp/$MODULENAME.$$ ++MD5SUMSFILE=/tmp/$MODULENAME-sums.$$ ++ ++TMPL_ASTERISK=$TEMPLATEDIR/asterisk.conf.TEMPLATE ++TMPL_GTALK=$TEMPLATEDIR/gtalk.conf.TEMPLATE ++TMPL_INDICATIONS=$TEMPLATEDIR/indications.conf.TEMPLATE ++TMPL_LOGGER=$TEMPLATEDIR/logger.conf.TEMPLATE ++TMPL_MANAGER=$TEMPLATEDIR/manager.conf.TEMPLATE ++TMPL_MODULES=$TEMPLATEDIR/modules.conf.TEMPLATE ++TMPL_RTP=$TEMPLATEDIR/rtp.conf.TEMPLATE ++ ++TMPL_EXTCTHRUCHECKHDR=$TEMPLATEDIR/extensions_disa-check_header.conf.TEMPLATE ++TMPL_EXTCTHRUCHECK=$TEMPLATEDIR/extensions_disa-check.conf.TEMPLATE ++TMPL_EXTCTHRUCHECKFTR=$TEMPLATEDIR/extensions_disa-check_footer.conf.TEMPLATE ++TMPL_EXTCTHRUHDR=$TEMPLATEDIR/extensions_disa_header.conf.TEMPLATE ++TMPL_EXTCTHRU=$TEMPLATEDIR/extensions_disa.conf.TEMPLATE ++TMPL_EXTCTHRUNOPIN=$TEMPLATEDIR/extensions_disa-nopin.conf.TEMPLATE ++ ++TMPL_EXTCBACKCHECKHDR=$TEMPLATEDIR/extensions_callback-check_header.conf.TEMPLATE ++TMPL_EXTCBACKCHECK=$TEMPLATEDIR/extensions_callback-check.conf.TEMPLATE ++TMPL_EXTCBACKCHECKFTR=$TEMPLATEDIR/extensions_callback-check_footer.conf.TEMPLATE ++TMPL_EXTCBACKHDR=$TEMPLATEDIR/extensions_callback_header.conf.TEMPLATE ++TMPL_EXTCBACKSIP=$TEMPLATEDIR/extensions_callback_sip.conf.TEMPLATE ++TMPL_EXTCBACKGTALK=$TEMPLATEDIR/extensions_callback_gtalk.conf.TEMPLATE ++ ++TMPL_EXTENSIONS=$TEMPLATEDIR/extensions.conf.TEMPLATE ++ ++TMPL_EXTVMDISABLED=$TEMPLATEDIR/extensions_voicemail_disabled.conf.TEMPLATE ++TMPL_EXTVMENABLED=$TEMPLATEDIR/extensions_voicemail_enabled.conf.TEMPLATE ++ ++TMPL_EXTBLKLIST=$TEMPLATEDIR/extensions_blacklist.conf.TEMPLATE ++TMPL_EXTBLKLISTFTR=$TEMPLATEDIR/extensions_blacklist_footer.conf.TEMPLATE ++TMPL_EXTBLKLISTHDR=$TEMPLATEDIR/extensions_blacklist_header.conf.TEMPLATE ++ ++TMPL_EXTDEFAULT=$TEMPLATEDIR/extensions_default.conf.TEMPLATE ++TMPL_EXTDEFAULTUSER=$TEMPLATEDIR/extensions_default_user.conf.TEMPLATE ++ ++TMPL_EXTINCNTXTSIP=$TEMPLATEDIR/extensions_incoming_context_sip.conf.TEMPLATE ++TMPL_EXTINCNTXTGTALKHDR=$TEMPLATEDIR/extensions_incoming_context_gtalk_header.conf.TEMPLATE ++TMPL_EXTINCNTXTGTALK=$TEMPLATEDIR/extensions_incoming_context_gtalk.conf.TEMPLATE ++ ++TMPL_EXTUSERCNTXT=$TEMPLATEDIR/extensions_user_context.conf.TEMPLATE ++TMPL_EXTUSERCNTXTFTR=$TEMPLATEDIR/extensions_user_context_footer.conf.TEMPLATE ++TMPL_EXTUSERCNTXTHDR=$TEMPLATEDIR/extensions_user_context_header.conf.TEMPLATE ++ ++TMPL_EXTOUTHDR=$TEMPLATEDIR/extensions_default_outgoing_header.conf.TEMPLATE ++TMPL_EXTOUTGTALK=$TEMPLATEDIR/extensions_outgoing_gtalk.conf.TEMPLATE ++TMPL_EXTOUTLOCAL=$TEMPLATEDIR/extensions_outgoing_dial_local_user.conf.TEMPLATE ++TMPL_EXTOUTSIP=$TEMPLATEDIR/extensions_outgoing_sip.conf.TEMPLATE ++ ++TMPL_JABBER=$TEMPLATEDIR/jabber.conf.TEMPLATE ++TMPL_JABBERUSER=$TEMPLATEDIR/jabber_users.conf.TEMPLATE ++TMPL_SIP=$TEMPLATEDIR/sip.conf.TEMPLATE ++TMPL_SIPPEER=$TEMPLATEDIR/sip_peer.TEMPLATE ++TMPL_SIPREG=$TEMPLATEDIR/sip_registration.TEMPLATE ++TMPL_SIPUSR=$TEMPLATEDIR/sip_user.TEMPLATE ++ ++TMPL_MSMTPDEFAULT=$VMTEMPLATEDIR/pbx-msmtprc-defaults.TEMPLATE ++TMPL_MSMTPACCOUNT=$VMTEMPLATEDIR/pbx-msmtprc-account.TEMPLATE ++TMPL_MSMTPAUTH=$VMTEMPLATEDIR/pbx-msmtprc-account-auth.TEMPLATE ++TMPL_MSMTPACCTDFLT=$VMTEMPLATEDIR/pbx-msmtprc-account-default.TEMPLATE ++ ++ ++INCLUDED_FILES="$WORKDIR/extensions_blacklist.conf $WORKDIR/extensions_callthrough.conf\ ++ $WORKDIR/extensions_incoming.conf $WORKDIR/extensions_incoming_gtalk.conf\ ++ $WORKDIR/extensions_user.conf $WORKDIR/jabber_users.conf\ ++ $WORKDIR/sip_peers.conf $WORKDIR/sip_registrations.conf\ ++ $WORKDIR/sip_users.conf $WORKDIR/extensions_voicemail.conf\ ++ $WORKDIR/extensions_default.conf" ++ ++ ++# In this string, we concatenate all local users enabled to receive calls ++# readily formatted for the Dial command. ++localusers_to_ring="" ++ ++# In this string, we keep a list of all users that are enabled for outgoing ++# calls. It is used at the end to create the user contexts. ++localusers_can_dial="" ++ ++# In this string, we put together a space-separated list of provider names ++# (alphanumeric, with all non-alpha characters replaced with underscores), ++# which will be used to dial out by default (whose outgoing contexts will ++# be included in users' contexts by default. ++outbound_providers="" ++sip_outbound_providers="" ++gtalk_outbound_providers="" ++ ++# Function which escapes non-alpha-numeric characters in a string ++escape_non_alpha() { ++ echo $@ | sed 's/\([^a-zA-Z0-9]\)/\\\1/g' ++} ++ ++# Function which replaces non-alpha-numeric characters with an underscore ++sub_underscore_for_non_alpha() { ++ echo $@ | sed 's/[^a-zA-Z0-9]/_/g' ++} ++ ++# Copies the template files which we don't edit. ++copy_unedited_templates_over() ++{ ++ cp $TMPL_ASTERISK $WORKDIR/asterisk.conf ++ cp $TMPL_GTALK $WORKDIR/gtalk.conf ++ cp $TMPL_INDICATIONS $WORKDIR/indications.conf ++ cp $TMPL_LOGGER $WORKDIR/logger.conf ++ cp $TMPL_MANAGER $WORKDIR/manager.conf ++ cp $TMPL_MODULES $WORKDIR/modules.conf ++ # If this file isn't present at this stage, voicemail is disabled. ++ [ ! -f $WORKDIR/extensions_voicemail.conf ] && \ ++ cp $TMPL_EXTVMDISABLED $WORKDIR/extensions_voicemail.conf ++} ++ ++# Touches all the included files, to prevent asterisk from refusing to ++# start if a config item is missing and an included config file isn't created. ++create_included_files() ++{ ++ touch $INCLUDED_FILES ++} ++ ++# Puts together all the extensions.conf related configuration. ++pbx_create_extensions_config() ++{ ++ local ringtime ++ config_get ringtime advanced ringtime ++ ++ sed "s/|RINGTIME|/$ringtime/" $TMPL_EXTENSIONS > $WORKDIR/extensions.conf ++ mv $WORKDIR/inext.TMP $WORKDIR/extensions_incoming.conf ++ cp $TMPL_EXTINCNTXTGTALKHDR $WORKDIR/extensions_incoming_gtalk.conf ++ cat $WORKDIR/outextgtalk.TMP >> $WORKDIR/extensions_incoming_gtalk.conf 2>/dev/null ++ rm -f $WORKDIR/outextgtalk.TMP ++ mv $WORKDIR/blacklist.TMP $WORKDIR/extensions_blacklist.conf ++ mv $WORKDIR/userext.TMP $WORKDIR/extensions_user.conf ++ ++ cp $TMPL_EXTCTHRUHDR $WORKDIR/extensions_callthrough.conf ++ cat $WORKDIR/callthrough.TMP >> $WORKDIR/extensions_callthrough.conf 2>/dev/null ++ rm -f $WORKDIR/callthrough.TMP ++ cat $TMPL_EXTCTHRUCHECKHDR >> $WORKDIR/extensions_callthrough.conf 2>/dev/null ++ cat $WORKDIR/callthroughcheck.TMP >> $WORKDIR/extensions_callthrough.conf 2>/dev/null ++ rm -f $WORKDIR/callthroughcheck.TMP ++ cat $TMPL_EXTCTHRUCHECKFTR >> $WORKDIR/extensions_callthrough.conf 2>/dev/null ++ ++ cp $TMPL_EXTCBACKHDR $WORKDIR/extensions_callback.conf ++ cat $WORKDIR/callback.TMP >> $WORKDIR/extensions_callback.conf 2>/dev/null ++ rm -f $WORKDIR/callback.TMP ++ cat $TMPL_EXTCBACKCHECKHDR >> $WORKDIR/extensions_callback.conf 2>/dev/null ++ cat $WORKDIR/callbackcheck.TMP >> $WORKDIR/extensions_callback.conf 2>/dev/null ++ rm -f $WORKDIR/callbackcheck.TMP ++ cat $TMPL_EXTCBACKCHECKFTR >> $WORKDIR/extensions_callback.conf 2>/dev/null ++ ++ rm -f $WORKDIR/outext-*.TMP ++ rm -f $WORKDIR/localext.TMP ++ sed "s/|LOCALUSERS|/$localusers_to_ring/g" $TMPL_EXTDEFAULT \ ++ > $WORKDIR/extensions_default.conf ++ cat $WORKDIR/inextuser.TMP >> $WORKDIR/extensions_default.conf ++ rm -f $WORKDIR/inextuser.TMP ++} ++ ++# Puts together all the sip.conf related configuration. ++pbx_create_sip_config() ++{ ++ mv $WORKDIR/sip_regs.TMP $WORKDIR/sip_registrations.conf ++ mv $WORKDIR/sip_peers.TMP $WORKDIR/sip_peers.conf ++ mv $WORKDIR/sip_users.TMP $WORKDIR/sip_users.conf ++} ++ ++# Creates the jabber.conf related config ++pbx_create_jabber_config() ++{ ++ cp $TMPL_JABBER $WORKDIR/jabber.conf ++ mv $WORKDIR/jabber.TMP $WORKDIR/jabber_users.conf ++} ++ ++# Gets rid of any config files from $ASTERISKDIR not found in $WORKDIR. ++clean_up_asterisk_config_dir() ++{ ++ for f in $ASTERISKDIR/* ; do ++ basef="`basename $f`" ++ if [ ! -e "$WORKDIR/$basef" ] ; then ++ rm -rf "$f" ++ fi ++ done ++} ++ ++# Compares md5sums of the config files in $WORKDIR to those ++# in $ASTERISKDIR, and copies only changed files over to reduce ++# wear on flash in embedded devices. ++compare_configs_and_copy_changed() ++{ ++ # First, compute md5sums of the config files in $WORKDIR. ++ cd $WORKDIR/ ++ md5sum * > $MD5SUMSFILE ++ ++ # Now, check the files in $ASTERISKDIR against the md5sums. ++ cd $ASTERISKDIR/ ++ changed_files="`md5sum -c $MD5SUMSFILE 2>/dev/null | fgrep ": FAILED" | awk -F: '{print $1}'`" ++ ++ rm -f $MD5SUMSFILE ++ ++ [ -z "$changed_files" ] && return ++ ++ # Now copy over the changed files. ++ for f in $changed_files ; do ++ cp "$WORKDIR/$f" "$ASTERISKDIR/$f" ++ done ++} ++ ++# Calls the functions that create the final config files ++# Calls the function which compares which files have changed ++# Puts the final touches on $ASTERISKDIR ++# Gets rid of $WORKDIR ++pbx_assemble_and_copy_config() ++{ ++ mkdir -p $ASTERISKDIR ++ ++ copy_unedited_templates_over ++ create_included_files ++ pbx_create_extensions_config ++ pbx_create_sip_config ++ pbx_create_jabber_config ++ ++ touch $WORKDIR/features.conf ++ ++ # At this point, $WORKDIR should contain a complete, working config. ++ clean_up_asterisk_config_dir ++ ++ compare_configs_and_copy_changed ++ ++ [ ! -d $ASTERISKDIR/manager.d ] && mkdir -p $ASTERISKDIR/manager.d/ ++ ++ # Get rid of the working directory ++ rm -rf $WORKDIR/ ++} ++ ++# Creates configuration for a user and adds it to the temporary file that holds ++# all users configured so far. ++pbx_add_user() ++{ ++ local fullname ++ local defaultuser ++ local rawdefaultuser ++ local secret ++ local ring ++ local can_call ++ ++ config_get fullname $1 fullname ++ fullname=`escape_non_alpha $fullname` ++ config_get rawdefaultuser $1 defaultuser ++ defaultuser=`escape_non_alpha $rawdefaultuser` ++ config_get secret $1 secret ++ secret=`escape_non_alpha $secret` ++ config_get ring $1 ring ++ config_get can_call $1 can_call ++ ++ [ -z "$defaultuser" -o -z "$secret" ] && return ++ [ -z "$fullname" ] && fullname="$defaultuser" ++ ++ sed "s/|DEFAULTUSER|/$defaultuser/g" $TMPL_SIPUSR > $WORKDIR/sip_user.tmp ++ ++ if [ "$can_call" = "yes" ] ; then ++ # Add user to list of all users that are allowed to make calls. ++ localusers_can_dial="$localusers_can_dial $rawdefaultuser" ++ sed -i "s/|CONTEXTNAME|/$defaultuser/g" $WORKDIR/sip_user.tmp ++ else ++ sed -i "s/|CONTEXTNAME|/$HANGUPCNTXT/g" $WORKDIR/sip_user.tmp ++ fi ++ ++ # Add this user's configuration to the temp file containing all user configs. ++ sed "s/|FULLNAME|/$fullname/" $WORKDIR/sip_user.tmp |\ ++ sed "s/|SECRET|/$secret/g" >> $WORKDIR/sip_users.TMP ++ ++ if [ "$ring" = "yes" ] ; then ++ if [ -z "$localusers_to_ring" ] ; then ++ localusers_to_ring="SIP\/$defaultuser" ++ else ++ localusers_to_ring="$localusers_to_ring\&SIP\/$defaultuser" ++ fi ++ fi ++ ++ # Add configuration which allows local users to call each other. ++ sed "s/|DEFAULTUSER|/$defaultuser/g" $TMPL_EXTOUTLOCAL >> $WORKDIR/localext.TMP ++ ++ # Add configuration which puts calls to users through the default ++ # context, so that blacklists and voicemail take effect for this user. ++ sed "s/|DEFAULTUSER|/$defaultuser/g" $TMPL_EXTDEFAULTUSER >> $WORKDIR/inextuser.TMP ++ ++ rm -f $WORKDIR/sip_user.tmp ++} ++ ++# Creates configuration for a Google account, and adds it to the temporary file that holds ++# all accounts configured so far. ++# Also creates the outgoing extensions which are used in users' outgoing contexts. ++pbx_add_jabber() ++{ ++ local username ++ local secret ++ local numprefix ++ local register ++ local make_outgoing_calls ++ local name ++ local users_to_ring ++ local status ++ local statusmessage ++ ++ config_get username $1 username ++ username=`escape_non_alpha $username` ++ config_get secret $1 secret ++ secret=`escape_non_alpha $secret` ++ #TODO: Is this really necessary here? Numprefix is retrieved below. ++ config_get numprefix $1 numprefix ++ config_get register $1 register ++ config_get make_outgoing_calls $1 make_outgoing_calls ++ config_get name $1 name ++ config_get status $1 status ++ status=`escape_non_alpha $status` ++ config_get statusmessage $1 statusmessage ++ statusmessage=`escape_non_alpha $statusmessage` ++ ++ [ -z "$username" -o -z "$secret" ] && return ++ ++ # Construct a jabber entry for this provider. ++ sed "s/|USERNAME|/$username/g" $TMPL_JABBERUSER |\ ++ sed "s/|NAME|/$name/g" > $WORKDIR/jabber.tmp ++ ++ if [ "$register" = yes ] ; then ++ # If this provider is enabled for incoming calls, we need to set the ++ # status of the user to something other than unavailable in order to receive calls. ++ sed -i "s/|STATUS|/$status/g" $WORKDIR/jabber.tmp ++ sed -i "s/|STATUSMESSAGE|/\"$statusmessage\"/g" $WORKDIR/jabber.tmp ++ ++ users_to_ring="`uci -q get ${MODULENAME}-calls.incoming_calls.$name`" ++ # If no users have been specified to ring, we ring all users enabled for incoming calls. ++ if [ -z "$users_to_ring" ] ; then ++ users_to_ring=$localusers_to_ring ++ else ++ # Else, we cook up a string formatted for the Dial command ++ # with the specified users (SIP/user1&SIP/user2&...). We do it ++ # with set, shift and a loop in order to be more tolerant of ugly whitespace ++ # messes entered by users. ++ set $users_to_ring ++ users_to_ring="SIP\/$1" && shift ++ for u in $@ ; do u=`escape_non_alpha $u` ; users_to_ring=$users_to_ring\\\&SIP\\\/$u ; done ++ fi ++ ++ # Now, we add this account to the gtalk incoming context. ++ sed "s/|USERNAME|/$username/g" $TMPL_EXTINCNTXTGTALK |\ ++ sed "s/|LOCALUSERS|/$users_to_ring/g" >> $WORKDIR/outextgtalk.TMP ++ else ++ sed -i "s/|STATUS|/$GTALKUNVL/g" $WORKDIR/jabber.tmp ++ sed -i "s/|STATUSMESSAGE|/\"\"/g" $WORKDIR/jabber.tmp ++ fi ++ ++ # Add this account's configuration to the temp file containing all account configs. ++ sed "s/|SECRET|/$secret/g" $WORKDIR/jabber.tmp >> $WORKDIR/jabber.TMP ++ ++ # If this provider is enabled for outgoing calls. ++ if [ "$make_outgoing_calls" = "yes" ] ; then ++ ++ numprefix="`uci -q get ${MODULENAME}-calls.outgoing_calls.$name`" ++ ++ # If no prefixes are specified, then we use "X" which matches any prefix. ++ [ -z "$numprefix" ] && numprefix="X" ++ ++ for p in $numprefix ; do ++ p=`escape_non_alpha $p` ++ sed "s/|NUMPREFIX|/$p/g" $TMPL_EXTOUTGTALK |\ ++ sed "s/|NAME|/$name/g" >> $WORKDIR/outext-$name.TMP ++ done ++ ++ # Add this provider to the list of enabled outbound providers. ++ if [ -z "$outbound_providers" ] ; then ++ outbound_providers="$name" ++ else ++ outbound_providers="$outbound_providers $name" ++ fi ++ ++ # Add this provider to the list of enabled gtalk outbound providers. ++ if [ -z "$gtalk_outbound_providers" ] ; then ++ gtalk_outbound_providers="$name" ++ else ++ gtalk_outbound_providers="$gtalk_outbound_providers $name" ++ fi ++ fi ++ ++ rm -f $WORKDIR/jabber.tmp ++} ++ ++# Creates configuration for a SIP provider account, and adds it to the temporary file that holds ++# all accounts configured so far. ++# Also creates the outgoing extensions which are used in users' outgoing contexts. ++pbx_add_peer() ++{ ++ local defaultuser ++ local secret ++ local host ++ local fromdomain ++ local register ++ local numprefix ++ local make_outgoing_calls ++ local name ++ local users_to_ring ++ local port ++ local outboundproxy ++ ++ config_get defaultuser $1 defaultuser ++ defaultuser=`escape_non_alpha $defaultuser` ++ config_get secret $1 secret ++ secret=`escape_non_alpha $secret` ++ config_get host $1 host ++ host=`escape_non_alpha $host` ++ config_get port $1 port ++ config_get outbountproxy $1 outboundproxy ++ outbountproxy=`escape_non_alpha $outbountproxy` ++ config_get fromdomain $1 fromdomain ++ fromdomain=`escape_non_alpha $fromdomain` ++ config_get register $1 register ++ config_get numprefix $1 numprefix ++ config_get make_outgoing_calls $1 make_outgoing_calls ++ config_get name $1 name ++ ++ [ -z "$defaultuser" -o -z "$secret" -o -z "$host" ] && return ++ [ -z "$fromdomain" ] && fromdomain=$host ++ [ -n "$port" ] && port="port=$port" ++ [ -n "$outboundproxy" ] && outboundproxy="outboundproxy=$outboundproxy" ++ ++ # Construct a sip peer entry for this provider. ++ sed "s/|DEFAULTUSER|/$defaultuser/" $TMPL_SIPPEER > $WORKDIR/sip_peer.tmp ++ sed -i "s/|NAME|/$name/" $WORKDIR/sip_peer.tmp ++ sed -i "s/|FROMUSER|/$defaultuser/" $WORKDIR/sip_peer.tmp ++ sed -i "s/|SECRET|/$secret/" $WORKDIR/sip_peer.tmp ++ sed -i "s/|HOST|/$host/" $WORKDIR/sip_peer.tmp ++ sed -i "s/|PORT|/$port/" $WORKDIR/sip_peer.tmp ++ sed -i "s/|OUTBOUNDPROXY|/$outboundproxy/" $WORKDIR/sip_peer.tmp ++ # Add this account's configuration to the temp file containing all account configs. ++ sed "s/|FROMDOMAIN|/$host/" $WORKDIR/sip_peer.tmp >> $WORKDIR/sip_peers.TMP ++ ++ # If this provider is enabled for incoming calls. ++ if [ "$register" = "yes" ] ; then ++ # Then we create a registration string for this provider. ++ sed "s/|DEFAULTUSER|/$defaultuser/g" $TMPL_SIPREG > $WORKDIR/sip_reg.tmp ++ sed -i "s/|SECRET|/$secret/g" $WORKDIR/sip_reg.tmp ++ sed "s/|NAME|/$name/g" $WORKDIR/sip_reg.tmp >> $WORKDIR/sip_regs.TMP ++ ++ users_to_ring="`uci -q get ${MODULENAME}-calls.incoming_calls.$name`" ++ # If no users have been specified to ring, we ring all users enabled for incoming calls. ++ if [ -z "$users_to_ring" ] ; then ++ users_to_ring=$localusers_to_ring ++ else ++ # Else, we cook up a string formatted for the Dial command ++ # with the specified users (SIP/user1&SIP/user2&...). We do it ++ # with set, shift and a loop in order to be more tolerant of ugly whitespace ++ # messes entered by users. ++ set $users_to_ring ++ users_to_ring="SIP\/$1" && shift ++ for u in $@ ; do users_to_ring=$users_to_ring\\\&SIP\\\/$u ; done ++ fi ++ ++ # And we create an incoming calls context for this provider. ++ sed "s/|NAME|/$name/g" $TMPL_EXTINCNTXTSIP |\ ++ sed "s/|LOCALUSERS|/$users_to_ring/g" >> $WORKDIR/inext.TMP ++ fi ++ ++ # If this provider is enabled for outgoing calls. ++ if [ "$make_outgoing_calls" = "yes" ] ; then ++ ++ numprefix="`uci -q get ${MODULENAME}-calls.outgoing_calls.$name`" ++ # If no prefixes are specified, then we use "X" which matches any prefix. ++ [ -z "$numprefix" ] && numprefix="X" ++ for p in $numprefix ; do ++ p=`escape_non_alpha $p` ++ sed "s/|NUMPREFIX|/$p/g" $TMPL_EXTOUTSIP |\ ++ sed "s/|NAME|/$name/g" >> $WORKDIR/outext-$name.TMP ++ done ++ ++ # Add this provider to the list of enabled outbound providers. ++ if [ -z "$outbound_providers" ] ; then ++ outbound_providers="$name" ++ else ++ outbound_providers="$outbound_providers $name" ++ fi ++ ++ # Add this provider to the list of enabled sip outbound providers. ++ if [ -z "$sip_outbound_providers" ] ; then ++ sip_outbound_providers="$name" ++ else ++ sip_outbound_providers="$sip_outbound_providers $name" ++ fi ++ fi ++ ++ rm -f $WORKDIR/sip_peer.tmp ++ rm -f $WORKDIR/sip_reg.tmp ++} ++ ++# For all local users enabled for outbound calls, creates a context ++# containing the extensions for Google and SIP accounts this user is ++# allowed to use. ++pbx_create_user_contexts() ++{ ++ local providers ++ ++ for u in $localusers_can_dial ; do ++ u=`escape_non_alpha $u` ++ sed "s/|DEFAULTUSER|/$u/g" $TMPL_EXTUSERCNTXTHDR >> $WORKDIR/userext.TMP ++ cat $WORKDIR/localext.TMP >> $WORKDIR/userext.TMP ++ providers="`uci -q get ${MODULENAME}-calls.providers_user_can_use.$u`" ++ [ -z "$providers" ] && providers="$outbound_providers" ++ ++ # For each provider, cat the contents of outext-$name.TMP into the user's outgoing calls extension ++ for p in $providers ; do ++ [ -f $WORKDIR/outext-$p.TMP ] && cat $WORKDIR/outext-$p.TMP >> $WORKDIR/userext.TMP ++ done ++ cat $TMPL_EXTUSERCNTXTFTR >> $WORKDIR/userext.TMP ++ done ++} ++ ++# Creates the blacklist context which hangs up on blacklisted numbers. ++pbx_add_blacklist() ++{ ++ local blacklist1 ++ local blacklist2 ++ ++ config_get blacklist1 blacklisting blacklist1 ++ config_get blacklist2 blacklisting blacklist2 ++ ++ # We create the blacklist context no matter whether the blacklist ++ # actually contains entries or not, since the PBX will send calls ++ # to the context for a check against the list anyway. ++ cp $TMPL_EXTBLKLISTHDR $WORKDIR/blacklist.TMP ++ for n in $blacklist1 $blacklist2 ; do ++ n=`escape_non_alpha $n` ++ sed "s/|BLACKLISTITEM|/$n/g" $TMPL_EXTBLKLIST >> $WORKDIR/blacklist.TMP ++ done ++ cat $TMPL_EXTBLKLISTFTR >> $WORKDIR/blacklist.TMP ++} ++ ++# Creates the callthrough context which allows specified numbers to get ++# into the PBX and dial out as the configured user. ++pbx_add_callthrough() ++{ ++ local callthrough_number_list ++ local defaultuser ++ local pin ++ local enabled ++ local F ++ ++ config_get callthrough_number_list $1 callthrough_number_list ++ config_get defaultuser $1 defaultuser ++ defaultuser=`escape_non_alpha $defaultuser` ++ config_get pin $1 pin ++ pin=`escape_non_alpha $pin` ++ config_get enabled $1 enabled ++ ++ [ "$enabled" = "no" ] && return ++ [ "$defaultuser" = "" ] && return ++ ++ for callthrough_number in $callthrough_number_list ; do ++ sed "s/|NUMBER|/$callthrough_number/g" $TMPL_EXTCTHRUCHECK >> $WORKDIR/callthroughcheck.TMP ++ ++ if [ -n "$pin" ] ; then F=$TMPL_EXTCTHRU ; else F=$TMPL_EXTCTHRUNOPIN ; fi ++ sed "s/|NUMBER|/$callthrough_number/g" $F |\ ++ sed "s/|DEFAULTUSER|/$defaultuser/" |\ ++ sed "s/|PIN|/$pin/" >> $WORKDIR/callthrough.TMP ++ done ++} ++ ++ ++# Creates the callback context which allows specified numbers to get ++# a callback into the PBX and dial out as the configured user. ++pbx_add_callback() ++{ ++ local callback_number_list ++ local defaultuser ++ local pin ++ local enabled ++ local callback_provider ++ local callback_hangup_delay ++ local FB ++ local FT ++ ++ config_get callback_number_list $1 callback_number_list ++ config_get defaultuser $1 defaultuser ++ defaultuser=`escape_non_alpha $defaultuser` ++ config_get pin $1 pin ++ pin=`escape_non_alpha $pin` ++ config_get enabled $1 enabled ++ config_get callback_provider $1 callback_provider ++ callback_provider=`sub_underscore_for_non_alpha $callback_provider` ++ config_get callback_hangup_delay $1 callback_hangup_delay ++ ++ [ "$enabled" = "no" ] && return ++ [ "$defaultuser" = "" ] && return ++ ++ # If the provider is a SIP provider, set the file to use to $TMPL_EXTCBACKSIP ++ # otherwise, set it to $TMPL_EXTCBACKGTALK ++ if echo $sip_outbound_providers | grep -q $callback_provider 2>/dev/null ++ then ++ FB=$TMPL_EXTCBACKSIP ++ else ++ FB=$TMPL_EXTCBACKGTALK ++ fi ++ ++ for callback_number in $callback_number_list ; do ++ sed "s/|NUMBER|/$callback_number/g" $TMPL_EXTCBACKCHECK >> $WORKDIR/callbackcheck.TMP ++ ++ sed "s/|NUMBER|/$callback_number/g" $FB |\ ++ sed "s/|CALLBACKPROVIDER|/$callback_provider/" |\ ++ sed "s/|CALLBACKHUPDELAY|/$callback_hangup_delay/" >> $WORKDIR/callback.TMP ++ ++ # Perhaps a bit confusingly, we create "callthrough" configuration for callback ++ # numbers, because we use the same DISA construct as for callthrough. ++ if [ -n "$pin" ] ; then FT=$TMPL_EXTCTHRU ; else FT=$TMPL_EXTCTHRUNOPIN ; fi ++ sed "s/|NUMBER|/$callback_number/g" $FT |\ ++ sed "s/|DEFAULTUSER|/$defaultuser/" |\ ++ sed "s/|PIN|/$pin/" >> $WORKDIR/callthrough.TMP ++ done ++} ++ ++ ++# Creates sip.conf from its template. ++pbx_cook_sip_template() ++{ ++ local useragent ++ local externhost ++ local bindport ++ ++ config_get useragent advanced useragent ++ useragent=`escape_non_alpha $useragent` ++ config_get externhost advanced externhost ++ config_get bindport advanced bindport ++ ++ [ -z "$useragent" ] && useragent="$USERAGENT" ++ ++ sed "s/|USERAGENT|/$useragent/g" $TMPL_SIP > $WORKDIR/sip.conf ++ ++ if [ -z "$externhost" ] ; then ++ sed -i "s/externhost=|EXTERNHOST|//g" $WORKDIR/sip.conf ++ else ++ sed -i "s/|EXTERNHOST|/$externhost/g" $WORKDIR/sip.conf ++ fi ++ ++ if [ -z "$bindport" ] ; then ++ sed -i "s/bindport=|BINDPORT|//g" $WORKDIR/sip.conf ++ else ++ sed -i "s/|BINDPORT|/$bindport/g" $WORKDIR/sip.conf ++ fi ++ ++ ++} ++ ++# Creates rtp.conf from its template. ++pbx_cook_rtp_template() ++{ ++ local rtpstart ++ local rtpend ++ ++ config_get rtpstart advanced rtpstart ++ config_get rtpend advanced rtpend ++ ++ sed "s/|RTPSTART|/$rtpstart/" $TMPL_RTP |\ ++ sed "s/|RTPEND|/$rtpend/" > $WORKDIR/rtp.conf ++} ++ ++# Links any sound files found in $PBXSOUNDSDIR and $VMSOUNDSDIR ++# into $ASTSOUNDSDIR for use by Asterisk. Does not overwrite files. ++pbx_link_sounds() ++{ ++ mkdir -p $ASTSOUNDSDIR ++ ++ for dir in $PBXSOUNDSDIR $VMSOUNDSDIR ; do ++ if [ -d $dir ] ; then ++ for f in $dir/* ; do ++ ln -s $f $ASTSOUNDSDIR 2>/dev/null ++ done ++ fi ++ done ++} ++ ++ ++# Makes sure the ownership of specified directories is proper. ++pbx_fix_ownership() ++{ ++ chown $ASTUSER:$ASTGROUP $ASTDIRS ++ chown $ASTUSER:$ASTGROUP -R $ASTDIRSRECURSIVE ++} ++ ++ ++# Creates voicemail config if installed and enabled. ++pbx_configure_voicemail() ++{ ++ local enabled ++ local global_timeout ++ local global_email_addresses ++ ++ local smtp_tls ++ local smtp_server ++ local smtp_port ++ local smtp_auth ++ local smtp_user ++ local smtp_password ++ ++ config_get enabled global_voicemail enabled ++ ++ # First check if voicemail is enabled. ++ [ "$enabled" != "yes" ] && return ++ ++ config_get global_timeout global_voicemail global_timeout ++ #config_get global_email_addresses global_voicemail global_email_addresses ++ config_get smtp_auth voicemail_smtp smtp_auth ++ config_get smtp_tls voicemail_smtp smtp_tls ++ config_get smtp_server voicemail_smtp smtp_server ++ config_get smtp_port voicemail_smtp smtp_port ++ config_get smtp_user voicemail_smtp smtp_user ++ smtp_user=`escape_non_alpha $smtp_user` ++ config_get smtp_password voicemail_smtp smtp_password ++ smtp_password=`escape_non_alpha $smtp_password` ++ ++ sed "s/|AUTH|/$smtp_auth/" $TMPL_MSMTPDEFAULT |\ ++ sed "s/|TLS|/$smtp_tls/" > $WORKDIR/pbx-msmtprc ++ ++ sed "s/|HOST|/$smtp_server/" $TMPL_MSMTPACCOUNT |\ ++ sed "s/|PORT|/$smtp_port/" >> $WORKDIR/pbx-msmtprc ++ ++ if [ "$smtp_auth" = "on" ] ; then ++ sed "s/|USER|/$smtp_user/" $TMPL_MSMTPAUTH |\ ++ sed "s/|PASSWORD|/$smtp_password/" >> $WORKDIR/pbx-msmtprc ++ fi ++ ++ cat $TMPL_MSMTPACCTDFLT >> $WORKDIR/pbx-msmtprc ++ ++ [ ! -f /etc/pbx-msmtprc ] && cp $WORKDIR/pbx-msmtprc /etc/pbx-msmtprc ++ cmp -s $WORKDIR/pbx-msmtprc /etc/pbx-msmtprc 1>/dev/null \ ++ || mv $WORKDIR/pbx-msmtprc /etc/pbx-msmtprc ++ chmod 600 /etc/pbx-msmtprc ++ chown nobody /etc/pbx-msmtprc ++ ++ # Copy over the extensions file which has voicemail enabled. ++ cp $TMPL_EXTVMENABLED $WORKDIR/extensions_voicemail.conf ++ ++ # Create the voicemail directory in /tmp ++ mkdir -p /tmp/voicemail ++ chown nobody /tmp/voicemail ++ ++ # Create the recordings directory ++ mkdir -p /etc/pbx-voicemail/recordings ++ chown nobody /etc/pbx-voicemail/recordings ++ ++ # Working around a bug in OpenWRT 12.09-rc1 ++ # TODO: REMOVE AS SOON AS POSSIBLE ++ chmod ugo+w /tmp ++} ++ ++ ++start() { ++ mkdir -p $WORKDIR ++ ++ # Create the users. ++ config_load ${MODULENAME}-users ++ config_foreach pbx_add_user local_user ++ ++ # Create configuration for each google account. ++ config_unset ++ config_load ${MODULENAME}-google ++ config_foreach pbx_add_jabber gtalk_jabber ++ ++ # Create configuration for each voip provider. ++ config_unset ++ config_load ${MODULENAME}-voip ++ config_foreach pbx_add_peer voip_provider ++ ++ # Create the user contexts, callthroug/back, and phone blacklist. ++ config_unset ++ config_load ${MODULENAME}-calls ++ pbx_create_user_contexts ++ pbx_add_blacklist ++ config_foreach pbx_add_callthrough callthrough_numbers ++ config_foreach pbx_add_callback callback_numbers ++ ++ # Prepare sip.conf using settings from the "advanced" section. ++ config_unset ++ config_load ${MODULENAME}-advanced ++ pbx_cook_sip_template ++ pbx_cook_rtp_template ++ ++ # Prepare voicemail config. ++ config_unset ++ config_load ${MODULENAME}-voicemail ++ pbx_configure_voicemail ++ ++ # Assemble the configuration, and copy changed files over. ++ config_unset ++ config_load ${MODULENAME}-advanced ++ pbx_assemble_and_copy_config ++ ++ # Link sound files ++ pbx_link_sounds ++ ++ # Enforce ownership of specified files and directories. ++ pbx_fix_ownership ++} +diff --git a/feeds/luci/applications/luci-app-pbx/root/etc/pbx-asterisk/asterisk.conf.TEMPLATE b/feeds/luci/applications/luci-app-pbx/root/etc/pbx-asterisk/asterisk.conf.TEMPLATE +new file mode 100644 +index 0000000..ac54396 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-pbx/root/etc/pbx-asterisk/asterisk.conf.TEMPLATE +@@ -0,0 +1,17 @@ ++[directories] ++astetcdir => /etc/asterisk ++astmoddir => /usr/lib/asterisk/modules ++astvarlibdir => /usr/lib/asterisk ++astdbdir => /usr/lib/asterisk ++astkeydir => /usr/lib/asterisk ++astdatadir => /usr/lib/asterisk ++astagidir => /usr/lib/asterisk/agi-bin ++astspooldir => /var/spool/asterisk ++astrundir => /var/run/asterisk ++astlogdir => /var/log/asterisk ++ ++[options] ++languageprefix = yes ++dumpcore = no ++runuser = nobody ++rungroup = nogroup +diff --git a/feeds/luci/applications/luci-app-pbx/root/etc/pbx-asterisk/delayedcallback b/feeds/luci/applications/luci-app-pbx/root/etc/pbx-asterisk/delayedcallback +new file mode 100755 +index 0000000..903efe9 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-pbx/root/etc/pbx-asterisk/delayedcallback +@@ -0,0 +1,18 @@ ++#!/bin/sh ++ ++# Check if there are more than one instance of this command ++# with the same command line running at the same time for some ++# reason, then quit. We are checking for the same ++# commandline in order to permit two different callback ++# attempts simultaneously. ++ ++if ! grep -q "$@" /dev/shm/delayedcallback.[0-9]* 2>/dev/null ++then ++ echo "$@" > /dev/shm/delayedcallback.$$ ++ sleep 25 ++ asterisk -r -x "$1 $2 \"$3\" $4 $5 $6" ++ rm /dev/shm/delayedcallback.$$ ++# echo "`date` $@": >> /dev/shm/delayedcallback.log ++#else ++# echo "`date` ERROR: There appears to be a callback attempt in progress to: $@" >> /dev/shm/delayedcallback.err ++fi +diff --git a/feeds/luci/applications/luci-app-pbx/root/etc/pbx-asterisk/extensions.conf.TEMPLATE b/feeds/luci/applications/luci-app-pbx/root/etc/pbx-asterisk/extensions.conf.TEMPLATE +new file mode 100644 +index 0000000..c8966ed +--- /dev/null ++++ b/feeds/luci/applications/luci-app-pbx/root/etc/pbx-asterisk/extensions.conf.TEMPLATE +@@ -0,0 +1,25 @@ ++[general] ++static = yes ++writeprotect = yes ++clearglobalvars = no ++ ++[globals] ++RINGTIME => |RINGTIME| ++ ++[default] ++ ++[context-user-hangup-call-context] ++exten => s,1,Hangup() ++exten => _X.,1,Hangup() ++ ++[context-catch-all] ++exten => _[!-~].,1,Dial(SIP/${EXTEN},60,r) ++ ++#include extensions_default.conf ++#include extensions_voicemail.conf ++#include extensions_incoming.conf ++#include extensions_incoming_gtalk.conf ++#include extensions_blacklist.conf ++#include extensions_callthrough.conf ++#include extensions_callback.conf ++#include extensions_user.conf +diff --git a/feeds/luci/applications/luci-app-pbx/root/etc/pbx-asterisk/extensions_blacklist.conf.TEMPLATE b/feeds/luci/applications/luci-app-pbx/root/etc/pbx-asterisk/extensions_blacklist.conf.TEMPLATE +new file mode 100644 +index 0000000..54ee989 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-pbx/root/etc/pbx-asterisk/extensions_blacklist.conf.TEMPLATE +@@ -0,0 +1 @@ ++exten => s,n,Gotoif($[ "${CALLERID(NUM)}" = "|BLACKLISTITEM|" ]?context-user-hangup,s,1) +diff --git a/feeds/luci/applications/luci-app-pbx/root/etc/pbx-asterisk/extensions_blacklist_footer.conf.TEMPLATE b/feeds/luci/applications/luci-app-pbx/root/etc/pbx-asterisk/extensions_blacklist_footer.conf.TEMPLATE +new file mode 100644 +index 0000000..da964f2 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-pbx/root/etc/pbx-asterisk/extensions_blacklist_footer.conf.TEMPLATE +@@ -0,0 +1,2 @@ ++exten => s,n,Goto(${SOURCECONTEXT},${SOURCEEXTEN},doneblacklist) ++ +diff --git a/feeds/luci/applications/luci-app-pbx/root/etc/pbx-asterisk/extensions_blacklist_header.conf.TEMPLATE b/feeds/luci/applications/luci-app-pbx/root/etc/pbx-asterisk/extensions_blacklist_header.conf.TEMPLATE +new file mode 100644 +index 0000000..de0e984 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-pbx/root/etc/pbx-asterisk/extensions_blacklist_header.conf.TEMPLATE +@@ -0,0 +1,3 @@ ++ ++[blacklist-call-context] ++exten => s,1,Noop() +diff --git a/feeds/luci/applications/luci-app-pbx/root/etc/pbx-asterisk/extensions_callback-check.conf.TEMPLATE b/feeds/luci/applications/luci-app-pbx/root/etc/pbx-asterisk/extensions_callback-check.conf.TEMPLATE +new file mode 100644 +index 0000000..06b1a4b +--- /dev/null ++++ b/feeds/luci/applications/luci-app-pbx/root/etc/pbx-asterisk/extensions_callback-check.conf.TEMPLATE +@@ -0,0 +1 @@ ++exten => s,n,Gotoif($[ "${CALLERID(NUM)}" =~ ".*|NUMBER|" ]?context-user-callback,|NUMBER|,1) +diff --git a/feeds/luci/applications/luci-app-pbx/root/etc/pbx-asterisk/extensions_callback-check_footer.conf.TEMPLATE b/feeds/luci/applications/luci-app-pbx/root/etc/pbx-asterisk/extensions_callback-check_footer.conf.TEMPLATE +new file mode 100644 +index 0000000..282fe9e +--- /dev/null ++++ b/feeds/luci/applications/luci-app-pbx/root/etc/pbx-asterisk/extensions_callback-check_footer.conf.TEMPLATE +@@ -0,0 +1,2 @@ ++exten => s,n,Goto(${SOURCECONTEXT},${SOURCEEXTEN},donecallback) ++ +diff --git a/feeds/luci/applications/luci-app-pbx/root/etc/pbx-asterisk/extensions_callback-check_header.conf.TEMPLATE b/feeds/luci/applications/luci-app-pbx/root/etc/pbx-asterisk/extensions_callback-check_header.conf.TEMPLATE +new file mode 100644 +index 0000000..be289c4 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-pbx/root/etc/pbx-asterisk/extensions_callback-check_header.conf.TEMPLATE +@@ -0,0 +1,3 @@ ++ ++[callback-check-call-context] ++exten => s,1,Noop() +diff --git a/feeds/luci/applications/luci-app-pbx/root/etc/pbx-asterisk/extensions_callback_gtalk.conf.TEMPLATE b/feeds/luci/applications/luci-app-pbx/root/etc/pbx-asterisk/extensions_callback_gtalk.conf.TEMPLATE +new file mode 100644 +index 0000000..43eec78 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-pbx/root/etc/pbx-asterisk/extensions_callback_gtalk.conf.TEMPLATE +@@ -0,0 +1,4 @@ ++exten => |NUMBER|,1,System(/etc/pbx-asterisk/delayedcallback "channel originate Gtalk/gtalk-|CALLBACKPROVIDER|/|NUMBER|@voice.google.com extension |NUMBER|@disa-call-context" &) ++exten => |NUMBER|,n,Wait(|CALLBACKHUPDELAY|) ++exten => |NUMBER|,n,Hangup() ++ +diff --git a/feeds/luci/applications/luci-app-pbx/root/etc/pbx-asterisk/extensions_callback_header.conf.TEMPLATE b/feeds/luci/applications/luci-app-pbx/root/etc/pbx-asterisk/extensions_callback_header.conf.TEMPLATE +new file mode 100644 +index 0000000..0b8fb4c +--- /dev/null ++++ b/feeds/luci/applications/luci-app-pbx/root/etc/pbx-asterisk/extensions_callback_header.conf.TEMPLATE +@@ -0,0 +1 @@ ++[context-user-callback] +diff --git a/feeds/luci/applications/luci-app-pbx/root/etc/pbx-asterisk/extensions_callback_sip.conf.TEMPLATE b/feeds/luci/applications/luci-app-pbx/root/etc/pbx-asterisk/extensions_callback_sip.conf.TEMPLATE +new file mode 100644 +index 0000000..300e9fa +--- /dev/null ++++ b/feeds/luci/applications/luci-app-pbx/root/etc/pbx-asterisk/extensions_callback_sip.conf.TEMPLATE +@@ -0,0 +1,4 @@ ++exten => |NUMBER|,1,System(/etc/pbx-asterisk/delayedcallback "channel originate SIP/|NUMBER|@peer-|CALLBACKPROVIDER| extension |NUMBER|@disa-call-context" &) ++exten => |NUMBER|,n,Wait(|CALLBACKHUPDELAY|) ++exten => |NUMBER|,n,Hangup() ++ +diff --git a/feeds/luci/applications/luci-app-pbx/root/etc/pbx-asterisk/extensions_default.conf.TEMPLATE b/feeds/luci/applications/luci-app-pbx/root/etc/pbx-asterisk/extensions_default.conf.TEMPLATE +new file mode 100644 +index 0000000..35836e2 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-pbx/root/etc/pbx-asterisk/extensions_default.conf.TEMPLATE +@@ -0,0 +1,11 @@ ++[default-incoming-call-context] ++exten => s,1,NoOp(${CALLERID}) ++exten => s,n,Set(SOURCECONTEXT=default-incoming-call-context) ++exten => s,n,Set(SOURCEEXTEN=s) ++exten => s,n,Goto(blacklist-call-context,s,1) ++exten => s,n(doneblacklist),NoOp() ++exten => s,n,Goto(callback-check-call-context,s,1) ++exten => s,n(donecallback),NoOp() ++exten => s,n,Goto(disa-check-call-context,s,1) ++exten => s,n(donedisacheck),Dial(|LOCALUSERS|,${RINGTIME},r) ++exten => s,n,Goto(context-voicemail,s,1) +diff --git a/feeds/luci/applications/luci-app-pbx/root/etc/pbx-asterisk/extensions_default_user.conf.TEMPLATE b/feeds/luci/applications/luci-app-pbx/root/etc/pbx-asterisk/extensions_default_user.conf.TEMPLATE +new file mode 100644 +index 0000000..1910ff4 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-pbx/root/etc/pbx-asterisk/extensions_default_user.conf.TEMPLATE +@@ -0,0 +1 @@ ++exten => |DEFAULTUSER|,1,Goto(default-incoming-call-context,s,1) +diff --git a/feeds/luci/applications/luci-app-pbx/root/etc/pbx-asterisk/extensions_disa-check.conf.TEMPLATE b/feeds/luci/applications/luci-app-pbx/root/etc/pbx-asterisk/extensions_disa-check.conf.TEMPLATE +new file mode 100644 +index 0000000..ba2379b +--- /dev/null ++++ b/feeds/luci/applications/luci-app-pbx/root/etc/pbx-asterisk/extensions_disa-check.conf.TEMPLATE +@@ -0,0 +1 @@ ++exten => s,n,Gotoif($[ "${CALLERID(NUM)}" =~ ".*|NUMBER|" ]?disa-call-context,|NUMBER|,1) +diff --git a/feeds/luci/applications/luci-app-pbx/root/etc/pbx-asterisk/extensions_disa-check_footer.conf.TEMPLATE b/feeds/luci/applications/luci-app-pbx/root/etc/pbx-asterisk/extensions_disa-check_footer.conf.TEMPLATE +new file mode 100644 +index 0000000..74056fa +--- /dev/null ++++ b/feeds/luci/applications/luci-app-pbx/root/etc/pbx-asterisk/extensions_disa-check_footer.conf.TEMPLATE +@@ -0,0 +1 @@ ++exten => s,n,Goto(${SOURCECONTEXT},${SOURCEEXTEN},donedisacheck) +diff --git a/feeds/luci/applications/luci-app-pbx/root/etc/pbx-asterisk/extensions_disa-check_header.conf.TEMPLATE b/feeds/luci/applications/luci-app-pbx/root/etc/pbx-asterisk/extensions_disa-check_header.conf.TEMPLATE +new file mode 100644 +index 0000000..e0d67b8 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-pbx/root/etc/pbx-asterisk/extensions_disa-check_header.conf.TEMPLATE +@@ -0,0 +1,2 @@ ++[disa-check-call-context] ++exten => s,1,Noop() +diff --git a/feeds/luci/applications/luci-app-pbx/root/etc/pbx-asterisk/extensions_disa-nopin.conf.TEMPLATE b/feeds/luci/applications/luci-app-pbx/root/etc/pbx-asterisk/extensions_disa-nopin.conf.TEMPLATE +new file mode 100644 +index 0000000..74e48de +--- /dev/null ++++ b/feeds/luci/applications/luci-app-pbx/root/etc/pbx-asterisk/extensions_disa-nopin.conf.TEMPLATE +@@ -0,0 +1,5 @@ ++exten => |NUMBER|,1,Noop() ++exten => |NUMBER|,n,Set(TIMEOUT(digit)=15) ++exten => |NUMBER|,n,Set(TIMEOUT(response)=40) ++exten => |NUMBER|,n,DISA(no-password,context-user-|DEFAULTUSER|) ++ +diff --git a/feeds/luci/applications/luci-app-pbx/root/etc/pbx-asterisk/extensions_disa.conf.TEMPLATE b/feeds/luci/applications/luci-app-pbx/root/etc/pbx-asterisk/extensions_disa.conf.TEMPLATE +new file mode 100644 +index 0000000..3dd8fa3 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-pbx/root/etc/pbx-asterisk/extensions_disa.conf.TEMPLATE +@@ -0,0 +1,6 @@ ++exten => |NUMBER|,1,Noop() ++exten => |NUMBER|,n,Set(TIMEOUT(digit)=7) ++exten => |NUMBER|,n,Set(TIMEOUT(response)=21) ++exten => |NUMBER|,n,Authenticate(|PIN|) ++exten => |NUMBER|,n,DISA(no-password,context-user-|DEFAULTUSER|) ++ +diff --git a/feeds/luci/applications/luci-app-pbx/root/etc/pbx-asterisk/extensions_disa_header.conf.TEMPLATE b/feeds/luci/applications/luci-app-pbx/root/etc/pbx-asterisk/extensions_disa_header.conf.TEMPLATE +new file mode 100644 +index 0000000..a742271 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-pbx/root/etc/pbx-asterisk/extensions_disa_header.conf.TEMPLATE +@@ -0,0 +1 @@ ++[disa-call-context] +diff --git a/feeds/luci/applications/luci-app-pbx/root/etc/pbx-asterisk/extensions_incoming_context_gtalk.conf.TEMPLATE b/feeds/luci/applications/luci-app-pbx/root/etc/pbx-asterisk/extensions_incoming_context_gtalk.conf.TEMPLATE +new file mode 100644 +index 0000000..3f9cf4c +--- /dev/null ++++ b/feeds/luci/applications/luci-app-pbx/root/etc/pbx-asterisk/extensions_incoming_context_gtalk.conf.TEMPLATE +@@ -0,0 +1,15 @@ ++exten => |USERNAME|,1,NoOp(${CALLERID}) ++same => n,Set(CALLERID(name)=${CUT(CALLERID(name),@,1)}) ++same => n,GotoIf($["${CALLERID(name):0:2}" != "+1"]?notrim) ++same => n,Set(CALLERID(name)=${CALLERID(name):2}) ++same => n(notrim),Set(CALLERID(number)=${CALLERID(name)}) ++same => n,Set(SOURCECONTEXT=context-incoming-gtalk) ++same => n,Set(SOURCEEXTEN=|USERNAME|) ++same => n,Goto(blacklist-call-context,s,1) ++same => n(doneblacklist),NoOp() ++same => n,Goto(callback-check-call-context,s,1) ++same => n(donecallback),NoOp() ++same => n,Goto(disa-check-call-context,s,1) ++same => n(donedisacheck),Dial(|LOCALUSERS|,${RINGTIME},D(:w11111111)) ++same => n,Goto(context-voicemail,s,1) ++ +diff --git a/feeds/luci/applications/luci-app-pbx/root/etc/pbx-asterisk/extensions_incoming_context_gtalk_header.conf.TEMPLATE b/feeds/luci/applications/luci-app-pbx/root/etc/pbx-asterisk/extensions_incoming_context_gtalk_header.conf.TEMPLATE +new file mode 100644 +index 0000000..f6e44a5 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-pbx/root/etc/pbx-asterisk/extensions_incoming_context_gtalk_header.conf.TEMPLATE +@@ -0,0 +1 @@ ++[context-incoming-gtalk] +diff --git a/feeds/luci/applications/luci-app-pbx/root/etc/pbx-asterisk/extensions_incoming_context_sip.conf.TEMPLATE b/feeds/luci/applications/luci-app-pbx/root/etc/pbx-asterisk/extensions_incoming_context_sip.conf.TEMPLATE +new file mode 100644 +index 0000000..b2c3716 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-pbx/root/etc/pbx-asterisk/extensions_incoming_context_sip.conf.TEMPLATE +@@ -0,0 +1,12 @@ ++ ++[context-incoming-|NAME|] ++exten => s,1,NoOp(${CALLERID}) ++exten => s,n,Set(SOURCECONTEXT=context-incoming-|NAME|) ++exten => s,n,Set(SOURCEEXTEN=s) ++exten => s,n,Goto(blacklist-call-context,s,1) ++exten => s,n(doneblacklist),NoOp() ++exten => s,n,Goto(callback-check-call-context,s,1) ++exten => s,n(donecallback),NoOp() ++exten => s,n,Goto(disa-check-call-context,s,1) ++exten => s,n(donedisacheck),Dial(|LOCALUSERS|,${RINGTIME},r) ++exten => s,n,Goto(context-voicemail,s,1) +diff --git a/feeds/luci/applications/luci-app-pbx/root/etc/pbx-asterisk/extensions_outgoing_dial_local_user.conf.TEMPLATE b/feeds/luci/applications/luci-app-pbx/root/etc/pbx-asterisk/extensions_outgoing_dial_local_user.conf.TEMPLATE +new file mode 100644 +index 0000000..45e8758 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-pbx/root/etc/pbx-asterisk/extensions_outgoing_dial_local_user.conf.TEMPLATE +@@ -0,0 +1 @@ ++exten => |DEFAULTUSER|,1,Dial(SIP/|DEFAULTUSER|,${RINGTIME},r) +diff --git a/feeds/luci/applications/luci-app-pbx/root/etc/pbx-asterisk/extensions_outgoing_gtalk.conf.TEMPLATE b/feeds/luci/applications/luci-app-pbx/root/etc/pbx-asterisk/extensions_outgoing_gtalk.conf.TEMPLATE +new file mode 100644 +index 0000000..259c2ce +--- /dev/null ++++ b/feeds/luci/applications/luci-app-pbx/root/etc/pbx-asterisk/extensions_outgoing_gtalk.conf.TEMPLATE +@@ -0,0 +1,9 @@ ++exten => _|NUMPREFIX|,1,Dial(Gtalk/gtalk-|NAME|/${EXTEN}@voice.google.com,60) ++exten => _+|NUMPREFIX|,1,Dial(Gtalk/gtalk-|NAME|/${EXTEN:1}@voice.google.com,60) ++exten => _|NUMPREFIX|.,1,Dial(Gtalk/gtalk-|NAME|/${EXTEN}@voice.google.com,60) ++exten => _+|NUMPREFIX|.,1,Dial(Gtalk/gtalk-|NAME|/${EXTEN:1}@voice.google.com,60) ++exten => _00|NUMPREFIX|.,1,Dial(Gtalk/gtalk-|NAME|/${EXTEN:2}@voice.google.com,60) ++exten => _011|NUMPREFIX|.,1,Dial(Gtalk/gtalk-|NAME|/${EXTEN:3}@voice.google.com,60) ++exten => _010|NUMPREFIX|.,1,Dial(Gtalk/gtalk-|NAME|/${EXTEN:3}@voice.google.com,60) ++exten => _0011|NUMPREFIX|.,1,Dial(Gtalk/gtalk-|NAME|/${EXTEN:4}@voice.google.com,60) ++ +diff --git a/feeds/luci/applications/luci-app-pbx/root/etc/pbx-asterisk/extensions_outgoing_pattern_gtalk.conf.TEMPLATE b/feeds/luci/applications/luci-app-pbx/root/etc/pbx-asterisk/extensions_outgoing_pattern_gtalk.conf.TEMPLATE +new file mode 100644 +index 0000000..1fa7713 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-pbx/root/etc/pbx-asterisk/extensions_outgoing_pattern_gtalk.conf.TEMPLATE +@@ -0,0 +1,2 @@ ++exten => |PATTERN|,1,Dial(Gtalk/gtalk-|NAME|/${EXTEN|SYMBOLSTOREMOVE|}@voice.google.com,60) ++ +diff --git a/feeds/luci/applications/luci-app-pbx/root/etc/pbx-asterisk/extensions_outgoing_pattern_sip.conf.TEMPLATE b/feeds/luci/applications/luci-app-pbx/root/etc/pbx-asterisk/extensions_outgoing_pattern_sip.conf.TEMPLATE +new file mode 100644 +index 0000000..178b6de +--- /dev/null ++++ b/feeds/luci/applications/luci-app-pbx/root/etc/pbx-asterisk/extensions_outgoing_pattern_sip.conf.TEMPLATE +@@ -0,0 +1 @@ ++exten => |PATTERN|,1,Dial(SIP/${EXTEN|SYMBOLSTOREMOVE|}@peer-|NAME|,60,r) +diff --git a/feeds/luci/applications/luci-app-pbx/root/etc/pbx-asterisk/extensions_outgoing_sip.conf.TEMPLATE b/feeds/luci/applications/luci-app-pbx/root/etc/pbx-asterisk/extensions_outgoing_sip.conf.TEMPLATE +new file mode 100644 +index 0000000..9b1d9ad +--- /dev/null ++++ b/feeds/luci/applications/luci-app-pbx/root/etc/pbx-asterisk/extensions_outgoing_sip.conf.TEMPLATE +@@ -0,0 +1,8 @@ ++exten => _|NUMPREFIX|,1,Dial(SIP/${EXTEN}@peer-|NAME|,60,r) ++exten => _+|NUMPREFIX|,1,Dial(SIP/${EXTEN}@peer-|NAME|,60,r) ++exten => _|NUMPREFIX|.,1,Dial(SIP/${EXTEN}@peer-|NAME|,60,r) ++exten => _+|NUMPREFIX|.,1,Dial(SIP/${EXTEN:1}@peer-|NAME|,60,r) ++exten => _00|NUMPREFIX|.,1,Dial(SIP/${EXTEN:2}@peer-|NAME|,60,r) ++exten => _011|NUMPREFIX|.,1,Dial(SIP/${EXTEN:3}@peer-|NAME|,60,r) ++exten => _010|NUMPREFIX|.,1,Dial(SIP/${EXTEN:3}@peer-|NAME|,60,r) ++exten => _0011|NUMPREFIX|.,1,Dial(SIP/${EXTEN:4}@peer-|NAME|,60,r) +diff --git a/feeds/luci/applications/luci-app-pbx/root/etc/pbx-asterisk/extensions_user_context_footer.conf.TEMPLATE b/feeds/luci/applications/luci-app-pbx/root/etc/pbx-asterisk/extensions_user_context_footer.conf.TEMPLATE +new file mode 100644 +index 0000000..a2ba28c +--- /dev/null ++++ b/feeds/luci/applications/luci-app-pbx/root/etc/pbx-asterisk/extensions_user_context_footer.conf.TEMPLATE +@@ -0,0 +1,2 @@ ++include => context-voicemail-record-greeting ++include => context-catch-all +diff --git a/feeds/luci/applications/luci-app-pbx/root/etc/pbx-asterisk/extensions_user_context_header.conf.TEMPLATE b/feeds/luci/applications/luci-app-pbx/root/etc/pbx-asterisk/extensions_user_context_header.conf.TEMPLATE +new file mode 100644 +index 0000000..5931eaf +--- /dev/null ++++ b/feeds/luci/applications/luci-app-pbx/root/etc/pbx-asterisk/extensions_user_context_header.conf.TEMPLATE +@@ -0,0 +1,3 @@ ++ ++[context-user-|DEFAULTUSER|] ++ +diff --git a/feeds/luci/applications/luci-app-pbx/root/etc/pbx-asterisk/extensions_voicemail_disabled.conf.TEMPLATE b/feeds/luci/applications/luci-app-pbx/root/etc/pbx-asterisk/extensions_voicemail_disabled.conf.TEMPLATE +new file mode 100644 +index 0000000..be23c29 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-pbx/root/etc/pbx-asterisk/extensions_voicemail_disabled.conf.TEMPLATE +@@ -0,0 +1,4 @@ ++[context-voicemail-record-greeting] ++ ++[context-voicemail] ++exten => s,1,Hangup() +diff --git a/feeds/luci/applications/luci-app-pbx/root/etc/pbx-asterisk/extensions_voicemail_enabled.conf.TEMPLATE b/feeds/luci/applications/luci-app-pbx/root/etc/pbx-asterisk/extensions_voicemail_enabled.conf.TEMPLATE +new file mode 100644 +index 0000000..4edd9cb +--- /dev/null ++++ b/feeds/luci/applications/luci-app-pbx/root/etc/pbx-asterisk/extensions_voicemail_enabled.conf.TEMPLATE +@@ -0,0 +1,27 @@ ++[context-voicemail-record-greeting] ++exten => *789,1,Wait(1) ++exten => *789,n,Playback(/etc/pbx-voicemail/recordings/greeting) ++exten => *789,n,Wait(1) ++exten => *789,n,Playback(beep) ++exten => *789,n,Playback(beep) ++exten => *789,n,WaitExten(30) ++ ++exten => t,1,Playback(vm-goodbye) ++exten => t,n,Wait(2) ++exten => t,n,Hangup() ++ ++exten => *,1,Playback(beep) ++exten => *,n,Playback(beep) ++exten => *,n,Record(/tmp/voicemail/greeting:gsm,20,120,k) ++exten => *,n,Wait(1) ++exten => *,n,Playback(/tmp/voicemail/greeting) ++ ++exten => h,1,System(/etc/pbx-voicemail/pbx-move-greeting &) ++ ++[context-voicemail] ++exten => s,1,Wait(2) ++exten => s,2,Playback(/etc/pbx-voicemail/recordings/greeting) ++exten => s,3,Wait(2) ++exten => s,n,Record(/tmp/voicemail/voicemail%d:WAV,20,180,k) ++ ++exten => h,1,System(/etc/pbx-voicemail/pbx-send-voicemail '${RECORDED_FILE}.WAV' '${CALLERID(all)}' &) +diff --git a/feeds/luci/applications/luci-app-pbx/root/etc/pbx-asterisk/gtalk.conf.TEMPLATE b/feeds/luci/applications/luci-app-pbx/root/etc/pbx-asterisk/gtalk.conf.TEMPLATE +new file mode 100644 +index 0000000..4f07a71 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-pbx/root/etc/pbx-asterisk/gtalk.conf.TEMPLATE +@@ -0,0 +1,10 @@ ++[general] ++context=context-incoming-gtalk ++allowguest=yes ++allowguests=yes ++bindaddr=0.0.0.0 ++ ++[guest] ++disallow=all ++allow=ulaw ++context=context-incoming-gtalk +diff --git a/feeds/luci/applications/luci-app-pbx/root/etc/pbx-asterisk/indications.conf.TEMPLATE b/feeds/luci/applications/luci-app-pbx/root/etc/pbx-asterisk/indications.conf.TEMPLATE +new file mode 100644 +index 0000000..d7088db +--- /dev/null ++++ b/feeds/luci/applications/luci-app-pbx/root/etc/pbx-asterisk/indications.conf.TEMPLATE +@@ -0,0 +1,733 @@ ++; indications.conf ++; Configuration file for location specific tone indications ++; used by the pbx_indications module. ++; ++; NOTE: ++; When adding countries to this file, please keep them in alphabetical ++; order according to the 2-character country codes! ++; ++; The [general] category is for certain global variables. ++; All other categories are interpreted as location specific indications ++; ++; ++[general] ++country=us ; default location ++ ++ ++; [example] ++; description = string ++; The full name of your country, in English. ++; alias = iso[,iso]* ++; List of other countries 2-letter iso codes, which have the same ++; tone indications. ++; ringcadence = num[,num]* ++; List of durations the physical bell rings. ++; dial = tonelist ++; Set of tones to be played when one picks up the hook. ++; busy = tonelist ++; Set of tones played when the receiving end is busy. ++; congestion = tonelist ++; Set of tones played when there is some congestion (on the network?) ++; callwaiting = tonelist ++; Set of tones played when there is a call waiting in the background. ++; dialrecall = tonelist ++; Not well defined; many phone systems play a recall dial tone after hook ++; flash. ++; record = tonelist ++; Set of tones played when call recording is in progress. ++; info = tonelist ++; Set of tones played with special information messages (e.g., "number is ++; out of service") ++; 'name' = tonelist ++; Every other variable will be available as a shortcut for the "PlayList" command ++; but will not be used automatically by Asterisk. ++; ++; ++; The tonelist itself is defined by a comma-separated sequence of elements. ++; Each element consist of a frequency (f) with an optional duration (in ms) ++; attached to it (f/duration). The frequency component may be a mixture of two ++; frequencies (f1+f2) or a frequency modulated by another frequency (f1*f2). ++; The implicit modulation depth is fixed at 90%, though. ++; If the list element starts with a !, that element is NOT repeated, ++; therefore, only if all elements start with !, the tonelist is time-limited, ++; all others will repeat indefinitely. ++; ++; concisely: ++; element = [!]freq[+|*freq2][/duration] ++; tonelist = element[,element]* ++; ++; Please note that SPACES ARE NOT ALLOWED in tone lists! ++; ++ ++[at] ++description = Austria ++ringcadence = 1000,5000 ++; Reference: http://www.itu.int/ITU-T/inr/forms/files/tones-0203.pdf ++dial = 420 ++busy = 420/400,0/400 ++ring = 420/1000,0/5000 ++congestion = 420/200,0/200 ++callwaiting = 420/40,0/1960 ++dialrecall = 420 ++; RECORDTONE - not specified ++record = 1400/80,0/14920 ++info = 950/330,1450/330,1850/330,0/1000 ++stutter = 380+420 ++ ++[au] ++description = Australia ++; Reference http://www.acif.org.au/__data/page/3303/S002_2001.pdf ++; Normal Ring ++ringcadence = 400,200,400,2000 ++; Distinctive Ring 1 - Forwarded Calls ++; 400,400,200,200,400,1400 ++; Distinctive Ring 2 - Selective Ring 2 + Operator + Recall ++; 400,400,200,2000 ++; Distinctive Ring 3 - Multiple Subscriber Number 1 ++; 200,200,400,2200 ++; Distinctive Ring 4 - Selective Ring 1 + Centrex ++; 400,2600 ++; Distinctive Ring 5 - Selective Ring 3 ++; 400,400,200,400,200,1400 ++; Distinctive Ring 6 - Multiple Subscriber Number 2 ++; 200,400,200,200,400,1600 ++; Distinctive Ring 7 - Multiple Subscriber Number 3 + Data Privacy ++; 200,400,200,400,200,1600 ++; Tones ++dial = 413+438 ++busy = 425/375,0/375 ++ring = 413+438/400,0/200,413+438/400,0/2000 ++; XXX Congestion: Should reduce by 10 db every other cadence XXX ++congestion = 425/375,0/375,420/375,0/375 ++callwaiting = 425/200,0/200,425/200,0/4400 ++dialrecall = 413+438 ++; Record tone used for Call Intrusion/Recording or Conference ++record = !425/1000,!0/15000,425/360,0/15000 ++info = 425/2500,0/500 ++; Other Australian Tones ++; The STD "pips" indicate the call is not an untimed local call ++std = !525/100,!0/100,!525/100,!0/100,!525/100,!0/100,!525/100,!0/100,!525/100 ++; Facility confirmation tone (eg. Call Forward Activated) ++facility = 425 ++; Message Waiting "stutter" dialtone ++stutter = 413+438/100,0/40 ++; Ringtone for calls to Telstra mobiles ++ringmobile = 400+450/400,0/200,400+450/400,0/2000 ++ ++[bg] ++; Reference: http://www.itu.int/ITU-T/inr/forms/files/tones-0203.pdf ++description = Bulgaria ++ringcadence = 1000,4000 ++; ++dial = 425 ++busy = 425/500,0/500 ++ring = 425/1000,0/4000 ++congestion = 425/250,0/250 ++callwaiting = 425/150,0/150,425/150,0/4000 ++dialrecall = !425/100,!0/100,!425/100,!0/100,!425/100,!0/100,425 ++record = 1400/425,0/15000 ++info = 950/330,1400/330,1800/330,0/1000 ++stutter = 425/1500,0/100 ++ ++[br] ++description = Brazil ++ringcadence = 1000,4000 ++dial = 425 ++busy = 425/250,0/250 ++ring = 425/1000,0/4000 ++congestion = 425/250,0/250,425/750,0/250 ++callwaiting = 425/50,0/1000 ++; Dialrecall not used in Brazil standard (using UK standard) ++dialrecall = 350+440 ++; Record tone is not used in Brazil, use busy tone ++record = 425/250,0/250 ++; Info not used in Brazil standard (using UK standard) ++info = 950/330,1400/330,1800/330 ++stutter = 350+440 ++ ++[be] ++description = Belgium ++; Reference: http://www.itu.int/ITU-T/inr/forms/files/tones-0203.pdf ++ringcadence = 1000,3000 ++dial = 425 ++busy = 425/500,0/500 ++ring = 425/1000,0/3000 ++congestion = 425/167,0/167 ++callwaiting = 1400/175,0/175,1400/175,0/3500 ++; DIALRECALL - not specified ++dialrecall = !350+440/100,!0/100,!350+440/100,!0/100,!350+440/100,!0/100,350+440" ++; RECORDTONE - not specified ++record = 1400/500,0/15000 ++info = 900/330,1400/330,1800/330,0/1000 ++stutter = 425/1000,0/250 ++ ++[ch] ++description = Switzerland ++; Reference: http://www.itu.int/ITU-T/inr/forms/files/tones-0203.pdf ++ringcadence = 1000,4000 ++dial = 425 ++busy = 425/500,0/500 ++ring = 425/1000,0/4000 ++congestion = 425/200,0/200 ++callwaiting = 425/200,0/200,425/200,0/4000 ++; DIALRECALL - not specified ++dialrecall = !425/100,!0/100,!425/100,!0/100,!425/100,!0/100,425 ++; RECORDTONE - not specified ++record = 1400/80,0/15000 ++info = 950/330,1400/330,1800/330,0/1000 ++stutter = 425+340/1100,0/1100 ++ ++[cl] ++description = Chile ++; According to specs from Telefonica CTC Chile ++ringcadence = 1000,3000 ++dial = 400 ++busy = 400/500,0/500 ++ring = 400/1000,0/3000 ++congestion = 400/200,0/200 ++callwaiting = 400/250,0/8750 ++dialrecall = !400/100,!0/100,!400/100,!0/100,!400/100,!0/100,400 ++record = 1400/500,0/15000 ++info = 950/333,1400/333,1800/333,0/1000 ++stutter = !400/100,!0/100,!400/100,!0/100,!400/100,!0/100,!400/100,!0/100,!400/100,!0/100,!400/100,!0/100,400 ++ ++[cn] ++description = China ++; Reference: http://www.itu.int/ITU-T/inr/forms/files/tones-0203.pdf ++ringcadence = 1000,4000 ++dial = 450 ++busy = 450/350,0/350 ++ring = 450/1000,0/4000 ++congestion = 450/700,0/700 ++callwaiting = 450/400,0/4000 ++dialrecall = 450 ++record = 950/400,0/10000 ++info = 450/100,0/100,450/100,0/100,450/100,0/100,450/400,0/400 ++; STUTTER - not specified ++stutter = 450+425 ++ ++[cz] ++description = Czech Republic ++; Reference: http://www.itu.int/ITU-T/inr/forms/files/tones-0203.pdf ++ringcadence = 1000,4000 ++dial = 425/330,0/330,425/660,0/660 ++busy = 425/330,0/330 ++ring = 425/1000,0/4000 ++congestion = 425/165,0/165 ++callwaiting = 425/330,0/9000 ++; DIALRECALL - not specified ++dialrecall = !425/100,!0/100,!425/100,!0/100,!425/100,!0/100,425/330,0/330,425/660,0/660 ++; RECORDTONE - not specified ++record = 1400/500,0/14000 ++info = 950/330,0/30,1400/330,0/30,1800/330,0/1000 ++; STUTTER - not specified ++stutter = 425/450,0/50 ++ ++[de] ++description = Germany ++; Reference: http://www.itu.int/ITU-T/inr/forms/files/tones-0203.pdf ++ringcadence = 1000,4000 ++dial = 425 ++busy = 425/480,0/480 ++ring = 425/1000,0/4000 ++congestion = 425/240,0/240 ++callwaiting = !425/200,!0/200,!425/200,!0/5000,!425/200,!0/200,!425/200,!0/5000,!425/200,!0/200,!425/200,!0/5000,!425/200,!0/200,!425/200,!0/5000,!425/200,!0/200,!425/200,0 ++; DIALRECALL - not specified ++dialrecall = !425/100,!0/100,!425/100,!0/100,!425/100,!0/100,425 ++; RECORDTONE - not specified ++record = 1400/80,0/15000 ++info = 950/330,1400/330,1800/330,0/1000 ++stutter = 425+400 ++ ++[dk] ++description = Denmark ++; Reference: http://www.itu.int/ITU-T/inr/forms/files/tones-0203.pdf ++ringcadence = 1000,4000 ++dial = 425 ++busy = 425/500,0/500 ++ring = 425/1000,0/4000 ++congestion = 425/200,0/200 ++callwaiting = !425/200,!0/600,!425/200,!0/3000,!425/200,!0/200,!425/200,0 ++; DIALRECALL - not specified ++dialrecall = !425/100,!0/100,!425/100,!0/100,!425/100,!0/100,425 ++; RECORDTONE - not specified ++record = 1400/80,0/15000 ++info = 950/330,1400/330,1800/330,0/1000 ++; STUTTER - not specified ++stutter = 425/450,0/50 ++ ++[ee] ++description = Estonia ++; Reference: http://www.itu.int/ITU-T/inr/forms/files/tones-0203.pdf ++ringcadence = 1000,4000 ++dial = 425 ++busy = 425/300,0/300 ++ring = 425/1000,0/4000 ++congestion = 425/200,0/200 ++; CALLWAIT not in accordance to ITU ++callwaiting = 950/650,0/325,950/325,0/30,1400/1300,0/2600 ++; DIALRECALL - not specified ++dialrecall = 425/650,0/25 ++; RECORDTONE - not specified ++record = 1400/500,0/15000 ++; INFO not in accordance to ITU ++info = 950/650,0/325,950/325,0/30,1400/1300,0/2600 ++; STUTTER not specified ++stutter = !425/100,!0/100,!425/100,!0/100,!425/100,!0/100,!425/100,!0/100,!425/100,!0/100,!425/100,!0/100,425 ++ ++[es] ++description = Spain ++ringcadence = 1500,3000 ++dial = 425 ++busy = 425/200,0/200 ++ring = 425/1500,0/3000 ++congestion = 425/200,0/200,425/200,0/200,425/200,0/600 ++callwaiting = 425/175,0/175,425/175,0/3500 ++dialrecall = !425/200,!0/200,!425/200,!0/200,!425/200,!0/200,425 ++record = 1400/500,0/15000 ++info = 950/330,0/1000 ++dialout = 500 ++ ++ ++[fi] ++description = Finland ++ringcadence = 1000,4000 ++dial = 425 ++busy = 425/300,0/300 ++ring = 425/1000,0/4000 ++congestion = 425/200,0/200 ++callwaiting = 425/150,0/150,425/150,0/8000 ++dialrecall = 425/650,0/25 ++record = 1400/500,0/15000 ++info = 950/650,0/325,950/325,0/30,1400/1300,0/2600 ++stutter = 425/650,0/25 ++ ++[fr] ++description = France ++; Reference: http://www.itu.int/ITU-T/inr/forms/files/tones-0203.pdf ++ringcadence = 1500,3500 ++; Dialtone can also be 440+330 ++dial = 440 ++busy = 440/500,0/500 ++ring = 440/1500,0/3500 ++; CONGESTION - not specified ++congestion = 440/250,0/250 ++callwait = 440/300,0/10000 ++; DIALRECALL - not specified ++dialrecall = !350+440/100,!0/100,!350+440/100,!0/100,!350+440/100,!0/100,350+440 ++; RECORDTONE - not specified ++record = 1400/500,0/15000 ++info = !950/330,!1400/330,!1800/330 ++stutter = !440/100,!0/100,!440/100,!0/100,!440/100,!0/100,!440/100,!0/100,!440/100,!0/100,!440/100,!0/100,440 ++ ++[gr] ++description = Greece ++ringcadence = 1000,4000 ++dial = 425/200,0/300,425/700,0/800 ++busy = 425/300,0/300 ++ring = 425/1000,0/4000 ++congestion = 425/200,0/200 ++callwaiting = 425/150,0/150,425/150,0/8000 ++dialrecall = 425/650,0/25 ++record = 1400/400,0/15000 ++info = !950/330,!1400/330,!1800/330,!0/1000,!950/330,!1400/330,!1800/330,!0/1000,!950/330,!1400/330,!1800/330,!0/1000,0 ++stutter = 425/650,0/25 ++ ++[hu] ++description = Hungary ++; Reference: http://www.itu.int/ITU-T/inr/forms/files/tones-0203.pdf ++ringcadence = 1250,3750 ++dial = 425 ++busy = 425/300,0/300 ++ring = 425/1250,0/3750 ++congestion = 425/300,0/300 ++callwaiting = 425/40,0/1960 ++dialrecall = 425+450 ++; RECORDTONE - not specified ++record = 1400/400,0/15000 ++info = !950/330,!1400/330,!1800/330,!0/1000,!950/330,!1400/330,!1800/330,!0/1000,!950/330,!1400/330,!1800/330,!0/1000,0 ++stutter = 350+375+400 ++ ++[il] ++description = Israel ++ringcadence = 1000,3000 ++dial = 414 ++busy = 414/500,0/500 ++ring = 414/1000,0/3000 ++congestion = 414/250,0/250 ++callwaiting = 414/100,0/100,414/100,0/100,414/600,0/3000 ++dialrecall = !414/100,!0/100,!414/100,!0/100,!414/100,!0/100,414 ++record = 1400/500,0/15000 ++info = 1000/330,1400/330,1800/330,0/1000 ++stutter = !414/160,!0/160,!414/160,!0/160,!414/160,!0/160,!414/160,!0/160,!414/160,!0/160,!414/160,!0/160,!414/160,!0/160,!414/160,!0/160,!414/160,!0/160,!414/160,!0/160,414 ++ ++ ++[in] ++description = India ++ringcadence = 400,200,400,2000 ++dial = 400*25 ++busy = 400/750,0/750 ++ring = 400*25/400,0/200,400*25/400,0/2000 ++congestion = 400/250,0/250 ++callwaiting = 400/200,0/100,400/200,0/7500 ++dialrecall = !350+440/100,!0/100,!350+440/100,!0/100,!350+440/100,!0/100,350+440 ++record = 1400/500,0/15000 ++info = !950/330,!1400/330,!1800/330,0/1000 ++stutter = !350+440/100,!0/100,!350+440/100,!0/100,!350+440/100,!0/100,!350+440/100,!0/100,!350+440/100,!0/100,!350+440/100,!0/100,350+440 ++ ++[it] ++description = Italy ++; Reference: http://www.itu.int/ITU-T/inr/forms/files/tones-0203.pdf ++ringcadence = 1000,4000 ++dial = 425/200,0/200,425/600,0/1000 ++busy = 425/500,0/500 ++ring = 425/1000,0/4000 ++congestion = 425/200,0/200 ++callwaiting = 425/400,0/100,425/250,0/100,425/150,0/14000 ++dialrecall = 470/400,425/400 ++record = 1400/400,0/15000 ++info = !950/330,!1400/330,!1800/330,!0/1000,!950/330,!1400/330,!1800/330,!0/1000,!950/330,!1400/330,!1800/330,!0/1000,0 ++stutter = 470/400,425/400 ++ ++[lt] ++description = Lithuania ++ringcadence = 1000,4000 ++dial = 425 ++busy = 425/350,0/350 ++ring = 425/1000,0/4000 ++congestion = 425/200,0/200 ++callwaiting = 425/150,0/150,425/150,0/4000 ++; DIALRECALL - not specified ++dialrecall = 425/500,0/50 ++; RECORDTONE - not specified ++record = 1400/500,0/15000 ++info = !950/330,!1400/330,!1800/330,!0/1000,!950/330,!1400/330,!1800/330,!0/1000,!950/330,!1400/330,!1800/330,!0/1000,0 ++; STUTTER - not specified ++stutter = !425/100,!0/100,!425/100,!0/100,!425/100,!0/100,!425/100,!0/100,!425/100,!0/100,!425/100,!0/100,425 ++ ++[jp] ++description = Japan ++ringcadence = 1000,2000 ++dial = 400 ++busy = 400/500,0/500 ++ring = 400+15/1000,0/2000 ++congestion = 400/500,0/500 ++callwaiting = 400+16/500,0/8000 ++dialrecall = !400/200,!0/200,!400/200,!0/200,!400/200,!0/200,400 ++record = 1400/500,0/15000 ++info = !950/330,!1400/330,!1800/330,0 ++stutter = !400/100,!0/100,!400/100,!0/100,!400/100,!0/100,!400/100,!0/100,!400/100,!0/100,!400/100,!0/100,400 ++ ++[mx] ++description = Mexico ++ringcadence = 2000,4000 ++dial = 425 ++busy = 425/250,0/250 ++ring = 425/1000,0/4000 ++congestion = 425/250,0/250 ++callwaiting = 425/200,0/600,425/200,0/10000 ++dialrecall = !350+440/100,!0/100,!350+440/100,!0/100,!350+440/100,!0/100,350+440 ++record = 1400/500,0/15000 ++info = 950/330,0/30,1400/330,0/30,1800/330,0/1000 ++stutter = !350+440/100,!0/100,!350+440/100,!0/100,!350+440/100,!0/100,!350+440/100,!0/100,!350+440/100,!0/100,!350+440/100,!0/100,350+440 ++ ++[my] ++description = Malaysia ++ringcadence = 2000,4000 ++dial = 425 ++busy = 425/500,0/500 ++ring = 425/400,0/200 ++congestion = 425/500,0/500 ++ ++[nl] ++description = Netherlands ++; Reference: http://www.itu.int/ITU-T/inr/forms/files/tones-0203.pdf ++ringcadence = 1000,4000 ++; Most of these 425's can also be 450's ++dial = 425 ++busy = 425/500,0/500 ++ring = 425/1000,0/4000 ++congestion = 425/250,0/250 ++callwaiting = 425/500,0/9500 ++; DIALRECALL - not specified ++dialrecall = 425/500,0/50 ++; RECORDTONE - not specified ++record = 1400/500,0/15000 ++info = 950/330,1400/330,1800/330,0/1000 ++stutter = 425/500,0/50 ++ ++[no] ++description = Norway ++ringcadence = 1000,4000 ++dial = 425 ++busy = 425/500,0/500 ++ring = 425/1000,0/4000 ++congestion = 425/200,0/200 ++callwaiting = 425/200,0/600,425/200,0/10000 ++dialrecall = 470/400,425/400 ++record = 1400/400,0/15000 ++info = !950/330,!1400/330,!1800/330,!0/1000,!950/330,!1400/330,!1800/330,!0/1000,!950/330,!1400/330,!1800/330,!0/1000,0 ++stutter = 470/400,425/400 ++ ++[nz] ++description = New Zealand ++;NOTE - the ITU has different tonesets for NZ, but according to some residents there, ++; this is, indeed, the correct way to do it. ++ringcadence = 400,200,400,2000 ++dial = 400 ++busy = 400/250,0/250 ++ring = 400+450/400,0/200,400+450/400,0/2000 ++congestion = 400/375,0/375 ++callwaiting = !400/200,!0/3000,!400/200,!0/3000,!400/200,!0/3000,!400/200 ++dialrecall = !400/100!0/100,!400/100,!0/100,!400/100,!0/100,400 ++record = 1400/425,0/15000 ++info = 400/750,0/100,400/750,0/100,400/750,0/100,400/750,0/400 ++stutter = !400/100!0/100,!400/100,!0/100,!400/100,!0/100,!400/100!0/100,!400/100,!0/100,!400/100,!0/100,400 ++unobtainable = 400/75,0/100,400/75,0/100,400/75,0/100,400/75,0/400 ++ ++[ph] ++ ++; reference http://www.itu.int/ITU-T/inr/forms/files/tones-0203.pdf ++ ++description = Philippines ++ringcadence = 1000,4000 ++dial = 425 ++busy = 480+620/500,0/500 ++ring = 425+480/1000,0/4000 ++congestion = 480+620/250,0/250 ++callwaiting = 440/300,0/10000 ++; DIALRECALL - not specified ++dialrecall = !350+440/100,!0/100,!350+440/100,!0/100,!350+440/100,!0/100,350+440 ++; RECORDTONE - not specified ++record = 1400/500,0/15000 ++; INFO - not specified ++info = !950/330,!1400/330,!1800/330,0 ++; STUTTER - not specified ++stutter = !350+440/100,!0/100,!350+440/100,!0/100,!350+440/100,!0/100,!350+440/100,!0/100,!350+440/100,!0/100,!350+440/100,!0/100,350+440 ++ ++ ++[pl] ++description = Poland ++ringcadence = 1000,4000 ++dial = 425 ++busy = 425/500,0/500 ++ring = 425/1000,0/4000 ++congestion = 425/500,0/500 ++callwaiting = 425/150,0/150,425/150,0/4000 ++; DIALRECALL - not specified ++dialrecall = 425/500,0/50 ++; RECORDTONE - not specified ++record = 1400/500,0/15000 ++; 950/1400/1800 3x0.33 on 1.0 off repeated 3 times ++info = !950/330,!1400/330,!1800/330,!0/1000,!950/330,!1400/330,!1800/330,!0/1000,!950/330,!1400/330,!1800/330,!0/1000 ++; STUTTER - not specified ++stutter = !425/100,!0/100,!425/100,!0/100,!425/100,!0/100,!425/100,!0/100,!425/100,!0/100,!425/100,!0/100,425 ++ ++[pt] ++description = Portugal ++ringcadence = 1000,5000 ++dial = 425 ++busy = 425/500,0/500 ++ring = 425/1000,0/5000 ++congestion = 425/200,0/200 ++callwaiting = 440/300,0/10000 ++dialrecall = 425/1000,0/200 ++record = 1400/500,0/15000 ++info = 950/330,1400/330,1800/330,0/1000 ++stutter = !425/100,!0/100,!425/100,!0/100,!425/100,!0/100,!425/100,!0/100,!425/100,!0/100,!425/100,!0/100,425 ++ ++[ru] ++; References: ++; http://www.minsvyaz.ru/site.shtml?id=1806 ++; http://www.aboutphone.info/lib/gost/45-223-2001.html ++description = Russian Federation / ex Soviet Union ++ringcadence = 1000,4000 ++dial = 425 ++busy = 425/350,0/350 ++ring = 425/1000,0/4000 ++congestion = 425/175,0/175 ++callwaiting = 425/200,0/5000 ++record = 1400/400,0/15000 ++info = 950/330,1400/330,1800/330,0/1000 ++dialrecall = 425/400,0/40 ++stutter = !425/100,!0/100,!425/100,!0/100,!425/100,!0/100,!425/100,!0/100,!425/100,!0/100,!425/100,!0/100,425 ++ ++[se] ++description = Sweden ++ringcadence = 1000,5000 ++dial = 425 ++busy = 425/250,0/250 ++ring = 425/1000,0/5000 ++congestion = 425/250,0/750 ++callwaiting = 425/200,0/500,425/200,0/9100 ++dialrecall = !425/100,!0/100,!425/100,!0/100,!425/100,!0/100,425 ++record = 1400/500,0/15000 ++info = !950/332,!0/24,!1400/332,!0/24,!1800/332,!0/2024,!950/332,!0/24,!1400/332,!0/24,!1800/332,!0/2024,!950/332,!0/24,!1400/332,!0/24,!1800/332,!0/2024,!950/332,!0/24,!1400/332,!0/24,!1800/332,!0/2024,!950/332,!0/24,!1400/332,!0/24,!1800/332,0 ++stutter = !425/100,!0/100,!425/100,!0/100,!425/100,!0/100,!425/100,!0/100,!425/100,!0/100,!425/100,!0/100,425 ++; stutter = 425/320,0/20 ; Real swedish standard, not used for now ++ ++[sg] ++description = Singapore ++; Singapore ++; Reference: http://www.ida.gov.sg/idaweb/doc/download/I397/ida_ts_pstn1_i4r2.pdf ++; Frequency specs are: 425 Hz +/- 20Hz; 24 Hz +/- 2Hz; modulation depth 100%; SIT +/- 50Hz ++ringcadence = 400,200,400,2000 ++dial = 425 ++ring = 425*24/400,0/200,425*24/400,0/2000 ; modulation should be 100%, not 90% ++busy = 425/750,0/750 ++congestion = 425/250,0/250 ++callwaiting = 425*24/300,0/200,425*24/300,0/3200 ++stutter = !425/200,!0/200,!425/600,!0/200,!425/200,!0/200,!425/600,!0/200,!425/200,!0/200,!425/600,!0/200,!425/200,!0/200,!425/600,!0/200,425 ++info = 950/330,1400/330,1800/330,0/1000 ; not currently in use acc. to reference ++dialrecall = 425*24/500,0/500,425/500,0/2500 ; unspecified in IDA reference, use repeating Holding Tone A,B ++record = 1400/500,0/15000 ; unspecified in IDA reference, use 0.5s tone every 15s ++; additionally defined in reference ++nutone = 425/2500,0/500 ++intrusion = 425/250,0/2000 ++warning = 425/624,0/4376 ; end of period tone, warning ++acceptance = 425/125,0/125 ++holdinga = !425*24/500,!0/500 ; followed by holdingb ++holdingb = !425/500,!0/2500 ++ ++[th] ++description = Thailand ++ringcadence = 1000,4000 ++; Reference: http://www.itu.int/ITU-T/inr/forms/files/tones-0203.pdf ++dial = 400*50 ++busy = 400/500,0/500 ++ring = 420/1000,0/5000 ++congestion = 400/300,0/300 ++callwaiting = 1000/400,10000/400,1000/400 ++; DIALRECALL - not specified - use special dial tone instead. ++dialrecall = 400*50/400,0/100,400*50/400,0/100 ++; RECORDTONE - not specified ++record = 1400/500,0/15000 ++; INFO - specified as an announcement - use special information tones instead ++info = 950/330,1400/330,1800/330 ++; STUTTER - not specified ++stutter = !400/200,!0/200,!400/600,!0/200,!400/200,!0/200,!400/600,!0/200,!400/200,!0/200,!400/600,!0/200,!400/200,!0/200,!400/600,!0/200,400 ++ ++[uk] ++description = United Kingdom ++ringcadence = 400,200,400,2000 ++; These are the official tones taken from BT SIN350. The actual tones ++; used by BT include some volume differences so sound slightly different ++; from Asterisk-generated ones. ++dial = 350+440 ++; Special dial is the intermittent dial tone heard when, for example, ++; you have a divert active on the line ++specialdial = 350+440/750,440/750 ++; Busy is also called "Engaged" ++busy = 400/375,0/375 ++; "Congestion" is the Beep-bip engaged tone ++congestion = 400/400,0/350,400/225,0/525 ++; "Special Congestion" is not used by BT very often if at all ++specialcongestion = 400/200,1004/300 ++unobtainable = 400 ++ring = 400+450/400,0/200,400+450/400,0/2000 ++callwaiting = 400/100,0/4000 ++; BT seem to use "Special Call Waiting" rather than just "Call Waiting" tones ++specialcallwaiting = 400/250,0/250,400/250,0/250,400/250,0/5000 ++; "Pips" used by BT on payphones. (Sounds wrong, but this is what BT claim it ++; is and I've not used a payphone for years) ++creditexpired = 400/125,0/125 ++; These two are used to confirm/reject service requests on exchanges that ++; don't do voice announcements. ++confirm = 1400 ++switching = 400/200,0/400,400/2000,0/400 ++; This is the three rising tones Doo-dah-dee "Special Information Tone", ++; usually followed by the BT woman saying an appropriate message. ++info = 950/330,0/15,1400/330,0/15,1800/330,0/1000 ++; Not listed in SIN350 ++record = 1400/500,0/60000 ++stutter = 350+440/750,440/750 ++ ++[us] ++description = United States / North America ++ringcadence = 2000,4000 ++dial = 350+440 ++busy = 480+620/500,0/500 ++ring = 440+480/2000,0/4000 ++congestion = 480+620/250,0/250 ++callwaiting = 440/300,0/10000 ++dialrecall = !350+440/100,!0/100,!350+440/100,!0/100,!350+440/100,!0/100,350+440 ++record = 1400/500,0/15000 ++info = !950/330,!1400/330,!1800/330,0 ++stutter = !350+440/100,!0/100,!350+440/100,!0/100,!350+440/100,!0/100,!350+440/100,!0/100,!350+440/100,!0/100,!350+440/100,!0/100,350+440 ++ ++[us-old] ++description = United States Circa 1950/ North America ++ringcadence = 2000,4000 ++dial = 600*120 ++busy = 500*100/500,0/500 ++ring = 420*40/2000,0/4000 ++congestion = 500*100/250,0/250 ++callwaiting = 440/300,0/10000 ++dialrecall = !600*120/100,!0/100,!600*120/100,!0/100,!600*120/100,!0/100,600*120 ++record = 1400/500,0/15000 ++info = !950/330,!1400/330,!1800/330,0 ++stutter = !600*120/100,!0/100,!600*120/100,!0/100,!600*120/100,!0/100,!600*120/100,!0/100,!600*120/100,!0/100,!600*120/100,!0/100,600*120 ++ ++[tw] ++description = Taiwan ++; http://nemesis.lonestar.org/reference/telecom/signaling/dialtone.html ++; http://nemesis.lonestar.org/reference/telecom/signaling/busy.html ++; http://www.iproducts.com.tw/ee/kylink/06ky-1000a.htm ++; http://www.pbx-manufacturer.com/ky120dx.htm ++; http://www.nettwerked.net/tones.txt ++; http://www.cisco.com/univercd/cc/td/doc/product/tel_pswt/vco_prod/taiw_sup/taiw2.htm ++; ++; busy tone 480+620Hz 0.5 sec. on ,0.5 sec. off ++; reorder tone 480+620Hz 0.25 sec. on,0.25 sec. off ++; ringing tone 440+480Hz 1 sec. on ,2 sec. off ++; ++ringcadence = 1000,4000 ++dial = 350+440 ++busy = 480+620/500,0/500 ++ring = 440+480/1000,0/2000 ++congestion = 480+620/250,0/250 ++callwaiting = 350+440/250,0/250,350+440/250,0/3250 ++dialrecall = 300/1500,0/500 ++record = 1400/500,0/15000 ++info = !950/330,!1400/330,!1800/330,0 ++stutter = !350+440/100,!0/100,!350+440/100,!0/100,!350+440/100,!0/100,!350+440/100,!0/100,!350+440/100,!0/100,!350+440/100,!0/100,350+440 ++ ++[ve] ++; Tone definition source for ve found on ++; Reference: http://www.itu.int/ITU-T/inr/forms/files/tones-0203.pdf ++description = Venezuela / South America ++ringcadence = 1000,4000 ++dial = 425 ++busy = 425/500,0/500 ++ring = 425/1000,0/4000 ++congestion = 425/250,0/250 ++callwaiting = 400+450/300,0/6000 ++dialrecall = 425 ++record = 1400/500,0/15000 ++info = !950/330,!1440/330,!1800/330,0/1000 ++ ++ ++[za] ++description = South Africa ++; http://www.cisco.com/univercd/cc/td/doc/product/tel_pswt/vco_prod/safr_sup/saf02.htm ++; (definitions for other countries can also be found there) ++; Note, though, that South Africa uses two switch types in their network -- ++; Alcatel switches -- mainly in the Western Cape, and Siemens elsewhere. ++; The former use 383+417 in dial, ringback etc. The latter use 400*33 ++; I've provided both, uncomment the ones you prefer ++ringcadence = 400,200,400,2000 ++; dial/ring/callwaiting for the Siemens switches: ++dial = 400*33 ++ring = 400*33/400,0/200,400*33/400,0/2000 ++callwaiting = 400*33/250,0/250,400*33/250,0/250,400*33/250,0/250,400*33/250,0/250 ++; dial/ring/callwaiting for the Alcatel switches: ++; dial = 383+417 ++; ring = 383+417/400,0/200,383+417/400,0/2000 ++; callwaiting = 383+417/250,0/250,383+417/250,0/250,383+417/250,0/250,383+417/250,0/250 ++congestion = 400/250,0/250 ++busy = 400/500,0/500 ++dialrecall = 350+440 ++; XXX Not sure about the RECORDTONE ++record = 1400/500,0/10000 ++info = 950/330,1400/330,1800/330,0/330 ++stutter = !400*33/100,!0/100,!400*33/100,!0/100,!400*33/100,!0/100,!400*33/100,!0/100,!400*33/100,!0/100,!400*33/100,!0/100,400*33 +diff --git a/feeds/luci/applications/luci-app-pbx/root/etc/pbx-asterisk/jabber.conf.TEMPLATE b/feeds/luci/applications/luci-app-pbx/root/etc/pbx-asterisk/jabber.conf.TEMPLATE +new file mode 100644 +index 0000000..cf71e1f +--- /dev/null ++++ b/feeds/luci/applications/luci-app-pbx/root/etc/pbx-asterisk/jabber.conf.TEMPLATE +@@ -0,0 +1,4 @@ ++[general] ++autoregister=yes ++ ++#include jabber_users.conf +diff --git a/feeds/luci/applications/luci-app-pbx/root/etc/pbx-asterisk/jabber_users.conf.TEMPLATE b/feeds/luci/applications/luci-app-pbx/root/etc/pbx-asterisk/jabber_users.conf.TEMPLATE +new file mode 100644 +index 0000000..3ee2463 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-pbx/root/etc/pbx-asterisk/jabber_users.conf.TEMPLATE +@@ -0,0 +1,8 @@ ++[gtalk-|NAME|] ++type=client ++serverhost=talk.google.com ++username=|USERNAME|/Talk ++secret=|SECRET| ++timeout=150 ++status=|STATUS| ++statusmessage=|STATUSMESSAGE| +diff --git a/feeds/luci/applications/luci-app-pbx/root/etc/pbx-asterisk/logger.conf.TEMPLATE b/feeds/luci/applications/luci-app-pbx/root/etc/pbx-asterisk/logger.conf.TEMPLATE +new file mode 100644 +index 0000000..e573250 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-pbx/root/etc/pbx-asterisk/logger.conf.TEMPLATE +@@ -0,0 +1,7 @@ ++[general] ++queue_log = no ++event_log = no ++ ++[logfiles] ++console => notice,warning,error ++messages => error +diff --git a/feeds/luci/applications/luci-app-pbx/root/etc/pbx-asterisk/manager.conf.TEMPLATE b/feeds/luci/applications/luci-app-pbx/root/etc/pbx-asterisk/manager.conf.TEMPLATE +new file mode 100644 +index 0000000..2ac2f00 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-pbx/root/etc/pbx-asterisk/manager.conf.TEMPLATE +@@ -0,0 +1,7 @@ ++[general] ++enabled = no ++ ++port = 5038 ++bindaddr = 0.0.0.0 ++ ++ +diff --git a/feeds/luci/applications/luci-app-pbx/root/etc/pbx-asterisk/modules.conf.TEMPLATE b/feeds/luci/applications/luci-app-pbx/root/etc/pbx-asterisk/modules.conf.TEMPLATE +new file mode 100644 +index 0000000..93c7433 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-pbx/root/etc/pbx-asterisk/modules.conf.TEMPLATE +@@ -0,0 +1,34 @@ ++[modules] ++autoload=no ++load => res_jabber.so ; Used for Gtalk ++load => res_clioriginate.so ; originate calls from commandline ++load => res_rtp_asterisk.so ; rtp "engine" is now a loadable module in asterisk 1.8 ++load => pbx_config.so ; Text Extension Configuration Requires N/A ++load => func_callerid.so ; Gets or sets Caller*ID data on the channel. - Requires ? ++load => func_channel.so ++load => func_logic.so ; Logic functions (if, etc.) ++load => func_strings.so ; string manipulation functions ++load => cdr_manager.so ; Asterisk Call Manager CDR Backend - Requires N/A ++load => chan_local.so ; Show status of local channels- Requires N/A ++load => chan_gtalk.so ; Use gtalk ++load => chan_sip.so ; Session Initiation Protocol (SIP) - Requires res_features.so ++load => codec_alaw.so ; A-law Coder/Decoder - Requires N/A ++load => codec_a_mu.so ; A-law and Mulaw direct Coder/Decoder - Requires N/A ++load => codec_gsm.so ; GSM/PCM16 (signed linear) Codec Translat - Requires N/A ++load => codec_ulaw.so ; Mu-law Coder/Decoder - Requires N/A ++load => format_gsm.so ; Raw GSM data - Requires N/A ++load => format_pcm.so ; Raw uLaw 8khz Audio support (PCM) - Requires N/A ++load => format_wav_gsm.so ++load => app_dial.so ; Dialing Application - Requires res_features.so, res_musiconhold.so ++load => app_parkandannounce.so ; Call Parking and Announce Application - Requires res_features.so ++load => app_playback.so ; Sound File Playback Application - Requires N/A ++load => app_record.so ; Sound File Record Application - Requires N/A ++load => app_system.so ; Execute a system command - Requires N/A ++load => app_disa.so ; Direct Inward System Access ++load => app_authenticate.so ; Authenticate via pin ++load => app_senddtmf.so ; Ability to send DTMF tones on the line. ++load => func_cut.so ; To manipulate strings ++load => func_timeout.so ; Used for DISA timeouts ++ ++[global] ++chan_modem.so=no +diff --git a/feeds/luci/applications/luci-app-pbx/root/etc/pbx-asterisk/rtp.conf.TEMPLATE b/feeds/luci/applications/luci-app-pbx/root/etc/pbx-asterisk/rtp.conf.TEMPLATE +new file mode 100644 +index 0000000..10d577d +--- /dev/null ++++ b/feeds/luci/applications/luci-app-pbx/root/etc/pbx-asterisk/rtp.conf.TEMPLATE +@@ -0,0 +1,6 @@ ++[general] ++rtpstart=|RTPSTART| ++rtpend=|RTPEND| ++rtpchecksums=no ++dtmftimeout=3000 ++rtcpinterval = 2000 +diff --git a/feeds/luci/applications/luci-app-pbx/root/etc/pbx-asterisk/sip.conf.TEMPLATE b/feeds/luci/applications/luci-app-pbx/root/etc/pbx-asterisk/sip.conf.TEMPLATE +new file mode 100644 +index 0000000..8f3b112 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-pbx/root/etc/pbx-asterisk/sip.conf.TEMPLATE +@@ -0,0 +1,39 @@ ++[general] ++transport=udp ++context=default-incoming-call-context ++allowoverlap=yes ++allowtransfer=yes ++realm=asterisk ++bindaddr=0.0.0.0 ++srvlookup=yes ++maxexpiry=600 ++minexpiry=60 ++defaultexpiry=300 ++qualifyfreq=55 ++disallow=all ++allow=ulaw ++allow=alaw ++dtmfmode = inband ++alwaysauthreject = yes ++t1min=100 ++timert1=500 ++timerb=16000 ++rtptimeout=600 ++rtpkeepalive=30 ++useragent=|USERAGENT| ++localnet=192.168.0.0/16 ++localnet=10.0.0.0/8 ++localnet=172.16.0.0/12 ++nat=yes ++directmedia=no ++sipdebug=no ++bindport=|BINDPORT| ++externhost=|EXTERNHOST| ++externrefresh=60 ++ ++#include sip_registrations.conf ++ ++[authentication] ++ ++#include sip_peers.conf ++#include sip_users.conf +diff --git a/feeds/luci/applications/luci-app-pbx/root/etc/pbx-asterisk/sip_peer.TEMPLATE b/feeds/luci/applications/luci-app-pbx/root/etc/pbx-asterisk/sip_peer.TEMPLATE +new file mode 100644 +index 0000000..30abaad +--- /dev/null ++++ b/feeds/luci/applications/luci-app-pbx/root/etc/pbx-asterisk/sip_peer.TEMPLATE +@@ -0,0 +1,13 @@ ++ ++[peer-|NAME|] ++type = peer ++defaultuser = |DEFAULTUSER| ++fromuser = |FROMUSER| ++secret = |SECRET| ++host = |HOST| ++fromdomain = |FROMDOMAIN| ++context = context-incoming-|NAME| ++insecure = port,invite ++qualify = 2000 ++|PORT| ++|OUTBOUNDPROXY| +diff --git a/feeds/luci/applications/luci-app-pbx/root/etc/pbx-asterisk/sip_registration.TEMPLATE b/feeds/luci/applications/luci-app-pbx/root/etc/pbx-asterisk/sip_registration.TEMPLATE +new file mode 100644 +index 0000000..e139d43 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-pbx/root/etc/pbx-asterisk/sip_registration.TEMPLATE +@@ -0,0 +1,2 @@ ++register => |DEFAULTUSER|:|SECRET|@peer-|NAME| ++ +diff --git a/feeds/luci/applications/luci-app-pbx/root/etc/pbx-asterisk/sip_user.TEMPLATE b/feeds/luci/applications/luci-app-pbx/root/etc/pbx-asterisk/sip_user.TEMPLATE +new file mode 100644 +index 0000000..61a8b0b +--- /dev/null ++++ b/feeds/luci/applications/luci-app-pbx/root/etc/pbx-asterisk/sip_user.TEMPLATE +@@ -0,0 +1,11 @@ ++ ++[|DEFAULTUSER|] ++fullname = |FULLNAME| ++defaultuser = |DEFAULTUSER| ++secret = |SECRET| ++hassip = yes ++hasvoicemail = no ++host = dynamic ++type = friend ++context = context-user-|CONTEXTNAME| ++qualify = no +\ No newline at end of file +diff --git a/feeds/luci/applications/luci-app-pbx/root/etc/pbx-asterisk/sounds/agent-alreadyon.gsm b/feeds/luci/applications/luci-app-pbx/root/etc/pbx-asterisk/sounds/agent-alreadyon.gsm +new file mode 100644 +index 0000000000000000000000000000000000000000..83fe27ecfa4dd332504f40dcbd43ddbb812d3d38 +GIT binary patch +literal 8943 +zcmWl9XH*ji)3vL(E0%SoSV&Mw0twXyp;%TaA)yHgJw&9}#HA~UB28LQLMNc6(osqh +zin7!sR3!~af&xkCSk|(;uD;Lb_v@ZHXU?7ZbI;73Gm@oS>(%Z%p!!4(m@t4)#9JG; +zT}H}Cj==2ea5)LSJWG!%SBQ34LrNOtMVFl+L>_o?#}8mH%q=36cn)OFuv90fFM|in +zwS=Tlt$_r@nn&vxfZ6*G`Yrc4TErK&5Q7e6ls2YEF;(#gxC+;&fM?qr-&Wba_e9BA +z(&#bKW{%4Fu4x$9gR|VXpG}Sbw3Ifczrbt~-1Sd1a)dK2d +zu+;vm+k&aXLec@Q2scL&w`5o6B*dDA@!=Hcq?(f +z48Q;9#u=X4yjhY_{tI9X-k`p~y!EkL;!_y0)VJsaF_gxS9Wp3MK>|(u1m*@kV9Oe2&PB0A-2id>Pp^S6adJQ!bU^tZ2)l;%nY!yOOx$FeLxoQ+_V_stcywi6hVNmZXgG=?@N6h-CYTk52Zm@A?iMY7e)H{3aPj=U@ZR_*z +zw;CzM*oz;Xw|5^5IfHnAvHR*J7c+&TrT_KB~%V +zjfrnEu4)>W{gIM5xupqw&?_izWy-&p)8`m~6BAjk%x@)*fZUd=VAGMhsTf2pv3_}G +ztaKaJFPl|@BPJij%xhqJjOW$YGE*88Dh*Eq#eLe#1228)D&PpJ`IR`HLgf~*_#$DPNq7$PZjaGK+Otv0Lm)Mu5#Xcbj +z3|T>C;|$!37E*>g=qaI~i#%X!@V}%&-~f0`6VvB4gJ)eA4N&HU2B#hb4{B?ne@Pyp +z0BnhtnqfQs`nY~dXU3Fubb&u;f&KicEPQ}IKlSzdI0X#B+sI-wSm&b8%I7*Wy?3q- +zqX>dPcXa&@&pzMMVw(2;ecz|ebwbO<>yx`_~t$J +zhF+-oWrwdM@o`*?)JHvE^?^$E9^+LK8K9=I-i_^%*5(Mq!&7{yILKvF)_mW)1;Ehr +zp~+43QHOl8<3E(U)cJ7Py?C0gM9(=;=4YrMYlQ0cGh}|wn}B9)92S=y@OsMk4E5ML +zE?IOg-Sks;l(~*Cb~Z@p#n!)IjSO|R*>aq^Z*4-4hBz=pwv5x)o$z>(*j*2KYdU(N +zEBw{*qF#@_@ZWujhJHe72yOYg%376cUo)b*LKx$i1kl-Ka0k`+P=cDtX5nnGlT(Oj +zxoulb6CO^Pe|&$is-NcT|FkW{&+c1eSTKDK7C$zbn{&W`I0nd5XryoOR3e4dE+63Q +zYl>NjuSj3az#j2j8F}DEiC}L3HzeRhW!Ce`jA!UM5U`WwDK1pO(TaB!cYETg2jB86yJ0HH4j$n_IrSo +zJGA7M0-57h72avp5y9g&^k&0O^Gf}Lh5DoukH$bn*_EPgK2^|QyBTktD*RNkM47zb +zKra5X;J)e{?v9a0j-y3H0;D9%5hWjE9u|H{)vM0h^^sgmkq$MC0t;E1cf*`hK)=0y +z!M%DY2YN@CLOQOInrEqr`V*4MvzKjHYH=Ja%iLh^I1Dx>&RHr<>^NMLmMx)RCPLDO +zHBXEE9^N%fmJ+Ou?>YXJRX17P)qQo@D&3v-+$)S#FQ#E%=RZ+(dpp_u&nvv@=YqzI +z9^np0>oJau2t-zj)nh?Rwj|!e;Optc;cM>@VatDXuhwid2=P5OQ^qWs2f;T +zjVxFoqL!=HM;7DV%Bzu_Jz}@O>V1})?fs9$bXS^v_5E(S)9qu`P0oG^Bc;{ONZAW3 +zVddU%T3v6cn35EZuH@4K-75Xd3mB*HM$4tV*@ck3wGUkX)ONF%i>c|+&a*}v8(v+{ +zA56>w;`-}|JeYBcI<9bx?4_e_BwEIAk +z?}`GG>g`3@`*&t+ZsgIan=azpliX&MCq86jr@uq4&xzSc|5-q>t)_noCu3#hhOYbK +z6nfQ1r +z?4vy3e@mJ-yQK9_?lYpJd~`Vf=_u4QVe~gFs{23Uh^!N3rToi4D0y@dyoEJbTe!-L +z6|?~E%L3Qtx$cpc=N=4l-@b1B@gAT%_h{)O +zg|nb3^t^x_i3BDmD}0$yEyAcA8^VDgxL>^$R#c_UnxG}%JhpS^M_q4sg`dMyNEBa& +z9aLM7Rq0?U)6BC7nE)Stz +zj+IhRVENxl+=g{bK1RXUUmZLHl^>!Cpr-@x`$&eZlp524SaP1fOK!;RL^|!GG$9CQ114JDKP;H#r7rGfDk~3N_E4Q1((Hj0u +zoNmFcnLPZAkO^BzD`mKK6tLS^AKS>&VR4PIhHzz^@#Hh24UGU_6*UKi1bf#Xa&0xi +z`ZCiYbSj=Y6eEhAFU^?|9gugIFOC`d(eH;_NDuIq+Wh7Q_p#dRy@%oBd~ +z+;nh;L}p+@N3n$et)OCucar;}k{hSFiv>q0V&?gG3)c@M|F88olE2xX#!+zj!|j_3 +zXmk1E8GoM_b2TOtigji2lenoAfiXwlB0+K6Qo5i6h_rP=^^F4uS1z +zU5hIEsOYoHTMTye$|mtr6ARWTFNP^Pjd(|j;WDf`OqR};i7i6#{(j8JMa8T4Sf|KZ +z@0)d<&W-*Al&~|(Q{mcZBesaa*Z8klc{W`sz{1;ab5PeE* +ztl>m)mD}999(D7LiiChbb-t*;TJ{3fX%uG-75$YORUN3dKhmkZAW+>;7-u8;Q=Jom +z?@|UCa%&&KgrdX?K_&e>k<7=9+|OVt;?D;T44tMu95fi-eGpCTtrh;|aLgkFY#nIG +z>=@nk!K?C2_NYB#o%9sjKf=`aVEKujh9o`YjjWM1IGPbm)G6&6YJ?+P`KTsniVxq6 +zx6BcngmfI0)U&mSqAj7(??9BdQW$RYQZ50;MAicf%(ld_&Ko5yd=Ll^)t$G$krOG! +zN%I`Q*JgF(%8_z(V}wxUvAy(~y0>~n@M6slir+Setl0jtA%3yFLe=vOmu+ +z{{+3uf(T!qmw!;tDVWliTi2@VZvaSJ?F|iROTJAHfZoh1`&@NFvTZGF? +ztbq@AAZ2lm5XlZlK)fGN{CJomO+5*hbs!a6*DXzoQ2_%xtO3LxaAJlvu-Hj138`7p +z^Utu_Bv=Bj?LaDt-SQ`wQ92~wnyr(LU=mU$QKd%8DhA*S#g>r73=|mO0~S3AGmf{C +zDF;xYBn!=1l|L>By@-P3TZZNRAdT(`ZFvG$l*~e?PprWN_~!g-mO#6bj)D-Z(|lg4 +z#cVf+x{uR{CZ<_=ZPv;5=9S`O*|HFH>&xVZ%uUk1p1<(0+TvD@w4F_sZ~X}@>8cYx +zdUPVHZuj47qwKo1^;^J03@BNDUaZmamdqGG&t~`vuRWzUl6Pg_f*;dZ*XIp2^2uur +z4tqyA%^h;*vAuViCXN)FOZ$v|*CfDS +z+-yR4=HHZws}Tet3o4oZRHICS5o1v(VB2Vg?C{^aR@TG;M1!xw`Q#hGM*DAN77j~H +z+S+8yC~Rie|IV2gy^RTT42^GiC)B;0qWy@rBPRbpbQE|nzQA2j^+4i^~AGPJh^mO%G`m#w +zym;hN>BZ-@gLd8@O%>+_5#^tiA9fu%*1t=qMA7}l41OnQm;JC!*SO +z$UKK=!M-$|&|#KILHHjv%b0VNIybo;|NYeLuXAq;(fjIE7Ps>aw%^&UIQ98nuBAGjE8x5St7dZvAFmem~5JiQNGQIV%fPozN(>T(bA_jlgcct%KTcMk0_z151 +z0Iq>F%+O1B5%L_oAYzjFy9n6(nYnF|(j^{4Lz*k%Wk+XSddyup7osMtYD1*U6apfh +z0OyNVaP6Wb;#U#gGByR(fj)6bddmfV+mF4RZuW&nunZPM!}W#f##Zvge`;Q!`0Jm~ +z0SBFX6k&YX-NIBA0jVoq!>yC<@o#BFAOAkM1remrYi322d@nF~mBkPACvqyq^`0Gj +zhn*3!s1)$op*H!e4`Ixj%VL3?QkHq6uCi +zac7%Ye!;ltrSo=`{&`k%!ym~%3!k-_Snqr5t(${toGj|onth|$JejpOdDG0{Tvo*C +zR!a-tVSC-&x1O%U`cBWQOU}$Ls5MWFj@ZqA255|M$DP}+#pXcvY!>!TjD>tWUR}YQ +z*W2|@n(qL8T~smoGAgCXwQHp?9JkliaEnOehlXEb&n>Clm=V(Qmb}hie=y8H1vU6M +zn}Z=I^`@4tdTtYo6|;f52@~ZEq*<%KT4g=_V**`Poug>KLH1vD{!=H(S0sLnFrM-- +z>X(%uf8Ez;V7ifCzUu-?-WTPz8`AYAZrcD!(=(cjBSG8+xwY;_thUFRA5 +z8Feq0G6KYno)hv;V^4)ysuX89PA2$CaSX>Ry(5oE4Tsc-M<+y^E-xDcqY}5`t#w}5 +zso&}cs0R&KeQPpT46C!i@t4X(O)j&yhPj5oZSVIrjGCONt^+~Tb&PiKWDwo@bd$B0 +zXw`ML@z2p@`K79`Ai7^ptRgx{)d-9p%c;uE`s1ribj)0IT$5gyEKterkxo=n< +zDaNn>fiRZ7(X{9VG*@n;-shd$6Woj +zMnzxXKaNFi3C`FE$3y9oh0d@c6)|t)X_#Av^s?A1;z$U(e_4$6Nh$JxhKJ>2R33Y5 +zvP*c%I^?)!$y6vAX`@M)j}h0pr4+70Z8XCd;#3aTg_s-ns_oUVwcGaI^vp->NN=HT +zv4KX%l}rz;AGR$h92{-fI`mT`fcT3(f6#}H)S?Rl9~r27F5zO@yXx8&yBJdq+sRKx +zFd9K>zqAl7bx2_gu*nV7ClftzTRV=v?$b$8kY(WXU}CcM>-pfE~Q`)6fnkgs)+Ad +za|o5*4Gq_Htv}U`^e-%-*9#0=nYP~C{~LF+uY0sJW`42@Qk6COF|nJBrv6R)qoZ!7 +znNc@Mr~G@?nvSF2yQ2iN0~l8b0cIm~48z}mK&#;hIm%onYC5e$JUZk@O(t$81YUr&C__QVwC>%`B=F($sU6pjYNL?TP* +z7K%;Mq6M@D4ltY0N{dF)Qh5Hf6@5tYp0}7-wk)MvDvBi^AErg@^(0q3qriNMN(3)4 +z`Z^>|>}mSw(b0;nc0p5O81}WkmHQymJ}fXIt4tWS$DF$mZ!mg=niW+)B4Z~~jS&Wv +z5*_cLHM33B?yA>|sP#8mZyJpJ4{fh#8-zj|`RmW_bqD{&fe4JtD7x&$3TcfCzMrDw +ziFabjpY#@afoenV;mPsl`Qq4%&iL{bYdqWWXP*L6?FW8o^vn7mx{$lK!Tj4%&!CaD8lucG +zSw{e0FF(L6hiGN|BgYIXX4nXcxLH@y$%y>1dwr2H_HZC^{d5|t9vt^407EYXC5>x| +zVHazZ7}}9zJ(p-0wITZ9n*W%&BQctmon0_E80~m!78We1WzxF~-~cthp9u@UzDf*0 +zd`!cYjkeSesL0WRd6TTc!uZj0lZtehDEF0f*{$Tz(ecBxw6k;3bZ?hCOfq=?i}2f{2bycgs5KA +z*Ln7RWy7(vj56s&be^Sch4=EK>^^Og!Bz!bP(H)ej;4OA@Zi$sqOzozY3g4RRyAhX +zc6}c^x3!3Jy;)D})=T+U$4F2Oi +zV&>xom!zh1@{)$_1f=gw%(_loqdvBbA0g^UU6mYFJw!vA>{W= +z;9rRi3-|G#0UqoH;roK^`6420xfuSRs2LWM|Cn61r6Y|_l`Xe40`RFap+$^}v@$-c +zN%$gv#N+Lc|6B9@4@jDpdO@K;4~|msuF#0&*I)@DS)cZ^=by{%`Wv0AHYYH6_0;i` +zFus8*Yza9v;YYLl@U(Q&kK5f_Q4RD9hri1|2J8&Aiv9c~LdYnUkvm7Fn@)WvacZe& +zB8=c=woI*C8JDKPcQ;^}yJlJwJ5Ks$&VO$^+Q9^wd?WDX>?_YWCFgaxODkn>EFiBw +zjObPe4;o-?zXSW9@bH0ty>ry>0y2^UX~NrsKg#pE1)1A^SIdHVTv;D1>OMsNTgVrV~;ck;c?X`uTf2VxqDZ!+ErPOT$x*RlY8nVM6xKz?kEVM;B5UpqwAS-u +zKo7FH9`AU765a`+>UIM9@zjW*iw7k;mfKUDZ?2+_mK!+omwzab;J7S0NerA+g;%aPM{75=lw7vB*{xdmh9OydzH1RX8{TMXNM~sARXL`-r7U +zhGAm$$^_UcKfpb24B=Hxn{DwZCI%P~rD#}1?s;#&I +zlRGP4EBdF%s7E4U22kv3wvqeIE=J4|TaN9uOsAaw)QqkN*G`{aOtxGV8zhD~kzLMY +zq0gt4wHzIfd!cyU#x0F=qc51TWzh*CVxutqU8T|8r0;x1$pZ&d*aR68_v?ywIS(uUi^0y|zY^u}| +zt|+bdmxXmJ(w+PlhFg6!I!i@u_Td@}!*ik2HV?{k_D)tb0xPp4M+pugmD#g4I3tqC +z)b_)?!r&^V(Gyo4wzyHCPhEA?3nn(+sD^Pj3ZPKIW~$LKvRZ=-MUEibI~*;>-dYc} +zR3j~9k~1SWs;zi}h5~XS*&ZQ^cEhdioXyUk6R++}aiN-pt%A(7J-${5j1m-}^$^?O +zr`7&-I}=-yhIMKw68|?AT3dqx;`eaxnYNs$;H{y{-r~81M}tqo>yWP>2hkwu2-dqy +z1EnkH$jo-mg52W@y@kd9_p#n-+zUVB$Ak9t7$ntW$q+QgDxG;s1OYwtG|~&kQy=ST +z!M!isez(Lsn~do3xRTpSvS|_+ri038_tX=cs9_%WY%7W<)G!plIj^n`$|yn{kF*iM +zvKyN`86HOn+*;-^sJ=-OfC0IeN}LaQT|rYneg91WZCj)%;&IADIPR8wGKxoks2rS3SSQ7fI&Ku%Tjq2d1#Q@OO}*W5{^^ +z)%`HZ7ka~0jn?sUFX-r+n^CE-?#6~QIuCmu-z8%*Hm&2>WwcP==T_oh86YByS~V}$ +z@wu@dLlvI#6az6oSB8E-$S}kE8(1QimtwArXA&X8CO_5kq3gxrU7h_xUnvv#0<7Yz +zK9d&Ca>$QFH*|^puNsH~MvflOc3J2A{EsXiE)RtCY!R*XLa2imJUT(bn!C*XJjgHL +zIvJChI_uztJ5TH+bDjz4=|{=NU%c*qml9(R8i9(uceYB +zj?w^vLQ>W^@+}DzDTqC0kpyCZzZeJ;si0MS4@V>kTq)b4@ONK!mVOBK=~FXqPYbq= +zBlsP;Nnsb}_oj&?5g_^V%tn(hmp#*i;fxB*>2$kK5N|`%+@GG+b)wL-)w)z6RgW9M +zsz37f-t3*-7NFcg_W-F&DwmQuUy^7buJpzY-=SP2Hx8k1E=?*hbDM96bbo6kOx_&g +zEdMZUl4D`w%v1_XEAG4Y>mcS(7hjdJ>2ES7X_dhSWUvMuuoY36-L%hnU= +ze+3u5@CW7uX8sHB7a8*;*`c|UuDUZTi}S%QV;VyP>!9K>!1xXTrflL|%@Zw}VC@s?EnA( + +literal 0 +HcmV?d00001 + +diff --git a/feeds/luci/applications/luci-app-pbx/root/etc/pbx-asterisk/sounds/agent-incorrect.gsm b/feeds/luci/applications/luci-app-pbx/root/etc/pbx-asterisk/sounds/agent-incorrect.gsm +new file mode 100644 +index 0000000000000000000000000000000000000000..27d934beb0b082969f9a55e9b4d6cb55cc4cfebb +GIT binary patch +literal 8085 +zcmWl7cR|;MVR+L9Oo66vdT_xWL?7Fi`8tmT4I%cHqiASne&( +z%oG(zrSJwp&=PRrXm|U*zkYwc{&_vG=db5^y`D#OGAqHz$H1?G15^4KxJmJFi1;Ex +zO5rGgJ@ycq+oC8gcQeFi#2!R+lcrrnEaH)nYy%`D0S+k`8It0;Qei`CaB|u`d!1_= +zm3?mz3i7JC@*X^zW>=sbaZM%`viN7Zh>4_d4+~G)n(qWpLFrznOmd{S-g7~t9U5L! +z3H+<{GfAZrm`I$-?m9zPlcTlvV*=85dJzO5z%5nKg=FaDeJgA*)iAXhUZkN2813Ci$HV-O|_ +zZy>o+c7ryMp3x${VGcd&XH)T>Y^_YTFHd*tp3UI!H$D5$;d)O1spQ(ymV?(dy}cEw +z?yT2@Zh(+;0;=<*gMc(%tXL}pzIdADu9&+3Esafhw%((HH9kAuzOI2YkP>ZuuxT+- +zXlt|T!Hhlj*~|9y(!pbk_$vaoo9!vw1S5q$-AUpt2-7{@)0Wl|(zj>$DKpQ&ICxSD +zYg$4hRWftRel11&3wsi+Bbdx%i@5}T$|h4j<#IM&>lV`u7)o$@Rb3vAp<+spP#;IS9z_m@J@N}kNc^^Oli;$t~0@~8jlhV;M+wxys1ds9h_ +z6JO{{z6GNO9*OX3y%FHR_t&t)Wvm_P^M+Oa*N$B{1%(4XFKlEVrUg~a45jLvmTIO5 +zw2LiZG->WsnF|(_TEEY-6HA(JKZy!7ooh*9gIY`zb?>LiTM{MOl$TP`n+s>Nf_e5j +zyko7HWVpUB>}}_RJZf{*kx&b70ioA?fq4R+7y9r?WJxB55lXhX83Cw&w +zqfu`ti*e-0&i2srKliuX(ioDTYxZ{eV8ki7GWl{n$&x0 +zzy;oyXg!TEmDQ%=~kYV$^?!c-6?nZ`4ndyG#CAFJ!|Xfh8BYur15V +zJ?Sm94cc)g-)^;Y?IJG37Sx$NT>Ge;&5ut%NyqHBukbt@+CI9moo8y)eLvm2qcft% +z$U7;&Z;Wq7iBVxzj!8R2RhUexXeK-f^9ES)t_ONXS}9fyL +zm#>x-`}tV~NNEK?<8J|UYSriqZ!gJTXL7|?Lk<+ilT)4|jH?0nvZA{83A>39;~Ocf +zS6}>wt+L$}CFq|z?$-j-q73S{l8K;V9UR)k=f~itVzkP!yvMy(nCPPQgRl8ZtkuMp +zPwwTz38K~N!>69N1eN%ZUrzfWmVs@{1!DE#)MK-u(N479+|*FjPV{$W4c;PtBR!_M8d9Q`jtqRO2K^@8 +zwV3XF(wG#~hH}<;n8w@Xw`8pR>;I4*)Op;330B$LGTyO`)09b&Ej0H%1%Ip^F!frH +zp(cNpBanJ1$Sbd$`m=Q9$yb$KcwctMN~vAbLh||Y3e?n8qx#EHbPGI#08^rKVXyE2 +zGqBNL8mU}gF!zir3~YvDu5e_*B-Wer?u{6d>@rzqgTW5~B;lfHJ#C%ayKP%@<9l!H +zjIS2VrZAMO#vn~>4_ey|64)4#X?mOb;J2{y;faDU-jeojiS!5!I~lGwqtNrBHledZ +zSbw|m{@8b)jr{CEW9|vR#w1{38or^&qZx6m?xxR`^TPE9ZATc*h7igzWkRDsbK){}Tr@^Y@SVK0alT`FQ=*PT+$DrE>e#&tJ$>~&x8@PXU|Z;fbM +zNNX9g*I0DYD{5@*(IG!U(8?OibU7*}dX3IfxWgBBFU8pQG4>0q(Q+r1(O3qdH~QV4 +zH;-;#$X6Kv|3@92ez)QPq+bE(+50Eel;P9d!2Ty!pWCcHwxNkw=NeIbgN>eIK_Cv0Yn1EyK +z7g7wzhv&x68TW4kOX)|o{K +zlhCoV-7v02nL1ZoUtfT?SlxuKDTsI80982p7*(AWnf#~ZwTqqX)*qk>9!$x1vXru# +zFDLd!iopJCt|FpnCxu;J>c}*;O_o}ha>P>ns +zU=F}B*WJeCcusLUGxGa1+>;G%%;g(LjGELBd^VpN6CHzn#1LG1HFrg|DVG}CYWw+2 +zaI*H(Z|ZQ-=f55k0zr97Ds};UQlUEoss`7hJB^k6x<091G`-rXRf#~O`LANVaaHn>e8^KC&|cB!~$3qNp65pwo_qCESk-x%n|TVf4b0_SW*s +zEZ)rQR5%dk`7tEPnGi#YPm5pe!v*xJ0gRO-g0*ocg9oNL(8cDFn&tIl-K~7scgqab +z-_h*qTUqx|lmO=K9@F#I6xKG1_~w33aJ?BF;7)#kBLK1P+TE +zu$l#TvKdZp|I(6K(2)0H|7%$Y=3Vhv`?zfw$wnzK#+hr#>bASROHQq-vyXfIdt_^~ +z0owvANo}zCh<@xL*l4cWpH2$Goa!~a(eTq-%7iF`7YL$yqwhBGnz1AdP+zgO|E>k% +zbv~;gv%#ZThpm?N@TMsJJb27_pzP9Ck&u09I>H#36nCE7yc+ZheJLi1K93{`X+~zar7xjFZ&6hJQJGr;!B;R +zsiK6||H>XhnUnf_FHxo!?p!g2DAGeF8g!^khaL!8xX`W#-QRh>f(O1f=XQ +zE%B=jl$jUN3kjO^{udLxB?`il1Re>{xp6fY +zGU-y~rY1=^9EN>0J|58e<3jHG+3k9h;Q5W)M%DqB_*w#Wh2ES$DktG{qd#ITB6l{A9RM|>$NGTSV#+Sgnf-|DpzU%WQ^voKRs +zDO|gtwdIQ(o(4(|>y)$`U4hao@7iEzU(w(HUKaU&qfvufZe +z(?9jDLunWi4to5x)C~#Eeg+OT?*-?d`Ab;uqW5>GYafHcAMI_rQJ3hVAIhFL?FclF +znlcld<|sum(DlYtmh;#^(1$`(o=%L!f{k#EjWTUnQ!l+V+ixjWoi$m?hkRps5wk-*+cIkFUkp>h|ah +zly^E5;=^|QN2VRUF;O9J +zKqn3r|D*UYrT4R)bfMU|_*wbz$i-RY +z>o=RxSnuoQfb{OBd~xCjL)0#p0wrnTzeLPKy2poEbtJ_plSx>>g7l<{L>iwAB99m3 +zxYk9teDr-lue|lE*Wm}Tl5;(fGEu29o-%Io3YuthB@<~U>^KsW>5_E~ZAHzD>py43 +z;|oJBY-v1?yIFn%^6v<LDQVo8{|S&8xkAq +z_Il?sj8^oEzF6s?CAjyJrMSY8-nDXgO>$;D%eA83aAV)i*&A0sJStvwNAd5ntX)Aj +z&)#+C47YPDp1J+okXLfzZv3Q?*Hpbw<`3czuZP^)CN$oen@qet0p5fiUsl**?na*s} +zLR5yn%w)~61GeT3xQYLP68Wd|YYHAaLIV>wlm&+MTTQ*#m5AWN%BKcfdrx3y>SOsE +zvD^GW$Fb8z6Q%u*lNP-w&AD2RlmiY+iLfYlRBQQ4h{jxZT*zo=%%p_>zRLCZW3F}v +z{FBXvkkP-A61oHUmd(x5aQR)`2Ml#o#KeTKZr%6N6qeHcdP6azOMyJ)TUGu@E{zIm +zN?=P%oUTQBofDQCA!x|qx2291H0#g(qIkcgvDGG6h4JlZ|2f2BMsJ9(x9RLZp8iEs +z^3Bn?PojoM_Wq)#-0yz66j@}=`6u55R5U%6SjX*JYO-EB&MXpc->+7qsvJIf8wZM8 +z22msv#bb|8O>8B{q-f!MbhUN*k` +zq?kkvrOT_2IL6W%SPWcco)>4s!7U9yK_m)-{GG-B@pi4CP_9qC{EJ~>UD~wY^5k+I +z#JB9z;L1M4tg5$s{(VJ)QAwnZeZIY3sUiEuj)jjRVj;%W4ZOM+iJQE1cpg6(6SY=5 +zvxFbetd0nQoY7tLA9-c{B3ssaQ3{(=4-&3MN!8ztA+1IKEAVp)WyeBf%o#TY?j>}q +z@lsj!J{r*EQjm0mfRy1lioD$~bfTS-|FGt2qvN@}>ArHDw+vAI9P+2orP&|689{Xe +z*SCvXq_*P5+!wREtT{`(J-=?69Zim{A;nMn{kf)5Yjz}Z +zi4!hK%p(cHH>Wa+e1t-a)1V@rmu%`*WWG~N*~UP{ct?h$nJ)5ZZR9DNjX&p4#o0Kr +z&*iZbvaNen*;5I~Up@52syxlgtCL>$txr|3HU_oP4*vwOi^Cs(j?82`TpcOV#U8u(>HZ7i(Lw^QgQTr +zqOTV)n)t5<5+QDD(bL}=OHAEcav^|mPM@fL-Z!=fVmbI?ZG33wFdQOySK+6h+Ni42 +z4O;b?=@XQ6`rv%}Ww^ezG>WdA@Uu+Nn-P1decK$^?2~Rc!OL-+g?F1U1^Tnzjc-It +zw}e`NZ3d3tGwJ&R=X&%;_A1XeZ0Y(MtLF29_H`yW2G8mTx|5iabgnCqyryVlm}#%^ +ziRn3LG{ttjh3PPs_US$F*O*jMq>7>jBptw;H1WsG7pL>b~sWd<6UqQoV;|2*#i|1%0&);$3mCiH*? +zc-Itody8jL+=XDpu`w`8c!gyq=#H}X%P~c~ZmCz08kk$SzOr1)>mWRA?Qu>HsK-qO +zoJqn@OL)$^KMe~?>Y)wPXQ;}<>`2@z5X$YG9(9*2co+3y8a;kmtA}eGXwriXuy^P{ +za0l_gmkxxne{0YG_#dKMJ$n#8ms6)_`?5>^p!FpWu#Q!&xkWu?I;>JYWBA+UCRq^- +z*Q4Jx7)3ZwFwi=W$M(OW6QMOx&?$#UliK{|@^$y|@u-kcR#TM8xCM2%FiPF{BO128 +z4RyL-#4YEq6)5OqE;B?I4`=T9w&&wfxqsH9v6iKekz+Pw=+-auR`dk%^xmx>NL{cA +zM~iruLGXy9Lz5_5y5VSRi$bo<<1(yDeeM+sz=0r9?PXsoS8;966qu?Ck=LHpB}_)m +zTQqIf?i#chIk_>GM>ZkF7Jl-Jkhh&7)uIudU`^MM1+%QF7t5KLDCGY%BWpubdY$=A +zFA!3~+V_4Ml)p*3fG{EJ@hp*soF~F$ejP8dxCup7ez2g$vWPV+&Eid85n5%vo?%;9 +z*n4{DqczwjBse&bP0jG?QUvlw`MXGcA)9e|Hn5%z_D9kJo6@@M5}SjQgRrnK5y2Wl +z5N=8!jL!<3ZA>0W$5eWzA( +zLbUuKNM18P(1I5$&uF_BeGx{c3TB_Xe_Kd{2|~=^CV0pq>V^HOnEpuAVH50*D@6D@ +ztzZ`Q=o@_&Y#GJo2{sW5lsg-=!(FADUrM|^;4ccll}kpMxrB6lD9cm(qC{2uzS+-? +zgeLtbiUQZ{eUZ+O%8q(IYqS-$7p5HABW;QvSmGHpqz5%DJ%KBeu@lEvCX2#G~5BKL_$T<_fIhpXGp3Jb~dg6|oC=v^88{$OtYWgYR`TzAjdcdRkedR+Sp +zk6dGowZ6Rh4?cBOxT}K@od+~gJz(L;MdTb76> +ztVprxf!0!Sq(ZCo7;ZUlp8SvdVr9KRFw`ilv~mG|o%J2}amc2h9C(|)!mT~XE_`oZ +z`Q9}!1X1^IrW}9_+HZuiKKVVvQe^yINhy8lm*+!=2hKw8Ym}xv_rQD9dYyQ +z1p^U#ulFhrxX(6xaS9o8n4gf02iQ)bmU*+8C?m7h;X}S?L-uM>$rCiQDlxquG~d`A +zLu1Nq4N0BrC_~Gg+Y_MrQM-TAMd-%bB3A*D +zuKCu@=R=l<^^^h&G!m72X@02(RuMgR>G%h+qP>=J@yeD-$S7p=g#;ooFDL*_@@y6p +zcAuiG;QINGY(g{~WVx*JN4upG{1=79I0KzKG~=w*WiA|=HhoF(uveMqDRCjYEEPwK +z_-sw6hh@=&EfJ31n;6D={fUR&|5aE{loR>`eb&?>3e8x6<_l%uG;mJ>|HD +z)4pnYKd7AJ{IcElv1&L1X%3!`qF+kVwkkwr?H@+Mqfm-eW=P{AIyzm;o1qdO4{H^$ +zqnDKl02UpCl#&8MnzCXy$VX=aja}pLuqI(pV5clN%OWqzVW|VL-?DMizlZVRL=VX- +z6k)GPwfh$cirZQ2Q;G`j0RuzaYj22r{V2$=l8V%hax&@B7exUJfomai5B#%>*Flp` +zEn1mU*n|SE(cW<(#>qsGCyoS4;^e5Qy<0|=9Q7BG8s)9t{6u+qFlo6mp)R7v&&&`w +zma<%suy4lbJ)$yUA52EMq7X#%7R0)qPKr3>-0ZaewZ)D!X>S)hJ*NRz+h|PgX~yl% +z4R?SEQzAd>6|v-iC~Q;u+DO#WX?TWU#8Oa0{w3_qRwlIQD4aZQs!!?(MZc_p2oV#z +zsO!%anK@nlgUQ6v>yH9xO)F0J`jrD%p>E*nVyfZ3YCrgTTCGUK*FvyX=L&E50dn1O +zFxd;U3W!o-7B}}XDkxLZyGC#}6l!$a#a)KG#<*42pw>LC5*_^|R*PKMyk4ovD6IPi +zKNYflD-(NP*U+Zs>uRn9{DeYp=&XFDu5u>`xHpQ7{LTz?+wofTwJGqOk%wN^*9k&h +zbS3%W^PsMu=%_`*_??bEW${I}77}xM)PSdGZQ3sk^tz&zJz`rPT<+gE(x)U%C`Rw~ +z8@Kd>ME8P0WU~{%o21y_ian-F9Sb1Y|9>mOy109g7>eCe{5?A<4IvetOtorg9+EYeB+nk(`m-xQa#zm5(}ahz +zUYUVOu*xmM& +zaBTV@3gmSQB9{AALfE;wH~elZo5@#7LYqHIUptSsZ)FrWpKYn4zZNcbmw#Wl&fCuJ +zQfBepRy=!TuLXB7d5G>Q=PyZ=qO*YF7VR*(fu;8h6_b;tZE@*7BxfIggYqm^5EuMI +z3Ziiq0_o7rImo9`yEVUBe8--8wbR?E6-m|oU;GI87BSD18d*iiLR37I}95RsF +zXprh|1NI!-?1+AP&G(CVc0u>KI4Q>dc$*}q$uzija+;k5;+(}!7 +zw!)QWmL?u@u@W*GS0E7)3v)l*m(d)J0RP%zs?)h>m%bZe;T%P18C$rR(^*=ycp{_J +z<>rmyZX*(J;AKW%csi62nx&)ntXUy4jz3eAKP-+79+QP;{flQe` +z`R0nSA^lHKkrNcA$PHZ>jdQ<_(TxD-M|#0l%QCaGXx$~^lM%|us7%6ZTpX~&n!cQX3R^Ek^=Gt3)BLio>{K6F|5a2gYR>&SHmPvchkk;8Na+U-wC@k#Cl +zy(Y=`B#2YtOCA^T6Yraxdi*Dbmvggns&ims5hQMXYHD|?tC2-m_1MXDev`BRWb3^H_acbh +zRzO6WsS`Ih0P8W1NgGW%tv~KQ8mYO6+6&>;Up#=j@N%ZL8&+~R)AaG7`I@`CsMZ)A +zC+_axv-(FMgAd=^9CA?$%~Fh^u@5J&CP`SFp?#|UGnFe>{GlqgPJCPIPLWv(ahb>hGGi4{((qdS(FHlOt(pSBE&yaFz)dm^fv +zQk1_UJ^VICYbEa>79;7f<)2Q&K`%C3g$cib()R(1_%Va@6*n-o_t-4RXuDuwEd2LG +zmQ#A9q}B~k41nQ2^Zcs=(Pq`;KJD3REe-8A?QFP@J!Yu>$Mnj*z9U*w$D41)jqSBR +zv*8AwgJ@X@vvYJJ;zj^i8m&tJC@QFSYA&NFyZ%w# +zqZ-=SSel1jO!-wCtUnhJFWIdE-ffq`6nhX|@J3$GQ}}bv9eeFA35>A=@If_VQ%{hr +z!!5bPFDD`t<{+%KogY9sFM54egdusNg5Q1w*8FG*U5)*Ql%Rt{t{+W^0>iMCzL6e@ +zCalqRJw1RaijA!O5QaN1??_gTXmLxYLegp>`woS7>5Z9QUy2-qW1r)+G2+6NKvU>3mC!PIB}lO=q@ +zg--T@i&17_&t6q@Vj*+Zqr7~KHS=M|oaOM;nT#IyuHh}yW%Wvl#=9@BXy1(V1FcZU +z|Cb;8%d8EGcaF8zw)yyUG{_5AZ}x1HO*-43%-IwKl&m}ss31;72gdWq4*q>HoN5PS +z_*=H2<>0H_XepuksB`m&_GIs_Zq?J5cF87H?589B-AAi9R10ghca?;bR;i2juDIdJ +zQ!=Of%+4HRRu}PC^Gs#x?+~jAT$b26?fB%XP49&S{?aP`&>wk{nQ{xVVwhi|B&4a% +zG|Av{GIBDk>tqbpIfh?6fJi@elPa#UGU?eDa&uKHB1t +z8ZvKY_I=HSkvwYnWJmZiu+&uu7UZ2$c6iF`5FJuRVuRl46z +zo@Z}F%d!TSa_3# +zA2#b3<+K|)QWgLBaBN=8P?5=>0RiL|F{Ie-G+_SXsQ;bZruzhw{Jai(NJ6)n+#4dK +zab?L*9U8rCmqeeK>oaLvpXDSoLjNR0j{YorG0AUHkAcz;H1|_nl|Tw1MdwAq7>GEo +z9MG0T6wSg0khWjjk5=77;Z5+p3gDKrI_r+J&qPu^t=ozJg~a(|JKCY8*bDw__zPU= +zxCSIzF8ivZnp((B=a-#0{3180GV;ma>1Uyh->M0ZtOEdqOU)4$-c?zQSdDI2Z^nO~ +ziZ(-hC9}Wcpr`|v27VBwIO8h?F15?}+WFFG*jq1GIW7Vs3zQU(JDY#?GE5hKNFvGv +z;L*xn?vo0qHwrvD~(tCYzTA4u)b$h*fkGNNibP +z=JWhf^7$4r=6Pd7eP`~yU@Mf7`z2AZl|4A2PX<_&5Ds*}xRHg8+zzB<<5thV1NZLJ +z?d*IVm}6s5Y=#rzvslh;F_$r3jih#`7lG8_uEB`?h=nYU +z;l8D)r$W5V4r3-SL%m$9eB12js9Xi`zMyK-H^=`05$lgOAD0oOY_#gcapL)F=&=`; +zd9EFRaS8SZwA&#OerbT7ecbu!=!;I1bGrX@MU6UYO?`IV6h;xYGI%B?x{2zDb>rb9 +zq~Htd?}bRuzDM4S+pS)p*=umk5v;zaaDRP +zDMvOfwN;DIj?KqaO5Jk3|LFAajI-PsvIZ>t+aCFwFt#Z!7D@X +zC#9msj5^0H!8;JXXTC17=j0jgYTX{)kri0=rlWb0-)N)gWC0DdZ4!T>@o>owv!8gD +zu3%;&KUoY5cQR(Xv;lXaWqPeI!{mlV9=oJ=F}TAh;|Sx*`0>!L`E6rlLvUxw%tkf7 +zvTkT5gwnHt&Ttil^jg&o@ha3!ahnWDrMfRpXx@sitf6;LKOSal7AFqlp(ksGqr<88 +z`e@_Zyqo#mLQY5`W_$PDNt}N7Hk(^j@ImCwTzm6?l0s*$WrrQSH1pp^1lJDBT<}e` +zJ4>!EBzp{pu|Cws-w1ekG9t?Ljc_HT(u=!z65aZjbiXk?{Tkl!)g5TuXsTK +zhNEtYeDrbwep`X>A;`=#F@9@npIJo)dRu&Vz-qgsWq(%)>RA+K0ylc4!v2<%t`(j@fT9h6<>2=CNxU6k>zuP1^P__w20$5;U$y +zlg`JowEUKR8&ST)fgpj0n|SWprqWkAek5Wp%s*3?(!^g4#38FFf0+l5z(*frti{J} +zd;~o=^;TKU9`71;C}CSfgfh{`5f=~K7|OGoD`$z11#TS)+s&(~#Z*P??yUH=jurv# +zH6Tvu<4iD_WMm!iBzn0<05((Mc-7J13zb`@HB*k-#|77P-ehE+L0e#fC#g)m=-qb= +zW9z|hcf+;=zE#dR&KV~0X){B<{r)sdU^afC1iyHl;1eXnUzt;q`T64Aftb`jT>_)e +zn8FG);L!Uzri9^zZzkmIp7eW~U-+zTQ{!V~<`U(k9rJ7gY +zn5ueARX|AQCV1x?q=Ezw8Km2X5c`aFes)%p+~<8xnL(&Qs#z0Slu6nHS9wBji1#-r +ONHJ3Nf1n`$&wl`yp0Q&9 + +literal 0 +HcmV?d00001 + +diff --git a/feeds/luci/applications/luci-app-pbx/root/etc/pbx-asterisk/sounds/auth-incorrect.gsm b/feeds/luci/applications/luci-app-pbx/root/etc/pbx-asterisk/sounds/auth-incorrect.gsm +new file mode 100644 +index 0000000000000000000000000000000000000000..12fec25d56cf39e92b04ae899eed85d34d994931 +GIT binary patch +literal 7458 +zcmXwdc~sH~)OJ(0Z&PYbf|CjE+SH`Dw2Y-9V4Aoqk|Jt?g1NR>O}Ui|mZ&YFserg3 +zmK%z;xS)b-!jDZzO~75VWtyp(-tX)E% +z9QpP4j&6HM3Wt8Na#BoQ#%5Lm8(%AaxiSP(CVCx|eWI1(aR9J>i>^)H_2s|omExfS +z*zYY)MBtd}IzRiCydiJDZa~vAdb{FZ-=ycjSWHs>o9uy_FpH^HQ*FF^hCDv@NnYWe +zTq{gjZvOa-Tk6c>$v5REi3gVC%@;iA?gykxp>r;8o`3v+Za+E1i5|K<^vQ;$IStPY`3-+0}sQtJ8_Zm*WQ~as*%A^H{DFa(2JNws@ +zz0I?d6+eZN?cTr1@YQ5O?SV@Q*AF$dQ +zK)s)$ZYm<{icjoOZUq?zNUY=Ro>W;2l!U)QlDT=`C}nL0(i}itos^jV{<^NX4~R)3 +z9wKepLvXrmHmTix^8UWsDWMSR)udTty6Qe0|5+Ll8Zfe+wL>Ej40ST%N*|vFb!tvM +zva%O0F$Bg=G+&u%nshj>4>?Jo-B9rXh_6t0L5-ZELs-f5t-F)sH_I(E4-{9XZz@ZP +z;4d(+U`t`9bhesv*{A7g`oGTA%O(n&R*~PIu6BCO4c;{-VTW-JOWrK_ur|f6w+^OG +zxEdl)c=<#bDj*!Vzu}aRK%sNZ(K=CkukZMB+)}OkuMLo$06um~S2Y*^8L>SopTXO8 +z?bAc~R(oAa$Fw(dNG}KRT5Mjn5Ab1F?;^n7GwDtqIqipQXB&1A5v)a1Qg}%RNYqe_ +z()v}OQNv8Y92eyIK-h71b>~UPlRkdc@cEiU#$wCNyCILg#@z)( +zPSMAx=b;0Q4nR~CwG+z}?`SOkled|-4`tqqwYUIAyMw#32S*!gB@#1Nu~Qhr7rJT> +z!o}3+KB|G>)W2|iQjP&;t|4x3-b-R^d{wwDU+9HA5H7ub_o%yZ50nS~VoK{Vh0Qkp +zLzBc9Vq$Tc0aZeqSla*dtef~KZnk}2iT`sPy^~)@fJg~?5uaZVNM}E^K*RWqW0<-l +zVf3Zk+>fWjG(+VaX05blS6D+>=2dK}ergy$JyOaI4T~IGtwTayo3h>$=kQXd9*xoC +zI=KIzKHdx~i~4}WdgJz&L2YaFP^9ob0UsrU?wVFk_H}-#xV{xvT^B++*A>)1pqE^% +zCJa0?g1y)!Rf8|R70xRI1s%&_F{ZMIozyN<&s(46PF=b56yCj%AUUO3x +zwX?>uV@{spYCGL!l3Yt2P=WOLR-!Hy8 +zcOnGWmeyRQ$sh8{+Br^%0__Gm7yPz=eSLyf~;19NR5GeVnr+l_HcZ;)vw +zbr4C+DH+)Bf$$`WrF=XzIJ*cdr&+t9KghKUBS-rw19K9hD>bRy{Mn`yyTj$ke|#xi +z4Go!0%j#HJw6O#II1j)w)cAz9UwGGMef`N!1V9oxJh2#Hdbx|9Z0}em+l$3Eakv|E +z_3Z`)XOuMP7FzM^(FLKsUg1Bqr6HKAAXOycdq2whkrOX&UlbY +zK&Kxpe%#0wb3Apee3>X3`7#mRs|6(_kE5BEvsC;0XboSL8|omnJbk|ieRo*T%S(=~ +zu`l*&1kkku?7~Ks@4aYsf!9`=Jw|D9FlnjJCV}IAJ0~na|uQ6mdaNEM<$&0NVDIuzn-!5>g6MoBRw{Zu>%8c7< +z9h6xgXc$sEi0G!4)ZJXmY&*|Yk+`zXx}I|>Tnu&r2Z}d+7dCe?cr>6!QkSxp`LYhC +zIWSp;JMSPa_#1@J-uaMva_`uAmM+y+4J?-|_C+D56a=|=cpK*7jE;7c;Hsrwp1c&( +zj>+km2NtU7n~1g9$U%edgsD+xX;BBShHw#z;Eve@i& +zMzs?|j9{_L9YQA%Zbwp)v(oAF>WoUkaVVk=I}Vqd5<5rU%%NYrfr(Wn0JzA5A;J1F +zewp34(eUiy3kw@BX^%VT&7HL}_&)h5vS$bNd4pDLoMnhyGZI!ITY&{zmuz +zZwtBASG#Lh;6kXJ+ke2bi;Y-tLV~W2-cwN#K&eh_&~F~w_{$gAM!Xc+3Mx>~8*&qZ +zdkfHzks^up|tN7u-8%7-Z%f!|-#_qk>M0Eb_)ZWsA+sD*F!4-Bed1C}# +zFS6GZO0u$k;G6@#ccxslp~i~Pb#lPD4MeL!Nj0&={5LbLb5yR9T6vI&7%m-h_TV-` +z-%T2suO>QZB-*q#xyA^gL<&K3w*w=5Ji#}d%|Z)DAtT*Tt;kd(q30z8$90=7CCo#5 +zH`wC~hty@2_9lt$J5z5vTKhPNB}dXYil;_MC>gG7c80GMN+omQj`${)D!bCdfErLH +ziO5|QE`&R%r~}GIX9sP88#wzmd?klx)jNY=lI^V|VSTHIGL2xX93J@g275yeSEDhq +zkEPUsOP$?8g+h?z9i#c@bR!2%&jDm<5vWB*KknHFx5fhT?tqI_}GXujt~+LDw(E{e-3emX@5L>8Y2e{6$ud; +znQ96Jsv8>|ls~x34!79I$0~nd;Hn~w5b8vC$lMP^RC~w+=O2UM8X1<|R9XCkMd2Xy +z-UdfdAy?DwjL=YckVGTck1nPBeg3|Yr$$aHG7@sp*>5@35p-u<2u?o!Cq6+RPiY6_ +zV3*0KWQ+BcZ(RPsV#Nv1{cUfo*}r8KtDmmQmXI~NfMI3@WNvIwO=8g=FQnx(xmHXK +zr4@2ujZcWJWrg-m;-}@bkRtx6$P%-=N|O(|`Km9nZ3oIIgX=OljGnjv1#mab!1vwT +ze(iiyBolO|-mLd46zq;X8X0pxR-x+y`zljI<41FLto{OX`RnfXDlqzgD(|BF%0BiE +zWo>PK`8_>IuGYOY+P`yeip@Yt2C=oVE>+oQ$&SS`%l<@2U&Jxh62<9f=WkjPwFC<_ +z&m^Ai0fe=i1!WR=ao5b{DoUFM2o5}<+oZEwH~s3xB)HtL(A`hdmpX7&7F_2dzHgTo +z3WNlvg-k;e8jg>Y$7xuDxdTd)$pSOsl~|$^h*^DND5k}KG9YY9q1~3o(TvZPTr>|H +zJ@@kbZ;z{=^zmrqzzk8<(=X!TJ_mUXY8VgQ4fR5)2m6YF#+v8&s8lF= +zjuVI$2NvNTkH?Dl^cz1Rq*w*vA!n?ghggdt*cQDg$N=d;`xb)B-iV~*Dq?TbWCm9v +z?cJ5^v+c9o^rX*QO(vq)MG>;XryNDsGhUvPhc6PcpQ~R;_h>WaE3s6a_1;v&-*{X3(mhi)FiN>Qsk8|(G+EJE18gyi9fciQ!G}=vmYphmKRP^y@ +zK(}R`!U7~v@ +zwrQo1cjWGcFKRNZK~n3VaDEtNT~&MEDrdVEpc$aT6U>{z79Bx;lP?Wz6T%2`!hb&Ytb~wwNaEL7J%8KqTq5Ne% +zXi^mS#PRH1*SXe`>}7d{&Tk{as9_U=xm;L%llVXoHe4N~BJ?li&}HU>0T1P~JJ}(l +z{RsL8eo-E?y=`J6kT-|K`ygT_vaUT&ZB@ycy3Z7ptwdJ>uTiZ1^=v&S{QeF*5UMQCNWA)?{vH=Yyzv3Py2>wlJkfqQ(N_F$-2O%iOI#BFOrH#+OKnII=P8Zj +zCWZWdisx6*gQAK&lmrX?>v+yl3FfAQO8OidT{3!9F7q*677kB9&lw&VJc? +z@AG6y$e@LtVl^lzYd9u}3bU42N4+Z&Zu^y9%LdUtMyW^>I9K2&{G>*3!#S$N21xx8FQ|mbT{d^GeF4$vLLO +zoDFY9TvxU)(vRL7igNqcFC#!jLcH|Na3~}9KJyoFnWXxEMXT)KWPf)9Flp!(`Vy*` +z(qF+q)B=U@c^}q2>ebq}V&V-+m%sZx@e@bg8rH|sSq<3|RE^ +zPzP$=7t(o_!T78*!AQL(Hv#0UI|Q?(R(+vgPeMF3zSPE?NG4g=V>OpYbGoQlq(DV> +zoes&Wm6x#OlDgA-6S4FQUdM;Zv3z?8@`VaJ+ZLs3vlp8Vwi=@8O3e*@o3R9#iu6Ur +zV;=1bvAZ0i<-bKnRAMzf22_MrYOa4U4cm8wI>-0y>g|}ZdLigi^ZX1u#a(=9Uh`qB +zq#9b$7S`L$?BnfwQ+tk`i2;Rey<+SG#lLh-(cbQOEYU)B8(zD;QiE(8!gV(1bP8j~ +z@Y0=@m|If3nZfqWq=}e(PSwSp>F*?c1MY_9gS7oEBRIG=Pu}~cduX}HK2FMt&DBZm +zMH(1Ei!p2=^dTC5F)w_jNeH_#CwK6CwSAQhRd4e>gx`a<{+9!<`^znev=k@I9 +zs8k}$Y3$c7hiJ#({zF#Bn1wuR)tvW4O@le&|s;kKpMk^h7{ +z)kJ3tA~J&K5-nb)_CF`F`y2BP6}8%ZSh1{W}*3^wzY6?pD1GnTg~13dy6TnCQQG2w)e4H7lO3HS^{I +zN$yd#_)C&WZ<0BTzUClK5bRMlxsZ$oN*4}A6|70I>%Vz1O$f*C*Un%&V$?%c;MoyDW(+f`XlTEt&G +zwBo2}SM*vZ@JJ`Wd18S1Bx>+_4(t1Hq`eNNC0%^Q&ZKxa%1q61U4G0M5?@53$Bk9c +zVoBLVI`R>rrc|7IYE>MYZuy{4991=I7hXOHi9c5nN^(i9!}Dop5R>B6NaI5(S{G$b +z$Ni>-A58v$r15KvUvy}A+K!IG;a>sUNb>NV^PL*9`_^H^w!W0M|0pP?hIAhVV#6gwtWm3$EjrR!5Oan>|1q5%i!!)%! +zVPg72DcpJ0mW_oRX^v>I_3#jO>lD+=9>g9}6I|wH8@XiE@n3-wH(^6N5`3fbRUcVl +zBRAUZXKYgR!g&!)=}=E~J1RSbAlYK#R_ttdYiN{RYiQLp-c#uNNc+Pwwm(?)tji@u +z;U^(x>e5IjV9Ih>nU4tecCj5?alvPH4F&iP`N!^iktAW4fyx5+BA7`vI|El7V*-h# +zf%Q&-mJo2D;NrArS(Jpx#7F{d+N=t>FQ1WItSGJD{FZC=Dg59-!8i5+k6jYWOfx=b +zXm3EYyHy}crJINZbF3Wuh=CCHPDBmINd>U-rbpN)?juS&hz%d0H%FK>@E`3FFYIX4 +zB0eE6gaG(7wYs@_pqf(p0>kbC=fb`PH+0f+1T}tw&6NC3zF3>d_6Xb-ems#?>O0?% +zU-WR^m#;NW$eZ;=eWsJSOTfE)8J}U{r9uU?&}+SxE!>kjTtiM!`YmTRG8zBR-dJQ& +zJoiBU6IHi#nZrGzqYgoq(9a&HlN@b)ZcEi(tP7&Lxagk-dX7p8Y(ssGES3~we%{^f +zjKs;1_3j!Xc?FQOX&yxxN7^Cz?7uKBa8=VrEv6m`rXIcP`}6jiO;`_^nt0bBJQlIP +z2(j2pYvLaQg3B#>+8`*G2sbW`y2MFN?V?$m#6EF#W-CJX<;Q9BESi5L12uzFbTMOU#nBu1k&Q{u3f--Z}Np +z=4_2u@@p&9E})fBL_5q>4J>9xZ=&tCoThMO>Y_Xxx~w18CZ#n8d??LET~WXDm+pb30zG@)|0^F +zTwaC6b%4my0MGnLxfR+;ZGu!#vE^z#sYCrf+6_dK1y#AiD|1?W0CJ+`z7Kr{9dp%4 +zw9aQd{NZX?-H4_OW)u1^ +z0MqQDQgqKF*TqW*(a{#WNIbKuOK{*vIXa?mcT8KnIE-OxK(F2+=QyaCnZ7YpQzDab +zGrYj)gs%=+?d3`rS!EfHp>_U%Qf-yqy*O+tlu>2eqkoOBS*IuYV~;UK)+M;&ssf6j7Im*SK-dgj8NxARwX8r@6Ud=)L-t>Xjy`-lNywYfXx#jLZ?ZN|ExJzq)m!pt +z>m2=7v~|SbN!@D*n4$vpu!w;$^QmJy@l3`bq(}#xnS1G&v;H`7Ue&z8P!i-nSLD5T +z^=&DfO5fHGxz#$k9%E-U#iiB3BULT_n*dDe;v~AyAQFEe!Pm3~%ogsfa?1lJ$@8n2 +zgODq%C`oYOqPSwSy~nsfS+Ut%oWvEQUHkQJA%H3=qh}iTC=zTTVAedp((H1e$rVtdsS1#X +zEtWO?^z~ZQl5fj7!Am=2M7zu2p$~Ei&bYWJNk|vV|I|iw&vvGJ#Xbw@^NxA4{PFRsSX)g?NkU2*Z>5xL6!>m8hsB +z_Lx>>IXcOHIefHO)`P1z{d+&@hzEVzwqAMm(Tu1qjR0=lu~0t9jLzW0RHv);Z}n)Hc87M#f;N*exn~E-*L760&b|M6 +zttRHr)MNHK(r?U+tWcsyqz4TZ%3GCrP#+oo!R>)ybcaS$Dfslb4)fr)S=^)cW#Eb5 +z+sU;Jwh<3(NRt~vmUDz5w<{fusazU)CO};{Z1BTGeLK5e85HRygk1mOXh{ZCwMLF6 +z1&HO5+wRZ=q&4t1muxw;0j8!5LT_z=mr>n8>)nBngmx&)*+E5iget1L>K?B+yMq&v +TQ11;$C>059_}}38f7$;B(8DRC + +literal 0 +HcmV?d00001 + +diff --git a/feeds/luci/applications/luci-app-pbx/root/etc/pbx-asterisk/sounds/auth-thankyou.gsm b/feeds/luci/applications/luci-app-pbx/root/etc/pbx-asterisk/sounds/auth-thankyou.gsm +new file mode 100644 +index 0000000000000000000000000000000000000000..93f936d1a0c49ac8c8b6d4d0efa285d1e276b978 +GIT binary patch +literal 1353 +zcmV-P1-AOwUy)%VP(U`@ayHy{068RXHsg>0M%!)2Bjf-!+m1He*XM-ZYPtY79Fex% +z*q}KhZMO@8pywk|$s=+ANZU?FB-kl@>V?K2O4O1j-0(n3+iA%i$LvWHog*e>iDH=6 +z)TGnst{uyjk~H^`1FcX^ko=AnY_cr2OzpTN-b}XOkGT-krk-I{UF^Q(ZL1t#3t-oF +z#GhYj+8~z97+;6-ba5`6)TfozR*$A*IaO68zi8H!&0G~>q!}GBKVtDnr81EuywxRj +z-G;-aVmq=jd}F3u8d=Ebl}D(4O~fz9C^q66=JC}beda^Q3#luuCcDWgC>?!NTbYI~ +zQcCFV%Lh>8>rm6xV0Izjq7I#))A)ZU&Y!_P$B +zLLRx2&t{I^rNd^?Bl3+hT9cn+_4!PzD%DtSW=o$U3XWA((rZJuCCXJ&)`NasQBPIe +ziE4*prZz8zkN4n#0 +zLn8E%)K90u+l4H?;&DOLPqH}((e1pcn{z_;dC3%_XQ^ZFc9F3Pa8;>D`n +zZZ1-g$1d`cG=$o$dzsXR$9^MKmsW7-8l}yNZIFeS>e2{*;;1^DhFfpd*&VjzlS?)U +zll>85C^wPvv?PQmDI(A);>_o+BNEmj*d7eF(~qh8qHZ?rkBa#cDc5Y*>N69O_acwv +z-=hQTNY~vZw^EVjrmA<`X_Lql^LJT-l_(b<)+URWNXEU4#N^jpE<4Maq^cW-@noCm +zNeg}`-Rr7XigT$OQAo+%RT!PtoIW?qQ%Kj;aVXoPCD^@jg(6de%!OwL{8fZXu3^Kh +z)!sd~)KvsaTIn{Wt0b9W&`7VVIrOaH4MFzbGG`Eg5V!cQx!$bt+xJ=w+#=8=Y +z%ztGggkx1G>(ZmW7uaOwKU8K$>dJ)26TP&R%_5o1jeAqZqcLMVS54Att7GBOLeWcf +z$s=mSHus4)8`y-XQ83J5n~(=%LEoS$Ux7!7|}js}|^?FKHzpCsVDHGNg4^cCFUZdE!IrXcVV+4Th=SKBWw#}CfuQZN%uRP8w%fe5jOxKx(p@I0)3909+IqraU6VTEV1XpBG7)ol +z!AU4pH0*rgNZOC6>eTUb5!&X!rh?IEVv69oba~i~oPZ#%kH)FspuFA1*rU~HgN@o= +zU`p$7#-`YyNo#I`#p*!I95XoEQlK`Qba(z$;yjMvRsKTO5)p +LC77TlosKBmtj@qs + +literal 0 +HcmV?d00001 + +diff --git a/feeds/luci/applications/luci-app-pbx/root/etc/pbx-asterisk/sounds/beep.gsm b/feeds/luci/applications/luci-app-pbx/root/etc/pbx-asterisk/sounds/beep.gsm +new file mode 100644 +index 0000000000000000000000000000000000000000..d38eda9cc55c8de7b488dbd7993b545210be692f +GIT binary patch +literal 726 +zcmXBQdrT4m9Ki9;=GJEGkIcDg8i$&pvgQl{tu}nSmMJ3w0!ssDs5t@IbhULhHDcN5 +zAwJ5ubC)8avqCuaAJmDVfr)ciq@DswJ{rxow*JYT|9|%VJzR88U2k!MjojJF7fj^r +zC*|(+K#{DK$*YbmNqm)yaTTLTMBqUpUjfZIBp&Snpdh}o +zWA65`Fc=V4*|~QFxITN>pjNRsdxIFJpG;+ +zAwTjW1fAy+FFqxVGzJ9-N7RTDT!9SPyuf!izpRII`7X +zzAJ+6(=OQ~T?{V;k-=KAvQ^WAOE0F{(!6lE>~-u1VN=EpbjC*jjHQ*l?9LTJ)pOH% +zwFg|PiS7`Aw|!4|RAL7?Xjv4YvobhvqS;N|1p2B3VS;&lag?2XfdCk&LO54=LhJtC +zJ#HEdd`?LZEB9J?^h)oa!vYXu!crM>(s)9kT&ruMlN)I|2VAkz@_Us4x(P~05bKfy +z_6W_=7ae4hUPenCuqUR4dkB14Ot7B$T>zyV4=79DhU9EBzorWDiSc~S&%*+em?ScU +zJ8-e$nz#|Mj_E$x)XuUz#Uo3Q0FNP4bquO=f?GBEsUaa0n#m2V!$4*Ab#^TQ%-|_x +zgl2cLBxj{lsF`ew)0jzeuyPx97ZI;^vM}BOP=B*g{RvJgfHxeG#N?&`NhFQ7+~fdA+il4t*PDtR8p;4R+j2=8 +zfB-h+l1Cf7AV(x^w&d<$M;vlVBiSUfnPH>=Hso?h+-@K^6}07%@D +zM>|mPXOhF|^%Su%Q(%l1P-S;T3*S +z#T!_`Lamlo+*Kf!nyr0=(DAe#8Cs!6iqW~DwIR6Lezh#<;i%wF$n08x`3gx~+tD=B +zpqX6&xma$z)3TsnWCF^|uE1I24QCsypl4leRFu%NyWv^5pjjolBUfVp5_X-#v20){ +zTUKoxu)ye=ZMNjlZMAh#Y`{%jO;qK!z+!c>yA#^LM_$Y<+^*nE(PrCQ*YT#(f(ym&u&S6@18Z9C$fdI*t0y)1+jPVDSVYF6K0^s4*hDA&0w1pZc97S=96kEX+V`C +zE>lNqAnbH)GTUl_SlpLJBi6vDT}In>(J8CqDQ>{FnQBW5+<`e{hD9OZpw{w^TN~h@ +zwp5YG-O#PYCK~F%=TmL9T;#w-6;;P#+|S +z)a<-t3|mXT8j41;w@jCMim4l03#8$`Mw++hX7&oo#nkbPs#IMoy6KHx<6R0TBB~cV +zw@5~!ZPP`!h5fo{(Pq^1d}f+kNbcKF)l;=;E7FHJ;j<~$*KR1=vr4#|>a`u!G*xO; +zvF0{o9_pf3=f#zXMI)^$H(gQcktamd?KrM28`w`0|ERiaa+Nv~UN +z#~Y()KICb~BBKd6+=;l`p{KE>im2Pwv0Y*lQRI43Zb)8H#ZOtSQSr%eQqgP0_+g~`tS8F!gXV)9m +zW^L`mS;g5icZ^%LNFAH5IpJSuLgaNbcU{FsC3U3c)n9Gy0$T_jAu3lPn4}ehUesBK?gOaeYT{}p +zXR4yFWMwxKQvvstYNVV~Vae2sG@#YkMzTwzV%M>)x=>KU_v&^gn581^D07(7p&|(M +zRy2mxm`1V;?!rl(k|r*iq4-+LMs?_+OdF3T`<&q8nrkSc(wv3jTjU{WGHo{$+Cb?d +zN=0JUz{?zr=NgEBKTN45Wz!*y-RgRvRPkL4CRm_Y%rMC=Sl~3%vb$7T&=d{ynsgIl19|BfHx#|M4MPZS!1o%qts=rq?%BG +dHzaW>BTxWIB$7!aPyk6Jl1U^`07)d0NhDIuL#_Y- + +literal 0 +HcmV?d00001 + +diff --git a/feeds/luci/applications/luci-app-polipo/Makefile b/feeds/luci/applications/luci-app-polipo/Makefile +new file mode 100644 +index 0000000..1fbafe7 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-polipo/Makefile +@@ -0,0 +1,14 @@ ++# ++# Copyright (C) 2008-2014 The LuCI Team ++# ++# This is free software, licensed under the Apache License, Version 2.0 . ++# ++ ++include $(TOPDIR)/rules.mk ++ ++LUCI_TITLE:=LuCI Support for the Polipo Proxy ++LUCI_DEPENDS:=+polipo ++ ++include ../../luci.mk ++ ++# call BuildPackage - OpenWrt buildroot signature +diff --git a/feeds/luci/applications/luci-app-polipo/luasrc/controller/polipo.lua b/feeds/luci/applications/luci-app-polipo/luasrc/controller/polipo.lua +new file mode 100644 +index 0000000..b3ae389 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-polipo/luasrc/controller/polipo.lua +@@ -0,0 +1,15 @@ ++-- Copyright 2008 Aleksandar Krsteski ++-- Licensed to the public under the Apache License 2.0. ++ ++module("luci.controller.polipo", package.seeall) ++ ++function index() ++ if not nixio.fs.access("/etc/config/polipo") then ++ return ++ end ++ ++ entry({"admin", "services", "polipo"}, alias("admin", "services", "polipo", "config"), _("Polipo")) ++ entry({"admin", "services", "polipo", "status"}, template("polipo_status"), _("Status")) ++ entry({"admin", "services", "polipo", "config"}, cbi("polipo"), _("Configuration")) ++end ++ +diff --git a/feeds/luci/applications/luci-app-polipo/luasrc/model/cbi/polipo.lua b/feeds/luci/applications/luci-app-polipo/luasrc/model/cbi/polipo.lua +new file mode 100644 +index 0000000..967a47a +--- /dev/null ++++ b/feeds/luci/applications/luci-app-polipo/luasrc/model/cbi/polipo.lua +@@ -0,0 +1,177 @@ ++-- Copyright 2008 Aleksandar Krsteski ++-- Licensed to the public under the Apache License 2.0. ++ ++m = Map("polipo", translate("Polipo"), ++ translate("Polipo is a small and fast caching web proxy.")) ++ ++-- General section ++s = m:section(NamedSection, "general", "polipo", translate("Proxy")) ++ ++s:tab("general", translate("General Settings")) ++s:tab("dns", translate("DNS and Query Settings")) ++s:tab("proxy", translate("Parent Proxy")) ++s:tab("logging", translate("Logging and RAM")) ++ ++-- General settings ++s:taboption("general", Flag, "enabled", translate("enable")) ++ ++o = s:taboption("general", Value, "proxyAddress", translate("Listen address"), ++ translate("The interface on which Polipo will listen. To listen on all " .. ++ "interfaces use 0.0.0.0 or :: (IPv6).")) ++ ++o.placeholder = "0.0.0.0" ++o.datatype = "ipaddr" ++ ++ ++o = s:taboption("general", Value, "proxyPort", translate("Listen port"), ++ translate("Port on which Polipo will listen")) ++ ++o.optional = true ++o.placeholder = "8123" ++o.datatype = "port" ++ ++ ++o = s:taboption("general", DynamicList, "allowedClients", ++ translate("Allowed clients"), ++ translate("When listen address is set to 0.0.0.0 or :: (IPv6), you must " .. ++ "list clients that are allowed to connect. The format is IP address " .. ++ "or network address (192.168.1.123, 192.168.1.0/24, " .. ++ "2001:660:116::/48 (IPv6))")) ++ ++o.datatype = "ipaddr" ++o.placeholder = "0.0.0.0/0" ++ ++ ++-- DNS settings ++dns = s:taboption("dns", Value, "dnsNameServer", translate("DNS server address"), ++ translate("Set the DNS server address to use, if you want Polipo to use " .. ++ "different DNS server than the host system.")) ++ ++dns.optional = true ++dns.datatype = "ipaddr" ++ ++l = s:taboption("dns", ListValue, "dnsQueryIPv6", ++ translate("Query DNS for IPv6")) ++ ++l.default = "happily" ++l:value("true", translate("Query only IPv6")) ++l:value("happily", translate("Query IPv4 and IPv6, prefer IPv6")) ++l:value("reluctantly", translate("Query IPv4 and IPv6, prefer IPv4")) ++l:value("false", translate("Do not query IPv6")) ++ ++ ++l = s:taboption("dns", ListValue, "dnsUseGethostbyname", ++ translate("Query DNS by hostname")) ++ ++l.default = "reluctantly" ++l:value("true", translate("Always use system DNS resolver")) ++l:value("happily", ++ translate("Query DNS directly, for unknown hosts fall back " .. ++ "to system resolver")) ++l:value("reluctantly", ++ translate("Query DNS directly, fallback to system resolver")) ++l:value("false", translate("Never use system DNS resolver")) ++ ++ ++-- Proxy settings ++o = s:taboption("proxy", Value, "parentProxy", ++ translate("Parent proxy address"), ++ translate("Parent proxy address (in host:port format), to which Polipo " .. ++ "will forward the requests.")) ++ ++o.optional = true ++o.datatype = "ipaddr" ++ ++ ++o = s:taboption("proxy", Value, "parentAuthCredentials", ++ translate("Parent proxy authentication"), ++ translate("Basic HTTP authentication supported. Provide username and " .. ++ "password in username:password format.")) ++ ++o.optional = true ++o.placeholder = "username:password" ++ ++ ++-- Logging ++s:taboption("logging", Flag, "logSyslog", translate("Log to syslog")) ++ ++s:taboption("logging", Value, "logFacility", ++ translate("Syslog facility")):depends("logSyslog", "1") ++ ++ ++v = s:taboption("logging", Value, "logFile", ++ translate("Log file location"), ++ translate("Use of external storage device is recommended, because the " .. ++ "log file is written frequently and can grow considerably.")) ++ ++v:depends("logSyslog", "") ++v.rmempty = true ++ ++ ++o = s:taboption("logging", Value, "chunkHighMark", ++ translate("In RAM cache size (in bytes)"), ++ translate("How much RAM should Polipo use for its cache.")) ++ ++o.datatype = "uinteger" ++ ++ ++-- Disk cache section ++s = m:section(NamedSection, "cache", "polipo", translate("On-Disk Cache")) ++s:tab("general", translate("General Settings")) ++s:tab("advanced", translate("Advanced Settings")) ++ ++ ++-- Disk cache settings ++s:taboption("general", Value, "diskCacheRoot", translate("Disk cache location"), ++ translate("Location where polipo will cache files permanently. Use of " .. ++ "external storage devices is recommended, because the cache can " .. ++ "grow considerably. Leave it empty to disable on-disk " .. ++ "cache.")).rmempty = true ++ ++ ++s:taboption("general", Flag, "cacheIsShared", translate("Shared cache"), ++ translate("Enable if cache (proxy) is shared by multiple users.")) ++ ++ ++o = s:taboption("advanced", Value, "diskCacheTruncateSize", ++ translate("Truncate cache files size (in bytes)"), ++ translate("Size to which cached files should be truncated")) ++ ++o.optional = true ++o.placeholder = "1048576" ++o.datatype = "uinteger" ++ ++ ++o = s:taboption("advanced", Value, "diskCacheTruncateTime", ++ translate("Truncate cache files time"), ++ translate("Time after which cached files will be truncated")) ++ ++o.optional = true ++o.placeholder = "4d12h" ++ ++ ++o = s:taboption("advanced", Value, "diskCacheUnlinkTime", ++ translate("Delete cache files time"), ++ translate("Time after which cached files will be deleted")) ++ ++o.optional = true ++o.placeholder = "32d" ++ ++ ++-- Poor man's multiplexing section ++s = m:section(NamedSection, "pmm", "polipo", ++ translate("Poor Man's Multiplexing"), ++ translate("Poor Man's Multiplexing (PMM) is a technique that simulates " .. ++ "multiplexing by requesting an instance in multiple segments. It " .. ++ "tries to lower the latency caused by the weakness of HTTP " .. ++ "protocol. NOTE: some sites may not work with PMM enabled.")) ++ ++s:option(Value, "pmmSize", translate("PMM segments size (in bytes)"), ++ translate("To enable PMM, PMM segment size must be set to some " .. ++ "positive value.")).rmempty = true ++ ++s:option(Value, "pmmFirstSize", translate("First PMM segment size (in bytes)"), ++ translate("Size of the first PMM segment. If not defined, it defaults " .. ++ "to twice the PMM segment size.")).rmempty = true ++ ++return m +diff --git a/feeds/luci/applications/luci-app-polipo/luasrc/view/polipo_status.htm b/feeds/luci/applications/luci-app-polipo/luasrc/view/polipo_status.htm +new file mode 100644 +index 0000000..c2695ca +--- /dev/null ++++ b/feeds/luci/applications/luci-app-polipo/luasrc/view/polipo_status.htm +@@ -0,0 +1,18 @@ ++<% ++ ++local uci = require "luci.model.uci".cursor() ++local addr = "127.0.0.1" ++local port = uci:get("polipo", "general", "proxyPort") or "8123" ++ ++-%> ++ ++<%+header%> ++ ++
    ++

    <%:Polipo Status%>

    ++
    ++ ++
    ++
    ++ ++<%+footer%> +diff --git a/feeds/luci/applications/luci-app-polipo/po/ca/polipo.po b/feeds/luci/applications/luci-app-polipo/po/ca/polipo.po +new file mode 100644 +index 0000000..76a7093 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-polipo/po/ca/polipo.po +@@ -0,0 +1,299 @@ ++# polipo.pot ++# generated from ./applications/luci-polipo/luasrc/i18n/polipo.en.lua ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Report-Msgid-Bugs-To: \n" ++"POT-Creation-Date: 2009-06-10 03:40+0200\n" ++"PO-Revision-Date: 2014-06-02 05:16+0200\n" ++"Last-Translator: Alex \n" ++"Language-Team: LANGUAGE \n" ++"Language: ca\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n != 1);\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "Advanced Settings" ++msgstr "Ajusts avançats" ++ ++msgid "Allowed clients" ++msgstr "Clients permesos" ++ ++msgid "Always use system DNS resolver" ++msgstr "Sempre utilitza el resolutor DNS del sistema" ++ ++msgid "" ++"Basic HTTP authentication supported. Provide username and password in " ++"username:password format." ++msgstr "" ++"Se suporta autenticació HTTP bàsica. Entra el nom d'usuari i contrasenya en " ++"format usuari:contrasenya." ++ ++msgid "Configuration" ++msgstr "Configuració" ++ ++msgid "DNS and Query Settings" ++msgstr "Ajusts de DNS i petició" ++ ++msgid "DNS server address" ++msgstr "Adreça de servidor DNS" ++ ++msgid "Delete cache files time" ++msgstr "Hora d'esborrat de fitxers de memòria cau" ++ ++msgid "Disk cache location" ++msgstr "Localització de la memòria cau del disc" ++ ++msgid "Do not query IPv6" ++msgstr "No consultis IPv6" ++ ++msgid "Enable if cache (proxy) is shared by multiple users." ++msgstr "Activa si la memòria cau (proxy) és compartida per múltiples usuaris." ++ ++msgid "First PMM segment size (in bytes)" ++msgstr "Mida de segment del primer PMM (en bytes)" ++ ++msgid "General Settings" ++msgstr "Ajusts generals" ++ ++msgid "How much RAM should Polipo use for its cache." ++msgstr "Quanta RAM hauria de fer servir Polipo per la seva memòria cau" ++ ++msgid "In RAM cache size (in bytes)" ++msgstr "Mida de memòria cau a la RAM (en bytes)" ++ ++msgid "Listen address" ++msgstr "Adreça que rep connexions" ++ ++msgid "Listen port" ++msgstr "Port que rep connexions" ++ ++msgid "" ++"Location where polipo will cache files permanently. Use of external storage " ++"devices is recommended, because the cache can grow considerably. Leave it " ++"empty to disable on-disk cache." ++msgstr "" ++"Localització on polipo desarà els fitxers de memòria cau permanentment. Es " ++"recomana l'ús de dispositius d'emmagatzematge extern, perquè la memòria cau " ++"pot créixer considerablement. Deixa-ho buit per desactivar la memòria cau en " ++"disc." ++ ++msgid "Log file location" ++msgstr "Localització de fitxer registre" ++ ++msgid "Log to syslog" ++msgstr "Registra al syslog" ++ ++msgid "Logging and RAM" ++msgstr "Registre i RAM" ++ ++msgid "Never use system DNS resolver" ++msgstr "Mai utilitzis el resolutor DNS del sistema" ++ ++msgid "On-Disk Cache" ++msgstr "Memòria cau en disc" ++ ++msgid "PMM segments size (in bytes)" ++msgstr "Mida de segments MMS (en bytes)" ++ ++msgid "Parent Proxy" ++msgstr "Proxy pare" ++ ++msgid "Parent proxy address" ++msgstr "Adreça de proxy pare" ++ ++msgid "" ++"Parent proxy address (in host:port format), to which Polipo will forward the " ++"requests." ++msgstr "" ++"Adreça de proxy pare (en format host:port), al que Polipo readreçarà les " ++"sol·licituds." ++ ++msgid "Parent proxy authentication" ++msgstr "Autenticació de proxy pare" ++ ++msgid "Polipo" ++msgstr "Polipo" ++ ++msgid "Polipo Status" ++msgstr "Estat del Polipo" ++ ++msgid "Polipo is a small and fast caching web proxy." ++msgstr "Polipo és un proxy caché web petit i ràpid." ++ ++msgid "Poor Man's Multiplexing" ++msgstr "Multiplexació Poor Man's" ++ ++msgid "" ++"Poor Man's Multiplexing (PMM) is a technique that simulates multiplexing by " ++"requesting an instance in multiple segments. It tries to lower the latency " ++"caused by the weakness of HTTP protocol. NOTE: some sites may not work with " ++"PMM enabled." ++msgstr "" ++"Multiplexació Poor Man's (PMM) és una tècnica que multiplexa sol·licitant " ++"una instància en segments múltiples. Intenta reduir la latència causada per " ++"la feblesa del protocol HTTP. NOTA: algunes pàgines poden no funcionar amb " ++"la PMM activada." ++ ++msgid "Port on which Polipo will listen" ++msgstr "Port en que el Polipo escolta" ++ ++msgid "Proxy" ++msgstr "Proxy" ++ ++msgid "Query DNS by hostname" ++msgstr "Consulta DNS per nom de màquina" ++ ++msgid "Query DNS directly, fallback to system resolver" ++msgstr "" ++ ++msgid "Query DNS directly, for unknown hosts fall back to system resolver" ++msgstr "" ++ ++msgid "Query DNS for IPv6" ++msgstr "Consulta DNS per IPv6" ++ ++msgid "Query IPv4 and IPv6, prefer IPv4" ++msgstr "Consulta IPv4 i IPv6, prefereix IPv4" ++ ++msgid "Query IPv4 and IPv6, prefer IPv6" ++msgstr "Consulta IPv4 i IPv6, prefereix IPv6" ++ ++msgid "Query only IPv6" ++msgstr "Consulta només IPv6" ++ ++msgid "" ++"Set the DNS server address to use, if you want Polipo to use different DNS " ++"server than the host system." ++msgstr "" ++"Estableix l'adreça de servidor DNS a utilitzar, si vols que Polipo faci " ++"servir un servidor DNS diferent al del sistema." ++ ++msgid "Shared cache" ++msgstr "Memòria cau compartida" ++ ++msgid "" ++"Size of the first PMM segment. If not defined, it defaults to twice the PMM " ++"segment size." ++msgstr "" ++"Mida del primer segment PMM. Si no es defineix, per defecte és el doble de " ++"la mida de segment MMS." ++ ++msgid "Size to which cached files should be truncated" ++msgstr "Mida a que els fitxers en memòria cau es deuen truncar" ++ ++msgid "Status" ++msgstr "Estat" ++ ++msgid "Syslog facility" ++msgstr "Instal·lació syslog" ++ ++msgid "" ++"The interface on which Polipo will listen. To listen on all interfaces use " ++"0.0.0.0 or :: (IPv6)." ++msgstr "" ++"La interfície a la que Polipo rebrà les connexions. Per rebre-les a a totes " ++"les interfícies, utilitza 0.0.0.0 o :: (IPv6)." ++ ++msgid "Time after which cached files will be deleted" ++msgstr "" ++ ++msgid "Time after which cached files will be truncated" ++msgstr "" ++ ++msgid "To enable PMM, PMM segment size must be set to some positive value." ++msgstr "" ++ ++msgid "Truncate cache files size (in bytes)" ++msgstr "Mida de truncatge de fitxer de memòria cau (en bytes)" ++ ++msgid "Truncate cache files time" ++msgstr "Hora de truncatge de fitxers de memòria cau" ++ ++msgid "" ++"Use of external storage device is recommended, because the log file is " ++"written frequently and can grow considerably." ++msgstr "" ++"Es recomana l'ǘs de dispositius d'emmagatzematge externs, ja que el fitxer " ++"de registre és escrit freqüentment i pot créixer considerablement." ++ ++msgid "" ++"When listen address is set to 0.0.0.0 or :: (IPv6), you must list clients " ++"that are allowed to connect. The format is IP address or network address " ++"(192.168.1.123, 192.168.1.0/24, 2001:660:116::/48 (IPv6))" ++msgstr "" ++ ++msgid "enable" ++msgstr "habilita" ++ ++#~ msgid "" ++#~ "To enable polipo on-disk cache cleaning (highly recommended), you should " ++#~ "add a cron job in Scheduled Tasks services that will execute /usr/sbin/" ++#~ "polipo_purge script. For example to perform disk cache cleanup every day " ++#~ "at 6:00 in the morning you should add the following line in Scheduled " ++#~ "Tasks \"0 6 * * *\\t/usr/sbin/polipo_purge\" (without quotes)." ++#~ msgstr "" ++#~ "Per activar la neteja memòria cau en disc de polipo (altament recomenat), " ++#~ "hauries d'afegir una tasca de cron al servei de Tasques Programades que " ++#~ "executaran l'script /usr/sbin/polipo_purge. Per exemple, per executar la " ++#~ "neteja de memòria cau del disc cada dia a les 6:00 del matí, hauries " ++#~ "d'afegir la següent línia a les Tasques Programades: \"0 6 * * * /usr/" ++#~ "sbin/polipo_purge\" (sense cometes)." ++ ++#~ msgid "" ++#~ "Size to which cached files should be truncated. (default value: 1048576)" ++#~ msgstr "" ++#~ "Mida a la qual els fitxers de memòria cau s'haurien de truncar (valor per " ++#~ "defecte: 1048576)" ++ ++#~ msgid "" ++#~ "Time after which cached files will be truncated. (default value: 4d12h)" ++#~ msgstr "" ++#~ "Hora després de la qual els fitxers de memòria cau es truncaran (valor " ++#~ "per defecte: 4d12h)." ++ ++#~ msgid "Time after which cached files will be deleted. (default value: 32d)" ++#~ msgstr "" ++#~ "Hora després de la qual els fitxers de memòria s'esborraran (valor per " ++#~ "defecte: 32d)." ++ ++#~ msgid "General" ++#~ msgstr "General" ++ ++#~ msgid "" ++#~ "When listen address is set to 0.0.0.0 or :: (IPv6), you must list clients " ++#~ "that are allowed to connect. The format is IP address or network address " ++#~ "(192.168.1.123, 192.168.1.0/24, 2001:660:116::/48 (IPv6))." ++#~ msgstr "" ++#~ "Quan l'adreça d'escolta s'estableix a 0.0.0.0 o :: (IPv6), has de llistar " ++#~ "els clients que es permeten per connectar. El format és adreça IP o " ++#~ "adreça de xarxa (192.168.1.123, 192.168.1.0/24, 2001:660:116::/47 (IPv6))." ++ ++#~ msgid "" ++#~ "false = Do not query IPv6; reluctantly = Query both, prefer IPv4; happily " ++#~ "= Query both, prefer IPv6; true = Query only IPv6" ++#~ msgstr "" ++#~ "fals = No consultis IPv6; a contracor = Consulta els dos, prefereix IPv4; " ++#~ "feliçment = Consulta els dos, prefereix IPv6; cert = Consulta només IPv6" ++ ++#~ msgid "" ++#~ "false = Never use system DNS resolver; reluctantly = Query DNS directly, " ++#~ "if DNS server is unavailable fail to system DNS resolver; happily = Query " ++#~ "DNS directly, if host could not be found fallback to system DNS resolver; " ++#~ "true = Always use system DNS resolver" ++#~ msgstr "" ++#~ "fals = mai utilitzis resoledor DNS; a contracor = Consulta DNS " ++#~ "directament, si el servidor DNS està indisponible no utilitzis el sistema " ++#~ "resoledor de DNS; feliçment = Consulta DNS directament, si la màquina no " ++#~ "es pot trobar, vés al sistema resoledor de DNS; cert = Utilitza sistema " ++#~ "resoledor DNS sempre" ++ ++#~ msgid "Port on which Polipo will listen. (default value: 8123)" ++#~ msgstr "Port al que Polipo rebrà les connexions (valor per defecte: 8123)." ++ ++#~ msgid "polipo_pmm_pmmsize_desc" ++#~ msgstr "" ++#~ "Per habilitar el PMM, la mida dels segments PMM s'ha d'establir a algun " ++#~ "valor positiu." +diff --git a/feeds/luci/applications/luci-app-polipo/po/cs/polipo.po b/feeds/luci/applications/luci-app-polipo/po/cs/polipo.po +new file mode 100644 +index 0000000..9fa249d +--- /dev/null ++++ b/feeds/luci/applications/luci-app-polipo/po/cs/polipo.po +@@ -0,0 +1,205 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"PO-Revision-Date: 2014-07-11 19:47+0200\n" ++"Last-Translator: koli \n" ++"Language-Team: none\n" ++"Language: cs\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "Advanced Settings" ++msgstr "PokroÄilé nastavení" ++ ++msgid "Allowed clients" ++msgstr "Povolení klienti" ++ ++msgid "Always use system DNS resolver" ++msgstr "" ++ ++msgid "" ++"Basic HTTP authentication supported. Provide username and password in " ++"username:password format." ++msgstr "" ++ ++msgid "Configuration" ++msgstr "Konfigurace" ++ ++msgid "DNS and Query Settings" ++msgstr "" ++ ++msgid "DNS server address" ++msgstr "" ++ ++msgid "Delete cache files time" ++msgstr "" ++ ++msgid "Disk cache location" ++msgstr "" ++ ++msgid "Do not query IPv6" ++msgstr "" ++ ++msgid "Enable if cache (proxy) is shared by multiple users." ++msgstr "" ++ ++msgid "First PMM segment size (in bytes)" ++msgstr "Velikost prvního PMM segmentu (v bajtech)" ++ ++msgid "General Settings" ++msgstr "Obecné nastavení" ++ ++msgid "How much RAM should Polipo use for its cache." ++msgstr "" ++ ++msgid "In RAM cache size (in bytes)" ++msgstr "" ++ ++msgid "Listen address" ++msgstr "" ++ ++msgid "Listen port" ++msgstr "" ++ ++msgid "" ++"Location where polipo will cache files permanently. Use of external storage " ++"devices is recommended, because the cache can grow considerably. Leave it " ++"empty to disable on-disk cache." ++msgstr "" ++ ++msgid "Log file location" ++msgstr "" ++ ++msgid "Log to syslog" ++msgstr "" ++ ++msgid "Logging and RAM" ++msgstr "" ++ ++msgid "Never use system DNS resolver" ++msgstr "" ++ ++msgid "On-Disk Cache" ++msgstr "" ++ ++msgid "PMM segments size (in bytes)" ++msgstr "Velikost PMM segmentů (v bajtech)" ++ ++msgid "Parent Proxy" ++msgstr "" ++ ++msgid "Parent proxy address" ++msgstr "" ++ ++msgid "" ++"Parent proxy address (in host:port format), to which Polipo will forward the " ++"requests." ++msgstr "" ++ ++msgid "Parent proxy authentication" ++msgstr "" ++ ++msgid "Polipo" ++msgstr "Polipo" ++ ++msgid "Polipo Status" ++msgstr "Stav Polipo" ++ ++msgid "Polipo is a small and fast caching web proxy." ++msgstr "" ++ ++msgid "Poor Man's Multiplexing" ++msgstr "" ++ ++msgid "" ++"Poor Man's Multiplexing (PMM) is a technique that simulates multiplexing by " ++"requesting an instance in multiple segments. It tries to lower the latency " ++"caused by the weakness of HTTP protocol. NOTE: some sites may not work with " ++"PMM enabled." ++msgstr "" ++ ++msgid "Port on which Polipo will listen" ++msgstr "" ++ ++msgid "Proxy" ++msgstr "Proxy" ++ ++msgid "Query DNS by hostname" ++msgstr "" ++ ++msgid "Query DNS directly, fallback to system resolver" ++msgstr "" ++ ++msgid "Query DNS directly, for unknown hosts fall back to system resolver" ++msgstr "" ++ ++msgid "Query DNS for IPv6" ++msgstr "" ++ ++msgid "Query IPv4 and IPv6, prefer IPv4" ++msgstr "" ++ ++msgid "Query IPv4 and IPv6, prefer IPv6" ++msgstr "" ++ ++msgid "Query only IPv6" ++msgstr "" ++ ++msgid "" ++"Set the DNS server address to use, if you want Polipo to use different DNS " ++"server than the host system." ++msgstr "" ++ ++msgid "Shared cache" ++msgstr "" ++ ++msgid "" ++"Size of the first PMM segment. If not defined, it defaults to twice the PMM " ++"segment size." ++msgstr "" ++ ++msgid "Size to which cached files should be truncated" ++msgstr "" ++ ++msgid "Status" ++msgstr "Stav" ++ ++msgid "Syslog facility" ++msgstr "" ++ ++msgid "" ++"The interface on which Polipo will listen. To listen on all interfaces use " ++"0.0.0.0 or :: (IPv6)." ++msgstr "" ++ ++msgid "Time after which cached files will be deleted" ++msgstr "" ++ ++msgid "Time after which cached files will be truncated" ++msgstr "" ++ ++msgid "To enable PMM, PMM segment size must be set to some positive value." ++msgstr "" ++ ++msgid "Truncate cache files size (in bytes)" ++msgstr "" ++ ++msgid "Truncate cache files time" ++msgstr "" ++ ++msgid "" ++"Use of external storage device is recommended, because the log file is " ++"written frequently and can grow considerably." ++msgstr "" ++ ++msgid "" ++"When listen address is set to 0.0.0.0 or :: (IPv6), you must list clients " ++"that are allowed to connect. The format is IP address or network address " ++"(192.168.1.123, 192.168.1.0/24, 2001:660:116::/48 (IPv6))" ++msgstr "" ++ ++msgid "enable" ++msgstr "povolit" +diff --git a/feeds/luci/applications/luci-app-polipo/po/de/polipo.po b/feeds/luci/applications/luci-app-polipo/po/de/polipo.po +new file mode 100644 +index 0000000..50f7819 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-polipo/po/de/polipo.po +@@ -0,0 +1,272 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Report-Msgid-Bugs-To: \n" ++"POT-Creation-Date: 2009-05-26 17:57+0200\n" ++"PO-Revision-Date: 2013-01-29 20:21+0200\n" ++"Last-Translator: DAC324 \n" ++"Language-Team: LANGUAGE \n" ++"Language: de\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n != 1);\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "Advanced Settings" ++msgstr "Erweiterte Einstellungen" ++ ++msgid "Allowed clients" ++msgstr "Zugelassene Clients" ++ ++msgid "Always use system DNS resolver" ++msgstr "Immer DNS-Auflösung des Systems benutzen" ++ ++msgid "" ++"Basic HTTP authentication supported. Provide username and password in " ++"username:password format." ++msgstr "" ++"HTTP-Basis-Anmeldung wird unterstützt. Geben Sie Benutzernamen und Passwort " ++"im Format benutzername:passwort an." ++ ++msgid "Configuration" ++msgstr "Konfiguration" ++ ++msgid "DNS and Query Settings" ++msgstr "Einstellungen für DNS und Abfragen" ++ ++msgid "DNS server address" ++msgstr "Adresse des DNS-Servers" ++ ++msgid "Delete cache files time" ++msgstr "Zeit zur Lösching der Cache-Dateien" ++ ++msgid "Disk cache location" ++msgstr "Cache-Verzeichnis" ++ ++msgid "Do not query IPv6" ++msgstr "IPv6 nicht abfragen" ++ ++# Klingt komisch ++msgid "Enable if cache (proxy) is shared by multiple users." ++msgstr "Aktivieren, falls Cache (Proxy) von mehreren Benutzern verwendet wird." ++ ++msgid "First PMM segment size (in bytes)" ++msgstr "Größe des ersten PMM - Segment in bytes" ++ ++msgid "General Settings" ++msgstr "Allgemeine Einstellungen" ++ ++msgid "How much RAM should Polipo use for its cache." ++msgstr "Wie viel Arbeitsspeicher soll Polipo für den Cache verwenden." ++ ++msgid "In RAM cache size (in bytes)" ++msgstr "Größe des Caches im Arbeitsspeicher (Bytes)" ++ ++msgid "Listen address" ++msgstr "Aktive Adresse" ++ ++msgid "Listen port" ++msgstr "Aktiver Port" ++ ++msgid "" ++"Location where polipo will cache files permanently. Use of external storage " ++"devices is recommended, because the cache can grow considerably. Leave it " ++"empty to disable on-disk cache." ++msgstr "" ++"Speicherort für permanent gespeicherte Dateien. Es wird die Benutzung von " ++"externen Datenträgern empfohlen, da der Cache sehr groß werden kann. Lassen " ++"Sie diese Option leer um den Cache zu deaktivieren." ++ ++msgid "Log file location" ++msgstr "Ort der Log-Datei" ++ ++msgid "Log to syslog" ++msgstr "Ereignisse im Systemprotokoll (syslog) speichern" ++ ++msgid "Logging and RAM" ++msgstr "Protokollierung und Speicher" ++ ++msgid "Never use system DNS resolver" ++msgstr "DNS-Auflösung des Systems niemals verwenden" ++ ++msgid "On-Disk Cache" ++msgstr "Festplatten-Cache" ++ ++msgid "PMM segments size (in bytes)" ++msgstr "Größe des normalen PMM - Segment in bytes" ++ ++msgid "Parent Proxy" ++msgstr "Ãœbergeordneter Proxy" ++ ++msgid "Parent proxy address" ++msgstr "Adresse des übergeordneten Proxy-Servers" ++ ++msgid "" ++"Parent proxy address (in host:port format), to which Polipo will forward the " ++"requests." ++msgstr "" ++"Adresse des Ãœbergeordneten Proxyservers (im Format host:port), an den Polipo " ++"die Anfragen weiterleiten soll." ++ ++msgid "Parent proxy authentication" ++msgstr "Authentifizierung für übergeordneten Proxyserver" ++ ++msgid "Polipo" ++msgstr "Polipo" ++ ++msgid "Polipo Status" ++msgstr "Polipo-Status" ++ ++msgid "Polipo is a small and fast caching web proxy." ++msgstr "Polipo ist ein kleiner und schneller Webproxy." ++ ++msgid "Poor Man's Multiplexing" ++msgstr "PMM" ++ ++msgid "" ++"Poor Man's Multiplexing (PMM) is a technique that simulates multiplexing by " ++"requesting an instance in multiple segments. It tries to lower the latency " ++"caused by the weakness of HTTP protocol. NOTE: some sites may not work with " ++"PMM enabled." ++msgstr "" ++"Poor Man's Multiplexing (PMM) ist eine Technik, welche Multiplexing " ++"simuliert, indem eine Instanz in mehreren Teilen angefordert wird. Damit " ++"wird versucht, die durch Schwächen im HTTP-Protokoll verursachten Latenzen " ++"auszugleichen. ACHTUNG: Einige Webseiten könnten bei aktivem PMM nicht " ++"funktionieren." ++ ++msgid "Port on which Polipo will listen" ++msgstr "Port, an dem Polipo lauscht" ++ ++msgid "Proxy" ++msgstr "Proxy" ++ ++msgid "Query DNS by hostname" ++msgstr "DNS-Abfrage über Hostname" ++ ++msgid "Query DNS directly, fallback to system resolver" ++msgstr "direkte DNS-Abfrage, Rückgriff auf System-Auflösung" ++ ++msgid "Query DNS directly, for unknown hosts fall back to system resolver" ++msgstr "" ++"direkte DNS-Abfrage, Rückgriff auf System-Auflösung für unbekannte Hosts" ++ ++msgid "Query DNS for IPv6" ++msgstr "DNS-Abfrage für IPv6" ++ ++msgid "Query IPv4 and IPv6, prefer IPv4" ++msgstr "DNS-Abfrage für IPv4 und IPv6, bevorzuge IPv4" ++ ++msgid "Query IPv4 and IPv6, prefer IPv6" ++msgstr "DNS-Abfrage für IPv4 und IPv6, bevorzuge IPv6" ++ ++msgid "Query only IPv6" ++msgstr "Nur IPv6 abfragen" ++ ++msgid "" ++"Set the DNS server address to use, if you want Polipo to use different DNS " ++"server than the host system." ++msgstr "" ++"Geben Sie einen DNS-Server an, wenn Polipo diesen Server statt des " ++"systemeigenen DNS-Servers verwenden soll." ++ ++# Verteilt? Gemeinsam? ++msgid "Shared cache" ++msgstr "Gemeinsamer Cache" ++ ++msgid "" ++"Size of the first PMM segment. If not defined, it defaults to twice the PMM " ++"segment size." ++msgstr "" ++"Größe des ersten Segments. Wenn diese Option leer ist, wird hierfür die " ++"Doppelte Größe des PMM-Segments angenommen" ++ ++msgid "Size to which cached files should be truncated" ++msgstr "Größe, auf die zwischengespeicherte Dateien beschnitten werden sollen" ++ ++msgid "Status" ++msgstr "Status" ++ ++msgid "Syslog facility" ++msgstr "System-Protokollierungsfunktion" ++ ++msgid "" ++"The interface on which Polipo will listen. To listen on all interfaces use " ++"0.0.0.0 or :: (IPv6)." ++msgstr "" ++"Aktive Schnittstelle für Polipo. Um Polipo auf allen Schnittstellen zu " ++"aktivieren, bitte 0.0.0.0 bzw. :: (IPv6) angeben." ++ ++msgid "Time after which cached files will be deleted" ++msgstr "Zeit, nach der zwischengespeicherte Dateien gelöscht werden" ++ ++msgid "Time after which cached files will be truncated" ++msgstr "Zeit, nach der zwischengespeicherte Dateien beschnitten werden" ++ ++msgid "To enable PMM, PMM segment size must be set to some positive value." ++msgstr "Um PMM zu aktivieren muss hier ein Wert eingetragen werden" ++ ++msgid "Truncate cache files size (in bytes)" ++msgstr "Zwischengespeicherte Dateien auf (Bytes) beschneiden" ++ ++msgid "Truncate cache files time" ++msgstr "Zwischengespeicherte Dateien nach (Zeit) beschneiden" ++ ++msgid "" ++"Use of external storage device is recommended, because the log file is " ++"written frequently and can grow considerably." ++msgstr "" ++"Es sollte ein externes Speichermedium verwendet werden, da häufig in die " ++"Protokolldatei geschrieben wird; sie kann dadurch sehr groß werden." ++ ++msgid "" ++"When listen address is set to 0.0.0.0 or :: (IPv6), you must list clients " ++"that are allowed to connect. The format is IP address or network address " ++"(192.168.1.123, 192.168.1.0/24, 2001:660:116::/48 (IPv6))" ++msgstr "" ++"Ist die aktive Adresse auf 0.0.0.0 oder or :: (IPv6) gesetzt, müssen " ++"Clients, die sich verbinden dürfen, angegeben werden. Das Format ist " ++"entweder IP- oder Netzwerk-Adresse (192.168.1.123, 192.168.1.0/24, " ++"2001:660:116::/48 (IPv6))" ++ ++msgid "enable" ++msgstr "aktivieren" ++ ++#, fuzzy ++#~ msgid "Time after which cached files will be deleted. (default value: 32d)" ++#~ msgstr "" ++#~ "Speicherort für permanent gespeicherte Dateien. Es wird die Benutzung von " ++#~ "externen Datenträgern empfohlen, da der Cache sehr groß werden kann. " ++#~ "Lassen Sie diese Option leer um den Cache zu deaktivieren." ++ ++#~ msgid "General" ++#~ msgstr "Allgemein" ++ ++#, fuzzy ++#~ msgid "" ++#~ "When listen address is set to 0.0.0.0 or :: (IPv6), you must list clients " ++#~ "that are allowed to connect. The format is IP address or network address " ++#~ "(192.168.1.123, 192.168.1.0/24, 2001:660:116::/48 (IPv6))." ++#~ msgstr "" ++#~ "Wenn der Server auf alle Anfragen (0.0.0.0 bzw. ::) hört, dann müssen die " ++#~ "zugelassenen Gegenpunkte, die berechtig sind eine Verbindung aufzubauen, " ++#~ "hier eingetragen werden. Als Format hier bitte die IP-Adresse oder " ++#~ "Nerzwerkmaske auswählen (192.168.1.123, 192.168.1.0/24, 2001:660:116::/48 " ++#~ "(IPv6))" ++ ++#, fuzzy ++#~ msgid "" ++#~ "false = Do not query IPv6; reluctantly = Query both, prefer IPv4; happily " ++#~ "= Query both, prefer IPv6; true = Query only IPv6" ++#~ msgstr "" ++#~ "false = Beachtet IPv6 nicht, nur IPv4 möglich; reluctantly = Beachtet " ++#~ "sowohl IPv4 als auch IPv6, IPv4 wird bevorzugt; happily = Beachtet sowohl " ++#~ "IPv4 als auch IPv6, IPv6 wird bevorzugt; true = Beachtet IPv4 nicht, nur " ++#~ "IPv6 möglich" ++ ++#, fuzzy ++#~ msgid "Port on which Polipo will listen. (default value: 8123)" ++#~ msgstr "" ++#~ "Beschreibt, welcher Port von Polipo genutzt werden soll. " ++#~ "Grundeinstellung: Port 8123" +diff --git a/feeds/luci/applications/luci-app-polipo/po/el/polipo.po b/feeds/luci/applications/luci-app-polipo/po/el/polipo.po +new file mode 100644 +index 0000000..e7a62dd +--- /dev/null ++++ b/feeds/luci/applications/luci-app-polipo/po/el/polipo.po +@@ -0,0 +1,207 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Report-Msgid-Bugs-To: \n" ++"POT-Creation-Date: 2009-05-28 02:08+0200\n" ++"PO-Revision-Date: 2012-03-18 15:29+0200\n" ++"Last-Translator: Vasilis \n" ++"Language-Team: LANGUAGE \n" ++"Language: el\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n != 1);\n" ++"X-Generator: Pootle 2.0.4\n" ++ ++msgid "Advanced Settings" ++msgstr "" ++ ++msgid "Allowed clients" ++msgstr "" ++ ++msgid "Always use system DNS resolver" ++msgstr "" ++ ++msgid "" ++"Basic HTTP authentication supported. Provide username and password in " ++"username:password format." ++msgstr "" ++ ++msgid "Configuration" ++msgstr "" ++ ++msgid "DNS and Query Settings" ++msgstr "" ++ ++msgid "DNS server address" ++msgstr "" ++ ++msgid "Delete cache files time" ++msgstr "" ++ ++msgid "Disk cache location" ++msgstr "" ++ ++msgid "Do not query IPv6" ++msgstr "" ++ ++msgid "Enable if cache (proxy) is shared by multiple users." ++msgstr "" ++ ++msgid "First PMM segment size (in bytes)" ++msgstr "" ++ ++msgid "General Settings" ++msgstr "Γενικές Ρυθμίσεις" ++ ++msgid "How much RAM should Polipo use for its cache." ++msgstr "" ++ ++msgid "In RAM cache size (in bytes)" ++msgstr "" ++ ++msgid "Listen address" ++msgstr "" ++ ++msgid "Listen port" ++msgstr "" ++ ++msgid "" ++"Location where polipo will cache files permanently. Use of external storage " ++"devices is recommended, because the cache can grow considerably. Leave it " ++"empty to disable on-disk cache." ++msgstr "" ++ ++msgid "Log file location" ++msgstr "" ++ ++msgid "Log to syslog" ++msgstr "" ++ ++msgid "Logging and RAM" ++msgstr "" ++ ++msgid "Never use system DNS resolver" ++msgstr "" ++ ++msgid "On-Disk Cache" ++msgstr "" ++ ++msgid "PMM segments size (in bytes)" ++msgstr "" ++ ++msgid "Parent Proxy" ++msgstr "" ++ ++msgid "Parent proxy address" ++msgstr "" ++ ++msgid "" ++"Parent proxy address (in host:port format), to which Polipo will forward the " ++"requests." ++msgstr "" ++ ++msgid "Parent proxy authentication" ++msgstr "" ++ ++msgid "Polipo" ++msgstr "Polipo" ++ ++msgid "Polipo Status" ++msgstr "" ++ ++msgid "Polipo is a small and fast caching web proxy." ++msgstr "" ++ ++msgid "Poor Man's Multiplexing" ++msgstr "" ++ ++msgid "" ++"Poor Man's Multiplexing (PMM) is a technique that simulates multiplexing by " ++"requesting an instance in multiple segments. It tries to lower the latency " ++"caused by the weakness of HTTP protocol. NOTE: some sites may not work with " ++"PMM enabled." ++msgstr "" ++ ++msgid "Port on which Polipo will listen" ++msgstr "" ++ ++msgid "Proxy" ++msgstr "" ++ ++msgid "Query DNS by hostname" ++msgstr "" ++ ++msgid "Query DNS directly, fallback to system resolver" ++msgstr "" ++ ++msgid "Query DNS directly, for unknown hosts fall back to system resolver" ++msgstr "" ++ ++msgid "Query DNS for IPv6" ++msgstr "" ++ ++msgid "Query IPv4 and IPv6, prefer IPv4" ++msgstr "" ++ ++msgid "Query IPv4 and IPv6, prefer IPv6" ++msgstr "" ++ ++msgid "Query only IPv6" ++msgstr "" ++ ++msgid "" ++"Set the DNS server address to use, if you want Polipo to use different DNS " ++"server than the host system." ++msgstr "" ++ ++msgid "Shared cache" ++msgstr "" ++ ++msgid "" ++"Size of the first PMM segment. If not defined, it defaults to twice the PMM " ++"segment size." ++msgstr "" ++ ++msgid "Size to which cached files should be truncated" ++msgstr "" ++ ++msgid "Status" ++msgstr "" ++ ++msgid "Syslog facility" ++msgstr "" ++ ++msgid "" ++"The interface on which Polipo will listen. To listen on all interfaces use " ++"0.0.0.0 or :: (IPv6)." ++msgstr "" ++ ++msgid "Time after which cached files will be deleted" ++msgstr "" ++ ++msgid "Time after which cached files will be truncated" ++msgstr "" ++ ++msgid "To enable PMM, PMM segment size must be set to some positive value." ++msgstr "" ++ ++msgid "Truncate cache files size (in bytes)" ++msgstr "" ++ ++msgid "Truncate cache files time" ++msgstr "" ++ ++msgid "" ++"Use of external storage device is recommended, because the log file is " ++"written frequently and can grow considerably." ++msgstr "" ++ ++msgid "" ++"When listen address is set to 0.0.0.0 or :: (IPv6), you must list clients " ++"that are allowed to connect. The format is IP address or network address " ++"(192.168.1.123, 192.168.1.0/24, 2001:660:116::/48 (IPv6))" ++msgstr "" ++ ++msgid "enable" ++msgstr "" +diff --git a/feeds/luci/applications/luci-app-polipo/po/en/polipo.po b/feeds/luci/applications/luci-app-polipo/po/en/polipo.po +new file mode 100644 +index 0000000..1bdb0c1 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-polipo/po/en/polipo.po +@@ -0,0 +1,284 @@ ++#, fuzzy ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Report-Msgid-Bugs-To: \n" ++"POT-Creation-Date: 2009-05-19 19:35+0200\n" ++"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" ++"Last-Translator: FULL NAME \n" ++"Language-Team: LANGUAGE \n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"X-Generator: Translate Toolkit 1.1.1\n" ++ ++msgid "Advanced Settings" ++msgstr "" ++ ++msgid "Allowed clients" ++msgstr "Allowed clients" ++ ++msgid "Always use system DNS resolver" ++msgstr "" ++ ++msgid "" ++"Basic HTTP authentication supported. Provide username and password in " ++"username:password format." ++msgstr "" ++"Basic HTTP authentication supported. Provide username and password in " ++"username:password format." ++ ++msgid "Configuration" ++msgstr "" ++ ++msgid "DNS and Query Settings" ++msgstr "" ++ ++msgid "DNS server address" ++msgstr "DNS server address" ++ ++msgid "Delete cache files time" ++msgstr "Delete cache files time" ++ ++msgid "Disk cache location" ++msgstr "Disk cache location" ++ ++msgid "Do not query IPv6" ++msgstr "" ++ ++msgid "Enable if cache (proxy) is shared by multiple users." ++msgstr "Enable if cache (proxy) is shared by multiple users." ++ ++msgid "First PMM segment size (in bytes)" ++msgstr "First PMM segment size (in bytes)" ++ ++msgid "General Settings" ++msgstr "" ++ ++msgid "How much RAM should Polipo use for its cache." ++msgstr "How much RAM should Polipo use for its cache." ++ ++msgid "In RAM cache size (in bytes)" ++msgstr "In RAM cache size (in bytes)" ++ ++msgid "Listen address" ++msgstr "Listen address" ++ ++msgid "Listen port" ++msgstr "Listen port" ++ ++msgid "" ++"Location where polipo will cache files permanently. Use of external storage " ++"devices is recommended, because the cache can grow considerably. Leave it " ++"empty to disable on-disk cache." ++msgstr "" ++"Location where polipo will cache files permanently. Use of external storage " ++"devices is recommended, because the cache can grow considerably. Leave it " ++"empty to disable on-disk cache." ++ ++msgid "Log file location" ++msgstr "Log file location" ++ ++msgid "Log to syslog" ++msgstr "Log to syslog" ++ ++msgid "Logging and RAM" ++msgstr "" ++ ++msgid "Never use system DNS resolver" ++msgstr "" ++ ++msgid "On-Disk Cache" ++msgstr "On-Disk Cache" ++ ++msgid "PMM segments size (in bytes)" ++msgstr "PMM segments size (in bytes)" ++ ++msgid "Parent Proxy" ++msgstr "" ++ ++msgid "Parent proxy address" ++msgstr "Parent proxy address" ++ ++msgid "" ++"Parent proxy address (in host:port format), to which Polipo will forward the " ++"requests." ++msgstr "" ++"Parent proxy address (in host:port format), to which Polipo will forward the " ++"requests." ++ ++msgid "Parent proxy authentication" ++msgstr "Parent proxy authentication" ++ ++msgid "Polipo" ++msgstr "Polipo" ++ ++msgid "Polipo Status" ++msgstr "" ++ ++msgid "Polipo is a small and fast caching web proxy." ++msgstr "Polipo is a small and fast caching web proxy." ++ ++msgid "Poor Man's Multiplexing" ++msgstr "Poor Man's Multiplexing" ++ ++msgid "" ++"Poor Man's Multiplexing (PMM) is a technique that simulates multiplexing by " ++"requesting an instance in multiple segments. It tries to lower the latency " ++"caused by the weakness of HTTP protocol. NOTE: some sites may not work with " ++"PMM enabled." ++msgstr "" ++"Poor Man's Multiplexing (PMM) is a technique that simulates multiplexing " ++"by requesting an instance in multiple segments. It tries to lower the " ++"latency caused by the weakness of HTTP protocol. NOTE: some sites may not " ++"work with PMM enabled." ++ ++msgid "Port on which Polipo will listen" ++msgstr "" ++ ++msgid "Proxy" ++msgstr "" ++ ++msgid "Query DNS by hostname" ++msgstr "Query DNS by hostname" ++ ++msgid "Query DNS directly, fallback to system resolver" ++msgstr "" ++ ++msgid "Query DNS directly, for unknown hosts fall back to system resolver" ++msgstr "" ++ ++msgid "Query DNS for IPv6" ++msgstr "Query DNS for IPv6" ++ ++msgid "Query IPv4 and IPv6, prefer IPv4" ++msgstr "" ++ ++msgid "Query IPv4 and IPv6, prefer IPv6" ++msgstr "" ++ ++msgid "Query only IPv6" ++msgstr "" ++ ++msgid "" ++"Set the DNS server address to use, if you want Polipo to use different DNS " ++"server than the host system." ++msgstr "" ++"Set the DNS server address to use, if you want Polipo to use different DNS " ++"server than the host system." ++ ++msgid "Shared cache" ++msgstr "Shared cache" ++ ++msgid "" ++"Size of the first PMM segment. If not defined, it defaults to twice the PMM " ++"segment size." ++msgstr "" ++"Size of the first PMM segment. If not defined, it defaults to twice the PMM " ++"segment size." ++ ++msgid "Size to which cached files should be truncated" ++msgstr "" ++ ++msgid "Status" ++msgstr "" ++ ++msgid "Syslog facility" ++msgstr "Syslog facility" ++ ++msgid "" ++"The interface on which Polipo will listen. To listen on all interfaces use " ++"0.0.0.0 or :: (IPv6)." ++msgstr "" ++"The interface on which Polipo will listen. To listen on all interfaces use " ++"0.0.0.0 or :: (IPv6)." ++ ++msgid "Time after which cached files will be deleted" ++msgstr "" ++ ++msgid "Time after which cached files will be truncated" ++msgstr "" ++ ++msgid "To enable PMM, PMM segment size must be set to some positive value." ++msgstr "To enable PMM, PMM segment size must be set to some positive value." ++ ++msgid "Truncate cache files size (in bytes)" ++msgstr "Truncate cache files size (in bytes)" ++ ++msgid "Truncate cache files time" ++msgstr "Truncate cache files time" ++ ++msgid "" ++"Use of external storage device is recommended, because the log file is " ++"written frequently and can grow considerably." ++msgstr "" ++"Use of external storage device is recommended, because the log file is " ++"written frequently and can grow considerably." ++ ++msgid "" ++"When listen address is set to 0.0.0.0 or :: (IPv6), you must list clients " ++"that are allowed to connect. The format is IP address or network address " ++"(192.168.1.123, 192.168.1.0/24, 2001:660:116::/48 (IPv6))" ++msgstr "" ++ ++msgid "enable" ++msgstr "" ++ ++#~ msgid "" ++#~ "To enable polipo on-disk cache cleaning (highly recommended), you should " ++#~ "add a cron job in Scheduled Tasks services that will execute /usr/sbin/" ++#~ "polipo_purge script. For example to perform disk cache cleanup every day " ++#~ "at 6:00 in the morning you should add the following line in Scheduled " ++#~ "Tasks \"0 6 * * *\\t/usr/sbin/polipo_purge\" (without quotes)." ++#~ msgstr "" ++#~ "To enable polipo on-disk cache cleaning (highly recommended), you should " ++#~ "add a cron job in Scheduled Tasks services that will execute /usr/sbin/" ++#~ "polipo_purge script. For example to perform disk cache cleanup every day " ++#~ "at 6:00 in the morning you should add the following line in Scheduled " ++#~ "Tasks \"0 6 * * *\t/usr/sbin/polipo_purge\" (without quotes)." ++ ++#~ msgid "" ++#~ "Size to which cached files should be truncated. (default value: 1048576)" ++#~ msgstr "" ++#~ "Size to which cached files should be truncated. (default value: 1048576)" ++ ++#~ msgid "" ++#~ "Time after which cached files will be truncated. (default value: 4d12h)" ++#~ msgstr "" ++#~ "Time after which cached files will be truncated. (default value: 4d12h)" ++ ++#~ msgid "Time after which cached files will be deleted. (default value: 32d)" ++#~ msgstr "Time after which cached files will be deleted. (default value: 32d)" ++ ++#~ msgid "General" ++#~ msgstr "General" ++ ++#~ msgid "" ++#~ "When listen address is set to 0.0.0.0 or :: (IPv6), you must list clients " ++#~ "that are allowed to connect. The format is IP address or network address " ++#~ "(192.168.1.123, 192.168.1.0/24, 2001:660:116::/48 (IPv6))." ++#~ msgstr "" ++#~ "When listen address is set to 0.0.0.0 or :: (IPv6), you must list clients " ++#~ "that are allowed to connect. The format is IP address or network address " ++#~ "(192.168.1.123, 192.168.1.0/24, 2001:660:116::/48 (IPv6))." ++ ++#~ msgid "" ++#~ "false = Do not query IPv6; reluctantly = Query both, prefer IPv4; happily " ++#~ "= Query both, prefer IPv6; true = Query only IPv6" ++#~ msgstr "" ++#~ "false = Do not query IPv6; reluctantly = Query both, prefer IPv4; happily " ++#~ "= Query both, prefer IPv6; true = Query only IPv6" ++ ++#~ msgid "" ++#~ "false = Never use system DNS resolver; reluctantly = Query DNS directly, " ++#~ "if DNS server is unavailable fail to system DNS resolver; happily = Query " ++#~ "DNS directly, if host could not be found fallback to system DNS resolver; " ++#~ "true = Always use system DNS resolver" ++#~ msgstr "" ++#~ "false = Never use system DNS resolver; reluctantly = Query DNS directly, " ++#~ "if DNS server is unavailable fail to system DNS resolver; happily = Query " ++#~ "DNS directly, if host could not be found fallback to system DNS resolver; " ++#~ "true = Always use system DNS resolver" ++ ++#~ msgid "Port on which Polipo will listen. (default value: 8123)" ++#~ msgstr "Port on which Polipo will listen. (default value: 8123)" +diff --git a/feeds/luci/applications/luci-app-polipo/po/es/polipo.po b/feeds/luci/applications/luci-app-polipo/po/es/polipo.po +new file mode 100644 +index 0000000..84ba24e +--- /dev/null ++++ b/feeds/luci/applications/luci-app-polipo/po/es/polipo.po +@@ -0,0 +1,307 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Report-Msgid-Bugs-To: \n" ++"POT-Creation-Date: 2009-06-10 03:41+0200\n" ++"PO-Revision-Date: 2012-09-02 08:33+0200\n" ++"Last-Translator: José Vicente \n" ++"Language-Team: LANGUAGE \n" ++"Language: es\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n != 1);\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "Advanced Settings" ++msgstr "Configuración Avanzada" ++ ++msgid "Allowed clients" ++msgstr "Clientes permitos" ++ ++msgid "Always use system DNS resolver" ++msgstr "Usar siempre el DNS del sistema" ++ ++msgid "" ++"Basic HTTP authentication supported. Provide username and password in " ++"username:password format." ++msgstr "" ++"Autenticación soportada: Basic HTTP. Provee del nombre de usuario y " ++"contraseña in el formato username:password." ++ ++msgid "Configuration" ++msgstr "Configuración" ++ ++msgid "DNS and Query Settings" ++msgstr "Configuración de DNS y consultas" ++ ++msgid "DNS server address" ++msgstr "Dirección del servidor DNS" ++ ++msgid "Delete cache files time" ++msgstr "Tiempo para eliminar archivos de cache" ++ ++msgid "Disk cache location" ++msgstr "Ubicación de la caché de disco" ++ ++msgid "Do not query IPv6" ++msgstr "No consultar IPv6" ++ ++msgid "Enable if cache (proxy) is shared by multiple users." ++msgstr "Activar si la cache (proxy) es compartida por múltiples usuarios." ++ ++msgid "First PMM segment size (in bytes)" ++msgstr "Tamaño del primer segmento PMM (en bytes)" ++ ++msgid "General Settings" ++msgstr "Configuración general" ++ ++msgid "How much RAM should Polipo use for its cache." ++msgstr "Cuánta RAM debe usar Polipo como caché." ++ ++msgid "In RAM cache size (in bytes)" ++msgstr "Tamaño (en bytes) de la cache en RAM" ++ ++msgid "Listen address" ++msgstr "Dirección de escucha" ++ ++msgid "Listen port" ++msgstr "Puerto de escucha" ++ ++msgid "" ++"Location where polipo will cache files permanently. Use of external storage " ++"devices is recommended, because the cache can grow considerably. Leave it " ++"empty to disable on-disk cache." ++msgstr "" ++"Ubicación en la que Polipo creará archivos permanentemente. Se recomienda el " ++"uso de dispositivos de almacenamiento externo, ya que la caché puede " ++"aumentar considerablemente. Deje en blanco para desactivar la caché en disco." ++ ++msgid "Log file location" ++msgstr "Ubicación del archivo de registro" ++ ++msgid "Log to syslog" ++msgstr "Registrar en syslog" ++ ++msgid "Logging and RAM" ++msgstr "Registro y RAM" ++ ++msgid "Never use system DNS resolver" ++msgstr "Nunca usar el DNS del sistema" ++ ++msgid "On-Disk Cache" ++msgstr "Cache en disco" ++ ++msgid "PMM segments size (in bytes)" ++msgstr "Tamaño de segmentos PMM (en bytes)" ++ ++msgid "Parent Proxy" ++msgstr "Proxy padre" ++ ++msgid "Parent proxy address" ++msgstr "Dirección del proxy padre" ++ ++msgid "" ++"Parent proxy address (in host:port format), to which Polipo will forward the " ++"requests." ++msgstr "" ++"Dirección del proxy padre (en formato máquina:puerto), al cual Polipo " ++"traspasará las peticiones." ++ ++msgid "Parent proxy authentication" ++msgstr "Autentificación con el proxy padre" ++ ++msgid "Polipo" ++msgstr "Polipo" ++ ++msgid "Polipo Status" ++msgstr "Estado de Polipo" ++ ++msgid "Polipo is a small and fast caching web proxy." ++msgstr "Polipo es un servidor proxy web pequeño y rápido." ++ ++msgid "Poor Man's Multiplexing" ++msgstr "Multiplexación Poor Man's" ++ ++msgid "" ++"Poor Man's Multiplexing (PMM) is a technique that simulates multiplexing by " ++"requesting an instance in multiple segments. It tries to lower the latency " ++"caused by the weakness of HTTP protocol. NOTE: some sites may not work with " ++"PMM enabled." ++msgstr "" ++"La Multiplexación Poor Man's (PMM) simula multiplexación solicitando una " ++"instancia en múltiples segmentos. Intenta reducir la latencia provocada por " ++"la debilidad del protocolo HTTP. NOTA: algunos sitios pueden no funcionar " ++"con PMM habilitado." ++ ++msgid "Port on which Polipo will listen" ++msgstr "Puerto de escucha de Polipo" ++ ++msgid "Proxy" ++msgstr "Proxy" ++ ++msgid "Query DNS by hostname" ++msgstr "Consultar DNS por nombre de máquina" ++ ++msgid "Query DNS directly, fallback to system resolver" ++msgstr "Consultar DNS directamente y si falla probar con el del sistema" ++ ++msgid "Query DNS directly, for unknown hosts fall back to system resolver" ++msgstr "" ++"Consultar DNS directamente y para máquinas desconocidas probar con el del " ++"sistema" ++ ++msgid "Query DNS for IPv6" ++msgstr "Consulta DNS para IPv6" ++ ++msgid "Query IPv4 and IPv6, prefer IPv4" ++msgstr "Consultar IPv4 e IPv6, pero mejor IPv4" ++ ++msgid "Query IPv4 and IPv6, prefer IPv6" ++msgstr "Consultar IPv4 e IPv6, pero mejor IPv6" ++ ++msgid "Query only IPv6" ++msgstr "Consultar solo IPv6" ++ ++msgid "" ++"Set the DNS server address to use, if you want Polipo to use different DNS " ++"server than the host system." ++msgstr "" ++"Indique la dirección del servidor DNS a utilizar, si prefiere que Polipo " ++"utilice una dirección para el servidor DNS distinta al utilizado en el " ++"sistema." ++ ++msgid "Shared cache" ++msgstr "Cache compartida" ++ ++msgid "" ++"Size of the first PMM segment. If not defined, it defaults to twice the PMM " ++"segment size." ++msgstr "" ++"Tamaño del primer segmento PMM. Si no se encuentra definido, su valor por " ++"defecto es el doble del tamaño del segmento PMM." ++ ++msgid "Size to which cached files should be truncated" ++msgstr "Tamaño máximo de los ficheros caché" ++ ++msgid "Status" ++msgstr "Estado" ++ ++msgid "Syslog facility" ++msgstr "Utilidad Syslog" ++ ++msgid "" ++"The interface on which Polipo will listen. To listen on all interfaces use " ++"0.0.0.0 or :: (IPv6)." ++msgstr "" ++"Interfaz de escucha de Polipo. Para hacerlo en todas utilice 0.0.0.0 o :: " ++"(IPv6)." ++ ++msgid "Time after which cached files will be deleted" ++msgstr "Tiempo tras el que se borrarán los ficheros en caché" ++ ++msgid "Time after which cached files will be truncated" ++msgstr "Tiempo tras el que se truncarán los ficheros en caché" ++ ++msgid "To enable PMM, PMM segment size must be set to some positive value." ++msgstr "" ++"Para activar PMM, el tamaño de segmento PMM debe tener un valor positivo." ++ ++msgid "Truncate cache files size (in bytes)" ++msgstr "Truncar el tamaño del archivo de la cache (en bytes)" ++ ++msgid "Truncate cache files time" ++msgstr "Truncar tiempos en el archivo de cache" ++ ++msgid "" ++"Use of external storage device is recommended, because the log file is " ++"written frequently and can grow considerably." ++msgstr "" ++"El uso de un dispositivo externo de almacenamiento es recomendado, debido a " ++"que el archivo log es escrito con mucha frecuencia y el mismo puede " ++"incrementar su tamaño de forma considerable." ++ ++msgid "" ++"When listen address is set to 0.0.0.0 or :: (IPv6), you must list clients " ++"that are allowed to connect. The format is IP address or network address " ++"(192.168.1.123, 192.168.1.0/24, 2001:660:116::/48 (IPv6))" ++msgstr "" ++"Si la dirección de escucha es 0.0.0.0 o :: (IPv6), debe listar a los " ++"clientes a los que se permitirá conectar. El formato es dirección IP o " ++"dirección de red (192.168.1.123, 192.168.1.0/24, 2001:660:116::/48 (IPv6))" ++ ++msgid "enable" ++msgstr "activar" ++ ++#~ msgid "" ++#~ "To enable polipo on-disk cache cleaning (highly recommended), you should " ++#~ "add a cron job in Scheduled Tasks services that will execute /usr/sbin/" ++#~ "polipo_purge script. For example to perform disk cache cleanup every day " ++#~ "at 6:00 in the morning you should add the following line in Scheduled " ++#~ "Tasks \"0 6 * * *\\t/usr/sbin/polipo_purge\" (without quotes)." ++#~ msgstr "" ++#~ "Para activar la limpieza de la cache en disco polipo (recomendada), se " ++#~ "recomienda agregar un trabajo al cron in los Servicios de Tareas " ++#~ "Programadas el cual ejecutará el script /usr/sbin/polipo_purge. Por " ++#~ "ejemplo para ejecutar una limpieza de la cache de disco todos los días a " ++#~ "las 6:00 a.m. deberá agregar la siguiente línea en el Servicio de Tareas " ++#~ "Programadas.-&quot;0 6 * * * /usr/sbin/polipo_purge&quot; (sin " ++#~ "las comillas)." ++ ++#~ msgid "" ++#~ "Size to which cached files should be truncated. (default value: 1048576)" ++#~ msgstr "" ++#~ "Tamaño del archivo sobre el cual la cache deberá ser truncada. (valor por " ++#~ "defecto: 1048576)" ++ ++#~ msgid "" ++#~ "Time after which cached files will be truncated. (default value: 4d12h)" ++#~ msgstr "" ++#~ "Tiempo transcurrido necesario antes de truncar los archivos cacheado. " ++#~ "(valor por defecto: 4d12h)" ++ ++#~ msgid "Time after which cached files will be deleted. (default value: 32d)" ++#~ msgstr "" ++#~ "Tiempo transcurrido necesario antes de eliminar los archivos en la cache. " ++#~ "(valor por defecto: 32d)" ++ ++#~ msgid "General" ++#~ msgstr "General" ++ ++#~ msgid "" ++#~ "When listen address is set to 0.0.0.0 or :: (IPv6), you must list clients " ++#~ "that are allowed to connect. The format is IP address or network address " ++#~ "(192.168.1.123, 192.168.1.0/24, 2001:660:116::/48 (IPv6))." ++#~ msgstr "" ++#~ "Cuando la dirección a escuchar es establecida en 0.0.0.0 or :: (en caso " ++#~ "de utilizar IPv6), deberá listar los clientes que se encuentran permitos " ++#~ "a conectarse. El formato a utilizar deberá indicarse con la dirección IP " ++#~ "o bien la dirección de Red.Por ejemplo: (192.168.1.123, 192.168.1.0/24, " ++#~ "2001:660:116::/48 (IPv6))." ++ ++#~ msgid "" ++#~ "false = Do not query IPv6; reluctantly = Query both, prefer IPv4; happily " ++#~ "= Query both, prefer IPv6; true = Query only IPv6" ++#~ msgstr "" ++#~ "false = No consulta IPv6, reluctantly = Consulta ambos, preferencia IPv4; " ++#~ "happily = Consulta ambos, preferencia IPv6; true = Consulta sólamente IPv6" ++ ++#~ msgid "" ++#~ "false = Never use system DNS resolver; reluctantly = Query DNS directly, " ++#~ "if DNS server is unavailable fail to system DNS resolver; happily = Query " ++#~ "DNS directly, if host could not be found fallback to system DNS resolver; " ++#~ "true = Always use system DNS resolver" ++#~ msgstr "" ++#~ "false = Nunca use el sistema de resolución de DNS, reluctantly = " ++#~ "Consultar DNS directamente, si el servidor DNS no está disponible al " ++#~ "utilizar el sistema de resolución de DNS, hapilly = Consultar DNS " ++#~ "directamente, si el host no se pudo encontrar volver al sistema de " ++#~ "resolución de DNS; true = Siempre use el sistema de resolución de DNS" ++ ++#~ msgid "Port on which Polipo will listen. (default value: 8123)" ++#~ msgstr "Puerto de escucha que Polipo utilizará. (valor por defecto: 8123)" ++ ++#~ msgid "polipo_pmm_pmmsize_desc" ++#~ msgstr "" ++#~ "Para activar PMM, el tamaño del segmento PMM debe ser establecido a un " ++#~ "valor mayor a 0 (valor positivo)." +diff --git a/feeds/luci/applications/luci-app-polipo/po/fr/polipo.po b/feeds/luci/applications/luci-app-polipo/po/fr/polipo.po +new file mode 100644 +index 0000000..f4e49ae +--- /dev/null ++++ b/feeds/luci/applications/luci-app-polipo/po/fr/polipo.po +@@ -0,0 +1,206 @@ ++#, fuzzy ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Report-Msgid-Bugs-To: \n" ++"POT-Creation-Date: 2009-05-19 19:36+0200\n" ++"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" ++"Last-Translator: FULL NAME \n" ++"Language-Team: LANGUAGE \n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"X-Generator: Translate Toolkit 1.1.1\n" ++ ++msgid "Advanced Settings" ++msgstr "" ++ ++msgid "Allowed clients" ++msgstr "" ++ ++msgid "Always use system DNS resolver" ++msgstr "" ++ ++msgid "" ++"Basic HTTP authentication supported. Provide username and password in " ++"username:password format." ++msgstr "" ++ ++msgid "Configuration" ++msgstr "" ++ ++msgid "DNS and Query Settings" ++msgstr "" ++ ++msgid "DNS server address" ++msgstr "" ++ ++msgid "Delete cache files time" ++msgstr "" ++ ++msgid "Disk cache location" ++msgstr "" ++ ++msgid "Do not query IPv6" ++msgstr "" ++ ++msgid "Enable if cache (proxy) is shared by multiple users." ++msgstr "" ++ ++msgid "First PMM segment size (in bytes)" ++msgstr "" ++ ++msgid "General Settings" ++msgstr "" ++ ++msgid "How much RAM should Polipo use for its cache." ++msgstr "" ++ ++msgid "In RAM cache size (in bytes)" ++msgstr "" ++ ++msgid "Listen address" ++msgstr "" ++ ++msgid "Listen port" ++msgstr "" ++ ++msgid "" ++"Location where polipo will cache files permanently. Use of external storage " ++"devices is recommended, because the cache can grow considerably. Leave it " ++"empty to disable on-disk cache." ++msgstr "" ++ ++msgid "Log file location" ++msgstr "" ++ ++msgid "Log to syslog" ++msgstr "" ++ ++msgid "Logging and RAM" ++msgstr "" ++ ++msgid "Never use system DNS resolver" ++msgstr "" ++ ++msgid "On-Disk Cache" ++msgstr "" ++ ++msgid "PMM segments size (in bytes)" ++msgstr "" ++ ++msgid "Parent Proxy" ++msgstr "" ++ ++msgid "Parent proxy address" ++msgstr "" ++ ++msgid "" ++"Parent proxy address (in host:port format), to which Polipo will forward the " ++"requests." ++msgstr "" ++ ++msgid "Parent proxy authentication" ++msgstr "" ++ ++msgid "Polipo" ++msgstr "" ++ ++msgid "Polipo Status" ++msgstr "" ++ ++msgid "Polipo is a small and fast caching web proxy." ++msgstr "" ++ ++msgid "Poor Man's Multiplexing" ++msgstr "" ++ ++msgid "" ++"Poor Man's Multiplexing (PMM) is a technique that simulates multiplexing by " ++"requesting an instance in multiple segments. It tries to lower the latency " ++"caused by the weakness of HTTP protocol. NOTE: some sites may not work with " ++"PMM enabled." ++msgstr "" ++ ++msgid "Port on which Polipo will listen" ++msgstr "" ++ ++msgid "Proxy" ++msgstr "" ++ ++msgid "Query DNS by hostname" ++msgstr "" ++ ++msgid "Query DNS directly, fallback to system resolver" ++msgstr "" ++ ++msgid "Query DNS directly, for unknown hosts fall back to system resolver" ++msgstr "" ++ ++msgid "Query DNS for IPv6" ++msgstr "" ++ ++msgid "Query IPv4 and IPv6, prefer IPv4" ++msgstr "" ++ ++msgid "Query IPv4 and IPv6, prefer IPv6" ++msgstr "" ++ ++msgid "Query only IPv6" ++msgstr "" ++ ++msgid "" ++"Set the DNS server address to use, if you want Polipo to use different DNS " ++"server than the host system." ++msgstr "" ++ ++msgid "Shared cache" ++msgstr "" ++ ++msgid "" ++"Size of the first PMM segment. If not defined, it defaults to twice the PMM " ++"segment size." ++msgstr "" ++ ++msgid "Size to which cached files should be truncated" ++msgstr "" ++ ++msgid "Status" ++msgstr "" ++ ++msgid "Syslog facility" ++msgstr "" ++ ++msgid "" ++"The interface on which Polipo will listen. To listen on all interfaces use " ++"0.0.0.0 or :: (IPv6)." ++msgstr "" ++ ++msgid "Time after which cached files will be deleted" ++msgstr "" ++ ++msgid "Time after which cached files will be truncated" ++msgstr "" ++ ++msgid "To enable PMM, PMM segment size must be set to some positive value." ++msgstr "" ++ ++msgid "Truncate cache files size (in bytes)" ++msgstr "" ++ ++msgid "Truncate cache files time" ++msgstr "" ++ ++msgid "" ++"Use of external storage device is recommended, because the log file is " ++"written frequently and can grow considerably." ++msgstr "" ++ ++msgid "" ++"When listen address is set to 0.0.0.0 or :: (IPv6), you must list clients " ++"that are allowed to connect. The format is IP address or network address " ++"(192.168.1.123, 192.168.1.0/24, 2001:660:116::/48 (IPv6))" ++msgstr "" ++ ++msgid "enable" ++msgstr "" +diff --git a/feeds/luci/applications/luci-app-polipo/po/he/polipo.po b/feeds/luci/applications/luci-app-polipo/po/he/polipo.po +new file mode 100644 +index 0000000..931228e +--- /dev/null ++++ b/feeds/luci/applications/luci-app-polipo/po/he/polipo.po +@@ -0,0 +1,202 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Last-Translator: Automatically generated\n" ++"Language-Team: none\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n != 1);\n" ++ ++msgid "Advanced Settings" ++msgstr "" ++ ++msgid "Allowed clients" ++msgstr "" ++ ++msgid "Always use system DNS resolver" ++msgstr "" ++ ++msgid "" ++"Basic HTTP authentication supported. Provide username and password in " ++"username:password format." ++msgstr "" ++ ++msgid "Configuration" ++msgstr "" ++ ++msgid "DNS and Query Settings" ++msgstr "" ++ ++msgid "DNS server address" ++msgstr "" ++ ++msgid "Delete cache files time" ++msgstr "" ++ ++msgid "Disk cache location" ++msgstr "" ++ ++msgid "Do not query IPv6" ++msgstr "" ++ ++msgid "Enable if cache (proxy) is shared by multiple users." ++msgstr "" ++ ++msgid "First PMM segment size (in bytes)" ++msgstr "" ++ ++msgid "General Settings" ++msgstr "" ++ ++msgid "How much RAM should Polipo use for its cache." ++msgstr "" ++ ++msgid "In RAM cache size (in bytes)" ++msgstr "" ++ ++msgid "Listen address" ++msgstr "" ++ ++msgid "Listen port" ++msgstr "" ++ ++msgid "" ++"Location where polipo will cache files permanently. Use of external storage " ++"devices is recommended, because the cache can grow considerably. Leave it " ++"empty to disable on-disk cache." ++msgstr "" ++ ++msgid "Log file location" ++msgstr "" ++ ++msgid "Log to syslog" ++msgstr "" ++ ++msgid "Logging and RAM" ++msgstr "" ++ ++msgid "Never use system DNS resolver" ++msgstr "" ++ ++msgid "On-Disk Cache" ++msgstr "" ++ ++msgid "PMM segments size (in bytes)" ++msgstr "" ++ ++msgid "Parent Proxy" ++msgstr "" ++ ++msgid "Parent proxy address" ++msgstr "" ++ ++msgid "" ++"Parent proxy address (in host:port format), to which Polipo will forward the " ++"requests." ++msgstr "" ++ ++msgid "Parent proxy authentication" ++msgstr "" ++ ++msgid "Polipo" ++msgstr "" ++ ++msgid "Polipo Status" ++msgstr "" ++ ++msgid "Polipo is a small and fast caching web proxy." ++msgstr "" ++ ++msgid "Poor Man's Multiplexing" ++msgstr "" ++ ++msgid "" ++"Poor Man's Multiplexing (PMM) is a technique that simulates multiplexing by " ++"requesting an instance in multiple segments. It tries to lower the latency " ++"caused by the weakness of HTTP protocol. NOTE: some sites may not work with " ++"PMM enabled." ++msgstr "" ++ ++msgid "Port on which Polipo will listen" ++msgstr "" ++ ++msgid "Proxy" ++msgstr "" ++ ++msgid "Query DNS by hostname" ++msgstr "" ++ ++msgid "Query DNS directly, fallback to system resolver" ++msgstr "" ++ ++msgid "Query DNS directly, for unknown hosts fall back to system resolver" ++msgstr "" ++ ++msgid "Query DNS for IPv6" ++msgstr "" ++ ++msgid "Query IPv4 and IPv6, prefer IPv4" ++msgstr "" ++ ++msgid "Query IPv4 and IPv6, prefer IPv6" ++msgstr "" ++ ++msgid "Query only IPv6" ++msgstr "" ++ ++msgid "" ++"Set the DNS server address to use, if you want Polipo to use different DNS " ++"server than the host system." ++msgstr "" ++ ++msgid "Shared cache" ++msgstr "" ++ ++msgid "" ++"Size of the first PMM segment. If not defined, it defaults to twice the PMM " ++"segment size." ++msgstr "" ++ ++msgid "Size to which cached files should be truncated" ++msgstr "" ++ ++msgid "Status" ++msgstr "" ++ ++msgid "Syslog facility" ++msgstr "" ++ ++msgid "" ++"The interface on which Polipo will listen. To listen on all interfaces use " ++"0.0.0.0 or :: (IPv6)." ++msgstr "" ++ ++msgid "Time after which cached files will be deleted" ++msgstr "" ++ ++msgid "Time after which cached files will be truncated" ++msgstr "" ++ ++msgid "To enable PMM, PMM segment size must be set to some positive value." ++msgstr "" ++ ++msgid "Truncate cache files size (in bytes)" ++msgstr "" ++ ++msgid "Truncate cache files time" ++msgstr "" ++ ++msgid "" ++"Use of external storage device is recommended, because the log file is " ++"written frequently and can grow considerably." ++msgstr "" ++ ++msgid "" ++"When listen address is set to 0.0.0.0 or :: (IPv6), you must list clients " ++"that are allowed to connect. The format is IP address or network address " ++"(192.168.1.123, 192.168.1.0/24, 2001:660:116::/48 (IPv6))" ++msgstr "" ++ ++msgid "enable" ++msgstr "" +diff --git a/feeds/luci/applications/luci-app-polipo/po/hu/polipo.po b/feeds/luci/applications/luci-app-polipo/po/hu/polipo.po +new file mode 100644 +index 0000000..931228e +--- /dev/null ++++ b/feeds/luci/applications/luci-app-polipo/po/hu/polipo.po +@@ -0,0 +1,202 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Last-Translator: Automatically generated\n" ++"Language-Team: none\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n != 1);\n" ++ ++msgid "Advanced Settings" ++msgstr "" ++ ++msgid "Allowed clients" ++msgstr "" ++ ++msgid "Always use system DNS resolver" ++msgstr "" ++ ++msgid "" ++"Basic HTTP authentication supported. Provide username and password in " ++"username:password format." ++msgstr "" ++ ++msgid "Configuration" ++msgstr "" ++ ++msgid "DNS and Query Settings" ++msgstr "" ++ ++msgid "DNS server address" ++msgstr "" ++ ++msgid "Delete cache files time" ++msgstr "" ++ ++msgid "Disk cache location" ++msgstr "" ++ ++msgid "Do not query IPv6" ++msgstr "" ++ ++msgid "Enable if cache (proxy) is shared by multiple users." ++msgstr "" ++ ++msgid "First PMM segment size (in bytes)" ++msgstr "" ++ ++msgid "General Settings" ++msgstr "" ++ ++msgid "How much RAM should Polipo use for its cache." ++msgstr "" ++ ++msgid "In RAM cache size (in bytes)" ++msgstr "" ++ ++msgid "Listen address" ++msgstr "" ++ ++msgid "Listen port" ++msgstr "" ++ ++msgid "" ++"Location where polipo will cache files permanently. Use of external storage " ++"devices is recommended, because the cache can grow considerably. Leave it " ++"empty to disable on-disk cache." ++msgstr "" ++ ++msgid "Log file location" ++msgstr "" ++ ++msgid "Log to syslog" ++msgstr "" ++ ++msgid "Logging and RAM" ++msgstr "" ++ ++msgid "Never use system DNS resolver" ++msgstr "" ++ ++msgid "On-Disk Cache" ++msgstr "" ++ ++msgid "PMM segments size (in bytes)" ++msgstr "" ++ ++msgid "Parent Proxy" ++msgstr "" ++ ++msgid "Parent proxy address" ++msgstr "" ++ ++msgid "" ++"Parent proxy address (in host:port format), to which Polipo will forward the " ++"requests." ++msgstr "" ++ ++msgid "Parent proxy authentication" ++msgstr "" ++ ++msgid "Polipo" ++msgstr "" ++ ++msgid "Polipo Status" ++msgstr "" ++ ++msgid "Polipo is a small and fast caching web proxy." ++msgstr "" ++ ++msgid "Poor Man's Multiplexing" ++msgstr "" ++ ++msgid "" ++"Poor Man's Multiplexing (PMM) is a technique that simulates multiplexing by " ++"requesting an instance in multiple segments. It tries to lower the latency " ++"caused by the weakness of HTTP protocol. NOTE: some sites may not work with " ++"PMM enabled." ++msgstr "" ++ ++msgid "Port on which Polipo will listen" ++msgstr "" ++ ++msgid "Proxy" ++msgstr "" ++ ++msgid "Query DNS by hostname" ++msgstr "" ++ ++msgid "Query DNS directly, fallback to system resolver" ++msgstr "" ++ ++msgid "Query DNS directly, for unknown hosts fall back to system resolver" ++msgstr "" ++ ++msgid "Query DNS for IPv6" ++msgstr "" ++ ++msgid "Query IPv4 and IPv6, prefer IPv4" ++msgstr "" ++ ++msgid "Query IPv4 and IPv6, prefer IPv6" ++msgstr "" ++ ++msgid "Query only IPv6" ++msgstr "" ++ ++msgid "" ++"Set the DNS server address to use, if you want Polipo to use different DNS " ++"server than the host system." ++msgstr "" ++ ++msgid "Shared cache" ++msgstr "" ++ ++msgid "" ++"Size of the first PMM segment. If not defined, it defaults to twice the PMM " ++"segment size." ++msgstr "" ++ ++msgid "Size to which cached files should be truncated" ++msgstr "" ++ ++msgid "Status" ++msgstr "" ++ ++msgid "Syslog facility" ++msgstr "" ++ ++msgid "" ++"The interface on which Polipo will listen. To listen on all interfaces use " ++"0.0.0.0 or :: (IPv6)." ++msgstr "" ++ ++msgid "Time after which cached files will be deleted" ++msgstr "" ++ ++msgid "Time after which cached files will be truncated" ++msgstr "" ++ ++msgid "To enable PMM, PMM segment size must be set to some positive value." ++msgstr "" ++ ++msgid "Truncate cache files size (in bytes)" ++msgstr "" ++ ++msgid "Truncate cache files time" ++msgstr "" ++ ++msgid "" ++"Use of external storage device is recommended, because the log file is " ++"written frequently and can grow considerably." ++msgstr "" ++ ++msgid "" ++"When listen address is set to 0.0.0.0 or :: (IPv6), you must list clients " ++"that are allowed to connect. The format is IP address or network address " ++"(192.168.1.123, 192.168.1.0/24, 2001:660:116::/48 (IPv6))" ++msgstr "" ++ ++msgid "enable" ++msgstr "" +diff --git a/feeds/luci/applications/luci-app-polipo/po/it/polipo.po b/feeds/luci/applications/luci-app-polipo/po/it/polipo.po +new file mode 100644 +index 0000000..6bc0669 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-polipo/po/it/polipo.po +@@ -0,0 +1,219 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Report-Msgid-Bugs-To: \n" ++"POT-Creation-Date: 2009-05-19 19:36+0200\n" ++"PO-Revision-Date: 2013-02-09 19:56+0200\n" ++"Last-Translator: Francesco <3gasas@gmail.com>\n" ++"Language-Team: LANGUAGE \n" ++"Language: it\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n != 1);\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "Advanced Settings" ++msgstr "Impostazioni avanzate" ++ ++msgid "Allowed clients" ++msgstr "Clients permessi" ++ ++# che è sto DNS RESOLVER? ++msgid "Always use system DNS resolver" ++msgstr "Usa sempre DNS resolver" ++ ++msgid "" ++"Basic HTTP authentication supported. Provide username and password in " ++"username:password format." ++msgstr "" ++"Autenticazione base HTTP supportata. Fornire username e password in formato " ++"username:password." ++ ++msgid "Configuration" ++msgstr "Configurazione" ++ ++msgid "DNS and Query Settings" ++msgstr "Settaggi DNS e Query" ++ ++msgid "DNS server address" ++msgstr "Indirizzo del server DNS" ++ ++msgid "Delete cache files time" ++msgstr "Svuota la cache file dopo" ++ ++msgid "Disk cache location" ++msgstr "Percorso della cache del disco" ++ ++msgid "Do not query IPv6" ++msgstr "Non ignorare query IPv6" ++ ++msgid "Enable if cache (proxy) is shared by multiple users." ++msgstr "Abilita se la cache (del proxy) e' condivisa tra gli utenti." ++ ++msgid "First PMM segment size (in bytes)" ++msgstr "Dimensione del primo segmento PMM (in bytes)" ++ ++msgid "General Settings" ++msgstr "Impostazioni genarali" ++ ++msgid "How much RAM should Polipo use for its cache." ++msgstr "Quanta RAM dovrebbe Polipo usa come sua cache." ++ ++msgid "In RAM cache size (in bytes)" ++msgstr "In RAM cache size (in bytes)" ++ ++msgid "Listen address" ++msgstr "Indirizzi ip da \"ascoltare\"" ++ ++msgid "Listen port" ++msgstr "Porta" ++ ++msgid "" ++"Location where polipo will cache files permanently. Use of external storage " ++"devices is recommended, because the cache can grow considerably. Leave it " ++"empty to disable on-disk cache." ++msgstr "" ++"Percorso dove polipo memorizzerà i files di cache permanentemente. L'uso di " ++"un dispositivo di memorizzazione esterno è raccomandato. Lasciare vuoto per " ++"disabilitare la cache sul disco." ++ ++msgid "Log file location" ++msgstr "Percorso del file di log" ++ ++msgid "Log to syslog" ++msgstr "Pubblica il log nel syslog" ++ ++msgid "Logging and RAM" ++msgstr "Registra in RAM" ++ ++msgid "Never use system DNS resolver" ++msgstr "Non usare mai DNS RESOLVER" ++ ++msgid "On-Disk Cache" ++msgstr "On-Disk Cache" ++ ++msgid "PMM segments size (in bytes)" ++msgstr "DImensione segmenti PMM (in bytes)" ++ ++msgid "Parent Proxy" ++msgstr "Parent Proxy" ++ ++msgid "Parent proxy address" ++msgstr "Indirizzo parent proxy" ++ ++msgid "" ++"Parent proxy address (in host:port format), to which Polipo will forward the " ++"requests." ++msgstr "" ++"Indirizzi del parent proxy (nel formato ip:porta), al quale Polipo dovrà " ++"inoltrare le richieste." ++ ++msgid "Parent proxy authentication" ++msgstr "Autentificazione Parent proxy" ++ ++msgid "Polipo" ++msgstr "Polipo" ++ ++msgid "Polipo Status" ++msgstr "Stato Polipo" ++ ++msgid "Polipo is a small and fast caching web proxy." ++msgstr "Polipo è un piccolo e veloce webcache proxy." ++ ++msgid "Poor Man's Multiplexing" ++msgstr "Poor Man's Multiplexing" ++ ++msgid "" ++"Poor Man's Multiplexing (PMM) is a technique that simulates multiplexing by " ++"requesting an instance in multiple segments. It tries to lower the latency " ++"caused by the weakness of HTTP protocol. NOTE: some sites may not work with " ++"PMM enabled." ++msgstr "" ++"Poor Man's Multiplexing (PMM) è una tecnica che simula il multiplexing " ++"richiedendo una nuova istanza del segmento. Questo server per abbassare la " ++"latenza causata dalla debolezza del protocollo HTTP. NOTA: alcuni siti " ++"potrebbero non funzionare con PMM abilitato." ++ ++msgid "Port on which Polipo will listen" ++msgstr "Porta sulla quale Polipo deve rimanere in ascolto" ++ ++msgid "Proxy" ++msgstr "Proxy" ++ ++msgid "Query DNS by hostname" ++msgstr "Richiesta DNS da parte dell'host" ++ ++msgid "Query DNS directly, fallback to system resolver" ++msgstr "" ++ ++msgid "Query DNS directly, for unknown hosts fall back to system resolver" ++msgstr "" ++ ++msgid "Query DNS for IPv6" ++msgstr "" ++ ++msgid "Query IPv4 and IPv6, prefer IPv4" ++msgstr "" ++ ++msgid "Query IPv4 and IPv6, prefer IPv6" ++msgstr "" ++ ++msgid "Query only IPv6" ++msgstr "" ++ ++msgid "" ++"Set the DNS server address to use, if you want Polipo to use different DNS " ++"server than the host system." ++msgstr "" ++ ++msgid "Shared cache" ++msgstr "" ++ ++msgid "" ++"Size of the first PMM segment. If not defined, it defaults to twice the PMM " ++"segment size." ++msgstr "" ++ ++msgid "Size to which cached files should be truncated" ++msgstr "" ++ ++msgid "Status" ++msgstr "" ++ ++msgid "Syslog facility" ++msgstr "" ++ ++msgid "" ++"The interface on which Polipo will listen. To listen on all interfaces use " ++"0.0.0.0 or :: (IPv6)." ++msgstr "" ++ ++msgid "Time after which cached files will be deleted" ++msgstr "" ++ ++msgid "Time after which cached files will be truncated" ++msgstr "" ++ ++msgid "To enable PMM, PMM segment size must be set to some positive value." ++msgstr "" ++ ++msgid "Truncate cache files size (in bytes)" ++msgstr "" ++ ++msgid "Truncate cache files time" ++msgstr "" ++ ++msgid "" ++"Use of external storage device is recommended, because the log file is " ++"written frequently and can grow considerably." ++msgstr "" ++ ++msgid "" ++"When listen address is set to 0.0.0.0 or :: (IPv6), you must list clients " ++"that are allowed to connect. The format is IP address or network address " ++"(192.168.1.123, 192.168.1.0/24, 2001:660:116::/48 (IPv6))" ++msgstr "" ++ ++msgid "enable" ++msgstr "Abilita" +diff --git a/feeds/luci/applications/luci-app-polipo/po/ja/polipo.po b/feeds/luci/applications/luci-app-polipo/po/ja/polipo.po +new file mode 100644 +index 0000000..81ce9a7 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-polipo/po/ja/polipo.po +@@ -0,0 +1,229 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Report-Msgid-Bugs-To: \n" ++"POT-Creation-Date: 2009-05-19 19:36+0200\n" ++"PO-Revision-Date: 2013-10-06 17:01+0200\n" ++"Last-Translator: Kentaro \n" ++"Language-Team: LANGUAGE \n" ++"Language: ja\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=1; plural=0;\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "Advanced Settings" ++msgstr "詳細設定" ++ ++msgid "Allowed clients" ++msgstr "アクセスを許å¯ã™ã‚‹ã‚¯ãƒ©ã‚¤ã‚¢ãƒ³ãƒˆ" ++ ++msgid "Always use system DNS resolver" ++msgstr "常ã«ã‚·ã‚¹ãƒ†ãƒ ã®DNSåå‰è§£æ±ºã‚’使用ã™ã‚‹" ++ ++msgid "" ++"Basic HTTP authentication supported. Provide username and password in " ++"username:password format." ++msgstr "" ++"Basicèªè¨¼ã‚’サãƒãƒ¼ãƒˆã—ã¦ã„ã¾ã™ã€‚\"ユーザーå:パスワード\"ã®å½¢å¼ã§å…¥åŠ›ã—ã¦ãã " ++"ã•ã„。" ++ ++msgid "Configuration" ++msgstr "設定" ++ ++msgid "DNS and Query Settings" ++msgstr "DNSãŠã‚ˆã³ã‚¯ã‚¨ãƒªè¨­å®š" ++ ++msgid "DNS server address" ++msgstr "DNSサーãƒãƒ¼ã‚¢ãƒ‰ãƒ¬ã‚¹" ++ ++msgid "Delete cache files time" ++msgstr "キャッシュファイルをä¿æŒã™ã‚‹æ™‚é–“" ++ ++msgid "Disk cache location" ++msgstr "ディスクキャッシュã®ä¿å­˜å ´æ‰€" ++ ++msgid "Do not query IPv6" ++msgstr "IPv6ã®å•ã„åˆã‚ã›ã‚’è¡Œã‚ãªã„" ++ ++msgid "Enable if cache (proxy) is shared by multiple users." ++msgstr "複数ユーザーã§ã‚­ãƒ£ãƒƒã‚·ãƒ¥ã‚’共有ã™ã‚‹å ´åˆã€æœ‰åŠ¹ã«ã—ã¦ãã ã•ã„。" ++ ++msgid "First PMM segment size (in bytes)" ++msgstr "ファーストPMM セグメントサイズ (å˜ä½:ãƒã‚¤ãƒˆ)" ++ ++msgid "General Settings" ++msgstr "基本設定" ++ ++msgid "How much RAM should Polipo use for its cache." ++msgstr "PolipoãŒRAM上ã§ä½¿ç”¨ã™ã‚‹ã‚­ãƒ£ãƒƒã‚·ãƒ¥ã‚µã‚¤ã‚ºã‚’設定ã—ã¦ãã ã•ã„。" ++ ++msgid "In RAM cache size (in bytes)" ++msgstr "RAM キャッシュサイズ (å˜ä½:ãƒã‚¤ãƒˆ)" ++ ++msgid "Listen address" ++msgstr "å¾…ã¡å—ã‘アドレス" ++ ++msgid "Listen port" ++msgstr "å¾…ã¡å—ã‘ãƒãƒ¼ãƒˆ" ++ ++msgid "" ++"Location where polipo will cache files permanently. Use of external storage " ++"devices is recommended, because the cache can grow considerably. Leave it " ++"empty to disable on-disk cache." ++msgstr "" ++"PolipoãŒä½¿ç”¨ã™ã‚‹ã‚­ãƒ£ãƒƒã‚·ãƒ¥ãƒ•ã‚¡ã‚¤ãƒ«ã®ä¿å­˜å ´æ‰€ã‚’設定ã—ã¾ã™ã€‚キャッシュã¯é »ç¹ã«" ++"æ›´æ–°ã•ã‚Œã‚‹ãŸã‚ã€å¤–部デãƒã‚¤ã‚¹ã«ä¿å­˜ã™ã‚‹ã“ã¨ã‚’推奨ã—ã¾ã™ã€‚空欄ã«è¨­å®šã—ãŸå ´åˆã€" ++"ディスクキャッシュã¯ç„¡åŠ¹åŒ–ã•ã‚Œã¾ã™ã€‚" ++ ++msgid "Log file location" ++msgstr "ログファイルã®ä¿å­˜å ´æ‰€" ++ ++msgid "Log to syslog" ++msgstr "syslogã«ãƒ­ã‚°ã‚’記録ã™ã‚‹" ++ ++msgid "Logging and RAM" ++msgstr "ログã¨RAM設定" ++ ++msgid "Never use system DNS resolver" ++msgstr "システムã®DNSåå‰è§£æ±ºã‚’使用ã—ãªã„" ++ ++msgid "On-Disk Cache" ++msgstr "ディスクキャッシュ" ++ ++msgid "PMM segments size (in bytes)" ++msgstr "PMM セグメントサイズ (å˜ä½:ãƒã‚¤ãƒˆ)" ++ ++msgid "Parent Proxy" ++msgstr "親プロキシ" ++ ++msgid "Parent proxy address" ++msgstr "親プロキシ・アドレス" ++ ++msgid "" ++"Parent proxy address (in host:port format), to which Polipo will forward the " ++"requests." ++msgstr "" ++"PolipoãŒãƒªã‚¯ã‚¨ã‚¹ãƒˆã‚’転é€ã™ã‚‹ã€è¦ªãƒ—ロキシサーãƒãƒ¼ã®ã‚¢ãƒ‰ãƒ¬ã‚¹ã‚’\"ホスト:ãƒãƒ¼ãƒˆç•ª" ++"å·\"ã®å½¢å¼ã§è¨­å®šã—ã¦ãã ã•ã„。" ++ ++msgid "Parent proxy authentication" ++msgstr "親プロキシã®èªè¨¼" ++ ++msgid "Polipo" ++msgstr "Polipo" ++ ++msgid "Polipo Status" ++msgstr "Polipo ステータス" ++ ++msgid "Polipo is a small and fast caching web proxy." ++msgstr "Polipoã¯ã€è»½é‡ã§é«˜é€ŸãªWEBプロキシキャッシュサーãƒãƒ¼ã§ã™ã€‚" ++ ++msgid "Poor Man's Multiplexing" ++msgstr "Poor Man's Multiplexing" ++ ++msgid "" ++"Poor Man's Multiplexing (PMM) is a technique that simulates multiplexing by " ++"requesting an instance in multiple segments. It tries to lower the latency " ++"caused by the weakness of HTTP protocol. NOTE: some sites may not work with " ++"PMM enabled." ++msgstr "" ++"Poor Man's Multiplexing (PMM) ã¯ã€è¤‡æ•°ã®ã‚»ã‚°ãƒ¡ãƒ³ãƒˆã«æ¸¡ã£ã¦ã‚¤ãƒ³ã‚¹ã‚¿ãƒ³ã‚¹ã‚’リク" ++"エストã™ã‚‹ã“ã¨ã§ã€å¤šé‡åŒ–をシュミレートã™ã‚‹æŠ€è¡“ã§ã‚ã‚Šã€HTTPプロトコルã®å¼±ç‚¹ã«" ++"よるレイテンシを低減ã™ã‚‹è©¦ã¿ã‚’è¡Œã„ã¾ã™ã€‚注æ„:PMMを有効ã«ã—ã¦ã„ã‚‹ã¨ã€ã„ãã¤ã‹" ++"ã®ã‚µã‚¤ãƒˆã§ã¯ã¤ãªãŒã‚‰ãªããªã‚‹å¯èƒ½æ€§ãŒã‚ã‚Šã¾ã™ã€‚" ++ ++msgid "Port on which Polipo will listen" ++msgstr "PolipoãŒå¾…ã¡å—ã‘ã‚’è¡Œã†ãƒãƒ¼ãƒˆç•ªå·ã§ã™ã€‚" ++ ++msgid "Proxy" ++msgstr "プロキシ" ++ ++msgid "Query DNS by hostname" ++msgstr "ホストåã®DNSå•ã„åˆã‚ã›" ++ ++msgid "Query DNS directly, fallback to system resolver" ++msgstr "" ++ ++msgid "Query DNS directly, for unknown hosts fall back to system resolver" ++msgstr "" ++ ++msgid "Query DNS for IPv6" ++msgstr "IPv6 DNSå•ã„åˆã‚ã›" ++ ++msgid "Query IPv4 and IPv6, prefer IPv4" ++msgstr "IPv4ã¨IPv6ã®å•ã„åˆã‚ã›ã‚’行ㆠ(IPv4を優先)" ++ ++msgid "Query IPv4 and IPv6, prefer IPv6" ++msgstr "IPv4ã¨IPv6ã®å•ã„åˆã‚ã›ã‚’行ㆠ(IPv6を優先)" ++ ++msgid "Query only IPv6" ++msgstr "IPv6ã®ã¿å•ã„åˆã‚ã›ã‚’è¡Œã†" ++ ++msgid "" ++"Set the DNS server address to use, if you want Polipo to use different DNS " ++"server than the host system." ++msgstr "" ++"PolipoãŒã‚·ã‚¹ãƒ†ãƒ ã¨ã¯åˆ¥ã®DNSサーãƒãƒ¼ã‚’使用ã™ã‚‹å ´åˆã€DNSサーãƒãƒ¼ã®ã‚¢ãƒ‰ãƒ¬ã‚¹ã‚’設" ++"定ã—ã¦ãã ã•ã„。" ++ ++msgid "Shared cache" ++msgstr "共有キャッシュ" ++ ++msgid "" ++"Size of the first PMM segment. If not defined, it defaults to twice the PMM " ++"segment size." ++msgstr "" ++"最åˆã®PMM セグメントã®ã‚µã‚¤ã‚ºã‚’設定ã—ã¾ã™ã€‚設定ã•ã‚Œãªã‹ã£ãŸå ´åˆã€PMM セグメン" ++"トサイズã®å€ã®ã‚µã‚¤ã‚ºã‚’デフォルト値ã¨ã—ã¦è¨­å®šã—ã¾ã™ã€‚" ++ ++msgid "Size to which cached files should be truncated" ++msgstr "" ++ ++msgid "Status" ++msgstr "ステータス" ++ ++msgid "Syslog facility" ++msgstr "Syslog ファシリティ" ++ ++msgid "" ++"The interface on which Polipo will listen. To listen on all interfaces use " ++"0.0.0.0 or :: (IPv6)." ++msgstr "" ++"PolipoãŒå¾…ã¡å—ã‘ã‚’è¡Œã†ã‚¤ãƒ³ã‚¿ãƒ¼ãƒ•ã‚§ãƒ¼ã‚¹ã§ã™ã€‚0.0.0.0 ã¾ãŸã¯ :: (IPv6) を設定ã—" ++"ãŸå ´åˆã€å…¨ã¦ã®ã‚¤ãƒ³ã‚¿ãƒ¼ãƒ•ã‚§ãƒ¼ã‚¹ã§å¾…ã¡å—ã‘ã‚’è¡Œã„ã¾ã™ã€‚" ++ ++msgid "Time after which cached files will be deleted" ++msgstr "" ++ ++msgid "Time after which cached files will be truncated" ++msgstr "" ++ ++msgid "To enable PMM, PMM segment size must be set to some positive value." ++msgstr "PMM を有効ã«ã™ã‚‹å ´åˆã€PMM セグメントサイズã«ã¯æ­£ã®å€¤ã‚’設定ã—ã¦ãã ã•ã„。" ++ ++msgid "Truncate cache files size (in bytes)" ++msgstr "" ++ ++msgid "Truncate cache files time" ++msgstr "" ++ ++msgid "" ++"Use of external storage device is recommended, because the log file is " ++"written frequently and can grow considerably." ++msgstr "" ++"ログファイルã¯é »ç¹ã«æ›´æ–°ã•ã‚Œã‚‹ãŸã‚ã€å¤–部デãƒã‚¤ã‚¹ã«ä¿å­˜ã™ã‚‹ã“ã¨ã‚’推奨ã—ã¾ã™ã€‚" ++ ++msgid "" ++"When listen address is set to 0.0.0.0 or :: (IPv6), you must list clients " ++"that are allowed to connect. The format is IP address or network address " ++"(192.168.1.123, 192.168.1.0/24, 2001:660:116::/48 (IPv6))" ++msgstr "" ++"å¾…ã¡å—ã‘アドレスを0.0.0.0 ã¾ãŸã¯ :: (IPv6) ã«è¨­å®šã—ãŸå ´åˆã€ã‚¢ã‚¯ã‚»ã‚¹ã‚’許å¯ã™ã‚‹" ++"クライアントアドレスを設定ã—ã¦ãã ã•ã„。設定フォーマットã¯IPアドレスã‹ãƒãƒƒãƒˆ" ++"ワークアドレスã§ã™ã€‚(例:192.168.1.123, 192.168.1.0/24, 2001:660:116::/48 " ++"(IPv6))" ++ ++msgid "enable" ++msgstr "サービスを有効ã«ã™ã‚‹" +diff --git a/feeds/luci/applications/luci-app-polipo/po/ms/polipo.po b/feeds/luci/applications/luci-app-polipo/po/ms/polipo.po +new file mode 100644 +index 0000000..7517dcc +--- /dev/null ++++ b/feeds/luci/applications/luci-app-polipo/po/ms/polipo.po +@@ -0,0 +1,201 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Last-Translator: Automatically generated\n" ++"Language-Team: none\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++ ++msgid "Advanced Settings" ++msgstr "" ++ ++msgid "Allowed clients" ++msgstr "" ++ ++msgid "Always use system DNS resolver" ++msgstr "" ++ ++msgid "" ++"Basic HTTP authentication supported. Provide username and password in " ++"username:password format." ++msgstr "" ++ ++msgid "Configuration" ++msgstr "" ++ ++msgid "DNS and Query Settings" ++msgstr "" ++ ++msgid "DNS server address" ++msgstr "" ++ ++msgid "Delete cache files time" ++msgstr "" ++ ++msgid "Disk cache location" ++msgstr "" ++ ++msgid "Do not query IPv6" ++msgstr "" ++ ++msgid "Enable if cache (proxy) is shared by multiple users." ++msgstr "" ++ ++msgid "First PMM segment size (in bytes)" ++msgstr "" ++ ++msgid "General Settings" ++msgstr "" ++ ++msgid "How much RAM should Polipo use for its cache." ++msgstr "" ++ ++msgid "In RAM cache size (in bytes)" ++msgstr "" ++ ++msgid "Listen address" ++msgstr "" ++ ++msgid "Listen port" ++msgstr "" ++ ++msgid "" ++"Location where polipo will cache files permanently. Use of external storage " ++"devices is recommended, because the cache can grow considerably. Leave it " ++"empty to disable on-disk cache." ++msgstr "" ++ ++msgid "Log file location" ++msgstr "" ++ ++msgid "Log to syslog" ++msgstr "" ++ ++msgid "Logging and RAM" ++msgstr "" ++ ++msgid "Never use system DNS resolver" ++msgstr "" ++ ++msgid "On-Disk Cache" ++msgstr "" ++ ++msgid "PMM segments size (in bytes)" ++msgstr "" ++ ++msgid "Parent Proxy" ++msgstr "" ++ ++msgid "Parent proxy address" ++msgstr "" ++ ++msgid "" ++"Parent proxy address (in host:port format), to which Polipo will forward the " ++"requests." ++msgstr "" ++ ++msgid "Parent proxy authentication" ++msgstr "" ++ ++msgid "Polipo" ++msgstr "" ++ ++msgid "Polipo Status" ++msgstr "" ++ ++msgid "Polipo is a small and fast caching web proxy." ++msgstr "" ++ ++msgid "Poor Man's Multiplexing" ++msgstr "" ++ ++msgid "" ++"Poor Man's Multiplexing (PMM) is a technique that simulates multiplexing by " ++"requesting an instance in multiple segments. It tries to lower the latency " ++"caused by the weakness of HTTP protocol. NOTE: some sites may not work with " ++"PMM enabled." ++msgstr "" ++ ++msgid "Port on which Polipo will listen" ++msgstr "" ++ ++msgid "Proxy" ++msgstr "" ++ ++msgid "Query DNS by hostname" ++msgstr "" ++ ++msgid "Query DNS directly, fallback to system resolver" ++msgstr "" ++ ++msgid "Query DNS directly, for unknown hosts fall back to system resolver" ++msgstr "" ++ ++msgid "Query DNS for IPv6" ++msgstr "" ++ ++msgid "Query IPv4 and IPv6, prefer IPv4" ++msgstr "" ++ ++msgid "Query IPv4 and IPv6, prefer IPv6" ++msgstr "" ++ ++msgid "Query only IPv6" ++msgstr "" ++ ++msgid "" ++"Set the DNS server address to use, if you want Polipo to use different DNS " ++"server than the host system." ++msgstr "" ++ ++msgid "Shared cache" ++msgstr "" ++ ++msgid "" ++"Size of the first PMM segment. If not defined, it defaults to twice the PMM " ++"segment size." ++msgstr "" ++ ++msgid "Size to which cached files should be truncated" ++msgstr "" ++ ++msgid "Status" ++msgstr "" ++ ++msgid "Syslog facility" ++msgstr "" ++ ++msgid "" ++"The interface on which Polipo will listen. To listen on all interfaces use " ++"0.0.0.0 or :: (IPv6)." ++msgstr "" ++ ++msgid "Time after which cached files will be deleted" ++msgstr "" ++ ++msgid "Time after which cached files will be truncated" ++msgstr "" ++ ++msgid "To enable PMM, PMM segment size must be set to some positive value." ++msgstr "" ++ ++msgid "Truncate cache files size (in bytes)" ++msgstr "" ++ ++msgid "Truncate cache files time" ++msgstr "" ++ ++msgid "" ++"Use of external storage device is recommended, because the log file is " ++"written frequently and can grow considerably." ++msgstr "" ++ ++msgid "" ++"When listen address is set to 0.0.0.0 or :: (IPv6), you must list clients " ++"that are allowed to connect. The format is IP address or network address " ++"(192.168.1.123, 192.168.1.0/24, 2001:660:116::/48 (IPv6))" ++msgstr "" ++ ++msgid "enable" ++msgstr "" +diff --git a/feeds/luci/applications/luci-app-polipo/po/no/polipo.po b/feeds/luci/applications/luci-app-polipo/po/no/polipo.po +new file mode 100644 +index 0000000..931228e +--- /dev/null ++++ b/feeds/luci/applications/luci-app-polipo/po/no/polipo.po +@@ -0,0 +1,202 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Last-Translator: Automatically generated\n" ++"Language-Team: none\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n != 1);\n" ++ ++msgid "Advanced Settings" ++msgstr "" ++ ++msgid "Allowed clients" ++msgstr "" ++ ++msgid "Always use system DNS resolver" ++msgstr "" ++ ++msgid "" ++"Basic HTTP authentication supported. Provide username and password in " ++"username:password format." ++msgstr "" ++ ++msgid "Configuration" ++msgstr "" ++ ++msgid "DNS and Query Settings" ++msgstr "" ++ ++msgid "DNS server address" ++msgstr "" ++ ++msgid "Delete cache files time" ++msgstr "" ++ ++msgid "Disk cache location" ++msgstr "" ++ ++msgid "Do not query IPv6" ++msgstr "" ++ ++msgid "Enable if cache (proxy) is shared by multiple users." ++msgstr "" ++ ++msgid "First PMM segment size (in bytes)" ++msgstr "" ++ ++msgid "General Settings" ++msgstr "" ++ ++msgid "How much RAM should Polipo use for its cache." ++msgstr "" ++ ++msgid "In RAM cache size (in bytes)" ++msgstr "" ++ ++msgid "Listen address" ++msgstr "" ++ ++msgid "Listen port" ++msgstr "" ++ ++msgid "" ++"Location where polipo will cache files permanently. Use of external storage " ++"devices is recommended, because the cache can grow considerably. Leave it " ++"empty to disable on-disk cache." ++msgstr "" ++ ++msgid "Log file location" ++msgstr "" ++ ++msgid "Log to syslog" ++msgstr "" ++ ++msgid "Logging and RAM" ++msgstr "" ++ ++msgid "Never use system DNS resolver" ++msgstr "" ++ ++msgid "On-Disk Cache" ++msgstr "" ++ ++msgid "PMM segments size (in bytes)" ++msgstr "" ++ ++msgid "Parent Proxy" ++msgstr "" ++ ++msgid "Parent proxy address" ++msgstr "" ++ ++msgid "" ++"Parent proxy address (in host:port format), to which Polipo will forward the " ++"requests." ++msgstr "" ++ ++msgid "Parent proxy authentication" ++msgstr "" ++ ++msgid "Polipo" ++msgstr "" ++ ++msgid "Polipo Status" ++msgstr "" ++ ++msgid "Polipo is a small and fast caching web proxy." ++msgstr "" ++ ++msgid "Poor Man's Multiplexing" ++msgstr "" ++ ++msgid "" ++"Poor Man's Multiplexing (PMM) is a technique that simulates multiplexing by " ++"requesting an instance in multiple segments. It tries to lower the latency " ++"caused by the weakness of HTTP protocol. NOTE: some sites may not work with " ++"PMM enabled." ++msgstr "" ++ ++msgid "Port on which Polipo will listen" ++msgstr "" ++ ++msgid "Proxy" ++msgstr "" ++ ++msgid "Query DNS by hostname" ++msgstr "" ++ ++msgid "Query DNS directly, fallback to system resolver" ++msgstr "" ++ ++msgid "Query DNS directly, for unknown hosts fall back to system resolver" ++msgstr "" ++ ++msgid "Query DNS for IPv6" ++msgstr "" ++ ++msgid "Query IPv4 and IPv6, prefer IPv4" ++msgstr "" ++ ++msgid "Query IPv4 and IPv6, prefer IPv6" ++msgstr "" ++ ++msgid "Query only IPv6" ++msgstr "" ++ ++msgid "" ++"Set the DNS server address to use, if you want Polipo to use different DNS " ++"server than the host system." ++msgstr "" ++ ++msgid "Shared cache" ++msgstr "" ++ ++msgid "" ++"Size of the first PMM segment. If not defined, it defaults to twice the PMM " ++"segment size." ++msgstr "" ++ ++msgid "Size to which cached files should be truncated" ++msgstr "" ++ ++msgid "Status" ++msgstr "" ++ ++msgid "Syslog facility" ++msgstr "" ++ ++msgid "" ++"The interface on which Polipo will listen. To listen on all interfaces use " ++"0.0.0.0 or :: (IPv6)." ++msgstr "" ++ ++msgid "Time after which cached files will be deleted" ++msgstr "" ++ ++msgid "Time after which cached files will be truncated" ++msgstr "" ++ ++msgid "To enable PMM, PMM segment size must be set to some positive value." ++msgstr "" ++ ++msgid "Truncate cache files size (in bytes)" ++msgstr "" ++ ++msgid "Truncate cache files time" ++msgstr "" ++ ++msgid "" ++"Use of external storage device is recommended, because the log file is " ++"written frequently and can grow considerably." ++msgstr "" ++ ++msgid "" ++"When listen address is set to 0.0.0.0 or :: (IPv6), you must list clients " ++"that are allowed to connect. The format is IP address or network address " ++"(192.168.1.123, 192.168.1.0/24, 2001:660:116::/48 (IPv6))" ++msgstr "" ++ ++msgid "enable" ++msgstr "" +diff --git a/feeds/luci/applications/luci-app-polipo/po/pl/polipo.po b/feeds/luci/applications/luci-app-polipo/po/pl/polipo.po +new file mode 100644 +index 0000000..698edc9 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-polipo/po/pl/polipo.po +@@ -0,0 +1,231 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"PO-Revision-Date: 2013-01-06 22:57+0200\n" ++"Last-Translator: obsy \n" ++"Language-Team: none\n" ++"Language: pl\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 " ++"|| n%100>=20) ? 1 : 2);\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "Advanced Settings" ++msgstr "Ustawienia zaawansowane" ++ ++msgid "Allowed clients" ++msgstr "Dozwolone klienty" ++ ++msgid "Always use system DNS resolver" ++msgstr "Zawsze używaj systemowej obsÅ‚ugi DNS" ++ ++msgid "" ++"Basic HTTP authentication supported. Provide username and password in " ++"username:password format." ++msgstr "" ++"ObsÅ‚ugiwana podstawowa autoryzacja HTTP. Podaj nazwÄ™ użytkownika i hasÅ‚o w " ++"formie username:hasÅ‚o." ++ ++msgid "Configuration" ++msgstr "Konfiguracja" ++ ++msgid "DNS and Query Settings" ++msgstr "Ustawienia DNS i zapytaÅ„" ++ ++msgid "DNS server address" ++msgstr "Adres serwera DNS" ++ ++msgid "Delete cache files time" ++msgstr "Czas usuwania plików cache" ++ ++msgid "Disk cache location" ++msgstr "PoÅ‚ożenie cache na dysku" ++ ++msgid "Do not query IPv6" ++msgstr "Nie wykonuj zapytaÅ„ IPv6" ++ ++msgid "Enable if cache (proxy) is shared by multiple users." ++msgstr "WÅ‚Ä…cz, aby cache (proxy) byÅ‚ współdzielony przez wielu użytkowników." ++ ++msgid "First PMM segment size (in bytes)" ++msgstr "Rozmiar pierwszego segmentu PMM (w bajtach)" ++ ++msgid "General Settings" ++msgstr "Ustawienia ogólne" ++ ++msgid "How much RAM should Polipo use for its cache." ++msgstr "Ile pamiÄ™ci RAM powinien używać Polipo jako cache." ++ ++msgid "In RAM cache size (in bytes)" ++msgstr "Rozmiar cache w RAM (w bajtach)" ++ ++msgid "Listen address" ++msgstr "NasÅ‚uchuj adres" ++ ++msgid "Listen port" ++msgstr "NasÅ‚uchuj port" ++ ++msgid "" ++"Location where polipo will cache files permanently. Use of external storage " ++"devices is recommended, because the cache can grow considerably. Leave it " ++"empty to disable on-disk cache." ++msgstr "" ++"Miejsce, w którym Polipo bÄ™dzie przechowywać pliki cache na staÅ‚e. Użycie " ++"zewnÄ™trznego magazynu jest zalecane. Cache może siÄ™ poważnie zwiÄ™kszyć. " ++"Pozostaw puste, aby wyÅ‚Ä…czyć cache na dysku." ++ ++msgid "Log file location" ++msgstr "Katalog logów" ++ ++msgid "Log to syslog" ++msgstr "Loguj do logu systemowego (syslog)" ++ ++msgid "Logging and RAM" ++msgstr "Dziennik i RAM" ++ ++msgid "Never use system DNS resolver" ++msgstr "Nigdy nie używaj systemowej obsÅ‚ugi DNS" ++ ++msgid "On-Disk Cache" ++msgstr "Cache na dysku" ++ ++msgid "PMM segments size (in bytes)" ++msgstr "Rozmiar segmentu PMM (w bajtach)" ++ ++msgid "Parent Proxy" ++msgstr "NadrzÄ™dne proxy" ++ ++msgid "Parent proxy address" ++msgstr "Adres nadrzÄ™dnego proxy" ++ ++msgid "" ++"Parent proxy address (in host:port format), to which Polipo will forward the " ++"requests." ++msgstr "" ++"Adres nadrzÄ™dnego proxy (podany jako host:port), do którego Polipo bÄ™dzie " ++"przekierowywać żądania." ++ ++msgid "Parent proxy authentication" ++msgstr "Autoryzacja nadrzÄ™dnego proxy" ++ ++msgid "Polipo" ++msgstr "Polipo" ++ ++msgid "Polipo Status" ++msgstr "Status Polipo" ++ ++msgid "Polipo is a small and fast caching web proxy." ++msgstr "Polipo jest maÅ‚ym i szybkim web proxy z obsÅ‚ugÄ… cache." ++ ++# "Multipleksowanie Biedaka" brzmi fajniej, ale nie chcÄ™ mieć usuniÄ™tego konta. ++msgid "Poor Man's Multiplexing" ++msgstr "Poor Man's Multiplexing" ++ ++msgid "" ++"Poor Man's Multiplexing (PMM) is a technique that simulates multiplexing by " ++"requesting an instance in multiple segments. It tries to lower the latency " ++"caused by the weakness of HTTP protocol. NOTE: some sites may not work with " ++"PMM enabled." ++msgstr "" ++"Poor Man's Multiplexing (PMM) to technika symulujÄ…ca multipleksowanie " ++"poprzez żądanie instancji w wielu segmentach. Próbuje obniżyć opóźnienia " ++"spowodowane wadami protokoÅ‚u HTTP. UWAGA: niektóre strony mogÄ… nie dziaÅ‚ać " ++"przy wÅ‚Ä…czonym PMM!" ++ ++msgid "Port on which Polipo will listen" ++msgstr "Port, na którym Polipo bÄ™dzie nasÅ‚uchiwać." ++ ++msgid "Proxy" ++msgstr "Proxy" ++ ++msgid "Query DNS by hostname" ++msgstr "Zapytanie DNS po nazwie hosta" ++ ++msgid "Query DNS directly, fallback to system resolver" ++msgstr "Odpytuj DNS bezpoÅ›rednio, powracajÄ…c do resolvera systemu" ++ ++msgid "Query DNS directly, for unknown hosts fall back to system resolver" ++msgstr "" ++"Odpytuj DNS bezpoÅ›rednio, dla nieznanych hostów powróć do resolvera systemu" ++ ++msgid "Query DNS for IPv6" ++msgstr "Zapytanie DNS dla IPv6" ++ ++msgid "Query IPv4 and IPv6, prefer IPv4" ++msgstr "Zapytanie DNS dla IPv4 i IPv6, preferowane IPv4" ++ ++msgid "Query IPv4 and IPv6, prefer IPv6" ++msgstr "Zapytanie DNS dla IPv4 i IPv6, preferowane IPv6" ++ ++msgid "Query only IPv6" ++msgstr "Zapytanie tylko IPv6" ++ ++msgid "" ++"Set the DNS server address to use, if you want Polipo to use different DNS " ++"server than the host system." ++msgstr "" ++"Ustaw adres serwera DNS do użycia, jeÅ›li chcesz aby Polipo używaÅ‚ innego " ++"DNS`a niż system hosta." ++ ++msgid "Shared cache" ++msgstr "Cache udostÄ™pniany" ++ ++msgid "" ++"Size of the first PMM segment. If not defined, it defaults to twice the PMM " ++"segment size." ++msgstr "" ++"Rozmiar PIERWSZEGO segmentu PMM. JeÅ›li nie zdefiniowano, jego domyÅ›lny " ++"rozmiar to dwu-krotność rozmiaru segmentu PMM." ++ ++msgid "Size to which cached files should be truncated" ++msgstr "Rozmiar do którego pliki cache`owane majÄ… być przyciÄ™te" ++ ++msgid "Status" ++msgstr "Status" ++ ++msgid "Syslog facility" ++msgstr "Funkcja (facility) loga systemowego" ++ ++msgid "" ++"The interface on which Polipo will listen. To listen on all interfaces use " ++"0.0.0.0 or :: (IPv6)." ++msgstr "" ++"Interfejs na którym sÅ‚ucha proxy Polipo. Aby sÅ‚uchać na wszystkich " ++"interfejsach użyj 0.0.0.0 lub :: dla IPv6" ++ ++msgid "Time after which cached files will be deleted" ++msgstr "Czas po którym pliki cache bÄ™dÄ… skasowane" ++ ++msgid "Time after which cached files will be truncated" ++msgstr "Czas po którym pliki cache bÄ™dÄ… przyciÄ™te" ++ ++msgid "To enable PMM, PMM segment size must be set to some positive value." ++msgstr "" ++"Aby wÅ‚Ä…czyć PMM, rozmiar segmentu PMM musi mieć ustawionÄ… wartość dodatniÄ…." ++ ++msgid "Truncate cache files size (in bytes)" ++msgstr "Rozmiar przycinanych plików w cache(w bajtach)" ++ ++msgid "Truncate cache files time" ++msgstr "Czas przycinanych plików w cache" ++ ++msgid "" ++"Use of external storage device is recommended, because the log file is " ++"written frequently and can grow considerably." ++msgstr "" ++"Użycie zewnÄ™trznego noÅ›nika danych wysoce zalecane, plik loga jest " ++"zapisywany okresowo i może urosnąć znaczÄ…co." ++ ++msgid "" ++"When listen address is set to 0.0.0.0 or :: (IPv6), you must list clients " ++"that are allowed to connect. The format is IP address or network address " ++"(192.168.1.123, 192.168.1.0/24, 2001:660:116::/48 (IPv6))" ++msgstr "" ++"JeÅ›li adres nasÅ‚uchu ustawiony jest na 0.0.0.0 lub ::(IPv6), musisz " ++"wyszczególnić klientów majÄ…cych pozwolenie na poÅ‚Ä…czenie. Format to adres IP " ++"lub adres sieci (192.168.1.123, 192.168.1.0/24, 2001:660:116::/48 (IPv6))" ++ ++msgid "enable" ++msgstr "wÅ‚Ä…czone" +diff --git a/feeds/luci/applications/luci-app-polipo/po/pt-br/polipo.po b/feeds/luci/applications/luci-app-polipo/po/pt-br/polipo.po +new file mode 100644 +index 0000000..881d5c0 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-polipo/po/pt-br/polipo.po +@@ -0,0 +1,306 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Report-Msgid-Bugs-To: \n" ++"POT-Creation-Date: 2009-06-10 03:41+0200\n" ++"PO-Revision-Date: 2012-09-16 02:36+0200\n" ++"Last-Translator: Julio Cezar \n" ++"Language-Team: LANGUAGE \n" ++"Language: pt_BR\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n > 1);\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "Advanced Settings" ++msgstr "Opções Avançadas" ++ ++msgid "Allowed clients" ++msgstr "Clientes permitidos" ++ ++msgid "Always use system DNS resolver" ++msgstr "Sempre use o resolvedor de DNS do sistema" ++ ++msgid "" ++"Basic HTTP authentication supported. Provide username and password in " ++"username:password format." ++msgstr "" ++"A autenticação básica HTTP é suportada. Indique o usuário e senha no formato " ++"usuário:senha." ++ ++msgid "Configuration" ++msgstr "Configuração" ++ ++msgid "DNS and Query Settings" ++msgstr "Configurações de DNS e Consulta" ++ ++msgid "DNS server address" ++msgstr "Endereço do servidor DNS" ++ ++msgid "Delete cache files time" ++msgstr "Tempo para remoção dos arquivos de cache" ++ ++msgid "Disk cache location" ++msgstr "Localização da cache em disco" ++ ++msgid "Do not query IPv6" ++msgstr "Não consulte IPv6" ++ ++msgid "Enable if cache (proxy) is shared by multiple users." ++msgstr "Ativar se a cache (proxy) for compartilhada por múltiplos usuários." ++ ++msgid "First PMM segment size (in bytes)" ++msgstr "Tamanho do primeiro segmento PMM (em bytes)" ++ ++msgid "General Settings" ++msgstr "Configurações Gerais" ++ ++msgid "How much RAM should Polipo use for its cache." ++msgstr "Quanta memória RAM deverá ser usada pelo Polipo para a sua cache." ++ ++msgid "In RAM cache size (in bytes)" ++msgstr "Tamanho da cache na RAM (bytes)" ++ ++msgid "Listen address" ++msgstr "Endereço de escuta" ++ ++msgid "Listen port" ++msgstr "Porta de escuta" ++ ++msgid "" ++"Location where polipo will cache files permanently. Use of external storage " ++"devices is recommended, because the cache can grow considerably. Leave it " ++"empty to disable on-disk cache." ++msgstr "" ++"Local onde o polipo guardará permanentemente os arquivos de cache. É " ++"recomendada a utilização de dispositivos de armazenamento externo uma vez " ++"que o cache pode crescer consideravelmente. Deixe em branco para desativar a " ++"cache em disco." ++ ++msgid "Log file location" ++msgstr "Localização do arquivo de registo" ++ ++msgid "Log to syslog" ++msgstr "Registar para o syslog" ++ ++msgid "Logging and RAM" ++msgstr "Registro e RAM" ++ ++msgid "Never use system DNS resolver" ++msgstr "Nunca use o resolvedor de DNS do sistema" ++ ++msgid "On-Disk Cache" ++msgstr "Cache em Disco" ++ ++msgid "PMM segments size (in bytes)" ++msgstr "Tamanho do segmento PMM (em bytes)" ++ ++msgid "Parent Proxy" ++msgstr "Porxy Superior" ++ ++msgid "Parent proxy address" ++msgstr "Endereço do proxy superior" ++ ++msgid "" ++"Parent proxy address (in host:port format), to which Polipo will forward the " ++"requests." ++msgstr "" ++"Endereço do proxy superior (no formato host:porta), ao qual o Polipo irá " ++"encaminhar os seus pedidos." ++ ++msgid "Parent proxy authentication" ++msgstr "Autenticação no proxy superior" ++ ++msgid "Polipo" ++msgstr "Polipo" ++ ++msgid "Polipo Status" ++msgstr "Estado do Polipo" ++ ++msgid "Polipo is a small and fast caching web proxy." ++msgstr "O polipo é um proxy web pequeno e rápido." ++ ++msgid "Poor Man's Multiplexing" ++msgstr "Multiplexagem simples" ++ ++msgid "" ++"Poor Man's Multiplexing (PMM) is a technique that simulates multiplexing by " ++"requesting an instance in multiple segments. It tries to lower the latency " ++"caused by the weakness of HTTP protocol. NOTE: some sites may not work with " ++"PMM enabled." ++msgstr "" ++"A multiplexagem simples (PMM) consiste na simulação de multiplexagem através " ++"da requisição de um pedido em múltiplos segmentos. O método tenta baixar a " ++"latência causada pela fraqueza do protocolo HTTP. Nota: alguns sites web não " ++"funcionam com a ativação de PMM." ++ ++msgid "Port on which Polipo will listen" ++msgstr "Porta na qual o Polipo irá escutar" ++ ++msgid "Proxy" ++msgstr "Proxy" ++ ++msgid "Query DNS by hostname" ++msgstr "Consultar DNS pelo nome do equipamento" ++ ++msgid "Query DNS directly, fallback to system resolver" ++msgstr "" ++"Consulte o DNS diretamente. Alternativamente, use o resolvedor do sistema" ++ ++msgid "Query DNS directly, for unknown hosts fall back to system resolver" ++msgstr "" ++"Consulte o DNS diretamente. Para nomes desconhecidos, use o resolvedor do " ++"sistema" ++ ++msgid "Query DNS for IPv6" ++msgstr "Consultar DNS para IPv6" ++ ++msgid "Query IPv4 and IPv6, prefer IPv4" ++msgstr "Consulta IPv4 e IPv6, prefere IPv4" ++ ++msgid "Query IPv4 and IPv6, prefer IPv6" ++msgstr "Consulta IPv4 e IPv6, prefere IPv6" ++ ++msgid "Query only IPv6" ++msgstr "Consulta somente IPv6" ++ ++msgid "" ++"Set the DNS server address to use, if you want Polipo to use different DNS " ++"server than the host system." ++msgstr "" ++"Define o endereço do servidor de DNS, caso pretenda que o polipo utilize um " ++"servidor DNS diferente do utilizado pelo sistema." ++ ++msgid "Shared cache" ++msgstr "Cache compartilhada" ++ ++msgid "" ++"Size of the first PMM segment. If not defined, it defaults to twice the PMM " ++"segment size." ++msgstr "" ++"Tamanho do primeiro segmento PMM. Se não estiver definido, reverte para o " ++"dobro do tamanho do segmento PMM." ++ ++msgid "Size to which cached files should be truncated" ++msgstr "Tamanho que os arquivos de cache serão truncados" ++ ++msgid "Status" ++msgstr "Estado" ++ ++msgid "Syslog facility" ++msgstr "Categoria dos eventos Polipo no registo do sistema (syslog)" ++ ++msgid "" ++"The interface on which Polipo will listen. To listen on all interfaces use " ++"0.0.0.0 or :: (IPv6)." ++msgstr "" ++"A interface na qual o Polipo será ativado. Para ativar em todas as " ++"interfaces, use 0.0.0.0 ou :: (IPv6)." ++ ++msgid "Time after which cached files will be deleted" ++msgstr "Tempo máximo antes que um arquivo de cache seja apagado" ++ ++msgid "Time after which cached files will be truncated" ++msgstr "Tempo máximo antes que um arquivo de cache seja truncado" ++ ++msgid "To enable PMM, PMM segment size must be set to some positive value." ++msgstr "" ++"Para habilitar o PMM, o tamanho do segmento PMM deve ser definido para algum " ++"valor positivo." ++ ++msgid "Truncate cache files size (in bytes)" ++msgstr "Tamanho de truncagem dos arquivos de cache (em bytes)" ++ ++msgid "Truncate cache files time" ++msgstr "Tempo de truncagem dos arquivos de cache" ++ ++msgid "" ++"Use of external storage device is recommended, because the log file is " ++"written frequently and can grow considerably." ++msgstr "" ++"É recomendado o uso de armazenamento de externos pois o arquivo de registro " ++"é escrito frequentemente e pode crescer consideravelmente." ++ ++msgid "" ++"When listen address is set to 0.0.0.0 or :: (IPv6), you must list clients " ++"that are allowed to connect. The format is IP address or network address " ++"(192.168.1.123, 192.168.1.0/24, 2001:660:116::/48 (IPv6))" ++msgstr "" ++"Quando o endereço de escuta for definido como 0.0.0.0 ou :: (IPv6), é " ++"necessário listar quais clientes são permitidos. O formato é o endereço IP " ++"ou o endereço derede (192.168.1.123, 192.168.1.0/24, 2001:660:116::/48 " ++"(IPv6))" ++ ++msgid "enable" ++msgstr "habilitado" ++ ++#~ msgid "" ++#~ "To enable polipo on-disk cache cleaning (highly recommended), you should " ++#~ "add a cron job in Scheduled Tasks services that will execute /usr/sbin/" ++#~ "polipo_purge script. For example to perform disk cache cleanup every day " ++#~ "at 6:00 in the morning you should add the following line in Scheduled " ++#~ "Tasks \"0 6 * * *\\t/usr/sbin/polipo_purge\" (without quotes)." ++#~ msgstr "" ++#~ "Para activar a limpeza de cache em disco (altamente recomendado), deve " ++#~ "acrescentar uma tarefa cron (\"Serviços\") que execute o script /usr/sbin/" ++#~ "polipo_purge. Como exemplo, para executar uma limpeza da cache " ++#~ "diariamente pelas 06H00 deve acrescentar a seguinte linha: \"0 6 * * * /" ++#~ "usr/sbin/polipo_purge\" (sem as aspas)." ++ ++#~ msgid "" ++#~ "Size to which cached files should be truncated. (default value: 1048576)" ++#~ msgstr "" ++#~ "Tamanho com o qual devem ser trancados os ficheiros da cache. (valor pre-" ++#~ "definido: 1048576)" ++ ++#~ msgid "" ++#~ "Time after which cached files will be truncated. (default value: 4d12h)" ++#~ msgstr "" ++#~ "Tempo após o qual os ficheiros de cache serão trancados. (valor pre-" ++#~ "definido: 4d12h)" ++ ++#~ msgid "Time after which cached files will be deleted. (default value: 32d)" ++#~ msgstr "" ++#~ "Tempo apos o qual os ficheiros de cache serão removidos. (valor pré-" ++#~ "definido: 32d)" ++ ++#~ msgid "General" ++#~ msgstr "Geral" ++ ++#~ msgid "" ++#~ "When listen address is set to 0.0.0.0 or :: (IPv6), you must list clients " ++#~ "that are allowed to connect. The format is IP address or network address " ++#~ "(192.168.1.123, 192.168.1.0/24, 2001:660:116::/48 (IPv6))." ++#~ msgstr "" ++#~ "Quando o endereço de listen fôr 0.0.0.0 (IPv4) ou :: (IPv6), deve listar " ++#~ "os clientes que tiverem permissão para ligação. O formato é endereço de " ++#~ "host ou endereço de rede (192.168.1.123, 192.168.1.0/24, " ++#~ "2001:660:116::/48 (IPv6))." ++ ++#~ msgid "" ++#~ "false = Do not query IPv6; reluctantly = Query both, prefer IPv4; happily " ++#~ "= Query both, prefer IPv6; true = Query only IPv6" ++#~ msgstr "" ++#~ "false = Não pedir IPv6; reluctantly=Pedir ambos e preferir IPv4; " ++#~ "happily=Pedir ambos, preferir IPv6; true=Pedir apenas IPv6" ++ ++#~ msgid "" ++#~ "false = Never use system DNS resolver; reluctantly = Query DNS directly, " ++#~ "if DNS server is unavailable fail to system DNS resolver; happily = Query " ++#~ "DNS directly, if host could not be found fallback to system DNS resolver; " ++#~ "true = Always use system DNS resolver" ++#~ msgstr "" ++#~ "false=nunca usar o resolver do sistema; reluctantly=pedir DNS " ++#~ "directamente, se o servidor DNS estiver indisponivel recorrer do resolver " ++#~ "DNS do sistema; happily=pedir DNS directamente, se o host nao for " ++#~ "encontrado, recorrer ao resolver DNS do sistema; true=Usar sempre o " ++#~ "resolver DNS do sistema" ++ ++#~ msgid "Port on which Polipo will listen. (default value: 8123)" ++#~ msgstr "Porta local na qual o polipo será activado. (pre-definido: 8123)" ++ ++#~ msgid "polipo_pmm_pmmsize_desc" ++#~ msgstr "" ++#~ "Para activar PMM, o tamanho do segmento PMM deve ser definido para um " ++#~ "qualquer valor positivo." +diff --git a/feeds/luci/applications/luci-app-polipo/po/pt/polipo.po b/feeds/luci/applications/luci-app-polipo/po/pt/polipo.po +new file mode 100644 +index 0000000..cdce586 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-polipo/po/pt/polipo.po +@@ -0,0 +1,305 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Report-Msgid-Bugs-To: \n" ++"POT-Creation-Date: 2009-05-26 19:03+0200\n" ++"PO-Revision-Date: 2013-06-02 19:10+0200\n" ++"Last-Translator: joao.f.vieira \n" ++"Language-Team: LANGUAGE \n" ++"Language: pt\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n != 1);\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "Advanced Settings" ++msgstr "Definições avançadas" ++ ++msgid "Allowed clients" ++msgstr "Clientes permitidos" ++ ++msgid "Always use system DNS resolver" ++msgstr "Usar sempre o resolvedor DNS de Sistema" ++ ++msgid "" ++"Basic HTTP authentication supported. Provide username and password in " ++"username:password format." ++msgstr "" ++"É suportada a autenticação basica HTTP. Indique username e password no " ++"formato username:password." ++ ++msgid "Configuration" ++msgstr "Configuração" ++ ++msgid "DNS and Query Settings" ++msgstr "Definições de DNS e de Consulta" ++ ++msgid "DNS server address" ++msgstr "Endereço do servidor DNS" ++ ++msgid "Delete cache files time" ++msgstr "Tempo para remoção dos ficheiros de cache" ++ ++msgid "Disk cache location" ++msgstr "Localização da cache em disco" ++ ++msgid "Do not query IPv6" ++msgstr "Não consulta o IPv6" ++ ++msgid "Enable if cache (proxy) is shared by multiple users." ++msgstr "Activar se a cache (proxy) for partilhada por multiplos utilizadores." ++ ++msgid "First PMM segment size (in bytes)" ++msgstr "Tamanho do primeiro segmento PMM (em bytes)" ++ ++msgid "General Settings" ++msgstr "Definições Gerais" ++ ++msgid "How much RAM should Polipo use for its cache." ++msgstr "Quanta memória RAM deverá ser usada pelo polipo para cache." ++ ++msgid "In RAM cache size (in bytes)" ++msgstr "Tamanho da cache em RAM (bytes)" ++ ++msgid "Listen address" ++msgstr "Endereço de escuta" ++ ++msgid "Listen port" ++msgstr "Porta de escuta" ++ ++msgid "" ++"Location where polipo will cache files permanently. Use of external storage " ++"devices is recommended, because the cache can grow considerably. Leave it " ++"empty to disable on-disk cache." ++msgstr "" ++"Local onde o polipo guardará permanentemente os ficheiros de cache. É " ++"recomendada a utilização de dispositivos de armazenamento remoto devido ao " ++"grande crescimento da cache. Deixe em branco para desactivar a cache em " ++"disco." ++ ++msgid "Log file location" ++msgstr "Localização do ficheiro de registo" ++ ++msgid "Log to syslog" ++msgstr "Registar para o syslog" ++ ++msgid "Logging and RAM" ++msgstr "RAM e Logging" ++ ++msgid "Never use system DNS resolver" ++msgstr "Nunca usar o DNS de sistema" ++ ++msgid "On-Disk Cache" ++msgstr "Cache em disco" ++ ++msgid "PMM segments size (in bytes)" ++msgstr "Tamanho do segmento PMM (em bytes)" ++ ++msgid "Parent Proxy" ++msgstr "Proxy Superior" ++ ++msgid "Parent proxy address" ++msgstr "Endereço do proxy de hierarquia superior." ++ ++msgid "" ++"Parent proxy address (in host:port format), to which Polipo will forward the " ++"requests." ++msgstr "" ++"Endereço do proxy de hierarquia superior (no formato host:porta), ao qual o " ++"polipo irá encaminhar os seus pedidos." ++ ++msgid "Parent proxy authentication" ++msgstr "Autenticação em cache de hierarquia superior" ++ ++msgid "Polipo" ++msgstr "Polipo" ++ ++msgid "Polipo Status" ++msgstr "Estado do Polipo" ++ ++msgid "Polipo is a small and fast caching web proxy." ++msgstr "O polipo é um proxy web ligeiro e rápido." ++ ++msgid "Poor Man's Multiplexing" ++msgstr "Multiplexagem simples" ++ ++msgid "" ++"Poor Man's Multiplexing (PMM) is a technique that simulates multiplexing by " ++"requesting an instance in multiple segments. It tries to lower the latency " ++"caused by the weakness of HTTP protocol. NOTE: some sites may not work with " ++"PMM enabled." ++msgstr "" ++"A multiplexagem simples (PMM) consiste na simulação de multiplexagem através " ++"da requesição de um pedido em multiplos segmentos. O método tenta baixar a " ++"latencia causada pela debilidade do protocolo HTTP. Nota: alguns sites web " ++"não funcionam com a activação de PMM." ++ ++msgid "Port on which Polipo will listen" ++msgstr "Porta na qual o Polipo irá escutar" ++ ++msgid "Proxy" ++msgstr "Proxy" ++ ++msgid "Query DNS by hostname" ++msgstr "Pedidos ao DNS através de hostname" ++ ++msgid "Query DNS directly, fallback to system resolver" ++msgstr "Consultar o DNS diretamente, voltar à resolução de nomes do sistema" ++ ++msgid "Query DNS directly, for unknown hosts fall back to system resolver" ++msgstr "" ++"Consultar o DNS diretamente, para hosts desconhecidos voltar à resolução de " ++"nomes de sistema" ++ ++msgid "Query DNS for IPv6" ++msgstr "Consultar DNS para o IPv6" ++ ++msgid "Query IPv4 and IPv6, prefer IPv4" ++msgstr "Consultar IPv4 e IPv6, preferência por IPv4" ++ ++msgid "Query IPv4 and IPv6, prefer IPv6" ++msgstr "Consultar IPv4 e IPv6, preferência por IPv6" ++ ++msgid "Query only IPv6" ++msgstr "Consultar apenas IPv6" ++ ++msgid "" ++"Set the DNS server address to use, if you want Polipo to use different DNS " ++"server than the host system." ++msgstr "" ++"Define o endereço do servidor de DNS a usar, caso pretenda que o polipo " ++"utilize um servidor alternativo ao do sistema." ++ ++msgid "Shared cache" ++msgstr "Cache partilhada" ++ ++msgid "" ++"Size of the first PMM segment. If not defined, it defaults to twice the PMM " ++"segment size." ++msgstr "" ++"Tamanho do primeiro segmento PMM. Se não estiver definido, reverte para o " ++"dobro do tamanho do segmento PMM." ++ ++msgid "Size to which cached files should be truncated" ++msgstr "Tamanho a partir do qual os ficheiro em cache devem ser truncados" ++ ++msgid "Status" ++msgstr "Estado" ++ ++msgid "Syslog facility" ++msgstr "Categoria dos eventos polipo no registo do sistema" ++ ++msgid "" ++"The interface on which Polipo will listen. To listen on all interfaces use " ++"0.0.0.0 or :: (IPv6)." ++msgstr "" ++"O interface no qual o polipo será activado. Para activar em todos os " ++"endereços, use 0.0.0.0 ou :: (IPv6)." ++ ++msgid "Time after which cached files will be deleted" ++msgstr "Tempo após o qual os ficheiro em cache devem ser eliminados" ++ ++msgid "Time after which cached files will be truncated" ++msgstr "Tempo após o qual os ficheiro em cache devem ser truncados" ++ ++msgid "To enable PMM, PMM segment size must be set to some positive value." ++msgstr "" ++"Para ativar PMM, o tamanho do segmento PMM tem de ser definido para um valor " ++"positivo." ++ ++msgid "Truncate cache files size (in bytes)" ++msgstr "Tamanho de trancagem dos ficheiros de cache (bytes)" ++ ++msgid "Truncate cache files time" ++msgstr "Tempo de trancagem dos ficheiros de cache" ++ ++msgid "" ++"Use of external storage device is recommended, because the log file is " ++"written frequently and can grow considerably." ++msgstr "" ++"É recomendado o recurso a sistemas de armazenamento de ficheiros externos, " ++"devido ao rápido crescimento do ficheiro de registo." ++ ++msgid "" ++"When listen address is set to 0.0.0.0 or :: (IPv6), you must list clients " ++"that are allowed to connect. The format is IP address or network address " ++"(192.168.1.123, 192.168.1.0/24, 2001:660:116::/48 (IPv6))" ++msgstr "" ++"Quando o endereço de escuta está definido como 0.0.0.0 ou :: (IPv6), tem de " ++"listar os clientes que estão autorizados a ligar. O formato do endereço IP " ++"ou o endereço de rede (192.168.1.123, 192.168.1.0/24, 2001:660:116::/48 " ++"(IPv6))" ++ ++msgid "enable" ++msgstr "ativar" ++ ++#~ msgid "" ++#~ "To enable polipo on-disk cache cleaning (highly recommended), you should " ++#~ "add a cron job in Scheduled Tasks services that will execute /usr/sbin/" ++#~ "polipo_purge script. For example to perform disk cache cleanup every day " ++#~ "at 6:00 in the morning you should add the following line in Scheduled " ++#~ "Tasks \"0 6 * * *\\t/usr/sbin/polipo_purge\" (without quotes)." ++#~ msgstr "" ++#~ "Para activar a limpeza de cache em disco (altamente recomendado), deve " ++#~ "acrescentar uma tarefa cron (\"Serviços\") que execute o script /usr/sbin/" ++#~ "polipo_purge. Como exemplo, para executar uma limpeza da cache " ++#~ "diariamente pelas 06H00 deve acrescentar a seguinte linha: \"0 6 * * * /" ++#~ "usr/sbin/polipo_purge\" (sem as aspas)." ++ ++#~ msgid "" ++#~ "Size to which cached files should be truncated. (default value: 1048576)" ++#~ msgstr "" ++#~ "Tamanho com o qual devem ser trancados os ficheiros da cache. (valor pre-" ++#~ "definido: 1048576)" ++ ++#~ msgid "" ++#~ "Time after which cached files will be truncated. (default value: 4d12h)" ++#~ msgstr "" ++#~ "Tempo após o qual os ficheiros de cache serão trancados. (valor pre-" ++#~ "definido: 4d12h)" ++ ++#~ msgid "Time after which cached files will be deleted. (default value: 32d)" ++#~ msgstr "" ++#~ "Tempo apos o qual os ficheiros de cache serão removidos. (valor pré-" ++#~ "definido: 32d)" ++ ++#~ msgid "General" ++#~ msgstr "Geral" ++ ++#~ msgid "" ++#~ "When listen address is set to 0.0.0.0 or :: (IPv6), you must list clients " ++#~ "that are allowed to connect. The format is IP address or network address " ++#~ "(192.168.1.123, 192.168.1.0/24, 2001:660:116::/48 (IPv6))." ++#~ msgstr "" ++#~ "Quando o endereço de listen fôr 0.0.0.0 (IPv4) ou :: (IPv6), deve listar " ++#~ "os clientes que tiverem permissão para ligação. O formato é endereço de " ++#~ "host ou endereço de rede (192.168.1.123, 192.168.1.0/24, " ++#~ "2001:660:116::/48 (IPv6))." ++ ++#~ msgid "" ++#~ "false = Do not query IPv6; reluctantly = Query both, prefer IPv4; happily " ++#~ "= Query both, prefer IPv6; true = Query only IPv6" ++#~ msgstr "" ++#~ "false = Não pedir IPv6; reluctantly=Pedir ambos e preferir IPv4; " ++#~ "happily=Pedir ambos, preferir IPv6; true=Pedir apenas IPv6" ++ ++#~ msgid "" ++#~ "false = Never use system DNS resolver; reluctantly = Query DNS directly, " ++#~ "if DNS server is unavailable fail to system DNS resolver; happily = Query " ++#~ "DNS directly, if host could not be found fallback to system DNS resolver; " ++#~ "true = Always use system DNS resolver" ++#~ msgstr "" ++#~ "false=nunca usar o resolver do sistema; reluctantly=pedir DNS " ++#~ "directamente, se o servidor DNS estiver indisponivel recorrer do resolver " ++#~ "DNS do sistema; happily=pedir DNS directamente, se o host nao for " ++#~ "encontrado, recorrer ao resolver DNS do sistema; true=Usar sempre o " ++#~ "resolver DNS do sistema" ++ ++#~ msgid "Port on which Polipo will listen. (default value: 8123)" ++#~ msgstr "Porta local na qual o polipo será activado. (pre-definido: 8123)" ++ ++#~ msgid "polipo_pmm_pmmsize_desc" ++#~ msgstr "" ++#~ "Para activar PMM, o tamanho do segmento PMM deve ser definido para um " ++#~ "qualquer valor positivo." +diff --git a/feeds/luci/applications/luci-app-polipo/po/ro/polipo.po b/feeds/luci/applications/luci-app-polipo/po/ro/polipo.po +new file mode 100644 +index 0000000..2c2710a +--- /dev/null ++++ b/feeds/luci/applications/luci-app-polipo/po/ro/polipo.po +@@ -0,0 +1,206 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"PO-Revision-Date: 2014-06-28 18:42+0200\n" ++"Last-Translator: xxvirusxx \n" ++"Language-Team: none\n" ++"Language: ro\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=3; plural=(n==1 ? 0 : (n==0 || (n%100 > 0 && n%100 < " ++"20)) ? 1 : 2);;\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "Advanced Settings" ++msgstr "Setări avansate" ++ ++msgid "Allowed clients" ++msgstr "" ++ ++msgid "Always use system DNS resolver" ++msgstr "" ++ ++msgid "" ++"Basic HTTP authentication supported. Provide username and password in " ++"username:password format." ++msgstr "" ++ ++msgid "Configuration" ++msgstr "" ++ ++msgid "DNS and Query Settings" ++msgstr "" ++ ++msgid "DNS server address" ++msgstr "" ++ ++msgid "Delete cache files time" ++msgstr "" ++ ++msgid "Disk cache location" ++msgstr "" ++ ++msgid "Do not query IPv6" ++msgstr "" ++ ++msgid "Enable if cache (proxy) is shared by multiple users." ++msgstr "" ++ ++msgid "First PMM segment size (in bytes)" ++msgstr "" ++ ++msgid "General Settings" ++msgstr "" ++ ++msgid "How much RAM should Polipo use for its cache." ++msgstr "" ++ ++msgid "In RAM cache size (in bytes)" ++msgstr "" ++ ++msgid "Listen address" ++msgstr "" ++ ++msgid "Listen port" ++msgstr "" ++ ++msgid "" ++"Location where polipo will cache files permanently. Use of external storage " ++"devices is recommended, because the cache can grow considerably. Leave it " ++"empty to disable on-disk cache." ++msgstr "" ++ ++msgid "Log file location" ++msgstr "" ++ ++msgid "Log to syslog" ++msgstr "" ++ ++msgid "Logging and RAM" ++msgstr "" ++ ++msgid "Never use system DNS resolver" ++msgstr "" ++ ++msgid "On-Disk Cache" ++msgstr "" ++ ++msgid "PMM segments size (in bytes)" ++msgstr "" ++ ++msgid "Parent Proxy" ++msgstr "" ++ ++msgid "Parent proxy address" ++msgstr "" ++ ++msgid "" ++"Parent proxy address (in host:port format), to which Polipo will forward the " ++"requests." ++msgstr "" ++ ++msgid "Parent proxy authentication" ++msgstr "" ++ ++msgid "Polipo" ++msgstr "" ++ ++msgid "Polipo Status" ++msgstr "" ++ ++msgid "Polipo is a small and fast caching web proxy." ++msgstr "" ++ ++msgid "Poor Man's Multiplexing" ++msgstr "" ++ ++msgid "" ++"Poor Man's Multiplexing (PMM) is a technique that simulates multiplexing by " ++"requesting an instance in multiple segments. It tries to lower the latency " ++"caused by the weakness of HTTP protocol. NOTE: some sites may not work with " ++"PMM enabled." ++msgstr "" ++ ++msgid "Port on which Polipo will listen" ++msgstr "" ++ ++msgid "Proxy" ++msgstr "" ++ ++msgid "Query DNS by hostname" ++msgstr "" ++ ++msgid "Query DNS directly, fallback to system resolver" ++msgstr "" ++ ++msgid "Query DNS directly, for unknown hosts fall back to system resolver" ++msgstr "" ++ ++msgid "Query DNS for IPv6" ++msgstr "" ++ ++msgid "Query IPv4 and IPv6, prefer IPv4" ++msgstr "" ++ ++msgid "Query IPv4 and IPv6, prefer IPv6" ++msgstr "" ++ ++msgid "Query only IPv6" ++msgstr "" ++ ++msgid "" ++"Set the DNS server address to use, if you want Polipo to use different DNS " ++"server than the host system." ++msgstr "" ++ ++msgid "Shared cache" ++msgstr "" ++ ++msgid "" ++"Size of the first PMM segment. If not defined, it defaults to twice the PMM " ++"segment size." ++msgstr "" ++ ++msgid "Size to which cached files should be truncated" ++msgstr "" ++ ++msgid "Status" ++msgstr "" ++ ++msgid "Syslog facility" ++msgstr "" ++ ++msgid "" ++"The interface on which Polipo will listen. To listen on all interfaces use " ++"0.0.0.0 or :: (IPv6)." ++msgstr "" ++ ++msgid "Time after which cached files will be deleted" ++msgstr "" ++ ++msgid "Time after which cached files will be truncated" ++msgstr "" ++ ++msgid "To enable PMM, PMM segment size must be set to some positive value." ++msgstr "" ++ ++msgid "Truncate cache files size (in bytes)" ++msgstr "" ++ ++msgid "Truncate cache files time" ++msgstr "" ++ ++msgid "" ++"Use of external storage device is recommended, because the log file is " ++"written frequently and can grow considerably." ++msgstr "" ++ ++msgid "" ++"When listen address is set to 0.0.0.0 or :: (IPv6), you must list clients " ++"that are allowed to connect. The format is IP address or network address " ++"(192.168.1.123, 192.168.1.0/24, 2001:660:116::/48 (IPv6))" ++msgstr "" ++ ++msgid "enable" ++msgstr "" +diff --git a/feeds/luci/applications/luci-app-polipo/po/ru/polipo.po b/feeds/luci/applications/luci-app-polipo/po/ru/polipo.po +new file mode 100644 +index 0000000..f1d4968 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-polipo/po/ru/polipo.po +@@ -0,0 +1,237 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: LuCI: polipo\n" ++"Report-Msgid-Bugs-To: \n" ++"POT-Creation-Date: 2009-05-19 19:36+0200\n" ++"PO-Revision-Date: 2012-08-15 17:51+0300\n" ++"Last-Translator: Roman A. aka BasicXP \n" ++"Language-Team: Russian \n" ++"Language: ru\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%" ++"10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" ++"X-Generator: Pootle 2.0.4\n" ++"X-Poedit-SourceCharset: UTF-8\n" ++ ++msgid "Advanced Settings" ++msgstr "РаÑширенные наÑтройки" ++ ++msgid "Allowed clients" ++msgstr "Разрешённые клиенты" ++ ++msgid "Always use system DNS resolver" ++msgstr "Ð’Ñегда иÑпользовать ÑиÑтемный DNS-клиент" ++ ++msgid "" ++"Basic HTTP authentication supported. Provide username and password in " ++"username:password format." ++msgstr "" ++"ПоддерживаетÑÑ Ð±Ð°Ð·Ð¾Ð²Ð°Ñ HTTP-аутентификациÑ. Введите Ð¸Ð¼Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ Ð¸ " ++"пароль в формате имÑ:пароль." ++ ++msgid "Configuration" ++msgstr "КонфигурациÑ" ++ ++msgid "DNS and Query Settings" ++msgstr "ÐаÑтройки DNS" ++ ++msgid "DNS server address" ++msgstr "ÐÐ´Ñ€ÐµÑ DNS-Ñервера" ++ ++msgid "Delete cache files time" ++msgstr "Ð’Ñ€ÐµÐ¼Ñ ÑƒÐ´Ð°Ð»ÐµÐ½Ð¸Ñ ÐºÑш-файлов" ++ ++msgid "Disk cache location" ++msgstr "МеÑтоположение кÑша" ++ ++msgid "Do not query IPv6" ++msgstr "Ðе запрашивать IPv6" ++ ++msgid "Enable if cache (proxy) is shared by multiple users." ++msgstr "" ++"Включите, еÑли вы хотите, чтобы кÑш (прокÑи) был общим Ð´Ð»Ñ Ð½ÐµÑкольких " ++"пользователей." ++ ++msgid "First PMM segment size (in bytes)" ++msgstr "Размер первого PMM-Ñегмента (в байтах)" ++ ++msgid "General Settings" ++msgstr "Общие наÑтройки" ++ ++msgid "How much RAM should Polipo use for its cache." ++msgstr "КоличеÑтво RAM, отведенное Ð´Ð»Ñ ÐºÐµÑˆÐ°." ++ ++msgid "In RAM cache size (in bytes)" ++msgstr "Размер кÑша в RAM (в байтах)" ++ ++msgid "Listen address" ++msgstr "ÐÐ´Ñ€ÐµÑ Ð´Ð»Ñ Ð²Ñ…Ð¾Ð´Ñщих Ñоединений" ++ ++msgid "Listen port" ++msgstr "Порт Ð´Ð»Ñ Ð²Ñ…Ð¾Ð´Ñщих Ñоединений" ++ ++msgid "" ++"Location where polipo will cache files permanently. Use of external storage " ++"devices is recommended, because the cache can grow considerably. Leave it " ++"empty to disable on-disk cache." ++msgstr "" ++"ДиректориÑ, где Polipo хранит кÑш-файлы. РекомендуетÑÑ Ð¸Ñпользовать внешнее " ++"хранилище, так как размер кÑша может увеличиватьÑÑ. ОÑтавьте пуÑтым, чтобы " ++"отключить хранение кÑша на диÑке." ++ ++msgid "Log file location" ++msgstr "МеÑтоположение файла журнала" ++ ++msgid "Log to syslog" ++msgstr "ЗапиÑывать ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ Ð² ÑиÑтемный журнал" ++ ++msgid "Logging and RAM" ++msgstr "Журналирование и RAM" ++ ++msgid "Never use system DNS resolver" ++msgstr "Ðе иÑпользовать ÑиÑтемный DNS-клиент" ++ ++msgid "On-Disk Cache" ++msgstr "КÑширование на диÑке" ++ ++msgid "PMM segments size (in bytes)" ++msgstr "Размер PMM-Ñегментов (в байтах)" ++ ++msgid "Parent Proxy" ++msgstr "РодительÑкий прокÑи" ++ ++msgid "Parent proxy address" ++msgstr "ÐÐ´Ñ€ÐµÑ Ñ€Ð¾Ð´Ð¸Ñ‚ÐµÐ»ÑŒÑкого прокÑи" ++ ++msgid "" ++"Parent proxy address (in host:port format), to which Polipo will forward the " ++"requests." ++msgstr "" ++"ÐÐ´Ñ€ÐµÑ Ñ€Ð¾Ð´Ð¸Ñ‚ÐµÐ»ÑŒÑкого прокÑи (в формате хоÑÑ‚:порт), на который Polipo будет " ++"перенаправлÑÑ‚ÑŒ запроÑÑ‹." ++ ++msgid "Parent proxy authentication" ++msgstr "ÐÑƒÑ‚ÐµÐ½Ñ‚Ð¸Ñ„Ð¸ÐºÐ°Ñ†Ð¸Ñ Ñ€Ð¾Ð´Ð¸Ñ‚ÐµÐ»ÑŒÑкого прокÑи" ++ ++msgid "Polipo" ++msgstr "Polipo" ++ ++msgid "Polipo Status" ++msgstr "СоÑтоÑние Polipo" ++ ++msgid "Polipo is a small and fast caching web proxy." ++msgstr "Polipo - небольшой веб-прокÑи, иÑпользующий кÑширование." ++ ++msgid "Poor Man's Multiplexing" ++msgstr "Poor Man's Multiplexing" ++ ++msgid "" ++"Poor Man's Multiplexing (PMM) is a technique that simulates multiplexing by " ++"requesting an instance in multiple segments. It tries to lower the latency " ++"caused by the weakness of HTTP protocol. NOTE: some sites may not work with " ++"PMM enabled." ++msgstr "" ++"Poor Man's Multiplexing (PMM) - Ñто техника, ÐºÐ¾Ñ‚Ð¾Ñ€Ð°Ñ Ð¿Ð¾Ð·Ð²Ð¾Ð»Ñет запрашивать " ++"данные из неÑкольких иÑточников. Таким образом, Ð²Ñ€ÐµÐ¼Ñ Ð¾Ñ‚ÐºÐ»Ð¸ÐºÐ° по HTTP-" ++"протоколу ÑокращаетÑÑ. ПРИМЕЧÐÐИЕ: некоторые Ñайты могут не работать Ñ " ++"включенным PMM." ++ ++msgid "Port on which Polipo will listen" ++msgstr "Порт, на котором Polipo будет ожидать входÑщие ÑоединениÑ" ++ ++msgid "Proxy" ++msgstr "ПрокÑи" ++ ++msgid "Query DNS by hostname" ++msgstr "Запрашивать DNS, иÑÐ¿Ð¾Ð»ÑŒÐ·ÑƒÑ Ð¸Ð¼Ñ Ñ…Ð¾Ñта" ++ ++msgid "Query DNS directly, fallback to system resolver" ++msgstr "" ++"Запрашивать DNS напрÑмую, иÑпользовать ÑиÑтемный клиент в Ñлучае ошибки" ++ ++msgid "Query DNS directly, for unknown hosts fall back to system resolver" ++msgstr "" ++"Запрашивать DNS напрÑмую, иÑпользовать ÑиÑтемный клиент Ð´Ð»Ñ Ð½ÐµÐ¸Ð·Ð²ÐµÑтных " ++"хоÑтов" ++ ++msgid "Query DNS for IPv6" ++msgstr "Запрашивать DNS Ð´Ð»Ñ IPv6" ++ ++msgid "Query IPv4 and IPv6, prefer IPv4" ++msgstr "Запрашивать IPv4 и IPv6, предпочитать IPv4" ++ ++msgid "Query IPv4 and IPv6, prefer IPv6" ++msgstr "Запрашивать IPv4 и IPv6, предпочитать IPv6" ++ ++msgid "Query only IPv6" ++msgstr "Запрашивать только IPv6" ++ ++msgid "" ++"Set the DNS server address to use, if you want Polipo to use different DNS " ++"server than the host system." ++msgstr "" ++"УÑтановите Ð°Ð´Ñ€ÐµÑ DNS-Ñервера Ð´Ð»Ñ Polipo в Ñлучае, еÑли он отличаетÑÑ Ð¾Ñ‚ " ++"ÑиÑтемного." ++ ++msgid "Shared cache" ++msgstr "Общий кÑш" ++ ++msgid "" ++"Size of the first PMM segment. If not defined, it defaults to twice the PMM " ++"segment size." ++msgstr "" ++"Размер первого PMM Ñегмента. ЕÑли не указано, то размер первого Ñегмента " ++"будет равен двум обычным." ++ ++msgid "Size to which cached files should be truncated" ++msgstr "Размер, до которого будут Ñокращены файлы кÑша" ++ ++msgid "Status" ++msgstr "СоÑтоÑние" ++ ++msgid "Syslog facility" ++msgstr "СиÑтемный журнал" ++ ++msgid "" ++"The interface on which Polipo will listen. To listen on all interfaces use " ++"0.0.0.0 or :: (IPv6)." ++msgstr "" ++"ИнтерфейÑ, на котором Polipo будет ожидать входÑщие ÑоединениÑ. Чтобы " ++"ожидать на вÑех интерфейÑах, иÑпользуйте 0.0.0.0 или :: (IPv6)." ++ ++msgid "Time after which cached files will be deleted" ++msgstr "Интервал, поÑле которого файлы кÑша будут удалены" ++ ++msgid "Time after which cached files will be truncated" ++msgstr "Интервал, поÑле которого файлы кÑша будут Ñокращены" ++ ++msgid "To enable PMM, PMM segment size must be set to some positive value." ++msgstr "Чтобы включить PMM, размер PMM Ñегмента должен быть уÑтановлен." ++ ++msgid "Truncate cache files size (in bytes)" ++msgstr "Сократить размер файлов кÑша (в байтах)" ++ ++msgid "Truncate cache files time" ++msgstr "Ð’Ñ€ÐµÐ¼Ñ ÑÐ¾ÐºÑ€Ð°Ñ‰ÐµÐ½Ð¸Ñ Ñ„Ð°Ð¹Ð»Ð¾Ð² кÑша" ++ ++msgid "" ++"Use of external storage device is recommended, because the log file is " ++"written frequently and can grow considerably." ++msgstr "" ++"РекомендуетÑÑ Ð¸Ñпользовать внешнее хранилище, так как журнал чаÑто " ++"обновлÑетÑÑ Ð¸ может значительно увеличиватьÑÑ Ð² размере." ++ ++msgid "" ++"When listen address is set to 0.0.0.0 or :: (IPv6), you must list clients " ++"that are allowed to connect. The format is IP address or network address " ++"(192.168.1.123, 192.168.1.0/24, 2001:660:116::/48 (IPv6))" ++msgstr "" ++"ЕÑли Ð°Ð´Ñ€ÐµÑ Ð´Ð»Ñ Ð²Ñ…Ð¾Ð´Ñщих Ñоединений уÑтановлен в 0.0.0.0 или :: (IPv6), вам " ++"необходимо перечиÑлить клиентов, которым разрешено подключатьÑÑ. Ð’ таком " ++"Ñлучае формат - Ñто IP-Ð°Ð´Ñ€ÐµÑ Ð¸Ð»Ð¸ Ð°Ð´Ñ€ÐµÑ Ð¿Ð¾Ð´Ñети (192.168.1.123, " ++"192.168.1.0/24, 2001:660:116::/48 (IPv6))" ++ ++msgid "enable" ++msgstr "включить" +diff --git a/feeds/luci/applications/luci-app-polipo/po/sk/polipo.po b/feeds/luci/applications/luci-app-polipo/po/sk/polipo.po +new file mode 100644 +index 0000000..e003c17 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-polipo/po/sk/polipo.po +@@ -0,0 +1,202 @@ ++msgid "" ++msgstr "" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Last-Translator: Automatically generated\n" ++"Language-Team: none\n" ++"MIME-Version: 1.0\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n" ++ ++msgid "Advanced Settings" ++msgstr "" ++ ++msgid "Allowed clients" ++msgstr "" ++ ++msgid "Always use system DNS resolver" ++msgstr "" ++ ++msgid "" ++"Basic HTTP authentication supported. Provide username and password in " ++"username:password format." ++msgstr "" ++ ++msgid "Configuration" ++msgstr "" ++ ++msgid "DNS and Query Settings" ++msgstr "" ++ ++msgid "DNS server address" ++msgstr "" ++ ++msgid "Delete cache files time" ++msgstr "" ++ ++msgid "Disk cache location" ++msgstr "" ++ ++msgid "Do not query IPv6" ++msgstr "" ++ ++msgid "Enable if cache (proxy) is shared by multiple users." ++msgstr "" ++ ++msgid "First PMM segment size (in bytes)" ++msgstr "" ++ ++msgid "General Settings" ++msgstr "" ++ ++msgid "How much RAM should Polipo use for its cache." ++msgstr "" ++ ++msgid "In RAM cache size (in bytes)" ++msgstr "" ++ ++msgid "Listen address" ++msgstr "" ++ ++msgid "Listen port" ++msgstr "" ++ ++msgid "" ++"Location where polipo will cache files permanently. Use of external storage " ++"devices is recommended, because the cache can grow considerably. Leave it " ++"empty to disable on-disk cache." ++msgstr "" ++ ++msgid "Log file location" ++msgstr "" ++ ++msgid "Log to syslog" ++msgstr "" ++ ++msgid "Logging and RAM" ++msgstr "" ++ ++msgid "Never use system DNS resolver" ++msgstr "" ++ ++msgid "On-Disk Cache" ++msgstr "" ++ ++msgid "PMM segments size (in bytes)" ++msgstr "" ++ ++msgid "Parent Proxy" ++msgstr "" ++ ++msgid "Parent proxy address" ++msgstr "" ++ ++msgid "" ++"Parent proxy address (in host:port format), to which Polipo will forward the " ++"requests." ++msgstr "" ++ ++msgid "Parent proxy authentication" ++msgstr "" ++ ++msgid "Polipo" ++msgstr "" ++ ++msgid "Polipo Status" ++msgstr "" ++ ++msgid "Polipo is a small and fast caching web proxy." ++msgstr "" ++ ++msgid "Poor Man's Multiplexing" ++msgstr "" ++ ++msgid "" ++"Poor Man's Multiplexing (PMM) is a technique that simulates multiplexing by " ++"requesting an instance in multiple segments. It tries to lower the latency " ++"caused by the weakness of HTTP protocol. NOTE: some sites may not work with " ++"PMM enabled." ++msgstr "" ++ ++msgid "Port on which Polipo will listen" ++msgstr "" ++ ++msgid "Proxy" ++msgstr "" ++ ++msgid "Query DNS by hostname" ++msgstr "" ++ ++msgid "Query DNS directly, fallback to system resolver" ++msgstr "" ++ ++msgid "Query DNS directly, for unknown hosts fall back to system resolver" ++msgstr "" ++ ++msgid "Query DNS for IPv6" ++msgstr "" ++ ++msgid "Query IPv4 and IPv6, prefer IPv4" ++msgstr "" ++ ++msgid "Query IPv4 and IPv6, prefer IPv6" ++msgstr "" ++ ++msgid "Query only IPv6" ++msgstr "" ++ ++msgid "" ++"Set the DNS server address to use, if you want Polipo to use different DNS " ++"server than the host system." ++msgstr "" ++ ++msgid "Shared cache" ++msgstr "" ++ ++msgid "" ++"Size of the first PMM segment. If not defined, it defaults to twice the PMM " ++"segment size." ++msgstr "" ++ ++msgid "Size to which cached files should be truncated" ++msgstr "" ++ ++msgid "Status" ++msgstr "" ++ ++msgid "Syslog facility" ++msgstr "" ++ ++msgid "" ++"The interface on which Polipo will listen. To listen on all interfaces use " ++"0.0.0.0 or :: (IPv6)." ++msgstr "" ++ ++msgid "Time after which cached files will be deleted" ++msgstr "" ++ ++msgid "Time after which cached files will be truncated" ++msgstr "" ++ ++msgid "To enable PMM, PMM segment size must be set to some positive value." ++msgstr "" ++ ++msgid "Truncate cache files size (in bytes)" ++msgstr "" ++ ++msgid "Truncate cache files time" ++msgstr "" ++ ++msgid "" ++"Use of external storage device is recommended, because the log file is " ++"written frequently and can grow considerably." ++msgstr "" ++ ++msgid "" ++"When listen address is set to 0.0.0.0 or :: (IPv6), you must list clients " ++"that are allowed to connect. The format is IP address or network address " ++"(192.168.1.123, 192.168.1.0/24, 2001:660:116::/48 (IPv6))" ++msgstr "" ++ ++msgid "enable" ++msgstr "" +diff --git a/feeds/luci/applications/luci-app-polipo/po/sv/polipo.po b/feeds/luci/applications/luci-app-polipo/po/sv/polipo.po +new file mode 100644 +index 0000000..7b64c7a +--- /dev/null ++++ b/feeds/luci/applications/luci-app-polipo/po/sv/polipo.po +@@ -0,0 +1,203 @@ ++msgid "" ++msgstr "" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Last-Translator: Automatically generated\n" ++"Language-Team: none\n" ++"Language: sv\n" ++"MIME-Version: 1.0\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n != 1);\n" ++ ++msgid "Advanced Settings" ++msgstr "" ++ ++msgid "Allowed clients" ++msgstr "" ++ ++msgid "Always use system DNS resolver" ++msgstr "" ++ ++msgid "" ++"Basic HTTP authentication supported. Provide username and password in " ++"username:password format." ++msgstr "" ++ ++msgid "Configuration" ++msgstr "" ++ ++msgid "DNS and Query Settings" ++msgstr "" ++ ++msgid "DNS server address" ++msgstr "" ++ ++msgid "Delete cache files time" ++msgstr "" ++ ++msgid "Disk cache location" ++msgstr "" ++ ++msgid "Do not query IPv6" ++msgstr "" ++ ++msgid "Enable if cache (proxy) is shared by multiple users." ++msgstr "" ++ ++msgid "First PMM segment size (in bytes)" ++msgstr "" ++ ++msgid "General Settings" ++msgstr "" ++ ++msgid "How much RAM should Polipo use for its cache." ++msgstr "" ++ ++msgid "In RAM cache size (in bytes)" ++msgstr "" ++ ++msgid "Listen address" ++msgstr "" ++ ++msgid "Listen port" ++msgstr "" ++ ++msgid "" ++"Location where polipo will cache files permanently. Use of external storage " ++"devices is recommended, because the cache can grow considerably. Leave it " ++"empty to disable on-disk cache." ++msgstr "" ++ ++msgid "Log file location" ++msgstr "" ++ ++msgid "Log to syslog" ++msgstr "" ++ ++msgid "Logging and RAM" ++msgstr "" ++ ++msgid "Never use system DNS resolver" ++msgstr "" ++ ++msgid "On-Disk Cache" ++msgstr "" ++ ++msgid "PMM segments size (in bytes)" ++msgstr "" ++ ++msgid "Parent Proxy" ++msgstr "" ++ ++msgid "Parent proxy address" ++msgstr "" ++ ++msgid "" ++"Parent proxy address (in host:port format), to which Polipo will forward the " ++"requests." ++msgstr "" ++ ++msgid "Parent proxy authentication" ++msgstr "" ++ ++msgid "Polipo" ++msgstr "" ++ ++msgid "Polipo Status" ++msgstr "" ++ ++msgid "Polipo is a small and fast caching web proxy." ++msgstr "" ++ ++msgid "Poor Man's Multiplexing" ++msgstr "" ++ ++msgid "" ++"Poor Man's Multiplexing (PMM) is a technique that simulates multiplexing by " ++"requesting an instance in multiple segments. It tries to lower the latency " ++"caused by the weakness of HTTP protocol. NOTE: some sites may not work with " ++"PMM enabled." ++msgstr "" ++ ++msgid "Port on which Polipo will listen" ++msgstr "" ++ ++msgid "Proxy" ++msgstr "" ++ ++msgid "Query DNS by hostname" ++msgstr "" ++ ++msgid "Query DNS directly, fallback to system resolver" ++msgstr "" ++ ++msgid "Query DNS directly, for unknown hosts fall back to system resolver" ++msgstr "" ++ ++msgid "Query DNS for IPv6" ++msgstr "" ++ ++msgid "Query IPv4 and IPv6, prefer IPv4" ++msgstr "" ++ ++msgid "Query IPv4 and IPv6, prefer IPv6" ++msgstr "" ++ ++msgid "Query only IPv6" ++msgstr "" ++ ++msgid "" ++"Set the DNS server address to use, if you want Polipo to use different DNS " ++"server than the host system." ++msgstr "" ++ ++msgid "Shared cache" ++msgstr "" ++ ++msgid "" ++"Size of the first PMM segment. If not defined, it defaults to twice the PMM " ++"segment size." ++msgstr "" ++ ++msgid "Size to which cached files should be truncated" ++msgstr "" ++ ++msgid "Status" ++msgstr "" ++ ++msgid "Syslog facility" ++msgstr "" ++ ++msgid "" ++"The interface on which Polipo will listen. To listen on all interfaces use " ++"0.0.0.0 or :: (IPv6)." ++msgstr "" ++ ++msgid "Time after which cached files will be deleted" ++msgstr "" ++ ++msgid "Time after which cached files will be truncated" ++msgstr "" ++ ++msgid "To enable PMM, PMM segment size must be set to some positive value." ++msgstr "" ++ ++msgid "Truncate cache files size (in bytes)" ++msgstr "" ++ ++msgid "Truncate cache files time" ++msgstr "" ++ ++msgid "" ++"Use of external storage device is recommended, because the log file is " ++"written frequently and can grow considerably." ++msgstr "" ++ ++msgid "" ++"When listen address is set to 0.0.0.0 or :: (IPv6), you must list clients " ++"that are allowed to connect. The format is IP address or network address " ++"(192.168.1.123, 192.168.1.0/24, 2001:660:116::/48 (IPv6))" ++msgstr "" ++ ++msgid "enable" ++msgstr "" +diff --git a/feeds/luci/applications/luci-app-polipo/po/templates/polipo.pot b/feeds/luci/applications/luci-app-polipo/po/templates/polipo.pot +new file mode 100644 +index 0000000..beb0bdb +--- /dev/null ++++ b/feeds/luci/applications/luci-app-polipo/po/templates/polipo.pot +@@ -0,0 +1,195 @@ ++msgid "" ++msgstr "Content-Type: text/plain; charset=UTF-8" ++ ++msgid "Advanced Settings" ++msgstr "" ++ ++msgid "Allowed clients" ++msgstr "" ++ ++msgid "Always use system DNS resolver" ++msgstr "" ++ ++msgid "" ++"Basic HTTP authentication supported. Provide username and password in " ++"username:password format." ++msgstr "" ++ ++msgid "Configuration" ++msgstr "" ++ ++msgid "DNS and Query Settings" ++msgstr "" ++ ++msgid "DNS server address" ++msgstr "" ++ ++msgid "Delete cache files time" ++msgstr "" ++ ++msgid "Disk cache location" ++msgstr "" ++ ++msgid "Do not query IPv6" ++msgstr "" ++ ++msgid "Enable if cache (proxy) is shared by multiple users." ++msgstr "" ++ ++msgid "First PMM segment size (in bytes)" ++msgstr "" ++ ++msgid "General Settings" ++msgstr "" ++ ++msgid "How much RAM should Polipo use for its cache." ++msgstr "" ++ ++msgid "In RAM cache size (in bytes)" ++msgstr "" ++ ++msgid "Listen address" ++msgstr "" ++ ++msgid "Listen port" ++msgstr "" ++ ++msgid "" ++"Location where polipo will cache files permanently. Use of external storage " ++"devices is recommended, because the cache can grow considerably. Leave it " ++"empty to disable on-disk cache." ++msgstr "" ++ ++msgid "Log file location" ++msgstr "" ++ ++msgid "Log to syslog" ++msgstr "" ++ ++msgid "Logging and RAM" ++msgstr "" ++ ++msgid "Never use system DNS resolver" ++msgstr "" ++ ++msgid "On-Disk Cache" ++msgstr "" ++ ++msgid "PMM segments size (in bytes)" ++msgstr "" ++ ++msgid "Parent Proxy" ++msgstr "" ++ ++msgid "Parent proxy address" ++msgstr "" ++ ++msgid "" ++"Parent proxy address (in host:port format), to which Polipo will forward the " ++"requests." ++msgstr "" ++ ++msgid "Parent proxy authentication" ++msgstr "" ++ ++msgid "Polipo" ++msgstr "" ++ ++msgid "Polipo Status" ++msgstr "" ++ ++msgid "Polipo is a small and fast caching web proxy." ++msgstr "" ++ ++msgid "Poor Man's Multiplexing" ++msgstr "" ++ ++msgid "" ++"Poor Man's Multiplexing (PMM) is a technique that simulates multiplexing by " ++"requesting an instance in multiple segments. It tries to lower the latency " ++"caused by the weakness of HTTP protocol. NOTE: some sites may not work with " ++"PMM enabled." ++msgstr "" ++ ++msgid "Port on which Polipo will listen" ++msgstr "" ++ ++msgid "Proxy" ++msgstr "" ++ ++msgid "Query DNS by hostname" ++msgstr "" ++ ++msgid "Query DNS directly, fallback to system resolver" ++msgstr "" ++ ++msgid "Query DNS directly, for unknown hosts fall back to system resolver" ++msgstr "" ++ ++msgid "Query DNS for IPv6" ++msgstr "" ++ ++msgid "Query IPv4 and IPv6, prefer IPv4" ++msgstr "" ++ ++msgid "Query IPv4 and IPv6, prefer IPv6" ++msgstr "" ++ ++msgid "Query only IPv6" ++msgstr "" ++ ++msgid "" ++"Set the DNS server address to use, if you want Polipo to use different DNS " ++"server than the host system." ++msgstr "" ++ ++msgid "Shared cache" ++msgstr "" ++ ++msgid "" ++"Size of the first PMM segment. If not defined, it defaults to twice the PMM " ++"segment size." ++msgstr "" ++ ++msgid "Size to which cached files should be truncated" ++msgstr "" ++ ++msgid "Status" ++msgstr "" ++ ++msgid "Syslog facility" ++msgstr "" ++ ++msgid "" ++"The interface on which Polipo will listen. To listen on all interfaces use " ++"0.0.0.0 or :: (IPv6)." ++msgstr "" ++ ++msgid "Time after which cached files will be deleted" ++msgstr "" ++ ++msgid "Time after which cached files will be truncated" ++msgstr "" ++ ++msgid "To enable PMM, PMM segment size must be set to some positive value." ++msgstr "" ++ ++msgid "Truncate cache files size (in bytes)" ++msgstr "" ++ ++msgid "Truncate cache files time" ++msgstr "" ++ ++msgid "" ++"Use of external storage device is recommended, because the log file is " ++"written frequently and can grow considerably." ++msgstr "" ++ ++msgid "" ++"When listen address is set to 0.0.0.0 or :: (IPv6), you must list clients " ++"that are allowed to connect. The format is IP address or network address " ++"(192.168.1.123, 192.168.1.0/24, 2001:660:116::/48 (IPv6))" ++msgstr "" ++ ++msgid "enable" ++msgstr "" +diff --git a/feeds/luci/applications/luci-app-polipo/po/tr/polipo.po b/feeds/luci/applications/luci-app-polipo/po/tr/polipo.po +new file mode 100644 +index 0000000..25982ec +--- /dev/null ++++ b/feeds/luci/applications/luci-app-polipo/po/tr/polipo.po +@@ -0,0 +1,202 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Last-Translator: Automatically generated\n" ++"Language-Team: none\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=1; plural=0;\n" ++ ++msgid "Advanced Settings" ++msgstr "" ++ ++msgid "Allowed clients" ++msgstr "" ++ ++msgid "Always use system DNS resolver" ++msgstr "" ++ ++msgid "" ++"Basic HTTP authentication supported. Provide username and password in " ++"username:password format." ++msgstr "" ++ ++msgid "Configuration" ++msgstr "" ++ ++msgid "DNS and Query Settings" ++msgstr "" ++ ++msgid "DNS server address" ++msgstr "" ++ ++msgid "Delete cache files time" ++msgstr "" ++ ++msgid "Disk cache location" ++msgstr "" ++ ++msgid "Do not query IPv6" ++msgstr "" ++ ++msgid "Enable if cache (proxy) is shared by multiple users." ++msgstr "" ++ ++msgid "First PMM segment size (in bytes)" ++msgstr "" ++ ++msgid "General Settings" ++msgstr "" ++ ++msgid "How much RAM should Polipo use for its cache." ++msgstr "" ++ ++msgid "In RAM cache size (in bytes)" ++msgstr "" ++ ++msgid "Listen address" ++msgstr "" ++ ++msgid "Listen port" ++msgstr "" ++ ++msgid "" ++"Location where polipo will cache files permanently. Use of external storage " ++"devices is recommended, because the cache can grow considerably. Leave it " ++"empty to disable on-disk cache." ++msgstr "" ++ ++msgid "Log file location" ++msgstr "" ++ ++msgid "Log to syslog" ++msgstr "" ++ ++msgid "Logging and RAM" ++msgstr "" ++ ++msgid "Never use system DNS resolver" ++msgstr "" ++ ++msgid "On-Disk Cache" ++msgstr "" ++ ++msgid "PMM segments size (in bytes)" ++msgstr "" ++ ++msgid "Parent Proxy" ++msgstr "" ++ ++msgid "Parent proxy address" ++msgstr "" ++ ++msgid "" ++"Parent proxy address (in host:port format), to which Polipo will forward the " ++"requests." ++msgstr "" ++ ++msgid "Parent proxy authentication" ++msgstr "" ++ ++msgid "Polipo" ++msgstr "" ++ ++msgid "Polipo Status" ++msgstr "" ++ ++msgid "Polipo is a small and fast caching web proxy." ++msgstr "" ++ ++msgid "Poor Man's Multiplexing" ++msgstr "" ++ ++msgid "" ++"Poor Man's Multiplexing (PMM) is a technique that simulates multiplexing by " ++"requesting an instance in multiple segments. It tries to lower the latency " ++"caused by the weakness of HTTP protocol. NOTE: some sites may not work with " ++"PMM enabled." ++msgstr "" ++ ++msgid "Port on which Polipo will listen" ++msgstr "" ++ ++msgid "Proxy" ++msgstr "" ++ ++msgid "Query DNS by hostname" ++msgstr "" ++ ++msgid "Query DNS directly, fallback to system resolver" ++msgstr "" ++ ++msgid "Query DNS directly, for unknown hosts fall back to system resolver" ++msgstr "" ++ ++msgid "Query DNS for IPv6" ++msgstr "" ++ ++msgid "Query IPv4 and IPv6, prefer IPv4" ++msgstr "" ++ ++msgid "Query IPv4 and IPv6, prefer IPv6" ++msgstr "" ++ ++msgid "Query only IPv6" ++msgstr "" ++ ++msgid "" ++"Set the DNS server address to use, if you want Polipo to use different DNS " ++"server than the host system." ++msgstr "" ++ ++msgid "Shared cache" ++msgstr "" ++ ++msgid "" ++"Size of the first PMM segment. If not defined, it defaults to twice the PMM " ++"segment size." ++msgstr "" ++ ++msgid "Size to which cached files should be truncated" ++msgstr "" ++ ++msgid "Status" ++msgstr "" ++ ++msgid "Syslog facility" ++msgstr "" ++ ++msgid "" ++"The interface on which Polipo will listen. To listen on all interfaces use " ++"0.0.0.0 or :: (IPv6)." ++msgstr "" ++ ++msgid "Time after which cached files will be deleted" ++msgstr "" ++ ++msgid "Time after which cached files will be truncated" ++msgstr "" ++ ++msgid "To enable PMM, PMM segment size must be set to some positive value." ++msgstr "" ++ ++msgid "Truncate cache files size (in bytes)" ++msgstr "" ++ ++msgid "Truncate cache files time" ++msgstr "" ++ ++msgid "" ++"Use of external storage device is recommended, because the log file is " ++"written frequently and can grow considerably." ++msgstr "" ++ ++msgid "" ++"When listen address is set to 0.0.0.0 or :: (IPv6), you must list clients " ++"that are allowed to connect. The format is IP address or network address " ++"(192.168.1.123, 192.168.1.0/24, 2001:660:116::/48 (IPv6))" ++msgstr "" ++ ++msgid "enable" ++msgstr "" +diff --git a/feeds/luci/applications/luci-app-polipo/po/uk/polipo.po b/feeds/luci/applications/luci-app-polipo/po/uk/polipo.po +new file mode 100644 +index 0000000..9b1b637 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-polipo/po/uk/polipo.po +@@ -0,0 +1,206 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"PO-Revision-Date: 2013-09-21 15:36+0200\n" ++"Last-Translator: zubr_139 \n" ++"Language-Team: none\n" ++"Language: uk\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%" ++"10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "Advanced Settings" ++msgstr "Додаткові налаштуваннÑ" ++ ++msgid "Allowed clients" ++msgstr "" ++ ++msgid "Always use system DNS resolver" ++msgstr "" ++ ++msgid "" ++"Basic HTTP authentication supported. Provide username and password in " ++"username:password format." ++msgstr "" ++ ++msgid "Configuration" ++msgstr "КонфігураціÑ" ++ ++msgid "DNS and Query Settings" ++msgstr "" ++ ++msgid "DNS server address" ++msgstr "" ++ ++msgid "Delete cache files time" ++msgstr "" ++ ++msgid "Disk cache location" ++msgstr "" ++ ++msgid "Do not query IPv6" ++msgstr "" ++ ++msgid "Enable if cache (proxy) is shared by multiple users." ++msgstr "" ++ ++msgid "First PMM segment size (in bytes)" ++msgstr "" ++ ++msgid "General Settings" ++msgstr "" ++ ++msgid "How much RAM should Polipo use for its cache." ++msgstr "" ++ ++msgid "In RAM cache size (in bytes)" ++msgstr "" ++ ++msgid "Listen address" ++msgstr "" ++ ++msgid "Listen port" ++msgstr "" ++ ++msgid "" ++"Location where polipo will cache files permanently. Use of external storage " ++"devices is recommended, because the cache can grow considerably. Leave it " ++"empty to disable on-disk cache." ++msgstr "" ++ ++msgid "Log file location" ++msgstr "" ++ ++msgid "Log to syslog" ++msgstr "" ++ ++msgid "Logging and RAM" ++msgstr "" ++ ++msgid "Never use system DNS resolver" ++msgstr "" ++ ++msgid "On-Disk Cache" ++msgstr "" ++ ++msgid "PMM segments size (in bytes)" ++msgstr "" ++ ++msgid "Parent Proxy" ++msgstr "" ++ ++msgid "Parent proxy address" ++msgstr "" ++ ++msgid "" ++"Parent proxy address (in host:port format), to which Polipo will forward the " ++"requests." ++msgstr "" ++ ++msgid "Parent proxy authentication" ++msgstr "" ++ ++msgid "Polipo" ++msgstr "" ++ ++msgid "Polipo Status" ++msgstr "" ++ ++msgid "Polipo is a small and fast caching web proxy." ++msgstr "" ++ ++msgid "Poor Man's Multiplexing" ++msgstr "" ++ ++msgid "" ++"Poor Man's Multiplexing (PMM) is a technique that simulates multiplexing by " ++"requesting an instance in multiple segments. It tries to lower the latency " ++"caused by the weakness of HTTP protocol. NOTE: some sites may not work with " ++"PMM enabled." ++msgstr "" ++ ++msgid "Port on which Polipo will listen" ++msgstr "" ++ ++msgid "Proxy" ++msgstr "" ++ ++msgid "Query DNS by hostname" ++msgstr "" ++ ++msgid "Query DNS directly, fallback to system resolver" ++msgstr "" ++ ++msgid "Query DNS directly, for unknown hosts fall back to system resolver" ++msgstr "" ++ ++msgid "Query DNS for IPv6" ++msgstr "" ++ ++msgid "Query IPv4 and IPv6, prefer IPv4" ++msgstr "" ++ ++msgid "Query IPv4 and IPv6, prefer IPv6" ++msgstr "" ++ ++msgid "Query only IPv6" ++msgstr "" ++ ++msgid "" ++"Set the DNS server address to use, if you want Polipo to use different DNS " ++"server than the host system." ++msgstr "" ++ ++msgid "Shared cache" ++msgstr "" ++ ++msgid "" ++"Size of the first PMM segment. If not defined, it defaults to twice the PMM " ++"segment size." ++msgstr "" ++ ++msgid "Size to which cached files should be truncated" ++msgstr "" ++ ++msgid "Status" ++msgstr "" ++ ++msgid "Syslog facility" ++msgstr "" ++ ++msgid "" ++"The interface on which Polipo will listen. To listen on all interfaces use " ++"0.0.0.0 or :: (IPv6)." ++msgstr "" ++ ++msgid "Time after which cached files will be deleted" ++msgstr "" ++ ++msgid "Time after which cached files will be truncated" ++msgstr "" ++ ++msgid "To enable PMM, PMM segment size must be set to some positive value." ++msgstr "" ++ ++msgid "Truncate cache files size (in bytes)" ++msgstr "" ++ ++msgid "Truncate cache files time" ++msgstr "" ++ ++msgid "" ++"Use of external storage device is recommended, because the log file is " ++"written frequently and can grow considerably." ++msgstr "" ++ ++msgid "" ++"When listen address is set to 0.0.0.0 or :: (IPv6), you must list clients " ++"that are allowed to connect. The format is IP address or network address " ++"(192.168.1.123, 192.168.1.0/24, 2001:660:116::/48 (IPv6))" ++msgstr "" ++ ++msgid "enable" ++msgstr "" +diff --git a/feeds/luci/applications/luci-app-polipo/po/vi/polipo.po b/feeds/luci/applications/luci-app-polipo/po/vi/polipo.po +new file mode 100644 +index 0000000..0765db3 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-polipo/po/vi/polipo.po +@@ -0,0 +1,290 @@ ++# polipo.pot ++# generated from ./applications/luci-polipo/luasrc/i18n/polipo.en.lua ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Report-Msgid-Bugs-To: \n" ++"POT-Creation-Date: 2009-08-16 06:58+0200\n" ++"PO-Revision-Date: 2009-08-13 07:49+0200\n" ++"Last-Translator: Hong Phuc Dang \n" ++"Language-Team: LANGUAGE \n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"X-Generator: Pootle 1.1.0\n" ++ ++msgid "Advanced Settings" ++msgstr "" ++ ++msgid "Allowed clients" ++msgstr "Äối tượng cho phép" ++ ++msgid "Always use system DNS resolver" ++msgstr "" ++ ++msgid "" ++"Basic HTTP authentication supported. Provide username and password in " ++"username:password format." ++msgstr "" ++"Sá»± chứng thá»±c HTTP CÆ¡ bản được há»— trợ. Cung cấp tên ngÆ°á»i dùng và mật khẩu " ++"trong tên ngÆ°á»i dùng: mật khẩu định dạng" ++ ++msgid "Configuration" ++msgstr "" ++ ++msgid "DNS and Query Settings" ++msgstr "" ++ ++msgid "DNS server address" ++msgstr "Äịa chỉ tên miá»n máy chủ" ++ ++msgid "Delete cache files time" ++msgstr "Xóa tập tin cạc khi" ++ ++msgid "Disk cache location" ++msgstr "Vị trí cạc Ä‘Ä©a" ++ ++msgid "Do not query IPv6" ++msgstr "" ++ ++msgid "Enable if cache (proxy) is shared by multiple users." ++msgstr "Kích hoạt nếu cạc được chia rẻ bởi nhiá»u ngÆ°á»i dùng." ++ ++msgid "First PMM segment size (in bytes)" ++msgstr "Dung lượng phân Ä‘oạn PMM đầu tiên (in bytes)" ++ ++msgid "General Settings" ++msgstr "" ++ ++msgid "How much RAM should Polipo use for its cache." ++msgstr "Bao nhiêu RAM Polipo nên dùng cho cạc." ++ ++msgid "In RAM cache size (in bytes)" ++msgstr "Trong RAM dung lượng cạc (tính theo bytes)" ++ ++msgid "Listen address" ++msgstr "Äịa chỉ nge" ++ ++msgid "Listen port" ++msgstr "Cổng nghe" ++ ++msgid "" ++"Location where polipo will cache files permanently. Use of external storage " ++"devices is recommended, because the cache can grow considerably. Leave it " ++"empty to disable on-disk cache." ++msgstr "" ++"Vị trị mà polipo sẽ định các tập tin thÆ°á»ng xuyên. Sá»­ dụng thiết bị nhá»› " ++"ngoài được khuyến khích, bởi vì cạc có thể lá»›n lên đáng kể. Äể lại nó trống " ++"để vô hiệu hóa Trên cạc trên Ä‘Ä©a." ++ ++msgid "Log file location" ++msgstr "Vị trí tập tin sổ ghi" ++ ++msgid "Log to syslog" ++msgstr "Log to syslog" ++ ++msgid "Logging and RAM" ++msgstr "" ++ ++msgid "Never use system DNS resolver" ++msgstr "" ++ ++msgid "On-Disk Cache" ++msgstr "Cạc trên ổ Ä‘Ä©a" ++ ++msgid "PMM segments size (in bytes)" ++msgstr "Dung lượng phân Ä‘oạn PMM (in bytes)" ++ ++msgid "Parent Proxy" ++msgstr "" ++ ++msgid "Parent proxy address" ++msgstr "Äịa chỉ parent proxy " ++ ++msgid "" ++"Parent proxy address (in host:port format), to which Polipo will forward the " ++"requests." ++msgstr "" ++"Äịa chỉ parent proxy (in host:port format), cái mà Polipo sẽ chuyển yêu cầu " ++"tá»›i." ++ ++msgid "Parent proxy authentication" ++msgstr "Xác thá»±c parent proxy " ++ ++msgid "Polipo" ++msgstr "Polipo" ++ ++msgid "Polipo Status" ++msgstr "" ++ ++msgid "Polipo is a small and fast caching web proxy." ++msgstr "Polipo là má»™t web proxy nhá» và nhanh caching." ++ ++msgid "Poor Man's Multiplexing" ++msgstr "Poor Man&#39;s Multiplexing" ++ ++msgid "" ++"Poor Man's Multiplexing (PMM) is a technique that simulates multiplexing by " ++"requesting an instance in multiple segments. It tries to lower the latency " ++"caused by the weakness of HTTP protocol. NOTE: some sites may not work with " ++"PMM enabled." ++msgstr "" ++"Poor Man&#39;s Multiplexing (PMM) là má»™t kỹ thuật kích thích " ++"multiplexing bằng cách yêu cầu trÆ°á»ng hợp trong nhiá»u phân Ä‘oạn. Nó cố gắng " ++"hạ thấp sá»± trá»… nãi do các Ä‘iểm yếu HTTP protocol gây ra. Chú ý: má»™t số trang " ++"web có thể không hoạt Ä‘á»™ng vá»›i PMM bật." ++ ++msgid "Port on which Polipo will listen" ++msgstr "" ++ ++msgid "Proxy" ++msgstr "" ++ ++msgid "Query DNS by hostname" ++msgstr "Tra vấn DNS bằng hostname" ++ ++msgid "Query DNS directly, fallback to system resolver" ++msgstr "" ++ ++msgid "Query DNS directly, for unknown hosts fall back to system resolver" ++msgstr "" ++ ++msgid "Query DNS for IPv6" ++msgstr "Tra vấn DNS cho IPv6" ++ ++msgid "Query IPv4 and IPv6, prefer IPv4" ++msgstr "" ++ ++msgid "Query IPv4 and IPv6, prefer IPv6" ++msgstr "" ++ ++msgid "Query only IPv6" ++msgstr "" ++ ++msgid "" ++"Set the DNS server address to use, if you want Polipo to use different DNS " ++"server than the host system." ++msgstr "" ++"Cài đặt địa chỉ tên miá»n máy chủ để sá»­ dụng, nếu bạn muốn Polipo dùng tên " ++"miá»n khác vá»›i hệ thông chính. " ++ ++msgid "Shared cache" ++msgstr "Cạc trên ổ Ä‘Ä©a" ++ ++msgid "" ++"Size of the first PMM segment. If not defined, it defaults to twice the PMM " ++"segment size." ++msgstr "" ++"Dung lượng của phân Ä‘oạn PMM đầu tiên. Nếu không định nghÄ©a sẽ mặc định dung " ++"lượng của phân Ä‘oạn PMM gấp 2 lần" ++ ++msgid "Size to which cached files should be truncated" ++msgstr "" ++ ++msgid "Status" ++msgstr "" ++ ++msgid "Syslog facility" ++msgstr "Syslog facility" ++ ++msgid "" ++"The interface on which Polipo will listen. To listen on all interfaces use " ++"0.0.0.0 or :: (IPv6)." ++msgstr "" ++"Giao diện mà Polipo sẽ nghe. Äể nghe trên tất cả các giao diện dùng 0.0.0.0 " ++"hoặc :: (IPv6)" ++ ++msgid "Time after which cached files will be deleted" ++msgstr "" ++ ++msgid "Time after which cached files will be truncated" ++msgstr "" ++ ++msgid "To enable PMM, PMM segment size must be set to some positive value." ++msgstr "" ++ ++msgid "Truncate cache files size (in bytes)" ++msgstr "Bá» bá»›t những tập tin cạc vá»›i dung lượng (bytes)" ++ ++msgid "Truncate cache files time" ++msgstr "Cắt bá» tập tin cạc khi" ++ ++msgid "" ++"Use of external storage device is recommended, because the log file is " ++"written frequently and can grow considerably." ++msgstr "" ++"Nên dùng bá»™ nhá»› ngoài bởi vì tập tin sổ ghi được viết rất nhiá»u lần và có " ++"thể phát tán rất mạnh. " ++ ++msgid "" ++"When listen address is set to 0.0.0.0 or :: (IPv6), you must list clients " ++"that are allowed to connect. The format is IP address or network address " ++"(192.168.1.123, 192.168.1.0/24, 2001:660:116::/48 (IPv6))" ++msgstr "" ++ ++msgid "enable" ++msgstr "" ++ ++#~ msgid "" ++#~ "To enable polipo on-disk cache cleaning (highly recommended), you should " ++#~ "add a cron job in Scheduled Tasks services that will execute /usr/sbin/" ++#~ "polipo_purge script. For example to perform disk cache cleanup every day " ++#~ "at 6:00 in the morning you should add the following line in Scheduled " ++#~ "Tasks \"0 6 * * *\\t/usr/sbin/polipo_purge\" (without quotes)." ++#~ msgstr "" ++#~ "Äể kích hoạt tính năng làm sạch trên cạc Ä‘Ä©a polipo (rất khuyến khích), " ++#~ "bạn nên thêm vào má»™t công việc cron trong những công tác đã schedule, nó " ++#~ "sẽ thá»±c hiện / usr / sbin / polipo_purge script. Ví dụ: để thá»±c hiện các " ++#~ "Ä‘Ä©a bá»™ nhá»› cache má»—i ngày vào lúc 6:00 sáng, bạn nên thêm dòng sau trong " ++#~ "Scheduled công việc &quot;0 6 * * * /usr/sbin/polipo_purge&quot; " ++#~ "(không có dấu ngoặc kép)." ++ ++#~ msgid "" ++#~ "Size to which cached files should be truncated. (default value: 1048576)" ++#~ msgstr "Dung lượng mà những tập tin cạc bị cắt bá». (Giá trị: 1048576)" ++ ++#~ msgid "" ++#~ "Time after which cached files will be truncated. (default value: 4d12h)" ++#~ msgstr "Thá»i gian khi tập tin cạc sẽ bị cắt bá» (Giá trị: 4d12h)" ++ ++#~ msgid "Time after which cached files will be deleted. (default value: 32d)" ++#~ msgstr "Thá»i gian khi tập tin cạc sẽ bị xóa. (Giá trị: 32d)" ++ ++#~ msgid "General" ++#~ msgstr "Tổng quát" ++ ++#~ msgid "" ++#~ "When listen address is set to 0.0.0.0 or :: (IPv6), you must list clients " ++#~ "that are allowed to connect. The format is IP address or network address " ++#~ "(192.168.1.123, 192.168.1.0/24, 2001:660:116::/48 (IPv6))." ++#~ msgstr "" ++#~ "Khi nghe địa chỉ được đặt ở 0.0.0.0 hoặc :: (IPv6), bạn phải liệt kê " ++#~ "những đối tượng được phép kết nối. Äịnh dạng là địa chỉ IP hoặc địa chỉ " ++#~ "mạng (192.168.1.123, 192.168.1.0/24, 2001:660:116::/48 (IPv6))." ++ ++#~ msgid "" ++#~ "false = Do not query IPv6; reluctantly = Query both, prefer IPv4; happily " ++#~ "= Query both, prefer IPv6; true = Query only IPv6" ++#~ msgstr "" ++#~ "False = Äừng truy vấn IPv6; reluctantly = Truy vấn cả hai, IPv4 được " ++#~ "chuá»™ng hÆ¡n; happily = truy vấn cả hai, IPv6 chuá»™ng hÆ¡n; true = chỉ truy " ++#~ "vấn IPv6" ++ ++#~ msgid "" ++#~ "false = Never use system DNS resolver; reluctantly = Query DNS directly, " ++#~ "if DNS server is unavailable fail to system DNS resolver; happily = Query " ++#~ "DNS directly, if host could not be found fallback to system DNS resolver; " ++#~ "true = Always use system DNS resolver" ++#~ msgstr "" ++#~ "false = Äừng bao giá» dùng bá»™ phân tích hệ thống DNS; reluctantly = Truy " ++#~ "vấn DNS trá»±c tiếp, nếu DNS server không có sẵn trong bá»™ phân tích hệ " ++#~ "thống DNS; happily = truy vấn DNS trá»±c tiếp, nếu host bị đẩy lùi so vá»›i " ++#~ "bá»™ phân tích hệ thống DNS; true = Luân luân dùng bá»™ phân tích hệ thống DNS" ++ ++#~ msgid "Port on which Polipo will listen. (default value: 8123)" ++#~ msgstr "Cổng mà Polipo sẽ nghe. (giá trị: 8123)" ++ ++#~ msgid "polipo_pmm_pmmsize_desc" ++#~ msgstr "" ++#~ "Äể kích hoạt PMM, dung lượng phân Ä‘oạn PMM phải được đặt những giá trị " ++#~ "dÆ°Æ¡ng." +diff --git a/feeds/luci/applications/luci-app-polipo/po/zh-cn/polipo.po b/feeds/luci/applications/luci-app-polipo/po/zh-cn/polipo.po +new file mode 100644 +index 0000000..7dcbe23 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-polipo/po/zh-cn/polipo.po +@@ -0,0 +1,205 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"PO-Revision-Date: 2013-10-09 03:47+0200\n" ++"Last-Translator: Tanyingyu \n" ++"Language-Team: none\n" ++"Language: zh_CN\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=1; plural=0;\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "Advanced Settings" ++msgstr "高级设置" ++ ++msgid "Allowed clients" ++msgstr "å…许的客户端" ++ ++msgid "Always use system DNS resolver" ++msgstr "始终使用系统DNS解æž" ++ ++msgid "" ++"Basic HTTP authentication supported. Provide username and password in " ++"username:password format." ++msgstr "支æŒHTTP基本身份验è¯ã€‚æ供用户å和密ç æ ¼å¼ä¸ºï¼šç”¨æˆ·å:密ç ã€‚" ++ ++msgid "Configuration" ++msgstr "é…ç½®" ++ ++msgid "DNS and Query Settings" ++msgstr "DNS查询设置" ++ ++msgid "DNS server address" ++msgstr "DNS地å€" ++ ++msgid "Delete cache files time" ++msgstr "清除缓存文件周期" ++ ++msgid "Disk cache location" ++msgstr "ç£ç›˜ç¼“å­˜ä½ç½®" ++ ++msgid "Do not query IPv6" ++msgstr "ä¸èƒ½æŸ¥è¯¢IPv6" ++ ++msgid "Enable if cache (proxy) is shared by multiple users." ++msgstr "å…许多用户共享缓存(代ç†ï¼‰ã€‚" ++ ++msgid "First PMM segment size (in bytes)" ++msgstr "第一的PMM段的大å°ï¼ˆå­—节为å•ä½ï¼‰" ++ ++msgid "General Settings" ++msgstr "通用设置" ++ ++msgid "How much RAM should Polipo use for its cache." ++msgstr "" ++ ++msgid "In RAM cache size (in bytes)" ++msgstr "" ++ ++msgid "Listen address" ++msgstr "监å¬åœ°å€" ++ ++msgid "Listen port" ++msgstr "监å¬ç«¯å£" ++ ++msgid "" ++"Location where polipo will cache files permanently. Use of external storage " ++"devices is recommended, because the cache can grow considerably. Leave it " ++"empty to disable on-disk cache." ++msgstr "polipo将永久缓存文件。建议使用外部存储设备,因为缓存会一直增长。留空表示ç¦ç”¨ç£ç›˜ç¼“存。" ++ ++msgid "Log file location" ++msgstr "日志存放ä½ç½®" ++ ++msgid "Log to syslog" ++msgstr "å日志到syslog" ++ ++msgid "Logging and RAM" ++msgstr "" ++ ++msgid "Never use system DNS resolver" ++msgstr "从ä¸ä½¿ç”¨ç³»ç»ŸDNS解æž" ++ ++msgid "On-Disk Cache" ++msgstr "ç£ç›˜ç¼“å­˜" ++ ++msgid "PMM segments size (in bytes)" ++msgstr "" ++ ++msgid "Parent Proxy" ++msgstr "" ++ ++msgid "Parent proxy address" ++msgstr "" ++ ++msgid "" ++"Parent proxy address (in host:port format), to which Polipo will forward the " ++"requests." ++msgstr "" ++ ++msgid "Parent proxy authentication" ++msgstr "" ++ ++msgid "Polipo" ++msgstr "" ++ ++msgid "Polipo Status" ++msgstr "" ++ ++msgid "Polipo is a small and fast caching web proxy." ++msgstr "" ++ ++msgid "Poor Man's Multiplexing" ++msgstr "" ++ ++msgid "" ++"Poor Man's Multiplexing (PMM) is a technique that simulates multiplexing by " ++"requesting an instance in multiple segments. It tries to lower the latency " ++"caused by the weakness of HTTP protocol. NOTE: some sites may not work with " ++"PMM enabled." ++msgstr "" ++ ++msgid "Port on which Polipo will listen" ++msgstr "" ++ ++msgid "Proxy" ++msgstr "" ++ ++msgid "Query DNS by hostname" ++msgstr "" ++ ++msgid "Query DNS directly, fallback to system resolver" ++msgstr "" ++ ++msgid "Query DNS directly, for unknown hosts fall back to system resolver" ++msgstr "" ++ ++msgid "Query DNS for IPv6" ++msgstr "" ++ ++msgid "Query IPv4 and IPv6, prefer IPv4" ++msgstr "" ++ ++msgid "Query IPv4 and IPv6, prefer IPv6" ++msgstr "" ++ ++msgid "Query only IPv6" ++msgstr "" ++ ++msgid "" ++"Set the DNS server address to use, if you want Polipo to use different DNS " ++"server than the host system." ++msgstr "" ++ ++msgid "Shared cache" ++msgstr "" ++ ++msgid "" ++"Size of the first PMM segment. If not defined, it defaults to twice the PMM " ++"segment size." ++msgstr "" ++ ++msgid "Size to which cached files should be truncated" ++msgstr "" ++ ++msgid "Status" ++msgstr "" ++ ++msgid "Syslog facility" ++msgstr "" ++ ++msgid "" ++"The interface on which Polipo will listen. To listen on all interfaces use " ++"0.0.0.0 or :: (IPv6)." ++msgstr "" ++ ++msgid "Time after which cached files will be deleted" ++msgstr "" ++ ++msgid "Time after which cached files will be truncated" ++msgstr "" ++ ++msgid "To enable PMM, PMM segment size must be set to some positive value." ++msgstr "" ++ ++msgid "Truncate cache files size (in bytes)" ++msgstr "" ++ ++msgid "Truncate cache files time" ++msgstr "" ++ ++msgid "" ++"Use of external storage device is recommended, because the log file is " ++"written frequently and can grow considerably." ++msgstr "" ++ ++msgid "" ++"When listen address is set to 0.0.0.0 or :: (IPv6), you must list clients " ++"that are allowed to connect. The format is IP address or network address " ++"(192.168.1.123, 192.168.1.0/24, 2001:660:116::/48 (IPv6))" ++msgstr "" ++ ++msgid "enable" ++msgstr "" +diff --git a/feeds/luci/applications/luci-app-polipo/po/zh-tw/polipo.po b/feeds/luci/applications/luci-app-polipo/po/zh-tw/polipo.po +new file mode 100644 +index 0000000..5058897 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-polipo/po/zh-tw/polipo.po +@@ -0,0 +1,205 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"PO-Revision-Date: 2014-05-21 13:13+0200\n" ++"Last-Translator: omnistack \n" ++"Language-Team: none\n" ++"Language: zh_TW\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=1; plural=0;\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "Advanced Settings" ++msgstr "進階設定" ++ ++msgid "Allowed clients" ++msgstr "å…許的客戶端" ++ ++msgid "Always use system DNS resolver" ++msgstr "總是採用系統使用的DNS解æž" ++ ++msgid "" ++"Basic HTTP authentication supported. Provide username and password in " ++"username:password format." ++msgstr "基本的HTTP驗證支æ´. æ供使用者å稱和密碼以username:passwordæ ¼å¼" ++ ++msgid "Configuration" ++msgstr "設定" ++ ++msgid "DNS and Query Settings" ++msgstr "DNSåŠæŸ¥è©¢è¨­å®šå€¼" ++ ++msgid "DNS server address" ++msgstr "DNS伺æœå™¨ä½å€" ++ ++msgid "Delete cache files time" ++msgstr "刪除快å–檔的時間" ++ ++msgid "Disk cache location" ++msgstr "ç£ç¢Ÿå¿«å–放置的ä½ç½®" ++ ++msgid "Do not query IPv6" ++msgstr "ä¸ä½¿ç”¨IPv6查詢" ++ ++msgid "Enable if cache (proxy) is shared by multiple users." ++msgstr "å‡è‹¥å¿«å–(Proxy)被多個使用者分享使用就啓用" ++ ++msgid "First PMM segment size (in bytes)" ++msgstr "第一個PMM段的大å°(以bytesæ–¹å¼è¡¨ç¤º)" ++ ++msgid "General Settings" ++msgstr "基本設定" ++ ++msgid "How much RAM should Polipo use for its cache." ++msgstr "Polipo拿來當快å–的記憶體é‡æ˜¯å¤šå¤§?" ++ ++msgid "In RAM cache size (in bytes)" ++msgstr "記憶體快å–大å°(以bytesæ–¹å¼è¡¨ç¤º)" ++ ++msgid "Listen address" ++msgstr "è†è½ä½å€" ++ ++msgid "Listen port" ++msgstr "è†è½åŸ è™Ÿ" ++ ++msgid "" ++"Location where polipo will cache files permanently. Use of external storage " ++"devices is recommended, because the cache can grow considerably. Leave it " ++"empty to disable on-disk cache." ++msgstr "Polipoä½ç½®å°‡æ°¸ä¹…å¿«å–文件。建議使用外部的存儲設備,因為快å–會顯著增長。ä¿ç•™ç©ºç™½ä»¥ä¾¿é—œé–‰ç£ç¢Ÿå¿«å–." ++ ++msgid "Log file location" ++msgstr "紀錄檔ä½ç½®" ++ ++msgid "Log to syslog" ++msgstr "記錄到系統記錄syslog中" ++ ++msgid "Logging and RAM" ++msgstr "記錄和記憶體" ++ ++msgid "Never use system DNS resolver" ++msgstr "從ä¸ä½¿ç”¨ç³»çµ±DNS解æž" ++ ++msgid "On-Disk Cache" ++msgstr "ç£ç¢Ÿä¸Šçš„å¿«å–" ++ ++msgid "PMM segments size (in bytes)" ++msgstr "PMM段大å°(以bytes表示)" ++ ++msgid "Parent Proxy" ++msgstr "上層Proxy" ++ ++msgid "Parent proxy address" ++msgstr "上層Proxyä½å€" ++ ++msgid "" ++"Parent proxy address (in host:port format), to which Polipo will forward the " ++"requests." ++msgstr "Polipo應該é‡å°Žé€™å€‹è¦æ±‚所到的上層Proxy(以 主機:埠號 æ ¼å¼è¡¨ç¤º)." ++ ++msgid "Parent proxy authentication" ++msgstr "上層Proxyä½å€é©—è­‰" ++ ++msgid "Polipo" ++msgstr "Polipo本地代ç†ä¼ºæœå™¨" ++ ++msgid "Polipo Status" ++msgstr "Polipoç‹€æ³" ++ ++msgid "Polipo is a small and fast caching web proxy." ++msgstr "Polipo是一個å°åž‹ä¸”快速的快å–網é ä»£ç†" ++ ++msgid "Poor Man's Multiplexing" ++msgstr "窮人的多工器Poor Man's Multiplexing" ++ ++msgid "" ++"Poor Man's Multiplexing (PMM) is a technique that simulates multiplexing by " ++"requesting an instance in multiple segments. It tries to lower the latency " ++"caused by the weakness of HTTP protocol. NOTE: some sites may not work with " ++"PMM enabled." ++msgstr "" ++ ++msgid "Port on which Polipo will listen" ++msgstr " Polipoè†è½çš„埠號" ++ ++msgid "Proxy" ++msgstr "代ç†ä¼ºæœå™¨" ++ ++msgid "Query DNS by hostname" ++msgstr "以主機å稱查詢DNS" ++ ++msgid "Query DNS directly, fallback to system resolver" ++msgstr "直接查詢DNS, 回傳給系統解æž" ++ ++msgid "Query DNS directly, for unknown hosts fall back to system resolver" ++msgstr "直接查詢DNS, å°èŽ«å的主機回傳給系統解æž" ++ ++msgid "Query DNS for IPv6" ++msgstr "幫IPv6查詢DNS" ++ ++msgid "Query IPv4 and IPv6, prefer IPv4" ++msgstr "查詢IPv4å’ŒIPv6,IPv4優先" ++ ++msgid "Query IPv4 and IPv6, prefer IPv6" ++msgstr "查詢IPv4å’ŒIPv6 ,IPv6優先" ++ ++msgid "Query only IPv6" ++msgstr "åªæŸ¥è©¢IPv6" ++ ++msgid "" ++"Set the DNS server address to use, if you want Polipo to use different DNS " ++"server than the host system." ++msgstr "設定DNS伺æœå™¨ä½å€ä»¥ä¾¿ä½¿ç”¨, å‡å¦‚ä½ è¦Polipo代ç†äººä½¿ç”¨ä¸åŒçš„DNS伺æœå™¨è€Œéžä¸»æ©Ÿç³»çµ±." ++ ++msgid "Shared cache" ++msgstr "分享的快å–" ++ ++msgid "" ++"Size of the first PMM segment. If not defined, it defaults to twice the PMM " ++"segment size." ++msgstr "第一個PMMå€æ®µçš„大å°, å‡è‹¥æ²’定義 ,é è¨­å…©æ¬¡PMMå€æ®µçš„大å°." ++ ++msgid "Size to which cached files should be truncated" ++msgstr "å¿«å–檔被截斷的大å°" ++ ++msgid "Status" ++msgstr "狀態" ++ ++msgid "Syslog facility" ++msgstr "日誌設施" ++ ++msgid "" ++"The interface on which Polipo will listen. To listen on all interfaces use " ++"0.0.0.0 or :: (IPv6)." ++msgstr "Polipo將會è†è½çš„介é¢. è¦è†è½æ‰€æœ‰ä»‹é¢ä½¿ç”¨0.0.0.0 或 :: (IPv6)." ++ ++msgid "Time after which cached files will be deleted" ++msgstr "å¿«å–將會被刪除的留存時間" ++ ++msgid "Time after which cached files will be truncated" ++msgstr "å¿«å–將會被斷頭的留存時間" ++ ++msgid "To enable PMM, PMM segment size must be set to some positive value." ++msgstr "è¦å•Ÿç”¨PMM, PMMå€æ®µå¤§å°å¿…須設定些ç©æ¥µçš„數值." ++ ++msgid "Truncate cache files size (in bytes)" ++msgstr "" ++ ++msgid "Truncate cache files time" ++msgstr "" ++ ++msgid "" ++"Use of external storage device is recommended, because the log file is " ++"written frequently and can grow considerably." ++msgstr "" ++ ++msgid "" ++"When listen address is set to 0.0.0.0 or :: (IPv6), you must list clients " ++"that are allowed to connect. The format is IP address or network address " ++"(192.168.1.123, 192.168.1.0/24, 2001:660:116::/48 (IPv6))" ++msgstr "" ++ ++msgid "enable" ++msgstr "" +diff --git a/feeds/luci/applications/luci-app-polipo/root/etc/uci-defaults/luci-polipo b/feeds/luci/applications/luci-app-polipo/root/etc/uci-defaults/luci-polipo +new file mode 100755 +index 0000000..0c57063 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-polipo/root/etc/uci-defaults/luci-polipo +@@ -0,0 +1,11 @@ ++#!/bin/sh ++ ++uci -q batch <<-EOF >/dev/null ++ delete ucitrack.@polipo[-1] ++ add ucitrack polipo ++ set ucitrack.@polipo[-1].init=polipo ++ commit ucitrack ++EOF ++ ++rm -f /tmp/luci-indexcache ++exit 0 +diff --git a/feeds/luci/applications/luci-app-polipo/root/usr/sbin/polipo_purge b/feeds/luci/applications/luci-app-polipo/root/usr/sbin/polipo_purge +new file mode 100755 +index 0000000..23ba571 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-polipo/root/usr/sbin/polipo_purge +@@ -0,0 +1,18 @@ ++#!/bin/sh ++ ++DAEMON=/usr/sbin/polipo ++PIDFILE=`uci get polipo.daemon.pidFile` ++CFGFILE=/var/etc/polipo.conf ++ ++[ -e "$PIDFILE" ] && { ++ PID=`cat $PIDFILE` ++ ++ # send Polipo USR1 signal to write its in-memory cache to disk ++ kill -USR1 $PID ++ sleep 2 ++ # start polipo with -x flag to purge the on-disk cache ++ polipo -c $CFGFILE -x ++ # send Polipo USR2 signal to discard its in-memory cache ++ kill -USR2 $PID ++} ++ +diff --git a/feeds/luci/applications/luci-app-privoxy/Makefile b/feeds/luci/applications/luci-app-privoxy/Makefile +new file mode 100644 +index 0000000..e16eb41 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-privoxy/Makefile +@@ -0,0 +1,38 @@ ++# ++# Copyright (C) 2008-2015 The LuCI Team ++# ++# This is free software, licensed under the Apache License, Version 2.0 . ++# ++ ++include $(TOPDIR)/rules.mk ++ ++PKG_NAME:=luci-app-privoxy ++ ++# Version == major.minor.patch ++# increase "minor" on new functionality and "patch" on patches/optimization ++PKG_VERSION:=1.0.4 ++ ++# Release == build ++# increase on changes of translation files ++PKG_RELEASE:=2 ++ ++PKG_LICENSE:=Apache-2.0 ++PKG_MAINTAINER:=Christian Schoenebeck ++ ++# LuCI specific settings ++LUCI_TITLE:=LuCI Support for Privoxy WEB proxy ++LUCI_DEPENDS:=+luci-mod-admin-full +privoxy ++LUCI_PKGARCH:=all ++ ++define Package/$(PKG_NAME)/config ++# shown in make menuconfig ++help ++ $(LUCI_TITLE) ++ . ++ Version: $(PKG_VERSION)-$(PKG_RELEASE) ++ $(PKG_MAINTAINER) ++endef ++ ++include $(TOPDIR)/feeds/luci/luci.mk ++ ++# call BuildPackage - OpenWrt buildroot signature +diff --git a/feeds/luci/applications/luci-app-privoxy/luasrc/controller/privoxy.lua b/feeds/luci/applications/luci-app-privoxy/luasrc/controller/privoxy.lua +new file mode 100644 +index 0000000..58ba807 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-privoxy/luasrc/controller/privoxy.lua +@@ -0,0 +1,145 @@ ++-- Copyright 2014 Christian Schoenebeck ++-- Licensed under the Apache License, Version 2.0 ++ ++module("luci.controller.privoxy", package.seeall) ++ ++local NX = require "nixio" ++local NXFS = require "nixio.fs" ++local HTTP = require "luci.http" ++local UCI = require "luci.model.uci" ++local UTIL = require "luci.util" ++local SYS = require "luci.sys" ++ ++PRIVOXY_MIN = "3.0.22-0" -- minimum version of service required ++ ++function index() ++ entry( {"admin", "services", "privoxy"}, cbi("privoxy"), _("Privoxy WEB proxy"), 59) ++ entry( {"admin", "services", "privoxy", "logview"}, call("logread") ).leaf = true ++ entry( {"admin", "services", "privoxy", "startstop"}, call("startstop") ).leaf = true ++ entry( {"admin", "services", "privoxy", "status"}, call("get_pid") ).leaf = true ++end ++ ++-- called by XHR.get from detail_logview.htm ++function logread() ++ -- read application settings ++ local uci = UCI.cursor() ++ local logdir = uci:get("privoxy", "privoxy", "logdir") or "/var/log" ++ local logfile = uci:get("privoxy", "privoxy", "logfile") or "privoxy.log" ++ uci:unload("privoxy") ++ ++ local lfile=logdir .. "/" .. logfile ++ local ldata=NXFS.readfile(lfile) ++ if not ldata or #ldata == 0 then ++ ldata="_nodata_" ++ end ++ HTTP.write(ldata) ++end ++ ++-- called by XHR.get from detail_startstop.htm ++function startstop() ++ local pid = get_pid(true) ++ if pid > 0 then ++ SYS.call("/etc/init.d/privoxy stop") ++ NX.nanosleep(1) -- sleep a second ++ if NX.kill(pid, 0) then -- still running ++ NX.kill(pid, 9) -- send SIGKILL ++ end ++ pid = 0 ++ else ++ SYS.call("/etc/init.d/privoxy start") ++ NX.nanosleep(1) -- sleep a second ++ pid = tonumber(NXFS.readfile("/var/run/privoxy.pid") or 0 ) ++ if pid > 0 and not NX.kill(pid, 0) then ++ pid = 0 -- process did not start ++ end ++ end ++ HTTP.write(tostring(pid)) -- HTTP needs string not number ++end ++ ++-- called by XHR.poll from detail_startstop.htm ++-- and from lua (with parameter "true") ++function get_pid(from_lua) ++ local pid = tonumber(NXFS.readfile("/var/run/privoxy.pid") or 0 ) ++ if pid > 0 and not NX.kill(pid, 0) then ++ pid = 0 ++ end ++ if from_lua then ++ return pid ++ else ++ HTTP.write(tostring(pid)) -- HTTP needs string not number ++ end ++end ++ ++-- compare versions using "<=" "<" ">" ">=" "=" "<<" ">>" ++function ipkg_ver_compare(ver1, comp, ver2) ++ if not ver1 or not ver2 ++ or not comp or not (#comp > 0) then return nil end ++ -- correct compare string ++ if comp == "<>" or comp == "><" or comp == "!=" or comp == "~=" then comp = "~=" ++ elseif comp == "<=" or comp == "<" or comp == "=<" then comp = "<=" ++ elseif comp == ">=" or comp == ">" or comp == "=>" then comp = ">=" ++ elseif comp == "=" or comp == "==" then comp = "==" ++ elseif comp == "<<" then comp = "<" ++ elseif comp == ">>" then comp = ">" ++ else return nil end ++ ++ local av1 = UTIL.split(ver1, "[%.%-]", nil, true) ++ local av2 = UTIL.split(ver2, "[%.%-]", nil, true) ++ ++ for i = 1, math.max(table.getn(av1),table.getn(av2)), 1 do ++ local s1 = av1[i] or "" ++ local s2 = av2[i] or "" ++ ++ -- first "not equal" found return true ++ if comp == "~=" and (s1 ~= s2) then return true end ++ -- first "lower" found return true ++ if (comp == "<" or comp == "<=") and (s1 < s2) then return true end ++ -- first "greater" found return true ++ if (comp == ">" or comp == ">=") and (s1 > s2) then return true end ++ -- not equal then return false ++ if (s1 ~= s2) then return false end ++ end ++ ++ -- all equal and not compare greater or lower then true ++ return not (comp == "<" or comp == ">") ++end ++ ++-- read version information for given package if installed ++function ipkg_ver_installed(pkg) ++ local version = nil ++ local control = io.open("/usr/lib/opkg/info/%s.control" % pkg, "r") ++ if control then ++ local ln ++ repeat ++ ln = control:read("*l") ++ if ln and ln:match("^Version: ") then ++ version = ln:gsub("^Version: ", "") ++ break ++ end ++ until not ln ++ control:close() ++ end ++ return version ++end ++ ++-- replacement of build-in Flag.parse of cbi.lua ++-- modified to mark section as changed if value changes ++-- current parse did not do this, but it is done AbstaractValue.parse() ++function flag_parse(self, section) ++ local fexists = self.map:formvalue( ++ luci.cbi.FEXIST_PREFIX .. self.config .. "." .. section .. "." .. self.option) ++ ++ if fexists then ++ local fvalue = self:formvalue(section) and self.enabled or self.disabled ++ local cvalue = self:cfgvalue(section) ++ if fvalue ~= self.default or (not self.optional and not self.rmempty) then ++ self:write(section, fvalue) ++ else ++ self:remove(section) ++ end ++ if (fvalue ~= cvalue) then self.section.changed = true end ++ else ++ self:remove(section) ++ self.section.changed = true ++ end ++end +diff --git a/feeds/luci/applications/luci-app-privoxy/luasrc/model/cbi/privoxy.lua b/feeds/luci/applications/luci-app-privoxy/luasrc/model/cbi/privoxy.lua +new file mode 100644 +index 0000000..c415f8e +--- /dev/null ++++ b/feeds/luci/applications/luci-app-privoxy/luasrc/model/cbi/privoxy.lua +@@ -0,0 +1,978 @@ ++-- Copyright 2014-2015 Christian Schoenebeck ++-- Licensed under the Apache License, Version 2.0 ++ ++local NXFS = require "nixio.fs" ++local SYS = require "luci.sys" ++local UTIL = require "luci.util" ++local DISP = require "luci.dispatcher" ++local DTYP = require "luci.cbi.datatypes" ++local CTRL = require "luci.controller.privoxy" -- this application's controller ++ ++-- Bootstrap theme needs 2 or 3 additional linefeeds for tab description for better optic ++local HELP = [[%s]] ++ ++local VERINST = CTRL.ipkg_ver_installed("privoxy") ++local VEROK = CTRL.ipkg_ver_compare(VERINST,">=",CTRL.PRIVOXY_MIN) ++ ++local TITLE = [[]] ++ .. translate("Privoxy WEB proxy") ++ ++local DESC = translate("Privoxy is a non-caching web proxy with advanced filtering " ++ .. "capabilities for enhancing privacy, modifying web page data and HTTP headers, " ++ .. "controlling access, and removing ads and other obnoxious Internet junk.") ++ .. [[
    ]] ++ .. translate("For help use link at the relevant option") ++ .. [[]] ++ ++-- Error handling if wrong privoxy version installed -- ######################## ++if not nixio.fs.access("/etc/config/privoxy") or not VEROK then ++ local f = SimpleForm("_no_config") ++ f.title = TITLE ++ f.description = DESC ++ f.embedded = true ++ f.submit = false ++ f.reset = false ++ ++ local s = f:section(SimpleSection) ++ s.title = [[]] .. [[]] ++ .. translate("Software update required") ++ .. [[]] .. [[]] ++ ++ local v = s:option(DummyValue, "_update_needed") ++ v.titleref = DISP.build_url("admin", "system", "packages") ++ v.rawhtml = true ++ v.value = [[



        ]] ++ .. translate("The currently installed 'privoxy' package is not supported by LuCI application.") ++ .. [[

        ]] ++ .. translate("required") .. ": " .. CTRL.PRIVOXY_MIN .. " *** ".. translate("installed") .. ": " .. VERINST ++ .. [[

        ]] ++ .. translate("Please update to the current version!") ++ .. [[

    ]] ++ return f ++end ++ ++-- cbi-map -- ################################################################## ++local m = Map("privoxy") ++m.title = TITLE ++m.description = DESC ++function m.commit_handler(self) ++ if self.changed then -- changes ? ++ os.execute("/etc/init.d/privoxy reload &") -- reload configuration ++ end ++end ++ ++-- cbi-section -- ############################################################## ++local ns = m:section( NamedSection, "privoxy", "privoxy") ++ ++ns:tab("local", ++ translate("Local Set-up"), ++ translate("If you intend to operate Privoxy for more users than just yourself, " ++ .. "it might be a good idea to let them know how to reach you, what you block " ++ .. "and why you do that, your policies, etc.") ) ++local function err_tab_local(title, msg) ++ return string.format(translate("Local Set-up") .. " - %s: %s", title, msg ) ++end ++ ++ns:tab("filter", ++ translate("Files and Directories"), ++ translate("Privoxy can (and normally does) use a number of other files " ++ .. "for additional configuration, help and logging. This section of " ++ .. "the configuration file tells Privoxy where to find those other files.") ) ++local function err_tab_filter(title, msg) ++ return string.format(translate("Files and Directories") .. " - %s: %s", title, msg ) ++end ++ ++ns:tab("access", ++ translate("Access Control"), ++ translate("This tab controls the security-relevant aspects of Privoxy's configuration.") ) ++local function err_tab_access(title, msg) ++ return string.format(translate("Access Control") .. " - %s: %s", title, msg ) ++end ++ ++ns:tab("forward", ++ translate("Forwarding"), ++ translate("Configure here the routing of HTTP requests through a chain of multiple proxies. " ++ .. "Note that parent proxies can severely decrease your privacy level. " ++ .. "Also specified here are SOCKS proxies.") ) ++ ++ns:tab("misc", ++ translate("Miscellaneous"), ++ nil) ++local function err_tab_misc(self, msg) ++ return string.format(translate("Miscellaneous") .. " - %s: %s", self.title_base, msg ) ++end ++ ++ns:tab("debug", ++ translate("Logging"), ++ nil ) ++ ++ns:tab("logview", ++ translate("Log File Viewer"), ++ nil ) ++ ++-- tab: local -- ############################################################### ++ ++-- start/stop button ----------------------------------------------------------- ++local btn = ns:taboption("local", Button, "_startstop") ++btn.title = translate("Start / Stop") ++btn.description = translate("Start/Stop Privoxy WEB Proxy") ++btn.template = "privoxy/detail_startstop" ++function btn.cfgvalue(self, section) ++ local pid = CTRL.get_pid(true) ++ if pid > 0 then ++ btn.inputtitle = "PID: " .. pid ++ btn.inputstyle = "reset" ++ btn.disabled = false ++ else ++ btn.inputtitle = translate("Start") ++ btn.inputstyle = "apply" ++ btn.disabled = false ++ end ++ return true ++end ++ ++-- enabled --------------------------------------------------------------------- ++local ena = ns:taboption("local", Flag, "_enabled") ++ena.title = translate("Enabled") ++ena.description = translate("Enable/Disable autostart of Privoxy on system startup and interface events") ++ena.orientation = "horizontal" -- put description under the checkbox ++ena.rmempty = false ++function ena.cfgvalue(self, section) ++ return (SYS.init.enabled("privoxy")) and "1" or "0" ++end ++function ena.validate(self, value) ++ error("Validate " .. value) ++end ++function ena.write(self, section, value) ++ --error("Write " .. value) ++ if value == "1" then ++ return SYS.init.enable("privoxy") ++ else ++ return SYS.init.disable("privoxy") ++ end ++end ++ ++-- hostname -------------------------------------------------------------------- ++local hn = ns:taboption("local", Value, "hostname") ++hn.title = string.format(HELP, "HOSTNAME", "Hostname" ) ++hn.description = translate("The hostname shown on the CGI pages.") ++hn.placeholder = SYS.hostname() ++hn.optional = true ++hn.rmempty = true ++ ++-- user-manual ----------------------------------------------------------------- ++local um = ns:taboption("local", Value, "user_manual") ++um.title = string.format(HELP, "USER-MANUAL", "User Manual" ) ++um.description = translate("Location of the Privoxy User Manual.") ++um.placeholder = "http://www.privoxy.org/user-manual/" ++um.optional = true ++um.rmempty = true ++ ++-- admin-address --------------------------------------------------------------- ++local aa = ns:taboption("local", Value, "admin_address") ++aa.title_base = "Admin Email" ++aa.title = string.format(HELP, "ADMIN-ADDRESS", aa.title_base ) ++aa.description = translate("An email address to reach the Privoxy administrator.") ++aa.placeholder = "privoxy.admin@example.com" ++aa.optional = true ++aa.rmempty = true ++function aa.validate(self, value) ++ if not value or #value == 0 then ++ return "" ++ end ++ if not (value:match("[A-Za-z0-9%.%%%+%-]+@[A-Za-z0-9%.%%%+%-]+%.%w%w%w?%w?")) then ++ return nil, err_tab_local(self.title_base, translate("Invalid email address") ) ++ end ++ return value ++end ++ ++-- proxy-info-url -------------------------------------------------------------- ++local piu = ns:taboption("local", Value, "proxy_info_url") ++piu.title = string.format(HELP, "PROXY-INFO-URL", "Proxy Info URL" ) ++piu.description = translate("A URL to documentation about the local Privoxy setup, configuration or policies.") ++piu.optional = true ++piu.rmempty = true ++ ++-- trust-info-url -------------------------------------------------------------- ++local tiu = ns:taboption("local", Value, "trust_info_url") ++tiu.title = string.format(HELP, "TRUST-INFO-URL", "Trust Info URLs" ) ++tiu.description = translate("A URL to be displayed in the error page that users will see if access to an untrusted page is denied.") ++ .. [[
    ]] ++ .. translate("The value of this option only matters if the experimental trust mechanism has been activated.") ++ .. [[]] ++tiu.optional = true ++tiu.rmepty = true ++ ++-- tab: filter -- ############################################################## ++ ++-- logdir ---------------------------------------------------------------------- ++local ld = ns:taboption("filter", Value, "logdir") ++ld.title_base = "Log Directory" ++ld.title = string.format(HELP, "LOGDIR", ld.title_base ) ++ld.description = translate("The directory where all logging takes place (i.e. where the logfile is located).") ++ .. [[
    ]] ++ .. translate("No trailing '/', please.") ++ld.default = "/var/log" ++ld.rmempty = false ++function ld.validate(self, value) ++ if not value or #value == 0 then ++ return nil, err_tab_filter(self.title_base, translate("Mandatory Input: No Directory given!") ) ++ elseif not NXFS.access(value) then ++ return nil, err_tab_filter(self.title_base, translate("Directory does not exist!") ) ++ else ++ return value ++ end ++end ++ ++-- logfile --------------------------------------------------------------------- ++local lf = ns:taboption("filter", Value, "logfile") ++lf.title_base = "Log File" ++lf.title = string.format(HELP, "LOGFILE", lf.title_base ) ++lf.description = translate("The log file to use. File name, relative to log directory.") ++lf.default = "privoxy.log" ++lf.rmempty = false ++function lf.validate(self, value) ++ if not value or #value == 0 then ++ return nil, err_tab_filter(self.title_base, translate("Mandatory Input: No File given!") ) ++ else ++ return value ++ end ++end ++ ++-- confdir --------------------------------------------------------------------- ++local cd = ns:taboption("filter", Value, "confdir") ++cd.title_base = "Configuration Directory" ++cd.title = string.format(HELP, "CONFDIR", cd.title_base ) ++cd.description = translate("The directory where the other configuration files are located.") ++ .. [[
    ]] ++ .. translate("No trailing '/', please.") ++cd.default = "/etc/privoxy" ++cd.rmempty = false ++function cd.validate(self, value) ++ if not value or #value == 0 then ++ return nil, err_tab_filter(self.title_base, translate("Mandatory Input: No Directory given!") ) ++ elseif not NXFS.access(value) then ++ return nil, err_tab_filter(self.title_base, translate("Directory does not exist!") ) ++ else ++ return value ++ end ++end ++ ++-- templdir -------------------------------------------------------------------- ++local tld = ns:taboption("filter", Value, "templdir") ++tld.title_base = "Template Directory" ++tld.title = string.format(HELP, "TEMPLDIR", tld.title_base ) ++tld.description = translate("An alternative directory where the templates are loaded from.") ++ .. [[
    ]] ++ .. translate("No trailing '/', please.") ++tld.placeholder = "/etc/privoxy/templates" ++tld.rmempty = true ++function tld.validate(self, value) ++ if not NXFS.access(value) then ++ return nil, err_tab_filter(self.title_base, translate("Directory does not exist!") ) ++ else ++ return value ++ end ++end ++ ++-- temporary-directory --------------------------------------------------------- ++local td = ns:taboption("filter", Value, "temporary_directory") ++td.title_base = "Temporary Directory" ++td.title = string.format(HELP, "TEMPORARY-DIRECTORY", td.title_base ) ++td.description = translate("A directory where Privoxy can create temporary files.") ++ .. [[
    ]] ++ .. translate("Only when using 'external filters', Privoxy has to create temporary files.") ++ .. [[]] ++td.rmempty = true ++ ++-- actionsfile ----------------------------------------------------------------- ++local af = ns:taboption("filter", DynamicList, "actionsfile") ++af.title_base = "Action Files" ++af.title = string.format(HELP, "ACTIONSFILE", af.title_base) ++af.description = translate("The actions file(s) to use. Multiple actionsfile lines are permitted, and are in fact recommended!") ++ .. [[
    match-all.action := ]] ++ .. translate("Actions that are applied to all sites and maybe overruled later on.") ++ .. [[
    default.action := ]] ++ .. translate("Main actions file") ++ .. [[
    user.action := ]] ++ .. translate("User customizations") ++af.rmempty = false ++function af.validate(self, value) ++ if not value or #value == 0 then ++ return nil, err_tab_access(self.title_base, translate("Mandatory Input: No files given!") ) ++ end ++ local confdir = cd:formvalue(ns.section) ++ local err = false ++ local file = "" ++ if type(value) == "table" then ++ local x ++ for _, x in ipairs(value) do ++ if x and #x > 0 then ++ if not NXFS.access(confdir .."/".. x) then ++ err = true ++ file = x ++ break -- break/leave for on error ++ end ++ end ++ end ++ else ++ if not NXFS.access(confdir .."/".. value) then ++ err = true ++ file = value ++ end ++ end ++ if err then ++ return nil, string.format(err_tab_filter(self.title_base, translate("File '%s' not found inside Configuration Directory") ), file) ++ end ++ return value ++end ++ ++-- filterfile ------------------------------------------------------------------ ++local ff = ns:taboption("filter", DynamicList, "filterfile") ++ff.title_base = "Filter files" ++ff.title = string.format(HELP, "FILTERFILE", ff.title_base ) ++ff.description = translate("The filter files contain content modification rules that use regular expressions.") ++ff.rmempty = false ++function ff.validate(self, value) ++ if not value or #value == 0 then ++ return nil, err_tab_access(self.title_base, translate("Mandatory Input: No files given!") ) ++ end ++ local confdir = cd:formvalue(ns.section) ++ local err = false ++ local file = "" ++ if type(value) == "table" then ++ local x ++ for _, x in ipairs(value) do ++ if x and #x > 0 then ++ if not NXFS.access(confdir .."/".. x) then ++ err = true ++ file = x ++ break -- break/leave for on error ++ end ++ end ++ end ++ else ++ if not NXFS.access(confdir .."/".. value) then ++ err = true ++ file = value ++ end ++ end ++ if err then ++ return nil, string.format(err_tab_filter(self.title_base, translate("File '%s' not found inside Configuration Directory") ), file ) ++ end ++ return value ++end ++ ++-- trustfile ------------------------------------------------------------------- ++local tf = ns:taboption("filter", Value, "trustfile") ++tf.title_base = "Trust file" ++tf.title = string.format(HELP, "TRUSTFILE", tf.title_base ) ++tf.description = translate("The trust mechanism is an experimental feature for building white-lists " ++ .."and should be used with care.") ++ .. [[
    ]] ++ .. translate("It is NOT recommended for the casual user.") ++ .. [[]] ++tf.placeholder = "user.trust" ++tf.rmempty = true ++function tf.validate(self, value) ++ local confdir = cd:formvalue(ns.section) ++ local err = false ++ local file = "" ++ if type(value) == "table" then ++ local x ++ for _, x in ipairs(value) do ++ if x and #x > 0 then ++ if not NCFS.access(confdir .."/".. x) then ++ err = true ++ file = x ++ break -- break/leave for on error ++ end ++ end ++ end ++ else ++ if not NXFS.access(confdir .."/".. value) then ++ err = true ++ file = value ++ end ++ end ++ if err then ++ return nil, string.format(err_tab_filter(self.title_base, translate("File '%s' not found inside Configuration Directory") ), file ) ++ end ++ return value ++end ++ ++-- tab: access -- ############################################################## ++ ++-- listen-address -------------------------------------------------------------- ++local la = ns:taboption("access", DynamicList, "listen_address") ++la.title_base = "Listen addresses" ++la.title = string.format(HELP, "LISTEN-ADDRESS", la.title_base ) ++la.description = translate("The address and TCP port on which Privoxy will listen for client requests.") ++ .. [[
    ]] ++ .. translate("Syntax: ") ++ .. "IPv4:Port / [IPv6]:Port / Host:Port" ++la.default = "127.0.0.1:8118" ++la.rmempty = false ++function la.validate(self, value) ++ if not value or #value == 0 then ++ return nil, err_tab_access(self.title_base, translate("Mandatory Input: No Data given!") ) ++ end ++ ++ local function check_value(v) ++ local _ret = UTIL.split(v, "]:") ++ local _ip ++ if _ret[2] then -- ip6 with port ++ _ip = string.gsub(_ret[1], "%[", "") -- remove "[" at beginning ++ if not DTYP.ip6addr(_ip) then ++ return translate("Mandatory Input: No valid IPv6 address given!") ++ elseif not DTYP.port(_ret[2]) then ++ return translate("Mandatory Input: No valid Port given!") ++ else ++ return nil ++ end ++ end ++ _ret = UTIL.split(v, ":") ++ if not _ret[2] then ++ return translate("Mandatory Input: No Port given!") ++ end ++ if #_ret[1] > 0 and not DTYP.host(_ret[1]) then -- :8118 is valid address ++ return translate("Mandatory Input: No valid IPv4 address or host given!") ++ elseif not DTYP.port(_ret[2]) then ++ return translate("Mandatory Input: No valid Port given!") ++ else ++ return nil ++ end ++ end ++ ++ local err = "" ++ local entry = "" ++ if type(value) == "table" then ++ local x ++ for _, x in ipairs(value) do ++ if x and #x > 0 then ++ err = check_value(x) ++ if err then ++ entry = x ++ break ++ end ++ end ++ end ++ else ++ err = check_value(value) ++ entry = value ++ end ++ if err then ++ return nil, string.format(err_tab_access(self.title_base, err .. " - %s"), entry ) ++ end ++ return value ++end ++ ++-- permit-access --------------------------------------------------------------- ++local pa = ns:taboption("access", DynamicList, "permit_access") ++pa.title = string.format(HELP, "ACLS", "Permit access" ) ++pa.description = translate("Who can access what.") ++ .. [[
    ]] ++ .. translate("Please read Privoxy manual for details!") ++ .. [[]] ++pa.rmempty = true ++ ++-- deny-access ----------------------------------------------------------------- ++local da = ns:taboption("access", DynamicList, "deny_access") ++da.title = string.format(HELP, "ACLS", "Deny Access" ) ++da.description = translate("Who can access what.") ++ .. [[
    ]] ++ .. translate("Please read Privoxy manual for details!") ++ .. [[]] ++da.rmempty = true ++ ++-- buffer-limit ---------------------------------------------------------------- ++local bl = ns:taboption("access", Value, "buffer_limit") ++bl.title_base = "Buffer Limit" ++bl.title = string.format(HELP, "BUFFER-LIMIT", bl.title_base ) ++bl.description = translate("Maximum size (in KB) of the buffer for content filtering.") ++ .. [[
    ]] ++ .. translate("Value range 1 to 4096, no entry defaults to 4096") ++bl.default = 4096 ++bl.rmempty = true ++function bl.validate(self, value) ++ local v = tonumber(value) ++ if not v then ++ return nil, err_tab_access(self.title_base, translate("Value is not a number") ) ++ elseif v < 1 or v > 4096 then ++ return nil, err_tab_access(self.title_base, translate("Value not between 1 and 4096") ) ++ elseif v == self.default then ++ return "" -- dont need to save default ++ end ++ return value ++end ++ ++-- toggle ---------------------------------------------------------------------- ++local tgl = ns:taboption("access", Flag, "toggle") ++tgl.title = string.format(HELP, "TOGGLE", "Toggle Status" ) ++tgl.description = translate("Enable/Disable filtering when Privoxy starts.") ++ .. [[
    ]] ++ .. translate("Disabled == Transparent Proxy Mode") ++tgl.orientation = "horizontal" ++tgl.default = "1" ++tgl.rmempty = false ++function tgl.parse(self, section) ++ CTRL.flag_parse(self, section) ++end ++ ++-- enable-remote-toggle -------------------------------------------------------- ++local ert = ns:taboption("access", Flag, "enable_remote_toggle") ++ert.title = string.format(HELP, "ENABLE-REMOTE-TOGGLE", "Enable remote toggle" ) ++ert.description = translate("Whether or not the web-based toggle feature may be used.") ++ert.orientation = "horizontal" ++ert.rmempty = true ++function ert.parse(self, section) ++ CTRL.flag_parse(self, section) ++end ++ ++-- enable-remote-http-toggle --------------------------------------------------- ++local eht = ns:taboption("access", Flag, "enable_remote_http_toggle") ++eht.title = string.format(HELP, "ENABLE-REMOTE-HTTP-TOGGLE", "Enable remote toggle via HTTP" ) ++eht.description = translate("Whether or not Privoxy recognizes special HTTP headers to change toggle state.") ++ .. [[
    ]] ++ .. translate("This option will be removed in future releases as it has been obsoleted by the more general header taggers.") ++ .. [[]] ++eht.orientation = "horizontal" ++eht.rmempty = true ++function eht.parse(self, section) ++ CTRL.flag_parse(self, section) ++end ++ ++-- enable-edit-actions --------------------------------------------------------- ++local eea = ns:taboption("access", Flag, "enable_edit_actions") ++eea.title = string.format(HELP, "ENABLE-EDIT-ACTIONS", "Enable action file editor" ) ++eea.description = translate("Whether or not the web-based actions file editor may be used.") ++eea.orientation = "horizontal" ++eea.rmempty = true ++function eea.parse(self, section) ++ CTRL.flag_parse(self, section) ++end ++ ++-- enforce-blocks -------------------------------------------------------------- ++local eb = ns:taboption("access", Flag, "enforce_blocks") ++eb.title = string.format(HELP, "ENFORCE-BLOCKS", "Enforce page blocking" ) ++eb.description = translate("If enabled, Privoxy hides the 'go there anyway' link. " ++ .. "The user obviously should not be able to bypass any blocks.") ++eb.orientation = "horizontal" ++eb.rmempty = true ++function eb.parse(self, section) ++ CTRL.flag_parse(self, section) ++end ++ ++-- tab: forward -- ############################################################# ++ ++-- enable-proxy-authentication-forwarding -------------------------------------- ++local paf = ns:taboption("forward", Flag, "enable_proxy_authentication_forwarding") ++paf.title = string.format(HELP, "ENABLE-PROXY-AUTHENTICATION-FORWARDING", ++ translate("Enable proxy authentication forwarding") ) ++paf.description = translate("Whether or not proxy authentication through Privoxy should work.") ++ .. [[
    ]] ++ .. translate("Enabling this option is NOT recommended if there is no parent proxy that requires authentication!") ++ .. [[]] ++--paf.orientation = "horizontal" ++paf.rmempty = true ++function paf.parse(self, section) ++ CTRL.flag_parse(self, section) ++end ++ ++-- forward --------------------------------------------------------------------- ++local fwd = ns:taboption("forward", DynamicList, "forward") ++fwd.title = string.format(HELP, "FORWARD", "Forward HTTP" ) ++fwd.description = translate("To which parent HTTP proxy specific requests should be routed.") ++ .. [[
    ]] ++ .. translate("Syntax: target_pattern http_parent[:port]") ++fwd.rmempty = true ++ ++-- forward-socks4 -------------------------------------------------------------- ++local fs4 = ns:taboption("forward", DynamicList, "forward_socks4") ++fs4.title = string.format(HELP, "SOCKS", "Forward SOCKS 4" ) ++fs4.description = translate("Through which SOCKS proxy (and optionally to which parent HTTP proxy) specific requests should be routed.") ++ .. [[
    ]] ++ .. translate("Syntax: target_pattern socks_proxy[:port] http_parent[:port]") ++fs4.rmempty = true ++ ++-- forward-socks4a ------------------------------------------------------------- ++local f4a = ns:taboption("forward", DynamicList, "forward_socks4a") ++f4a.title = string.format(HELP, "SOCKS", "Forward SOCKS 4A" ) ++f4a.description = fs4.description ++f4a.rmempty = true ++ ++-- forward-socks5 -------------------------------------------------------------- ++local fs5 = ns:taboption("forward", DynamicList, "forward_socks5") ++fs5.title = string.format(HELP, "SOCKS", "Forward SOCKS 5" ) ++fs5.description = fs4.description ++fs5.rmempty = true ++ ++-- forward-socks5t ------------------------------------------------------------- ++local f5t = ns:taboption("forward", DynamicList, "forward_socks5t") ++f5t.title = string.format(HELP, "SOCKS", "Forward SOCKS 5t" ) ++f5t.description = fs4.description ++f5t.rmempty = true ++ ++-- tab: misc -- ################################################################ ++ ++-- accept-intercepted-requests ------------------------------------------------- ++local air = ns:taboption("misc", Flag, "accept_intercepted_requests") ++air.title = string.format(HELP, "ACCEPT-INTERCEPTED-REQUESTS", "Accept intercepted requests" ) ++air.description = translate("Whether intercepted requests should be treated as valid.") ++air.orientation = "horizontal" ++air.rmempty = true ++function air.parse(self, section) ++ CTRL.flag_parse(self, section) ++end ++ ++-- allow-cgi-request-crunching ------------------------------------------------- ++local crc = ns:taboption("misc", Flag, "allow_cgi_request_crunching") ++crc.title = string.format(HELP, "ALLOW-CGI-REQUEST-CRUNCHING", "Allow CGI request crunching" ) ++crc.description = translate("Whether requests to Privoxy's CGI pages can be blocked or redirected.") ++crc.orientation = "horizontal" ++crc.rmempty = true ++function crc.parse(self, section) ++ CTRL.flag_parse(self, section) ++end ++ ++-- split-large-forms ----------------------------------------------------------- ++local slf = ns:taboption("misc", Flag, "split_large_forms") ++slf.title = string.format(HELP, "SPLIT-LARGE-FORMS", "Split large forms" ) ++slf.description = translate("Whether the CGI interface should stay compatible with broken HTTP clients.") ++slf.orientation = "horizontal" ++slf.rmempty = true ++function slf.parse(self, section) ++ CTRL.flag_parse(self, section) ++end ++ ++-- keep-alive-timeout ---------------------------------------------------------- ++local kat = ns:taboption("misc", Value, "keep_alive_timeout") ++kat.title_base = "Keep-alive timeout" ++kat.title = string.format(HELP, "KEEP-ALIVE-TIMEOUT", kat.title_base) ++kat.description = translate("Number of seconds after which an open connection will no longer be reused.") ++kat.rmempty = true ++function kat.validate(self, value) ++ local v = tonumber(value) ++ if not v then ++ return nil, err_tab_misc(self.title_base, translate("Value is not a number") ) ++ elseif v < 1 then ++ return nil, err_tab_misc(self.title_base, translate("Value not greater 0 or empty") ) ++ end ++ return value ++end ++ ++-- tolerate-pipelining --------------------------------------------------------- ++local tp = ns:taboption("misc", Flag, "tolerate_pipelining") ++tp.title = string.format(HELP, "TOLERATE-PIPELINING", "Tolerate pipelining" ) ++tp.description = translate("Whether or not pipelined requests should be served.") ++tp.orientation = "horizontal" ++tp.rmempty = true ++function tp.parse(self, section) ++ CTRL.flag_parse(self, section) ++end ++ ++-- default-server-timeout ------------------------------------------------------ ++local dst = ns:taboption("misc", Value, "default_server_timeout") ++dst.title_base = "Default server timeout" ++dst.title = string.format(HELP, "DEFAULT-SERVER-TIMEOUT", dst.title_base) ++dst.description = translate("Assumed server-side keep-alive timeout (in seconds) if not specified by the server.") ++dst.rmempty = true ++function dst.validate(self, value) ++ local v = tonumber(value) ++ if not v then ++ return nil, err_tab_misc(self.title_base, translate("Value is not a number") ) ++ elseif v < 1 then ++ return nil, err_tab_misc(self.title_base, translate("Value not greater 0 or empty") ) ++ end ++ return value ++end ++ ++-- connection-sharing ---------------------------------------------------------- ++local cs = ns:taboption("misc", Flag, "connection_sharing") ++cs.title = string.format(HELP, "CONNECTION-SHARING", "Connection sharing" ) ++cs.description = translate("Whether or not outgoing connections that have been kept alive should be shared between different incoming connections.") ++cs.orientation = "horizontal" ++cs.rmempty = true ++function cs.parse(self, section) ++ CTRL.flag_parse(self, section) ++end ++ ++-- socket-timeout -------------------------------------------------------------- ++local st = ns:taboption("misc", Value, "socket_timeout") ++st.title_base = "Socket timeout" ++st.title = string.format(HELP, "SOCKET-TIMEOUT", st.title_base ) ++st.description = translate("Number of seconds after which a socket times out if no data is received.") ++st.default = 300 ++st.rmempty = true ++function st.validate(self, value) ++ local v = tonumber(value) ++ if not v then ++ return nil, err_tab_misc(self.title_base, translate("Value is not a number") ) ++ elseif v < 1 then ++ return nil, err_tab_misc(self.title_base, translate("Value not greater 0 or empty") ) ++ elseif v == self.default then ++ return "" -- dont need to save default ++ end ++ return value ++end ++ ++-- max-client-connections ------------------------------------------------------ ++local mcc = ns:taboption("misc", Value, "max_client_connections") ++mcc.title_base = "Max. client connections" ++mcc.title = string.format(HELP, "MAX-CLIENT-CONNECTIONS", mcc.title_base ) ++mcc.description = translate("Maximum number of client connections that will be served.") ++mcc.default = 128 ++mcc.rmempty = true ++function mcc.validate(self, value) ++ local v = tonumber(value) ++ if not v then ++ return nil, err_tab_misc(self.title_base, translate("Value is not a number") ) ++ elseif v < 1 then ++ return nil, err_tab_misc(self.title_base, translate("Value not greater 0 or empty") ) ++ elseif v == self.default then ++ return "" -- dont need to save default ++ end ++ return value ++end ++ ++-- handle-as-empty-doc-returns-ok ---------------------------------------------- ++local her = ns:taboption("misc", Flag, "handle_as_empty_doc_returns_ok") ++her.title = string.format(HELP, "HANDLE-AS-EMPTY-DOC-RETURNS-OK", "Handle as empty doc returns ok" ) ++her.description = translate("The status code Privoxy returns for pages blocked with +handle-as-empty-document.") ++her.orientation = "horizontal" ++her.rmempty = true ++function her.parse(self, section) ++ CTRL.flag_parse(self, section) ++end ++ ++-- enable-compression ---------------------------------------------------------- ++local ec = ns:taboption("misc", Flag, "enable_compression") ++ec.title = string.format(HELP, "ENABLE-COMPRESSION", "Enable compression" ) ++ec.description = translate("Whether or not buffered content is compressed before delivery.") ++ec.orientation = "horizontal" ++ec.rmempty = true ++function ec.parse(self, section) ++ CTRL.flag_parse(self, section) ++end ++ ++-- compression-level ----------------------------------------------------------- ++local cl = ns:taboption("misc", Value, "compression_level") ++cl.title_base = "Compression level" ++cl.title = string.format(HELP, "COMPRESSION-LEVEL", cl.title_base ) ++cl.description = translate("The compression level that is passed to the zlib library when compressing buffered content.") ++cl.default = 1 ++cl.rmempty = true ++function cl.validate(self, value) ++ local v = tonumber(value) ++ if not v then ++ return nil, err_tab_misc(self.title_base, translate("Value is not a number") ) ++ elseif v < 0 or v > 9 then ++ return nil, err_tab_misc(self.title_base, translate("Value not between 0 and 9") ) ++ elseif v == self.default then ++ return "" -- don't need to save default ++ end ++ return value ++end ++ ++-- client-header-order --------------------------------------------------------- ++local cho = ns:taboption("misc", Value, "client_header_order") ++cho.title = string.format(HELP, "CLIENT-HEADER-ORDER", "Client header order" ) ++cho.description = translate("The order in which client headers are sorted before forwarding them.") ++ .. [[
    ]] ++ .. translate("Syntax: Client header names delimited by spaces.") ++cho.rmempty = true ++ ++-- "debug"-tab definition -- ################################################### ++ ++-- single-threaded ------------------------------------------------------------- ++local st = ns:taboption("debug", Flag, "single_threaded") ++st.title = string.format(HELP, "SINGLE-THREADED", "Single Threaded" ) ++st.description = translate("Whether to run only one server thread.") ++ .. [[
    ]] ++ .. translate("This option is only there for debugging purposes. It will drastically reduce performance.") ++ .. [[]] ++st.rmempty = true ++function st.parse(self, section) ++ CTRL.flag_parse(self, section) ++end ++ ++-- debug 1 --------------------------------------------------------------------- ++local d0 = ns:taboption("debug", Flag, "debug_1") ++d0.title = string.format(HELP, "DEBUG", "Debug 1" ) ++d0.description = translate("Log the destination for each request Privoxy let through. See also 'Debug 1024'.") ++d0.rmempty = true ++function d0.parse(self, section) ++ CTRL.flag_parse(self, section) ++end ++ ++-- debug 2 --------------------------------------------------------------------- ++local d1 = ns:taboption("debug", Flag, "debug_2") ++d1.title = string.format(HELP, "DEBUG", "Debug 2" ) ++d1.description = translate("Show each connection status") ++d1.rmempty = true ++function d1.parse(self, section) ++ CTRL.flag_parse(self, section) ++end ++ ++-- debug 4 --------------------------------------------------------------------- ++local d2 = ns:taboption("debug", Flag, "debug_4") ++d2.title = string.format(HELP, "DEBUG", "Debug 4" ) ++d2.description = translate("Show I/O status") ++d2.rmempty = true ++function d2.parse(self, section) ++ CTRL.flag_parse(self, section) ++end ++ ++-- debug 8 --------------------------------------------------------------------- ++local d3 = ns:taboption("debug", Flag, "debug_8") ++d3.title = string.format(HELP, "DEBUG", "Debug 8" ) ++d3.description = translate("Show header parsing") ++d3.rmempty = true ++function d3.parse(self, section) ++ CTRL.flag_parse(self, section) ++end ++ ++-- debug 16 -------------------------------------------------------------------- ++local d4 = ns:taboption("debug", Flag, "debug_16") ++d4.title = string.format(HELP, "DEBUG", "Debug 16" ) ++d4.description = translate("Log all data written to the network") ++d4.rmempty = true ++function d4.parse(self, section) ++ CTRL.flag_parse(self, section) ++end ++ ++-- debug 32 -------------------------------------------------------------------- ++local d5 = ns:taboption("debug", Flag, "debug_32") ++d5.title = string.format(HELP, "DEBUG", "Debug 32" ) ++d5.description = translate("Debug force feature") ++d5.rmempty = true ++function d5.parse(self, section) ++ CTRL.flag_parse(self, section) ++end ++ ++-- debug 64 -------------------------------------------------------------------- ++local d6 = ns:taboption("debug", Flag, "debug_64") ++d6.title = string.format(HELP, "DEBUG", "Debug 64" ) ++d6.description = translate("Debug regular expression filters") ++d6.rmempty = true ++function d6.parse(self, section) ++ CTRL.flag_parse(self, section) ++end ++ ++-- debug 128 ------------------------------------------------------------------- ++local d7 = ns:taboption("debug", Flag, "debug_128") ++d7.title = string.format(HELP, "DEBUG", "Debug 128" ) ++d7.description = translate("Debug redirects") ++d7.rmempty = true ++function d7.parse(self, section) ++ CTRL.flag_parse(self, section) ++end ++ ++-- debug 256 ------------------------------------------------------------------- ++local d8 = ns:taboption("debug", Flag, "debug_256") ++d8.title = string.format(HELP, "DEBUG", "Debug 256" ) ++d8.description = translate("Debug GIF de-animation") ++d8.rmempty = true ++function d8.parse(self, section) ++ CTRL.flag_parse(self, section) ++end ++ ++-- debug 512 ------------------------------------------------------------------- ++local d9 = ns:taboption("debug", Flag, "debug_512") ++d9.title = string.format(HELP, "DEBUG", "Debug 512" ) ++d9.description = translate("Common Log Format") ++d9.rmempty = true ++function d9.parse(self, section) ++ CTRL.flag_parse(self, section) ++end ++ ++-- debug 1024 ------------------------------------------------------------------ ++local d10 = ns:taboption("debug", Flag, "debug_1024") ++d10.title = string.format(HELP, "DEBUG", "Debug 1024" ) ++d10.description = translate("Log the destination for requests Privoxy didn't let through, and the reason why.") ++d10.rmempty = true ++function d10.parse(self, section) ++ CTRL.flag_parse(self, section) ++end ++ ++-- debug 2048 ------------------------------------------------------------------ ++local d11 = ns:taboption("debug", Flag, "debug_2048") ++d11.title = string.format(HELP, "DEBUG", "Debug 2048" ) ++d11.description = translate("CGI user interface") ++d11.rmempty = true ++function d11.parse(self, section) ++ CTRL.flag_parse(self, section) ++end ++ ++-- debug 4096 ------------------------------------------------------------------ ++local d12 = ns:taboption("debug", Flag, "debug_4096") ++d12.title = string.format(HELP, "DEBUG", "Debug 4096" ) ++d12.description = translate("Startup banner and warnings.") ++d12.rmempty = true ++function d12.parse(self, section) ++ CTRL.flag_parse(self, section) ++end ++ ++-- debug 8192 ------------------------------------------------------------------ ++local d13 = ns:taboption("debug", Flag, "debug_8192") ++d13.title = string.format(HELP, "DEBUG", "Debug 8192" ) ++d13.description = translate("Non-fatal errors - *we highly recommended enabling this*") ++d13.rmempty = true ++function d13.parse(self, section) ++ CTRL.flag_parse(self, section) ++end ++ ++-- debug 16384 ----------------------------------------------------------------- ++--[[ TODO ??? ++local d14 = ns:taboption("debug", Flag, "debug_16384") ++d14.title = string.format(HELP, "DEBUG", "Debug 16384" ) ++d14.description = translate("") ++d14.rmempty = true ++function d14.parse(self, section) ++ CTRL.flag_parse(self, section) ++end ++]]-- ++ ++-- debug 32768 ----------------------------------------------------------------- ++local d15 = ns:taboption("debug", Flag, "debug_32768") ++d15.title = string.format(HELP, "DEBUG", "Debug 32768" ) ++d15.description = translate("Log all data read from the network") ++d15.rmempty = true ++function d15.parse(self, section) ++ CTRL.flag_parse(self, section) ++end ++ ++-- debug 65536 ----------------------------------------------------------------- ++local d16 = ns:taboption("debug", Flag, "debug_65536") ++d16.title = string.format(HELP, "DEBUG", "Debug 65536" ) ++d16.description = translate("Log the applying actions") ++d16.rmempty = true ++function d16.parse(self, section) ++ CTRL.flag_parse(self, section) ++end ++ ++-- tab: logview -- ############################################################# ++ ++local lv = ns:taboption("logview", DummyValue, "_logview") ++lv.template = "privoxy/detail_logview" ++lv.inputtitle = translate("Read / Reread log file") ++lv.rows = 50 ++function lv.cfgvalue(self, section) ++ local lfile=self.map:get(ns.section, "logdir") .. "/" .. self.map:get(ns.section, "logfile") ++ if NXFS.access(lfile) then ++ return lfile .. "\n" .. translate("Please press [Read] button") ++ end ++ return lfile .. "\n" .. translate("File not found or empty") ++end ++ ++return m +diff --git a/feeds/luci/applications/luci-app-privoxy/luasrc/view/privoxy/detail_logview.htm b/feeds/luci/applications/luci-app-privoxy/luasrc/view/privoxy/detail_logview.htm +new file mode 100644 +index 0000000..3e19070 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-privoxy/luasrc/view/privoxy/detail_logview.htm +@@ -0,0 +1,56 @@ ++ ++ ++ ++ ++<%+cbi/valueheader%> ++ ++
    ++ ++<% ++-- one button on top, one at the buttom ++%> ++ /> ++ ++

    ++ ++<% ++-- set a readable style taken from openwrt theme for textarea#syslog ++-- in openwrt theme there are problems with a width of 100 so we check for theme and set to lower value ++%> ++ ++

    ++ ++<% ++-- one button on top, one at the buttom ++%> ++ /> ++ ++<%+cbi/valuefooter%> ++ +diff --git a/feeds/luci/applications/luci-app-privoxy/luasrc/view/privoxy/detail_startstop.htm b/feeds/luci/applications/luci-app-privoxy/luasrc/view/privoxy/detail_startstop.htm +new file mode 100644 +index 0000000..b9de886 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-privoxy/luasrc/view/privoxy/detail_startstop.htm +@@ -0,0 +1,49 @@ ++ ++ ++ ++ ++<%+cbi/valueheader%> ++ ++<% if self:cfgvalue(section) ~= false then ++-- We need to garantie that function cfgvalue run first to set missing parameters ++%> ++ ++ ++ " style="font-size: 100%;" type="button" onclick="onclick_startstop(this.id)" ++ <%= ++ attr("name", section) .. attr("id", cbid) .. attr("value", self.inputtitle) .. ifattr(self.disabled, "disabled") ++ %> /> ++<% end %> ++ ++<%+cbi/valuefooter%> ++ +diff --git a/feeds/luci/applications/luci-app-privoxy/po/de/privoxy.po b/feeds/luci/applications/luci-app-privoxy/po/de/privoxy.po +new file mode 100644 +index 0000000..b01f99e +--- /dev/null ++++ b/feeds/luci/applications/luci-app-privoxy/po/de/privoxy.po +@@ -0,0 +1,503 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: luci-app-privoxy\n" ++"POT-Creation-Date: 2015-01-18 21:48+0100\n" ++"PO-Revision-Date: 2015-01-18 21:51+0100\n" ++"Last-Translator: Christian Schoenebeck \n" ++"Language-Team: \n" ++"Language: de\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"X-Generator: Poedit 1.5.4\n" ++"Plural-Forms: nplurals=2; plural=(n != 1);\n" ++"X-Poedit-SourceCharset: UTF-8\n" ++ ++msgid "" ++"A URL to be displayed in the error page that users will see if access to an " ++"untrusted page is denied." ++msgstr "" ++"Ein Link auf der Fehlerseite, der Benutzern angezeigt wird, wenn der Zugang " ++"zu einer nicht vertrauenswürdigen Seite verweigert wird." ++ ++msgid "" ++"A URL to documentation about the local Privoxy setup, configuration or " ++"policies." ++msgstr "" ++"Ein Link zur Dokumentation über die lokale Privoxy Konfiguration und die " ++"Sicherheitseinstellungen." ++ ++msgid "A directory where Privoxy can create temporary files." ++msgstr "" ++ ++msgid "Access Control" ++msgstr "Zugriffskontrolle" ++ ++msgid "Actions that are applied to all sites and maybe overruled later on." ++msgstr "" ++"Aktionen, die für alle Websites angewendet werden, und vielleicht später " ++"überschrieben werden." ++ ++msgid "An alternative directory where the templates are loaded from." ++msgstr "Eine alternatives Verzeichnis, aus dem die Vorlagen geladen werden." ++ ++msgid "An email address to reach the Privoxy administrator." ++msgstr "Eine E-Mail-Adresse, um die Privoxy-Administrator zu erreichen." ++ ++msgid "" ++"Assumed server-side keep-alive timeout (in seconds) if not specified by the " ++"server." ++msgstr "" ++"Angenommenes serverseitiges Keep-Alive-Timeout (in Sekunden), falls nicht " ++"vom Server festgelegt." ++ ++msgid "CGI user interface" ++msgstr "Protokolliert die CGI Benutzer Schnittstelle" ++ ++msgid "Common Log Format" ++msgstr "Gemeinsames Protokollformat" ++ ++msgid "" ++"Configure here the routing of HTTP requests through a chain of multiple " ++"proxies. Note that parent proxies can severely decrease your privacy level. " ++"Also specified here are SOCKS proxies." ++msgstr "" ++"Konfigurieren Sie hier das Weiterleiten von HTTP-Anforderungen durch eine " ++"Kette von mehreren Proxies. Beachten Sie, dass übergeordnete Proxies Ihre " ++"Privatsphäre stark verringern können. Auch hier angegeben werden SOCKS-" ++"Proxies." ++ ++msgid "Debug GIF de-animation" ++msgstr "Protokolliert die GIF de-animation" ++ ++msgid "Debug force feature" ++msgstr "Protokolliert die 'Force' Eigenschaft" ++ ++msgid "Debug redirects" ++msgstr "Protokolliert Weiterleitungen" ++ ++msgid "Debug regular expression filters" ++msgstr "Protokolliert Filter für reguläre Ausdrücke" ++ ++msgid "Directory does not exist!" ++msgstr "Verzeichnis existiert nicht!" ++ ++msgid "Disabled == Transparent Proxy Mode" ++msgstr "Deaktiviert == Transparent Proxy Betrieb" ++ ++msgid "Enable proxy authentication forwarding" ++msgstr "Aktivieren die Weiterleitung von Proxy-Authentifizierungen" ++ ++msgid "" ++"Enable/Disable autostart of Privoxy on system startup and interface events" ++msgstr "" ++"Aktivieren / Deaktivieren des Autostart von Privoxy beim Systemstart und " ++"Schnittstellenereignissen." ++ ++msgid "Enable/Disable filtering when Privoxy starts." ++msgstr "Aktivieren / Deaktivieren der Filterung, wenn Privoxy startet." ++ ++msgid "Enabled" ++msgstr "Aktiviert" ++ ++msgid "" ++"Enabling this option is NOT recommended if there is no parent proxy that " ++"requires authentication!" ++msgstr "" ++"Die Aktivierung dieser Option wird NICHT empfohlen, wenn es keinen " ++"übergeordneten Proxy gibt, der eine Authentifizierung erfordert!" ++ ++msgid "File '%s' not found inside Configuration Directory" ++msgstr "Datei '%s' nicht im Konfigurationsverzeichnis gefunden!" ++ ++msgid "File not found or empty" ++msgstr "Datei nicht gefunden oder leer" ++ ++msgid "Files and Directories" ++msgstr "Dateien und Verzeichnisse" ++ ++msgid "For help use link at the relevant option" ++msgstr "" ++"Für Hilfe zur Verwendung, benutzen Sie die Verknüpfung der betreffenden " ++"Option." ++ ++msgid "Forwarding" ++msgstr "Weiterleitung" ++ ++msgid "" ++"If enabled, Privoxy hides the 'go there anyway' link. The user obviously " ++"should not be able to bypass any blocks." ++msgstr "" ++"Wenn aktiviert, verbirgt Privoxy den Link 'go there anyway'. Normalerweise " ++"sollten Benutzer nicht in der Lage sein, Blockierungen zu umgehen." ++ ++msgid "" ++"If you intend to operate Privoxy for more users than just yourself, it might " ++"be a good idea to let them know how to reach you, what you block and why you " ++"do that, your policies, etc." ++msgstr "" ++"Wenn Sie beabsichtigen, Privoxy für mehr Nutzer als nur sich selbst zu " ++"betreiben, ist es eine gute Idee, sie wissen zu lassen, wie sie Sie " ++"erreichen können, was Sie blockieren und warum Sie das tun, etc." ++ ++msgid "Invalid email address" ++msgstr "Ungültige Email Adresse" ++ ++msgid "It is NOT recommended for the casual user." ++msgstr "Es wird NICHT für den gelegentlichen Anwender empfohlen." ++ ++msgid "Local Set-up" ++msgstr "Lokale Einstellungen" ++ ++msgid "Location of the Privoxy User Manual." ++msgstr "Ort des Privoxy Benutzer Handbuches" ++ ++msgid "Log File Viewer" ++msgstr "Protokolldatei" ++ ++msgid "Log all data read from the network" ++msgstr "Protokolliert alle Daten, die vom Netzwerk gelesen werden." ++ ++msgid "Log all data written to the network" ++msgstr "Protokolliert alle Daten, die auf das Netzwerk geschrieben werden." ++ ++msgid "Log the applying actions" ++msgstr "Protokiolliert angewendete Aktionen" ++ ++msgid "" ++"Log the destination for each request Privoxy let through. See also 'Debug " ++"1024'." ++msgstr "" ++"Protokolliert das Ziel für jede Anforderung die Privoxy durchlässt. Siehe " ++"auch 'Debug 1024'." ++ ++msgid "" ++"Log the destination for requests Privoxy didn't let through, and the reason " ++"why." ++msgstr "" ++"Protokolliert das Ziel für Anfragen die Privoxy nicht durchgelassen hat, und " ++"den Grund dafür." ++ ++msgid "Logging" ++msgstr "Protokollierung" ++ ++msgid "Main actions file" ++msgstr "Wichtige Aktionen-Datei" ++ ++msgid "Mandatory Input: No Data given!" ++msgstr "Pflichtfeld: Keine Daten angegeben!" ++ ++msgid "Mandatory Input: No Directory given!" ++msgstr "Pflichtfeld: Kein Verzeichnis angegeben!" ++ ++msgid "Mandatory Input: No File given!" ++msgstr "Pflichtfeld: Keine Datei angegeben!" ++ ++msgid "Mandatory Input: No Port given!" ++msgstr "Pflichtfeld: Kein Port angegeben!" ++ ++msgid "Mandatory Input: No files given!" ++msgstr "Pflichtfeld: Keine Dateien angegeben!" ++ ++msgid "Mandatory Input: No valid IPv4 address or host given!" ++msgstr "" ++"Pflichtfeld: Keine gültige IPv4 Adresse oder gültiger Hostname angegeben!" ++ ++msgid "Mandatory Input: No valid IPv6 address given!" ++msgstr "Pflichtfeld: Keine gültige IPv6 Adresse angegeben!" ++ ++msgid "Mandatory Input: No valid Port given!" ++msgstr "Pflichtfeld: Keine gültige Port Nummer angegeben!" ++ ++msgid "Maximum number of client connections that will be served." ++msgstr "Maximale Anzahl von Client-Verbindungen." ++ ++msgid "Maximum size (in KB) of the buffer for content filtering." ++msgstr "Maximale Größe (in KB) des Puffers für die Inhaltsfilterung." ++ ++msgid "Miscellaneous" ++msgstr "Verschiedenes" ++ ++msgid "No trailing '/', please." ++msgstr "Bitte kein '/' am Ende." ++ ++msgid "Non-fatal errors - *we highly recommended enabling this*" ++msgstr "" ++"Protokolliert nicht schwerwiegende Fehler - * Es wird dringend empfohlen, " ++"dieses zu aktivieren *" ++ ++msgid "" ++"Number of seconds after which a socket times out if no data is received." ++msgstr "" ++"Anzahl der Sekunden, nach der eine Socket Timeout erfolgt, wenn keine Daten " ++"empfangen werden." ++ ++msgid "" ++"Number of seconds after which an open connection will no longer be reused." ++msgstr "" ++"Anzahl von Sekunden, nach der eine offene Verbindung nicht mehr " ++"wiederverwendet wird." ++ ++msgid "" ++"Only when using 'external filters', Privoxy has to create temporary files." ++msgstr "" ++ ++msgid "Please press [Read] button" ++msgstr "Bitte Protokolldatei einlesen" ++ ++msgid "Please read Privoxy manual for details!" ++msgstr "Bitte lesen Sie das Privoxy Handbuch für Details!" ++ ++msgid "Please update to the current version!" ++msgstr "Aktualisieren Sie bitte auf die aktuelle Version!" ++ ++msgid "Privoxy WEB proxy" ++msgstr "Privoxy WEB proxy" ++ ++msgid "" ++"Privoxy can (and normally does) use a number of other files for additional " ++"configuration, help and logging. This section of the configuration file " ++"tells Privoxy where to find those other files." ++msgstr "" ++"Privoxy verwendet (was in der Regel der Fall ist), eine Reihe von anderen " ++"Dateien für eine zusätzliche Konfiguration, Hilfe und Protokollierung. " ++"Dieser Abschnitt der Konfigurationsdatei definiert, wo diese Dateien zu " ++"finden sind." ++ ++msgid "" ++"Privoxy is a non-caching web proxy with advanced filtering capabilities for " ++"enhancing privacy, modifying web page data and HTTP headers, controlling " ++"access, and removing ads and other obnoxious Internet junk." ++msgstr "" ++"Privoxy ist ein non-caching Web-Proxy mit erweiterten Filterfunktion zur " ++"Verbesserung der Privatsphäre. Er modifiziert Webseitendaten und HTTP-" ++"Header, kontrolliert den Zugang und das Entfernen von Anzeigen und anderem " ++"abscheulichen Internet Schrott." ++ ++msgid "Read / Reread log file" ++msgstr "Protokolldatei (neu) lesen" ++ ++msgid "Show I/O status" ++msgstr "Protokolliert den I/O Status" ++ ++msgid "Show each connection status" ++msgstr "Protokolliert jeden Verbindungsstatus" ++ ++msgid "Show header parsing" ++msgstr "Protokolliert das 'Header parsing'" ++ ++msgid "Software update required" ++msgstr "Softwareaktualisierung nötig" ++ ++msgid "Start" ++msgstr "Start" ++ ++msgid "Start / Stop" ++msgstr "Start / Stopp" ++ ++msgid "Start/Stop Privoxy WEB Proxy" ++msgstr "Start/Stopp Privoxy WEB Proxy" ++ ++msgid "Startup banner and warnings." ++msgstr "Protokolliert Start-Meldungen und Warnungen" ++ ++msgid "Syntax:" ++msgstr "Syntax:" ++ ++msgid "Syntax: Client header names delimited by spaces." ++msgstr "Syntax: Client header Namen getrennt durch Leerzeichen." ++ ++msgid "Syntax: target_pattern http_parent[:port]" ++msgstr "Syntax: target_pattern http_parent[:port]" ++ ++msgid "Syntax: target_pattern socks_proxy[:port] http_parent[:port]" ++msgstr "Syntax: target_pattern socks_proxy[:port] http_parent[:port]" ++ ++msgid "" ++"The actions file(s) to use. Multiple actionsfile lines are permitted, and " ++"are in fact recommended!" ++msgstr "" ++"Die zu verwendenden Aktion-Datei(en). Mehrere Dateien sind gestattet und " ++"empfohlen!" ++ ++msgid "" ++"The address and TCP port on which Privoxy will listen for client requests." ++msgstr "" ++"Die Adresse und das TCP-Port, auf dem Privoxy auf Client-Anforderungen " ++"wartet." ++ ++msgid "" ++"The compression level that is passed to the zlib library when compressing " ++"buffered content." ++msgstr "" ++"Die Komprimierungsstufe (0-9), die der zlib-Bibliothek beim Komprimieren " ++"gepufferten Inhaltes übergeben wird." ++ ++msgid "" ++"The currently installed 'privoxy' package is not supported by LuCI " ++"application." ++msgstr "" ++"Das aktuell installierte 'privoxy' Paket wird von dieser LuCI Anwendung " ++"NICHT unterstützt." ++ ++msgid "" ++"The directory where all logging takes place (i.e. where the logfile is " ++"located)." ++msgstr "Das Verzeichnis in dem die Protokolldatei gespeichert wird." ++ ++msgid "The directory where the other configuration files are located." ++msgstr "Das Verzeichnis in dem weitere Konfigurationsdateien gespeichert sind." ++ ++msgid "" ++"The filter files contain content modification rules that use regular " ++"expressions." ++msgstr "" ++"Die Filterdateien enthalten Änderung des Inhalts, die reguläre Ausdrücke " ++"als Regeln verwenden." ++ ++msgid "The hostname shown on the CGI pages." ++msgstr "Der Hostname der auf CGI-Seiten angezeigt wird." ++ ++msgid "The log file to use. File name, relative to log directory." ++msgstr "" ++"Zu verwendende Protokolldatei. Dateiname relativ zum Protokoll-Verzeichnis." ++ ++msgid "The order in which client headers are sorted before forwarding them." ++msgstr "" ++"Die Reihenfolge, in der Client-Header sortiert werden, bevor sie " ++"weitergeleitet werden." ++ ++msgid "" ++"The status code Privoxy returns for pages blocked with +handle-as-empty-" ++"document." ++msgstr "" ++"Ob Statuscode 200(OK) oder 403(forbidden) für Seiten gemeldet wird, die " ++"durch den Filter 'handle-as-empty-document' blockiert werden." ++ ++msgid "" ++"The trust mechanism is an experimental feature for building white-lists and " ++"should be used with care." ++msgstr "" ++"Der Trust-Mechanismus ist eine experimentelle Funktion für den Aufbau von " ++"White-Listen und sollte mit Vorsicht verwendet werden." ++ ++msgid "" ++"The value of this option only matters if the experimental trust mechanism " ++"has been activated." ++msgstr "" ++"Der Wert dieser Option ist nur wirksam, wenn der experimentelle Trust-" ++"Mechanismus aktiviert wurde." ++ ++msgid "" ++"This option is only there for debugging purposes. It will drastically reduce " ++"performance." ++msgstr "" ++"Diese Option ist ausschließlich zur Fehlersuche. Es wird drastisch die " ++"Leistung beeinträchtigt." ++ ++msgid "" ++"This option will be removed in future releases as it has been obsoleted by " ++"the more general header taggers." ++msgstr "Diese Option wird in zukünftigen Versionen entfernt werden." ++ ++msgid "" ++"This tab controls the security-relevant aspects of Privoxy's configuration." ++msgstr "" ++"Diese Registerkarte steuert die sicherheitsrelevanten Aspekte der Privoxy " ++"Konfiguration." ++ ++msgid "" ++"Through which SOCKS proxy (and optionally to which parent HTTP proxy) " ++"specific requests should be routed." ++msgstr "" ++"An welchen SOCKS-Proxy (und gegebenenfalls an welchen übergeordneten HTTP-" ++"Proxy) spezifischen Anforderungen weitergeleitet werden." ++ ++msgid "To which parent HTTP proxy specific requests should be routed." ++msgstr "" ++"An welchen übergeordneten HTTP-Proxy spezifischen Anforderungen " ++"weitergeleitet werden." ++ ++msgid "User customizations" ++msgstr "Benutzerdefinierte Anpassungen" ++ ++msgid "Value is not a number" ++msgstr "Eingabe ist keine Zahl" ++ ++msgid "Value not between 0 and 9" ++msgstr "Wert nicht zwischen 0 und 9" ++ ++msgid "Value not between 1 and 4096" ++msgstr "Wert nicht zwischen 1 und 4096" ++ ++msgid "Value not greater 0 or empty" ++msgstr "Wert nicht größer 0 oder leer" ++ ++msgid "Value range 1 to 4096, no entry defaults to 4096" ++msgstr "Wertebereich: 1 bis 4096; Keine Angabe setzt 4096." ++ ++msgid "Version" ++msgstr "Version" ++ ++msgid "Version Information" ++msgstr "Versionsinformation" ++ ++msgid "Whether intercepted requests should be treated as valid." ++msgstr "Ob abgefangen Anfragen als gültig behandelt werden." ++ ++msgid "" ++"Whether or not Privoxy recognizes special HTTP headers to change toggle " ++"state." ++msgstr "" ++"Ob Privoxy erkannte spezielle HTTP-Header zur Änderung des Toggle-Status " ++"verwendet.." ++ ++msgid "Whether or not buffered content is compressed before delivery." ++msgstr "" ++"Ob gepufferte Inhalte vor der Weiterleitung komprimiert werden oder nicht." ++ ++msgid "" ++"Whether or not outgoing connections that have been kept alive should be " ++"shared between different incoming connections." ++msgstr "" ++"Ob ausgehende Verbindungen, die am Leben gehalten werden, für verschiedenen " ++"eingehenden Verbindungen gemeinsam genutzt werden oder nicht." ++ ++msgid "Whether or not pipelined requests should be served." ++msgstr "Ob Pipeline-Anfragen bedient werden oder nicht." ++ ++msgid "Whether or not proxy authentication through Privoxy should work." ++msgstr "" ++"Ob Proxy-Authentifizierungen durch Privoxy weitergeleitet werden oder nicht." ++ ++msgid "Whether or not the web-based actions file editor may be used." ++msgstr "De-/Aktiviert den webbasierte Action-Datei Editor." ++ ++msgid "Whether or not the web-based toggle feature may be used." ++msgstr "De-Aktiviert die webbasierte Umschaltfunktion." ++ ++msgid "Whether requests to Privoxy's CGI pages can be blocked or redirected." ++msgstr "" ++"Ob Anfragen an Privoxy CGI-Seiten gesperrt oder umgeleitet werden können " ++"oder nicht." ++ ++msgid "" ++"Whether the CGI interface should stay compatible with broken HTTP clients." ++msgstr "" ++"Ob die CGI-Schnittstelle mit broken HTTP-Clients kompatibel bleibt oder " ++"nicht." ++ ++msgid "Whether to run only one server thread." ++msgstr "Ob nur ein Server-Thread ausgeführt wird." ++ ++msgid "Who can access what." ++msgstr "Wer kann auf Was zugreifen." ++ ++msgid "installed" ++msgstr "installiert" ++ ++msgid "or higher" ++msgstr "oder höher" ++ ++msgid "required" ++msgstr "benötigt" +diff --git a/feeds/luci/applications/luci-app-privoxy/po/templates/privoxy.pot b/feeds/luci/applications/luci-app-privoxy/po/templates/privoxy.pot +new file mode 100644 +index 0000000..150ee31 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-privoxy/po/templates/privoxy.pot +@@ -0,0 +1,412 @@ ++msgid "" ++msgstr "Content-Type: text/plain; charset=UTF-8" ++ ++msgid "" ++"A URL to be displayed in the error page that users will see if access to an " ++"untrusted page is denied." ++msgstr "" ++ ++msgid "" ++"A URL to documentation about the local Privoxy setup, configuration or " ++"policies." ++msgstr "" ++ ++msgid "A directory where Privoxy can create temporary files." ++msgstr "" ++ ++msgid "Access Control" ++msgstr "" ++ ++msgid "Actions that are applied to all sites and maybe overruled later on." ++msgstr "" ++ ++msgid "An alternative directory where the templates are loaded from." ++msgstr "" ++ ++msgid "An email address to reach the Privoxy administrator." ++msgstr "" ++ ++msgid "" ++"Assumed server-side keep-alive timeout (in seconds) if not specified by the " ++"server." ++msgstr "" ++ ++msgid "CGI user interface" ++msgstr "" ++ ++msgid "Common Log Format" ++msgstr "" ++ ++msgid "" ++"Configure here the routing of HTTP requests through a chain of multiple " ++"proxies. Note that parent proxies can severely decrease your privacy level. " ++"Also specified here are SOCKS proxies." ++msgstr "" ++ ++msgid "Debug GIF de-animation" ++msgstr "" ++ ++msgid "Debug force feature" ++msgstr "" ++ ++msgid "Debug redirects" ++msgstr "" ++ ++msgid "Debug regular expression filters" ++msgstr "" ++ ++msgid "Directory does not exist!" ++msgstr "" ++ ++msgid "Disabled == Transparent Proxy Mode" ++msgstr "" ++ ++msgid "Enable proxy authentication forwarding" ++msgstr "" ++ ++msgid "" ++"Enable/Disable autostart of Privoxy on system startup and interface events" ++msgstr "" ++ ++msgid "Enable/Disable filtering when Privoxy starts." ++msgstr "" ++ ++msgid "Enabled" ++msgstr "" ++ ++msgid "" ++"Enabling this option is NOT recommended if there is no parent proxy that " ++"requires authentication!" ++msgstr "" ++ ++msgid "File '%s' not found inside Configuration Directory" ++msgstr "" ++ ++msgid "File not found or empty" ++msgstr "" ++ ++msgid "Files and Directories" ++msgstr "" ++ ++msgid "For help use link at the relevant option" ++msgstr "" ++ ++msgid "Forwarding" ++msgstr "" ++ ++msgid "" ++"If enabled, Privoxy hides the 'go there anyway' link. The user obviously " ++"should not be able to bypass any blocks." ++msgstr "" ++ ++msgid "" ++"If you intend to operate Privoxy for more users than just yourself, it might " ++"be a good idea to let them know how to reach you, what you block and why you " ++"do that, your policies, etc." ++msgstr "" ++ ++msgid "Invalid email address" ++msgstr "" ++ ++msgid "It is NOT recommended for the casual user." ++msgstr "" ++ ++msgid "Local Set-up" ++msgstr "" ++ ++msgid "Location of the Privoxy User Manual." ++msgstr "" ++ ++msgid "Log File Viewer" ++msgstr "" ++ ++msgid "Log all data read from the network" ++msgstr "" ++ ++msgid "Log all data written to the network" ++msgstr "" ++ ++msgid "Log the applying actions" ++msgstr "" ++ ++msgid "" ++"Log the destination for each request Privoxy let through. See also 'Debug " ++"1024'." ++msgstr "" ++ ++msgid "" ++"Log the destination for requests Privoxy didn't let through, and the reason " ++"why." ++msgstr "" ++ ++msgid "Logging" ++msgstr "" ++ ++msgid "Main actions file" ++msgstr "" ++ ++msgid "Mandatory Input: No Data given!" ++msgstr "" ++ ++msgid "Mandatory Input: No Directory given!" ++msgstr "" ++ ++msgid "Mandatory Input: No File given!" ++msgstr "" ++ ++msgid "Mandatory Input: No Port given!" ++msgstr "" ++ ++msgid "Mandatory Input: No files given!" ++msgstr "" ++ ++msgid "Mandatory Input: No valid IPv4 address or host given!" ++msgstr "" ++ ++msgid "Mandatory Input: No valid IPv6 address given!" ++msgstr "" ++ ++msgid "Mandatory Input: No valid Port given!" ++msgstr "" ++ ++msgid "Maximum number of client connections that will be served." ++msgstr "" ++ ++msgid "Maximum size (in KB) of the buffer for content filtering." ++msgstr "" ++ ++msgid "Miscellaneous" ++msgstr "" ++ ++msgid "No trailing '/', please." ++msgstr "" ++ ++msgid "Non-fatal errors - *we highly recommended enabling this*" ++msgstr "" ++ ++msgid "" ++"Number of seconds after which a socket times out if no data is received." ++msgstr "" ++ ++msgid "" ++"Number of seconds after which an open connection will no longer be reused." ++msgstr "" ++ ++msgid "" ++"Only when using 'external filters', Privoxy has to create temporary files." ++msgstr "" ++ ++msgid "Please press [Read] button" ++msgstr "" ++ ++msgid "Please read Privoxy manual for details!" ++msgstr "" ++ ++msgid "Please update to the current version!" ++msgstr "" ++ ++msgid "Privoxy WEB proxy" ++msgstr "" ++ ++msgid "" ++"Privoxy can (and normally does) use a number of other files for additional " ++"configuration, help and logging. This section of the configuration file " ++"tells Privoxy where to find those other files." ++msgstr "" ++ ++msgid "" ++"Privoxy is a non-caching web proxy with advanced filtering capabilities for " ++"enhancing privacy, modifying web page data and HTTP headers, controlling " ++"access, and removing ads and other obnoxious Internet junk." ++msgstr "" ++ ++msgid "Read / Reread log file" ++msgstr "" ++ ++msgid "Show I/O status" ++msgstr "" ++ ++msgid "Show each connection status" ++msgstr "" ++ ++msgid "Show header parsing" ++msgstr "" ++ ++msgid "Software update required" ++msgstr "" ++ ++msgid "Start" ++msgstr "" ++ ++msgid "Start / Stop" ++msgstr "" ++ ++msgid "Start/Stop Privoxy WEB Proxy" ++msgstr "" ++ ++msgid "Startup banner and warnings." ++msgstr "" ++ ++msgid "Syntax:" ++msgstr "" ++ ++msgid "Syntax: Client header names delimited by spaces." ++msgstr "" ++ ++msgid "Syntax: target_pattern http_parent[:port]" ++msgstr "" ++ ++msgid "Syntax: target_pattern socks_proxy[:port] http_parent[:port]" ++msgstr "" ++ ++msgid "" ++"The actions file(s) to use. Multiple actionsfile lines are permitted, and " ++"are in fact recommended!" ++msgstr "" ++ ++msgid "" ++"The address and TCP port on which Privoxy will listen for client requests." ++msgstr "" ++ ++msgid "" ++"The compression level that is passed to the zlib library when compressing " ++"buffered content." ++msgstr "" ++ ++msgid "" ++"The currently installed 'privoxy' package is not supported by LuCI " ++"application." ++msgstr "" ++ ++msgid "" ++"The directory where all logging takes place (i.e. where the logfile is " ++"located)." ++msgstr "" ++ ++msgid "The directory where the other configuration files are located." ++msgstr "" ++ ++msgid "" ++"The filter files contain content modification rules that use regular " ++"expressions." ++msgstr "" ++ ++msgid "The hostname shown on the CGI pages." ++msgstr "" ++ ++msgid "The log file to use. File name, relative to log directory." ++msgstr "" ++ ++msgid "The order in which client headers are sorted before forwarding them." ++msgstr "" ++ ++msgid "" ++"The status code Privoxy returns for pages blocked with +handle-as-empty-" ++"document." ++msgstr "" ++ ++msgid "" ++"The trust mechanism is an experimental feature for building white-lists and " ++"should be used with care." ++msgstr "" ++ ++msgid "" ++"The value of this option only matters if the experimental trust mechanism " ++"has been activated." ++msgstr "" ++ ++msgid "" ++"This option is only there for debugging purposes. It will drastically reduce " ++"performance." ++msgstr "" ++ ++msgid "" ++"This option will be removed in future releases as it has been obsoleted by " ++"the more general header taggers." ++msgstr "" ++ ++msgid "" ++"This tab controls the security-relevant aspects of Privoxy's configuration." ++msgstr "" ++ ++msgid "" ++"Through which SOCKS proxy (and optionally to which parent HTTP proxy) " ++"specific requests should be routed." ++msgstr "" ++ ++msgid "To which parent HTTP proxy specific requests should be routed." ++msgstr "" ++ ++msgid "User customizations" ++msgstr "" ++ ++msgid "Value is not a number" ++msgstr "" ++ ++msgid "Value not between 0 and 9" ++msgstr "" ++ ++msgid "Value not between 1 and 4096" ++msgstr "" ++ ++msgid "Value not greater 0 or empty" ++msgstr "" ++ ++msgid "Value range 1 to 4096, no entry defaults to 4096" ++msgstr "" ++ ++msgid "Version" ++msgstr "" ++ ++msgid "Version Information" ++msgstr "" ++ ++msgid "Whether intercepted requests should be treated as valid." ++msgstr "" ++ ++msgid "" ++"Whether or not Privoxy recognizes special HTTP headers to change toggle " ++"state." ++msgstr "" ++ ++msgid "Whether or not buffered content is compressed before delivery." ++msgstr "" ++ ++msgid "" ++"Whether or not outgoing connections that have been kept alive should be " ++"shared between different incoming connections." ++msgstr "" ++ ++msgid "Whether or not pipelined requests should be served." ++msgstr "" ++ ++msgid "Whether or not proxy authentication through Privoxy should work." ++msgstr "" ++ ++msgid "Whether or not the web-based actions file editor may be used." ++msgstr "" ++ ++msgid "Whether or not the web-based toggle feature may be used." ++msgstr "" ++ ++msgid "Whether requests to Privoxy's CGI pages can be blocked or redirected." ++msgstr "" ++ ++msgid "" ++"Whether the CGI interface should stay compatible with broken HTTP clients." ++msgstr "" ++ ++msgid "Whether to run only one server thread." ++msgstr "" ++ ++msgid "Who can access what." ++msgstr "" ++ ++msgid "installed" ++msgstr "" ++ ++msgid "or higher" ++msgstr "" ++ ++msgid "required" ++msgstr "" +diff --git a/feeds/luci/applications/luci-app-privoxy/po/zh-cn/privoxy.po b/feeds/luci/applications/luci-app-privoxy/po/zh-cn/privoxy.po +new file mode 100644 +index 0000000..f69a8f9 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-privoxy/po/zh-cn/privoxy.po +@@ -0,0 +1,468 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: luci-app-privoxy\n" ++"POT-Creation-Date: 2015-06-10 20:16+0100\n" ++"PO-Revision-Date: 2015-06-10 20:16+0100\n" ++"Last-Translator: maz-1 \n" ++"Language-Team: \n" ++"Language: zh-cn\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"X-Generator: Poedit 1.5.4\n" ++"Plural-Forms: nplurals=2; plural=(n != 1);\n" ++"X-Poedit-SourceCharset: UTF-8\n" ++ ++msgid "" ++"A URL to be displayed in the error page that users will see if access to an " ++"untrusted page is denied." ++msgstr "" ++"当用户试图访问ä¸å—信任的页é¢æ—¶ï¼Œé”™è¯¯é¡µé¢æ‰€æ˜¾ç¤ºçš„URL。" ++ ++ ++msgid "" ++"A URL to documentation about the local Privoxy setup, configuration or " ++"policies." ++msgstr "" ++"指å‘Privoxy安装ã€è®¾ç½®å’Œè§„则说明文档的URL" ++ ++ ++msgid "A directory where Privoxy can create temporary files." ++msgstr "Privoxy存放临时文件的目录。" ++ ++msgid "Access Control" ++msgstr "访问控制" ++ ++msgid "Actions that are applied to all sites and maybe overruled later on." ++msgstr "" ++"作用在所有站点上的规则,å¯èƒ½è¢«åŽé¢çš„规则覆盖。" ++ ++ ++msgid "An alternative directory where the templates are loaded from." ++msgstr "å¯é€‰çš„目录,放在里é¢çš„模æ¿ä¼šè¢«åŠ è½½ã€‚" ++ ++msgid "An email address to reach the Privoxy administrator." ++msgstr "用于è”ç³»privoxy管ç†å‘˜çš„邮箱地å€ã€‚" ++ ++msgid "" ++"Assumed server-side keep-alive timeout (in seconds) if not specified by the " ++"server." ++msgstr "" ++"当æœåŠ¡ç«¯æ²¡æœ‰æŒ‡å®šè¶…时时间时å‡å®šçš„超时时间(å•ä½ç§’)。" ++ ++msgid "CGI user interface" ++msgstr "CGI用户界é¢" ++ ++msgid "Common Log Format" ++msgstr "通用日志格å¼" ++ ++msgid "" ++"Configure here the routing of HTTP requests through a chain of multiple " ++"proxies. Note that parent proxies can severely decrease your privacy level. " ++"Also specified here are SOCKS proxies." ++msgstr "" ++"在这里设置http请求所ç»è¿‡çš„多é‡ä»£ç†é“¾ã€‚" ++"注æ„父级代ç†å¯èƒ½ä¸¥é‡é™ä½Žä½ çš„éšç§å®‰å…¨åº¦ã€‚" ++"在这里还å¯ä»¥è®¾ç½®SOCKS代ç†ã€‚" ++ ++msgid "Debug GIF de-animation" ++msgstr "GIF动画日志" ++ ++msgid "Debug force feature" ++msgstr "force feature日志" ++ ++msgid "Debug redirects" ++msgstr "é‡å®šå‘日志" ++ ++msgid "Debug regular expression filters" ++msgstr "正则表达å¼æ—¥å¿—" ++ ++msgid "Directory does not exist!" ++msgstr "目录ä¸å­˜åœ¨ï¼" ++ ++msgid "Disabled == Transparent Proxy Mode" ++msgstr "ç¦ç”¨ == é€æ˜Žä»£ç†æ¨¡å¼" ++ ++msgid "Enable proxy authentication forwarding" ++msgstr "å…许转å‘代ç†è®¤è¯" ++ ++msgid "" ++"Enable/Disable autostart of Privoxy on system startup and interface events" ++msgstr "" ++"å¼€å¯/关闭Privoxy在系统å¯åŠ¨æˆ–者设置界é¢æ›´æ”¹æ—¶è‡ªåŠ¨å¯åŠ¨ã€‚" ++ ++msgid "Enable/Disable filtering when Privoxy starts." ++msgstr "Privoxyå¯åŠ¨æ—¶å¼€å¯/关闭过滤。" ++ ++msgid "Enabled" ++msgstr "已开å¯" ++ ++msgid "" ++"Enabling this option is NOT recommended if there is no parent proxy that " ++"requires authentication!" ++msgstr "" ++"父级代ç†ä¸éœ€è¦è®¤è¯æ—¶ä¸æŽ¨èå¼€å¯è¿™ä¸ªé€‰é¡¹ï¼" ++ ++msgid "File '%s' not found inside Configuration Directory" ++msgstr "文件 '%s' 没有在设置目录中找到ï¼" ++ ++msgid "File not found or empty" ++msgstr "文件ä¸å­˜åœ¨æˆ–为空" ++ ++msgid "Files and Directories" ++msgstr "文件和目录" ++ ++msgid "For help use link at the relevant option" ++msgstr "" ++"在相应选项下的连接å¯èŽ·å–帮助。" ++ ++msgid "Forwarding" ++msgstr "转å‘" ++ ++msgid "" ++"If enabled, Privoxy hides the 'go there anyway' link. The user obviously " ++"should not be able to bypass any blocks." ++msgstr "" ++"如果å¯ç”¨ï¼ŒPrivoxy会éšè—'go there anyway'链接。用户显然ä¸åº”能绕过å±è”½ã€‚" ++ ++msgid "" ++"If you intend to operate Privoxy for more users than just yourself, it might " ++"be a good idea to let them know how to reach you, what you block and why you " ++"do that, your policies, etc." ++msgstr "" ++"如果除了你还有其他用户通过privoxy连接,让他们知é“如何è”系你ã€ä»€ä¹ˆå†…容被å±è”½äº†ã€" ++"你为什么è¦è¿™ä¹ˆåšã€ä½ æ‰€åˆ¶å®šçš„规范等等是一个好主æ„。" ++ ++msgid "Invalid email address" ++msgstr "邮箱地å€æ— æ•ˆ" ++ ++msgid "It is NOT recommended for the casual user." ++msgstr "ä¸æŽ¨è新手使用。" ++ ++msgid "Local Set-up" ++msgstr "本地设置" ++ ++msgid "Location of the Privoxy User Manual." ++msgstr "Privoxy用户手册ä½ç½®" ++ ++msgid "Log File Viewer" ++msgstr "日志查看器" ++ ++msgid "Log all data read from the network" ++msgstr "记录所有从网络接收的数æ®" ++ ++msgid "Log all data written to the network" ++msgstr "记录所有å‘é€ç»™ç½‘络的数æ®" ++ ++msgid "Log the applying actions" ++msgstr "记录被应用的规则" ++ ++msgid "" ++"Log the destination for each request Privoxy let through. See also 'Debug " ++"1024'." ++msgstr "" ++"记录Privoxy所å…许的所有请求。å¦è¯·å‚考'Debug 1024'。" ++ ++msgid "" ++"Log the destination for requests Privoxy didn't let through, and the reason " ++"why." ++msgstr "" ++"记录被Privoxyæ‹’ç»çš„请求目标以åŠæ‹’ç»åŽŸå› ã€‚" ++ ++msgid "Logging" ++msgstr "日志" ++ ++msgid "Main actions file" ++msgstr "主è¦è§„则文件" ++ ++msgid "Mandatory Input: No Data given!" ++msgstr "必需选项: 没有设置数æ®ï¼" ++ ++msgid "Mandatory Input: No Directory given!" ++msgstr "必需选项: 没有设置目录ï¼" ++ ++msgid "Mandatory Input: No File given!" ++msgstr "必需选项: 没有设置文件ï¼" ++ ++msgid "Mandatory Input: No Port given!" ++msgstr "必需选项: 没有设置端å£ï¼" ++ ++msgid "Mandatory Input: No files given!" ++msgstr "必需选项: 没有设置文件ï¼" ++ ++msgid "Mandatory Input: No valid IPv4 address or host given!" ++msgstr "" ++"必需选项: 没有设置有效的IPV4地å€æˆ–者主机ï¼" ++ ++msgid "Mandatory Input: No valid IPv6 address given!" ++msgstr "必需选项: 没有设置有效的IPV6地å€ï¼" ++ ++msgid "Mandatory Input: No valid Port given!" ++msgstr "必需选项: 没有设置有效的端å£ï¼" ++ ++msgid "Maximum number of client connections that will be served." ++msgstr "客户端数é‡ä¸Šé™ã€‚" ++ ++msgid "Maximum size (in KB) of the buffer for content filtering." ++msgstr "内容过滤的最大缓冲(å•ä½KB)。" ++ ++msgid "Miscellaneous" ++msgstr "æ‚项" ++ ++msgid "No trailing '/', please." ++msgstr "路径结尾ä¸è¦åŠ '/' ." ++ ++msgid "Non-fatal errors - *we highly recommended enabling this*" ++msgstr "" ++"éžè‡´å‘½æ€§é”™è¯¯ - * å»ºè®®å¼€å¯ *" ++ ++msgid "" ++"Number of seconds after which a socket times out if no data is received." ++msgstr "" ++"socket连接未收到数æ®çš„超时时间。" ++ ++msgid "" ++"Number of seconds after which an open connection will no longer be reused." ++msgstr "" ++"一个开放的连接ä¸å†é‡å¤ä½¿ç”¨çš„超时时间。" ++ ++msgid "" ++"Only when using 'external filters', Privoxy has to create temporary files." ++msgstr "" ++"åªæœ‰ä½¿ç”¨å¤–置规则时,privoxyæ‰éœ€è¦åˆ›å»ºä¸´æ—¶æ–‡ä»¶ã€‚" ++ ++msgid "Please press [Read] button" ++msgstr "请点击[读å–]按钮" ++ ++msgid "Please read Privoxy manual for details!" ++msgstr "请阅读Privoxy手册以了解详情ï¼" ++ ++msgid "Please update to the current version!" ++msgstr "请å‡çº§åˆ°å½“å‰ç‰ˆæœ¬ï¼" ++ ++msgid "Privoxy WEB proxy" ++msgstr "Privoxy 网络代ç†" ++ ++msgid "" ++"Privoxy can (and normally does) use a number of other files for additional " ++"configuration, help and logging. This section of the configuration file " ++"tells Privoxy where to find those other files." ++msgstr "" ++"Privoxyå¯ä»¥ä½¿ç”¨å…¶ä»–一些文件用于附加设置,帮助和日志。这个区域用æ¥å‘Šè¯‰Privoxy从哪里找到这些文件。" ++ ++msgid "" ++"Privoxy is a non-caching web proxy with advanced filtering capabilities for " ++"enhancing privacy, modifying web page data and HTTP headers, controlling " ++"access, and removing ads and other obnoxious Internet junk." ++msgstr "" ++"Privoxy是一个无缓存的网络代ç†ï¼Œå…·æœ‰é«˜çº§è¿‡æ»¤åŠŸèƒ½ï¼Œèƒ½å¤Ÿä¿®æ”¹ç½‘页数æ®å’ŒHTTP头,控制访问,移除广告等。" ++ ++msgid "Read / Reread log file" ++msgstr "读å–/刷新日志文件" ++ ++msgid "Show I/O status" ++msgstr "显示 I/O 状æ€" ++ ++msgid "Show each connection status" ++msgstr "显示æ¯ä¸ªè¿žæŽ¥çš„状æ€" ++ ++msgid "Show header parsing" ++msgstr "Show header parsing" ++ ++msgid "Software update required" ++msgstr "需è¦å‡çº§è½¯ä»¶" ++ ++msgid "Start" ++msgstr "å¯åŠ¨" ++ ++msgid "Start / Stop" ++msgstr "å¯åŠ¨ / åœæ­¢" ++ ++msgid "Start/Stop Privoxy WEB Proxy" ++msgstr "å¯åŠ¨/åœæ­¢ Privoxy 网络代ç†" ++ ++msgid "Startup banner and warnings." ++msgstr "å¯åŠ¨æ ‡è¯­å’Œè­¦å‘Šã€‚" ++ ++msgid "Syntax:" ++msgstr "æ ¼å¼:" ++ ++msgid "Syntax: Client header names delimited by spaces." ++msgstr "æ ¼å¼: Client header names delimited by spaces." ++ ++msgid "Syntax: target_pattern http_parent[:port]" ++msgstr "æ ¼å¼: target_pattern http_parent[:port]" ++ ++msgid "Syntax: target_pattern socks_proxy[:port] http_parent[:port]" ++msgstr "æ ¼å¼: target_pattern socks_proxy[:port] http_parent[:port]" ++ ++msgid "" ++"The actions file(s) to use. Multiple actionsfile lines are permitted, and " ++"are in fact recommended!" ++msgstr "" ++"所使用的规则文件。å…许并且推è使用多个规则文件。" ++ ++msgid "" ++"The address and TCP port on which Privoxy will listen for client requests." ++msgstr "" ++"Privoxy接收客户端请求时监å¬çš„地å€å’ŒTCP端å£ã€‚" ++ ++msgid "" ++"The compression level that is passed to the zlib library when compressing " ++"buffered content." ++msgstr "" ++"使用zlib压缩缓冲内容时的压缩级别。" ++ ++msgid "" ++"The currently installed 'privoxy' package is not supported by LuCI " ++"application." ++msgstr "" ++"ç›®å‰å®‰è£…çš„privoxy版本ä¸è¢«luci支æŒã€‚" ++ ++msgid "" ++"The directory where all logging takes place (i.e. where the logfile is " ++"located)." ++msgstr "所有日志所在的目录。" ++ ++msgid "The directory where the other configuration files are located." ++msgstr "其他设置文件所在的目录。" ++ ++msgid "" ++"The filter files contain content modification rules that use regular " ++"expressions." ++msgstr "" ++"过滤文件包å«äº†ä½¿ç”¨æ­£åˆ™è¡¨è¾¾å¼ç¼–写的内容修改规则" ++ ++msgid "The hostname shown on the CGI pages." ++msgstr "CGI页é¢æ˜¾ç¤ºçš„主机å。" ++ ++msgid "The log file to use. File name, relative to log directory." ++msgstr "" ++"日志文件å称,与日志路径相对。" ++ ++msgid "The order in which client headers are sorted before forwarding them." ++msgstr "" ++"转å‘æ•°æ®å‰ï¼Œclient headers的排åºã€‚" ++ ++msgid "" ++"The status code Privoxy returns for pages blocked with +handle-as-empty-" ++"document." ++msgstr "" ++"当页é¢å› ä¸ºhandle-as-empty-document规则被阻止时返回的状æ€ç ï¼ˆé€‰ä¸Šä¸º200 OK,ä¸é€‰ä¸Šä¸º403 Forbidden)" ++ ++msgid "" ++"The trust mechanism is an experimental feature for building white-lists and " ++"should be used with care." ++msgstr "" ++"信任机制是一个实验性的白åå•ç‰¹æ€§ï¼Œä½¿ç”¨æ—¶åº”å°å¿ƒã€‚" ++ ++msgid "" ++"The value of this option only matters if the experimental trust mechanism " ++"has been activated." ++msgstr "" ++"åªæœ‰å¼€å¯äº†ä¿¡ä»»æœºåˆ¶æ—¶è¿™ä¸ªé€‰é¡¹çš„值æ‰æœ‰æ•ˆ" ++ ++msgid "" ++"This option is only there for debugging purposes. It will drastically reduce " ++"performance." ++msgstr "" ++"这个选项仅用于调试,开å¯åŽä¼šæžå¤§åœ°é™ä½Žæ€§èƒ½ã€‚" ++ ++msgid "" ++"This option will be removed in future releases as it has been obsoleted by " ++"the more general header taggers." ++msgstr "这个选项在以åŽçš„版本中将被移除,因为它被header taggers所å–代了。" ++ ++msgid "" ++"This tab controls the security-relevant aspects of Privoxy's configuration." ++msgstr "" ++"这个标签用于设置与安全相关的Privoxy选项。" ++ ++msgid "" ++"Through which SOCKS proxy (and optionally to which parent HTTP proxy) " ++"specific requests should be routed." ++msgstr "" ++"指定的请求应该通过哪一个SOCKS代ç†ï¼ˆå¹¶ä¸”通过哪一个HTTP父代ç†ï¼Œå¯é€‰ï¼‰" ++ ++msgid "To which parent HTTP proxy specific requests should be routed." ++msgstr "" ++"请求应转å‘至哪一个父级HTTP代ç†ã€‚" ++ ++msgid "User customizations" ++msgstr "用户自定义" ++ ++msgid "Value is not a number" ++msgstr "输入值ä¸æ˜¯æ•°å­—" ++ ++msgid "Value not between 0 and 9" ++msgstr "输入值ä¸åœ¨0å’Œ9之间。" ++ ++msgid "Value not between 1 and 4096" ++msgstr "输入值ä¸åœ¨1å’Œ4096之间" ++ ++msgid "Value not greater 0 or empty" ++msgstr "输入值为空或者ä¸æ˜¯å¤§äºŽé›¶ã€‚" ++ ++msgid "Value range 1 to 4096, no entry defaults to 4096" ++msgstr "输入值为1到4096,默认为4096" ++ ++msgid "Version" ++msgstr "版本" ++ ++msgid "Version Information" ++msgstr "版本信æ¯" ++ ++msgid "Whether intercepted requests should be treated as valid." ++msgstr "被拦截的请求是å¦åº”被当作有效的。" ++ ++msgid "" ++"Whether or not Privoxy recognizes special HTTP headers to change toggle " ++"state." ++msgstr "" ++"Privoxy是å¦è¯†åˆ«ç‰¹æ®Šçš„HTTP头以切æ¢çŠ¶æ€ã€‚" ++ ++msgid "Whether or not buffered content is compressed before delivery." ++msgstr "" ++"缓冲内容在传递之å‰æ˜¯å¦åŽ‹ç¼©ã€‚" ++ ++msgid "" ++"Whether or not outgoing connections that have been kept alive should be " ++"shared between different incoming connections." ++msgstr "" ++"æŒä¹…出站连接是å¦åº”在ä¸åŒçš„入站连接之间共享。" ++ ++msgid "Whether or not pipelined requests should be served." ++msgstr "是å¦å¤„ç†ç®¡é“化的请求。" ++ ++msgid "Whether or not proxy authentication through Privoxy should work." ++msgstr "是å¦å¯ä»¥é€šè¿‡Privoxy进行代ç†éªŒè¯ã€‚" ++ ++msgid "Whether or not the web-based actions file editor may be used." ++msgstr "是å¦ä½¿ç”¨åŸºäºŽç½‘页的规则编辑器。" ++ ++msgid "Whether or not the web-based toggle feature may be used." ++msgstr "是å¦å¯ç”¨åŸºäºŽç½‘页的切æ¢åŠŸèƒ½ã€‚" ++ ++msgid "Whether requests to Privoxy's CGI pages can be blocked or redirected." ++msgstr "访问Privoxy CGI页é¢çš„请求是å¦å¯ä»¥è¢«æ‹¦æˆªæˆ–é‡å®šå‘。" ++ ++ ++msgid "" ++"Whether the CGI interface should stay compatible with broken HTTP clients." ++msgstr "" ++"CGIç•Œé¢æ˜¯å¦åº”兼容过时的HTTP客户端。" ++ ++msgid "Whether to run only one server thread." ++msgstr "是å¦åªè¿è¡Œä¸€ä¸ªæœåŠ¡çº¿ç¨‹ã€‚" ++ ++msgid "Who can access what." ++msgstr "è°å¯ä»¥è®¿é—®ä»€ä¹ˆã€‚" ++ ++msgid "installed" ++msgstr "已安装" ++ ++msgid "or higher" ++msgstr "或更高" ++ ++msgid "required" ++msgstr "需è¦" +diff --git a/feeds/luci/applications/luci-app-privoxy/root/etc/uci-defaults/luci-privoxy b/feeds/luci/applications/luci-app-privoxy/root/etc/uci-defaults/luci-privoxy +new file mode 100755 +index 0000000..3405479 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-privoxy/root/etc/uci-defaults/luci-privoxy +@@ -0,0 +1,12 @@ ++#!/bin/sh ++ ++# no longer needed for "Save and Apply" to restart privoxy ++# luci-app-privoxy calls /etc/init.d/privoxy reload ++uci -q batch <<-EOF >/dev/null ++ delete ucitrack.@privoxy[-1] ++ commit ucitrack ++EOF ++ ++rm -f /tmp/luci-indexcache ++ ++exit 0 +diff --git a/feeds/luci/applications/luci-app-qos/Makefile b/feeds/luci/applications/luci-app-qos/Makefile +new file mode 100644 +index 0000000..dd322a3 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-qos/Makefile +@@ -0,0 +1,14 @@ ++# ++# Copyright (C) 2008-2014 The LuCI Team ++# ++# This is free software, licensed under the Apache License, Version 2.0 . ++# ++ ++include $(TOPDIR)/rules.mk ++ ++LUCI_TITLE:=Quality of Service configuration module ++LUCI_DEPENDS:=+qos-scripts ++ ++include ../../luci.mk ++ ++# call BuildPackage - OpenWrt buildroot signature +diff --git a/feeds/luci/applications/luci-app-qos/luasrc/controller/qos.lua b/feeds/luci/applications/luci-app-qos/luasrc/controller/qos.lua +new file mode 100644 +index 0000000..250a039 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-qos/luasrc/controller/qos.lua +@@ -0,0 +1,15 @@ ++-- Copyright 2008 Steven Barth ++-- Licensed to the public under the Apache License 2.0. ++ ++module("luci.controller.qos", package.seeall) ++ ++function index() ++ if not nixio.fs.access("/etc/config/qos") then ++ return ++ end ++ ++ local page ++ ++ page = entry({"admin", "network", "qos"}, cbi("qos/qos"), _("QoS")) ++ page.dependent = true ++end +diff --git a/feeds/luci/applications/luci-app-qos/luasrc/model/cbi/qos/qos.lua b/feeds/luci/applications/luci-app-qos/luasrc/model/cbi/qos/qos.lua +new file mode 100644 +index 0000000..a8ea57e +--- /dev/null ++++ b/feeds/luci/applications/luci-app-qos/luasrc/model/cbi/qos/qos.lua +@@ -0,0 +1,71 @@ ++-- Copyright 2008 Steven Barth ++-- Licensed to the public under the Apache License 2.0. ++ ++local wa = require "luci.tools.webadmin" ++local fs = require "nixio.fs" ++ ++m = Map("qos", translate("Quality of Service"), ++ translate("With QoS you " .. ++ "can prioritize network traffic selected by addresses, " .. ++ "ports or services.")) ++ ++s = m:section(TypedSection, "interface", translate("Interfaces")) ++s.addremove = true ++s.anonymous = false ++ ++e = s:option(Flag, "enabled", translate("Enable")) ++e.rmempty = false ++ ++c = s:option(ListValue, "classgroup", translate("Classification group")) ++c:value("Default", translate("default")) ++c.default = "Default" ++ ++s:option(Flag, "overhead", translate("Calculate overhead")) ++ ++s:option(Flag, "halfduplex", translate("Half-duplex")) ++ ++dl = s:option(Value, "download", translate("Download speed (kbit/s)")) ++dl.datatype = "and(uinteger,min(1))" ++ ++ul = s:option(Value, "upload", translate("Upload speed (kbit/s)")) ++ul.datatype = "and(uinteger,min(1))" ++ ++s = m:section(TypedSection, "classify", translate("Classification Rules")) ++s.template = "cbi/tblsection" ++s.anonymous = true ++s.addremove = true ++s.sortable = true ++ ++t = s:option(ListValue, "target", translate("Target")) ++t:value("Priority", translate("priority")) ++t:value("Express", translate("express")) ++t:value("Normal", translate("normal")) ++t:value("Bulk", translate("low")) ++t.default = "Normal" ++ ++srch = s:option(Value, "srchost", translate("Source host")) ++srch.rmempty = true ++srch:value("", translate("all")) ++wa.cbi_add_knownips(srch) ++ ++dsth = s:option(Value, "dsthost", translate("Destination host")) ++dsth.rmempty = true ++dsth:value("", translate("all")) ++wa.cbi_add_knownips(dsth) ++ ++p = s:option(Value, "proto", translate("Protocol")) ++p:value("", translate("all")) ++p:value("tcp", "TCP") ++p:value("udp", "UDP") ++p:value("icmp", "ICMP") ++p.rmempty = true ++ ++ports = s:option(Value, "ports", translate("Ports")) ++ports.rmempty = true ++ports:value("", translate("all")) ++ ++bytes = s:option(Value, "connbytes", translate("Number of bytes")) ++ ++comment = s:option(Value, "comment", translate("Comment")) ++ ++return m +diff --git a/feeds/luci/applications/luci-app-qos/po/ca/qos.po b/feeds/luci/applications/luci-app-qos/po/ca/qos.po +new file mode 100644 +index 0000000..7871b12 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-qos/po/ca/qos.po +@@ -0,0 +1,122 @@ ++# qos.pot ++# generated from ./applications/luci-qos/luasrc/i18n/qos.en.lua ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Report-Msgid-Bugs-To: \n" ++"POT-Creation-Date: 2010-03-25 22:10+0100\n" ++"PO-Revision-Date: 2014-07-17 23:39+0200\n" ++"Last-Translator: Alex \n" ++"Language-Team: LANGUAGE \n" ++"Language: ca\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n != 1);\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++#, fuzzy ++msgid "Calculate overhead" ++msgstr "Calcula càrrega (overhead)" ++ ++msgid "Classification Rules" ++msgstr "Regles de classificació" ++ ++msgid "Classification group" ++msgstr "Grup de classificació" ++ ++msgid "Comment" ++msgstr "Comentari" ++ ++msgid "Destination host" ++msgstr "Host de destí" ++ ++msgid "Download speed (kbit/s)" ++msgstr "Velocitat de baixada (kbit/s)" ++ ++msgid "Enable" ++msgstr "Habilita" ++ ++#, fuzzy ++msgid "Half-duplex" ++msgstr "Half-duplex" ++ ++msgid "Interfaces" ++msgstr "Interfícies" ++ ++msgid "Number of bytes" ++msgstr "Nombre de bytes" ++ ++msgid "Ports" ++msgstr "Ports" ++ ++msgid "Protocol" ++msgstr "Protocol" ++ ++msgid "QoS" ++msgstr "QoS" ++ ++msgid "Quality of Service" ++msgstr "Qualitat de Servei" ++ ++msgid "Service" ++msgstr "Servei" ++ ++msgid "Source host" ++msgstr "Host d'origen" ++ ++msgid "Target" ++msgstr "Host de destí" ++ ++msgid "Upload speed (kbit/s)" ++msgstr "Velocitat de pujada (kbit/s)" ++ ++#, fuzzy ++msgid "" ++"With QoS you can prioritize " ++"network traffic selected by addresses, ports or services." ++msgstr "" ++"Amb QoS pots prioritzar el tràfic de xarxa seleccionat per adreces, ports o " ++"serveis." ++ ++msgid "all" ++msgstr "tots" ++ ++msgid "default" ++msgstr "per defecte" ++ ++msgid "express" ++msgstr "exprés" ++ ++msgid "low" ++msgstr "baix" ++ ++msgid "normal" ++msgstr "normal" ++ ++msgid "priority" ++msgstr "prioritat" ++ ++#~ msgid "Downlink" ++#~ msgstr "Enllaç de baixada" ++ ++#~ msgid "Internet Connection" ++#~ msgstr "Connexió a Internet" ++ ++#~ msgid "Uplink" ++#~ msgstr "Enllaç de pujada" ++ ++#~ msgid "Prioritization" ++#~ msgstr "Priorització" ++ ++#~ msgid "source network / source host" ++#~ msgstr "xarxa d'origen / màquina d'origen" ++ ++#~ msgid "target network / target host" ++#~ msgstr "xarxa de destí / màquina de destí" ++ ++#~ msgid "portrange" ++#~ msgstr "rang de ports" ++ ++#~ msgid "Bytes sent" ++#~ msgstr "Bytes enviats" +diff --git a/feeds/luci/applications/luci-app-qos/po/cs/qos.po b/feeds/luci/applications/luci-app-qos/po/cs/qos.po +new file mode 100644 +index 0000000..361e4d5 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-qos/po/cs/qos.po +@@ -0,0 +1,114 @@ ++# Generated from applications/luci-qos/luasrc/model/cbi/qos/qos.lua ++# ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Report-Msgid-Bugs-To: \n" ++"POT-Creation-Date: 2010-03-25 22:10+0100\n" ++"PO-Revision-Date: 2014-06-20 23:36+0200\n" ++"Last-Translator: koli \n" ++"Language-Team: none\n" ++"Language: cs\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "Calculate overhead" ++msgstr "" ++"Snažit se zabránit zahlcení linky snížením jejího maximálního povoleného " ++"zatížení síťovým provozem" ++ ++msgid "Classification Rules" ++msgstr "KlasifikaÄní pravidla" ++ ++msgid "Classification group" ++msgstr "KlasifikaÄní skupina" ++ ++msgid "Comment" ++msgstr "Komentář" ++ ++msgid "Destination host" ++msgstr "Cílová adresa" ++ ++msgid "Download speed (kbit/s)" ++msgstr "Rychlost stahování dat (kbit/s)" ++ ++msgid "Enable" ++msgstr "Povolit" ++ ++msgid "Half-duplex" ++msgstr "PoloviÄní duplex" ++ ++msgid "Interfaces" ++msgstr "Síťová rozhraní" ++ ++msgid "Number of bytes" ++msgstr "PoÄet bajtů" ++ ++msgid "Ports" ++msgstr "Porty" ++ ++msgid "Protocol" ++msgstr "Protokol" ++ ++msgid "QoS" ++msgstr "QoS" ++ ++msgid "Quality of Service" ++msgstr "Quality of Service" ++ ++msgid "Service" ++msgstr "Služba" ++ ++msgid "Source host" ++msgstr "Zdrojová adresa" ++ ++msgid "Target" ++msgstr "Cílová třída priority" ++ ++msgid "Upload speed (kbit/s)" ++msgstr "Rychlost odesílání dat (kbit/s)" ++ ++msgid "" ++"With QoS you can prioritize " ++"network traffic selected by addresses, ports or services." ++msgstr "" ++"Pomocí služby \"QoS\" můžete " ++"nastavit prioritu síťového provozu na základÄ› specifikace adres, portů Äi " ++"služeb." ++ ++msgid "all" ++msgstr "vÅ¡e" ++ ++msgid "default" ++msgstr "výchozí" ++ ++msgid "express" ++msgstr "nejvyšší priorita (velké rámce)" ++ ++msgid "low" ++msgstr "nízká priorita" ++ ++msgid "normal" ++msgstr "normální priorita" ++ ++msgid "priority" ++msgstr "nejvyšší priorita (malé rámce)" ++ ++#~ msgid "Downlink" ++#~ msgstr "Stahování" ++ ++#~ msgid "Internet Connection" ++#~ msgstr "PÅ™ipojení k internetu" ++ ++#~ msgid "Uplink" ++#~ msgstr "Odesílání" ++ ++#, fuzzy ++#~ msgid "allf" ++#~ msgstr "allf" ++ ++#~ msgid "qos_connbytes" ++#~ msgstr "qos_connbytes" +diff --git a/feeds/luci/applications/luci-app-qos/po/de/qos.po b/feeds/luci/applications/luci-app-qos/po/de/qos.po +new file mode 100644 +index 0000000..6ba5701 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-qos/po/de/qos.po +@@ -0,0 +1,122 @@ ++# qos.po ++# generated from ./applications/luci-qos/luasrc/i18n/qos.en.lua ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Report-Msgid-Bugs-To: \n" ++"POT-Creation-Date: 2010-03-25 22:10+0100\n" ++"PO-Revision-Date: 2013-01-28 22:18+0200\n" ++"Last-Translator: DAC324 \n" ++"Language-Team: LANGUAGE \n" ++"Language: de\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n != 1);\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "Calculate overhead" ++msgstr "Overheadberechnung" ++ ++msgid "Classification Rules" ++msgstr "Klassifizierungsregeln" ++ ++msgid "Classification group" ++msgstr "Klassifizierungsgruppe" ++ ++msgid "Comment" ++msgstr "" ++ ++msgid "Destination host" ++msgstr "Zieladresse" ++ ++msgid "Download speed (kbit/s)" ++msgstr "Downloadgeschwindigkeit (kbit/s)" ++ ++msgid "Enable" ++msgstr "Aktivieren" ++ ++msgid "Half-duplex" ++msgstr "Halb-Duplex" ++ ++msgid "Interfaces" ++msgstr "Schnittstellen" ++ ++msgid "Number of bytes" ++msgstr "Byteanzahl" ++ ++msgid "Ports" ++msgstr "Ports" ++ ++msgid "Protocol" ++msgstr "Protokoll" ++ ++msgid "QoS" ++msgstr "QoS" ++ ++msgid "Quality of Service" ++msgstr "Quality of Service" ++ ++msgid "Service" ++msgstr "Dienst" ++ ++msgid "Source host" ++msgstr "Quelladresse" ++ ++msgid "Target" ++msgstr "Zieladresse" ++ ++msgid "Upload speed (kbit/s)" ++msgstr "Uploadgeschwindigkeit (kbit/s)" ++ ++msgid "" ++"With QoS you can prioritize " ++"network traffic selected by addresses, ports or services." ++msgstr "" ++"Mit Hilfe von QoS kann " ++"Netzwerkverkehr anhand von Adressen, Ports oder Diensten priorisiert werden." ++ ++msgid "all" ++msgstr "alle" ++ ++msgid "default" ++msgstr "Standardeinstellung" ++ ++msgid "express" ++msgstr "express" ++ ++msgid "low" ++msgstr "niedrig" ++ ++msgid "normal" ++msgstr "normal" ++ ++msgid "priority" ++msgstr "Priorität" ++ ++#~ msgid "Downlink" ++#~ msgstr "Downlink" ++ ++#~ msgid "Internet Connection" ++#~ msgstr "Internetverbindung" ++ ++#~ msgid "Uplink" ++#~ msgstr "Uplink" ++ ++#~ msgid "allf" ++#~ msgstr "alle f" ++ ++#~ msgid "qos_connbytes" ++#~ msgstr "Bytes gesendet" ++ ++#~ msgid "Prioritization" ++#~ msgstr "Priorisierung" ++ ++#~ msgid "source network / source host" ++#~ msgstr "Quellnetz / Quellhost" ++ ++#~ msgid "target network / target host" ++#~ msgstr "Zielnetz / Zielhost" ++ ++#~ msgid "portrange" ++#~ msgstr "Portbereich" +diff --git a/feeds/luci/applications/luci-app-qos/po/el/qos.po b/feeds/luci/applications/luci-app-qos/po/el/qos.po +new file mode 100644 +index 0000000..b417b8b +--- /dev/null ++++ b/feeds/luci/applications/luci-app-qos/po/el/qos.po +@@ -0,0 +1,124 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Report-Msgid-Bugs-To: \n" ++"POT-Creation-Date: 2010-03-25 22:10+0100\n" ++"PO-Revision-Date: 2012-03-18 15:29+0200\n" ++"Last-Translator: Vasilis \n" ++"Language-Team: LANGUAGE \n" ++"Language: el\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n != 1);\n" ++"X-Generator: Pootle 2.0.4\n" ++ ++#, fuzzy ++msgid "Calculate overhead" ++msgstr "Υπολογισμός Overhead" ++ ++#, fuzzy ++msgid "Classification Rules" ++msgstr "ΚατηγοÏιοποίηση" ++ ++#, fuzzy ++msgid "Classification group" ++msgstr "ΚατηγοÏιοποίηση" ++ ++msgid "Comment" ++msgstr "" ++ ++msgid "Destination host" ++msgstr "" ++ ++msgid "Download speed (kbit/s)" ++msgstr "" ++ ++msgid "Enable" ++msgstr "ΕνεÏγοποίηση" ++ ++#, fuzzy ++msgid "Half-duplex" ++msgstr "Μη-ταυτόχÏονη αμφίδÏομη επικοινωνία" ++ ++msgid "Interfaces" ++msgstr "Διεπαφές" ++ ++msgid "Number of bytes" ++msgstr "" ++ ++#, fuzzy ++msgid "Ports" ++msgstr "ΠÏοτεÏαιότητα" ++ ++msgid "Protocol" ++msgstr "ΠÏωτόκολλο" ++ ++msgid "QoS" ++msgstr "" ++ ++msgid "Quality of Service" ++msgstr "Ποιότητα ΥπηÏεσίας" ++ ++msgid "Service" ++msgstr "ΥπηÏεσία" ++ ++#, fuzzy ++msgid "Source host" ++msgstr "ΔιεÏθυνση πηγής" ++ ++#, fuzzy ++msgid "Target" ++msgstr "ΔιεÏθυνση στόχου" ++ ++msgid "Upload speed (kbit/s)" ++msgstr "" ++ ++#, fuzzy ++msgid "" ++"With QoS you can prioritize " ++"network traffic selected by addresses, ports or services." ++msgstr "" ++"Με το QoS μποÏείτε να οÏίσετε Ï€ÏοτεÏαιότητες στην κίνηση του δικτÏου με βάση " ++"διευθÏνσεις, θÏÏες ή υπηÏεσίες." ++ ++msgid "all" ++msgstr "" ++ ++msgid "default" ++msgstr "Ï€Ïοεπιλογή" ++ ++msgid "express" ++msgstr "εξπÏές" ++ ++msgid "low" ++msgstr "χαμηλή" ++ ++msgid "normal" ++msgstr "κανονική" ++ ++msgid "priority" ++msgstr "Ï€ÏοτεÏαιότητα" ++ ++#, fuzzy ++#~ msgid "Downlink" ++#~ msgstr "ΤαχÏτητα κατεβάσματος" ++ ++#, fuzzy ++#~ msgid "Uplink" ++#~ msgstr "ΤαχÏτητα ανεβάσματος" ++ ++#~ msgid "Prioritization" ++#~ msgstr "ΠÏοτεÏαιότητες" ++ ++#~ msgid "source network / source host" ++#~ msgstr "πηγαίο δίκτυο / πηγαίος υπολογιστής" ++ ++#~ msgid "target network / target host" ++#~ msgstr "δίκτυο στόχος / υπολογιστής στόχος" ++ ++#~ msgid "portrange" ++#~ msgstr "εÏÏος θυÏών" ++ ++#~ msgid "Bytes sent" ++#~ msgstr "Απεσταλμένα byte" +diff --git a/feeds/luci/applications/luci-app-qos/po/en/qos.po b/feeds/luci/applications/luci-app-qos/po/en/qos.po +new file mode 100644 +index 0000000..aeb7b27 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-qos/po/en/qos.po +@@ -0,0 +1,91 @@ ++#, fuzzy ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Report-Msgid-Bugs-To: \n" ++"POT-Creation-Date: 2010-03-25 22:10+0100\n" ++"PO-Revision-Date: 2010-03-25 22:10+0100\n" ++"Last-Translator: FULL NAME \n" ++"Language-Team: LANGUAGE \n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++ ++msgid "Calculate overhead" ++msgstr "Calculate overhead" ++ ++msgid "Classification Rules" ++msgstr "Classification Rules" ++ ++msgid "Classification group" ++msgstr "Classification group" ++ ++msgid "Comment" ++msgstr "" ++ ++msgid "Destination host" ++msgstr "Destination host" ++ ++msgid "Download speed (kbit/s)" ++msgstr "Download speed (kbit/s)" ++ ++msgid "Enable" ++msgstr "Enable" ++ ++msgid "Half-duplex" ++msgstr "Half-duplex" ++ ++msgid "Interfaces" ++msgstr "Interfaces" ++ ++msgid "Number of bytes" ++msgstr "Number of bytes" ++ ++msgid "Ports" ++msgstr "Ports" ++ ++msgid "Protocol" ++msgstr "Protocol" ++ ++msgid "QoS" ++msgstr "" ++ ++msgid "Quality of Service" ++msgstr "Quality of Service" ++ ++msgid "Service" ++msgstr "Service" ++ ++msgid "Source host" ++msgstr "Source host" ++ ++msgid "Target" ++msgstr "Target" ++ ++msgid "Upload speed (kbit/s)" ++msgstr "Upload speed (kbit/s)" ++ ++msgid "" ++"With QoS you can prioritize " ++"network traffic selected by addresses, ports or services." ++msgstr "" ++"With QoS you can prioritize " ++"network traffic selected by addresses, ports or services." ++ ++msgid "all" ++msgstr "all" ++ ++msgid "default" ++msgstr "default" ++ ++msgid "express" ++msgstr "express" ++ ++msgid "low" ++msgstr "low" ++ ++msgid "normal" ++msgstr "normal" ++ ++msgid "priority" ++msgstr "priority" +diff --git a/feeds/luci/applications/luci-app-qos/po/es/qos.po b/feeds/luci/applications/luci-app-qos/po/es/qos.po +new file mode 100644 +index 0000000..3c8206d +--- /dev/null ++++ b/feeds/luci/applications/luci-app-qos/po/es/qos.po +@@ -0,0 +1,123 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Report-Msgid-Bugs-To: \n" ++"POT-Creation-Date: 2010-03-25 22:10+0100\n" ++"PO-Revision-Date: 2014-06-15 09:13+0200\n" ++"Last-Translator: José Vicente \n" ++"Language-Team: LANGUAGE \n" ++"Language: es\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n != 1);\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "Calculate overhead" ++msgstr "Calcular sobrecarga" ++ ++msgid "Classification Rules" ++msgstr "Reglas de clasificación" ++ ++msgid "Classification group" ++msgstr "Grupo de clasificación" ++ ++msgid "Comment" ++msgstr "Comentario" ++ ++msgid "Destination host" ++msgstr "Máquina de destino" ++ ++msgid "Download speed (kbit/s)" ++msgstr "Velocidad de descarga (Kbit/s)" ++ ++msgid "Enable" ++msgstr "Activar" ++ ++msgid "Half-duplex" ++msgstr "Semi dúplex" ++ ++msgid "Interfaces" ++msgstr "Interfaces" ++ ++msgid "Number of bytes" ++msgstr "Número de bytes" ++ ++msgid "Ports" ++msgstr "Puertos" ++ ++msgid "Protocol" ++msgstr "Protocolo" ++ ++msgid "QoS" ++msgstr "QoS" ++ ++msgid "Quality of Service" ++msgstr "Calidad de Servicio" ++ ++msgid "Service" ++msgstr "Servicio" ++ ++msgid "Source host" ++msgstr "Máquina origen" ++ ++msgid "Target" ++msgstr "Objetivo" ++ ++msgid "Upload speed (kbit/s)" ++msgstr "Velocidad de subida (Kbit/s)" ++ ++msgid "" ++"With QoS you can prioritize " ++"network traffic selected by addresses, ports or services." ++msgstr "" ++"Con QoS puede priorizar el tráfico de la red seleccionando por direcciones, " ++"puertos o servicios." ++ ++msgid "all" ++msgstr "todos" ++ ++msgid "default" ++msgstr "por defecto" ++ ++msgid "express" ++msgstr "exprés" ++ ++msgid "low" ++msgstr "bajo" ++ ++msgid "normal" ++msgstr "normal" ++ ++msgid "priority" ++msgstr "prioritario" ++ ++#~ msgid "Downlink" ++#~ msgstr "Enlace de bajada" ++ ++#~ msgid "Internet Connection" ++#~ msgstr "Conexión a Internet" ++ ++#~ msgid "Uplink" ++#~ msgstr "Enlace de subida" ++ ++#~ msgid "allf" ++#~ msgstr "-- ¿allf? --" ++ ++#~ msgid "qos_connbytes" ++#~ msgstr "-- ¿qos_connbytes? --" ++ ++#~ msgid "Prioritization" ++#~ msgstr "Priorización" ++ ++#~ msgid "source network / source host" ++#~ msgstr "red de origen / host de origen" ++ ++#~ msgid "target network / target host" ++#~ msgstr "red de destino / host de destino" ++ ++#~ msgid "portrange" ++#~ msgstr "rango de puerto" ++ ++#~ msgid "Bytes sent" ++#~ msgstr "Bytes enviados" +diff --git a/feeds/luci/applications/luci-app-qos/po/fr/qos.po b/feeds/luci/applications/luci-app-qos/po/fr/qos.po +new file mode 100644 +index 0000000..a4a81f1 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-qos/po/fr/qos.po +@@ -0,0 +1,97 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Report-Msgid-Bugs-To: \n" ++"POT-Creation-Date: 2010-03-25 22:10+0100\n" ++"PO-Revision-Date: 2012-11-06 16:08+0200\n" ++"Last-Translator: hogsim \n" ++"Language-Team: LANGUAGE \n" ++"Language: fr\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n > 1);\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "Calculate overhead" ++msgstr "Calculer la surcharge" ++ ++msgid "Classification Rules" ++msgstr "Règles de classification" ++ ++msgid "Classification group" ++msgstr "Groupe de classification" ++ ++msgid "Comment" ++msgstr "" ++ ++msgid "Destination host" ++msgstr "Hôte destinataire" ++ ++msgid "Download speed (kbit/s)" ++msgstr "Vitesse de téléchargement (kbit/s)" ++ ++msgid "Enable" ++msgstr "Activer" ++ ++msgid "Half-duplex" ++msgstr "Demi-duplex" ++ ++msgid "Interfaces" ++msgstr "Interfaces" ++ ++msgid "Number of bytes" ++msgstr "Nombre d'octets" ++ ++msgid "Ports" ++msgstr "Ports" ++ ++msgid "Protocol" ++msgstr "Protocole" ++ ++msgid "QoS" ++msgstr "" ++ ++msgid "Quality of Service" ++msgstr "Qualité de service" ++ ++msgid "Service" ++msgstr "Service" ++ ++msgid "Source host" ++msgstr "Hôte source" ++ ++msgid "Target" ++msgstr "Cible" ++ ++msgid "Upload speed (kbit/s)" ++msgstr "Vitesse de téléversement (kbit/s)" ++ ++msgid "" ++"With QoS you can prioritize " ++"network traffic selected by addresses, ports or services." ++msgstr "" ++"Avec la QoS, vous pouvez donner " ++"des priorités au trafic réseau en fonction des adresses, des ports ou des " ++"services concernés." ++ ++msgid "all" ++msgstr "tous" ++ ++msgid "default" ++msgstr "par défaut" ++ ++msgid "express" ++msgstr "express" ++ ++msgid "low" ++msgstr "lent" ++ ++msgid "normal" ++msgstr "normal" ++ ++msgid "priority" ++msgstr "prioritaire" ++ ++#~ msgid "qos_connbytes" ++#~ msgstr "qos_connbytes" +diff --git a/feeds/luci/applications/luci-app-qos/po/he/qos.po b/feeds/luci/applications/luci-app-qos/po/he/qos.po +new file mode 100644 +index 0000000..71c2e3c +--- /dev/null ++++ b/feeds/luci/applications/luci-app-qos/po/he/qos.po +@@ -0,0 +1,91 @@ ++# Generated from applications/luci-qos/luasrc/model/cbi/qos/qos.lua ++# ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Report-Msgid-Bugs-To: \n" ++"POT-Creation-Date: 2010-03-25 22:10+0100\n" ++"PO-Revision-Date: 2010-03-25 22:10+0100\n" ++"Last-Translator: Automatically generated\n" ++"Language-Team: none\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n != 1);\n" ++ ++msgid "Calculate overhead" ++msgstr "" ++ ++msgid "Classification Rules" ++msgstr "" ++ ++msgid "Classification group" ++msgstr "" ++ ++msgid "Comment" ++msgstr "" ++ ++msgid "Destination host" ++msgstr "" ++ ++msgid "Download speed (kbit/s)" ++msgstr "" ++ ++msgid "Enable" ++msgstr "" ++ ++msgid "Half-duplex" ++msgstr "" ++ ++msgid "Interfaces" ++msgstr "" ++ ++msgid "Number of bytes" ++msgstr "" ++ ++msgid "Ports" ++msgstr "" ++ ++msgid "Protocol" ++msgstr "" ++ ++msgid "QoS" ++msgstr "" ++ ++msgid "Quality of Service" ++msgstr "" ++ ++msgid "Service" ++msgstr "" ++ ++msgid "Source host" ++msgstr "" ++ ++msgid "Target" ++msgstr "" ++ ++msgid "Upload speed (kbit/s)" ++msgstr "" ++ ++msgid "" ++"With QoS you can prioritize " ++"network traffic selected by addresses, ports or services." ++msgstr "" ++ ++msgid "all" ++msgstr "" ++ ++msgid "default" ++msgstr "" ++ ++msgid "express" ++msgstr "" ++ ++msgid "low" ++msgstr "" ++ ++msgid "normal" ++msgstr "" ++ ++msgid "priority" ++msgstr "" +diff --git a/feeds/luci/applications/luci-app-qos/po/hu/qos.po b/feeds/luci/applications/luci-app-qos/po/hu/qos.po +new file mode 100644 +index 0000000..d69ff08 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-qos/po/hu/qos.po +@@ -0,0 +1,111 @@ ++# Generated from applications/luci-qos/luasrc/model/cbi/qos/qos.lua ++# ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Report-Msgid-Bugs-To: \n" ++"POT-Creation-Date: 2010-03-25 22:10+0100\n" ++"PO-Revision-Date: 2012-12-30 19:18+0200\n" ++"Last-Translator: romboyco \n" ++"Language-Team: none\n" ++"Language: hu\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n != 1);\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "Calculate overhead" ++msgstr "Többletforgalom számítása" ++ ++msgid "Classification Rules" ++msgstr "Besorolási szabályok" ++ ++msgid "Classification group" ++msgstr "Besorolási csoport" ++ ++msgid "Comment" ++msgstr "" ++ ++msgid "Destination host" ++msgstr "Cél gép" ++ ++msgid "Download speed (kbit/s)" ++msgstr "Letöltési sebesség (kbit/s)" ++ ++msgid "Enable" ++msgstr "Engedélyezés" ++ ++msgid "Half-duplex" ++msgstr "Fél-duplex" ++ ++msgid "Interfaces" ++msgstr "Interfészek" ++ ++msgid "Number of bytes" ++msgstr "Bájtok száma" ++ ++msgid "Ports" ++msgstr "Portok" ++ ++msgid "Protocol" ++msgstr "Protokoll" ++ ++msgid "QoS" ++msgstr "QoS" ++ ++msgid "Quality of Service" ++msgstr "Quality of Service" ++ ++msgid "Service" ++msgstr "Szolgáltatás" ++ ++msgid "Source host" ++msgstr "Forrás gép" ++ ++msgid "Target" ++msgstr "Cél" ++ ++msgid "Upload speed (kbit/s)" ++msgstr "Feltöltési sebesség (kbit/s)" ++ ++msgid "" ++"With QoS you can prioritize " ++"network traffic selected by addresses, ports or services." ++msgstr "" ++"A QoS segítségével beállítható " ++"cím, portok vagy szolgáltatások alapján kiválasztott hálózati forgalom " ++"prioritása." ++ ++msgid "all" ++msgstr "összes" ++ ++msgid "default" ++msgstr "alapértelmezett" ++ ++msgid "express" ++msgstr "sürgÅ‘s" ++ ++msgid "low" ++msgstr "alacsony" ++ ++msgid "normal" ++msgstr "normál" ++ ++msgid "priority" ++msgstr "prioritás" ++ ++#~ msgid "Downlink" ++#~ msgstr "Downlink" ++ ++#~ msgid "Internet Connection" ++#~ msgstr "Internet kapcsolat" ++ ++#~ msgid "Uplink" ++#~ msgstr "Uplink" ++ ++#~ msgid "allf" ++#~ msgstr "allf" ++ ++#~ msgid "qos_connbytes" ++#~ msgstr "qos_connbytes" +diff --git a/feeds/luci/applications/luci-app-qos/po/it/qos.po b/feeds/luci/applications/luci-app-qos/po/it/qos.po +new file mode 100644 +index 0000000..00fb331 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-qos/po/it/qos.po +@@ -0,0 +1,108 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Report-Msgid-Bugs-To: \n" ++"POT-Creation-Date: 2010-03-25 22:10+0100\n" ++"PO-Revision-Date: 2014-07-19 16:26+0200\n" ++"Last-Translator: clagir \n" ++"Language-Team: LANGUAGE \n" ++"Language: it\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n != 1);\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "Calculate overhead" ++msgstr "Calcola l'overhead" ++ ++msgid "Classification Rules" ++msgstr "Regole di classificazione" ++ ++msgid "Classification group" ++msgstr "Gruppo di Priorità" ++ ++msgid "Comment" ++msgstr "Commento" ++ ++msgid "Destination host" ++msgstr "Host di destinazione" ++ ++msgid "Download speed (kbit/s)" ++msgstr "Velocità di download (kbit/s)" ++ ++msgid "Enable" ++msgstr "Abilita" ++ ++msgid "Half-duplex" ++msgstr "Half-duplex" ++ ++msgid "Interfaces" ++msgstr "Interfacce" ++ ++msgid "Number of bytes" ++msgstr "Numeri di bytes" ++ ++msgid "Ports" ++msgstr "Porte" ++ ++msgid "Protocol" ++msgstr "Protocollo" ++ ++msgid "QoS" ++msgstr "QoS" ++ ++msgid "Quality of Service" ++msgstr "Qualità del Servizio" ++ ++msgid "Service" ++msgstr "Servizi" ++ ++msgid "Source host" ++msgstr "Host sorgente" ++ ++msgid "Target" ++msgstr "Target" ++ ++msgid "Upload speed (kbit/s)" ++msgstr "Velocità di upload (kbit/s)" ++ ++msgid "" ++"With QoS you can prioritize " ++"network traffic selected by addresses, ports or services." ++msgstr "" ++"Con QoS puoi dare priorità al " ++"traffico di rete in base ad un ip, una porta o dei servizi." ++ ++msgid "all" ++msgstr "tutti" ++ ++msgid "default" ++msgstr "default" ++ ++msgid "express" ++msgstr "express" ++ ++msgid "low" ++msgstr "basso" ++ ++msgid "normal" ++msgstr "normale" ++ ++msgid "priority" ++msgstr "priorità" ++ ++#~ msgid "Downlink" ++#~ msgstr "Collegamento discendente" ++ ++#~ msgid "Internet Connection" ++#~ msgstr "Connessione Internet" ++ ++#~ msgid "Uplink" ++#~ msgstr "Collegamento ascendente" ++ ++#~ msgid "allf" ++#~ msgstr "allf" ++ ++#~ msgid "qos_connbytes" ++#~ msgstr "qos_connbytes" +diff --git a/feeds/luci/applications/luci-app-qos/po/ja/qos.po b/feeds/luci/applications/luci-app-qos/po/ja/qos.po +new file mode 100644 +index 0000000..857cf5b +--- /dev/null ++++ b/feeds/luci/applications/luci-app-qos/po/ja/qos.po +@@ -0,0 +1,93 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Report-Msgid-Bugs-To: \n" ++"POT-Creation-Date: 2010-03-25 22:10+0100\n" ++"PO-Revision-Date: 2011-10-28 11:02+0200\n" ++"Last-Translator: Kentaro \n" ++"Language-Team: LANGUAGE \n" ++"Language: ja\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=1; plural=0;\n" ++"X-Generator: Pootle 2.0.4\n" ++ ++msgid "Calculate overhead" ++msgstr "オーãƒãƒ¼ãƒ˜ãƒƒãƒ‰ã‚’考慮ã™ã‚‹" ++ ++msgid "Classification Rules" ++msgstr "区分ルール" ++ ++msgid "Classification group" ++msgstr "区分グループ" ++ ++msgid "Comment" ++msgstr "" ++ ++msgid "Destination host" ++msgstr "宛先ホスト" ++ ++msgid "Download speed (kbit/s)" ++msgstr "ダウンロード速度 (kbit/s)" ++ ++msgid "Enable" ++msgstr "有効" ++ ++msgid "Half-duplex" ++msgstr "åŠäºŒé‡" ++ ++msgid "Interfaces" ++msgstr "インターフェース" ++ ++msgid "Number of bytes" ++msgstr "ãƒã‚¤ãƒˆæ•°" ++ ++msgid "Ports" ++msgstr "ãƒãƒ¼ãƒˆ" ++ ++msgid "Protocol" ++msgstr "プロトコル" ++ ++msgid "QoS" ++msgstr "" ++ ++msgid "Quality of Service" ++msgstr "Quality of Service" ++ ++msgid "Service" ++msgstr "サービス" ++ ++msgid "Source host" ++msgstr "é€ä¿¡å…ƒãƒ›ã‚¹ãƒˆ" ++ ++msgid "Target" ++msgstr "対象" ++ ++msgid "Upload speed (kbit/s)" ++msgstr "アップロード速度 (kbit/s)" ++ ++msgid "" ++"With QoS you can prioritize " ++"network traffic selected by addresses, ports or services." ++msgstr "" ++"QoSã¯ã‚¢ãƒ‰ãƒ¬ã‚¹ã€ãƒãƒ¼ãƒˆã€ã‚µãƒ¼ãƒ“スã§åŒº" ++"別ã—ã¦ã€ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ãƒˆãƒ©ãƒ•ã‚£ãƒƒã‚¯ã«å„ªå…ˆåº¦ã‚’付与ã™ã‚‹ã“ã¨ãŒå¯èƒ½ã§ã™ã€‚" ++ ++msgid "all" ++msgstr "å…¨ã¦" ++ ++msgid "default" ++msgstr "標準" ++ ++msgid "express" ++msgstr "高速" ++ ++msgid "low" ++msgstr "低速" ++ ++msgid "normal" ++msgstr "標準" ++ ++msgid "priority" ++msgstr "最優先" +diff --git a/feeds/luci/applications/luci-app-qos/po/ms/qos.po b/feeds/luci/applications/luci-app-qos/po/ms/qos.po +new file mode 100644 +index 0000000..ab30492 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-qos/po/ms/qos.po +@@ -0,0 +1,90 @@ ++# Generated from applications/luci-qos/luasrc/model/cbi/qos/qos.lua ++# ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Report-Msgid-Bugs-To: \n" ++"POT-Creation-Date: 2010-03-25 22:10+0100\n" ++"PO-Revision-Date: 2010-03-25 22:10+0100\n" ++"Last-Translator: Automatically generated\n" ++"Language-Team: none\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++ ++msgid "Calculate overhead" ++msgstr "" ++ ++msgid "Classification Rules" ++msgstr "" ++ ++msgid "Classification group" ++msgstr "" ++ ++msgid "Comment" ++msgstr "" ++ ++msgid "Destination host" ++msgstr "" ++ ++msgid "Download speed (kbit/s)" ++msgstr "" ++ ++msgid "Enable" ++msgstr "" ++ ++msgid "Half-duplex" ++msgstr "" ++ ++msgid "Interfaces" ++msgstr "" ++ ++msgid "Number of bytes" ++msgstr "" ++ ++msgid "Ports" ++msgstr "" ++ ++msgid "Protocol" ++msgstr "" ++ ++msgid "QoS" ++msgstr "" ++ ++msgid "Quality of Service" ++msgstr "" ++ ++msgid "Service" ++msgstr "" ++ ++msgid "Source host" ++msgstr "" ++ ++msgid "Target" ++msgstr "" ++ ++msgid "Upload speed (kbit/s)" ++msgstr "" ++ ++msgid "" ++"With QoS you can prioritize " ++"network traffic selected by addresses, ports or services." ++msgstr "" ++ ++msgid "all" ++msgstr "" ++ ++msgid "default" ++msgstr "" ++ ++msgid "express" ++msgstr "" ++ ++msgid "low" ++msgstr "" ++ ++msgid "normal" ++msgstr "" ++ ++msgid "priority" ++msgstr "" +diff --git a/feeds/luci/applications/luci-app-qos/po/no/qos.po b/feeds/luci/applications/luci-app-qos/po/no/qos.po +new file mode 100644 +index 0000000..a560b0f +--- /dev/null ++++ b/feeds/luci/applications/luci-app-qos/po/no/qos.po +@@ -0,0 +1,106 @@ ++msgid "" ++msgstr "" ++"PO-Revision-Date: 2013-03-21 23:04+0200\n" ++"Last-Translator: protx \n" ++"Language: no\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n != 1);\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "Calculate overhead" ++msgstr "Beregn overhead" ++ ++msgid "Classification Rules" ++msgstr "Klassifisering Regler" ++ ++msgid "Classification group" ++msgstr "Klassifisering gruppe" ++ ++msgid "Comment" ++msgstr "" ++ ++msgid "Destination host" ++msgstr "Destinasjon vert" ++ ++msgid "Download speed (kbit/s)" ++msgstr "Nedlasting hastighet (kbit/s)" ++ ++msgid "Enable" ++msgstr "Aktiver" ++ ++msgid "Half-duplex" ++msgstr "Halv dupleks" ++ ++msgid "Interfaces" ++msgstr "Grensesnitt" ++ ++msgid "Number of bytes" ++msgstr "Antall bytes" ++ ++msgid "Ports" ++msgstr "Porter" ++ ++msgid "Protocol" ++msgstr "Protokoll" ++ ++msgid "QoS" ++msgstr "QoS" ++ ++msgid "Quality of Service" ++msgstr "Quality of Service" ++ ++msgid "Service" ++msgstr "Service" ++ ++msgid "Source host" ++msgstr "Kilde vert" ++ ++msgid "Target" ++msgstr "MÃ¥l" ++ ++msgid "Upload speed (kbit/s)" ++msgstr "Opplasting hastighet (kbit/s)" ++ ++msgid "" ++"With QoS you can prioritize " ++"network traffic selected by addresses, ports or services." ++msgstr "" ++"Med QoS kan du prioritere " ++"nettverkstrafikk valgt av adresser, porter eller tjenester." ++ ++msgid "all" ++msgstr "alle" ++ ++msgid "default" ++msgstr "standard" ++ ++msgid "express" ++msgstr "ekspress" ++ ++msgid "low" ++msgstr "lav" ++ ++msgid "normal" ++msgstr "normal" ++ ++msgid "priority" ++msgstr "prioritet" ++ ++#~ msgid "Downlink" ++#~ msgstr "Nedlinje" ++ ++#~ msgid "Internet Connection" ++#~ msgstr "Internett Tilkobling" ++ ++#~ msgid "Uplink" ++#~ msgstr "Opplinje" ++ ++#~ msgid "allf" ++#~ msgstr "alle" ++ ++#~ msgid "qos_connbytes" ++#~ msgstr "Bytes sendt" ++ ++#~ msgid "Half-Duplex" ++#~ msgstr "Halvdupleks" +diff --git a/feeds/luci/applications/luci-app-qos/po/pl/qos.po b/feeds/luci/applications/luci-app-qos/po/pl/qos.po +new file mode 100644 +index 0000000..7b740c7 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-qos/po/pl/qos.po +@@ -0,0 +1,111 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Report-Msgid-Bugs-To: \n" ++"POT-Creation-Date: 2010-03-25 22:10+0100\n" ++"PO-Revision-Date: 2012-08-31 18:14+0200\n" ++"Last-Translator: obsy \n" ++"Language-Team: LANGUAGE \n" ++"Language: pl\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 " ++"|| n%100>=20) ? 1 : 2);\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "Calculate overhead" ++msgstr "Oblicz narzut" ++ ++msgid "Classification Rules" ++msgstr "ReguÅ‚y klasyfikacji" ++ ++msgid "Classification group" ++msgstr "Grupa klasyfikacji" ++ ++msgid "Comment" ++msgstr "" ++ ++msgid "Destination host" ++msgstr "Host docelowy" ++ ++msgid "Download speed (kbit/s)" ++msgstr "PrÄ™dkość pobierania (kbit/s)" ++ ++msgid "Enable" ++msgstr "WÅ‚Ä…cz" ++ ++msgid "Half-duplex" ++msgstr "Półdupleks" ++ ++msgid "Interfaces" ++msgstr "Interfejsy" ++ ++msgid "Number of bytes" ++msgstr "Ilość bajtów" ++ ++msgid "Ports" ++msgstr "Porty" ++ ++msgid "Protocol" ++msgstr "Protokół" ++ ++msgid "QoS" ++msgstr "QoS" ++ ++msgid "Quality of Service" ++msgstr "Jakość usÅ‚ugi (ang. Quality of Service)" ++ ++msgid "Service" ++msgstr "UsÅ‚uga" ++ ++msgid "Source host" ++msgstr "Host źródÅ‚owy" ++ ++msgid "Target" ++msgstr "Cel" ++ ++msgid "Upload speed (kbit/s)" ++msgstr "PrÄ™dkość wysyÅ‚ania (kbit/s)" ++ ++msgid "" ++"With QoS you can prioritize " ++"network traffic selected by addresses, ports or services." ++msgstr "" ++"Z QoS można ustalać priorytet " ++"ruchu sieciowego na podstawie adresów, portów lub usÅ‚ug." ++ ++msgid "all" ++msgstr "wszystko" ++ ++msgid "default" ++msgstr "domyÅ›lna" ++ ++msgid "express" ++msgstr "ekspresowy" ++ ++msgid "low" ++msgstr "niski" ++ ++msgid "normal" ++msgstr "normalny" ++ ++msgid "priority" ++msgstr "priorytetowy" ++ ++#~ msgid "Downlink" ++#~ msgstr "Ruch przychodzÄ…cy" ++ ++#~ msgid "Internet Connection" ++#~ msgstr "PoÅ‚Ä…czenie Internetowe" ++ ++#~ msgid "Uplink" ++#~ msgstr "Ruch wychodzÄ…cy" ++ ++# JeÅ›li w ogóle jest to gdzieÅ› używane, to i w angielskiej wersji jest bÅ‚Ä…d. W takiej sytuacji należy udawać idiotÄ™. ++#~ msgid "allf" ++#~ msgstr "allf" ++ ++# Patrz - allf. ++#~ msgid "qos_connbytes" ++#~ msgstr "qos_connbytes" +diff --git a/feeds/luci/applications/luci-app-qos/po/pt-br/qos.po b/feeds/luci/applications/luci-app-qos/po/pt-br/qos.po +new file mode 100644 +index 0000000..1ebaea2 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-qos/po/pt-br/qos.po +@@ -0,0 +1,127 @@ ++# qos.po ++# generated from ./applications/luci-qos/luasrc/i18n/qos.en.lua ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Report-Msgid-Bugs-To: \n" ++"POT-Creation-Date: 2010-03-25 22:10+0100\n" ++"PO-Revision-Date: 2014-06-21 19:00+0200\n" ++"Last-Translator: Éder \n" ++"Language-Team: LANGUAGE \n" ++"Language: pt_BR\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n > 1);\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "Calculate overhead" ++msgstr "Calcular overhead" ++ ++msgid "Classification Rules" ++msgstr "Classificação" ++ ++msgid "Classification group" ++msgstr "Classificação" ++ ++# 20140621: edersg: tradução ++msgid "Comment" ++msgstr "Comentário" ++ ++msgid "Destination host" ++msgstr "Endereço de destino" ++ ++msgid "Download speed (kbit/s)" ++msgstr "Velocidade de recebimento (kbit/s)" ++ ++msgid "Enable" ++msgstr "Habilitado" ++ ++msgid "Half-duplex" ++msgstr "Half-duplex" ++ ++msgid "Interfaces" ++msgstr "Interfaces" ++ ++msgid "Number of bytes" ++msgstr "Número de bytes" ++ ++msgid "Ports" ++msgstr "Portas" ++ ++msgid "Protocol" ++msgstr "Prococolo" ++ ++msgid "QoS" ++msgstr "QoS" ++ ++msgid "Quality of Service" ++msgstr "Qualidade de Serviço" ++ ++msgid "Service" ++msgstr "Serviço" ++ ++msgid "Source host" ++msgstr "Endereço de origem" ++ ++msgid "Target" ++msgstr "Alvo" ++ ++msgid "Upload speed (kbit/s)" ++msgstr "Velocidade de envio (kbit/s)" ++ ++msgid "" ++"With QoS you can prioritize " ++"network traffic selected by addresses, ports or services." ++msgstr "" ++"Com QoS, " ++"você pode priorizar o tráfego da rede selecionada por endereços, portas ou " ++"serviços." ++ ++msgid "all" ++msgstr "todos" ++ ++msgid "default" ++msgstr "padrão" ++ ++msgid "express" ++msgstr "expressa" ++ ++msgid "low" ++msgstr "baixa" ++ ++msgid "normal" ++msgstr "normal" ++ ++msgid "priority" ++msgstr "prioritário" ++ ++#~ msgid "Downlink" ++#~ msgstr "Link para download" ++ ++#~ msgid "Internet Connection" ++#~ msgstr "Conexão com a Internet" ++ ++#~ msgid "Uplink" ++#~ msgstr "Link para upload" ++ ++#~ msgid "allf" ++#~ msgstr "allf" ++ ++#~ msgid "qos_connbytes" ++#~ msgstr "qos_connbytes" ++ ++#~ msgid "Prioritization" ++#~ msgstr "Priorização" ++ ++#~ msgid "source network / source host" ++#~ msgstr "rede de origem / host de origem" ++ ++#~ msgid "target network / target host" ++#~ msgstr "rede de destino / host de destino" ++ ++#~ msgid "portrange" ++#~ msgstr "faixa de portas" ++ ++#~ msgid "Bytes sent" ++#~ msgstr "Bytes enviados" +diff --git a/feeds/luci/applications/luci-app-qos/po/pt/qos.po b/feeds/luci/applications/luci-app-qos/po/pt/qos.po +new file mode 100644 +index 0000000..2299a78 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-qos/po/pt/qos.po +@@ -0,0 +1,122 @@ ++# qos.po ++# generated from ./applications/luci-qos/luasrc/i18n/qos.en.lua ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Report-Msgid-Bugs-To: \n" ++"POT-Creation-Date: 2010-03-25 22:10+0100\n" ++"PO-Revision-Date: 2013-05-31 23:49+0200\n" ++"Last-Translator: joao.f.vieira \n" ++"Language-Team: LANGUAGE \n" ++"Language: pt\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n != 1);\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "Calculate overhead" ++msgstr "Calcular Overhead" ++ ++msgid "Classification Rules" ++msgstr "Regras de Classificação" ++ ++msgid "Classification group" ++msgstr "Grupo de Classificação" ++ ++msgid "Comment" ++msgstr "" ++ ++msgid "Destination host" ++msgstr "Host de destino" ++ ++msgid "Download speed (kbit/s)" ++msgstr "Velocidade de Download (kbit/s)" ++ ++msgid "Enable" ++msgstr "Ativar" ++ ++msgid "Half-duplex" ++msgstr "Half-duplex" ++ ++msgid "Interfaces" ++msgstr "Interfaces" ++ ++msgid "Number of bytes" ++msgstr "Número de bytes" ++ ++msgid "Ports" ++msgstr "Portas" ++ ++msgid "Protocol" ++msgstr "Protocolo" ++ ++msgid "QoS" ++msgstr "QoS" ++ ++msgid "Quality of Service" ++msgstr "Qualidade de Serviço" ++ ++msgid "Service" ++msgstr "Serviço" ++ ++msgid "Source host" ++msgstr "Host de origem" ++ ++msgid "Target" ++msgstr "Host de destino" ++ ++msgid "Upload speed (kbit/s)" ++msgstr "Velocidade de Upload (kbit/s)" ++ ++msgid "" ++"With QoS you can prioritize " ++"network traffic selected by addresses, ports or services." ++msgstr "" ++"Com o QoS pode dar prioridade ao " ++"tráfego na rede por endereço, portas ou serviço." ++ ++msgid "all" ++msgstr "todos" ++ ++msgid "default" ++msgstr "Por defeito" ++ ++msgid "express" ++msgstr "expressa" ++ ++msgid "low" ++msgstr "baixa" ++ ++msgid "normal" ++msgstr "normal" ++ ++msgid "priority" ++msgstr "prioridade" ++ ++#~ msgid "Downlink" ++#~ msgstr "Link para download" ++ ++#~ msgid "Internet Connection" ++#~ msgstr "Ligação à Internet" ++ ++#~ msgid "Uplink" ++#~ msgstr "Link para upload" ++ ++#~ msgid "qos_connbytes" ++#~ msgstr "qos_connbytes" ++ ++#~ msgid "Prioritization" ++#~ msgstr "Priorização" ++ ++#~ msgid "source network / source host" ++#~ msgstr "rede de origem / host de origem" ++ ++#~ msgid "target network / target host" ++#~ msgstr "rede de destino / host de destino" ++ ++#~ msgid "portrange" ++#~ msgstr "faixa de portas" ++ ++#~ msgid "Bytes sent" ++#~ msgstr "Bytes enviados" +diff --git a/feeds/luci/applications/luci-app-qos/po/ro/qos.po b/feeds/luci/applications/luci-app-qos/po/ro/qos.po +new file mode 100644 +index 0000000..239c1f8 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-qos/po/ro/qos.po +@@ -0,0 +1,97 @@ ++# Generated from applications/luci-qos/luasrc/model/cbi/qos/qos.lua ++# ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Report-Msgid-Bugs-To: \n" ++"POT-Creation-Date: 2010-03-25 22:10+0100\n" ++"PO-Revision-Date: 2013-09-25 19:25+0200\n" ++"Last-Translator: Mihai \n" ++"Language-Team: none\n" ++"Language: ro\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=3; plural=(n==1 ? 0 : (n==0 || (n%100 > 0 && n%100 < " ++"20)) ? 1 : 2);;\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "Calculate overhead" ++msgstr "" ++ ++msgid "Classification Rules" ++msgstr "" ++ ++msgid "Classification group" ++msgstr "" ++ ++msgid "Comment" ++msgstr "" ++ ++msgid "Destination host" ++msgstr "" ++ ++msgid "Download speed (kbit/s)" ++msgstr "" ++ ++msgid "Enable" ++msgstr "" ++ ++msgid "Half-duplex" ++msgstr "" ++ ++msgid "Interfaces" ++msgstr "Interfete" ++ ++msgid "Number of bytes" ++msgstr "Numarul de bytes" ++ ++msgid "Ports" ++msgstr "Porturi" ++ ++msgid "Protocol" ++msgstr "Protocol" ++ ++msgid "QoS" ++msgstr "QoS" ++ ++msgid "Quality of Service" ++msgstr "Quality of Service" ++ ++msgid "Service" ++msgstr "Serviciu" ++ ++msgid "Source host" ++msgstr "" ++ ++msgid "Target" ++msgstr "" ++ ++msgid "Upload speed (kbit/s)" ++msgstr "" ++ ++msgid "" ++"With QoS you can prioritize " ++"network traffic selected by addresses, ports or services." ++msgstr "" ++ ++msgid "all" ++msgstr "toate" ++ ++msgid "default" ++msgstr "" ++ ++msgid "express" ++msgstr "expres" ++ ++msgid "low" ++msgstr "scazuta" ++ ++msgid "normal" ++msgstr "normala" ++ ++msgid "priority" ++msgstr "ridicata" ++ ++#~ msgid "Internet Connection" ++#~ msgstr "Conexiune internet" +diff --git a/feeds/luci/applications/luci-app-qos/po/ru/qos.po b/feeds/luci/applications/luci-app-qos/po/ru/qos.po +new file mode 100644 +index 0000000..6c36392 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-qos/po/ru/qos.po +@@ -0,0 +1,104 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: LuCI: qos\n" ++"Report-Msgid-Bugs-To: \n" ++"POT-Creation-Date: 2010-03-25 22:10+0100\n" ++"PO-Revision-Date: 2012-08-15 12:02+0300\n" ++"Last-Translator: Roman A. aka BasicXP \n" ++"Language-Team: Russian \n" ++"Language: ru\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%" ++"10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" ++"X-Generator: Pootle 2.0.4\n" ++"X-Poedit-SourceCharset: UTF-8\n" ++ ++msgid "Calculate overhead" ++msgstr "ПодÑчитывать накладные раÑходы" ++ ++msgid "Classification Rules" ++msgstr "Правила клаÑÑификации" ++ ++msgid "Classification group" ++msgstr "КлаÑÑификациÑ" ++ ++msgid "Comment" ++msgstr "" ++ ++msgid "Destination host" ++msgstr "ХоÑÑ‚ назначениÑ" ++ ++msgid "Download speed (kbit/s)" ++msgstr "СкороÑÑ‚ÑŒ загрузки (кбит/Ñ)" ++ ++msgid "Enable" ++msgstr "Включить" ++ ++msgid "Half-duplex" ++msgstr "ПолудуплекÑ" ++ ++msgid "Interfaces" ++msgstr "ИнтерфейÑÑ‹" ++ ++msgid "Number of bytes" ++msgstr "КоличеÑтво байт" ++ ++msgid "Ports" ++msgstr "Порты" ++ ++msgid "Protocol" ++msgstr "Протокол" ++ ++msgid "QoS" ++msgstr "QoS" ++ ++msgid "Quality of Service" ++msgstr "КачеÑтво обÑÐ»ÑƒÐ¶Ð¸Ð²Ð°Ð½Ð¸Ñ (QoS)" ++ ++msgid "Service" ++msgstr "Служба" ++ ++msgid "Source host" ++msgstr "ХоÑÑ‚ иÑточника" ++ ++msgid "Target" ++msgstr "Цель" ++ ++msgid "Upload speed (kbit/s)" ++msgstr "СкороÑÑ‚ÑŒ отдачи (кбит/Ñ)" ++ ++msgid "" ++"With QoS you can prioritize " ++"network traffic selected by addresses, ports or services." ++msgstr "" ++"ИÑÐ¿Ð¾Ð»ÑŒÐ·ÑƒÑ QoS, вы можете " ++"приоритезаровать Ñетевой трафик по адреÑам, портам и ÑервиÑам." ++ ++msgid "all" ++msgstr "вÑе" ++ ++msgid "default" ++msgstr "по умолчанию" ++ ++msgid "express" ++msgstr "ÑкÑпреÑÑ" ++ ++msgid "low" ++msgstr "низкий" ++ ++msgid "normal" ++msgstr "обычный" ++ ++msgid "priority" ++msgstr "приоритетный" ++ ++#~ msgid "Downlink" ++#~ msgstr "ÐиÑходÑщий канал" ++ ++#~ msgid "Internet Connection" ++#~ msgstr "Интернет-Ñоединение" ++ ++#~ msgid "Uplink" ++#~ msgstr "ВоÑходÑщий канал" +diff --git a/feeds/luci/applications/luci-app-qos/po/sk/qos.po b/feeds/luci/applications/luci-app-qos/po/sk/qos.po +new file mode 100644 +index 0000000..102e5a9 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-qos/po/sk/qos.po +@@ -0,0 +1,86 @@ ++msgid "" ++msgstr "" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Last-Translator: Automatically generated\n" ++"Language-Team: none\n" ++"MIME-Version: 1.0\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n" ++ ++msgid "Calculate overhead" ++msgstr "" ++ ++msgid "Classification Rules" ++msgstr "" ++ ++msgid "Classification group" ++msgstr "" ++ ++msgid "Comment" ++msgstr "" ++ ++msgid "Destination host" ++msgstr "" ++ ++msgid "Download speed (kbit/s)" ++msgstr "" ++ ++msgid "Enable" ++msgstr "" ++ ++msgid "Half-duplex" ++msgstr "" ++ ++msgid "Interfaces" ++msgstr "" ++ ++msgid "Number of bytes" ++msgstr "" ++ ++msgid "Ports" ++msgstr "" ++ ++msgid "Protocol" ++msgstr "" ++ ++msgid "QoS" ++msgstr "" ++ ++msgid "Quality of Service" ++msgstr "" ++ ++msgid "Service" ++msgstr "" ++ ++msgid "Source host" ++msgstr "" ++ ++msgid "Target" ++msgstr "" ++ ++msgid "Upload speed (kbit/s)" ++msgstr "" ++ ++msgid "" ++"With QoS you can prioritize " ++"network traffic selected by addresses, ports or services." ++msgstr "" ++ ++msgid "all" ++msgstr "" ++ ++msgid "default" ++msgstr "" ++ ++msgid "express" ++msgstr "" ++ ++msgid "low" ++msgstr "" ++ ++msgid "normal" ++msgstr "" ++ ++msgid "priority" ++msgstr "" +diff --git a/feeds/luci/applications/luci-app-qos/po/sv/qos.po b/feeds/luci/applications/luci-app-qos/po/sv/qos.po +new file mode 100644 +index 0000000..44f8a35 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-qos/po/sv/qos.po +@@ -0,0 +1,87 @@ ++msgid "" ++msgstr "" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Last-Translator: Automatically generated\n" ++"Language-Team: none\n" ++"Language: sv\n" ++"MIME-Version: 1.0\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n != 1);\n" ++ ++msgid "Calculate overhead" ++msgstr "" ++ ++msgid "Classification Rules" ++msgstr "" ++ ++msgid "Classification group" ++msgstr "" ++ ++msgid "Comment" ++msgstr "" ++ ++msgid "Destination host" ++msgstr "" ++ ++msgid "Download speed (kbit/s)" ++msgstr "" ++ ++msgid "Enable" ++msgstr "" ++ ++msgid "Half-duplex" ++msgstr "" ++ ++msgid "Interfaces" ++msgstr "" ++ ++msgid "Number of bytes" ++msgstr "" ++ ++msgid "Ports" ++msgstr "" ++ ++msgid "Protocol" ++msgstr "" ++ ++msgid "QoS" ++msgstr "" ++ ++msgid "Quality of Service" ++msgstr "" ++ ++msgid "Service" ++msgstr "" ++ ++msgid "Source host" ++msgstr "" ++ ++msgid "Target" ++msgstr "" ++ ++msgid "Upload speed (kbit/s)" ++msgstr "" ++ ++msgid "" ++"With QoS you can prioritize " ++"network traffic selected by addresses, ports or services." ++msgstr "" ++ ++msgid "all" ++msgstr "" ++ ++msgid "default" ++msgstr "" ++ ++msgid "express" ++msgstr "" ++ ++msgid "low" ++msgstr "" ++ ++msgid "normal" ++msgstr "" ++ ++msgid "priority" ++msgstr "" +diff --git a/feeds/luci/applications/luci-app-qos/po/templates/qos.pot b/feeds/luci/applications/luci-app-qos/po/templates/qos.pot +new file mode 100644 +index 0000000..26ea8f7 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-qos/po/templates/qos.pot +@@ -0,0 +1,79 @@ ++msgid "" ++msgstr "Content-Type: text/plain; charset=UTF-8" ++ ++msgid "Calculate overhead" ++msgstr "" ++ ++msgid "Classification Rules" ++msgstr "" ++ ++msgid "Classification group" ++msgstr "" ++ ++msgid "Comment" ++msgstr "" ++ ++msgid "Destination host" ++msgstr "" ++ ++msgid "Download speed (kbit/s)" ++msgstr "" ++ ++msgid "Enable" ++msgstr "" ++ ++msgid "Half-duplex" ++msgstr "" ++ ++msgid "Interfaces" ++msgstr "" ++ ++msgid "Number of bytes" ++msgstr "" ++ ++msgid "Ports" ++msgstr "" ++ ++msgid "Protocol" ++msgstr "" ++ ++msgid "QoS" ++msgstr "" ++ ++msgid "Quality of Service" ++msgstr "" ++ ++msgid "Service" ++msgstr "" ++ ++msgid "Source host" ++msgstr "" ++ ++msgid "Target" ++msgstr "" ++ ++msgid "Upload speed (kbit/s)" ++msgstr "" ++ ++msgid "" ++"With QoS you can prioritize " ++"network traffic selected by addresses, ports or services." ++msgstr "" ++ ++msgid "all" ++msgstr "" ++ ++msgid "default" ++msgstr "" ++ ++msgid "express" ++msgstr "" ++ ++msgid "low" ++msgstr "" ++ ++msgid "normal" ++msgstr "" ++ ++msgid "priority" ++msgstr "" +diff --git a/feeds/luci/applications/luci-app-qos/po/tr/qos.po b/feeds/luci/applications/luci-app-qos/po/tr/qos.po +new file mode 100644 +index 0000000..74647be +--- /dev/null ++++ b/feeds/luci/applications/luci-app-qos/po/tr/qos.po +@@ -0,0 +1,91 @@ ++# Generated from applications/luci-qos/luasrc/model/cbi/qos/qos.lua ++# ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Report-Msgid-Bugs-To: \n" ++"POT-Creation-Date: 2010-03-25 22:10+0100\n" ++"PO-Revision-Date: 2010-03-25 22:10+0100\n" ++"Last-Translator: Automatically generated\n" ++"Language-Team: none\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=1; plural=0;\n" ++ ++msgid "Calculate overhead" ++msgstr "" ++ ++msgid "Classification Rules" ++msgstr "" ++ ++msgid "Classification group" ++msgstr "" ++ ++msgid "Comment" ++msgstr "" ++ ++msgid "Destination host" ++msgstr "" ++ ++msgid "Download speed (kbit/s)" ++msgstr "" ++ ++msgid "Enable" ++msgstr "" ++ ++msgid "Half-duplex" ++msgstr "" ++ ++msgid "Interfaces" ++msgstr "" ++ ++msgid "Number of bytes" ++msgstr "" ++ ++msgid "Ports" ++msgstr "" ++ ++msgid "Protocol" ++msgstr "" ++ ++msgid "QoS" ++msgstr "" ++ ++msgid "Quality of Service" ++msgstr "" ++ ++msgid "Service" ++msgstr "" ++ ++msgid "Source host" ++msgstr "" ++ ++msgid "Target" ++msgstr "" ++ ++msgid "Upload speed (kbit/s)" ++msgstr "" ++ ++msgid "" ++"With QoS you can prioritize " ++"network traffic selected by addresses, ports or services." ++msgstr "" ++ ++msgid "all" ++msgstr "" ++ ++msgid "default" ++msgstr "" ++ ++msgid "express" ++msgstr "" ++ ++msgid "low" ++msgstr "" ++ ++msgid "normal" ++msgstr "" ++ ++msgid "priority" ++msgstr "" +diff --git a/feeds/luci/applications/luci-app-qos/po/uk/qos.po b/feeds/luci/applications/luci-app-qos/po/uk/qos.po +new file mode 100644 +index 0000000..d48100b +--- /dev/null ++++ b/feeds/luci/applications/luci-app-qos/po/uk/qos.po +@@ -0,0 +1,110 @@ ++# Generated from applications/luci-qos/luasrc/model/cbi/qos/qos.lua ++# ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Report-Msgid-Bugs-To: \n" ++"POT-Creation-Date: 2010-03-25 22:10+0100\n" ++"PO-Revision-Date: 2013-08-13 15:27+0200\n" ++"Last-Translator: zubr_139 \n" ++"Language-Team: none\n" ++"Language: uk\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%" ++"10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "Calculate overhead" ++msgstr "Розраховувати додаткові витрати" ++ ++msgid "Classification Rules" ++msgstr "Правила клаÑифікації" ++ ++msgid "Classification group" ++msgstr "КлаÑифікаційна група" ++ ++msgid "Comment" ++msgstr "" ++ ++msgid "Destination host" ++msgstr "Вузол призначеннÑ" ++ ++msgid "Download speed (kbit/s)" ++msgstr "ШвидкіÑÑ‚ÑŒ Ð·Ð°Ð²Ð°Ð½Ñ‚Ð°Ð¶ÐµÐ½Ð½Ñ (Кбіт/Ñ)" ++ ++msgid "Enable" ++msgstr "Увімкнути" ++ ++msgid "Half-duplex" ++msgstr "ÐапівдуплекÑ" ++ ++msgid "Interfaces" ++msgstr "ІнтерфейÑи" ++ ++msgid "Number of bytes" ++msgstr "КількіÑÑ‚ÑŒ байт" ++ ++msgid "Ports" ++msgstr "Порти" ++ ++msgid "Protocol" ++msgstr "Протокол" ++ ++msgid "QoS" ++msgstr "QoS" ++ ++msgid "Quality of Service" ++msgstr "ЯкіÑÑ‚ÑŒ обÑÐ»ÑƒÐ³Ð¾Ð²ÑƒÐ²Ð°Ð½Ð½Ñ (QoS)" ++ ++msgid "Service" ++msgstr "СервіÑ" ++ ++msgid "Source host" ++msgstr "Вихідний вузол" ++ ++msgid "Target" ++msgstr "Мета" ++ ++msgid "Upload speed (kbit/s)" ++msgstr "ШвидкіÑÑ‚ÑŒ Ð²Ñ–Ð´Ð²Ð°Ð½Ñ‚Ð°Ð¶ÐµÐ½Ð½Ñ (Кбіт/Ñ)" ++ ++msgid "" ++"With QoS you can prioritize " ++"network traffic selected by addresses, ports or services." ++msgstr "" ++"ВикориÑтовуючи фунцію QoS можна визначити пріоритети мережевого трафіку " ++"Ð´Ð»Ñ Ð¿ÐµÐ²Ð½Ð¸Ñ… адреÑ, портів або ÑервіÑів." ++ ++msgid "all" ++msgstr "уÑÑ–" ++ ++msgid "default" ++msgstr "типова" ++ ++msgid "express" ++msgstr "екÑпреÑ" ++ ++msgid "low" ++msgstr "низький" ++ ++msgid "normal" ++msgstr "звичайний" ++ ++msgid "priority" ++msgstr "пріоритетний" ++ ++#~ msgid "Downlink" ++#~ msgstr "Ðизхідний канал" ++ ++#~ msgid "Internet Connection" ++#~ msgstr "З'Ñ”Ð´Ð½Ð°Ð½Ð½Ñ Ð· інтернетом" ++ ++#~ msgid "Uplink" ++#~ msgstr "ВиÑхідний канал" ++ ++#, fuzzy ++#~ msgid "allf" ++#~ msgstr "додаткова функціÑ" +diff --git a/feeds/luci/applications/luci-app-qos/po/vi/qos.po b/feeds/luci/applications/luci-app-qos/po/vi/qos.po +new file mode 100644 +index 0000000..8249272 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-qos/po/vi/qos.po +@@ -0,0 +1,122 @@ ++# qos.pot ++# generated from ./applications/luci-qos/luasrc/i18n/qos.en.lua ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Report-Msgid-Bugs-To: \n" ++"POT-Creation-Date: 2010-03-25 22:10+0100\n" ++"PO-Revision-Date: 2009-08-13 03:56+0200\n" ++"Last-Translator: Hong Phuc Dang \n" ++"Language-Team: LANGUAGE \n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"X-Generator: Pootle 1.1.0\n" ++ ++#, fuzzy ++msgid "Calculate overhead" ++msgstr "Tính toán tổng quát" ++ ++#, fuzzy ++msgid "Classification Rules" ++msgstr "Phân loại" ++ ++#, fuzzy ++msgid "Classification group" ++msgstr "Phân loại" ++ ++msgid "Comment" ++msgstr "" ++ ++msgid "Destination host" ++msgstr "" ++ ++msgid "Download speed (kbit/s)" ++msgstr "" ++ ++msgid "Enable" ++msgstr "" ++ ++#, fuzzy ++msgid "Half-duplex" ++msgstr "Half-Duplex" ++ ++msgid "Interfaces" ++msgstr "" ++ ++msgid "Number of bytes" ++msgstr "" ++ ++#, fuzzy ++msgid "Ports" ++msgstr "Ưu tiên" ++ ++msgid "Protocol" ++msgstr "" ++ ++msgid "QoS" ++msgstr "" ++ ++msgid "Quality of Service" ++msgstr "Chất lượng dịch vụ " ++ ++msgid "Service" ++msgstr "" ++ ++#, fuzzy ++msgid "Source host" ++msgstr "Äịa chỉ nguồn" ++ ++#, fuzzy ++msgid "Target" ++msgstr "Äịa chỉ mục tiêu" ++ ++msgid "Upload speed (kbit/s)" ++msgstr "" ++ ++#, fuzzy ++msgid "" ++"With QoS you can prioritize " ++"network traffic selected by addresses, ports or services." ++msgstr "" ++"Vá»›i QoS, bạn có thể Æ°u tiên cho mạng lÆ°á»›i giao thông được chá»n bởi địa chỉ, " ++"cổng hay dịch vụ." ++ ++msgid "all" ++msgstr "" ++ ++msgid "default" ++msgstr "" ++ ++msgid "express" ++msgstr "cấp tốc" ++ ++msgid "low" ++msgstr "thấp" ++ ++msgid "normal" ++msgstr "bình thÆ°á»ng" ++ ++msgid "priority" ++msgstr "Æ°u tiên" ++ ++#~ msgid "Downlink" ++#~ msgstr "Downlink" ++ ++#~ msgid "Uplink" ++#~ msgstr "Uplink" ++ ++#~ msgid "Prioritization" ++#~ msgstr "Quá trình Æ°u tiên" ++ ++#~ msgid "source network / source host" ++#~ msgstr "nguồn mạng/ nguồn host" ++ ++#~ msgid "target network / target host" ++#~ msgstr "Mục tiêu mạng/ mục tiêu host" ++ ++#~ msgid "portrange" ++#~ msgstr "portrange" ++ ++#~ msgid "Bytes sent" ++#~ msgstr "Bytes đã gá»­i" +diff --git a/feeds/luci/applications/luci-app-qos/po/zh-cn/qos.po b/feeds/luci/applications/luci-app-qos/po/zh-cn/qos.po +new file mode 100644 +index 0000000..92ff7d0 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-qos/po/zh-cn/qos.po +@@ -0,0 +1,106 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: LuCi Chinese Translation\n" ++"Report-Msgid-Bugs-To: \n" ++"POT-Creation-Date: 2010-03-25 22:10+0100\n" ++"PO-Revision-Date: 2014-06-22 14:33+0200\n" ++"Last-Translator: phantasm131 \n" ++"Language-Team: QQ Group 75543259\n" ++"Language: zh_CN\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=1; plural=0;\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "Calculate overhead" ++msgstr "计算开销" ++ ++msgid "Classification Rules" ++msgstr "分类规则" ++ ++msgid "Classification group" ++msgstr "分类组" ++ ++msgid "Comment" ++msgstr "注解" ++ ++msgid "Destination host" ++msgstr "目的主机" ++ ++msgid "Download speed (kbit/s)" ++msgstr "下载速度 (kbit/s)" ++ ++msgid "Enable" ++msgstr "å¼€å¯" ++ ++msgid "Half-duplex" ++msgstr "åŠåŒå·¥" ++ ++msgid "Interfaces" ++msgstr "接å£" ++ ++msgid "Number of bytes" ++msgstr "字节数" ++ ++msgid "Ports" ++msgstr "端å£" ++ ++msgid "Protocol" ++msgstr "åè®®" ++ ++msgid "QoS" ++msgstr "QoS" ++ ++msgid "Quality of Service" ++msgstr "QOSæœåŠ¡" ++ ++msgid "Service" ++msgstr "æœåŠ¡" ++ ++msgid "Source host" ++msgstr "æºä¸»æœº" ++ ++msgid "Target" ++msgstr "目标" ++ ++msgid "Upload speed (kbit/s)" ++msgstr "上传速度 (kbit/s)" ++ ++msgid "" ++"With QoS you can prioritize " ++"network traffic selected by addresses, ports or services." ++msgstr "æ ¹æ®ç½‘络地å€ã€ç«¯å£æˆ–æœåŠ¡ï¼Œç»™æµé‡æ•°æ®åŒ…排åºã€‚" ++ ++msgid "all" ++msgstr "全部" ++ ++msgid "default" ++msgstr "默认" ++ ++msgid "express" ++msgstr "高" ++ ++msgid "low" ++msgstr "低" ++ ++msgid "normal" ++msgstr "普通" ++ ++msgid "priority" ++msgstr "最高" ++ ++#~ msgid "Downlink" ++#~ msgstr "下行" ++ ++#~ msgid "Internet Connection" ++#~ msgstr "Internet连接" ++ ++#~ msgid "Uplink" ++#~ msgstr "上行" ++ ++#~ msgid "allf" ++#~ msgstr "全部" ++ ++#~ msgid "qos_connbytes" ++#~ msgstr "Qos连接字节数" +diff --git a/feeds/luci/applications/luci-app-qos/po/zh-tw/qos.po b/feeds/luci/applications/luci-app-qos/po/zh-tw/qos.po +new file mode 100644 +index 0000000..5cc338b +--- /dev/null ++++ b/feeds/luci/applications/luci-app-qos/po/zh-tw/qos.po +@@ -0,0 +1,106 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"PO-Revision-Date: 2014-05-21 10:36+0200\n" ++"Last-Translator: omnistack \n" ++"Language-Team: none\n" ++"Language: zh_TW\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=1; plural=0;\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "Calculate overhead" ++msgstr "æµé‡è¨ˆç®—" ++ ++msgid "Classification Rules" ++msgstr "分類è¦å‰‡" ++ ++msgid "Classification group" ++msgstr "分組" ++ ++msgid "Comment" ++msgstr "" ++ ++msgid "Destination host" ++msgstr "目的主機" ++ ++msgid "Download speed (kbit/s)" ++msgstr "下載速度(kbit/s)" ++ ++msgid "Enable" ++msgstr "啓用" ++ ++msgid "Half-duplex" ++msgstr "åŠé›™å·¥" ++ ++msgid "Interfaces" ++msgstr "ç•Œé¢" ++ ++msgid "Number of bytes" ++msgstr "ä½å…ƒæ•¸" ++ ++msgid "Ports" ++msgstr "埠號" ++ ++msgid "Protocol" ++msgstr "å”定" ++ ++msgid "QoS" ++msgstr "先進先出頻寬管ç†" ++ ++msgid "Quality of Service" ++msgstr "連線å“質æœå‹™" ++ ++msgid "Service" ++msgstr "æœå‹™" ++ ++msgid "Source host" ++msgstr "來æºä¸»æ©Ÿ" ++ ++msgid "Target" ++msgstr "目的地" ++ ++msgid "Upload speed (kbit/s)" ++msgstr "上傳速度(kbit/s)" ++ ++msgid "" ++"With QoS you can prioritize " ++"network traffic selected by addresses, ports or services." ++msgstr "" ++"有了 QoS ä½ å¯ä»¥ç”¨ä½å€ã€åŸ è™Ÿæˆ–者æœå‹™" ++"來排優先權." ++ ++msgid "all" ++msgstr "通用優先權" ++ ++msgid "default" ++msgstr "é è¨­å€¼" ++ ++msgid "express" ++msgstr "高優先權" ++ ++msgid "low" ++msgstr "低優先權" ++ ++msgid "normal" ++msgstr "一般優先權" ++ ++msgid "priority" ++msgstr "優先權" ++ ++#~ msgid "Downlink" ++#~ msgstr "下載" ++ ++#~ msgid "Internet Connection" ++#~ msgstr "網際網路連線" ++ ++#~ msgid "Uplink" ++#~ msgstr "上傳" ++ ++#~ msgid "allf" ++#~ msgstr "ç¨ä¸€ç„¡äºŒ" ++ ++#~ msgid "qos_connbytes" ++#~ msgstr "QoS連線ä½å…ƒæ•¸" +diff --git a/feeds/luci/applications/luci-app-radicale/Makefile b/feeds/luci/applications/luci-app-radicale/Makefile +new file mode 100644 +index 0000000..960618d +--- /dev/null ++++ b/feeds/luci/applications/luci-app-radicale/Makefile +@@ -0,0 +1,41 @@ ++# ++# Copyright (C) 2008-2015 The LuCI Team ++# ++# This is free software, licensed under the Apache License, Version 2.0 . ++# ++ ++include $(TOPDIR)/rules.mk ++ ++PKG_NAME:=luci-app-radicale ++ ++# Version == major.minor.patch ++# increase "minor" on new functionality and "patch" on patches/optimization ++PKG_VERSION:=1.0.1 ++ ++# Release == build ++# increase on changes of translation files ++PKG_RELEASE:=1 ++ ++PKG_LICENSE:=Apache-2.0 ++PKG_MAINTAINER:=Christian Schoenebeck ++ ++# LuCI specific settings ++LUCI_TITLE:=LuCI Support for Radicale CardDAV/CalDAV ++LUCI_DEPENDS:=+luci-mod-admin-full ++LUCI_PKGARCH:=all ++ ++define Package/$(PKG_NAME)/config ++# shown in make menuconfig ++help ++ $(LUCI_TITLE) ++ . ++ !!! Package "radicale-py2" or "radicale-py3" needs to be !!! ++ !!! installed sepearatly. There is no buildin dependency set !!! ++ . ++ Version: $(PKG_VERSION)-$(PKG_RELEASE) ++ $(PKG_MAINTAINER) ++endef ++ ++include $(TOPDIR)/feeds/luci/luci.mk ++ ++# call BuildPackage - OpenWrt buildroot signature +diff --git a/feeds/luci/applications/luci-app-radicale/luasrc/controller/radicale.lua b/feeds/luci/applications/luci-app-radicale/luasrc/controller/radicale.lua +new file mode 100644 +index 0000000..d384b00 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-radicale/luasrc/controller/radicale.lua +@@ -0,0 +1,195 @@ ++-- Copyright 2014 Christian Schoenebeck ++-- Licensed under the Apache License, Version 2.0 ++ ++module("luci.controller.radicale", package.seeall) ++ ++local NX = require("nixio") ++local NXFS = require("nixio.fs") ++local DISP = require "luci.dispatcher" ++local HTTP = require("luci.http") ++local I18N = require("luci.i18n") -- not globally avalible here ++local UTIL = require("luci.util") ++local SYS = require("luci.sys") ++ ++function index() ++ entry( {"admin", "services", "radicale"}, alias("admin", "services", "radicale", "edit"), _("CalDAV/CardDAV"), 58) ++ entry( {"admin", "services", "radicale", "edit"}, cbi("radicale") ).leaf = true ++ entry( {"admin", "services", "radicale", "logview"}, call("_logread") ).leaf = true ++ entry( {"admin", "services", "radicale", "startstop"}, call("_startstop") ).leaf = true ++ entry( {"admin", "services", "radicale", "status"}, call("_status") ).leaf = true ++end ++ ++-- called by XHR.get from detail_logview.htm ++function _logread() ++ -- read application settings ++ local uci = UCI.cursor() ++ local logfile = uci:get("radicale", "radicale", "logfile") or "/var/log/radicale" ++ uci:unload("radicale") ++ ++ local ldata=NXFS.readfile(logfile) ++ if not ldata or #ldata == 0 then ++ ldata="_nodata_" ++ end ++ HTTP.write(ldata) ++end ++ ++-- called by XHR.get from detail_startstop.htm ++function _startstop() ++ local pid = get_pid() ++ if pid > 0 then ++ SYS.call("/etc/init.d/radicale stop") ++ NX.nanosleep(1) -- sleep a second ++ if NX.kill(pid, 0) then -- still running ++ NX.kill(pid, 9) -- send SIGKILL ++ end ++ pid = 0 ++ else ++ SYS.call("/etc/init.d/radicale start") ++ NX.nanosleep(1) -- sleep a second ++ pid = get_pid() ++ if pid > 0 and not NX.kill(pid, 0) then ++ pid = 0 -- process did not start ++ end ++ end ++ HTTP.write(tostring(pid)) -- HTTP needs string not number ++end ++ ++-- called by XHR.poll from detail_startstop.htm ++function _status() ++ local pid = get_pid() ++ HTTP.write(tostring(pid)) -- HTTP needs string not number ++end ++ ++-- Application / Service specific information functions ######################## ++function luci_app_name() ++ return "luci-app-radicale" ++end ++ ++function service_name() ++ return "radicale" ++end ++function service_required() ++ return "0.10-1" ++end ++function service_installed() ++ local v = ipkg_ver_installed("radicale-py2") ++ if not v or #v == 0 then v = ipkg_ver_installed("radicale-py3") end ++ if not v or #v == 0 then v = "0" end ++ return v ++end ++function service_ok() ++ return ipkg_ver_compare(service_installed(),">=",service_required()) ++end ++ ++function app_title_main() ++ return [[
    ]] ++ .. I18N.translate("Radicale CalDAV/CardDAV Server") ++end ++function app_title_back() ++ return [[]] ++ .. I18N.translate("Radicale CalDAV/CardDAV Server") ++end ++function app_description() ++ return I18N.translate("The Radicale Project is a complete CalDAV (calendar) and CardDAV (contact) server solution.") .. [[
    ]] ++ .. I18N.translate("Calendars and address books are available for both local and remote access, possibly limited through authentication policies.") .. [[
    ]] ++ .. I18N.translate("They can be viewed and edited by calendar and contact clients on mobile phones or computers.") ++end ++ ++-- other multiused functions ################################################### ++ ++--return pid of running process ++function get_pid() ++ return tonumber(SYS.exec([[ps | grep "[p]ython.*[r]adicale" 2>/dev/null | awk '{print $1}']])) or 0 ++end ++ ++-- compare versions using "<=" "<" ">" ">=" "=" "<<" ">>" ++function ipkg_ver_compare(ver1, comp, ver2) ++ if not ver1 or not ver2 ++ or not comp or not (#comp > 0) then return nil end ++ -- correct compare string ++ if comp == "<>" or comp == "><" or comp == "!=" or comp == "~=" then comp = "~=" ++ elseif comp == "<=" or comp == "<" or comp == "=<" then comp = "<=" ++ elseif comp == ">=" or comp == ">" or comp == "=>" then comp = ">=" ++ elseif comp == "=" or comp == "==" then comp = "==" ++ elseif comp == "<<" then comp = "<" ++ elseif comp == ">>" then comp = ">" ++ else return nil end ++ ++ local av1 = UTIL.split(ver1, "[%.%-]", nil, true) ++ local av2 = UTIL.split(ver2, "[%.%-]", nil, true) ++ ++ for i = 1, math.max(table.getn(av1),table.getn(av2)), 1 do ++ local s1 = av1[i] or "" ++ local s2 = av2[i] or "" ++ ++ -- first "not equal" found return true ++ if comp == "~=" and (s1 ~= s2) then return true end ++ -- first "lower" found return true ++ if (comp == "<" or comp == "<=") and (s1 < s2) then return true end ++ -- first "greater" found return true ++ if (comp == ">" or comp == ">=") and (s1 > s2) then return true end ++ -- not equal then return false ++ if (s1 ~= s2) then return false end ++ end ++ ++ -- all equal and not compare greater or lower then true ++ return not (comp == "<" or comp == ">") ++end ++ ++-- read version information for given package if installed ++function ipkg_ver_installed(pkg) ++ local version = "" ++ local control = io.open("/usr/lib/opkg/info/%s.control" % pkg, "r") ++ if control then ++ local ln ++ repeat ++ ln = control:read("*l") ++ if ln and ln:match("^Version: ") then ++ version = ln:gsub("^Version: ", "") ++ break ++ end ++ until not ln ++ control:close() ++ end ++ return version ++end ++ ++-- replacement of build-in Flag.parse of cbi.lua ++-- modified to mark section as changed if value changes ++-- current parse did not do this, but it is done AbstaractValue.parse() ++function flag_parse(self, section) ++ local fexists = self.map:formvalue( ++ luci.cbi.FEXIST_PREFIX .. self.config .. "." .. section .. "." .. self.option) ++ ++ if fexists then ++ local fvalue = self:formvalue(section) and self.enabled or self.disabled ++ local cvalue = self:cfgvalue(section) ++ if fvalue ~= self.default or (not self.optional and not self.rmempty) then ++ self:write(section, fvalue) ++ else ++ self:remove(section) ++ end ++ if (fvalue ~= cvalue) then self.section.changed = true end ++ else ++ self:remove(section) ++ self.section.changed = true ++ end ++end +diff --git a/feeds/luci/applications/luci-app-radicale/luasrc/model/cbi/radicale.lua b/feeds/luci/applications/luci-app-radicale/luasrc/model/cbi/radicale.lua +new file mode 100644 +index 0000000..8abb688 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-radicale/luasrc/model/cbi/radicale.lua +@@ -0,0 +1,748 @@ ++-- Copyright 2015 Christian Schoenebeck ++-- Licensed under the Apache License, Version 2.0 ++ ++local NXFS = require("nixio.fs") ++local DISP = require("luci.dispatcher") ++local DTYP = require("luci.cbi.datatypes") ++local HTTP = require("luci.http") ++local UTIL = require("luci.util") ++local UCI = require("luci.model.uci") ++local SYS = require("luci.sys") ++local TOOLS = require("luci.controller.radicale") -- this application's controller and multiused functions ++ ++-- ################################################################################################# ++-- takeover arguments if any -- ################################################ ++-- then show/edit selected file ++if arg[1] then ++ local argument = arg[1] ++ local filename = "" ++ ++ -- SimpleForm ------------------------------------------------ ++ local ft = SimpleForm("_text") ++ ft.title = TOOLS.app_title_back() ++ ft.description = TOOLS.app_description() ++ ft.redirect = DISP.build_url("admin", "services", "radicale") .. "#cbi-radicale-" .. argument ++ if argument == "logger" then ++ ft.reset = false ++ ft.submit = translate("Reload") ++ local uci = UCI.cursor() ++ filename = uci:get("radicale", "logger", "file_path") or "/var/log/radicale" ++ uci:unload("radicale") ++ filename = filename .. "/radicale" ++ elseif argument == "auth" then ++ ft.submit = translate("Save") ++ filename = "/etc/radicale/users" ++ elseif argument == "rights" then ++ ft.submit = translate("Save") ++ filename = "/etc/radicale/rights" ++ else ++ error("Invalid argument given as section") ++ end ++ if argument ~= "logger" and not NXFS.access(filename) then ++ NXFS.writefile(filename, "") ++ end ++ ++ -- SimpleSection --------------------------------------------- ++ local fs = ft:section(SimpleSection) ++ if argument == "logger" then ++ fs.title = translate("Log-file Viewer") ++ fs.description = translate("Please press [Reload] button below to reread the file.") ++ elseif argument == "auth" then ++ fs.title = translate("Authentication") ++ fs.description = translate("Place here the 'user:password' pairs for your users which should have access to Radicale.") ++ .. [[
    ]] ++ .. translate("Keep in mind to use the correct hashing algorithm !") ++ .. [[]] ++ else -- rights ++ fs.title = translate("Rights") ++ fs.description = translate("Authentication login is matched against the 'user' key, " ++ .. "and collection's path is matched against the 'collection' key.") .. " " ++ .. translate("You can use Python's ConfigParser interpolation values %(login)s and %(path)s.") .. " " ++ .. translate("You can also get groups from the user regex in the collection with {0}, {1}, etc.") ++ .. [[
    ]] ++ .. translate("For example, for the 'user' key, '.+' means 'authenticated user'" .. " " ++ .. "and '.*' means 'anybody' (including anonymous users).") ++ .. [[
    ]] ++ .. translate("Section names are only used for naming the rule.") ++ .. [[
    ]] ++ .. translate("Leading or ending slashes are trimmed from collection's path.") ++ end ++ ++ -- TextValue ------------------------------------------------- ++ local tt = fs:option(TextValue, "_textvalue") ++ tt.rmempty = true ++ if argument == "logger" then ++ tt.readonly = true ++ tt.rows = 30 ++ function tt.write() ++ HTTP.redirect(DISP.build_url("admin", "services", "radicale", "edit", argument)) ++ end ++ else ++ tt.rows = 15 ++ function tt.write(self, section, value) ++ if not value then value = "" end ++ NXFS.writefile(filename, value:gsub("\r\n", "\n")) ++ return true --HTTP.redirect(DISP.build_url("admin", "services", "radicale", "edit") .. "#cbi-radicale-" .. argument) ++ end ++ end ++ ++ function tt.cfgvalue() ++ return NXFS.readfile(filename) or ++ string.format(translate("File '%s' not found !"), filename) ++ end ++ ++ return ft ++ ++end ++ ++-- ################################################################################################# ++-- Error handling if not installed or wrong version -- ######################### ++if not TOOLS.service_ok() then ++ local f = SimpleForm("_no_config") ++ f.title = TOOLS.app_title_main() ++ f.description = TOOLS.app_description() ++ f.submit = false ++ f.reset = false ++ ++ local s = f:section(SimpleSection) ++ ++ local v = s:option(DummyValue, "_update_needed") ++ v.rawhtml = true ++ if TOOLS.service_installed() == "0" then ++ v.value = [[


        ]] ++ .. translate("Software package '" .. TOOLS.service_name() .. "' is not installed.") ++ .. [[

          ]] ++ .. translate("required") .. [[: ]] .. TOOLS.service_name() .. [[ ]] .. TOOLS.service_required() ++ .. [[

        ]] ++ .. [[
    ]] ++ .. translate("Please install current version !") ++ .. [[
     

    ]] ++ else ++ v.value = [[


        ]] ++ .. translate("Software package '" .. TOOLS.service_name() .. "' is outdated.") ++ .. [[

          ]] ++ .. translate("installed") .. [[: ]] .. TOOLS.service_name() .. [[ ]] .. TOOLS.service_installed() ++ .. [[
          ]] ++ .. translate("required") .. [[: ]] .. TOOLS.service_name() .. [[ ]] .. TOOLS.service_required() ++ .. [[

        ]] ++ .. [[]] ++ .. translate("Please update to current version !") ++ .. [[
     

    ]] ++ end ++ ++ return f ++end ++ ++-- ################################################################################################# ++-- Error handling if no config, create an empty one -- ######################### ++if not NXFS.access("/etc/config/radicale") then ++ NXFS.writefile("/etc/config/radicale", "") ++end ++ ++-- cbi-map -- ################################################################## ++local m = Map("radicale") ++m.title = TOOLS.app_title_main() ++m.description = TOOLS.app_description() ++function m.commit_handler(self) ++ if self.changed then -- changes ? ++ os.execute("/etc/init.d/radicale reload &") -- reload configuration ++ end ++end ++ ++-- cbi-section "System" -- ##################################################### ++local sys = m:section( NamedSection, "_system" ) ++sys.title = translate("System") ++sys.description = nil ++function sys.cfgvalue(self, section) ++ return "_dummysection" ++end ++ ++-- start/stop button ----------------------------------------------------------- ++local btn = sys:option(DummyValue, "_startstop") ++btn.template = "radicale/btn_startstop" ++btn.inputstyle = nil ++btn.rmempty = true ++btn.title = translate("Start / Stop") ++btn.description = translate("Start/Stop Radicale server") ++function btn.cfgvalue(self, section) ++ local pid = TOOLS.get_pid(true) ++ if pid > 0 then ++ btn.inputtitle = "PID: " .. pid ++ btn.inputstyle = "reset" ++ btn.disabled = false ++ else ++ btn.inputtitle = translate("Start") ++ btn.inputstyle = "apply" ++ btn.disabled = false ++ end ++ return true ++end ++ ++-- enabled --------------------------------------------------------------------- ++local ena = sys:option(Flag, "_enabled") ++ena.title = translate("Auto-start") ++ena.description = translate("Enable/Disable auto-start of Radicale on system start-up and interface events") ++ena.orientation = "horizontal" -- put description under the checkbox ++ena.rmempty = false -- we need write ++function ena.cfgvalue(self, section) ++ return (SYS.init.enabled("radicale")) and "1" or "0" ++end ++function ena.write(self, section, value) ++ if value == "1" then ++ return SYS.init.enable("radicale") ++ else ++ return SYS.init.disable("radicale") ++ end ++end ++ ++-- cbi-section "Server" -- ##################################################### ++local srv = m:section( NamedSection, "server", "setting" ) ++srv.title = translate("Server") ++srv.description = nil ++function srv.cfgvalue(self, section) ++ if not self.map:get(section) then -- section might not exist ++ self.map:set(section, nil, self.sectiontype) ++ end ++ return self.map:get(section) ++end ++ ++-- hosts ----------------------------------------------------------------------- ++local sh = srv:option( DynamicList, "hosts" ) ++sh.title = translate("Address:Port") ++sh.description = translate("'Hostname:Port' or 'IPv4:Port' or '[IPv6]:Port' Radicale should listen on") ++ .. [[
    ]] ++ .. translate("Port numbers below 1024 (Privileged ports) are not supported") ++ .. [[]] ++sh.placeholder = "0.0.0.0:5232" ++sh.rmempty = true ++ ++-- realm ----------------------------------------------------------------------- ++local alm = srv:option( Value, "realm" ) ++alm.title = translate("Logon message") ++alm.description = translate("Message displayed in the client when a password is needed.") ++alm.default = "Radicale - Password Required" ++alm.rmempty = false ++function alm.parse(self, section) ++ AbstractValue.parse(self, section, "true") -- otherwise unspecific validate error ++end ++function alm.validate(self, value) ++ if value then ++ return value ++ else ++ return self.default ++ end ++end ++function alm.write(self, section, value) ++ if value ~= self.default then ++ return self.map:set(section, self.option, value) ++ else ++ return self.map:del(section, self.option) ++ end ++end ++ ++-- ssl ------------------------------------------------------------------------- ++local ssl = srv:option( Flag, "ssl" ) ++ssl.title = translate("Enable HTTPS") ++ssl.description = nil ++ssl.rmempty = false ++function ssl.parse(self, section) ++ TOOLS.flag_parse(self, section) ++end ++function ssl.write(self, section, value) ++ if value == "0" then -- delete all if not https enabled ++ self.map:del(section, "protocol") -- protocol ++ self.map:del(section, "certificate") -- certificate ++ self.map:del(section, "key") -- private key ++ self.map:del(section, "ciphers") -- ciphers ++ return self.map:del(section, self.option) ++ else ++ return self.map:set(section, self.option, value) ++ end ++end ++ ++-- protocol -------------------------------------------------------------------- ++local prt = srv:option( ListValue, "protocol" ) ++prt.title = translate("SSL Protocol") ++prt.description = translate("'AUTO' selects the highest protocol version that client and server support.") ++prt.widget = "select" ++prt.default = "PROTOCOL_SSLv23" ++prt:depends ("ssl", "1") ++prt:value ("PROTOCOL_SSLv23", translate("AUTO")) ++prt:value ("PROTOCOL_SSLv2", "SSL v2") ++prt:value ("PROTOCOL_SSLv3", "SSL v3") ++prt:value ("PROTOCOL_TLSv1", "TLS v1") ++prt:value ("PROTOCOL_TLSv1_1", "TLS v1.1") ++prt:value ("PROTOCOL_TLSv1_2", "TLS v1.2") ++ ++-- certificate ----------------------------------------------------------------- ++local crt = srv:option( Value, "certificate" ) ++crt.title = translate("Certificate file") ++crt.description = translate("Full path and file name of certificate") ++crt.placeholder = "/etc/radicale/ssl/server.crt" ++crt.rmempty = false -- force validate/write ++crt:depends ("ssl", "1") ++function crt.parse(self, section) ++ local _ssl = ssl:formvalue(section) or "0" ++ local novld = (_ssl == "0") ++ AbstractValue.parse(self, section, novld) -- otherwise unspecific validate error ++end ++function crt.validate(self, value) ++ local _ssl = ssl:formvalue(srv.section) or "0" ++ if _ssl == "0" then ++ return "" -- ignore if not https enabled ++ end ++ if value then -- otherwise errors in datatype check ++ if DTYP.file(value) then ++ return value ++ else ++ return nil, self.title .. " - " .. translate("File not found !") ++ end ++ else ++ return nil, self.title .. " - " .. translate("Path/File required !") ++ end ++end ++function crt.write(self, section, value) ++ if not value or #value == 0 then ++ return self.map:del(section, self.option) ++ else ++ return self.map:set(section, self.option, value) ++ end ++end ++ ++-- key ------------------------------------------------------------------------- ++local key = srv:option( Value, "key" ) ++key.title = translate("Private key file") ++key.description = translate("Full path and file name of private key") ++key.placeholder = "/etc/radicale/ssl/server.key" ++key.rmempty = false -- force validate/write ++key:depends ("ssl", "1") ++function key.parse(self, section) ++ local _ssl = ssl:formvalue(section) or "0" ++ local novld = (_ssl == "0") ++ AbstractValue.parse(self, section, novld) -- otherwise unspecific validate error ++end ++function key.validate(self, value) ++ local _ssl = ssl:formvalue(srv.section) or "0" ++ if _ssl == "0" then ++ return "" -- ignore if not https enabled ++ end ++ if value then -- otherwise errors in datatype check ++ if DTYP.file(value) then ++ return value ++ else ++ return nil, self.title .. " - " .. translate("File not found !") ++ end ++ else ++ return nil, self.title .. " - " .. translate("Path/File required !") ++ end ++end ++function key.write(self, section, value) ++ if not value or #value == 0 then ++ return self.map:del(section, self.option) ++ else ++ return self.map:set(section, self.option, value) ++ end ++end ++ ++-- ciphers --------------------------------------------------------------------- ++--local cip = srv:option( Value, "ciphers" ) ++--cip.title = translate("Ciphers") ++--cip.description = translate("OPTIONAL: See python's ssl module for available ciphers") ++--cip.rmempty = true ++--cip:depends ("ssl", "1") ++ ++-- cbi-section "Authentication" -- ############################################# ++local aut = m:section( NamedSection, "auth", "setting" ) ++aut.title = translate("Authentication") ++aut.description = translate("Authentication method to allow access to Radicale server.") ++function aut.cfgvalue(self, section) ++ if not self.map:get(section) then -- section might not exist ++ self.map:set(section, nil, self.sectiontype) ++ end ++ return self.map:get(section) ++end ++ ++-- type ----------------------------------------------------------------------- ++local aty = aut:option( ListValue, "type" ) ++aty.title = translate("Authentication method") ++aty.description = nil ++aty.widget = "select" ++aty.default = "None" ++aty:value ("None", translate("None")) ++aty:value ("htpasswd", translate("htpasswd file")) ++--aty:value ("IMAP", "IMAP") -- The IMAP authentication module relies on the imaplib module. ++--aty:value ("LDAP", "LDAP") -- The LDAP authentication module relies on the python-ldap module. ++--aty:value ("PAM", "PAM") -- The PAM authentication module relies on the python-pam module. ++--aty:value ("courier", "courier") ++--aty:value ("HTTP", "HTTP") -- The HTTP authentication module relies on the requests module ++--aty:value ("remote_user", "remote_user") ++--aty:value ("custom", translate("custom")) ++function aty.write(self, section, value) ++ if value ~= "htpasswd" then ++ self.map:del(section, "htpasswd_encryption") ++ elseif value ~= "IMAP" then ++ self.map:del(section, "imap_hostname") ++ self.map:del(section, "imap_port") ++ self.map:del(section, "imap_ssl") ++ end ++ if value ~= self.default then ++ return self.map:set(section, self.option, value) ++ else ++ return self.map:del(section, self.option) ++ end ++end ++ ++-- htpasswd_encryption --------------------------------------------------------- ++local hte = aut:option( ListValue, "htpasswd_encryption" ) ++hte.title = translate("Encryption method") ++hte.description = nil ++hte.widget = "select" ++hte.default = "crypt" ++hte:depends ("type", "htpasswd") ++hte:value ("crypt", translate("crypt")) ++hte:value ("plain", translate("plain")) ++hte:value ("sha1", translate("SHA-1")) ++hte:value ("ssha", translate("salted SHA-1")) ++ ++-- htpasswd_file (dummy) ------------------------------------------------------- ++local htf = aut:option( DummyValue, "_htf" ) ++htf.title = translate("htpasswd file") ++htf.description = [[]] ++ .. translate("Read only!") ++ .. [[ ]] ++ .. translate("Radicale uses '/etc/radicale/users' as htpasswd file.") ++ .. [[
    ]] ++ .. translate("To edit the file follow this link!") ++ .. [[]] ++htf.keylist = {} -- required by template ++htf.vallist = {} -- required by template ++htf.template = "radicale/ro_value" ++htf.readonly = true ++htf:depends ("type", "htpasswd") ++function htf.cfgvalue() ++ return "/etc/radicale/users" ++end ++ ++-- cbi-section "Rights" -- ##################################################### ++local rig = m:section( NamedSection, "rights", "setting" ) ++rig.title = translate("Rights") ++rig.description = translate("Control the access to data collections.") ++function rig.cfgvalue(self, section) ++ if not self.map:get(section) then -- section might not exist ++ self.map:set(section, nil, self.sectiontype) ++ end ++ return self.map:get(section) ++end ++ ++-- type ----------------------------------------------------------------------- ++local rty = rig:option( ListValue, "type" ) ++rty.title = translate("Rights backend") ++rty.description = nil ++rty.widget = "select" ++rty.default = "None" ++rty:value ("None", translate("Full access for everybody (including anonymous)")) ++rty:value ("authenticated", translate("Full access for authenticated Users") ) ++rty:value ("owner_only", translate("Full access for Owner only") ) ++rty:value ("owner_write", translate("Owner allow write, authenticated users allow read") ) ++rty:value ("from_file", translate("Rights are based on a regexp-based file") ) ++--rty:value ("custom", "Custom handler") ++function rty.write(self, section, value) ++ if value ~= "custom" then ++ self.map:del(section, "custom_handler") ++ end ++ if value ~= self.default then ++ return self.map:set(section, self.option, value) ++ else ++ return self.map:del(section, self.option) ++ end ++end ++ ++-- from_file (dummy) ----------------------------------------------------------- ++local rtf = rig:option( DummyValue, "_rtf" ) ++rtf.title = translate("RegExp file") ++rtf.description = [[]] ++ .. translate("Read only!") ++ .. [[ ]] ++ .. translate("Radicale uses '/etc/radicale/rights' as regexp-based file.") ++ .. [[
    ]] ++ .. translate("To edit the file follow this link!") ++ .. [[]] ++rtf.keylist = {} -- required by template ++rtf.vallist = {} -- required by template ++rtf.template = "radicale/ro_value" ++rtf.readonly = true ++rtf:depends ("type", "from_file") ++function rtf.cfgvalue() ++ return "/etc/radicale/rights" ++end ++ ++-- cbi-section "Storage" -- #################################################### ++local sto = m:section( NamedSection, "storage", "setting" ) ++sto.title = translate("Storage") ++sto.description = nil ++function sto.cfgvalue(self, section) ++ if not self.map:get(section) then -- section might not exist ++ self.map:set(section, nil, self.sectiontype) ++ end ++ return self.map:get(section) ++end ++ ++-- type ----------------------------------------------------------------------- ++local sty = sto:option( ListValue, "type" ) ++sty.title = translate("Storage backend") ++sty.description = translate("WARNING: Only 'File-system' is documented and tested by Radicale development") ++sty.widget = "select" ++sty.default = "filesystem" ++sty:value ("filesystem", translate("File-system")) ++--sty:value ("multifilesystem", translate("") ) ++--sty:value ("database", translate("Database") ) ++--sty:value ("custom", translate("Custom") ) ++function sty.write(self, section, value) ++ if value ~= "filesystem" then ++ self.map:del(section, "filesystem_folder") ++ end ++ if value ~= self.default then ++ return self.map:set(section, self.option, value) ++ else ++ return self.map:del(section, self.option) ++ end ++end ++ ++--filesystem_folder ------------------------------------------------------------ ++local sfi = sto:option( Value, "filesystem_folder" ) ++sfi.title = translate("Directory") ++sfi.description = nil ++sfi.default = "/srv/radicale" ++sfi.rmempty = false -- force validate/write ++sfi:depends ("type", "filesystem") ++function sfi.parse(self, section) ++ local _typ = sty:formvalue(sto.section) or "" ++ local novld = (_typ ~= "filesystem") ++ AbstractValue.parse(self, section, novld) -- otherwise unspecific validate error ++end ++function sfi.validate(self, value) ++ local _typ = sty:formvalue(sto.section) or "" ++ if _typ ~= "filesystem" then ++ return "" -- ignore if not htpasswd ++ end ++ if value then -- otherwise errors in datatype check ++ if DTYP.directory(value) then ++ return value ++ else ++ return nil, self.title .. " - " .. translate("Directory not exists/found !") ++ end ++ else ++ return nil, self.title .. " - " .. translate("Directory required !") ++ end ++end ++ ++-- cbi-section "Logging" -- #################################################### ++local log = m:section( NamedSection, "logger", "logging" ) ++log.title = translate("Logging") ++log.description = nil ++function log.cfgvalue(self, section) ++ if not self.map:get(section) then -- section might not exist ++ self.map:set(section, nil, self.sectiontype) ++ end ++ return self.map:get(section) ++end ++ ++-- console_level --------------------------------------------------------------- ++local lco = log:option( ListValue, "console_level" ) ++lco.title = translate("Console Log level") ++lco.description = nil ++lco.widget = "select" ++lco.default = "ERROR" ++lco:value ("DEBUG", translate("Debug")) ++lco:value ("INFO", translate("Info") ) ++lco:value ("WARNING", translate("Warning") ) ++lco:value ("ERROR", translate("Error") ) ++lco:value ("CRITICAL", translate("Critical") ) ++function lco.write(self, section, value) ++ if value ~= self.default then ++ return self.map:set(section, self.option, value) ++ else ++ return self.map:del(section, self.option) ++ end ++end ++ ++-- syslog_level ---------------------------------------------------------------- ++local lsl = log:option( ListValue, "syslog_level" ) ++lsl.title = translate("Syslog Log level") ++lsl.description = nil ++lsl.widget = "select" ++lsl.default = "WARNING" ++lsl:value ("DEBUG", translate("Debug")) ++lsl:value ("INFO", translate("Info") ) ++lsl:value ("WARNING", translate("Warning") ) ++lsl:value ("ERROR", translate("Error") ) ++lsl:value ("CRITICAL", translate("Critical") ) ++function lsl.write(self, section, value) ++ if value ~= self.default then ++ return self.map:set(section, self.option, value) ++ else ++ return self.map:del(section, self.option) ++ end ++end ++ ++-- file_level ------------------------------------------------------------------ ++local lfi = log:option( ListValue, "file_level" ) ++lfi.title = translate("File Log level") ++lfi.description = nil ++lfi.widget = "select" ++lfi.default = "INFO" ++lfi:value ("DEBUG", translate("Debug")) ++lfi:value ("INFO", translate("Info") ) ++lfi:value ("WARNING", translate("Warning") ) ++lfi:value ("ERROR", translate("Error") ) ++lfi:value ("CRITICAL", translate("Critical") ) ++function lfi.write(self, section, value) ++ if value ~= self.default then ++ return self.map:set(section, self.option, value) ++ else ++ return self.map:del(section, self.option) ++ end ++end ++ ++-- file_path ------------------------------------------------------------------- ++local lfp = log:option( Value, "file_path" ) ++lfp.title = translate("Log-file directory") ++lfp.description = translate("Directory where the rotating log-files are stored") ++ .. [[
    ]] ++ .. translate("To view latest log file follow this link!") ++ .. [[]] ++lfp.default = "/var/log/radicale" ++function lfp.write(self, section, value) ++ if value ~= self.default then ++ return self.map:set(section, self.option, value) ++ else ++ return self.map:del(section, self.option) ++ end ++end ++ ++-- file_maxbytes --------------------------------------------------------------- ++local lmb = log:option( Value, "file_maxbytes" ) ++lmb.title = translate("Log-file size") ++lmb.description = translate("Maximum size of each rotation log-file.") ++ .. [[
    ]] ++ .. translate("Setting this parameter to '0' will disable rotation of log-file.") ++ .. [[]] ++lmb.default = "8196" ++lmb.rmempty = false ++function lmb.validate(self, value) ++ if value then -- otherwise errors in datatype check ++ if DTYP.uinteger(value) then ++ return value ++ else ++ return nil, self.title .. " - " .. translate("Value is not an Integer >= 0 !") ++ end ++ else ++ return nil, self.title .. " - " .. translate("Value required ! Integer >= 0 !") ++ end ++end ++function lmb.write(self, section, value) ++ if value ~= self.default then ++ return self.map:set(section, self.option, value) ++ else ++ return self.map:del(section, self.option) ++ end ++end ++ ++-- file_backupcount ------------------------------------------------------------ ++local lbc = log:option( Value, "file_backupcount" ) ++lbc.title = translate("Log-backup Count") ++lbc.description = translate("Number of backup files of log to create.") ++ .. [[
    ]] ++ .. translate("Setting this parameter to '0' will disable rotation of log-file.") ++ .. [[]] ++lbc.default = "1" ++lbc.rmempty = false ++function lbc.validate(self, value) ++ if value then -- otherwise errors in datatype check ++ if DTYP.uinteger(value) then ++ return value ++ else ++ return nil, self.title .. " - " .. translate("Value is not an Integer >= 0 !") ++ end ++ else ++ return nil, self.title .. " - " .. translate("Value required ! Integer >= 0 !") ++ end ++end ++function lbc.write(self, section, value) ++ if value ~= self.default then ++ return self.map:set(section, self.option, value) ++ else ++ return self.map:del(section, self.option) ++ end ++end ++ ++-- cbi-section "Encoding" -- ################################################### ++local enc = m:section( NamedSection, "encoding", "setting" ) ++enc.title = translate("Encoding") ++enc.description = translate("Change here the encoding Radicale will use instead of 'UTF-8' " ++ .. "for responses to the client and/or to store data inside collections.") ++function enc.cfgvalue(self, section) ++ if not self.map:get(section) then -- section might not exist ++ self.map:set(section, nil, self.sectiontype) ++ end ++ return self.map:get(section) ++end ++ ++-- request --------------------------------------------------------------------- ++local enr = enc:option( Value, "request" ) ++enr.title = translate("Response Encoding") ++enr.description = translate("Encoding for responding requests.") ++enr.default = "utf-8" ++enr.optional = true ++ ++-- stock ----------------------------------------------------------------------- ++local ens = enc:option( Value, "stock" ) ++ens.title = translate("Storage Encoding") ++ens.description = translate("Encoding for storing local collections.") ++ens.default = "utf-8" ++ens.optional = true ++ ++-- cbi-section "Headers" -- #################################################### ++local hea = m:section( NamedSection, "headers", "setting" ) ++hea.title = translate("Additional HTTP headers") ++hea.description = translate("Cross-origin resource sharing (CORS) is a mechanism that allows restricted resources (e.g. fonts, JavaScript, etc.) " ++ .. "on a web page to be requested from another domain outside the domain from which the resource originated.") ++function hea.cfgvalue(self, section) ++ if not self.map:get(section) then -- section might not exist ++ self.map:set(section, nil, self.sectiontype) ++ end ++ return self.map:get(section) ++end ++ ++-- Access_Control_Allow_Origin ------------------------------------------------- ++local heo = hea:option( DynamicList, "Access_Control_Allow_Origin" ) ++heo.title = translate("Access-Control-Allow-Origin") ++heo.description = nil ++heo.default = "*" ++heo.optional = true ++ ++-- Access_Control_Allow_Methods ------------------------------------------------ ++local hem = hea:option( DynamicList, "Access_Control_Allow_Methods" ) ++hem.title = translate("Access-Control-Allow-Methods") ++hem.description = nil ++hem.optional = true ++ ++-- Access_Control_Allow_Headers ------------------------------------------------ ++local heh = hea:option( DynamicList, "Access_Control_Allow_Headers" ) ++heh.title = translate("Access-Control-Allow-Headers") ++heh.description = nil ++heh.optional = true ++ ++-- Access_Control_Expose_Headers ----------------------------------------------- ++local hee = hea:option( DynamicList, "Access_Control_Expose_Headers" ) ++hee.title = translate("Access-Control-Expose-Headers") ++hee.description = nil ++hee.optional = true ++ ++return m +diff --git a/feeds/luci/applications/luci-app-radicale/luasrc/view/radicale/btn_startstop.htm b/feeds/luci/applications/luci-app-radicale/luasrc/view/radicale/btn_startstop.htm +new file mode 100644 +index 0000000..79d1c36 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-radicale/luasrc/view/radicale/btn_startstop.htm +@@ -0,0 +1,49 @@ ++ ++ ++ ++ ++<%+cbi/valueheader%> ++ ++<% if self:cfgvalue(section) ~= false then ++-- We need to garantie that function cfgvalue run first to set missing parameters ++%> ++ ++ ++ " style="font-size: 100%;" type="button" onclick="onclick_startstop(this.id)" ++ <%= ++ attr("name", section) .. attr("id", cbid) .. attr("value", self.inputtitle) .. ifattr(self.disabled, "disabled") ++ %> /> ++<% end %> ++ ++<%+cbi/valuefooter%> ++ +diff --git a/feeds/luci/applications/luci-app-radicale/luasrc/view/radicale/ro_value.htm b/feeds/luci/applications/luci-app-radicale/luasrc/view/radicale/ro_value.htm +new file mode 100644 +index 0000000..6e05206 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-radicale/luasrc/view/radicale/ro_value.htm +@@ -0,0 +1,35 @@ ++<%+cbi/valueheader%> ++ /> ++ <% if self.password then %><% end %> ++ <% if #self.keylist > 0 or self.datatype then -%> ++ ++ <% end -%> ++<%+cbi/valuefooter%> +diff --git a/feeds/luci/applications/luci-app-radicale/po/de/radicale.po b/feeds/luci/applications/luci-app-radicale/po/de/radicale.po +new file mode 100644 +index 0000000..57850dc +--- /dev/null ++++ b/feeds/luci/applications/luci-app-radicale/po/de/radicale.po +@@ -0,0 +1,435 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: luci-app-radicale\n" ++"POT-Creation-Date: 2015-05-02 19:32+0100\n" ++"PO-Revision-Date: 2015-05-02 22:43+0100\n" ++"Last-Translator: Christian Schoenebeck \n" ++"Language-Team: \n" ++"Language: de\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"X-Generator: Poedit 1.7.5\n" ++"Plural-Forms: nplurals=2; plural=(n != 1);\n" ++"X-Poedit-SourceCharset: UTF-8\n" ++ ++msgid "" ++"'AUTO' selects the highest protocol version that client and server support." ++msgstr "" ++"'AUTO' wählt die höchste Protokollversion, die Client und Server " ++"unterstützen." ++ ++msgid "" ++"'Hostname:Port' or 'IPv4:Port' or '[IPv6]:Port' Radicale should listen on" ++msgstr "" ++"'Hostname:Port' oder 'IPv4:Port' oder '[IPv6]:Port' die Radicale überwachen " ++"soll." ++ ++msgid "-- Please choose --" ++msgstr "-- Bitte auswählen --" ++ ++msgid "-- custom --" ++msgstr "-- benutzerdefiniert --" ++ ++msgid "AUTO" ++msgstr "AUTO" ++ ++msgid "Access-Control-Allow-Headers" ++msgstr "Access-Control-Allow-Headers" ++ ++msgid "Access-Control-Allow-Methods" ++msgstr "Access-Control-Allow-Methods" ++ ++msgid "Access-Control-Allow-Origin" ++msgstr "Access-Control-Allow-Origin" ++ ++msgid "Access-Control-Expose-Headers" ++msgstr "Access-Control-Expose-Headers" ++ ++msgid "Additional HTTP headers" ++msgstr "Zusätzliche HTTP headers" ++ ++msgid "Address:Port" ++msgstr "Adresse:Port" ++ ++msgid "Authentication" ++msgstr "Authentifizierung" ++ ++msgid "" ++"Authentication login is matched against the 'user' key, and collection's " ++"path is matched against the 'collection' key." ++msgstr "" ++"Der Login wird gegen die 'user' Schlüssel und die Pfadsammlung gegen die " ++"'collection' Schlüssel abgestimmt." ++ ++msgid "Authentication method" ++msgstr "Authentifizierungsmethode" ++ ++msgid "Authentication method to allow access to Radicale server." ++msgstr "" ++"Authentifizierungsmethode um den Zugang zum Radicale Server zu kontrollieren." ++ ++msgid "Auto-start" ++msgstr "Autostart" ++ ++msgid "CalDAV/CardDAV" ++msgstr "CalDAV/CardDAV" ++ ++msgid "" ++"Calendars and address books are available for both local and remote access, " ++"possibly limited through authentication policies." ++msgstr "" ++"Auf Kalender und Adressbücher kann sowohl Lokal als auch Remote zugegriffen " ++"werden, soweit nicht durch Authentifizierungsrichtlinien begrenzt." ++ ++msgid "Certificate file" ++msgstr "Zertifikat Datei" ++ ++msgid "" ++"Change here the encoding Radicale will use instead of 'UTF-8' for responses " ++"to the client and/or to store data inside collections." ++msgstr "" ++"Ändern Sie hier die Zeichenkodierung die Radicale anstelle von \"UTF-8\" für " ++"Antworten an den Client und/oder zum Speichern von Daten in einer Sammlung " ++"verwendet." ++ ++msgid "Ciphers" ++msgstr "Chiffren" ++ ++msgid "Console Log level" ++msgstr "Konsole Protokoll Level" ++ ++msgid "Control the access to data collections." ++msgstr "Kontrolliert den Zugriff auf die Daten Sammlungen." ++ ++msgid "Critical" ++msgstr "Kritisch" ++ ++msgid "" ++"Cross-origin resource sharing (CORS) is a mechanism that allows restricted " ++"resources (e.g. fonts, JavaScript, etc.) on a web page to be requested from " ++"another domain outside the domain from which the resource originated." ++msgstr "" ++"Cross-Origin Resource Sharing (CORS) ist ein Mechanismus, um Webbrowsern " ++"oder auch anderen Webclients Cross-Origin-Requests zu ermöglichen." ++ ++msgid "Custom" ++msgstr "Benutzerdefiniert" ++ ++msgid "Database" ++msgstr "Datenbank" ++ ++msgid "Debug" ++msgstr "Debug" ++ ++msgid "Directory" ++msgstr "Verzeichnis" ++ ++msgid "Directory not exists/found !" ++msgstr "Verzeichnis nicht gefunden / existiert nicht !" ++ ++msgid "Directory required !" ++msgstr "Verzeichnis benötigt !" ++ ++msgid "Directory where the rotating log-files are stored" ++msgstr "" ++"Verzeichnis in dem die rollierenden Protokolldateien gespeichert werden" ++ ++msgid "Enable HTTPS" ++msgstr "Verwende HTTPS" ++ ++msgid "" ++"Enable/Disable auto-start of Radicale on system start-up and interface events" ++msgstr "" ++"Aktiviert/Deaktiviert den Autostart von Radicale beim Systemstart und bei " ++"Schnittstellenereignissen." ++ ++msgid "Encoding" ++msgstr "Zeichenkodierung" ++ ++msgid "Encoding for responding requests." ++msgstr "Zeichenkodierung für die Beantwortung von Anfragen." ++ ++msgid "Encoding for storing local collections." ++msgstr "Zeichenkodierung für die Speicherung von lokalen Sammlungen." ++ ++msgid "Encryption method" ++msgstr "Verschlüsselungsmethode" ++ ++msgid "Error" ++msgstr "Fehler" ++ ++msgid "File '%s' not found !" ++msgstr "Datei '%s' wurde nicht gefunden!" ++ ++msgid "File Log level" ++msgstr "Datei Protokoll Level" ++ ++msgid "File not found !" ++msgstr "Datei nicht gefunden !" ++ ++msgid "File-system" ++msgstr "Dateisystem" ++ ++msgid "" ++"For example, for the 'user' key, '.+' means 'authenticated user' and '.*' " ++"means 'anybody' (including anonymous users)." ++msgstr "" ++"Beispiel für den 'user' Schlüssel: '. +' bedeutet 'authentifizierten " ++"Benutzer' und '. *' bedeutet 'jeder' (einschließlich anonyme Benutzer)." ++ ++msgid "Full access for Owner only" ++msgstr "Voller Zugriff nur für den Besitzer" ++ ++msgid "Full access for authenticated Users" ++msgstr "Voller Zugriff für authentifizierte Benutzer" ++ ++msgid "Full access for everybody (including anonymous)" ++msgstr "Vollzugriff für jedermann (auch anonyme)" ++ ++msgid "Full path and file name of certificate" ++msgstr "Vollständiger Pfad und Dateiname der Zertifikat Datei" ++ ++msgid "Full path and file name of private key" ++msgstr "Vollständiger Pfad und Dateiname der Privaten Schlüsseldatei" ++ ++msgid "Info" ++msgstr "Informationen" ++ ++msgid "Keep in mind to use the correct hashing algorithm !" ++msgstr "Denken Sie daran, den korrekten Hash-Algorithmus zu verwenden!" ++ ++msgid "Leading or ending slashes are trimmed from collection's path." ++msgstr "" ++"Schrägstriche ('/') am Anfang und Ende der Pfadangabe der Sammlung werden " ++"von der Pfadangabe abgeschnitten." ++ ++msgid "Log-backup Count" ++msgstr "Protokoll Backup Zähler" ++ ++msgid "Log-file Viewer" ++msgstr "Protokolldatei Betrachter" ++ ++msgid "Log-file directory" ++msgstr "Protokoll-Datei Verzeichnis" ++ ++msgid "Log-file size" ++msgstr "Protokoll Dateigröße" ++ ++msgid "Logging" ++msgstr "Protokollierung" ++ ++msgid "Logon message" ++msgstr "Anmelde-Hinweis" ++ ++msgid "Maximum size of each rotation log-file." ++msgstr "Maximale Größe jeder rollierenden Protokoll-Datei." ++ ++msgid "Message displayed in the client when a password is needed." ++msgstr "Meldung im Client, wenn ein Kennwort erforderlich ist." ++ ++msgid "NOT installed" ++msgstr "nicht installiert" ++ ++msgid "None" ++msgstr "Keine" ++ ++msgid "Number of backup files of log to create." ++msgstr "Anzahl der Protokoll Backup Dateien, die angelegt werden." ++ ++msgid "OPTIONAL: See python's ssl module for available ciphers" ++msgstr "OPTIONAL: Siehe Python SSL-Modul Dokumentation" ++ ++msgid "Owner allow write, authenticated users allow read" ++msgstr "" ++"Besitzer haben Schreibrechte, Authentifizierten Benutzer dürfen nur lesen." ++ ++msgid "Path/File required !" ++msgstr "Pfad/Datei erforderlich!" ++ ++msgid "" ++"Place here the 'user:password' pairs for your users which should have access " ++"to Radicale." ++msgstr "" ++"Speichern Sie hier die 'user: password' Paare für die Benutzer, die Zugriff " ++"auf Radicale haben sollte." ++ ++msgid "Please install current version !" ++msgstr "Installieren Sie bitte die aktuelle Version!" ++ ++msgid "Please press [Reload] button below to reread the file." ++msgstr "" ++"Bitte drücken Sie die [Neu laden]-Schaltfläche unten, um die Datei neu " ++"einzulesen." ++ ++msgid "Please update to current version !" ++msgstr "Aktualisieren Sie bitte auf die aktuelle Version!" ++ ++msgid "Port numbers below 1024 (Privileged ports) are not supported" ++msgstr "Port Nummern unter 1024 (Privileged Ports) werden nicht unterstützt." ++ ++msgid "Private key file" ++msgstr "Private Schlüssel Datei" ++ ++msgid "Radicale CalDAV/CardDAV Server" ++msgstr "Radicale CalDAV/CardDAV Dienst" ++ ++msgid "Radicale uses '/etc/radicale/rights' as regexp-based file." ++msgstr "Radicale verwendet '/etc/radicale/rights' als RegExp-basierte Datei." ++ ++msgid "Radicale uses '/etc/radicale/users' as htpasswd file." ++msgstr "Radicale verwendet 'etc/radicale/users' als htpasswd Datei." ++ ++msgid "Read only!" ++msgstr "Nur lesbar!" ++ ++msgid "RegExp file" ++msgstr "RegExp Datei" ++ ++msgid "Reload" ++msgstr "Neu laden" ++ ++msgid "Response Encoding" ++msgstr "Antwort Zeichenkodierung" ++ ++msgid "Reveal/hide password" ++msgstr "Passwort zeigen/verstecken" ++ ++msgid "Rights" ++msgstr "Zugriffsrechte" ++ ++msgid "Rights are based on a regexp-based file" ++msgstr "Zugriff basiert auf RegExp-basierter Datei." ++ ++msgid "Rights backend" ++msgstr "Zugagsverwaltung" ++ ++msgid "SHA-1" ++msgstr "SHA-1" ++ ++msgid "SSL Protocol" ++msgstr "SSL Protokol" ++ ++msgid "Save" ++msgstr "Speichern" ++ ++msgid "Section names are only used for naming the rule." ++msgstr "Abschnittsnamen werden nur für die Benennung der Regel verwendet." ++ ++msgid "Server" ++msgstr "Server" ++ ++msgid "Setting this parameter to '0' will disable rotation of log-file." ++msgstr "" ++"Wenn dieser Parameter auf '0' gesetzt wird, wird die Protokolldatei nicht " ++"mehr rolliert!" ++ ++msgid "Software package '" ++msgstr "Software Packet '" ++ ++msgid "Start" ++msgstr "Start" ++ ++msgid "Start / Stop" ++msgstr "Start / Stopp" ++ ++msgid "Start/Stop Radicale server" ++msgstr "Start / Stopp Radicale Dienst" ++ ++msgid "Storage" ++msgstr "Datenspeicher" ++ ++msgid "Storage Encoding" ++msgstr "Datenspeicher Kodierung" ++ ++msgid "Storage backend" ++msgstr "Datenspeicher Verwaltung" ++ ++msgid "Syslog Log level" ++msgstr "Systemlog Level" ++ ++msgid "System" ++msgstr "System" ++ ++msgid "" ++"The Radicale Project is a complete CalDAV (calendar) and CardDAV (contact) " ++"server solution." ++msgstr "" ++"Das Raidcale Projekt bietet eine vollständige CalDAV (Kalender) und CardDAV " ++"(Adressbuch) Server Lösung." ++ ++msgid "" ++"They can be viewed and edited by calendar and contact clients on mobile " ++"phones or computers." ++msgstr "" ++"Diese können von Kalender- und Adressbuch-Anwendungen auf mobilen Endgeräten " ++"und Computern angezeigt und bearbeitet werden." ++ ++msgid "To edit the file follow this link!" ++msgstr "Um die Datei zu bearbeiten, folgend Sie dieser Verknüpfung!" ++ ++msgid "To view latest log file follow this link!" ++msgstr "" ++"Zur Anzeige der letzten Protokolldatei, folgen Sie dieser Verknüpfung !" ++ ++msgid "Value is not an Integer >= 0 !" ++msgstr "Eingabe ist keine Ganzzahl >= 0 !" ++ ++msgid "Value required ! Integer >= 0 !" ++msgstr "Eingabe erforderlich ! Ganzzahl >= 0 !" ++ ++msgid "Version" ++msgstr "Version" ++ ++msgid "Version Information" ++msgstr "Versionsinformationen" ++ ++msgid "" ++"WARNING: Only 'File-system' is documented and tested by Radicale development" ++msgstr "" ++"WARNUNG: Nur 'File-system' ist vom Radicale Entwicklerteam derzeit " ++"dokumentiert und getestet." ++ ++msgid "Warning" ++msgstr "Warnung" ++ ++msgid "" ++"You can also get groups from the user regex in the collection with {0}, {1}, " ++"etc." ++msgstr "" ++ ++msgid "" ++"You can use Python's ConfigParser interpolation values %(login)s and " ++"%(path)s." ++msgstr "" ++"Sie können Python ConfigParser Werte '%(login)s' und '%(path)s' verwenden." ++ ++msgid "crypt" ++msgstr "crypt" ++ ++msgid "custom" ++msgstr "benutzerdefiniert" ++ ++msgid "htpasswd file" ++msgstr "htpasswd Datei" ++ ++msgid "installed" ++msgstr "installiert" ++ ++msgid "or higher" ++msgstr "oder höher" ++ ++msgid "plain" ++msgstr "unverschlüsselt" ++ ++msgid "required" ++msgstr "erforderlich" ++ ++msgid "salted SHA-1" ++msgstr "Salted SHA-1" ++ ++#~ msgid "File" ++#~ msgstr "Datei" ++ ++#~ msgid "not found !" ++#~ msgstr "nicht gefunden !" +diff --git a/feeds/luci/applications/luci-app-radicale/po/templates/radicale.pot b/feeds/luci/applications/luci-app-radicale/po/templates/radicale.pot +new file mode 100644 +index 0000000..c5e0797 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-radicale/po/templates/radicale.pot +@@ -0,0 +1,381 @@ ++msgid "" ++msgstr "Content-Type: text/plain; charset=UTF-8" ++ ++msgid "" ++"'AUTO' selects the highest protocol version that client and server support." ++msgstr "" ++ ++msgid "" ++"'Hostname:Port' or 'IPv4:Port' or '[IPv6]:Port' Radicale should listen on" ++msgstr "" ++ ++msgid "-- Please choose --" ++msgstr "" ++ ++msgid "-- custom --" ++msgstr "" ++ ++msgid "AUTO" ++msgstr "" ++ ++msgid "Access-Control-Allow-Headers" ++msgstr "" ++ ++msgid "Access-Control-Allow-Methods" ++msgstr "" ++ ++msgid "Access-Control-Allow-Origin" ++msgstr "" ++ ++msgid "Access-Control-Expose-Headers" ++msgstr "" ++ ++msgid "Additional HTTP headers" ++msgstr "" ++ ++msgid "Address:Port" ++msgstr "" ++ ++msgid "Authentication" ++msgstr "" ++ ++msgid "" ++"Authentication login is matched against the 'user' key, and collection's " ++"path is matched against the 'collection' key." ++msgstr "" ++ ++msgid "Authentication method" ++msgstr "" ++ ++msgid "Authentication method to allow access to Radicale server." ++msgstr "" ++ ++msgid "Auto-start" ++msgstr "" ++ ++msgid "CalDAV/CardDAV" ++msgstr "" ++ ++msgid "" ++"Calendars and address books are available for both local and remote access, " ++"possibly limited through authentication policies." ++msgstr "" ++ ++msgid "Certificate file" ++msgstr "" ++ ++msgid "" ++"Change here the encoding Radicale will use instead of 'UTF-8' for responses " ++"to the client and/or to store data inside collections." ++msgstr "" ++ ++msgid "Ciphers" ++msgstr "" ++ ++msgid "Console Log level" ++msgstr "" ++ ++msgid "Control the access to data collections." ++msgstr "" ++ ++msgid "Critical" ++msgstr "" ++ ++msgid "" ++"Cross-origin resource sharing (CORS) is a mechanism that allows restricted " ++"resources (e.g. fonts, JavaScript, etc.) on a web page to be requested from " ++"another domain outside the domain from which the resource originated." ++msgstr "" ++ ++msgid "Custom" ++msgstr "" ++ ++msgid "Database" ++msgstr "" ++ ++msgid "Debug" ++msgstr "" ++ ++msgid "Directory" ++msgstr "" ++ ++msgid "Directory not exists/found !" ++msgstr "" ++ ++msgid "Directory required !" ++msgstr "" ++ ++msgid "Directory where the rotating log-files are stored" ++msgstr "" ++ ++msgid "Enable HTTPS" ++msgstr "" ++ ++msgid "" ++"Enable/Disable auto-start of Radicale on system start-up and interface events" ++msgstr "" ++ ++msgid "Encoding" ++msgstr "" ++ ++msgid "Encoding for responding requests." ++msgstr "" ++ ++msgid "Encoding for storing local collections." ++msgstr "" ++ ++msgid "Encryption method" ++msgstr "" ++ ++msgid "Error" ++msgstr "" ++ ++msgid "File '%s' not found !" ++msgstr "" ++ ++msgid "File Log level" ++msgstr "" ++ ++msgid "File not found !" ++msgstr "" ++ ++msgid "File-system" ++msgstr "" ++ ++msgid "" ++"For example, for the 'user' key, '.+' means 'authenticated user' and '.*' " ++"means 'anybody' (including anonymous users)." ++msgstr "" ++ ++msgid "Full access for Owner only" ++msgstr "" ++ ++msgid "Full access for authenticated Users" ++msgstr "" ++ ++msgid "Full access for everybody (including anonymous)" ++msgstr "" ++ ++msgid "Full path and file name of certificate" ++msgstr "" ++ ++msgid "Full path and file name of private key" ++msgstr "" ++ ++msgid "Info" ++msgstr "" ++ ++msgid "Keep in mind to use the correct hashing algorithm !" ++msgstr "" ++ ++msgid "Leading or ending slashes are trimmed from collection's path." ++msgstr "" ++ ++msgid "Log-backup Count" ++msgstr "" ++ ++msgid "Log-file Viewer" ++msgstr "" ++ ++msgid "Log-file directory" ++msgstr "" ++ ++msgid "Log-file size" ++msgstr "" ++ ++msgid "Logging" ++msgstr "" ++ ++msgid "Logon message" ++msgstr "" ++ ++msgid "Maximum size of each rotation log-file." ++msgstr "" ++ ++msgid "Message displayed in the client when a password is needed." ++msgstr "" ++ ++msgid "NOT installed" ++msgstr "" ++ ++msgid "None" ++msgstr "" ++ ++msgid "Number of backup files of log to create." ++msgstr "" ++ ++msgid "OPTIONAL: See python's ssl module for available ciphers" ++msgstr "" ++ ++msgid "Owner allow write, authenticated users allow read" ++msgstr "" ++ ++msgid "Path/File required !" ++msgstr "" ++ ++msgid "" ++"Place here the 'user:password' pairs for your users which should have access " ++"to Radicale." ++msgstr "" ++ ++msgid "Please install current version !" ++msgstr "" ++ ++msgid "Please press [Reload] button below to reread the file." ++msgstr "" ++ ++msgid "Please update to current version !" ++msgstr "" ++ ++msgid "Port numbers below 1024 (Privileged ports) are not supported" ++msgstr "" ++ ++msgid "Private key file" ++msgstr "" ++ ++msgid "Radicale CalDAV/CardDAV Server" ++msgstr "" ++ ++msgid "Radicale uses '/etc/radicale/rights' as regexp-based file." ++msgstr "" ++ ++msgid "Radicale uses '/etc/radicale/users' as htpasswd file." ++msgstr "" ++ ++msgid "Read only!" ++msgstr "" ++ ++msgid "RegExp file" ++msgstr "" ++ ++msgid "Reload" ++msgstr "" ++ ++msgid "Response Encoding" ++msgstr "" ++ ++msgid "Reveal/hide password" ++msgstr "" ++ ++msgid "Rights" ++msgstr "" ++ ++msgid "Rights are based on a regexp-based file" ++msgstr "" ++ ++msgid "Rights backend" ++msgstr "" ++ ++msgid "SHA-1" ++msgstr "" ++ ++msgid "SSL Protocol" ++msgstr "" ++ ++msgid "Save" ++msgstr "" ++ ++msgid "Section names are only used for naming the rule." ++msgstr "" ++ ++msgid "Server" ++msgstr "" ++ ++msgid "Setting this parameter to '0' will disable rotation of log-file." ++msgstr "" ++ ++msgid "Software package '" ++msgstr "" ++ ++msgid "Start" ++msgstr "" ++ ++msgid "Start / Stop" ++msgstr "" ++ ++msgid "Start/Stop Radicale server" ++msgstr "" ++ ++msgid "Storage" ++msgstr "" ++ ++msgid "Storage Encoding" ++msgstr "" ++ ++msgid "Storage backend" ++msgstr "" ++ ++msgid "Syslog Log level" ++msgstr "" ++ ++msgid "System" ++msgstr "" ++ ++msgid "" ++"The Radicale Project is a complete CalDAV (calendar) and CardDAV (contact) " ++"server solution." ++msgstr "" ++ ++msgid "" ++"They can be viewed and edited by calendar and contact clients on mobile " ++"phones or computers." ++msgstr "" ++ ++msgid "To edit the file follow this link!" ++msgstr "" ++ ++msgid "To view latest log file follow this link!" ++msgstr "" ++ ++msgid "Value is not an Integer >= 0 !" ++msgstr "" ++ ++msgid "Value required ! Integer >= 0 !" ++msgstr "" ++ ++msgid "Version" ++msgstr "" ++ ++msgid "Version Information" ++msgstr "" ++ ++msgid "" ++"WARNING: Only 'File-system' is documented and tested by Radicale development" ++msgstr "" ++ ++msgid "Warning" ++msgstr "" ++ ++msgid "" ++"You can also get groups from the user regex in the collection with {0}, {1}, " ++"etc." ++msgstr "" ++ ++msgid "" ++"You can use Python's ConfigParser interpolation values %(login)s and " ++"%(path)s." ++msgstr "" ++ ++msgid "crypt" ++msgstr "" ++ ++msgid "custom" ++msgstr "" ++ ++msgid "htpasswd file" ++msgstr "" ++ ++msgid "installed" ++msgstr "" ++ ++msgid "or higher" ++msgstr "" ++ ++msgid "plain" ++msgstr "" ++ ++msgid "required" ++msgstr "" ++ ++msgid "salted SHA-1" ++msgstr "" +diff --git a/feeds/luci/applications/luci-app-radicale/root/etc/uci-defaults/luci-radicale b/feeds/luci/applications/luci-app-radicale/root/etc/uci-defaults/luci-radicale +new file mode 100755 +index 0000000..333ca65 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-radicale/root/etc/uci-defaults/luci-radicale +@@ -0,0 +1,12 @@ ++#!/bin/sh ++ ++# no longer needed for "Save and Apply" to restart radicale ++# luci-app-radicale calls /etc/init.d/radicale reload ++uci -q batch <<-EOF >/dev/null ++ delete ucitrack.@radicale[-1] ++ commit ucitrack ++EOF ++ ++rm -f /tmp/luci-indexcache ++ ++exit 0 +diff --git a/feeds/luci/applications/luci-app-radvd/Makefile b/feeds/luci/applications/luci-app-radvd/Makefile +new file mode 100644 +index 0000000..9b353ed +--- /dev/null ++++ b/feeds/luci/applications/luci-app-radvd/Makefile +@@ -0,0 +1,14 @@ ++# ++# Copyright (C) 2008-2014 The LuCI Team ++# ++# This is free software, licensed under the Apache License, Version 2.0 . ++# ++ ++include $(TOPDIR)/rules.mk ++ ++LUCI_TITLE:=LuCI Support for Radvd ++LUCI_DEPENDS:=+radvd ++ ++include ../../luci.mk ++ ++# call BuildPackage - OpenWrt buildroot signature +diff --git a/feeds/luci/applications/luci-app-radvd/luasrc/controller/radvd.lua b/feeds/luci/applications/luci-app-radvd/luasrc/controller/radvd.lua +new file mode 100644 +index 0000000..9c08f4c +--- /dev/null ++++ b/feeds/luci/applications/luci-app-radvd/luasrc/controller/radvd.lua +@@ -0,0 +1,17 @@ ++-- Copyright 2010 Jo-Philipp Wich ++-- Licensed to the public under the Apache License 2.0. ++ ++module("luci.controller.radvd", package.seeall) ++ ++function index() ++ if not nixio.fs.access("/etc/config/radvd") then ++ return ++ end ++ ++ entry({"admin", "network", "radvd"}, cbi("radvd"), _("Radvd"), 61) ++ entry({"admin", "network", "radvd", "interface"}, cbi("radvd/interface"), nil).leaf = true ++ entry({"admin", "network", "radvd", "prefix"}, cbi("radvd/prefix"), nil).leaf = true ++ entry({"admin", "network", "radvd", "route"}, cbi("radvd/route"), nil).leaf = true ++ entry({"admin", "network", "radvd", "rdnss"}, cbi("radvd/rdnss"), nil).leaf = true ++ entry({"admin", "network", "radvd", "dnssl"}, cbi("radvd/dnssl"), nil).leaf = true ++end +diff --git a/feeds/luci/applications/luci-app-radvd/luasrc/model/cbi/radvd.lua b/feeds/luci/applications/luci-app-radvd/luasrc/model/cbi/radvd.lua +new file mode 100644 +index 0000000..755dcb4 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-radvd/luasrc/model/cbi/radvd.lua +@@ -0,0 +1,324 @@ ++-- Copyright 2010 Jo-Philipp Wich ++-- Licensed to the public under the Apache License 2.0. ++ ++m = Map("radvd", translate("Radvd"), ++ translate("Radvd is a router advertisement daemon for IPv6. " .. ++ "It listens to router solicitations and sends router advertisements " .. ++ "as described in RFC 4861.")) ++ ++local nm = require "luci.model.network".init(m.uci) ++local ut = require "luci.util" ++ ++ ++-- ++-- Interfaces ++-- ++ ++s = m:section(TypedSection, "interface", translate("Interfaces")) ++s.template = "cbi/tblsection" ++s.extedit = luci.dispatcher.build_url("admin/network/radvd/interface/%s") ++s.anonymous = true ++s.addremove = true ++ ++function s.create(...) ++ local id = TypedSection.create(...) ++ luci.http.redirect(s.extedit % id) ++end ++ ++function s.remove(self, section) ++ if m.uci:get("radvd", section) == "interface" then ++ local iface = m.uci:get("radvd", section, "interface") ++ if iface then ++ m.uci:delete_all("radvd", "prefix", ++ function(s) return s.interface == iface end) ++ ++ m.uci:delete_all("radvd", "route", ++ function(s) return s.interface == iface end) ++ ++ m.uci:delete_all("radvd", "rdnss", ++ function(s) return s.interface == iface end) ++ end ++ end ++ ++ return TypedSection.remove(self, section) ++end ++ ++o = s:option(Flag, "ignore", translate("Enable")) ++o.rmempty = false ++o.width = "30px" ++function o.cfgvalue(...) ++ local v = Flag.cfgvalue(...) ++ return v == "1" and "0" or "1" ++end ++function o.write(self, section, value) ++ Flag.write(self, section, value == "1" and "0" or "1") ++end ++ ++o = s:option(DummyValue, "interface", translate("Interface")) ++o.template = "cbi/network_netinfo" ++o.width = "10%" ++ ++o = s:option(DummyValue, "UnicastOnly", translate("Multicast")) ++function o.cfgvalue(self, section) ++ local v = Value.cfgvalue(self, section) ++ local v2 = m.uci:get("radvd", section, "client") ++ return (v == "1" or (v2 and #v2 > 0)) and translate("no") or translate("yes") ++end ++ ++o = s:option(DummyValue, "AdvSendAdvert", translate("Advertising")) ++function o.cfgvalue(...) ++ local v = Value.cfgvalue(...) ++ return v == "1" and translate("yes") or translate("no") ++end ++ ++o = s:option(DummyValue, "MaxRtrAdvInterval", translate("Max. interval")) ++function o.cfgvalue(...) ++ local v = Value.cfgvalue(...) or "600" ++ return v .. "s" ++end ++ ++o = s:option(DummyValue, "AdvHomeAgentFlag", translate("Mobile IPv6")) ++function o.cfgvalue(...) ++ local v = Value.cfgvalue(...) ++ return v == "1" and translate("yes") or translate("no") ++end ++ ++o = s:option(DummyValue, "AdvDefaultPreference", translate("Preference")) ++function o.cfgvalue(...) ++ local v = Value.cfgvalue(...) or "medium" ++ return translate(v) ++end ++ ++ ++-- ++-- Prefixes ++-- ++ ++s2 = m:section(TypedSection, "prefix", translate("Prefixes")) ++s2.template = "cbi/tblsection" ++s2.extedit = luci.dispatcher.build_url("admin/network/radvd/prefix/%s") ++s2.addremove = true ++s2.anonymous = true ++ ++function s2.create(...) ++ local id = TypedSection.create(...) ++ luci.http.redirect(s2.extedit % id) ++end ++ ++ ++o = s2:option(Flag, "ignore", translate("Enable")) ++o.rmempty = false ++o.width = "30px" ++function o.cfgvalue(...) ++ local v = Flag.cfgvalue(...) ++ return v == "1" and "0" or "1" ++end ++function o.write(self, section, value) ++ Flag.write(self, section, value == "1" and "0" or "1") ++end ++ ++o = s2:option(DummyValue, "interface", translate("Interface")) ++o.template = "cbi/network_netinfo" ++o.width = "10%" ++ ++pfx = s2:option(DummyValue, "prefix", translate("Prefix")) ++pfx.width = "60%" ++function pfx.cfgvalue(self, section) ++ local v = m.uci:get_list("radvd", section, self.option) ++ local l = { } ++ ++ if not v or #v == 0 or (#v == 1 and #v[1] == 0) then ++ local net = nm:get_network(m.uci:get("radvd", section, "interface")) ++ if net then ++ local ifc = nm:get_interface(net:ifname()) ++ if ifc then ++ local adr ++ for _, adr in ipairs(ifc:ip6addrs()) do ++ if not adr:is6linklocal() then ++ v = adr:string() ++ break ++ end ++ end ++ end ++ end ++ end ++ ++ for v in ut.imatch(v) do ++ v = luci.ip.IPv6(v) ++ if v then ++ l[#l+1] = v:string() ++ end ++ end ++ ++ if #l == 0 then ++ l[1] = "?" ++ end ++ ++ return table.concat(l, ", ") ++end ++ ++o = s2:option(DummyValue, "AdvAutonomous", translate("Autonomous")) ++function o.cfgvalue(...) ++ local v = Value.cfgvalue(...) ++ return v == "1" and translate("yes") or translate("no") ++end ++ ++o = s2:option(DummyValue, "AdvOnLink", translate("On-link")) ++function o.cfgvalue(...) ++ local v = Value.cfgvalue(...) ++ return v == "1" and translate("yes") or translate("no") ++end ++ ++o = s2:option(DummyValue, "AdvValidLifetime", translate("Validity time")) ++function o.cfgvalue(...) ++ local v = Value.cfgvalue(...) or "86400" ++ return translate(v) ++end ++ ++ ++-- ++-- Routes ++-- ++ ++s3 = m:section(TypedSection, "route", translate("Routes")) ++s3.template = "cbi/tblsection" ++s3.extedit = luci.dispatcher.build_url("admin/network/radvd/route/%s") ++s3.addremove = true ++s3.anonymous = true ++ ++function s3.create(...) ++ local id = TypedSection.create(...) ++ luci.http.redirect(s3.extedit % id) ++end ++ ++ ++o = s3:option(Flag, "ignore", translate("Enable")) ++o.rmempty = false ++o.width = "30px" ++function o.cfgvalue(...) ++ local v = Flag.cfgvalue(...) ++ return v == "1" and "0" or "1" ++end ++function o.write(self, section, value) ++ Flag.write(self, section, value == "1" and "0" or "1") ++end ++ ++o = s3:option(DummyValue, "interface", translate("Interface")) ++o.template = "cbi/network_netinfo" ++o.width = "10%" ++ ++o = s3:option(DummyValue, "prefix", translate("Prefix")) ++o.width = "60%" ++o.cfgvalue = pfx.cfgvalue ++ ++o = s3:option(DummyValue, "AdvRouteLifetime", translate("Lifetime")) ++function o.cfgvalue(self, section) ++ local v = Value.cfgvalue(self, section) or "1800" ++ return translate(v) ++end ++ ++o = s3:option(DummyValue, "AdvRoutePreference", translate("Preference")) ++function o.cfgvalue(self, section) ++ local v = Value.cfgvalue(self, section) or "medium" ++ return translate(v) ++end ++ ++ ++-- ++-- RDNSS ++-- ++ ++s4 = m:section(TypedSection, "rdnss", translate("RDNSS")) ++s4.template = "cbi/tblsection" ++s4.extedit = luci.dispatcher.build_url("admin/network/radvd/rdnss/%s") ++s4.addremove = true ++s4.anonymous = true ++ ++function s4.create(...) ++ local id = TypedSection.create(...) ++ luci.http.redirect(s4.extedit % id) ++end ++ ++ ++o = s4:option(Flag, "ignore", translate("Enable")) ++o.rmempty = false ++o.width = "30px" ++function o.cfgvalue(...) ++ local v = Flag.cfgvalue(...) ++ return v == "1" and "0" or "1" ++end ++function o.write(self, section, value) ++ Flag.write(self, section, value == "1" and "0" or "1") ++end ++ ++o = s4:option(DummyValue, "interface", translate("Interface")) ++o.template = "cbi/network_netinfo" ++o.width = "10%" ++ ++o = s4:option(DummyValue, "addr", translate("Address")) ++o.width = "60%" ++o.cfgvalue = pfx.cfgvalue ++ ++o = s4:option(DummyValue, "AdvRDNSSLifetime", translate("Lifetime")) ++function o.cfgvalue(self, section) ++ local v = Value.cfgvalue(self, section) or "1200" ++ return translate(v) ++end ++ ++ ++-- ++-- DNSSL ++-- ++ ++s5 = m:section(TypedSection, "dnssl", translate("DNSSL")) ++s5.template = "cbi/tblsection" ++s5.extedit = luci.dispatcher.build_url("admin/network/radvd/dnssl/%s") ++s5.addremove = true ++s5.anonymous = true ++ ++function s5.create(...) ++ local id = TypedSection.create(...) ++ luci.http.redirect(s5.extedit % id) ++end ++ ++ ++o = s5:option(Flag, "ignore", translate("Enable")) ++o.rmempty = false ++o.width = "30px" ++function o.cfgvalue(...) ++ local v = Flag.cfgvalue(...) ++ return v == "1" and "0" or "1" ++end ++function o.write(self, section, value) ++ Flag.write(self, section, value == "1" and "0" or "1") ++end ++ ++o = s5:option(DummyValue, "interface", translate("Interface")) ++o.template = "cbi/network_netinfo" ++o.width = "10%" ++ ++o = s5:option(DummyValue, "suffix", translate("Suffix")) ++o.width = "60%" ++function o.cfgvalue(self, section) ++ local v = m.uci:get_list("radvd", section, "suffix") ++ local l = { } ++ ++ for v in ut.imatch(v) do ++ l[#l+1] = v ++ end ++ ++ if #l == 0 then ++ l[1] = "?" ++ end ++ ++ return table.concat(l, ", ") ++end ++ ++o = s5:option(DummyValue, "AdvDNSSLLifetime", translate("Lifetime")) ++function o.cfgvalue(self, section) ++ local v = Value.cfgvalue(self, section) or "1200" ++ return translate(v) ++end ++ ++ ++return m +diff --git a/feeds/luci/applications/luci-app-radvd/luasrc/model/cbi/radvd/dnssl.lua b/feeds/luci/applications/luci-app-radvd/luasrc/model/cbi/radvd/dnssl.lua +new file mode 100644 +index 0000000..d331c25 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-radvd/luasrc/model/cbi/radvd/dnssl.lua +@@ -0,0 +1,88 @@ ++-- Copyright 2010 Jo-Philipp Wich ++-- Licensed to the public under the Apache License 2.0. ++ ++local sid = arg[1] ++local utl = require "luci.util" ++ ++m = Map("radvd", translatef("Radvd - DNSSL"), ++ translate("Radvd is a router advertisement daemon for IPv6. " .. ++ "It listens to router solicitations and sends router advertisements " .. ++ "as described in RFC 4861.")) ++ ++m.redirect = luci.dispatcher.build_url("admin/network/radvd") ++ ++if m.uci:get("radvd", sid) ~= "dnssl" then ++ luci.http.redirect(m.redirect) ++ return ++end ++ ++ ++s = m:section(NamedSection, sid, "interface", translate("DNSSL Configuration")) ++s.addremove = false ++ ++ ++-- ++-- General ++-- ++ ++o = s:option(Flag, "ignore", translate("Enable")) ++o.rmempty = false ++ ++function o.cfgvalue(...) ++ local v = Flag.cfgvalue(...) ++ return v == "1" and "0" or "1" ++end ++ ++function o.write(self, section, value) ++ Flag.write(self, section, value == "1" and "0" or "1") ++end ++ ++ ++o = s:option(Value, "interface", translate("Interface"), ++ translate("Specifies the logical interface name this section belongs to")) ++ ++o.template = "cbi/network_netlist" ++o.nocreate = true ++o.optional = false ++ ++function o.formvalue(...) ++ return Value.formvalue(...) or "-" ++end ++ ++function o.validate(self, value) ++ if value == "-" then ++ return nil, translate("Interface required") ++ end ++ return value ++end ++ ++function o.write(self, section, value) ++ m.uci:set("radvd", section, "ignore", 0) ++ m.uci:set("radvd", section, "interface", value) ++end ++ ++ ++o = s:option(DynamicList, "suffix", translate("Suffix"), ++ translate("Advertised Domain Suffixes")) ++ ++o.optional = false ++o.rmempty = false ++o.datatype = "hostname" ++function o.cfgvalue(self, section) ++ local l = { } ++ local v = m.uci:get_list("radvd", section, "suffix") ++ for v in utl.imatch(v) do ++ l[#l+1] = v ++ end ++ return l ++end ++ ++ ++o = s:option(Value, "AdvDNSSLLifetime", translate("Lifetime"), ++ translate("Specifies the maximum duration how long the DNSSL entries are used for name resolution.")) ++ ++o.datatype = 'or(uinteger,"infinity")' ++o.placeholder = 1200 ++ ++ ++return m +diff --git a/feeds/luci/applications/luci-app-radvd/luasrc/model/cbi/radvd/interface.lua b/feeds/luci/applications/luci-app-radvd/luasrc/model/cbi/radvd/interface.lua +new file mode 100644 +index 0000000..e5d0322 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-radvd/luasrc/model/cbi/radvd/interface.lua +@@ -0,0 +1,265 @@ ++-- Copyright 2010 Jo-Philipp Wich ++-- Licensed to the public under the Apache License 2.0. ++ ++local sid = arg[1] ++local utl = require "luci.util" ++ ++m = Map("radvd", translatef("Radvd - Interface %q", "?"), ++ translate("Radvd is a router advertisement daemon for IPv6. " .. ++ "It listens to router solicitations and sends router advertisements " .. ++ "as described in RFC 4861.")) ++ ++m.redirect = luci.dispatcher.build_url("admin/network/radvd") ++ ++if m.uci:get("radvd", sid) ~= "interface" then ++ luci.http.redirect(m.redirect) ++ return ++end ++ ++m.uci:foreach("radvd", "interface", ++ function(s) ++ if s['.name'] == sid and s.interface then ++ m.title = translatef("Radvd - Interface %q", s.interface) ++ return false ++ end ++ end) ++ ++ ++s = m:section(NamedSection, sid, "interface", translate("Interface Configuration")) ++s.addremove = false ++ ++s:tab("general", translate("General")) ++s:tab("timing", translate("Timing")) ++s:tab("mobile", translate("Mobile IPv6")) ++ ++ ++-- ++-- General ++-- ++ ++o = s:taboption("general", Flag, "ignore", translate("Enable")) ++o.rmempty = false ++ ++function o.cfgvalue(...) ++ local v = Flag.cfgvalue(...) ++ return v == "1" and "0" or "1" ++end ++ ++function o.write(self, section, value) ++ Flag.write(self, section, value == "1" and "0" or "1") ++end ++ ++ ++o = s:taboption("general", Value, "interface", translate("Interface"), ++ translate("Specifies the logical interface name this section belongs to")) ++ ++o.template = "cbi/network_netlist" ++o.nocreate = true ++o.optional = false ++ ++function o.formvalue(...) ++ return Value.formvalue(...) or "-" ++end ++ ++function o.validate(self, value) ++ if value == "-" then ++ return nil, translate("Interface required") ++ end ++ return value ++end ++ ++function o.write(self, section, value) ++ m.uci:set("radvd", section, "ignore", 0) ++ m.uci:set("radvd", section, "interface", value) ++end ++ ++ ++o = s:taboption("general", DynamicList, "client", translate("Clients"), ++ translate("Restrict communication to specified clients, leave empty to use multicast")) ++ ++o.rmempty = true ++o.datatype = "ip6addr" ++o.placeholder = "any" ++function o.cfgvalue(...) ++ local v = Value.cfgvalue(...) ++ local l = { } ++ for v in utl.imatch(v) do ++ l[#l+1] = v ++ end ++ return l ++end ++ ++ ++o = s:taboption("general", Flag, "AdvSendAdvert", translate("Enable advertisements"), ++ translate("Enables router advertisements and solicitations")) ++ ++o.rmempty = false ++function o.write(self, section, value) ++ if value == "1" then ++ m.uci:set("radvd", section, "ignore", 0) ++ m.uci:set("radvd", section, "IgnoreIfMissing", 1) ++ end ++ ++ m.uci:set("radvd", section, "AdvSendAdvert", value) ++end ++ ++ ++o = s:taboption("general", Flag, "UnicastOnly", translate("Unicast only"), ++ translate("Indicates that the underlying link is not broadcast capable, prevents unsolicited advertisements from being sent")) ++ ++o:depends("AdvSendAdvert", "1") ++ ++ ++o = s:taboption("general", Flag, "AdvManagedFlag", translate("Managed flag"), ++ translate("Enables the additional stateful administered autoconfiguration protocol (RFC2462)")) ++ ++o:depends("AdvSendAdvert", "1") ++ ++ ++o = s:taboption("general", Flag, "AdvOtherConfigFlag", translate("Configuration flag"), ++ translate("Enables the autoconfiguration of additional, non address information (RFC2462)")) ++ ++o:depends("AdvSendAdvert", "1") ++ ++ ++o = s:taboption("general", Flag, "AdvSourceLLAddress", translate("Source link-layer address"), ++ translate("Includes the link-layer address of the outgoing interface in the RA")) ++ ++o.rmempty = false ++o.default = "1" ++o:depends("AdvSendAdvert", "1") ++ ++ ++o = s:taboption("general", Value, "AdvLinkMTU", translate("Link MTU"), ++ translate("Advertises the given link MTU in the RA if specified. 0 disables MTU advertisements")) ++ ++o.datatype = "uinteger" ++o.placeholder = 0 ++o:depends("AdvSendAdvert", "1") ++ ++ ++o = s:taboption("general", Value, "AdvCurHopLimit", translate("Current hop limit"), ++ translate("Advertises the default Hop Count value for outgoing unicast packets in the RA. 0 disables hopcount advertisements")) ++ ++o.datatype = "uinteger" ++o.optional = false ++o.placeholder = 64 ++o:depends("AdvSendAdvert", "1") ++ ++ ++o = s:taboption("general", ListValue, "AdvDefaultPreference", translate("Default preference"), ++ translate("Advertises the default router preference")) ++ ++o.optional = false ++o.default = "medium" ++o:value("low", translate("low")) ++o:value("medium", translate("medium")) ++o:value("high", translate("high")) ++o:depends("AdvSendAdvert", "1") ++ ++ ++-- ++-- Timing ++-- ++ ++o = s:taboption("timing", Value, "MinRtrAdvInterval", translate("Minimum advertisement interval"), ++ translate("The minimum time allowed between sending unsolicited multicast router advertisements from the interface, in seconds")) ++ ++o.datatype = "uinteger" ++o.optional = false ++o.placeholder = 198 ++o:depends("AdvSendAdvert", "1") ++ ++ ++o = s:taboption("timing", Value, "MaxRtrAdvInterval", translate("Maximum advertisement interval"), ++ translate("The maximum time allowed between sending unsolicited multicast router advertisements from the interface, in seconds")) ++ ++o.datatype = "uinteger" ++o.optional = false ++o.placeholder = 600 ++o:depends("AdvSendAdvert", "1") ++ ++ ++o = s:taboption("timing", Value, "MinDelayBetweenRAs", translate("Minimum advertisement delay"), ++ translate("The minimum time allowed between sending multicast router advertisements from the interface, in seconds")) ++ ++o.datatype = "uinteger" ++o.optional = false ++o.placeholder = 3 ++o:depends("AdvSendAdvert", "1") ++ ++ ++o = s:taboption("timing", Value, "AdvReachableTime", translate("Reachable time"), ++ translate("Advertises assumed reachability time in milliseconds of neighbours in the RA if specified. 0 disables reachability advertisements")) ++ ++o.datatype = "uinteger" ++o.optional = false ++o.placeholder = 0 ++o:depends("AdvSendAdvert", "1") ++ ++ ++o = s:taboption("timing", Value, "AdvRetransTimer", translate("Retransmit timer"), ++ translate("Advertises wait time in milliseconds between Neighbor Solicitation messages in the RA if specified. 0 disables retransmit advertisements")) ++ ++o.datatype = "uinteger" ++o.optional = false ++o.placeholder = 0 ++o:depends("AdvSendAdvert", "1") ++ ++ ++o = s:taboption("timing", Value, "AdvDefaultLifetime", translate("Default lifetime"), ++ translate("Advertises the lifetime of the default router in seconds. 0 indicates that the node is no default router")) ++ ++o.datatype = "uinteger" ++o.optional = false ++o.placeholder = 1800 ++o:depends("AdvSendAdvert", "1") ++ ++ ++-- ++-- Mobile ++-- ++ ++o = s:taboption("mobile", Flag, "AdvHomeAgentFlag", translate("Advertise Home Agent flag"), ++ translate("Advertises Mobile IPv6 Home Agent capability (RFC3775)")) ++ ++o:depends("AdvSendAdvert", "1") ++ ++ ++o = s:taboption("mobile", Flag, "AdvIntervalOpt", translate("Mobile IPv6 interval option"), ++ translate("Include Mobile IPv6 Advertisement Interval option to RA")) ++ ++o:depends({AdvHomeAgentFlag = "1", AdvSendAdvert = "1"}) ++ ++ ++o = s:taboption("mobile", Flag, "AdvHomeAgentInfo", translate("Home Agent information"), ++ translate("Include Home Agent Information in the RA")) ++ ++o:depends({AdvHomeAgentFlag = "1", AdvSendAdvert = "1"}) ++ ++ ++o = s:taboption("mobile", Flag, "AdvMobRtrSupportFlag", translate("Mobile IPv6 router registration"), ++ translate("Advertises Mobile Router registration capability (NEMO Basic)")) ++ ++o:depends({AdvHomeAgentInfo = "1", AdvSendAdvert = "1"}) ++ ++ ++o = s:taboption("mobile", Value, "HomeAgentLifetime", translate("Home Agent lifetime"), ++ translate("Advertises the time in seconds the router is offering Mobile IPv6 Home Agent services")) ++ ++o.datatype = "uinteger" ++o.optional = false ++o.placeholder = 1800 ++o:depends({AdvHomeAgentInfo = "1", AdvSendAdvert = "1"}) ++ ++ ++o = s:taboption("mobile", Value, "HomeAgentPreference", translate("Home Agent preference"), ++ translate("The preference for the Home Agent sending this RA")) ++ ++o.datatype = "uinteger" ++o.optional = false ++o.placeholder = 0 ++o:depends({AdvHomeAgentInfo = "1", AdvSendAdvert = "1"}) ++ ++ ++return m +diff --git a/feeds/luci/applications/luci-app-radvd/luasrc/model/cbi/radvd/prefix.lua b/feeds/luci/applications/luci-app-radvd/luasrc/model/cbi/radvd/prefix.lua +new file mode 100644 +index 0000000..a2b4285 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-radvd/luasrc/model/cbi/radvd/prefix.lua +@@ -0,0 +1,128 @@ ++-- Copyright 2010 Jo-Philipp Wich ++-- Licensed to the public under the Apache License 2.0. ++ ++local sid = arg[1] ++local utl = require "luci.util" ++ ++m = Map("radvd", translatef("Radvd - Prefix"), ++ translate("Radvd is a router advertisement daemon for IPv6. " .. ++ "It listens to router solicitations and sends router advertisements " .. ++ "as described in RFC 4861.")) ++ ++m.redirect = luci.dispatcher.build_url("admin/network/radvd") ++ ++if m.uci:get("radvd", sid) ~= "prefix" then ++ luci.http.redirect(m.redirect) ++ return ++end ++ ++ ++s = m:section(NamedSection, sid, "interface", translate("Prefix Configuration")) ++s.addremove = false ++ ++s:tab("general", translate("General")) ++s:tab("advanced", translate("Advanced")) ++ ++ ++-- ++-- General ++-- ++ ++o = s:taboption("general", Flag, "ignore", translate("Enable")) ++o.rmempty = false ++ ++function o.cfgvalue(...) ++ local v = Flag.cfgvalue(...) ++ return v == "1" and "0" or "1" ++end ++ ++function o.write(self, section, value) ++ Flag.write(self, section, value == "1" and "0" or "1") ++end ++ ++ ++o = s:taboption("general", Value, "interface", translate("Interface"), ++ translate("Specifies the logical interface name this section belongs to")) ++ ++o.template = "cbi/network_netlist" ++o.nocreate = true ++o.optional = false ++ ++function o.formvalue(...) ++ return Value.formvalue(...) or "-" ++end ++ ++function o.validate(self, value) ++ if value == "-" then ++ return nil, translate("Interface required") ++ end ++ return value ++end ++ ++function o.write(self, section, value) ++ m.uci:set("radvd", section, "ignore", 0) ++ m.uci:set("radvd", section, "interface", value) ++end ++ ++ ++o = s:taboption("general", DynamicList, "prefix", translate("Prefixes"), ++ translate("Advertised IPv6 prefixes. If empty, the current interface prefix is used")) ++ ++o.optional = true ++o.datatype = "ip6addr" ++o.placeholder = translate("default") ++function o.cfgvalue(self, section) ++ local l = { } ++ local v = m.uci:get_list("radvd", section, "prefix") ++ for v in utl.imatch(v) do ++ l[#l+1] = v ++ end ++ return l ++end ++ ++ ++o = s:taboption("general", Flag, "AdvOnLink", translate("On-link determination"), ++ translate("Indicates that this prefix can be used for on-link determination (RFC4861)")) ++ ++o.rmempty = false ++o.default = "1" ++ ++ ++o = s:taboption("general", Flag, "AdvAutonomous", translate("Autonomous"), ++ translate("Indicates that this prefix can be used for autonomous address configuration (RFC4862)")) ++ ++o.rmempty = false ++o.default = "1" ++ ++ ++-- ++-- Advanced ++-- ++ ++o = s:taboption("advanced", Flag, "AdvRouterAddr", translate("Advertise router address"), ++ translate("Indicates that the address of interface is sent instead of network prefix, as is required by Mobile IPv6")) ++ ++ ++o = s:taboption("advanced", Value, "AdvValidLifetime", translate("Valid lifetime"), ++ translate("Advertises the length of time in seconds that the prefix is valid for the purpose of on-link determination.")) ++ ++o.datatype = 'or(uinteger,"infinity")' ++o.placeholder = 86400 ++ ++ ++o = s:taboption("advanced", Value, "AdvPreferredLifetime", translate("Preferred lifetime"), ++ translate("Advertises the length of time in seconds that addresses generated from the prefix via stateless address autoconfiguration remain preferred.")) ++ ++o.datatype = 'or(uinteger,"infinity")' ++o.placeholder = 14400 ++ ++ ++o = s:taboption("advanced", Value, "Base6to4Interface", translate("6to4 interface"), ++ translate("Specifies a logical interface name to derive a 6to4 prefix from. The interfaces public IPv4 address is combined with 2002::/3 and the value of the prefix option")) ++ ++o.template = "cbi/network_netlist" ++o.nocreate = true ++o.unspecified = true ++ ++ ++return m +diff --git a/feeds/luci/applications/luci-app-radvd/luasrc/model/cbi/radvd/rdnss.lua b/feeds/luci/applications/luci-app-radvd/luasrc/model/cbi/radvd/rdnss.lua +new file mode 100644 +index 0000000..d6588ac +--- /dev/null ++++ b/feeds/luci/applications/luci-app-radvd/luasrc/model/cbi/radvd/rdnss.lua +@@ -0,0 +1,89 @@ ++-- Copyright 2010 Jo-Philipp Wich ++-- Licensed to the public under the Apache License 2.0. ++ ++local sid = arg[1] ++local utl = require "luci.util" ++ ++m = Map("radvd", translatef("Radvd - RDNSS"), ++ translate("Radvd is a router advertisement daemon for IPv6. " .. ++ "It listens to router solicitations and sends router advertisements " .. ++ "as described in RFC 4861.")) ++ ++m.redirect = luci.dispatcher.build_url("admin/network/radvd") ++ ++if m.uci:get("radvd", sid) ~= "rdnss" then ++ luci.http.redirect(m.redirect) ++ return ++end ++ ++ ++s = m:section(NamedSection, sid, "interface", translate("RDNSS Configuration")) ++s.addremove = false ++ ++ ++-- ++-- General ++-- ++ ++o = s:option(Flag, "ignore", translate("Enable")) ++o.rmempty = false ++ ++function o.cfgvalue(...) ++ local v = Flag.cfgvalue(...) ++ return v == "1" and "0" or "1" ++end ++ ++function o.write(self, section, value) ++ Flag.write(self, section, value == "1" and "0" or "1") ++end ++ ++ ++o = s:option(Value, "interface", translate("Interface"), ++ translate("Specifies the logical interface name this section belongs to")) ++ ++o.template = "cbi/network_netlist" ++o.nocreate = true ++o.optional = false ++ ++function o.formvalue(...) ++ return Value.formvalue(...) or "-" ++end ++ ++function o.validate(self, value) ++ if value == "-" then ++ return nil, translate("Interface required") ++ end ++ return value ++end ++ ++function o.write(self, section, value) ++ m.uci:set("radvd", section, "ignore", 0) ++ m.uci:set("radvd", section, "interface", value) ++end ++ ++ ++o = s:option(DynamicList, "addr", translate("Addresses"), ++ translate("Advertised IPv6 RDNSS. If empty, the current IPv6 address of the interface is used")) ++ ++o.optional = false ++o.rmempty = true ++o.datatype = "ip6addr" ++o.placeholder = translate("default") ++function o.cfgvalue(self, section) ++ local l = { } ++ local v = m.uci:get_list("radvd", section, "addr") ++ for v in utl.imatch(v) do ++ l[#l+1] = v ++ end ++ return l ++end ++ ++ ++o = s:option(Value, "AdvRDNSSLifetime", translate("Lifetime"), ++ translate("Specifies the maximum duration how long the RDNSS entries are used for name resolution.")) ++ ++o.datatype = 'or(uinteger,"infinity")' ++o.placeholder = 1200 ++ ++ ++return m +diff --git a/feeds/luci/applications/luci-app-radvd/luasrc/model/cbi/radvd/route.lua b/feeds/luci/applications/luci-app-radvd/luasrc/model/cbi/radvd/route.lua +new file mode 100644 +index 0000000..1aac27a +--- /dev/null ++++ b/feeds/luci/applications/luci-app-radvd/luasrc/model/cbi/radvd/route.lua +@@ -0,0 +1,97 @@ ++-- Copyright 2010 Jo-Philipp Wich ++-- Licensed to the public under the Apache License 2.0. ++ ++local sid = arg[1] ++local utl = require "luci.util" ++ ++m = Map("radvd", translatef("Radvd - Route"), ++ translate("Radvd is a router advertisement daemon for IPv6. " .. ++ "It listens to router solicitations and sends router advertisements " .. ++ "as described in RFC 4861.")) ++ ++m.redirect = luci.dispatcher.build_url("admin/network/radvd") ++ ++if m.uci:get("radvd", sid) ~= "route" then ++ luci.http.redirect(m.redirect) ++ return ++end ++ ++ ++s = m:section(NamedSection, sid, "interface", translate("Route Configuration")) ++s.addremove = false ++ ++ ++-- ++-- General ++-- ++ ++o = s:option(Flag, "ignore", translate("Enable")) ++o.rmempty = false ++ ++function o.cfgvalue(...) ++ local v = Flag.cfgvalue(...) ++ return v == "1" and "0" or "1" ++end ++ ++function o.write(self, section, value) ++ Flag.write(self, section, value == "1" and "0" or "1") ++end ++ ++ ++o = s:option(Value, "interface", translate("Interface"), ++ translate("Specifies the logical interface name this section belongs to")) ++ ++o.template = "cbi/network_netlist" ++o.nocreate = true ++o.optional = false ++ ++function o.formvalue(...) ++ return Value.formvalue(...) or "-" ++end ++ ++function o.validate(self, value) ++ if value == "-" then ++ return nil, translate("Interface required") ++ end ++ return value ++end ++ ++function o.write(self, section, value) ++ m.uci:set("radvd", section, "ignore", 0) ++ m.uci:set("radvd", section, "interface", value) ++end ++ ++ ++o = s:option(DynamicList, "prefix", translate("Prefixes"), ++ translate("Advertised IPv6 prefixes")) ++ ++o.rmempty = false ++o.datatype = "ip6addr" ++o.placeholder = translate("default") ++function o.cfgvalue(self, section) ++ local l = { } ++ local v = m.uci:get_list("radvd", section, "prefix") ++ for v in utl.imatch(v) do ++ l[#l+1] = v ++ end ++ return l ++end ++ ++ ++o = s:option(Value, "AdvRouteLifetime", translate("Lifetime"), ++ translate("Specifies the lifetime associated with the route in seconds.")) ++ ++o.datatype = 'or(uinteger,"infinity")' ++o.placeholder = 1800 ++ ++ ++o = s:option(ListValue, "AdvRoutePreference", translate("Preference"), ++ translate("Specifies the preference associated with the default router")) ++ ++o.default = "medium" ++o:value("low", translate("low")) ++o:value("medium", translate("medium")) ++o:value("high", translate("high")) ++ ++ ++return m +diff --git a/feeds/luci/applications/luci-app-radvd/po/ca/radvd.po b/feeds/luci/applications/luci-app-radvd/po/ca/radvd.po +new file mode 100644 +index 0000000..a9a317d +--- /dev/null ++++ b/feeds/luci/applications/luci-app-radvd/po/ca/radvd.po +@@ -0,0 +1,382 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"PO-Revision-Date: 2014-06-02 21:41+0200\n" ++"Last-Translator: Alex \n" ++"Language-Team: German\n" ++"Language: ca\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n != 1);\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "6to4 interface" ++msgstr "Interfície 6to4" ++ ++msgid "Address" ++msgstr "Adreça" ++ ++msgid "Addresses" ++msgstr "Adreces" ++ ++msgid "Advanced" ++msgstr "Avançat" ++ ++msgid "Advertise Home Agent flag" ++msgstr "" ++ ++msgid "Advertise router address" ++msgstr "" ++ ++msgid "Advertised Domain Suffixes" ++msgstr "Sufixos de domini publicats" ++ ++msgid "" ++"Advertised IPv6 RDNSS. If empty, the current IPv6 address of the interface " ++"is used" ++msgstr "" ++ ++msgid "Advertised IPv6 prefixes" ++msgstr "Prefixos IPv6 publicats" ++ ++msgid "" ++"Advertised IPv6 prefixes. If empty, the current interface prefix is used" ++msgstr "" ++ ++msgid "Advertises Mobile IPv6 Home Agent capability (RFC3775)" ++msgstr "" ++ ++msgid "Advertises Mobile Router registration capability (NEMO Basic)" ++msgstr "" ++ ++msgid "" ++"Advertises assumed reachability time in milliseconds of neighbours in the RA " ++"if specified. 0 disables reachability advertisements" ++msgstr "" ++ ++msgid "" ++"Advertises the default Hop Count value for outgoing unicast packets in the " ++"RA. 0 disables hopcount advertisements" ++msgstr "" ++ ++msgid "Advertises the default router preference" ++msgstr "" ++ ++msgid "" ++"Advertises the given link MTU in the RA if specified. 0 disables MTU " ++"advertisements" ++msgstr "" ++ ++msgid "" ++"Advertises the length of time in seconds that addresses generated from the " ++"prefix via stateless address autoconfiguration remain preferred." ++msgstr "" ++ ++msgid "" ++"Advertises the length of time in seconds that the prefix is valid for the " ++"purpose of on-link determination." ++msgstr "" ++ ++msgid "" ++"Advertises the lifetime of the default router in seconds. 0 indicates that " ++"the node is no default router" ++msgstr "" ++ ++msgid "" ++"Advertises the time in seconds the router is offering Mobile IPv6 Home Agent " ++"services" ++msgstr "" ++ ++msgid "" ++"Advertises wait time in milliseconds between Neighbor Solicitation messages " ++"in the RA if specified. 0 disables retransmit advertisements" ++msgstr "" ++ ++msgid "Advertising" ++msgstr "Publicació" ++ ++msgid "Autonomous" ++msgstr "Autònom" ++ ++msgid "Clients" ++msgstr "Clients" ++ ++msgid "Configuration flag" ++msgstr "" ++ ++msgid "Current hop limit" ++msgstr "" ++ ++msgid "DNSSL" ++msgstr "DNSSL" ++ ++msgid "DNSSL Configuration" ++msgstr "Configuració DNSSL" ++ ++msgid "Default lifetime" ++msgstr "" ++ ++msgid "Default preference" ++msgstr "Preferència per defecte" ++ ++msgid "Enable" ++msgstr "Habilita" ++ ++msgid "Enable advertisements" ++msgstr "Habilita la publicitat" ++ ++msgid "Enables router advertisements and solicitations" ++msgstr "" ++ ++msgid "" ++"Enables the additional stateful administered autoconfiguration protocol " ++"(RFC2462)" ++msgstr "" ++ ++msgid "" ++"Enables the autoconfiguration of additional, non address information " ++"(RFC2462)" ++msgstr "" ++ ++msgid "General" ++msgstr "General" ++ ++msgid "Home Agent information" ++msgstr "" ++ ++msgid "Home Agent lifetime" ++msgstr "" ++ ++msgid "Home Agent preference" ++msgstr "" ++ ++msgid "Include Home Agent Information in the RA" ++msgstr "" ++ ++msgid "Include Mobile IPv6 Advertisement Interval option to RA" ++msgstr "" ++ ++msgid "Includes the link-layer address of the outgoing interface in the RA" ++msgstr "" ++ ++msgid "" ++"Indicates that the address of interface is sent instead of network prefix, " ++"as is required by Mobile IPv6" ++msgstr "" ++ ++msgid "" ++"Indicates that the underlying link is not broadcast capable, prevents " ++"unsolicited advertisements from being sent" ++msgstr "" ++"Indica que la enllaç subjacent no és capaç de la difusió, prevén que les " ++"publicitats no sol·licitats es enviïn" ++ ++msgid "" ++"Indicates that this prefix can be used for autonomous address configuration " ++"(RFC4862)" ++msgstr "" ++ ++msgid "" ++"Indicates that this prefix can be used for on-link determination (RFC4861)" ++msgstr "" ++ ++msgid "Interface" ++msgstr "Interfície" ++ ++msgid "Interface Configuration" ++msgstr "Configuració d'interfície" ++ ++msgid "Interface required" ++msgstr "Interfície requerida" ++ ++msgid "Interfaces" ++msgstr "Interfícies" ++ ++msgid "Lifetime" ++msgstr "" ++ ++msgid "Link MTU" ++msgstr "" ++ ++msgid "Managed flag" ++msgstr "" ++ ++msgid "Max. interval" ++msgstr "" ++ ++msgid "Maximum advertisement interval" ++msgstr "" ++ ++msgid "Minimum advertisement delay" ++msgstr "" ++ ++msgid "Minimum advertisement interval" ++msgstr "" ++ ++msgid "Mobile IPv6" ++msgstr "IPv6 mòbil" ++ ++msgid "Mobile IPv6 interval option" ++msgstr "Opció d'interval d'IPv6 mòbil" ++ ++msgid "Mobile IPv6 router registration" ++msgstr "" ++ ++msgid "Multicast" ++msgstr "Difusió selectiva" ++ ++msgid "On-link" ++msgstr "" ++ ++msgid "On-link determination" ++msgstr "" ++ ++msgid "Preference" ++msgstr "" ++ ++msgid "Preferred lifetime" ++msgstr "" ++ ++msgid "Prefix" ++msgstr "Prefix" ++ ++msgid "Prefix Configuration" ++msgstr "Configuració de prefix" ++ ++msgid "Prefixes" ++msgstr "Prefixos" ++ ++msgid "RDNSS" ++msgstr "RDNSS" ++ ++msgid "RDNSS Configuration" ++msgstr "Configuració RDNSS" ++ ++msgid "Radvd" ++msgstr "Radvd" ++ ++msgid "Radvd - DNSSL" ++msgstr "Radvd - DNSSL" ++ ++msgid "Radvd - Interface %q" ++msgstr "Radvd - Interfície %q" ++ ++msgid "Radvd - Prefix" ++msgstr "Radvd - Prefix" ++ ++msgid "Radvd - RDNSS" ++msgstr "Radvd - RDNSS" ++ ++msgid "Radvd - Route" ++msgstr "Radvd - Ruta" ++ ++msgid "" ++"Radvd is a router advertisement daemon for IPv6. It listens to router " ++"solicitations and sends router advertisements as described in RFC 4861." ++msgstr "" ++"El Radvd és un dimoni de publicitat d'encaminador per IPv6. Escolta per " ++"sol·licituds i envia publicitats d'encaminador com descrit en RFC 4861." ++ ++msgid "Reachable time" ++msgstr "" ++ ++msgid "" ++"Restrict communication to specified clients, leave empty to use multicast" ++msgstr "" ++"Restringeix la comunicació a clients especificats, deixeu en blanc per " ++"utilitzar la difusió selectiva" ++ ++msgid "Retransmit timer" ++msgstr "Temporitzador de retransmissió" ++ ++msgid "Route Configuration" ++msgstr "Configuració de ruta" ++ ++msgid "Routes" ++msgstr "Rutes" ++ ++msgid "Source link-layer address" ++msgstr "" ++ ++msgid "" ++"Specifies a logical interface name to derive a 6to4 prefix from. The " ++"interfaces public IPv4 address is combined with 2002::/3 and the value of " ++"the prefix option" ++msgstr "" ++ ++msgid "Specifies the lifetime associated with the route in seconds." ++msgstr "" ++ ++msgid "Specifies the logical interface name this section belongs to" ++msgstr "" ++ ++msgid "" ++"Specifies the maximum duration how long the DNSSL entries are used for name " ++"resolution." ++msgstr "" ++ ++msgid "" ++"Specifies the maximum duration how long the RDNSS entries are used for name " ++"resolution." ++msgstr "" ++ ++msgid "Specifies the preference associated with the default router" ++msgstr "" ++ ++msgid "Suffix" ++msgstr "Sufix" ++ ++msgid "" ++"The maximum time allowed between sending unsolicited multicast router " ++"advertisements from the interface, in seconds" ++msgstr "" ++"El temps màxim permès entre enviar publicitats d'encaminador de difusió " ++"selectiva no sol·licitats des de la interfície, en segons" ++ ++msgid "" ++"The minimum time allowed between sending multicast router advertisements " ++"from the interface, in seconds" ++msgstr "" ++"El temps mínim permès entre enviar publicitats d'encaminador de difusió " ++"selectiva des de la interfície, en segons" ++ ++msgid "" ++"The minimum time allowed between sending unsolicited multicast router " ++"advertisements from the interface, in seconds" ++msgstr "" ++"El temps mínim permès entre enviar publicitats d'encaminador de difusió " ++"selectiva no sol·licitats des de la interfície, en segons" ++ ++msgid "The preference for the Home Agent sending this RA" ++msgstr "" ++ ++msgid "Timing" ++msgstr "Sincronització" ++ ++msgid "Unicast only" ++msgstr "Només unidifusió" ++ ++msgid "Valid lifetime" ++msgstr "Durada de vida vàlida" ++ ++msgid "Validity time" ++msgstr "" ++ ++msgid "default" ++msgstr "per defecte" ++ ++msgid "high" ++msgstr "alt" ++ ++msgid "low" ++msgstr "baix" ++ ++msgid "medium" ++msgstr "mitjà" ++ ++msgid "no" ++msgstr "no" ++ ++msgid "yes" ++msgstr "sí" +diff --git a/feeds/luci/applications/luci-app-radvd/po/cs/radvd.po b/feeds/luci/applications/luci-app-radvd/po/cs/radvd.po +new file mode 100644 +index 0000000..ab4e4af +--- /dev/null ++++ b/feeds/luci/applications/luci-app-radvd/po/cs/radvd.po +@@ -0,0 +1,389 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"PO-Revision-Date: 2014-08-04 19:04+0200\n" ++"Last-Translator: KubaCZ \n" ++"Language-Team: none\n" ++"Language: cs\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "6to4 interface" ++msgstr "6to4 rozhraní" ++ ++msgid "Address" ++msgstr "Adresa" ++ ++msgid "Addresses" ++msgstr "Adresy" ++ ++msgid "Advanced" ++msgstr "PokroÄilé" ++ ++msgid "Advertise Home Agent flag" ++msgstr "" ++ ++msgid "Advertise router address" ++msgstr "Oznamovat adresu routeru" ++ ++msgid "Advertised Domain Suffixes" ++msgstr "Oznamované doménové přípony" ++ ++msgid "" ++"Advertised IPv6 RDNSS. If empty, the current IPv6 address of the interface " ++"is used" ++msgstr "" ++"Oznamované IPv6 RDNSS. Pokud prázdné, bude použita stávající IPv6 adresa " ++"rozhraní." ++ ++msgid "Advertised IPv6 prefixes" ++msgstr "Oznamované IPv6 prefixy" ++ ++msgid "" ++"Advertised IPv6 prefixes. If empty, the current interface prefix is used" ++msgstr "" ++"Oznamované IPv6 prefixy. Pokud prázdné, bude použit stávající prefix na " ++"rozhraní." ++ ++msgid "Advertises Mobile IPv6 Home Agent capability (RFC3775)" ++msgstr "" ++ ++msgid "Advertises Mobile Router registration capability (NEMO Basic)" ++msgstr "" ++ ++msgid "" ++"Advertises assumed reachability time in milliseconds of neighbours in the RA " ++"if specified. 0 disables reachability advertisements" ++msgstr "" ++"Oznamovaná doba za kterou by sousední stroje mÄ›ly být dosažitelné. 0 znamená " ++"neoznamovat." ++ ++msgid "" ++"Advertises the default Hop Count value for outgoing unicast packets in the " ++"RA. 0 disables hopcount advertisements" ++msgstr "" ++"Oznamovaný výchozí poÄet hopů pro odchozí unicast pakety. 0 vypne oznamování " ++"poÄtu hopů." ++ ++msgid "Advertises the default router preference" ++msgstr "Oznamovaný preferovaný router." ++ ++msgid "" ++"Advertises the given link MTU in the RA if specified. 0 disables MTU " ++"advertisements" ++msgstr "Oznamovat MTU linky. 0 vypne oznamování MTU." ++ ++msgid "" ++"Advertises the length of time in seconds that addresses generated from the " ++"prefix via stateless address autoconfiguration remain preferred." ++msgstr "" ++"Oznamovaný poÄet sekund po kterých adresa generovaná z prefixu bezestavové " ++"konfigurace zůstává preferovaná." ++ ++msgid "" ++"Advertises the length of time in seconds that the prefix is valid for the " ++"purpose of on-link determination." ++msgstr "" ++"Oznamovaný poÄet sekund po kterou je prefix validní pro potÅ™eby zjiÅ¡tÄ›ní " ++"stavu on-link/off-link." ++ ++msgid "" ++"Advertises the lifetime of the default router in seconds. 0 indicates that " ++"the node is no default router" ++msgstr "" ++"Oznamovaný poÄet sekund k vyprÅ¡ení platnosti preference routeru. 0 zanÄí že " ++"není žádný router preferován." ++ ++msgid "" ++"Advertises the time in seconds the router is offering Mobile IPv6 Home Agent " ++"services" ++msgstr "" ++"Oznamovaný poÄet sekund k vyprÅ¡ení nabízení služeb Mobile IPv6 Home Agenta" ++ ++msgid "" ++"Advertises wait time in milliseconds between Neighbor Solicitation messages " ++"in the RA if specified. 0 disables retransmit advertisements" ++msgstr "" ++"Oznamovaný poÄet milisekund mezi Neighbor Solicitation zprávamy. 0 vypne " ++"oznamování." ++ ++msgid "Advertising" ++msgstr "" ++ ++msgid "Autonomous" ++msgstr "Autonomní" ++ ++msgid "Clients" ++msgstr "Klienti" ++ ++msgid "Configuration flag" ++msgstr "KonfiguraÄní volba" ++ ++msgid "Current hop limit" ++msgstr "Aktuální limit poÄtu hopů" ++ ++msgid "DNSSL" ++msgstr "DNSSL" ++ ++msgid "DNSSL Configuration" ++msgstr "Konfigurace DNSSL" ++ ++msgid "Default lifetime" ++msgstr "Výchozí Äasový limit" ++ ++msgid "Default preference" ++msgstr "Výchozí preference" ++ ++msgid "Enable" ++msgstr "Povolit" ++ ++msgid "Enable advertisements" ++msgstr "Povolit oznamování" ++ ++msgid "Enables router advertisements and solicitations" ++msgstr "Povolí oznamování routeru a hledání sousedů" ++ ++msgid "" ++"Enables the additional stateful administered autoconfiguration protocol " ++"(RFC2462)" ++msgstr "" ++"Povolí přídavný stavový administrovaný autokonfiguraÄní protokol (RFC2462)" ++ ++msgid "" ++"Enables the autoconfiguration of additional, non address information " ++"(RFC2462)" ++msgstr "Povolí autokonfiguraci přídavného, neadresních informací (RFC2462)" ++ ++msgid "General" ++msgstr "Obecné" ++ ++msgid "Home Agent information" ++msgstr "Informace Home Agenta" ++ ++msgid "Home Agent lifetime" ++msgstr "ÄŒasový limit Home Agenta" ++ ++msgid "Home Agent preference" ++msgstr "Preferovaný Home Agent" ++ ++msgid "Include Home Agent Information in the RA" ++msgstr "Zahrnout informace o Home Agentovi v oznámeních" ++ ++msgid "Include Mobile IPv6 Advertisement Interval option to RA" ++msgstr "" ++ ++msgid "Includes the link-layer address of the outgoing interface in the RA" ++msgstr "" ++ ++msgid "" ++"Indicates that the address of interface is sent instead of network prefix, " ++"as is required by Mobile IPv6" ++msgstr "" ++ ++msgid "" ++"Indicates that the underlying link is not broadcast capable, prevents " ++"unsolicited advertisements from being sent" ++msgstr "" ++ ++msgid "" ++"Indicates that this prefix can be used for autonomous address configuration " ++"(RFC4862)" ++msgstr "" ++ ++msgid "" ++"Indicates that this prefix can be used for on-link determination (RFC4861)" ++msgstr "" ++ ++msgid "Interface" ++msgstr "Rozhraní" ++ ++msgid "Interface Configuration" ++msgstr "Konfigurace rozhraní" ++ ++msgid "Interface required" ++msgstr "Rozhraní vyžadováno" ++ ++msgid "Interfaces" ++msgstr "Rozhraní" ++ ++msgid "Lifetime" ++msgstr "" ++ ++msgid "Link MTU" ++msgstr "" ++ ++msgid "Managed flag" ++msgstr "" ++ ++msgid "Max. interval" ++msgstr "Max. interval" ++ ++msgid "Maximum advertisement interval" ++msgstr "" ++ ++msgid "Minimum advertisement delay" ++msgstr "" ++ ++msgid "Minimum advertisement interval" ++msgstr "" ++ ++msgid "Mobile IPv6" ++msgstr "" ++ ++msgid "Mobile IPv6 interval option" ++msgstr "" ++ ++msgid "Mobile IPv6 router registration" ++msgstr "" ++ ++msgid "Multicast" ++msgstr "Multicast" ++ ++msgid "On-link" ++msgstr "" ++ ++msgid "On-link determination" ++msgstr "" ++ ++msgid "Preference" ++msgstr "" ++ ++msgid "Preferred lifetime" ++msgstr "" ++ ++msgid "Prefix" ++msgstr "Prefix" ++ ++msgid "Prefix Configuration" ++msgstr "Nastavení prefixu" ++ ++msgid "Prefixes" ++msgstr "Prefixy" ++ ++msgid "RDNSS" ++msgstr "RDNSS" ++ ++msgid "RDNSS Configuration" ++msgstr "Konfigurace RDNSS" ++ ++msgid "Radvd" ++msgstr "Radvd" ++ ++msgid "Radvd - DNSSL" ++msgstr "Radvd - DNSSL" ++ ++msgid "Radvd - Interface %q" ++msgstr "Radvd - rozhraní %q" ++ ++msgid "Radvd - Prefix" ++msgstr "Radvd - Prefix" ++ ++msgid "Radvd - RDNSS" ++msgstr "Radvd - RDNSS" ++ ++msgid "Radvd - Route" ++msgstr "Radvd - Route" ++ ++msgid "" ++"Radvd is a router advertisement daemon for IPv6. It listens to router " ++"solicitations and sends router advertisements as described in RFC 4861." ++msgstr "" ++ ++msgid "Reachable time" ++msgstr "Dostupný Äas" ++ ++msgid "" ++"Restrict communication to specified clients, leave empty to use multicast" ++msgstr "" ++ ++msgid "Retransmit timer" ++msgstr "" ++ ++msgid "Route Configuration" ++msgstr "" ++ ++msgid "Routes" ++msgstr "Trasy" ++ ++msgid "Source link-layer address" ++msgstr "" ++ ++msgid "" ++"Specifies a logical interface name to derive a 6to4 prefix from. The " ++"interfaces public IPv4 address is combined with 2002::/3 and the value of " ++"the prefix option" ++msgstr "" ++ ++msgid "Specifies the lifetime associated with the route in seconds." ++msgstr "" ++ ++msgid "Specifies the logical interface name this section belongs to" ++msgstr "" ++ ++msgid "" ++"Specifies the maximum duration how long the DNSSL entries are used for name " ++"resolution." ++msgstr "" ++ ++msgid "" ++"Specifies the maximum duration how long the RDNSS entries are used for name " ++"resolution." ++msgstr "" ++ ++msgid "Specifies the preference associated with the default router" ++msgstr "" ++ ++msgid "Suffix" ++msgstr "Suffix" ++ ++msgid "" ++"The maximum time allowed between sending unsolicited multicast router " ++"advertisements from the interface, in seconds" ++msgstr "" ++ ++msgid "" ++"The minimum time allowed between sending multicast router advertisements " ++"from the interface, in seconds" ++msgstr "" ++ ++msgid "" ++"The minimum time allowed between sending unsolicited multicast router " ++"advertisements from the interface, in seconds" ++msgstr "" ++ ++msgid "The preference for the Home Agent sending this RA" ++msgstr "" ++ ++msgid "Timing" ++msgstr "NaÄasování" ++ ++msgid "Unicast only" ++msgstr "Pouze unicast" ++ ++msgid "Valid lifetime" ++msgstr "" ++ ++msgid "Validity time" ++msgstr "Doba platnosti" ++ ++msgid "default" ++msgstr "výchozí" ++ ++msgid "high" ++msgstr "vysoká" ++ ++msgid "low" ++msgstr "nízká" ++ ++msgid "medium" ++msgstr "stÅ™ední" ++ ++msgid "no" ++msgstr "ne" ++ ++# ano ++msgid "yes" ++msgstr "ano" +diff --git a/feeds/luci/applications/luci-app-radvd/po/de/radvd.po b/feeds/luci/applications/luci-app-radvd/po/de/radvd.po +new file mode 100644 +index 0000000..a294619 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-radvd/po/de/radvd.po +@@ -0,0 +1,483 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"PO-Revision-Date: 2012-04-15 16:46+0200\n" ++"Last-Translator: Jo-Philipp \n" ++"Language-Team: German\n" ++"Language: de\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n != 1);\n" ++"X-Generator: Pootle 2.0.4\n" ++ ++msgid "6to4 interface" ++msgstr "6to4-Schnittstelle" ++ ++msgid "Address" ++msgstr "Adresse" ++ ++msgid "Addresses" ++msgstr "Adressen" ++ ++msgid "Advanced" ++msgstr "Erweitert" ++ ++msgid "Advertise Home Agent flag" ++msgstr "Home-Agent Funktionalität ankündigen" ++ ++msgid "Advertise router address" ++msgstr "Router-Adresse ankündigen" ++ ++msgid "Advertised Domain Suffixes" ++msgstr "Angekündigte Domain-Suffixes" ++ ++msgid "" ++"Advertised IPv6 RDNSS. If empty, the current IPv6 address of the interface " ++"is used" ++msgstr "" ++"Angekündigte rekursive IPv6 DNS Server. Wenn leer wird die aktuelle IPv6-" ++"Adresse der Schnittstelle verwendet" ++ ++msgid "Advertised IPv6 prefixes" ++msgstr "Angekündigte IPv6-Prefixe" ++ ++msgid "" ++"Advertised IPv6 prefixes. If empty, the current interface prefix is used" ++msgstr "" ++"Angekündigte IPv6-Subnetze in CIDR-Notation. Wenn leer wird das aktuelle " ++"IPv6-Prefix der Schnittstelle verwendet" ++ ++msgid "Advertises Mobile IPv6 Home Agent capability (RFC3775)" ++msgstr "Kündigt \"Mobile IPv6 Home Agent\"-Fähigkeit an (RFC3775)" ++ ++msgid "Advertises Mobile Router registration capability (NEMO Basic)" ++msgstr "Kündigt \"Mobile Router Registration\"-Fähigkeit an (NEMO Basic)" ++ ++msgid "" ++"Advertises assumed reachability time in milliseconds of neighbours in the RA " ++"if specified. 0 disables reachability advertisements" ++msgstr "" ++"Kündigt die angenommene Erreichbarkeit von Nachbarn als Zeitspanne in " ++"Millisekunden an, sofern gegeben. Der Wert \"0\" deaktiviert " ++"Erreichbarkeitsankündigungen" ++ ++msgid "" ++"Advertises the default Hop Count value for outgoing unicast packets in the " ++"RA. 0 disables hopcount advertisements" ++msgstr "" ++"Kündigt den Standard Hop-Count-Wert für ausgehende Unicast-Pakete an. Der " ++"Wert \"0\" deaktiviert Hop-Count-Ankündigungen" ++ ++msgid "Advertises the default router preference" ++msgstr "Kündigt das Vorhandensein des Default-Routers an" ++ ++msgid "" ++"Advertises the given link MTU in the RA if specified. 0 disables MTU " ++"advertisements" ++msgstr "" ++"Kündigt die gegebene Verbindungs-MTU an wenn gegeben. Der Wert \"0\" " ++"deaktiviert MTU-Ankündigungen" ++ ++msgid "" ++"Advertises the length of time in seconds that addresses generated from the " ++"prefix via stateless address autoconfiguration remain preferred." ++msgstr "" ++"Kündigt den Zeitraum an, in dem die vom angekündigtem Prefix generierte " ++"Adresse bevorzugt bleibt, als Zeitspanne in Sekunden." ++ ++msgid "" ++"Advertises the length of time in seconds that the prefix is valid for the " ++"purpose of on-link determination." ++msgstr "" ++"Kündigt den Zeitraum in Sekunden an, in dem der Prefix für On-Link-" ++"Ermittlung gültig ist." ++ ++msgid "" ++"Advertises the lifetime of the default router in seconds. 0 indicates that " ++"the node is no default router" ++msgstr "" ++"Kündigt die Gültigskeitsdauer des Defaultrouters in Sekunden an. Der Wert \"0" ++"\" impliziert dass dieser Knoten kein Default-Router ist" ++ ++msgid "" ++"Advertises the time in seconds the router is offering Mobile IPv6 Home Agent " ++"services" ++msgstr "" ++"Kündigt die Zeitspanne in Sekunden an, in der der Router \"Mobile IPv6 Home " ++"Agent\"-Dienste anbietet" ++ ++msgid "" ++"Advertises wait time in milliseconds between Neighbor Solicitation messages " ++"in the RA if specified. 0 disables retransmit advertisements" ++msgstr "" ++"Kündigt die vorgegebene Wartezeit zwischen wiederholt versendeten Neighbor-" ++"Solicitation-Nachrichten als Zeitspanne in Millisekunden an, wenn gegeben. " ++"Der Wert \"0\" deaktiviert die Ankündigung der Wartezeit" ++ ++msgid "Advertising" ++msgstr "Ankündigend" ++ ++msgid "Autonomous" ++msgstr "Autonom" ++ ++msgid "Clients" ++msgstr "Clienten" ++ ++msgid "Configuration flag" ++msgstr "Konfigurations-Bit" ++ ++msgid "Current hop limit" ++msgstr "Aktuelles Hop-Limit" ++ ++msgid "DNSSL" ++msgstr "DNSSL" ++ ++msgid "DNSSL Configuration" ++msgstr "DNSSL-Konfiguration" ++ ++msgid "Default lifetime" ++msgstr "Standard-Gültigkeitszeitraum" ++ ++msgid "Default preference" ++msgstr "Standard-Priorität" ++ ++msgid "Enable" ++msgstr "Aktivieren" ++ ++msgid "Enable advertisements" ++msgstr "Ankündigungen aktivieren" ++ ++msgid "Enables router advertisements and solicitations" ++msgstr "Aktiviert Router-Ankündigungen und Solicitations" ++ ++msgid "" ++"Enables the additional stateful administered autoconfiguration protocol " ++"(RFC2462)" ++msgstr "" ++"Aktiviert das zusätzliche \"Stateful Administered Autoconfiguration Protocol" ++"\" (RFC2462)" ++ ++msgid "" ++"Enables the autoconfiguration of additional, non address information " ++"(RFC2462)" ++msgstr "" ++"Aktiviert die Auto-Konfiguration von zusätzlichen, Nicht-Adress-" ++"Eigenschaften (RFC2462)" ++ ++msgid "General" ++msgstr "Allgemein" ++ ++msgid "Home Agent information" ++msgstr "Home-Agent-Information" ++ ++msgid "Home Agent lifetime" ++msgstr "Home-Agent-Gültigkeitsdauer" ++ ++msgid "Home Agent preference" ++msgstr "Home-Agent-Priorität" ++ ++msgid "Include Home Agent Information in the RA" ++msgstr "Home-Agent-Informationen in die RA-Nachricht einfügen" ++ ++msgid "Include Mobile IPv6 Advertisement Interval option to RA" ++msgstr "Mobile-IPv6-Ankündigungsintervall in die RA-Nachricht einfügen" ++ ++msgid "Includes the link-layer address of the outgoing interface in the RA" ++msgstr "" ++"Link-Layer-Adresse der ausgehenden Schnittstelle in die RA-Nachricht einfügen" ++ ++msgid "" ++"Indicates that the address of interface is sent instead of network prefix, " ++"as is required by Mobile IPv6" ++msgstr "" ++"Zeigt an, dass die Adresse der Schnittstelle statt einem Netzwerk-Prefix " ++"gesendet wird - benötigt für Mobile IPv6" ++ ++msgid "" ++"Indicates that the underlying link is not broadcast capable, prevents " ++"unsolicited advertisements from being sent" ++msgstr "" ++"Zeigt an, dass die zugrundeliegende Verbindung keinen Broadcast-Verkehr " ++"beherrscht, verhindert das Senden unaufgeforderter Ankündigungsnachrichten" ++ ++msgid "" ++"Indicates that this prefix can be used for autonomous address configuration " ++"(RFC4862)" ++msgstr "" ++"Zeigt an, dass das angekündigte Prefix für autonome Adress-Konfiguration " ++"genutzt werden kann (RFC4862)" ++ ++msgid "" ++"Indicates that this prefix can be used for on-link determination (RFC4861)" ++msgstr "" ++"Zeigt an, dass das Prefix für On-Link-Ermittlungen genutzt werden kann " ++"(RFC4861)" ++ ++msgid "Interface" ++msgstr "Schnittstelle" ++ ++msgid "Interface Configuration" ++msgstr "Schnittstellenkonfiguration" ++ ++msgid "Interface required" ++msgstr "Schnittstelle benötigt" ++ ++msgid "Interfaces" ++msgstr "Schnittstellen" ++ ++msgid "Lifetime" ++msgstr "Gültigkeitsdauer" ++ ++msgid "Link MTU" ++msgstr "Verbindungs-MTU" ++ ++msgid "Managed flag" ++msgstr "Managed-Bit" ++ ++msgid "Max. interval" ++msgstr "Max. Intervall" ++ ++msgid "Maximum advertisement interval" ++msgstr "Maximales Ankündigungsintervall" ++ ++msgid "Minimum advertisement delay" ++msgstr "Minimale Ankündigungsverzögerung" ++ ++msgid "Minimum advertisement interval" ++msgstr "Minimales Ankündigungsintervall" ++ ++msgid "Mobile IPv6" ++msgstr "Mobile IPv6" ++ ++msgid "Mobile IPv6 interval option" ++msgstr "Mobile-IPv6-Intervall-Option" ++ ++msgid "Mobile IPv6 router registration" ++msgstr "Mobile-IPv6-Router-Registrierung" ++ ++msgid "Multicast" ++msgstr "Multicast" ++ ++msgid "On-link" ++msgstr "On-Link" ++ ++msgid "On-link determination" ++msgstr "On-Link-Ermittlung" ++ ++msgid "Preference" ++msgstr "Priorität" ++ ++msgid "Preferred lifetime" ++msgstr "Bevorzugte Gültigkeitsdauer" ++ ++msgid "Prefix" ++msgstr "Prefix" ++ ++msgid "Prefix Configuration" ++msgstr "Prefix-Konfiguration" ++ ++msgid "Prefixes" ++msgstr "Prefixes" ++ ++msgid "RDNSS" ++msgstr "RDNSS" ++ ++msgid "RDNSS Configuration" ++msgstr "RDNSS-Konfiguration" ++ ++msgid "Radvd" ++msgstr "Radvd" ++ ++msgid "Radvd - DNSSL" ++msgstr "Radvd - DNSSL" ++ ++msgid "Radvd - Interface %q" ++msgstr "Radvd - Schnittstelle %q" ++ ++msgid "Radvd - Prefix" ++msgstr "Radvd - Prefix" ++ ++msgid "Radvd - RDNSS" ++msgstr "Radvd - RDNSS" ++ ++msgid "Radvd - Route" ++msgstr "Radvd - Route" ++ ++msgid "" ++"Radvd is a router advertisement daemon for IPv6. It listens to router " ++"solicitations and sends router advertisements as described in RFC 4861." ++msgstr "" ++"Radvd ist ein Router-Advertisement-Dienst für IPv6. Er hört auf Router-" ++"Solicitations und sendet Ankündigungen wie in RFC 4861 spezifiziert." ++ ++msgid "Reachable time" ++msgstr "Erreichbarkeitsdauer" ++ ++msgid "" ++"Restrict communication to specified clients, leave empty to use multicast" ++msgstr "" ++"Kommunikation auf angegebene Clients beschränken, leer lassen um Multicast " ++"zu nutzen" ++ ++msgid "Retransmit timer" ++msgstr "Taktung von Neu-Ãœbertragungen" ++ ++msgid "Route Configuration" ++msgstr "Routen-Konfiguration" ++ ++msgid "Routes" ++msgstr "Routen" ++ ++msgid "Source link-layer address" ++msgstr "Quell-Link-Layer-Adresse" ++ ++msgid "" ++"Specifies a logical interface name to derive a 6to4 prefix from. The " ++"interfaces public IPv4 address is combined with 2002::/3 and the value of " ++"the prefix option" ++msgstr "" ++"Spezifiziert eine Schnittstelle, von welcher das 6to4-Prefix abgeleitet " ++"wird. Die öffentliche IPv4-Adresse der Schnittstelle wird dazu mit dem " ++"Subnetz 2002::/3 und dem Wert der Prefix-Option kombiniert" ++ ++msgid "Specifies the lifetime associated with the route in seconds." ++msgstr "Bestimmt die Gültigkeitsdauer dieser Route." ++ ++msgid "Specifies the logical interface name this section belongs to" ++msgstr "Bestimmt die Schnittstelle, zu welcher diese Sektion gehört" ++ ++msgid "" ++"Specifies the maximum duration how long the DNSSL entries are used for name " ++"resolution." ++msgstr "" ++"Bestimmt die maximale Dauer, für welche die DNSSL-Einträge gültig zur " ++"Namensauflösung sind." ++ ++msgid "" ++"Specifies the maximum duration how long the RDNSS entries are used for name " ++"resolution." ++msgstr "" ++"Bestimmt die maximale Dauer, für welche die RDNSS-Einträge gültig zur " ++"Namensauflösung sind." ++ ++msgid "Specifies the preference associated with the default router" ++msgstr "Bestimmt die mit diesem Router assoziierte Priorität" ++ ++msgid "Suffix" ++msgstr "Suffix" ++ ++msgid "" ++"The maximum time allowed between sending unsolicited multicast router " ++"advertisements from the interface, in seconds" ++msgstr "" ++"Die maximal erlaubte Wartezeit zwischen dem Versand aufeinanderfolgender, " ++"unaufgeforderter Mutlicast-Router-Ankündigungen auf dieser Schnittstelle als " ++"Zeitspanne in Sekunden" ++ ++msgid "" ++"The minimum time allowed between sending multicast router advertisements " ++"from the interface, in seconds" ++msgstr "" ++"Die minimal erlaubte Wartezeit zwischen dem Versand aufeinanderfolgender " ++"Router-Ankündigungen auf dieser Schnittstelle als Zeitspanne in Sekunden" ++ ++msgid "" ++"The minimum time allowed between sending unsolicited multicast router " ++"advertisements from the interface, in seconds" ++msgstr "" ++"Die minimal erlaubte Wartezeit zwischen dem Versand aufeinanderfolgender, " ++"unaufgeforderter Mutlicast-Router-Ankündigungen auf dieser Schnittstelle als " ++"Zeitspanne in Sekunden" ++ ++msgid "The preference for the Home Agent sending this RA" ++msgstr "Die Priorität des ankündigendem \"IPv6 Home Agent\"" ++ ++msgid "Timing" ++msgstr "Taktung" ++ ++msgid "Unicast only" ++msgstr "Nur Unicast" ++ ++msgid "Valid lifetime" ++msgstr "Gültigkeitsdauer" ++ ++msgid "Validity time" ++msgstr "Gültigkeitsdauer" ++ ++msgid "default" ++msgstr "Standard" ++ ++msgid "high" ++msgstr "hoch" ++ ++msgid "low" ++msgstr "niedrig" ++ ++msgid "medium" ++msgstr "mittel" ++ ++msgid "no" ++msgstr "nein" ++ ++msgid "yes" ++msgstr "ja" ++ ++#~ msgid "Advertised IPv6 prefix" ++#~ msgstr "Angekündigtes IPv6-Prefix" ++ ++#~ msgid "" ++#~ "Advertised IPv6 prefix. If empty, the current interface prefix is used" ++#~ msgstr "" ++#~ "Angekündigtes IPv6-Subnetz in CIDR-Notation. Wenn leer wird das aktuelle " ++#~ "IPv6-Prefix der Schnittstelle verwendet" ++ ++#~ msgid "" ++#~ "Advertises the length of time in seconds that addresses generated from " ++#~ "the prefix via stateless address autoconfiguration remain preferred. Use " ++#~ "0 to specify an infinite lifetime" ++#~ msgstr "" ++#~ "Kündigt den Zeitraum an, in dem die vom angekündigtem Prefix generierte " ++#~ "Adresse bevorzugt bleibt, als Zeitspanne in Sekunden. Der Wert \"0\" " ++#~ "spezifiziert eine unbegrenzte Gültigkeitsspanne" ++ ++#~ msgid "" ++#~ "Advertises the length of time in seconds that the prefix is valid for the " ++#~ "purpose of on-link determination. Use 0 to specify an infinite lifetime" ++#~ msgstr "" ++#~ "Kündigt den Zeitraum in Sekunden an, in dem der Prefix für On-Link-" ++#~ "Ermittlung gültig ist. Der Wert \"0\" spezifiziert eine unbegrenzte " ++#~ "Gültigkeitsspanne" ++ ++#~ msgid "" ++#~ "Indicates whether that RDNSS continues to be available to hosts even if " ++#~ "they moved to a different subnet" ++#~ msgstr "" ++#~ "Zeigt an, ob dieser rekursive DNS Server von anderen Subnetzen aus " ++#~ "verfügbar bleibt" ++ ++#~ msgid "Open" ++#~ msgstr "Offen" ++ ++#~ msgid "" ++#~ "Specifies the lifetime associated with the route in seconds. Use 0 to " ++#~ "specify an infinite lifetime" ++#~ msgstr "" ++#~ "Bestimmt die Gültigkeitsdauer dieser Route. Der Wert \"0\" spezifiziert " ++#~ "einen unbegrenzten Zeitraum" ++ ++#~ msgid "" ++#~ "Specifies the maximum duration how long the DNSSL entries are used for " ++#~ "name resolution. Use 0 to specify an infinite lifetime" ++#~ msgstr "" ++#~ "Bestimmt die maximale Dauer, für welche die DNSSL-Einträge gültig zur " ++#~ "Namensauflösung sind. Der Wert \"0\" spezifiziert einen unbegrenzten " ++#~ "Zeitraum" ++ ++#~ msgid "" ++#~ "Specifies the maximum duration how long the RDNSS entries are used for " ++#~ "name resolution. Use 0 to specify an infinite lifetime" ++#~ msgstr "" ++#~ "Bestimmt die maximale Dauer, für welche die RDNSS-Einträge gültig zur " ++#~ "Namensauflösung sind. Der Wert \"0\" spezifiziert einen unbegrenzten " ++#~ "Zeitraum" +diff --git a/feeds/luci/applications/luci-app-radvd/po/el/radvd.po b/feeds/luci/applications/luci-app-radvd/po/el/radvd.po +new file mode 100644 +index 0000000..00763c9 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-radvd/po/el/radvd.po +@@ -0,0 +1,370 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"PO-Revision-Date: 2012-03-18 15:31+0200\n" ++"Last-Translator: Vasilis \n" ++"Language-Team: German\n" ++"Language: el\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n != 1);\n" ++"X-Generator: Pootle 2.0.4\n" ++ ++msgid "6to4 interface" ++msgstr "Διεπαφή 6to4" ++ ++msgid "Address" ++msgstr "ΔιεÏθυνση" ++ ++msgid "Addresses" ++msgstr "ΔιευθÏνσεις" ++ ++msgid "Advanced" ++msgstr "" ++ ++msgid "Advertise Home Agent flag" ++msgstr "" ++ ++msgid "Advertise router address" ++msgstr "" ++ ++msgid "Advertised Domain Suffixes" ++msgstr "" ++ ++msgid "" ++"Advertised IPv6 RDNSS. If empty, the current IPv6 address of the interface " ++"is used" ++msgstr "" ++ ++msgid "Advertised IPv6 prefixes" ++msgstr "" ++ ++msgid "" ++"Advertised IPv6 prefixes. If empty, the current interface prefix is used" ++msgstr "" ++ ++msgid "Advertises Mobile IPv6 Home Agent capability (RFC3775)" ++msgstr "" ++ ++msgid "Advertises Mobile Router registration capability (NEMO Basic)" ++msgstr "" ++ ++msgid "" ++"Advertises assumed reachability time in milliseconds of neighbours in the RA " ++"if specified. 0 disables reachability advertisements" ++msgstr "" ++ ++msgid "" ++"Advertises the default Hop Count value for outgoing unicast packets in the " ++"RA. 0 disables hopcount advertisements" ++msgstr "" ++ ++msgid "Advertises the default router preference" ++msgstr "" ++ ++msgid "" ++"Advertises the given link MTU in the RA if specified. 0 disables MTU " ++"advertisements" ++msgstr "" ++ ++msgid "" ++"Advertises the length of time in seconds that addresses generated from the " ++"prefix via stateless address autoconfiguration remain preferred." ++msgstr "" ++ ++msgid "" ++"Advertises the length of time in seconds that the prefix is valid for the " ++"purpose of on-link determination." ++msgstr "" ++ ++msgid "" ++"Advertises the lifetime of the default router in seconds. 0 indicates that " ++"the node is no default router" ++msgstr "" ++ ++msgid "" ++"Advertises the time in seconds the router is offering Mobile IPv6 Home Agent " ++"services" ++msgstr "" ++ ++msgid "" ++"Advertises wait time in milliseconds between Neighbor Solicitation messages " ++"in the RA if specified. 0 disables retransmit advertisements" ++msgstr "" ++ ++msgid "Advertising" ++msgstr "" ++ ++msgid "Autonomous" ++msgstr "" ++ ++msgid "Clients" ++msgstr "Πελάτες" ++ ++msgid "Configuration flag" ++msgstr "" ++ ++msgid "Current hop limit" ++msgstr "" ++ ++msgid "DNSSL" ++msgstr "DNSSL" ++ ++msgid "DNSSL Configuration" ++msgstr "" ++ ++msgid "Default lifetime" ++msgstr "" ++ ++msgid "Default preference" ++msgstr "" ++ ++msgid "Enable" ++msgstr "ΕνεÏγοποίηση" ++ ++msgid "Enable advertisements" ++msgstr "" ++ ++msgid "Enables router advertisements and solicitations" ++msgstr "" ++ ++msgid "" ++"Enables the additional stateful administered autoconfiguration protocol " ++"(RFC2462)" ++msgstr "" ++ ++msgid "" ++"Enables the autoconfiguration of additional, non address information " ++"(RFC2462)" ++msgstr "" ++ ++msgid "General" ++msgstr "" ++ ++msgid "Home Agent information" ++msgstr "" ++ ++msgid "Home Agent lifetime" ++msgstr "" ++ ++msgid "Home Agent preference" ++msgstr "" ++ ++msgid "Include Home Agent Information in the RA" ++msgstr "" ++ ++msgid "Include Mobile IPv6 Advertisement Interval option to RA" ++msgstr "" ++ ++msgid "Includes the link-layer address of the outgoing interface in the RA" ++msgstr "" ++ ++msgid "" ++"Indicates that the address of interface is sent instead of network prefix, " ++"as is required by Mobile IPv6" ++msgstr "" ++ ++msgid "" ++"Indicates that the underlying link is not broadcast capable, prevents " ++"unsolicited advertisements from being sent" ++msgstr "" ++ ++msgid "" ++"Indicates that this prefix can be used for autonomous address configuration " ++"(RFC4862)" ++msgstr "" ++ ++msgid "" ++"Indicates that this prefix can be used for on-link determination (RFC4861)" ++msgstr "" ++ ++msgid "Interface" ++msgstr "Διεπαφή" ++ ++msgid "Interface Configuration" ++msgstr "" ++ ++msgid "Interface required" ++msgstr "" ++ ++msgid "Interfaces" ++msgstr "Διεπαφές" ++ ++msgid "Lifetime" ++msgstr "" ++ ++msgid "Link MTU" ++msgstr "" ++ ++msgid "Managed flag" ++msgstr "" ++ ++msgid "Max. interval" ++msgstr "" ++ ++msgid "Maximum advertisement interval" ++msgstr "" ++ ++msgid "Minimum advertisement delay" ++msgstr "" ++ ++msgid "Minimum advertisement interval" ++msgstr "" ++ ++msgid "Mobile IPv6" ++msgstr "" ++ ++msgid "Mobile IPv6 interval option" ++msgstr "" ++ ++msgid "Mobile IPv6 router registration" ++msgstr "" ++ ++msgid "Multicast" ++msgstr "" ++ ++msgid "On-link" ++msgstr "" ++ ++msgid "On-link determination" ++msgstr "" ++ ++msgid "Preference" ++msgstr "" ++ ++msgid "Preferred lifetime" ++msgstr "" ++ ++msgid "Prefix" ++msgstr "" ++ ++msgid "Prefix Configuration" ++msgstr "" ++ ++msgid "Prefixes" ++msgstr "" ++ ++msgid "RDNSS" ++msgstr "RDNSS" ++ ++msgid "RDNSS Configuration" ++msgstr "" ++ ++msgid "Radvd" ++msgstr "Radvd" ++ ++msgid "Radvd - DNSSL" ++msgstr "Radvd - DNSSL" ++ ++msgid "Radvd - Interface %q" ++msgstr "Radvd - Διεπαφή %q" ++ ++msgid "Radvd - Prefix" ++msgstr "" ++ ++msgid "Radvd - RDNSS" ++msgstr "Radvd - RDNSS" ++ ++msgid "Radvd - Route" ++msgstr "Radvd - ΔιαδÏομή" ++ ++msgid "" ++"Radvd is a router advertisement daemon for IPv6. It listens to router " ++"solicitations and sends router advertisements as described in RFC 4861." ++msgstr "" ++ ++msgid "Reachable time" ++msgstr "" ++ ++msgid "" ++"Restrict communication to specified clients, leave empty to use multicast" ++msgstr "" ++ ++msgid "Retransmit timer" ++msgstr "" ++ ++msgid "Route Configuration" ++msgstr "" ++ ++msgid "Routes" ++msgstr "ΔιαδÏομές" ++ ++msgid "Source link-layer address" ++msgstr "" ++ ++msgid "" ++"Specifies a logical interface name to derive a 6to4 prefix from. The " ++"interfaces public IPv4 address is combined with 2002::/3 and the value of " ++"the prefix option" ++msgstr "" ++ ++msgid "Specifies the lifetime associated with the route in seconds." ++msgstr "" ++ ++msgid "Specifies the logical interface name this section belongs to" ++msgstr "" ++ ++msgid "" ++"Specifies the maximum duration how long the DNSSL entries are used for name " ++"resolution." ++msgstr "" ++ ++msgid "" ++"Specifies the maximum duration how long the RDNSS entries are used for name " ++"resolution." ++msgstr "" ++ ++msgid "Specifies the preference associated with the default router" ++msgstr "" ++ ++msgid "Suffix" ++msgstr "" ++ ++msgid "" ++"The maximum time allowed between sending unsolicited multicast router " ++"advertisements from the interface, in seconds" ++msgstr "" ++ ++msgid "" ++"The minimum time allowed between sending multicast router advertisements " ++"from the interface, in seconds" ++msgstr "" ++ ++msgid "" ++"The minimum time allowed between sending unsolicited multicast router " ++"advertisements from the interface, in seconds" ++msgstr "" ++ ++msgid "The preference for the Home Agent sending this RA" ++msgstr "" ++ ++msgid "Timing" ++msgstr "" ++ ++msgid "Unicast only" ++msgstr "" ++ ++msgid "Valid lifetime" ++msgstr "" ++ ++msgid "Validity time" ++msgstr "" ++ ++msgid "default" ++msgstr "" ++ ++msgid "high" ++msgstr "" ++ ++msgid "low" ++msgstr "" ++ ++msgid "medium" ++msgstr "" ++ ++msgid "no" ++msgstr "όχι" ++ ++msgid "yes" ++msgstr "ναι" +diff --git a/feeds/luci/applications/luci-app-radvd/po/en/radvd.po b/feeds/luci/applications/luci-app-radvd/po/en/radvd.po +new file mode 100644 +index 0000000..63f8fa0 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-radvd/po/en/radvd.po +@@ -0,0 +1,368 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"PO-Revision-Date: 2010-11-21 04:06+0100\n" ++"Last-Translator: \n" ++"Language-Team: German\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n != 1);\n" ++ ++msgid "6to4 interface" ++msgstr "" ++ ++msgid "Address" ++msgstr "" ++ ++msgid "Addresses" ++msgstr "" ++ ++msgid "Advanced" ++msgstr "" ++ ++msgid "Advertise Home Agent flag" ++msgstr "" ++ ++msgid "Advertise router address" ++msgstr "" ++ ++msgid "Advertised Domain Suffixes" ++msgstr "" ++ ++msgid "" ++"Advertised IPv6 RDNSS. If empty, the current IPv6 address of the interface " ++"is used" ++msgstr "" ++ ++msgid "Advertised IPv6 prefixes" ++msgstr "" ++ ++msgid "" ++"Advertised IPv6 prefixes. If empty, the current interface prefix is used" ++msgstr "" ++ ++msgid "Advertises Mobile IPv6 Home Agent capability (RFC3775)" ++msgstr "" ++ ++msgid "Advertises Mobile Router registration capability (NEMO Basic)" ++msgstr "" ++ ++msgid "" ++"Advertises assumed reachability time in milliseconds of neighbours in the RA " ++"if specified. 0 disables reachability advertisements" ++msgstr "" ++ ++msgid "" ++"Advertises the default Hop Count value for outgoing unicast packets in the " ++"RA. 0 disables hopcount advertisements" ++msgstr "" ++ ++msgid "Advertises the default router preference" ++msgstr "" ++ ++msgid "" ++"Advertises the given link MTU in the RA if specified. 0 disables MTU " ++"advertisements" ++msgstr "" ++ ++msgid "" ++"Advertises the length of time in seconds that addresses generated from the " ++"prefix via stateless address autoconfiguration remain preferred." ++msgstr "" ++ ++msgid "" ++"Advertises the length of time in seconds that the prefix is valid for the " ++"purpose of on-link determination." ++msgstr "" ++ ++msgid "" ++"Advertises the lifetime of the default router in seconds. 0 indicates that " ++"the node is no default router" ++msgstr "" ++ ++msgid "" ++"Advertises the time in seconds the router is offering Mobile IPv6 Home Agent " ++"services" ++msgstr "" ++ ++msgid "" ++"Advertises wait time in milliseconds between Neighbor Solicitation messages " ++"in the RA if specified. 0 disables retransmit advertisements" ++msgstr "" ++ ++msgid "Advertising" ++msgstr "" ++ ++msgid "Autonomous" ++msgstr "" ++ ++msgid "Clients" ++msgstr "" ++ ++msgid "Configuration flag" ++msgstr "" ++ ++msgid "Current hop limit" ++msgstr "" ++ ++msgid "DNSSL" ++msgstr "" ++ ++msgid "DNSSL Configuration" ++msgstr "" ++ ++msgid "Default lifetime" ++msgstr "" ++ ++msgid "Default preference" ++msgstr "" ++ ++msgid "Enable" ++msgstr "" ++ ++msgid "Enable advertisements" ++msgstr "" ++ ++msgid "Enables router advertisements and solicitations" ++msgstr "" ++ ++msgid "" ++"Enables the additional stateful administered autoconfiguration protocol " ++"(RFC2462)" ++msgstr "" ++ ++msgid "" ++"Enables the autoconfiguration of additional, non address information " ++"(RFC2462)" ++msgstr "" ++ ++msgid "General" ++msgstr "" ++ ++msgid "Home Agent information" ++msgstr "" ++ ++msgid "Home Agent lifetime" ++msgstr "" ++ ++msgid "Home Agent preference" ++msgstr "" ++ ++msgid "Include Home Agent Information in the RA" ++msgstr "" ++ ++msgid "Include Mobile IPv6 Advertisement Interval option to RA" ++msgstr "" ++ ++msgid "Includes the link-layer address of the outgoing interface in the RA" ++msgstr "" ++ ++msgid "" ++"Indicates that the address of interface is sent instead of network prefix, " ++"as is required by Mobile IPv6" ++msgstr "" ++ ++msgid "" ++"Indicates that the underlying link is not broadcast capable, prevents " ++"unsolicited advertisements from being sent" ++msgstr "" ++ ++msgid "" ++"Indicates that this prefix can be used for autonomous address configuration " ++"(RFC4862)" ++msgstr "" ++ ++msgid "" ++"Indicates that this prefix can be used for on-link determination (RFC4861)" ++msgstr "" ++ ++msgid "Interface" ++msgstr "" ++ ++msgid "Interface Configuration" ++msgstr "" ++ ++msgid "Interface required" ++msgstr "" ++ ++msgid "Interfaces" ++msgstr "" ++ ++msgid "Lifetime" ++msgstr "" ++ ++msgid "Link MTU" ++msgstr "" ++ ++msgid "Managed flag" ++msgstr "" ++ ++msgid "Max. interval" ++msgstr "" ++ ++msgid "Maximum advertisement interval" ++msgstr "" ++ ++msgid "Minimum advertisement delay" ++msgstr "" ++ ++msgid "Minimum advertisement interval" ++msgstr "" ++ ++msgid "Mobile IPv6" ++msgstr "" ++ ++msgid "Mobile IPv6 interval option" ++msgstr "" ++ ++msgid "Mobile IPv6 router registration" ++msgstr "" ++ ++msgid "Multicast" ++msgstr "" ++ ++msgid "On-link" ++msgstr "" ++ ++msgid "On-link determination" ++msgstr "" ++ ++msgid "Preference" ++msgstr "" ++ ++msgid "Preferred lifetime" ++msgstr "" ++ ++msgid "Prefix" ++msgstr "" ++ ++msgid "Prefix Configuration" ++msgstr "" ++ ++msgid "Prefixes" ++msgstr "" ++ ++msgid "RDNSS" ++msgstr "" ++ ++msgid "RDNSS Configuration" ++msgstr "" ++ ++msgid "Radvd" ++msgstr "" ++ ++msgid "Radvd - DNSSL" ++msgstr "" ++ ++msgid "Radvd - Interface %q" ++msgstr "" ++ ++msgid "Radvd - Prefix" ++msgstr "" ++ ++msgid "Radvd - RDNSS" ++msgstr "" ++ ++msgid "Radvd - Route" ++msgstr "" ++ ++msgid "" ++"Radvd is a router advertisement daemon for IPv6. It listens to router " ++"solicitations and sends router advertisements as described in RFC 4861." ++msgstr "" ++ ++msgid "Reachable time" ++msgstr "" ++ ++msgid "" ++"Restrict communication to specified clients, leave empty to use multicast" ++msgstr "" ++ ++msgid "Retransmit timer" ++msgstr "" ++ ++msgid "Route Configuration" ++msgstr "" ++ ++msgid "Routes" ++msgstr "" ++ ++msgid "Source link-layer address" ++msgstr "" ++ ++msgid "" ++"Specifies a logical interface name to derive a 6to4 prefix from. The " ++"interfaces public IPv4 address is combined with 2002::/3 and the value of " ++"the prefix option" ++msgstr "" ++ ++msgid "Specifies the lifetime associated with the route in seconds." ++msgstr "" ++ ++msgid "Specifies the logical interface name this section belongs to" ++msgstr "" ++ ++msgid "" ++"Specifies the maximum duration how long the DNSSL entries are used for name " ++"resolution." ++msgstr "" ++ ++msgid "" ++"Specifies the maximum duration how long the RDNSS entries are used for name " ++"resolution." ++msgstr "" ++ ++msgid "Specifies the preference associated with the default router" ++msgstr "" ++ ++msgid "Suffix" ++msgstr "" ++ ++msgid "" ++"The maximum time allowed between sending unsolicited multicast router " ++"advertisements from the interface, in seconds" ++msgstr "" ++ ++msgid "" ++"The minimum time allowed between sending multicast router advertisements " ++"from the interface, in seconds" ++msgstr "" ++ ++msgid "" ++"The minimum time allowed between sending unsolicited multicast router " ++"advertisements from the interface, in seconds" ++msgstr "" ++ ++msgid "The preference for the Home Agent sending this RA" ++msgstr "" ++ ++msgid "Timing" ++msgstr "" ++ ++msgid "Unicast only" ++msgstr "" ++ ++msgid "Valid lifetime" ++msgstr "" ++ ++msgid "Validity time" ++msgstr "" ++ ++msgid "default" ++msgstr "" ++ ++msgid "high" ++msgstr "" ++ ++msgid "low" ++msgstr "" ++ ++msgid "medium" ++msgstr "" ++ ++msgid "no" ++msgstr "" ++ ++msgid "yes" ++msgstr "" +diff --git a/feeds/luci/applications/luci-app-radvd/po/es/radvd.po b/feeds/luci/applications/luci-app-radvd/po/es/radvd.po +new file mode 100644 +index 0000000..8656192 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-radvd/po/es/radvd.po +@@ -0,0 +1,412 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"PO-Revision-Date: 2012-08-26 17:12+0200\n" ++"Last-Translator: José Vicente \n" ++"Language-Team: German\n" ++"Language: es\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n != 1);\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "6to4 interface" ++msgstr "Interfaz 6a4" ++ ++msgid "Address" ++msgstr "Dirección" ++ ++msgid "Addresses" ++msgstr "Direcciones" ++ ++msgid "Advanced" ++msgstr "Avanzado" ++ ++msgid "Advertise Home Agent flag" ++msgstr "Publicar marca de agente personal" ++ ++msgid "Advertise router address" ++msgstr "Publicar dirección del router" ++ ++msgid "Advertised Domain Suffixes" ++msgstr "Publicar sufijos de dominio" ++ ++msgid "" ++"Advertised IPv6 RDNSS. If empty, the current IPv6 address of the interface " ++"is used" ++msgstr "" ++"RDNSS IPv6 publicado. Dejar en blanco para usar la dirección IPv6 de la " ++"interfaz" ++ ++msgid "Advertised IPv6 prefixes" ++msgstr "Prefijo IPv6 publicado" ++ ++msgid "" ++"Advertised IPv6 prefixes. If empty, the current interface prefix is used" ++msgstr "" ++"Prefijos IPv6 publicados. Dejar en blanco para usar el propio del interfaz" ++ ++msgid "Advertises Mobile IPv6 Home Agent capability (RFC3775)" ++msgstr "Publica aptitudes móviles IPv6 del Home Agent (RFC3775)" ++ ++msgid "Advertises Mobile Router registration capability (NEMO Basic)" ++msgstr "Publica las aptitudes de registro del router móvil" ++ ++msgid "" ++"Advertises assumed reachability time in milliseconds of neighbours in the RA " ++"if specified. 0 disables reachability advertisements" ++msgstr "" ++"Publica el alcance asumido en milisegundos de los vecinos en la RA si se " ++"especifica. 0 para desactivar" ++ ++msgid "" ++"Advertises the default Hop Count value for outgoing unicast packets in the " ++"RA. 0 disables hopcount advertisements" ++msgstr "" ++"Publica la cuenta de saltos para paquetes salientes en el RA. Desactivar con " ++"0" ++ ++msgid "Advertises the default router preference" ++msgstr "Publica la preferencia de router por defecto" ++ ++msgid "" ++"Advertises the given link MTU in the RA if specified. 0 disables MTU " ++"advertisements" ++msgstr "Publica el MTU del enlace en la RA si se especifica. Desactivar con 0" ++ ++msgid "" ++"Advertises the length of time in seconds that addresses generated from the " ++"prefix via stateless address autoconfiguration remain preferred." ++msgstr "" ++"Publica el tiempo de vida en segundos que se prefieren las direcciones " ++"generadas desde el prefijo vía una dirección de autoconfiguración sin estado." ++ ++msgid "" ++"Advertises the length of time in seconds that the prefix is valid for the " ++"purpose of on-link determination." ++msgstr "" ++"Publica el tiempo en segundos que el prefijo es válido para determinar que " ++"el enlace está activo." ++ ++msgid "" ++"Advertises the lifetime of the default router in seconds. 0 indicates that " ++"the node is no default router" ++msgstr "" ++"Publica tiempo de vida del router por defecto en segundos. 0 si el router no " ++"lo es" ++ ++msgid "" ++"Advertises the time in seconds the router is offering Mobile IPv6 Home Agent " ++"services" ++msgstr "" ++"Publica tiempo en segundos que router ofrece servicios de Home Agent para " ++"IPv6 móvil" ++ ++msgid "" ++"Advertises wait time in milliseconds between Neighbor Solicitation messages " ++"in the RA if specified. 0 disables retransmit advertisements" ++msgstr "" ++"Publicar el tiempo de espera en milisegundos entre mensajes de solicitud de " ++"vecinos en la RA. Desactivar con 0" ++ ++msgid "Advertising" ++msgstr "Publicación" ++ ++msgid "Autonomous" ++msgstr "Autónomo" ++ ++msgid "Clients" ++msgstr "Clientes" ++ ++msgid "Configuration flag" ++msgstr "Marca de configuración" ++ ++msgid "Current hop limit" ++msgstr "Límite de saltos actual" ++ ++msgid "DNSSL" ++msgstr "DNSSL" ++ ++msgid "DNSSL Configuration" ++msgstr "Configuración DNSSL" ++ ++msgid "Default lifetime" ++msgstr "Vida por defecto" ++ ++msgid "Default preference" ++msgstr "Preferencia por defecto" ++ ++msgid "Enable" ++msgstr "Activar" ++ ++msgid "Enable advertisements" ++msgstr "Activar publicaciones" ++ ++msgid "Enables router advertisements and solicitations" ++msgstr "Activar publicaciones y solicitudes de router" ++ ++msgid "" ++"Enables the additional stateful administered autoconfiguration protocol " ++"(RFC2462)" ++msgstr "Activa el protocolo adicional de autoconfiguración de estado (RFC2462)" ++ ++msgid "" ++"Enables the autoconfiguration of additional, non address information " ++"(RFC2462)" ++msgstr "" ++"Activa la configuración de información adicional que no sea de dirección " ++"(RFC2462)" ++ ++msgid "General" ++msgstr "General" ++ ++msgid "Home Agent information" ++msgstr "Información del \"Home Agent\"" ++ ++msgid "Home Agent lifetime" ++msgstr "Vida del \"Home Agent\"" ++ ++msgid "Home Agent preference" ++msgstr "Preferencia del \"Home Agent\"" ++ ++msgid "Include Home Agent Information in the RA" ++msgstr "Incluir información del \"Home Agent\" en el RA" ++ ++msgid "Include Mobile IPv6 Advertisement Interval option to RA" ++msgstr "Incluir la opción de publicación móvil IPv6 a RA" ++ ++msgid "Includes the link-layer address of the outgoing interface in the RA" ++msgstr "" ++"Incluye la dirección de capa de enlace para el interfaz saliente en la RA" ++ ++msgid "" ++"Indicates that the address of interface is sent instead of network prefix, " ++"as is required by Mobile IPv6" ++msgstr "" ++"Se enviará la dirección del interfaz en vez del prefijo de red tal y como se " ++"requiere par IPv6 móvil" ++ ++msgid "" ++"Indicates that the underlying link is not broadcast capable, prevents " ++"unsolicited advertisements from being sent" ++msgstr "" ++"El enlace inferior no puede hacer redifusión, no se pueden enviar " ++"publicaciones no solicitadas" ++ ++msgid "" ++"Indicates that this prefix can be used for autonomous address configuration " ++"(RFC4862)" ++msgstr "" ++"Este prefijo se puede usar como una dirección autónoma de configuración " ++"(RFC4862)" ++ ++msgid "" ++"Indicates that this prefix can be used for on-link determination (RFC4861)" ++msgstr "" ++"Este prefijo se puede usar para determinación de enlace activado (RFC4861)" ++ ++msgid "Interface" ++msgstr "Interfaz" ++ ++msgid "Interface Configuration" ++msgstr "Configuración de la interfaz" ++ ++msgid "Interface required" ++msgstr "Se necesita una interfaz" ++ ++msgid "Interfaces" ++msgstr "Interfaces" ++ ++msgid "Lifetime" ++msgstr "Vida" ++ ++msgid "Link MTU" ++msgstr "MTU del enlace" ++ ++msgid "Managed flag" ++msgstr "Marca de gestionado" ++ ++msgid "Max. interval" ++msgstr "Intervalo máximo" ++ ++msgid "Maximum advertisement interval" ++msgstr "Intervalo máximo de publicación" ++ ++msgid "Minimum advertisement delay" ++msgstr "Retraso mínimo de publicación" ++ ++msgid "Minimum advertisement interval" ++msgstr "Intervalo mínimo de publicación" ++ ++msgid "Mobile IPv6" ++msgstr "IPv6 móvil" ++ ++msgid "Mobile IPv6 interval option" ++msgstr "Opción de intervalo móvil IPv6" ++ ++msgid "Mobile IPv6 router registration" ++msgstr "Registro de router móvil IPv6" ++ ++msgid "Multicast" ++msgstr "Multidifusión" ++ ++msgid "On-link" ++msgstr "Enlace activado (On-link)" ++ ++msgid "On-link determination" ++msgstr "Determinar enlace activado" ++ ++msgid "Preference" ++msgstr "Preferencia" ++ ++msgid "Preferred lifetime" ++msgstr "Duración de vida preferida" ++ ++msgid "Prefix" ++msgstr "Prefijo" ++ ++msgid "Prefix Configuration" ++msgstr "Configuración del prefijo" ++ ++msgid "Prefixes" ++msgstr "Prefijos" ++ ++msgid "RDNSS" ++msgstr "RDNSS" ++ ++msgid "RDNSS Configuration" ++msgstr "Configuración RDNSS" ++ ++msgid "Radvd" ++msgstr "Radvd" ++ ++msgid "Radvd - DNSSL" ++msgstr "Radvd - DNSSL" ++ ++msgid "Radvd - Interface %q" ++msgstr "Radvd - Interfaz %q" ++ ++msgid "Radvd - Prefix" ++msgstr "Radvd - Prefijo" ++ ++msgid "Radvd - RDNSS" ++msgstr "Radvd - RDNSS" ++ ++msgid "Radvd - Route" ++msgstr "Radvd - Ruta" ++ ++msgid "" ++"Radvd is a router advertisement daemon for IPv6. It listens to router " ++"solicitations and sends router advertisements as described in RFC 4861." ++msgstr "" ++"Radvd es un demonio de publicación de enrutado de para IPv6. Atiende " ++"solicitudes de ruta y envía anuncios de ruta como se describe en RFC4861." ++ ++msgid "Reachable time" ++msgstr "Tiempo alcanzable" ++ ++msgid "" ++"Restrict communication to specified clients, leave empty to use multicast" ++msgstr "" ++"Restringir comunicaciones a estos clientes, dejar en blanco para " ++"multidifusión" ++ ++msgid "Retransmit timer" ++msgstr "Retraso de retransmisión" ++ ++msgid "Route Configuration" ++msgstr "Configuración de rutas" ++ ++msgid "Routes" ++msgstr "Rutas" ++ ++msgid "Source link-layer address" ++msgstr "Dirección origen de enlace de red" ++ ++msgid "" ++"Specifies a logical interface name to derive a 6to4 prefix from. The " ++"interfaces public IPv4 address is combined with 2002::/3 and the value of " ++"the prefix option" ++msgstr "" ++"Nombre lógicos del interfaz del que derivar un prefijo 6to4. La dirección " ++"IPv4 pública del interfaz se combina con 2002::/3 y el valor de la opción " ++"\"prefijo\"" ++ ++msgid "Specifies the lifetime associated with the route in seconds." ++msgstr "Tiempo de vida asociado a la ruta en segundos." ++ ++msgid "Specifies the logical interface name this section belongs to" ++msgstr "Nombre del interfaz lógico al que pertenece esta sección" ++ ++msgid "" ++"Specifies the maximum duration how long the DNSSL entries are used for name " ++"resolution." ++msgstr "" ++"Máximo tiempo que las entradas DNSSL se usan para resolución de nombres." ++ ++msgid "" ++"Specifies the maximum duration how long the RDNSS entries are used for name " ++"resolution." ++msgstr "" ++"Máximo tiempo que las entradas RDNSS se usan para resolución de nombres." ++ ++msgid "Specifies the preference associated with the default router" ++msgstr "Preferencia asociada con el router por defecto" ++ ++msgid "Suffix" ++msgstr "Sufijo" ++ ++msgid "" ++"The maximum time allowed between sending unsolicited multicast router " ++"advertisements from the interface, in seconds" ++msgstr "" ++"Máximo tiempo en segundos entre envíos de publicaciones multidifusión desde " ++"el interfaz" ++ ++msgid "" ++"The minimum time allowed between sending multicast router advertisements " ++"from the interface, in seconds" ++msgstr "" ++"Mínimo tiempo en segundos entre envíos de publicaciones multidifusión desde " ++"el interfaz" ++ ++msgid "" ++"The minimum time allowed between sending unsolicited multicast router " ++"advertisements from the interface, in seconds" ++msgstr "" ++"Mínimo tiempo en segundos entre envíos de publicaciones multidifusión no " ++"solicitadas desde el interfaz" ++ ++msgid "The preference for the Home Agent sending this RA" ++msgstr "Preferencia que el Home Agent enviará a esta RA" ++ ++msgid "Timing" ++msgstr "Temporización" ++ ++msgid "Unicast only" ++msgstr "Solo unidifusión" ++ ++msgid "Valid lifetime" ++msgstr "Tiempo de vida válido" ++ ++msgid "Validity time" ++msgstr "Tiempo de validez" ++ ++msgid "default" ++msgstr "por defecto" ++ ++msgid "high" ++msgstr "alto" ++ ++msgid "low" ++msgstr "bajo" ++ ++msgid "medium" ++msgstr "medio" ++ ++msgid "no" ++msgstr "no" ++ ++msgid "yes" ++msgstr "sí" +diff --git a/feeds/luci/applications/luci-app-radvd/po/fr/radvd.po b/feeds/luci/applications/luci-app-radvd/po/fr/radvd.po +new file mode 100644 +index 0000000..b26e6e0 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-radvd/po/fr/radvd.po +@@ -0,0 +1,472 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"PO-Revision-Date: 2011-11-23 22:32+0200\n" ++"Last-Translator: fredb \n" ++"Language-Team: German\n" ++"Language: fr\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n > 1);\n" ++"X-Generator: Pootle 2.0.4\n" ++ ++msgid "6to4 interface" ++msgstr "Interface 6to4" ++ ++msgid "Address" ++msgstr "Adresse" ++ ++msgid "Addresses" ++msgstr "Adresses" ++ ++msgid "Advanced" ++msgstr "Avancé" ++ ++msgid "Advertise Home Agent flag" ++msgstr "Drapeau de publication de l'agent Personnel (Home Agent)" ++ ++msgid "Advertise router address" ++msgstr "Publier l'adresse du routeur" ++ ++msgid "Advertised Domain Suffixes" ++msgstr "Suffixes de domaines publiés" ++ ++msgid "" ++"Advertised IPv6 RDNSS. If empty, the current IPv6 address of the interface " ++"is used" ++msgstr "" ++"IPv6 RDNSS publié. S'il est vide, l'adresse IPv6 courante de l'interface est " ++"utilisée" ++ ++msgid "Advertised IPv6 prefixes" ++msgstr "Préfixes IPv6 publiés" ++ ++msgid "" ++"Advertised IPv6 prefixes. If empty, the current interface prefix is used" ++msgstr "" ++"Préfixes IPv6 publiés. Si c'est vide, le préfixe actuel de l'interface est " ++"utilisé" ++ ++msgid "Advertises Mobile IPv6 Home Agent capability (RFC3775)" ++msgstr "Publie la capacité Home Agent d'IPv6 Mobile (RFC 3775)" ++ ++msgid "Advertises Mobile Router registration capability (NEMO Basic)" ++msgstr "Publie la capacité d'enregistrement d'un Routeur Mobile (NEMO basique)" ++ ++msgid "" ++"Advertises assumed reachability time in milliseconds of neighbours in the RA " ++"if specified. 0 disables reachability advertisements" ++msgstr "" ++"Publie le temps d'accès présumé en milli-secondes des voisins dans le RA " ++"s'il est spécifié. 0 désactive les publications d'accessibilité" ++ ++msgid "" ++"Advertises the default Hop Count value for outgoing unicast packets in the " ++"RA. 0 disables hopcount advertisements" ++msgstr "" ++"Publie le nombre de sauts par défaut pour les paquets unicast sortants dans " ++"le RA. 0 désactive les publications de nombre de sauts" ++ ++msgid "Advertises the default router preference" ++msgstr "Publie la préférence du routeur par défaut" ++ ++msgid "" ++"Advertises the given link MTU in the RA if specified. 0 disables MTU " ++"advertisements" ++msgstr "" ++"Publie la valeur donnée de MTU dans les messages RA. 0 désactive la " ++"publication du MTU" ++ ++msgid "" ++"Advertises the length of time in seconds that addresses generated from the " ++"prefix via stateless address autoconfiguration remain preferred." ++msgstr "" ++ ++msgid "" ++"Advertises the length of time in seconds that the prefix is valid for the " ++"purpose of on-link determination." ++msgstr "" ++ ++msgid "" ++"Advertises the lifetime of the default router in seconds. 0 indicates that " ++"the node is no default router" ++msgstr "" ++"Publie la durée du routeur par défaut, en secondes. 0 indique que le nÅ“ud " ++"n'est pas un routeur par défaut" ++ ++msgid "" ++"Advertises the time in seconds the router is offering Mobile IPv6 Home Agent " ++"services" ++msgstr "" ++"Publie la durée en secondes pendant laquelle le routeur offre les services " ++"IPv6 Mobile d'agent personnel (Home Agent)" ++ ++msgid "" ++"Advertises wait time in milliseconds between Neighbor Solicitation messages " ++"in the RA if specified. 0 disables retransmit advertisements" ++msgstr "" ++"Publie le temps d'attente en millisecondes entre deux messages de " ++"sollicitation de voisinage dans le RA. 0 indique de ne pas retransmettre les " ++"publications" ++ ++msgid "Advertising" ++msgstr "Publication" ++ ++msgid "Autonomous" ++msgstr "Autonome" ++ ++msgid "Clients" ++msgstr "Clients" ++ ++msgid "Configuration flag" ++msgstr "Drapeau de configuration" ++ ++msgid "Current hop limit" ++msgstr "Limite de sauts actuelle" ++ ++msgid "DNSSL" ++msgstr "DNSSL" ++ ++msgid "DNSSL Configuration" ++msgstr "Configuration DNSSL" ++ ++msgid "Default lifetime" ++msgstr "Durée de vie par défaut" ++ ++msgid "Default preference" ++msgstr "Préférence par défaut" ++ ++msgid "Enable" ++msgstr "Activer" ++ ++msgid "Enable advertisements" ++msgstr "Activer les publications" ++ ++msgid "Enables router advertisements and solicitations" ++msgstr "Activer les publications et sollicitations du routeur" ++ ++msgid "" ++"Enables the additional stateful administered autoconfiguration protocol " ++"(RFC2462)" ++msgstr "" ++"Active le protocole d'auto-configuration administrée à états supplémentaire " ++"(RFC 2462)" ++ ++msgid "" ++"Enables the autoconfiguration of additional, non address information " ++"(RFC2462)" ++msgstr "" ++"Active l'auto-configuration d'informations autres que l'adresse " ++"supplémentaires (RFC 2462)" ++ ++msgid "General" ++msgstr "Général" ++ ++msgid "Home Agent information" ++msgstr "Informations de l'agent personnel (Home Agent)" ++ ++msgid "Home Agent lifetime" ++msgstr "Durée de vie de l'agent personnel (Home Agent)" ++ ++msgid "Home Agent preference" ++msgstr "Préférence de l'agent personnel (Home Agent)" ++ ++msgid "Include Home Agent Information in the RA" ++msgstr "Inclure les informations de l'agent personnel (Home Agent) dans le RA" ++ ++msgid "Include Mobile IPv6 Advertisement Interval option to RA" ++msgstr "" ++"Inclure l'option de l'intervalle de publication de Mobile IPv6 dans le RA" ++ ++msgid "Includes the link-layer address of the outgoing interface in the RA" ++msgstr "Inclure l'adresse de niveau lien de l'interface sortante dans le RA" ++ ++msgid "" ++"Indicates that the address of interface is sent instead of network prefix, " ++"as is required by Mobile IPv6" ++msgstr "" ++"Indique que l'adresse de l'interface est envoyée à la place du préfixe " ++"réseau, comme demandé par la norme IPv6 Mobile" ++ ++msgid "" ++"Indicates that the underlying link is not broadcast capable, prevents " ++"unsolicited advertisements from being sent" ++msgstr "" ++"Indique que le lien sous-jacent ne peut faire de publication « broadcast », " ++"pour éviter l'envoi de publications non sollicitées" ++ ++msgid "" ++"Indicates that this prefix can be used for autonomous address configuration " ++"(RFC4862)" ++msgstr "" ++"Indique que ce préfixe peut être utilisé pour la configuration autonome des " ++"adresses (RFC 4862)" ++ ++msgid "" ++"Indicates that this prefix can be used for on-link determination (RFC4861)" ++msgstr "" ++"Indique que ce préfixe peut être utilisé pour la détermination des adresses " ++"liées-au-support (On-Link, RFC 4861)" ++ ++msgid "Interface" ++msgstr "Interface" ++ ++msgid "Interface Configuration" ++msgstr "Configuration de l'interface" ++ ++msgid "Interface required" ++msgstr "Interface nécessaire" ++ ++msgid "Interfaces" ++msgstr "Interfaces" ++ ++msgid "Lifetime" ++msgstr "Durée de vie" ++ ++msgid "Link MTU" ++msgstr "MTU du lien" ++ ++msgid "Managed flag" ++msgstr "Indicateur de gestion" ++ ++msgid "Max. interval" ++msgstr "Intervalle Max" ++ ++msgid "Maximum advertisement interval" ++msgstr "Intervalle maximum de publication" ++ ++msgid "Minimum advertisement delay" ++msgstr "Délai de publication minimum" ++ ++msgid "Minimum advertisement interval" ++msgstr "Intervalle minimum de publication" ++ ++msgid "Mobile IPv6" ++msgstr "IPv6 Mobile" ++ ++msgid "Mobile IPv6 interval option" ++msgstr "Option d'intervalle pour l'IPv6 Mobile" ++ ++msgid "Mobile IPv6 router registration" ++msgstr "Enregistrement du routeur pour IPv6 Mobile" ++ ++msgid "Multicast" ++msgstr "Multicast" ++ ++msgid "On-link" ++msgstr "lié-au-support (On-link)" ++ ++msgid "On-link determination" ++msgstr "Détermination de la liaison-au-support (On-link)" ++ ++msgid "Preference" ++msgstr "Préférence" ++ ++msgid "Preferred lifetime" ++msgstr "Durée de vie préférée" ++ ++msgid "Prefix" ++msgstr "Préfixe" ++ ++msgid "Prefix Configuration" ++msgstr "Configuration du préfixe" ++ ++msgid "Prefixes" ++msgstr "Préfixes" ++ ++msgid "RDNSS" ++msgstr "RDNSS" ++ ++msgid "RDNSS Configuration" ++msgstr "Configuration RDNSS" ++ ++msgid "Radvd" ++msgstr "Radvd" ++ ++msgid "Radvd - DNSSL" ++msgstr "Radvd - DNSSL" ++ ++msgid "Radvd - Interface %q" ++msgstr "Radvd - Interface %q" ++ ++msgid "Radvd - Prefix" ++msgstr "Radvd - Préfixe" ++ ++msgid "Radvd - RDNSS" ++msgstr "Radvd - RDNSS" ++ ++msgid "Radvd - Route" ++msgstr "Radvd - Routage" ++ ++msgid "" ++"Radvd is a router advertisement daemon for IPv6. It listens to router " ++"solicitations and sends router advertisements as described in RFC 4861." ++msgstr "" ++"Radvd est un démon de publication de routage pour IPv6. Il écoute des " ++"sollicitations de routage (Router Sollicitation) et envoie des publications " ++"de routage (Router Advertisement) comme décrit dans la RFC 4861." ++ ++msgid "Reachable time" ++msgstr "temps d'accès" ++ ++msgid "" ++"Restrict communication to specified clients, leave empty to use multicast" ++msgstr "" ++"Restreint la communication aux clients spécifiés, laissez vide pour utiliser " ++"le multicast" ++ ++msgid "Retransmit timer" ++msgstr "Délai de retransmission" ++ ++msgid "Route Configuration" ++msgstr "Configuration du routage" ++ ++msgid "Routes" ++msgstr "Routes" ++ ++msgid "Source link-layer address" ++msgstr "Adresse-source de niveau lien" ++ ++msgid "" ++"Specifies a logical interface name to derive a 6to4 prefix from. The " ++"interfaces public IPv4 address is combined with 2002::/3 and the value of " ++"the prefix option" ++msgstr "" ++"Décrit le nom d'une interface logique de laquelle le préfixe 6to4 sera " ++"déduit. Les adresses IPv4 des interfaces publiques sont combinées avec " ++"2002::/3 et la valeur de l'option de préfixe" ++ ++msgid "Specifies the lifetime associated with the route in seconds." ++msgstr "" ++ ++msgid "Specifies the logical interface name this section belongs to" ++msgstr "" ++"Indique le nom de l'interface logique auquelle cette section est rattachée" ++ ++msgid "" ++"Specifies the maximum duration how long the DNSSL entries are used for name " ++"resolution." ++msgstr "" ++ ++msgid "" ++"Specifies the maximum duration how long the RDNSS entries are used for name " ++"resolution." ++msgstr "" ++ ++msgid "Specifies the preference associated with the default router" ++msgstr "Indique la préférence associée au routeur par défaut" ++ ++msgid "Suffix" ++msgstr "Suffixe" ++ ++msgid "" ++"The maximum time allowed between sending unsolicited multicast router " ++"advertisements from the interface, in seconds" ++msgstr "" ++"Temps maximum autorisé entre deux émissions de publications multicast non " ++"sollicitées du routeur depuis cette interface, en secondes" ++ ++msgid "" ++"The minimum time allowed between sending multicast router advertisements " ++"from the interface, in seconds" ++msgstr "" ++"Temps minimum autorisé entre deux émissions de publications multicast du " ++"routeur depuis cette interface, en secondes" ++ ++msgid "" ++"The minimum time allowed between sending unsolicited multicast router " ++"advertisements from the interface, in seconds" ++msgstr "" ++"Temps minimum autorisé entre deux émissions de publications multicast non " ++"sollicitées du routeur depuis cette interface, en secondes" ++ ++msgid "The preference for the Home Agent sending this RA" ++msgstr "Préférence pour l'agent personnel (Home Agent) envoyant ce RA" ++ ++msgid "Timing" ++msgstr "Délai" ++ ++msgid "Unicast only" ++msgstr "Unicast seulement" ++ ++msgid "Valid lifetime" ++msgstr "Durée de la validité" ++ ++msgid "Validity time" ++msgstr "Durée de validité" ++ ++msgid "default" ++msgstr "Défaut" ++ ++msgid "high" ++msgstr "haut" ++ ++msgid "low" ++msgstr "bas" ++ ++msgid "medium" ++msgstr "moyen" ++ ++msgid "no" ++msgstr "non" ++ ++msgid "yes" ++msgstr "oui" ++ ++#~ msgid "Advertised IPv6 prefix" ++#~ msgstr "Préfixe IPv6 publié" ++ ++#~ msgid "" ++#~ "Advertised IPv6 prefix. If empty, the current interface prefix is used" ++#~ msgstr "" ++#~ "Préfixe IPv6 publié. S'il est vide, le préfixe actuel de l'interface est " ++#~ "utilisé" ++ ++#~ msgid "" ++#~ "Advertises the length of time in seconds that addresses generated from " ++#~ "the prefix via stateless address autoconfiguration remain preferred. Use " ++#~ "0 to specify an infinite lifetime" ++#~ msgstr "" ++#~ "Publie la durée en secondes pendant laquelle les adresses générées depuis " ++#~ "le préfixe via l'auto-configuration sans état restent préférées. 0 " ++#~ "indique une durée infinie" ++ ++#~ msgid "" ++#~ "Advertises the length of time in seconds that the prefix is valid for the " ++#~ "purpose of on-link determination. Use 0 to specify an infinite lifetime" ++#~ msgstr "" ++#~ "Publie la durée en secondes pendant laquelle le préfixe est valable pour " ++#~ "le choix des adresses liées-au-support (on-link). 0 indique une durée " ++#~ "infinie" ++ ++#~ msgid "" ++#~ "Indicates whether that RDNSS continues to be available to hosts even if " ++#~ "they moved to a different subnet" ++#~ msgstr "" ++#~ "Indique si le RDNSS contine d'être disponible aux hôtes même s'ils ont " ++#~ "migré sur un sous-réseau différent" ++ ++#~ msgid "Open" ++#~ msgstr "Ouvert" ++ ++#~ msgid "" ++#~ "Specifies the lifetime associated with the route in seconds. Use 0 to " ++#~ "specify an infinite lifetime" ++#~ msgstr "" ++#~ "Précise la durée de vie d'une route, en secondes. Utiliser 0 pour une " ++#~ "durée de vie infinie" ++ ++#~ msgid "" ++#~ "Specifies the maximum duration how long the DNSSL entries are used for " ++#~ "name resolution. Use 0 to specify an infinite lifetime" ++#~ msgstr "" ++#~ "Indique la durée maximum d'utilisation des entrées DNSSL pour la " ++#~ "résolution de nom. Utiliser 0 pour une durée infinie" ++ ++#~ msgid "" ++#~ "Specifies the maximum duration how long the RDNSS entries are used for " ++#~ "name resolution. Use 0 to specify an infinite lifetime" ++#~ msgstr "" ++#~ "Indique la durée maximum d'utilisation des entrées RDNSS pour la " ++#~ "résolution de nom. Utiliser 0 pour une durée infinie" +diff --git a/feeds/luci/applications/luci-app-radvd/po/he/radvd.po b/feeds/luci/applications/luci-app-radvd/po/he/radvd.po +new file mode 100644 +index 0000000..63ec168 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-radvd/po/he/radvd.po +@@ -0,0 +1,367 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Last-Translator: Automatically generated\n" ++"Language-Team: none\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n != 1);\n" ++ ++msgid "6to4 interface" ++msgstr "" ++ ++msgid "Address" ++msgstr "" ++ ++msgid "Addresses" ++msgstr "" ++ ++msgid "Advanced" ++msgstr "" ++ ++msgid "Advertise Home Agent flag" ++msgstr "" ++ ++msgid "Advertise router address" ++msgstr "" ++ ++msgid "Advertised Domain Suffixes" ++msgstr "" ++ ++msgid "" ++"Advertised IPv6 RDNSS. If empty, the current IPv6 address of the interface " ++"is used" ++msgstr "" ++ ++msgid "Advertised IPv6 prefixes" ++msgstr "" ++ ++msgid "" ++"Advertised IPv6 prefixes. If empty, the current interface prefix is used" ++msgstr "" ++ ++msgid "Advertises Mobile IPv6 Home Agent capability (RFC3775)" ++msgstr "" ++ ++msgid "Advertises Mobile Router registration capability (NEMO Basic)" ++msgstr "" ++ ++msgid "" ++"Advertises assumed reachability time in milliseconds of neighbours in the RA " ++"if specified. 0 disables reachability advertisements" ++msgstr "" ++ ++msgid "" ++"Advertises the default Hop Count value for outgoing unicast packets in the " ++"RA. 0 disables hopcount advertisements" ++msgstr "" ++ ++msgid "Advertises the default router preference" ++msgstr "" ++ ++msgid "" ++"Advertises the given link MTU in the RA if specified. 0 disables MTU " ++"advertisements" ++msgstr "" ++ ++msgid "" ++"Advertises the length of time in seconds that addresses generated from the " ++"prefix via stateless address autoconfiguration remain preferred." ++msgstr "" ++ ++msgid "" ++"Advertises the length of time in seconds that the prefix is valid for the " ++"purpose of on-link determination." ++msgstr "" ++ ++msgid "" ++"Advertises the lifetime of the default router in seconds. 0 indicates that " ++"the node is no default router" ++msgstr "" ++ ++msgid "" ++"Advertises the time in seconds the router is offering Mobile IPv6 Home Agent " ++"services" ++msgstr "" ++ ++msgid "" ++"Advertises wait time in milliseconds between Neighbor Solicitation messages " ++"in the RA if specified. 0 disables retransmit advertisements" ++msgstr "" ++ ++msgid "Advertising" ++msgstr "" ++ ++msgid "Autonomous" ++msgstr "" ++ ++msgid "Clients" ++msgstr "" ++ ++msgid "Configuration flag" ++msgstr "" ++ ++msgid "Current hop limit" ++msgstr "" ++ ++msgid "DNSSL" ++msgstr "" ++ ++msgid "DNSSL Configuration" ++msgstr "" ++ ++msgid "Default lifetime" ++msgstr "" ++ ++msgid "Default preference" ++msgstr "" ++ ++msgid "Enable" ++msgstr "" ++ ++msgid "Enable advertisements" ++msgstr "" ++ ++msgid "Enables router advertisements and solicitations" ++msgstr "" ++ ++msgid "" ++"Enables the additional stateful administered autoconfiguration protocol " ++"(RFC2462)" ++msgstr "" ++ ++msgid "" ++"Enables the autoconfiguration of additional, non address information " ++"(RFC2462)" ++msgstr "" ++ ++msgid "General" ++msgstr "" ++ ++msgid "Home Agent information" ++msgstr "" ++ ++msgid "Home Agent lifetime" ++msgstr "" ++ ++msgid "Home Agent preference" ++msgstr "" ++ ++msgid "Include Home Agent Information in the RA" ++msgstr "" ++ ++msgid "Include Mobile IPv6 Advertisement Interval option to RA" ++msgstr "" ++ ++msgid "Includes the link-layer address of the outgoing interface in the RA" ++msgstr "" ++ ++msgid "" ++"Indicates that the address of interface is sent instead of network prefix, " ++"as is required by Mobile IPv6" ++msgstr "" ++ ++msgid "" ++"Indicates that the underlying link is not broadcast capable, prevents " ++"unsolicited advertisements from being sent" ++msgstr "" ++ ++msgid "" ++"Indicates that this prefix can be used for autonomous address configuration " ++"(RFC4862)" ++msgstr "" ++ ++msgid "" ++"Indicates that this prefix can be used for on-link determination (RFC4861)" ++msgstr "" ++ ++msgid "Interface" ++msgstr "" ++ ++msgid "Interface Configuration" ++msgstr "" ++ ++msgid "Interface required" ++msgstr "" ++ ++msgid "Interfaces" ++msgstr "" ++ ++msgid "Lifetime" ++msgstr "" ++ ++msgid "Link MTU" ++msgstr "" ++ ++msgid "Managed flag" ++msgstr "" ++ ++msgid "Max. interval" ++msgstr "" ++ ++msgid "Maximum advertisement interval" ++msgstr "" ++ ++msgid "Minimum advertisement delay" ++msgstr "" ++ ++msgid "Minimum advertisement interval" ++msgstr "" ++ ++msgid "Mobile IPv6" ++msgstr "" ++ ++msgid "Mobile IPv6 interval option" ++msgstr "" ++ ++msgid "Mobile IPv6 router registration" ++msgstr "" ++ ++msgid "Multicast" ++msgstr "" ++ ++msgid "On-link" ++msgstr "" ++ ++msgid "On-link determination" ++msgstr "" ++ ++msgid "Preference" ++msgstr "" ++ ++msgid "Preferred lifetime" ++msgstr "" ++ ++msgid "Prefix" ++msgstr "" ++ ++msgid "Prefix Configuration" ++msgstr "" ++ ++msgid "Prefixes" ++msgstr "" ++ ++msgid "RDNSS" ++msgstr "" ++ ++msgid "RDNSS Configuration" ++msgstr "" ++ ++msgid "Radvd" ++msgstr "" ++ ++msgid "Radvd - DNSSL" ++msgstr "" ++ ++msgid "Radvd - Interface %q" ++msgstr "" ++ ++msgid "Radvd - Prefix" ++msgstr "" ++ ++msgid "Radvd - RDNSS" ++msgstr "" ++ ++msgid "Radvd - Route" ++msgstr "" ++ ++msgid "" ++"Radvd is a router advertisement daemon for IPv6. It listens to router " ++"solicitations and sends router advertisements as described in RFC 4861." ++msgstr "" ++ ++msgid "Reachable time" ++msgstr "" ++ ++msgid "" ++"Restrict communication to specified clients, leave empty to use multicast" ++msgstr "" ++ ++msgid "Retransmit timer" ++msgstr "" ++ ++msgid "Route Configuration" ++msgstr "" ++ ++msgid "Routes" ++msgstr "" ++ ++msgid "Source link-layer address" ++msgstr "" ++ ++msgid "" ++"Specifies a logical interface name to derive a 6to4 prefix from. The " ++"interfaces public IPv4 address is combined with 2002::/3 and the value of " ++"the prefix option" ++msgstr "" ++ ++msgid "Specifies the lifetime associated with the route in seconds." ++msgstr "" ++ ++msgid "Specifies the logical interface name this section belongs to" ++msgstr "" ++ ++msgid "" ++"Specifies the maximum duration how long the DNSSL entries are used for name " ++"resolution." ++msgstr "" ++ ++msgid "" ++"Specifies the maximum duration how long the RDNSS entries are used for name " ++"resolution." ++msgstr "" ++ ++msgid "Specifies the preference associated with the default router" ++msgstr "" ++ ++msgid "Suffix" ++msgstr "" ++ ++msgid "" ++"The maximum time allowed between sending unsolicited multicast router " ++"advertisements from the interface, in seconds" ++msgstr "" ++ ++msgid "" ++"The minimum time allowed between sending multicast router advertisements " ++"from the interface, in seconds" ++msgstr "" ++ ++msgid "" ++"The minimum time allowed between sending unsolicited multicast router " ++"advertisements from the interface, in seconds" ++msgstr "" ++ ++msgid "The preference for the Home Agent sending this RA" ++msgstr "" ++ ++msgid "Timing" ++msgstr "" ++ ++msgid "Unicast only" ++msgstr "" ++ ++msgid "Valid lifetime" ++msgstr "" ++ ++msgid "Validity time" ++msgstr "" ++ ++msgid "default" ++msgstr "" ++ ++msgid "high" ++msgstr "" ++ ++msgid "low" ++msgstr "" ++ ++msgid "medium" ++msgstr "" ++ ++msgid "no" ++msgstr "" ++ ++msgid "yes" ++msgstr "" +diff --git a/feeds/luci/applications/luci-app-radvd/po/hu/radvd.po b/feeds/luci/applications/luci-app-radvd/po/hu/radvd.po +new file mode 100644 +index 0000000..90aa4ba +--- /dev/null ++++ b/feeds/luci/applications/luci-app-radvd/po/hu/radvd.po +@@ -0,0 +1,372 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"PO-Revision-Date: 2014-01-31 12:14+0200\n" ++"Last-Translator: Gabor \n" ++"Language-Team: none\n" ++"Language: hu\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n != 1);\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "6to4 interface" ++msgstr "6to4 interfész" ++ ++msgid "Address" ++msgstr "Cím" ++ ++msgid "Addresses" ++msgstr "Címek" ++ ++msgid "Advanced" ++msgstr "Fejlett" ++ ++msgid "Advertise Home Agent flag" ++msgstr "Otthoni Ãœgynök jelzÅ‘ közzététele" ++ ++msgid "Advertise router address" ++msgstr "Útválasztó cím közzététele" ++ ++msgid "Advertised Domain Suffixes" ++msgstr "Közzétett domain utótagok" ++ ++msgid "" ++"Advertised IPv6 RDNSS. If empty, the current IPv6 address of the interface " ++"is used" ++msgstr "" ++ ++msgid "Advertised IPv6 prefixes" ++msgstr "Közzétett IPv6 elÅ‘tagok" ++ ++msgid "" ++"Advertised IPv6 prefixes. If empty, the current interface prefix is used" ++msgstr "" ++"Közzétett IPv6 elÅ‘tagok. Ha üres, a jelenlegi interfész elÅ‘tag lesz " ++"használva." ++ ++msgid "Advertises Mobile IPv6 Home Agent capability (RFC3775)" ++msgstr "" ++ ++msgid "Advertises Mobile Router registration capability (NEMO Basic)" ++msgstr "" ++ ++msgid "" ++"Advertises assumed reachability time in milliseconds of neighbours in the RA " ++"if specified. 0 disables reachability advertisements" ++msgstr "" ++ ++msgid "" ++"Advertises the default Hop Count value for outgoing unicast packets in the " ++"RA. 0 disables hopcount advertisements" ++msgstr "" ++ ++msgid "Advertises the default router preference" ++msgstr "" ++ ++msgid "" ++"Advertises the given link MTU in the RA if specified. 0 disables MTU " ++"advertisements" ++msgstr "" ++ ++msgid "" ++"Advertises the length of time in seconds that addresses generated from the " ++"prefix via stateless address autoconfiguration remain preferred." ++msgstr "" ++ ++msgid "" ++"Advertises the length of time in seconds that the prefix is valid for the " ++"purpose of on-link determination." ++msgstr "" ++ ++msgid "" ++"Advertises the lifetime of the default router in seconds. 0 indicates that " ++"the node is no default router" ++msgstr "" ++ ++msgid "" ++"Advertises the time in seconds the router is offering Mobile IPv6 Home Agent " ++"services" ++msgstr "" ++ ++msgid "" ++"Advertises wait time in milliseconds between Neighbor Solicitation messages " ++"in the RA if specified. 0 disables retransmit advertisements" ++msgstr "" ++ ++msgid "Advertising" ++msgstr "" ++ ++msgid "Autonomous" ++msgstr "" ++ ++msgid "Clients" ++msgstr "" ++ ++msgid "Configuration flag" ++msgstr "" ++ ++msgid "Current hop limit" ++msgstr "" ++ ++msgid "DNSSL" ++msgstr "DNSSL" ++ ++msgid "DNSSL Configuration" ++msgstr "DNSSL konfiguráció" ++ ++msgid "Default lifetime" ++msgstr "Alapértelemezett élettartam" ++ ++msgid "Default preference" ++msgstr "" ++ ++msgid "Enable" ++msgstr "" ++ ++msgid "Enable advertisements" ++msgstr "" ++ ++msgid "Enables router advertisements and solicitations" ++msgstr "" ++ ++msgid "" ++"Enables the additional stateful administered autoconfiguration protocol " ++"(RFC2462)" ++msgstr "" ++ ++msgid "" ++"Enables the autoconfiguration of additional, non address information " ++"(RFC2462)" ++msgstr "" ++ ++msgid "General" ++msgstr "" ++ ++msgid "Home Agent information" ++msgstr "" ++ ++msgid "Home Agent lifetime" ++msgstr "" ++ ++msgid "Home Agent preference" ++msgstr "" ++ ++msgid "Include Home Agent Information in the RA" ++msgstr "" ++ ++msgid "Include Mobile IPv6 Advertisement Interval option to RA" ++msgstr "" ++ ++msgid "Includes the link-layer address of the outgoing interface in the RA" ++msgstr "" ++ ++msgid "" ++"Indicates that the address of interface is sent instead of network prefix, " ++"as is required by Mobile IPv6" ++msgstr "" ++ ++msgid "" ++"Indicates that the underlying link is not broadcast capable, prevents " ++"unsolicited advertisements from being sent" ++msgstr "" ++ ++msgid "" ++"Indicates that this prefix can be used for autonomous address configuration " ++"(RFC4862)" ++msgstr "" ++ ++msgid "" ++"Indicates that this prefix can be used for on-link determination (RFC4861)" ++msgstr "" ++ ++msgid "Interface" ++msgstr "" ++ ++msgid "Interface Configuration" ++msgstr "" ++ ++msgid "Interface required" ++msgstr "" ++ ++msgid "Interfaces" ++msgstr "Interfészek" ++ ++msgid "Lifetime" ++msgstr "Élettartam" ++ ++msgid "Link MTU" ++msgstr "Kapcsolat MTU" ++ ++msgid "Managed flag" ++msgstr "" ++ ++msgid "Max. interval" ++msgstr "" ++ ++msgid "Maximum advertisement interval" ++msgstr "" ++ ++msgid "Minimum advertisement delay" ++msgstr "" ++ ++msgid "Minimum advertisement interval" ++msgstr "" ++ ++msgid "Mobile IPv6" ++msgstr "" ++ ++msgid "Mobile IPv6 interval option" ++msgstr "" ++ ++msgid "Mobile IPv6 router registration" ++msgstr "" ++ ++msgid "Multicast" ++msgstr "" ++ ++msgid "On-link" ++msgstr "" ++ ++msgid "On-link determination" ++msgstr "" ++ ++msgid "Preference" ++msgstr "" ++ ++msgid "Preferred lifetime" ++msgstr "" ++ ++msgid "Prefix" ++msgstr "" ++ ++msgid "Prefix Configuration" ++msgstr "" ++ ++msgid "Prefixes" ++msgstr "" ++ ++msgid "RDNSS" ++msgstr "RDNSS" ++ ++msgid "RDNSS Configuration" ++msgstr "RDNSS beállítások" ++ ++msgid "Radvd" ++msgstr "Radvd" ++ ++msgid "Radvd - DNSSL" ++msgstr "Radvd - DNSSL" ++ ++msgid "Radvd - Interface %q" ++msgstr "Radvd - %q interfész" ++ ++msgid "Radvd - Prefix" ++msgstr "Radvd - ElÅ‘tag" ++ ++msgid "Radvd - RDNSS" ++msgstr "Radvd - RDNSS" ++ ++msgid "Radvd - Route" ++msgstr "Radvd - Útvonal" ++ ++msgid "" ++"Radvd is a router advertisement daemon for IPv6. It listens to router " ++"solicitations and sends router advertisements as described in RFC 4861." ++msgstr "" ++ ++msgid "Reachable time" ++msgstr "" ++ ++msgid "" ++"Restrict communication to specified clients, leave empty to use multicast" ++msgstr "" ++ ++msgid "Retransmit timer" ++msgstr "" ++ ++msgid "Route Configuration" ++msgstr "Útvonal beállítás" ++ ++msgid "Routes" ++msgstr "Útvonalak" ++ ++msgid "Source link-layer address" ++msgstr "" ++ ++msgid "" ++"Specifies a logical interface name to derive a 6to4 prefix from. The " ++"interfaces public IPv4 address is combined with 2002::/3 and the value of " ++"the prefix option" ++msgstr "" ++ ++msgid "Specifies the lifetime associated with the route in seconds." ++msgstr "" ++ ++msgid "Specifies the logical interface name this section belongs to" ++msgstr "" ++ ++msgid "" ++"Specifies the maximum duration how long the DNSSL entries are used for name " ++"resolution." ++msgstr "" ++ ++msgid "" ++"Specifies the maximum duration how long the RDNSS entries are used for name " ++"resolution." ++msgstr "" ++ ++msgid "Specifies the preference associated with the default router" ++msgstr "" ++ ++msgid "Suffix" ++msgstr "" ++ ++msgid "" ++"The maximum time allowed between sending unsolicited multicast router " ++"advertisements from the interface, in seconds" ++msgstr "" ++ ++msgid "" ++"The minimum time allowed between sending multicast router advertisements " ++"from the interface, in seconds" ++msgstr "" ++ ++msgid "" ++"The minimum time allowed between sending unsolicited multicast router " ++"advertisements from the interface, in seconds" ++msgstr "" ++ ++msgid "The preference for the Home Agent sending this RA" ++msgstr "" ++ ++msgid "Timing" ++msgstr "IdÅ‘zítés" ++ ++msgid "Unicast only" ++msgstr "" ++ ++msgid "Valid lifetime" ++msgstr "" ++ ++msgid "Validity time" ++msgstr "" ++ ++msgid "default" ++msgstr "alípértelmezett" ++ ++msgid "high" ++msgstr "magas" ++ ++msgid "low" ++msgstr "alacsony" ++ ++msgid "medium" ++msgstr "közepes" ++ ++msgid "no" ++msgstr "nem" ++ ++msgid "yes" ++msgstr "igen" +diff --git a/feeds/luci/applications/luci-app-radvd/po/it/radvd.po b/feeds/luci/applications/luci-app-radvd/po/it/radvd.po +new file mode 100644 +index 0000000..cda09b7 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-radvd/po/it/radvd.po +@@ -0,0 +1,374 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"PO-Revision-Date: 2013-02-10 19:21+0200\n" ++"Last-Translator: Francesco <3gasas@gmail.com>\n" ++"Language-Team: German\n" ++"Language: it\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n != 1);\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "6to4 interface" ++msgstr "Interfaccia 6to4" ++ ++msgid "Address" ++msgstr "Indirizzo" ++ ++msgid "Addresses" ++msgstr "Indirizzi" ++ ++msgid "Advanced" ++msgstr "Avanzato" ++ ++msgid "Advertise Home Agent flag" ++msgstr "Advertise Home Agent flag" ++ ++msgid "Advertise router address" ++msgstr "Annuncia indirizzo router" ++ ++msgid "Advertised Domain Suffixes" ++msgstr "Annuncia Suffissi Dominio" ++ ++msgid "" ++"Advertised IPv6 RDNSS. If empty, the current IPv6 address of the interface " ++"is used" ++msgstr "" ++"Annuncia RDNSS IPv6. Se vuoto, l'indirizzo IPv6 attuale dell'interfaccia " ++"verrà usato" ++ ++msgid "Advertised IPv6 prefixes" ++msgstr "Prefissi IPv6 Annunciati" ++ ++msgid "" ++"Advertised IPv6 prefixes. If empty, the current interface prefix is used" ++msgstr "" ++"Prefissi IPv6 Annunciati. Se vuoto, il prefisso dell'interfaccia attuale " ++"verrà usato" ++ ++msgid "Advertises Mobile IPv6 Home Agent capability (RFC3775)" ++msgstr "Annuncia la capacità dell'Agente Home IPv6 Mobile (RFC3775)" ++ ++msgid "Advertises Mobile Router registration capability (NEMO Basic)" ++msgstr "" ++ ++msgid "" ++"Advertises assumed reachability time in milliseconds of neighbours in the RA " ++"if specified. 0 disables reachability advertisements" ++msgstr "" ++ ++msgid "" ++"Advertises the default Hop Count value for outgoing unicast packets in the " ++"RA. 0 disables hopcount advertisements" ++msgstr "" ++ ++msgid "Advertises the default router preference" ++msgstr "" ++ ++msgid "" ++"Advertises the given link MTU in the RA if specified. 0 disables MTU " ++"advertisements" ++msgstr "" ++ ++msgid "" ++"Advertises the length of time in seconds that addresses generated from the " ++"prefix via stateless address autoconfiguration remain preferred." ++msgstr "" ++ ++msgid "" ++"Advertises the length of time in seconds that the prefix is valid for the " ++"purpose of on-link determination." ++msgstr "" ++ ++msgid "" ++"Advertises the lifetime of the default router in seconds. 0 indicates that " ++"the node is no default router" ++msgstr "" ++ ++msgid "" ++"Advertises the time in seconds the router is offering Mobile IPv6 Home Agent " ++"services" ++msgstr "" ++ ++msgid "" ++"Advertises wait time in milliseconds between Neighbor Solicitation messages " ++"in the RA if specified. 0 disables retransmit advertisements" ++msgstr "" ++ ++msgid "Advertising" ++msgstr "" ++ ++msgid "Autonomous" ++msgstr "" ++ ++msgid "Clients" ++msgstr "" ++ ++msgid "Configuration flag" ++msgstr "" ++ ++msgid "Current hop limit" ++msgstr "" ++ ++msgid "DNSSL" ++msgstr "" ++ ++msgid "DNSSL Configuration" ++msgstr "" ++ ++msgid "Default lifetime" ++msgstr "" ++ ++msgid "Default preference" ++msgstr "" ++ ++msgid "Enable" ++msgstr "Abilita" ++ ++msgid "Enable advertisements" ++msgstr "" ++ ++msgid "Enables router advertisements and solicitations" ++msgstr "" ++ ++msgid "" ++"Enables the additional stateful administered autoconfiguration protocol " ++"(RFC2462)" ++msgstr "" ++ ++msgid "" ++"Enables the autoconfiguration of additional, non address information " ++"(RFC2462)" ++msgstr "" ++ ++msgid "General" ++msgstr "" ++ ++msgid "Home Agent information" ++msgstr "" ++ ++msgid "Home Agent lifetime" ++msgstr "" ++ ++msgid "Home Agent preference" ++msgstr "" ++ ++msgid "Include Home Agent Information in the RA" ++msgstr "" ++ ++msgid "Include Mobile IPv6 Advertisement Interval option to RA" ++msgstr "" ++ ++msgid "Includes the link-layer address of the outgoing interface in the RA" ++msgstr "" ++ ++msgid "" ++"Indicates that the address of interface is sent instead of network prefix, " ++"as is required by Mobile IPv6" ++msgstr "" ++ ++msgid "" ++"Indicates that the underlying link is not broadcast capable, prevents " ++"unsolicited advertisements from being sent" ++msgstr "" ++ ++msgid "" ++"Indicates that this prefix can be used for autonomous address configuration " ++"(RFC4862)" ++msgstr "" ++ ++msgid "" ++"Indicates that this prefix can be used for on-link determination (RFC4861)" ++msgstr "" ++ ++msgid "Interface" ++msgstr "" ++ ++msgid "Interface Configuration" ++msgstr "" ++ ++msgid "Interface required" ++msgstr "" ++ ++msgid "Interfaces" ++msgstr "" ++ ++msgid "Lifetime" ++msgstr "" ++ ++msgid "Link MTU" ++msgstr "" ++ ++msgid "Managed flag" ++msgstr "" ++ ++msgid "Max. interval" ++msgstr "" ++ ++msgid "Maximum advertisement interval" ++msgstr "" ++ ++msgid "Minimum advertisement delay" ++msgstr "" ++ ++msgid "Minimum advertisement interval" ++msgstr "" ++ ++msgid "Mobile IPv6" ++msgstr "" ++ ++msgid "Mobile IPv6 interval option" ++msgstr "" ++ ++msgid "Mobile IPv6 router registration" ++msgstr "" ++ ++msgid "Multicast" ++msgstr "" ++ ++msgid "On-link" ++msgstr "" ++ ++msgid "On-link determination" ++msgstr "" ++ ++msgid "Preference" ++msgstr "" ++ ++msgid "Preferred lifetime" ++msgstr "" ++ ++msgid "Prefix" ++msgstr "" ++ ++msgid "Prefix Configuration" ++msgstr "" ++ ++msgid "Prefixes" ++msgstr "" ++ ++msgid "RDNSS" ++msgstr "" ++ ++msgid "RDNSS Configuration" ++msgstr "" ++ ++msgid "Radvd" ++msgstr "" ++ ++msgid "Radvd - DNSSL" ++msgstr "" ++ ++msgid "Radvd - Interface %q" ++msgstr "" ++ ++msgid "Radvd - Prefix" ++msgstr "" ++ ++msgid "Radvd - RDNSS" ++msgstr "" ++ ++msgid "Radvd - Route" ++msgstr "" ++ ++msgid "" ++"Radvd is a router advertisement daemon for IPv6. It listens to router " ++"solicitations and sends router advertisements as described in RFC 4861." ++msgstr "" ++ ++msgid "Reachable time" ++msgstr "" ++ ++msgid "" ++"Restrict communication to specified clients, leave empty to use multicast" ++msgstr "" ++ ++msgid "Retransmit timer" ++msgstr "" ++ ++msgid "Route Configuration" ++msgstr "" ++ ++msgid "Routes" ++msgstr "" ++ ++msgid "Source link-layer address" ++msgstr "" ++ ++msgid "" ++"Specifies a logical interface name to derive a 6to4 prefix from. The " ++"interfaces public IPv4 address is combined with 2002::/3 and the value of " ++"the prefix option" ++msgstr "" ++ ++msgid "Specifies the lifetime associated with the route in seconds." ++msgstr "" ++ ++msgid "Specifies the logical interface name this section belongs to" ++msgstr "" ++ ++msgid "" ++"Specifies the maximum duration how long the DNSSL entries are used for name " ++"resolution." ++msgstr "" ++ ++msgid "" ++"Specifies the maximum duration how long the RDNSS entries are used for name " ++"resolution." ++msgstr "" ++ ++msgid "Specifies the preference associated with the default router" ++msgstr "" ++ ++msgid "Suffix" ++msgstr "" ++ ++msgid "" ++"The maximum time allowed between sending unsolicited multicast router " ++"advertisements from the interface, in seconds" ++msgstr "" ++ ++msgid "" ++"The minimum time allowed between sending multicast router advertisements " ++"from the interface, in seconds" ++msgstr "" ++ ++msgid "" ++"The minimum time allowed between sending unsolicited multicast router " ++"advertisements from the interface, in seconds" ++msgstr "" ++ ++msgid "The preference for the Home Agent sending this RA" ++msgstr "" ++ ++msgid "Timing" ++msgstr "" ++ ++msgid "Unicast only" ++msgstr "" ++ ++msgid "Valid lifetime" ++msgstr "" ++ ++msgid "Validity time" ++msgstr "" ++ ++msgid "default" ++msgstr "" ++ ++msgid "high" ++msgstr "" ++ ++msgid "low" ++msgstr "" ++ ++msgid "medium" ++msgstr "" ++ ++msgid "no" ++msgstr "" ++ ++msgid "yes" ++msgstr "" +diff --git a/feeds/luci/applications/luci-app-radvd/po/ja/radvd.po b/feeds/luci/applications/luci-app-radvd/po/ja/radvd.po +new file mode 100644 +index 0000000..35cde34 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-radvd/po/ja/radvd.po +@@ -0,0 +1,378 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"PO-Revision-Date: 2012-04-16 09:35+0200\n" ++"Last-Translator: Kentaro \n" ++"Language-Team: German\n" ++"Language: ja\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=1; plural=0;\n" ++"X-Generator: Pootle 2.0.4\n" ++ ++msgid "6to4 interface" ++msgstr "6to4 インターフェース" ++ ++msgid "Address" ++msgstr "アドレス" ++ ++msgid "Addresses" ++msgstr "アドレス" ++ ++msgid "Advanced" ++msgstr "詳細設定" ++ ++msgid "Advertise Home Agent flag" ++msgstr "ホームエージェントフラグã®åºƒå‘Š" ++ ++msgid "Advertise router address" ++msgstr "ルーターアドレスã®åºƒå‘Š" ++ ++msgid "Advertised Domain Suffixes" ++msgstr "広告ã™ã‚‹ãƒ‰ãƒ¡ã‚¤ãƒ³ã‚µãƒ•ã‚£ãƒƒã‚¯ã‚¹ã‚’設定ã—ã¾ã™ã€‚" ++ ++msgid "" ++"Advertised IPv6 RDNSS. If empty, the current IPv6 address of the interface " ++"is used" ++msgstr "" ++"広告ã™ã‚‹IPv6 RDNSSを設定ã—ã¾ã™ã€‚未設定ã®å ´åˆã€ç¾åœ¨ã®ã‚¤ãƒ³ã‚¿ãƒ¼ãƒ•ã‚§ãƒ¼ã‚¹ã®IPv6 ã‚¢" ++"ドレスã«è¨­å®šã—ã¾ã™ã€‚" ++ ++msgid "Advertised IPv6 prefixes" ++msgstr "広告ã™ã‚‹IPv6 プレフィクスを設定ã—ã¾ã™" ++ ++msgid "" ++"Advertised IPv6 prefixes. If empty, the current interface prefix is used" ++msgstr "" ++"広告ã™ã‚‹IPv6 プレフィクスを設定ã—ã¾ã™ã€‚未設定ã®å ´åˆã€ç¾åœ¨ã®ã‚¤ãƒ³ã‚¿ãƒ¼ãƒ•ã‚§ãƒ¼ã‚¹ã®" ++"プレフィクスã«è¨­å®šã—ã¾ã™ã€‚" ++ ++msgid "Advertises Mobile IPv6 Home Agent capability (RFC3775)" ++msgstr "モãƒã‚¤ãƒ«IPv6 ホームエージェント機能ã®åºƒå‘Šã‚’è¡Œã„ã¾ã™ã€‚ (RFC3775)" ++ ++msgid "Advertises Mobile Router registration capability (NEMO Basic)" ++msgstr "" ++ ++msgid "" ++"Advertises assumed reachability time in milliseconds of neighbours in the RA " ++"if specified. 0 disables reachability advertisements" ++msgstr "" ++ ++msgid "" ++"Advertises the default Hop Count value for outgoing unicast packets in the " ++"RA. 0 disables hopcount advertisements" ++msgstr "" ++ ++msgid "Advertises the default router preference" ++msgstr "" ++ ++msgid "" ++"Advertises the given link MTU in the RA if specified. 0 disables MTU " ++"advertisements" ++msgstr "" ++ ++msgid "" ++"Advertises the length of time in seconds that addresses generated from the " ++"prefix via stateless address autoconfiguration remain preferred." ++msgstr "" ++ ++msgid "" ++"Advertises the length of time in seconds that the prefix is valid for the " ++"purpose of on-link determination." ++msgstr "" ++ ++msgid "" ++"Advertises the lifetime of the default router in seconds. 0 indicates that " ++"the node is no default router" ++msgstr "" ++ ++msgid "" ++"Advertises the time in seconds the router is offering Mobile IPv6 Home Agent " ++"services" ++msgstr "" ++ ++msgid "" ++"Advertises wait time in milliseconds between Neighbor Solicitation messages " ++"in the RA if specified. 0 disables retransmit advertisements" ++msgstr "" ++ ++msgid "Advertising" ++msgstr "広告" ++ ++msgid "Autonomous" ++msgstr "Autonomous" ++ ++msgid "Clients" ++msgstr "クライアント" ++ ++msgid "Configuration flag" ++msgstr "Configuration フラグ" ++ ++msgid "Current hop limit" ++msgstr "ç¾åœ¨ã®ãƒ›ãƒƒãƒ—数制é™" ++ ++msgid "DNSSL" ++msgstr "DNSSL" ++ ++msgid "DNSSL Configuration" ++msgstr "DNSSL 設定" ++ ++msgid "Default lifetime" ++msgstr "標準有効時間" ++ ++msgid "Default preference" ++msgstr "標準優先度設定" ++ ++msgid "Enable" ++msgstr "有効" ++ ++msgid "Enable advertisements" ++msgstr "広告を有効ã«ã™ã‚‹" ++ ++msgid "Enables router advertisements and solicitations" ++msgstr "ルータ広告ãŠã‚ˆã³è¦è«‹ã‚’有効ã«ã™ã‚‹" ++ ++msgid "" ++"Enables the additional stateful administered autoconfiguration protocol " ++"(RFC2462)" ++msgstr "" ++ ++msgid "" ++"Enables the autoconfiguration of additional, non address information " ++"(RFC2462)" ++msgstr "" ++ ++msgid "General" ++msgstr "基本設定" ++ ++msgid "Home Agent information" ++msgstr "ホームエージェント 情報" ++ ++msgid "Home Agent lifetime" ++msgstr "ホームエージェント 有効時間" ++ ++msgid "Home Agent preference" ++msgstr "ホームエージェント 優先度" ++ ++msgid "Include Home Agent Information in the RA" ++msgstr "ルータ広告 (RA) ã«ãƒ›ãƒ¼ãƒ ã‚¨ãƒ¼ã‚¸ã‚§ãƒ³ãƒˆæƒ…報をå«ã‚ã‚‹" ++ ++msgid "Include Mobile IPv6 Advertisement Interval option to RA" ++msgstr "" ++ ++msgid "Includes the link-layer address of the outgoing interface in the RA" ++msgstr "" ++ ++msgid "" ++"Indicates that the address of interface is sent instead of network prefix, " ++"as is required by Mobile IPv6" ++msgstr "" ++ ++msgid "" ++"Indicates that the underlying link is not broadcast capable, prevents " ++"unsolicited advertisements from being sent" ++msgstr "" ++ ++msgid "" ++"Indicates that this prefix can be used for autonomous address configuration " ++"(RFC4862)" ++msgstr "" ++ ++msgid "" ++"Indicates that this prefix can be used for on-link determination (RFC4861)" ++msgstr "" ++ ++msgid "Interface" ++msgstr "インターフェース" ++ ++msgid "Interface Configuration" ++msgstr "インターフェース設定" ++ ++msgid "Interface required" ++msgstr "" ++ ++msgid "Interfaces" ++msgstr "インターフェース" ++ ++msgid "Lifetime" ++msgstr "有効時間" ++ ++msgid "Link MTU" ++msgstr "リンクMTU" ++ ++msgid "Managed flag" ++msgstr "Managed フラグ" ++ ++msgid "Max. interval" ++msgstr "" ++ ++msgid "Maximum advertisement interval" ++msgstr "ルータè¦è«‹æœ€å¤§é€ä¿¡é–“éš”" ++ ++msgid "Minimum advertisement delay" ++msgstr "" ++ ++msgid "Minimum advertisement interval" ++msgstr "ルータè¦è«‹æœ€ä½Žé€ä¿¡é–“éš”" ++ ++msgid "Mobile IPv6" ++msgstr "モãƒã‚¤ãƒ« IPv6" ++ ++msgid "Mobile IPv6 interval option" ++msgstr "" ++ ++msgid "Mobile IPv6 router registration" ++msgstr "モãƒã‚¤ãƒ« IPv6 ルータ登録" ++ ++msgid "Multicast" ++msgstr "マルãƒã‚­ãƒ£ã‚¹ãƒˆ" ++ ++msgid "On-link" ++msgstr "On-link" ++ ++msgid "On-link determination" ++msgstr "" ++ ++msgid "Preference" ++msgstr "優先度" ++ ++msgid "Preferred lifetime" ++msgstr "" ++ ++msgid "Prefix" ++msgstr "プレフィクス" ++ ++msgid "Prefix Configuration" ++msgstr "プレフィクス設定" ++ ++msgid "Prefixes" ++msgstr "プレフィクス" ++ ++msgid "RDNSS" ++msgstr "RDNSS" ++ ++msgid "RDNSS Configuration" ++msgstr "RDNSS 設定" ++ ++msgid "Radvd" ++msgstr "Radvd" ++ ++msgid "Radvd - DNSSL" ++msgstr "Radvd - DNSSL" ++ ++msgid "Radvd - Interface %q" ++msgstr "Radvd - インターフェース %q" ++ ++msgid "Radvd - Prefix" ++msgstr "Radvd - プレフィクス" ++ ++msgid "Radvd - RDNSS" ++msgstr "Radvd - RDNSS" ++ ++msgid "Radvd - Route" ++msgstr "Radvd - 経路" ++ ++msgid "" ++"Radvd is a router advertisement daemon for IPv6. It listens to router " ++"solicitations and sends router advertisements as described in RFC 4861." ++msgstr "" ++"Radvdã¯ã€IPv6用ã®ãƒ«ãƒ¼ã‚¿åºƒå‘Šãƒ‡ãƒ¼ãƒ¢ãƒ³ã§ã™ã€‚Radvdã¯RFC 4861ã«è¦å®šã•ã‚Œã¦ã„ã‚‹ã€" ++"ルータè¦è«‹ã®å—ä¿¡ã¨ã€ãƒ«ãƒ¼ã‚¿åºƒå‘Šã®é€ä¿¡ã‚’è¡Œã„ã¾ã™ã€‚" ++ ++msgid "Reachable time" ++msgstr "" ++ ++msgid "" ++"Restrict communication to specified clients, leave empty to use multicast" ++msgstr "" ++"設定ã•ã‚ŒãŸã‚¯ãƒ©ã‚¤ã‚¢ãƒ³ãƒˆã«å¯¾ã—ã¦ã®ã¿é€šä¿¡ã‚’è¡Œã„ã¾ã™ã€‚設定ã—ãªã„å ´åˆã€ãƒžãƒ«ãƒã‚­ãƒ£" ++"ストを行ã„ã¾ã™ã€‚" ++ ++msgid "Retransmit timer" ++msgstr "" ++ ++msgid "Route Configuration" ++msgstr "経路設定" ++ ++msgid "Routes" ++msgstr "経路" ++ ++msgid "Source link-layer address" ++msgstr "é€ä¿¡å…ƒãƒªãƒ³ã‚¯å±¤ã‚¢ãƒ‰ãƒ¬ã‚¹" ++ ++msgid "" ++"Specifies a logical interface name to derive a 6to4 prefix from. The " ++"interfaces public IPv4 address is combined with 2002::/3 and the value of " ++"the prefix option" ++msgstr "" ++ ++msgid "Specifies the lifetime associated with the route in seconds." ++msgstr "" ++ ++msgid "Specifies the logical interface name this section belongs to" ++msgstr "ã“ã®ã‚»ã‚¯ã‚·ãƒ§ãƒ³ã§ä½¿ç”¨ã™ã‚‹è«–ç†ã‚¤ãƒ³ã‚¿ãƒ¼ãƒ•ã‚§ãƒ¼ã‚¹åを設定ã—ã¦ãã ã•ã„。" ++ ++msgid "" ++"Specifies the maximum duration how long the DNSSL entries are used for name " ++"resolution." ++msgstr "" ++ ++msgid "" ++"Specifies the maximum duration how long the RDNSS entries are used for name " ++"resolution." ++msgstr "" ++ ++msgid "Specifies the preference associated with the default router" ++msgstr "" ++ ++msgid "Suffix" ++msgstr "サフィックス" ++ ++msgid "" ++"The maximum time allowed between sending unsolicited multicast router " ++"advertisements from the interface, in seconds" ++msgstr "" ++ ++msgid "" ++"The minimum time allowed between sending multicast router advertisements " ++"from the interface, in seconds" ++msgstr "" ++ ++msgid "" ++"The minimum time allowed between sending unsolicited multicast router " ++"advertisements from the interface, in seconds" ++msgstr "" ++ ++msgid "The preference for the Home Agent sending this RA" ++msgstr "" ++ ++msgid "Timing" ++msgstr "タイミング設定" ++ ++msgid "Unicast only" ++msgstr "ユニキャストã®ã¿" ++ ++msgid "Valid lifetime" ++msgstr "有効時間ã®è¨­å®š" ++ ++msgid "Validity time" ++msgstr "有効時間" ++ ++msgid "default" ++msgstr "default" ++ ++msgid "high" ++msgstr "高" ++ ++msgid "low" ++msgstr "低" ++ ++msgid "medium" ++msgstr "中" ++ ++msgid "no" ++msgstr "ã„ã„ãˆ" ++ ++msgid "yes" ++msgstr "ã¯ã„" +diff --git a/feeds/luci/applications/luci-app-radvd/po/ms/radvd.po b/feeds/luci/applications/luci-app-radvd/po/ms/radvd.po +new file mode 100644 +index 0000000..63f8fa0 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-radvd/po/ms/radvd.po +@@ -0,0 +1,368 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"PO-Revision-Date: 2010-11-21 04:06+0100\n" ++"Last-Translator: \n" ++"Language-Team: German\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n != 1);\n" ++ ++msgid "6to4 interface" ++msgstr "" ++ ++msgid "Address" ++msgstr "" ++ ++msgid "Addresses" ++msgstr "" ++ ++msgid "Advanced" ++msgstr "" ++ ++msgid "Advertise Home Agent flag" ++msgstr "" ++ ++msgid "Advertise router address" ++msgstr "" ++ ++msgid "Advertised Domain Suffixes" ++msgstr "" ++ ++msgid "" ++"Advertised IPv6 RDNSS. If empty, the current IPv6 address of the interface " ++"is used" ++msgstr "" ++ ++msgid "Advertised IPv6 prefixes" ++msgstr "" ++ ++msgid "" ++"Advertised IPv6 prefixes. If empty, the current interface prefix is used" ++msgstr "" ++ ++msgid "Advertises Mobile IPv6 Home Agent capability (RFC3775)" ++msgstr "" ++ ++msgid "Advertises Mobile Router registration capability (NEMO Basic)" ++msgstr "" ++ ++msgid "" ++"Advertises assumed reachability time in milliseconds of neighbours in the RA " ++"if specified. 0 disables reachability advertisements" ++msgstr "" ++ ++msgid "" ++"Advertises the default Hop Count value for outgoing unicast packets in the " ++"RA. 0 disables hopcount advertisements" ++msgstr "" ++ ++msgid "Advertises the default router preference" ++msgstr "" ++ ++msgid "" ++"Advertises the given link MTU in the RA if specified. 0 disables MTU " ++"advertisements" ++msgstr "" ++ ++msgid "" ++"Advertises the length of time in seconds that addresses generated from the " ++"prefix via stateless address autoconfiguration remain preferred." ++msgstr "" ++ ++msgid "" ++"Advertises the length of time in seconds that the prefix is valid for the " ++"purpose of on-link determination." ++msgstr "" ++ ++msgid "" ++"Advertises the lifetime of the default router in seconds. 0 indicates that " ++"the node is no default router" ++msgstr "" ++ ++msgid "" ++"Advertises the time in seconds the router is offering Mobile IPv6 Home Agent " ++"services" ++msgstr "" ++ ++msgid "" ++"Advertises wait time in milliseconds between Neighbor Solicitation messages " ++"in the RA if specified. 0 disables retransmit advertisements" ++msgstr "" ++ ++msgid "Advertising" ++msgstr "" ++ ++msgid "Autonomous" ++msgstr "" ++ ++msgid "Clients" ++msgstr "" ++ ++msgid "Configuration flag" ++msgstr "" ++ ++msgid "Current hop limit" ++msgstr "" ++ ++msgid "DNSSL" ++msgstr "" ++ ++msgid "DNSSL Configuration" ++msgstr "" ++ ++msgid "Default lifetime" ++msgstr "" ++ ++msgid "Default preference" ++msgstr "" ++ ++msgid "Enable" ++msgstr "" ++ ++msgid "Enable advertisements" ++msgstr "" ++ ++msgid "Enables router advertisements and solicitations" ++msgstr "" ++ ++msgid "" ++"Enables the additional stateful administered autoconfiguration protocol " ++"(RFC2462)" ++msgstr "" ++ ++msgid "" ++"Enables the autoconfiguration of additional, non address information " ++"(RFC2462)" ++msgstr "" ++ ++msgid "General" ++msgstr "" ++ ++msgid "Home Agent information" ++msgstr "" ++ ++msgid "Home Agent lifetime" ++msgstr "" ++ ++msgid "Home Agent preference" ++msgstr "" ++ ++msgid "Include Home Agent Information in the RA" ++msgstr "" ++ ++msgid "Include Mobile IPv6 Advertisement Interval option to RA" ++msgstr "" ++ ++msgid "Includes the link-layer address of the outgoing interface in the RA" ++msgstr "" ++ ++msgid "" ++"Indicates that the address of interface is sent instead of network prefix, " ++"as is required by Mobile IPv6" ++msgstr "" ++ ++msgid "" ++"Indicates that the underlying link is not broadcast capable, prevents " ++"unsolicited advertisements from being sent" ++msgstr "" ++ ++msgid "" ++"Indicates that this prefix can be used for autonomous address configuration " ++"(RFC4862)" ++msgstr "" ++ ++msgid "" ++"Indicates that this prefix can be used for on-link determination (RFC4861)" ++msgstr "" ++ ++msgid "Interface" ++msgstr "" ++ ++msgid "Interface Configuration" ++msgstr "" ++ ++msgid "Interface required" ++msgstr "" ++ ++msgid "Interfaces" ++msgstr "" ++ ++msgid "Lifetime" ++msgstr "" ++ ++msgid "Link MTU" ++msgstr "" ++ ++msgid "Managed flag" ++msgstr "" ++ ++msgid "Max. interval" ++msgstr "" ++ ++msgid "Maximum advertisement interval" ++msgstr "" ++ ++msgid "Minimum advertisement delay" ++msgstr "" ++ ++msgid "Minimum advertisement interval" ++msgstr "" ++ ++msgid "Mobile IPv6" ++msgstr "" ++ ++msgid "Mobile IPv6 interval option" ++msgstr "" ++ ++msgid "Mobile IPv6 router registration" ++msgstr "" ++ ++msgid "Multicast" ++msgstr "" ++ ++msgid "On-link" ++msgstr "" ++ ++msgid "On-link determination" ++msgstr "" ++ ++msgid "Preference" ++msgstr "" ++ ++msgid "Preferred lifetime" ++msgstr "" ++ ++msgid "Prefix" ++msgstr "" ++ ++msgid "Prefix Configuration" ++msgstr "" ++ ++msgid "Prefixes" ++msgstr "" ++ ++msgid "RDNSS" ++msgstr "" ++ ++msgid "RDNSS Configuration" ++msgstr "" ++ ++msgid "Radvd" ++msgstr "" ++ ++msgid "Radvd - DNSSL" ++msgstr "" ++ ++msgid "Radvd - Interface %q" ++msgstr "" ++ ++msgid "Radvd - Prefix" ++msgstr "" ++ ++msgid "Radvd - RDNSS" ++msgstr "" ++ ++msgid "Radvd - Route" ++msgstr "" ++ ++msgid "" ++"Radvd is a router advertisement daemon for IPv6. It listens to router " ++"solicitations and sends router advertisements as described in RFC 4861." ++msgstr "" ++ ++msgid "Reachable time" ++msgstr "" ++ ++msgid "" ++"Restrict communication to specified clients, leave empty to use multicast" ++msgstr "" ++ ++msgid "Retransmit timer" ++msgstr "" ++ ++msgid "Route Configuration" ++msgstr "" ++ ++msgid "Routes" ++msgstr "" ++ ++msgid "Source link-layer address" ++msgstr "" ++ ++msgid "" ++"Specifies a logical interface name to derive a 6to4 prefix from. The " ++"interfaces public IPv4 address is combined with 2002::/3 and the value of " ++"the prefix option" ++msgstr "" ++ ++msgid "Specifies the lifetime associated with the route in seconds." ++msgstr "" ++ ++msgid "Specifies the logical interface name this section belongs to" ++msgstr "" ++ ++msgid "" ++"Specifies the maximum duration how long the DNSSL entries are used for name " ++"resolution." ++msgstr "" ++ ++msgid "" ++"Specifies the maximum duration how long the RDNSS entries are used for name " ++"resolution." ++msgstr "" ++ ++msgid "Specifies the preference associated with the default router" ++msgstr "" ++ ++msgid "Suffix" ++msgstr "" ++ ++msgid "" ++"The maximum time allowed between sending unsolicited multicast router " ++"advertisements from the interface, in seconds" ++msgstr "" ++ ++msgid "" ++"The minimum time allowed between sending multicast router advertisements " ++"from the interface, in seconds" ++msgstr "" ++ ++msgid "" ++"The minimum time allowed between sending unsolicited multicast router " ++"advertisements from the interface, in seconds" ++msgstr "" ++ ++msgid "The preference for the Home Agent sending this RA" ++msgstr "" ++ ++msgid "Timing" ++msgstr "" ++ ++msgid "Unicast only" ++msgstr "" ++ ++msgid "Valid lifetime" ++msgstr "" ++ ++msgid "Validity time" ++msgstr "" ++ ++msgid "default" ++msgstr "" ++ ++msgid "high" ++msgstr "" ++ ++msgid "low" ++msgstr "" ++ ++msgid "medium" ++msgstr "" ++ ++msgid "no" ++msgstr "" ++ ++msgid "yes" ++msgstr "" +diff --git a/feeds/luci/applications/luci-app-radvd/po/no/radvd.po b/feeds/luci/applications/luci-app-radvd/po/no/radvd.po +new file mode 100644 +index 0000000..1c43442 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-radvd/po/no/radvd.po +@@ -0,0 +1,435 @@ ++msgid "" ++msgstr "" ++"Last-Translator: Lars Hardy \n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++ ++msgid "6to4 interface" ++msgstr "6til4 grensesnitt" ++ ++msgid "Address" ++msgstr "Adresse" ++ ++msgid "Addresses" ++msgstr "Adresser" ++ ++msgid "Advanced" ++msgstr "Avansert" ++ ++msgid "Advertise Home Agent flag" ++msgstr "Annonser Home Agent flagg" ++ ++msgid "Advertise router address" ++msgstr "Annonser ruteradressen" ++ ++msgid "Advertised Domain Suffixes" ++msgstr "Annonserte Domenesuffikser" ++ ++msgid "" ++"Advertised IPv6 RDNSS. If empty, the current IPv6 address of the interface " ++"is used" ++msgstr "" ++"Annonsert IPv6 RDNSS. Hvis tom, brukes den gjeldende IPv6-adressen til " ++"grensesnittet" ++ ++msgid "Advertised IPv6 prefixes" ++msgstr "Annonserte IPv6 prefikser" ++ ++msgid "" ++"Advertised IPv6 prefixes. If empty, the current interface prefix is used" ++msgstr "" ++"Annonserte IPv6 prefikser. Hvis tom, brukes gjeldende grensesnitt prefiks" ++ ++msgid "Advertises Mobile IPv6 Home Agent capability (RFC3775)" ++msgstr "Annonserer Mobile IPv6 Home Agent muligheter (RFC3775)" ++ ++msgid "Advertises Mobile Router registration capability (NEMO Basic)" ++msgstr "Annonserer Mobile Router registration muligheter (NEMO Basic)" ++ ++msgid "" ++"Advertises assumed reachability time in milliseconds of neighbours in the RA " ++"if specified. 0 disables reachability advertisements" ++msgstr "" ++"Annonserer antatt tilgjengelighet i millisekunder for naboer i RA. 0 " ++"deaktiverer annonsenering av tilgjengelighet" ++ ++msgid "" ++"Advertises the default Hop Count value for outgoing unicast packets in the " ++"RA. 0 disables hopcount advertisements" ++msgstr "" ++"Annonserer standard Hop Count verdien for utgÃ¥ende unicast pakker i RA. 0 " ++"deaktierer annonsering av hopcount" ++ ++msgid "Advertises the default router preference" ++msgstr "Annonserer standard ruter preferanse" ++ ++msgid "" ++"Advertises the given link MTU in the RA if specified. 0 disables MTU " ++"advertisements" ++msgstr "Annonserer angitt link MTU i RA. 0 deaktiverer annonsereing av MTU" ++ ++msgid "" ++"Advertises the length of time in seconds that addresses generated from the " ++"prefix via stateless address autoconfiguration remain preferred." ++msgstr "" ++ ++msgid "" ++"Advertises the length of time in seconds that the prefix is valid for the " ++"purpose of on-link determination." ++msgstr "" ++ ++msgid "" ++"Advertises the lifetime of the default router in seconds. 0 indicates that " ++"the node is no default router" ++msgstr "" ++"Annonserer levetiden for standard ruter i sekunder. 0 indikerer at noden " ++"ikke er standard ruter" ++ ++msgid "" ++"Advertises the time in seconds the router is offering Mobile IPv6 Home Agent " ++"services" ++msgstr "" ++"Annonserer tiden i sekunder der ruteren tilbyr Mobile IPv6 Home Agent " ++"tjenester" ++ ++msgid "" ++"Advertises wait time in milliseconds between Neighbor Solicitation messages " ++"in the RA if specified. 0 disables retransmit advertisements" ++msgstr "" ++"Annonserer ventetiden i millisekunder mellom Neighbor Solicitation meldinger " ++"i RA. 0 deaktiverer omsendte annonseringer" ++ ++msgid "Advertising" ++msgstr "Annonsering" ++ ++msgid "Autonomous" ++msgstr "Selvstendig" ++ ++msgid "Clients" ++msgstr "Klienter" ++ ++msgid "Configuration flag" ++msgstr "Konfigurasjon flagg" ++ ++msgid "Current hop limit" ++msgstr "NÃ¥værende hop grense" ++ ++msgid "DNSSL" ++msgstr "DNSSL" ++ ++msgid "DNSSL Configuration" ++msgstr "DNSSL Konfigurasjon" ++ ++msgid "Default lifetime" ++msgstr "Standard levetid" ++ ++msgid "Default preference" ++msgstr "Standard prepreferanse" ++ ++msgid "Enable" ++msgstr "Aktiver" ++ ++msgid "Enable advertisements" ++msgstr "Aktiver annonsering" ++ ++msgid "Enables router advertisements and solicitations" ++msgstr "Aktiverer ruter annonsering og anmodning" ++ ++msgid "" ++"Enables the additional stateful administered autoconfiguration protocol " ++"(RFC2462)" ++msgstr "" ++"Aktiverer den ekstra 'stateful' administrerte autokonfigurasjon protokoll " ++"(RFC2462)" ++ ++msgid "" ++"Enables the autoconfiguration of additional, non address information " ++"(RFC2462)" ++msgstr "" ++"Aktiverer autokonfigurasjon for annen ikke adresse informasjon (RFC2462)" ++ ++msgid "General" ++msgstr "Generell" ++ ++msgid "Home Agent information" ++msgstr "Home Agen informasjon" ++ ++msgid "Home Agent lifetime" ++msgstr "Home Agent levetid" ++ ++msgid "Home Agent preference" ++msgstr "Home Agent preferanse" ++ ++msgid "Include Home Agent Information in the RA" ++msgstr "Inkluder Home Agent informasjon i RA" ++ ++msgid "Include Mobile IPv6 Advertisement Interval option to RA" ++msgstr "Inkluder Mobile IPv6 annonserings intervall alternativer til RA" ++ ++msgid "Includes the link-layer address of the outgoing interface in the RA" ++msgstr "Inkluder utgÃ¥ende grensesnitts link-layer adresse til RA" ++ ++msgid "" ++"Indicates that the address of interface is sent instead of network prefix, " ++"as is required by Mobile IPv6" ++msgstr "" ++"Indikerer at grensesnittets adresse er sendt istedet for nettverks " ++"prefikset, noe som er nødvendig for Mobile IPv6" ++ ++msgid "" ++"Indicates that the underlying link is not broadcast capable, prevents " ++"unsolicited advertisements from being sent" ++msgstr "" ++"Indikerer at underliggende link ikke er broadcast kapabel, dette forhindrer " ++"spontane annonsering" ++ ++msgid "" ++"Indicates that this prefix can be used for autonomous address configuration " ++"(RFC4862)" ++msgstr "" ++"Indikerer at dette prefikset kan bli brukt for autonom adresse konfigurasjon " ++"(RFC4862)" ++ ++msgid "" ++"Indicates that this prefix can be used for on-link determination (RFC4861)" ++msgstr "" ++"Indikerer at dette prefikset kan bli brukt for on-link bestemmelse (RFC4861)" ++ ++msgid "Interface" ++msgstr "Grensesnitt" ++ ++msgid "Interface Configuration" ++msgstr "Grensesnitt Konfigurasjon" ++ ++msgid "Interface required" ++msgstr "Grenesnitt er nødvendig" ++ ++msgid "Interfaces" ++msgstr "Grensesnitt" ++ ++msgid "Lifetime" ++msgstr "Levetid" ++ ++msgid "Link MTU" ++msgstr "Link MTU" ++ ++msgid "Managed flag" ++msgstr "Managed flagg" ++ ++msgid "Max. interval" ++msgstr "Maks. intervall" ++ ++msgid "Maximum advertisement interval" ++msgstr "Maksimum annonsering intervall" ++ ++msgid "Minimum advertisement delay" ++msgstr "Minimum annonsering forsinkelse" ++ ++msgid "Minimum advertisement interval" ++msgstr "Minimum annonsering intervall" ++ ++msgid "Mobile IPv6" ++msgstr "Mobile IPv6" ++ ++msgid "Mobile IPv6 interval option" ++msgstr "Mobile IPv6 intervall alternativer" ++ ++msgid "Mobile IPv6 router registration" ++msgstr "Mobile IPv6 ruter registrering" ++ ++msgid "Multicast" ++msgstr "Multicast" ++ ++msgid "On-link" ++msgstr "On-link" ++ ++msgid "On-link determination" ++msgstr "On-link bestemmelse" ++ ++msgid "Preference" ++msgstr "Preferanse" ++ ++msgid "Preferred lifetime" ++msgstr "Foretrukket levetid" ++ ++msgid "Prefix" ++msgstr "Prefiks" ++ ++msgid "Prefix Configuration" ++msgstr "Prefiks Konfigurasjon" ++ ++msgid "Prefixes" ++msgstr "Prefikser" ++ ++msgid "RDNSS" ++msgstr "RDNSS" ++ ++msgid "RDNSS Configuration" ++msgstr "RDNSS Konfigurasjon" ++ ++msgid "Radvd" ++msgstr "Radvd" ++ ++msgid "Radvd - DNSSL" ++msgstr "Radvd - DNSSL" ++ ++msgid "Radvd - Interface %q" ++msgstr "Radvd - Grensesnitt %q" ++ ++msgid "Radvd - Prefix" ++msgstr "Radvd - Prefiks" ++ ++msgid "Radvd - RDNSS" ++msgstr "Radvd - RDNSS" ++ ++msgid "Radvd - Route" ++msgstr "Radvd - Rute" ++ ++msgid "" ++"Radvd is a router advertisement daemon for IPv6. It listens to router " ++"solicitations and sends router advertisements as described in RFC 4861." ++msgstr "" ++"Radvd er en ruter annonserings tjeneste for IPv6. Den lytter etter ruter " ++"anmodninger og sender ruter annonsering som beskrevet i RFC 4861" ++ ++msgid "Reachable time" ++msgstr "Tilgjengelighet tid" ++ ++msgid "" ++"Restrict communication to specified clients, leave empty to use multicast" ++msgstr "" ++"Begrens kommunikasjonen til klienter spesifisert her, la stÃ¥ tomt for Ã¥ " ++"bruke multicast" ++ ++msgid "Retransmit timer" ++msgstr "Omsendelse tidsmÃ¥ler" ++ ++msgid "Route Configuration" ++msgstr "Rute Konfigurasjon" ++ ++msgid "Routes" ++msgstr "Ruter" ++ ++msgid "Source link-layer address" ++msgstr "Kilde link-lag adresse" ++ ++msgid "" ++"Specifies a logical interface name to derive a 6to4 prefix from. The " ++"interfaces public IPv4 address is combined with 2002::/3 and the value of " ++"the prefix option" ++msgstr "" ++"Angir et logisk grensenittsnavn Ã¥ hente 6til4 prefiks fra. Grensesnittets " ++"offentlige IPv4 adresse er kombinert med 2002::/3 og verdien av prefiks " ++"alternativet" ++ ++msgid "Specifies the lifetime associated with the route in seconds." ++msgstr "" ++ ++msgid "Specifies the logical interface name this section belongs to" ++msgstr "Angir det logiske grensesnittsnavnet som denne seksjonen tilhører" ++ ++msgid "" ++"Specifies the maximum duration how long the DNSSL entries are used for name " ++"resolution." ++msgstr "" ++ ++msgid "" ++"Specifies the maximum duration how long the RDNSS entries are used for name " ++"resolution." ++msgstr "" ++ ++msgid "Specifies the preference associated with the default router" ++msgstr "Angir preferanse knyttet til standard ruteren" ++ ++msgid "Suffix" ++msgstr "Suffiks" ++ ++msgid "" ++"The maximum time allowed between sending unsolicited multicast router " ++"advertisements from the interface, in seconds" ++msgstr "" ++"Maksimal tillatt tid mellom sending av spontane multicast annonseringer fra " ++"grensesnittet, i sekunder" ++ ++msgid "" ++"The minimum time allowed between sending multicast router advertisements " ++"from the interface, in seconds" ++msgstr "" ++"Minimum tillatt tid mellom sending av multicast annonseringer fra " ++"grensesnittet, i sekunder" ++ ++msgid "" ++"The minimum time allowed between sending unsolicited multicast router " ++"advertisements from the interface, in seconds" ++msgstr "" ++"Minimum tillatt tid mellom sending av spontane multicast annonseringer fra " ++"grensesnittet, i sekunder" ++ ++msgid "The preference for the Home Agent sending this RA" ++msgstr "Referansen til Home Agenten som sender denne RA" ++ ++msgid "Timing" ++msgstr "Timing" ++ ++msgid "Unicast only" ++msgstr "Kun Unikast" ++ ++msgid "Valid lifetime" ++msgstr "Gyldig levetid" ++ ++msgid "Validity time" ++msgstr "Gyldighetsperiode" ++ ++msgid "default" ++msgstr "standard" ++ ++msgid "high" ++msgstr "høy" ++ ++msgid "low" ++msgstr "lav" ++ ++msgid "medium" ++msgstr "medium" ++ ++msgid "no" ++msgstr "nei" ++ ++msgid "yes" ++msgstr "ja" ++ ++#~ msgid "" ++#~ "Advertises the length of time in seconds that addresses generated from " ++#~ "the prefix via stateless address autoconfiguration remain preferred. Use " ++#~ "0 to specify an infinite lifetime" ++#~ msgstr "" ++#~ "Annonserer tiden i sekunder hvor adresser generert ut fra prefikset via " ++#~ "tilstandsløs autokonfigurasjon er foretrukket. Bruk 0 for ubegrenset " ++#~ "levetid" ++ ++#~ msgid "" ++#~ "Advertises the length of time in seconds that the prefix is valid for the " ++#~ "purpose of on-link determination. Use 0 to specify an infinite lifetime" ++#~ msgstr "" ++#~ "Annonserer tiden i sekunder hvor prefikset er gyldig, hvor formÃ¥let er on-" ++#~ "link fastsettelse. Bruk 0 for ubegrenset levetid." ++ ++#~ msgid "" ++#~ "Specifies the lifetime associated with the route in seconds. Use 0 to " ++#~ "specify an infinite lifetime" ++#~ msgstr "" ++#~ "Angir levetiden tilknyttet ruten i sekunder. Bruk 0 for ubegrenset levetid" ++ ++#~ msgid "" ++#~ "Specifies the maximum duration how long the DNSSL entries are used for " ++#~ "name resolution. Use 0 to specify an infinite lifetime" ++#~ msgstr "" ++#~ "Angir den maksimale varighet av DNSSL navne oppslag. Bruk 0 for " ++#~ "ubegrenset levetid" ++ ++#~ msgid "" ++#~ "Specifies the maximum duration how long the RDNSS entries are used for " ++#~ "name resolution. Use 0 to specify an infinite lifetime" ++#~ msgstr "" ++#~ "Angir den maksimale varighet av RDNSS navne oppslag. Bruk 0 for " ++#~ "ubegrenset levetid" +diff --git a/feeds/luci/applications/luci-app-radvd/po/pl/radvd.po b/feeds/luci/applications/luci-app-radvd/po/pl/radvd.po +new file mode 100644 +index 0000000..a080c97 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-radvd/po/pl/radvd.po +@@ -0,0 +1,377 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"PO-Revision-Date: 2014-05-05 04:35+0200\n" ++"Last-Translator: piosl \n" ++"Language-Team: German\n" ++"Language: pl\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 " ++"|| n%100>=20) ? 1 : 2);\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++# Na polskiej Wikipedii jest artykuÅ‚ "6to4", wiÄ™c chyba ok. ++msgid "6to4 interface" ++msgstr "Interfejs 6to4" ++ ++msgid "Address" ++msgstr "Adres" ++ ++msgid "Addresses" ++msgstr "Adresy" ++ ++msgid "Advanced" ++msgstr "Zaawansowane" ++ ++msgid "Advertise Home Agent flag" ++msgstr "" ++ ++msgid "Advertise router address" ++msgstr "RozgÅ‚aszaj adres routera" ++ ++msgid "Advertised Domain Suffixes" ++msgstr "RozgÅ‚aszana Domena Rozszerzenia" ++ ++msgid "" ++"Advertised IPv6 RDNSS. If empty, the current IPv6 address of the interface " ++"is used" ++msgstr "" ++"RozgÅ‚aszane IPv6 RDNSS. Jeżeli jest puste, używany jest aktualny adres IPv6 " ++"interfejsu" ++ ++msgid "Advertised IPv6 prefixes" ++msgstr "RozgÅ‚aszany prefixy IPv6 " ++ ++msgid "" ++"Advertised IPv6 prefixes. If empty, the current interface prefix is used" ++msgstr "" ++"RozgÅ‚aszany prefixy IPv6. Jeżeli jest puste, używany jest aktualny prefix " ++"interfejsu" ++ ++msgid "Advertises Mobile IPv6 Home Agent capability (RFC3775)" ++msgstr "" ++ ++msgid "Advertises Mobile Router registration capability (NEMO Basic)" ++msgstr "" ++ ++msgid "" ++"Advertises assumed reachability time in milliseconds of neighbours in the RA " ++"if specified. 0 disables reachability advertisements" ++msgstr "" ++ ++msgid "" ++"Advertises the default Hop Count value for outgoing unicast packets in the " ++"RA. 0 disables hopcount advertisements" ++msgstr "" ++ ++msgid "Advertises the default router preference" ++msgstr "" ++ ++msgid "" ++"Advertises the given link MTU in the RA if specified. 0 disables MTU " ++"advertisements" ++msgstr "" ++ ++msgid "" ++"Advertises the length of time in seconds that addresses generated from the " ++"prefix via stateless address autoconfiguration remain preferred." ++msgstr "" ++ ++msgid "" ++"Advertises the length of time in seconds that the prefix is valid for the " ++"purpose of on-link determination." ++msgstr "" ++ ++msgid "" ++"Advertises the lifetime of the default router in seconds. 0 indicates that " ++"the node is no default router" ++msgstr "" ++ ++msgid "" ++"Advertises the time in seconds the router is offering Mobile IPv6 Home Agent " ++"services" ++msgstr "" ++ ++msgid "" ++"Advertises wait time in milliseconds between Neighbor Solicitation messages " ++"in the RA if specified. 0 disables retransmit advertisements" ++msgstr "" ++ ++msgid "Advertising" ++msgstr "RozgÅ‚aszanie" ++ ++msgid "Autonomous" ++msgstr "Autonomiczny" ++ ++msgid "Clients" ++msgstr "Klienci" ++ ++msgid "Configuration flag" ++msgstr "" ++ ++msgid "Current hop limit" ++msgstr "" ++ ++msgid "DNSSL" ++msgstr "DNSSL" ++ ++msgid "DNSSL Configuration" ++msgstr "Konfiguracja DNSSL" ++ ++msgid "Default lifetime" ++msgstr "DomyÅ›lna żywotność" ++ ++msgid "Default preference" ++msgstr "preferencje domyÅ›lne" ++ ++msgid "Enable" ++msgstr "umożliwiać" ++ ++msgid "Enable advertisements" ++msgstr "" ++ ++msgid "Enables router advertisements and solicitations" ++msgstr "" ++ ++msgid "" ++"Enables the additional stateful administered autoconfiguration protocol " ++"(RFC2462)" ++msgstr "" ++ ++msgid "" ++"Enables the autoconfiguration of additional, non address information " ++"(RFC2462)" ++msgstr "" ++ ++msgid "General" ++msgstr "Ogólny" ++ ++msgid "Home Agent information" ++msgstr "" ++ ++msgid "Home Agent lifetime" ++msgstr "" ++ ++msgid "Home Agent preference" ++msgstr "" ++ ++msgid "Include Home Agent Information in the RA" ++msgstr "" ++ ++msgid "Include Mobile IPv6 Advertisement Interval option to RA" ++msgstr "" ++ ++msgid "Includes the link-layer address of the outgoing interface in the RA" ++msgstr "" ++ ++msgid "" ++"Indicates that the address of interface is sent instead of network prefix, " ++"as is required by Mobile IPv6" ++msgstr "" ++ ++msgid "" ++"Indicates that the underlying link is not broadcast capable, prevents " ++"unsolicited advertisements from being sent" ++msgstr "" ++ ++msgid "" ++"Indicates that this prefix can be used for autonomous address configuration " ++"(RFC4862)" ++msgstr "" ++ ++msgid "" ++"Indicates that this prefix can be used for on-link determination (RFC4861)" ++msgstr "" ++ ++msgid "Interface" ++msgstr "Interfejs" ++ ++msgid "Interface Configuration" ++msgstr "Konfiguracja interfejsu" ++ ++msgid "Interface required" ++msgstr "wymagany interfejs" ++ ++msgid "Interfaces" ++msgstr "Interfejs" ++ ++msgid "Lifetime" ++msgstr "Dożywotni" ++ ++msgid "Link MTU" ++msgstr "" ++ ++msgid "Managed flag" ++msgstr "" ++ ++msgid "Max. interval" ++msgstr "Max. PrzedziaÅ‚" ++ ++msgid "Maximum advertisement interval" ++msgstr "" ++ ++msgid "Minimum advertisement delay" ++msgstr "" ++ ++msgid "Minimum advertisement interval" ++msgstr "" ++ ++msgid "Mobile IPv6" ++msgstr "" ++ ++msgid "Mobile IPv6 interval option" ++msgstr "" ++ ++msgid "Mobile IPv6 router registration" ++msgstr "" ++ ++msgid "Multicast" ++msgstr "" ++ ++msgid "On-link" ++msgstr "" ++ ++msgid "On-link determination" ++msgstr "" ++ ++msgid "Preference" ++msgstr "preferencje" ++ ++msgid "Preferred lifetime" ++msgstr "preferowana żywotność" ++ ++msgid "Prefix" ++msgstr "" ++ ++msgid "Prefix Configuration" ++msgstr "" ++ ++msgid "Prefixes" ++msgstr "" ++ ++msgid "RDNSS" ++msgstr "RDNSS" ++ ++msgid "RDNSS Configuration" ++msgstr "Konfiguracja RDNSS" ++ ++msgid "Radvd" ++msgstr "Radvd" ++ ++msgid "Radvd - DNSSL" ++msgstr "Radvd - DNSSL" ++ ++msgid "Radvd - Interface %q" ++msgstr "Radvd - interfejs %q" ++ ++msgid "Radvd - Prefix" ++msgstr "" ++ ++msgid "Radvd - RDNSS" ++msgstr "Radvd - RDNSS" ++ ++msgid "Radvd - Route" ++msgstr "" ++ ++msgid "" ++"Radvd is a router advertisement daemon for IPv6. It listens to router " ++"solicitations and sends router advertisements as described in RFC 4861." ++msgstr "" ++ ++msgid "Reachable time" ++msgstr "" ++ ++msgid "" ++"Restrict communication to specified clients, leave empty to use multicast" ++msgstr "" ++ ++msgid "Retransmit timer" ++msgstr "" ++ ++msgid "Route Configuration" ++msgstr "" ++ ++msgid "Routes" ++msgstr "" ++ ++msgid "Source link-layer address" ++msgstr "" ++ ++msgid "" ++"Specifies a logical interface name to derive a 6to4 prefix from. The " ++"interfaces public IPv4 address is combined with 2002::/3 and the value of " ++"the prefix option" ++msgstr "" ++ ++msgid "Specifies the lifetime associated with the route in seconds." ++msgstr "" ++ ++msgid "Specifies the logical interface name this section belongs to" ++msgstr "" ++ ++msgid "" ++"Specifies the maximum duration how long the DNSSL entries are used for name " ++"resolution." ++msgstr "" ++ ++msgid "" ++"Specifies the maximum duration how long the RDNSS entries are used for name " ++"resolution." ++msgstr "" ++ ++msgid "Specifies the preference associated with the default router" ++msgstr "" ++ ++msgid "Suffix" ++msgstr "" ++ ++msgid "" ++"The maximum time allowed between sending unsolicited multicast router " ++"advertisements from the interface, in seconds" ++msgstr "" ++ ++msgid "" ++"The minimum time allowed between sending multicast router advertisements " ++"from the interface, in seconds" ++msgstr "" ++ ++msgid "" ++"The minimum time allowed between sending unsolicited multicast router " ++"advertisements from the interface, in seconds" ++msgstr "" ++ ++msgid "The preference for the Home Agent sending this RA" ++msgstr "" ++ ++#, fuzzy ++msgid "Timing" ++msgstr "Timing" ++ ++msgid "Unicast only" ++msgstr "Tylko unicast" ++ ++msgid "Valid lifetime" ++msgstr "ważne dożywotnio" ++ ++msgid "Validity time" ++msgstr "czas ważnoÅ›ci" ++ ++msgid "default" ++msgstr "domyÅ›lne" ++ ++msgid "high" ++msgstr "wysoki" ++ ++msgid "low" ++msgstr "niski" ++ ++msgid "medium" ++msgstr "Å›redni" ++ ++msgid "no" ++msgstr "nie" ++ ++msgid "yes" ++msgstr "tak" +diff --git a/feeds/luci/applications/luci-app-radvd/po/pt-br/radvd.po b/feeds/luci/applications/luci-app-radvd/po/pt-br/radvd.po +new file mode 100644 +index 0000000..62c63bb +--- /dev/null ++++ b/feeds/luci/applications/luci-app-radvd/po/pt-br/radvd.po +@@ -0,0 +1,469 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"PO-Revision-Date: 2011-10-17 23:13+0200\n" ++"Last-Translator: Luiz Angelo \n" ++"Language-Team: German\n" ++"Language: pt_BR\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n > 1);\n" ++"X-Generator: Pootle 2.0.4\n" ++ ++msgid "6to4 interface" ++msgstr "Interface 6to4" ++ ++msgid "Address" ++msgstr "Endereço" ++ ++msgid "Addresses" ++msgstr "Endereços" ++ ++msgid "Advanced" ++msgstr "Avançado" ++ ++msgid "Advertise Home Agent flag" ++msgstr "Anuncie a opção de Agente Local" ++ ++msgid "Advertise router address" ++msgstr "Anuncie o endereço do roteador" ++ ++msgid "Advertised Domain Suffixes" ++msgstr "Anuncie o Sufixo do Domínio" ++ ++msgid "" ++"Advertised IPv6 RDNSS. If empty, the current IPv6 address of the interface " ++"is used" ++msgstr "" ++"Anuncia IPv6 RDNSS. Se vazio, o endereço IPv6 atual da interface será usado" ++ ++msgid "Advertised IPv6 prefixes" ++msgstr "Anuncie os prefixos IPv6" ++ ++msgid "" ++"Advertised IPv6 prefixes. If empty, the current interface prefix is used" ++msgstr "" ++"Anuncie os prefixos IPv6. Se vazio, o prefixo da interface atual será usado" ++ ++msgid "Advertises Mobile IPv6 Home Agent capability (RFC3775)" ++msgstr "Anuncia a capacidade de Agente Local para IPv6 Móvel (RFC3775)" ++ ++msgid "Advertises Mobile Router registration capability (NEMO Basic)" ++msgstr "Anuncia a capacidade de registro de Roteador Móvel (NEMO Básico)" ++ ++msgid "" ++"Advertises assumed reachability time in milliseconds of neighbours in the RA " ++"if specified. 0 disables reachability advertisements" ++msgstr "" ++"Se especificado, anuncia no RA o tempo assumido de alcance dos vizinhos, em " ++"milissegundos. Especifique 0 para desabilita este anuncio" ++ ++msgid "" ++"Advertises the default Hop Count value for outgoing unicast packets in the " ++"RA. 0 disables hopcount advertisements" ++msgstr "" ++"Anuncia no RA o valor padrão para a contagem de saltos nos pacotes unicast " ++"saindo da rede. Especifique 0 para desabilita este anuncio" ++ ++msgid "Advertises the default router preference" ++msgstr "Anuncia a preferência do roteador padrão" ++ ++msgid "" ++"Advertises the given link MTU in the RA if specified. 0 disables MTU " ++"advertisements" ++msgstr "" ++"Anuncia no RA o MTU da conexão. Especifique 0 para desabilita este anuncio" ++ ++msgid "" ++"Advertises the length of time in seconds that addresses generated from the " ++"prefix via stateless address autoconfiguration remain preferred." ++msgstr "" ++"Divulga a duração do tempo em segundos que endereços gerados a partir do " ++"prefixo através apátridas endereço autoconfiguração permanecem preferido." ++ ++msgid "" ++"Advertises the length of time in seconds that the prefix is valid for the " ++"purpose of on-link determination." ++msgstr "" ++"Divulga a duração do tempo em segundos que o prefixo é válido para o " ++"propósito de sobre-link determinado." ++ ++msgid "" ++"Advertises the lifetime of the default router in seconds. 0 indicates that " ++"the node is no default router" ++msgstr "" ++"Anuncia o período de tempo, em segundos, da validade do roteador padrão. " ++"Especifique 0 para período infinito" ++ ++msgid "" ++"Advertises the time in seconds the router is offering Mobile IPv6 Home Agent " ++"services" ++msgstr "" ++"Anuncia o período de tempo, em segundos, que o roteador está oferecendo o " ++"serviço de Agente Local para IPv6 Móvel" ++ ++msgid "" ++"Advertises wait time in milliseconds between Neighbor Solicitation messages " ++"in the RA if specified. 0 disables retransmit advertisements" ++msgstr "" ++"Anuncia o tempo de espera, em milissegundos, entre mensagens de Solicitação " ++"de Vizinhos no RA. Especifique 0 para desabilitar a retransmissão do anúncio" ++ ++msgid "Advertising" ++msgstr "Anúncio" ++ ++msgid "Autonomous" ++msgstr "Autônomo" ++ ++msgid "Clients" ++msgstr "Clientes" ++ ++msgid "Configuration flag" ++msgstr "Marcação de configuração" ++ ++msgid "Current hop limit" ++msgstr "Limite de saltos atual" ++ ++msgid "DNSSL" ++msgstr "DNSSL" ++ ++msgid "DNSSL Configuration" ++msgstr "Configuração DNSSL" ++ ++msgid "Default lifetime" ++msgstr "Validade padrão" ++ ++msgid "Default preference" ++msgstr "Preferências padrão" ++ ++msgid "Enable" ++msgstr "Habilita" ++ ++msgid "Enable advertisements" ++msgstr "Habilita anúncios" ++ ++msgid "Enables router advertisements and solicitations" ++msgstr "Habilita as solicitações e os anúncios do roteador" ++ ++msgid "" ++"Enables the additional stateful administered autoconfiguration protocol " ++"(RFC2462)" ++msgstr "" ++"Habilita o protoloco de autoconfiguração administrada com estado (RFC2462)" ++ ++msgid "" ++"Enables the autoconfiguration of additional, non address information " ++"(RFC2462)" ++msgstr "" ++"Habilita a autoconfiguração de informação adicional, não endereço (RFC2462)" ++ ++msgid "General" ++msgstr "Geral" ++ ++msgid "Home Agent information" ++msgstr "Informação do Agente Local" ++ ++msgid "Home Agent lifetime" ++msgstr "Validade do Agente Local" ++ ++msgid "Home Agent preference" ++msgstr "Preferências do Agente Local" ++ ++msgid "Include Home Agent Information in the RA" ++msgstr "Inclui Informação do Agente Local no RA" ++ ++msgid "Include Mobile IPv6 Advertisement Interval option to RA" ++msgstr "Inclui a opção de Intervalo de Anúncio de IPv6 Móvel no RA" ++ ++msgid "Includes the link-layer address of the outgoing interface in the RA" ++msgstr "Inclui o endereço da camada de rede da interface de saída no RA" ++ ++msgid "" ++"Indicates that the address of interface is sent instead of network prefix, " ++"as is required by Mobile IPv6" ++msgstr "" ++"Indica que o endereço da interface é enviado ao invés do prefixo de rede, " ++"como é necessário para IPv6 Móvel" ++ ++msgid "" ++"Indicates that the underlying link is not broadcast capable, prevents " ++"unsolicited advertisements from being sent" ++msgstr "" ++"Indica que a conexão abaixo não é capaz de utilizar broadcast. Isto inibe o " ++"envio de anúncios não solicitados" ++ ++msgid "" ++"Indicates that this prefix can be used for autonomous address configuration " ++"(RFC4862)" ++msgstr "" ++"Indica que este prefixo pode ser usado para configuração autônoma de " ++"endereços (RFC4862)" ++ ++msgid "" ++"Indicates that this prefix can be used for on-link determination (RFC4861)" ++msgstr "" ++"Indica que este prefixo pode ser usado para a determinação da presença no " ++"enlace local (RFC4861)" ++ ++msgid "Interface" ++msgstr "Interface" ++ ++msgid "Interface Configuration" ++msgstr "Configuração da Interface" ++ ++msgid "Interface required" ++msgstr "Requer uma interface" ++ ++msgid "Interfaces" ++msgstr "Interfaces" ++ ++msgid "Lifetime" ++msgstr "Validade" ++ ++msgid "Link MTU" ++msgstr "MTU da conexão" ++ ++msgid "Managed flag" ++msgstr "Marcação de gerenciado" ++ ++msgid "Max. interval" ++msgstr "Intervalo Máximo" ++ ++msgid "Maximum advertisement interval" ++msgstr "Intervalo máximo de anúncio" ++ ++msgid "Minimum advertisement delay" ++msgstr "Atraso mínimo de anúncio" ++ ++msgid "Minimum advertisement interval" ++msgstr "Intervalo mínimo de anúncio" ++ ++msgid "Mobile IPv6" ++msgstr "IPv6 Móvel" ++ ++msgid "Mobile IPv6 interval option" ++msgstr "Opçao de intervalo de IPv6 móvel" ++ ++msgid "Mobile IPv6 router registration" ++msgstr "Registro de roteador IPv6 móvel" ++ ++msgid "Multicast" ++msgstr "Multicast" ++ ++msgid "On-link" ++msgstr "Presença no enlace local" ++ ++msgid "On-link determination" ++msgstr "Determinação da presença no enlace local" ++ ++msgid "Preference" ++msgstr "Preferência" ++ ++msgid "Preferred lifetime" ++msgstr "Validade preferida" ++ ++msgid "Prefix" ++msgstr "Prefixo" ++ ++msgid "Prefix Configuration" ++msgstr "Configuração do Prefixo" ++ ++msgid "Prefixes" ++msgstr "Prefixos" ++ ++msgid "RDNSS" ++msgstr "RDNSS" ++ ++msgid "RDNSS Configuration" ++msgstr "Configuração do RDNSS" ++ ++msgid "Radvd" ++msgstr "Radvd" ++ ++msgid "Radvd - DNSSL" ++msgstr "Radvd - DNSSL" ++ ++msgid "Radvd - Interface %q" ++msgstr "Radvd - Interface %q" ++ ++msgid "Radvd - Prefix" ++msgstr "advd - Prefixo" ++ ++msgid "Radvd - RDNSS" ++msgstr "Radvd - RDNSS" ++ ++msgid "Radvd - Route" ++msgstr "Radvd - Rota" ++ ++msgid "" ++"Radvd is a router advertisement daemon for IPv6. It listens to router " ++"solicitations and sends router advertisements as described in RFC 4861." ++msgstr "" ++"Radvd é um programa de anúncio de rotas para IPv6. Ele escuta por " ++"solicitações de rota e envia anúncios de roteador (RA) como descrito em RFC " ++"4861." ++ ++msgid "Reachable time" ++msgstr "Tempo de alcance" ++ ++msgid "" ++"Restrict communication to specified clients, leave empty to use multicast" ++msgstr "" ++"Restringe a comnuicação para clientes específicos. Deixe vazio para usar " ++"multicast" ++ ++msgid "Retransmit timer" ++msgstr "Cronômetro de retransmissão" ++ ++msgid "Route Configuration" ++msgstr "Configuração da Rota" ++ ++msgid "Routes" ++msgstr "Rotas" ++ ++msgid "Source link-layer address" ++msgstr "Endereço de origem da camada de enlace" ++ ++msgid "" ++"Specifies a logical interface name to derive a 6to4 prefix from. The " ++"interfaces public IPv4 address is combined with 2002::/3 and the value of " ++"the prefix option" ++msgstr "" ++"Especifica o nome da interface lógica da qual será derivada o prefixo 6to4. " ++"O endereço IPv4 público da interface é combinado com 2002::/3 e o valor da " ++"opção de prefixo" ++ ++msgid "Specifies the lifetime associated with the route in seconds." ++msgstr "Especifica o tempo de vida associado com o trajecto em segundos." ++ ++msgid "Specifies the logical interface name this section belongs to" ++msgstr "Especifica o nome da interface lógica que esta seção pertence" ++ ++msgid "" ++"Specifies the maximum duration how long the DNSSL entries are used for name " ++"resolution." ++msgstr "" ++"Especifica a duração máxima de quanto tempo as entradas DNSSL são usados ​​" ++"para resolução de nomes." ++ ++msgid "" ++"Specifies the maximum duration how long the RDNSS entries are used for name " ++"resolution." ++msgstr "" ++"Especifica a duração máxima de quanto tempo as entradas RDNSS são usados ​​" ++"para resolução de nomes." ++ ++msgid "Specifies the preference associated with the default router" ++msgstr "Especifica as preferências associadas com o roteador padrão" ++ ++msgid "Suffix" ++msgstr "Sufixo" ++ ++msgid "" ++"The maximum time allowed between sending unsolicited multicast router " ++"advertisements from the interface, in seconds" ++msgstr "" ++"O tempo máximo, em segundos, permitido entre o envio de RAs não solicitados " ++"a partir desta interface" ++ ++msgid "" ++"The minimum time allowed between sending multicast router advertisements " ++"from the interface, in seconds" ++msgstr "" ++"O tempo mínimo, em segundos, permitido entre o envio de RAs a partir desta " ++"interface" ++ ++msgid "" ++"The minimum time allowed between sending unsolicited multicast router " ++"advertisements from the interface, in seconds" ++msgstr "" ++"O tempo mínimo, em segundos, permitido entre o envio de RAs não solicitados " ++"a partir desta interface" ++ ++msgid "The preference for the Home Agent sending this RA" ++msgstr "As preferencias para o Agente Local enviando este RA" ++ ++msgid "Timing" ++msgstr "Cronometragem" ++ ++msgid "Unicast only" ++msgstr "Somente Unicast" ++ ++msgid "Valid lifetime" ++msgstr "Duração da validade" ++ ++msgid "Validity time" ++msgstr "Tempo de validade" ++ ++msgid "default" ++msgstr "padrão" ++ ++msgid "high" ++msgstr "alto" ++ ++msgid "low" ++msgstr "baixo" ++ ++msgid "medium" ++msgstr "médio" ++ ++msgid "no" ++msgstr "não" ++ ++msgid "yes" ++msgstr "sim" ++ ++#~ msgid "Advertised IPv6 prefix" ++#~ msgstr "Anuncie o prefixo IPv6" ++ ++#~ msgid "" ++#~ "Advertised IPv6 prefix. If empty, the current interface prefix is used" ++#~ msgstr "" ++#~ "Anuncie o prefixo IPv6. Se vazio, o prefixo da interface atual será usado" ++ ++#~ msgid "" ++#~ "Advertises the length of time in seconds that addresses generated from " ++#~ "the prefix via stateless address autoconfiguration remain preferred. Use " ++#~ "0 to specify an infinite lifetime" ++#~ msgstr "" ++#~ "Anuncia o período de tempo, em segundos, que endereços gerados a partir " ++#~ "do prefixo através da autoconfiguração de endereço sem estado terão " ++#~ "preferência. Especifique 0 para período infinito" ++ ++#~ msgid "" ++#~ "Advertises the length of time in seconds that the prefix is valid for the " ++#~ "purpose of on-link determination. Use 0 to specify an infinite lifetime" ++#~ msgstr "" ++#~ "Anuncia o período de tempo, em segundos, que o prefixo é valido para o " ++#~ "propósito de determinação da presença no enlace local. Especifique 0 para " ++#~ "período infinito" ++ ++#~ msgid "" ++#~ "Indicates whether that RDNSS continues to be available to hosts even if " ++#~ "they moved to a different subnet" ++#~ msgstr "" ++#~ "Indica se o RDNSS continuará a estar disponível mesmo se o cliente for " ++#~ "movido para uma subrede diferente" ++ ++#~ msgid "Open" ++#~ msgstr "Abrir" ++ ++#~ msgid "" ++#~ "Specifies the lifetime associated with the route in seconds. Use 0 to " ++#~ "specify an infinite lifetime" ++#~ msgstr "Especifica a validade da rota em segundos. Utilize 0 para infinita" ++ ++#~ msgid "" ++#~ "Specifies the maximum duration how long the DNSSL entries are used for " ++#~ "name resolution. Use 0 to specify an infinite lifetime" ++#~ msgstr "" ++#~ "Especifica a validade da entrada DNSSL para a resolução de nomes. Utilize " ++#~ "0 para duração infinita" ++ ++#~ msgid "" ++#~ "Specifies the maximum duration how long the RDNSS entries are used for " ++#~ "name resolution. Use 0 to specify an infinite lifetime" ++#~ msgstr "" ++#~ "Especifica a validade da entrada RDNS para a resolução de nomes. Utilize " ++#~ "0 para duração infinita" +diff --git a/feeds/luci/applications/luci-app-radvd/po/pt/radvd.po b/feeds/luci/applications/luci-app-radvd/po/pt/radvd.po +new file mode 100644 +index 0000000..63f8fa0 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-radvd/po/pt/radvd.po +@@ -0,0 +1,368 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"PO-Revision-Date: 2010-11-21 04:06+0100\n" ++"Last-Translator: \n" ++"Language-Team: German\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n != 1);\n" ++ ++msgid "6to4 interface" ++msgstr "" ++ ++msgid "Address" ++msgstr "" ++ ++msgid "Addresses" ++msgstr "" ++ ++msgid "Advanced" ++msgstr "" ++ ++msgid "Advertise Home Agent flag" ++msgstr "" ++ ++msgid "Advertise router address" ++msgstr "" ++ ++msgid "Advertised Domain Suffixes" ++msgstr "" ++ ++msgid "" ++"Advertised IPv6 RDNSS. If empty, the current IPv6 address of the interface " ++"is used" ++msgstr "" ++ ++msgid "Advertised IPv6 prefixes" ++msgstr "" ++ ++msgid "" ++"Advertised IPv6 prefixes. If empty, the current interface prefix is used" ++msgstr "" ++ ++msgid "Advertises Mobile IPv6 Home Agent capability (RFC3775)" ++msgstr "" ++ ++msgid "Advertises Mobile Router registration capability (NEMO Basic)" ++msgstr "" ++ ++msgid "" ++"Advertises assumed reachability time in milliseconds of neighbours in the RA " ++"if specified. 0 disables reachability advertisements" ++msgstr "" ++ ++msgid "" ++"Advertises the default Hop Count value for outgoing unicast packets in the " ++"RA. 0 disables hopcount advertisements" ++msgstr "" ++ ++msgid "Advertises the default router preference" ++msgstr "" ++ ++msgid "" ++"Advertises the given link MTU in the RA if specified. 0 disables MTU " ++"advertisements" ++msgstr "" ++ ++msgid "" ++"Advertises the length of time in seconds that addresses generated from the " ++"prefix via stateless address autoconfiguration remain preferred." ++msgstr "" ++ ++msgid "" ++"Advertises the length of time in seconds that the prefix is valid for the " ++"purpose of on-link determination." ++msgstr "" ++ ++msgid "" ++"Advertises the lifetime of the default router in seconds. 0 indicates that " ++"the node is no default router" ++msgstr "" ++ ++msgid "" ++"Advertises the time in seconds the router is offering Mobile IPv6 Home Agent " ++"services" ++msgstr "" ++ ++msgid "" ++"Advertises wait time in milliseconds between Neighbor Solicitation messages " ++"in the RA if specified. 0 disables retransmit advertisements" ++msgstr "" ++ ++msgid "Advertising" ++msgstr "" ++ ++msgid "Autonomous" ++msgstr "" ++ ++msgid "Clients" ++msgstr "" ++ ++msgid "Configuration flag" ++msgstr "" ++ ++msgid "Current hop limit" ++msgstr "" ++ ++msgid "DNSSL" ++msgstr "" ++ ++msgid "DNSSL Configuration" ++msgstr "" ++ ++msgid "Default lifetime" ++msgstr "" ++ ++msgid "Default preference" ++msgstr "" ++ ++msgid "Enable" ++msgstr "" ++ ++msgid "Enable advertisements" ++msgstr "" ++ ++msgid "Enables router advertisements and solicitations" ++msgstr "" ++ ++msgid "" ++"Enables the additional stateful administered autoconfiguration protocol " ++"(RFC2462)" ++msgstr "" ++ ++msgid "" ++"Enables the autoconfiguration of additional, non address information " ++"(RFC2462)" ++msgstr "" ++ ++msgid "General" ++msgstr "" ++ ++msgid "Home Agent information" ++msgstr "" ++ ++msgid "Home Agent lifetime" ++msgstr "" ++ ++msgid "Home Agent preference" ++msgstr "" ++ ++msgid "Include Home Agent Information in the RA" ++msgstr "" ++ ++msgid "Include Mobile IPv6 Advertisement Interval option to RA" ++msgstr "" ++ ++msgid "Includes the link-layer address of the outgoing interface in the RA" ++msgstr "" ++ ++msgid "" ++"Indicates that the address of interface is sent instead of network prefix, " ++"as is required by Mobile IPv6" ++msgstr "" ++ ++msgid "" ++"Indicates that the underlying link is not broadcast capable, prevents " ++"unsolicited advertisements from being sent" ++msgstr "" ++ ++msgid "" ++"Indicates that this prefix can be used for autonomous address configuration " ++"(RFC4862)" ++msgstr "" ++ ++msgid "" ++"Indicates that this prefix can be used for on-link determination (RFC4861)" ++msgstr "" ++ ++msgid "Interface" ++msgstr "" ++ ++msgid "Interface Configuration" ++msgstr "" ++ ++msgid "Interface required" ++msgstr "" ++ ++msgid "Interfaces" ++msgstr "" ++ ++msgid "Lifetime" ++msgstr "" ++ ++msgid "Link MTU" ++msgstr "" ++ ++msgid "Managed flag" ++msgstr "" ++ ++msgid "Max. interval" ++msgstr "" ++ ++msgid "Maximum advertisement interval" ++msgstr "" ++ ++msgid "Minimum advertisement delay" ++msgstr "" ++ ++msgid "Minimum advertisement interval" ++msgstr "" ++ ++msgid "Mobile IPv6" ++msgstr "" ++ ++msgid "Mobile IPv6 interval option" ++msgstr "" ++ ++msgid "Mobile IPv6 router registration" ++msgstr "" ++ ++msgid "Multicast" ++msgstr "" ++ ++msgid "On-link" ++msgstr "" ++ ++msgid "On-link determination" ++msgstr "" ++ ++msgid "Preference" ++msgstr "" ++ ++msgid "Preferred lifetime" ++msgstr "" ++ ++msgid "Prefix" ++msgstr "" ++ ++msgid "Prefix Configuration" ++msgstr "" ++ ++msgid "Prefixes" ++msgstr "" ++ ++msgid "RDNSS" ++msgstr "" ++ ++msgid "RDNSS Configuration" ++msgstr "" ++ ++msgid "Radvd" ++msgstr "" ++ ++msgid "Radvd - DNSSL" ++msgstr "" ++ ++msgid "Radvd - Interface %q" ++msgstr "" ++ ++msgid "Radvd - Prefix" ++msgstr "" ++ ++msgid "Radvd - RDNSS" ++msgstr "" ++ ++msgid "Radvd - Route" ++msgstr "" ++ ++msgid "" ++"Radvd is a router advertisement daemon for IPv6. It listens to router " ++"solicitations and sends router advertisements as described in RFC 4861." ++msgstr "" ++ ++msgid "Reachable time" ++msgstr "" ++ ++msgid "" ++"Restrict communication to specified clients, leave empty to use multicast" ++msgstr "" ++ ++msgid "Retransmit timer" ++msgstr "" ++ ++msgid "Route Configuration" ++msgstr "" ++ ++msgid "Routes" ++msgstr "" ++ ++msgid "Source link-layer address" ++msgstr "" ++ ++msgid "" ++"Specifies a logical interface name to derive a 6to4 prefix from. The " ++"interfaces public IPv4 address is combined with 2002::/3 and the value of " ++"the prefix option" ++msgstr "" ++ ++msgid "Specifies the lifetime associated with the route in seconds." ++msgstr "" ++ ++msgid "Specifies the logical interface name this section belongs to" ++msgstr "" ++ ++msgid "" ++"Specifies the maximum duration how long the DNSSL entries are used for name " ++"resolution." ++msgstr "" ++ ++msgid "" ++"Specifies the maximum duration how long the RDNSS entries are used for name " ++"resolution." ++msgstr "" ++ ++msgid "Specifies the preference associated with the default router" ++msgstr "" ++ ++msgid "Suffix" ++msgstr "" ++ ++msgid "" ++"The maximum time allowed between sending unsolicited multicast router " ++"advertisements from the interface, in seconds" ++msgstr "" ++ ++msgid "" ++"The minimum time allowed between sending multicast router advertisements " ++"from the interface, in seconds" ++msgstr "" ++ ++msgid "" ++"The minimum time allowed between sending unsolicited multicast router " ++"advertisements from the interface, in seconds" ++msgstr "" ++ ++msgid "The preference for the Home Agent sending this RA" ++msgstr "" ++ ++msgid "Timing" ++msgstr "" ++ ++msgid "Unicast only" ++msgstr "" ++ ++msgid "Valid lifetime" ++msgstr "" ++ ++msgid "Validity time" ++msgstr "" ++ ++msgid "default" ++msgstr "" ++ ++msgid "high" ++msgstr "" ++ ++msgid "low" ++msgstr "" ++ ++msgid "medium" ++msgstr "" ++ ++msgid "no" ++msgstr "" ++ ++msgid "yes" ++msgstr "" +diff --git a/feeds/luci/applications/luci-app-radvd/po/ro/radvd.po b/feeds/luci/applications/luci-app-radvd/po/ro/radvd.po +new file mode 100644 +index 0000000..77e3d9e +--- /dev/null ++++ b/feeds/luci/applications/luci-app-radvd/po/ro/radvd.po +@@ -0,0 +1,384 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"PO-Revision-Date: 2011-10-07 16:12+0200\n" ++"Last-Translator: Daniel \n" ++"Language-Team: none\n" ++"Language: ro\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=3; plural=(n==1 ? 0 : (n==0 || (n%100 > 0 && n%100 < " ++"20)) ? 1 : 2);;\n" ++"X-Generator: Pootle 2.0.4\n" ++ ++msgid "6to4 interface" ++msgstr "Interfata 6la4" ++ ++msgid "Address" ++msgstr "Adresa" ++ ++msgid "Addresses" ++msgstr "Adrese" ++ ++msgid "Advanced" ++msgstr "Avansat" ++ ++msgid "Advertise Home Agent flag" ++msgstr "Anunta semaforul \"Home Agent\"" ++ ++msgid "Advertise router address" ++msgstr "Anunta adresa routerului" ++ ++msgid "Advertised Domain Suffixes" ++msgstr "Sufixe anuntate de domeniu" ++ ++msgid "" ++"Advertised IPv6 RDNSS. If empty, the current IPv6 address of the interface " ++"is used" ++msgstr "" ++"Server RDNSS IPv6 anuntat. Daca e lasat gol, atunci adresa IPv6 a interfetei " ++"este folosita" ++ ++msgid "Advertised IPv6 prefixes" ++msgstr "Prefixe IPv6 anuntate" ++ ++msgid "" ++"Advertised IPv6 prefixes. If empty, the current interface prefix is used" ++msgstr "" ++"Prefixe IPv6 anuntate. Daca e neconfigurat atunci prefixul de pe interfata " ++"curenta este folosit" ++ ++msgid "Advertises Mobile IPv6 Home Agent capability (RFC3775)" ++msgstr "Anunta capabilitatea de \"Home Agent\" IPv6 mobil (RFC3775)" ++ ++msgid "Advertises Mobile Router registration capability (NEMO Basic)" ++msgstr "Anunta capacitatea de inregistrare \"Mobile Router\"" ++ ++msgid "" ++"Advertises assumed reachability time in milliseconds of neighbours in the RA " ++"if specified. 0 disables reachability advertisements" ++msgstr "" ++ ++msgid "" ++"Advertises the default Hop Count value for outgoing unicast packets in the " ++"RA. 0 disables hopcount advertisements" ++msgstr "" ++ ++msgid "Advertises the default router preference" ++msgstr "Anunta preferinta routerului implicit" ++ ++msgid "" ++"Advertises the given link MTU in the RA if specified. 0 disables MTU " ++"advertisements" ++msgstr "" ++ ++msgid "" ++"Advertises the length of time in seconds that addresses generated from the " ++"prefix via stateless address autoconfiguration remain preferred." ++msgstr "" ++ ++msgid "" ++"Advertises the length of time in seconds that the prefix is valid for the " ++"purpose of on-link determination." ++msgstr "" ++ ++msgid "" ++"Advertises the lifetime of the default router in seconds. 0 indicates that " ++"the node is no default router" ++msgstr "" ++ ++msgid "" ++"Advertises the time in seconds the router is offering Mobile IPv6 Home Agent " ++"services" ++msgstr "" ++ ++msgid "" ++"Advertises wait time in milliseconds between Neighbor Solicitation messages " ++"in the RA if specified. 0 disables retransmit advertisements" ++msgstr "" ++ ++msgid "Advertising" ++msgstr "Anunta" ++ ++msgid "Autonomous" ++msgstr "Autonom" ++ ++msgid "Clients" ++msgstr "Clienti" ++ ++msgid "Configuration flag" ++msgstr "Semafor de configurare" ++ ++msgid "Current hop limit" ++msgstr "Limita hop-ului curent" ++ ++msgid "DNSSL" ++msgstr "DNSSL" ++ ++msgid "DNSSL Configuration" ++msgstr "Configurarea DNSSL" ++ ++msgid "Default lifetime" ++msgstr "Durata implicita" ++ ++msgid "Default preference" ++msgstr "Preferinta implicita" ++ ++msgid "Enable" ++msgstr "Activeaza" ++ ++msgid "Enable advertisements" ++msgstr "Activeaza anunturile" ++ ++msgid "Enables router advertisements and solicitations" ++msgstr "Activeaza anunturile si solicitarile routerului" ++ ++msgid "" ++"Enables the additional stateful administered autoconfiguration protocol " ++"(RFC2462)" ++msgstr "" ++ ++msgid "" ++"Enables the autoconfiguration of additional, non address information " ++"(RFC2462)" ++msgstr "" ++ ++msgid "General" ++msgstr "" ++ ++msgid "Home Agent information" ++msgstr "Informatia despre \"Home Agent\"" ++ ++msgid "Home Agent lifetime" ++msgstr "" ++ ++msgid "Home Agent preference" ++msgstr "Preferinta \"Home Agent\"" ++ ++msgid "Include Home Agent Information in the RA" ++msgstr "" ++ ++msgid "Include Mobile IPv6 Advertisement Interval option to RA" ++msgstr "" ++ ++msgid "Includes the link-layer address of the outgoing interface in the RA" ++msgstr "" ++ ++msgid "" ++"Indicates that the address of interface is sent instead of network prefix, " ++"as is required by Mobile IPv6" ++msgstr "" ++ ++msgid "" ++"Indicates that the underlying link is not broadcast capable, prevents " ++"unsolicited advertisements from being sent" ++msgstr "" ++ ++msgid "" ++"Indicates that this prefix can be used for autonomous address configuration " ++"(RFC4862)" ++msgstr "" ++ ++msgid "" ++"Indicates that this prefix can be used for on-link determination (RFC4861)" ++msgstr "" ++ ++msgid "Interface" ++msgstr "Interfata" ++ ++msgid "Interface Configuration" ++msgstr "Configurarea interfetei" ++ ++msgid "Interface required" ++msgstr "Interfata necesara" ++ ++msgid "Interfaces" ++msgstr "Interfete" ++ ++msgid "Lifetime" ++msgstr "Durata de viata" ++ ++msgid "Link MTU" ++msgstr "MTU pe legatura" ++ ++msgid "Managed flag" ++msgstr "" ++ ++msgid "Max. interval" ++msgstr "Interval maxim" ++ ++msgid "Maximum advertisement interval" ++msgstr "Intervalul maxim de anuntare" ++ ++msgid "Minimum advertisement delay" ++msgstr "" ++ ++msgid "Minimum advertisement interval" ++msgstr "" ++ ++msgid "Mobile IPv6" ++msgstr "IPv6 mobil" ++ ++msgid "Mobile IPv6 interval option" ++msgstr "" ++ ++msgid "Mobile IPv6 router registration" ++msgstr "" ++ ++msgid "Multicast" ++msgstr "Multicast" ++ ++msgid "On-link" ++msgstr "" ++ ++msgid "On-link determination" ++msgstr "" ++ ++msgid "Preference" ++msgstr "Preferinta" ++ ++msgid "Preferred lifetime" ++msgstr "Durata de viata preferata" ++ ++msgid "Prefix" ++msgstr "Prefix" ++ ++msgid "Prefix Configuration" ++msgstr "Configurarea prefixului" ++ ++msgid "Prefixes" ++msgstr "Prefixe" ++ ++msgid "RDNSS" ++msgstr "RDNSS" ++ ++msgid "RDNSS Configuration" ++msgstr "" ++ ++msgid "Radvd" ++msgstr "Radvd" ++ ++msgid "Radvd - DNSSL" ++msgstr "" ++ ++msgid "Radvd - Interface %q" ++msgstr "" ++ ++msgid "Radvd - Prefix" ++msgstr "" ++ ++msgid "Radvd - RDNSS" ++msgstr "" ++ ++msgid "Radvd - Route" ++msgstr "" ++ ++msgid "" ++"Radvd is a router advertisement daemon for IPv6. It listens to router " ++"solicitations and sends router advertisements as described in RFC 4861." ++msgstr "" ++ ++msgid "Reachable time" ++msgstr "" ++ ++msgid "" ++"Restrict communication to specified clients, leave empty to use multicast" ++msgstr "" ++ ++msgid "Retransmit timer" ++msgstr "" ++ ++msgid "Route Configuration" ++msgstr "Configurarea rutelor" ++ ++msgid "Routes" ++msgstr "Rute" ++ ++msgid "Source link-layer address" ++msgstr "" ++ ++msgid "" ++"Specifies a logical interface name to derive a 6to4 prefix from. The " ++"interfaces public IPv4 address is combined with 2002::/3 and the value of " ++"the prefix option" ++msgstr "" ++ ++msgid "Specifies the lifetime associated with the route in seconds." ++msgstr "" ++ ++msgid "Specifies the logical interface name this section belongs to" ++msgstr "" ++ ++msgid "" ++"Specifies the maximum duration how long the DNSSL entries are used for name " ++"resolution." ++msgstr "" ++ ++msgid "" ++"Specifies the maximum duration how long the RDNSS entries are used for name " ++"resolution." ++msgstr "" ++ ++msgid "Specifies the preference associated with the default router" ++msgstr "" ++ ++msgid "Suffix" ++msgstr "Sufix" ++ ++msgid "" ++"The maximum time allowed between sending unsolicited multicast router " ++"advertisements from the interface, in seconds" ++msgstr "" ++ ++msgid "" ++"The minimum time allowed between sending multicast router advertisements " ++"from the interface, in seconds" ++msgstr "" ++ ++msgid "" ++"The minimum time allowed between sending unsolicited multicast router " ++"advertisements from the interface, in seconds" ++msgstr "" ++ ++msgid "The preference for the Home Agent sending this RA" ++msgstr "" ++ ++msgid "Timing" ++msgstr "" ++ ++msgid "Unicast only" ++msgstr "Doar unicast" ++ ++msgid "Valid lifetime" ++msgstr "" ++ ++msgid "Validity time" ++msgstr "" ++ ++msgid "default" ++msgstr "" ++ ++msgid "high" ++msgstr "" ++ ++msgid "low" ++msgstr "" ++ ++msgid "medium" ++msgstr "" ++ ++msgid "no" ++msgstr "nu" ++ ++msgid "yes" ++msgstr "da" ++ ++#~ msgid "Advertised IPv6 prefix" ++#~ msgstr "Prefixul IPv6 anuntat" ++ ++#~ msgid "" ++#~ "Advertised IPv6 prefix. If empty, the current interface prefix is used" ++#~ msgstr "" ++#~ "Prefixul IPv6 anuntat. Daca e lasat gol atunci prefixul de pe interfata " ++#~ "curenta este folosit" +diff --git a/feeds/luci/applications/luci-app-radvd/po/ru/radvd.po b/feeds/luci/applications/luci-app-radvd/po/ru/radvd.po +new file mode 100644 +index 0000000..37cc942 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-radvd/po/ru/radvd.po +@@ -0,0 +1,473 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: LuCI: radvd\n" ++"POT-Creation-Date: \n" ++"PO-Revision-Date: 2012-08-16 11:37+0300\n" ++"Last-Translator: Roman A. aka BasicXP \n" ++"Language-Team: Russian \n" ++"Language: ru\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%" ++"10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" ++"X-Generator: Pootle 2.0.4\n" ++"X-Poedit-SourceCharset: UTF-8\n" ++ ++msgid "6to4 interface" ++msgstr "Ð˜Ð½Ñ‚ÐµÑ€Ñ„ÐµÐ¹Ñ 6to4" ++ ++msgid "Address" ++msgstr "ÐдреÑ" ++ ++msgid "Addresses" ++msgstr "ÐдреÑа" ++ ++msgid "Advanced" ++msgstr "РаÑширенные" ++ ++msgid "Advertise Home Agent flag" ++msgstr "Извещать индикатор домашнего агента" ++ ++msgid "Advertise router address" ++msgstr "Извещать Ð°Ð´Ñ€ÐµÑ Ð¼Ð°Ñ€ÑˆÑ€ÑƒÑ‚Ð¸Ð·Ð°Ñ‚Ð¾Ñ€Ð°" ++ ++msgid "Advertised Domain Suffixes" ++msgstr "Извещаемые ÑуффикÑÑ‹ домена" ++ ++msgid "" ++"Advertised IPv6 RDNSS. If empty, the current IPv6 address of the interface " ++"is used" ++msgstr "" ++"Извещаемый IPv6 RDNSS. ЕÑли значение не задано, то будет иÑпользован текущий " ++"IPv6-Ð°Ð´Ñ€ÐµÑ Ð¸Ð½Ñ‚ÐµÑ€Ñ„ÐµÐ¹Ñа." ++ ++msgid "Advertised IPv6 prefixes" ++msgstr "Извещаемые IPv6-префикÑÑ‹" ++ ++msgid "" ++"Advertised IPv6 prefixes. If empty, the current interface prefix is used" ++msgstr "" ++"Извещаемые IPv6-префикÑÑ‹. ЕÑли значение не задано, то будет иÑпользован " ++"текущий Ð¿Ñ€ÐµÑ„Ð¸ÐºÑ Ð¸Ð½Ñ‚ÐµÑ€Ñ„ÐµÐ¹Ñа." ++ ++msgid "Advertises Mobile IPv6 Home Agent capability (RFC3775)" ++msgstr "Извещает возможноÑти домашнего агента мобильного IPv6 (RFC3775)" ++ ++msgid "Advertises Mobile Router registration capability (NEMO Basic)" ++msgstr "" ++"Извещает возможноÑти региÑтрации мобильного маршрутизатора (NEMO Basic)" ++ ++msgid "" ++"Advertises assumed reachability time in milliseconds of neighbours in the RA " ++"if specified. 0 disables reachability advertisements" ++msgstr "" ++"Извещает предполагаемое Ð²Ñ€ÐµÐ¼Ñ Ð´Ð¾Ñтупа к ÑоÑедним узлам (мÑ). При значении 0 " ++"извещение не проиÑходит." ++ ++msgid "" ++"Advertises the default Hop Count value for outgoing unicast packets in the " ++"RA. 0 disables hopcount advertisements" ++msgstr "" ++"Извещает значение чиÑла переходов по умолчанию Ð´Ð»Ñ Ð¸ÑходÑщих одноадреÑных " ++"пакетов. При значении 0 извещение не проиÑходит." ++ ++msgid "Advertises the default router preference" ++msgstr "Извещает параметры Ð¿Ñ€ÐµÐ´Ð¿Ð¾Ñ‡Ñ‚ÐµÐ½Ð¸Ñ Ð¼Ð°Ñ€ÑˆÑ€ÑƒÑ‚Ð¸Ð·Ð°Ñ‚Ð¾Ñ€Ð° по умолчанию" ++ ++msgid "" ++"Advertises the given link MTU in the RA if specified. 0 disables MTU " ++"advertisements" ++msgstr "" ++"Извещает указанный макÑимальный размер пакета (MTU) в Ñообщении RA. 0 " ++"выключает данную функцию" ++ ++msgid "" ++"Advertises the length of time in seconds that addresses generated from the " ++"prefix via stateless address autoconfiguration remain preferred." ++msgstr "" ++"Извещает период (Ñек.), в течение которого адреÑа, Ñозданные из префикÑа Ñ " ++"помощью SLAAC, оÑтаютÑÑ Ð¿Ñ€ÐµÐ´Ð¿Ð¾Ñ‡Ñ‚Ð¸Ñ‚ÐµÐ»ÑŒÐ½Ñ‹Ð¼Ð¸." ++ ++msgid "" ++"Advertises the length of time in seconds that the prefix is valid for the " ++"purpose of on-link determination." ++msgstr "" ++"Извещает период (Ñек.), в течение которого Ð¿Ñ€ÐµÑ„Ð¸ÐºÑ ÑвлÑетÑÑ Ð´ÐµÐ¹Ñтвительным " ++"Ð´Ð»Ñ Ð¾Ð¿Ñ€ÐµÐ´ÐµÐ»ÐµÐ½Ð¸Ñ Ð²ÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ ÑоединениÑ." ++ ++msgid "" ++"Advertises the lifetime of the default router in seconds. 0 indicates that " ++"the node is no default router" ++msgstr "" ++"Извещает период дейÑÑ‚Ð²Ð¸Ñ (Ñек.) маршрутизатора по умолчанию. 0 указывает на " ++"то, что узел не ÑвлÑетÑÑ Ð¼Ð°Ñ€ÑˆÑ€ÑƒÑ‚Ð¸Ð·Ð°Ñ‚Ð¾Ñ€Ð¾Ð¼ по умолчанию." ++ ++msgid "" ++"Advertises the time in seconds the router is offering Mobile IPv6 Home Agent " ++"services" ++msgstr "" ++"Извещает период (Ñек.) предоÑÑ‚Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ñлужб домашнего агента мобильного IPv6" ++ ++msgid "" ++"Advertises wait time in milliseconds between Neighbor Solicitation messages " ++"in the RA if specified. 0 disables retransmit advertisements" ++msgstr "" ++"Извещает Ð²Ñ€ÐµÐ¼Ñ Ð¾Ð¶Ð¸Ð´Ð°Ð½Ð¸Ñ (мÑ) между ÑообщениÑми Neighbor Solicitation, еÑли " ++"RA включен. 0 отключает передачу извещений" ++ ++msgid "Advertising" ++msgstr "Извещение" ++ ++msgid "Autonomous" ++msgstr "Ðвтономный" ++ ++msgid "Clients" ++msgstr "Клиенты" ++ ++msgid "Configuration flag" ++msgstr "Конфигурационный флаг" ++ ++msgid "Current hop limit" ++msgstr "Текущее ограничение кол-ва прыжков" ++ ++msgid "DNSSL" ++msgstr "DNSSL" ++ ++msgid "DNSSL Configuration" ++msgstr "ÐšÐ¾Ð½Ñ„Ð¸Ð³ÑƒÑ€Ð°Ñ†Ð¸Ñ DNSSL" ++ ++msgid "Default lifetime" ++msgstr "Срок дейÑÑ‚Ð²Ð¸Ñ Ð¿Ð¾ умолчанию" ++ ++msgid "Default preference" ++msgstr "Приоритет по умолчанию" ++ ++msgid "Enable" ++msgstr "Включить" ++ ++msgid "Enable advertisements" ++msgstr "Включить извещениÑ" ++ ++msgid "Enables router advertisements and solicitations" ++msgstr "Включает Ð¸Ð·Ð²ÐµÑ‰ÐµÐ½Ð¸Ñ Ð¸ запроÑÑ‹ маршрутизатора" ++ ++msgid "" ++"Enables the additional stateful administered autoconfiguration protocol " ++"(RFC2462)" ++msgstr "Включает дополнительный протокол автоконфигурации (RFC2462)" ++ ++msgid "" ++"Enables the autoconfiguration of additional, non address information " ++"(RFC2462)" ++msgstr "Включает автоконфигурацию дополнительной информации (RFC2462)" ++ ++msgid "General" ++msgstr "Общие" ++ ++msgid "Home Agent information" ++msgstr "Ð˜Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð¾ домашнем агенте" ++ ++msgid "Home Agent lifetime" ++msgstr "Срок дейÑÑ‚Ð²Ð¸Ñ Ð´Ð¾Ð¼Ð°ÑˆÐ½ÐµÐ³Ð¾ агента" ++ ++msgid "Home Agent preference" ++msgstr "Приоритет домашнего агента" ++ ++msgid "Include Home Agent Information in the RA" ++msgstr "Включить информацию о домашнем агенте в ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ RA" ++ ++msgid "Include Mobile IPv6 Advertisement Interval option to RA" ++msgstr "Включить интервал Ð¸Ð·Ð²ÐµÑ‰ÐµÐ½Ð¸Ñ Ð¼Ð¾Ð±Ð¸Ð»ÑŒÐ½Ð¾Ð³Ð¾ IPv6 в ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ RA" ++ ++msgid "Includes the link-layer address of the outgoing interface in the RA" ++msgstr "Включает Ð°Ð´Ñ€ÐµÑ ÐºÐ°Ð½Ð°Ð»ÑŒÐ½Ð¾Ð³Ð¾ ÑƒÑ€Ð¾Ð²Ð½Ñ Ð¸ÑходÑщего интерфейÑа в ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ RA" ++ ++msgid "" ++"Indicates that the address of interface is sent instead of network prefix, " ++"as is required by Mobile IPv6" ++msgstr "" ++"Указывает, что Ð°Ð´Ñ€ÐµÑ Ð¸Ð½Ñ‚ÐµÑ€Ñ„ÐµÐ¹Ñа отправлÑетÑÑ Ð²Ð¼ÐµÑто префикÑа Ñети, как Ñто " ++"требуетÑÑ Ð² мобильном IPv6" ++ ++msgid "" ++"Indicates that the underlying link is not broadcast capable, prevents " ++"unsolicited advertisements from being sent" ++msgstr "" ++"Указывает, что Ñоединение не ÑвлÑетÑÑ ÑˆÐ¸Ñ€Ð¾ÐºÐ¾Ð²ÐµÑ‰Ð°Ñ‚ÐµÐ»ÑŒÐ½Ñ‹Ð¼, и блокирует отÑылку " ++"незапрошенных извещений" ++ ++msgid "" ++"Indicates that this prefix can be used for autonomous address configuration " ++"(RFC4862)" ++msgstr "" ++"Указывае, что данный Ð¿Ñ€ÐµÑ„Ð¸ÐºÑ Ð¼Ð¾Ð¶ÐµÑ‚ быть иÑпользован Ð´Ð»Ñ Ð°Ð²Ñ‚Ð¾Ð½Ð¾Ð¼Ð½Ð¾Ð¹ наÑтройки " ++"адреÑа (RFC4862)" ++ ++msgid "" ++"Indicates that this prefix can be used for on-link determination (RFC4861)" ++msgstr "" ++"Указывает, что данный Ð¿Ñ€ÐµÑ„Ð¸ÐºÑ Ð¼Ð¾Ð¶ÐµÑ‚ быть иÑпользован Ð´Ð»Ñ Ð¾Ð¿Ñ€ÐµÐ´ÐµÐ»ÐµÐ½Ð¸Ñ " ++"Ð²ÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ ÑÐ¾ÐµÐ´Ð¸Ð½ÐµÐ½Ð¸Ñ (RFC4861)" ++ ++msgid "Interface" ++msgstr "ИнтерфейÑ" ++ ++msgid "Interface Configuration" ++msgstr "ÐšÐ¾Ð½Ñ„Ð¸Ð³ÑƒÑ€Ð°Ñ†Ð¸Ñ Ð¸Ð½Ñ‚ÐµÑ€Ñ„ÐµÐ¹Ñа" ++ ++msgid "Interface required" ++msgstr "ТребуетÑÑ Ð¸Ð½Ñ‚ÐµÑ€Ñ„ÐµÐ¹Ñ" ++ ++msgid "Interfaces" ++msgstr "ИнтерфейÑÑ‹" ++ ++msgid "Lifetime" ++msgstr "Срок дейÑтвиÑ" ++ ++msgid "Link MTU" ++msgstr "МакÑимальный размер пакета (MTU)" ++ ++msgid "Managed flag" ++msgstr "УправлÑемый флаг" ++ ++msgid "Max. interval" ++msgstr "МакÑ. интервал" ++ ++msgid "Maximum advertisement interval" ++msgstr "МакÑимальный интервал извещениÑ" ++ ++msgid "Minimum advertisement delay" ++msgstr "ÐœÐ¸Ð½Ð¸Ð¼Ð°Ð»ÑŒÐ½Ð°Ñ Ð·Ð°Ð´ÐµÑ€Ð¶ÐºÐ° извещениÑ" ++ ++msgid "Minimum advertisement interval" ++msgstr "Минимальный интервал извещениÑ" ++ ++msgid "Mobile IPv6" ++msgstr "Мобильный IPv6" ++ ++msgid "Mobile IPv6 interval option" ++msgstr "Параметры интервала мобильного IPv6" ++ ++msgid "Mobile IPv6 router registration" ++msgstr "РегиÑÑ‚Ñ€Ð°Ñ†Ð¸Ñ Ð¼Ð¾Ð±Ð¸Ð»ÑŒÐ½Ð¾Ð³Ð¾ IPv6 маршрутизатора" ++ ++msgid "Multicast" ++msgstr "Ð“Ñ€ÑƒÐ¿Ð¿Ð¾Ð²Ð°Ñ Ñ€Ð°ÑÑылка" ++ ++#, fuzzy ++msgid "On-link" ++msgstr "Соединение" ++ ++msgid "On-link determination" ++msgstr "Определение Ð²ÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ ÑоединениÑ" ++ ++msgid "Preference" ++msgstr "Приоритет" ++ ++msgid "Preferred lifetime" ++msgstr "Предпочитаемый Ñрок дейÑтвиÑ" ++ ++msgid "Prefix" ++msgstr "ПрефикÑ" ++ ++msgid "Prefix Configuration" ++msgstr "ÐšÐ¾Ð½Ñ„Ð¸Ð³ÑƒÑ€Ð°Ñ†Ð¸Ñ Ð¿Ñ€ÐµÑ„Ð¸ÐºÑа" ++ ++msgid "Prefixes" ++msgstr "ПрефикÑÑ‹" ++ ++msgid "RDNSS" ++msgstr "RDNSS" ++ ++msgid "RDNSS Configuration" ++msgstr "ÐšÐ¾Ð½Ñ„Ð¸Ð³ÑƒÑ€Ð°Ñ†Ð¸Ñ RDNSS" ++ ++msgid "Radvd" ++msgstr "Radvd" ++ ++msgid "Radvd - DNSSL" ++msgstr "Radvd - DNSSL" ++ ++msgid "Radvd - Interface %q" ++msgstr "Radvd - Ð˜Ð½Ñ‚ÐµÑ€Ñ„ÐµÐ¹Ñ %q" ++ ++msgid "Radvd - Prefix" ++msgstr "Radvd - ПрефикÑ" ++ ++msgid "Radvd - RDNSS" ++msgstr "Radvd - RDNSS" ++ ++msgid "Radvd - Route" ++msgstr "Radvd - Маршрут" ++ ++msgid "" ++"Radvd is a router advertisement daemon for IPv6. It listens to router " ++"solicitations and sends router advertisements as described in RFC 4861." ++msgstr "" ++"Radvd - Ñто Ñлужба извещений маршрутизатора Ð´Ð»Ñ IPv6. Она Ñлушает запроÑÑ‹ " ++"(Router Solicitations) и отÑылает Ð¸Ð·Ð²ÐµÑ‰ÐµÐ½Ð¸Ñ (Router Advertisements), как " ++"опиÑано в RFC 4861." ++ ++msgid "Reachable time" ++msgstr "Период доÑтупноÑти" ++ ++msgid "" ++"Restrict communication to specified clients, leave empty to use multicast" ++msgstr "" ++"СвÑзыватьÑÑ Ñ‚Ð¾Ð»ÑŒÐºÐ¾ Ñ ÑƒÐºÐ°Ð·Ð°Ð½Ð½Ñ‹Ð¼Ð¸ клиентами. ОÑтавьте пуÑтым, чтобы " ++"иÑпользовать групповую раÑÑылку" ++ ++msgid "Retransmit timer" ++msgstr "Таймер ретранÑлÑции" ++ ++msgid "Route Configuration" ++msgstr "ÐаÑтройка маршрута" ++ ++msgid "Routes" ++msgstr "Маршруты" ++ ++msgid "Source link-layer address" ++msgstr "ÐÐ´Ñ€ÐµÑ Ð¸Ñточника (канальный уровень)" ++ ++msgid "" ++"Specifies a logical interface name to derive a 6to4 prefix from. The " ++"interfaces public IPv4 address is combined with 2002::/3 and the value of " ++"the prefix option" ++msgstr "" ++"УÑтанавливает Ð¸Ð¼Ñ Ð»Ð¾Ð³Ð¸Ñ‡ÐµÑкого интерфейÑа Ð´Ð»Ñ Ð¿Ð¾Ð»ÑƒÑ‡ÐµÐ½Ð¸Ñ Ð¿Ñ€ÐµÑ„Ð¸ÐºÑа 6to4. " ++"Публичный IPv4-Ð°Ð´Ñ€ÐµÑ Ð¸Ð½Ñ‚ÐµÑ€Ñ„ÐµÐ¹Ñа комбинитуетÑÑ Ñ 2002::/3 и значением префикÑа" ++ ++msgid "Specifies the lifetime associated with the route in seconds." ++msgstr "Указывает период жизни, ÑвÑзанный Ñ Ð¼Ð°Ñ€ÑˆÑ€ÑƒÑ‚Ð¾Ð¼ (Ñек.)" ++ ++msgid "Specifies the logical interface name this section belongs to" ++msgstr "" ++"УÑтанавливает Ð¸Ð¼Ñ Ð»Ð¾Ð³Ð¸Ñ‡ÐµÑкого интерфейÑа, которому принадлежит Ð´Ð°Ð½Ð½Ð°Ñ ÑекциÑ" ++ ++msgid "" ++"Specifies the maximum duration how long the DNSSL entries are used for name " ++"resolution." ++msgstr "" ++"Указывает макÑимальную длительноÑÑ‚ÑŒ иÑÐ¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Ð·Ð°Ð¿Ð¸Ñей DNSSL Ð´Ð»Ñ " ++"Ñ€Ð°Ð·Ñ€ÐµÑˆÐµÐ½Ð¸Ñ Ð¸Ð¼Ñ‘Ð½." ++ ++msgid "" ++"Specifies the maximum duration how long the RDNSS entries are used for name " ++"resolution." ++msgstr "" ++"Указывает макÑимальную длительноÑÑ‚ÑŒ иÑÐ¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Ð·Ð°Ð¿Ð¸Ñей RDNSS Ð´Ð»Ñ " ++"Ñ€Ð°Ð·Ñ€ÐµÑˆÐµÐ½Ð¸Ñ Ð¸Ð¼Ñ‘Ð½." ++ ++msgid "Specifies the preference associated with the default router" ++msgstr "Указывает приоритет, ÑвÑзанный Ñ Ð¼Ð°Ñ€ÑˆÑ€ÑƒÑ‚Ð¸Ð·Ð°Ñ‚Ð¾Ñ€Ð¾Ð¼ по умолчанию" ++ ++msgid "Suffix" ++msgstr "СуффикÑ" ++ ++msgid "" ++"The maximum time allowed between sending unsolicited multicast router " ++"advertisements from the interface, in seconds" ++msgstr "" ++"МакÑимальный интервал времени между отÑылкой групповых незапрашиваемых " ++"извещений маршрутизатора (Ñек.)" ++ ++msgid "" ++"The minimum time allowed between sending multicast router advertisements " ++"from the interface, in seconds" ++msgstr "" ++"Минимальный интервал времени между отÑылкой групповых извещений " ++"маршрутизатора Ñ Ð¸Ð½Ñ‚ÐµÑ€Ñ„ÐµÐ¹Ñа (Ñек.)" ++ ++msgid "" ++"The minimum time allowed between sending unsolicited multicast router " ++"advertisements from the interface, in seconds" ++msgstr "" ++"Минимальный интервал времени между отÑылкой групповых незапрашиваемых " ++"извещений маршрутизатора (Ñек.)" ++ ++msgid "The preference for the Home Agent sending this RA" ++msgstr "Предпочтение домашнего агента, отÑылающего данное извещение RA" ++ ++msgid "Timing" ++msgstr "Интервалы" ++ ++msgid "Unicast only" ++msgstr "Только одноадреÑÐ½Ð°Ñ Ð¿ÐµÑ€ÐµÐ´Ð°Ñ‡Ð°" ++ ++msgid "Valid lifetime" ++msgstr "Срок дейÑтвиÑ" ++ ++msgid "Validity time" ++msgstr "Период дейÑтвиÑ" ++ ++msgid "default" ++msgstr "по умолчанию" ++ ++msgid "high" ++msgstr "выÑокий" ++ ++msgid "low" ++msgstr "низкий" ++ ++msgid "medium" ++msgstr "Ñредний" ++ ++msgid "no" ++msgstr "нет" ++ ++msgid "yes" ++msgstr "да" ++ ++#~ msgid "Advertised IPv6 prefix" ++#~ msgstr "Извещаемый IPv6 префикÑ" ++ ++#~ msgid "" ++#~ "Advertised IPv6 prefix. If empty, the current interface prefix is used" ++#~ msgstr "" ++#~ "Извещаемый IPv6 префикÑ. ЕÑли значение не задано, то будет иÑпользован " ++#~ "текущий Ð¿Ñ€ÐµÑ„Ð¸ÐºÑ Ð¸Ð½Ñ‚ÐµÑ€Ñ„ÐµÐ¹Ñа." ++ ++#~ msgid "" ++#~ "Advertises the length of time in seconds that addresses generated from " ++#~ "the prefix via stateless address autoconfiguration remain preferred. Use " ++#~ "0 to specify an infinite lifetime" ++#~ msgstr "" ++#~ "Извещает Ð²Ñ€ÐµÐ¼Ñ Ð² Ñекундах, в течение которого адреÑа Ñгенерированные " ++#~ "автоматичеÑки из префикÑа оÑтаютÑÑ Ð¿Ñ€ÐµÐ´Ð¿Ð¾Ñ‡Ñ‚Ð¸Ñ‚ÐµÐ»ÑŒÐ½Ñ‹Ð¼Ð¸. 0 уÑтанавливает " ++#~ "неограниченное времÑ." ++ ++#~ msgid "" ++#~ "Advertises the length of time in seconds that the prefix is valid for the " ++#~ "purpose of on-link determination. Use 0 to specify an infinite lifetime" ++#~ msgstr "" ++#~ "Извещает Ð²Ñ€ÐµÐ¼Ñ Ð² Ñекундах, в течение которого иÑпользуетÑÑ Ð¿Ñ€ÐµÑ„Ð¸ÐºÑ Ð´Ð»Ñ " ++#~ "Ð¾Ð¿Ñ€ÐµÐ´ÐµÐ»ÐµÐ½Ð¸Ñ Ð²ÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ ÑоединениÑ. 0 уÑтанавливает неограниченное времÑ." ++ ++#~ msgid "" ++#~ "Indicates whether that RDNSS continues to be available to hosts even if " ++#~ "they moved to a different subnet" ++#~ msgstr "" ++#~ "Указывает оÑтаетÑÑ Ð»Ð¸ RDNSS доÑтупным Ð´Ð»Ñ Ñ…Ð¾Ñтов даже в Ñлучае их " ++#~ "Ð¿ÐµÑ€ÐµÐ¼ÐµÑ‰ÐµÐ½Ð¸Ñ Ð² другую подÑеть" ++ ++#~ msgid "" ++#~ "Specifies the lifetime associated with the route in seconds. Use 0 to " ++#~ "specify an infinite lifetime" ++#~ msgstr "" ++#~ "УÑтанавливает Ñрок дейÑтвиÑ, ÑвÑзанный Ñ Ð¼Ð°Ñ€ÑˆÑ€ÑƒÑ‚Ð¾Ð¼ (Ñекунды). ИÑпользуйте " ++#~ "0 Ð´Ð»Ñ ÑƒÑтановки беÑконечного Ñрока дейÑтвиÑ." ++ ++#~ msgid "" ++#~ "Specifies the maximum duration how long the DNSSL entries are used for " ++#~ "name resolution. Use 0 to specify an infinite lifetime" ++#~ msgstr "" ++#~ "УÑтанавливает макÑимальный Ñрок дейÑÑ‚Ð²Ð¸Ñ DNSSL Ñлементов Ð´Ð»Ñ Ñ€Ð°Ð·Ñ€ÐµÑˆÐµÐ½Ð¸Ñ " ++#~ "имен.ИÑпользуйте 0 Ð´Ð»Ñ ÑƒÑтановки беÑконечного Ñрока дейÑтвиÑ" ++ ++#~ msgid "" ++#~ "Specifies the maximum duration how long the RDNSS entries are used for " ++#~ "name resolution. Use 0 to specify an infinite lifetime" ++#~ msgstr "" ++#~ "УÑтанавливает макÑимальный Ñрок дейÑÑ‚Ð²Ð¸Ñ DNSSL Ñлементов Ð´Ð»Ñ Ñ€Ð°Ð·Ñ€ÐµÑˆÐµÐ½Ð¸Ñ " ++#~ "имен.ИÑпользуйте 0 Ð´Ð»Ñ ÑƒÑтановки беÑконечного Ñрока дейÑтвиÑ" +diff --git a/feeds/luci/applications/luci-app-radvd/po/sk/radvd.po b/feeds/luci/applications/luci-app-radvd/po/sk/radvd.po +new file mode 100644 +index 0000000..9bd26fa +--- /dev/null ++++ b/feeds/luci/applications/luci-app-radvd/po/sk/radvd.po +@@ -0,0 +1,367 @@ ++msgid "" ++msgstr "" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Last-Translator: Automatically generated\n" ++"Language-Team: none\n" ++"MIME-Version: 1.0\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n" ++ ++msgid "6to4 interface" ++msgstr "" ++ ++msgid "Address" ++msgstr "" ++ ++msgid "Addresses" ++msgstr "" ++ ++msgid "Advanced" ++msgstr "" ++ ++msgid "Advertise Home Agent flag" ++msgstr "" ++ ++msgid "Advertise router address" ++msgstr "" ++ ++msgid "Advertised Domain Suffixes" ++msgstr "" ++ ++msgid "" ++"Advertised IPv6 RDNSS. If empty, the current IPv6 address of the interface " ++"is used" ++msgstr "" ++ ++msgid "Advertised IPv6 prefixes" ++msgstr "" ++ ++msgid "" ++"Advertised IPv6 prefixes. If empty, the current interface prefix is used" ++msgstr "" ++ ++msgid "Advertises Mobile IPv6 Home Agent capability (RFC3775)" ++msgstr "" ++ ++msgid "Advertises Mobile Router registration capability (NEMO Basic)" ++msgstr "" ++ ++msgid "" ++"Advertises assumed reachability time in milliseconds of neighbours in the RA " ++"if specified. 0 disables reachability advertisements" ++msgstr "" ++ ++msgid "" ++"Advertises the default Hop Count value for outgoing unicast packets in the " ++"RA. 0 disables hopcount advertisements" ++msgstr "" ++ ++msgid "Advertises the default router preference" ++msgstr "" ++ ++msgid "" ++"Advertises the given link MTU in the RA if specified. 0 disables MTU " ++"advertisements" ++msgstr "" ++ ++msgid "" ++"Advertises the length of time in seconds that addresses generated from the " ++"prefix via stateless address autoconfiguration remain preferred." ++msgstr "" ++ ++msgid "" ++"Advertises the length of time in seconds that the prefix is valid for the " ++"purpose of on-link determination." ++msgstr "" ++ ++msgid "" ++"Advertises the lifetime of the default router in seconds. 0 indicates that " ++"the node is no default router" ++msgstr "" ++ ++msgid "" ++"Advertises the time in seconds the router is offering Mobile IPv6 Home Agent " ++"services" ++msgstr "" ++ ++msgid "" ++"Advertises wait time in milliseconds between Neighbor Solicitation messages " ++"in the RA if specified. 0 disables retransmit advertisements" ++msgstr "" ++ ++msgid "Advertising" ++msgstr "" ++ ++msgid "Autonomous" ++msgstr "" ++ ++msgid "Clients" ++msgstr "" ++ ++msgid "Configuration flag" ++msgstr "" ++ ++msgid "Current hop limit" ++msgstr "" ++ ++msgid "DNSSL" ++msgstr "" ++ ++msgid "DNSSL Configuration" ++msgstr "" ++ ++msgid "Default lifetime" ++msgstr "" ++ ++msgid "Default preference" ++msgstr "" ++ ++msgid "Enable" ++msgstr "" ++ ++msgid "Enable advertisements" ++msgstr "" ++ ++msgid "Enables router advertisements and solicitations" ++msgstr "" ++ ++msgid "" ++"Enables the additional stateful administered autoconfiguration protocol " ++"(RFC2462)" ++msgstr "" ++ ++msgid "" ++"Enables the autoconfiguration of additional, non address information " ++"(RFC2462)" ++msgstr "" ++ ++msgid "General" ++msgstr "" ++ ++msgid "Home Agent information" ++msgstr "" ++ ++msgid "Home Agent lifetime" ++msgstr "" ++ ++msgid "Home Agent preference" ++msgstr "" ++ ++msgid "Include Home Agent Information in the RA" ++msgstr "" ++ ++msgid "Include Mobile IPv6 Advertisement Interval option to RA" ++msgstr "" ++ ++msgid "Includes the link-layer address of the outgoing interface in the RA" ++msgstr "" ++ ++msgid "" ++"Indicates that the address of interface is sent instead of network prefix, " ++"as is required by Mobile IPv6" ++msgstr "" ++ ++msgid "" ++"Indicates that the underlying link is not broadcast capable, prevents " ++"unsolicited advertisements from being sent" ++msgstr "" ++ ++msgid "" ++"Indicates that this prefix can be used for autonomous address configuration " ++"(RFC4862)" ++msgstr "" ++ ++msgid "" ++"Indicates that this prefix can be used for on-link determination (RFC4861)" ++msgstr "" ++ ++msgid "Interface" ++msgstr "" ++ ++msgid "Interface Configuration" ++msgstr "" ++ ++msgid "Interface required" ++msgstr "" ++ ++msgid "Interfaces" ++msgstr "" ++ ++msgid "Lifetime" ++msgstr "" ++ ++msgid "Link MTU" ++msgstr "" ++ ++msgid "Managed flag" ++msgstr "" ++ ++msgid "Max. interval" ++msgstr "" ++ ++msgid "Maximum advertisement interval" ++msgstr "" ++ ++msgid "Minimum advertisement delay" ++msgstr "" ++ ++msgid "Minimum advertisement interval" ++msgstr "" ++ ++msgid "Mobile IPv6" ++msgstr "" ++ ++msgid "Mobile IPv6 interval option" ++msgstr "" ++ ++msgid "Mobile IPv6 router registration" ++msgstr "" ++ ++msgid "Multicast" ++msgstr "" ++ ++msgid "On-link" ++msgstr "" ++ ++msgid "On-link determination" ++msgstr "" ++ ++msgid "Preference" ++msgstr "" ++ ++msgid "Preferred lifetime" ++msgstr "" ++ ++msgid "Prefix" ++msgstr "" ++ ++msgid "Prefix Configuration" ++msgstr "" ++ ++msgid "Prefixes" ++msgstr "" ++ ++msgid "RDNSS" ++msgstr "" ++ ++msgid "RDNSS Configuration" ++msgstr "" ++ ++msgid "Radvd" ++msgstr "" ++ ++msgid "Radvd - DNSSL" ++msgstr "" ++ ++msgid "Radvd - Interface %q" ++msgstr "" ++ ++msgid "Radvd - Prefix" ++msgstr "" ++ ++msgid "Radvd - RDNSS" ++msgstr "" ++ ++msgid "Radvd - Route" ++msgstr "" ++ ++msgid "" ++"Radvd is a router advertisement daemon for IPv6. It listens to router " ++"solicitations and sends router advertisements as described in RFC 4861." ++msgstr "" ++ ++msgid "Reachable time" ++msgstr "" ++ ++msgid "" ++"Restrict communication to specified clients, leave empty to use multicast" ++msgstr "" ++ ++msgid "Retransmit timer" ++msgstr "" ++ ++msgid "Route Configuration" ++msgstr "" ++ ++msgid "Routes" ++msgstr "" ++ ++msgid "Source link-layer address" ++msgstr "" ++ ++msgid "" ++"Specifies a logical interface name to derive a 6to4 prefix from. The " ++"interfaces public IPv4 address is combined with 2002::/3 and the value of " ++"the prefix option" ++msgstr "" ++ ++msgid "Specifies the lifetime associated with the route in seconds." ++msgstr "" ++ ++msgid "Specifies the logical interface name this section belongs to" ++msgstr "" ++ ++msgid "" ++"Specifies the maximum duration how long the DNSSL entries are used for name " ++"resolution." ++msgstr "" ++ ++msgid "" ++"Specifies the maximum duration how long the RDNSS entries are used for name " ++"resolution." ++msgstr "" ++ ++msgid "Specifies the preference associated with the default router" ++msgstr "" ++ ++msgid "Suffix" ++msgstr "" ++ ++msgid "" ++"The maximum time allowed between sending unsolicited multicast router " ++"advertisements from the interface, in seconds" ++msgstr "" ++ ++msgid "" ++"The minimum time allowed between sending multicast router advertisements " ++"from the interface, in seconds" ++msgstr "" ++ ++msgid "" ++"The minimum time allowed between sending unsolicited multicast router " ++"advertisements from the interface, in seconds" ++msgstr "" ++ ++msgid "The preference for the Home Agent sending this RA" ++msgstr "" ++ ++msgid "Timing" ++msgstr "" ++ ++msgid "Unicast only" ++msgstr "" ++ ++msgid "Valid lifetime" ++msgstr "" ++ ++msgid "Validity time" ++msgstr "" ++ ++msgid "default" ++msgstr "" ++ ++msgid "high" ++msgstr "" ++ ++msgid "low" ++msgstr "" ++ ++msgid "medium" ++msgstr "" ++ ++msgid "no" ++msgstr "" ++ ++msgid "yes" ++msgstr "" +diff --git a/feeds/luci/applications/luci-app-radvd/po/sv/radvd.po b/feeds/luci/applications/luci-app-radvd/po/sv/radvd.po +new file mode 100644 +index 0000000..46a3bf9 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-radvd/po/sv/radvd.po +@@ -0,0 +1,368 @@ ++msgid "" ++msgstr "" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Last-Translator: Automatically generated\n" ++"Language-Team: none\n" ++"Language: sv\n" ++"MIME-Version: 1.0\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n != 1);\n" ++ ++msgid "6to4 interface" ++msgstr "" ++ ++msgid "Address" ++msgstr "" ++ ++msgid "Addresses" ++msgstr "" ++ ++msgid "Advanced" ++msgstr "" ++ ++msgid "Advertise Home Agent flag" ++msgstr "" ++ ++msgid "Advertise router address" ++msgstr "" ++ ++msgid "Advertised Domain Suffixes" ++msgstr "" ++ ++msgid "" ++"Advertised IPv6 RDNSS. If empty, the current IPv6 address of the interface " ++"is used" ++msgstr "" ++ ++msgid "Advertised IPv6 prefixes" ++msgstr "" ++ ++msgid "" ++"Advertised IPv6 prefixes. If empty, the current interface prefix is used" ++msgstr "" ++ ++msgid "Advertises Mobile IPv6 Home Agent capability (RFC3775)" ++msgstr "" ++ ++msgid "Advertises Mobile Router registration capability (NEMO Basic)" ++msgstr "" ++ ++msgid "" ++"Advertises assumed reachability time in milliseconds of neighbours in the RA " ++"if specified. 0 disables reachability advertisements" ++msgstr "" ++ ++msgid "" ++"Advertises the default Hop Count value for outgoing unicast packets in the " ++"RA. 0 disables hopcount advertisements" ++msgstr "" ++ ++msgid "Advertises the default router preference" ++msgstr "" ++ ++msgid "" ++"Advertises the given link MTU in the RA if specified. 0 disables MTU " ++"advertisements" ++msgstr "" ++ ++msgid "" ++"Advertises the length of time in seconds that addresses generated from the " ++"prefix via stateless address autoconfiguration remain preferred." ++msgstr "" ++ ++msgid "" ++"Advertises the length of time in seconds that the prefix is valid for the " ++"purpose of on-link determination." ++msgstr "" ++ ++msgid "" ++"Advertises the lifetime of the default router in seconds. 0 indicates that " ++"the node is no default router" ++msgstr "" ++ ++msgid "" ++"Advertises the time in seconds the router is offering Mobile IPv6 Home Agent " ++"services" ++msgstr "" ++ ++msgid "" ++"Advertises wait time in milliseconds between Neighbor Solicitation messages " ++"in the RA if specified. 0 disables retransmit advertisements" ++msgstr "" ++ ++msgid "Advertising" ++msgstr "" ++ ++msgid "Autonomous" ++msgstr "" ++ ++msgid "Clients" ++msgstr "" ++ ++msgid "Configuration flag" ++msgstr "" ++ ++msgid "Current hop limit" ++msgstr "" ++ ++msgid "DNSSL" ++msgstr "" ++ ++msgid "DNSSL Configuration" ++msgstr "" ++ ++msgid "Default lifetime" ++msgstr "" ++ ++msgid "Default preference" ++msgstr "" ++ ++msgid "Enable" ++msgstr "" ++ ++msgid "Enable advertisements" ++msgstr "" ++ ++msgid "Enables router advertisements and solicitations" ++msgstr "" ++ ++msgid "" ++"Enables the additional stateful administered autoconfiguration protocol " ++"(RFC2462)" ++msgstr "" ++ ++msgid "" ++"Enables the autoconfiguration of additional, non address information " ++"(RFC2462)" ++msgstr "" ++ ++msgid "General" ++msgstr "" ++ ++msgid "Home Agent information" ++msgstr "" ++ ++msgid "Home Agent lifetime" ++msgstr "" ++ ++msgid "Home Agent preference" ++msgstr "" ++ ++msgid "Include Home Agent Information in the RA" ++msgstr "" ++ ++msgid "Include Mobile IPv6 Advertisement Interval option to RA" ++msgstr "" ++ ++msgid "Includes the link-layer address of the outgoing interface in the RA" ++msgstr "" ++ ++msgid "" ++"Indicates that the address of interface is sent instead of network prefix, " ++"as is required by Mobile IPv6" ++msgstr "" ++ ++msgid "" ++"Indicates that the underlying link is not broadcast capable, prevents " ++"unsolicited advertisements from being sent" ++msgstr "" ++ ++msgid "" ++"Indicates that this prefix can be used for autonomous address configuration " ++"(RFC4862)" ++msgstr "" ++ ++msgid "" ++"Indicates that this prefix can be used for on-link determination (RFC4861)" ++msgstr "" ++ ++msgid "Interface" ++msgstr "" ++ ++msgid "Interface Configuration" ++msgstr "" ++ ++msgid "Interface required" ++msgstr "" ++ ++msgid "Interfaces" ++msgstr "" ++ ++msgid "Lifetime" ++msgstr "" ++ ++msgid "Link MTU" ++msgstr "" ++ ++msgid "Managed flag" ++msgstr "" ++ ++msgid "Max. interval" ++msgstr "" ++ ++msgid "Maximum advertisement interval" ++msgstr "" ++ ++msgid "Minimum advertisement delay" ++msgstr "" ++ ++msgid "Minimum advertisement interval" ++msgstr "" ++ ++msgid "Mobile IPv6" ++msgstr "" ++ ++msgid "Mobile IPv6 interval option" ++msgstr "" ++ ++msgid "Mobile IPv6 router registration" ++msgstr "" ++ ++msgid "Multicast" ++msgstr "" ++ ++msgid "On-link" ++msgstr "" ++ ++msgid "On-link determination" ++msgstr "" ++ ++msgid "Preference" ++msgstr "" ++ ++msgid "Preferred lifetime" ++msgstr "" ++ ++msgid "Prefix" ++msgstr "" ++ ++msgid "Prefix Configuration" ++msgstr "" ++ ++msgid "Prefixes" ++msgstr "" ++ ++msgid "RDNSS" ++msgstr "" ++ ++msgid "RDNSS Configuration" ++msgstr "" ++ ++msgid "Radvd" ++msgstr "" ++ ++msgid "Radvd - DNSSL" ++msgstr "" ++ ++msgid "Radvd - Interface %q" ++msgstr "" ++ ++msgid "Radvd - Prefix" ++msgstr "" ++ ++msgid "Radvd - RDNSS" ++msgstr "" ++ ++msgid "Radvd - Route" ++msgstr "" ++ ++msgid "" ++"Radvd is a router advertisement daemon for IPv6. It listens to router " ++"solicitations and sends router advertisements as described in RFC 4861." ++msgstr "" ++ ++msgid "Reachable time" ++msgstr "" ++ ++msgid "" ++"Restrict communication to specified clients, leave empty to use multicast" ++msgstr "" ++ ++msgid "Retransmit timer" ++msgstr "" ++ ++msgid "Route Configuration" ++msgstr "" ++ ++msgid "Routes" ++msgstr "" ++ ++msgid "Source link-layer address" ++msgstr "" ++ ++msgid "" ++"Specifies a logical interface name to derive a 6to4 prefix from. The " ++"interfaces public IPv4 address is combined with 2002::/3 and the value of " ++"the prefix option" ++msgstr "" ++ ++msgid "Specifies the lifetime associated with the route in seconds." ++msgstr "" ++ ++msgid "Specifies the logical interface name this section belongs to" ++msgstr "" ++ ++msgid "" ++"Specifies the maximum duration how long the DNSSL entries are used for name " ++"resolution." ++msgstr "" ++ ++msgid "" ++"Specifies the maximum duration how long the RDNSS entries are used for name " ++"resolution." ++msgstr "" ++ ++msgid "Specifies the preference associated with the default router" ++msgstr "" ++ ++msgid "Suffix" ++msgstr "" ++ ++msgid "" ++"The maximum time allowed between sending unsolicited multicast router " ++"advertisements from the interface, in seconds" ++msgstr "" ++ ++msgid "" ++"The minimum time allowed between sending multicast router advertisements " ++"from the interface, in seconds" ++msgstr "" ++ ++msgid "" ++"The minimum time allowed between sending unsolicited multicast router " ++"advertisements from the interface, in seconds" ++msgstr "" ++ ++msgid "The preference for the Home Agent sending this RA" ++msgstr "" ++ ++msgid "Timing" ++msgstr "" ++ ++msgid "Unicast only" ++msgstr "" ++ ++msgid "Valid lifetime" ++msgstr "" ++ ++msgid "Validity time" ++msgstr "" ++ ++msgid "default" ++msgstr "" ++ ++msgid "high" ++msgstr "" ++ ++msgid "low" ++msgstr "" ++ ++msgid "medium" ++msgstr "" ++ ++msgid "no" ++msgstr "" ++ ++msgid "yes" ++msgstr "" +diff --git a/feeds/luci/applications/luci-app-radvd/po/templates/radvd.pot b/feeds/luci/applications/luci-app-radvd/po/templates/radvd.pot +new file mode 100644 +index 0000000..ff9eb54 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-radvd/po/templates/radvd.pot +@@ -0,0 +1,360 @@ ++msgid "" ++msgstr "Content-Type: text/plain; charset=UTF-8" ++ ++msgid "6to4 interface" ++msgstr "" ++ ++msgid "Address" ++msgstr "" ++ ++msgid "Addresses" ++msgstr "" ++ ++msgid "Advanced" ++msgstr "" ++ ++msgid "Advertise Home Agent flag" ++msgstr "" ++ ++msgid "Advertise router address" ++msgstr "" ++ ++msgid "Advertised Domain Suffixes" ++msgstr "" ++ ++msgid "" ++"Advertised IPv6 RDNSS. If empty, the current IPv6 address of the interface " ++"is used" ++msgstr "" ++ ++msgid "Advertised IPv6 prefixes" ++msgstr "" ++ ++msgid "" ++"Advertised IPv6 prefixes. If empty, the current interface prefix is used" ++msgstr "" ++ ++msgid "Advertises Mobile IPv6 Home Agent capability (RFC3775)" ++msgstr "" ++ ++msgid "Advertises Mobile Router registration capability (NEMO Basic)" ++msgstr "" ++ ++msgid "" ++"Advertises assumed reachability time in milliseconds of neighbours in the RA " ++"if specified. 0 disables reachability advertisements" ++msgstr "" ++ ++msgid "" ++"Advertises the default Hop Count value for outgoing unicast packets in the " ++"RA. 0 disables hopcount advertisements" ++msgstr "" ++ ++msgid "Advertises the default router preference" ++msgstr "" ++ ++msgid "" ++"Advertises the given link MTU in the RA if specified. 0 disables MTU " ++"advertisements" ++msgstr "" ++ ++msgid "" ++"Advertises the length of time in seconds that addresses generated from the " ++"prefix via stateless address autoconfiguration remain preferred." ++msgstr "" ++ ++msgid "" ++"Advertises the length of time in seconds that the prefix is valid for the " ++"purpose of on-link determination." ++msgstr "" ++ ++msgid "" ++"Advertises the lifetime of the default router in seconds. 0 indicates that " ++"the node is no default router" ++msgstr "" ++ ++msgid "" ++"Advertises the time in seconds the router is offering Mobile IPv6 Home Agent " ++"services" ++msgstr "" ++ ++msgid "" ++"Advertises wait time in milliseconds between Neighbor Solicitation messages " ++"in the RA if specified. 0 disables retransmit advertisements" ++msgstr "" ++ ++msgid "Advertising" ++msgstr "" ++ ++msgid "Autonomous" ++msgstr "" ++ ++msgid "Clients" ++msgstr "" ++ ++msgid "Configuration flag" ++msgstr "" ++ ++msgid "Current hop limit" ++msgstr "" ++ ++msgid "DNSSL" ++msgstr "" ++ ++msgid "DNSSL Configuration" ++msgstr "" ++ ++msgid "Default lifetime" ++msgstr "" ++ ++msgid "Default preference" ++msgstr "" ++ ++msgid "Enable" ++msgstr "" ++ ++msgid "Enable advertisements" ++msgstr "" ++ ++msgid "Enables router advertisements and solicitations" ++msgstr "" ++ ++msgid "" ++"Enables the additional stateful administered autoconfiguration protocol " ++"(RFC2462)" ++msgstr "" ++ ++msgid "" ++"Enables the autoconfiguration of additional, non address information " ++"(RFC2462)" ++msgstr "" ++ ++msgid "General" ++msgstr "" ++ ++msgid "Home Agent information" ++msgstr "" ++ ++msgid "Home Agent lifetime" ++msgstr "" ++ ++msgid "Home Agent preference" ++msgstr "" ++ ++msgid "Include Home Agent Information in the RA" ++msgstr "" ++ ++msgid "Include Mobile IPv6 Advertisement Interval option to RA" ++msgstr "" ++ ++msgid "Includes the link-layer address of the outgoing interface in the RA" ++msgstr "" ++ ++msgid "" ++"Indicates that the address of interface is sent instead of network prefix, " ++"as is required by Mobile IPv6" ++msgstr "" ++ ++msgid "" ++"Indicates that the underlying link is not broadcast capable, prevents " ++"unsolicited advertisements from being sent" ++msgstr "" ++ ++msgid "" ++"Indicates that this prefix can be used for autonomous address configuration " ++"(RFC4862)" ++msgstr "" ++ ++msgid "" ++"Indicates that this prefix can be used for on-link determination (RFC4861)" ++msgstr "" ++ ++msgid "Interface" ++msgstr "" ++ ++msgid "Interface Configuration" ++msgstr "" ++ ++msgid "Interface required" ++msgstr "" ++ ++msgid "Interfaces" ++msgstr "" ++ ++msgid "Lifetime" ++msgstr "" ++ ++msgid "Link MTU" ++msgstr "" ++ ++msgid "Managed flag" ++msgstr "" ++ ++msgid "Max. interval" ++msgstr "" ++ ++msgid "Maximum advertisement interval" ++msgstr "" ++ ++msgid "Minimum advertisement delay" ++msgstr "" ++ ++msgid "Minimum advertisement interval" ++msgstr "" ++ ++msgid "Mobile IPv6" ++msgstr "" ++ ++msgid "Mobile IPv6 interval option" ++msgstr "" ++ ++msgid "Mobile IPv6 router registration" ++msgstr "" ++ ++msgid "Multicast" ++msgstr "" ++ ++msgid "On-link" ++msgstr "" ++ ++msgid "On-link determination" ++msgstr "" ++ ++msgid "Preference" ++msgstr "" ++ ++msgid "Preferred lifetime" ++msgstr "" ++ ++msgid "Prefix" ++msgstr "" ++ ++msgid "Prefix Configuration" ++msgstr "" ++ ++msgid "Prefixes" ++msgstr "" ++ ++msgid "RDNSS" ++msgstr "" ++ ++msgid "RDNSS Configuration" ++msgstr "" ++ ++msgid "Radvd" ++msgstr "" ++ ++msgid "Radvd - DNSSL" ++msgstr "" ++ ++msgid "Radvd - Interface %q" ++msgstr "" ++ ++msgid "Radvd - Prefix" ++msgstr "" ++ ++msgid "Radvd - RDNSS" ++msgstr "" ++ ++msgid "Radvd - Route" ++msgstr "" ++ ++msgid "" ++"Radvd is a router advertisement daemon for IPv6. It listens to router " ++"solicitations and sends router advertisements as described in RFC 4861." ++msgstr "" ++ ++msgid "Reachable time" ++msgstr "" ++ ++msgid "" ++"Restrict communication to specified clients, leave empty to use multicast" ++msgstr "" ++ ++msgid "Retransmit timer" ++msgstr "" ++ ++msgid "Route Configuration" ++msgstr "" ++ ++msgid "Routes" ++msgstr "" ++ ++msgid "Source link-layer address" ++msgstr "" ++ ++msgid "" ++"Specifies a logical interface name to derive a 6to4 prefix from. The " ++"interfaces public IPv4 address is combined with 2002::/3 and the value of " ++"the prefix option" ++msgstr "" ++ ++msgid "Specifies the lifetime associated with the route in seconds." ++msgstr "" ++ ++msgid "Specifies the logical interface name this section belongs to" ++msgstr "" ++ ++msgid "" ++"Specifies the maximum duration how long the DNSSL entries are used for name " ++"resolution." ++msgstr "" ++ ++msgid "" ++"Specifies the maximum duration how long the RDNSS entries are used for name " ++"resolution." ++msgstr "" ++ ++msgid "Specifies the preference associated with the default router" ++msgstr "" ++ ++msgid "Suffix" ++msgstr "" ++ ++msgid "" ++"The maximum time allowed between sending unsolicited multicast router " ++"advertisements from the interface, in seconds" ++msgstr "" ++ ++msgid "" ++"The minimum time allowed between sending multicast router advertisements " ++"from the interface, in seconds" ++msgstr "" ++ ++msgid "" ++"The minimum time allowed between sending unsolicited multicast router " ++"advertisements from the interface, in seconds" ++msgstr "" ++ ++msgid "The preference for the Home Agent sending this RA" ++msgstr "" ++ ++msgid "Timing" ++msgstr "" ++ ++msgid "Unicast only" ++msgstr "" ++ ++msgid "Valid lifetime" ++msgstr "" ++ ++msgid "Validity time" ++msgstr "" ++ ++msgid "default" ++msgstr "" ++ ++msgid "high" ++msgstr "" ++ ++msgid "low" ++msgstr "" ++ ++msgid "medium" ++msgstr "" ++ ++msgid "no" ++msgstr "" ++ ++msgid "yes" ++msgstr "" +diff --git a/feeds/luci/applications/luci-app-radvd/po/tr/radvd.po b/feeds/luci/applications/luci-app-radvd/po/tr/radvd.po +new file mode 100644 +index 0000000..8b8ed8f +--- /dev/null ++++ b/feeds/luci/applications/luci-app-radvd/po/tr/radvd.po +@@ -0,0 +1,367 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Last-Translator: Automatically generated\n" ++"Language-Team: none\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=1; plural=0;\n" ++ ++msgid "6to4 interface" ++msgstr "" ++ ++msgid "Address" ++msgstr "" ++ ++msgid "Addresses" ++msgstr "" ++ ++msgid "Advanced" ++msgstr "" ++ ++msgid "Advertise Home Agent flag" ++msgstr "" ++ ++msgid "Advertise router address" ++msgstr "" ++ ++msgid "Advertised Domain Suffixes" ++msgstr "" ++ ++msgid "" ++"Advertised IPv6 RDNSS. If empty, the current IPv6 address of the interface " ++"is used" ++msgstr "" ++ ++msgid "Advertised IPv6 prefixes" ++msgstr "" ++ ++msgid "" ++"Advertised IPv6 prefixes. If empty, the current interface prefix is used" ++msgstr "" ++ ++msgid "Advertises Mobile IPv6 Home Agent capability (RFC3775)" ++msgstr "" ++ ++msgid "Advertises Mobile Router registration capability (NEMO Basic)" ++msgstr "" ++ ++msgid "" ++"Advertises assumed reachability time in milliseconds of neighbours in the RA " ++"if specified. 0 disables reachability advertisements" ++msgstr "" ++ ++msgid "" ++"Advertises the default Hop Count value for outgoing unicast packets in the " ++"RA. 0 disables hopcount advertisements" ++msgstr "" ++ ++msgid "Advertises the default router preference" ++msgstr "" ++ ++msgid "" ++"Advertises the given link MTU in the RA if specified. 0 disables MTU " ++"advertisements" ++msgstr "" ++ ++msgid "" ++"Advertises the length of time in seconds that addresses generated from the " ++"prefix via stateless address autoconfiguration remain preferred." ++msgstr "" ++ ++msgid "" ++"Advertises the length of time in seconds that the prefix is valid for the " ++"purpose of on-link determination." ++msgstr "" ++ ++msgid "" ++"Advertises the lifetime of the default router in seconds. 0 indicates that " ++"the node is no default router" ++msgstr "" ++ ++msgid "" ++"Advertises the time in seconds the router is offering Mobile IPv6 Home Agent " ++"services" ++msgstr "" ++ ++msgid "" ++"Advertises wait time in milliseconds between Neighbor Solicitation messages " ++"in the RA if specified. 0 disables retransmit advertisements" ++msgstr "" ++ ++msgid "Advertising" ++msgstr "" ++ ++msgid "Autonomous" ++msgstr "" ++ ++msgid "Clients" ++msgstr "" ++ ++msgid "Configuration flag" ++msgstr "" ++ ++msgid "Current hop limit" ++msgstr "" ++ ++msgid "DNSSL" ++msgstr "" ++ ++msgid "DNSSL Configuration" ++msgstr "" ++ ++msgid "Default lifetime" ++msgstr "" ++ ++msgid "Default preference" ++msgstr "" ++ ++msgid "Enable" ++msgstr "" ++ ++msgid "Enable advertisements" ++msgstr "" ++ ++msgid "Enables router advertisements and solicitations" ++msgstr "" ++ ++msgid "" ++"Enables the additional stateful administered autoconfiguration protocol " ++"(RFC2462)" ++msgstr "" ++ ++msgid "" ++"Enables the autoconfiguration of additional, non address information " ++"(RFC2462)" ++msgstr "" ++ ++msgid "General" ++msgstr "" ++ ++msgid "Home Agent information" ++msgstr "" ++ ++msgid "Home Agent lifetime" ++msgstr "" ++ ++msgid "Home Agent preference" ++msgstr "" ++ ++msgid "Include Home Agent Information in the RA" ++msgstr "" ++ ++msgid "Include Mobile IPv6 Advertisement Interval option to RA" ++msgstr "" ++ ++msgid "Includes the link-layer address of the outgoing interface in the RA" ++msgstr "" ++ ++msgid "" ++"Indicates that the address of interface is sent instead of network prefix, " ++"as is required by Mobile IPv6" ++msgstr "" ++ ++msgid "" ++"Indicates that the underlying link is not broadcast capable, prevents " ++"unsolicited advertisements from being sent" ++msgstr "" ++ ++msgid "" ++"Indicates that this prefix can be used for autonomous address configuration " ++"(RFC4862)" ++msgstr "" ++ ++msgid "" ++"Indicates that this prefix can be used for on-link determination (RFC4861)" ++msgstr "" ++ ++msgid "Interface" ++msgstr "" ++ ++msgid "Interface Configuration" ++msgstr "" ++ ++msgid "Interface required" ++msgstr "" ++ ++msgid "Interfaces" ++msgstr "" ++ ++msgid "Lifetime" ++msgstr "" ++ ++msgid "Link MTU" ++msgstr "" ++ ++msgid "Managed flag" ++msgstr "" ++ ++msgid "Max. interval" ++msgstr "" ++ ++msgid "Maximum advertisement interval" ++msgstr "" ++ ++msgid "Minimum advertisement delay" ++msgstr "" ++ ++msgid "Minimum advertisement interval" ++msgstr "" ++ ++msgid "Mobile IPv6" ++msgstr "" ++ ++msgid "Mobile IPv6 interval option" ++msgstr "" ++ ++msgid "Mobile IPv6 router registration" ++msgstr "" ++ ++msgid "Multicast" ++msgstr "" ++ ++msgid "On-link" ++msgstr "" ++ ++msgid "On-link determination" ++msgstr "" ++ ++msgid "Preference" ++msgstr "" ++ ++msgid "Preferred lifetime" ++msgstr "" ++ ++msgid "Prefix" ++msgstr "" ++ ++msgid "Prefix Configuration" ++msgstr "" ++ ++msgid "Prefixes" ++msgstr "" ++ ++msgid "RDNSS" ++msgstr "" ++ ++msgid "RDNSS Configuration" ++msgstr "" ++ ++msgid "Radvd" ++msgstr "" ++ ++msgid "Radvd - DNSSL" ++msgstr "" ++ ++msgid "Radvd - Interface %q" ++msgstr "" ++ ++msgid "Radvd - Prefix" ++msgstr "" ++ ++msgid "Radvd - RDNSS" ++msgstr "" ++ ++msgid "Radvd - Route" ++msgstr "" ++ ++msgid "" ++"Radvd is a router advertisement daemon for IPv6. It listens to router " ++"solicitations and sends router advertisements as described in RFC 4861." ++msgstr "" ++ ++msgid "Reachable time" ++msgstr "" ++ ++msgid "" ++"Restrict communication to specified clients, leave empty to use multicast" ++msgstr "" ++ ++msgid "Retransmit timer" ++msgstr "" ++ ++msgid "Route Configuration" ++msgstr "" ++ ++msgid "Routes" ++msgstr "" ++ ++msgid "Source link-layer address" ++msgstr "" ++ ++msgid "" ++"Specifies a logical interface name to derive a 6to4 prefix from. The " ++"interfaces public IPv4 address is combined with 2002::/3 and the value of " ++"the prefix option" ++msgstr "" ++ ++msgid "Specifies the lifetime associated with the route in seconds." ++msgstr "" ++ ++msgid "Specifies the logical interface name this section belongs to" ++msgstr "" ++ ++msgid "" ++"Specifies the maximum duration how long the DNSSL entries are used for name " ++"resolution." ++msgstr "" ++ ++msgid "" ++"Specifies the maximum duration how long the RDNSS entries are used for name " ++"resolution." ++msgstr "" ++ ++msgid "Specifies the preference associated with the default router" ++msgstr "" ++ ++msgid "Suffix" ++msgstr "" ++ ++msgid "" ++"The maximum time allowed between sending unsolicited multicast router " ++"advertisements from the interface, in seconds" ++msgstr "" ++ ++msgid "" ++"The minimum time allowed between sending multicast router advertisements " ++"from the interface, in seconds" ++msgstr "" ++ ++msgid "" ++"The minimum time allowed between sending unsolicited multicast router " ++"advertisements from the interface, in seconds" ++msgstr "" ++ ++msgid "The preference for the Home Agent sending this RA" ++msgstr "" ++ ++msgid "Timing" ++msgstr "" ++ ++msgid "Unicast only" ++msgstr "" ++ ++msgid "Valid lifetime" ++msgstr "" ++ ++msgid "Validity time" ++msgstr "" ++ ++msgid "default" ++msgstr "" ++ ++msgid "high" ++msgstr "" ++ ++msgid "low" ++msgstr "" ++ ++msgid "medium" ++msgstr "" ++ ++msgid "no" ++msgstr "" ++ ++msgid "yes" ++msgstr "" +diff --git a/feeds/luci/applications/luci-app-radvd/po/uk/radvd.po b/feeds/luci/applications/luci-app-radvd/po/uk/radvd.po +new file mode 100644 +index 0000000..648035d +--- /dev/null ++++ b/feeds/luci/applications/luci-app-radvd/po/uk/radvd.po +@@ -0,0 +1,381 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"PO-Revision-Date: 2013-05-26 19:17+0200\n" ++"Last-Translator: Yurii \n" ++"Language-Team: none\n" ++"Language: uk\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%" ++"10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "6to4 interface" ++msgstr "Ð†Ð½Ñ‚ÐµÑ€Ñ„ÐµÐ¹Ñ 6to4" ++ ++msgid "Address" ++msgstr "ÐдреÑа" ++ ++msgid "Addresses" ++msgstr "ÐдреÑи" ++ ++msgid "Advanced" ++msgstr "Додатково" ++ ++msgid "Advertise Home Agent flag" ++msgstr "Оголошувати позначку Home Agent" ++ ++msgid "Advertise router address" ++msgstr "Оголошувати адреÑу роутера" ++ ++msgid "Advertised Domain Suffixes" ++msgstr "Оголошувані ÑуфікÑи домену" ++ ++msgid "" ++"Advertised IPv6 RDNSS. If empty, the current IPv6 address of the interface " ++"is used" ++msgstr "" ++"Оголошуваний IPv6 RDNSS. Якщо не задано, викориÑтовуєтьÑÑ Ð¿Ð¾Ñ‚Ð¾Ñ‡Ð½Ð° " ++"IPv6-адреÑа інтерфейÑу." ++ ++msgid "Advertised IPv6 prefixes" ++msgstr "Оголошувані IPv6-префікÑи" ++ ++msgid "" ++"Advertised IPv6 prefixes. If empty, the current interface prefix is used" ++msgstr "" ++"Оголошувані IPv6-префікÑи. Якщо не задано, викориÑтовуєтьÑÑ Ð¿Ð¾Ñ‚Ð¾Ñ‡Ð½Ð¸Ð¹ Ð¿Ñ€ÐµÑ„Ñ–ÐºÑ " ++"інтерфейÑу" ++ ++msgid "Advertises Mobile IPv6 Home Agent capability (RFC3775)" ++msgstr "Оголошує можливоÑÑ‚Ñ– Home Agent мобільного IPv6 (RFC3775)" ++ ++msgid "Advertises Mobile Router registration capability (NEMO Basic)" ++msgstr "Оголошує можливоÑÑ‚Ñ– реєÑтрації мобільного маршрутизатора (NEMO Basic)" ++ ++msgid "" ++"Advertises assumed reachability time in milliseconds of neighbours in the RA " ++"if specified. 0 disables reachability advertisements" ++msgstr "" ++"Оголошує передбачуваний Ñ‡Ð°Ñ Ð´Ð¾ÑÑжноÑÑ‚Ñ– (у міліÑекундах) ÑуÑідніх вузлів. " ++"Ð—Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ 0 відключає оголошеннÑ." ++ ++msgid "" ++"Advertises the default Hop Count value for outgoing unicast packets in the " ++"RA. 0 disables hopcount advertisements" ++msgstr "" ++"Оголошує типове Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð»Ñ–Ñ‡Ð¸Ð»ÑŒÐ½Ð¸ÐºÐ° HOP-ів Ð´Ð»Ñ Ð²Ð¸Ñ…Ñ–Ð´Ð½Ð¸Ñ… unicast-пакетів. " ++"Ð—Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ 0 відключає оголошеннÑ." ++ ++msgid "Advertises the default router preference" ++msgstr "Оголошує типові наÑтройки маршрутизатора" ++ ++msgid "" ++"Advertises the given link MTU in the RA if specified. 0 disables MTU " ++"advertisements" ++msgstr "" ++"Оголошує певний макÑимальний розмір пакета (Ñкщо він вказаний). Ð—Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ 0 " ++"відключає оголошеннÑ." ++ ++msgid "" ++"Advertises the length of time in seconds that addresses generated from the " ++"prefix via stateless address autoconfiguration remain preferred." ++msgstr "" ++ ++msgid "" ++"Advertises the length of time in seconds that the prefix is valid for the " ++"purpose of on-link determination." ++msgstr "" ++ ++msgid "" ++"Advertises the lifetime of the default router in seconds. 0 indicates that " ++"the node is no default router" ++msgstr "" ++ ++msgid "" ++"Advertises the time in seconds the router is offering Mobile IPv6 Home Agent " ++"services" ++msgstr "" ++ ++msgid "" ++"Advertises wait time in milliseconds between Neighbor Solicitation messages " ++"in the RA if specified. 0 disables retransmit advertisements" ++msgstr "" ++ ++msgid "Advertising" ++msgstr "ОголошеннÑ" ++ ++msgid "Autonomous" ++msgstr "Ðвтономний" ++ ++msgid "Clients" ++msgstr "Клієнти" ++ ++msgid "Configuration flag" ++msgstr "" ++ ++msgid "Current hop limit" ++msgstr "" ++ ++msgid "DNSSL" ++msgstr "" ++ ++msgid "DNSSL Configuration" ++msgstr "" ++ ++msgid "Default lifetime" ++msgstr "" ++ ++msgid "Default preference" ++msgstr "" ++ ++msgid "Enable" ++msgstr "" ++ ++msgid "Enable advertisements" ++msgstr "" ++ ++msgid "Enables router advertisements and solicitations" ++msgstr "" ++ ++msgid "" ++"Enables the additional stateful administered autoconfiguration protocol " ++"(RFC2462)" ++msgstr "" ++ ++msgid "" ++"Enables the autoconfiguration of additional, non address information " ++"(RFC2462)" ++msgstr "" ++ ++msgid "General" ++msgstr "" ++ ++msgid "Home Agent information" ++msgstr "" ++ ++msgid "Home Agent lifetime" ++msgstr "" ++ ++msgid "Home Agent preference" ++msgstr "" ++ ++msgid "Include Home Agent Information in the RA" ++msgstr "" ++ ++msgid "Include Mobile IPv6 Advertisement Interval option to RA" ++msgstr "" ++ ++msgid "Includes the link-layer address of the outgoing interface in the RA" ++msgstr "" ++ ++msgid "" ++"Indicates that the address of interface is sent instead of network prefix, " ++"as is required by Mobile IPv6" ++msgstr "" ++ ++msgid "" ++"Indicates that the underlying link is not broadcast capable, prevents " ++"unsolicited advertisements from being sent" ++msgstr "" ++ ++msgid "" ++"Indicates that this prefix can be used for autonomous address configuration " ++"(RFC4862)" ++msgstr "" ++ ++msgid "" ++"Indicates that this prefix can be used for on-link determination (RFC4861)" ++msgstr "" ++ ++msgid "Interface" ++msgstr "" ++ ++msgid "Interface Configuration" ++msgstr "" ++ ++msgid "Interface required" ++msgstr "" ++ ++msgid "Interfaces" ++msgstr "" ++ ++msgid "Lifetime" ++msgstr "" ++ ++msgid "Link MTU" ++msgstr "" ++ ++msgid "Managed flag" ++msgstr "" ++ ++msgid "Max. interval" ++msgstr "" ++ ++msgid "Maximum advertisement interval" ++msgstr "" ++ ++msgid "Minimum advertisement delay" ++msgstr "" ++ ++msgid "Minimum advertisement interval" ++msgstr "" ++ ++msgid "Mobile IPv6" ++msgstr "" ++ ++msgid "Mobile IPv6 interval option" ++msgstr "" ++ ++msgid "Mobile IPv6 router registration" ++msgstr "" ++ ++msgid "Multicast" ++msgstr "" ++ ++msgid "On-link" ++msgstr "" ++ ++msgid "On-link determination" ++msgstr "" ++ ++msgid "Preference" ++msgstr "" ++ ++msgid "Preferred lifetime" ++msgstr "" ++ ++msgid "Prefix" ++msgstr "" ++ ++msgid "Prefix Configuration" ++msgstr "" ++ ++msgid "Prefixes" ++msgstr "" ++ ++msgid "RDNSS" ++msgstr "" ++ ++msgid "RDNSS Configuration" ++msgstr "" ++ ++msgid "Radvd" ++msgstr "" ++ ++msgid "Radvd - DNSSL" ++msgstr "" ++ ++msgid "Radvd - Interface %q" ++msgstr "" ++ ++msgid "Radvd - Prefix" ++msgstr "" ++ ++msgid "Radvd - RDNSS" ++msgstr "" ++ ++msgid "Radvd - Route" ++msgstr "" ++ ++msgid "" ++"Radvd is a router advertisement daemon for IPv6. It listens to router " ++"solicitations and sends router advertisements as described in RFC 4861." ++msgstr "" ++ ++msgid "Reachable time" ++msgstr "" ++ ++msgid "" ++"Restrict communication to specified clients, leave empty to use multicast" ++msgstr "" ++ ++msgid "Retransmit timer" ++msgstr "" ++ ++msgid "Route Configuration" ++msgstr "" ++ ++msgid "Routes" ++msgstr "" ++ ++msgid "Source link-layer address" ++msgstr "" ++ ++msgid "" ++"Specifies a logical interface name to derive a 6to4 prefix from. The " ++"interfaces public IPv4 address is combined with 2002::/3 and the value of " ++"the prefix option" ++msgstr "" ++ ++msgid "Specifies the lifetime associated with the route in seconds." ++msgstr "" ++ ++msgid "Specifies the logical interface name this section belongs to" ++msgstr "" ++ ++msgid "" ++"Specifies the maximum duration how long the DNSSL entries are used for name " ++"resolution." ++msgstr "" ++ ++msgid "" ++"Specifies the maximum duration how long the RDNSS entries are used for name " ++"resolution." ++msgstr "" ++ ++msgid "Specifies the preference associated with the default router" ++msgstr "" ++ ++msgid "Suffix" ++msgstr "" ++ ++msgid "" ++"The maximum time allowed between sending unsolicited multicast router " ++"advertisements from the interface, in seconds" ++msgstr "" ++ ++msgid "" ++"The minimum time allowed between sending multicast router advertisements " ++"from the interface, in seconds" ++msgstr "" ++ ++msgid "" ++"The minimum time allowed between sending unsolicited multicast router " ++"advertisements from the interface, in seconds" ++msgstr "" ++ ++msgid "The preference for the Home Agent sending this RA" ++msgstr "" ++ ++msgid "Timing" ++msgstr "" ++ ++msgid "Unicast only" ++msgstr "" ++ ++msgid "Valid lifetime" ++msgstr "" ++ ++msgid "Validity time" ++msgstr "" ++ ++msgid "default" ++msgstr "" ++ ++msgid "high" ++msgstr "" ++ ++msgid "low" ++msgstr "" ++ ++msgid "medium" ++msgstr "" ++ ++msgid "no" ++msgstr "" ++ ++msgid "yes" ++msgstr "" +diff --git a/feeds/luci/applications/luci-app-radvd/po/vi/radvd.po b/feeds/luci/applications/luci-app-radvd/po/vi/radvd.po +new file mode 100644 +index 0000000..63f8fa0 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-radvd/po/vi/radvd.po +@@ -0,0 +1,368 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"PO-Revision-Date: 2010-11-21 04:06+0100\n" ++"Last-Translator: \n" ++"Language-Team: German\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n != 1);\n" ++ ++msgid "6to4 interface" ++msgstr "" ++ ++msgid "Address" ++msgstr "" ++ ++msgid "Addresses" ++msgstr "" ++ ++msgid "Advanced" ++msgstr "" ++ ++msgid "Advertise Home Agent flag" ++msgstr "" ++ ++msgid "Advertise router address" ++msgstr "" ++ ++msgid "Advertised Domain Suffixes" ++msgstr "" ++ ++msgid "" ++"Advertised IPv6 RDNSS. If empty, the current IPv6 address of the interface " ++"is used" ++msgstr "" ++ ++msgid "Advertised IPv6 prefixes" ++msgstr "" ++ ++msgid "" ++"Advertised IPv6 prefixes. If empty, the current interface prefix is used" ++msgstr "" ++ ++msgid "Advertises Mobile IPv6 Home Agent capability (RFC3775)" ++msgstr "" ++ ++msgid "Advertises Mobile Router registration capability (NEMO Basic)" ++msgstr "" ++ ++msgid "" ++"Advertises assumed reachability time in milliseconds of neighbours in the RA " ++"if specified. 0 disables reachability advertisements" ++msgstr "" ++ ++msgid "" ++"Advertises the default Hop Count value for outgoing unicast packets in the " ++"RA. 0 disables hopcount advertisements" ++msgstr "" ++ ++msgid "Advertises the default router preference" ++msgstr "" ++ ++msgid "" ++"Advertises the given link MTU in the RA if specified. 0 disables MTU " ++"advertisements" ++msgstr "" ++ ++msgid "" ++"Advertises the length of time in seconds that addresses generated from the " ++"prefix via stateless address autoconfiguration remain preferred." ++msgstr "" ++ ++msgid "" ++"Advertises the length of time in seconds that the prefix is valid for the " ++"purpose of on-link determination." ++msgstr "" ++ ++msgid "" ++"Advertises the lifetime of the default router in seconds. 0 indicates that " ++"the node is no default router" ++msgstr "" ++ ++msgid "" ++"Advertises the time in seconds the router is offering Mobile IPv6 Home Agent " ++"services" ++msgstr "" ++ ++msgid "" ++"Advertises wait time in milliseconds between Neighbor Solicitation messages " ++"in the RA if specified. 0 disables retransmit advertisements" ++msgstr "" ++ ++msgid "Advertising" ++msgstr "" ++ ++msgid "Autonomous" ++msgstr "" ++ ++msgid "Clients" ++msgstr "" ++ ++msgid "Configuration flag" ++msgstr "" ++ ++msgid "Current hop limit" ++msgstr "" ++ ++msgid "DNSSL" ++msgstr "" ++ ++msgid "DNSSL Configuration" ++msgstr "" ++ ++msgid "Default lifetime" ++msgstr "" ++ ++msgid "Default preference" ++msgstr "" ++ ++msgid "Enable" ++msgstr "" ++ ++msgid "Enable advertisements" ++msgstr "" ++ ++msgid "Enables router advertisements and solicitations" ++msgstr "" ++ ++msgid "" ++"Enables the additional stateful administered autoconfiguration protocol " ++"(RFC2462)" ++msgstr "" ++ ++msgid "" ++"Enables the autoconfiguration of additional, non address information " ++"(RFC2462)" ++msgstr "" ++ ++msgid "General" ++msgstr "" ++ ++msgid "Home Agent information" ++msgstr "" ++ ++msgid "Home Agent lifetime" ++msgstr "" ++ ++msgid "Home Agent preference" ++msgstr "" ++ ++msgid "Include Home Agent Information in the RA" ++msgstr "" ++ ++msgid "Include Mobile IPv6 Advertisement Interval option to RA" ++msgstr "" ++ ++msgid "Includes the link-layer address of the outgoing interface in the RA" ++msgstr "" ++ ++msgid "" ++"Indicates that the address of interface is sent instead of network prefix, " ++"as is required by Mobile IPv6" ++msgstr "" ++ ++msgid "" ++"Indicates that the underlying link is not broadcast capable, prevents " ++"unsolicited advertisements from being sent" ++msgstr "" ++ ++msgid "" ++"Indicates that this prefix can be used for autonomous address configuration " ++"(RFC4862)" ++msgstr "" ++ ++msgid "" ++"Indicates that this prefix can be used for on-link determination (RFC4861)" ++msgstr "" ++ ++msgid "Interface" ++msgstr "" ++ ++msgid "Interface Configuration" ++msgstr "" ++ ++msgid "Interface required" ++msgstr "" ++ ++msgid "Interfaces" ++msgstr "" ++ ++msgid "Lifetime" ++msgstr "" ++ ++msgid "Link MTU" ++msgstr "" ++ ++msgid "Managed flag" ++msgstr "" ++ ++msgid "Max. interval" ++msgstr "" ++ ++msgid "Maximum advertisement interval" ++msgstr "" ++ ++msgid "Minimum advertisement delay" ++msgstr "" ++ ++msgid "Minimum advertisement interval" ++msgstr "" ++ ++msgid "Mobile IPv6" ++msgstr "" ++ ++msgid "Mobile IPv6 interval option" ++msgstr "" ++ ++msgid "Mobile IPv6 router registration" ++msgstr "" ++ ++msgid "Multicast" ++msgstr "" ++ ++msgid "On-link" ++msgstr "" ++ ++msgid "On-link determination" ++msgstr "" ++ ++msgid "Preference" ++msgstr "" ++ ++msgid "Preferred lifetime" ++msgstr "" ++ ++msgid "Prefix" ++msgstr "" ++ ++msgid "Prefix Configuration" ++msgstr "" ++ ++msgid "Prefixes" ++msgstr "" ++ ++msgid "RDNSS" ++msgstr "" ++ ++msgid "RDNSS Configuration" ++msgstr "" ++ ++msgid "Radvd" ++msgstr "" ++ ++msgid "Radvd - DNSSL" ++msgstr "" ++ ++msgid "Radvd - Interface %q" ++msgstr "" ++ ++msgid "Radvd - Prefix" ++msgstr "" ++ ++msgid "Radvd - RDNSS" ++msgstr "" ++ ++msgid "Radvd - Route" ++msgstr "" ++ ++msgid "" ++"Radvd is a router advertisement daemon for IPv6. It listens to router " ++"solicitations and sends router advertisements as described in RFC 4861." ++msgstr "" ++ ++msgid "Reachable time" ++msgstr "" ++ ++msgid "" ++"Restrict communication to specified clients, leave empty to use multicast" ++msgstr "" ++ ++msgid "Retransmit timer" ++msgstr "" ++ ++msgid "Route Configuration" ++msgstr "" ++ ++msgid "Routes" ++msgstr "" ++ ++msgid "Source link-layer address" ++msgstr "" ++ ++msgid "" ++"Specifies a logical interface name to derive a 6to4 prefix from. The " ++"interfaces public IPv4 address is combined with 2002::/3 and the value of " ++"the prefix option" ++msgstr "" ++ ++msgid "Specifies the lifetime associated with the route in seconds." ++msgstr "" ++ ++msgid "Specifies the logical interface name this section belongs to" ++msgstr "" ++ ++msgid "" ++"Specifies the maximum duration how long the DNSSL entries are used for name " ++"resolution." ++msgstr "" ++ ++msgid "" ++"Specifies the maximum duration how long the RDNSS entries are used for name " ++"resolution." ++msgstr "" ++ ++msgid "Specifies the preference associated with the default router" ++msgstr "" ++ ++msgid "Suffix" ++msgstr "" ++ ++msgid "" ++"The maximum time allowed between sending unsolicited multicast router " ++"advertisements from the interface, in seconds" ++msgstr "" ++ ++msgid "" ++"The minimum time allowed between sending multicast router advertisements " ++"from the interface, in seconds" ++msgstr "" ++ ++msgid "" ++"The minimum time allowed between sending unsolicited multicast router " ++"advertisements from the interface, in seconds" ++msgstr "" ++ ++msgid "The preference for the Home Agent sending this RA" ++msgstr "" ++ ++msgid "Timing" ++msgstr "" ++ ++msgid "Unicast only" ++msgstr "" ++ ++msgid "Valid lifetime" ++msgstr "" ++ ++msgid "Validity time" ++msgstr "" ++ ++msgid "default" ++msgstr "" ++ ++msgid "high" ++msgstr "" ++ ++msgid "low" ++msgstr "" ++ ++msgid "medium" ++msgstr "" ++ ++msgid "no" ++msgstr "" ++ ++msgid "yes" ++msgstr "" +diff --git a/feeds/luci/applications/luci-app-radvd/po/zh-cn/radvd.po b/feeds/luci/applications/luci-app-radvd/po/zh-cn/radvd.po +new file mode 100644 +index 0000000..f3dae7f +--- /dev/null ++++ b/feeds/luci/applications/luci-app-radvd/po/zh-cn/radvd.po +@@ -0,0 +1,391 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"POT-Creation-Date: \n" ++"PO-Revision-Date: 2014-07-13 16:23+0200\n" ++"Last-Translator: qiuchengxuan \n" ++"Language-Team: QQ Group 75543259 \n" ++"Language: zh_CN\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=1; plural=0;\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "6to4 interface" ++msgstr "IPv6到IPv4的接å£" ++ ++msgid "Address" ++msgstr "地å€" ++ ++msgid "Addresses" ++msgstr "地å€" ++ ++msgid "Advanced" ++msgstr "进阶选项" ++ ++msgid "Advertise Home Agent flag" ++msgstr "广播本地中继标识" ++ ++msgid "Advertise router address" ++msgstr "广播路由地å€" ++ ++msgid "Advertised Domain Suffixes" ++msgstr "区域广播åŽç¼€" ++ ++msgid "" ++"Advertised IPv6 RDNSS. If empty, the current IPv6 address of the interface " ++"is used" ++msgstr "IPv6 Recursive DNSæœåŠ¡å™¨(RDNSS)地å€ã€‚若为空,则为当å‰IPv6地å€" ++ ++msgid "Advertised IPv6 prefixes" ++msgstr "IPV6广播å‰ç¼€ç¾¤" ++ ++msgid "" ++"Advertised IPv6 prefixes. If empty, the current interface prefix is used" ++msgstr "IPv6广播å‰ç¼€ç¾¤ã€‚如果为空,将使用当å‰æŽ¥å£çš„å‰ç¼€" ++ ++msgid "Advertises Mobile IPv6 Home Agent capability (RFC3775)" ++msgstr "广播移动IPv6本地代ç†åŠŸèƒ½ï¼ˆRFC3775" ++ ++msgid "Advertises Mobile Router registration capability (NEMO Basic)" ++msgstr "广播移动路由器注册功能(NEMO基本)" ++ ++msgid "" ++"Advertises assumed reachability time in milliseconds of neighbours in the RA " ++"if specified. 0 disables reachability advertisements" ++msgstr "路由器公告报文中宣告估算的邻居å¯è¾¾æ—¶é—´ï¼ˆæ¯«ç§’)。0代表ç¦ç”¨å¯è¾¾æ€§å®£å‘Šã€‚" ++ ++msgid "" ++"Advertises the default Hop Count value for outgoing unicast packets in the " ++"RA. 0 disables hopcount advertisements" ++msgstr "路由器公告报文中广播外å‘å•æ’­æ•°æ®åŒ…的缺çœè·³æ•°å€¼ã€‚ 0ç¦ç”¨å¹¿æ’­è·³æ•°" ++ ++msgid "Advertises the default router preference" ++msgstr "å‘布缺çœè·¯ç”±è®¾ç½®" ++ ++msgid "" ++"Advertises the given link MTU in the RA if specified. 0 disables MTU " ++"advertisements" ++msgstr "路由器公告报文中宣告链路MTU。0代表ç¦ç”¨MTU宣告" ++ ++msgid "" ++"Advertises the length of time in seconds that addresses generated from the " ++"prefix via stateless address autoconfiguration remain preferred." ++msgstr "" ++ ++msgid "" ++"Advertises the length of time in seconds that the prefix is valid for the " ++"purpose of on-link determination." ++msgstr "" ++ ++msgid "" ++"Advertises the lifetime of the default router in seconds. 0 indicates that " ++"the node is no default router" ++msgstr "声明默认路由器的生存时间(å•ä½ä¸ºç§’)。0代表结点没有默认路由" ++ ++msgid "" ++"Advertises the time in seconds the router is offering Mobile IPv6 Home Agent " ++"services" ++msgstr "" ++ ++msgid "" ++"Advertises wait time in milliseconds between Neighbor Solicitation messages " ++"in the RA if specified. 0 disables retransmit advertisements" ++msgstr "" ++ ++msgid "Advertising" ++msgstr "" ++ ++msgid "Autonomous" ++msgstr "自治的" ++ ++msgid "Clients" ++msgstr "客户端" ++ ++msgid "Configuration flag" ++msgstr "设置标识" ++ ++msgid "Current hop limit" ++msgstr "当å‰è·³æ•°é™åˆ¶" ++ ++msgid "DNSSL" ++msgstr "DNSæœç´¢åˆ—表" ++ ++msgid "DNSSL Configuration" ++msgstr "DNSæœç´¢åˆ—表设置" ++ ++msgid "Default lifetime" ++msgstr "默认生存时é™" ++ ++msgid "Default preference" ++msgstr "默认优先级" ++ ++msgid "Enable" ++msgstr "å¯ç”¨" ++ ++msgid "Enable advertisements" ++msgstr "å¯ç”¨å¹¿æ’­" ++ ++msgid "Enables router advertisements and solicitations" ++msgstr "激活路由广播和请求" ++ ++msgid "" ++"Enables the additional stateful administered autoconfiguration protocol " ++"(RFC2462)" ++msgstr "使能附加的基于状æ€ç®¡ç†çš„自动é…ç½®å议(RFC2462)" ++ ++msgid "" ++"Enables the autoconfiguration of additional, non address information " ++"(RFC2462)" ++msgstr "å¯ç”¨è‡ªåŠ¨é…置,ä¸åŒ…括地å€ä¿¡æ¯(RFC2462)" ++ ++msgid "General" ++msgstr "概况" ++ ++msgid "Home Agent information" ++msgstr "本地中继信æ¯" ++ ++msgid "Home Agent lifetime" ++msgstr "本地中继有效期" ++ ++msgid "Home Agent preference" ++msgstr "本地中继优先æƒ" ++ ++msgid "Include Home Agent Information in the RA" ++msgstr "路由器公告报文中包å«æœ¬åœ°ä¸­ç»§ä¿¡æ¯" ++ ++msgid "Include Mobile IPv6 Advertisement Interval option to RA" ++msgstr "路由器公告报文中包å«ç§»åŠ¨IPV6广播间隔设置" ++ ++msgid "Includes the link-layer address of the outgoing interface in the RA" ++msgstr "路由器公告报文中包å«å‡ºæŽ¥å£çš„链路层地å€" ++ ++msgid "" ++"Indicates that the address of interface is sent instead of network prefix, " ++"as is required by Mobile IPv6" ++msgstr "表明使用接å£çš„地å€å‘é€è€Œéžç½‘络å‰ç¼€ï¼Œç§»åŠ¨IPv6需è¦" ++ ++msgid "" ++"Indicates that the underlying link is not broadcast capable, prevents " ++"unsolicited advertisements from being sent" ++msgstr "表明潜在的链路并ä¸å…·æœ‰å¹¿æ’­èƒ½åŠ›ï¼Œé¿å…主动触å‘的宣告报文å‘出" ++ ++msgid "" ++"Indicates that this prefix can be used for autonomous address configuration " ++"(RFC4862)" ++msgstr "表明此å‰ç¼€èƒ½å¤Ÿç”¨äºŽåŒ¿å地å€é…置(RFC4862)" ++ ++msgid "" ++"Indicates that this prefix can be used for on-link determination (RFC4861)" ++msgstr "表明此å‰ç¼€èƒ½å¤Ÿç”¨äºŽon-link决定(RFC481)" ++ ++msgid "Interface" ++msgstr "接å£" ++ ++msgid "Interface Configuration" ++msgstr "接å£è®¾ç½®" ++ ++msgid "Interface required" ++msgstr "接å£å¿…è¦é¡¹" ++ ++msgid "Interfaces" ++msgstr "接å£" ++ ++msgid "Lifetime" ++msgstr "有效期" ++ ++msgid "Link MTU" ++msgstr "连接MTU" ++ ++msgid "Managed flag" ++msgstr "M标识" ++ ++msgid "Max. interval" ++msgstr "最大间隔" ++ ++msgid "Maximum advertisement interval" ++msgstr "最大广播间隔" ++ ++msgid "Minimum advertisement delay" ++msgstr "最å°å¹¿æ’­å»¶æ—¶" ++ ++msgid "Minimum advertisement interval" ++msgstr "最å°å¹¿æ’­é—´éš”" ++ ++msgid "Mobile IPv6" ++msgstr "移动IPV6" ++ ++msgid "Mobile IPv6 interval option" ++msgstr "移动IPV6间隔选项" ++ ++msgid "Mobile IPv6 router registration" ++msgstr "移动IPV6路由注册" ++ ++msgid "Multicast" ++msgstr "组播传输" ++ ++msgid "On-link" ++msgstr "已连接的" ++ ++msgid "On-link determination" ++msgstr "已连接的目标" ++ ++msgid "Preference" ++msgstr "优先æƒ" ++ ++msgid "Preferred lifetime" ++msgstr "期望的生存时间" ++ ++msgid "Prefix" ++msgstr "å‰ç¼€" ++ ++msgid "Prefix Configuration" ++msgstr "å‰ç¼€è®¾ç½®" ++ ++msgid "Prefixes" ++msgstr "å‰ç¼€ç¾¤" ++ ++msgid "RDNSS" ++msgstr "邻居å‘现æœåŠ¡å™¨" ++ ++msgid "RDNSS Configuration" ++msgstr "邻居å‘现æœåŠ¡å™¨è®¾ç½®" ++ ++msgid "Radvd" ++msgstr "" ++ ++msgid "Radvd - DNSSL" ++msgstr "RADVDï¼DNSæœç´¢åˆ—表" ++ ++msgid "Radvd - Interface %q" ++msgstr "" ++ ++msgid "Radvd - Prefix" ++msgstr "RADVDï¼å‰ç¼€" ++ ++msgid "Radvd - RDNSS" ++msgstr "RADVDï¼é‚»å±…å‘现æœåŠ¡å™¨" ++ ++msgid "Radvd - Route" ++msgstr "RADVDï¼è·¯ç”±" ++ ++msgid "" ++"Radvd is a router advertisement daemon for IPv6. It listens to router " ++"solicitations and sends router advertisements as described in RFC 4861." ++msgstr "RADVD是一个IPV6路由公告软件,按照RFC4861监å¬è·¯ç”±è¯·æ±‚å’Œå‘é€è·¯ç”±å…¬å‘Šã€‚" ++ ++msgid "Reachable time" ++msgstr "å¯è¾¾å»¶æ—¶" ++ ++msgid "" ++"Restrict communication to specified clients, leave empty to use multicast" ++msgstr "é™åˆ¶ç‰¹å®šä¼šè¯ï¼Œç•™ç©ºåˆ™ä½¿ç”¨ç»„æ’­" ++ ++msgid "Retransmit timer" ++msgstr "中继转å‘计时器" ++ ++msgid "Route Configuration" ++msgstr "路由设置" ++ ++msgid "Routes" ++msgstr "" ++ ++msgid "Source link-layer address" ++msgstr "æºé“¾è·¯å±‚地å€" ++ ++msgid "" ++"Specifies a logical interface name to derive a 6to4 prefix from. The " ++"interfaces public IPv4 address is combined with 2002::/3 and the value of " ++"the prefix option" ++msgstr "" ++ ++msgid "Specifies the lifetime associated with the route in seconds." ++msgstr "设定路由关è”的生存时间,å•ä½ä¸ºç§’" ++ ++msgid "Specifies the logical interface name this section belongs to" ++msgstr "说明这个物ç†æŽ¥å£è¿žæŽ¥åˆ°å“ªä¸ªç½‘络" ++ ++msgid "" ++"Specifies the maximum duration how long the DNSSL entries are used for name " ++"resolution." ++msgstr "设定DNSSL表项å称解æžçš„最长时间间隔" ++ ++msgid "" ++"Specifies the maximum duration how long the RDNSS entries are used for name " ++"resolution." ++msgstr "设定RDNSS表项å称解æžçš„最长时间间隔" ++ ++msgid "Specifies the preference associated with the default router" ++msgstr "设定关è”的默认路由的é…ç½®" ++ ++msgid "Suffix" ++msgstr "åŽç¼€" ++ ++msgid "" ++"The maximum time allowed between sending unsolicited multicast router " ++"advertisements from the interface, in seconds" ++msgstr "å…许接å£å‘é€ç»„播路由宣告报文的最大时间间隔,å•ä½ä¸ºç§’" ++ ++msgid "" ++"The minimum time allowed between sending multicast router advertisements " ++"from the interface, in seconds" ++msgstr "å…许接å£å‘é€ç»„播路由宣告报文的最å°æ—¶é—´é—´éš”,å•ä½ä¸ºç§’" ++ ++msgid "" ++"The minimum time allowed between sending unsolicited multicast router " ++"advertisements from the interface, in seconds" ++msgstr "å…许接å£å‘é€ä¸»åŠ¨è§¦å‘组播路由宣告报文的最å°æ—¶é—´é—´éš”,å•ä½ä¸ºç§’" ++ ++msgid "The preference for the Home Agent sending this RA" ++msgstr "" ++ ++msgid "Timing" ++msgstr "" ++ ++msgid "Unicast only" ++msgstr "å•æ’­" ++ ++msgid "Valid lifetime" ++msgstr "有效的生存时间" ++ ++msgid "Validity time" ++msgstr "有效期" ++ ++msgid "default" ++msgstr "默认" ++ ++msgid "high" ++msgstr "高" ++ ++msgid "low" ++msgstr "低" ++ ++msgid "medium" ++msgstr "中等" ++ ++msgid "no" ++msgstr "å¦" ++ ++msgid "yes" ++msgstr "是" ++ ++#~ msgid "Advertised IPv6 prefix" ++#~ msgstr "IPV6广播å‰ç¼€" ++ ++#~ msgid "" ++#~ "Advertised IPv6 prefix. If empty, the current interface prefix is used" ++#~ msgstr "IPV6广播å‰ç¼€ã€‚若为空,则当å‰æŽ¥å£å‰ç¼€å·²è¢«ä½¿ç”¨ã€‚" ++ ++#~ msgid "Open" ++#~ msgstr "打开" ++ ++#~ msgid "" ++#~ "Specifies the maximum duration how long the DNSSL entries are used for " ++#~ "name resolution. Use 0 to specify an infinite lifetime" ++#~ msgstr "指定DNSSL解æžåŸŸå的最长时间,0则为无é™é•¿" ++ ++#~ msgid "" ++#~ "Specifies the maximum duration how long the RDNSS entries are used for " ++#~ "name resolution. Use 0 to specify an infinite lifetime" ++#~ msgstr "指定RDNSS解æžåŸŸå的最长时间,0则为无é™é•¿" +diff --git a/feeds/luci/applications/luci-app-radvd/po/zh-tw/radvd.po b/feeds/luci/applications/luci-app-radvd/po/zh-tw/radvd.po +new file mode 100644 +index 0000000..aed76c5 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-radvd/po/zh-tw/radvd.po +@@ -0,0 +1,366 @@ ++msgid "" ++msgstr "" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Last-Translator: Automatically generated\n" ++"Language-Team: none\n" ++"MIME-Version: 1.0\n" ++"Content-Transfer-Encoding: 8bit\n" ++ ++msgid "6to4 interface" ++msgstr "" ++ ++msgid "Address" ++msgstr "" ++ ++msgid "Addresses" ++msgstr "" ++ ++msgid "Advanced" ++msgstr "" ++ ++msgid "Advertise Home Agent flag" ++msgstr "" ++ ++msgid "Advertise router address" ++msgstr "" ++ ++msgid "Advertised Domain Suffixes" ++msgstr "" ++ ++msgid "" ++"Advertised IPv6 RDNSS. If empty, the current IPv6 address of the interface " ++"is used" ++msgstr "" ++ ++msgid "Advertised IPv6 prefixes" ++msgstr "" ++ ++msgid "" ++"Advertised IPv6 prefixes. If empty, the current interface prefix is used" ++msgstr "" ++ ++msgid "Advertises Mobile IPv6 Home Agent capability (RFC3775)" ++msgstr "" ++ ++msgid "Advertises Mobile Router registration capability (NEMO Basic)" ++msgstr "" ++ ++msgid "" ++"Advertises assumed reachability time in milliseconds of neighbours in the RA " ++"if specified. 0 disables reachability advertisements" ++msgstr "" ++ ++msgid "" ++"Advertises the default Hop Count value for outgoing unicast packets in the " ++"RA. 0 disables hopcount advertisements" ++msgstr "" ++ ++msgid "Advertises the default router preference" ++msgstr "" ++ ++msgid "" ++"Advertises the given link MTU in the RA if specified. 0 disables MTU " ++"advertisements" ++msgstr "" ++ ++msgid "" ++"Advertises the length of time in seconds that addresses generated from the " ++"prefix via stateless address autoconfiguration remain preferred." ++msgstr "" ++ ++msgid "" ++"Advertises the length of time in seconds that the prefix is valid for the " ++"purpose of on-link determination." ++msgstr "" ++ ++msgid "" ++"Advertises the lifetime of the default router in seconds. 0 indicates that " ++"the node is no default router" ++msgstr "" ++ ++msgid "" ++"Advertises the time in seconds the router is offering Mobile IPv6 Home Agent " ++"services" ++msgstr "" ++ ++msgid "" ++"Advertises wait time in milliseconds between Neighbor Solicitation messages " ++"in the RA if specified. 0 disables retransmit advertisements" ++msgstr "" ++ ++msgid "Advertising" ++msgstr "" ++ ++msgid "Autonomous" ++msgstr "" ++ ++msgid "Clients" ++msgstr "" ++ ++msgid "Configuration flag" ++msgstr "" ++ ++msgid "Current hop limit" ++msgstr "" ++ ++msgid "DNSSL" ++msgstr "" ++ ++msgid "DNSSL Configuration" ++msgstr "" ++ ++msgid "Default lifetime" ++msgstr "" ++ ++msgid "Default preference" ++msgstr "" ++ ++msgid "Enable" ++msgstr "" ++ ++msgid "Enable advertisements" ++msgstr "" ++ ++msgid "Enables router advertisements and solicitations" ++msgstr "" ++ ++msgid "" ++"Enables the additional stateful administered autoconfiguration protocol " ++"(RFC2462)" ++msgstr "" ++ ++msgid "" ++"Enables the autoconfiguration of additional, non address information " ++"(RFC2462)" ++msgstr "" ++ ++msgid "General" ++msgstr "" ++ ++msgid "Home Agent information" ++msgstr "" ++ ++msgid "Home Agent lifetime" ++msgstr "" ++ ++msgid "Home Agent preference" ++msgstr "" ++ ++msgid "Include Home Agent Information in the RA" ++msgstr "" ++ ++msgid "Include Mobile IPv6 Advertisement Interval option to RA" ++msgstr "" ++ ++msgid "Includes the link-layer address of the outgoing interface in the RA" ++msgstr "" ++ ++msgid "" ++"Indicates that the address of interface is sent instead of network prefix, " ++"as is required by Mobile IPv6" ++msgstr "" ++ ++msgid "" ++"Indicates that the underlying link is not broadcast capable, prevents " ++"unsolicited advertisements from being sent" ++msgstr "" ++ ++msgid "" ++"Indicates that this prefix can be used for autonomous address configuration " ++"(RFC4862)" ++msgstr "" ++ ++msgid "" ++"Indicates that this prefix can be used for on-link determination (RFC4861)" ++msgstr "" ++ ++msgid "Interface" ++msgstr "" ++ ++msgid "Interface Configuration" ++msgstr "" ++ ++msgid "Interface required" ++msgstr "" ++ ++msgid "Interfaces" ++msgstr "" ++ ++msgid "Lifetime" ++msgstr "" ++ ++msgid "Link MTU" ++msgstr "" ++ ++msgid "Managed flag" ++msgstr "" ++ ++msgid "Max. interval" ++msgstr "" ++ ++msgid "Maximum advertisement interval" ++msgstr "" ++ ++msgid "Minimum advertisement delay" ++msgstr "" ++ ++msgid "Minimum advertisement interval" ++msgstr "" ++ ++msgid "Mobile IPv6" ++msgstr "" ++ ++msgid "Mobile IPv6 interval option" ++msgstr "" ++ ++msgid "Mobile IPv6 router registration" ++msgstr "" ++ ++msgid "Multicast" ++msgstr "" ++ ++msgid "On-link" ++msgstr "" ++ ++msgid "On-link determination" ++msgstr "" ++ ++msgid "Preference" ++msgstr "" ++ ++msgid "Preferred lifetime" ++msgstr "" ++ ++msgid "Prefix" ++msgstr "" ++ ++msgid "Prefix Configuration" ++msgstr "" ++ ++msgid "Prefixes" ++msgstr "" ++ ++msgid "RDNSS" ++msgstr "" ++ ++msgid "RDNSS Configuration" ++msgstr "" ++ ++msgid "Radvd" ++msgstr "" ++ ++msgid "Radvd - DNSSL" ++msgstr "" ++ ++msgid "Radvd - Interface %q" ++msgstr "" ++ ++msgid "Radvd - Prefix" ++msgstr "" ++ ++msgid "Radvd - RDNSS" ++msgstr "" ++ ++msgid "Radvd - Route" ++msgstr "" ++ ++msgid "" ++"Radvd is a router advertisement daemon for IPv6. It listens to router " ++"solicitations and sends router advertisements as described in RFC 4861." ++msgstr "" ++ ++msgid "Reachable time" ++msgstr "" ++ ++msgid "" ++"Restrict communication to specified clients, leave empty to use multicast" ++msgstr "" ++ ++msgid "Retransmit timer" ++msgstr "" ++ ++msgid "Route Configuration" ++msgstr "" ++ ++msgid "Routes" ++msgstr "" ++ ++msgid "Source link-layer address" ++msgstr "" ++ ++msgid "" ++"Specifies a logical interface name to derive a 6to4 prefix from. The " ++"interfaces public IPv4 address is combined with 2002::/3 and the value of " ++"the prefix option" ++msgstr "" ++ ++msgid "Specifies the lifetime associated with the route in seconds." ++msgstr "" ++ ++msgid "Specifies the logical interface name this section belongs to" ++msgstr "" ++ ++msgid "" ++"Specifies the maximum duration how long the DNSSL entries are used for name " ++"resolution." ++msgstr "" ++ ++msgid "" ++"Specifies the maximum duration how long the RDNSS entries are used for name " ++"resolution." ++msgstr "" ++ ++msgid "Specifies the preference associated with the default router" ++msgstr "" ++ ++msgid "Suffix" ++msgstr "" ++ ++msgid "" ++"The maximum time allowed between sending unsolicited multicast router " ++"advertisements from the interface, in seconds" ++msgstr "" ++ ++msgid "" ++"The minimum time allowed between sending multicast router advertisements " ++"from the interface, in seconds" ++msgstr "" ++ ++msgid "" ++"The minimum time allowed between sending unsolicited multicast router " ++"advertisements from the interface, in seconds" ++msgstr "" ++ ++msgid "The preference for the Home Agent sending this RA" ++msgstr "" ++ ++msgid "Timing" ++msgstr "" ++ ++msgid "Unicast only" ++msgstr "" ++ ++msgid "Valid lifetime" ++msgstr "" ++ ++msgid "Validity time" ++msgstr "" ++ ++msgid "default" ++msgstr "" ++ ++msgid "high" ++msgstr "" ++ ++msgid "low" ++msgstr "" ++ ++msgid "medium" ++msgstr "" ++ ++msgid "no" ++msgstr "" ++ ++msgid "yes" ++msgstr "" +diff --git a/feeds/luci/applications/luci-app-radvd/root/etc/uci-defaults/luci-radvd b/feeds/luci/applications/luci-app-radvd/root/etc/uci-defaults/luci-radvd +new file mode 100755 +index 0000000..c1f3b75 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-radvd/root/etc/uci-defaults/luci-radvd +@@ -0,0 +1,11 @@ ++#!/bin/sh ++ ++uci -q batch <<-EOF >/dev/null ++ delete ucitrack.@radvd[-1] ++ add ucitrack radvd ++ set ucitrack.@radvd[-1].init=radvd ++ commit ucitrack ++EOF ++ ++rm -f /tmp/luci-indexcache ++exit 0 +diff --git a/feeds/luci/applications/luci-app-samba/Makefile b/feeds/luci/applications/luci-app-samba/Makefile +new file mode 100644 +index 0000000..ba599b3 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-samba/Makefile +@@ -0,0 +1,14 @@ ++# ++# Copyright (C) 2008-2014 The LuCI Team ++# ++# This is free software, licensed under the Apache License, Version 2.0 . ++# ++ ++include $(TOPDIR)/rules.mk ++ ++LUCI_TITLE:=Network Shares - Samba SMB/CIFS module ++LUCI_DEPENDS:=+samba36-server ++ ++include ../../luci.mk ++ ++# call BuildPackage - OpenWrt buildroot signature +diff --git a/feeds/luci/applications/luci-app-samba/luasrc/controller/samba.lua b/feeds/luci/applications/luci-app-samba/luasrc/controller/samba.lua +new file mode 100644 +index 0000000..397af6a +--- /dev/null ++++ b/feeds/luci/applications/luci-app-samba/luasrc/controller/samba.lua +@@ -0,0 +1,16 @@ ++-- Copyright 2008 Steven Barth ++-- Copyright 2008 Jo-Philipp Wich ++-- Licensed to the public under the Apache License 2.0. ++ ++module("luci.controller.samba", package.seeall) ++ ++function index() ++ if not nixio.fs.access("/etc/config/samba") then ++ return ++ end ++ ++ local page ++ ++ page = entry({"admin", "services", "samba"}, cbi("samba"), _("Network Shares")) ++ page.dependent = true ++end +diff --git a/feeds/luci/applications/luci-app-samba/luasrc/model/cbi/samba.lua b/feeds/luci/applications/luci-app-samba/luasrc/model/cbi/samba.lua +new file mode 100644 +index 0000000..721191a +--- /dev/null ++++ b/feeds/luci/applications/luci-app-samba/luasrc/model/cbi/samba.lua +@@ -0,0 +1,72 @@ ++-- Copyright 2008 Steven Barth ++-- Copyright 2008 Jo-Philipp Wich ++-- Licensed to the public under the Apache License 2.0. ++ ++m = Map("samba", translate("Network Shares")) ++ ++s = m:section(TypedSection, "samba", "Samba") ++s.anonymous = true ++ ++s:tab("general", translate("General Settings")) ++s:tab("template", translate("Edit Template")) ++ ++s:taboption("general", Value, "name", translate("Hostname")) ++s:taboption("general", Value, "description", translate("Description")) ++s:taboption("general", Value, "workgroup", translate("Workgroup")) ++s:taboption("general", Value, "homes", translate("Share home-directories"), ++ translate("Allow system users to reach their home directories via " .. ++ "network shares")) ++ ++tmpl = s:taboption("template", Value, "_tmpl", ++ translate("Edit the template that is used for generating the samba configuration."), ++ translate("This is the content of the file '/etc/samba/smb.conf.template' from which your samba configuration will be generated. " .. ++ "Values enclosed by pipe symbols ('|') should not be changed. They get their values from the 'General Settings' tab.")) ++ ++tmpl.template = "cbi/tvalue" ++tmpl.rows = 20 ++ ++function tmpl.cfgvalue(self, section) ++ return nixio.fs.readfile("/etc/samba/smb.conf.template") ++end ++ ++function tmpl.write(self, section, value) ++ value = value:gsub("\r\n?", "\n") ++ nixio.fs.writefile("//etc/samba/smb.conf.template", value) ++end ++ ++ ++s = m:section(TypedSection, "sambashare", translate("Shared Directories")) ++s.anonymous = true ++s.addremove = true ++s.template = "cbi/tblsection" ++ ++s:option(Value, "name", translate("Name")) ++pth = s:option(Value, "path", translate("Path")) ++if nixio.fs.access("/etc/config/fstab") then ++ pth.titleref = luci.dispatcher.build_url("admin", "system", "fstab") ++end ++ ++s:option(Value, "users", translate("Allowed users")).rmempty = true ++ ++ro = s:option(Flag, "read_only", translate("Read-only")) ++ro.rmempty = false ++ro.enabled = "yes" ++ro.disabled = "no" ++ ++go = s:option(Flag, "guest_ok", translate("Allow guests")) ++go.rmempty = false ++go.enabled = "yes" ++go.disabled = "no" ++ ++cm = s:option(Value, "create_mask", translate("Create mask"), ++ translate("Mask for new files")) ++cm.rmempty = true ++cm.size = 4 ++ ++dm = s:option(Value, "dir_mask", translate("Directory mask"), ++ translate("Mask for new directories")) ++dm.rmempty = true ++dm.size = 4 ++ ++ ++return m +diff --git a/feeds/luci/applications/luci-app-samba/po/ca/samba.po b/feeds/luci/applications/luci-app-samba/po/ca/samba.po +new file mode 100644 +index 0000000..0668b1b +--- /dev/null ++++ b/feeds/luci/applications/luci-app-samba/po/ca/samba.po +@@ -0,0 +1,95 @@ ++# samba.pot ++# generated from ./applications/luci-samba/luasrc/i18n/samba.en.lua ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Report-Msgid-Bugs-To: \n" ++"POT-Creation-Date: 2009-06-10 03:40+0200\n" ++"PO-Revision-Date: 2014-07-01 05:47+0200\n" ++"Last-Translator: Alex \n" ++"Language-Team: LANGUAGE \n" ++"Language: ca\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n != 1);\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "Allow guests" ++msgstr "Permet convidats" ++ ++msgid "Allow system users to reach their home directories via network shares" ++msgstr "" ++"Permet que els usuaris del sistema pugin arribar als seus directoris d'inici " ++"via comparticions de xarxa" ++ ++msgid "Allowed users" ++msgstr "Usuaris permesos" ++ ++msgid "Create mask" ++msgstr "Crea màscara" ++ ++msgid "Description" ++msgstr "Descripció" ++ ++msgid "Directory mask" ++msgstr "Màscara de directori" ++ ++msgid "Edit Template" ++msgstr "Edita plantilla" ++ ++msgid "Edit the template that is used for generating the samba configuration." ++msgstr "Edita la plantilla que s'usa per generar la configuració de samba." ++ ++msgid "General Settings" ++msgstr "Ajusts generals" ++ ++msgid "Hostname" ++msgstr "Nom de màquina" ++ ++msgid "Mask for new directories" ++msgstr "Màscara per directoris nous" ++ ++msgid "Mask for new files" ++msgstr "Màscara per fitxers nous" ++ ++msgid "Name" ++msgstr "Nom" ++ ++msgid "Network Shares" ++msgstr "Comparticions de xarxa" ++ ++msgid "Path" ++msgstr "Ruta" ++ ++msgid "Read-only" ++msgstr "Només lectura" ++ ++msgid "Share home-directories" ++msgstr "Comparteix directoris d'inici" ++ ++msgid "Shared Directories" ++msgstr "Directoris compartits" ++ ++msgid "" ++"This is the content of the file '/etc/samba/smb.conf.template' from which " ++"your samba configuration will be generated. Values enclosed by pipe symbols " ++"('|') should not be changed. They get their values from the 'General " ++"Settings' tab." ++msgstr "" ++"Això és el contingut del fitxer '/etc/samba/smb.conf.template' del qual la " ++"vostra configuració de samba es generarà. Valors encerclats per símbols de " ++"barra ('|') no es deuen canviar. Reben els seus valors de la pestanya " ++"'Ajusts generals'." ++ ++msgid "Workgroup" ++msgstr "Grup de treball" ++ ++#~ msgid "Shared Directory" ++#~ msgstr "Directori compartit" ++ ++#~ msgid "Physical Path" ++#~ msgstr "Ruta física" ++ ++#~ msgid "optional" ++#~ msgstr "opcional" +diff --git a/feeds/luci/applications/luci-app-samba/po/cs/samba.po b/feeds/luci/applications/luci-app-samba/po/cs/samba.po +new file mode 100644 +index 0000000..fefb7ff +--- /dev/null ++++ b/feeds/luci/applications/luci-app-samba/po/cs/samba.po +@@ -0,0 +1,83 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"PO-Revision-Date: 2014-05-31 13:56+0200\n" ++"Last-Translator: koli \n" ++"Language-Team: none\n" ++"Language: cs\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "Allow guests" ++msgstr "Povolení hosté" ++ ++msgid "Allow system users to reach their home directories via network shares" ++msgstr "" ++"Povoluje systémovým uživatelům přístup do jejich domácích adresářů skrze " ++"sdílení pÅ™es síť." ++ ++msgid "Allowed users" ++msgstr "Povolení uživatelé" ++ ++msgid "Create mask" ++msgstr "VytvoÅ™it masku" ++ ++msgid "Description" ++msgstr "Popis" ++ ++msgid "Directory mask" ++msgstr "Maska adresáře" ++ ++msgid "Edit Template" ++msgstr "Editovat Å¡ablonu" ++ ++msgid "Edit the template that is used for generating the samba configuration." ++msgstr "" ++"Editovat Å¡ablonu, která je použita pro generování konfiguraÄního souboru pro " ++"sambu." ++ ++msgid "General Settings" ++msgstr "Obecné nastavení" ++ ++msgid "Hostname" ++msgstr "Název poÄítaÄe." ++ ++msgid "Mask for new directories" ++msgstr "Maska pro nové adresáře" ++ ++msgid "Mask for new files" ++msgstr "Maska pro nové soubory" ++ ++msgid "Name" ++msgstr "Jméno" ++ ++msgid "Network Shares" ++msgstr "Síťová sdílení" ++ ++msgid "Path" ++msgstr "Cesta" ++ ++msgid "Read-only" ++msgstr "Pouze pro Ätení" ++ ++msgid "Share home-directories" ++msgstr "Sdílet domácí adresáře" ++ ++msgid "Shared Directories" ++msgstr "Sdílené adresáře" ++ ++msgid "" ++"This is the content of the file '/etc/samba/smb.conf.template' from which " ++"your samba configuration will be generated. Values enclosed by pipe symbols " ++"('|') should not be changed. They get their values from the 'General " ++"Settings' tab." ++msgstr "" ++"Toto je obsah souboru \"/etc/samba/smb.conf.template\", ze kterého je " ++"konfigurace samby generována. Hodnoty uzavÅ™ené rourou (\"|\"), by se nemÄ›ly " ++"mÄ›nit. Tyto hodnoty jsou brány ze záložky \"Obecná nastavení\"." ++ ++msgid "Workgroup" ++msgstr "Skupina" +diff --git a/feeds/luci/applications/luci-app-samba/po/de/samba.po b/feeds/luci/applications/luci-app-samba/po/de/samba.po +new file mode 100644 +index 0000000..a5ceb05 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-samba/po/de/samba.po +@@ -0,0 +1,87 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Report-Msgid-Bugs-To: \n" ++"POT-Creation-Date: 2009-05-26 17:57+0200\n" ++"PO-Revision-Date: 2011-10-18 13:13+0200\n" ++"Last-Translator: Manuel \n" ++"Language-Team: LANGUAGE \n" ++"Language: de\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n != 1);\n" ++"X-Generator: Pootle 2.0.4\n" ++ ++msgid "Allow guests" ++msgstr "Gastzugang" ++ ++msgid "Allow system users to reach their home directories via network shares" ++msgstr "" ++"Systembenutzer dürfen ihre Heimatverzeichnis über Netzwerkfreigaben " ++"erreichen." ++ ++msgid "Allowed users" ++msgstr "Legitimierte Benutzer" ++ ++msgid "Create mask" ++msgstr "Berechtigungsmaske für neue Dateien" ++ ++msgid "Description" ++msgstr "Beschreibung" ++ ++msgid "Directory mask" ++msgstr "Verzeichnismaske" ++ ++msgid "Edit Template" ++msgstr "Template bearbeiten" ++ ++msgid "Edit the template that is used for generating the samba configuration." ++msgstr "" ++"Hier kann das Template bearbeitet werden, das zur Erstellung der Samba-" ++"Konfigurationsdateien verwendet wird." ++ ++msgid "General Settings" ++msgstr "Allgemeine Einstellungen" ++ ++msgid "Hostname" ++msgstr "Hostname" ++ ++msgid "Mask for new directories" ++msgstr "Maske für neue Verzeichnisse" ++ ++msgid "Mask for new files" ++msgstr "Maske für neue Dateien" ++ ++msgid "Name" ++msgstr "Name" ++ ++msgid "Network Shares" ++msgstr "Netzwerkfreigaben" ++ ++msgid "Path" ++msgstr "Pfad" ++ ++msgid "Read-only" ++msgstr "Nur Lesen" ++ ++msgid "Share home-directories" ++msgstr "Heimatverzeichnisse freigeben" ++ ++msgid "Shared Directories" ++msgstr "Freigegebene Verzeichnisse" ++ ++msgid "" ++"This is the content of the file '/etc/samba/smb.conf.template' from which " ++"your samba configuration will be generated. Values enclosed by pipe symbols " ++"('|') should not be changed. They get their values from the 'General " ++"Settings' tab." ++msgstr "" ++"Dieses Fenster zeigt den Inhalt der Datei '/etc/samba/smb.conf.template', " ++"die als Template zum Erstellen der Samba-Konfiguration verwendet wird. Werte " ++"die von Pipe Symbolen (|) eingeschlossen sind sollten nicht verändert " ++"werden, da diese beim Erstellen der Konfiguration mit den Werten aus dem Tab " ++"'Allgemeine Einstellungen' ersetzt werden." ++ ++msgid "Workgroup" ++msgstr "Arbeitsgruppe" +diff --git a/feeds/luci/applications/luci-app-samba/po/el/samba.po b/feeds/luci/applications/luci-app-samba/po/el/samba.po +new file mode 100644 +index 0000000..7cc722d +--- /dev/null ++++ b/feeds/luci/applications/luci-app-samba/po/el/samba.po +@@ -0,0 +1,78 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Report-Msgid-Bugs-To: \n" ++"POT-Creation-Date: 2009-05-28 02:08+0200\n" ++"PO-Revision-Date: 2012-03-18 15:31+0200\n" ++"Last-Translator: Vasilis \n" ++"Language-Team: LANGUAGE \n" ++"Language: el\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n != 1);\n" ++"X-Generator: Pootle 2.0.4\n" ++ ++msgid "Allow guests" ++msgstr "" ++ ++msgid "Allow system users to reach their home directories via network shares" ++msgstr "" ++ ++msgid "Allowed users" ++msgstr "" ++ ++msgid "Create mask" ++msgstr "" ++ ++msgid "Description" ++msgstr "" ++ ++msgid "Directory mask" ++msgstr "" ++ ++msgid "Edit Template" ++msgstr "" ++ ++msgid "Edit the template that is used for generating the samba configuration." ++msgstr "" ++ ++msgid "General Settings" ++msgstr "" ++ ++msgid "Hostname" ++msgstr "" ++ ++msgid "Mask for new directories" ++msgstr "" ++ ++msgid "Mask for new files" ++msgstr "" ++ ++msgid "Name" ++msgstr "Όνομα" ++ ++msgid "Network Shares" ++msgstr "" ++ ++msgid "Path" ++msgstr "" ++ ++msgid "Read-only" ++msgstr "" ++ ++msgid "Share home-directories" ++msgstr "" ++ ++msgid "Shared Directories" ++msgstr "" ++ ++msgid "" ++"This is the content of the file '/etc/samba/smb.conf.template' from which " ++"your samba configuration will be generated. Values enclosed by pipe symbols " ++"('|') should not be changed. They get their values from the 'General " ++"Settings' tab." ++msgstr "" ++ ++msgid "Workgroup" ++msgstr "" +diff --git a/feeds/luci/applications/luci-app-samba/po/en/samba.po b/feeds/luci/applications/luci-app-samba/po/en/samba.po +new file mode 100644 +index 0000000..f524c14 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-samba/po/en/samba.po +@@ -0,0 +1,82 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Report-Msgid-Bugs-To: \n" ++"POT-Creation-Date: 2010-03-22 15:23+0100\n" ++"PO-Revision-Date: 2011-10-25 21:26+0200\n" ++"Last-Translator: awm1 \n" ++"Language-Team: LANGUAGE \n" ++"Language: en\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n != 1);\n" ++"X-Generator: Pootle 2.0.4\n" ++ ++msgid "Allow guests" ++msgstr "Allow guests" ++ ++msgid "Allow system users to reach their home directories via network shares" ++msgstr "Allow system users to reach their home directories via network shares" ++ ++msgid "Allowed users" ++msgstr "Allowed users" ++ ++msgid "Create mask" ++msgstr "Create mask" ++ ++msgid "Description" ++msgstr "Description" ++ ++msgid "Directory mask" ++msgstr "Directory mask" ++ ++msgid "Edit Template" ++msgstr "Edit template" ++ ++msgid "Edit the template that is used for generating the samba configuration." ++msgstr "Edit the template that is used for generating the Samba configuration." ++ ++msgid "General Settings" ++msgstr "General settings" ++ ++msgid "Hostname" ++msgstr "Hostname" ++ ++msgid "Mask for new directories" ++msgstr "Mask for new directories" ++ ++msgid "Mask for new files" ++msgstr "Mask for new files" ++ ++msgid "Name" ++msgstr "Name" ++ ++msgid "Network Shares" ++msgstr "Network Shares" ++ ++msgid "Path" ++msgstr "Path" ++ ++msgid "Read-only" ++msgstr "Read-only" ++ ++msgid "Share home-directories" ++msgstr "Share home-directories" ++ ++msgid "Shared Directories" ++msgstr "Shared Directories" ++ ++msgid "" ++"This is the content of the file '/etc/samba/smb.conf.template' from which " ++"your samba configuration will be generated. Values enclosed by pipe symbols " ++"('|') should not be changed. They get their values from the 'General " ++"Settings' tab." ++msgstr "" ++"This is the content of the file '/etc/samba/smb.conf.template' from which " ++"your Samba configuration will be generated. Values enclosed by pipe symbols " ++"('|') should not be changed. They get their values from the 'General " ++"settings' tab." ++ ++msgid "Workgroup" ++msgstr "Workgroup" +diff --git a/feeds/luci/applications/luci-app-samba/po/es/samba.po b/feeds/luci/applications/luci-app-samba/po/es/samba.po +new file mode 100644 +index 0000000..950a817 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-samba/po/es/samba.po +@@ -0,0 +1,92 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Report-Msgid-Bugs-To: \n" ++"POT-Creation-Date: 2009-06-10 03:41+0200\n" ++"PO-Revision-Date: 2012-08-22 17:45+0200\n" ++"Last-Translator: José Vicente \n" ++"Language-Team: LANGUAGE \n" ++"Language: es\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n != 1);\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "Allow guests" ++msgstr "Permitir invitados" ++ ++msgid "Allow system users to reach their home directories via network shares" ++msgstr "" ++"Permitir a los usuarios acceder a sus directorios de inicio vía " ++"comparticiones de red" ++ ++msgid "Allowed users" ++msgstr "Usuarios permitidos" ++ ++msgid "Create mask" ++msgstr "Crear máscara" ++ ++msgid "Description" ++msgstr "Descripción" ++ ++msgid "Directory mask" ++msgstr "Máscara de directorio" ++ ++msgid "Edit Template" ++msgstr "Editar plantilla" ++ ++msgid "Edit the template that is used for generating the samba configuration." ++msgstr "Editar la plantilla usada para generar la configuración de samba." ++ ++msgid "General Settings" ++msgstr "Configuración general" ++ ++msgid "Hostname" ++msgstr "Nombre de máquina" ++ ++msgid "Mask for new directories" ++msgstr "Máscara para directorios nuevos" ++ ++msgid "Mask for new files" ++msgstr "Máscara para archivos nuevos" ++ ++msgid "Name" ++msgstr "Nombre" ++ ++msgid "Network Shares" ++msgstr "Comparticiones de red" ++ ++msgid "Path" ++msgstr "Dirección" ++ ++msgid "Read-only" ++msgstr "Solo lectura" ++ ++msgid "Share home-directories" ++msgstr "Compartir directorios personales" ++ ++msgid "Shared Directories" ++msgstr "Directorios compartidos" ++ ++msgid "" ++"This is the content of the file '/etc/samba/smb.conf.template' from which " ++"your samba configuration will be generated. Values enclosed by pipe symbols " ++"('|') should not be changed. They get their values from the 'General " ++"Settings' tab." ++msgstr "" ++"Contenido del fichero '/etc/samba/smb.conf.template' desde el que se " ++"generará la configuración de samba. Los valores entre tuberías ('|') no " ++"deben cambiarse. Su valor se toma desde la pestaña 'Configuración General'." ++ ++msgid "Workgroup" ++msgstr "Grupo de trabajo" ++ ++#~ msgid "Shared Directory" ++#~ msgstr "Directorio compatido" ++ ++#~ msgid "Physical Path" ++#~ msgstr "Ruta Física" ++ ++#~ msgid "optional" ++#~ msgstr "opcional" +diff --git a/feeds/luci/applications/luci-app-samba/po/fr/samba.po b/feeds/luci/applications/luci-app-samba/po/fr/samba.po +new file mode 100644 +index 0000000..8877900 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-samba/po/fr/samba.po +@@ -0,0 +1,84 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Report-Msgid-Bugs-To: \n" ++"POT-Creation-Date: 2009-05-19 19:36+0200\n" ++"PO-Revision-Date: 2011-11-23 22:36+0200\n" ++"Last-Translator: fredb \n" ++"Language-Team: LANGUAGE \n" ++"Language: fr\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n > 1);\n" ++"X-Generator: Pootle 2.0.4\n" ++ ++msgid "Allow guests" ++msgstr "Invités autorisés" ++ ++msgid "Allow system users to reach their home directories via network shares" ++msgstr "" ++"Autoriser les utilisateurs système à atteindre leurs dossiers personnels via " ++"les partages réseau" ++ ++msgid "Allowed users" ++msgstr "Utilisateurs autorisés" ++ ++msgid "Create mask" ++msgstr "Maque de création" ++ ++msgid "Description" ++msgstr "Description" ++ ++msgid "Directory mask" ++msgstr "Masque des dossiers" ++ ++msgid "Edit Template" ++msgstr "Éditer le modèle" ++ ++msgid "Edit the template that is used for generating the samba configuration." ++msgstr "Éditer le modèle utilisé pour générer la configuration Samba." ++ ++msgid "General Settings" ++msgstr "Paramètres généraux" ++ ++msgid "Hostname" ++msgstr "Nom d'hôte" ++ ++msgid "Mask for new directories" ++msgstr "Masque pour les nouveaux dossiers" ++ ++msgid "Mask for new files" ++msgstr "Masque pour les nouveaux fichiers" ++ ++msgid "Name" ++msgstr "Nom" ++ ++msgid "Network Shares" ++msgstr "Partages réseau" ++ ++msgid "Path" ++msgstr "Chemin" ++ ++msgid "Read-only" ++msgstr "Lecture seule" ++ ++msgid "Share home-directories" ++msgstr "Partager les dossiers personnels" ++ ++msgid "Shared Directories" ++msgstr "Dossiers partagés" ++ ++msgid "" ++"This is the content of the file '/etc/samba/smb.conf.template' from which " ++"your samba configuration will be generated. Values enclosed by pipe symbols " ++"('|') should not be changed. They get their values from the 'General " ++"Settings' tab." ++msgstr "" ++"Voici le contenu du fichier '/etc/samba/smb.conf.template' d'où sera généré " ++"votre configuration Samba. Les valeurs entre les symboles barre-verticale " ++" (« | ») ne doivent pas être modifiées, elles proviennent de l'onglet " ++"« Paramètres généraux »." ++ ++msgid "Workgroup" ++msgstr "Groupe de travail" +diff --git a/feeds/luci/applications/luci-app-samba/po/he/samba.po b/feeds/luci/applications/luci-app-samba/po/he/samba.po +new file mode 100644 +index 0000000..dd21a4a +--- /dev/null ++++ b/feeds/luci/applications/luci-app-samba/po/he/samba.po +@@ -0,0 +1,73 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Last-Translator: Automatically generated\n" ++"Language-Team: none\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n != 1);\n" ++ ++msgid "Allow guests" ++msgstr "" ++ ++msgid "Allow system users to reach their home directories via network shares" ++msgstr "" ++ ++msgid "Allowed users" ++msgstr "" ++ ++msgid "Create mask" ++msgstr "" ++ ++msgid "Description" ++msgstr "" ++ ++msgid "Directory mask" ++msgstr "" ++ ++msgid "Edit Template" ++msgstr "" ++ ++msgid "Edit the template that is used for generating the samba configuration." ++msgstr "" ++ ++msgid "General Settings" ++msgstr "" ++ ++msgid "Hostname" ++msgstr "" ++ ++msgid "Mask for new directories" ++msgstr "" ++ ++msgid "Mask for new files" ++msgstr "" ++ ++msgid "Name" ++msgstr "" ++ ++msgid "Network Shares" ++msgstr "" ++ ++msgid "Path" ++msgstr "" ++ ++msgid "Read-only" ++msgstr "" ++ ++msgid "Share home-directories" ++msgstr "" ++ ++msgid "Shared Directories" ++msgstr "" ++ ++msgid "" ++"This is the content of the file '/etc/samba/smb.conf.template' from which " ++"your samba configuration will be generated. Values enclosed by pipe symbols " ++"('|') should not be changed. They get their values from the 'General " ++"Settings' tab." ++msgstr "" ++ ++msgid "Workgroup" ++msgstr "" +diff --git a/feeds/luci/applications/luci-app-samba/po/hu/samba.po b/feeds/luci/applications/luci-app-samba/po/hu/samba.po +new file mode 100644 +index 0000000..64d1e22 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-samba/po/hu/samba.po +@@ -0,0 +1,84 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"PO-Revision-Date: 2012-04-06 10:56+0200\n" ++"Last-Translator: juhosg \n" ++"Language-Team: none\n" ++"Language: hu\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n != 1);\n" ++"X-Generator: Pootle 2.0.4\n" ++ ++msgid "Allow guests" ++msgstr "Vendég hozzáférés" ++ ++msgid "Allow system users to reach their home directories via network shares" ++msgstr "" ++"A rendszerfelhasználók hálózati megosztáson keresztül hozzáférhetnek a home " ++"könyvtárukhoz." ++ ++msgid "Allowed users" ++msgstr "Engedélyezett felhasználók" ++ ++msgid "Create mask" ++msgstr "Létrehozási maszk" ++ ++msgid "Description" ++msgstr "Leírás" ++ ++msgid "Directory mask" ++msgstr "Könyvtár maszk" ++ ++msgid "Edit Template" ++msgstr "Sablon szerkesztése" ++ ++msgid "Edit the template that is used for generating the samba configuration." ++msgstr "" ++"Itt szerkesztheti a sablont, ami a végleges samba konfiguráció " ++"elkészítéséhez kerül felhasználásra." ++ ++msgid "General Settings" ++msgstr "Ãltalános beállítások" ++ ++msgid "Hostname" ++msgstr "Gépnév" ++ ++msgid "Mask for new directories" ++msgstr "Új könyvtárak maszkja" ++ ++msgid "Mask for new files" ++msgstr "Új fájlok maszkja" ++ ++msgid "Name" ++msgstr "Név" ++ ++msgid "Network Shares" ++msgstr "Hálózati megosztások" ++ ++msgid "Path" ++msgstr "Elérési út" ++ ++msgid "Read-only" ++msgstr "Csak olvasható" ++ ++msgid "Share home-directories" ++msgstr "Home könyvtárak megosztása" ++ ++msgid "Shared Directories" ++msgstr "Megosztott könyvtárak" ++ ++msgid "" ++"This is the content of the file '/etc/samba/smb.conf.template' from which " ++"your samba configuration will be generated. Values enclosed by pipe symbols " ++"('|') should not be changed. They get their values from the 'General " ++"Settings' tab." ++msgstr "" ++"Itt látható a /etc/samba/smb.conf.template file tartalma, ami a samba " ++"konfiguráció előállításához kerül felhasználásra. A pipe szimbólumok ('|') " ++"közé zárt értékek módosítása nem szükséges, az értéküket az általános " ++"beállítások fülrÅ‘l kapják." ++ ++msgid "Workgroup" ++msgstr "Munkacsoport" +diff --git a/feeds/luci/applications/luci-app-samba/po/it/samba.po b/feeds/luci/applications/luci-app-samba/po/it/samba.po +new file mode 100644 +index 0000000..4645782 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-samba/po/it/samba.po +@@ -0,0 +1,85 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Report-Msgid-Bugs-To: \n" ++"POT-Creation-Date: 2009-05-19 19:36+0200\n" ++"PO-Revision-Date: 2012-04-19 22:28+0200\n" ++"Last-Translator: claudyus \n" ++"Language-Team: LANGUAGE \n" ++"Language: it\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n != 1);\n" ++"X-Generator: Pootle 2.0.4\n" ++ ++msgid "Allow guests" ++msgstr "Permetti ospiti" ++ ++msgid "Allow system users to reach their home directories via network shares" ++msgstr "" ++"Autorizza gli utenti del sistema a raggiungere la loro cartella home " ++"attraverso le condivisioni di rete" ++ ++msgid "Allowed users" ++msgstr "Utenti ammessi" ++ ++msgid "Create mask" ++msgstr "Mask di creazione dei file" ++ ++msgid "Description" ++msgstr "Descrizione" ++ ++msgid "Directory mask" ++msgstr "Maschera della cartella" ++ ++msgid "Edit Template" ++msgstr "Modifica Template" ++ ++msgid "Edit the template that is used for generating the samba configuration." ++msgstr "" ++"Modifica il template utilizzato per generare la configurazione di samba." ++ ++msgid "General Settings" ++msgstr "Opzioni Generali" ++ ++msgid "Hostname" ++msgstr "Hostname" ++ ++msgid "Mask for new directories" ++msgstr "Maschera per le nuove cartelle" ++ ++msgid "Mask for new files" ++msgstr "Maschera per i nuovi files" ++ ++msgid "Name" ++msgstr "Nome" ++ ++msgid "Network Shares" ++msgstr "Condivisioni di rete" ++ ++msgid "Path" ++msgstr "Percorso" ++ ++msgid "Read-only" ++msgstr "Solo lettura" ++ ++msgid "Share home-directories" ++msgstr "Condividi cartelle home" ++ ++msgid "Shared Directories" ++msgstr "Cartelle Condivise" ++ ++msgid "" ++"This is the content of the file '/etc/samba/smb.conf.template' from which " ++"your samba configuration will be generated. Values enclosed by pipe symbols " ++"('|') should not be changed. They get their values from the 'General " ++"Settings' tab." ++msgstr "" ++"Questo è il contenuto del file '/etc/samba/smb.conf.template' dal quale sarà " ++"generata la tua configurazione di samba. I valori racchiusi tra il simbolo " ++"('|') non dovrebbero essere toccati. Essi vengono generati dalla schermata " ++"'Opzioni Generali'." ++ ++msgid "Workgroup" ++msgstr "Gruppo di lavoro" +diff --git a/feeds/luci/applications/luci-app-samba/po/ja/samba.po b/feeds/luci/applications/luci-app-samba/po/ja/samba.po +new file mode 100644 +index 0000000..c527507 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-samba/po/ja/samba.po +@@ -0,0 +1,81 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Report-Msgid-Bugs-To: \n" ++"POT-Creation-Date: 2009-05-19 19:36+0200\n" ++"PO-Revision-Date: 2011-11-03 18:09+0200\n" ++"Last-Translator: Kentaro \n" ++"Language-Team: LANGUAGE \n" ++"Language: ja\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=1; plural=0;\n" ++"X-Generator: Pootle 2.0.4\n" ++ ++msgid "Allow guests" ++msgstr "ゲストアクセスを許å¯" ++ ++msgid "Allow system users to reach their home directories via network shares" ++msgstr "sambaを介ã—ã¦ãƒ¦ãƒ¼ã‚¶ãƒ¼ã®ãƒ›ãƒ¼ãƒ ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã¸ã®ã‚¢ã‚¯ã‚»ã‚¹ã‚’許å¯ã—ã¾ã™" ++ ++msgid "Allowed users" ++msgstr "許å¯ã•ã‚ŒãŸãƒ¦ãƒ¼ã‚¶ãƒ¼" ++ ++msgid "Create mask" ++msgstr "マスクã®ä½œæˆ" ++ ++msgid "Description" ++msgstr "説明" ++ ++msgid "Directory mask" ++msgstr "ディレクトリã®ãƒžã‚¹ã‚¯" ++ ++msgid "Edit Template" ++msgstr "テンプレートã®ç·¨é›†" ++ ++msgid "Edit the template that is used for generating the samba configuration." ++msgstr "samba設定を生æˆã™ã‚‹ãƒ†ãƒ³ãƒ—レートを編集ã—ã¾ã™ã€‚" ++ ++msgid "General Settings" ++msgstr "一般設定" ++ ++msgid "Hostname" ++msgstr "ホストå" ++ ++msgid "Mask for new directories" ++msgstr "æ–°è¦ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã®ãƒžã‚¹ã‚¯" ++ ++msgid "Mask for new files" ++msgstr "æ–°è¦ãƒ•ã‚¡ã‚¤ãƒ«ã®ãƒžã‚¹ã‚¯" ++ ++msgid "Name" ++msgstr "åå‰" ++ ++msgid "Network Shares" ++msgstr "ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯å…±æœ‰" ++ ++msgid "Path" ++msgstr "パス" ++ ++msgid "Read-only" ++msgstr "読ã¿è¾¼ã¿ã®ã¿" ++ ++msgid "Share home-directories" ++msgstr "ホームディレクトリã®å…±æœ‰" ++ ++msgid "Shared Directories" ++msgstr "共有ディレクトリ" ++ ++msgid "" ++"This is the content of the file '/etc/samba/smb.conf.template' from which " ++"your samba configuration will be generated. Values enclosed by pipe symbols " ++"('|') should not be changed. They get their values from the 'General " ++"Settings' tab." ++msgstr "" ++"ã“ã‚Œã¯ã€samba設定を生æˆã™ã‚‹ãŸã‚ã®'/etc/samba/smb.conf.template' ファイルã®å†…" ++"容ã§ã™ã€‚パイプ('|')ã§é–‰ã˜ã‚‰ã‚ŒãŸå€¤ã¯å¤‰æ›´ã—ãªã„ã§ãã ã•ã„。ã“れらã®å€¤ã¯'一般設" ++"定'タブ内ã®å€¤ã«ã‚ˆã£ã¦ç½®ãæ›ãˆã‚‰ã‚Œã¾ã™ã€‚" ++ ++msgid "Workgroup" ++msgstr "ワークグループ" +diff --git a/feeds/luci/applications/luci-app-samba/po/ms/samba.po b/feeds/luci/applications/luci-app-samba/po/ms/samba.po +new file mode 100644 +index 0000000..e29133e +--- /dev/null ++++ b/feeds/luci/applications/luci-app-samba/po/ms/samba.po +@@ -0,0 +1,72 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Last-Translator: Automatically generated\n" ++"Language-Team: none\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++ ++msgid "Allow guests" ++msgstr "" ++ ++msgid "Allow system users to reach their home directories via network shares" ++msgstr "" ++ ++msgid "Allowed users" ++msgstr "" ++ ++msgid "Create mask" ++msgstr "" ++ ++msgid "Description" ++msgstr "" ++ ++msgid "Directory mask" ++msgstr "" ++ ++msgid "Edit Template" ++msgstr "" ++ ++msgid "Edit the template that is used for generating the samba configuration." ++msgstr "" ++ ++msgid "General Settings" ++msgstr "" ++ ++msgid "Hostname" ++msgstr "" ++ ++msgid "Mask for new directories" ++msgstr "" ++ ++msgid "Mask for new files" ++msgstr "" ++ ++msgid "Name" ++msgstr "" ++ ++msgid "Network Shares" ++msgstr "" ++ ++msgid "Path" ++msgstr "" ++ ++msgid "Read-only" ++msgstr "" ++ ++msgid "Share home-directories" ++msgstr "" ++ ++msgid "Shared Directories" ++msgstr "" ++ ++msgid "" ++"This is the content of the file '/etc/samba/smb.conf.template' from which " ++"your samba configuration will be generated. Values enclosed by pipe symbols " ++"('|') should not be changed. They get their values from the 'General " ++"Settings' tab." ++msgstr "" ++ ++msgid "Workgroup" ++msgstr "" +diff --git a/feeds/luci/applications/luci-app-samba/po/no/samba.po b/feeds/luci/applications/luci-app-samba/po/no/samba.po +new file mode 100644 +index 0000000..1c5c807 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-samba/po/no/samba.po +@@ -0,0 +1,72 @@ ++msgid "" ++msgstr "" ++"Last-Translator: Lars Hardy \n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++ ++msgid "Allow guests" ++msgstr "Tillat gjester" ++ ++msgid "Allow system users to reach their home directories via network shares" ++msgstr "Tillat systembrukere Ã¥ nÃ¥ sine hjemmekataloger via nettverks mapper." ++ ++msgid "Allowed users" ++msgstr "Tillatte brukere" ++ ++msgid "Create mask" ++msgstr "Opprett Maske" ++ ++msgid "Description" ++msgstr "Beskrivelse" ++ ++msgid "Directory mask" ++msgstr "Katalog maske" ++ ++msgid "Edit Template" ++msgstr "Rediger Mal" ++ ++msgid "Edit the template that is used for generating the samba configuration." ++msgstr "Rediger malen som brukes til Ã¥ generere samba konfigurasjonen." ++ ++msgid "General Settings" ++msgstr "Generelle Innstillinger" ++ ++msgid "Hostname" ++msgstr "Vertsnavn" ++ ++msgid "Mask for new directories" ++msgstr "Maske for nye kataloger" ++ ++msgid "Mask for new files" ++msgstr "Maske for nye filer" ++ ++msgid "Name" ++msgstr "Navn" ++ ++msgid "Network Shares" ++msgstr "Nettverks Mapper" ++ ++msgid "Path" ++msgstr "Fysisk bane" ++ ++msgid "Read-only" ++msgstr "Skrivebeskyttet" ++ ++msgid "Share home-directories" ++msgstr "Del Hjemmekataloger" ++ ++msgid "Shared Directories" ++msgstr "Delte Kataloger" ++ ++msgid "" ++"This is the content of the file '/etc/samba/smb.conf.template' from which " ++"your samba configuration will be generated. Values enclosed by pipe symbols " ++"('|') should not be changed. They get their values from the 'General " ++"Settings' tab." ++msgstr "" ++"Dette er innholdet av filen '/etc/samba/smb.conf.template' som din samba " ++"konfigurasjon vil bli generert fra. Verdier omsluttet av ('|') bør ikke " ++"endres. De fÃ¥r sine verdier fra 'Generelle Innstillinger' fanen." ++ ++msgid "Workgroup" ++msgstr "Arbeidsgruppe" +diff --git a/feeds/luci/applications/luci-app-samba/po/pl/samba.po b/feeds/luci/applications/luci-app-samba/po/pl/samba.po +new file mode 100644 +index 0000000..7482622 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-samba/po/pl/samba.po +@@ -0,0 +1,83 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"PO-Revision-Date: 2011-08-26 09:51+0200\n" ++"Last-Translator: Staszek \n" ++"Language-Team: none\n" ++"Language: pl\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 " ++"|| n%100>=20) ? 1 : 2);\n" ++"X-Generator: Pootle 2.0.4\n" ++ ++msgid "Allow guests" ++msgstr "Zezwalaj GoÅ›ciom" ++ ++msgid "Allow system users to reach their home directories via network shares" ++msgstr "" ++"Użytkownicy systemu mogÄ… dostać siÄ™ do swoich katalogów domowych za " ++"poÅ›rednictwem udziałów sieciowych." ++ ++msgid "Allowed users" ++msgstr "Użytkownicy z prawem dostÄ™pu" ++ ++msgid "Create mask" ++msgstr "Utwórz maskÄ™" ++ ++msgid "Description" ++msgstr "Opis" ++ ++msgid "Directory mask" ++msgstr "Maska katalogu" ++ ++msgid "Edit Template" ++msgstr "Edytuj szablon" ++ ++msgid "Edit the template that is used for generating the samba configuration." ++msgstr "Edytuj szablon, który jest używany do generowania konfiguracji samby." ++ ++msgid "General Settings" ++msgstr "Ustawienia ogólne" ++ ++msgid "Hostname" ++msgstr "Nazwa hosta" ++ ++msgid "Mask for new directories" ++msgstr "Maska dla nowych katalogów" ++ ++msgid "Mask for new files" ++msgstr "Maska dla nowych plików" ++ ++msgid "Name" ++msgstr "Nazwa" ++ ++msgid "Network Shares" ++msgstr "UdziaÅ‚y sieciowe" ++ ++msgid "Path" ++msgstr "Åšcieżka" ++ ++msgid "Read-only" ++msgstr "Tylko do odczytu" ++ ++msgid "Share home-directories" ++msgstr "UdostÄ™pniaj katalogi domowe" ++ ++msgid "Shared Directories" ++msgstr "UdostÄ™pniane katalogi" ++ ++msgid "" ++"This is the content of the file '/etc/samba/smb.conf.template' from which " ++"your samba configuration will be generated. Values enclosed by pipe symbols " ++"('|') should not be changed. They get their values from the 'General " ++"Settings' tab." ++msgstr "" ++"To jest zawartość pliku '/etc/samba/smb.conf.template\", na podstawie " ++"którego zostanie wygenerowana konfiguracja samby. WartoÅ›ci otoczone symbolem " ++"kreski pionowej ('|') nie powinny być zmieniane. WartoÅ›ci ich zostanÄ… " ++"pobrane z zakÅ‚adki \"Ustawienia ogólne\"." ++ ++msgid "Workgroup" ++msgstr "Grupa robocza" +diff --git a/feeds/luci/applications/luci-app-samba/po/pt-br/samba.po b/feeds/luci/applications/luci-app-samba/po/pt-br/samba.po +new file mode 100644 +index 0000000..a753152 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-samba/po/pt-br/samba.po +@@ -0,0 +1,93 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Report-Msgid-Bugs-To: \n" ++"POT-Creation-Date: 2009-06-10 03:41+0200\n" ++"PO-Revision-Date: 2013-04-06 22:54+0200\n" ++"Last-Translator: Luiz Angelo \n" ++"Language-Team: LANGUAGE \n" ++"Language: pt_BR\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n > 1);\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "Allow guests" ++msgstr "Permitir convidados" ++ ++msgid "Allow system users to reach their home directories via network shares" ++msgstr "" ++"Usuários do sistema poderão acessar seu diretório home através dos " ++"compartilhamentos de rede" ++ ++msgid "Allowed users" ++msgstr "Usuários permitidos" ++ ++msgid "Create mask" ++msgstr "Máscara de criação" ++ ++msgid "Description" ++msgstr "Descrição" ++ ++msgid "Directory mask" ++msgstr "Máscara do diretório" ++ ++msgid "Edit Template" ++msgstr "Editar modelo" ++ ++msgid "Edit the template that is used for generating the samba configuration." ++msgstr "Edita o modelo que é usado para gerar a configuração do samba." ++ ++msgid "General Settings" ++msgstr "Configurações Gerais" ++ ++msgid "Hostname" ++msgstr "Nome do equipamento" ++ ++msgid "Mask for new directories" ++msgstr "Máscara para novos diretórios" ++ ++msgid "Mask for new files" ++msgstr "Máscara para novos arquivos" ++ ++msgid "Name" ++msgstr "Nome" ++ ++msgid "Network Shares" ++msgstr "Compartilhamentos de Rede" ++ ++msgid "Path" ++msgstr "Caminho" ++ ++msgid "Read-only" ++msgstr "Somente leitura" ++ ++msgid "Share home-directories" ++msgstr "Compartilhar diretórios home" ++ ++msgid "Shared Directories" ++msgstr "Diretórios Compartilhados" ++ ++msgid "" ++"This is the content of the file '/etc/samba/smb.conf.template' from which " ++"your samba configuration will be generated. Values enclosed by pipe symbols " ++"('|') should not be changed. They get their values from the 'General " ++"Settings' tab." ++msgstr "" ++"Este é o conteúdo do arquivo '/etc/samba/smb.conf.template' a partir do qual " ++"sua configuração do samba será gerada. Valores entre simbolos de pipe ('|') " ++"não devem ser alterados. Estes valores serão obtidos a partir da aba " ++"'Configurações Gerais'." ++ ++msgid "Workgroup" ++msgstr "Grupo de trabalho" ++ ++#~ msgid "Shared Directory" ++#~ msgstr "Diretório Compartilhado" ++ ++#~ msgid "Physical Path" ++#~ msgstr "Caminho Físico" ++ ++#~ msgid "optional" ++#~ msgstr "opcional" +diff --git a/feeds/luci/applications/luci-app-samba/po/pt/samba.po b/feeds/luci/applications/luci-app-samba/po/pt/samba.po +new file mode 100644 +index 0000000..4c5a2cd +--- /dev/null ++++ b/feeds/luci/applications/luci-app-samba/po/pt/samba.po +@@ -0,0 +1,93 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Report-Msgid-Bugs-To: \n" ++"POT-Creation-Date: 2009-05-26 19:03+0200\n" ++"PO-Revision-Date: 2013-05-01 01:13+0200\n" ++"Last-Translator: pedromrgoncalves \n" ++"Language-Team: LANGUAGE \n" ++"Language: pt\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n != 1);\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "Allow guests" ++msgstr "Permitir Convidados" ++ ++msgid "Allow system users to reach their home directories via network shares" ++msgstr "" ++"Utilizadores do sistema poderão aceder ao seu directório home através das " ++"partilhas de rede." ++ ++msgid "Allowed users" ++msgstr "Utilizadores Permitidos" ++ ++msgid "Create mask" ++msgstr "Criar Máscara" ++ ++msgid "Description" ++msgstr "Descrição" ++ ++msgid "Directory mask" ++msgstr "Máscara do Directório" ++ ++msgid "Edit Template" ++msgstr "Editar Template" ++ ++msgid "Edit the template that is used for generating the samba configuration." ++msgstr "Editar a template que é utilizada para gerar a configuração samba" ++ ++msgid "General Settings" ++msgstr "Definições Gerais" ++ ++msgid "Hostname" ++msgstr "Nome do host" ++ ++msgid "Mask for new directories" ++msgstr "Máscara para novos directórios" ++ ++msgid "Mask for new files" ++msgstr "Máscara para novos ficheiros" ++ ++msgid "Name" ++msgstr "Nome" ++ ++msgid "Network Shares" ++msgstr "Partilhas da Rede" ++ ++msgid "Path" ++msgstr "Caminho" ++ ++msgid "Read-only" ++msgstr "Apenas Leitura" ++ ++msgid "Share home-directories" ++msgstr "Partilha de directórios home" ++ ++msgid "Shared Directories" ++msgstr "Directórios Partilhados" ++ ++msgid "" ++"This is the content of the file '/etc/samba/smb.conf.template' from which " ++"your samba configuration will be generated. Values enclosed by pipe symbols " ++"('|') should not be changed. They get their values from the 'General " ++"Settings' tab." ++msgstr "" ++"Isto é o conteúdo do ficheiro 'etc/samba/smb.conf.template' a partir do qual " ++"será gerado o ficheiro de configuração do samba. Os valores entre o símbolo " ++"| não devem ser alterados. Eles recebem os valores do separador 'Definições " ++"Gerais'." ++ ++msgid "Workgroup" ++msgstr "Grupo de trabalho" ++ ++#~ msgid "Shared Directory" ++#~ msgstr "Diretório Compartilhado" ++ ++#~ msgid "Physical Path" ++#~ msgstr "Caminho Físico" ++ ++#~ msgid "optional" ++#~ msgstr "opcional" +diff --git a/feeds/luci/applications/luci-app-samba/po/ro/samba.po b/feeds/luci/applications/luci-app-samba/po/ro/samba.po +new file mode 100644 +index 0000000..4bc3415 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-samba/po/ro/samba.po +@@ -0,0 +1,82 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"PO-Revision-Date: 2011-10-07 17:16+0200\n" ++"Last-Translator: Daniel \n" ++"Language-Team: none\n" ++"Language: ro\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=3; plural=(n==1 ? 0 : (n==0 || (n%100 > 0 && n%100 < " ++"20)) ? 1 : 2);;\n" ++"X-Generator: Pootle 2.0.4\n" ++ ++msgid "Allow guests" ++msgstr "Permite oaspeti" ++ ++msgid "Allow system users to reach their home directories via network shares" ++msgstr "" ++"Permite utilizatorii de sistem sa acceseze directoarele lor peste " ++"partajarile de retea" ++ ++msgid "Allowed users" ++msgstr "Utilizatori acceptati" ++ ++msgid "Create mask" ++msgstr "Creaza masca" ++ ++msgid "Description" ++msgstr "Descriere" ++ ++msgid "Directory mask" ++msgstr "Masca director" ++ ++msgid "Edit Template" ++msgstr "Editeaza sablon" ++ ++msgid "Edit the template that is used for generating the samba configuration." ++msgstr "Editeaza sablonul care e folosit pentru generarea configuratiei samba." ++ ++msgid "General Settings" ++msgstr "Setari generale" ++ ++msgid "Hostname" ++msgstr "Numele de host" ++ ++msgid "Mask for new directories" ++msgstr "Masca pentru directoarele noi" ++ ++msgid "Mask for new files" ++msgstr "Masca pentru fisierele noi" ++ ++msgid "Name" ++msgstr "Nume" ++ ++msgid "Network Shares" ++msgstr "Partajari pe retea" ++ ++msgid "Path" ++msgstr "Cale" ++ ++msgid "Read-only" ++msgstr "Doar citire" ++ ++msgid "Share home-directories" ++msgstr "Partajeaza directoarele proprii" ++ ++msgid "Shared Directories" ++msgstr "Directoare partajate" ++ ++msgid "" ++"This is the content of the file '/etc/samba/smb.conf.template' from which " ++"your samba configuration will be generated. Values enclosed by pipe symbols " ++"('|') should not be changed. They get their values from the 'General " ++"Settings' tab." ++msgstr "" ++"Acesta este continutul fisierului '/etc/samba/smb.conf.template' din care se " ++"genereaza configuratia samba. Valorile dintre liniuta verticala ('|') n-ar " ++"trebui schimbate, ele iau valorile direct din tab-ul de \"Setari generale\"." ++ ++msgid "Workgroup" ++msgstr "Workgroup" +diff --git a/feeds/luci/applications/luci-app-samba/po/ru/samba.po b/feeds/luci/applications/luci-app-samba/po/ru/samba.po +new file mode 100644 +index 0000000..82906e3 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-samba/po/ru/samba.po +@@ -0,0 +1,85 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: LuCI: samba\n" ++"Report-Msgid-Bugs-To: \n" ++"POT-Creation-Date: 2009-05-19 19:36+0200\n" ++"PO-Revision-Date: 2012-08-15 13:48+0300\n" ++"Last-Translator: Roman A. aka BasicXP \n" ++"Language-Team: Russian \n" ++"Language: ru\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%" ++"10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" ++"X-Generator: Pootle 2.0.4\n" ++"X-Poedit-SourceCharset: UTF-8\n" ++ ++msgid "Allow guests" ++msgstr "Разрешить гоÑтевой вход" ++ ++msgid "Allow system users to reach their home directories via network shares" ++msgstr "" ++"Разрешить пользователÑм получать доÑтуп к их домашним директориÑм через Ñеть" ++ ++msgid "Allowed users" ++msgstr "Разрешённые пользователи" ++ ++msgid "Create mask" ++msgstr "Создать маÑку" ++ ++msgid "Description" ++msgstr "ОпиÑание" ++ ++msgid "Directory mask" ++msgstr "МаÑка директории" ++ ++msgid "Edit Template" ++msgstr "Редактировать шаблон" ++ ++msgid "Edit the template that is used for generating the samba configuration." ++msgstr "Редактировать шаблон, иÑпользуемый Ð´Ð»Ñ Ð³ÐµÐ½ÐµÑ€Ð°Ñ†Ð¸Ð¸ конфигурации samba." ++ ++msgid "General Settings" ++msgstr "Общие наÑтройки" ++ ++msgid "Hostname" ++msgstr "Ð˜Ð¼Ñ Ñ…Ð¾Ñта" ++ ++msgid "Mask for new directories" ++msgstr "МаÑка Ð´Ð»Ñ Ð½Ð¾Ð²Ñ‹Ñ… директорий" ++ ++msgid "Mask for new files" ++msgstr "МаÑка Ð´Ð»Ñ Ð½Ð¾Ð²Ñ‹Ñ… файлов" ++ ++msgid "Name" ++msgstr "ИмÑ" ++ ++msgid "Network Shares" ++msgstr "Сетевые реÑурÑÑ‹" ++ ++msgid "Path" ++msgstr "Путь" ++ ++msgid "Read-only" ++msgstr "Только Ð´Ð»Ñ Ñ‡Ñ‚ÐµÐ½Ð¸Ñ" ++ ++msgid "Share home-directories" ++msgstr "СовмеÑтно иÑпользовать домашние директории" ++ ++msgid "Shared Directories" ++msgstr "СовмеÑтно иÑпользуемые директории" ++ ++msgid "" ++"This is the content of the file '/etc/samba/smb.conf.template' from which " ++"your samba configuration will be generated. Values enclosed by pipe symbols " ++"('|') should not be changed. They get their values from the 'General " ++"Settings' tab." ++msgstr "" ++"Это Ñодержимое файла '/etc/samba/smb.conf.template', из которого " ++"генерируетÑÑ ÐºÐ¾Ð½Ñ„Ð¸Ð³ÑƒÑ€Ð°Ñ†Ð¸Ñ samba. ЗначениÑ, заключённые в Ñимволы \"|\", не " ++"должны быть изменены. Они будут автоматичеÑки заменены на Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ Ð¸Ð· " ++"вкладки 'Общие наÑтройки'." ++ ++msgid "Workgroup" ++msgstr "Ð Ð°Ð±Ð¾Ñ‡Ð°Ñ Ð³Ñ€ÑƒÐ¿Ð¿Ð°" +diff --git a/feeds/luci/applications/luci-app-samba/po/sk/samba.po b/feeds/luci/applications/luci-app-samba/po/sk/samba.po +new file mode 100644 +index 0000000..66ec9e0 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-samba/po/sk/samba.po +@@ -0,0 +1,73 @@ ++msgid "" ++msgstr "" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Last-Translator: Automatically generated\n" ++"Language-Team: none\n" ++"MIME-Version: 1.0\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n" ++ ++msgid "Allow guests" ++msgstr "" ++ ++msgid "Allow system users to reach their home directories via network shares" ++msgstr "" ++ ++msgid "Allowed users" ++msgstr "" ++ ++msgid "Create mask" ++msgstr "" ++ ++msgid "Description" ++msgstr "" ++ ++msgid "Directory mask" ++msgstr "" ++ ++msgid "Edit Template" ++msgstr "" ++ ++msgid "Edit the template that is used for generating the samba configuration." ++msgstr "" ++ ++msgid "General Settings" ++msgstr "" ++ ++msgid "Hostname" ++msgstr "" ++ ++msgid "Mask for new directories" ++msgstr "" ++ ++msgid "Mask for new files" ++msgstr "" ++ ++msgid "Name" ++msgstr "" ++ ++msgid "Network Shares" ++msgstr "" ++ ++msgid "Path" ++msgstr "" ++ ++msgid "Read-only" ++msgstr "" ++ ++msgid "Share home-directories" ++msgstr "" ++ ++msgid "Shared Directories" ++msgstr "" ++ ++msgid "" ++"This is the content of the file '/etc/samba/smb.conf.template' from which " ++"your samba configuration will be generated. Values enclosed by pipe symbols " ++"('|') should not be changed. They get their values from the 'General " ++"Settings' tab." ++msgstr "" ++ ++msgid "Workgroup" ++msgstr "" +diff --git a/feeds/luci/applications/luci-app-samba/po/sv/samba.po b/feeds/luci/applications/luci-app-samba/po/sv/samba.po +new file mode 100644 +index 0000000..b19b6e3 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-samba/po/sv/samba.po +@@ -0,0 +1,74 @@ ++msgid "" ++msgstr "" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Last-Translator: Automatically generated\n" ++"Language-Team: none\n" ++"Language: sv\n" ++"MIME-Version: 1.0\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n != 1);\n" ++ ++msgid "Allow guests" ++msgstr "" ++ ++msgid "Allow system users to reach their home directories via network shares" ++msgstr "" ++ ++msgid "Allowed users" ++msgstr "" ++ ++msgid "Create mask" ++msgstr "" ++ ++msgid "Description" ++msgstr "" ++ ++msgid "Directory mask" ++msgstr "" ++ ++msgid "Edit Template" ++msgstr "" ++ ++msgid "Edit the template that is used for generating the samba configuration." ++msgstr "" ++ ++msgid "General Settings" ++msgstr "" ++ ++msgid "Hostname" ++msgstr "" ++ ++msgid "Mask for new directories" ++msgstr "" ++ ++msgid "Mask for new files" ++msgstr "" ++ ++msgid "Name" ++msgstr "" ++ ++msgid "Network Shares" ++msgstr "" ++ ++msgid "Path" ++msgstr "" ++ ++msgid "Read-only" ++msgstr "" ++ ++msgid "Share home-directories" ++msgstr "" ++ ++msgid "Shared Directories" ++msgstr "" ++ ++msgid "" ++"This is the content of the file '/etc/samba/smb.conf.template' from which " ++"your samba configuration will be generated. Values enclosed by pipe symbols " ++"('|') should not be changed. They get their values from the 'General " ++"Settings' tab." ++msgstr "" ++ ++msgid "Workgroup" ++msgstr "" +diff --git a/feeds/luci/applications/luci-app-samba/po/templates/samba.pot b/feeds/luci/applications/luci-app-samba/po/templates/samba.pot +new file mode 100644 +index 0000000..d91400b +--- /dev/null ++++ b/feeds/luci/applications/luci-app-samba/po/templates/samba.pot +@@ -0,0 +1,66 @@ ++msgid "" ++msgstr "Content-Type: text/plain; charset=UTF-8" ++ ++msgid "Allow guests" ++msgstr "" ++ ++msgid "Allow system users to reach their home directories via network shares" ++msgstr "" ++ ++msgid "Allowed users" ++msgstr "" ++ ++msgid "Create mask" ++msgstr "" ++ ++msgid "Description" ++msgstr "" ++ ++msgid "Directory mask" ++msgstr "" ++ ++msgid "Edit Template" ++msgstr "" ++ ++msgid "Edit the template that is used for generating the samba configuration." ++msgstr "" ++ ++msgid "General Settings" ++msgstr "" ++ ++msgid "Hostname" ++msgstr "" ++ ++msgid "Mask for new directories" ++msgstr "" ++ ++msgid "Mask for new files" ++msgstr "" ++ ++msgid "Name" ++msgstr "" ++ ++msgid "Network Shares" ++msgstr "" ++ ++msgid "Path" ++msgstr "" ++ ++msgid "Read-only" ++msgstr "" ++ ++msgid "Share home-directories" ++msgstr "" ++ ++msgid "Shared Directories" ++msgstr "" ++ ++msgid "" ++"This is the content of the file '/etc/samba/smb.conf.template' from which " ++"your samba configuration will be generated. Values enclosed by pipe symbols " ++"('|') should not be changed. They get their values from the 'General " ++"Settings' tab." ++msgstr "" ++ ++msgid "Workgroup" ++msgstr "" +diff --git a/feeds/luci/applications/luci-app-samba/po/tr/samba.po b/feeds/luci/applications/luci-app-samba/po/tr/samba.po +new file mode 100644 +index 0000000..fda2f6e +--- /dev/null ++++ b/feeds/luci/applications/luci-app-samba/po/tr/samba.po +@@ -0,0 +1,73 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Last-Translator: Automatically generated\n" ++"Language-Team: none\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=1; plural=0;\n" ++ ++msgid "Allow guests" ++msgstr "" ++ ++msgid "Allow system users to reach their home directories via network shares" ++msgstr "" ++ ++msgid "Allowed users" ++msgstr "" ++ ++msgid "Create mask" ++msgstr "" ++ ++msgid "Description" ++msgstr "" ++ ++msgid "Directory mask" ++msgstr "" ++ ++msgid "Edit Template" ++msgstr "" ++ ++msgid "Edit the template that is used for generating the samba configuration." ++msgstr "" ++ ++msgid "General Settings" ++msgstr "" ++ ++msgid "Hostname" ++msgstr "" ++ ++msgid "Mask for new directories" ++msgstr "" ++ ++msgid "Mask for new files" ++msgstr "" ++ ++msgid "Name" ++msgstr "" ++ ++msgid "Network Shares" ++msgstr "" ++ ++msgid "Path" ++msgstr "" ++ ++msgid "Read-only" ++msgstr "" ++ ++msgid "Share home-directories" ++msgstr "" ++ ++msgid "Shared Directories" ++msgstr "" ++ ++msgid "" ++"This is the content of the file '/etc/samba/smb.conf.template' from which " ++"your samba configuration will be generated. Values enclosed by pipe symbols " ++"('|') should not be changed. They get their values from the 'General " ++"Settings' tab." ++msgstr "" ++ ++msgid "Workgroup" ++msgstr "" +diff --git a/feeds/luci/applications/luci-app-samba/po/uk/samba.po b/feeds/luci/applications/luci-app-samba/po/uk/samba.po +new file mode 100644 +index 0000000..6f2a920 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-samba/po/uk/samba.po +@@ -0,0 +1,84 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"PO-Revision-Date: 2012-03-18 20:35+0200\n" ++"Last-Translator: YuriPet \n" ++"Language-Team: none\n" ++"Language: uk\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%" ++"10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" ++"X-Generator: Pootle 2.0.4\n" ++ ++msgid "Allow guests" ++msgstr "Дозволити гоÑтьовий вхід" ++ ++msgid "Allow system users to reach their home directories via network shares" ++msgstr "" ++"Дозволити кориÑтувачам ÑиÑтеми доÑÑгати Ñвоїх домашніх каталогів через " ++"загальні мережеві реÑурÑи" ++ ++msgid "Allowed users" ++msgstr "Дозволені кориÑтувачі" ++ ++msgid "Create mask" ++msgstr "Створити маÑку" ++ ++msgid "Description" ++msgstr "ОпиÑ" ++ ++msgid "Directory mask" ++msgstr "МаÑка каталогу" ++ ++msgid "Edit Template" ++msgstr "Редагувати шаблон" ++ ++msgid "Edit the template that is used for generating the samba configuration." ++msgstr "" ++"Редагувати шаблон, Ñкий викориÑтовуєтьÑÑ Ð´Ð»Ñ ÑÑ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ ÐºÐ¾Ð½Ñ„Ñ–Ð³ÑƒÑ€Ð°Ñ†Ñ–Ñ— samba." ++ ++msgid "General Settings" ++msgstr "Загальні наÑтройки" ++ ++msgid "Hostname" ++msgstr "Ðазва (ім'Ñ) вузла" ++ ++msgid "Mask for new directories" ++msgstr "МаÑка Ð´Ð»Ñ Ð½Ð¾Ð²Ð¸Ñ… каталогів" ++ ++msgid "Mask for new files" ++msgstr "МаÑка Ð´Ð»Ñ Ð½Ð¾Ð²Ð¸Ñ… файлів" ++ ++msgid "Name" ++msgstr "Ім'Ñ" ++ ++msgid "Network Shares" ++msgstr "Загальні мережеві реÑурÑи" ++ ++msgid "Path" ++msgstr "ШлÑÑ…" ++ ++msgid "Read-only" ++msgstr "Тільки читаннÑ" ++ ++msgid "Share home-directories" ++msgstr "Спільно викориÑтовувати домашні каталоги" ++ ++msgid "Shared Directories" ++msgstr "Загальні каталоги" ++ ++msgid "" ++"This is the content of the file '/etc/samba/smb.conf.template' from which " ++"your samba configuration will be generated. Values enclosed by pipe symbols " ++"('|') should not be changed. They get their values from the 'General " ++"Settings' tab." ++msgstr "" ++"Це вміÑÑ‚ файлу '/etc/samba/smb.conf.template', з Ñкого буде генеруватиÑÑ " ++"ваша ÐºÐ¾Ð½Ñ„Ñ–Ð³ÑƒÑ€Ð°Ñ†Ñ–Ñ samba. ЗначеннÑ, укладені в Ñимволи \"вертикальна риÑка" ++"\" (\"|\") не повинні змінюватиÑÑ. Вони отримують Ñвої Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð· вкладки " ++"\"Загальні налаштуваннÑ\"." ++ ++msgid "Workgroup" ++msgstr "Робоча група" +diff --git a/feeds/luci/applications/luci-app-samba/po/vi/samba.po b/feeds/luci/applications/luci-app-samba/po/vi/samba.po +new file mode 100644 +index 0000000..4e5638d +--- /dev/null ++++ b/feeds/luci/applications/luci-app-samba/po/vi/samba.po +@@ -0,0 +1,96 @@ ++# samba.pot ++# generated from ./applications/luci-samba/luasrc/i18n/samba.en.lua ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Report-Msgid-Bugs-To: \n" ++"POT-Creation-Date: 2009-08-16 06:59+0200\n" ++"PO-Revision-Date: 2009-08-13 03:54+0200\n" ++"Last-Translator: Hong Phuc Dang \n" ++"Language-Team: LANGUAGE \n" ++"Language: \n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"X-Generator: Pootle 1.1.0\n" ++ ++#, fuzzy ++msgid "Allow guests" ++msgstr "Cho phép khách" ++ ++#, fuzzy ++msgid "Allow system users to reach their home directories via network shares" ++msgstr "" ++"Những ngÆ°á»i sá»­ dụng hệ thống có thể tiếp cận những thÆ° mục tại nhà thông qua " ++"mạng lÆ°á»›i chia sẻ trá»±c tuyến." ++ ++#, fuzzy ++msgid "Allowed users" ++msgstr "NgÆ°á»i sá»­ dụng được cho phép" ++ ++#, fuzzy ++msgid "Create mask" ++msgstr "Tạo Mask" ++ ++msgid "Description" ++msgstr "Mô tả" ++ ++#, fuzzy ++msgid "Directory mask" ++msgstr "ThÆ° mục Mask" ++ ++msgid "Edit Template" ++msgstr "" ++ ++msgid "Edit the template that is used for generating the samba configuration." ++msgstr "" ++ ++msgid "General Settings" ++msgstr "" ++ ++msgid "Hostname" ++msgstr "tên máy chủ" ++ ++msgid "Mask for new directories" ++msgstr "Mask cho thÆ° mục má»›i" ++ ++msgid "Mask for new files" ++msgstr "Mask cho tập tin má»›i" ++ ++msgid "Name" ++msgstr "" ++ ++msgid "Network Shares" ++msgstr "Mạng chia sẻ" ++ ++msgid "Path" ++msgstr "" ++ ++#, fuzzy ++msgid "Read-only" ++msgstr "Chỉ Ä‘á»c " ++ ++msgid "Share home-directories" ++msgstr "Chia sẻ danh bạ chính" ++ ++msgid "Shared Directories" ++msgstr "ThÆ° mục chia sẻ" ++ ++msgid "" ++"This is the content of the file '/etc/samba/smb.conf.template' from which " ++"your samba configuration will be generated. Values enclosed by pipe symbols " ++"('|') should not be changed. They get their values from the 'General " ++"Settings' tab." ++msgstr "" ++ ++msgid "Workgroup" ++msgstr "Nhóm làm việc " ++ ++#~ msgid "Shared Directory" ++#~ msgstr "Äã chia sẻ thÆ° mục" ++ ++#~ msgid "Physical Path" ++#~ msgstr "ÄÆ°á»ng dẫn vật lý" ++ ++#~ msgid "optional" ++#~ msgstr "Tùy thích" +diff --git a/feeds/luci/applications/luci-app-samba/po/zh-cn/samba.po b/feeds/luci/applications/luci-app-samba/po/zh-cn/samba.po +new file mode 100644 +index 0000000..4ff671b +--- /dev/null ++++ b/feeds/luci/applications/luci-app-samba/po/zh-cn/samba.po +@@ -0,0 +1,83 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Report-Msgid-Bugs-To: \n" ++"POT-Creation-Date: 2009-06-10 03:40+0200\n" ++"PO-Revision-Date: 2012-06-21 18:31+0200\n" ++"Last-Translator: phantasm131 \n" ++"Language-Team: QQ Group 75543259 \n" ++"Language: zh_CN\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=1; plural=0;\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "Allow guests" ++msgstr "å…许匿å用户" ++ ++msgid "Allow system users to reach their home directories via network shares" ++msgstr "å…许系统用户通过网络共享访问他们的主目录" ++ ++msgid "Allowed users" ++msgstr "å…许用户" ++ ++msgid "Create mask" ++msgstr "创建æƒé™" ++ ++msgid "Description" ++msgstr "æè¿°" ++ ++msgid "Directory mask" ++msgstr "目录æƒé™" ++ ++msgid "Edit Template" ++msgstr "编辑模æ¿" ++ ++msgid "Edit the template that is used for generating the samba configuration." ++msgstr "编辑用æ¥ç”Ÿæˆsamba设置的模æ¿" ++ ++msgid "General Settings" ++msgstr "基本设置" ++ ++msgid "Hostname" ++msgstr "主机å" ++ ++msgid "Mask for new directories" ++msgstr "新目录æƒé™" ++ ++msgid "Mask for new files" ++msgstr "新文件æƒé™" ++ ++msgid "Name" ++msgstr "共享å" ++ ++msgid "Network Shares" ++msgstr "网络共享" ++ ++msgid "Path" ++msgstr "目录" ++ ++msgid "Read-only" ++msgstr "åªè¯»" ++ ++msgid "Share home-directories" ++msgstr "共享主目录" ++ ++msgid "Shared Directories" ++msgstr "共享目录" ++ ++msgid "" ++"This is the content of the file '/etc/samba/smb.conf.template' from which " ++"your samba configuration will be generated. Values enclosed by pipe symbols " ++"('|') should not be changed. They get their values from the 'General " ++"Settings' tab." ++msgstr "" ++"创建samba设置的 \"/etc/samba/smb.conf.template\" 文件的内容。被通é“符|包围的" ++"值å¯åœ¨åŸºæœ¬è®¾ç½®ä¸­è¿›è¡Œé…ç½®" ++ ++msgid "Workgroup" ++msgstr "工作组" ++ ++#~ msgid "Physical Path" ++#~ msgstr "物ç†è·¯å¾„" +diff --git a/feeds/luci/applications/luci-app-samba/po/zh-tw/samba.po b/feeds/luci/applications/luci-app-samba/po/zh-tw/samba.po +new file mode 100644 +index 0000000..6ec99ee +--- /dev/null ++++ b/feeds/luci/applications/luci-app-samba/po/zh-tw/samba.po +@@ -0,0 +1,76 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"PO-Revision-Date: 2013-08-07 15:43+0200\n" ++"Last-Translator: Ethan \n" ++"Language-Team: none\n" ++"Language: zh_TW\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=1; plural=0;\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "Allow guests" ++msgstr "å…許匿å使用者" ++ ++msgid "Allow system users to reach their home directories via network shares" ++msgstr "å…許系統使用者é€éŽç¶²è·¯åˆ†äº«å®¶ç›®éŒ„" ++ ++msgid "Allowed users" ++msgstr "å…許使用者" ++ ++msgid "Create mask" ++msgstr "建立權é™" ++ ++msgid "Description" ++msgstr "æè¿°" ++ ++msgid "Directory mask" ++msgstr "目錄權é™" ++ ++msgid "Edit Template" ++msgstr "編輯樣版" ++ ++msgid "Edit the template that is used for generating the samba configuration." ++msgstr "編輯用來產生Samba設定的樣æ¿" ++ ++msgid "General Settings" ++msgstr "基本設定" ++ ++msgid "Hostname" ++msgstr "主機å稱" ++ ++msgid "Mask for new directories" ++msgstr "新目錄權é™" ++ ++msgid "Mask for new files" ++msgstr "新檔案權é™" ++ ++msgid "Name" ++msgstr "共用å稱" ++ ++msgid "Network Shares" ++msgstr "網路分享" ++ ++msgid "Path" ++msgstr "路徑" ++ ++msgid "Read-only" ++msgstr "唯讀" ++ ++msgid "Share home-directories" ++msgstr "分享家目錄" ++ ++msgid "Shared Directories" ++msgstr "分享目錄" ++ ++msgid "" ++"This is the content of the file '/etc/samba/smb.conf.template' from which " ++"your samba configuration will be generated. Values enclosed by pipe symbols " ++"('|') should not be changed. They get their values from the 'General " ++"Settings' tab." ++msgstr "建立Samba設定的 \"/etc/samba/smb.conf.template\" 檔案內容。被('|')包åœçš„值å¯ä»¥åœ¨åŸºæœ¬è¨­å®šä¸­é€²è¡Œè¨­å®š" ++ ++msgid "Workgroup" ++msgstr "工作群組" +diff --git a/feeds/luci/applications/luci-app-shadowsocks-libev/Makefile b/feeds/luci/applications/luci-app-shadowsocks-libev/Makefile +new file mode 100644 +index 0000000..848a5c8 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-shadowsocks-libev/Makefile +@@ -0,0 +1,14 @@ ++# ++# Copyright (C) 2008-2014 The LuCI Team ++# ++# This is free software, licensed under the Apache License, Version 2.0 . ++# ++ ++include $(TOPDIR)/rules.mk ++ ++LUCI_TITLE:=LuCI Support for Shadowsocks-libev ++LUCI_DEPENDS:= ++ ++include ../../luci.mk ++ ++# call BuildPackage - OpenWrt buildroot signature +diff --git a/feeds/luci/applications/luci-app-shadowsocks-libev/luasrc/controller/shadowsocks-libev.lua b/feeds/luci/applications/luci-app-shadowsocks-libev/luasrc/controller/shadowsocks-libev.lua +new file mode 100644 +index 0000000..ae96816 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-shadowsocks-libev/luasrc/controller/shadowsocks-libev.lua +@@ -0,0 +1,12 @@ ++-- Copyright 2015 Jian Chang ++-- Licensed to the public under the Apache License 2.0. ++ ++module("luci.controller.shadowsocks-libev", package.seeall) ++ ++function index() ++ if not nixio.fs.access("/etc/config/shadowsocks-libev") then ++ return ++ end ++ ++ entry({"admin", "services", "shadowsocks-libev"}, cbi("shadowsocks-libev"), _("ShadowSocks-libev"), 74).dependent = true ++end +diff --git a/feeds/luci/applications/luci-app-shadowsocks-libev/luasrc/model/cbi/shadowsocks-libev.lua b/feeds/luci/applications/luci-app-shadowsocks-libev/luasrc/model/cbi/shadowsocks-libev.lua +new file mode 100644 +index 0000000..76435e2 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-shadowsocks-libev/luasrc/model/cbi/shadowsocks-libev.lua +@@ -0,0 +1,156 @@ ++-- Copyright 2015 Jian Chang ++-- Licensed to the public under the Apache License 2.0. ++ ++local m, s, o, e, a ++ ++if luci.sys.call("pidof ss-redir >/dev/null") == 0 then ++ m = Map("shadowsocks-libev", translate("ShadowSocks-libev"), translate("ShadowSocks-libev is running")) ++else ++ m = Map("shadowsocks-libev", translate("ShadowSocks-libev"), translate("ShadowSocks-libev is not running")) ++end ++ ++e = { ++ "table", ++ "rc4", ++ "rc4-md5", ++ "aes-128-cfb", ++ "aes-192-cfb", ++ "aes-256-cfb", ++ "bf-cfb", ++ "camellia-128-cfb", ++ "camellia-192-cfb", ++ "camellia-256-cfb", ++ "cast5-cfb", ++ "des-cfb", ++ "idea-cfb", ++ "rc2-cfb", ++ "seed-cfb", ++ "salsa20", ++ "chacha20", ++} ++ ++-- Global Setting ++s = m:section(TypedSection, "shadowsocks-libev", translate("Global Setting")) ++s.anonymous = true ++ ++o = s:option(Flag, "enable", translate("Enable")) ++o.default = 1 ++o.rmempty = false ++ ++o = s:option(Value, "server", translate("Server Address")) ++o.datatype = "ipaddr" ++o.rmempty = false ++ ++o = s:option(Value, "server_port", translate("Server Port")) ++o.datatype = "port" ++o.rmempty = false ++ ++o = s:option(Value, "local_port", translate("Local Port")) ++o.datatype = "port" ++o.default = 1080 ++o.rmempty = false ++ ++o = s:option(Value, "timeout", translate("Connection Timeout")) ++o.datatype = "uinteger" ++o.default = 60 ++o.rmempty = false ++ ++o = s:option(Value, "password", translate("Password")) ++o.password = true ++o.rmempty = false ++ ++o = s:option(ListValue, "encrypt_method", translate("Encrypt Method")) ++for i,v in ipairs(e) do ++ o:value(v) ++end ++o.rmempty = false ++ ++o = s:option(Value, "ignore_list", translate("Ignore List")) ++o:value("/dev/null", translate("Disabled")) ++o.default = "/dev/null" ++o.rmempty = false ++ ++-- UDP Relay ++s = m:section(TypedSection, "shadowsocks-libev", translate("UDP Relay")) ++s.anonymous = true ++ ++o = s:option(ListValue, "udp_mode", translate("Relay Mode")) ++o:value("0", translate("Disabled")) ++o:value("1", translate("Enabled")) ++o:value("2", translate("Custom")) ++o.default = 0 ++o.rmempty = false ++ ++o = s:option(Value, "udp_server", translate("Server Address")) ++o.datatype = "ipaddr" ++o:depends("udp_mode", 2) ++ ++o = s:option(Value, "udp_server_port", translate("Server Port")) ++o.datatype = "port" ++o:depends("udp_mode", 2) ++ ++o = s:option(Value, "udp_local_port", translate("Local Port")) ++o.datatype = "port" ++o.default = 1081 ++o:depends("udp_mode", 2) ++ ++o = s:option(Value, "udp_timeout", translate("Connection Timeout")) ++o.datatype = "uinteger" ++o.default = 60 ++o:depends("udp_mode", 2) ++ ++o = s:option(Value, "udp_password", translate("Password")) ++o.password = true ++o:depends("udp_mode", 2) ++ ++o = s:option(ListValue, "udp_encrypt_method", translate("Encrypt Method")) ++for i,v in ipairs(e) do ++ o:value(v) ++end ++o:depends("udp_mode", 2) ++ ++-- UDP Forward ++s = m:section(TypedSection, "shadowsocks-libev", translate("UDP Forward")) ++s.anonymous = true ++ ++o = s:option(Flag, "tunnel_enable", translate("Enable")) ++o.default = 1 ++o.rmempty = false ++ ++o = s:option(Value, "tunnel_port", translate("UDP Local Port")) ++o.datatype = "port" ++o.default = 5300 ++ ++o = s:option(Value, "tunnel_forward", translate("Forwarding Tunnel")) ++o.default = "8.8.4.4:53" ++ ++-- Access Control ++s = m:section(TypedSection, "shadowsocks-libev", translate("Access Control")) ++s.anonymous = true ++ ++s:tab("lan_ac", translate("LAN")) ++ ++o = s:taboption("lan_ac", ListValue, "lan_ac_mode", translate("Access Control")) ++o:value("0", translate("Disabled")) ++o:value("1", translate("Allow listed only")) ++o:value("2", translate("Allow all except listed")) ++o.default = 0 ++o.rmempty = false ++ ++a = luci.sys.net.arptable() or {} ++ ++o = s:taboption("lan_ac", DynamicList, "lan_ac_ip", translate("LAN IP List")) ++o.datatype = "ipaddr" ++for i,v in ipairs(a) do ++ o:value(v["IP address"]) ++end ++ ++s:tab("wan_ac", translate("WAN")) ++ ++o = s:taboption("wan_ac", DynamicList, "wan_bp_ip", translate("Bypassed IP")) ++o.datatype = "ip4addr" ++ ++o = s:taboption("wan_ac", DynamicList, "wan_fw_ip", translate("Forwarded IP")) ++o.datatype = "ip4addr" ++ ++return m +diff --git a/feeds/luci/applications/luci-app-shadowsocks-libev/po/templates/shadowsocks-libev.pot b/feeds/luci/applications/luci-app-shadowsocks-libev/po/templates/shadowsocks-libev.pot +new file mode 100644 +index 0000000..c2bde96 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-shadowsocks-libev/po/templates/shadowsocks-libev.pot +@@ -0,0 +1,80 @@ ++msgid "" ++msgstr "Content-Type: text/plain; charset=UTF-8" ++ ++msgid "ShadowSocks-libev" ++msgstr "" ++ ++msgid "ShadowSocks-libev is running" ++msgstr "" ++ ++msgid "ShadowSocks-libev is not running" ++msgstr "" ++ ++msgid "Global Setting" ++msgstr "" ++ ++msgid "Enable" ++msgstr "" ++ ++msgid "Enabled" ++msgstr "" ++ ++msgid "Disabled" ++msgstr "" ++ ++msgid "Custom" ++msgstr "" ++ ++msgid "Server Address" ++msgstr "" ++ ++msgid "Server Port" ++msgstr "" ++ ++msgid "Local Port" ++msgstr "" ++ ++msgid "Connection Timeout" ++msgstr "" ++ ++msgid "Password" ++msgstr "" ++ ++msgid "Encrypt Method" ++msgstr "" ++ ++msgid "Ignore List" ++msgstr "" ++ ++msgid "UDP Relay" ++msgstr "" ++ ++msgid "Relay Mode" ++msgstr "" ++ ++msgid "UDP Forward" ++msgstr "" ++ ++msgid "UDP Local Port" ++msgstr "" ++ ++msgid "Forwarding Tunnel" ++msgstr "" ++ ++msgid "Access Control" ++msgstr "" ++ ++msgid "Allow listed only" ++msgstr "" ++ ++msgid "Allow all except listed" ++msgstr "" ++ ++msgid "LAN IP List" ++msgstr "" ++ ++msgid "Bypassed IP" ++msgstr "" ++ ++msgid "Forwarded IP" ++msgstr "" +diff --git a/feeds/luci/applications/luci-app-shadowsocks-libev/po/zh-cn/shadowsocks-libev.po b/feeds/luci/applications/luci-app-shadowsocks-libev/po/zh-cn/shadowsocks-libev.po +new file mode 100644 +index 0000000..90a0eff +--- /dev/null ++++ b/feeds/luci/applications/luci-app-shadowsocks-libev/po/zh-cn/shadowsocks-libev.po +@@ -0,0 +1,91 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Report-Msgid-Bugs-To: \n" ++"POT-Creation-Date: 2014-11-12 14:12+0800\n" ++"PO-Revision-Date: 2015-07-02 14:26+0800\n" ++"Last-Translator: Jian Chang \n" ++"Language: zh_CN\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=1; plural=0;\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "ShadowSocks-libev" ++msgstr "ShadowSocks-libev" ++ ++msgid "ShadowSocks-libev is running" ++msgstr "ShadowSocks-libev è¿è¡Œä¸­" ++ ++msgid "ShadowSocks-libev is not running" ++msgstr "ShadowSocks-libev 未è¿è¡Œ" ++ ++msgid "Global Setting" ++msgstr "全局设置" ++ ++msgid "Enable" ++msgstr "å¯ç”¨" ++ ++msgid "Enabled" ++msgstr "å·²å¯ç”¨" ++ ++msgid "Disabled" ++msgstr "å·²ç¦ç”¨" ++ ++msgid "Custom" ++msgstr "自定义" ++ ++msgid "Server Address" ++msgstr "æœåŠ¡å™¨åœ°å€" ++ ++msgid "Server Port" ++msgstr "æœåŠ¡å™¨ç«¯å£" ++ ++msgid "Local Port" ++msgstr "本地端å£" ++ ++msgid "Connection Timeout" ++msgstr "连接超时" ++ ++msgid "Password" ++msgstr "密ç " ++ ++msgid "Encrypt Method" ++msgstr "加密方å¼" ++ ++msgid "Ignore List" ++msgstr "忽略列表" ++ ++msgid "UDP Relay" ++msgstr "UDP中继" ++ ++msgid "Relay Mode" ++msgstr "中继模å¼" ++ ++msgid "UDP Forward" ++msgstr "UDP转å‘" ++ ++msgid "UDP Local Port" ++msgstr "UDP本地端å£" ++ ++msgid "Forwarding Tunnel" ++msgstr "UDP转å‘地å€" ++ ++msgid "Access Control" ++msgstr "访问控制" ++ ++msgid "Allow listed only" ++msgstr "ä»…å…许列表内" ++ ++msgid "Allow all except listed" ++msgstr "ä»…å…许列表外" ++ ++msgid "LAN IP List" ++msgstr "内网IP列表" ++ ++msgid "Bypassed IP" ++msgstr "被忽略的IP" ++ ++msgid "Forwarded IP" ++msgstr "走代ç†çš„IP" +diff --git a/feeds/luci/applications/luci-app-shadowsocks-libev/root/etc/uci-defaults/luci-shadowsocks-libev b/feeds/luci/applications/luci-app-shadowsocks-libev/root/etc/uci-defaults/luci-shadowsocks-libev +new file mode 100644 +index 0000000..6f30fa7 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-shadowsocks-libev/root/etc/uci-defaults/luci-shadowsocks-libev +@@ -0,0 +1,11 @@ ++#!/bin/sh ++ ++uci -q batch <<-EOF >/dev/null ++ delete ucitrack.@shadowsocks-libev[-1] ++ add ucitrack shadowsocks-libev ++ set ucitrack.@shadowsocks-libev[-1].init=shadowsocks-libev ++ commit ucitrack ++EOF ++ ++rm -f /tmp/luci-indexcache ++exit 0 +diff --git a/feeds/luci/applications/luci-app-shairplay/Makefile b/feeds/luci/applications/luci-app-shairplay/Makefile +new file mode 100644 +index 0000000..dcc0611 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-shairplay/Makefile +@@ -0,0 +1,14 @@ ++# ++# Copyright (C) 2008-2014 The LuCI Team ++# ++# This is free software, licensed under the Apache License, Version 2.0 . ++# ++ ++include $(TOPDIR)/rules.mk ++ ++LUCI_TITLE:=LuCI Support for Shairplay ++LUCI_DEPENDS:=+shairplay ++ ++include ../../luci.mk ++ ++# call BuildPackage - OpenWrt buildroot signature +diff --git a/feeds/luci/applications/luci-app-shairplay/luasrc/controller/shairplay.lua b/feeds/luci/applications/luci-app-shairplay/luasrc/controller/shairplay.lua +new file mode 100644 +index 0000000..d322301 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-shairplay/luasrc/controller/shairplay.lua +@@ -0,0 +1,14 @@ ++-- Copyright 2014 Ãlvaro Fernández Rojas ++-- Licensed to the public under the Apache License 2.0. ++ ++module("luci.controller.shairplay", package.seeall) ++ ++function index() ++ if not nixio.fs.access("/etc/config/shairplay") then ++ return ++ end ++ ++ local page = entry({"admin", "services", "shairplay"}, cbi("shairplay"), _("Shairplay")) ++ page.dependent = true ++ ++end +diff --git a/feeds/luci/applications/luci-app-shairplay/luasrc/model/cbi/shairplay.lua b/feeds/luci/applications/luci-app-shairplay/luasrc/model/cbi/shairplay.lua +new file mode 100644 +index 0000000..4e078d7 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-shairplay/luasrc/model/cbi/shairplay.lua +@@ -0,0 +1,65 @@ ++-- Copyright 2014 Ãlvaro Fernández Rojas ++-- Licensed to the public under the Apache License 2.0. ++ ++m = Map("shairplay", "Shairplay", translate("Shairplay is a simple AirPlay server implementation, here you can configure the settings.")) ++ ++s = m:section(TypedSection, "shairplay", "") ++s.addremove = true ++s.anonymous = false ++ ++enable=s:option(Flag, "disabled", translate("Enabled")) ++enable.enabled="0" ++enable.disabled="1" ++enable.default = "1" ++enable.rmempty = false ++respawn=s:option(Flag, "respawn", translate("Respawn")) ++respawn.default = false ++ ++apname = s:option(Value, "apname", translate("Airport Name")) ++apname.rmempty = true ++ ++port=s:option(Value, "port", translate("Port")) ++port.rmempty = true ++port.datatype = "port" ++ ++pw = s:option(Value, "password", translate("Password")) ++pw.rmempty = true ++pw.password = true ++ ++hwaddr=s:option(Value, "hwaddr", translate("HW Address")) ++hwaddr.rmempty = true ++hwaddr.datatype = "macaddr" ++ ++ao_driver=s:option(ListValue, "ao_driver", translate("AO Driver")) ++ao_driver:value("", translate("Default")) ++ao_driver:value("alsa") ++--ao_driver:value("alsa05") ++--ao_driver:value("arts") ++--ao_driver:value("esd") ++--ao_driver:value("irix") ++--ao_driver:value("nas") ++ao_driver:value("oss") ++--ao_driver:value("sun") ++ ++ao_devicename=s:option(Value, "ao_devicename", translate("AO Device Name")) ++ao_devicename.rmempty = true ++ ++ao_deviceid = s:option(ListValue, "ao_deviceid", translate("AO Device ID")) ++ao_deviceid.rmempty = true ++ao_deviceid:value("", translate("Default")) ++local pats = io.popen("find /proc/asound/ -type d -name 'card*' | sort") ++if pats then ++ local l ++ while true do ++ l = pats:read("*l") ++ if not l then break end ++ ++ l = string.gsub(l, "/proc/asound/card", "") ++ if l then ++ ao_deviceid:value(l) ++ end ++ end ++ pats:close() ++end ++ ++return m +diff --git a/feeds/luci/applications/luci-app-shairplay/root/etc/uci-defaults/luci-shairplay b/feeds/luci/applications/luci-app-shairplay/root/etc/uci-defaults/luci-shairplay +new file mode 100644 +index 0000000..efc8a89 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-shairplay/root/etc/uci-defaults/luci-shairplay +@@ -0,0 +1,12 @@ ++#!/bin/sh ++ ++# needed for "Save and Apply" to restart shairplay ++uci -q batch <<-EOF >/dev/null ++ delete ucitrack.@shairplay[-1] ++ add ucitrack shairplay ++ set ucitrack.@shairplay[-1].init="shairplay" ++ commit ucitrack ++EOF ++ ++rm -f /tmp/luci-indexcache ++exit 0 +diff --git a/feeds/luci/applications/luci-app-shairport/Makefile b/feeds/luci/applications/luci-app-shairport/Makefile +new file mode 100644 +index 0000000..f174ef4 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-shairport/Makefile +@@ -0,0 +1,14 @@ ++# ++# Copyright (C) 2008-2014 The LuCI Team ++# ++# This is free software, licensed under the Apache License, Version 2.0 . ++# ++ ++include $(TOPDIR)/rules.mk ++ ++LUCI_TITLE:=LuCI Support for Shairport ++LUCI_DEPENDS:=+shairport ++ ++include ../../luci.mk ++ ++# call BuildPackage - OpenWrt buildroot signature +diff --git a/feeds/luci/applications/luci-app-shairport/luasrc/controller/shairport.lua b/feeds/luci/applications/luci-app-shairport/luasrc/controller/shairport.lua +new file mode 100644 +index 0000000..b31b64e +--- /dev/null ++++ b/feeds/luci/applications/luci-app-shairport/luasrc/controller/shairport.lua +@@ -0,0 +1,14 @@ ++-- Copyright 2014 Ãlvaro Fernández Rojas ++-- Licensed to the public under the Apache License 2.0. ++ ++module("luci.controller.shairport", package.seeall) ++ ++function index() ++ if not nixio.fs.access("/etc/config/shairport") then ++ return ++ end ++ ++ local page = entry({"admin", "services", "shairport"}, cbi("shairport"), _("Shairport")) ++ page.dependent = true ++ ++end +diff --git a/feeds/luci/applications/luci-app-shairport/luasrc/model/cbi/shairport.lua b/feeds/luci/applications/luci-app-shairport/luasrc/model/cbi/shairport.lua +new file mode 100644 +index 0000000..d3c2a25 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-shairport/luasrc/model/cbi/shairport.lua +@@ -0,0 +1,161 @@ ++-- Copyright 2014 Ãlvaro Fernández Rojas ++-- Licensed to the public under the Apache License 2.0. ++ ++m = Map("shairport", "Shairport", translate("Shairport is a simple AirPlay server implementation, here you can configure the settings.")) ++ ++s = m:section(TypedSection, "shairport", "") ++s.addremove = true ++s.anonymous = false ++ ++enable=s:option(Flag, "disabled", translate("Enabled")) ++enable.enabled="0" ++enable.disabled="1" ++enable.default = "1" ++enable.rmempty = false ++respawn=s:option(Flag, "respawn", translate("Respawn")) ++respawn.default = false ++ ++bname = s:option(Value, "bname", translate("Airport Name")) ++bname.rmempty = true ++ ++pw = s:option(Value, "password", translate("Password")) ++pw.rmempty = true ++pw.password = true ++ ++port=s:option(Value, "port", translate("Port")) ++port.rmempty = true ++port.datatype = "port" ++ ++buffer=s:option(Value, "buffer", translate("Buffer fill")) ++buffer.rmempty = true ++buffer.datatype = "uinteger" ++ ++log_file=s:option(Value, "log_file", translate("Log file")) ++log_file.rmempty = true ++--log_file.datatype = "file" ++ ++err_file=s:option(Value, "err_file", translate("Error file")) ++err_file.rmempty = true ++--err_file.datatype = "file" ++ ++meta_dir=s:option(Value, "meta_dir", translate("Metadata directory")) ++meta_dir.rmempty = true ++meta_dir.datatype = "directory" ++ ++cmd_start=s:option(Value, "cmd_start", translate("Command when playback begins")) ++cmd_start.rmempty = true ++ ++cmd_stop=s:option(Value, "cmd_stop", translate("Command when playback ends")) ++cmd_stop.rmempty = true ++ ++cmd_wait=s:option(Flag, "cmd_wait", translate("Block while the commands run")) ++cmd_wait.default = false ++ ++mdns=s:option(ListValue, "mdns", translate("mDNS")) ++mdns.rmempty = true ++mdns:value("", translate("Default")) ++mdns:value("avahi") ++mdns:value("dns_sd") ++mdns:value("external_avahi") ++mdns:value("external_dns_sd") ++mdns:value("tinysvcmdns") ++ ++audio_output=s:option(ListValue, "audio_output", translate("Audio output")) ++audio_output.rmempty = true ++audio_output:value("", translate("Default")) ++audio_output:value("alsa") ++audio_output:value("ao") ++audio_output:value("dummy") ++audio_output:value("pulse") ++audio_output:value("pipe") ++ ++-- alsa output -- ++output_dev=s:option(Value, "output_dev", translate("Output device")) ++output_dev.rmempty = true ++output_dev:depends("audio_output", "alsa") ++ ++mixer_dev=s:option(Value, "mixer_dev", translate("Mixer device")) ++mixer_dev.rmempty = true ++mixer_dev:depends("audio_output", "alsa") ++ ++mixer_type=s:option(ListValue, "mixer_type", translate("Mixer type")) ++mixer_type.rmempty = true ++mixer_type:value("", translate("Default")) ++mixer_type:value("software") ++mixer_type:value("hardware") ++mixer_type:depends("audio_output", "alsa") ++ ++mixer_control=s:option(Value, "mixer_control", translate("Mixer control")) ++mixer_control.rmempty = true ++mixer_control:depends("audio_output", "alsa") ++ ++mixer_index = s:option(ListValue, "mixer_index", translate("Mixer index")) ++mixer_index.rmempty = true ++mixer_index:depends("audio_output", "alsa") ++mixer_index:value("", translate("Default")) ++local pats = io.popen("find /proc/asound/ -type d -name 'card*' | sort") ++if pats then ++ local l ++ while true do ++ l = pats:read("*l") ++ if not l then break end ++ ++ l = string.gsub(l, "/proc/asound/card", "") ++ if l then ++ mixer_index:value(l) ++ end ++ end ++ pats:close() ++end ++ ++-- ao output -- ++ao_driver=s:option(Value, "ao_driver", translate("AO driver")) ++ao_driver.rmempty = true ++ao_driver:depends("audio_output", "ao") ++ ++ao_name=s:option(Value, "ao_name", translate("AO name")) ++ao_name.rmempty = true ++ao_name:depends("audio_output", "ao") ++ ++ao_id = s:option(ListValue, "ao_id", translate("AO id")) ++ao_id.rmempty = true ++ao_id:depends("audio_output", "ao") ++ao_id:value("", translate("Default")) ++local pats = io.popen("find /proc/asound/ -type d -name 'card*' | sort") ++if pats then ++ local l ++ while true do ++ l = pats:read("*l") ++ if not l then break end ++ ++ l = string.gsub(l, "/proc/asound/card", "") ++ if l then ++ ao_id:value(l) ++ end ++ end ++ pats:close() ++end ++ ++ao_options=s:option(Value, "ao_options", translate("AO options")) ++ao_options.rmempty = true ++ao_options:depends("audio_output", "ao") ++ ++-- pipe output -- ++output_fifo=s:option(Value, "output_fifo", translate("Output FIFO")) ++output_fifo.rmempty = true ++output_fifo:depends("audio_output", "pipe") ++ ++-- pulse output -- ++pulse_server=s:option(Value, "pulse_server", translate("Pulse server")) ++pulse_server.rmempty = true ++pulse_server:depends("audio_output", "pulse") ++ ++pulse_sink=s:option(Value, "pulse_sink", translate("Pulse sink")) ++pulse_sink.rmempty = true ++pulse_sink:depends("audio_output", "pulse") ++ ++pulse_appname=s:option(Value, "pulse_appname", translate("Pulse application name")) ++pulse_appname.rmempty = true ++pulse_appname:depends("audio_output", "pulse") ++ ++return m +diff --git a/feeds/luci/applications/luci-app-shairport/root/etc/uci-defaults/luci-shairport b/feeds/luci/applications/luci-app-shairport/root/etc/uci-defaults/luci-shairport +new file mode 100644 +index 0000000..be9412b +--- /dev/null ++++ b/feeds/luci/applications/luci-app-shairport/root/etc/uci-defaults/luci-shairport +@@ -0,0 +1,12 @@ ++#!/bin/sh ++ ++# needed for "Save and Apply" to restart shairport ++uci -q batch <<-EOF >/dev/null ++ delete ucitrack.@shairport[-1] ++ add ucitrack shairport ++ set ucitrack.@shairport[-1].init="shairport" ++ commit ucitrack ++EOF ++ ++rm -f /tmp/luci-indexcache ++exit 0 +diff --git a/feeds/luci/applications/luci-app-siitwizard/Makefile b/feeds/luci/applications/luci-app-siitwizard/Makefile +new file mode 100644 +index 0000000..e8a8e55 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-siitwizard/Makefile +@@ -0,0 +1,14 @@ ++# ++# Copyright (C) 2008-2014 The LuCI Team ++# ++# This is free software, licensed under the Apache License, Version 2.0 . ++# ++ ++include $(TOPDIR)/rules.mk ++ ++LUCI_TITLE:=SIIT IPv4-over-IPv6 configuration wizard ++LUCI_DEPENDS:=+kmod-siit ++ ++include ../../luci.mk ++ ++# call BuildPackage - OpenWrt buildroot signature +diff --git a/feeds/luci/applications/luci-app-siitwizard/luasrc/controller/siitwizard.lua b/feeds/luci/applications/luci-app-siitwizard/luasrc/controller/siitwizard.lua +new file mode 100644 +index 0000000..4d1c140 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-siitwizard/luasrc/controller/siitwizard.lua +@@ -0,0 +1,9 @@ ++-- Copyright 2008 Steven Barth ++-- Copyright 2008 Jo-Philipp Wich ++-- Licensed to the public under the Apache License 2.0. ++ ++module "luci.controller.siitwizard" ++ ++function index() ++ entry({"admin", "network", "siitwizard"}, form("siitwizard"), "SIIT 4over6 assistent", 99) ++end +diff --git a/feeds/luci/applications/luci-app-siitwizard/luasrc/model/cbi/siitwizard.lua b/feeds/luci/applications/luci-app-siitwizard/luasrc/model/cbi/siitwizard.lua +new file mode 100644 +index 0000000..0d73832 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-siitwizard/luasrc/model/cbi/siitwizard.lua +@@ -0,0 +1,373 @@ ++-- Copyright 2008 Steven Barth ++-- Copyright 2008-2015 Jo-Philipp Wich ++-- Licensed to the public under the Apache License 2.0. ++ ++local uci = require "luci.model.uci".cursor() ++local bit = require "nixio".bit ++local ip = require "luci.ip" ++ ++-------------------- Init -------------------- ++ ++-- ++-- Find link-local address ++-- ++function find_ll() ++ local _, r ++ for _, r in ipairs(ip.routes({ family = 6, dest = "fe80::/64" })) do ++ if r.dest:higher("fe80:0:0:0:ff:fe00:0:0") then ++ return (r.dest - "fe80::") ++ end ++ end ++ return ip.IPv6("::") ++end ++ ++-- ++-- Determine defaults ++-- ++local ula_prefix = uci:get("siit", "ipv6", "ula_prefix") or "fd00::" ++local ula_global = uci:get("siit", "ipv6", "ula_global") or "00ca:ffee:babe::" -- = Freifunk ++local ula_subnet = uci:get("siit", "ipv6", "ula_subnet") or "0000:0000:0000:4223::" -- = Berlin ++local siit_prefix = uci:get("siit", "ipv6", "siit_prefix") or "::ffff:0000:0000" ++local ipv4_pool = uci:get("siit", "ipv4", "pool") or "172.16.0.0/12" ++local ipv4_netsz = uci:get("siit", "ipv4", "netsize") or "24" ++ ++-- ++-- Find IPv4 allocation pool ++-- ++local gv4_net = ip.IPv4(ipv4_pool) ++ ++-- ++-- Generate ULA ++-- ++local ula = ip.IPv6("::/64") ++ ++for _, prefix in ipairs({ ula_prefix, ula_global, ula_subnet }) do ++ ula = ula:add(ip.IPv6(prefix)) ++end ++ ++ula = ula:add(find_ll()) ++ ++ ++-------------------- View -------------------- ++f = SimpleForm("siitwizward", "SIIT-Wizzard", ++ "This wizzard helps to setup SIIT (IPv4-over-IPv6) translation according to RFC2765.") ++ ++f:field(DummyValue, "info_ula", "Mesh ULA address").value = ula:string() ++ ++f:field(DummyValue, "ipv4_pool", "IPv4 allocation pool").value = ++ "%s (%i hosts)" %{ gv4_net:string(), 2 ^ ( 32 - gv4_net:prefix() ) - 2 } ++ ++f:field(DummyValue, "ipv4_size", "IPv4 LAN network prefix").value = ++ "%i bit (%i hosts)" %{ ipv4_netsz, 2 ^ ( 32 - ipv4_netsz ) - 2 } ++ ++mode = f:field(ListValue, "mode", "Operation mode") ++mode:value("client", "Client") ++mode:value("gateway", "Gateway") ++ ++dev = f:field(ListValue, "device", "Wireless device") ++uci:foreach("wireless", "wifi-device", ++ function(section) ++ dev:value(section[".name"]) ++ end) ++ ++lanip = f:field(Value, "ipaddr", "LAN IPv4 subnet") ++function lanip.formvalue(self, section) ++ local val = self.map:formvalue(self:cbid(section)) ++ local net = ip.IPv4("%s/%i" %{ val, ipv4_netsz }) ++ ++ if net then ++ if gv4_net:contains(net) then ++ if not net:minhost():equal(net:host()) then ++ self.error = { [section] = true } ++ f.errmessage = "IPv4 address is not the first host of " .. ++ "subnet, expected " .. net:minhost():string() ++ end ++ else ++ self.error = { [section] = true } ++ f.errmessage = "IPv4 address is not within the allocation pool" ++ end ++ else ++ self.error = { [section] = true } ++ f.errmessage = "Invalid IPv4 address given" ++ end ++ ++ return val ++end ++ ++dns = f:field(Value, "dns", "DNS server for LAN clients") ++dns.value = "141.1.1.1" ++ ++-------------------- Control -------------------- ++function f.handle(self, state, data) ++ if state == FORM_VALID then ++ luci.http.redirect(luci.dispatcher.build_url("admin", "uci", "changes")) ++ return false ++ end ++ return true ++end ++ ++function mode.write(self, section, value) ++ ++ -- ++ -- Find LAN IPv4 range ++ -- ++ local lan_net = ip.IPv4( ++ ( lanip:formvalue(section) or "172.16.0.1" ) .. "/" .. ipv4_netsz ++ ) ++ ++ if not lan_net then return end ++ ++ -- ++ -- Find wifi interface, dns server and hostname ++ -- ++ local device = dev:formvalue(section) ++ local dns_server = dns:formvalue(section) or "141.1.1.1" ++ local hostname = "siit-" .. lan_net:host():string():gsub("%.","-") ++ ++ -- ++ -- Configure wifi device ++ -- ++ local wifi_device = dev:formvalue(section) ++ local wifi_essid = uci:get("siit", "wifi", "essid") or "6mesh.freifunk.net" ++ local wifi_bssid = uci:get("siit", "wifi", "bssid") or "02:ca:ff:ee:ba:be" ++ local wifi_channel = uci:get("siit", "wifi", "channel") or "1" ++ ++ -- nuke old device definition ++ uci:delete_all("wireless", "wifi-iface", ++ function(s) return s.device == wifi_device end ) ++ ++ uci:delete_all("network", "interface", ++ function(s) return s['.name'] == wifi_device end ) ++ ++ -- create wifi device definition ++ uci:tset("wireless", wifi_device, { ++ disabled = 0, ++ channel = wifi_channel, ++-- txantenna = 1, ++-- rxantenna = 1, ++-- diversity = 0 ++ }) ++ ++ uci:section("wireless", "wifi-iface", nil, { ++ encryption = "none", ++ mode = "adhoc", ++ txpower = 10, ++ sw_merge = 1, ++ network = wifi_device, ++ device = wifi_device, ++ ssid = wifi_essid, ++ bssid = wifi_bssid, ++ }) ++ ++ -- ++ -- Gateway mode ++ -- ++ -- * wan port is dhcp, lan port is 172.23.1.1/24 ++ -- * siit0 gets a dummy address: 169.254.42.42 ++ -- * wl0 gets an ipv6 address, in this case the fdca:ffee:babe::1:1/64 ++ -- * we do a ::ffff:ffff:0/96 route into siit0, so everything from 6mesh goes into translation. ++ -- * an HNA6 of ::ffff:ffff:0:0/96 announces the mapped 0.0.0.0/0 ipv4 space. ++ -- * MTU on WAN, LAN down to 1400, ipv6 headers are slighly larger. ++ ++ if value == "gateway" then ++ ++ -- wan mtu ++ uci:set("network", "wan", "mtu", 1240) ++ ++ -- lan settings ++ uci:tset("network", "lan", { ++ mtu = 1240, ++ ipaddr = lan_net:host():string(), ++ netmask = lan_net:mask():string(), ++ proto = "static" ++ }) ++ ++ -- use full siit subnet ++ siit_route = ip.IPv6(siit_prefix .. "/96") ++ ++ -- v4 <-> siit route ++ uci:delete_all("network", "route", ++ function(s) return s.interface == "siit0" end) ++ ++ uci:section("network", "route", nil, { ++ interface = "siit0", ++ target = gv4_net:network():string(), ++ netmask = gv4_net:mask():string() ++ }) ++ ++ -- ++ -- Client mode ++ -- ++ -- * 172.23.2.1/24 on its lan, fdca:ffee:babe::1:2 on wl0 and the usual dummy address on siit0. ++ -- * we do a ::ffff:ffff:172.13.2.0/120 to siit0, because in this case, only traffic directed to clients needs to go into translation. ++ -- * same route as HNA6 announcement to catch the traffic out of the mesh. ++ -- * Also, MTU on LAN reduced to 1400. ++ ++ else ++ ++ -- lan settings ++ uci:tset("network", "lan", { ++ mtu = 1240, ++ ipaddr = lan_net:host():string(), ++ netmask = lan_net:mask():string() ++ }) ++ ++ -- derive siit subnet from lan config ++ siit_route = ip.IPv6( ++ siit_prefix .. "/" .. (96 + lan_net:prefix()) ++ ):add(lan_net[2]) ++ ++ -- ipv4 <-> siit route ++ uci:delete_all("network", "route", ++ function(s) return s.interface == "siit0" end) ++ ++ -- XXX: kind of a catch all, gv4_net would be better ++ -- but does not cover non-local v4 space ++ uci:section("network", "route", nil, { ++ interface = "siit0", ++ target = "0.0.0.0", ++ netmask = "0.0.0.0" ++ }) ++ end ++ ++ -- setup the firewall ++ uci:delete_all("firewall", "zone", ++ function(s) return ( ++ s['.name'] == "siit0" or s.name == "siit0" or ++ s.network == "siit0" or s['.name'] == wifi_device or ++ s.name == wifi_device or s.network == wifi_device ++ ) end) ++ ++ uci:delete_all("firewall", "forwarding", ++ function(s) return ( ++ s.src == wifi_device and s.dest == "siit0" or ++ s.dest == wifi_device and s.src == "siit0" or ++ s.src == "lan" and s.dest == "siit0" or ++ s.dest == "lan" and s.src == "siit0" ++ ) end) ++ ++ uci:section("firewall", "zone", "siit0", { ++ name = "siit0", ++ network = "siit0", ++ input = "ACCEPT", ++ output = "ACCEPT", ++ forward = "ACCEPT" ++ }) ++ ++ uci:section("firewall", "zone", wifi_device, { ++ name = wifi_device, ++ network = wifi_device, ++ input = "ACCEPT", ++ output = "ACCEPT", ++ forward = "ACCEPT" ++ }) ++ ++ uci:section("firewall", "forwarding", nil, { ++ src = wifi_device, ++ dest = "siit0" ++ }) ++ ++ uci:section("firewall", "forwarding", nil, { ++ src = "siit0", ++ dest = wifi_device ++ }) ++ ++ uci:section("firewall", "forwarding", nil, { ++ src = "lan", ++ dest = "siit0" ++ }) ++ ++ uci:section("firewall", "forwarding", nil, { ++ src = "siit0", ++ dest = "lan" ++ }) ++ ++ -- firewall include ++ uci:delete_all("firewall", "include", ++ function(s) return s.path == "/etc/firewall.user" end) ++ ++ uci:section("firewall", "include", nil, { ++ path = "/etc/firewall.user" ++ }) ++ ++ ++ -- siit0 interface ++ uci:delete_all("network", "interface", ++ function(s) return ( s.ifname == "siit0" ) end) ++ ++ uci:section("network", "interface", "siit0", { ++ ifname = "siit0", ++ proto = "none" ++ }) ++ ++ -- siit0 route ++ uci:delete_all("network", "route6", ++ function(s) return siit_route:contains(ip.IPv6(s.target)) end) ++ ++ uci:section("network", "route6", nil, { ++ interface = "siit0", ++ target = siit_route:string() ++ }) ++ ++ -- create wifi network interface ++ uci:section("network", "interface", wifi_device, { ++ proto = "static", ++ mtu = 1400, ++ ip6addr = ula:string() ++ }) ++ ++ -- nuke old olsrd interfaces ++ uci:delete_all("olsrd", "Interface", ++ function(s) return s.interface == wifi_device end) ++ ++ -- configure olsrd interface ++ uci:foreach("olsrd", "olsrd", ++ function(s) uci:set("olsrd", s['.name'], "IpVersion", 6) end) ++ ++ uci:section("olsrd", "Interface", nil, { ++ ignore = 0, ++ interface = wifi_device, ++ Ip6AddrType = "unique-local" ++ }) ++ ++ -- hna6 ++ uci:delete_all("olsrd", "Hna6", ++ function(s) return true end) ++ ++ uci:section("olsrd", "Hna6", nil, { ++ netaddr = siit_route:host():string(), ++ prefix = siit_route:prefix() ++ }) ++ ++ -- txtinfo v6 & olsrd nameservice ++ uci:foreach("olsrd", "LoadPlugin", ++ function(s) ++ if s.library == "olsrd_txtinfo.so.0.1" then ++ uci:set("olsrd", s['.name'], "accept", "::1") ++ elseif s.library == "olsrd_nameservice.so.0.3" then ++ uci:set("olsrd", s['.name'], "name", hostname) ++ end ++ end) ++ ++ -- lan dns ++ uci:tset("dhcp", "lan", { ++ dhcp_option = "6," .. dns_server, ++ start = bit.band(lan_net:minhost():add(1)[2][2], 0xFF), ++ limit = ( 2 ^ ( 32 - lan_net:prefix() ) ) - 3 ++ }) ++ ++ -- hostname ++ uci:foreach("system", "system", ++ function(s) ++ uci:set("system", s['.name'], "hostname", hostname) ++ end) ++ ++ uci:save("wireless") ++ uci:save("firewall") ++ uci:save("network") ++ uci:save("system") ++ uci:save("olsrd") ++ uci:save("dhcp") ++end ++ ++return f +diff --git a/feeds/luci/applications/luci-app-siitwizard/root/etc/config/siit b/feeds/luci/applications/luci-app-siitwizard/root/etc/config/siit +new file mode 100644 +index 0000000..c594547 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-siitwizard/root/etc/config/siit +@@ -0,0 +1,14 @@ ++config siit ipv4 ++ option pool "77.87.52.0/22" ++ option netsize "29" ++ ++config siit ipv6 ++ option ula_prefix "fd00::" ++ option ula_global "00ca:ffee:babe::" ++ option ula_subnet "0000:0000:0000:dada::" ++ option siit_prefix "::ffff:0000:0000" ++ ++config siit wifi ++ option essid "6mesh.freifunk.net" ++ option bssid "02:25:c3:ca:ff:ee" ++ option channel "1" +diff --git a/feeds/luci/applications/luci-app-splash/Makefile b/feeds/luci/applications/luci-app-splash/Makefile +new file mode 100644 +index 0000000..345f891 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-splash/Makefile +@@ -0,0 +1,14 @@ ++# ++# Copyright (C) 2008-2014 The LuCI Team ++# ++# This is free software, licensed under the Apache License, Version 2.0 . ++# ++ ++include $(TOPDIR)/rules.mk ++ ++LUCI_TITLE:=Freifunk DHCP-Splash application ++LUCI_DEPENDS:=+luci-lib-nixio +tc +kmod-sched +iptables-mod-nat-extra +iptables-mod-ipopt ++ ++include ../../luci.mk ++ ++# call BuildPackage - OpenWrt buildroot signature +diff --git a/feeds/luci/applications/luci-app-splash/README b/feeds/luci/applications/luci-app-splash/README +new file mode 100644 +index 0000000..5a7af14 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-splash/README +@@ -0,0 +1,5 @@ ++ ++* IPv6 support is only partial: ++ - will only work when used together with IPv4 (Dual stack) ++ - No bandwidth limiting ++ +diff --git a/feeds/luci/applications/luci-app-splash/htdocs/cgi-bin/splash/splash.sh b/feeds/luci/applications/luci-app-splash/htdocs/cgi-bin/splash/splash.sh +new file mode 100755 +index 0000000..da8370d +--- /dev/null ++++ b/feeds/luci/applications/luci-app-splash/htdocs/cgi-bin/splash/splash.sh +@@ -0,0 +1,33 @@ ++#!/bin/sh ++ ++$(uci -q get luci_splash.general.redirect_url) || { ++ touch /var/state/luci_splash_locations ++ touch /etc/config/luci_splash_locations ++ MAC=$(grep "$REMOTE_HOST" /proc/net/arp | awk '{print $4}') ++ uci -P /var/state set luci_splash_locations.${MAC//:/}=redirect ++ uci -P /var/state set luci_splash_locations.${MAC//:/}.location="http://${HTTP_HOST}${REQUEST_URI}" ++} ++ ++echo -en "Cache-Control: no-cache, max-age=0, no-store, must-revalidate\r\n" ++echo -en "Pragma: no-cache\r\n" ++echo -en "Expires: -1\r\n" ++echo -en "Status: 307 Temporary Redirect\r\n" ++echo -en "Location: http://$SERVER_ADDR/cgi-bin/luci/splash\r\n" ++echo -en "\r\n" ++ ++cat < ++ ++ ++ 100 ++ 0 ++ 1.0 ++ 12 ++ $SERVER_ADDR ++ http://$SERVER_ADDR/cgi-bin/luci/splash?wispr=1 ++ http://$SERVER_ADDR/ ++ ++ ++EOT ++ ++ +diff --git a/feeds/luci/applications/luci-app-splash/htdocs/luci/splash/index.html b/feeds/luci/applications/luci-app-splash/htdocs/luci/splash/index.html +new file mode 100644 +index 0000000..486409a +--- /dev/null ++++ b/feeds/luci/applications/luci-app-splash/htdocs/luci/splash/index.html +@@ -0,0 +1,10 @@ ++ ++ ++ ++ ++ ++ ++ ++LuCI - Lua Configuration Interface ++ ++ +diff --git a/feeds/luci/applications/luci-app-splash/luasrc/controller/splash/splash.lua b/feeds/luci/applications/luci-app-splash/luasrc/controller/splash/splash.lua +new file mode 100644 +index 0000000..4add435 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-splash/luasrc/controller/splash/splash.lua +@@ -0,0 +1,163 @@ ++module("luci.controller.splash.splash", package.seeall) ++ ++local uci = luci.model.uci.cursor() ++local util = require "luci.util" ++ ++function index() ++ entry({"admin", "services", "splash"}, cbi("splash/splash"), _("Client-Splash"), 90) ++ entry({"admin", "services", "splash", "splashtext" }, form("splash/splashtext"), _("Splashtext"), 10) ++ ++ local e ++ ++ e = node("splash") ++ e.target = call("action_dispatch") ++ ++ node("splash", "activate").target = call("action_activate") ++ node("splash", "splash").target = template("splash_splash/splash") ++ node("splash", "blocked").target = template("splash/blocked") ++ ++ entry({"admin", "status", "splash"}, call("action_status_admin"), _("Client-Splash")) ++ ++ local page = node("splash", "publicstatus") ++ page.target = call("action_status_public") ++ page.leaf = true ++end ++ ++function ip_to_mac(ip) ++ local ipc = require "luci.ip" ++ local i, n ++ ++ for i, n in ipairs(ipc.neighbors()) do ++ if n.mac and n.dest and n.dest:equal(ip) then ++ return n.mac ++ end ++ end ++end ++ ++function action_dispatch() ++ local uci = luci.model.uci.cursor_state() ++ local mac = ip_to_mac(luci.http.getenv("REMOTE_ADDR")) or "" ++ local access = false ++ ++ uci:foreach("luci_splash", "lease", function(s) ++ if s.mac and s.mac:lower() == mac then access = true end ++ end) ++ ++ uci:foreach("luci_splash", "whitelist", function(s) ++ if s.mac and s.mac:lower() == mac then access = true end ++ end) ++ ++ if #mac > 0 and access then ++ luci.http.redirect(luci.dispatcher.build_url()) ++ else ++ luci.http.redirect(luci.dispatcher.build_url("splash", "splash")) ++ end ++end ++ ++function blacklist() ++ leased_macs = { } ++ uci:foreach("luci_splash", "blacklist", ++ function(s) leased_macs[s.mac:lower()] = true ++ end) ++ return leased_macs ++end ++ ++function action_activate() ++ local ipc = require "luci.ip" ++ local mac = ip_to_mac(luci.http.getenv("REMOTE_ADDR") or "127.0.0.1") or "" ++ local uci_state = require "luci.model.uci".cursor_state() ++ local blacklisted = false ++ if mac and luci.http.formvalue("accept") then ++ uci:foreach("luci_splash", "blacklist", ++ function(s) if s.mac and s.mac:lower() == mac then blacklisted = true end ++ end) ++ if blacklisted then ++ luci.http.redirect(luci.dispatcher.build_url("splash" ,"blocked")) ++ else ++ local redirect_url = uci:get("luci_splash", "general", "redirect_url") ++ if not redirect_url then ++ redirect_url = uci_state:get("luci_splash_locations", mac:gsub(':', ''):lower(), "location") ++ end ++ if not redirect_url then ++ redirect_url = luci.model.uci.cursor():get("freifunk", "community", "homepage") or 'http://www.freifunk.net' ++ end ++ remove_redirect(mac:gsub(':', ''):lower()) ++ os.execute("luci-splash lease "..mac.." >/dev/null 2>&1") ++ luci.http.redirect(redirect_url) ++ end ++ else ++ luci.http.redirect(luci.dispatcher.build_url()) ++ end ++end ++ ++function action_status_admin() ++ local uci = luci.model.uci.cursor_state() ++ local macs = luci.http.formvaluetable("save") ++ ++ local changes = { ++ whitelist = { }, ++ blacklist = { }, ++ lease = { }, ++ remove = { } ++ } ++ ++ for key, _ in pairs(macs) do ++ local policy = luci.http.formvalue("policy.%s" % key) ++ local mac = luci.http.protocol.urldecode(key) ++ ++ if policy == "whitelist" or policy == "blacklist" then ++ changes[policy][#changes[policy]+1] = mac ++ elseif policy == "normal" then ++ changes["lease"][#changes["lease"]+1] = mac ++ elseif policy == "kicked" then ++ changes["remove"][#changes["remove"]+1] = mac ++ end ++ end ++ ++ if #changes.whitelist > 0 then ++ os.execute("luci-splash whitelist %s >/dev/null" ++ % table.concat(changes.whitelist)) ++ end ++ ++ if #changes.blacklist > 0 then ++ os.execute("luci-splash blacklist %s >/dev/null" ++ % table.concat(changes.blacklist)) ++ end ++ ++ if #changes.lease > 0 then ++ os.execute("luci-splash lease %s >/dev/null" ++ % table.concat(changes.lease)) ++ end ++ ++ if #changes.remove > 0 then ++ os.execute("luci-splash remove %s >/dev/null" ++ % table.concat(changes.remove)) ++ end ++ ++ luci.template.render("admin_status/splash", { is_admin = true }) ++end ++ ++function action_status_public() ++ luci.template.render("admin_status/splash", { is_admin = false }) ++end ++ ++function remove_redirect(mac) ++ local mac = mac:lower() ++ mac = mac:gsub(":", "") ++ local uci = require "luci.model.uci".cursor_state() ++ local redirects = uci:get_all("luci_splash_locations") ++ --uci:load("luci_splash_locations") ++ uci:revert("luci_splash_locations") ++ -- For all redirects ++ for k, v in pairs(redirects) do ++ if v[".type"] == "redirect" then ++ if v[".name"] ~= mac then ++ -- Rewrite state ++ uci:section("luci_splash_locations", "redirect", v[".name"], { ++ location = v.location ++ }) ++ end ++ end ++ end ++ uci:save("luci_splash_redirects") ++end +diff --git a/feeds/luci/applications/luci-app-splash/luasrc/model/cbi/splash/splash.lua b/feeds/luci/applications/luci-app-splash/luasrc/model/cbi/splash/splash.lua +new file mode 100644 +index 0000000..c09d2e0 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-splash/luasrc/model/cbi/splash/splash.lua +@@ -0,0 +1,79 @@ ++-- Licensed to the public under the Apache License 2.0. ++ ++require("luci.model.uci") ++ ++m = Map("luci_splash", translate("Client-Splash"), translate("Client-Splash is a hotspot authentification system for wireless mesh networks.")) ++ ++s = m:section(NamedSection, "general", "core", translate("General")) ++s.addremove = false ++ ++s:option(Value, "leasetime", translate("Clearance time"), translate("Clients that have accepted the splash are allowed to use the network for that many hours.")) ++local redir = s:option(Value, "redirect_url", translate("Redirect target"), translate("Clients are redirected to this page after they have accepted the splash. If this is left empty they are redirected to the page they had requested.")) ++redir.rmempty = true ++ ++s:option(Value, "limit_up", translate("Upload limit"), translate("Clients upload speed is limited to this value (kbyte/s)")) ++s:option(Value, "limit_down", translate("Download limit"), translate("Clients download speed is limited to this value (kbyte/s)")) ++ ++s:option(DummyValue, "_tmp", "", ++ translate("Bandwidth limit for clients is only activated when both up- and download limit are set. " .. ++ "Use a value of 0 here to completely disable this limitation. Whitelisted clients are not limited.")) ++ ++s = m:section(TypedSection, "iface", translate("Interfaces"), translate("Interfaces that are used for Splash.")) ++ ++s.template = "cbi/tblsection" ++s.addremove = true ++s.anonymous = true ++ ++local uci = luci.model.uci.cursor() ++ ++zone = s:option(ListValue, "zone", translate("Firewall zone"), ++ translate("Splash rules are integrated in this firewall zone")) ++ ++uci:foreach("firewall", "zone", ++ function (section) ++ zone:value(section.name) ++ end) ++ ++iface = s:option(ListValue, "network", translate("Network"), ++ translate("Intercept client traffic on this Interface")) ++ ++uci:foreach("network", "interface", ++ function (section) ++ if section[".name"] ~= "loopback" then ++ iface:value(section[".name"]) ++ end ++ end) ++ ++uci:foreach("network", "alias", ++ function (section) ++ iface:value(section[".name"]) ++ end) ++ ++ ++s = m:section(TypedSection, "whitelist", translate("Whitelist"), ++ translate("MAC addresses of whitelisted clients. These do not need to accept the splash and are not bandwidth limited.")) ++ ++s.template = "cbi/tblsection" ++s.addremove = true ++s.anonymous = true ++s:option(Value, "mac", translate ("MAC Address")) ++ ++ ++s = m:section(TypedSection, "blacklist", translate("Blacklist"), ++ translate("MAC addresses in this list are blocked.")) ++ ++s.template = "cbi/tblsection" ++s.addremove = true ++s.anonymous = true ++s:option(Value, "mac", translate ("MAC Address")) ++ ++s = m:section(TypedSection, "subnet", translate("Allowed hosts/subnets"), ++ translate("Destination hosts and networks that are excluded from splashing, i.e. they are always allowed.")) ++ ++s.template = "cbi/tblsection" ++s.addremove = true ++s.anonymous = true ++s:option(Value, "ipaddr", translate("IP Address")) ++s:option(Value, "netmask", translate("Netmask"), translate("optional when using host addresses")).rmempty = true ++ ++return m +diff --git a/feeds/luci/applications/luci-app-splash/luasrc/model/cbi/splash/splashtext.lua b/feeds/luci/applications/luci-app-splash/luasrc/model/cbi/splash/splashtext.lua +new file mode 100644 +index 0000000..8ceffc8 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-splash/luasrc/model/cbi/splash/splashtext.lua +@@ -0,0 +1,57 @@ ++-- Copyright 2008 Steven Barth ++-- Copyright 2008 Jo-Philipp Wich ++-- Copyright 2010 Manuel Munz ++-- Licensed to the public under the Apache License 2.0. ++ ++local fs = require "nixio.fs" ++ ++local splashtextfile = "/usr/lib/luci-splash/splashtext.html" ++local splashtextinclude = "/usr/lib/luci-splash/splashtextinclude.html" ++ ++ ++f = SimpleForm("splashtext", translate("Edit the complete splash text"), ++ translate("You can enter your own text that is displayed to clients here.
    " .. ++ "It is possible to use the following markers: " .. ++ "###COMMUNITY###, ###COMMUNITY_URL###, ###CONTACTURL###, ###LEASETIME###, ###LIMIT### and ###ACCEPT###.")) ++ ++t = f:field(TextValue, "text") ++t.rmempty = true ++t.rows = 30 ++function t.cfgvalue() ++ return fs.readfile(splashtextfile) or "" ++end ++ ++function f.handle(self, state, data) ++ if state == FORM_VALID then ++ if data.text then ++ fs.writefile(splashtextfile, data.text:gsub("\r\n", "\n")) ++ else ++ fs.unlink(splashtextfile) ++ end ++ end ++ return true ++end ++ ++g = SimpleForm("splashtextinclude", translate("Include your own text in the default splash"), ++ translate("As an alternative to editing the complete splash text you can also just include some custom text in the default splash page by entering it here.")) ++ ++t = g:field(TextValue, "text") ++t.rmempty = true ++t.rows = 30 ++function t.cfgvalue() ++ return fs.readfile(splashtextinclude) or "" ++end ++ ++function g.handle(self, state, data) ++ if state == FORM_VALID then ++ if data.text then ++ fs.writefile(splashtextinclude, data.text:gsub("\r\n", "\n")) ++ else ++ fs.unlink(splashtextinclude) ++ end ++ end ++ return true ++end ++ ++ ++return f, g +diff --git a/feeds/luci/applications/luci-app-splash/luasrc/view/admin_status/splash.htm b/feeds/luci/applications/luci-app-splash/luasrc/view/admin_status/splash.htm +new file mode 100644 +index 0000000..831fa75 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-splash/luasrc/view/admin_status/splash.htm +@@ -0,0 +1,288 @@ ++<%# ++ Copyright 2009 Jo-Philipp Wich ++ Licensed to the public under the Apache License 2.0. ++-%> ++ ++<%- ++ ++local utl = require "luci.util" ++local ipt = require "luci.sys.iptparser".IptParser() ++local uci = require "luci.model.uci".cursor_state() ++local wat = require "luci.tools.webadmin" ++local ipc = require "luci.ip" ++local fs = require "nixio.fs" ++ ++local clients = { } ++local leasetime = tonumber(uci:get("luci_splash", "general", "leasetime") or 1) * 60 * 60 ++local leasefile = "/tmp/dhcp.leases" ++ ++uci:foreach("dhcp", "dnsmasq", ++ function(s) ++ if s.leasefile then leasefile = s.leasefile end ++ end) ++ ++ ++uci:foreach("luci_splash_leases", "lease", ++ function(s) ++ if s.start and s.mac then ++ clients[s.mac:lower()] = { ++ start = tonumber(s.start), ++ limit = ( tonumber(s.start) + leasetime ), ++ mac = s.mac:upper(), ++ ipaddr = s.ipaddr, ++ policy = "normal", ++ packets = 0, ++ bytes = 0, ++ } ++ end ++ end) ++ ++for _, r in ipairs(ipt:find({table="nat", chain="luci_splash_leases"})) do ++ if r.options and #r.options >= 2 and r.options[1] == "MAC" then ++ if not clients[r.options[2]:lower()] then ++ clients[r.options[2]:lower()] = { ++ start = 0, ++ limit = 0, ++ mac = r.options[2]:upper(), ++ policy = ( r.target == "RETURN" ) and "whitelist" or "blacklist", ++ packets = 0, ++ bytes = 0 ++ } ++ end ++ end ++end ++ ++for mac, client in pairs(clients) do ++ client.bytes_in = 0 ++ client.bytes_out = 0 ++ client.packets_in = 0 ++ client.packets_out = 0 ++ ++ if client.ipaddr then ++ local rin = ipt:find({table="mangle", chain="luci_splash_mark_in", destination=client.ipaddr}) ++ local rout = ipt:find({table="mangle", chain="luci_splash_mark_out", options={"MAC", client.mac:upper()}}) ++ ++ if rin and #rin > 0 then ++ client.bytes_in = rin[1].bytes ++ client.packets_in = rin[1].packets ++ end ++ ++ if rout and #rout > 0 then ++ client.bytes_out = rout[1].bytes ++ client.packets_out = rout[1].packets ++ end ++ end ++end ++ ++uci:foreach("luci_splash", "whitelist", ++ function(s) ++ if s.mac and clients[s.mac:lower()] then ++ clients[s.mac:lower()].policy="whitelist" ++ end ++ end) ++ ++uci:foreach("luci_splash", "blacklist", ++ function(s) ++ if s.mac and clients[s.mac:lower()] then ++ clients[s.mac:lower()].policy=(s.kicked and "kicked" or "blacklist") ++ end ++ end) ++ ++if fs.access(leasefile) then ++ for l in io.lines(leasefile) do ++ local time, mac, ip, name = l:match("^(%d+) (%S+) (%S+) (%S+)") ++ if time and mac and ip then ++ local c = clients[mac:lower()] ++ if c then ++ c.ip = ip ++ c.hostname = ( name ~= "*" ) and name or nil ++ end ++ end ++ end ++end ++ ++for i, n in ipairs(ipc.neighbors({ family = 4 })) do ++ if n.mac and n.dest then ++ local c = clients[n.mac] ++ if c and not c.ip then ++ c.ip = n.dest:string() ++ end ++ end ++end ++ ++local function showmac(mac) ++ if not is_admin then ++ mac = mac:gsub("(%S%S:%S%S):%S%S:%S%S:(%S%S:%S%S)", "%1:XX:XX:%2") ++ end ++ return mac ++end ++ ++if luci.http.formvalue("status") == "1" then ++ local rv = {} ++ for _, c in utl.spairs(clients, ++ function(a,b) if clients[a].policy == clients[b].policy then ++ return (clients[a].start > clients[b].start) ++ else ++ return (clients[a].policy > clients[b].policy) ++ end ++ end) ++ do ++ if c.ip then ++ rv[#rv+1] = { ++ hostname = c.hostname or "?", ++ ip = c.ip or "?", ++ mac = showmac(c.mac) or "?", ++ timeleft = (c.limit >= os.time()) and wat.date_format(c.limit-os.time()) or (c.policy ~= "normal") and "-" or "expired", ++ trafficin = wat.byte_format(c.bytes_in) or "?", ++ trafficout = wat.byte_format(c.bytes_out) or "?", ++ policy = c.policy or "?" ++ } ++ end ++ end ++ luci.http.prepare_content("application/json") ++ luci.http.write_json(rv) ++ return ++end ++-%> ++ ++ ++ ++<%+header%> ++ ++ ++ ++ ++ ++
    ++

    <%:Client-Splash%>

    ++
    ++ <%:Active Clients%> ++
    ++ <% if is_admin then %>
    <% end %> ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ <%- ++ local count = 0 ++ for _, c in utl.spairs(clients, ++ function(a,b) ++ if clients[a].policy == clients[b].policy then ++ return (clients[a].start > clients[b].start) ++ else ++ return (clients[a].policy > clients[b].policy) ++ end ++ end) ++ do ++ if c.ip then ++ count = count + 1 ++ -%> ++ ++ ++ ++ ++ ++ ++ ++ ++ <%- ++ end ++ end ++ if count == 0 then ++ -%> ++ ++ ++ ++ <%- end -%> ++ ++
    <%:Hostname%><%:IP Address%><%:MAC Address%><%:Time remaining%><%:Traffic in/out%><%:Policy%>
    <%=c.hostname or "" .. translate("unknown") .. ""%><%=c.ip or "" .. translate("unknown") .. ""%><%=showmac(c.mac)%><%= ++ (c.limit >= os.time()) and wat.date_format(c.limit-os.time()) or ++ (c.policy ~= "normal") and "-" or "" .. translate("expired") .. "" ++ %><%=wat.byte_format(c.bytes_in)%> / <%=wat.byte_format(c.bytes_out)%> ++ <% if is_admin then %> ++ ++ ++ <% else %> ++ <%=c.policy%> ++ <% end %> ++
    ++
    <%:No clients connected%>
    ++
    ++ <% if is_admin then %>
    <% end %> ++
    ++
    ++
    ++ ++<%+footer%> +diff --git a/feeds/luci/applications/luci-app-splash/luasrc/view/splash/blocked.htm b/feeds/luci/applications/luci-app-splash/luasrc/view/splash/blocked.htm +new file mode 100644 +index 0000000..406139b +--- /dev/null ++++ b/feeds/luci/applications/luci-app-splash/luasrc/view/splash/blocked.htm +@@ -0,0 +1,20 @@ ++<%# ++ Copyright 2011 Manuel Munz ++ Licensed to the public under the Apache License 2.0. ++-%> ++ ++<% ++local contacturl = luci.dispatcher.build_url("freifunk", "contact") ++%> ++ ++<%+header%> ++ ++

    <%:Blocked%>

    ++ ++

    <%:Your access to this network has been blocked, most likely because you did something that our rules explicitly forbid.%>

    ++

    <%:To ask for the reason why you have been blocked or ask for access again you can try to contact the owner of this access point:%> <%:Contact%>

    ++ ++<%+footer%> ++ ++ ++ +diff --git a/feeds/luci/applications/luci-app-splash/luasrc/view/splash/splash.htm b/feeds/luci/applications/luci-app-splash/luasrc/view/splash/splash.htm +new file mode 100644 +index 0000000..7626b60 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-splash/luasrc/view/splash/splash.htm +@@ -0,0 +1,134 @@ ++<%# ++ Copyright 2008 Steven Barth ++ Copyright 2008 Jo-Philipp Wich ++ Copyright 2011 Manuel Munz ++ Licensed to the public under the Apache License 2.0. ++-%> ++ ++<% ++local fs = require "nixio.fs" ++local has_custom_splash = fs.access("/usr/lib/luci-splash/splashtext.html") ++local has_custom_splashinclude = fs.access("/usr/lib/luci-splash/splashtextinclude.html") ++ ++function expand (e, R) ++ return (string.gsub(e, "###([A-Z_]+)###", R)) ++end ++ ++local community, homepage, leasetime, limit_up, limit_down ++ ++local contacturl = luci.dispatcher.build_url("freifunk", "contact") ++ ++local c = luci.model.uci.cursor():get_all("freifunk", "community") ++if c and c.name then ++ name = luci.model.uci.cursor():get('profile_' .. c.name, 'profile', 'name') ++ if name then ++ community = name ++ else ++ community = c.name ++ end ++else ++ community = "Freifunk" ++end ++ ++if c and c.homepage then ++ homepage = c.homepage ++else ++ homepage = "http://freifunk.net" ++end ++ ++local s = luci.model.uci.cursor():get_all("luci_splash", "general") ++if s then ++ leasetime = s.leasetime or "" ++ limit_up = s.limit_up or nil ++ limit_down = s.limit_down or nil ++end ++ ++local limit_text = "" ++if limit_up and limit_down then ++ limit_text = "

    " .. translate("Your bandwidth is limited to") .. " " .. limit_down .. "/" .. limit_up .. ++ " " .. translate("KB/s (Download/Upload). You may be able to remove this limit by actively contributing " .. ++ "to this project.") .. "

    " ++end ++ ++local contact = translate('Get in %s with the operator of this access point.') ++contact = contact % ('' .. translatef('Contact') .. '') ++ ++local accepttext = translate('By accepting these rules you can use this network for %s hour(s). After this time you need to accept these rules again.') ++accepttext = accepttext % leasetime ++ ++ ++if has_custom_splash then ++ local R = { ++ COMMUNITY = community, ++ COMMUNITY_URL = homepage, ++ LEASETIME = leasetime, ++ ACCEPT = tostring(translate("Accept")), ++ LIMIT = limit_text, ++ CONTACTURL = contacturl ++ } ++ local splashtext = expand(fs.readfile("/usr/lib/luci-splash/splashtext.html"), R) ++ %> ++ <%=splashtext%> ++ ++<% else %> ++ ++

    <%:Welcome%>

    ++ ++

    <%:You are now connected to the free wireless mesh network%> <%=community%>. ++ <%:Please note that we are not an internet service provider but an experimental community network.%>

    ++

    <%:Access to the internet might be possible nevertheless, because some activists of this project share their ++ private internet connections. These few connections are shared between all users. That means available bandwidth ++ is limited and because of this we ask you not to do any of the following:%>

    ++
      ++
    • <%:use filesharing applications on this network%>
    • ++
    • <%:waste bandwidth with unneccesary downloads or streams%>
    • ++
    • <%:perform any kind of illegal activities%>
    • ++
    ++
    ++ ++ <% if limit_up and limit_down then %> ++ <%=limit_text%> ++ <% end %> ++ ++

    <%:If you use this network on a regular basis we ask for your support:%>

    ++ ++ ++ <% ++ if has_custom_splashinclude then ++ local splashtextinclude = fs.readfile("/usr/lib/luci-splash/splashtextinclude.html") ++ %> ++ <%=splashtextinclude%> ++ <% end %> ++ ++

    <%:Usage Agreement%>

    ++

    ++ <%:The open and free wireless network of volunteers ("Operators") provides the necessary equipment and Internet connections ("Infrastructure") at their own expense.%> ++ <%:These Terms of Use govern the use of the network by its participants' computer, PDA, or similar device ("Devices") within the network.%> ++ <%:Access to the network is not guaranteed. It can be interrupted at any time without notice for any reason, for certain devices, and/or may be blocked for certain users.%> ++

    ++ ++

    <%:Legally Prohibited Activities%>

    ++

    <%:The participant agrees to not perform any action and refrain from acts which may violate the law or infringe upon the rights of third parties.%>

    ++ ++

    <%:Legally Prohibited content%>

    ++

    <%:The participant agrees to not transfer content over the network which violates the law.%>

    ++ ++

    <%:Fair Use Policy%>

    ++

    <%:The participant agrees to not use the network in any way which will harm the infrastructure, the network itself, its operators or other participants.%>

    ++ ++

    <%:Safety%>

    ++

    <%:The network, like the Internet, is unencrypted and open. Each participant is responsible for the safety of their own connections and devices.%>

    ++ ++

    Disclaimer

    ++

    <%:The operator claims no liability for loss of data, unauthorized access/damage to devices, or financial losses that participants may suffer from the use of the network.%>

    ++ ++

    <%=accepttext%>

    ++<% end %> ++ ++ ++ +diff --git a/feeds/luci/applications/luci-app-splash/luasrc/view/splash_splash/index.htm b/feeds/luci/applications/luci-app-splash/luasrc/view/splash_splash/index.htm +new file mode 100644 +index 0000000..cbf37d5 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-splash/luasrc/view/splash_splash/index.htm +@@ -0,0 +1,8 @@ ++<%# ++ Copyright 2008 Steven Barth ++ Copyright 2008 Jo-Philipp Wich ++ Licensed to the public under the Apache License 2.0. ++-%> ++ ++<%+header%> ++<%+footer%> +\ No newline at end of file +diff --git a/feeds/luci/applications/luci-app-splash/luasrc/view/splash_splash/splash.htm b/feeds/luci/applications/luci-app-splash/luasrc/view/splash_splash/splash.htm +new file mode 100644 +index 0000000..c63ad0f +--- /dev/null ++++ b/feeds/luci/applications/luci-app-splash/luasrc/view/splash_splash/splash.htm +@@ -0,0 +1,17 @@ ++<%# ++ Copyright 2008 Steven Barth ++ Copyright 2008 Jo-Philipp Wich ++ Licensed to the public under the Apache License 2.0. ++-%> ++ ++<%+header%> ++<%+splash/splash%> ++ ++
    ++

    ++ ++ ++

    ++
    ++ ++<%+footer%> +diff --git a/feeds/luci/applications/luci-app-splash/po/ca/splash.po b/feeds/luci/applications/luci-app-splash/po/ca/splash.po +new file mode 100644 +index 0000000..3afef1a +--- /dev/null ++++ b/feeds/luci/applications/luci-app-splash/po/ca/splash.po +@@ -0,0 +1,330 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Report-Msgid-Bugs-To: \n" ++"POT-Creation-Date: 2014-06-01 23:10+0200\n" ++"PO-Revision-Date: 2014-07-02 21:20+0200\n" ++"Last-Translator: Alex \n" ++"Language-Team: LANGUAGE \n" ++"Language: ca\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n != 1);\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "Accept" ++msgstr "Accepta" ++ ++msgid "" ++"Access to the internet might be possible nevertheless, because some " ++"activists of this project share their private internet connections. These " ++"few connections are shared between all users. That means available bandwidth " ++"is limited and because of this we ask you not to do any of the following:" ++msgstr "" ++ ++msgid "" ++"Access to the network is not guaranteed. It can be interrupted at any time " ++"without notice for any reason, for certain devices, and/or may be blocked " ++"for certain users." ++msgstr "" ++"Accés a la xarxa no està garantit. Pot ser interromput en qualsevol moment " ++"sense notificació per qualsevol motiu, en certs dispositius, i pot ser " ++"bloquejat a certs usuaris." ++ ++msgid "Active Clients" ++msgstr "Clients actius" ++ ++msgid "Allowed hosts/subnets" ++msgstr "Hosts/subxarxes permets" ++ ++msgid "" ++"As an alternative to editing the complete splash text you can also just " ++"include some custom text in the default splash page by entering it here." ++msgstr "" ++ ++msgid "" ++"Bandwidth limit for clients is only activated when both up- and download " ++"limit are set. Use a value of 0 here to completely disable this limitation. " ++"Whitelisted clients are not limited." ++msgstr "" ++ ++msgid "" ++"Become an active member of this community and help by operating your own node" ++msgstr "" ++ ++msgid "Blacklist" ++msgstr "Llista negra" ++ ++msgid "Blocked" ++msgstr "Bloquejat" ++ ++msgid "" ++"By accepting these rules you can use this network for %s hour(s). After this " ++"time you need to accept these rules again." ++msgstr "" ++ ++msgid "Clearance time" ++msgstr "" ++ ++msgid "Client-Splash" ++msgstr "" ++ ++msgid "" ++"Client-Splash is a hotspot authentification system for wireless mesh " ++"networks." ++msgstr "" ++ ++msgid "" ++"Clients are redirected to this page after they have accepted the splash. If " ++"this is left empty they are redirected to the page they had requested." ++msgstr "" ++ ++msgid "Clients download speed is limited to this value (kbyte/s)" ++msgstr "" ++ ++msgid "" ++"Clients that have accepted the splash are allowed to use the network for " ++"that many hours." ++msgstr "" ++ ++msgid "Clients upload speed is limited to this value (kbyte/s)" ++msgstr "" ++ ++msgid "Contact" ++msgstr "" ++ ++msgid "Decline" ++msgstr "Declina" ++ ++msgid "" ++"Destination hosts and networks that are excluded from splashing, i.e. they " ++"are always allowed." ++msgstr "" ++ ++msgid "Donate some money to help us keep this project alive." ++msgstr "Dona una mica de diners per a ajudar-nos a mantenir aquest project viu." ++ ++msgid "Download limit" ++msgstr "Límit de baixada" ++ ++msgid "Edit the complete splash text" ++msgstr "" ++ ++msgid "Fair Use Policy" ++msgstr "Política d'ús just" ++ ++msgid "Firewall zone" ++msgstr "Zona de tallafocs" ++ ++msgid "General" ++msgstr "General" ++ ++msgid "Get in %s with the operator of this access point." ++msgstr "" ++ ++msgid "Hostname" ++msgstr "Nom de host" ++ ++msgid "IP Address" ++msgstr "Adreça IP" ++ ++msgid "" ++"If you operate your own wifi equipment use channels different from ours." ++msgstr "" ++"Si opereu el vostre propi equip WiFi, utilitzeu canals distints dels " ++"nostres." ++ ++msgid "If you use this network on a regular basis we ask for your support:" ++msgstr "Si utilitzeu aquesta xarxa regularment, us demanem el vostre suport:" ++ ++msgid "Include your own text in the default splash" ++msgstr "" ++ ++msgid "Intercept client traffic on this Interface" ++msgstr "Intercepta trànsit de clients en aquesta interfície" ++ ++msgid "Interfaces" ++msgstr "Interfícies" ++ ++msgid "Interfaces that are used for Splash." ++msgstr "interfícies que s'utilitzen pel Splash." ++ ++msgid "" ++"KB/s (Download/Upload). You may be able to remove this limit by actively " ++"contributing to this project." ++msgstr "" ++ ++msgid "Legally Prohibited Activities" ++msgstr "Activitats legalment prohibits" ++ ++msgid "Legally Prohibited content" ++msgstr "Contingut legalment prohibit" ++ ++msgid "MAC Address" ++msgstr "Adreça MAC" ++ ++msgid "MAC addresses in this list are blocked." ++msgstr "Les adreces MAC en aquesta llista estan bloquejades." ++ ++msgid "" ++"MAC addresses of whitelisted clients. These do not need to accept the splash " ++"and are not bandwidth limited." ++msgstr "" ++ ++msgid "Netmask" ++msgstr "Màscara de xarxa" ++ ++msgid "Network" ++msgstr "Xarxa" ++ ++msgid "No clients connected" ++msgstr "Cap client connectat" ++ ++msgid "" ++"Please note that we are not an internet service provider but an experimental " ++"community network." ++msgstr "" ++"Si us plau, noteu que no som proveïdor de servei de Internet sinó una xarxa " ++"comunitària experimental." ++ ++msgid "Policy" ++msgstr "Política" ++ ++msgid "Redirect target" ++msgstr "" ++ ++msgid "Safety" ++msgstr "Seguretat" ++ ++msgid "Save" ++msgstr "Desa" ++ ++msgid "Splash rules are integrated in this firewall zone" ++msgstr "" ++ ++msgid "Splashtext" ++msgstr "" ++ ++msgid "" ++"The network, like the Internet, is unencrypted and open. Each participant is " ++"responsible for the safety of their own connections and devices." ++msgstr "" ++"La xarxa, com a la Internet, no és xifrada i és oberta. Cada partícip és " ++"responsable de la seguretat dels seus propis connexions i dispositius." ++ ++msgid "" ++"The open and free wireless network of volunteers (\"Operators\") provides " ++"the necessary equipment and Internet connections (\"Infrastructure\") at " ++"their own expense." ++msgstr "" ++ ++msgid "" ++"The operator claims no liability for loss of data, unauthorized access/" ++"damage to devices, or financial losses that participants may suffer from the " ++"use of the network." ++msgstr "" ++ ++msgid "" ++"The participant agrees to not perform any action and refrain from acts which " ++"may violate the law or infringe upon the rights of third parties." ++msgstr "" ++ ++msgid "" ++"The participant agrees to not transfer content over the network which " ++"violates the law." ++msgstr "" ++"El partícip consent a no transferir contingut sobre la xarxa que violi la " ++"llei." ++ ++msgid "" ++"The participant agrees to not use the network in any way which will harm the " ++"infrastructure, the network itself, its operators or other participants." ++msgstr "" ++"El partícip consent a no utilitzar la xarxa de qualsevol manera que danyi la " ++"infraestructura, la xarxa en si, els seus operadors o altres partícips." ++ ++msgid "" ++"These Terms of Use govern the use of the network by its participants' " ++"computer, PDA, or similar device (\"Devices\") within the network." ++msgstr "" ++"Aquestes condicions d'ús governen l'ús de la xarxa pels ordinadors, " ++"organitzadors personals o dispositius similars (\"Dispositius\") dels seus " ++"partícips dins de la xarxa." ++ ++msgid "Time remaining" ++msgstr "Temps restant" ++ ++msgid "" ++"To ask for the reason why you have been blocked or ask for access again you " ++"can try to contact the owner of this access point:" ++msgstr "" ++"Per demanar el motiu perquè s'us ha bloquejat o per demanar l'accés de nou, " ++"podeu intentar contactar al propietari d'aquest punt d'accés:" ++ ++msgid "Traffic in/out" ++msgstr "Trànsit entrant/sortint" ++ ++msgid "Upload limit" ++msgstr "Límit de pujada" ++ ++msgid "Usage Agreement" ++msgstr "Acord d'ús" ++ ++msgid "Welcome" ++msgstr "Benvingut" ++ ++msgid "Whitelist" ++msgstr "Llista blanca" ++ ++msgid "You are now connected to the free wireless mesh network" ++msgstr "Ja esteu connectat a la xarxa en malla sense fil gratis" ++ ++msgid "" ++"You can enter your own text that is displayed to clients here.
    It is " ++"possible to use the following markers: ###COMMUNITY###, ###COMMUNITY_URL###, " ++"###CONTACTURL###, ###LEASETIME###, ###LIMIT### and ###ACCEPT###." ++msgstr "" ++"Podeu introduir aquí el vostre propi text que es mostra als clients.
    Es " ++"pot utilitzar els següents marcadors: ###COMMUNITY###, ###COMMUNITY_URL###, " ++"###CONTACTURL###, ###LEASETIME### ###LIMIT### i ###ACCEPT###." ++ ++msgid "" ++"Your access to this network has been blocked, most likely because you did " ++"something that our rules explicitly forbid." ++msgstr "" ++"S'us ha bloquejat el accés a aquesta xarxa, probablement perquè heu fet " ++"alguna cosa que les nostres regles explícitament prohibeixen." ++ ++msgid "Your bandwidth is limited to" ++msgstr "La vostra amplada de banda està limitat a" ++ ++msgid "blacklisted" ++msgstr "prohibit" ++ ++msgid "expired" ++msgstr "caducat" ++ ++msgid "optional when using host addresses" ++msgstr "opcional quan s'utilitza adreces de host" ++ ++msgid "perform any kind of illegal activities" ++msgstr "realitza qualsevol tipus d'activitat il·legal" ++ ++msgid "splashed" ++msgstr "" ++ ++msgid "temporarily blocked" ++msgstr "bloquejat temporalment" ++ ++msgid "unknown" ++msgstr "desconegut" ++ ++msgid "use filesharing applications on this network" ++msgstr "utilitza aplicacions de compartició de fitxers en aquesta xarxa" ++ ++msgid "waste bandwidth with unneccesary downloads or streams" ++msgstr "malgasta l'amplada de banda amb baixades o corrents innecessaris" ++ ++msgid "whitelisted" ++msgstr "en llista blanca" +diff --git a/feeds/luci/applications/luci-app-splash/po/cs/splash.po b/feeds/luci/applications/luci-app-splash/po/cs/splash.po +new file mode 100644 +index 0000000..671afd7 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-splash/po/cs/splash.po +@@ -0,0 +1,340 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"PO-Revision-Date: 2014-08-04 19:05+0200\n" ++"Last-Translator: KubaCZ \n" ++"Language-Team: none\n" ++"Language: cs\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "Accept" ++msgstr "PÅ™ijmout" ++ ++msgid "" ++"Access to the internet might be possible nevertheless, because some " ++"activists of this project share their private internet connections. These " ++"few connections are shared between all users. That means available bandwidth " ++"is limited and because of this we ask you not to do any of the following:" ++msgstr "" ++"Přístup k Internetu může být možný, nicménÄ› pouze proto, že nÄ›kteří " ++"aktivisté tohoto projektu sdílí jejich soukromé Internetové pÅ™ipojení. " ++"TÄ›chto nÄ›kolik spojení je sdíleno mezi vÅ¡emi uživateli. Z toho plyne, že " ++"dostupná šířka pásma je omezená a z tohoto důvodu vás žádáme, abyste " ++"nedÄ›lali žádné z následujících vÄ›cí:" ++ ++msgid "" ++"Access to the network is not guaranteed. It can be interrupted at any time " ++"without notice for any reason, for certain devices, and/or may be blocked " ++"for certain users." ++msgstr "" ++ ++msgid "Active Clients" ++msgstr "Aktivní klienti" ++ ++msgid "Allowed hosts/subnets" ++msgstr "Povolení hostitelé/podsítÄ›" ++ ++msgid "" ++"As an alternative to editing the complete splash text you can also just " ++"include some custom text in the default splash page by entering it here." ++msgstr "" ++"KromÄ› možnosti vytvoÅ™it celý vlastní text místo textu výše také můžete jen " ++"jako doplnÄ›k pÅ™ipojit svůj text jeho napsáním sem." ++ ++msgid "" ++"Bandwidth limit for clients is only activated when both up- and download " ++"limit are set. Use a value of 0 here to completely disable this limitation. " ++"Whitelisted clients are not limited." ++msgstr "" ++"Limit šířky pásma pro klienty je aktivován pouze v případÄ›, že oba limity " ++"(upload a download) jsou nastaveny. Hodnotou 0 úplnÄ› vypnete toto omezení. " ++"Klienti na whitelistu nejsou omezeni." ++ ++msgid "" ++"Become an active member of this community and help by operating your own node" ++msgstr "" ++"Staňte se aktivním Älenem této komunity a pÅ™ispÄ›jte provozováním vlastního " ++"uzlu" ++ ++msgid "Blacklist" ++msgstr "Blacklist" ++ ++msgid "Blocked" ++msgstr "Zablokovaný" ++ ++msgid "" ++"By accepting these rules you can use this network for %s hour(s). After this " ++"time you need to accept these rules again." ++msgstr "" ++ ++msgid "Clearance time" ++msgstr "" ++ ++#, fuzzy ++msgid "Client-Splash" ++msgstr "Client-Splash" ++ ++msgid "" ++"Client-Splash is a hotspot authentification system for wireless mesh " ++"networks." ++msgstr "" ++ ++msgid "" ++"Clients are redirected to this page after they have accepted the splash. If " ++"this is left empty they are redirected to the page they had requested." ++msgstr "" ++ ++msgid "Clients download speed is limited to this value (kbyte/s)" ++msgstr "Rychlost stahování je pro klienty omezena na tuto hodnotu (kbyte/s)" ++ ++msgid "" ++"Clients that have accepted the splash are allowed to use the network for " ++"that many hours." ++msgstr "" ++ ++msgid "Clients upload speed is limited to this value (kbyte/s)" ++msgstr "Rychlost nahrávání je pro klienty omezena na tuto hodnotu (kbyte/s)" ++ ++msgid "Contact" ++msgstr "Kontakt" ++ ++msgid "Decline" ++msgstr "Odmítnout" ++ ++msgid "" ++"Destination hosts and networks that are excluded from splashing, i.e. they " ++"are always allowed." ++msgstr "" ++ ++msgid "Donate some money to help us keep this project alive." ++msgstr "Darováním penÄ›z nám pomůžete udržet tento projekt naživu" ++ ++msgid "Download limit" ++msgstr "Limit stahování" ++ ++msgid "Edit the complete splash text" ++msgstr "" ++ ++msgid "Fair Use Policy" ++msgstr "Fair Use Policy" ++ ++msgid "Firewall zone" ++msgstr "Zóna firewallu" ++ ++msgid "General" ++msgstr "" ++ ++msgid "Get in %s with the operator of this access point." ++msgstr "" ++ ++msgid "Hostname" ++msgstr "Hostname" ++ ++msgid "IP Address" ++msgstr "IP adresa" ++ ++msgid "" ++"If you operate your own wifi equipment use channels different from ours." ++msgstr "" ++ ++msgid "If you use this network on a regular basis we ask for your support:" ++msgstr "" ++ ++msgid "Include your own text in the default splash" ++msgstr "" ++ ++msgid "Intercept client traffic on this Interface" ++msgstr "" ++ ++msgid "Interfaces" ++msgstr "Rozhraní" ++ ++msgid "Interfaces that are used for Splash." ++msgstr "" ++ ++msgid "" ++"KB/s (Download/Upload). You may be able to remove this limit by actively " ++"contributing to this project." ++msgstr "" ++"KB/s (Stahování/Nahrávání). Aktivním pÅ™ispíváním tomuto projektu můžete moci " ++"odebrat tento limit." ++ ++msgid "Legally Prohibited Activities" ++msgstr "" ++ ++msgid "Legally Prohibited content" ++msgstr "" ++ ++msgid "MAC Address" ++msgstr "MAC adresa" ++ ++msgid "MAC addresses in this list are blocked." ++msgstr "MAC adresy v tomto seznamu jsou blokovány" ++ ++msgid "" ++"MAC addresses of whitelisted clients. These do not need to accept the splash " ++"and are not bandwidth limited." ++msgstr "" ++"Mac adresy klientů na whitelistu. Tito nemusí pÅ™ijímat splash a nejsou " ++"omezeni šířkou pásma." ++ ++msgid "Netmask" ++msgstr "Síťová maska" ++ ++msgid "Network" ++msgstr "Síť" ++ ++msgid "No clients connected" ++msgstr "Žádní klienti nejsou pÅ™ipojeni" ++ ++msgid "" ++"Please note that we are not an internet service provider but an experimental " ++"community network." ++msgstr "" ++"VezmÄ›te prosím na vÄ›domí, že nejsme žádní ISP, ale experimentální komunitní " ++"síť." ++ ++msgid "Policy" ++msgstr "Politika" ++ ++msgid "Redirect target" ++msgstr "" ++ ++msgid "Safety" ++msgstr "BezpeÄnost" ++ ++msgid "Save" ++msgstr "Uložit" ++ ++msgid "Splash rules are integrated in this firewall zone" ++msgstr "" ++ ++msgid "Splashtext" ++msgstr "" ++ ++msgid "" ++"The network, like the Internet, is unencrypted and open. Each participant is " ++"responsible for the safety of their own connections and devices." ++msgstr "" ++ ++msgid "" ++"The open and free wireless network of volunteers (\"Operators\") provides " ++"the necessary equipment and Internet connections (\"Infrastructure\") at " ++"their own expense." ++msgstr "" ++ ++msgid "" ++"The operator claims no liability for loss of data, unauthorized access/" ++"damage to devices, or financial losses that participants may suffer from the " ++"use of the network." ++msgstr "" ++ ++msgid "" ++"The participant agrees to not perform any action and refrain from acts which " ++"may violate the law or infringe upon the rights of third parties." ++msgstr "" ++ ++msgid "" ++"The participant agrees to not transfer content over the network which " ++"violates the law." ++msgstr "" ++ ++msgid "" ++"The participant agrees to not use the network in any way which will harm the " ++"infrastructure, the network itself, its operators or other participants." ++msgstr "" ++ ++msgid "" ++"These Terms of Use govern the use of the network by its participants' " ++"computer, PDA, or similar device (\"Devices\") within the network." ++msgstr "" ++ ++msgid "Time remaining" ++msgstr "Zbývající Äas" ++ ++msgid "" ++"To ask for the reason why you have been blocked or ask for access again you " ++"can try to contact the owner of this access point:" ++msgstr "" ++"Pokud se chcete zeptat, proÄ jste byli zablokováni nebo jak získat zpÄ›t " ++"přístup, můžete se pokusit kontaktovat vlastníka tohoto přístupového bodu:" ++ ++msgid "Traffic in/out" ++msgstr "Provoz dovnitÅ™/ven" ++ ++msgid "Upload limit" ++msgstr "Limit nahrávání" ++ ++msgid "Usage Agreement" ++msgstr "" ++ ++msgid "Welcome" ++msgstr "Vítejte" ++ ++msgid "Whitelist" ++msgstr "Whitelist" ++ ++msgid "You are now connected to the free wireless mesh network" ++msgstr "" ++ ++msgid "" ++"You can enter your own text that is displayed to clients here.
    It is " ++"possible to use the following markers: ###COMMUNITY###, ###COMMUNITY_URL###, " ++"###CONTACTURL###, ###LEASETIME###, ###LIMIT### and ###ACCEPT###." ++msgstr "" ++"Sem můžete vložit text, který se zobrazí klientům.
    Můžete použít tyto " ++"znaÄky: ###COMMUNITY###, ###COMMUNITY_URL###, ###CONTACTURL###, " ++"###LEASETIME###, ###LIMIT### and ###ACCEPT###." ++ ++msgid "" ++"Your access to this network has been blocked, most likely because you did " ++"something that our rules explicitly forbid." ++msgstr "" ++"Váš přístup do této sítÄ› byl zablokován, nejspíše jste udÄ›lal nÄ›co, co naÅ¡e " ++"pravidla výslovnÄ› zakazují." ++ ++msgid "Your bandwidth is limited to" ++msgstr "VaÅ¡e šířka pásma je omezena na" ++ ++msgid "blacklisted" ++msgstr "na Äerné listinÄ›" ++ ++msgid "expired" ++msgstr "proÅ¡lý" ++ ++msgid "optional when using host addresses" ++msgstr "" ++ ++msgid "perform any kind of illegal activities" ++msgstr "provádÄ›t nÄ›jaký z druhů nelegálních Äinností" ++ ++msgid "splashed" ++msgstr "" ++ ++msgid "temporarily blocked" ++msgstr "doÄasnÄ› zablokován" ++ ++msgid "unknown" ++msgstr "neznámý" ++ ++msgid "use filesharing applications on this network" ++msgstr "používat aplikace na sdílení souborů v této síti" ++ ++msgid "waste bandwidth with unneccesary downloads or streams" ++msgstr "plýtvat šířkou pásma nepotÅ™ebným stahováním nebo streamy" ++ ++msgid "whitelisted" ++msgstr "na bílé listinÄ›" ++ ++#~ msgid "By accepting these rules you can use this network for" ++#~ msgstr "PÅ™ijmutím tÄ›chto pravidel můžete zaÄít používat tuto síť pro" ++ ++#~ msgid "hour(s). After this time you need to accept these rules again." ++#~ msgstr "hodin. Po uplynutí této doby musíte pÅ™ijmout pravidla znovu." ++ ++#~ msgid "the owner of this access point." ++#~ msgstr "vlastník tohoto přístupového bodu." +diff --git a/feeds/luci/applications/luci-app-splash/po/de/splash.po b/feeds/luci/applications/luci-app-splash/po/de/splash.po +new file mode 100644 +index 0000000..8b1cd9a +--- /dev/null ++++ b/feeds/luci/applications/luci-app-splash/po/de/splash.po +@@ -0,0 +1,383 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: \n" ++"POT-Creation-Date: \n" ++"PO-Revision-Date: 2013-08-19 13:53+0200\n" ++"Last-Translator: Manuel \n" ++"Language-Team: \n" ++"Language: de\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n != 1);\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "Accept" ++msgstr "Akzeptieren" ++ ++msgid "" ++"Access to the internet might be possible nevertheless, because some " ++"activists of this project share their private internet connections. These " ++"few connections are shared between all users. That means available bandwidth " ++"is limited and because of this we ask you not to do any of the following:" ++msgstr "" ++"Zugang zum Internet ist unter Umständen dennoch möglich, da einige " ++"Teilnehmer dieses Netzes ihren eigenen Internetzugang teilen. Da alle Nutzer " ++"sich diese wenigen Zugänge teilen müssen bitten wir darum, folgende " ++"Aktivitäten zu unterlassen:" ++ ++msgid "" ++"Access to the network is not guaranteed. It can be interrupted at any time " ++"without notice for any reason, for certain devices, and/or may be blocked " ++"for certain users." ++msgstr "" ++"Der Zugang zum Netzwerk wird nicht garantiert. Er kann jederzeit und ohne " ++"Angabe von Gründen unterbrochen oder für bestimmte Endgeräte und Teilnehmer " ++"gesperrt werden." ++ ++msgid "Active Clients" ++msgstr "verbundene Clients" ++ ++msgid "Allowed hosts/subnets" ++msgstr "Erlaubte Rechner/Netzwerke" ++ ++msgid "" ++"As an alternative to editing the complete splash text you can also just " ++"include some custom text in the default splash page by entering it here." ++msgstr "" ++"Als Alternative zum Bearbeiten des kompletten Splash-Textes (oben) kann auch " ++"nur eigener Text in die Default-Splashseite eingebunden werden. Dazu im " ++"folgenden Feld den eigenen Text eingeben." ++ ++msgid "" ++"Bandwidth limit for clients is only activated when both up- and download " ++"limit are set. Use a value of 0 here to completely disable this limitation. " ++"Whitelisted clients are not limited." ++msgstr "" ++"Die Bandbreitenlimitierung für Clients wird nur aktiviert, wenn sowohl für " ++"Up- als auch für Download Limits eingegeben wurden. Ein Wert von 0 " ++"deaktiviert die Bandbreitenbeschränkung komplett. Rechner/Netze aus der " ++"Whitelist werden nicht limitiert." ++ ++msgid "" ++"Become an active member of this community and help by operating your own node" ++msgstr "" ++"Werde ein aktives Mitglied unserer Community und hilf, indem du selber einen " ++"Access Point betreibst." ++ ++msgid "Blacklist" ++msgstr "Blacklist " ++ ++msgid "Blocked" ++msgstr "Gesperrt" ++ ++msgid "" ++"By accepting these rules you can use this network for %s hour(s). After this " ++"time you need to accept these rules again." ++msgstr "" ++"Durch das Akzeptieren dieser Regeln kannst du unser Netzwerk für %s Stunde" ++"(n) benutzen. Danach wirst du aufgefordert diese Bedingungen erneut zu " ++"akzeptieren." ++ ++msgid "Clearance time" ++msgstr "Freigabezeit" ++ ++msgid "Client-Splash" ++msgstr "Client-Splash" ++ ++msgid "" ++"Client-Splash is a hotspot authentification system for wireless mesh " ++"networks." ++msgstr "" ++"Client-Splash ist ein Hotspot-Authentifizierungssystem für Freifunk und " ++"andere Meshnetzwerke." ++ ++msgid "" ++"Clients are redirected to this page after they have accepted the splash. If " ++"this is left empty they are redirected to the page they had requested." ++msgstr "" ++"Wird hier eine URL angegeben dann werden Clients zu dieser Seite " ++"weitergeleitet nachdem sie die Nutzungsbedingungen akzeptiert haben. Wird " ++"keine URL angegeben dann werden Clients zu der ursprünglich angeforderten " ++"Seite weitergeleitet." ++ ++msgid "Clients download speed is limited to this value (kbyte/s)" ++msgstr "" ++"Downloadgeschwindigkeit von Clients auf diesen Wert limitieren (kbyte/s) " ++ ++msgid "" ++"Clients that have accepted the splash are allowed to use the network for " ++"that many hours." ++msgstr "" ++"Clients die den Splash akzeptiert haben dürfen das Netzwerk für so viele " ++"Stunden benutzen." ++ ++msgid "Clients upload speed is limited to this value (kbyte/s)" ++msgstr "" ++"Uploadgeschwindigkeit von Clients auf diesen Wert limitieren (kbyte/s) " ++ ++msgid "Contact" ++msgstr "Kontakt" ++ ++msgid "Decline" ++msgstr "Ablehnen" ++ ++msgid "" ++"Destination hosts and networks that are excluded from splashing, i.e. they " ++"are always allowed." ++msgstr "" ++"Ziel-Rechner und Ziel-Netzwerke die hier aufgeführt sind werden vom " ++"Splashvorgang ausgenommen, d.h. sie können von Clients immer und ohne " ++"Authentifizierung erreicht werden." ++ ++msgid "Donate some money to help us keep this project alive." ++msgstr "" ++"Hilf durch eine Spende dieses Projekt aufrechzuerhalten oder weiter " ++"auszubauen." ++ ++msgid "Download limit" ++msgstr "Downloadbegrenzung" ++ ++msgid "Edit the complete splash text" ++msgstr "Bearbeiten des kompletten Splash-Textes." ++ ++msgid "Fair Use Policy" ++msgstr "Fair Use Policy" ++ ++msgid "Firewall zone" ++msgstr "Firewallzone" ++ ++msgid "General" ++msgstr "Allgemein" ++ ++msgid "Get in %s with the operator of this access point." ++msgstr "Nimm %s mit dem Betreiber dieses Access Points auf." ++ ++msgid "Hostname" ++msgstr "Rechnername" ++ ++msgid "IP Address" ++msgstr "IP-Adresse" ++ ++msgid "" ++"If you operate your own wifi equipment use channels different from ours." ++msgstr "Betreibe deine eigenen WLAN-Geräte auf anderen Kanälen als wir." ++ ++msgid "If you use this network on a regular basis we ask for your support:" ++msgstr "Wenn du unser Netzwerk regelmässig benutzt dann hilf uns bitte, z.B.:" ++ ++msgid "Include your own text in the default splash" ++msgstr "Einbinden von eigenem Text in die Default-Splashseite" ++ ++msgid "Intercept client traffic on this Interface" ++msgstr "Clientverkehr auf dieser Schnittstelle abfangen" ++ ++msgid "Interfaces" ++msgstr "Schnittstellen" ++ ++msgid "Interfaces that are used for Splash." ++msgstr "Schnittstellen die für Splash benutzt werden." ++ ++msgid "" ++"KB/s (Download/Upload). You may be able to remove this limit by actively " ++"contributing to this project." ++msgstr "" ++"KB/s (Download/Upload). Durch die aktive Teilnahme an unserem Netzwerks " ++"kannst du dieses Bandbreitenlimit deaktivieren." ++ ++msgid "Legally Prohibited Activities" ++msgstr "Verbotene Handlungen" ++ ++msgid "Legally Prohibited content" ++msgstr "Verbotene Inhalte" ++ ++msgid "MAC Address" ++msgstr "MAC-Adresse" ++ ++msgid "MAC addresses in this list are blocked." ++msgstr "MAC-Adressen in dieser Liste werden geblockt." ++ ++msgid "" ++"MAC addresses of whitelisted clients. These do not need to accept the splash " ++"and are not bandwidth limited." ++msgstr "" ++"MAC-Adressen von Clients in der Whitelist. Diese müssen den Splash nicht " ++"akzeptieren und unterliegen keinen Bandbreitenbegrenzungen." ++ ++msgid "Netmask" ++msgstr "Netzmaske" ++ ++msgid "Network" ++msgstr "Netzwerk" ++ ++msgid "No clients connected" ++msgstr "Keine Clients verbunden." ++ ++msgid "" ++"Please note that we are not an internet service provider but an experimental " ++"community network." ++msgstr "" ++"Bitte sei dir darüber bewusst, dass wir kein Internetanbieter sondern ein " ++"experimentelles Gemeinschaftsnetzwerk sind." ++ ++msgid "Policy" ++msgstr "Richtlinie" ++ ++msgid "Redirect target" ++msgstr "Ziel für Weiterleitung" ++ ++msgid "Safety" ++msgstr "Sicherheit" ++ ++msgid "Save" ++msgstr "Speichern" ++ ++msgid "Splash rules are integrated in this firewall zone" ++msgstr "Splashregeln werden in diese Firewallzone eingegliedert" ++ ++msgid "Splashtext" ++msgstr "Splash-Text" ++ ++msgid "" ++"The network, like the Internet, is unencrypted and open. Each participant is " ++"responsible for the safety of their own connections and devices." ++msgstr "" ++"Das Netzwerk ist, wie das Internet auch, unverschlüsselt und offen. Jeder " ++"Teilnehmer ist selbst für die Sicherheit seiner Verbindungen und seiner " ++"Endgeräte verantwortlich." ++ ++msgid "" ++"The open and free wireless network of volunteers (\"Operators\") provides " ++"the necessary equipment and Internet connections (\"Infrastructure\") at " ++"their own expense." ++msgstr "" ++"Das offene und freie drahtlose Netzwerk wird von Freiwilligen betrieben " ++"(\"Betreiber\"), die die nötigen Geräte und Internet-Anschlüsse " ++"(\"Infrastruktur\") auf eigene Kosten zur Verfügung stellen." ++ ++msgid "" ++"The operator claims no liability for loss of data, unauthorized access/" ++"damage to devices, or financial losses that participants may suffer from the " ++"use of the network." ++msgstr "" ++"Die Betreiber lehnen jede Haftung für Datenverlust, unbefugten Zugriff auf " ++"Endgeräte, Schäden an Endgeräten oder finanzielle Verluste, die ein " ++"Teilnehmer durch die Nutzung des Netzwerks erleidet ab." ++ ++msgid "" ++"The participant agrees to not perform any action and refrain from acts which " ++"may violate the law or infringe upon the rights of third parties." ++msgstr "" ++"Der Teilnehmer verpflichtet sich, keine Handlungen vorzunehmen bzw. " ++"Handlungen zu unterlassen, welche gesetzliche Bestimmungen oder die Rechte " ++"Dritter verletzen." ++ ++msgid "" ++"The participant agrees to not transfer content over the network which " ++"violates the law." ++msgstr "" ++"Der Teilnehmer verpflichtet sich, keine Inhalte über das Netzwerk zu " ++"übertragen, welche gegen geltendes Recht verstoßen." ++ ++msgid "" ++"The participant agrees to not use the network in any way which will harm the " ++"infrastructure, the network itself, its operators or other participants." ++msgstr "" ++"Der Teilnehmer verpflichtet sich, das Netzwerk nicht in einer Weise zu " ++"beanspruchen, welche die Infrastruktur, das Netzwerk selbst, dessen " ++"Betreiber oder andere Teilnehmer beeinträchtigt." ++ ++msgid "" ++"These Terms of Use govern the use of the network by its participants' " ++"computer, PDA, or similar device (\"Devices\") within the network." ++msgstr "" ++"Diese Nutzungsbestimmungen regeln die Inanspruchnahme des Netzwerks durch " ++"die Teilnehmer, welche sich mittels Computer, Handheld o.ä (\"Endgerät\") " ++"mit dem Netzwerk verbinden." ++ ++msgid "Time remaining" ++msgstr "Verbleibende Zeit" ++ ++msgid "" ++"To ask for the reason why you have been blocked or ask for access again you " ++"can try to contact the owner of this access point:" ++msgstr "" ++"Um nach dem Grund der Sperrung zu fragen oder um deren Aufhebung zu bitten " ++"wende dich an den Administrator dieses Access Points:" ++ ++msgid "Traffic in/out" ++msgstr "Ein-/Ausgehender Verkehr" ++ ++msgid "Upload limit" ++msgstr "Upload-Begrenzung" ++ ++msgid "Usage Agreement" ++msgstr "Nutzungsbestimmungen" ++ ++msgid "Welcome" ++msgstr "Willkommen" ++ ++msgid "Whitelist" ++msgstr "Whitelist" ++ ++msgid "You are now connected to the free wireless mesh network" ++msgstr "Du bist jetzt verbunden mit dem freien Funknetzwerk" ++ ++msgid "" ++"You can enter your own text that is displayed to clients here.
    It is " ++"possible to use the following markers: ###COMMUNITY###, ###COMMUNITY_URL###, " ++"###CONTACTURL###, ###LEASETIME###, ###LIMIT### and ###ACCEPT###." ++msgstr "" ++"Hier kann ein eigener Text eingegeben werden, der Clients angezeigt wird." ++"
    Folgende Marker können dabei verwendet werden: ###COMMUNITY###, " ++"###COMMUNITY_URL###, ###CONTACTURL###, ###LEASETIME###, ###LIMIT### und " ++"###ACCEPT###." ++ ++msgid "" ++"Your access to this network has been blocked, most likely because you did " ++"something that our rules explicitly forbid." ++msgstr "" ++"Der Zugang zu diesem Netzwerk wurde vom Administrator blockiert. Das kann " ++"verschiedene Gründe haben, sehr wahrscheinlich hast du jedoch die Regeln " ++"dieses Netzwerks nicht beachtet und dadurch Probleme verursacht." ++ ++msgid "Your bandwidth is limited to" ++msgstr "Deine Bandbreite ist limitiert auf" ++ ++msgid "blacklisted" ++msgstr "gesperrt" ++ ++msgid "expired" ++msgstr "abgelaufen" ++ ++msgid "optional when using host addresses" ++msgstr "Die Angabe ist optional wenn nur einzelne Rechner/IPs verwendet werden" ++ ++msgid "perform any kind of illegal activities" ++msgstr "Illegale Aktivitäten" ++ ++msgid "splashed" ++msgstr "gesplasht" ++ ++msgid "temporarily blocked" ++msgstr "Vorübergehend geblockt" ++ ++msgid "unknown" ++msgstr "Unbekannt" ++ ++msgid "use filesharing applications on this network" ++msgstr "Filesharing betreiben" ++ ++msgid "waste bandwidth with unneccesary downloads or streams" ++msgstr "Bandbreite durch unnötige Downloads oder Streams zu verschwenden." ++ ++msgid "whitelisted" ++msgstr "erlaubt" ++ ++#~ msgid "" ++#~ "Hosts and Networks that are listed here are excluded from splashing, i.e. " ++#~ "they are always allowed." ++#~ msgstr "" ++#~ "Rechner und Netzwerke die hier aufgeführt sind werden vom Splashvorgang " ++#~ "ausgenommen, d.h. sie dürfen das Netzwerk immer und ohne Authentifizierung " ++#~ "benutzen." +diff --git a/feeds/luci/applications/luci-app-splash/po/el/splash.po b/feeds/luci/applications/luci-app-splash/po/el/splash.po +new file mode 100644 +index 0000000..df90478 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-splash/po/el/splash.po +@@ -0,0 +1,307 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Report-Msgid-Bugs-To: \n" ++"POT-Creation-Date: 2012-03-18 15:31+0200\n" ++"PO-Revision-Date: 2012-03-18 15:31+0200\n" ++"Last-Translator: Vasilis \n" ++"Language-Team: LANGUAGE \n" ++"Language: el\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n != 1);\n" ++"X-Generator: Pootle 2.0.4\n" ++ ++msgid "Accept" ++msgstr "" ++ ++msgid "" ++"Access to the internet might be possible nevertheless, because some " ++"activists of this project share their private internet connections. These " ++"few connections are shared between all users. That means available bandwidth " ++"is limited and because of this we ask you not to do any of the following:" ++msgstr "" ++ ++msgid "" ++"Access to the network is not guaranteed. It can be interrupted at any time " ++"without notice for any reason, for certain devices, and/or may be blocked " ++"for certain users." ++msgstr "" ++ ++msgid "Active Clients" ++msgstr "" ++ ++msgid "Allowed hosts/subnets" ++msgstr "" ++ ++msgid "" ++"As an alternative to editing the complete splash text you can also just " ++"include some custom text in the default splash page by entering it here." ++msgstr "" ++ ++msgid "" ++"Bandwidth limit for clients is only activated when both up- and download " ++"limit are set. Use a value of 0 here to completely disable this limitation. " ++"Whitelisted clients are not limited." ++msgstr "" ++ ++msgid "" ++"Become an active member of this community and help by operating your own node" ++msgstr "" ++ ++msgid "Blacklist" ++msgstr "" ++ ++msgid "Blocked" ++msgstr "" ++ ++msgid "" ++"By accepting these rules you can use this network for %s hour(s). After this " ++"time you need to accept these rules again." ++msgstr "" ++ ++msgid "Clearance time" ++msgstr "" ++ ++msgid "Client-Splash" ++msgstr "" ++ ++msgid "" ++"Client-Splash is a hotspot authentification system for wireless mesh " ++"networks." ++msgstr "" ++ ++msgid "" ++"Clients are redirected to this page after they have accepted the splash. If " ++"this is left empty they are redirected to the page they had requested." ++msgstr "" ++ ++msgid "Clients download speed is limited to this value (kbyte/s)" ++msgstr "" ++ ++msgid "" ++"Clients that have accepted the splash are allowed to use the network for " ++"that many hours." ++msgstr "" ++ ++msgid "Clients upload speed is limited to this value (kbyte/s)" ++msgstr "" ++ ++msgid "Contact" ++msgstr "" ++ ++msgid "Decline" ++msgstr "" ++ ++msgid "" ++"Destination hosts and networks that are excluded from splashing, i.e. they " ++"are always allowed." ++msgstr "" ++ ++msgid "Donate some money to help us keep this project alive." ++msgstr "" ++ ++msgid "Download limit" ++msgstr "" ++ ++msgid "Edit the complete splash text" ++msgstr "" ++ ++msgid "Fair Use Policy" ++msgstr "" ++ ++msgid "Firewall zone" ++msgstr "" ++ ++msgid "General" ++msgstr "" ++ ++msgid "Get in %s with the operator of this access point." ++msgstr "" ++ ++msgid "Hostname" ++msgstr "" ++ ++msgid "IP Address" ++msgstr "ΔιεÏθυνση IP" ++ ++msgid "" ++"If you operate your own wifi equipment use channels different from ours." ++msgstr "" ++ ++msgid "If you use this network on a regular basis we ask for your support:" ++msgstr "" ++ ++msgid "Include your own text in the default splash" ++msgstr "" ++ ++msgid "Intercept client traffic on this Interface" ++msgstr "" ++ ++msgid "Interfaces" ++msgstr "Διεπαφές" ++ ++msgid "Interfaces that are used for Splash." ++msgstr "" ++ ++msgid "" ++"KB/s (Download/Upload). You may be able to remove this limit by actively " ++"contributing to this project." ++msgstr "" ++ ++msgid "Legally Prohibited Activities" ++msgstr "" ++ ++msgid "Legally Prohibited content" ++msgstr "" ++ ++msgid "MAC Address" ++msgstr "ΔιεÏθυνση MAC" ++ ++msgid "MAC addresses in this list are blocked." ++msgstr "" ++ ++msgid "" ++"MAC addresses of whitelisted clients. These do not need to accept the splash " ++"and are not bandwidth limited." ++msgstr "" ++ ++msgid "Netmask" ++msgstr "" ++ ++msgid "Network" ++msgstr "Δίκτυο" ++ ++msgid "No clients connected" ++msgstr "" ++ ++msgid "" ++"Please note that we are not an internet service provider but an experimental " ++"community network." ++msgstr "" ++ ++msgid "Policy" ++msgstr "" ++ ++msgid "Redirect target" ++msgstr "" ++ ++msgid "Safety" ++msgstr "" ++ ++msgid "Save" ++msgstr "Αποθήκευση" ++ ++msgid "Splash rules are integrated in this firewall zone" ++msgstr "" ++ ++msgid "Splashtext" ++msgstr "" ++ ++msgid "" ++"The network, like the Internet, is unencrypted and open. Each participant is " ++"responsible for the safety of their own connections and devices." ++msgstr "" ++ ++msgid "" ++"The open and free wireless network of volunteers (\"Operators\") provides " ++"the necessary equipment and Internet connections (\"Infrastructure\") at " ++"their own expense." ++msgstr "" ++ ++msgid "" ++"The operator claims no liability for loss of data, unauthorized access/" ++"damage to devices, or financial losses that participants may suffer from the " ++"use of the network." ++msgstr "" ++ ++msgid "" ++"The participant agrees to not perform any action and refrain from acts which " ++"may violate the law or infringe upon the rights of third parties." ++msgstr "" ++ ++msgid "" ++"The participant agrees to not transfer content over the network which " ++"violates the law." ++msgstr "" ++ ++msgid "" ++"The participant agrees to not use the network in any way which will harm the " ++"infrastructure, the network itself, its operators or other participants." ++msgstr "" ++ ++msgid "" ++"These Terms of Use govern the use of the network by its participants' " ++"computer, PDA, or similar device (\"Devices\") within the network." ++msgstr "" ++ ++msgid "Time remaining" ++msgstr "" ++ ++msgid "" ++"To ask for the reason why you have been blocked or ask for access again you " ++"can try to contact the owner of this access point:" ++msgstr "" ++ ++msgid "Traffic in/out" ++msgstr "" ++ ++msgid "Upload limit" ++msgstr "" ++ ++msgid "Usage Agreement" ++msgstr "" ++ ++msgid "Welcome" ++msgstr "" ++ ++msgid "Whitelist" ++msgstr "" ++ ++msgid "You are now connected to the free wireless mesh network" ++msgstr "" ++ ++msgid "" ++"You can enter your own text that is displayed to clients here.
    It is " ++"possible to use the following markers: ###COMMUNITY###, ###COMMUNITY_URL###, " ++"###CONTACTURL###, ###LEASETIME###, ###LIMIT### and ###ACCEPT###." ++msgstr "" ++ ++msgid "" ++"Your access to this network has been blocked, most likely because you did " ++"something that our rules explicitly forbid." ++msgstr "" ++ ++msgid "Your bandwidth is limited to" ++msgstr "" ++ ++msgid "blacklisted" ++msgstr "" ++ ++msgid "expired" ++msgstr "" ++ ++msgid "optional when using host addresses" ++msgstr "" ++ ++msgid "perform any kind of illegal activities" ++msgstr "" ++ ++msgid "splashed" ++msgstr "" ++ ++msgid "temporarily blocked" ++msgstr "" ++ ++msgid "unknown" ++msgstr "" ++ ++msgid "use filesharing applications on this network" ++msgstr "" ++ ++msgid "waste bandwidth with unneccesary downloads or streams" ++msgstr "" ++ ++msgid "whitelisted" ++msgstr "" +diff --git a/feeds/luci/applications/luci-app-splash/po/en/splash.po b/feeds/luci/applications/luci-app-splash/po/en/splash.po +new file mode 100644 +index 0000000..615be16 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-splash/po/en/splash.po +@@ -0,0 +1,292 @@ ++msgid "Accept" ++msgstr "" ++ ++msgid "" ++"Access to the internet might be possible nevertheless, because some " ++"activists of this project share their private internet connections. These " ++"few connections are shared between all users. That means available bandwidth " ++"is limited and because of this we ask you not to do any of the following:" ++msgstr "" ++ ++msgid "" ++"Access to the network is not guaranteed. It can be interrupted at any time " ++"without notice for any reason, for certain devices, and/or may be blocked " ++"for certain users." ++msgstr "" ++ ++msgid "Active Clients" ++msgstr "" ++ ++msgid "Allowed hosts/subnets" ++msgstr "" ++ ++msgid "" ++"As an alternative to editing the complete splash text you can also just " ++"include some custom text in the default splash page by entering it here." ++msgstr "" ++ ++msgid "" ++"Bandwidth limit for clients is only activated when both up- and download " ++"limit are set. Use a value of 0 here to completely disable this limitation. " ++"Whitelisted clients are not limited." ++msgstr "" ++ ++msgid "" ++"Become an active member of this community and help by operating your own node" ++msgstr "" ++ ++msgid "Blacklist" ++msgstr "" ++ ++msgid "Blocked" ++msgstr "" ++ ++msgid "" ++"By accepting these rules you can use this network for %s hour(s). After this " ++"time you need to accept these rules again." ++msgstr "" ++ ++msgid "Clearance time" ++msgstr "" ++ ++msgid "Client-Splash" ++msgstr "" ++ ++msgid "" ++"Client-Splash is a hotspot authentification system for wireless mesh " ++"networks." ++msgstr "" ++ ++msgid "" ++"Clients are redirected to this page after they have accepted the splash. If " ++"this is left empty they are redirected to the page they had requested." ++msgstr "" ++ ++msgid "Clients download speed is limited to this value (kbyte/s)" ++msgstr "" ++ ++msgid "" ++"Clients that have accepted the splash are allowed to use the network for " ++"that many hours." ++msgstr "" ++ ++msgid "Clients upload speed is limited to this value (kbyte/s)" ++msgstr "" ++ ++msgid "Contact" ++msgstr "" ++ ++msgid "Decline" ++msgstr "" ++ ++msgid "" ++"Destination hosts and networks that are excluded from splashing, i.e. they " ++"are always allowed." ++msgstr "" ++ ++msgid "Donate some money to help us keep this project alive." ++msgstr "" ++ ++msgid "Download limit" ++msgstr "" ++ ++msgid "Edit the complete splash text" ++msgstr "" ++ ++msgid "Fair Use Policy" ++msgstr "" ++ ++msgid "Firewall zone" ++msgstr "" ++ ++msgid "General" ++msgstr "" ++ ++msgid "Get in %s with the operator of this access point." ++msgstr "" ++ ++msgid "Hostname" ++msgstr "" ++ ++msgid "IP Address" ++msgstr "" ++ ++msgid "" ++"If you operate your own wifi equipment use channels different from ours." ++msgstr "" ++ ++msgid "If you use this network on a regular basis we ask for your support:" ++msgstr "" ++ ++msgid "Include your own text in the default splash" ++msgstr "" ++ ++msgid "Intercept client traffic on this Interface" ++msgstr "" ++ ++msgid "Interfaces" ++msgstr "" ++ ++msgid "Interfaces that are used for Splash." ++msgstr "" ++ ++msgid "" ++"KB/s (Download/Upload). You may be able to remove this limit by actively " ++"contributing to this project." ++msgstr "" ++ ++msgid "Legally Prohibited Activities" ++msgstr "" ++ ++msgid "Legally Prohibited content" ++msgstr "" ++ ++msgid "MAC Address" ++msgstr "" ++ ++msgid "MAC addresses in this list are blocked." ++msgstr "" ++ ++msgid "" ++"MAC addresses of whitelisted clients. These do not need to accept the splash " ++"and are not bandwidth limited." ++msgstr "" ++ ++msgid "Netmask" ++msgstr "" ++ ++msgid "Network" ++msgstr "" ++ ++msgid "No clients connected" ++msgstr "" ++ ++msgid "" ++"Please note that we are not an internet service provider but an experimental " ++"community network." ++msgstr "" ++ ++msgid "Policy" ++msgstr "" ++ ++msgid "Redirect target" ++msgstr "" ++ ++msgid "Safety" ++msgstr "" ++ ++msgid "Save" ++msgstr "" ++ ++msgid "Splash rules are integrated in this firewall zone" ++msgstr "" ++ ++msgid "Splashtext" ++msgstr "" ++ ++msgid "" ++"The network, like the Internet, is unencrypted and open. Each participant is " ++"responsible for the safety of their own connections and devices." ++msgstr "" ++ ++msgid "" ++"The open and free wireless network of volunteers (\"Operators\") provides " ++"the necessary equipment and Internet connections (\"Infrastructure\") at " ++"their own expense." ++msgstr "" ++ ++msgid "" ++"The operator claims no liability for loss of data, unauthorized access/" ++"damage to devices, or financial losses that participants may suffer from the " ++"use of the network." ++msgstr "" ++ ++msgid "" ++"The participant agrees to not perform any action and refrain from acts which " ++"may violate the law or infringe upon the rights of third parties." ++msgstr "" ++ ++msgid "" ++"The participant agrees to not transfer content over the network which " ++"violates the law." ++msgstr "" ++ ++msgid "" ++"The participant agrees to not use the network in any way which will harm the " ++"infrastructure, the network itself, its operators or other participants." ++msgstr "" ++ ++msgid "" ++"These Terms of Use govern the use of the network by its participants' " ++"computer, PDA, or similar device (\"Devices\") within the network." ++msgstr "" ++ ++msgid "Time remaining" ++msgstr "" ++ ++msgid "" ++"To ask for the reason why you have been blocked or ask for access again you " ++"can try to contact the owner of this access point:" ++msgstr "" ++ ++msgid "Traffic in/out" ++msgstr "" ++ ++msgid "Upload limit" ++msgstr "" ++ ++msgid "Usage Agreement" ++msgstr "" ++ ++msgid "Welcome" ++msgstr "" ++ ++msgid "Whitelist" ++msgstr "" ++ ++msgid "You are now connected to the free wireless mesh network" ++msgstr "" ++ ++msgid "" ++"You can enter your own text that is displayed to clients here.
    It is " ++"possible to use the following markers: ###COMMUNITY###, ###COMMUNITY_URL###, " ++"###CONTACTURL###, ###LEASETIME###, ###LIMIT### and ###ACCEPT###." ++msgstr "" ++ ++msgid "" ++"Your access to this network has been blocked, most likely because you did " ++"something that our rules explicitly forbid." ++msgstr "" ++ ++msgid "Your bandwidth is limited to" ++msgstr "" ++ ++msgid "blacklisted" ++msgstr "" ++ ++msgid "expired" ++msgstr "" ++ ++msgid "optional when using host addresses" ++msgstr "" ++ ++msgid "perform any kind of illegal activities" ++msgstr "" ++ ++msgid "splashed" ++msgstr "" ++ ++msgid "temporarily blocked" ++msgstr "" ++ ++msgid "unknown" ++msgstr "" ++ ++msgid "use filesharing applications on this network" ++msgstr "" ++ ++msgid "waste bandwidth with unneccesary downloads or streams" ++msgstr "" ++ ++msgid "whitelisted" ++msgstr "" +diff --git a/feeds/luci/applications/luci-app-splash/po/es/splash.po b/feeds/luci/applications/luci-app-splash/po/es/splash.po +new file mode 100644 +index 0000000..836352e +--- /dev/null ++++ b/feeds/luci/applications/luci-app-splash/po/es/splash.po +@@ -0,0 +1,376 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Report-Msgid-Bugs-To: \n" ++"POT-Creation-Date: 2012-08-24 18:30+0200\n" ++"PO-Revision-Date: 2014-06-15 13:17+0200\n" ++"Last-Translator: José Vicente \n" ++"Language-Team: LANGUAGE \n" ++"Language: es\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n != 1);\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "Accept" ++msgstr "Aceptar" ++ ++msgid "" ++"Access to the internet might be possible nevertheless, because some " ++"activists of this project share their private internet connections. These " ++"few connections are shared between all users. That means available bandwidth " ++"is limited and because of this we ask you not to do any of the following:" ++msgstr "" ++"El acceso a internet puede ser posible, sin embargo, porque otros miembros " ++"del proyecto comparten sus conexiones a internet privadas y estas pocas " ++"conexiones se comparten entre todos los usuarios. Por este motivo el ancho " ++"de banda está limitado y le pedimos que no haga:" ++ ++msgid "" ++"Access to the network is not guaranteed. It can be interrupted at any time " ++"without notice for any reason, for certain devices, and/or may be blocked " ++"for certain users." ++msgstr "" ++"No se puede garantizar el acceso a la red. Podría interrumpirse en cualquier " ++"momento, sin aviso y por cualquier motivo, para ciertos dispositivos y/o es " ++"posible bloquearlo para ciertos usuarios." ++ ++msgid "Active Clients" ++msgstr "Clientes activos" ++ ++msgid "Allowed hosts/subnets" ++msgstr "Máquinas y subredes permitidas" ++ ++msgid "" ++"As an alternative to editing the complete splash text you can also just " ++"include some custom text in the default splash page by entering it here." ++msgstr "" ++"En vez de editar el splash entero puede introducir aquí un texto que se " ++"mostrará en el splash por defecto." ++ ++msgid "" ++"Bandwidth limit for clients is only activated when both up- and download " ++"limit are set. Use a value of 0 here to completely disable this limitation. " ++"Whitelisted clients are not limited." ++msgstr "" ++"La limitación de ancho de banda sólo se activa cuando se establecen tanto el " ++"límite de subida como el de bajada. Ponga 0 para desactivarla. A los " ++"clientes en lista blanca no se les limita." ++ ++msgid "" ++"Become an active member of this community and help by operating your own node" ++msgstr "" ++"Conviértase en un miembro activo de esta comunidad y ayude gestionando su " ++"propio nodo" ++ ++msgid "Blacklist" ++msgstr "Lista negra" ++ ++msgid "Blocked" ++msgstr "Bloqueado" ++ ++msgid "" ++"By accepting these rules you can use this network for %s hour(s). After this " ++"time you need to accept these rules again." ++msgstr "" ++"Aceptar estas reglas le permite usar esta red durante %s hora(s). Tras este " ++"tiempo tendrá que aceptarlas de nuevo." ++ ++msgid "Clearance time" ++msgstr "Tiempo de autorización" ++ ++msgid "Client-Splash" ++msgstr "Cliente-Splash" ++ ++msgid "" ++"Client-Splash is a hotspot authentification system for wireless mesh " ++"networks." ++msgstr "Cliente-Splash es un sistema de autentificación para redes mesh." ++ ++msgid "" ++"Clients are redirected to this page after they have accepted the splash. If " ++"this is left empty they are redirected to the page they had requested." ++msgstr "" ++"Se redirigirá a los clientes a esta página tras haber aceptado el splash. Si " ++"se deja vacío se les redirigirá a la página que habían pedido." ++ ++msgid "Clients download speed is limited to this value (kbyte/s)" ++msgstr "La velocidad de descarga de los clientes está limitada a (Kbytes/s)" ++ ++msgid "" ++"Clients that have accepted the splash are allowed to use the network for " ++"that many hours." ++msgstr "" ++"Horas a las que se permitirá usar la red a los clientes que acepten la " ++"presentación." ++ ++msgid "Clients upload speed is limited to this value (kbyte/s)" ++msgstr "La velocidad de subida de los clientes está limitada a (Kbytes/s)" ++ ++msgid "Contact" ++msgstr "Contacto" ++ ++msgid "Decline" ++msgstr "Rechazar" ++ ++msgid "" ++"Destination hosts and networks that are excluded from splashing, i.e. they " ++"are always allowed." ++msgstr "" ++"Redes y hosts destino excluidos de splash, es decir, que siempre son " ++"admitidos." ++ ++msgid "Donate some money to help us keep this project alive." ++msgstr "Haga una aportación para ayudarnos a mantener este proyecto vivo." ++ ++msgid "Download limit" ++msgstr "Límite de descarga" ++ ++msgid "Edit the complete splash text" ++msgstr "Editar el texto completo del splash" ++ ++msgid "Fair Use Policy" ++msgstr "Política de uso adecuado" ++ ++msgid "Firewall zone" ++msgstr "Zona del cortafuegos" ++ ++msgid "General" ++msgstr "General" ++ ++msgid "Get in %s with the operator of this access point." ++msgstr "Conecte %s con el operador de este punto de acceso." ++ ++msgid "Hostname" ++msgstr "Nombre de máquina" ++ ++msgid "IP Address" ++msgstr "Dirección IP" ++ ++msgid "" ++"If you operate your own wifi equipment use channels different from ours." ++msgstr "Si maneja su propio wi-fi use canales diferentes de los nuestros." ++ ++msgid "If you use this network on a regular basis we ask for your support:" ++msgstr "Si es usuario habitual de esta red le pedimos apoyo:" ++ ++msgid "Include your own text in the default splash" ++msgstr "Incluir su propio texto en el splash por defecto" ++ ++msgid "Intercept client traffic on this Interface" ++msgstr "Interceptar el tráfico cliente en esta interfaz" ++ ++msgid "Interfaces" ++msgstr "Interfaces" ++ ++msgid "Interfaces that are used for Splash." ++msgstr "Interfaces usados para Splash." ++ ++msgid "" ++"KB/s (Download/Upload). You may be able to remove this limit by actively " ++"contributing to this project." ++msgstr "" ++"KB/s (Descarga/Subida). Puede evitar este límite contribuyendo activamente a " ++"este proyecto." ++ ++msgid "Legally Prohibited Activities" ++msgstr "Actividades prohibidas por ley" ++ ++msgid "Legally Prohibited content" ++msgstr "Contenido prohibido por ley" ++ ++msgid "MAC Address" ++msgstr "Dirección MAC" ++ ++msgid "MAC addresses in this list are blocked." ++msgstr "Direcciones MAC bloqueadas." ++ ++msgid "" ++"MAC addresses of whitelisted clients. These do not need to accept the splash " ++"and are not bandwidth limited." ++msgstr "" ++"Direcciones MAC de clientes en lista blanca. Estos no tendrán que aceptar la " ++"presentación ni tendrán limitado el ancho de banda." ++ ++msgid "Netmask" ++msgstr "Máscara de red" ++ ++msgid "Network" ++msgstr "Red" ++ ++msgid "No clients connected" ++msgstr "Sin clientes conectados" ++ ++msgid "" ++"Please note that we are not an internet service provider but an experimental " ++"community network." ++msgstr "" ++"Tenga presente que no somos un proveedor de acceso a internet sino una red " ++"comunitaria experimental." ++ ++msgid "Policy" ++msgstr "Politica" ++ ++msgid "Redirect target" ++msgstr "Redirige objetivo" ++ ++msgid "Safety" ++msgstr "Seguridad" ++ ++msgid "Save" ++msgstr "Guardar" ++ ++msgid "Splash rules are integrated in this firewall zone" ++msgstr "Zona del cortafuegos en la que está integradas las reglas del Splash" ++ ++msgid "Splashtext" ++msgstr "Mensaje de presentación" ++ ++msgid "" ++"The network, like the Internet, is unencrypted and open. Each participant is " ++"responsible for the safety of their own connections and devices." ++msgstr "" ++"La red, como internet, no está encriptada y es abierta. Cada participante es " ++"responsable de la seguridad de sus propias conexiones y dispositivos." ++ ++msgid "" ++"The open and free wireless network of volunteers (\"Operators\") provides " ++"the necessary equipment and Internet connections (\"Infrastructure\") at " ++"their own expense." ++msgstr "" ++"La red abierta y libre de voluntarios (\"operadores\") proporciona el equipo " ++"necesario y conexiones a internet (\"infraestructura\") de su propio " ++"bolsillo." ++ ++msgid "" ++"The operator claims no liability for loss of data, unauthorized access/" ++"damage to devices, or financial losses that participants may suffer from the " ++"use of the network." ++msgstr "" ++"El operador no será responsable por la pérdida de datos, acceso/daño no " ++"autorizado a dispositivos o pérdidas financieras que los participantes " ++"pudiesen incurrir por el uso de la red." ++ ++msgid "" ++"The participant agrees to not perform any action and refrain from acts which " ++"may violate the law or infringe upon the rights of third parties." ++msgstr "" ++"El participante acepta no llevar a cabo ninguna acción y evitará acciones " ++"que pudiese violar las leyes o infringir los derechos de terceros." ++ ++msgid "" ++"The participant agrees to not transfer content over the network which " ++"violates the law." ++msgstr "" ++"El participante acepta no transferir contenido que viole la ley por la red." ++ ++msgid "" ++"The participant agrees to not use the network in any way which will harm the " ++"infrastructure, the network itself, its operators or other participants." ++msgstr "" ++"El participante acepta no usar la red de ninguna manera que dañe la " ++"infraestructura, la propia red, sus operadores u otros participantes." ++ ++msgid "" ++"These Terms of Use govern the use of the network by its participants' " ++"computer, PDA, or similar device (\"Devices\") within the network." ++msgstr "" ++"Estos términos cubren el uso de la red por los ordenadores de sus " ++"participantes, PDAs o dispositivos similares." ++ ++msgid "Time remaining" ++msgstr "Tiempo restante" ++ ++msgid "" ++"To ask for the reason why you have been blocked or ask for access again you " ++"can try to contact the owner of this access point:" ++msgstr "" ++"Para preguntar porqué se le ha bloqueado o pedir acceso de nuevo intente " ++"contactar con el propietario de este punto de acceso:" ++ ++msgid "Traffic in/out" ++msgstr "Tráfico entrante/saliente" ++ ++msgid "Upload limit" ++msgstr "Límite de subida" ++ ++msgid "Usage Agreement" ++msgstr "Acuerdo de uso" ++ ++msgid "Welcome" ++msgstr "Bienvenido" ++ ++msgid "Whitelist" ++msgstr "Lista blanca" ++ ++msgid "You are now connected to the free wireless mesh network" ++msgstr "Se ha conectado a la red libre mesh inalámbrica" ++ ++msgid "" ++"You can enter your own text that is displayed to clients here.
    It is " ++"possible to use the following markers: ###COMMUNITY###, ###COMMUNITY_URL###, " ++"###CONTACTURL###, ###LEASETIME###, ###LIMIT### and ###ACCEPT###." ++msgstr "" ++"Introduzca aquí el texto que se mostrará a los clientes.
    Es posible " ++"usar las siguientes etiquetas: ###COMMUNITY###, ###COMMUNITY_URL###, " ++"###CONTACTURL###, ###LEASETIME###, ###LIMIT### y ###ACCEPT###." ++ ++msgid "" ++"Your access to this network has been blocked, most likely because you did " ++"something that our rules explicitly forbid." ++msgstr "" ++"Se le ha bloqueado el acceso a esta red, probablemente porque hizo algo " ++"prohibido explícitamente en sus reglas." ++ ++msgid "Your bandwidth is limited to" ++msgstr "Su ancho de banda está limitado a" ++ ++msgid "blacklisted" ++msgstr "en lista negra" ++ ++msgid "expired" ++msgstr "caducado" ++ ++msgid "optional when using host addresses" ++msgstr "opcional si usa direcciones de máquina" ++ ++msgid "perform any kind of illegal activities" ++msgstr "llevar a cabo cualquier tipo de actividades ilegales" ++ ++msgid "splashed" ++msgstr "Recibido" ++ ++msgid "temporarily blocked" ++msgstr "bloqueado temporalmente" ++ ++msgid "unknown" ++msgstr "desconocido" ++ ++msgid "use filesharing applications on this network" ++msgstr "usar aplicaciones de compartición de ficheros en esta red" ++ ++msgid "waste bandwidth with unneccesary downloads or streams" ++msgstr "malgastar ancho de banda con descargas innecesarias o multimedia" ++ ++msgid "whitelisted" ++msgstr "en lista blanca" ++ ++#~ msgid "" ++#~ "Hosts and Networks that are listed here are excluded from splashing, i.e. " ++#~ "they are always allowed." ++#~ msgstr "" ++#~ "A estas máquinas y redes no se les mostrará la presentación y siempre serán " ++#~ "bienvenidas." ++ ++#~ msgid "By accepting these rules you can use this network for" ++#~ msgstr "Si acepta estas reglas pordrá usar esta red para" ++ ++#~ msgid "Edit Splash text" ++#~ msgstr "Editar la página de bienvenida" ++ ++#~ msgid "hour(s). After this time you need to accept these rules again." ++#~ msgstr "hora/horas. Tras este tiempo deberá aceptar las reglas de nuevo." ++ ++#~ msgid "the owner of this access point." ++#~ msgstr "el propietario de este punto de acceso." +diff --git a/feeds/luci/applications/luci-app-splash/po/fr/splash.po b/feeds/luci/applications/luci-app-splash/po/fr/splash.po +new file mode 100644 +index 0000000..e525ab3 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-splash/po/fr/splash.po +@@ -0,0 +1,337 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: \n" ++"POT-Creation-Date: \n" ++"PO-Revision-Date: \n" ++"Last-Translator: Manuel Munz \n" ++"Language-Team: \n" ++"Language: \n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++ ++msgid "Accept" ++msgstr "Accepter" ++ ++msgid "" ++"Access to the internet might be possible nevertheless, because some " ++"activists of this project share their private internet connections. These " ++"few connections are shared between all users. That means available bandwidth " ++"is limited and because of this we ask you not to do any of the following:" ++msgstr "" ++ ++msgid "" ++"Access to the network is not guaranteed. It can be interrupted at any time " ++"without notice for any reason, for certain devices, and/or may be blocked " ++"for certain users." ++msgstr "" ++ ++msgid "Active Clients" ++msgstr "Clients actifs" ++ ++msgid "Allowed hosts/subnets" ++msgstr "Hôtes/sous-réseaux autorisés" ++ ++msgid "" ++"As an alternative to editing the complete splash text you can also just " ++"include some custom text in the default splash page by entering it here." ++msgstr "" ++ ++msgid "" ++"Bandwidth limit for clients is only activated when both up- and download " ++"limit are set. Use a value of 0 here to completely disable this limitation. " ++"Whitelisted clients are not limited." ++msgstr "" ++"La limitation de bande-passante des clients est activée seulement quand les " ++"limites montante et descendante sont données. Utilisez ici une valeur de 0 " ++"pour complètement désactiver cette limitation. Les clients autorisés (liste-" ++"blanche) ne sont pas limités." ++ ++msgid "" ++"Become an active member of this community and help by operating your own node" ++msgstr "" ++ ++msgid "Blacklist" ++msgstr "interdire (liste-noire)" ++ ++msgid "Blocked" ++msgstr "" ++ ++msgid "" ++"By accepting these rules you can use this network for %s hour(s). After this " ++"time you need to accept these rules again." ++msgstr "" ++ ++msgid "Clearance time" ++msgstr "Durée d'autorisation" ++ ++msgid "Client-Splash" ++msgstr "Client-Splash" ++ ++msgid "" ++"Client-Splash is a hotspot authentification system for wireless mesh " ++"networks." ++msgstr "" ++"Client-Splash est un système d'authentification de HotSpot pour des réseaux " ++"sans-fil maillés." ++ ++msgid "" ++"Clients are redirected to this page after they have accepted the splash. If " ++"this is left empty they are redirected to the page they had requested." ++msgstr "" ++ ++msgid "Clients download speed is limited to this value (kbyte/s)" ++msgstr "" ++"La vitesse de téléchargement des clients est limitée à cette valeur (en ko/s)" ++ ++msgid "" ++"Clients that have accepted the splash are allowed to use the network for " ++"that many hours." ++msgstr "" ++"Les clients qui auront passé la page d'accueil seront autorisés à utiliser " ++"le réseau pendant ce nombre d'heures donné." ++ ++msgid "Clients upload speed is limited to this value (kbyte/s)" ++msgstr "La vitesse montante des clients sera limitée à cette valeur (en ko/s)" ++ ++msgid "Contact" ++msgstr "" ++ ++msgid "Decline" ++msgstr "Refuser" ++ ++msgid "" ++"Destination hosts and networks that are excluded from splashing, i.e. they " ++"are always allowed." ++msgstr "" ++ ++msgid "Donate some money to help us keep this project alive." ++msgstr "" ++ ++msgid "Download limit" ++msgstr "Limite en télé-chargement" ++ ++msgid "Edit the complete splash text" ++msgstr "" ++ ++msgid "Fair Use Policy" ++msgstr "" ++ ++msgid "Firewall zone" ++msgstr "Zone du pare-feu" ++ ++msgid "General" ++msgstr "Général" ++ ++msgid "Get in %s with the operator of this access point." ++msgstr "" ++ ++msgid "Hostname" ++msgstr "Hôte" ++ ++msgid "IP Address" ++msgstr "Adresse IP" ++ ++msgid "" ++"If you operate your own wifi equipment use channels different from ours." ++msgstr "" ++ ++msgid "If you use this network on a regular basis we ask for your support:" ++msgstr "" ++ ++msgid "Include your own text in the default splash" ++msgstr "" ++ ++msgid "Intercept client traffic on this Interface" ++msgstr "Intercepter le trafic-client sur cette interface" ++ ++msgid "Interfaces" ++msgstr "Interfaces" ++ ++msgid "Interfaces that are used for Splash." ++msgstr "Interfaces utilisés pour l'accueil." ++ ++msgid "" ++"KB/s (Download/Upload). You may be able to remove this limit by actively " ++"contributing to this project." ++msgstr "" ++ ++msgid "Legally Prohibited Activities" ++msgstr "" ++ ++msgid "Legally Prohibited content" ++msgstr "" ++ ++msgid "MAC Address" ++msgstr "Adresse MAC" ++ ++msgid "MAC addresses in this list are blocked." ++msgstr "Les adresses MAC de cette liste sont bloquées." ++ ++msgid "" ++"MAC addresses of whitelisted clients. These do not need to accept the splash " ++"and are not bandwidth limited." ++msgstr "" ++"Adresses MAC des clients autorisés d'office. Ils n'ont pas à accepter la " ++"page d'accueil et ne sont pas limités en bande-passante." ++ ++msgid "Netmask" ++msgstr "Masque" ++ ++msgid "Network" ++msgstr "Réseau" ++ ++msgid "No clients connected" ++msgstr "Aucun client connecté" ++ ++msgid "" ++"Please note that we are not an internet service provider but an experimental " ++"community network." ++msgstr "" ++ ++msgid "Policy" ++msgstr "Politique" ++ ++msgid "Redirect target" ++msgstr "" ++ ++msgid "Safety" ++msgstr "" ++ ++msgid "Save" ++msgstr "Sauvegarder" ++ ++msgid "Splash rules are integrated in this firewall zone" ++msgstr "Les règles du HotSpot sont intégrés dans cette zone du pare-feu" ++ ++msgid "Splashtext" ++msgstr "Texte de la page d'accueil" ++ ++msgid "" ++"The network, like the Internet, is unencrypted and open. Each participant is " ++"responsible for the safety of their own connections and devices." ++msgstr "" ++ ++msgid "" ++"The open and free wireless network of volunteers (\"Operators\") provides " ++"the necessary equipment and Internet connections (\"Infrastructure\") at " ++"their own expense." ++msgstr "" ++ ++msgid "" ++"The operator claims no liability for loss of data, unauthorized access/" ++"damage to devices, or financial losses that participants may suffer from the " ++"use of the network." ++msgstr "" ++ ++msgid "" ++"The participant agrees to not perform any action and refrain from acts which " ++"may violate the law or infringe upon the rights of third parties." ++msgstr "" ++ ++msgid "" ++"The participant agrees to not transfer content over the network which " ++"violates the law." ++msgstr "" ++ ++msgid "" ++"The participant agrees to not use the network in any way which will harm the " ++"infrastructure, the network itself, its operators or other participants." ++msgstr "" ++ ++msgid "" ++"These Terms of Use govern the use of the network by its participants' " ++"computer, PDA, or similar device (\"Devices\") within the network." ++msgstr "" ++ ++msgid "Time remaining" ++msgstr "Temps restant" ++ ++msgid "" ++"To ask for the reason why you have been blocked or ask for access again you " ++"can try to contact the owner of this access point:" ++msgstr "" ++ ++msgid "Traffic in/out" ++msgstr "Trafic entrant/sortant" ++ ++msgid "Upload limit" ++msgstr "Limite du trafic montant" ++ ++msgid "Usage Agreement" ++msgstr "" ++ ++msgid "Welcome" ++msgstr "" ++ ++msgid "Whitelist" ++msgstr "Liste-blanche" ++ ++msgid "You are now connected to the free wireless mesh network" ++msgstr "" ++ ++msgid "" ++"You can enter your own text that is displayed to clients here.
    It is " ++"possible to use the following markers: ###COMMUNITY###, ###COMMUNITY_URL###, " ++"###CONTACTURL###, ###LEASETIME###, ###LIMIT### and ###ACCEPT###." ++msgstr "" ++ ++msgid "" ++"Your access to this network has been blocked, most likely because you did " ++"something that our rules explicitly forbid." ++msgstr "" ++ ++msgid "Your bandwidth is limited to" ++msgstr "" ++ ++msgid "blacklisted" ++msgstr "interdit (par liste-noire)" ++ ++msgid "expired" ++msgstr "terminé" ++ ++msgid "optional when using host addresses" ++msgstr "optionnel quand on utilise des adresses d'hôtes" ++ ++msgid "perform any kind of illegal activities" ++msgstr "" ++ ++msgid "splashed" ++msgstr "À l'accueil" ++ ++msgid "temporarily blocked" ++msgstr "bloqué(s) temporairement" ++ ++msgid "unknown" ++msgstr "inconnu" ++ ++msgid "use filesharing applications on this network" ++msgstr "" ++ ++msgid "waste bandwidth with unneccesary downloads or streams" ++msgstr "" ++ ++msgid "whitelisted" ++msgstr "autorisés par liste blanche" ++ ++#~ msgid "" ++#~ "Hosts and Networks that are listed here are excluded from splashing, i.e. " ++#~ "they are always allowed." ++#~ msgstr "" ++#~ "Les hôtes et réseaux listés ici sont exclus de l'accueil du HotSpot, ils ne " ++#~ "seront jamais autorisés." ++ ++#~ msgid "Edit Splash text" ++#~ msgstr "Modifier le texte de la page d'accueil" ++ ++#~ msgid "" ++#~ "You can change the text that is displayed to clients here.
    It is " ++#~ "possible to use the following markers: ###COMMUNITY###, " ++#~ "###COMMUNITY_URL###, ###LEASETIME### and ###ACCEPT###.
    Click here to " ++#~ "test the splash page after you saved it." ++#~ msgstr "" ++#~ "Vous pouvez changer ici le texte qui sera présenté aux clients.
    Il " ++#~ "est possible d'y inclure les marqueurs suivants : ###COMMUNITY###, " ++#~ "###COMMUNITY_URL###, ###LEASETIME### et ###ACCEPT###.
    Cliquez ici tester la page d'accueil une fois celle-ci " ++#~ "sauvegardée." +diff --git a/feeds/luci/applications/luci-app-splash/po/he/splash.po b/feeds/luci/applications/luci-app-splash/po/he/splash.po +new file mode 100644 +index 0000000..bf7e2f0 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-splash/po/he/splash.po +@@ -0,0 +1,325 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Report-Msgid-Bugs-To: \n" ++"POT-Creation-Date: 2012-09-10 04:38+0200\n" ++"PO-Revision-Date: 2012-09-10 04:58+0200\n" ++"Last-Translator: Snoof \n" ++"Language-Team: LANGUAGE \n" ++"Language: he\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n != 1);\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "Accept" ++msgstr "" ++ ++msgid "" ++"Access to the internet might be possible nevertheless, because some " ++"activists of this project share their private internet connections. These " ++"few connections are shared between all users. That means available bandwidth " ++"is limited and because of this we ask you not to do any of the following:" ++msgstr "" ++"החיבור ל×ינטרנט יכול להת×פשר בגלל שכמה ×¤×¢×™×œ×™× ×©×œ הפרוייקט ×ž×©×ª×¤×™× ×ת חיבור " ++"×”×ינטרנט ×”×ישי שלה×. ××•×ª× ×—×™×‘×•×¨×™× ×ž×¢×˜×™× ×ž×©×•×ª×¤×™× ×‘×™×Ÿ כל המשתמשי×. משמע רוחב " ++"הפס הזמין מוגבל ולכן ×נו ×ž×‘×§×©×™× ×ž×›× ×œ× ×œ×¢×©×•×ª ×ת ×”×“×‘×¨×™× ×”×‘××™×:" ++ ++msgid "" ++"Access to the network is not guaranteed. It can be interrupted at any time " ++"without notice for any reason, for certain devices, and/or may be blocked " ++"for certain users." ++msgstr "" ++ ++msgid "Active Clients" ++msgstr "" ++ ++msgid "Allowed hosts/subnets" ++msgstr "" ++ ++msgid "" ++"As an alternative to editing the complete splash text you can also just " ++"include some custom text in the default splash page by entering it here." ++msgstr "" ++ ++msgid "" ++"Bandwidth limit for clients is only activated when both up- and download " ++"limit are set. Use a value of 0 here to completely disable this limitation. " ++"Whitelisted clients are not limited." ++msgstr "" ++ ++msgid "" ++"Become an active member of this community and help by operating your own node" ++msgstr "הפוך לחבר פעיל של הקהילה ועזור ×¢\"×™ תפעול נקודה של עצמך" ++ ++msgid "Blacklist" ++msgstr "" ++ ++msgid "Blocked" ++msgstr "חסומי×" ++ ++msgid "" ++"By accepting these rules you can use this network for %s hour(s). After this " ++"time you need to accept these rules again." ++msgstr "" ++ ++msgid "Clearance time" ++msgstr "" ++ ++msgid "Client-Splash" ++msgstr "" ++ ++msgid "" ++"Client-Splash is a hotspot authentification system for wireless mesh " ++"networks." ++msgstr "" ++ ++msgid "" ++"Clients are redirected to this page after they have accepted the splash. If " ++"this is left empty they are redirected to the page they had requested." ++msgstr "" ++ ++msgid "Clients download speed is limited to this value (kbyte/s)" ++msgstr "" ++ ++msgid "" ++"Clients that have accepted the splash are allowed to use the network for " ++"that many hours." ++msgstr "" ++ ++msgid "Clients upload speed is limited to this value (kbyte/s)" ++msgstr "" ++ ++msgid "Contact" ++msgstr "" ++ ++msgid "Decline" ++msgstr "דחה" ++ ++msgid "" ++"Destination hosts and networks that are excluded from splashing, i.e. they " ++"are always allowed." ++msgstr "" ++ ++msgid "Donate some money to help us keep this project alive." ++msgstr "×ª×¨×•× ×›×¡×£ על מנת שנוכל לשמור על הפרוייקט ×”×–×” ×—×™." ++ ++msgid "Download limit" ++msgstr "הגבלת הורדה" ++ ++msgid "Edit the complete splash text" ++msgstr "" ++ ++msgid "Fair Use Policy" ++msgstr "" ++ ++msgid "Firewall zone" ++msgstr "" ++ ++msgid "General" ++msgstr "כללי" ++ ++msgid "Get in %s with the operator of this access point." ++msgstr "" ++ ++msgid "Hostname" ++msgstr "" ++ ++msgid "IP Address" ++msgstr "כתובת IP" ++ ++msgid "" ++"If you operate your own wifi equipment use channels different from ours." ++msgstr "×× ×”× ×š מפעיל מכשירי wifi של עצמך השתמש ×‘×¢×¨×•×¦×™× ×©×•× ×™× ×ž×©×œ× ×•." ++ ++msgid "If you use this network on a regular basis we ask for your support:" ++msgstr "×× ×”× ×š משתמש ברשת זו על בסיס קבוע ×נו ×ž×‘×§×©×™× ×ת תמיכתך:" ++ ++msgid "Include your own text in the default splash" ++msgstr "" ++ ++msgid "Intercept client traffic on this Interface" ++msgstr "" ++ ++msgid "Interfaces" ++msgstr "ממשקי×" ++ ++msgid "Interfaces that are used for Splash." ++msgstr "" ++ ++msgid "" ++"KB/s (Download/Upload). You may be able to remove this limit by actively " ++"contributing to this project." ++msgstr "" ++"KB/s (הורדה/העל××”). הנך יכול להוריד מגבלה זו ×¢\"×™ תרומה פעילה לפרוייקט ×–×”." ++ ++msgid "Legally Prohibited Activities" ++msgstr "" ++ ++msgid "Legally Prohibited content" ++msgstr "" ++ ++msgid "MAC Address" ++msgstr "כתובת MAC" ++ ++msgid "MAC addresses in this list are blocked." ++msgstr "כתובות MAC ברשימה זו ×”×™× × ×—×¡×•×ž×™×." ++ ++msgid "" ++"MAC addresses of whitelisted clients. These do not need to accept the splash " ++"and are not bandwidth limited." ++msgstr "" ++ ++msgid "Netmask" ++msgstr "" ++ ++msgid "Network" ++msgstr "רשת" ++ ++msgid "No clients connected" ++msgstr "" ++ ++msgid "" ++"Please note that we are not an internet service provider but an experimental " ++"community network." ++msgstr "×©×™× ×œ×‘ ש×נו ×œ× ×¡×¤×§ ×ינטרנט ××œ× ×¨×©×ª חברתית נסיונית." ++ ++msgid "Policy" ++msgstr "מדיניות" ++ ++msgid "Redirect target" ++msgstr "" ++ ++msgid "Safety" ++msgstr "" ++ ++msgid "Save" ++msgstr "שמור" ++ ++msgid "Splash rules are integrated in this firewall zone" ++msgstr "" ++ ++msgid "Splashtext" ++msgstr "" ++ ++msgid "" ++"The network, like the Internet, is unencrypted and open. Each participant is " ++"responsible for the safety of their own connections and devices." ++msgstr "" ++ ++msgid "" ++"The open and free wireless network of volunteers (\"Operators\") provides " ++"the necessary equipment and Internet connections (\"Infrastructure\") at " ++"their own expense." ++msgstr "" ++ ++msgid "" ++"The operator claims no liability for loss of data, unauthorized access/" ++"damage to devices, or financial losses that participants may suffer from the " ++"use of the network." ++msgstr "" ++ ++msgid "" ++"The participant agrees to not perform any action and refrain from acts which " ++"may violate the law or infringe upon the rights of third parties." ++msgstr "" ++ ++msgid "" ++"The participant agrees to not transfer content over the network which " ++"violates the law." ++msgstr "" ++ ++msgid "" ++"The participant agrees to not use the network in any way which will harm the " ++"infrastructure, the network itself, its operators or other participants." ++msgstr "" ++ ++msgid "" ++"These Terms of Use govern the use of the network by its participants' " ++"computer, PDA, or similar device (\"Devices\") within the network." ++msgstr "" ++ ++msgid "Time remaining" ++msgstr "זמן שנותר" ++ ++msgid "" ++"To ask for the reason why you have been blocked or ask for access again you " ++"can try to contact the owner of this access point:" ++msgstr "" ++"על מנת לש×ול לסיבה שבגגלה נחסמת ×ו לבקש גישה מחדש הנך יכול לנסות ליצור קשר " ++"×¢× ×”×‘×¢×œ×™× ×©×œ נקודת גישה זו:" ++ ++msgid "Traffic in/out" ++msgstr "" ++ ++msgid "Upload limit" ++msgstr "הגבלת העל××”" ++ ++msgid "Usage Agreement" ++msgstr "" ++ ++msgid "Welcome" ++msgstr "×‘×¨×•×›×™× ×”×‘××™×" ++ ++msgid "Whitelist" ++msgstr "" ++ ++#, fuzzy ++msgid "You are now connected to the free wireless mesh network" ++msgstr "הנך מחובר כעת לרשת ×”×לחוטית החינמית" ++ ++msgid "" ++"You can enter your own text that is displayed to clients here.
    It is " ++"possible to use the following markers: ###COMMUNITY###, ###COMMUNITY_URL###, " ++"###CONTACTURL###, ###LEASETIME###, ###LIMIT### and ###ACCEPT###." ++msgstr "" ++ ++msgid "" ++"Your access to this network has been blocked, most likely because you did " ++"something that our rules explicitly forbid." ++msgstr "" ++"הגישה שלך לרשת זו נחסמה, ככל הנר××” בגלל שעשית משהו ×©×”×—×•×§×™× ×©×œ× ×• ××•×¡×¨×™× " ++"במפורש." ++ ++msgid "Your bandwidth is limited to" ++msgstr "רוחב הפס שלך מוגבל ל" ++ ++msgid "blacklisted" ++msgstr "" ++ ++msgid "expired" ++msgstr "פג תוקף" ++ ++msgid "optional when using host addresses" ++msgstr "" ++ ++msgid "perform any kind of illegal activities" ++msgstr "בצע פעילות בלתי חוקית מכל סוג שהו×" ++ ++msgid "splashed" ++msgstr "" ++ ++msgid "temporarily blocked" ++msgstr "×—×¡×•× ×–×ž× ×™×ª" ++ ++msgid "unknown" ++msgstr "×œ× ×™×“×•×¢" ++ ++msgid "use filesharing applications on this network" ++msgstr "השתמש בתוכנות לשיתוף ×§×‘×¦×™× ×‘×¨×©×ª זו." ++ ++msgid "waste bandwidth with unneccesary downloads or streams" ++msgstr "לבזבז רוחב פס ×¢× ×”×•×¨×“×•×ª ×ו ×©×™×“×•×¨×™× ×ž×™×•×ª×¨×™×" ++ ++msgid "whitelisted" ++msgstr "" ++ ++#~ msgid "By accepting these rules you can use this network for" ++#~ msgstr "×¢\"×™ הסכמתך ×œ×—×•×§×™× ×”×לו הנך יכול להשתמש ברשת זו בשביל" ++ ++#~ msgid "hour(s). After this time you need to accept these rules again." ++#~ msgstr "שעה(ות). ל×חר זמן ×–×” תצטרך לקבל ×ת ×”×—×•×§×™× ×”×לו שוב." ++ ++#~ msgid "the owner of this access point." ++#~ msgstr "×”×‘×¢×œ×™× ×©×œ נקודת גישה זו." +diff --git a/feeds/luci/applications/luci-app-splash/po/hu/splash.po b/feeds/luci/applications/luci-app-splash/po/hu/splash.po +new file mode 100644 +index 0000000..f2c7da1 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-splash/po/hu/splash.po +@@ -0,0 +1,303 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Last-Translator: Automatically generated\n" ++"Language-Team: none\n" ++"Language: \n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n != 1);\n" ++ ++msgid "Accept" ++msgstr "" ++ ++msgid "" ++"Access to the internet might be possible nevertheless, because some " ++"activists of this project share their private internet connections. These " ++"few connections are shared between all users. That means available bandwidth " ++"is limited and because of this we ask you not to do any of the following:" ++msgstr "" ++ ++msgid "" ++"Access to the network is not guaranteed. It can be interrupted at any time " ++"without notice for any reason, for certain devices, and/or may be blocked " ++"for certain users." ++msgstr "" ++ ++msgid "Active Clients" ++msgstr "" ++ ++msgid "Allowed hosts/subnets" ++msgstr "" ++ ++msgid "" ++"As an alternative to editing the complete splash text you can also just " ++"include some custom text in the default splash page by entering it here." ++msgstr "" ++ ++msgid "" ++"Bandwidth limit for clients is only activated when both up- and download " ++"limit are set. Use a value of 0 here to completely disable this limitation. " ++"Whitelisted clients are not limited." ++msgstr "" ++ ++msgid "" ++"Become an active member of this community and help by operating your own node" ++msgstr "" ++ ++msgid "Blacklist" ++msgstr "" ++ ++msgid "Blocked" ++msgstr "" ++ ++msgid "" ++"By accepting these rules you can use this network for %s hour(s). After this " ++"time you need to accept these rules again." ++msgstr "" ++ ++msgid "Clearance time" ++msgstr "" ++ ++msgid "Client-Splash" ++msgstr "" ++ ++msgid "" ++"Client-Splash is a hotspot authentification system for wireless mesh " ++"networks." ++msgstr "" ++ ++msgid "" ++"Clients are redirected to this page after they have accepted the splash. If " ++"this is left empty they are redirected to the page they had requested." ++msgstr "" ++ ++msgid "Clients download speed is limited to this value (kbyte/s)" ++msgstr "" ++ ++msgid "" ++"Clients that have accepted the splash are allowed to use the network for " ++"that many hours." ++msgstr "" ++ ++msgid "Clients upload speed is limited to this value (kbyte/s)" ++msgstr "" ++ ++msgid "Contact" ++msgstr "" ++ ++msgid "Decline" ++msgstr "" ++ ++msgid "" ++"Destination hosts and networks that are excluded from splashing, i.e. they " ++"are always allowed." ++msgstr "" ++ ++msgid "Donate some money to help us keep this project alive." ++msgstr "" ++ ++msgid "Download limit" ++msgstr "" ++ ++msgid "Edit the complete splash text" ++msgstr "" ++ ++msgid "Fair Use Policy" ++msgstr "" ++ ++msgid "Firewall zone" ++msgstr "" ++ ++msgid "General" ++msgstr "" ++ ++msgid "Get in %s with the operator of this access point." ++msgstr "" ++ ++msgid "Hostname" ++msgstr "" ++ ++msgid "IP Address" ++msgstr "" ++ ++msgid "" ++"If you operate your own wifi equipment use channels different from ours." ++msgstr "" ++ ++msgid "If you use this network on a regular basis we ask for your support:" ++msgstr "" ++ ++msgid "Include your own text in the default splash" ++msgstr "" ++ ++msgid "Intercept client traffic on this Interface" ++msgstr "" ++ ++msgid "Interfaces" ++msgstr "" ++ ++msgid "Interfaces that are used for Splash." ++msgstr "" ++ ++msgid "" ++"KB/s (Download/Upload). You may be able to remove this limit by actively " ++"contributing to this project." ++msgstr "" ++ ++msgid "Legally Prohibited Activities" ++msgstr "" ++ ++msgid "Legally Prohibited content" ++msgstr "" ++ ++msgid "MAC Address" ++msgstr "" ++ ++msgid "MAC addresses in this list are blocked." ++msgstr "" ++ ++msgid "" ++"MAC addresses of whitelisted clients. These do not need to accept the splash " ++"and are not bandwidth limited." ++msgstr "" ++ ++msgid "Netmask" ++msgstr "" ++ ++msgid "Network" ++msgstr "" ++ ++msgid "No clients connected" ++msgstr "" ++ ++msgid "" ++"Please note that we are not an internet service provider but an experimental " ++"community network." ++msgstr "" ++ ++msgid "Policy" ++msgstr "" ++ ++msgid "Redirect target" ++msgstr "" ++ ++msgid "Safety" ++msgstr "" ++ ++msgid "Save" ++msgstr "" ++ ++msgid "Splash rules are integrated in this firewall zone" ++msgstr "" ++ ++msgid "Splashtext" ++msgstr "" ++ ++msgid "" ++"The network, like the Internet, is unencrypted and open. Each participant is " ++"responsible for the safety of their own connections and devices." ++msgstr "" ++ ++msgid "" ++"The open and free wireless network of volunteers (\"Operators\") provides " ++"the necessary equipment and Internet connections (\"Infrastructure\") at " ++"their own expense." ++msgstr "" ++ ++msgid "" ++"The operator claims no liability for loss of data, unauthorized access/" ++"damage to devices, or financial losses that participants may suffer from the " ++"use of the network." ++msgstr "" ++ ++msgid "" ++"The participant agrees to not perform any action and refrain from acts which " ++"may violate the law or infringe upon the rights of third parties." ++msgstr "" ++ ++msgid "" ++"The participant agrees to not transfer content over the network which " ++"violates the law." ++msgstr "" ++ ++msgid "" ++"The participant agrees to not use the network in any way which will harm the " ++"infrastructure, the network itself, its operators or other participants." ++msgstr "" ++ ++msgid "" ++"These Terms of Use govern the use of the network by its participants' " ++"computer, PDA, or similar device (\"Devices\") within the network." ++msgstr "" ++ ++msgid "Time remaining" ++msgstr "" ++ ++msgid "" ++"To ask for the reason why you have been blocked or ask for access again you " ++"can try to contact the owner of this access point:" ++msgstr "" ++ ++msgid "Traffic in/out" ++msgstr "" ++ ++msgid "Upload limit" ++msgstr "" ++ ++msgid "Usage Agreement" ++msgstr "" ++ ++msgid "Welcome" ++msgstr "" ++ ++msgid "Whitelist" ++msgstr "" ++ ++msgid "You are now connected to the free wireless mesh network" ++msgstr "" ++ ++msgid "" ++"You can enter your own text that is displayed to clients here.
    It is " ++"possible to use the following markers: ###COMMUNITY###, ###COMMUNITY_URL###, " ++"###CONTACTURL###, ###LEASETIME###, ###LIMIT### and ###ACCEPT###." ++msgstr "" ++ ++msgid "" ++"Your access to this network has been blocked, most likely because you did " ++"something that our rules explicitly forbid." ++msgstr "" ++ ++msgid "Your bandwidth is limited to" ++msgstr "" ++ ++msgid "blacklisted" ++msgstr "" ++ ++msgid "expired" ++msgstr "" ++ ++msgid "optional when using host addresses" ++msgstr "" ++ ++msgid "perform any kind of illegal activities" ++msgstr "" ++ ++msgid "splashed" ++msgstr "" ++ ++msgid "temporarily blocked" ++msgstr "" ++ ++msgid "unknown" ++msgstr "" ++ ++msgid "use filesharing applications on this network" ++msgstr "" ++ ++msgid "waste bandwidth with unneccesary downloads or streams" ++msgstr "" ++ ++msgid "whitelisted" ++msgstr "" +diff --git a/feeds/luci/applications/luci-app-splash/po/it/splash.po b/feeds/luci/applications/luci-app-splash/po/it/splash.po +new file mode 100644 +index 0000000..8964b6c +--- /dev/null ++++ b/feeds/luci/applications/luci-app-splash/po/it/splash.po +@@ -0,0 +1,361 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Report-Msgid-Bugs-To: \n" ++"POT-Creation-Date: 2013-02-10 18:43+0200\n" ++"PO-Revision-Date: 2013-02-10 19:08+0200\n" ++"Last-Translator: Francesco <3gasas@gmail.com>\n" ++"Language-Team: LANGUAGE \n" ++"Language: it\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n != 1);\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "Accept" ++msgstr "Accetta" ++ ++msgid "" ++"Access to the internet might be possible nevertheless, because some " ++"activists of this project share their private internet connections. These " ++"few connections are shared between all users. That means available bandwidth " ++"is limited and because of this we ask you not to do any of the following:" ++msgstr "" ++"L'accesso a Internet potrebbe essere possibile, perché alcuni attivisti di " ++"questo progetto condividono le loro connessioni internet private​​. Queste " ++"poche connessioni sono condivise tra tutti gli utenti. Ciò significa che la " ++"larghezza di banda a disposizione è limitato e per questo vi chiediamo di " ++"non fare una delle seguenti operazioni:" ++ ++msgid "" ++"Access to the network is not guaranteed. It can be interrupted at any time " ++"without notice for any reason, for certain devices, and/or may be blocked " ++"for certain users." ++msgstr "" ++ ++msgid "Active Clients" ++msgstr "Attiva Clienti" ++ ++msgid "Allowed hosts/subnets" ++msgstr "Hosts/Sottoreti Consentite" ++ ++msgid "" ++"As an alternative to editing the complete splash text you can also just " ++"include some custom text in the default splash page by entering it here." ++msgstr "" ++ ++msgid "" ++"Bandwidth limit for clients is only activated when both up- and download " ++"limit are set. Use a value of 0 here to completely disable this limitation. " ++"Whitelisted clients are not limited." ++msgstr "" ++"Il limite della larghezza di banda per i clienti viene attivato solo quando " ++"entrambi i limiti di upload e download sono impostati. Utilizzare un valore " ++"pari a 0 qui per disattivare completamente questa limitazione. I client " ++"inseriti nell'elenco dei consentiti non sono limitati." ++ ++msgid "" ++"Become an active member of this community and help by operating your own node" ++msgstr "" ++"Diventare un membro attivo di questa comunità e aiutaci nell'utilizzo del " ++"proprio nodo" ++ ++msgid "Blacklist" ++msgstr "Lista Nera" ++ ++msgid "Blocked" ++msgstr "Bloccato" ++ ++msgid "" ++"By accepting these rules you can use this network for %s hour(s). After this " ++"time you need to accept these rules again." ++msgstr "" ++ ++msgid "Clearance time" ++msgstr "Spazio tempo" ++ ++msgid "Client-Splash" ++msgstr "Client-Splash" ++ ++msgid "" ++"Client-Splash is a hotspot authentification system for wireless mesh " ++"networks." ++msgstr "" ++"Client-Splash è un sistema di autenticazione hotspot per le reti mesh " ++"wireless." ++ ++msgid "" ++"Clients are redirected to this page after they have accepted the splash. If " ++"this is left empty they are redirected to the page they had requested." ++msgstr "" ++ ++msgid "Clients download speed is limited to this value (kbyte/s)" ++msgstr "La velocità di download dei clienti è limitata a tale valore (kbyte/s)" ++ ++msgid "" ++"Clients that have accepted the splash are allowed to use the network for " ++"that many hours." ++msgstr "" ++"I clienti che hanno accettato lo splash sono autorizzati ad utilizzare la " ++"rete anche per molte ore." ++ ++msgid "Clients upload speed is limited to this value (kbyte/s)" ++msgstr "La velocità di upload dei clienti è limitata a questo valore (kbyte/s)" ++ ++msgid "Contact" ++msgstr "Contatto" ++ ++msgid "Decline" ++msgstr "Rifiuta" ++ ++msgid "" ++"Destination hosts and networks that are excluded from splashing, i.e. they " ++"are always allowed." ++msgstr "" ++ ++msgid "Donate some money to help us keep this project alive." ++msgstr "" ++"Effettua una donazione per aiutare a mantenere in attività questo progetto." ++ ++msgid "Download limit" ++msgstr "Limite di download" ++ ++msgid "Edit the complete splash text" ++msgstr "" ++ ++msgid "Fair Use Policy" ++msgstr "" ++ ++msgid "Firewall zone" ++msgstr "Zona Firewall" ++ ++msgid "General" ++msgstr "Generale" ++ ++msgid "Get in %s with the operator of this access point." ++msgstr "" ++ ++msgid "Hostname" ++msgstr "Nome Host" ++ ++msgid "IP Address" ++msgstr "Indirizzo IP" ++ ++msgid "" ++"If you operate your own wifi equipment use channels different from ours." ++msgstr "" ++"Se si utilizza una propria apparecchiatura wifi utilizzare canali differenti " ++"dalle nostre." ++ ++msgid "If you use this network on a regular basis we ask for your support:" ++msgstr "" ++"Se si utilizza questa rete su base regolare vi chiediamo il vostro sostegno:" ++ ++msgid "Include your own text in the default splash" ++msgstr "" ++ ++msgid "Intercept client traffic on this Interface" ++msgstr "Intercettare il traffico cliente su questa interfaccia" ++ ++msgid "Interfaces" ++msgstr "Interfacce" ++ ++msgid "Interfaces that are used for Splash." ++msgstr "Interfacce usate per lo Splash." ++ ++msgid "" ++"KB/s (Download/Upload). You may be able to remove this limit by actively " ++"contributing to this project." ++msgstr "" ++"KB/s (Download/Upload). Si può essere in grado di rimuovere questo limite, " ++"contribuendo attivamente a questo progetto." ++ ++msgid "Legally Prohibited Activities" ++msgstr "" ++ ++msgid "Legally Prohibited content" ++msgstr "" ++ ++msgid "MAC Address" ++msgstr "Indirizzo MAC" ++ ++msgid "MAC addresses in this list are blocked." ++msgstr "gli indirizzi MAC in questo elenco sono bloccati." ++ ++msgid "" ++"MAC addresses of whitelisted clients. These do not need to accept the splash " ++"and are not bandwidth limited." ++msgstr "" ++"Gli indirizzi MAC dei clienti dell'elenco consentito. Questi non hanno " ++"bisogno di accettare lo splash e non hanno la larghezza di banda limitata." ++ ++msgid "Netmask" ++msgstr "Maschera Rete" ++ ++msgid "Network" ++msgstr "Rete" ++ ++msgid "No clients connected" ++msgstr "Nessun cliente connesso" ++ ++msgid "" ++"Please note that we are not an internet service provider but an experimental " ++"community network." ++msgstr "" ++"Si prega di notare che non siamo un provider di servizi internet, ma una " ++"rete di comunità sperimentale." ++ ++msgid "Policy" ++msgstr "Politica" ++ ++msgid "Redirect target" ++msgstr "" ++ ++msgid "Safety" ++msgstr "" ++ ++msgid "Save" ++msgstr "Salva" ++ ++msgid "Splash rules are integrated in this firewall zone" ++msgstr "Le regole Splash sono integrate in questa zona firewall" ++ ++msgid "Splashtext" ++msgstr "Splashtext" ++ ++msgid "" ++"The network, like the Internet, is unencrypted and open. Each participant is " ++"responsible for the safety of their own connections and devices." ++msgstr "" ++ ++msgid "" ++"The open and free wireless network of volunteers (\"Operators\") provides " ++"the necessary equipment and Internet connections (\"Infrastructure\") at " ++"their own expense." ++msgstr "" ++ ++msgid "" ++"The operator claims no liability for loss of data, unauthorized access/" ++"damage to devices, or financial losses that participants may suffer from the " ++"use of the network." ++msgstr "" ++ ++msgid "" ++"The participant agrees to not perform any action and refrain from acts which " ++"may violate the law or infringe upon the rights of third parties." ++msgstr "" ++ ++msgid "" ++"The participant agrees to not transfer content over the network which " ++"violates the law." ++msgstr "" ++ ++msgid "" ++"The participant agrees to not use the network in any way which will harm the " ++"infrastructure, the network itself, its operators or other participants." ++msgstr "" ++ ++msgid "" ++"These Terms of Use govern the use of the network by its participants' " ++"computer, PDA, or similar device (\"Devices\") within the network." ++msgstr "" ++ ++msgid "Time remaining" ++msgstr "Tempo restante" ++ ++msgid "" ++"To ask for the reason why you have been blocked or ask for access again you " ++"can try to contact the owner of this access point:" ++msgstr "" ++"Per richiedere il motivo per cui sono state bloccate o chiedere l'accesso di " ++"nuovo si può provare a contattare il proprietario di questo punto di accesso:" ++ ++msgid "Traffic in/out" ++msgstr "Traffico ingresso/uscita" ++ ++msgid "Upload limit" ++msgstr "Limite di upload" ++ ++msgid "Usage Agreement" ++msgstr "" ++ ++msgid "Welcome" ++msgstr "Benvenuti" ++ ++msgid "Whitelist" ++msgstr "Elenco Consentiti" ++ ++msgid "You are now connected to the free wireless mesh network" ++msgstr "Ora si è connessi alla rete mesh wireless gratuita" ++ ++msgid "" ++"You can enter your own text that is displayed to clients here.
    It is " ++"possible to use the following markers: ###COMMUNITY###, ###COMMUNITY_URL###, " ++"###CONTACTURL###, ###LEASETIME###, ###LIMIT### and ###ACCEPT###." ++msgstr "" ++"È possibile inserire il proprio testo che viene visualizzato ai clienti qui " ++"
    È possibile utilizzare i seguenti marcatori.: ###COMMUNITY###, " ++"###COMMUNITY_URL###, ###CONTACTURL###, ###LEASETIME###, ###LIMIT### and " ++"###ACCEPT###." ++ ++msgid "" ++"Your access to this network has been blocked, most likely because you did " ++"something that our rules explicitly forbid." ++msgstr "" ++"L'accesso a questa rete è stata bloccata, molto probabilmente perché hai " ++"fatto qualcosa che le nostre regole vietano espressamente." ++ ++msgid "Your bandwidth is limited to" ++msgstr "La tua larghezza di banda è limitata a" ++ ++msgid "blacklisted" ++msgstr "Lista Nera" ++ ++msgid "expired" ++msgstr "scaduto" ++ ++msgid "optional when using host addresses" ++msgstr "opzionale quando si utilizza indirizzi host" ++ ++msgid "perform any kind of illegal activities" ++msgstr "eseguire qualsiasi tipo di attività illegali" ++ ++msgid "splashed" ++msgstr "splashed" ++ ++msgid "temporarily blocked" ++msgstr "temporaneamente bloccato" ++ ++msgid "unknown" ++msgstr "sconosciuto" ++ ++msgid "use filesharing applications on this network" ++msgstr "utilizzare le applicazioni di filesharing su questa rete" ++ ++msgid "waste bandwidth with unneccesary downloads or streams" ++msgstr "sprecate banda con download o flussi inutili" ++ ++msgid "whitelisted" ++msgstr "Elenco contensiti" ++ ++#~ msgid "" ++#~ "Hosts and Networks that are listed here are excluded from splashing, i.e. " ++#~ "they are always allowed." ++#~ msgstr "" ++#~ "Le reti e gli host che sono elencate qui sono esclusi dallo splashing, cio* " ++#~ "sono sempre ammessi." ++ ++#~ msgid "By accepting these rules you can use this network for" ++#~ msgstr "Accettando queste regole è possibile utilizzare questa rete per" ++ ++#~ msgid "Edit Splash text" ++#~ msgstr "Modifica il testo Splash" ++ ++#~ msgid "hour(s). After this time you need to accept these rules again." ++#~ msgstr "" ++#~ "ora(e). Trascorso questo tempo è necessario accettare queste regole di " ++#~ "nuovo." ++ ++#~ msgid "the owner of this access point." ++#~ msgstr "il proprietario di questo punto di accesso." +diff --git a/feeds/luci/applications/luci-app-splash/po/ja/splash.po b/feeds/luci/applications/luci-app-splash/po/ja/splash.po +new file mode 100644 +index 0000000..615be16 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-splash/po/ja/splash.po +@@ -0,0 +1,292 @@ ++msgid "Accept" ++msgstr "" ++ ++msgid "" ++"Access to the internet might be possible nevertheless, because some " ++"activists of this project share their private internet connections. These " ++"few connections are shared between all users. That means available bandwidth " ++"is limited and because of this we ask you not to do any of the following:" ++msgstr "" ++ ++msgid "" ++"Access to the network is not guaranteed. It can be interrupted at any time " ++"without notice for any reason, for certain devices, and/or may be blocked " ++"for certain users." ++msgstr "" ++ ++msgid "Active Clients" ++msgstr "" ++ ++msgid "Allowed hosts/subnets" ++msgstr "" ++ ++msgid "" ++"As an alternative to editing the complete splash text you can also just " ++"include some custom text in the default splash page by entering it here." ++msgstr "" ++ ++msgid "" ++"Bandwidth limit for clients is only activated when both up- and download " ++"limit are set. Use a value of 0 here to completely disable this limitation. " ++"Whitelisted clients are not limited." ++msgstr "" ++ ++msgid "" ++"Become an active member of this community and help by operating your own node" ++msgstr "" ++ ++msgid "Blacklist" ++msgstr "" ++ ++msgid "Blocked" ++msgstr "" ++ ++msgid "" ++"By accepting these rules you can use this network for %s hour(s). After this " ++"time you need to accept these rules again." ++msgstr "" ++ ++msgid "Clearance time" ++msgstr "" ++ ++msgid "Client-Splash" ++msgstr "" ++ ++msgid "" ++"Client-Splash is a hotspot authentification system for wireless mesh " ++"networks." ++msgstr "" ++ ++msgid "" ++"Clients are redirected to this page after they have accepted the splash. If " ++"this is left empty they are redirected to the page they had requested." ++msgstr "" ++ ++msgid "Clients download speed is limited to this value (kbyte/s)" ++msgstr "" ++ ++msgid "" ++"Clients that have accepted the splash are allowed to use the network for " ++"that many hours." ++msgstr "" ++ ++msgid "Clients upload speed is limited to this value (kbyte/s)" ++msgstr "" ++ ++msgid "Contact" ++msgstr "" ++ ++msgid "Decline" ++msgstr "" ++ ++msgid "" ++"Destination hosts and networks that are excluded from splashing, i.e. they " ++"are always allowed." ++msgstr "" ++ ++msgid "Donate some money to help us keep this project alive." ++msgstr "" ++ ++msgid "Download limit" ++msgstr "" ++ ++msgid "Edit the complete splash text" ++msgstr "" ++ ++msgid "Fair Use Policy" ++msgstr "" ++ ++msgid "Firewall zone" ++msgstr "" ++ ++msgid "General" ++msgstr "" ++ ++msgid "Get in %s with the operator of this access point." ++msgstr "" ++ ++msgid "Hostname" ++msgstr "" ++ ++msgid "IP Address" ++msgstr "" ++ ++msgid "" ++"If you operate your own wifi equipment use channels different from ours." ++msgstr "" ++ ++msgid "If you use this network on a regular basis we ask for your support:" ++msgstr "" ++ ++msgid "Include your own text in the default splash" ++msgstr "" ++ ++msgid "Intercept client traffic on this Interface" ++msgstr "" ++ ++msgid "Interfaces" ++msgstr "" ++ ++msgid "Interfaces that are used for Splash." ++msgstr "" ++ ++msgid "" ++"KB/s (Download/Upload). You may be able to remove this limit by actively " ++"contributing to this project." ++msgstr "" ++ ++msgid "Legally Prohibited Activities" ++msgstr "" ++ ++msgid "Legally Prohibited content" ++msgstr "" ++ ++msgid "MAC Address" ++msgstr "" ++ ++msgid "MAC addresses in this list are blocked." ++msgstr "" ++ ++msgid "" ++"MAC addresses of whitelisted clients. These do not need to accept the splash " ++"and are not bandwidth limited." ++msgstr "" ++ ++msgid "Netmask" ++msgstr "" ++ ++msgid "Network" ++msgstr "" ++ ++msgid "No clients connected" ++msgstr "" ++ ++msgid "" ++"Please note that we are not an internet service provider but an experimental " ++"community network." ++msgstr "" ++ ++msgid "Policy" ++msgstr "" ++ ++msgid "Redirect target" ++msgstr "" ++ ++msgid "Safety" ++msgstr "" ++ ++msgid "Save" ++msgstr "" ++ ++msgid "Splash rules are integrated in this firewall zone" ++msgstr "" ++ ++msgid "Splashtext" ++msgstr "" ++ ++msgid "" ++"The network, like the Internet, is unencrypted and open. Each participant is " ++"responsible for the safety of their own connections and devices." ++msgstr "" ++ ++msgid "" ++"The open and free wireless network of volunteers (\"Operators\") provides " ++"the necessary equipment and Internet connections (\"Infrastructure\") at " ++"their own expense." ++msgstr "" ++ ++msgid "" ++"The operator claims no liability for loss of data, unauthorized access/" ++"damage to devices, or financial losses that participants may suffer from the " ++"use of the network." ++msgstr "" ++ ++msgid "" ++"The participant agrees to not perform any action and refrain from acts which " ++"may violate the law or infringe upon the rights of third parties." ++msgstr "" ++ ++msgid "" ++"The participant agrees to not transfer content over the network which " ++"violates the law." ++msgstr "" ++ ++msgid "" ++"The participant agrees to not use the network in any way which will harm the " ++"infrastructure, the network itself, its operators or other participants." ++msgstr "" ++ ++msgid "" ++"These Terms of Use govern the use of the network by its participants' " ++"computer, PDA, or similar device (\"Devices\") within the network." ++msgstr "" ++ ++msgid "Time remaining" ++msgstr "" ++ ++msgid "" ++"To ask for the reason why you have been blocked or ask for access again you " ++"can try to contact the owner of this access point:" ++msgstr "" ++ ++msgid "Traffic in/out" ++msgstr "" ++ ++msgid "Upload limit" ++msgstr "" ++ ++msgid "Usage Agreement" ++msgstr "" ++ ++msgid "Welcome" ++msgstr "" ++ ++msgid "Whitelist" ++msgstr "" ++ ++msgid "You are now connected to the free wireless mesh network" ++msgstr "" ++ ++msgid "" ++"You can enter your own text that is displayed to clients here.
    It is " ++"possible to use the following markers: ###COMMUNITY###, ###COMMUNITY_URL###, " ++"###CONTACTURL###, ###LEASETIME###, ###LIMIT### and ###ACCEPT###." ++msgstr "" ++ ++msgid "" ++"Your access to this network has been blocked, most likely because you did " ++"something that our rules explicitly forbid." ++msgstr "" ++ ++msgid "Your bandwidth is limited to" ++msgstr "" ++ ++msgid "blacklisted" ++msgstr "" ++ ++msgid "expired" ++msgstr "" ++ ++msgid "optional when using host addresses" ++msgstr "" ++ ++msgid "perform any kind of illegal activities" ++msgstr "" ++ ++msgid "splashed" ++msgstr "" ++ ++msgid "temporarily blocked" ++msgstr "" ++ ++msgid "unknown" ++msgstr "" ++ ++msgid "use filesharing applications on this network" ++msgstr "" ++ ++msgid "waste bandwidth with unneccesary downloads or streams" ++msgstr "" ++ ++msgid "whitelisted" ++msgstr "" +diff --git a/feeds/luci/applications/luci-app-splash/po/ms/splash.po b/feeds/luci/applications/luci-app-splash/po/ms/splash.po +new file mode 100644 +index 0000000..615be16 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-splash/po/ms/splash.po +@@ -0,0 +1,292 @@ ++msgid "Accept" ++msgstr "" ++ ++msgid "" ++"Access to the internet might be possible nevertheless, because some " ++"activists of this project share their private internet connections. These " ++"few connections are shared between all users. That means available bandwidth " ++"is limited and because of this we ask you not to do any of the following:" ++msgstr "" ++ ++msgid "" ++"Access to the network is not guaranteed. It can be interrupted at any time " ++"without notice for any reason, for certain devices, and/or may be blocked " ++"for certain users." ++msgstr "" ++ ++msgid "Active Clients" ++msgstr "" ++ ++msgid "Allowed hosts/subnets" ++msgstr "" ++ ++msgid "" ++"As an alternative to editing the complete splash text you can also just " ++"include some custom text in the default splash page by entering it here." ++msgstr "" ++ ++msgid "" ++"Bandwidth limit for clients is only activated when both up- and download " ++"limit are set. Use a value of 0 here to completely disable this limitation. " ++"Whitelisted clients are not limited." ++msgstr "" ++ ++msgid "" ++"Become an active member of this community and help by operating your own node" ++msgstr "" ++ ++msgid "Blacklist" ++msgstr "" ++ ++msgid "Blocked" ++msgstr "" ++ ++msgid "" ++"By accepting these rules you can use this network for %s hour(s). After this " ++"time you need to accept these rules again." ++msgstr "" ++ ++msgid "Clearance time" ++msgstr "" ++ ++msgid "Client-Splash" ++msgstr "" ++ ++msgid "" ++"Client-Splash is a hotspot authentification system for wireless mesh " ++"networks." ++msgstr "" ++ ++msgid "" ++"Clients are redirected to this page after they have accepted the splash. If " ++"this is left empty they are redirected to the page they had requested." ++msgstr "" ++ ++msgid "Clients download speed is limited to this value (kbyte/s)" ++msgstr "" ++ ++msgid "" ++"Clients that have accepted the splash are allowed to use the network for " ++"that many hours." ++msgstr "" ++ ++msgid "Clients upload speed is limited to this value (kbyte/s)" ++msgstr "" ++ ++msgid "Contact" ++msgstr "" ++ ++msgid "Decline" ++msgstr "" ++ ++msgid "" ++"Destination hosts and networks that are excluded from splashing, i.e. they " ++"are always allowed." ++msgstr "" ++ ++msgid "Donate some money to help us keep this project alive." ++msgstr "" ++ ++msgid "Download limit" ++msgstr "" ++ ++msgid "Edit the complete splash text" ++msgstr "" ++ ++msgid "Fair Use Policy" ++msgstr "" ++ ++msgid "Firewall zone" ++msgstr "" ++ ++msgid "General" ++msgstr "" ++ ++msgid "Get in %s with the operator of this access point." ++msgstr "" ++ ++msgid "Hostname" ++msgstr "" ++ ++msgid "IP Address" ++msgstr "" ++ ++msgid "" ++"If you operate your own wifi equipment use channels different from ours." ++msgstr "" ++ ++msgid "If you use this network on a regular basis we ask for your support:" ++msgstr "" ++ ++msgid "Include your own text in the default splash" ++msgstr "" ++ ++msgid "Intercept client traffic on this Interface" ++msgstr "" ++ ++msgid "Interfaces" ++msgstr "" ++ ++msgid "Interfaces that are used for Splash." ++msgstr "" ++ ++msgid "" ++"KB/s (Download/Upload). You may be able to remove this limit by actively " ++"contributing to this project." ++msgstr "" ++ ++msgid "Legally Prohibited Activities" ++msgstr "" ++ ++msgid "Legally Prohibited content" ++msgstr "" ++ ++msgid "MAC Address" ++msgstr "" ++ ++msgid "MAC addresses in this list are blocked." ++msgstr "" ++ ++msgid "" ++"MAC addresses of whitelisted clients. These do not need to accept the splash " ++"and are not bandwidth limited." ++msgstr "" ++ ++msgid "Netmask" ++msgstr "" ++ ++msgid "Network" ++msgstr "" ++ ++msgid "No clients connected" ++msgstr "" ++ ++msgid "" ++"Please note that we are not an internet service provider but an experimental " ++"community network." ++msgstr "" ++ ++msgid "Policy" ++msgstr "" ++ ++msgid "Redirect target" ++msgstr "" ++ ++msgid "Safety" ++msgstr "" ++ ++msgid "Save" ++msgstr "" ++ ++msgid "Splash rules are integrated in this firewall zone" ++msgstr "" ++ ++msgid "Splashtext" ++msgstr "" ++ ++msgid "" ++"The network, like the Internet, is unencrypted and open. Each participant is " ++"responsible for the safety of their own connections and devices." ++msgstr "" ++ ++msgid "" ++"The open and free wireless network of volunteers (\"Operators\") provides " ++"the necessary equipment and Internet connections (\"Infrastructure\") at " ++"their own expense." ++msgstr "" ++ ++msgid "" ++"The operator claims no liability for loss of data, unauthorized access/" ++"damage to devices, or financial losses that participants may suffer from the " ++"use of the network." ++msgstr "" ++ ++msgid "" ++"The participant agrees to not perform any action and refrain from acts which " ++"may violate the law or infringe upon the rights of third parties." ++msgstr "" ++ ++msgid "" ++"The participant agrees to not transfer content over the network which " ++"violates the law." ++msgstr "" ++ ++msgid "" ++"The participant agrees to not use the network in any way which will harm the " ++"infrastructure, the network itself, its operators or other participants." ++msgstr "" ++ ++msgid "" ++"These Terms of Use govern the use of the network by its participants' " ++"computer, PDA, or similar device (\"Devices\") within the network." ++msgstr "" ++ ++msgid "Time remaining" ++msgstr "" ++ ++msgid "" ++"To ask for the reason why you have been blocked or ask for access again you " ++"can try to contact the owner of this access point:" ++msgstr "" ++ ++msgid "Traffic in/out" ++msgstr "" ++ ++msgid "Upload limit" ++msgstr "" ++ ++msgid "Usage Agreement" ++msgstr "" ++ ++msgid "Welcome" ++msgstr "" ++ ++msgid "Whitelist" ++msgstr "" ++ ++msgid "You are now connected to the free wireless mesh network" ++msgstr "" ++ ++msgid "" ++"You can enter your own text that is displayed to clients here.
    It is " ++"possible to use the following markers: ###COMMUNITY###, ###COMMUNITY_URL###, " ++"###CONTACTURL###, ###LEASETIME###, ###LIMIT### and ###ACCEPT###." ++msgstr "" ++ ++msgid "" ++"Your access to this network has been blocked, most likely because you did " ++"something that our rules explicitly forbid." ++msgstr "" ++ ++msgid "Your bandwidth is limited to" ++msgstr "" ++ ++msgid "blacklisted" ++msgstr "" ++ ++msgid "expired" ++msgstr "" ++ ++msgid "optional when using host addresses" ++msgstr "" ++ ++msgid "perform any kind of illegal activities" ++msgstr "" ++ ++msgid "splashed" ++msgstr "" ++ ++msgid "temporarily blocked" ++msgstr "" ++ ++msgid "unknown" ++msgstr "" ++ ++msgid "use filesharing applications on this network" ++msgstr "" ++ ++msgid "waste bandwidth with unneccesary downloads or streams" ++msgstr "" ++ ++msgid "whitelisted" ++msgstr "" +diff --git a/feeds/luci/applications/luci-app-splash/po/no/splash.po b/feeds/luci/applications/luci-app-splash/po/no/splash.po +new file mode 100644 +index 0000000..615be16 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-splash/po/no/splash.po +@@ -0,0 +1,292 @@ ++msgid "Accept" ++msgstr "" ++ ++msgid "" ++"Access to the internet might be possible nevertheless, because some " ++"activists of this project share their private internet connections. These " ++"few connections are shared between all users. That means available bandwidth " ++"is limited and because of this we ask you not to do any of the following:" ++msgstr "" ++ ++msgid "" ++"Access to the network is not guaranteed. It can be interrupted at any time " ++"without notice for any reason, for certain devices, and/or may be blocked " ++"for certain users." ++msgstr "" ++ ++msgid "Active Clients" ++msgstr "" ++ ++msgid "Allowed hosts/subnets" ++msgstr "" ++ ++msgid "" ++"As an alternative to editing the complete splash text you can also just " ++"include some custom text in the default splash page by entering it here." ++msgstr "" ++ ++msgid "" ++"Bandwidth limit for clients is only activated when both up- and download " ++"limit are set. Use a value of 0 here to completely disable this limitation. " ++"Whitelisted clients are not limited." ++msgstr "" ++ ++msgid "" ++"Become an active member of this community and help by operating your own node" ++msgstr "" ++ ++msgid "Blacklist" ++msgstr "" ++ ++msgid "Blocked" ++msgstr "" ++ ++msgid "" ++"By accepting these rules you can use this network for %s hour(s). After this " ++"time you need to accept these rules again." ++msgstr "" ++ ++msgid "Clearance time" ++msgstr "" ++ ++msgid "Client-Splash" ++msgstr "" ++ ++msgid "" ++"Client-Splash is a hotspot authentification system for wireless mesh " ++"networks." ++msgstr "" ++ ++msgid "" ++"Clients are redirected to this page after they have accepted the splash. If " ++"this is left empty they are redirected to the page they had requested." ++msgstr "" ++ ++msgid "Clients download speed is limited to this value (kbyte/s)" ++msgstr "" ++ ++msgid "" ++"Clients that have accepted the splash are allowed to use the network for " ++"that many hours." ++msgstr "" ++ ++msgid "Clients upload speed is limited to this value (kbyte/s)" ++msgstr "" ++ ++msgid "Contact" ++msgstr "" ++ ++msgid "Decline" ++msgstr "" ++ ++msgid "" ++"Destination hosts and networks that are excluded from splashing, i.e. they " ++"are always allowed." ++msgstr "" ++ ++msgid "Donate some money to help us keep this project alive." ++msgstr "" ++ ++msgid "Download limit" ++msgstr "" ++ ++msgid "Edit the complete splash text" ++msgstr "" ++ ++msgid "Fair Use Policy" ++msgstr "" ++ ++msgid "Firewall zone" ++msgstr "" ++ ++msgid "General" ++msgstr "" ++ ++msgid "Get in %s with the operator of this access point." ++msgstr "" ++ ++msgid "Hostname" ++msgstr "" ++ ++msgid "IP Address" ++msgstr "" ++ ++msgid "" ++"If you operate your own wifi equipment use channels different from ours." ++msgstr "" ++ ++msgid "If you use this network on a regular basis we ask for your support:" ++msgstr "" ++ ++msgid "Include your own text in the default splash" ++msgstr "" ++ ++msgid "Intercept client traffic on this Interface" ++msgstr "" ++ ++msgid "Interfaces" ++msgstr "" ++ ++msgid "Interfaces that are used for Splash." ++msgstr "" ++ ++msgid "" ++"KB/s (Download/Upload). You may be able to remove this limit by actively " ++"contributing to this project." ++msgstr "" ++ ++msgid "Legally Prohibited Activities" ++msgstr "" ++ ++msgid "Legally Prohibited content" ++msgstr "" ++ ++msgid "MAC Address" ++msgstr "" ++ ++msgid "MAC addresses in this list are blocked." ++msgstr "" ++ ++msgid "" ++"MAC addresses of whitelisted clients. These do not need to accept the splash " ++"and are not bandwidth limited." ++msgstr "" ++ ++msgid "Netmask" ++msgstr "" ++ ++msgid "Network" ++msgstr "" ++ ++msgid "No clients connected" ++msgstr "" ++ ++msgid "" ++"Please note that we are not an internet service provider but an experimental " ++"community network." ++msgstr "" ++ ++msgid "Policy" ++msgstr "" ++ ++msgid "Redirect target" ++msgstr "" ++ ++msgid "Safety" ++msgstr "" ++ ++msgid "Save" ++msgstr "" ++ ++msgid "Splash rules are integrated in this firewall zone" ++msgstr "" ++ ++msgid "Splashtext" ++msgstr "" ++ ++msgid "" ++"The network, like the Internet, is unencrypted and open. Each participant is " ++"responsible for the safety of their own connections and devices." ++msgstr "" ++ ++msgid "" ++"The open and free wireless network of volunteers (\"Operators\") provides " ++"the necessary equipment and Internet connections (\"Infrastructure\") at " ++"their own expense." ++msgstr "" ++ ++msgid "" ++"The operator claims no liability for loss of data, unauthorized access/" ++"damage to devices, or financial losses that participants may suffer from the " ++"use of the network." ++msgstr "" ++ ++msgid "" ++"The participant agrees to not perform any action and refrain from acts which " ++"may violate the law or infringe upon the rights of third parties." ++msgstr "" ++ ++msgid "" ++"The participant agrees to not transfer content over the network which " ++"violates the law." ++msgstr "" ++ ++msgid "" ++"The participant agrees to not use the network in any way which will harm the " ++"infrastructure, the network itself, its operators or other participants." ++msgstr "" ++ ++msgid "" ++"These Terms of Use govern the use of the network by its participants' " ++"computer, PDA, or similar device (\"Devices\") within the network." ++msgstr "" ++ ++msgid "Time remaining" ++msgstr "" ++ ++msgid "" ++"To ask for the reason why you have been blocked or ask for access again you " ++"can try to contact the owner of this access point:" ++msgstr "" ++ ++msgid "Traffic in/out" ++msgstr "" ++ ++msgid "Upload limit" ++msgstr "" ++ ++msgid "Usage Agreement" ++msgstr "" ++ ++msgid "Welcome" ++msgstr "" ++ ++msgid "Whitelist" ++msgstr "" ++ ++msgid "You are now connected to the free wireless mesh network" ++msgstr "" ++ ++msgid "" ++"You can enter your own text that is displayed to clients here.
    It is " ++"possible to use the following markers: ###COMMUNITY###, ###COMMUNITY_URL###, " ++"###CONTACTURL###, ###LEASETIME###, ###LIMIT### and ###ACCEPT###." ++msgstr "" ++ ++msgid "" ++"Your access to this network has been blocked, most likely because you did " ++"something that our rules explicitly forbid." ++msgstr "" ++ ++msgid "Your bandwidth is limited to" ++msgstr "" ++ ++msgid "blacklisted" ++msgstr "" ++ ++msgid "expired" ++msgstr "" ++ ++msgid "optional when using host addresses" ++msgstr "" ++ ++msgid "perform any kind of illegal activities" ++msgstr "" ++ ++msgid "splashed" ++msgstr "" ++ ++msgid "temporarily blocked" ++msgstr "" ++ ++msgid "unknown" ++msgstr "" ++ ++msgid "use filesharing applications on this network" ++msgstr "" ++ ++msgid "waste bandwidth with unneccesary downloads or streams" ++msgstr "" ++ ++msgid "whitelisted" ++msgstr "" +diff --git a/feeds/luci/applications/luci-app-splash/po/pl/splash.po b/feeds/luci/applications/luci-app-splash/po/pl/splash.po +new file mode 100644 +index 0000000..6856884 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-splash/po/pl/splash.po +@@ -0,0 +1,385 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Report-Msgid-Bugs-To: \n" ++"POT-Creation-Date: 2012-08-24 06:17+0200\n" ++"PO-Revision-Date: 2014-05-05 04:17+0200\n" ++"Last-Translator: piosl \n" ++"Language-Team: LANGUAGE \n" ++"Language: pl\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 " ++"|| n%100>=20) ? 1 : 2);\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "Accept" ++msgstr "Akceptuj" ++ ++msgid "" ++"Access to the internet might be possible nevertheless, because some " ++"activists of this project share their private internet connections. These " ++"few connections are shared between all users. That means available bandwidth " ++"is limited and because of this we ask you not to do any of the following:" ++msgstr "" ++"Dostęp do internetu może być mimo wszystko możliwy, ponieważ niektórzy " ++"aktywiści tego projektu dzielą się swoimi prywatnymi łączami. Te kilka łącz " ++"jest rozdzielanych między wszystkich użytkowników. Oznacza to, że transfer " ++"jest ograniczony. Z tego powodu prosimy, abyś nie:" ++ ++msgid "" ++"Access to the network is not guaranteed. It can be interrupted at any time " ++"without notice for any reason, for certain devices, and/or may be blocked " ++"for certain users." ++msgstr "" ++"Dostęp do sieci nie jest gwarantowany. Może być przerwany w każdej chwili i " ++"bez podawania jakiegokolwiek powodu, dla niektórych urządzeń i/lub " ++"niektórych użytkowników." ++ ++msgid "Active Clients" ++msgstr "Aktywni klienci" ++ ++msgid "Allowed hosts/subnets" ++msgstr "Dozwolone hosty/podsieci" ++ ++msgid "" ++"As an alternative to editing the complete splash text you can also just " ++"include some custom text in the default splash page by entering it here." ++msgstr "" ++"Jako alternatywę do edycji pełnego tekstu powitalnego możesz po prostu " ++"zawrzeć własny tekst wpisując go tutaj." ++ ++msgid "" ++"Bandwidth limit for clients is only activated when both up- and download " ++"limit are set. Use a value of 0 here to completely disable this limitation. " ++"Whitelisted clients are not limited." ++msgstr "" ++"Limit transferu dla klientów jest aktywny tylko jeśli aktywne są oba limity " ++"- pobierania i wysyłania. Ustaw 0, aby całkowicie wyłączyć to ograniczenie. " ++"Nie dotyczy ono klientów z białej listy." ++ ++msgid "" ++"Become an active member of this community and help by operating your own node" ++msgstr "" ++"Zostań aktywnym członkiem tej społeczności i pomóż, zakładając własny węzeł" ++ ++msgid "Blacklist" ++msgstr "Czarna lista" ++ ++msgid "Blocked" ++msgstr "Zablokowane" ++ ++msgid "" ++"By accepting these rules you can use this network for %s hour(s). After this " ++"time you need to accept these rules again." ++msgstr "" ++"Akceptując te zasady można korzystać z tej sieci na %s godzin(y). Po tym " ++"czasie należy zaakceptować te zasady ponownie." ++ ++# z niemieckiego tłumaczenia ++#, fuzzy ++msgid "Clearance time" ++msgstr "Czas wyzwalacza" ++ ++msgid "Client-Splash" ++msgstr "Splash kliencki" ++ ++# nie ma słowa "autentykacja" - to brzydka kalka z angielskiego. ++msgid "" ++"Client-Splash is a hotspot authentification system for wireless mesh " ++"networks." ++msgstr "" ++"Klient Splash - sposób uwierzytelniania użytkowników dla sieci WiFi oparty o " ++"wyświetlanie komunikatów." ++ ++#, fuzzy ++msgid "" ++"Clients are redirected to this page after they have accepted the splash. If " ++"this is left empty they are redirected to the page they had requested." ++msgstr "" ++"Klienci są przekierowywani do tej strony po tym, jak zaakceptują powitanie. " ++"Jeśli to miejsce jest puste zostaną przekierowani do strony którą wybrali." ++ ++msgid "Clients download speed is limited to this value (kbyte/s)" ++msgstr "Prędkość pobierania dla klienta jest ograniczona do wartości (kb/s)" ++ ++msgid "" ++"Clients that have accepted the splash are allowed to use the network for " ++"that many hours." ++msgstr "Klienci, którzy zaakceptowali okienko mogą korzystać z sieci przez." ++ ++msgid "Clients upload speed is limited to this value (kbyte/s)" ++msgstr "Prędkość pobierania dla klienta jest ograniczona do wartości (kb/s)" ++ ++msgid "Contact" ++msgstr "Kontakt" ++ ++msgid "Decline" ++msgstr "Odrzuć" ++ ++#, fuzzy ++msgid "" ++"Destination hosts and networks that are excluded from splashing, i.e. they " ++"are always allowed." ++msgstr "" ++"Hosty przeznaczenia i sieci, które są wykluczone z powitania, tzn. są zawsze " ++"dozwolone." ++ ++msgid "Donate some money to help us keep this project alive." ++msgstr "Możesz zasposorować ten projekt aby utrzymać go przy życiu" ++ ++msgid "Download limit" ++msgstr "Limit ściągania" ++ ++msgid "Edit the complete splash text" ++msgstr "Edit the complete splash text" ++ ++msgid "Fair Use Policy" ++msgstr "Zasady dozwolonego użytku" ++ ++msgid "Firewall zone" ++msgstr "Strefa firewall" ++ ++msgid "General" ++msgstr "Ogólne" ++ ++msgid "Get in %s with the operator of this access point." ++msgstr "Uzyskaj %s z operatorem tego punktu dostępu." ++ ++msgid "Hostname" ++msgstr "Nazwa hosta" ++ ++msgid "IP Address" ++msgstr "Adres IP" ++ ++msgid "" ++"If you operate your own wifi equipment use channels different from ours." ++msgstr "" ++"Jeśli używasz własnych urządzeń WiFi korzystaj z innych kanałów niż nasze." ++ ++msgid "If you use this network on a regular basis we ask for your support:" ++msgstr "Jeśli korzystasz z tej sieci regularnie prosimy cię o wsparcie." ++ ++msgid "Include your own text in the default splash" ++msgstr "Zamieść własny tekst w miejscu domyślnego powitania" ++ ++msgid "Intercept client traffic on this Interface" ++msgstr "Przechwytuj ruchu klienta w tym interfejsie" ++ ++msgid "Interfaces" ++msgstr "Interfejs" ++ ++msgid "Interfaces that are used for Splash." ++msgstr "Interfejsy wykorzystywane przez komunikat (Splash)" ++ ++msgid "" ++"KB/s (Download/Upload). You may be able to remove this limit by actively " ++"contributing to this project." ++msgstr "" ++"KB/s (Download/Upload). Będziesz w stanie usunąć ten limit jeśli aktywnie " ++"przyłączysz się do tego projektu." ++ ++msgid "Legally Prohibited Activities" ++msgstr "Działania zabronione prawnie" ++ ++msgid "Legally Prohibited content" ++msgstr "Treści zabronione prawnie" ++ ++msgid "MAC Address" ++msgstr "Adres MAC" ++ ++msgid "MAC addresses in this list are blocked." ++msgstr "Adresy MAC z tej listy są zablokowane." ++ ++msgid "" ++"MAC addresses of whitelisted clients. These do not need to accept the splash " ++"and are not bandwidth limited." ++msgstr "" ++"Biała lista adresów MAC, wszyscy z tej listy nie muszą akceptować komunikatu " ++"(Splash) i nie mają ograniczanego połączenia" ++ ++msgid "Netmask" ++msgstr "Maska sieci" ++ ++msgid "Network" ++msgstr "Sieć" ++ ++msgid "No clients connected" ++msgstr "Nie ma podłączonych klientów" ++ ++msgid "" ++"Please note that we are not an internet service provider but an experimental " ++"community network." ++msgstr "" ++"Zwróć uwagę na to że nie jesteśmy providerem internetowym ale " ++"eksperymentalną siecią" ++ ++msgid "Policy" ++msgstr "Zasady" ++ ++msgid "Redirect target" ++msgstr "przekierować cel" ++ ++msgid "Safety" ++msgstr "Bezpieczeństwo" ++ ++msgid "Save" ++msgstr "Zachowaj" ++ ++msgid "Splash rules are integrated in this firewall zone" ++msgstr "" ++"Reguły komunikatu (Splash) są integrowane z ustawieniami firewalla tej strefy" ++ ++msgid "Splashtext" ++msgstr "Tekst komunikatu (Splash)" ++ ++msgid "" ++"The network, like the Internet, is unencrypted and open. Each participant is " ++"responsible for the safety of their own connections and devices." ++msgstr "" ++"Sieci, takie jak Internet, są otwarte i nieszyfrowane. Każdy uczestnik jest " ++"odpowiedzialny za bezpieczeństwo swoich połączeń i urządzeń." ++ ++msgid "" ++"The open and free wireless network of volunteers (\"Operators\") provides " ++"the necessary equipment and Internet connections (\"Infrastructure\") at " ++"their own expense." ++msgstr "" ++ ++msgid "" ++"The operator claims no liability for loss of data, unauthorized access/" ++"damage to devices, or financial losses that participants may suffer from the " ++"use of the network." ++msgstr "" ++"Właściciel sieci nie ponosi odpowiedzialności za utratę danych, " ++"nieautoryzowanego dostępu / uszkodzenia urządzeń lub strat finansowych, " ++"które uczestnicy mogą ponieść podczas korzystania z sieci." ++ ++msgid "" ++"The participant agrees to not perform any action and refrain from acts which " ++"may violate the law or infringe upon the rights of third parties." ++msgstr "" ++"Uczestnik zobowiązuje się nie wykonywać żadnych działań, i powstrzymać się " ++"od działań, które naruszają prawo lub naruszające prawa osób trzecich." ++ ++msgid "" ++"The participant agrees to not transfer content over the network which " ++"violates the law." ++msgstr "" ++"Uczestnik zobowiązuje się do nie przesyłania w sieci treści, które naruszają " ++"prawo." ++ ++msgid "" ++"The participant agrees to not use the network in any way which will harm the " ++"infrastructure, the network itself, its operators or other participants." ++msgstr "" ++"Uczestnik zobowiązuje się nie korzystać z sieci w sposób, który zagraża " ++"infrastrukturze, samej sieci, jej podmiotom lub innym uczestnikom." ++ ++msgid "" ++"These Terms of Use govern the use of the network by its participants' " ++"computer, PDA, or similar device (\"Devices\") within the network." ++msgstr "" ++"Niniejszy Regulamin reguluje wykorzystanie komputera w sieci przez swoich " ++"uczestników, PDA, lub podobnego urządzenia (\"Urządzeń\") w ramach sieci." ++ ++msgid "Time remaining" ++msgstr "Pozostały czas" ++ ++msgid "" ++"To ask for the reason why you have been blocked or ask for access again you " ++"can try to contact the owner of this access point:" ++msgstr "" ++"Aby poznać z jakiego powodu zostałeś zablokowany lub prosić o ponowne " ++"odblokowanie możesz spróbować skontaktować się z właścicielem tego Access " ++"Point'a:" ++ ++msgid "Traffic in/out" ++msgstr "Ruch do/od" ++ ++msgid "Upload limit" ++msgstr "Limit wysyłania" ++ ++msgid "Usage Agreement" ++msgstr "Umowa użytkowania" ++ ++msgid "Welcome" ++msgstr "Witamy" ++ ++msgid "Whitelist" ++msgstr "Biała lista" ++ ++msgid "You are now connected to the free wireless mesh network" ++msgstr "Jesteś teraz podłączony do darmowej sieci" ++ ++msgid "" ++"You can enter your own text that is displayed to clients here.
    It is " ++"possible to use the following markers: ###COMMUNITY###, ###COMMUNITY_URL###, " ++"###CONTACTURL###, ###LEASETIME###, ###LIMIT### and ###ACCEPT###." ++msgstr "" ++"Możesz umieścić tutaj własny tekst wyświetlany dla klientów.
    " ++"Dopuszczalne jest używanie następujących znaków: ###COMMUNITY###, " ++"###COMMUNITY_URL###, ###CONTACTURL###, ###LEASETIME###, ###LIMIT### and " ++"###ACCEPT###." ++ ++msgid "" ++"Your access to this network has been blocked, most likely because you did " ++"something that our rules explicitly forbid." ++msgstr "" ++"Twój dostęp do sieci został zablokowany, najprawdopodobniej dlatego że " ++"wykonałeś jedną z akcji zabronionych przez nasze reguły." ++ ++msgid "Your bandwidth is limited to" ++msgstr "Twój transfer jest ograniczony do" ++ ++msgid "blacklisted" ++msgstr "czarna lista" ++ ++msgid "expired" ++msgstr "wygasło" ++ ++msgid "optional when using host addresses" ++msgstr "opcjonalne w przypadku używania adresów hostów" ++ ++msgid "perform any kind of illegal activities" ++msgstr "wykonywał którąkolwiek z zakazanych akcji" ++ ++msgid "splashed" ++msgstr "Powitanie" ++ ++msgid "temporarily blocked" ++msgstr "tymczasowo zablokowane" ++ ++msgid "unknown" ++msgstr "nieznane" ++ ++# Zgaduję, że to jest wyświetlane tuż po komunikacie nr 2, więc tak powinno pasować. ++msgid "use filesharing applications on this network" ++msgstr "używał programów do dzielenia się plikami w tej sieci" ++ ++# j.w. ++msgid "waste bandwidth with unneccesary downloads or streams" ++msgstr "marnował transfer na niepotrzebne pobieranie plików i strumieni" ++ ++msgid "whitelisted" ++msgstr "biała lista" ++ ++#~ msgid "" ++#~ "Hosts and Networks that are listed here are excluded from splashing, i.e. " ++#~ "they are always allowed." ++#~ msgstr "" ++#~ "Hosty i sieci wylistowane tutaj są wyłączone z konieczności klikania " ++#~ "komunikatu, zawsze mogą połączyć się do sieci." ++ ++#~ msgid "By accepting these rules you can use this network for" ++#~ msgstr "Akceptując te reguły możesz używać sieci do:" ++ ++#~ msgid "Edit Splash text" ++#~ msgstr "Edytuj tekst Komunikatu (Splash)" ++ ++#~ msgid "hour(s). After this time you need to accept these rules again." ++#~ msgstr "Czas po jakim musisz zaakceptować te reguły (w godzinach)" ++ ++#~ msgid "the owner of this access point." ++#~ msgstr "Właściciel tego Access Point'a" +diff --git a/feeds/luci/applications/luci-app-splash/po/pt-br/splash.po b/feeds/luci/applications/luci-app-splash/po/pt-br/splash.po +new file mode 100644 +index 0000000..cbdc801 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-splash/po/pt-br/splash.po +@@ -0,0 +1,402 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Report-Msgid-Bugs-To: \n" ++"POT-Creation-Date: 2011-11-02 05:36+0200\n" ++"PO-Revision-Date: 2014-06-21 19:10+0200\n" ++"Last-Translator: Éder \n" ++"Language-Team: LANGUAGE \n" ++"Language: pt_BR\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n > 1);\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "Accept" ++msgstr "Aceitar" ++ ++msgid "" ++"Access to the internet might be possible nevertheless, because some " ++"activists of this project share their private internet connections. These " ++"few connections are shared between all users. That means available bandwidth " ++"is limited and because of this we ask you not to do any of the following:" ++msgstr "" ++"O acesso à internet, no entanto, pode ser possível porque alguns ativistas " ++"deste projeto compartilham duas conexões privadas com a internet. Estas " ++"poucas conexões são compartilhadas entre todos os usuários. Isto significa " ++"que a banda disponível é limitada e, por este motivo, pedimos que você não " ++"faça qualquer uma destas coisas:" ++ ++msgid "" ++"Access to the network is not guaranteed. It can be interrupted at any time " ++"without notice for any reason, for certain devices, and/or may be blocked " ++"for certain users." ++msgstr "" ++"O acesso à rede não é garantido. Ele pode ser interrompido a qualquer " ++"momento sem aviso e por qualquer motivo, para alguns equipamentos e/ou pode " ++"bloquear alguns usuários." ++ ++msgid "Active Clients" ++msgstr "Clientes Ativos" ++ ++msgid "Allowed hosts/subnets" ++msgstr "Subredes/equipamentos permitidos" ++ ++msgid "" ++"As an alternative to editing the complete splash text you can also just " ++"include some custom text in the default splash page by entering it here." ++msgstr "" ++"Como uma alternativa a edição completa do texto do termo de uso, você pode " ++"também entrar aqui algum texto personalizado para incluir na página padrão." ++ ++msgid "" ++"Bandwidth limit for clients is only activated when both up- and download " ++"limit are set. Use a value of 0 here to completely disable this limitation. " ++"Whitelisted clients are not limited." ++msgstr "" ++"O limite da taxa de transferência somente é ativado quando ambos os limites, " ++"para subir e baixar, estão definidos. Use o valor 0 para desabilitar " ++"completamente esta limitação. Clientes na lista branca não são limitados." ++ ++msgid "" ++"Become an active member of this community and help by operating your own node" ++msgstr "" ++"Torne-se um membro ativo desta comunidade e ajude operando seu próprio nó." ++ ++msgid "Blacklist" ++msgstr "Lista negra" ++ ++msgid "Blocked" ++msgstr "Bloqueado" ++ ++msgid "" ++"By accepting these rules you can use this network for %s hour(s). After this " ++"time you need to accept these rules again." ++msgstr "" ++"Aceitando estas regras, você pode usar esta rede por %s hora(s). Depois " ++"deste prazo, você terá que aceitar estas regras novamente." ++ ++msgid "Clearance time" ++msgstr "Tempo de eliminação" ++ ++msgid "Client-Splash" ++msgstr "Client-Splash" ++ ++msgid "" ++"Client-Splash is a hotspot authentification system for wireless mesh " ++"networks." ++msgstr "" ++"Client-Splash é um sistema de autenticação de ponto de acesso para redes sem " ++"fio em malha." ++ ++# 20140621: edersg: tradução ++msgid "" ++"Clients are redirected to this page after they have accepted the splash. If " ++"this is left empty they are redirected to the page they had requested." ++msgstr "" ++"Os clientes são redirecionados para esta página depois de terem aceitado a " ++"*splash* Se esta for deixada em branco, eles são redirecionados para a " ++"página que haviam solicitado." ++ ++msgid "Clients download speed is limited to this value (kbyte/s)" ++msgstr "" ++"A velocidade para baixar dos clientes é limitada por este valor (kbytes/s)" ++ ++msgid "" ++"Clients that have accepted the splash are allowed to use the network for " ++"that many hours." ++msgstr "" ++"Os clientes que aceitarem o termo de uso estarão autorizados a usar a rede " ++"por esta quantidade de horas." ++ ++msgid "Clients upload speed is limited to this value (kbyte/s)" ++msgstr "" ++"A velocidade para subir dos clientes é limitada por este valor (kbytes/s)" ++ ++msgid "Contact" ++msgstr "Contato" ++ ++msgid "Decline" ++msgstr "Rejeitar" ++ ++# 20140621: edersg: tradução ++msgid "" ++"Destination hosts and networks that are excluded from splashing, i.e. they " ++"are always allowed." ++msgstr "" ++"As redes e as máquinas de destino que são excluídas a partir da *splashing*, " ++" são sempre permitidas." ++ ++msgid "Donate some money to help us keep this project alive." ++msgstr "Doar algum dinheiro para ajudar a manter este projeto vivo." ++ ++msgid "Download limit" ++msgstr "Limite para baixar" ++ ++msgid "Edit the complete splash text" ++msgstr "Edite todo o termo de uso" ++ ++msgid "Fair Use Policy" ++msgstr "Política de uso adequado" ++ ++msgid "Firewall zone" ++msgstr "Zona do Firewall" ++ ++msgid "General" ++msgstr "Geral" ++ ++# Very strange text... Used at http://luci.subsignal.org/trac/browser/luci/trunk/applications/luci-splash/luasrc/view/splash/splash.htm:58 ++msgid "Get in %s with the operator of this access point." ++msgstr "Entre em %s com o operador deste ponto de acesso." ++ ++msgid "Hostname" ++msgstr "Nome do Equipamento" ++ ++msgid "IP Address" ++msgstr "Endereço IP" ++ ++msgid "" ++"If you operate your own wifi equipment use channels different from ours." ++msgstr "" ++"Se você opera seu próprio equipamento WiFi, use canais diferentes dos nossos." ++ ++msgid "If you use this network on a regular basis we ask for your support:" ++msgstr "Se você usa esta rede regularmente, nós pedimos a sua ajuda:" ++ ++msgid "Include your own text in the default splash" ++msgstr "Inclua seu próprio texto no termo de uso padrão" ++ ++msgid "Intercept client traffic on this Interface" ++msgstr "Interceptar o tráfego do cliente nesta interface" ++ ++msgid "Interfaces" ++msgstr "Interfaces" ++ ++msgid "Interfaces that are used for Splash." ++msgstr "Interfaces usadas pelo Splash." ++ ++msgid "" ++"KB/s (Download/Upload). You may be able to remove this limit by actively " ++"contributing to this project." ++msgstr "" ++"KB/s (Baixando/Subindo). Você pode remover esta limitação contribuindo " ++"ativamente para este projeto." ++ ++msgid "Legally Prohibited Activities" ++msgstr "Atividades Proibidas por Lei" ++ ++msgid "Legally Prohibited content" ++msgstr "Conteúdo Proibido por Lei" ++ ++msgid "MAC Address" ++msgstr "Endereço MAC" ++ ++msgid "MAC addresses in this list are blocked." ++msgstr "Os endereços MAC nesta lista serão bloqueados." ++ ++msgid "" ++"MAC addresses of whitelisted clients. These do not need to accept the splash " ++"and are not bandwidth limited." ++msgstr "" ++"Endereços MAC dos clientes na lista branca. Estes não precisam aceitar o " ++"termo de uso e não possuem limitação na sua taxa de transferência." ++ ++msgid "Netmask" ++msgstr "Máscara de Rede" ++ ++msgid "Network" ++msgstr "Rede" ++ ++msgid "No clients connected" ++msgstr "Nenhum cliente conectado" ++ ++msgid "" ++"Please note that we are not an internet service provider but an experimental " ++"community network." ++msgstr "" ++"Observe que nós não somos um provedor de internet mas uma rede comunitária " ++"experimental." ++ ++msgid "Policy" ++msgstr "Política" ++ ++# 20140621: edersg: tradução ++msgid "Redirect target" ++msgstr "Redirecionar alvo" ++ ++msgid "Safety" ++msgstr "Segurança" ++ ++msgid "Save" ++msgstr "Salvar" ++ ++msgid "Splash rules are integrated in this firewall zone" ++msgstr "As regras do Slapsh estão integradas a esta zona do firewall" ++ ++msgid "Splashtext" ++msgstr "Texto do termo de uso" ++ ++# 20140621: edersg: tradução ++msgid "" ++"The network, like the Internet, is unencrypted and open. Each participant is " ++"responsible for the safety of their own connections and devices." ++msgstr "" ++"Uma rede como a Internet não é criptografada e aberta. Cada usuário é " ++"responsável pela segurança de suas próprias conexões e dispositivos." ++ ++msgid "" ++"The open and free wireless network of volunteers (\"Operators\") provides " ++"the necessary equipment and Internet connections (\"Infrastructure\") at " ++"their own expense." ++msgstr "" ++"A rede sem fio aberta e livre dos voluntários (\"Operadores\") provê o " ++"equipamento necessário e conexão com a Internet (\"Infraestrutura\") do seu " ++"próprio bolso." ++ ++msgid "" ++"The operator claims no liability for loss of data, unauthorized access/" ++"damage to devices, or financial losses that participants may suffer from the " ++"use of the network." ++msgstr "" ++"O operador não se responsabiliza por perda de dados, acesso não autorizado " ++"ou dano aos dispositivos, ou perdas financeiras que os participantes possam " ++"sofrer pelo o uso da rede." ++ ++msgid "" ++"The participant agrees to not perform any action and refrain from acts which " ++"may violate the law or infringe upon the rights of third parties." ++msgstr "" ++"O participante concorda que não realizará nenhuma atividade e se absterá de " ++"atos que possam violar a lei ou infringir os direitos de terceiros." ++ ++msgid "" ++"The participant agrees to not transfer content over the network which " ++"violates the law." ++msgstr "" ++"O participante concorda em não transferir conteúdo pela rede que viole a lei." ++ ++msgid "" ++"The participant agrees to not use the network in any way which will harm the " ++"infrastructure, the network itself, its operators or other participants." ++msgstr "" ++"O participante concorda em não usar a rede de qualquer maneira que possa " ++"prejudicar a infraestrutura, a própria rede, seus operadores ou outros " ++"participantes." ++ ++msgid "" ++"These Terms of Use govern the use of the network by its participants' " ++"computer, PDA, or similar device (\"Devices\") within the network." ++msgstr "" ++"Estes \"Termos de Uso\" regem o uso da rede por equipamentos dos " ++"participantes em uso desta rede." ++ ++msgid "Time remaining" ++msgstr "Tempo restante" ++ ++msgid "" ++"To ask for the reason why you have been blocked or ask for access again you " ++"can try to contact the owner of this access point:" ++msgstr "" ++"Para perguntar por qual razão você foi bloqueado ou para solicitar novamente " ++"seu acesso, você pode tentar contatar o dono deste ponto de acesso:" ++ ++msgid "Traffic in/out" ++msgstr "Tráfego de entrada/saída" ++ ++msgid "Upload limit" ++msgstr "Limite de subida" ++ ++msgid "Usage Agreement" ++msgstr "Acordo de Uso" ++ ++msgid "Welcome" ++msgstr "Bem-vindo" ++ ++msgid "Whitelist" ++msgstr "Lista branca" ++ ++msgid "You are now connected to the free wireless mesh network" ++msgstr "Você está agora conectado à rede livre em malha sem fio" ++ ++msgid "" ++"You can enter your own text that is displayed to clients here.
    It is " ++"possible to use the following markers: ###COMMUNITY###, ###COMMUNITY_URL###, " ++"###CONTACTURL###, ###LEASETIME###, ###LIMIT### and ###ACCEPT###." ++msgstr "" ++"Vocẽ pode entrar aqui com seu próprio texto que será mostrado para os " ++"clientes.
    É possível usar os seguintes marcadores: ###COMMUNITY###, " ++"###COMMUNITY_URL###, ###CONTACTURL###, ###LEASETIME###, ###LIMIT### and " ++"###ACCEPT###." ++ ++msgid "" ++"Your access to this network has been blocked, most likely because you did " ++"something that our rules explicitly forbid." ++msgstr "" ++"Seu acesso para esta rede foi bloqueado, provavelmente porque você fez algo " ++"que as regras explicitamente proibiam." ++ ++msgid "Your bandwidth is limited to" ++msgstr "Sua banda está limitada à" ++ ++msgid "blacklisted" ++msgstr "na lista negra" ++ ++msgid "expired" ++msgstr "expirado" ++ ++msgid "optional when using host addresses" ++msgstr "opcional quando é usado o endereço do equipamento" ++ ++msgid "perform any kind of illegal activities" ++msgstr "realizar qualquer tipo de atividades ilegais" ++ ++msgid "splashed" ++msgstr "termo mostrado" ++ ++msgid "temporarily blocked" ++msgstr "bloqueado temporariamente" ++ ++msgid "unknown" ++msgstr "desconhecido" ++ ++msgid "use filesharing applications on this network" ++msgstr "usar aplicativos de compartilhamento de arquivos nesta rede" ++ ++msgid "waste bandwidth with unneccesary downloads or streams" ++msgstr "usar banda com fluxos ou arquivos baixados não necessários" ++ ++msgid "whitelisted" ++msgstr "na lista branca" ++ ++#~ msgid "" ++#~ "Hosts and Networks that are listed here are excluded from splashing, i.e. " ++#~ "they are always allowed." ++#~ msgstr "" ++#~ "Equipamentos ou Redes listadas aqui estarão excluídas do termo de uso. Eles " ++#~ "estarão sempre autorizados." ++ ++#~ msgid "By accepting these rules you can use this network for" ++#~ msgstr "Aceitando estas regras, você pode usar esta rede para" ++ ++#~ msgid "Edit Splash text" ++#~ msgstr "Editar texto do termo de uso" ++ ++#~ msgid "hour(s). After this time you need to accept these rules again." ++#~ msgstr "" ++#~ "horas(s). Depois deste tempo, você terá que aceitar as regras novamente." ++ ++#~ msgid "the owner of this access point." ++#~ msgstr "o dono deste ponto de acesso." ++ ++#~ msgid "" ++#~ "You can change the text that is displayed to clients here.
    It is " ++#~ "possible to use the following markers: ###COMMUNITY###, " ++#~ "###COMMUNITY_URL###, ###LEASETIME### and ###ACCEPT###.
    Click here to " ++#~ "test the splash page after you saved it." ++#~ msgstr "" ++#~ "Aqui você pode mudar o texto do termo de uso que é mostrado aos clientes." ++#~ "
    É possível usar as seguintes marcações: ###COMMUNITY###, " ++#~ "###COMMUNITY_URL###, ###LEASETIME### e ###ACCEPT###.
    Clique aqui " ++#~ "para testar a página de termo de uso depois " ++#~ "que você salvá-la." +diff --git a/feeds/luci/applications/luci-app-splash/po/pt/splash.po b/feeds/luci/applications/luci-app-splash/po/pt/splash.po +new file mode 100644 +index 0000000..05bee4f +--- /dev/null ++++ b/feeds/luci/applications/luci-app-splash/po/pt/splash.po +@@ -0,0 +1,309 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Report-Msgid-Bugs-To: \n" ++"POT-Creation-Date: 2013-05-31 22:29+0200\n" ++"PO-Revision-Date: 2013-06-03 12:17+0200\n" ++"Last-Translator: joao.f.vieira \n" ++"Language-Team: LANGUAGE \n" ++"Language: pt\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n != 1);\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "Accept" ++msgstr "Aceitar" ++ ++msgid "" ++"Access to the internet might be possible nevertheless, because some " ++"activists of this project share their private internet connections. These " ++"few connections are shared between all users. That means available bandwidth " ++"is limited and because of this we ask you not to do any of the following:" ++msgstr "" ++ ++msgid "" ++"Access to the network is not guaranteed. It can be interrupted at any time " ++"without notice for any reason, for certain devices, and/or may be blocked " ++"for certain users." ++msgstr "" ++ ++msgid "Active Clients" ++msgstr "Clientes Activos" ++ ++msgid "Allowed hosts/subnets" ++msgstr "Hosts/Subnets permitidos" ++ ++msgid "" ++"As an alternative to editing the complete splash text you can also just " ++"include some custom text in the default splash page by entering it here." ++msgstr "" ++ ++msgid "" ++"Bandwidth limit for clients is only activated when both up- and download " ++"limit are set. Use a value of 0 here to completely disable this limitation. " ++"Whitelisted clients are not limited." ++msgstr "" ++ ++msgid "" ++"Become an active member of this community and help by operating your own node" ++msgstr "" ++ ++msgid "Blacklist" ++msgstr "" ++ ++msgid "Blocked" ++msgstr "Bloqueado" ++ ++msgid "" ++"By accepting these rules you can use this network for %s hour(s). After this " ++"time you need to accept these rules again." ++msgstr "Aceitando estas regras só pode usar esta regra para" ++ ++msgid "Clearance time" ++msgstr "" ++ ++msgid "Client-Splash" ++msgstr "" ++ ++msgid "" ++"Client-Splash is a hotspot authentification system for wireless mesh " ++"networks." ++msgstr "" ++ ++msgid "" ++"Clients are redirected to this page after they have accepted the splash. If " ++"this is left empty they are redirected to the page they had requested." ++msgstr "" ++ ++msgid "Clients download speed is limited to this value (kbyte/s)" ++msgstr "" ++ ++msgid "" ++"Clients that have accepted the splash are allowed to use the network for " ++"that many hours." ++msgstr "" ++ ++msgid "Clients upload speed is limited to this value (kbyte/s)" ++msgstr "A velocidade de upload está limitado a (kbyte/s)" ++ ++msgid "Contact" ++msgstr "Contacto" ++ ++msgid "Decline" ++msgstr "Declinar" ++ ++msgid "" ++"Destination hosts and networks that are excluded from splashing, i.e. they " ++"are always allowed." ++msgstr "" ++ ++msgid "Donate some money to help us keep this project alive." ++msgstr "Doe algum dinheiro para nos ajudar a manter este projeto vivo." ++ ++msgid "Download limit" ++msgstr "Limite de Download" ++ ++msgid "Edit the complete splash text" ++msgstr "" ++ ++msgid "Fair Use Policy" ++msgstr "" ++ ++msgid "Firewall zone" ++msgstr "Zona de Firewall" ++ ++msgid "General" ++msgstr "Geral" ++ ++msgid "Get in %s with the operator of this access point." ++msgstr "" ++ ++msgid "Hostname" ++msgstr "Nome de Host" ++ ++msgid "IP Address" ++msgstr "Endereço IP" ++ ++msgid "" ++"If you operate your own wifi equipment use channels different from ours." ++msgstr "" ++"Se tem o seu próprio equipamento de rede wireless, use canais diferentes dos " ++"nossos." ++ ++msgid "If you use this network on a regular basis we ask for your support:" ++msgstr "" ++ ++msgid "Include your own text in the default splash" ++msgstr "" ++ ++msgid "Intercept client traffic on this Interface" ++msgstr "" ++ ++msgid "Interfaces" ++msgstr "Interfaces" ++ ++msgid "Interfaces that are used for Splash." ++msgstr "" ++ ++msgid "" ++"KB/s (Download/Upload). You may be able to remove this limit by actively " ++"contributing to this project." ++msgstr "" ++ ++msgid "Legally Prohibited Activities" ++msgstr "" ++ ++msgid "Legally Prohibited content" ++msgstr "" ++ ++msgid "MAC Address" ++msgstr "Endereço MAC" ++ ++msgid "MAC addresses in this list are blocked." ++msgstr "Endereços MAC nesta lista estão bloqueados." ++ ++msgid "" ++"MAC addresses of whitelisted clients. These do not need to accept the splash " ++"and are not bandwidth limited." ++msgstr "" ++ ++msgid "Netmask" ++msgstr "Mascara de Rede" ++ ++msgid "Network" ++msgstr "Rede" ++ ++msgid "No clients connected" ++msgstr "Não há clientes ligados" ++ ++msgid "" ++"Please note that we are not an internet service provider but an experimental " ++"community network." ++msgstr "" ++ ++msgid "Policy" ++msgstr "" ++ ++msgid "Redirect target" ++msgstr "" ++ ++msgid "Safety" ++msgstr "" ++ ++msgid "Save" ++msgstr "Gravar" ++ ++msgid "Splash rules are integrated in this firewall zone" ++msgstr "" ++ ++msgid "Splashtext" ++msgstr "" ++ ++msgid "" ++"The network, like the Internet, is unencrypted and open. Each participant is " ++"responsible for the safety of their own connections and devices." ++msgstr "" ++ ++msgid "" ++"The open and free wireless network of volunteers (\"Operators\") provides " ++"the necessary equipment and Internet connections (\"Infrastructure\") at " ++"their own expense." ++msgstr "" ++ ++msgid "" ++"The operator claims no liability for loss of data, unauthorized access/" ++"damage to devices, or financial losses that participants may suffer from the " ++"use of the network." ++msgstr "" ++ ++msgid "" ++"The participant agrees to not perform any action and refrain from acts which " ++"may violate the law or infringe upon the rights of third parties." ++msgstr "" ++ ++msgid "" ++"The participant agrees to not transfer content over the network which " ++"violates the law." ++msgstr "" ++ ++msgid "" ++"The participant agrees to not use the network in any way which will harm the " ++"infrastructure, the network itself, its operators or other participants." ++msgstr "" ++ ++msgid "" ++"These Terms of Use govern the use of the network by its participants' " ++"computer, PDA, or similar device (\"Devices\") within the network." ++msgstr "" ++ ++msgid "Time remaining" ++msgstr "" ++ ++msgid "" ++"To ask for the reason why you have been blocked or ask for access again you " ++"can try to contact the owner of this access point:" ++msgstr "" ++ ++msgid "Traffic in/out" ++msgstr "" ++ ++msgid "Upload limit" ++msgstr "Limite de Upload" ++ ++msgid "Usage Agreement" ++msgstr "" ++ ++msgid "Welcome" ++msgstr "Bem-vindo" ++ ++msgid "Whitelist" ++msgstr "" ++ ++msgid "You are now connected to the free wireless mesh network" ++msgstr "" ++ ++msgid "" ++"You can enter your own text that is displayed to clients here.
    It is " ++"possible to use the following markers: ###COMMUNITY###, ###COMMUNITY_URL###, " ++"###CONTACTURL###, ###LEASETIME###, ###LIMIT### and ###ACCEPT###." ++msgstr "" ++ ++msgid "" ++"Your access to this network has been blocked, most likely because you did " ++"something that our rules explicitly forbid." ++msgstr "" ++ ++msgid "Your bandwidth is limited to" ++msgstr "A largura de banda está limitada a" ++ ++msgid "blacklisted" ++msgstr "" ++ ++msgid "expired" ++msgstr "" ++ ++msgid "optional when using host addresses" ++msgstr "" ++ ++msgid "perform any kind of illegal activities" ++msgstr "" ++ ++msgid "splashed" ++msgstr "" ++ ++msgid "temporarily blocked" ++msgstr "" ++ ++msgid "unknown" ++msgstr "desconhecido" ++ ++msgid "use filesharing applications on this network" ++msgstr "" ++ ++msgid "waste bandwidth with unneccesary downloads or streams" ++msgstr "" ++ ++msgid "whitelisted" ++msgstr "" +diff --git a/feeds/luci/applications/luci-app-splash/po/ro/splash.po b/feeds/luci/applications/luci-app-splash/po/ro/splash.po +new file mode 100644 +index 0000000..615be16 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-splash/po/ro/splash.po +@@ -0,0 +1,292 @@ ++msgid "Accept" ++msgstr "" ++ ++msgid "" ++"Access to the internet might be possible nevertheless, because some " ++"activists of this project share their private internet connections. These " ++"few connections are shared between all users. That means available bandwidth " ++"is limited and because of this we ask you not to do any of the following:" ++msgstr "" ++ ++msgid "" ++"Access to the network is not guaranteed. It can be interrupted at any time " ++"without notice for any reason, for certain devices, and/or may be blocked " ++"for certain users." ++msgstr "" ++ ++msgid "Active Clients" ++msgstr "" ++ ++msgid "Allowed hosts/subnets" ++msgstr "" ++ ++msgid "" ++"As an alternative to editing the complete splash text you can also just " ++"include some custom text in the default splash page by entering it here." ++msgstr "" ++ ++msgid "" ++"Bandwidth limit for clients is only activated when both up- and download " ++"limit are set. Use a value of 0 here to completely disable this limitation. " ++"Whitelisted clients are not limited." ++msgstr "" ++ ++msgid "" ++"Become an active member of this community and help by operating your own node" ++msgstr "" ++ ++msgid "Blacklist" ++msgstr "" ++ ++msgid "Blocked" ++msgstr "" ++ ++msgid "" ++"By accepting these rules you can use this network for %s hour(s). After this " ++"time you need to accept these rules again." ++msgstr "" ++ ++msgid "Clearance time" ++msgstr "" ++ ++msgid "Client-Splash" ++msgstr "" ++ ++msgid "" ++"Client-Splash is a hotspot authentification system for wireless mesh " ++"networks." ++msgstr "" ++ ++msgid "" ++"Clients are redirected to this page after they have accepted the splash. If " ++"this is left empty they are redirected to the page they had requested." ++msgstr "" ++ ++msgid "Clients download speed is limited to this value (kbyte/s)" ++msgstr "" ++ ++msgid "" ++"Clients that have accepted the splash are allowed to use the network for " ++"that many hours." ++msgstr "" ++ ++msgid "Clients upload speed is limited to this value (kbyte/s)" ++msgstr "" ++ ++msgid "Contact" ++msgstr "" ++ ++msgid "Decline" ++msgstr "" ++ ++msgid "" ++"Destination hosts and networks that are excluded from splashing, i.e. they " ++"are always allowed." ++msgstr "" ++ ++msgid "Donate some money to help us keep this project alive." ++msgstr "" ++ ++msgid "Download limit" ++msgstr "" ++ ++msgid "Edit the complete splash text" ++msgstr "" ++ ++msgid "Fair Use Policy" ++msgstr "" ++ ++msgid "Firewall zone" ++msgstr "" ++ ++msgid "General" ++msgstr "" ++ ++msgid "Get in %s with the operator of this access point." ++msgstr "" ++ ++msgid "Hostname" ++msgstr "" ++ ++msgid "IP Address" ++msgstr "" ++ ++msgid "" ++"If you operate your own wifi equipment use channels different from ours." ++msgstr "" ++ ++msgid "If you use this network on a regular basis we ask for your support:" ++msgstr "" ++ ++msgid "Include your own text in the default splash" ++msgstr "" ++ ++msgid "Intercept client traffic on this Interface" ++msgstr "" ++ ++msgid "Interfaces" ++msgstr "" ++ ++msgid "Interfaces that are used for Splash." ++msgstr "" ++ ++msgid "" ++"KB/s (Download/Upload). You may be able to remove this limit by actively " ++"contributing to this project." ++msgstr "" ++ ++msgid "Legally Prohibited Activities" ++msgstr "" ++ ++msgid "Legally Prohibited content" ++msgstr "" ++ ++msgid "MAC Address" ++msgstr "" ++ ++msgid "MAC addresses in this list are blocked." ++msgstr "" ++ ++msgid "" ++"MAC addresses of whitelisted clients. These do not need to accept the splash " ++"and are not bandwidth limited." ++msgstr "" ++ ++msgid "Netmask" ++msgstr "" ++ ++msgid "Network" ++msgstr "" ++ ++msgid "No clients connected" ++msgstr "" ++ ++msgid "" ++"Please note that we are not an internet service provider but an experimental " ++"community network." ++msgstr "" ++ ++msgid "Policy" ++msgstr "" ++ ++msgid "Redirect target" ++msgstr "" ++ ++msgid "Safety" ++msgstr "" ++ ++msgid "Save" ++msgstr "" ++ ++msgid "Splash rules are integrated in this firewall zone" ++msgstr "" ++ ++msgid "Splashtext" ++msgstr "" ++ ++msgid "" ++"The network, like the Internet, is unencrypted and open. Each participant is " ++"responsible for the safety of their own connections and devices." ++msgstr "" ++ ++msgid "" ++"The open and free wireless network of volunteers (\"Operators\") provides " ++"the necessary equipment and Internet connections (\"Infrastructure\") at " ++"their own expense." ++msgstr "" ++ ++msgid "" ++"The operator claims no liability for loss of data, unauthorized access/" ++"damage to devices, or financial losses that participants may suffer from the " ++"use of the network." ++msgstr "" ++ ++msgid "" ++"The participant agrees to not perform any action and refrain from acts which " ++"may violate the law or infringe upon the rights of third parties." ++msgstr "" ++ ++msgid "" ++"The participant agrees to not transfer content over the network which " ++"violates the law." ++msgstr "" ++ ++msgid "" ++"The participant agrees to not use the network in any way which will harm the " ++"infrastructure, the network itself, its operators or other participants." ++msgstr "" ++ ++msgid "" ++"These Terms of Use govern the use of the network by its participants' " ++"computer, PDA, or similar device (\"Devices\") within the network." ++msgstr "" ++ ++msgid "Time remaining" ++msgstr "" ++ ++msgid "" ++"To ask for the reason why you have been blocked or ask for access again you " ++"can try to contact the owner of this access point:" ++msgstr "" ++ ++msgid "Traffic in/out" ++msgstr "" ++ ++msgid "Upload limit" ++msgstr "" ++ ++msgid "Usage Agreement" ++msgstr "" ++ ++msgid "Welcome" ++msgstr "" ++ ++msgid "Whitelist" ++msgstr "" ++ ++msgid "You are now connected to the free wireless mesh network" ++msgstr "" ++ ++msgid "" ++"You can enter your own text that is displayed to clients here.
    It is " ++"possible to use the following markers: ###COMMUNITY###, ###COMMUNITY_URL###, " ++"###CONTACTURL###, ###LEASETIME###, ###LIMIT### and ###ACCEPT###." ++msgstr "" ++ ++msgid "" ++"Your access to this network has been blocked, most likely because you did " ++"something that our rules explicitly forbid." ++msgstr "" ++ ++msgid "Your bandwidth is limited to" ++msgstr "" ++ ++msgid "blacklisted" ++msgstr "" ++ ++msgid "expired" ++msgstr "" ++ ++msgid "optional when using host addresses" ++msgstr "" ++ ++msgid "perform any kind of illegal activities" ++msgstr "" ++ ++msgid "splashed" ++msgstr "" ++ ++msgid "temporarily blocked" ++msgstr "" ++ ++msgid "unknown" ++msgstr "" ++ ++msgid "use filesharing applications on this network" ++msgstr "" ++ ++msgid "waste bandwidth with unneccesary downloads or streams" ++msgstr "" ++ ++msgid "whitelisted" ++msgstr "" +diff --git a/feeds/luci/applications/luci-app-splash/po/ru/splash.po b/feeds/luci/applications/luci-app-splash/po/ru/splash.po +new file mode 100644 +index 0000000..3f470db +--- /dev/null ++++ b/feeds/luci/applications/luci-app-splash/po/ru/splash.po +@@ -0,0 +1,362 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: LuCI: splash\n" ++"Report-Msgid-Bugs-To: \n" ++"POT-Creation-Date: 2012-01-26 15:10+0200\n" ++"PO-Revision-Date: 2013-11-13 18:52+0200\n" ++"Last-Translator: Роман \n" ++"Language-Team: Russian \n" ++"Language: ru\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%" ++"10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" ++"X-Generator: Pootle 2.0.6\n" ++"X-Poedit-SourceCharset: UTF-8\n" ++ ++msgid "Accept" ++msgstr "ПринÑÑ‚ÑŒ" ++ ++msgid "" ++"Access to the internet might be possible nevertheless, because some " ++"activists of this project share their private internet connections. These " ++"few connections are shared between all users. That means available bandwidth " ++"is limited and because of this we ask you not to do any of the following:" ++msgstr "" ++"ДоÑтуп к интернету возможен Ð±Ð»Ð°Ð³Ð¾Ð´Ð°Ñ€Ñ Ð½ÐµÐºÐ¾Ñ‚Ð¾Ñ€Ñ‹Ð¼ активиÑтам данного проекта, " ++"которые делают общедоÑтупным Ñвоё личное подключение к интернету. Эти " ++"немногие Ð¿Ð¾Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ Ñ€Ð°Ð·Ð´ÐµÐ»ÑÑŽÑ‚ÑÑ Ñреди вÑех пользователей. Это означает, что " ++"доÑÑ‚ÑƒÐ¿Ð½Ð°Ñ Ð¿Ñ€Ð¾Ð¿ÑƒÑÐºÐ½Ð°Ñ ÑпоÑобноÑÑ‚ÑŒ ограничена и поÑтому мы проÑим Ð²Ð°Ñ Ð½Ðµ " ++"делать Ñледующего:" ++ ++msgid "" ++"Access to the network is not guaranteed. It can be interrupted at any time " ++"without notice for any reason, for certain devices, and/or may be blocked " ++"for certain users." ++msgstr "" ++ ++msgid "Active Clients" ++msgstr "Ðктивные клиенты" ++ ++msgid "Allowed hosts/subnets" ++msgstr "Разрешённые хоÑÑ‚Ñ‹/подÑети" ++ ++msgid "" ++"As an alternative to editing the complete splash text you can also just " ++"include some custom text in the default splash page by entering it here." ++msgstr "" ++ ++msgid "" ++"Bandwidth limit for clients is only activated when both up- and download " ++"limit are set. Use a value of 0 here to completely disable this limitation. " ++"Whitelisted clients are not limited." ++msgstr "" ++"Ограничение полоÑÑ‹ Ð´Ð»Ñ ÐºÐ»Ð¸ÐµÐ½Ñ‚Ð¾Ð² активируетÑÑ Ñ‚Ð¾Ð»ÑŒÐºÐ¾ при указанных лимитах " ++"ниÑходÑщего и воÑходÑщего каналов. Значение 0 полноÑтью отключает " ++"ограничение. Клиенты из \"белого\" ÑпиÑка не имеют ограничений." ++ ++msgid "" ++"Become an active member of this community and help by operating your own node" ++msgstr "" ++"Станьте активным учаÑтником данного ÑообщеÑтва и окажите ÑодейÑтвие, " ++"запуÑтив Ñвой узел Ñети" ++ ++msgid "Blacklist" ++msgstr "Чёрный ÑпиÑок" ++ ++msgid "Blocked" ++msgstr "Заблокирован" ++ ++msgid "" ++"By accepting these rules you can use this network for %s hour(s). After this " ++"time you need to accept these rules again." ++msgstr "" ++ ++msgid "Clearance time" ++msgstr "Разрешённое времÑ" ++ ++msgid "Client-Splash" ++msgstr "Client-Splash" ++ ++msgid "" ++"Client-Splash is a hotspot authentification system for wireless mesh " ++"networks." ++msgstr "" ++"Client-Splash - Ñто ÑиÑтема аутентификации точек доÑтупа Ð´Ð»Ñ Ð±ÐµÑпроводных " ++"ÑчеиÑÑ‚Ñ‹Ñ… Ñетей." ++ ++msgid "" ++"Clients are redirected to this page after they have accepted the splash. If " ++"this is left empty they are redirected to the page they had requested." ++msgstr "" ++ ++msgid "Clients download speed is limited to this value (kbyte/s)" ++msgstr "" ++"СкороÑÑ‚ÑŒ ниÑходÑщего канала Ð´Ð»Ñ ÐºÐ»Ð¸ÐµÐ½Ñ‚Ð¾Ð² ограничена Ñтим значением (КБ/c)" ++ ++msgid "" ++"Clients that have accepted the splash are allowed to use the network for " ++"that many hours." ++msgstr "" ++"Клиенты, принÑвшие приглашение splash-Ñкрана, могут иÑпользовать Ñеть данное " ++"количеÑтво чаÑов." ++ ++msgid "Clients upload speed is limited to this value (kbyte/s)" ++msgstr "" ++"СкороÑÑ‚ÑŒ воÑходÑщего канала Ð´Ð»Ñ ÐºÐ»Ð¸ÐµÐ½Ñ‚Ð¾Ð² ограничена Ñтим значением (КБ/c)" ++ ++msgid "Contact" ++msgstr "СвÑзатьÑÑ" ++ ++msgid "Decline" ++msgstr "Отклонить" ++ ++msgid "" ++"Destination hosts and networks that are excluded from splashing, i.e. they " ++"are always allowed." ++msgstr "" ++ ++msgid "Donate some money to help us keep this project alive." ++msgstr "Пожертвовать деньги на поддержку Ñтого проекта." ++ ++msgid "Download limit" ++msgstr "Лимит загрузки" ++ ++msgid "Edit the complete splash text" ++msgstr "" ++ ++msgid "Fair Use Policy" ++msgstr "Политика добровольного иÑпользованиÑ" ++ ++msgid "Firewall zone" ++msgstr "Зона межÑетевого Ñкрана" ++ ++msgid "General" ++msgstr "Общие" ++ ++msgid "Get in %s with the operator of this access point." ++msgstr "" ++ ++msgid "Hostname" ++msgstr "Ð˜Ð¼Ñ Ñ…Ð¾Ñта" ++ ++msgid "IP Address" ++msgstr "IP-адреÑ" ++ ++msgid "" ++"If you operate your own wifi equipment use channels different from ours." ++msgstr "" ++"ЕÑли вы иÑпользуете ÑобÑтвенное оборудование Wi-Fi, иÑпользуйте каналы, " ++"отличающиеÑÑ Ð¾Ñ‚ наших." ++ ++msgid "If you use this network on a regular basis we ask for your support:" ++msgstr "ЕÑли вы иÑпользуете Ñту Ñеть регулÑрно, мы проÑим вашей поддержки:" ++ ++msgid "Include your own text in the default splash" ++msgstr "" ++ ++msgid "Intercept client traffic on this Interface" ++msgstr "Перехватывать клиентÑкий трафик на Ñтом интерфейÑе" ++ ++msgid "Interfaces" ++msgstr "ИнтерфейÑÑ‹" ++ ++msgid "Interfaces that are used for Splash." ++msgstr "ИнтерфейÑÑ‹, иÑпользуемые Ð´Ð»Ñ Splash." ++ ++msgid "" ++"KB/s (Download/Upload). You may be able to remove this limit by actively " ++"contributing to this project." ++msgstr "" ++"КБ/Ñ (загрузка/отдача). Данное ограничение может быть ÑнÑто при активном " ++"учаÑтии в Ñтом проекте." ++ ++msgid "Legally Prohibited Activities" ++msgstr "" ++ ++msgid "Legally Prohibited content" ++msgstr "ЮридичеÑки запрещенный контент" ++ ++msgid "MAC Address" ++msgstr "MAC-адреÑ" ++ ++msgid "MAC addresses in this list are blocked." ++msgstr "MAC-адреÑа из Ñтого ÑпиÑка заблокированы." ++ ++msgid "" ++"MAC addresses of whitelisted clients. These do not need to accept the splash " ++"and are not bandwidth limited." ++msgstr "" ++"MAC-адреÑа клиентов из \"белого\" ÑпиÑка. Данные клиенты не имеют " ++"ограничений пропуÑкной ÑпоÑобноÑти." ++ ++msgid "Netmask" ++msgstr "МаÑка Ñети" ++ ++msgid "Network" ++msgstr "Сеть" ++ ++msgid "No clients connected" ++msgstr "Клиенты не подключены" ++ ++msgid "" ++"Please note that we are not an internet service provider but an experimental " ++"community network." ++msgstr "" ++"ПожалуйÑта, обратите внимание, что мы не интернет-провайдер, а " ++"ÑкÑÐ¿ÐµÑ€Ð¸Ð¼ÐµÐ½Ñ‚Ð°Ð»ÑŒÐ½Ð°Ñ Ñеть ÑообщеÑтва." ++ ++msgid "Policy" ++msgstr "Политика" ++ ++msgid "Redirect target" ++msgstr "" ++ ++msgid "Safety" ++msgstr "БезопаÑный" ++ ++msgid "Save" ++msgstr "Сохранить" ++ ++msgid "Splash rules are integrated in this firewall zone" ++msgstr "Правила Splash интегрированы в зону Ñтого межÑетевого Ñкрана" ++ ++msgid "Splashtext" ++msgstr "ТекÑÑ‚ splash-Ñкрана" ++ ++msgid "" ++"The network, like the Internet, is unencrypted and open. Each participant is " ++"responsible for the safety of their own connections and devices." ++msgstr "" ++ ++msgid "" ++"The open and free wireless network of volunteers (\"Operators\") provides " ++"the necessary equipment and Internet connections (\"Infrastructure\") at " ++"their own expense." ++msgstr "" ++ ++msgid "" ++"The operator claims no liability for loss of data, unauthorized access/" ++"damage to devices, or financial losses that participants may suffer from the " ++"use of the network." ++msgstr "" ++ ++msgid "" ++"The participant agrees to not perform any action and refrain from acts which " ++"may violate the law or infringe upon the rights of third parties." ++msgstr "" ++ ++msgid "" ++"The participant agrees to not transfer content over the network which " ++"violates the law." ++msgstr "" ++ ++msgid "" ++"The participant agrees to not use the network in any way which will harm the " ++"infrastructure, the network itself, its operators or other participants." ++msgstr "" ++ ++msgid "" ++"These Terms of Use govern the use of the network by its participants' " ++"computer, PDA, or similar device (\"Devices\") within the network." ++msgstr "" ++ ++msgid "Time remaining" ++msgstr "ОÑтавшееÑÑ Ð²Ñ€ÐµÐ¼Ñ" ++ ++msgid "" ++"To ask for the reason why you have been blocked or ask for access again you " ++"can try to contact the owner of this access point:" ++msgstr "" ++"Чтобы узнать причину, по которой Ð²Ð°Ñ Ð·Ð°Ð±Ð»Ð¾ÐºÐ¸Ñ€Ð¾Ð²Ð°Ð»Ð¸, или Ñнова получить " ++"доÑтуп, ÑвÑжитеÑÑŒ Ñ Ð²Ð»Ð°Ð´ÐµÐ»ÑŒÑ†ÐµÐ¼ данной точки доÑтупа:" ++ ++msgid "Traffic in/out" ++msgstr "Трафик вх/иÑÑ…" ++ ++msgid "Upload limit" ++msgstr "Лимит отдачи" ++ ++msgid "Usage Agreement" ++msgstr "" ++ ++msgid "Welcome" ++msgstr "Добро пожаловать" ++ ++msgid "Whitelist" ++msgstr "\"Белый\" ÑпиÑок" ++ ++msgid "You are now connected to the free wireless mesh network" ++msgstr "Теперь вы подключены к беÑплатной беÑпроводной ÑчеиÑтой Ñети" ++ ++msgid "" ++"You can enter your own text that is displayed to clients here.
    It is " ++"possible to use the following markers: ###COMMUNITY###, ###COMMUNITY_URL###, " ++"###CONTACTURL###, ###LEASETIME###, ###LIMIT### and ###ACCEPT###." ++msgstr "" ++"ЗдеÑÑŒ вы можете указать Ñвой текÑÑ‚, который будет отображатьÑÑ ÐºÐ»Ð¸ÐµÐ½Ñ‚Ð°Ð¼.
    Возможно иÑпользовать Ñледующие маркеры: ###COMMUNITY###, " ++"###COMMUNITY_URL###, ###CONTACTURL###, ###LEASETIME###, ###LIMIT### and " ++"###ACCEPT###." ++ ++msgid "" ++"Your access to this network has been blocked, most likely because you did " ++"something that our rules explicitly forbid." ++msgstr "" ++"ДоÑтуп к Ñтой Ñети был заблокирован, Ñкорее вÑего, потому, что вы Ñделали " ++"что-то, что наши правила Ñвно запрещают." ++ ++msgid "Your bandwidth is limited to" ++msgstr "Ваша полоÑа пропуÑÐºÐ°Ð½Ð¸Ñ Ð¾Ð³Ñ€Ð°Ð½Ð¸Ñ‡ÐµÐ½Ð° значением" ++ ++msgid "blacklisted" ++msgstr "в \"чёрном\" ÑпиÑке" ++ ++msgid "expired" ++msgstr "иÑтёк" ++ ++msgid "optional when using host addresses" ++msgstr "опционально при иÑпользовании хоÑÑ‚-адреÑов" ++ ++msgid "perform any kind of illegal activities" ++msgstr "выполнÑÑ‚ÑŒ любые незаконные дейÑтвиÑ" ++ ++msgid "splashed" ++msgstr "уже в splash" ++ ++msgid "temporarily blocked" ++msgstr "временно заблокирован" ++ ++msgid "unknown" ++msgstr "неизвеÑтный" ++ ++msgid "use filesharing applications on this network" ++msgstr "иÑпользование файлообменных приложений в Ñтой Ñети" ++ ++msgid "waste bandwidth with unneccesary downloads or streams" ++msgstr "тратить пропуÑкную ÑпоÑобноÑÑ‚ÑŒ на ненужные загрузки или потоки" ++ ++msgid "whitelisted" ++msgstr "в \"белом\" ÑпиÑке" ++ ++#~ msgid "" ++#~ "Hosts and Networks that are listed here are excluded from splashing, i.e. " ++#~ "they are always allowed." ++#~ msgstr "" ++#~ "ПеречиÑленные хоÑÑ‚Ñ‹ и Ñети не получают Ð¿Ñ€Ð¸Ð³Ð»Ð°ÑˆÐµÐ½Ð¸Ñ splash-Ñкрана, Ñ‚.е. они " ++#~ "вÑегда разрешены." ++ ++#~ msgid "By accepting these rules you can use this network for" ++#~ msgstr "ÐŸÑ€Ð¸Ð½Ð¸Ð¼Ð°Ñ Ñти правила, вы можете иÑпользовать данную Ñеть длÑ" ++ ++#~ msgid "Edit Splash text" ++#~ msgstr "Редактировать текÑÑ‚ splash-Ñкрана" ++ ++#~ msgid "hour(s). After this time you need to accept these rules again." ++#~ msgstr "" ++#~ "чаÑ(Ñ‹). ПоÑле указанного времени Ð’Ñ‹ должны вновь принÑÑ‚ÑŒ Ñти правила." ++ ++# ЗдеÑÑŒ навернÑка нужно Ñклонить в другом падеже, надо Ñмотреть по контекÑту ++#~ msgid "the owner of this access point." ++#~ msgstr "Ñ Ð²Ð»Ð°Ð´ÐµÐ»ÑŒÑ†ÐµÐ¼ Ñтой точки доÑтупа." +diff --git a/feeds/luci/applications/luci-app-splash/po/sk/splash.po b/feeds/luci/applications/luci-app-splash/po/sk/splash.po +new file mode 100644 +index 0000000..e9dd448 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-splash/po/sk/splash.po +@@ -0,0 +1,303 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Last-Translator: Automatically generated\n" ++"Language-Team: none\n" ++"Language: \n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n" ++ ++msgid "Accept" ++msgstr "" ++ ++msgid "" ++"Access to the internet might be possible nevertheless, because some " ++"activists of this project share their private internet connections. These " ++"few connections are shared between all users. That means available bandwidth " ++"is limited and because of this we ask you not to do any of the following:" ++msgstr "" ++ ++msgid "" ++"Access to the network is not guaranteed. It can be interrupted at any time " ++"without notice for any reason, for certain devices, and/or may be blocked " ++"for certain users." ++msgstr "" ++ ++msgid "Active Clients" ++msgstr "" ++ ++msgid "Allowed hosts/subnets" ++msgstr "" ++ ++msgid "" ++"As an alternative to editing the complete splash text you can also just " ++"include some custom text in the default splash page by entering it here." ++msgstr "" ++ ++msgid "" ++"Bandwidth limit for clients is only activated when both up- and download " ++"limit are set. Use a value of 0 here to completely disable this limitation. " ++"Whitelisted clients are not limited." ++msgstr "" ++ ++msgid "" ++"Become an active member of this community and help by operating your own node" ++msgstr "" ++ ++msgid "Blacklist" ++msgstr "" ++ ++msgid "Blocked" ++msgstr "" ++ ++msgid "" ++"By accepting these rules you can use this network for %s hour(s). After this " ++"time you need to accept these rules again." ++msgstr "" ++ ++msgid "Clearance time" ++msgstr "" ++ ++msgid "Client-Splash" ++msgstr "" ++ ++msgid "" ++"Client-Splash is a hotspot authentification system for wireless mesh " ++"networks." ++msgstr "" ++ ++msgid "" ++"Clients are redirected to this page after they have accepted the splash. If " ++"this is left empty they are redirected to the page they had requested." ++msgstr "" ++ ++msgid "Clients download speed is limited to this value (kbyte/s)" ++msgstr "" ++ ++msgid "" ++"Clients that have accepted the splash are allowed to use the network for " ++"that many hours." ++msgstr "" ++ ++msgid "Clients upload speed is limited to this value (kbyte/s)" ++msgstr "" ++ ++msgid "Contact" ++msgstr "" ++ ++msgid "Decline" ++msgstr "" ++ ++msgid "" ++"Destination hosts and networks that are excluded from splashing, i.e. they " ++"are always allowed." ++msgstr "" ++ ++msgid "Donate some money to help us keep this project alive." ++msgstr "" ++ ++msgid "Download limit" ++msgstr "" ++ ++msgid "Edit the complete splash text" ++msgstr "" ++ ++msgid "Fair Use Policy" ++msgstr "" ++ ++msgid "Firewall zone" ++msgstr "" ++ ++msgid "General" ++msgstr "" ++ ++msgid "Get in %s with the operator of this access point." ++msgstr "" ++ ++msgid "Hostname" ++msgstr "" ++ ++msgid "IP Address" ++msgstr "" ++ ++msgid "" ++"If you operate your own wifi equipment use channels different from ours." ++msgstr "" ++ ++msgid "If you use this network on a regular basis we ask for your support:" ++msgstr "" ++ ++msgid "Include your own text in the default splash" ++msgstr "" ++ ++msgid "Intercept client traffic on this Interface" ++msgstr "" ++ ++msgid "Interfaces" ++msgstr "" ++ ++msgid "Interfaces that are used for Splash." ++msgstr "" ++ ++msgid "" ++"KB/s (Download/Upload). You may be able to remove this limit by actively " ++"contributing to this project." ++msgstr "" ++ ++msgid "Legally Prohibited Activities" ++msgstr "" ++ ++msgid "Legally Prohibited content" ++msgstr "" ++ ++msgid "MAC Address" ++msgstr "" ++ ++msgid "MAC addresses in this list are blocked." ++msgstr "" ++ ++msgid "" ++"MAC addresses of whitelisted clients. These do not need to accept the splash " ++"and are not bandwidth limited." ++msgstr "" ++ ++msgid "Netmask" ++msgstr "" ++ ++msgid "Network" ++msgstr "" ++ ++msgid "No clients connected" ++msgstr "" ++ ++msgid "" ++"Please note that we are not an internet service provider but an experimental " ++"community network." ++msgstr "" ++ ++msgid "Policy" ++msgstr "" ++ ++msgid "Redirect target" ++msgstr "" ++ ++msgid "Safety" ++msgstr "" ++ ++msgid "Save" ++msgstr "" ++ ++msgid "Splash rules are integrated in this firewall zone" ++msgstr "" ++ ++msgid "Splashtext" ++msgstr "" ++ ++msgid "" ++"The network, like the Internet, is unencrypted and open. Each participant is " ++"responsible for the safety of their own connections and devices." ++msgstr "" ++ ++msgid "" ++"The open and free wireless network of volunteers (\"Operators\") provides " ++"the necessary equipment and Internet connections (\"Infrastructure\") at " ++"their own expense." ++msgstr "" ++ ++msgid "" ++"The operator claims no liability for loss of data, unauthorized access/" ++"damage to devices, or financial losses that participants may suffer from the " ++"use of the network." ++msgstr "" ++ ++msgid "" ++"The participant agrees to not perform any action and refrain from acts which " ++"may violate the law or infringe upon the rights of third parties." ++msgstr "" ++ ++msgid "" ++"The participant agrees to not transfer content over the network which " ++"violates the law." ++msgstr "" ++ ++msgid "" ++"The participant agrees to not use the network in any way which will harm the " ++"infrastructure, the network itself, its operators or other participants." ++msgstr "" ++ ++msgid "" ++"These Terms of Use govern the use of the network by its participants' " ++"computer, PDA, or similar device (\"Devices\") within the network." ++msgstr "" ++ ++msgid "Time remaining" ++msgstr "" ++ ++msgid "" ++"To ask for the reason why you have been blocked or ask for access again you " ++"can try to contact the owner of this access point:" ++msgstr "" ++ ++msgid "Traffic in/out" ++msgstr "" ++ ++msgid "Upload limit" ++msgstr "" ++ ++msgid "Usage Agreement" ++msgstr "" ++ ++msgid "Welcome" ++msgstr "" ++ ++msgid "Whitelist" ++msgstr "" ++ ++msgid "You are now connected to the free wireless mesh network" ++msgstr "" ++ ++msgid "" ++"You can enter your own text that is displayed to clients here.
    It is " ++"possible to use the following markers: ###COMMUNITY###, ###COMMUNITY_URL###, " ++"###CONTACTURL###, ###LEASETIME###, ###LIMIT### and ###ACCEPT###." ++msgstr "" ++ ++msgid "" ++"Your access to this network has been blocked, most likely because you did " ++"something that our rules explicitly forbid." ++msgstr "" ++ ++msgid "Your bandwidth is limited to" ++msgstr "" ++ ++msgid "blacklisted" ++msgstr "" ++ ++msgid "expired" ++msgstr "" ++ ++msgid "optional when using host addresses" ++msgstr "" ++ ++msgid "perform any kind of illegal activities" ++msgstr "" ++ ++msgid "splashed" ++msgstr "" ++ ++msgid "temporarily blocked" ++msgstr "" ++ ++msgid "unknown" ++msgstr "" ++ ++msgid "use filesharing applications on this network" ++msgstr "" ++ ++msgid "waste bandwidth with unneccesary downloads or streams" ++msgstr "" ++ ++msgid "whitelisted" ++msgstr "" +diff --git a/feeds/luci/applications/luci-app-splash/po/sv/splash.po b/feeds/luci/applications/luci-app-splash/po/sv/splash.po +new file mode 100644 +index 0000000..cd573b2 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-splash/po/sv/splash.po +@@ -0,0 +1,303 @@ ++msgid "" ++msgstr "" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Last-Translator: Automatically generated\n" ++"Language-Team: none\n" ++"Language: sv\n" ++"MIME-Version: 1.0\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n != 1);\n" ++ ++msgid "Accept" ++msgstr "" ++ ++msgid "" ++"Access to the internet might be possible nevertheless, because some " ++"activists of this project share their private internet connections. These " ++"few connections are shared between all users. That means available bandwidth " ++"is limited and because of this we ask you not to do any of the following:" ++msgstr "" ++ ++msgid "" ++"Access to the network is not guaranteed. It can be interrupted at any time " ++"without notice for any reason, for certain devices, and/or may be blocked " ++"for certain users." ++msgstr "" ++ ++msgid "Active Clients" ++msgstr "" ++ ++msgid "Allowed hosts/subnets" ++msgstr "" ++ ++msgid "" ++"As an alternative to editing the complete splash text you can also just " ++"include some custom text in the default splash page by entering it here." ++msgstr "" ++ ++msgid "" ++"Bandwidth limit for clients is only activated when both up- and download " ++"limit are set. Use a value of 0 here to completely disable this limitation. " ++"Whitelisted clients are not limited." ++msgstr "" ++ ++msgid "" ++"Become an active member of this community and help by operating your own node" ++msgstr "" ++ ++msgid "Blacklist" ++msgstr "" ++ ++msgid "Blocked" ++msgstr "" ++ ++msgid "" ++"By accepting these rules you can use this network for %s hour(s). After this " ++"time you need to accept these rules again." ++msgstr "" ++ ++msgid "Clearance time" ++msgstr "" ++ ++msgid "Client-Splash" ++msgstr "" ++ ++msgid "" ++"Client-Splash is a hotspot authentification system for wireless mesh " ++"networks." ++msgstr "" ++ ++msgid "" ++"Clients are redirected to this page after they have accepted the splash. If " ++"this is left empty they are redirected to the page they had requested." ++msgstr "" ++ ++msgid "Clients download speed is limited to this value (kbyte/s)" ++msgstr "" ++ ++msgid "" ++"Clients that have accepted the splash are allowed to use the network for " ++"that many hours." ++msgstr "" ++ ++msgid "Clients upload speed is limited to this value (kbyte/s)" ++msgstr "" ++ ++msgid "Contact" ++msgstr "" ++ ++msgid "Decline" ++msgstr "" ++ ++msgid "" ++"Destination hosts and networks that are excluded from splashing, i.e. they " ++"are always allowed." ++msgstr "" ++ ++msgid "Donate some money to help us keep this project alive." ++msgstr "" ++ ++msgid "Download limit" ++msgstr "" ++ ++msgid "Edit the complete splash text" ++msgstr "" ++ ++msgid "Fair Use Policy" ++msgstr "" ++ ++msgid "Firewall zone" ++msgstr "" ++ ++msgid "General" ++msgstr "" ++ ++msgid "Get in %s with the operator of this access point." ++msgstr "" ++ ++msgid "Hostname" ++msgstr "" ++ ++msgid "IP Address" ++msgstr "" ++ ++msgid "" ++"If you operate your own wifi equipment use channels different from ours." ++msgstr "" ++ ++msgid "If you use this network on a regular basis we ask for your support:" ++msgstr "" ++ ++msgid "Include your own text in the default splash" ++msgstr "" ++ ++msgid "Intercept client traffic on this Interface" ++msgstr "" ++ ++msgid "Interfaces" ++msgstr "" ++ ++msgid "Interfaces that are used for Splash." ++msgstr "" ++ ++msgid "" ++"KB/s (Download/Upload). You may be able to remove this limit by actively " ++"contributing to this project." ++msgstr "" ++ ++msgid "Legally Prohibited Activities" ++msgstr "" ++ ++msgid "Legally Prohibited content" ++msgstr "" ++ ++msgid "MAC Address" ++msgstr "" ++ ++msgid "MAC addresses in this list are blocked." ++msgstr "" ++ ++msgid "" ++"MAC addresses of whitelisted clients. These do not need to accept the splash " ++"and are not bandwidth limited." ++msgstr "" ++ ++msgid "Netmask" ++msgstr "" ++ ++msgid "Network" ++msgstr "" ++ ++msgid "No clients connected" ++msgstr "" ++ ++msgid "" ++"Please note that we are not an internet service provider but an experimental " ++"community network." ++msgstr "" ++ ++msgid "Policy" ++msgstr "" ++ ++msgid "Redirect target" ++msgstr "" ++ ++msgid "Safety" ++msgstr "" ++ ++msgid "Save" ++msgstr "" ++ ++msgid "Splash rules are integrated in this firewall zone" ++msgstr "" ++ ++msgid "Splashtext" ++msgstr "" ++ ++msgid "" ++"The network, like the Internet, is unencrypted and open. Each participant is " ++"responsible for the safety of their own connections and devices." ++msgstr "" ++ ++msgid "" ++"The open and free wireless network of volunteers (\"Operators\") provides " ++"the necessary equipment and Internet connections (\"Infrastructure\") at " ++"their own expense." ++msgstr "" ++ ++msgid "" ++"The operator claims no liability for loss of data, unauthorized access/" ++"damage to devices, or financial losses that participants may suffer from the " ++"use of the network." ++msgstr "" ++ ++msgid "" ++"The participant agrees to not perform any action and refrain from acts which " ++"may violate the law or infringe upon the rights of third parties." ++msgstr "" ++ ++msgid "" ++"The participant agrees to not transfer content over the network which " ++"violates the law." ++msgstr "" ++ ++msgid "" ++"The participant agrees to not use the network in any way which will harm the " ++"infrastructure, the network itself, its operators or other participants." ++msgstr "" ++ ++msgid "" ++"These Terms of Use govern the use of the network by its participants' " ++"computer, PDA, or similar device (\"Devices\") within the network." ++msgstr "" ++ ++msgid "Time remaining" ++msgstr "" ++ ++msgid "" ++"To ask for the reason why you have been blocked or ask for access again you " ++"can try to contact the owner of this access point:" ++msgstr "" ++ ++msgid "Traffic in/out" ++msgstr "" ++ ++msgid "Upload limit" ++msgstr "" ++ ++msgid "Usage Agreement" ++msgstr "" ++ ++msgid "Welcome" ++msgstr "" ++ ++msgid "Whitelist" ++msgstr "" ++ ++msgid "You are now connected to the free wireless mesh network" ++msgstr "" ++ ++msgid "" ++"You can enter your own text that is displayed to clients here.
    It is " ++"possible to use the following markers: ###COMMUNITY###, ###COMMUNITY_URL###, " ++"###CONTACTURL###, ###LEASETIME###, ###LIMIT### and ###ACCEPT###." ++msgstr "" ++ ++msgid "" ++"Your access to this network has been blocked, most likely because you did " ++"something that our rules explicitly forbid." ++msgstr "" ++ ++msgid "Your bandwidth is limited to" ++msgstr "" ++ ++msgid "blacklisted" ++msgstr "" ++ ++msgid "expired" ++msgstr "" ++ ++msgid "optional when using host addresses" ++msgstr "" ++ ++msgid "perform any kind of illegal activities" ++msgstr "" ++ ++msgid "splashed" ++msgstr "" ++ ++msgid "temporarily blocked" ++msgstr "" ++ ++msgid "unknown" ++msgstr "" ++ ++msgid "use filesharing applications on this network" ++msgstr "" ++ ++msgid "waste bandwidth with unneccesary downloads or streams" ++msgstr "" ++ ++msgid "whitelisted" ++msgstr "" +diff --git a/feeds/luci/applications/luci-app-splash/po/templates/splash.pot b/feeds/luci/applications/luci-app-splash/po/templates/splash.pot +new file mode 100644 +index 0000000..f29b736 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-splash/po/templates/splash.pot +@@ -0,0 +1,295 @@ ++msgid "" ++msgstr "Content-Type: text/plain; charset=UTF-8" ++ ++msgid "Accept" ++msgstr "" ++ ++msgid "" ++"Access to the internet might be possible nevertheless, because some " ++"activists of this project share their private internet connections. These " ++"few connections are shared between all users. That means available bandwidth " ++"is limited and because of this we ask you not to do any of the following:" ++msgstr "" ++ ++msgid "" ++"Access to the network is not guaranteed. It can be interrupted at any time " ++"without notice for any reason, for certain devices, and/or may be blocked " ++"for certain users." ++msgstr "" ++ ++msgid "Active Clients" ++msgstr "" ++ ++msgid "Allowed hosts/subnets" ++msgstr "" ++ ++msgid "" ++"As an alternative to editing the complete splash text you can also just " ++"include some custom text in the default splash page by entering it here." ++msgstr "" ++ ++msgid "" ++"Bandwidth limit for clients is only activated when both up- and download " ++"limit are set. Use a value of 0 here to completely disable this limitation. " ++"Whitelisted clients are not limited." ++msgstr "" ++ ++msgid "" ++"Become an active member of this community and help by operating your own node" ++msgstr "" ++ ++msgid "Blacklist" ++msgstr "" ++ ++msgid "Blocked" ++msgstr "" ++ ++msgid "" ++"By accepting these rules you can use this network for %s hour(s). After this " ++"time you need to accept these rules again." ++msgstr "" ++ ++msgid "Clearance time" ++msgstr "" ++ ++msgid "Client-Splash" ++msgstr "" ++ ++msgid "" ++"Client-Splash is a hotspot authentification system for wireless mesh " ++"networks." ++msgstr "" ++ ++msgid "" ++"Clients are redirected to this page after they have accepted the splash. If " ++"this is left empty they are redirected to the page they had requested." ++msgstr "" ++ ++msgid "Clients download speed is limited to this value (kbyte/s)" ++msgstr "" ++ ++msgid "" ++"Clients that have accepted the splash are allowed to use the network for " ++"that many hours." ++msgstr "" ++ ++msgid "Clients upload speed is limited to this value (kbyte/s)" ++msgstr "" ++ ++msgid "Contact" ++msgstr "" ++ ++msgid "Decline" ++msgstr "" ++ ++msgid "" ++"Destination hosts and networks that are excluded from splashing, i.e. they " ++"are always allowed." ++msgstr "" ++ ++msgid "Donate some money to help us keep this project alive." ++msgstr "" ++ ++msgid "Download limit" ++msgstr "" ++ ++msgid "Edit the complete splash text" ++msgstr "" ++ ++msgid "Fair Use Policy" ++msgstr "" ++ ++msgid "Firewall zone" ++msgstr "" ++ ++msgid "General" ++msgstr "" ++ ++msgid "Get in %s with the operator of this access point." ++msgstr "" ++ ++msgid "Hostname" ++msgstr "" ++ ++msgid "IP Address" ++msgstr "" ++ ++msgid "" ++"If you operate your own wifi equipment use channels different from ours." ++msgstr "" ++ ++msgid "If you use this network on a regular basis we ask for your support:" ++msgstr "" ++ ++msgid "Include your own text in the default splash" ++msgstr "" ++ ++msgid "Intercept client traffic on this Interface" ++msgstr "" ++ ++msgid "Interfaces" ++msgstr "" ++ ++msgid "Interfaces that are used for Splash." ++msgstr "" ++ ++msgid "" ++"KB/s (Download/Upload). You may be able to remove this limit by actively " ++"contributing to this project." ++msgstr "" ++ ++msgid "Legally Prohibited Activities" ++msgstr "" ++ ++msgid "Legally Prohibited content" ++msgstr "" ++ ++msgid "MAC Address" ++msgstr "" ++ ++msgid "MAC addresses in this list are blocked." ++msgstr "" ++ ++msgid "" ++"MAC addresses of whitelisted clients. These do not need to accept the splash " ++"and are not bandwidth limited." ++msgstr "" ++ ++msgid "Netmask" ++msgstr "" ++ ++msgid "Network" ++msgstr "" ++ ++msgid "No clients connected" ++msgstr "" ++ ++msgid "" ++"Please note that we are not an internet service provider but an experimental " ++"community network." ++msgstr "" ++ ++msgid "Policy" ++msgstr "" ++ ++msgid "Redirect target" ++msgstr "" ++ ++msgid "Safety" ++msgstr "" ++ ++msgid "Save" ++msgstr "" ++ ++msgid "Splash rules are integrated in this firewall zone" ++msgstr "" ++ ++msgid "Splashtext" ++msgstr "" ++ ++msgid "" ++"The network, like the Internet, is unencrypted and open. Each participant is " ++"responsible for the safety of their own connections and devices." ++msgstr "" ++ ++msgid "" ++"The open and free wireless network of volunteers (\"Operators\") provides " ++"the necessary equipment and Internet connections (\"Infrastructure\") at " ++"their own expense." ++msgstr "" ++ ++msgid "" ++"The operator claims no liability for loss of data, unauthorized access/" ++"damage to devices, or financial losses that participants may suffer from the " ++"use of the network." ++msgstr "" ++ ++msgid "" ++"The participant agrees to not perform any action and refrain from acts which " ++"may violate the law or infringe upon the rights of third parties." ++msgstr "" ++ ++msgid "" ++"The participant agrees to not transfer content over the network which " ++"violates the law." ++msgstr "" ++ ++msgid "" ++"The participant agrees to not use the network in any way which will harm the " ++"infrastructure, the network itself, its operators or other participants." ++msgstr "" ++ ++msgid "" ++"These Terms of Use govern the use of the network by its participants' " ++"computer, PDA, or similar device (\"Devices\") within the network." ++msgstr "" ++ ++msgid "Time remaining" ++msgstr "" ++ ++msgid "" ++"To ask for the reason why you have been blocked or ask for access again you " ++"can try to contact the owner of this access point:" ++msgstr "" ++ ++msgid "Traffic in/out" ++msgstr "" ++ ++msgid "Upload limit" ++msgstr "" ++ ++msgid "Usage Agreement" ++msgstr "" ++ ++msgid "Welcome" ++msgstr "" ++ ++msgid "Whitelist" ++msgstr "" ++ ++msgid "You are now connected to the free wireless mesh network" ++msgstr "" ++ ++msgid "" ++"You can enter your own text that is displayed to clients here.
    It is " ++"possible to use the following markers: ###COMMUNITY###, ###COMMUNITY_URL###, " ++"###CONTACTURL###, ###LEASETIME###, ###LIMIT### and ###ACCEPT###." ++msgstr "" ++ ++msgid "" ++"Your access to this network has been blocked, most likely because you did " ++"something that our rules explicitly forbid." ++msgstr "" ++ ++msgid "Your bandwidth is limited to" ++msgstr "" ++ ++msgid "blacklisted" ++msgstr "" ++ ++msgid "expired" ++msgstr "" ++ ++msgid "optional when using host addresses" ++msgstr "" ++ ++msgid "perform any kind of illegal activities" ++msgstr "" ++ ++msgid "splashed" ++msgstr "" ++ ++msgid "temporarily blocked" ++msgstr "" ++ ++msgid "unknown" ++msgstr "" ++ ++msgid "use filesharing applications on this network" ++msgstr "" ++ ++msgid "waste bandwidth with unneccesary downloads or streams" ++msgstr "" ++ ++msgid "whitelisted" ++msgstr "" +diff --git a/feeds/luci/applications/luci-app-splash/po/tr/splash.po b/feeds/luci/applications/luci-app-splash/po/tr/splash.po +new file mode 100644 +index 0000000..03fa7b3 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-splash/po/tr/splash.po +@@ -0,0 +1,303 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Last-Translator: Automatically generated\n" ++"Language-Team: none\n" ++"Language: \n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=1; plural=0;\n" ++ ++msgid "Accept" ++msgstr "" ++ ++msgid "" ++"Access to the internet might be possible nevertheless, because some " ++"activists of this project share their private internet connections. These " ++"few connections are shared between all users. That means available bandwidth " ++"is limited and because of this we ask you not to do any of the following:" ++msgstr "" ++ ++msgid "" ++"Access to the network is not guaranteed. It can be interrupted at any time " ++"without notice for any reason, for certain devices, and/or may be blocked " ++"for certain users." ++msgstr "" ++ ++msgid "Active Clients" ++msgstr "" ++ ++msgid "Allowed hosts/subnets" ++msgstr "" ++ ++msgid "" ++"As an alternative to editing the complete splash text you can also just " ++"include some custom text in the default splash page by entering it here." ++msgstr "" ++ ++msgid "" ++"Bandwidth limit for clients is only activated when both up- and download " ++"limit are set. Use a value of 0 here to completely disable this limitation. " ++"Whitelisted clients are not limited." ++msgstr "" ++ ++msgid "" ++"Become an active member of this community and help by operating your own node" ++msgstr "" ++ ++msgid "Blacklist" ++msgstr "" ++ ++msgid "Blocked" ++msgstr "" ++ ++msgid "" ++"By accepting these rules you can use this network for %s hour(s). After this " ++"time you need to accept these rules again." ++msgstr "" ++ ++msgid "Clearance time" ++msgstr "" ++ ++msgid "Client-Splash" ++msgstr "" ++ ++msgid "" ++"Client-Splash is a hotspot authentification system for wireless mesh " ++"networks." ++msgstr "" ++ ++msgid "" ++"Clients are redirected to this page after they have accepted the splash. If " ++"this is left empty they are redirected to the page they had requested." ++msgstr "" ++ ++msgid "Clients download speed is limited to this value (kbyte/s)" ++msgstr "" ++ ++msgid "" ++"Clients that have accepted the splash are allowed to use the network for " ++"that many hours." ++msgstr "" ++ ++msgid "Clients upload speed is limited to this value (kbyte/s)" ++msgstr "" ++ ++msgid "Contact" ++msgstr "" ++ ++msgid "Decline" ++msgstr "" ++ ++msgid "" ++"Destination hosts and networks that are excluded from splashing, i.e. they " ++"are always allowed." ++msgstr "" ++ ++msgid "Donate some money to help us keep this project alive." ++msgstr "" ++ ++msgid "Download limit" ++msgstr "" ++ ++msgid "Edit the complete splash text" ++msgstr "" ++ ++msgid "Fair Use Policy" ++msgstr "" ++ ++msgid "Firewall zone" ++msgstr "" ++ ++msgid "General" ++msgstr "" ++ ++msgid "Get in %s with the operator of this access point." ++msgstr "" ++ ++msgid "Hostname" ++msgstr "" ++ ++msgid "IP Address" ++msgstr "" ++ ++msgid "" ++"If you operate your own wifi equipment use channels different from ours." ++msgstr "" ++ ++msgid "If you use this network on a regular basis we ask for your support:" ++msgstr "" ++ ++msgid "Include your own text in the default splash" ++msgstr "" ++ ++msgid "Intercept client traffic on this Interface" ++msgstr "" ++ ++msgid "Interfaces" ++msgstr "" ++ ++msgid "Interfaces that are used for Splash." ++msgstr "" ++ ++msgid "" ++"KB/s (Download/Upload). You may be able to remove this limit by actively " ++"contributing to this project." ++msgstr "" ++ ++msgid "Legally Prohibited Activities" ++msgstr "" ++ ++msgid "Legally Prohibited content" ++msgstr "" ++ ++msgid "MAC Address" ++msgstr "" ++ ++msgid "MAC addresses in this list are blocked." ++msgstr "" ++ ++msgid "" ++"MAC addresses of whitelisted clients. These do not need to accept the splash " ++"and are not bandwidth limited." ++msgstr "" ++ ++msgid "Netmask" ++msgstr "" ++ ++msgid "Network" ++msgstr "" ++ ++msgid "No clients connected" ++msgstr "" ++ ++msgid "" ++"Please note that we are not an internet service provider but an experimental " ++"community network." ++msgstr "" ++ ++msgid "Policy" ++msgstr "" ++ ++msgid "Redirect target" ++msgstr "" ++ ++msgid "Safety" ++msgstr "" ++ ++msgid "Save" ++msgstr "" ++ ++msgid "Splash rules are integrated in this firewall zone" ++msgstr "" ++ ++msgid "Splashtext" ++msgstr "" ++ ++msgid "" ++"The network, like the Internet, is unencrypted and open. Each participant is " ++"responsible for the safety of their own connections and devices." ++msgstr "" ++ ++msgid "" ++"The open and free wireless network of volunteers (\"Operators\") provides " ++"the necessary equipment and Internet connections (\"Infrastructure\") at " ++"their own expense." ++msgstr "" ++ ++msgid "" ++"The operator claims no liability for loss of data, unauthorized access/" ++"damage to devices, or financial losses that participants may suffer from the " ++"use of the network." ++msgstr "" ++ ++msgid "" ++"The participant agrees to not perform any action and refrain from acts which " ++"may violate the law or infringe upon the rights of third parties." ++msgstr "" ++ ++msgid "" ++"The participant agrees to not transfer content over the network which " ++"violates the law." ++msgstr "" ++ ++msgid "" ++"The participant agrees to not use the network in any way which will harm the " ++"infrastructure, the network itself, its operators or other participants." ++msgstr "" ++ ++msgid "" ++"These Terms of Use govern the use of the network by its participants' " ++"computer, PDA, or similar device (\"Devices\") within the network." ++msgstr "" ++ ++msgid "Time remaining" ++msgstr "" ++ ++msgid "" ++"To ask for the reason why you have been blocked or ask for access again you " ++"can try to contact the owner of this access point:" ++msgstr "" ++ ++msgid "Traffic in/out" ++msgstr "" ++ ++msgid "Upload limit" ++msgstr "" ++ ++msgid "Usage Agreement" ++msgstr "" ++ ++msgid "Welcome" ++msgstr "" ++ ++msgid "Whitelist" ++msgstr "" ++ ++msgid "You are now connected to the free wireless mesh network" ++msgstr "" ++ ++msgid "" ++"You can enter your own text that is displayed to clients here.
    It is " ++"possible to use the following markers: ###COMMUNITY###, ###COMMUNITY_URL###, " ++"###CONTACTURL###, ###LEASETIME###, ###LIMIT### and ###ACCEPT###." ++msgstr "" ++ ++msgid "" ++"Your access to this network has been blocked, most likely because you did " ++"something that our rules explicitly forbid." ++msgstr "" ++ ++msgid "Your bandwidth is limited to" ++msgstr "" ++ ++msgid "blacklisted" ++msgstr "" ++ ++msgid "expired" ++msgstr "" ++ ++msgid "optional when using host addresses" ++msgstr "" ++ ++msgid "perform any kind of illegal activities" ++msgstr "" ++ ++msgid "splashed" ++msgstr "" ++ ++msgid "temporarily blocked" ++msgstr "" ++ ++msgid "unknown" ++msgstr "" ++ ++msgid "use filesharing applications on this network" ++msgstr "" ++ ++msgid "waste bandwidth with unneccesary downloads or streams" ++msgstr "" ++ ++msgid "whitelisted" ++msgstr "" +diff --git a/feeds/luci/applications/luci-app-splash/po/uk/splash.po b/feeds/luci/applications/luci-app-splash/po/uk/splash.po +new file mode 100644 +index 0000000..2364c63 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-splash/po/uk/splash.po +@@ -0,0 +1,304 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Last-Translator: Automatically generated\n" ++"Language-Team: none\n" ++"Language: \n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n" ++"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" ++ ++msgid "Accept" ++msgstr "" ++ ++msgid "" ++"Access to the internet might be possible nevertheless, because some " ++"activists of this project share their private internet connections. These " ++"few connections are shared between all users. That means available bandwidth " ++"is limited and because of this we ask you not to do any of the following:" ++msgstr "" ++ ++msgid "" ++"Access to the network is not guaranteed. It can be interrupted at any time " ++"without notice for any reason, for certain devices, and/or may be blocked " ++"for certain users." ++msgstr "" ++ ++msgid "Active Clients" ++msgstr "" ++ ++msgid "Allowed hosts/subnets" ++msgstr "" ++ ++msgid "" ++"As an alternative to editing the complete splash text you can also just " ++"include some custom text in the default splash page by entering it here." ++msgstr "" ++ ++msgid "" ++"Bandwidth limit for clients is only activated when both up- and download " ++"limit are set. Use a value of 0 here to completely disable this limitation. " ++"Whitelisted clients are not limited." ++msgstr "" ++ ++msgid "" ++"Become an active member of this community and help by operating your own node" ++msgstr "" ++ ++msgid "Blacklist" ++msgstr "" ++ ++msgid "Blocked" ++msgstr "" ++ ++msgid "" ++"By accepting these rules you can use this network for %s hour(s). After this " ++"time you need to accept these rules again." ++msgstr "" ++ ++msgid "Clearance time" ++msgstr "" ++ ++msgid "Client-Splash" ++msgstr "" ++ ++msgid "" ++"Client-Splash is a hotspot authentification system for wireless mesh " ++"networks." ++msgstr "" ++ ++msgid "" ++"Clients are redirected to this page after they have accepted the splash. If " ++"this is left empty they are redirected to the page they had requested." ++msgstr "" ++ ++msgid "Clients download speed is limited to this value (kbyte/s)" ++msgstr "" ++ ++msgid "" ++"Clients that have accepted the splash are allowed to use the network for " ++"that many hours." ++msgstr "" ++ ++msgid "Clients upload speed is limited to this value (kbyte/s)" ++msgstr "" ++ ++msgid "Contact" ++msgstr "" ++ ++msgid "Decline" ++msgstr "" ++ ++msgid "" ++"Destination hosts and networks that are excluded from splashing, i.e. they " ++"are always allowed." ++msgstr "" ++ ++msgid "Donate some money to help us keep this project alive." ++msgstr "" ++ ++msgid "Download limit" ++msgstr "" ++ ++msgid "Edit the complete splash text" ++msgstr "" ++ ++msgid "Fair Use Policy" ++msgstr "" ++ ++msgid "Firewall zone" ++msgstr "" ++ ++msgid "General" ++msgstr "" ++ ++msgid "Get in %s with the operator of this access point." ++msgstr "" ++ ++msgid "Hostname" ++msgstr "" ++ ++msgid "IP Address" ++msgstr "" ++ ++msgid "" ++"If you operate your own wifi equipment use channels different from ours." ++msgstr "" ++ ++msgid "If you use this network on a regular basis we ask for your support:" ++msgstr "" ++ ++msgid "Include your own text in the default splash" ++msgstr "" ++ ++msgid "Intercept client traffic on this Interface" ++msgstr "" ++ ++msgid "Interfaces" ++msgstr "" ++ ++msgid "Interfaces that are used for Splash." ++msgstr "" ++ ++msgid "" ++"KB/s (Download/Upload). You may be able to remove this limit by actively " ++"contributing to this project." ++msgstr "" ++ ++msgid "Legally Prohibited Activities" ++msgstr "" ++ ++msgid "Legally Prohibited content" ++msgstr "" ++ ++msgid "MAC Address" ++msgstr "" ++ ++msgid "MAC addresses in this list are blocked." ++msgstr "" ++ ++msgid "" ++"MAC addresses of whitelisted clients. These do not need to accept the splash " ++"and are not bandwidth limited." ++msgstr "" ++ ++msgid "Netmask" ++msgstr "" ++ ++msgid "Network" ++msgstr "" ++ ++msgid "No clients connected" ++msgstr "" ++ ++msgid "" ++"Please note that we are not an internet service provider but an experimental " ++"community network." ++msgstr "" ++ ++msgid "Policy" ++msgstr "" ++ ++msgid "Redirect target" ++msgstr "" ++ ++msgid "Safety" ++msgstr "" ++ ++msgid "Save" ++msgstr "" ++ ++msgid "Splash rules are integrated in this firewall zone" ++msgstr "" ++ ++msgid "Splashtext" ++msgstr "" ++ ++msgid "" ++"The network, like the Internet, is unencrypted and open. Each participant is " ++"responsible for the safety of their own connections and devices." ++msgstr "" ++ ++msgid "" ++"The open and free wireless network of volunteers (\"Operators\") provides " ++"the necessary equipment and Internet connections (\"Infrastructure\") at " ++"their own expense." ++msgstr "" ++ ++msgid "" ++"The operator claims no liability for loss of data, unauthorized access/" ++"damage to devices, or financial losses that participants may suffer from the " ++"use of the network." ++msgstr "" ++ ++msgid "" ++"The participant agrees to not perform any action and refrain from acts which " ++"may violate the law or infringe upon the rights of third parties." ++msgstr "" ++ ++msgid "" ++"The participant agrees to not transfer content over the network which " ++"violates the law." ++msgstr "" ++ ++msgid "" ++"The participant agrees to not use the network in any way which will harm the " ++"infrastructure, the network itself, its operators or other participants." ++msgstr "" ++ ++msgid "" ++"These Terms of Use govern the use of the network by its participants' " ++"computer, PDA, or similar device (\"Devices\") within the network." ++msgstr "" ++ ++msgid "Time remaining" ++msgstr "" ++ ++msgid "" ++"To ask for the reason why you have been blocked or ask for access again you " ++"can try to contact the owner of this access point:" ++msgstr "" ++ ++msgid "Traffic in/out" ++msgstr "" ++ ++msgid "Upload limit" ++msgstr "" ++ ++msgid "Usage Agreement" ++msgstr "" ++ ++msgid "Welcome" ++msgstr "" ++ ++msgid "Whitelist" ++msgstr "" ++ ++msgid "You are now connected to the free wireless mesh network" ++msgstr "" ++ ++msgid "" ++"You can enter your own text that is displayed to clients here.
    It is " ++"possible to use the following markers: ###COMMUNITY###, ###COMMUNITY_URL###, " ++"###CONTACTURL###, ###LEASETIME###, ###LIMIT### and ###ACCEPT###." ++msgstr "" ++ ++msgid "" ++"Your access to this network has been blocked, most likely because you did " ++"something that our rules explicitly forbid." ++msgstr "" ++ ++msgid "Your bandwidth is limited to" ++msgstr "" ++ ++msgid "blacklisted" ++msgstr "" ++ ++msgid "expired" ++msgstr "" ++ ++msgid "optional when using host addresses" ++msgstr "" ++ ++msgid "perform any kind of illegal activities" ++msgstr "" ++ ++msgid "splashed" ++msgstr "" ++ ++msgid "temporarily blocked" ++msgstr "" ++ ++msgid "unknown" ++msgstr "" ++ ++msgid "use filesharing applications on this network" ++msgstr "" ++ ++msgid "waste bandwidth with unneccesary downloads or streams" ++msgstr "" ++ ++msgid "whitelisted" ++msgstr "" +diff --git a/feeds/luci/applications/luci-app-splash/po/vi/splash.po b/feeds/luci/applications/luci-app-splash/po/vi/splash.po +new file mode 100644 +index 0000000..615be16 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-splash/po/vi/splash.po +@@ -0,0 +1,292 @@ ++msgid "Accept" ++msgstr "" ++ ++msgid "" ++"Access to the internet might be possible nevertheless, because some " ++"activists of this project share their private internet connections. These " ++"few connections are shared between all users. That means available bandwidth " ++"is limited and because of this we ask you not to do any of the following:" ++msgstr "" ++ ++msgid "" ++"Access to the network is not guaranteed. It can be interrupted at any time " ++"without notice for any reason, for certain devices, and/or may be blocked " ++"for certain users." ++msgstr "" ++ ++msgid "Active Clients" ++msgstr "" ++ ++msgid "Allowed hosts/subnets" ++msgstr "" ++ ++msgid "" ++"As an alternative to editing the complete splash text you can also just " ++"include some custom text in the default splash page by entering it here." ++msgstr "" ++ ++msgid "" ++"Bandwidth limit for clients is only activated when both up- and download " ++"limit are set. Use a value of 0 here to completely disable this limitation. " ++"Whitelisted clients are not limited." ++msgstr "" ++ ++msgid "" ++"Become an active member of this community and help by operating your own node" ++msgstr "" ++ ++msgid "Blacklist" ++msgstr "" ++ ++msgid "Blocked" ++msgstr "" ++ ++msgid "" ++"By accepting these rules you can use this network for %s hour(s). After this " ++"time you need to accept these rules again." ++msgstr "" ++ ++msgid "Clearance time" ++msgstr "" ++ ++msgid "Client-Splash" ++msgstr "" ++ ++msgid "" ++"Client-Splash is a hotspot authentification system for wireless mesh " ++"networks." ++msgstr "" ++ ++msgid "" ++"Clients are redirected to this page after they have accepted the splash. If " ++"this is left empty they are redirected to the page they had requested." ++msgstr "" ++ ++msgid "Clients download speed is limited to this value (kbyte/s)" ++msgstr "" ++ ++msgid "" ++"Clients that have accepted the splash are allowed to use the network for " ++"that many hours." ++msgstr "" ++ ++msgid "Clients upload speed is limited to this value (kbyte/s)" ++msgstr "" ++ ++msgid "Contact" ++msgstr "" ++ ++msgid "Decline" ++msgstr "" ++ ++msgid "" ++"Destination hosts and networks that are excluded from splashing, i.e. they " ++"are always allowed." ++msgstr "" ++ ++msgid "Donate some money to help us keep this project alive." ++msgstr "" ++ ++msgid "Download limit" ++msgstr "" ++ ++msgid "Edit the complete splash text" ++msgstr "" ++ ++msgid "Fair Use Policy" ++msgstr "" ++ ++msgid "Firewall zone" ++msgstr "" ++ ++msgid "General" ++msgstr "" ++ ++msgid "Get in %s with the operator of this access point." ++msgstr "" ++ ++msgid "Hostname" ++msgstr "" ++ ++msgid "IP Address" ++msgstr "" ++ ++msgid "" ++"If you operate your own wifi equipment use channels different from ours." ++msgstr "" ++ ++msgid "If you use this network on a regular basis we ask for your support:" ++msgstr "" ++ ++msgid "Include your own text in the default splash" ++msgstr "" ++ ++msgid "Intercept client traffic on this Interface" ++msgstr "" ++ ++msgid "Interfaces" ++msgstr "" ++ ++msgid "Interfaces that are used for Splash." ++msgstr "" ++ ++msgid "" ++"KB/s (Download/Upload). You may be able to remove this limit by actively " ++"contributing to this project." ++msgstr "" ++ ++msgid "Legally Prohibited Activities" ++msgstr "" ++ ++msgid "Legally Prohibited content" ++msgstr "" ++ ++msgid "MAC Address" ++msgstr "" ++ ++msgid "MAC addresses in this list are blocked." ++msgstr "" ++ ++msgid "" ++"MAC addresses of whitelisted clients. These do not need to accept the splash " ++"and are not bandwidth limited." ++msgstr "" ++ ++msgid "Netmask" ++msgstr "" ++ ++msgid "Network" ++msgstr "" ++ ++msgid "No clients connected" ++msgstr "" ++ ++msgid "" ++"Please note that we are not an internet service provider but an experimental " ++"community network." ++msgstr "" ++ ++msgid "Policy" ++msgstr "" ++ ++msgid "Redirect target" ++msgstr "" ++ ++msgid "Safety" ++msgstr "" ++ ++msgid "Save" ++msgstr "" ++ ++msgid "Splash rules are integrated in this firewall zone" ++msgstr "" ++ ++msgid "Splashtext" ++msgstr "" ++ ++msgid "" ++"The network, like the Internet, is unencrypted and open. Each participant is " ++"responsible for the safety of their own connections and devices." ++msgstr "" ++ ++msgid "" ++"The open and free wireless network of volunteers (\"Operators\") provides " ++"the necessary equipment and Internet connections (\"Infrastructure\") at " ++"their own expense." ++msgstr "" ++ ++msgid "" ++"The operator claims no liability for loss of data, unauthorized access/" ++"damage to devices, or financial losses that participants may suffer from the " ++"use of the network." ++msgstr "" ++ ++msgid "" ++"The participant agrees to not perform any action and refrain from acts which " ++"may violate the law or infringe upon the rights of third parties." ++msgstr "" ++ ++msgid "" ++"The participant agrees to not transfer content over the network which " ++"violates the law." ++msgstr "" ++ ++msgid "" ++"The participant agrees to not use the network in any way which will harm the " ++"infrastructure, the network itself, its operators or other participants." ++msgstr "" ++ ++msgid "" ++"These Terms of Use govern the use of the network by its participants' " ++"computer, PDA, or similar device (\"Devices\") within the network." ++msgstr "" ++ ++msgid "Time remaining" ++msgstr "" ++ ++msgid "" ++"To ask for the reason why you have been blocked or ask for access again you " ++"can try to contact the owner of this access point:" ++msgstr "" ++ ++msgid "Traffic in/out" ++msgstr "" ++ ++msgid "Upload limit" ++msgstr "" ++ ++msgid "Usage Agreement" ++msgstr "" ++ ++msgid "Welcome" ++msgstr "" ++ ++msgid "Whitelist" ++msgstr "" ++ ++msgid "You are now connected to the free wireless mesh network" ++msgstr "" ++ ++msgid "" ++"You can enter your own text that is displayed to clients here.
    It is " ++"possible to use the following markers: ###COMMUNITY###, ###COMMUNITY_URL###, " ++"###CONTACTURL###, ###LEASETIME###, ###LIMIT### and ###ACCEPT###." ++msgstr "" ++ ++msgid "" ++"Your access to this network has been blocked, most likely because you did " ++"something that our rules explicitly forbid." ++msgstr "" ++ ++msgid "Your bandwidth is limited to" ++msgstr "" ++ ++msgid "blacklisted" ++msgstr "" ++ ++msgid "expired" ++msgstr "" ++ ++msgid "optional when using host addresses" ++msgstr "" ++ ++msgid "perform any kind of illegal activities" ++msgstr "" ++ ++msgid "splashed" ++msgstr "" ++ ++msgid "temporarily blocked" ++msgstr "" ++ ++msgid "unknown" ++msgstr "" ++ ++msgid "use filesharing applications on this network" ++msgstr "" ++ ++msgid "waste bandwidth with unneccesary downloads or streams" ++msgstr "" ++ ++msgid "whitelisted" ++msgstr "" +diff --git a/feeds/luci/applications/luci-app-splash/po/zh-cn/splash.po b/feeds/luci/applications/luci-app-splash/po/zh-cn/splash.po +new file mode 100644 +index 0000000..439b774 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-splash/po/zh-cn/splash.po +@@ -0,0 +1,321 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Report-Msgid-Bugs-To: \n" ++"POT-Creation-Date: 2012-06-28 08:58+0200\n" ++"PO-Revision-Date: 2014-07-23 02:07+0200\n" ++"Last-Translator: Tanyingyu \n" ++"Language-Team: LANGUAGE \n" ++"Language: zh_CN\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=1; plural=0;\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "Accept" ++msgstr "接收" ++ ++msgid "" ++"Access to the internet might be possible nevertheless, because some " ++"activists of this project share their private internet connections. These " ++"few connections are shared between all users. That means available bandwidth " ++"is limited and because of this we ask you not to do any of the following:" ++msgstr "" ++ ++msgid "" ++"Access to the network is not guaranteed. It can be interrupted at any time " ++"without notice for any reason, for certain devices, and/or may be blocked " ++"for certain users." ++msgstr "" ++ ++msgid "Active Clients" ++msgstr "活动的客户端" ++ ++msgid "Allowed hosts/subnets" ++msgstr "å…许的 主机/掩ç " ++ ++msgid "" ++"As an alternative to editing the complete splash text you can also just " ++"include some custom text in the default splash page by entering it here." ++msgstr "" ++ ++msgid "" ++"Bandwidth limit for clients is only activated when both up- and download " ++"limit are set. Use a value of 0 here to completely disable this limitation. " ++"Whitelisted clients are not limited." ++msgstr "" ++"åªæœ‰å½“ 上传和下载的é™åˆ¶éƒ½è®¾ç½®çš„时候对客户端的带宽é™åˆ¶æ‰ä¼šç”Ÿæ•ˆã€‚在这里使用0 å¯" ++"以完全ç¦ç”¨æ­¤é™åˆ¶ã€‚白åå•å®¢æˆ·ç«¯ä¸å—é™åˆ¶ã€‚" ++ ++# Something wwrong? ++msgid "" ++"Become an active member of this community and help by operating your own node" ++msgstr "æˆä¸ºè¿™ä¸ªç¤¾åŒºçš„一个活跃æˆå‘˜å¹¶ä¸”è¿è¥ä½ è‡ªå·±çš„节点以帮助别人。" ++ ++msgid "Blacklist" ++msgstr "黑åå•" ++ ++msgid "Blocked" ++msgstr "é”定" ++ ++msgid "" ++"By accepting these rules you can use this network for %s hour(s). After this " ++"time you need to accept these rules again." ++msgstr "" ++ ++msgid "Clearance time" ++msgstr "清ç†æ—¶é—´" ++ ++msgid "Client-Splash" ++msgstr "客户端弹窗" ++ ++msgid "" ++"Client-Splash is a hotspot authentification system for wireless mesh " ++"networks." ++msgstr "Client-Splash是无线MESH网络的一个热点认è¯ç³»ç»Ÿ" ++ ++msgid "" ++"Clients are redirected to this page after they have accepted the splash. If " ++"this is left empty they are redirected to the page they had requested." ++msgstr "" ++ ++msgid "Clients download speed is limited to this value (kbyte/s)" ++msgstr "客户端下载速度é™åˆ¶ä¸ºæ­¤å€¼(kbyte/s)" ++ ++msgid "" ++"Clients that have accepted the splash are allowed to use the network for " ++"that many hours." ++msgstr "已接å—Splash的客户端å…许使用这个网络Nå°æ—¶" ++ ++msgid "Clients upload speed is limited to this value (kbyte/s)" ++msgstr "客户端上传速度é™åˆ¶ä¸ºæ­¤å€¼(kbyte/s)" ++ ++msgid "Contact" ++msgstr "è”ç³»" ++ ++msgid "Decline" ++msgstr "下é™" ++ ++msgid "" ++"Destination hosts and networks that are excluded from splashing, i.e. they " ++"are always allowed." ++msgstr "" ++ ++msgid "Donate some money to help us keep this project alive." ++msgstr "æ助我们一些钱以帮助我们维护这个项目。" ++ ++msgid "Download limit" ++msgstr "下载é™åˆ¶" ++ ++msgid "Edit the complete splash text" ++msgstr "" ++ ++msgid "Fair Use Policy" ++msgstr "" ++ ++msgid "Firewall zone" ++msgstr "防ç«å¢™åŒºåŸŸ" ++ ++msgid "General" ++msgstr "概述" ++ ++msgid "Get in %s with the operator of this access point." ++msgstr "" ++ ++msgid "Hostname" ++msgstr "主机å" ++ ++msgid "IP Address" ++msgstr "IP地å€" ++ ++msgid "" ++"If you operate your own wifi equipment use channels different from ours." ++msgstr "如果你æ“作你自有的wifi设备,使用与我们ä¸åŒçš„频é“" ++ ++msgid "If you use this network on a regular basis we ask for your support:" ++msgstr "如果你ç»å¸¸ä½¿ç”¨è¿™ä¸ªç½‘络,我们需è¦ä½ çš„支æŒ" ++ ++msgid "Include your own text in the default splash" ++msgstr "" ++ ++msgid "Intercept client traffic on this Interface" ++msgstr "在这个接å£ä¸Šæ‹¦æˆªå®¢æˆ·ç«¯é€šä¿¡æµé‡" ++ ++msgid "Interfaces" ++msgstr "接å£" ++ ++msgid "Interfaces that are used for Splash." ++msgstr "Splash使用的接å£" ++ ++msgid "" ++"KB/s (Download/Upload). You may be able to remove this limit by actively " ++"contributing to this project." ++msgstr "" ++ ++msgid "Legally Prohibited Activities" ++msgstr "法律ç¦æ­¢è¡Œä¸º" ++ ++msgid "Legally Prohibited content" ++msgstr "法律ç¦æ­¢å†…容" ++ ++msgid "MAC Address" ++msgstr "MAC地å€" ++ ++msgid "MAC addresses in this list are blocked." ++msgstr "在本列表中的MAC地å€å°†è¢«é˜»æŒ¡" ++ ++msgid "" ++"MAC addresses of whitelisted clients. These do not need to accept the splash " ++"and are not bandwidth limited." ++msgstr "白åå•ä¸­çš„MAC地å€ï¼Œå¯ä¸ç”¨æŽ¥å—splash,åŒæ—¶æ²¡æœ‰å¸¦å®½é™åˆ¶ã€‚" ++ ++msgid "Netmask" ++msgstr "网络掩ç " ++ ++msgid "Network" ++msgstr "网络" ++ ++msgid "No clients connected" ++msgstr "无客户端连接" ++ ++msgid "" ++"Please note that we are not an internet service provider but an experimental " ++"community network." ++msgstr "我们ä¸æ˜¯ISP(互è”网è¿è¡Œå•†ï¼‰ï¼Œä»…ä»…åªæ˜¯ä¸€ä¸ªå®žéªŒæ€§çš„社区网络。" ++ ++msgid "Policy" ++msgstr "ç­–ç•¥" ++ ++msgid "Redirect target" ++msgstr "é‡å®šå‘目标" ++ ++msgid "Safety" ++msgstr "安全" ++ ++msgid "Save" ++msgstr "ä¿å­˜" ++ ++msgid "Splash rules are integrated in this firewall zone" ++msgstr "" ++ ++msgid "Splashtext" ++msgstr "" ++ ++msgid "" ++"The network, like the Internet, is unencrypted and open. Each participant is " ++"responsible for the safety of their own connections and devices." ++msgstr "" ++ ++msgid "" ++"The open and free wireless network of volunteers (\"Operators\") provides " ++"the necessary equipment and Internet connections (\"Infrastructure\") at " ++"their own expense." ++msgstr "" ++ ++msgid "" ++"The operator claims no liability for loss of data, unauthorized access/" ++"damage to devices, or financial losses that participants may suffer from the " ++"use of the network." ++msgstr "" ++ ++msgid "" ++"The participant agrees to not perform any action and refrain from acts which " ++"may violate the law or infringe upon the rights of third parties." ++msgstr "" ++ ++msgid "" ++"The participant agrees to not transfer content over the network which " ++"violates the law." ++msgstr "" ++ ++msgid "" ++"The participant agrees to not use the network in any way which will harm the " ++"infrastructure, the network itself, its operators or other participants." ++msgstr "" ++ ++msgid "" ++"These Terms of Use govern the use of the network by its participants' " ++"computer, PDA, or similar device (\"Devices\") within the network." ++msgstr "" ++ ++msgid "Time remaining" ++msgstr "" ++ ++msgid "" ++"To ask for the reason why you have been blocked or ask for access again you " ++"can try to contact the owner of this access point:" ++msgstr "" ++ ++msgid "Traffic in/out" ++msgstr "æµé‡ å…¥/出" ++ ++msgid "Upload limit" ++msgstr "上传é™åˆ¶" ++ ++msgid "Usage Agreement" ++msgstr "使用åè®®" ++ ++msgid "Welcome" ++msgstr "欢迎" ++ ++msgid "Whitelist" ++msgstr "白åå•" ++ ++msgid "You are now connected to the free wireless mesh network" ++msgstr "" ++ ++msgid "" ++"You can enter your own text that is displayed to clients here.
    It is " ++"possible to use the following markers: ###COMMUNITY###, ###COMMUNITY_URL###, " ++"###CONTACTURL###, ###LEASETIME###, ###LIMIT### and ###ACCEPT###." ++msgstr "" ++ ++msgid "" ++"Your access to this network has been blocked, most likely because you did " ++"something that our rules explicitly forbid." ++msgstr "" ++ ++msgid "Your bandwidth is limited to" ++msgstr "你的带宽é™åˆ¶ä¸º" ++ ++msgid "blacklisted" ++msgstr "黑åå•" ++ ++msgid "expired" ++msgstr "过期" ++ ++msgid "optional when using host addresses" ++msgstr "" ++ ++msgid "perform any kind of illegal activities" ++msgstr "" ++ ++msgid "splashed" ++msgstr "" ++ ++msgid "temporarily blocked" ++msgstr "" ++ ++msgid "unknown" ++msgstr "" ++ ++msgid "use filesharing applications on this network" ++msgstr "" ++ ++msgid "waste bandwidth with unneccesary downloads or streams" ++msgstr "" ++ ++msgid "whitelisted" ++msgstr "" ++ ++#~ msgid "" ++#~ "Hosts and Networks that are listed here are excluded from splashing, i.e. " ++#~ "they are always allowed." ++#~ msgstr "列在这里的主机和网络都排除在Splashing之外,例如:一直被å…许访问。" ++ ++#~ msgid "By accepting these rules you can use this network for" ++#~ msgstr "接å—这些æ¡æ¬¾ä»¥ä¾¿ä½¿ç”¨è¿™ä¸ªç½‘络" ++ ++#~ msgid "Edit Splash text" ++#~ msgstr "编辑Splash文本" +diff --git a/feeds/luci/applications/luci-app-splash/po/zh-tw/splash.po b/feeds/luci/applications/luci-app-splash/po/zh-tw/splash.po +new file mode 100644 +index 0000000..1125abf +--- /dev/null ++++ b/feeds/luci/applications/luci-app-splash/po/zh-tw/splash.po +@@ -0,0 +1,302 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Last-Translator: Automatically generated\n" ++"Language-Team: none\n" ++"Language: \n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++ ++msgid "Accept" ++msgstr "" ++ ++msgid "" ++"Access to the internet might be possible nevertheless, because some " ++"activists of this project share their private internet connections. These " ++"few connections are shared between all users. That means available bandwidth " ++"is limited and because of this we ask you not to do any of the following:" ++msgstr "" ++ ++msgid "" ++"Access to the network is not guaranteed. It can be interrupted at any time " ++"without notice for any reason, for certain devices, and/or may be blocked " ++"for certain users." ++msgstr "" ++ ++msgid "Active Clients" ++msgstr "" ++ ++msgid "Allowed hosts/subnets" ++msgstr "" ++ ++msgid "" ++"As an alternative to editing the complete splash text you can also just " ++"include some custom text in the default splash page by entering it here." ++msgstr "" ++ ++msgid "" ++"Bandwidth limit for clients is only activated when both up- and download " ++"limit are set. Use a value of 0 here to completely disable this limitation. " ++"Whitelisted clients are not limited." ++msgstr "" ++ ++msgid "" ++"Become an active member of this community and help by operating your own node" ++msgstr "" ++ ++msgid "Blacklist" ++msgstr "" ++ ++msgid "Blocked" ++msgstr "" ++ ++msgid "" ++"By accepting these rules you can use this network for %s hour(s). After this " ++"time you need to accept these rules again." ++msgstr "" ++ ++msgid "Clearance time" ++msgstr "" ++ ++msgid "Client-Splash" ++msgstr "" ++ ++msgid "" ++"Client-Splash is a hotspot authentification system for wireless mesh " ++"networks." ++msgstr "" ++ ++msgid "" ++"Clients are redirected to this page after they have accepted the splash. If " ++"this is left empty they are redirected to the page they had requested." ++msgstr "" ++ ++msgid "Clients download speed is limited to this value (kbyte/s)" ++msgstr "" ++ ++msgid "" ++"Clients that have accepted the splash are allowed to use the network for " ++"that many hours." ++msgstr "" ++ ++msgid "Clients upload speed is limited to this value (kbyte/s)" ++msgstr "" ++ ++msgid "Contact" ++msgstr "" ++ ++msgid "Decline" ++msgstr "" ++ ++msgid "" ++"Destination hosts and networks that are excluded from splashing, i.e. they " ++"are always allowed." ++msgstr "" ++ ++msgid "Donate some money to help us keep this project alive." ++msgstr "" ++ ++msgid "Download limit" ++msgstr "" ++ ++msgid "Edit the complete splash text" ++msgstr "" ++ ++msgid "Fair Use Policy" ++msgstr "" ++ ++msgid "Firewall zone" ++msgstr "" ++ ++msgid "General" ++msgstr "" ++ ++msgid "Get in %s with the operator of this access point." ++msgstr "" ++ ++msgid "Hostname" ++msgstr "" ++ ++msgid "IP Address" ++msgstr "" ++ ++msgid "" ++"If you operate your own wifi equipment use channels different from ours." ++msgstr "" ++ ++msgid "If you use this network on a regular basis we ask for your support:" ++msgstr "" ++ ++msgid "Include your own text in the default splash" ++msgstr "" ++ ++msgid "Intercept client traffic on this Interface" ++msgstr "" ++ ++msgid "Interfaces" ++msgstr "" ++ ++msgid "Interfaces that are used for Splash." ++msgstr "" ++ ++msgid "" ++"KB/s (Download/Upload). You may be able to remove this limit by actively " ++"contributing to this project." ++msgstr "" ++ ++msgid "Legally Prohibited Activities" ++msgstr "" ++ ++msgid "Legally Prohibited content" ++msgstr "" ++ ++msgid "MAC Address" ++msgstr "" ++ ++msgid "MAC addresses in this list are blocked." ++msgstr "" ++ ++msgid "" ++"MAC addresses of whitelisted clients. These do not need to accept the splash " ++"and are not bandwidth limited." ++msgstr "" ++ ++msgid "Netmask" ++msgstr "" ++ ++msgid "Network" ++msgstr "" ++ ++msgid "No clients connected" ++msgstr "" ++ ++msgid "" ++"Please note that we are not an internet service provider but an experimental " ++"community network." ++msgstr "" ++ ++msgid "Policy" ++msgstr "" ++ ++msgid "Redirect target" ++msgstr "" ++ ++msgid "Safety" ++msgstr "" ++ ++msgid "Save" ++msgstr "" ++ ++msgid "Splash rules are integrated in this firewall zone" ++msgstr "" ++ ++msgid "Splashtext" ++msgstr "" ++ ++msgid "" ++"The network, like the Internet, is unencrypted and open. Each participant is " ++"responsible for the safety of their own connections and devices." ++msgstr "" ++ ++msgid "" ++"The open and free wireless network of volunteers (\"Operators\") provides " ++"the necessary equipment and Internet connections (\"Infrastructure\") at " ++"their own expense." ++msgstr "" ++ ++msgid "" ++"The operator claims no liability for loss of data, unauthorized access/" ++"damage to devices, or financial losses that participants may suffer from the " ++"use of the network." ++msgstr "" ++ ++msgid "" ++"The participant agrees to not perform any action and refrain from acts which " ++"may violate the law or infringe upon the rights of third parties." ++msgstr "" ++ ++msgid "" ++"The participant agrees to not transfer content over the network which " ++"violates the law." ++msgstr "" ++ ++msgid "" ++"The participant agrees to not use the network in any way which will harm the " ++"infrastructure, the network itself, its operators or other participants." ++msgstr "" ++ ++msgid "" ++"These Terms of Use govern the use of the network by its participants' " ++"computer, PDA, or similar device (\"Devices\") within the network." ++msgstr "" ++ ++msgid "Time remaining" ++msgstr "" ++ ++msgid "" ++"To ask for the reason why you have been blocked or ask for access again you " ++"can try to contact the owner of this access point:" ++msgstr "" ++ ++msgid "Traffic in/out" ++msgstr "" ++ ++msgid "Upload limit" ++msgstr "" ++ ++msgid "Usage Agreement" ++msgstr "" ++ ++msgid "Welcome" ++msgstr "" ++ ++msgid "Whitelist" ++msgstr "" ++ ++msgid "You are now connected to the free wireless mesh network" ++msgstr "" ++ ++msgid "" ++"You can enter your own text that is displayed to clients here.
    It is " ++"possible to use the following markers: ###COMMUNITY###, ###COMMUNITY_URL###, " ++"###CONTACTURL###, ###LEASETIME###, ###LIMIT### and ###ACCEPT###." ++msgstr "" ++ ++msgid "" ++"Your access to this network has been blocked, most likely because you did " ++"something that our rules explicitly forbid." ++msgstr "" ++ ++msgid "Your bandwidth is limited to" ++msgstr "" ++ ++msgid "blacklisted" ++msgstr "" ++ ++msgid "expired" ++msgstr "" ++ ++msgid "optional when using host addresses" ++msgstr "" ++ ++msgid "perform any kind of illegal activities" ++msgstr "" ++ ++msgid "splashed" ++msgstr "" ++ ++msgid "temporarily blocked" ++msgstr "" ++ ++msgid "unknown" ++msgstr "" ++ ++msgid "use filesharing applications on this network" ++msgstr "" ++ ++msgid "waste bandwidth with unneccesary downloads or streams" ++msgstr "" ++ ++msgid "whitelisted" ++msgstr "" +diff --git a/feeds/luci/applications/luci-app-splash/root/etc/config/luci_splash b/feeds/luci/applications/luci-app-splash/root/etc/config/luci_splash +new file mode 100644 +index 0000000..c4cfef5 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-splash/root/etc/config/luci_splash +@@ -0,0 +1,2 @@ ++config core general ++ option leasetime 1 +\ No newline at end of file +diff --git a/feeds/luci/applications/luci-app-splash/root/etc/config/luci_splash_leases b/feeds/luci/applications/luci-app-splash/root/etc/config/luci_splash_leases +new file mode 100644 +index 0000000..6afdd90 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-splash/root/etc/config/luci_splash_leases +@@ -0,0 +1 @@ ++# This file should always stay empty and is just needed to be able to use this config in /var/state! +diff --git a/feeds/luci/applications/luci-app-splash/root/etc/hotplug.d/iface/25-splash b/feeds/luci/applications/luci-app-splash/root/etc/hotplug.d/iface/25-splash +new file mode 100644 +index 0000000..045e908 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-splash/root/etc/hotplug.d/iface/25-splash +@@ -0,0 +1,17 @@ ++#!/bin/sh ++ ++[ "$ACTION" = ifup ] || exit 0 ++ ++/etc/init.d/firewall enabled || exit 0 ++ ++if [ -x /etc/init.d/luci_splash ]; then ++ restart_splash() { ++ local net="$1" ++ if [ "$INTERFACE" = "$net" ]; then ++ logger -t splash "Reloading splash firewall rules due to ifup of $INTERFACE ($DEVICE)" ++ /etc/init.d/luci_splash restart ++ fi ++ } ++ config_load luci_splash ++ config_foreach restart_splash iface ++fi +diff --git a/feeds/luci/applications/luci-app-splash/root/etc/init.d/luci_splash b/feeds/luci/applications/luci-app-splash/root/etc/init.d/luci_splash +new file mode 100755 +index 0000000..feefabd +--- /dev/null ++++ b/feeds/luci/applications/luci-app-splash/root/etc/init.d/luci_splash +@@ -0,0 +1,362 @@ ++#!/bin/sh /etc/rc.common ++ ++START=70 ++EXTRA_COMMANDS=clear_leases ++LIMIT_DOWN=0 ++LIMIT_DOWN_BURST=0 ++LIMIT_UP=0 ++TC=/usr/sbin/tc ++IPT=/usr/sbin/iptables ++IPT6=/usr/sbin/ip6tables ++ ++IPT_REPLAY=/var/run/luci_splash.iptlog ++LOCK=/var/run/luci_splash.lock ++[ -x $IPT6 ] && [ -f /proc/net/ipv6_route ] && HAS_IPV6=1 ++ ++silent() { ++ "$@" 2>/dev/null ++} ++ ++ipt_log() { ++ $IPT -I "$@" ++ echo $IPT -D "$@" >> $IPT_REPLAY ++} ++ ++ipt6_log() { ++ [ "$HAS_IPV6" = 1 ] || return ++ $IPT6 -I "$@" ++ echo $IPT6 -D "$@" >> $IPT_REPLAY ++} ++ ++ ++iface_add() { ++ local cfg="$1" ++ ++ config_get zone "$cfg" zone ++ [ -n "$zone" ] || return 0 ++ ++ config_get net "$cfg" network ++ [ -n "$net" ] || return 0 ++ ++ config_get ifname "$net" ifname ++ [ -n "$ifname" ] || return 0 ++ ++ config_get ipaddr "$net" ipaddr ++ [ -n "$ipaddr" ] || return 0 ++ ++ config_get netmask "$net" netmask ++ [ -n "$netmask" ] || return 0 ++ ++ config_get ip6addr "$net" ip6addr ++ ++ config_get type "$net" type ++ ++ parentiface="$(uci -q get network.${net}.ifname)" ++ ++ [ -n "$parentiface" ] && [ ! "$type" = "bridge" ] && { ++ parentiface=${parentiface#@} ++ config_get parentproto "$parentiface" proto ++ config_get parentipaddr "$parentiface" ipaddr ++ config_get parentnetmask "$parentiface" netmask ++ } ++ ++ eval "$(ipcalc.sh $ipaddr $netmask)" ++ ++ logger -s -p info -t splash "Add $NETWORK/$PREFIX ($ifname) to splashed networks." ++ ++ ### Add interface specific chain entry rules ++ ipt_log "prerouting_${zone}_rule" -i "${ifname%:*}" -s "$NETWORK/$PREFIX" -j luci_splash_prerouting -t nat ++ ipt_log "forwarding_${zone}_rule" -i "${ifname%:*}" -s "$NETWORK/$PREFIX" -j luci_splash_forwarding -t filter ++ ++ if [ "$HAS_IPV6" = 1 ] && [ -n "$ip6addr" ]; then ++ ipt6_log "forwarding_${zone}_rule" -i "${ifname%:*}" -s "$ip6addr" -j luci_splash_forwarding -t filter ++ fi ++ ++ ### Allow traffic to the same subnet ++ $IPT -t nat -I luci_splash_prerouting -d "$ipaddr/${netmask:-32}" -j RETURN ++ $IPT -t filter -I luci_splash_forwarding -d "$ipaddr/${netmask:-32}" -j RETURN ++ ++ ### Allow traffic to the mesh subnet ++ [ "$parentproto" = "static" -a -n "$parentipaddr" ] && { ++ $IPT -t nat -I luci_splash_prerouting -d "$parentipaddr/${parentnetmask:-32}" -j RETURN ++ $IPT -t filter -I luci_splash_forwarding -d "$parentipaddr/${parentnetmask:-32}" -j RETURN ++ } ++ ++ qos_iface_add "$ifname" "$NETWORK" "$PREFIX" ++} ++ ++iface_del() { ++ config_get zone "$1" zone ++ [ -n "$zone" ] || return 0 ++ ++ config_get net "$1" network ++ [ -n "$net" ] || return 0 ++ ++ config_get ifname "$net" ifname ++ [ -n "$ifname" ] || return 0 ++ ++ # Clear interface specific rules ++ [ -s $IPT_REPLAY ] && { ++ logger -s -p info -t splash "Remove $ifname from splashed networks." ++ grep -- "-i ${ifname%:*}" $IPT_REPLAY | while read ln; do silent $ln; done ++ sed -ie "/-i ${ifname%:*}/d" $IPT_REPLAY ++ } ++ ++ qos_iface_del "$ifname" ++} ++ ++mac_add() { ++ config_get mac "$1" mac ++ append MACS "$mac" ++} ++ ++whitelist_add() { ++ config_get mac "$1" mac ++ iface=$2 ++ $TC filter add dev "$iface" parent ffff: protocol ip prio 1 u32 match ether src $mac police pass ++ $TC filter add dev "$iface" parent 1:0 protocol ip prio 1 u32 match ether dst $mac classid 1:1 ++} ++ ++ ++subnet_add() { ++ local cfg="$1" ++ ++ config_get ipaddr "$cfg" ipaddr ++ config_get netmask "$cfg" netmask ++ ++ [ -n "$ipaddr" ] && { ++ $IPT -t nat -I luci_splash_prerouting -d "$ipaddr/${netmask:-32}" -j RETURN ++ $IPT -t filter -I luci_splash_forwarding -d "$ipaddr/${netmask:-32}" -j RETURN ++ } ++} ++ ++qos_iface_add() { ++ local iface="$1" ++ local network="$2" ++ local prefix="$3" ++ ++ # 77 -> download root qdisc ++ # ffff -> upload root qdisc ++ ++ silent $TC qdisc del dev "$iface" root handle 1: ++ silent $TC class del dev "$iface" parent 1: classid 1:ffff ++ silent $TC class del dev "$iface" parent 1: classid 1:1 ++ silent $TC filter del dev "$iface" parent ffff: protocol ip prio 1 u32 ++ silent $TC filter del dev "$iface" parent ffff: protocol ip prio 2 u32 ++ silent $TC filter del dev "$iface" parent ffff: protocol ip prio 3 u32 ++ ++ if [ "$LIMIT_UP" -gt 0 -a "$LIMIT_DOWN" -gt 0 ]; then ++ # Setup qdiscs ++ $TC qdisc add dev "$iface" root handle 1: htb default 1 ++ silent $TC qdisc add dev "$iface" ingress ++ ++ # Default class - all clients which are not otherwise handled are put in that class ++ # and share that bandwidth. ++ $TC class add dev "$iface" parent 1: classid 1:ffff htb rate ${LIMIT_DOWN}kbit ++ ++ # default class and class for whitelisted clients = unlimited ++ $TC class add dev "$iface" parent 1: classid 1:1 htb rate 100mbit ++ ++ # All traffic to the dhcp subnet is put into the limited class ++ $TC filter add dev "$iface" parent 1:0 protocol ip prio 3 u32 match ip dst $network/$prefix classid 1:ffff ++ $TC qdisc add dev "$iface" parent 1:ffff sfq perturb 10 ++ $TC filter add dev "$iface" parent ffff: protocol ip prio 3 u32 match ip src $network/$prefix police rate ${LIMIT_UP}kbit mtu 6k burst 6k drop ++ ++ # classify packets by their iptables MARK set in luci_splash_mark_in (mangle table) ++ # every client gets his own class and so his own bandwidth limit ++ $TC filter add dev "$iface" parent 1:0 protocol ip prio 2 fw ++ ++ config_foreach whitelist_add whitelist $iface ++ fi ++} ++ ++qos_iface_del() { ++ local iface="$1" ++ silent $TC qdisc del dev "$iface" root handle 77: ++} ++ ++boot() { ++ ### Setup splash-relay ++ uci get uhttpd.splash 2>/dev/null || { ++uci batch < $IPT_REPLAY ++ ++ ### Add interface independant prerouting rules ++ $IPT -t nat -A luci_splash_prerouting -j luci_splash_leases ++ $IPT -t nat -A luci_splash_leases -p udp --dport 53 -j REDIRECT --to-ports 53 ++ $IPT -t nat -A luci_splash_leases -p tcp --dport 80 -j REDIRECT --to-ports 8082 ++ ++ ### Add interface independant forwarding rules ++ $IPT -t filter -A luci_splash_forwarding -j luci_splash_filter ++ $IPT -t filter -A luci_splash_filter -p tcp -j REJECT --reject-with tcp-reset ++ $IPT -t filter -A luci_splash_filter -j REJECT --reject-with icmp-net-prohibited ++ ++ if [ "$HAS_IPV6" = 1 ]; then ++ $IPT6 -t filter -A luci_splash_forwarding -j luci_splash_filter ++ $IPT6 -t filter -A luci_splash_filter -p tcp -j REJECT --reject-with tcp-reset ++ $IPT6 -t filter -A luci_splash_filter -j REJECT --reject-with adm-prohibited ++ fi ++ ++ ### Add QoS chain ++ $IPT -t mangle -N luci_splash_mark_out ++ $IPT -t mangle -N luci_splash_mark_in ++ $IPT -t mangle -I PREROUTING -j luci_splash_mark_out ++ $IPT -t mangle -I POSTROUTING -j luci_splash_mark_in ++ ++ if [ "$HAS_IPV6" = 1 ]; then ++ $IPT6 -t mangle -N luci_splash_mark_out ++ $IPT6 -t mangle -N luci_splash_mark_in ++ $IPT6 -t mangle -I PREROUTING -j luci_splash_mark_out ++ $IPT6 -t mangle -I POSTROUTING -j luci_splash_mark_in ++ fi ++ ++ ### Build the main and portal rule ++ config_foreach iface_add iface ++ config_foreach subnet_add subnet ++ ++ ### Add the community homepage to the list of allowed destination subnets ++ hp=$(uci -q get freifunk.community.homepage) && { ++ chp=${hp#http*://} ++ chp=${chp%%/*} ++ $IPT -t nat -I luci_splash_prerouting -d "${chp}/32" -j RETURN ++ $IPT -t filter -I luci_splash_forwarding -d "${chp}/32" -j RETURN ++ } ++ ++ ### Find active mac addresses ++ MACS="" ++ ++ ++ config_foreach mac_add blacklist ++ config_foreach mac_add whitelist ++ ++ config_load luci_splash_leases ++ config_foreach mac_add lease ++ ++ ### Add crontab entry ++ test -f /etc/crontabs/root || touch /etc/crontabs/root ++ grep -q luci-splash /etc/crontabs/root || { ++ echo '*/5 * * * * /usr/sbin/luci-splash sync' >> /etc/crontabs/root ++ } ++ ++ lock -u $LOCK ++ ++ ### Populate iptables ++ [ -n "$MACS" ] && luci-splash add-rules $MACS ++} ++ ++stop() { ++ lock $LOCK ++ ++ include /lib/network ++ scan_interfaces ++ config_load luci_splash ++ ++ ### Clear interface rules ++ config_foreach iface_del iface ++ ++ silent $IPT -t mangle -D PREROUTING -j luci_splash_mark_out ++ silent $IPT -t mangle -D POSTROUTING -j luci_splash_mark_in ++ ++ if [ "$HAS_IPV6" = 1 ]; then ++ silent $IPT6 -t mangle -D PREROUTING -j luci_splash_mark_out ++ silent $IPT6 -t mangle -D POSTROUTING -j luci_splash_mark_in ++ fi ++ ++ ### Clear subchains ++ silent $IPT -t nat -F luci_splash_prerouting ++ silent $IPT -t nat -F luci_splash_leases ++ silent $IPT -t filter -F luci_splash_forwarding ++ silent $IPT -t filter -F luci_splash_filter ++ silent $IPT -t mangle -F luci_splash_mark_out ++ silent $IPT -t mangle -F luci_splash_mark_in ++ ++ if [ "$HAS_IPV6" = 1 ]; then ++ $IPT6 -t filter -F luci_splash_forwarding ++ $IPT6 -t filter -F luci_splash_filter ++ $IPT6 -t mangle -F luci_splash_mark_out ++ $IPT6 -t mangle -F luci_splash_mark_in ++ fi ++ ++ ### Delete subchains ++ silent $IPT -t nat -X luci_splash_prerouting ++ silent $IPT -t nat -X luci_splash_leases ++ silent $IPT -t filter -X luci_splash_forwarding ++ silent $IPT -t filter -X luci_splash_filter ++ silent $IPT -t mangle -X luci_splash_mark_out ++ silent $IPT -t mangle -X luci_splash_mark_in ++ if [ "$HAS_IPV6" = 1 ]; then ++ $IPT6 -t filter -X luci_splash_forwarding ++ $IPT6 -t filter -X luci_splash_filter ++ $IPT6 -t mangle -X luci_splash_mark_out ++ $IPT6 -t mangle -X luci_splash_mark_in ++ fi ++ sed -ie '/\/usr\/sbin\/luci-splash sync/d' /var/spool/cron/crontabs/root ++ ++ lock -u $LOCK ++} ++ ++clear_leases() { ++ ### Find active mac addresses ++ MACS="" ++ config_foreach mac_add lease ++ ++ ### Clear leases ++ [ -n "$MACS" ] && luci-splash remove $MACS ++} ++ +diff --git a/feeds/luci/applications/luci-app-splash/root/usr/sbin/luci-splash b/feeds/luci/applications/luci-app-splash/root/usr/sbin/luci-splash +new file mode 100755 +index 0000000..2870dbe +--- /dev/null ++++ b/feeds/luci/applications/luci-app-splash/root/usr/sbin/luci-splash +@@ -0,0 +1,753 @@ ++#!/usr/bin/lua ++ ++utl = require "luci.util" ++sys = require "luci.sys" ++ipc = require "luci.ip" ++ ++ ++-- Init state session ++local uci = require "luci.model.uci".cursor_state() ++local ipt = require "luci.sys.iptparser".IptParser() ++local fs = require "nixio.fs" ++local ip = require "luci.ip" ++ ++local debug = false ++ ++local has_ipv6 = fs.access("/proc/net/ipv6_route") and fs.access("/usr/sbin/ip6tables") ++ ++function exec(cmd) ++ -- executes a cmd and gets its output ++ if debug then ++ local ret = sys.exec(cmd) ++ print('+ ' .. cmd) ++ if ret and ret ~= "" then ++ print(ret) ++ end ++ else ++ local ret = sys.exec(cmd .. " &> /dev/null") ++ end ++end ++ ++function call(cmd) ++ -- just calls a command ++ if debug then ++ print('+ ' .. cmd) ++ end ++ os.execute(cmd) ++end ++ ++ ++function lock() ++ call("lock /var/run/luci_splash.lock") ++end ++ ++function unlock() ++ call("lock -u /var/run/luci_splash.lock") ++end ++ ++function get_id(ip) ++ local o3, o4 = ip:match("[0-9]+%.[0-9]+%.([0-9]+)%.([0-9]+)") ++ if o3 and 04 then ++ return string.format("%02X%s", tonumber(o3), "") .. string.format("%02X%s", tonumber(o4), "") ++ else ++ return false ++ end ++end ++ ++function update_stats(leased, whitelisted, whitelisttotal, blacklisted, blacklisttotal) ++ local leases = uci:get_all("luci_splash_leases", "stats") ++ uci:delete("luci_splash_leases", "stats") ++ uci:section("luci_splash_leases", "stats", "stats", { ++ leases = leased or (leases and leases.leases) or 0, ++ whitelisttotal = whitelisttotal or (leased and leases.whitelisttotal) or 0, ++ whitelistonline = whitelisted or (leases and leases.whitelistonline) or 0, ++ blacklisttotal = blacklisttotal or (leases and leases.blacklisttotal) or 0, ++ blacklistonline = blacklisted or (leases and leases.blacklistonline) or 0, ++ }) ++ uci:save("luci_splash_leases") ++end ++ ++ ++function get_device_for_ip(ipaddr) ++ local dev ++ uci:foreach("network", "interface", function(s) ++ if s.ipaddr and s.netmask then ++ local network = ip.IPv4(s.ipaddr, s.netmask) ++ if network:contains(ip.IPv4(ipaddr)) then ++ -- this should be rewritten to luci functions if possible ++ dev = utl.trim(sys.exec(". /lib/functions/network.sh; network_get_device IFNAME '" .. s['.name'] .. "'; echo $IFNAME")) ++ end ++ end ++ end) ++ return dev ++end ++ ++function get_physdev(interface) ++ local dev ++ dev = utl.trim(sys.exec(". /lib/functions/network.sh; network_get_device IFNAME '" .. interface .. "'; echo $IFNAME")) ++ return dev ++end ++ ++ ++ ++function get_filter_handle(parent, direction, device, mac) ++ local input = utl.split(sys.exec('/usr/sbin/tc filter show dev ' .. device .. ' parent ' .. parent) or {}) ++ local tbl = {} ++ local handle ++ for k, v in pairs(input) do ++ handle = v:match('filter protocol ip pref %d+ u32 fh (%d*:%d*:%d*) order') or v:match('filter protocol all pref %d+ u32 fh (%d*:%d*:%d*) order') ++ if handle then ++ local mac, mac1, mac2, mac3, mac4, mac5, mac6 ++ if direction == 'src' then ++ mac1, mac2, mac3, mac4 = input[k+1]:match('match ([%a%d][%a%d])([%a%d][%a%d])([%a%d][%a%d])([%a%d][%a%d])/ffffffff') ++ mac5, mac6 = input[k+2]:match('match ([%a%d][%a%d])([%a%d][%a%d])0000/ffff0000') ++ else ++ mac1, mac2 = input[k+1]:match('match 0000([%a%d][%a%d])([%a%d][%a%d])/0000ffff') ++ mac3, mac4, mac5, mac6 = input[k+2]:match('match ([%a%d][%a%d])([%a%d][%a%d])([%a%d][%a%d])([%a%d][%a%d])/ffffffff') ++ end ++ if mac1 and mac2 and mac3 and mac4 and mac5 and mac6 then ++ mac = "%s:%s:%s:%s:%s:%s" % { mac1, mac2, mac3, mac4, mac5, mac6 } ++ tbl[mac] = handle ++ end ++ end ++ end ++ if tbl[mac] then ++ handle = tbl[mac] ++ end ++ return handle ++end ++ ++function macvalid(mac) ++ if mac and mac:match( ++ "^[a-fA-F0-9][a-fA-F0-9]:[a-fA-F0-9][a-fA-F0-9]:" .. ++ "[a-fA-F0-9][a-fA-F0-9]:[a-fA-F0-9][a-fA-F0-9]:" .. ++ "[a-fA-F0-9][a-fA-F0-9]:[a-fA-F0-9][a-fA-F0-9]$" ++ ) then ++ return true ++ end ++ ++ return false ++end ++ ++function ipvalid(ipaddr) ++ if ipaddr then ++ return ip.IPv4(ipaddr) and true or false ++ end ++ ++ return false ++end ++ ++function mac_to_ip(mac) ++ local ipaddr = nil ++ ipc.neighbors({ family = 4 }, function(n) ++ if n.mac == mac and n.dest then ++ ipaddr = n.dest:string() ++ end ++ end) ++ return ipaddr ++end ++ ++function mac_to_dev(mac) ++ local dev = nil ++ ipc.neighbors({ family = 4 }, function(n) ++ if n.mac == mac and n.dev then ++ dev = n.dev ++ end ++ end) ++ return dev ++end ++ ++function ip_to_mac(ip) ++ local mac = nil ++ ipc.neighbors({ family = 4 }, function(n) ++ if n.mac and n.dest and n.dest:equal(ip) then ++ mac = n.mac ++ end ++ end) ++ return mac ++end ++ ++function main(argv) ++ local cmd = table.remove(argv, 1) ++ local arg = argv[1] ++ ++ limit_up = (tonumber(uci:get("luci_splash", "general", "limit_up")) or 0) * 8 ++ limit_down = (tonumber(uci:get("luci_splash", "general", "limit_down")) or 0) * 8 ++ ++ if ( cmd == "lease" or cmd == "add-rules" or cmd == "remove" or ++ cmd == "whitelist" or cmd == "blacklist" or cmd == "status" ) and #argv > 0 ++ then ++ if not (macvalid(arg) or ipvalid(arg)) then ++ print("Invalid argument. The second argument must " .. ++ "be a valid IPv4 or Mac Address.") ++ os.exit(1) ++ end ++ ++ lock() ++ ++ local leased_macs = get_known_macs("lease") ++ local blacklist_macs = get_known_macs("blacklist") ++ local whitelist_macs = get_known_macs("whitelist") ++ ++ for i, adr in ipairs(argv) do ++ local mac = nil ++ if adr:find(":") then ++ mac = adr:lower() ++ else ++ mac = ip_to_mac(adr) ++ end ++ ++ if mac and cmd == "add-rules" then ++ if leased_macs[mac] then ++ add_lease(mac, true) ++ elseif blacklist_macs[mac] then ++ add_blacklist_rule(mac) ++ elseif whitelist_macs[mac] then ++ add_whitelist_rule(mac) ++ end ++ elseif mac and cmd == "status" then ++ print(leased_macs[mac] and "lease" ++ or whitelist_macs[mac] and "whitelist" ++ or blacklist_macs[mac] and "blacklist" ++ or "new") ++ elseif mac and ( cmd == "whitelist" or cmd == "blacklist" or cmd == "lease" ) then ++ if cmd ~= "lease" and leased_macs[mac] then ++ print("Removing %s from leases" % mac) ++ remove_lease(mac) ++ leased_macs[mac] = nil ++ end ++ ++ if cmd ~= "whitelist" and whitelist_macs[mac] then ++ if cmd == "lease" then ++ print('%s is whitelisted. Remove it before you can lease it.' % mac) ++ else ++ print("Removing %s from whitelist" % mac) ++ remove_whitelist(mac) ++ whitelist_macs[mac] = nil ++ end ++ end ++ ++ if cmd == "whitelist" and leased_macs[mac] then ++ print("Removing %s from leases" % mac) ++ remove_lease(mac) ++ leased_macs[mac] = nil ++ end ++ ++ if cmd ~= "blacklist" and blacklist_macs[mac] then ++ print("Removing %s from blacklist" % mac) ++ remove_blacklist(mac) ++ blacklist_macs[mac] = nil ++ end ++ ++ if cmd == "lease" and not leased_macs[mac] then ++ if not whitelist_macs[mac] then ++ print("Adding %s to leases" % mac) ++ add_lease(mac) ++ leased_macs[mac] = true ++ end ++ elseif cmd == "whitelist" and not whitelist_macs[mac] then ++ print("Adding %s to whitelist" % mac) ++ add_whitelist(mac) ++ whitelist_macs[mac] = true ++ elseif cmd == "blacklist" and not blacklist_macs[mac] then ++ print("Adding %s to blacklist" % mac) ++ add_blacklist(mac) ++ blacklist_macs[mac] = true ++ else ++ print("The mac %s is already %sed" %{ mac, cmd }) ++ end ++ elseif mac and cmd == "remove" then ++ if leased_macs[mac] then ++ print("Removing %s from leases" % mac) ++ remove_lease(mac) ++ leased_macs[mac] = nil ++ elseif whitelist_macs[mac] then ++ print("Removing %s from whitelist" % mac) ++ remove_whitelist(mac) ++ whitelist_macs[mac] = nil ++ elseif blacklist_macs[mac] then ++ print("Removing %s from blacklist" % mac) ++ remove_blacklist(mac) ++ blacklist_macs[mac] = nil ++ else ++ print("The mac %s is not known" % mac) ++ end ++ ++ else ++ print("Can not find mac for ip %s" % argv[i]) ++ end ++ end ++ unlock() ++ os.exit(0) ++ elseif cmd == "sync" then ++ sync() ++ os.exit(0) ++ elseif cmd == "list" then ++ list() ++ os.exit(0) ++ else ++ print("Usage:") ++ print("\n luci-splash list\n List connected, black- and whitelisted clients") ++ print("\n luci-splash sync\n Synchronize firewall rules and clear expired leases") ++ print("\n luci-splash lease \n Create a lease for the given address") ++ print("\n luci-splash blacklist \n Add given address to blacklist") ++ print("\n luci-splash whitelist \n Add given address to whitelist") ++ print("\n luci-splash remove \n Remove given address from the lease-, black- or whitelist") ++ print("") ++ ++ os.exit(1) ++ end ++end ++ ++-- Get a list of known mac addresses ++function get_known_macs(list) ++ local leased_macs = { } ++ ++ if not list or list == "lease" then ++ uci:foreach("luci_splash_leases", "lease", function(s) ++ if s.mac then ++ leased_macs[s.mac:lower()] = true ++ end ++ end) ++ end ++ ++ if not list or list == "whitelist" then ++ uci:foreach("luci_splash", "whitelist", function(s) ++ if s.mac then ++ leased_macs[s.mac:lower()] = true ++ end ++ end) ++ end ++ ++ if not list or list == "blacklist" then ++ uci:foreach("luci_splash", "blacklist", function(s) ++ if s.mac then ++ leased_macs[s.mac:lower()] = true ++ end ++ end) ++ end ++ return leased_macs ++end ++ ++ ++-- Helper to delete iptables rules ++function ipt_delete_all(args, comp, off) ++ off = off or { } ++ for i, r in ipairs(ipt:find(args)) do ++ if comp == nil or comp(r) then ++ off[r.table] = off[r.table] or { } ++ off[r.table][r.chain] = off[r.table][r.chain] or 0 ++ ++ exec("iptables -t %q -D %q %d 2>/dev/null" ++ %{ r.table, r.chain, r.index - off[r.table][r.chain] }) ++ ++ off[r.table][r.chain] = off[r.table][r.chain] + 1 ++ end ++ end ++end ++ ++function ipt6_delete_all(args, comp, off) ++ off = off or { } ++ for i, r in ipairs(ipt:find(args)) do ++ if comp == nil or comp(r) then ++ off[r.table] = off[r.table] or { } ++ off[r.table][r.chain] = off[r.table][r.chain] or 0 ++ ++ exec("ip6tables -t %q -D %q %d 2>/dev/null" ++ %{ r.table, r.chain, r.index - off[r.table][r.chain] }) ++ ++ off[r.table][r.chain] = off[r.table][r.chain] + 1 ++ end ++ end ++end ++ ++ ++-- Convert mac to uci-compatible section name ++function convert_mac_to_secname(mac) ++ return string.gsub(mac, ":", "") ++end ++ ++-- Add a lease to state and invoke add_rule ++function add_lease(mac, no_uci) ++ mac = mac:lower() ++ ++ -- Get current ip address ++ local ipaddr = mac_to_ip(mac) ++ ++ -- Add lease if there is an ip addr ++ if ipaddr then ++ local device = get_device_for_ip(ipaddr) ++ if not no_uci then ++ local leased = uci:get("luci_splash_leases", "stats", "leases") ++ if type(tonumber(leased)) == "number" then ++ update_stats(leased + 1, nil, nil, nil, nil) ++ end ++ ++ uci:section("luci_splash_leases", "lease", convert_mac_to_secname(mac), { ++ mac = mac, ++ ipaddr = ipaddr, ++ device = device, ++ limit_up = limit_up, ++ limit_down = limit_down, ++ start = os.time() ++ }) ++ uci:save("luci_splash_leases") ++ end ++ add_lease_rule(mac, ipaddr, device) ++ else ++ print("Found no active IP for %s, lease not added" % mac) ++ end ++end ++ ++ ++-- Remove a lease from state and invoke remove_rule ++function remove_lease(mac) ++ mac = mac:lower() ++ ++ uci:delete_all("luci_splash_leases", "lease", ++ function(s) ++ if s.mac:lower() == mac then ++ ++ local leased = uci:get("luci_splash_leases", "stats", "leases") ++ if type(tonumber(leased)) == "number" and tonumber(leased) > 0 then ++ update_stats(leased - 1, nil, nil, nil, nil) ++ end ++ remove_lease_rule(mac, s.ipaddr, s.device, tonumber(s.limit_up), tonumber(s.limit_down)) ++ return true ++ end ++ return false ++ end) ++ ++ uci:save("luci_splash_leases") ++end ++ ++ ++-- Add a whitelist entry ++function add_whitelist(mac) ++ uci:section("luci_splash", "whitelist", convert_mac_to_secname(mac), { mac = mac }) ++ uci:save("luci_splash") ++ uci:commit("luci_splash") ++ add_whitelist_rule(mac) ++end ++ ++ ++-- Add a blacklist entry ++function add_blacklist(mac) ++ uci:section("luci_splash", "blacklist", convert_mac_to_secname(mac), { mac = mac }) ++ uci:save("luci_splash") ++ uci:commit("luci_splash") ++ add_blacklist_rule(mac) ++end ++ ++ ++-- Remove a whitelist entry ++function remove_whitelist(mac) ++ mac = mac:lower() ++ uci:delete_all("luci_splash", "whitelist", ++ function(s) return not s.mac or s.mac:lower() == mac end) ++ uci:save("luci_splash") ++ uci:commit("luci_splash") ++ remove_lease_rule(mac) ++ remove_whitelist_tc(mac) ++end ++ ++function remove_whitelist_tc(mac) ++ uci:foreach("luci_splash", "iface", function(s) ++ local device = get_physdev(s['.name']) ++ if device and device ~= "" then ++ if debug then ++ print("Removing whitelist filters for %s interface %s." % {mac, device}) ++ end ++ local handle = get_filter_handle('ffff:', 'src', device, mac) ++ if handle then ++ exec('tc filter del dev "%s" parent ffff: protocol ip prio 1 handle %s u32' % { device, handle }) ++ else ++ print('Warning! Could not get a handle for %s parent :ffff on interface %s' % { mac, device }) ++ end ++ local handle = get_filter_handle('1:', 'dest', device, mac) ++ if handle then ++ exec('tc filter del dev "%s" parent 1:0 protocol ip prio 1 handle %s u32' % { device, handle }) ++ else ++ print('Warning! Could not get a handle for %s parent 1:0 on interface %s' % { mac, device }) ++ end ++ end ++ end) ++end ++ ++-- Remove a blacklist entry ++function remove_blacklist(mac) ++ mac = mac:lower() ++ uci:delete_all("luci_splash", "blacklist", ++ function(s) return not s.mac or s.mac:lower() == mac end) ++ uci:save("luci_splash") ++ uci:commit("luci_splash") ++ remove_lease_rule(mac) ++end ++ ++ ++-- Add an iptables rule ++function add_lease_rule(mac, ipaddr, device) ++ local id ++ if ipaddr then ++ id = get_id(ipaddr) ++ end ++ ++ exec("iptables -t mangle -I luci_splash_mark_out -m mac --mac-source %q -j RETURN" % mac) ++ ++ -- Mark incoming packets to a splashed host ++ -- for ipv4 - by iptables and destination ++ if id and device then ++ exec("iptables -t mangle -I luci_splash_mark_in -d %q -j MARK --set-mark 0x1%s -m comment --comment %s" % {ipaddr, id, mac:upper()}) ++ end ++ ++ --for ipv6: need to use the mac here ++ ++ if has_ipv6 then ++ exec("ip6tables -t mangle -I luci_splash_mark_out -m mac --mac-source %q -j MARK --set-mark 79" % mac) ++ if id and device and tonumber(limit_down) then ++ exec("tc filter add dev %s parent 1:0 protocol ipv6 prio 1 u32 match ether dst %s classid 1:%s" % {device, mac:lower(), id}) ++ end ++ end ++ ++ ++ if device and tonumber(limit_up) > 0 then ++ exec('tc filter add dev "%s" parent ffff: protocol all prio 2 u32 match ether src %s police rate %skbit mtu 6k burst 6k drop' % {device, mac, limit_up}) ++ end ++ ++ if id and device and tonumber(limit_down) > 0 then ++ exec("tc class add dev %s parent 1: classid 1:0x%s htb rate %skbit" % { device, id, limit_down }) ++ exec("tc qdisc add dev %s parent 1:%s sfq perturb 10" % { device, id }) ++ end ++ ++ exec("iptables -t filter -I luci_splash_filter -m mac --mac-source %q -j RETURN" % mac) ++ exec("iptables -t nat -I luci_splash_leases -m mac --mac-source %q -j RETURN" % mac) ++ if has_ipv6 then ++ exec("ip6tables -t filter -I luci_splash_filter -m mac --mac-source %q -j RETURN" % mac) ++ end ++end ++ ++ ++-- Remove lease, black- or whitelist rules ++function remove_lease_rule(mac, ipaddr, device, limit_up, limit_down) ++ ++ local id ++ if ipaddr then ++ id = get_id(ipaddr) ++ end ++ ++ ipt:resync() ++ ipt_delete_all({table="mangle", chain="luci_splash_mark_in", options={"/*", mac:upper()}}) ++ ipt_delete_all({table="mangle", chain="luci_splash_mark_out", options={"MAC", mac:upper()}}) ++ ipt_delete_all({table="filter", chain="luci_splash_filter", options={"MAC", mac:upper()}}) ++ ipt_delete_all({table="nat", chain="luci_splash_leases", options={"MAC", mac:upper()}}) ++ if has_ipv6 then ++ ipt6_delete_all({table="mangle", chain="luci_splash_mark_out", options={"MAC", mac:upper()}}) ++ ipt6_delete_all({table="filter", chain="luci_splash_filter", options={"MAC", mac:upper()}}) ++ end ++ ++ if device and tonumber(limit_up) > 0 then ++ local handle = get_filter_handle('ffff:', 'src', device, mac) ++ if handle then ++ exec('tc filter del dev "%s" parent ffff: protocol all prio 2 handle %s u32 police rate %skbit mtu 6k burst 6k drop' % {device, handle, limit_up}) ++ else ++ print('Warning! Could not get a handle for %s parent :ffff on interface %s' % { mac, device }) ++ end ++ end ++ -- remove clients class ++ if device and id then ++ exec('tc class del dev "%s" classid 1:%s' % {device, id}) ++ exec('tc filter del dev "%s" parent 1:0 prio 1' % device) -- ipv6 rule ++ --exec('tc qdisc del dev "%s" parent 1:%s sfq perturb 10' % { device, id }) ++ end ++end ++ ++ ++-- Add whitelist rules ++function add_whitelist_rule(mac) ++ exec("iptables -t filter -I luci_splash_filter -m mac --mac-source %q -j RETURN" % mac) ++ exec("iptables -t nat -I luci_splash_leases -m mac --mac-source %q -j RETURN" % mac) ++ if has_ipv6 then ++ exec("ip6tables -t filter -I luci_splash_filter -m mac --mac-source %q -j RETURN" % mac) ++ end ++ uci:foreach("luci_splash", "iface", function(s) ++ local device = get_physdev(s['.name']) ++ if device and device ~= "" then ++ exec('tc filter add dev "%s" parent ffff: protocol ip prio 1 u32 match ether src %s police pass' % { device, mac }) ++ exec('tc filter add dev "%s" parent 1:0 protocol ip prio 1 u32 match ether dst %s classid 1:1' % { device, mac }) ++ end ++ end) ++end ++ ++ ++-- Add blacklist rules ++function add_blacklist_rule(mac) ++ exec("iptables -t filter -I luci_splash_filter -m mac --mac-source %q -j DROP" % mac) ++ if has_ipv6 then ++ exec("ip6tables -t filter -I luci_splash_filter -m mac --mac-source %q -j DROP" % mac) ++ end ++end ++ ++ ++-- Synchronise leases, remove abandoned rules ++function sync() ++ lock() ++ ++ local time = os.time() ++ ++ -- Current leases in state files ++ local leases = uci:get_all("luci_splash_leases") ++ ++ -- Convert leasetime to seconds ++ local leasetime = tonumber(uci:get("luci_splash", "general", "leasetime")) * 3600 ++ ++ -- Clean state file ++ uci:load("luci_splash_leases") ++ uci:revert("luci_splash_leases") ++ ++ ++ local blackwhitelist = uci:get_all("luci_splash") ++ local whitelist_total = 0 ++ local whitelist_online = 0 ++ local blacklist_total = 0 ++ local blacklist_online = 0 ++ local leasecount = 0 ++ local leases_online = 0 ++ ++ -- For all leases ++ for k, v in pairs(leases) do ++ if v[".type"] == "lease" then ++ if os.difftime(time, tonumber(v.start)) > leasetime then ++ -- Remove expired ++ remove_lease_rule(v.mac, v.ipaddr, v.device, tonumber(v.limit_up), tonumber(v.limit_down)) ++ else ++ leasecount = leasecount + 1 ++ ++ -- only count leases_online for connected clients ++ if mac_to_ip(v.mac) then ++ leases_online = leases_online + 1 ++ end ++ ++ -- Rewrite state ++ uci:section("luci_splash_leases", "lease", convert_mac_to_secname(v.mac), { ++ mac = v.mac, ++ ipaddr = v.ipaddr, ++ device = v.device, ++ limit_up = limit_up, ++ limit_down = limit_down, ++ start = v.start ++ }) ++ end ++ end ++ end ++ ++ -- Whitelist, Blacklist ++ for _, s in utl.spairs(blackwhitelist, ++ function(a,b) return blackwhitelist[a][".type"] > blackwhitelist[b][".type"] end ++ ) do ++ if (s[".type"] == "whitelist") then ++ whitelist_total = whitelist_total + 1 ++ if s.mac then ++ local mac = s.mac:lower() ++ if mac_to_ip(mac) then ++ whitelist_online = whitelist_online + 1 ++ end ++ end ++ end ++ if (s[".type"] == "blacklist") then ++ blacklist_total = blacklist_total + 1 ++ if s.mac then ++ local mac = s.mac:lower() ++ if mac_to_ip(mac) then ++ blacklist_online = blacklist_online + 1 ++ end ++ end ++ end ++ end ++ ++ -- ToDo: ++ -- include a new field "leases_online" in stats to differ between active clients and leases: ++ -- update_stats(leasecount, leases_online, whitelist_online, whitelist_total, blacklist_online, blacklist_total) later: ++ update_stats(leases_online, whitelist_online, whitelist_total, blacklist_online, blacklist_total) ++ ++ uci:save("luci_splash_leases") ++ ++ -- Get the mac addresses of current leases ++ local macs = get_known_macs() ++ ++ ipt:resync() ++ ++ ipt_delete_all({table="filter", chain="luci_splash_filter", options={"MAC"}}, ++ function(r) return not macs[r.options[2]:lower()] end) ++ ipt_delete_all({table="nat", chain="luci_splash_leases", options={"MAC"}}, ++ function(r) return not macs[r.options[2]:lower()] end) ++ ipt_delete_all({table="mangle", chain="luci_splash_mark_out", options={"MAC", "MARK", "set"}}, ++ function(r) return not macs[r.options[2]:lower()] end) ++ ipt_delete_all({table="mangle", chain="luci_splash_mark_in", options={"/*", "MARK", "set"}}, ++ function(r) return not macs[r.options[2]:lower()] end) ++ ++ ++ if has_ipv6 then ++ ipt6_delete_all({table="filter", chain="luci_splash_filter", options={"MAC"}}, ++ function(r) return not macs[r.options[2]:lower()] end) ++ ipt6_delete_all({table="mangle", chain="luci_splash_mark_out", options={"MAC", "MARK", "set"}}, ++ function(r) return not macs[r.options[2]:lower()] end) ++ end ++ ++ unlock() ++end ++ ++-- Show client info ++function list() ++ -- Find traffic usage ++ local function traffic(lease) ++ local traffic_in = 0 ++ local traffic_out = 0 ++ ++ local rin = ipt:find({table="mangle", chain="luci_splash_mark_in", destination=lease.ipaddr}) ++ local rout = ipt:find({table="mangle", chain="luci_splash_mark_out", options={"MAC", lease.mac:upper()}}) ++ ++ if rin and #rin > 0 then traffic_in = math.floor( rin[1].bytes / 1024) end ++ if rout and #rout > 0 then traffic_out = math.floor(rout[1].bytes / 1024) end ++ ++ return traffic_in, traffic_out ++ end ++ ++ -- Print listings ++ local leases = uci:get_all("luci_splash_leases") ++ local blackwhitelist = uci:get_all("luci_splash") ++ ++ print(string.format( ++ "%-17s %-15s %-9s %-4s %-7s %20s", ++ "MAC", "IP", "State", "Dur.", "Intf.", "Traffic down/up" ++ )) ++ ++ -- Leases ++ for _, s in pairs(leases) do ++ if s[".type"] == "lease" and s.mac then ++ local ti, to = traffic(s) ++ local mac = s.mac:lower() ++ print(string.format( ++ "%-17s %-15s %-9s %3dm %-7s %7dKB %7dKB", ++ mac, s.ipaddr, "leased", ++ math.floor(( os.time() - tonumber(s.start) ) / 60), ++ mac_to_dev(mac) or "?", ti, to ++ )) ++ end ++ end ++ ++ -- Whitelist, Blacklist ++ for _, s in utl.spairs(blackwhitelist, ++ function(a,b) return blackwhitelist[a][".type"] > blackwhitelist[b][".type"] end ++ ) do ++ if (s[".type"] == "whitelist" or s[".type"] == "blacklist") and s.mac then ++ local mac = s.mac:lower() ++ print(string.format( ++ "%-17s %-15s %-9s %4s %-7s %9s %9s", ++ mac, mac_to_ip(mac) or "?", s[".type"], ++ "- ", mac_to_dev(mac) or "?", "-", "-" ++ )) ++ end ++ end ++end ++ ++main(arg) +diff --git a/feeds/luci/applications/luci-app-statistics/Makefile b/feeds/luci/applications/luci-app-statistics/Makefile +new file mode 100644 +index 0000000..af07cfb +--- /dev/null ++++ b/feeds/luci/applications/luci-app-statistics/Makefile +@@ -0,0 +1,16 @@ ++# ++# Copyright (C) 2008-2014 The LuCI Team ++# ++# This is free software, licensed under the Apache License, Version 2.0 . ++# ++ ++include $(TOPDIR)/rules.mk ++ ++LUCI_TITLE:=LuCI Statistics Application ++LUCI_DEPENDS:= \ ++ +collectd +rrdtool1 +collectd-mod-rrdtool +collectd-mod-iwinfo \ ++ +collectd-mod-interface +collectd-mod-load +collectd-mod-network ++ ++include ../../luci.mk ++ ++# call BuildPackage - OpenWrt buildroot signature +diff --git a/feeds/luci/applications/luci-app-statistics/luasrc/controller/luci_statistics/luci_statistics.lua b/feeds/luci/applications/luci-app-statistics/luasrc/controller/luci_statistics/luci_statistics.lua +new file mode 100644 +index 0000000..49eab5a +--- /dev/null ++++ b/feeds/luci/applications/luci-app-statistics/luasrc/controller/luci_statistics/luci_statistics.lua +@@ -0,0 +1,199 @@ ++-- Copyright 2008 Freifunk Leipzig / Jo-Philipp Wich ++-- Copyright 2012 Jo-Philipp Wich ++-- Licensed to the public under the Apache License 2.0. ++ ++module("luci.controller.luci_statistics.luci_statistics", package.seeall) ++ ++function index() ++ ++ require("nixio.fs") ++ require("luci.util") ++ require("luci.statistics.datatree") ++ ++ -- override entry(): check for existance .so where is derived from the called path ++ function _entry( path, ... ) ++ local file = path[5] or path[4] ++ if nixio.fs.access( "/usr/lib/collectd/" .. file .. ".so" ) then ++ entry( path, ... ) ++ end ++ end ++ ++ local labels = { ++ s_output = _("Output plugins"), ++ s_system = _("System plugins"), ++ s_network = _("Network plugins"), ++ ++ conntrack = _("Conntrack"), ++ cpu = _("Processor"), ++ csv = _("CSV Output"), ++ df = _("Disk Space Usage"), ++ disk = _("Disk Usage"), ++ dns = _("DNS"), ++ email = _("Email"), ++ entropy = _("Entropy"), ++ exec = _("Exec"), ++ interface = _("Interfaces"), ++ iptables = _("Firewall"), ++ irq = _("Interrupts"), ++ iwinfo = _("Wireless"), ++ load = _("System Load"), ++ memory = _("Memory"), ++ netlink = _("Netlink"), ++ network = _("Network"), ++ nut = _("UPS"), ++ olsrd = _("OLSRd"), ++ ping = _("Ping"), ++ processes = _("Processes"), ++ rrdtool = _("RRDTool"), ++ splash_leases = _("Splash Leases"), ++ tcpconns = _("TCP Connections"), ++ unixsock = _("UnixSock"), ++ uptime = _("Uptime") ++ } ++ ++ -- our collectd menu ++ local collectd_menu = { ++ output = { "csv", "network", "rrdtool", "unixsock" }, ++ system = { "cpu", "df", "disk", "email", "entropy", "exec", "irq", "load", "memory", "nut", "processes", "uptime" }, ++ network = { "conntrack", "dns", "interface", "iptables", "netlink", "olsrd", "ping", "splash_leases", "tcpconns", "iwinfo" } ++ } ++ ++ -- create toplevel menu nodes ++ local st = entry({"admin", "statistics"}, template("admin_statistics/index"), _("Statistics"), 80) ++ st.index = true ++ ++ entry({"admin", "statistics", "collectd"}, cbi("luci_statistics/collectd"), _("Collectd"), 10).subindex = true ++ ++ ++ -- populate collectd plugin menu ++ local index = 1 ++ for section, plugins in luci.util.kspairs( collectd_menu ) do ++ local e = entry( ++ { "admin", "statistics", "collectd", section }, ++ firstchild(), labels["s_"..section], index * 10 ++ ) ++ ++ e.index = true ++ ++ for j, plugin in luci.util.vspairs( plugins ) do ++ _entry( ++ { "admin", "statistics", "collectd", section, plugin }, ++ cbi("luci_statistics/" .. plugin ), ++ labels[plugin], j * 10 ++ ) ++ end ++ ++ index = index + 1 ++ end ++ ++ -- output views ++ local page = entry( { "admin", "statistics", "graph" }, template("admin_statistics/index"), _("Graphs"), 80) ++ page.setuser = "nobody" ++ page.setgroup = "nogroup" ++ ++ local vars = luci.http.formvalue(nil, true) ++ local span = vars.timespan or nil ++ local host = vars.host or nil ++ ++ -- get rrd data tree ++ local tree = luci.statistics.datatree.Instance(host) ++ ++ local _, plugin, idx ++ for _, plugin, idx in luci.util.vspairs( tree:plugins() ) do ++ ++ -- get plugin instances ++ local instances = tree:plugin_instances( plugin ) ++ ++ -- plugin menu entry ++ entry( ++ { "admin", "statistics", "graph", plugin }, ++ call("statistics_render"), labels[plugin], idx ++ ).query = { timespan = span , host = host } ++ ++ -- if more then one instance is found then generate submenu ++ if #instances > 1 then ++ local _, inst, idx2 ++ for _, inst, idx2 in luci.util.vspairs(instances) do ++ -- instance menu entry ++ entry( ++ { "admin", "statistics", "graph", plugin, inst }, ++ call("statistics_render"), inst, idx2 ++ ).query = { timespan = span , host = host } ++ end ++ end ++ end ++end ++ ++function statistics_render() ++ ++ require("luci.statistics.rrdtool") ++ require("luci.template") ++ require("luci.model.uci") ++ ++ local vars = luci.http.formvalue() ++ local req = luci.dispatcher.context.request ++ local path = luci.dispatcher.context.path ++ local uci = luci.model.uci.cursor() ++ local spans = luci.util.split( uci:get( "luci_statistics", "collectd_rrdtool", "RRATimespans" ), "%s+", nil, true ) ++ local span = vars.timespan or uci:get( "luci_statistics", "rrdtool", "default_timespan" ) or spans[1] ++ local host = vars.host or uci:get( "luci_statistics", "collectd", "Hostname" ) or luci.sys.hostname() ++ local opts = { host = vars.host } ++ local graph = luci.statistics.rrdtool.Graph( luci.util.parse_units( span ), opts ) ++ local hosts = graph.tree:host_instances() ++ ++ local is_index = false ++ local i, p, inst, idx ++ ++ -- deliver image ++ if vars.img then ++ local l12 = require "luci.ltn12" ++ local png = io.open(graph.opts.imgpath .. "/" .. vars.img:gsub("%.+", "."), "r") ++ if png then ++ luci.http.prepare_content("image/png") ++ l12.pump.all(l12.source.file(png), luci.http.write) ++ end ++ return ++ end ++ ++ local plugin, instances ++ local images = { } ++ ++ -- find requested plugin and instance ++ for i, p in ipairs( luci.dispatcher.context.path ) do ++ if luci.dispatcher.context.path[i] == "graph" then ++ plugin = luci.dispatcher.context.path[i+1] ++ instances = { luci.dispatcher.context.path[i+2] } ++ end ++ end ++ ++ -- no instance requested, find all instances ++ if #instances == 0 then ++ --instances = { graph.tree:plugin_instances( plugin )[1] } ++ instances = graph.tree:plugin_instances( plugin ) ++ is_index = true ++ ++ -- index instance requested ++ elseif instances[1] == "-" then ++ instances[1] = "" ++ is_index = true ++ end ++ ++ ++ -- render graphs ++ for i, inst in luci.util.vspairs( instances ) do ++ for i, img in luci.util.vspairs( graph:render( plugin, inst, is_index ) ) do ++ table.insert( images, graph:strippngpath( img ) ) ++ images[images[#images]] = inst ++ end ++ end ++ ++ luci.template.render( "public_statistics/graph", { ++ images = images, ++ plugin = plugin, ++ timespans = spans, ++ current_timespan = span, ++ hosts = hosts, ++ current_host = host, ++ is_index = is_index ++ } ) ++end +diff --git a/feeds/luci/applications/luci-app-statistics/luasrc/model/cbi/luci_statistics/collectd.lua b/feeds/luci/applications/luci-app-statistics/luasrc/model/cbi/luci_statistics/collectd.lua +new file mode 100644 +index 0000000..663a3f1 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-statistics/luasrc/model/cbi/luci_statistics/collectd.lua +@@ -0,0 +1,62 @@ ++-- Copyright 2008 Freifunk Leipzig / Jo-Philipp Wich ++-- Licensed to the public under the Apache License 2.0. ++ ++require("luci.sys") ++ ++ ++m = Map("luci_statistics", ++ translate("Collectd Settings"), ++ translate( ++ "Collectd is a small daemon for collecting data from " .. ++ "various sources through different plugins. On this page " .. ++ "you can change general settings for the collectd daemon." ++ )) ++ ++-- general config section ++s = m:section( NamedSection, "collectd", "luci_statistics" ) ++ ++-- general.hostname (Hostname) ++hostname = s:option( Value, "Hostname", translate("Hostname") ) ++hostname.default = luci.sys.hostname() ++hostname.optional = true ++ ++-- general.basedir (BaseDir) ++basedir = s:option( Value, "BaseDir", translate("Base Directory") ) ++basedir.default = "/var/run/collectd" ++ ++-- general.include (Include) ++include = s:option( Value, "Include", translate("Directory for sub-configurations") ) ++include.default = "/etc/collectd/conf.d/*.conf" ++ ++-- general.plugindir (PluginDir) ++plugindir = s:option( Value, "PluginDir", translate("Directory for collectd plugins") ) ++plugindir.default = "/usr/lib/collectd/" ++ ++-- general.pidfile (PIDFile) ++pidfile = s:option( Value, "PIDFile", translate("Used PID file") ) ++pidfile.default = "/var/run/collectd.pid" ++ ++-- general.typesdb (TypesDB) ++typesdb = s:option( Value, "TypesDB", translate("Datasets definition file") ) ++typesdb.default = "/etc/collectd/types.db" ++ ++-- general.interval (Interval) ++interval = s:option( Value, "Interval", translate("Data collection interval"), translate("Seconds") ) ++interval.default = 60 ++interval.isnumber = true ++ ++-- general.readthreads (ReadThreads) ++readthreads = s:option( Value, "ReadThreads", translate("Number of threads for data collection") ) ++readthreads.default = 5 ++readthreads.isnumber = true ++ ++-- general.fqdnlookup (FQDNLookup) ++fqdnlookup = s:option( Flag, "FQDNLookup", translate("Try to lookup fully qualified hostname") ) ++fqdnlookup.enabled = "true" ++fqdnlookup.disabled = "false" ++fqdnlookup.default = "false" ++fqdnlookup.optional = true ++fqdnlookup:depends( "Hostname", "" ) ++ ++ ++return m +diff --git a/feeds/luci/applications/luci-app-statistics/luasrc/model/cbi/luci_statistics/conntrack.lua b/feeds/luci/applications/luci-app-statistics/luasrc/model/cbi/luci_statistics/conntrack.lua +new file mode 100644 +index 0000000..f89cdb1 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-statistics/luasrc/model/cbi/luci_statistics/conntrack.lua +@@ -0,0 +1,21 @@ ++--[[ ++ ++Copyright 2011 Jo-Philipp Wich ++ ++Licensed under the Apache License, Version 2.0 (the "License"); ++you may not use this file except in compliance with the License. ++You may obtain a copy of the License at ++ ++ http://www.apache.org/licenses/LICENSE-2.0 ++]]-- ++ ++m = Map("luci_statistics", ++ translate("Conntrack Plugin Configuration"), ++ translate("The conntrack plugin collects statistics about the number of tracked connections.")) ++ ++s = m:section( NamedSection, "collectd_conntrack", "luci_statistics" ) ++ ++enable = s:option( Flag, "enable", translate("Enable this plugin") ) ++enable.default = 0 ++ ++return m +diff --git a/feeds/luci/applications/luci-app-statistics/luasrc/model/cbi/luci_statistics/cpu.lua b/feeds/luci/applications/luci-app-statistics/luasrc/model/cbi/luci_statistics/cpu.lua +new file mode 100644 +index 0000000..ee3fd25 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-statistics/luasrc/model/cbi/luci_statistics/cpu.lua +@@ -0,0 +1,15 @@ ++-- Copyright 2008 Freifunk Leipzig / Jo-Philipp Wich ++-- Licensed to the public under the Apache License 2.0. ++ ++m = Map("luci_statistics", ++ translate("CPU Plugin Configuration"), ++ translate("The cpu plugin collects basic statistics about the processor usage.")) ++ ++-- collectd_cpu config section ++s = m:section( NamedSection, "collectd_cpu", "luci_statistics" ) ++ ++-- collectd_cpu.enable ++enable = s:option( Flag, "enable", translate("Enable this plugin") ) ++enable.default = 0 ++ ++return m +diff --git a/feeds/luci/applications/luci-app-statistics/luasrc/model/cbi/luci_statistics/csv.lua b/feeds/luci/applications/luci-app-statistics/luasrc/model/cbi/luci_statistics/csv.lua +new file mode 100644 +index 0000000..ec45a67 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-statistics/luasrc/model/cbi/luci_statistics/csv.lua +@@ -0,0 +1,29 @@ ++-- Copyright 2008 Freifunk Leipzig / Jo-Philipp Wich ++-- Licensed to the public under the Apache License 2.0. ++ ++m = Map("luci_statistics", ++ translate("CSV Plugin Configuration"), ++ translate( ++ "The csv plugin stores collected data in csv file format " .. ++ "for further processing by external programs." ++ )) ++ ++-- collectd_csv config section ++s = m:section( NamedSection, "collectd_csv", "luci_statistics" ) ++ ++-- collectd_csv.enable ++enable = s:option( Flag, "enable", translate("Enable this plugin") ) ++enable.default = 0 ++ ++-- collectd_csv.datadir (DataDir) ++datadir = s:option( Value, "DataDir", translate("Storage directory for the csv files") ) ++datadir.default = "127.0.0.1" ++datadir:depends( "enable", 1 ) ++ ++-- collectd_csv.storerates (StoreRates) ++storerates = s:option( Flag, "StoreRates", translate("Store data values as rates instead of absolute values") ) ++storerates.default = 0 ++storerates:depends( "enable", 1 ) ++ ++return m ++ +diff --git a/feeds/luci/applications/luci-app-statistics/luasrc/model/cbi/luci_statistics/df.lua b/feeds/luci/applications/luci-app-statistics/luasrc/model/cbi/luci_statistics/df.lua +new file mode 100644 +index 0000000..c6031fd +--- /dev/null ++++ b/feeds/luci/applications/luci-app-statistics/luasrc/model/cbi/luci_statistics/df.lua +@@ -0,0 +1,41 @@ ++-- Copyright 2008 Freifunk Leipzig / Jo-Philipp Wich ++-- Licensed to the public under the Apache License 2.0. ++ ++m = Map("luci_statistics", ++ translate("DF Plugin Configuration"), ++ translate( ++ "The df plugin collects statistics about the disk space " .. ++ "usage on different devices, mount points or filesystem types." ++ )) ++ ++-- collectd_df config section ++s = m:section( NamedSection, "collectd_df", "luci_statistics" ) ++ ++-- collectd_df.enable ++enable = s:option( Flag, "enable", translate("Enable this plugin") ) ++enable.default = 0 ++ ++-- collectd_df.devices (Device) ++devices = s:option( Value, "Devices", translate("Monitor devices") ) ++devices.default = "/dev/mtdblock/4" ++devices.optional = true ++devices:depends( "enable", 1 ) ++ ++-- collectd_df.mountpoints (MountPoint) ++mountpoints = s:option( Value, "MountPoints", translate("Monitor mount points") ) ++mountpoints.default = "/overlay" ++mountpoints.optional = true ++mountpoints:depends( "enable", 1 ) ++ ++-- collectd_df.fstypes (FSType) ++fstypes = s:option( Value, "FSTypes", translate("Monitor filesystem types") ) ++fstypes.default = "tmpfs" ++fstypes.optional = true ++fstypes:depends( "enable", 1 ) ++ ++-- collectd_df.ignoreselected (IgnoreSelected) ++ignoreselected = s:option( Flag, "IgnoreSelected", translate("Monitor all except specified") ) ++ignoreselected.default = 0 ++ignoreselected:depends( "enable", 1 ) ++ ++return m +diff --git a/feeds/luci/applications/luci-app-statistics/luasrc/model/cbi/luci_statistics/disk.lua b/feeds/luci/applications/luci-app-statistics/luasrc/model/cbi/luci_statistics/disk.lua +new file mode 100644 +index 0000000..dc3d3fb +--- /dev/null ++++ b/feeds/luci/applications/luci-app-statistics/luasrc/model/cbi/luci_statistics/disk.lua +@@ -0,0 +1,29 @@ ++-- Copyright 2008 Freifunk Leipzig / Jo-Philipp Wich ++-- Licensed to the public under the Apache License 2.0. ++ ++m = Map("luci_statistics", ++ translate("Disk Plugin Configuration"), ++ translate( ++ "The disk plugin collects detailled usage statistics " .. ++ "for selected partitions or whole disks." ++ )) ++ ++-- collectd_disk config section ++s = m:section( NamedSection, "collectd_disk", "luci_statistics" ) ++ ++-- collectd_disk.enable ++enable = s:option( Flag, "enable", translate("Enable this plugin") ) ++enable.default = 0 ++ ++-- collectd_disk.disks (Disk) ++devices = s:option( Value, "Disks", translate("Monitor disks and partitions") ) ++devices.default = "hda1 hdb" ++devices.rmempty = true ++devices:depends( "enable", 1 ) ++ ++-- collectd_disk.ignoreselected (IgnoreSelected) ++ignoreselected = s:option( Flag, "IgnoreSelected", translate("Monitor all except specified") ) ++ignoreselected.default = 0 ++ignoreselected:depends( "enable", 1 ) ++ ++return m +diff --git a/feeds/luci/applications/luci-app-statistics/luasrc/model/cbi/luci_statistics/dns.lua b/feeds/luci/applications/luci-app-statistics/luasrc/model/cbi/luci_statistics/dns.lua +new file mode 100644 +index 0000000..29b998b +--- /dev/null ++++ b/feeds/luci/applications/luci-app-statistics/luasrc/model/cbi/luci_statistics/dns.lua +@@ -0,0 +1,36 @@ ++-- Copyright 2008 Freifunk Leipzig / Jo-Philipp Wich ++-- Licensed to the public under the Apache License 2.0. ++ ++require("luci.sys") ++ ++ ++m = Map("luci_statistics", ++ translate("DNS Plugin Configuration"), ++ translate( ++ "The dns plugin collects detailled statistics about dns " .. ++ "related traffic on selected interfaces." ++ )) ++ ++-- collectd_dns config section ++s = m:section( NamedSection, "collectd_dns", "luci_statistics" ) ++ ++-- collectd_dns.enable ++enable = s:option( Flag, "enable", translate("Enable this plugin") ) ++enable.default = 0 ++ ++-- collectd_dns.interfaces (Interface) ++interfaces = s:option( MultiValue, "Interfaces", translate("Monitor interfaces") ) ++interfaces.widget = "select" ++interfaces.size = 5 ++interfaces:depends( "enable", 1 ) ++interfaces:value("any") ++for k, v in pairs(luci.sys.net.devices()) do ++ interfaces:value(v) ++end ++ ++-- collectd_dns.ignoresources (IgnoreSource) ++ignoresources = s:option( Value, "IgnoreSources", translate("Ignore source addresses") ) ++ignoresources.default = "127.0.0.1" ++ignoresources:depends( "enable", 1 ) ++ ++return m +diff --git a/feeds/luci/applications/luci-app-statistics/luasrc/model/cbi/luci_statistics/email.lua b/feeds/luci/applications/luci-app-statistics/luasrc/model/cbi/luci_statistics/email.lua +new file mode 100644 +index 0000000..e6ed439 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-statistics/luasrc/model/cbi/luci_statistics/email.lua +@@ -0,0 +1,48 @@ ++-- Copyright 2008 Freifunk Leipzig / Jo-Philipp Wich ++-- Licensed to the public under the Apache License 2.0. ++ ++m = Map("luci_statistics", ++ translate("E-Mail Plugin Configuration"), ++ translate( ++ "The email plugin creates a unix socket which can be used " .. ++ "to transmit email-statistics to a running collectd daemon. " .. ++ "This plugin is primarily intended to be used in conjunction " .. ++ "with Mail::SpamAssasin::Plugin::Collectd but can be used in " .. ++ "other ways as well." ++ )) ++ ++-- collectd_email config section ++s = m:section( NamedSection, "collectd_email", "luci_statistics" ) ++ ++-- collectd_email.enable ++enable = s:option( Flag, "enable", translate("Enable this plugin") ) ++enable.default = 0 ++ ++-- collectd_email.socketfile (SocketFile) ++socketfile = s:option( Value, "SocketFile", translate("Socket file") ) ++socketfile.default = "/var/run/collect-email.sock" ++socketfile:depends( "enable", 1 ) ++ ++-- collectd_email.socketgroup (SocketGroup) ++socketgroup = s:option( Value, "SocketGroup", translate("Socket group") ) ++socketgroup.default = "nobody" ++socketgroup.rmempty = true ++socketgroup.optional = true ++socketgroup:depends( "enable", 1 ) ++ ++-- collectd_email.socketperms (SocketPerms) ++socketperms = s:option( Value, "SocketPerms", translate("Socket permissions") ) ++socketperms.default = "0770" ++socketperms.rmempty = true ++socketperms.optional = true ++socketperms:depends( "enable", 1 ) ++ ++-- collectd_email.maxconns (MaxConns) ++maxconns = s:option( Value, "MaxConns", translate("Maximum allowed connections") ) ++maxconns.default = 5 ++maxconns.isinteger = true ++maxconns.rmempty = true ++maxconns.optional = true ++maxconns:depends( "enable", 1 ) ++ ++return m +diff --git a/feeds/luci/applications/luci-app-statistics/luasrc/model/cbi/luci_statistics/entropy.lua b/feeds/luci/applications/luci-app-statistics/luasrc/model/cbi/luci_statistics/entropy.lua +new file mode 100644 +index 0000000..d18bf91 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-statistics/luasrc/model/cbi/luci_statistics/entropy.lua +@@ -0,0 +1,14 @@ ++-- Copyright 2015 Hannu Nyman ++-- Licensed to the public under the Apache License 2.0. ++ ++m = Map("luci_statistics", ++ translate("Entropy Plugin Configuration"), ++ translate("The entropy plugin collects statistics about the available entropy.")) ++ ++s = m:section( NamedSection, "collectd_entropy", "luci_statistics" ) ++ ++enable = s:option( Flag, "enable", translate("Enable this plugin") ) ++enable.default = 0 ++ ++return m ++ +diff --git a/feeds/luci/applications/luci-app-statistics/luasrc/model/cbi/luci_statistics/exec.lua b/feeds/luci/applications/luci-app-statistics/luasrc/model/cbi/luci_statistics/exec.lua +new file mode 100644 +index 0000000..48e0ec2 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-statistics/luasrc/model/cbi/luci_statistics/exec.lua +@@ -0,0 +1,77 @@ ++-- Copyright 2008 Freifunk Leipzig / Jo-Philipp Wich ++-- Licensed to the public under the Apache License 2.0. ++ ++m = Map("luci_statistics", ++ translate("Exec Plugin Configuration"), ++ translate( ++ "The exec plugin starts external commands to read values " .. ++ "from or to notify external processes when certain threshold " .. ++ "values have been reached." ++ )) ++ ++-- collectd_exec config section ++s = m:section( NamedSection, "collectd_exec", "luci_statistics" ) ++ ++-- collectd_exec.enable ++enable = s:option( Flag, "enable", translate("Enable this plugin") ) ++enable.default = 0 ++ ++ ++-- collectd_exec_input config section (Exec directives) ++exec = m:section( TypedSection, "collectd_exec_input", ++ translate("Add command for reading values"), ++ translate( ++ "Here you can define external commands which will be " .. ++ "started by collectd in order to read certain values. " .. ++ "The values will be read from stdout." ++ )) ++exec.addremove = true ++exec.anonymous = true ++ ++-- collectd_exec_input.cmdline ++exec_cmdline = exec:option( Value, "cmdline", translate("Script") ) ++exec_cmdline.default = "/usr/bin/stat-dhcpusers" ++ ++-- collectd_exec_input.cmdline ++exec_cmduser = exec:option( Value, "cmduser", translate("User") ) ++exec_cmduser.default = "nobody" ++exec_cmduser.rmempty = true ++exec_cmduser.optional = true ++ ++-- collectd_exec_input.cmdline ++exec_cmdgroup = exec:option( Value, "cmdgroup", translate("Group") ) ++exec_cmdgroup.default = "nogroup" ++exec_cmdgroup.rmempty = true ++exec_cmdgroup.optional = true ++ ++ ++-- collectd_exec_notify config section (NotifyExec directives) ++notify = m:section( TypedSection, "collectd_exec_notify", ++ translate("Add notification command"), ++ translate( ++ "Here you can define external commands which will be " .. ++ "started by collectd when certain threshold values have " .. ++ "been reached. The values leading to invokation will be " .. ++ "feeded to the the called programs stdin." ++ )) ++notify.addremove = true ++notify.anonymous = true ++ ++-- collectd_notify_input.cmdline ++notify_cmdline = notify:option( Value, "cmdline", translate("Script") ) ++notify_cmdline.default = "/usr/bin/stat-dhcpusers" ++ ++-- collectd_notify_input.cmdline ++notify_cmduser = notify:option( Value, "cmduser", translate("User") ) ++notify_cmduser.default = "nobody" ++notify_cmduser.rmempty = true ++notify_cmduser.optional = true ++ ++-- collectd_notify_input.cmdline ++notify_cmdgroup = notify:option( Value, "cmdgroup", translate("Group") ) ++notify_cmdgroup.default = "nogroup" ++notify_cmdgroup.rmempty = true ++notify_cmdgroup.optional = true ++ ++ ++return m +diff --git a/feeds/luci/applications/luci-app-statistics/luasrc/model/cbi/luci_statistics/interface.lua b/feeds/luci/applications/luci-app-statistics/luasrc/model/cbi/luci_statistics/interface.lua +new file mode 100644 +index 0000000..752212f +--- /dev/null ++++ b/feeds/luci/applications/luci-app-statistics/luasrc/model/cbi/luci_statistics/interface.lua +@@ -0,0 +1,35 @@ ++-- Copyright 2008 Freifunk Leipzig / Jo-Philipp Wich ++-- Licensed to the public under the Apache License 2.0. ++ ++require("luci.sys") ++ ++ ++m = Map("luci_statistics", ++ translate("Interface Plugin Configuration"), ++ translate( ++ "The interface plugin collects traffic statistics on " .. ++ "selected interfaces." ++ )) ++ ++-- collectd_interface config section ++s = m:section( NamedSection, "collectd_interface", "luci_statistics" ) ++ ++-- collectd_interface.enable ++enable = s:option( Flag, "enable", translate("Enable this plugin") ) ++enable.default = 0 ++ ++-- collectd_interface.interfaces (Interface) ++interfaces = s:option( MultiValue, "Interfaces", translate("Monitor interfaces") ) ++interfaces.widget = "select" ++interfaces.size = 5 ++interfaces:depends( "enable", 1 ) ++for k, v in pairs(luci.sys.net.devices()) do ++ interfaces:value(v) ++end ++ ++-- collectd_interface.ignoreselected (IgnoreSelected) ++ignoreselected = s:option( Flag, "IgnoreSelected", translate("Monitor all except specified") ) ++ignoreselected.default = 0 ++ignoreselected:depends( "enable", 1 ) ++ ++return m +diff --git a/feeds/luci/applications/luci-app-statistics/luasrc/model/cbi/luci_statistics/iptables.lua b/feeds/luci/applications/luci-app-statistics/luasrc/model/cbi/luci_statistics/iptables.lua +new file mode 100644 +index 0000000..aa46984 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-statistics/luasrc/model/cbi/luci_statistics/iptables.lua +@@ -0,0 +1,120 @@ ++-- Copyright 2008 Freifunk Leipzig / Jo-Philipp Wich ++-- Licensed to the public under the Apache License 2.0. ++ ++require("luci.sys.iptparser") ++ ++ip = luci.sys.iptparser.IptParser() ++chains = { } ++targets = { } ++ ++for i, rule in ipairs( ip:find() ) do ++ if rule.chain and rule.target then ++ chains[rule.chain] = true ++ targets[rule.target] = true ++ end ++end ++ ++ ++m = Map("luci_statistics", ++ translate("Iptables Plugin Configuration"), ++ translate( ++ "The iptables plugin will monitor selected firewall rules and " .. ++ "collect informations about processed bytes and packets per rule." ++ )) ++ ++-- collectd_iptables config section ++s = m:section( NamedSection, "collectd_iptables", "luci_statistics" ) ++ ++-- collectd_iptables.enable ++enable = s:option( Flag, "enable", translate("Enable this plugin") ) ++enable.default = 0 ++ ++ ++-- collectd_iptables_match config section (Chain directives) ++rule = m:section( TypedSection, "collectd_iptables_match", ++ translate("Add matching rule"), ++ translate( ++ "Here you can define various criteria by which the monitored " .. ++ "iptables rules are selected." ++ )) ++rule.addremove = true ++rule.anonymous = true ++ ++ ++-- collectd_iptables_match.name ++rule_table = rule:option( Value, "name", ++ translate("Name of the rule"), translate("max. 16 chars") ) ++ ++-- collectd_iptables_match.table ++rule_table = rule:option( ListValue, "table", translate("Table") ) ++rule_table.default = "filter" ++rule_table.rmempty = true ++rule_table.optional = true ++rule_table:value("") ++rule_table:value("filter") ++rule_table:value("nat") ++rule_table:value("mangle") ++ ++ ++-- collectd_iptables_match.chain ++rule_chain = rule:option( ListValue, "chain", translate("Chain") ) ++rule_chain.rmempty = true ++rule_chain.optional = true ++rule_chain:value("") ++ ++for chain, void in pairs( chains ) do ++ rule_chain:value( chain ) ++end ++ ++ ++-- collectd_iptables_match.target ++rule_target = rule:option( ListValue, "target", translate("Action (target)") ) ++rule_target.rmempty = true ++rule_target.optional = true ++rule_target:value("") ++ ++for target, void in pairs( targets ) do ++ rule_target:value( target ) ++end ++ ++ ++-- collectd_iptables_match.protocol ++rule_protocol = rule:option( ListValue, "protocol", translate("Network protocol") ) ++rule_protocol.rmempty = true ++rule_protocol.optional = true ++rule_protocol:value("") ++rule_protocol:value("tcp") ++rule_protocol:value("udp") ++rule_protocol:value("icmp") ++ ++-- collectd_iptables_match.source ++rule_source = rule:option( Value, "source", translate("Source ip range") ) ++rule_source.default = "0.0.0.0/0" ++rule_source.rmempty = true ++rule_source.optional = true ++ ++-- collectd_iptables_match.destination ++rule_destination = rule:option( Value, "destination", translate("Destination ip range") ) ++rule_destination.default = "0.0.0.0/0" ++rule_destination.rmempty = true ++rule_destination.optional = true ++ ++-- collectd_iptables_match.inputif ++rule_inputif = rule:option( Value, "inputif", ++ translate("Incoming interface"), translate("e.g. br-lan") ) ++rule_inputif.rmempty = true ++rule_inputif.optional = true ++ ++-- collectd_iptables_match.outputif ++rule_outputif = rule:option( Value, "outputif", ++ translate("Outgoing interface"), translate("e.g. br-ff") ) ++rule_outputif.rmempty = true ++rule_outputif.optional = true ++ ++-- collectd_iptables_match.options ++rule_options = rule:option( Value, "options", ++ translate("Options"), translate("e.g. reject-with tcp-reset") ) ++rule_options.rmempty = true ++rule_options.optional = true ++ ++return m +diff --git a/feeds/luci/applications/luci-app-statistics/luasrc/model/cbi/luci_statistics/irq.lua b/feeds/luci/applications/luci-app-statistics/luasrc/model/cbi/luci_statistics/irq.lua +new file mode 100644 +index 0000000..6a8c227 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-statistics/luasrc/model/cbi/luci_statistics/irq.lua +@@ -0,0 +1,30 @@ ++-- Copyright 2008 Freifunk Leipzig / Jo-Philipp Wich ++-- Licensed to the public under the Apache License 2.0. ++ ++m = Map("luci_statistics", ++ translate("IRQ Plugin Configuration"), ++ translate( ++ "The irq plugin will monitor the rate of issues per second for " .. ++ "each selected interrupt. If no interrupt is selected then all " .. ++ "interrupts are monitored." ++ )) ++ ++-- collectd_irq config section ++s = m:section( NamedSection, "collectd_irq", "luci_statistics" ) ++ ++-- collectd_irq.enable ++enable = s:option( Flag, "enable", translate("Enable this plugin") ) ++enable.default = 0 ++ ++-- collectd_irq.irqs (Irq) ++irqs = s:option( Value, "Irqs", translate("Monitor interrupts") ) ++irqs.optional = true ++irqs:depends( "enable", 1 ) ++ ++-- collectd_irq.ignoreselected (IgnoreSelected) ++ignoreselected = s:option( Flag, "IgnoreSelected", translate("Monitor all except specified") ) ++ignoreselected.default = 0 ++ignoreselected.optional = "true" ++ignoreselected:depends( "enable", 1 ) ++ ++return m +diff --git a/feeds/luci/applications/luci-app-statistics/luasrc/model/cbi/luci_statistics/iwinfo.lua b/feeds/luci/applications/luci-app-statistics/luasrc/model/cbi/luci_statistics/iwinfo.lua +new file mode 100644 +index 0000000..20d9509 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-statistics/luasrc/model/cbi/luci_statistics/iwinfo.lua +@@ -0,0 +1,26 @@ ++-- Copyright 2011 Jo-Philipp Wich ++-- Licensed to the public under the Apache License 2.0. ++ ++local m, s, o ++ ++m = Map("luci_statistics", ++ translate("Wireless iwinfo Plugin Configuration"), ++ translate("The iwinfo plugin collects statistics about wireless signal strength, noise and quality.")) ++ ++s = m:section(NamedSection, "collectd_iwinfo", "luci_statistics") ++ ++o = s:option(Flag, "enable", translate("Enable this plugin")) ++o.default = 0 ++ ++o = s:option(Value, "Interfaces", translate("Monitor interfaces"), ++ translate("Leave unselected to automatically determine interfaces to monitor.")) ++o.template = "cbi/network_ifacelist" ++o.widget = "checkbox" ++o.nocreate = true ++o:depends("enable", 1) ++ ++o = s:option(Flag, "IgnoreSelected", translate("Monitor all except specified")) ++o.default = 0 ++o:depends("enable", 1) ++ ++return m +diff --git a/feeds/luci/applications/luci-app-statistics/luasrc/model/cbi/luci_statistics/load.lua b/feeds/luci/applications/luci-app-statistics/luasrc/model/cbi/luci_statistics/load.lua +new file mode 100644 +index 0000000..6578291 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-statistics/luasrc/model/cbi/luci_statistics/load.lua +@@ -0,0 +1,17 @@ ++-- Copyright 2008 Freifunk Leipzig / Jo-Philipp Wich ++-- Licensed to the public under the Apache License 2.0. ++ ++m = Map("luci_statistics", ++ translate("Load Plugin Configuration"), ++ translate( ++ "The load plugin collects statistics about the general system load." ++ )) ++ ++-- collectd_wireless config section ++s = m:section( NamedSection, "collectd_load", "luci_statistics" ) ++ ++-- collectd_wireless.enable ++enable = s:option( Flag, "enable", translate("Enable this plugin") ) ++enable.default = 0 ++ ++return m +diff --git a/feeds/luci/applications/luci-app-statistics/luasrc/model/cbi/luci_statistics/memory.lua b/feeds/luci/applications/luci-app-statistics/luasrc/model/cbi/luci_statistics/memory.lua +new file mode 100644 +index 0000000..5510a5a +--- /dev/null ++++ b/feeds/luci/applications/luci-app-statistics/luasrc/model/cbi/luci_statistics/memory.lua +@@ -0,0 +1,21 @@ ++--[[ ++ ++Copyright 2011 Manuel Munz ++ ++Licensed under the Apache License, Version 2.0 (the "License"); ++you may not use this file except in compliance with the License. ++You may obtain a copy of the License at ++ ++ http://www.apache.org/licenses/LICENSE-2.0 ++]]-- ++ ++m = Map("luci_statistics", ++ translate("Memory Plugin Configuration"), ++ translate("The memory plugin collects statistics about the memory usage.")) ++ ++s = m:section( NamedSection, "collectd_memory", "luci_statistics" ) ++ ++enable = s:option( Flag, "enable", translate("Enable this plugin") ) ++enable.default = 0 ++ ++return m +diff --git a/feeds/luci/applications/luci-app-statistics/luasrc/model/cbi/luci_statistics/netlink.lua b/feeds/luci/applications/luci-app-statistics/luasrc/model/cbi/luci_statistics/netlink.lua +new file mode 100644 +index 0000000..917abd0 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-statistics/luasrc/model/cbi/luci_statistics/netlink.lua +@@ -0,0 +1,83 @@ ++-- Copyright 2008 Freifunk Leipzig / Jo-Philipp Wich ++-- Licensed to the public under the Apache License 2.0. ++ ++require("luci.sys") ++ ++local devices = luci.sys.net.devices() ++ ++ ++m = Map("luci_statistics", ++ translate("Netlink Plugin Configuration"), ++ translate( ++ "The netlink plugin collects extended informations like " .. ++ "qdisc-, class- and filter-statistics for selected interfaces." ++ )) ++ ++-- collectd_netlink config section ++s = m:section( NamedSection, "collectd_netlink", "luci_statistics" ) ++ ++-- collectd_netlink.enable ++enable = s:option( Flag, "enable", translate("Enable this plugin") ) ++enable.default = 0 ++ ++-- collectd_netlink.interfaces (Interface) ++interfaces = s:option( MultiValue, "Interfaces", translate("Basic monitoring") ) ++interfaces.widget = "select" ++interfaces.optional = true ++interfaces.size = #devices + 1 ++interfaces:depends( "enable", 1 ) ++interfaces:value("") ++for i, v in ipairs(devices) do ++ interfaces:value(v) ++end ++ ++-- collectd_netlink.verboseinterfaces (VerboseInterface) ++verboseinterfaces = s:option( MultiValue, "VerboseInterfaces", translate("Verbose monitoring") ) ++verboseinterfaces.widget = "select" ++verboseinterfaces.optional = true ++verboseinterfaces.size = #devices + 1 ++verboseinterfaces:depends( "enable", 1 ) ++verboseinterfaces:value("") ++for i, v in ipairs(devices) do ++ verboseinterfaces:value(v) ++end ++ ++-- collectd_netlink.qdiscs (QDisc) ++qdiscs = s:option( MultiValue, "QDiscs", translate("Qdisc monitoring") ) ++qdiscs.widget = "select" ++qdiscs.optional = true ++qdiscs.size = #devices + 1 ++qdiscs:depends( "enable", 1 ) ++qdiscs:value("") ++for i, v in ipairs(devices) do ++ qdiscs:value(v) ++end ++ ++-- collectd_netlink.classes (Class) ++classes = s:option( MultiValue, "Classes", translate("Shaping class monitoring") ) ++classes.widget = "select" ++classes.optional = true ++classes.size = #devices + 1 ++classes:depends( "enable", 1 ) ++classes:value("") ++for i, v in ipairs(devices) do ++ classes:value(v) ++end ++ ++-- collectd_netlink.filters (Filter) ++filters = s:option( MultiValue, "Filters", translate("Filter class monitoring") ) ++filters.widget = "select" ++filters.optional = true ++filters.size = #devices + 1 ++filters:depends( "enable", 1 ) ++filters:value("") ++for i, v in ipairs(devices) do ++ filters:value(v) ++end ++ ++-- collectd_netlink.ignoreselected (IgnoreSelected) ++ignoreselected = s:option( Flag, "IgnoreSelected", translate("Monitor all except specified") ) ++ignoreselected.default = 0 ++ignoreselected:depends( "enable", 1 ) ++ ++return m +diff --git a/feeds/luci/applications/luci-app-statistics/luasrc/model/cbi/luci_statistics/network.lua b/feeds/luci/applications/luci-app-statistics/luasrc/model/cbi/luci_statistics/network.lua +new file mode 100644 +index 0000000..547badf +--- /dev/null ++++ b/feeds/luci/applications/luci-app-statistics/luasrc/model/cbi/luci_statistics/network.lua +@@ -0,0 +1,85 @@ ++-- Copyright 2008 Freifunk Leipzig / Jo-Philipp Wich ++-- Licensed to the public under the Apache License 2.0. ++ ++m = Map("luci_statistics", ++ translate("Network Plugin Configuration"), ++ translate( ++ "The network plugin provides network based communication between " .. ++ "different collectd instances. Collectd can operate both in client " .. ++ "and server mode. In client mode locally collected data is " .. ++ "transferred to a collectd server instance, in server mode the " .. ++ "local instance receives data from other hosts." ++ )) ++ ++-- collectd_network config section ++s = m:section( NamedSection, "collectd_network", "luci_statistics" ) ++ ++-- collectd_network.enable ++enable = s:option( Flag, "enable", translate("Enable this plugin") ) ++enable.default = 0 ++ ++ ++-- collectd_network_listen config section (Listen) ++listen = m:section( TypedSection, "collectd_network_listen", ++ translate("Listener interfaces"), ++ translate( ++ "This section defines on which interfaces collectd will wait " .. ++ "for incoming connections." ++ )) ++listen.addremove = true ++listen.anonymous = true ++ ++-- collectd_network_listen.host ++listen_host = listen:option( Value, "host", translate("Listen host") ) ++listen_host.default = "0.0.0.0" ++ ++-- collectd_network_listen.port ++listen_port = listen:option( Value, "port", translate("Listen port") ) ++listen_port.default = 25826 ++listen_port.isinteger = true ++listen_port.optional = true ++ ++ ++-- collectd_network_server config section (Server) ++server = m:section( TypedSection, "collectd_network_server", ++ translate("server interfaces"), ++ translate( ++ "This section defines to which servers the locally collected " .. ++ "data is sent to." ++ )) ++server.addremove = true ++server.anonymous = true ++ ++-- collectd_network_server.host ++server_host = server:option( Value, "host", translate("Server host") ) ++server_host.default = "0.0.0.0" ++ ++-- collectd_network_server.port ++server_port = server:option( Value, "port", translate("Server port") ) ++server_port.default = 25826 ++server_port.isinteger = true ++server_port.optional = true ++ ++-- collectd_network.timetolive (TimeToLive) ++ttl = s:option( Value, "TimeToLive", translate("TTL for network packets") ) ++ttl.default = 128 ++ttl.isinteger = true ++ttl.optional = true ++ttl:depends( "enable", 1 ) ++ ++-- collectd_network.forward (Forward) ++forward = s:option( Flag, "Forward", translate("Forwarding between listen and server addresses") ) ++forward.default = 0 ++forward.optional = true ++forward:depends( "enable", 1 ) ++ ++-- collectd_network.cacheflush (CacheFlush) ++cacheflush = s:option( Value, "CacheFlush", ++ translate("Cache flush interval"), translate("Seconds") ) ++cacheflush.default = 86400 ++cacheflush.isinteger = true ++cacheflush.optional = true ++cacheflush:depends( "enable", 1 ) ++ ++ ++return m +diff --git a/feeds/luci/applications/luci-app-statistics/luasrc/model/cbi/luci_statistics/nut.lua b/feeds/luci/applications/luci-app-statistics/luasrc/model/cbi/luci_statistics/nut.lua +new file mode 100644 +index 0000000..03ec29e +--- /dev/null ++++ b/feeds/luci/applications/luci-app-statistics/luasrc/model/cbi/luci_statistics/nut.lua +@@ -0,0 +1,17 @@ ++-- Licensed to the public under the Apache License 2.0. ++ ++m = Map("luci_statistics", ++ translate("UPS Plugin Configuration"), ++ translate("The NUT plugin reads information about Uninterruptible Power Supplies.")) ++ ++s = m:section(NamedSection, "collectd_nut", "luci_statistics" ) ++ ++enable = s:option(Flag, "enable", translate("Enable this plugin")) ++enable.default = 0 ++ ++host = s:option(Value, "UPS", translate("UPS"), translate("UPS name in NUT ups@host format")) ++host.placeholder = "myupsname" ++host.datatype = "string" ++host.rmempty = true ++ ++return m +diff --git a/feeds/luci/applications/luci-app-statistics/luasrc/model/cbi/luci_statistics/olsrd.lua b/feeds/luci/applications/luci-app-statistics/luasrc/model/cbi/luci_statistics/olsrd.lua +new file mode 100644 +index 0000000..59266e5 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-statistics/luasrc/model/cbi/luci_statistics/olsrd.lua +@@ -0,0 +1,45 @@ ++-- Copyright 2011 Manuel Munz ++-- Licensed to the public under the Apache License 2.0. ++ ++m = Map("luci_statistics", ++ translate("OLSRd Plugin Configuration"), ++ translate("The OLSRd plugin reads information about meshed networks from the txtinfo plugin of OLSRd.")) ++ ++s = m:section(NamedSection, "collectd_olsrd", "luci_statistics" ) ++ ++enable = s:option(Flag, "enable", translate("Enable this plugin")) ++enable.default = 0 ++ ++host = s:option(Value, "Host", translate("Host"), translate("IP or hostname where to get the txtinfo output from")) ++host.placeholder = "127.0.0.1" ++host.datatype = "host" ++host.rmempty = true ++ ++port = s:option(Value, "Port", translate("Port")) ++port.placeholder = "2006" ++port.datatype = "range(0,65535)" ++port.rmempty = true ++port.cast = "string" ++ ++cl = s:option(ListValue, "CollectLinks", translate("CollectLinks"), ++ translate("Specifies what information to collect about links.")) ++cl:value("No") ++cl:value("Summary") ++cl:value("Detail") ++cl.default = "Detail" ++ ++cr = s:option(ListValue, "CollectRoutes", translate("CollectRoutes"), ++ translate("Specifies what information to collect about routes.")) ++cr:value("No") ++cr:value("Summary") ++cr:value("Detail") ++cr.default = "Summary" ++ ++ct = s:option(ListValue, "CollectTopology", translate("CollectTopology"), ++ translate("Specifies what information to collect about the global topology.")) ++ct:value("No") ++ct:value("Summary") ++ct:value("Detail") ++ct.default = "Summary" ++ ++return m +diff --git a/feeds/luci/applications/luci-app-statistics/luasrc/model/cbi/luci_statistics/ping.lua b/feeds/luci/applications/luci-app-statistics/luasrc/model/cbi/luci_statistics/ping.lua +new file mode 100644 +index 0000000..3179da6 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-statistics/luasrc/model/cbi/luci_statistics/ping.lua +@@ -0,0 +1,35 @@ ++-- Copyright 2008 Freifunk Leipzig / Jo-Philipp Wich ++-- Licensed to the public under the Apache License 2.0. ++ ++m = Map("luci_statistics", ++ translate("Ping Plugin Configuration"), ++ translate( ++ "The ping plugin will send icmp echo replies to selected " .. ++ "hosts and measure the roundtrip time for each host." ++ )) ++ ++-- collectd_ping config section ++s = m:section( NamedSection, "collectd_ping", "luci_statistics" ) ++ ++-- collectd_ping.enable ++enable = s:option( Flag, "enable", translate("Enable this plugin") ) ++enable.default = 0 ++ ++-- collectd_ping.hosts (Host) ++hosts = s:option( Value, "Hosts", translate("Monitor hosts"), translate ("Add multiple hosts separated by space.")) ++hosts.default = "127.0.0.1" ++hosts:depends( "enable", 1 ) ++ ++-- collectd_ping.ttl (TTL) ++ttl = s:option( Value, "TTL", translate("TTL for ping packets") ) ++ttl.isinteger = true ++ttl.default = 128 ++ttl:depends( "enable", 1 ) ++ ++-- collectd_ping.interval (Interval) ++interval = s:option( Value, "Interval", translate("Interval for pings"), translate ("Seconds") ) ++interval.isinteger = true ++interval.default = 30 ++interval:depends( "enable", 1 ) ++ ++return m +diff --git a/feeds/luci/applications/luci-app-statistics/luasrc/model/cbi/luci_statistics/processes.lua b/feeds/luci/applications/luci-app-statistics/luasrc/model/cbi/luci_statistics/processes.lua +new file mode 100644 +index 0000000..4171a88 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-statistics/luasrc/model/cbi/luci_statistics/processes.lua +@@ -0,0 +1,24 @@ ++-- Copyright 2008 Freifunk Leipzig / Jo-Philipp Wich ++-- Licensed to the public under the Apache License 2.0. ++ ++m = Map("luci_statistics", ++ translate("Processes Plugin Configuration"), ++ translate( ++ "The processes plugin collects informations like cpu time, " .. ++ "page faults and memory usage of selected processes." ++ )) ++ ++-- collectd_processes config section ++s = m:section( NamedSection, "collectd_processes", "luci_statistics" ) ++ ++-- collectd_processes.enable ++enable = s:option( Flag, "enable", translate("Enable this plugin") ) ++enable.default = 0 ++ ++-- collectd_processes.processes (Process) ++processes = s:option( Value, "Processes", translate("Monitor processes"), ++ translate("Processes to monitor separated by space") ) ++processes:depends( "enable", 1 ) ++processes.default = "uhttpd dropbear dnsmasq" ++ ++return m +diff --git a/feeds/luci/applications/luci-app-statistics/luasrc/model/cbi/luci_statistics/rrdtool.lua b/feeds/luci/applications/luci-app-statistics/luasrc/model/cbi/luci_statistics/rrdtool.lua +new file mode 100644 +index 0000000..b3bdf87 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-statistics/luasrc/model/cbi/luci_statistics/rrdtool.lua +@@ -0,0 +1,96 @@ ++-- Copyright 2008 Freifunk Leipzig / Jo-Philipp Wich ++-- Licensed to the public under the Apache License 2.0. ++ ++m = Map("luci_statistics", ++ translate("RRDTool Plugin Configuration"), ++ translate( ++ "The rrdtool plugin stores the collected data in rrd database " .. ++ "files, the foundation of the diagrams.

    " .. ++ "Warning: Setting the wrong values will result in a very " .. ++ "high memory consumption in the temporary directory. " .. ++ "This can render the device unusable!" ++ )) ++ ++-- collectd_rrdtool config section ++s = m:section( NamedSection, "collectd_rrdtool", "luci_statistics" ) ++ ++-- collectd_rrdtool.enable ++enable = s:option( Flag, "enable", translate("Enable this plugin") ) ++enable.default = 1 ++ ++-- collectd_rrdtool.datadir (DataDir) ++datadir = s:option( Value, "DataDir", translate("Storage directory") ) ++datadir.default = "/tmp" ++datadir.rmempty = true ++datadir.optional = true ++datadir:depends( "enable", 1 ) ++ ++-- collectd_rrdtool.stepsize (StepSize) ++stepsize = s:option( Value, "StepSize", ++ translate("RRD step interval"), translate("Seconds") ) ++stepsize.default = 30 ++stepsize.isinteger = true ++stepsize.rmempty = true ++stepsize.optional = true ++stepsize:depends( "enable", 1 ) ++ ++-- collectd_rrdtool.heartbeat (HeartBeat) ++heartbeat = s:option( Value, "HeartBeat", ++ translate("RRD heart beat interval"), translate("Seconds") ) ++heartbeat.default = 60 ++heartbeat.isinteger = true ++heartbeat.rmempty = true ++heartbeat.optional = true ++heartbeat:depends( "enable", 1 ) ++ ++-- collectd_rrdtool.rrasingle (RRASingle) ++rrasingle = s:option( Flag, "RRASingle", ++ translate("Only create average RRAs"), translate("reduces rrd size") ) ++rrasingle.default = true ++rrasingle.rmempty = true ++rrasingle.optional = true ++rrasingle:depends( "enable", 1 ) ++ ++-- collectd_rrdtool.rratimespans (RRATimespan) ++rratimespans = s:option( Value, "RRATimespans", ++ translate("Stored timespans"), translate("seconds; multiple separated by space") ) ++rratimespans.default = "600 86400 604800 2678400 31622400" ++rratimespans.rmempty = true ++rratimespans.optional = true ++rratimespans:depends( "enable", 1 ) ++ ++-- collectd_rrdtool.rrarows (RRARows) ++rrarows = s:option( Value, "RRARows", translate("Rows per RRA") ) ++rrarows.isinteger = true ++rrarows.default = 100 ++rrarows.rmempty = true ++rrarows.optional = true ++rrarows:depends( "enable", 1 ) ++ ++-- collectd_rrdtool.xff (XFF) ++xff = s:option( Value, "XFF", translate("RRD XFiles Factor") ) ++xff.default = 0.1 ++xff.isnumber = true ++xff.rmempty = true ++xff.optional = true ++xff:depends( "enable", 1 ) ++ ++-- collectd_rrdtool.cachetimeout (CacheTimeout) ++cachetimeout = s:option( Value, "CacheTimeout", ++ translate("Cache collected data for"), translate("Seconds") ) ++cachetimeout.isinteger = true ++cachetimeout.default = 100 ++cachetimeout.rmempty = true ++cachetimeout.optional = true ++cachetimeout:depends( "enable", 1 ) ++ ++-- collectd_rrdtool.cacheflush (CacheFlush) ++cacheflush = s:option( Value, "CacheFlush", ++ translate("Flush cache after"), translate("Seconds") ) ++cacheflush.isinteger = true ++cacheflush.default = 100 ++cacheflush.rmempty = true ++cacheflush.optional = true ++cacheflush:depends( "enable", 1 ) ++ ++return m +diff --git a/feeds/luci/applications/luci-app-statistics/luasrc/model/cbi/luci_statistics/splash_leases.lua b/feeds/luci/applications/luci-app-statistics/luasrc/model/cbi/luci_statistics/splash_leases.lua +new file mode 100644 +index 0000000..4ddfacc +--- /dev/null ++++ b/feeds/luci/applications/luci-app-statistics/luasrc/model/cbi/luci_statistics/splash_leases.lua +@@ -0,0 +1,14 @@ ++-- Copyright 2013 Freifunk Augsburg / Michael Wendland ++-- Licensed to the public under the Apache License 2.0. ++ ++m = Map("luci_statistics", ++ translate("Splash Leases Plugin Configuration"), ++ translate("The splash leases plugin uses libuci to collect statistics about splash leases.")) ++ ++s = m:section( NamedSection, "collectd_splash_leases", "luci_statistics" ) ++ ++enable = s:option( Flag, "enable", translate("Enable this plugin") ) ++enable.default = 1 ++ ++return m ++ +diff --git a/feeds/luci/applications/luci-app-statistics/luasrc/model/cbi/luci_statistics/tcpconns.lua b/feeds/luci/applications/luci-app-statistics/luasrc/model/cbi/luci_statistics/tcpconns.lua +new file mode 100644 +index 0000000..3c65018 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-statistics/luasrc/model/cbi/luci_statistics/tcpconns.lua +@@ -0,0 +1,33 @@ ++-- Copyright 2008 Freifunk Leipzig / Jo-Philipp Wich ++-- Licensed to the public under the Apache License 2.0. ++ ++m = Map("luci_statistics", ++ translate("TCPConns Plugin Configuration"), ++ translate( ++ "The tcpconns plugin collects informations about open tcp " .. ++ "connections on selected ports." ++ )) ++ ++-- collectd_tcpconns config section ++s = m:section( NamedSection, "collectd_tcpconns", "luci_statistics" ) ++ ++-- collectd_tcpconns.enable ++enable = s:option( Flag, "enable", translate("Enable this plugin") ) ++enable.default = 0 ++ ++-- collectd_tcpconns.listeningports (ListeningPorts) ++listeningports = s:option( Flag, "ListeningPorts", translate("Monitor all local listen ports") ) ++listeningports.default = 1 ++listeningports:depends( "enable", 1 ) ++ ++-- collectd_tcpconns.localports (LocalPort) ++localports = s:option( Value, "LocalPorts", translate("Monitor local ports") ) ++localports.optional = true ++localports:depends( "enable", 1 ) ++ ++-- collectd_tcpconns.remoteports (RemotePort) ++remoteports = s:option( Value, "RemotePorts", translate("Monitor remote ports") ) ++remoteports.optional = true ++remoteports:depends( "enable", 1 ) ++ ++return m +diff --git a/feeds/luci/applications/luci-app-statistics/luasrc/model/cbi/luci_statistics/unixsock.lua b/feeds/luci/applications/luci-app-statistics/luasrc/model/cbi/luci_statistics/unixsock.lua +new file mode 100644 +index 0000000..be79543 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-statistics/luasrc/model/cbi/luci_statistics/unixsock.lua +@@ -0,0 +1,37 @@ ++-- Copyright 2008 Freifunk Leipzig / Jo-Philipp Wich ++-- Licensed to the public under the Apache License 2.0. ++ ++m = Map("luci_statistics", ++ translate("Unixsock Plugin Configuration"), ++ translate( ++ "The unixsock plugin creates a unix socket which can be used " .. ++ "to read collected data from a running collectd instance." ++ )) ++ ++-- collectd_unixsock config section ++s = m:section( NamedSection, "collectd_unixsock", "luci_statistics" ) ++ ++-- collectd_unixsock.enable ++enable = s:option( Flag, "enable", translate("Enable this plugin") ) ++enable.default = 0 ++ ++-- collectd_unixsock.socketfile (SocketFile) ++socketfile = s:option( Value, "SocketFile" ) ++socketfile.default = "/var/run/collect-query.socket" ++socketfile:depends( "enable", 1 ) ++ ++-- collectd_unixsock.socketgroup (SocketGroup) ++socketgroup = s:option( Value, "SocketGroup" ) ++socketgroup.default = "nobody" ++socketgroup.rmempty = true ++socketgroup.optional = true ++socketgroup:depends( "enable", 1 ) ++ ++-- collectd_unixsock.socketperms (SocketPerms) ++socketperms = s:option( Value, "SocketPerms" ) ++socketperms.default = "0770" ++socketperms.rmempty = true ++socketperms.optional = true ++socketperms:depends( "enable", 1 ) ++ ++return m +diff --git a/feeds/luci/applications/luci-app-statistics/luasrc/model/cbi/luci_statistics/uptime.lua b/feeds/luci/applications/luci-app-statistics/luasrc/model/cbi/luci_statistics/uptime.lua +new file mode 100644 +index 0000000..3a6c464 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-statistics/luasrc/model/cbi/luci_statistics/uptime.lua +@@ -0,0 +1,22 @@ ++--[[ ++ ++Copyright 2013 Thomas Endt ++ ++Licensed under the Apache License, Version 2.0 (the "License"); ++you may not use this file except in compliance with the License. ++You may obtain a copy of the License at ++ ++ http://www.apache.org/licenses/LICENSE-2.0 ++]]-- ++ ++m = Map("luci_statistics", ++ translate("Uptime Plugin Configuration"), ++ translate("The uptime plugin collects statistics about the uptime of the system.")) ++ ++s = m:section( NamedSection, "collectd_uptime", "luci_statistics" ) ++ ++enable = s:option( Flag, "enable", translate("Enable this plugin") ) ++enable.default = 0 ++ ++return m ++ +diff --git a/feeds/luci/applications/luci-app-statistics/luasrc/statistics/datatree.lua b/feeds/luci/applications/luci-app-statistics/luasrc/statistics/datatree.lua +new file mode 100644 +index 0000000..806b054 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-statistics/luasrc/statistics/datatree.lua +@@ -0,0 +1,197 @@ ++-- Copyright 2008 Freifunk Leipzig / Jo-Philipp Wich ++-- Licensed to the public under the Apache License 2.0. ++ ++module("luci.statistics.datatree", package.seeall) ++ ++local util = require("luci.util") ++local sys = require("luci.sys") ++local fs = require("nixio.fs") ++local uci = require("luci.model.uci").cursor() ++local sections = uci:get_all("luci_statistics") ++ ++ ++Instance = util.class() ++ ++function Instance.__init__( self, host ) ++ self._host = host or sections.collectd.Hostname or sys.hostname() ++ self._libdir = sections.collectd.PluginDir or "/usr/lib/collectd" ++ self._rrddir = sections.collectd_rrdtool.DataDir or "/tmp/rrd" ++ ++ self._libdir = self._libdir:gsub("/$","") ++ self._rrddir = self._rrddir:gsub("/$","") ++ self._plugins = { } ++ ++ self:_scan() ++end ++ ++function Instance._mkpath( self, plugin, pinstance ) ++ local dir = self._rrddir .. "/" .. self._host ++ ++ if type(plugin) == "string" and plugin:len() > 0 then ++ dir = dir .. "/" .. plugin ++ ++ if type(pinstance) == "string" and pinstance:len() > 0 then ++ dir = dir .. "-" .. pinstance ++ end ++ end ++ ++ return dir ++end ++ ++function Instance._ls( self, ... ) ++ local ditr = fs.dir(self:_mkpath(...)) ++ if ditr then ++ local dirs = { } ++ while true do ++ local d = ditr() ++ if not d then break end ++ dirs[#dirs+1] = d ++ end ++ return dirs ++ end ++end ++ ++function Instance._notzero( self, table ) ++ for k in pairs(table) do ++ return true ++ end ++ ++ return false ++end ++ ++function Instance._scan( self ) ++ local dirs = self:_ls() ++ if not dirs then ++ return ++ end ++ ++-- for i, plugin in ipairs( dirs ) do ++-- if plugin:match("%w+.so") then ++-- self._plugins[ plugin:gsub("%.so$", "") ] = { } ++-- end ++-- end ++ ++ for _, dir in ipairs(dirs) do ++ if dir ~= "." and dir ~= ".." and ++ fs.stat(self:_mkpath(dir)).type == "dir" ++ then ++ local plugin = dir:gsub("%-.+$", "") ++ if not self._plugins[plugin] then ++ self._plugins[plugin] = { } ++ end ++ end ++ end ++ ++ for plugin, instances in pairs( self._plugins ) do ++ ++ local dirs = self:_ls() ++ ++ if type(dirs) == "table" then ++ for i, dir in ipairs(dirs) do ++ if dir:find( plugin .. "%-" ) or dir == plugin then ++ local instance = "" ++ ++ if dir ~= plugin then ++ instance = dir:gsub( plugin .. "%-", "", 1 ) ++ end ++ ++ instances[instance] = { } ++ end ++ end ++ end ++ ++ for instance, data_instances in pairs( instances ) do ++ ++ dirs = self:_ls(plugin, instance) ++ ++ if type(dirs) == "table" then ++ for i, file in ipairs(dirs) do ++ if file:find("%.rrd") then ++ file = file:gsub("%.rrd","") ++ ++ local data_type ++ local data_instance ++ ++ if file:find("%-") then ++ data_type = file:gsub( "%-.+","" ) ++ data_instance = file:gsub( "[^%-]-%-", "", 1 ) ++ else ++ data_type = file ++ data_instance = "" ++ end ++ ++ if not data_instances[data_type] then ++ data_instances[data_type] = { data_instance } ++ else ++ table.insert( data_instances[data_type], data_instance ) ++ end ++ end ++ end ++ end ++ end ++ end ++end ++ ++ ++function Instance.plugins( self ) ++ local rv = { } ++ ++ for plugin, val in pairs( self._plugins ) do ++ if self:_notzero( val ) then ++ table.insert( rv, plugin ) ++ end ++ end ++ ++ return rv ++end ++ ++function Instance.plugin_instances( self, plugin ) ++ local rv = { } ++ ++ for instance, val in pairs( self._plugins[plugin] ) do ++ table.insert( rv, instance ) ++ end ++ ++ return rv ++end ++ ++function Instance.data_types( self, plugin, instance ) ++ local rv = { } ++ local p = self._plugins[plugin] ++ ++ if type(p) == "table" and type(p[instance]) == "table" then ++ for type, val in pairs(p[instance]) do ++ table.insert( rv, type ) ++ end ++ end ++ ++ return rv ++end ++ ++function Instance.data_instances( self, plugin, instance, dtype ) ++ local rv = { } ++ local p = self._plugins[plugin] ++ ++ if type(p) == "table" and type(p[instance]) == "table" and type(p[instance][dtype]) == "table" then ++ for i, instance in ipairs(p[instance][dtype]) do ++ table.insert( rv, instance ) ++ end ++ end ++ ++ return rv ++end ++ ++function Instance.host_instances( self ) ++ local hosts_path = fs.glob(self._rrddir..'/*') ++ local hosts = { } ++ ++ if hosts_path then ++ local path ++ for path in hosts_path do ++ hosts[#hosts+1] = fs.basename(path) ++ end ++ end ++ ++ return hosts ++end ++ +diff --git a/feeds/luci/applications/luci-app-statistics/luasrc/statistics/i18n.lua b/feeds/luci/applications/luci-app-statistics/luasrc/statistics/i18n.lua +new file mode 100644 +index 0000000..5a2800d +--- /dev/null ++++ b/feeds/luci/applications/luci-app-statistics/luasrc/statistics/i18n.lua +@@ -0,0 +1,96 @@ ++-- Copyright 2008 Freifunk Leipzig / Jo-Philipp Wich ++-- Licensed to the public under the Apache License 2.0. ++ ++module("luci.statistics.i18n", package.seeall) ++ ++require("luci.util") ++require("luci.i18n") ++ ++ ++Instance = luci.util.class() ++ ++ ++function Instance.__init__( self, graph ) ++ self.i18n = luci.i18n ++ self.graph = graph ++end ++ ++function Instance._subst( self, str, val ) ++ str = str:gsub( "%%H", self.graph.opts.host or "" ) ++ str = str:gsub( "%%pn", val.plugin or "" ) ++ str = str:gsub( "%%pi", val.pinst or "" ) ++ str = str:gsub( "%%dt", val.dtype or "" ) ++ str = str:gsub( "%%di", val.dinst or "" ) ++ str = str:gsub( "%%ds", val.dsrc or "" ) ++ ++ return str ++end ++ ++function Instance._translate( self, key, alt ) ++ local val = self.i18n.string(key) ++ if val ~= key then ++ return val ++ else ++ return alt ++ end ++end ++ ++function Instance.title( self, plugin, pinst, dtype, dinst, user_title ) ++ ++ local title = user_title or ++ "p=%s/pi=%s/dt=%s/di=%s" % { ++ plugin, ++ (pinst and #pinst > 0) and pinst or "(nil)", ++ (dtype and #dtype > 0) and dtype or "(nil)", ++ (dinst and #dinst > 0) and dinst or "(nil)" ++ } ++ ++ return self:_subst( title, { ++ plugin = plugin, ++ pinst = pinst, ++ dtype = dtype, ++ dinst = dinst ++ } ) ++ ++end ++ ++function Instance.label( self, plugin, pinst, dtype, dinst, user_label ) ++ ++ local label = user_label or ++ "dt=%s/di=%s" % { ++ (dtype and #dtype > 0) and dtype or "(nil)", ++ (dinst and #dinst > 0) and dinst or "(nil)" ++ } ++ ++ return self:_subst( label, { ++ plugin = plugin, ++ pinst = pinst, ++ dtype = dtype, ++ dinst = dinst ++ } ) ++ ++end ++ ++function Instance.ds( self, source ) ++ ++ local label = source.title or self:_translate( ++ string.format( "stat_ds_%s_%s_%s", source.type, source.instance, source.ds ), ++ self:_translate( ++ string.format( "stat_ds_%s_%s", source.type, source.instance ), ++ self:_translate( ++ string.format( "stat_ds_label_%s__%s", source.type, source.ds ), ++ self:_translate( ++ string.format( "stat_ds_%s", source.type ), ++ source.type .. "_" .. source.instance:gsub("[^%w]","_") .. "_" .. source.ds ++ ) ++ ) ++ ) ++ ) ++ ++ return self:_subst( label, { ++ dtype = source.type, ++ dinst = source.instance, ++ dsrc = source.ds ++ } ) ++ ++end +diff --git a/feeds/luci/applications/luci-app-statistics/luasrc/statistics/rrdtool.lua b/feeds/luci/applications/luci-app-statistics/luasrc/statistics/rrdtool.lua +new file mode 100644 +index 0000000..d8317a8 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-statistics/luasrc/statistics/rrdtool.lua +@@ -0,0 +1,555 @@ ++-- Copyright 2008 Freifunk Leipzig / Jo-Philipp Wich ++-- Licensed to the public under the Apache License 2.0. ++ ++module("luci.statistics.rrdtool", package.seeall) ++ ++require("luci.statistics.datatree") ++require("luci.statistics.rrdtool.colors") ++require("luci.statistics.i18n") ++require("luci.model.uci") ++require("luci.util") ++require("luci.sys") ++ ++local fs = require "nixio.fs" ++ ++ ++Graph = luci.util.class() ++ ++function Graph.__init__( self, timespan, opts ) ++ ++ opts = opts or { } ++ ++ local uci = luci.model.uci.cursor() ++ local sections = uci:get_all( "luci_statistics" ) ++ ++ -- options ++ opts.timespan = timespan or sections.rrdtool.default_timespan or 900 ++ opts.rrasingle = opts.rrasingle or ( sections.collectd_rrdtool.RRASingle == "1" ) ++ opts.host = opts.host or sections.collectd.Hostname or luci.sys.hostname() ++ opts.width = opts.width or sections.rrdtool.image_width or 400 ++ opts.rrdpath = opts.rrdpath or sections.collectd_rrdtool.DataDir or "/tmp/rrd" ++ opts.imgpath = opts.imgpath or sections.rrdtool.image_path or "/tmp/rrdimg" ++ opts.rrdpath = opts.rrdpath:gsub("/$","") ++ opts.imgpath = opts.imgpath:gsub("/$","") ++ ++ -- helper classes ++ self.colors = luci.statistics.rrdtool.colors.Instance() ++ self.tree = luci.statistics.datatree.Instance(opts.host) ++ self.i18n = luci.statistics.i18n.Instance( self ) ++ ++ -- rrdtool default args ++ self.args = { ++ "-a", "PNG", ++ "-s", "NOW-" .. opts.timespan, ++ "-w", opts.width ++ } ++ ++ -- store options ++ self.opts = opts ++end ++ ++function Graph._mkpath( self, plugin, plugin_instance, dtype, dtype_instance ) ++ local t = self.opts.host .. "/" .. plugin ++ if type(plugin_instance) == "string" and plugin_instance:len() > 0 then ++ t = t .. "-" .. plugin_instance ++ end ++ t = t .. "/" .. dtype ++ if type(dtype_instance) == "string" and dtype_instance:len() > 0 then ++ t = t .. "-" .. dtype_instance ++ end ++ return t ++end ++ ++function Graph.mkrrdpath( self, ... ) ++ return string.format( "%s/%s.rrd", self.opts.rrdpath, self:_mkpath( ... ) ) ++end ++ ++function Graph.mkpngpath( self, ... ) ++ return string.format( "%s/%s.%i.png", self.opts.imgpath, self:_mkpath( ... ), self.opts.timespan ) ++end ++ ++function Graph.strippngpath( self, path ) ++ return path:sub( self.opts.imgpath:len() + 2 ) ++end ++ ++function Graph._forcelol( self, list ) ++ if type(list[1]) ~= "table" then ++ return( { list } ) ++ end ++ return( list ) ++end ++ ++function Graph._rrdtool( self, def, rrd ) ++ ++ -- prepare directory ++ local dir = def[1]:gsub("/[^/]+$","") ++ fs.mkdirr( dir ) ++ ++ -- construct commandline ++ local cmdline = "rrdtool graph" ++ ++ -- copy default arguments to def stack ++ for i, opt in ipairs(self.args) do ++ table.insert( def, 1 + i, opt ) ++ end ++ ++ -- construct commandline from def stack ++ for i, opt in ipairs(def) do ++ opt = opt .. "" -- force string ++ ++ if rrd then ++ opt = opt:gsub( "{file}", rrd ) ++ end ++ ++ if opt:match("[^%w]") then ++ cmdline = cmdline .. " '" .. opt .. "'" ++ else ++ cmdline = cmdline .. " " .. opt ++ end ++ end ++ ++ -- execute rrdtool ++ local rrdtool = io.popen( cmdline ) ++ rrdtool:close() ++end ++ ++function Graph._generic( self, opts, plugin, plugin_instance, dtype, index ) ++ ++ -- generated graph defs ++ local defs = { } ++ ++ -- internal state variables ++ local _args = { } ++ local _sources = { } ++ local _stack_neg = { } ++ local _stack_pos = { } ++ local _longest_name = 0 ++ local _has_totals = false ++ ++ -- some convenient aliases ++ local _ti = table.insert ++ local _sf = string.format ++ ++ -- local helper: append a string.format() formatted string to given table ++ function _tif( list, fmt, ... ) ++ table.insert( list, string.format( fmt, ... ) ) ++ end ++ ++ -- local helper: create definitions for min, max, avg and create *_nnl (not null) variable from avg ++ function __def(source) ++ ++ local inst = source.sname ++ local rrd = source.rrd ++ local ds = source.ds ++ ++ if not ds or ds:len() == 0 then ds = "value" end ++ ++ _tif( _args, "DEF:%s_avg_raw=%s:%s:AVERAGE", inst, rrd, ds ) ++ _tif( _args, "CDEF:%s_avg=%s_avg_raw,%s", inst, inst, source.transform_rpn ) ++ ++ if not self.opts.rrasingle then ++ _tif( _args, "DEF:%s_min_raw=%s:%s:MIN", inst, rrd, ds ) ++ _tif( _args, "CDEF:%s_min=%s_min_raw,%s", inst, inst, source.transform_rpn ) ++ _tif( _args, "DEF:%s_max_raw=%s:%s:MAX", inst, rrd, ds ) ++ _tif( _args, "CDEF:%s_max=%s_max_raw,%s", inst, inst, source.transform_rpn ) ++ end ++ ++ _tif( _args, "CDEF:%s_nnl=%s_avg,UN,0,%s_avg,IF", inst, inst, inst ) ++ end ++ ++ -- local helper: create cdefs depending on source options like flip and overlay ++ function __cdef(source) ++ ++ local prev ++ ++ -- find previous source, choose stack depending on flip state ++ if source.flip then ++ prev = _stack_neg[#_stack_neg] ++ else ++ prev = _stack_pos[#_stack_pos] ++ end ++ ++ -- is first source in stack or overlay source: source_stk = source_nnl ++ if not prev or source.overlay then ++ -- create cdef statement for cumulative stack (no NaNs) and also ++ -- for display (preserving NaN where no points should be displayed) ++ _tif( _args, "CDEF:%s_stk=%s_nnl", source.sname, source.sname ) ++ _tif( _args, "CDEF:%s_plot=%s_avg", source.sname, source.sname ) ++ ++ -- is subsequent source without overlay: source_stk = source_nnl + previous_stk ++ else ++ -- create cdef statement ++ _tif( _args, "CDEF:%s_stk=%s_nnl,%s_stk,+", source.sname, source.sname, prev ) ++ _tif( _args, "CDEF:%s_plot=%s_avg,%s_stk,+", source.sname, source.sname, prev ) ++ end ++ ++ -- create multiply by minus one cdef if flip is enabled ++ if source.flip then ++ ++ -- create cdef statement: source_stk = source_stk * -1 ++ _tif( _args, "CDEF:%s_neg=%s_plot,-1,*", source.sname, source.sname ) ++ ++ -- push to negative stack if overlay is disabled ++ if not source.overlay then ++ _ti( _stack_neg, source.sname ) ++ end ++ ++ -- no flipping, push to positive stack if overlay is disabled ++ elseif not source.overlay then ++ ++ -- push to positive stack ++ _ti( _stack_pos, source.sname ) ++ end ++ ++ -- calculate total amount of data if requested ++ if source.total then ++ _tif( _args, ++ "CDEF:%s_avg_sample=%s_avg,UN,0,%s_avg,IF,sample_len,*", ++ source.sname, source.sname, source.sname ++ ) ++ ++ _tif( _args, ++ "CDEF:%s_avg_sum=PREV,UN,0,PREV,IF,%s_avg_sample,+", ++ source.sname, source.sname, source.sname ++ ) ++ end ++ end ++ ++ -- local helper: create cdefs required for calculating total values ++ function __cdef_totals() ++ if _has_totals then ++ _tif( _args, "CDEF:mytime=%s_avg,TIME,TIME,IF", _sources[1].sname ) ++ _ti( _args, "CDEF:sample_len_raw=mytime,PREV(mytime),-" ) ++ _ti( _args, "CDEF:sample_len=sample_len_raw,UN,0,sample_len_raw,IF" ) ++ end ++ end ++ ++ -- local helper: create line and area statements ++ function __line(source) ++ ++ local line_color ++ local area_color ++ local legend ++ local var ++ ++ -- find colors: try source, then opts.colors; fall back to random color ++ if type(source.color) == "string" then ++ line_color = source.color ++ area_color = self.colors:from_string( line_color ) ++ elseif type(opts.colors[source.name:gsub("[^%w]","_")]) == "string" then ++ line_color = opts.colors[source.name:gsub("[^%w]","_")] ++ area_color = self.colors:from_string( line_color ) ++ else ++ area_color = self.colors:random() ++ line_color = self.colors:to_string( area_color ) ++ end ++ ++ -- derive area background color from line color ++ area_color = self.colors:to_string( self.colors:faded( area_color ) ) ++ ++ -- choose source_plot or source_neg variable depending on flip state ++ if source.flip then ++ var = "neg" ++ else ++ var = "plot" ++ end ++ ++ -- create legend ++ legend = _sf( "%-" .. _longest_name .. "s", source.title ) ++ ++ -- create area if not disabled ++ if not source.noarea then ++ _tif( _args, "AREA:%s_%s#%s", source.sname, var, area_color ) ++ end ++ ++ -- create line1 statement ++ _tif( _args, "LINE%d:%s_%s#%s:%s", ++ source.noarea and 2 or 1, ++ source.sname, var, line_color, legend ) ++ end ++ ++ -- local helper: create gprint statements ++ function __gprint(source) ++ ++ local numfmt = opts.number_format or "%6.1lf" ++ local totfmt = opts.totals_format or "%5.1lf%s" ++ ++ -- don't include MIN if rrasingle is enabled ++ if not self.opts.rrasingle then ++ _tif( _args, "GPRINT:%s_min:MIN:\tMin\\: %s", source.sname, numfmt ) ++ end ++ ++ -- always include AVERAGE ++ _tif( _args, "GPRINT:%s_avg:AVERAGE:\tAvg\\: %s", source.sname, numfmt ) ++ ++ -- don't include MAX if rrasingle is enabled ++ if not self.opts.rrasingle then ++ _tif( _args, "GPRINT:%s_max:MAX:\tMax\\: %s", source.sname, numfmt ) ++ end ++ ++ -- include total count if requested else include LAST ++ if source.total then ++ _tif( _args, "GPRINT:%s_avg_sum:LAST:(ca. %s Total)\\l", source.sname, totfmt ) ++ else ++ _tif( _args, "GPRINT:%s_avg:LAST:\tLast\\: %s\\l", source.sname, numfmt ) ++ end ++ end ++ ++ ++ -- ++ -- find all data sources ++ -- ++ ++ -- find data types ++ local data_types ++ ++ if dtype then ++ data_types = { dtype } ++ else ++ data_types = opts.data.types or { } ++ end ++ ++ if not ( dtype or opts.data.types ) then ++ if opts.data.instances then ++ for k, v in pairs(opts.data.instances) do ++ _ti( data_types, k ) ++ end ++ elseif opts.data.sources then ++ for k, v in pairs(opts.data.sources) do ++ _ti( data_types, k ) ++ end ++ end ++ end ++ ++ ++ -- iterate over data types ++ for i, dtype in ipairs(data_types) do ++ ++ -- find instances ++ ++ local data_instances ++ ++ if not opts.per_instance then ++ if type(opts.data.instances) == "table" and type(opts.data.instances[dtype]) == "table" then ++ data_instances = opts.data.instances[dtype] ++ else ++ data_instances = self.tree:data_instances( plugin, plugin_instance, dtype ) ++ end ++ end ++ ++ if type(data_instances) ~= "table" or #data_instances == 0 then data_instances = { "" } end ++ ++ ++ -- iterate over data instances ++ for i, dinst in ipairs(data_instances) do ++ ++ -- construct combined data type / instance name ++ local dname = dtype ++ ++ if dinst:len() > 0 then ++ dname = dname .. "_" .. dinst ++ end ++ ++ ++ -- find sources ++ local data_sources = { "value" } ++ ++ if type(opts.data.sources) == "table" then ++ if type(opts.data.sources[dname]) == "table" then ++ data_sources = opts.data.sources[dname] ++ elseif type(opts.data.sources[dtype]) == "table" then ++ data_sources = opts.data.sources[dtype] ++ end ++ end ++ ++ ++ -- iterate over data sources ++ for i, dsource in ipairs(data_sources) do ++ ++ local dsname = dtype .. "_" .. dinst:gsub("[^%w]","_") .. "_" .. dsource ++ local altname = dtype .. "__" .. dsource ++ ++ --assert(dtype ~= "ping", dsname .. " or " .. altname) ++ ++ -- find datasource options ++ local dopts = { } ++ ++ if type(opts.data.options) == "table" then ++ if type(opts.data.options[dsname]) == "table" then ++ dopts = opts.data.options[dsname] ++ elseif type(opts.data.options[altname]) == "table" then ++ dopts = opts.data.options[altname] ++ elseif type(opts.data.options[dname]) == "table" then ++ dopts = opts.data.options[dname] ++ elseif type(opts.data.options[dtype]) == "table" then ++ dopts = opts.data.options[dtype] ++ end ++ end ++ ++ ++ -- store values ++ _ti( _sources, { ++ rrd = dopts.rrd or self:mkrrdpath( plugin, plugin_instance, dtype, dinst ), ++ color = dopts.color or self.colors:to_string( self.colors:random() ), ++ flip = dopts.flip or false, ++ total = dopts.total or false, ++ overlay = dopts.overlay or false, ++ transform_rpn = dopts.transform_rpn or "0,+", ++ noarea = dopts.noarea or false, ++ title = dopts.title or nil, ++ ds = dsource, ++ type = dtype, ++ instance = dinst, ++ index = #_sources + 1, ++ sname = ( #_sources + 1 ) .. dtype ++ } ) ++ ++ ++ -- generate datasource title ++ _sources[#_sources].title = self.i18n:ds( _sources[#_sources] ) ++ ++ ++ -- find longest name ... ++ if _sources[#_sources].title:len() > _longest_name then ++ _longest_name = _sources[#_sources].title:len() ++ end ++ ++ ++ -- has totals? ++ if _sources[#_sources].total then ++ _has_totals = true ++ end ++ end ++ end ++ end ++ ++ ++ -- ++ -- construct diagrams ++ -- ++ ++ -- if per_instance is enabled then find all instances from the first datasource in diagram ++ -- if per_instance is disabled then use an empty pseudo instance and use model provided values ++ local instances = { "" } ++ ++ if opts.per_instance then ++ instances = self.tree:data_instances( plugin, plugin_instance, _sources[1].type ) ++ end ++ ++ ++ -- iterate over instances ++ for i, instance in ipairs(instances) do ++ ++ -- store title and vlabel ++ _ti( _args, "-t" ) ++ _ti( _args, self.i18n:title( plugin, plugin_instance, _sources[1].type, instance, opts.title ) ) ++ _ti( _args, "-v" ) ++ _ti( _args, self.i18n:label( plugin, plugin_instance, _sources[1].type, instance, opts.vlabel ) ) ++ if opts.y_max then ++ _ti ( _args, "-u" ) ++ _ti ( _args, opts.y_max ) ++ end ++ if opts.y_min then ++ _ti ( _args, "-l" ) ++ _ti ( _args, opts.y_min ) ++ end ++ if opts.units_exponent then ++ _ti ( _args, "-X" ) ++ _ti ( _args, opts.units_exponent ) ++ end ++ if opts.alt_autoscale then ++ _ti ( _args, "-A" ) ++ end ++ if opts.alt_autoscale_max then ++ _ti ( _args, "-M" ) ++ end ++ ++ -- store additional rrd options ++ if opts.rrdopts then ++ for i, o in ipairs(opts.rrdopts) do _ti( _args, o ) end ++ end ++ ++ ++ -- create DEF statements for each instance ++ for i, source in ipairs(_sources) do ++ -- fixup properties for per instance mode... ++ if opts.per_instance then ++ source.instance = instance ++ source.rrd = self:mkrrdpath( plugin, plugin_instance, source.type, instance ) ++ end ++ ++ __def( source ) ++ end ++ ++ -- create CDEF required for calculating totals ++ __cdef_totals() ++ ++ -- create CDEF statements for each instance in reversed order ++ for i, source in ipairs(_sources) do ++ __cdef( _sources[1 + #_sources - i] ) ++ end ++ ++ -- create LINE1, AREA and GPRINT statements for each instance ++ for i, source in ipairs(_sources) do ++ __line( source ) ++ __gprint( source ) ++ end ++ ++ -- prepend image path to arg stack ++ _ti( _args, 1, self:mkpngpath( plugin, plugin_instance, index .. instance ) ) ++ ++ -- push arg stack to definition list ++ _ti( defs, _args ) ++ ++ -- reset stacks ++ _args = { } ++ _stack_pos = { } ++ _stack_neg = { } ++ end ++ ++ return defs ++end ++ ++function Graph.render( self, plugin, plugin_instance, is_index ) ++ ++ dtype_instances = dtype_instances or { "" } ++ local pngs = { } ++ ++ -- check for a whole graph handler ++ local plugin_def = "luci.statistics.rrdtool.definitions." .. plugin ++ local stat, def = pcall( require, plugin_def ) ++ ++ if stat and def and type(def.rrdargs) == "function" then ++ ++ -- temporary image matrix ++ local _images = { } ++ ++ -- get diagram definitions ++ for i, opts in ipairs( self:_forcelol( def.rrdargs( self, plugin, plugin_instance, nil, is_index ) ) ) do ++ if not is_index or not opts.detail then ++ _images[i] = { } ++ ++ -- get diagram definition instances ++ local diagrams = self:_generic( opts, plugin, plugin_instance, nil, i ) ++ ++ -- render all diagrams ++ for j, def in ipairs( diagrams ) do ++ -- remember image ++ _images[i][j] = def[1] ++ ++ -- exec ++ self:_rrdtool( def ) ++ end ++ end ++ end ++ ++ -- remember images - XXX: fixme (will cause probs with asymmetric data) ++ for y = 1, #_images[1] do ++ for x = 1, #_images do ++ table.insert( pngs, _images[x][y] ) ++ end ++ end ++ end ++ ++ return pngs ++end +diff --git a/feeds/luci/applications/luci-app-statistics/luasrc/statistics/rrdtool/colors.lua b/feeds/luci/applications/luci-app-statistics/luasrc/statistics/rrdtool/colors.lua +new file mode 100644 +index 0000000..5b35dff +--- /dev/null ++++ b/feeds/luci/applications/luci-app-statistics/luasrc/statistics/rrdtool/colors.lua +@@ -0,0 +1,61 @@ ++-- Copyright 2008 Freifunk Leipzig / Jo-Philipp Wich ++-- Licensed to the public under the Apache License 2.0. ++ ++module("luci.statistics.rrdtool.colors", package.seeall) ++ ++require("luci.util") ++ ++ ++Instance = luci.util.class() ++ ++function Instance.from_string( self, s ) ++ return { ++ tonumber(s:sub(1,2), 16), ++ tonumber(s:sub(3,4), 16), ++ tonumber(s:sub(5,6), 16) ++ } ++end ++ ++function Instance.to_string( self, c ) ++ return string.format( ++ "%02x%02x%02x", ++ math.floor(c[1]), ++ math.floor(c[2]), ++ math.floor(c[3]) ++ ) ++end ++ ++function Instance.random( self ) ++ local r = math.random(255) ++ local g = math.random(255) ++ local min = 0 ++ local max = 255 ++ ++ if ( r + g ) < 255 then ++ min = 255 - r - g ++ else ++ max = 511 - r - g ++ end ++ ++ local b = min + math.floor( math.random() * ( max - min ) ) ++ ++ return { r, g, b } ++end ++ ++function Instance.faded( self, fg, opts ) ++ opts = opts or {} ++ opts.background = opts.background or { 255, 255, 255 } ++ opts.alpha = opts.alpha or 0.25 ++ ++ if type(opts.background) == "string" then ++ opts.background = _string_to_color(opts.background) ++ end ++ ++ local bg = opts.background ++ ++ return { ++ ( opts.alpha * fg[1] ) + ( ( 1.0 - opts.alpha ) * bg[1] ), ++ ( opts.alpha * fg[2] ) + ( ( 1.0 - opts.alpha ) * bg[2] ), ++ ( opts.alpha * fg[3] ) + ( ( 1.0 - opts.alpha ) * bg[3] ) ++ } ++end +diff --git a/feeds/luci/applications/luci-app-statistics/luasrc/statistics/rrdtool/definitions/conntrack.lua b/feeds/luci/applications/luci-app-statistics/luasrc/statistics/rrdtool/definitions/conntrack.lua +new file mode 100644 +index 0000000..fbc4773 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-statistics/luasrc/statistics/rrdtool/definitions/conntrack.lua +@@ -0,0 +1,27 @@ ++-- Copyright 2011 Jo-Philipp Wich ++-- Licensed to the public under the Apache License 2.0. ++ ++module("luci.statistics.rrdtool.definitions.conntrack",package.seeall) ++ ++function rrdargs( graph, plugin, plugin_instance, dtype ) ++ return { ++ title = "%H: Conntrack entries", ++ vlabel = "Count", ++ number_format = "%5.0lf", ++ data = { ++ -- collectd 5.5+: specify "" to exclude "max" instance ++ instances = { ++ conntrack = { "" } ++ }, ++ sources = { ++ conntrack = { "value" } ++ }, ++ options = { ++ conntrack = { ++ color = "0000ff", ++ title = "Tracked connections" ++ } ++ } ++ } ++ } ++end +diff --git a/feeds/luci/applications/luci-app-statistics/luasrc/statistics/rrdtool/definitions/cpu.lua b/feeds/luci/applications/luci-app-statistics/luasrc/statistics/rrdtool/definitions/cpu.lua +new file mode 100644 +index 0000000..ae0c0ce +--- /dev/null ++++ b/feeds/luci/applications/luci-app-statistics/luasrc/statistics/rrdtool/definitions/cpu.lua +@@ -0,0 +1,31 @@ ++-- Copyright 2008 Freifunk Leipzig / Jo-Philipp Wich ++-- Licensed to the public under the Apache License 2.0. ++ ++module("luci.statistics.rrdtool.definitions.cpu",package.seeall) ++ ++function rrdargs( graph, plugin, plugin_instance, dtype ) ++ ++ return { ++ title = "%H: Processor usage on core #%pi", ++ y_min = "0", ++ alt_autoscale_max = true, ++ vlabel = "Percent", ++ number_format = "%5.1lf%%", ++ data = { ++ instances = { ++ cpu = { "user", "nice", "system", "softirq", "interrupt" } ++ }, ++ ++ options = { ++ cpu_idle = { color = "ffffff", title = "Idle" }, ++ cpu_nice = { color = "00e000", title = "Nice" }, ++ cpu_user = { color = "0000ff", title = "User" }, ++ cpu_wait = { color = "ffb000", title = "Wait" }, ++ cpu_system = { color = "ff0000", title = "System" }, ++ cpu_softirq = { color = "ff00ff", title = "Softirq" }, ++ cpu_interrupt = { color = "a000a0", title = "Interrupt" }, ++ cpu_steal = { color = "000000", title = "Steal" } ++ } ++ } ++ } ++end +diff --git a/feeds/luci/applications/luci-app-statistics/luasrc/statistics/rrdtool/definitions/df.lua b/feeds/luci/applications/luci-app-statistics/luasrc/statistics/rrdtool/definitions/df.lua +new file mode 100644 +index 0000000..78c9ef5 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-statistics/luasrc/statistics/rrdtool/definitions/df.lua +@@ -0,0 +1,34 @@ ++-- Copyright 2008 Freifunk Leipzig / Jo-Philipp Wich ++-- Licensed to the public under the Apache License 2.0. ++ ++module("luci.statistics.rrdtool.definitions.df", package.seeall) ++ ++function rrdargs( graph, plugin, plugin_instance, dtype ) ++ ++ return { ++ title = "%H: Disk space usage on %di", ++ vlabel = "Bytes", ++ per_instance = true, ++ number_format = "%5.1lf%sB", ++ ++ data = { ++ sources = { ++ df = { "free", "used" } ++ }, ++ ++ options = { ++ df__free = { ++ color = "00ff00", ++ overlay = false, ++ title = "free" ++ }, ++ ++ df__used = { ++ color = "ff0000", ++ overlay = false, ++ title = "used" ++ } ++ } ++ } ++ } ++end +diff --git a/feeds/luci/applications/luci-app-statistics/luasrc/statistics/rrdtool/definitions/disk.lua b/feeds/luci/applications/luci-app-statistics/luasrc/statistics/rrdtool/definitions/disk.lua +new file mode 100644 +index 0000000..8aabb7f +--- /dev/null ++++ b/feeds/luci/applications/luci-app-statistics/luasrc/statistics/rrdtool/definitions/disk.lua +@@ -0,0 +1,62 @@ ++-- Copyright 2008 Freifunk Leipzig / Jo-Philipp Wich ++-- Licensed to the public under the Apache License 2.0. ++ ++module("luci.statistics.rrdtool.definitions.disk", package.seeall) ++ ++function rrdargs( graph, plugin, plugin_instance, dtype ) ++ return { ++ { ++ title = "%H: Disk I/O operations on %pi", ++ vlabel = "Operations/s", ++ number_format = "%5.1lf%sOp/s", ++ ++ data = { ++ types = { "disk_ops" }, ++ sources = { ++ disk_ops = { "read", "write" }, ++ }, ++ ++ options = { ++ disk_ops__read = { ++ title = "Reads", ++ color = "00ff00", ++ flip = false ++ }, ++ ++ disk_ops__write = { ++ title = "Writes", ++ color = "ff0000", ++ flip = true ++ } ++ } ++ } ++ }, ++ ++ { ++ title = "%H: Disk I/O bandwidth on %pi", ++ vlabel = "Bytes/s", ++ number_format = "%5.1lf%sB/s", ++ ++ detail = true, ++ ++ data = { ++ types = { "disk_octets" }, ++ sources = { ++ disk_octets = { "read", "write" } ++ }, ++ options = { ++ disk_octets__read = { ++ title = "Read", ++ color = "00ff00", ++ flip = false ++ }, ++ disk_octets__write = { ++ title = "Write", ++ color = "ff0000", ++ flip = true ++ } ++ } ++ } ++ } ++ } ++end +diff --git a/feeds/luci/applications/luci-app-statistics/luasrc/statistics/rrdtool/definitions/dns.lua b/feeds/luci/applications/luci-app-statistics/luasrc/statistics/rrdtool/definitions/dns.lua +new file mode 100644 +index 0000000..cf96d8f +--- /dev/null ++++ b/feeds/luci/applications/luci-app-statistics/luasrc/statistics/rrdtool/definitions/dns.lua +@@ -0,0 +1,71 @@ ++-- Copyright 2011 Manuel Munz ++-- Licensed to the public under the Apache License 2.0. ++ ++module("luci.statistics.rrdtool.definitions.dns", package.seeall) ++ ++function rrdargs( graph, plugin, plugin_instance ) ++ ++ local traffic = { ++ title = "%H: DNS traffic", vlabel = "Bit/s", ++ ++ data = { ++ sources = { ++ dns_octets = { "queries", "responses" } ++ }, ++ ++ options = { ++ dns_octets__responses = { ++ total = true, ++ color = "00ff00", ++ title = "Responses" ++ }, ++ ++ dns_octets__queries = { ++ total = true, ++ color = "0000ff", ++ title = "Queries" ++ } ++ } ++ } ++ } ++ ++ local opcode_query = { ++ title = "%H: DNS Opcode Query", vlabel = "Queries/s", ++ data = { ++ instances = { dns_opcode = { "Query" } }, ++ options = { ++ dns_opcode_Query_value = { ++ total = true, ++ color = "0000ff", ++ title = "Queries/s" ++ }, ++ } ++ } ++ } ++ ++ local qtype = { ++ title = "%H: DNS QType", vlabel = "Queries/s", ++ data = { ++ sources = { dns_qtype = { "" } }, ++ options = { ++ dns_qtype_AAAA_ = { title = "AAAA", noarea = true, total = true }, ++ dns_qtype_A_ = { title = "A", noarea = true, total = true }, ++ dns_qtype_A6_ = { title = "A6", noarea = true, total = true }, ++ dns_qtype_TXT_ = { title = "TXT", noarea = true, total = true }, ++ dns_qtype_MX_ = { title = "MX", noarea = true, total = true }, ++ dns_qtype_NS_ = { title = "NS", noarea = true, total = true }, ++ dns_qtype_ANY_ = { title = "ANY", noarea = true, total = true }, ++ dns_qtype_CNAME_= { title = "CNAME", noarea = true, total = true }, ++ dns_qtype_SOA_ = { title = "SOA", noarea = true, total = true }, ++ dns_qtype_SRV_ = { title = "SRV", noarea = true, total = true }, ++ dns_qtype_PTR_ = { title = "PTR", noarea = true, total = true }, ++ dns_qtype_RP_ = { title = "RP", noarea = true, total = true }, ++ dns_qtype_MAILB_= { title = "MAILB", noarea = true, total = true }, ++ dns_qtype_IXFR_ = { title = "IXFR", noarea = true, total = true }, ++ dns_qtype_HINFO_= { title = "HINFO", noarea = true, total = true }, ++ }, ++ } ++ } ++ ++ return { traffic, opcode_query, qtype } ++end +diff --git a/feeds/luci/applications/luci-app-statistics/luasrc/statistics/rrdtool/definitions/entropy.lua b/feeds/luci/applications/luci-app-statistics/luasrc/statistics/rrdtool/definitions/entropy.lua +new file mode 100644 +index 0000000..3d30a70 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-statistics/luasrc/statistics/rrdtool/definitions/entropy.lua +@@ -0,0 +1,19 @@ ++-- Copyright 2015 Hannu Nyman ++-- Licensed to the public under the Apache License 2.0. ++ ++module("luci.statistics.rrdtool.definitions.entropy", package.seeall) ++ ++function rrdargs( graph, plugin, plugin_instance, dtype ) ++ ++ return { ++ title = "%H: Available entropy", ++ vlabel = "bits", ++ number_format = "%4.0lf", ++ data = { ++ types = { "entropy" }, ++ options = { entropy = { title = "Entropy %di" } } ++ } ++ } ++ ++end ++ +diff --git a/feeds/luci/applications/luci-app-statistics/luasrc/statistics/rrdtool/definitions/interface.lua b/feeds/luci/applications/luci-app-statistics/luasrc/statistics/rrdtool/definitions/interface.lua +new file mode 100644 +index 0000000..efa631d +--- /dev/null ++++ b/feeds/luci/applications/luci-app-statistics/luasrc/statistics/rrdtool/definitions/interface.lua +@@ -0,0 +1,105 @@ ++-- Copyright 2008 Freifunk Leipzig / Jo-Philipp Wich ++-- Licensed to the public under the Apache License 2.0. ++ ++module("luci.statistics.rrdtool.definitions.interface", package.seeall) ++ ++function rrdargs( graph, plugin, plugin_instance ) ++ ++ -- ++ -- traffic diagram ++ -- ++ local traffic = { ++ ++ -- draw this diagram for each plugin instance ++ per_instance = true, ++ title = "%H: Transfer on %pi", ++ vlabel = "Bytes/s", ++ ++ -- diagram data description ++ data = { ++ -- defined sources for data types, if ommitted assume a single DS named "value" (optional) ++ sources = { ++ if_octets = { "tx", "rx" } ++ }, ++ ++ -- special options for single data lines ++ options = { ++ if_octets__tx = { ++ total = true, -- report total amount of bytes ++ color = "00ff00", -- tx is green ++ title = "Bytes (TX)" ++ }, ++ ++ if_octets__rx = { ++ flip = true, -- flip rx line ++ total = true, -- report total amount of bytes ++ color = "0000ff", -- rx is blue ++ title = "Bytes (RX)" ++ } ++ } ++ } ++ } ++ ++ ++ -- ++ -- packet diagram ++ -- ++ local packets = { ++ ++ -- draw this diagram for each plugin instance ++ per_instance = true, ++ title = "%H: Packets on %pi", ++ vlabel = "Packets/s", ++ ++ -- diagram data description ++ data = { ++ -- data type order ++ types = { "if_packets", "if_errors" }, ++ ++ -- defined sources for data types ++ sources = { ++ if_packets = { "tx", "rx" }, ++ if_errors = { "tx", "rx" } ++ }, ++ ++ -- special options for single data lines ++ options = { ++ -- processed packets (tx DS) ++ if_packets__tx = { ++ overlay = true, -- don't summarize ++ total = true, -- report total amount of bytes ++ color = "00ff00", -- processed tx is green ++ title = "Processed (tx)" ++ }, ++ ++ -- processed packets (rx DS) ++ if_packets__rx = { ++ overlay = true, -- don't summarize ++ flip = true, -- flip rx line ++ total = true, -- report total amount of bytes ++ color = "0000ff", -- processed rx is blue ++ title = "Processed (rx)" ++ }, ++ ++ -- packet errors (tx DS) ++ if_errors__tx = { ++ overlay = true, -- don't summarize ++ total = true, -- report total amount of packets ++ color = "ff5500", -- tx errors are orange ++ title = "Errors (tx)" ++ }, ++ ++ -- packet errors (rx DS) ++ if_errors__rx = { ++ overlay = true, -- don't summarize ++ flip = true, -- flip rx line ++ total = true, -- report total amount of packets ++ color = "ff0000", -- rx errors are red ++ title = "Errors (rx)" ++ } ++ } ++ } ++ } ++ ++ return { traffic, packets } ++end +diff --git a/feeds/luci/applications/luci-app-statistics/luasrc/statistics/rrdtool/definitions/iptables.lua b/feeds/luci/applications/luci-app-statistics/luasrc/statistics/rrdtool/definitions/iptables.lua +new file mode 100644 +index 0000000..9790e0e +--- /dev/null ++++ b/feeds/luci/applications/luci-app-statistics/luasrc/statistics/rrdtool/definitions/iptables.lua +@@ -0,0 +1,41 @@ ++-- Copyright 2008 Freifunk Leipzig / Jo-Philipp Wich ++-- Licensed to the public under the Apache License 2.0. ++ ++module("luci.statistics.rrdtool.definitions.iptables", package.seeall) ++ ++function rrdargs( graph, plugin, plugin_instance, dtype ) ++ ++ return { ++ { ++ title = "%H: Firewall: Processed bytes in %pi", ++ vlabel = "Bytes/s", ++ number_format = "%5.0lf%sB/s", ++ totals_format = "%5.0lf%sB", ++ data = { ++ types = { "ipt_bytes" }, ++ options = { ++ ipt_bytes = { ++ total = true, ++ title = "%di" ++ } ++ } ++ } ++ }, ++ ++ { ++ title = "%H: Firewall: Processed packets in %pi", ++ vlabel = "Packets/s", ++ number_format = "%5.1lf P/s", ++ totals_format = "%5.0lf%s", ++ data = { ++ types = { "ipt_packets" }, ++ options = { ++ ipt_packets = { ++ total = true, ++ title = "%di" ++ } ++ } ++ } ++ } ++ } ++end +diff --git a/feeds/luci/applications/luci-app-statistics/luasrc/statistics/rrdtool/definitions/irq.lua b/feeds/luci/applications/luci-app-statistics/luasrc/statistics/rrdtool/definitions/irq.lua +new file mode 100644 +index 0000000..f61d0da +--- /dev/null ++++ b/feeds/luci/applications/luci-app-statistics/luasrc/statistics/rrdtool/definitions/irq.lua +@@ -0,0 +1,18 @@ ++-- Copyright 2008 Freifunk Leipzig / Jo-Philipp Wich ++-- Licensed to the public under the Apache License 2.0. ++ ++module("luci.statistics.rrdtool.definitions.irq", package.seeall) ++ ++function rrdargs( graph, plugin, plugin_instance, dtype ) ++ ++ return { ++ title = "%H: Interrupts", vlabel = "Issues/s", ++ number_format = "%5.0lf", data = { ++ types = { "irq" }, ++ options = { ++ irq = { title = "IRQ %di", noarea = true } ++ } ++ } ++ } ++ ++end +diff --git a/feeds/luci/applications/luci-app-statistics/luasrc/statistics/rrdtool/definitions/iwinfo.lua b/feeds/luci/applications/luci-app-statistics/luasrc/statistics/rrdtool/definitions/iwinfo.lua +new file mode 100644 +index 0000000..3ca3381 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-statistics/luasrc/statistics/rrdtool/definitions/iwinfo.lua +@@ -0,0 +1,90 @@ ++-- Copyright 2011 Jo-Philipp Wich ++-- Licensed to the public under the Apache License 2.0. ++ ++module("luci.statistics.rrdtool.definitions.iwinfo", package.seeall) ++ ++function rrdargs( graph, plugin, plugin_instance ) ++ ++ -- ++ -- signal/noise diagram ++ -- ++ local snr = { ++ title = "%H: Signal and noise on %pi", ++ vlabel = "dBm", ++ number_format = "%5.1lf dBm", ++ data = { ++ types = { "signal_noise", "signal_power" }, ++ options = { ++ signal_power = { ++ title = "Signal", ++ overlay = true, ++ color = "0000ff" ++ }, ++ signal_noise = { ++ title = "Noise", ++ overlay = true, ++ color = "ff0000" ++ } ++ } ++ } ++ } ++ ++ ++ -- ++ -- signal quality diagram ++ -- ++ local quality = { ++ title = "%H: Signal quality on %pi", ++ vlabel = "Quality", ++ number_format = "%3.0lf", ++ data = { ++ types = { "signal_quality" }, ++ options = { ++ signal_quality = { ++ title = "Quality", ++ noarea = true, ++ color = "0000ff" ++ } ++ } ++ } ++ } ++ ++ ++ -- ++ -- phy rate diagram ++ -- ++ local bitrate = { ++ title = "%H: Average phy rate on %pi", ++ vlabel = "MBit/s", ++ number_format = "%5.1lf%sBit/s", ++ data = { ++ types = { "bitrate" }, ++ options = { ++ bitrate = { ++ title = "Rate", ++ color = "00ff00" ++ } ++ } ++ } ++ } ++ ++ -- ++ -- associated stations ++ -- ++ local stations = { ++ title = "%H: Associated stations on %pi", ++ vlabel = "Stations", ++ number_format = "%3.0lf", ++ data = { ++ types = { "stations" }, ++ options = { ++ stations = { ++ title = "Stations", ++ color = "0000ff" ++ } ++ } ++ } ++ } ++ ++ return { snr, quality, bitrate, stations } ++end +diff --git a/feeds/luci/applications/luci-app-statistics/luasrc/statistics/rrdtool/definitions/load.lua b/feeds/luci/applications/luci-app-statistics/luasrc/statistics/rrdtool/definitions/load.lua +new file mode 100644 +index 0000000..ce762da +--- /dev/null ++++ b/feeds/luci/applications/luci-app-statistics/luasrc/statistics/rrdtool/definitions/load.lua +@@ -0,0 +1,24 @@ ++-- Copyright 2008 Freifunk Leipzig / Jo-Philipp Wich ++-- Licensed to the public under the Apache License 2.0. ++ ++module("luci.statistics.rrdtool.definitions.load", package.seeall) ++ ++function rrdargs( graph, plugin, plugin_instance, dtype ) ++ ++ return { ++ title = "%H: Load", vlabel = "Load", ++ y_min = "0", ++ units_exponent = "0", ++ number_format = "%5.2lf", data = { ++ sources = { ++ load = { "shortterm", "midterm", "longterm" } ++ }, ++ ++ options = { ++ load__shortterm = { color = "ff0000", title = "1 minute", noarea = true }, ++ load__midterm = { color = "ff6600", title = "5 minutes", noarea = true }, ++ load__longterm = { color = "ffaa00", title = "15 minutes", noarea = true } ++ } ++ } ++ } ++end +diff --git a/feeds/luci/applications/luci-app-statistics/luasrc/statistics/rrdtool/definitions/memory.lua b/feeds/luci/applications/luci-app-statistics/luasrc/statistics/rrdtool/definitions/memory.lua +new file mode 100644 +index 0000000..53d559c +--- /dev/null ++++ b/feeds/luci/applications/luci-app-statistics/luasrc/statistics/rrdtool/definitions/memory.lua +@@ -0,0 +1,35 @@ ++--[[ ++ ++(c) 2011 Manuel Munz ++ ++Licensed under the Apache License, Version 2.0 (the "License"); ++you may not use this file except in compliance with the License. ++You may obtain a copy of the License at ++ ++ http://www.apache.org/licenses/LICENSE-2.0 ++]]-- ++ ++module("luci.statistics.rrdtool.definitions.memory",package.seeall) ++ ++function rrdargs( graph, plugin, plugin_instance, dtype ) ++ ++ return { ++ title = "%H: Memory usage", ++ vlabel = "MB", ++ number_format = "%5.1lf%s", ++ y_min = "0", ++ alt_autoscale_max = true, ++ data = { ++ instances = { ++ memory = { "free", "buffered", "cached", "used" } ++ }, ++ ++ options = { ++ memory_buffered = { color = "0000ff", title = "Buffered" }, ++ memory_cached = { color = "ff00ff", title = "Cached" }, ++ memory_used = { color = "ff0000", title = "Used" }, ++ memory_free = { color = "00ff00", title = "Free" } ++ } ++ } ++ } ++end +diff --git a/feeds/luci/applications/luci-app-statistics/luasrc/statistics/rrdtool/definitions/netlink.lua b/feeds/luci/applications/luci-app-statistics/luasrc/statistics/rrdtool/definitions/netlink.lua +new file mode 100644 +index 0000000..b4f2ac1 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-statistics/luasrc/statistics/rrdtool/definitions/netlink.lua +@@ -0,0 +1,191 @@ ++-- Copyright 2008 Freifunk Leipzig / Jo-Philipp Wich ++-- Licensed to the public under the Apache License 2.0. ++ ++module("luci.statistics.rrdtool.definitions.netlink", package.seeall) ++ ++function rrdargs( graph, plugin, plugin_instance ) ++ ++ -- ++ -- traffic diagram ++ -- ++ local traffic = { ++ title = "%H: Netlink - Transfer on %pi", ++ vlabel = "Bytes/s", ++ ++ -- diagram data description ++ data = { ++ -- defined sources for data types, if ommitted assume a single DS named "value" (optional) ++ sources = { ++ if_octets = { "tx", "rx" } ++ }, ++ ++ -- special options for single data lines ++ options = { ++ if_octets__tx = { ++ total = true, -- report total amount of bytes ++ color = "00ff00" -- tx is green ++ }, ++ ++ if_octets__rx = { ++ flip = true, -- flip rx line ++ total = true, -- report total amount of bytes ++ color = "0000ff" -- rx is blue ++ } ++ } ++ } ++ } ++ ++ ++ -- ++ -- packet diagram ++ -- ++ local packets = { ++ title = "%H: Netlink - Packets on %pi", ++ vlabel = "Packets/s", detail = true, ++ ++ -- diagram data description ++ data = { ++ -- data type order ++ types = { "if_packets", "if_dropped", "if_errors" }, ++ ++ -- defined sources for data types ++ sources = { ++ if_packets = { "tx", "rx" }, ++ if_dropped = { "tx", "rx" }, ++ if_errors = { "tx", "rx" } ++ }, ++ ++ -- special options for single data lines ++ options = { ++ -- processed packets (tx DS) ++ if_packets__tx = { ++ overlay = true, -- don't summarize ++ total = true, -- report total amount of bytes ++ color = "00ff00" -- processed tx is green ++ }, ++ ++ -- processed packets (rx DS) ++ if_packets__rx = { ++ overlay = true, -- don't summarize ++ flip = true, -- flip rx line ++ total = true, -- report total amount of bytes ++ color = "0000ff" -- processed rx is blue ++ }, ++ ++ -- dropped packets (tx DS) ++ if_dropped__tx = { ++ overlay = true, -- don't summarize ++ total = true, -- report total amount of bytes ++ color = "660055" -- dropped tx is ... dunno ;) ++ }, ++ ++ -- dropped packets (rx DS) ++ if_dropped__rx = { ++ overlay = true, -- don't summarize ++ flip = true, -- flip rx line ++ total = true, -- report total amount of bytes ++ color = "440066" -- dropped rx is violett ++ }, ++ ++ -- packet errors (tx DS) ++ if_errors__tx = { ++ overlay = true, -- don't summarize ++ total = true, -- report total amount of packets ++ color = "ff5500" -- tx errors are orange ++ }, ++ ++ -- packet errors (rx DS) ++ if_errors__rx = { ++ overlay = true, -- don't summarize ++ flip = true, -- flip rx line ++ total = true, -- report total amount of packets ++ color = "ff0000" -- rx errors are red ++ } ++ } ++ } ++ } ++ ++ ++ -- ++ -- multicast diagram ++ -- ++ local multicast = { ++ title = "%H: Netlink - Multicast on %pi", ++ vlabel = "Packets/s", detail = true, ++ ++ -- diagram data description ++ data = { ++ -- data type order ++ types = { "if_multicast" }, ++ ++ -- special options for single data lines ++ options = { ++ -- multicast packets ++ if_multicast = { ++ total = true, -- report total amount of packets ++ color = "0000ff" -- multicast is blue ++ } ++ } ++ } ++ } ++ ++ ++ -- ++ -- collision diagram ++ -- ++ local collisions = { ++ title = "%H: Netlink - Collisions on %pi", ++ vlabel = "Collisions/s", detail = true, ++ ++ -- diagram data description ++ data = { ++ -- data type order ++ types = { "if_collisions" }, ++ ++ -- special options for single data lines ++ options = { ++ -- collision rate ++ if_collisions = { ++ total = true, -- report total amount of packets ++ color = "ff0000" -- collsions are red ++ } ++ } ++ } ++ } ++ ++ ++ -- ++ -- error diagram ++ -- ++ local errors = { ++ title = "%H: Netlink - Errors on %pi", ++ vlabel = "Errors/s", detail = true, ++ ++ -- diagram data description ++ data = { ++ -- data type order ++ types = { "if_tx_errors", "if_rx_errors" }, ++ ++ -- data type instances ++ instances = { ++ if_tx_errors = { "aborted", "carrier", "fifo", "heartbeat", "window" }, ++ if_rx_errors = { "length", "missed", "over", "crc", "fifo", "frame" } ++ }, ++ ++ -- special options for single data lines ++ options = { -- XXX: fixme (define colors...) ++ if_tx_errors = { ++ total = true ++ }, ++ ++ if_rx_errors = { ++ flip = true, ++ total = true ++ } ++ } ++ } ++ } ++ ++ ++ return { traffic, packets, multicast, collisions, errors } ++end +diff --git a/feeds/luci/applications/luci-app-statistics/luasrc/statistics/rrdtool/definitions/nut.lua b/feeds/luci/applications/luci-app-statistics/luasrc/statistics/rrdtool/definitions/nut.lua +new file mode 100644 +index 0000000..8b04ab8 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-statistics/luasrc/statistics/rrdtool/definitions/nut.lua +@@ -0,0 +1,87 @@ ++-- Licensed to the public under the Apache License 2.0. ++ ++module("luci.statistics.rrdtool.definitions.nut",package.seeall) ++ ++function rrdargs( graph, plugin, plugin_instance, dtype ) ++ ++ local voltages = { ++ title = "%H: Voltages on UPS \"%pi\"", ++ vlabel = "V", ++ number_format = "%5.1lfV", ++ data = { ++ instances = { ++ voltage = { "battery", "input", "output" } ++ }, ++ ++ options = { ++ voltage_output = { color = "00e000", title = "Output voltage", noarea=true, overlay=true }, ++ voltage_battery = { color = "0000ff", title = "Battery voltage", noarea=true, overlay=true }, ++ voltage_input = { color = "ffb000", title = "Input voltage", noarea=true, overlay=true } ++ } ++ } ++ } ++ ++ local currents = { ++ title = "%H: Current on UPS \"%pi\"", ++ vlabel = "A", ++ number_format = "%5.3lfA", ++ data = { ++ instances = { ++ current = { "battery", "output" } ++ }, ++ ++ options = { ++ current_output = { color = "00e000", title = "Output current", noarea=true, overlay=true }, ++ current_battery = { color = "0000ff", title = "Battery current", noarea=true, overlay=true }, ++ } ++ } ++ } ++ ++ local percentage = { ++ title = "%H: Battery charge on UPS \"%pi\"", ++ vlabel = "Percent", ++ y_min = "0", ++ y_max = "100", ++ number_format = "%5.1lf%%", ++ data = { ++ instances = { ++ percent = "charge" ++ }, ++ options = { ++ percent_charge = { color = "00ff00", title = "Charge level" } ++ } ++ } ++ } ++ ++ -- Note: This is in ISO8859-1 for rrdtool. Welcome to the 20th century. ++ local temperature = { ++ title = "%H: Battery temperature on UPS \"%pi\"", ++ vlabel = "\176C", ++ number_format = "%5.1lf\176C", ++ data = { ++ instances = { ++ temperature = "battery" ++ }, ++ ++ options = { ++ temperature_battery = { color = "ffb000", title = "Battery temperature" } ++ } ++ } ++ } ++ ++ local timeleft = { ++ title = "%H: Time left on UPS \"%pi\"", ++ vlabel = "Minutes", ++ number_format = "%.1lfm", ++ data = { ++ instances = { ++ timeleft = { "battery" } ++ }, ++ options = { ++ timeleft_battery = { color = "0000ff", title = "Time left", transform_rpn = "60,/" } ++ } ++ } ++ } ++ ++ return { voltages, currents, percentage, temperature, timeleft } ++end +diff --git a/feeds/luci/applications/luci-app-statistics/luasrc/statistics/rrdtool/definitions/olsrd.lua b/feeds/luci/applications/luci-app-statistics/luasrc/statistics/rrdtool/definitions/olsrd.lua +new file mode 100644 +index 0000000..a694695 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-statistics/luasrc/statistics/rrdtool/definitions/olsrd.lua +@@ -0,0 +1,136 @@ ++-- Copyright 2011 Manuel Munz ++-- Licensed to the public under the Apache License 2.0. ++ ++module("luci.statistics.rrdtool.definitions.olsrd", package.seeall) ++ ++function rrdargs( graph, plugin, plugin_instance, dtype ) ++ local g = { } ++ ++ if plugin_instance == "routes" then ++ ++ g[#g+1] = { ++ -- diagram data description ++ title = "%H: Total amount of OLSR routes", vlabel = "n", ++ number_format = "%5.0lf", data = { ++ types = { "routes" }, ++ options = { ++ routes = { ++ color = "ff0000", ++ title = "Total number of routes" ++ } ++ } ++ } ++ } ++ ++ g[#g+1] = { ++ title = "%H: Average route ETX", vlabel = "ETX", detail = true, ++ number_format = "%5.1lf",data = { ++ instances = { "average" }, -- falls es irgendwann mal welche pro ip gibt, wie bei links, dann werden die hier excludiert ++ types = { "route_etx" }, ++ options = { ++ route_etx = { ++ title = "Average route ETX" ++ } ++ } ++ } ++ } ++ ++ g[#g+1] = { ++ title = "%H: Average route metric", vlabel = "metric", detail = true, ++ number_format = "%5.1lf", data = { ++ instances = { "average" }, -- falls es irgendwann mal welche pro ip gibt, wie bei links, dann werden die hier excludiert ++ types = { "route_metric" }, ++ options = { ++ route_metric = { ++ title = "Average route metric" ++ } ++ } ++ } ++ } ++ ++ elseif plugin_instance == "links" then ++ ++ g[#g+1] = { ++ -- diagram data description ++ title = "%H: Total amount of OLSR neighbours", vlabel = "n", ++ number_format = "%5.0lf", data = { ++ instances = { "" }, ++ types = { "links" }, ++ options = { ++ links = { ++ color = "00ff00", ++ title = "Number of neighbours" ++ } ++ } ++ } ++ } ++ ++ local instances = graph.tree:data_instances(plugin, plugin_instance, "signal_quality") ++ table.sort(instances) ++ ++ -- define one diagram per host, containing the rx and lq values ++ local i ++ for i = 1, #instances, 2 do ++ local dsn1 = "signal_quality_%s_value" % instances[i]:gsub("[^%w]+", "_") ++ local dsn2 = "signal_quality_%s_value" % instances[i+1]:gsub("[^%w]+", "_") ++ local host = instances[i]:match("^[^%-]+%-([^%-]+)%-.+") ++ ++ g[#g+1] = { ++ title = "%H: Signal Quality" .. " (" .. (host or "avg") ..")", vlabel = "ETX", ++ number_format = "%5.2lf", detail = true, ++ data = { ++ types = { "signal_quality" }, ++ ++ instances = { ++ signal_quality = { instances[i], instances[i+1] }, ++ }, ++ ++ options = { ++ [dsn1] = { ++ color = "00ff00", ++ title = "LQ (%s)" % (host or "avg"), ++ }, ++ [dsn2] = { ++ color = "0000ff", ++ title = "NLQ (%s)" % (host or "avg"), ++ flip = true ++ } ++ } ++ } ++ } ++ end ++ ++ elseif plugin_instance == "topology" then ++ ++ g[#g+1] = { ++ title= "%H: Total amount of OLSR links", vlabel = "n", ++ number_format = "%5.0lf", data = { ++ instances = { "" }, ++ types = { "links" }, ++ options = { ++ links = { ++ color = "0000ff", ++ title = "Total number of links" ++ } ++ } ++ } ++ } ++ ++ g[#g+1] = { ++ title= "%H: Average signal quality", vlabel = "n", ++ number_format = "%5.2lf", detail = true, ++ data = { ++ instances = { "average" }, -- exclude possible per-ip stuff ++ types = { "signal_quality" }, ++ options = { ++ signal_quality = { ++ color = "0000ff", ++ title = "Average signal quality" ++ } ++ } ++ } ++ } ++ end ++ ++ return g ++end +diff --git a/feeds/luci/applications/luci-app-statistics/luasrc/statistics/rrdtool/definitions/ping.lua b/feeds/luci/applications/luci-app-statistics/luasrc/statistics/rrdtool/definitions/ping.lua +new file mode 100644 +index 0000000..347d756 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-statistics/luasrc/statistics/rrdtool/definitions/ping.lua +@@ -0,0 +1,29 @@ ++-- Copyright 2008 Freifunk Leipzig / Jo-Philipp Wich ++-- Licensed to the public under the Apache License 2.0. ++ ++module("luci.statistics.rrdtool.definitions.ping", package.seeall) ++ ++function rrdargs( graph, plugin, plugin_instance, dtype ) ++ return { ++ -- Ping roundtrip time ++ { title = "%H: ICMP Round Trip Time", vlabel = "ms", ++ number_format = "%5.1lf ms", data = { ++ sources = { ping = { "value" } }, ++ options = { ping__value = { noarea = true, title = "%di" } } ++ } }, ++ ++ -- Ping droprate ++ { title = "%H: ICMP Drop Rate", vlabel = "%", ++ number_format = "%5.2lf %%", data = { ++ types = { "ping_droprate" }, ++ options = { ping_droprate = { title = "%di" } } ++ } }, ++ ++ -- Ping standard deviation ++ { title = "%H: ICMP Standard Deviation", vlabel = "ms", ++ number_format = "%5.2lf ms", data = { ++ types = { "ping_stddev" }, ++ options = { ping_stddev = { title = "%di" } } ++ } }, ++ } ++end +diff --git a/feeds/luci/applications/luci-app-statistics/luasrc/statistics/rrdtool/definitions/processes.lua b/feeds/luci/applications/luci-app-statistics/luasrc/statistics/rrdtool/definitions/processes.lua +new file mode 100644 +index 0000000..d48441a +--- /dev/null ++++ b/feeds/luci/applications/luci-app-statistics/luasrc/statistics/rrdtool/definitions/processes.lua +@@ -0,0 +1,98 @@ ++-- Copyright 2008 Freifunk Leipzig / Jo-Philipp Wich ++-- Licensed to the public under the Apache License 2.0. ++ ++module("luci.statistics.rrdtool.definitions.processes", package.seeall) ++ ++function rrdargs( graph, plugin, plugin_instance, dtype ) ++ ++ return { ++ { ++ title = "%H: Processes", ++ vlabel = "Processes/s", ++ data = { ++ instances = { ++ ps_state = { ++ "sleeping", "running", "paging", "blocked", "stopped", "zombies" ++ } ++ }, ++ ++ options = { ++ ps_state_sleeping = { color = "0000ff" }, ++ ps_state_running = { color = "008000" }, ++ ps_state_paging = { color = "ffff00" }, ++ ps_state_blocked = { color = "ff5000" }, ++ ps_state_stopped = { color = "555555" }, ++ ps_state_zombies = { color = "ff0000" } ++ } ++ } ++ }, ++ ++ { ++ title = "%H: CPU time used by %pi", ++ vlabel = "Jiffies", ++ data = { ++ sources = { ++ ps_cputime = { "syst", "user" } ++ }, ++ ++ options = { ++ ps_cputime__user = { ++ color = "0000ff", ++ overlay = true ++ }, ++ ++ ps_cputime__syst = { ++ color = "ff0000", ++ overlay = true ++ } ++ } ++ } ++ }, ++ ++ { ++ title = "%H: Threads and processes belonging to %pi", ++ vlabel = "Count", ++ detail = true, ++ data = { ++ sources = { ++ ps_count = { "threads", "processes" } ++ }, ++ ++ options = { ++ ps_count__threads = { color = "00ff00" }, ++ ps_count__processes = { color = "0000bb" } ++ } ++ } ++ }, ++ ++ { ++ title = "%H: Page faults in %pi", ++ vlabel = "Pagefaults", ++ detail = true, ++ data = { ++ sources = { ++ ps_pagefaults = { "minflt", "majflt" } ++ }, ++ ++ options = { ++ ps_pagefaults__minflt = { color = "ff0000" }, ++ ps_pagefaults__majflt = { color = "ff5500" } ++ } ++ } ++ }, ++ ++ { ++ title = "%H: Virtual memory size of %pi", ++ vlabel = "Bytes", ++ detail = true, ++ number_format = "%5.1lf%sB", ++ data = { ++ types = { "ps_rss" }, ++ ++ options = { ++ ps_rss = { color = "0000ff" } ++ } ++ } ++ } ++ } ++end +diff --git a/feeds/luci/applications/luci-app-statistics/luasrc/statistics/rrdtool/definitions/splash_leases.lua b/feeds/luci/applications/luci-app-statistics/luasrc/statistics/rrdtool/definitions/splash_leases.lua +new file mode 100644 +index 0000000..65fba52 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-statistics/luasrc/statistics/rrdtool/definitions/splash_leases.lua +@@ -0,0 +1,27 @@ ++-- Copyright 2013 Freifunk Augsburg / Michael Wendland ++-- Licensed to the public under the Apache License 2.0. ++ ++ ++module("luci.statistics.rrdtool.definitions.splash_leases", package.seeall) ++ ++function rrdargs( graph, plugin, plugin_instance, dtype ) ++ ++ return { ++ title = "%H: Splash Leases", ++ vlabel = "Active Clients", ++ y_min = "0", ++ number_format = "%5.1lf", ++ data = { ++ sources = { ++ splash_leases = { "leased", "whitelisted", "blacklisted" } ++ }, ++ ++ options = { ++ splash_leases__leased = { color = "00CC00", title = "Leased", overlay = false }, ++ splash_leases__whitelisted = { color = "0000FF", title = "Whitelisted", overlay = false }, ++ splash_leases__blacklisted = { color = "FF0000", title = "Blacklisted", overlay = false } ++ } ++ } ++ } ++ ++end +diff --git a/feeds/luci/applications/luci-app-statistics/luasrc/statistics/rrdtool/definitions/tcpconns.lua b/feeds/luci/applications/luci-app-statistics/luasrc/statistics/rrdtool/definitions/tcpconns.lua +new file mode 100644 +index 0000000..50a9470 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-statistics/luasrc/statistics/rrdtool/definitions/tcpconns.lua +@@ -0,0 +1,25 @@ ++-- Copyright 2008 Freifunk Leipzig / Jo-Philipp Wich ++-- Licensed to the public under the Apache License 2.0. ++ ++module("luci.statistics.rrdtool.definitions.tcpconns", package.seeall) ++ ++function rrdargs( graph, plugin, plugin_instance, dtype ) ++ return { ++ title = "%H: TCP connections to port %pi", ++ vlabel = "Connections/s", ++ number_format = "%5.0lf", ++ data = { ++ types = { "tcp_connections" }, ++ instances = { ++ tcp_connections = { ++ "SYN_SENT", "SYN_RECV", "LISTEN", "ESTABLISHED", ++ "LAST_ACK", "TIME_WAIT", "CLOSING", "CLOSE_WAIT", ++ "CLOSED", "FIN_WAIT1", "FIN_WAIT2" ++ }, ++ options = { ++ load__ESTABLISHED = { title = "%di", noarea = true } ++ } ++ } ++ } ++ } ++end +diff --git a/feeds/luci/applications/luci-app-statistics/luasrc/statistics/rrdtool/definitions/uptime.lua b/feeds/luci/applications/luci-app-statistics/luasrc/statistics/rrdtool/definitions/uptime.lua +new file mode 100644 +index 0000000..077ec57 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-statistics/luasrc/statistics/rrdtool/definitions/uptime.lua +@@ -0,0 +1,27 @@ ++--[[ ++ ++Copyright 2013 Thomas Endt ++ ++Licensed under the Apache License, Version 2.0 (the "License"); ++you may not use this file except in compliance with the License. ++You may obtain a copy of the License at ++ ++ http://www.apache.org/licenses/LICENSE-2.0 ++]]-- ++ ++module("luci.statistics.rrdtool.definitions.uptime", package.seeall) ++ ++function rrdargs( graph, plugin, plugin_instance, dtype ) ++ ++ return { ++ title = "%H: Uptime", vlabel = "seconds", ++ number_format = "%5.0lf%s", data = { ++ types = { "uptime" }, ++ options = { ++ uptime = { title = "Uptime %di", noarea = true } ++ } ++ } ++ } ++ ++end ++ +diff --git a/feeds/luci/applications/luci-app-statistics/luasrc/view/admin_statistics/index.htm b/feeds/luci/applications/luci-app-statistics/luasrc/view/admin_statistics/index.htm +new file mode 100644 +index 0000000..0fb3d56 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-statistics/luasrc/view/admin_statistics/index.htm +@@ -0,0 +1,17 @@ ++<%# ++ Copyright 2008 Steven Barth ++ Copyright 2008 Jo-Philipp Wich ++ Licensed to the public under the Apache License 2.0. ++-%> ++ ++<%+header%> ++ ++

    <%:Statistics%>

    ++ ++

    <%_The statistics package uses Collectd ++to gather data and RRDtool to ++render diagram images.%>

    ++ ++

    <%_You can install additional collectd-mod-* plugins to enable more statistics.%>

    ++ ++<%+footer%> +diff --git a/feeds/luci/applications/luci-app-statistics/luasrc/view/public_statistics/graph.htm b/feeds/luci/applications/luci-app-statistics/luasrc/view/public_statistics/graph.htm +new file mode 100644 +index 0000000..7716951 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-statistics/luasrc/view/public_statistics/graph.htm +@@ -0,0 +1,40 @@ ++<%# ++ Copyright 2008 Steven Barth ++ Copyright 2008 Jo-Philipp Wich ++ Licensed to the public under the Apache License 2.0. ++-%> ++ ++<%+header%> ++ ++

    <%:Statistics%>

    ++ ++
    ++ ++ ++ ++ ++
    ++ ++
    ++
    ++
    ++ ++
    ++ <% for i, img in ipairs(images) do %> ++ <% if is_index then %><% end %> ++ ++ <% if is_index then %><% end %> ++
    ++ <% end %> ++
    ++ ++<%+footer%> ++ +diff --git a/feeds/luci/applications/luci-app-statistics/po/ca/rrdtool.po b/feeds/luci/applications/luci-app-statistics/po/ca/rrdtool.po +new file mode 100644 +index 0000000..7c03aad +--- /dev/null ++++ b/feeds/luci/applications/luci-app-statistics/po/ca/rrdtool.po +@@ -0,0 +1,359 @@ ++# rrdtool.pot ++# generated from ./applications/luci-statistics/luasrc/i18n/rrdtool.en.lua ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Report-Msgid-Bugs-To: \n" ++"POT-Creation-Date: 2009-05-26 16:39+0200\n" ++"PO-Revision-Date: 2009-05-27 01:49+0200\n" ++"Last-Translator: Eduard Duran \n" ++"Language-Team: LANGUAGE \n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"X-Generator: Pootle 1.1.0\n" ++ ++#. %H: Wireless - Signal Noise Ratio ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:1 ++msgid "stat_dg_title_wireless__signal_noise" ++msgstr "%H: Wireless - Relació Senyal Soroll" ++ ++#. dBm ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:2 ++msgid "stat_dg_label_wireless__signal_noise" ++msgstr "dBm" ++ ++#. Noise Level ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:3 ++msgid "stat_ds_signal_noise" ++msgstr "Nivell de soroll" ++ ++#. Signal Strength ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:4 ++msgid "stat_ds_signal_power" ++msgstr "Potència de senyal" ++ ++#. %H: Wireless - Signal Quality ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:5 ++msgid "stat_dg_title_wireless__signal_quality" ++msgstr "%H: Wireless - Qualitat de senyal" ++ ++#. n ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:6 ++msgid "stat_dg_label_wireless__signal_quality" ++msgstr "n" ++ ++#. Signal Quality ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:7 ++msgid "stat_ds_signal_quality" ++msgstr "Qualitat de senyal" ++ ++#. %H: ICMP Roundtrip Times ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:8 ++msgid "stat_dg_title_ping" ++msgstr "%H: Temps ICMP d'anada i tornada" ++ ++#. ms ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:9 ++msgid "stat_dg_label_ping" ++msgstr "ms" ++ ++#. %di ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:10 ++msgid "stat_ds_ping" ++msgstr "%di" ++ ++#. %H: Firewall - Processed Packets ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:11 ++msgid "stat_dg_title_iptables__ipt_packets" ++msgstr "%H: Tallafocs - Paquets processats" ++ ++#. Packets/s ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:12 ++msgid "stat_dg_label_iptables__ipt_packets" ++msgstr "Paquets/s" ++ ++#. Chain \"%di\" ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:13 ++msgid "stat_ds_ipt_packets" ++msgstr "Cadena \"%di\"" ++ ++#. %H: Netlink - Transfer on %pi ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:14 ++msgid "stat_dg_title_netlink__if_octets" ++msgstr "%H: Enllaç de xarxa - Transferència en %pi" ++ ++#. Bytes/s ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:15 ++msgid "stat_dg_label_netlink__if_octets" ++msgstr "Bytes/s" ++ ++#. Bytes (%ds) ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:16 ++msgid "stat_ds_if_octets" ++msgstr "Bytes (%ds)" ++ ++#. %H: Netlink - Packets on %pi ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:17 ++msgid "stat_dg_title_netlink__if_packets" ++msgstr "%H: Enllaç de xarxa - Paquets en %pi" ++ ++#. Packets/s ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:18 ++msgid "stat_dg_label_netlink__if_packets" ++msgstr "Paquets/s" ++ ++#. Processed (%ds) ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:19 ++msgid "stat_ds_if_packets" ++msgstr "Processats (%ds)" ++ ++#. Dropped (%ds) ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:20 ++msgid "stat_ds_if_dropped" ++msgstr "Descartats (%ds)" ++ ++#. Errors (%ds) ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:21 ++msgid "stat_ds_if_errors" ++msgstr "Errors (%ds)" ++ ++#. %H: Netlink - Multicast on %pi ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:22 ++msgid "stat_dg_title_netlink__if_multicast" ++msgstr "%H: Enllaç de xarxa - Multicast en %pi" ++ ++#. Packets/s ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:23 ++msgid "stat_dg_label_netlink__if_multicast" ++msgstr "Paquets/s" ++ ++#. Packets ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:24 ++msgid "stat_ds_if_multicast" ++msgstr "Paquets" ++ ++#. %H: Netlink - Collisions on %pi ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:25 ++msgid "stat_dg_title_netlink__if_collisions" ++msgstr "%H: Enllaç de xarxa - Col·lisions en %pi" ++ ++#. Collisions/s ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:26 ++msgid "stat_dg_label_netlink__if_collisions" ++msgstr "Col·lisions/s" ++ ++#. Collisions ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:27 ++msgid "stat_ds_if_collisions" ++msgstr "Col·lisions" ++ ++#. %H: Netlink - Errors on %pi ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:28 ++msgid "stat_dg_title_netlink__if_tx_errors" ++msgstr "%H: Enllaç de xarxa - Errors on %pi" ++ ++#. Errors/s ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:29 ++msgid "stat_dg_label_netlink__if_tx_errors" ++msgstr "Errors/s" ++ ++#. %di ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:30 ++msgid "stat_ds_if_tx_errors" ++msgstr "%di" ++ ++#. %di ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:31 ++msgid "stat_ds_if_rx_errors" ++msgstr "%di" ++ ++#. %H: Processes ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:32 ++msgid "stat_dg_title_processes" ++msgstr "%H: Processos" ++ ++#. Processes/s ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:33 ++msgid "stat_dg_label_processes" ++msgstr "Processos/s" ++ ++#. %di ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:34 ++msgid "stat_ds_ps_state" ++msgstr "%di" ++ ++#. %H: Process %pi - used cpu time ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:35 ++msgid "stat_dg_title_processes__ps_cputime" ++msgstr "%H: Procés %pi - temps de cpu usat" ++ ++#. Jiffies ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:36 ++msgid "stat_dg_label_processes__ps_cputime" ++msgstr "Jiffies" ++ ++#. system ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:37 ++msgid "stat_ds_ps_cputime__syst" ++msgstr "sistema" ++ ++#. user ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:38 ++msgid "stat_ds_ps_cputime__user" ++msgstr "usuari" ++ ++#. %H: Process %pi - threads and processes ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:39 ++msgid "stat_dg_title_processes__ps_count" ++msgstr "%H: Procés %pi - threads i processos" ++ ++#. Count ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:40 ++msgid "stat_dg_label_processes__ps_count" ++msgstr "Compte" ++ ++#. %ds ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:41 ++msgid "stat_ds_ps_count" ++msgstr "%ds" ++ ++#. %H: Process %pi - page faults ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:42 ++msgid "stat_dg_title_processes__ps_pagefaults" ++msgstr "%H: Procés %pi - errors de pàgina" ++ ++#. Pagefaults ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:43 ++msgid "stat_dg_label_processes__ps_pagefaults" ++msgstr "Errors de pàgina" ++ ++#. page faults ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:44 ++msgid "stat_ds_ps_pagefaults" ++msgstr "errors de pàgina" ++ ++#. %H: Process %pi - virtual memory size ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:45 ++msgid "stat_dg_title_processes__ps_rss" ++msgstr "%H: Procés %pi - mida de memòria virtual" ++ ++#. Bytes ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:46 ++msgid "stat_dg_label_processes__ps_rss" ++msgstr "Bytes" ++ ++#. virtual memory ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:47 ++msgid "stat_ds_ps_rss" ++msgstr "memòria virtual" ++ ++#. %H: Usage on Processor #%pi ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:48 ++msgid "stat_dg_title_cpu" ++msgstr "%H: Ús al Processador #%pi" ++ ++#. % ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:49 ++msgid "stat_dg_label_cpu" ++msgstr "%" ++ ++#. %di ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:50 ++msgid "stat_ds_cpu" ++msgstr "%di" ++ ++#. %H: Transfer on %di ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:51 ++msgid "stat_dg_title_interface__if_octets" ++msgstr "%H: Transferència a %di" ++ ++#. Bytes/s ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:52 ++msgid "stat_dg_label_interface__if_octets" ++msgstr "Bytes/s" ++ ++#. %H: Packets on %di ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:53 ++msgid "stat_dg_title_interface__if_packets" ++msgstr "%H: Paquets a %di" ++ ++#. Packets/s ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:54 ++msgid "stat_dg_label_interface__if_packets" ++msgstr "Paquets/s" ++ ++#. %H: TCP-Connections to Port %pi ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:55 ++msgid "stat_dg_title_tcpconns" ++msgstr "%H: Connexions TCP a Port %pi" ++ ++#. Connections/s ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:56 ++msgid "stat_dg_label_tcpconns" ++msgstr "Connexions/s" ++ ++#. %di ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:57 ++msgid "stat_ds_tcp_connections" ++msgstr "%di" ++ ++#. %H: Disk Space Usage on %di ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:58 ++msgid "stat_dg_title_df" ++msgstr "%H: Ús de l'espai de disc a %di" ++ ++#. Bytes ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:59 ++msgid "stat_dg_label_df" ++msgstr "Bytes" ++ ++#. %ds ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:60 ++msgid "stat_ds_df__free" ++msgstr "%ds" ++ ++#. %ds ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:61 ++msgid "stat_ds_df__used" ++msgstr "%ds" ++ ++#. %H: Interrupts ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:62 ++msgid "stat_dg_title_irq" ++msgstr "%H: Interrupcions" ++ ++#. Issues/s ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:63 ++msgid "stat_dg_label_irq" ++msgstr "Temes/s" ++ ++#. IRQ %di ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:64 ++msgid "stat_ds_irq" ++msgstr "IRQ %di" ++ ++#. %H: System Load ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:65 ++msgid "stat_dg_title_load" ++msgstr "%H: Càrrega de Sistema" ++ ++#. Load ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:66 ++msgid "stat_dg_label_load" ++msgstr "Càrrega" ++ ++#. 1 min ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:67 ++msgid "stat_ds_load__shortterm" ++msgstr "1 min" ++ ++#. 5 min ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:68 ++msgid "stat_ds_load__midterm" ++msgstr "5 min" ++ ++#. 15 min ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:69 ++msgid "stat_ds_load__longterm" ++msgstr "15 min" +diff --git a/feeds/luci/applications/luci-app-statistics/po/ca/statistics.po b/feeds/luci/applications/luci-app-statistics/po/ca/statistics.po +new file mode 100644 +index 0000000..ba47db0 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-statistics/po/ca/statistics.po +@@ -0,0 +1,695 @@ ++# statistics.pot ++# generated from ./applications/luci-statistics/luasrc/i18n/statistics.en.lua ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Report-Msgid-Bugs-To: \n" ++"POT-Creation-Date: 2009-06-10 03:40+0200\n" ++"PO-Revision-Date: 2014-08-07 20:11+0200\n" ++"Last-Translator: Alex \n" ++"Language-Team: LANGUAGE \n" ++"Language: ca\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n != 1);\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "Action (target)" ++msgstr "Acció (objectiu)" ++ ++msgid "Add command for reading values" ++msgstr "Afegeix ordre per llegir valors" ++ ++msgid "Add matching rule" ++msgstr "Afegeix regla coincident" ++ ++msgid "Add multiple hosts separated by space." ++msgstr "Afegeix múltiples hosts separats per espai." ++ ++msgid "Add notification command" ++msgstr "Afegeix ordre de notificació" ++ ++msgid "Base Directory" ++msgstr "Directori base" ++ ++msgid "Basic monitoring" ++msgstr "Monitoreig bàsic" ++ ++msgid "CPU Plugin Configuration" ++msgstr "Configuració del connector de CPU" ++ ++msgid "CSV Output" ++msgstr "Sortida CSV" ++ ++msgid "CSV Plugin Configuration" ++msgstr "Configuració del connector CSV" ++ ++msgid "Cache collected data for" ++msgstr "Emmagatzema en memòria cau les dades recollides de" ++ ++msgid "Cache flush interval" ++msgstr "Interval de neteja de memòria cau" ++ ++msgid "Chain" ++msgstr "Cadena" ++ ++msgid "CollectLinks" ++msgstr "" ++ ++msgid "CollectRoutes" ++msgstr "" ++ ++msgid "CollectTopology" ++msgstr "" ++ ++msgid "Collectd" ++msgstr "Collectd" ++ ++msgid "Collectd Settings" ++msgstr "Configuració Collectd" ++ ++msgid "" ++"Collectd is a small daemon for collecting data from various sources through " ++"different plugins. On this page you can change general settings for the " ++"collectd daemon." ++msgstr "" ++"Collectd és un petit dimoni per recollir dades de diverses fonts a través " ++"dels connectors. En aquesta pàgina podeu canviar la configuració general del " ++"dimoni Collectd." ++ ++msgid "Conntrack" ++msgstr "Conntrack" ++ ++msgid "Conntrack Plugin Configuration" ++msgstr "Configuració del connector Conntrack" ++ ++msgid "DF Plugin Configuration" ++msgstr "Configuració del connector DF" ++ ++msgid "DNS" ++msgstr "DNS" ++ ++msgid "DNS Plugin Configuration" ++msgstr "Configuració del connector DNS" ++ ++msgid "Data collection interval" ++msgstr "Interval de recol·lecció de dades" ++ ++msgid "Datasets definition file" ++msgstr "Fitxer de definició de dades" ++ ++msgid "Destination ip range" ++msgstr "Rang d'IP destí" ++ ++msgid "Directory for collectd plugins" ++msgstr "Directori pels connectors connectd" ++ ++msgid "Directory for sub-configurations" ++msgstr "Directori per sub-configuracions" ++ ++msgid "Disk Plugin Configuration" ++msgstr "Configuració del connector de disc" ++ ++msgid "Disk Space Usage" ++msgstr "Ús d'espai en disc" ++ ++msgid "Disk Usage" ++msgstr "Ús de disc" ++ ++msgid "Display Host »" ++msgstr "Mostra el host »" ++ ++msgid "Display timespan »" ++msgstr "Mostra l'hora" ++ ++msgid "E-Mail Plugin Configuration" ++msgstr "Configuració del connector d'adreça electrònica" ++ ++msgid "Email" ++msgstr "Adreça electrònica" ++ ++msgid "Enable this plugin" ++msgstr "Activa aquest connector" ++ ++msgid "Exec" ++msgstr "Exec" ++ ++msgid "Exec Plugin Configuration" ++msgstr "Configuració del connector exec" ++ ++msgid "Filter class monitoring" ++msgstr "Monitoreig de classe filter" ++ ++msgid "Firewall" ++msgstr "Tallafocs" ++ ++msgid "Flush cache after" ++msgstr "Neteja la memòria cau després de" ++ ++msgid "Forwarding between listen and server addresses" ++msgstr "Readreçant entre adreces que reben connexions i adreces de servidors" ++ ++msgid "Graphs" ++msgstr "Gràfics" ++ ++msgid "Group" ++msgstr "Grup" ++ ++msgid "" ++"Here you can define external commands which will be started by collectd in " ++"order to read certain values. The values will be read from stdout." ++msgstr "" ++"Ací pots definir ordres externes que s'iniciaran pel collectd per llegir " ++"certs valors. Els valors es llegiran des del stdout" ++ ++msgid "" ++"Here you can define external commands which will be started by collectd when " ++"certain threshold values have been reached. The values leading to invokation " ++"will be feeded to the the called programs stdin." ++msgstr "" ++"Ací pots definir ordres externes que s'iniciaran pel collectd quan s'aribi a " ++"uns certs valors llindars. Els valors que condueixin a la invocació, " ++"alimentaran als programes stdin" ++ ++msgid "" ++"Here you can define various criteria by which the monitored iptables rules " ++"are selected." ++msgstr "" ++"Ací pots definir diversos criteris pels que es seleccionaran les regles " ++"iptables monitoritzades ." ++ ++msgid "Host" ++msgstr "Host" ++ ++msgid "Hostname" ++msgstr "Nom de host" ++ ++msgid "IP or hostname where to get the txtinfo output from" ++msgstr "" ++ ++msgid "IRQ Plugin Configuration" ++msgstr "Configuració de connector IRQ" ++ ++msgid "Ignore source addresses" ++msgstr "Ignora adreces origen" ++ ++msgid "Incoming interface" ++msgstr "Interfície entrant" ++ ++msgid "Interface Plugin Configuration" ++msgstr "Configuració de connector d'interfície" ++ ++msgid "Interfaces" ++msgstr "Interfícies" ++ ++msgid "Interrupts" ++msgstr "Interrupcions" ++ ++msgid "Interval for pings" ++msgstr "" ++ ++msgid "Iptables Plugin Configuration" ++msgstr "Configuració del connector iptables" ++ ++msgid "Leave unselected to automatically determine interfaces to monitor." ++msgstr "" ++ ++msgid "Listen host" ++msgstr "Màquina que rep connexions" ++ ++msgid "Listen port" ++msgstr "Port que rep connexions" ++ ++msgid "Listener interfaces" ++msgstr "Interfícies que reben connexions" ++ ++msgid "Load Plugin Configuration" ++msgstr "Configuració de connector de càrrega" ++ ++msgid "Maximum allowed connections" ++msgstr "Connexions màximes permeses" ++ ++msgid "Memory" ++msgstr "Memòria" ++ ++msgid "Memory Plugin Configuration" ++msgstr "Configuració del connector de memòria" ++ ++msgid "Monitor all except specified" ++msgstr "" ++ ++msgid "Monitor all local listen ports" ++msgstr "Monitoritza tots els ports locals que reben connexions" ++ ++msgid "Monitor devices" ++msgstr "Monitoritza dispositius" ++ ++msgid "Monitor disks and partitions" ++msgstr "Monitoritza els discs i les particions" ++ ++msgid "Monitor filesystem types" ++msgstr "Monitoritza els tipus de sistema de fitxers" ++ ++msgid "Monitor hosts" ++msgstr "Monitoritza màquines" ++ ++msgid "Monitor interfaces" ++msgstr "Monitoritza hosts" ++ ++msgid "Monitor interrupts" ++msgstr "Monitoritza interrupcions" ++ ++msgid "Monitor local ports" ++msgstr "Monitoritza els ports locals" ++ ++msgid "Monitor mount points" ++msgstr "Monitoritza punts de muntatge" ++ ++msgid "Monitor processes" ++msgstr "Monitoritza processos" ++ ++msgid "Monitor remote ports" ++msgstr "Monitoritza els ports remots" ++ ++msgid "Name of the rule" ++msgstr "Nom de la regla" ++ ++msgid "Netlink" ++msgstr "Enllaç de xarxa" ++ ++msgid "Netlink Plugin Configuration" ++msgstr "Configuració del connector d'enllaç de xarxa" ++ ++msgid "Network" ++msgstr "Xarxa" ++ ++msgid "Network Plugin Configuration" ++msgstr "Configuració del connector de xarxa" ++ ++msgid "Network plugins" ++msgstr "Connectors de xarxa" ++ ++msgid "Network protocol" ++msgstr "Protocol de xarxa" ++ ++msgid "Number of threads for data collection" ++msgstr "Número de fils de recol·lecció de dades" ++ ++msgid "OLSRd" ++msgstr "OLSRd" ++ ++msgid "OLSRd Plugin Configuration" ++msgstr "Configuració del connector OLSRd" ++ ++msgid "Only create average RRAs" ++msgstr "Crea només RRAs mitjans" ++ ++msgid "Options" ++msgstr "Opcions" ++ ++msgid "Outgoing interface" ++msgstr "Interfície sortint" ++ ++msgid "Output plugins" ++msgstr "Connectors de sortida" ++ ++msgid "Ping" ++msgstr "Ping" ++ ++msgid "Ping Plugin Configuration" ++msgstr "Configuració del connector ping" ++ ++msgid "Port" ++msgstr "Port" ++ ++msgid "Processes" ++msgstr "Processos" ++ ++msgid "Processes Plugin Configuration" ++msgstr "Configuració del connector de processos" ++ ++msgid "Processes to monitor separated by space" ++msgstr "" ++ ++msgid "Processor" ++msgstr "Processador" ++ ++msgid "Qdisc monitoring" ++msgstr "Monitoreig Qdisc" ++ ++msgid "RRD XFiles Factor" ++msgstr "Factor RRD XFiles" ++ ++msgid "RRD heart beat interval" ++msgstr "Interval de batec de cor RRD" ++ ++msgid "RRD step interval" ++msgstr "Interval de pas RRD" ++ ++msgid "RRDTool" ++msgstr "RRDTool" ++ ++msgid "RRDTool Plugin Configuration" ++msgstr "Configuració del connector RRDTool" ++ ++msgid "Rows per RRA" ++msgstr "Files per RRA" ++ ++msgid "Script" ++msgstr "" ++ ++msgid "Seconds" ++msgstr "Segons" ++ ++msgid "Server host" ++msgstr "Màquina servidor" ++ ++msgid "Server port" ++msgstr "Port del servidor" ++ ++msgid "Shaping class monitoring" ++msgstr "Monitoreig de classe shaping" ++ ++msgid "Socket file" ++msgstr "Fitxer d'endoll" ++ ++msgid "Socket group" ++msgstr "Grup d'endoll" ++ ++msgid "Socket permissions" ++msgstr "Permisos d'endoll" ++ ++msgid "Source ip range" ++msgstr "Rang d'IP origen" ++ ++msgid "Specifies what information to collect about links." ++msgstr "Especifica què informació es recull sobre enllaços." ++ ++msgid "Specifies what information to collect about routes." ++msgstr "Especifica què informació es recull sobre rutes." ++ ++msgid "Specifies what information to collect about the global topology." ++msgstr "Especifica què informació es recull sobre la topologia global." ++ ++msgid "Splash Leases" ++msgstr "" ++ ++msgid "Splash Leases Plugin Configuration" ++msgstr "" ++ ++msgid "Statistics" ++msgstr "Estadístiques" ++ ++msgid "Storage directory" ++msgstr "Directori d'emmagatzematge" ++ ++msgid "Storage directory for the csv files" ++msgstr "Directori d'emmagatzematge dels fitxers CSV" ++ ++msgid "Store data values as rates instead of absolute values" ++msgstr "" ++"Emmagatzema els valors de dades com a relacions en comptes de com a valors " ++"absoluts" ++ ++msgid "Stored timespans" ++msgstr "Marques de temps emmagatzemades" ++ ++msgid "System Load" ++msgstr "Càrrega de sistema" ++ ++msgid "System plugins" ++msgstr "Connectors de sistema" ++ ++msgid "TCP Connections" ++msgstr "Connexions TCP" ++ ++msgid "TCPConns Plugin Configuration" ++msgstr "Configuració de connector TCPConns" ++ ++msgid "TTL for network packets" ++msgstr "TTL pels paquets de xarxa" ++ ++msgid "TTL for ping packets" ++msgstr "TTL per paquets ping" ++ ++msgid "Table" ++msgstr "Taula" ++ ++msgid "The NUT plugin reads information about Uninterruptible Power Supplies." ++msgstr "" ++ ++msgid "" ++"The OLSRd plugin reads information about meshed networks from the txtinfo " ++"plugin of OLSRd." ++msgstr "" ++ ++msgid "" ++"The conntrack plugin collects statistics about the number of tracked " ++"connections." ++msgstr "" ++ ++msgid "The cpu plugin collects basic statistics about the processor usage." ++msgstr "" ++"El connector de cpu recull estadístiques bàsiques sobre l'ús del processador." ++ ++msgid "" ++"The csv plugin stores collected data in csv file format for further " ++"processing by external programs." ++msgstr "" ++"El connector CSV desa les dades recollides en format CSV per ser processades " ++"posteriorment per programes externs." ++ ++msgid "" ++"The df plugin collects statistics about the disk space usage on different " ++"devices, mount points or filesystem types." ++msgstr "" ++"El connector DF recull dades sobre l'ús d'espai en disc de diferents " ++"dispositius, punts de muntatge i tipus de sistema de fitxers." ++ ++msgid "" ++"The disk plugin collects detailled usage statistics for selected partitions " ++"or whole disks." ++msgstr "" ++"El connector de disc recull estadístiques d'ús detallades per les particions " ++"seleccionades o per tot el disc." ++ ++msgid "" ++"The dns plugin collects detailled statistics about dns related traffic on " ++"selected interfaces." ++msgstr "" ++"El connector DNS recull estadístiques detallades sobre el tràfic DNS a les " ++"interfícies seleccionades." ++ ++msgid "" ++"The email plugin creates a unix socket which can be used to transmit email-" ++"statistics to a running collectd daemon. This plugin is primarily intended " ++"to be used in conjunction with Mail::SpamAssasin::Plugin::Collectd but can " ++"be used in other ways as well." ++msgstr "" ++"El connector d'adreça electrònica crea un socket unix que es pot utilitzar " ++"per transmetre estadístiques d'email a un dimoni collectd. Aquest connector " ++"es fa servir en conjunció amb Mail::SpamAssassin::Plugin. Plugin::Collectd " ++"també es pot utilitzar d'altres maneres." ++ ++msgid "" ++"The exec plugin starts external commands to read values from or to notify " ++"external processes when certain threshold values have been reached." ++msgstr "" ++"El connector exec inicia ordres externes per llegir valors des de o a " ++"processos externs quan s'arriba a certs valors de llindar." ++ ++msgid "" ++"The interface plugin collects traffic statistics on selected interfaces." ++msgstr "" ++"El connector d'interfície recull estadístiques de tràfic a les interfícies " ++"seleccionades." ++ ++msgid "" ++"The iptables plugin will monitor selected firewall rules and collect " ++"informations about processed bytes and packets per rule." ++msgstr "" ++"El connector iptables monitoritzarà les regles de tallafocs seleccionades i " ++"recollirà informacions sobre els bytes i paquests processats per regla." ++ ++msgid "" ++"The irq plugin will monitor the rate of issues per second for each selected " ++"interrupt. If no interrupt is selected then all interrupts are monitored." ++msgstr "" ++"El connector IRQ monitoritzarà la taxa de qüestions per segon per cada " ++"interrupció seleccionada. Si no se selecciona cap interrupció, es " ++"monitoritzen totes les interrupcions." ++ ++msgid "" ++"The iwinfo plugin collects statistics about wireless signal strength, noise " ++"and quality." ++msgstr "" ++"El connector iwinfo recull estadístiques sobre la força de senyal, soroll i " ++"qualitat sense fil." ++ ++msgid "The load plugin collects statistics about the general system load." ++msgstr "" ++"El connector de càrrega recull estadístiques sobre la càrrega de sistema " ++"general." ++ ++msgid "The memory plugin collects statistics about the memory usage." ++msgstr "El connector de memòria recull estadístiques sobre l'ús de memòria." ++ ++msgid "" ++"The netlink plugin collects extended informations like qdisc-, class- and " ++"filter-statistics for selected interfaces." ++msgstr "" ++"El connector d'enllaç de xarxa recull informació extensa com estadístiques " ++"de qdisc-, class- i filter- per les interfícies seleccionades." ++ ++msgid "" ++"The network plugin provides network based communication between different " ++"collectd instances. Collectd can operate both in client and server mode. In " ++"client mode locally collected data is transferred to a collectd server " ++"instance, in server mode the local instance receives data from other hosts." ++msgstr "" ++"El connector de xarxa proporciona comunicacions basades en xarxa entre " ++"diferents instàncies de collectd. El collectd pot operar tan en mode " ++"servidor com client. En el client mode les dades recollides localment es " ++"transferiran a la instància del servidor de collectd, en el mode servidor la " ++"instància rep dades de les altres màquines." ++ ++msgid "" ++"The ping plugin will send icmp echo replies to selected hosts and measure " ++"the roundtrip time for each host." ++msgstr "" ++"El connector de ping enviarà ICMP Echo Replies a les màquines seleccionades " ++"i mesurarà el temps d'anada i tornada en cada màquina." ++ ++msgid "" ++"The processes plugin collects informations like cpu time, page faults and " ++"memory usage of selected processes." ++msgstr "" ++"El connector de processor recollirà informacions com el temps de cpu, errors " ++"de pàgina i ús de memòria dels processos seleccionats." ++ ++msgid "" ++"The rrdtool plugin stores the collected data in rrd database files, the " ++"foundation of the diagrams.

    Warning: Setting the wrong " ++"values will result in a very high memory consumption in the temporary " ++"directory. This can render the device unusable!" ++msgstr "" ++"El connector RRDTool desa les dades recollides als fitxers de base de dades " ++"RRD, la base dels diagrames.

    Alerta: Establir els valors " ++"incorrectes comportarà un consum molt alt de memòria al directori temporal. " ++"Això pot inutilitzar el dispositiu!" ++ ++msgid "" ++"The splash leases plugin uses libuci to collect statistics about splash " ++"leases." ++msgstr "" ++ ++msgid "" ++"The statistics package is based on Collectd and uses RRD " ++"Tool to render diagram images from collected data." ++msgstr "" ++"El paquet d'estadísitiques està basat en Collectd i utilitza l'eina RRD per renderitzar imatges de diagrama de les dades " ++"recoliildes." ++ ++msgid "" ++"The tcpconns plugin collects informations about open tcp connections on " ++"selected ports." ++msgstr "" ++"El connector TCPConns recull informació sobre les connexions TCP obertes en " ++"els ports seleccionats." ++ ++msgid "" ++"The unixsock plugin creates a unix socket which can be used to read " ++"collected data from a running collectd instance." ++msgstr "" ++"El connector unixsock crea un socket Unix que es pot fer servir per llegir " ++"dades recollides d'una instància collectd." ++ ++msgid "The uptime plugin collects statistics about the uptime of the system." ++msgstr "" ++ ++msgid "" ++"This section defines on which interfaces collectd will wait for incoming " ++"connections." ++msgstr "" ++"Aquesta secció defineix en quines interfícies el collectd rebrà connexions " ++"entrants." ++ ++msgid "" ++"This section defines to which servers the locally collected data is sent to." ++msgstr "" ++"Aquesta secció defineix a quins servidors s'enviaran les dades recollides " ++"localment." ++ ++msgid "Try to lookup fully qualified hostname" ++msgstr "Intenta resoldre el nom de màquina (fqdn)" ++ ++msgid "UPS" ++msgstr "UPS" ++ ++msgid "UPS Plugin Configuration" ++msgstr "Configuració del connector UPS" ++ ++msgid "UPS name in NUT ups@host format" ++msgstr "Nom UPS en format NUT ups@host" ++ ++msgid "UnixSock" ++msgstr "Sock Unix" ++ ++msgid "Unixsock Plugin Configuration" ++msgstr "Configuració de connector Unixsock" ++ ++msgid "Uptime" ++msgstr "" ++ ++msgid "Uptime Plugin Configuration" ++msgstr "" ++ ++msgid "Used PID file" ++msgstr "Fitxer PID usat" ++ ++msgid "User" ++msgstr "Usuari" ++ ++msgid "Verbose monitoring" ++msgstr "Monitoreig detallat" ++ ++msgid "Wireless" ++msgstr "Wireless" ++ ++msgid "Wireless iwinfo Plugin Configuration" ++msgstr "" ++ ++msgid "e.g. br-ff" ++msgstr "p.e. br-ff" ++ ++msgid "e.g. br-lan" ++msgstr "p.e. br-lan" ++ ++msgid "e.g. reject-with tcp-reset" ++msgstr "p.e. reject-with tcp-reset" ++ ++msgid "max. 16 chars" ++msgstr "màx. 16 caràcters" ++ ++msgid "reduces rrd size" ++msgstr "redueix mida RRD" ++ ++msgid "seconds; multiple separated by space" ++msgstr "segons; múltiples separats per espais" ++ ++msgid "server interfaces" ++msgstr "interfícies de servidor" ++ ++#~ msgid "" ++#~ "The wireless plugin collects statistics about wireless signal strength, " ++#~ "noise and quality." ++#~ msgstr "" ++#~ "El connector Wireless recull estadístiques sobre la potència del senyal " ++#~ "sense fils, el soroll i la qualitat." ++ ++#~ msgid "Wireless Plugin Configuration" ++#~ msgstr "Configuració del connector Wireless" +diff --git a/feeds/luci/applications/luci-app-statistics/po/cs/rrdtool.po b/feeds/luci/applications/luci-app-statistics/po/cs/rrdtool.po +new file mode 100644 +index 0000000..e6149ec +--- /dev/null ++++ b/feeds/luci/applications/luci-app-statistics/po/cs/rrdtool.po +@@ -0,0 +1,359 @@ ++# rrdtool.pot ++# generated from ./applications/luci-statistics/luasrc/i18n/rrdtool.en.lua ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"PO-Revision-Date: 2014-07-12 20:35+0200\n" ++"Last-Translator: koli \n" ++"Language-Team: none\n" ++"Language: cs\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++#. %H: Wireless - Signal Noise Ratio ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:1 ++msgid "stat_dg_title_wireless__signal_noise" ++msgstr "Bezdrátová síť - Úroveň Å¡umu" ++ ++#. dBm ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:2 ++msgid "stat_dg_label_wireless__signal_noise" ++msgstr "dBm" ++ ++#. Noise Level ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:3 ++msgid "stat_ds_signal_noise" ++msgstr "Úroveň Å¡umu" ++ ++#. Signal Strength ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:4 ++msgid "stat_ds_signal_power" ++msgstr "Síla signálu" ++ ++#. %H: Wireless - Signal Quality ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:5 ++msgid "stat_dg_title_wireless__signal_quality" ++msgstr "%H: Wireless - kvalita signálu" ++ ++#. n ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:6 ++msgid "stat_dg_label_wireless__signal_quality" ++msgstr "n" ++ ++#. Signal Quality ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:7 ++msgid "stat_ds_signal_quality" ++msgstr "Kvalita signálu" ++ ++#. %H: ICMP Roundtrip Times ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:8 ++msgid "stat_dg_title_ping" ++msgstr "%H: ICMP Äasy odezvy" ++ ++#. ms ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:9 ++msgid "stat_dg_label_ping" ++msgstr "ms" ++ ++#. %di ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:10 ++msgid "stat_ds_ping" ++msgstr "%di" ++ ++#. %H: Firewall - Processed Packets ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:11 ++msgid "stat_dg_title_iptables__ipt_packets" ++msgstr "%H: Firewall - zpracované pakety" ++ ++#. Packets/s ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:12 ++msgid "stat_dg_label_iptables__ipt_packets" ++msgstr "Pakety/s" ++ ++#. Chain \"%di\" ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:13 ++msgid "stat_ds_ipt_packets" ++msgstr "ŘetÄ›z \\\"%di\\\"" ++ ++#. %H: Netlink - Transfer on %pi ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:14 ++msgid "stat_dg_title_netlink__if_octets" ++msgstr "%H: Netlink - pÅ™enos na %pi" ++ ++#. Bytes/s ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:15 ++msgid "stat_dg_label_netlink__if_octets" ++msgstr "Bajty/s" ++ ++#. Bytes (%ds) ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:16 ++msgid "stat_ds_if_octets" ++msgstr "Bajty (%ds)" ++ ++#. %H: Netlink - Packets on %pi ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:17 ++msgid "stat_dg_title_netlink__if_packets" ++msgstr "%H: Netlink - pakety na %pi" ++ ++#. Packets/s ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:18 ++msgid "stat_dg_label_netlink__if_packets" ++msgstr "Pakety/s" ++ ++#. Processed (%ds) ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:19 ++msgid "stat_ds_if_packets" ++msgstr "Zpracováno (%ds)" ++ ++#. Dropped (%ds) ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:20 ++msgid "stat_ds_if_dropped" ++msgstr "Zahozeno (%ds)" ++ ++#. Errors (%ds) ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:21 ++msgid "stat_ds_if_errors" ++msgstr "Chyby (%ds)" ++ ++#. %H: Netlink - Multicast on %pi ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:22 ++msgid "stat_dg_title_netlink__if_multicast" ++msgstr "%H: Netlink - multicast na %pi" ++ ++#. Packets/s ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:23 ++msgid "stat_dg_label_netlink__if_multicast" ++msgstr "Pakety/s" ++ ++#. Packets ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:24 ++msgid "stat_ds_if_multicast" ++msgstr "Pakety" ++ ++#. %H: Netlink - Collisions on %pi ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:25 ++msgid "stat_dg_title_netlink__if_collisions" ++msgstr "%H: Netlink - kolize na %pi" ++ ++#. Collisions/s ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:26 ++msgid "stat_dg_label_netlink__if_collisions" ++msgstr "Kolize/s" ++ ++#. Collisions ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:27 ++msgid "stat_ds_if_collisions" ++msgstr "Kolize" ++ ++#. %H: Netlink - Errors on %pi ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:28 ++msgid "stat_dg_title_netlink__if_tx_errors" ++msgstr "%H: Netlink - chyby na %pi" ++ ++#. Errors/s ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:29 ++msgid "stat_dg_label_netlink__if_tx_errors" ++msgstr "Chyby/s" ++ ++#. %di ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:30 ++msgid "stat_ds_if_tx_errors" ++msgstr "%di" ++ ++#. %di ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:31 ++msgid "stat_ds_if_rx_errors" ++msgstr "%di" ++ ++#. %H: Processes ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:32 ++msgid "stat_dg_title_processes" ++msgstr "%H: Procesy" ++ ++#. Processes/s ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:33 ++msgid "stat_dg_label_processes" ++msgstr "Procesy/s" ++ ++#. %di ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:34 ++msgid "stat_ds_ps_state" ++msgstr "%di" ++ ++#. %H: Process %pi - used cpu time ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:35 ++msgid "stat_dg_title_processes__ps_cputime" ++msgstr "%H: Proces %pi - Äas využití CPU" ++ ++#. Jiffies ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:36 ++msgid "stat_dg_label_processes__ps_cputime" ++msgstr "Jiffies" ++ ++#. system ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:37 ++msgid "stat_ds_ps_cputime__syst" ++msgstr "systém" ++ ++#. user ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:38 ++msgid "stat_ds_ps_cputime__user" ++msgstr "uživatel" ++ ++#. %H: Process %pi - threads and processes ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:39 ++msgid "stat_dg_title_processes__ps_count" ++msgstr "%H: Proces %pi - vlákna a procesy" ++ ++#. Count ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:40 ++msgid "stat_dg_label_processes__ps_count" ++msgstr "PoÄet" ++ ++#. %ds ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:41 ++msgid "stat_ds_ps_count" ++msgstr "%ds" ++ ++#. %H: Process %pi - page faults ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:42 ++msgid "stat_dg_title_processes__ps_pagefaults" ++msgstr "%H: Process %pi - chyby stránkování" ++ ++#. Pagefaults ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:43 ++msgid "stat_dg_label_processes__ps_pagefaults" ++msgstr "Chyby stránkování" ++ ++#. page faults ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:44 ++msgid "stat_ds_ps_pagefaults" ++msgstr "chyby stránkování" ++ ++#. %H: Process %pi - virtual memory size ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:45 ++msgid "stat_dg_title_processes__ps_rss" ++msgstr "%H: Proces %pi - velikost virtuální pamÄ›ti" ++ ++#. Bytes ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:46 ++msgid "stat_dg_label_processes__ps_rss" ++msgstr "Bajty" ++ ++#. virtual memory ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:47 ++msgid "stat_ds_ps_rss" ++msgstr "virtuální paměť" ++ ++#. %H: Usage on Processor #%pi ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:48 ++msgid "stat_dg_title_cpu" ++msgstr "%H: Vytížení procesoru #%pi" ++ ++#. % ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:49 ++msgid "stat_dg_label_cpu" ++msgstr "%" ++ ++#. %di ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:50 ++msgid "stat_ds_cpu" ++msgstr "%di" ++ ++#. %H: Transfer on %di ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:51 ++msgid "stat_dg_title_interface__if_octets" ++msgstr "%H: PÅ™enos na %di" ++ ++#. Bytes/s ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:52 ++msgid "stat_dg_label_interface__if_octets" ++msgstr "Bajty/s" ++ ++#. %H: Packets on %di ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:53 ++msgid "stat_dg_title_interface__if_packets" ++msgstr "%H: Pakety na %di" ++ ++#. Packets/s ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:54 ++msgid "stat_dg_label_interface__if_packets" ++msgstr "Pakety/s" ++ ++#. %H: TCP-Connections to Port %pi ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:55 ++msgid "stat_dg_title_tcpconns" ++msgstr "%H: TCP-spojení na portu %pi" ++ ++#. Connections/s ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:56 ++msgid "stat_dg_label_tcpconns" ++msgstr "Spojení/s" ++ ++#. %di ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:57 ++msgid "stat_ds_tcp_connections" ++msgstr "%di" ++ ++#. %H: Disk Space Usage on %di ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:58 ++msgid "stat_dg_title_df" ++msgstr "%H: Využití diskového prostoru na %di" ++ ++#. Bytes ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:59 ++msgid "stat_dg_label_df" ++msgstr "Bajty" ++ ++#. %ds ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:60 ++msgid "stat_ds_df__free" ++msgstr "%ds" ++ ++#. %ds ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:61 ++msgid "stat_ds_df__used" ++msgstr "%ds" ++ ++#. %H: Interrupts ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:62 ++msgid "stat_dg_title_irq" ++msgstr "%H: PÅ™eruÅ¡ení" ++ ++#. Issues/s ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:63 ++msgid "stat_dg_label_irq" ++msgstr "Problémy/s" ++ ++#. IRQ %di ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:64 ++msgid "stat_ds_irq" ++msgstr "IRQ %di" ++ ++#. %H: System Load ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:65 ++msgid "stat_dg_title_load" ++msgstr "%H Zatížení systému" ++ ++#. Load ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:66 ++msgid "stat_dg_label_load" ++msgstr "Zatížení" ++ ++#. 1 min ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:67 ++msgid "stat_ds_load__shortterm" ++msgstr "1 min" ++ ++#. 5 min ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:68 ++msgid "stat_ds_load__midterm" ++msgstr "5 min" ++ ++#. 15 min ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:69 ++msgid "stat_ds_load__longterm" ++msgstr "15 min" +diff --git a/feeds/luci/applications/luci-app-statistics/po/cs/statistics.po b/feeds/luci/applications/luci-app-statistics/po/cs/statistics.po +new file mode 100644 +index 0000000..9a3ab67 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-statistics/po/cs/statistics.po +@@ -0,0 +1,709 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"PO-Revision-Date: 2014-06-21 17:44+0200\n" ++"Last-Translator: koli \n" ++"Language-Team: none\n" ++"Language: cs\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "Action (target)" ++msgstr "Akce (cíl)" ++ ++msgid "Add command for reading values" ++msgstr "PÅ™idat příkaz pro Ätení hodnot" ++ ++msgid "Add matching rule" ++msgstr "PÅ™idat pravidlo pro výbÄ›r" ++ ++msgid "Add multiple hosts separated by space." ++msgstr "PÅ™idat více hostů, oddÄ›lených mezerou" ++ ++msgid "Add notification command" ++msgstr "PÅ™idat příkaz pro upozornÄ›ní" ++ ++msgid "Base Directory" ++msgstr "Základní adresář" ++ ++msgid "Basic monitoring" ++msgstr "Základní sledování" ++ ++msgid "CPU Plugin Configuration" ++msgstr "Nastavení CPU pluginu" ++ ++msgid "CSV Output" ++msgstr "CSV výstup" ++ ++msgid "CSV Plugin Configuration" ++msgstr "Nastavení CSV pluginu" ++ ++msgid "Cache collected data for" ++msgstr "MezipamÄ›t pro ukládání dat" ++ ++msgid "Cache flush interval" ++msgstr "Interval vyprazdňování mezipamÄ›ti" ++ ++msgid "Chain" ++msgstr "ŘetÄ›z" ++ ++msgid "CollectLinks" ++msgstr "CollectLinks" ++ ++msgid "CollectRoutes" ++msgstr "CollectRoutes" ++ ++msgid "CollectTopology" ++msgstr "CollectTopology" ++ ++msgid "Collectd" ++msgstr "Collectd" ++ ++msgid "Collectd Settings" ++msgstr "Nastavení Collectd" ++ ++msgid "" ++"Collectd is a small daemon for collecting data from various sources through " ++"different plugins. On this page you can change general settings for the " ++"collectd daemon." ++msgstr "" ++"Collectd je malý daemon pro shromažÄování dat z nejrůznÄ›jších zdrojů zkrz " ++"rozdílné pluginy. Na této stránce můžete zmÄ›nit obecná nastavení daemonu " ++"collectd." ++ ++msgid "Conntrack" ++msgstr "Conntrack" ++ ++msgid "Conntrack Plugin Configuration" ++msgstr "Nastavení pluginu Conntrack" ++ ++msgid "DF Plugin Configuration" ++msgstr "Nastavení pluginu DF" ++ ++msgid "DNS" ++msgstr "DNS" ++ ++msgid "DNS Plugin Configuration" ++msgstr "Nastavení DNS pluginu" ++ ++msgid "Data collection interval" ++msgstr "Interval sbÄ›ru dat" ++ ++msgid "Datasets definition file" ++msgstr "" ++ ++msgid "Destination ip range" ++msgstr "Rozsah cílových IP adres" ++ ++msgid "Directory for collectd plugins" ++msgstr "Adresář s pluginy pro collectd" ++ ++msgid "Directory for sub-configurations" ++msgstr "Adresář pro pod-nastavení" ++ ++msgid "Disk Plugin Configuration" ++msgstr "Nastavení Disk pluginu" ++ ++msgid "Disk Space Usage" ++msgstr "Využití místa na disku" ++ ++msgid "Disk Usage" ++msgstr "Využití disku" ++ ++msgid "Display Host »" ++msgstr "Zobrazit hostitele »" ++ ++msgid "Display timespan »" ++msgstr "Zobrazit Äasové rozpÄ›tí »" ++ ++msgid "E-Mail Plugin Configuration" ++msgstr "Nastavení E-Mail pluginu" ++ ++msgid "Email" ++msgstr "Email" ++ ++msgid "Enable this plugin" ++msgstr "Povolit tento plugin" ++ ++msgid "Exec" ++msgstr "Exec" ++ ++msgid "Exec Plugin Configuration" ++msgstr "Nastavení pluginu Exec" ++ ++msgid "Filter class monitoring" ++msgstr "" ++ ++msgid "Firewall" ++msgstr "Firewall" ++ ++msgid "Flush cache after" ++msgstr "Vyprázdnit cache po" ++ ++msgid "Forwarding between listen and server addresses" ++msgstr "" ++ ++msgid "Graphs" ++msgstr "Grafy" ++ ++msgid "Group" ++msgstr "Skupina" ++ ++msgid "" ++"Here you can define external commands which will be started by collectd in " ++"order to read certain values. The values will be read from stdout." ++msgstr "" ++"Zde můžete nastavit externí příkazy, které budou spuÅ¡tÄ›ny v tomto poÅ™adí " ++"daemonem collectd. Ze standardního výstupu příkazů vezme collectd potÅ™ebné " ++"hodnoty." ++ ++msgid "" ++"Here you can define external commands which will be started by collectd when " ++"certain threshold values have been reached. The values leading to invokation " ++"will be feeded to the the called programs stdin." ++msgstr "" ++ ++msgid "" ++"Here you can define various criteria by which the monitored iptables rules " ++"are selected." ++msgstr "" ++"Zde můžete definovat různá kritéria, podle kterých budou vybrána sledovaná " ++"pravidla iptables." ++ ++msgid "Host" ++msgstr "Hostitel" ++ ++msgid "Hostname" ++msgstr "Hostname" ++ ++msgid "IP or hostname where to get the txtinfo output from" ++msgstr "IP nebo hostname, odkud získat txtinfo výstup" ++ ++msgid "IRQ Plugin Configuration" ++msgstr "Nastavení IRQ pluginu" ++ ++msgid "Ignore source addresses" ++msgstr "Ignorovat zdrojové adresy" ++ ++msgid "Incoming interface" ++msgstr "Příchozí rozhraní" ++ ++msgid "Interface Plugin Configuration" ++msgstr "Nastavení Interface pluginu" ++ ++msgid "Interfaces" ++msgstr "Rozhraní" ++ ++msgid "Interrupts" ++msgstr "PÅ™eruÅ¡ení" ++ ++msgid "Interval for pings" ++msgstr "Interval pro ping" ++ ++msgid "Iptables Plugin Configuration" ++msgstr "Nastavení Iptables pluginu" ++ ++msgid "Leave unselected to automatically determine interfaces to monitor." ++msgstr "" ++"Pokud nic nevyberete, rozhraní pro monitoring budou urÄena automaticky." ++ ++msgid "Listen host" ++msgstr "Naslouchající hostitel" ++ ++msgid "Listen port" ++msgstr "Naslouchající port" ++ ++msgid "Listener interfaces" ++msgstr "Rozhraní naslouchajícího" ++ ++msgid "Load Plugin Configuration" ++msgstr "NaÄíst nastavení pluginů" ++ ++msgid "Maximum allowed connections" ++msgstr "Maximální množství povolených spojení" ++ ++msgid "Memory" ++msgstr "Paměť" ++ ++msgid "Memory Plugin Configuration" ++msgstr "Nastavení pluginu Memory (Paměť)" ++ ++msgid "Monitor all except specified" ++msgstr "Sledovat vÅ¡e kromÄ› vybraných" ++ ++msgid "Monitor all local listen ports" ++msgstr "Monitorovat vÅ¡echny naslouchající porty" ++ ++msgid "Monitor devices" ++msgstr "Sledovat zařízení" ++ ++msgid "Monitor disks and partitions" ++msgstr "Sledovat disky a oddíly" ++ ++msgid "Monitor filesystem types" ++msgstr "Sledovat typy souborových systémů" ++ ++msgid "Monitor hosts" ++msgstr "Sledovat hostitele" ++ ++msgid "Monitor interfaces" ++msgstr "Sledovat rozhraní" ++ ++msgid "Monitor interrupts" ++msgstr "Sledovat pÅ™eruÅ¡ení" ++ ++msgid "Monitor local ports" ++msgstr "Sledovat místní porty" ++ ++msgid "Monitor mount points" ++msgstr "Sledovat přípojné body" ++ ++msgid "Monitor processes" ++msgstr "Sledovat procesy" ++ ++msgid "Monitor remote ports" ++msgstr "Sledovat vzdálené porty" ++ ++msgid "Name of the rule" ++msgstr "Název pravidla" ++ ++msgid "Netlink" ++msgstr "Netlink" ++ ++msgid "Netlink Plugin Configuration" ++msgstr "Nastavení pluginu Netlink" ++ ++msgid "Network" ++msgstr "Síť" ++ ++msgid "Network Plugin Configuration" ++msgstr "Nastavení pluginu Síť" ++ ++msgid "Network plugins" ++msgstr "Síťové pluginy" ++ ++msgid "Network protocol" ++msgstr "Síťový protokol" ++ ++msgid "Number of threads for data collection" ++msgstr "PoÄet vláken pro sbÄ›r dat" ++ ++msgid "OLSRd" ++msgstr "OLSRd" ++ ++msgid "OLSRd Plugin Configuration" ++msgstr "Nastavení pluginu OLSRd" ++ ++msgid "Only create average RRAs" ++msgstr "" ++ ++msgid "Options" ++msgstr "Možnosti" ++ ++msgid "Outgoing interface" ++msgstr "Odchozí rozhraní" ++ ++msgid "Output plugins" ++msgstr "Výstupní pluginy" ++ ++msgid "Ping" ++msgstr "Ping" ++ ++msgid "Ping Plugin Configuration" ++msgstr "Nastavení pluginu Ping" ++ ++msgid "Port" ++msgstr "Port" ++ ++msgid "Processes" ++msgstr "Procesy" ++ ++msgid "Processes Plugin Configuration" ++msgstr "Nastavení pluginu Procesy" ++ ++msgid "Processes to monitor separated by space" ++msgstr "Sledované procesy (oddÄ›lte mezerou)" ++ ++msgid "Processor" ++msgstr "Procesor" ++ ++msgid "Qdisc monitoring" ++msgstr "Sledování Qdisc" ++ ++#, fuzzy ++msgid "RRD XFiles Factor" ++msgstr "RRD XFiles Factor" ++ ++msgid "RRD heart beat interval" ++msgstr "" ++ ++msgid "RRD step interval" ++msgstr "" ++ ++msgid "RRDTool" ++msgstr "RRDTool" ++ ++msgid "RRDTool Plugin Configuration" ++msgstr "Nastavení pluginu RRDTool" ++ ++msgid "Rows per RRA" ++msgstr "Řádky na jeden RRA" ++ ++msgid "Script" ++msgstr "Skript" ++ ++msgid "Seconds" ++msgstr "Sekundy" ++ ++msgid "Server host" ++msgstr "Hostitel serveru" ++ ++msgid "Server port" ++msgstr "Port serveru" ++ ++msgid "Shaping class monitoring" ++msgstr "" ++ ++msgid "Socket file" ++msgstr "Soubor socketu" ++ ++msgid "Socket group" ++msgstr "Skupina socketů" ++ ++msgid "Socket permissions" ++msgstr "OprávnÄ›ní socketu" ++ ++msgid "Source ip range" ++msgstr "Rozsah zdrojových IP" ++ ++msgid "Specifies what information to collect about links." ++msgstr "UrÄuje, jaké informace sbírat o odkazech." ++ ++msgid "Specifies what information to collect about routes." ++msgstr "UrÄuje, jaké informace sbírat o cestách" ++ ++msgid "Specifies what information to collect about the global topology." ++msgstr "UrÄuje, jaké informace sbírat o globální topologii" ++ ++msgid "Splash Leases" ++msgstr "" ++ ++msgid "Splash Leases Plugin Configuration" ++msgstr "" ++ ++msgid "Statistics" ++msgstr "Statistiky" ++ ++msgid "Storage directory" ++msgstr "Úložný adresář" ++ ++msgid "Storage directory for the csv files" ++msgstr "Úložný adresář pro soubory CSV" ++ ++msgid "Store data values as rates instead of absolute values" ++msgstr "Ukládat data jako pomÄ›rné hodnoty místo absolutních" ++ ++msgid "Stored timespans" ++msgstr "" ++ ++msgid "System Load" ++msgstr "Zatížení systému" ++ ++msgid "System plugins" ++msgstr "Systémové pluginy" ++ ++msgid "TCP Connections" ++msgstr "TCP spojení" ++ ++msgid "TCPConns Plugin Configuration" ++msgstr "Nastavení pluginu TCPConns" ++ ++msgid "TTL for network packets" ++msgstr "TTL pro síťové pakety" ++ ++msgid "TTL for ping packets" ++msgstr "TTL pro pakety pingu" ++ ++msgid "Table" ++msgstr "" ++ ++msgid "The NUT plugin reads information about Uninterruptible Power Supplies." ++msgstr "" ++ ++msgid "" ++"The OLSRd plugin reads information about meshed networks from the txtinfo " ++"plugin of OLSRd." ++msgstr "" ++ ++msgid "" ++"The conntrack plugin collects statistics about the number of tracked " ++"connections." ++msgstr "Plugin Conntrack shromažÄuje statistiky o poÄtu sledovaných spojení." ++ ++msgid "The cpu plugin collects basic statistics about the processor usage." ++msgstr "Plugin CPU shromažÄuje základní statistiky o vytížení procesoru." ++ ++msgid "" ++"The csv plugin stores collected data in csv file format for further " ++"processing by external programs." ++msgstr "" ++"Plugin CSV ukládá shromáždÄ›ná data ve formátu CSV. Data mohou být pozdÄ›ji " ++"zpracována externími programy." ++ ++msgid "" ++"The df plugin collects statistics about the disk space usage on different " ++"devices, mount points or filesystem types." ++msgstr "" ++"Plugin DF shromažÄuje statistiky o využití diskového prostoru na různých " ++"zařízeních, přípojných bodech nebo typech souborových systémů." ++ ++msgid "" ++"The disk plugin collects detailled usage statistics for selected partitions " ++"or whole disks." ++msgstr "" ++"Plugin Disk shromažÄuje podrobné statistiky o využívání vybraného oddílu " ++"nebo celého disku." ++ ++msgid "" ++"The dns plugin collects detailled statistics about dns related traffic on " ++"selected interfaces." ++msgstr "" ++"Plugin DNS shromažÄuje podrobné statistky o provozu, vztahující se k DNS, na " ++"vybraných rozhraních." ++ ++msgid "" ++"The email plugin creates a unix socket which can be used to transmit email-" ++"statistics to a running collectd daemon. This plugin is primarily intended " ++"to be used in conjunction with Mail::SpamAssasin::Plugin::Collectd but can " ++"be used in other ways as well." ++msgstr "" ++"Plugin Email vytváří unixový socket, které může být využit pro odeslání " ++"statistik o emailu běžícímu daemonu collectd. Plugin je primárnÄ› urÄen pro " ++"použití ve spojení s Mail::SpamAssasin::Plugin::Collectd, ale stejnÄ› dobÅ™e " ++"může být využit jinak." ++ ++msgid "" ++"The exec plugin starts external commands to read values from or to notify " ++"external processes when certain threshold values have been reached." ++msgstr "" ++ ++msgid "" ++"The interface plugin collects traffic statistics on selected interfaces." ++msgstr "" ++"Plugin Interface shromažÄuje statistiky o provozu na vybraných rozhraních." ++ ++msgid "" ++"The iptables plugin will monitor selected firewall rules and collect " ++"informations about processed bytes and packets per rule." ++msgstr "" ++"Plugin Iptables monitoruje vybraná pravidla firewallu a shromažÄuje " ++"informace o zpracovaných bajtech a paketech pro každé pravidlo." ++ ++msgid "" ++"The irq plugin will monitor the rate of issues per second for each selected " ++"interrupt. If no interrupt is selected then all interrupts are monitored." ++msgstr "" ++"Plugin IRQ monitoruje množství požadavků na pÅ™eruÅ¡ení pro každé vybrané " ++"pÅ™eruÅ¡ení. Pokud není vybráno žádné pÅ™eruÅ¡ení, jsou monitorována vÅ¡echna." ++ ++msgid "" ++"The iwinfo plugin collects statistics about wireless signal strength, noise " ++"and quality." ++msgstr "" ++"Plugin Iwinfo shromažÄuje statistiky o síle, Å¡umu a kvalitÄ› bezdrátového " ++"signálu." ++ ++msgid "The load plugin collects statistics about the general system load." ++msgstr "Plugin Load shromažÄuje statistiky o obecné zátěži systému." ++ ++msgid "The memory plugin collects statistics about the memory usage." ++msgstr "Plugin Memory shromažÄuje statistiky o využití pamÄ›ti." ++ ++msgid "" ++"The netlink plugin collects extended informations like qdisc-, class- and " ++"filter-statistics for selected interfaces." ++msgstr "" ++"Plugin Netlink shromažÄuje rozšířené informace jako statistiky qdisk, class " ++"a filtru pro vybraná rozhraní." ++ ++msgid "" ++"The network plugin provides network based communication between different " ++"collectd instances. Collectd can operate both in client and server mode. In " ++"client mode locally collected data is transferred to a collectd server " ++"instance, in server mode the local instance receives data from other hosts." ++msgstr "" ++"Plugin Network poskytuje síťovou komunikaci mezi různými instancemi daemonu " ++"collectd. Collectd může pracovat v režimu klienta i serveru. V režimu " ++"klienta jsou lokálnÄ› shromažÄovaná data odeslána instanci serveru, jako " ++"server naopak collectd pÅ™ijímá data z ostatních hostitelů." ++ ++msgid "" ++"The ping plugin will send icmp echo replies to selected hosts and measure " ++"the roundtrip time for each host." ++msgstr "" ++"Plugin Ping bude odesílat ICMP echo odpovÄ›di vybraným hostům a měřit " ++"zpáteÄní Äas pro každého hosta." ++ ++msgid "" ++"The processes plugin collects informations like cpu time, page faults and " ++"memory usage of selected processes." ++msgstr "" ++"Plugin Processes shromažÄuje informace o procesorovém Äasu, výpadcích " ++"stránky a využití pamÄ›ti vybranými programy." ++ ++msgid "" ++"The rrdtool plugin stores the collected data in rrd database files, the " ++"foundation of the diagrams.

    Warning: Setting the wrong " ++"values will result in a very high memory consumption in the temporary " ++"directory. This can render the device unusable!" ++msgstr "" ++"Plugin Rrdtool ukládá shromažÄená data v souborech databáze RRD.

    Varování: Nastavení Å¡patných hodnot bude mít za následek velkou " ++"spotÅ™ebu pamÄ›ti v doÄasném adresáří. Zařízení ze tak může stát nepoužitelným!" ++"" ++ ++msgid "" ++"The splash leases plugin uses libuci to collect statistics about splash " ++"leases." ++msgstr "" ++ ++msgid "" ++"The statistics package is based on Collectd and uses RRD " ++"Tool to render diagram images from collected data." ++msgstr "" ++"BalíÄek Statistiky je založen na Collectd a využívá RRD " ++"Tool pro kreslení diagramů z collectd." ++ ++msgid "" ++"The tcpconns plugin collects informations about open tcp connections on " ++"selected ports." ++msgstr "" ++"Plugin Tcpconns shromažÄuje informace o otevÅ™ených TCP spojeních na " ++"vybraných portech." ++ ++msgid "" ++"The unixsock plugin creates a unix socket which can be used to read " ++"collected data from a running collectd instance." ++msgstr "" ++"Plugin Unixsock vytváří unixový socket, které může být využit pro Ätení dat " ++"z běžící instance collectd." ++ ++msgid "The uptime plugin collects statistics about the uptime of the system." ++msgstr "" ++ ++msgid "" ++"This section defines on which interfaces collectd will wait for incoming " ++"connections." ++msgstr "" ++"Tato sekce urÄuje, na kterých rozhraních bude collectd Äekat na příchozí " ++"spojení." ++ ++msgid "" ++"This section defines to which servers the locally collected data is sent to." ++msgstr "Tato sekce urÄuje, na které servery budou odeslána shromáždÄ›ná data." ++ ++msgid "Try to lookup fully qualified hostname" ++msgstr "" ++ ++msgid "UPS" ++msgstr "UPS" ++ ++msgid "UPS Plugin Configuration" ++msgstr "Konfigurace pluginu UPS" ++ ++msgid "UPS name in NUT ups@host format" ++msgstr "" ++ ++msgid "UnixSock" ++msgstr "UnixSock" ++ ++msgid "Unixsock Plugin Configuration" ++msgstr "Konfigurace pluginu Unixsock" ++ ++msgid "Uptime" ++msgstr "" ++ ++msgid "Uptime Plugin Configuration" ++msgstr "" ++ ++msgid "Used PID file" ++msgstr "Použitý soubor PID (identifikátoru procesu)" ++ ++msgid "User" ++msgstr "Uživatel" ++ ++msgid "Verbose monitoring" ++msgstr "Podrobný monitoring" ++ ++msgid "Wireless" ++msgstr "Wireless" ++ ++msgid "Wireless iwinfo Plugin Configuration" ++msgstr "Nastavení pluginu Wireless Iwinfo" ++ ++msgid "e.g. br-ff" ++msgstr "napÅ™. br-ff" ++ ++msgid "e.g. br-lan" ++msgstr "napÅ™. br-lan" ++ ++msgid "e.g. reject-with tcp-reset" ++msgstr "napÅ™. reject-with tcp-reset" ++ ++msgid "max. 16 chars" ++msgstr "max. 16 znaků" ++ ++msgid "reduces rrd size" ++msgstr "redukovaná velikost rrd" ++ ++msgid "seconds; multiple separated by space" ++msgstr "sekundy, více hodnot oddÄ›lených mezerou" ++ ++msgid "server interfaces" ++msgstr "rozhraní serveru" ++ ++#~ msgid "Installed network plugins:" ++#~ msgstr "Instalované síťové pluginy:" ++ ++#~ msgid "Installed output plugins:" ++#~ msgstr "Instalované výstupní pluginy:" ++ ++#~ msgid "" ++#~ "Network plugins are used to collect information about open tcp " ++#~ "connections, interface traffic, iptables rules etc." ++#~ msgstr "" ++#~ "Síťové pluginy jsou používány pro shromažÄování informací o otevÅ™ených " ++#~ "tcp spojeních, provozu na rozhraní, pravidel iptables atd." ++ ++#~ msgid "" ++#~ "Output plugins provide different possibilities to store collected data. " ++#~ "It is possible to enable multiple plugin at one, for example to store " ++#~ "collected data in rrd databases and to transmit the data over the network " ++#~ "to other collectd instances." ++#~ msgstr "" ++#~ "Výstupní pluginy poskytují různé možnosti ukládání sesbíraných dat. " ++#~ "Plugin je možné v jeden okamžik povolit vícekrát , například pro ukládání " ++#~ "dat do rrd databází a pÅ™edávání dat po síti jiným instancím daemonu " ++#~ "collectd." ++ ++#~ msgid "" ++#~ "System plugins collecting values about system state and ressource usage " ++#~ "on the device.:" ++#~ msgstr "" ++#~ "Systémové pluginy, shromažÄující hodnoty o systémovém stavu a zdrojích, " ++#~ "používaných zařízením:" ++ ++#~ msgid "" ++#~ "The wireless plugin collects statistics about wireless signal strength, " ++#~ "noise and quality." ++#~ msgstr "" ++#~ "Plugin Wireless shromažÄuje statistiky o síle, Å¡umu a kvalitÄ› " ++#~ "bezdrátového signálu." ++ ++#~ msgid "Wireless Plugin Configuration" ++#~ msgstr "Nastavení pluginu Wireless" +diff --git a/feeds/luci/applications/luci-app-statistics/po/de/rrdtool.po b/feeds/luci/applications/luci-app-statistics/po/de/rrdtool.po +new file mode 100644 +index 0000000..390fd2e +--- /dev/null ++++ b/feeds/luci/applications/luci-app-statistics/po/de/rrdtool.po +@@ -0,0 +1,357 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Report-Msgid-Bugs-To: \n" ++"POT-Creation-Date: 2009-05-26 17:57+0200\n" ++"PO-Revision-Date: 2009-05-19 00:33+0200\n" ++"Last-Translator: Stefan Keks \n" ++"Language-Team: LANGUAGE \n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"X-Generator: Pootle 1.1.0\n" ++ ++#. %H: Wireless - Signal Noise Ratio ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:1 ++msgid "stat_dg_title_wireless__signal_noise" ++msgstr "%H: Drahtlos - Signal-Noise-Verhältnis" ++ ++#. dBm ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:2 ++msgid "stat_dg_label_wireless__signal_noise" ++msgstr "dBm" ++ ++#. Noise Level ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:3 ++msgid "stat_ds_signal_noise" ++msgstr "Noise-Level" ++ ++#. Signal Strength ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:4 ++msgid "stat_ds_signal_power" ++msgstr "Signalstärke" ++ ++#. %H: Wireless - Signal Quality ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:5 ++msgid "stat_dg_title_wireless__signal_quality" ++msgstr "%H: Drahtlos - Signalqualität" ++ ++#. n ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:6 ++msgid "stat_dg_label_wireless__signal_quality" ++msgstr "n" ++ ++#. Signal Quality ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:7 ++msgid "stat_ds_signal_quality" ++msgstr "Signalqualität" ++ ++#. %H: ICMP Roundtrip Times ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:8 ++msgid "stat_dg_title_ping" ++msgstr "%H: ICMP Antwortzeiten" ++ ++#. ms ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:9 ++msgid "stat_dg_label_ping" ++msgstr "ms" ++ ++#. %di ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:10 ++msgid "stat_ds_ping" ++msgstr "%di" ++ ++#. %H: Firewall - Processed Packets ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:11 ++msgid "stat_dg_title_iptables__ipt_packets" ++msgstr "%H: Firewall - Verarbeitete Pakete" ++ ++#. Packets/s ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:12 ++msgid "stat_dg_label_iptables__ipt_packets" ++msgstr "Pakete/s" ++ ++#. Chain \"%di\" ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:13 ++msgid "stat_ds_ipt_packets" ++msgstr "Kette \"%di\"" ++ ++#. %H: Netlink - Transfer on %pi ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:14 ++msgid "stat_dg_title_netlink__if_octets" ++msgstr "%H: Netlink - Transfer auf %pi" ++ ++#. Bytes/s ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:15 ++msgid "stat_dg_label_netlink__if_octets" ++msgstr "Bytes/s" ++ ++#. Bytes (%ds) ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:16 ++msgid "stat_ds_if_octets" ++msgstr "Bytes (%ds)" ++ ++#. %H: Netlink - Packets on %pi ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:17 ++msgid "stat_dg_title_netlink__if_packets" ++msgstr "%H: Netlink - Pakete auf %pi" ++ ++#. Packets/s ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:18 ++msgid "stat_dg_label_netlink__if_packets" ++msgstr "Pakete/s" ++ ++#. Processed (%ds) ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:19 ++msgid "stat_ds_if_packets" ++msgstr "Verarbeitet (%ds)" ++ ++#. Dropped (%ds) ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:20 ++msgid "stat_ds_if_dropped" ++msgstr "Verworfen (%ds)" ++ ++#. Errors (%ds) ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:21 ++msgid "stat_ds_if_errors" ++msgstr "Fehler (%ds)" ++ ++#. %H: Netlink - Multicast on %pi ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:22 ++msgid "stat_dg_title_netlink__if_multicast" ++msgstr "%H: Netlink - Multicast auf %pi" ++ ++#. Packets/s ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:23 ++msgid "stat_dg_label_netlink__if_multicast" ++msgstr "Pakete/s" ++ ++#. Packets ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:24 ++msgid "stat_ds_if_multicast" ++msgstr "Pakete" ++ ++#. %H: Netlink - Collisions on %pi ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:25 ++msgid "stat_dg_title_netlink__if_collisions" ++msgstr "%H: Netlink - Kollisionen auf %pi" ++ ++#. Collisions/s ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:26 ++msgid "stat_dg_label_netlink__if_collisions" ++msgstr "Kollisionen/s" ++ ++#. Collisions ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:27 ++msgid "stat_ds_if_collisions" ++msgstr "Kollisionen" ++ ++#. %H: Netlink - Errors on %pi ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:28 ++msgid "stat_dg_title_netlink__if_tx_errors" ++msgstr "%H: Netlink - Fehler auf %pi" ++ ++#. Errors/s ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:29 ++msgid "stat_dg_label_netlink__if_tx_errors" ++msgstr "Fehler/s" ++ ++#. %di ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:30 ++msgid "stat_ds_if_tx_errors" ++msgstr "%di" ++ ++#. %di ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:31 ++msgid "stat_ds_if_rx_errors" ++msgstr "%di" ++ ++#. %H: Processes ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:32 ++msgid "stat_dg_title_processes" ++msgstr "%H: Prozesse" ++ ++#. Processes/s ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:33 ++msgid "stat_dg_label_processes" ++msgstr "Prozesse/s" ++ ++#. %di ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:34 ++msgid "stat_ds_ps_state" ++msgstr "%di" ++ ++#. %H: Process %pi - used cpu time ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:35 ++msgid "stat_dg_title_processes__ps_cputime" ++msgstr "%H: Prozess %pi - Verbrauchte CPU Zeit" ++ ++#. Jiffies ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:36 ++msgid "stat_dg_label_processes__ps_cputime" ++msgstr "Jiffies" ++ ++#. system ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:37 ++msgid "stat_ds_ps_cputime__syst" ++msgstr "System" ++ ++#. user ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:38 ++msgid "stat_ds_ps_cputime__user" ++msgstr "User" ++ ++#. %H: Process %pi - threads and processes ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:39 ++msgid "stat_dg_title_processes__ps_count" ++msgstr "%H: Prozess %pi - Threads und Prozesse" ++ ++#. Count ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:40 ++msgid "stat_dg_label_processes__ps_count" ++msgstr "Anzahl" ++ ++#. %ds ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:41 ++msgid "stat_ds_ps_count" ++msgstr "%ds" ++ ++#. %H: Process %pi - page faults ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:42 ++msgid "stat_dg_title_processes__ps_pagefaults" ++msgstr "%H: Prozess %pi - Speicherzugriffsfehler" ++ ++#. Pagefaults ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:43 ++msgid "stat_dg_label_processes__ps_pagefaults" ++msgstr "Zugriffsfehler" ++ ++#. page faults ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:44 ++msgid "stat_ds_ps_pagefaults" ++msgstr "Zugriffsfehler" ++ ++#. %H: Process %pi - virtual memory size ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:45 ++msgid "stat_dg_title_processes__ps_rss" ++msgstr "%H: Process %pi - Virtueller Speicher" ++ ++#. Bytes ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:46 ++msgid "stat_dg_label_processes__ps_rss" ++msgstr "Bytes" ++ ++#. virtual memory ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:47 ++msgid "stat_ds_ps_rss" ++msgstr "virtueller Speicher" ++ ++#. %H: Usage on Processor #%pi ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:48 ++msgid "stat_dg_title_cpu" ++msgstr "%H: Auslastung auf Prozessor #%pi" ++ ++#. % ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:49 ++msgid "stat_dg_label_cpu" ++msgstr "%" ++ ++#. %di ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:50 ++msgid "stat_ds_cpu" ++msgstr "%di" ++ ++#. %H: Transfer on %di ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:51 ++msgid "stat_dg_title_interface__if_octets" ++msgstr "%H: Transfer auf %di" ++ ++#. Bytes/s ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:52 ++msgid "stat_dg_label_interface__if_octets" ++msgstr "Bytes/s" ++ ++#. %H: Packets on %di ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:53 ++msgid "stat_dg_title_interface__if_packets" ++msgstr "%H: Pakete auf %di" ++ ++#. Packets/s ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:54 ++msgid "stat_dg_label_interface__if_packets" ++msgstr "Pakete/s" ++ ++#. %H: TCP-Connections to Port %pi ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:55 ++msgid "stat_dg_title_tcpconns" ++msgstr "%H: TCP-Verbindungen auf Port %pi" ++ ++#. Connections/s ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:56 ++msgid "stat_dg_label_tcpconns" ++msgstr "Verbindungen/s" ++ ++#. %di ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:57 ++msgid "stat_ds_tcp_connections" ++msgstr "%di" ++ ++#. %H: Disk Space Usage on %di ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:58 ++msgid "stat_dg_title_df" ++msgstr "%H: Speicherverbrauch auf %di" ++ ++#. Bytes ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:59 ++msgid "stat_dg_label_df" ++msgstr "Bytes" ++ ++#. %ds ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:60 ++msgid "stat_ds_df__free" ++msgstr "verfügbar" ++ ++#. %ds ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:61 ++msgid "stat_ds_df__used" ++msgstr "belegt " ++ ++#. %H: Interrupts ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:62 ++msgid "stat_dg_title_irq" ++msgstr "%H: Interrupts" ++ ++#. Issues/s ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:63 ++msgid "stat_dg_label_irq" ++msgstr "Aufrufe/s" ++ ++#. IRQ %di ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:64 ++msgid "stat_ds_irq" ++msgstr "IRQ %di" ++ ++#. %H: System Load ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:65 ++msgid "stat_dg_title_load" ++msgstr "%H: Systemlast" ++ ++#. Load ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:66 ++msgid "stat_dg_label_load" ++msgstr "Last" ++ ++#. 1 min ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:67 ++msgid "stat_ds_load__shortterm" ++msgstr "1 Minute" ++ ++#. 5 min ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:68 ++msgid "stat_ds_load__midterm" ++msgstr "5 Minuten" ++ ++#. 15 min ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:69 ++msgid "stat_ds_load__longterm" ++msgstr "15 Minuten" +diff --git a/feeds/luci/applications/luci-app-statistics/po/de/statistics.po b/feeds/luci/applications/luci-app-statistics/po/de/statistics.po +new file mode 100644 +index 0000000..6c93589 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-statistics/po/de/statistics.po +@@ -0,0 +1,731 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Report-Msgid-Bugs-To: \n" ++"POT-Creation-Date: \n" ++"PO-Revision-Date: 2013-01-28 22:20+0200\n" ++"Last-Translator: DAC324 \n" ++"Language-Team: LANGUAGE \n" ++"Language: de\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n != 1);\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "Action (target)" ++msgstr "Aktion (Ziel)" ++ ++msgid "Add command for reading values" ++msgstr "Kommando zum Werte einlesen hinzufügen" ++ ++msgid "Add matching rule" ++msgstr "Auswahlregel hinzufügen" ++ ++msgid "Add multiple hosts separated by space." ++msgstr "Mehrere Hosts durch Leerzeichen getrennt hinzufuegen" ++ ++msgid "Add notification command" ++msgstr "Benachrichtigungskommando hinzufügen" ++ ++msgid "Base Directory" ++msgstr "Basisverzeichnis" ++ ++msgid "Basic monitoring" ++msgstr "Schnittstellen einfach überwachen" ++ ++msgid "CPU Plugin Configuration" ++msgstr "CPU Plugin Konfiguration" ++ ++msgid "CSV Output" ++msgstr "CSV Ausgabe" ++ ++msgid "CSV Plugin Configuration" ++msgstr "CSV Plugin Konfiguration" ++ ++msgid "Cache collected data for" ++msgstr "Zwischenspeicherzeit für gesammelte Daten" ++ ++msgid "Cache flush interval" ++msgstr "Cache-Leerungsintervall" ++ ++msgid "Chain" ++msgstr "Kette (Chain)" ++ ++msgid "CollectLinks" ++msgstr "Informationen über Links sammeln (CollectdLinks)" ++ ++msgid "CollectRoutes" ++msgstr "Informationen über Routen sammeln (CollectRoutes)" ++ ++msgid "CollectTopology" ++msgstr "Informationen über die Netzwerktopologie sammeln (CollectTopology)" ++ ++msgid "Collectd" ++msgstr "Collectd" ++ ++msgid "Collectd Settings" ++msgstr "Collectd Einstellungen" ++ ++msgid "" ++"Collectd is a small daemon for collecting data from various sources through " ++"different plugins. On this page you can change general settings for the " ++"collectd daemon." ++msgstr "" ++"Collectd ist ein schlankes Dienstprogramm zum Sammeln von Systemdaten aus " ++"verschiedenen Quellen mittels diverser Plugins. Auf dieser Seite können " ++"generelle Einstellungen für den Collectd-Daemon vorgenommen werden." ++ ++msgid "Conntrack" ++msgstr "Conntrack" ++ ++msgid "Conntrack Plugin Configuration" ++msgstr "Conntrack Plugin Einstellungen" ++ ++msgid "DF Plugin Configuration" ++msgstr "DF Plugin Konfiguration" ++ ++msgid "DNS" ++msgstr "DNS" ++ ++msgid "DNS Plugin Configuration" ++msgstr "DNS Plugin Konfiguration" ++ ++msgid "Data collection interval" ++msgstr "Daten-Sammelintervall" ++ ++msgid "Datasets definition file" ++msgstr "Dataset-Definitionen" ++ ++msgid "Destination ip range" ++msgstr "Ziel-IP-Bereich" ++ ++msgid "Directory for collectd plugins" ++msgstr "Verzeichnis für Collectd-Plugins" ++ ++msgid "Directory for sub-configurations" ++msgstr "Verzeichnis für Unterkonfigurationen" ++ ++msgid "Disk Plugin Configuration" ++msgstr "Disk Plugin Konfiguration" ++ ++msgid "Disk Space Usage" ++msgstr "Plattenspeicher" ++ ++msgid "Disk Usage" ++msgstr "Plattenauslastung" ++ ++msgid "Display Host »" ++msgstr "Anzeigeserver" ++ ++msgid "Display timespan »" ++msgstr "Zeitspanne zeigen »" ++ ++msgid "E-Mail Plugin Configuration" ++msgstr "E-Mail Plugin Konfiguration" ++ ++msgid "Email" ++msgstr "Email" ++ ++msgid "Enable this plugin" ++msgstr "Plugin aktivieren" ++ ++msgid "Exec" ++msgstr "Exec" ++ ++msgid "Exec Plugin Configuration" ++msgstr "Exec Plugin Konfiguration" ++ ++msgid "Filter class monitoring" ++msgstr "Filterklassen überwachen" ++ ++msgid "Firewall" ++msgstr "Firewall" ++ ++msgid "Flush cache after" ++msgstr "Leerungsintervall für Zwischenspeicher" ++ ++msgid "Forwarding between listen and server addresses" ++msgstr "Weiterleitung zwischen Listen- und Server-Adressen" ++ ++msgid "Graphs" ++msgstr "Diagramme" ++ ++msgid "Group" ++msgstr "Gruppe" ++ ++msgid "" ++"Here you can define external commands which will be started by collectd in " ++"order to read certain values. The values will be read from stdout." ++msgstr "" ++"Hier können externe Kommandos definiert werden, welche durch Collectd " ++"gestartet werden um Statistik-Werte einzulesen. Die Werte werden dabei vom " ++"STDOUT des aufgerufenen Programmes gelesen." ++ ++msgid "" ++"Here you can define external commands which will be started by collectd when " ++"certain threshold values have been reached. The values leading to invokation " ++"will be feeded to the the called programs stdin." ++msgstr "" ++"Hier können externe Kommandos definiert werden, welche durch Collectd " ++"gestartet werden sobald konfigurierte Grenzwerte erreicht werden. Die Werte " ++"welche die Benachrichtigung ausgelöst haben werden dabei an den STDIN des " ++"aufgerufenen Programmes übergeben." ++ ++msgid "" ++"Here you can define various criteria by which the monitored iptables rules " ++"are selected." ++msgstr "" ++"Hier werden die Kriterien festgelegt nach welchen die zu überwachenden " ++"Firewall-Regeln ausgewählt werden." ++ ++msgid "Host" ++msgstr "Host" ++ ++msgid "Hostname" ++msgstr "Hostname" ++ ++msgid "IP or hostname where to get the txtinfo output from" ++msgstr "IP-Adresse oder Hostname zum Abfragen der Txtinfo-Ausagabe" ++ ++msgid "IRQ Plugin Configuration" ++msgstr "IRQ Plugin Konfiguration" ++ ++msgid "Ignore source addresses" ++msgstr "Quelladressen ignorieren" ++ ++msgid "Incoming interface" ++msgstr "eingehende Schnittstelle" ++ ++msgid "Interface Plugin Configuration" ++msgstr "Interface Plugin Konfiguration" ++ ++msgid "Interfaces" ++msgstr "Schnittstellen" ++ ++msgid "Interrupts" ++msgstr "Interrupts" ++ ++msgid "Interval for pings" ++msgstr "Intervall zwischen den Pings" ++ ++msgid "Iptables Plugin Configuration" ++msgstr "Iptables Plugin Konfiguration" ++ ++msgid "Leave unselected to automatically determine interfaces to monitor." ++msgstr "" ++"Nichts auswählen um die zu überwachende Schnittstelle automatisch zu " ++"bestimmen" ++ ++msgid "Listen host" ++msgstr "Listen-Host" ++ ++msgid "Listen port" ++msgstr "Listen-Port" ++ ++msgid "Listener interfaces" ++msgstr "Listen-Schnittstelle" ++ ++msgid "Load Plugin Configuration" ++msgstr "Load Plugin Konfiguration" ++ ++msgid "Maximum allowed connections" ++msgstr "Maximale Anzahl erlaubter Verbindungen" ++ ++msgid "Memory" ++msgstr "Memory" ++ ++msgid "Memory Plugin Configuration" ++msgstr "Memory-Plugin-Konfiguration" ++ ++msgid "Monitor all except specified" ++msgstr "Alle bis auf Angegebene überwachen" ++ ++msgid "Monitor all local listen ports" ++msgstr "Alle durch lokale Dienste genutzten Ports überwachen" ++ ++msgid "Monitor devices" ++msgstr "Geräte überwachen" ++ ++msgid "Monitor disks and partitions" ++msgstr "Geräte und Partitionen überwachen" ++ ++msgid "Monitor filesystem types" ++msgstr "Datesystemtypen überwachen" ++ ++msgid "Monitor hosts" ++msgstr "Hosts überwachen" ++ ++msgid "Monitor interfaces" ++msgstr "Schnittstellen überwachen" ++ ++msgid "Monitor interrupts" ++msgstr "Interrups überwachen" ++ ++msgid "Monitor local ports" ++msgstr "lokale Ports überwachen" ++ ++msgid "Monitor mount points" ++msgstr "Mount-Punkte überwachen" ++ ++msgid "Monitor processes" ++msgstr "Ãœberwachte Prozesse" ++ ++msgid "Monitor remote ports" ++msgstr "entfernte Ports überwachen" ++ ++msgid "Name of the rule" ++msgstr "Name der Regel" ++ ++msgid "Netlink" ++msgstr "Netlink" ++ ++msgid "Netlink Plugin Configuration" ++msgstr "Netlink Plugin Konfiguration" ++ ++msgid "Network" ++msgstr "Netzwerk" ++ ++msgid "Network Plugin Configuration" ++msgstr "Network Plugin Konfiguration" ++ ++msgid "Network plugins" ++msgstr "Netzwerkplugins" ++ ++msgid "Network protocol" ++msgstr "Netzwerkprotokoll" ++ ++msgid "Number of threads for data collection" ++msgstr "Anzahl paralleler Sammelprozesse" ++ ++msgid "OLSRd" ++msgstr "OLSRd" ++ ++msgid "OLSRd Plugin Configuration" ++msgstr "OLSRd-Plugin-Konfiguration" ++ ++msgid "Only create average RRAs" ++msgstr "Nur 'average' RRAs erzeugen" ++ ++msgid "Options" ++msgstr "Optionen" ++ ++msgid "Outgoing interface" ++msgstr "ausgehende Schnittstelle" ++ ++msgid "Output plugins" ++msgstr "Ausgabeplugins" ++ ++msgid "Ping" ++msgstr "Ping" ++ ++msgid "Ping Plugin Configuration" ++msgstr "Ping Plugin Konfiguration" ++ ++msgid "Port" ++msgstr "Port" ++ ++msgid "Processes" ++msgstr "Prozesse" ++ ++msgid "Processes Plugin Configuration" ++msgstr "Prozess Plugin Konfiguration" ++ ++msgid "Processes to monitor separated by space" ++msgstr "Zu überwachende Prozesse (getrennt durch Leerzeichen)" ++ ++msgid "Processor" ++msgstr "Prozessor" ++ ++msgid "Qdisc monitoring" ++msgstr "Queue Discipline überwachen" ++ ++msgid "RRD XFiles Factor" ++msgstr "RRD XFiles Faktor" ++ ++msgid "RRD heart beat interval" ++msgstr "RRD Heartbeatintervall" ++ ++msgid "RRD step interval" ++msgstr "RRD Schrittintervall" ++ ++msgid "RRDTool" ++msgstr "RRDTool" ++ ++msgid "RRDTool Plugin Configuration" ++msgstr "RRDTool Plugin Konfiguration" ++ ++msgid "Rows per RRA" ++msgstr "Spalten pro RRA" ++ ++msgid "Script" ++msgstr "Skript" ++ ++msgid "Seconds" ++msgstr "Sekunden" ++ ++msgid "Server host" ++msgstr "Server-Host" ++ ++msgid "Server port" ++msgstr "Server-Port" ++ ++msgid "Shaping class monitoring" ++msgstr "Shapingklassen überwachen" ++ ++msgid "Socket file" ++msgstr "Socket-Datei" ++ ++msgid "Socket group" ++msgstr "Socket-Nutzergruppe" ++ ++msgid "Socket permissions" ++msgstr "Socket-Berechtigungen" ++ ++msgid "Source ip range" ++msgstr "Quell-IP-Bereich" ++ ++msgid "Specifies what information to collect about links." ++msgstr "Bestimmt die zu sammelnden Per-Link-Informationen." ++ ++msgid "Specifies what information to collect about routes." ++msgstr "Bestimmt die zu sammelnden Per-Route-Informationen." ++ ++msgid "Specifies what information to collect about the global topology." ++msgstr "Bestimmt die zu sammelnden Informationen der globalen Topologie." ++ ++msgid "Splash Leases" ++msgstr "" ++ ++msgid "Splash Leases Plugin Configuration" ++msgstr "" ++ ++msgid "Statistics" ++msgstr "Statistiken" ++ ++msgid "Storage directory" ++msgstr "Speicherverzeichnis" ++ ++msgid "Storage directory for the csv files" ++msgstr "Speicherverzeichnis für die CSV-Dateien" ++ ++msgid "Store data values as rates instead of absolute values" ++msgstr "Werte nicht absolut sondern als Raten speichern" ++ ++msgid "Stored timespans" ++msgstr "gespeicherte Zeitspannen" ++ ++msgid "System Load" ++msgstr "Systemlast" ++ ++msgid "System plugins" ++msgstr "Systemplugins" ++ ++msgid "TCP Connections" ++msgstr "TCP-Verbindungen" ++ ++msgid "TCPConns Plugin Configuration" ++msgstr "TCPConns Plugin Konfiguration" ++ ++msgid "TTL for network packets" ++msgstr "TTL für Netzwerkpakete" ++ ++msgid "TTL for ping packets" ++msgstr "TTL für Ping Pakete" ++ ++msgid "Table" ++msgstr "Tabelle" ++ ++msgid "The NUT plugin reads information about Uninterruptible Power Supplies." ++msgstr "" ++"Das NUT-Plugin liest Informationen über Unterbrechungsfreie Stromversorgungen" ++ ++msgid "" ++"The OLSRd plugin reads information about meshed networks from the txtinfo " ++"plugin of OLSRd." ++msgstr "" ++"Das OLSRd-Plugin liest Informationen über Meshnetzwerke aus der OLSR-Txtinfo-" ++"Erweiterung." ++ ++msgid "" ++"The conntrack plugin collects statistics about the number of tracked " ++"connections." ++msgstr "" ++"Das Conntrack-Plugin sammelt Daten über die Anzahl der verfolgten " ++"Verbindungen." ++ ++msgid "The cpu plugin collects basic statistics about the processor usage." ++msgstr "" ++"Das CPU-Plugin sammelt grundlegende Statistiken über die Prozessorauslastung." ++ ++msgid "" ++"The csv plugin stores collected data in csv file format for further " ++"processing by external programs." ++msgstr "" ++"Das CSV-Plugin speichert die gesammelten Daten im CSV-Format, geeignet für " ++"die Weiterverarbeitung durch externe Programme." ++ ++msgid "" ++"The df plugin collects statistics about the disk space usage on different " ++"devices, mount points or filesystem types." ++msgstr "" ++"Das DF-Plugin sammelt Statistiken über den Speicherverbrauch auf " ++"verschiedenen Geräten, Mount-Punkten oder Dateisystemtypen." ++ ++msgid "" ++"The disk plugin collects detailled usage statistics for selected partitions " ++"or whole disks." ++msgstr "" ++"Das Disk-Plugin sammelt detaillierte Statistiken über die Auslastung auf " ++"ausgewählten Festplatten und Partitionen." ++ ++msgid "" ++"The dns plugin collects detailled statistics about dns related traffic on " ++"selected interfaces." ++msgstr "" ++"Das DNS-Plugin sammelt detaillierte Statistiken über DNS-bezogenen Verkehr " ++"auf ausgewählten Schnittstellen." ++ ++msgid "" ++"The email plugin creates a unix socket which can be used to transmit email-" ++"statistics to a running collectd daemon. This plugin is primarily intended " ++"to be used in conjunction with Mail::SpamAssasin::Plugin::Collectd but can " ++"be used in other ways as well." ++msgstr "" ++"Das E-Mail Plugin erstellt einen Unix-Socket welcher benutzt werden kann um " ++"E-Mail-Statistiken an den laufenden Collectd-Daemon zu übermitteln. Dieses " ++"Plugin ist primär für die Verwendung zusammen mit Mail::SpamAssasin::Plugin::" ++"Collectd gedacht, kann aber auch anderweitig verwendet werden." ++ ++msgid "" ++"The exec plugin starts external commands to read values from or to notify " ++"external processes when certain threshold values have been reached." ++msgstr "" ++"Das Exec-Plugin startet externe Kommandos um Werte einzulesen oder um " ++"Benachrichtigungen auszulösen falls bestimmte Grenzwerte erreicht werden." ++ ++msgid "" ++"The interface plugin collects traffic statistics on selected interfaces." ++msgstr "" ++"Das Interface-Plugin sammelt allgemeine Verkehrsstatistiken auf ausgewählten " ++"Schnittstellen." ++ ++msgid "" ++"The iptables plugin will monitor selected firewall rules and collect " ++"informations about processed bytes and packets per rule." ++msgstr "" ++"Das Iptables-Plugin überwacht ausgewählte Firewall-Regeln und sammelt Werte " ++"über die Anzahl der verarbeiteten Pakete und Bytes." ++ ++msgid "" ++"The irq plugin will monitor the rate of issues per second for each selected " ++"interrupt. If no interrupt is selected then all interrupts are monitored." ++msgstr "" ++"Das IRQ-Plugin überwacht die Anzahl der Aufrufe pro Sekunde für jeden " ++"ausgewählten Interrupt. Wird kein Interrupt ausgewählt überwacht das Plugin " ++"alle im System vorhandenen Interrupts." ++ ++msgid "" ++"The iwinfo plugin collects statistics about wireless signal strength, noise " ++"and quality." ++msgstr "" ++"Das iwinfo-Plugin sammelt Statistiken über die WLAN-Signalstärke, den " ++"Rauschpegel und die Signalqualität." ++ ++msgid "The load plugin collects statistics about the general system load." ++msgstr "Das Load-Plugin sammelt Informationen über die allgemeine Systemlast." ++ ++msgid "The memory plugin collects statistics about the memory usage." ++msgstr "" ++"Das memory-Plugin sammelt Statistiken über die RAM-Auslastung des Systems." ++ ++msgid "" ++"The netlink plugin collects extended informations like qdisc-, class- and " ++"filter-statistics for selected interfaces." ++msgstr "" ++"Das Netlink-Plugin sammelt erweiterte QoS-Informationen wie QDisc-, Class- " ++"und Filter-Statistiken auf ausgewählten Schnittstellen." ++ ++msgid "" ++"The network plugin provides network based communication between different " ++"collectd instances. Collectd can operate both in client and server mode. In " ++"client mode locally collected data is transferred to a collectd server " ++"instance, in server mode the local instance receives data from other hosts." ++msgstr "" ++"Das Network-Plugin ermöglicht die netzwerkgestützte Kommunikation zwischen " ++"verschiedenen Collectd-Instanzen. Collectd kann gleichzeitig im Server- und " ++"Client-Modus betrieben werden. Im Client-Modus werden lokal gesammelte Daten " ++"an einen Collectd-Server übermittelt, im Server-Modus empfängt die lokale " ++"Instanz Daten von anderen Installationen." ++ ++msgid "" ++"The ping plugin will send icmp echo replies to selected hosts and measure " ++"the roundtrip time for each host." ++msgstr "" ++"Das Ping-Plugin sendet ICMP-Echo-Requests an ausgewählte Hosts und misst die " ++"Antwortzeiten für jede Adresse." ++ ++msgid "" ++"The processes plugin collects informations like cpu time, page faults and " ++"memory usage of selected processes." ++msgstr "" ++"Das Prozess-Plugin sammelt Statistiken über Prozess-Zeit, Speicher-Fehler " ++"und Speicher-Verbrauch ausgewählter Prozesse" ++ ++msgid "" ++"The rrdtool plugin stores the collected data in rrd database files, the " ++"foundation of the diagrams.

    Warning: Setting the wrong " ++"values will result in a very high memory consumption in the temporary " ++"directory. This can render the device unusable!" ++msgstr "" ++"Das RRDTool-Plugin speichert die gesammelten Daten in sogenannten RRD-" ++"Datenbanken, der Grundlage für die Diagramm-Bilder.

    Warnung: Falsche Werte resultieren in einem sehr hohen " ++"Speicherverbrauch im temporären Verzeichnis. Das kann das Gerät unbrauchbar " ++"machen, da Systemspeicher für den regulären Betrieb fehlt!" ++ ++msgid "" ++"The splash leases plugin uses libuci to collect statistics about splash " ++"leases." ++msgstr "" ++ ++msgid "" ++"The statistics package is based on Collectd and uses RRD " ++"Tool to render diagram images from collected data." ++msgstr "" ++"Das Statistik-Paket basiert auf Collectd und nutzt RRD " ++"Tool um die gesammelten Daten in Diagramme zu rendern." ++ ++msgid "" ++"The tcpconns plugin collects informations about open tcp connections on " ++"selected ports." ++msgstr "" ++"Das TCPConns-Plugin sammelt Informationen über offene TCP-Verbindungen auf " ++"ausgewählten Ports." ++ ++msgid "" ++"The unixsock plugin creates a unix socket which can be used to read " ++"collected data from a running collectd instance." ++msgstr "" ++"Das Unixsock-Plugin erstellt einen Unix-Socket über welchen gesammelte Werte " ++"aus der laufenden Collectd-Instanz ausgelesen werden können." ++ ++msgid "The uptime plugin collects statistics about the uptime of the system." ++msgstr "" ++ ++msgid "" ++"This section defines on which interfaces collectd will wait for incoming " ++"connections." ++msgstr "" ++"Diese Sektion legt fest auf welchen Schnittstellen Collectd auf eingehende " ++"Verbindungen wartet." ++ ++msgid "" ++"This section defines to which servers the locally collected data is sent to." ++msgstr "" ++"Diese Sektion legt fest zu welchen Collectd-Servern die lokal gesammelten " ++"Daten gesendet werden." ++ ++msgid "Try to lookup fully qualified hostname" ++msgstr "automatisch vollen Hostnamen herausfinden" ++ ++msgid "UPS" ++msgstr "USV" ++ ++msgid "UPS Plugin Configuration" ++msgstr "Einstellungen des USV-Plugins" ++ ++msgid "UPS name in NUT ups@host format" ++msgstr "Name der USV in NUT im Format usv@host " ++ ++msgid "UnixSock" ++msgstr "UnixSock" ++ ++msgid "Unixsock Plugin Configuration" ++msgstr "Unixsock Plugin Konfiguration" ++ ++msgid "Uptime" ++msgstr "" ++ ++msgid "Uptime Plugin Configuration" ++msgstr "" ++ ++msgid "Used PID file" ++msgstr "Pfad zu PID-Datei" ++ ++msgid "User" ++msgstr "Nutzer" ++ ++msgid "Verbose monitoring" ++msgstr "Schnittstellen detailliert überwachen" ++ ++msgid "Wireless" ++msgstr "Drahtlos" ++ ++msgid "Wireless iwinfo Plugin Configuration" ++msgstr "Wireless-iwinfo Plugin Konfiguration" ++ ++msgid "e.g. br-ff" ++msgstr "z.B. br-ff" ++ ++msgid "e.g. br-lan" ++msgstr "z.B. br-lan" ++ ++msgid "e.g. reject-with tcp-reset" ++msgstr "z.B. reject-with tcp-reset" ++ ++msgid "max. 16 chars" ++msgstr "max. 16 Buchstaben" ++ ++msgid "reduces rrd size" ++msgstr "reduziert die RRD Größe" ++ ++msgid "seconds; multiple separated by space" ++msgstr "mehrere mit Leerzeichen trennen" ++ ++msgid "server interfaces" ++msgstr "Server-Schnittstellen" ++ ++#~ msgid "Installed network plugins:" ++#~ msgstr "Installierte Netzwerk-Plugins:" ++ ++#~ msgid "Installed output plugins:" ++#~ msgstr "Installierte Ausgabe-Plugins:" ++ ++#~ msgid "" ++#~ "Network plugins are used to collect information about open tcp " ++#~ "connections, interface traffic, iptables rules etc." ++#~ msgstr "" ++#~ "Netzwerkplugins werden benutzt um Informationen über offene TCP-" ++#~ "Verbindungen, Datenverkehr/Volumen, Iptables/Firewall Regeln etc. zu " ++#~ "sammeln" ++ ++#~ msgid "" ++#~ "Output plugins provide different possibilities to store collected data. " ++#~ "It is possible to enable multiple plugin at one, for example to store " ++#~ "collected data in rrd databases and to transmit the data over the network " ++#~ "to other collectd instances." ++#~ msgstr "" ++#~ "Ausgabeplugins ermöglichen es gesammelte Daten zu speichern. Mehrere " ++#~ "Plugins können gleichzeitig aktiviert werden, z.B. um Daten in RRD-" ++#~ "Datenbanken zu speichern und gleichzeitig über das Netzwerk an andere " ++#~ "Collectd-Instanzen zu versenden." ++ ++#~ msgid "" ++#~ "System plugins collecting values about system state and ressource usage " ++#~ "on the device.:" ++#~ msgstr "" ++#~ "Systemplugins sammeln Daten zum Systemzustand und den Ressoursenbedarf " ++#~ "des Gerätes" ++ ++#~ msgid "" ++#~ "The wireless plugin collects statistics about wireless signal strength, " ++#~ "noise and quality." ++#~ msgstr "" ++#~ "Das Wireless-Plugin sammelt Statistiken über die drahtlose Signalstärke, " ++#~ "den Störpegel und die Signalqualität." ++ ++#~ msgid "Wireless Plugin Configuration" ++#~ msgstr "Wireless Plugin Konfiguration" +diff --git a/feeds/luci/applications/luci-app-statistics/po/el/rrdtool.po b/feeds/luci/applications/luci-app-statistics/po/el/rrdtool.po +new file mode 100644 +index 0000000..1d81166 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-statistics/po/el/rrdtool.po +@@ -0,0 +1,358 @@ ++#, fuzzy ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Report-Msgid-Bugs-To: \n" ++"POT-Creation-Date: 2009-05-28 02:08+0200\n" ++"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" ++"Last-Translator: FULL NAME \n" ++"Language-Team: LANGUAGE \n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"X-Generator: Translate Toolkit 1.1.1\n" ++ ++#. %H: Wireless - Signal Noise Ratio ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:1 ++msgid "stat_dg_title_wireless__signal_noise" ++msgstr "" ++ ++#. dBm ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:2 ++msgid "stat_dg_label_wireless__signal_noise" ++msgstr "" ++ ++#. Noise Level ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:3 ++msgid "stat_ds_signal_noise" ++msgstr "" ++ ++#. Signal Strength ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:4 ++msgid "stat_ds_signal_power" ++msgstr "" ++ ++#. %H: Wireless - Signal Quality ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:5 ++msgid "stat_dg_title_wireless__signal_quality" ++msgstr "" ++ ++#. n ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:6 ++msgid "stat_dg_label_wireless__signal_quality" ++msgstr "" ++ ++#. Signal Quality ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:7 ++msgid "stat_ds_signal_quality" ++msgstr "" ++ ++#. %H: ICMP Roundtrip Times ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:8 ++msgid "stat_dg_title_ping" ++msgstr "" ++ ++#. ms ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:9 ++msgid "stat_dg_label_ping" ++msgstr "" ++ ++#. %di ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:10 ++msgid "stat_ds_ping" ++msgstr "" ++ ++#. %H: Firewall - Processed Packets ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:11 ++msgid "stat_dg_title_iptables__ipt_packets" ++msgstr "" ++ ++#. Packets/s ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:12 ++msgid "stat_dg_label_iptables__ipt_packets" ++msgstr "" ++ ++#. Chain \"%di\" ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:13 ++msgid "stat_ds_ipt_packets" ++msgstr "" ++ ++#. %H: Netlink - Transfer on %pi ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:14 ++msgid "stat_dg_title_netlink__if_octets" ++msgstr "" ++ ++#. Bytes/s ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:15 ++msgid "stat_dg_label_netlink__if_octets" ++msgstr "" ++ ++#. Bytes (%ds) ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:16 ++msgid "stat_ds_if_octets" ++msgstr "" ++ ++#. %H: Netlink - Packets on %pi ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:17 ++msgid "stat_dg_title_netlink__if_packets" ++msgstr "" ++ ++#. Packets/s ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:18 ++msgid "stat_dg_label_netlink__if_packets" ++msgstr "" ++ ++#. Processed (%ds) ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:19 ++msgid "stat_ds_if_packets" ++msgstr "" ++ ++#. Dropped (%ds) ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:20 ++msgid "stat_ds_if_dropped" ++msgstr "" ++ ++#. Errors (%ds) ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:21 ++msgid "stat_ds_if_errors" ++msgstr "" ++ ++#. %H: Netlink - Multicast on %pi ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:22 ++msgid "stat_dg_title_netlink__if_multicast" ++msgstr "" ++ ++#. Packets/s ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:23 ++msgid "stat_dg_label_netlink__if_multicast" ++msgstr "" ++ ++#. Packets ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:24 ++msgid "stat_ds_if_multicast" ++msgstr "" ++ ++#. %H: Netlink - Collisions on %pi ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:25 ++msgid "stat_dg_title_netlink__if_collisions" ++msgstr "" ++ ++#. Collisions/s ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:26 ++msgid "stat_dg_label_netlink__if_collisions" ++msgstr "" ++ ++#. Collisions ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:27 ++msgid "stat_ds_if_collisions" ++msgstr "" ++ ++#. %H: Netlink - Errors on %pi ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:28 ++msgid "stat_dg_title_netlink__if_tx_errors" ++msgstr "" ++ ++#. Errors/s ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:29 ++msgid "stat_dg_label_netlink__if_tx_errors" ++msgstr "" ++ ++#. %di ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:30 ++msgid "stat_ds_if_tx_errors" ++msgstr "" ++ ++#. %di ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:31 ++msgid "stat_ds_if_rx_errors" ++msgstr "" ++ ++#. %H: Processes ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:32 ++msgid "stat_dg_title_processes" ++msgstr "" ++ ++#. Processes/s ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:33 ++msgid "stat_dg_label_processes" ++msgstr "" ++ ++#. %di ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:34 ++msgid "stat_ds_ps_state" ++msgstr "" ++ ++#. %H: Process %pi - used cpu time ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:35 ++msgid "stat_dg_title_processes__ps_cputime" ++msgstr "" ++ ++#. Jiffies ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:36 ++msgid "stat_dg_label_processes__ps_cputime" ++msgstr "" ++ ++#. system ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:37 ++msgid "stat_ds_ps_cputime__syst" ++msgstr "" ++ ++#. user ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:38 ++msgid "stat_ds_ps_cputime__user" ++msgstr "" ++ ++#. %H: Process %pi - threads and processes ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:39 ++msgid "stat_dg_title_processes__ps_count" ++msgstr "" ++ ++#. Count ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:40 ++msgid "stat_dg_label_processes__ps_count" ++msgstr "" ++ ++#. %ds ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:41 ++msgid "stat_ds_ps_count" ++msgstr "" ++ ++#. %H: Process %pi - page faults ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:42 ++msgid "stat_dg_title_processes__ps_pagefaults" ++msgstr "" ++ ++#. Pagefaults ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:43 ++msgid "stat_dg_label_processes__ps_pagefaults" ++msgstr "" ++ ++#. page faults ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:44 ++msgid "stat_ds_ps_pagefaults" ++msgstr "" ++ ++#. %H: Process %pi - virtual memory size ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:45 ++msgid "stat_dg_title_processes__ps_rss" ++msgstr "" ++ ++#. Bytes ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:46 ++msgid "stat_dg_label_processes__ps_rss" ++msgstr "" ++ ++#. virtual memory ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:47 ++msgid "stat_ds_ps_rss" ++msgstr "" ++ ++#. %H: Usage on Processor #%pi ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:48 ++msgid "stat_dg_title_cpu" ++msgstr "" ++ ++#. % ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:49 ++msgid "stat_dg_label_cpu" ++msgstr "" ++ ++#. %di ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:50 ++msgid "stat_ds_cpu" ++msgstr "" ++ ++#. %H: Transfer on %di ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:51 ++msgid "stat_dg_title_interface__if_octets" ++msgstr "" ++ ++#. Bytes/s ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:52 ++msgid "stat_dg_label_interface__if_octets" ++msgstr "" ++ ++#. %H: Packets on %di ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:53 ++msgid "stat_dg_title_interface__if_packets" ++msgstr "" ++ ++#. Packets/s ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:54 ++msgid "stat_dg_label_interface__if_packets" ++msgstr "" ++ ++#. %H: TCP-Connections to Port %pi ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:55 ++msgid "stat_dg_title_tcpconns" ++msgstr "" ++ ++#. Connections/s ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:56 ++msgid "stat_dg_label_tcpconns" ++msgstr "" ++ ++#. %di ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:57 ++msgid "stat_ds_tcp_connections" ++msgstr "" ++ ++#. %H: Disk Space Usage on %di ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:58 ++msgid "stat_dg_title_df" ++msgstr "" ++ ++#. Bytes ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:59 ++msgid "stat_dg_label_df" ++msgstr "" ++ ++#. %ds ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:60 ++msgid "stat_ds_df__free" ++msgstr "" ++ ++#. %ds ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:61 ++msgid "stat_ds_df__used" ++msgstr "" ++ ++#. %H: Interrupts ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:62 ++msgid "stat_dg_title_irq" ++msgstr "" ++ ++#. Issues/s ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:63 ++msgid "stat_dg_label_irq" ++msgstr "" ++ ++#. IRQ %di ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:64 ++msgid "stat_ds_irq" ++msgstr "" ++ ++#. %H: System Load ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:65 ++msgid "stat_dg_title_load" ++msgstr "" ++ ++#. Load ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:66 ++msgid "stat_dg_label_load" ++msgstr "" ++ ++#. 1 min ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:67 ++msgid "stat_ds_load__shortterm" ++msgstr "" ++ ++#. 5 min ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:68 ++msgid "stat_ds_load__midterm" ++msgstr "" ++ ++#. 15 min ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:69 ++msgid "stat_ds_load__longterm" ++msgstr "" +diff --git a/feeds/luci/applications/luci-app-statistics/po/el/statistics.po b/feeds/luci/applications/luci-app-statistics/po/el/statistics.po +new file mode 100644 +index 0000000..0893e2e +--- /dev/null ++++ b/feeds/luci/applications/luci-app-statistics/po/el/statistics.po +@@ -0,0 +1,626 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Report-Msgid-Bugs-To: \n" ++"POT-Creation-Date: 2009-06-10 03:40+0200\n" ++"PO-Revision-Date: 2012-03-18 15:32+0200\n" ++"Last-Translator: Vasilis \n" ++"Language-Team: LANGUAGE \n" ++"Language: el\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n != 1);\n" ++"X-Generator: Pootle 2.0.4\n" ++ ++msgid "Action (target)" ++msgstr "" ++ ++msgid "Add command for reading values" ++msgstr "" ++ ++msgid "Add matching rule" ++msgstr "" ++ ++msgid "Add multiple hosts separated by space." ++msgstr "" ++ ++msgid "Add notification command" ++msgstr "" ++ ++#, fuzzy ++msgid "Base Directory" ++msgstr "Κατάλογος βάσης" ++ ++msgid "Basic monitoring" ++msgstr "" ++ ++msgid "CPU Plugin Configuration" ++msgstr "" ++ ++msgid "CSV Output" ++msgstr "Έξοδος CSV" ++ ++msgid "CSV Plugin Configuration" ++msgstr "" ++ ++msgid "Cache collected data for" ++msgstr "" ++ ++msgid "Cache flush interval" ++msgstr "" ++ ++msgid "Chain" ++msgstr "" ++ ++msgid "CollectLinks" ++msgstr "" ++ ++msgid "CollectRoutes" ++msgstr "" ++ ++msgid "CollectTopology" ++msgstr "" ++ ++msgid "Collectd" ++msgstr "Collectd" ++ ++msgid "Collectd Settings" ++msgstr "Ρυθμίσεις Collectd" ++ ++msgid "" ++"Collectd is a small daemon for collecting data from various sources through " ++"different plugins. On this page you can change general settings for the " ++"collectd daemon." ++msgstr "" ++"Το Collectd είναι ένας μικÏός δαίμονας για τη συλλογή δεδομένων από διάφοÏες " ++"πηγές μέσω διάφοÏων Ï€Ïοσθέτων. Σε αυτή τη σελίδα μποÏείτε να αλλάξετε τις " ++"γενικές Ïυθμίσεις του δαίμονα collectd." ++ ++msgid "Conntrack" ++msgstr "Conntrack" ++ ++msgid "Conntrack Plugin Configuration" ++msgstr "" ++ ++msgid "DF Plugin Configuration" ++msgstr "" ++ ++msgid "DNS" ++msgstr "DNS" ++ ++msgid "DNS Plugin Configuration" ++msgstr "" ++ ++msgid "Data collection interval" ++msgstr "ΠεÏίοδος συλλογής δεδομένων" ++ ++msgid "Datasets definition file" ++msgstr "ΑÏχείο οÏÎ¹ÏƒÎ¼Î¿Ï ÏƒÏ…Î½ÏŒÎ»Ï‰Î½ δεδομένων" ++ ++msgid "Destination ip range" ++msgstr "" ++ ++msgid "Directory for collectd plugins" ++msgstr "Κατάλογος για Ï€Ïόσθετα collectd" ++ ++#, fuzzy ++msgid "Directory for sub-configurations" ++msgstr "Κατάλογος υπο-Ïυθμίσεων" ++ ++msgid "Disk Plugin Configuration" ++msgstr "" ++ ++msgid "Disk Space Usage" ++msgstr "ΧÏήση ΧώÏου στον δίσκο" ++ ++msgid "Disk Usage" ++msgstr "ΧÏήση Δίσκου" ++ ++msgid "Display Host »" ++msgstr "" ++ ++msgid "Display timespan »" ++msgstr "Εμφάνιση χÏÎ¿Î½Î¹ÎºÎ¿Ï ÎµÏÏους »" ++ ++msgid "E-Mail Plugin Configuration" ++msgstr "" ++ ++msgid "Email" ++msgstr "Ηλ. ΤαχυδÏομείο" ++ ++msgid "Enable this plugin" ++msgstr "" ++ ++msgid "Exec" ++msgstr "Exec" ++ ++msgid "Exec Plugin Configuration" ++msgstr "" ++ ++msgid "Filter class monitoring" ++msgstr "" ++ ++msgid "Firewall" ++msgstr "Τείχος Ï€Ïοστασίας" ++ ++msgid "Flush cache after" ++msgstr "" ++ ++msgid "Forwarding between listen and server addresses" ++msgstr "" ++ ++msgid "Graphs" ++msgstr "ΓÏαφήματα" ++ ++msgid "Group" ++msgstr "" ++ ++msgid "" ++"Here you can define external commands which will be started by collectd in " ++"order to read certain values. The values will be read from stdout." ++msgstr "" ++ ++msgid "" ++"Here you can define external commands which will be started by collectd when " ++"certain threshold values have been reached. The values leading to invokation " ++"will be feeded to the the called programs stdin." ++msgstr "" ++ ++msgid "" ++"Here you can define various criteria by which the monitored iptables rules " ++"are selected." ++msgstr "" ++ ++msgid "Host" ++msgstr "" ++ ++msgid "Hostname" ++msgstr "Όνομα υπολογιστή" ++ ++msgid "IP or hostname where to get the txtinfo output from" ++msgstr "" ++ ++msgid "IRQ Plugin Configuration" ++msgstr "" ++ ++msgid "Ignore source addresses" ++msgstr "" ++ ++msgid "Incoming interface" ++msgstr "" ++ ++msgid "Interface Plugin Configuration" ++msgstr "" ++ ++msgid "Interfaces" ++msgstr "Διεπαφές" ++ ++msgid "Interrupts" ++msgstr "Διακοπές" ++ ++msgid "Interval for pings" ++msgstr "" ++ ++msgid "Iptables Plugin Configuration" ++msgstr "" ++ ++msgid "Leave unselected to automatically determine interfaces to monitor." ++msgstr "" ++ ++msgid "Listen host" ++msgstr "" ++ ++msgid "Listen port" ++msgstr "" ++ ++msgid "Listener interfaces" ++msgstr "" ++ ++msgid "Load Plugin Configuration" ++msgstr "" ++ ++msgid "Maximum allowed connections" ++msgstr "" ++ ++msgid "Memory" ++msgstr "Μνήμη" ++ ++msgid "Memory Plugin Configuration" ++msgstr "" ++ ++msgid "Monitor all except specified" ++msgstr "" ++ ++msgid "Monitor all local listen ports" ++msgstr "" ++ ++msgid "Monitor devices" ++msgstr "" ++ ++msgid "Monitor disks and partitions" ++msgstr "" ++ ++msgid "Monitor filesystem types" ++msgstr "" ++ ++msgid "Monitor hosts" ++msgstr "" ++ ++msgid "Monitor interfaces" ++msgstr "" ++ ++msgid "Monitor interrupts" ++msgstr "" ++ ++msgid "Monitor local ports" ++msgstr "" ++ ++msgid "Monitor mount points" ++msgstr "" ++ ++msgid "Monitor processes" ++msgstr "" ++ ++msgid "Monitor remote ports" ++msgstr "" ++ ++msgid "Name of the rule" ++msgstr "Όνομα κανόνα" ++ ++msgid "Netlink" ++msgstr "Netlink" ++ ++msgid "Netlink Plugin Configuration" ++msgstr "" ++ ++msgid "Network" ++msgstr "Δίκτυο" ++ ++msgid "Network Plugin Configuration" ++msgstr "" ++ ++msgid "Network plugins" ++msgstr "ΠÏόσθετα δικτÏου" ++ ++msgid "Network protocol" ++msgstr "" ++ ++msgid "Number of threads for data collection" ++msgstr "ΑÏιθμός νημάτων για τη συλλογή δεδομένων" ++ ++msgid "OLSRd" ++msgstr "OLSRd" ++ ++msgid "OLSRd Plugin Configuration" ++msgstr "" ++ ++msgid "Only create average RRAs" ++msgstr "" ++ ++msgid "Options" ++msgstr "" ++ ++msgid "Outgoing interface" ++msgstr "" ++ ++msgid "Output plugins" ++msgstr "ΠÏόσθετα εξόδου" ++ ++msgid "Ping" ++msgstr "Ping" ++ ++msgid "Ping Plugin Configuration" ++msgstr "" ++ ++msgid "Port" ++msgstr "" ++ ++msgid "Processes" ++msgstr "ΔιεÏγασίες" ++ ++msgid "Processes Plugin Configuration" ++msgstr "" ++ ++msgid "Processes to monitor separated by space" ++msgstr "" ++ ++msgid "Processor" ++msgstr "ΕπεξεÏγαστής" ++ ++msgid "Qdisc monitoring" ++msgstr "" ++ ++msgid "RRD XFiles Factor" ++msgstr "" ++ ++msgid "RRD heart beat interval" ++msgstr "" ++ ++msgid "RRD step interval" ++msgstr "" ++ ++msgid "RRDTool" ++msgstr "RRDTool" ++ ++msgid "RRDTool Plugin Configuration" ++msgstr "" ++ ++msgid "Rows per RRA" ++msgstr "" ++ ++msgid "Script" ++msgstr "" ++ ++msgid "Seconds" ++msgstr "ΔευτεÏόλεπτα" ++ ++msgid "Server host" ++msgstr "" ++ ++msgid "Server port" ++msgstr "" ++ ++msgid "Shaping class monitoring" ++msgstr "" ++ ++msgid "Socket file" ++msgstr "" ++ ++msgid "Socket group" ++msgstr "" ++ ++msgid "Socket permissions" ++msgstr "" ++ ++msgid "Source ip range" ++msgstr "" ++ ++msgid "Specifies what information to collect about links." ++msgstr "" ++ ++msgid "Specifies what information to collect about routes." ++msgstr "" ++ ++msgid "Specifies what information to collect about the global topology." ++msgstr "" ++ ++msgid "Splash Leases" ++msgstr "" ++ ++msgid "Splash Leases Plugin Configuration" ++msgstr "" ++ ++msgid "Statistics" ++msgstr "Στατιστικά" ++ ++msgid "Storage directory" ++msgstr "" ++ ++msgid "Storage directory for the csv files" ++msgstr "" ++ ++msgid "Store data values as rates instead of absolute values" ++msgstr "" ++ ++msgid "Stored timespans" ++msgstr "" ++ ++msgid "System Load" ++msgstr "ΦόÏτος Συστήματος" ++ ++msgid "System plugins" ++msgstr "ΠÏόσθετα συστήματος" ++ ++msgid "TCP Connections" ++msgstr "Συνδέσεις TCP" ++ ++msgid "TCPConns Plugin Configuration" ++msgstr "" ++ ++msgid "TTL for network packets" ++msgstr "" ++ ++msgid "TTL for ping packets" ++msgstr "" ++ ++msgid "Table" ++msgstr "Πίνακας" ++ ++msgid "The NUT plugin reads information about Uninterruptible Power Supplies." ++msgstr "" ++ ++msgid "" ++"The OLSRd plugin reads information about meshed networks from the txtinfo " ++"plugin of OLSRd." ++msgstr "" ++ ++msgid "" ++"The conntrack plugin collects statistics about the number of tracked " ++"connections." ++msgstr "" ++ ++msgid "The cpu plugin collects basic statistics about the processor usage." ++msgstr "" ++ ++msgid "" ++"The csv plugin stores collected data in csv file format for further " ++"processing by external programs." ++msgstr "" ++ ++msgid "" ++"The df plugin collects statistics about the disk space usage on different " ++"devices, mount points or filesystem types." ++msgstr "" ++ ++msgid "" ++"The disk plugin collects detailled usage statistics for selected partitions " ++"or whole disks." ++msgstr "" ++ ++msgid "" ++"The dns plugin collects detailled statistics about dns related traffic on " ++"selected interfaces." ++msgstr "" ++ ++msgid "" ++"The email plugin creates a unix socket which can be used to transmit email-" ++"statistics to a running collectd daemon. This plugin is primarily intended " ++"to be used in conjunction with Mail::SpamAssasin::Plugin::Collectd but can " ++"be used in other ways as well." ++msgstr "" ++ ++msgid "" ++"The exec plugin starts external commands to read values from or to notify " ++"external processes when certain threshold values have been reached." ++msgstr "" ++ ++msgid "" ++"The interface plugin collects traffic statistics on selected interfaces." ++msgstr "" ++ ++msgid "" ++"The iptables plugin will monitor selected firewall rules and collect " ++"informations about processed bytes and packets per rule." ++msgstr "" ++ ++msgid "" ++"The irq plugin will monitor the rate of issues per second for each selected " ++"interrupt. If no interrupt is selected then all interrupts are monitored." ++msgstr "" ++ ++msgid "" ++"The iwinfo plugin collects statistics about wireless signal strength, noise " ++"and quality." ++msgstr "" ++ ++msgid "The load plugin collects statistics about the general system load." ++msgstr "" ++ ++msgid "The memory plugin collects statistics about the memory usage." ++msgstr "" ++ ++msgid "" ++"The netlink plugin collects extended informations like qdisc-, class- and " ++"filter-statistics for selected interfaces." ++msgstr "" ++ ++msgid "" ++"The network plugin provides network based communication between different " ++"collectd instances. Collectd can operate both in client and server mode. In " ++"client mode locally collected data is transferred to a collectd server " ++"instance, in server mode the local instance receives data from other hosts." ++msgstr "" ++ ++msgid "" ++"The ping plugin will send icmp echo replies to selected hosts and measure " ++"the roundtrip time for each host." ++msgstr "" ++ ++msgid "" ++"The processes plugin collects informations like cpu time, page faults and " ++"memory usage of selected processes." ++msgstr "" ++ ++msgid "" ++"The rrdtool plugin stores the collected data in rrd database files, the " ++"foundation of the diagrams.

    Warning: Setting the wrong " ++"values will result in a very high memory consumption in the temporary " ++"directory. This can render the device unusable!" ++msgstr "" ++ ++msgid "" ++"The splash leases plugin uses libuci to collect statistics about splash " ++"leases." ++msgstr "" ++ ++msgid "" ++"The statistics package is based on Collectd and uses RRD " ++"Tool to render diagram images from collected data." ++msgstr "" ++"Το πακέτο στατιστικών βασίζεται στο Collectd και χÏησιμοποιεί το RRD Tool για να σχεδιάσει διαγÏάμματα από τα συλλεγόμενα δεδομένα." ++ ++msgid "" ++"The tcpconns plugin collects informations about open tcp connections on " ++"selected ports." ++msgstr "" ++ ++msgid "" ++"The unixsock plugin creates a unix socket which can be used to read " ++"collected data from a running collectd instance." ++msgstr "" ++ ++msgid "The uptime plugin collects statistics about the uptime of the system." ++msgstr "" ++ ++msgid "" ++"This section defines on which interfaces collectd will wait for incoming " ++"connections." ++msgstr "" ++ ++msgid "" ++"This section defines to which servers the locally collected data is sent to." ++msgstr "" ++ ++msgid "Try to lookup fully qualified hostname" ++msgstr "" ++ ++msgid "UPS" ++msgstr "" ++ ++msgid "UPS Plugin Configuration" ++msgstr "" ++ ++msgid "UPS name in NUT ups@host format" ++msgstr "" ++ ++msgid "UnixSock" ++msgstr "UnixSock" ++ ++msgid "Unixsock Plugin Configuration" ++msgstr "" ++ ++msgid "Uptime" ++msgstr "" ++ ++msgid "Uptime Plugin Configuration" ++msgstr "" ++ ++msgid "Used PID file" ++msgstr "ΑÏχείο PID σε χÏήση" ++ ++msgid "User" ++msgstr "" ++ ++msgid "Verbose monitoring" ++msgstr "" ++ ++msgid "Wireless" ++msgstr "ΑσÏÏματο" ++ ++msgid "Wireless iwinfo Plugin Configuration" ++msgstr "" ++ ++msgid "e.g. br-ff" ++msgstr "Ï€.χ. br-ff" ++ ++msgid "e.g. br-lan" ++msgstr "Ï€.χ. br-lan" ++ ++msgid "e.g. reject-with tcp-reset" ++msgstr "" ++ ++msgid "max. 16 chars" ++msgstr "" ++ ++msgid "reduces rrd size" ++msgstr "" ++ ++msgid "seconds; multiple separated by space" ++msgstr "" ++ ++msgid "server interfaces" ++msgstr "" +diff --git a/feeds/luci/applications/luci-app-statistics/po/en/rrdtool.po b/feeds/luci/applications/luci-app-statistics/po/en/rrdtool.po +new file mode 100644 +index 0000000..d780144 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-statistics/po/en/rrdtool.po +@@ -0,0 +1,358 @@ ++#, fuzzy ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Report-Msgid-Bugs-To: \n" ++"POT-Creation-Date: 2009-05-19 19:36+0200\n" ++"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" ++"Last-Translator: FULL NAME \n" ++"Language-Team: LANGUAGE \n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"X-Generator: Translate Toolkit 1.1.1\n" ++ ++#. %H: Wireless - Signal Noise Ratio ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:1 ++msgid "stat_dg_title_wireless__signal_noise" ++msgstr "%H: Wireless - Signal Noise Ratio" ++ ++#. dBm ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:2 ++msgid "stat_dg_label_wireless__signal_noise" ++msgstr "dBm" ++ ++#. Noise Level ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:3 ++msgid "stat_ds_signal_noise" ++msgstr "Noise Level" ++ ++#. Signal Strength ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:4 ++msgid "stat_ds_signal_power" ++msgstr "Signal Strength" ++ ++#. %H: Wireless - Signal Quality ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:5 ++msgid "stat_dg_title_wireless__signal_quality" ++msgstr "%H: Wireless - Signal Quality" ++ ++#. n ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:6 ++msgid "stat_dg_label_wireless__signal_quality" ++msgstr "n" ++ ++#. Signal Quality ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:7 ++msgid "stat_ds_signal_quality" ++msgstr "Signal Quality" ++ ++#. %H: ICMP Roundtrip Times ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:8 ++msgid "stat_dg_title_ping" ++msgstr "%H: ICMP Roundtrip Times" ++ ++#. ms ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:9 ++msgid "stat_dg_label_ping" ++msgstr "ms" ++ ++#. %di ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:10 ++msgid "stat_ds_ping" ++msgstr "%di" ++ ++#. %H: Firewall - Processed Packets ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:11 ++msgid "stat_dg_title_iptables__ipt_packets" ++msgstr "%H: Firewall - Processed Packets" ++ ++#. Packets/s ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:12 ++msgid "stat_dg_label_iptables__ipt_packets" ++msgstr "Packets/s" ++ ++#. Chain \"%di\" ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:13 ++msgid "stat_ds_ipt_packets" ++msgstr "Chain \"%di\"" ++ ++#. %H: Netlink - Transfer on %pi ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:14 ++msgid "stat_dg_title_netlink__if_octets" ++msgstr "%H: Netlink - Transfer on %pi" ++ ++#. Bytes/s ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:15 ++msgid "stat_dg_label_netlink__if_octets" ++msgstr "Bytes/s" ++ ++#. Bytes (%ds) ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:16 ++msgid "stat_ds_if_octets" ++msgstr "Bytes (%ds)" ++ ++#. %H: Netlink - Packets on %pi ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:17 ++msgid "stat_dg_title_netlink__if_packets" ++msgstr "%H: Netlink - Packets on %pi" ++ ++#. Packets/s ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:18 ++msgid "stat_dg_label_netlink__if_packets" ++msgstr "Packets/s" ++ ++#. Processed (%ds) ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:19 ++msgid "stat_ds_if_packets" ++msgstr "Processed (%ds)" ++ ++#. Dropped (%ds) ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:20 ++msgid "stat_ds_if_dropped" ++msgstr "Dropped (%ds)" ++ ++#. Errors (%ds) ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:21 ++msgid "stat_ds_if_errors" ++msgstr "Errors (%ds)" ++ ++#. %H: Netlink - Multicast on %pi ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:22 ++msgid "stat_dg_title_netlink__if_multicast" ++msgstr "%H: Netlink - Multicast on %pi" ++ ++#. Packets/s ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:23 ++msgid "stat_dg_label_netlink__if_multicast" ++msgstr "Packets/s" ++ ++#. Packets ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:24 ++msgid "stat_ds_if_multicast" ++msgstr "Packets" ++ ++#. %H: Netlink - Collisions on %pi ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:25 ++msgid "stat_dg_title_netlink__if_collisions" ++msgstr "%H: Netlink - Collisions on %pi" ++ ++#. Collisions/s ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:26 ++msgid "stat_dg_label_netlink__if_collisions" ++msgstr "Collisions/s" ++ ++#. Collisions ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:27 ++msgid "stat_ds_if_collisions" ++msgstr "Collisions" ++ ++#. %H: Netlink - Errors on %pi ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:28 ++msgid "stat_dg_title_netlink__if_tx_errors" ++msgstr "%H: Netlink - Errors on %pi" ++ ++#. Errors/s ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:29 ++msgid "stat_dg_label_netlink__if_tx_errors" ++msgstr "Errors/s" ++ ++#. %di ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:30 ++msgid "stat_ds_if_tx_errors" ++msgstr "%di" ++ ++#. %di ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:31 ++msgid "stat_ds_if_rx_errors" ++msgstr "%di" ++ ++#. %H: Processes ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:32 ++msgid "stat_dg_title_processes" ++msgstr "%H: Processes" ++ ++#. Processes/s ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:33 ++msgid "stat_dg_label_processes" ++msgstr "Processes/s" ++ ++#. %di ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:34 ++msgid "stat_ds_ps_state" ++msgstr "%di" ++ ++#. %H: Process %pi - used cpu time ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:35 ++msgid "stat_dg_title_processes__ps_cputime" ++msgstr "%H: Process %pi - used cpu time" ++ ++#. Jiffies ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:36 ++msgid "stat_dg_label_processes__ps_cputime" ++msgstr "Jiffies" ++ ++#. system ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:37 ++msgid "stat_ds_ps_cputime__syst" ++msgstr "system" ++ ++#. user ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:38 ++msgid "stat_ds_ps_cputime__user" ++msgstr "user" ++ ++#. %H: Process %pi - threads and processes ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:39 ++msgid "stat_dg_title_processes__ps_count" ++msgstr "%H: Process %pi - threads and processes" ++ ++#. Count ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:40 ++msgid "stat_dg_label_processes__ps_count" ++msgstr "Count" ++ ++#. %ds ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:41 ++msgid "stat_ds_ps_count" ++msgstr "%ds" ++ ++#. %H: Process %pi - page faults ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:42 ++msgid "stat_dg_title_processes__ps_pagefaults" ++msgstr "%H: Process %pi - page faults" ++ ++#. Pagefaults ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:43 ++msgid "stat_dg_label_processes__ps_pagefaults" ++msgstr "Pagefaults" ++ ++#. page faults ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:44 ++msgid "stat_ds_ps_pagefaults" ++msgstr "page faults" ++ ++#. %H: Process %pi - virtual memory size ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:45 ++msgid "stat_dg_title_processes__ps_rss" ++msgstr "%H: Process %pi - virtual memory size" ++ ++#. Bytes ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:46 ++msgid "stat_dg_label_processes__ps_rss" ++msgstr "Bytes" ++ ++#. virtual memory ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:47 ++msgid "stat_ds_ps_rss" ++msgstr "virtual memory" ++ ++#. %H: Usage on Processor #%pi ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:48 ++msgid "stat_dg_title_cpu" ++msgstr "%H: Usage on Processor #%pi" ++ ++#. % ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:49 ++msgid "stat_dg_label_cpu" ++msgstr "%" ++ ++#. %di ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:50 ++msgid "stat_ds_cpu" ++msgstr "%di" ++ ++#. %H: Transfer on %di ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:51 ++msgid "stat_dg_title_interface__if_octets" ++msgstr "%H: Transfer on %di" ++ ++#. Bytes/s ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:52 ++msgid "stat_dg_label_interface__if_octets" ++msgstr "Bytes/s" ++ ++#. %H: Packets on %di ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:53 ++msgid "stat_dg_title_interface__if_packets" ++msgstr "%H: Packets on %di" ++ ++#. Packets/s ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:54 ++msgid "stat_dg_label_interface__if_packets" ++msgstr "Packets/s" ++ ++#. %H: TCP-Connections to Port %pi ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:55 ++msgid "stat_dg_title_tcpconns" ++msgstr "%H: TCP-Connections to Port %pi" ++ ++#. Connections/s ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:56 ++msgid "stat_dg_label_tcpconns" ++msgstr "Connections/s" ++ ++#. %di ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:57 ++msgid "stat_ds_tcp_connections" ++msgstr "%di" ++ ++#. %H: Disk Space Usage on %di ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:58 ++msgid "stat_dg_title_df" ++msgstr "%H: Disk Space Usage on %di" ++ ++#. Bytes ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:59 ++msgid "stat_dg_label_df" ++msgstr "Bytes" ++ ++#. %ds ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:60 ++msgid "stat_ds_df__free" ++msgstr "%ds" ++ ++#. %ds ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:61 ++msgid "stat_ds_df__used" ++msgstr "%ds" ++ ++#. %H: Interrupts ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:62 ++msgid "stat_dg_title_irq" ++msgstr "%H: Interrupts" ++ ++#. Issues/s ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:63 ++msgid "stat_dg_label_irq" ++msgstr "Issues/s" ++ ++#. IRQ %di ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:64 ++msgid "stat_ds_irq" ++msgstr "IRQ %di" ++ ++#. %H: System Load ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:65 ++msgid "stat_dg_title_load" ++msgstr "%H: System Load" ++ ++#. Load ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:66 ++msgid "stat_dg_label_load" ++msgstr "Load" ++ ++#. 1 min ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:67 ++msgid "stat_ds_load__shortterm" ++msgstr "1 min" ++ ++#. 5 min ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:68 ++msgid "stat_ds_load__midterm" ++msgstr "5 min" ++ ++#. 15 min ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:69 ++msgid "stat_ds_load__longterm" ++msgstr "15 min" +diff --git a/feeds/luci/applications/luci-app-statistics/po/en/statistics.po b/feeds/luci/applications/luci-app-statistics/po/en/statistics.po +new file mode 100644 +index 0000000..4d94313 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-statistics/po/en/statistics.po +@@ -0,0 +1,681 @@ ++#, fuzzy ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Report-Msgid-Bugs-To: \n" ++"POT-Creation-Date: 2009-05-19 19:35+0200\n" ++"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" ++"Last-Translator: FULL NAME \n" ++"Language-Team: LANGUAGE \n" ++"Language: \n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"X-Generator: Translate Toolkit 1.1.1\n" ++ ++msgid "Action (target)" ++msgstr "Action (target)" ++ ++msgid "Add command for reading values" ++msgstr "Add command for reading values" ++ ++msgid "Add matching rule" ++msgstr "Add matching rule" ++ ++msgid "Add multiple hosts separated by space." ++msgstr "" ++ ++msgid "Add notification command" ++msgstr "Add notification command" ++ ++msgid "Base Directory" ++msgstr "Base Directory" ++ ++msgid "Basic monitoring" ++msgstr "Basic monitoring" ++ ++msgid "CPU Plugin Configuration" ++msgstr "CPU Plugin Configuration" ++ ++msgid "CSV Output" ++msgstr "CSV Output" ++ ++msgid "CSV Plugin Configuration" ++msgstr "CSV Plugin Configuration" ++ ++msgid "Cache collected data for" ++msgstr "Cache collected data for" ++ ++msgid "Cache flush interval" ++msgstr "Cache flush interval" ++ ++msgid "Chain" ++msgstr "Chain" ++ ++msgid "CollectLinks" ++msgstr "" ++ ++msgid "CollectRoutes" ++msgstr "" ++ ++msgid "CollectTopology" ++msgstr "" ++ ++msgid "Collectd" ++msgstr "Collectd" ++ ++msgid "Collectd Settings" ++msgstr "Collectd Settings" ++ ++msgid "" ++"Collectd is a small daemon for collecting data from various sources through " ++"different plugins. On this page you can change general settings for the " ++"collectd daemon." ++msgstr "" ++"Collectd is a small daemon for collecting data from various sources through " ++"different plugins. On this page you can change general settings for the " ++"collectd daemon." ++ ++msgid "Conntrack" ++msgstr "" ++ ++msgid "Conntrack Plugin Configuration" ++msgstr "" ++ ++msgid "DF Plugin Configuration" ++msgstr "DF Plugin Configuration" ++ ++msgid "DNS" ++msgstr "DNS" ++ ++msgid "DNS Plugin Configuration" ++msgstr "DNS Plugin Configuration" ++ ++msgid "Data collection interval" ++msgstr "Data collection interval" ++ ++msgid "Datasets definition file" ++msgstr "Datasets definition file" ++ ++msgid "Destination ip range" ++msgstr "Destination ip range" ++ ++msgid "Directory for collectd plugins" ++msgstr "Directory for collectd plugins" ++ ++msgid "Directory for sub-configurations" ++msgstr "Directory for sub-configurations" ++ ++msgid "Disk Plugin Configuration" ++msgstr "Disk Plugin Configuration" ++ ++msgid "Disk Space Usage" ++msgstr "Disk Space Usage" ++ ++msgid "Disk Usage" ++msgstr "Disk Usage" ++ ++msgid "Display Host »" ++msgstr "" ++ ++msgid "Display timespan »" ++msgstr "Display timespan »" ++ ++msgid "E-Mail Plugin Configuration" ++msgstr "E-Mail Plugin Configuration" ++ ++msgid "Email" ++msgstr "Email" ++ ++msgid "Enable this plugin" ++msgstr "Enable this plugin" ++ ++msgid "Exec" ++msgstr "Exec" ++ ++msgid "Exec Plugin Configuration" ++msgstr "Exec Plugin Configuration" ++ ++msgid "Filter class monitoring" ++msgstr "Filter class monitoring" ++ ++msgid "Firewall" ++msgstr "Firewall" ++ ++msgid "Flush cache after" ++msgstr "Flush cache after" ++ ++msgid "Forwarding between listen and server addresses" ++msgstr "Forwarding between listen and server addresses" ++ ++msgid "Graphs" ++msgstr "Graphs" ++ ++msgid "Group" ++msgstr "" ++ ++msgid "" ++"Here you can define external commands which will be started by collectd in " ++"order to read certain values. The values will be read from stdout." ++msgstr "" ++"Here you can define external commands which will be started by collectd in " ++"order to read certain values. The values will be read from stdout." ++ ++msgid "" ++"Here you can define external commands which will be started by collectd when " ++"certain threshold values have been reached. The values leading to invokation " ++"will be feeded to the the called programs stdin." ++msgstr "" ++"Here you can define external commands which will be started by collectd when " ++"certain threshold values have been reached. The values leading to invokation " ++"will be feeded to the the called programs stdin." ++ ++msgid "" ++"Here you can define various criteria by which the monitored iptables rules " ++"are selected." ++msgstr "" ++"Here you can define various criteria by which the monitored iptables rules " ++"are selected." ++ ++msgid "Host" ++msgstr "" ++ ++msgid "Hostname" ++msgstr "Hostname" ++ ++msgid "IP or hostname where to get the txtinfo output from" ++msgstr "" ++ ++msgid "IRQ Plugin Configuration" ++msgstr "IRQ Plugin Configuration" ++ ++msgid "Ignore source addresses" ++msgstr "Ignore source addresses" ++ ++msgid "Incoming interface" ++msgstr "Incoming interface" ++ ++msgid "Interface Plugin Configuration" ++msgstr "Interface Plugin Configuration" ++ ++msgid "Interfaces" ++msgstr "Interfaces" ++ ++msgid "Interrupts" ++msgstr "Interrupts" ++ ++msgid "Interval for pings" ++msgstr "" ++ ++msgid "Iptables Plugin Configuration" ++msgstr "Iptables Plugin Configuration" ++ ++msgid "Leave unselected to automatically determine interfaces to monitor." ++msgstr "" ++ ++msgid "Listen host" ++msgstr "Listen host" ++ ++msgid "Listen port" ++msgstr "Listen port" ++ ++msgid "Listener interfaces" ++msgstr "Listener interfaces" ++ ++msgid "Load Plugin Configuration" ++msgstr "Load Plugin Configuration" ++ ++msgid "Maximum allowed connections" ++msgstr "Maximum allowed connections" ++ ++msgid "Memory" ++msgstr "" ++ ++msgid "Memory Plugin Configuration" ++msgstr "" ++ ++msgid "Monitor all except specified" ++msgstr "" ++ ++msgid "Monitor all local listen ports" ++msgstr "Monitor all local listen ports" ++ ++msgid "Monitor devices" ++msgstr "Monitor devices" ++ ++msgid "Monitor disks and partitions" ++msgstr "Monitor disks and partitions" ++ ++msgid "Monitor filesystem types" ++msgstr "Monitor filesystem types" ++ ++msgid "Monitor hosts" ++msgstr "Monitor hosts" ++ ++msgid "Monitor interfaces" ++msgstr "" ++ ++msgid "Monitor interrupts" ++msgstr "Monitor interrupts" ++ ++msgid "Monitor local ports" ++msgstr "Monitor local ports" ++ ++msgid "Monitor mount points" ++msgstr "Monitor mount points" ++ ++msgid "Monitor processes" ++msgstr "Monitor processes" ++ ++msgid "Monitor remote ports" ++msgstr "Monitor remote ports" ++ ++msgid "Name of the rule" ++msgstr "Name of the rule" ++ ++msgid "Netlink" ++msgstr "Netlink" ++ ++msgid "Netlink Plugin Configuration" ++msgstr "Netlink Plugin Configuration" ++ ++msgid "Network" ++msgstr "Network" ++ ++msgid "Network Plugin Configuration" ++msgstr "Network Plugin Configuration" ++ ++msgid "Network plugins" ++msgstr "Network plugins" ++ ++msgid "Network protocol" ++msgstr "Network protocol" ++ ++msgid "Number of threads for data collection" ++msgstr "Number of threads for data collection" ++ ++msgid "OLSRd" ++msgstr "" ++ ++msgid "OLSRd Plugin Configuration" ++msgstr "" ++ ++msgid "Only create average RRAs" ++msgstr "Only create average RRAs" ++ ++msgid "Options" ++msgstr "Options" ++ ++msgid "Outgoing interface" ++msgstr "Outgoing interface" ++ ++msgid "Output plugins" ++msgstr "Output plugins" ++ ++msgid "Ping" ++msgstr "Ping" ++ ++msgid "Ping Plugin Configuration" ++msgstr "Ping Plugin Configuration" ++ ++msgid "Port" ++msgstr "" ++ ++msgid "Processes" ++msgstr "Processes" ++ ++msgid "Processes Plugin Configuration" ++msgstr "Processes Plugin Configuration" ++ ++msgid "Processes to monitor separated by space" ++msgstr "" ++ ++msgid "Processor" ++msgstr "Processor" ++ ++msgid "Qdisc monitoring" ++msgstr "Qdisc monitoring" ++ ++msgid "RRD XFiles Factor" ++msgstr "RRD XFiles Factor" ++ ++msgid "RRD heart beat interval" ++msgstr "RRD heart beat interval" ++ ++msgid "RRD step interval" ++msgstr "RRD step interval" ++ ++msgid "RRDTool" ++msgstr "RRDTool" ++ ++msgid "RRDTool Plugin Configuration" ++msgstr "RRDTool Plugin Configuration" ++ ++msgid "Rows per RRA" ++msgstr "Rows per RRA" ++ ++msgid "Script" ++msgstr "" ++ ++msgid "Seconds" ++msgstr "Seconds" ++ ++msgid "Server host" ++msgstr "Server host" ++ ++msgid "Server port" ++msgstr "Server port" ++ ++msgid "Shaping class monitoring" ++msgstr "Shaping class monitoring" ++ ++msgid "Socket file" ++msgstr "" ++ ++msgid "Socket group" ++msgstr "" ++ ++msgid "Socket permissions" ++msgstr "" ++ ++msgid "Source ip range" ++msgstr "Source ip range" ++ ++msgid "Specifies what information to collect about links." ++msgstr "" ++ ++msgid "Specifies what information to collect about routes." ++msgstr "" ++ ++msgid "Specifies what information to collect about the global topology." ++msgstr "" ++ ++msgid "Splash Leases" ++msgstr "" ++ ++msgid "Splash Leases Plugin Configuration" ++msgstr "" ++ ++msgid "Statistics" ++msgstr "" ++ ++msgid "Storage directory" ++msgstr "Storage directory" ++ ++msgid "Storage directory for the csv files" ++msgstr "Storage directory for the csv files" ++ ++msgid "Store data values as rates instead of absolute values" ++msgstr "Store data values as rates instead of absolute values" ++ ++msgid "Stored timespans" ++msgstr "Stored timespans" ++ ++msgid "System Load" ++msgstr "System Load" ++ ++msgid "System plugins" ++msgstr "System plugins" ++ ++msgid "TCP Connections" ++msgstr "TCP Connections" ++ ++msgid "TCPConns Plugin Configuration" ++msgstr "TCPConns Plugin Configuration" ++ ++msgid "TTL for network packets" ++msgstr "TTL for network packets" ++ ++msgid "TTL for ping packets" ++msgstr "TTL for ping packets" ++ ++msgid "Table" ++msgstr "Table" ++ ++msgid "The NUT plugin reads information about Uninterruptible Power Supplies." ++msgstr "" ++ ++msgid "" ++"The OLSRd plugin reads information about meshed networks from the txtinfo " ++"plugin of OLSRd." ++msgstr "" ++ ++msgid "" ++"The conntrack plugin collects statistics about the number of tracked " ++"connections." ++msgstr "" ++ ++msgid "The cpu plugin collects basic statistics about the processor usage." ++msgstr "The cpu plugin collects basic statistics about the processor usage." ++ ++msgid "" ++"The csv plugin stores collected data in csv file format for further " ++"processing by external programs." ++msgstr "" ++"The csv plugin stores collected data in csv file format for further " ++"processing by external programs." ++ ++msgid "" ++"The df plugin collects statistics about the disk space usage on different " ++"devices, mount points or filesystem types." ++msgstr "" ++"The df plugin collects statistics about the disk space usage on different " ++"devices, mount points or filesystem types." ++ ++msgid "" ++"The disk plugin collects detailled usage statistics for selected partitions " ++"or whole disks." ++msgstr "" ++"The disk plugin collects detailled usage statistics for selected partitions " ++"or whole disks." ++ ++msgid "" ++"The dns plugin collects detailled statistics about dns related traffic on " ++"selected interfaces." ++msgstr "" ++"The dns plugin collects detailled statistics about dns related traffic on " ++"selected interfaces." ++ ++msgid "" ++"The email plugin creates a unix socket which can be used to transmit email-" ++"statistics to a running collectd daemon. This plugin is primarily intended " ++"to be used in conjunction with Mail::SpamAssasin::Plugin::Collectd but can " ++"be used in other ways as well." ++msgstr "" ++"The email plugin creates a unix socket which can be used to transmit email-" ++"statistics to a running collectd daemon. This plugin is primarily intended " ++"to be used in conjunction with Mail::SpamAssasin::Plugin::Collectd but can " ++"be used in other ways as well." ++ ++msgid "" ++"The exec plugin starts external commands to read values from or to notify " ++"external processes when certain threshold values have been reached." ++msgstr "" ++"The exec plugin starts external commands to read values from or to notify " ++"external processes when certain threshold values have been reached." ++ ++msgid "" ++"The interface plugin collects traffic statistics on selected interfaces." ++msgstr "" ++"The interface plugin collects traffic statistics on selected interfaces." ++ ++msgid "" ++"The iptables plugin will monitor selected firewall rules and collect " ++"informations about processed bytes and packets per rule." ++msgstr "" ++"The iptables plugin will monitor selected firewall rules and collect " ++"informations about processed bytes and packets per rule." ++ ++msgid "" ++"The irq plugin will monitor the rate of issues per second for each selected " ++"interrupt. If no interrupt is selected then all interrupts are monitored." ++msgstr "" ++"The irq plugin will monitor the rate of issues per second for each selected " ++"interrupt. If no interrupt is selected then all interrupts are monitored." ++ ++msgid "" ++"The iwinfo plugin collects statistics about wireless signal strength, noise " ++"and quality." ++msgstr "" ++ ++msgid "The load plugin collects statistics about the general system load." ++msgstr "The load plugin collects statistics about the general system load." ++ ++msgid "The memory plugin collects statistics about the memory usage." ++msgstr "" ++ ++msgid "" ++"The netlink plugin collects extended informations like qdisc-, class- and " ++"filter-statistics for selected interfaces." ++msgstr "" ++"The netlink plugin collects extended informations like qdisc-, class- and " ++"filter-statistics for selected interfaces." ++ ++msgid "" ++"The network plugin provides network based communication between different " ++"collectd instances. Collectd can operate both in client and server mode. In " ++"client mode locally collected data is transferred to a collectd server " ++"instance, in server mode the local instance receives data from other hosts." ++msgstr "" ++"The network plugin provides network based communication between different " ++"collectd instances. Collectd can operate both in client and server mode. In " ++"client mode locally collected data is transferred to a collectd server " ++"instance, in server mode the local instance receives data from other hosts." ++ ++msgid "" ++"The ping plugin will send icmp echo replies to selected hosts and measure " ++"the roundtrip time for each host." ++msgstr "" ++"The ping plugin will send icmp echo replies to selected hosts and measure " ++"the roundtrip time for each host." ++ ++msgid "" ++"The processes plugin collects informations like cpu time, page faults and " ++"memory usage of selected processes." ++msgstr "" ++"The processes plugin collects informations like cpu time, page faults and " ++"memory usage of selected processes." ++ ++msgid "" ++"The rrdtool plugin stores the collected data in rrd database files, the " ++"foundation of the diagrams.

    Warning: Setting the wrong " ++"values will result in a very high memory consumption in the temporary " ++"directory. This can render the device unusable!" ++msgstr "" ++"The rrdtool plugin stores the collected data in rrd database files, the " ++"foundation of the diagrams.

    Warning: Setting the wrong " ++"values will result in a very high memory consumption in the temporary " ++"directory. This can render the device unusable!" ++ ++msgid "" ++"The splash leases plugin uses libuci to collect statistics about splash " ++"leases." ++msgstr "" ++ ++msgid "" ++"The statistics package is based on Collectd and uses RRD " ++"Tool to render diagram images from collected data." ++msgstr "" ++"The statistics package is based on Collectd and uses RRD " ++"Tool to render diagram images from collected data." ++ ++msgid "" ++"The tcpconns plugin collects informations about open tcp connections on " ++"selected ports." ++msgstr "" ++"The tcpconns plugin collects informations about open tcp connections on " ++"selected ports." ++ ++msgid "" ++"The unixsock plugin creates a unix socket which can be used to read " ++"collected data from a running collectd instance." ++msgstr "" ++"The unixsock plugin creates a unix socket which can be used to read " ++"collected data from a running collectd instance." ++ ++msgid "The uptime plugin collects statistics about the uptime of the system." ++msgstr "" ++ ++msgid "" ++"This section defines on which interfaces collectd will wait for incoming " ++"connections." ++msgstr "" ++"This section defines on which interfaces collectd will wait for incoming " ++"connections." ++ ++msgid "" ++"This section defines to which servers the locally collected data is sent to." ++msgstr "" ++"This section defines to which servers the locally collected data is sent to." ++ ++msgid "Try to lookup fully qualified hostname" ++msgstr "Try to lookup fully qualified hostname" ++ ++msgid "UPS" ++msgstr "" ++ ++msgid "UPS Plugin Configuration" ++msgstr "" ++ ++msgid "UPS name in NUT ups@host format" ++msgstr "" ++ ++msgid "UnixSock" ++msgstr "UnixSock" ++ ++msgid "Unixsock Plugin Configuration" ++msgstr "Unixsock Plugin Configuration" ++ ++msgid "Uptime" ++msgstr "" ++ ++msgid "Uptime Plugin Configuration" ++msgstr "" ++ ++msgid "Used PID file" ++msgstr "Used PID file" ++ ++msgid "User" ++msgstr "" ++ ++msgid "Verbose monitoring" ++msgstr "Verbose monitoring" ++ ++msgid "Wireless" ++msgstr "Wireless" ++ ++msgid "Wireless iwinfo Plugin Configuration" ++msgstr "" ++ ++msgid "e.g. br-ff" ++msgstr "e.g. br-ff" ++ ++msgid "e.g. br-lan" ++msgstr "e.g. br-lan" ++ ++msgid "e.g. reject-with tcp-reset" ++msgstr "e.g. reject-with tcp-reset" ++ ++msgid "max. 16 chars" ++msgstr "max. 16 chars" ++ ++msgid "reduces rrd size" ++msgstr "reduces rrd size" ++ ++msgid "seconds; multiple separated by space" ++msgstr "seconds; multiple separated by space" ++ ++msgid "server interfaces" ++msgstr "server interfaces" ++ ++#~ msgid "" ++#~ "The wireless plugin collects statistics about wireless signal strength, " ++#~ "noise and quality." ++#~ msgstr "" ++#~ "The wireless plugin collects statistics about wireless signal strength, " ++#~ "noise and quality." ++ ++#~ msgid "Wireless Plugin Configuration" ++#~ msgstr "Wireless Plugin Configuration" +diff --git a/feeds/luci/applications/luci-app-statistics/po/es/rrdtool.po b/feeds/luci/applications/luci-app-statistics/po/es/rrdtool.po +new file mode 100644 +index 0000000..3cf27a2 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-statistics/po/es/rrdtool.po +@@ -0,0 +1,360 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Report-Msgid-Bugs-To: \n" ++"POT-Creation-Date: 2009-06-10 03:41+0200\n" ++"PO-Revision-Date: 2012-04-16 01:53+0200\n" ++"Last-Translator: Jose \n" ++"Language-Team: LANGUAGE \n" ++"Language: es\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n != 1);\n" ++"X-Generator: Pootle 2.0.4\n" ++ ++#. %H: Wireless - Signal Noise Ratio ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:1 ++msgid "stat_dg_title_wireless__signal_noise" ++msgstr "%H: Wireless - Relación señal/ruido" ++ ++#. dBm ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:2 ++msgid "stat_dg_label_wireless__signal_noise" ++msgstr "dBm" ++ ++#. Noise Level ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:3 ++msgid "stat_ds_signal_noise" ++msgstr "Nivel de Ruido" ++ ++#. Signal Strength ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:4 ++msgid "stat_ds_signal_power" ++msgstr "Fuerza de la señal" ++ ++#. %H: Wireless - Signal Quality ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:5 ++msgid "stat_dg_title_wireless__signal_quality" ++msgstr "%H: Wireless - Calidad de la señal" ++ ++#. n ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:6 ++msgid "stat_dg_label_wireless__signal_quality" ++msgstr "n" ++ ++#. Signal Quality ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:7 ++msgid "stat_ds_signal_quality" ++msgstr "Calidad de señal" ++ ++#. %H: ICMP Roundtrip Times ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:8 ++msgid "stat_dg_title_ping" ++msgstr "%H: Tiempo de respuesta ICMP" ++ ++#. ms ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:9 ++msgid "stat_dg_label_ping" ++msgstr "ms" ++ ++#. %di ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:10 ++msgid "stat_ds_ping" ++msgstr "%di" ++ ++#. %H: Firewall - Processed Packets ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:11 ++msgid "stat_dg_title_iptables__ipt_packets" ++msgstr "%H: Firewall - Paquetes Procesados" ++ ++#. Packets/s ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:12 ++msgid "stat_dg_label_iptables__ipt_packets" ++msgstr "Paquetes/s" ++ ++#. Chain \"%di\" ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:13 ++msgid "stat_ds_ipt_packets" ++msgstr "Cadena \\\"%di\\\"" ++ ++#. %H: Netlink - Transfer on %pi ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:14 ++msgid "stat_dg_title_netlink__if_octets" ++msgstr "%H: Netlink - Traslado en %pi" ++ ++# Bytes/s ++#. Bytes/s ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:15 ++msgid "stat_dg_label_netlink__if_octets" ++msgstr "Bytes/s" ++ ++#. Bytes (%ds) ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:16 ++msgid "stat_ds_if_octets" ++msgstr "Bytes (%ds)" ++ ++#. %H: Netlink - Packets on %pi ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:17 ++msgid "stat_dg_title_netlink__if_packets" ++msgstr "%H: Netlink - Paquetes en %pi" ++ ++#. Packets/s ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:18 ++msgid "stat_dg_label_netlink__if_packets" ++msgstr "Paquetes/s" ++ ++#. Processed (%ds) ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:19 ++msgid "stat_ds_if_packets" ++msgstr "Procesado (%ds)" ++ ++#. Dropped (%ds) ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:20 ++msgid "stat_ds_if_dropped" ++msgstr "Descartados (%ds)" ++ ++#. Errors (%ds) ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:21 ++msgid "stat_ds_if_errors" ++msgstr "Errores (%ds)" ++ ++#. %H: Netlink - Multicast on %pi ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:22 ++msgid "stat_dg_title_netlink__if_multicast" ++msgstr "%H: Netlink - Multicast en %pi" ++ ++#. Packets/s ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:23 ++msgid "stat_dg_label_netlink__if_multicast" ++msgstr "Paquetes/s" ++ ++#. Packets ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:24 ++msgid "stat_ds_if_multicast" ++msgstr "Paquetes" ++ ++#. %H: Netlink - Collisions on %pi ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:25 ++msgid "stat_dg_title_netlink__if_collisions" ++msgstr "%H: Netlink - Colisiones en %pi" ++ ++#. Collisions/s ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:26 ++msgid "stat_dg_label_netlink__if_collisions" ++msgstr "Colisiones/s" ++ ++#. Collisions ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:27 ++msgid "stat_ds_if_collisions" ++msgstr "Colisiones" ++ ++#. %H: Netlink - Errors on %pi ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:28 ++msgid "stat_dg_title_netlink__if_tx_errors" ++msgstr "%H: Netlink - Errores en %pi" ++ ++#. Errors/s ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:29 ++msgid "stat_dg_label_netlink__if_tx_errors" ++msgstr "Errores/s" ++ ++#. %di ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:30 ++msgid "stat_ds_if_tx_errors" ++msgstr "%di" ++ ++#. %di ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:31 ++msgid "stat_ds_if_rx_errors" ++msgstr "%di" ++ ++#. %H: Processes ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:32 ++msgid "stat_dg_title_processes" ++msgstr "%H: Procesos" ++ ++#. Processes/s ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:33 ++msgid "stat_dg_label_processes" ++msgstr "Procesos/s" ++ ++#. %di ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:34 ++msgid "stat_ds_ps_state" ++msgstr "%di" ++ ++#. %H: Process %pi - used cpu time ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:35 ++msgid "stat_dg_title_processes__ps_cputime" ++msgstr "%H: Proceso %pi -tiempo de cpu utilizado" ++ ++#. Jiffies ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:36 ++msgid "stat_dg_label_processes__ps_cputime" ++msgstr "Jiffies" ++ ++#. system ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:37 ++msgid "stat_ds_ps_cputime__syst" ++msgstr "sistema" ++ ++#. user ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:38 ++msgid "stat_ds_ps_cputime__user" ++msgstr "usuario" ++ ++#. %H: Process %pi - threads and processes ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:39 ++msgid "stat_dg_title_processes__ps_count" ++msgstr "%H: Procesos %pi - Hilos y procesos" ++ ++#. Count ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:40 ++msgid "stat_dg_label_processes__ps_count" ++msgstr "contar" ++ ++#. %ds ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:41 ++msgid "stat_ds_ps_count" ++msgstr "%ds" ++ ++#. %H: Process %pi - page faults ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:42 ++msgid "stat_dg_title_processes__ps_pagefaults" ++msgstr "%H: Procesos %pi - página de errores" ++ ++#. Pagefaults ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:43 ++msgid "stat_dg_label_processes__ps_pagefaults" ++msgstr "Pagina de errores" ++ ++#. page faults ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:44 ++msgid "stat_ds_ps_pagefaults" ++msgstr "Página de errores" ++ ++#. %H: Process %pi - virtual memory size ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:45 ++msgid "stat_dg_title_processes__ps_rss" ++msgstr "%H: Proceso %pi - tamaño de la memoria virtual" ++ ++#. Bytes ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:46 ++msgid "stat_dg_label_processes__ps_rss" ++msgstr "Bytes" ++ ++#. virtual memory ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:47 ++msgid "stat_ds_ps_rss" ++msgstr "Memoria Virtual" ++ ++#. %H: Usage on Processor #%pi ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:48 ++msgid "stat_dg_title_cpu" ++msgstr "%H: Uso en el procesador #%pi" ++ ++#. % ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:49 ++msgid "stat_dg_label_cpu" ++msgstr "%" ++ ++#. %di ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:50 ++msgid "stat_ds_cpu" ++msgstr "%di" ++ ++#. %H: Transfer on %di ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:51 ++msgid "stat_dg_title_interface__if_octets" ++msgstr "%H: Transferencia en %di" ++ ++#. Bytes/s ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:52 ++msgid "stat_dg_label_interface__if_octets" ++msgstr "Bytes/s" ++ ++#. %H: Packets on %di ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:53 ++msgid "stat_dg_title_interface__if_packets" ++msgstr "%H: Paquetes en %di" ++ ++#. Packets/s ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:54 ++msgid "stat_dg_label_interface__if_packets" ++msgstr "Paquetes/s" ++ ++#. %H: TCP-Connections to Port %pi ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:55 ++msgid "stat_dg_title_tcpconns" ++msgstr "%H: Conexiones TCP en el Puerto %pi" ++ ++#. Connections/s ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:56 ++msgid "stat_dg_label_tcpconns" ++msgstr "Conexiones/s" ++ ++#. %di ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:57 ++msgid "stat_ds_tcp_connections" ++msgstr "%di" ++ ++#. %H: Disk Space Usage on %di ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:58 ++msgid "stat_dg_title_df" ++msgstr "%H: Uso de espacio de disco en %di" ++ ++#. Bytes ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:59 ++msgid "stat_dg_label_df" ++msgstr "Bytes" ++ ++#. %ds ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:60 ++msgid "stat_ds_df__free" ++msgstr "%ds" ++ ++#. %ds ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:61 ++msgid "stat_ds_df__used" ++msgstr "%ds" ++ ++#. %H: Interrupts ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:62 ++msgid "stat_dg_title_irq" ++msgstr "%H: Interrupciones" ++ ++#. Issues/s ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:63 ++msgid "stat_dg_label_irq" ++msgstr "cuestiones/s" ++ ++#. IRQ %di ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:64 ++msgid "stat_ds_irq" ++msgstr "IRQ %di" ++ ++#. %H: System Load ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:65 ++msgid "stat_dg_title_load" ++msgstr "%H: Carga de sistema" ++ ++#. Load ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:66 ++msgid "stat_dg_label_load" ++msgstr "Carga" ++ ++#. 1 min ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:67 ++msgid "stat_ds_load__shortterm" ++msgstr "1 minuto" ++ ++#. 5 min ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:68 ++msgid "stat_ds_load__midterm" ++msgstr "5 minutos" ++ ++#. 15 min ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:69 ++msgid "stat_ds_load__longterm" ++msgstr "15 minutos" +diff --git a/feeds/luci/applications/luci-app-statistics/po/es/statistics.po b/feeds/luci/applications/luci-app-statistics/po/es/statistics.po +new file mode 100644 +index 0000000..f43ea4c +--- /dev/null ++++ b/feeds/luci/applications/luci-app-statistics/po/es/statistics.po +@@ -0,0 +1,741 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Report-Msgid-Bugs-To: \n" ++"POT-Creation-Date: 2009-06-10 03:41+0200\n" ++"PO-Revision-Date: 2012-12-12 20:19+0200\n" ++"Last-Translator: José Vicente \n" ++"Language-Team: LANGUAGE \n" ++"Language: es\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n != 1);\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "Action (target)" ++msgstr "Acción (objetivo)" ++ ++msgid "Add command for reading values" ++msgstr "Añadir comando para leer valores" ++ ++msgid "Add matching rule" ++msgstr "Añadir regla" ++ ++msgid "Add multiple hosts separated by space." ++msgstr "Añadir múltiples máquinas separadas por espacio." ++ ++msgid "Add notification command" ++msgstr "Añadir comando de notificación" ++ ++msgid "Base Directory" ++msgstr "Directorio Base" ++ ++msgid "Basic monitoring" ++msgstr "Monitorización básica" ++ ++msgid "CPU Plugin Configuration" ++msgstr "Configuración del plugin de CPU" ++ ++msgid "CSV Output" ++msgstr "Salida CSV" ++ ++msgid "CSV Plugin Configuration" ++msgstr "Configuración del plugin de CSV" ++ ++msgid "Cache collected data for" ++msgstr "Almacenar datos recogidos para" ++ ++msgid "Cache flush interval" ++msgstr "Intervalo de limpieza del caché" ++ ++msgid "Chain" ++msgstr "Cadena" ++ ++msgid "CollectLinks" ++msgstr "Enlaces" ++ ++msgid "CollectRoutes" ++msgstr "Rutas" ++ ++msgid "CollectTopology" ++msgstr "Topología" ++ ++msgid "Collectd" ++msgstr "Collectd" ++ ++msgid "Collectd Settings" ++msgstr "Configuración de Collectd" ++ ++msgid "" ++"Collectd is a small daemon for collecting data from various sources through " ++"different plugins. On this page you can change general settings for the " ++"collectd daemon." ++msgstr "" ++"Collectd is un demonio para la recolección de datos desde varias fuentes a " ++"través de la utilización de diferentes plugins. Aquí puede cambiar la " ++"configuración general del demonio que maneja collectd." ++ ++msgid "Conntrack" ++msgstr "Seguimiento" ++ ++msgid "Conntrack Plugin Configuration" ++msgstr "Configuración del seguimiento" ++ ++msgid "DF Plugin Configuration" ++msgstr "Configuración del plugin DF" ++ ++msgid "DNS" ++msgstr "DNS" ++ ++msgid "DNS Plugin Configuration" ++msgstr "Configuración del plugin DNS" ++ ++msgid "Data collection interval" ++msgstr "Intervalo de recolección de datos" ++ ++msgid "Datasets definition file" ++msgstr "Archivo de definición de conjunto de datos" ++ ++msgid "Destination ip range" ++msgstr "Rango IP de destino" ++ ++msgid "Directory for collectd plugins" ++msgstr "Directorio para los plugins de collectd" ++ ++msgid "Directory for sub-configurations" ++msgstr "Directorio para las sub-configuraciones" ++ ++msgid "Disk Plugin Configuration" ++msgstr "Configuración del plugin Disco" ++ ++msgid "Disk Space Usage" ++msgstr "Espacio en disco ocupado" ++ ++msgid "Disk Usage" ++msgstr "Disco ocupado" ++ ++msgid "Display Host »" ++msgstr "Mostrar máquina »" ++ ++msgid "Display timespan »" ++msgstr "Mostrar lapso de tiempo »" ++ ++msgid "E-Mail Plugin Configuration" ++msgstr "Configuración del plugin email" ++ ++msgid "Email" ++msgstr "Correo electrónico" ++ ++msgid "Enable this plugin" ++msgstr "Activar este plugin" ++ ++msgid "Exec" ++msgstr "Exec" ++ ++msgid "Exec Plugin Configuration" ++msgstr "Configuración del plugin Exec" ++ ++msgid "Filter class monitoring" ++msgstr "Monitorización del filtro de clases" ++ ++msgid "Firewall" ++msgstr "Cortafuegos" ++ ++msgid "Flush cache after" ++msgstr "Vaciar caché tras" ++ ++msgid "Forwarding between listen and server addresses" ++msgstr "Retransmitir entre las direcciones de escucha y servidor" ++ ++msgid "Graphs" ++msgstr "Gráficas" ++ ++msgid "Group" ++msgstr "Grupo" ++ ++msgid "" ++"Here you can define external commands which will be started by collectd in " ++"order to read certain values. The values will be read from stdout." ++msgstr "" ++"Aquí puede definir los comandos externos que iniciará collectd para leer " ++"ciertos valores. Los valores se leen desde la salida estándar (stdout)." ++ ++msgid "" ++"Here you can define external commands which will be started by collectd when " ++"certain threshold values have been reached. The values leading to invokation " ++"will be feeded to the the called programs stdin." ++msgstr "" ++"Aquí puede definir los comandos externos que iniciará collectd cuando se " ++"alcancen ciertos valores umbral." ++ ++msgid "" ++"Here you can define various criteria by which the monitored iptables rules " ++"are selected." ++msgstr "" ++"Aquí puede definir varios criterios de selección de reglas de iptables " ++"monitorizadas." ++ ++msgid "Host" ++msgstr "Máquina" ++ ++msgid "Hostname" ++msgstr "Nombre de máquina" ++ ++msgid "IP or hostname where to get the txtinfo output from" ++msgstr "IP o nombre de máquina desde la que obtener la salida de txtinfo" ++ ++msgid "IRQ Plugin Configuration" ++msgstr "Configuración del plugin IRQ" ++ ++msgid "Ignore source addresses" ++msgstr "Ignorar direcciones de origen" ++ ++msgid "Incoming interface" ++msgstr "Interfaz de entrada" ++ ++msgid "Interface Plugin Configuration" ++msgstr "Configuración del interfaz de plugins" ++ ++msgid "Interfaces" ++msgstr "Interfaces" ++ ++msgid "Interrupts" ++msgstr "Interrupciones" ++ ++msgid "Interval for pings" ++msgstr "Intervalo entre pings" ++ ++msgid "Iptables Plugin Configuration" ++msgstr "Configuración del plugin Iptables" ++ ++msgid "Leave unselected to automatically determine interfaces to monitor." ++msgstr "No marcar para determinar automáticamente que interfaces monitorizar." ++ ++msgid "Listen host" ++msgstr "Máquina de escucha" ++ ++msgid "Listen port" ++msgstr "Puerto de escucha" ++ ++msgid "Listener interfaces" ++msgstr "Interfaces para escuchar" ++ ++msgid "Load Plugin Configuration" ++msgstr "Configuración del plugin de carga" ++ ++msgid "Maximum allowed connections" ++msgstr "Máximo número de conexiones" ++ ++msgid "Memory" ++msgstr "Memoria" ++ ++msgid "Memory Plugin Configuration" ++msgstr "Configuración del plugin Memoria" ++ ++msgid "Monitor all except specified" ++msgstr "Monitorizar todos menos los especificados" ++ ++msgid "Monitor all local listen ports" ++msgstr "Monitorizar todos los puertos de escucha locales" ++ ++msgid "Monitor devices" ++msgstr "Dispositivos a monitonizar" ++ ++msgid "Monitor disks and partitions" ++msgstr "Monitorizar discos y particiones" ++ ++msgid "Monitor filesystem types" ++msgstr "Monitorizar tipos de sistema de archivos" ++ ++msgid "Monitor hosts" ++msgstr "Monitorizar máquinas" ++ ++msgid "Monitor interfaces" ++msgstr "Monitorizar interfaces" ++ ++msgid "Monitor interrupts" ++msgstr "Monitorizar interrupciones" ++ ++msgid "Monitor local ports" ++msgstr "Monitorizar puertos locales" ++ ++msgid "Monitor mount points" ++msgstr "Monitorizar puntos de montaje" ++ ++msgid "Monitor processes" ++msgstr "Monitorizar procesos" ++ ++msgid "Monitor remote ports" ++msgstr "Monitorizar puertos remotos" ++ ++msgid "Name of the rule" ++msgstr "Nombre de la regla" ++ ++msgid "Netlink" ++msgstr "Enlace de red" ++ ++msgid "Netlink Plugin Configuration" ++msgstr "Configuración del plugin \"enlace de red\"" ++ ++msgid "Network" ++msgstr "Red" ++ ++msgid "Network Plugin Configuration" ++msgstr "Configuración del plugin \"Red\"" ++ ++msgid "Network plugins" ++msgstr "Plugins de red" ++ ++msgid "Network protocol" ++msgstr "Protocolo de red" ++ ++msgid "Number of threads for data collection" ++msgstr "Número de hilos para recolección de datos" ++ ++msgid "OLSRd" ++msgstr "OLSRd" ++ ++msgid "OLSRd Plugin Configuration" ++msgstr "Configuración del plugin \"OLSRd\"" ++ ++msgid "Only create average RRAs" ++msgstr "Crear sólo RRAs medias" ++ ++msgid "Options" ++msgstr "Opciones" ++ ++msgid "Outgoing interface" ++msgstr "Interfaz de salida" ++ ++msgid "Output plugins" ++msgstr "Plugins de salida" ++ ++msgid "Ping" ++msgstr "Ping" ++ ++msgid "Ping Plugin Configuration" ++msgstr "Configuración del plugin \"Ping\"" ++ ++msgid "Port" ++msgstr "Puerto" ++ ++msgid "Processes" ++msgstr "Procesos" ++ ++msgid "Processes Plugin Configuration" ++msgstr "Configuración del plugin \"Procesos\"" ++ ++msgid "Processes to monitor separated by space" ++msgstr "Procesos a monitorizar (separados por espacios)" ++ ++msgid "Processor" ++msgstr "Procesador" ++ ++msgid "Qdisc monitoring" ++msgstr "Monitorización Qdisc" ++ ++msgid "RRD XFiles Factor" ++msgstr "Factor XFiles RRD" ++ ++msgid "RRD heart beat interval" ++msgstr "Intervalo de pulso RRD" ++ ++msgid "RRD step interval" ++msgstr "Intervalo de paso RRD" ++ ++msgid "RRDTool" ++msgstr "Herramienta RRD" ++ ++msgid "RRDTool Plugin Configuration" ++msgstr "Configuración del plugin \"Herramienta RRD\"" ++ ++msgid "Rows per RRA" ++msgstr "Filas por RRA" ++ ++msgid "Script" ++msgstr "Guión" ++ ++msgid "Seconds" ++msgstr "Segundos" ++ ++msgid "Server host" ++msgstr "Máquina servidor" ++ ++msgid "Server port" ++msgstr "Puerto servidor" ++ ++msgid "Shaping class monitoring" ++msgstr "Monitorización de la clase shaping" ++ ++msgid "Socket file" ++msgstr "Fichero de sockets" ++ ++msgid "Socket group" ++msgstr "Grupo socket" ++ ++msgid "Socket permissions" ++msgstr "Permisos para socket" ++ ++msgid "Source ip range" ++msgstr "Rango de direcciones IP origen" ++ ++msgid "Specifies what information to collect about links." ++msgstr "Especifica qué información recolectar sobre enlaces." ++ ++msgid "Specifies what information to collect about routes." ++msgstr "Especifica qué información recolectar sobre rutas." ++ ++msgid "Specifies what information to collect about the global topology." ++msgstr "Especifica qué información recolectar sobre la topología global." ++ ++msgid "Splash Leases" ++msgstr "" ++ ++msgid "Splash Leases Plugin Configuration" ++msgstr "" ++ ++msgid "Statistics" ++msgstr "Estadísticas" ++ ++msgid "Storage directory" ++msgstr "Directorio de guardado" ++ ++msgid "Storage directory for the csv files" ++msgstr "Directorio para guardar archivos csv" ++ ++msgid "Store data values as rates instead of absolute values" ++msgstr "Guardar datos como ratios en vez de valores absolutos" ++ ++msgid "Stored timespans" ++msgstr "Intervalos almacenados" ++ ++msgid "System Load" ++msgstr "Carga del sistema" ++ ++msgid "System plugins" ++msgstr "Plugins del sistema" ++ ++msgid "TCP Connections" ++msgstr "Conexiones TCP" ++ ++msgid "TCPConns Plugin Configuration" ++msgstr "Configuración del plugin \"Conexiones TCP\"" ++ ++msgid "TTL for network packets" ++msgstr "TTL para paquetes de red" ++ ++msgid "TTL for ping packets" ++msgstr "TTL para paquetes de ping" ++ ++msgid "Table" ++msgstr "Tabla" ++ ++msgid "The NUT plugin reads information about Uninterruptible Power Supplies." ++msgstr "" ++"El plugin NUT obtiene información sobre Sistemas de Alimentación " ++"Ininterrumpida." ++ ++msgid "" ++"The OLSRd plugin reads information about meshed networks from the txtinfo " ++"plugin of OLSRd." ++msgstr "" ++"El plugin OLSRd lee información sobre redes distribuidas desde el plugin " ++"txtinfo de OLSRd." ++ ++msgid "" ++"The conntrack plugin collects statistics about the number of tracked " ++"connections." ++msgstr "" ++"El plugin \"Seguimiento\" recoge estadísticas sobre el número de conexiones " ++"analizadas." ++ ++msgid "The cpu plugin collects basic statistics about the processor usage." ++msgstr "" ++"El plugin \"CPU\" recolecta estadísticas básicas acerca del uso del " ++"procesador." ++ ++msgid "" ++"The csv plugin stores collected data in csv file format for further " ++"processing by external programs." ++msgstr "" ++"El plugin \"CSV\" almacena los datos recolectados en un archivo con formato " ++"csv para su procesado posterior con programas de terceros." ++ ++msgid "" ++"The df plugin collects statistics about the disk space usage on different " ++"devices, mount points or filesystem types." ++msgstr "" ++"El plugin \"DF\" recolecta estadísticas acerca del uso del espacio en disco " ++"en diferentes dispositivos, puntos de montaje y tipos de sistema de archivos." ++ ++msgid "" ++"The disk plugin collects detailled usage statistics for selected partitions " ++"or whole disks." ++msgstr "" ++"El plugin \"Disco\" recolecta estadísticas detallada acerca de su " ++"utilización para las particiones seleccionadas o bien el disco completo." ++ ++msgid "" ++"The dns plugin collects detailled statistics about dns related traffic on " ++"selected interfaces." ++msgstr "" ++"El plugin \"DNS\" recolecta estadísticas detalladas acerca del trafico DNS " ++"en las interfaces seleccionadas." ++ ++msgid "" ++"The email plugin creates a unix socket which can be used to transmit email-" ++"statistics to a running collectd daemon. This plugin is primarily intended " ++"to be used in conjunction with Mail::SpamAssasin::Plugin::Collectd but can " ++"be used in other ways as well." ++msgstr "" ++"El plugin \"eMail\" crea un socket de unix (unix-socket) que puede " ++"utilizarse para transmitir estadísticas de email a un demonio collectd en " ++"ejecución. Este plugin fue desarrollado, en primer instancia, para ser " ++"utilizado en conjunto con Mail::SpamAssasin::Plugin::Collectd pero puede " ++"utilizarse de diferentes formas." ++ ++msgid "" ++"The exec plugin starts external commands to read values from or to notify " ++"external processes when certain threshold values have been reached." ++msgstr "" ++"El plugin \"Exec\" inicia comandos externos para leer valores o notificar a " ++"procesos externos cuando determinados valores se alcanzan." ++ ++msgid "" ++"The interface plugin collects traffic statistics on selected interfaces." ++msgstr "" ++"El plugin \"Interface\" recoge estadísticas de tráfico en las interfaces " ++"seleccionadas." ++ ++msgid "" ++"The iptables plugin will monitor selected firewall rules and collect " ++"informations about processed bytes and packets per rule." ++msgstr "" ++"El plugin \"Iptables\" monitoriza las reglas seleccionadas del cortafuegos y " ++"recoge información de bytes y paquetes procesados por cada regla." ++ ++msgid "" ++"The irq plugin will monitor the rate of issues per second for each selected " ++"interrupt. If no interrupt is selected then all interrupts are monitored." ++msgstr "" ++"El plugin IRQ monitorizará las activaciones por segundo de cada interrupción " ++"elegida. Si no se selecciona ninguna se monitorizarán todas." ++ ++msgid "" ++"The iwinfo plugin collects statistics about wireless signal strength, noise " ++"and quality." ++msgstr "" ++"El plugin \"iwinfo\" recolecta estadísticas sobre la potencia de la señal " ++"inalámbrica, ruido y calidad." ++ ++msgid "The load plugin collects statistics about the general system load." ++msgstr "" ++"El plugin \"carga\" recoge estadísticas sobre la carga general del sistema." ++ ++msgid "The memory plugin collects statistics about the memory usage." ++msgstr "El plugin \"memoria\" recoge estadísticas sobre el uso de memoria." ++ ++msgid "" ++"The netlink plugin collects extended informations like qdisc-, class- and " ++"filter-statistics for selected interfaces." ++msgstr "" ++"El plugin \"netlink\" recoge informaciones extendidas como estadísticas " ++"qdisc-, clase- y filtro- para las interfaces seleccionadas." ++ ++msgid "" ++"The network plugin provides network based communication between different " ++"collectd instances. Collectd can operate both in client and server mode. In " ++"client mode locally collected data is transferred to a collectd server " ++"instance, in server mode the local instance receives data from other hosts." ++msgstr "" ++"El plugin \"red\" proporciona comunicación entre diferentes instancias de " ++"collectd. Collectd puede operar tanto en modo cliente como en modo servidor. " ++"En modo cliente la información recogida se envía a una instancia que se " ++"encuentre en modo servidor. En modo servidor la instancia recibe datos de " ++"otras máquinas." ++ ++msgid "" ++"The ping plugin will send icmp echo replies to selected hosts and measure " ++"the roundtrip time for each host." ++msgstr "" ++"El plugin \"ping\" enviará ecos ICMP a las máquinas elegifas para medir el " ++"tiempo de viaje para cada host." ++ ++msgid "" ++"The processes plugin collects informations like cpu time, page faults and " ++"memory usage of selected processes." ++msgstr "" ++"El plugin \"procesos\" recoge información como tiempo de CPU, fallos de " ++"página y uso de memoria de los procesos elegidos." ++ ++msgid "" ++"The rrdtool plugin stores the collected data in rrd database files, the " ++"foundation of the diagrams.

    Warning: Setting the wrong " ++"values will result in a very high memory consumption in the temporary " ++"directory. This can render the device unusable!" ++msgstr "" ++"El plugin \"rrdtool\" almacena datos en ficheros de bb.dd. RRD que son la " ++"base para los diagramas.

    ¡Ojo: Configurar valores " ++"incorrectos puede hacer que se use mucho espacio en el directorio temporal y " ++"puede hacer que el dispositivo funcione mal!" ++ ++msgid "" ++"The splash leases plugin uses libuci to collect statistics about splash " ++"leases." ++msgstr "" ++ ++msgid "" ++"The statistics package is based on Collectd and uses RRD " ++"Tool to render diagram images from collected data." ++msgstr "" ++"El paquete \"estadísticas\" está basado en Collectd y utiliza RRD Tool para dibujar gráficos con los datos recogidos." ++ ++msgid "" ++"The tcpconns plugin collects informations about open tcp connections on " ++"selected ports." ++msgstr "" ++"El plugin \"tcpconns\" recoge información de conexiones TCP abiertas en los " ++"puertos seleccionados." ++ ++msgid "" ++"The unixsock plugin creates a unix socket which can be used to read " ++"collected data from a running collectd instance." ++msgstr "" ++"El plugin \"unixsock\" crea un socket UNIX que se puede usar para leer los " ++"datos recogidos por una instancia collectd." ++ ++msgid "The uptime plugin collects statistics about the uptime of the system." ++msgstr "" ++ ++msgid "" ++"This section defines on which interfaces collectd will wait for incoming " ++"connections." ++msgstr "" ++"Esta sección define sobre qué interfaces collectd esperará conexiones " ++"entrantes." ++ ++msgid "" ++"This section defines to which servers the locally collected data is sent to." ++msgstr "" ++"Esta sección define a qué servidores se envían los datos recolectados " ++"localmente." ++ ++msgid "Try to lookup fully qualified hostname" ++msgstr "Intenta resolver el nombre de máquina cualificado" ++ ++msgid "UPS" ++msgstr "SAI" ++ ++msgid "UPS Plugin Configuration" ++msgstr "Configuración del plugin SAI" ++ ++msgid "UPS name in NUT ups@host format" ++msgstr "Nombre del SAI en el formato de NUT sai@máquina" ++ ++msgid "UnixSock" ++msgstr "Socket UNIX" ++ ++msgid "Unixsock Plugin Configuration" ++msgstr "Configuración del plugin \"UnixSock\"" ++ ++msgid "Uptime" ++msgstr "" ++ ++msgid "Uptime Plugin Configuration" ++msgstr "" ++ ++msgid "Used PID file" ++msgstr "Archivo PID utilizado" ++ ++msgid "User" ++msgstr "Usuario" ++ ++msgid "Verbose monitoring" ++msgstr "Monitorización detallada" ++ ++msgid "Wireless" ++msgstr "Red inalámbrica" ++ ++msgid "Wireless iwinfo Plugin Configuration" ++msgstr "Configuración plugin \"Wireless iwinfo\"" ++ ++msgid "e.g. br-ff" ++msgstr "p.e. br-ff" ++ ++msgid "e.g. br-lan" ++msgstr "p.e. br-lan" ++ ++msgid "e.g. reject-with tcp-reset" ++msgstr "p.e. reject-with tcp-reset" ++ ++msgid "max. 16 chars" ++msgstr "16 caracteres máximo" ++ ++msgid "reduces rrd size" ++msgstr "reduce el tamaño RRD" ++ ++msgid "seconds; multiple separated by space" ++msgstr "segundos (varios separados por espacio)" ++ ++msgid "server interfaces" ++msgstr "interfaces servidores" ++ ++#~ msgid "Installed network plugins:" ++#~ msgstr "Plugins de red instalados:" ++ ++#~ msgid "Installed output plugins:" ++#~ msgstr "Plugins de salida instalados:" ++ ++#~ msgid "" ++#~ "Network plugins are used to collect information about open tcp " ++#~ "connections, interface traffic, iptables rules etc." ++#~ msgstr "" ++#~ "Los plugins de red se usan para recolectar información sobre conexiones " ++#~ "TCP, tráfico en los interfaces, reglas de iptables, etc." ++ ++#~ msgid "" ++#~ "Output plugins provide different possibilities to store collected data. " ++#~ "It is possible to enable multiple plugin at one, for example to store " ++#~ "collected data in rrd databases and to transmit the data over the network " ++#~ "to other collectd instances." ++#~ msgstr "" ++#~ "Los plugins de salida ofrecen varias posibilidades para almacenar los " ++#~ "datos. Es posible activar varios plugins a la vez, por ejemplo para " ++#~ "almacenar datos recolectados en bases de datos RRD y para transmitir los " ++#~ "datos sobre la red a otras instancias de collectd." ++ ++#~ msgid "" ++#~ "System plugins collecting values about system state and ressource usage " ++#~ "on the device.:" ++#~ msgstr "" ++#~ "Los plugins del sistema recolectan valores sobre el estado y el uso de " ++#~ "recursos del dispositivo.:" ++ ++#~ msgid "" ++#~ "The wireless plugin collects statistics about wireless signal strength, " ++#~ "noise and quality." ++#~ msgstr "" ++#~ "El plugin \"inalámbrico\" recoge estadísticas sobre fuerza de la señal, " ++#~ "ruido y calidad." ++ ++#~ msgid "Wireless Plugin Configuration" ++#~ msgstr "Configuración del plugin \"Wireless\"" ++ ++#~ msgid "Filepath of the unix socket" ++#~ msgstr "Ruta de archivo para el socket de unix" ++ ++#~ msgid "Group ownership of the unix socket" ++#~ msgstr "Grupo (dueño) del socket de unix " ++ ++#~ msgid "group name" ++#~ msgstr "nombre del grupo" ++ ++#~ msgid "File permissions of the unix socket" ++#~ msgstr "Permisos de archivos del socket de unix" ++ ++#~ msgid "octal" ++#~ msgstr "octal" +diff --git a/feeds/luci/applications/luci-app-statistics/po/fr/rrdtool.po b/feeds/luci/applications/luci-app-statistics/po/fr/rrdtool.po +new file mode 100644 +index 0000000..95545db +--- /dev/null ++++ b/feeds/luci/applications/luci-app-statistics/po/fr/rrdtool.po +@@ -0,0 +1,358 @@ ++#, fuzzy ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Report-Msgid-Bugs-To: \n" ++"POT-Creation-Date: 2009-05-19 19:36+0200\n" ++"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" ++"Last-Translator: FULL NAME \n" ++"Language-Team: LANGUAGE \n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"X-Generator: Translate Toolkit 1.1.1\n" ++ ++#. %H: Wireless - Signal Noise Ratio ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:1 ++msgid "stat_dg_title_wireless__signal_noise" ++msgstr "" ++ ++#. dBm ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:2 ++msgid "stat_dg_label_wireless__signal_noise" ++msgstr "" ++ ++#. Noise Level ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:3 ++msgid "stat_ds_signal_noise" ++msgstr "" ++ ++#. Signal Strength ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:4 ++msgid "stat_ds_signal_power" ++msgstr "" ++ ++#. %H: Wireless - Signal Quality ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:5 ++msgid "stat_dg_title_wireless__signal_quality" ++msgstr "" ++ ++#. n ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:6 ++msgid "stat_dg_label_wireless__signal_quality" ++msgstr "" ++ ++#. Signal Quality ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:7 ++msgid "stat_ds_signal_quality" ++msgstr "" ++ ++#. %H: ICMP Roundtrip Times ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:8 ++msgid "stat_dg_title_ping" ++msgstr "" ++ ++#. ms ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:9 ++msgid "stat_dg_label_ping" ++msgstr "" ++ ++#. %di ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:10 ++msgid "stat_ds_ping" ++msgstr "" ++ ++#. %H: Firewall - Processed Packets ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:11 ++msgid "stat_dg_title_iptables__ipt_packets" ++msgstr "" ++ ++#. Packets/s ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:12 ++msgid "stat_dg_label_iptables__ipt_packets" ++msgstr "" ++ ++#. Chain \"%di\" ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:13 ++msgid "stat_ds_ipt_packets" ++msgstr "" ++ ++#. %H: Netlink - Transfer on %pi ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:14 ++msgid "stat_dg_title_netlink__if_octets" ++msgstr "" ++ ++#. Bytes/s ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:15 ++msgid "stat_dg_label_netlink__if_octets" ++msgstr "" ++ ++#. Bytes (%ds) ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:16 ++msgid "stat_ds_if_octets" ++msgstr "" ++ ++#. %H: Netlink - Packets on %pi ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:17 ++msgid "stat_dg_title_netlink__if_packets" ++msgstr "" ++ ++#. Packets/s ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:18 ++msgid "stat_dg_label_netlink__if_packets" ++msgstr "" ++ ++#. Processed (%ds) ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:19 ++msgid "stat_ds_if_packets" ++msgstr "" ++ ++#. Dropped (%ds) ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:20 ++msgid "stat_ds_if_dropped" ++msgstr "" ++ ++#. Errors (%ds) ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:21 ++msgid "stat_ds_if_errors" ++msgstr "" ++ ++#. %H: Netlink - Multicast on %pi ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:22 ++msgid "stat_dg_title_netlink__if_multicast" ++msgstr "" ++ ++#. Packets/s ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:23 ++msgid "stat_dg_label_netlink__if_multicast" ++msgstr "" ++ ++#. Packets ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:24 ++msgid "stat_ds_if_multicast" ++msgstr "" ++ ++#. %H: Netlink - Collisions on %pi ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:25 ++msgid "stat_dg_title_netlink__if_collisions" ++msgstr "" ++ ++#. Collisions/s ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:26 ++msgid "stat_dg_label_netlink__if_collisions" ++msgstr "" ++ ++#. Collisions ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:27 ++msgid "stat_ds_if_collisions" ++msgstr "" ++ ++#. %H: Netlink - Errors on %pi ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:28 ++msgid "stat_dg_title_netlink__if_tx_errors" ++msgstr "" ++ ++#. Errors/s ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:29 ++msgid "stat_dg_label_netlink__if_tx_errors" ++msgstr "" ++ ++#. %di ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:30 ++msgid "stat_ds_if_tx_errors" ++msgstr "" ++ ++#. %di ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:31 ++msgid "stat_ds_if_rx_errors" ++msgstr "" ++ ++#. %H: Processes ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:32 ++msgid "stat_dg_title_processes" ++msgstr "" ++ ++#. Processes/s ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:33 ++msgid "stat_dg_label_processes" ++msgstr "" ++ ++#. %di ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:34 ++msgid "stat_ds_ps_state" ++msgstr "" ++ ++#. %H: Process %pi - used cpu time ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:35 ++msgid "stat_dg_title_processes__ps_cputime" ++msgstr "" ++ ++#. Jiffies ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:36 ++msgid "stat_dg_label_processes__ps_cputime" ++msgstr "" ++ ++#. system ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:37 ++msgid "stat_ds_ps_cputime__syst" ++msgstr "" ++ ++#. user ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:38 ++msgid "stat_ds_ps_cputime__user" ++msgstr "" ++ ++#. %H: Process %pi - threads and processes ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:39 ++msgid "stat_dg_title_processes__ps_count" ++msgstr "" ++ ++#. Count ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:40 ++msgid "stat_dg_label_processes__ps_count" ++msgstr "" ++ ++#. %ds ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:41 ++msgid "stat_ds_ps_count" ++msgstr "" ++ ++#. %H: Process %pi - page faults ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:42 ++msgid "stat_dg_title_processes__ps_pagefaults" ++msgstr "" ++ ++#. Pagefaults ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:43 ++msgid "stat_dg_label_processes__ps_pagefaults" ++msgstr "" ++ ++#. page faults ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:44 ++msgid "stat_ds_ps_pagefaults" ++msgstr "" ++ ++#. %H: Process %pi - virtual memory size ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:45 ++msgid "stat_dg_title_processes__ps_rss" ++msgstr "" ++ ++#. Bytes ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:46 ++msgid "stat_dg_label_processes__ps_rss" ++msgstr "" ++ ++#. virtual memory ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:47 ++msgid "stat_ds_ps_rss" ++msgstr "" ++ ++#. %H: Usage on Processor #%pi ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:48 ++msgid "stat_dg_title_cpu" ++msgstr "" ++ ++#. % ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:49 ++msgid "stat_dg_label_cpu" ++msgstr "" ++ ++#. %di ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:50 ++msgid "stat_ds_cpu" ++msgstr "" ++ ++#. %H: Transfer on %di ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:51 ++msgid "stat_dg_title_interface__if_octets" ++msgstr "" ++ ++#. Bytes/s ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:52 ++msgid "stat_dg_label_interface__if_octets" ++msgstr "" ++ ++#. %H: Packets on %di ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:53 ++msgid "stat_dg_title_interface__if_packets" ++msgstr "" ++ ++#. Packets/s ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:54 ++msgid "stat_dg_label_interface__if_packets" ++msgstr "" ++ ++#. %H: TCP-Connections to Port %pi ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:55 ++msgid "stat_dg_title_tcpconns" ++msgstr "" ++ ++#. Connections/s ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:56 ++msgid "stat_dg_label_tcpconns" ++msgstr "" ++ ++#. %di ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:57 ++msgid "stat_ds_tcp_connections" ++msgstr "" ++ ++#. %H: Disk Space Usage on %di ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:58 ++msgid "stat_dg_title_df" ++msgstr "" ++ ++#. Bytes ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:59 ++msgid "stat_dg_label_df" ++msgstr "" ++ ++#. %ds ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:60 ++msgid "stat_ds_df__free" ++msgstr "" ++ ++#. %ds ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:61 ++msgid "stat_ds_df__used" ++msgstr "" ++ ++#. %H: Interrupts ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:62 ++msgid "stat_dg_title_irq" ++msgstr "" ++ ++#. Issues/s ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:63 ++msgid "stat_dg_label_irq" ++msgstr "" ++ ++#. IRQ %di ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:64 ++msgid "stat_ds_irq" ++msgstr "" ++ ++#. %H: System Load ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:65 ++msgid "stat_dg_title_load" ++msgstr "" ++ ++#. Load ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:66 ++msgid "stat_dg_label_load" ++msgstr "" ++ ++#. 1 min ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:67 ++msgid "stat_ds_load__shortterm" ++msgstr "" ++ ++#. 5 min ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:68 ++msgid "stat_ds_load__midterm" ++msgstr "" ++ ++#. 15 min ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:69 ++msgid "stat_ds_load__longterm" ++msgstr "" +diff --git a/feeds/luci/applications/luci-app-statistics/po/fr/statistics.po b/feeds/luci/applications/luci-app-statistics/po/fr/statistics.po +new file mode 100644 +index 0000000..643c268 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-statistics/po/fr/statistics.po +@@ -0,0 +1,689 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Report-Msgid-Bugs-To: \n" ++"POT-Creation-Date: 2009-05-19 19:36+0200\n" ++"PO-Revision-Date: 2011-11-23 22:32+0200\n" ++"Last-Translator: fredb \n" ++"Language-Team: LANGUAGE \n" ++"Language: fr\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n > 1);\n" ++"X-Generator: Pootle 2.0.4\n" ++ ++msgid "Action (target)" ++msgstr "Action (cible)" ++ ++msgid "Add command for reading values" ++msgstr "Ajoute une commande pour lire des valeurs" ++ ++msgid "Add matching rule" ++msgstr "Ajouter une règle à surveiller" ++ ++msgid "Add multiple hosts separated by space." ++msgstr "" ++ ++msgid "Add notification command" ++msgstr "Ajoute une commande de notification" ++ ++msgid "Base Directory" ++msgstr "Répertoire de base" ++ ++msgid "Basic monitoring" ++msgstr "Surveillance de base" ++ ++msgid "CPU Plugin Configuration" ++msgstr "Configuration du greffon sur le CPU" ++ ++msgid "CSV Output" ++msgstr "Sortie au format CSV" ++ ++msgid "CSV Plugin Configuration" ++msgstr "Configuration du greffon CSV" ++ ++msgid "Cache collected data for" ++msgstr "Mettre en cache les données collectées pendant" ++ ++msgid "Cache flush interval" ++msgstr "Intervalle de vidange du cache" ++ ++msgid "Chain" ++msgstr "Chaîne" ++ ++msgid "CollectLinks" ++msgstr "" ++ ++msgid "CollectRoutes" ++msgstr "" ++ ++msgid "CollectTopology" ++msgstr "" ++ ++msgid "Collectd" ++msgstr "Collectd" ++ ++msgid "Collectd Settings" ++msgstr "Paramètres Collectd" ++ ++msgid "" ++"Collectd is a small daemon for collecting data from various sources through " ++"different plugins. On this page you can change general settings for the " ++"collectd daemon." ++msgstr "" ++"Collectd est un petit démon collectant des données de sources variées à " ++"travers différents greffons. Sur ce page, vous pouvez modifier les " ++"paramètres généraux de ce démon collectd." ++ ++msgid "Conntrack" ++msgstr "" ++ ++msgid "Conntrack Plugin Configuration" ++msgstr "" ++ ++msgid "DF Plugin Configuration" ++msgstr "Configuration du greffon DF" ++ ++msgid "DNS" ++msgstr "DNS" ++ ++msgid "DNS Plugin Configuration" ++msgstr "Configuration du greffon DNS" ++ ++msgid "Data collection interval" ++msgstr "Période de récupération des données" ++ ++msgid "Datasets definition file" ++msgstr "Fichier de définition des lots de données" ++ ++msgid "Destination ip range" ++msgstr "plage réseau de destination" ++ ++msgid "Directory for collectd plugins" ++msgstr "Répertoire pour les greffons Collectd" ++ ++msgid "Directory for sub-configurations" ++msgstr "Répertoire pour les sous-configurations" ++ ++msgid "Disk Plugin Configuration" ++msgstr "Configuration du greffon Disque" ++ ++msgid "Disk Space Usage" ++msgstr "Utilisation de l'espace-disque" ++ ++msgid "Disk Usage" ++msgstr "Espace-disque" ++ ++msgid "Display Host »" ++msgstr "" ++ ++msgid "Display timespan »" ++msgstr "Période affichée »" ++ ++msgid "E-Mail Plugin Configuration" ++msgstr "Configuration du greffon des courriels" ++ ++msgid "Email" ++msgstr "Courriel" ++ ++msgid "Enable this plugin" ++msgstr "Activer ce greffon" ++ ++msgid "Exec" ++msgstr "Exec" ++ ++msgid "Exec Plugin Configuration" ++msgstr "Configuration du greffon Exec" ++ ++msgid "Filter class monitoring" ++msgstr "Surveillance des filtres" ++ ++msgid "Firewall" ++msgstr "Pare-feu" ++ ++msgid "Flush cache after" ++msgstr "Vidanger le cache après" ++ ++msgid "Forwarding between listen and server addresses" ++msgstr "Transfert entre les adresses en écoute et du serveur" ++ ++msgid "Graphs" ++msgstr "Graphiques" ++ ++msgid "Group" ++msgstr "" ++ ++msgid "" ++"Here you can define external commands which will be started by collectd in " ++"order to read certain values. The values will be read from stdout." ++msgstr "" ++"Vous pouvez définir ici des commandes externes qui seront démarrées par " ++"collectd pour lire certaines valeurs. Ces valeurs seront lisibles depuis " ++"stdout." ++ ++msgid "" ++"Here you can define external commands which will be started by collectd when " ++"certain threshold values have been reached. The values leading to invokation " ++"will be feeded to the the called programs stdin." ++msgstr "" ++"Vous pouvez définir ici des commandes externes qui seront démarrées par " ++"collectd quand certaines valeurs-seuil seront atteintes. Les valeurs " ++"induisant ces démarrages seront fournies aux commandes externes via stdin." ++ ++msgid "" ++"Here you can define various criteria by which the monitored iptables rules " ++"are selected." ++msgstr "" ++"Vous pouvez définir ici les critères variés pour sélectionner les règles " ++"iptables à surveiller." ++ ++msgid "Host" ++msgstr "" ++ ++msgid "Hostname" ++msgstr "Nom de l'hôte" ++ ++msgid "IP or hostname where to get the txtinfo output from" ++msgstr "" ++ ++msgid "IRQ Plugin Configuration" ++msgstr "Configuration du greffon IRQ" ++ ++msgid "Ignore source addresses" ++msgstr "Ignorer les adresses-source" ++ ++msgid "Incoming interface" ++msgstr "Interface entrante" ++ ++msgid "Interface Plugin Configuration" ++msgstr "Configuration du greffon des Interfaces" ++ ++msgid "Interfaces" ++msgstr "Interfaces" ++ ++msgid "Interrupts" ++msgstr "Interruptions" ++ ++msgid "Interval for pings" ++msgstr "" ++ ++msgid "Iptables Plugin Configuration" ++msgstr "Configuration du greffon IPtables" ++ ++msgid "Leave unselected to automatically determine interfaces to monitor." ++msgstr "" ++ ++msgid "Listen host" ++msgstr "Hôte en écoute" ++ ++msgid "Listen port" ++msgstr "Port en écoute" ++ ++msgid "Listener interfaces" ++msgstr "Interfaces en écoute" ++ ++msgid "Load Plugin Configuration" ++msgstr "Configuration du greffon de charge-système" ++ ++msgid "Maximum allowed connections" ++msgstr "Nb de Connexions autorisées au maximum" ++ ++msgid "Memory" ++msgstr "" ++ ++msgid "Memory Plugin Configuration" ++msgstr "" ++ ++msgid "Monitor all except specified" ++msgstr "" ++ ++msgid "Monitor all local listen ports" ++msgstr "Surveiller tous les ports en écoute locaux" ++ ++msgid "Monitor devices" ++msgstr "Périphériques à surveiller" ++ ++msgid "Monitor disks and partitions" ++msgstr "Disques et partitions à surveiller" ++ ++msgid "Monitor filesystem types" ++msgstr "types de systèmes de fichier à surveiller" ++ ++msgid "Monitor hosts" ++msgstr "Hôtes à surveiller" ++ ++msgid "Monitor interfaces" ++msgstr "" ++ ++msgid "Monitor interrupts" ++msgstr "Surveiller les interruptions" ++ ++msgid "Monitor local ports" ++msgstr "Surveiller les ports locaux" ++ ++msgid "Monitor mount points" ++msgstr "Points de montage à surveiller" ++ ++msgid "Monitor processes" ++msgstr "Processus à surveiller" ++ ++msgid "Monitor remote ports" ++msgstr "Surveiller les ports destinataires" ++ ++msgid "Name of the rule" ++msgstr "Nom de la règle" ++ ++msgid "Netlink" ++msgstr "" ++ ++msgid "Netlink Plugin Configuration" ++msgstr "Configuration du greffon du lien-réseau" ++ ++msgid "Network" ++msgstr "Réseau" ++ ++msgid "Network Plugin Configuration" ++msgstr "Configuration du greffon réseau" ++ ++msgid "Network plugins" ++msgstr "Greffons liés au réseau" ++ ++msgid "Network protocol" ++msgstr "Protocole réseau" ++ ++msgid "Number of threads for data collection" ++msgstr "Nombre de fils pour la récupération des données" ++ ++msgid "OLSRd" ++msgstr "" ++ ++msgid "OLSRd Plugin Configuration" ++msgstr "" ++ ++msgid "Only create average RRAs" ++msgstr "Créer seulement des RRAs moyens" ++ ++msgid "Options" ++msgstr "Options" ++ ++msgid "Outgoing interface" ++msgstr "Interface sortante" ++ ++msgid "Output plugins" ++msgstr "Greffons liés aux résultats" ++ ++msgid "Ping" ++msgstr "Ping" ++ ++msgid "Ping Plugin Configuration" ++msgstr "Configuration du greffon Ping" ++ ++msgid "Port" ++msgstr "" ++ ++msgid "Processes" ++msgstr "Processus" ++ ++msgid "Processes Plugin Configuration" ++msgstr "Configuration du greffon des processus" ++ ++msgid "Processes to monitor separated by space" ++msgstr "" ++ ++msgid "Processor" ++msgstr "Processeur" ++ ++msgid "Qdisc monitoring" ++msgstr "Surveillance Qdisc" ++ ++msgid "RRD XFiles Factor" ++msgstr "" ++ ++msgid "RRD heart beat interval" ++msgstr "Intervalle de la pulsation RRD" ++ ++msgid "RRD step interval" ++msgstr "Intervalle d'avancement RRD" ++ ++msgid "RRDTool" ++msgstr "RRDTool" ++ ++msgid "RRDTool Plugin Configuration" ++msgstr "Configuration du greffon RRDTool" ++ ++msgid "Rows per RRA" ++msgstr "Lignes par RRA" ++ ++msgid "Script" ++msgstr "" ++ ++msgid "Seconds" ++msgstr "Secondes" ++ ++msgid "Server host" ++msgstr "Hôte du serveur" ++ ++msgid "Server port" ++msgstr "Port du serveur" ++ ++msgid "Shaping class monitoring" ++msgstr "Surveillance liées à la priorité" ++ ++msgid "Socket file" ++msgstr "" ++ ++msgid "Socket group" ++msgstr "" ++ ++msgid "Socket permissions" ++msgstr "" ++ ++msgid "Source ip range" ++msgstr "plage réseau source" ++ ++msgid "Specifies what information to collect about links." ++msgstr "" ++ ++msgid "Specifies what information to collect about routes." ++msgstr "" ++ ++msgid "Specifies what information to collect about the global topology." ++msgstr "" ++ ++msgid "Splash Leases" ++msgstr "" ++ ++msgid "Splash Leases Plugin Configuration" ++msgstr "" ++ ++msgid "Statistics" ++msgstr "" ++ ++msgid "Storage directory" ++msgstr "Répertoire de stockage" ++ ++msgid "Storage directory for the csv files" ++msgstr "Répertoire de stockage pour les fichiers CSV" ++ ++msgid "Store data values as rates instead of absolute values" ++msgstr "Stocke les données sous forme de taux plutôt que de valeurs absolues" ++ ++msgid "Stored timespans" ++msgstr "Durée de la période enregistrée" ++ ++msgid "System Load" ++msgstr "Charge-système" ++ ++msgid "System plugins" ++msgstr "Greffons liés au système" ++ ++msgid "TCP Connections" ++msgstr "Connexions TCP" ++ ++msgid "TCPConns Plugin Configuration" ++msgstr "Configuration du plugin des connexions TCP" ++ ++msgid "TTL for network packets" ++msgstr "TTL des paquets-réseau" ++ ++msgid "TTL for ping packets" ++msgstr "TTL des paquets ping" ++ ++msgid "Table" ++msgstr "Table" ++ ++msgid "The NUT plugin reads information about Uninterruptible Power Supplies." ++msgstr "" ++ ++msgid "" ++"The OLSRd plugin reads information about meshed networks from the txtinfo " ++"plugin of OLSRd." ++msgstr "" ++ ++msgid "" ++"The conntrack plugin collects statistics about the number of tracked " ++"connections." ++msgstr "" ++ ++msgid "The cpu plugin collects basic statistics about the processor usage." ++msgstr "Le greffon sur le CPU récupère des données sur l'usage du processeur." ++ ++msgid "" ++"The csv plugin stores collected data in csv file format for further " ++"processing by external programs." ++msgstr "" ++"Le greffon CSV stocke les données collectées dans des fichiers au format CSV " ++"pour être traités ultérieurement par des programmes externes." ++ ++msgid "" ++"The df plugin collects statistics about the disk space usage on different " ++"devices, mount points or filesystem types." ++msgstr "" ++"Le plugin DF récupère des données sur l'utilisation de l'espace-disque sur " ++"différents périphériques, points de montage ou types de systèmes de fichiers." ++ ++msgid "" ++"The disk plugin collects detailled usage statistics for selected partitions " ++"or whole disks." ++msgstr "" ++"Le greffon Disque récupère des informations détaillées sur des disques ou " ++"partitions sélectionnées." ++ ++msgid "" ++"The dns plugin collects detailled statistics about dns related traffic on " ++"selected interfaces." ++msgstr "" ++"Le greffon DNS récupère des données détaillées à propos du trafic lié au DNS " ++"sur des interfaces sélectionnées." ++ ++msgid "" ++"The email plugin creates a unix socket which can be used to transmit email-" ++"statistics to a running collectd daemon. This plugin is primarily intended " ++"to be used in conjunction with Mail::SpamAssasin::Plugin::Collectd but can " ++"be used in other ways as well." ++msgstr "" ++"Le greffon des courriels crée une socket UNIX qui peut être utilisée pour " ++"transmettre des données sur les courriels à un démon collectd en fonction. " ++"Ce greffon est d'abord destiné à être utilisé avec Mail::SpamAssasin::" ++"Plugin::Collectd mais peut être utilisé d'autres manières également." ++ ++msgid "" ++"The exec plugin starts external commands to read values from or to notify " ++"external processes when certain threshold values have been reached." ++msgstr "" ++"Le greffon Exec lance des commandes externes pour lire des valeurs ou " ++"notifie des processus externes quand certains seuils ont été atteints." ++ ++msgid "" ++"The interface plugin collects traffic statistics on selected interfaces." ++msgstr "" ++"Ce greffon des interfaces collecte des statistiques de trafic sur les " ++"interfaces sélectionnées." ++ ++msgid "" ++"The iptables plugin will monitor selected firewall rules and collect " ++"informations about processed bytes and packets per rule." ++msgstr "" ++"Le greffon IPtables surveillera des règles de pare-feu sélectionnées et " ++"collectera des informations sur les octets et paquets IP traités par chaque " ++"règle." ++ ++msgid "" ++"The irq plugin will monitor the rate of issues per second for each selected " ++"interrupt. If no interrupt is selected then all interrupts are monitored." ++msgstr "" ++"Le greffon IRG surveillera le taux d'apparitions par seconde de chaque " ++"interruption sélectionnée. Si aucune interruption n'est sélectionnée, toutes " ++"sont surveillées." ++ ++msgid "" ++"The iwinfo plugin collects statistics about wireless signal strength, noise " ++"and quality." ++msgstr "" ++ ++msgid "The load plugin collects statistics about the general system load." ++msgstr "" ++"Le greffon de charge-système collecte des données sur la charge générale du " ++"système." ++ ++msgid "The memory plugin collects statistics about the memory usage." ++msgstr "" ++ ++msgid "" ++"The netlink plugin collects extended informations like qdisc-, class- and " ++"filter-statistics for selected interfaces." ++msgstr "" ++"Le greffon de lien-réseau récupère sur les interfaces sélectionnées des " ++"informations avancées liées à la QOS, aux classes et au filtrage." ++ ++msgid "" ++"The network plugin provides network based communication between different " ++"collectd instances. Collectd can operate both in client and server mode. In " ++"client mode locally collected data is transferred to a collectd server " ++"instance, in server mode the local instance receives data from other hosts." ++msgstr "" ++"Le greffon réseau fournit des communications-réseau entre différentes " ++"instances collectd : ce programme peut fonctionner à la fois comme client et " ++"serveur. En mode client, les données collectées localement sont transférées " ++"à un serveur, en mode serveur, l'instance collectd locale reçoit des " ++"informations d'autres hôtes." ++ ++msgid "" ++"The ping plugin will send icmp echo replies to selected hosts and measure " ++"the roundtrip time for each host." ++msgstr "" ++"Le greffon ping envoie des paquets ICMP « echo reply » aux hôtes définis et " ++"mesure le temps d'aller-retour avec chacun." ++ ++msgid "" ++"The processes plugin collects informations like cpu time, page faults and " ++"memory usage of selected processes." ++msgstr "" ++"Le greffon des processus récupère des informations comme le temps CPU, les " ++"défauts de page et l'utilisation mémoire des processus définis." ++ ++msgid "" ++"The rrdtool plugin stores the collected data in rrd database files, the " ++"foundation of the diagrams.

    Warning: Setting the wrong " ++"values will result in a very high memory consumption in the temporary " ++"directory. This can render the device unusable!" ++msgstr "" ++"Le greffon RRDTool stocke les informations récupérées dans des fichiers de " ++"base de données RRD, sur lesquels s'appuient la génération de graphes.

    Attention : Un mauvais paramètrage peut entraîner une très " ++"grande consommation mémoire dans le répertoire temporaire, qui peut rendre " ++"le matériel inutilisable !" ++ ++msgid "" ++"The splash leases plugin uses libuci to collect statistics about splash " ++"leases." ++msgstr "" ++ ++msgid "" ++"The statistics package is based on Collectd and uses RRD " ++"Tool to render diagram images from collected data." ++msgstr "" ++"Ce paquet d'outils statistiques s'appuie sur le logiciel Collectd et utilise RRD Tool pour calculer les graphes issus des " ++"données collectées." ++ ++msgid "" ++"The tcpconns plugin collects informations about open tcp connections on " ++"selected ports." ++msgstr "" ++"Le greffon des connexions TCP récupère des informations sur les ouvertures " ++"de connexions TCP sur les ports spécifiés." ++ ++msgid "" ++"The unixsock plugin creates a unix socket which can be used to read " ++"collected data from a running collectd instance." ++msgstr "" ++ ++msgid "The uptime plugin collects statistics about the uptime of the system." ++msgstr "" ++ ++msgid "" ++"This section defines on which interfaces collectd will wait for incoming " ++"connections." ++msgstr "" ++"Cette section définit sur quelles interfaces collectd écoutera des " ++"connexions entrantes." ++ ++msgid "" ++"This section defines to which servers the locally collected data is sent to." ++msgstr "" ++"Cette section définit à quels serveurs sont envoyées les données collectées " ++"localement." ++ ++msgid "Try to lookup fully qualified hostname" ++msgstr "Tente de récupérer des noms d'hôtes complètement qualifiés" ++ ++msgid "UPS" ++msgstr "" ++ ++msgid "UPS Plugin Configuration" ++msgstr "" ++ ++msgid "UPS name in NUT ups@host format" ++msgstr "" ++ ++msgid "UnixSock" ++msgstr "Socket Unix" ++ ++msgid "Unixsock Plugin Configuration" ++msgstr "Configuration du greffon de socket Unix" ++ ++msgid "Uptime" ++msgstr "" ++ ++msgid "Uptime Plugin Configuration" ++msgstr "" ++ ++msgid "Used PID file" ++msgstr "Fichier PID utilisé" ++ ++msgid "User" ++msgstr "" ++ ++msgid "Verbose monitoring" ++msgstr "Surveillance verbeuse" ++ ++msgid "Wireless" ++msgstr "Sans-fil" ++ ++msgid "Wireless iwinfo Plugin Configuration" ++msgstr "" ++ ++msgid "e.g. br-ff" ++msgstr "p.ex. br-ff" ++ ++msgid "e.g. br-lan" ++msgstr "p.ex. br-lan" ++ ++msgid "e.g. reject-with tcp-reset" ++msgstr "p.ex. reject-with tcp-reset" ++ ++msgid "max. 16 chars" ++msgstr "Max. 16 caractères" ++ ++msgid "reduces rrd size" ++msgstr "Diminuer la taille RRD" ++ ++msgid "seconds; multiple separated by space" ++msgstr "En secondes ; séparer différentes valeurs par des espaces" ++ ++msgid "server interfaces" ++msgstr "Interfaces du serveur" ++ ++#~ msgid "" ++#~ "The wireless plugin collects statistics about wireless signal strength, " ++#~ "noise and quality." ++#~ msgstr "" ++#~ "Le greffon sans-fil récupère des informations sur la puissance du signal " ++#~ "wifi, sa qualité et sur le bruit." ++ ++#~ msgid "Wireless Plugin Configuration" ++#~ msgstr "Configuration du greffon sans-fil" +diff --git a/feeds/luci/applications/luci-app-statistics/po/he/rrdtool.po b/feeds/luci/applications/luci-app-statistics/po/he/rrdtool.po +new file mode 100644 +index 0000000..32b74f7 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-statistics/po/he/rrdtool.po +@@ -0,0 +1,356 @@ ++# rrdtool.pot ++# generated from ./applications/luci-statistics/luasrc/i18n/rrdtool.en.lua ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Last-Translator: Automatically generated\n" ++"Language-Team: none\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n != 1);\n" ++ ++#. %H: Wireless - Signal Noise Ratio ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:1 ++msgid "stat_dg_title_wireless__signal_noise" ++msgstr "" ++ ++#. dBm ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:2 ++msgid "stat_dg_label_wireless__signal_noise" ++msgstr "" ++ ++#. Noise Level ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:3 ++msgid "stat_ds_signal_noise" ++msgstr "" ++ ++#. Signal Strength ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:4 ++msgid "stat_ds_signal_power" ++msgstr "" ++ ++#. %H: Wireless - Signal Quality ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:5 ++msgid "stat_dg_title_wireless__signal_quality" ++msgstr "" ++ ++#. n ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:6 ++msgid "stat_dg_label_wireless__signal_quality" ++msgstr "" ++ ++#. Signal Quality ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:7 ++msgid "stat_ds_signal_quality" ++msgstr "" ++ ++#. %H: ICMP Roundtrip Times ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:8 ++msgid "stat_dg_title_ping" ++msgstr "" ++ ++#. ms ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:9 ++msgid "stat_dg_label_ping" ++msgstr "" ++ ++#. %di ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:10 ++msgid "stat_ds_ping" ++msgstr "" ++ ++#. %H: Firewall - Processed Packets ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:11 ++msgid "stat_dg_title_iptables__ipt_packets" ++msgstr "" ++ ++#. Packets/s ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:12 ++msgid "stat_dg_label_iptables__ipt_packets" ++msgstr "" ++ ++#. Chain \"%di\" ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:13 ++msgid "stat_ds_ipt_packets" ++msgstr "" ++ ++#. %H: Netlink - Transfer on %pi ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:14 ++msgid "stat_dg_title_netlink__if_octets" ++msgstr "" ++ ++#. Bytes/s ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:15 ++msgid "stat_dg_label_netlink__if_octets" ++msgstr "" ++ ++#. Bytes (%ds) ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:16 ++msgid "stat_ds_if_octets" ++msgstr "" ++ ++#. %H: Netlink - Packets on %pi ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:17 ++msgid "stat_dg_title_netlink__if_packets" ++msgstr "" ++ ++#. Packets/s ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:18 ++msgid "stat_dg_label_netlink__if_packets" ++msgstr "" ++ ++#. Processed (%ds) ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:19 ++msgid "stat_ds_if_packets" ++msgstr "" ++ ++#. Dropped (%ds) ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:20 ++msgid "stat_ds_if_dropped" ++msgstr "" ++ ++#. Errors (%ds) ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:21 ++msgid "stat_ds_if_errors" ++msgstr "" ++ ++#. %H: Netlink - Multicast on %pi ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:22 ++msgid "stat_dg_title_netlink__if_multicast" ++msgstr "" ++ ++#. Packets/s ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:23 ++msgid "stat_dg_label_netlink__if_multicast" ++msgstr "" ++ ++#. Packets ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:24 ++msgid "stat_ds_if_multicast" ++msgstr "" ++ ++#. %H: Netlink - Collisions on %pi ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:25 ++msgid "stat_dg_title_netlink__if_collisions" ++msgstr "" ++ ++#. Collisions/s ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:26 ++msgid "stat_dg_label_netlink__if_collisions" ++msgstr "" ++ ++#. Collisions ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:27 ++msgid "stat_ds_if_collisions" ++msgstr "" ++ ++#. %H: Netlink - Errors on %pi ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:28 ++msgid "stat_dg_title_netlink__if_tx_errors" ++msgstr "" ++ ++#. Errors/s ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:29 ++msgid "stat_dg_label_netlink__if_tx_errors" ++msgstr "" ++ ++#. %di ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:30 ++msgid "stat_ds_if_tx_errors" ++msgstr "" ++ ++#. %di ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:31 ++msgid "stat_ds_if_rx_errors" ++msgstr "" ++ ++#. %H: Processes ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:32 ++msgid "stat_dg_title_processes" ++msgstr "" ++ ++#. Processes/s ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:33 ++msgid "stat_dg_label_processes" ++msgstr "" ++ ++#. %di ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:34 ++msgid "stat_ds_ps_state" ++msgstr "" ++ ++#. %H: Process %pi - used cpu time ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:35 ++msgid "stat_dg_title_processes__ps_cputime" ++msgstr "" ++ ++#. Jiffies ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:36 ++msgid "stat_dg_label_processes__ps_cputime" ++msgstr "" ++ ++#. system ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:37 ++msgid "stat_ds_ps_cputime__syst" ++msgstr "" ++ ++#. user ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:38 ++msgid "stat_ds_ps_cputime__user" ++msgstr "" ++ ++#. %H: Process %pi - threads and processes ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:39 ++msgid "stat_dg_title_processes__ps_count" ++msgstr "" ++ ++#. Count ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:40 ++msgid "stat_dg_label_processes__ps_count" ++msgstr "" ++ ++#. %ds ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:41 ++msgid "stat_ds_ps_count" ++msgstr "" ++ ++#. %H: Process %pi - page faults ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:42 ++msgid "stat_dg_title_processes__ps_pagefaults" ++msgstr "" ++ ++#. Pagefaults ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:43 ++msgid "stat_dg_label_processes__ps_pagefaults" ++msgstr "" ++ ++#. page faults ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:44 ++msgid "stat_ds_ps_pagefaults" ++msgstr "" ++ ++#. %H: Process %pi - virtual memory size ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:45 ++msgid "stat_dg_title_processes__ps_rss" ++msgstr "" ++ ++#. Bytes ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:46 ++msgid "stat_dg_label_processes__ps_rss" ++msgstr "" ++ ++#. virtual memory ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:47 ++msgid "stat_ds_ps_rss" ++msgstr "" ++ ++#. %H: Usage on Processor #%pi ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:48 ++msgid "stat_dg_title_cpu" ++msgstr "" ++ ++#. % ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:49 ++msgid "stat_dg_label_cpu" ++msgstr "" ++ ++#. %di ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:50 ++msgid "stat_ds_cpu" ++msgstr "" ++ ++#. %H: Transfer on %di ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:51 ++msgid "stat_dg_title_interface__if_octets" ++msgstr "" ++ ++#. Bytes/s ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:52 ++msgid "stat_dg_label_interface__if_octets" ++msgstr "" ++ ++#. %H: Packets on %di ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:53 ++msgid "stat_dg_title_interface__if_packets" ++msgstr "" ++ ++#. Packets/s ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:54 ++msgid "stat_dg_label_interface__if_packets" ++msgstr "" ++ ++#. %H: TCP-Connections to Port %pi ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:55 ++msgid "stat_dg_title_tcpconns" ++msgstr "" ++ ++#. Connections/s ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:56 ++msgid "stat_dg_label_tcpconns" ++msgstr "" ++ ++#. %di ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:57 ++msgid "stat_ds_tcp_connections" ++msgstr "" ++ ++#. %H: Disk Space Usage on %di ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:58 ++msgid "stat_dg_title_df" ++msgstr "" ++ ++#. Bytes ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:59 ++msgid "stat_dg_label_df" ++msgstr "" ++ ++#. %ds ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:60 ++msgid "stat_ds_df__free" ++msgstr "" ++ ++#. %ds ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:61 ++msgid "stat_ds_df__used" ++msgstr "" ++ ++#. %H: Interrupts ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:62 ++msgid "stat_dg_title_irq" ++msgstr "" ++ ++#. Issues/s ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:63 ++msgid "stat_dg_label_irq" ++msgstr "" ++ ++#. IRQ %di ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:64 ++msgid "stat_ds_irq" ++msgstr "" ++ ++#. %H: System Load ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:65 ++msgid "stat_dg_title_load" ++msgstr "" ++ ++#. Load ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:66 ++msgid "stat_dg_label_load" ++msgstr "" ++ ++#. 1 min ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:67 ++msgid "stat_ds_load__shortterm" ++msgstr "" ++ ++#. 5 min ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:68 ++msgid "stat_ds_load__midterm" ++msgstr "" ++ ++#. 15 min ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:69 ++msgid "stat_ds_load__longterm" ++msgstr "" +diff --git a/feeds/luci/applications/luci-app-statistics/po/he/statistics.po b/feeds/luci/applications/luci-app-statistics/po/he/statistics.po +new file mode 100644 +index 0000000..542a9c0 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-statistics/po/he/statistics.po +@@ -0,0 +1,618 @@ ++# statistics.pot ++# generated from ./applications/luci-statistics/luasrc/i18n/statistics.en.lua ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"PO-Revision-Date: 2012-09-10 04:59+0200\n" ++"Last-Translator: Snoof \n" ++"Language-Team: none\n" ++"Language: he\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n != 1);\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "Action (target)" ++msgstr "" ++ ++msgid "Add command for reading values" ++msgstr "הוסף פקודה לקרי×ת נתוני×" ++ ++msgid "Add matching rule" ++msgstr "" ++ ++msgid "Add multiple hosts separated by space." ++msgstr "" ++ ++msgid "Add notification command" ++msgstr "" ++ ++msgid "Base Directory" ++msgstr "" ++ ++msgid "Basic monitoring" ++msgstr "" ++ ++msgid "CPU Plugin Configuration" ++msgstr "" ++ ++msgid "CSV Output" ++msgstr "" ++ ++msgid "CSV Plugin Configuration" ++msgstr "" ++ ++msgid "Cache collected data for" ++msgstr "" ++ ++msgid "Cache flush interval" ++msgstr "" ++ ++msgid "Chain" ++msgstr "" ++ ++msgid "CollectLinks" ++msgstr "" ++ ++msgid "CollectRoutes" ++msgstr "" ++ ++msgid "CollectTopology" ++msgstr "" ++ ++msgid "Collectd" ++msgstr "" ++ ++msgid "Collectd Settings" ++msgstr "" ++ ++msgid "" ++"Collectd is a small daemon for collecting data from various sources through " ++"different plugins. On this page you can change general settings for the " ++"collectd daemon." ++msgstr "" ++ ++msgid "Conntrack" ++msgstr "" ++ ++msgid "Conntrack Plugin Configuration" ++msgstr "" ++ ++msgid "DF Plugin Configuration" ++msgstr "" ++ ++msgid "DNS" ++msgstr "" ++ ++msgid "DNS Plugin Configuration" ++msgstr "" ++ ++msgid "Data collection interval" ++msgstr "" ++ ++msgid "Datasets definition file" ++msgstr "" ++ ++msgid "Destination ip range" ++msgstr "" ++ ++msgid "Directory for collectd plugins" ++msgstr "" ++ ++msgid "Directory for sub-configurations" ++msgstr "" ++ ++msgid "Disk Plugin Configuration" ++msgstr "" ++ ++msgid "Disk Space Usage" ++msgstr "" ++ ++msgid "Disk Usage" ++msgstr "" ++ ++msgid "Display Host »" ++msgstr "" ++ ++msgid "Display timespan »" ++msgstr "" ++ ++msgid "E-Mail Plugin Configuration" ++msgstr "" ++ ++msgid "Email" ++msgstr "" ++ ++msgid "Enable this plugin" ++msgstr "" ++ ++msgid "Exec" ++msgstr "" ++ ++msgid "Exec Plugin Configuration" ++msgstr "" ++ ++msgid "Filter class monitoring" ++msgstr "" ++ ++msgid "Firewall" ++msgstr "" ++ ++msgid "Flush cache after" ++msgstr "" ++ ++msgid "Forwarding between listen and server addresses" ++msgstr "" ++ ++msgid "Graphs" ++msgstr "" ++ ++msgid "Group" ++msgstr "" ++ ++msgid "" ++"Here you can define external commands which will be started by collectd in " ++"order to read certain values. The values will be read from stdout." ++msgstr "" ++ ++msgid "" ++"Here you can define external commands which will be started by collectd when " ++"certain threshold values have been reached. The values leading to invokation " ++"will be feeded to the the called programs stdin." ++msgstr "" ++ ++msgid "" ++"Here you can define various criteria by which the monitored iptables rules " ++"are selected." ++msgstr "" ++ ++msgid "Host" ++msgstr "" ++ ++msgid "Hostname" ++msgstr "" ++ ++msgid "IP or hostname where to get the txtinfo output from" ++msgstr "" ++ ++msgid "IRQ Plugin Configuration" ++msgstr "" ++ ++msgid "Ignore source addresses" ++msgstr "" ++ ++msgid "Incoming interface" ++msgstr "" ++ ++msgid "Interface Plugin Configuration" ++msgstr "" ++ ++msgid "Interfaces" ++msgstr "" ++ ++msgid "Interrupts" ++msgstr "" ++ ++msgid "Interval for pings" ++msgstr "" ++ ++msgid "Iptables Plugin Configuration" ++msgstr "" ++ ++msgid "Leave unselected to automatically determine interfaces to monitor." ++msgstr "" ++ ++msgid "Listen host" ++msgstr "" ++ ++msgid "Listen port" ++msgstr "" ++ ++msgid "Listener interfaces" ++msgstr "" ++ ++msgid "Load Plugin Configuration" ++msgstr "" ++ ++msgid "Maximum allowed connections" ++msgstr "" ++ ++msgid "Memory" ++msgstr "" ++ ++msgid "Memory Plugin Configuration" ++msgstr "" ++ ++msgid "Monitor all except specified" ++msgstr "" ++ ++msgid "Monitor all local listen ports" ++msgstr "" ++ ++msgid "Monitor devices" ++msgstr "" ++ ++msgid "Monitor disks and partitions" ++msgstr "" ++ ++msgid "Monitor filesystem types" ++msgstr "" ++ ++msgid "Monitor hosts" ++msgstr "" ++ ++msgid "Monitor interfaces" ++msgstr "" ++ ++msgid "Monitor interrupts" ++msgstr "" ++ ++msgid "Monitor local ports" ++msgstr "" ++ ++msgid "Monitor mount points" ++msgstr "" ++ ++msgid "Monitor processes" ++msgstr "" ++ ++msgid "Monitor remote ports" ++msgstr "" ++ ++msgid "Name of the rule" ++msgstr "" ++ ++msgid "Netlink" ++msgstr "" ++ ++msgid "Netlink Plugin Configuration" ++msgstr "" ++ ++msgid "Network" ++msgstr "" ++ ++msgid "Network Plugin Configuration" ++msgstr "" ++ ++msgid "Network plugins" ++msgstr "" ++ ++msgid "Network protocol" ++msgstr "" ++ ++msgid "Number of threads for data collection" ++msgstr "" ++ ++msgid "OLSRd" ++msgstr "" ++ ++msgid "OLSRd Plugin Configuration" ++msgstr "" ++ ++msgid "Only create average RRAs" ++msgstr "" ++ ++msgid "Options" ++msgstr "" ++ ++msgid "Outgoing interface" ++msgstr "" ++ ++msgid "Output plugins" ++msgstr "" ++ ++msgid "Ping" ++msgstr "" ++ ++msgid "Ping Plugin Configuration" ++msgstr "" ++ ++msgid "Port" ++msgstr "" ++ ++msgid "Processes" ++msgstr "" ++ ++msgid "Processes Plugin Configuration" ++msgstr "" ++ ++msgid "Processes to monitor separated by space" ++msgstr "" ++ ++msgid "Processor" ++msgstr "" ++ ++msgid "Qdisc monitoring" ++msgstr "" ++ ++msgid "RRD XFiles Factor" ++msgstr "" ++ ++msgid "RRD heart beat interval" ++msgstr "" ++ ++msgid "RRD step interval" ++msgstr "" ++ ++msgid "RRDTool" ++msgstr "" ++ ++msgid "RRDTool Plugin Configuration" ++msgstr "" ++ ++msgid "Rows per RRA" ++msgstr "" ++ ++msgid "Script" ++msgstr "" ++ ++msgid "Seconds" ++msgstr "" ++ ++msgid "Server host" ++msgstr "" ++ ++msgid "Server port" ++msgstr "" ++ ++msgid "Shaping class monitoring" ++msgstr "" ++ ++msgid "Socket file" ++msgstr "" ++ ++msgid "Socket group" ++msgstr "" ++ ++msgid "Socket permissions" ++msgstr "" ++ ++msgid "Source ip range" ++msgstr "" ++ ++msgid "Specifies what information to collect about links." ++msgstr "" ++ ++msgid "Specifies what information to collect about routes." ++msgstr "" ++ ++msgid "Specifies what information to collect about the global topology." ++msgstr "" ++ ++msgid "Splash Leases" ++msgstr "" ++ ++msgid "Splash Leases Plugin Configuration" ++msgstr "" ++ ++msgid "Statistics" ++msgstr "" ++ ++msgid "Storage directory" ++msgstr "" ++ ++msgid "Storage directory for the csv files" ++msgstr "" ++ ++msgid "Store data values as rates instead of absolute values" ++msgstr "" ++ ++msgid "Stored timespans" ++msgstr "" ++ ++msgid "System Load" ++msgstr "" ++ ++msgid "System plugins" ++msgstr "" ++ ++msgid "TCP Connections" ++msgstr "" ++ ++msgid "TCPConns Plugin Configuration" ++msgstr "" ++ ++msgid "TTL for network packets" ++msgstr "" ++ ++msgid "TTL for ping packets" ++msgstr "" ++ ++msgid "Table" ++msgstr "" ++ ++msgid "The NUT plugin reads information about Uninterruptible Power Supplies." ++msgstr "" ++ ++msgid "" ++"The OLSRd plugin reads information about meshed networks from the txtinfo " ++"plugin of OLSRd." ++msgstr "" ++ ++msgid "" ++"The conntrack plugin collects statistics about the number of tracked " ++"connections." ++msgstr "" ++ ++msgid "The cpu plugin collects basic statistics about the processor usage." ++msgstr "" ++ ++msgid "" ++"The csv plugin stores collected data in csv file format for further " ++"processing by external programs." ++msgstr "" ++ ++msgid "" ++"The df plugin collects statistics about the disk space usage on different " ++"devices, mount points or filesystem types." ++msgstr "" ++ ++msgid "" ++"The disk plugin collects detailled usage statistics for selected partitions " ++"or whole disks." ++msgstr "" ++ ++msgid "" ++"The dns plugin collects detailled statistics about dns related traffic on " ++"selected interfaces." ++msgstr "" ++ ++msgid "" ++"The email plugin creates a unix socket which can be used to transmit email-" ++"statistics to a running collectd daemon. This plugin is primarily intended " ++"to be used in conjunction with Mail::SpamAssasin::Plugin::Collectd but can " ++"be used in other ways as well." ++msgstr "" ++ ++msgid "" ++"The exec plugin starts external commands to read values from or to notify " ++"external processes when certain threshold values have been reached." ++msgstr "" ++ ++msgid "" ++"The interface plugin collects traffic statistics on selected interfaces." ++msgstr "" ++ ++msgid "" ++"The iptables plugin will monitor selected firewall rules and collect " ++"informations about processed bytes and packets per rule." ++msgstr "" ++ ++msgid "" ++"The irq plugin will monitor the rate of issues per second for each selected " ++"interrupt. If no interrupt is selected then all interrupts are monitored." ++msgstr "" ++ ++msgid "" ++"The iwinfo plugin collects statistics about wireless signal strength, noise " ++"and quality." ++msgstr "" ++ ++msgid "The load plugin collects statistics about the general system load." ++msgstr "" ++ ++msgid "The memory plugin collects statistics about the memory usage." ++msgstr "" ++ ++msgid "" ++"The netlink plugin collects extended informations like qdisc-, class- and " ++"filter-statistics for selected interfaces." ++msgstr "" ++ ++msgid "" ++"The network plugin provides network based communication between different " ++"collectd instances. Collectd can operate both in client and server mode. In " ++"client mode locally collected data is transferred to a collectd server " ++"instance, in server mode the local instance receives data from other hosts." ++msgstr "" ++ ++msgid "" ++"The ping plugin will send icmp echo replies to selected hosts and measure " ++"the roundtrip time for each host." ++msgstr "" ++ ++msgid "" ++"The processes plugin collects informations like cpu time, page faults and " ++"memory usage of selected processes." ++msgstr "" ++ ++msgid "" ++"The rrdtool plugin stores the collected data in rrd database files, the " ++"foundation of the diagrams.

    Warning: Setting the wrong " ++"values will result in a very high memory consumption in the temporary " ++"directory. This can render the device unusable!" ++msgstr "" ++ ++msgid "" ++"The splash leases plugin uses libuci to collect statistics about splash " ++"leases." ++msgstr "" ++ ++msgid "" ++"The statistics package is based on Collectd and uses RRD " ++"Tool to render diagram images from collected data." ++msgstr "" ++ ++msgid "" ++"The tcpconns plugin collects informations about open tcp connections on " ++"selected ports." ++msgstr "" ++ ++msgid "" ++"The unixsock plugin creates a unix socket which can be used to read " ++"collected data from a running collectd instance." ++msgstr "" ++ ++msgid "The uptime plugin collects statistics about the uptime of the system." ++msgstr "" ++ ++msgid "" ++"This section defines on which interfaces collectd will wait for incoming " ++"connections." ++msgstr "" ++ ++msgid "" ++"This section defines to which servers the locally collected data is sent to." ++msgstr "" ++ ++msgid "Try to lookup fully qualified hostname" ++msgstr "" ++ ++msgid "UPS" ++msgstr "" ++ ++msgid "UPS Plugin Configuration" ++msgstr "" ++ ++msgid "UPS name in NUT ups@host format" ++msgstr "" ++ ++msgid "UnixSock" ++msgstr "" ++ ++msgid "Unixsock Plugin Configuration" ++msgstr "" ++ ++msgid "Uptime" ++msgstr "" ++ ++msgid "Uptime Plugin Configuration" ++msgstr "" ++ ++msgid "Used PID file" ++msgstr "" ++ ++msgid "User" ++msgstr "" ++ ++msgid "Verbose monitoring" ++msgstr "" ++ ++msgid "Wireless" ++msgstr "" ++ ++msgid "Wireless iwinfo Plugin Configuration" ++msgstr "" ++ ++msgid "e.g. br-ff" ++msgstr "" ++ ++msgid "e.g. br-lan" ++msgstr "" ++ ++msgid "e.g. reject-with tcp-reset" ++msgstr "" ++ ++msgid "max. 16 chars" ++msgstr "" ++ ++msgid "reduces rrd size" ++msgstr "" ++ ++msgid "seconds; multiple separated by space" ++msgstr "" ++ ++msgid "server interfaces" ++msgstr "" +diff --git a/feeds/luci/applications/luci-app-statistics/po/hu/rrdtool.po b/feeds/luci/applications/luci-app-statistics/po/hu/rrdtool.po +new file mode 100644 +index 0000000..582c939 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-statistics/po/hu/rrdtool.po +@@ -0,0 +1,359 @@ ++# rrdtool.pot ++# generated from ./applications/luci-statistics/luasrc/i18n/rrdtool.en.lua ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"PO-Revision-Date: 2012-04-01 10:38+0200\n" ++"Last-Translator: juhosg \n" ++"Language-Team: none\n" ++"Language: hu\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n != 1);\n" ++"X-Generator: Pootle 2.0.4\n" ++ ++#. %H: Wireless - Signal Noise Ratio ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:1 ++msgid "stat_dg_title_wireless__signal_noise" ++msgstr "%H: Vezetéknélküli - Jel-zaj arány" ++ ++#. dBm ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:2 ++msgid "stat_dg_label_wireless__signal_noise" ++msgstr "dBm" ++ ++#. Noise Level ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:3 ++msgid "stat_ds_signal_noise" ++msgstr "Zajszint" ++ ++#. Signal Strength ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:4 ++msgid "stat_ds_signal_power" ++msgstr "JelerÅ‘sség" ++ ++#. %H: Wireless - Signal Quality ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:5 ++msgid "stat_dg_title_wireless__signal_quality" ++msgstr "%H: Vezetéknélküli - Jel minÅ‘ség" ++ ++#. n ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:6 ++msgid "stat_dg_label_wireless__signal_quality" ++msgstr "n" ++ ++#. Signal Quality ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:7 ++msgid "stat_ds_signal_quality" ++msgstr "JelminÅ‘ség" ++ ++#. %H: ICMP Roundtrip Times ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:8 ++msgid "stat_dg_title_ping" ++msgstr "%H: ICMP oda-vissza idÅ‘" ++ ++#. ms ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:9 ++msgid "stat_dg_label_ping" ++msgstr "ms" ++ ++#. %di ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:10 ++msgid "stat_ds_ping" ++msgstr "%di" ++ ++#. %H: Firewall - Processed Packets ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:11 ++msgid "stat_dg_title_iptables__ipt_packets" ++msgstr "%H: Tűzfal - feldolgozott csomagok" ++ ++#. Packets/s ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:12 ++msgid "stat_dg_label_iptables__ipt_packets" ++msgstr "csomag/másodperc" ++ ++#. Chain \"%di\" ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:13 ++msgid "stat_ds_ipt_packets" ++msgstr "Lánc \\\"%di\\\"" ++ ++#. %H: Netlink - Transfer on %pi ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:14 ++msgid "stat_dg_title_netlink__if_octets" ++msgstr "%H: Netlink - %pi forgalma" ++ ++#. Bytes/s ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:15 ++msgid "stat_dg_label_netlink__if_octets" ++msgstr "bájt/másodperc" ++ ++#. Bytes (%ds) ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:16 ++msgid "stat_ds_if_octets" ++msgstr "bájtok (%ds)" ++ ++#. %H: Netlink - Packets on %pi ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:17 ++msgid "stat_dg_title_netlink__if_packets" ++msgstr "%H: Netlink - %pi csomagjai" ++ ++#. Packets/s ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:18 ++msgid "stat_dg_label_netlink__if_packets" ++msgstr "csomag/másodperc" ++ ++#. Processed (%ds) ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:19 ++msgid "stat_ds_if_packets" ++msgstr "feldolgozva (%ds)" ++ ++#. Dropped (%ds) ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:20 ++msgid "stat_ds_if_dropped" ++msgstr "eldobva (%ds)" ++ ++#. Errors (%ds) ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:21 ++msgid "stat_ds_if_errors" ++msgstr "hibák (%ds)" ++ ++#. %H: Netlink - Multicast on %pi ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:22 ++msgid "stat_dg_title_netlink__if_multicast" ++msgstr "%H: Netlink - multicast %pi-n" ++ ++#. Packets/s ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:23 ++msgid "stat_dg_label_netlink__if_multicast" ++msgstr "csomag/másodperc" ++ ++#. Packets ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:24 ++msgid "stat_ds_if_multicast" ++msgstr "csomagok" ++ ++#. %H: Netlink - Collisions on %pi ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:25 ++msgid "stat_dg_title_netlink__if_collisions" ++msgstr "%H: Netlink - ütközések %pi-n" ++ ++#. Collisions/s ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:26 ++msgid "stat_dg_label_netlink__if_collisions" ++msgstr "ütközés/másodperc" ++ ++#. Collisions ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:27 ++msgid "stat_ds_if_collisions" ++msgstr "Ãœtközések" ++ ++#. %H: Netlink - Errors on %pi ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:28 ++msgid "stat_dg_title_netlink__if_tx_errors" ++msgstr "%H: Netlink - hibák %pi-n" ++ ++#. Errors/s ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:29 ++msgid "stat_dg_label_netlink__if_tx_errors" ++msgstr "hiba/másodperc" ++ ++#. %di ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:30 ++msgid "stat_ds_if_tx_errors" ++msgstr "%di" ++ ++#. %di ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:31 ++msgid "stat_ds_if_rx_errors" ++msgstr "%di" ++ ++#. %H: Processes ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:32 ++msgid "stat_dg_title_processes" ++msgstr "%H: Folyamatok" ++ ++#. Processes/s ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:33 ++msgid "stat_dg_label_processes" ++msgstr "folyamat/másodperc" ++ ++#. %di ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:34 ++msgid "stat_ds_ps_state" ++msgstr "%di" ++ ++#. %H: Process %pi - used cpu time ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:35 ++msgid "stat_dg_title_processes__ps_cputime" ++msgstr "%H: Folyamat %pi - processzor idÅ‘" ++ ++#. Jiffies ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:36 ++msgid "stat_dg_label_processes__ps_cputime" ++msgstr "jiffie-k" ++ ++#. system ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:37 ++msgid "stat_ds_ps_cputime__syst" ++msgstr "rendszer" ++ ++#. user ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:38 ++msgid "stat_ds_ps_cputime__user" ++msgstr "felhasználó" ++ ++#. %H: Process %pi - threads and processes ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:39 ++msgid "stat_dg_title_processes__ps_count" ++msgstr "%H: Folyamat %pi - szálak és folyamatok" ++ ++#. Count ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:40 ++msgid "stat_dg_label_processes__ps_count" ++msgstr "darab" ++ ++#. %ds ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:41 ++msgid "stat_ds_ps_count" ++msgstr "%ds" ++ ++#. %H: Process %pi - page faults ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:42 ++msgid "stat_dg_title_processes__ps_pagefaults" ++msgstr "%H: Folyamat %pi - laphibák" ++ ++#. Pagefaults ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:43 ++msgid "stat_dg_label_processes__ps_pagefaults" ++msgstr "Laphibák" ++ ++#. page faults ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:44 ++msgid "stat_ds_ps_pagefaults" ++msgstr "laphibák" ++ ++#. %H: Process %pi - virtual memory size ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:45 ++msgid "stat_dg_title_processes__ps_rss" ++msgstr "%H: Folymat %pi - virtuális memória mérete" ++ ++#. Bytes ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:46 ++msgid "stat_dg_label_processes__ps_rss" ++msgstr "Bájtok" ++ ++#. virtual memory ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:47 ++msgid "stat_ds_ps_rss" ++msgstr "virtuális memória" ++ ++#. %H: Usage on Processor #%pi ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:48 ++msgid "stat_dg_title_cpu" ++msgstr "%H: %pi processzor kihasználtsága" ++ ++#. % ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:49 ++msgid "stat_dg_label_cpu" ++msgstr "%" ++ ++#. %di ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:50 ++msgid "stat_ds_cpu" ++msgstr "%di" ++ ++#. %H: Transfer on %di ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:51 ++msgid "stat_dg_title_interface__if_octets" ++msgstr "%H: %di forgalma" ++ ++#. Bytes/s ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:52 ++msgid "stat_dg_label_interface__if_octets" ++msgstr "bájt/másodperc" ++ ++#. %H: Packets on %di ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:53 ++msgid "stat_dg_title_interface__if_packets" ++msgstr "%H: %di csomagjai" ++ ++#. Packets/s ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:54 ++msgid "stat_dg_label_interface__if_packets" ++msgstr "csomag/másodperc" ++ ++#. %H: TCP-Connections to Port %pi ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:55 ++msgid "stat_dg_title_tcpconns" ++msgstr "%H: TCP kapcsolatok a %pi portra" ++ ++#. Connections/s ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:56 ++msgid "stat_dg_label_tcpconns" ++msgstr "kapcsolat/másodperc" ++ ++#. %di ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:57 ++msgid "stat_ds_tcp_connections" ++msgstr "%di" ++ ++#. %H: Disk Space Usage on %di ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:58 ++msgid "stat_dg_title_df" ++msgstr "%H: lemezterület felhasználás %di-n" ++ ++#. Bytes ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:59 ++msgid "stat_dg_label_df" ++msgstr "bájt" ++ ++#. %ds ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:60 ++msgid "stat_ds_df__free" ++msgstr "%ds" ++ ++#. %ds ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:61 ++msgid "stat_ds_df__used" ++msgstr "%ds" ++ ++#. %H: Interrupts ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:62 ++msgid "stat_dg_title_irq" ++msgstr "%H: megszakítások" ++ ++#. Issues/s ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:63 ++msgid "stat_dg_label_irq" ++msgstr "darab/másodperc" ++ ++#. IRQ %di ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:64 ++msgid "stat_ds_irq" ++msgstr "IRQ %di" ++ ++#. %H: System Load ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:65 ++msgid "stat_dg_title_load" ++msgstr "%H: Rendszer terhelés" ++ ++#. Load ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:66 ++msgid "stat_dg_label_load" ++msgstr "Terhelés" ++ ++#. 1 min ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:67 ++msgid "stat_ds_load__shortterm" ++msgstr "1 perc" ++ ++#. 5 min ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:68 ++msgid "stat_ds_load__midterm" ++msgstr "5 perc" ++ ++#. 15 min ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:69 ++msgid "stat_ds_load__longterm" ++msgstr "15 perc" +diff --git a/feeds/luci/applications/luci-app-statistics/po/hu/statistics.po b/feeds/luci/applications/luci-app-statistics/po/hu/statistics.po +new file mode 100644 +index 0000000..b91db79 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-statistics/po/hu/statistics.po +@@ -0,0 +1,713 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"PO-Revision-Date: 2014-01-31 18:58+0200\n" ++"Last-Translator: Sixtus \n" ++"Language-Team: none\n" ++"Language: hu\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n != 1);\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "Action (target)" ++msgstr "Tevékenység (cél)" ++ ++msgid "Add command for reading values" ++msgstr "Érték olvasására szolgáló parancs hozzáadása" ++ ++msgid "Add matching rule" ++msgstr "Szabály hozzáadása" ++ ++msgid "Add multiple hosts separated by space." ++msgstr "" ++ ++msgid "Add notification command" ++msgstr "Értesítési parancs hozzáadása" ++ ++msgid "Base Directory" ++msgstr "Alapkönyvtár" ++ ++msgid "Basic monitoring" ++msgstr "Ãltalános figyelés" ++ ++msgid "CPU Plugin Configuration" ++msgstr "CPU bÅ‘vítmény beállítása" ++ ++msgid "CSV Output" ++msgstr "CSV kimenet" ++ ++msgid "CSV Plugin Configuration" ++msgstr "CSV bÅ‘vítmény konfigurálása" ++ ++msgid "Cache collected data for" ++msgstr "" ++ ++msgid "Cache flush interval" ++msgstr "Gyorsítótár ürítési idÅ‘köz" ++ ++msgid "Chain" ++msgstr "Lánc" ++ ++msgid "CollectLinks" ++msgstr "" ++ ++msgid "CollectRoutes" ++msgstr "" ++ ++msgid "CollectTopology" ++msgstr "" ++ ++msgid "Collectd" ++msgstr "Collectd" ++ ++msgid "Collectd Settings" ++msgstr "Collectd beállítások" ++ ++msgid "" ++"Collectd is a small daemon for collecting data from various sources through " ++"different plugins. On this page you can change general settings for the " ++"collectd daemon." ++msgstr "" ++"A collectd változatos forrásokból különféle bÅ‘vítményeken keresztül történÅ‘ " ++"adatgyűjtésre szolgáló kisméretű démon. Ezen az oldalon módosíthatja a " ++"collectd démon általános beállításait." ++ ++msgid "Conntrack" ++msgstr "Conntrack" ++ ++msgid "Conntrack Plugin Configuration" ++msgstr "Conntrack bÅ‘vítmény beállítása" ++ ++msgid "DF Plugin Configuration" ++msgstr "DF bÅ‘vítmény beállítása" ++ ++msgid "DNS" ++msgstr "DNS" ++ ++msgid "DNS Plugin Configuration" ++msgstr "DNS bÅ‘vítmény beállítása" ++ ++msgid "Data collection interval" ++msgstr "Adatgyűjtési idÅ‘szak" ++ ++msgid "Datasets definition file" ++msgstr "Adatkészlet leíró fálj" ++ ++msgid "Destination ip range" ++msgstr "Cél IP tartomány" ++ ++msgid "Directory for collectd plugins" ++msgstr "Öszegyűjtött plug-in-ek könyvtára" ++ ++msgid "Directory for sub-configurations" ++msgstr "Al-beállítások könyvtára" ++ ++msgid "Disk Plugin Configuration" ++msgstr "Lemez bÅ‘vítmény beállítása" ++ ++msgid "Disk Space Usage" ++msgstr "Felhasznált lemezterület" ++ ++msgid "Disk Usage" ++msgstr "Lemezhasználat" ++ ++msgid "Display Host »" ++msgstr "Host mutatása »" ++ ++msgid "Display timespan »" ++msgstr "IdÅ‘szak megjelenítése »" ++ ++msgid "E-Mail Plugin Configuration" ++msgstr "E-Mail bÅ‘vítmény beállítása" ++ ++msgid "Email" ++msgstr "E-mail" ++ ++msgid "Enable this plugin" ++msgstr "BÅ‘vítmény engedélyezése" ++ ++msgid "Exec" ++msgstr "Exec" ++ ++msgid "Exec Plugin Configuration" ++msgstr "Exec bÅ‘vítmény beállítása" ++ ++msgid "Filter class monitoring" ++msgstr "SzűrÅ‘ osztály figyelése" ++ ++msgid "Firewall" ++msgstr "Tűzfal" ++ ++msgid "Flush cache after" ++msgstr "Gyorsítótár ürítése ezután:" ++ ++msgid "Forwarding between listen and server addresses" ++msgstr "" ++ ++msgid "Graphs" ++msgstr "Grafikonok" ++ ++msgid "Group" ++msgstr "Csoport" ++ ++msgid "" ++"Here you can define external commands which will be started by collectd in " ++"order to read certain values. The values will be read from stdout." ++msgstr "" ++"Itt megadhatók külsÅ‘ parancsok amelyek a collectd által lesznek futtatva " ++"bizonyos értékeke beolvasására. Az értékek a szabványos kimenetrÅ‘l lesznek " ++"beolvasva." ++ ++msgid "" ++"Here you can define external commands which will be started by collectd when " ++"certain threshold values have been reached. The values leading to invokation " ++"will be feeded to the the called programs stdin." ++msgstr "" ++"Itt megadhatók külsÅ‘ parancsok amelyek a collectd által lesznek futtatva " ++"amikor bizonyos küszbértékek elérésre kerülnek. A hívást kiváltó értékek a " ++"meghívott programok szabványos bemenetére lesznek küldve." ++ ++msgid "" ++"Here you can define various criteria by which the monitored iptables rules " ++"are selected." ++msgstr "" ++"Itt addhatók meg különbözÅ‘ feltételek, amelyek alapján a megfigyelt iptables " ++"szabályok kiválasztásra kerülnek." ++ ++msgid "Host" ++msgstr "Gép" ++ ++msgid "Hostname" ++msgstr "Gépnév" ++ ++msgid "IP or hostname where to get the txtinfo output from" ++msgstr "" ++"Annak a gépnek a neve vagy IP címe ahonnan a txtinfo kimenete származik" ++ ++msgid "IRQ Plugin Configuration" ++msgstr "IRQ bÅ‘vítmény beállítása" ++ ++msgid "Ignore source addresses" ++msgstr "Forrás címek figyelmen kívül hagyása" ++ ++msgid "Incoming interface" ++msgstr "BejövÅ‘ interfész" ++ ++msgid "Interface Plugin Configuration" ++msgstr "Interfész bÅ‘vítmény beállítása" ++ ++msgid "Interfaces" ++msgstr "Interfészek" ++ ++msgid "Interrupts" ++msgstr "Megszakítások" ++ ++msgid "Interval for pings" ++msgstr "Ping-ek közötti idÅ‘" ++ ++msgid "Iptables Plugin Configuration" ++msgstr "Iptables bÅ‘vítmény beállítása" ++ ++msgid "Leave unselected to automatically determine interfaces to monitor." ++msgstr "" ++"Bejelölés nélkül a figyelendÅ‘ iterfészek automatikusan kerülnek " ++"kiválasztásra." ++ ++msgid "Listen host" ++msgstr "" ++ ++msgid "Listen port" ++msgstr "" ++ ++msgid "Listener interfaces" ++msgstr "" ++ ++msgid "Load Plugin Configuration" ++msgstr "Terhelés bÅ‘vítmény beállítása" ++ ++msgid "Maximum allowed connections" ++msgstr "Megengedett kapcsolatok maximális száma" ++ ++msgid "Memory" ++msgstr "Memória" ++ ++msgid "Memory Plugin Configuration" ++msgstr "Memória bÅ‘vítmény beállítása" ++ ++msgid "Monitor all except specified" ++msgstr "" ++ ++msgid "Monitor all local listen ports" ++msgstr "" ++ ++msgid "Monitor devices" ++msgstr "Eszközök figyelése" ++ ++msgid "Monitor disks and partitions" ++msgstr "Lemezek és partíciók figyelése" ++ ++msgid "Monitor filesystem types" ++msgstr "Fájlrendszer típusok figyelése" ++ ++msgid "Monitor hosts" ++msgstr "Gépek figyelése" ++ ++msgid "Monitor interfaces" ++msgstr "Interfészek figyelése" ++ ++msgid "Monitor interrupts" ++msgstr "Megszakítások figyelése" ++ ++msgid "Monitor local ports" ++msgstr "Helyi portok figyelése" ++ ++msgid "Monitor mount points" ++msgstr "Csatolási pontok figyelése" ++ ++msgid "Monitor processes" ++msgstr "Folyamatok figyelése" ++ ++msgid "Monitor remote ports" ++msgstr "Távoli portok figyelése" ++ ++msgid "Name of the rule" ++msgstr "A szabály neve" ++ ++msgid "Netlink" ++msgstr "Netlink" ++ ++msgid "Netlink Plugin Configuration" ++msgstr "Netlink bÅ‘vítmény beállítása" ++ ++msgid "Network" ++msgstr "Hálózat" ++ ++msgid "Network Plugin Configuration" ++msgstr "Hálózat bÅ‘vítmény beállítása" ++ ++msgid "Network plugins" ++msgstr "Hálózati bÅ‘vítmények" ++ ++msgid "Network protocol" ++msgstr "Hálózati protokoll" ++ ++msgid "Number of threads for data collection" ++msgstr "Az adatgyűjtÅ‘ szálak száma" ++ ++msgid "OLSRd" ++msgstr "OLSRd" ++ ++msgid "OLSRd Plugin Configuration" ++msgstr "OLSRd bÅ‘vítmény beállítása" ++ ++msgid "Only create average RRAs" ++msgstr "Csak átlag RRA-k létrehozása" ++ ++msgid "Options" ++msgstr "LehetÅ‘ségek" ++ ++msgid "Outgoing interface" ++msgstr "KimenÅ‘ interfész" ++ ++msgid "Output plugins" ++msgstr "Kimeneti bÅ‘vítmények" ++ ++msgid "Ping" ++msgstr "Ping" ++ ++msgid "Ping Plugin Configuration" ++msgstr "Ping bÅ‘vítmény beállítása" ++ ++msgid "Port" ++msgstr "Port" ++ ++msgid "Processes" ++msgstr "Folyamatok" ++ ++msgid "Processes Plugin Configuration" ++msgstr "Folyamatok bÅ‘vítmény beállítása" ++ ++msgid "Processes to monitor separated by space" ++msgstr "FigyelendÅ‘ folyamatok szóközzel elválasztva" ++ ++msgid "Processor" ++msgstr "Processzor" ++ ++msgid "Qdisc monitoring" ++msgstr "Qdisc figyelés" ++ ++msgid "RRD XFiles Factor" ++msgstr "" ++ ++msgid "RRD heart beat interval" ++msgstr "" ++ ++msgid "RRD step interval" ++msgstr "" ++ ++msgid "RRDTool" ++msgstr "RRDTool" ++ ++msgid "RRDTool Plugin Configuration" ++msgstr "RRDTool bÅ‘vítmény beállítása" ++ ++msgid "Rows per RRA" ++msgstr "" ++ ++msgid "Script" ++msgstr "Parancsfájl" ++ ++msgid "Seconds" ++msgstr "másodperc" ++ ++msgid "Server host" ++msgstr "Kiszolgáló gép" ++ ++msgid "Server port" ++msgstr "Kiszolgáló port" ++ ++msgid "Shaping class monitoring" ++msgstr "" ++ ++msgid "Socket file" ++msgstr "Socket fájlok" ++ ++msgid "Socket group" ++msgstr "Socket csoport" ++ ++msgid "Socket permissions" ++msgstr "Socket jogosultságok" ++ ++msgid "Source ip range" ++msgstr "Forrás IP tartomány" ++ ++msgid "Specifies what information to collect about links." ++msgstr "" ++"Azt határozza meg, hogy az kapcsolatokról milyen információkat kell gyűjteni." ++ ++msgid "Specifies what information to collect about routes." ++msgstr "" ++"Azt határozza meg, hogy az útvonalakról milyen információkat kell gyűjteni." ++ ++msgid "Specifies what information to collect about the global topology." ++msgstr "" ++"Azt határozza meg, hogy a globális topológiáról milyen információkat kell " ++"gyűjteni." ++ ++msgid "Splash Leases" ++msgstr "" ++ ++msgid "Splash Leases Plugin Configuration" ++msgstr "" ++ ++msgid "Statistics" ++msgstr "Statisztikák" ++ ++msgid "Storage directory" ++msgstr "Tárolási könyvtár" ++ ++msgid "Storage directory for the csv files" ++msgstr "A csv fájlok tárolási könyvtára" ++ ++msgid "Store data values as rates instead of absolute values" ++msgstr "Az adatok arányként történÅ‘ tárolása abszolút értékek helyett" ++ ++msgid "Stored timespans" ++msgstr "Tárolt idÅ‘szakok" ++ ++msgid "System Load" ++msgstr "Rendszerterhelés" ++ ++msgid "System plugins" ++msgstr "Rendszer bÅ‘vítmények" ++ ++msgid "TCP Connections" ++msgstr "TCP kapcsolatok" ++ ++msgid "TCPConns Plugin Configuration" ++msgstr "TCPConns bÅ‘vítény beállítása" ++ ++msgid "TTL for network packets" ++msgstr "TTL a hálózati csomagokhoz" ++ ++msgid "TTL for ping packets" ++msgstr "TTL a ping csomagokhoz" ++ ++msgid "Table" ++msgstr "Táblázat" ++ ++msgid "The NUT plugin reads information about Uninterruptible Power Supplies." ++msgstr "A NUT bÅ‘vítmény a szünetmentes tápokról ad információkat." ++ ++msgid "" ++"The OLSRd plugin reads information about meshed networks from the txtinfo " ++"plugin of OLSRd." ++msgstr "" ++"Az OLSRd bÅ‘vítmény a összekapcsolt hálózatokról olvas információkat az OLSRd " ++"txttinfo bÅ‘vítményén keresztül." ++ ++msgid "" ++"The conntrack plugin collects statistics about the number of tracked " ++"connections." ++msgstr "" ++"A conntrack bÅ‘vítmény a nyomon követett kapcsolatok számáról gyűjt " ++"statisztikákat." ++ ++msgid "The cpu plugin collects basic statistics about the processor usage." ++msgstr "" ++"A processzor bÅ‘vítmény a processzorhasználatról gyűjt alapvetÅ‘ " ++"statisztikákat." ++ ++msgid "" ++"The csv plugin stores collected data in csv file format for further " ++"processing by external programs." ++msgstr "" ++"A csv bÅ‘vítmény segítségével az összegyűjtött adatok csv formátumú fájlba " ++"menthetÅ‘k külsÅ‘ programmal történÅ‘ további feldolgozás céljára." ++ ++msgid "" ++"The df plugin collects statistics about the disk space usage on different " ++"devices, mount points or filesystem types." ++msgstr "" ++"A df bÅ‘vítmény a lemezterület használatáról gyűjt statisztikákat különbözÅ‘ " ++"eszközökön, csatolási pontokon vagy fájlrendszereken." ++ ++msgid "" ++"The disk plugin collects detailled usage statistics for selected partitions " ++"or whole disks." ++msgstr "" ++"A lemez bÅ‘vítmény részletes használati statisztikákat készít a kiválasztott " ++"paticiókhoz vagy teljes lemezekhez." ++ ++msgid "" ++"The dns plugin collects detailled statistics about dns related traffic on " ++"selected interfaces." ++msgstr "" ++"A DNS bÅ‘vítmény részletes adatokat gyűjt a kiválasztott interfészek DNS-hez " ++"tartozó forgalmáról." ++ ++msgid "" ++"The email plugin creates a unix socket which can be used to transmit email-" ++"statistics to a running collectd daemon. This plugin is primarily intended " ++"to be used in conjunction with Mail::SpamAssasin::Plugin::Collectd but can " ++"be used in other ways as well." ++msgstr "" ++"Az email bÅ‘vítmény egy unix socket-et hoz létre amely lehetÅ‘vé teszi email-" ++"statisztikáknak a továbbítását egy futó collect démonhoz. A bÅ‘vítmény " ++"elsÅ‘sorban a Mail::SpamAssasin::Plugin::Collectd bÅ‘vítménnyel együtt történÅ‘ " ++"használatra szolgál, de egyéb módokon is használható." ++ ++msgid "" ++"The exec plugin starts external commands to read values from or to notify " ++"external processes when certain threshold values have been reached." ++msgstr "" ++"Az exec bÅ‘vítmény külsÅ‘ parancsokat indít értékek olvasására vagy külsÅ‘ " ++"folyamatok értesítésére bizonyos küszöbértékek elérése esetén." ++ ++msgid "" ++"The interface plugin collects traffic statistics on selected interfaces." ++msgstr "" ++"Az interface bÅ‘vítmény forgalmi statisztikákat gyűjt a kiválasztott " ++"interfészekrÅ‘l." ++ ++msgid "" ++"The iptables plugin will monitor selected firewall rules and collect " ++"informations about processed bytes and packets per rule." ++msgstr "" ++"Az iptables bÅ‘vítmény kiválasztott tűzfal szabályok alapján információt " ++"gyűjt a szabályonként feldolgozott bájtokról és csomagokról." ++ ++msgid "" ++"The irq plugin will monitor the rate of issues per second for each selected " ++"interrupt. If no interrupt is selected then all interrupts are monitored." ++msgstr "" ++ ++msgid "" ++"The iwinfo plugin collects statistics about wireless signal strength, noise " ++"and quality." ++msgstr "" ++ ++msgid "The load plugin collects statistics about the general system load." ++msgstr "" ++"A load bÅ‘vítmény az általános rendszzer terhelésrÅ‘l gyűjt statisztikákat." ++ ++msgid "The memory plugin collects statistics about the memory usage." ++msgstr "A memória bÅ‘vítmény a memórahasználatról gyűjt információkat." ++ ++msgid "" ++"The netlink plugin collects extended informations like qdisc-, class- and " ++"filter-statistics for selected interfaces." ++msgstr "" ++ ++msgid "" ++"The network plugin provides network based communication between different " ++"collectd instances. Collectd can operate both in client and server mode. In " ++"client mode locally collected data is transferred to a collectd server " ++"instance, in server mode the local instance receives data from other hosts." ++msgstr "" ++ ++msgid "" ++"The ping plugin will send icmp echo replies to selected hosts and measure " ++"the roundtrip time for each host." ++msgstr "" ++"A ping bÅ‘vítmény ICMP echo kéréseket küld a kiválasztott gépekre és méri az " ++"oda-vissza eltelt idÅ‘t minden gép esetében." ++ ++msgid "" ++"The processes plugin collects informations like cpu time, page faults and " ++"memory usage of selected processes." ++msgstr "" ++ ++msgid "" ++"The rrdtool plugin stores the collected data in rrd database files, the " ++"foundation of the diagrams.

    Warning: Setting the wrong " ++"values will result in a very high memory consumption in the temporary " ++"directory. This can render the device unusable!" ++msgstr "" ++ ++msgid "" ++"The splash leases plugin uses libuci to collect statistics about splash " ++"leases." ++msgstr "" ++ ++msgid "" ++"The statistics package is based on Collectd and uses RRD " ++"Tool to render diagram images from collected data." ++msgstr "" ++"A statisztikai csomag a collectd segédprogramon alapul és az RRD Tool segédprogramot használja a grafikonok elkészítésére " ++"az összegyűjtött adatokból." ++ ++msgid "" ++"The tcpconns plugin collects informations about open tcp connections on " ++"selected ports." ++msgstr "" ++"A tcpconns bővítmény a kiválasztott portokon lévő TCP kapcsolatokról gyűjt " ++"információkat." ++ ++msgid "" ++"The unixsock plugin creates a unix socket which can be used to read " ++"collected data from a running collectd instance." ++msgstr "" ++"A unixsock bővítmény létrehoz egy unix socket-et melyen keresztül " ++"kiolvashatók az összegyűjtött adatok egy futó collectd-ből. " ++ ++msgid "The uptime plugin collects statistics about the uptime of the system." ++msgstr "" ++ ++msgid "" ++"This section defines on which interfaces collectd will wait for incoming " ++"connections." ++msgstr "" ++ ++msgid "" ++"This section defines to which servers the locally collected data is sent to." ++msgstr "" ++"Ez a szakasz határozza meg, hogy a helyileg összegyűjtött adatokat melyik " ++"kiszolgálókra kell továbbítani." ++ ++msgid "Try to lookup fully qualified hostname" ++msgstr "" ++ ++msgid "UPS" ++msgstr "" ++ ++msgid "UPS Plugin Configuration" ++msgstr "" ++ ++msgid "UPS name in NUT ups@host format" ++msgstr "" ++ ++msgid "UnixSock" ++msgstr "UnixSock" ++ ++msgid "Unixsock Plugin Configuration" ++msgstr "UnixSock bővítmény beállítása" ++ ++msgid "Uptime" ++msgstr "" ++ ++msgid "Uptime Plugin Configuration" ++msgstr "" ++ ++msgid "Used PID file" ++msgstr "Használt PID fájl" ++ ++msgid "User" ++msgstr "Felhasználó" ++ ++msgid "Verbose monitoring" ++msgstr "" ++ ++msgid "Wireless" ++msgstr "Vezeték nélküli" ++ ++msgid "Wireless iwinfo Plugin Configuration" ++msgstr "iwinfo vezeték nélküli bővítmény beállítása" ++ ++msgid "e.g. br-ff" ++msgstr "pl. br-ff" ++ ++msgid "e.g. br-lan" ++msgstr "pl. br-lan" ++ ++msgid "e.g. reject-with tcp-reset" ++msgstr "pl. reject-with tcp-reset" ++ ++msgid "max. 16 chars" ++msgstr "max. 16 karakter" ++ ++msgid "reduces rrd size" ++msgstr "csökkenti az rrd adatbázis méretét" ++ ++msgid "seconds; multiple separated by space" ++msgstr "másodpercek; több szóközzel elválasztott érték is megadható" ++ ++msgid "server interfaces" ++msgstr "kiszolgáló interfész" ++ ++#~ msgid "Installed network plugins:" ++#~ msgstr "Telepített hálózati bővítmények:" ++ ++#~ msgid "Installed output plugins:" ++#~ msgstr "Telepített kimeneti bővítmények:" ++ ++#~ msgid "" ++#~ "Network plugins are used to collect information about open tcp " ++#~ "connections, interface traffic, iptables rules etc." ++#~ msgstr "" ++#~ "A hálózati bővítmények nyitott TCP kapcsolatok, interfész forgalom, " ++#~ "iptables szabályok és ehhez hasonló információk gyűjtésére használhatók." ++ ++#~ msgid "" ++#~ "Output plugins provide different possibilities to store collected data. " ++#~ "It is possible to enable multiple plugin at one, for example to store " ++#~ "collected data in rrd databases and to transmit the data over the network " ++#~ "to other collectd instances." ++#~ msgstr "" ++#~ "A kimeneti bővítmények különféle lehetőségeket biztosítanak az " ++#~ "összegyűjtött adatok tárolásához. Lehetőség van többféle bővítmény " ++#~ "egyidejű engedélyezésére, például az összegyűjtött adatok RRD " ++#~ "adatbázisban történő tárolására és egyidejűleg hálózaton keresztül másik " ++#~ "collectd példányhoz való továbbítására." ++ ++#~ msgid "" ++#~ "System plugins collecting values about system state and ressource usage " ++#~ "on the device.:" ++#~ msgstr "" ++#~ "A rendszer bővítmények a rendszer állapotáról és az erőforrások " ++#~ "használatáról gyűjtenek adatokat az eszközön." ++ ++#~ msgid "" ++#~ "The wireless plugin collects statistics about wireless signal strength, " ++#~ "noise and quality." ++#~ msgstr "" ++#~ "A vezetéknélküli bővítmény vezetéknélküli jelerősségről, zajról és " ++#~ "minőségről gyűjt információkat." ++ ++#~ msgid "Wireless Plugin Configuration" ++#~ msgstr "Vezetéknélküli bővítmény beállítása" +diff --git a/feeds/luci/applications/luci-app-statistics/po/it/rrdtool.po b/feeds/luci/applications/luci-app-statistics/po/it/rrdtool.po +new file mode 100644 +index 0000000..8ae4472 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-statistics/po/it/rrdtool.po +@@ -0,0 +1,359 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Report-Msgid-Bugs-To: \n" ++"POT-Creation-Date: 2009-05-19 19:36+0200\n" ++"PO-Revision-Date: 2013-02-03 14:50+0200\n" ++"Last-Translator: Francesco <3gasas@gmail.com>\n" ++"Language-Team: LANGUAGE \n" ++"Language: it\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n != 1);\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++#. %H: Wireless - Signal Noise Ratio ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:1 ++msgid "stat_dg_title_wireless__signal_noise" ++msgstr "stat_dg_title_wireless__signal_noise" ++ ++#. dBm ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:2 ++msgid "stat_dg_label_wireless__signal_noise" ++msgstr "stat_dg_label_wireless__signal_noise" ++ ++#. Noise Level ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:3 ++msgid "stat_ds_signal_noise" ++msgstr "stat_ds_signal_noise" ++ ++#. Signal Strength ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:4 ++msgid "stat_ds_signal_power" ++msgstr "stat_ds_signal_power" ++ ++#. %H: Wireless - Signal Quality ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:5 ++msgid "stat_dg_title_wireless__signal_quality" ++msgstr "stat_dg_title_wireless__signal_quality" ++ ++#. n ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:6 ++msgid "stat_dg_label_wireless__signal_quality" ++msgstr "stat_dg_label_wireless__signal_quality" ++ ++#. Signal Quality ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:7 ++msgid "stat_ds_signal_quality" ++msgstr "stat_ds_signal_quality" ++ ++#. %H: ICMP Roundtrip Times ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:8 ++msgid "stat_dg_title_ping" ++msgstr "stat_dg_title_ping" ++ ++#. ms ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:9 ++msgid "stat_dg_label_ping" ++msgstr "stat_dg_label_ping" ++ ++#. %di ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:10 ++msgid "stat_ds_ping" ++msgstr "stat_ds_ping" ++ ++#. %H: Firewall - Processed Packets ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:11 ++msgid "stat_dg_title_iptables__ipt_packets" ++msgstr "stat_dg_title_iptables__ipt_packets" ++ ++#. Packets/s ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:12 ++msgid "stat_dg_label_iptables__ipt_packets" ++msgstr "stat_dg_label_iptables__ipt_packets" ++ ++#. Chain \"%di\" ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:13 ++msgid "stat_ds_ipt_packets" ++msgstr "stat_ds_ipt_packets" ++ ++#. %H: Netlink - Transfer on %pi ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:14 ++msgid "stat_dg_title_netlink__if_octets" ++msgstr "stat_dg_title_netlink__if_octets" ++ ++#. Bytes/s ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:15 ++msgid "stat_dg_label_netlink__if_octets" ++msgstr "stat_dg_label_netlink__if_octets" ++ ++#. Bytes (%ds) ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:16 ++msgid "stat_ds_if_octets" ++msgstr "stat_ds_if_octets" ++ ++#. %H: Netlink - Packets on %pi ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:17 ++msgid "stat_dg_title_netlink__if_packets" ++msgstr "stat_dg_title_netlink__if_packets" ++ ++#. Packets/s ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:18 ++msgid "stat_dg_label_netlink__if_packets" ++msgstr "stat_dg_label_netlink__if_packets" ++ ++#. Processed (%ds) ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:19 ++msgid "stat_ds_if_packets" ++msgstr "stat_ds_if_packets" ++ ++#. Dropped (%ds) ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:20 ++msgid "stat_ds_if_dropped" ++msgstr "stat_ds_if_dropped" ++ ++#. Errors (%ds) ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:21 ++msgid "stat_ds_if_errors" ++msgstr "stat_ds_if_errors" ++ ++#. %H: Netlink - Multicast on %pi ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:22 ++msgid "stat_dg_title_netlink__if_multicast" ++msgstr "stat_dg_title_netlink__if_multicast" ++ ++#. Packets/s ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:23 ++msgid "stat_dg_label_netlink__if_multicast" ++msgstr "stat_dg_label_netlink__if_multicast" ++ ++#. Packets ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:24 ++msgid "stat_ds_if_multicast" ++msgstr "stat_ds_if_multicast" ++ ++#. %H: Netlink - Collisions on %pi ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:25 ++msgid "stat_dg_title_netlink__if_collisions" ++msgstr "stat_dg_title_netlink__if_collisions" ++ ++#. Collisions/s ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:26 ++msgid "stat_dg_label_netlink__if_collisions" ++msgstr "stat_dg_label_netlink__if_collisions" ++ ++#. Collisions ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:27 ++msgid "stat_ds_if_collisions" ++msgstr "stat_ds_if_collisions" ++ ++#. %H: Netlink - Errors on %pi ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:28 ++msgid "stat_dg_title_netlink__if_tx_errors" ++msgstr "stat_dg_title_netlink__if_tx_errors" ++ ++#. Errors/s ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:29 ++msgid "stat_dg_label_netlink__if_tx_errors" ++msgstr "stat_dg_label_netlink__if_tx_errors" ++ ++#. %di ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:30 ++msgid "stat_ds_if_tx_errors" ++msgstr "stat_ds_if_tx_errors" ++ ++#. %di ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:31 ++msgid "stat_ds_if_rx_errors" ++msgstr "stat_ds_if_rx_errors" ++ ++#. %H: Processes ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:32 ++msgid "stat_dg_title_processes" ++msgstr "stat_dg_title_processes" ++ ++#. Processes/s ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:33 ++msgid "stat_dg_label_processes" ++msgstr "stat_dg_label_processes" ++ ++#. %di ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:34 ++msgid "stat_ds_ps_state" ++msgstr "stat_ds_ps_state" ++ ++#. %H: Process %pi - used cpu time ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:35 ++msgid "stat_dg_title_processes__ps_cputime" ++msgstr "stat_dg_title_processes__ps_cputime" ++ ++#. Jiffies ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:36 ++msgid "stat_dg_label_processes__ps_cputime" ++msgstr "stat_dg_label_processes__ps_cputime" ++ ++#. system ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:37 ++msgid "stat_ds_ps_cputime__syst" ++msgstr "stat_ds_ps_cputime__syst" ++ ++#. user ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:38 ++msgid "stat_ds_ps_cputime__user" ++msgstr "stat_ds_ps_cputime__user" ++ ++#. %H: Process %pi - threads and processes ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:39 ++msgid "stat_dg_title_processes__ps_count" ++msgstr "stat_dg_title_processes__ps_count" ++ ++#. Count ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:40 ++msgid "stat_dg_label_processes__ps_count" ++msgstr "stat_dg_label_processes__ps_count" ++ ++#. %ds ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:41 ++msgid "stat_ds_ps_count" ++msgstr "stat_ds_ps_count" ++ ++#. %H: Process %pi - page faults ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:42 ++msgid "stat_dg_title_processes__ps_pagefaults" ++msgstr "stat_dg_title_processes__ps_pagefaults" ++ ++#. Pagefaults ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:43 ++msgid "stat_dg_label_processes__ps_pagefaults" ++msgstr "stat_dg_label_processes__ps_pagefaults" ++ ++#. page faults ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:44 ++msgid "stat_ds_ps_pagefaults" ++msgstr "stat_ds_ps_pagefaults" ++ ++#. %H: Process %pi - virtual memory size ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:45 ++msgid "stat_dg_title_processes__ps_rss" ++msgstr "stat_dg_title_processes__ps_rss" ++ ++#. Bytes ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:46 ++msgid "stat_dg_label_processes__ps_rss" ++msgstr "stat_dg_label_processes__ps_rss" ++ ++#. virtual memory ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:47 ++msgid "stat_ds_ps_rss" ++msgstr "stat_ds_ps_rss" ++ ++#. %H: Usage on Processor #%pi ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:48 ++msgid "stat_dg_title_cpu" ++msgstr "stat_dg_title_cpu" ++ ++#. % ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:49 ++msgid "stat_dg_label_cpu" ++msgstr "stat_dg_label_cpu" ++ ++#. %di ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:50 ++msgid "stat_ds_cpu" ++msgstr "stat_ds_cpu" ++ ++#. %H: Transfer on %di ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:51 ++msgid "stat_dg_title_interface__if_octets" ++msgstr "stat_dg_title_interface__if_octets" ++ ++#. Bytes/s ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:52 ++msgid "stat_dg_label_interface__if_octets" ++msgstr "stat_dg_label_interface__if_octets" ++ ++#. %H: Packets on %di ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:53 ++msgid "stat_dg_title_interface__if_packets" ++msgstr "stat_dg_title_interface__if_packets" ++ ++#. Packets/s ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:54 ++msgid "stat_dg_label_interface__if_packets" ++msgstr "stat_dg_label_interface__if_packets" ++ ++#. %H: TCP-Connections to Port %pi ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:55 ++msgid "stat_dg_title_tcpconns" ++msgstr "stat_dg_title_tcpconns" ++ ++#. Connections/s ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:56 ++msgid "stat_dg_label_tcpconns" ++msgstr "stat_dg_label_tcpconns" ++ ++#. %di ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:57 ++msgid "stat_ds_tcp_connections" ++msgstr "stat_ds_tcp_connections" ++ ++#. %H: Disk Space Usage on %di ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:58 ++msgid "stat_dg_title_df" ++msgstr "stat_dg_title_df" ++ ++#. Bytes ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:59 ++msgid "stat_dg_label_df" ++msgstr "stat_dg_label_df" ++ ++#. %ds ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:60 ++msgid "stat_ds_df__free" ++msgstr "stat_ds_df__free" ++ ++#. %ds ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:61 ++msgid "stat_ds_df__used" ++msgstr "stat_ds_df__used" ++ ++#. %H: Interrupts ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:62 ++msgid "stat_dg_title_irq" ++msgstr "stat_dg_title_irq" ++ ++#. Issues/s ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:63 ++msgid "stat_dg_label_irq" ++msgstr "stat_dg_label_irq" ++ ++#. IRQ %di ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:64 ++msgid "stat_ds_irq" ++msgstr "stat_ds_irq" ++ ++#. %H: System Load ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:65 ++msgid "stat_dg_title_load" ++msgstr "stat_dg_title_load" ++ ++#. Load ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:66 ++msgid "stat_dg_label_load" ++msgstr "stat_dg_label_load" ++ ++#. 1 min ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:67 ++msgid "stat_ds_load__shortterm" ++msgstr "stat_ds_load__shortterm" ++ ++#. 5 min ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:68 ++msgid "stat_ds_load__midterm" ++msgstr "stat_ds_load__midterm" ++ ++#. 15 min ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:69 ++msgid "stat_ds_load__longterm" ++msgstr "stat_ds_load__longterm" +diff --git a/feeds/luci/applications/luci-app-statistics/po/it/statistics.po b/feeds/luci/applications/luci-app-statistics/po/it/statistics.po +new file mode 100644 +index 0000000..d101536 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-statistics/po/it/statistics.po +@@ -0,0 +1,628 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Report-Msgid-Bugs-To: \n" ++"POT-Creation-Date: 2009-05-19 19:36+0200\n" ++"PO-Revision-Date: 2014-08-05 11:41+0200\n" ++"Last-Translator: morganfw \n" ++"Language-Team: LANGUAGE \n" ++"Language: it\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n != 1);\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "Action (target)" ++msgstr "Azione (destinazione)" ++ ++msgid "Add command for reading values" ++msgstr "" ++ ++msgid "Add matching rule" ++msgstr "" ++ ++msgid "Add multiple hosts separated by space." ++msgstr "" ++ ++msgid "Add notification command" ++msgstr "" ++ ++msgid "Base Directory" ++msgstr "" ++ ++msgid "Basic monitoring" ++msgstr "" ++ ++msgid "CPU Plugin Configuration" ++msgstr "" ++ ++msgid "CSV Output" ++msgstr "" ++ ++msgid "CSV Plugin Configuration" ++msgstr "" ++ ++msgid "Cache collected data for" ++msgstr "" ++ ++msgid "Cache flush interval" ++msgstr "" ++ ++msgid "Chain" ++msgstr "" ++ ++msgid "CollectLinks" ++msgstr "" ++ ++msgid "CollectRoutes" ++msgstr "" ++ ++msgid "CollectTopology" ++msgstr "" ++ ++msgid "Collectd" ++msgstr "" ++ ++msgid "Collectd Settings" ++msgstr "" ++ ++msgid "" ++"Collectd is a small daemon for collecting data from various sources through " ++"different plugins. On this page you can change general settings for the " ++"collectd daemon." ++msgstr "" ++"Collectd è un piccolo demone usato per raccogliere dati da varie fonti " ++"grazie a diversi plugin. Su questa pagina puoi cambiare le opzioni generali " ++"del demone collectd." ++ ++msgid "Conntrack" ++msgstr "" ++ ++msgid "Conntrack Plugin Configuration" ++msgstr "" ++ ++msgid "DF Plugin Configuration" ++msgstr "" ++ ++msgid "DNS" ++msgstr "" ++ ++msgid "DNS Plugin Configuration" ++msgstr "" ++ ++msgid "Data collection interval" ++msgstr "" ++ ++msgid "Datasets definition file" ++msgstr "" ++ ++msgid "Destination ip range" ++msgstr "" ++ ++msgid "Directory for collectd plugins" ++msgstr "" ++ ++msgid "Directory for sub-configurations" ++msgstr "" ++ ++msgid "Disk Plugin Configuration" ++msgstr "" ++ ++msgid "Disk Space Usage" ++msgstr "" ++ ++msgid "Disk Usage" ++msgstr "" ++ ++msgid "Display Host »" ++msgstr "" ++ ++msgid "Display timespan »" ++msgstr "" ++ ++msgid "E-Mail Plugin Configuration" ++msgstr "" ++ ++msgid "Email" ++msgstr "" ++ ++msgid "Enable this plugin" ++msgstr "Abilita questo plugin" ++ ++msgid "Exec" ++msgstr "" ++ ++msgid "Exec Plugin Configuration" ++msgstr "" ++ ++msgid "Filter class monitoring" ++msgstr "" ++ ++msgid "Firewall" ++msgstr "Firewall" ++ ++msgid "Flush cache after" ++msgstr "" ++ ++msgid "Forwarding between listen and server addresses" ++msgstr "" ++ ++msgid "Graphs" ++msgstr "" ++ ++msgid "Group" ++msgstr "Gruppo" ++ ++msgid "" ++"Here you can define external commands which will be started by collectd in " ++"order to read certain values. The values will be read from stdout." ++msgstr "" ++"Qui puoi definire un comando che sarà avviato da collectd per leggere dei " ++"valori. Il valore sarà letto dallo stdout." ++ ++msgid "" ++"Here you can define external commands which will be started by collectd when " ++"certain threshold values have been reached. The values leading to invokation " ++"will be feeded to the the called programs stdin." ++msgstr "" ++"Qui puoi definire un comando che sarà avviato da collectd quando un certo " ++"valore soglia sia raggiunto. Il valore in questione sarà passato al comando " ++"incovato come stdin." ++ ++msgid "" ++"Here you can define various criteria by which the monitored iptables rules " ++"are selected." ++msgstr "" ++ ++msgid "Host" ++msgstr "" ++ ++msgid "Hostname" ++msgstr "" ++ ++msgid "IP or hostname where to get the txtinfo output from" ++msgstr "" ++ ++msgid "IRQ Plugin Configuration" ++msgstr "" ++ ++msgid "Ignore source addresses" ++msgstr "" ++ ++msgid "Incoming interface" ++msgstr "" ++ ++msgid "Interface Plugin Configuration" ++msgstr "" ++ ++msgid "Interfaces" ++msgstr "Interfacce" ++ ++msgid "Interrupts" ++msgstr "" ++ ++msgid "Interval for pings" ++msgstr "" ++ ++msgid "Iptables Plugin Configuration" ++msgstr "" ++ ++msgid "Leave unselected to automatically determine interfaces to monitor." ++msgstr "" ++"Lasciare deselezionato per determinare automaticamente l'interfaccia da " ++"monitorare." ++ ++msgid "Listen host" ++msgstr "" ++ ++msgid "Listen port" ++msgstr "" ++ ++msgid "Listener interfaces" ++msgstr "" ++ ++msgid "Load Plugin Configuration" ++msgstr "" ++ ++msgid "Maximum allowed connections" ++msgstr "" ++ ++msgid "Memory" ++msgstr "" ++ ++msgid "Memory Plugin Configuration" ++msgstr "" ++ ++msgid "Monitor all except specified" ++msgstr "" ++ ++msgid "Monitor all local listen ports" ++msgstr "" ++ ++msgid "Monitor devices" ++msgstr "" ++ ++msgid "Monitor disks and partitions" ++msgstr "" ++ ++msgid "Monitor filesystem types" ++msgstr "" ++ ++msgid "Monitor hosts" ++msgstr "" ++ ++msgid "Monitor interfaces" ++msgstr "" ++ ++msgid "Monitor interrupts" ++msgstr "" ++ ++msgid "Monitor local ports" ++msgstr "" ++ ++msgid "Monitor mount points" ++msgstr "" ++ ++msgid "Monitor processes" ++msgstr "" ++ ++msgid "Monitor remote ports" ++msgstr "" ++ ++msgid "Name of the rule" ++msgstr "" ++ ++msgid "Netlink" ++msgstr "" ++ ++msgid "Netlink Plugin Configuration" ++msgstr "" ++ ++msgid "Network" ++msgstr "" ++ ++msgid "Network Plugin Configuration" ++msgstr "" ++ ++msgid "Network plugins" ++msgstr "" ++ ++msgid "Network protocol" ++msgstr "" ++ ++msgid "Number of threads for data collection" ++msgstr "" ++ ++msgid "OLSRd" ++msgstr "" ++ ++msgid "OLSRd Plugin Configuration" ++msgstr "" ++ ++msgid "Only create average RRAs" ++msgstr "" ++ ++msgid "Options" ++msgstr "" ++ ++msgid "Outgoing interface" ++msgstr "" ++ ++msgid "Output plugins" ++msgstr "" ++ ++msgid "Ping" ++msgstr "" ++ ++msgid "Ping Plugin Configuration" ++msgstr "" ++ ++msgid "Port" ++msgstr "" ++ ++msgid "Processes" ++msgstr "" ++ ++msgid "Processes Plugin Configuration" ++msgstr "" ++ ++msgid "Processes to monitor separated by space" ++msgstr "" ++ ++msgid "Processor" ++msgstr "" ++ ++msgid "Qdisc monitoring" ++msgstr "" ++ ++msgid "RRD XFiles Factor" ++msgstr "" ++ ++msgid "RRD heart beat interval" ++msgstr "" ++ ++msgid "RRD step interval" ++msgstr "" ++ ++msgid "RRDTool" ++msgstr "" ++ ++msgid "RRDTool Plugin Configuration" ++msgstr "" ++ ++msgid "Rows per RRA" ++msgstr "" ++ ++msgid "Script" ++msgstr "" ++ ++msgid "Seconds" ++msgstr "" ++ ++msgid "Server host" ++msgstr "" ++ ++msgid "Server port" ++msgstr "" ++ ++msgid "Shaping class monitoring" ++msgstr "" ++ ++msgid "Socket file" ++msgstr "" ++ ++msgid "Socket group" ++msgstr "" ++ ++msgid "Socket permissions" ++msgstr "" ++ ++msgid "Source ip range" ++msgstr "" ++ ++msgid "Specifies what information to collect about links." ++msgstr "" ++ ++msgid "Specifies what information to collect about routes." ++msgstr "" ++ ++msgid "Specifies what information to collect about the global topology." ++msgstr "" ++ ++msgid "Splash Leases" ++msgstr "" ++ ++msgid "Splash Leases Plugin Configuration" ++msgstr "" ++ ++msgid "Statistics" ++msgstr "" ++ ++msgid "Storage directory" ++msgstr "" ++ ++msgid "Storage directory for the csv files" ++msgstr "" ++ ++msgid "Store data values as rates instead of absolute values" ++msgstr "" ++ ++msgid "Stored timespans" ++msgstr "" ++ ++msgid "System Load" ++msgstr "" ++ ++msgid "System plugins" ++msgstr "" ++ ++msgid "TCP Connections" ++msgstr "" ++ ++msgid "TCPConns Plugin Configuration" ++msgstr "" ++ ++msgid "TTL for network packets" ++msgstr "" ++ ++msgid "TTL for ping packets" ++msgstr "" ++ ++msgid "Table" ++msgstr "Tabella" ++ ++msgid "The NUT plugin reads information about Uninterruptible Power Supplies." ++msgstr "" ++ ++msgid "" ++"The OLSRd plugin reads information about meshed networks from the txtinfo " ++"plugin of OLSRd." ++msgstr "" ++ ++msgid "" ++"The conntrack plugin collects statistics about the number of tracked " ++"connections." ++msgstr "" ++ ++msgid "The cpu plugin collects basic statistics about the processor usage." ++msgstr "" ++ ++msgid "" ++"The csv plugin stores collected data in csv file format for further " ++"processing by external programs." ++msgstr "" ++ ++msgid "" ++"The df plugin collects statistics about the disk space usage on different " ++"devices, mount points or filesystem types." ++msgstr "" ++ ++msgid "" ++"The disk plugin collects detailled usage statistics for selected partitions " ++"or whole disks." ++msgstr "" ++ ++msgid "" ++"The dns plugin collects detailled statistics about dns related traffic on " ++"selected interfaces." ++msgstr "" ++ ++msgid "" ++"The email plugin creates a unix socket which can be used to transmit email-" ++"statistics to a running collectd daemon. This plugin is primarily intended " ++"to be used in conjunction with Mail::SpamAssasin::Plugin::Collectd but can " ++"be used in other ways as well." ++msgstr "" ++ ++msgid "" ++"The exec plugin starts external commands to read values from or to notify " ++"external processes when certain threshold values have been reached." ++msgstr "" ++ ++msgid "" ++"The interface plugin collects traffic statistics on selected interfaces." ++msgstr "" ++ ++msgid "" ++"The iptables plugin will monitor selected firewall rules and collect " ++"informations about processed bytes and packets per rule." ++msgstr "" ++ ++msgid "" ++"The irq plugin will monitor the rate of issues per second for each selected " ++"interrupt. If no interrupt is selected then all interrupts are monitored." ++msgstr "" ++ ++msgid "" ++"The iwinfo plugin collects statistics about wireless signal strength, noise " ++"and quality." ++msgstr "" ++ ++msgid "The load plugin collects statistics about the general system load." ++msgstr "" ++ ++msgid "The memory plugin collects statistics about the memory usage." ++msgstr "" ++ ++msgid "" ++"The netlink plugin collects extended informations like qdisc-, class- and " ++"filter-statistics for selected interfaces." ++msgstr "" ++ ++msgid "" ++"The network plugin provides network based communication between different " ++"collectd instances. Collectd can operate both in client and server mode. In " ++"client mode locally collected data is transferred to a collectd server " ++"instance, in server mode the local instance receives data from other hosts." ++msgstr "" ++ ++msgid "" ++"The ping plugin will send icmp echo replies to selected hosts and measure " ++"the roundtrip time for each host." ++msgstr "" ++ ++msgid "" ++"The processes plugin collects informations like cpu time, page faults and " ++"memory usage of selected processes." ++msgstr "" ++ ++msgid "" ++"The rrdtool plugin stores the collected data in rrd database files, the " ++"foundation of the diagrams.

    Warning: Setting the wrong " ++"values will result in a very high memory consumption in the temporary " ++"directory. This can render the device unusable!" ++msgstr "" ++ ++msgid "" ++"The splash leases plugin uses libuci to collect statistics about splash " ++"leases." ++msgstr "" ++ ++msgid "" ++"The statistics package is based on Collectd and uses RRD " ++"Tool to render diagram images from collected data." ++msgstr "" ++ ++msgid "" ++"The tcpconns plugin collects informations about open tcp connections on " ++"selected ports." ++msgstr "" ++ ++msgid "" ++"The unixsock plugin creates a unix socket which can be used to read " ++"collected data from a running collectd instance." ++msgstr "" ++ ++msgid "The uptime plugin collects statistics about the uptime of the system." ++msgstr "" ++ ++msgid "" ++"This section defines on which interfaces collectd will wait for incoming " ++"connections." ++msgstr "" ++ ++msgid "" ++"This section defines to which servers the locally collected data is sent to." ++msgstr "" ++ ++msgid "Try to lookup fully qualified hostname" ++msgstr "" ++ ++msgid "UPS" ++msgstr "" ++ ++msgid "UPS Plugin Configuration" ++msgstr "" ++ ++msgid "UPS name in NUT ups@host format" ++msgstr "" ++ ++msgid "UnixSock" ++msgstr "" ++ ++msgid "Unixsock Plugin Configuration" ++msgstr "" ++ ++msgid "Uptime" ++msgstr "" ++ ++msgid "Uptime Plugin Configuration" ++msgstr "" ++ ++msgid "Used PID file" ++msgstr "" ++ ++msgid "User" ++msgstr "" ++ ++msgid "Verbose monitoring" ++msgstr "" ++ ++msgid "Wireless" ++msgstr "" ++ ++msgid "Wireless iwinfo Plugin Configuration" ++msgstr "" ++ ++msgid "e.g. br-ff" ++msgstr "" ++ ++msgid "e.g. br-lan" ++msgstr "" ++ ++msgid "e.g. reject-with tcp-reset" ++msgstr "" ++ ++msgid "max. 16 chars" ++msgstr "" ++ ++msgid "reduces rrd size" ++msgstr "" ++ ++msgid "seconds; multiple separated by space" ++msgstr "" ++ ++msgid "server interfaces" ++msgstr "" +diff --git a/feeds/luci/applications/luci-app-statistics/po/ja/rrdtool.po b/feeds/luci/applications/luci-app-statistics/po/ja/rrdtool.po +new file mode 100644 +index 0000000..95545db +--- /dev/null ++++ b/feeds/luci/applications/luci-app-statistics/po/ja/rrdtool.po +@@ -0,0 +1,358 @@ ++#, fuzzy ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Report-Msgid-Bugs-To: \n" ++"POT-Creation-Date: 2009-05-19 19:36+0200\n" ++"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" ++"Last-Translator: FULL NAME \n" ++"Language-Team: LANGUAGE \n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"X-Generator: Translate Toolkit 1.1.1\n" ++ ++#. %H: Wireless - Signal Noise Ratio ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:1 ++msgid "stat_dg_title_wireless__signal_noise" ++msgstr "" ++ ++#. dBm ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:2 ++msgid "stat_dg_label_wireless__signal_noise" ++msgstr "" ++ ++#. Noise Level ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:3 ++msgid "stat_ds_signal_noise" ++msgstr "" ++ ++#. Signal Strength ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:4 ++msgid "stat_ds_signal_power" ++msgstr "" ++ ++#. %H: Wireless - Signal Quality ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:5 ++msgid "stat_dg_title_wireless__signal_quality" ++msgstr "" ++ ++#. n ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:6 ++msgid "stat_dg_label_wireless__signal_quality" ++msgstr "" ++ ++#. Signal Quality ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:7 ++msgid "stat_ds_signal_quality" ++msgstr "" ++ ++#. %H: ICMP Roundtrip Times ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:8 ++msgid "stat_dg_title_ping" ++msgstr "" ++ ++#. ms ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:9 ++msgid "stat_dg_label_ping" ++msgstr "" ++ ++#. %di ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:10 ++msgid "stat_ds_ping" ++msgstr "" ++ ++#. %H: Firewall - Processed Packets ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:11 ++msgid "stat_dg_title_iptables__ipt_packets" ++msgstr "" ++ ++#. Packets/s ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:12 ++msgid "stat_dg_label_iptables__ipt_packets" ++msgstr "" ++ ++#. Chain \"%di\" ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:13 ++msgid "stat_ds_ipt_packets" ++msgstr "" ++ ++#. %H: Netlink - Transfer on %pi ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:14 ++msgid "stat_dg_title_netlink__if_octets" ++msgstr "" ++ ++#. Bytes/s ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:15 ++msgid "stat_dg_label_netlink__if_octets" ++msgstr "" ++ ++#. Bytes (%ds) ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:16 ++msgid "stat_ds_if_octets" ++msgstr "" ++ ++#. %H: Netlink - Packets on %pi ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:17 ++msgid "stat_dg_title_netlink__if_packets" ++msgstr "" ++ ++#. Packets/s ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:18 ++msgid "stat_dg_label_netlink__if_packets" ++msgstr "" ++ ++#. Processed (%ds) ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:19 ++msgid "stat_ds_if_packets" ++msgstr "" ++ ++#. Dropped (%ds) ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:20 ++msgid "stat_ds_if_dropped" ++msgstr "" ++ ++#. Errors (%ds) ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:21 ++msgid "stat_ds_if_errors" ++msgstr "" ++ ++#. %H: Netlink - Multicast on %pi ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:22 ++msgid "stat_dg_title_netlink__if_multicast" ++msgstr "" ++ ++#. Packets/s ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:23 ++msgid "stat_dg_label_netlink__if_multicast" ++msgstr "" ++ ++#. Packets ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:24 ++msgid "stat_ds_if_multicast" ++msgstr "" ++ ++#. %H: Netlink - Collisions on %pi ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:25 ++msgid "stat_dg_title_netlink__if_collisions" ++msgstr "" ++ ++#. Collisions/s ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:26 ++msgid "stat_dg_label_netlink__if_collisions" ++msgstr "" ++ ++#. Collisions ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:27 ++msgid "stat_ds_if_collisions" ++msgstr "" ++ ++#. %H: Netlink - Errors on %pi ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:28 ++msgid "stat_dg_title_netlink__if_tx_errors" ++msgstr "" ++ ++#. Errors/s ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:29 ++msgid "stat_dg_label_netlink__if_tx_errors" ++msgstr "" ++ ++#. %di ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:30 ++msgid "stat_ds_if_tx_errors" ++msgstr "" ++ ++#. %di ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:31 ++msgid "stat_ds_if_rx_errors" ++msgstr "" ++ ++#. %H: Processes ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:32 ++msgid "stat_dg_title_processes" ++msgstr "" ++ ++#. Processes/s ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:33 ++msgid "stat_dg_label_processes" ++msgstr "" ++ ++#. %di ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:34 ++msgid "stat_ds_ps_state" ++msgstr "" ++ ++#. %H: Process %pi - used cpu time ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:35 ++msgid "stat_dg_title_processes__ps_cputime" ++msgstr "" ++ ++#. Jiffies ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:36 ++msgid "stat_dg_label_processes__ps_cputime" ++msgstr "" ++ ++#. system ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:37 ++msgid "stat_ds_ps_cputime__syst" ++msgstr "" ++ ++#. user ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:38 ++msgid "stat_ds_ps_cputime__user" ++msgstr "" ++ ++#. %H: Process %pi - threads and processes ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:39 ++msgid "stat_dg_title_processes__ps_count" ++msgstr "" ++ ++#. Count ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:40 ++msgid "stat_dg_label_processes__ps_count" ++msgstr "" ++ ++#. %ds ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:41 ++msgid "stat_ds_ps_count" ++msgstr "" ++ ++#. %H: Process %pi - page faults ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:42 ++msgid "stat_dg_title_processes__ps_pagefaults" ++msgstr "" ++ ++#. Pagefaults ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:43 ++msgid "stat_dg_label_processes__ps_pagefaults" ++msgstr "" ++ ++#. page faults ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:44 ++msgid "stat_ds_ps_pagefaults" ++msgstr "" ++ ++#. %H: Process %pi - virtual memory size ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:45 ++msgid "stat_dg_title_processes__ps_rss" ++msgstr "" ++ ++#. Bytes ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:46 ++msgid "stat_dg_label_processes__ps_rss" ++msgstr "" ++ ++#. virtual memory ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:47 ++msgid "stat_ds_ps_rss" ++msgstr "" ++ ++#. %H: Usage on Processor #%pi ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:48 ++msgid "stat_dg_title_cpu" ++msgstr "" ++ ++#. % ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:49 ++msgid "stat_dg_label_cpu" ++msgstr "" ++ ++#. %di ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:50 ++msgid "stat_ds_cpu" ++msgstr "" ++ ++#. %H: Transfer on %di ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:51 ++msgid "stat_dg_title_interface__if_octets" ++msgstr "" ++ ++#. Bytes/s ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:52 ++msgid "stat_dg_label_interface__if_octets" ++msgstr "" ++ ++#. %H: Packets on %di ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:53 ++msgid "stat_dg_title_interface__if_packets" ++msgstr "" ++ ++#. Packets/s ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:54 ++msgid "stat_dg_label_interface__if_packets" ++msgstr "" ++ ++#. %H: TCP-Connections to Port %pi ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:55 ++msgid "stat_dg_title_tcpconns" ++msgstr "" ++ ++#. Connections/s ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:56 ++msgid "stat_dg_label_tcpconns" ++msgstr "" ++ ++#. %di ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:57 ++msgid "stat_ds_tcp_connections" ++msgstr "" ++ ++#. %H: Disk Space Usage on %di ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:58 ++msgid "stat_dg_title_df" ++msgstr "" ++ ++#. Bytes ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:59 ++msgid "stat_dg_label_df" ++msgstr "" ++ ++#. %ds ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:60 ++msgid "stat_ds_df__free" ++msgstr "" ++ ++#. %ds ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:61 ++msgid "stat_ds_df__used" ++msgstr "" ++ ++#. %H: Interrupts ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:62 ++msgid "stat_dg_title_irq" ++msgstr "" ++ ++#. Issues/s ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:63 ++msgid "stat_dg_label_irq" ++msgstr "" ++ ++#. IRQ %di ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:64 ++msgid "stat_ds_irq" ++msgstr "" ++ ++#. %H: System Load ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:65 ++msgid "stat_dg_title_load" ++msgstr "" ++ ++#. Load ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:66 ++msgid "stat_dg_label_load" ++msgstr "" ++ ++#. 1 min ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:67 ++msgid "stat_ds_load__shortterm" ++msgstr "" ++ ++#. 5 min ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:68 ++msgid "stat_ds_load__midterm" ++msgstr "" ++ ++#. 15 min ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:69 ++msgid "stat_ds_load__longterm" ++msgstr "" +diff --git a/feeds/luci/applications/luci-app-statistics/po/ja/statistics.po b/feeds/luci/applications/luci-app-statistics/po/ja/statistics.po +new file mode 100644 +index 0000000..7a4657d +--- /dev/null ++++ b/feeds/luci/applications/luci-app-statistics/po/ja/statistics.po +@@ -0,0 +1,621 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Report-Msgid-Bugs-To: \n" ++"POT-Creation-Date: 2009-05-19 19:36+0200\n" ++"PO-Revision-Date: 2012-04-20 08:55+0200\n" ++"Last-Translator: Kentaro \n" ++"Language-Team: LANGUAGE \n" ++"Language: ja\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=1; plural=0;\n" ++"X-Generator: Pootle 2.0.4\n" ++ ++msgid "Action (target)" ++msgstr "" ++ ++msgid "Add command for reading values" ++msgstr "" ++ ++msgid "Add matching rule" ++msgstr "" ++ ++msgid "Add multiple hosts separated by space." ++msgstr "" ++ ++msgid "Add notification command" ++msgstr "" ++ ++msgid "Base Directory" ++msgstr "ベース・ディレクトリ" ++ ++msgid "Basic monitoring" ++msgstr "" ++ ++msgid "CPU Plugin Configuration" ++msgstr "" ++ ++msgid "CSV Output" ++msgstr "" ++ ++msgid "CSV Plugin Configuration" ++msgstr "CSV プラグイン設定" ++ ++msgid "Cache collected data for" ++msgstr "" ++ ++msgid "Cache flush interval" ++msgstr "" ++ ++msgid "Chain" ++msgstr "" ++ ++msgid "CollectLinks" ++msgstr "" ++ ++msgid "CollectRoutes" ++msgstr "" ++ ++msgid "CollectTopology" ++msgstr "" ++ ++msgid "Collectd" ++msgstr "Collectd" ++ ++msgid "Collectd Settings" ++msgstr "Collectd 設定" ++ ++msgid "" ++"Collectd is a small daemon for collecting data from various sources through " ++"different plugins. On this page you can change general settings for the " ++"collectd daemon." ++msgstr "" ++ ++msgid "Conntrack" ++msgstr "" ++ ++msgid "Conntrack Plugin Configuration" ++msgstr "" ++ ++msgid "DF Plugin Configuration" ++msgstr "DF プラグイン設定" ++ ++msgid "DNS" ++msgstr "DNS" ++ ++msgid "DNS Plugin Configuration" ++msgstr "" ++ ++msgid "Data collection interval" ++msgstr "データã®åŽé›†é–“éš”" ++ ++msgid "Datasets definition file" ++msgstr "データベース定義ファイル" ++ ++msgid "Destination ip range" ++msgstr "" ++ ++msgid "Directory for collectd plugins" ++msgstr "collectd プラグインディレクトリ" ++ ++msgid "Directory for sub-configurations" ++msgstr "サブ設定ディレクトリ" ++ ++msgid "Disk Plugin Configuration" ++msgstr "ディスクプラグイン設定" ++ ++msgid "Disk Space Usage" ++msgstr "" ++ ++msgid "Disk Usage" ++msgstr "" ++ ++msgid "Display Host »" ++msgstr "" ++ ++msgid "Display timespan »" ++msgstr "時間帯表示 »" ++ ++msgid "E-Mail Plugin Configuration" ++msgstr "E-メールプラグイン設定" ++ ++msgid "Email" ++msgstr "Eメール" ++ ++msgid "Enable this plugin" ++msgstr "プラグイン設定を有効ã«ã™ã‚‹" ++ ++msgid "Exec" ++msgstr "" ++ ++msgid "Exec Plugin Configuration" ++msgstr "" ++ ++msgid "Filter class monitoring" ++msgstr "" ++ ++msgid "Firewall" ++msgstr "ファイアウォール" ++ ++msgid "Flush cache after" ++msgstr "" ++ ++msgid "Forwarding between listen and server addresses" ++msgstr "" ++ ++msgid "Graphs" ++msgstr "グラフ" ++ ++msgid "Group" ++msgstr "グループ" ++ ++msgid "" ++"Here you can define external commands which will be started by collectd in " ++"order to read certain values. The values will be read from stdout." ++msgstr "" ++ ++msgid "" ++"Here you can define external commands which will be started by collectd when " ++"certain threshold values have been reached. The values leading to invokation " ++"will be feeded to the the called programs stdin." ++msgstr "" ++ ++msgid "" ++"Here you can define various criteria by which the monitored iptables rules " ++"are selected." ++msgstr "" ++ ++msgid "Host" ++msgstr "" ++ ++msgid "Hostname" ++msgstr "ホストå" ++ ++msgid "IP or hostname where to get the txtinfo output from" ++msgstr "" ++ ++msgid "IRQ Plugin Configuration" ++msgstr "IRQ プラグイン設定" ++ ++msgid "Ignore source addresses" ++msgstr "" ++ ++msgid "Incoming interface" ++msgstr "" ++ ++msgid "Interface Plugin Configuration" ++msgstr "" ++ ++msgid "Interfaces" ++msgstr "" ++ ++msgid "Interrupts" ++msgstr "" ++ ++msgid "Interval for pings" ++msgstr "" ++ ++msgid "Iptables Plugin Configuration" ++msgstr "" ++ ++msgid "Leave unselected to automatically determine interfaces to monitor." ++msgstr "" ++ ++msgid "Listen host" ++msgstr "" ++ ++msgid "Listen port" ++msgstr "" ++ ++msgid "Listener interfaces" ++msgstr "" ++ ++msgid "Load Plugin Configuration" ++msgstr "" ++ ++msgid "Maximum allowed connections" ++msgstr "" ++ ++msgid "Memory" ++msgstr "" ++ ++msgid "Memory Plugin Configuration" ++msgstr "" ++ ++msgid "Monitor all except specified" ++msgstr "設定値以外ã®å…¨ã¦ã®ã‚¤ãƒ³ã‚¿ãƒ¼ãƒ•ã‚§ãƒ¼ã‚¹ã‚’モニターã™ã‚‹" ++ ++msgid "Monitor all local listen ports" ++msgstr "" ++ ++msgid "Monitor devices" ++msgstr "" ++ ++msgid "Monitor disks and partitions" ++msgstr "" ++ ++msgid "Monitor filesystem types" ++msgstr "" ++ ++msgid "Monitor hosts" ++msgstr "" ++ ++msgid "Monitor interfaces" ++msgstr "モニターã™ã‚‹ã‚¤ãƒ³ã‚¿ãƒ¼ãƒ•ã‚§ãƒ¼ã‚¹ã®è¨­å®š" ++ ++msgid "Monitor interrupts" ++msgstr "" ++ ++msgid "Monitor local ports" ++msgstr "" ++ ++msgid "Monitor mount points" ++msgstr "" ++ ++msgid "Monitor processes" ++msgstr "" ++ ++msgid "Monitor remote ports" ++msgstr "" ++ ++msgid "Name of the rule" ++msgstr "" ++ ++msgid "Netlink" ++msgstr "Netlink" ++ ++msgid "Netlink Plugin Configuration" ++msgstr "Netlink プラグイン設定" ++ ++msgid "Network" ++msgstr "ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯" ++ ++msgid "Network Plugin Configuration" ++msgstr "ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ãƒ—ラグイン設定" ++ ++msgid "Network plugins" ++msgstr "ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ãƒ—ラグイン" ++ ++msgid "Network protocol" ++msgstr "ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ãƒ—ロトコル" ++ ++msgid "Number of threads for data collection" ++msgstr "データåŽé›†ç”¨ã‚¹ãƒ¬ãƒƒãƒ‰æ•°" ++ ++msgid "OLSRd" ++msgstr "OLSRd" ++ ++msgid "OLSRd Plugin Configuration" ++msgstr "OLSRd プラグイン設定" ++ ++msgid "Only create average RRAs" ++msgstr "å¹³å‡å€¤ã®RRAsã®ã¿ä½œæˆã™ã‚‹" ++ ++msgid "Options" ++msgstr "オプション" ++ ++msgid "Outgoing interface" ++msgstr "" ++ ++msgid "Output plugins" ++msgstr "出力プラグイン" ++ ++msgid "Ping" ++msgstr "Ping" ++ ++msgid "Ping Plugin Configuration" ++msgstr "Ping プラグイン設定" ++ ++msgid "Port" ++msgstr "ãƒãƒ¼ãƒˆ" ++ ++msgid "Processes" ++msgstr "" ++ ++msgid "Processes Plugin Configuration" ++msgstr "" ++ ++msgid "Processes to monitor separated by space" ++msgstr "" ++ ++msgid "Processor" ++msgstr "" ++ ++msgid "Qdisc monitoring" ++msgstr "" ++ ++msgid "RRD XFiles Factor" ++msgstr "" ++ ++msgid "RRD heart beat interval" ++msgstr "" ++ ++msgid "RRD step interval" ++msgstr "" ++ ++msgid "RRDTool" ++msgstr "RRDTool" ++ ++msgid "RRDTool Plugin Configuration" ++msgstr "RRDTool プラグイン設定" ++ ++msgid "Rows per RRA" ++msgstr "" ++ ++msgid "Script" ++msgstr "スクリプト" ++ ++msgid "Seconds" ++msgstr "秒" ++ ++msgid "Server host" ++msgstr "" ++ ++msgid "Server port" ++msgstr "" ++ ++msgid "Shaping class monitoring" ++msgstr "" ++ ++msgid "Socket file" ++msgstr "" ++ ++msgid "Socket group" ++msgstr "" ++ ++msgid "Socket permissions" ++msgstr "" ++ ++msgid "Source ip range" ++msgstr "" ++ ++msgid "Specifies what information to collect about links." ++msgstr "" ++ ++msgid "Specifies what information to collect about routes." ++msgstr "" ++ ++msgid "Specifies what information to collect about the global topology." ++msgstr "" ++ ++msgid "Splash Leases" ++msgstr "" ++ ++msgid "Splash Leases Plugin Configuration" ++msgstr "" ++ ++msgid "Statistics" ++msgstr "" ++ ++msgid "Storage directory" ++msgstr "ä¿å­˜å…ˆãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒª" ++ ++msgid "Storage directory for the csv files" ++msgstr "" ++ ++msgid "Store data values as rates instead of absolute values" ++msgstr "" ++ ++msgid "Stored timespans" ++msgstr "" ++ ++msgid "System Load" ++msgstr "" ++ ++msgid "System plugins" ++msgstr "システムプラグイン" ++ ++msgid "TCP Connections" ++msgstr "" ++ ++msgid "TCPConns Plugin Configuration" ++msgstr "" ++ ++msgid "TTL for network packets" ++msgstr "" ++ ++msgid "TTL for ping packets" ++msgstr "" ++ ++msgid "Table" ++msgstr "" ++ ++msgid "The NUT plugin reads information about Uninterruptible Power Supplies." ++msgstr "" ++ ++msgid "" ++"The OLSRd plugin reads information about meshed networks from the txtinfo " ++"plugin of OLSRd." ++msgstr "" ++ ++msgid "" ++"The conntrack plugin collects statistics about the number of tracked " ++"connections." ++msgstr "" ++ ++msgid "The cpu plugin collects basic statistics about the processor usage." ++msgstr "" ++ ++msgid "" ++"The csv plugin stores collected data in csv file format for further " ++"processing by external programs." ++msgstr "" ++ ++msgid "" ++"The df plugin collects statistics about the disk space usage on different " ++"devices, mount points or filesystem types." ++msgstr "" ++ ++msgid "" ++"The disk plugin collects detailled usage statistics for selected partitions " ++"or whole disks." ++msgstr "" ++ ++msgid "" ++"The dns plugin collects detailled statistics about dns related traffic on " ++"selected interfaces." ++msgstr "" ++ ++msgid "" ++"The email plugin creates a unix socket which can be used to transmit email-" ++"statistics to a running collectd daemon. This plugin is primarily intended " ++"to be used in conjunction with Mail::SpamAssasin::Plugin::Collectd but can " ++"be used in other ways as well." ++msgstr "" ++ ++msgid "" ++"The exec plugin starts external commands to read values from or to notify " ++"external processes when certain threshold values have been reached." ++msgstr "" ++ ++msgid "" ++"The interface plugin collects traffic statistics on selected interfaces." ++msgstr "" ++"インターフェースプラグインã¯ã€é¸æŠžã—ãŸã‚¤ãƒ³ã‚¿ãƒ¼ãƒ•ã‚§ãƒ¼ã‚¹ã®ãƒˆãƒ©ãƒ•ã‚£ãƒƒã‚¯ã®çµ±è¨ˆæƒ…" ++"報をåŽé›†ã—ã¾ã™ã€‚" ++ ++msgid "" ++"The iptables plugin will monitor selected firewall rules and collect " ++"informations about processed bytes and packets per rule." ++msgstr "" ++ ++msgid "" ++"The irq plugin will monitor the rate of issues per second for each selected " ++"interrupt. If no interrupt is selected then all interrupts are monitored." ++msgstr "" ++ ++msgid "" ++"The iwinfo plugin collects statistics about wireless signal strength, noise " ++"and quality." ++msgstr "" ++"iwinfo プラグインã¯ã€ç„¡ç·šä¿¡å·å¼·åº¦ã€ãƒŽã‚¤ã‚ºã€ã‚¯ã‚ªãƒªãƒ†ã‚£æƒ…報をåŽé›†ã—ã¾ã™ã€‚" ++ ++msgid "The load plugin collects statistics about the general system load." ++msgstr "è² è·ãƒ—ラグインã¯ã€ã‚·ã‚¹ãƒ†ãƒ è² è·ã®çµ±è¨ˆæƒ…報をåŽé›†ã—ã¾ã™ã€‚" ++ ++msgid "The memory plugin collects statistics about the memory usage." ++msgstr "" ++ ++msgid "" ++"The netlink plugin collects extended informations like qdisc-, class- and " ++"filter-statistics for selected interfaces." ++msgstr "" ++ ++msgid "" ++"The network plugin provides network based communication between different " ++"collectd instances. Collectd can operate both in client and server mode. In " ++"client mode locally collected data is transferred to a collectd server " ++"instance, in server mode the local instance receives data from other hosts." ++msgstr "" ++ ++msgid "" ++"The ping plugin will send icmp echo replies to selected hosts and measure " ++"the roundtrip time for each host." ++msgstr "" ++ ++msgid "" ++"The processes plugin collects informations like cpu time, page faults and " ++"memory usage of selected processes." ++msgstr "" ++ ++msgid "" ++"The rrdtool plugin stores the collected data in rrd database files, the " ++"foundation of the diagrams.

    Warning: Setting the wrong " ++"values will result in a very high memory consumption in the temporary " ++"directory. This can render the device unusable!" ++msgstr "" ++ ++msgid "" ++"The splash leases plugin uses libuci to collect statistics about splash " ++"leases." ++msgstr "" ++ ++msgid "" ++"The statistics package is based on Collectd and uses RRD " ++"Tool to render diagram images from collected data." ++msgstr "" ++ ++msgid "" ++"The tcpconns plugin collects informations about open tcp connections on " ++"selected ports." ++msgstr "" ++ ++msgid "" ++"The unixsock plugin creates a unix socket which can be used to read " ++"collected data from a running collectd instance." ++msgstr "" ++ ++msgid "The uptime plugin collects statistics about the uptime of the system." ++msgstr "" ++ ++msgid "" ++"This section defines on which interfaces collectd will wait for incoming " ++"connections." ++msgstr "" ++ ++msgid "" ++"This section defines to which servers the locally collected data is sent to." ++msgstr "" ++ ++msgid "Try to lookup fully qualified hostname" ++msgstr "" ++ ++msgid "UPS" ++msgstr "" ++ ++msgid "UPS Plugin Configuration" ++msgstr "" ++ ++msgid "UPS name in NUT ups@host format" ++msgstr "" ++ ++msgid "UnixSock" ++msgstr "" ++ ++msgid "Unixsock Plugin Configuration" ++msgstr "" ++ ++msgid "Uptime" ++msgstr "" ++ ++msgid "Uptime Plugin Configuration" ++msgstr "" ++ ++msgid "Used PID file" ++msgstr "使用ã™ã‚‹PIDファイルã®ä¿å­˜å ´æ‰€" ++ ++msgid "User" ++msgstr "" ++ ++msgid "Verbose monitoring" ++msgstr "" ++ ++msgid "Wireless" ++msgstr "" ++ ++msgid "Wireless iwinfo Plugin Configuration" ++msgstr "ç„¡ç·šLAN iwinfo プラグイン設定" ++ ++msgid "e.g. br-ff" ++msgstr "" ++ ++msgid "e.g. br-lan" ++msgstr "" ++ ++msgid "e.g. reject-with tcp-reset" ++msgstr "" ++ ++msgid "max. 16 chars" ++msgstr "" ++ ++msgid "reduces rrd size" ++msgstr "rrdファイルã®ã‚µã‚¤ã‚ºã‚’å°ã•ãã—ã¾ã™ã€‚" ++ ++msgid "seconds; multiple separated by space" ++msgstr "" ++ ++msgid "server interfaces" ++msgstr "" +diff --git a/feeds/luci/applications/luci-app-statistics/po/ms/rrdtool.po b/feeds/luci/applications/luci-app-statistics/po/ms/rrdtool.po +new file mode 100644 +index 0000000..1f81fc6 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-statistics/po/ms/rrdtool.po +@@ -0,0 +1,355 @@ ++# rrdtool.pot ++# generated from ./applications/luci-statistics/luasrc/i18n/rrdtool.en.lua ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Last-Translator: Automatically generated\n" ++"Language-Team: none\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++ ++#. %H: Wireless - Signal Noise Ratio ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:1 ++msgid "stat_dg_title_wireless__signal_noise" ++msgstr "" ++ ++#. dBm ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:2 ++msgid "stat_dg_label_wireless__signal_noise" ++msgstr "" ++ ++#. Noise Level ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:3 ++msgid "stat_ds_signal_noise" ++msgstr "" ++ ++#. Signal Strength ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:4 ++msgid "stat_ds_signal_power" ++msgstr "" ++ ++#. %H: Wireless - Signal Quality ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:5 ++msgid "stat_dg_title_wireless__signal_quality" ++msgstr "" ++ ++#. n ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:6 ++msgid "stat_dg_label_wireless__signal_quality" ++msgstr "" ++ ++#. Signal Quality ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:7 ++msgid "stat_ds_signal_quality" ++msgstr "" ++ ++#. %H: ICMP Roundtrip Times ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:8 ++msgid "stat_dg_title_ping" ++msgstr "" ++ ++#. ms ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:9 ++msgid "stat_dg_label_ping" ++msgstr "" ++ ++#. %di ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:10 ++msgid "stat_ds_ping" ++msgstr "" ++ ++#. %H: Firewall - Processed Packets ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:11 ++msgid "stat_dg_title_iptables__ipt_packets" ++msgstr "" ++ ++#. Packets/s ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:12 ++msgid "stat_dg_label_iptables__ipt_packets" ++msgstr "" ++ ++#. Chain \"%di\" ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:13 ++msgid "stat_ds_ipt_packets" ++msgstr "" ++ ++#. %H: Netlink - Transfer on %pi ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:14 ++msgid "stat_dg_title_netlink__if_octets" ++msgstr "" ++ ++#. Bytes/s ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:15 ++msgid "stat_dg_label_netlink__if_octets" ++msgstr "" ++ ++#. Bytes (%ds) ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:16 ++msgid "stat_ds_if_octets" ++msgstr "" ++ ++#. %H: Netlink - Packets on %pi ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:17 ++msgid "stat_dg_title_netlink__if_packets" ++msgstr "" ++ ++#. Packets/s ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:18 ++msgid "stat_dg_label_netlink__if_packets" ++msgstr "" ++ ++#. Processed (%ds) ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:19 ++msgid "stat_ds_if_packets" ++msgstr "" ++ ++#. Dropped (%ds) ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:20 ++msgid "stat_ds_if_dropped" ++msgstr "" ++ ++#. Errors (%ds) ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:21 ++msgid "stat_ds_if_errors" ++msgstr "" ++ ++#. %H: Netlink - Multicast on %pi ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:22 ++msgid "stat_dg_title_netlink__if_multicast" ++msgstr "" ++ ++#. Packets/s ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:23 ++msgid "stat_dg_label_netlink__if_multicast" ++msgstr "" ++ ++#. Packets ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:24 ++msgid "stat_ds_if_multicast" ++msgstr "" ++ ++#. %H: Netlink - Collisions on %pi ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:25 ++msgid "stat_dg_title_netlink__if_collisions" ++msgstr "" ++ ++#. Collisions/s ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:26 ++msgid "stat_dg_label_netlink__if_collisions" ++msgstr "" ++ ++#. Collisions ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:27 ++msgid "stat_ds_if_collisions" ++msgstr "" ++ ++#. %H: Netlink - Errors on %pi ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:28 ++msgid "stat_dg_title_netlink__if_tx_errors" ++msgstr "" ++ ++#. Errors/s ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:29 ++msgid "stat_dg_label_netlink__if_tx_errors" ++msgstr "" ++ ++#. %di ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:30 ++msgid "stat_ds_if_tx_errors" ++msgstr "" ++ ++#. %di ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:31 ++msgid "stat_ds_if_rx_errors" ++msgstr "" ++ ++#. %H: Processes ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:32 ++msgid "stat_dg_title_processes" ++msgstr "" ++ ++#. Processes/s ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:33 ++msgid "stat_dg_label_processes" ++msgstr "" ++ ++#. %di ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:34 ++msgid "stat_ds_ps_state" ++msgstr "" ++ ++#. %H: Process %pi - used cpu time ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:35 ++msgid "stat_dg_title_processes__ps_cputime" ++msgstr "" ++ ++#. Jiffies ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:36 ++msgid "stat_dg_label_processes__ps_cputime" ++msgstr "" ++ ++#. system ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:37 ++msgid "stat_ds_ps_cputime__syst" ++msgstr "" ++ ++#. user ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:38 ++msgid "stat_ds_ps_cputime__user" ++msgstr "" ++ ++#. %H: Process %pi - threads and processes ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:39 ++msgid "stat_dg_title_processes__ps_count" ++msgstr "" ++ ++#. Count ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:40 ++msgid "stat_dg_label_processes__ps_count" ++msgstr "" ++ ++#. %ds ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:41 ++msgid "stat_ds_ps_count" ++msgstr "" ++ ++#. %H: Process %pi - page faults ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:42 ++msgid "stat_dg_title_processes__ps_pagefaults" ++msgstr "" ++ ++#. Pagefaults ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:43 ++msgid "stat_dg_label_processes__ps_pagefaults" ++msgstr "" ++ ++#. page faults ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:44 ++msgid "stat_ds_ps_pagefaults" ++msgstr "" ++ ++#. %H: Process %pi - virtual memory size ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:45 ++msgid "stat_dg_title_processes__ps_rss" ++msgstr "" ++ ++#. Bytes ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:46 ++msgid "stat_dg_label_processes__ps_rss" ++msgstr "" ++ ++#. virtual memory ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:47 ++msgid "stat_ds_ps_rss" ++msgstr "" ++ ++#. %H: Usage on Processor #%pi ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:48 ++msgid "stat_dg_title_cpu" ++msgstr "" ++ ++#. % ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:49 ++msgid "stat_dg_label_cpu" ++msgstr "" ++ ++#. %di ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:50 ++msgid "stat_ds_cpu" ++msgstr "" ++ ++#. %H: Transfer on %di ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:51 ++msgid "stat_dg_title_interface__if_octets" ++msgstr "" ++ ++#. Bytes/s ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:52 ++msgid "stat_dg_label_interface__if_octets" ++msgstr "" ++ ++#. %H: Packets on %di ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:53 ++msgid "stat_dg_title_interface__if_packets" ++msgstr "" ++ ++#. Packets/s ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:54 ++msgid "stat_dg_label_interface__if_packets" ++msgstr "" ++ ++#. %H: TCP-Connections to Port %pi ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:55 ++msgid "stat_dg_title_tcpconns" ++msgstr "" ++ ++#. Connections/s ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:56 ++msgid "stat_dg_label_tcpconns" ++msgstr "" ++ ++#. %di ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:57 ++msgid "stat_ds_tcp_connections" ++msgstr "" ++ ++#. %H: Disk Space Usage on %di ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:58 ++msgid "stat_dg_title_df" ++msgstr "" ++ ++#. Bytes ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:59 ++msgid "stat_dg_label_df" ++msgstr "" ++ ++#. %ds ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:60 ++msgid "stat_ds_df__free" ++msgstr "" ++ ++#. %ds ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:61 ++msgid "stat_ds_df__used" ++msgstr "" ++ ++#. %H: Interrupts ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:62 ++msgid "stat_dg_title_irq" ++msgstr "" ++ ++#. Issues/s ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:63 ++msgid "stat_dg_label_irq" ++msgstr "" ++ ++#. IRQ %di ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:64 ++msgid "stat_ds_irq" ++msgstr "" ++ ++#. %H: System Load ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:65 ++msgid "stat_dg_title_load" ++msgstr "" ++ ++#. Load ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:66 ++msgid "stat_dg_label_load" ++msgstr "" ++ ++#. 1 min ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:67 ++msgid "stat_ds_load__shortterm" ++msgstr "" ++ ++#. 5 min ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:68 ++msgid "stat_ds_load__midterm" ++msgstr "" ++ ++#. 15 min ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:69 ++msgid "stat_ds_load__longterm" ++msgstr "" +diff --git a/feeds/luci/applications/luci-app-statistics/po/ms/statistics.po b/feeds/luci/applications/luci-app-statistics/po/ms/statistics.po +new file mode 100644 +index 0000000..c82120b +--- /dev/null ++++ b/feeds/luci/applications/luci-app-statistics/po/ms/statistics.po +@@ -0,0 +1,615 @@ ++# statistics.pot ++# generated from ./applications/luci-statistics/luasrc/i18n/statistics.en.lua ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Last-Translator: Automatically generated\n" ++"Language-Team: none\n" ++"Language: \n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++ ++msgid "Action (target)" ++msgstr "" ++ ++msgid "Add command for reading values" ++msgstr "" ++ ++msgid "Add matching rule" ++msgstr "" ++ ++msgid "Add multiple hosts separated by space." ++msgstr "" ++ ++msgid "Add notification command" ++msgstr "" ++ ++msgid "Base Directory" ++msgstr "" ++ ++msgid "Basic monitoring" ++msgstr "" ++ ++msgid "CPU Plugin Configuration" ++msgstr "" ++ ++msgid "CSV Output" ++msgstr "" ++ ++msgid "CSV Plugin Configuration" ++msgstr "" ++ ++msgid "Cache collected data for" ++msgstr "" ++ ++msgid "Cache flush interval" ++msgstr "" ++ ++msgid "Chain" ++msgstr "" ++ ++msgid "CollectLinks" ++msgstr "" ++ ++msgid "CollectRoutes" ++msgstr "" ++ ++msgid "CollectTopology" ++msgstr "" ++ ++msgid "Collectd" ++msgstr "" ++ ++msgid "Collectd Settings" ++msgstr "" ++ ++msgid "" ++"Collectd is a small daemon for collecting data from various sources through " ++"different plugins. On this page you can change general settings for the " ++"collectd daemon." ++msgstr "" ++ ++msgid "Conntrack" ++msgstr "" ++ ++msgid "Conntrack Plugin Configuration" ++msgstr "" ++ ++msgid "DF Plugin Configuration" ++msgstr "" ++ ++msgid "DNS" ++msgstr "" ++ ++msgid "DNS Plugin Configuration" ++msgstr "" ++ ++msgid "Data collection interval" ++msgstr "" ++ ++msgid "Datasets definition file" ++msgstr "" ++ ++msgid "Destination ip range" ++msgstr "" ++ ++msgid "Directory for collectd plugins" ++msgstr "" ++ ++msgid "Directory for sub-configurations" ++msgstr "" ++ ++msgid "Disk Plugin Configuration" ++msgstr "" ++ ++msgid "Disk Space Usage" ++msgstr "" ++ ++msgid "Disk Usage" ++msgstr "" ++ ++msgid "Display Host »" ++msgstr "" ++ ++msgid "Display timespan »" ++msgstr "" ++ ++msgid "E-Mail Plugin Configuration" ++msgstr "" ++ ++msgid "Email" ++msgstr "" ++ ++msgid "Enable this plugin" ++msgstr "" ++ ++msgid "Exec" ++msgstr "" ++ ++msgid "Exec Plugin Configuration" ++msgstr "" ++ ++msgid "Filter class monitoring" ++msgstr "" ++ ++msgid "Firewall" ++msgstr "" ++ ++msgid "Flush cache after" ++msgstr "" ++ ++msgid "Forwarding between listen and server addresses" ++msgstr "" ++ ++msgid "Graphs" ++msgstr "" ++ ++msgid "Group" ++msgstr "" ++ ++msgid "" ++"Here you can define external commands which will be started by collectd in " ++"order to read certain values. The values will be read from stdout." ++msgstr "" ++ ++msgid "" ++"Here you can define external commands which will be started by collectd when " ++"certain threshold values have been reached. The values leading to invokation " ++"will be feeded to the the called programs stdin." ++msgstr "" ++ ++msgid "" ++"Here you can define various criteria by which the monitored iptables rules " ++"are selected." ++msgstr "" ++ ++msgid "Host" ++msgstr "" ++ ++msgid "Hostname" ++msgstr "" ++ ++msgid "IP or hostname where to get the txtinfo output from" ++msgstr "" ++ ++msgid "IRQ Plugin Configuration" ++msgstr "" ++ ++msgid "Ignore source addresses" ++msgstr "" ++ ++msgid "Incoming interface" ++msgstr "" ++ ++msgid "Interface Plugin Configuration" ++msgstr "" ++ ++msgid "Interfaces" ++msgstr "" ++ ++msgid "Interrupts" ++msgstr "" ++ ++msgid "Interval for pings" ++msgstr "" ++ ++msgid "Iptables Plugin Configuration" ++msgstr "" ++ ++msgid "Leave unselected to automatically determine interfaces to monitor." ++msgstr "" ++ ++msgid "Listen host" ++msgstr "" ++ ++msgid "Listen port" ++msgstr "" ++ ++msgid "Listener interfaces" ++msgstr "" ++ ++msgid "Load Plugin Configuration" ++msgstr "" ++ ++msgid "Maximum allowed connections" ++msgstr "" ++ ++msgid "Memory" ++msgstr "" ++ ++msgid "Memory Plugin Configuration" ++msgstr "" ++ ++msgid "Monitor all except specified" ++msgstr "" ++ ++msgid "Monitor all local listen ports" ++msgstr "" ++ ++msgid "Monitor devices" ++msgstr "" ++ ++msgid "Monitor disks and partitions" ++msgstr "" ++ ++msgid "Monitor filesystem types" ++msgstr "" ++ ++msgid "Monitor hosts" ++msgstr "" ++ ++msgid "Monitor interfaces" ++msgstr "" ++ ++msgid "Monitor interrupts" ++msgstr "" ++ ++msgid "Monitor local ports" ++msgstr "" ++ ++msgid "Monitor mount points" ++msgstr "" ++ ++msgid "Monitor processes" ++msgstr "" ++ ++msgid "Monitor remote ports" ++msgstr "" ++ ++msgid "Name of the rule" ++msgstr "" ++ ++msgid "Netlink" ++msgstr "" ++ ++msgid "Netlink Plugin Configuration" ++msgstr "" ++ ++msgid "Network" ++msgstr "" ++ ++msgid "Network Plugin Configuration" ++msgstr "" ++ ++msgid "Network plugins" ++msgstr "" ++ ++msgid "Network protocol" ++msgstr "" ++ ++msgid "Number of threads for data collection" ++msgstr "" ++ ++msgid "OLSRd" ++msgstr "" ++ ++msgid "OLSRd Plugin Configuration" ++msgstr "" ++ ++msgid "Only create average RRAs" ++msgstr "" ++ ++msgid "Options" ++msgstr "" ++ ++msgid "Outgoing interface" ++msgstr "" ++ ++msgid "Output plugins" ++msgstr "" ++ ++msgid "Ping" ++msgstr "" ++ ++msgid "Ping Plugin Configuration" ++msgstr "" ++ ++msgid "Port" ++msgstr "" ++ ++msgid "Processes" ++msgstr "" ++ ++msgid "Processes Plugin Configuration" ++msgstr "" ++ ++msgid "Processes to monitor separated by space" ++msgstr "" ++ ++msgid "Processor" ++msgstr "" ++ ++msgid "Qdisc monitoring" ++msgstr "" ++ ++msgid "RRD XFiles Factor" ++msgstr "" ++ ++msgid "RRD heart beat interval" ++msgstr "" ++ ++msgid "RRD step interval" ++msgstr "" ++ ++msgid "RRDTool" ++msgstr "" ++ ++msgid "RRDTool Plugin Configuration" ++msgstr "" ++ ++msgid "Rows per RRA" ++msgstr "" ++ ++msgid "Script" ++msgstr "" ++ ++msgid "Seconds" ++msgstr "" ++ ++msgid "Server host" ++msgstr "" ++ ++msgid "Server port" ++msgstr "" ++ ++msgid "Shaping class monitoring" ++msgstr "" ++ ++msgid "Socket file" ++msgstr "" ++ ++msgid "Socket group" ++msgstr "" ++ ++msgid "Socket permissions" ++msgstr "" ++ ++msgid "Source ip range" ++msgstr "" ++ ++msgid "Specifies what information to collect about links." ++msgstr "" ++ ++msgid "Specifies what information to collect about routes." ++msgstr "" ++ ++msgid "Specifies what information to collect about the global topology." ++msgstr "" ++ ++msgid "Splash Leases" ++msgstr "" ++ ++msgid "Splash Leases Plugin Configuration" ++msgstr "" ++ ++msgid "Statistics" ++msgstr "" ++ ++msgid "Storage directory" ++msgstr "" ++ ++msgid "Storage directory for the csv files" ++msgstr "" ++ ++msgid "Store data values as rates instead of absolute values" ++msgstr "" ++ ++msgid "Stored timespans" ++msgstr "" ++ ++msgid "System Load" ++msgstr "" ++ ++msgid "System plugins" ++msgstr "" ++ ++msgid "TCP Connections" ++msgstr "" ++ ++msgid "TCPConns Plugin Configuration" ++msgstr "" ++ ++msgid "TTL for network packets" ++msgstr "" ++ ++msgid "TTL for ping packets" ++msgstr "" ++ ++msgid "Table" ++msgstr "" ++ ++msgid "The NUT plugin reads information about Uninterruptible Power Supplies." ++msgstr "" ++ ++msgid "" ++"The OLSRd plugin reads information about meshed networks from the txtinfo " ++"plugin of OLSRd." ++msgstr "" ++ ++msgid "" ++"The conntrack plugin collects statistics about the number of tracked " ++"connections." ++msgstr "" ++ ++msgid "The cpu plugin collects basic statistics about the processor usage." ++msgstr "" ++ ++msgid "" ++"The csv plugin stores collected data in csv file format for further " ++"processing by external programs." ++msgstr "" ++ ++msgid "" ++"The df plugin collects statistics about the disk space usage on different " ++"devices, mount points or filesystem types." ++msgstr "" ++ ++msgid "" ++"The disk plugin collects detailled usage statistics for selected partitions " ++"or whole disks." ++msgstr "" ++ ++msgid "" ++"The dns plugin collects detailled statistics about dns related traffic on " ++"selected interfaces." ++msgstr "" ++ ++msgid "" ++"The email plugin creates a unix socket which can be used to transmit email-" ++"statistics to a running collectd daemon. This plugin is primarily intended " ++"to be used in conjunction with Mail::SpamAssasin::Plugin::Collectd but can " ++"be used in other ways as well." ++msgstr "" ++ ++msgid "" ++"The exec plugin starts external commands to read values from or to notify " ++"external processes when certain threshold values have been reached." ++msgstr "" ++ ++msgid "" ++"The interface plugin collects traffic statistics on selected interfaces." ++msgstr "" ++ ++msgid "" ++"The iptables plugin will monitor selected firewall rules and collect " ++"informations about processed bytes and packets per rule." ++msgstr "" ++ ++msgid "" ++"The irq plugin will monitor the rate of issues per second for each selected " ++"interrupt. If no interrupt is selected then all interrupts are monitored." ++msgstr "" ++ ++msgid "" ++"The iwinfo plugin collects statistics about wireless signal strength, noise " ++"and quality." ++msgstr "" ++ ++msgid "The load plugin collects statistics about the general system load." ++msgstr "" ++ ++msgid "The memory plugin collects statistics about the memory usage." ++msgstr "" ++ ++msgid "" ++"The netlink plugin collects extended informations like qdisc-, class- and " ++"filter-statistics for selected interfaces." ++msgstr "" ++ ++msgid "" ++"The network plugin provides network based communication between different " ++"collectd instances. Collectd can operate both in client and server mode. In " ++"client mode locally collected data is transferred to a collectd server " ++"instance, in server mode the local instance receives data from other hosts." ++msgstr "" ++ ++msgid "" ++"The ping plugin will send icmp echo replies to selected hosts and measure " ++"the roundtrip time for each host." ++msgstr "" ++ ++msgid "" ++"The processes plugin collects informations like cpu time, page faults and " ++"memory usage of selected processes." ++msgstr "" ++ ++msgid "" ++"The rrdtool plugin stores the collected data in rrd database files, the " ++"foundation of the diagrams.

    Warning: Setting the wrong " ++"values will result in a very high memory consumption in the temporary " ++"directory. This can render the device unusable!" ++msgstr "" ++ ++msgid "" ++"The splash leases plugin uses libuci to collect statistics about splash " ++"leases." ++msgstr "" ++ ++msgid "" ++"The statistics package is based on Collectd and uses RRD " ++"Tool to render diagram images from collected data." ++msgstr "" ++ ++msgid "" ++"The tcpconns plugin collects informations about open tcp connections on " ++"selected ports." ++msgstr "" ++ ++msgid "" ++"The unixsock plugin creates a unix socket which can be used to read " ++"collected data from a running collectd instance." ++msgstr "" ++ ++msgid "The uptime plugin collects statistics about the uptime of the system." ++msgstr "" ++ ++msgid "" ++"This section defines on which interfaces collectd will wait for incoming " ++"connections." ++msgstr "" ++ ++msgid "" ++"This section defines to which servers the locally collected data is sent to." ++msgstr "" ++ ++msgid "Try to lookup fully qualified hostname" ++msgstr "" ++ ++msgid "UPS" ++msgstr "" ++ ++msgid "UPS Plugin Configuration" ++msgstr "" ++ ++msgid "UPS name in NUT ups@host format" ++msgstr "" ++ ++msgid "UnixSock" ++msgstr "" ++ ++msgid "Unixsock Plugin Configuration" ++msgstr "" ++ ++msgid "Uptime" ++msgstr "" ++ ++msgid "Uptime Plugin Configuration" ++msgstr "" ++ ++msgid "Used PID file" ++msgstr "" ++ ++msgid "User" ++msgstr "" ++ ++msgid "Verbose monitoring" ++msgstr "" ++ ++msgid "Wireless" ++msgstr "" ++ ++msgid "Wireless iwinfo Plugin Configuration" ++msgstr "" ++ ++msgid "e.g. br-ff" ++msgstr "" ++ ++msgid "e.g. br-lan" ++msgstr "" ++ ++msgid "e.g. reject-with tcp-reset" ++msgstr "" ++ ++msgid "max. 16 chars" ++msgstr "" ++ ++msgid "reduces rrd size" ++msgstr "" ++ ++msgid "seconds; multiple separated by space" ++msgstr "" ++ ++msgid "server interfaces" ++msgstr "" +diff --git a/feeds/luci/applications/luci-app-statistics/po/no/rrdtool.po b/feeds/luci/applications/luci-app-statistics/po/no/rrdtool.po +new file mode 100644 +index 0000000..d336ec3 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-statistics/po/no/rrdtool.po +@@ -0,0 +1,354 @@ ++msgid "" ++msgstr "" ++"PO-Revision-Date: 2013-03-25 14:24+0200\n" ++"Last-Translator: protx \n" ++"Language: no\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n != 1);\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++#. %H: Wireless - Signal Noise Ratio ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:1 ++msgid "stat_dg_title_wireless__signal_noise" ++msgstr "%H: Trådløs - Signal Støy Forhold" ++ ++#. dBm ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:2 ++msgid "stat_dg_label_wireless__signal_noise" ++msgstr "dBm" ++ ++#. Noise Level ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:3 ++msgid "stat_ds_signal_noise" ++msgstr "Støy Nivå" ++ ++#. Signal Strength ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:4 ++msgid "stat_ds_signal_power" ++msgstr "Signal Styrke" ++ ++#. %H: Wireless - Signal Quality ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:5 ++msgid "stat_dg_title_wireless__signal_quality" ++msgstr "%H: Trådløs - Signal Kvalitet" ++ ++#. n ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:6 ++msgid "stat_dg_label_wireless__signal_quality" ++msgstr "n" ++ ++#. Signal Quality ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:7 ++msgid "stat_ds_signal_quality" ++msgstr "Signal Kvalitet" ++ ++#. %H: ICMP Roundtrip Times ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:8 ++msgid "stat_dg_title_ping" ++msgstr "%H: ICMP Rundtur Antall" ++ ++#. ms ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:9 ++msgid "stat_dg_label_ping" ++msgstr "ms" ++ ++#. %di ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:10 ++msgid "stat_ds_ping" ++msgstr "%di" ++ ++#. %H: Firewall - Processed Packets ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:11 ++msgid "stat_dg_title_iptables__ipt_packets" ++msgstr "%H: Brannmur - Pakker Behandlet" ++ ++#. Packets/s ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:12 ++msgid "stat_dg_label_iptables__ipt_packets" ++msgstr "Pakker/Sek" ++ ++#. Chain \"%di\" ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:13 ++msgid "stat_ds_ipt_packets" ++msgstr "Lenke \\\"%di\\\"" ++ ++#. %H: Netlink - Transfer on %pi ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:14 ++msgid "stat_dg_title_netlink__if_octets" ++msgstr "%H: Netlink - Overført på %pi" ++ ++#. Bytes/s ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:15 ++msgid "stat_dg_label_netlink__if_octets" ++msgstr "Bytes/Sek" ++ ++#. Bytes (%ds) ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:16 ++msgid "stat_ds_if_octets" ++msgstr "Bytes (%ds)" ++ ++#. %H: Netlink - Packets on %pi ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:17 ++msgid "stat_dg_title_netlink__if_packets" ++msgstr "%H: Netlink - Pakker på %pi" ++ ++#. Packets/s ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:18 ++msgid "stat_dg_label_netlink__if_packets" ++msgstr "Pakker/Sek" ++ ++#. Processed (%ds) ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:19 ++msgid "stat_ds_if_packets" ++msgstr "Behandlet (%ds)" ++ ++#. Dropped (%ds) ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:20 ++msgid "stat_ds_if_dropped" ++msgstr "Droppet (%ds)" ++ ++#. Errors (%ds) ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:21 ++msgid "stat_ds_if_errors" ++msgstr "Feil (%ds)" ++ ++#. %H: Netlink - Multicast on %pi ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:22 ++msgid "stat_dg_title_netlink__if_multicast" ++msgstr "%H: Netlink - Multicast på %pi" ++ ++#. Packets/s ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:23 ++msgid "stat_dg_label_netlink__if_multicast" ++msgstr "Pakker/Sek" ++ ++#. Packets ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:24 ++msgid "stat_ds_if_multicast" ++msgstr "Pakker" ++ ++#. %H: Netlink - Collisions on %pi ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:25 ++msgid "stat_dg_title_netlink__if_collisions" ++msgstr "%H: Netlink - Kollisjoner på %pi" ++ ++#. Collisions/s ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:26 ++msgid "stat_dg_label_netlink__if_collisions" ++msgstr "Kollisjoner/Sek" ++ ++#. Collisions ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:27 ++msgid "stat_ds_if_collisions" ++msgstr "Kollisjoner" ++ ++#. %H: Netlink - Errors on %pi ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:28 ++msgid "stat_dg_title_netlink__if_tx_errors" ++msgstr "%H: Netlink - Feil på %pi" ++ ++#. Errors/s ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:29 ++msgid "stat_dg_label_netlink__if_tx_errors" ++msgstr "Feil/Sek" ++ ++#. %di ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:30 ++msgid "stat_ds_if_tx_errors" ++msgstr "%di" ++ ++#. %di ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:31 ++msgid "stat_ds_if_rx_errors" ++msgstr "%di" ++ ++#. %H: Processes ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:32 ++msgid "stat_dg_title_processes" ++msgstr "%H: Prosesser" ++ ++#. Processes/s ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:33 ++msgid "stat_dg_label_processes" ++msgstr "Prosesser/Sek" ++ ++#. %di ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:34 ++msgid "stat_ds_ps_state" ++msgstr "%di" ++ ++#. %H: Process %pi - used cpu time ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:35 ++msgid "stat_dg_title_processes__ps_cputime" ++msgstr "%H: Prosesser %pi - brukt cpu tid" ++ ++#. Jiffies ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:36 ++msgid "stat_dg_label_processes__ps_cputime" ++msgstr "Jiffier" ++ ++#. system ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:37 ++msgid "stat_ds_ps_cputime__syst" ++msgstr "system" ++ ++#. user ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:38 ++msgid "stat_ds_ps_cputime__user" ++msgstr "bruker" ++ ++#. %H: Process %pi - threads and processes ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:39 ++msgid "stat_dg_title_processes__ps_count" ++msgstr "%H: Prosess %pi - tråder og prosesser" ++ ++#. Count ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:40 ++msgid "stat_dg_label_processes__ps_count" ++msgstr "Telle" ++ ++#. %ds ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:41 ++msgid "stat_ds_ps_count" ++msgstr "%ds" ++ ++#. %H: Process %pi - page faults ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:42 ++msgid "stat_dg_title_processes__ps_pagefaults" ++msgstr "%H: Prosess %pi - sidefeil" ++ ++#. Pagefaults ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:43 ++msgid "stat_dg_label_processes__ps_pagefaults" ++msgstr "Sidefeil" ++ ++#. page faults ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:44 ++msgid "stat_ds_ps_pagefaults" ++msgstr "side feil" ++ ++#. %H: Process %pi - virtual memory size ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:45 ++msgid "stat_dg_title_processes__ps_rss" ++msgstr "%H: Prosess %pi - virtuelt minne størrelse" ++ ++#. Bytes ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:46 ++msgid "stat_dg_label_processes__ps_rss" ++msgstr "Bytes" ++ ++#. virtual memory ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:47 ++msgid "stat_ds_ps_rss" ++msgstr "virtuelt minne" ++ ++#. %H: Usage on Processor #%pi ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:48 ++msgid "stat_dg_title_cpu" ++msgstr "%H: Bruk av prosessor #%pi" ++ ++#. % ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:49 ++msgid "stat_dg_label_cpu" ++msgstr "%" ++ ++#. %di ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:50 ++msgid "stat_ds_cpu" ++msgstr "%di" ++ ++#. %H: Transfer on %di ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:51 ++msgid "stat_dg_title_interface__if_octets" ++msgstr "%H: Overført på %di" ++ ++#. Bytes/s ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:52 ++msgid "stat_dg_label_interface__if_octets" ++msgstr "Bytes/Sek" ++ ++#. %H: Packets on %di ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:53 ++msgid "stat_dg_title_interface__if_packets" ++msgstr "%H: Pakker på %di" ++ ++#. Packets/s ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:54 ++msgid "stat_dg_label_interface__if_packets" ++msgstr "Pakker/Sek" ++ ++#. %H: TCP-Connections to Port %pi ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:55 ++msgid "stat_dg_title_tcpconns" ++msgstr "%H: TCP-tilkoblinger på port %pi" ++ ++#. Connections/s ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:56 ++msgid "stat_dg_label_tcpconns" ++msgstr "Tilkoblinger/Sek" ++ ++#. %di ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:57 ++msgid "stat_ds_tcp_connections" ++msgstr "%di" ++ ++#. %H: Disk Space Usage on %di ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:58 ++msgid "stat_dg_title_df" ++msgstr "%H: Disk forbruk på %di" ++ ++#. Bytes ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:59 ++msgid "stat_dg_label_df" ++msgstr "Bytes" ++ ++#. %ds ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:60 ++msgid "stat_ds_df__free" ++msgstr "%ds" ++ ++#. %ds ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:61 ++msgid "stat_ds_df__used" ++msgstr "%ds" ++ ++#. %H: Interrupts ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:62 ++msgid "stat_dg_title_irq" ++msgstr "%H: Avbrudd" ++ ++#. Issues/s ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:63 ++msgid "stat_dg_label_irq" ++msgstr "Problemer/Sek" ++ ++#. IRQ %di ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:64 ++msgid "stat_ds_irq" ++msgstr "IRQ %di" ++ ++#. %H: System Load ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:65 ++msgid "stat_dg_title_load" ++msgstr "%H: System Belastning" ++ ++#. Load ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:66 ++msgid "stat_dg_label_load" ++msgstr "Belastning" ++ ++#. 1 min ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:67 ++msgid "stat_ds_load__shortterm" ++msgstr "1 min" ++ ++#. 5 min ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:68 ++msgid "stat_ds_load__midterm" ++msgstr "5 min" ++ ++#. 15 min ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:69 ++msgid "stat_ds_load__longterm" ++msgstr "15 min" +diff --git a/feeds/luci/applications/luci-app-statistics/po/no/statistics.po b/feeds/luci/applications/luci-app-statistics/po/no/statistics.po +new file mode 100644 +index 0000000..0e46dd1 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-statistics/po/no/statistics.po +@@ -0,0 +1,700 @@ ++msgid "" ++msgstr "" ++"Last-Translator: Lars Hardy \n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++ ++msgid "Action (target)" ++msgstr "Handling (mål)" ++ ++msgid "Add command for reading values" ++msgstr "Legg til kommando for lesing av verdier" ++ ++msgid "Add matching rule" ++msgstr "Legg til matchende regel" ++ ++msgid "Add multiple hosts separated by space." ++msgstr "Legg til flere verter adskilt med mellomrom." ++ ++msgid "Add notification command" ++msgstr "Legg til varsling kommando" ++ ++msgid "Base Directory" ++msgstr "Hoved Katalog" ++ ++msgid "Basic monitoring" ++msgstr "Enkel overvåking" ++ ++msgid "CPU Plugin Configuration" ++msgstr "CPU plugin konfigurasjon" ++ ++msgid "CSV Output" ++msgstr "CSV Utdata" ++ ++msgid "CSV Plugin Configuration" ++msgstr "CSV plugin konfigurasjon" ++ ++msgid "Cache collected data for" ++msgstr "Hurtigbufre innsamlede data for" ++ ++msgid "Cache flush interval" ++msgstr "Intervall for tømming av hurtigbuffer" ++ ++msgid "Chain" ++msgstr "Lenke" ++ ++msgid "CollectLinks" ++msgstr "" ++ ++msgid "CollectRoutes" ++msgstr "" ++ ++msgid "CollectTopology" ++msgstr "" ++ ++msgid "Collectd" ++msgstr "Collectd" ++ ++msgid "Collectd Settings" ++msgstr "Collectd Innstillinger" ++ ++msgid "" ++"Collectd is a small daemon for collecting data from various sources through " ++"different plugins. On this page you can change general settings for the " ++"collectd daemon." ++msgstr "" ++"Collectd er en liten daemon for innsamling av data fra ulike kilder gjennom " ++"ulike plugins. På denne siden kan du endre generelle innstillinger for " ++"collectd daemon." ++ ++msgid "Conntrack" ++msgstr "" ++ ++msgid "Conntrack Plugin Configuration" ++msgstr "" ++ ++msgid "DF Plugin Configuration" ++msgstr "DF plugin konfigurasjon" ++ ++msgid "DNS" ++msgstr "DNS" ++ ++msgid "DNS Plugin Configuration" ++msgstr "DNS plugin konfigurasjon" ++ ++msgid "Data collection interval" ++msgstr "Datainnsamling intervall" ++ ++msgid "Datasets definition file" ++msgstr "Datasett definisjonsfil" ++ ++msgid "Destination ip range" ++msgstr "Destinasjon ip område" ++ ++msgid "Directory for collectd plugins" ++msgstr "Katalog for collectd plugins" ++ ++msgid "Directory for sub-configurations" ++msgstr "Katalog for sub-konfigurasjoner" ++ ++msgid "Disk Plugin Configuration" ++msgstr "Disk plugin konfigurasjon" ++ ++msgid "Disk Space Usage" ++msgstr "Disk Forbruk" ++ ++msgid "Disk Usage" ++msgstr "Disk Anvendelse" ++ ++msgid "Display Host »" ++msgstr "" ++ ++msgid "Display timespan »" ++msgstr "Vis tidsperiode »" ++ ++msgid "E-Mail Plugin Configuration" ++msgstr "E-Post plugin konfigurasjon" ++ ++msgid "Email" ++msgstr "Epost" ++ ++msgid "Enable this plugin" ++msgstr "Aktiver denne plugin" ++ ++msgid "Exec" ++msgstr "Program" ++ ++msgid "Exec Plugin Configuration" ++msgstr "Program plugin konfigurasjon" ++ ++msgid "Filter class monitoring" ++msgstr "Filter class overvåking" ++ ++msgid "Firewall" ++msgstr "Brannmur" ++ ++msgid "Flush cache after" ++msgstr "Tømme hurtigbufferen etter" ++ ++msgid "Forwarding between listen and server addresses" ++msgstr "Videresending mellom lyttende og server adresser" ++ ++msgid "Graphs" ++msgstr "Grafer" ++ ++msgid "Group" ++msgstr "" ++ ++msgid "" ++"Here you can define external commands which will be started by collectd in " ++"order to read certain values. The values will be read from stdout." ++msgstr "" ++"Her kan du definere eksterne kommandoer som blir startet av collectd for å " ++"lese enkelte verdier. Verdiene skal leses fra stdout." ++ ++msgid "" ++"Here you can define external commands which will be started by collectd when " ++"certain threshold values have been reached. The values leading to invokation " ++"will be feeded to the the called programs stdin." ++msgstr "" ++"Her kan du definere eksterne kommandoer som blir startet av collectd når " ++"visse grenseverdier er blitt nådd. Verdiene som fører til aktivering vil bli " ++"overført til det påkallede programs stdin." ++ ++msgid "" ++"Here you can define various criteria by which the monitored iptables rules " ++"are selected." ++msgstr "Her kan du definere kriterier for reglene som overvåker iptables." ++ ++msgid "Host" ++msgstr "" ++ ++msgid "Hostname" ++msgstr "Vertsnavn" ++ ++msgid "IP or hostname where to get the txtinfo output from" ++msgstr "" ++ ++msgid "IRQ Plugin Configuration" ++msgstr "IRQ plugin konfigurasjon" ++ ++msgid "Ignore source addresses" ++msgstr "Ignorer kilde adresser" ++ ++msgid "Incoming interface" ++msgstr "Innkommende grensesnitt" ++ ++msgid "Interface Plugin Configuration" ++msgstr "Grensesnitt plugin konfigurasjon" ++ ++msgid "Interfaces" ++msgstr "Grensesnitt" ++ ++msgid "Interrupts" ++msgstr "Avbrudd" ++ ++msgid "Interval for pings" ++msgstr "Intervall ping" ++ ++msgid "Iptables Plugin Configuration" ++msgstr "Iptable plugin konfigurasjon" ++ ++msgid "Leave unselected to automatically determine interfaces to monitor." ++msgstr "" ++ ++msgid "Listen host" ++msgstr "Lyttende vert" ++ ++msgid "Listen port" ++msgstr "Lyttende port" ++ ++msgid "Listener interfaces" ++msgstr "Lyttende grensesnitt" ++ ++msgid "Load Plugin Configuration" ++msgstr "Belastning plugin konfigurasjon" ++ ++msgid "Maximum allowed connections" ++msgstr "Maksimum tillatte tilkoblinger" ++ ++msgid "Memory" ++msgstr "" ++ ++msgid "Memory Plugin Configuration" ++msgstr "" ++ ++msgid "Monitor all except specified" ++msgstr "" ++ ++msgid "Monitor all local listen ports" ++msgstr "Overvåk alle lokale lyttende porter" ++ ++msgid "Monitor devices" ++msgstr "Overvåk enheter" ++ ++msgid "Monitor disks and partitions" ++msgstr "Overvåk disker og partisjoner" ++ ++msgid "Monitor filesystem types" ++msgstr "Overvåk filsystem typer" ++ ++msgid "Monitor hosts" ++msgstr "Overvåk verter" ++ ++msgid "Monitor interfaces" ++msgstr "" ++ ++msgid "Monitor interrupts" ++msgstr "Overvåk avbrudd" ++ ++msgid "Monitor local ports" ++msgstr "Overvåk lokale porter" ++ ++msgid "Monitor mount points" ++msgstr "Overvåk monterings punkter" ++ ++msgid "Monitor processes" ++msgstr "Overvåk prosesser" ++ ++msgid "Monitor remote ports" ++msgstr "Overvåk eksterne porter" ++ ++msgid "Name of the rule" ++msgstr "Navnet på regelen" ++ ++msgid "Netlink" ++msgstr "Nettlink" ++ ++msgid "Netlink Plugin Configuration" ++msgstr "Netlink plugin konfigurasjon" ++ ++msgid "Network" ++msgstr "Nettverk" ++ ++msgid "Network Plugin Configuration" ++msgstr "Nettverks plugin konfigurasjon" ++ ++msgid "Network plugins" ++msgstr "Nettverks plugin" ++ ++msgid "Network protocol" ++msgstr "Nettverks protokoll" ++ ++msgid "Number of threads for data collection" ++msgstr "Antall tråder for datainnsamling" ++ ++msgid "OLSRd" ++msgstr "" ++ ++msgid "OLSRd Plugin Configuration" ++msgstr "" ++ ++msgid "Only create average RRAs" ++msgstr "Lag kun gjennomsnittlige RRAs" ++ ++msgid "Options" ++msgstr "Alternativer" ++ ++msgid "Outgoing interface" ++msgstr "Utgående grensesnitt" ++ ++msgid "Output plugins" ++msgstr "Utdata Plugin" ++ ++msgid "Ping" ++msgstr "Ping" ++ ++msgid "Ping Plugin Configuration" ++msgstr "Ping plugin konfigurasjon" ++ ++msgid "Port" ++msgstr "" ++ ++msgid "Processes" ++msgstr "Prosesser" ++ ++msgid "Processes Plugin Configuration" ++msgstr "Prosess plugin konfigurasjon" ++ ++msgid "Processes to monitor separated by space" ++msgstr "" ++ ++msgid "Processor" ++msgstr "Prosessor" ++ ++msgid "Qdisc monitoring" ++msgstr "Qdisc overvåking" ++ ++msgid "RRD XFiles Factor" ++msgstr "RRD XFiles Faktor" ++ ++msgid "RRD heart beat interval" ++msgstr "RRD \"heartbeat\" intervall" ++ ++msgid "RRD step interval" ++msgstr "RRD steg intervall" ++ ++msgid "RRDTool" ++msgstr "RRDTool" ++ ++msgid "RRDTool Plugin Configuration" ++msgstr "RRDTool plugin konfigursjon" ++ ++msgid "Rows per RRA" ++msgstr "Rader per RRA" ++ ++msgid "Script" ++msgstr "" ++ ++msgid "Seconds" ++msgstr "Sekunder" ++ ++msgid "Server host" ++msgstr "Server vert" ++ ++msgid "Server port" ++msgstr "Server port" ++ ++msgid "Shaping class monitoring" ++msgstr "Shaping class overvåking" ++ ++msgid "Socket file" ++msgstr "" ++ ++msgid "Socket group" ++msgstr "" ++ ++msgid "Socket permissions" ++msgstr "" ++ ++msgid "Source ip range" ++msgstr "Kilde ip område" ++ ++msgid "Specifies what information to collect about links." ++msgstr "" ++ ++msgid "Specifies what information to collect about routes." ++msgstr "" ++ ++msgid "Specifies what information to collect about the global topology." ++msgstr "" ++ ++msgid "Splash Leases" ++msgstr "" ++ ++msgid "Splash Leases Plugin Configuration" ++msgstr "" ++ ++msgid "Statistics" ++msgstr "Statistikk" ++ ++msgid "Storage directory" ++msgstr "Lagrings katalog" ++ ++msgid "Storage directory for the csv files" ++msgstr "Katalog for lagring av CSV filer" ++ ++msgid "Store data values as rates instead of absolute values" ++msgstr "Lagre dataverdier som rater i stedet for absolutte verdier" ++ ++msgid "Stored timespans" ++msgstr "Lagrede tidsperioder" ++ ++msgid "System Load" ++msgstr "System Belastning" ++ ++msgid "System plugins" ++msgstr "System plugins" ++ ++msgid "TCP Connections" ++msgstr "TCP Forbindelser" ++ ++msgid "TCPConns Plugin Configuration" ++msgstr "TCPConns plugin konfigurasjon" ++ ++msgid "TTL for network packets" ++msgstr "TTL for nettverkspakker" ++ ++msgid "TTL for ping packets" ++msgstr "TTL for ping pakker" ++ ++msgid "Table" ++msgstr "Tabell" ++ ++msgid "The NUT plugin reads information about Uninterruptible Power Supplies." ++msgstr "" ++ ++msgid "" ++"The OLSRd plugin reads information about meshed networks from the txtinfo " ++"plugin of OLSRd." ++msgstr "" ++ ++msgid "" ++"The conntrack plugin collects statistics about the number of tracked " ++"connections." ++msgstr "" ++ ++msgid "The cpu plugin collects basic statistics about the processor usage." ++msgstr "CPU plugin samler grunnleggende statistikk om prosessor bruk." ++ ++msgid "" ++"The csv plugin stores collected data in csv file format for further " ++"processing by external programs." ++msgstr "" ++"CSV plugin lagrer de innsamlede dataene i CSV format for videre bearbeiding " ++"av eksterne programmer." ++ ++msgid "" ++"The df plugin collects statistics about the disk space usage on different " ++"devices, mount points or filesystem types." ++msgstr "" ++"DF plugin samler statistikk om disker på forskjellige enheter, monterings " ++"punkter eller filsystem typer." ++ ++msgid "" ++"The disk plugin collects detailled usage statistics for selected partitions " ++"or whole disks." ++msgstr "" ++"Disk plugin samler detaljert brukerstatistikk for utvalgte partisjoner og " ++"hele disker." ++ ++msgid "" ++"The dns plugin collects detailled statistics about dns related traffic on " ++"selected interfaces." ++msgstr "" ++"DNS pluging samler detaljert statistikk om DNS relatert trafikk på utvalgte " ++"grensesnitt." ++ ++msgid "" ++"The email plugin creates a unix socket which can be used to transmit email-" ++"statistics to a running collectd daemon. This plugin is primarily intended " ++"to be used in conjunction with Mail::SpamAssasin::Plugin::Collectd but can " ++"be used in other ways as well." ++msgstr "" ++"E-Post plugin skaper en unix socket som kan brukes til å sende e-post " ++"statistikk til en kjørende collectd daemon. Denne plugin er primært ment å " ++"bli brukt i forbindelse med Mail::SpamAssasin::Plugin::Collectd men kan også " ++"brukes på andre måter." ++ ++msgid "" ++"The exec plugin starts external commands to read values from or to notify " ++"external processes when certain threshold values have been reached." ++msgstr "" ++"Program plugin starter eksterne kommandoer for å lese verdier fra de, eller " ++"for å varsle eksterne prosesser når visse grenseverdier er blitt nådd." ++ ++msgid "" ++"The interface plugin collects traffic statistics on selected interfaces." ++msgstr "Grensesnitt plugin samler trafikk statistikk på utvalgte grensesnitt." ++ ++msgid "" ++"The iptables plugin will monitor selected firewall rules and collect " ++"informations about processed bytes and packets per rule." ++msgstr "" ++"Iptables plugin vil overvåke utvalgte brannmurregler og samle informasjon om " ++"bearbeidet data per regel." ++ ++msgid "" ++"The irq plugin will monitor the rate of issues per second for each selected " ++"interrupt. If no interrupt is selected then all interrupts are monitored." ++msgstr "" ++"IRQ plugin vil overvåke hastigheten på forespørsler per sekund for hver " ++"valgte avbrudd. Hvis ingen avbrudd er valgt vil alle avbrudd bli overvåket." ++ ++msgid "" ++"The iwinfo plugin collects statistics about wireless signal strength, noise " ++"and quality." ++msgstr "" ++ ++msgid "The load plugin collects statistics about the general system load." ++msgstr "Belastning plugin samler statistikk systemets belastning." ++ ++msgid "The memory plugin collects statistics about the memory usage." ++msgstr "" ++ ++msgid "" ++"The netlink plugin collects extended informations like qdisc-, class- and " ++"filter-statistics for selected interfaces." ++msgstr "" ++"Netlink plugin samler utvidet informasjon som qdisc-, klasse- og filter-" ++"statistikk for utvalgte grensesnitt." ++ ++msgid "" ++"The network plugin provides network based communication between different " ++"collectd instances. Collectd can operate both in client and server mode. In " ++"client mode locally collected data is transferred to a collectd server " ++"instance, in server mode the local instance receives data from other hosts." ++msgstr "" ++"Nettverk plugin gir nettverk basert kommunikasjon mellom ulike collectd " ++"forekomster. Collectd kan operere i både klient og server modus. I " ++"klientmodus blir lokalt innsamlede data overført til en collectd server. I " ++"server modus mottar enheten data fra andre klienter." ++ ++msgid "" ++"The ping plugin will send icmp echo replies to selected hosts and measure " ++"the roundtrip time for each host." ++msgstr "" ++"Ping plugin sender icmp echo svar til utvalgte verter og måle tiden en " ++"rundtur tar for hver vert." ++ ++msgid "" ++"The processes plugin collects informations like cpu time, page faults and " ++"memory usage of selected processes." ++msgstr "" ++"Prosess plugin samler informasjon som f.eks. CPU tid, sidefeil og minnebruk " ++"for utvalgte prosesser." ++ ++msgid "" ++"The rrdtool plugin stores the collected data in rrd database files, the " ++"foundation of the diagrams.

    Warning: Setting the wrong " ++"values will result in a very high memory consumption in the temporary " ++"directory. This can render the device unusable!" ++msgstr "" ++"RRDTool plugin lagrer innsamlede data i rrd databasefiler som er grunnlaget " ++"for diagrammene.

    Advarsel: Innsetting av feile verdier " ++"vil kunne resultere i et svært høyt minneforbruk i den midlertidige " ++"katalogen (temp). Dette kan gjøre enheten ubrukelig!" ++ ++msgid "" ++"The splash leases plugin uses libuci to collect statistics about splash " ++"leases." ++msgstr "" ++ ++msgid "" ++"The statistics package is based on Collectd and uses RRD " ++"Tool to render diagram images from collected data." ++msgstr "" ++"Statistikk pakken er basert pÃ¥ Collectd og bruker RRD " ++"Tool for Ã¥ tegne diagram bilder fra innsamlede data." ++ ++msgid "" ++"The tcpconns plugin collects informations about open tcp connections on " ++"selected ports." ++msgstr "" ++"Tcpconns plugin samler informasjon om Ã¥pne TCP tilkoblinger pÃ¥ utvalgte " ++"porter." ++ ++msgid "" ++"The unixsock plugin creates a unix socket which can be used to read " ++"collected data from a running collectd instance." ++msgstr "" ++"Unixsock plugin skaper en unix socket som kan brukes til Ã¥ lese innsamlet " ++"data fra collectd prosess." ++ ++msgid "The uptime plugin collects statistics about the uptime of the system." ++msgstr "" ++ ++msgid "" ++"This section defines on which interfaces collectd will wait for incoming " ++"connections." ++msgstr "" ++"Denne seksjonen definerer hvilke grensesnitt collectd vil lytte pÃ¥ for " ++"innkommende tilkoblinger." ++ ++msgid "" ++"This section defines to which servers the locally collected data is sent to." ++msgstr "" ++"Denne seksjonen definerer hvilke servere de lokalt innsamlede data blir " ++"sendt til." ++ ++msgid "Try to lookup fully qualified hostname" ++msgstr "Prøv Ã¥ søk etter fullstendig vertsnavn" ++ ++msgid "UPS" ++msgstr "" ++ ++msgid "UPS Plugin Configuration" ++msgstr "" ++ ++msgid "UPS name in NUT ups@host format" ++msgstr "" ++ ++msgid "UnixSock" ++msgstr "UnixSock" ++ ++msgid "Unixsock Plugin Configuration" ++msgstr "Unixsock plugin konfigurasjon" ++ ++msgid "Uptime" ++msgstr "" ++ ++msgid "Uptime Plugin Configuration" ++msgstr "" ++ ++msgid "Used PID file" ++msgstr "Brukt PID fil" ++ ++msgid "User" ++msgstr "" ++ ++msgid "Verbose monitoring" ++msgstr "Detaljert overvÃ¥king" ++ ++msgid "Wireless" ++msgstr "TrÃ¥dløs" ++ ++msgid "Wireless iwinfo Plugin Configuration" ++msgstr "" ++ ++msgid "e.g. br-ff" ++msgstr "f.eks. br-ff" ++ ++msgid "e.g. br-lan" ++msgstr "f.eks. br-lan" ++ ++msgid "e.g. reject-with tcp-reset" ++msgstr "f.eks. forkast med tcp-reset" ++ ++msgid "max. 16 chars" ++msgstr "maks. 16 tegn" ++ ++msgid "reduces rrd size" ++msgstr "reduserer RRD størrelse" ++ ++msgid "seconds; multiple separated by space" ++msgstr "sekunder; flere adskilt med mellomrom" ++ ++msgid "server interfaces" ++msgstr "Server grensesnitt" ++ ++#~ msgid "Installed network plugins:" ++#~ msgstr "Installerte nettverks plugin:" ++ ++#~ msgid "Installed output plugins:" ++#~ msgstr "Installerte utdata plugin:" ++ ++#~ msgid "" ++#~ "Network plugins are used to collect information about open tcp " ++#~ "connections, interface traffic, iptables rules etc." ++#~ msgstr "" ++#~ "Nettverks plugin er brukt til Ã¥ samle inn informasjon om Ã¥pne tcp " ++#~ "koblinger, trafikk over grensesnitt, iptables regler osv." ++ ++#~ msgid "" ++#~ "Output plugins provide different possibilities to store collected data. " ++#~ "It is possible to enable multiple plugin at one, for example to store " ++#~ "collected data in rrd databases and to transmit the data over the network " ++#~ "to other collectd instances." ++#~ msgstr "" ++#~ "Utdata plugins gir ulike muligheter til Ã¥ lagre innsamlede data. Det er " ++#~ "mulig Ã¥ aktivere flere pluginer pÃ¥ en, for eksempel for Ã¥ lagre " ++#~ "innsamlede data i RRD databaser og Ã¥ overføre data over nettverket til " ++#~ "andre collectd forekomster." ++ ++#~ msgid "" ++#~ "System plugins collecting values about system state and ressource usage " ++#~ "on the device.:" ++#~ msgstr "" ++#~ "System plugins samler verdier om systemets tilstand og ressurs-bruk.:" ++ ++#~ msgid "" ++#~ "The wireless plugin collects statistics about wireless signal strength, " ++#~ "noise and quality." ++#~ msgstr "" ++#~ "TrÃ¥dløs plugin samler statistikk om trÃ¥dløs signalstyrke, støy og " ++#~ "kvalitet." ++ ++#~ msgid "Wireless Plugin Configuration" ++#~ msgstr "TrÃ¥dløs plugin konfigurasjon" +diff --git a/feeds/luci/applications/luci-app-statistics/po/pl/rrdtool.po b/feeds/luci/applications/luci-app-statistics/po/pl/rrdtool.po +new file mode 100644 +index 0000000..bf451ec +--- /dev/null ++++ b/feeds/luci/applications/luci-app-statistics/po/pl/rrdtool.po +@@ -0,0 +1,360 @@ ++# rrdtool.pot ++# generated from ./applications/luci-statistics/luasrc/i18n/rrdtool.en.lua ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"PO-Revision-Date: 2012-08-31 11:06+0200\n" ++"Last-Translator: Staszek \n" ++"Language-Team: none\n" ++"Language: pl\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 " ++"|| n%100>=20) ? 1 : 2);\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++#. %H: Wireless - Signal Noise Ratio ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:1 ++msgid "stat_dg_title_wireless__signal_noise" ++msgstr "%H: Sieć bezprzewodowa - Poziom Szumów" ++ ++#. dBm ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:2 ++msgid "stat_dg_label_wireless__signal_noise" ++msgstr "dBm" ++ ++#. Noise Level ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:3 ++msgid "stat_ds_signal_noise" ++msgstr "Poziom szumów" ++ ++#. Signal Strength ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:4 ++msgid "stat_ds_signal_power" ++msgstr "Moc sygnaÅ‚u" ++ ++#. %H: Wireless - Signal Quality ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:5 ++msgid "stat_dg_title_wireless__signal_quality" ++msgstr "%H: Sieć bezprzewodowa - Jakość sygnaÅ‚u" ++ ++#. n ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:6 ++msgid "stat_dg_label_wireless__signal_quality" ++msgstr "n" ++ ++#. Signal Quality ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:7 ++msgid "stat_ds_signal_quality" ++msgstr "Jakość sygnaÅ‚u" ++ ++#. %H: ICMP Roundtrip Times ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:8 ++msgid "stat_dg_title_ping" ++msgstr "%H: ICMP - Czasy odpowiedzi" ++ ++#. ms ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:9 ++msgid "stat_dg_label_ping" ++msgstr "ms" ++ ++#. %di ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:10 ++msgid "stat_ds_ping" ++msgstr "%di" ++ ++#. %H: Firewall - Processed Packets ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:11 ++msgid "stat_dg_title_iptables__ipt_packets" ++msgstr "%H: Firewall - Przetworzone pakiety" ++ ++#. Packets/s ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:12 ++msgid "stat_dg_label_iptables__ipt_packets" ++msgstr "Pakiety/s" ++ ++#. Chain \"%di\" ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:13 ++msgid "stat_ds_ipt_packets" ++msgstr "ÅaÅ„cuch \"%di\"" ++ ++#. %H: Netlink - Transfer on %pi ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:14 ++msgid "stat_dg_title_netlink__if_octets" ++msgstr "%H: Netlink - Transfer przez %pi" ++ ++#. Bytes/s ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:15 ++msgid "stat_dg_label_netlink__if_octets" ++msgstr "Bajty/s" ++ ++#. Bytes (%ds) ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:16 ++msgid "stat_ds_if_octets" ++msgstr "Bajtów (%ds)" ++ ++#. %H: Netlink - Packets on %pi ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:17 ++msgid "stat_dg_title_netlink__if_packets" ++msgstr "%H: Netlink - Pakiety na %pi" ++ ++#. Packets/s ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:18 ++msgid "stat_dg_label_netlink__if_packets" ++msgstr "Pakiety/s" ++ ++#. Processed (%ds) ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:19 ++msgid "stat_ds_if_packets" ++msgstr "Przetworzone (%ds)" ++ ++#. Dropped (%ds) ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:20 ++msgid "stat_ds_if_dropped" ++msgstr "Odrzucone (%ds)" ++ ++#. Errors (%ds) ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:21 ++msgid "stat_ds_if_errors" ++msgstr "BÅ‚Ä™dy (%ds)" ++ ++#. %H: Netlink - Multicast on %pi ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:22 ++msgid "stat_dg_title_netlink__if_multicast" ++msgstr "%H: Netlink - Multicasty na %pi" ++ ++#. Packets/s ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:23 ++msgid "stat_dg_label_netlink__if_multicast" ++msgstr "Pakiety/s" ++ ++#. Packets ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:24 ++msgid "stat_ds_if_multicast" ++msgstr "Pakiety" ++ ++#. %H: Netlink - Collisions on %pi ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:25 ++msgid "stat_dg_title_netlink__if_collisions" ++msgstr "%H: Netlink - Kolizje na %pi" ++ ++#. Collisions/s ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:26 ++msgid "stat_dg_label_netlink__if_collisions" ++msgstr "Kolizje/s" ++ ++#. Collisions ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:27 ++msgid "stat_ds_if_collisions" ++msgstr "Kolizje" ++ ++#. %H: Netlink - Errors on %pi ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:28 ++msgid "stat_dg_title_netlink__if_tx_errors" ++msgstr "%H: Netlink - BÅ‚Ä™dy na %pi" ++ ++#. Errors/s ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:29 ++msgid "stat_dg_label_netlink__if_tx_errors" ++msgstr "BÅ‚Ä™dy/s" ++ ++#. %di ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:30 ++msgid "stat_ds_if_tx_errors" ++msgstr "%di" ++ ++#. %di ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:31 ++msgid "stat_ds_if_rx_errors" ++msgstr "%di" ++ ++#. %H: Processes ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:32 ++msgid "stat_dg_title_processes" ++msgstr "%H: Procesy" ++ ++#. Processes/s ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:33 ++msgid "stat_dg_label_processes" ++msgstr "Procesy/s" ++ ++#. %di ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:34 ++msgid "stat_ds_ps_state" ++msgstr "%di" ++ ++#. %H: Process %pi - used cpu time ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:35 ++msgid "stat_dg_title_processes__ps_cputime" ++msgstr "%H: Proces %pi - użyty czas Procesora" ++ ++#. Jiffies ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:36 ++msgid "stat_dg_label_processes__ps_cputime" ++msgstr "Jiffies" ++ ++#. system ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:37 ++msgid "stat_ds_ps_cputime__syst" ++msgstr "system" ++ ++#. user ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:38 ++msgid "stat_ds_ps_cputime__user" ++msgstr "użytkownik" ++ ++#. %H: Process %pi - threads and processes ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:39 ++msgid "stat_dg_title_processes__ps_count" ++msgstr "%H: Proces %pi - wÄ…tki i procesy" ++ ++#. Count ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:40 ++msgid "stat_dg_label_processes__ps_count" ++msgstr "Liczba" ++ ++#. %ds ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:41 ++msgid "stat_ds_ps_count" ++msgstr "%ds" ++ ++#. %H: Process %pi - page faults ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:42 ++msgid "stat_dg_title_processes__ps_pagefaults" ++msgstr "%H: Proces %pi - bÅ‚Ä™dy stronnicowania" ++ ++#. Pagefaults ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:43 ++msgid "stat_dg_label_processes__ps_pagefaults" ++msgstr "BÅ‚Ä™dy stronnicowania" ++ ++#. page faults ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:44 ++msgid "stat_ds_ps_pagefaults" ++msgstr "bÅ‚Ä™dy stronnicowania" ++ ++#. %H: Process %pi - virtual memory size ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:45 ++msgid "stat_dg_title_processes__ps_rss" ++msgstr "%H: Proces %pi - rozmiar pamiÄ™ci wirtualnej" ++ ++#. Bytes ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:46 ++msgid "stat_dg_label_processes__ps_rss" ++msgstr "Bajtów" ++ ++#. virtual memory ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:47 ++msgid "stat_ds_ps_rss" ++msgstr "pamięć wirtualna" ++ ++#. %H: Usage on Processor #%pi ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:48 ++msgid "stat_dg_title_cpu" ++msgstr "%H: Użycie Procesora #%pi" ++ ++#. % ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:49 ++msgid "stat_dg_label_cpu" ++msgstr "%" ++ ++#. %di ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:50 ++msgid "stat_ds_cpu" ++msgstr "%di" ++ ++#. %H: Transfer on %di ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:51 ++msgid "stat_dg_title_interface__if_octets" ++msgstr "%H: Transfer na %di" ++ ++#. Bytes/s ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:52 ++msgid "stat_dg_label_interface__if_octets" ++msgstr "Bajtów/s" ++ ++#. %H: Packets on %di ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:53 ++msgid "stat_dg_title_interface__if_packets" ++msgstr "%H: Pakietów na %di" ++ ++#. Packets/s ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:54 ++msgid "stat_dg_label_interface__if_packets" ++msgstr "Pakietów/s" ++ ++#. %H: TCP-Connections to Port %pi ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:55 ++msgid "stat_dg_title_tcpconns" ++msgstr "%H: TCP-poÅ‚Ä…czeÅ„ na port %pi" ++ ++#. Connections/s ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:56 ++msgid "stat_dg_label_tcpconns" ++msgstr "PoÅ‚Ä…czeÅ„/s" ++ ++#. %di ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:57 ++msgid "stat_ds_tcp_connections" ++msgstr "%di" ++ ++#. %H: Disk Space Usage on %di ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:58 ++msgid "stat_dg_title_df" ++msgstr "%H: Użycie przestrzeni dyskowej na %di" ++ ++#. Bytes ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:59 ++msgid "stat_dg_label_df" ++msgstr "Bajtów" ++ ++#. %ds ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:60 ++msgid "stat_ds_df__free" ++msgstr "%ds" ++ ++#. %ds ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:61 ++msgid "stat_ds_df__used" ++msgstr "%ds" ++ ++#. %H: Interrupts ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:62 ++msgid "stat_dg_title_irq" ++msgstr "%H: Przerwania" ++ ++#. Issues/s ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:63 ++msgid "stat_dg_label_irq" ++msgstr "Problem(y)" ++ ++#. IRQ %di ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:64 ++msgid "stat_ds_irq" ++msgstr "IRQ %di" ++ ++#. %H: System Load ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:65 ++msgid "stat_dg_title_load" ++msgstr "%H: Obciążenie Systemu" ++ ++#. Load ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:66 ++msgid "stat_dg_label_load" ++msgstr "Obciążenie" ++ ++#. 1 min ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:67 ++msgid "stat_ds_load__shortterm" ++msgstr "1 min" ++ ++#. 5 min ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:68 ++msgid "stat_ds_load__midterm" ++msgstr "5 min" ++ ++#. 15 min ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:69 ++msgid "stat_ds_load__longterm" ++msgstr "15 min" +diff --git a/feeds/luci/applications/luci-app-statistics/po/pl/statistics.po b/feeds/luci/applications/luci-app-statistics/po/pl/statistics.po +new file mode 100644 +index 0000000..de86176 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-statistics/po/pl/statistics.po +@@ -0,0 +1,719 @@ ++# statistics.pot ++# generated from ./applications/luci-statistics/luasrc/i18n/statistics.en.lua ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"PO-Revision-Date: 2014-07-02 19:52+0200\n" ++"Last-Translator: obsy \n" ++"Language-Team: none\n" ++"Language: pl\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 " ++"|| n%100>=20) ? 1 : 2);\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "Action (target)" ++msgstr "Akcja (cel)" ++ ++msgid "Add command for reading values" ++msgstr "Dodaj polecenie do odczytywania wartoÅ›ci" ++ ++msgid "Add matching rule" ++msgstr "Dodaj pasujÄ…cÄ… reguÅ‚Ä™" ++ ++msgid "Add multiple hosts separated by space." ++msgstr "Dodaj wiele hostów rozdzielonych spacjami." ++ ++msgid "Add notification command" ++msgstr "Dodaj komendÄ™ powiadamiajÄ…cÄ…" ++ ++msgid "Base Directory" ++msgstr "Główny katalog" ++ ++msgid "Basic monitoring" ++msgstr "Podstawowy monitoring" ++ ++msgid "CPU Plugin Configuration" ++msgstr "Konfiguracja CPU" ++ ++msgid "CSV Output" ++msgstr "WyjÅ›cie CSV" ++ ++msgid "CSV Plugin Configuration" ++msgstr "Konfiguracja CSV" ++ ++msgid "Cache collected data for" ++msgstr "Ciasteczka zbierane dla" ++ ++msgid "Cache flush interval" ++msgstr "OdstÄ™py czyszczenia cache" ++ ++msgid "Chain" ++msgstr "ÅaÅ„cuch" ++ ++msgid "CollectLinks" ++msgstr "CollectLinks" ++ ++msgid "CollectRoutes" ++msgstr "CollectRoutes" ++ ++msgid "CollectTopology" ++msgstr "CollectTopology" ++ ++msgid "Collectd" ++msgstr "Collectd" ++ ++msgid "Collectd Settings" ++msgstr "Ustawienia Collectd" ++ ++msgid "" ++"Collectd is a small daemon for collecting data from various sources through " ++"different plugins. On this page you can change general settings for the " ++"collectd daemon." ++msgstr "" ++"Collectd to maÅ‚y deomon do zbieranie danych z różnych źródeÅ‚ za pomocÄ… " ++"różnych wtyczek. Na tej stronie można zmienić ogólne ustawienia demona " ++"collectd." ++ ++msgid "Conntrack" ++msgstr "Conntrack" ++ ++msgid "Conntrack Plugin Configuration" ++msgstr "Konfiguracja wtyczki Conntrack" ++ ++msgid "DF Plugin Configuration" ++msgstr "Konfiguracja wtyczki DF" ++ ++msgid "DNS" ++msgstr "DNS" ++ ++msgid "DNS Plugin Configuration" ++msgstr "Konfiguracja wtyczki DNS" ++ ++msgid "Data collection interval" ++msgstr "OdstÄ™py zbierania danych" ++ ++msgid "Datasets definition file" ++msgstr "Zdefiniowany plik ustawieÅ„" ++ ++msgid "Destination ip range" ++msgstr "Zakres docelowych adresów IP" ++ ++msgid "Directory for collectd plugins" ++msgstr "Katalog wtyczek collectd" ++ ++msgid "Directory for sub-configurations" ++msgstr "Katalog podkonfiguracji" ++ ++msgid "Disk Plugin Configuration" ++msgstr "Konfiguracja wtyczki dysk" ++ ++msgid "Disk Space Usage" ++msgstr "Zużycie przestrzeni dyskowej" ++ ++msgid "Disk Usage" ++msgstr "Użycie dysku" ++ ++msgid "Display Host »" ++msgstr "WyÅ›wietl Host >" ++ ++msgid "Display timespan »" ++msgstr "PrzedziaÅ‚ czasu wyÅ›wietlania »" ++ ++msgid "E-Mail Plugin Configuration" ++msgstr "Konfiguracja wtyczki E-mail" ++ ++msgid "Email" ++msgstr "E-mail" ++ ++msgid "Enable this plugin" ++msgstr "WÅ‚Ä…cz tÄ™ wtyczkÄ™" ++ ++msgid "Exec" ++msgstr "Exec" ++ ++msgid "Exec Plugin Configuration" ++msgstr "Konfiguracja wtyczki Exec" ++ ++msgid "Filter class monitoring" ++msgstr "Monitorowanie filtra klas" ++ ++msgid "Firewall" ++msgstr "Firewall" ++ ++msgid "Flush cache after" ++msgstr "Opróżnić cache po" ++ ++msgid "Forwarding between listen and server addresses" ++msgstr "Przekazać przez sÅ‚uchacza na adres serwera" ++ ++msgid "Graphs" ++msgstr "Wykresy" ++ ++msgid "Group" ++msgstr "Grupa" ++ ++msgid "" ++"Here you can define external commands which will be started by collectd in " ++"order to read certain values. The values will be read from stdout." ++msgstr "" ++"Tutaj można zdefiniować zewnÄ™trzne komendy, które bÄ™dÄ… wÅ‚Ä…czane przez " ++"collectd, by odczytać konkretne wartoÅ›ci. BÄ™dÄ… one odczytywane z stdout." ++ ++msgid "" ++"Here you can define external commands which will be started by collectd when " ++"certain threshold values have been reached. The values leading to invokation " ++"will be feeded to the the called programs stdin." ++msgstr "" ++"Tutaj można zdefiniować zewnÄ™trzne komendy, które bÄ™dÄ… wÅ‚Ä…czane przez " ++"collectd, kiedy zostanÄ… osiÄ…gniÄ™te konkretne wartoÅ›ci progowe. WartoÅ›ci " ++"powodujÄ…ce wÅ‚Ä…czenie bÄ™dÄ… wysyÅ‚ane do programów przez stdin." ++ ++msgid "" ++"Here you can define various criteria by which the monitored iptables rules " ++"are selected." ++msgstr "" ++"Tutaj można zdefiniować różne kryteria wedÅ‚ug których wybierane sÄ… " ++"monitorowane reguÅ‚y iptables." ++ ++msgid "Host" ++msgstr "Host" ++ ++msgid "Hostname" ++msgstr "Nazwa hosta" ++ ++msgid "IP or hostname where to get the txtinfo output from" ++msgstr "Numer IP lub nazwa hosta jako wyjÅ›cie txtinfo" ++ ++msgid "IRQ Plugin Configuration" ++msgstr "Konfiguracja wtyczki IRQ" ++ ++msgid "Ignore source addresses" ++msgstr "Ignoruj adresy źródÅ‚owe" ++ ++msgid "Incoming interface" ++msgstr "Interfejs przychodzÄ…cy" ++ ++msgid "Interface Plugin Configuration" ++msgstr "Konfiguracja wtyczki Interfejs" ++ ++msgid "Interfaces" ++msgstr "Interfejsy" ++ ++msgid "Interrupts" ++msgstr "Przerwania" ++ ++msgid "Interval for pings" ++msgstr "OdstÄ™py dla pingów" ++ ++msgid "Iptables Plugin Configuration" ++msgstr "Konfiguracja wtyczki iptables" ++ ++msgid "Leave unselected to automatically determine interfaces to monitor." ++msgstr "" ++"Pozostaw niezaznaczone do automatycznego okreÅ›lenia interfejsu do " ++"monitorowania." ++ ++msgid "Listen host" ++msgstr "NasÅ‚uchuj host" ++ ++msgid "Listen port" ++msgstr "NasÅ‚uchuj port" ++ ++msgid "Listener interfaces" ++msgstr "Interfejsy nasÅ‚uchujÄ…cego" ++ ++msgid "Load Plugin Configuration" ++msgstr "Konfiguracja wtyczki Obciążenie" ++ ++msgid "Maximum allowed connections" ++msgstr "Maksymalna ilość poÅ‚Ä…czeÅ„" ++ ++msgid "Memory" ++msgstr "Pamięć" ++ ++msgid "Memory Plugin Configuration" ++msgstr "Konfiguracja wtyczki Pamięć" ++ ++msgid "Monitor all except specified" ++msgstr "Monitoruj wszystko oprócz podanych" ++ ++msgid "Monitor all local listen ports" ++msgstr "Monitoruj wszystkie lokalne otwarte porty" ++ ++msgid "Monitor devices" ++msgstr "Monitoruj urzÄ…dzenia" ++ ++msgid "Monitor disks and partitions" ++msgstr "Monitoruj dyski i partycje" ++ ++msgid "Monitor filesystem types" ++msgstr "Monitoruj system plików" ++ ++msgid "Monitor hosts" ++msgstr "Monitoruj hosty" ++ ++msgid "Monitor interfaces" ++msgstr "Monitoruj interfejsy" ++ ++msgid "Monitor interrupts" ++msgstr "Monitoruj przerwania" ++ ++msgid "Monitor local ports" ++msgstr "Monitoruj porty lokalne" ++ ++msgid "Monitor mount points" ++msgstr "Monitoruj punkty zamontowania" ++ ++msgid "Monitor processes" ++msgstr "Monitoruj procesy" ++ ++msgid "Monitor remote ports" ++msgstr "Monitoruj porty zdalne" ++ ++msgid "Name of the rule" ++msgstr "Nazwa tej reguÅ‚y" ++ ++msgid "Netlink" ++msgstr "Netlink" ++ ++msgid "Netlink Plugin Configuration" ++msgstr "Konfiguracja wtyczki Netlink" ++ ++msgid "Network" ++msgstr "Sieć" ++ ++msgid "Network Plugin Configuration" ++msgstr "Konfiguracja wtyczki Sieć" ++ ++msgid "Network plugins" ++msgstr "Wtyczki sieciowe" ++ ++msgid "Network protocol" ++msgstr "ProtokoÅ‚y sieciowe" ++ ++msgid "Number of threads for data collection" ++msgstr "Liczba wÄ…tków do zbierania danych" ++ ++msgid "OLSRd" ++msgstr "OLSRd" ++ ++msgid "OLSRd Plugin Configuration" ++msgstr "Konfiguracja wtyczki OLSRd" ++ ++msgid "Only create average RRAs" ++msgstr "Twórz tylko Å›rednie archiwa RRA" ++ ++msgid "Options" ++msgstr "Opcje" ++ ++msgid "Outgoing interface" ++msgstr "Interfejs wychodzÄ…cy" ++ ++msgid "Output plugins" ++msgstr "Pluginy wyjÅ›cia" ++ ++msgid "Ping" ++msgstr "Ping" ++ ++msgid "Ping Plugin Configuration" ++msgstr "Konfiguracja wtyczki Ping" ++ ++msgid "Port" ++msgstr "Port" ++ ++msgid "Processes" ++msgstr "Procesy" ++ ++msgid "Processes Plugin Configuration" ++msgstr "Konfiguracja wtyczki Procesy" ++ ++msgid "Processes to monitor separated by space" ++msgstr "Monitorowane procesy oddzielone spacjÄ…" ++ ++msgid "Processor" ++msgstr "Procesor" ++ ++msgid "Qdisc monitoring" ++msgstr "Monitorowanie Qdisc" ++ ++msgid "RRD XFiles Factor" ++msgstr "RRD XFiles Factor" ++ ++msgid "RRD heart beat interval" ++msgstr "RRD heart beat interval" ++ ++msgid "RRD step interval" ++msgstr "RRD Krok interval" ++ ++msgid "RRDTool" ++msgstr "RRDTool" ++ ++msgid "RRDTool Plugin Configuration" ++msgstr "Konfiguracja wtyczki RRDTool" ++ ++msgid "Rows per RRA" ++msgstr "Wierszy w archiwum RRA" ++ ++msgid "Script" ++msgstr "Skrypt" ++ ++msgid "Seconds" ++msgstr "Sekundy" ++ ++msgid "Server host" ++msgstr "Host serwer" ++ ++msgid "Server port" ++msgstr "Port serwera" ++ ++msgid "Shaping class monitoring" ++msgstr "Shaping Klasa Monitoring" ++ ++msgid "Socket file" ++msgstr "Plik Gniazdo" ++ ++msgid "Socket group" ++msgstr "Gniazdo Grupy" ++ ++msgid "Socket permissions" ++msgstr "Uprawnienia Gniazda" ++ ++msgid "Source ip range" ++msgstr "Zakres źródÅ‚owych adresów ip" ++ ++msgid "Specifies what information to collect about links." ++msgstr "OkreÅ›la jakie informacje zbierać o linkach." ++ ++msgid "Specifies what information to collect about routes." ++msgstr "OkreÅ›la jakie informacje zbierać o trasach." ++ ++msgid "Specifies what information to collect about the global topology." ++msgstr "OkreÅ›la jakie informacje zbierać o globalnej topologii." ++ ++msgid "Splash Leases" ++msgstr "" ++ ++msgid "Splash Leases Plugin Configuration" ++msgstr "" ++ ++msgid "Statistics" ++msgstr "Statystyki" ++ ++msgid "Storage directory" ++msgstr "Katalog przechowywania" ++ ++msgid "Storage directory for the csv files" ++msgstr "Katalog przechowywania plików csv" ++ ++msgid "Store data values as rates instead of absolute values" ++msgstr "" ++"Przechowuj wartoÅ›ci danych jako wskaźniki zamiast wartoÅ›ci bezwzglÄ™dnych" ++ ++msgid "Stored timespans" ++msgstr "Przechowywane okresy czasu" ++ ++msgid "System Load" ++msgstr "Obciążenie systemu" ++ ++msgid "System plugins" ++msgstr "Wtyczki systemowe" ++ ++msgid "TCP Connections" ++msgstr "PoÅ‚Ä…czenia TCP" ++ ++msgid "TCPConns Plugin Configuration" ++msgstr "Konfiguracja wtyczki PoÅ‚Ä…czenia TCP" ++ ++msgid "TTL for network packets" ++msgstr "TTL dla pakietów sieciowych" ++ ++msgid "TTL for ping packets" ++msgstr "TTL dla pakietów ping" ++ ++msgid "Table" ++msgstr "Tabela" ++ ++msgid "The NUT plugin reads information about Uninterruptible Power Supplies." ++msgstr "Wtyczka Nut Informuje o Nie przerywalnym Zasilaniu" ++ ++msgid "" ++"The OLSRd plugin reads information about meshed networks from the txtinfo " ++"plugin of OLSRd." ++msgstr "" ++"Wtyczka OLSRd odczytuje informacje o sieciach mesh z wtyczki txtinfo dla " ++"OLSRd." ++ ++msgid "" ++"The conntrack plugin collects statistics about the number of tracked " ++"connections." ++msgstr "Wtyczka Conntrack zbiera statystyki o liczbie Å›ledzonych poÅ‚Ä…czeÅ„." ++ ++msgid "The cpu plugin collects basic statistics about the processor usage." ++msgstr "Wtyczka CPU zbiera podstawowe statystyki o użyciu procesora" ++ ++msgid "" ++"The csv plugin stores collected data in csv file format for further " ++"processing by external programs." ++msgstr "" ++"Wtyczka CSV gromadzi zebrane dane w formacie plików csv do dalszej obróbki " ++"przez zewnÄ™trzne programy." ++ ++msgid "" ++"The df plugin collects statistics about the disk space usage on different " ++"devices, mount points or filesystem types." ++msgstr "" ++"Wtyczka \"df\" zbiera statystyki dotyczÄ…ce wykorzystania miejsca na różnych " ++"urzÄ…dzenia, dyskach i systemach plików." ++ ++msgid "" ++"The disk plugin collects detailled usage statistics for selected partitions " ++"or whole disks." ++msgstr "" ++"Wtyczka \"disk\" zbiera szczegółowe informacje z poszczególnych partycji lub " ++"caÅ‚ych dysków." ++ ++msgid "" ++"The dns plugin collects detailled statistics about dns related traffic on " ++"selected interfaces." ++msgstr "" ++"Wtyczka \"dns\" zbiera statystyki odnoÅ›nie ruchu DNS dla wybranych " ++"interfejsów." ++ ++msgid "" ++"The email plugin creates a unix socket which can be used to transmit email-" ++"statistics to a running collectd daemon. This plugin is primarily intended " ++"to be used in conjunction with Mail::SpamAssasin::Plugin::Collectd but can " ++"be used in other ways as well." ++msgstr "" ++"Wtyczka Email Tworzy gniazdo w unix do transmisji statystyki-poczty do " ++"demona collectd. This plugin is primarily intended to be used in conjunction " ++"with Mail::SpamAssasin::Plugin::Collectd but can be used in other ways as " ++"well." ++ ++msgid "" ++"The exec plugin starts external commands to read values from or to notify " ++"external processes when certain threshold values have been reached." ++msgstr "" ++"Wtyczka Exec startuje zewnÄ™tznÄ… komendÄ™ do czytnika values z lub do procesu " ++"zewnÄ™trznego powiadomienia gdy wartość zostaÅ‚a zmieniona" ++ ++msgid "" ++"The interface plugin collects traffic statistics on selected interfaces." ++msgstr "Wtyczka \"interface\" zbiera statystyki z wybranych interfejsów." ++ ++msgid "" ++"The iptables plugin will monitor selected firewall rules and collect " ++"informations about processed bytes and packets per rule." ++msgstr "" ++"Wtyczka \"iptables\" monitoruje wybrane reguÅ‚y firewalla i zbiera statystyki " ++"o procesach, bajtach i pakietach przypadajÄ…cych na danÄ… reguÅ‚Ä™." ++ ++msgid "" ++"The irq plugin will monitor the rate of issues per second for each selected " ++"interrupt. If no interrupt is selected then all interrupts are monitored." ++msgstr "" ++"Wtyczka \"irq\" monitoruje liczbÄ™ przerwaÅ„ na sekundÄ™ dla każdego wybranego " ++"przerwania. JeÅ›li nie wybrano żadnego przerwania, monitoruje wszystkie." ++ ++msgid "" ++"The iwinfo plugin collects statistics about wireless signal strength, noise " ++"and quality." ++msgstr "" ++"Wtyczka \"iwinfo\" zbiera statystyki o sygnale, zakłóceniach i jakoÅ›ci sieci " ++"WiFi." ++ ++msgid "The load plugin collects statistics about the general system load." ++msgstr "Wtyczka \"load\" zbiera statystyki o ogólnych obciążeniu systemu." ++ ++msgid "The memory plugin collects statistics about the memory usage." ++msgstr "Wtyczka \"memory\" zbiera statystyki dotyczÄ…ce wykorzystania pamiÄ™ci." ++ ++msgid "" ++"The netlink plugin collects extended informations like qdisc-, class- and " ++"filter-statistics for selected interfaces." ++msgstr "" ++"Wtyczki netlink zbiera rozszerzone informacje statystyk z qdisc-, klasa- i " ++"filter- dla wybranych interfejsów." ++ ++msgid "" ++"The network plugin provides network based communication between different " ++"collectd instances. Collectd can operate both in client and server mode. In " ++"client mode locally collected data is transferred to a collectd server " ++"instance, in server mode the local instance receives data from other hosts." ++msgstr "" ++"Wtyczka zapewnia podstawowÄ… komunikacje miÄ™dzy różnymi instancjami collectd. " ++"Collectd może pracować zarówno w trybie klienta i serwera. W trybie klienta " ++"lokalnie zebrane dane przenosi siÄ™ do instancji serwera collectd, w trybie " ++"serwera lokalnego instancja odbiera dane z innych komputerów." ++ ++msgid "" ++"The ping plugin will send icmp echo replies to selected hosts and measure " ++"the roundtrip time for each host." ++msgstr "" ++"Wtyczka \"ping\" wysyÅ‚a komunikaty icmp i nasÅ‚uchuje odpowiedzi z wybranych " ++"hostów oraz mierzy czasy odpowiedzi zwrotnych dla każdego z nich." ++ ++msgid "" ++"The processes plugin collects informations like cpu time, page faults and " ++"memory usage of selected processes." ++msgstr "" ++"Wtyczki processes zbiera informacje o czasie procesora, bÅ‚Ä™dach strony i " ++"pamiÄ™ci wybranych procesów." ++ ++msgid "" ++"The rrdtool plugin stores the collected data in rrd database files, the " ++"foundation of the diagrams.

    Warning: Setting the wrong " ++"values will result in a very high memory consumption in the temporary " ++"directory. This can render the device unusable!" ++msgstr "" ++"Wtyczki rrdtool przechowuje zebrane dane w plikach RRD, które są " ++"wykorzystywane do tworzenia diagramów.

    Ostrzeżenie:. " ++"Ustawianie błędnej wartości może spowodować bardzo wysokie zużycie pamięci w " ++"katalogu tymczasowym. Może to sprawić, że urządzenie nie będzie nadawało się " ++"do użytku! " ++ ++msgid "" ++"The splash leases plugin uses libuci to collect statistics about splash " ++"leases." ++msgstr "" ++ ++msgid "" ++"The statistics package is based on Collectd and uses RRD " ++"Tool to render diagram images from collected data." ++msgstr "" ++"Statystyki bazuja na Collectd oraz wykorzystują RRD Tool " ++"do generowania diagramów i wykresów z zebranych danych." ++ ++msgid "" ++"The tcpconns plugin collects informations about open tcp connections on " ++"selected ports." ++msgstr "" ++"Wtyczka \"tcpconns\" zbiera informacje o otwartych połączeniach tcp dla " ++"wybranych portów." ++ ++msgid "" ++"The unixsock plugin creates a unix socket which can be used to read " ++"collected data from a running collectd instance." ++msgstr "" ++"Wtyczka unixsock tworzy socket unix, który może być używany do odczytu " ++"danych zebranych z bieżącej instancji collectd." ++ ++msgid "The uptime plugin collects statistics about the uptime of the system." ++msgstr "" ++ ++msgid "" ++"This section defines on which interfaces collectd will wait for incoming " ++"connections." ++msgstr "" ++"Sekcja ta definiuje interfejsy na którym collectd będzie czekać na " ++"połączenia przychodzące." ++ ++msgid "" ++"This section defines to which servers the locally collected data is sent to." ++msgstr "Ta sekcja określa do jakich serwerów zebrane dane zostaną wysłane." ++ ++msgid "Try to lookup fully qualified hostname" ++msgstr "Spróbuj znaleźć pełną nazwę hosta" ++ ++msgid "UPS" ++msgstr "UPS" ++ ++msgid "UPS Plugin Configuration" ++msgstr "Plugin Konfiguracji UPS" ++ ++msgid "UPS name in NUT ups@host format" ++msgstr "Format nazwa UPS w NUT ups@host" ++ ++msgid "UnixSock" ++msgstr "UnixSock" ++ ++msgid "Unixsock Plugin Configuration" ++msgstr "Konfiguracja wtyczki UnixSock" ++ ++msgid "Uptime" ++msgstr "" ++ ++msgid "Uptime Plugin Configuration" ++msgstr "" ++ ++msgid "Used PID file" ++msgstr "Używany plik PID" ++ ++msgid "User" ++msgstr "Użytkownik" ++ ++msgid "Verbose monitoring" ++msgstr "Pełny monitoring" ++ ++msgid "Wireless" ++msgstr "WiFi" ++ ++msgid "Wireless iwinfo Plugin Configuration" ++msgstr "Konfiguracja bezprzewodowego pluginu iwinfo" ++ ++msgid "e.g. br-ff" ++msgstr "np. br-ff" ++ ++msgid "e.g. br-lan" ++msgstr "np. br-lan" ++ ++msgid "e.g. reject-with tcp-reset" ++msgstr "np. reject-with tcp-reset" ++ ++msgid "max. 16 chars" ++msgstr "max. 16 znaków" ++ ++msgid "reduces rrd size" ++msgstr "zmniejsza rozmiar RRD" ++ ++msgid "seconds; multiple separated by space" ++msgstr "sekundy; wielokrotnie oddzielone spacją" ++ ++msgid "server interfaces" ++msgstr "interfejsy serwera" ++ ++#~ msgid "Installed network plugins:" ++#~ msgstr "Zainstalowane wtyczki sieciowe:" ++ ++#~ msgid "Installed output plugins:" ++#~ msgstr "Zainstalowane wtyczki wyjścia:" ++ ++#~ msgid "" ++#~ "Network plugins are used to collect information about open tcp " ++#~ "connections, interface traffic, iptables rules etc." ++#~ msgstr "" ++#~ "Wtyczki sieciowe służą do zbierania informacji o otwartych połączeniach " ++#~ "TCP, ruchu sieciowym na danym interfejsie, regułach iptables itp." ++ ++#~ msgid "" ++#~ "Output plugins provide different possibilities to store collected data. " ++#~ "It is possible to enable multiple plugin at one, for example to store " ++#~ "collected data in rrd databases and to transmit the data over the network " ++#~ "to other collectd instances." ++#~ msgstr "" ++#~ "Pluginy wyjścia dostarczają różnych możliwości przechowywania " ++#~ "zgromadzonych danych. Można włączyć wiele pluginów naraz, na przykład " ++#~ "przechowywać dane w bazach danych RRD i wysyłać je do innych instancji " ++#~ "collectd w sieci." ++ ++#~ msgid "" ++#~ "System plugins collecting values about system state and ressource usage " ++#~ "on the device.:" ++#~ msgstr "" ++#~ "Wtyczki systemowe zbierają wartości o stanie systemu i użyciu zasobów " ++#~ "urządzenia.:" ++ ++#~ msgid "" ++#~ "The wireless plugin collects statistics about wireless signal strength, " ++#~ "noise and quality." ++#~ msgstr "" ++#~ "Wtyczka \"wireless\" zbiera dane o sile sygnału, zakłóceniach i jakości " ++#~ "WiFi." ++ ++#~ msgid "Wireless Plugin Configuration" ++#~ msgstr "konfiguracja wtyczki WiFi" +diff --git a/feeds/luci/applications/luci-app-statistics/po/pt-br/rrdtool.po b/feeds/luci/applications/luci-app-statistics/po/pt-br/rrdtool.po +new file mode 100644 +index 0000000..510b4a8 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-statistics/po/pt-br/rrdtool.po +@@ -0,0 +1,359 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Report-Msgid-Bugs-To: \n" ++"POT-Creation-Date: 2009-05-19 19:36+0200\n" ++"PO-Revision-Date: 2011-10-11 21:17+0200\n" ++"Last-Translator: Luiz Angelo \n" ++"Language-Team: LANGUAGE \n" ++"Language: pt_BR\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n > 1);\n" ++"X-Generator: Pootle 2.0.4\n" ++ ++#. %H: Wireless - Signal Noise Ratio ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:1 ++msgid "stat_dg_title_wireless__signal_noise" ++msgstr "%H: Wireless - Relação Sinal/Ruido" ++ ++#. dBm ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:2 ++msgid "stat_dg_label_wireless__signal_noise" ++msgstr "dBm" ++ ++#. Noise Level ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:3 ++msgid "stat_ds_signal_noise" ++msgstr "Nivel de Ruído" ++ ++#. Signal Strength ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:4 ++msgid "stat_ds_signal_power" ++msgstr "Força do Sinal" ++ ++#. %H: Wireless - Signal Quality ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:5 ++msgid "stat_dg_title_wireless__signal_quality" ++msgstr "%H: Wireless - Qualidade do Sinal" ++ ++#. n ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:6 ++msgid "stat_dg_label_wireless__signal_quality" ++msgstr "n" ++ ++#. Signal Quality ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:7 ++msgid "stat_ds_signal_quality" ++msgstr "Qualidade do Sinal" ++ ++#. %H: ICMP Roundtrip Times ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:8 ++msgid "stat_dg_title_ping" ++msgstr "%H: Tempo de resposta ICMP" ++ ++#. ms ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:9 ++msgid "stat_dg_label_ping" ++msgstr "ms" ++ ++#. %di ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:10 ++msgid "stat_ds_ping" ++msgstr "%di" ++ ++#. %H: Firewall - Processed Packets ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:11 ++msgid "stat_dg_title_iptables__ipt_packets" ++msgstr "%H: Firewall - Pacotes Processados" ++ ++#. Packets/s ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:12 ++msgid "stat_dg_label_iptables__ipt_packets" ++msgstr "Pacote/s" ++ ++#. Chain \"%di\" ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:13 ++msgid "stat_ds_ipt_packets" ++msgstr "Cadeia \"%di\"" ++ ++#. %H: Netlink - Transfer on %pi ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:14 ++msgid "stat_dg_title_netlink__if_octets" ++msgstr "%H: Netlink - Transferência na %pi" ++ ++#. Bytes/s ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:15 ++msgid "stat_dg_label_netlink__if_octets" ++msgstr "Bytes/s" ++ ++#. Bytes (%ds) ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:16 ++msgid "stat_ds_if_octets" ++msgstr "Bytes (%ds)" ++ ++#. %H: Netlink - Packets on %pi ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:17 ++msgid "stat_dg_title_netlink__if_packets" ++msgstr "%H: Netlink - Pacotes na %pi" ++ ++#. Packets/s ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:18 ++msgid "stat_dg_label_netlink__if_packets" ++msgstr "Packets/s" ++ ++#. Processed (%ds) ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:19 ++msgid "stat_ds_if_packets" ++msgstr "Processado (%ds)" ++ ++#. Dropped (%ds) ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:20 ++msgid "stat_ds_if_dropped" ++msgstr "Descartados (%ds)" ++ ++#. Errors (%ds) ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:21 ++msgid "stat_ds_if_errors" ++msgstr "Erros (%ds)" ++ ++#. %H: Netlink - Multicast on %pi ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:22 ++msgid "stat_dg_title_netlink__if_multicast" ++msgstr "%H: Netlink - Multicast na %pi" ++ ++#. Packets/s ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:23 ++msgid "stat_dg_label_netlink__if_multicast" ++msgstr "Pacote/s" ++ ++#. Packets ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:24 ++msgid "stat_ds_if_multicast" ++msgstr "Pacotes" ++ ++#. %H: Netlink - Collisions on %pi ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:25 ++msgid "stat_dg_title_netlink__if_collisions" ++msgstr "%H: Netlink - Colisões na %pi" ++ ++#. Collisions/s ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:26 ++msgid "stat_dg_label_netlink__if_collisions" ++msgstr "Colisão(es)" ++ ++#. Collisions ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:27 ++msgid "stat_ds_if_collisions" ++msgstr "Colisões" ++ ++#. %H: Netlink - Errors on %pi ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:28 ++msgid "stat_dg_title_netlink__if_tx_errors" ++msgstr "%H: Netlink - Erros na %pi" ++ ++#. Errors/s ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:29 ++msgid "stat_dg_label_netlink__if_tx_errors" ++msgstr "Erro/s" ++ ++#. %di ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:30 ++msgid "stat_ds_if_tx_errors" ++msgstr "%di" ++ ++#. %di ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:31 ++msgid "stat_ds_if_rx_errors" ++msgstr "%di" ++ ++#. %H: Processes ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:32 ++msgid "stat_dg_title_processes" ++msgstr "%H: Processos" ++ ++#. Processes/s ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:33 ++msgid "stat_dg_label_processes" ++msgstr "Processo/s" ++ ++#. %di ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:34 ++msgid "stat_ds_ps_state" ++msgstr "%di" ++ ++#. %H: Process %pi - used cpu time ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:35 ++msgid "stat_dg_title_processes__ps_cputime" ++msgstr "%H: Processo %pi - tempo usado da cpu" ++ ++#. Jiffies ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:36 ++msgid "stat_dg_label_processes__ps_cputime" ++msgstr "Jiffies" ++ ++#. system ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:37 ++msgid "stat_ds_ps_cputime__syst" ++msgstr "sistema" ++ ++#. user ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:38 ++msgid "stat_ds_ps_cputime__user" ++msgstr "usuário" ++ ++#. %H: Process %pi - threads and processes ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:39 ++msgid "stat_dg_title_processes__ps_count" ++msgstr "%H: Processo %pi - threads e processos" ++ ++#. Count ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:40 ++msgid "stat_dg_label_processes__ps_count" ++msgstr "Contagem" ++ ++#. %ds ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:41 ++msgid "stat_ds_ps_count" ++msgstr "%ds" ++ ++#. %H: Process %pi - page faults ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:42 ++msgid "stat_dg_title_processes__ps_pagefaults" ++msgstr "%H: Processo %pi - pagina de erros" ++ ++#. Pagefaults ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:43 ++msgid "stat_dg_label_processes__ps_pagefaults" ++msgstr "Pagina de erros" ++ ++#. page faults ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:44 ++msgid "stat_ds_ps_pagefaults" ++msgstr "pagina de erros" ++ ++#. %H: Process %pi - virtual memory size ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:45 ++msgid "stat_dg_title_processes__ps_rss" ++msgstr "%H: Processo %pi - tamanho da memória virtual" ++ ++#. Bytes ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:46 ++msgid "stat_dg_label_processes__ps_rss" ++msgstr "Bytes" ++ ++#. virtual memory ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:47 ++msgid "stat_ds_ps_rss" ++msgstr "memória virtual" ++ ++#. %H: Usage on Processor #%pi ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:48 ++msgid "stat_dg_title_cpu" ++msgstr "%H: Usado no Processado #%pi" ++ ++#. % ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:49 ++msgid "stat_dg_label_cpu" ++msgstr "%" ++ ++#. %di ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:50 ++msgid "stat_ds_cpu" ++msgstr "%di" ++ ++#. %H: Transfer on %di ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:51 ++msgid "stat_dg_title_interface__if_octets" ++msgstr "%H: Transferência na %di" ++ ++#. Bytes/s ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:52 ++msgid "stat_dg_label_interface__if_octets" ++msgstr "Bytes/s" ++ ++#. %H: Packets on %di ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:53 ++msgid "stat_dg_title_interface__if_packets" ++msgstr "%H: Pacotes na %di" ++ ++#. Packets/s ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:54 ++msgid "stat_dg_label_interface__if_packets" ++msgstr "Pacote/s" ++ ++#. %H: TCP-Connections to Port %pi ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:55 ++msgid "stat_dg_title_tcpconns" ++msgstr "%H: Ligações TCP na Porta %pi" ++ ++#. Connections/s ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:56 ++msgid "stat_dg_label_tcpconns" ++msgstr "Ligação(ões)" ++ ++#. %di ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:57 ++msgid "stat_ds_tcp_connections" ++msgstr "%di" ++ ++#. %H: Disk Space Usage on %di ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:58 ++msgid "stat_dg_title_df" ++msgstr "%H: Utilização de Espaço em Disco em %di" ++ ++#. Bytes ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:59 ++msgid "stat_dg_label_df" ++msgstr "Bytes" ++ ++#. %ds ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:60 ++msgid "stat_ds_df__free" ++msgstr "%ds" ++ ++#. %ds ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:61 ++msgid "stat_ds_df__used" ++msgstr "%ds" ++ ++#. %H: Interrupts ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:62 ++msgid "stat_dg_title_irq" ++msgstr "%H: Interrupções" ++ ++#. Issues/s ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:63 ++msgid "stat_dg_label_irq" ++msgstr "Erro/s" ++ ++#. IRQ %di ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:64 ++msgid "stat_ds_irq" ++msgstr "IRQ %di" ++ ++#. %H: System Load ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:65 ++msgid "stat_dg_title_load" ++msgstr "%H: Carga do Sistema" ++ ++#. Load ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:66 ++msgid "stat_dg_label_load" ++msgstr "Carga" ++ ++#. 1 min ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:67 ++msgid "stat_ds_load__shortterm" ++msgstr "1 min" ++ ++#. 5 min ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:68 ++msgid "stat_ds_load__midterm" ++msgstr "5 min" ++ ++#. 15 min ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:69 ++msgid "stat_ds_load__longterm" ++msgstr "15 min" +diff --git a/feeds/luci/applications/luci-app-statistics/po/pt-br/statistics.po b/feeds/luci/applications/luci-app-statistics/po/pt-br/statistics.po +new file mode 100644 +index 0000000..f7b6616 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-statistics/po/pt-br/statistics.po +@@ -0,0 +1,726 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Report-Msgid-Bugs-To: \n" ++"POT-Creation-Date: 2009-06-10 03:41+0200\n" ++"PO-Revision-Date: 2014-03-15 22:12+0200\n" ++"Last-Translator: Luiz Angelo \n" ++"Language-Team: LANGUAGE \n" ++"Language: pt_BR\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n > 1);\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "Action (target)" ++msgstr "Ação (destino)" ++ ++msgid "Add command for reading values" ++msgstr "Adicionar comando para leitura de valores" ++ ++msgid "Add matching rule" ++msgstr "Adicionar regra" ++ ++msgid "Add multiple hosts separated by space." ++msgstr "Adicione múltiplos equipamentos separados por espaço." ++ ++msgid "Add notification command" ++msgstr "Adicionar o comando de notificação" ++ ++msgid "Base Directory" ++msgstr "Diretório Base" ++ ++msgid "Basic monitoring" ++msgstr "Monitoramento básico" ++ ++msgid "CPU Plugin Configuration" ++msgstr "Configuração do plugin CPU" ++ ++msgid "CSV Output" ++msgstr "Saida CSV" ++ ++msgid "CSV Plugin Configuration" ++msgstr "Configuração do plugin CSV" ++ ++msgid "Cache collected data for" ++msgstr "Cache dos dados coletados" ++ ++msgid "Cache flush interval" ++msgstr "Intervalo de limpeza do cache" ++ ++msgid "Chain" ++msgstr "Cadeia" ++ ++msgid "CollectLinks" ++msgstr "Coleção de Links" ++ ++msgid "CollectRoutes" ++msgstr "Coleção de Rotas" ++ ++msgid "CollectTopology" ++msgstr "Coleção de Topologias" ++ ++msgid "Collectd" ++msgstr "Coletar" ++ ++msgid "Collectd Settings" ++msgstr "Configurações do Coletadas" ++ ++msgid "" ++"Collectd is a small daemon for collecting data from various sources through " ++"different plugins. On this page you can change general settings for the " ++"collectd daemon." ++msgstr "" ++"Collectd é um pequeno daemon que coleta dados de várias fontes através de " ++"diferentes plugins. Nesta página você pode alterar as configurações gerais " ++"do daemon collectd." ++ ++msgid "Conntrack" ++msgstr "Conntrack" ++ ++msgid "Conntrack Plugin Configuration" ++msgstr "Configuração do Plugin do Conntrack" ++ ++msgid "DF Plugin Configuration" ++msgstr "Configuração do plugin DF" ++ ++msgid "DNS" ++msgstr "DNS" ++ ++msgid "DNS Plugin Configuration" ++msgstr "Configuração do plugin DNS" ++ ++msgid "Data collection interval" ++msgstr "Intervalo da coleta de dados" ++ ++msgid "Datasets definition file" ++msgstr "Arquivo com a definição de dados" ++ ++msgid "Destination ip range" ++msgstr "Faixa IP de destino" ++ ++msgid "Directory for collectd plugins" ++msgstr "Diretório para os plugins do collectd" ++ ++msgid "Directory for sub-configurations" ++msgstr "Diretório para sub-configurações" ++ ++msgid "Disk Plugin Configuration" ++msgstr "Configuração do plugin Disco" ++ ++msgid "Disk Space Usage" ++msgstr "Utilização de espaço em disco" ++ ++msgid "Disk Usage" ++msgstr "Utilização do Disco" ++ ++msgid "Display Host »" ++msgstr "Mostrar Host" ++ ++msgid "Display timespan »" ++msgstr "Mostrar intervalo »" ++ ++msgid "E-Mail Plugin Configuration" ++msgstr "Configuração do plugin E-Mail" ++ ++msgid "Email" ++msgstr "Email" ++ ++msgid "Enable this plugin" ++msgstr "Habilitar este plugin" ++ ++msgid "Exec" ++msgstr "Exec" ++ ++msgid "Exec Plugin Configuration" ++msgstr "Configuração do plugin Exec" ++ ++msgid "Filter class monitoring" ++msgstr "Monitoramento das Classes de Filtros" ++ ++msgid "Firewall" ++msgstr "Firewall" ++ ++msgid "Flush cache after" ++msgstr "Limpar cache após" ++ ++msgid "Forwarding between listen and server addresses" ++msgstr "" ++"Encaminhamento entre o endereço de escuta e os endereços dos servidores" ++ ++msgid "Graphs" ++msgstr "Gráficos" ++ ++msgid "Group" ++msgstr "Grupo" ++ ++msgid "" ++"Here you can define external commands which will be started by collectd in " ++"order to read certain values. The values will be read from stdout." ++msgstr "" ++"Aqui você pode definir comandos externos que serão iniciados pelo collectd a " ++"fim de ler determinados valores. Os valores serão lidos a partir do stdout." ++ ++msgid "" ++"Here you can define external commands which will be started by collectd when " ++"certain threshold values have been reached. The values leading to invokation " ++"will be feeded to the the called programs stdin." ++msgstr "" ++"Aqui você pode definir os comandos externos que serão iniciados pelo " ++"collectd quando determinados valores limite forem atingidos. Os valores " ++"passados ao comando serão enviados para o stdin." ++ ++msgid "" ++"Here you can define various criteria by which the monitored iptables rules " ++"are selected." ++msgstr "" ++"Aqui você pode definir diversos critérios para as regras iptables " ++"selecionadas serem monitoradas." ++ ++msgid "Host" ++msgstr "Equipamento" ++ ++msgid "Hostname" ++msgstr "Hostname" ++ ++msgid "IP or hostname where to get the txtinfo output from" ++msgstr "Endereço IP ou nome do equipamento de onde obter a saída do txtinfo" ++ ++msgid "IRQ Plugin Configuration" ++msgstr "Configuração do plugin IRQ" ++ ++msgid "Ignore source addresses" ++msgstr "Ignorar endereços de origem" ++ ++msgid "Incoming interface" ++msgstr "Interface de entrada" ++ ++msgid "Interface Plugin Configuration" ++msgstr "Configuração do plugin Interface" ++ ++msgid "Interfaces" ++msgstr "Interfaces" ++ ++msgid "Interrupts" ++msgstr "Interrupções" ++ ++msgid "Interval for pings" ++msgstr "Intervalo para pings" ++ ++msgid "Iptables Plugin Configuration" ++msgstr "Configuração do plugin Iptables" ++ ++msgid "Leave unselected to automatically determine interfaces to monitor." ++msgstr "" ++"Deixe não selecionado para determinar automaticamente a interface a ser " ++"monitorada" ++ ++msgid "Listen host" ++msgstr "Endereço de escuta do Host" ++ ++msgid "Listen port" ++msgstr "Porta de escuta" ++ ++msgid "Listener interfaces" ++msgstr "Escutar na(s) interface(s)" ++ ++msgid "Load Plugin Configuration" ++msgstr "Configuração do plugin carga" ++ ++msgid "Maximum allowed connections" ++msgstr "Máximo de conexões permitidas" ++ ++msgid "Memory" ++msgstr "Memória" ++ ++msgid "Memory Plugin Configuration" ++msgstr "Configuração do Plugin da Memória" ++ ++msgid "Monitor all except specified" ++msgstr "Monitore tudo exceto se especificado" ++ ++msgid "Monitor all local listen ports" ++msgstr "Monitorar todas as portas locais" ++ ++msgid "Monitor devices" ++msgstr "Monitorar dispositivos" ++ ++msgid "Monitor disks and partitions" ++msgstr "Monitoras discos e partições" ++ ++msgid "Monitor filesystem types" ++msgstr "Monitorar tipos de sistemas de arquivos" ++ ++msgid "Monitor hosts" ++msgstr "Monitorar os equipamentos" ++ ++msgid "Monitor interfaces" ++msgstr "Monitorar interfaces" ++ ++msgid "Monitor interrupts" ++msgstr "Monitorar interrupções" ++ ++msgid "Monitor local ports" ++msgstr "Monitorar as portas locais" ++ ++msgid "Monitor mount points" ++msgstr "Monitorar pontos de montagem" ++ ++msgid "Monitor processes" ++msgstr "Monitorar processos" ++ ++msgid "Monitor remote ports" ++msgstr "Monitorar portas remotas" ++ ++msgid "Name of the rule" ++msgstr "Nome da regra" ++ ++msgid "Netlink" ++msgstr "Netlink" ++ ++msgid "Netlink Plugin Configuration" ++msgstr "Configuração do plugin Netlink" ++ ++msgid "Network" ++msgstr "Rede" ++ ++msgid "Network Plugin Configuration" ++msgstr "Configuração do plugin Rede" ++ ++msgid "Network plugins" ++msgstr "Plugins de rede" ++ ++msgid "Network protocol" ++msgstr "Protocolo de rede" ++ ++msgid "Number of threads for data collection" ++msgstr "Número de threads para o coletor de dados" ++ ++msgid "OLSRd" ++msgstr "OLSRd" ++ ++msgid "OLSRd Plugin Configuration" ++msgstr "Configuração do Plugin OLSRd" ++ ++msgid "Only create average RRAs" ++msgstr "Somente criar RRAs de média" ++ ++msgid "Options" ++msgstr "Opções" ++ ++msgid "Outgoing interface" ++msgstr "Interface de saída" ++ ++msgid "Output plugins" ++msgstr "Plugins de saída" ++ ++msgid "Ping" ++msgstr "Ping" ++ ++msgid "Ping Plugin Configuration" ++msgstr "Configuração do plugin Ping" ++ ++msgid "Port" ++msgstr "Porta" ++ ++msgid "Processes" ++msgstr "Processos" ++ ++msgid "Processes Plugin Configuration" ++msgstr "Configuração do plugin Processos" ++ ++msgid "Processes to monitor separated by space" ++msgstr "Processos para monitorar, separado por espaços" ++ ++msgid "Processor" ++msgstr "Processador" ++ ++msgid "Qdisc monitoring" ++msgstr "Monitoramento do Qdisc" ++ ++msgid "RRD XFiles Factor" ++msgstr "Fator RRD XFiles" ++ ++msgid "RRD heart beat interval" ++msgstr "Intervalo entre duas atualizações" ++ ++msgid "RRD step interval" ++msgstr "Intervalo de atualização" ++ ++msgid "RRDTool" ++msgstr "RRDTool" ++ ++msgid "RRDTool Plugin Configuration" ++msgstr "Configuração do plugin RRDTool" ++ ++msgid "Rows per RRA" ++msgstr "Linhas por RRA" ++ ++msgid "Script" ++msgstr "Script" ++ ++msgid "Seconds" ++msgstr "Segundos" ++ ++msgid "Server host" ++msgstr "Endereço do servidor" ++ ++msgid "Server port" ++msgstr "Porta do servidor" ++ ++msgid "Shaping class monitoring" ++msgstr "Monitoramento das Classes de Shaping" ++ ++msgid "Socket file" ++msgstr "Arquivo do socket" ++ ++msgid "Socket group" ++msgstr "Grupo do socket" ++ ++msgid "Socket permissions" ++msgstr "Permissões do socket" ++ ++msgid "Source ip range" ++msgstr "Faixa de IP de origem" ++ ++msgid "Specifies what information to collect about links." ++msgstr "Especifica quais informações serão coletadas sobre os enlaces." ++ ++msgid "Specifies what information to collect about routes." ++msgstr "Especifica quais informações serão coletadas sobre as rotas." ++ ++msgid "Specifies what information to collect about the global topology." ++msgstr "Especifica quais informações serão coletadas sobre a topologia global." ++ ++msgid "Splash Leases" ++msgstr "" ++ ++msgid "Splash Leases Plugin Configuration" ++msgstr "" ++ ++msgid "Statistics" ++msgstr "Estatística" ++ ++msgid "Storage directory" ++msgstr "Diretório de armazenamento" ++ ++msgid "Storage directory for the csv files" ++msgstr "Diretório para armazenamento dos arquivos csv" ++ ++msgid "Store data values as rates instead of absolute values" ++msgstr "Armazenar os valores dos dados como taxas em vez de valores absolutos" ++ ++msgid "Stored timespans" ++msgstr "Intervalos armazenados" ++ ++msgid "System Load" ++msgstr "Carga do Sistema" ++ ++msgid "System plugins" ++msgstr "Plugins de sistema" ++ ++msgid "TCP Connections" ++msgstr "Conexões TCP" ++ ++msgid "TCPConns Plugin Configuration" ++msgstr "Configuração do plugin TCPConns" ++ ++msgid "TTL for network packets" ++msgstr "TTL para os pacotes de rede" ++ ++msgid "TTL for ping packets" ++msgstr "TTL para os pacotes do ping" ++ ++msgid "Table" ++msgstr "Tabela" ++ ++msgid "The NUT plugin reads information about Uninterruptible Power Supplies." ++msgstr "O plugin NUT lê informações sobre Fontes de alimentação ininterruptas." ++ ++msgid "" ++"The OLSRd plugin reads information about meshed networks from the txtinfo " ++"plugin of OLSRd." ++msgstr "" ++"O plugin OLSRd lê informações sobre redes em malha (mesh) a partir do plugin " ++"txtinfo do OLSRd." ++ ++msgid "" ++"The conntrack plugin collects statistics about the number of tracked " ++"connections." ++msgstr "" ++"O plugin do conntrack coleta estatísticas sobre o número de conexões " ++"rastreadas." ++ ++msgid "The cpu plugin collects basic statistics about the processor usage." ++msgstr "" ++"O plugin cpu coleta as estatísticas básicas sobre o uso do processador." ++ ++msgid "" ++"The csv plugin stores collected data in csv file format for further " ++"processing by external programs." ++msgstr "" ++"O plugin csv armazena os dados coletados em um arquivo no formato csv para " ++"um futuro processamento por outros programas." ++ ++msgid "" ++"The df plugin collects statistics about the disk space usage on different " ++"devices, mount points or filesystem types." ++msgstr "" ++"O plugin df coleta estatísticas sobre a utilização de espaço em disco em " ++"diferentes dispositivos, pontos de montagem ou tipos de sistemas de arquivos." ++ ++msgid "" ++"The disk plugin collects detailled usage statistics for selected partitions " ++"or whole disks." ++msgstr "" ++"O plugin disco coleta estatísticas de uso detalhadas das partições " ++"selecionadas ou discos inteiros." ++ ++msgid "" ++"The dns plugin collects detailled statistics about dns related traffic on " ++"selected interfaces." ++msgstr "" ++"O plugin dns coleta estatísticas detalhadas sobre o tráfego do dns nas " ++"interfaces selecionadas." ++ ++msgid "" ++"The email plugin creates a unix socket which can be used to transmit email-" ++"statistics to a running collectd daemon. This plugin is primarily intended " ++"to be used in conjunction with Mail::SpamAssasin::Plugin::Collectd but can " ++"be used in other ways as well." ++msgstr "" ++"O plugin de email cria um socket unix que pode ser usado para transmitir " ++"estatísticas de email para o collectd. Este plugin é essencialmente " ++"destinado a ser utilizado em conjunto com o plugin Mail::SpamAssasin::" ++"Plugin::Collectd mas pode ser utilizado de outras maneiras também." ++ ++msgid "" ++"The exec plugin starts external commands to read values from or to notify " ++"external processes when certain threshold values have been reached." ++msgstr "" ++"O plugin exec inicia comandos externos para leitura de valores ou notificar " ++"processos externos quando um determinado valor limite for atingido." ++ ++msgid "" ++"The interface plugin collects traffic statistics on selected interfaces." ++msgstr "" ++"O plugin interface plugin coleta estatísticas sobre o tráfego das interfaces " ++"selecionadas." ++ ++msgid "" ++"The iptables plugin will monitor selected firewall rules and collect " ++"informations about processed bytes and packets per rule." ++msgstr "" ++"O plugin iptables irá monitorar as regras de firewall selecionadas e coletar " ++"informações sobre pacotes e bytes processados pela regra." ++ ++msgid "" ++"The irq plugin will monitor the rate of issues per second for each selected " ++"interrupt. If no interrupt is selected then all interrupts are monitored." ++msgstr "" ++"O plugin irq irá monitorar a taxa de ocorrências por segundo de cada " ++"interrupção selecionada. Se nenhuma interrupção for selecionada então todas " ++"as interrupções serão monitoradas." ++ ++msgid "" ++"The iwinfo plugin collects statistics about wireless signal strength, noise " ++"and quality." ++msgstr "" ++"O plugin iwinfo coleta estatísticas sobre a força, ruído e qualidade do " ++"sinal da rede sem fio." ++ ++msgid "The load plugin collects statistics about the general system load." ++msgstr "O plugin de carga coleta estatísticas gerais sobre a carga do sistema." ++ ++msgid "The memory plugin collects statistics about the memory usage." ++msgstr "O plugin de memória coleta estatísticas sobre o uso da memória." ++ ++msgid "" ++"The netlink plugin collects extended informations like qdisc-, class- and " ++"filter-statistics for selected interfaces." ++msgstr "" ++"O plugin Netlink coleta informações detalhadas como qdisc-, classe- e " ++"estatísticas de filtro das interfaces selecionadas." ++ ++msgid "" ++"The network plugin provides network based communication between different " ++"collectd instances. Collectd can operate both in client and server mode. In " ++"client mode locally collected data is transferred to a collectd server " ++"instance, in server mode the local instance receives data from other hosts." ++msgstr "" ++"O plugin rede fornece informações de rede baseadas na comunicação entre as " ++"diferentes instâncias do collectd. O Collectd pode operar tanto no modo " ++"cliente quanto no modo servidor. No modo cliente os dados coletados " ++"localmente são transferidos para um servidor collectd. No modo de servidor, " ++"o servidor local recebe os dados de outros servidores." ++ ++msgid "" ++"The ping plugin will send icmp echo replies to selected hosts and measure " ++"the roundtrip time for each host." ++msgstr "" ++"O plugin ping irá enviar pacotes ICMP to tipo echo aos equipamentos " ++"selecionados e medir o tempo de resposta para cada equipamento." ++ ++msgid "" ++"The processes plugin collects informations like cpu time, page faults and " ++"memory usage of selected processes." ++msgstr "" ++"O plugin de processos coleta informações como o tempo da cpu, falha de " ++"página e uso de memória dos processos selecionados." ++ ++msgid "" ++"The rrdtool plugin stores the collected data in rrd database files, the " ++"foundation of the diagrams.

    Warning: Setting the wrong " ++"values will result in a very high memory consumption in the temporary " ++"directory. This can render the device unusable!" ++msgstr "" ++"O plugin rrdtool armazena os dados coletados no arquivo de banco de dados " ++"rrd.

    Aviso: A má configuração desses valores, resultará " ++"em um valor muito elevado no consumo de memória no diretório temporário. " ++"Isso pode tornar o equipamento inutilizável!" ++ ++msgid "" ++"The splash leases plugin uses libuci to collect statistics about splash " ++"leases." ++msgstr "" ++ ++msgid "" ++"The statistics package is based on Collectd and uses RRD " ++"Tool to render diagram images from collected data." ++msgstr "" ++"As estatísticas são baseadas no Collectd e é utilizado o RRD Tool para renderização das imagens a partir dos dados coletados." ++ ++msgid "" ++"The tcpconns plugin collects informations about open tcp connections on " ++"selected ports." ++msgstr "" ++"O plugin tcpconns coleta informações sobre as conexões TCP abertas das " ++"portas selecionadas." ++ ++msgid "" ++"The unixsock plugin creates a unix socket which can be used to read " ++"collected data from a running collectd instance." ++msgstr "" ++"O plugin unixsock cria um socket unix, que pode ser usado para ler os dados " ++"coletados a partir de uma collectd em execução." ++ ++msgid "The uptime plugin collects statistics about the uptime of the system." ++msgstr "" ++ ++msgid "" ++"This section defines on which interfaces collectd will wait for incoming " ++"connections." ++msgstr "" ++"Esta seção define em quais interfaces o collectd irá aguardar para receber " ++"conexões." ++ ++msgid "" ++"This section defines to which servers the locally collected data is sent to." ++msgstr "" ++"Esta seção define para qual servidor os dados coletados localmente serão " ++"enviados." ++ ++msgid "Try to lookup fully qualified hostname" ++msgstr "Tentar encontrar o nome completo do equipamento (FQDN)" ++ ++msgid "UPS" ++msgstr "UPS (no-breaks)" ++ ++msgid "UPS Plugin Configuration" ++msgstr "Plugin de configuração UPS" ++ ++msgid "UPS name in NUT ups@host format" ++msgstr "Nome do UPS no NUT em formato ups@equipamento" ++ ++msgid "UnixSock" ++msgstr "UnixSock" ++ ++msgid "Unixsock Plugin Configuration" ++msgstr "Configuração do plugin Unixsock" ++ ++msgid "Uptime" ++msgstr "" ++ ++msgid "Uptime Plugin Configuration" ++msgstr "" ++ ++msgid "Used PID file" ++msgstr "Arquivo PID usado" ++ ++msgid "User" ++msgstr "usuário" ++ ++msgid "Verbose monitoring" ++msgstr "Monitoramento no modo detalhado" ++ ++msgid "Wireless" ++msgstr "Rede Sem Fio (Wireless)" ++ ++msgid "Wireless iwinfo Plugin Configuration" ++msgstr "Configuração do Plugin iwinfo da Rede Sem Fio (Wireless)" ++ ++msgid "e.g. br-ff" ++msgstr "ex: br-ff" ++ ++msgid "e.g. br-lan" ++msgstr "ex: br-lan" ++ ++msgid "e.g. reject-with tcp-reset" ++msgstr "ex: rejeitar-com tcp-reset" ++ ++msgid "max. 16 chars" ++msgstr "máx. 16 caracteres" ++ ++msgid "reduces rrd size" ++msgstr "reduzir o tamanho do rrd" ++ ++msgid "seconds; multiple separated by space" ++msgstr "segundos; vários valores, separar com espaço" ++ ++msgid "server interfaces" ++msgstr "interfaces do servidor" ++ ++#~ msgid "Installed network plugins:" ++#~ msgstr "Plugins de rede instalados:" ++ ++#~ msgid "Installed output plugins:" ++#~ msgstr "Plugins de saída instalados:" ++ ++#~ msgid "" ++#~ "Network plugins are used to collect information about open tcp " ++#~ "connections, interface traffic, iptables rules etc." ++#~ msgstr "" ++#~ "Os plugins de rede são utilizados para coletar informações sobre conexões " ++#~ "tcp abertas, tráfego da interface, regras do iptables, etc." ++ ++#~ msgid "" ++#~ "Output plugins provide different possibilities to store collected data. " ++#~ "It is possible to enable multiple plugin at one, for example to store " ++#~ "collected data in rrd databases and to transmit the data over the network " ++#~ "to other collectd instances." ++#~ msgstr "" ++#~ "Os plugins de saída proveem diferentes possibilidades para armazenar os " ++#~ "dados coletados. É possível habilitar diversos plugin para, por exemplo, " ++#~ "coletar dados em bancos de dados rrd e transmitir os dados através da " ++#~ "rede para outro serviço collectd." ++ ++#~ msgid "" ++#~ "System plugins collecting values about system state and ressource usage " ++#~ "on the device.:" ++#~ msgstr "" ++#~ "Plugins do sistema coletando valores sobre o estado do sistema e uso dos " ++#~ "recursos neste dispositivo.:" ++ ++#~ msgid "" ++#~ "The wireless plugin collects statistics about wireless signal strength, " ++#~ "noise and quality." ++#~ msgstr "" ++#~ "O plugin wireless coleta estatísticas sobre o nível de sinal wireless, o " ++#~ "ruído e qualidade." ++ ++#~ msgid "Wireless Plugin Configuration" ++#~ msgstr "Configuração do Plugin da Rede Sem Fio (Wireless)" +diff --git a/feeds/luci/applications/luci-app-statistics/po/pt/rrdtool.po b/feeds/luci/applications/luci-app-statistics/po/pt/rrdtool.po +new file mode 100644 +index 0000000..6abbaf7 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-statistics/po/pt/rrdtool.po +@@ -0,0 +1,359 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Report-Msgid-Bugs-To: \n" ++"POT-Creation-Date: 2009-05-26 19:03+0200\n" ++"PO-Revision-Date: 2013-06-02 21:10+0200\n" ++"Last-Translator: joao.f.vieira \n" ++"Language-Team: LANGUAGE \n" ++"Language: pt\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n != 1);\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++#. %H: Wireless - Signal Noise Ratio ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:1 ++msgid "stat_dg_title_wireless__signal_noise" ++msgstr "%H: Wireless - Relação Sinal/Ruido" ++ ++#. dBm ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:2 ++msgid "stat_dg_label_wireless__signal_noise" ++msgstr "dBm" ++ ++#. Noise Level ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:3 ++msgid "stat_ds_signal_noise" ++msgstr "Nivel de Ruido" ++ ++#. Signal Strength ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:4 ++msgid "stat_ds_signal_power" ++msgstr "Forca do Sinal" ++ ++#. %H: Wireless - Signal Quality ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:5 ++msgid "stat_dg_title_wireless__signal_quality" ++msgstr "%H: Wireless - Qualidade do Sinal" ++ ++#. n ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:6 ++msgid "stat_dg_label_wireless__signal_quality" ++msgstr "n" ++ ++#. Signal Quality ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:7 ++msgid "stat_ds_signal_quality" ++msgstr "Qualidade do Sinal" ++ ++#. %H: ICMP Roundtrip Times ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:8 ++msgid "stat_dg_title_ping" ++msgstr "%H: Tempo de resposta ICMP" ++ ++#. ms ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:9 ++msgid "stat_dg_label_ping" ++msgstr "ms" ++ ++#. %di ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:10 ++msgid "stat_ds_ping" ++msgstr "%di" ++ ++#. %H: Firewall - Processed Packets ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:11 ++msgid "stat_dg_title_iptables__ipt_packets" ++msgstr "%H: Firewall - Pacotes Processados" ++ ++#. Packets/s ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:12 ++msgid "stat_dg_label_iptables__ipt_packets" ++msgstr "Pacote/s" ++ ++#. Chain \"%di\" ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:13 ++msgid "stat_ds_ipt_packets" ++msgstr "Cadeia \"%di\"" ++ ++#. %H: Netlink - Transfer on %pi ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:14 ++msgid "stat_dg_title_netlink__if_octets" ++msgstr "%H: Netlink - Transferencia na %pi" ++ ++#. Bytes/s ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:15 ++msgid "stat_dg_label_netlink__if_octets" ++msgstr "Bytes/s" ++ ++#. Bytes (%ds) ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:16 ++msgid "stat_ds_if_octets" ++msgstr "Bytes (%ds)" ++ ++#. %H: Netlink - Packets on %pi ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:17 ++msgid "stat_dg_title_netlink__if_packets" ++msgstr "%H: Netlink - Pacotes na %pi" ++ ++#. Packets/s ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:18 ++msgid "stat_dg_label_netlink__if_packets" ++msgstr "Packets/s" ++ ++#. Processed (%ds) ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:19 ++msgid "stat_ds_if_packets" ++msgstr "Processado (%ds)" ++ ++#. Dropped (%ds) ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:20 ++msgid "stat_ds_if_dropped" ++msgstr "Dropado (%ds)" ++ ++#. Errors (%ds) ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:21 ++msgid "stat_ds_if_errors" ++msgstr "Erros (%ds)" ++ ++#. %H: Netlink - Multicast on %pi ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:22 ++msgid "stat_dg_title_netlink__if_multicast" ++msgstr "%H: Netlink - Multicast na %pi" ++ ++#. Packets/s ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:23 ++msgid "stat_dg_label_netlink__if_multicast" ++msgstr "Pacote/s" ++ ++#. Packets ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:24 ++msgid "stat_ds_if_multicast" ++msgstr "Pacotes" ++ ++#. %H: Netlink - Collisions on %pi ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:25 ++msgid "stat_dg_title_netlink__if_collisions" ++msgstr "%H: Netlink - Colisoes na %pi" ++ ++#. Collisions/s ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:26 ++msgid "stat_dg_label_netlink__if_collisions" ++msgstr "Colisao(es)" ++ ++#. Collisions ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:27 ++msgid "stat_ds_if_collisions" ++msgstr "Colisoes" ++ ++#. %H: Netlink - Errors on %pi ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:28 ++msgid "stat_dg_title_netlink__if_tx_errors" ++msgstr "%H: Netlink - Erros na %pi" ++ ++#. Errors/s ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:29 ++msgid "stat_dg_label_netlink__if_tx_errors" ++msgstr "Erro/s" ++ ++#. %di ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:30 ++msgid "stat_ds_if_tx_errors" ++msgstr "%di" ++ ++#. %di ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:31 ++msgid "stat_ds_if_rx_errors" ++msgstr "%di" ++ ++#. %H: Processes ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:32 ++msgid "stat_dg_title_processes" ++msgstr "%H: Processos" ++ ++#. Processes/s ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:33 ++msgid "stat_dg_label_processes" ++msgstr "Processo/s" ++ ++#. %di ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:34 ++msgid "stat_ds_ps_state" ++msgstr "%di" ++ ++#. %H: Process %pi - used cpu time ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:35 ++msgid "stat_dg_title_processes__ps_cputime" ++msgstr "%H: Processo %pi - tempo usado da cpu" ++ ++#. Jiffies ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:36 ++msgid "stat_dg_label_processes__ps_cputime" ++msgstr "Jiffies" ++ ++#. system ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:37 ++msgid "stat_ds_ps_cputime__syst" ++msgstr "sistema" ++ ++#. user ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:38 ++msgid "stat_ds_ps_cputime__user" ++msgstr "utilizador" ++ ++#. %H: Process %pi - threads and processes ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:39 ++msgid "stat_dg_title_processes__ps_count" ++msgstr "%H: Processo %pi - threads e processos" ++ ++#. Count ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:40 ++msgid "stat_dg_label_processes__ps_count" ++msgstr "Contagem" ++ ++#. %ds ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:41 ++msgid "stat_ds_ps_count" ++msgstr "%ds" ++ ++#. %H: Process %pi - page faults ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:42 ++msgid "stat_dg_title_processes__ps_pagefaults" ++msgstr "%H: Prcesso %pi - pagina de erros" ++ ++#. Pagefaults ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:43 ++msgid "stat_dg_label_processes__ps_pagefaults" ++msgstr "Pagina de erros" ++ ++#. page faults ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:44 ++msgid "stat_ds_ps_pagefaults" ++msgstr "pagina de erros" ++ ++#. %H: Process %pi - virtual memory size ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:45 ++msgid "stat_dg_title_processes__ps_rss" ++msgstr "%H: Processo %pi - tamanho da memoria virtual" ++ ++#. Bytes ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:46 ++msgid "stat_dg_label_processes__ps_rss" ++msgstr "Bytes" ++ ++#. virtual memory ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:47 ++msgid "stat_ds_ps_rss" ++msgstr "memoria virtual" ++ ++#. %H: Usage on Processor #%pi ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:48 ++msgid "stat_dg_title_cpu" ++msgstr "%H: Usado no Processado #%pi" ++ ++#. % ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:49 ++msgid "stat_dg_label_cpu" ++msgstr "%" ++ ++#. %di ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:50 ++msgid "stat_ds_cpu" ++msgstr "%di" ++ ++#. %H: Transfer on %di ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:51 ++msgid "stat_dg_title_interface__if_octets" ++msgstr "%H: Transferencia na %di" ++ ++#. Bytes/s ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:52 ++msgid "stat_dg_label_interface__if_octets" ++msgstr "Bytes/s" ++ ++#. %H: Packets on %di ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:53 ++msgid "stat_dg_title_interface__if_packets" ++msgstr "%H: Pacotes na %di" ++ ++#. Packets/s ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:54 ++msgid "stat_dg_label_interface__if_packets" ++msgstr "Pacote/s" ++ ++#. %H: TCP-Connections to Port %pi ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:55 ++msgid "stat_dg_title_tcpconns" ++msgstr "%H: Ligações TCP na Porta %pi" ++ ++#. Connections/s ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:56 ++msgid "stat_dg_label_tcpconns" ++msgstr "Ligação(ões)" ++ ++#. %di ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:57 ++msgid "stat_ds_tcp_connections" ++msgstr "%di" ++ ++#. %H: Disk Space Usage on %di ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:58 ++msgid "stat_dg_title_df" ++msgstr "%H: Utilizacao de Espaco em Disco em %di" ++ ++#. Bytes ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:59 ++msgid "stat_dg_label_df" ++msgstr "Bytes" ++ ++#. %ds ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:60 ++msgid "stat_ds_df__free" ++msgstr "%ds" ++ ++#. %ds ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:61 ++msgid "stat_ds_df__used" ++msgstr "%ds" ++ ++#. %H: Interrupts ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:62 ++msgid "stat_dg_title_irq" ++msgstr "%H: Interrupcoes" ++ ++#. Issues/s ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:63 ++msgid "stat_dg_label_irq" ++msgstr "Erro/s" ++ ++#. IRQ %di ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:64 ++msgid "stat_ds_irq" ++msgstr "IRQ %di" ++ ++#. %H: System Load ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:65 ++msgid "stat_dg_title_load" ++msgstr "%H: Carga do Sistema" ++ ++#. Load ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:66 ++msgid "stat_dg_label_load" ++msgstr "Carga" ++ ++#. 1 min ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:67 ++msgid "stat_ds_load__shortterm" ++msgstr "1 min" ++ ++#. 5 min ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:68 ++msgid "stat_ds_load__midterm" ++msgstr "5 min" ++ ++#. 15 min ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:69 ++msgid "stat_ds_load__longterm" ++msgstr "15 min" +diff --git a/feeds/luci/applications/luci-app-statistics/po/pt/statistics.po b/feeds/luci/applications/luci-app-statistics/po/pt/statistics.po +new file mode 100644 +index 0000000..54f5803 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-statistics/po/pt/statistics.po +@@ -0,0 +1,688 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Report-Msgid-Bugs-To: \n" ++"POT-Creation-Date: 2009-05-26 19:03+0200\n" ++"PO-Revision-Date: 2013-06-01 00:10+0200\n" ++"Last-Translator: joao.f.vieira \n" ++"Language-Team: LANGUAGE \n" ++"Language: pt\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n != 1);\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "Action (target)" ++msgstr "Ação (destino)" ++ ++msgid "Add command for reading values" ++msgstr "Adicionar comando para leitura de valores" ++ ++msgid "Add matching rule" ++msgstr "Adicionar regra" ++ ++msgid "Add multiple hosts separated by space." ++msgstr "Adicionar hosts múltiplos separados por espaço." ++ ++msgid "Add notification command" ++msgstr "Adicionar o comando de notificação" ++ ++msgid "Base Directory" ++msgstr "Diretório Base" ++ ++msgid "Basic monitoring" ++msgstr "Monitoramento básico" ++ ++msgid "CPU Plugin Configuration" ++msgstr "Configuração do plugin CPU" ++ ++msgid "CSV Output" ++msgstr "Formato CSV" ++ ++msgid "CSV Plugin Configuration" ++msgstr "Configuração do plugin CSV" ++ ++msgid "Cache collected data for" ++msgstr "Cache dos dados coletados" ++ ++msgid "Cache flush interval" ++msgstr "Intervalo de limpeza do cache" ++ ++msgid "Chain" ++msgstr "Cadeia" ++ ++msgid "CollectLinks" ++msgstr "" ++ ++msgid "CollectRoutes" ++msgstr "" ++ ++msgid "CollectTopology" ++msgstr "" ++ ++msgid "Collectd" ++msgstr "Collectd" ++ ++msgid "Collectd Settings" ++msgstr "Configurações do Collectd" ++ ++msgid "" ++"Collectd is a small daemon for collecting data from various sources through " ++"different plugins. On this page you can change general settings for the " ++"collectd daemon." ++msgstr "" ++"Collectd é um pequeno daemon que coleta dados de várias fontes através de " ++"diferentes plugins. Nesta página você pode alterar as configurações gerais " ++"do daemon collectd." ++ ++msgid "Conntrack" ++msgstr "" ++ ++msgid "Conntrack Plugin Configuration" ++msgstr "" ++ ++msgid "DF Plugin Configuration" ++msgstr "Configuração do plugin DF" ++ ++msgid "DNS" ++msgstr "DNS" ++ ++msgid "DNS Plugin Configuration" ++msgstr "Configuração do plugin DNS" ++ ++msgid "Data collection interval" ++msgstr "Intervalo da coleta de dados" ++ ++msgid "Datasets definition file" ++msgstr "Arquivo com a definição de dados" ++ ++msgid "Destination ip range" ++msgstr "IP de destino" ++ ++msgid "Directory for collectd plugins" ++msgstr "Diretório para os plugins do collectd" ++ ++msgid "Directory for sub-configurations" ++msgstr "Diretório para sub-configurações" ++ ++msgid "Disk Plugin Configuration" ++msgstr "Configuração do plugin Disco" ++ ++msgid "Disk Space Usage" ++msgstr "Utilização de espaço em disco" ++ ++msgid "Disk Usage" ++msgstr "Utilização do Disco" ++ ++msgid "Display Host »" ++msgstr "Mostrar Host »" ++ ++msgid "Display timespan »" ++msgstr "Mostrar intervalo »" ++ ++msgid "E-Mail Plugin Configuration" ++msgstr "Configuração do plugin E-Mail" ++ ++msgid "Email" ++msgstr "Email" ++ ++msgid "Enable this plugin" ++msgstr "Habilitar este plugin" ++ ++msgid "Exec" ++msgstr "Exec" ++ ++msgid "Exec Plugin Configuration" ++msgstr "Configuração do plugin Exec" ++ ++msgid "Filter class monitoring" ++msgstr "Monitoramento das Classes de Filtros" ++ ++msgid "Firewall" ++msgstr "Firewall" ++ ++msgid "Flush cache after" ++msgstr "Limpar cache após" ++ ++msgid "Forwarding between listen and server addresses" ++msgstr "Transmissão entre o endereço de escuta e dos servidores" ++ ++msgid "Graphs" ++msgstr "Gráficos" ++ ++msgid "Group" ++msgstr "grupo" ++ ++msgid "" ++"Here you can define external commands which will be started by collectd in " ++"order to read certain values. The values will be read from stdout." ++msgstr "" ++"Aqui pode definir comandos externos que serão iniciados pelo collectd a fim " ++"de ler determinados valores. Os valores serão lidos a partir do stdout." ++ ++msgid "" ++"Here you can define external commands which will be started by collectd when " ++"certain threshold values have been reached. The values leading to invokation " ++"will be feeded to the the called programs stdin." ++msgstr "" ++"Aqui pode definir os comandos externos que serão iniciados pelo collectd " ++"quando determinados valores limite forem atingidos. Os valores passados ao " ++"comando serão enviados para o stdin." ++ ++msgid "" ++"Here you can define various criteria by which the monitored iptables rules " ++"are selected." ++msgstr "" ++"Aqui você pode definir diversos critérios para as regras iptables " ++"selecionadas serem monitoradas." ++ ++msgid "Host" ++msgstr "" ++ ++msgid "Hostname" ++msgstr "Hostname" ++ ++msgid "IP or hostname where to get the txtinfo output from" ++msgstr "" ++ ++msgid "IRQ Plugin Configuration" ++msgstr "Configuração do plugin IRQ" ++ ++msgid "Ignore source addresses" ++msgstr "Ignorar endereços de origem" ++ ++msgid "Incoming interface" ++msgstr "Interface de entrada" ++ ++msgid "Interface Plugin Configuration" ++msgstr "Configuração do plugin Interface" ++ ++msgid "Interfaces" ++msgstr "Interfaces" ++ ++msgid "Interrupts" ++msgstr "Interrupções" ++ ++msgid "Interval for pings" ++msgstr "Intervalo dos pings" ++ ++msgid "Iptables Plugin Configuration" ++msgstr "Configuração do plugin Iptables" ++ ++msgid "Leave unselected to automatically determine interfaces to monitor." ++msgstr "" ++"Deixar desmarcada para determinar automaticamente as interfaces a " ++"monitorizar." ++ ++msgid "Listen host" ++msgstr "Endereço de escuta do Host" ++ ++msgid "Listen port" ++msgstr "Porta de escuta" ++ ++msgid "Listener interfaces" ++msgstr "Escutar na(s) interface(s)" ++ ++msgid "Load Plugin Configuration" ++msgstr "Configuração do plugin carga" ++ ++msgid "Maximum allowed connections" ++msgstr "Máximo de conexões permitidas" ++ ++msgid "Memory" ++msgstr "Memória" ++ ++msgid "Memory Plugin Configuration" ++msgstr "Configuração do Plugin de Memória" ++ ++msgid "Monitor all except specified" ++msgstr "Monitorizar tudo excepto os especificados" ++ ++msgid "Monitor all local listen ports" ++msgstr "Monitorar todas as portas locais" ++ ++msgid "Monitor devices" ++msgstr "Monitorar dispositivos" ++ ++msgid "Monitor disks and partitions" ++msgstr "Monitoras discos e partições" ++ ++msgid "Monitor filesystem types" ++msgstr "Monitorar tipos de sistemas de arquivos" ++ ++msgid "Monitor hosts" ++msgstr "Monitorar os hosts" ++ ++msgid "Monitor interfaces" ++msgstr "Monitorizar interfaces" ++ ++msgid "Monitor interrupts" ++msgstr "Monitorar interrupções" ++ ++msgid "Monitor local ports" ++msgstr "Monitorar as portas locais" ++ ++msgid "Monitor mount points" ++msgstr "Monitorar pontos de montagem" ++ ++msgid "Monitor processes" ++msgstr "Monitorar processos" ++ ++msgid "Monitor remote ports" ++msgstr "Monitorar portas remotas" ++ ++msgid "Name of the rule" ++msgstr "Nome da regra" ++ ++msgid "Netlink" ++msgstr "Netlink" ++ ++msgid "Netlink Plugin Configuration" ++msgstr "Configuração do plugin Netlink" ++ ++msgid "Network" ++msgstr "Rede" ++ ++msgid "Network Plugin Configuration" ++msgstr "Configuração do plugin Rede" ++ ++msgid "Network plugins" ++msgstr "Plugins de rede" ++ ++msgid "Network protocol" ++msgstr "Protocolo de rede" ++ ++msgid "Number of threads for data collection" ++msgstr "Número de threads para o coletor de dados" ++ ++msgid "OLSRd" ++msgstr "" ++ ++msgid "OLSRd Plugin Configuration" ++msgstr "" ++ ++msgid "Only create average RRAs" ++msgstr "Somente criar RRAs de média" ++ ++msgid "Options" ++msgstr "Opções" ++ ++msgid "Outgoing interface" ++msgstr "Interface de saída" ++ ++msgid "Output plugins" ++msgstr "Plugins de saída" ++ ++msgid "Ping" ++msgstr "Ping" ++ ++msgid "Ping Plugin Configuration" ++msgstr "Configuração do plugin Ping" ++ ++msgid "Port" ++msgstr "Porta" ++ ++msgid "Processes" ++msgstr "Processos" ++ ++msgid "Processes Plugin Configuration" ++msgstr "Configuração do plugin Processos" ++ ++msgid "Processes to monitor separated by space" ++msgstr "" ++ ++msgid "Processor" ++msgstr "Processador" ++ ++msgid "Qdisc monitoring" ++msgstr "Monitoramento do Qdisc" ++ ++msgid "RRD XFiles Factor" ++msgstr "Arquivos RRD XFiles Factor" ++ ++msgid "RRD heart beat interval" ++msgstr "Intervalo entre duas atualizações" ++ ++msgid "RRD step interval" ++msgstr "Intervalo de atualização" ++ ++msgid "RRDTool" ++msgstr "RRDTool" ++ ++msgid "RRDTool Plugin Configuration" ++msgstr "Configuração do plugin RRDTool" ++ ++msgid "Rows per RRA" ++msgstr "Linhas por RRA" ++ ++msgid "Script" ++msgstr "" ++ ++msgid "Seconds" ++msgstr "Segundos" ++ ++msgid "Server host" ++msgstr "IP/Hostname do servidor" ++ ++msgid "Server port" ++msgstr "Porta do servidor" ++ ++msgid "Shaping class monitoring" ++msgstr "Monitoramento das Classes de Shaping" ++ ++msgid "Socket file" ++msgstr "" ++ ++msgid "Socket group" ++msgstr "" ++ ++msgid "Socket permissions" ++msgstr "" ++ ++msgid "Source ip range" ++msgstr "IP de origem" ++ ++msgid "Specifies what information to collect about links." ++msgstr "" ++ ++msgid "Specifies what information to collect about routes." ++msgstr "" ++ ++msgid "Specifies what information to collect about the global topology." ++msgstr "" ++ ++msgid "Splash Leases" ++msgstr "" ++ ++msgid "Splash Leases Plugin Configuration" ++msgstr "" ++ ++msgid "Statistics" ++msgstr "" ++ ++msgid "Storage directory" ++msgstr "Diretório de armazenamento" ++ ++msgid "Storage directory for the csv files" ++msgstr "Diretório para armazenamento dos arquivos csv" ++ ++msgid "Store data values as rates instead of absolute values" ++msgstr "Armazenar os valores dos dados como taxas em vez de valores absolutos" ++ ++msgid "Stored timespans" ++msgstr "Intervalos armazenados" ++ ++msgid "System Load" ++msgstr "Carga do Sistema" ++ ++msgid "System plugins" ++msgstr "Plugis de Sistema" ++ ++msgid "TCP Connections" ++msgstr "Conexões TCP" ++ ++msgid "TCPConns Plugin Configuration" ++msgstr "Configuração do plugin TCPConns" ++ ++msgid "TTL for network packets" ++msgstr "TTL para os pacotes de rede" ++ ++msgid "TTL for ping packets" ++msgstr "TTL para os pacotes do ping" ++ ++msgid "Table" ++msgstr "Tabela" ++ ++msgid "The NUT plugin reads information about Uninterruptible Power Supplies." ++msgstr "" ++ ++msgid "" ++"The OLSRd plugin reads information about meshed networks from the txtinfo " ++"plugin of OLSRd." ++msgstr "" ++ ++msgid "" ++"The conntrack plugin collects statistics about the number of tracked " ++"connections." ++msgstr "" ++ ++msgid "The cpu plugin collects basic statistics about the processor usage." ++msgstr "" ++"O plugin cpu coleta as estatísticas básicas sobre o uso do processador." ++ ++msgid "" ++"The csv plugin stores collected data in csv file format for further " ++"processing by external programs." ++msgstr "" ++"O plugin csv armazena os dados coletados em um arquivo no formato csv para " ++"um futuro processamento por outros programas." ++ ++msgid "" ++"The df plugin collects statistics about the disk space usage on different " ++"devices, mount points or filesystem types." ++msgstr "" ++"O plugin df coleta estatísticas sobre a utilização de espaço em disco em " ++"diferentes dispositivos, pontos de montagem ou tipos de sistemas de arquivos." ++ ++msgid "" ++"The disk plugin collects detailled usage statistics for selected partitions " ++"or whole disks." ++msgstr "" ++"O plugin disco coleta estatísticas de uso detalhadas das partições " ++"selecionadas ou discos inteiros." ++ ++msgid "" ++"The dns plugin collects detailled statistics about dns related traffic on " ++"selected interfaces." ++msgstr "" ++"O plugin dns coleta estatísticas detalhadas sobre o tráfego do dns nas " ++"interfaces selecionadas." ++ ++msgid "" ++"The email plugin creates a unix socket which can be used to transmit email-" ++"statistics to a running collectd daemon. This plugin is primarily intended " ++"to be used in conjunction with Mail::SpamAssasin::Plugin::Collectd but can " ++"be used in other ways as well." ++msgstr "" ++"O plugin de email cria um socket unix que pode ser usado para transmitir " ++"estatísticas de email o daemon collectd. Este plugin é essencialmente " ++"destinado a ser utilizado em conjunto com o plugin Mail::SpamAssasin::" ++"Plugin::Collectd mas pode ser utilizado de outras maneiras também." ++ ++msgid "" ++"The exec plugin starts external commands to read values from or to notify " ++"external processes when certain threshold values have been reached." ++msgstr "" ++"O plugin exec inicia comandos externos para leitura de valores ou notificar " ++"processos externos quando um determinado valor limite for atingido." ++ ++msgid "" ++"The interface plugin collects traffic statistics on selected interfaces." ++msgstr "" ++"O plugin interface plugin coleta estatísticas sobre o tráfego das interfaces " ++"selecionadas." ++ ++msgid "" ++"The iptables plugin will monitor selected firewall rules and collect " ++"informations about processed bytes and packets per rule." ++msgstr "" ++"O plugin iptables irá monitorar as regras de firewall selecionadas e coletar " ++"informações sobre pacotes e bytes processados pela regra." ++ ++msgid "" ++"The irq plugin will monitor the rate of issues per second for each selected " ++"interrupt. If no interrupt is selected then all interrupts are monitored." ++msgstr "" ++"O plugin irq irá monitorar a taxa de erros por segundo de cada interrupção " ++"selecionada. Se nenhuma interrupção for selecionada então todas as " ++"interrupções serão monitoradas." ++ ++msgid "" ++"The iwinfo plugin collects statistics about wireless signal strength, noise " ++"and quality." ++msgstr "" ++ ++msgid "The load plugin collects statistics about the general system load." ++msgstr "O plugin carga coleta estatísticas gerais sobre a carga do sistema." ++ ++msgid "The memory plugin collects statistics about the memory usage." ++msgstr "" ++ ++msgid "" ++"The netlink plugin collects extended informations like qdisc-, class- and " ++"filter-statistics for selected interfaces." ++msgstr "" ++"O plugin Netlink coleta informações detalhadas como qdisc-, classe- e filtro " ++"de estatísticas das interfaces selecionadas." ++ ++msgid "" ++"The network plugin provides network based communication between different " ++"collectd instances. Collectd can operate both in client and server mode. In " ++"client mode locally collected data is transferred to a collectd server " ++"instance, in server mode the local instance receives data from other hosts." ++msgstr "" ++"O plugin rede fornece informações de rede baseadas na comunicação entre as " ++"diferentes instâncias do collectd. O Collectd pode operar tanto no modo " ++"cliente quanto no modo servidor. No modo cliente os dados coletados " ++"localmente são transferidos para um servidor collectd, no modo de servidor a " ++"instância local recebe dados de outros hosts." ++ ++msgid "" ++"The ping plugin will send icmp echo replies to selected hosts and measure " ++"the roundtrip time for each host." ++msgstr "" ++"O plugin ping irá enviar pacotes ICMP to tipo echo aos hosts selecionados e " ++"medir o tempo de resposta para cada host." ++ ++msgid "" ++"The processes plugin collects informations like cpu time, page faults and " ++"memory usage of selected processes." ++msgstr "" ++"O plugin processo coleta informações como o tempo da cpu, página falhas e " ++"uso de memória dos processos selecionados." ++ ++msgid "" ++"The rrdtool plugin stores the collected data in rrd database files, the " ++"foundation of the diagrams.

    Warning: Setting the wrong " ++"values will result in a very high memory consumption in the temporary " ++"directory. This can render the device unusable!" ++msgstr "" ++"O plugin rrdtool armazena os dados coletados no arquivo de banco de dados " ++"rrd.

    Aviso: A má configuração desses valores, resultará " ++"em um valor muito elevado no consumo de memória no diretório temporário. " ++"Isso pode tornar o equipamento inutilizável!" ++ ++msgid "" ++"The splash leases plugin uses libuci to collect statistics about splash " ++"leases." ++msgstr "" ++ ++msgid "" ++"The statistics package is based on Collectd and uses RRD " ++"Tool to render diagram images from collected data." ++msgstr "" ++"As estatísticas são baseadas no Collectd e é utilizado o RRD Tool para renderização das imagens à partir dos dados coletados." ++ ++msgid "" ++"The tcpconns plugin collects informations about open tcp connections on " ++"selected ports." ++msgstr "" ++"O plugin tcpconns coleta informações sobre as conexões TCP abertas das " ++"portas selecionadas." ++ ++msgid "" ++"The unixsock plugin creates a unix socket which can be used to read " ++"collected data from a running collectd instance." ++msgstr "" ++"O plugin unixsock cria um socket unix, que pode ser usado para ler os dados " ++"coletados a partir de uma instância do collectd." ++ ++msgid "The uptime plugin collects statistics about the uptime of the system." ++msgstr "" ++ ++msgid "" ++"This section defines on which interfaces collectd will wait for incoming " ++"connections." ++msgstr "" ++"Esta seção define em quais interfaces o collectd irá aguardar para receber " ++"conexões." ++ ++msgid "" ++"This section defines to which servers the locally collected data is sent to." ++msgstr "" ++"Esta seção define para qual servidor os dados coletados localmente serão " ++"enviados." ++ ++msgid "Try to lookup fully qualified hostname" ++msgstr "Tentar encontrar o nome do host completo (FQDN)" ++ ++msgid "UPS" ++msgstr "" ++ ++msgid "UPS Plugin Configuration" ++msgstr "" ++ ++msgid "UPS name in NUT ups@host format" ++msgstr "" ++ ++msgid "UnixSock" ++msgstr "UnixSock" ++ ++msgid "Unixsock Plugin Configuration" ++msgstr "Configuração do plugin Unixsock" ++ ++msgid "Uptime" ++msgstr "" ++ ++msgid "Uptime Plugin Configuration" ++msgstr "" ++ ++msgid "Used PID file" ++msgstr "Arquivo PID usado" ++ ++msgid "User" ++msgstr "" ++ ++msgid "Verbose monitoring" ++msgstr "Monitoramento no modo verbose" ++ ++msgid "Wireless" ++msgstr "Wireless" ++ ++msgid "Wireless iwinfo Plugin Configuration" ++msgstr "" ++ ++msgid "e.g. br-ff" ++msgstr "ex. br-ff" ++ ++msgid "e.g. br-lan" ++msgstr "ex. br-lan" ++ ++msgid "e.g. reject-with tcp-reset" ++msgstr "ex. rejeitar-com tcp-reset" ++ ++msgid "max. 16 chars" ++msgstr "max. 16 caract." ++ ++msgid "reduces rrd size" ++msgstr "reduzir o tamanho do rrd" ++ ++msgid "seconds; multiple separated by space" ++msgstr "segundos; vários valores, separar com espaço" ++ ++msgid "server interfaces" ++msgstr "Interfaces do servidor" ++ ++#~ msgid "" ++#~ "The wireless plugin collects statistics about wireless signal strength, " ++#~ "noise and quality." ++#~ msgstr "" ++#~ "O plugin wireless coleta estatísticas sobre o nível de sinal wireless, o " ++#~ "ruído e qualidade." ++ ++#~ msgid "Wireless Plugin Configuration" ++#~ msgstr "Configuração do plugin Wireless" +diff --git a/feeds/luci/applications/luci-app-statistics/po/ro/rrdtool.po b/feeds/luci/applications/luci-app-statistics/po/ro/rrdtool.po +new file mode 100644 +index 0000000..9878759 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-statistics/po/ro/rrdtool.po +@@ -0,0 +1,360 @@ ++# rrdtool.pot ++# generated from ./applications/luci-statistics/luasrc/i18n/rrdtool.en.lua ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"PO-Revision-Date: 2014-06-29 17:25+0200\n" ++"Last-Translator: xxvirusxx \n" ++"Language-Team: none\n" ++"Language: ro\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=3; plural=(n==1 ? 0 : (n==0 || (n%100 > 0 && n%100 < " ++"20)) ? 1 : 2);;\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++#. %H: Wireless - Signal Noise Ratio ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:1 ++msgid "stat_dg_title_wireless__signal_noise" ++msgstr "" ++ ++#. dBm ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:2 ++msgid "stat_dg_label_wireless__signal_noise" ++msgstr "" ++ ++#. Noise Level ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:3 ++msgid "stat_ds_signal_noise" ++msgstr "Nivel zgomot" ++ ++#. Signal Strength ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:4 ++msgid "stat_ds_signal_power" ++msgstr "" ++ ++#. %H: Wireless - Signal Quality ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:5 ++msgid "stat_dg_title_wireless__signal_quality" ++msgstr "%H: Wireless - Calitate semnal" ++ ++#. n ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:6 ++msgid "stat_dg_label_wireless__signal_quality" ++msgstr "" ++ ++#. Signal Quality ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:7 ++msgid "stat_ds_signal_quality" ++msgstr "Calitate semnal" ++ ++#. %H: ICMP Roundtrip Times ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:8 ++msgid "stat_dg_title_ping" ++msgstr "" ++ ++#. ms ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:9 ++msgid "stat_dg_label_ping" ++msgstr "" ++ ++#. %di ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:10 ++msgid "stat_ds_ping" ++msgstr "" ++ ++#. %H: Firewall - Processed Packets ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:11 ++msgid "stat_dg_title_iptables__ipt_packets" ++msgstr "" ++ ++#. Packets/s ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:12 ++msgid "stat_dg_label_iptables__ipt_packets" ++msgstr "" ++ ++#. Chain \"%di\" ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:13 ++msgid "stat_ds_ipt_packets" ++msgstr "" ++ ++#. %H: Netlink - Transfer on %pi ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:14 ++msgid "stat_dg_title_netlink__if_octets" ++msgstr "" ++ ++#. Bytes/s ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:15 ++msgid "stat_dg_label_netlink__if_octets" ++msgstr "" ++ ++#. Bytes (%ds) ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:16 ++msgid "stat_ds_if_octets" ++msgstr "" ++ ++#. %H: Netlink - Packets on %pi ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:17 ++msgid "stat_dg_title_netlink__if_packets" ++msgstr "" ++ ++#. Packets/s ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:18 ++msgid "stat_dg_label_netlink__if_packets" ++msgstr "" ++ ++#. Processed (%ds) ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:19 ++msgid "stat_ds_if_packets" ++msgstr "" ++ ++#. Dropped (%ds) ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:20 ++msgid "stat_ds_if_dropped" ++msgstr "" ++ ++#. Errors (%ds) ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:21 ++msgid "stat_ds_if_errors" ++msgstr "" ++ ++#. %H: Netlink - Multicast on %pi ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:22 ++msgid "stat_dg_title_netlink__if_multicast" ++msgstr "" ++ ++#. Packets/s ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:23 ++msgid "stat_dg_label_netlink__if_multicast" ++msgstr "" ++ ++#. Packets ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:24 ++msgid "stat_ds_if_multicast" ++msgstr "" ++ ++#. %H: Netlink - Collisions on %pi ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:25 ++msgid "stat_dg_title_netlink__if_collisions" ++msgstr "" ++ ++#. Collisions/s ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:26 ++msgid "stat_dg_label_netlink__if_collisions" ++msgstr "" ++ ++#. Collisions ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:27 ++msgid "stat_ds_if_collisions" ++msgstr "" ++ ++#. %H: Netlink - Errors on %pi ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:28 ++msgid "stat_dg_title_netlink__if_tx_errors" ++msgstr "" ++ ++#. Errors/s ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:29 ++msgid "stat_dg_label_netlink__if_tx_errors" ++msgstr "" ++ ++#. %di ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:30 ++msgid "stat_ds_if_tx_errors" ++msgstr "" ++ ++#. %di ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:31 ++msgid "stat_ds_if_rx_errors" ++msgstr "" ++ ++#. %H: Processes ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:32 ++msgid "stat_dg_title_processes" ++msgstr "" ++ ++#. Processes/s ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:33 ++msgid "stat_dg_label_processes" ++msgstr "" ++ ++#. %di ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:34 ++msgid "stat_ds_ps_state" ++msgstr "" ++ ++#. %H: Process %pi - used cpu time ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:35 ++msgid "stat_dg_title_processes__ps_cputime" ++msgstr "" ++ ++#. Jiffies ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:36 ++msgid "stat_dg_label_processes__ps_cputime" ++msgstr "" ++ ++#. system ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:37 ++msgid "stat_ds_ps_cputime__syst" ++msgstr "" ++ ++#. user ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:38 ++msgid "stat_ds_ps_cputime__user" ++msgstr "" ++ ++#. %H: Process %pi - threads and processes ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:39 ++msgid "stat_dg_title_processes__ps_count" ++msgstr "" ++ ++#. Count ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:40 ++msgid "stat_dg_label_processes__ps_count" ++msgstr "" ++ ++#. %ds ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:41 ++msgid "stat_ds_ps_count" ++msgstr "" ++ ++#. %H: Process %pi - page faults ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:42 ++msgid "stat_dg_title_processes__ps_pagefaults" ++msgstr "" ++ ++#. Pagefaults ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:43 ++msgid "stat_dg_label_processes__ps_pagefaults" ++msgstr "" ++ ++#. page faults ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:44 ++msgid "stat_ds_ps_pagefaults" ++msgstr "" ++ ++#. %H: Process %pi - virtual memory size ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:45 ++msgid "stat_dg_title_processes__ps_rss" ++msgstr "" ++ ++#. Bytes ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:46 ++msgid "stat_dg_label_processes__ps_rss" ++msgstr "" ++ ++#. virtual memory ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:47 ++msgid "stat_ds_ps_rss" ++msgstr "" ++ ++#. %H: Usage on Processor #%pi ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:48 ++msgid "stat_dg_title_cpu" ++msgstr "" ++ ++#. % ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:49 ++msgid "stat_dg_label_cpu" ++msgstr "" ++ ++#. %di ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:50 ++msgid "stat_ds_cpu" ++msgstr "" ++ ++#. %H: Transfer on %di ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:51 ++msgid "stat_dg_title_interface__if_octets" ++msgstr "" ++ ++#. Bytes/s ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:52 ++msgid "stat_dg_label_interface__if_octets" ++msgstr "" ++ ++#. %H: Packets on %di ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:53 ++msgid "stat_dg_title_interface__if_packets" ++msgstr "" ++ ++#. Packets/s ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:54 ++msgid "stat_dg_label_interface__if_packets" ++msgstr "" ++ ++#. %H: TCP-Connections to Port %pi ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:55 ++msgid "stat_dg_title_tcpconns" ++msgstr "" ++ ++#. Connections/s ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:56 ++msgid "stat_dg_label_tcpconns" ++msgstr "" ++ ++#. %di ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:57 ++msgid "stat_ds_tcp_connections" ++msgstr "" ++ ++#. %H: Disk Space Usage on %di ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:58 ++msgid "stat_dg_title_df" ++msgstr "" ++ ++#. Bytes ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:59 ++msgid "stat_dg_label_df" ++msgstr "" ++ ++#. %ds ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:60 ++msgid "stat_ds_df__free" ++msgstr "" ++ ++#. %ds ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:61 ++msgid "stat_ds_df__used" ++msgstr "" ++ ++#. %H: Interrupts ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:62 ++msgid "stat_dg_title_irq" ++msgstr "" ++ ++#. Issues/s ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:63 ++msgid "stat_dg_label_irq" ++msgstr "" ++ ++#. IRQ %di ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:64 ++msgid "stat_ds_irq" ++msgstr "" ++ ++#. %H: System Load ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:65 ++msgid "stat_dg_title_load" ++msgstr "" ++ ++#. Load ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:66 ++msgid "stat_dg_label_load" ++msgstr "" ++ ++#. 1 min ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:67 ++msgid "stat_ds_load__shortterm" ++msgstr "" ++ ++#. 5 min ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:68 ++msgid "stat_ds_load__midterm" ++msgstr "" ++ ++#. 15 min ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:69 ++msgid "stat_ds_load__longterm" ++msgstr "" +diff --git a/feeds/luci/applications/luci-app-statistics/po/ro/statistics.po b/feeds/luci/applications/luci-app-statistics/po/ro/statistics.po +new file mode 100644 +index 0000000..f6c049f +--- /dev/null ++++ b/feeds/luci/applications/luci-app-statistics/po/ro/statistics.po +@@ -0,0 +1,624 @@ ++# statistics.pot ++# generated from ./applications/luci-statistics/luasrc/i18n/statistics.en.lua ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"PO-Revision-Date: 2011-10-07 17:27+0200\n" ++"Last-Translator: Daniel \n" ++"Language-Team: none\n" ++"Language: ro\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=3; plural=(n==1 ? 0 : (n==0 || (n%100 > 0 && n%100 < " ++"20)) ? 1 : 2);;\n" ++"X-Generator: Pootle 2.0.4\n" ++ ++msgid "Action (target)" ++msgstr "" ++ ++msgid "Add command for reading values" ++msgstr "" ++ ++msgid "Add matching rule" ++msgstr "" ++ ++msgid "Add multiple hosts separated by space." ++msgstr "" ++ ++msgid "Add notification command" ++msgstr "" ++ ++msgid "Base Directory" ++msgstr "Directorul de baza" ++ ++msgid "Basic monitoring" ++msgstr "" ++ ++msgid "CPU Plugin Configuration" ++msgstr "Configurarea pluginului CPU" ++ ++msgid "CSV Output" ++msgstr "Afisarea CSV" ++ ++msgid "CSV Plugin Configuration" ++msgstr "Configurarea pluginului CVS" ++ ++msgid "Cache collected data for" ++msgstr "" ++ ++msgid "Cache flush interval" ++msgstr "" ++ ++msgid "Chain" ++msgstr "" ++ ++msgid "CollectLinks" ++msgstr "" ++ ++msgid "CollectRoutes" ++msgstr "" ++ ++msgid "CollectTopology" ++msgstr "" ++ ++msgid "Collectd" ++msgstr "Collectd" ++ ++msgid "Collectd Settings" ++msgstr "Setarile Collectd" ++ ++msgid "" ++"Collectd is a small daemon for collecting data from various sources through " ++"different plugins. On this page you can change general settings for the " ++"collectd daemon." ++msgstr "" ++"Collectd e un serviciu mic pentru colectarea de date din diferite surse prin " ++"diferite pluginuri. In aceasta pagina poti schimba setarile generale pentru " ++"Collectd." ++ ++msgid "Conntrack" ++msgstr "" ++ ++msgid "Conntrack Plugin Configuration" ++msgstr "" ++ ++msgid "DF Plugin Configuration" ++msgstr "" ++ ++msgid "DNS" ++msgstr "DNS" ++ ++msgid "DNS Plugin Configuration" ++msgstr "" ++ ++msgid "Data collection interval" ++msgstr "Intervalul de colectare date" ++ ++msgid "Datasets definition file" ++msgstr "Fisierul de definitii dataseturi" ++ ++msgid "Destination ip range" ++msgstr "" ++ ++msgid "Directory for collectd plugins" ++msgstr "Directorul pentru pluginurile collectd" ++ ++msgid "Directory for sub-configurations" ++msgstr "Directorul pentru sub-configuratii" ++ ++msgid "Disk Plugin Configuration" ++msgstr "" ++ ++msgid "Disk Space Usage" ++msgstr "Utilizarea spatiului pe disc" ++ ++msgid "Disk Usage" ++msgstr "Utilizarea discului" ++ ++msgid "Display Host »" ++msgstr "" ++ ++msgid "Display timespan »" ++msgstr "" ++ ++msgid "E-Mail Plugin Configuration" ++msgstr "" ++ ++msgid "Email" ++msgstr "Email" ++ ++msgid "Enable this plugin" ++msgstr "" ++ ++msgid "Exec" ++msgstr "Exec" ++ ++msgid "Exec Plugin Configuration" ++msgstr "" ++ ++msgid "Filter class monitoring" ++msgstr "" ++ ++msgid "Firewall" ++msgstr "Firewall" ++ ++msgid "Flush cache after" ++msgstr "" ++ ++msgid "Forwarding between listen and server addresses" ++msgstr "" ++ ++msgid "Graphs" ++msgstr "Grafice" ++ ++msgid "Group" ++msgstr "" ++ ++msgid "" ++"Here you can define external commands which will be started by collectd in " ++"order to read certain values. The values will be read from stdout." ++msgstr "" ++ ++msgid "" ++"Here you can define external commands which will be started by collectd when " ++"certain threshold values have been reached. The values leading to invokation " ++"will be feeded to the the called programs stdin." ++msgstr "" ++ ++msgid "" ++"Here you can define various criteria by which the monitored iptables rules " ++"are selected." ++msgstr "" ++ ++msgid "Host" ++msgstr "" ++ ++msgid "Hostname" ++msgstr "Numele de host" ++ ++msgid "IP or hostname where to get the txtinfo output from" ++msgstr "" ++ ++msgid "IRQ Plugin Configuration" ++msgstr "" ++ ++msgid "Ignore source addresses" ++msgstr "" ++ ++msgid "Incoming interface" ++msgstr "" ++ ++msgid "Interface Plugin Configuration" ++msgstr "" ++ ++msgid "Interfaces" ++msgstr "Interfete" ++ ++msgid "Interrupts" ++msgstr "Intreruperi" ++ ++msgid "Interval for pings" ++msgstr "Interval pentru ping" ++ ++msgid "Iptables Plugin Configuration" ++msgstr "" ++ ++msgid "Leave unselected to automatically determine interfaces to monitor." ++msgstr "" ++ ++msgid "Listen host" ++msgstr "" ++ ++msgid "Listen port" ++msgstr "" ++ ++msgid "Listener interfaces" ++msgstr "" ++ ++msgid "Load Plugin Configuration" ++msgstr "" ++ ++msgid "Maximum allowed connections" ++msgstr "" ++ ++msgid "Memory" ++msgstr "" ++ ++msgid "Memory Plugin Configuration" ++msgstr "" ++ ++msgid "Monitor all except specified" ++msgstr "" ++ ++msgid "Monitor all local listen ports" ++msgstr "" ++ ++msgid "Monitor devices" ++msgstr "" ++ ++msgid "Monitor disks and partitions" ++msgstr "" ++ ++msgid "Monitor filesystem types" ++msgstr "" ++ ++msgid "Monitor hosts" ++msgstr "" ++ ++msgid "Monitor interfaces" ++msgstr "" ++ ++msgid "Monitor interrupts" ++msgstr "" ++ ++msgid "Monitor local ports" ++msgstr "" ++ ++msgid "Monitor mount points" ++msgstr "" ++ ++msgid "Monitor processes" ++msgstr "" ++ ++msgid "Monitor remote ports" ++msgstr "" ++ ++msgid "Name of the rule" ++msgstr "" ++ ++msgid "Netlink" ++msgstr "Legatura de retea" ++ ++msgid "Netlink Plugin Configuration" ++msgstr "" ++ ++msgid "Network" ++msgstr "Retea" ++ ++msgid "Network Plugin Configuration" ++msgstr "" ++ ++msgid "Network plugins" ++msgstr "Pluginuri de retea" ++ ++msgid "Network protocol" ++msgstr "" ++ ++msgid "Number of threads for data collection" ++msgstr "Numarul de threaduri pentru colectarea datelor" ++ ++msgid "OLSRd" ++msgstr "" ++ ++msgid "OLSRd Plugin Configuration" ++msgstr "" ++ ++msgid "Only create average RRAs" ++msgstr "" ++ ++msgid "Options" ++msgstr "" ++ ++msgid "Outgoing interface" ++msgstr "" ++ ++msgid "Output plugins" ++msgstr "Pluginuri de iesire" ++ ++msgid "Ping" ++msgstr "Ping" ++ ++msgid "Ping Plugin Configuration" ++msgstr "" ++ ++msgid "Port" ++msgstr "" ++ ++msgid "Processes" ++msgstr "Procese" ++ ++msgid "Processes Plugin Configuration" ++msgstr "" ++ ++msgid "Processes to monitor separated by space" ++msgstr "" ++ ++msgid "Processor" ++msgstr "Procesor" ++ ++msgid "Qdisc monitoring" ++msgstr "" ++ ++msgid "RRD XFiles Factor" ++msgstr "" ++ ++msgid "RRD heart beat interval" ++msgstr "" ++ ++msgid "RRD step interval" ++msgstr "" ++ ++msgid "RRDTool" ++msgstr "RRDTool" ++ ++msgid "RRDTool Plugin Configuration" ++msgstr "" ++ ++msgid "Rows per RRA" ++msgstr "" ++ ++msgid "Script" ++msgstr "" ++ ++msgid "Seconds" ++msgstr "Secunde" ++ ++msgid "Server host" ++msgstr "" ++ ++msgid "Server port" ++msgstr "" ++ ++msgid "Shaping class monitoring" ++msgstr "" ++ ++msgid "Socket file" ++msgstr "" ++ ++msgid "Socket group" ++msgstr "" ++ ++msgid "Socket permissions" ++msgstr "" ++ ++msgid "Source ip range" ++msgstr "" ++ ++msgid "Specifies what information to collect about links." ++msgstr "" ++ ++msgid "Specifies what information to collect about routes." ++msgstr "" ++ ++msgid "Specifies what information to collect about the global topology." ++msgstr "" ++ ++msgid "Splash Leases" ++msgstr "" ++ ++msgid "Splash Leases Plugin Configuration" ++msgstr "" ++ ++msgid "Statistics" ++msgstr "" ++ ++msgid "Storage directory" ++msgstr "" ++ ++msgid "Storage directory for the csv files" ++msgstr "" ++ ++msgid "Store data values as rates instead of absolute values" ++msgstr "" ++ ++msgid "Stored timespans" ++msgstr "" ++ ++msgid "System Load" ++msgstr "Incarcarea de sistem" ++ ++msgid "System plugins" ++msgstr "Pluginuri de sistem" ++ ++msgid "TCP Connections" ++msgstr "Conexiuni TCP" ++ ++msgid "TCPConns Plugin Configuration" ++msgstr "" ++ ++msgid "TTL for network packets" ++msgstr "" ++ ++msgid "TTL for ping packets" ++msgstr "" ++ ++msgid "Table" ++msgstr "" ++ ++msgid "The NUT plugin reads information about Uninterruptible Power Supplies." ++msgstr "" ++ ++msgid "" ++"The OLSRd plugin reads information about meshed networks from the txtinfo " ++"plugin of OLSRd." ++msgstr "" ++ ++msgid "" ++"The conntrack plugin collects statistics about the number of tracked " ++"connections." ++msgstr "" ++ ++msgid "The cpu plugin collects basic statistics about the processor usage." ++msgstr "" ++"Pluginul pentru CPU colecteaza statistici de baza despre utilizarea " ++"procesorului." ++ ++msgid "" ++"The csv plugin stores collected data in csv file format for further " ++"processing by external programs." ++msgstr "" ++ ++msgid "" ++"The df plugin collects statistics about the disk space usage on different " ++"devices, mount points or filesystem types." ++msgstr "" ++ ++msgid "" ++"The disk plugin collects detailled usage statistics for selected partitions " ++"or whole disks." ++msgstr "" ++ ++msgid "" ++"The dns plugin collects detailled statistics about dns related traffic on " ++"selected interfaces." ++msgstr "" ++ ++msgid "" ++"The email plugin creates a unix socket which can be used to transmit email-" ++"statistics to a running collectd daemon. This plugin is primarily intended " ++"to be used in conjunction with Mail::SpamAssasin::Plugin::Collectd but can " ++"be used in other ways as well." ++msgstr "" ++ ++msgid "" ++"The exec plugin starts external commands to read values from or to notify " ++"external processes when certain threshold values have been reached." ++msgstr "" ++ ++msgid "" ++"The interface plugin collects traffic statistics on selected interfaces." ++msgstr "" ++ ++msgid "" ++"The iptables plugin will monitor selected firewall rules and collect " ++"informations about processed bytes and packets per rule." ++msgstr "" ++ ++msgid "" ++"The irq plugin will monitor the rate of issues per second for each selected " ++"interrupt. If no interrupt is selected then all interrupts are monitored." ++msgstr "" ++ ++msgid "" ++"The iwinfo plugin collects statistics about wireless signal strength, noise " ++"and quality." ++msgstr "" ++ ++msgid "The load plugin collects statistics about the general system load." ++msgstr "" ++ ++msgid "The memory plugin collects statistics about the memory usage." ++msgstr "" ++ ++msgid "" ++"The netlink plugin collects extended informations like qdisc-, class- and " ++"filter-statistics for selected interfaces." ++msgstr "" ++ ++msgid "" ++"The network plugin provides network based communication between different " ++"collectd instances. Collectd can operate both in client and server mode. In " ++"client mode locally collected data is transferred to a collectd server " ++"instance, in server mode the local instance receives data from other hosts." ++msgstr "" ++ ++msgid "" ++"The ping plugin will send icmp echo replies to selected hosts and measure " ++"the roundtrip time for each host." ++msgstr "" ++ ++msgid "" ++"The processes plugin collects informations like cpu time, page faults and " ++"memory usage of selected processes." ++msgstr "" ++ ++msgid "" ++"The rrdtool plugin stores the collected data in rrd database files, the " ++"foundation of the diagrams.

    Warning: Setting the wrong " ++"values will result in a very high memory consumption in the temporary " ++"directory. This can render the device unusable!" ++msgstr "" ++ ++msgid "" ++"The splash leases plugin uses libuci to collect statistics about splash " ++"leases." ++msgstr "" ++ ++msgid "" ++"The statistics package is based on Collectd and uses RRD " ++"Tool to render diagram images from collected data." ++msgstr "" ++ ++msgid "" ++"The tcpconns plugin collects informations about open tcp connections on " ++"selected ports." ++msgstr "" ++ ++msgid "" ++"The unixsock plugin creates a unix socket which can be used to read " ++"collected data from a running collectd instance." ++msgstr "" ++ ++msgid "The uptime plugin collects statistics about the uptime of the system." ++msgstr "" ++ ++msgid "" ++"This section defines on which interfaces collectd will wait for incoming " ++"connections." ++msgstr "" ++ ++msgid "" ++"This section defines to which servers the locally collected data is sent to." ++msgstr "" ++ ++msgid "Try to lookup fully qualified hostname" ++msgstr "Incearca sa rezolvi numele de domeniu complet" ++ ++msgid "UPS" ++msgstr "" ++ ++msgid "UPS Plugin Configuration" ++msgstr "" ++ ++msgid "UPS name in NUT ups@host format" ++msgstr "" ++ ++msgid "UnixSock" ++msgstr "UnixSock" ++ ++msgid "Unixsock Plugin Configuration" ++msgstr "" ++ ++msgid "Uptime" ++msgstr "" ++ ++msgid "Uptime Plugin Configuration" ++msgstr "" ++ ++msgid "Used PID file" ++msgstr "Fisierul pentru PID folosit" ++ ++msgid "User" ++msgstr "" ++ ++msgid "Verbose monitoring" ++msgstr "" ++ ++msgid "Wireless" ++msgstr "Wireless" ++ ++msgid "Wireless iwinfo Plugin Configuration" ++msgstr "" ++ ++msgid "e.g. br-ff" ++msgstr "" ++ ++msgid "e.g. br-lan" ++msgstr "" ++ ++msgid "e.g. reject-with tcp-reset" ++msgstr "" ++ ++msgid "max. 16 chars" ++msgstr "" ++ ++msgid "reduces rrd size" ++msgstr "" ++ ++msgid "seconds; multiple separated by space" ++msgstr "" ++ ++msgid "server interfaces" ++msgstr "" +diff --git a/feeds/luci/applications/luci-app-statistics/po/ru/rrdtool.po b/feeds/luci/applications/luci-app-statistics/po/ru/rrdtool.po +new file mode 100644 +index 0000000..a63a850 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-statistics/po/ru/rrdtool.po +@@ -0,0 +1,360 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Report-Msgid-Bugs-To: \n" ++"POT-Creation-Date: 2009-05-19 19:36+0200\n" ++"PO-Revision-Date: 2012-03-26 15:36+0200\n" ++"Last-Translator: Anonymous Pootle User\n" ++"Language-Team: LANGUAGE \n" ++"Language: ru\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%" ++"10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" ++"X-Generator: Pootle 2.0.4\n" ++ ++#. %H: Wireless - Signal Noise Ratio ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:1 ++msgid "stat_dg_title_wireless__signal_noise" ++msgstr "%H: БеÑÐ¿Ñ€Ð¾Ð²Ð¾Ð´Ð½Ð°Ñ ÑвÑзь - отношение Ñигнал/шум" ++ ++#. dBm ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:2 ++msgid "stat_dg_label_wireless__signal_noise" ++msgstr "дБм" ++ ++#. Noise Level ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:3 ++msgid "stat_ds_signal_noise" ++msgstr "Уровень шума" ++ ++#. Signal Strength ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:4 ++msgid "stat_ds_signal_power" ++msgstr "МощноÑÑ‚ÑŒ Ñигнала" ++ ++#. %H: Wireless - Signal Quality ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:5 ++msgid "stat_dg_title_wireless__signal_quality" ++msgstr "%H: БеÑÐ¿Ñ€Ð¾Ð²Ð¾Ð´Ð½Ð°Ñ ÑвÑзь - качеÑтво Ñигнала" ++ ++#. n ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:6 ++msgid "stat_dg_label_wireless__signal_quality" ++msgstr "n" ++ ++#. Signal Quality ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:7 ++msgid "stat_ds_signal_quality" ++msgstr "КачеÑтво Ñигнала" ++ ++#. %H: ICMP Roundtrip Times ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:8 ++msgid "stat_dg_title_ping" ++msgstr "%H: Сквозное Ð²Ñ€ÐµÐ¼Ñ ICMP" ++ ++#. ms ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:9 ++msgid "stat_dg_label_ping" ++msgstr "мÑ" ++ ++#. %di ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:10 ++msgid "stat_ds_ping" ++msgstr "%di" ++ ++#. %H: Firewall - Processed Packets ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:11 ++msgid "stat_dg_title_iptables__ipt_packets" ++msgstr "%H: МежÑетевой Ñкран - обработанные пакеты" ++ ++#. Packets/s ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:12 ++msgid "stat_dg_label_iptables__ipt_packets" ++msgstr "пакет/c" ++ ++#. Chain \"%di\" ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:13 ++msgid "stat_ds_ipt_packets" ++msgstr "\"%di\"" ++ ++#. %H: Netlink - Transfer on %pi ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:14 ++msgid "stat_dg_title_netlink__if_octets" ++msgstr "%H: Netlink - передача на %pi" ++ ++#. Bytes/s ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:15 ++msgid "stat_dg_label_netlink__if_octets" ++msgstr "байт/c" ++ ++#. Bytes (%ds) ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:16 ++msgid "stat_ds_if_octets" ++msgstr "Байт (%ds)" ++ ++#. %H: Netlink - Packets on %pi ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:17 ++msgid "stat_dg_title_netlink__if_packets" ++msgstr "%H: Netlink - пакеты на %pi" ++ ++#. Packets/s ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:18 ++msgid "stat_dg_label_netlink__if_packets" ++msgstr "пакет/c" ++ ++#. Processed (%ds) ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:19 ++msgid "stat_ds_if_packets" ++msgstr "Обработано (%ds)" ++ ++#. Dropped (%ds) ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:20 ++msgid "stat_ds_if_dropped" ++msgstr "ИÑключено (%ds)" ++ ++#. Errors (%ds) ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:21 ++msgid "stat_ds_if_errors" ++msgstr "Ошибок (%ds)" ++ ++#. %H: Netlink - Multicast on %pi ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:22 ++msgid "stat_dg_title_netlink__if_multicast" ++msgstr "%H: Netlink - групповые пакеты на %pi" ++ ++#. Packets/s ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:23 ++msgid "stat_dg_label_netlink__if_multicast" ++msgstr "пакет/Ñ" ++ ++#. Packets ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:24 ++msgid "stat_ds_if_multicast" ++msgstr "Пакеты" ++ ++#. %H: Netlink - Collisions on %pi ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:25 ++msgid "stat_dg_title_netlink__if_collisions" ++msgstr "%H: Netlink - коллизии на %pi" ++ ++#. Collisions/s ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:26 ++msgid "stat_dg_label_netlink__if_collisions" ++msgstr "коллиз/Ñек" ++ ++#. Collisions ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:27 ++msgid "stat_ds_if_collisions" ++msgstr "Коллизии" ++ ++#. %H: Netlink - Errors on %pi ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:28 ++msgid "stat_dg_title_netlink__if_tx_errors" ++msgstr "%H: Netlink - Ошибки на %pi" ++ ++#. Errors/s ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:29 ++msgid "stat_dg_label_netlink__if_tx_errors" ++msgstr "ошибок/c" ++ ++#. %di ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:30 ++msgid "stat_ds_if_tx_errors" ++msgstr "%di" ++ ++#. %di ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:31 ++msgid "stat_ds_if_rx_errors" ++msgstr "%di" ++ ++#. %H: Processes ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:32 ++msgid "stat_dg_title_processes" ++msgstr "%H: ПроцеÑÑÑ‹" ++ ++#. Processes/s ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:33 ++msgid "stat_dg_label_processes" ++msgstr "ПроцеÑÑов/Ñ" ++ ++#. %di ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:34 ++msgid "stat_ds_ps_state" ++msgstr "%di" ++ ++#. %H: Process %pi - used cpu time ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:35 ++msgid "stat_dg_title_processes__ps_cputime" ++msgstr "%H: ПроцеÑÑ %pi - Ð²Ñ€ÐµÐ¼Ñ Ð¦ÐŸ" ++ ++#. Jiffies ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:36 ++msgid "stat_dg_label_processes__ps_cputime" ++msgstr "Jiffies" ++ ++#. system ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:37 ++msgid "stat_ds_ps_cputime__syst" ++msgstr "ÑиÑтема" ++ ++#. user ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:38 ++msgid "stat_ds_ps_cputime__user" ++msgstr "пользователь" ++ ++#. %H: Process %pi - threads and processes ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:39 ++msgid "stat_dg_title_processes__ps_count" ++msgstr "%H: ПроцеÑÑ %pi - потоков и процеÑÑов" ++ ++#. Count ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:40 ++msgid "stat_dg_label_processes__ps_count" ++msgstr "КоличеÑтво" ++ ++#. %ds ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:41 ++msgid "stat_ds_ps_count" ++msgstr "%ds" ++ ++#. %H: Process %pi - page faults ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:42 ++msgid "stat_dg_title_processes__ps_pagefaults" ++msgstr "%H: ПроцеÑÑ %pi - ошибки Ñтраниц" ++ ++#. Pagefaults ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:43 ++msgid "stat_dg_label_processes__ps_pagefaults" ++msgstr "Ошибки Ñтраниц" ++ ++#. page faults ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:44 ++msgid "stat_ds_ps_pagefaults" ++msgstr "ошибки Ñтраниц" ++ ++#. %H: Process %pi - virtual memory size ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:45 ++msgid "stat_dg_title_processes__ps_rss" ++msgstr "%H: ПроцеÑÑ %pi - размер виртуальной памÑти" ++ ++#. Bytes ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:46 ++msgid "stat_dg_label_processes__ps_rss" ++msgstr "Байт" ++ ++#. virtual memory ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:47 ++msgid "stat_ds_ps_rss" ++msgstr "Ð²Ð¸Ñ€Ñ‚ÑƒÐ°Ð»ÑŒÐ½Ð°Ñ Ð¿Ð°Ð¼ÑÑ‚ÑŒ" ++ ++#. %H: Usage on Processor #%pi ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:48 ++msgid "stat_dg_title_cpu" ++msgstr "%H: ИÑпользование ЦП #%pi" ++ ++#. % ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:49 ++msgid "stat_dg_label_cpu" ++msgstr "%" ++ ++#. %di ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:50 ++msgid "stat_ds_cpu" ++msgstr "%di" ++ ++#. %H: Transfer on %di ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:51 ++msgid "stat_dg_title_interface__if_octets" ++msgstr "%H: Передача на %di" ++ ++#. Bytes/s ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:52 ++msgid "stat_dg_label_interface__if_octets" ++msgstr "байт/c" ++ ++#. %H: Packets on %di ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:53 ++msgid "stat_dg_title_interface__if_packets" ++msgstr "%H: Пакетов на %di" ++ ++#. Packets/s ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:54 ++msgid "stat_dg_label_interface__if_packets" ++msgstr "пакетов/c" ++ ++#. %H: TCP-Connections to Port %pi ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:55 ++msgid "stat_dg_title_tcpconns" ++msgstr "%H: TCP Ñоединений на порт %pi " ++ ++#. Connections/s ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:56 ++msgid "stat_dg_label_tcpconns" ++msgstr "Ñоединений/Ñ" ++ ++#. %di ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:57 ++msgid "stat_ds_tcp_connections" ++msgstr "%di" ++ ++#. %H: Disk Space Usage on %di ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:58 ++msgid "stat_dg_title_df" ++msgstr "%H: ИÑпользование диÑкового проÑтранÑтва на %di" ++ ++#. Bytes ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:59 ++msgid "stat_dg_label_df" ++msgstr "Байт" ++ ++#. %ds ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:60 ++msgid "stat_ds_df__free" ++msgstr "%ds" ++ ++#. %ds ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:61 ++msgid "stat_ds_df__used" ++msgstr "%ds" ++ ++#. %H: Interrupts ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:62 ++msgid "stat_dg_title_irq" ++msgstr "%H: прерываниÑ" ++ ++#. Issues/s ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:63 ++msgid "stat_dg_label_irq" ++msgstr "запроÑов/Ñ" ++ ++#. IRQ %di ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:64 ++msgid "stat_ds_irq" ++msgstr "IRQ %di" ++ ++#. %H: System Load ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:65 ++msgid "stat_dg_title_load" ++msgstr "%H: Загрузка ÑиÑтемы" ++ ++#. Load ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:66 ++msgid "stat_dg_label_load" ++msgstr "Загрузка" ++ ++#. 1 min ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:67 ++msgid "stat_ds_load__shortterm" ++msgstr "1 мин." ++ ++#. 5 min ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:68 ++msgid "stat_ds_load__midterm" ++msgstr "5 мин." ++ ++#. 15 min ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:69 ++msgid "stat_ds_load__longterm" ++msgstr "15 мин." +diff --git a/feeds/luci/applications/luci-app-statistics/po/ru/statistics.po b/feeds/luci/applications/luci-app-statistics/po/ru/statistics.po +new file mode 100644 +index 0000000..da47dff +--- /dev/null ++++ b/feeds/luci/applications/luci-app-statistics/po/ru/statistics.po +@@ -0,0 +1,718 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: LuCI: statistics\n" ++"Report-Msgid-Bugs-To: \n" ++"POT-Creation-Date: 2009-05-19 19:36+0200\n" ++"PO-Revision-Date: 2013-12-05 17:11+0200\n" ++"Last-Translator: Dmitri <4glitch@gmail.com>\n" ++"Language-Team: Russian \n" ++"Language: ru\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%" ++"10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" ++"X-Generator: Pootle 2.0.6\n" ++"X-Poedit-SourceCharset: UTF-8\n" ++ ++msgid "Action (target)" ++msgstr "ДейÑтвие (цель)" ++ ++msgid "Add command for reading values" ++msgstr "Добавить команду Ð´Ð»Ñ Ñ‡Ñ‚ÐµÐ½Ð¸Ñ Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ð¹" ++ ++msgid "Add matching rule" ++msgstr "Добавить правило выборки" ++ ++msgid "Add multiple hosts separated by space." ++msgstr "Добавить неÑколько хоÑтов, разделённых пробелом" ++ ++msgid "Add notification command" ++msgstr "Добавить команду уведомлениÑ" ++ ++msgid "Base Directory" ++msgstr "Ð‘Ð°Ð·Ð¾Ð²Ð°Ñ Ð´Ð¸Ñ€ÐµÐºÑ‚Ð¾Ñ€Ð¸Ñ" ++ ++msgid "Basic monitoring" ++msgstr "Ð‘Ð°Ð·Ð¾Ð²Ð°Ñ ÑтатиÑтика" ++ ++msgid "CPU Plugin Configuration" ++msgstr "ÐšÐ¾Ð½Ñ„Ð¸Ð³ÑƒÑ€Ð°Ñ†Ð¸Ñ Ð¼Ð¾Ð´ÑƒÐ»Ñ CPU" ++ ++msgid "CSV Output" ++msgstr "Вывод в CSV" ++ ++msgid "CSV Plugin Configuration" ++msgstr "ÐšÐ¾Ð½Ñ„Ð¸Ð³ÑƒÑ€Ð°Ñ†Ð¸Ñ Ð¼Ð¾Ð´ÑƒÐ»Ñ CSV" ++ ++msgid "Cache collected data for" ++msgstr "КÑшировать Ñобранную ÑтатиÑтику в течение" ++ ++msgid "Cache flush interval" ++msgstr "Интервал ÑброÑа кÑша" ++ ++msgid "Chain" ++msgstr "Цепочка" ++ ++msgid "CollectLinks" ++msgstr "Сбор информации о ÑоединениÑÑ… (CollectLinks)" ++ ++msgid "CollectRoutes" ++msgstr "Сбор информации о маршрутах (CollectRoutes)" ++ ++msgid "CollectTopology" ++msgstr "Сбор информации о топологии (CollectTopology)" ++ ++msgid "Collectd" ++msgstr "Collectd" ++ ++msgid "Collectd Settings" ++msgstr "ÐаÑтройки Collectd" ++ ++msgid "" ++"Collectd is a small daemon for collecting data from various sources through " ++"different plugins. On this page you can change general settings for the " ++"collectd daemon." ++msgstr "" ++"Collectd - Ñто ÑÐµÑ€Ð²Ð¸Ñ Ð´Ð»Ñ Ñбора данных Ñ Ñ€Ð°Ð·Ð½Ñ‹Ñ… модулей. Ðа Ñтой Ñтранице вы " ++"можете изменить наÑтройки Сollectd." ++ ++msgid "Conntrack" ++msgstr "ОтÑлеживание Ð¿Ð¾Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ (Conntrack)" ++ ++msgid "Conntrack Plugin Configuration" ++msgstr "ÐаÑтройка плагина Conntrack" ++ ++msgid "DF Plugin Configuration" ++msgstr "ÐšÐ¾Ð½Ñ„Ð¸Ð³ÑƒÑ€Ð°Ñ†Ð¸Ñ Ð¼Ð¾Ð´ÑƒÐ»Ñ DF" ++ ++msgid "DNS" ++msgstr "DNS" ++ ++msgid "DNS Plugin Configuration" ++msgstr "ÐšÐ¾Ð½Ñ„Ð¸Ð³ÑƒÑ€Ð°Ñ†Ð¸Ñ Ð¼Ð¾Ð´ÑƒÐ»Ñ DNS" ++ ++msgid "Data collection interval" ++msgstr "Интервал Ñбора данных" ++ ++msgid "Datasets definition file" ++msgstr "Файл Ñ Ð¾Ð¿Ñ€ÐµÐ´ÐµÐ»ÐµÐ½Ð¸ÐµÐ¼ набора данных" ++ ++msgid "Destination ip range" ++msgstr "Диапазон IP-адреÑов назначениÑ" ++ ++msgid "Directory for collectd plugins" ++msgstr "Ð”Ð¸Ñ€ÐµÐºÑ‚Ð¾Ñ€Ð¸Ñ Ñ Ð¼Ð¾Ð´ÑƒÐ»Ñми collectd" ++ ++msgid "Directory for sub-configurations" ++msgstr "Ð”Ð¸Ñ€ÐµÐºÑ‚Ð¾Ñ€Ð¸Ñ ÐºÐ¾Ð½Ñ„Ð¸Ð³ÑƒÑ€Ð°Ñ†Ð¸Ð¹" ++ ++msgid "Disk Plugin Configuration" ++msgstr "ÐšÐ¾Ð½Ñ„Ð¸Ð³ÑƒÑ€Ð°Ñ†Ð¸Ñ Ð¼Ð¾Ð´ÑƒÐ»Ñ Disk" ++ ++msgid "Disk Space Usage" ++msgstr "ИÑпользование диÑка" ++ ++msgid "Disk Usage" ++msgstr "ИÑпользование диÑка" ++ ++msgid "Display Host »" ++msgstr "Показать узел »" ++ ++msgid "Display timespan »" ++msgstr "Показать за промежуток »" ++ ++msgid "E-Mail Plugin Configuration" ++msgstr "ÐšÐ¾Ð½Ñ„Ð¸Ð³ÑƒÑ€Ð°Ñ†Ð¸Ñ Ð¼Ð¾Ð´ÑƒÐ»Ñ E-Mail" ++ ++msgid "Email" ++msgstr "E-mail" ++ ++msgid "Enable this plugin" ++msgstr "Включить Ñтот модуль" ++ ++msgid "Exec" ++msgstr "Exec" ++ ++msgid "Exec Plugin Configuration" ++msgstr "ÐšÐ¾Ð½Ñ„Ð¸Ð³ÑƒÑ€Ð°Ñ†Ð¸Ñ Ð¼Ð¾Ð´ÑƒÐ»Ñ Exec" ++ ++#, fuzzy ++msgid "Filter class monitoring" ++msgstr "Мониторинг клаÑÑов фильтров" ++ ++msgid "Firewall" ++msgstr "Firewall" ++ ++msgid "Flush cache after" ++msgstr "СброÑить кÑш поÑле" ++ ++msgid "Forwarding between listen and server addresses" ++msgstr "Перенаправление между локальным адреÑом и адреÑом Ñервера" ++ ++msgid "Graphs" ++msgstr "Графики" ++ ++msgid "Group" ++msgstr "Группа" ++ ++msgid "" ++"Here you can define external commands which will be started by collectd in " ++"order to read certain values. The values will be read from stdout." ++msgstr "" ++"ЗдеÑÑŒ вы можете определить внешние команды, которые будут выполнены Ð´Ð»Ñ " ++"Ñ‡Ñ‚ÐµÐ½Ð¸Ñ Ð¾Ð¿Ñ€ÐµÐ´ÐµÐ»Ñ‘Ð½Ð½Ñ‹Ñ… значений. Ð—Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ Ð±ÑƒÐ´ÑƒÑ‚ Ñчитаны Ñо Ñтандартного вывода." ++ ++msgid "" ++"Here you can define external commands which will be started by collectd when " ++"certain threshold values have been reached. The values leading to invokation " ++"will be feeded to the the called programs stdin." ++msgstr "" ++"ЗдеÑÑŒ вы можете определить внешние команды, которые будут выполнены, когда " ++"Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ Ð´Ð¾Ñтигнут определённого порога. Ð—Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ Ð±ÑƒÐ´ÑƒÑ‚ переданы на " ++"Ñтандартный ввод вызванным программам." ++ ++msgid "" ++"Here you can define various criteria by which the monitored iptables rules " ++"are selected." ++msgstr "" ++"ЗдеÑÑŒ вы можете указать различные критерии, по которым будут выбраны правила " ++"Ð´Ð»Ñ Ñбора ÑтатиÑтики." ++ ++msgid "Host" ++msgstr "ХоÑÑ‚" ++ ++msgid "Hostname" ++msgstr "Ð˜Ð¼Ñ Ñ…Ð¾Ñта" ++ ++msgid "IP or hostname where to get the txtinfo output from" ++msgstr "IP-Ð°Ð´Ñ€ÐµÑ Ð¸Ð»Ð¸ Ð¸Ð¼Ñ Ñ…Ð¾Ñта, Ñ ÐºÐ¾Ñ‚Ð¾Ñ€Ñ‹Ñ… получать текÑтовый вывод" ++ ++msgid "IRQ Plugin Configuration" ++msgstr "ÐšÐ¾Ð½Ñ„Ð¸Ð³ÑƒÑ€Ð°Ñ†Ð¸Ñ Ð¼Ð¾Ð´ÑƒÐ»Ñ IRQ" ++ ++msgid "Ignore source addresses" ++msgstr "Игнорировать адреÑа-иÑточники" ++ ++msgid "Incoming interface" ++msgstr "ВходÑщий интерфейÑ" ++ ++msgid "Interface Plugin Configuration" ++msgstr "ÐšÐ¾Ð½Ñ„Ð¸Ð³ÑƒÑ€Ð°Ñ†Ð¸Ñ Ð¼Ð¾Ð´ÑƒÐ»Ñ Interface" ++ ++msgid "Interfaces" ++msgstr "ИнтерфейÑÑ‹" ++ ++msgid "Interrupts" ++msgstr "ПрерываниÑ" ++ ++msgid "Interval for pings" ++msgstr "Интервал Ð´Ð»Ñ ping-запроÑов" ++ ++msgid "Iptables Plugin Configuration" ++msgstr "ÐšÐ¾Ð½Ñ„Ð¸Ð³ÑƒÑ€Ð°Ñ†Ð¸Ñ Ð¼Ð¾Ð´ÑƒÐ»Ñ Iptables" ++ ++msgid "Leave unselected to automatically determine interfaces to monitor." ++msgstr "" ++"ОÑтавьте невыбранным Ð´Ð»Ñ Ð°Ð²Ñ‚Ð¾Ð¼Ð°Ñ‚Ð¸Ñ‡ÐµÑкого Ð¾Ð¿Ñ€ÐµÐ´ÐµÐ»ÐµÐ½Ð¸Ñ Ð¸Ð½Ñ‚ÐµÑ€Ñ„ÐµÐ¹Ñов Ð´Ð»Ñ " ++"мониторинга." ++ ++msgid "Listen host" ++msgstr "ХоÑÑ‚" ++ ++msgid "Listen port" ++msgstr "Порт" ++ ++msgid "Listener interfaces" ++msgstr "ИÑпользовать интерфейÑÑ‹" ++ ++msgid "Load Plugin Configuration" ++msgstr "ÐšÐ¾Ð½Ñ„Ð¸Ð³ÑƒÑ€Ð°Ñ†Ð¸Ñ Ð¼Ð¾Ð´ÑƒÐ»Ñ Load" ++ ++msgid "Maximum allowed connections" ++msgstr "МакÑимальное чиÑло Ñоединений" ++ ++msgid "Memory" ++msgstr "ПамÑÑ‚ÑŒ" ++ ++msgid "Memory Plugin Configuration" ++msgstr "ÐšÐ¾Ð½Ñ„Ð¸Ð³ÑƒÑ€Ð°Ñ†Ð¸Ñ Ð¼Ð¾Ð´ÑƒÐ»Ñ Memory" ++ ++msgid "Monitor all except specified" ++msgstr "Собирать ÑтатиÑтику Ñо вÑех, кроме указанных" ++ ++msgid "Monitor all local listen ports" ++msgstr "Собирать ÑтатиÑтику Ñо вÑех портов, ожидающих ÑоединениÑ" ++ ++msgid "Monitor devices" ++msgstr "Собирать ÑтатиÑтику Ñ ÑƒÑтройÑтв" ++ ++msgid "Monitor disks and partitions" ++msgstr "Собирать ÑтатиÑтику Ñ Ð´Ð¸Ñков и разделов" ++ ++msgid "Monitor filesystem types" ++msgstr "Собирать ÑтатиÑтику Ñ Ñ„Ð°Ð¹Ð»Ð¾Ð²Ñ‹Ñ… ÑиÑтем" ++ ++msgid "Monitor hosts" ++msgstr "Собирать ÑтатиÑтику Ñ Ñ…Ð¾Ñтов" ++ ++msgid "Monitor interfaces" ++msgstr "Собирать ÑтатиÑтику Ñ Ð¸Ð½Ñ‚ÐµÑ€Ñ„ÐµÐ¹Ñов" ++ ++msgid "Monitor interrupts" ++msgstr "Собирать ÑтатиÑтику по прерываниÑм" ++ ++msgid "Monitor local ports" ++msgstr "Собирать ÑтатиÑтику Ñ Ð»Ð¾ÐºÐ°Ð»ÑŒÐ½Ñ‹Ñ… портов" ++ ++msgid "Monitor mount points" ++msgstr "Собирать ÑтатиÑтику Ñ Ñ‚Ð¾Ñ‡ÐµÐº монтированиÑ" ++ ++msgid "Monitor processes" ++msgstr "Собирать ÑтатиÑтику Ñ Ð¿Ñ€Ð¾Ñ†ÐµÑÑов" ++ ++msgid "Monitor remote ports" ++msgstr "Собирать ÑтатиÑтику Ñ ÑƒÐ´Ð°Ð»Ñ‘Ð½Ð½Ñ‹Ñ… портов" ++ ++msgid "Name of the rule" ++msgstr "Ðазвание правила" ++ ++msgid "Netlink" ++msgstr "Netlink" ++ ++msgid "Netlink Plugin Configuration" ++msgstr "ÐšÐ¾Ð½Ñ„Ð¸Ð³ÑƒÑ€Ð°Ñ†Ð¸Ñ Ð¼Ð¾Ð´ÑƒÐ»Ñ Netlink" ++ ++msgid "Network" ++msgstr "Network" ++ ++msgid "Network Plugin Configuration" ++msgstr "ÐšÐ¾Ð½Ñ„Ð¸Ð³ÑƒÑ€Ð°Ñ†Ð¸Ñ Ð¼Ð¾Ð´ÑƒÐ»Ñ Network" ++ ++msgid "Network plugins" ++msgstr "Сетевые модули" ++ ++msgid "Network protocol" ++msgstr "Сетевой протокол" ++ ++msgid "Number of threads for data collection" ++msgstr "КоличеÑтво потоков Ñбора данных" ++ ++msgid "OLSRd" ++msgstr "OLSRd" ++ ++msgid "OLSRd Plugin Configuration" ++msgstr "ÐаÑтройка плагина OLSRd" ++ ++msgid "Only create average RRAs" ++msgstr "Создавать только Ñредние RRA" ++ ++msgid "Options" ++msgstr "Опции" ++ ++msgid "Outgoing interface" ++msgstr "ИÑходÑщий интерфейÑ" ++ ++msgid "Output plugins" ++msgstr "Модули вывода" ++ ++msgid "Ping" ++msgstr "Ping" ++ ++msgid "Ping Plugin Configuration" ++msgstr "ÐšÐ¾Ð½Ñ„Ð¸Ð³ÑƒÑ€Ð°Ñ†Ð¸Ñ Ð¼Ð¾Ð´ÑƒÐ»Ñ Ping" ++ ++msgid "Port" ++msgstr "Порт" ++ ++msgid "Processes" ++msgstr "ПроцеÑÑÑ‹" ++ ++msgid "Processes Plugin Configuration" ++msgstr "ÐšÐ¾Ð½Ñ„Ð¸Ð³ÑƒÑ€Ð°Ñ†Ð¸Ñ Ð¼Ð¾Ð´ÑƒÐ»Ñ Processes" ++ ++msgid "Processes to monitor separated by space" ++msgstr "ПроцеÑÑÑ‹ Ð´Ð»Ñ Ð¼Ð¾Ð½Ð¸Ñ‚Ð¾Ñ€Ð¸Ð½Ð³Ð° (разделённые пробелом)" ++ ++msgid "Processor" ++msgstr "Processor" ++ ++msgid "Qdisc monitoring" ++msgstr "Мониторинг Qdisc" ++ ++#, fuzzy ++msgid "RRD XFiles Factor" ++msgstr "Фактор XFiles RRD" ++ ++#, fuzzy ++msgid "RRD heart beat interval" ++msgstr "Интервал heartbeat RRD" ++ ++msgid "RRD step interval" ++msgstr "Интервал шага RRD" ++ ++msgid "RRDTool" ++msgstr "RRDTool" ++ ++msgid "RRDTool Plugin Configuration" ++msgstr "ÐšÐ¾Ð½Ñ„Ð¸Ð³ÑƒÑ€Ð°Ñ†Ð¸Ñ Ð¼Ð¾Ð´ÑƒÐ»Ñ RRDTool" ++ ++msgid "Rows per RRA" ++msgstr "КоличеÑтво Ñтрок в RRA" ++ ++msgid "Script" ++msgstr "Скрипт" ++ ++msgid "Seconds" ++msgstr "Секунды" ++ ++msgid "Server host" ++msgstr "ХоÑÑ‚ Ñервера" ++ ++msgid "Server port" ++msgstr "Порт Ñервера" ++ ++msgid "Shaping class monitoring" ++msgstr "Мониторинг клаÑÑов шейпинга" ++ ++msgid "Socket file" ++msgstr "Файл Ñокета" ++ ++msgid "Socket group" ++msgstr "Группа Ñокета" ++ ++msgid "Socket permissions" ++msgstr "Права доÑтупа Ñокета" ++ ++msgid "Source ip range" ++msgstr "Диапазон IP-адреÑов иÑточника" ++ ++msgid "Specifies what information to collect about links." ++msgstr "Указывает, какую информацию Ñобирать о ÑоединениÑÑ…." ++ ++msgid "Specifies what information to collect about routes." ++msgstr "Указывает, какую информацию Ñобирать о маршрутах." ++ ++msgid "Specifies what information to collect about the global topology." ++msgstr "Указывает, какую информацию Ñобирать о глобальной топологии." ++ ++msgid "Splash Leases" ++msgstr "" ++ ++msgid "Splash Leases Plugin Configuration" ++msgstr "" ++ ++msgid "Statistics" ++msgstr "СтатиÑтика" ++ ++msgid "Storage directory" ++msgstr "Ð”Ð¸Ñ€ÐµÐºÑ‚Ð¾Ñ€Ð¸Ñ Ñ Ð´Ð°Ð½Ð½Ñ‹Ð¼Ð¸" ++ ++msgid "Storage directory for the csv files" ++msgstr "Ð”Ð¸Ñ€ÐµÐºÑ‚Ð¾Ñ€Ð¸Ñ Ð´Ð»Ñ CSV-файлов" ++ ++msgid "Store data values as rates instead of absolute values" ++msgstr "Хранить данные в виде коÑффициентов вмеÑто абÑолютных значений" ++ ++msgid "Stored timespans" ++msgstr "Сохранённые промежутки времени" ++ ++msgid "System Load" ++msgstr "Загрузка ÑиÑтемы" ++ ++msgid "System plugins" ++msgstr "СиÑтемные модули" ++ ++msgid "TCP Connections" ++msgstr "TCPConns" ++ ++msgid "TCPConns Plugin Configuration" ++msgstr "ÐšÐ¾Ð½Ñ„Ð¸Ð³ÑƒÑ€Ð°Ñ†Ð¸Ñ Ð¼Ð¾Ð´ÑƒÐ»Ñ TCPConns" ++ ++msgid "TTL for network packets" ++msgstr "TTL Ð´Ð»Ñ Ñетевых пакетов" ++ ++msgid "TTL for ping packets" ++msgstr "TTL Ð´Ð»Ñ ping-пакетов" ++ ++msgid "Table" ++msgstr "Таблица" ++ ++msgid "The NUT plugin reads information about Uninterruptible Power Supplies." ++msgstr "" ++ ++msgid "" ++"The OLSRd plugin reads information about meshed networks from the txtinfo " ++"plugin of OLSRd." ++msgstr "" ++"Модуль OLSRd Ñчитывает информацию о узловых ÑетÑÑ… Ñ Ð¼Ð¾Ð´ÑƒÐ»Ñ txtinfo OLSRd." ++ ++msgid "" ++"The conntrack plugin collects statistics about the number of tracked " ++"connections." ++msgstr "" ++"Модуль Conntrack Ñобирает ÑтатиÑтику о количеÑтве отÑлеживаемых Ñоединений." ++ ++msgid "The cpu plugin collects basic statistics about the processor usage." ++msgstr "Модуль CPU Ñобирает ÑтатиÑтику по иÑпользованию процеÑÑора." ++ ++msgid "" ++"The csv plugin stores collected data in csv file format for further " ++"processing by external programs." ++msgstr "" ++"Модуль CSV позволÑет Ñохранить ÑтатиÑтику в формате CSV Ð´Ð»Ñ Ð¿Ð¾Ñледующей " ++"обработки." ++ ++msgid "" ++"The df plugin collects statistics about the disk space usage on different " ++"devices, mount points or filesystem types." ++msgstr "" ++"Модуль DF Ñобирает ÑтатиÑтику о доÑтупном проÑтранÑтве на различных " ++"уÑтройÑтвах, точках Ð¼Ð¾Ð½Ñ‚Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ð¸Ð»Ð¸ файловых ÑиÑтемах." ++ ++msgid "" ++"The disk plugin collects detailled usage statistics for selected partitions " ++"or whole disks." ++msgstr "" ++"Модуль Disk Ñобирает подробную ÑтатиÑтику Ð´Ð»Ñ Ð²Ñ‹Ð±Ñ€Ð°Ð½Ð½Ñ‹Ñ… разделов или диÑков." ++ ++msgid "" ++"The dns plugin collects detailled statistics about dns related traffic on " ++"selected interfaces." ++msgstr "" ++"Модуль DNS Ñобирает подробную ÑтатиÑтику о DNS-трафике на выбранных " ++"интерфейÑах." ++ ++msgid "" ++"The email plugin creates a unix socket which can be used to transmit email-" ++"statistics to a running collectd daemon. This plugin is primarily intended " ++"to be used in conjunction with Mail::SpamAssasin::Plugin::Collectd but can " ++"be used in other ways as well." ++msgstr "" ++"Модуль E-mail Ñоздает Unix-Ñокет, который может быть иÑпользован Ð´Ð»Ñ " ++"передачи ÑтатиÑтики Ñл. почты работающему ÑервиÑу collectd. Ð’ оÑновном, Ñтот " ++"модуль предназначен Ð´Ð»Ñ Ð¸ÑÐ¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Ð²Ð¼ÐµÑте Ñ Mail::SpamAssasin::Plugin::" ++"Collectd." ++ ++msgid "" ++"The exec plugin starts external commands to read values from or to notify " ++"external processes when certain threshold values have been reached." ++msgstr "" ++"Модуль Exec выполнÑет внешнюю команду в Ñлучае, когда определённые Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ " ++"доÑтигают заданного порога." ++ ++msgid "" ++"The interface plugin collects traffic statistics on selected interfaces." ++msgstr "Модуль Interface Ñобирает ÑтатиÑтику на выбранных Ñетевых интерфейÑах." ++ ++msgid "" ++"The iptables plugin will monitor selected firewall rules and collect " ++"informations about processed bytes and packets per rule." ++msgstr "" ++"Модуль Iptables Ñобирает ÑтатиÑтику Ñ Ð¾Ð¿Ñ€ÐµÐ´ÐµÐ»Ñ‘Ð½Ð½Ñ‹Ñ… правил межÑетевого Ñкрана." ++ ++msgid "" ++"The irq plugin will monitor the rate of issues per second for each selected " ++"interrupt. If no interrupt is selected then all interrupts are monitored." ++msgstr "" ++"Модуль IRQ Ñобирает ÑтатиÑтику по выбранным прерываниÑм. ЕÑли ни одно " ++"прерывание не выбрано, Ñбор ÑтатиÑтики будет проводитьÑÑ Ð¿Ð¾ вÑем прерываниÑм." ++ ++msgid "" ++"The iwinfo plugin collects statistics about wireless signal strength, noise " ++"and quality." ++msgstr "" ++"Модуль Iwinfo Ñобирает ÑтатиÑтику о беÑпроводном Ñигнале, шуме и качеÑтве." ++ ++msgid "The load plugin collects statistics about the general system load." ++msgstr "Модуль Load Ñобирает ÑтатиÑтику о загрузке ÑиÑтемы." ++ ++msgid "The memory plugin collects statistics about the memory usage." ++msgstr "Модуль Memory Ñобирает ÑтатиÑтику об иÑпользовании памÑти." ++ ++msgid "" ++"The netlink plugin collects extended informations like qdisc-, class- and " ++"filter-statistics for selected interfaces." ++msgstr "" ++"Модуль Netlink Ñобирает раÑширенную ÑтатиÑтику Ñ Ð²Ñ‹Ð±Ñ€Ð°Ð½Ð½Ñ‹Ñ… интерфейÑов." ++ ++msgid "" ++"The network plugin provides network based communication between different " ++"collectd instances. Collectd can operate both in client and server mode. In " ++"client mode locally collected data is transferred to a collectd server " ++"instance, in server mode the local instance receives data from other hosts." ++msgstr "" ++"Модуль Network предоÑтавлÑет возможноÑÑ‚ÑŒ Ñетевого обмена данными между " ++"разными ÑервиÑами collectd. Collectd может работать в режиме Ñервера или " ++"клиента. Ð’ режиме клиента, Ð»Ð¾ÐºÐ°Ð»ÑŒÐ½Ð°Ñ ÑтатиÑтика передаетÑÑ collectd-Ñерверу, " ++"в режиме Ñервера collectd Ñобирает ÑтатиÑтику Ñ ÑƒÐ´Ð°Ð»Ñ‘Ð½Ð½Ñ‹Ñ… хоÑтов." ++ ++msgid "" ++"The ping plugin will send icmp echo replies to selected hosts and measure " ++"the roundtrip time for each host." ++msgstr "" ++"Модуль Ping поÑылает ICMP-запроÑÑ‹ выбранным хоÑтам и измерÑет Ð²Ñ€ÐµÐ¼Ñ Ð¾Ñ‚ÐºÐ»Ð¸ÐºÐ°." ++ ++msgid "" ++"The processes plugin collects informations like cpu time, page faults and " ++"memory usage of selected processes." ++msgstr "" ++"Модуль Processes Ñобирает ÑтатиÑтику Ð´Ð»Ñ Ð²Ñ‹Ð±Ñ€Ð°Ð½Ð½Ñ‹Ñ… процеÑÑов об " ++"иÑпользовании ЦП, ошибках Ð¾Ð±Ñ€Ð°Ñ‰ÐµÐ½Ð¸Ñ Ðº Ñтраницам памÑти, иÑпользовании памÑти." ++ ++msgid "" ++"The rrdtool plugin stores the collected data in rrd database files, the " ++"foundation of the diagrams.

    Warning: Setting the wrong " ++"values will result in a very high memory consumption in the temporary " ++"directory. This can render the device unusable!" ++msgstr "" ++"Модуль Rrdtool ÑохранÑет ÑтатиÑтику в формате rrd Ð´Ð»Ñ Ð¿Ð¾Ñледующего " ++"поÑÑ‚Ñ€Ð¾ÐµÐ½Ð¸Ñ Ð´Ð¸Ð°Ð³Ñ€Ð°Ð¼Ð¼.

    Внимание: уÑтановка неверных " ++"параметров может привезти к выÑокому потреблению памÑти во временной " ++"директории. Это, в Ñвою очередь, может привеÑти к отказу уÑтройÑтва!" ++ ++msgid "" ++"The splash leases plugin uses libuci to collect statistics about splash " ++"leases." ++msgstr "" ++ ++msgid "" ++"The statistics package is based on Collectd and uses RRD " ++"Tool to render diagram images from collected data." ++msgstr "" ++"Ð”Ð°Ð½Ð½Ð°Ñ ÑтатиÑтика оÑнована на программе Collectd и иÑпользует RRD Tool Ð´Ð»Ñ Ð¿Ð¾ÑÑ‚Ñ€Ð¾ÐµÐ½Ð¸Ñ Ð´Ð¸Ð°Ð³Ñ€Ð°Ð¼Ð¼." ++ ++msgid "" ++"The tcpconns plugin collects informations about open tcp connections on " ++"selected ports." ++msgstr "" ++"Модуль TCPConns Ñобирает информацию об открытых TCP-ÑоединениÑÑ… на выбранных " ++"портах." ++ ++msgid "" ++"The unixsock plugin creates a unix socket which can be used to read " ++"collected data from a running collectd instance." ++msgstr "" ++"Модуль UnixSock Ñоздает Unix-Ñокет, который может быть иÑпользован Ð´Ð»Ñ " ++"Ð¿Ð¾Ð»ÑƒÑ‡ÐµÐ½Ð¸Ñ ÑтатиÑтики от работающего ÑервиÑа collectd." ++ ++msgid "The uptime plugin collects statistics about the uptime of the system." ++msgstr "" ++ ++msgid "" ++"This section defines on which interfaces collectd will wait for incoming " ++"connections." ++msgstr "" ++"Эта ÑÐµÐºÑ†Ð¸Ñ Ð¾Ð¿Ñ€ÐµÐ´ÐµÐ»Ñет интерфейÑÑ‹, на которых collectd будет обрабатывать " ++"входÑщие ÑоединениÑ." ++ ++msgid "" ++"This section defines to which servers the locally collected data is sent to." ++msgstr "" ++"Эта ÑÐµÐºÑ†Ð¸Ñ Ð¾Ð¿Ñ€ÐµÐ´ÐµÐ»Ñет Ñерверы, на которые будет передаватьÑÑ Ð»Ð¾ÐºÐ°Ð»ÑŒÐ½Ð°Ñ " ++"ÑтатиÑтика." ++ ++msgid "Try to lookup fully qualified hostname" ++msgstr "ПытатьÑÑ Ð¾Ð¿Ñ€ÐµÐ´ÐµÐ»ÑÑ‚ÑŒ Ð¸Ð¼Ñ Ñ…Ð¾Ñта" ++ ++msgid "UPS" ++msgstr "ИБП" ++ ++msgid "UPS Plugin Configuration" ++msgstr "ÐаÑтройка плагина ИБП" ++ ++#, fuzzy ++msgid "UPS name in NUT ups@host format" ++msgstr "Ð˜Ð¼Ñ Ð˜Ð‘ÐŸ в ups@host NUT-формате" ++ ++msgid "UnixSock" ++msgstr "UnixSock" ++ ++msgid "Unixsock Plugin Configuration" ++msgstr "ÐšÐ¾Ð½Ñ„Ð¸Ð³ÑƒÑ€Ð°Ñ†Ð¸Ñ Ð¼Ð¾Ð´ÑƒÐ»Ñ UnixSock" ++ ++msgid "Uptime" ++msgstr "" ++ ++msgid "Uptime Plugin Configuration" ++msgstr "" ++ ++msgid "Used PID file" ++msgstr "ИÑпользуемый PID-файл" ++ ++msgid "User" ++msgstr "Пользователь" ++ ++msgid "Verbose monitoring" ++msgstr "РаÑÑˆÐ¸Ñ€ÐµÐ½Ð½Ð°Ñ ÑтатиÑтика" ++ ++msgid "Wireless" ++msgstr "Wireless" ++ ++msgid "Wireless iwinfo Plugin Configuration" ++msgstr "ÐšÐ¾Ð½Ñ„Ð¸Ð³ÑƒÑ€Ð°Ñ†Ð¸Ñ Ð¼Ð¾Ð´ÑƒÐ»Ñ Iwinfo" ++ ++msgid "e.g. br-ff" ++msgstr "напр. br-ff" ++ ++msgid "e.g. br-lan" ++msgstr "напр. br-lan" ++ ++msgid "e.g. reject-with tcp-reset" ++msgstr "напр. reject-with tcp-reset" ++ ++msgid "max. 16 chars" ++msgstr "не более 16 Ñимволов" ++ ++msgid "reduces rrd size" ++msgstr "уменьшает размер rrd" ++ ++#, fuzzy ++msgid "seconds; multiple separated by space" ++msgstr "Ñекунды; разделÑÑŽÑ‚ÑÑ Ð¿Ñ€Ð¾Ð±ÐµÐ»Ð¾Ð¼" ++ ++msgid "server interfaces" ++msgstr "интерфейÑÑ‹ Ñервера" ++ ++#~ msgid "Installed network plugins:" ++#~ msgstr "УÑтановленные Ñетевые модули:" ++ ++#~ msgid "Installed output plugins:" ++#~ msgstr "УÑтановленные модули вывода:" ++ ++#~ msgid "" ++#~ "Network plugins are used to collect information about open tcp " ++#~ "connections, interface traffic, iptables rules etc." ++#~ msgstr "" ++#~ "Сетевые модули иÑпользуютÑÑ Ð´Ð»Ñ Ñбора информации об открытых TCP-" ++#~ "ÑоединениÑÑ…, трафике, правилах iptables и Ñ‚.п." ++ ++#~ msgid "" ++#~ "Output plugins provide different possibilities to store collected data. " ++#~ "It is possible to enable multiple plugin at one, for example to store " ++#~ "collected data in rrd databases and to transmit the data over the network " ++#~ "to other collectd instances." ++#~ msgstr "" ++#~ "Модули вывода обеÑпечивают различные варианты ÑÐ¾Ñ…Ñ€Ð°Ð½ÐµÐ½Ð¸Ñ Ñобранных " ++#~ "данных. Можно включить неÑколько модулей, например, чтобы Ñохранить " ++#~ "Ñобранные данные в базе данных RRD и передать их по Ñети другим " ++#~ "инÑтанциÑм collectd." ++ ++#~ msgid "" ++#~ "System plugins collecting values about system state and ressource usage " ++#~ "on the device.:" ++#~ msgstr "" ++#~ "СиÑтемные модули, Ñобирающие данные о ÑоÑтоÑнии ÑиÑтемы и иÑпользовании " ++#~ "реÑурÑов уÑтройÑтва:" ++ ++#~ msgid "" ++#~ "The wireless plugin collects statistics about wireless signal strength, " ++#~ "noise and quality." ++#~ msgstr "" ++#~ "Модуль Wireless Ñобирает ÑтатиÑтику о Ñиле, шуме и качеÑтве Ñигнала." ++ ++#~ msgid "Wireless Plugin Configuration" ++#~ msgstr "ÐšÐ¾Ð½Ñ„Ð¸Ð³ÑƒÑ€Ð°Ñ†Ð¸Ñ Ð¼Ð¾Ð´ÑƒÐ»Ñ Wireless" +diff --git a/feeds/luci/applications/luci-app-statistics/po/sk/rrdtool.po b/feeds/luci/applications/luci-app-statistics/po/sk/rrdtool.po +new file mode 100644 +index 0000000..fd3781f +--- /dev/null ++++ b/feeds/luci/applications/luci-app-statistics/po/sk/rrdtool.po +@@ -0,0 +1,356 @@ ++# rrdtool.pot ++# generated from ./applications/luci-statistics/luasrc/i18n/rrdtool.en.lua ++msgid "" ++msgstr "" ++"Content-Type: text/plain; charset=ASCII\n" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Last-Translator: Automatically generated\n" ++"Language-Team: none\n" ++"MIME-Version: 1.0\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n" ++ ++#. %H: Wireless - Signal Noise Ratio ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:1 ++msgid "stat_dg_title_wireless__signal_noise" ++msgstr "" ++ ++#. dBm ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:2 ++msgid "stat_dg_label_wireless__signal_noise" ++msgstr "" ++ ++#. Noise Level ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:3 ++msgid "stat_ds_signal_noise" ++msgstr "" ++ ++#. Signal Strength ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:4 ++msgid "stat_ds_signal_power" ++msgstr "" ++ ++#. %H: Wireless - Signal Quality ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:5 ++msgid "stat_dg_title_wireless__signal_quality" ++msgstr "" ++ ++#. n ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:6 ++msgid "stat_dg_label_wireless__signal_quality" ++msgstr "" ++ ++#. Signal Quality ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:7 ++msgid "stat_ds_signal_quality" ++msgstr "" ++ ++#. %H: ICMP Roundtrip Times ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:8 ++msgid "stat_dg_title_ping" ++msgstr "" ++ ++#. ms ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:9 ++msgid "stat_dg_label_ping" ++msgstr "" ++ ++#. %di ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:10 ++msgid "stat_ds_ping" ++msgstr "" ++ ++#. %H: Firewall - Processed Packets ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:11 ++msgid "stat_dg_title_iptables__ipt_packets" ++msgstr "" ++ ++#. Packets/s ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:12 ++msgid "stat_dg_label_iptables__ipt_packets" ++msgstr "" ++ ++#. Chain \"%di\" ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:13 ++msgid "stat_ds_ipt_packets" ++msgstr "" ++ ++#. %H: Netlink - Transfer on %pi ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:14 ++msgid "stat_dg_title_netlink__if_octets" ++msgstr "" ++ ++#. Bytes/s ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:15 ++msgid "stat_dg_label_netlink__if_octets" ++msgstr "" ++ ++#. Bytes (%ds) ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:16 ++msgid "stat_ds_if_octets" ++msgstr "" ++ ++#. %H: Netlink - Packets on %pi ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:17 ++msgid "stat_dg_title_netlink__if_packets" ++msgstr "" ++ ++#. Packets/s ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:18 ++msgid "stat_dg_label_netlink__if_packets" ++msgstr "" ++ ++#. Processed (%ds) ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:19 ++msgid "stat_ds_if_packets" ++msgstr "" ++ ++#. Dropped (%ds) ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:20 ++msgid "stat_ds_if_dropped" ++msgstr "" ++ ++#. Errors (%ds) ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:21 ++msgid "stat_ds_if_errors" ++msgstr "" ++ ++#. %H: Netlink - Multicast on %pi ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:22 ++msgid "stat_dg_title_netlink__if_multicast" ++msgstr "" ++ ++#. Packets/s ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:23 ++msgid "stat_dg_label_netlink__if_multicast" ++msgstr "" ++ ++#. Packets ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:24 ++msgid "stat_ds_if_multicast" ++msgstr "" ++ ++#. %H: Netlink - Collisions on %pi ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:25 ++msgid "stat_dg_title_netlink__if_collisions" ++msgstr "" ++ ++#. Collisions/s ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:26 ++msgid "stat_dg_label_netlink__if_collisions" ++msgstr "" ++ ++#. Collisions ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:27 ++msgid "stat_ds_if_collisions" ++msgstr "" ++ ++#. %H: Netlink - Errors on %pi ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:28 ++msgid "stat_dg_title_netlink__if_tx_errors" ++msgstr "" ++ ++#. Errors/s ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:29 ++msgid "stat_dg_label_netlink__if_tx_errors" ++msgstr "" ++ ++#. %di ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:30 ++msgid "stat_ds_if_tx_errors" ++msgstr "" ++ ++#. %di ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:31 ++msgid "stat_ds_if_rx_errors" ++msgstr "" ++ ++#. %H: Processes ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:32 ++msgid "stat_dg_title_processes" ++msgstr "" ++ ++#. Processes/s ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:33 ++msgid "stat_dg_label_processes" ++msgstr "" ++ ++#. %di ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:34 ++msgid "stat_ds_ps_state" ++msgstr "" ++ ++#. %H: Process %pi - used cpu time ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:35 ++msgid "stat_dg_title_processes__ps_cputime" ++msgstr "" ++ ++#. Jiffies ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:36 ++msgid "stat_dg_label_processes__ps_cputime" ++msgstr "" ++ ++#. system ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:37 ++msgid "stat_ds_ps_cputime__syst" ++msgstr "" ++ ++#. user ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:38 ++msgid "stat_ds_ps_cputime__user" ++msgstr "" ++ ++#. %H: Process %pi - threads and processes ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:39 ++msgid "stat_dg_title_processes__ps_count" ++msgstr "" ++ ++#. Count ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:40 ++msgid "stat_dg_label_processes__ps_count" ++msgstr "" ++ ++#. %ds ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:41 ++msgid "stat_ds_ps_count" ++msgstr "" ++ ++#. %H: Process %pi - page faults ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:42 ++msgid "stat_dg_title_processes__ps_pagefaults" ++msgstr "" ++ ++#. Pagefaults ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:43 ++msgid "stat_dg_label_processes__ps_pagefaults" ++msgstr "" ++ ++#. page faults ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:44 ++msgid "stat_ds_ps_pagefaults" ++msgstr "" ++ ++#. %H: Process %pi - virtual memory size ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:45 ++msgid "stat_dg_title_processes__ps_rss" ++msgstr "" ++ ++#. Bytes ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:46 ++msgid "stat_dg_label_processes__ps_rss" ++msgstr "" ++ ++#. virtual memory ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:47 ++msgid "stat_ds_ps_rss" ++msgstr "" ++ ++#. %H: Usage on Processor #%pi ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:48 ++msgid "stat_dg_title_cpu" ++msgstr "" ++ ++#. % ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:49 ++msgid "stat_dg_label_cpu" ++msgstr "" ++ ++#. %di ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:50 ++msgid "stat_ds_cpu" ++msgstr "" ++ ++#. %H: Transfer on %di ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:51 ++msgid "stat_dg_title_interface__if_octets" ++msgstr "" ++ ++#. Bytes/s ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:52 ++msgid "stat_dg_label_interface__if_octets" ++msgstr "" ++ ++#. %H: Packets on %di ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:53 ++msgid "stat_dg_title_interface__if_packets" ++msgstr "" ++ ++#. Packets/s ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:54 ++msgid "stat_dg_label_interface__if_packets" ++msgstr "" ++ ++#. %H: TCP-Connections to Port %pi ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:55 ++msgid "stat_dg_title_tcpconns" ++msgstr "" ++ ++#. Connections/s ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:56 ++msgid "stat_dg_label_tcpconns" ++msgstr "" ++ ++#. %di ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:57 ++msgid "stat_ds_tcp_connections" ++msgstr "" ++ ++#. %H: Disk Space Usage on %di ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:58 ++msgid "stat_dg_title_df" ++msgstr "" ++ ++#. Bytes ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:59 ++msgid "stat_dg_label_df" ++msgstr "" ++ ++#. %ds ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:60 ++msgid "stat_ds_df__free" ++msgstr "" ++ ++#. %ds ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:61 ++msgid "stat_ds_df__used" ++msgstr "" ++ ++#. %H: Interrupts ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:62 ++msgid "stat_dg_title_irq" ++msgstr "" ++ ++#. Issues/s ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:63 ++msgid "stat_dg_label_irq" ++msgstr "" ++ ++#. IRQ %di ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:64 ++msgid "stat_ds_irq" ++msgstr "" ++ ++#. %H: System Load ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:65 ++msgid "stat_dg_title_load" ++msgstr "" ++ ++#. Load ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:66 ++msgid "stat_dg_label_load" ++msgstr "" ++ ++#. 1 min ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:67 ++msgid "stat_ds_load__shortterm" ++msgstr "" ++ ++#. 5 min ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:68 ++msgid "stat_ds_load__midterm" ++msgstr "" ++ ++#. 15 min ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:69 ++msgid "stat_ds_load__longterm" ++msgstr "" +diff --git a/feeds/luci/applications/luci-app-statistics/po/sk/statistics.po b/feeds/luci/applications/luci-app-statistics/po/sk/statistics.po +new file mode 100644 +index 0000000..b0672f9 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-statistics/po/sk/statistics.po +@@ -0,0 +1,613 @@ ++msgid "" ++msgstr "" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Last-Translator: Automatically generated\n" ++"Language-Team: none\n" ++"MIME-Version: 1.0\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n" ++ ++msgid "Action (target)" ++msgstr "" ++ ++msgid "Add command for reading values" ++msgstr "" ++ ++msgid "Add matching rule" ++msgstr "" ++ ++msgid "Add multiple hosts separated by space." ++msgstr "" ++ ++msgid "Add notification command" ++msgstr "" ++ ++msgid "Base Directory" ++msgstr "" ++ ++msgid "Basic monitoring" ++msgstr "" ++ ++msgid "CPU Plugin Configuration" ++msgstr "" ++ ++msgid "CSV Output" ++msgstr "" ++ ++msgid "CSV Plugin Configuration" ++msgstr "" ++ ++msgid "Cache collected data for" ++msgstr "" ++ ++msgid "Cache flush interval" ++msgstr "" ++ ++msgid "Chain" ++msgstr "" ++ ++msgid "CollectLinks" ++msgstr "" ++ ++msgid "CollectRoutes" ++msgstr "" ++ ++msgid "CollectTopology" ++msgstr "" ++ ++msgid "Collectd" ++msgstr "" ++ ++msgid "Collectd Settings" ++msgstr "" ++ ++msgid "" ++"Collectd is a small daemon for collecting data from various sources through " ++"different plugins. On this page you can change general settings for the " ++"collectd daemon." ++msgstr "" ++ ++msgid "Conntrack" ++msgstr "" ++ ++msgid "Conntrack Plugin Configuration" ++msgstr "" ++ ++msgid "DF Plugin Configuration" ++msgstr "" ++ ++msgid "DNS" ++msgstr "" ++ ++msgid "DNS Plugin Configuration" ++msgstr "" ++ ++msgid "Data collection interval" ++msgstr "" ++ ++msgid "Datasets definition file" ++msgstr "" ++ ++msgid "Destination ip range" ++msgstr "" ++ ++msgid "Directory for collectd plugins" ++msgstr "" ++ ++msgid "Directory for sub-configurations" ++msgstr "" ++ ++msgid "Disk Plugin Configuration" ++msgstr "" ++ ++msgid "Disk Space Usage" ++msgstr "" ++ ++msgid "Disk Usage" ++msgstr "" ++ ++msgid "Display Host »" ++msgstr "" ++ ++msgid "Display timespan »" ++msgstr "" ++ ++msgid "E-Mail Plugin Configuration" ++msgstr "" ++ ++msgid "Email" ++msgstr "" ++ ++msgid "Enable this plugin" ++msgstr "" ++ ++msgid "Exec" ++msgstr "" ++ ++msgid "Exec Plugin Configuration" ++msgstr "" ++ ++msgid "Filter class monitoring" ++msgstr "" ++ ++msgid "Firewall" ++msgstr "" ++ ++msgid "Flush cache after" ++msgstr "" ++ ++msgid "Forwarding between listen and server addresses" ++msgstr "" ++ ++msgid "Graphs" ++msgstr "" ++ ++msgid "Group" ++msgstr "" ++ ++msgid "" ++"Here you can define external commands which will be started by collectd in " ++"order to read certain values. The values will be read from stdout." ++msgstr "" ++ ++msgid "" ++"Here you can define external commands which will be started by collectd when " ++"certain threshold values have been reached. The values leading to invokation " ++"will be feeded to the the called programs stdin." ++msgstr "" ++ ++msgid "" ++"Here you can define various criteria by which the monitored iptables rules " ++"are selected." ++msgstr "" ++ ++msgid "Host" ++msgstr "" ++ ++msgid "Hostname" ++msgstr "" ++ ++msgid "IP or hostname where to get the txtinfo output from" ++msgstr "" ++ ++msgid "IRQ Plugin Configuration" ++msgstr "" ++ ++msgid "Ignore source addresses" ++msgstr "" ++ ++msgid "Incoming interface" ++msgstr "" ++ ++msgid "Interface Plugin Configuration" ++msgstr "" ++ ++msgid "Interfaces" ++msgstr "" ++ ++msgid "Interrupts" ++msgstr "" ++ ++msgid "Interval for pings" ++msgstr "" ++ ++msgid "Iptables Plugin Configuration" ++msgstr "" ++ ++msgid "Leave unselected to automatically determine interfaces to monitor." ++msgstr "" ++ ++msgid "Listen host" ++msgstr "" ++ ++msgid "Listen port" ++msgstr "" ++ ++msgid "Listener interfaces" ++msgstr "" ++ ++msgid "Load Plugin Configuration" ++msgstr "" ++ ++msgid "Maximum allowed connections" ++msgstr "" ++ ++msgid "Memory" ++msgstr "" ++ ++msgid "Memory Plugin Configuration" ++msgstr "" ++ ++msgid "Monitor all except specified" ++msgstr "" ++ ++msgid "Monitor all local listen ports" ++msgstr "" ++ ++msgid "Monitor devices" ++msgstr "" ++ ++msgid "Monitor disks and partitions" ++msgstr "" ++ ++msgid "Monitor filesystem types" ++msgstr "" ++ ++msgid "Monitor hosts" ++msgstr "" ++ ++msgid "Monitor interfaces" ++msgstr "" ++ ++msgid "Monitor interrupts" ++msgstr "" ++ ++msgid "Monitor local ports" ++msgstr "" ++ ++msgid "Monitor mount points" ++msgstr "" ++ ++msgid "Monitor processes" ++msgstr "" ++ ++msgid "Monitor remote ports" ++msgstr "" ++ ++msgid "Name of the rule" ++msgstr "" ++ ++msgid "Netlink" ++msgstr "" ++ ++msgid "Netlink Plugin Configuration" ++msgstr "" ++ ++msgid "Network" ++msgstr "" ++ ++msgid "Network Plugin Configuration" ++msgstr "" ++ ++msgid "Network plugins" ++msgstr "" ++ ++msgid "Network protocol" ++msgstr "" ++ ++msgid "Number of threads for data collection" ++msgstr "" ++ ++msgid "OLSRd" ++msgstr "" ++ ++msgid "OLSRd Plugin Configuration" ++msgstr "" ++ ++msgid "Only create average RRAs" ++msgstr "" ++ ++msgid "Options" ++msgstr "" ++ ++msgid "Outgoing interface" ++msgstr "" ++ ++msgid "Output plugins" ++msgstr "" ++ ++msgid "Ping" ++msgstr "" ++ ++msgid "Ping Plugin Configuration" ++msgstr "" ++ ++msgid "Port" ++msgstr "" ++ ++msgid "Processes" ++msgstr "" ++ ++msgid "Processes Plugin Configuration" ++msgstr "" ++ ++msgid "Processes to monitor separated by space" ++msgstr "" ++ ++msgid "Processor" ++msgstr "" ++ ++msgid "Qdisc monitoring" ++msgstr "" ++ ++msgid "RRD XFiles Factor" ++msgstr "" ++ ++msgid "RRD heart beat interval" ++msgstr "" ++ ++msgid "RRD step interval" ++msgstr "" ++ ++msgid "RRDTool" ++msgstr "" ++ ++msgid "RRDTool Plugin Configuration" ++msgstr "" ++ ++msgid "Rows per RRA" ++msgstr "" ++ ++msgid "Script" ++msgstr "" ++ ++msgid "Seconds" ++msgstr "" ++ ++msgid "Server host" ++msgstr "" ++ ++msgid "Server port" ++msgstr "" ++ ++msgid "Shaping class monitoring" ++msgstr "" ++ ++msgid "Socket file" ++msgstr "" ++ ++msgid "Socket group" ++msgstr "" ++ ++msgid "Socket permissions" ++msgstr "" ++ ++msgid "Source ip range" ++msgstr "" ++ ++msgid "Specifies what information to collect about links." ++msgstr "" ++ ++msgid "Specifies what information to collect about routes." ++msgstr "" ++ ++msgid "Specifies what information to collect about the global topology." ++msgstr "" ++ ++msgid "Splash Leases" ++msgstr "" ++ ++msgid "Splash Leases Plugin Configuration" ++msgstr "" ++ ++msgid "Statistics" ++msgstr "" ++ ++msgid "Storage directory" ++msgstr "" ++ ++msgid "Storage directory for the csv files" ++msgstr "" ++ ++msgid "Store data values as rates instead of absolute values" ++msgstr "" ++ ++msgid "Stored timespans" ++msgstr "" ++ ++msgid "System Load" ++msgstr "" ++ ++msgid "System plugins" ++msgstr "" ++ ++msgid "TCP Connections" ++msgstr "" ++ ++msgid "TCPConns Plugin Configuration" ++msgstr "" ++ ++msgid "TTL for network packets" ++msgstr "" ++ ++msgid "TTL for ping packets" ++msgstr "" ++ ++msgid "Table" ++msgstr "" ++ ++msgid "The NUT plugin reads information about Uninterruptible Power Supplies." ++msgstr "" ++ ++msgid "" ++"The OLSRd plugin reads information about meshed networks from the txtinfo " ++"plugin of OLSRd." ++msgstr "" ++ ++msgid "" ++"The conntrack plugin collects statistics about the number of tracked " ++"connections." ++msgstr "" ++ ++msgid "The cpu plugin collects basic statistics about the processor usage." ++msgstr "" ++ ++msgid "" ++"The csv plugin stores collected data in csv file format for further " ++"processing by external programs." ++msgstr "" ++ ++msgid "" ++"The df plugin collects statistics about the disk space usage on different " ++"devices, mount points or filesystem types." ++msgstr "" ++ ++msgid "" ++"The disk plugin collects detailled usage statistics for selected partitions " ++"or whole disks." ++msgstr "" ++ ++msgid "" ++"The dns plugin collects detailled statistics about dns related traffic on " ++"selected interfaces." ++msgstr "" ++ ++msgid "" ++"The email plugin creates a unix socket which can be used to transmit email-" ++"statistics to a running collectd daemon. This plugin is primarily intended " ++"to be used in conjunction with Mail::SpamAssasin::Plugin::Collectd but can " ++"be used in other ways as well." ++msgstr "" ++ ++msgid "" ++"The exec plugin starts external commands to read values from or to notify " ++"external processes when certain threshold values have been reached." ++msgstr "" ++ ++msgid "" ++"The interface plugin collects traffic statistics on selected interfaces." ++msgstr "" ++ ++msgid "" ++"The iptables plugin will monitor selected firewall rules and collect " ++"informations about processed bytes and packets per rule." ++msgstr "" ++ ++msgid "" ++"The irq plugin will monitor the rate of issues per second for each selected " ++"interrupt. If no interrupt is selected then all interrupts are monitored." ++msgstr "" ++ ++msgid "" ++"The iwinfo plugin collects statistics about wireless signal strength, noise " ++"and quality." ++msgstr "" ++ ++msgid "The load plugin collects statistics about the general system load." ++msgstr "" ++ ++msgid "The memory plugin collects statistics about the memory usage." ++msgstr "" ++ ++msgid "" ++"The netlink plugin collects extended informations like qdisc-, class- and " ++"filter-statistics for selected interfaces." ++msgstr "" ++ ++msgid "" ++"The network plugin provides network based communication between different " ++"collectd instances. Collectd can operate both in client and server mode. In " ++"client mode locally collected data is transferred to a collectd server " ++"instance, in server mode the local instance receives data from other hosts." ++msgstr "" ++ ++msgid "" ++"The ping plugin will send icmp echo replies to selected hosts and measure " ++"the roundtrip time for each host." ++msgstr "" ++ ++msgid "" ++"The processes plugin collects informations like cpu time, page faults and " ++"memory usage of selected processes." ++msgstr "" ++ ++msgid "" ++"The rrdtool plugin stores the collected data in rrd database files, the " ++"foundation of the diagrams.

    Warning: Setting the wrong " ++"values will result in a very high memory consumption in the temporary " ++"directory. This can render the device unusable!" ++msgstr "" ++ ++msgid "" ++"The splash leases plugin uses libuci to collect statistics about splash " ++"leases." ++msgstr "" ++ ++msgid "" ++"The statistics package is based on Collectd and uses RRD " ++"Tool to render diagram images from collected data." ++msgstr "" ++ ++msgid "" ++"The tcpconns plugin collects informations about open tcp connections on " ++"selected ports." ++msgstr "" ++ ++msgid "" ++"The unixsock plugin creates a unix socket which can be used to read " ++"collected data from a running collectd instance." ++msgstr "" ++ ++msgid "The uptime plugin collects statistics about the uptime of the system." ++msgstr "" ++ ++msgid "" ++"This section defines on which interfaces collectd will wait for incoming " ++"connections." ++msgstr "" ++ ++msgid "" ++"This section defines to which servers the locally collected data is sent to." ++msgstr "" ++ ++msgid "Try to lookup fully qualified hostname" ++msgstr "" ++ ++msgid "UPS" ++msgstr "" ++ ++msgid "UPS Plugin Configuration" ++msgstr "" ++ ++msgid "UPS name in NUT ups@host format" ++msgstr "" ++ ++msgid "UnixSock" ++msgstr "" ++ ++msgid "Unixsock Plugin Configuration" ++msgstr "" ++ ++msgid "Uptime" ++msgstr "" ++ ++msgid "Uptime Plugin Configuration" ++msgstr "" ++ ++msgid "Used PID file" ++msgstr "" ++ ++msgid "User" ++msgstr "" ++ ++msgid "Verbose monitoring" ++msgstr "" ++ ++msgid "Wireless" ++msgstr "" ++ ++msgid "Wireless iwinfo Plugin Configuration" ++msgstr "" ++ ++msgid "e.g. br-ff" ++msgstr "" ++ ++msgid "e.g. br-lan" ++msgstr "" ++ ++msgid "e.g. reject-with tcp-reset" ++msgstr "" ++ ++msgid "max. 16 chars" ++msgstr "" ++ ++msgid "reduces rrd size" ++msgstr "" ++ ++msgid "seconds; multiple separated by space" ++msgstr "" ++ ++msgid "server interfaces" ++msgstr "" +diff --git a/feeds/luci/applications/luci-app-statistics/po/sv/rrdtool.po b/feeds/luci/applications/luci-app-statistics/po/sv/rrdtool.po +new file mode 100644 +index 0000000..580c9f3 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-statistics/po/sv/rrdtool.po +@@ -0,0 +1,357 @@ ++# rrdtool.pot ++# generated from ./applications/luci-statistics/luasrc/i18n/rrdtool.en.lua ++msgid "" ++msgstr "" ++"Content-Type: text/plain; charset=ASCII\n" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Last-Translator: Automatically generated\n" ++"Language-Team: none\n" ++"Language: sv\n" ++"MIME-Version: 1.0\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n != 1);\n" ++ ++#. %H: Wireless - Signal Noise Ratio ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:1 ++msgid "stat_dg_title_wireless__signal_noise" ++msgstr "" ++ ++#. dBm ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:2 ++msgid "stat_dg_label_wireless__signal_noise" ++msgstr "" ++ ++#. Noise Level ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:3 ++msgid "stat_ds_signal_noise" ++msgstr "" ++ ++#. Signal Strength ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:4 ++msgid "stat_ds_signal_power" ++msgstr "" ++ ++#. %H: Wireless - Signal Quality ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:5 ++msgid "stat_dg_title_wireless__signal_quality" ++msgstr "" ++ ++#. n ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:6 ++msgid "stat_dg_label_wireless__signal_quality" ++msgstr "" ++ ++#. Signal Quality ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:7 ++msgid "stat_ds_signal_quality" ++msgstr "" ++ ++#. %H: ICMP Roundtrip Times ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:8 ++msgid "stat_dg_title_ping" ++msgstr "" ++ ++#. ms ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:9 ++msgid "stat_dg_label_ping" ++msgstr "" ++ ++#. %di ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:10 ++msgid "stat_ds_ping" ++msgstr "" ++ ++#. %H: Firewall - Processed Packets ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:11 ++msgid "stat_dg_title_iptables__ipt_packets" ++msgstr "" ++ ++#. Packets/s ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:12 ++msgid "stat_dg_label_iptables__ipt_packets" ++msgstr "" ++ ++#. Chain \"%di\" ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:13 ++msgid "stat_ds_ipt_packets" ++msgstr "" ++ ++#. %H: Netlink - Transfer on %pi ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:14 ++msgid "stat_dg_title_netlink__if_octets" ++msgstr "" ++ ++#. Bytes/s ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:15 ++msgid "stat_dg_label_netlink__if_octets" ++msgstr "" ++ ++#. Bytes (%ds) ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:16 ++msgid "stat_ds_if_octets" ++msgstr "" ++ ++#. %H: Netlink - Packets on %pi ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:17 ++msgid "stat_dg_title_netlink__if_packets" ++msgstr "" ++ ++#. Packets/s ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:18 ++msgid "stat_dg_label_netlink__if_packets" ++msgstr "" ++ ++#. Processed (%ds) ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:19 ++msgid "stat_ds_if_packets" ++msgstr "" ++ ++#. Dropped (%ds) ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:20 ++msgid "stat_ds_if_dropped" ++msgstr "" ++ ++#. Errors (%ds) ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:21 ++msgid "stat_ds_if_errors" ++msgstr "" ++ ++#. %H: Netlink - Multicast on %pi ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:22 ++msgid "stat_dg_title_netlink__if_multicast" ++msgstr "" ++ ++#. Packets/s ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:23 ++msgid "stat_dg_label_netlink__if_multicast" ++msgstr "" ++ ++#. Packets ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:24 ++msgid "stat_ds_if_multicast" ++msgstr "" ++ ++#. %H: Netlink - Collisions on %pi ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:25 ++msgid "stat_dg_title_netlink__if_collisions" ++msgstr "" ++ ++#. Collisions/s ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:26 ++msgid "stat_dg_label_netlink__if_collisions" ++msgstr "" ++ ++#. Collisions ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:27 ++msgid "stat_ds_if_collisions" ++msgstr "" ++ ++#. %H: Netlink - Errors on %pi ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:28 ++msgid "stat_dg_title_netlink__if_tx_errors" ++msgstr "" ++ ++#. Errors/s ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:29 ++msgid "stat_dg_label_netlink__if_tx_errors" ++msgstr "" ++ ++#. %di ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:30 ++msgid "stat_ds_if_tx_errors" ++msgstr "" ++ ++#. %di ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:31 ++msgid "stat_ds_if_rx_errors" ++msgstr "" ++ ++#. %H: Processes ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:32 ++msgid "stat_dg_title_processes" ++msgstr "" ++ ++#. Processes/s ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:33 ++msgid "stat_dg_label_processes" ++msgstr "" ++ ++#. %di ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:34 ++msgid "stat_ds_ps_state" ++msgstr "" ++ ++#. %H: Process %pi - used cpu time ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:35 ++msgid "stat_dg_title_processes__ps_cputime" ++msgstr "" ++ ++#. Jiffies ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:36 ++msgid "stat_dg_label_processes__ps_cputime" ++msgstr "" ++ ++#. system ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:37 ++msgid "stat_ds_ps_cputime__syst" ++msgstr "" ++ ++#. user ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:38 ++msgid "stat_ds_ps_cputime__user" ++msgstr "" ++ ++#. %H: Process %pi - threads and processes ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:39 ++msgid "stat_dg_title_processes__ps_count" ++msgstr "" ++ ++#. Count ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:40 ++msgid "stat_dg_label_processes__ps_count" ++msgstr "" ++ ++#. %ds ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:41 ++msgid "stat_ds_ps_count" ++msgstr "" ++ ++#. %H: Process %pi - page faults ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:42 ++msgid "stat_dg_title_processes__ps_pagefaults" ++msgstr "" ++ ++#. Pagefaults ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:43 ++msgid "stat_dg_label_processes__ps_pagefaults" ++msgstr "" ++ ++#. page faults ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:44 ++msgid "stat_ds_ps_pagefaults" ++msgstr "" ++ ++#. %H: Process %pi - virtual memory size ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:45 ++msgid "stat_dg_title_processes__ps_rss" ++msgstr "" ++ ++#. Bytes ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:46 ++msgid "stat_dg_label_processes__ps_rss" ++msgstr "" ++ ++#. virtual memory ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:47 ++msgid "stat_ds_ps_rss" ++msgstr "" ++ ++#. %H: Usage on Processor #%pi ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:48 ++msgid "stat_dg_title_cpu" ++msgstr "" ++ ++#. % ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:49 ++msgid "stat_dg_label_cpu" ++msgstr "" ++ ++#. %di ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:50 ++msgid "stat_ds_cpu" ++msgstr "" ++ ++#. %H: Transfer on %di ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:51 ++msgid "stat_dg_title_interface__if_octets" ++msgstr "" ++ ++#. Bytes/s ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:52 ++msgid "stat_dg_label_interface__if_octets" ++msgstr "" ++ ++#. %H: Packets on %di ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:53 ++msgid "stat_dg_title_interface__if_packets" ++msgstr "" ++ ++#. Packets/s ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:54 ++msgid "stat_dg_label_interface__if_packets" ++msgstr "" ++ ++#. %H: TCP-Connections to Port %pi ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:55 ++msgid "stat_dg_title_tcpconns" ++msgstr "" ++ ++#. Connections/s ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:56 ++msgid "stat_dg_label_tcpconns" ++msgstr "" ++ ++#. %di ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:57 ++msgid "stat_ds_tcp_connections" ++msgstr "" ++ ++#. %H: Disk Space Usage on %di ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:58 ++msgid "stat_dg_title_df" ++msgstr "" ++ ++#. Bytes ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:59 ++msgid "stat_dg_label_df" ++msgstr "" ++ ++#. %ds ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:60 ++msgid "stat_ds_df__free" ++msgstr "" ++ ++#. %ds ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:61 ++msgid "stat_ds_df__used" ++msgstr "" ++ ++#. %H: Interrupts ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:62 ++msgid "stat_dg_title_irq" ++msgstr "" ++ ++#. Issues/s ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:63 ++msgid "stat_dg_label_irq" ++msgstr "" ++ ++#. IRQ %di ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:64 ++msgid "stat_ds_irq" ++msgstr "" ++ ++#. %H: System Load ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:65 ++msgid "stat_dg_title_load" ++msgstr "" ++ ++#. Load ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:66 ++msgid "stat_dg_label_load" ++msgstr "" ++ ++#. 1 min ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:67 ++msgid "stat_ds_load__shortterm" ++msgstr "" ++ ++#. 5 min ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:68 ++msgid "stat_ds_load__midterm" ++msgstr "" ++ ++#. 15 min ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:69 ++msgid "stat_ds_load__longterm" ++msgstr "" +diff --git a/feeds/luci/applications/luci-app-statistics/po/sv/statistics.po b/feeds/luci/applications/luci-app-statistics/po/sv/statistics.po +new file mode 100644 +index 0000000..26f60fd +--- /dev/null ++++ b/feeds/luci/applications/luci-app-statistics/po/sv/statistics.po +@@ -0,0 +1,614 @@ ++msgid "" ++msgstr "" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Last-Translator: Automatically generated\n" ++"Language-Team: none\n" ++"Language: sv\n" ++"MIME-Version: 1.0\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n != 1);\n" ++ ++msgid "Action (target)" ++msgstr "" ++ ++msgid "Add command for reading values" ++msgstr "" ++ ++msgid "Add matching rule" ++msgstr "" ++ ++msgid "Add multiple hosts separated by space." ++msgstr "" ++ ++msgid "Add notification command" ++msgstr "" ++ ++msgid "Base Directory" ++msgstr "" ++ ++msgid "Basic monitoring" ++msgstr "" ++ ++msgid "CPU Plugin Configuration" ++msgstr "" ++ ++msgid "CSV Output" ++msgstr "" ++ ++msgid "CSV Plugin Configuration" ++msgstr "" ++ ++msgid "Cache collected data for" ++msgstr "" ++ ++msgid "Cache flush interval" ++msgstr "" ++ ++msgid "Chain" ++msgstr "" ++ ++msgid "CollectLinks" ++msgstr "" ++ ++msgid "CollectRoutes" ++msgstr "" ++ ++msgid "CollectTopology" ++msgstr "" ++ ++msgid "Collectd" ++msgstr "" ++ ++msgid "Collectd Settings" ++msgstr "" ++ ++msgid "" ++"Collectd is a small daemon for collecting data from various sources through " ++"different plugins. On this page you can change general settings for the " ++"collectd daemon." ++msgstr "" ++ ++msgid "Conntrack" ++msgstr "" ++ ++msgid "Conntrack Plugin Configuration" ++msgstr "" ++ ++msgid "DF Plugin Configuration" ++msgstr "" ++ ++msgid "DNS" ++msgstr "" ++ ++msgid "DNS Plugin Configuration" ++msgstr "" ++ ++msgid "Data collection interval" ++msgstr "" ++ ++msgid "Datasets definition file" ++msgstr "" ++ ++msgid "Destination ip range" ++msgstr "" ++ ++msgid "Directory for collectd plugins" ++msgstr "" ++ ++msgid "Directory for sub-configurations" ++msgstr "" ++ ++msgid "Disk Plugin Configuration" ++msgstr "" ++ ++msgid "Disk Space Usage" ++msgstr "" ++ ++msgid "Disk Usage" ++msgstr "" ++ ++msgid "Display Host »" ++msgstr "" ++ ++msgid "Display timespan »" ++msgstr "" ++ ++msgid "E-Mail Plugin Configuration" ++msgstr "" ++ ++msgid "Email" ++msgstr "" ++ ++msgid "Enable this plugin" ++msgstr "" ++ ++msgid "Exec" ++msgstr "" ++ ++msgid "Exec Plugin Configuration" ++msgstr "" ++ ++msgid "Filter class monitoring" ++msgstr "" ++ ++msgid "Firewall" ++msgstr "" ++ ++msgid "Flush cache after" ++msgstr "" ++ ++msgid "Forwarding between listen and server addresses" ++msgstr "" ++ ++msgid "Graphs" ++msgstr "" ++ ++msgid "Group" ++msgstr "" ++ ++msgid "" ++"Here you can define external commands which will be started by collectd in " ++"order to read certain values. The values will be read from stdout." ++msgstr "" ++ ++msgid "" ++"Here you can define external commands which will be started by collectd when " ++"certain threshold values have been reached. The values leading to invokation " ++"will be feeded to the the called programs stdin." ++msgstr "" ++ ++msgid "" ++"Here you can define various criteria by which the monitored iptables rules " ++"are selected." ++msgstr "" ++ ++msgid "Host" ++msgstr "" ++ ++msgid "Hostname" ++msgstr "" ++ ++msgid "IP or hostname where to get the txtinfo output from" ++msgstr "" ++ ++msgid "IRQ Plugin Configuration" ++msgstr "" ++ ++msgid "Ignore source addresses" ++msgstr "" ++ ++msgid "Incoming interface" ++msgstr "" ++ ++msgid "Interface Plugin Configuration" ++msgstr "" ++ ++msgid "Interfaces" ++msgstr "" ++ ++msgid "Interrupts" ++msgstr "" ++ ++msgid "Interval for pings" ++msgstr "" ++ ++msgid "Iptables Plugin Configuration" ++msgstr "" ++ ++msgid "Leave unselected to automatically determine interfaces to monitor." ++msgstr "" ++ ++msgid "Listen host" ++msgstr "" ++ ++msgid "Listen port" ++msgstr "" ++ ++msgid "Listener interfaces" ++msgstr "" ++ ++msgid "Load Plugin Configuration" ++msgstr "" ++ ++msgid "Maximum allowed connections" ++msgstr "" ++ ++msgid "Memory" ++msgstr "" ++ ++msgid "Memory Plugin Configuration" ++msgstr "" ++ ++msgid "Monitor all except specified" ++msgstr "" ++ ++msgid "Monitor all local listen ports" ++msgstr "" ++ ++msgid "Monitor devices" ++msgstr "" ++ ++msgid "Monitor disks and partitions" ++msgstr "" ++ ++msgid "Monitor filesystem types" ++msgstr "" ++ ++msgid "Monitor hosts" ++msgstr "" ++ ++msgid "Monitor interfaces" ++msgstr "" ++ ++msgid "Monitor interrupts" ++msgstr "" ++ ++msgid "Monitor local ports" ++msgstr "" ++ ++msgid "Monitor mount points" ++msgstr "" ++ ++msgid "Monitor processes" ++msgstr "" ++ ++msgid "Monitor remote ports" ++msgstr "" ++ ++msgid "Name of the rule" ++msgstr "" ++ ++msgid "Netlink" ++msgstr "" ++ ++msgid "Netlink Plugin Configuration" ++msgstr "" ++ ++msgid "Network" ++msgstr "" ++ ++msgid "Network Plugin Configuration" ++msgstr "" ++ ++msgid "Network plugins" ++msgstr "" ++ ++msgid "Network protocol" ++msgstr "" ++ ++msgid "Number of threads for data collection" ++msgstr "" ++ ++msgid "OLSRd" ++msgstr "" ++ ++msgid "OLSRd Plugin Configuration" ++msgstr "" ++ ++msgid "Only create average RRAs" ++msgstr "" ++ ++msgid "Options" ++msgstr "" ++ ++msgid "Outgoing interface" ++msgstr "" ++ ++msgid "Output plugins" ++msgstr "" ++ ++msgid "Ping" ++msgstr "" ++ ++msgid "Ping Plugin Configuration" ++msgstr "" ++ ++msgid "Port" ++msgstr "" ++ ++msgid "Processes" ++msgstr "" ++ ++msgid "Processes Plugin Configuration" ++msgstr "" ++ ++msgid "Processes to monitor separated by space" ++msgstr "" ++ ++msgid "Processor" ++msgstr "" ++ ++msgid "Qdisc monitoring" ++msgstr "" ++ ++msgid "RRD XFiles Factor" ++msgstr "" ++ ++msgid "RRD heart beat interval" ++msgstr "" ++ ++msgid "RRD step interval" ++msgstr "" ++ ++msgid "RRDTool" ++msgstr "" ++ ++msgid "RRDTool Plugin Configuration" ++msgstr "" ++ ++msgid "Rows per RRA" ++msgstr "" ++ ++msgid "Script" ++msgstr "" ++ ++msgid "Seconds" ++msgstr "" ++ ++msgid "Server host" ++msgstr "" ++ ++msgid "Server port" ++msgstr "" ++ ++msgid "Shaping class monitoring" ++msgstr "" ++ ++msgid "Socket file" ++msgstr "" ++ ++msgid "Socket group" ++msgstr "" ++ ++msgid "Socket permissions" ++msgstr "" ++ ++msgid "Source ip range" ++msgstr "" ++ ++msgid "Specifies what information to collect about links." ++msgstr "" ++ ++msgid "Specifies what information to collect about routes." ++msgstr "" ++ ++msgid "Specifies what information to collect about the global topology." ++msgstr "" ++ ++msgid "Splash Leases" ++msgstr "" ++ ++msgid "Splash Leases Plugin Configuration" ++msgstr "" ++ ++msgid "Statistics" ++msgstr "" ++ ++msgid "Storage directory" ++msgstr "" ++ ++msgid "Storage directory for the csv files" ++msgstr "" ++ ++msgid "Store data values as rates instead of absolute values" ++msgstr "" ++ ++msgid "Stored timespans" ++msgstr "" ++ ++msgid "System Load" ++msgstr "" ++ ++msgid "System plugins" ++msgstr "" ++ ++msgid "TCP Connections" ++msgstr "" ++ ++msgid "TCPConns Plugin Configuration" ++msgstr "" ++ ++msgid "TTL for network packets" ++msgstr "" ++ ++msgid "TTL for ping packets" ++msgstr "" ++ ++msgid "Table" ++msgstr "" ++ ++msgid "The NUT plugin reads information about Uninterruptible Power Supplies." ++msgstr "" ++ ++msgid "" ++"The OLSRd plugin reads information about meshed networks from the txtinfo " ++"plugin of OLSRd." ++msgstr "" ++ ++msgid "" ++"The conntrack plugin collects statistics about the number of tracked " ++"connections." ++msgstr "" ++ ++msgid "The cpu plugin collects basic statistics about the processor usage." ++msgstr "" ++ ++msgid "" ++"The csv plugin stores collected data in csv file format for further " ++"processing by external programs." ++msgstr "" ++ ++msgid "" ++"The df plugin collects statistics about the disk space usage on different " ++"devices, mount points or filesystem types." ++msgstr "" ++ ++msgid "" ++"The disk plugin collects detailled usage statistics for selected partitions " ++"or whole disks." ++msgstr "" ++ ++msgid "" ++"The dns plugin collects detailled statistics about dns related traffic on " ++"selected interfaces." ++msgstr "" ++ ++msgid "" ++"The email plugin creates a unix socket which can be used to transmit email-" ++"statistics to a running collectd daemon. This plugin is primarily intended " ++"to be used in conjunction with Mail::SpamAssasin::Plugin::Collectd but can " ++"be used in other ways as well." ++msgstr "" ++ ++msgid "" ++"The exec plugin starts external commands to read values from or to notify " ++"external processes when certain threshold values have been reached." ++msgstr "" ++ ++msgid "" ++"The interface plugin collects traffic statistics on selected interfaces." ++msgstr "" ++ ++msgid "" ++"The iptables plugin will monitor selected firewall rules and collect " ++"informations about processed bytes and packets per rule." ++msgstr "" ++ ++msgid "" ++"The irq plugin will monitor the rate of issues per second for each selected " ++"interrupt. If no interrupt is selected then all interrupts are monitored." ++msgstr "" ++ ++msgid "" ++"The iwinfo plugin collects statistics about wireless signal strength, noise " ++"and quality." ++msgstr "" ++ ++msgid "The load plugin collects statistics about the general system load." ++msgstr "" ++ ++msgid "The memory plugin collects statistics about the memory usage." ++msgstr "" ++ ++msgid "" ++"The netlink plugin collects extended informations like qdisc-, class- and " ++"filter-statistics for selected interfaces." ++msgstr "" ++ ++msgid "" ++"The network plugin provides network based communication between different " ++"collectd instances. Collectd can operate both in client and server mode. In " ++"client mode locally collected data is transferred to a collectd server " ++"instance, in server mode the local instance receives data from other hosts." ++msgstr "" ++ ++msgid "" ++"The ping plugin will send icmp echo replies to selected hosts and measure " ++"the roundtrip time for each host." ++msgstr "" ++ ++msgid "" ++"The processes plugin collects informations like cpu time, page faults and " ++"memory usage of selected processes." ++msgstr "" ++ ++msgid "" ++"The rrdtool plugin stores the collected data in rrd database files, the " ++"foundation of the diagrams.

    Warning: Setting the wrong " ++"values will result in a very high memory consumption in the temporary " ++"directory. This can render the device unusable!" ++msgstr "" ++ ++msgid "" ++"The splash leases plugin uses libuci to collect statistics about splash " ++"leases." ++msgstr "" ++ ++msgid "" ++"The statistics package is based on Collectd and uses RRD " ++"Tool to render diagram images from collected data." ++msgstr "" ++ ++msgid "" ++"The tcpconns plugin collects informations about open tcp connections on " ++"selected ports." ++msgstr "" ++ ++msgid "" ++"The unixsock plugin creates a unix socket which can be used to read " ++"collected data from a running collectd instance." ++msgstr "" ++ ++msgid "The uptime plugin collects statistics about the uptime of the system." ++msgstr "" ++ ++msgid "" ++"This section defines on which interfaces collectd will wait for incoming " ++"connections." ++msgstr "" ++ ++msgid "" ++"This section defines to which servers the locally collected data is sent to." ++msgstr "" ++ ++msgid "Try to lookup fully qualified hostname" ++msgstr "" ++ ++msgid "UPS" ++msgstr "" ++ ++msgid "UPS Plugin Configuration" ++msgstr "" ++ ++msgid "UPS name in NUT ups@host format" ++msgstr "" ++ ++msgid "UnixSock" ++msgstr "" ++ ++msgid "Unixsock Plugin Configuration" ++msgstr "" ++ ++msgid "Uptime" ++msgstr "" ++ ++msgid "Uptime Plugin Configuration" ++msgstr "" ++ ++msgid "Used PID file" ++msgstr "" ++ ++msgid "User" ++msgstr "" ++ ++msgid "Verbose monitoring" ++msgstr "" ++ ++msgid "Wireless" ++msgstr "" ++ ++msgid "Wireless iwinfo Plugin Configuration" ++msgstr "" ++ ++msgid "e.g. br-ff" ++msgstr "" ++ ++msgid "e.g. br-lan" ++msgstr "" ++ ++msgid "e.g. reject-with tcp-reset" ++msgstr "" ++ ++msgid "max. 16 chars" ++msgstr "" ++ ++msgid "reduces rrd size" ++msgstr "" ++ ++msgid "seconds; multiple separated by space" ++msgstr "" ++ ++msgid "server interfaces" ++msgstr "" +diff --git a/feeds/luci/applications/luci-app-statistics/po/templates/rrdtool.pot b/feeds/luci/applications/luci-app-statistics/po/templates/rrdtool.pot +new file mode 100644 +index 0000000..0a105ec +--- /dev/null ++++ b/feeds/luci/applications/luci-app-statistics/po/templates/rrdtool.pot +@@ -0,0 +1,349 @@ ++# rrdtool.pot ++# generated from ./applications/luci-statistics/luasrc/i18n/rrdtool.en.lua ++msgid "" ++msgstr "Content-Type: text/plain; charset=ISO-8859-1" ++ ++#. %H: Wireless - Signal Noise Ratio ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:1 ++msgid "stat_dg_title_wireless__signal_noise" ++msgstr "" ++ ++#. dBm ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:2 ++msgid "stat_dg_label_wireless__signal_noise" ++msgstr "" ++ ++#. Noise Level ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:3 ++msgid "stat_ds_signal_noise" ++msgstr "" ++ ++#. Signal Strength ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:4 ++msgid "stat_ds_signal_power" ++msgstr "" ++ ++#. %H: Wireless - Signal Quality ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:5 ++msgid "stat_dg_title_wireless__signal_quality" ++msgstr "" ++ ++#. n ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:6 ++msgid "stat_dg_label_wireless__signal_quality" ++msgstr "" ++ ++#. Signal Quality ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:7 ++msgid "stat_ds_signal_quality" ++msgstr "" ++ ++#. %H: ICMP Roundtrip Times ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:8 ++msgid "stat_dg_title_ping" ++msgstr "" ++ ++#. ms ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:9 ++msgid "stat_dg_label_ping" ++msgstr "" ++ ++#. %di ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:10 ++msgid "stat_ds_ping" ++msgstr "" ++ ++#. %H: Firewall - Processed Packets ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:11 ++msgid "stat_dg_title_iptables__ipt_packets" ++msgstr "" ++ ++#. Packets/s ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:12 ++msgid "stat_dg_label_iptables__ipt_packets" ++msgstr "" ++ ++#. Chain \"%di\" ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:13 ++msgid "stat_ds_ipt_packets" ++msgstr "" ++ ++#. %H: Netlink - Transfer on %pi ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:14 ++msgid "stat_dg_title_netlink__if_octets" ++msgstr "" ++ ++#. Bytes/s ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:15 ++msgid "stat_dg_label_netlink__if_octets" ++msgstr "" ++ ++#. Bytes (%ds) ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:16 ++msgid "stat_ds_if_octets" ++msgstr "" ++ ++#. %H: Netlink - Packets on %pi ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:17 ++msgid "stat_dg_title_netlink__if_packets" ++msgstr "" ++ ++#. Packets/s ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:18 ++msgid "stat_dg_label_netlink__if_packets" ++msgstr "" ++ ++#. Processed (%ds) ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:19 ++msgid "stat_ds_if_packets" ++msgstr "" ++ ++#. Dropped (%ds) ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:20 ++msgid "stat_ds_if_dropped" ++msgstr "" ++ ++#. Errors (%ds) ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:21 ++msgid "stat_ds_if_errors" ++msgstr "" ++ ++#. %H: Netlink - Multicast on %pi ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:22 ++msgid "stat_dg_title_netlink__if_multicast" ++msgstr "" ++ ++#. Packets/s ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:23 ++msgid "stat_dg_label_netlink__if_multicast" ++msgstr "" ++ ++#. Packets ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:24 ++msgid "stat_ds_if_multicast" ++msgstr "" ++ ++#. %H: Netlink - Collisions on %pi ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:25 ++msgid "stat_dg_title_netlink__if_collisions" ++msgstr "" ++ ++#. Collisions/s ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:26 ++msgid "stat_dg_label_netlink__if_collisions" ++msgstr "" ++ ++#. Collisions ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:27 ++msgid "stat_ds_if_collisions" ++msgstr "" ++ ++#. %H: Netlink - Errors on %pi ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:28 ++msgid "stat_dg_title_netlink__if_tx_errors" ++msgstr "" ++ ++#. Errors/s ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:29 ++msgid "stat_dg_label_netlink__if_tx_errors" ++msgstr "" ++ ++#. %di ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:30 ++msgid "stat_ds_if_tx_errors" ++msgstr "" ++ ++#. %di ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:31 ++msgid "stat_ds_if_rx_errors" ++msgstr "" ++ ++#. %H: Processes ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:32 ++msgid "stat_dg_title_processes" ++msgstr "" ++ ++#. Processes/s ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:33 ++msgid "stat_dg_label_processes" ++msgstr "" ++ ++#. %di ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:34 ++msgid "stat_ds_ps_state" ++msgstr "" ++ ++#. %H: Process %pi - used cpu time ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:35 ++msgid "stat_dg_title_processes__ps_cputime" ++msgstr "" ++ ++#. Jiffies ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:36 ++msgid "stat_dg_label_processes__ps_cputime" ++msgstr "" ++ ++#. system ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:37 ++msgid "stat_ds_ps_cputime__syst" ++msgstr "" ++ ++#. user ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:38 ++msgid "stat_ds_ps_cputime__user" ++msgstr "" ++ ++#. %H: Process %pi - threads and processes ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:39 ++msgid "stat_dg_title_processes__ps_count" ++msgstr "" ++ ++#. Count ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:40 ++msgid "stat_dg_label_processes__ps_count" ++msgstr "" ++ ++#. %ds ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:41 ++msgid "stat_ds_ps_count" ++msgstr "" ++ ++#. %H: Process %pi - page faults ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:42 ++msgid "stat_dg_title_processes__ps_pagefaults" ++msgstr "" ++ ++#. Pagefaults ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:43 ++msgid "stat_dg_label_processes__ps_pagefaults" ++msgstr "" ++ ++#. page faults ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:44 ++msgid "stat_ds_ps_pagefaults" ++msgstr "" ++ ++#. %H: Process %pi - virtual memory size ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:45 ++msgid "stat_dg_title_processes__ps_rss" ++msgstr "" ++ ++#. Bytes ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:46 ++msgid "stat_dg_label_processes__ps_rss" ++msgstr "" ++ ++#. virtual memory ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:47 ++msgid "stat_ds_ps_rss" ++msgstr "" ++ ++#. %H: Usage on Processor #%pi ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:48 ++msgid "stat_dg_title_cpu" ++msgstr "" ++ ++#. % ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:49 ++msgid "stat_dg_label_cpu" ++msgstr "" ++ ++#. %di ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:50 ++msgid "stat_ds_cpu" ++msgstr "" ++ ++#. %H: Transfer on %di ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:51 ++msgid "stat_dg_title_interface__if_octets" ++msgstr "" ++ ++#. Bytes/s ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:52 ++msgid "stat_dg_label_interface__if_octets" ++msgstr "" ++ ++#. %H: Packets on %di ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:53 ++msgid "stat_dg_title_interface__if_packets" ++msgstr "" ++ ++#. Packets/s ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:54 ++msgid "stat_dg_label_interface__if_packets" ++msgstr "" ++ ++#. %H: TCP-Connections to Port %pi ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:55 ++msgid "stat_dg_title_tcpconns" ++msgstr "" ++ ++#. Connections/s ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:56 ++msgid "stat_dg_label_tcpconns" ++msgstr "" ++ ++#. %di ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:57 ++msgid "stat_ds_tcp_connections" ++msgstr "" ++ ++#. %H: Disk Space Usage on %di ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:58 ++msgid "stat_dg_title_df" ++msgstr "" ++ ++#. Bytes ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:59 ++msgid "stat_dg_label_df" ++msgstr "" ++ ++#. %ds ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:60 ++msgid "stat_ds_df__free" ++msgstr "" ++ ++#. %ds ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:61 ++msgid "stat_ds_df__used" ++msgstr "" ++ ++#. %H: Interrupts ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:62 ++msgid "stat_dg_title_irq" ++msgstr "" ++ ++#. Issues/s ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:63 ++msgid "stat_dg_label_irq" ++msgstr "" ++ ++#. IRQ %di ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:64 ++msgid "stat_ds_irq" ++msgstr "" ++ ++#. %H: System Load ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:65 ++msgid "stat_dg_title_load" ++msgstr "" ++ ++#. Load ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:66 ++msgid "stat_dg_label_load" ++msgstr "" ++ ++#. 1 min ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:67 ++msgid "stat_ds_load__shortterm" ++msgstr "" ++ ++#. 5 min ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:68 ++msgid "stat_ds_load__midterm" ++msgstr "" ++ ++#. 15 min ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:69 ++msgid "stat_ds_load__longterm" ++msgstr "" +diff --git a/feeds/luci/applications/luci-app-statistics/po/templates/statistics.pot b/feeds/luci/applications/luci-app-statistics/po/templates/statistics.pot +new file mode 100644 +index 0000000..2162c66 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-statistics/po/templates/statistics.pot +@@ -0,0 +1,606 @@ ++msgid "" ++msgstr "Content-Type: text/plain; charset=UTF-8" ++ ++msgid "Action (target)" ++msgstr "" ++ ++msgid "Add command for reading values" ++msgstr "" ++ ++msgid "Add matching rule" ++msgstr "" ++ ++msgid "Add multiple hosts separated by space." ++msgstr "" ++ ++msgid "Add notification command" ++msgstr "" ++ ++msgid "Base Directory" ++msgstr "" ++ ++msgid "Basic monitoring" ++msgstr "" ++ ++msgid "CPU Plugin Configuration" ++msgstr "" ++ ++msgid "CSV Output" ++msgstr "" ++ ++msgid "CSV Plugin Configuration" ++msgstr "" ++ ++msgid "Cache collected data for" ++msgstr "" ++ ++msgid "Cache flush interval" ++msgstr "" ++ ++msgid "Chain" ++msgstr "" ++ ++msgid "CollectLinks" ++msgstr "" ++ ++msgid "CollectRoutes" ++msgstr "" ++ ++msgid "CollectTopology" ++msgstr "" ++ ++msgid "Collectd" ++msgstr "" ++ ++msgid "Collectd Settings" ++msgstr "" ++ ++msgid "" ++"Collectd is a small daemon for collecting data from various sources through " ++"different plugins. On this page you can change general settings for the " ++"collectd daemon." ++msgstr "" ++ ++msgid "Conntrack" ++msgstr "" ++ ++msgid "Conntrack Plugin Configuration" ++msgstr "" ++ ++msgid "DF Plugin Configuration" ++msgstr "" ++ ++msgid "DNS" ++msgstr "" ++ ++msgid "DNS Plugin Configuration" ++msgstr "" ++ ++msgid "Data collection interval" ++msgstr "" ++ ++msgid "Datasets definition file" ++msgstr "" ++ ++msgid "Destination ip range" ++msgstr "" ++ ++msgid "Directory for collectd plugins" ++msgstr "" ++ ++msgid "Directory for sub-configurations" ++msgstr "" ++ ++msgid "Disk Plugin Configuration" ++msgstr "" ++ ++msgid "Disk Space Usage" ++msgstr "" ++ ++msgid "Disk Usage" ++msgstr "" ++ ++msgid "Display Host »" ++msgstr "" ++ ++msgid "Display timespan »" ++msgstr "" ++ ++msgid "E-Mail Plugin Configuration" ++msgstr "" ++ ++msgid "Email" ++msgstr "" ++ ++msgid "Enable this plugin" ++msgstr "" ++ ++msgid "Exec" ++msgstr "" ++ ++msgid "Exec Plugin Configuration" ++msgstr "" ++ ++msgid "Filter class monitoring" ++msgstr "" ++ ++msgid "Firewall" ++msgstr "" ++ ++msgid "Flush cache after" ++msgstr "" ++ ++msgid "Forwarding between listen and server addresses" ++msgstr "" ++ ++msgid "Graphs" ++msgstr "" ++ ++msgid "Group" ++msgstr "" ++ ++msgid "" ++"Here you can define external commands which will be started by collectd in " ++"order to read certain values. The values will be read from stdout." ++msgstr "" ++ ++msgid "" ++"Here you can define external commands which will be started by collectd when " ++"certain threshold values have been reached. The values leading to invokation " ++"will be feeded to the the called programs stdin." ++msgstr "" ++ ++msgid "" ++"Here you can define various criteria by which the monitored iptables rules " ++"are selected." ++msgstr "" ++ ++msgid "Host" ++msgstr "" ++ ++msgid "Hostname" ++msgstr "" ++ ++msgid "IP or hostname where to get the txtinfo output from" ++msgstr "" ++ ++msgid "IRQ Plugin Configuration" ++msgstr "" ++ ++msgid "Ignore source addresses" ++msgstr "" ++ ++msgid "Incoming interface" ++msgstr "" ++ ++msgid "Interface Plugin Configuration" ++msgstr "" ++ ++msgid "Interfaces" ++msgstr "" ++ ++msgid "Interrupts" ++msgstr "" ++ ++msgid "Interval for pings" ++msgstr "" ++ ++msgid "Iptables Plugin Configuration" ++msgstr "" ++ ++msgid "Leave unselected to automatically determine interfaces to monitor." ++msgstr "" ++ ++msgid "Listen host" ++msgstr "" ++ ++msgid "Listen port" ++msgstr "" ++ ++msgid "Listener interfaces" ++msgstr "" ++ ++msgid "Load Plugin Configuration" ++msgstr "" ++ ++msgid "Maximum allowed connections" ++msgstr "" ++ ++msgid "Memory" ++msgstr "" ++ ++msgid "Memory Plugin Configuration" ++msgstr "" ++ ++msgid "Monitor all except specified" ++msgstr "" ++ ++msgid "Monitor all local listen ports" ++msgstr "" ++ ++msgid "Monitor devices" ++msgstr "" ++ ++msgid "Monitor disks and partitions" ++msgstr "" ++ ++msgid "Monitor filesystem types" ++msgstr "" ++ ++msgid "Monitor hosts" ++msgstr "" ++ ++msgid "Monitor interfaces" ++msgstr "" ++ ++msgid "Monitor interrupts" ++msgstr "" ++ ++msgid "Monitor local ports" ++msgstr "" ++ ++msgid "Monitor mount points" ++msgstr "" ++ ++msgid "Monitor processes" ++msgstr "" ++ ++msgid "Monitor remote ports" ++msgstr "" ++ ++msgid "Name of the rule" ++msgstr "" ++ ++msgid "Netlink" ++msgstr "" ++ ++msgid "Netlink Plugin Configuration" ++msgstr "" ++ ++msgid "Network" ++msgstr "" ++ ++msgid "Network Plugin Configuration" ++msgstr "" ++ ++msgid "Network plugins" ++msgstr "" ++ ++msgid "Network protocol" ++msgstr "" ++ ++msgid "Number of threads for data collection" ++msgstr "" ++ ++msgid "OLSRd" ++msgstr "" ++ ++msgid "OLSRd Plugin Configuration" ++msgstr "" ++ ++msgid "Only create average RRAs" ++msgstr "" ++ ++msgid "Options" ++msgstr "" ++ ++msgid "Outgoing interface" ++msgstr "" ++ ++msgid "Output plugins" ++msgstr "" ++ ++msgid "Ping" ++msgstr "" ++ ++msgid "Ping Plugin Configuration" ++msgstr "" ++ ++msgid "Port" ++msgstr "" ++ ++msgid "Processes" ++msgstr "" ++ ++msgid "Processes Plugin Configuration" ++msgstr "" ++ ++msgid "Processes to monitor separated by space" ++msgstr "" ++ ++msgid "Processor" ++msgstr "" ++ ++msgid "Qdisc monitoring" ++msgstr "" ++ ++msgid "RRD XFiles Factor" ++msgstr "" ++ ++msgid "RRD heart beat interval" ++msgstr "" ++ ++msgid "RRD step interval" ++msgstr "" ++ ++msgid "RRDTool" ++msgstr "" ++ ++msgid "RRDTool Plugin Configuration" ++msgstr "" ++ ++msgid "Rows per RRA" ++msgstr "" ++ ++msgid "Script" ++msgstr "" ++ ++msgid "Seconds" ++msgstr "" ++ ++msgid "Server host" ++msgstr "" ++ ++msgid "Server port" ++msgstr "" ++ ++msgid "Shaping class monitoring" ++msgstr "" ++ ++msgid "Socket file" ++msgstr "" ++ ++msgid "Socket group" ++msgstr "" ++ ++msgid "Socket permissions" ++msgstr "" ++ ++msgid "Source ip range" ++msgstr "" ++ ++msgid "Specifies what information to collect about links." ++msgstr "" ++ ++msgid "Specifies what information to collect about routes." ++msgstr "" ++ ++msgid "Specifies what information to collect about the global topology." ++msgstr "" ++ ++msgid "Splash Leases" ++msgstr "" ++ ++msgid "Splash Leases Plugin Configuration" ++msgstr "" ++ ++msgid "Statistics" ++msgstr "" ++ ++msgid "Storage directory" ++msgstr "" ++ ++msgid "Storage directory for the csv files" ++msgstr "" ++ ++msgid "Store data values as rates instead of absolute values" ++msgstr "" ++ ++msgid "Stored timespans" ++msgstr "" ++ ++msgid "System Load" ++msgstr "" ++ ++msgid "System plugins" ++msgstr "" ++ ++msgid "TCP Connections" ++msgstr "" ++ ++msgid "TCPConns Plugin Configuration" ++msgstr "" ++ ++msgid "TTL for network packets" ++msgstr "" ++ ++msgid "TTL for ping packets" ++msgstr "" ++ ++msgid "Table" ++msgstr "" ++ ++msgid "The NUT plugin reads information about Uninterruptible Power Supplies." ++msgstr "" ++ ++msgid "" ++"The OLSRd plugin reads information about meshed networks from the txtinfo " ++"plugin of OLSRd." ++msgstr "" ++ ++msgid "" ++"The conntrack plugin collects statistics about the number of tracked " ++"connections." ++msgstr "" ++ ++msgid "The cpu plugin collects basic statistics about the processor usage." ++msgstr "" ++ ++msgid "" ++"The csv plugin stores collected data in csv file format for further " ++"processing by external programs." ++msgstr "" ++ ++msgid "" ++"The df plugin collects statistics about the disk space usage on different " ++"devices, mount points or filesystem types." ++msgstr "" ++ ++msgid "" ++"The disk plugin collects detailled usage statistics for selected partitions " ++"or whole disks." ++msgstr "" ++ ++msgid "" ++"The dns plugin collects detailled statistics about dns related traffic on " ++"selected interfaces." ++msgstr "" ++ ++msgid "" ++"The email plugin creates a unix socket which can be used to transmit email-" ++"statistics to a running collectd daemon. This plugin is primarily intended " ++"to be used in conjunction with Mail::SpamAssasin::Plugin::Collectd but can " ++"be used in other ways as well." ++msgstr "" ++ ++msgid "" ++"The exec plugin starts external commands to read values from or to notify " ++"external processes when certain threshold values have been reached." ++msgstr "" ++ ++msgid "" ++"The interface plugin collects traffic statistics on selected interfaces." ++msgstr "" ++ ++msgid "" ++"The iptables plugin will monitor selected firewall rules and collect " ++"informations about processed bytes and packets per rule." ++msgstr "" ++ ++msgid "" ++"The irq plugin will monitor the rate of issues per second for each selected " ++"interrupt. If no interrupt is selected then all interrupts are monitored." ++msgstr "" ++ ++msgid "" ++"The iwinfo plugin collects statistics about wireless signal strength, noise " ++"and quality." ++msgstr "" ++ ++msgid "The load plugin collects statistics about the general system load." ++msgstr "" ++ ++msgid "The memory plugin collects statistics about the memory usage." ++msgstr "" ++ ++msgid "" ++"The netlink plugin collects extended informations like qdisc-, class- and " ++"filter-statistics for selected interfaces." ++msgstr "" ++ ++msgid "" ++"The network plugin provides network based communication between different " ++"collectd instances. Collectd can operate both in client and server mode. In " ++"client mode locally collected data is transferred to a collectd server " ++"instance, in server mode the local instance receives data from other hosts." ++msgstr "" ++ ++msgid "" ++"The ping plugin will send icmp echo replies to selected hosts and measure " ++"the roundtrip time for each host." ++msgstr "" ++ ++msgid "" ++"The processes plugin collects informations like cpu time, page faults and " ++"memory usage of selected processes." ++msgstr "" ++ ++msgid "" ++"The rrdtool plugin stores the collected data in rrd database files, the " ++"foundation of the diagrams.

    Warning: Setting the wrong " ++"values will result in a very high memory consumption in the temporary " ++"directory. This can render the device unusable!" ++msgstr "" ++ ++msgid "" ++"The splash leases plugin uses libuci to collect statistics about splash " ++"leases." ++msgstr "" ++ ++msgid "" ++"The statistics package is based on Collectd and uses RRD " ++"Tool to render diagram images from collected data." ++msgstr "" ++ ++msgid "" ++"The tcpconns plugin collects informations about open tcp connections on " ++"selected ports." ++msgstr "" ++ ++msgid "" ++"The unixsock plugin creates a unix socket which can be used to read " ++"collected data from a running collectd instance." ++msgstr "" ++ ++msgid "The uptime plugin collects statistics about the uptime of the system." ++msgstr "" ++ ++msgid "" ++"This section defines on which interfaces collectd will wait for incoming " ++"connections." ++msgstr "" ++ ++msgid "" ++"This section defines to which servers the locally collected data is sent to." ++msgstr "" ++ ++msgid "Try to lookup fully qualified hostname" ++msgstr "" ++ ++msgid "UPS" ++msgstr "" ++ ++msgid "UPS Plugin Configuration" ++msgstr "" ++ ++msgid "UPS name in NUT ups@host format" ++msgstr "" ++ ++msgid "UnixSock" ++msgstr "" ++ ++msgid "Unixsock Plugin Configuration" ++msgstr "" ++ ++msgid "Uptime" ++msgstr "" ++ ++msgid "Uptime Plugin Configuration" ++msgstr "" ++ ++msgid "Used PID file" ++msgstr "" ++ ++msgid "User" ++msgstr "" ++ ++msgid "Verbose monitoring" ++msgstr "" ++ ++msgid "Wireless" ++msgstr "" ++ ++msgid "Wireless iwinfo Plugin Configuration" ++msgstr "" ++ ++msgid "e.g. br-ff" ++msgstr "" ++ ++msgid "e.g. br-lan" ++msgstr "" ++ ++msgid "e.g. reject-with tcp-reset" ++msgstr "" ++ ++msgid "max. 16 chars" ++msgstr "" ++ ++msgid "reduces rrd size" ++msgstr "" ++ ++msgid "seconds; multiple separated by space" ++msgstr "" ++ ++msgid "server interfaces" ++msgstr "" +diff --git a/feeds/luci/applications/luci-app-statistics/po/tr/rrdtool.po b/feeds/luci/applications/luci-app-statistics/po/tr/rrdtool.po +new file mode 100644 +index 0000000..cb2187b +--- /dev/null ++++ b/feeds/luci/applications/luci-app-statistics/po/tr/rrdtool.po +@@ -0,0 +1,356 @@ ++# rrdtool.pot ++# generated from ./applications/luci-statistics/luasrc/i18n/rrdtool.en.lua ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Last-Translator: Automatically generated\n" ++"Language-Team: none\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=ASCII\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=1; plural=0;\n" ++ ++#. %H: Wireless - Signal Noise Ratio ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:1 ++msgid "stat_dg_title_wireless__signal_noise" ++msgstr "" ++ ++#. dBm ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:2 ++msgid "stat_dg_label_wireless__signal_noise" ++msgstr "" ++ ++#. Noise Level ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:3 ++msgid "stat_ds_signal_noise" ++msgstr "" ++ ++#. Signal Strength ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:4 ++msgid "stat_ds_signal_power" ++msgstr "" ++ ++#. %H: Wireless - Signal Quality ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:5 ++msgid "stat_dg_title_wireless__signal_quality" ++msgstr "" ++ ++#. n ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:6 ++msgid "stat_dg_label_wireless__signal_quality" ++msgstr "" ++ ++#. Signal Quality ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:7 ++msgid "stat_ds_signal_quality" ++msgstr "" ++ ++#. %H: ICMP Roundtrip Times ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:8 ++msgid "stat_dg_title_ping" ++msgstr "" ++ ++#. ms ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:9 ++msgid "stat_dg_label_ping" ++msgstr "" ++ ++#. %di ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:10 ++msgid "stat_ds_ping" ++msgstr "" ++ ++#. %H: Firewall - Processed Packets ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:11 ++msgid "stat_dg_title_iptables__ipt_packets" ++msgstr "" ++ ++#. Packets/s ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:12 ++msgid "stat_dg_label_iptables__ipt_packets" ++msgstr "" ++ ++#. Chain \"%di\" ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:13 ++msgid "stat_ds_ipt_packets" ++msgstr "" ++ ++#. %H: Netlink - Transfer on %pi ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:14 ++msgid "stat_dg_title_netlink__if_octets" ++msgstr "" ++ ++#. Bytes/s ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:15 ++msgid "stat_dg_label_netlink__if_octets" ++msgstr "" ++ ++#. Bytes (%ds) ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:16 ++msgid "stat_ds_if_octets" ++msgstr "" ++ ++#. %H: Netlink - Packets on %pi ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:17 ++msgid "stat_dg_title_netlink__if_packets" ++msgstr "" ++ ++#. Packets/s ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:18 ++msgid "stat_dg_label_netlink__if_packets" ++msgstr "" ++ ++#. Processed (%ds) ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:19 ++msgid "stat_ds_if_packets" ++msgstr "" ++ ++#. Dropped (%ds) ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:20 ++msgid "stat_ds_if_dropped" ++msgstr "" ++ ++#. Errors (%ds) ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:21 ++msgid "stat_ds_if_errors" ++msgstr "" ++ ++#. %H: Netlink - Multicast on %pi ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:22 ++msgid "stat_dg_title_netlink__if_multicast" ++msgstr "" ++ ++#. Packets/s ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:23 ++msgid "stat_dg_label_netlink__if_multicast" ++msgstr "" ++ ++#. Packets ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:24 ++msgid "stat_ds_if_multicast" ++msgstr "" ++ ++#. %H: Netlink - Collisions on %pi ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:25 ++msgid "stat_dg_title_netlink__if_collisions" ++msgstr "" ++ ++#. Collisions/s ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:26 ++msgid "stat_dg_label_netlink__if_collisions" ++msgstr "" ++ ++#. Collisions ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:27 ++msgid "stat_ds_if_collisions" ++msgstr "" ++ ++#. %H: Netlink - Errors on %pi ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:28 ++msgid "stat_dg_title_netlink__if_tx_errors" ++msgstr "" ++ ++#. Errors/s ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:29 ++msgid "stat_dg_label_netlink__if_tx_errors" ++msgstr "" ++ ++#. %di ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:30 ++msgid "stat_ds_if_tx_errors" ++msgstr "" ++ ++#. %di ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:31 ++msgid "stat_ds_if_rx_errors" ++msgstr "" ++ ++#. %H: Processes ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:32 ++msgid "stat_dg_title_processes" ++msgstr "" ++ ++#. Processes/s ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:33 ++msgid "stat_dg_label_processes" ++msgstr "" ++ ++#. %di ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:34 ++msgid "stat_ds_ps_state" ++msgstr "" ++ ++#. %H: Process %pi - used cpu time ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:35 ++msgid "stat_dg_title_processes__ps_cputime" ++msgstr "" ++ ++#. Jiffies ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:36 ++msgid "stat_dg_label_processes__ps_cputime" ++msgstr "" ++ ++#. system ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:37 ++msgid "stat_ds_ps_cputime__syst" ++msgstr "" ++ ++#. user ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:38 ++msgid "stat_ds_ps_cputime__user" ++msgstr "" ++ ++#. %H: Process %pi - threads and processes ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:39 ++msgid "stat_dg_title_processes__ps_count" ++msgstr "" ++ ++#. Count ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:40 ++msgid "stat_dg_label_processes__ps_count" ++msgstr "" ++ ++#. %ds ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:41 ++msgid "stat_ds_ps_count" ++msgstr "" ++ ++#. %H: Process %pi - page faults ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:42 ++msgid "stat_dg_title_processes__ps_pagefaults" ++msgstr "" ++ ++#. Pagefaults ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:43 ++msgid "stat_dg_label_processes__ps_pagefaults" ++msgstr "" ++ ++#. page faults ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:44 ++msgid "stat_ds_ps_pagefaults" ++msgstr "" ++ ++#. %H: Process %pi - virtual memory size ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:45 ++msgid "stat_dg_title_processes__ps_rss" ++msgstr "" ++ ++#. Bytes ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:46 ++msgid "stat_dg_label_processes__ps_rss" ++msgstr "" ++ ++#. virtual memory ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:47 ++msgid "stat_ds_ps_rss" ++msgstr "" ++ ++#. %H: Usage on Processor #%pi ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:48 ++msgid "stat_dg_title_cpu" ++msgstr "" ++ ++#. % ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:49 ++msgid "stat_dg_label_cpu" ++msgstr "" ++ ++#. %di ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:50 ++msgid "stat_ds_cpu" ++msgstr "" ++ ++#. %H: Transfer on %di ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:51 ++msgid "stat_dg_title_interface__if_octets" ++msgstr "" ++ ++#. Bytes/s ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:52 ++msgid "stat_dg_label_interface__if_octets" ++msgstr "" ++ ++#. %H: Packets on %di ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:53 ++msgid "stat_dg_title_interface__if_packets" ++msgstr "" ++ ++#. Packets/s ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:54 ++msgid "stat_dg_label_interface__if_packets" ++msgstr "" ++ ++#. %H: TCP-Connections to Port %pi ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:55 ++msgid "stat_dg_title_tcpconns" ++msgstr "" ++ ++#. Connections/s ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:56 ++msgid "stat_dg_label_tcpconns" ++msgstr "" ++ ++#. %di ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:57 ++msgid "stat_ds_tcp_connections" ++msgstr "" ++ ++#. %H: Disk Space Usage on %di ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:58 ++msgid "stat_dg_title_df" ++msgstr "" ++ ++#. Bytes ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:59 ++msgid "stat_dg_label_df" ++msgstr "" ++ ++#. %ds ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:60 ++msgid "stat_ds_df__free" ++msgstr "" ++ ++#. %ds ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:61 ++msgid "stat_ds_df__used" ++msgstr "" ++ ++#. %H: Interrupts ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:62 ++msgid "stat_dg_title_irq" ++msgstr "" ++ ++#. Issues/s ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:63 ++msgid "stat_dg_label_irq" ++msgstr "" ++ ++#. IRQ %di ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:64 ++msgid "stat_ds_irq" ++msgstr "" ++ ++#. %H: System Load ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:65 ++msgid "stat_dg_title_load" ++msgstr "" ++ ++#. Load ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:66 ++msgid "stat_dg_label_load" ++msgstr "" ++ ++#. 1 min ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:67 ++msgid "stat_ds_load__shortterm" ++msgstr "" ++ ++#. 5 min ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:68 ++msgid "stat_ds_load__midterm" ++msgstr "" ++ ++#. 15 min ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:69 ++msgid "stat_ds_load__longterm" ++msgstr "" +diff --git a/feeds/luci/applications/luci-app-statistics/po/tr/statistics.po b/feeds/luci/applications/luci-app-statistics/po/tr/statistics.po +new file mode 100644 +index 0000000..c3267da +--- /dev/null ++++ b/feeds/luci/applications/luci-app-statistics/po/tr/statistics.po +@@ -0,0 +1,614 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Last-Translator: Automatically generated\n" ++"Language-Team: none\n" ++"Language: \n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=1; plural=0;\n" ++ ++msgid "Action (target)" ++msgstr "" ++ ++msgid "Add command for reading values" ++msgstr "" ++ ++msgid "Add matching rule" ++msgstr "" ++ ++msgid "Add multiple hosts separated by space." ++msgstr "" ++ ++msgid "Add notification command" ++msgstr "" ++ ++msgid "Base Directory" ++msgstr "" ++ ++msgid "Basic monitoring" ++msgstr "" ++ ++msgid "CPU Plugin Configuration" ++msgstr "" ++ ++msgid "CSV Output" ++msgstr "" ++ ++msgid "CSV Plugin Configuration" ++msgstr "" ++ ++msgid "Cache collected data for" ++msgstr "" ++ ++msgid "Cache flush interval" ++msgstr "" ++ ++msgid "Chain" ++msgstr "" ++ ++msgid "CollectLinks" ++msgstr "" ++ ++msgid "CollectRoutes" ++msgstr "" ++ ++msgid "CollectTopology" ++msgstr "" ++ ++msgid "Collectd" ++msgstr "" ++ ++msgid "Collectd Settings" ++msgstr "" ++ ++msgid "" ++"Collectd is a small daemon for collecting data from various sources through " ++"different plugins. On this page you can change general settings for the " ++"collectd daemon." ++msgstr "" ++ ++msgid "Conntrack" ++msgstr "" ++ ++msgid "Conntrack Plugin Configuration" ++msgstr "" ++ ++msgid "DF Plugin Configuration" ++msgstr "" ++ ++msgid "DNS" ++msgstr "" ++ ++msgid "DNS Plugin Configuration" ++msgstr "" ++ ++msgid "Data collection interval" ++msgstr "" ++ ++msgid "Datasets definition file" ++msgstr "" ++ ++msgid "Destination ip range" ++msgstr "" ++ ++msgid "Directory for collectd plugins" ++msgstr "" ++ ++msgid "Directory for sub-configurations" ++msgstr "" ++ ++msgid "Disk Plugin Configuration" ++msgstr "" ++ ++msgid "Disk Space Usage" ++msgstr "" ++ ++msgid "Disk Usage" ++msgstr "" ++ ++msgid "Display Host »" ++msgstr "" ++ ++msgid "Display timespan »" ++msgstr "" ++ ++msgid "E-Mail Plugin Configuration" ++msgstr "" ++ ++msgid "Email" ++msgstr "" ++ ++msgid "Enable this plugin" ++msgstr "" ++ ++msgid "Exec" ++msgstr "" ++ ++msgid "Exec Plugin Configuration" ++msgstr "" ++ ++msgid "Filter class monitoring" ++msgstr "" ++ ++msgid "Firewall" ++msgstr "" ++ ++msgid "Flush cache after" ++msgstr "" ++ ++msgid "Forwarding between listen and server addresses" ++msgstr "" ++ ++msgid "Graphs" ++msgstr "" ++ ++msgid "Group" ++msgstr "" ++ ++msgid "" ++"Here you can define external commands which will be started by collectd in " ++"order to read certain values. The values will be read from stdout." ++msgstr "" ++ ++msgid "" ++"Here you can define external commands which will be started by collectd when " ++"certain threshold values have been reached. The values leading to invokation " ++"will be feeded to the the called programs stdin." ++msgstr "" ++ ++msgid "" ++"Here you can define various criteria by which the monitored iptables rules " ++"are selected." ++msgstr "" ++ ++msgid "Host" ++msgstr "" ++ ++msgid "Hostname" ++msgstr "" ++ ++msgid "IP or hostname where to get the txtinfo output from" ++msgstr "" ++ ++msgid "IRQ Plugin Configuration" ++msgstr "" ++ ++msgid "Ignore source addresses" ++msgstr "" ++ ++msgid "Incoming interface" ++msgstr "" ++ ++msgid "Interface Plugin Configuration" ++msgstr "" ++ ++msgid "Interfaces" ++msgstr "" ++ ++msgid "Interrupts" ++msgstr "" ++ ++msgid "Interval for pings" ++msgstr "" ++ ++msgid "Iptables Plugin Configuration" ++msgstr "" ++ ++msgid "Leave unselected to automatically determine interfaces to monitor." ++msgstr "" ++ ++msgid "Listen host" ++msgstr "" ++ ++msgid "Listen port" ++msgstr "" ++ ++msgid "Listener interfaces" ++msgstr "" ++ ++msgid "Load Plugin Configuration" ++msgstr "" ++ ++msgid "Maximum allowed connections" ++msgstr "" ++ ++msgid "Memory" ++msgstr "" ++ ++msgid "Memory Plugin Configuration" ++msgstr "" ++ ++msgid "Monitor all except specified" ++msgstr "" ++ ++msgid "Monitor all local listen ports" ++msgstr "" ++ ++msgid "Monitor devices" ++msgstr "" ++ ++msgid "Monitor disks and partitions" ++msgstr "" ++ ++msgid "Monitor filesystem types" ++msgstr "" ++ ++msgid "Monitor hosts" ++msgstr "" ++ ++msgid "Monitor interfaces" ++msgstr "" ++ ++msgid "Monitor interrupts" ++msgstr "" ++ ++msgid "Monitor local ports" ++msgstr "" ++ ++msgid "Monitor mount points" ++msgstr "" ++ ++msgid "Monitor processes" ++msgstr "" ++ ++msgid "Monitor remote ports" ++msgstr "" ++ ++msgid "Name of the rule" ++msgstr "" ++ ++msgid "Netlink" ++msgstr "" ++ ++msgid "Netlink Plugin Configuration" ++msgstr "" ++ ++msgid "Network" ++msgstr "" ++ ++msgid "Network Plugin Configuration" ++msgstr "" ++ ++msgid "Network plugins" ++msgstr "" ++ ++msgid "Network protocol" ++msgstr "" ++ ++msgid "Number of threads for data collection" ++msgstr "" ++ ++msgid "OLSRd" ++msgstr "" ++ ++msgid "OLSRd Plugin Configuration" ++msgstr "" ++ ++msgid "Only create average RRAs" ++msgstr "" ++ ++msgid "Options" ++msgstr "" ++ ++msgid "Outgoing interface" ++msgstr "" ++ ++msgid "Output plugins" ++msgstr "" ++ ++msgid "Ping" ++msgstr "" ++ ++msgid "Ping Plugin Configuration" ++msgstr "" ++ ++msgid "Port" ++msgstr "" ++ ++msgid "Processes" ++msgstr "" ++ ++msgid "Processes Plugin Configuration" ++msgstr "" ++ ++msgid "Processes to monitor separated by space" ++msgstr "" ++ ++msgid "Processor" ++msgstr "" ++ ++msgid "Qdisc monitoring" ++msgstr "" ++ ++msgid "RRD XFiles Factor" ++msgstr "" ++ ++msgid "RRD heart beat interval" ++msgstr "" ++ ++msgid "RRD step interval" ++msgstr "" ++ ++msgid "RRDTool" ++msgstr "" ++ ++msgid "RRDTool Plugin Configuration" ++msgstr "" ++ ++msgid "Rows per RRA" ++msgstr "" ++ ++msgid "Script" ++msgstr "" ++ ++msgid "Seconds" ++msgstr "" ++ ++msgid "Server host" ++msgstr "" ++ ++msgid "Server port" ++msgstr "" ++ ++msgid "Shaping class monitoring" ++msgstr "" ++ ++msgid "Socket file" ++msgstr "" ++ ++msgid "Socket group" ++msgstr "" ++ ++msgid "Socket permissions" ++msgstr "" ++ ++msgid "Source ip range" ++msgstr "" ++ ++msgid "Specifies what information to collect about links." ++msgstr "" ++ ++msgid "Specifies what information to collect about routes." ++msgstr "" ++ ++msgid "Specifies what information to collect about the global topology." ++msgstr "" ++ ++msgid "Splash Leases" ++msgstr "" ++ ++msgid "Splash Leases Plugin Configuration" ++msgstr "" ++ ++msgid "Statistics" ++msgstr "" ++ ++msgid "Storage directory" ++msgstr "" ++ ++msgid "Storage directory for the csv files" ++msgstr "" ++ ++msgid "Store data values as rates instead of absolute values" ++msgstr "" ++ ++msgid "Stored timespans" ++msgstr "" ++ ++msgid "System Load" ++msgstr "" ++ ++msgid "System plugins" ++msgstr "" ++ ++msgid "TCP Connections" ++msgstr "" ++ ++msgid "TCPConns Plugin Configuration" ++msgstr "" ++ ++msgid "TTL for network packets" ++msgstr "" ++ ++msgid "TTL for ping packets" ++msgstr "" ++ ++msgid "Table" ++msgstr "" ++ ++msgid "The NUT plugin reads information about Uninterruptible Power Supplies." ++msgstr "" ++ ++msgid "" ++"The OLSRd plugin reads information about meshed networks from the txtinfo " ++"plugin of OLSRd." ++msgstr "" ++ ++msgid "" ++"The conntrack plugin collects statistics about the number of tracked " ++"connections." ++msgstr "" ++ ++msgid "The cpu plugin collects basic statistics about the processor usage." ++msgstr "" ++ ++msgid "" ++"The csv plugin stores collected data in csv file format for further " ++"processing by external programs." ++msgstr "" ++ ++msgid "" ++"The df plugin collects statistics about the disk space usage on different " ++"devices, mount points or filesystem types." ++msgstr "" ++ ++msgid "" ++"The disk plugin collects detailled usage statistics for selected partitions " ++"or whole disks." ++msgstr "" ++ ++msgid "" ++"The dns plugin collects detailled statistics about dns related traffic on " ++"selected interfaces." ++msgstr "" ++ ++msgid "" ++"The email plugin creates a unix socket which can be used to transmit email-" ++"statistics to a running collectd daemon. This plugin is primarily intended " ++"to be used in conjunction with Mail::SpamAssasin::Plugin::Collectd but can " ++"be used in other ways as well." ++msgstr "" ++ ++msgid "" ++"The exec plugin starts external commands to read values from or to notify " ++"external processes when certain threshold values have been reached." ++msgstr "" ++ ++msgid "" ++"The interface plugin collects traffic statistics on selected interfaces." ++msgstr "" ++ ++msgid "" ++"The iptables plugin will monitor selected firewall rules and collect " ++"informations about processed bytes and packets per rule." ++msgstr "" ++ ++msgid "" ++"The irq plugin will monitor the rate of issues per second for each selected " ++"interrupt. If no interrupt is selected then all interrupts are monitored." ++msgstr "" ++ ++msgid "" ++"The iwinfo plugin collects statistics about wireless signal strength, noise " ++"and quality." ++msgstr "" ++ ++msgid "The load plugin collects statistics about the general system load." ++msgstr "" ++ ++msgid "The memory plugin collects statistics about the memory usage." ++msgstr "" ++ ++msgid "" ++"The netlink plugin collects extended informations like qdisc-, class- and " ++"filter-statistics for selected interfaces." ++msgstr "" ++ ++msgid "" ++"The network plugin provides network based communication between different " ++"collectd instances. Collectd can operate both in client and server mode. In " ++"client mode locally collected data is transferred to a collectd server " ++"instance, in server mode the local instance receives data from other hosts." ++msgstr "" ++ ++msgid "" ++"The ping plugin will send icmp echo replies to selected hosts and measure " ++"the roundtrip time for each host." ++msgstr "" ++ ++msgid "" ++"The processes plugin collects informations like cpu time, page faults and " ++"memory usage of selected processes." ++msgstr "" ++ ++msgid "" ++"The rrdtool plugin stores the collected data in rrd database files, the " ++"foundation of the diagrams.

    Warning: Setting the wrong " ++"values will result in a very high memory consumption in the temporary " ++"directory. This can render the device unusable!" ++msgstr "" ++ ++msgid "" ++"The splash leases plugin uses libuci to collect statistics about splash " ++"leases." ++msgstr "" ++ ++msgid "" ++"The statistics package is based on Collectd and uses RRD " ++"Tool to render diagram images from collected data." ++msgstr "" ++ ++msgid "" ++"The tcpconns plugin collects informations about open tcp connections on " ++"selected ports." ++msgstr "" ++ ++msgid "" ++"The unixsock plugin creates a unix socket which can be used to read " ++"collected data from a running collectd instance." ++msgstr "" ++ ++msgid "The uptime plugin collects statistics about the uptime of the system." ++msgstr "" ++ ++msgid "" ++"This section defines on which interfaces collectd will wait for incoming " ++"connections." ++msgstr "" ++ ++msgid "" ++"This section defines to which servers the locally collected data is sent to." ++msgstr "" ++ ++msgid "Try to lookup fully qualified hostname" ++msgstr "" ++ ++msgid "UPS" ++msgstr "" ++ ++msgid "UPS Plugin Configuration" ++msgstr "" ++ ++msgid "UPS name in NUT ups@host format" ++msgstr "" ++ ++msgid "UnixSock" ++msgstr "" ++ ++msgid "Unixsock Plugin Configuration" ++msgstr "" ++ ++msgid "Uptime" ++msgstr "" ++ ++msgid "Uptime Plugin Configuration" ++msgstr "" ++ ++msgid "Used PID file" ++msgstr "" ++ ++msgid "User" ++msgstr "" ++ ++msgid "Verbose monitoring" ++msgstr "" ++ ++msgid "Wireless" ++msgstr "" ++ ++msgid "Wireless iwinfo Plugin Configuration" ++msgstr "" ++ ++msgid "e.g. br-ff" ++msgstr "" ++ ++msgid "e.g. br-lan" ++msgstr "" ++ ++msgid "e.g. reject-with tcp-reset" ++msgstr "" ++ ++msgid "max. 16 chars" ++msgstr "" ++ ++msgid "reduces rrd size" ++msgstr "" ++ ++msgid "seconds; multiple separated by space" ++msgstr "" ++ ++msgid "server interfaces" ++msgstr "" +diff --git a/feeds/luci/applications/luci-app-statistics/po/uk/rrdtool.po b/feeds/luci/applications/luci-app-statistics/po/uk/rrdtool.po +new file mode 100644 +index 0000000..5a535f1 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-statistics/po/uk/rrdtool.po +@@ -0,0 +1,357 @@ ++# rrdtool.pot ++# generated from ./applications/luci-statistics/luasrc/i18n/rrdtool.en.lua ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Last-Translator: Automatically generated\n" ++"Language-Team: none\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n" ++"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" ++ ++#. %H: Wireless - Signal Noise Ratio ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:1 ++msgid "stat_dg_title_wireless__signal_noise" ++msgstr "" ++ ++#. dBm ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:2 ++msgid "stat_dg_label_wireless__signal_noise" ++msgstr "" ++ ++#. Noise Level ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:3 ++msgid "stat_ds_signal_noise" ++msgstr "" ++ ++#. Signal Strength ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:4 ++msgid "stat_ds_signal_power" ++msgstr "" ++ ++#. %H: Wireless - Signal Quality ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:5 ++msgid "stat_dg_title_wireless__signal_quality" ++msgstr "" ++ ++#. n ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:6 ++msgid "stat_dg_label_wireless__signal_quality" ++msgstr "" ++ ++#. Signal Quality ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:7 ++msgid "stat_ds_signal_quality" ++msgstr "" ++ ++#. %H: ICMP Roundtrip Times ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:8 ++msgid "stat_dg_title_ping" ++msgstr "" ++ ++#. ms ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:9 ++msgid "stat_dg_label_ping" ++msgstr "" ++ ++#. %di ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:10 ++msgid "stat_ds_ping" ++msgstr "" ++ ++#. %H: Firewall - Processed Packets ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:11 ++msgid "stat_dg_title_iptables__ipt_packets" ++msgstr "" ++ ++#. Packets/s ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:12 ++msgid "stat_dg_label_iptables__ipt_packets" ++msgstr "" ++ ++#. Chain \"%di\" ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:13 ++msgid "stat_ds_ipt_packets" ++msgstr "" ++ ++#. %H: Netlink - Transfer on %pi ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:14 ++msgid "stat_dg_title_netlink__if_octets" ++msgstr "" ++ ++#. Bytes/s ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:15 ++msgid "stat_dg_label_netlink__if_octets" ++msgstr "" ++ ++#. Bytes (%ds) ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:16 ++msgid "stat_ds_if_octets" ++msgstr "" ++ ++#. %H: Netlink - Packets on %pi ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:17 ++msgid "stat_dg_title_netlink__if_packets" ++msgstr "" ++ ++#. Packets/s ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:18 ++msgid "stat_dg_label_netlink__if_packets" ++msgstr "" ++ ++#. Processed (%ds) ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:19 ++msgid "stat_ds_if_packets" ++msgstr "" ++ ++#. Dropped (%ds) ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:20 ++msgid "stat_ds_if_dropped" ++msgstr "" ++ ++#. Errors (%ds) ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:21 ++msgid "stat_ds_if_errors" ++msgstr "" ++ ++#. %H: Netlink - Multicast on %pi ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:22 ++msgid "stat_dg_title_netlink__if_multicast" ++msgstr "" ++ ++#. Packets/s ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:23 ++msgid "stat_dg_label_netlink__if_multicast" ++msgstr "" ++ ++#. Packets ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:24 ++msgid "stat_ds_if_multicast" ++msgstr "" ++ ++#. %H: Netlink - Collisions on %pi ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:25 ++msgid "stat_dg_title_netlink__if_collisions" ++msgstr "" ++ ++#. Collisions/s ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:26 ++msgid "stat_dg_label_netlink__if_collisions" ++msgstr "" ++ ++#. Collisions ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:27 ++msgid "stat_ds_if_collisions" ++msgstr "" ++ ++#. %H: Netlink - Errors on %pi ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:28 ++msgid "stat_dg_title_netlink__if_tx_errors" ++msgstr "" ++ ++#. Errors/s ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:29 ++msgid "stat_dg_label_netlink__if_tx_errors" ++msgstr "" ++ ++#. %di ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:30 ++msgid "stat_ds_if_tx_errors" ++msgstr "" ++ ++#. %di ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:31 ++msgid "stat_ds_if_rx_errors" ++msgstr "" ++ ++#. %H: Processes ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:32 ++msgid "stat_dg_title_processes" ++msgstr "" ++ ++#. Processes/s ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:33 ++msgid "stat_dg_label_processes" ++msgstr "" ++ ++#. %di ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:34 ++msgid "stat_ds_ps_state" ++msgstr "" ++ ++#. %H: Process %pi - used cpu time ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:35 ++msgid "stat_dg_title_processes__ps_cputime" ++msgstr "" ++ ++#. Jiffies ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:36 ++msgid "stat_dg_label_processes__ps_cputime" ++msgstr "" ++ ++#. system ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:37 ++msgid "stat_ds_ps_cputime__syst" ++msgstr "" ++ ++#. user ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:38 ++msgid "stat_ds_ps_cputime__user" ++msgstr "" ++ ++#. %H: Process %pi - threads and processes ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:39 ++msgid "stat_dg_title_processes__ps_count" ++msgstr "" ++ ++#. Count ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:40 ++msgid "stat_dg_label_processes__ps_count" ++msgstr "" ++ ++#. %ds ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:41 ++msgid "stat_ds_ps_count" ++msgstr "" ++ ++#. %H: Process %pi - page faults ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:42 ++msgid "stat_dg_title_processes__ps_pagefaults" ++msgstr "" ++ ++#. Pagefaults ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:43 ++msgid "stat_dg_label_processes__ps_pagefaults" ++msgstr "" ++ ++#. page faults ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:44 ++msgid "stat_ds_ps_pagefaults" ++msgstr "" ++ ++#. %H: Process %pi - virtual memory size ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:45 ++msgid "stat_dg_title_processes__ps_rss" ++msgstr "" ++ ++#. Bytes ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:46 ++msgid "stat_dg_label_processes__ps_rss" ++msgstr "" ++ ++#. virtual memory ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:47 ++msgid "stat_ds_ps_rss" ++msgstr "" ++ ++#. %H: Usage on Processor #%pi ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:48 ++msgid "stat_dg_title_cpu" ++msgstr "" ++ ++#. % ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:49 ++msgid "stat_dg_label_cpu" ++msgstr "" ++ ++#. %di ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:50 ++msgid "stat_ds_cpu" ++msgstr "" ++ ++#. %H: Transfer on %di ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:51 ++msgid "stat_dg_title_interface__if_octets" ++msgstr "" ++ ++#. Bytes/s ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:52 ++msgid "stat_dg_label_interface__if_octets" ++msgstr "" ++ ++#. %H: Packets on %di ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:53 ++msgid "stat_dg_title_interface__if_packets" ++msgstr "" ++ ++#. Packets/s ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:54 ++msgid "stat_dg_label_interface__if_packets" ++msgstr "" ++ ++#. %H: TCP-Connections to Port %pi ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:55 ++msgid "stat_dg_title_tcpconns" ++msgstr "" ++ ++#. Connections/s ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:56 ++msgid "stat_dg_label_tcpconns" ++msgstr "" ++ ++#. %di ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:57 ++msgid "stat_ds_tcp_connections" ++msgstr "" ++ ++#. %H: Disk Space Usage on %di ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:58 ++msgid "stat_dg_title_df" ++msgstr "" ++ ++#. Bytes ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:59 ++msgid "stat_dg_label_df" ++msgstr "" ++ ++#. %ds ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:60 ++msgid "stat_ds_df__free" ++msgstr "" ++ ++#. %ds ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:61 ++msgid "stat_ds_df__used" ++msgstr "" ++ ++#. %H: Interrupts ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:62 ++msgid "stat_dg_title_irq" ++msgstr "" ++ ++#. Issues/s ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:63 ++msgid "stat_dg_label_irq" ++msgstr "" ++ ++#. IRQ %di ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:64 ++msgid "stat_ds_irq" ++msgstr "" ++ ++#. %H: System Load ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:65 ++msgid "stat_dg_title_load" ++msgstr "" ++ ++#. Load ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:66 ++msgid "stat_dg_label_load" ++msgstr "" ++ ++#. 1 min ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:67 ++msgid "stat_ds_load__shortterm" ++msgstr "" ++ ++#. 5 min ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:68 ++msgid "stat_ds_load__midterm" ++msgstr "" ++ ++#. 15 min ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:69 ++msgid "stat_ds_load__longterm" ++msgstr "" +diff --git a/feeds/luci/applications/luci-app-statistics/po/uk/statistics.po b/feeds/luci/applications/luci-app-statistics/po/uk/statistics.po +new file mode 100644 +index 0000000..88b2337 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-statistics/po/uk/statistics.po +@@ -0,0 +1,619 @@ ++# statistics.pot ++# generated from ./applications/luci-statistics/luasrc/i18n/statistics.en.lua ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"PO-Revision-Date: 2013-03-12 23:50+0200\n" ++"Last-Translator: zubr_139 \n" ++"Language-Team: none\n" ++"Language: uk\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%" ++"10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "Action (target)" ++msgstr "" ++ ++msgid "Add command for reading values" ++msgstr "" ++ ++msgid "Add matching rule" ++msgstr "" ++ ++msgid "Add multiple hosts separated by space." ++msgstr "" ++ ++msgid "Add notification command" ++msgstr "" ++ ++msgid "Base Directory" ++msgstr "" ++ ++msgid "Basic monitoring" ++msgstr "" ++ ++msgid "CPU Plugin Configuration" ++msgstr "" ++ ++msgid "CSV Output" ++msgstr "" ++ ++msgid "CSV Plugin Configuration" ++msgstr "" ++ ++msgid "Cache collected data for" ++msgstr "" ++ ++msgid "Cache flush interval" ++msgstr "" ++ ++msgid "Chain" ++msgstr "" ++ ++msgid "CollectLinks" ++msgstr "" ++ ++msgid "CollectRoutes" ++msgstr "" ++ ++msgid "CollectTopology" ++msgstr "" ++ ++msgid "Collectd" ++msgstr "" ++ ++msgid "Collectd Settings" ++msgstr "" ++ ++msgid "" ++"Collectd is a small daemon for collecting data from various sources through " ++"different plugins. On this page you can change general settings for the " ++"collectd daemon." ++msgstr "" ++ ++msgid "Conntrack" ++msgstr "" ++ ++msgid "Conntrack Plugin Configuration" ++msgstr "" ++ ++msgid "DF Plugin Configuration" ++msgstr "" ++ ++msgid "DNS" ++msgstr "DNS" ++ ++msgid "DNS Plugin Configuration" ++msgstr "" ++ ++msgid "Data collection interval" ++msgstr "" ++ ++msgid "Datasets definition file" ++msgstr "" ++ ++msgid "Destination ip range" ++msgstr "" ++ ++msgid "Directory for collectd plugins" ++msgstr "" ++ ++msgid "Directory for sub-configurations" ++msgstr "" ++ ++msgid "Disk Plugin Configuration" ++msgstr "" ++ ++msgid "Disk Space Usage" ++msgstr "" ++ ++msgid "Disk Usage" ++msgstr "" ++ ++msgid "Display Host »" ++msgstr "" ++ ++msgid "Display timespan »" ++msgstr "" ++ ++msgid "E-Mail Plugin Configuration" ++msgstr "" ++ ++msgid "Email" ++msgstr "" ++ ++msgid "Enable this plugin" ++msgstr "" ++ ++msgid "Exec" ++msgstr "" ++ ++msgid "Exec Plugin Configuration" ++msgstr "" ++ ++msgid "Filter class monitoring" ++msgstr "" ++ ++msgid "Firewall" ++msgstr "" ++ ++msgid "Flush cache after" ++msgstr "" ++ ++msgid "Forwarding between listen and server addresses" ++msgstr "" ++ ++msgid "Graphs" ++msgstr "" ++ ++msgid "Group" ++msgstr "" ++ ++msgid "" ++"Here you can define external commands which will be started by collectd in " ++"order to read certain values. The values will be read from stdout." ++msgstr "" ++ ++msgid "" ++"Here you can define external commands which will be started by collectd when " ++"certain threshold values have been reached. The values leading to invokation " ++"will be feeded to the the called programs stdin." ++msgstr "" ++ ++msgid "" ++"Here you can define various criteria by which the monitored iptables rules " ++"are selected." ++msgstr "" ++ ++msgid "Host" ++msgstr "" ++ ++msgid "Hostname" ++msgstr "" ++ ++msgid "IP or hostname where to get the txtinfo output from" ++msgstr "" ++ ++msgid "IRQ Plugin Configuration" ++msgstr "" ++ ++msgid "Ignore source addresses" ++msgstr "" ++ ++msgid "Incoming interface" ++msgstr "" ++ ++msgid "Interface Plugin Configuration" ++msgstr "" ++ ++msgid "Interfaces" ++msgstr "ІнтерфейÑи" ++ ++msgid "Interrupts" ++msgstr "" ++ ++msgid "Interval for pings" ++msgstr "" ++ ++msgid "Iptables Plugin Configuration" ++msgstr "" ++ ++msgid "Leave unselected to automatically determine interfaces to monitor." ++msgstr "" ++ ++msgid "Listen host" ++msgstr "" ++ ++msgid "Listen port" ++msgstr "" ++ ++msgid "Listener interfaces" ++msgstr "" ++ ++msgid "Load Plugin Configuration" ++msgstr "" ++ ++msgid "Maximum allowed connections" ++msgstr "" ++ ++msgid "Memory" ++msgstr "" ++ ++msgid "Memory Plugin Configuration" ++msgstr "" ++ ++msgid "Monitor all except specified" ++msgstr "" ++ ++msgid "Monitor all local listen ports" ++msgstr "" ++ ++msgid "Monitor devices" ++msgstr "" ++ ++msgid "Monitor disks and partitions" ++msgstr "" ++ ++msgid "Monitor filesystem types" ++msgstr "" ++ ++msgid "Monitor hosts" ++msgstr "" ++ ++msgid "Monitor interfaces" ++msgstr "" ++ ++msgid "Monitor interrupts" ++msgstr "" ++ ++msgid "Monitor local ports" ++msgstr "" ++ ++msgid "Monitor mount points" ++msgstr "" ++ ++msgid "Monitor processes" ++msgstr "" ++ ++msgid "Monitor remote ports" ++msgstr "" ++ ++msgid "Name of the rule" ++msgstr "" ++ ++msgid "Netlink" ++msgstr "" ++ ++msgid "Netlink Plugin Configuration" ++msgstr "" ++ ++msgid "Network" ++msgstr "Мережа" ++ ++msgid "Network Plugin Configuration" ++msgstr "" ++ ++msgid "Network plugins" ++msgstr "" ++ ++msgid "Network protocol" ++msgstr "Мережевий протокол" ++ ++msgid "Number of threads for data collection" ++msgstr "" ++ ++msgid "OLSRd" ++msgstr "" ++ ++msgid "OLSRd Plugin Configuration" ++msgstr "" ++ ++msgid "Only create average RRAs" ++msgstr "" ++ ++msgid "Options" ++msgstr "" ++ ++msgid "Outgoing interface" ++msgstr "" ++ ++msgid "Output plugins" ++msgstr "" ++ ++msgid "Ping" ++msgstr "" ++ ++msgid "Ping Plugin Configuration" ++msgstr "" ++ ++msgid "Port" ++msgstr "" ++ ++msgid "Processes" ++msgstr "" ++ ++msgid "Processes Plugin Configuration" ++msgstr "" ++ ++msgid "Processes to monitor separated by space" ++msgstr "" ++ ++msgid "Processor" ++msgstr "" ++ ++msgid "Qdisc monitoring" ++msgstr "" ++ ++msgid "RRD XFiles Factor" ++msgstr "" ++ ++msgid "RRD heart beat interval" ++msgstr "" ++ ++msgid "RRD step interval" ++msgstr "" ++ ++msgid "RRDTool" ++msgstr "" ++ ++msgid "RRDTool Plugin Configuration" ++msgstr "" ++ ++msgid "Rows per RRA" ++msgstr "" ++ ++msgid "Script" ++msgstr "" ++ ++msgid "Seconds" ++msgstr "" ++ ++msgid "Server host" ++msgstr "" ++ ++msgid "Server port" ++msgstr "" ++ ++msgid "Shaping class monitoring" ++msgstr "" ++ ++msgid "Socket file" ++msgstr "" ++ ++msgid "Socket group" ++msgstr "" ++ ++msgid "Socket permissions" ++msgstr "" ++ ++msgid "Source ip range" ++msgstr "" ++ ++msgid "Specifies what information to collect about links." ++msgstr "" ++ ++msgid "Specifies what information to collect about routes." ++msgstr "" ++ ++msgid "Specifies what information to collect about the global topology." ++msgstr "" ++ ++msgid "Splash Leases" ++msgstr "" ++ ++msgid "Splash Leases Plugin Configuration" ++msgstr "" ++ ++msgid "Statistics" ++msgstr "" ++ ++msgid "Storage directory" ++msgstr "" ++ ++msgid "Storage directory for the csv files" ++msgstr "" ++ ++msgid "Store data values as rates instead of absolute values" ++msgstr "" ++ ++msgid "Stored timespans" ++msgstr "" ++ ++msgid "System Load" ++msgstr "" ++ ++msgid "System plugins" ++msgstr "" ++ ++msgid "TCP Connections" ++msgstr "" ++ ++msgid "TCPConns Plugin Configuration" ++msgstr "" ++ ++msgid "TTL for network packets" ++msgstr "" ++ ++msgid "TTL for ping packets" ++msgstr "" ++ ++msgid "Table" ++msgstr "" ++ ++msgid "The NUT plugin reads information about Uninterruptible Power Supplies." ++msgstr "" ++ ++msgid "" ++"The OLSRd plugin reads information about meshed networks from the txtinfo " ++"plugin of OLSRd." ++msgstr "" ++ ++msgid "" ++"The conntrack plugin collects statistics about the number of tracked " ++"connections." ++msgstr "" ++ ++msgid "The cpu plugin collects basic statistics about the processor usage." ++msgstr "" ++ ++msgid "" ++"The csv plugin stores collected data in csv file format for further " ++"processing by external programs." ++msgstr "" ++ ++msgid "" ++"The df plugin collects statistics about the disk space usage on different " ++"devices, mount points or filesystem types." ++msgstr "" ++ ++msgid "" ++"The disk plugin collects detailled usage statistics for selected partitions " ++"or whole disks." ++msgstr "" ++ ++msgid "" ++"The dns plugin collects detailled statistics about dns related traffic on " ++"selected interfaces." ++msgstr "" ++ ++msgid "" ++"The email plugin creates a unix socket which can be used to transmit email-" ++"statistics to a running collectd daemon. This plugin is primarily intended " ++"to be used in conjunction with Mail::SpamAssasin::Plugin::Collectd but can " ++"be used in other ways as well." ++msgstr "" ++ ++msgid "" ++"The exec plugin starts external commands to read values from or to notify " ++"external processes when certain threshold values have been reached." ++msgstr "" ++ ++msgid "" ++"The interface plugin collects traffic statistics on selected interfaces." ++msgstr "" ++ ++msgid "" ++"The iptables plugin will monitor selected firewall rules and collect " ++"informations about processed bytes and packets per rule." ++msgstr "" ++ ++msgid "" ++"The irq plugin will monitor the rate of issues per second for each selected " ++"interrupt. If no interrupt is selected then all interrupts are monitored." ++msgstr "" ++ ++msgid "" ++"The iwinfo plugin collects statistics about wireless signal strength, noise " ++"and quality." ++msgstr "" ++ ++msgid "The load plugin collects statistics about the general system load." ++msgstr "" ++ ++msgid "The memory plugin collects statistics about the memory usage." ++msgstr "" ++ ++msgid "" ++"The netlink plugin collects extended informations like qdisc-, class- and " ++"filter-statistics for selected interfaces." ++msgstr "" ++ ++msgid "" ++"The network plugin provides network based communication between different " ++"collectd instances. Collectd can operate both in client and server mode. In " ++"client mode locally collected data is transferred to a collectd server " ++"instance, in server mode the local instance receives data from other hosts." ++msgstr "" ++ ++msgid "" ++"The ping plugin will send icmp echo replies to selected hosts and measure " ++"the roundtrip time for each host." ++msgstr "" ++ ++msgid "" ++"The processes plugin collects informations like cpu time, page faults and " ++"memory usage of selected processes." ++msgstr "" ++ ++msgid "" ++"The rrdtool plugin stores the collected data in rrd database files, the " ++"foundation of the diagrams.

    Warning: Setting the wrong " ++"values will result in a very high memory consumption in the temporary " ++"directory. This can render the device unusable!" ++msgstr "" ++ ++msgid "" ++"The splash leases plugin uses libuci to collect statistics about splash " ++"leases." ++msgstr "" ++ ++msgid "" ++"The statistics package is based on Collectd and uses RRD " ++"Tool to render diagram images from collected data." ++msgstr "" ++ ++msgid "" ++"The tcpconns plugin collects informations about open tcp connections on " ++"selected ports." ++msgstr "" ++ ++msgid "" ++"The unixsock plugin creates a unix socket which can be used to read " ++"collected data from a running collectd instance." ++msgstr "" ++ ++msgid "The uptime plugin collects statistics about the uptime of the system." ++msgstr "" ++ ++msgid "" ++"This section defines on which interfaces collectd will wait for incoming " ++"connections." ++msgstr "" ++ ++msgid "" ++"This section defines to which servers the locally collected data is sent to." ++msgstr "" ++ ++msgid "Try to lookup fully qualified hostname" ++msgstr "" ++ ++msgid "UPS" ++msgstr "" ++ ++msgid "UPS Plugin Configuration" ++msgstr "" ++ ++msgid "UPS name in NUT ups@host format" ++msgstr "" ++ ++msgid "UnixSock" ++msgstr "" ++ ++msgid "Unixsock Plugin Configuration" ++msgstr "" ++ ++msgid "Uptime" ++msgstr "" ++ ++msgid "Uptime Plugin Configuration" ++msgstr "" ++ ++msgid "Used PID file" ++msgstr "" ++ ++msgid "User" ++msgstr "КориÑтувач" ++ ++msgid "Verbose monitoring" ++msgstr "" ++ ++msgid "Wireless" ++msgstr "" ++ ++msgid "Wireless iwinfo Plugin Configuration" ++msgstr "" ++ ++msgid "e.g. br-ff" ++msgstr "" ++ ++msgid "e.g. br-lan" ++msgstr "" ++ ++msgid "e.g. reject-with tcp-reset" ++msgstr "" ++ ++msgid "max. 16 chars" ++msgstr "" ++ ++msgid "reduces rrd size" ++msgstr "" ++ ++msgid "seconds; multiple separated by space" ++msgstr "" ++ ++msgid "server interfaces" ++msgstr "" +diff --git a/feeds/luci/applications/luci-app-statistics/po/vi/rrdtool.po b/feeds/luci/applications/luci-app-statistics/po/vi/rrdtool.po +new file mode 100644 +index 0000000..ca94cf8 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-statistics/po/vi/rrdtool.po +@@ -0,0 +1,524 @@ ++# rrdtool.pot ++# generated from ./applications/luci-statistics/luasrc/i18n/rrdtool.en.lua ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Report-Msgid-Bugs-To: \n" ++"POT-Creation-Date: 2009-08-16 06:59+0200\n" ++"PO-Revision-Date: 2009-08-13 14:45+0200\n" ++"Last-Translator: Hong Phuc Dang \n" ++"Language-Team: LANGUAGE \n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"X-Generator: Pootle 1.1.0\n" ++ ++#. %H: Wireless - Signal Noise Ratio ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:1 ++msgid "stat_dg_title_wireless__signal_noise" ++msgstr "" ++ ++#. dBm ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:2 ++msgid "stat_dg_label_wireless__signal_noise" ++msgstr "" ++ ++#. Noise Level ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:3 ++msgid "stat_ds_signal_noise" ++msgstr "" ++ ++#. Signal Strength ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:4 ++msgid "stat_ds_signal_power" ++msgstr "" ++ ++#. %H: Wireless - Signal Quality ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:5 ++msgid "stat_dg_title_wireless__signal_quality" ++msgstr "" ++ ++#. n ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:6 ++msgid "stat_dg_label_wireless__signal_quality" ++msgstr "" ++ ++#. Signal Quality ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:7 ++msgid "stat_ds_signal_quality" ++msgstr "" ++ ++#. %H: ICMP Roundtrip Times ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:8 ++msgid "stat_dg_title_ping" ++msgstr "" ++ ++#. ms ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:9 ++msgid "stat_dg_label_ping" ++msgstr "" ++ ++#. %di ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:10 ++msgid "stat_ds_ping" ++msgstr "" ++ ++#. %H: Firewall - Processed Packets ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:11 ++msgid "stat_dg_title_iptables__ipt_packets" ++msgstr "" ++ ++#. Packets/s ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:12 ++msgid "stat_dg_label_iptables__ipt_packets" ++msgstr "" ++ ++#. Chain \"%di\" ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:13 ++msgid "stat_ds_ipt_packets" ++msgstr "" ++ ++#. %H: Netlink - Transfer on %pi ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:14 ++msgid "stat_dg_title_netlink__if_octets" ++msgstr "" ++ ++#. Bytes/s ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:15 ++msgid "stat_dg_label_netlink__if_octets" ++msgstr "" ++ ++#. Bytes (%ds) ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:16 ++msgid "stat_ds_if_octets" ++msgstr "" ++ ++#. %H: Netlink - Packets on %pi ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:17 ++msgid "stat_dg_title_netlink__if_packets" ++msgstr "" ++ ++#. Packets/s ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:18 ++msgid "stat_dg_label_netlink__if_packets" ++msgstr "" ++ ++#. Processed (%ds) ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:19 ++msgid "stat_ds_if_packets" ++msgstr "" ++ ++#. Dropped (%ds) ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:20 ++msgid "stat_ds_if_dropped" ++msgstr "" ++ ++#. Errors (%ds) ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:21 ++msgid "stat_ds_if_errors" ++msgstr "" ++ ++#. %H: Netlink - Multicast on %pi ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:22 ++msgid "stat_dg_title_netlink__if_multicast" ++msgstr "" ++ ++#. Packets/s ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:23 ++msgid "stat_dg_label_netlink__if_multicast" ++msgstr "" ++ ++#. Packets ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:24 ++msgid "stat_ds_if_multicast" ++msgstr "" ++ ++#. %H: Netlink - Collisions on %pi ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:25 ++msgid "stat_dg_title_netlink__if_collisions" ++msgstr "" ++ ++#. Collisions/s ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:26 ++msgid "stat_dg_label_netlink__if_collisions" ++msgstr "" ++ ++#. Collisions ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:27 ++msgid "stat_ds_if_collisions" ++msgstr "" ++ ++#. %H: Netlink - Errors on %pi ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:28 ++msgid "stat_dg_title_netlink__if_tx_errors" ++msgstr "" ++ ++#. Errors/s ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:29 ++msgid "stat_dg_label_netlink__if_tx_errors" ++msgstr "" ++ ++#. %di ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:30 ++msgid "stat_ds_if_tx_errors" ++msgstr "" ++ ++#. %di ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:31 ++msgid "stat_ds_if_rx_errors" ++msgstr "" ++ ++#. %H: Processes ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:32 ++msgid "stat_dg_title_processes" ++msgstr "" ++ ++#. Processes/s ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:33 ++msgid "stat_dg_label_processes" ++msgstr "" ++ ++#. %di ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:34 ++msgid "stat_ds_ps_state" ++msgstr "" ++ ++#. %H: Process %pi - used cpu time ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:35 ++msgid "stat_dg_title_processes__ps_cputime" ++msgstr "" ++ ++#. Jiffies ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:36 ++msgid "stat_dg_label_processes__ps_cputime" ++msgstr "" ++ ++#. system ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:37 ++msgid "stat_ds_ps_cputime__syst" ++msgstr "" ++ ++#. user ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:38 ++msgid "stat_ds_ps_cputime__user" ++msgstr "" ++ ++#. %H: Process %pi - threads and processes ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:39 ++msgid "stat_dg_title_processes__ps_count" ++msgstr "" ++ ++#. Count ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:40 ++msgid "stat_dg_label_processes__ps_count" ++msgstr "" ++ ++#. %ds ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:41 ++msgid "stat_ds_ps_count" ++msgstr "" ++ ++#. %H: Process %pi - page faults ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:42 ++msgid "stat_dg_title_processes__ps_pagefaults" ++msgstr "" ++ ++#. Pagefaults ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:43 ++msgid "stat_dg_label_processes__ps_pagefaults" ++msgstr "" ++ ++#. page faults ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:44 ++msgid "stat_ds_ps_pagefaults" ++msgstr "" ++ ++#. %H: Process %pi - virtual memory size ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:45 ++msgid "stat_dg_title_processes__ps_rss" ++msgstr "" ++ ++#. Bytes ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:46 ++msgid "stat_dg_label_processes__ps_rss" ++msgstr "" ++ ++#. virtual memory ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:47 ++msgid "stat_ds_ps_rss" ++msgstr "" ++ ++#. %H: Usage on Processor #%pi ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:48 ++msgid "stat_dg_title_cpu" ++msgstr "" ++ ++#. % ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:49 ++msgid "stat_dg_label_cpu" ++msgstr "" ++ ++#. %di ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:50 ++msgid "stat_ds_cpu" ++msgstr "" ++ ++#. %H: Transfer on %di ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:51 ++msgid "stat_dg_title_interface__if_octets" ++msgstr "" ++ ++#. Bytes/s ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:52 ++msgid "stat_dg_label_interface__if_octets" ++msgstr "" ++ ++#. %H: Packets on %di ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:53 ++msgid "stat_dg_title_interface__if_packets" ++msgstr "" ++ ++#. Packets/s ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:54 ++msgid "stat_dg_label_interface__if_packets" ++msgstr "" ++ ++#. %H: TCP-Connections to Port %pi ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:55 ++msgid "stat_dg_title_tcpconns" ++msgstr "" ++ ++#. Connections/s ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:56 ++msgid "stat_dg_label_tcpconns" ++msgstr "" ++ ++#. %di ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:57 ++msgid "stat_ds_tcp_connections" ++msgstr "" ++ ++#. %H: Disk Space Usage on %di ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:58 ++msgid "stat_dg_title_df" ++msgstr "" ++ ++#. Bytes ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:59 ++msgid "stat_dg_label_df" ++msgstr "" ++ ++#. %ds ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:60 ++msgid "stat_ds_df__free" ++msgstr "" ++ ++#. %ds ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:61 ++msgid "stat_ds_df__used" ++msgstr "" ++ ++#. %H: Interrupts ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:62 ++msgid "stat_dg_title_irq" ++msgstr "" ++ ++#. Issues/s ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:63 ++msgid "stat_dg_label_irq" ++msgstr "" ++ ++#. IRQ %di ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:64 ++msgid "stat_ds_irq" ++msgstr "" ++ ++#. %H: System Load ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:65 ++msgid "stat_dg_title_load" ++msgstr "" ++ ++#. Load ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:66 ++msgid "stat_dg_label_load" ++msgstr "" ++ ++#. 1 min ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:67 ++msgid "stat_ds_load__shortterm" ++msgstr "" ++ ++#. 5 min ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:68 ++msgid "stat_ds_load__midterm" ++msgstr "" ++ ++#. 15 min ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:69 ++msgid "stat_ds_load__longterm" ++msgstr "" ++ ++#~ msgid "%H: Wireless - Signal Noise Ratio" ++#~ msgstr "%H: Wireless - Signal Noise Ratio" ++ ++#~ msgid "dBm" ++#~ msgstr "dBm" ++ ++#~ msgid "Noise Level" ++#~ msgstr "Noise Level" ++ ++#~ msgid "Signal Strength" ++#~ msgstr "Äá»™ mạnh của tín hiệu" ++ ++#~ msgid "%H: Wireless - Signal Quality" ++#~ msgstr "%H: Wireless -Chất lượng tín hiệu" ++ ++#~ msgid "n" ++#~ msgstr "n" ++ ++#~ msgid "Signal Quality" ++#~ msgstr "Chất lượng tín hiệu " ++ ++#~ msgid "%H: ICMP Roundtrip Times" ++#~ msgstr "%H: ICMP thá»i gian Ä‘i má»™t vòng" ++ ++#~ msgid "ms" ++#~ msgstr "ms" ++ ++#~ msgid "%H: Firewall - Processed Packets" ++#~ msgstr "%H: Firewall - Gói đã xá»­ lý" ++ ++#~ msgid "Chain \"%di\"" ++#~ msgstr "Chuá»—i \"%di\"" ++ ++#~ msgid "%H: Netlink - Transfer on %pi" ++#~ msgstr "%H: Netlink - chuyển vá» %pi" ++ ++#~ msgid "Bytes (%ds)" ++#~ msgstr "Bytes (%ds)" ++ ++#~ msgid "%H: Netlink - Packets on %pi" ++#~ msgstr "%H: Netlink - Äóng gói trên %pi" ++ ++#~ msgid "Processed (%ds)" ++#~ msgstr "Äã xá»­ lý (%ds)" ++ ++#~ msgid "Dropped (%ds)" ++#~ msgstr "" ++#~ "Dropped \n" ++#~ " \n" ++#~ " \n" ++#~ "(%ds)" ++ ++#~ msgid "Errors (%ds)" ++#~ msgstr "" ++#~ "Lá»—i \n" ++#~ " \n" ++#~ " \n" ++#~ " \n" ++#~ "(%ds)" ++ ++#~ msgid "%H: Netlink - Multicast on %pi" ++#~ msgstr "%H: Netlink - Multicast on %pi" ++ ++#~ msgid "Packets" ++#~ msgstr "Gói" ++ ++#~ msgid "%H: Netlink - Collisions on %pi" ++#~ msgstr "%H: Netlink - Collisions on %pi" ++ ++#~ msgid "Collisions/s" ++#~ msgstr "Collisions/s" ++ ++#~ msgid "Collisions" ++#~ msgstr "Collisions" ++ ++#~ msgid "%H: Netlink - Errors on %pi" ++#~ msgstr "%H: Netlink - lá»—i trên %pi" ++ ++#~ msgid "Errors/s" ++#~ msgstr "Lá»—i" ++ ++#~ msgid "%H: Processes" ++#~ msgstr "%H: Quá trình" ++ ++#~ msgid "Processes/s" ++#~ msgstr "Quy trình" ++ ++#~ msgid "%H: Process %pi - used cpu time" ++#~ msgstr "%H: Quá trình %pi - thá»i gian cpu đã sá»­ dụng" ++ ++#~ msgid "Jiffies" ++#~ msgstr "Jiffies" ++ ++#~ msgid "System" ++#~ msgstr "Hệ thống" ++ ++#~ msgid "user" ++#~ msgstr "NgÆ°á»i dùng" ++ ++#~ msgid "%H: Process %pi - threads and processes" ++#~ msgstr "%H: quá trình %pi - các luồng và quá trình" ++ ++#~ msgid "Count" ++#~ msgstr "Äếm" ++ ++#~ msgid "%H: Process %pi - page faults" ++#~ msgstr "%H: quá trình %pi - lá»—i trang" ++ ++#~ msgid "Pagefaults" ++#~ msgstr "Pagefaults" ++ ++#~ msgid "page faults" ++#~ msgstr "page faults" ++ ++#~ msgid "%H: Process %pi - virtual memory size" ++#~ msgstr "%H: quá trình %pi - dung lượng bá»™ nhá»› ảo " ++ ++#~ msgid "virtual memory" ++#~ msgstr "Bá»™ nhá»› ảo" ++ ++#~ msgid "%H: Usage on Processor #%pi" ++#~ msgstr "%H: sá»­ dụng trên bá»™ xá»­ lý #%pi" ++ ++#~ msgid "%" ++#~ msgstr "%" ++ ++#~ msgid "%H: Transfer on %di" ++#~ msgstr "%H: Chuyển tải trên %di" ++ ++#~ msgid "%H: Packets on %di" ++#~ msgstr "%H: Gói trên %di" ++ ++#~ msgid "%H: TCP-Connections to Port %pi" ++#~ msgstr "%H: TCP-kết nối tá»›i cổng %pi" ++ ++#~ msgid "Connections/s" ++#~ msgstr "Kết nối" ++ ++#~ msgid "%H: Disk Space Usage on %di" ++#~ msgstr "%H: sá»­ dụng không gian trên Ä‘Ä©a ở %di" ++ ++#~ msgid "%H: Interrupts" ++#~ msgstr "%H: Cắt ngang" ++ ++#~ msgid "Issues/s" ++#~ msgstr "Vấn Ä‘á»" ++ ++#~ msgid "IRQ %di" ++#~ msgstr "IRQ %di" ++ ++#~ msgid "%H: System Load" ++#~ msgstr "%H: Tải hệ thống" ++ ++#~ msgid "Load" ++#~ msgstr "Tải" ++ ++#~ msgid "1 min" ++#~ msgstr "1 phút" ++ ++#~ msgid "5 min" ++#~ msgstr "5 phút" ++ ++#~ msgid "15 min" ++#~ msgstr "15 phút" +diff --git a/feeds/luci/applications/luci-app-statistics/po/vi/statistics.po b/feeds/luci/applications/luci-app-statistics/po/vi/statistics.po +new file mode 100644 +index 0000000..02e06fb +--- /dev/null ++++ b/feeds/luci/applications/luci-app-statistics/po/vi/statistics.po +@@ -0,0 +1,685 @@ ++# statistics.pot ++# generated from ./applications/luci-statistics/luasrc/i18n/statistics.en.lua ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Report-Msgid-Bugs-To: \n" ++"POT-Creation-Date: 2009-08-16 06:58+0200\n" ++"PO-Revision-Date: 2009-08-16 05:50+0200\n" ++"Last-Translator: Hong Phuc Dang \n" ++"Language-Team: LANGUAGE \n" ++"Language: \n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"X-Generator: Pootle 1.1.0\n" ++ ++msgid "Action (target)" ++msgstr "Action (target)" ++ ++msgid "Add command for reading values" ++msgstr "Thêm lệnh cho giá trị Ä‘ang Ä‘á»c" ++ ++msgid "Add matching rule" ++msgstr "Thêm matching rule" ++ ++msgid "Add multiple hosts separated by space." ++msgstr "" ++ ++msgid "Add notification command" ++msgstr "Thêm lệnh thông báo" ++ ++msgid "Base Directory" ++msgstr "ThÆ° mục CÆ¡ sở" ++ ++msgid "Basic monitoring" ++msgstr "Monitoring căn bản" ++ ++msgid "CPU Plugin Configuration" ++msgstr "Cấu hình Plugin CPU" ++ ++msgid "CSV Output" ++msgstr "CSV Output" ++ ++msgid "CSV Plugin Configuration" ++msgstr "Cấu hình CSV plugin" ++ ++msgid "Cache collected data for" ++msgstr "Cache collected data cho" ++ ++msgid "Cache flush interval" ++msgstr "Cache flush interval" ++ ++msgid "Chain" ++msgstr "Chain" ++ ++msgid "CollectLinks" ++msgstr "" ++ ++msgid "CollectRoutes" ++msgstr "" ++ ++msgid "CollectTopology" ++msgstr "" ++ ++msgid "Collectd" ++msgstr "Collectd" ++ ++msgid "Collectd Settings" ++msgstr "Những cài đặt collectd" ++ ++msgid "" ++"Collectd is a small daemon for collecting data from various sources through " ++"different plugins. On this page you can change general settings for the " ++"collectd daemon." ++msgstr "" ++"Collectd là má»™t daemon nhỠđể thu thập dữ liệu từ nhiá»u nguồn thông qua các " ++"plugins khác nhau. Trên trang này, bạn có thể thay đổi cài đặt tổng quát cho " ++"cai collectd daemon. " ++ ++msgid "Conntrack" ++msgstr "" ++ ++msgid "Conntrack Plugin Configuration" ++msgstr "" ++ ++msgid "DF Plugin Configuration" ++msgstr "Cấu hình DF plugin" ++ ++msgid "DNS" ++msgstr "DNS" ++ ++msgid "DNS Plugin Configuration" ++msgstr "Cấu hình DNS plugin" ++ ++msgid "Data collection interval" ++msgstr "Khoảng thu thập dữ liệu" ++ ++msgid "Datasets definition file" ++msgstr "Tập tin định nghÄ©a cÆ¡ sở dữ liệu" ++ ++msgid "Destination ip range" ++msgstr "Äiểm đến ip range" ++ ++msgid "Directory for collectd plugins" ++msgstr "Danh mục cho collectd plugins" ++ ++msgid "Directory for sub-configurations" ++msgstr "Danh mục cho sub-configurations" ++ ++msgid "Disk Plugin Configuration" ++msgstr "Cấu hình disk plugin" ++ ++msgid "Disk Space Usage" ++msgstr "Khoảng trống trên Ä‘Ä©a" ++ ++msgid "Disk Usage" ++msgstr "Disk Usage" ++ ++msgid "Display Host »" ++msgstr "" ++ ++msgid "Display timespan »" ++msgstr "Display timespan" ++ ++msgid "E-Mail Plugin Configuration" ++msgstr "Cấu hình e-mail plugin" ++ ++msgid "Email" ++msgstr "Email" ++ ++msgid "Enable this plugin" ++msgstr "Kích hoạt plugin này" ++ ++msgid "Exec" ++msgstr "Exec" ++ ++msgid "Exec Plugin Configuration" ++msgstr "Cấu hình Exec Plugin" ++ ++msgid "Filter class monitoring" ++msgstr "Filter class monitoring" ++ ++msgid "Firewall" ++msgstr "Firewall" ++ ++msgid "Flush cache after" ++msgstr "Flush cache sau khi" ++ ++msgid "Forwarding between listen and server addresses" ++msgstr "chuyển tiếp giữa listen và địa chỉ server" ++ ++msgid "Graphs" ++msgstr "Graphs" ++ ++msgid "Group" ++msgstr "" ++ ++msgid "" ++"Here you can define external commands which will be started by collectd in " ++"order to read certain values. The values will be read from stdout." ++msgstr "" ++"Ở đây bạn có thể định nghÄ©a các lệnh bên ngoài mà sẽ khởi Ä‘á»™ng bằng collectd " ++"để Ä‘á»c những giá trị nhất định. Những giá trị sẽ được Ä‘á»c từ stdout" ++ ++msgid "" ++"Here you can define external commands which will be started by collectd when " ++"certain threshold values have been reached. The values leading to invokation " ++"will be feeded to the the called programs stdin." ++msgstr "" ++"Ở đây bạn có thể định nghÄ©a các lệnh bên ngoài cái mà bắt đầu bằng collectd " ++"khi những giá trị threshold nhất định được tiếp cận. Những giá trị dẫn tá»›i " ++"invokation sẽ được feed tá»›i má»™t chÆ°Æ¡ng trình gá»i là stdin" ++ ++msgid "" ++"Here you can define various criteria by which the monitored iptables rules " ++"are selected." ++msgstr "" ++"Ở đây bạn có thể định nghÄ©a những tiêu chuẩn khác nhau để monitor iptables " ++"rules được chá»n." ++ ++msgid "Host" ++msgstr "" ++ ++msgid "Hostname" ++msgstr "Tên host" ++ ++msgid "IP or hostname where to get the txtinfo output from" ++msgstr "" ++ ++msgid "IRQ Plugin Configuration" ++msgstr "Cấu hình IRQ Plugin " ++ ++msgid "Ignore source addresses" ++msgstr "Lá» Ä‘i những địa chỉ nguồn" ++ ++msgid "Incoming interface" ++msgstr "Giao diện Ä‘ang tá»›i" ++ ++msgid "Interface Plugin Configuration" ++msgstr "Cấu hình giao diện plugin" ++ ++msgid "Interfaces" ++msgstr "Giao diện" ++ ++msgid "Interrupts" ++msgstr "Cắt ngang" ++ ++msgid "Interval for pings" ++msgstr "" ++ ++msgid "Iptables Plugin Configuration" ++msgstr "cấu hình Iptables Plugin " ++ ++msgid "Leave unselected to automatically determine interfaces to monitor." ++msgstr "" ++ ++msgid "Listen host" ++msgstr "Listen host" ++ ++msgid "Listen port" ++msgstr "Listen port" ++ ++msgid "Listener interfaces" ++msgstr "Giao diện listener" ++ ++msgid "Load Plugin Configuration" ++msgstr "Tải cấu hình plugin" ++ ++msgid "Maximum allowed connections" ++msgstr "Tối đã kết nối cho phép" ++ ++msgid "Memory" ++msgstr "" ++ ++msgid "Memory Plugin Configuration" ++msgstr "" ++ ++msgid "Monitor all except specified" ++msgstr "" ++ ++msgid "Monitor all local listen ports" ++msgstr "Monitor tất cả local listen port" ++ ++msgid "Monitor devices" ++msgstr "Monitor devices" ++ ++msgid "Monitor disks and partitions" ++msgstr "Kiểm soát Ä‘Ä©a và phân vùng" ++ ++msgid "Monitor filesystem types" ++msgstr "Kiểm soát loại filesystem" ++ ++msgid "Monitor hosts" ++msgstr "Monitor hosts" ++ ++msgid "Monitor interfaces" ++msgstr "" ++ ++msgid "Monitor interrupts" ++msgstr "Monitor interrupts" ++ ++msgid "Monitor local ports" ++msgstr "Monitor cổng địa phÆ°Æ¡ng" ++ ++msgid "Monitor mount points" ++msgstr "Monitor mount points" ++ ++msgid "Monitor processes" ++msgstr "Monitor processes" ++ ++msgid "Monitor remote ports" ++msgstr "Monitor remote ports" ++ ++msgid "Name of the rule" ++msgstr "Tên của rule" ++ ++msgid "Netlink" ++msgstr "Netlink" ++ ++msgid "Netlink Plugin Configuration" ++msgstr "Cấu hình Netlink Plugin " ++ ++msgid "Network" ++msgstr "Network" ++ ++msgid "Network Plugin Configuration" ++msgstr "Cấu hình network plugin" ++ ++msgid "Network plugins" ++msgstr "Network plugins" ++ ++msgid "Network protocol" ++msgstr "Network protocol" ++ ++msgid "Number of threads for data collection" ++msgstr "Số lượng các chủ đỠđể thu thập dữ liệu" ++ ++msgid "OLSRd" ++msgstr "" ++ ++msgid "OLSRd Plugin Configuration" ++msgstr "" ++ ++msgid "Only create average RRAs" ++msgstr "Chỉ tạo trung bình RRAs" ++ ++msgid "Options" ++msgstr "Tùy chá»n" ++ ++msgid "Outgoing interface" ++msgstr "Giao diện ra ngoài" ++ ++msgid "Output plugins" ++msgstr "Output plugins" ++ ++msgid "Ping" ++msgstr "Ping" ++ ++msgid "Ping Plugin Configuration" ++msgstr "Cấu hình Ping plugin" ++ ++msgid "Port" ++msgstr "" ++ ++msgid "Processes" ++msgstr "Quá trình xá»­ lý" ++ ++msgid "Processes Plugin Configuration" ++msgstr "Cấu hình processes plugin" ++ ++msgid "Processes to monitor separated by space" ++msgstr "" ++ ++msgid "Processor" ++msgstr "Bá»™ xá»­ lý" ++ ++msgid "Qdisc monitoring" ++msgstr "Qdisc monitoring" ++ ++msgid "RRD XFiles Factor" ++msgstr "Yếu tố RRD XFiles" ++ ++msgid "RRD heart beat interval" ++msgstr "RRD heart beat interval" ++ ++msgid "RRD step interval" ++msgstr "RRD step interval" ++ ++msgid "RRDTool" ++msgstr "RRDTool" ++ ++msgid "RRDTool Plugin Configuration" ++msgstr "Cấu hình RRDTool Plugin " ++ ++msgid "Rows per RRA" ++msgstr "Rows per RRA" ++ ++msgid "Script" ++msgstr "" ++ ++msgid "Seconds" ++msgstr "Giây" ++ ++msgid "Server host" ++msgstr "Server host" ++ ++msgid "Server port" ++msgstr "Server port" ++ ++msgid "Shaping class monitoring" ++msgstr "Shaping class monitoring" ++ ++msgid "Socket file" ++msgstr "" ++ ++msgid "Socket group" ++msgstr "" ++ ++msgid "Socket permissions" ++msgstr "" ++ ++msgid "Source ip range" ++msgstr "Nguồn ip range" ++ ++msgid "Specifies what information to collect about links." ++msgstr "" ++ ++msgid "Specifies what information to collect about routes." ++msgstr "" ++ ++msgid "Specifies what information to collect about the global topology." ++msgstr "" ++ ++msgid "Splash Leases" ++msgstr "" ++ ++msgid "Splash Leases Plugin Configuration" ++msgstr "" ++ ++msgid "Statistics" ++msgstr "" ++ ++msgid "Storage directory" ++msgstr "ThÆ° mục lÆ°u trữ" ++ ++msgid "Storage directory for the csv files" ++msgstr "ThÆ° mục lÆ°u trữ cho nhÆ°ng tập tin csv" ++ ++msgid "Store data values as rates instead of absolute values" ++msgstr "Những giá trị dữ liệu lÆ°u trữ nhÆ° má»™t tỉ lệ thay vì giá trị tuyệt đối" ++ ++msgid "Stored timespans" ++msgstr "LÆ°u timspans" ++ ++msgid "System Load" ++msgstr "System Load" ++ ++msgid "System plugins" ++msgstr "System plugins" ++ ++msgid "TCP Connections" ++msgstr "Kết nối TCP" ++ ++msgid "TCPConns Plugin Configuration" ++msgstr "Cấu hình TCPConns Plugin " ++ ++msgid "TTL for network packets" ++msgstr "TTL cho gói mạng" ++ ++msgid "TTL for ping packets" ++msgstr "TTl cho gói ping" ++ ++msgid "Table" ++msgstr "Table" ++ ++msgid "The NUT plugin reads information about Uninterruptible Power Supplies." ++msgstr "" ++ ++msgid "" ++"The OLSRd plugin reads information about meshed networks from the txtinfo " ++"plugin of OLSRd." ++msgstr "" ++ ++msgid "" ++"The conntrack plugin collects statistics about the number of tracked " ++"connections." ++msgstr "" ++ ++msgid "The cpu plugin collects basic statistics about the processor usage." ++msgstr "CPU plugin thu thập số liệu thống kê cÆ¡ bản vá» sá»­ dụng bá»™ việc xá»­ lý" ++ ++msgid "" ++"The csv plugin stores collected data in csv file format for further " ++"processing by external programs." ++msgstr "" ++"CSV plugin stores thu thập dữ liệu trong tập tin định dạng csv để tiến hành " ++"xá»­ lý bằng các chÆ°Æ¡ng trình bên ngoài." ++ ++msgid "" ++"The df plugin collects statistics about the disk space usage on different " ++"devices, mount points or filesystem types." ++msgstr "" ++"df plugin thu thập số liệu thông kế vá» khoảng trống trên Ä‘Ä©a trên những " ++"thiết bị khác, mount points hoặc những loại filesystem." ++ ++msgid "" ++"The disk plugin collects detailled usage statistics for selected partitions " ++"or whole disks." ++msgstr "" ++"Disk plugin thu thập số liệu thống kê chi tiết vá» cách sá»­ dụng cho những " ++"phân vùng lá»±a chá»n hoặc toàn bá»™ Ä‘Ä©a." ++ ++msgid "" ++"The dns plugin collects detailled statistics about dns related traffic on " ++"selected interfaces." ++msgstr "" ++" dns plugin thu thập những thông kê chi tiết vá» dns liên quan đến lÆ°u thông " ++"trên những giao diện được chá»n. " ++ ++msgid "" ++"The email plugin creates a unix socket which can be used to transmit email-" ++"statistics to a running collectd daemon. This plugin is primarily intended " ++"to be used in conjunction with Mail::SpamAssasin::Plugin::Collectd but can " ++"be used in other ways as well." ++msgstr "" ++"Email plugin tạo ra má»™t unix socket mà có thể dùng để truyá»n thông kê e-mail " ++"tá»›i má»™t collectd daemon Ä‘ang chạy. Cái plugin này chủ yếu được dùng vá»›i " ++"Mail::SpamAssasin::Plugin::Collectd nhÆ°ng cÅ©ng có thể dùng trong những cách " ++"khác." ++ ++msgid "" ++"The exec plugin starts external commands to read values from or to notify " ++"external processes when certain threshold values have been reached." ++msgstr "" ++"Exec plugin bắt đầu những lệnh bên ngoài để Ä‘á»c những giá trị từ hoặc tá»›i " ++"những quá trình xá»­ lý thông báo bên ngoài khi giá trị của má»™t threshold nhất " ++"định được tiếp cận " ++ ++msgid "" ++"The interface plugin collects traffic statistics on selected interfaces." ++msgstr "" ++"Giao diện plugin thu thập những thống kê lÆ°u thông trên những giao diện được " ++"chá»n" ++ ++msgid "" ++"The iptables plugin will monitor selected firewall rules and collect " ++"informations about processed bytes and packets per rule." ++msgstr "" ++"iptables plugin sẽ monitor những cái firewall rules được chá»n và thu thập " ++"thông tin vá» bytes xá»­ lý và gói trên rule. " ++ ++msgid "" ++"The irq plugin will monitor the rate of issues per second for each selected " ++"interrupt. If no interrupt is selected then all interrupts are monitored." ++msgstr "" ++"irq plugin sẽ monitor tỉ lệ vấn Ä‘á» trên giây cho những interrupt được chá»n. " ++"Nếu không có interrupt được chá»n thi tất cả các interrupt sẽ được monitor. " ++"for each selected interrupt. If no interrupt is selected then all interrupts " ++"are monitored." ++ ++msgid "" ++"The iwinfo plugin collects statistics about wireless signal strength, noise " ++"and quality." ++msgstr "" ++ ++msgid "The load plugin collects statistics about the general system load." ++msgstr "Plugin tải thu thập thông kê vá» tổng quát system load" ++ ++msgid "The memory plugin collects statistics about the memory usage." ++msgstr "" ++ ++msgid "" ++"The netlink plugin collects extended informations like qdisc-, class- and " ++"filter-statistics for selected interfaces." ++msgstr "" ++"Netlink plugin thu thập những thông tin mở rá»™ng nhÆ° qdisc-, class- and " ++"filter-statistics cho những giao diện được chá»n" ++ ++msgid "" ++"The network plugin provides network based communication between different " ++"collectd instances. Collectd can operate both in client and server mode. In " ++"client mode locally collected data is transferred to a collectd server " ++"instance, in server mode the local instance receives data from other hosts." ++msgstr "" ++"Network plugin cung cấp network dá»±a trên giao tiếp giữa những collectd " ++"instances khác nhau. Collectd có thể vận hành trên cả 2 chế Ä‘á»™ client và " ++"server. Trong kiểu chế Ä‘á»™ client tập hợp ngày tháng địa phÆ°Æ¡ng được chuyển " ++"tá»›i má»™t collectd server instance, trong chế Ä‘á»™ server, instance địa phÆ°Æ¡ng " ++"nhận dữ liệu từ những host khác." ++ ++msgid "" ++"The ping plugin will send icmp echo replies to selected hosts and measure " ++"the roundtrip time for each host." ++msgstr "" ++"ping plugin sẽ gá»­i icmp echo trả lá»i tá»›i những host được chá»n và Ä‘o thá»i " ++"gian vận hành qua lại cho từng host" ++ ++msgid "" ++"The processes plugin collects informations like cpu time, page faults and " ++"memory usage of selected processes." ++msgstr "" ++"Processes plugin thu thập thông tin nhÆ° cpu time, page faults và memory " ++"usage của từng processes được chá»n. " ++ ++msgid "" ++"The rrdtool plugin stores the collected data in rrd database files, the " ++"foundation of the diagrams.

    Warning: Setting the wrong " ++"values will result in a very high memory consumption in the temporary " ++"directory. This can render the device unusable!" ++msgstr "" ++"The rrdtool plugin lưu những dữ liệu thu thập trong rrd database files, cơ " ++"sở của biểu đồ.

    Cảnh báo: Äặt sai giá trị sẽ tiêu hao bá»™ " ++"nhá»› rất nhiá»u trong má»™t thÆ° mục tạm thá»i. Äiá»u này có thể làm thiết bị không " ++"sá»­ dụng được" ++ ++msgid "" ++"The splash leases plugin uses libuci to collect statistics about splash " ++"leases." ++msgstr "" ++ ++msgid "" ++"The statistics package is based on Collectd and uses RRD " ++"Tool to render diagram images from collected data." ++msgstr "" ++"Gói thống kê dá»±a trên Collectd and uses RRD Tool vẽ lại " ++"sÆ¡ đồ hình ảnh từ dữ liệu thu thập ." ++ ++msgid "" ++"The tcpconns plugin collects informations about open tcp connections on " ++"selected ports." ++msgstr "" ++"Tcpconns plugin thu thập thông tin vá» open tcp kết nối trên những cổng được " ++"chá»n." ++ ++msgid "" ++"The unixsock plugin creates a unix socket which can be used to read " ++"collected data from a running collectd instance." ++msgstr "" ++"Unixsock plugin tạo má»™t unix socket mà có thể dùng để Ä‘á»c dữ liệu thu thập " ++"từ má»™t collectd instance Ä‘ang vận hành. " ++ ++msgid "The uptime plugin collects statistics about the uptime of the system." ++msgstr "" ++ ++msgid "" ++"This section defines on which interfaces collectd will wait for incoming " ++"connections." ++msgstr "" ++"Section này định nghÄ©a trên giao diện collectd sẽ đợi những kết nối Ä‘ang tá»›i" ++ ++msgid "" ++"This section defines to which servers the locally collected data is sent to." ++msgstr "Section này định nghÄ©a servers thu thập dữ liệu địa phÆ°Æ¡ng để gá»­i Ä‘i" ++ ++msgid "Try to lookup fully qualified hostname" ++msgstr "Thá»­ tra cứu những tên host đủ Ä‘iá»u kiện" ++ ++msgid "UPS" ++msgstr "" ++ ++msgid "UPS Plugin Configuration" ++msgstr "" ++ ++msgid "UPS name in NUT ups@host format" ++msgstr "" ++ ++msgid "UnixSock" ++msgstr "UnixSock" ++ ++msgid "Unixsock Plugin Configuration" ++msgstr "Cấu hình Unixsock Plugin " ++ ++msgid "Uptime" ++msgstr "" ++ ++msgid "Uptime Plugin Configuration" ++msgstr "" ++ ++msgid "Used PID file" ++msgstr "Tập tin PID đã sá»­ dụng" ++ ++msgid "User" ++msgstr "" ++ ++msgid "Verbose monitoring" ++msgstr "Verbose monitoring" ++ ++msgid "Wireless" ++msgstr "Mạng không dây" ++ ++msgid "Wireless iwinfo Plugin Configuration" ++msgstr "" ++ ++msgid "e.g. br-ff" ++msgstr "e.g. br-ff" ++ ++msgid "e.g. br-lan" ++msgstr "e.g. br-lan" ++ ++msgid "e.g. reject-with tcp-reset" ++msgstr "e.g. reject-with tcp-reset" ++ ++msgid "max. 16 chars" ++msgstr "max. 16 chars" ++ ++msgid "reduces rrd size" ++msgstr "Giảm rrd size" ++ ++msgid "seconds; multiple separated by space" ++msgstr "giây; nhiá»u phân tách bởi khoảng trống" ++ ++msgid "server interfaces" ++msgstr "giao diện server" ++ ++#~ msgid "" ++#~ "The wireless plugin collects statistics about wireless signal strength, " ++#~ "noise and quality." ++#~ msgstr "" ++#~ "Cấu hình wireless plugin thu thập thống kê vá» Ä‘á»™ mạnh của tín hiệu " ++#~ "wireless, noise và chất lượng." ++ ++#~ msgid "Wireless Plugin Configuration" ++#~ msgstr "Cấu hình Wireless Plugin " +diff --git a/feeds/luci/applications/luci-app-statistics/po/zh-cn/rrdtool.po b/feeds/luci/applications/luci-app-statistics/po/zh-cn/rrdtool.po +new file mode 100644 +index 0000000..4e6ee4b +--- /dev/null ++++ b/feeds/luci/applications/luci-app-statistics/po/zh-cn/rrdtool.po +@@ -0,0 +1,359 @@ ++# rrdtool.pot ++# generated from ./applications/luci-statistics/luasrc/i18n/rrdtool.en.lua ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"PO-Revision-Date: 2014-07-23 02:08+0200\n" ++"Last-Translator: Tanyingyu \n" ++"Language-Team: none\n" ++"Language: zh_CN\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=1; plural=0;\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++#. %H: Wireless - Signal Noise Ratio ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:1 ++msgid "stat_dg_title_wireless__signal_noise" ++msgstr "无线信å·å™ªéŸ³" ++ ++#. dBm ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:2 ++msgid "stat_dg_label_wireless__signal_noise" ++msgstr "信噪比" ++ ++#. Noise Level ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:3 ++msgid "stat_ds_signal_noise" ++msgstr "ä¿¡å·å™ªéŸ³" ++ ++#. Signal Strength ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:4 ++msgid "stat_ds_signal_power" ++msgstr "ä¿¡å·å¼ºåº¦" ++ ++#. %H: Wireless - Signal Quality ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:5 ++msgid "stat_dg_title_wireless__signal_quality" ++msgstr "无线信å·è´¨é‡" ++ ++#. n ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:6 ++msgid "stat_dg_label_wireless__signal_quality" ++msgstr "无线信å·è´¨é‡" ++ ++#. Signal Quality ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:7 ++msgid "stat_ds_signal_quality" ++msgstr "ä¿¡å·è´¨é‡" ++ ++#. %H: ICMP Roundtrip Times ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:8 ++msgid "stat_dg_title_ping" ++msgstr "ping" ++ ++#. ms ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:9 ++msgid "stat_dg_label_ping" ++msgstr "å“应" ++ ++#. %di ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:10 ++msgid "stat_ds_ping" ++msgstr "ping" ++ ++#. %H: Firewall - Processed Packets ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:11 ++msgid "stat_dg_title_iptables__ipt_packets" ++msgstr "iptables包" ++ ++#. Packets/s ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:12 ++msgid "stat_dg_label_iptables__ipt_packets" ++msgstr "" ++ ++#. Chain \"%di\" ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:13 ++msgid "stat_ds_ipt_packets" ++msgstr "" ++ ++#. %H: Netlink - Transfer on %pi ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:14 ++msgid "stat_dg_title_netlink__if_octets" ++msgstr "" ++ ++#. Bytes/s ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:15 ++msgid "stat_dg_label_netlink__if_octets" ++msgstr "" ++ ++#. Bytes (%ds) ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:16 ++msgid "stat_ds_if_octets" ++msgstr "" ++ ++#. %H: Netlink - Packets on %pi ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:17 ++msgid "stat_dg_title_netlink__if_packets" ++msgstr "" ++ ++#. Packets/s ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:18 ++msgid "stat_dg_label_netlink__if_packets" ++msgstr "" ++ ++#. Processed (%ds) ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:19 ++msgid "stat_ds_if_packets" ++msgstr "" ++ ++#. Dropped (%ds) ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:20 ++msgid "stat_ds_if_dropped" ++msgstr "" ++ ++#. Errors (%ds) ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:21 ++msgid "stat_ds_if_errors" ++msgstr "" ++ ++#. %H: Netlink - Multicast on %pi ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:22 ++msgid "stat_dg_title_netlink__if_multicast" ++msgstr "" ++ ++#. Packets/s ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:23 ++msgid "stat_dg_label_netlink__if_multicast" ++msgstr "" ++ ++#. Packets ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:24 ++msgid "stat_ds_if_multicast" ++msgstr "" ++ ++#. %H: Netlink - Collisions on %pi ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:25 ++msgid "stat_dg_title_netlink__if_collisions" ++msgstr "" ++ ++#. Collisions/s ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:26 ++msgid "stat_dg_label_netlink__if_collisions" ++msgstr "" ++ ++#. Collisions ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:27 ++msgid "stat_ds_if_collisions" ++msgstr "" ++ ++#. %H: Netlink - Errors on %pi ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:28 ++msgid "stat_dg_title_netlink__if_tx_errors" ++msgstr "" ++ ++#. Errors/s ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:29 ++msgid "stat_dg_label_netlink__if_tx_errors" ++msgstr "" ++ ++#. %di ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:30 ++msgid "stat_ds_if_tx_errors" ++msgstr "" ++ ++#. %di ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:31 ++msgid "stat_ds_if_rx_errors" ++msgstr "" ++ ++#. %H: Processes ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:32 ++msgid "stat_dg_title_processes" ++msgstr "" ++ ++#. Processes/s ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:33 ++msgid "stat_dg_label_processes" ++msgstr "" ++ ++#. %di ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:34 ++msgid "stat_ds_ps_state" ++msgstr "" ++ ++#. %H: Process %pi - used cpu time ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:35 ++msgid "stat_dg_title_processes__ps_cputime" ++msgstr "" ++ ++#. Jiffies ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:36 ++msgid "stat_dg_label_processes__ps_cputime" ++msgstr "" ++ ++#. system ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:37 ++msgid "stat_ds_ps_cputime__syst" ++msgstr "" ++ ++#. user ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:38 ++msgid "stat_ds_ps_cputime__user" ++msgstr "" ++ ++#. %H: Process %pi - threads and processes ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:39 ++msgid "stat_dg_title_processes__ps_count" ++msgstr "" ++ ++#. Count ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:40 ++msgid "stat_dg_label_processes__ps_count" ++msgstr "" ++ ++#. %ds ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:41 ++msgid "stat_ds_ps_count" ++msgstr "" ++ ++#. %H: Process %pi - page faults ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:42 ++msgid "stat_dg_title_processes__ps_pagefaults" ++msgstr "" ++ ++#. Pagefaults ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:43 ++msgid "stat_dg_label_processes__ps_pagefaults" ++msgstr "" ++ ++#. page faults ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:44 ++msgid "stat_ds_ps_pagefaults" ++msgstr "" ++ ++#. %H: Process %pi - virtual memory size ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:45 ++msgid "stat_dg_title_processes__ps_rss" ++msgstr "" ++ ++#. Bytes ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:46 ++msgid "stat_dg_label_processes__ps_rss" ++msgstr "" ++ ++#. virtual memory ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:47 ++msgid "stat_ds_ps_rss" ++msgstr "" ++ ++#. %H: Usage on Processor #%pi ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:48 ++msgid "stat_dg_title_cpu" ++msgstr "" ++ ++#. % ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:49 ++msgid "stat_dg_label_cpu" ++msgstr "" ++ ++#. %di ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:50 ++msgid "stat_ds_cpu" ++msgstr "" ++ ++#. %H: Transfer on %di ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:51 ++msgid "stat_dg_title_interface__if_octets" ++msgstr "" ++ ++#. Bytes/s ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:52 ++msgid "stat_dg_label_interface__if_octets" ++msgstr "" ++ ++#. %H: Packets on %di ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:53 ++msgid "stat_dg_title_interface__if_packets" ++msgstr "" ++ ++#. Packets/s ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:54 ++msgid "stat_dg_label_interface__if_packets" ++msgstr "" ++ ++#. %H: TCP-Connections to Port %pi ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:55 ++msgid "stat_dg_title_tcpconns" ++msgstr "" ++ ++#. Connections/s ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:56 ++msgid "stat_dg_label_tcpconns" ++msgstr "" ++ ++#. %di ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:57 ++msgid "stat_ds_tcp_connections" ++msgstr "" ++ ++#. %H: Disk Space Usage on %di ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:58 ++msgid "stat_dg_title_df" ++msgstr "" ++ ++#. Bytes ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:59 ++msgid "stat_dg_label_df" ++msgstr "" ++ ++#. %ds ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:60 ++msgid "stat_ds_df__free" ++msgstr "" ++ ++#. %ds ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:61 ++msgid "stat_ds_df__used" ++msgstr "" ++ ++#. %H: Interrupts ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:62 ++msgid "stat_dg_title_irq" ++msgstr "" ++ ++#. Issues/s ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:63 ++msgid "stat_dg_label_irq" ++msgstr "" ++ ++#. IRQ %di ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:64 ++msgid "stat_ds_irq" ++msgstr "" ++ ++#. %H: System Load ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:65 ++msgid "stat_dg_title_load" ++msgstr "" ++ ++#. Load ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:66 ++msgid "stat_dg_label_load" ++msgstr "" ++ ++#. 1 min ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:67 ++msgid "stat_ds_load__shortterm" ++msgstr "" ++ ++#. 5 min ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:68 ++msgid "stat_ds_load__midterm" ++msgstr "" ++ ++#. 15 min ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:69 ++msgid "stat_ds_load__longterm" ++msgstr "" +diff --git a/feeds/luci/applications/luci-app-statistics/po/zh-cn/statistics.po b/feeds/luci/applications/luci-app-statistics/po/zh-cn/statistics.po +new file mode 100644 +index 0000000..669d5f0 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-statistics/po/zh-cn/statistics.po +@@ -0,0 +1,642 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Report-Msgid-Bugs-To: \n" ++"POT-Creation-Date: 2009-06-10 03:40+0200\n" ++"PO-Revision-Date: 2014-06-13 15:04+0200\n" ++"Last-Translator: phantasm131 \n" ++"Language-Team: LANGUAGE \n" ++"Language: zh_CN\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=1; plural=0;\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "Action (target)" ++msgstr "动作(目标)" ++ ++msgid "Add command for reading values" ++msgstr "添加命令读å–æ•°æ®" ++ ++msgid "Add matching rule" ++msgstr "新增匹é…规则" ++ ++msgid "Add multiple hosts separated by space." ++msgstr "使用空格分隔多个主机" ++ ++msgid "Add notification command" ++msgstr "新增通知命令" ++ ++msgid "Base Directory" ++msgstr "基本目录" ++ ++msgid "Basic monitoring" ++msgstr "基本监控" ++ ++msgid "CPU Plugin Configuration" ++msgstr "CPUæ’件é…ç½®" ++ ++msgid "CSV Output" ++msgstr "CSV输出" ++ ++msgid "CSV Plugin Configuration" ++msgstr "CSVæ’件é…ç½®" ++ ++msgid "Cache collected data for" ++msgstr "收集缓存数æ®" ++ ++msgid "Cache flush interval" ++msgstr "缓存清空间隙" ++ ++msgid "Chain" ++msgstr "链" ++ ++msgid "CollectLinks" ++msgstr "收集链接" ++ ++msgid "CollectRoutes" ++msgstr "收集路由" ++ ++msgid "CollectTopology" ++msgstr "收集拓扑" ++ ++msgid "Collectd" ++msgstr "Collectd" ++ ++msgid "Collectd Settings" ++msgstr "Collectd设置" ++ ++msgid "" ++"Collectd is a small daemon for collecting data from various sources through " ++"different plugins. On this page you can change general settings for the " ++"collectd daemon." ++msgstr "" ++"Collectd是一个通过ä¸åŒæ’件用于收集å„ç§æºæ•°æ®çš„å°åž‹å®ˆæŠ¤ç¨‹åºã€‚在此页é¢ä¸­ï¼Œæ‚¨å¯" ++"以更改Collectd守护进程常规设置。" ++ ++msgid "Conntrack" ++msgstr "Conntrack" ++ ++msgid "Conntrack Plugin Configuration" ++msgstr "Conntrackæ’件设置" ++ ++msgid "DF Plugin Configuration" ++msgstr "DFæ’件设置" ++ ++msgid "DNS" ++msgstr "DNS" ++ ++msgid "DNS Plugin Configuration" ++msgstr "DNSæ’件设置" ++ ++msgid "Data collection interval" ++msgstr "æ•°æ®æ”¶é›†é—´éš™" ++ ++msgid "Datasets definition file" ++msgstr "æ•°æ®é›†å®šä¹‰æ–‡ä»¶" ++ ++msgid "Destination ip range" ++msgstr "目标IP区间" ++ ++msgid "Directory for collectd plugins" ++msgstr "Collectdæ’件目录" ++ ++msgid "Directory for sub-configurations" ++msgstr "å­é…置目录" ++ ++msgid "Disk Plugin Configuration" ++msgstr "Diskæ’件é…ç½®" ++ ++msgid "Disk Space Usage" ++msgstr "ç£ç›˜ç©ºé—´ä½¿ç”¨æƒ…况" ++ ++msgid "Disk Usage" ++msgstr "ç£ç›˜ä½¿ç”¨æƒ…况" ++ ++msgid "Display Host »" ++msgstr "显示主机" ++ ++msgid "Display timespan »" ++msgstr "显示时间段" ++ ++msgid "E-Mail Plugin Configuration" ++msgstr "E-Mailæ’件é…ç½®" ++ ++msgid "Email" ++msgstr "电å­é‚®ä»¶" ++ ++msgid "Enable this plugin" ++msgstr "å¯ç”¨è¯¥æ’件" ++ ++msgid "Exec" ++msgstr "Exec" ++ ++msgid "Exec Plugin Configuration" ++msgstr "Execæ’件é…ç½®" ++ ++msgid "Filter class monitoring" ++msgstr "Filter类监测" ++ ++msgid "Firewall" ++msgstr "防ç«å¢™" ++ ++msgid "Flush cache after" ++msgstr "清空缓存åŽ" ++ ++msgid "Forwarding between listen and server addresses" ++msgstr "转å‘监å¬æœåŠ¡å™¨å’Œåº”用æœåŠ¡å™¨ä¹‹é—´æ•°æ®" ++ ++msgid "Graphs" ++msgstr "图表" ++ ++msgid "Group" ++msgstr "组" ++ ++msgid "" ++"Here you can define external commands which will be started by collectd in " ++"order to read certain values. The values will be read from stdout." ++msgstr "" ++"在这里,你å¯ä»¥å®šä¹‰å¤–部命令,Collectdå°†å¯åŠ¨å‘½ä»¤æ¥èŽ·å–æŸäº›å€¼ï¼Œå°†èŽ·å–的值从标准" ++"输出端å£è¾“出。" ++ ++msgid "" ++"Here you can define external commands which will be started by collectd when " ++"certain threshold values have been reached. The values leading to invokation " ++"will be feeded to the the called programs stdin." ++msgstr "" ++"在这里,你å¯ä»¥å®šä¹‰å¤–部命令,当Collectd达到一定阈值时,将å¯åŠ¨å‘½ä»¤ã€‚阀值将会作" ++"为命令的标准输入。" ++ ++msgid "" ++"Here you can define various criteria by which the monitored iptables rules " ++"are selected." ++msgstr "在这里,你å¯ä»¥å®šä¹‰å„ç§ç›‘控iptables规则临界值。" ++ ++msgid "Host" ++msgstr "主机" ++ ++msgid "Hostname" ++msgstr "主机å" ++ ++msgid "IP or hostname where to get the txtinfo output from" ++msgstr "获å–txtinfo输出的IP地å€æˆ–主机å" ++ ++msgid "IRQ Plugin Configuration" ++msgstr "IRQæ’件é…ç½®" ++ ++msgid "Ignore source addresses" ++msgstr "忽略æºåœ°å€" ++ ++msgid "Incoming interface" ++msgstr "入接å£" ++ ++msgid "Interface Plugin Configuration" ++msgstr "Interfaceæ’件é…ç½®" ++ ++msgid "Interfaces" ++msgstr "Interfaces" ++ ++msgid "Interrupts" ++msgstr "中断" ++ ++msgid "Interval for pings" ++msgstr "pingé—´éš™" ++ ++msgid "Iptables Plugin Configuration" ++msgstr "Iptablesæ’件é…ç½®" ++ ++msgid "Leave unselected to automatically determine interfaces to monitor." ++msgstr "自动ä¿ç•™å¯¹æœªé€‰ä¸­æŽ¥å£çš„监控。" ++ ++msgid "Listen host" ++msgstr "监å¬ä¸»æœº" ++ ++msgid "Listen port" ++msgstr "监å¬ç«¯å£" ++ ++msgid "Listener interfaces" ++msgstr "监å¬æŽ¥å£" ++ ++msgid "Load Plugin Configuration" ++msgstr "Loadæ’件é…ç½®" ++ ++msgid "Maximum allowed connections" ++msgstr "最大å…许连接数" ++ ++msgid "Memory" ++msgstr "内存" ++ ++msgid "Memory Plugin Configuration" ++msgstr "内存æ’件é…ç½®" ++ ++msgid "Monitor all except specified" ++msgstr "监测所有(除特别注明外)" ++ ++msgid "Monitor all local listen ports" ++msgstr "监测所有本地监å¬ç«¯å£" ++ ++msgid "Monitor devices" ++msgstr "监测设备" ++ ++msgid "Monitor disks and partitions" ++msgstr "监测ç£ç›˜å’Œåˆ†åŒº" ++ ++msgid "Monitor filesystem types" ++msgstr "监测文件系统类型" ++ ++msgid "Monitor hosts" ++msgstr "监测主机" ++ ++msgid "Monitor interfaces" ++msgstr "监测接å£" ++ ++msgid "Monitor interrupts" ++msgstr "监测中断" ++ ++msgid "Monitor local ports" ++msgstr "监测本地端å£" ++ ++msgid "Monitor mount points" ++msgstr "监测挂载点" ++ ++msgid "Monitor processes" ++msgstr "监测进程" ++ ++msgid "Monitor remote ports" ++msgstr "监测远程端å£" ++ ++msgid "Name of the rule" ++msgstr "规则å" ++ ++msgid "Netlink" ++msgstr "Netlink" ++ ++msgid "Netlink Plugin Configuration" ++msgstr "Netlinkæ’件é…ç½®" ++ ++msgid "Network" ++msgstr "Network" ++ ++msgid "Network Plugin Configuration" ++msgstr "Networkæ’件é…ç½®" ++ ++msgid "Network plugins" ++msgstr "Networkæ’件" ++ ++msgid "Network protocol" ++msgstr "Networkåè®®" ++ ++msgid "Number of threads for data collection" ++msgstr "收集程åºä½¿ç”¨çº¿ç¨‹æ•°" ++ ++msgid "OLSRd" ++msgstr "OLSRd" ++ ++msgid "OLSRd Plugin Configuration" ++msgstr "OLSRdæ’件é…ç½®" ++ ++msgid "Only create average RRAs" ++msgstr "仅创建平å‡RRAs" ++ ++msgid "Options" ++msgstr "选项" ++ ++msgid "Outgoing interface" ++msgstr "出接å£" ++ ++msgid "Output plugins" ++msgstr "Outputæ’件" ++ ++msgid "Ping" ++msgstr "Ping" ++ ++msgid "Ping Plugin Configuration" ++msgstr "Pingæ’件é…ç½®" ++ ++msgid "Port" ++msgstr "端å£" ++ ++msgid "Processes" ++msgstr "进程" ++ ++msgid "Processes Plugin Configuration" ++msgstr "进程æ’件é…ç½®" ++ ++msgid "Processes to monitor separated by space" ++msgstr "过程监控,用空格隔开" ++ ++msgid "Processor" ++msgstr "处ç†å™¨" ++ ++msgid "Qdisc monitoring" ++msgstr "Qdisc监测" ++ ++msgid "RRD XFiles Factor" ++msgstr "RRD XFileså› å­" ++ ++msgid "RRD heart beat interval" ++msgstr "RRD心跳间隙" ++ ++msgid "RRD step interval" ++msgstr "RRD区间间隙" ++ ++msgid "RRDTool" ++msgstr "RRDTool" ++ ++msgid "RRDTool Plugin Configuration" ++msgstr "RRDToolæ’件é…ç½®" ++ ++msgid "Rows per RRA" ++msgstr "è¡Œ/RRA" ++ ++msgid "Script" ++msgstr "脚本" ++ ++msgid "Seconds" ++msgstr "秒" ++ ++msgid "Server host" ++msgstr "æœåŠ¡å™¨ä¸»æœº" ++ ++msgid "Server port" ++msgstr "æœåŠ¡å™¨ç«¯å£" ++ ++msgid "Shaping class monitoring" ++msgstr "整形类监控" ++ ++msgid "Socket file" ++msgstr "套接字文件" ++ ++msgid "Socket group" ++msgstr "套接字组" ++ ++msgid "Socket permissions" ++msgstr "套接字æƒé™" ++ ++msgid "Source ip range" ++msgstr "æºIP区间" ++ ++msgid "Specifies what information to collect about links." ++msgstr "收集指定链接相关信æ¯ã€‚" ++ ++msgid "Specifies what information to collect about routes." ++msgstr "收集指定路由相关信æ¯ã€‚" ++ ++msgid "Specifies what information to collect about the global topology." ++msgstr "收集指定拓扑相关信æ¯ã€‚" ++ ++msgid "Splash Leases" ++msgstr "" ++ ++msgid "Splash Leases Plugin Configuration" ++msgstr "" ++ ++msgid "Statistics" ++msgstr "统计" ++ ++msgid "Storage directory" ++msgstr "存储目录" ++ ++msgid "Storage directory for the csv files" ++msgstr "csv存储目录" ++ ++msgid "Store data values as rates instead of absolute values" ++msgstr "存储数æ®å€¼å˜åŒ–é‡è€Œä¸æ˜¯ç»å¯¹å€¼" ++ ++msgid "Stored timespans" ++msgstr "存储时间跨度" ++ ++msgid "System Load" ++msgstr "系统加载" ++ ++msgid "System plugins" ++msgstr "系统æ’件" ++ ++msgid "TCP Connections" ++msgstr "TCP连接数" ++ ++msgid "TCPConns Plugin Configuration" ++msgstr "TCPConnsæ’件é…ç½®" ++ ++msgid "TTL for network packets" ++msgstr "网络包TTL" ++ ++msgid "TTL for ping packets" ++msgstr "ping包TTL" ++ ++msgid "Table" ++msgstr "表" ++ ++msgid "The NUT plugin reads information about Uninterruptible Power Supplies." ++msgstr "NUTæ’件读å–UPSä¿¡æ¯ã€‚" ++ ++msgid "" ++"The OLSRd plugin reads information about meshed networks from the txtinfo " ++"plugin of OLSRd." ++msgstr "OLSRdæ’件通过txtinfo获å–meshed网络信æ¯ã€‚" ++ ++msgid "" ++"The conntrack plugin collects statistics about the number of tracked " ++"connections." ++msgstr "conntrackæ’件获å–连接数信æ¯ã€‚" ++ ++msgid "The cpu plugin collects basic statistics about the processor usage." ++msgstr "cpuæ’件获å–处ç†å™¨ç›¸å…³ä¿¡æ¯ã€‚" ++ ++msgid "" ++"The csv plugin stores collected data in csv file format for further " ++"processing by external programs." ++msgstr "csvæ’件用于存储数æ®ï¼Œä»¥æ–¹ä¾¿å…¶ä»–程åºå¤„ç†æ•°æ®ã€‚" ++ ++msgid "" ++"The df plugin collects statistics about the disk space usage on different " ++"devices, mount points or filesystem types." ++msgstr "dfæ’件收集ç£ç›˜ç©ºé—´ä½¿ç”¨æƒ…况,挂载点åŠæ–‡ä»¶ç³»ç»Ÿç›¸å…³ä¿¡æ¯ã€‚" ++ ++msgid "" ++"The disk plugin collects detailled usage statistics for selected partitions " ++"or whole disks." ++msgstr "diskæ’件收集ç£ç›˜åˆ†åŒºä½¿ç”¨æƒ…况åŠç›¸å…³ä¿¡æ¯ã€‚" ++ ++msgid "" ++"The dns plugin collects detailled statistics about dns related traffic on " ++"selected interfaces." ++msgstr "dnsæ’件收集dnsæ•°æ®æµç›¸å…³ä¿¡æ¯ã€‚" ++ ++msgid "" ++"The email plugin creates a unix socket which can be used to transmit email-" ++"statistics to a running collectd daemon. This plugin is primarily intended " ++"to be used in conjunction with Mail::SpamAssasin::Plugin::Collectd but can " ++"be used in other ways as well." ++msgstr "" ++"邮件æ’件创建一个unix套接字用于为Collectd守护进程å‘é€ç»Ÿè®¡ä¿¡æ¯åˆ°ç”µå­é‚®ä»¶ç³»ç»Ÿã€‚" ++"这个æ’件主è¦ç›®çš„是结åˆä½¿ç”¨Mail::SpamAssasin::Pulgin::Collectd,但å¯ä»¥ç”¨åœ¨å…¶ä»–" ++"æ–¹é¢ã€‚" ++ ++msgid "" ++"The exec plugin starts external commands to read values from or to notify " ++"external processes when certain threshold values have been reached." ++msgstr "" ++"execæ’件,用于当æŸäº›ç›‘控值已到达阈值时,å¯åŠ¨å¤–部命令读值或通知外部程åºã€‚" ++ ++msgid "" ++"The interface plugin collects traffic statistics on selected interfaces." ++msgstr "Interfaceæ’件,用于收集选定接å£çš„æ•°æ®åŒ…的统计信æ¯ã€‚" ++ ++msgid "" ++"The iptables plugin will monitor selected firewall rules and collect " ++"informations about processed bytes and packets per rule." ++msgstr "iptablesæ’件,将监测选定防ç«å¢™è§„则和收集关于æ¯ä¸ªè§„则处ç†çš„æ•°æ®åŒ…ä¿¡æ¯ã€‚" ++ ++msgid "" ++"The irq plugin will monitor the rate of issues per second for each selected " ++"interrupt. If no interrupt is selected then all interrupts are monitored." ++msgstr "" ++"irqæ’件,用于监控选定中断的æ¯ç§’钟产生的中断数。如果没有中断被选中,则表示对所" ++"有中断进行监测。" ++ ++msgid "" ++"The iwinfo plugin collects statistics about wireless signal strength, noise " ++"and quality." ++msgstr "iwinfoæ’件,收集无线信å·å¼ºåº¦ã€å™ªå£°å’Œè´¨é‡çš„统计信æ¯ã€‚" ++ ++msgid "The load plugin collects statistics about the general system load." ++msgstr "loadæ’件,收集常规系统加载统计信æ¯ã€‚" ++ ++msgid "The memory plugin collects statistics about the memory usage." ++msgstr "memoryæ’件,收集关于内存使用情况的统计信æ¯ã€‚" ++ ++msgid "" ++"The netlink plugin collects extended informations like qdisc-, class- and " ++"filter-statistics for selected interfaces." ++msgstr "netlinkæ’件,收集为选定接å£qdisc-ã€class-å’Œfilter- 的扩展数æ®ã€‚" ++ ++msgid "" ++"The network plugin provides network based communication between different " ++"collectd instances. Collectd can operate both in client and server mode. In " ++"client mode locally collected data is transferred to a collectd server " ++"instance, in server mode the local instance receives data from other hosts." ++msgstr "" ++"networkæ’件,æ供了基于网络的ä¸åŒCollectd实例。Collectdå¯ä»¥å·¥ä½œåœ¨å®¢æˆ·ç«¯å’ŒæœåŠ¡" ++"器两个模å¼ã€‚在客户端模å¼ä¸‹æ”¶é›†æœ¬åœ°ä¿¡æ¯ï¼Œç„¶åŽè½¬ç§»åˆ°ä¸€ä¸ªCollectdæœåŠ¡å™¨å®žä¾‹ä¸­,在" ++"æœåŠ¡å™¨æ¨¡å¼å°†ä»Žå…¶ä»–主机收集信æ¯ã€‚" ++ ++msgid "" ++"The ping plugin will send icmp echo replies to selected hosts and measure " ++"the roundtrip time for each host." ++msgstr "pingæ’件,将å‘é€icmp echo replies到选定主机æ¥æµ‹é‡æ¯å°ä¸»æœºçš„å“应时间。" ++ ++msgid "" ++"The processes plugin collects informations like cpu time, page faults and " ++"memory usage of selected processes." ++msgstr "processesæ’件,收集选定进程的cpu时间ã€é¡µé¢é”™è¯¯å’Œå†…存使用信æ¯ã€‚" ++ ++msgid "" ++"The rrdtool plugin stores the collected data in rrd database files, the " ++"foundation of the diagrams.

    Warning: Setting the wrong " ++"values will result in a very high memory consumption in the temporary " ++"directory. This can render the device unusable!" ++msgstr "" ++"rrdtoolæ’件,将收集数æ®ä»¥å›¾è¡¨çš„å½¢å¼å‚¨å­˜åœ¨RRDæ•°æ®åº“文件中。

    警告:错误的å‚数设置,将导致éžå¸¸é«˜çš„临时内存消耗。这å¯èƒ½ä¼šä½¿è®¾å¤‡æ— æ³•" ++"使用ï¼" ++ ++msgid "" ++"The splash leases plugin uses libuci to collect statistics about splash " ++"leases." ++msgstr "" ++ ++msgid "" ++"The statistics package is based on Collectd and uses RRD " ++"Tool to render diagram images from collected data." ++msgstr "" ++"统计软件包是基于Collectd,并" ++"使用RRD工具æ¥æ¸²æŸ“图表,用于收" ++"集数æ®ã€‚" ++ ++msgid "" ++"The tcpconns plugin collects informations about open tcp connections on " ++"selected ports." ++msgstr "tcpconnsæ’件,收集选定端å£TCP连接信æ¯ã€‚" ++ ++msgid "" ++"The unixsock plugin creates a unix socket which can be used to read " ++"collected data from a running collectd instance." ++msgstr "unixsockæ’件,创建一个unix套接字å¯ç”¨äºŽè¯»å–Collectd实例的收集信æ¯ã€‚" ++ ++msgid "The uptime plugin collects statistics about the uptime of the system." ++msgstr "" ++ ++msgid "" ++"This section defines on which interfaces collectd will wait for incoming " ++"connections." ++msgstr "定义Collectd将监å¬å“ªä¸ªæŽ¥å£æ¥ä¼ å…¥è¿žæŽ¥æ”¶é›†æ•°æ®ã€‚" ++ ++msgid "" ++"This section defines to which servers the locally collected data is sent to." ++msgstr "定义本地收集数æ®è¢«å‘é€åˆ°å“ªå°CollectedæœåŠ¡å™¨ã€‚" ++ ++msgid "Try to lookup fully qualified hostname" ++msgstr "å°è¯•è§£æžä¸»æœºå…¨åŸŸå" ++ ++msgid "UPS" ++msgstr "UPS" ++ ++msgid "UPS Plugin Configuration" ++msgstr "UPSæ’件é…ç½®" ++ ++msgid "UPS name in NUT ups@host format" ++msgstr "UPSå使用NUT(Network UPS Tools)格å¼ï¼šups@host" ++ ++msgid "UnixSock" ++msgstr "UnixSock" ++ ++msgid "Unixsock Plugin Configuration" ++msgstr "Unixsockæ’件é…ç½®" ++ ++msgid "Uptime" ++msgstr "" ++ ++msgid "Uptime Plugin Configuration" ++msgstr "" ++ ++msgid "Used PID file" ++msgstr "正在使用的PID文件" ++ ++msgid "User" ++msgstr "用户" ++ ++msgid "Verbose monitoring" ++msgstr "详细监测" ++ ++msgid "Wireless" ++msgstr "无线" ++ ++msgid "Wireless iwinfo Plugin Configuration" ++msgstr "无线iwinfoæ’件é…ç½®" ++ ++msgid "e.g. br-ff" ++msgstr "例如:br-ff" ++ ++msgid "e.g. br-lan" ++msgstr "例如:br-lan" ++ ++msgid "e.g. reject-with tcp-reset" ++msgstr "例如:eject-with tcp-reset" ++ ++msgid "max. 16 chars" ++msgstr "最长16个字符" ++ ++msgid "reduces rrd size" ++msgstr "å‡å°‘rrd大å°" ++ ++msgid "seconds; multiple separated by space" ++msgstr "秒数;多个使用空格分隔" ++ ++msgid "server interfaces" ++msgstr "æœåŠ¡å™¨æŽ¥å£" ++ ++#~ msgid "group name" ++#~ msgstr "群å称" +diff --git a/feeds/luci/applications/luci-app-statistics/po/zh-tw/rrdtool.po b/feeds/luci/applications/luci-app-statistics/po/zh-tw/rrdtool.po +new file mode 100644 +index 0000000..9245260 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-statistics/po/zh-tw/rrdtool.po +@@ -0,0 +1,355 @@ ++# rrdtool.pot ++# generated from ./applications/luci-statistics/luasrc/i18n/rrdtool.en.lua ++msgid "" ++msgstr "" ++"Content-Type: text/plain; charset=ASCII\n" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Last-Translator: Automatically generated\n" ++"Language-Team: none\n" ++"MIME-Version: 1.0\n" ++"Content-Transfer-Encoding: 8bit\n" ++ ++#. %H: Wireless - Signal Noise Ratio ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:1 ++msgid "stat_dg_title_wireless__signal_noise" ++msgstr "" ++ ++#. dBm ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:2 ++msgid "stat_dg_label_wireless__signal_noise" ++msgstr "" ++ ++#. Noise Level ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:3 ++msgid "stat_ds_signal_noise" ++msgstr "" ++ ++#. Signal Strength ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:4 ++msgid "stat_ds_signal_power" ++msgstr "" ++ ++#. %H: Wireless - Signal Quality ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:5 ++msgid "stat_dg_title_wireless__signal_quality" ++msgstr "" ++ ++#. n ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:6 ++msgid "stat_dg_label_wireless__signal_quality" ++msgstr "" ++ ++#. Signal Quality ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:7 ++msgid "stat_ds_signal_quality" ++msgstr "" ++ ++#. %H: ICMP Roundtrip Times ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:8 ++msgid "stat_dg_title_ping" ++msgstr "" ++ ++#. ms ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:9 ++msgid "stat_dg_label_ping" ++msgstr "" ++ ++#. %di ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:10 ++msgid "stat_ds_ping" ++msgstr "" ++ ++#. %H: Firewall - Processed Packets ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:11 ++msgid "stat_dg_title_iptables__ipt_packets" ++msgstr "" ++ ++#. Packets/s ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:12 ++msgid "stat_dg_label_iptables__ipt_packets" ++msgstr "" ++ ++#. Chain \"%di\" ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:13 ++msgid "stat_ds_ipt_packets" ++msgstr "" ++ ++#. %H: Netlink - Transfer on %pi ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:14 ++msgid "stat_dg_title_netlink__if_octets" ++msgstr "" ++ ++#. Bytes/s ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:15 ++msgid "stat_dg_label_netlink__if_octets" ++msgstr "" ++ ++#. Bytes (%ds) ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:16 ++msgid "stat_ds_if_octets" ++msgstr "" ++ ++#. %H: Netlink - Packets on %pi ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:17 ++msgid "stat_dg_title_netlink__if_packets" ++msgstr "" ++ ++#. Packets/s ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:18 ++msgid "stat_dg_label_netlink__if_packets" ++msgstr "" ++ ++#. Processed (%ds) ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:19 ++msgid "stat_ds_if_packets" ++msgstr "" ++ ++#. Dropped (%ds) ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:20 ++msgid "stat_ds_if_dropped" ++msgstr "" ++ ++#. Errors (%ds) ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:21 ++msgid "stat_ds_if_errors" ++msgstr "" ++ ++#. %H: Netlink - Multicast on %pi ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:22 ++msgid "stat_dg_title_netlink__if_multicast" ++msgstr "" ++ ++#. Packets/s ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:23 ++msgid "stat_dg_label_netlink__if_multicast" ++msgstr "" ++ ++#. Packets ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:24 ++msgid "stat_ds_if_multicast" ++msgstr "" ++ ++#. %H: Netlink - Collisions on %pi ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:25 ++msgid "stat_dg_title_netlink__if_collisions" ++msgstr "" ++ ++#. Collisions/s ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:26 ++msgid "stat_dg_label_netlink__if_collisions" ++msgstr "" ++ ++#. Collisions ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:27 ++msgid "stat_ds_if_collisions" ++msgstr "" ++ ++#. %H: Netlink - Errors on %pi ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:28 ++msgid "stat_dg_title_netlink__if_tx_errors" ++msgstr "" ++ ++#. Errors/s ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:29 ++msgid "stat_dg_label_netlink__if_tx_errors" ++msgstr "" ++ ++#. %di ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:30 ++msgid "stat_ds_if_tx_errors" ++msgstr "" ++ ++#. %di ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:31 ++msgid "stat_ds_if_rx_errors" ++msgstr "" ++ ++#. %H: Processes ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:32 ++msgid "stat_dg_title_processes" ++msgstr "" ++ ++#. Processes/s ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:33 ++msgid "stat_dg_label_processes" ++msgstr "" ++ ++#. %di ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:34 ++msgid "stat_ds_ps_state" ++msgstr "" ++ ++#. %H: Process %pi - used cpu time ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:35 ++msgid "stat_dg_title_processes__ps_cputime" ++msgstr "" ++ ++#. Jiffies ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:36 ++msgid "stat_dg_label_processes__ps_cputime" ++msgstr "" ++ ++#. system ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:37 ++msgid "stat_ds_ps_cputime__syst" ++msgstr "" ++ ++#. user ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:38 ++msgid "stat_ds_ps_cputime__user" ++msgstr "" ++ ++#. %H: Process %pi - threads and processes ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:39 ++msgid "stat_dg_title_processes__ps_count" ++msgstr "" ++ ++#. Count ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:40 ++msgid "stat_dg_label_processes__ps_count" ++msgstr "" ++ ++#. %ds ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:41 ++msgid "stat_ds_ps_count" ++msgstr "" ++ ++#. %H: Process %pi - page faults ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:42 ++msgid "stat_dg_title_processes__ps_pagefaults" ++msgstr "" ++ ++#. Pagefaults ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:43 ++msgid "stat_dg_label_processes__ps_pagefaults" ++msgstr "" ++ ++#. page faults ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:44 ++msgid "stat_ds_ps_pagefaults" ++msgstr "" ++ ++#. %H: Process %pi - virtual memory size ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:45 ++msgid "stat_dg_title_processes__ps_rss" ++msgstr "" ++ ++#. Bytes ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:46 ++msgid "stat_dg_label_processes__ps_rss" ++msgstr "" ++ ++#. virtual memory ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:47 ++msgid "stat_ds_ps_rss" ++msgstr "" ++ ++#. %H: Usage on Processor #%pi ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:48 ++msgid "stat_dg_title_cpu" ++msgstr "" ++ ++#. % ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:49 ++msgid "stat_dg_label_cpu" ++msgstr "" ++ ++#. %di ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:50 ++msgid "stat_ds_cpu" ++msgstr "" ++ ++#. %H: Transfer on %di ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:51 ++msgid "stat_dg_title_interface__if_octets" ++msgstr "" ++ ++#. Bytes/s ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:52 ++msgid "stat_dg_label_interface__if_octets" ++msgstr "" ++ ++#. %H: Packets on %di ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:53 ++msgid "stat_dg_title_interface__if_packets" ++msgstr "" ++ ++#. Packets/s ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:54 ++msgid "stat_dg_label_interface__if_packets" ++msgstr "" ++ ++#. %H: TCP-Connections to Port %pi ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:55 ++msgid "stat_dg_title_tcpconns" ++msgstr "" ++ ++#. Connections/s ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:56 ++msgid "stat_dg_label_tcpconns" ++msgstr "" ++ ++#. %di ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:57 ++msgid "stat_ds_tcp_connections" ++msgstr "" ++ ++#. %H: Disk Space Usage on %di ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:58 ++msgid "stat_dg_title_df" ++msgstr "" ++ ++#. Bytes ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:59 ++msgid "stat_dg_label_df" ++msgstr "" ++ ++#. %ds ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:60 ++msgid "stat_ds_df__free" ++msgstr "" ++ ++#. %ds ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:61 ++msgid "stat_ds_df__used" ++msgstr "" ++ ++#. %H: Interrupts ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:62 ++msgid "stat_dg_title_irq" ++msgstr "" ++ ++#. Issues/s ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:63 ++msgid "stat_dg_label_irq" ++msgstr "" ++ ++#. IRQ %di ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:64 ++msgid "stat_ds_irq" ++msgstr "" ++ ++#. %H: System Load ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:65 ++msgid "stat_dg_title_load" ++msgstr "" ++ ++#. Load ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:66 ++msgid "stat_dg_label_load" ++msgstr "" ++ ++#. 1 min ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:67 ++msgid "stat_ds_load__shortterm" ++msgstr "" ++ ++#. 5 min ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:68 ++msgid "stat_ds_load__midterm" ++msgstr "" ++ ++#. 15 min ++#: applications/luci-statistics/luasrc/i18n/rrdtool.en.lua:69 ++msgid "stat_ds_load__longterm" ++msgstr "" +diff --git a/feeds/luci/applications/luci-app-statistics/po/zh-tw/statistics.po b/feeds/luci/applications/luci-app-statistics/po/zh-tw/statistics.po +new file mode 100644 +index 0000000..b87e114 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-statistics/po/zh-tw/statistics.po +@@ -0,0 +1,612 @@ ++msgid "" ++msgstr "" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Last-Translator: Automatically generated\n" ++"Language-Team: none\n" ++"MIME-Version: 1.0\n" ++"Content-Transfer-Encoding: 8bit\n" ++ ++msgid "Action (target)" ++msgstr "" ++ ++msgid "Add command for reading values" ++msgstr "" ++ ++msgid "Add matching rule" ++msgstr "" ++ ++msgid "Add multiple hosts separated by space." ++msgstr "" ++ ++msgid "Add notification command" ++msgstr "" ++ ++msgid "Base Directory" ++msgstr "" ++ ++msgid "Basic monitoring" ++msgstr "" ++ ++msgid "CPU Plugin Configuration" ++msgstr "" ++ ++msgid "CSV Output" ++msgstr "" ++ ++msgid "CSV Plugin Configuration" ++msgstr "" ++ ++msgid "Cache collected data for" ++msgstr "" ++ ++msgid "Cache flush interval" ++msgstr "" ++ ++msgid "Chain" ++msgstr "" ++ ++msgid "CollectLinks" ++msgstr "" ++ ++msgid "CollectRoutes" ++msgstr "" ++ ++msgid "CollectTopology" ++msgstr "" ++ ++msgid "Collectd" ++msgstr "" ++ ++msgid "Collectd Settings" ++msgstr "" ++ ++msgid "" ++"Collectd is a small daemon for collecting data from various sources through " ++"different plugins. On this page you can change general settings for the " ++"collectd daemon." ++msgstr "" ++ ++msgid "Conntrack" ++msgstr "" ++ ++msgid "Conntrack Plugin Configuration" ++msgstr "" ++ ++msgid "DF Plugin Configuration" ++msgstr "" ++ ++msgid "DNS" ++msgstr "" ++ ++msgid "DNS Plugin Configuration" ++msgstr "" ++ ++msgid "Data collection interval" ++msgstr "" ++ ++msgid "Datasets definition file" ++msgstr "" ++ ++msgid "Destination ip range" ++msgstr "" ++ ++msgid "Directory for collectd plugins" ++msgstr "" ++ ++msgid "Directory for sub-configurations" ++msgstr "" ++ ++msgid "Disk Plugin Configuration" ++msgstr "" ++ ++msgid "Disk Space Usage" ++msgstr "" ++ ++msgid "Disk Usage" ++msgstr "" ++ ++msgid "Display Host »" ++msgstr "" ++ ++msgid "Display timespan »" ++msgstr "" ++ ++msgid "E-Mail Plugin Configuration" ++msgstr "" ++ ++msgid "Email" ++msgstr "" ++ ++msgid "Enable this plugin" ++msgstr "" ++ ++msgid "Exec" ++msgstr "" ++ ++msgid "Exec Plugin Configuration" ++msgstr "" ++ ++msgid "Filter class monitoring" ++msgstr "" ++ ++msgid "Firewall" ++msgstr "" ++ ++msgid "Flush cache after" ++msgstr "" ++ ++msgid "Forwarding between listen and server addresses" ++msgstr "" ++ ++msgid "Graphs" ++msgstr "" ++ ++msgid "Group" ++msgstr "" ++ ++msgid "" ++"Here you can define external commands which will be started by collectd in " ++"order to read certain values. The values will be read from stdout." ++msgstr "" ++ ++msgid "" ++"Here you can define external commands which will be started by collectd when " ++"certain threshold values have been reached. The values leading to invokation " ++"will be feeded to the the called programs stdin." ++msgstr "" ++ ++msgid "" ++"Here you can define various criteria by which the monitored iptables rules " ++"are selected." ++msgstr "" ++ ++msgid "Host" ++msgstr "" ++ ++msgid "Hostname" ++msgstr "" ++ ++msgid "IP or hostname where to get the txtinfo output from" ++msgstr "" ++ ++msgid "IRQ Plugin Configuration" ++msgstr "" ++ ++msgid "Ignore source addresses" ++msgstr "" ++ ++msgid "Incoming interface" ++msgstr "" ++ ++msgid "Interface Plugin Configuration" ++msgstr "" ++ ++msgid "Interfaces" ++msgstr "" ++ ++msgid "Interrupts" ++msgstr "" ++ ++msgid "Interval for pings" ++msgstr "" ++ ++msgid "Iptables Plugin Configuration" ++msgstr "" ++ ++msgid "Leave unselected to automatically determine interfaces to monitor." ++msgstr "" ++ ++msgid "Listen host" ++msgstr "" ++ ++msgid "Listen port" ++msgstr "" ++ ++msgid "Listener interfaces" ++msgstr "" ++ ++msgid "Load Plugin Configuration" ++msgstr "" ++ ++msgid "Maximum allowed connections" ++msgstr "" ++ ++msgid "Memory" ++msgstr "" ++ ++msgid "Memory Plugin Configuration" ++msgstr "" ++ ++msgid "Monitor all except specified" ++msgstr "" ++ ++msgid "Monitor all local listen ports" ++msgstr "" ++ ++msgid "Monitor devices" ++msgstr "" ++ ++msgid "Monitor disks and partitions" ++msgstr "" ++ ++msgid "Monitor filesystem types" ++msgstr "" ++ ++msgid "Monitor hosts" ++msgstr "" ++ ++msgid "Monitor interfaces" ++msgstr "" ++ ++msgid "Monitor interrupts" ++msgstr "" ++ ++msgid "Monitor local ports" ++msgstr "" ++ ++msgid "Monitor mount points" ++msgstr "" ++ ++msgid "Monitor processes" ++msgstr "" ++ ++msgid "Monitor remote ports" ++msgstr "" ++ ++msgid "Name of the rule" ++msgstr "" ++ ++msgid "Netlink" ++msgstr "" ++ ++msgid "Netlink Plugin Configuration" ++msgstr "" ++ ++msgid "Network" ++msgstr "" ++ ++msgid "Network Plugin Configuration" ++msgstr "" ++ ++msgid "Network plugins" ++msgstr "" ++ ++msgid "Network protocol" ++msgstr "" ++ ++msgid "Number of threads for data collection" ++msgstr "" ++ ++msgid "OLSRd" ++msgstr "" ++ ++msgid "OLSRd Plugin Configuration" ++msgstr "" ++ ++msgid "Only create average RRAs" ++msgstr "" ++ ++msgid "Options" ++msgstr "" ++ ++msgid "Outgoing interface" ++msgstr "" ++ ++msgid "Output plugins" ++msgstr "" ++ ++msgid "Ping" ++msgstr "" ++ ++msgid "Ping Plugin Configuration" ++msgstr "" ++ ++msgid "Port" ++msgstr "" ++ ++msgid "Processes" ++msgstr "" ++ ++msgid "Processes Plugin Configuration" ++msgstr "" ++ ++msgid "Processes to monitor separated by space" ++msgstr "" ++ ++msgid "Processor" ++msgstr "" ++ ++msgid "Qdisc monitoring" ++msgstr "" ++ ++msgid "RRD XFiles Factor" ++msgstr "" ++ ++msgid "RRD heart beat interval" ++msgstr "" ++ ++msgid "RRD step interval" ++msgstr "" ++ ++msgid "RRDTool" ++msgstr "" ++ ++msgid "RRDTool Plugin Configuration" ++msgstr "" ++ ++msgid "Rows per RRA" ++msgstr "" ++ ++msgid "Script" ++msgstr "" ++ ++msgid "Seconds" ++msgstr "" ++ ++msgid "Server host" ++msgstr "" ++ ++msgid "Server port" ++msgstr "" ++ ++msgid "Shaping class monitoring" ++msgstr "" ++ ++msgid "Socket file" ++msgstr "" ++ ++msgid "Socket group" ++msgstr "" ++ ++msgid "Socket permissions" ++msgstr "" ++ ++msgid "Source ip range" ++msgstr "" ++ ++msgid "Specifies what information to collect about links." ++msgstr "" ++ ++msgid "Specifies what information to collect about routes." ++msgstr "" ++ ++msgid "Specifies what information to collect about the global topology." ++msgstr "" ++ ++msgid "Splash Leases" ++msgstr "" ++ ++msgid "Splash Leases Plugin Configuration" ++msgstr "" ++ ++msgid "Statistics" ++msgstr "" ++ ++msgid "Storage directory" ++msgstr "" ++ ++msgid "Storage directory for the csv files" ++msgstr "" ++ ++msgid "Store data values as rates instead of absolute values" ++msgstr "" ++ ++msgid "Stored timespans" ++msgstr "" ++ ++msgid "System Load" ++msgstr "" ++ ++msgid "System plugins" ++msgstr "" ++ ++msgid "TCP Connections" ++msgstr "" ++ ++msgid "TCPConns Plugin Configuration" ++msgstr "" ++ ++msgid "TTL for network packets" ++msgstr "" ++ ++msgid "TTL for ping packets" ++msgstr "" ++ ++msgid "Table" ++msgstr "" ++ ++msgid "The NUT plugin reads information about Uninterruptible Power Supplies." ++msgstr "" ++ ++msgid "" ++"The OLSRd plugin reads information about meshed networks from the txtinfo " ++"plugin of OLSRd." ++msgstr "" ++ ++msgid "" ++"The conntrack plugin collects statistics about the number of tracked " ++"connections." ++msgstr "" ++ ++msgid "The cpu plugin collects basic statistics about the processor usage." ++msgstr "" ++ ++msgid "" ++"The csv plugin stores collected data in csv file format for further " ++"processing by external programs." ++msgstr "" ++ ++msgid "" ++"The df plugin collects statistics about the disk space usage on different " ++"devices, mount points or filesystem types." ++msgstr "" ++ ++msgid "" ++"The disk plugin collects detailled usage statistics for selected partitions " ++"or whole disks." ++msgstr "" ++ ++msgid "" ++"The dns plugin collects detailled statistics about dns related traffic on " ++"selected interfaces." ++msgstr "" ++ ++msgid "" ++"The email plugin creates a unix socket which can be used to transmit email-" ++"statistics to a running collectd daemon. This plugin is primarily intended " ++"to be used in conjunction with Mail::SpamAssasin::Plugin::Collectd but can " ++"be used in other ways as well." ++msgstr "" ++ ++msgid "" ++"The exec plugin starts external commands to read values from or to notify " ++"external processes when certain threshold values have been reached." ++msgstr "" ++ ++msgid "" ++"The interface plugin collects traffic statistics on selected interfaces." ++msgstr "" ++ ++msgid "" ++"The iptables plugin will monitor selected firewall rules and collect " ++"informations about processed bytes and packets per rule." ++msgstr "" ++ ++msgid "" ++"The irq plugin will monitor the rate of issues per second for each selected " ++"interrupt. If no interrupt is selected then all interrupts are monitored." ++msgstr "" ++ ++msgid "" ++"The iwinfo plugin collects statistics about wireless signal strength, noise " ++"and quality." ++msgstr "" ++ ++msgid "The load plugin collects statistics about the general system load." ++msgstr "" ++ ++msgid "The memory plugin collects statistics about the memory usage." ++msgstr "" ++ ++msgid "" ++"The netlink plugin collects extended informations like qdisc-, class- and " ++"filter-statistics for selected interfaces." ++msgstr "" ++ ++msgid "" ++"The network plugin provides network based communication between different " ++"collectd instances. Collectd can operate both in client and server mode. In " ++"client mode locally collected data is transferred to a collectd server " ++"instance, in server mode the local instance receives data from other hosts." ++msgstr "" ++ ++msgid "" ++"The ping plugin will send icmp echo replies to selected hosts and measure " ++"the roundtrip time for each host." ++msgstr "" ++ ++msgid "" ++"The processes plugin collects informations like cpu time, page faults and " ++"memory usage of selected processes." ++msgstr "" ++ ++msgid "" ++"The rrdtool plugin stores the collected data in rrd database files, the " ++"foundation of the diagrams.

    Warning: Setting the wrong " ++"values will result in a very high memory consumption in the temporary " ++"directory. This can render the device unusable!" ++msgstr "" ++ ++msgid "" ++"The splash leases plugin uses libuci to collect statistics about splash " ++"leases." ++msgstr "" ++ ++msgid "" ++"The statistics package is based on Collectd and uses RRD " ++"Tool to render diagram images from collected data." ++msgstr "" ++ ++msgid "" ++"The tcpconns plugin collects informations about open tcp connections on " ++"selected ports." ++msgstr "" ++ ++msgid "" ++"The unixsock plugin creates a unix socket which can be used to read " ++"collected data from a running collectd instance." ++msgstr "" ++ ++msgid "The uptime plugin collects statistics about the uptime of the system." ++msgstr "" ++ ++msgid "" ++"This section defines on which interfaces collectd will wait for incoming " ++"connections." ++msgstr "" ++ ++msgid "" ++"This section defines to which servers the locally collected data is sent to." ++msgstr "" ++ ++msgid "Try to lookup fully qualified hostname" ++msgstr "" ++ ++msgid "UPS" ++msgstr "" ++ ++msgid "UPS Plugin Configuration" ++msgstr "" ++ ++msgid "UPS name in NUT ups@host format" ++msgstr "" ++ ++msgid "UnixSock" ++msgstr "" ++ ++msgid "Unixsock Plugin Configuration" ++msgstr "" ++ ++msgid "Uptime" ++msgstr "" ++ ++msgid "Uptime Plugin Configuration" ++msgstr "" ++ ++msgid "Used PID file" ++msgstr "" ++ ++msgid "User" ++msgstr "" ++ ++msgid "Verbose monitoring" ++msgstr "" ++ ++msgid "Wireless" ++msgstr "" ++ ++msgid "Wireless iwinfo Plugin Configuration" ++msgstr "" ++ ++msgid "e.g. br-ff" ++msgstr "" ++ ++msgid "e.g. br-lan" ++msgstr "" ++ ++msgid "e.g. reject-with tcp-reset" ++msgstr "" ++ ++msgid "max. 16 chars" ++msgstr "" ++ ++msgid "reduces rrd size" ++msgstr "" ++ ++msgid "seconds; multiple separated by space" ++msgstr "" ++ ++msgid "server interfaces" ++msgstr "" +diff --git a/feeds/luci/applications/luci-app-statistics/root/etc/config/luci_statistics b/feeds/luci/applications/luci-app-statistics/root/etc/config/luci_statistics +new file mode 100644 +index 0000000..abcee3e +--- /dev/null ++++ b/feeds/luci/applications/luci-app-statistics/root/etc/config/luci_statistics +@@ -0,0 +1,153 @@ ++# general settings ++ ++config statistics 'collectd' ++ option BaseDir '/var/run/collectd' ++ option Include '/etc/collectd/conf.d' ++ option PIDFile '/var/run/collectd.pid' ++ option PluginDir '/usr/lib/collectd' ++ option TypesDB '/usr/share/collectd/types.db' ++ option Interval '30' ++ option ReadThreads '2' ++ ++config statistics 'rrdtool' ++ option default_timespan '1hour' ++ option image_width '600' ++ option image_path '/tmp/rrdimg' ++ ++# output plugins ++ ++config statistics 'collectd_rrdtool' ++ option enable '1' ++ option DataDir '/tmp/rrd' ++ option RRARows '100' ++ option RRASingle '1' ++ option RRATimespans '1hour 1day 1week 1month 1year' ++ ++config statistics 'collectd_csv' ++ option enable '0' ++ option StoreRates '0' ++ option DataDir '/tmp' ++ ++config statistics 'collectd_email' ++ option enable '0' ++ option SocketFile '/var/run/collectd/email.sock' ++ option SocketGroup 'nogroup' ++ ++config statistics 'collectd_logfile' ++ option enable '0' ++ option LogLevel 'notice' ++ option File '/var/log/collectd.log' ++ option Timestamp '1' ++ ++config statistics 'collectd_network' ++ option enable '0' ++ ++config statistics 'collectd_unixsock' ++ option enable '0' ++ option SocketFile '/var/run/collectd/query.sock' ++ option SocketGroup 'nogroup' ++ ++# input plugins ++ ++config statistics 'collectd_conntrack' ++ option enable '0' ++ ++config statistics 'collectd_cpu' ++ option enable '0' ++ ++config statistics 'collectd_df' ++ option enable '0' ++ option Devices '/dev/mtdblock/4' ++ option MountPoints '/jffs' ++ option FSTypes 'tmpfs' ++ option IgnoreSelected '0' ++ ++config statistics 'collectd_disk' ++ option enable '0' ++ option Disks 'hda1 hdb' ++ option IgnoreSelected '0' ++ ++config statistics 'collectd_dns' ++ option enable '0' ++ option Interfaces 'br-lan' ++ option IgnoreSources '127.0.0.1' ++ ++config statistics 'collectd_entropy' ++ option enable '0' ++ ++config statistics 'collectd_exec' ++ option enable '0' ++ ++config statistics 'collectd_interface' ++ option enable '1' ++ option Interfaces 'br-lan' ++ option IgnoreSelected '0' ++ ++config statistics 'collectd_iptables' ++ option enable '0' ++ ++config collectd_iptables_match ++ option table 'nat' ++ option chain 'luci_fw_postrouting' ++ option target 'MASQUERADE' ++ option source '192.168.1.0/24' ++ option outputif 'br-ff' ++ option name 'LAN-Clients traffic' ++ ++config collectd_iptables_match ++ option chain 'luci_fw_postrouting' ++ option table 'nat' ++ option target 'MASQUERADE' ++ option source '10.61.230.0/24' ++ option outputif 'br-ff' ++ option name 'WLAN-Clients traffic' ++ ++config statistics 'collectd_irq' ++ option enable '0' ++ option Irqs '2 3 4 7' ++ ++config statistics 'collectd_iwinfo' ++ option enable '1' ++ ++config statistics 'collectd_load' ++ option enable '1' ++ ++config statistics 'collectd_memory' ++ option enable '0' ++ ++config statistics 'collectd_netlink' ++ option enable '0' ++ option IgnoreSelected '0' ++ option VerboseInterfaces 'br-lan' ++ option QDiscs 'br-lan' ++ ++config statistics 'collectd_nut' ++ option enable '0' ++ option UPS 'myupsname' ++ ++config statistics 'collectd_olsrd' ++ option enable '0' ++ option Port '2006' ++ option Host '127.0.0.1' ++ ++config statistics 'collectd_ping' ++ option enable '0' ++ option TTL '127' ++ option Interval '30' ++ option Hosts '127.0.0.1' ++ ++config statistics 'collectd_processes' ++ option enable '0' ++ option Processes 'uhttpd dnsmasq dropbear' ++ ++config statistics 'collectd_splash_leases' ++ option enable '0' ++ ++config statistics 'collectd_tcpconns' ++ option enable '0' ++ option ListeningPorts '0' ++ option LocalPorts '22 80' ++ ++config statistics 'collectd_uptime' ++ option enable '0' ++ +diff --git a/feeds/luci/applications/luci-app-statistics/root/etc/init.d/luci_statistics b/feeds/luci/applications/luci-app-statistics/root/etc/init.d/luci_statistics +new file mode 100755 +index 0000000..ab75b69 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-statistics/root/etc/init.d/luci_statistics +@@ -0,0 +1,25 @@ ++#!/bin/sh /etc/rc.common ++START=79 ++ ++start() { ++ ### replace shipped config with symlink ++ mkdir -p /var/etc ++ if [ ! -L /etc/collectd.conf ]; then ++ test -f /etc/collectd.conf && mv /etc/collectd.conf /etc/collectd.conf.bak ++ ln -s /var/etc/collectd.conf /etc/collectd.conf ++ fi ++ ++ ### create config ++ /usr/bin/stat-genconfig > /var/etc/collectd.conf ++ ++ ### workaround broken permissions on /tmp ++ chmod 1777 /tmp ++} ++ ++restart() { ++ ### regenerate config / prepare environment ++ start ++ ++ ### restart collectd ++ /etc/init.d/collectd restart ++} +diff --git a/feeds/luci/applications/luci-app-statistics/root/etc/uci-defaults/luci-statistics b/feeds/luci/applications/luci-app-statistics/root/etc/uci-defaults/luci-statistics +new file mode 100755 +index 0000000..28e3529 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-statistics/root/etc/uci-defaults/luci-statistics +@@ -0,0 +1,16 @@ ++#!/bin/sh ++ ++# register commit handler ++uci -q batch <<-EOF >/dev/null ++ delete ucitrack.@luci_statistics[-1] ++ add ucitrack luci_statistics ++ set ucitrack.@luci_statistics[-1].init=luci_statistics ++ commit ucitrack ++EOF ++ ++# symlink for busybox httpd ++[ -x /usr/sbin/httpd ] && [ ! -h /www/rrdimg ] && \ ++ ln -s /tmp/rrdimg /www/rrdimg ++ ++rm -f /tmp/luci-indexcache ++exit 0 +diff --git a/feeds/luci/applications/luci-app-statistics/root/usr/bin/stat-genconfig b/feeds/luci/applications/luci-app-statistics/root/usr/bin/stat-genconfig +new file mode 100755 +index 0000000..8acae46 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-statistics/root/usr/bin/stat-genconfig +@@ -0,0 +1,444 @@ ++#!/usr/bin/lua ++ ++--[[ ++ ++Luci statistics - collectd configuration generator ++(c) 2008 Freifunk Leipzig / Jo-Philipp Wich ++ ++Licensed under the Apache License, Version 2.0 (the "License"); ++you may not use this file except in compliance with the License. ++You may obtain a copy of the License at ++ ++ http://www.apache.org/licenses/LICENSE-2.0 ++ ++$Id$ ++ ++]]-- ++ ++ ++require("luci.model.uci") ++require("luci.sys.iptparser") ++require("luci.util") ++ ++local ipt = luci.sys.iptparser.IptParser() ++local uci = luci.model.uci.cursor() ++local sections = uci:get_all( "luci_statistics" ) ++ ++ ++function print(...) ++ nixio.stdout:write(...) ++ nixio.stdout:write("\n") ++end ++ ++function section( plugin ) ++ ++ local config = sections[ "collectd_" .. plugin ] or sections["collectd"] ++ ++ if type(config) == "table" and ( plugin == "collectd" or config.enable == "1" ) then ++ ++ local params = "" ++ ++ if type( plugins[plugin] ) == "function" then ++ params = plugins[plugin]( config ) ++ else ++ params = config_generic( config, plugins[plugin][1], plugins[plugin][2], plugins[plugin][3], plugin == "collectd" ) ++ end ++ ++ ++ if plugin ~= "collectd" then ++ print( "LoadPlugin " .. plugin ) ++ ++ if params:len() > 0 then ++ print( "\n" .. params .. "\n" ) ++ else ++ print( "" ) ++ end ++ else ++ print( params .. "\n" ) ++ end ++ end ++end ++ ++function config_generic( c, singles, bools, lists, nopad ) ++ local str = "" ++ ++ if type(c) == "table" then ++ ++ if type(singles) == "table" then ++ for i, key in ipairs( singles ) do ++ if preprocess[key] then ++ c[key] = preprocess[key](c[key]) ++ end ++ ++ str = str .. _string( c[key], key, nopad ) ++ end ++ end ++ ++ if type(bools) == "table" then ++ for i, key in ipairs( bools ) do ++ if preprocess[key] then ++ c[key] = preprocess[key](c[key]) ++ end ++ ++ str = str .. _bool( c[key], key, nopad ) ++ end ++ end ++ ++ if type(lists) == "table" then ++ str = str .. _list_expand( c, lists, nopad ) ++ end ++ end ++ ++ return str ++end ++ ++function config_exec( c ) ++ local str = "" ++ ++ for s in pairs(sections) do ++ for key, type in pairs({ Exec="collectd_exec_input", NotificationExec="collectd_exec_notify" }) do ++ if sections[s][".type"] == type then ++ ++ cmd = sections[s].cmdline ++ ++ if cmd then ++ cmd = cmd:gsub("^%s+", ""):gsub("%s+$", "") ++ user = sections[s].cmduser or "nobody" ++ group = sections[s].cmdgroup ++ ++ str = str .. "\t" .. key .. ' "' .. ++ user .. ( group and ":" .. group or "" ) .. '" "' .. ++ cmd:gsub('%s+', '" "') .. '"\n' ++ end ++ end ++ end ++ end ++ ++ return str ++end ++ ++function config_iptables( c ) ++ local str = "" ++ ++ for s in pairs(sections) do ++ if sections[s][".type"] == "collectd_iptables_match" then ++ ++ search = { } ++ ++ for i, k in ipairs( { ++ "table", "chain", "target", "protocol", "source", "destination", ++ "inputif", "outputif", "options" ++ } ) do ++ v = sections[s][k] ++ ++ if type(v) == "string" then ++ if k == "options" then v = luci.util.split( v, "%s+", nil, true ) end ++ search[k] = v ++ end ++ end ++ ++ for i, rule in ipairs( ipt:find( search ) ) do ++ ++ name = sections[s].name:gsub( "%s+", "_" ) ++ if i > 1 then name = name .. "_(" .. i .. ")" end ++ ++ str = str .. "\tChain " .. rule.table .. " " .. rule.chain .. " " .. rule.index .. ' "' .. name .. "\"\n" ++ end ++ end ++ end ++ ++ return str ++end ++ ++function config_network( c ) ++ local str = "" ++ ++ for s in pairs(sections) do ++ for key, type in pairs({ Listen="collectd_network_listen", Server="collectd_network_server" }) do ++ if sections[s][".type"] == type then ++ ++ host = sections[s].host ++ port = sections[s].port ++ ++ if host then ++ if port then ++ str = str .. "\t" .. key .. " \"" .. host .. "\" \"" .. port .. "\"\n" ++ else ++ str = str .. "\t" .. key .. " \"" .. host .. "\"\n" ++ end ++ end ++ end ++ end ++ end ++ ++ return str .. _string( c["TimeToLive"], "TimeToLive" ) ++ .. _string( c["CacheFlush"], "CacheFlush" ) ++ .. _bool( c["Forward"], "Forward" ) ++end ++ ++ ++function _list_expand( c, l, nopad ) ++ local str = "" ++ ++ for i, n in ipairs(l) do ++ if c[n] then ++ if preprocess[n] then ++ c[n] = preprocess[n](c[n]) ++ end ++ ++ if n:find("(%w+)ses") then ++ k = n:gsub("(%w+)ses", "%1s") ++ else ++ k = n:gsub("(%w+)s", "%1") ++ end ++ ++ str = str .. _expand( c[n], k, nopad ) ++ end ++ end ++ ++ return str ++end ++ ++function _expand( s, n, nopad ) ++ local str = "" ++ ++ if type(s) == "string" then ++ for i, v in ipairs( luci.util.split( s, "%s+", nil, true ) ) do ++ str = str .. _string( v, n, nopad ) ++ end ++ elseif type(s) == "table" then ++ for i, v in ipairs(s) do ++ str = str .. _string( v, n, nopad ) ++ end ++ end ++ ++ return str ++end ++ ++function _bool( s, n, nopad ) ++ ++ local str = "" ++ local pad = "" ++ if not nopad then pad = "\t" end ++ ++ if s and s == "1" then ++ str = pad .. n .. " true" ++ else ++ str = pad .. n .. " false" ++ end ++ ++ return str .. "\n" ++end ++ ++function _string( s, n, nopad ) ++ ++ local str = "" ++ local pad = "" ++ if not nopad then pad = "\t" end ++ ++ if s then ++ if s:find("[^%d]") or n == "Port" then ++ if not s:find("[^%w]") and n ~= "Port" then ++ str = pad .. n .. " " .. luci.util.trim(s) ++ else ++ str = pad .. n .. ' "' .. luci.util.trim(s) .. '"' ++ end ++ else ++ str = pad .. n .. " " .. luci.util.trim(s) ++ end ++ ++ str = str .. "\n" ++ end ++ ++ return str ++end ++ ++ ++plugins = { ++ collectd = { ++ { "BaseDir", "Include", "PIDFile", "PluginDir", "TypesDB", "Interval", "ReadThreads", "Hostname" }, ++ { }, ++ { } ++ }, ++ ++ conntrack = { ++ { }, ++ { }, ++ { } ++ }, ++ ++ cpu = { ++ { }, ++ { }, ++ { } ++ }, ++ ++ csv = { ++ { "DataDir" }, ++ { "StoreRates" }, ++ { } ++ }, ++ ++ df = { ++ { }, ++ { "IgnoreSelected" }, ++ { "Devices", "MountPoints", "FSTypes" } ++ }, ++ ++ disk = { ++ { }, ++ { "IgnoreSelected" }, ++ { "Disks" } ++ }, ++ ++ dns = { ++ { }, ++ { }, ++ { "Interfaces", "IgnoreSources" } ++ }, ++ ++ email = { ++ { "SocketFile", "SocketGroup", "SocketPerms", "MaxConns" }, ++ { }, ++ { } ++ }, ++ ++ entropy = { ++ { }, ++ { }, ++ { } ++ }, ++ ++ exec = config_exec, ++ ++ interface = { ++ { }, ++ { "IgnoreSelected" }, ++ { "Interfaces" } ++ }, ++ ++ iptables = config_iptables, ++ ++ irq = { ++ { }, ++ { "IgnoreSelected" }, ++ { "Irqs" } ++ }, ++ ++ iwinfo = { ++ { }, ++ { "IgnoreSelected" }, ++ { "Interfaces" } ++ }, ++ ++ load = { ++ { }, ++ { }, ++ { } ++ }, ++ ++ logfile = { ++ { "LogLevel", "File" }, ++ { "Timestamp" }, ++ { } ++ }, ++ ++ madwifi = { ++ { "WatchSet" }, ++ { }, ++ { "Interfaces", "WatchAdds" } ++ }, ++ ++ memory = { ++ { }, ++ { }, ++ { } ++ }, ++ ++ netlink = { ++ { }, ++ { "IgnoreSelected" }, ++ { "Interfaces", "VerboseInterfaces", "QDiscs", "Classes", "Filters" } ++ }, ++ ++ network = config_network, ++ ++ nut = { ++ { "UPS" }, ++ { }, ++ { } ++ }, ++ ++ olsrd = { ++ { "Host", "Port", "CollectLinks","CollectRoutes","CollectTopology"}, ++ { }, ++ { } ++ }, ++ ++ ping = { ++ { "TTL", "Interval" }, ++ { }, ++ { "Hosts" } ++ }, ++ ++ processes = { ++ { }, ++ { }, ++ { "Processes" } ++ }, ++ ++ rrdtool = { ++ { "DataDir", "StepSize", "HeartBeat", "RRARows", "XFF", "CacheFlush", "CacheTimeout" }, ++ { "RRASingle" }, ++ { "RRATimespans" } ++ }, ++ ++ splash_leases = { ++ { }, ++ { }, ++ { } ++ }, ++ ++ tcpconns = { ++ { }, ++ { "ListeningPorts" }, ++ { "LocalPorts", "RemotePorts" } ++ }, ++ ++ unixsock = { ++ { "SocketFile", "SocketGroup", "SocketPerms" }, ++ { }, ++ { } ++ }, ++ ++ uptime = { ++ { }, ++ { }, ++ { } ++ }, ++ ++ wireless = { ++ { }, ++ { }, ++ { } ++ }, ++} ++ ++preprocess = { ++ RRATimespans = function(val) ++ local rv = { } ++ for time in val:gmatch("[^%s]+") do ++ table.insert( rv, luci.util.parse_units(time) ) ++ end ++ return table.concat(rv, " ") ++ end ++} ++ ++ ++section("collectd") ++ ++for plugin in pairs(plugins) do ++ if plugin ~= "collectd" then ++ section( plugin ) ++ end ++end +diff --git a/feeds/luci/applications/luci-app-tinyproxy/Makefile b/feeds/luci/applications/luci-app-tinyproxy/Makefile +new file mode 100644 +index 0000000..02751b8 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-tinyproxy/Makefile +@@ -0,0 +1,14 @@ ++# ++# Copyright (C) 2008-2014 The LuCI Team ++# ++# This is free software, licensed under the Apache License, Version 2.0 . ++# ++ ++include $(TOPDIR)/rules.mk ++ ++LUCI_TITLE:=Tinyproxy - HTTP(S)-Proxy configuration ++LUCI_DEPENDS:=+tinyproxy ++ ++include ../../luci.mk ++ ++# call BuildPackage - OpenWrt buildroot signature +diff --git a/feeds/luci/applications/luci-app-tinyproxy/luasrc/controller/tinyproxy.lua b/feeds/luci/applications/luci-app-tinyproxy/luasrc/controller/tinyproxy.lua +new file mode 100644 +index 0000000..cf7e974 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-tinyproxy/luasrc/controller/tinyproxy.lua +@@ -0,0 +1,15 @@ ++-- Copyright 2008 Steven Barth ++-- Copyright 2008 Jo-Philipp Wich ++-- Licensed to the public under the Apache License 2.0. ++ ++module("luci.controller.tinyproxy", package.seeall) ++ ++function index() ++ if not nixio.fs.access("/etc/config/tinyproxy") then ++ return ++ end ++ ++ entry({"admin", "services", "tinyproxy"}, alias("admin", "services", "tinyproxy", "config"), _("Tinyproxy")) ++ entry({"admin", "services", "tinyproxy", "status"}, template("tinyproxy_status"), _("Status")) ++ entry({"admin", "services", "tinyproxy", "config"}, cbi("tinyproxy"), _("Configuration")) ++end +diff --git a/feeds/luci/applications/luci-app-tinyproxy/luasrc/model/cbi/tinyproxy.lua b/feeds/luci/applications/luci-app-tinyproxy/luasrc/model/cbi/tinyproxy.lua +new file mode 100644 +index 0000000..19bdd9a +--- /dev/null ++++ b/feeds/luci/applications/luci-app-tinyproxy/luasrc/model/cbi/tinyproxy.lua +@@ -0,0 +1,239 @@ ++-- Copyright 2008 Steven Barth ++-- Copyright 2008-2010 Jo-Philipp Wich ++-- Licensed to the public under the Apache License 2.0. ++ ++m = Map("tinyproxy", translate("Tinyproxy"), ++ translate("Tinyproxy is a small and fast non-caching HTTP(S)-Proxy")) ++ ++s = m:section(TypedSection, "tinyproxy", translate("Server Settings")) ++s.anonymous = true ++ ++s:tab("general", translate("General settings")) ++s:tab("privacy", translate("Privacy settings")) ++s:tab("filter", translate("Filtering and ACLs")) ++s:tab("limits", translate("Server limits")) ++ ++ ++o = s:taboption("general", Flag, "enabled", translate("Enable Tinyproxy server")) ++o.rmempty = false ++ ++function o.write(self, section, value) ++ if value == "1" then ++ luci.sys.init.enable("tinyproxy") ++ else ++ luci.sys.init.disable("tinyproxy") ++ end ++ ++ return Flag.write(self, section, value) ++end ++ ++ ++o = s:taboption("general", Value, "Port", translate("Listen port"), ++ translate("Specifies the HTTP port Tinyproxy is listening on for requests")) ++ ++o.optional = true ++o.datatype = "port" ++o.placeholder = 8888 ++ ++ ++o = s:taboption("general", Value, "Listen", translate("Listen address"), ++ translate("Specifies the addresses Tinyproxy is listening on for requests")) ++ ++o.optional = true ++o.datatype = "ipaddr" ++o.placeholder = "0.0.0.0" ++ ++ ++o = s:taboption("general", Value, "Bind", translate("Bind address"), ++ translate("Specifies the address Tinyproxy binds to for outbound forwarded requests")) ++ ++o.optional = true ++o.datatype = "ipaddr" ++o.placeholder = "0.0.0.0" ++ ++ ++o = s:taboption("general", Value, "DefaultErrorFile", translate("Error page"), ++ translate("HTML template file to serve when HTTP errors occur")) ++ ++o.optional = true ++o.default = "/usr/share/tinyproxy/default.html" ++ ++ ++o = s:taboption("general", Value, "StatFile", translate("Statistics page"), ++ translate("HTML template file to serve for stat host requests")) ++ ++o.optional = true ++o.default = "/usr/share/tinyproxy/stats.html" ++ ++ ++o = s:taboption("general", Flag, "Syslog", translate("Use syslog"), ++ translate("Writes log messages to syslog instead of a log file")) ++ ++ ++o = s:taboption("general", Value, "LogFile", translate("Log file"), ++ translate("Log file to use for dumping messages")) ++ ++o.default = "/var/log/tinyproxy.log" ++o:depends("Syslog", "") ++ ++ ++o = s:taboption("general", ListValue, "LogLevel", translate("Log level"), ++ translate("Logging verbosity of the Tinyproxy process")) ++ ++o:value("Critical") ++o:value("Error") ++o:value("Warning") ++o:value("Notice") ++o:value("Connect") ++o:value("Info") ++ ++ ++o = s:taboption("general", Value, "User", translate("User"), ++ translate("Specifies the user name the Tinyproxy process is running as")) ++ ++o.default = "nobody" ++ ++ ++o = s:taboption("general", Value, "Group", translate("Group"), ++ translate("Specifies the group name the Tinyproxy process is running as")) ++ ++o.default = "nogroup" ++ ++ ++-- ++-- Privacy ++-- ++ ++o = s:taboption("privacy", Flag, "XTinyproxy", translate("X-Tinyproxy header"), ++ translate("Adds an \"X-Tinyproxy\" HTTP header with the client IP address to forwarded requests")) ++ ++ ++o = s:taboption("privacy", Value, "ViaProxyName", translate("Via hostname"), ++ translate("Specifies the Tinyproxy hostname to use in the Via HTTP header")) ++ ++o.placeholder = "tinyproxy" ++o.datatype = "hostname" ++ ++ ++s:taboption("privacy", DynamicList, "Anonymous", translate("Header whitelist"), ++ translate("Specifies HTTP header names which are allowed to pass-through, all others are discarded. Leave empty to disable header filtering")) ++ ++ ++-- ++-- Filter ++-- ++ ++o = s:taboption("filter", DynamicList, "Allow", translate("Allowed clients"), ++ translate("List of IP addresses or ranges which are allowed to use the proxy server")) ++ ++o.placeholder = "0.0.0.0" ++o.datatype = "ipaddr" ++ ++ ++o = s:taboption("filter", DynamicList, "ConnectPort", translate("Allowed connect ports"), ++ translate("List of allowed ports for the CONNECT method. A single value \"0\" allows all ports")) ++ ++o.placeholder = 0 ++o.datatype = "port" ++ ++ ++s:taboption("filter", FileUpload, "Filter", translate("Filter file"), ++ translate("Plaintext file with URLs or domains to filter. One entry per line")) ++ ++ ++s:taboption("filter", Flag, "FilterURLs", translate("Filter by URLs"), ++ translate("By default, filtering is done based on domain names. Enable this to match against URLs instead")) ++ ++ ++s:taboption("filter", Flag, "FilterExtended", translate("Filter by RegExp"), ++ translate("By default, basic POSIX expressions are used for filtering. Enable this to activate extended regular expressions")) ++ ++ ++ s:taboption("filter", Flag, "FilterCaseSensitive", translate("Filter case-sensitive"), ++ translate("By default, filter strings are treated as case-insensitive. Enable this to make the matching case-sensitive")) ++ ++ ++s:taboption("filter", Flag, "FilterDefaultDeny", translate("Default deny"), ++ translate("By default, the filter rules act as blacklist. Enable this option to only allow matched URLs or domain names")) ++ ++ ++-- ++-- Limits ++-- ++ ++o = s:taboption("limits", Value, "Timeout", translate("Connection timeout"), ++ translate("Maximum number of seconds an inactive connection is held open")) ++ ++o.optional = true ++o.datatype = "uinteger" ++o.default = 600 ++ ++ ++o = s:taboption("limits", Value, "MaxClients", translate("Max. clients"), ++ translate("Maximum allowed number of concurrently connected clients")) ++ ++o.datatype = "uinteger" ++o.default = 10 ++ ++ ++o = s:taboption("limits", Value, "MinSpareServers", translate("Min. spare servers"), ++ translate("Minimum number of prepared idle processes")) ++ ++o.datatype = "uinteger" ++o.default = 5 ++ ++ ++o = s:taboption("limits", Value, "MaxSpareServers", translate("Max. spare servers"), ++ translate("Maximum number of prepared idle processes")) ++ ++o.datatype = "uinteger" ++o.default = 10 ++ ++ ++o = s:taboption("limits", Value, "StartServers", translate("Start spare servers"), ++ translate("Number of idle processes to start when launching Tinyproxy")) ++ ++o.datatype = "uinteger" ++o.default = 5 ++ ++ ++o = s:taboption("limits", Value, "MaxRequestsPerChild", translate("Max. requests per server"), ++ translate("Maximum allowed number of requests per process. If it is exeeded, the process is restarted. Zero means unlimited.")) ++ ++o.datatype = "uinteger" ++o.default = 0 ++ ++ ++-- ++-- Upstream ++-- ++ ++s = m:section(TypedSection, "upstream", translate("Upstream Proxies"), ++ translate("Upstream proxy rules define proxy servers to use when accessing certain IP addresses or domains.")) ++ ++s.anonymous = true ++s.addremove = true ++ ++ ++t = s:option(ListValue, "type", translate("Policy"), ++ translate("Via proxy routes requests to the given target via the specifed upstream proxy, Reject access disables any upstream proxy for the target")) ++ ++t:value("proxy", translate("Via proxy")) ++t:value("reject", translate("Reject access")) ++ ++ ++ta = s:option(Value, "target", translate("Target host"), ++ translate("Can be either an IP address or range, a domain name or \".\" for any host without domain")) ++ ++ta.rmempty = true ++ta.placeholder = "0.0.0.0/0" ++ta.datatype = "host" ++ ++ ++v = s:option(Value, "via", translate("Via proxy"), ++ translate("Specifies the upstream proxy to use for accessing the target host. Format is address:port")) ++ ++v:depends({type="proxy"}) ++v.placeholder = "10.0.0.1:8080" ++ ++return m +diff --git a/feeds/luci/applications/luci-app-tinyproxy/luasrc/view/tinyproxy_status.htm b/feeds/luci/applications/luci-app-tinyproxy/luasrc/view/tinyproxy_status.htm +new file mode 100644 +index 0000000..c85a206 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-tinyproxy/luasrc/view/tinyproxy_status.htm +@@ -0,0 +1,50 @@ ++<% ++ ++if luci.http.formvalue("frame") == "1" then ++ local uci = require "luci.model.uci".cursor() ++ local addr = "127.0.0.1" ++ local port = "8888" ++ ++ uci:foreach("tinyproxy", "tinyproxy", ++ function(s) ++ addr = s.StatHost or addr ++ port = s.Port or port ++ return false ++ end) ++ ++ local data = false ++ local wget = io.popen("wget -qO- http://%s:%s" % { addr, port }) ++ if wget then ++ while true do ++ local l = wget:read("*l") ++ if not l then ++ break ++ end ++ ++ luci.http.write(l) ++ data = true ++ end ++ ++ wget:close() ++ end ++ ++ if not data then ++ luci.http.write(translate("Failed to retrieve statistics from url:")) ++ luci.http.write(" http://%s:%s" % { addr, port }) ++ end ++ ++ return ++end ++ ++-%> ++ ++<%+header%> ++ ++
    ++

    <%:Tinyproxy Status%>

    ++
    ++ ++
    ++
    ++ ++<%+footer%> +diff --git a/feeds/luci/applications/luci-app-tinyproxy/po/ca/tinyproxy.po b/feeds/luci/applications/luci-app-tinyproxy/po/ca/tinyproxy.po +new file mode 100644 +index 0000000..69cd99e +--- /dev/null ++++ b/feeds/luci/applications/luci-app-tinyproxy/po/ca/tinyproxy.po +@@ -0,0 +1,339 @@ ++# tinyproxy.pot ++# generated from ./applications/luci-tinyproxy/luasrc/i18n/tinyproxy.en.lua ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Report-Msgid-Bugs-To: \n" ++"POT-Creation-Date: 2009-06-10 03:40+0200\n" ++"PO-Revision-Date: 2014-07-18 00:04+0200\n" ++"Last-Translator: Alex \n" ++"Language-Team: LANGUAGE \n" ++"Language: ca\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n != 1);\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "" ++"Via proxy routes requests to the given target via the specifed " ++"upstream proxy, Reject access disables any upstream proxy for the " ++"target" ++msgstr "" ++ ++msgid "" ++"Adds an \"X-Tinyproxy\" HTTP header with the client IP address to forwarded " ++"requests" ++msgstr "" ++ ++msgid "Allowed clients" ++msgstr "Clients permesos" ++ ++msgid "Allowed connect ports" ++msgstr "Ports de connexió permesos" ++ ++msgid "Bind address" ++msgstr "" ++ ++msgid "" ++"By default, basic POSIX expressions are used for filtering. Enable this to " ++"activate extended regular expressions" ++msgstr "" ++ ++msgid "" ++"By default, filter strings are treated as case-insensitive. Enable this to " ++"make the matching case-sensitive" ++msgstr "" ++ ++msgid "" ++"By default, filtering is done based on domain names. Enable this to match " ++"against URLs instead" ++msgstr "" ++ ++msgid "" ++"By default, the filter rules act as blacklist. Enable this option to only " ++"allow matched URLs or domain names" ++msgstr "" ++ ++msgid "" ++"Can be either an IP address or range, a domain name or \".\" for any host " ++"without domain" ++msgstr "" ++ ++msgid "Configuration" ++msgstr "Configuració" ++ ++msgid "Connection timeout" ++msgstr "Temps d'espera de connexió" ++ ++msgid "Default deny" ++msgstr "" ++ ++msgid "Enable Tinyproxy server" ++msgstr "Habilita el servidor Tinyproxy" ++ ++msgid "Error page" ++msgstr "Pàgina d'error" ++ ++msgid "Failed to retrieve statistics from url:" ++msgstr "" ++ ++msgid "Filter by RegExp" ++msgstr "Filtra per expressió regular" ++ ++msgid "Filter by URLs" ++msgstr "Filtra per adreça" ++ ++msgid "Filter case-sensitive" ++msgstr "" ++ ++msgid "Filter file" ++msgstr "Fitxer de filtració" ++ ++msgid "Filtering and ACLs" ++msgstr "Filtració i ACLs" ++ ++msgid "General settings" ++msgstr "Ajusts generals" ++ ++msgid "Group" ++msgstr "Grup" ++ ++msgid "HTML template file to serve for stat host requests" ++msgstr "" ++ ++msgid "HTML template file to serve when HTTP errors occur" ++msgstr "" ++ ++msgid "Header whitelist" ++msgstr "Llista blanca de capçaleres" ++ ++msgid "" ++"List of IP addresses or ranges which are allowed to use the proxy server" ++msgstr "" ++"Llista d'adreces IP o rangs dels quals es permeten utilitzar el servidor " ++"intermediari" ++ ++msgid "" ++"List of allowed ports for the CONNECT method. A single value \"0\" allows " ++"all ports" ++msgstr "" ++"Llista de ports permesos per al mètode CONNECT. El valor solter \"0\" permet " ++"tots els ports" ++ ++msgid "Listen address" ++msgstr "Adreça d'escolta" ++ ++msgid "Listen port" ++msgstr "Port d'escolta" ++ ++msgid "Log file" ++msgstr "Fitxer de registre" ++ ++msgid "Log file to use for dumping messages" ++msgstr "" ++ ++msgid "Log level" ++msgstr "Nivell de registre" ++ ++msgid "Logging verbosity of the Tinyproxy process" ++msgstr "" ++ ++msgid "Max. clients" ++msgstr "" ++ ++msgid "Max. requests per server" ++msgstr "" ++ ++msgid "Max. spare servers" ++msgstr "Màx servidors spare" ++ ++msgid "Maximum allowed number of concurrently connected clients" ++msgstr "" ++ ++msgid "" ++"Maximum allowed number of requests per process. If it is exeeded, the " ++"process is restarted. Zero means unlimited." ++msgstr "" ++ ++msgid "Maximum number of prepared idle processes" ++msgstr "" ++ ++msgid "Maximum number of seconds an inactive connection is held open" ++msgstr "" ++ ++msgid "Min. spare servers" ++msgstr "Mín servidors spare" ++ ++msgid "Minimum number of prepared idle processes" ++msgstr "Nombre mínim de processos ociosos preparats" ++ ++msgid "Number of idle processes to start when launching Tinyproxy" ++msgstr "Nombre de processos ociosos que iniciar al iniciar el Tinyproxy" ++ ++msgid "Plaintext file with URLs or domains to filter. One entry per line" ++msgstr "" ++ ++msgid "Policy" ++msgstr "Política" ++ ++msgid "Privacy settings" ++msgstr "Ajusts de privacitat" ++ ++msgid "Reject access" ++msgstr "Rebutja accés" ++ ++msgid "Server Settings" ++msgstr "Ajusts de servidor" ++ ++msgid "Server limits" ++msgstr "Límits de servidor" ++ ++msgid "" ++"Specifies HTTP header names which are allowed to pass-through, all others " ++"are discarded. Leave empty to disable header filtering" ++msgstr "" ++ ++msgid "Specifies the HTTP port Tinyproxy is listening on for requests" ++msgstr "" ++ ++msgid "Specifies the Tinyproxy hostname to use in the Via HTTP header" ++msgstr "" ++ ++msgid "" ++"Specifies the address Tinyproxy binds to for outbound forwarded requests" ++msgstr "" ++ ++msgid "Specifies the addresses Tinyproxy is listening on for requests" ++msgstr "" ++ ++msgid "Specifies the group name the Tinyproxy process is running as" ++msgstr "" ++ ++msgid "" ++"Specifies the upstream proxy to use for accessing the target host. Format is " ++"address:port" ++msgstr "" ++ ++msgid "Specifies the user name the Tinyproxy process is running as" ++msgstr "" ++ ++msgid "Start spare servers" ++msgstr "" ++ ++msgid "Statistics page" ++msgstr "Pàgina d'estadístiques" ++ ++msgid "Status" ++msgstr "Estat" ++ ++msgid "Target host" ++msgstr "Màquina destí" ++ ++msgid "Tinyproxy" ++msgstr "Tinyproxy" ++ ++msgid "Tinyproxy Status" ++msgstr "Estat de Tinyproxy" ++ ++msgid "Tinyproxy is a small and fast non-caching HTTP(S)-Proxy" ++msgstr "Tinyproxy és un proxy HTTP no caché petit i ràpid" ++ ++msgid "Upstream Proxies" ++msgstr "" ++ ++msgid "" ++"Upstream proxy rules define proxy servers to use when accessing certain IP " ++"addresses or domains." ++msgstr "" ++ ++msgid "Use syslog" ++msgstr "Utilitza el syslog" ++ ++msgid "User" ++msgstr "Usuari" ++ ++msgid "Via hostname" ++msgstr "Via nom de host" ++ ++msgid "Via proxy" ++msgstr "Via proxy" ++ ++msgid "Writes log messages to syslog instead of a log file" ++msgstr "" ++"Escriu els missatges de registre al syslog en lloc d'un fitxer de registre" ++ ++msgid "X-Tinyproxy header" ++msgstr "Capçalera X-Tinyproxy" ++ ++#~ msgid "Allow access from" ++#~ msgstr "Permet l'accés des de" ++ ++#~ msgid "Allowed headers for anonymous proxy" ++#~ msgstr "Capçaleres permeses pel proxy anònim" ++ ++#~ msgid "Bind outgoing traffic to address" ++#~ msgstr "Vincula el tràfic sortint a l'adreça" ++ ++#~ msgid "Ports allowed for CONNECT method" ++#~ msgstr "Ports permesos pel mètode CONNECT" ++ ++#~ msgid "0 = disabled, empty = all" ++#~ msgstr "0 = desactivats, buit = tots" ++ ++#~ msgid "Error document" ++#~ msgstr "Document d'error" ++ ++#~ msgid "Filter list" ++#~ msgstr "Llista de filtre" ++ ++#~ msgid "Case sensitive filters" ++#~ msgstr "Filtres distingint majúscules i minúscules" ++ ++#~ msgid "Filter list is a whitelist" ++#~ msgstr "La llista de filtre és una llista blanca" ++ ++#~ msgid "Extended regular expression filters" ++#~ msgstr "Filtres d'expressions regulars exteses" ++ ++#~ msgid "Filter URLs instead of domains" ++#~ msgstr "Filtra URLs en comptes de dominis" ++ ++#~ msgid "Listen on address" ++#~ msgstr "Escolta a l'adreça" ++ ++#~ msgid "Logfile" ++#~ msgstr "Fitxer de registre" ++ ++#~ msgid "Maximum number of clients" ++#~ msgstr "Màxim número de clients" ++ ++#~ msgid "Maximum requests per thread" ++#~ msgstr "Màximes peticions per fil" ++ ++#~ msgid "Spare servers to start with" ++#~ msgstr "Servidors spare amb els que començar" ++ ++#~ msgid "Statistic document" ++#~ msgstr "Document estadístic" ++ ++#~ msgid "Write to syslog" ++#~ msgstr "Escriu al syslog" ++ ++#~ msgid "Connection Timeout" ++#~ msgstr "Temps d'espera excedit" ++ ++#~ msgid "Value of Via-Header" ++#~ msgstr "Valor de Via-Header" ++ ++#~ msgid "Include client IP" ++#~ msgstr "Inclou client IP" ++ ++#~ msgid "Upstream Control" ++#~ msgstr "Control de pujada" ++ ++#~ msgid "Type" ++#~ msgstr "Tipus" ++ ++#~ msgid "Upstream Proxy" ++#~ msgstr "Proxy de pujada" +diff --git a/feeds/luci/applications/luci-app-tinyproxy/po/cs/tinyproxy.po b/feeds/luci/applications/luci-app-tinyproxy/po/cs/tinyproxy.po +new file mode 100644 +index 0000000..2a2cbdc +--- /dev/null ++++ b/feeds/luci/applications/luci-app-tinyproxy/po/cs/tinyproxy.po +@@ -0,0 +1,258 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"PO-Revision-Date: 2014-07-12 20:14+0200\n" ++"Last-Translator: koli \n" ++"Language-Team: none\n" ++"Language: cs\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "" ++"Via proxy routes requests to the given target via the specifed " ++"upstream proxy, Reject access disables any upstream proxy for the " ++"target" ++msgstr "" ++ ++msgid "" ++"Adds an \"X-Tinyproxy\" HTTP header with the client IP address to forwarded " ++"requests" ++msgstr "" ++ ++msgid "Allowed clients" ++msgstr "" ++ ++msgid "Allowed connect ports" ++msgstr "" ++ ++msgid "Bind address" ++msgstr "" ++ ++msgid "" ++"By default, basic POSIX expressions are used for filtering. Enable this to " ++"activate extended regular expressions" ++msgstr "" ++ ++msgid "" ++"By default, filter strings are treated as case-insensitive. Enable this to " ++"make the matching case-sensitive" ++msgstr "" ++ ++msgid "" ++"By default, filtering is done based on domain names. Enable this to match " ++"against URLs instead" ++msgstr "" ++ ++msgid "" ++"By default, the filter rules act as blacklist. Enable this option to only " ++"allow matched URLs or domain names" ++msgstr "" ++ ++msgid "" ++"Can be either an IP address or range, a domain name or \".\" for any host " ++"without domain" ++msgstr "" ++ ++msgid "Configuration" ++msgstr "Konfigurace" ++ ++msgid "Connection timeout" ++msgstr "" ++ ++msgid "Default deny" ++msgstr "" ++ ++msgid "Enable Tinyproxy server" ++msgstr "Povolit server Tinyproxy" ++ ++msgid "Error page" ++msgstr "Chybová stránka" ++ ++msgid "Failed to retrieve statistics from url:" ++msgstr "" ++ ++msgid "Filter by RegExp" ++msgstr "Filtrovat podle RegExp" ++ ++msgid "Filter by URLs" ++msgstr "Filtrovat podle URL adres" ++ ++msgid "Filter case-sensitive" ++msgstr "" ++ ++msgid "Filter file" ++msgstr "" ++ ++msgid "Filtering and ACLs" ++msgstr "" ++ ++msgid "General settings" ++msgstr "Obecné nastavení" ++ ++msgid "Group" ++msgstr "Skupina" ++ ++msgid "HTML template file to serve for stat host requests" ++msgstr "" ++ ++msgid "HTML template file to serve when HTTP errors occur" ++msgstr "" ++ ++msgid "Header whitelist" ++msgstr "" ++ ++msgid "" ++"List of IP addresses or ranges which are allowed to use the proxy server" ++msgstr "" ++ ++msgid "" ++"List of allowed ports for the CONNECT method. A single value \"0\" allows " ++"all ports" ++msgstr "" ++ ++msgid "Listen address" ++msgstr "" ++ ++msgid "Listen port" ++msgstr "" ++ ++msgid "Log file" ++msgstr "" ++ ++msgid "Log file to use for dumping messages" ++msgstr "" ++ ++msgid "Log level" ++msgstr "" ++ ++msgid "Logging verbosity of the Tinyproxy process" ++msgstr "" ++ ++msgid "Max. clients" ++msgstr "Max. klientů" ++ ++msgid "Max. requests per server" ++msgstr "Max. žádostí na server" ++ ++msgid "Max. spare servers" ++msgstr "Max. záložních serverů" ++ ++msgid "Maximum allowed number of concurrently connected clients" ++msgstr "" ++ ++msgid "" ++"Maximum allowed number of requests per process. If it is exeeded, the " ++"process is restarted. Zero means unlimited." ++msgstr "" ++ ++msgid "Maximum number of prepared idle processes" ++msgstr "" ++ ++msgid "Maximum number of seconds an inactive connection is held open" ++msgstr "" ++ ++msgid "Min. spare servers" ++msgstr "Min. záložních serverů" ++ ++msgid "Minimum number of prepared idle processes" ++msgstr "" ++ ++msgid "Number of idle processes to start when launching Tinyproxy" ++msgstr "" ++ ++msgid "Plaintext file with URLs or domains to filter. One entry per line" ++msgstr "" ++ ++msgid "Policy" ++msgstr "Politika" ++ ++msgid "Privacy settings" ++msgstr "Nastavení soukromí" ++ ++msgid "Reject access" ++msgstr "Odepřít přístup" ++ ++msgid "Server Settings" ++msgstr "Nastavení serveru" ++ ++msgid "Server limits" ++msgstr "" ++ ++msgid "" ++"Specifies HTTP header names which are allowed to pass-through, all others " ++"are discarded. Leave empty to disable header filtering" ++msgstr "" ++ ++msgid "Specifies the HTTP port Tinyproxy is listening on for requests" ++msgstr "" ++ ++msgid "Specifies the Tinyproxy hostname to use in the Via HTTP header" ++msgstr "" ++ ++msgid "" ++"Specifies the address Tinyproxy binds to for outbound forwarded requests" ++msgstr "" ++ ++msgid "Specifies the addresses Tinyproxy is listening on for requests" ++msgstr "" ++ ++msgid "Specifies the group name the Tinyproxy process is running as" ++msgstr "" ++ ++msgid "" ++"Specifies the upstream proxy to use for accessing the target host. Format is " ++"address:port" ++msgstr "" ++ ++msgid "Specifies the user name the Tinyproxy process is running as" ++msgstr "" ++ ++msgid "Start spare servers" ++msgstr "" ++ ++msgid "Statistics page" ++msgstr "Stránka statistik" ++ ++msgid "Status" ++msgstr "Stav" ++ ++msgid "Target host" ++msgstr "Cílový hostitel" ++ ++msgid "Tinyproxy" ++msgstr "Tinyproxy" ++ ++msgid "Tinyproxy Status" ++msgstr "Stav Tinyproxy" ++ ++msgid "Tinyproxy is a small and fast non-caching HTTP(S)-Proxy" ++msgstr "Tinyproxy je malý a rychlý necachující HTTP(S)-Proxy server" ++ ++msgid "Upstream Proxies" ++msgstr "" ++ ++msgid "" ++"Upstream proxy rules define proxy servers to use when accessing certain IP " ++"addresses or domains." ++msgstr "" ++ ++msgid "Use syslog" ++msgstr "Použít syslog" ++ ++msgid "User" ++msgstr "Uživatel" ++ ++msgid "Via hostname" ++msgstr "" ++ ++msgid "Via proxy" ++msgstr "" ++ ++msgid "Writes log messages to syslog instead of a log file" ++msgstr "" ++ ++msgid "X-Tinyproxy header" ++msgstr "X-Tinyproxy hlaviÄka" +diff --git a/feeds/luci/applications/luci-app-tinyproxy/po/de/tinyproxy.po b/feeds/luci/applications/luci-app-tinyproxy/po/de/tinyproxy.po +new file mode 100644 +index 0000000..d444872 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-tinyproxy/po/de/tinyproxy.po +@@ -0,0 +1,373 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Report-Msgid-Bugs-To: \n" ++"POT-Creation-Date: 2009-05-26 17:57+0200\n" ++"PO-Revision-Date: 2012-11-28 10:52+0200\n" ++"Last-Translator: dunkelschunkel \n" ++"Language-Team: LANGUAGE \n" ++"Language: de\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n != 1);\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "" ++"Via proxy routes requests to the given target via the specifed " ++"upstream proxy, Reject access disables any upstream proxy for the " ++"target" ++msgstr "" ++"Via Proxy leitet Anfragen an das gegebene Ziel über den angegebenen " ++"Upstream-Proxy, Zugriff verweigern deaktiviert jegliche Proxies für " ++"das Ziel" ++ ++msgid "" ++"Adds an \"X-Tinyproxy\" HTTP header with the client IP address to forwarded " ++"requests" ++msgstr "" ++"Fügt eine \"X-Tinyproxy\" HTTP-Headerzeile mit der Client Adresse in " ++"weitergeleitete Anfragen ein" ++ ++msgid "Allowed clients" ++msgstr "Erlaubte Clients" ++ ++msgid "Allowed connect ports" ++msgstr "Erlaubte Verbindungsports" ++ ++msgid "Bind address" ++msgstr "Serveradresse" ++ ++msgid "" ++"By default, basic POSIX expressions are used for filtering. Enable this to " ++"activate extended regular expressions" ++msgstr "" ++"Standardmäßig werden einfache POSIX Ausdrücke für die Filterung genutzt, " ++"diese Option aktiviert erweiterte reguläre Ausdrücke" ++ ++msgid "" ++"By default, filter strings are treated as case-insensitive. Enable this to " ++"make the matching case-sensitive" ++msgstr "" ++"Standardmäßig spielt die Groß- und Kleinschreibung bei der Filterung keine " ++"Rolle, diese Option aktiviert die Unterscheidung von Groß- und " ++"Kleinschreibung" ++ ++msgid "" ++"By default, filtering is done based on domain names. Enable this to match " ++"against URLs instead" ++msgstr "" ++"Standardmäßig basiert die Filterung auf Domainnamen, diese Option aktiviert " ++"das Filtern gegen die volle URL" ++ ++msgid "" ++"By default, the filter rules act as blacklist. Enable this option to only " ++"allow matched URLs or domain names" ++msgstr "" ++"Standardmäßig fungieren die Filterregeln als Blacklist, diese Option kehrt " ++"diese in eine Whitelist um und lässt nur treffende URLs oder Domains zu" ++ ++msgid "" ++"Can be either an IP address or range, a domain name or \".\" for any host " ++"without domain" ++msgstr "" ++"Kann entweder eine IP-Adresse, ein Domain-Name oder \".\" für jegliche Hosts " ++"sein" ++ ++msgid "Configuration" ++msgstr "Konfiguration" ++ ++msgid "Connection timeout" ++msgstr "Verbindungstimeout" ++ ++msgid "Default deny" ++msgstr "Standardmäßig verbieten" ++ ++msgid "Enable Tinyproxy server" ++msgstr "Tinyproxy Server aktivieren" ++ ++msgid "Error page" ++msgstr "Fehlerseite" ++ ++msgid "Failed to retrieve statistics from url:" ++msgstr "Empfangen der Statiken von URL fehlgeschlagen" ++ ++msgid "Filter by RegExp" ++msgstr "Filtern nach RegExp" ++ ++msgid "Filter by URLs" ++msgstr "Filtern nach URLs" ++ ++msgid "Filter case-sensitive" ++msgstr "Filtern nach Groß-/Kleinschreibung" ++ ++msgid "Filter file" ++msgstr "Filterdatei" ++ ++msgid "Filtering and ACLs" ++msgstr "Filterung und Zugriffsregeln" ++ ++msgid "General settings" ++msgstr "Allgemeine Einstellungen" ++ ++msgid "Group" ++msgstr "Gruppe" ++ ++msgid "HTML template file to serve for stat host requests" ++msgstr "HTML-Vorlage für Statistikseiten" ++ ++msgid "HTML template file to serve when HTTP errors occur" ++msgstr "HTML-Vorlage für Fehlerseiten" ++ ++msgid "Header whitelist" ++msgstr "Headerzeilen-Whitelist" ++ ++msgid "" ++"List of IP addresses or ranges which are allowed to use the proxy server" ++msgstr "" ++"Liste von IP-Adressen oder Netzbereichen welche diesen Server nutzen dürfen" ++ ++msgid "" ++"List of allowed ports for the CONNECT method. A single value \"0\" allows " ++"all ports" ++msgstr "" ++"Liste erlaubter Ports für \"CONNECT\" Anfragen. Ein einzelner Wert \"0\" " ++"erlaubt alle Ports" ++ ++msgid "Listen address" ++msgstr "Serveradresse" ++ ++msgid "Listen port" ++msgstr "Serverport" ++ ++msgid "Log file" ++msgstr "Protokolldatei" ++ ++msgid "Log file to use for dumping messages" ++msgstr "Gibt die Datei an, in welche Protokollausgaben geschrieben werden" ++ ++msgid "Log level" ++msgstr "Protokolllevel" ++ ++msgid "Logging verbosity of the Tinyproxy process" ++msgstr "Umfang der Tinyproxy Protokollmeldungen" ++ ++msgid "Max. clients" ++msgstr "Max. Clients" ++ ++msgid "Max. requests per server" ++msgstr "Max. Anfragen pro Server" ++ ++msgid "Max. spare servers" ++msgstr "Max. Prozesszahl" ++ ++msgid "Maximum allowed number of concurrently connected clients" ++msgstr "Maximal erlaubte Anzahl gleichzeitig verbundener Clients" ++ ++msgid "" ++"Maximum allowed number of requests per process. If it is exeeded, the " ++"process is restarted. Zero means unlimited." ++msgstr "" ++"Maximal erlaubte Anzahl an Anfragen pro Prozess. Wenn diese erreicht wird, " ++"startet der Prozess neu. Null bedeutet unlimitiert." ++ ++msgid "Maximum number of prepared idle processes" ++msgstr "Maximale Anzahl an vorgehaltenen Leerlaufprozessen" ++ ++msgid "Maximum number of seconds an inactive connection is held open" ++msgstr "" ++"Maximale Anzahl an Sekunden, die eine etablierte, inaktive Verbindung offen " ++"gehalten wird" ++ ++msgid "Min. spare servers" ++msgstr "Min. Prozesszahl" ++ ++msgid "Minimum number of prepared idle processes" ++msgstr "Minimale Anzahl an vorgehaltenen Leerlaufprozessen" ++ ++msgid "Number of idle processes to start when launching Tinyproxy" ++msgstr "Anzahl zu erzeugender Leerlaufprozesse beim Start von Tinyproxy" ++ ++msgid "Plaintext file with URLs or domains to filter. One entry per line" ++msgstr "" ++"Klartextdatei mit zu filternden URLs oder Domains. Ein Eintrag pro Zeile." ++ ++msgid "Policy" ++msgstr "Verfahrensweise" ++ ++msgid "Privacy settings" ++msgstr "Privatsphäre" ++ ++msgid "Reject access" ++msgstr "Verbiete Zugriff" ++ ++msgid "Server Settings" ++msgstr "Servereinstellungen" ++ ++msgid "Server limits" ++msgstr "Serverlimits" ++ ++msgid "" ++"Specifies HTTP header names which are allowed to pass-through, all others " ++"are discarded. Leave empty to disable header filtering" ++msgstr "" ++"Spezifiziert Headerzeilen welche durch den Proxyserver durchgereicht werden " ++"dürfen, alle anderen werden entfernt. Leer lassen um den Filter zu " ++"deaktivieren" ++ ++msgid "Specifies the HTTP port Tinyproxy is listening on for requests" ++msgstr "Konfiguriert den Port an welchem Tinyproxy auf Anfragen wartet" ++ ++msgid "Specifies the Tinyproxy hostname to use in the Via HTTP header" ++msgstr "" ++"Konfiguriert den Hostname, welchen Tinyproxy in die \"Via\" Headerzeile " ++"schreibt" ++ ++msgid "" ++"Specifies the address Tinyproxy binds to for outbound forwarded requests" ++msgstr "" ++"Konfiguriert die lokale IP-Adresse welche Tinyproxy für ausgehende, " ++"weitergeleitete Anfragen benutzt" ++ ++msgid "Specifies the addresses Tinyproxy is listening on for requests" ++msgstr "" ++"Konfiguriert die IP-Adressen auf welchen Tinyproxy Anfragen entgegen nimmt" ++ ++msgid "Specifies the group name the Tinyproxy process is running as" ++msgstr "" ++"Spezifiziert den UNIX-Gruppennamen mit welchem der Tinyproxy Prozess läuft" ++ ++msgid "" ++"Specifies the upstream proxy to use for accessing the target host. Format is " ++"address:port" ++msgstr "" ++"Spezifiziert den Upstream-Proxy über welchen auf den Zielhost zugegriffen " ++"wird. Das Format ist IP-Adresse:Port" ++ ++msgid "Specifies the user name the Tinyproxy process is running as" ++msgstr "" ++"Spezifiziert den UNIX-Nutzernamen mit welchem der Tinyproxy Prozess läuft" ++ ++msgid "Start spare servers" ++msgstr "Starte Leerlaufserver" ++ ++msgid "Statistics page" ++msgstr "Statistikseite" ++ ++msgid "Status" ++msgstr "Status" ++ ++msgid "Target host" ++msgstr "Zielhost" ++ ++msgid "Tinyproxy" ++msgstr "Tinyproxy" ++ ++msgid "Tinyproxy Status" ++msgstr "Status Tinyproxy" ++ ++msgid "Tinyproxy is a small and fast non-caching HTTP(S)-Proxy" ++msgstr "" ++"Tinyproxy ist ein schlanker HTTP(S)-Proxy ohne eigenen Zwischenspeicher" ++ ++msgid "Upstream Proxies" ++msgstr "Upstream-Proxies" ++ ++msgid "" ++"Upstream proxy rules define proxy servers to use when accessing certain IP " ++"addresses or domains." ++msgstr "" ++"Upstream-Proxy-Regeln definieren Proxy-Server welche immer dann genutzt " ++"werden wenn bestimmte IP-Adressen oder Domains angefragt werden." ++ ++msgid "Use syslog" ++msgstr "Nutze den Systemprotokolldienst" ++ ++msgid "User" ++msgstr "Benutzername" ++ ++msgid "Via hostname" ++msgstr "\"Via\" Hostname" ++ ++msgid "Via proxy" ++msgstr "Zwischenproxy" ++ ++msgid "Writes log messages to syslog instead of a log file" ++msgstr "" ++"Schreibt Protokolleinträge an den Protokolldienst statt in eine separate " ++"Protokolldatei." ++ ++msgid "X-Tinyproxy header" ++msgstr "X-Tinyproxy Headerzeile" ++ ++#~ msgid "Allow access from" ++#~ msgstr "Proxyzugang erlauben von" ++ ++#~ msgid "Allowed headers for anonymous proxy" ++#~ msgstr "Erlaube Header für anonymen Proxy" ++ ++#~ msgid "Bind outgoing traffic to address" ++#~ msgstr "Ausgehendenden Verkehr an Adresse binden" ++ ++#~ msgid "Ports allowed for CONNECT method" ++#~ msgstr "Ports für CONNECT-Methode" ++ ++#~ msgid "0 = disabled, empty = all" ++#~ msgstr "0 = deaktiviert, leer = alle" ++ ++#~ msgid "Error document" ++#~ msgstr "Fehlerseite" ++ ++#~ msgid "Filter list" ++#~ msgstr "Filterliste" ++ ++#~ msgid "Case sensitive filters" ++#~ msgstr "Filter unterscheiden Groß-/Kleinschreibung" ++ ++#~ msgid "Filter list is a whitelist" ++#~ msgstr "Filterliste ist eine Whitelist" ++ ++#~ msgid "Extended regular expression filters" ++#~ msgstr "Erweiterte reguläre Ausdrücke für Filter" ++ ++#~ msgid "Filter URLs instead of domains" ++#~ msgstr "Filtere URLs statt Domains" ++ ++#~ msgid "Listen on address" ++#~ msgstr "An Adresse binden" ++ ++#~ msgid "Logfile" ++#~ msgstr "Protokolldatei" ++ ++#~ msgid "Maximum number of clients" ++#~ msgstr "Maximale Anzahl an Clients" ++ ++#~ msgid "Maximum requests per thread" ++#~ msgstr "Maximale Anfragen pro Prozess" ++ ++#~ msgid "Spare servers to start with" ++#~ msgstr "Anfängliche Prozesszahl" ++ ++#~ msgid "Statistic document" ++#~ msgstr "Statistikseite" ++ ++#~ msgid "Write to syslog" ++#~ msgstr "In Systemprotokoll schreiben" ++ ++#~ msgid "Connection Timeout" ++#~ msgstr "Verbindungstimeout" ++ ++#~ msgid "Value of Via-Header" ++#~ msgstr "Wert des Via-Headers" ++ ++#~ msgid "Include client IP" ++#~ msgstr "Client-IP übertragen" ++ ++#~ msgid "Upstream Control" ++#~ msgstr "Zugangskontrolle" ++ ++#~ msgid "Type" ++#~ msgstr "Methode" ++ ++#~ msgid "Upstream Proxy" ++#~ msgstr "Zugangsproxy" +diff --git a/feeds/luci/applications/luci-app-tinyproxy/po/el/tinyproxy.po b/feeds/luci/applications/luci-app-tinyproxy/po/el/tinyproxy.po +new file mode 100644 +index 0000000..718424e +--- /dev/null ++++ b/feeds/luci/applications/luci-app-tinyproxy/po/el/tinyproxy.po +@@ -0,0 +1,283 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Report-Msgid-Bugs-To: \n" ++"POT-Creation-Date: 2009-05-28 02:08+0200\n" ++"PO-Revision-Date: 2012-03-18 16:25+0200\n" ++"Last-Translator: Vasilis \n" ++"Language-Team: LANGUAGE \n" ++"Language: el\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n != 1);\n" ++"X-Generator: Pootle 2.0.4\n" ++ ++msgid "" ++"Via proxy routes requests to the given target via the specifed " ++"upstream proxy, Reject access disables any upstream proxy for the " ++"target" ++msgstr "" ++"Το μέσω proxy δÏομολογεί αιτήσεις Ï€Ïος τον συγκεκÏιμένο Ï€ÏοοÏισμό " ++"μέσω του καθοÏιζόμενου διαμεσολαβητή ανωτέÏου επιπέδου, Το απόÏÏιψη " ++"Ï€Ïόσβασης απενεÏγοποιεί τη χÏήση διαμεσολαβητή ανωτέÏου επιπέδου για το " ++"συγκεκÏιμένο Ï€ÏοοÏισμό" ++ ++msgid "" ++"Adds an \"X-Tinyproxy\" HTTP header with the client IP address to forwarded " ++"requests" ++msgstr "" ++"ΠÏοσθέτει μια κεφαλίδα HTTP \"X-Tinyproxy\" με τη διεÏθυνση IP του πελάτη " ++"στις Ï€ÏοωθοÏμενες αιτήσεις" ++ ++msgid "Allowed clients" ++msgstr "ΕπιτÏεπόμενοι πελάτες" ++ ++msgid "Allowed connect ports" ++msgstr "ΕπιτÏεπόμενες θÏÏες σÏνδεσης" ++ ++#, fuzzy ++msgid "Bind address" ++msgstr "ΔιεÏθυνση στην οποία ακοÏει η υπηÏεσία" ++ ++msgid "" ++"By default, basic POSIX expressions are used for filtering. Enable this to " ++"activate extended regular expressions" ++msgstr "" ++"ΠÏοεπιλεγμένα, χÏησιμοποιοÏνται απλές κανονικές εκφÏάσεις POSIX για το " ++"φιλτÏάÏισμα. ΕνεÏγοποιήστε αυτή την επιλογή για να χÏησιμοποιοÏνται " ++"εκτεταμένες κανονικές εκφÏάσεις" ++ ++msgid "" ++"By default, filter strings are treated as case-insensitive. Enable this to " ++"make the matching case-sensitive" ++msgstr "" ++"ΠÏοεπιλεγμένα, το φιλτÏάÏισμα με συμβολοσειÏές γίνεται χωÏίς διάκÏιση πεζών " ++"κεφαλαίων. ΕνεÏγοποιήστε αυτή την επιλογή για να γίνεται διάκÏιση πεζών " ++"κεφαλαίων" ++ ++msgid "" ++"By default, filtering is done based on domain names. Enable this to match " ++"against URLs instead" ++msgstr "" ++"ΠÏοεπιλεγμένα, το φιλτÏάÏισμα γίνεται βάσει του ονόματος τομέα. " ++"ΕνεÏγοποιήστε αυτή την επιλογή για να γίνεται βάσει URL" ++ ++msgid "" ++"By default, the filter rules act as blacklist. Enable this option to only " ++"allow matched URLs or domain names" ++msgstr "" ++"ΠÏοεπιλεγμένα, οι κανόνες φιλτÏαÏίσματος λειτουÏγοÏν ως μαÏÏη λίστα. " ++"ΕνεÏγοποιήστε αυτή την επιλογή ώστε να επιτÏέπονται μόνο τα ονόματα τομέα ή " ++"URLs που ταιÏιάζουν" ++ ++msgid "" ++"Can be either an IP address or range, a domain name or \".\" for any host " ++"without domain" ++msgstr "" ++"ΜποÏεί να είναι μια IP διεÏθυνση ή εÏÏος, ένα όνομα τομέα ή \".\" για " ++"οποιοδήποτε σÏστημα χωÏίς όνομα τομέα" ++ ++msgid "Configuration" ++msgstr "" ++ ++msgid "Connection timeout" ++msgstr "ΧÏονικό ÏŒÏιο σÏνδεσης" ++ ++msgid "Default deny" ++msgstr "ΆÏνηση Ï€Ïοεπιλεγμένα" ++ ++msgid "Enable Tinyproxy server" ++msgstr "ΕνεÏγοποίηση διαμεσολαβητή Tinyproxy" ++ ++msgid "Error page" ++msgstr "Σελίδα σφάλματος" ++ ++msgid "Failed to retrieve statistics from url:" ++msgstr "" ++ ++msgid "Filter by RegExp" ++msgstr "ΦιλτÏάÏισμα με Κανονικές ΕκφÏάσεις" ++ ++msgid "Filter by URLs" ++msgstr "ΦιλτÏάÏισμα με URL" ++ ++msgid "Filter case-sensitive" ++msgstr "ΦιλτÏάÏισμα με διάκÏιση πεζών/κεφαλαίων" ++ ++msgid "Filter file" ++msgstr "ΑÏχείο φίλτÏων" ++ ++msgid "Filtering and ACLs" ++msgstr "ΦιλτÏάÏισμα και λίστες ελέγχου Ï€Ïόσβασης" ++ ++msgid "General settings" ++msgstr "Γενικές Ïυθμίσεις" ++ ++msgid "Group" ++msgstr "Ομάδα" ++ ++msgid "HTML template file to serve for stat host requests" ++msgstr "" ++"ΑÏχείο Ï€ÏοτÏπου HTML που στέλνεται σε αιτήσεις για στατιστικά του συστήματος" ++ ++msgid "HTML template file to serve when HTTP errors occur" ++msgstr "ΑÏχείο Ï€ÏοτÏπου HTML που στέλνεται όταν Ï€ÏοκÏπτουν σφάλματα HTML" ++ ++msgid "Header whitelist" ++msgstr "Λευκή λίστα κεφαλίδων" ++ ++msgid "" ++"List of IP addresses or ranges which are allowed to use the proxy server" ++msgstr "" ++"Λίστα διευθÏνσεων IP ή εÏÏη αυτών στις οποίες επιτÏέπεται η χÏήση του " ++"διαμεσολαβητή" ++ ++msgid "" ++"List of allowed ports for the CONNECT method. A single value \"0\" allows " ++"all ports" ++msgstr "" ++ ++msgid "Listen address" ++msgstr "" ++ ++msgid "Listen port" ++msgstr "" ++ ++msgid "Log file" ++msgstr "" ++ ++msgid "Log file to use for dumping messages" ++msgstr "" ++ ++msgid "Log level" ++msgstr "" ++ ++msgid "Logging verbosity of the Tinyproxy process" ++msgstr "" ++ ++msgid "Max. clients" ++msgstr "" ++ ++msgid "Max. requests per server" ++msgstr "" ++ ++msgid "Max. spare servers" ++msgstr "" ++ ++msgid "Maximum allowed number of concurrently connected clients" ++msgstr "" ++ ++msgid "" ++"Maximum allowed number of requests per process. If it is exeeded, the " ++"process is restarted. Zero means unlimited." ++msgstr "" ++ ++msgid "Maximum number of prepared idle processes" ++msgstr "" ++ ++msgid "Maximum number of seconds an inactive connection is held open" ++msgstr "" ++ ++msgid "Min. spare servers" ++msgstr "" ++ ++msgid "Minimum number of prepared idle processes" ++msgstr "" ++ ++msgid "Number of idle processes to start when launching Tinyproxy" ++msgstr "" ++ ++msgid "Plaintext file with URLs or domains to filter. One entry per line" ++msgstr "" ++ ++msgid "Policy" ++msgstr "" ++ ++msgid "Privacy settings" ++msgstr "" ++ ++msgid "Reject access" ++msgstr "" ++ ++msgid "Server Settings" ++msgstr "" ++ ++msgid "Server limits" ++msgstr "" ++ ++msgid "" ++"Specifies HTTP header names which are allowed to pass-through, all others " ++"are discarded. Leave empty to disable header filtering" ++msgstr "" ++ ++msgid "Specifies the HTTP port Tinyproxy is listening on for requests" ++msgstr "" ++ ++msgid "Specifies the Tinyproxy hostname to use in the Via HTTP header" ++msgstr "" ++ ++msgid "" ++"Specifies the address Tinyproxy binds to for outbound forwarded requests" ++msgstr "" ++ ++msgid "Specifies the addresses Tinyproxy is listening on for requests" ++msgstr "" ++ ++msgid "Specifies the group name the Tinyproxy process is running as" ++msgstr "" ++ ++msgid "" ++"Specifies the upstream proxy to use for accessing the target host. Format is " ++"address:port" ++msgstr "" ++ ++msgid "Specifies the user name the Tinyproxy process is running as" ++msgstr "" ++ ++msgid "Start spare servers" ++msgstr "" ++ ++msgid "Statistics page" ++msgstr "" ++ ++msgid "Status" ++msgstr "" ++ ++msgid "Target host" ++msgstr "" ++ ++msgid "Tinyproxy" ++msgstr "" ++ ++msgid "Tinyproxy Status" ++msgstr "" ++ ++msgid "Tinyproxy is a small and fast non-caching HTTP(S)-Proxy" ++msgstr "" ++ ++msgid "Upstream Proxies" ++msgstr "" ++ ++msgid "" ++"Upstream proxy rules define proxy servers to use when accessing certain IP " ++"addresses or domains." ++msgstr "" ++ ++msgid "Use syslog" ++msgstr "" ++ ++msgid "User" ++msgstr "" ++ ++msgid "Via hostname" ++msgstr "" ++ ++msgid "Via proxy" ++msgstr "" ++ ++msgid "Writes log messages to syslog instead of a log file" ++msgstr "" ++ ++msgid "X-Tinyproxy header" ++msgstr "" +diff --git a/feeds/luci/applications/luci-app-tinyproxy/po/en/tinyproxy.po b/feeds/luci/applications/luci-app-tinyproxy/po/en/tinyproxy.po +new file mode 100644 +index 0000000..4650f3e +--- /dev/null ++++ b/feeds/luci/applications/luci-app-tinyproxy/po/en/tinyproxy.po +@@ -0,0 +1,331 @@ ++#, fuzzy ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Report-Msgid-Bugs-To: \n" ++"POT-Creation-Date: 2009-05-19 19:35+0200\n" ++"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" ++"Last-Translator: FULL NAME \n" ++"Language-Team: LANGUAGE \n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"X-Generator: Translate Toolkit 1.1.1\n" ++ ++msgid "" ++"Via proxy routes requests to the given target via the specifed " ++"upstream proxy, Reject access disables any upstream proxy for the " ++"target" ++msgstr "" ++ ++msgid "" ++"Adds an \"X-Tinyproxy\" HTTP header with the client IP address to forwarded " ++"requests" ++msgstr "" ++ ++msgid "Allowed clients" ++msgstr "" ++ ++msgid "Allowed connect ports" ++msgstr "" ++ ++msgid "Bind address" ++msgstr "" ++ ++msgid "" ++"By default, basic POSIX expressions are used for filtering. Enable this to " ++"activate extended regular expressions" ++msgstr "" ++ ++msgid "" ++"By default, filter strings are treated as case-insensitive. Enable this to " ++"make the matching case-sensitive" ++msgstr "" ++ ++msgid "" ++"By default, filtering is done based on domain names. Enable this to match " ++"against URLs instead" ++msgstr "" ++ ++msgid "" ++"By default, the filter rules act as blacklist. Enable this option to only " ++"allow matched URLs or domain names" ++msgstr "" ++ ++msgid "" ++"Can be either an IP address or range, a domain name or \".\" for any host " ++"without domain" ++msgstr "" ++ ++msgid "Configuration" ++msgstr "" ++ ++msgid "Connection timeout" ++msgstr "" ++ ++msgid "Default deny" ++msgstr "" ++ ++msgid "Enable Tinyproxy server" ++msgstr "" ++ ++msgid "Error page" ++msgstr "" ++ ++msgid "Failed to retrieve statistics from url:" ++msgstr "" ++ ++msgid "Filter by RegExp" ++msgstr "" ++ ++msgid "Filter by URLs" ++msgstr "" ++ ++msgid "Filter case-sensitive" ++msgstr "" ++ ++msgid "Filter file" ++msgstr "" ++ ++msgid "Filtering and ACLs" ++msgstr "" ++ ++msgid "General settings" ++msgstr "" ++ ++msgid "Group" ++msgstr "" ++ ++msgid "HTML template file to serve for stat host requests" ++msgstr "" ++ ++msgid "HTML template file to serve when HTTP errors occur" ++msgstr "" ++ ++msgid "Header whitelist" ++msgstr "" ++ ++msgid "" ++"List of IP addresses or ranges which are allowed to use the proxy server" ++msgstr "" ++ ++msgid "" ++"List of allowed ports for the CONNECT method. A single value \"0\" allows " ++"all ports" ++msgstr "" ++ ++msgid "Listen address" ++msgstr "" ++ ++msgid "Listen port" ++msgstr "" ++ ++msgid "Log file" ++msgstr "" ++ ++msgid "Log file to use for dumping messages" ++msgstr "" ++ ++msgid "Log level" ++msgstr "Log level" ++ ++msgid "Logging verbosity of the Tinyproxy process" ++msgstr "" ++ ++msgid "Max. clients" ++msgstr "" ++ ++msgid "Max. requests per server" ++msgstr "" ++ ++msgid "Max. spare servers" ++msgstr "Max. spare servers" ++ ++msgid "Maximum allowed number of concurrently connected clients" ++msgstr "" ++ ++msgid "" ++"Maximum allowed number of requests per process. If it is exeeded, the " ++"process is restarted. Zero means unlimited." ++msgstr "" ++ ++msgid "Maximum number of prepared idle processes" ++msgstr "" ++ ++msgid "Maximum number of seconds an inactive connection is held open" ++msgstr "" ++ ++msgid "Min. spare servers" ++msgstr "Min. spare servers" ++ ++msgid "Minimum number of prepared idle processes" ++msgstr "" ++ ++msgid "Number of idle processes to start when launching Tinyproxy" ++msgstr "" ++ ++msgid "Plaintext file with URLs or domains to filter. One entry per line" ++msgstr "" ++ ++msgid "Policy" ++msgstr "" ++ ++msgid "Privacy settings" ++msgstr "" ++ ++msgid "Reject access" ++msgstr "Reject access" ++ ++msgid "Server Settings" ++msgstr "" ++ ++msgid "Server limits" ++msgstr "" ++ ++msgid "" ++"Specifies HTTP header names which are allowed to pass-through, all others " ++"are discarded. Leave empty to disable header filtering" ++msgstr "" ++ ++msgid "Specifies the HTTP port Tinyproxy is listening on for requests" ++msgstr "" ++ ++msgid "Specifies the Tinyproxy hostname to use in the Via HTTP header" ++msgstr "" ++ ++msgid "" ++"Specifies the address Tinyproxy binds to for outbound forwarded requests" ++msgstr "" ++ ++msgid "Specifies the addresses Tinyproxy is listening on for requests" ++msgstr "" ++ ++msgid "Specifies the group name the Tinyproxy process is running as" ++msgstr "" ++ ++msgid "" ++"Specifies the upstream proxy to use for accessing the target host. Format is " ++"address:port" ++msgstr "" ++ ++msgid "Specifies the user name the Tinyproxy process is running as" ++msgstr "" ++ ++msgid "Start spare servers" ++msgstr "" ++ ++msgid "Statistics page" ++msgstr "" ++ ++msgid "Status" ++msgstr "" ++ ++msgid "Target host" ++msgstr "Target host" ++ ++msgid "Tinyproxy" ++msgstr "Tinyproxy" ++ ++msgid "Tinyproxy Status" ++msgstr "" ++ ++msgid "Tinyproxy is a small and fast non-caching HTTP(S)-Proxy" ++msgstr "Tinyproxy is a small and fast non-caching HTTP(S)-Proxy" ++ ++msgid "Upstream Proxies" ++msgstr "" ++ ++msgid "" ++"Upstream proxy rules define proxy servers to use when accessing certain IP " ++"addresses or domains." ++msgstr "" ++ ++msgid "Use syslog" ++msgstr "" ++ ++msgid "User" ++msgstr "" ++ ++msgid "Via hostname" ++msgstr "" ++ ++msgid "Via proxy" ++msgstr "Via proxy" ++ ++msgid "Writes log messages to syslog instead of a log file" ++msgstr "" ++ ++msgid "X-Tinyproxy header" ++msgstr "" ++ ++#~ msgid "Allow access from" ++#~ msgstr "Allow access from" ++ ++#~ msgid "Allowed headers for anonymous proxy" ++#~ msgstr "Allowed headers for anonymous proxy" ++ ++#~ msgid "Bind outgoing traffic to address" ++#~ msgstr "Bind outgoing traffic to address" ++ ++#~ msgid "Ports allowed for CONNECT method" ++#~ msgstr "Ports allowed for CONNECT method" ++ ++#~ msgid "0 = disabled, empty = all" ++#~ msgstr "0 = disabled, empty = all" ++ ++#~ msgid "Error document" ++#~ msgstr "Error document" ++ ++#~ msgid "Filter list" ++#~ msgstr "Filter list" ++ ++#~ msgid "Case sensitive filters" ++#~ msgstr "Case sensitive filters" ++ ++#~ msgid "Filter list is a whitelist" ++#~ msgstr "Filter list is a whitelist" ++ ++#~ msgid "Extended regular expression filters" ++#~ msgstr "Extended regular expression filters" ++ ++#~ msgid "Filter URLs instead of domains" ++#~ msgstr "Filter URLs instead of domains" ++ ++#~ msgid "Listen on address" ++#~ msgstr "Listen on address" ++ ++#~ msgid "Logfile" ++#~ msgstr "Logfile" ++ ++#~ msgid "Maximum number of clients" ++#~ msgstr "Maximum number of clients" ++ ++#~ msgid "Maximum requests per thread" ++#~ msgstr "Maximum requests per thread" ++ ++#~ msgid "Spare servers to start with" ++#~ msgstr "Spare servers to start with" ++ ++#~ msgid "Statistic document" ++#~ msgstr "Statistic document" ++ ++#~ msgid "Write to syslog" ++#~ msgstr "Write to syslog" ++ ++#~ msgid "Connection Timeout" ++#~ msgstr "Connection Timeout" ++ ++#~ msgid "Value of Via-Header" ++#~ msgstr "Value of Via-Header" ++ ++#~ msgid "Include client IP" ++#~ msgstr "Include client IP" ++ ++#~ msgid "Upstream Control" ++#~ msgstr "Upstream Control" ++ ++#~ msgid "Type" ++#~ msgstr "Type" ++ ++#~ msgid "Upstream Proxy" ++#~ msgstr "Upstream Proxy" +diff --git a/feeds/luci/applications/luci-app-tinyproxy/po/es/tinyproxy.po b/feeds/luci/applications/luci-app-tinyproxy/po/es/tinyproxy.po +new file mode 100644 +index 0000000..c9faff1 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-tinyproxy/po/es/tinyproxy.po +@@ -0,0 +1,354 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Report-Msgid-Bugs-To: \n" ++"POT-Creation-Date: 2009-06-10 03:41+0200\n" ++"PO-Revision-Date: 2012-10-07 15:08+0200\n" ++"Last-Translator: José Vicente \n" ++"Language-Team: LANGUAGE \n" ++"Language: es\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n != 1);\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "" ++"Via proxy routes requests to the given target via the specifed " ++"upstream proxy, Reject access disables any upstream proxy for the " ++"target" ++msgstr "" ++"Vía proxy enruta las peticiones al destino vía el proxy superior " ++"especificado, Rechazar acceso desactiva cualquier proxy superior al " ++"destino" ++ ++msgid "" ++"Adds an \"X-Tinyproxy\" HTTP header with the client IP address to forwarded " ++"requests" ++msgstr "" ++"Añade una cabecera HTTP con \"X-Tinyproxy\" con la dirección IP del cliente " ++"a las peticiones retransmitidas" ++ ++msgid "Allowed clients" ++msgstr "Clientes permitidos" ++ ++msgid "Allowed connect ports" ++msgstr "Puertos permitidos" ++ ++msgid "Bind address" ++msgstr "Dirección de asociación" ++ ++msgid "" ++"By default, basic POSIX expressions are used for filtering. Enable this to " ++"activate extended regular expressions" ++msgstr "" ++"Expresiones regulares extendidas. Por defecto se filtra con expresiones " ++"regulares POSIX básicas" ++ ++msgid "" ++"By default, filter strings are treated as case-insensitive. Enable this to " ++"make the matching case-sensitive" ++msgstr "Distinguir mayúsculas y minúsculas" ++ ++msgid "" ++"By default, filtering is done based on domain names. Enable this to match " ++"against URLs instead" ++msgstr "Comparar con URLs. Por defecto el filtro se basa en nombres de dominio" ++ ++msgid "" ++"By default, the filter rules act as blacklist. Enable this option to only " ++"allow matched URLs or domain names" ++msgstr "" ++"Tratar el fichero de filtro como una lista de máquinas a permitir. Por " ++"defecto actúa como una lista negra" ++ ++msgid "" ++"Can be either an IP address or range, a domain name or \".\" for any host " ++"without domain" ++msgstr "" ++"Puede ser un rango de IPs, un nombre de dominio o \".\" para cualquier " ++"máquina sin dominio" ++ ++msgid "Configuration" ++msgstr "Configuración" ++ ++msgid "Connection timeout" ++msgstr "Espera de conexión" ++ ++msgid "Default deny" ++msgstr "Denegar por defecto" ++ ++msgid "Enable Tinyproxy server" ++msgstr "Activar el servidor Tinyproxy" ++ ++msgid "Error page" ++msgstr "Página de error" ++ ++msgid "Failed to retrieve statistics from url:" ++msgstr "No se han podido obtener estadísticas de:" ++ ++msgid "Filter by RegExp" ++msgstr "Filtrar por RegExp" ++ ++msgid "Filter by URLs" ++msgstr "Filtrar por URLs" ++ ++msgid "Filter case-sensitive" ++msgstr "Distinguir entre mayúsculas y minúsculas" ++ ++msgid "Filter file" ++msgstr "Fichero de filtro" ++ ++msgid "Filtering and ACLs" ++msgstr "Filtrado y ACLs" ++ ++msgid "General settings" ++msgstr "Configuración general" ++ ++msgid "Group" ++msgstr "Grupo" ++ ++msgid "HTML template file to serve for stat host requests" ++msgstr "" ++"FIchero con la plantilla HTML a usar para las peticiones de estadísticas" ++ ++msgid "HTML template file to serve when HTTP errors occur" ++msgstr "Fichero con la plantilla HTTP a usar cuando ocurra algún error" ++ ++msgid "Header whitelist" ++msgstr "Cabeceras autorizadas" ++ ++msgid "" ++"List of IP addresses or ranges which are allowed to use the proxy server" ++msgstr "Direcciones IP o rangos a los que se permite usar el servidor proxy" ++ ++msgid "" ++"List of allowed ports for the CONNECT method. A single value \"0\" allows " ++"all ports" ++msgstr "" ++"Lista de puertos permitidos al método CONNECT. Use 0 para todos los puertos" ++ ++msgid "Listen address" ++msgstr "Dirección de escucha" ++ ++msgid "Listen port" ++msgstr "Puerto de escucha" ++ ++msgid "Log file" ++msgstr "Registro" ++ ++msgid "Log file to use for dumping messages" ++msgstr "Fichero de volcado de mensajes" ++ ++msgid "Log level" ++msgstr "Nivel de registro" ++ ++msgid "Logging verbosity of the Tinyproxy process" ++msgstr "Nivel de registro del proceso Tinyproxy" ++ ++msgid "Max. clients" ++msgstr "Clientes máximos" ++ ++msgid "Max. requests per server" ++msgstr "Peticiones máximas por servidor" ++ ++msgid "Max. spare servers" ++msgstr "Procesos servidores máximos" ++ ++msgid "Maximum allowed number of concurrently connected clients" ++msgstr "Máximo de clientes conectados simultáneamente" ++ ++msgid "" ++"Maximum allowed number of requests per process. If it is exeeded, the " ++"process is restarted. Zero means unlimited." ++msgstr "" ++"Peticiones máximas por proceso. Si se supera el proceso es arrancado de " ++"nuevo. Para ilimitados indique 0." ++ ++msgid "Maximum number of prepared idle processes" ++msgstr "Máximo de procesos inactivos" ++ ++msgid "Maximum number of seconds an inactive connection is held open" ++msgstr "Segundos máximos que se tiene una conexión inactiva abierta" ++ ++msgid "Min. spare servers" ++msgstr "Procesos servidores mínimos" ++ ++msgid "Minimum number of prepared idle processes" ++msgstr "Mínimo de procesos inactivos" ++ ++msgid "Number of idle processes to start when launching Tinyproxy" ++msgstr "Procesos inactivos a arrancar cuando se lanza Tinyproxy" ++ ++msgid "Plaintext file with URLs or domains to filter. One entry per line" ++msgstr "Fichero plano con URLs o dominios a filtrar. Uno por línea" ++ ++msgid "Policy" ++msgstr "Política" ++ ++msgid "Privacy settings" ++msgstr "Configuración de privacidad" ++ ++msgid "Reject access" ++msgstr "Rechazar acceso" ++ ++msgid "Server Settings" ++msgstr "Configuración del servidor" ++ ++msgid "Server limits" ++msgstr "Límites del servidor" ++ ++msgid "" ++"Specifies HTTP header names which are allowed to pass-through, all others " ++"are discarded. Leave empty to disable header filtering" ++msgstr "" ++"Nombres de cabeceras HTTP que se dejan pasar. el resto se descartan. Deje en " ++"blanco para desactivar el filtrado de cabeceras" ++ ++msgid "Specifies the HTTP port Tinyproxy is listening on for requests" ++msgstr "Puerto de escucha de peticiones" ++ ++msgid "Specifies the Tinyproxy hostname to use in the Via HTTP header" ++msgstr "Nombre de máquina a usar en la cabecera HTTP \"Via\"" ++ ++msgid "" ++"Specifies the address Tinyproxy binds to for outbound forwarded requests" ++msgstr "" ++"Dirección a la que se asocia Tinyproxy para peticiones de traspaso salientes" ++ ++msgid "Specifies the addresses Tinyproxy is listening on for requests" ++msgstr "Direcciones de escucha de peticiones" ++ ++msgid "Specifies the group name the Tinyproxy process is running as" ++msgstr "Nombre de grupo en el que se ejecuta el proceso Tinyproxy" ++ ++msgid "" ++"Specifies the upstream proxy to use for accessing the target host. Format is " ++"address:port" ++msgstr "" ++"Proxy superior a usar para llegar a la máquina destino. El formato es " ++"dirección_puerto" ++ ++msgid "Specifies the user name the Tinyproxy process is running as" ++msgstr "Nombre de usuario con en el que se ejecuta el proceso Tinyproxy" ++ ++msgid "Start spare servers" ++msgstr "Arrancar servidores libres" ++ ++msgid "Statistics page" ++msgstr "Estadísticas" ++ ++msgid "Status" ++msgstr "Estado" ++ ++msgid "Target host" ++msgstr "Máquina destino" ++ ++msgid "Tinyproxy" ++msgstr "Tinyproxy" ++ ++msgid "Tinyproxy Status" ++msgstr "Estado de Tinyproxy" ++ ++msgid "Tinyproxy is a small and fast non-caching HTTP(S)-Proxy" ++msgstr "Tinyproxy es un proxy sin cache HTTP/HTTPS pequeño y rápido" ++ ++msgid "Upstream Proxies" ++msgstr "Proxies superiores" ++ ++msgid "" ++"Upstream proxy rules define proxy servers to use when accessing certain IP " ++"addresses or domains." ++msgstr "" ++"Las reglas de proxy superior definen qué servidores usar cuando se accede a " ++"ciertas direcciones IP o dominios." ++ ++msgid "Use syslog" ++msgstr "Usar SysLog" ++ ++msgid "User" ++msgstr "Usuario" ++ ++msgid "Via hostname" ++msgstr "Nombre de máquina en \"Via\"" ++ ++msgid "Via proxy" ++msgstr "Via proxy" ++ ++msgid "Writes log messages to syslog instead of a log file" ++msgstr "Escribe los mensajes de registro en SysLog en vez de en un fichero" ++ ++msgid "X-Tinyproxy header" ++msgstr "Cabecera X-Tinyproxy" ++ ++#~ msgid "Allow access from" ++#~ msgstr "Permitir acceso desde" ++ ++#~ msgid "Allowed headers for anonymous proxy" ++#~ msgstr "Encabezados permitidos de proxies anónimos" ++ ++#~ msgid "Bind outgoing traffic to address" ++#~ msgstr "Ligar tráfico de salida a la dirección" ++ ++#~ msgid "Ports allowed for CONNECT method" ++#~ msgstr "Puertos permitidos para el método CONNECT" ++ ++#~ msgid "0 = disabled, empty = all" ++#~ msgstr "0 = Deshabilitado, vacío = todos" ++ ++#~ msgid "Error document" ++#~ msgstr "Error en documento" ++ ++#~ msgid "Filter list" ++#~ msgstr "Lista de filtros" ++ ++#~ msgid "Case sensitive filters" ++#~ msgstr "Filtros de mayúsculas y minúsculas " ++ ++#~ msgid "Filter list is a whitelist" ++#~ msgstr "La Lista de Filtros es una lista blanca" ++ ++#~ msgid "Extended regular expression filters" ++#~ msgstr "Filtros extendido para expresiones regulares" ++ ++#~ msgid "Filter URLs instead of domains" ++#~ msgstr "Filtrar URLs en vez de dominios" ++ ++#~ msgid "Listen on address" ++#~ msgstr "Escuchar en dirección" ++ ++#~ msgid "Logfile" ++#~ msgstr "Logfile" ++ ++#~ msgid "Maximum number of clients" ++#~ msgstr "Número máximo de clientes" ++ ++#~ msgid "Maximum requests per thread" ++#~ msgstr "Máximas peticiones por hilo" ++ ++#~ msgid "Spare servers to start with" ++#~ msgstr "Spare servers to start with" ++ ++#~ msgid "Statistic document" ++#~ msgstr "Documento de estadística" ++ ++#~ msgid "Write to syslog" ++#~ msgstr "Escribir al syslog" ++ ++#~ msgid "Connection Timeout" ++#~ msgstr "Tiempo agotado para la conexión" ++ ++#~ msgid "Value of Via-Header" ++#~ msgstr "Valor para Via-Header" ++ ++#~ msgid "Include client IP" ++#~ msgstr "Incluir IP del cliente" ++ ++#~ msgid "Upstream Control" ++#~ msgstr "Control de subida (upstream)" ++ ++#~ msgid "Type" ++#~ msgstr "Tipo" ++ ++#~ msgid "Upstream Proxy" ++#~ msgstr "Proxy de subida (upstream)" +diff --git a/feeds/luci/applications/luci-app-tinyproxy/po/fr/tinyproxy.po b/feeds/luci/applications/luci-app-tinyproxy/po/fr/tinyproxy.po +new file mode 100644 +index 0000000..d359442 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-tinyproxy/po/fr/tinyproxy.po +@@ -0,0 +1,372 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Report-Msgid-Bugs-To: \n" ++"POT-Creation-Date: 2009-06-10 03:40+0200\n" ++"PO-Revision-Date: 2014-01-26 12:52+0200\n" ++"Last-Translator: kyas \n" ++"Language-Team: LANGUAGE \n" ++"Language: fr\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n > 1);\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "" ++"Via proxy routes requests to the given target via the specifed " ++"upstream proxy, Reject access disables any upstream proxy for the " ++"target" ++msgstr "" ++"Via proxy route les requêtes vers la cible donnée via le mandataire " ++"amont donné, Reject access interdit tout mandataire amont comme " ++"cible" ++ ++msgid "" ++"Adds an \"X-Tinyproxy\" HTTP header with the client IP address to forwarded " ++"requests" ++msgstr "" ++"Ajoute un en-tête HTTP \"X-Tinyproxy\" avec l'adresse IP du client aux " ++"requêtes retransmises" ++ ++msgid "Allowed clients" ++msgstr "Clients autorisés" ++ ++msgid "Allowed connect ports" ++msgstr "Ports de connexion autorisés" ++ ++msgid "Bind address" ++msgstr "Adresse en écoute" ++ ++msgid "" ++"By default, basic POSIX expressions are used for filtering. Enable this to " ++"activate extended regular expressions" ++msgstr "" ++"Par défaut, le filtrage utilise des expressions POSIX basiques. Activez-ceci " ++"pour permettre l'utilisation d'expressions régulières étendues" ++ ++msgid "" ++"By default, filter strings are treated as case-insensitive. Enable this to " ++"make the matching case-sensitive" ++msgstr "" ++"Par défaut, les chaînes de caractères des filtres sont utilisées sans faire " ++"attention à leurs casses. Activez-ceci pour les rendre sensible à la casse " ++"des caractères" ++ ++msgid "" ++"By default, filtering is done based on domain names. Enable this to match " ++"against URLs instead" ++msgstr "" ++"Par défaut, le filtrage s'effectue sur les noms de domaines. Activez-ceci " ++"pour l'appliquer plutôt aux URLs" ++ ++msgid "" ++"By default, the filter rules act as blacklist. Enable this option to only " ++"allow matched URLs or domain names" ++msgstr "" ++"Par défaut, les règles de filtrages décrivent ce qui doit être interdit. " ++"Activez cette option pour n'autoriser que les noms de domaines ou URLs qui " ++"correspondent aux règles" ++ ++msgid "" ++"Can be either an IP address or range, a domain name or \".\" for any host " ++"without domain" ++msgstr "" ++"Ce peut être soit une adresse ou une gamme d'adresses IP, un nom de domaine, " ++"ou \".\" pour n'importe quel nom d'hôte sans domaine" ++ ++msgid "Configuration" ++msgstr "Configuration" ++ ++msgid "Connection timeout" ++msgstr "Délai de connexion" ++ ++msgid "Default deny" ++msgstr "Interdit par défaut" ++ ++msgid "Enable Tinyproxy server" ++msgstr "Activer le serveur Tinyproxy" ++ ++msgid "Error page" ++msgstr "Page d'erreur" ++ ++msgid "Failed to retrieve statistics from url:" ++msgstr "Impossible de récupérer les statistiques de l'URL:" ++ ++msgid "Filter by RegExp" ++msgstr "Filtrage par RegExp" ++ ++msgid "Filter by URLs" ++msgstr "Filtrage par URLs" ++ ++msgid "Filter case-sensitive" ++msgstr "Filtrage sensible à la casse" ++ ++msgid "Filter file" ++msgstr "Fichier des filtres" ++ ++msgid "Filtering and ACLs" ++msgstr "Filtrage et ACLs" ++ ++msgid "General settings" ++msgstr "Paramètres généraux" ++ ++msgid "Group" ++msgstr "Groupe" ++ ++msgid "HTML template file to serve for stat host requests" ++msgstr "" ++"Modèle de fichier HTML à utiliser pour les requêtes de statistiques des hôtes" ++ ++msgid "HTML template file to serve when HTTP errors occur" ++msgstr "Modèle de fichier HTML à utiliser quand une erreur HTTP survient" ++ ++msgid "Header whitelist" ++msgstr "Liste des en-têtes autorisés" ++ ++msgid "" ++"List of IP addresses or ranges which are allowed to use the proxy server" ++msgstr "" ++"Liste des adresses IP ou gammes d'adresses IP autorisées à utiliser le " ++"serveur mandataire" ++ ++msgid "" ++"List of allowed ports for the CONNECT method. A single value \"0\" allows " ++"all ports" ++msgstr "" ++"Liste des ports autorisés pour la méthode CONNECT. Une valeur \"0\" unique " ++"autorises tous les ports" ++ ++msgid "Listen address" ++msgstr "Adresse en écoute" ++ ++msgid "Listen port" ++msgstr "Port en écoute" ++ ++msgid "Log file" ++msgstr "Fichier journal" ++ ++msgid "Log file to use for dumping messages" ++msgstr "Fichier-journal utilisé pour y copier les messages" ++ ++msgid "Log level" ++msgstr "Niveau de log" ++ ++msgid "Logging verbosity of the Tinyproxy process" ++msgstr "Verbosité du journal du processus Tinyproxy" ++ ++msgid "Max. clients" ++msgstr "Nombre max. de clients" ++ ++msgid "Max. requests per server" ++msgstr "Nombre max. de requêtes par serveur" ++ ++msgid "Max. spare servers" ++msgstr "Nombre Maximum de processus serveur" ++ ++msgid "Maximum allowed number of concurrently connected clients" ++msgstr "Nombre max autorisé de clients connectés en même temps" ++ ++msgid "" ++"Maximum allowed number of requests per process. If it is exeeded, the " ++"process is restarted. Zero means unlimited." ++msgstr "" ++"Nombre maximum autorisé de requêtes par processus. S'il est dépassé, le " ++"processus est relancé. Un zéro désactive cette limite." ++ ++msgid "Maximum number of prepared idle processes" ++msgstr "Nombre maximum de processus lancés, prêts à traiter des requêtes" ++ ++msgid "Maximum number of seconds an inactive connection is held open" ++msgstr "" ++"Une connexion inactive est maintenue ouverte pendant cette durée maximum (en " ++"secondes)" ++ ++msgid "Min. spare servers" ++msgstr "Nombre Minimum de processus serveur" ++ ++msgid "Minimum number of prepared idle processes" ++msgstr "Nombre minimum de processus lancés, prêts à traiter des requêtes" ++ ++msgid "Number of idle processes to start when launching Tinyproxy" ++msgstr "" ++"Nombre de processus lancés en sus, prêts à traiter des requêtes, au " ++"démarrage de Tinyproxy" ++ ++msgid "Plaintext file with URLs or domains to filter. One entry per line" ++msgstr "" ++"Fichier-texte contenant les URLs ou noms de domaines à filtrer, un par ligne" ++ ++msgid "Policy" ++msgstr "Action" ++ ++msgid "Privacy settings" ++msgstr "Paramètres de confidentialité" ++ ++msgid "Reject access" ++msgstr "Refuser l'accès" ++ ++msgid "Server Settings" ++msgstr "Paramètres du serveur" ++ ++msgid "Server limits" ++msgstr "Limites du serveur" ++ ++msgid "" ++"Specifies HTTP header names which are allowed to pass-through, all others " ++"are discarded. Leave empty to disable header filtering" ++msgstr "" ++"Indique les noms des entêtes HTTP qui sont autorisées à transiter, tous les " ++"autres seront retirés. Laisser vide pour désactiver le filtrage des entêtes" ++ ++msgid "Specifies the HTTP port Tinyproxy is listening on for requests" ++msgstr "Indique le port HTTP où Tinyproxy est en écoute de requêtes" ++ ++msgid "Specifies the Tinyproxy hostname to use in the Via HTTP header" ++msgstr "" ++"Indique le nom d'hôte que Tinyproxy utilisera dans l'entête HTTP « Via »" ++ ++msgid "" ++"Specifies the address Tinyproxy binds to for outbound forwarded requests" ++msgstr "" ++"Décrit l'adresse que Tinyproxy utilisera pour les requêtes retransmises à " ++"l'extérieur" ++ ++msgid "Specifies the addresses Tinyproxy is listening on for requests" ++msgstr "Indique les adresses où Tinyproxy est en écoute de requêtes" ++ ++msgid "Specifies the group name the Tinyproxy process is running as" ++msgstr "" ++"Indique le nom de groupe sous lequel les processus Tinyproxy fonctionnent" ++ ++msgid "" ++"Specifies the upstream proxy to use for accessing the target host. Format is " ++"address:port" ++msgstr "" ++"Indique un mandataire amont à utiliser pour atteindre l'hôte cible. Le " ++"format est adresse:port" ++ ++msgid "Specifies the user name the Tinyproxy process is running as" ++msgstr "" ++"Indique le nom d'utilisateur sous lequel les processus Tinyproxy fonctionnent" ++ ++msgid "Start spare servers" ++msgstr "Serveurs en surplus au démarrage" ++ ++msgid "Statistics page" ++msgstr "Page de statistiques" ++ ++msgid "Status" ++msgstr "Statut" ++ ++msgid "Target host" ++msgstr "Hôte de destination" ++ ++msgid "Tinyproxy" ++msgstr "Tinyproxy" ++ ++msgid "Tinyproxy Status" ++msgstr "Statut Tinyproxy" ++ ++msgid "Tinyproxy is a small and fast non-caching HTTP(S)-Proxy" ++msgstr "Tinyproxy is a small and fast non-caching HTTP(S)-Proxy" ++ ++msgid "Upstream Proxies" ++msgstr "Mandataires amont" ++ ++msgid "" ++"Upstream proxy rules define proxy servers to use when accessing certain IP " ++"addresses or domains." ++msgstr "" ++"Les règles de mandataires amont définissent les serveurs mandataire à " ++"utiliser pour l'accès à certaines adresses IP ou domaines." ++ ++msgid "Use syslog" ++msgstr "Utiliser syslog" ++ ++msgid "User" ++msgstr "Utilisateur" ++ ++msgid "Via hostname" ++msgstr "nom d'hôte « Via »" ++ ++msgid "Via proxy" ++msgstr "Via proxy" ++ ++msgid "Writes log messages to syslog instead of a log file" ++msgstr "Envoyer les messages à syslog plutôt que dans un fichier-journal" ++ ++msgid "X-Tinyproxy header" ++msgstr "Entête X-Tinyproxy" ++ ++#~ msgid "Allow access from" ++#~ msgstr "Allow access from" ++ ++#~ msgid "Allowed headers for anonymous proxy" ++#~ msgstr "Allowed headers for anonymous proxy" ++ ++#~ msgid "Bind outgoing traffic to address" ++#~ msgstr "Lier le trafic sortant à l'adresse ip" ++ ++#~ msgid "Ports allowed for CONNECT method" ++#~ msgstr "Ports allowed for CONNECT method" ++ ++#~ msgid "0 = disabled, empty = all" ++#~ msgstr "0 = disabled, empty = all" ++ ++#~ msgid "Error document" ++#~ msgstr "Fichier d'erreur" ++ ++#~ msgid "Filter list" ++#~ msgstr "Liste de filtres" ++ ++#~ msgid "Case sensitive filters" ++#~ msgstr "Case sensitive filters" ++ ++#~ msgid "Filter list is a whitelist" ++#~ msgstr "Filter list is a whitelist" ++ ++#~ msgid "Extended regular expression filters" ++#~ msgstr "Extended regular expression filters" ++ ++#~ msgid "Filter URLs instead of domains" ++#~ msgstr "Filter URLs instead of domains" ++ ++#~ msgid "Listen on address" ++#~ msgstr "Listen on address" ++ ++#~ msgid "Logfile" ++#~ msgstr "Chemin du fichier de log" ++ ++#~ msgid "Maximum number of clients" ++#~ msgstr "Nombre maximum de clients" ++ ++#~ msgid "Maximum requests per thread" ++#~ msgstr "Maximum de connexion par processus" ++ ++#~ msgid "Spare servers to start with" ++#~ msgstr "Nombre de processus serveur lancés au demarrage" ++ ++#~ msgid "Statistic document" ++#~ msgstr "Fichier de statistiques" ++ ++#~ msgid "Write to syslog" ++#~ msgstr "Écrire dans le journal système (Syslog)" ++ ++#~ msgid "Connection Timeout" ++#~ msgstr "Délai de connexion" ++ ++#~ msgid "Value of Via-Header" ++#~ msgstr "Valeur de l'entête \"VIA\" utilisée comme nom d'hôte" ++ ++#~ msgid "Include client IP" ++#~ msgstr "Inclure l'ip du client" ++ ++#~ msgid "Upstream Control" ++#~ msgstr "Upstream Control" ++ ++#~ msgid "Type" ++#~ msgstr "Type" ++ ++#~ msgid "Upstream Proxy" ++#~ msgstr "Proxy" +diff --git a/feeds/luci/applications/luci-app-tinyproxy/po/he/tinyproxy.po b/feeds/luci/applications/luci-app-tinyproxy/po/he/tinyproxy.po +new file mode 100644 +index 0000000..5c4dddd +--- /dev/null ++++ b/feeds/luci/applications/luci-app-tinyproxy/po/he/tinyproxy.po +@@ -0,0 +1,255 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Last-Translator: Automatically generated\n" ++"Language-Team: none\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n != 1);\n" ++ ++msgid "" ++"Via proxy routes requests to the given target via the specifed " ++"upstream proxy, Reject access disables any upstream proxy for the " ++"target" ++msgstr "" ++ ++msgid "" ++"Adds an \"X-Tinyproxy\" HTTP header with the client IP address to forwarded " ++"requests" ++msgstr "" ++ ++msgid "Allowed clients" ++msgstr "" ++ ++msgid "Allowed connect ports" ++msgstr "" ++ ++msgid "Bind address" ++msgstr "" ++ ++msgid "" ++"By default, basic POSIX expressions are used for filtering. Enable this to " ++"activate extended regular expressions" ++msgstr "" ++ ++msgid "" ++"By default, filter strings are treated as case-insensitive. Enable this to " ++"make the matching case-sensitive" ++msgstr "" ++ ++msgid "" ++"By default, filtering is done based on domain names. Enable this to match " ++"against URLs instead" ++msgstr "" ++ ++msgid "" ++"By default, the filter rules act as blacklist. Enable this option to only " ++"allow matched URLs or domain names" ++msgstr "" ++ ++msgid "" ++"Can be either an IP address or range, a domain name or \".\" for any host " ++"without domain" ++msgstr "" ++ ++msgid "Configuration" ++msgstr "" ++ ++msgid "Connection timeout" ++msgstr "" ++ ++msgid "Default deny" ++msgstr "" ++ ++msgid "Enable Tinyproxy server" ++msgstr "" ++ ++msgid "Error page" ++msgstr "" ++ ++msgid "Failed to retrieve statistics from url:" ++msgstr "" ++ ++msgid "Filter by RegExp" ++msgstr "" ++ ++msgid "Filter by URLs" ++msgstr "" ++ ++msgid "Filter case-sensitive" ++msgstr "" ++ ++msgid "Filter file" ++msgstr "" ++ ++msgid "Filtering and ACLs" ++msgstr "" ++ ++msgid "General settings" ++msgstr "" ++ ++msgid "Group" ++msgstr "" ++ ++msgid "HTML template file to serve for stat host requests" ++msgstr "" ++ ++msgid "HTML template file to serve when HTTP errors occur" ++msgstr "" ++ ++msgid "Header whitelist" ++msgstr "" ++ ++msgid "" ++"List of IP addresses or ranges which are allowed to use the proxy server" ++msgstr "" ++ ++msgid "" ++"List of allowed ports for the CONNECT method. A single value \"0\" allows " ++"all ports" ++msgstr "" ++ ++msgid "Listen address" ++msgstr "" ++ ++msgid "Listen port" ++msgstr "" ++ ++msgid "Log file" ++msgstr "" ++ ++msgid "Log file to use for dumping messages" ++msgstr "" ++ ++msgid "Log level" ++msgstr "" ++ ++msgid "Logging verbosity of the Tinyproxy process" ++msgstr "" ++ ++msgid "Max. clients" ++msgstr "" ++ ++msgid "Max. requests per server" ++msgstr "" ++ ++msgid "Max. spare servers" ++msgstr "" ++ ++msgid "Maximum allowed number of concurrently connected clients" ++msgstr "" ++ ++msgid "" ++"Maximum allowed number of requests per process. If it is exeeded, the " ++"process is restarted. Zero means unlimited." ++msgstr "" ++ ++msgid "Maximum number of prepared idle processes" ++msgstr "" ++ ++msgid "Maximum number of seconds an inactive connection is held open" ++msgstr "" ++ ++msgid "Min. spare servers" ++msgstr "" ++ ++msgid "Minimum number of prepared idle processes" ++msgstr "" ++ ++msgid "Number of idle processes to start when launching Tinyproxy" ++msgstr "" ++ ++msgid "Plaintext file with URLs or domains to filter. One entry per line" ++msgstr "" ++ ++msgid "Policy" ++msgstr "" ++ ++msgid "Privacy settings" ++msgstr "" ++ ++msgid "Reject access" ++msgstr "" ++ ++msgid "Server Settings" ++msgstr "" ++ ++msgid "Server limits" ++msgstr "" ++ ++msgid "" ++"Specifies HTTP header names which are allowed to pass-through, all others " ++"are discarded. Leave empty to disable header filtering" ++msgstr "" ++ ++msgid "Specifies the HTTP port Tinyproxy is listening on for requests" ++msgstr "" ++ ++msgid "Specifies the Tinyproxy hostname to use in the Via HTTP header" ++msgstr "" ++ ++msgid "" ++"Specifies the address Tinyproxy binds to for outbound forwarded requests" ++msgstr "" ++ ++msgid "Specifies the addresses Tinyproxy is listening on for requests" ++msgstr "" ++ ++msgid "Specifies the group name the Tinyproxy process is running as" ++msgstr "" ++ ++msgid "" ++"Specifies the upstream proxy to use for accessing the target host. Format is " ++"address:port" ++msgstr "" ++ ++msgid "Specifies the user name the Tinyproxy process is running as" ++msgstr "" ++ ++msgid "Start spare servers" ++msgstr "" ++ ++msgid "Statistics page" ++msgstr "" ++ ++msgid "Status" ++msgstr "" ++ ++msgid "Target host" ++msgstr "" ++ ++msgid "Tinyproxy" ++msgstr "" ++ ++msgid "Tinyproxy Status" ++msgstr "" ++ ++msgid "Tinyproxy is a small and fast non-caching HTTP(S)-Proxy" ++msgstr "" ++ ++msgid "Upstream Proxies" ++msgstr "" ++ ++msgid "" ++"Upstream proxy rules define proxy servers to use when accessing certain IP " ++"addresses or domains." ++msgstr "" ++ ++msgid "Use syslog" ++msgstr "" ++ ++msgid "User" ++msgstr "" ++ ++msgid "Via hostname" ++msgstr "" ++ ++msgid "Via proxy" ++msgstr "" ++ ++msgid "Writes log messages to syslog instead of a log file" ++msgstr "" ++ ++msgid "X-Tinyproxy header" ++msgstr "" +diff --git a/feeds/luci/applications/luci-app-tinyproxy/po/hu/tinyproxy.po b/feeds/luci/applications/luci-app-tinyproxy/po/hu/tinyproxy.po +new file mode 100644 +index 0000000..5c4dddd +--- /dev/null ++++ b/feeds/luci/applications/luci-app-tinyproxy/po/hu/tinyproxy.po +@@ -0,0 +1,255 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Last-Translator: Automatically generated\n" ++"Language-Team: none\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n != 1);\n" ++ ++msgid "" ++"Via proxy routes requests to the given target via the specifed " ++"upstream proxy, Reject access disables any upstream proxy for the " ++"target" ++msgstr "" ++ ++msgid "" ++"Adds an \"X-Tinyproxy\" HTTP header with the client IP address to forwarded " ++"requests" ++msgstr "" ++ ++msgid "Allowed clients" ++msgstr "" ++ ++msgid "Allowed connect ports" ++msgstr "" ++ ++msgid "Bind address" ++msgstr "" ++ ++msgid "" ++"By default, basic POSIX expressions are used for filtering. Enable this to " ++"activate extended regular expressions" ++msgstr "" ++ ++msgid "" ++"By default, filter strings are treated as case-insensitive. Enable this to " ++"make the matching case-sensitive" ++msgstr "" ++ ++msgid "" ++"By default, filtering is done based on domain names. Enable this to match " ++"against URLs instead" ++msgstr "" ++ ++msgid "" ++"By default, the filter rules act as blacklist. Enable this option to only " ++"allow matched URLs or domain names" ++msgstr "" ++ ++msgid "" ++"Can be either an IP address or range, a domain name or \".\" for any host " ++"without domain" ++msgstr "" ++ ++msgid "Configuration" ++msgstr "" ++ ++msgid "Connection timeout" ++msgstr "" ++ ++msgid "Default deny" ++msgstr "" ++ ++msgid "Enable Tinyproxy server" ++msgstr "" ++ ++msgid "Error page" ++msgstr "" ++ ++msgid "Failed to retrieve statistics from url:" ++msgstr "" ++ ++msgid "Filter by RegExp" ++msgstr "" ++ ++msgid "Filter by URLs" ++msgstr "" ++ ++msgid "Filter case-sensitive" ++msgstr "" ++ ++msgid "Filter file" ++msgstr "" ++ ++msgid "Filtering and ACLs" ++msgstr "" ++ ++msgid "General settings" ++msgstr "" ++ ++msgid "Group" ++msgstr "" ++ ++msgid "HTML template file to serve for stat host requests" ++msgstr "" ++ ++msgid "HTML template file to serve when HTTP errors occur" ++msgstr "" ++ ++msgid "Header whitelist" ++msgstr "" ++ ++msgid "" ++"List of IP addresses or ranges which are allowed to use the proxy server" ++msgstr "" ++ ++msgid "" ++"List of allowed ports for the CONNECT method. A single value \"0\" allows " ++"all ports" ++msgstr "" ++ ++msgid "Listen address" ++msgstr "" ++ ++msgid "Listen port" ++msgstr "" ++ ++msgid "Log file" ++msgstr "" ++ ++msgid "Log file to use for dumping messages" ++msgstr "" ++ ++msgid "Log level" ++msgstr "" ++ ++msgid "Logging verbosity of the Tinyproxy process" ++msgstr "" ++ ++msgid "Max. clients" ++msgstr "" ++ ++msgid "Max. requests per server" ++msgstr "" ++ ++msgid "Max. spare servers" ++msgstr "" ++ ++msgid "Maximum allowed number of concurrently connected clients" ++msgstr "" ++ ++msgid "" ++"Maximum allowed number of requests per process. If it is exeeded, the " ++"process is restarted. Zero means unlimited." ++msgstr "" ++ ++msgid "Maximum number of prepared idle processes" ++msgstr "" ++ ++msgid "Maximum number of seconds an inactive connection is held open" ++msgstr "" ++ ++msgid "Min. spare servers" ++msgstr "" ++ ++msgid "Minimum number of prepared idle processes" ++msgstr "" ++ ++msgid "Number of idle processes to start when launching Tinyproxy" ++msgstr "" ++ ++msgid "Plaintext file with URLs or domains to filter. One entry per line" ++msgstr "" ++ ++msgid "Policy" ++msgstr "" ++ ++msgid "Privacy settings" ++msgstr "" ++ ++msgid "Reject access" ++msgstr "" ++ ++msgid "Server Settings" ++msgstr "" ++ ++msgid "Server limits" ++msgstr "" ++ ++msgid "" ++"Specifies HTTP header names which are allowed to pass-through, all others " ++"are discarded. Leave empty to disable header filtering" ++msgstr "" ++ ++msgid "Specifies the HTTP port Tinyproxy is listening on for requests" ++msgstr "" ++ ++msgid "Specifies the Tinyproxy hostname to use in the Via HTTP header" ++msgstr "" ++ ++msgid "" ++"Specifies the address Tinyproxy binds to for outbound forwarded requests" ++msgstr "" ++ ++msgid "Specifies the addresses Tinyproxy is listening on for requests" ++msgstr "" ++ ++msgid "Specifies the group name the Tinyproxy process is running as" ++msgstr "" ++ ++msgid "" ++"Specifies the upstream proxy to use for accessing the target host. Format is " ++"address:port" ++msgstr "" ++ ++msgid "Specifies the user name the Tinyproxy process is running as" ++msgstr "" ++ ++msgid "Start spare servers" ++msgstr "" ++ ++msgid "Statistics page" ++msgstr "" ++ ++msgid "Status" ++msgstr "" ++ ++msgid "Target host" ++msgstr "" ++ ++msgid "Tinyproxy" ++msgstr "" ++ ++msgid "Tinyproxy Status" ++msgstr "" ++ ++msgid "Tinyproxy is a small and fast non-caching HTTP(S)-Proxy" ++msgstr "" ++ ++msgid "Upstream Proxies" ++msgstr "" ++ ++msgid "" ++"Upstream proxy rules define proxy servers to use when accessing certain IP " ++"addresses or domains." ++msgstr "" ++ ++msgid "Use syslog" ++msgstr "" ++ ++msgid "User" ++msgstr "" ++ ++msgid "Via hostname" ++msgstr "" ++ ++msgid "Via proxy" ++msgstr "" ++ ++msgid "Writes log messages to syslog instead of a log file" ++msgstr "" ++ ++msgid "X-Tinyproxy header" ++msgstr "" +diff --git a/feeds/luci/applications/luci-app-tinyproxy/po/it/tinyproxy.po b/feeds/luci/applications/luci-app-tinyproxy/po/it/tinyproxy.po +new file mode 100644 +index 0000000..34528c1 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-tinyproxy/po/it/tinyproxy.po +@@ -0,0 +1,265 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Report-Msgid-Bugs-To: \n" ++"POT-Creation-Date: 2009-05-19 19:36+0200\n" ++"PO-Revision-Date: 2012-12-15 19:29+0200\n" ++"Last-Translator: claudyus \n" ++"Language-Team: LANGUAGE \n" ++"Language: it\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n != 1);\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "" ++"Via proxy routes requests to the given target via the specifed " ++"upstream proxy, Reject access disables any upstream proxy for the " ++"target" ++msgstr "" ++ ++msgid "" ++"Adds an \"X-Tinyproxy\" HTTP header with the client IP address to forwarded " ++"requests" ++msgstr "" ++"Aggiungi una intestazione http \"X-Tinyproxy\" contenente l'IP del client a " ++"cui forwardare la richiesta" ++ ++msgid "Allowed clients" ++msgstr "Client permessi" ++ ++msgid "Allowed connect ports" ++msgstr "Porte di connessione permesse" ++ ++msgid "Bind address" ++msgstr "Bind Address" ++ ++msgid "" ++"By default, basic POSIX expressions are used for filtering. Enable this to " ++"activate extended regular expressions" ++msgstr "" ++ ++msgid "" ++"By default, filter strings are treated as case-insensitive. Enable this to " ++"make the matching case-sensitive" ++msgstr "" ++ ++msgid "" ++"By default, filtering is done based on domain names. Enable this to match " ++"against URLs instead" ++msgstr "" ++"Di default, il filto è basato sul nome di dominio. Abilita questa opzione " ++"per effettuare il match con URL" ++ ++msgid "" ++"By default, the filter rules act as blacklist. Enable this option to only " ++"allow matched URLs or domain names" ++msgstr "" ++ ++msgid "" ++"Can be either an IP address or range, a domain name or \".\" for any host " ++"without domain" ++msgstr "" ++ ++msgid "Configuration" ++msgstr "Configurazione" ++ ++msgid "Connection timeout" ++msgstr "" ++ ++msgid "Default deny" ++msgstr "" ++ ++msgid "Enable Tinyproxy server" ++msgstr "Abilita il server Tinyproxy" ++ ++msgid "Error page" ++msgstr "" ++ ++msgid "Failed to retrieve statistics from url:" ++msgstr "Impossibile recuperare le statistiche dall'url:" ++ ++msgid "Filter by RegExp" ++msgstr "" ++ ++msgid "Filter by URLs" ++msgstr "" ++ ++msgid "Filter case-sensitive" ++msgstr "" ++ ++msgid "Filter file" ++msgstr "" ++ ++msgid "Filtering and ACLs" ++msgstr "" ++ ++msgid "General settings" ++msgstr "" ++ ++msgid "Group" ++msgstr "" ++ ++msgid "HTML template file to serve for stat host requests" ++msgstr "" ++ ++msgid "HTML template file to serve when HTTP errors occur" ++msgstr "" ++ ++msgid "Header whitelist" ++msgstr "" ++ ++msgid "" ++"List of IP addresses or ranges which are allowed to use the proxy server" ++msgstr "" ++"Lista di indirizzi IP o range di indirizzi a cui è permesso l'uso del proxy" ++ ++msgid "" ++"List of allowed ports for the CONNECT method. A single value \"0\" allows " ++"all ports" ++msgstr "" ++ ++msgid "Listen address" ++msgstr "" ++ ++msgid "Listen port" ++msgstr "" ++ ++msgid "Log file" ++msgstr "" ++ ++msgid "Log file to use for dumping messages" ++msgstr "" ++ ++msgid "Log level" ++msgstr "" ++ ++msgid "Logging verbosity of the Tinyproxy process" ++msgstr "" ++ ++msgid "Max. clients" ++msgstr "" ++ ++msgid "Max. requests per server" ++msgstr "" ++ ++msgid "Max. spare servers" ++msgstr "" ++ ++msgid "Maximum allowed number of concurrently connected clients" ++msgstr "Numero massimo di client simultanei permessi" ++ ++msgid "" ++"Maximum allowed number of requests per process. If it is exeeded, the " ++"process is restarted. Zero means unlimited." ++msgstr "" ++ ++msgid "Maximum number of prepared idle processes" ++msgstr "" ++ ++msgid "Maximum number of seconds an inactive connection is held open" ++msgstr "" ++ ++msgid "Min. spare servers" ++msgstr "" ++ ++msgid "Minimum number of prepared idle processes" ++msgstr "" ++ ++msgid "Number of idle processes to start when launching Tinyproxy" ++msgstr "" ++ ++msgid "Plaintext file with URLs or domains to filter. One entry per line" ++msgstr "" ++ ++msgid "Policy" ++msgstr "" ++ ++msgid "Privacy settings" ++msgstr "" ++ ++msgid "Reject access" ++msgstr "" ++ ++msgid "Server Settings" ++msgstr "" ++ ++msgid "Server limits" ++msgstr "" ++ ++msgid "" ++"Specifies HTTP header names which are allowed to pass-through, all others " ++"are discarded. Leave empty to disable header filtering" ++msgstr "" ++ ++msgid "Specifies the HTTP port Tinyproxy is listening on for requests" ++msgstr "" ++ ++msgid "Specifies the Tinyproxy hostname to use in the Via HTTP header" ++msgstr "" ++ ++msgid "" ++"Specifies the address Tinyproxy binds to for outbound forwarded requests" ++msgstr "" ++ ++msgid "Specifies the addresses Tinyproxy is listening on for requests" ++msgstr "" ++ ++msgid "Specifies the group name the Tinyproxy process is running as" ++msgstr "" ++ ++msgid "" ++"Specifies the upstream proxy to use for accessing the target host. Format is " ++"address:port" ++msgstr "" ++ ++msgid "Specifies the user name the Tinyproxy process is running as" ++msgstr "" ++ ++msgid "Start spare servers" ++msgstr "" ++ ++msgid "Statistics page" ++msgstr "" ++ ++msgid "Status" ++msgstr "" ++ ++msgid "Target host" ++msgstr "" ++ ++msgid "Tinyproxy" ++msgstr "" ++ ++msgid "Tinyproxy Status" ++msgstr "" ++ ++msgid "Tinyproxy is a small and fast non-caching HTTP(S)-Proxy" ++msgstr "" ++ ++msgid "Upstream Proxies" ++msgstr "" ++ ++msgid "" ++"Upstream proxy rules define proxy servers to use when accessing certain IP " ++"addresses or domains." ++msgstr "" ++ ++msgid "Use syslog" ++msgstr "" ++ ++msgid "User" ++msgstr "" ++ ++msgid "Via hostname" ++msgstr "" ++ ++msgid "Via proxy" ++msgstr "" ++ ++msgid "Writes log messages to syslog instead of a log file" ++msgstr "" ++ ++msgid "X-Tinyproxy header" ++msgstr "" +diff --git a/feeds/luci/applications/luci-app-tinyproxy/po/ja/tinyproxy.po b/feeds/luci/applications/luci-app-tinyproxy/po/ja/tinyproxy.po +new file mode 100644 +index 0000000..03ea890 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-tinyproxy/po/ja/tinyproxy.po +@@ -0,0 +1,280 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Report-Msgid-Bugs-To: \n" ++"POT-Creation-Date: 2009-05-19 19:36+0200\n" ++"PO-Revision-Date: 2011-10-05 17:53+0200\n" ++"Last-Translator: Kentaro \n" ++"Language-Team: LANGUAGE \n" ++"Language: ja\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=1; plural=0;\n" ++"X-Generator: Pootle 2.0.4\n" ++ ++msgid "" ++"Via proxy routes requests to the given target via the specifed " ++"upstream proxy, Reject access disables any upstream proxy for the " ++"target" ++msgstr "" ++ ++msgid "" ++"Adds an \"X-Tinyproxy\" HTTP header with the client IP address to forwarded " ++"requests" ++msgstr "" ++"転é€ã™ã‚‹ãƒªã‚¯ã‚¨ã‚¹ãƒˆã®HTTPヘッダã«\"X-Tinyproxy\"åŠã³ã‚¯ãƒ©ã‚¤ã‚¢ãƒ³ãƒˆIPアドレスを追" ++"加ã—ã¾ã™ã€‚" ++ ++msgid "Allowed clients" ++msgstr "接続を許å¯ã™ã‚‹ã‚¯ãƒ©ã‚¤ã‚¢ãƒ³ãƒˆ" ++ ++msgid "Allowed connect ports" ++msgstr "接続を許å¯ã™ã‚‹ãƒãƒ¼ãƒˆç•ªå·" ++ ++msgid "Bind address" ++msgstr "ãƒã‚¤ãƒ³ãƒ‰ã™ã‚‹IPアドレス" ++ ++msgid "" ++"By default, basic POSIX expressions are used for filtering. Enable this to " ++"activate extended regular expressions" ++msgstr "" ++"標準ã§ã¯ã€åŸºæœ¬çš„ãªPOSIXæ­£è¦è¡¨ç¾ãŒãƒ•ã‚£ãƒ«ã‚¿ãƒªãƒ³ã‚°ã«ä½¿ç”¨ã•ã‚Œã¾ã™ãŒã€ã“ã®ã‚ªãƒ—ショ" ++"ンãŒæœ‰åŠ¹ã«è¨­å®šã•ã‚Œã¦ã„ã‚‹å ´åˆã€æ‹¡å¼µç‰ˆã®POSIXæ­£è¦è¡¨ç¾ãŒç”¨ã„られã¾ã™ã€‚" ++ ++msgid "" ++"By default, filter strings are treated as case-insensitive. Enable this to " ++"make the matching case-sensitive" ++msgstr "" ++"標準ã§ã¯ã€ãƒ•ã‚£ãƒ«ã‚¿ãƒ¼ã®æ–‡å­—列ã¯å¤§æ–‡å­—å°æ–‡å­—を区別ã—ã¾ã›ã‚“ãŒã€ã“ã®ã‚ªãƒ—ションãŒ" ++"有効ã«è¨­å®šã•ã‚Œã¦ã„ã‚‹å ´åˆã€åŒºåˆ¥ã—ã¦ãƒ•ã‚£ãƒ«ã‚¿ãƒªãƒ³ã‚°ã‚’è¡Œã„ã¾ã™ã€‚" ++ ++msgid "" ++"By default, filtering is done based on domain names. Enable this to match " ++"against URLs instead" ++msgstr "" ++"標準ã§ã¯ã€ãƒ‰ãƒ¡ã‚¤ãƒ³åを使用ã—ã¦ãƒ•ã‚£ãƒ«ã‚¿ãƒªãƒ³ã‚°ã‚’è¡Œã„ã¾ã™ãŒã€ã“ã®ã‚ªãƒ—ションãŒæœ‰" ++"効ã«è¨­å®šã•ã‚Œã¦ã„ã‚‹å ´åˆã€ä»£ã‚ã‚Šã«URLã«å¯¾ã—ã¦ãƒ•ã‚£ãƒ«ã‚¿ãƒªãƒ³ã‚°ã‚’è¡Œã„ã¾ã™ã€‚" ++ ++msgid "" ++"By default, the filter rules act as blacklist. Enable this option to only " ++"allow matched URLs or domain names" ++msgstr "" ++"標準ã§ã¯ã€ãƒ•ã‚£ãƒ«ã‚¿ãƒªãƒ³ã‚°ãƒ»ãƒ«ãƒ¼ãƒ«ã¯ãƒ–ラックリストã¨ã—ã¦å‹•ä½œã—ã¾ã™ãŒã€ã“ã®ã‚ªãƒ—" ++"ションãŒæœ‰åŠ¹ã«è¨­å®šã•ã‚Œã¦ã„ã‚‹å ´åˆã€URLã¾ãŸã¯ãƒ‰ãƒ¡ã‚¤ãƒ³åãŒä¸€è‡´ã—ãŸå ´åˆã®ã¿ã€æŽ¥ç¶š" ++"ãŒè¨±å¯ã•ã‚Œã¾ã™ã€‚" ++ ++msgid "" ++"Can be either an IP address or range, a domain name or \".\" for any host " ++"without domain" ++msgstr "" ++ ++msgid "Configuration" ++msgstr "" ++ ++msgid "Connection timeout" ++msgstr "接続タイムアウト" ++ ++msgid "Default deny" ++msgstr "" ++ ++msgid "Enable Tinyproxy server" ++msgstr "Tinyproxy サーãƒãƒ¼ã‚’有効ã«ã™ã‚‹" ++ ++msgid "Error page" ++msgstr "エラーページ" ++ ++msgid "Failed to retrieve statistics from url:" ++msgstr "" ++ ++msgid "Filter by RegExp" ++msgstr "æ­£è¦è¡¨ç¾ãƒ•ã‚£ãƒ«ã‚¿ãƒªãƒ³ã‚°" ++ ++msgid "Filter by URLs" ++msgstr "URL フィルタリング" ++ ++msgid "Filter case-sensitive" ++msgstr "大文字å°æ–‡å­—を区別ã—ã¦ãƒ•ã‚£ãƒ«ã‚¿ãƒªãƒ³ã‚°" ++ ++msgid "Filter file" ++msgstr "フィルタファイル" ++ ++msgid "Filtering and ACLs" ++msgstr "フィルタリングã¨ã‚¢ã‚¯ã‚»ã‚¹åˆ¶å¾¡" ++ ++msgid "General settings" ++msgstr "基本設定" ++ ++msgid "Group" ++msgstr "グループ" ++ ++msgid "HTML template file to serve for stat host requests" ++msgstr "リクエスト数を表示ã™ã‚‹HTMLテンプレートファイル" ++ ++msgid "HTML template file to serve when HTTP errors occur" ++msgstr "HTTPエラー時ã«è¡¨ç¤ºã™ã‚‹HTMLテンプレートファイル" ++ ++msgid "Header whitelist" ++msgstr "ヘッダー・ホワイトリスト" ++ ++msgid "" ++"List of IP addresses or ranges which are allowed to use the proxy server" ++msgstr "プロキシサーãƒãƒ¼ã®ä½¿ç”¨ã‚’許å¯ã™ã‚‹IPアドレスリストã§ã™ã€‚" ++ ++msgid "" ++"List of allowed ports for the CONNECT method. A single value \"0\" allows " ++"all ports" ++msgstr "" ++"プロキシサーãƒãƒ¼ã‹ã‚‰æŽ¥ç¶šå¯èƒ½ãªãƒãƒ¼ãƒˆãƒªã‚¹ãƒˆã§ã™ã€‚\"0\"を設定ã—ãŸå ´åˆã€ã™ã¹ã¦ã®" ++"ãƒãƒ¼ãƒˆã‚’許å¯ã—ã¾ã™ã€‚" ++ ++msgid "Listen address" ++msgstr "å¾…å—アドレス" ++ ++msgid "Listen port" ++msgstr "å¾…å—ãƒãƒ¼ãƒˆ" ++ ++msgid "Log file" ++msgstr "ログファイル" ++ ++msgid "Log file to use for dumping messages" ++msgstr "メッセージを書ã込むログファイルを指定ã—ã¾ã™ã€‚" ++ ++msgid "Log level" ++msgstr "ログレベル" ++ ++msgid "Logging verbosity of the Tinyproxy process" ++msgstr "Tinyproxyプロセスã®ãƒ­ã‚°ã®è©³ç´°åº¦ã‚’設定" ++ ++msgid "Max. clients" ++msgstr "最大クライアント数" ++ ++msgid "Max. requests per server" ++msgstr "サーãƒãƒ¼æ¯Žã®æœ€å¤§ãƒªã‚¯ã‚¨ã‚¹ãƒˆæ•°" ++ ++msgid "Max. spare servers" ++msgstr "" ++ ++msgid "Maximum allowed number of concurrently connected clients" ++msgstr "" ++ ++msgid "" ++"Maximum allowed number of requests per process. If it is exeeded, the " ++"process is restarted. Zero means unlimited." ++msgstr "" ++"プロセス毎ã®è¨±å¯ã•ã‚Œã‚‹æœ€å¤§ãƒªã‚¯ã‚¨ã‚¹ãƒˆæ•°ã‚’設定ã—ã¾ã™ã€‚設定値を超ãˆãŸå ´åˆã€ãƒ—ロ" ++"セスをå†èµ·å‹•ã—ã¾ã™ã€‚0を入力ã™ã‚‹ã¨ã€ç„¡åˆ¶é™ã«è¨­å®šã•ã‚Œã¾ã™ã€‚" ++ ++msgid "Maximum number of prepared idle processes" ++msgstr "アイドル状態ã§æº–å‚™ã™ã‚‹ãƒ—ロセスã®æœ€å¤§æ•°" ++ ++msgid "Maximum number of seconds an inactive connection is held open" ++msgstr "" ++ ++msgid "Min. spare servers" ++msgstr "" ++ ++msgid "Minimum number of prepared idle processes" ++msgstr "アイドル状態ã§æº–å‚™ã™ã‚‹ãƒ—ロセスã®æœ€å°æ•°" ++ ++msgid "Number of idle processes to start when launching Tinyproxy" ++msgstr "" ++ ++msgid "Plaintext file with URLs or domains to filter. One entry per line" ++msgstr "" ++ ++msgid "Policy" ++msgstr "ãƒãƒªã‚·ãƒ¼" ++ ++msgid "Privacy settings" ++msgstr "プライãƒã‚·ãƒ¼è¨­å®š" ++ ++msgid "Reject access" ++msgstr "アクセス拒å¦" ++ ++msgid "Server Settings" ++msgstr "サーãƒãƒ¼è¨­å®š" ++ ++msgid "Server limits" ++msgstr "サーãƒãƒ¼åˆ¶é™è¨­å®š" ++ ++msgid "" ++"Specifies HTTP header names which are allowed to pass-through, all others " ++"are discarded. Leave empty to disable header filtering" ++msgstr "" ++ ++msgid "Specifies the HTTP port Tinyproxy is listening on for requests" ++msgstr "リクエストã«å¯¾ã—ã¦ã€TinyproxyãŒå¾…ã¡å—ã‘ã‚‹HTTPãƒãƒ¼ãƒˆã‚’設定ã—ã¾ã™" ++ ++msgid "Specifies the Tinyproxy hostname to use in the Via HTTP header" ++msgstr "" ++ ++msgid "" ++"Specifies the address Tinyproxy binds to for outbound forwarded requests" ++msgstr "" ++ ++msgid "Specifies the addresses Tinyproxy is listening on for requests" ++msgstr "リクエストã«å¯¾ã—ã¦ã€TinyproxyãŒå¾…ã¡å—ã‘るアドレスを設定ã—ã¾ã™ã€‚" ++ ++msgid "Specifies the group name the Tinyproxy process is running as" ++msgstr "Tinyproxyを実行ã™ã‚‹ã‚°ãƒ«ãƒ¼ãƒ—を設定ã—ã¾ã™" ++ ++msgid "" ++"Specifies the upstream proxy to use for accessing the target host. Format is " ++"address:port" ++msgstr "" ++"特定ã®ãƒ›ã‚¹ãƒˆã«ã‚¢ã‚¯ã‚»ã‚¹ã™ã‚‹éš›ã«ä½¿ç”¨ã™ã‚‹ã€ä¸Šä½ã®ãƒ—ロキシサーãƒãƒ¼ã‚’設定ã—ã¾ã™ã€‚" ++"書å¼ã¯ アドレス:ãƒãƒ¼ãƒˆ ã§ã™ã€‚" ++ ++msgid "Specifies the user name the Tinyproxy process is running as" ++msgstr "Tinyproxyを実行ã™ã‚‹ãƒ¦ãƒ¼ã‚¶ãƒ¼ã‚’設定ã—ã¾ã™" ++ ++msgid "Start spare servers" ++msgstr "" ++ ++msgid "Statistics page" ++msgstr "" ++ ++msgid "Status" ++msgstr "" ++ ++msgid "Target host" ++msgstr "宛先ホスト" ++ ++msgid "Tinyproxy" ++msgstr "Tinyproxy" ++ ++msgid "Tinyproxy Status" ++msgstr "" ++ ++msgid "Tinyproxy is a small and fast non-caching HTTP(S)-Proxy" ++msgstr "" ++"Tinyproxyã¯ã€è»½é‡ã§é«˜é€Ÿãªã‚­ãƒ£ãƒƒã‚·ãƒ¥ã‚’è¡Œã‚ãªã„HTTP(S)-プロキシサーãƒãƒ¼ã§ã™ã€‚" ++ ++msgid "Upstream Proxies" ++msgstr "上ä½ã®ãƒ—ロキシサーãƒãƒ¼" ++ ++msgid "" ++"Upstream proxy rules define proxy servers to use when accessing certain IP " ++"addresses or domains." ++msgstr "" ++"特定ã®IPアドレスやドメインã«æŽ¥ç¶šã™ã‚‹å ´åˆã«ã€ä¸Šä½ã®ãƒ—ロキシサーãƒãƒ¼ã‚’使用ã™ã‚‹" ++"よã†ã«è¨­å®šã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚" ++ ++msgid "Use syslog" ++msgstr "Syslogを使用ã™ã‚‹" ++ ++msgid "User" ++msgstr "ユーザー" ++ ++msgid "Via hostname" ++msgstr "経由ã™ã‚‹ãƒ›ã‚¹ãƒˆå" ++ ++msgid "Via proxy" ++msgstr "経由ã™ã‚‹ãƒ—ロキシ" ++ ++msgid "Writes log messages to syslog instead of a log file" ++msgstr "ログファイルã®ä»£ã‚ã‚Šã«syslogã¸ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’記録ã—ã¾ã™" ++ ++msgid "X-Tinyproxy header" ++msgstr "X-Tinyproxy ヘッダー" +diff --git a/feeds/luci/applications/luci-app-tinyproxy/po/ms/tinyproxy.po b/feeds/luci/applications/luci-app-tinyproxy/po/ms/tinyproxy.po +new file mode 100644 +index 0000000..08ed7dc +--- /dev/null ++++ b/feeds/luci/applications/luci-app-tinyproxy/po/ms/tinyproxy.po +@@ -0,0 +1,254 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Last-Translator: Automatically generated\n" ++"Language-Team: none\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++ ++msgid "" ++"Via proxy routes requests to the given target via the specifed " ++"upstream proxy, Reject access disables any upstream proxy for the " ++"target" ++msgstr "" ++ ++msgid "" ++"Adds an \"X-Tinyproxy\" HTTP header with the client IP address to forwarded " ++"requests" ++msgstr "" ++ ++msgid "Allowed clients" ++msgstr "" ++ ++msgid "Allowed connect ports" ++msgstr "" ++ ++msgid "Bind address" ++msgstr "" ++ ++msgid "" ++"By default, basic POSIX expressions are used for filtering. Enable this to " ++"activate extended regular expressions" ++msgstr "" ++ ++msgid "" ++"By default, filter strings are treated as case-insensitive. Enable this to " ++"make the matching case-sensitive" ++msgstr "" ++ ++msgid "" ++"By default, filtering is done based on domain names. Enable this to match " ++"against URLs instead" ++msgstr "" ++ ++msgid "" ++"By default, the filter rules act as blacklist. Enable this option to only " ++"allow matched URLs or domain names" ++msgstr "" ++ ++msgid "" ++"Can be either an IP address or range, a domain name or \".\" for any host " ++"without domain" ++msgstr "" ++ ++msgid "Configuration" ++msgstr "" ++ ++msgid "Connection timeout" ++msgstr "" ++ ++msgid "Default deny" ++msgstr "" ++ ++msgid "Enable Tinyproxy server" ++msgstr "" ++ ++msgid "Error page" ++msgstr "" ++ ++msgid "Failed to retrieve statistics from url:" ++msgstr "" ++ ++msgid "Filter by RegExp" ++msgstr "" ++ ++msgid "Filter by URLs" ++msgstr "" ++ ++msgid "Filter case-sensitive" ++msgstr "" ++ ++msgid "Filter file" ++msgstr "" ++ ++msgid "Filtering and ACLs" ++msgstr "" ++ ++msgid "General settings" ++msgstr "" ++ ++msgid "Group" ++msgstr "" ++ ++msgid "HTML template file to serve for stat host requests" ++msgstr "" ++ ++msgid "HTML template file to serve when HTTP errors occur" ++msgstr "" ++ ++msgid "Header whitelist" ++msgstr "" ++ ++msgid "" ++"List of IP addresses or ranges which are allowed to use the proxy server" ++msgstr "" ++ ++msgid "" ++"List of allowed ports for the CONNECT method. A single value \"0\" allows " ++"all ports" ++msgstr "" ++ ++msgid "Listen address" ++msgstr "" ++ ++msgid "Listen port" ++msgstr "" ++ ++msgid "Log file" ++msgstr "" ++ ++msgid "Log file to use for dumping messages" ++msgstr "" ++ ++msgid "Log level" ++msgstr "" ++ ++msgid "Logging verbosity of the Tinyproxy process" ++msgstr "" ++ ++msgid "Max. clients" ++msgstr "" ++ ++msgid "Max. requests per server" ++msgstr "" ++ ++msgid "Max. spare servers" ++msgstr "" ++ ++msgid "Maximum allowed number of concurrently connected clients" ++msgstr "" ++ ++msgid "" ++"Maximum allowed number of requests per process. If it is exeeded, the " ++"process is restarted. Zero means unlimited." ++msgstr "" ++ ++msgid "Maximum number of prepared idle processes" ++msgstr "" ++ ++msgid "Maximum number of seconds an inactive connection is held open" ++msgstr "" ++ ++msgid "Min. spare servers" ++msgstr "" ++ ++msgid "Minimum number of prepared idle processes" ++msgstr "" ++ ++msgid "Number of idle processes to start when launching Tinyproxy" ++msgstr "" ++ ++msgid "Plaintext file with URLs or domains to filter. One entry per line" ++msgstr "" ++ ++msgid "Policy" ++msgstr "" ++ ++msgid "Privacy settings" ++msgstr "" ++ ++msgid "Reject access" ++msgstr "" ++ ++msgid "Server Settings" ++msgstr "" ++ ++msgid "Server limits" ++msgstr "" ++ ++msgid "" ++"Specifies HTTP header names which are allowed to pass-through, all others " ++"are discarded. Leave empty to disable header filtering" ++msgstr "" ++ ++msgid "Specifies the HTTP port Tinyproxy is listening on for requests" ++msgstr "" ++ ++msgid "Specifies the Tinyproxy hostname to use in the Via HTTP header" ++msgstr "" ++ ++msgid "" ++"Specifies the address Tinyproxy binds to for outbound forwarded requests" ++msgstr "" ++ ++msgid "Specifies the addresses Tinyproxy is listening on for requests" ++msgstr "" ++ ++msgid "Specifies the group name the Tinyproxy process is running as" ++msgstr "" ++ ++msgid "" ++"Specifies the upstream proxy to use for accessing the target host. Format is " ++"address:port" ++msgstr "" ++ ++msgid "Specifies the user name the Tinyproxy process is running as" ++msgstr "" ++ ++msgid "Start spare servers" ++msgstr "" ++ ++msgid "Statistics page" ++msgstr "" ++ ++msgid "Status" ++msgstr "" ++ ++msgid "Target host" ++msgstr "" ++ ++msgid "Tinyproxy" ++msgstr "" ++ ++msgid "Tinyproxy Status" ++msgstr "" ++ ++msgid "Tinyproxy is a small and fast non-caching HTTP(S)-Proxy" ++msgstr "" ++ ++msgid "Upstream Proxies" ++msgstr "" ++ ++msgid "" ++"Upstream proxy rules define proxy servers to use when accessing certain IP " ++"addresses or domains." ++msgstr "" ++ ++msgid "Use syslog" ++msgstr "" ++ ++msgid "User" ++msgstr "" ++ ++msgid "Via hostname" ++msgstr "" ++ ++msgid "Via proxy" ++msgstr "" ++ ++msgid "Writes log messages to syslog instead of a log file" ++msgstr "" ++ ++msgid "X-Tinyproxy header" ++msgstr "" +diff --git a/feeds/luci/applications/luci-app-tinyproxy/po/no/tinyproxy.po b/feeds/luci/applications/luci-app-tinyproxy/po/no/tinyproxy.po +new file mode 100644 +index 0000000..5c4dddd +--- /dev/null ++++ b/feeds/luci/applications/luci-app-tinyproxy/po/no/tinyproxy.po +@@ -0,0 +1,255 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Last-Translator: Automatically generated\n" ++"Language-Team: none\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n != 1);\n" ++ ++msgid "" ++"Via proxy routes requests to the given target via the specifed " ++"upstream proxy, Reject access disables any upstream proxy for the " ++"target" ++msgstr "" ++ ++msgid "" ++"Adds an \"X-Tinyproxy\" HTTP header with the client IP address to forwarded " ++"requests" ++msgstr "" ++ ++msgid "Allowed clients" ++msgstr "" ++ ++msgid "Allowed connect ports" ++msgstr "" ++ ++msgid "Bind address" ++msgstr "" ++ ++msgid "" ++"By default, basic POSIX expressions are used for filtering. Enable this to " ++"activate extended regular expressions" ++msgstr "" ++ ++msgid "" ++"By default, filter strings are treated as case-insensitive. Enable this to " ++"make the matching case-sensitive" ++msgstr "" ++ ++msgid "" ++"By default, filtering is done based on domain names. Enable this to match " ++"against URLs instead" ++msgstr "" ++ ++msgid "" ++"By default, the filter rules act as blacklist. Enable this option to only " ++"allow matched URLs or domain names" ++msgstr "" ++ ++msgid "" ++"Can be either an IP address or range, a domain name or \".\" for any host " ++"without domain" ++msgstr "" ++ ++msgid "Configuration" ++msgstr "" ++ ++msgid "Connection timeout" ++msgstr "" ++ ++msgid "Default deny" ++msgstr "" ++ ++msgid "Enable Tinyproxy server" ++msgstr "" ++ ++msgid "Error page" ++msgstr "" ++ ++msgid "Failed to retrieve statistics from url:" ++msgstr "" ++ ++msgid "Filter by RegExp" ++msgstr "" ++ ++msgid "Filter by URLs" ++msgstr "" ++ ++msgid "Filter case-sensitive" ++msgstr "" ++ ++msgid "Filter file" ++msgstr "" ++ ++msgid "Filtering and ACLs" ++msgstr "" ++ ++msgid "General settings" ++msgstr "" ++ ++msgid "Group" ++msgstr "" ++ ++msgid "HTML template file to serve for stat host requests" ++msgstr "" ++ ++msgid "HTML template file to serve when HTTP errors occur" ++msgstr "" ++ ++msgid "Header whitelist" ++msgstr "" ++ ++msgid "" ++"List of IP addresses or ranges which are allowed to use the proxy server" ++msgstr "" ++ ++msgid "" ++"List of allowed ports for the CONNECT method. A single value \"0\" allows " ++"all ports" ++msgstr "" ++ ++msgid "Listen address" ++msgstr "" ++ ++msgid "Listen port" ++msgstr "" ++ ++msgid "Log file" ++msgstr "" ++ ++msgid "Log file to use for dumping messages" ++msgstr "" ++ ++msgid "Log level" ++msgstr "" ++ ++msgid "Logging verbosity of the Tinyproxy process" ++msgstr "" ++ ++msgid "Max. clients" ++msgstr "" ++ ++msgid "Max. requests per server" ++msgstr "" ++ ++msgid "Max. spare servers" ++msgstr "" ++ ++msgid "Maximum allowed number of concurrently connected clients" ++msgstr "" ++ ++msgid "" ++"Maximum allowed number of requests per process. If it is exeeded, the " ++"process is restarted. Zero means unlimited." ++msgstr "" ++ ++msgid "Maximum number of prepared idle processes" ++msgstr "" ++ ++msgid "Maximum number of seconds an inactive connection is held open" ++msgstr "" ++ ++msgid "Min. spare servers" ++msgstr "" ++ ++msgid "Minimum number of prepared idle processes" ++msgstr "" ++ ++msgid "Number of idle processes to start when launching Tinyproxy" ++msgstr "" ++ ++msgid "Plaintext file with URLs or domains to filter. One entry per line" ++msgstr "" ++ ++msgid "Policy" ++msgstr "" ++ ++msgid "Privacy settings" ++msgstr "" ++ ++msgid "Reject access" ++msgstr "" ++ ++msgid "Server Settings" ++msgstr "" ++ ++msgid "Server limits" ++msgstr "" ++ ++msgid "" ++"Specifies HTTP header names which are allowed to pass-through, all others " ++"are discarded. Leave empty to disable header filtering" ++msgstr "" ++ ++msgid "Specifies the HTTP port Tinyproxy is listening on for requests" ++msgstr "" ++ ++msgid "Specifies the Tinyproxy hostname to use in the Via HTTP header" ++msgstr "" ++ ++msgid "" ++"Specifies the address Tinyproxy binds to for outbound forwarded requests" ++msgstr "" ++ ++msgid "Specifies the addresses Tinyproxy is listening on for requests" ++msgstr "" ++ ++msgid "Specifies the group name the Tinyproxy process is running as" ++msgstr "" ++ ++msgid "" ++"Specifies the upstream proxy to use for accessing the target host. Format is " ++"address:port" ++msgstr "" ++ ++msgid "Specifies the user name the Tinyproxy process is running as" ++msgstr "" ++ ++msgid "Start spare servers" ++msgstr "" ++ ++msgid "Statistics page" ++msgstr "" ++ ++msgid "Status" ++msgstr "" ++ ++msgid "Target host" ++msgstr "" ++ ++msgid "Tinyproxy" ++msgstr "" ++ ++msgid "Tinyproxy Status" ++msgstr "" ++ ++msgid "Tinyproxy is a small and fast non-caching HTTP(S)-Proxy" ++msgstr "" ++ ++msgid "Upstream Proxies" ++msgstr "" ++ ++msgid "" ++"Upstream proxy rules define proxy servers to use when accessing certain IP " ++"addresses or domains." ++msgstr "" ++ ++msgid "Use syslog" ++msgstr "" ++ ++msgid "User" ++msgstr "" ++ ++msgid "Via hostname" ++msgstr "" ++ ++msgid "Via proxy" ++msgstr "" ++ ++msgid "Writes log messages to syslog instead of a log file" ++msgstr "" ++ ++msgid "X-Tinyproxy header" ++msgstr "" +diff --git a/feeds/luci/applications/luci-app-tinyproxy/po/pl/tinyproxy.po b/feeds/luci/applications/luci-app-tinyproxy/po/pl/tinyproxy.po +new file mode 100644 +index 0000000..8e3bfc7 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-tinyproxy/po/pl/tinyproxy.po +@@ -0,0 +1,292 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"PO-Revision-Date: 2012-09-04 11:50+0200\n" ++"Last-Translator: Staszek \n" ++"Language-Team: none\n" ++"Language: pl\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 " ++"|| n%100>=20) ? 1 : 2);\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "" ++"Via proxy routes requests to the given target via the specifed " ++"upstream proxy, Reject access disables any upstream proxy for the " ++"target" ++msgstr "" ++"Przez proxy kieruje żądania do danego celu przez okreÅ›lone " ++"\"upstream proxy\", Odrzuć dostÄ™p wyÅ‚Ä…cza jakiekolwiek \"upstream " ++"proxy\" dla danego celu." ++ ++msgid "" ++"Adds an \"X-Tinyproxy\" HTTP header with the client IP address to forwarded " ++"requests" ++msgstr "" ++"Dodaje nagłówek http \"X-Tinyproxy\" z adresem IP klienta do przekazywanych " ++"żądaÅ„" ++ ++msgid "Allowed clients" ++msgstr "Akceptowane klienty" ++ ++msgid "Allowed connect ports" ++msgstr "Akceptowane porty poÅ‚Ä…czenia" ++ ++msgid "Bind address" ++msgstr "zwiąż adres" ++ ++msgid "" ++"By default, basic POSIX expressions are used for filtering. Enable this to " ++"activate extended regular expressions" ++msgstr "" ++"DomyÅ›lnie do filtrowania używane sÄ… podstawowe wyrażenia POSIX. WÅ‚Ä…cz tÄ™ " ++"opcjÄ™, aby aktywować rozszerzone wyrażenia regularne." ++ ++msgid "" ++"By default, filter strings are treated as case-insensitive. Enable this to " ++"make the matching case-sensitive" ++msgstr "" ++"DomyÅ›lnie ciÄ…gi filtrowania traktowane sÄ… jako wrażliwe na wielkość liter. " ++"WÅ‚Ä…cz tÄ™ opcjÄ™, aby dopasowania byÅ‚y wrażliwe na wielkoÅ›ci liter." ++ ++msgid "" ++"By default, filtering is done based on domain names. Enable this to match " ++"against URLs instead" ++msgstr "" ++"DomyÅ›lnie filtrowanie jest wykonywane w oparciu o nazwy domen. WÅ‚Ä…cz tÄ™ " ++"opcjÄ™, aby zamiast tego używać URL-i." ++ ++msgid "" ++"By default, the filter rules act as blacklist. Enable this option to only " ++"allow matched URLs or domain names" ++msgstr "" ++"DomyÅ›lnie, reguÅ‚y filtra dziaÅ‚ajÄ… jako czarna lista. Zaznacz tÄ™ opcjÄ™, aby " ++"zezwalać wyÅ‚Ä…cznie na pasujÄ…ce URL-e lub nazwy domen." ++ ++msgid "" ++"Can be either an IP address or range, a domain name or \".\" for any host " ++"without domain" ++msgstr "" ++"Może być adresem lub zakresem adresów IP, nazwÄ… domeny lub \".\" dla " ++"dowolnego hosta bez domeny." ++ ++msgid "Configuration" ++msgstr "Konfiguracja" ++ ++msgid "Connection timeout" ++msgstr "Limit czasu poÅ‚Ä…czenia" ++ ++msgid "Default deny" ++msgstr "DomyÅ›lnie blokuj" ++ ++msgid "Enable Tinyproxy server" ++msgstr "WÅ‚Ä…cz serwer Tinyproxy" ++ ++msgid "Error page" ++msgstr "Strona bÅ‚Ä™du" ++ ++msgid "Failed to retrieve statistics from url:" ++msgstr "Nieudane pobieranie statystyk z URL-a:" ++ ++msgid "Filter by RegExp" ++msgstr "Filtruj z użyciem rozszerzonych wyrażeÅ„ regularnych" ++ ++msgid "Filter by URLs" ++msgstr "Filtruj po adresach URL" ++ ++msgid "Filter case-sensitive" ++msgstr "Filtr wrażliwy na wielkość liter" ++ ++msgid "Filter file" ++msgstr "Plik z filtrami" ++ ++msgid "Filtering and ACLs" ++msgstr "Filtrowanie i Listy kontroli dostÄ™pu" ++ ++msgid "General settings" ++msgstr "Ustawienia ogólne" ++ ++msgid "Group" ++msgstr "Grupa" ++ ++msgid "HTML template file to serve for stat host requests" ++msgstr "Plik szablonu HTML używany do prezentacji statystyk" ++ ++msgid "HTML template file to serve when HTTP errors occur" ++msgstr "Plik szablonu HTML używany do prezentacji komunikatów bÅ‚Ä™du" ++ ++# ZgadujÄ™, że to ma coÅ› wspólnego z nagłówkami zapytaÅ„ - stÄ…d takie tÅ‚umaczenie. ++msgid "Header whitelist" ++msgstr "BiaÅ‚a lista nagłówków" ++ ++msgid "" ++"List of IP addresses or ranges which are allowed to use the proxy server" ++msgstr "" ++"Lista adresów IP lub zakresów, które sÄ… dopuszczone do korzystania z serwera " ++"proxy" ++ ++msgid "" ++"List of allowed ports for the CONNECT method. A single value \"0\" allows " ++"all ports" ++msgstr "" ++"Lista dozwolonych portów dla metody CONNECT. Pojedyncza wartość \"0\" " ++"pozwala użyć wszystkich portów" ++ ++msgid "Listen address" ++msgstr "NasÅ‚uchiwany adres" ++ ++msgid "Listen port" ++msgstr "NasÅ‚uchiwany port" ++ ++msgid "Log file" ++msgstr "Plik logowania" ++ ++msgid "Log file to use for dumping messages" ++msgstr "Plik logowania zrzucanych wiadomoÅ›ci" ++ ++msgid "Log level" ++msgstr "Poziom logowania" ++ ++msgid "Logging verbosity of the Tinyproxy process" ++msgstr "Szczegółowość logowania procesów Tinyproxy" ++ ++msgid "Max. clients" ++msgstr "Maks. klientów" ++ ++msgid "Max. requests per server" ++msgstr "Maks. żądaÅ„ na serwer" ++ ++msgid "Max. spare servers" ++msgstr "Maks. uruchomionych serwerów" ++ ++msgid "Maximum allowed number of concurrently connected clients" ++msgstr "Maksymalna dopuszczalna liczba jednoczeÅ›nie podÅ‚Ä…czonych klientów" ++ ++msgid "" ++"Maximum allowed number of requests per process. If it is exeeded, the " ++"process is restarted. Zero means unlimited." ++msgstr "" ++"Maksymalna dopuszczalna liczba żądaÅ„ na proces. JeÅ›li zostanie przekroczona, " ++"proces zostanie ponownie uruchomiony. Zero oznacza bez limitu." ++ ++msgid "Maximum number of prepared idle processes" ++msgstr "Maksymalna liczba przygotowanych bezczynnych procesów" ++ ++msgid "Maximum number of seconds an inactive connection is held open" ++msgstr "" ++"Maksymalna liczba sekund dla podtrzymywania otwartego nieaktywnego poÅ‚Ä…czenie" ++ ++msgid "Min. spare servers" ++msgstr "Min. liczba zapasowych serwerów" ++ ++msgid "Minimum number of prepared idle processes" ++msgstr "Minimalna liczba przygotowanych bezczynnych procesów" ++ ++msgid "Number of idle processes to start when launching Tinyproxy" ++msgstr "" ++"Liczba bezczynnych procesów do wÅ‚Ä…czenia podczas uruchamiania Tinyproxy" ++ ++msgid "Plaintext file with URLs or domains to filter. One entry per line" ++msgstr "" ++"Plik tekstowy z URL-ami lub domenami do filtowania. Jeden wpis na liniÄ™." ++ ++msgid "Policy" ++msgstr "Polityka" ++ ++msgid "Privacy settings" ++msgstr "Ustawienia prywatnoÅ›ci" ++ ++msgid "Reject access" ++msgstr "Odmów dostÄ™pu" ++ ++msgid "Server Settings" ++msgstr "Ustawienia serwera" ++ ++msgid "Server limits" ++msgstr "Limity serwera" ++ ++msgid "" ++"Specifies HTTP header names which are allowed to pass-through, all others " ++"are discarded. Leave empty to disable header filtering" ++msgstr "" ++"OkreÅ›la nazwy nagłówków HTTP, które mogÄ… zostać przesÅ‚ane dalej. PozostaÅ‚e " ++"bÄ™dÄ… odrzucone. Pozostaw puste, aby wyÅ‚Ä…czyć filtrowanie nagłówków." ++ ++msgid "Specifies the HTTP port Tinyproxy is listening on for requests" ++msgstr "OkreÅ›la port, na którym Tinyproxy bÄ™dzie oczekiwać żądaÅ„ HTTP." ++ ++msgid "Specifies the Tinyproxy hostname to use in the Via HTTP header" ++msgstr "OkreÅ›la nazwÄ™ hosta używanÄ… przez Tinyproxy w nagłówku HTTP \"Via\"." ++ ++msgid "" ++"Specifies the address Tinyproxy binds to for outbound forwarded requests" ++msgstr "" ++"OkreÅ›l adres, z którym zostanie powiÄ…zane Tinyproxy dla wychodzÄ…cych " ++"przekazywanych żądaÅ„" ++ ++msgid "Specifies the addresses Tinyproxy is listening on for requests" ++msgstr "OkreÅ›la adresy, z których Tinyproxy oczekuje żądaÅ„." ++ ++msgid "Specifies the group name the Tinyproxy process is running as" ++msgstr "OkreÅ›l nazwÄ™ grupy, pod jakÄ… bÄ™dzie pracowaÅ‚ proces Tinyproxy" ++ ++msgid "" ++"Specifies the upstream proxy to use for accessing the target host. Format is " ++"address:port" ++msgstr "" ++"OkreÅ›l serwer proxy typu upstream, który ma zostać użyty w przypadku dostÄ™pu " ++"do hosta docelowego. Format to adres:port" ++ ++msgid "Specifies the user name the Tinyproxy process is running as" ++msgstr "OkreÅ›l nazwÄ™ użytkownika, pod jakÄ… bÄ™dzie pracowaÅ‚ proces Tinyproxy" ++ ++msgid "Start spare servers" ++msgstr "Uruchamiane serwery zapasowe" ++ ++msgid "Statistics page" ++msgstr "Strona statystyk" ++ ++msgid "Status" ++msgstr "Status" ++ ++msgid "Target host" ++msgstr "Host docelowy" ++ ++msgid "Tinyproxy" ++msgstr "Tinyproxy" ++ ++msgid "Tinyproxy Status" ++msgstr "Status serwera Tinyproxy" ++ ++msgid "Tinyproxy is a small and fast non-caching HTTP(S)-Proxy" ++msgstr "Tinyproxy to maÅ‚y i szybki niecacheujÄ…cy serwer proxy HTTP(S)" ++ ++msgid "Upstream Proxies" ++msgstr "Serwery proxy typu upstream" ++ ++msgid "" ++"Upstream proxy rules define proxy servers to use when accessing certain IP " ++"addresses or domains." ++msgstr "" ++"ReguÅ‚y serwerów proxy typu upstream definiujÄ… serwery proxy, które majÄ… " ++"zostać użyte w przypadku dostÄ™pu do okreÅ›lonych adresów IP lub domen." ++ ++msgid "Use syslog" ++msgstr "Użyj sysloga" ++ ++msgid "User" ++msgstr "Użytkownik" ++ ++msgid "Via hostname" ++msgstr "Nazwa hosta via" ++ ++msgid "Via proxy" ++msgstr "Proxy via" ++ ++msgid "Writes log messages to syslog instead of a log file" ++msgstr "Zapisuje komunikaty do sysloga zamiast pliku dziennika" ++ ++msgid "X-Tinyproxy header" ++msgstr "Nagłówek X-Tinyproxy" +diff --git a/feeds/luci/applications/luci-app-tinyproxy/po/pt-br/tinyproxy.po b/feeds/luci/applications/luci-app-tinyproxy/po/pt-br/tinyproxy.po +new file mode 100644 +index 0000000..ef7ffda +--- /dev/null ++++ b/feeds/luci/applications/luci-app-tinyproxy/po/pt-br/tinyproxy.po +@@ -0,0 +1,367 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Report-Msgid-Bugs-To: \n" ++"POT-Creation-Date: 2009-06-10 03:41+0200\n" ++"PO-Revision-Date: 2012-09-16 02:38+0200\n" ++"Last-Translator: Julio Cezar \n" ++"Language-Team: LANGUAGE \n" ++"Language: pt_BR\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n > 1);\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "" ++"Via proxy routes requests to the given target via the specifed " ++"upstream proxy, Reject access disables any upstream proxy for the " ++"target" ++msgstr "" ++"Via proxy encaminha as requisições para um dado destino através do " ++"proxy superior especificado, Rejeitar acesso desabilita qualquer " ++"proxy superior para o alvo" ++ ++msgid "" ++"Adds an \"X-Tinyproxy\" HTTP header with the client IP address to forwarded " ++"requests" ++msgstr "" ++"Adiciona no cabeçalho do HTTP o campo \"X-Tinyproxy\" com o endereço IP do " ++"cliente para encaminhar a requisição" ++ ++msgid "Allowed clients" ++msgstr "Clientes permitidos" ++ ++msgid "Allowed connect ports" ++msgstr "Portas de conexão permitidas" ++ ++msgid "Bind address" ++msgstr "Endereço de saída" ++ ++msgid "" ++"By default, basic POSIX expressions are used for filtering. Enable this to " ++"activate extended regular expressions" ++msgstr "" ++"Por padrão, os filtros usam expressões POSIX básicas. Habilite esta opção " ++"para usar expressões regulares extendidas" ++ ++msgid "" ++"By default, filter strings are treated as case-insensitive. Enable this to " ++"make the matching case-sensitive" ++msgstr "" ++"Por padrão, as regras são tratadas como insensíveis a caixa. Habilite esta " ++"opção para diferenciar maiúsculas e minúsculas" ++ ++msgid "" ++"By default, filtering is done based on domain names. Enable this to match " ++"against URLs instead" ++msgstr "" ++"Por padrão, a filtragem é feita baseada nos domínios. Habilite esta opção " ++"para, ao invés disto, casar com URLs" ++ ++msgid "" ++"By default, the filter rules act as blacklist. Enable this option to only " ++"allow matched URLs or domain names" ++msgstr "" ++"Por padrão, as regras de filtragem atuam como uma lista negra. Habilite esta " ++"opção para somente permitir URLs ou domínios que casem" ++ ++msgid "" ++"Can be either an IP address or range, a domain name or \".\" for any host " ++"without domain" ++msgstr "" ++"Pode ser tanto um como uma faixa de endereços IP, um nome de dompínio ou \"." ++"\" para qualquer computador sem domínio" ++ ++msgid "Configuration" ++msgstr "Configuração" ++ ++msgid "Connection timeout" ++msgstr "Tempo limite de conexão" ++ ++msgid "Default deny" ++msgstr "Nege por padrão" ++ ++msgid "Enable Tinyproxy server" ++msgstr "Habilitar o servidor Tinyproxy" ++ ++msgid "Error page" ++msgstr "Página de erro" ++ ++msgid "Failed to retrieve statistics from url:" ++msgstr "Falhou ao tentar obter estatísticas da URL:" ++ ++msgid "Filter by RegExp" ++msgstr "Filtrar por Expressão Regular" ++ ++msgid "Filter by URLs" ++msgstr "Filtrar por URLs" ++ ++msgid "Filter case-sensitive" ++msgstr "Diferenciar maiúsculo/minúsculo no filtro" ++ ++msgid "Filter file" ++msgstr "Arquivo de filtro" ++ ++msgid "Filtering and ACLs" ++msgstr "Filtragem e ACLs" ++ ++msgid "General settings" ++msgstr "Configurações gerais" ++ ++msgid "Group" ++msgstr "Grupo" ++ ++msgid "HTML template file to serve for stat host requests" ++msgstr "" ++"Modelo de arquivo HTML para servir para requisições de estado do computador" ++ ++msgid "HTML template file to serve when HTTP errors occur" ++msgstr "Modelo de arquivo HTML para servir quando ocorrer error HTTP" ++ ++msgid "Header whitelist" ++msgstr "Lista branca do cabeçalho" ++ ++msgid "" ++"List of IP addresses or ranges which are allowed to use the proxy server" ++msgstr "" ++"Lista ou faixa de endereços IP a quem é permitido o uso do servidor proxy" ++ ++msgid "" ++"List of allowed ports for the CONNECT method. A single value \"0\" allows " ++"all ports" ++msgstr "" ++"List as portas que podem utilizar o método CONNECT. Um valor \"0\" único " ++"permitirá todas as portas" ++ ++msgid "Listen address" ++msgstr "Endereço de escuta" ++ ++msgid "Listen port" ++msgstr "Porta de escuta" ++ ++msgid "Log file" ++msgstr "Arquivo de registro" ++ ++msgid "Log file to use for dumping messages" ++msgstr "Arquivo de registro usado para despejar as mensagens" ++ ++msgid "Log level" ++msgstr "Nível do registro" ++ ++msgid "Logging verbosity of the Tinyproxy process" ++msgstr "Detalhamento dos registors do Tinyproxy" ++ ++msgid "Max. clients" ++msgstr "Número máximo de clientes" ++ ++msgid "Max. requests per server" ++msgstr "Numero máximo de requisições por servidor" ++ ++msgid "Max. spare servers" ++msgstr "Max. servidores sobressalentes" ++ ++msgid "Maximum allowed number of concurrently connected clients" ++msgstr "Numero máximo permitido de cliente conectados concorrentemente" ++ ++msgid "" ++"Maximum allowed number of requests per process. If it is exeeded, the " ++"process is restarted. Zero means unlimited." ++msgstr "" ++"Numero máximo de requisições permitidas por processo. Se este limite é " ++"excedido, o processo é redisparado. Zero significa ilimitado." ++ ++msgid "Maximum number of prepared idle processes" ++msgstr "Número máximo de processos em espera preparados" ++ ++msgid "Maximum number of seconds an inactive connection is held open" ++msgstr "Número máximo de segundos que uma conexão inativa é mantida aberta" ++ ++msgid "Min. spare servers" ++msgstr "Número mínimo de servidores sobressalentes" ++ ++msgid "Minimum number of prepared idle processes" ++msgstr "Número mínimo de processos em espera preparados" ++ ++msgid "Number of idle processes to start when launching Tinyproxy" ++msgstr "Número de processos em espera iniciado quando o Tinyproxy é disparado" ++ ++msgid "Plaintext file with URLs or domains to filter. One entry per line" ++msgstr "" ++"Arquivo de texto simples com as URLs ou os domínios para filtrar. Uma " ++"entrada por linha" ++ ++msgid "Policy" ++msgstr "Política" ++ ++msgid "Privacy settings" ++msgstr "Configurações de privacidade" ++ ++msgid "Reject access" ++msgstr "Rejeitar acesso" ++ ++msgid "Server Settings" ++msgstr "Configurações do Servidor" ++ ++msgid "Server limits" ++msgstr "Limites do servidor" ++ ++msgid "" ++"Specifies HTTP header names which are allowed to pass-through, all others " ++"are discarded. Leave empty to disable header filtering" ++msgstr "" ++"Especifica os nomes dos cabeçalhos HTTP que serão permitidos. Todos os " ++"demais serão descartados. Deixe em branco para desabilitar a filtragem de " ++"cabeçalho" ++ ++msgid "Specifies the HTTP port Tinyproxy is listening on for requests" ++msgstr "Especifica a porta na qual o Tinyproxy escutará pelas requisições" ++ ++msgid "Specifies the Tinyproxy hostname to use in the Via HTTP header" ++msgstr "" ++"Especifica o nome do computador que o Tinyproxy usará no cabeçalho HTTP" ++ ++msgid "" ++"Specifies the address Tinyproxy binds to for outbound forwarded requests" ++msgstr "" ++"Especifica o endereço que o Tinyproxy utilizará para encaminhar as " ++"requisições" ++ ++msgid "Specifies the addresses Tinyproxy is listening on for requests" ++msgstr "Especifica o endereço no qual o Tinyproxy escutará pelas requisições" ++ ++msgid "Specifies the group name the Tinyproxy process is running as" ++msgstr "Especifica o nome do grupo com o qual o processo do Tinyproxy rodará" ++ ++msgid "" ++"Specifies the upstream proxy to use for accessing the target host. Format is " ++"address:port" ++msgstr "" ++"Especifica o proxy superior para usar quando acessar o alvo. Formato é " ++"address:port" ++ ++msgid "Specifies the user name the Tinyproxy process is running as" ++msgstr "Especifica o nome do usuário com o qual o processo do Tinyproxy rodará" ++ ++msgid "Start spare servers" ++msgstr "Dispare servidores de espera" ++ ++msgid "Statistics page" ++msgstr "Página de estatística" ++ ++msgid "Status" ++msgstr "Estado" ++ ++msgid "Target host" ++msgstr "Host de destino" ++ ++msgid "Tinyproxy" ++msgstr "Tinyproxy" ++ ++msgid "Tinyproxy Status" ++msgstr "Estado do Tinyproxy" ++ ++msgid "Tinyproxy is a small and fast non-caching HTTP(S)-Proxy" ++msgstr "Tinyproxy é um pequeno e rápido Proxy-HTTP(S) sem suporte a cache" ++ ++msgid "Upstream Proxies" ++msgstr "Proxies superiores" ++ ++msgid "" ++"Upstream proxy rules define proxy servers to use when accessing certain IP " ++"addresses or domains." ++msgstr "" ++"As regras do proxy superior define os servidores de proxy para uso quando " ++"certos endereços IP ou domínios forem acessados." ++ ++msgid "Use syslog" ++msgstr "Use o syslog" ++ ++msgid "User" ++msgstr "Usuário" ++ ++msgid "Via hostname" ++msgstr "Via nome do computador" ++ ++msgid "Via proxy" ++msgstr "Via proxy" ++ ++msgid "Writes log messages to syslog instead of a log file" ++msgstr "" ++"Escreve as mensagens de registros para o syslog ao invéz do arquivo de " ++"registro" ++ ++msgid "X-Tinyproxy header" ++msgstr "Cabeçalho do X-Tinyproxy" ++ ++#~ msgid "Allow access from" ++#~ msgstr "Permitir acesso de" ++ ++#~ msgid "Allowed headers for anonymous proxy" ++#~ msgstr "Cabeçalhos permitidos para proxy anônimo" ++ ++#~ msgid "Bind outgoing traffic to address" ++#~ msgstr "Associar o tráfego de saída ao endereço" ++ ++#~ msgid "Ports allowed for CONNECT method" ++#~ msgstr "Portas permitidas para o método CONNECT " ++ ++#~ msgid "0 = disabled, empty = all" ++#~ msgstr "0 = desativado, vazio = todas" ++ ++#~ msgid "Error document" ++#~ msgstr "Documento de erro" ++ ++#~ msgid "Filter list" ++#~ msgstr "Lista de filtros" ++ ++#~ msgid "Case sensitive filters" ++#~ msgstr "Filtros \"case sensitive\"" ++ ++#~ msgid "Filter list is a whitelist" ++#~ msgstr "A lista de filtros é uma lista branca" ++ ++#~ msgid "Extended regular expression filters" ++#~ msgstr "Filtros com suporte à expressões regulares" ++ ++#~ msgid "Filter URLs instead of domains" ++#~ msgstr "Filtrar URLs em vez de domínios" ++ ++#~ msgid "Listen on address" ++#~ msgstr "Escutar no endereço" ++ ++#~ msgid "Logfile" ++#~ msgstr "Arquivo de log" ++ ++#~ msgid "Maximum number of clients" ++#~ msgstr "Número máximo de clientes" ++ ++#~ msgid "Maximum requests per thread" ++#~ msgstr "Máximo de solicitações por thread" ++ ++#~ msgid "Spare servers to start with" ++#~ msgstr "Servidores sobressalentes iniciar com" ++ ++#~ msgid "Statistic document" ++#~ msgstr "Documento de estatísticas" ++ ++#~ msgid "Write to syslog" ++#~ msgstr "Escrever para syslog" ++ ++#~ msgid "Connection Timeout" ++#~ msgstr "Timeout de conexão" ++ ++#~ msgid "Value of Via-Header" ++#~ msgstr "Valor do cabeçalho \"Via-Header\"" ++ ++#~ msgid "Include client IP" ++#~ msgstr "Incluir o IP do cliente" ++ ++#~ msgid "Upstream Control" ++#~ msgstr "Controle de Upstream" ++ ++#~ msgid "Type" ++#~ msgstr "Tipo" ++ ++#~ msgid "Upstream Proxy" ++#~ msgstr "Proxy para Upstream" +diff --git a/feeds/luci/applications/luci-app-tinyproxy/po/pt/tinyproxy.po b/feeds/luci/applications/luci-app-tinyproxy/po/pt/tinyproxy.po +new file mode 100644 +index 0000000..833a7fa +--- /dev/null ++++ b/feeds/luci/applications/luci-app-tinyproxy/po/pt/tinyproxy.po +@@ -0,0 +1,334 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Report-Msgid-Bugs-To: \n" ++"POT-Creation-Date: 2009-05-26 19:03+0200\n" ++"PO-Revision-Date: 2013-05-31 23:38+0200\n" ++"Last-Translator: joao.f.vieira \n" ++"Language-Team: LANGUAGE \n" ++"Language: pt\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n != 1);\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "" ++"Via proxy routes requests to the given target via the specifed " ++"upstream proxy, Reject access disables any upstream proxy for the " ++"target" ++msgstr "" ++ ++msgid "" ++"Adds an \"X-Tinyproxy\" HTTP header with the client IP address to forwarded " ++"requests" ++msgstr "" ++ ++msgid "Allowed clients" ++msgstr "Clientes permitidos" ++ ++msgid "Allowed connect ports" ++msgstr "Portas onde é permitido ligar" ++ ++msgid "Bind address" ++msgstr "" ++ ++msgid "" ++"By default, basic POSIX expressions are used for filtering. Enable this to " ++"activate extended regular expressions" ++msgstr "" ++ ++msgid "" ++"By default, filter strings are treated as case-insensitive. Enable this to " ++"make the matching case-sensitive" ++msgstr "" ++ ++msgid "" ++"By default, filtering is done based on domain names. Enable this to match " ++"against URLs instead" ++msgstr "" ++ ++msgid "" ++"By default, the filter rules act as blacklist. Enable this option to only " ++"allow matched URLs or domain names" ++msgstr "" ++ ++msgid "" ++"Can be either an IP address or range, a domain name or \".\" for any host " ++"without domain" ++msgstr "" ++ ++msgid "Configuration" ++msgstr "Configuração" ++ ++msgid "Connection timeout" ++msgstr "" ++ ++msgid "Default deny" ++msgstr "" ++ ++msgid "Enable Tinyproxy server" ++msgstr "Ativar servidor Tinyproxy" ++ ++msgid "Error page" ++msgstr "Página de erro" ++ ++msgid "Failed to retrieve statistics from url:" ++msgstr "" ++ ++msgid "Filter by RegExp" ++msgstr "" ++ ++msgid "Filter by URLs" ++msgstr "" ++ ++msgid "Filter case-sensitive" ++msgstr "" ++ ++msgid "Filter file" ++msgstr "" ++ ++msgid "Filtering and ACLs" ++msgstr "" ++ ++msgid "General settings" ++msgstr "Definições globais" ++ ++msgid "Group" ++msgstr "Grupo" ++ ++msgid "HTML template file to serve for stat host requests" ++msgstr "" ++ ++msgid "HTML template file to serve when HTTP errors occur" ++msgstr "" ++ ++msgid "Header whitelist" ++msgstr "" ++ ++msgid "" ++"List of IP addresses or ranges which are allowed to use the proxy server" ++msgstr "" ++ ++msgid "" ++"List of allowed ports for the CONNECT method. A single value \"0\" allows " ++"all ports" ++msgstr "" ++ ++msgid "Listen address" ++msgstr "Endereço de escuta" ++ ++msgid "Listen port" ++msgstr "Porta de escuta" ++ ++msgid "Log file" ++msgstr "Ficheiro de log" ++ ++msgid "Log file to use for dumping messages" ++msgstr "" ++ ++msgid "Log level" ++msgstr "Nível do log" ++ ++msgid "Logging verbosity of the Tinyproxy process" ++msgstr "" ++ ++msgid "Max. clients" ++msgstr "" ++ ++msgid "Max. requests per server" ++msgstr "" ++ ++msgid "Max. spare servers" ++msgstr "Max. servidores sobressalentes" ++ ++msgid "Maximum allowed number of concurrently connected clients" ++msgstr "" ++ ++msgid "" ++"Maximum allowed number of requests per process. If it is exeeded, the " ++"process is restarted. Zero means unlimited." ++msgstr "" ++ ++msgid "Maximum number of prepared idle processes" ++msgstr "" ++ ++msgid "Maximum number of seconds an inactive connection is held open" ++msgstr "" ++ ++msgid "Min. spare servers" ++msgstr "Min. servidores sobressalentes" ++ ++msgid "Minimum number of prepared idle processes" ++msgstr "" ++ ++msgid "Number of idle processes to start when launching Tinyproxy" ++msgstr "" ++ ++msgid "Plaintext file with URLs or domains to filter. One entry per line" ++msgstr "" ++ ++msgid "Policy" ++msgstr "Política" ++ ++msgid "Privacy settings" ++msgstr "Definições de Privacidade" ++ ++msgid "Reject access" ++msgstr "Rejeitar o acesso" ++ ++msgid "Server Settings" ++msgstr "Definições do Servidor" ++ ++msgid "Server limits" ++msgstr "Limites do servidor" ++ ++msgid "" ++"Specifies HTTP header names which are allowed to pass-through, all others " ++"are discarded. Leave empty to disable header filtering" ++msgstr "" ++ ++msgid "Specifies the HTTP port Tinyproxy is listening on for requests" ++msgstr "" ++ ++msgid "Specifies the Tinyproxy hostname to use in the Via HTTP header" ++msgstr "" ++ ++msgid "" ++"Specifies the address Tinyproxy binds to for outbound forwarded requests" ++msgstr "" ++ ++msgid "Specifies the addresses Tinyproxy is listening on for requests" ++msgstr "" ++ ++msgid "Specifies the group name the Tinyproxy process is running as" ++msgstr "" ++"Especifica o nome do grupo que através do qual o processo do Tinyproxy é " ++"executado" ++ ++msgid "" ++"Specifies the upstream proxy to use for accessing the target host. Format is " ++"address:port" ++msgstr "" ++ ++msgid "Specifies the user name the Tinyproxy process is running as" ++msgstr "" ++ ++msgid "Start spare servers" ++msgstr "Iniciar servidores suplentes" ++ ++msgid "Statistics page" ++msgstr "" ++ ++msgid "Status" ++msgstr "Estado" ++ ++msgid "Target host" ++msgstr "Host de destino" ++ ++msgid "Tinyproxy" ++msgstr "Tinyproxy" ++ ++msgid "Tinyproxy Status" ++msgstr "Estado do Tinyproxy" ++ ++msgid "Tinyproxy is a small and fast non-caching HTTP(S)-Proxy" ++msgstr "Tinyproxy é um pequeno e rápido Proxy-HTTP(S) sem suporte à cache" ++ ++msgid "Upstream Proxies" ++msgstr "" ++ ++msgid "" ++"Upstream proxy rules define proxy servers to use when accessing certain IP " ++"addresses or domains." ++msgstr "" ++ ++msgid "Use syslog" ++msgstr "Usar o syslog" ++ ++msgid "User" ++msgstr "Utilizador" ++ ++msgid "Via hostname" ++msgstr "" ++ ++msgid "Via proxy" ++msgstr "Via proxy" ++ ++msgid "Writes log messages to syslog instead of a log file" ++msgstr "Escreve as mensagens para o syslog ao invés do ficheiro de log" ++ ++msgid "X-Tinyproxy header" ++msgstr "" ++ ++#~ msgid "Allow access from" ++#~ msgstr "Permitir acesso de" ++ ++#~ msgid "Allowed headers for anonymous proxy" ++#~ msgstr "Cabeçalhos permitidos para proxy anônimo" ++ ++#~ msgid "Bind outgoing traffic to address" ++#~ msgstr "Associar o tráfego de saída ao endereço" ++ ++#~ msgid "Ports allowed for CONNECT method" ++#~ msgstr "Portas permitidas para o método CONNECT " ++ ++#~ msgid "0 = disabled, empty = all" ++#~ msgstr "0 = desativado, vazio = todas" ++ ++#~ msgid "Error document" ++#~ msgstr "Documento de erro" ++ ++#~ msgid "Filter list" ++#~ msgstr "Lista de filtros" ++ ++#~ msgid "Case sensitive filters" ++#~ msgstr "Filtros \"case sensitive\"" ++ ++#~ msgid "Filter list is a whitelist" ++#~ msgstr "A lista de filtros é uma lista branca" ++ ++#~ msgid "Extended regular expression filters" ++#~ msgstr "Filtros com suporte à expressões regulares" ++ ++#~ msgid "Filter URLs instead of domains" ++#~ msgstr "Filtrar URLs em vez de domínios" ++ ++#~ msgid "Listen on address" ++#~ msgstr "Escutar no endereço" ++ ++#~ msgid "Logfile" ++#~ msgstr "Arquivo de log" ++ ++#~ msgid "Maximum number of clients" ++#~ msgstr "Número máximo de clientes" ++ ++#~ msgid "Maximum requests per thread" ++#~ msgstr "Máximo de solicitações por thread" ++ ++#~ msgid "Spare servers to start with" ++#~ msgstr "Servidores sobressalentes iniciar com" ++ ++#~ msgid "Statistic document" ++#~ msgstr "Documento de estatísticas" ++ ++#~ msgid "Write to syslog" ++#~ msgstr "Escrever para syslog" ++ ++#~ msgid "Connection Timeout" ++#~ msgstr "Timeout de conexão" ++ ++#~ msgid "Value of Via-Header" ++#~ msgstr "Valor do cabeçalho \"Via-Header\"" ++ ++#~ msgid "Include client IP" ++#~ msgstr "Incluir o IP do cliente" ++ ++#~ msgid "Upstream Control" ++#~ msgstr "Controle de Upstream" ++ ++#~ msgid "Type" ++#~ msgstr "Tipo" ++ ++#~ msgid "Upstream Proxy" ++#~ msgstr "Proxy para Upstream" +diff --git a/feeds/luci/applications/luci-app-tinyproxy/po/ro/tinyproxy.po b/feeds/luci/applications/luci-app-tinyproxy/po/ro/tinyproxy.po +new file mode 100644 +index 0000000..799fecb +--- /dev/null ++++ b/feeds/luci/applications/luci-app-tinyproxy/po/ro/tinyproxy.po +@@ -0,0 +1,256 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Last-Translator: Automatically generated\n" ++"Language-Team: none\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=3; plural=n==1 ? 0 : (n==0 || (n%100 > 0 && n%100 < " ++"20)) ? 1 : 2;\n" ++ ++msgid "" ++"Via proxy routes requests to the given target via the specifed " ++"upstream proxy, Reject access disables any upstream proxy for the " ++"target" ++msgstr "" ++ ++msgid "" ++"Adds an \"X-Tinyproxy\" HTTP header with the client IP address to forwarded " ++"requests" ++msgstr "" ++ ++msgid "Allowed clients" ++msgstr "" ++ ++msgid "Allowed connect ports" ++msgstr "" ++ ++msgid "Bind address" ++msgstr "" ++ ++msgid "" ++"By default, basic POSIX expressions are used for filtering. Enable this to " ++"activate extended regular expressions" ++msgstr "" ++ ++msgid "" ++"By default, filter strings are treated as case-insensitive. Enable this to " ++"make the matching case-sensitive" ++msgstr "" ++ ++msgid "" ++"By default, filtering is done based on domain names. Enable this to match " ++"against URLs instead" ++msgstr "" ++ ++msgid "" ++"By default, the filter rules act as blacklist. Enable this option to only " ++"allow matched URLs or domain names" ++msgstr "" ++ ++msgid "" ++"Can be either an IP address or range, a domain name or \".\" for any host " ++"without domain" ++msgstr "" ++ ++msgid "Configuration" ++msgstr "" ++ ++msgid "Connection timeout" ++msgstr "" ++ ++msgid "Default deny" ++msgstr "" ++ ++msgid "Enable Tinyproxy server" ++msgstr "" ++ ++msgid "Error page" ++msgstr "" ++ ++msgid "Failed to retrieve statistics from url:" ++msgstr "" ++ ++msgid "Filter by RegExp" ++msgstr "" ++ ++msgid "Filter by URLs" ++msgstr "" ++ ++msgid "Filter case-sensitive" ++msgstr "" ++ ++msgid "Filter file" ++msgstr "" ++ ++msgid "Filtering and ACLs" ++msgstr "" ++ ++msgid "General settings" ++msgstr "" ++ ++msgid "Group" ++msgstr "" ++ ++msgid "HTML template file to serve for stat host requests" ++msgstr "" ++ ++msgid "HTML template file to serve when HTTP errors occur" ++msgstr "" ++ ++msgid "Header whitelist" ++msgstr "" ++ ++msgid "" ++"List of IP addresses or ranges which are allowed to use the proxy server" ++msgstr "" ++ ++msgid "" ++"List of allowed ports for the CONNECT method. A single value \"0\" allows " ++"all ports" ++msgstr "" ++ ++msgid "Listen address" ++msgstr "" ++ ++msgid "Listen port" ++msgstr "" ++ ++msgid "Log file" ++msgstr "" ++ ++msgid "Log file to use for dumping messages" ++msgstr "" ++ ++msgid "Log level" ++msgstr "" ++ ++msgid "Logging verbosity of the Tinyproxy process" ++msgstr "" ++ ++msgid "Max. clients" ++msgstr "" ++ ++msgid "Max. requests per server" ++msgstr "" ++ ++msgid "Max. spare servers" ++msgstr "" ++ ++msgid "Maximum allowed number of concurrently connected clients" ++msgstr "" ++ ++msgid "" ++"Maximum allowed number of requests per process. If it is exeeded, the " ++"process is restarted. Zero means unlimited." ++msgstr "" ++ ++msgid "Maximum number of prepared idle processes" ++msgstr "" ++ ++msgid "Maximum number of seconds an inactive connection is held open" ++msgstr "" ++ ++msgid "Min. spare servers" ++msgstr "" ++ ++msgid "Minimum number of prepared idle processes" ++msgstr "" ++ ++msgid "Number of idle processes to start when launching Tinyproxy" ++msgstr "" ++ ++msgid "Plaintext file with URLs or domains to filter. One entry per line" ++msgstr "" ++ ++msgid "Policy" ++msgstr "" ++ ++msgid "Privacy settings" ++msgstr "" ++ ++msgid "Reject access" ++msgstr "" ++ ++msgid "Server Settings" ++msgstr "" ++ ++msgid "Server limits" ++msgstr "" ++ ++msgid "" ++"Specifies HTTP header names which are allowed to pass-through, all others " ++"are discarded. Leave empty to disable header filtering" ++msgstr "" ++ ++msgid "Specifies the HTTP port Tinyproxy is listening on for requests" ++msgstr "" ++ ++msgid "Specifies the Tinyproxy hostname to use in the Via HTTP header" ++msgstr "" ++ ++msgid "" ++"Specifies the address Tinyproxy binds to for outbound forwarded requests" ++msgstr "" ++ ++msgid "Specifies the addresses Tinyproxy is listening on for requests" ++msgstr "" ++ ++msgid "Specifies the group name the Tinyproxy process is running as" ++msgstr "" ++ ++msgid "" ++"Specifies the upstream proxy to use for accessing the target host. Format is " ++"address:port" ++msgstr "" ++ ++msgid "Specifies the user name the Tinyproxy process is running as" ++msgstr "" ++ ++msgid "Start spare servers" ++msgstr "" ++ ++msgid "Statistics page" ++msgstr "" ++ ++msgid "Status" ++msgstr "" ++ ++msgid "Target host" ++msgstr "" ++ ++msgid "Tinyproxy" ++msgstr "" ++ ++msgid "Tinyproxy Status" ++msgstr "" ++ ++msgid "Tinyproxy is a small and fast non-caching HTTP(S)-Proxy" ++msgstr "" ++ ++msgid "Upstream Proxies" ++msgstr "" ++ ++msgid "" ++"Upstream proxy rules define proxy servers to use when accessing certain IP " ++"addresses or domains." ++msgstr "" ++ ++msgid "Use syslog" ++msgstr "" ++ ++msgid "User" ++msgstr "" ++ ++msgid "Via hostname" ++msgstr "" ++ ++msgid "Via proxy" ++msgstr "" ++ ++msgid "Writes log messages to syslog instead of a log file" ++msgstr "" ++ ++msgid "X-Tinyproxy header" ++msgstr "" +diff --git a/feeds/luci/applications/luci-app-tinyproxy/po/ru/tinyproxy.po b/feeds/luci/applications/luci-app-tinyproxy/po/ru/tinyproxy.po +new file mode 100644 +index 0000000..f9a3c23 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-tinyproxy/po/ru/tinyproxy.po +@@ -0,0 +1,294 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: LuCI: tinyproxy\n" ++"Report-Msgid-Bugs-To: \n" ++"POT-Creation-Date: 2009-05-19 19:36+0200\n" ++"PO-Revision-Date: 2012-08-15 20:24+0300\n" ++"Last-Translator: Roman A. aka BasicXP \n" ++"Language-Team: Russian \n" ++"Language: ru\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%" ++"10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" ++"X-Generator: Pootle 2.0.4\n" ++"X-Poedit-SourceCharset: UTF-8\n" ++ ++msgid "" ++"Via proxy routes requests to the given target via the specifed " ++"upstream proxy, Reject access disables any upstream proxy for the " ++"target" ++msgstr "" ++"Через прокÑи перенаправлÑет запроÑÑ‹ на заданные узлы через " ++"указанный прокÑи, ОтклонÑÑ‚ÑŒ доÑтуп отключает иÑпользование прокÑи " ++"Ð´Ð»Ñ Ð²Ñех узлов" ++ ++msgid "" ++"Adds an \"X-Tinyproxy\" HTTP header with the client IP address to forwarded " ++"requests" ++msgstr "" ++"ДобавлÑет HTTP-заголовок \"X-Tinyproxy\" Ñ IP-адреÑом клиента ко вÑем " ++"перенаправленным запроÑам" ++ ++msgid "Allowed clients" ++msgstr "Разрешённые клиенты" ++ ++msgid "Allowed connect ports" ++msgstr "Разрешённые порты подключениÑ" ++ ++msgid "Bind address" ++msgstr "ÐÐ´Ñ€ÐµÑ Ð¿Ñ€Ð¸Ð²Ñзки" ++ ++msgid "" ++"By default, basic POSIX expressions are used for filtering. Enable this to " ++"activate extended regular expressions" ++msgstr "" ++"Разрешить иÑпользование раÑширенных регулÑрных выражений Ð´Ð»Ñ Ñ„Ð¸Ð»ÑŒÑ‚Ñ€Ð°Ñ†Ð¸Ð¸. По " ++"умолчанию, иÑпользуютÑÑ Ð±Ð°Ð·Ð¾Ð²Ñ‹Ðµ POSIX-выражениÑ" ++ ++msgid "" ++"By default, filter strings are treated as case-insensitive. Enable this to " ++"make the matching case-sensitive" ++msgstr "" ++"По умолчанию, Ñтроки фильтрации региÑтро-незавиÑимы. Включите Ñту опцию, " ++"чтобы Ñделать Ñравнение региÑтро-завиÑимым" ++ ++msgid "" ++"By default, filtering is done based on domain names. Enable this to match " ++"against URLs instead" ++msgstr "" ++"По умолчанию, Ñ„Ð¸Ð»ÑŒÑ‚Ñ€Ð°Ñ†Ð¸Ñ Ð²Ñ‹Ð¿Ð¾Ð»Ð½ÑетÑÑ Ð½Ð° оÑнове имени домена. Включите Ñту " ++"опцию, чтобы фильтровать при помощи URL" ++ ++msgid "" ++"By default, the filter rules act as blacklist. Enable this option to only " ++"allow matched URLs or domain names" ++msgstr "" ++"По умолчанию, Ñ„Ð¸Ð»ÑŒÑ‚Ñ€Ð°Ñ†Ð¸Ñ Ñ€Ð°Ð±Ð¾Ñ‚Ð°ÐµÑ‚ в режиме чёрного ÑпиÑка. Включите Ñту " ++"опцию, чтобы разрешить только опредёленные URL или доменные имена" ++ ++msgid "" ++"Can be either an IP address or range, a domain name or \".\" for any host " ++"without domain" ++msgstr "" ++"Может быть IP-адреÑом, диапазоном, именем домена или \".\" Ð´Ð»Ñ Ð»ÑŽÐ±Ð¾Ð³Ð¾ хоÑта " ++"без домена" ++ ++msgid "Configuration" ++msgstr "КонфигурациÑ" ++ ++msgid "Connection timeout" ++msgstr "Таймаут ÑоединениÑ" ++ ++msgid "Default deny" ++msgstr "Запретить по умолчанию" ++ ++msgid "Enable Tinyproxy server" ++msgstr "Включить Ñервер Tinyproxy" ++ ++msgid "Error page" ++msgstr "Страница ошибки" ++ ++msgid "Failed to retrieve statistics from url:" ++msgstr "Ошибка Ð¿Ð¾Ð»ÑƒÑ‡ÐµÐ½Ð¸Ñ ÑтатиÑтики по URL:" ++ ++msgid "Filter by RegExp" ++msgstr "Фильтровать при помощи регулÑрных выражений" ++ ++msgid "Filter by URLs" ++msgstr "Фильтровать по URL" ++ ++msgid "Filter case-sensitive" ++msgstr "Фильтровать Ñ ÑƒÑ‡Ñ‘Ñ‚Ð¾Ð¼ региÑтра" ++ ++msgid "Filter file" ++msgstr "Файл фильтрации" ++ ++msgid "Filtering and ACLs" ++msgstr "Ð¤Ð¸Ð»ÑŒÑ‚Ñ€Ð°Ñ†Ð¸Ñ Ð¸ ACL" ++ ++msgid "General settings" ++msgstr "Общие наÑтройки" ++ ++msgid "Group" ++msgstr "Группа" ++ ++msgid "HTML template file to serve for stat host requests" ++msgstr "HTML-шаблон Ð´Ð»Ñ ÑтатиÑтики хоÑтов" ++ ++msgid "HTML template file to serve when HTTP errors occur" ++msgstr "HTML-шаблон Ð´Ð»Ñ Ð²Ñ‹Ð²Ð¾Ð´Ð° ошибок HTTP" ++ ++msgid "Header whitelist" ++msgstr "Белый ÑпиÑок заголовков" ++ ++msgid "" ++"List of IP addresses or ranges which are allowed to use the proxy server" ++msgstr "" ++"СпиÑок или диапазон IP-адреÑов, которым разрешено иÑпользовать прокÑи-Ñервер" ++ ++msgid "" ++"List of allowed ports for the CONNECT method. A single value \"0\" allows " ++"all ports" ++msgstr "" ++"СпиÑок разрешённых портов Ð´Ð»Ñ Ð¼ÐµÑ‚Ð¾Ð´Ð° CONNECT. Значение \"0\" разрешает вÑе " ++"порты" ++ ++msgid "Listen address" ++msgstr "ÐдреÑ" ++ ++msgid "Listen port" ++msgstr "Порт" ++ ++msgid "Log file" ++msgstr "Файл журналированиÑ" ++ ++msgid "Log file to use for dumping messages" ++msgstr "Файл Ð´Ð»Ñ Ð·Ð°Ð¿Ð¸Ñи Ñообщений" ++ ++msgid "Log level" ++msgstr "Уровень журналированиÑ" ++ ++msgid "Logging verbosity of the Tinyproxy process" ++msgstr "Уровень подробноÑти Ð¶ÑƒÑ€Ð½Ð°Ð»Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ð¿Ñ€Ð¾Ñ†ÐµÑÑа Tinyproxy" ++ ++msgid "Max. clients" ++msgstr "МакÑ. кол-во клиентов" ++ ++msgid "Max. requests per server" ++msgstr "МакÑ. кол-во запроÑов на Ñервер" ++ ++msgid "Max. spare servers" ++msgstr "МакÑ. кол-во Ñерверов ожиданиÑ" ++ ++msgid "Maximum allowed number of concurrently connected clients" ++msgstr "МакÑимально допуÑтимое количеÑтво одновременно подключенных клиентов" ++ ++msgid "" ++"Maximum allowed number of requests per process. If it is exeeded, the " ++"process is restarted. Zero means unlimited." ++msgstr "" ++"МакÑимально допуÑтимое количеÑтво запроÑов на процеÑÑ. ЕÑли превышено, " ++"процеÑÑ Ð±ÑƒÐ´ÐµÑ‚ перезапущен. Ðоль отключает данное ограничение." ++ ++msgid "Maximum number of prepared idle processes" ++msgstr "МакÑимальное количеÑтво готовых к обработке процеÑÑов" ++ ++msgid "Maximum number of seconds an inactive connection is held open" ++msgstr "" ++"МакÑимальное количеÑтво Ñекунд, в течение которых неактивное Ñоединение " ++"оÑтаётÑÑ Ð¾Ñ‚ÐºÑ€Ñ‹Ñ‚Ñ‹Ð¼" ++ ++msgid "Min. spare servers" ++msgstr "Мин. кол-во Ñерверов ожиданиÑ" ++ ++msgid "Minimum number of prepared idle processes" ++msgstr "Минимальное количеÑтво готовых к обработке процеÑÑов" ++ ++msgid "Number of idle processes to start when launching Tinyproxy" ++msgstr "КоличеÑтво готовых к обработке процеÑÑов при Ñтарте Tinyproxy" ++ ++msgid "Plaintext file with URLs or domains to filter. One entry per line" ++msgstr "Файл Ñ URL или доменами Ð´Ð»Ñ Ñ„Ð¸Ð»ÑŒÑ‚Ñ€Ð°Ñ†Ð¸Ð¸. Одна запиÑÑŒ на Ñтроку" ++ ++msgid "Policy" ++msgstr "Политика" ++ ++msgid "Privacy settings" ++msgstr "ÐаÑтройки конфиденциальноÑти" ++ ++msgid "Reject access" ++msgstr "ОтклонÑÑ‚ÑŒ доÑтуп" ++ ++msgid "Server Settings" ++msgstr "ÐаÑтройки Ñервера" ++ ++msgid "Server limits" ++msgstr "ÐžÐ³Ñ€Ð°Ð½Ð¸Ñ‡ÐµÐ½Ð¸Ñ Ñервера" ++ ++msgid "" ++"Specifies HTTP header names which are allowed to pass-through, all others " ++"are discarded. Leave empty to disable header filtering" ++msgstr "" ++"ОпределÑет HTTP-заголовки, которым разрешено проходить через прокÑи. " ++"ОÑтавьте пуÑтым, чтобы не фильтровать заголовки" ++ ++msgid "Specifies the HTTP port Tinyproxy is listening on for requests" ++msgstr "ОпределÑет порт HTTP, на котором Tinyproxy ожидает запроÑÑ‹" ++ ++msgid "Specifies the Tinyproxy hostname to use in the Via HTTP header" ++msgstr "" ++"ОпределÑет Ð¸Ð¼Ñ Ñ…Ð¾Ñта Tinyproxy, которое будет иÑпользовано в HTTP-заголовке " ++"Via" ++ ++msgid "" ++"Specifies the address Tinyproxy binds to for outbound forwarded requests" ++msgstr "" ++"ОпределÑет адреÑ, к которому привÑзываетÑÑ Tinyproxy Ð´Ð»Ñ Ð¾Ñ‚Ð¿Ñ€Ð°Ð²ÐºÐ¸ иÑходÑщих " ++"запроÑов" ++ ++msgid "Specifies the addresses Tinyproxy is listening on for requests" ++msgstr "ОпределÑет адреÑ, на котором Tinyproxy ожидает запроÑÑ‹" ++ ++msgid "Specifies the group name the Tinyproxy process is running as" ++msgstr "ОпределÑет Ð¸Ð¼Ñ Ð³Ñ€ÑƒÐ¿Ð¿Ñ‹, в которой работает Tinyproxy" ++ ++msgid "" ++"Specifies the upstream proxy to use for accessing the target host. Format is " ++"address:port" ++msgstr "" ++"ОпределÑет прокÑи воÑходÑщего канала Ð´Ð»Ñ Ð´Ð¾Ñтупа к хоÑту в формате " ++"адреÑ:порт" ++ ++msgid "Specifies the user name the Tinyproxy process is running as" ++msgstr "ОпределÑет пользователÑ, от имени которого работает Tinyproxy" ++ ++msgid "Start spare servers" ++msgstr "ЗапуÑтить указанное количеÑтво готовых к обработке процеÑÑов" ++ ++msgid "Statistics page" ++msgstr "Страница ÑтатиÑтики" ++ ++msgid "Status" ++msgstr "СоÑтоÑние" ++ ++msgid "Target host" ++msgstr "ХоÑÑ‚ назначениÑ" ++ ++msgid "Tinyproxy" ++msgstr "Tinyproxy" ++ ++msgid "Tinyproxy Status" ++msgstr "СоÑтоÑние Tinyproxy" ++ ++msgid "Tinyproxy is a small and fast non-caching HTTP(S)-Proxy" ++msgstr "Tinyproxy - быÑтрый HTTP(S)-прокÑи, не иÑпользующий кÑш" ++ ++msgid "Upstream Proxies" ++msgstr "ПрокÑи Ð´Ð»Ñ Ð¸ÑходÑщего трафика" ++ ++msgid "" ++"Upstream proxy rules define proxy servers to use when accessing certain IP " ++"addresses or domains." ++msgstr "" ++"ПрокÑи Ð´Ð»Ñ Ð¸ÑходÑщего трафика при обращении к определённым IP-адреÑам или " ++"доменам." ++ ++msgid "Use syslog" ++msgstr "ИÑпользовать ÑиÑтемный журнал" ++ ++msgid "User" ++msgstr "Пользователь" ++ ++msgid "Via hostname" ++msgstr "Ð˜Ð¼Ñ Ñ…Ð¾Ñта Via" ++ ++msgid "Via proxy" ++msgstr "Через прокÑи" ++ ++msgid "Writes log messages to syslog instead of a log file" ++msgstr "ЗапиÑывать ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ Ð¶ÑƒÑ€Ð½Ð°Ð»Ð° в ÑиÑтемный журнал вмеÑто файла" ++ ++msgid "X-Tinyproxy header" ++msgstr "Заголовок X-Tinyproxy" +diff --git a/feeds/luci/applications/luci-app-tinyproxy/po/sk/tinyproxy.po b/feeds/luci/applications/luci-app-tinyproxy/po/sk/tinyproxy.po +new file mode 100644 +index 0000000..128c71d +--- /dev/null ++++ b/feeds/luci/applications/luci-app-tinyproxy/po/sk/tinyproxy.po +@@ -0,0 +1,255 @@ ++msgid "" ++msgstr "" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Last-Translator: Automatically generated\n" ++"Language-Team: none\n" ++"MIME-Version: 1.0\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n" ++ ++msgid "" ++"Via proxy routes requests to the given target via the specifed " ++"upstream proxy, Reject access disables any upstream proxy for the " ++"target" ++msgstr "" ++ ++msgid "" ++"Adds an \"X-Tinyproxy\" HTTP header with the client IP address to forwarded " ++"requests" ++msgstr "" ++ ++msgid "Allowed clients" ++msgstr "" ++ ++msgid "Allowed connect ports" ++msgstr "" ++ ++msgid "Bind address" ++msgstr "" ++ ++msgid "" ++"By default, basic POSIX expressions are used for filtering. Enable this to " ++"activate extended regular expressions" ++msgstr "" ++ ++msgid "" ++"By default, filter strings are treated as case-insensitive. Enable this to " ++"make the matching case-sensitive" ++msgstr "" ++ ++msgid "" ++"By default, filtering is done based on domain names. Enable this to match " ++"against URLs instead" ++msgstr "" ++ ++msgid "" ++"By default, the filter rules act as blacklist. Enable this option to only " ++"allow matched URLs or domain names" ++msgstr "" ++ ++msgid "" ++"Can be either an IP address or range, a domain name or \".\" for any host " ++"without domain" ++msgstr "" ++ ++msgid "Configuration" ++msgstr "" ++ ++msgid "Connection timeout" ++msgstr "" ++ ++msgid "Default deny" ++msgstr "" ++ ++msgid "Enable Tinyproxy server" ++msgstr "" ++ ++msgid "Error page" ++msgstr "" ++ ++msgid "Failed to retrieve statistics from url:" ++msgstr "" ++ ++msgid "Filter by RegExp" ++msgstr "" ++ ++msgid "Filter by URLs" ++msgstr "" ++ ++msgid "Filter case-sensitive" ++msgstr "" ++ ++msgid "Filter file" ++msgstr "" ++ ++msgid "Filtering and ACLs" ++msgstr "" ++ ++msgid "General settings" ++msgstr "" ++ ++msgid "Group" ++msgstr "" ++ ++msgid "HTML template file to serve for stat host requests" ++msgstr "" ++ ++msgid "HTML template file to serve when HTTP errors occur" ++msgstr "" ++ ++msgid "Header whitelist" ++msgstr "" ++ ++msgid "" ++"List of IP addresses or ranges which are allowed to use the proxy server" ++msgstr "" ++ ++msgid "" ++"List of allowed ports for the CONNECT method. A single value \"0\" allows " ++"all ports" ++msgstr "" ++ ++msgid "Listen address" ++msgstr "" ++ ++msgid "Listen port" ++msgstr "" ++ ++msgid "Log file" ++msgstr "" ++ ++msgid "Log file to use for dumping messages" ++msgstr "" ++ ++msgid "Log level" ++msgstr "" ++ ++msgid "Logging verbosity of the Tinyproxy process" ++msgstr "" ++ ++msgid "Max. clients" ++msgstr "" ++ ++msgid "Max. requests per server" ++msgstr "" ++ ++msgid "Max. spare servers" ++msgstr "" ++ ++msgid "Maximum allowed number of concurrently connected clients" ++msgstr "" ++ ++msgid "" ++"Maximum allowed number of requests per process. If it is exeeded, the " ++"process is restarted. Zero means unlimited." ++msgstr "" ++ ++msgid "Maximum number of prepared idle processes" ++msgstr "" ++ ++msgid "Maximum number of seconds an inactive connection is held open" ++msgstr "" ++ ++msgid "Min. spare servers" ++msgstr "" ++ ++msgid "Minimum number of prepared idle processes" ++msgstr "" ++ ++msgid "Number of idle processes to start when launching Tinyproxy" ++msgstr "" ++ ++msgid "Plaintext file with URLs or domains to filter. One entry per line" ++msgstr "" ++ ++msgid "Policy" ++msgstr "" ++ ++msgid "Privacy settings" ++msgstr "" ++ ++msgid "Reject access" ++msgstr "" ++ ++msgid "Server Settings" ++msgstr "" ++ ++msgid "Server limits" ++msgstr "" ++ ++msgid "" ++"Specifies HTTP header names which are allowed to pass-through, all others " ++"are discarded. Leave empty to disable header filtering" ++msgstr "" ++ ++msgid "Specifies the HTTP port Tinyproxy is listening on for requests" ++msgstr "" ++ ++msgid "Specifies the Tinyproxy hostname to use in the Via HTTP header" ++msgstr "" ++ ++msgid "" ++"Specifies the address Tinyproxy binds to for outbound forwarded requests" ++msgstr "" ++ ++msgid "Specifies the addresses Tinyproxy is listening on for requests" ++msgstr "" ++ ++msgid "Specifies the group name the Tinyproxy process is running as" ++msgstr "" ++ ++msgid "" ++"Specifies the upstream proxy to use for accessing the target host. Format is " ++"address:port" ++msgstr "" ++ ++msgid "Specifies the user name the Tinyproxy process is running as" ++msgstr "" ++ ++msgid "Start spare servers" ++msgstr "" ++ ++msgid "Statistics page" ++msgstr "" ++ ++msgid "Status" ++msgstr "" ++ ++msgid "Target host" ++msgstr "" ++ ++msgid "Tinyproxy" ++msgstr "" ++ ++msgid "Tinyproxy Status" ++msgstr "" ++ ++msgid "Tinyproxy is a small and fast non-caching HTTP(S)-Proxy" ++msgstr "" ++ ++msgid "Upstream Proxies" ++msgstr "" ++ ++msgid "" ++"Upstream proxy rules define proxy servers to use when accessing certain IP " ++"addresses or domains." ++msgstr "" ++ ++msgid "Use syslog" ++msgstr "" ++ ++msgid "User" ++msgstr "" ++ ++msgid "Via hostname" ++msgstr "" ++ ++msgid "Via proxy" ++msgstr "" ++ ++msgid "Writes log messages to syslog instead of a log file" ++msgstr "" ++ ++msgid "X-Tinyproxy header" ++msgstr "" +diff --git a/feeds/luci/applications/luci-app-tinyproxy/po/sv/tinyproxy.po b/feeds/luci/applications/luci-app-tinyproxy/po/sv/tinyproxy.po +new file mode 100644 +index 0000000..f706056 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-tinyproxy/po/sv/tinyproxy.po +@@ -0,0 +1,256 @@ ++msgid "" ++msgstr "" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Last-Translator: Automatically generated\n" ++"Language-Team: none\n" ++"Language: sv\n" ++"MIME-Version: 1.0\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n != 1);\n" ++ ++msgid "" ++"Via proxy routes requests to the given target via the specifed " ++"upstream proxy, Reject access disables any upstream proxy for the " ++"target" ++msgstr "" ++ ++msgid "" ++"Adds an \"X-Tinyproxy\" HTTP header with the client IP address to forwarded " ++"requests" ++msgstr "" ++ ++msgid "Allowed clients" ++msgstr "" ++ ++msgid "Allowed connect ports" ++msgstr "" ++ ++msgid "Bind address" ++msgstr "" ++ ++msgid "" ++"By default, basic POSIX expressions are used for filtering. Enable this to " ++"activate extended regular expressions" ++msgstr "" ++ ++msgid "" ++"By default, filter strings are treated as case-insensitive. Enable this to " ++"make the matching case-sensitive" ++msgstr "" ++ ++msgid "" ++"By default, filtering is done based on domain names. Enable this to match " ++"against URLs instead" ++msgstr "" ++ ++msgid "" ++"By default, the filter rules act as blacklist. Enable this option to only " ++"allow matched URLs or domain names" ++msgstr "" ++ ++msgid "" ++"Can be either an IP address or range, a domain name or \".\" for any host " ++"without domain" ++msgstr "" ++ ++msgid "Configuration" ++msgstr "" ++ ++msgid "Connection timeout" ++msgstr "" ++ ++msgid "Default deny" ++msgstr "" ++ ++msgid "Enable Tinyproxy server" ++msgstr "" ++ ++msgid "Error page" ++msgstr "" ++ ++msgid "Failed to retrieve statistics from url:" ++msgstr "" ++ ++msgid "Filter by RegExp" ++msgstr "" ++ ++msgid "Filter by URLs" ++msgstr "" ++ ++msgid "Filter case-sensitive" ++msgstr "" ++ ++msgid "Filter file" ++msgstr "" ++ ++msgid "Filtering and ACLs" ++msgstr "" ++ ++msgid "General settings" ++msgstr "" ++ ++msgid "Group" ++msgstr "" ++ ++msgid "HTML template file to serve for stat host requests" ++msgstr "" ++ ++msgid "HTML template file to serve when HTTP errors occur" ++msgstr "" ++ ++msgid "Header whitelist" ++msgstr "" ++ ++msgid "" ++"List of IP addresses or ranges which are allowed to use the proxy server" ++msgstr "" ++ ++msgid "" ++"List of allowed ports for the CONNECT method. A single value \"0\" allows " ++"all ports" ++msgstr "" ++ ++msgid "Listen address" ++msgstr "" ++ ++msgid "Listen port" ++msgstr "" ++ ++msgid "Log file" ++msgstr "" ++ ++msgid "Log file to use for dumping messages" ++msgstr "" ++ ++msgid "Log level" ++msgstr "" ++ ++msgid "Logging verbosity of the Tinyproxy process" ++msgstr "" ++ ++msgid "Max. clients" ++msgstr "" ++ ++msgid "Max. requests per server" ++msgstr "" ++ ++msgid "Max. spare servers" ++msgstr "" ++ ++msgid "Maximum allowed number of concurrently connected clients" ++msgstr "" ++ ++msgid "" ++"Maximum allowed number of requests per process. If it is exeeded, the " ++"process is restarted. Zero means unlimited." ++msgstr "" ++ ++msgid "Maximum number of prepared idle processes" ++msgstr "" ++ ++msgid "Maximum number of seconds an inactive connection is held open" ++msgstr "" ++ ++msgid "Min. spare servers" ++msgstr "" ++ ++msgid "Minimum number of prepared idle processes" ++msgstr "" ++ ++msgid "Number of idle processes to start when launching Tinyproxy" ++msgstr "" ++ ++msgid "Plaintext file with URLs or domains to filter. One entry per line" ++msgstr "" ++ ++msgid "Policy" ++msgstr "" ++ ++msgid "Privacy settings" ++msgstr "" ++ ++msgid "Reject access" ++msgstr "" ++ ++msgid "Server Settings" ++msgstr "" ++ ++msgid "Server limits" ++msgstr "" ++ ++msgid "" ++"Specifies HTTP header names which are allowed to pass-through, all others " ++"are discarded. Leave empty to disable header filtering" ++msgstr "" ++ ++msgid "Specifies the HTTP port Tinyproxy is listening on for requests" ++msgstr "" ++ ++msgid "Specifies the Tinyproxy hostname to use in the Via HTTP header" ++msgstr "" ++ ++msgid "" ++"Specifies the address Tinyproxy binds to for outbound forwarded requests" ++msgstr "" ++ ++msgid "Specifies the addresses Tinyproxy is listening on for requests" ++msgstr "" ++ ++msgid "Specifies the group name the Tinyproxy process is running as" ++msgstr "" ++ ++msgid "" ++"Specifies the upstream proxy to use for accessing the target host. Format is " ++"address:port" ++msgstr "" ++ ++msgid "Specifies the user name the Tinyproxy process is running as" ++msgstr "" ++ ++msgid "Start spare servers" ++msgstr "" ++ ++msgid "Statistics page" ++msgstr "" ++ ++msgid "Status" ++msgstr "" ++ ++msgid "Target host" ++msgstr "" ++ ++msgid "Tinyproxy" ++msgstr "" ++ ++msgid "Tinyproxy Status" ++msgstr "" ++ ++msgid "Tinyproxy is a small and fast non-caching HTTP(S)-Proxy" ++msgstr "" ++ ++msgid "Upstream Proxies" ++msgstr "" ++ ++msgid "" ++"Upstream proxy rules define proxy servers to use when accessing certain IP " ++"addresses or domains." ++msgstr "" ++ ++msgid "Use syslog" ++msgstr "" ++ ++msgid "User" ++msgstr "" ++ ++msgid "Via hostname" ++msgstr "" ++ ++msgid "Via proxy" ++msgstr "" ++ ++msgid "Writes log messages to syslog instead of a log file" ++msgstr "" ++ ++msgid "X-Tinyproxy header" ++msgstr "" +diff --git a/feeds/luci/applications/luci-app-tinyproxy/po/templates/tinyproxy.pot b/feeds/luci/applications/luci-app-tinyproxy/po/templates/tinyproxy.pot +new file mode 100644 +index 0000000..712fad9 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-tinyproxy/po/templates/tinyproxy.pot +@@ -0,0 +1,248 @@ ++msgid "" ++msgstr "Content-Type: text/plain; charset=UTF-8" ++ ++msgid "" ++"Via proxy routes requests to the given target via the specifed " ++"upstream proxy, Reject access disables any upstream proxy for the " ++"target" ++msgstr "" ++ ++msgid "" ++"Adds an \"X-Tinyproxy\" HTTP header with the client IP address to forwarded " ++"requests" ++msgstr "" ++ ++msgid "Allowed clients" ++msgstr "" ++ ++msgid "Allowed connect ports" ++msgstr "" ++ ++msgid "Bind address" ++msgstr "" ++ ++msgid "" ++"By default, basic POSIX expressions are used for filtering. Enable this to " ++"activate extended regular expressions" ++msgstr "" ++ ++msgid "" ++"By default, filter strings are treated as case-insensitive. Enable this to " ++"make the matching case-sensitive" ++msgstr "" ++ ++msgid "" ++"By default, filtering is done based on domain names. Enable this to match " ++"against URLs instead" ++msgstr "" ++ ++msgid "" ++"By default, the filter rules act as blacklist. Enable this option to only " ++"allow matched URLs or domain names" ++msgstr "" ++ ++msgid "" ++"Can be either an IP address or range, a domain name or \".\" for any host " ++"without domain" ++msgstr "" ++ ++msgid "Configuration" ++msgstr "" ++ ++msgid "Connection timeout" ++msgstr "" ++ ++msgid "Default deny" ++msgstr "" ++ ++msgid "Enable Tinyproxy server" ++msgstr "" ++ ++msgid "Error page" ++msgstr "" ++ ++msgid "Failed to retrieve statistics from url:" ++msgstr "" ++ ++msgid "Filter by RegExp" ++msgstr "" ++ ++msgid "Filter by URLs" ++msgstr "" ++ ++msgid "Filter case-sensitive" ++msgstr "" ++ ++msgid "Filter file" ++msgstr "" ++ ++msgid "Filtering and ACLs" ++msgstr "" ++ ++msgid "General settings" ++msgstr "" ++ ++msgid "Group" ++msgstr "" ++ ++msgid "HTML template file to serve for stat host requests" ++msgstr "" ++ ++msgid "HTML template file to serve when HTTP errors occur" ++msgstr "" ++ ++msgid "Header whitelist" ++msgstr "" ++ ++msgid "" ++"List of IP addresses or ranges which are allowed to use the proxy server" ++msgstr "" ++ ++msgid "" ++"List of allowed ports for the CONNECT method. A single value \"0\" allows " ++"all ports" ++msgstr "" ++ ++msgid "Listen address" ++msgstr "" ++ ++msgid "Listen port" ++msgstr "" ++ ++msgid "Log file" ++msgstr "" ++ ++msgid "Log file to use for dumping messages" ++msgstr "" ++ ++msgid "Log level" ++msgstr "" ++ ++msgid "Logging verbosity of the Tinyproxy process" ++msgstr "" ++ ++msgid "Max. clients" ++msgstr "" ++ ++msgid "Max. requests per server" ++msgstr "" ++ ++msgid "Max. spare servers" ++msgstr "" ++ ++msgid "Maximum allowed number of concurrently connected clients" ++msgstr "" ++ ++msgid "" ++"Maximum allowed number of requests per process. If it is exeeded, the " ++"process is restarted. Zero means unlimited." ++msgstr "" ++ ++msgid "Maximum number of prepared idle processes" ++msgstr "" ++ ++msgid "Maximum number of seconds an inactive connection is held open" ++msgstr "" ++ ++msgid "Min. spare servers" ++msgstr "" ++ ++msgid "Minimum number of prepared idle processes" ++msgstr "" ++ ++msgid "Number of idle processes to start when launching Tinyproxy" ++msgstr "" ++ ++msgid "Plaintext file with URLs or domains to filter. One entry per line" ++msgstr "" ++ ++msgid "Policy" ++msgstr "" ++ ++msgid "Privacy settings" ++msgstr "" ++ ++msgid "Reject access" ++msgstr "" ++ ++msgid "Server Settings" ++msgstr "" ++ ++msgid "Server limits" ++msgstr "" ++ ++msgid "" ++"Specifies HTTP header names which are allowed to pass-through, all others " ++"are discarded. Leave empty to disable header filtering" ++msgstr "" ++ ++msgid "Specifies the HTTP port Tinyproxy is listening on for requests" ++msgstr "" ++ ++msgid "Specifies the Tinyproxy hostname to use in the Via HTTP header" ++msgstr "" ++ ++msgid "" ++"Specifies the address Tinyproxy binds to for outbound forwarded requests" ++msgstr "" ++ ++msgid "Specifies the addresses Tinyproxy is listening on for requests" ++msgstr "" ++ ++msgid "Specifies the group name the Tinyproxy process is running as" ++msgstr "" ++ ++msgid "" ++"Specifies the upstream proxy to use for accessing the target host. Format is " ++"address:port" ++msgstr "" ++ ++msgid "Specifies the user name the Tinyproxy process is running as" ++msgstr "" ++ ++msgid "Start spare servers" ++msgstr "" ++ ++msgid "Statistics page" ++msgstr "" ++ ++msgid "Status" ++msgstr "" ++ ++msgid "Target host" ++msgstr "" ++ ++msgid "Tinyproxy" ++msgstr "" ++ ++msgid "Tinyproxy Status" ++msgstr "" ++ ++msgid "Tinyproxy is a small and fast non-caching HTTP(S)-Proxy" ++msgstr "" ++ ++msgid "Upstream Proxies" ++msgstr "" ++ ++msgid "" ++"Upstream proxy rules define proxy servers to use when accessing certain IP " ++"addresses or domains." ++msgstr "" ++ ++msgid "Use syslog" ++msgstr "" ++ ++msgid "User" ++msgstr "" ++ ++msgid "Via hostname" ++msgstr "" ++ ++msgid "Via proxy" ++msgstr "" ++ ++msgid "Writes log messages to syslog instead of a log file" ++msgstr "" ++ ++msgid "X-Tinyproxy header" ++msgstr "" +diff --git a/feeds/luci/applications/luci-app-tinyproxy/po/tr/tinyproxy.po b/feeds/luci/applications/luci-app-tinyproxy/po/tr/tinyproxy.po +new file mode 100644 +index 0000000..a7af49d +--- /dev/null ++++ b/feeds/luci/applications/luci-app-tinyproxy/po/tr/tinyproxy.po +@@ -0,0 +1,255 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Last-Translator: Automatically generated\n" ++"Language-Team: none\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=1; plural=0;\n" ++ ++msgid "" ++"Via proxy routes requests to the given target via the specifed " ++"upstream proxy, Reject access disables any upstream proxy for the " ++"target" ++msgstr "" ++ ++msgid "" ++"Adds an \"X-Tinyproxy\" HTTP header with the client IP address to forwarded " ++"requests" ++msgstr "" ++ ++msgid "Allowed clients" ++msgstr "" ++ ++msgid "Allowed connect ports" ++msgstr "" ++ ++msgid "Bind address" ++msgstr "" ++ ++msgid "" ++"By default, basic POSIX expressions are used for filtering. Enable this to " ++"activate extended regular expressions" ++msgstr "" ++ ++msgid "" ++"By default, filter strings are treated as case-insensitive. Enable this to " ++"make the matching case-sensitive" ++msgstr "" ++ ++msgid "" ++"By default, filtering is done based on domain names. Enable this to match " ++"against URLs instead" ++msgstr "" ++ ++msgid "" ++"By default, the filter rules act as blacklist. Enable this option to only " ++"allow matched URLs or domain names" ++msgstr "" ++ ++msgid "" ++"Can be either an IP address or range, a domain name or \".\" for any host " ++"without domain" ++msgstr "" ++ ++msgid "Configuration" ++msgstr "" ++ ++msgid "Connection timeout" ++msgstr "" ++ ++msgid "Default deny" ++msgstr "" ++ ++msgid "Enable Tinyproxy server" ++msgstr "" ++ ++msgid "Error page" ++msgstr "" ++ ++msgid "Failed to retrieve statistics from url:" ++msgstr "" ++ ++msgid "Filter by RegExp" ++msgstr "" ++ ++msgid "Filter by URLs" ++msgstr "" ++ ++msgid "Filter case-sensitive" ++msgstr "" ++ ++msgid "Filter file" ++msgstr "" ++ ++msgid "Filtering and ACLs" ++msgstr "" ++ ++msgid "General settings" ++msgstr "" ++ ++msgid "Group" ++msgstr "" ++ ++msgid "HTML template file to serve for stat host requests" ++msgstr "" ++ ++msgid "HTML template file to serve when HTTP errors occur" ++msgstr "" ++ ++msgid "Header whitelist" ++msgstr "" ++ ++msgid "" ++"List of IP addresses or ranges which are allowed to use the proxy server" ++msgstr "" ++ ++msgid "" ++"List of allowed ports for the CONNECT method. A single value \"0\" allows " ++"all ports" ++msgstr "" ++ ++msgid "Listen address" ++msgstr "" ++ ++msgid "Listen port" ++msgstr "" ++ ++msgid "Log file" ++msgstr "" ++ ++msgid "Log file to use for dumping messages" ++msgstr "" ++ ++msgid "Log level" ++msgstr "" ++ ++msgid "Logging verbosity of the Tinyproxy process" ++msgstr "" ++ ++msgid "Max. clients" ++msgstr "" ++ ++msgid "Max. requests per server" ++msgstr "" ++ ++msgid "Max. spare servers" ++msgstr "" ++ ++msgid "Maximum allowed number of concurrently connected clients" ++msgstr "" ++ ++msgid "" ++"Maximum allowed number of requests per process. If it is exeeded, the " ++"process is restarted. Zero means unlimited." ++msgstr "" ++ ++msgid "Maximum number of prepared idle processes" ++msgstr "" ++ ++msgid "Maximum number of seconds an inactive connection is held open" ++msgstr "" ++ ++msgid "Min. spare servers" ++msgstr "" ++ ++msgid "Minimum number of prepared idle processes" ++msgstr "" ++ ++msgid "Number of idle processes to start when launching Tinyproxy" ++msgstr "" ++ ++msgid "Plaintext file with URLs or domains to filter. One entry per line" ++msgstr "" ++ ++msgid "Policy" ++msgstr "" ++ ++msgid "Privacy settings" ++msgstr "" ++ ++msgid "Reject access" ++msgstr "" ++ ++msgid "Server Settings" ++msgstr "" ++ ++msgid "Server limits" ++msgstr "" ++ ++msgid "" ++"Specifies HTTP header names which are allowed to pass-through, all others " ++"are discarded. Leave empty to disable header filtering" ++msgstr "" ++ ++msgid "Specifies the HTTP port Tinyproxy is listening on for requests" ++msgstr "" ++ ++msgid "Specifies the Tinyproxy hostname to use in the Via HTTP header" ++msgstr "" ++ ++msgid "" ++"Specifies the address Tinyproxy binds to for outbound forwarded requests" ++msgstr "" ++ ++msgid "Specifies the addresses Tinyproxy is listening on for requests" ++msgstr "" ++ ++msgid "Specifies the group name the Tinyproxy process is running as" ++msgstr "" ++ ++msgid "" ++"Specifies the upstream proxy to use for accessing the target host. Format is " ++"address:port" ++msgstr "" ++ ++msgid "Specifies the user name the Tinyproxy process is running as" ++msgstr "" ++ ++msgid "Start spare servers" ++msgstr "" ++ ++msgid "Statistics page" ++msgstr "" ++ ++msgid "Status" ++msgstr "" ++ ++msgid "Target host" ++msgstr "" ++ ++msgid "Tinyproxy" ++msgstr "" ++ ++msgid "Tinyproxy Status" ++msgstr "" ++ ++msgid "Tinyproxy is a small and fast non-caching HTTP(S)-Proxy" ++msgstr "" ++ ++msgid "Upstream Proxies" ++msgstr "" ++ ++msgid "" ++"Upstream proxy rules define proxy servers to use when accessing certain IP " ++"addresses or domains." ++msgstr "" ++ ++msgid "Use syslog" ++msgstr "" ++ ++msgid "User" ++msgstr "" ++ ++msgid "Via hostname" ++msgstr "" ++ ++msgid "Via proxy" ++msgstr "" ++ ++msgid "Writes log messages to syslog instead of a log file" ++msgstr "" ++ ++msgid "X-Tinyproxy header" ++msgstr "" +diff --git a/feeds/luci/applications/luci-app-tinyproxy/po/uk/tinyproxy.po b/feeds/luci/applications/luci-app-tinyproxy/po/uk/tinyproxy.po +new file mode 100644 +index 0000000..2e268ba +--- /dev/null ++++ b/feeds/luci/applications/luci-app-tinyproxy/po/uk/tinyproxy.po +@@ -0,0 +1,256 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Last-Translator: Automatically generated\n" ++"Language-Team: none\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n" ++"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" ++ ++msgid "" ++"Via proxy routes requests to the given target via the specifed " ++"upstream proxy, Reject access disables any upstream proxy for the " ++"target" ++msgstr "" ++ ++msgid "" ++"Adds an \"X-Tinyproxy\" HTTP header with the client IP address to forwarded " ++"requests" ++msgstr "" ++ ++msgid "Allowed clients" ++msgstr "" ++ ++msgid "Allowed connect ports" ++msgstr "" ++ ++msgid "Bind address" ++msgstr "" ++ ++msgid "" ++"By default, basic POSIX expressions are used for filtering. Enable this to " ++"activate extended regular expressions" ++msgstr "" ++ ++msgid "" ++"By default, filter strings are treated as case-insensitive. Enable this to " ++"make the matching case-sensitive" ++msgstr "" ++ ++msgid "" ++"By default, filtering is done based on domain names. Enable this to match " ++"against URLs instead" ++msgstr "" ++ ++msgid "" ++"By default, the filter rules act as blacklist. Enable this option to only " ++"allow matched URLs or domain names" ++msgstr "" ++ ++msgid "" ++"Can be either an IP address or range, a domain name or \".\" for any host " ++"without domain" ++msgstr "" ++ ++msgid "Configuration" ++msgstr "" ++ ++msgid "Connection timeout" ++msgstr "" ++ ++msgid "Default deny" ++msgstr "" ++ ++msgid "Enable Tinyproxy server" ++msgstr "" ++ ++msgid "Error page" ++msgstr "" ++ ++msgid "Failed to retrieve statistics from url:" ++msgstr "" ++ ++msgid "Filter by RegExp" ++msgstr "" ++ ++msgid "Filter by URLs" ++msgstr "" ++ ++msgid "Filter case-sensitive" ++msgstr "" ++ ++msgid "Filter file" ++msgstr "" ++ ++msgid "Filtering and ACLs" ++msgstr "" ++ ++msgid "General settings" ++msgstr "" ++ ++msgid "Group" ++msgstr "" ++ ++msgid "HTML template file to serve for stat host requests" ++msgstr "" ++ ++msgid "HTML template file to serve when HTTP errors occur" ++msgstr "" ++ ++msgid "Header whitelist" ++msgstr "" ++ ++msgid "" ++"List of IP addresses or ranges which are allowed to use the proxy server" ++msgstr "" ++ ++msgid "" ++"List of allowed ports for the CONNECT method. A single value \"0\" allows " ++"all ports" ++msgstr "" ++ ++msgid "Listen address" ++msgstr "" ++ ++msgid "Listen port" ++msgstr "" ++ ++msgid "Log file" ++msgstr "" ++ ++msgid "Log file to use for dumping messages" ++msgstr "" ++ ++msgid "Log level" ++msgstr "" ++ ++msgid "Logging verbosity of the Tinyproxy process" ++msgstr "" ++ ++msgid "Max. clients" ++msgstr "" ++ ++msgid "Max. requests per server" ++msgstr "" ++ ++msgid "Max. spare servers" ++msgstr "" ++ ++msgid "Maximum allowed number of concurrently connected clients" ++msgstr "" ++ ++msgid "" ++"Maximum allowed number of requests per process. If it is exeeded, the " ++"process is restarted. Zero means unlimited." ++msgstr "" ++ ++msgid "Maximum number of prepared idle processes" ++msgstr "" ++ ++msgid "Maximum number of seconds an inactive connection is held open" ++msgstr "" ++ ++msgid "Min. spare servers" ++msgstr "" ++ ++msgid "Minimum number of prepared idle processes" ++msgstr "" ++ ++msgid "Number of idle processes to start when launching Tinyproxy" ++msgstr "" ++ ++msgid "Plaintext file with URLs or domains to filter. One entry per line" ++msgstr "" ++ ++msgid "Policy" ++msgstr "" ++ ++msgid "Privacy settings" ++msgstr "" ++ ++msgid "Reject access" ++msgstr "" ++ ++msgid "Server Settings" ++msgstr "" ++ ++msgid "Server limits" ++msgstr "" ++ ++msgid "" ++"Specifies HTTP header names which are allowed to pass-through, all others " ++"are discarded. Leave empty to disable header filtering" ++msgstr "" ++ ++msgid "Specifies the HTTP port Tinyproxy is listening on for requests" ++msgstr "" ++ ++msgid "Specifies the Tinyproxy hostname to use in the Via HTTP header" ++msgstr "" ++ ++msgid "" ++"Specifies the address Tinyproxy binds to for outbound forwarded requests" ++msgstr "" ++ ++msgid "Specifies the addresses Tinyproxy is listening on for requests" ++msgstr "" ++ ++msgid "Specifies the group name the Tinyproxy process is running as" ++msgstr "" ++ ++msgid "" ++"Specifies the upstream proxy to use for accessing the target host. Format is " ++"address:port" ++msgstr "" ++ ++msgid "Specifies the user name the Tinyproxy process is running as" ++msgstr "" ++ ++msgid "Start spare servers" ++msgstr "" ++ ++msgid "Statistics page" ++msgstr "" ++ ++msgid "Status" ++msgstr "" ++ ++msgid "Target host" ++msgstr "" ++ ++msgid "Tinyproxy" ++msgstr "" ++ ++msgid "Tinyproxy Status" ++msgstr "" ++ ++msgid "Tinyproxy is a small and fast non-caching HTTP(S)-Proxy" ++msgstr "" ++ ++msgid "Upstream Proxies" ++msgstr "" ++ ++msgid "" ++"Upstream proxy rules define proxy servers to use when accessing certain IP " ++"addresses or domains." ++msgstr "" ++ ++msgid "Use syslog" ++msgstr "" ++ ++msgid "User" ++msgstr "" ++ ++msgid "Via hostname" ++msgstr "" ++ ++msgid "Via proxy" ++msgstr "" ++ ++msgid "Writes log messages to syslog instead of a log file" ++msgstr "" ++ ++msgid "X-Tinyproxy header" ++msgstr "" +diff --git a/feeds/luci/applications/luci-app-tinyproxy/po/vi/tinyproxy.po b/feeds/luci/applications/luci-app-tinyproxy/po/vi/tinyproxy.po +new file mode 100644 +index 0000000..6c825f5 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-tinyproxy/po/vi/tinyproxy.po +@@ -0,0 +1,332 @@ ++# tinyproxy.pot ++# generated from ./applications/luci-tinyproxy/luasrc/i18n/tinyproxy.en.lua ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Report-Msgid-Bugs-To: \n" ++"POT-Creation-Date: 2009-08-16 06:58+0200\n" ++"PO-Revision-Date: 2009-08-13 03:36+0200\n" ++"Last-Translator: Hong Phuc Dang \n" ++"Language-Team: LANGUAGE \n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"X-Generator: Pootle 1.1.0\n" ++ ++msgid "" ++"Via proxy routes requests to the given target via the specifed " ++"upstream proxy, Reject access disables any upstream proxy for the " ++"target" ++msgstr "" ++ ++msgid "" ++"Adds an \"X-Tinyproxy\" HTTP header with the client IP address to forwarded " ++"requests" ++msgstr "" ++ ++msgid "Allowed clients" ++msgstr "" ++ ++msgid "Allowed connect ports" ++msgstr "" ++ ++msgid "Bind address" ++msgstr "" ++ ++msgid "" ++"By default, basic POSIX expressions are used for filtering. Enable this to " ++"activate extended regular expressions" ++msgstr "" ++ ++msgid "" ++"By default, filter strings are treated as case-insensitive. Enable this to " ++"make the matching case-sensitive" ++msgstr "" ++ ++msgid "" ++"By default, filtering is done based on domain names. Enable this to match " ++"against URLs instead" ++msgstr "" ++ ++msgid "" ++"By default, the filter rules act as blacklist. Enable this option to only " ++"allow matched URLs or domain names" ++msgstr "" ++ ++msgid "" ++"Can be either an IP address or range, a domain name or \".\" for any host " ++"without domain" ++msgstr "" ++ ++msgid "Configuration" ++msgstr "" ++ ++msgid "Connection timeout" ++msgstr "" ++ ++msgid "Default deny" ++msgstr "" ++ ++msgid "Enable Tinyproxy server" ++msgstr "" ++ ++msgid "Error page" ++msgstr "" ++ ++msgid "Failed to retrieve statistics from url:" ++msgstr "" ++ ++msgid "Filter by RegExp" ++msgstr "" ++ ++msgid "Filter by URLs" ++msgstr "" ++ ++msgid "Filter case-sensitive" ++msgstr "" ++ ++msgid "Filter file" ++msgstr "" ++ ++msgid "Filtering and ACLs" ++msgstr "" ++ ++msgid "General settings" ++msgstr "" ++ ++msgid "Group" ++msgstr "" ++ ++msgid "HTML template file to serve for stat host requests" ++msgstr "" ++ ++msgid "HTML template file to serve when HTTP errors occur" ++msgstr "" ++ ++msgid "Header whitelist" ++msgstr "" ++ ++msgid "" ++"List of IP addresses or ranges which are allowed to use the proxy server" ++msgstr "" ++ ++msgid "" ++"List of allowed ports for the CONNECT method. A single value \"0\" allows " ++"all ports" ++msgstr "" ++ ++msgid "Listen address" ++msgstr "" ++ ++msgid "Listen port" ++msgstr "" ++ ++msgid "Log file" ++msgstr "" ++ ++msgid "Log file to use for dumping messages" ++msgstr "" ++ ++msgid "Log level" ++msgstr "Log level" ++ ++msgid "Logging verbosity of the Tinyproxy process" ++msgstr "" ++ ++msgid "Max. clients" ++msgstr "" ++ ++msgid "Max. requests per server" ++msgstr "" ++ ++msgid "Max. spare servers" ++msgstr "Tối Ä‘a spare servers" ++ ++msgid "Maximum allowed number of concurrently connected clients" ++msgstr "" ++ ++msgid "" ++"Maximum allowed number of requests per process. If it is exeeded, the " ++"process is restarted. Zero means unlimited." ++msgstr "" ++ ++msgid "Maximum number of prepared idle processes" ++msgstr "" ++ ++msgid "Maximum number of seconds an inactive connection is held open" ++msgstr "" ++ ++msgid "Min. spare servers" ++msgstr "Tối thiểu spare servers" ++ ++msgid "Minimum number of prepared idle processes" ++msgstr "" ++ ++msgid "Number of idle processes to start when launching Tinyproxy" ++msgstr "" ++ ++msgid "Plaintext file with URLs or domains to filter. One entry per line" ++msgstr "" ++ ++msgid "Policy" ++msgstr "" ++ ++msgid "Privacy settings" ++msgstr "" ++ ++msgid "Reject access" ++msgstr "Từ chối truy cập " ++ ++msgid "Server Settings" ++msgstr "" ++ ++msgid "Server limits" ++msgstr "" ++ ++msgid "" ++"Specifies HTTP header names which are allowed to pass-through, all others " ++"are discarded. Leave empty to disable header filtering" ++msgstr "" ++ ++msgid "Specifies the HTTP port Tinyproxy is listening on for requests" ++msgstr "" ++ ++msgid "Specifies the Tinyproxy hostname to use in the Via HTTP header" ++msgstr "" ++ ++msgid "" ++"Specifies the address Tinyproxy binds to for outbound forwarded requests" ++msgstr "" ++ ++msgid "Specifies the addresses Tinyproxy is listening on for requests" ++msgstr "" ++ ++msgid "Specifies the group name the Tinyproxy process is running as" ++msgstr "" ++ ++msgid "" ++"Specifies the upstream proxy to use for accessing the target host. Format is " ++"address:port" ++msgstr "" ++ ++msgid "Specifies the user name the Tinyproxy process is running as" ++msgstr "" ++ ++msgid "Start spare servers" ++msgstr "" ++ ++msgid "Statistics page" ++msgstr "" ++ ++msgid "Status" ++msgstr "" ++ ++msgid "Target host" ++msgstr "Host mục tiêu" ++ ++msgid "Tinyproxy" ++msgstr "Tinyproxy" ++ ++msgid "Tinyproxy Status" ++msgstr "" ++ ++msgid "Tinyproxy is a small and fast non-caching HTTP(S)-Proxy" ++msgstr "Tinyproxy là má»™t proxy nhá» và nhanh không-cạc HTTP(S)" ++ ++msgid "Upstream Proxies" ++msgstr "" ++ ++msgid "" ++"Upstream proxy rules define proxy servers to use when accessing certain IP " ++"addresses or domains." ++msgstr "" ++ ++msgid "Use syslog" ++msgstr "" ++ ++msgid "User" ++msgstr "" ++ ++msgid "Via hostname" ++msgstr "" ++ ++msgid "Via proxy" ++msgstr "Via proxy" ++ ++msgid "Writes log messages to syslog instead of a log file" ++msgstr "" ++ ++msgid "X-Tinyproxy header" ++msgstr "" ++ ++#~ msgid "Allow access from" ++#~ msgstr "Cho phép truy cập từ" ++ ++#~ msgid "Allowed headers for anonymous proxy" ++#~ msgstr "Cho phép headers cho anonymous proxy" ++ ++#~ msgid "Bind outgoing traffic to address" ++#~ msgstr "Blind lÆ°u lượng truy cập ngoài vào địa chỉ" ++ ++#~ msgid "Ports allowed for CONNECT method" ++#~ msgstr "Cổng cho phép phÆ°Æ¡ng pháp CONNECT" ++ ++#~ msgid "0 = disabled, empty = all" ++#~ msgstr "0=vô hiệu hóa, rá»—ng = tất cả" ++ ++#~ msgid "Error document" ++#~ msgstr "Tài liệu lá»—i" ++ ++#~ msgid "Filter list" ++#~ msgstr "Lá»c list" ++ ++#~ msgid "Case sensitive filters" ++#~ msgstr "Lá»c phím nhạy cảm" ++ ++#~ msgid "Filter list is a whitelist" ++#~ msgstr "Lá»c list là má»™t whitelist" ++ ++#~ msgid "Extended regular expression filters" ++#~ msgstr "Mở rá»™ng các bá»™ lá»c thÆ°á»ng xuyên biểu" ++ ++#~ msgid "Filter URLs instead of domains" ++#~ msgstr "Lá»c URLs thay domain" ++ ++#~ msgid "Listen on address" ++#~ msgstr "Nghe trên địa chỉ" ++ ++#~ msgid "Logfile" ++#~ msgstr "Logfile" ++ ++#~ msgid "Maximum number of clients" ++#~ msgstr "Tối Ä‘a số lượng khách hàng" ++ ++#~ msgid "Maximum requests per thread" ++#~ msgstr "Tối Ä‘a yêu cầu trên thread" ++ ++#~ msgid "Spare servers to start with" ++#~ msgstr "Spare servers bắt đầu vá»›i" ++ ++#~ msgid "Statistic document" ++#~ msgstr "Tài liệu thống kê" ++ ++#~ msgid "Write to syslog" ++#~ msgstr "viết tá»›i syslog" ++ ++#~ msgid "Connection Timeout" ++#~ msgstr "Kết nối hết hiệu lá»±c" ++ ++#~ msgid "Value of Via-Header" ++#~ msgstr "Giá trị của Via-Header" ++ ++#~ msgid "Include client IP" ++#~ msgstr "Bao gồm IP của khách hàng" ++ ++#~ msgid "Upstream Control" ++#~ msgstr "Äiá»u khiển Upstream " ++ ++#~ msgid "Type" ++#~ msgstr "Loại " ++ ++#~ msgid "Upstream Proxy" ++#~ msgstr "Upstream Proxy" +diff --git a/feeds/luci/applications/luci-app-tinyproxy/po/zh-cn/tinyproxy.po b/feeds/luci/applications/luci-app-tinyproxy/po/zh-cn/tinyproxy.po +new file mode 100644 +index 0000000..828e952 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-tinyproxy/po/zh-cn/tinyproxy.po +@@ -0,0 +1,262 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"PO-Revision-Date: 2013-10-10 19:43+0200\n" ++"Last-Translator: Tanyingyu \n" ++"Language-Team: none\n" ++"Language: zh_CN\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=1; plural=0;\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "" ++"Via proxy routes requests to the given target via the specifed " ++"upstream proxy, Reject access disables any upstream proxy for the " ++"target" ++msgstr "" ++"通过代ç†å…许给定的对象ç»è¿‡æŒ‡å®šçš„上行代ç†çš„路由请求。拒ç»ä»£ç† ç¦ç”¨å¯¹è±¡çš„任何上行代ç†ã€‚" ++ ++msgid "" ++"Adds an \"X-Tinyproxy\" HTTP header with the client IP address to forwarded " ++"requests" ++msgstr "转å‘请求时增加了一个客户机IP地å€å’Œâ€œX-Tinyproxy“HTTP头" ++ ++msgid "Allowed clients" ++msgstr "授æƒå®¢æˆ·ç«¯" ++ ++msgid "Allowed connect ports" ++msgstr "å…许的连接端å£" ++ ++msgid "Bind address" ++msgstr "绑定地å€" ++ ++msgid "" ++"By default, basic POSIX expressions are used for filtering. Enable this to " ++"activate extended regular expressions" ++msgstr "" ++"默认情况下,使用基本的POSIX表达å¼ä½œä¸ºæ»¤è§„则。å¯ç”¨è¿™ä¸ªä»¥ä½¿ç”¨æ­£è§„表达å¼ä»£æ›¿ä¹‹ã€‚" ++ ++msgid "" ++"By default, filter strings are treated as case-insensitive. Enable this to " ++"make the matching case-sensitive" ++msgstr "默认情况下,过滤规则是ä¸åŒºåˆ†å¤§å°å†™çš„。å¯ç”¨å®ƒåˆ™è½¬ä¸ºåŒºåˆ†å¤§å°å†™ã€‚" ++ ++msgid "" ++"By default, filtering is done based on domain names. Enable this to match " ++"against URLs instead" ++msgstr "默认情况下,过滤器åªåŒ¹é…域å。å¯ç”¨å®ƒä»¥åŒ¹é…URL。" ++ ++msgid "" ++"By default, the filter rules act as blacklist. Enable this option to only " ++"allow matched URLs or domain names" ++msgstr "" ++"默认情况下,过滤规则将以黑åå•å½¢å¼åŒ¹é…。å¯ç”¨å®ƒå°†ä»…å…许过滤规则里的URL或域å。" ++ ++msgid "" ++"Can be either an IP address or range, a domain name or \".\" for any host " ++"without domain" ++msgstr "å¯ä»¥æ˜¯IP地å€æˆ–者范围,也å¯ä»¥æ˜¯åŸŸå或者以\".\"代表任æ„主机" ++ ++msgid "Configuration" ++msgstr "é…ç½®" ++ ++msgid "Connection timeout" ++msgstr "连接超时时间" ++ ++msgid "Default deny" ++msgstr "默认拒ç»" ++ ++msgid "Enable Tinyproxy server" ++msgstr "å¯ç”¨Tinyproxy" ++ ++msgid "Error page" ++msgstr "错误页é¢" ++ ++msgid "Failed to retrieve statistics from url:" ++msgstr "从url未能检索统计信æ¯" ++ ++msgid "Filter by RegExp" ++msgstr "正则表达å¼è¿‡æ»¤å™¨" ++ ++msgid "Filter by URLs" ++msgstr "基于URL的过滤器" ++ ++msgid "Filter case-sensitive" ++msgstr "过滤器大å°å†™æ•æ„Ÿ" ++ ++msgid "Filter file" ++msgstr "过滤器文件" ++ ++msgid "Filtering and ACLs" ++msgstr "过滤规则和访问控制列表" ++ ++msgid "General settings" ++msgstr "基本设置" ++ ++msgid "Group" ++msgstr "è¿è¡Œç»„" ++ ++msgid "HTML template file to serve for stat host requests" ++msgstr "为统计主机HTML模æ¿æ–‡ä»¶" ++ ++msgid "HTML template file to serve when HTTP errors occur" ++msgstr "HTTP出错页é¢HTML模æ¿" ++ ++msgid "Header whitelist" ++msgstr "头白åå•" ++ ++msgid "" ++"List of IP addresses or ranges which are allowed to use the proxy server" ++msgstr "å…许访问代ç†æœåŠ¡å™¨çš„IP或IP段列表" ++ ++msgid "" ++"List of allowed ports for the CONNECT method. A single value \"0\" allows " ++"all ports" ++msgstr "å…许CONNECT方法连接的端å£åˆ—表,0代表所有端å£ã€‚" ++ ++msgid "Listen address" ++msgstr "æœåŠ¡åœ°å€" ++ ++msgid "Listen port" ++msgstr "æœåŠ¡ç«¯å£" ++ ++msgid "Log file" ++msgstr "日志文件" ++ ++msgid "Log file to use for dumping messages" ++msgstr "用于消æ¯è½¬å‚¨çš„日志文件" ++ ++msgid "Log level" ++msgstr "记录等级" ++ ++msgid "Logging verbosity of the Tinyproxy process" ++msgstr "冗长的Tinyproxy过程日志" ++ ++msgid "Max. clients" ++msgstr "最大客户端数" ++ ++msgid "Max. requests per server" ++msgstr "å•è¿›ç¨‹æœ€å¤§è¯·æ±‚æ•°" ++ ++msgid "Max. spare servers" ++msgstr "最多备用æœåŠ¡å™¨" ++ ++msgid "Maximum allowed number of concurrently connected clients" ++msgstr "å…许åŒæ—¶è¿žæŽ¥çš„最大客户端数é‡" ++ ++msgid "" ++"Maximum allowed number of requests per process. If it is exeeded, the " ++"process is restarted. Zero means unlimited." ++msgstr "å•ä¸ªè¿›ç¨‹å…许的最多请求数,超过这个值,进程将é‡å¯ã€‚0表示ä¸é™åˆ¶ã€‚" ++ ++msgid "Maximum number of prepared idle processes" ++msgstr "备用进程数的最大值" ++ ++msgid "Maximum number of seconds an inactive connection is held open" ++msgstr "活动连接ä¿æŒæ‰“开的最长秒数" ++ ++msgid "Min. spare servers" ++msgstr "最少备用æœåŠ¡å™¨" ++ ++msgid "Minimum number of prepared idle processes" ++msgstr "备用进程数的最å°å€¼" ++ ++msgid "Number of idle processes to start when launching Tinyproxy" ++msgstr "å¯åŠ¨Tinyproxy时开å¯çš„进程数" ++ ++msgid "Plaintext file with URLs or domains to filter. One entry per line" ++msgstr "用于过滤器的文本,包å«URL或者域å,æ¯è¡Œä¸€æ¡ã€‚" ++ ++msgid "Policy" ++msgstr "ç­–ç•¥" ++ ++msgid "Privacy settings" ++msgstr "策略设置" ++ ++msgid "Reject access" ++msgstr "æ‹’ç»è®¿é—®" ++ ++msgid "Server Settings" ++msgstr "æœåŠ¡å™¨è®¾ç½®" ++ ++msgid "Server limits" ++msgstr "æœåŠ¡å™¨é™åˆ¶" ++ ++msgid "" ++"Specifies HTTP header names which are allowed to pass-through, all others " ++"are discarded. Leave empty to disable header filtering" ++msgstr "指定HTTP报头å称å¯ç›´é€šçš„,其它将被丢弃。ä¿ç•™ç©ºï¼Œç¦ç”¨å¤´è¿‡æ»¤" ++ ++msgid "Specifies the HTTP port Tinyproxy is listening on for requests" ++msgstr "Tinyproxy正在侦å¬è¯·æ±‚的指定HTTP端å£" ++ ++msgid "Specifies the Tinyproxy hostname to use in the Via HTTP header" ++msgstr "通过HTTP头使用指定Tinyproxy主机å" ++ ++msgid "" ++"Specifies the address Tinyproxy binds to for outbound forwarded requests" ++msgstr "指定æœåŠ¡å™¨å‘外转å‘请求时所使用的地å€" ++ ++msgid "Specifies the addresses Tinyproxy is listening on for requests" ++msgstr "指定æœåŠ¡å™¨æŽ¥æ”¶ä»£ç†è¯·æ±‚所使用的地å€" ++ ++msgid "Specifies the group name the Tinyproxy process is running as" ++msgstr "指定Tinyproxy进程所属组" ++ ++msgid "" ++"Specifies the upstream proxy to use for accessing the target host. Format is " ++"address:port" ++msgstr "指定上级代ç†. æ ¼å¼ IP地å€:端å£" ++ ++msgid "Specifies the user name the Tinyproxy process is running as" ++msgstr "指定Tinyproxy进程所属用户" ++ ++msgid "Start spare servers" ++msgstr "å¯åŠ¨å¤‡ç”¨æœåŠ¡å™¨" ++ ++msgid "Statistics page" ++msgstr "统计页é¢" ++ ++msgid "Status" ++msgstr "状æ€" ++ ++msgid "Target host" ++msgstr "目标主机" ++ ++msgid "Tinyproxy" ++msgstr "Tinyproxy" ++ ++msgid "Tinyproxy Status" ++msgstr "Tinyproxy状æ€" ++ ++msgid "Tinyproxy is a small and fast non-caching HTTP(S)-Proxy" ++msgstr "Tinyproxy是一个轻é‡çº§æ— ç¼“存机制的高速HTTP(S)代ç†æœåŠ¡å™¨" ++ ++msgid "Upstream Proxies" ++msgstr "上级代ç†" ++ ++msgid "" ++"Upstream proxy rules define proxy servers to use when accessing certain IP " ++"addresses or domains." ++msgstr "当访问特定IP地å€æˆ–域å时,使用外出代ç†è§„则定义的代ç†æœåŠ¡å™¨ã€‚" ++ ++msgid "Use syslog" ++msgstr "使用系统日志æœåŠ¡" ++ ++msgid "User" ++msgstr "è¿è¡Œç”¨æˆ·" ++ ++msgid "Via hostname" ++msgstr "通过主机å" ++ ++msgid "Via proxy" ++msgstr "通过代ç†" ++ ++msgid "Writes log messages to syslog instead of a log file" ++msgstr "将日志写入系统日志以代替指定的日志文件" ++ ++msgid "X-Tinyproxy header" ++msgstr "X-Tinyproxy头" +diff --git a/feeds/luci/applications/luci-app-tinyproxy/po/zh-tw/tinyproxy.po b/feeds/luci/applications/luci-app-tinyproxy/po/zh-tw/tinyproxy.po +new file mode 100644 +index 0000000..849fcde +--- /dev/null ++++ b/feeds/luci/applications/luci-app-tinyproxy/po/zh-tw/tinyproxy.po +@@ -0,0 +1,254 @@ ++msgid "" ++msgstr "" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Last-Translator: Automatically generated\n" ++"Language-Team: none\n" ++"MIME-Version: 1.0\n" ++"Content-Transfer-Encoding: 8bit\n" ++ ++msgid "" ++"Via proxy routes requests to the given target via the specifed " ++"upstream proxy, Reject access disables any upstream proxy for the " ++"target" ++msgstr "" ++ ++msgid "" ++"Adds an \"X-Tinyproxy\" HTTP header with the client IP address to forwarded " ++"requests" ++msgstr "" ++ ++msgid "Allowed clients" ++msgstr "" ++ ++msgid "Allowed connect ports" ++msgstr "" ++ ++msgid "Bind address" ++msgstr "" ++ ++msgid "" ++"By default, basic POSIX expressions are used for filtering. Enable this to " ++"activate extended regular expressions" ++msgstr "" ++ ++msgid "" ++"By default, filter strings are treated as case-insensitive. Enable this to " ++"make the matching case-sensitive" ++msgstr "" ++ ++msgid "" ++"By default, filtering is done based on domain names. Enable this to match " ++"against URLs instead" ++msgstr "" ++ ++msgid "" ++"By default, the filter rules act as blacklist. Enable this option to only " ++"allow matched URLs or domain names" ++msgstr "" ++ ++msgid "" ++"Can be either an IP address or range, a domain name or \".\" for any host " ++"without domain" ++msgstr "" ++ ++msgid "Configuration" ++msgstr "" ++ ++msgid "Connection timeout" ++msgstr "" ++ ++msgid "Default deny" ++msgstr "" ++ ++msgid "Enable Tinyproxy server" ++msgstr "" ++ ++msgid "Error page" ++msgstr "" ++ ++msgid "Failed to retrieve statistics from url:" ++msgstr "" ++ ++msgid "Filter by RegExp" ++msgstr "" ++ ++msgid "Filter by URLs" ++msgstr "" ++ ++msgid "Filter case-sensitive" ++msgstr "" ++ ++msgid "Filter file" ++msgstr "" ++ ++msgid "Filtering and ACLs" ++msgstr "" ++ ++msgid "General settings" ++msgstr "" ++ ++msgid "Group" ++msgstr "" ++ ++msgid "HTML template file to serve for stat host requests" ++msgstr "" ++ ++msgid "HTML template file to serve when HTTP errors occur" ++msgstr "" ++ ++msgid "Header whitelist" ++msgstr "" ++ ++msgid "" ++"List of IP addresses or ranges which are allowed to use the proxy server" ++msgstr "" ++ ++msgid "" ++"List of allowed ports for the CONNECT method. A single value \"0\" allows " ++"all ports" ++msgstr "" ++ ++msgid "Listen address" ++msgstr "" ++ ++msgid "Listen port" ++msgstr "" ++ ++msgid "Log file" ++msgstr "" ++ ++msgid "Log file to use for dumping messages" ++msgstr "" ++ ++msgid "Log level" ++msgstr "" ++ ++msgid "Logging verbosity of the Tinyproxy process" ++msgstr "" ++ ++msgid "Max. clients" ++msgstr "" ++ ++msgid "Max. requests per server" ++msgstr "" ++ ++msgid "Max. spare servers" ++msgstr "" ++ ++msgid "Maximum allowed number of concurrently connected clients" ++msgstr "" ++ ++msgid "" ++"Maximum allowed number of requests per process. If it is exeeded, the " ++"process is restarted. Zero means unlimited." ++msgstr "" ++ ++msgid "Maximum number of prepared idle processes" ++msgstr "" ++ ++msgid "Maximum number of seconds an inactive connection is held open" ++msgstr "" ++ ++msgid "Min. spare servers" ++msgstr "" ++ ++msgid "Minimum number of prepared idle processes" ++msgstr "" ++ ++msgid "Number of idle processes to start when launching Tinyproxy" ++msgstr "" ++ ++msgid "Plaintext file with URLs or domains to filter. One entry per line" ++msgstr "" ++ ++msgid "Policy" ++msgstr "" ++ ++msgid "Privacy settings" ++msgstr "" ++ ++msgid "Reject access" ++msgstr "" ++ ++msgid "Server Settings" ++msgstr "" ++ ++msgid "Server limits" ++msgstr "" ++ ++msgid "" ++"Specifies HTTP header names which are allowed to pass-through, all others " ++"are discarded. Leave empty to disable header filtering" ++msgstr "" ++ ++msgid "Specifies the HTTP port Tinyproxy is listening on for requests" ++msgstr "" ++ ++msgid "Specifies the Tinyproxy hostname to use in the Via HTTP header" ++msgstr "" ++ ++msgid "" ++"Specifies the address Tinyproxy binds to for outbound forwarded requests" ++msgstr "" ++ ++msgid "Specifies the addresses Tinyproxy is listening on for requests" ++msgstr "" ++ ++msgid "Specifies the group name the Tinyproxy process is running as" ++msgstr "" ++ ++msgid "" ++"Specifies the upstream proxy to use for accessing the target host. Format is " ++"address:port" ++msgstr "" ++ ++msgid "Specifies the user name the Tinyproxy process is running as" ++msgstr "" ++ ++msgid "Start spare servers" ++msgstr "" ++ ++msgid "Statistics page" ++msgstr "" ++ ++msgid "Status" ++msgstr "" ++ ++msgid "Target host" ++msgstr "" ++ ++msgid "Tinyproxy" ++msgstr "" ++ ++msgid "Tinyproxy Status" ++msgstr "" ++ ++msgid "Tinyproxy is a small and fast non-caching HTTP(S)-Proxy" ++msgstr "" ++ ++msgid "Upstream Proxies" ++msgstr "" ++ ++msgid "" ++"Upstream proxy rules define proxy servers to use when accessing certain IP " ++"addresses or domains." ++msgstr "" ++ ++msgid "Use syslog" ++msgstr "" ++ ++msgid "User" ++msgstr "" ++ ++msgid "Via hostname" ++msgstr "" ++ ++msgid "Via proxy" ++msgstr "" ++ ++msgid "Writes log messages to syslog instead of a log file" ++msgstr "" ++ ++msgid "X-Tinyproxy header" ++msgstr "" +diff --git a/feeds/luci/applications/luci-app-transmission/Makefile b/feeds/luci/applications/luci-app-transmission/Makefile +new file mode 100644 +index 0000000..45175b7 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-transmission/Makefile +@@ -0,0 +1,14 @@ ++# ++# Copyright (C) 2008-2014 The LuCI Team ++# ++# This is free software, licensed under the Apache License, Version 2.0 . ++# ++ ++include $(TOPDIR)/rules.mk ++ ++LUCI_TITLE:=LuCI Support for Transmission ++LUCI_DEPENDS:=+transmission-daemon ++ ++include ../../luci.mk ++ ++# call BuildPackage - OpenWrt buildroot signature +diff --git a/feeds/luci/applications/luci-app-transmission/luasrc/controller/transmission.lua b/feeds/luci/applications/luci-app-transmission/luasrc/controller/transmission.lua +new file mode 100644 +index 0000000..b54b92b +--- /dev/null ++++ b/feeds/luci/applications/luci-app-transmission/luasrc/controller/transmission.lua +@@ -0,0 +1,14 @@ ++-- Copyright 2012 Gabor Varga ++-- Licensed to the public under the Apache License 2.0. ++ ++module("luci.controller.transmission", package.seeall) ++ ++function index() ++ if not nixio.fs.access("/etc/config/transmission") then ++ return ++ end ++ ++ local page = entry({"admin", "services", "transmission"}, cbi("transmission"), _("Transmission")) ++ page.dependent = true ++ ++end +diff --git a/feeds/luci/applications/luci-app-transmission/luasrc/model/cbi/transmission.lua b/feeds/luci/applications/luci-app-transmission/luasrc/model/cbi/transmission.lua +new file mode 100644 +index 0000000..ec19f47 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-transmission/luasrc/model/cbi/transmission.lua +@@ -0,0 +1,220 @@ ++-- Copyright 2012 Gabor Varga ++-- Licensed to the public under the Apache License 2.0. ++ ++require("luci.sys") ++require("luci.util") ++require("luci.model.ipkg") ++ ++local uci = require "luci.model.uci".cursor() ++local trport = uci:get_first("transmission", "transmission", "rpc_port") or 9091 ++local running = (luci.sys.call("pidof transmission-daemon > /dev/null") == 0) ++local webinstalled = luci.model.ipkg.installed("transmission-web") ++local button = "" ++if running and webinstalled then ++ button = "      " ++end ++ ++m = Map("transmission", "Transmission", translate("Transmission daemon is a simple bittorrent client, here you can configure the settings.") .. button) ++ ++s=m:section(TypedSection, "transmission", translate("Global settings")) ++s.addremove=false ++s.anonymous=true ++ ++enable=s:option(Flag, "enabled", translate("Enabled")) ++enable.rmempty=false ++config_dir=s:option(Value, "config_dir", translate("Config file directory")) ++user=s:option(ListValue, "user", translate("Run daemon as user")) ++local p_user ++for _, p_user in luci.util.vspairs(luci.util.split(luci.sys.exec("cat /etc/passwd | cut -f 1 -d :"))) do ++ user:value(p_user) ++end ++cache_size_mb=s:option(Value, "cache_size_mb", translate("Cache size in MB")) ++ ++bandwidth=m:section(TypedSection, "transmission", translate("Bandwidth settings")) ++bandwidth.anonymous=true ++alt_speed_enabled=bandwidth:option(Flag, "alt_speed_enabled", translate("Alternative speed enabled")) ++alt_speed_enabled.enabled="true" ++alt_speed_enabled.disabled="false" ++alt_speed_down=bandwidth:option(Value, "alt_speed_down", translate("Alternative download speed"), "KB/s") ++alt_speed_down:depends("alt_speed_enabled", "true") ++alt_speed_up=bandwidth:option(Value, "alt_speed_up", translate("Alternative upload speed"), "KB/s") ++alt_speed_up:depends("alt_speed_enabled", "true") ++speed_limit_down_enabled=bandwidth:option(Flag, "speed_limit_down_enabled", translate("Speed limit down enabled")) ++speed_limit_down_enabled.enabled="true" ++speed_limit_down_enabled.disabled="false" ++speed_limit_down=bandwidth:option(Value, "speed_limit_down", translate("Speed limit down"), "KB/s") ++speed_limit_down:depends("speed_limit_down_enabled", "true") ++speed_limit_up_enabled=bandwidth:option(Flag, "speed_limit_up_enabled", translate("Speed limit up enabled")) ++speed_limit_up_enabled.enabled="true" ++speed_limit_up_enabled.disabled="false" ++speed_limit_up=bandwidth:option(Value, "speed_limit_up", translate("Speed limit up"), "KB/s") ++speed_limit_up:depends("speed_limit_up_enabled", "true") ++upload_slots_per_torrent=bandwidth:option(Value, "upload_slots_per_torrent", translate("Upload slots per torrent")) ++ ++blocklists=m:section(TypedSection, "transmission", translate("Blocklists")) ++blocklists.anonymous=true ++blocklist_enabled=blocklists:option(Flag, "blocklist_enabled", translate("Block list enabled")) ++blocklist_enabled.enabled="true" ++blocklist_enabled.disabled="false" ++blocklist_url=blocklists:option(Value, "blocklist_url", translate("Blocklist URL")) ++blocklist_url:depends("blocklist_enabled", "true") ++ ++fileslocations=m:section(TypedSection, "transmission", translate("Files and Locations")) ++fileslocations.anonymous=true ++download_dir=fileslocations:option(Value, "download_dir", translate("Download directory")) ++incomplete_dir_enabled=fileslocations:option(Flag, "incomplete_dir_enabled", translate("Incomplete directory enabled")) ++incomplete_dir_enabled.enabled="true" ++incomplete_dir_enabled.disabled="false" ++incomplete_dir=fileslocations:option(Value, "incomplete_dir", translate("Incomplete directory")) ++incomplete_dir:depends("incomplete_dir_enabled", "true") ++preallocation=fileslocations:option(ListValue, "preallocation", translate("preallocation")) ++preallocation:value("0", translate("Off")) ++preallocation:value("1", translate("Fast")) ++preallocation:value("2", translate("Full")) ++prefetch_enabled=fileslocations:option(Flag, "prefetch_enabled", translate("Prefetch enabled")) ++rename_partial_files=fileslocations:option(Flag, "rename_partial_files", translate("Rename partial files")) ++rename_partial_files.enableid="true" ++rename_partial_files.disabled="false" ++start_added_torrents=fileslocations:option(Flag, "start_added_torrents", translate("Automatically start added torrents")) ++start_added_torrents.enabled="true" ++start_added_torrents.disabled="false" ++trash_original_torrent_files=fileslocations:option(Flag, "trash_original_torrent_files", translate("Trash original torrent files")) ++trash_original_torrent_files.enabled="true" ++trash_original_torrent_files.disabled="false" ++umask=fileslocations:option(Value, "umask", "umask") ++watch_dir_enabled=fileslocations:option(Flag, "watch_dir_enabled", translate("Enable watch directory")) ++watch_dir_enabled.enabled="true" ++watch_dir_enabled.disabled="false" ++watch_dir=fileslocations:option(Value, "watch_dir", translate("Watch directory")) ++watch_dir:depends("watch_dir_enabled", "true") ++ ++misc=m:section(TypedSection, "transmission", translate("Miscellaneous")) ++misc.anonymous=true ++dht_enabled=misc:option(Flag, "dht_enabled", translate("DHT enabled")) ++dht_enabled.enabled="true" ++dht_enabled.disabled="false" ++encryption=misc:option(ListValue, "encryption", translate("Encryption")) ++encryption:value("0", translate("Off")) ++encryption:value("1", translate("Preferred")) ++encryption:value("2", translate("Forced")) ++lazy_bitfield_enabled=misc:option(Flag, "lazy_bitfield_enabled", translate("Lazy bitfield enabled")) ++lazy_bitfield_enabled.enabled="true" ++lazy_bitfield_enabled.disabled="false" ++lpd_enabled=misc:option(Flag, "lpd_enabled", translate("LPD enabled")) ++lpd_enabled.enabled="true" ++lpd_enabled.disabled="false" ++message_level=misc:option(ListValue, "message_level", translate("Message level")) ++message_level:value("0", translate("None")) ++message_level:value("1", translate("Error")) ++message_level:value("2", translate("Info")) ++message_level:value("3", translate("Debug")) ++pex_enabled=misc:option(Flag, "pex_enabled", translate("PEX enabled")) ++pex_enabled.enabled="true" ++pex_enabled.disabled="false" ++script_torrent_done_enabled=misc:option(Flag, "script_torrent_done_enabled", translate("Script torrent done enabled")) ++script_torrent_done_enabled.enabled="true" ++script_torrent_done_enabled.disabled="false" ++script_torrent_done_filename=misc:option(Value, "script_torrent_done_filename", translate("Script torrent done filename")) ++script_torrent_done_filename:depends("script_torrent_done_enabled", "true") ++idle_seeding_limit_enabled=misc:option(Flag, "idle_seeding_limit_enabled", translate("Idle seeding limit enabled")) ++idle_seeding_limit_enabled.enabled="true" ++idle_seeding_limit_enabled.disabled="false" ++idle_seeding_limit=misc:option(Value, "idle_seeding_limit", translate("Idle seeding limit")) ++idle_seeding_limit:depends("idle_seeding_limit_enabled", "true") ++utp_enabled=misc:option(Flag, "utp_enabled", translate("uTP enabled")) ++utp_enabled.enabled="true" ++utp_enabled.disabled="false" ++ ++peers=m:section(TypedSection, "transmission", translate("Peer settings")) ++peers.anonymous=true ++bind_address_ipv4=peers:option(Value, "bind_address_ipv4", translate("Binding address IPv4")) ++bind_address_ipv4.default="0.0.0.0" ++bind_address_ipv6=peers:option(Value, "bind_address_ipv6", translate("Binding address IPv6")) ++bind_address_ipv6.default="::" ++peer_congestion_algorithm=peers:option(Value, "peer_congestion_algorithm", translate("Peer congestion algorithm")) ++peer_limit_global=peers:option(Value, "peer_limit_global", translate("Global peer limit")) ++peer_limit_per_torrent=peers:option(Value, "peer_limit_per_torrent", translate("Peer limit per torrent")) ++peer_socket_tos=peers:option(Value, "peer_socket_tos", translate("Peer socket tos")) ++ ++peerport=m:section(TypedSection, "transmission", translate("Peer Port settings")) ++peerport.anonymous=true ++peer_port=peerport:option(Value, "peer_port", translate("Peer port")) ++peer_port_random_on_start=peerport:option(Flag, "peer_port_random_on_start", translate("Peer port random on start")) ++peer_port_random_on_start.enabled="true" ++peer_port_random_on_start.disabled="false" ++peer_port_random_high=peerport:option(Value, "peer_port_random_high", translate("Peer port random high")) ++peer_port_random_high:depends("peer_port_random_on_start", "true") ++peer_port_random_low=peerport:option(Value, "peer_port_random_low", translate("Peer port random low")) ++peer_port_random_low:depends("peer_port_random_on_start", "true") ++port_forwarding_enabled=peerport:option(Flag, "port_forwarding_enabled", translate("Port forwarding enabled")) ++port_forwarding_enabled.enabled="true" ++port_forwarding_enabled.disabled="false" ++ ++rpc=m:section(TypedSection, "transmission", translate("RPC settings")) ++rpc.anonymous=true ++rpc_enabled=rpc:option(Flag, "rpc_enabled", translate("RPC enabled")) ++rpc_enabled.enabled="true" ++rpc_enabled.disabled="false" ++rpc_port=rpc:option(Value, "rpc_port", translate("RPC port")) ++rpc_port:depends("rpc_enabled", "true") ++rpc_bind_address=rpc:option(Value, "rpc_bind_address", translate("RPC bind address")) ++rpc_bind_address:depends("rpc_enabled", "true") ++rpc_url=rpc:option(Value, "rpc_url", translate("RPC URL")) ++rpc_url:depends("rpc_enabled", "true") ++rpc_whitelist_enabled=rpc:option(Flag, "rpc_whitelist_enabled", translate("RPC whitelist enabled")) ++rpc_whitelist_enabled.enabled="true" ++rpc_whitelist_enabled.disabled="false" ++rpc_whitelist_enabled:depends("rpc_enabled", "true") ++rpc_whitelist=rpc:option(Value, "rpc_whitelist", translate("RPC whitelist")) ++rpc_whitelist:depends("rpc_whitelist_enabled", "true") ++rpc_authentication_required=rpc:option(Flag, "rpc_authentication_required", translate("RPC authentication required")) ++rpc_authentication_required.enabled="true" ++rpc_authentication_required.disabled="false" ++rpc_authentication_required:depends("rpc_enabled", "true") ++rpc_username=rpc:option(Value, "rpc_username", translate("RPC username")) ++rpc_username:depends("rpc_authentication_required", "true") ++rpc_password=rpc:option(Value, "rpc_password", translate("RPC password")) ++rpc_password:depends("rpc_authentication_required", "true") ++rpc_password.password = true ++ ++scheduling=m:section(TypedSection, "transmission", translate("Scheduling")) ++scheduling.anonymous=true ++alt_speed_time_enabled=scheduling:option(Flag, "alt_speed_time_enabled", translate("Alternative speed timing enabled")) ++alt_speed_time_enabled.enabled="true" ++alt_speed_time_enabled.disabled="false" ++alt_speed_time_enabled.default="false" ++alt_speed_time_enabled:depends("alt_speed_enabled", "true") ++alt_speed_time_day=scheduling:option(Value, "alt_speed_time_day", translate("Alternative speed time day"), translate("Number/bitfield. Start with 0, then for each day you want the scheduler enabled, add a value. For Sunday - 1, Monday - 2, Tuesday - 4, Wednesday - 8, Thursday - 16, Friday - 32, Saturday - 64")) ++alt_speed_time_day:depends("alt_speed_time_enabled", "true") ++alt_speed_time_begin=scheduling:option(Value, "alt_speed_time_begin", translate("Alternative speed time begin"), translate("in minutes from midnight")) ++alt_speed_time_begin:depends("alt_speed_time_enabled", "true") ++alt_speed_time_end=scheduling:option(Value, "alt_speed_time_end", translate("Alternative speed time end"), translate("in minutes from midnight")) ++alt_speed_time_end:depends("alt_speed_time_enabled", "true") ++ratio_limit_enabled=scheduling:option(Flag, "ratio_limit_enabled", translate("Ratio limit enabled")) ++ratio_limit_enabled.enabled="true" ++ratio_limit_enabled.disabled="false" ++ratio_limit=scheduling:option(Value, "ratio_limit", translate("Ratio limit")) ++ratio_limit:depends("ratio_limit_enabled", "true") ++ ++queueing=m:section(TypedSection, "transmission", translate("Queueing")) ++queueing.anonymous=true ++download_queue_enabled=queueing:option(Flag, "download_queue_enabled", translate("Download queue enabled")) ++download_queue_enabled.enabled="true" ++download_queue_enabled.disabled="false" ++download_queue_size=queueing:option(Value, "download_queue_size", translate("Download queue size")) ++download_queue_size:depends("download_queue_enabled", "true") ++queue_stalled_enabled=queueing:option(Flag, "queue_stalled_enabled", translate("Queue stalled enabled")) ++queue_stalled_enabled.enabled="true" ++queue_stalled_enabled.disabled="false" ++queue_stalled_minutes=queueing:option(Value, "queue_stalled_minutes", translate("Queue stalled minutes")) ++queue_stalled_minutes:depends("queue_stalled_enabled", "true") ++seed_queue_enabled=queueing:option(Flag, "seed_queue_enabled", translate("Seed queue enabled")) ++seed_queue_enabled.enabled="true" ++seed_queue_enabled.disabled="false" ++seed_queue_size=queueing:option(Value, "seed_queue_size", translate("Seed queue size")) ++seed_queue_size:depends("seed_queue_enabled", "true") ++scrape_paused_torrents_enabled=queueing:option(Flag, "scrape_paused_torrents_enabled", translate("Scrape paused torrents enabled")) ++scrape_paused_torrents_enabled.enabled="true" ++scrape_paused_torrents_enabled.disabled="false" ++ ++return m +diff --git a/feeds/luci/applications/luci-app-transmission/po/ca/transmission.po b/feeds/luci/applications/luci-app-transmission/po/ca/transmission.po +new file mode 100644 +index 0000000..2498393 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-transmission/po/ca/transmission.po +@@ -0,0 +1,297 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Report-Msgid-Bugs-To: \n" ++"POT-Creation-Date: 2014-06-01 23:27+0200\n" ++"PO-Revision-Date: 2014-07-17 23:50+0200\n" ++"Last-Translator: Alex \n" ++"Language-Team: LANGUAGE \n" ++"Language: ca\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n != 1);\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "Alternative download speed" ++msgstr "Velocitat de baixada alternativa" ++ ++msgid "Alternative speed enabled" ++msgstr "Velocitat alternativa habilitada" ++ ++msgid "Alternative speed time begin" ++msgstr "Hora inicial de velocitat alternativa" ++ ++msgid "Alternative speed time day" ++msgstr "Dia de velocitat alternativa" ++ ++msgid "Alternative speed time end" ++msgstr "Hora final de velocitat alternativa" ++ ++msgid "Alternative speed timing enabled" ++msgstr "Temporització de velocitat alternativa habilitada" ++ ++msgid "Alternative upload speed" ++msgstr "Velocitat de pujada alternativa" ++ ++msgid "Automatically start added torrents" ++msgstr "Comença automàticament els torrents afegits" ++ ++msgid "Bandwidth settings" ++msgstr "Ajusts d'amplada de banda" ++ ++msgid "Binding address IPv4" ++msgstr "" ++ ++msgid "Binding address IPv6" ++msgstr "" ++ ++msgid "Block list enabled" ++msgstr "Llista de bloqueig habilitada" ++ ++msgid "Blocklist URL" ++msgstr "" ++ ++msgid "Blocklists" ++msgstr "Llistes de bloqueig" ++ ++msgid "Cache size in MB" ++msgstr "" ++ ++msgid "Config file directory" ++msgstr "Directori de fitxer de configuració" ++ ++msgid "DHT enabled" ++msgstr "DHT habilitat" ++ ++msgid "Debug" ++msgstr "Depuració" ++ ++msgid "Download directory" ++msgstr "Directori de baixada" ++ ++msgid "Download queue enabled" ++msgstr "Cua de baixada habilitada" ++ ++msgid "Download queue size" ++msgstr "Mida de cua de baixada" ++ ++msgid "Enable watch directory" ++msgstr "" ++ ++msgid "Enabled" ++msgstr "Habilitat" ++ ++msgid "Encryption" ++msgstr "Xifració" ++ ++msgid "Error" ++msgstr "Error" ++ ++msgid "Fast" ++msgstr "Ràpid" ++ ++msgid "Files and Locations" ++msgstr "Fitxers i ubicacions" ++ ++msgid "Forced" ++msgstr "Forçat" ++ ++msgid "Full" ++msgstr "Ple" ++ ++msgid "Global peer limit" ++msgstr "" ++ ++msgid "Global settings" ++msgstr "Ajusts globals" ++ ++msgid "Idle seeding limit" ++msgstr "" ++ ++msgid "Idle seeding limit enabled" ++msgstr "" ++ ++msgid "Incomplete directory" ++msgstr "Directori incomplet" ++ ++msgid "Incomplete directory enabled" ++msgstr "Directori incomplet habilitat" ++ ++msgid "Info" ++msgstr "Informació" ++ ++msgid "LPD enabled" ++msgstr "LPD habilitat" ++ ++msgid "Lazy bitfield enabled" ++msgstr "" ++ ++msgid "Message level" ++msgstr "" ++ ++msgid "Miscellaneous" ++msgstr "Miscel·lani" ++ ++msgid "None" ++msgstr "Cap" ++ ++msgid "" ++"Number/bitfield. Start with 0, then for each day you want the scheduler " ++"enabled, add a value. For Sunday - 1, Monday - 2, Tuesday - 4, Wednesday - " ++"8, Thursday - 16, Friday - 32, Saturday - 64" ++msgstr "" ++ ++msgid "Off" ++msgstr "Desactivat" ++ ++msgid "Open Web Interface" ++msgstr "" ++ ++msgid "PEX enabled" ++msgstr "PEX habilitat" ++ ++msgid "Peer Port settings" ++msgstr "" ++ ++msgid "Peer congestion algorithm" ++msgstr "" ++ ++msgid "Peer limit per torrent" ++msgstr "" ++ ++msgid "Peer port" ++msgstr "" ++ ++msgid "Peer port random high" ++msgstr "" ++ ++msgid "Peer port random low" ++msgstr "" ++ ++msgid "Peer port random on start" ++msgstr "" ++ ++msgid "Peer settings" ++msgstr "" ++ ++msgid "Peer socket tos" ++msgstr "" ++ ++msgid "Port forwarding enabled" ++msgstr "" ++ ++msgid "Preferred" ++msgstr "Preferit" ++ ++msgid "Prefetch enabled" ++msgstr "Precarrega habilitada" ++ ++msgid "Queue stalled enabled" ++msgstr "" ++ ++msgid "Queue stalled minutes" ++msgstr "" ++ ++msgid "Queueing" ++msgstr "" ++ ++msgid "RPC URL" ++msgstr "" ++ ++msgid "RPC authentication required" ++msgstr "Autenticació RPC requerida" ++ ++msgid "RPC bind address" ++msgstr "" ++ ++msgid "RPC enabled" ++msgstr "RPC habilitat" ++ ++msgid "RPC password" ++msgstr "Contrasenya RPC" ++ ++msgid "RPC port" ++msgstr "Port RPC" ++ ++msgid "RPC settings" ++msgstr "Ajusts RPC" ++ ++msgid "RPC username" ++msgstr "Nom d'usuari RPC" ++ ++msgid "RPC whitelist" ++msgstr "Llista blanca RPC" ++ ++msgid "RPC whitelist enabled" ++msgstr "Llista blanca RPC habilitada" ++ ++msgid "Ratio limit" ++msgstr "Límit de ràtio" ++ ++msgid "Ratio limit enabled" ++msgstr "Límit de ràtio habilitat" ++ ++msgid "Rename partial files" ++msgstr "" ++ ++msgid "Run daemon as user" ++msgstr "Executa el dimoni com l'usuari" ++ ++msgid "Scheduling" ++msgstr "Programació" ++ ++msgid "Scrape paused torrents enabled" ++msgstr "" ++ ++msgid "Script torrent done enabled" ++msgstr "" ++ ++msgid "Script torrent done filename" ++msgstr "" ++ ++msgid "Seed queue enabled" ++msgstr "" ++ ++msgid "Seed queue size" ++msgstr "" ++ ++msgid "Speed limit down" ++msgstr "" ++ ++msgid "Speed limit down enabled" ++msgstr "" ++ ++msgid "Speed limit up" ++msgstr "" ++ ++msgid "Speed limit up enabled" ++msgstr "" ++ ++msgid "Transmission" ++msgstr "Transmission" ++ ++msgid "" ++"Transmission daemon is a simple bittorrent client, here you can configure " ++"the settings." ++msgstr "" ++"El dimoni Transmission és un client de bittorrent senzill, aquí podeu " ++"configurar els ajusts." ++ ++msgid "Trash original torrent files" ++msgstr "Suprimeix els fitxers de torrent originals" ++ ++msgid "Upload slots per torrent" ++msgstr "" ++ ++msgid "Watch directory" ++msgstr "Directori que vigilar" ++ ++msgid "in minutes from midnight" ++msgstr "en minuts des de la mitjanit" ++ ++msgid "preallocation" ++msgstr "preassignació" ++ ++msgid "uTP enabled" ++msgstr "uTP habilitat" +diff --git a/feeds/luci/applications/luci-app-transmission/po/cs/transmission.po b/feeds/luci/applications/luci-app-transmission/po/cs/transmission.po +new file mode 100644 +index 0000000..b6166ec +--- /dev/null ++++ b/feeds/luci/applications/luci-app-transmission/po/cs/transmission.po +@@ -0,0 +1,295 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"PO-Revision-Date: 2014-06-06 17:54+0200\n" ++"Last-Translator: koli \n" ++"Language-Team: none\n" ++"Language: cs\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "Alternative download speed" ++msgstr "Alternativní rychlost download" ++ ++msgid "Alternative speed enabled" ++msgstr "Povolit alternativní rychlost" ++ ++msgid "Alternative speed time begin" ++msgstr "ZaÄátek doby alternativní rychlosti" ++ ++msgid "Alternative speed time day" ++msgstr "" ++ ++msgid "Alternative speed time end" ++msgstr "Konec doby alternativní rychlosti" ++ ++msgid "Alternative speed timing enabled" ++msgstr "" ++ ++msgid "Alternative upload speed" ++msgstr "Alternativní rychlost uploadu" ++ ++msgid "Automatically start added torrents" ++msgstr "Automaticky zaÄít stahovat nové torrenty" ++ ++msgid "Bandwidth settings" ++msgstr "Nastavení pÅ™enosové rychlosti" ++ ++msgid "Binding address IPv4" ++msgstr "Svázání s IPv4 adresou" ++ ++msgid "Binding address IPv6" ++msgstr "Svázání s IPv6 adresou" ++ ++msgid "Block list enabled" ++msgstr "Povolit Äernou listinu" ++ ++msgid "Blocklist URL" ++msgstr "URL Äerné listiny" ++ ++msgid "Blocklists" ++msgstr "ÄŒerné listiny" ++ ++msgid "Cache size in MB" ++msgstr "Velikost mezipamÄ›ti v MB" ++ ++msgid "Config file directory" ++msgstr "Složka pro uložení konfiguraÄního souboru" ++ ++msgid "DHT enabled" ++msgstr "Povolit DHT" ++ ++msgid "Debug" ++msgstr "Debug" ++ ++msgid "Download directory" ++msgstr "Adresář pro stahované" ++ ++msgid "Download queue enabled" ++msgstr "Povolit stahovací frontu" ++ ++msgid "Download queue size" ++msgstr "Velikost stahovací fronty" ++ ++msgid "Enable watch directory" ++msgstr "Povolit sledování složky" ++ ++msgid "Enabled" ++msgstr "Povolit" ++ ++msgid "Encryption" ++msgstr "Å ifrování" ++ ++msgid "Error" ++msgstr "Chyba" ++ ++msgid "Fast" ++msgstr "Rychlá" ++ ++msgid "Files and Locations" ++msgstr "Soubory a umístÄ›ní" ++ ++msgid "Forced" ++msgstr "Vynucené" ++ ++msgid "Full" ++msgstr "Plná" ++ ++msgid "Global peer limit" ++msgstr "Globální peer limit" ++ ++msgid "Global settings" ++msgstr "Globální nastavení" ++ ++msgid "Idle seeding limit" ++msgstr "" ++ ++msgid "Idle seeding limit enabled" ++msgstr "" ++ ++msgid "Incomplete directory" ++msgstr "Složka pro nedokonÄená stahování" ++ ++msgid "Incomplete directory enabled" ++msgstr "Povolit složku pro nedokonÄená stahování" ++ ++msgid "Info" ++msgstr "Info" ++ ++msgid "LPD enabled" ++msgstr "Povolit LPD" ++ ++msgid "Lazy bitfield enabled" ++msgstr "Povolit lazy bitfield" ++ ++msgid "Message level" ++msgstr "" ++ ++msgid "Miscellaneous" ++msgstr "Ostatní" ++ ++msgid "None" ++msgstr "Žádný" ++ ++msgid "" ++"Number/bitfield. Start with 0, then for each day you want the scheduler " ++"enabled, add a value. For Sunday - 1, Monday - 2, Tuesday - 4, Wednesday - " ++"8, Thursday - 16, Friday - 32, Saturday - 64" ++msgstr "" ++ ++msgid "Off" ++msgstr "Vypnuta" ++ ++msgid "Open Web Interface" ++msgstr "" ++ ++msgid "PEX enabled" ++msgstr "Povolit PEX" ++ ++msgid "Peer Port settings" ++msgstr "Nastavení peer portu" ++ ++msgid "Peer congestion algorithm" ++msgstr "" ++ ++msgid "Peer limit per torrent" ++msgstr "Peer limit na torrent" ++ ++msgid "Peer port" ++msgstr "Peer port" ++ ++msgid "Peer port random high" ++msgstr "Peer port náhodný nejvyšší" ++ ++msgid "Peer port random low" ++msgstr "Peer port náhodný nejnižší" ++ ++msgid "Peer port random on start" ++msgstr "Náhodný peer port pÅ™i startu" ++ ++msgid "Peer settings" ++msgstr "Nastavení peer" ++ ++msgid "Peer socket tos" ++msgstr "" ++ ++msgid "Port forwarding enabled" ++msgstr "Povolit port forwarding" ++ ++msgid "Preferred" ++msgstr "Preferované" ++ ++msgid "Prefetch enabled" ++msgstr "Povolit pÅ™ednaÄítání" ++ ++msgid "Queue stalled enabled" ++msgstr "" ++ ++msgid "Queue stalled minutes" ++msgstr "" ++ ++msgid "Queueing" ++msgstr "" ++ ++msgid "RPC URL" ++msgstr "RPC URL" ++ ++msgid "RPC authentication required" ++msgstr "RPC ověřování vyžadováno" ++ ++msgid "RPC bind address" ++msgstr "" ++ ++msgid "RPC enabled" ++msgstr "Povolit RPC" ++ ++msgid "RPC password" ++msgstr "RPC heslo" ++ ++msgid "RPC port" ++msgstr "RPC port" ++ ++msgid "RPC settings" ++msgstr "Nastavení RPC" ++ ++msgid "RPC username" ++msgstr "Uživatelské jméno RPC" ++ ++msgid "RPC whitelist" ++msgstr "RPC whitelist" ++ ++msgid "RPC whitelist enabled" ++msgstr "Povolit RPC whitelist" ++ ++msgid "Ratio limit" ++msgstr "Ratio limit" ++ ++msgid "Ratio limit enabled" ++msgstr "Povolit ratio limit" ++ ++msgid "Rename partial files" ++msgstr "PÅ™ejmenovat dílÄí soubory" ++ ++msgid "Run daemon as user" ++msgstr "Spustit daemona jako uživatel" ++ ++msgid "Scheduling" ++msgstr "Plánování" ++ ++msgid "Scrape paused torrents enabled" ++msgstr "" ++ ++msgid "Script torrent done enabled" ++msgstr "" ++ ++msgid "Script torrent done filename" ++msgstr "" ++ ++msgid "Seed queue enabled" ++msgstr "Povolit seed frontu" ++ ++msgid "Seed queue size" ++msgstr "Velikost seed fronty" ++ ++msgid "Speed limit down" ++msgstr "Rychlostní limit downloadu" ++ ++msgid "Speed limit down enabled" ++msgstr "Povolit rychlostní limit downloadu" ++ ++msgid "Speed limit up" ++msgstr "Rychlostní limit uploadu" ++ ++msgid "Speed limit up enabled" ++msgstr "Povolit rychlostní limit uploadu" ++ ++msgid "Transmission" ++msgstr "Transmission" ++ ++msgid "" ++"Transmission daemon is a simple bittorrent client, here you can configure " ++"the settings." ++msgstr "" ++"Transmission daemon je jednoduchý BitTorrent klient, zde můžete provést jeho " ++"nastavení." ++ ++msgid "Trash original torrent files" ++msgstr "Odstranit původní torrent soubory" ++ ++msgid "Upload slots per torrent" ++msgstr "Upload sloty na torrent" ++ ++msgid "Watch directory" ++msgstr "" ++ ++msgid "in minutes from midnight" ++msgstr "v minutách od půlnoci" ++ ++msgid "preallocation" ++msgstr "prealokace" ++ ++msgid "uTP enabled" ++msgstr "Povolit uTP" +diff --git a/feeds/luci/applications/luci-app-transmission/po/de/transmission.po b/feeds/luci/applications/luci-app-transmission/po/de/transmission.po +new file mode 100644 +index 0000000..4b665ff +--- /dev/null ++++ b/feeds/luci/applications/luci-app-transmission/po/de/transmission.po +@@ -0,0 +1,300 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Report-Msgid-Bugs-To: \n" ++"POT-Creation-Date: 2012-07-17 15:08+0200\n" ++"PO-Revision-Date: 2013-01-28 23:03+0200\n" ++"Last-Translator: DAC324 \n" ++"Language-Team: LANGUAGE \n" ++"Language: de\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n != 1);\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "Alternative download speed" ++msgstr "Alternative Download-Geschwindigkeit" ++ ++msgid "Alternative speed enabled" ++msgstr "Alternative Geschwindigkeit aktivieren" ++ ++msgid "Alternative speed time begin" ++msgstr "Zeit für Beginn der alternativen Geschwindigkeit" ++ ++msgid "Alternative speed time day" ++msgstr "Tag für alternative Geschwindigkeit" ++ ++msgid "Alternative speed time end" ++msgstr "Zeit für Ende der alternativen Geschwindigkeit" ++ ++msgid "Alternative speed timing enabled" ++msgstr "Zeiteinstellung für alternative Geschwindigkeit eingeschaltet" ++ ++msgid "Alternative upload speed" ++msgstr "Alternative Upload-Geschwindigkeit" ++ ++msgid "Automatically start added torrents" ++msgstr "Hinzugefügte Torrents automatisch starten" ++ ++msgid "Bandwidth settings" ++msgstr "Bandbreiten-Einstellungen" ++ ++msgid "Binding address IPv4" ++msgstr "IPv4-Adressbindung" ++ ++msgid "Binding address IPv6" ++msgstr "IPv6-Adressbindung" ++ ++msgid "Block list enabled" ++msgstr "Blockier-Liste eingeschaltet" ++ ++msgid "Blocklist URL" ++msgstr "URL für Blockier-Liste" ++ ++msgid "Blocklists" ++msgstr "Blockier-Listen" ++ ++msgid "Cache size in MB" ++msgstr "Cache-Größe in MB" ++ ++msgid "Config file directory" ++msgstr "Verzeichnis für Konfigurationsdatei" ++ ++msgid "DHT enabled" ++msgstr "DHT eingeschaltet" ++ ++msgid "Debug" ++msgstr "Debug" ++ ++msgid "Download directory" ++msgstr "Verzeichnis für Downloads" ++ ++msgid "Download queue enabled" ++msgstr "Download-Warteschlange eingeschaltet" ++ ++msgid "Download queue size" ++msgstr "Größe der Download-Warteschlange" ++ ++msgid "Enable watch directory" ++msgstr "Verzeichnisüberprüfung eingeschaltet" ++ ++msgid "Enabled" ++msgstr "Eingeschaltet" ++ ++msgid "Encryption" ++msgstr "Verschlüsselung" ++ ++msgid "Error" ++msgstr "Fehler" ++ ++msgid "Fast" ++msgstr "Schnell" ++ ++msgid "Files and Locations" ++msgstr "Dateien und Orte" ++ ++msgid "Forced" ++msgstr "Erzwungen" ++ ++msgid "Full" ++msgstr "Voll" ++ ++msgid "Global peer limit" ++msgstr "Allgemeines Peer-Limit" ++ ++msgid "Global settings" ++msgstr "Allgemeine Einstellungen" ++ ++msgid "Idle seeding limit" ++msgstr "Begrenzung für Seeding im Idle-Zustand" ++ ++msgid "Idle seeding limit enabled" ++msgstr "Begrenzung für Seeding im Idle-Zustand eingeschaltet" ++ ++msgid "Incomplete directory" ++msgstr "unvollständiges Verzeichnis" ++ ++msgid "Incomplete directory enabled" ++msgstr "unvollständiges Verzeichnis eingeschaltet" ++ ++msgid "Info" ++msgstr "Info" ++ ++msgid "LPD enabled" ++msgstr "LPD eingeschaltet" ++ ++msgid "Lazy bitfield enabled" ++msgstr "Lazy-Bitfield eingeschaltet" ++ ++msgid "Message level" ++msgstr "Nachrichten-Ebene" ++ ++msgid "Miscellaneous" ++msgstr "Verschiedenes" ++ ++msgid "None" ++msgstr "Keines" ++ ++msgid "" ++"Number/bitfield. Start with 0, then for each day you want the scheduler " ++"enabled, add a value. For Sunday - 1, Monday - 2, Tuesday - 4, Wednesday - " ++"8, Thursday - 16, Friday - 32, Saturday - 64" ++msgstr "" ++"Zahl/Bitfeld. Starte mit 0, für jeden Tag, an dem die Zeitplanung aktiv sein " ++"soll, füge einen Wert hinzu. Sonntag - 1, Montag - 2, Dienstag - 4, " ++"Mittwoch - 8, Donnerstag - 16, Freitag - 32, Samstag - 64" ++ ++msgid "Off" ++msgstr "Aus" ++ ++msgid "Open Web Interface" ++msgstr "Offenes Web-Interface" ++ ++msgid "PEX enabled" ++msgstr "PEX aktiv" ++ ++msgid "Peer Port settings" ++msgstr "Einstellungen für Peer-Port" ++ ++msgid "Peer congestion algorithm" ++msgstr "Algorithmus für Peer-Ãœberlastungen" ++ ++msgid "Peer limit per torrent" ++msgstr "Peer-Begrenzung pro Torrent" ++ ++msgid "Peer port" ++msgstr "Peer-Port" ++ ++msgid "Peer port random high" ++msgstr "Peer-Port: hohe Zufallszahl" ++ ++msgid "Peer port random low" ++msgstr "Peer-Port: niedrige Zufallszahl" ++ ++msgid "Peer port random on start" ++msgstr "Zufälliger Peer-Port beim Start" ++ ++msgid "Peer settings" ++msgstr "Peer-Einstellungen" ++ ++msgid "Peer socket tos" ++msgstr "Peer-Socket-TOS" ++ ++msgid "Port forwarding enabled" ++msgstr "Port-Weiterleitung aktiv" ++ ++msgid "Preferred" ++msgstr "Bevorzugt" ++ ++msgid "Prefetch enabled" ++msgstr "Prefetch aktiv" ++ ++msgid "Queue stalled enabled" ++msgstr "Warteschlangen-Halt aktiv" ++ ++msgid "Queue stalled minutes" ++msgstr "Warteschlangen-Halt in Minuten" ++ ++msgid "Queueing" ++msgstr "in Warteschlange stellen" ++ ++msgid "RPC URL" ++msgstr "RPC-URL" ++ ++msgid "RPC authentication required" ++msgstr "RPC-Anmeldung erforderlich" ++ ++msgid "RPC bind address" ++msgstr "RPC-Adressbindung" ++ ++msgid "RPC enabled" ++msgstr "RPC eingeschaltet" ++ ++msgid "RPC password" ++msgstr "RPC-Passwort" ++ ++msgid "RPC port" ++msgstr "RPC-Port" ++ ++msgid "RPC settings" ++msgstr "RPC-Einstellungen" ++ ++msgid "RPC username" ++msgstr "RPC-Benutzername" ++ ++msgid "RPC whitelist" ++msgstr "RPC-Einschlussliste" ++ ++msgid "RPC whitelist enabled" ++msgstr "RPC-Einschlussliste aktiv" ++ ++msgid "Ratio limit" ++msgstr "Ratio-Begrenzung" ++ ++msgid "Ratio limit enabled" ++msgstr "Ratio-Begrenzung aktiv" ++ ++msgid "Rename partial files" ++msgstr "Teildateien umbenennen" ++ ++msgid "Run daemon as user" ++msgstr "Den Daemon als Benutzer starten" ++ ++msgid "Scheduling" ++msgstr "Zeitplanung" ++ ++msgid "Scrape paused torrents enabled" ++msgstr "Pausierte Torrents beschneiden" ++ ++msgid "Script torrent done enabled" ++msgstr "Skript nach Abschluss eines Torrents aktiv" ++ ++msgid "Script torrent done filename" ++msgstr "Skript nach Abschluss eines Torrents: Dateiname" ++ ++msgid "Seed queue enabled" ++msgstr "Seed-Warteschlange aktiv" ++ ++msgid "Seed queue size" ++msgstr "Größe der Seed-Warteschlange" ++ ++msgid "Speed limit down" ++msgstr "Geschwindigkeitsbegrenzung Down" ++ ++msgid "Speed limit down enabled" ++msgstr "Geschwindigkeitsbegrenzung Down aktiv" ++ ++msgid "Speed limit up" ++msgstr "Geschwindigkeitsbegrenzung Up" ++ ++msgid "Speed limit up enabled" ++msgstr "Geschwindigkeitsbegrenzung Up aktiv" ++ ++msgid "Transmission" ++msgstr "Ãœbertragung" ++ ++msgid "" ++"Transmission daemon is a simple bittorrent client, here you can configure " ++"the settings." ++msgstr "" ++"Der Transmission-Daemon ist ein einfacher Bittorent-Client. Hier können Sie " ++"ihn einstellen." ++ ++msgid "Trash original torrent files" ++msgstr "Originale Torrent-Dateien verwerfen" ++ ++msgid "Upload slots per torrent" ++msgstr "Upload-Plätze pro Torrent" ++ ++msgid "Watch directory" ++msgstr "Ãœberwachtes Verzeichnis" ++ ++msgid "in minutes from midnight" ++msgstr "in Minuten ab Mitternacht" ++ ++msgid "preallocation" ++msgstr "Vorbelegung" ++ ++msgid "uTP enabled" ++msgstr "uTP eingeschaltet" +diff --git a/feeds/luci/applications/luci-app-transmission/po/el/transmission.po b/feeds/luci/applications/luci-app-transmission/po/el/transmission.po +new file mode 100644 +index 0000000..3125fc2 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-transmission/po/el/transmission.po +@@ -0,0 +1,280 @@ ++msgid "Alternative download speed" ++msgstr "" ++ ++msgid "Alternative speed enabled" ++msgstr "" ++ ++msgid "Alternative speed time begin" ++msgstr "" ++ ++msgid "Alternative speed time day" ++msgstr "" ++ ++msgid "Alternative speed time end" ++msgstr "" ++ ++msgid "Alternative speed timing enabled" ++msgstr "" ++ ++msgid "Alternative upload speed" ++msgstr "" ++ ++msgid "Automatically start added torrents" ++msgstr "" ++ ++msgid "Bandwidth settings" ++msgstr "" ++ ++msgid "Binding address IPv4" ++msgstr "" ++ ++msgid "Binding address IPv6" ++msgstr "" ++ ++msgid "Block list enabled" ++msgstr "" ++ ++msgid "Blocklist URL" ++msgstr "" ++ ++msgid "Blocklists" ++msgstr "" ++ ++msgid "Cache size in MB" ++msgstr "" ++ ++msgid "Config file directory" ++msgstr "" ++ ++msgid "DHT enabled" ++msgstr "" ++ ++msgid "Debug" ++msgstr "" ++ ++msgid "Download directory" ++msgstr "" ++ ++msgid "Download queue enabled" ++msgstr "" ++ ++msgid "Download queue size" ++msgstr "" ++ ++msgid "Enable watch directory" ++msgstr "" ++ ++msgid "Enabled" ++msgstr "" ++ ++msgid "Encryption" ++msgstr "" ++ ++msgid "Error" ++msgstr "" ++ ++msgid "Fast" ++msgstr "" ++ ++msgid "Files and Locations" ++msgstr "" ++ ++msgid "Forced" ++msgstr "" ++ ++msgid "Full" ++msgstr "" ++ ++msgid "Global peer limit" ++msgstr "" ++ ++msgid "Global settings" ++msgstr "" ++ ++msgid "Idle seeding limit" ++msgstr "" ++ ++msgid "Idle seeding limit enabled" ++msgstr "" ++ ++msgid "Incomplete directory" ++msgstr "" ++ ++msgid "Incomplete directory enabled" ++msgstr "" ++ ++msgid "Info" ++msgstr "" ++ ++msgid "LPD enabled" ++msgstr "" ++ ++msgid "Lazy bitfield enabled" ++msgstr "" ++ ++msgid "Message level" ++msgstr "" ++ ++msgid "Miscellaneous" ++msgstr "" ++ ++msgid "None" ++msgstr "" ++ ++msgid "" ++"Number/bitfield. Start with 0, then for each day you want the scheduler " ++"enabled, add a value. For Sunday - 1, Monday - 2, Tuesday - 4, Wednesday - " ++"8, Thursday - 16, Friday - 32, Saturday - 64" ++msgstr "" ++ ++msgid "Off" ++msgstr "" ++ ++msgid "Open Web Interface" ++msgstr "" ++ ++msgid "PEX enabled" ++msgstr "" ++ ++msgid "Peer Port settings" ++msgstr "" ++ ++msgid "Peer congestion algorithm" ++msgstr "" ++ ++msgid "Peer limit per torrent" ++msgstr "" ++ ++msgid "Peer port" ++msgstr "" ++ ++msgid "Peer port random high" ++msgstr "" ++ ++msgid "Peer port random low" ++msgstr "" ++ ++msgid "Peer port random on start" ++msgstr "" ++ ++msgid "Peer settings" ++msgstr "" ++ ++msgid "Peer socket tos" ++msgstr "" ++ ++msgid "Port forwarding enabled" ++msgstr "" ++ ++msgid "Preferred" ++msgstr "" ++ ++msgid "Prefetch enabled" ++msgstr "" ++ ++msgid "Queue stalled enabled" ++msgstr "" ++ ++msgid "Queue stalled minutes" ++msgstr "" ++ ++msgid "Queueing" ++msgstr "" ++ ++msgid "RPC URL" ++msgstr "" ++ ++msgid "RPC authentication required" ++msgstr "" ++ ++msgid "RPC bind address" ++msgstr "" ++ ++msgid "RPC enabled" ++msgstr "" ++ ++msgid "RPC password" ++msgstr "" ++ ++msgid "RPC port" ++msgstr "" ++ ++msgid "RPC settings" ++msgstr "" ++ ++msgid "RPC username" ++msgstr "" ++ ++msgid "RPC whitelist" ++msgstr "" ++ ++msgid "RPC whitelist enabled" ++msgstr "" ++ ++msgid "Ratio limit" ++msgstr "" ++ ++msgid "Ratio limit enabled" ++msgstr "" ++ ++msgid "Rename partial files" ++msgstr "" ++ ++msgid "Run daemon as user" ++msgstr "" ++ ++msgid "Scheduling" ++msgstr "" ++ ++msgid "Scrape paused torrents enabled" ++msgstr "" ++ ++msgid "Script torrent done enabled" ++msgstr "" ++ ++msgid "Script torrent done filename" ++msgstr "" ++ ++msgid "Seed queue enabled" ++msgstr "" ++ ++msgid "Seed queue size" ++msgstr "" ++ ++msgid "Speed limit down" ++msgstr "" ++ ++msgid "Speed limit down enabled" ++msgstr "" ++ ++msgid "Speed limit up" ++msgstr "" ++ ++msgid "Speed limit up enabled" ++msgstr "" ++ ++msgid "Transmission" ++msgstr "" ++ ++msgid "" ++"Transmission daemon is a simple bittorrent client, here you can configure " ++"the settings." ++msgstr "" ++ ++msgid "Trash original torrent files" ++msgstr "" ++ ++msgid "Upload slots per torrent" ++msgstr "" ++ ++msgid "Watch directory" ++msgstr "" ++ ++msgid "in minutes from midnight" ++msgstr "" ++ ++msgid "preallocation" ++msgstr "" ++ ++msgid "uTP enabled" ++msgstr "" +diff --git a/feeds/luci/applications/luci-app-transmission/po/en/transmission.po b/feeds/luci/applications/luci-app-transmission/po/en/transmission.po +new file mode 100644 +index 0000000..3125fc2 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-transmission/po/en/transmission.po +@@ -0,0 +1,280 @@ ++msgid "Alternative download speed" ++msgstr "" ++ ++msgid "Alternative speed enabled" ++msgstr "" ++ ++msgid "Alternative speed time begin" ++msgstr "" ++ ++msgid "Alternative speed time day" ++msgstr "" ++ ++msgid "Alternative speed time end" ++msgstr "" ++ ++msgid "Alternative speed timing enabled" ++msgstr "" ++ ++msgid "Alternative upload speed" ++msgstr "" ++ ++msgid "Automatically start added torrents" ++msgstr "" ++ ++msgid "Bandwidth settings" ++msgstr "" ++ ++msgid "Binding address IPv4" ++msgstr "" ++ ++msgid "Binding address IPv6" ++msgstr "" ++ ++msgid "Block list enabled" ++msgstr "" ++ ++msgid "Blocklist URL" ++msgstr "" ++ ++msgid "Blocklists" ++msgstr "" ++ ++msgid "Cache size in MB" ++msgstr "" ++ ++msgid "Config file directory" ++msgstr "" ++ ++msgid "DHT enabled" ++msgstr "" ++ ++msgid "Debug" ++msgstr "" ++ ++msgid "Download directory" ++msgstr "" ++ ++msgid "Download queue enabled" ++msgstr "" ++ ++msgid "Download queue size" ++msgstr "" ++ ++msgid "Enable watch directory" ++msgstr "" ++ ++msgid "Enabled" ++msgstr "" ++ ++msgid "Encryption" ++msgstr "" ++ ++msgid "Error" ++msgstr "" ++ ++msgid "Fast" ++msgstr "" ++ ++msgid "Files and Locations" ++msgstr "" ++ ++msgid "Forced" ++msgstr "" ++ ++msgid "Full" ++msgstr "" ++ ++msgid "Global peer limit" ++msgstr "" ++ ++msgid "Global settings" ++msgstr "" ++ ++msgid "Idle seeding limit" ++msgstr "" ++ ++msgid "Idle seeding limit enabled" ++msgstr "" ++ ++msgid "Incomplete directory" ++msgstr "" ++ ++msgid "Incomplete directory enabled" ++msgstr "" ++ ++msgid "Info" ++msgstr "" ++ ++msgid "LPD enabled" ++msgstr "" ++ ++msgid "Lazy bitfield enabled" ++msgstr "" ++ ++msgid "Message level" ++msgstr "" ++ ++msgid "Miscellaneous" ++msgstr "" ++ ++msgid "None" ++msgstr "" ++ ++msgid "" ++"Number/bitfield. Start with 0, then for each day you want the scheduler " ++"enabled, add a value. For Sunday - 1, Monday - 2, Tuesday - 4, Wednesday - " ++"8, Thursday - 16, Friday - 32, Saturday - 64" ++msgstr "" ++ ++msgid "Off" ++msgstr "" ++ ++msgid "Open Web Interface" ++msgstr "" ++ ++msgid "PEX enabled" ++msgstr "" ++ ++msgid "Peer Port settings" ++msgstr "" ++ ++msgid "Peer congestion algorithm" ++msgstr "" ++ ++msgid "Peer limit per torrent" ++msgstr "" ++ ++msgid "Peer port" ++msgstr "" ++ ++msgid "Peer port random high" ++msgstr "" ++ ++msgid "Peer port random low" ++msgstr "" ++ ++msgid "Peer port random on start" ++msgstr "" ++ ++msgid "Peer settings" ++msgstr "" ++ ++msgid "Peer socket tos" ++msgstr "" ++ ++msgid "Port forwarding enabled" ++msgstr "" ++ ++msgid "Preferred" ++msgstr "" ++ ++msgid "Prefetch enabled" ++msgstr "" ++ ++msgid "Queue stalled enabled" ++msgstr "" ++ ++msgid "Queue stalled minutes" ++msgstr "" ++ ++msgid "Queueing" ++msgstr "" ++ ++msgid "RPC URL" ++msgstr "" ++ ++msgid "RPC authentication required" ++msgstr "" ++ ++msgid "RPC bind address" ++msgstr "" ++ ++msgid "RPC enabled" ++msgstr "" ++ ++msgid "RPC password" ++msgstr "" ++ ++msgid "RPC port" ++msgstr "" ++ ++msgid "RPC settings" ++msgstr "" ++ ++msgid "RPC username" ++msgstr "" ++ ++msgid "RPC whitelist" ++msgstr "" ++ ++msgid "RPC whitelist enabled" ++msgstr "" ++ ++msgid "Ratio limit" ++msgstr "" ++ ++msgid "Ratio limit enabled" ++msgstr "" ++ ++msgid "Rename partial files" ++msgstr "" ++ ++msgid "Run daemon as user" ++msgstr "" ++ ++msgid "Scheduling" ++msgstr "" ++ ++msgid "Scrape paused torrents enabled" ++msgstr "" ++ ++msgid "Script torrent done enabled" ++msgstr "" ++ ++msgid "Script torrent done filename" ++msgstr "" ++ ++msgid "Seed queue enabled" ++msgstr "" ++ ++msgid "Seed queue size" ++msgstr "" ++ ++msgid "Speed limit down" ++msgstr "" ++ ++msgid "Speed limit down enabled" ++msgstr "" ++ ++msgid "Speed limit up" ++msgstr "" ++ ++msgid "Speed limit up enabled" ++msgstr "" ++ ++msgid "Transmission" ++msgstr "" ++ ++msgid "" ++"Transmission daemon is a simple bittorrent client, here you can configure " ++"the settings." ++msgstr "" ++ ++msgid "Trash original torrent files" ++msgstr "" ++ ++msgid "Upload slots per torrent" ++msgstr "" ++ ++msgid "Watch directory" ++msgstr "" ++ ++msgid "in minutes from midnight" ++msgstr "" ++ ++msgid "preallocation" ++msgstr "" ++ ++msgid "uTP enabled" ++msgstr "" +diff --git a/feeds/luci/applications/luci-app-transmission/po/es/transmission.po b/feeds/luci/applications/luci-app-transmission/po/es/transmission.po +new file mode 100644 +index 0000000..9eeb2fb +--- /dev/null ++++ b/feeds/luci/applications/luci-app-transmission/po/es/transmission.po +@@ -0,0 +1,299 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Report-Msgid-Bugs-To: \n" ++"POT-Creation-Date: 2012-08-21 22:06+0200\n" ++"PO-Revision-Date: 2012-08-26 10:47+0200\n" ++"Last-Translator: José Vicente \n" ++"Language-Team: LANGUAGE \n" ++"Language: es\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n != 1);\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "Alternative download speed" ++msgstr "Velocidad de descarga alternativa" ++ ++msgid "Alternative speed enabled" ++msgstr "Velocidad alternativa activada" ++ ++msgid "Alternative speed time begin" ++msgstr "Hora de inicio de la velocidad alternativa" ++ ++msgid "Alternative speed time day" ++msgstr "Día de la velocidad alternativa" ++ ++msgid "Alternative speed time end" ++msgstr "Hora de fin de la velocidad alternativa" ++ ++msgid "Alternative speed timing enabled" ++msgstr "Temporización alternativa de la velocidad activada" ++ ++msgid "Alternative upload speed" ++msgstr "Velocidad de subida alternativa" ++ ++msgid "Automatically start added torrents" ++msgstr "Arrancar automáticamente los torrents al añadirlos" ++ ++msgid "Bandwidth settings" ++msgstr "Configuración del ancho de banda" ++ ++msgid "Binding address IPv4" ++msgstr "Dirección IPv4 a asociar" ++ ++msgid "Binding address IPv6" ++msgstr "Dirección IPv6 a asociar" ++ ++msgid "Block list enabled" ++msgstr "Lista de bloques activada" ++ ++msgid "Blocklist URL" ++msgstr "URL de la lista de bloques" ++ ++msgid "Blocklists" ++msgstr "Listas de bloques" ++ ++msgid "Cache size in MB" ++msgstr "Tamaño de la caché en MB" ++ ++msgid "Config file directory" ++msgstr "Directorio del fichero de configuración" ++ ++msgid "DHT enabled" ++msgstr "DHT activado" ++ ++msgid "Debug" ++msgstr "Depurar" ++ ++msgid "Download directory" ++msgstr "Directorio de descargas" ++ ++msgid "Download queue enabled" ++msgstr "Cola de descargas activada" ++ ++msgid "Download queue size" ++msgstr "Tamaño de la cola de descargas" ++ ++msgid "Enable watch directory" ++msgstr "Activar directorio a observar" ++ ++msgid "Enabled" ++msgstr "Activado" ++ ++msgid "Encryption" ++msgstr "Encriptado" ++ ++msgid "Error" ++msgstr "Error" ++ ++msgid "Fast" ++msgstr "Rápido" ++ ++msgid "Files and Locations" ++msgstr "Ficheros y posiciones" ++ ++msgid "Forced" ++msgstr "Forzado" ++ ++msgid "Full" ++msgstr "Lleno" ++ ++msgid "Global peer limit" ++msgstr "Límite global de máquinas" ++ ++msgid "Global settings" ++msgstr "Configuración global" ++ ++msgid "Idle seeding limit" ++msgstr "Límite de sembrado en vacío" ++ ++msgid "Idle seeding limit enabled" ++msgstr "Límite de sembrado en vacío activado" ++ ++msgid "Incomplete directory" ++msgstr "Directorio incompleto" ++ ++msgid "Incomplete directory enabled" ++msgstr "Directorio incompleto activado" ++ ++msgid "Info" ++msgstr "Información" ++ ++msgid "LPD enabled" ++msgstr "LPD activado" ++ ++msgid "Lazy bitfield enabled" ++msgstr "Lazy bitfield activado" ++ ++msgid "Message level" ++msgstr "Nivel de mensajes" ++ ++msgid "Miscellaneous" ++msgstr "Varios" ++ ++msgid "None" ++msgstr "Ninguno" ++ ++msgid "" ++"Number/bitfield. Start with 0, then for each day you want the scheduler " ++"enabled, add a value. For Sunday - 1, Monday - 2, Tuesday - 4, Wednesday - " ++"8, Thursday - 16, Friday - 32, Saturday - 64" ++msgstr "" ++"Número/en bits. Empiece con 0 y por cada día que quiera que se active el " ++"programados sume: Para domingo - 1, lunes - 2, martes - 4, miércoles - 8, " ++"jueves - 16, viernes - 32, sábado - 64" ++ ++msgid "Off" ++msgstr "Apagado" ++ ++msgid "Open Web Interface" ++msgstr "Interfaz de red abierta" ++ ++msgid "PEX enabled" ++msgstr "PEX activado" ++ ++msgid "Peer Port settings" ++msgstr "Configuración de puertos" ++ ++msgid "Peer congestion algorithm" ++msgstr "Algoritmo de congestión" ++ ++msgid "Peer limit per torrent" ++msgstr "Límite por torrent" ++ ++msgid "Peer port" ++msgstr "Puerto" ++ ++msgid "Peer port random high" ++msgstr "Puerto más alto" ++ ++msgid "Peer port random low" ++msgstr "Puerto más bajo" ++ ++msgid "Peer port random on start" ++msgstr "Puerto aleatorio al arrancar" ++ ++msgid "Peer settings" ++msgstr "Configuración de peer" ++ ++msgid "Peer socket tos" ++msgstr "Peer socket tos" ++ ++msgid "Port forwarding enabled" ++msgstr "Traspaso de puertos activado" ++ ++msgid "Preferred" ++msgstr "Preferente" ++ ++msgid "Prefetch enabled" ++msgstr "Activar prefetch" ++ ++msgid "Queue stalled enabled" ++msgstr "Activar bloqueo de cola" ++ ++msgid "Queue stalled minutes" ++msgstr "Minutos de bloqueo de cola" ++ ++msgid "Queueing" ++msgstr "Colas" ++ ++msgid "RPC URL" ++msgstr "URL RPC" ++ ++msgid "RPC authentication required" ++msgstr "Autentificación RPC obligatoria" ++ ++msgid "RPC bind address" ++msgstr "Dirección de asociación RPC" ++ ++msgid "RPC enabled" ++msgstr "RPC activado" ++ ++msgid "RPC password" ++msgstr "Contraseña RPC" ++ ++msgid "RPC port" ++msgstr "Puerto RPC" ++ ++msgid "RPC settings" ++msgstr "Configuración RPC" ++ ++msgid "RPC username" ++msgstr "Nombre de usuario RPC" ++ ++msgid "RPC whitelist" ++msgstr "Lista blanca RPC" ++ ++msgid "RPC whitelist enabled" ++msgstr "Activar listas blancas RPC" ++ ++msgid "Ratio limit" ++msgstr "Límite de ratio" ++ ++msgid "Ratio limit enabled" ++msgstr "Límite de ratio activado" ++ ++msgid "Rename partial files" ++msgstr "Renombrar ficheros parciales" ++ ++msgid "Run daemon as user" ++msgstr "Ejecutar demonio como usuario" ++ ++msgid "Scheduling" ++msgstr "Programación" ++ ++msgid "Scrape paused torrents enabled" ++msgstr "Activar scrape de torrents en pausa" ++ ++msgid "Script torrent done enabled" ++msgstr "Activar script de fin de torrent" ++ ++msgid "Script torrent done filename" ++msgstr "Nombre de fichero del script" ++ ++msgid "Seed queue enabled" ++msgstr "Cola de seed activada" ++ ++msgid "Seed queue size" ++msgstr "Tamaño máximo de la cola de seed" ++ ++msgid "Speed limit down" ++msgstr "Velocidad mínima" ++ ++msgid "Speed limit down enabled" ++msgstr "Velocidad mínima activada" ++ ++msgid "Speed limit up" ++msgstr "Velocidad máxima" ++ ++msgid "Speed limit up enabled" ++msgstr "Velocidad máxima activada" ++ ++msgid "Transmission" ++msgstr "Transmission" ++ ++msgid "" ++"Transmission daemon is a simple bittorrent client, here you can configure " ++"the settings." ++msgstr "" ++"Configuración. El demonio Transmission es un cliente de bittorrent simple." ++ ++msgid "Trash original torrent files" ++msgstr "Eliminar los ficheros torrent originales" ++ ++msgid "Upload slots per torrent" ++msgstr "Ranuras de subida por torrent" ++ ++msgid "Watch directory" ++msgstr "Directorio a vigilar" ++ ++msgid "in minutes from midnight" ++msgstr "en minutos para la media noche" ++ ++msgid "preallocation" ++msgstr "precolocación" ++ ++msgid "uTP enabled" ++msgstr "uTP activado" +diff --git a/feeds/luci/applications/luci-app-transmission/po/fr/transmission.po b/feeds/luci/applications/luci-app-transmission/po/fr/transmission.po +new file mode 100644 +index 0000000..3125fc2 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-transmission/po/fr/transmission.po +@@ -0,0 +1,280 @@ ++msgid "Alternative download speed" ++msgstr "" ++ ++msgid "Alternative speed enabled" ++msgstr "" ++ ++msgid "Alternative speed time begin" ++msgstr "" ++ ++msgid "Alternative speed time day" ++msgstr "" ++ ++msgid "Alternative speed time end" ++msgstr "" ++ ++msgid "Alternative speed timing enabled" ++msgstr "" ++ ++msgid "Alternative upload speed" ++msgstr "" ++ ++msgid "Automatically start added torrents" ++msgstr "" ++ ++msgid "Bandwidth settings" ++msgstr "" ++ ++msgid "Binding address IPv4" ++msgstr "" ++ ++msgid "Binding address IPv6" ++msgstr "" ++ ++msgid "Block list enabled" ++msgstr "" ++ ++msgid "Blocklist URL" ++msgstr "" ++ ++msgid "Blocklists" ++msgstr "" ++ ++msgid "Cache size in MB" ++msgstr "" ++ ++msgid "Config file directory" ++msgstr "" ++ ++msgid "DHT enabled" ++msgstr "" ++ ++msgid "Debug" ++msgstr "" ++ ++msgid "Download directory" ++msgstr "" ++ ++msgid "Download queue enabled" ++msgstr "" ++ ++msgid "Download queue size" ++msgstr "" ++ ++msgid "Enable watch directory" ++msgstr "" ++ ++msgid "Enabled" ++msgstr "" ++ ++msgid "Encryption" ++msgstr "" ++ ++msgid "Error" ++msgstr "" ++ ++msgid "Fast" ++msgstr "" ++ ++msgid "Files and Locations" ++msgstr "" ++ ++msgid "Forced" ++msgstr "" ++ ++msgid "Full" ++msgstr "" ++ ++msgid "Global peer limit" ++msgstr "" ++ ++msgid "Global settings" ++msgstr "" ++ ++msgid "Idle seeding limit" ++msgstr "" ++ ++msgid "Idle seeding limit enabled" ++msgstr "" ++ ++msgid "Incomplete directory" ++msgstr "" ++ ++msgid "Incomplete directory enabled" ++msgstr "" ++ ++msgid "Info" ++msgstr "" ++ ++msgid "LPD enabled" ++msgstr "" ++ ++msgid "Lazy bitfield enabled" ++msgstr "" ++ ++msgid "Message level" ++msgstr "" ++ ++msgid "Miscellaneous" ++msgstr "" ++ ++msgid "None" ++msgstr "" ++ ++msgid "" ++"Number/bitfield. Start with 0, then for each day you want the scheduler " ++"enabled, add a value. For Sunday - 1, Monday - 2, Tuesday - 4, Wednesday - " ++"8, Thursday - 16, Friday - 32, Saturday - 64" ++msgstr "" ++ ++msgid "Off" ++msgstr "" ++ ++msgid "Open Web Interface" ++msgstr "" ++ ++msgid "PEX enabled" ++msgstr "" ++ ++msgid "Peer Port settings" ++msgstr "" ++ ++msgid "Peer congestion algorithm" ++msgstr "" ++ ++msgid "Peer limit per torrent" ++msgstr "" ++ ++msgid "Peer port" ++msgstr "" ++ ++msgid "Peer port random high" ++msgstr "" ++ ++msgid "Peer port random low" ++msgstr "" ++ ++msgid "Peer port random on start" ++msgstr "" ++ ++msgid "Peer settings" ++msgstr "" ++ ++msgid "Peer socket tos" ++msgstr "" ++ ++msgid "Port forwarding enabled" ++msgstr "" ++ ++msgid "Preferred" ++msgstr "" ++ ++msgid "Prefetch enabled" ++msgstr "" ++ ++msgid "Queue stalled enabled" ++msgstr "" ++ ++msgid "Queue stalled minutes" ++msgstr "" ++ ++msgid "Queueing" ++msgstr "" ++ ++msgid "RPC URL" ++msgstr "" ++ ++msgid "RPC authentication required" ++msgstr "" ++ ++msgid "RPC bind address" ++msgstr "" ++ ++msgid "RPC enabled" ++msgstr "" ++ ++msgid "RPC password" ++msgstr "" ++ ++msgid "RPC port" ++msgstr "" ++ ++msgid "RPC settings" ++msgstr "" ++ ++msgid "RPC username" ++msgstr "" ++ ++msgid "RPC whitelist" ++msgstr "" ++ ++msgid "RPC whitelist enabled" ++msgstr "" ++ ++msgid "Ratio limit" ++msgstr "" ++ ++msgid "Ratio limit enabled" ++msgstr "" ++ ++msgid "Rename partial files" ++msgstr "" ++ ++msgid "Run daemon as user" ++msgstr "" ++ ++msgid "Scheduling" ++msgstr "" ++ ++msgid "Scrape paused torrents enabled" ++msgstr "" ++ ++msgid "Script torrent done enabled" ++msgstr "" ++ ++msgid "Script torrent done filename" ++msgstr "" ++ ++msgid "Seed queue enabled" ++msgstr "" ++ ++msgid "Seed queue size" ++msgstr "" ++ ++msgid "Speed limit down" ++msgstr "" ++ ++msgid "Speed limit down enabled" ++msgstr "" ++ ++msgid "Speed limit up" ++msgstr "" ++ ++msgid "Speed limit up enabled" ++msgstr "" ++ ++msgid "Transmission" ++msgstr "" ++ ++msgid "" ++"Transmission daemon is a simple bittorrent client, here you can configure " ++"the settings." ++msgstr "" ++ ++msgid "Trash original torrent files" ++msgstr "" ++ ++msgid "Upload slots per torrent" ++msgstr "" ++ ++msgid "Watch directory" ++msgstr "" ++ ++msgid "in minutes from midnight" ++msgstr "" ++ ++msgid "preallocation" ++msgstr "" ++ ++msgid "uTP enabled" ++msgstr "" +diff --git a/feeds/luci/applications/luci-app-transmission/po/he/transmission.po b/feeds/luci/applications/luci-app-transmission/po/he/transmission.po +new file mode 100644 +index 0000000..3125fc2 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-transmission/po/he/transmission.po +@@ -0,0 +1,280 @@ ++msgid "Alternative download speed" ++msgstr "" ++ ++msgid "Alternative speed enabled" ++msgstr "" ++ ++msgid "Alternative speed time begin" ++msgstr "" ++ ++msgid "Alternative speed time day" ++msgstr "" ++ ++msgid "Alternative speed time end" ++msgstr "" ++ ++msgid "Alternative speed timing enabled" ++msgstr "" ++ ++msgid "Alternative upload speed" ++msgstr "" ++ ++msgid "Automatically start added torrents" ++msgstr "" ++ ++msgid "Bandwidth settings" ++msgstr "" ++ ++msgid "Binding address IPv4" ++msgstr "" ++ ++msgid "Binding address IPv6" ++msgstr "" ++ ++msgid "Block list enabled" ++msgstr "" ++ ++msgid "Blocklist URL" ++msgstr "" ++ ++msgid "Blocklists" ++msgstr "" ++ ++msgid "Cache size in MB" ++msgstr "" ++ ++msgid "Config file directory" ++msgstr "" ++ ++msgid "DHT enabled" ++msgstr "" ++ ++msgid "Debug" ++msgstr "" ++ ++msgid "Download directory" ++msgstr "" ++ ++msgid "Download queue enabled" ++msgstr "" ++ ++msgid "Download queue size" ++msgstr "" ++ ++msgid "Enable watch directory" ++msgstr "" ++ ++msgid "Enabled" ++msgstr "" ++ ++msgid "Encryption" ++msgstr "" ++ ++msgid "Error" ++msgstr "" ++ ++msgid "Fast" ++msgstr "" ++ ++msgid "Files and Locations" ++msgstr "" ++ ++msgid "Forced" ++msgstr "" ++ ++msgid "Full" ++msgstr "" ++ ++msgid "Global peer limit" ++msgstr "" ++ ++msgid "Global settings" ++msgstr "" ++ ++msgid "Idle seeding limit" ++msgstr "" ++ ++msgid "Idle seeding limit enabled" ++msgstr "" ++ ++msgid "Incomplete directory" ++msgstr "" ++ ++msgid "Incomplete directory enabled" ++msgstr "" ++ ++msgid "Info" ++msgstr "" ++ ++msgid "LPD enabled" ++msgstr "" ++ ++msgid "Lazy bitfield enabled" ++msgstr "" ++ ++msgid "Message level" ++msgstr "" ++ ++msgid "Miscellaneous" ++msgstr "" ++ ++msgid "None" ++msgstr "" ++ ++msgid "" ++"Number/bitfield. Start with 0, then for each day you want the scheduler " ++"enabled, add a value. For Sunday - 1, Monday - 2, Tuesday - 4, Wednesday - " ++"8, Thursday - 16, Friday - 32, Saturday - 64" ++msgstr "" ++ ++msgid "Off" ++msgstr "" ++ ++msgid "Open Web Interface" ++msgstr "" ++ ++msgid "PEX enabled" ++msgstr "" ++ ++msgid "Peer Port settings" ++msgstr "" ++ ++msgid "Peer congestion algorithm" ++msgstr "" ++ ++msgid "Peer limit per torrent" ++msgstr "" ++ ++msgid "Peer port" ++msgstr "" ++ ++msgid "Peer port random high" ++msgstr "" ++ ++msgid "Peer port random low" ++msgstr "" ++ ++msgid "Peer port random on start" ++msgstr "" ++ ++msgid "Peer settings" ++msgstr "" ++ ++msgid "Peer socket tos" ++msgstr "" ++ ++msgid "Port forwarding enabled" ++msgstr "" ++ ++msgid "Preferred" ++msgstr "" ++ ++msgid "Prefetch enabled" ++msgstr "" ++ ++msgid "Queue stalled enabled" ++msgstr "" ++ ++msgid "Queue stalled minutes" ++msgstr "" ++ ++msgid "Queueing" ++msgstr "" ++ ++msgid "RPC URL" ++msgstr "" ++ ++msgid "RPC authentication required" ++msgstr "" ++ ++msgid "RPC bind address" ++msgstr "" ++ ++msgid "RPC enabled" ++msgstr "" ++ ++msgid "RPC password" ++msgstr "" ++ ++msgid "RPC port" ++msgstr "" ++ ++msgid "RPC settings" ++msgstr "" ++ ++msgid "RPC username" ++msgstr "" ++ ++msgid "RPC whitelist" ++msgstr "" ++ ++msgid "RPC whitelist enabled" ++msgstr "" ++ ++msgid "Ratio limit" ++msgstr "" ++ ++msgid "Ratio limit enabled" ++msgstr "" ++ ++msgid "Rename partial files" ++msgstr "" ++ ++msgid "Run daemon as user" ++msgstr "" ++ ++msgid "Scheduling" ++msgstr "" ++ ++msgid "Scrape paused torrents enabled" ++msgstr "" ++ ++msgid "Script torrent done enabled" ++msgstr "" ++ ++msgid "Script torrent done filename" ++msgstr "" ++ ++msgid "Seed queue enabled" ++msgstr "" ++ ++msgid "Seed queue size" ++msgstr "" ++ ++msgid "Speed limit down" ++msgstr "" ++ ++msgid "Speed limit down enabled" ++msgstr "" ++ ++msgid "Speed limit up" ++msgstr "" ++ ++msgid "Speed limit up enabled" ++msgstr "" ++ ++msgid "Transmission" ++msgstr "" ++ ++msgid "" ++"Transmission daemon is a simple bittorrent client, here you can configure " ++"the settings." ++msgstr "" ++ ++msgid "Trash original torrent files" ++msgstr "" ++ ++msgid "Upload slots per torrent" ++msgstr "" ++ ++msgid "Watch directory" ++msgstr "" ++ ++msgid "in minutes from midnight" ++msgstr "" ++ ++msgid "preallocation" ++msgstr "" ++ ++msgid "uTP enabled" ++msgstr "" +diff --git a/feeds/luci/applications/luci-app-transmission/po/hu/transmission.po b/feeds/luci/applications/luci-app-transmission/po/hu/transmission.po +new file mode 100644 +index 0000000..040f838 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-transmission/po/hu/transmission.po +@@ -0,0 +1,300 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Report-Msgid-Bugs-To: \n" ++"POT-Creation-Date: 2012-04-17 20:30+0200\n" ++"PO-Revision-Date: 2012-04-26 14:30+0200\n" ++"Last-Translator: Gyula \n" ++"Language-Team: LANGUAGE \n" ++"Language: hu\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n != 1);\n" ++"X-Generator: Pootle 2.0.4\n" ++ ++msgid "Alternative download speed" ++msgstr "Alternatív letöltési sebesség" ++ ++msgid "Alternative speed enabled" ++msgstr "Alternatív sebesség engedélyezve" ++ ++msgid "Alternative speed time begin" ++msgstr "Alternatív sebesség kezdÅ‘ idÅ‘pont" ++ ++msgid "Alternative speed time day" ++msgstr "Alternatív sebesség napok" ++ ++msgid "Alternative speed time end" ++msgstr "Alternatív sebesség záró idÅ‘pont" ++ ++msgid "Alternative speed timing enabled" ++msgstr "Alternatív sebesség idÅ‘zítés engedélyezve" ++ ++msgid "Alternative upload speed" ++msgstr "Alternatív feltöltési sebesség" ++ ++msgid "Automatically start added torrents" ++msgstr "Hozzáadott torrentek automatikus indítása" ++ ++msgid "Bandwidth settings" ++msgstr "Sávszélesség beállítások" ++ ++msgid "Binding address IPv4" ++msgstr "Rögzített IPv4 cím" ++ ++msgid "Binding address IPv6" ++msgstr "Rögzített IPv6 cím" ++ ++msgid "Block list enabled" ++msgstr "Tiltólista engedélyezés" ++ ++msgid "Blocklist URL" ++msgstr "Tiltólista URL" ++ ++msgid "Blocklists" ++msgstr "Tiltólista" ++ ++msgid "Cache size in MB" ++msgstr "Puffer méret (MB)" ++ ++msgid "Config file directory" ++msgstr "Beállítási fájl könyvtára" ++ ++msgid "DHT enabled" ++msgstr "DHT engedélyezve" ++ ++msgid "Debug" ++msgstr "Nyomkövetés" ++ ++msgid "Download directory" ++msgstr "Letöltési könyvtár" ++ ++msgid "Download queue enabled" ++msgstr "Letöltési sor engedélyezve" ++ ++msgid "Download queue size" ++msgstr "Letöltési sor mérete" ++ ++msgid "Enable watch directory" ++msgstr "Figyelt könyvtár(aut. indítás)" ++ ++msgid "Enabled" ++msgstr "Engedélyezve" ++ ++msgid "Encryption" ++msgstr "Titkosítás" ++ ++msgid "Error" ++msgstr "Hiba" ++ ++msgid "Fast" ++msgstr "Gyors" ++ ++msgid "Files and Locations" ++msgstr "Fájlok és helyek" ++ ++msgid "Forced" ++msgstr "ErÅ‘ltetve" ++ ++msgid "Full" ++msgstr "Teljes" ++ ++msgid "Global peer limit" ++msgstr "Globális partnerkorlát" ++ ++msgid "Global settings" ++msgstr "Globális beálllítások" ++ ++msgid "Idle seeding limit" ++msgstr "Ãœresjárati seedkorlát" ++ ++msgid "Idle seeding limit enabled" ++msgstr "Ãœresjárati seedkorlát engedélyezése" ++ ++msgid "Incomplete directory" ++msgstr "Befejezetlen fájlok mappája" ++ ++msgid "Incomplete directory enabled" ++msgstr "Befejezetlen fájlok mappájának engedélyezése" ++ ++msgid "Info" ++msgstr "Infó" ++ ++msgid "LPD enabled" ++msgstr "LPD engedélyezése" ++ ++msgid "Lazy bitfield enabled" ++msgstr "Lazy bitfield engedélyezése" ++ ++msgid "Message level" ++msgstr "Naplózási szint" ++ ++msgid "Miscellaneous" ++msgstr "Egyéb" ++ ++msgid "None" ++msgstr "Nincs" ++ ++msgid "" ++"Number/bitfield. Start with 0, then for each day you want the scheduler " ++"enabled, add a value. For Sunday - 1, Monday - 2, Tuesday - 4, Wednesday - " ++"8, Thursday - 16, Friday - 32, Saturday - 64" ++msgstr "" ++"Szám/bitmezÅ‘. Kezdj 0-val, és minden napnál, amikor az ütemezÅ‘t be akarod " ++"kapcsolni, adj hozzá egy értéket. Vasárnap - 1, HétfÅ‘ - 2, Kedd - 4, Szerda " ++"- 8, Csütörtök - 16, Péntek - 32, Szombat - 64" ++ ++msgid "Off" ++msgstr "Ki" ++ ++msgid "Open Web Interface" ++msgstr "Webes felület megnyitása" ++ ++msgid "PEX enabled" ++msgstr "PEX engedélyezése" ++ ++msgid "Peer Port settings" ++msgstr "Partner port beállítások" ++ ++msgid "Peer congestion algorithm" ++msgstr "Partner torlódási algoritmus" ++ ++msgid "Peer limit per torrent" ++msgstr "Torrentenkénti partnerkorlát" ++ ++msgid "Peer port" ++msgstr "Partner port" ++ ++msgid "Peer port random high" ++msgstr "Véletlenszerű magas partner port" ++ ++msgid "Peer port random low" ++msgstr "Véletlenszerű alacsony partner port" ++ ++msgid "Peer port random on start" ++msgstr "Véletlenszerű partner port induláskor" ++ ++msgid "Peer settings" ++msgstr "Partner beállítások" ++ ++msgid "Peer socket tos" ++msgstr "Partner szolgáltatás típus" ++ ++msgid "Port forwarding enabled" ++msgstr "Portátirányítás engedélyezése" ++ ++msgid "Preferred" ++msgstr "ElÅ‘nyben részesített" ++ ++msgid "Prefetch enabled" ++msgstr "ElÅ‘töltés engedélyezése" ++ ++msgid "Queue stalled enabled" ++msgstr "Elakadt sor engedélyezése" ++ ++msgid "Queue stalled minutes" ++msgstr "Elakadás idÅ‘tartama" ++ ++msgid "Queueing" ++msgstr "Sorbaállítás" ++ ++msgid "RPC URL" ++msgstr "RPC URL" ++ ++msgid "RPC authentication required" ++msgstr "RPC azonosítás megkövetelése" ++ ++msgid "RPC bind address" ++msgstr "RPC cím rögzítése" ++ ++msgid "RPC enabled" ++msgstr "RPC engedélyezése" ++ ++msgid "RPC password" ++msgstr "RPC jelszó" ++ ++msgid "RPC port" ++msgstr "RPC port" ++ ++msgid "RPC settings" ++msgstr "RPC beállítások" ++ ++msgid "RPC username" ++msgstr "RPC felhasználónév" ++ ++msgid "RPC whitelist" ++msgstr "RPC fehérlista" ++ ++msgid "RPC whitelist enabled" ++msgstr "RPC fehérlista engedélyezése" ++ ++msgid "Ratio limit" ++msgstr "Aránykorlát" ++ ++msgid "Ratio limit enabled" ++msgstr "Aránykorlát engedélyezése" ++ ++msgid "Rename partial files" ++msgstr "Félkész fájlok átnevezése" ++ ++msgid "Run daemon as user" ++msgstr "Daemon indítása, mint" ++ ++msgid "Scheduling" ++msgstr "Ãœtemezés" ++ ++msgid "Scrape paused torrents enabled" ++msgstr "Ãlló torrentek adatainak lekérdezése" ++ ++msgid "Script torrent done enabled" ++msgstr "Letöltés utáni script engedélyezése" ++ ++msgid "Script torrent done filename" ++msgstr "Letöltés utáni script fájlneve" ++ ++msgid "Seed queue enabled" ++msgstr "Feltöltési sor engedélyezése" ++ ++msgid "Seed queue size" ++msgstr "Feltöltési sor mérete" ++ ++msgid "Speed limit down" ++msgstr "Letöltési korlát" ++ ++msgid "Speed limit down enabled" ++msgstr "Letöltési korlát engedélyezése" ++ ++msgid "Speed limit up" ++msgstr "Feltöltési korlát" ++ ++msgid "Speed limit up enabled" ++msgstr "Feltöltési korlát engedélyezése" ++ ++msgid "Transmission" ++msgstr "Transmission" ++ ++msgid "" ++"Transmission daemon is a simple bittorrent client, here you can configure " ++"the settings." ++msgstr "" ++"A Transmission daemon egy egyszerű bittorrent kliens, itt módosíthatod a " ++"beállításait." ++ ++msgid "Trash original torrent files" ++msgstr "Eredeti torrent fájlok eldobása" ++ ++msgid "Upload slots per torrent" ++msgstr "Feltöltési szálak torrentenként" ++ ++msgid "Watch directory" ++msgstr "Figyelt könyvtár" ++ ++msgid "in minutes from midnight" ++msgstr "percek száma éjféltÅ‘l" ++ ++msgid "preallocation" ++msgstr "elÅ‘re lefoglalás" ++ ++msgid "uTP enabled" ++msgstr "uTP engedélyezése" +diff --git a/feeds/luci/applications/luci-app-transmission/po/it/transmission.po b/feeds/luci/applications/luci-app-transmission/po/it/transmission.po +new file mode 100644 +index 0000000..1008fad +--- /dev/null ++++ b/feeds/luci/applications/luci-app-transmission/po/it/transmission.po +@@ -0,0 +1,295 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Report-Msgid-Bugs-To: \n" ++"POT-Creation-Date: 2013-02-09 21:28+0200\n" ++"PO-Revision-Date: 2013-02-09 21:30+0200\n" ++"Last-Translator: Francesco <3gasas@gmail.com>\n" ++"Language-Team: LANGUAGE \n" ++"Language: it\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n != 1);\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "Alternative download speed" ++msgstr "Velocità di download alternativo" ++ ++msgid "Alternative speed enabled" ++msgstr "Velocità alternativa attivata" ++ ++msgid "Alternative speed time begin" ++msgstr "Tempo di velocità alternativa inizio" ++ ++msgid "Alternative speed time day" ++msgstr "Tempo di velocità alternativa giorno" ++ ++msgid "Alternative speed time end" ++msgstr "Tempo di velocità alternativa fine" ++ ++msgid "Alternative speed timing enabled" ++msgstr "Periodo di velocità alternativa attiva" ++ ++msgid "Alternative upload speed" ++msgstr "Velocità alternativa di upload" ++ ++msgid "Automatically start added torrents" ++msgstr "Avvia automaticamente i torrent aggiunti" ++ ++msgid "Bandwidth settings" ++msgstr "Impostazioni larghezza della banda" ++ ++msgid "Binding address IPv4" ++msgstr "" ++ ++msgid "Binding address IPv6" ++msgstr "" ++ ++msgid "Block list enabled" ++msgstr "" ++ ++msgid "Blocklist URL" ++msgstr "" ++ ++msgid "Blocklists" ++msgstr "" ++ ++msgid "Cache size in MB" ++msgstr "" ++ ++msgid "Config file directory" ++msgstr "" ++ ++msgid "DHT enabled" ++msgstr "" ++ ++msgid "Debug" ++msgstr "" ++ ++msgid "Download directory" ++msgstr "" ++ ++msgid "Download queue enabled" ++msgstr "" ++ ++msgid "Download queue size" ++msgstr "" ++ ++msgid "Enable watch directory" ++msgstr "" ++ ++msgid "Enabled" ++msgstr "" ++ ++msgid "Encryption" ++msgstr "" ++ ++msgid "Error" ++msgstr "" ++ ++msgid "Fast" ++msgstr "" ++ ++msgid "Files and Locations" ++msgstr "" ++ ++msgid "Forced" ++msgstr "" ++ ++msgid "Full" ++msgstr "" ++ ++msgid "Global peer limit" ++msgstr "" ++ ++msgid "Global settings" ++msgstr "" ++ ++msgid "Idle seeding limit" ++msgstr "" ++ ++msgid "Idle seeding limit enabled" ++msgstr "" ++ ++msgid "Incomplete directory" ++msgstr "" ++ ++msgid "Incomplete directory enabled" ++msgstr "" ++ ++msgid "Info" ++msgstr "" ++ ++msgid "LPD enabled" ++msgstr "" ++ ++msgid "Lazy bitfield enabled" ++msgstr "" ++ ++msgid "Message level" ++msgstr "" ++ ++msgid "Miscellaneous" ++msgstr "" ++ ++msgid "None" ++msgstr "" ++ ++msgid "" ++"Number/bitfield. Start with 0, then for each day you want the scheduler " ++"enabled, add a value. For Sunday - 1, Monday - 2, Tuesday - 4, Wednesday - " ++"8, Thursday - 16, Friday - 32, Saturday - 64" ++msgstr "" ++ ++msgid "Off" ++msgstr "" ++ ++msgid "Open Web Interface" ++msgstr "" ++ ++msgid "PEX enabled" ++msgstr "" ++ ++msgid "Peer Port settings" ++msgstr "" ++ ++msgid "Peer congestion algorithm" ++msgstr "" ++ ++msgid "Peer limit per torrent" ++msgstr "" ++ ++msgid "Peer port" ++msgstr "" ++ ++msgid "Peer port random high" ++msgstr "" ++ ++msgid "Peer port random low" ++msgstr "" ++ ++msgid "Peer port random on start" ++msgstr "" ++ ++msgid "Peer settings" ++msgstr "" ++ ++msgid "Peer socket tos" ++msgstr "" ++ ++msgid "Port forwarding enabled" ++msgstr "" ++ ++msgid "Preferred" ++msgstr "" ++ ++msgid "Prefetch enabled" ++msgstr "" ++ ++msgid "Queue stalled enabled" ++msgstr "" ++ ++msgid "Queue stalled minutes" ++msgstr "" ++ ++msgid "Queueing" ++msgstr "" ++ ++msgid "RPC URL" ++msgstr "" ++ ++msgid "RPC authentication required" ++msgstr "" ++ ++msgid "RPC bind address" ++msgstr "" ++ ++msgid "RPC enabled" ++msgstr "" ++ ++msgid "RPC password" ++msgstr "" ++ ++msgid "RPC port" ++msgstr "" ++ ++msgid "RPC settings" ++msgstr "" ++ ++msgid "RPC username" ++msgstr "" ++ ++msgid "RPC whitelist" ++msgstr "" ++ ++msgid "RPC whitelist enabled" ++msgstr "" ++ ++msgid "Ratio limit" ++msgstr "" ++ ++msgid "Ratio limit enabled" ++msgstr "" ++ ++msgid "Rename partial files" ++msgstr "" ++ ++msgid "Run daemon as user" ++msgstr "" ++ ++msgid "Scheduling" ++msgstr "" ++ ++msgid "Scrape paused torrents enabled" ++msgstr "" ++ ++msgid "Script torrent done enabled" ++msgstr "" ++ ++msgid "Script torrent done filename" ++msgstr "" ++ ++msgid "Seed queue enabled" ++msgstr "" ++ ++msgid "Seed queue size" ++msgstr "" ++ ++msgid "Speed limit down" ++msgstr "" ++ ++msgid "Speed limit down enabled" ++msgstr "" ++ ++msgid "Speed limit up" ++msgstr "" ++ ++msgid "Speed limit up enabled" ++msgstr "" ++ ++msgid "Transmission" ++msgstr "" ++ ++msgid "" ++"Transmission daemon is a simple bittorrent client, here you can configure " ++"the settings." ++msgstr "" ++ ++msgid "Trash original torrent files" ++msgstr "" ++ ++msgid "Upload slots per torrent" ++msgstr "" ++ ++msgid "Watch directory" ++msgstr "" ++ ++msgid "in minutes from midnight" ++msgstr "" ++ ++msgid "preallocation" ++msgstr "" ++ ++msgid "uTP enabled" ++msgstr "" +diff --git a/feeds/luci/applications/luci-app-transmission/po/ja/transmission.po b/feeds/luci/applications/luci-app-transmission/po/ja/transmission.po +new file mode 100644 +index 0000000..dded650 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-transmission/po/ja/transmission.po +@@ -0,0 +1,295 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Report-Msgid-Bugs-To: \n" ++"POT-Creation-Date: 2012-04-18 11:15+0200\n" ++"PO-Revision-Date: 2013-10-05 17:17+0200\n" ++"Last-Translator: Kentaro \n" ++"Language-Team: LANGUAGE \n" ++"Language: ja\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=1; plural=0;\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "Alternative download speed" ++msgstr "一時的ãªä¸‹ã‚Šé€Ÿåº¦åˆ¶é™" ++ ++msgid "Alternative speed enabled" ++msgstr "一時的ãªé€Ÿåº¦åˆ¶é™æ©Ÿèƒ½ã‚’有効ã«ã™ã‚‹" ++ ++msgid "Alternative speed time begin" ++msgstr "一時的ãªé€Ÿåº¦åˆ¶é™ 開始時間" ++ ++msgid "Alternative speed time day" ++msgstr "一時的ãªé€Ÿåº¦åˆ¶é™ 制é™æ—¥" ++ ++msgid "Alternative speed time end" ++msgstr "一時的ãªé€Ÿåº¦åˆ¶é™ 終了時間" ++ ++msgid "Alternative speed timing enabled" ++msgstr "一時的ãªé€Ÿåº¦åˆ¶é™ã®ã‚¹ã‚±ã‚¸ãƒ¥ãƒ¼ãƒªãƒ³ã‚°æ©Ÿèƒ½ã‚’有効ã«ã™ã‚‹" ++ ++msgid "Alternative upload speed" ++msgstr "一時的ãªä¸Šã‚Šé€Ÿåº¦åˆ¶é™" ++ ++msgid "Automatically start added torrents" ++msgstr "追加ã•ã‚ŒãŸtorrent ã¯è‡ªå‹•çš„ã«é–‹å§‹ã™ã‚‹" ++ ++msgid "Bandwidth settings" ++msgstr "帯域設定" ++ ++msgid "Binding address IPv4" ++msgstr "ãƒã‚¤ãƒ³ãƒ‰ã™ã‚‹IPv4 アドレス" ++ ++msgid "Binding address IPv6" ++msgstr "ãƒã‚¤ãƒ³ãƒ‰ã™ã‚‹IPv6 アドレス" ++ ++msgid "Block list enabled" ++msgstr "ブロックリストを有効ã«ã™ã‚‹" ++ ++msgid "Blocklist URL" ++msgstr "ブロックリスト URL" ++ ++msgid "Blocklists" ++msgstr "ブロックリスト" ++ ++msgid "Cache size in MB" ++msgstr "キャッシュサイズ (MB)" ++ ++msgid "Config file directory" ++msgstr "コンフィグファイル・ディレクトリ" ++ ++msgid "DHT enabled" ++msgstr "DHTを有効ã«ã™ã‚‹" ++ ++msgid "Debug" ++msgstr "デãƒãƒƒã‚°æƒ…å ±" ++ ++msgid "Download directory" ++msgstr "ダウンロード先ã®ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒª" ++ ++msgid "Download queue enabled" ++msgstr "ダウンロード・キュー機能を有効ã«ã™ã‚‹" ++ ++msgid "Download queue size" ++msgstr "ダウンロード・キューã®ã‚µã‚¤ã‚º" ++ ++msgid "Enable watch directory" ++msgstr "ディレクトリ監視機能を有効ã«ã™ã‚‹" ++ ++msgid "Enabled" ++msgstr "サービスを有効ã«ã™ã‚‹" ++ ++msgid "Encryption" ++msgstr "æš—å·åŒ–" ++ ++msgid "Error" ++msgstr "エラー情報" ++ ++msgid "Fast" ++msgstr "" ++ ++msgid "Files and Locations" ++msgstr "ファイルãŠã‚ˆã³ãƒ­ã‚±ãƒ¼ã‚·ãƒ§ãƒ³è¨­å®š" ++ ++msgid "Forced" ++msgstr "強制ã™ã‚‹" ++ ++msgid "Full" ++msgstr "" ++ ++msgid "Global peer limit" ++msgstr "全体ã®æœ€å¤§ãƒ”ア数" ++ ++msgid "Global settings" ++msgstr "グローãƒãƒ«è¨­å®š" ++ ++msgid "Idle seeding limit" ++msgstr "" ++ ++msgid "Idle seeding limit enabled" ++msgstr "" ++ ++msgid "Incomplete directory" ++msgstr "" ++ ++msgid "Incomplete directory enabled" ++msgstr "" ++ ++msgid "Info" ++msgstr "情報" ++ ++msgid "LPD enabled" ++msgstr "LPD を有効ã«ã™ã‚‹" ++ ++msgid "Lazy bitfield enabled" ++msgstr "Lazy bitfield を有効ã«ã™ã‚‹" ++ ++msgid "Message level" ++msgstr "メッセージレベル" ++ ++msgid "Miscellaneous" ++msgstr "詳細設定" ++ ++msgid "None" ++msgstr "ãªã—" ++ ++msgid "" ++"Number/bitfield. Start with 0, then for each day you want the scheduler " ++"enabled, add a value. For Sunday - 1, Monday - 2, Tuesday - 4, Wednesday - " ++"8, Thursday - 16, Friday - 32, Saturday - 64" ++msgstr "" ++ ++msgid "Off" ++msgstr "使用ã—ãªã„" ++ ++msgid "Open Web Interface" ++msgstr "WEBブラウザã§é–‹ã" ++ ++msgid "PEX enabled" ++msgstr "PEX を有効ã«ã™ã‚‹" ++ ++msgid "Peer Port settings" ++msgstr "ピアãƒãƒ¼ãƒˆè¨­å®š" ++ ++msgid "Peer congestion algorithm" ++msgstr "" ++ ++msgid "Peer limit per torrent" ++msgstr "torrent 毎ã®æœ€å¤§ãƒ”ア数" ++ ++msgid "Peer port" ++msgstr "ピアãƒãƒ¼ãƒˆ" ++ ++msgid "Peer port random high" ++msgstr "ãƒãƒ¼ãƒˆã‚’ランダムã«é¸æŠžã™ã‚‹éš›ã®ä¸Šé™å€¤" ++ ++msgid "Peer port random low" ++msgstr "ãƒãƒ¼ãƒˆã‚’ランダムã«é¸æŠžã™ã‚‹éš›ã®ä¸‹é™å€¤" ++ ++msgid "Peer port random on start" ++msgstr "サービススタート時ã«ãƒãƒ¼ãƒˆã‚’ランダムã«é¸æŠžã™ã‚‹" ++ ++msgid "Peer settings" ++msgstr "ピア設定" ++ ++msgid "Peer socket tos" ++msgstr "ピアソケットã®TOS" ++ ++msgid "Port forwarding enabled" ++msgstr "ãƒãƒ¼ãƒˆè»¢é€ã‚’有効ã«ã™ã‚‹" ++ ++msgid "Preferred" ++msgstr "優先ã™ã‚‹" ++ ++msgid "Prefetch enabled" ++msgstr "" ++ ++msgid "Queue stalled enabled" ++msgstr "" ++ ++msgid "Queue stalled minutes" ++msgstr "" ++ ++msgid "Queueing" ++msgstr "キューイング設定" ++ ++msgid "RPC URL" ++msgstr "RPC URL" ++ ++msgid "RPC authentication required" ++msgstr "RPC èªè¨¼æ©Ÿèƒ½ã‚’有効ã«ã™ã‚‹" ++ ++msgid "RPC bind address" ++msgstr "RPC ãƒã‚¤ãƒ³ãƒ‰ã‚¢ãƒ‰ãƒ¬ã‚¹" ++ ++msgid "RPC enabled" ++msgstr "RPC機能を有効ã«ã™ã‚‹" ++ ++msgid "RPC password" ++msgstr "RPC パスワード" ++ ++msgid "RPC port" ++msgstr "RPC ãƒãƒ¼ãƒˆ" ++ ++msgid "RPC settings" ++msgstr "RPC 設定" ++ ++msgid "RPC username" ++msgstr "RPC ユーザーå" ++ ++msgid "RPC whitelist" ++msgstr "RPC ホワイトリスト" ++ ++msgid "RPC whitelist enabled" ++msgstr "RPC ホワイトリスト機能を有効ã«ã™ã‚‹" ++ ++msgid "Ratio limit" ++msgstr "" ++ ++msgid "Ratio limit enabled" ++msgstr "" ++ ++msgid "Rename partial files" ++msgstr "" ++ ++msgid "Run daemon as user" ++msgstr "デーモンã®ãƒ¦ãƒ¼ã‚¶ãƒ¼æ¨©é™è¨­å®š" ++ ++msgid "Scheduling" ++msgstr "スケジューラ設定" ++ ++msgid "Scrape paused torrents enabled" ++msgstr "" ++ ++msgid "Script torrent done enabled" ++msgstr "torrent 完了時ã«ã‚¹ã‚¯ãƒªãƒ—トを実行ã™ã‚‹" ++ ++msgid "Script torrent done filename" ++msgstr "torrent 完了時ã«å®Ÿè¡Œã™ã‚‹ã‚¹ã‚¯ãƒªãƒ—ト・ファイルパス" ++ ++msgid "Seed queue enabled" ++msgstr "" ++ ++msgid "Seed queue size" ++msgstr "" ++ ++msgid "Speed limit down" ++msgstr "下り速度制é™" ++ ++msgid "Speed limit down enabled" ++msgstr "下り速度制é™æ©Ÿèƒ½ã‚’有効ã«ã™ã‚‹" ++ ++msgid "Speed limit up" ++msgstr "上り速度制é™" ++ ++msgid "Speed limit up enabled" ++msgstr "上り速度制é™æ©Ÿèƒ½ã‚’有効ã«ã™ã‚‹" ++ ++msgid "Transmission" ++msgstr "Transmission" ++ ++msgid "" ++"Transmission daemon is a simple bittorrent client, here you can configure " ++"the settings." ++msgstr "Transmissionã¯ã€ã‚·ãƒ³ãƒ—ルãªbittorrentクライアントã§ã™ã€‚" ++ ++msgid "Trash original torrent files" ++msgstr "オリジナルã®torrent ファイルをゴミ箱ã«ç§»å‹•ã™ã‚‹" ++ ++msgid "Upload slots per torrent" ++msgstr "" ++ ++msgid "Watch directory" ++msgstr "監視ã™ã‚‹ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒª" ++ ++msgid "in minutes from midnight" ++msgstr "" ++ ++msgid "preallocation" ++msgstr "" ++ ++msgid "uTP enabled" ++msgstr "uTP を有効ã«ã™ã‚‹" +diff --git a/feeds/luci/applications/luci-app-transmission/po/ms/transmission.po b/feeds/luci/applications/luci-app-transmission/po/ms/transmission.po +new file mode 100644 +index 0000000..3125fc2 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-transmission/po/ms/transmission.po +@@ -0,0 +1,280 @@ ++msgid "Alternative download speed" ++msgstr "" ++ ++msgid "Alternative speed enabled" ++msgstr "" ++ ++msgid "Alternative speed time begin" ++msgstr "" ++ ++msgid "Alternative speed time day" ++msgstr "" ++ ++msgid "Alternative speed time end" ++msgstr "" ++ ++msgid "Alternative speed timing enabled" ++msgstr "" ++ ++msgid "Alternative upload speed" ++msgstr "" ++ ++msgid "Automatically start added torrents" ++msgstr "" ++ ++msgid "Bandwidth settings" ++msgstr "" ++ ++msgid "Binding address IPv4" ++msgstr "" ++ ++msgid "Binding address IPv6" ++msgstr "" ++ ++msgid "Block list enabled" ++msgstr "" ++ ++msgid "Blocklist URL" ++msgstr "" ++ ++msgid "Blocklists" ++msgstr "" ++ ++msgid "Cache size in MB" ++msgstr "" ++ ++msgid "Config file directory" ++msgstr "" ++ ++msgid "DHT enabled" ++msgstr "" ++ ++msgid "Debug" ++msgstr "" ++ ++msgid "Download directory" ++msgstr "" ++ ++msgid "Download queue enabled" ++msgstr "" ++ ++msgid "Download queue size" ++msgstr "" ++ ++msgid "Enable watch directory" ++msgstr "" ++ ++msgid "Enabled" ++msgstr "" ++ ++msgid "Encryption" ++msgstr "" ++ ++msgid "Error" ++msgstr "" ++ ++msgid "Fast" ++msgstr "" ++ ++msgid "Files and Locations" ++msgstr "" ++ ++msgid "Forced" ++msgstr "" ++ ++msgid "Full" ++msgstr "" ++ ++msgid "Global peer limit" ++msgstr "" ++ ++msgid "Global settings" ++msgstr "" ++ ++msgid "Idle seeding limit" ++msgstr "" ++ ++msgid "Idle seeding limit enabled" ++msgstr "" ++ ++msgid "Incomplete directory" ++msgstr "" ++ ++msgid "Incomplete directory enabled" ++msgstr "" ++ ++msgid "Info" ++msgstr "" ++ ++msgid "LPD enabled" ++msgstr "" ++ ++msgid "Lazy bitfield enabled" ++msgstr "" ++ ++msgid "Message level" ++msgstr "" ++ ++msgid "Miscellaneous" ++msgstr "" ++ ++msgid "None" ++msgstr "" ++ ++msgid "" ++"Number/bitfield. Start with 0, then for each day you want the scheduler " ++"enabled, add a value. For Sunday - 1, Monday - 2, Tuesday - 4, Wednesday - " ++"8, Thursday - 16, Friday - 32, Saturday - 64" ++msgstr "" ++ ++msgid "Off" ++msgstr "" ++ ++msgid "Open Web Interface" ++msgstr "" ++ ++msgid "PEX enabled" ++msgstr "" ++ ++msgid "Peer Port settings" ++msgstr "" ++ ++msgid "Peer congestion algorithm" ++msgstr "" ++ ++msgid "Peer limit per torrent" ++msgstr "" ++ ++msgid "Peer port" ++msgstr "" ++ ++msgid "Peer port random high" ++msgstr "" ++ ++msgid "Peer port random low" ++msgstr "" ++ ++msgid "Peer port random on start" ++msgstr "" ++ ++msgid "Peer settings" ++msgstr "" ++ ++msgid "Peer socket tos" ++msgstr "" ++ ++msgid "Port forwarding enabled" ++msgstr "" ++ ++msgid "Preferred" ++msgstr "" ++ ++msgid "Prefetch enabled" ++msgstr "" ++ ++msgid "Queue stalled enabled" ++msgstr "" ++ ++msgid "Queue stalled minutes" ++msgstr "" ++ ++msgid "Queueing" ++msgstr "" ++ ++msgid "RPC URL" ++msgstr "" ++ ++msgid "RPC authentication required" ++msgstr "" ++ ++msgid "RPC bind address" ++msgstr "" ++ ++msgid "RPC enabled" ++msgstr "" ++ ++msgid "RPC password" ++msgstr "" ++ ++msgid "RPC port" ++msgstr "" ++ ++msgid "RPC settings" ++msgstr "" ++ ++msgid "RPC username" ++msgstr "" ++ ++msgid "RPC whitelist" ++msgstr "" ++ ++msgid "RPC whitelist enabled" ++msgstr "" ++ ++msgid "Ratio limit" ++msgstr "" ++ ++msgid "Ratio limit enabled" ++msgstr "" ++ ++msgid "Rename partial files" ++msgstr "" ++ ++msgid "Run daemon as user" ++msgstr "" ++ ++msgid "Scheduling" ++msgstr "" ++ ++msgid "Scrape paused torrents enabled" ++msgstr "" ++ ++msgid "Script torrent done enabled" ++msgstr "" ++ ++msgid "Script torrent done filename" ++msgstr "" ++ ++msgid "Seed queue enabled" ++msgstr "" ++ ++msgid "Seed queue size" ++msgstr "" ++ ++msgid "Speed limit down" ++msgstr "" ++ ++msgid "Speed limit down enabled" ++msgstr "" ++ ++msgid "Speed limit up" ++msgstr "" ++ ++msgid "Speed limit up enabled" ++msgstr "" ++ ++msgid "Transmission" ++msgstr "" ++ ++msgid "" ++"Transmission daemon is a simple bittorrent client, here you can configure " ++"the settings." ++msgstr "" ++ ++msgid "Trash original torrent files" ++msgstr "" ++ ++msgid "Upload slots per torrent" ++msgstr "" ++ ++msgid "Watch directory" ++msgstr "" ++ ++msgid "in minutes from midnight" ++msgstr "" ++ ++msgid "preallocation" ++msgstr "" ++ ++msgid "uTP enabled" ++msgstr "" +diff --git a/feeds/luci/applications/luci-app-transmission/po/no/transmission.po b/feeds/luci/applications/luci-app-transmission/po/no/transmission.po +new file mode 100644 +index 0000000..cb86841 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-transmission/po/no/transmission.po +@@ -0,0 +1,298 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Report-Msgid-Bugs-To: \n" ++"POT-Creation-Date: 2013-03-25 21:10+0200\n" ++"PO-Revision-Date: 2013-04-05 09:10+0200\n" ++"Last-Translator: protx \n" ++"Language-Team: LANGUAGE \n" ++"Language: no\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n != 1);\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "Alternative download speed" ++msgstr "Alternativ nedlastingshastighet" ++ ++msgid "Alternative speed enabled" ++msgstr "Alternativ hastighet aktivert" ++ ++msgid "Alternative speed time begin" ++msgstr "Alternativ hastighet start tid" ++ ++msgid "Alternative speed time day" ++msgstr "Alternativ hastighet tid pÃ¥ dagen" ++ ++msgid "Alternative speed time end" ++msgstr "Alternativ hastighet tid nÃ¥r ferdig" ++ ++msgid "Alternative speed timing enabled" ++msgstr "Alternativ hastighet tidspunkt aktivert" ++ ++msgid "Alternative upload speed" ++msgstr "Alternativ opplastingshastighet" ++ ++msgid "Automatically start added torrents" ++msgstr "Start automatisk torrents som legges til" ++ ++msgid "Bandwidth settings" ++msgstr "BÃ¥ndbredde innstillinger" ++ ++msgid "Binding address IPv4" ++msgstr "Bindinger IPv4 adresse" ++ ++msgid "Binding address IPv6" ++msgstr "Bindinger IPv6 adresse" ++ ++msgid "Block list enabled" ++msgstr "Blokkeringsliste aktivert" ++ ++msgid "Blocklist URL" ++msgstr "Blokkeringsliste URL" ++ ++msgid "Blocklists" ++msgstr "Blokkeringsliste" ++ ++msgid "Cache size in MB" ++msgstr "Bufferstørrelse i MB" ++ ++msgid "Config file directory" ++msgstr "Mappe for konfigurasjonsfil" ++ ++msgid "DHT enabled" ++msgstr "DHT aktivert" ++ ++msgid "Debug" ++msgstr "Feilsøking" ++ ++msgid "Download directory" ++msgstr "Nedlastingsmappe" ++ ++msgid "Download queue enabled" ++msgstr "Nedlastingkø aktivert" ++ ++msgid "Download queue size" ++msgstr "Nedlastingkø størrelse" ++ ++msgid "Enable watch directory" ++msgstr "Aktiver overvÃ¥king av torrent mappe" ++ ++msgid "Enabled" ++msgstr "Aktivert" ++ ++msgid "Encryption" ++msgstr "Kryptering" ++ ++msgid "Error" ++msgstr "Feil" ++ ++msgid "Fast" ++msgstr "Rask" ++ ++msgid "Files and Locations" ++msgstr "Filer og plasseringer" ++ ++msgid "Forced" ++msgstr "Tvunget" ++ ++msgid "Full" ++msgstr "Full" ++ ++msgid "Global peer limit" ++msgstr "Global peer grense" ++ ++msgid "Global settings" ++msgstr "Globale innstillinger" ++ ++msgid "Idle seeding limit" ++msgstr "Inaktiv seeding grense" ++ ++msgid "Idle seeding limit enabled" ++msgstr "Inaktiv seeding grense aktivert" ++ ++msgid "Incomplete directory" ++msgstr "Ufullstendig mappe" ++ ++msgid "Incomplete directory enabled" ++msgstr "Ufullstendig mappe aktivert" ++ ++msgid "Info" ++msgstr "Info" ++ ++msgid "LPD enabled" ++msgstr "LPD aktivert" ++ ++msgid "Lazy bitfield enabled" ++msgstr "Lazy bitfield aktivert" ++ ++msgid "Message level" ++msgstr "NivÃ¥ for meldinger" ++ ++msgid "Miscellaneous" ++msgstr "Diverse" ++ ++msgid "None" ++msgstr "Ingen" ++ ++msgid "" ++"Number/bitfield. Start with 0, then for each day you want the scheduler " ++"enabled, add a value. For Sunday - 1, Monday - 2, Tuesday - 4, Wednesday - " ++"8, Thursday - 16, Friday - 32, Saturday - 64" ++msgstr "" ++"Nummer/bitfield. Start med 0, og for hver dag en vil at planleggeren skal " ++"være aktivert legger en til en verdi. For Søndag - 1, Mandag - 2, Tirsdag - " ++"4, Onsdag - 8, Torsdag - 16, Fredag - 32, Lørdag - 64" ++ ++msgid "Off" ++msgstr "Av" ++ ++msgid "Open Web Interface" ++msgstr "Ã…pne webgrensesnitt" ++ ++msgid "PEX enabled" ++msgstr "PEX aktivert" ++ ++msgid "Peer Port settings" ++msgstr "Peer port innstillinger" ++ ++msgid "Peer congestion algorithm" ++msgstr "Peer congestion algoritme" ++ ++msgid "Peer limit per torrent" ++msgstr "Peer grense per torrent" ++ ++msgid "Peer port" ++msgstr "Peer port" ++ ++msgid "Peer port random high" ++msgstr "Peer port tilfeldig høy" ++ ++msgid "Peer port random low" ++msgstr "Peer port tilfeldig lav" ++ ++msgid "Peer port random on start" ++msgstr "Peer port tilfeldig ved start" ++ ++msgid "Peer settings" ++msgstr "Peer innstillinger" ++ ++msgid "Peer socket tos" ++msgstr "Peer tilslutning tos" ++ ++msgid "Port forwarding enabled" ++msgstr "Port videresending aktivert" ++ ++msgid "Preferred" ++msgstr "Prioritert" ++ ++msgid "Prefetch enabled" ++msgstr "" ++ ++msgid "Queue stalled enabled" ++msgstr "" ++ ++msgid "Queue stalled minutes" ++msgstr "" ++ ++msgid "Queueing" ++msgstr "" ++ ++msgid "RPC URL" ++msgstr "" ++ ++msgid "RPC authentication required" ++msgstr "" ++ ++msgid "RPC bind address" ++msgstr "" ++ ++msgid "RPC enabled" ++msgstr "" ++ ++msgid "RPC password" ++msgstr "" ++ ++msgid "RPC port" ++msgstr "" ++ ++msgid "RPC settings" ++msgstr "" ++ ++msgid "RPC username" ++msgstr "" ++ ++msgid "RPC whitelist" ++msgstr "" ++ ++msgid "RPC whitelist enabled" ++msgstr "" ++ ++msgid "Ratio limit" ++msgstr "" ++ ++msgid "Ratio limit enabled" ++msgstr "" ++ ++msgid "Rename partial files" ++msgstr "" ++ ++msgid "Run daemon as user" ++msgstr "" ++ ++msgid "Scheduling" ++msgstr "" ++ ++msgid "Scrape paused torrents enabled" ++msgstr "" ++ ++msgid "Script torrent done enabled" ++msgstr "" ++ ++msgid "Script torrent done filename" ++msgstr "" ++ ++msgid "Seed queue enabled" ++msgstr "" ++ ++msgid "Seed queue size" ++msgstr "" ++ ++msgid "Speed limit down" ++msgstr "" ++ ++msgid "Speed limit down enabled" ++msgstr "" ++ ++msgid "Speed limit up" ++msgstr "" ++ ++msgid "Speed limit up enabled" ++msgstr "" ++ ++msgid "Transmission" ++msgstr "" ++ ++msgid "" ++"Transmission daemon is a simple bittorrent client, here you can configure " ++"the settings." ++msgstr "" ++ ++msgid "Trash original torrent files" ++msgstr "" ++ ++msgid "Upload slots per torrent" ++msgstr "" ++ ++msgid "Watch directory" ++msgstr "" ++ ++msgid "in minutes from midnight" ++msgstr "" ++ ++msgid "preallocation" ++msgstr "" ++ ++msgid "uTP enabled" ++msgstr "" +diff --git a/feeds/luci/applications/luci-app-transmission/po/pl/transmission.po b/feeds/luci/applications/luci-app-transmission/po/pl/transmission.po +new file mode 100644 +index 0000000..f010d56 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-transmission/po/pl/transmission.po +@@ -0,0 +1,302 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Report-Msgid-Bugs-To: \n" ++"POT-Creation-Date: 2012-04-19 21:20+0200\n" ++"PO-Revision-Date: 2014-02-25 18:13+0200\n" ++"Last-Translator: TheTranslator2238 \n" ++"Language-Team: LANGUAGE \n" ++"Language: pl\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 " ++"|| n%100>=20) ? 1 : 2);\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "Alternative download speed" ++msgstr "Alternatywna prÄ™dkość pobierania" ++ ++msgid "Alternative speed enabled" ++msgstr "PrÄ™dkość alternatywna wÅ‚Ä…czona" ++ ++msgid "Alternative speed time begin" ++msgstr "Godzina wÅ‚Ä…czenia prÄ™dkoÅ›ci alternatywnej" ++ ++msgid "Alternative speed time day" ++msgstr "DzieÅ„ prÄ™dkoÅ›ci alternatywnej" ++ ++msgid "Alternative speed time end" ++msgstr "Godzina wyÅ‚Ä…czenia prÄ™dkoÅ›ci alternatywnej" ++ ++msgid "Alternative speed timing enabled" ++msgstr "WÅ‚Ä…czanie prÄ™dkoÅ›ci alternatywnej w podanym czasie" ++ ++msgid "Alternative upload speed" ++msgstr "Alternatywna prÄ™dkość wysyÅ‚ania" ++ ++msgid "Automatically start added torrents" ++msgstr "Automatyczne rozpoczÄ™cie pobierania nowych torrentów" ++ ++msgid "Bandwidth settings" ++msgstr "Ustawienia przepustowoÅ›ci" ++ ++msgid "Binding address IPv4" ++msgstr "Przypisanie adresu IPv4" ++ ++msgid "Binding address IPv6" ++msgstr "Przypisanie adresu IPv6" ++ ++msgid "Block list enabled" ++msgstr "Lista blokowania wÅ‚Ä…czona" ++ ++msgid "Blocklist URL" ++msgstr "URL listy blokowania" ++ ++msgid "Blocklists" ++msgstr "Listy blokowania" ++ ++msgid "Cache size in MB" ++msgstr "Wielkość cache w MB" ++ ++msgid "Config file directory" ++msgstr "Katalog z plikiem konfiguracyjnym" ++ ++msgid "DHT enabled" ++msgstr "DHT wÅ‚Ä…czone" ++ ++msgid "Debug" ++msgstr "Debug" ++ ++msgid "Download directory" ++msgstr "Katalog pobierania" ++ ++msgid "Download queue enabled" ++msgstr "Kolejka pobierania wÅ‚Ä…czona" ++ ++msgid "Download queue size" ++msgstr "Rozmiar kolejki pobierania" ++ ++msgid "Enable watch directory" ++msgstr "WÅ‚Ä…cz folder obserwowany" ++ ++msgid "Enabled" ++msgstr "WÅ‚Ä…czone" ++ ++msgid "Encryption" ++msgstr "Szyfrowanie" ++ ++msgid "Error" ++msgstr "BÅ‚Ä…d" ++ ++msgid "Fast" ++msgstr "Szybko" ++ ++msgid "Files and Locations" ++msgstr "Pliki i poÅ‚ożenia" ++ ++msgid "Forced" ++msgstr "Wymuszone" ++ ++msgid "Full" ++msgstr "PeÅ‚ne" ++ ++msgid "Global peer limit" ++msgstr "Globalny limit peerów" ++ ++msgid "Global settings" ++msgstr "Ustawienia globalne" ++ ++msgid "Idle seeding limit" ++msgstr "Limit przesyÅ‚u w bezczynnoÅ›ci" ++ ++msgid "Idle seeding limit enabled" ++msgstr "WÅ‚Ä…czony limit transferu podczas bezczynnoÅ›ci" ++ ++msgid "Incomplete directory" ++msgstr "Niekompletny katalog" ++ ++msgid "Incomplete directory enabled" ++msgstr "Opcja \"Niekompletny katalog\" wÅ‚Ä…czona" ++ ++msgid "Info" ++msgstr "Info" ++ ++msgid "LPD enabled" ++msgstr "LPD wÅ‚Ä…czone" ++ ++msgid "Lazy bitfield enabled" ++msgstr "Lazy bitfield wÅ‚Ä…czone" ++ ++msgid "Message level" ++msgstr "Poziom komunikatów" ++ ++msgid "Miscellaneous" ++msgstr "RóżnoÅ›ci" ++ ++msgid "None" ++msgstr "Å»aden" ++ ++msgid "" ++"Number/bitfield. Start with 0, then for each day you want the scheduler " ++"enabled, add a value. For Sunday - 1, Monday - 2, Tuesday - 4, Wednesday - " ++"8, Thursday - 16, Friday - 32, Saturday - 64" ++msgstr "" ++"Liczba/pole bitowe. Zaczyna siÄ™ od 0, nastÄ™pnie dla każdego dnia dla jakiego " ++"chcesz wÅ‚Ä…czyć harmonogram dodaj odpowiedniÄ… wartość. Niedziela - 1, " ++"PoniedziaÅ‚ek - 2, Wtorek - 4, Åšroda - 8, Czwartek - 16, PiÄ…tek - 32, sobota " ++"- 64." ++ ++msgid "Off" ++msgstr "WyÅ‚Ä…czone" ++ ++msgid "Open Web Interface" ++msgstr "Otwórz interfejs Web" ++ ++msgid "PEX enabled" ++msgstr "PEX wÅ‚Ä…czony" ++ ++msgid "Peer Port settings" ++msgstr "Ustawienia portu peer" ++ ++msgid "Peer congestion algorithm" ++msgstr "Algorytm przeciążenia peer" ++ ++msgid "Peer limit per torrent" ++msgstr "Limit peer'a dla torrenta" ++ ++msgid "Peer port" ++msgstr "Port peer" ++ ++msgid "Peer port random high" ++msgstr "Maksymalny port peer`a" ++ ++msgid "Peer port random low" ++msgstr "Minimalny port peer`a" ++ ++msgid "Peer port random on start" ++msgstr "Losowy port peer`a przy starcie" ++ ++msgid "Peer settings" ++msgstr "Ustawienia peer" ++ ++msgid "Peer socket tos" ++msgstr "Typ gniazda TOS peer`a" ++ ++msgid "Port forwarding enabled" ++msgstr "Przekazywanie portów wÅ‚Ä…czone" ++ ++msgid "Preferred" ++msgstr "Preferowany" ++ ++msgid "Prefetch enabled" ++msgstr "Pobieranie wstÄ™pne wÅ‚Ä…czone" ++ ++msgid "Queue stalled enabled" ++msgstr "Blokada kolejki wÅ‚Ä…czona" ++ ++msgid "Queue stalled minutes" ++msgstr "Blokada kolejki w min." ++ ++msgid "Queueing" ++msgstr "Kolejkowanie" ++ ++msgid "RPC URL" ++msgstr "Adres URL RPC" ++ ++msgid "RPC authentication required" ++msgstr "Wymagana autoryzacja RPC" ++ ++msgid "RPC bind address" ++msgstr "Adres wÄ™zÅ‚a RPC" ++ ++msgid "RPC enabled" ++msgstr "RPC wÅ‚Ä…czone" ++ ++msgid "RPC password" ++msgstr "HasÅ‚o RPC" ++ ++msgid "RPC port" ++msgstr "Port RPC" ++ ++msgid "RPC settings" ++msgstr "Ustawienia RPC" ++ ++msgid "RPC username" ++msgstr "Nazwa użytkownika RPC" ++ ++msgid "RPC whitelist" ++msgstr "BiaÅ‚a lista RPC" ++ ++msgid "RPC whitelist enabled" ++msgstr "BiaÅ‚a lista RPC wÅ‚Ä…czona" ++ ++msgid "Ratio limit" ++msgstr "Dopuszczalna wartość" ++ ++msgid "Ratio limit enabled" ++msgstr "Dopuszczalna wartość wÅ‚Ä…czona" ++ ++msgid "Rename partial files" ++msgstr "ZmieÅ„ nazwy plików częściowych" ++ ++msgid "Run daemon as user" ++msgstr "WÅ‚Ä…czaj demona jako użytkownik" ++ ++msgid "Scheduling" ++msgstr "Harmonogramowanie" ++ ++msgid "Scrape paused torrents enabled" ++msgstr "Zdzieranie wstrzymanych torentów wÅ‚Ä…czone" ++ ++msgid "Script torrent done enabled" ++msgstr "WÅ‚Ä…czenie wykonywania skryptu po zakoÅ„czeniu pobierania" ++ ++msgid "Script torrent done filename" ++msgstr "Nazwa skryptu wykonywanego po zakoÅ„czeniu pobierania" ++ ++msgid "Seed queue enabled" ++msgstr "Kolejkowanie Seed'ów wÅ‚Ä…czone" ++ ++msgid "Seed queue size" ++msgstr "Rozmiar kolejki Seed'ów" ++ ++msgid "Speed limit down" ++msgstr "Limit prÄ™dkoÅ›ci pobierania" ++ ++msgid "Speed limit down enabled" ++msgstr "Limit prÄ™dkoÅ›ci pobierania wÅ‚Ä…czony" ++ ++msgid "Speed limit up" ++msgstr "Limit prÄ™dkoÅ›ci wysyÅ‚ania" ++ ++msgid "Speed limit up enabled" ++msgstr "Limit prÄ™dkoÅ›ci wysyÅ‚ania wÅ‚Ä…czony" ++ ++msgid "Transmission" ++msgstr "Transmission" ++ ++msgid "" ++"Transmission daemon is a simple bittorrent client, here you can configure " ++"the settings." ++msgstr "" ++"Demon Transmission jest prostym klientem BitTorrent. Tutaj możesz zmienić " ++"jego ustawienia." ++ ++msgid "Trash original torrent files" ++msgstr "UsuÅ„ oryginalne pliki torrent" ++ ++msgid "Upload slots per torrent" ++msgstr "Liczba poÅ‚Ä…czeÅ„ na plik torrent - wysyÅ‚anie" ++ ++msgid "Watch directory" ++msgstr "Obserwowany folder" ++ ++msgid "in minutes from midnight" ++msgstr "w minutach od północy" ++ ++msgid "preallocation" ++msgstr "prealokacja" ++ ++msgid "uTP enabled" ++msgstr "uTP wÅ‚Ä…czone" +diff --git a/feeds/luci/applications/luci-app-transmission/po/pt-br/transmission.po b/feeds/luci/applications/luci-app-transmission/po/pt-br/transmission.po +new file mode 100644 +index 0000000..82ba6a4 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-transmission/po/pt-br/transmission.po +@@ -0,0 +1,300 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Report-Msgid-Bugs-To: \n" ++"POT-Creation-Date: 2012-07-06 16:27+0200\n" ++"PO-Revision-Date: 2013-04-06 22:58+0200\n" ++"Last-Translator: Luiz Angelo \n" ++"Language-Team: LANGUAGE \n" ++"Language: pt_BR\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n > 1);\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "Alternative download speed" ++msgstr "Velocidade alternativa para baixar" ++ ++msgid "Alternative speed enabled" ++msgstr "Velocidade alternativa ativada" ++ ++msgid "Alternative speed time begin" ++msgstr "Hora de início da velocidade alternativa" ++ ++msgid "Alternative speed time day" ++msgstr "Dia da velocidade alternativa" ++ ++msgid "Alternative speed time end" ++msgstr "Hora final da velocidade alternativa" ++ ++msgid "Alternative speed timing enabled" ++msgstr "Temporização da velocidade alternativa habilitada" ++ ++msgid "Alternative upload speed" ++msgstr "Velocidade de subida alternativa" ++ ++msgid "Automatically start added torrents" ++msgstr "Iniciar automaticamente os torrents adicionados" ++ ++msgid "Bandwidth settings" ++msgstr "Configurações da velocidade do enlace" ++ ++msgid "Binding address IPv4" ++msgstr "Endereço de escuta IPv4" ++ ++msgid "Binding address IPv6" ++msgstr "Endereço de escuta IPv6" ++ ++msgid "Block list enabled" ++msgstr "Lista de Bloqueios habilitada" ++ ++msgid "Blocklist URL" ++msgstr "URL da lista de bloqueio" ++ ++msgid "Blocklists" ++msgstr "Lista de Bloqueio" ++ ++msgid "Cache size in MB" ++msgstr "Tamanho em MB do cache" ++ ++msgid "Config file directory" ++msgstr "Diretório dos arquivos de configuração" ++ ++msgid "DHT enabled" ++msgstr "DHT habilitado" ++ ++msgid "Debug" ++msgstr "Depuração" ++ ++msgid "Download directory" ++msgstr "Diretório de arquivos baixados" ++ ++msgid "Download queue enabled" ++msgstr "Fila para baixar habilitada" ++ ++msgid "Download queue size" ++msgstr "Tamanho da fila para baixar" ++ ++msgid "Enable watch directory" ++msgstr "Habilitar monitoramento de diretório" ++ ++msgid "Enabled" ++msgstr "Habilitar" ++ ++msgid "Encryption" ++msgstr "Cifragem" ++ ++msgid "Error" ++msgstr "Erro" ++ ++msgid "Fast" ++msgstr "Rápido" ++ ++msgid "Files and Locations" ++msgstr "Arquivos e Locais" ++ ++msgid "Forced" ++msgstr "Forçado" ++ ++msgid "Full" ++msgstr "Cheio" ++ ++msgid "Global peer limit" ++msgstr "Limite global de parceiros conectados" ++ ++msgid "Global settings" ++msgstr "Configurações Globais" ++ ++msgid "Idle seeding limit" ++msgstr "Limite para parar de semear se ocioso" ++ ++msgid "Idle seeding limit enabled" ++msgstr "Habilitar limite para parar de semear se ocioso" ++ ++msgid "Incomplete directory" ++msgstr "Diretório de incompletos" ++ ++msgid "Incomplete directory enabled" ++msgstr "Ativado diretório para arquivos incompletos" ++ ++msgid "Info" ++msgstr "Informação" ++ ++msgid "LPD enabled" ++msgstr "LPD habilitado" ++ ++msgid "Lazy bitfield enabled" ++msgstr "Envio de campo de bits incompletos habilitado" ++ ++msgid "Message level" ++msgstr "Nível de mensagens" ++ ++msgid "Miscellaneous" ++msgstr "Diversos" ++ ++msgid "None" ++msgstr "Nada" ++ ++msgid "" ++"Number/bitfield. Start with 0, then for each day you want the scheduler " ++"enabled, add a value. For Sunday - 1, Monday - 2, Tuesday - 4, Wednesday - " ++"8, Thursday - 16, Friday - 32, Saturday - 64" ++msgstr "" ++"Número/Campo de bits. Comece com 0 e, então, para cada dia você quer o " ++"agendador habilitado, adicione um valor. Para domingo - 1, segunda-feira - " ++"2, terça-feira - 4, quarta-feira - 8, quinta-feira - 16, sexta-feira - 32, " ++"Sábado - 64" ++ ++msgid "Off" ++msgstr "Desligado" ++ ++msgid "Open Web Interface" ++msgstr "Abrir interface Web" ++ ++msgid "PEX enabled" ++msgstr "PEX habilitado" ++ ++msgid "Peer Port settings" ++msgstr "Configuração de porta do parceiro" ++ ++msgid "Peer congestion algorithm" ++msgstr "Algoritmo de congestionamento dos parceiro" ++ ++msgid "Peer limit per torrent" ++msgstr "Limite de torrents por parceiro" ++ ++msgid "Peer port" ++msgstr "Porta do parceiro" ++ ++msgid "Peer port random high" ++msgstr "Limite superior da porta aleatória do parceiro" ++ ++msgid "Peer port random low" ++msgstr "Limite inferior da porta aleatória do parceiro" ++ ++msgid "Peer port random on start" ++msgstr "Porta aleatória inicial do parceiro" ++ ++msgid "Peer settings" ++msgstr "Configuração do parceiro" ++ ++msgid "Peer socket tos" ++msgstr "TOS da conexão do parceiro" ++ ++msgid "Port forwarding enabled" ++msgstr "Encaminhamento de porta ativado" ++ ++msgid "Preferred" ++msgstr "Preferencial" ++ ++msgid "Prefetch enabled" ++msgstr "Adiantamento de leitura de disco habilitado" ++ ++msgid "Queue stalled enabled" ++msgstr "Parada de fila habilitada" ++ ++msgid "Queue stalled minutes" ++msgstr "Parada de fila em minutos" ++ ++msgid "Queueing" ++msgstr "Filas" ++ ++msgid "RPC URL" ++msgstr "RPC URL" ++ ++msgid "RPC authentication required" ++msgstr "RPC requer autenticação" ++ ++msgid "RPC bind address" ++msgstr "Endereço de escuta do RPC" ++ ++msgid "RPC enabled" ++msgstr "RPC habilitado" ++ ++msgid "RPC password" ++msgstr "Senha do RPC" ++ ++msgid "RPC port" ++msgstr "Porta do RPC" ++ ++msgid "RPC settings" ++msgstr "Configuração do RPC" ++ ++msgid "RPC username" ++msgstr "Nome do usuario do RPC" ++ ++msgid "RPC whitelist" ++msgstr "Lista branca do RPC" ++ ++msgid "RPC whitelist enabled" ++msgstr "Lista branca do RPC habilitada" ++ ++msgid "Ratio limit" ++msgstr "Limite da relação" ++ ++msgid "Ratio limit enabled" ++msgstr "Limite da relação habilitado" ++ ++msgid "Rename partial files" ++msgstr "Renomear arquivos parciais" ++ ++msgid "Run daemon as user" ++msgstr "Executar serviço como usuário" ++ ++msgid "Scheduling" ++msgstr "Agendamento" ++ ++msgid "Scrape paused torrents enabled" ++msgstr "Busca de informações de torrents pausados ​​habilitada" ++ ++msgid "Script torrent done enabled" ++msgstr "Script de conclusão de torrent habilitado" ++ ++msgid "Script torrent done filename" ++msgstr "Nome do arquivo do script de conclusão de torrent" ++ ++msgid "Seed queue enabled" ++msgstr "Fila de semeadura habilitada" ++ ++msgid "Seed queue size" ++msgstr "Tamanho da fila de semeadura" ++ ++msgid "Speed limit down" ++msgstr "Limite inferior de velocidade" ++ ++msgid "Speed limit down enabled" ++msgstr "Limite inferior de velocidade habilitado" ++ ++msgid "Speed limit up" ++msgstr "Limite superior de velocidade" ++ ++msgid "Speed limit up enabled" ++msgstr "Limite superior de velocidade habilitado" ++ ++msgid "Transmission" ++msgstr "Transmission" ++ ++msgid "" ++"Transmission daemon is a simple bittorrent client, here you can configure " ++"the settings." ++msgstr "" ++"O Transmission é um cliente BitTorrent simples, aqui você pode configurá-lo." ++ ++msgid "Trash original torrent files" ++msgstr "Apague os arquivos torrent originais" ++ ++msgid "Upload slots per torrent" ++msgstr "Vagas para conexão de envio por torrent" ++ ++msgid "Watch directory" ++msgstr "Monitorar diretório" ++ ++msgid "in minutes from midnight" ++msgstr "em minutos a partir da meia-noite" ++ ++msgid "preallocation" ++msgstr "pré-alocação" ++ ++msgid "uTP enabled" ++msgstr "uTP habilitado" +diff --git a/feeds/luci/applications/luci-app-transmission/po/pt/transmission.po b/feeds/luci/applications/luci-app-transmission/po/pt/transmission.po +new file mode 100644 +index 0000000..512ca97 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-transmission/po/pt/transmission.po +@@ -0,0 +1,297 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Report-Msgid-Bugs-To: \n" ++"POT-Creation-Date: 2013-05-31 23:40+0200\n" ++"PO-Revision-Date: 2013-05-31 23:47+0200\n" ++"Last-Translator: joao.f.vieira \n" ++"Language-Team: LANGUAGE \n" ++"Language: pt\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n != 1);\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "Alternative download speed" ++msgstr "Velocidade de download alternativa" ++ ++msgid "Alternative speed enabled" ++msgstr "Velocidade alternativa activada" ++ ++msgid "Alternative speed time begin" ++msgstr "" ++ ++msgid "Alternative speed time day" ++msgstr "" ++ ++msgid "Alternative speed time end" ++msgstr "" ++ ++msgid "Alternative speed timing enabled" ++msgstr "" ++ ++msgid "Alternative upload speed" ++msgstr "" ++ ++msgid "Automatically start added torrents" ++msgstr "" ++ ++msgid "Bandwidth settings" ++msgstr "Definições de largura de banda" ++ ++msgid "Binding address IPv4" ++msgstr "" ++ ++msgid "Binding address IPv6" ++msgstr "" ++ ++msgid "Block list enabled" ++msgstr "" ++ ++msgid "Blocklist URL" ++msgstr "" ++ ++msgid "Blocklists" ++msgstr "" ++ ++msgid "Cache size in MB" ++msgstr "" ++ ++msgid "Config file directory" ++msgstr "Directório do ficheiro de configuração" ++ ++msgid "DHT enabled" ++msgstr "" ++ ++msgid "Debug" ++msgstr "Depurar" ++ ++msgid "Download directory" ++msgstr "" ++ ++msgid "Download queue enabled" ++msgstr "" ++ ++msgid "Download queue size" ++msgstr "" ++ ++msgid "Enable watch directory" ++msgstr "" ++ ++msgid "Enabled" ++msgstr "" ++ ++msgid "Encryption" ++msgstr "Encriptação" ++ ++msgid "Error" ++msgstr "Erro" ++ ++msgid "Fast" ++msgstr "Rápido" ++ ++msgid "Files and Locations" ++msgstr "Ficheiros e Localizações" ++ ++msgid "Forced" ++msgstr "Forçado" ++ ++msgid "Full" ++msgstr "" ++ ++msgid "Global peer limit" ++msgstr "" ++ ++msgid "Global settings" ++msgstr "" ++ ++msgid "Idle seeding limit" ++msgstr "" ++ ++msgid "Idle seeding limit enabled" ++msgstr "" ++ ++msgid "Incomplete directory" ++msgstr "" ++ ++msgid "Incomplete directory enabled" ++msgstr "" ++ ++msgid "Info" ++msgstr "Info" ++ ++msgid "LPD enabled" ++msgstr "" ++ ++msgid "Lazy bitfield enabled" ++msgstr "" ++ ++msgid "Message level" ++msgstr "" ++ ++msgid "Miscellaneous" ++msgstr "" ++ ++msgid "None" ++msgstr "Nenhum" ++ ++msgid "" ++"Number/bitfield. Start with 0, then for each day you want the scheduler " ++"enabled, add a value. For Sunday - 1, Monday - 2, Tuesday - 4, Wednesday - " ++"8, Thursday - 16, Friday - 32, Saturday - 64" ++msgstr "" ++ ++msgid "Off" ++msgstr "Desligado" ++ ++msgid "Open Web Interface" ++msgstr "Abrir Interface Web" ++ ++msgid "PEX enabled" ++msgstr "PEX ativado" ++ ++msgid "Peer Port settings" ++msgstr "" ++ ++msgid "Peer congestion algorithm" ++msgstr "" ++ ++msgid "Peer limit per torrent" ++msgstr "" ++ ++msgid "Peer port" ++msgstr "" ++ ++msgid "Peer port random high" ++msgstr "" ++ ++msgid "Peer port random low" ++msgstr "" ++ ++msgid "Peer port random on start" ++msgstr "" ++ ++msgid "Peer settings" ++msgstr "" ++ ++msgid "Peer socket tos" ++msgstr "" ++ ++msgid "Port forwarding enabled" ++msgstr "" ++ ++msgid "Preferred" ++msgstr "" ++ ++msgid "Prefetch enabled" ++msgstr "" ++ ++msgid "Queue stalled enabled" ++msgstr "" ++ ++msgid "Queue stalled minutes" ++msgstr "" ++ ++msgid "Queueing" ++msgstr "" ++ ++msgid "RPC URL" ++msgstr "URL RPC" ++ ++msgid "RPC authentication required" ++msgstr "" ++ ++msgid "RPC bind address" ++msgstr "" ++ ++msgid "RPC enabled" ++msgstr "RPC ativado" ++ ++msgid "RPC password" ++msgstr "Password RPC" ++ ++msgid "RPC port" ++msgstr "Porta RPC" ++ ++msgid "RPC settings" ++msgstr "Definições RPC" ++ ++msgid "RPC username" ++msgstr "Utilizador RPC" ++ ++msgid "RPC whitelist" ++msgstr "" ++ ++msgid "RPC whitelist enabled" ++msgstr "" ++ ++msgid "Ratio limit" ++msgstr "" ++ ++msgid "Ratio limit enabled" ++msgstr "" ++ ++msgid "Rename partial files" ++msgstr "" ++ ++msgid "Run daemon as user" ++msgstr "Executar serviço como" ++ ++msgid "Scheduling" ++msgstr "Agendamento" ++ ++msgid "Scrape paused torrents enabled" ++msgstr "" ++ ++msgid "Script torrent done enabled" ++msgstr "" ++ ++msgid "Script torrent done filename" ++msgstr "" ++ ++msgid "Seed queue enabled" ++msgstr "" ++ ++msgid "Seed queue size" ++msgstr "" ++ ++msgid "Speed limit down" ++msgstr "" ++ ++msgid "Speed limit down enabled" ++msgstr "" ++ ++msgid "Speed limit up" ++msgstr "" ++ ++msgid "Speed limit up enabled" ++msgstr "" ++ ++msgid "Transmission" ++msgstr "" ++ ++msgid "" ++"Transmission daemon is a simple bittorrent client, here you can configure " ++"the settings." ++msgstr "" ++"Transmission é um client simples de bittorrent, aqui pode configurar as " ++"definições." ++ ++msgid "Trash original torrent files" ++msgstr "" ++ ++msgid "Upload slots per torrent" ++msgstr "" ++ ++msgid "Watch directory" ++msgstr "" ++ ++msgid "in minutes from midnight" ++msgstr "" ++ ++msgid "preallocation" ++msgstr "" ++ ++msgid "uTP enabled" ++msgstr "" +diff --git a/feeds/luci/applications/luci-app-transmission/po/ro/transmission.po b/feeds/luci/applications/luci-app-transmission/po/ro/transmission.po +new file mode 100644 +index 0000000..8e0fc7d +--- /dev/null ++++ b/feeds/luci/applications/luci-app-transmission/po/ro/transmission.po +@@ -0,0 +1,296 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Report-Msgid-Bugs-To: \n" ++"POT-Creation-Date: 2013-09-25 19:17+0200\n" ++"PO-Revision-Date: 2014-06-28 19:26+0200\n" ++"Last-Translator: xxvirusxx \n" ++"Language-Team: LANGUAGE \n" ++"Language: ro\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=3; plural=(n==1 ? 0 : (n==0 || (n%100 > 0 && n%100 < " ++"20)) ? 1 : 2);;\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "Alternative download speed" ++msgstr "Viteză de download alternativă" ++ ++msgid "Alternative speed enabled" ++msgstr "Viteză alternativă activată" ++ ++msgid "Alternative speed time begin" ++msgstr "" ++ ++msgid "Alternative speed time day" ++msgstr "" ++ ++msgid "Alternative speed time end" ++msgstr "" ++ ++msgid "Alternative speed timing enabled" ++msgstr "" ++ ++msgid "Alternative upload speed" ++msgstr "Viteza de upload alternativa" ++ ++msgid "Automatically start added torrents" ++msgstr "" ++ ++msgid "Bandwidth settings" ++msgstr "Setari latime de banda" ++ ++msgid "Binding address IPv4" ++msgstr "" ++ ++msgid "Binding address IPv6" ++msgstr "" ++ ++msgid "Block list enabled" ++msgstr "" ++ ++msgid "Blocklist URL" ++msgstr "" ++ ++msgid "Blocklists" ++msgstr "" ++ ++msgid "Cache size in MB" ++msgstr "" ++ ++msgid "Config file directory" ++msgstr "" ++ ++msgid "DHT enabled" ++msgstr "" ++ ++msgid "Debug" ++msgstr "" ++ ++msgid "Download directory" ++msgstr "" ++ ++msgid "Download queue enabled" ++msgstr "" ++ ++msgid "Download queue size" ++msgstr "" ++ ++msgid "Enable watch directory" ++msgstr "" ++ ++msgid "Enabled" ++msgstr "Activat" ++ ++msgid "Encryption" ++msgstr "Criptare" ++ ++msgid "Error" ++msgstr "Eroare" ++ ++msgid "Fast" ++msgstr "Rapid" ++ ++msgid "Files and Locations" ++msgstr "FiÅŸiere ÅŸi LocaÅ£ii" ++ ++msgid "Forced" ++msgstr "ForÅ£at" ++ ++msgid "Full" ++msgstr "" ++ ++msgid "Global peer limit" ++msgstr "" ++ ++msgid "Global settings" ++msgstr "Setari globale" ++ ++msgid "Idle seeding limit" ++msgstr "" ++ ++msgid "Idle seeding limit enabled" ++msgstr "" ++ ++msgid "Incomplete directory" ++msgstr "" ++ ++msgid "Incomplete directory enabled" ++msgstr "" ++ ++msgid "Info" ++msgstr "Informatii" ++ ++msgid "LPD enabled" ++msgstr "" ++ ++msgid "Lazy bitfield enabled" ++msgstr "" ++ ++msgid "Message level" ++msgstr "" ++ ++msgid "Miscellaneous" ++msgstr "" ++ ++msgid "None" ++msgstr "" ++ ++msgid "" ++"Number/bitfield. Start with 0, then for each day you want the scheduler " ++"enabled, add a value. For Sunday - 1, Monday - 2, Tuesday - 4, Wednesday - " ++"8, Thursday - 16, Friday - 32, Saturday - 64" ++msgstr "" ++ ++msgid "Off" ++msgstr "" ++ ++msgid "Open Web Interface" ++msgstr "" ++ ++msgid "PEX enabled" ++msgstr "" ++ ++msgid "Peer Port settings" ++msgstr "" ++ ++msgid "Peer congestion algorithm" ++msgstr "" ++ ++msgid "Peer limit per torrent" ++msgstr "" ++ ++msgid "Peer port" ++msgstr "" ++ ++msgid "Peer port random high" ++msgstr "" ++ ++msgid "Peer port random low" ++msgstr "" ++ ++msgid "Peer port random on start" ++msgstr "" ++ ++msgid "Peer settings" ++msgstr "" ++ ++msgid "Peer socket tos" ++msgstr "" ++ ++msgid "Port forwarding enabled" ++msgstr "" ++ ++msgid "Preferred" ++msgstr "Preferat" ++ ++msgid "Prefetch enabled" ++msgstr "" ++ ++msgid "Queue stalled enabled" ++msgstr "" ++ ++msgid "Queue stalled minutes" ++msgstr "" ++ ++msgid "Queueing" ++msgstr "" ++ ++msgid "RPC URL" ++msgstr "" ++ ++msgid "RPC authentication required" ++msgstr "" ++ ++msgid "RPC bind address" ++msgstr "" ++ ++msgid "RPC enabled" ++msgstr "" ++ ++msgid "RPC password" ++msgstr "" ++ ++msgid "RPC port" ++msgstr "" ++ ++msgid "RPC settings" ++msgstr "" ++ ++msgid "RPC username" ++msgstr "" ++ ++msgid "RPC whitelist" ++msgstr "" ++ ++msgid "RPC whitelist enabled" ++msgstr "" ++ ++msgid "Ratio limit" ++msgstr "" ++ ++msgid "Ratio limit enabled" ++msgstr "" ++ ++msgid "Rename partial files" ++msgstr "" ++ ++msgid "Run daemon as user" ++msgstr "" ++ ++msgid "Scheduling" ++msgstr "" ++ ++msgid "Scrape paused torrents enabled" ++msgstr "" ++ ++msgid "Script torrent done enabled" ++msgstr "" ++ ++msgid "Script torrent done filename" ++msgstr "" ++ ++msgid "Seed queue enabled" ++msgstr "" ++ ++msgid "Seed queue size" ++msgstr "" ++ ++msgid "Speed limit down" ++msgstr "" ++ ++msgid "Speed limit down enabled" ++msgstr "" ++ ++msgid "Speed limit up" ++msgstr "" ++ ++msgid "Speed limit up enabled" ++msgstr "" ++ ++msgid "Transmission" ++msgstr "" ++ ++msgid "" ++"Transmission daemon is a simple bittorrent client, here you can configure " ++"the settings." ++msgstr "" ++ ++msgid "Trash original torrent files" ++msgstr "" ++ ++msgid "Upload slots per torrent" ++msgstr "" ++ ++msgid "Watch directory" ++msgstr "" ++ ++msgid "in minutes from midnight" ++msgstr "" ++ ++msgid "preallocation" ++msgstr "" ++ ++msgid "uTP enabled" ++msgstr "" +diff --git a/feeds/luci/applications/luci-app-transmission/po/ru/transmission.po b/feeds/luci/applications/luci-app-transmission/po/ru/transmission.po +new file mode 100644 +index 0000000..fac9510 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-transmission/po/ru/transmission.po +@@ -0,0 +1,306 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: LuCI: transmission\n" ++"Report-Msgid-Bugs-To: \n" ++"POT-Creation-Date: 2009-05-19 19:36+0200\n" ++"PO-Revision-Date: 2012-08-15 17:35+0300\n" ++"Last-Translator: Roman A. aka BasicXP \n" ++"Language-Team: Russian \n" ++"Language: ru\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%" ++"10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" ++"X-Generator: Pootle 2.0.6\n" ++"X-Poedit-SourceCharset: UTF-8\n" ++ ++msgid "Alternative download speed" ++msgstr "ÐÐ»ÑŒÑ‚ÐµÑ€Ð½Ð°Ñ‚Ð¸Ð²Ð½Ð°Ñ ÑкороÑÑ‚ÑŒ загрузки" ++ ++msgid "Alternative speed enabled" ++msgstr "ÐÐ»ÑŒÑ‚ÐµÑ€Ð½Ð°Ñ‚Ð¸Ð²Ð½Ð°Ñ ÑкороÑÑ‚ÑŒ включена" ++ ++msgid "Alternative speed time begin" ++msgstr "Ð’Ñ€ÐµÐ¼Ñ Ð½Ð°Ñ‡Ð°Ð»Ð° альтернативной ÑкороÑти" ++ ++msgid "Alternative speed time day" ++msgstr "День альтернативной ÑкороÑти" ++ ++msgid "Alternative speed time end" ++msgstr "Ð’Ñ€ÐµÐ¼Ñ Ð¾ÐºÐ¾Ð½Ñ‡Ð°Ð½Ð¸Ñ Ð°Ð»ÑŒÑ‚ÐµÑ€Ð½Ð°Ñ‚Ð¸Ð²Ð½Ð¾Ð¹ ÑкороÑти" ++ ++msgid "Alternative speed timing enabled" ++msgstr "РаÑпиÑание альтернативной ÑкороÑти включено" ++ ++msgid "Alternative upload speed" ++msgstr "ÐÐ»ÑŒÑ‚ÐµÑ€Ð½Ð°Ñ‚Ð¸Ð²Ð½Ð°Ñ ÑкороÑÑ‚ÑŒ отдачи" ++ ++msgid "Automatically start added torrents" ++msgstr "ÐвтоматичеÑки запуÑкать добавленные торренты" ++ ++msgid "Bandwidth settings" ++msgstr "ÐаÑтройки ÑкороÑти" ++ ++msgid "Binding address IPv4" ++msgstr "ПривÑзанный Ð°Ð´Ñ€ÐµÑ IPv4" ++ ++msgid "Binding address IPv6" ++msgstr "ПривÑзанный Ð°Ð´Ñ€ÐµÑ IPv6" ++ ++msgid "Block list enabled" ++msgstr "СпиÑок блокировок включен" ++ ++msgid "Blocklist URL" ++msgstr "URL ÑпиÑка блокировок" ++ ++msgid "Blocklists" ++msgstr "СпиÑки блокировок" ++ ++msgid "Cache size in MB" ++msgstr "Размер кÑша (МБ)" ++ ++msgid "Config file directory" ++msgstr "Папка файла конфигурации" ++ ++msgid "DHT enabled" ++msgstr "DHT включен" ++ ++msgid "Debug" ++msgstr "Отладка" ++ ++msgid "Download directory" ++msgstr "Папка Ð´Ð»Ñ Ð·Ð°Ð³Ñ€ÑƒÐ·Ð¾Ðº" ++ ++msgid "Download queue enabled" ++msgstr "Очередь загрузок включена" ++ ++msgid "Download queue size" ++msgstr "Размер очереди загрузок" ++ ++msgid "Enable watch directory" ++msgstr "Включить папку поиÑка" ++ ++msgid "Enabled" ++msgstr "Включено" ++ ++msgid "Encryption" ++msgstr "Шифрование" ++ ++msgid "Error" ++msgstr "Ошибка" ++ ++msgid "Fast" ++msgstr "БыÑтрый" ++ ++msgid "Files and Locations" ++msgstr "Файлы и пути" ++ ++msgid "Forced" ++msgstr "Принудительно" ++ ++msgid "Full" ++msgstr "Полный" ++ ++msgid "Global peer limit" ++msgstr "Глобальный лимит пиров" ++ ++msgid "Global settings" ++msgstr "Общие наÑтройки" ++ ++msgid "Idle seeding limit" ++msgstr "Ограничение времени ÑидированиÑ" ++ ++msgid "Idle seeding limit enabled" ++msgstr "Ограничение времени ÑÐ¸Ð´Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ð²ÐºÐ»ÑŽÑ‡ÐµÐ½Ð¾" ++ ++msgid "Incomplete directory" ++msgstr "Папка Ð´Ð»Ñ Ð½Ðµ полноÑтью загруженых файлов" ++ ++msgid "Incomplete directory enabled" ++msgstr "Папка Ð´Ð»Ñ Ð½Ðµ полноÑтью загруженых файлов включена" ++ ++msgid "Info" ++msgstr "ИнформациÑ" ++ ++msgid "LPD enabled" ++msgstr "LPD включено" ++ ++#, fuzzy ++msgid "Lazy bitfield enabled" ++msgstr "Lazy bitfield включен" ++ ++msgid "Message level" ++msgstr "Уровень Ñообщений" ++ ++msgid "Miscellaneous" ++msgstr "Прочее" ++ ++msgid "None" ++msgstr "ОтÑутÑтвует" ++ ++#, fuzzy ++msgid "" ++"Number/bitfield. Start with 0, then for each day you want the scheduler " ++"enabled, add a value. For Sunday - 1, Monday - 2, Tuesday - 4, Wednesday - " ++"8, Thursday - 16, Friday - 32, Saturday - 64" ++msgstr "" ++"Ðомер/битовое поле. Ðачните Ñ 0, затем Ð´Ð»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð³Ð¾ днÑ, в который вы хотите " ++"включить планировщик, добавьте значение. Ð”Ð»Ñ Ð²Ð¾ÑкреÑÐµÐ½ÑŒÑ - 1, понедельника - " ++"2, вторника - 4, Ñреды - 8, четверга - 16, пÑтницы - 32, Ñубботы - 64." ++ ++msgid "Off" ++msgstr "Выключено" ++ ++msgid "Open Web Interface" ++msgstr "Открыть веб-интерфейÑ" ++ ++msgid "PEX enabled" ++msgstr "PEX включен" ++ ++msgid "Peer Port settings" ++msgstr "ÐаÑтройки порта пира" ++ ++msgid "Peer congestion algorithm" ++msgstr "Ðлгоритм перегрузки пиров" ++ ++msgid "Peer limit per torrent" ++msgstr "Ограничение пиров на торрент" ++ ++msgid "Peer port" ++msgstr "Порт пира" ++ ++msgid "Peer port random high" ++msgstr "Ðаибольший Ñлучайный порт пира" ++ ++msgid "Peer port random low" ++msgstr "Ðаименьший Ñлучайный порт пира" ++ ++msgid "Peer port random on start" ++msgstr "Случайный порт пира при запуÑке" ++ ++msgid "Peer settings" ++msgstr "ÐаÑтройки пира" ++ ++msgid "Peer socket tos" ++msgstr "Значение ToS Ñокета пира" ++ ++msgid "Port forwarding enabled" ++msgstr "Перенаправление портов включено" ++ ++msgid "Preferred" ++msgstr "Предпочитаемо" ++ ++msgid "Prefetch enabled" ++msgstr "Предвыборка включена" ++ ++#, fuzzy ++msgid "Queue stalled enabled" ++msgstr "ПриоÑтановка очереди включена" ++ ++#, fuzzy ++msgid "Queue stalled minutes" ++msgstr "ПриоÑтановка очереди (мин.)" ++ ++msgid "Queueing" ++msgstr "ОбÑлуживание" ++ ++msgid "RPC URL" ++msgstr "URL RPC" ++ ++msgid "RPC authentication required" ++msgstr "ÐÑƒÑ‚ÐµÐ½Ñ‚Ð¸Ñ„Ð¸ÐºÐ°Ñ†Ð¸Ñ RPC" ++ ++msgid "RPC bind address" ++msgstr "RPC-адреÑ" ++ ++msgid "RPC enabled" ++msgstr "RPC включен" ++ ++msgid "RPC password" ++msgstr "Пароль RPC" ++ ++msgid "RPC port" ++msgstr "Порт RPC" ++ ++msgid "RPC settings" ++msgstr "ÐаÑтройки RPC" ++ ++msgid "RPC username" ++msgstr "Ð˜Ð¼Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ RPC" ++ ++msgid "RPC whitelist" ++msgstr "\"Белый\" ÑпиÑок RPC" ++ ++msgid "RPC whitelist enabled" ++msgstr "\"Белый\" ÑпиÑок RPC включен" ++ ++msgid "Ratio limit" ++msgstr "КоÑффициент отдачи" ++ ++msgid "Ratio limit enabled" ++msgstr "КоÑффициент отдачи включен" ++ ++msgid "Rename partial files" ++msgstr "Переименовывать незавершённые файлы" ++ ++msgid "Run daemon as user" ++msgstr "ЗапуÑтить демон от пользователÑ" ++ ++msgid "Scheduling" ++msgstr "Планирование" ++ ++msgid "Scrape paused torrents enabled" ++msgstr "Производить scrape-запроÑÑ‹ у приоÑтановленных торрентов" ++ ++msgid "Script torrent done enabled" ++msgstr "ЗапуÑк Ñкрипта поÑле загрузки торрента включён" ++ ++msgid "Script torrent done filename" ++msgstr "Скрипт Ð·Ð°Ð²ÐµÑ€ÑˆÐµÐ½Ð¸Ñ Ð·Ð°Ð³Ñ€ÑƒÐ·ÐºÐ¸" ++ ++msgid "Seed queue enabled" ++msgstr "Очередь Ñидов включена" ++ ++msgid "Seed queue size" ++msgstr "Размер очереди ÑидированиÑ" ++ ++msgid "Speed limit down" ++msgstr "Лимит ÑкороÑти загрузки" ++ ++msgid "Speed limit down enabled" ++msgstr "Лимит ÑкороÑти загрузки включен" ++ ++msgid "Speed limit up" ++msgstr "Лимит ÑкороÑти отдачи" ++ ++msgid "Speed limit up enabled" ++msgstr "Лимит ÑкороÑти отдачи включен" ++ ++msgid "Transmission" ++msgstr "Transmission" ++ ++msgid "" ++"Transmission daemon is a simple bittorrent client, here you can configure " ++"the settings." ++msgstr "" ++"Transmission - проÑтой bittorrent-клиент. ЗдеÑÑŒ Ð’Ñ‹ можете наÑтроить " ++"параметры." ++ ++msgid "Trash original torrent files" ++msgstr "Удалить торрент-файлы" ++ ++msgid "Upload slots per torrent" ++msgstr "Кол-во Ñлотов отдачи на торрент" ++ ++msgid "Watch directory" ++msgstr "Папка поиÑка" ++ ++msgid "in minutes from midnight" ++msgstr "в минутах от полуночи" ++ ++msgid "preallocation" ++msgstr "предраÑпределение" ++ ++msgid "uTP enabled" ++msgstr "uTP включен" +diff --git a/feeds/luci/applications/luci-app-transmission/po/sk/transmission.po b/feeds/luci/applications/luci-app-transmission/po/sk/transmission.po +new file mode 100644 +index 0000000..4b4c3af +--- /dev/null ++++ b/feeds/luci/applications/luci-app-transmission/po/sk/transmission.po +@@ -0,0 +1,290 @@ ++msgid "" ++msgstr "" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Last-Translator: Automatically generated\n" ++"Language-Team: none\n" ++"MIME-Version: 1.0\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n" ++ ++msgid "Alternative download speed" ++msgstr "" ++ ++msgid "Alternative speed enabled" ++msgstr "" ++ ++msgid "Alternative speed time begin" ++msgstr "" ++ ++msgid "Alternative speed time day" ++msgstr "" ++ ++msgid "Alternative speed time end" ++msgstr "" ++ ++msgid "Alternative speed timing enabled" ++msgstr "" ++ ++msgid "Alternative upload speed" ++msgstr "" ++ ++msgid "Automatically start added torrents" ++msgstr "" ++ ++msgid "Bandwidth settings" ++msgstr "" ++ ++msgid "Binding address IPv4" ++msgstr "" ++ ++msgid "Binding address IPv6" ++msgstr "" ++ ++msgid "Block list enabled" ++msgstr "" ++ ++msgid "Blocklist URL" ++msgstr "" ++ ++msgid "Blocklists" ++msgstr "" ++ ++msgid "Cache size in MB" ++msgstr "" ++ ++msgid "Config file directory" ++msgstr "" ++ ++msgid "DHT enabled" ++msgstr "" ++ ++msgid "Debug" ++msgstr "" ++ ++msgid "Download directory" ++msgstr "" ++ ++msgid "Download queue enabled" ++msgstr "" ++ ++msgid "Download queue size" ++msgstr "" ++ ++msgid "Enable watch directory" ++msgstr "" ++ ++msgid "Enabled" ++msgstr "" ++ ++msgid "Encryption" ++msgstr "" ++ ++msgid "Error" ++msgstr "" ++ ++msgid "Fast" ++msgstr "" ++ ++msgid "Files and Locations" ++msgstr "" ++ ++msgid "Forced" ++msgstr "" ++ ++msgid "Full" ++msgstr "" ++ ++msgid "Global peer limit" ++msgstr "" ++ ++msgid "Global settings" ++msgstr "" ++ ++msgid "Idle seeding limit" ++msgstr "" ++ ++msgid "Idle seeding limit enabled" ++msgstr "" ++ ++msgid "Incomplete directory" ++msgstr "" ++ ++msgid "Incomplete directory enabled" ++msgstr "" ++ ++msgid "Info" ++msgstr "" ++ ++msgid "LPD enabled" ++msgstr "" ++ ++msgid "Lazy bitfield enabled" ++msgstr "" ++ ++msgid "Message level" ++msgstr "" ++ ++msgid "Miscellaneous" ++msgstr "" ++ ++msgid "None" ++msgstr "" ++ ++msgid "" ++"Number/bitfield. Start with 0, then for each day you want the scheduler " ++"enabled, add a value. For Sunday - 1, Monday - 2, Tuesday - 4, Wednesday - " ++"8, Thursday - 16, Friday - 32, Saturday - 64" ++msgstr "" ++ ++msgid "Off" ++msgstr "" ++ ++msgid "Open Web Interface" ++msgstr "" ++ ++msgid "PEX enabled" ++msgstr "" ++ ++msgid "Peer Port settings" ++msgstr "" ++ ++msgid "Peer congestion algorithm" ++msgstr "" ++ ++msgid "Peer limit per torrent" ++msgstr "" ++ ++msgid "Peer port" ++msgstr "" ++ ++msgid "Peer port random high" ++msgstr "" ++ ++msgid "Peer port random low" ++msgstr "" ++ ++msgid "Peer port random on start" ++msgstr "" ++ ++msgid "Peer settings" ++msgstr "" ++ ++msgid "Peer socket tos" ++msgstr "" ++ ++msgid "Port forwarding enabled" ++msgstr "" ++ ++msgid "Preferred" ++msgstr "" ++ ++msgid "Prefetch enabled" ++msgstr "" ++ ++msgid "Queue stalled enabled" ++msgstr "" ++ ++msgid "Queue stalled minutes" ++msgstr "" ++ ++msgid "Queueing" ++msgstr "" ++ ++msgid "RPC URL" ++msgstr "" ++ ++msgid "RPC authentication required" ++msgstr "" ++ ++msgid "RPC bind address" ++msgstr "" ++ ++msgid "RPC enabled" ++msgstr "" ++ ++msgid "RPC password" ++msgstr "" ++ ++msgid "RPC port" ++msgstr "" ++ ++msgid "RPC settings" ++msgstr "" ++ ++msgid "RPC username" ++msgstr "" ++ ++msgid "RPC whitelist" ++msgstr "" ++ ++msgid "RPC whitelist enabled" ++msgstr "" ++ ++msgid "Ratio limit" ++msgstr "" ++ ++msgid "Ratio limit enabled" ++msgstr "" ++ ++msgid "Rename partial files" ++msgstr "" ++ ++msgid "Run daemon as user" ++msgstr "" ++ ++msgid "Scheduling" ++msgstr "" ++ ++msgid "Scrape paused torrents enabled" ++msgstr "" ++ ++msgid "Script torrent done enabled" ++msgstr "" ++ ++msgid "Script torrent done filename" ++msgstr "" ++ ++msgid "Seed queue enabled" ++msgstr "" ++ ++msgid "Seed queue size" ++msgstr "" ++ ++msgid "Speed limit down" ++msgstr "" ++ ++msgid "Speed limit down enabled" ++msgstr "" ++ ++msgid "Speed limit up" ++msgstr "" ++ ++msgid "Speed limit up enabled" ++msgstr "" ++ ++msgid "Transmission" ++msgstr "" ++ ++msgid "" ++"Transmission daemon is a simple bittorrent client, here you can configure " ++"the settings." ++msgstr "" ++ ++msgid "Trash original torrent files" ++msgstr "" ++ ++msgid "Upload slots per torrent" ++msgstr "" ++ ++msgid "Watch directory" ++msgstr "" ++ ++msgid "in minutes from midnight" ++msgstr "" ++ ++msgid "preallocation" ++msgstr "" ++ ++msgid "uTP enabled" ++msgstr "" +diff --git a/feeds/luci/applications/luci-app-transmission/po/sv/transmission.po b/feeds/luci/applications/luci-app-transmission/po/sv/transmission.po +new file mode 100644 +index 0000000..e276ebf +--- /dev/null ++++ b/feeds/luci/applications/luci-app-transmission/po/sv/transmission.po +@@ -0,0 +1,291 @@ ++msgid "" ++msgstr "" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Last-Translator: Automatically generated\n" ++"Language-Team: none\n" ++"Language: sv\n" ++"MIME-Version: 1.0\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n != 1);\n" ++ ++msgid "Alternative download speed" ++msgstr "" ++ ++msgid "Alternative speed enabled" ++msgstr "" ++ ++msgid "Alternative speed time begin" ++msgstr "" ++ ++msgid "Alternative speed time day" ++msgstr "" ++ ++msgid "Alternative speed time end" ++msgstr "" ++ ++msgid "Alternative speed timing enabled" ++msgstr "" ++ ++msgid "Alternative upload speed" ++msgstr "" ++ ++msgid "Automatically start added torrents" ++msgstr "" ++ ++msgid "Bandwidth settings" ++msgstr "" ++ ++msgid "Binding address IPv4" ++msgstr "" ++ ++msgid "Binding address IPv6" ++msgstr "" ++ ++msgid "Block list enabled" ++msgstr "" ++ ++msgid "Blocklist URL" ++msgstr "" ++ ++msgid "Blocklists" ++msgstr "" ++ ++msgid "Cache size in MB" ++msgstr "" ++ ++msgid "Config file directory" ++msgstr "" ++ ++msgid "DHT enabled" ++msgstr "" ++ ++msgid "Debug" ++msgstr "" ++ ++msgid "Download directory" ++msgstr "" ++ ++msgid "Download queue enabled" ++msgstr "" ++ ++msgid "Download queue size" ++msgstr "" ++ ++msgid "Enable watch directory" ++msgstr "" ++ ++msgid "Enabled" ++msgstr "" ++ ++msgid "Encryption" ++msgstr "" ++ ++msgid "Error" ++msgstr "" ++ ++msgid "Fast" ++msgstr "" ++ ++msgid "Files and Locations" ++msgstr "" ++ ++msgid "Forced" ++msgstr "" ++ ++msgid "Full" ++msgstr "" ++ ++msgid "Global peer limit" ++msgstr "" ++ ++msgid "Global settings" ++msgstr "" ++ ++msgid "Idle seeding limit" ++msgstr "" ++ ++msgid "Idle seeding limit enabled" ++msgstr "" ++ ++msgid "Incomplete directory" ++msgstr "" ++ ++msgid "Incomplete directory enabled" ++msgstr "" ++ ++msgid "Info" ++msgstr "" ++ ++msgid "LPD enabled" ++msgstr "" ++ ++msgid "Lazy bitfield enabled" ++msgstr "" ++ ++msgid "Message level" ++msgstr "" ++ ++msgid "Miscellaneous" ++msgstr "" ++ ++msgid "None" ++msgstr "" ++ ++msgid "" ++"Number/bitfield. Start with 0, then for each day you want the scheduler " ++"enabled, add a value. For Sunday - 1, Monday - 2, Tuesday - 4, Wednesday - " ++"8, Thursday - 16, Friday - 32, Saturday - 64" ++msgstr "" ++ ++msgid "Off" ++msgstr "" ++ ++msgid "Open Web Interface" ++msgstr "" ++ ++msgid "PEX enabled" ++msgstr "" ++ ++msgid "Peer Port settings" ++msgstr "" ++ ++msgid "Peer congestion algorithm" ++msgstr "" ++ ++msgid "Peer limit per torrent" ++msgstr "" ++ ++msgid "Peer port" ++msgstr "" ++ ++msgid "Peer port random high" ++msgstr "" ++ ++msgid "Peer port random low" ++msgstr "" ++ ++msgid "Peer port random on start" ++msgstr "" ++ ++msgid "Peer settings" ++msgstr "" ++ ++msgid "Peer socket tos" ++msgstr "" ++ ++msgid "Port forwarding enabled" ++msgstr "" ++ ++msgid "Preferred" ++msgstr "" ++ ++msgid "Prefetch enabled" ++msgstr "" ++ ++msgid "Queue stalled enabled" ++msgstr "" ++ ++msgid "Queue stalled minutes" ++msgstr "" ++ ++msgid "Queueing" ++msgstr "" ++ ++msgid "RPC URL" ++msgstr "" ++ ++msgid "RPC authentication required" ++msgstr "" ++ ++msgid "RPC bind address" ++msgstr "" ++ ++msgid "RPC enabled" ++msgstr "" ++ ++msgid "RPC password" ++msgstr "" ++ ++msgid "RPC port" ++msgstr "" ++ ++msgid "RPC settings" ++msgstr "" ++ ++msgid "RPC username" ++msgstr "" ++ ++msgid "RPC whitelist" ++msgstr "" ++ ++msgid "RPC whitelist enabled" ++msgstr "" ++ ++msgid "Ratio limit" ++msgstr "" ++ ++msgid "Ratio limit enabled" ++msgstr "" ++ ++msgid "Rename partial files" ++msgstr "" ++ ++msgid "Run daemon as user" ++msgstr "" ++ ++msgid "Scheduling" ++msgstr "" ++ ++msgid "Scrape paused torrents enabled" ++msgstr "" ++ ++msgid "Script torrent done enabled" ++msgstr "" ++ ++msgid "Script torrent done filename" ++msgstr "" ++ ++msgid "Seed queue enabled" ++msgstr "" ++ ++msgid "Seed queue size" ++msgstr "" ++ ++msgid "Speed limit down" ++msgstr "" ++ ++msgid "Speed limit down enabled" ++msgstr "" ++ ++msgid "Speed limit up" ++msgstr "" ++ ++msgid "Speed limit up enabled" ++msgstr "" ++ ++msgid "Transmission" ++msgstr "" ++ ++msgid "" ++"Transmission daemon is a simple bittorrent client, here you can configure " ++"the settings." ++msgstr "" ++ ++msgid "Trash original torrent files" ++msgstr "" ++ ++msgid "Upload slots per torrent" ++msgstr "" ++ ++msgid "Watch directory" ++msgstr "" ++ ++msgid "in minutes from midnight" ++msgstr "" ++ ++msgid "preallocation" ++msgstr "" ++ ++msgid "uTP enabled" ++msgstr "" +diff --git a/feeds/luci/applications/luci-app-transmission/po/templates/transmission.pot b/feeds/luci/applications/luci-app-transmission/po/templates/transmission.pot +new file mode 100644 +index 0000000..5892abc +--- /dev/null ++++ b/feeds/luci/applications/luci-app-transmission/po/templates/transmission.pot +@@ -0,0 +1,283 @@ ++msgid "" ++msgstr "Content-Type: text/plain; charset=UTF-8" ++ ++msgid "Alternative download speed" ++msgstr "" ++ ++msgid "Alternative speed enabled" ++msgstr "" ++ ++msgid "Alternative speed time begin" ++msgstr "" ++ ++msgid "Alternative speed time day" ++msgstr "" ++ ++msgid "Alternative speed time end" ++msgstr "" ++ ++msgid "Alternative speed timing enabled" ++msgstr "" ++ ++msgid "Alternative upload speed" ++msgstr "" ++ ++msgid "Automatically start added torrents" ++msgstr "" ++ ++msgid "Bandwidth settings" ++msgstr "" ++ ++msgid "Binding address IPv4" ++msgstr "" ++ ++msgid "Binding address IPv6" ++msgstr "" ++ ++msgid "Block list enabled" ++msgstr "" ++ ++msgid "Blocklist URL" ++msgstr "" ++ ++msgid "Blocklists" ++msgstr "" ++ ++msgid "Cache size in MB" ++msgstr "" ++ ++msgid "Config file directory" ++msgstr "" ++ ++msgid "DHT enabled" ++msgstr "" ++ ++msgid "Debug" ++msgstr "" ++ ++msgid "Download directory" ++msgstr "" ++ ++msgid "Download queue enabled" ++msgstr "" ++ ++msgid "Download queue size" ++msgstr "" ++ ++msgid "Enable watch directory" ++msgstr "" ++ ++msgid "Enabled" ++msgstr "" ++ ++msgid "Encryption" ++msgstr "" ++ ++msgid "Error" ++msgstr "" ++ ++msgid "Fast" ++msgstr "" ++ ++msgid "Files and Locations" ++msgstr "" ++ ++msgid "Forced" ++msgstr "" ++ ++msgid "Full" ++msgstr "" ++ ++msgid "Global peer limit" ++msgstr "" ++ ++msgid "Global settings" ++msgstr "" ++ ++msgid "Idle seeding limit" ++msgstr "" ++ ++msgid "Idle seeding limit enabled" ++msgstr "" ++ ++msgid "Incomplete directory" ++msgstr "" ++ ++msgid "Incomplete directory enabled" ++msgstr "" ++ ++msgid "Info" ++msgstr "" ++ ++msgid "LPD enabled" ++msgstr "" ++ ++msgid "Lazy bitfield enabled" ++msgstr "" ++ ++msgid "Message level" ++msgstr "" ++ ++msgid "Miscellaneous" ++msgstr "" ++ ++msgid "None" ++msgstr "" ++ ++msgid "" ++"Number/bitfield. Start with 0, then for each day you want the scheduler " ++"enabled, add a value. For Sunday - 1, Monday - 2, Tuesday - 4, Wednesday - " ++"8, Thursday - 16, Friday - 32, Saturday - 64" ++msgstr "" ++ ++msgid "Off" ++msgstr "" ++ ++msgid "Open Web Interface" ++msgstr "" ++ ++msgid "PEX enabled" ++msgstr "" ++ ++msgid "Peer Port settings" ++msgstr "" ++ ++msgid "Peer congestion algorithm" ++msgstr "" ++ ++msgid "Peer limit per torrent" ++msgstr "" ++ ++msgid "Peer port" ++msgstr "" ++ ++msgid "Peer port random high" ++msgstr "" ++ ++msgid "Peer port random low" ++msgstr "" ++ ++msgid "Peer port random on start" ++msgstr "" ++ ++msgid "Peer settings" ++msgstr "" ++ ++msgid "Peer socket tos" ++msgstr "" ++ ++msgid "Port forwarding enabled" ++msgstr "" ++ ++msgid "Preferred" ++msgstr "" ++ ++msgid "Prefetch enabled" ++msgstr "" ++ ++msgid "Queue stalled enabled" ++msgstr "" ++ ++msgid "Queue stalled minutes" ++msgstr "" ++ ++msgid "Queueing" ++msgstr "" ++ ++msgid "RPC URL" ++msgstr "" ++ ++msgid "RPC authentication required" ++msgstr "" ++ ++msgid "RPC bind address" ++msgstr "" ++ ++msgid "RPC enabled" ++msgstr "" ++ ++msgid "RPC password" ++msgstr "" ++ ++msgid "RPC port" ++msgstr "" ++ ++msgid "RPC settings" ++msgstr "" ++ ++msgid "RPC username" ++msgstr "" ++ ++msgid "RPC whitelist" ++msgstr "" ++ ++msgid "RPC whitelist enabled" ++msgstr "" ++ ++msgid "Ratio limit" ++msgstr "" ++ ++msgid "Ratio limit enabled" ++msgstr "" ++ ++msgid "Rename partial files" ++msgstr "" ++ ++msgid "Run daemon as user" ++msgstr "" ++ ++msgid "Scheduling" ++msgstr "" ++ ++msgid "Scrape paused torrents enabled" ++msgstr "" ++ ++msgid "Script torrent done enabled" ++msgstr "" ++ ++msgid "Script torrent done filename" ++msgstr "" ++ ++msgid "Seed queue enabled" ++msgstr "" ++ ++msgid "Seed queue size" ++msgstr "" ++ ++msgid "Speed limit down" ++msgstr "" ++ ++msgid "Speed limit down enabled" ++msgstr "" ++ ++msgid "Speed limit up" ++msgstr "" ++ ++msgid "Speed limit up enabled" ++msgstr "" ++ ++msgid "Transmission" ++msgstr "" ++ ++msgid "" ++"Transmission daemon is a simple bittorrent client, here you can configure " ++"the settings." ++msgstr "" ++ ++msgid "Trash original torrent files" ++msgstr "" ++ ++msgid "Upload slots per torrent" ++msgstr "" ++ ++msgid "Watch directory" ++msgstr "" ++ ++msgid "in minutes from midnight" ++msgstr "" ++ ++msgid "preallocation" ++msgstr "" ++ ++msgid "uTP enabled" ++msgstr "" +diff --git a/feeds/luci/applications/luci-app-transmission/po/tr/transmission.po b/feeds/luci/applications/luci-app-transmission/po/tr/transmission.po +new file mode 100644 +index 0000000..5a4df01 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-transmission/po/tr/transmission.po +@@ -0,0 +1,290 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Last-Translator: Automatically generated\n" ++"Language-Team: none\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=1; plural=0;\n" ++ ++msgid "Alternative download speed" ++msgstr "" ++ ++msgid "Alternative speed enabled" ++msgstr "" ++ ++msgid "Alternative speed time begin" ++msgstr "" ++ ++msgid "Alternative speed time day" ++msgstr "" ++ ++msgid "Alternative speed time end" ++msgstr "" ++ ++msgid "Alternative speed timing enabled" ++msgstr "" ++ ++msgid "Alternative upload speed" ++msgstr "" ++ ++msgid "Automatically start added torrents" ++msgstr "" ++ ++msgid "Bandwidth settings" ++msgstr "" ++ ++msgid "Binding address IPv4" ++msgstr "" ++ ++msgid "Binding address IPv6" ++msgstr "" ++ ++msgid "Block list enabled" ++msgstr "" ++ ++msgid "Blocklist URL" ++msgstr "" ++ ++msgid "Blocklists" ++msgstr "" ++ ++msgid "Cache size in MB" ++msgstr "" ++ ++msgid "Config file directory" ++msgstr "" ++ ++msgid "DHT enabled" ++msgstr "" ++ ++msgid "Debug" ++msgstr "" ++ ++msgid "Download directory" ++msgstr "" ++ ++msgid "Download queue enabled" ++msgstr "" ++ ++msgid "Download queue size" ++msgstr "" ++ ++msgid "Enable watch directory" ++msgstr "" ++ ++msgid "Enabled" ++msgstr "" ++ ++msgid "Encryption" ++msgstr "" ++ ++msgid "Error" ++msgstr "" ++ ++msgid "Fast" ++msgstr "" ++ ++msgid "Files and Locations" ++msgstr "" ++ ++msgid "Forced" ++msgstr "" ++ ++msgid "Full" ++msgstr "" ++ ++msgid "Global peer limit" ++msgstr "" ++ ++msgid "Global settings" ++msgstr "" ++ ++msgid "Idle seeding limit" ++msgstr "" ++ ++msgid "Idle seeding limit enabled" ++msgstr "" ++ ++msgid "Incomplete directory" ++msgstr "" ++ ++msgid "Incomplete directory enabled" ++msgstr "" ++ ++msgid "Info" ++msgstr "" ++ ++msgid "LPD enabled" ++msgstr "" ++ ++msgid "Lazy bitfield enabled" ++msgstr "" ++ ++msgid "Message level" ++msgstr "" ++ ++msgid "Miscellaneous" ++msgstr "" ++ ++msgid "None" ++msgstr "" ++ ++msgid "" ++"Number/bitfield. Start with 0, then for each day you want the scheduler " ++"enabled, add a value. For Sunday - 1, Monday - 2, Tuesday - 4, Wednesday - " ++"8, Thursday - 16, Friday - 32, Saturday - 64" ++msgstr "" ++ ++msgid "Off" ++msgstr "" ++ ++msgid "Open Web Interface" ++msgstr "" ++ ++msgid "PEX enabled" ++msgstr "" ++ ++msgid "Peer Port settings" ++msgstr "" ++ ++msgid "Peer congestion algorithm" ++msgstr "" ++ ++msgid "Peer limit per torrent" ++msgstr "" ++ ++msgid "Peer port" ++msgstr "" ++ ++msgid "Peer port random high" ++msgstr "" ++ ++msgid "Peer port random low" ++msgstr "" ++ ++msgid "Peer port random on start" ++msgstr "" ++ ++msgid "Peer settings" ++msgstr "" ++ ++msgid "Peer socket tos" ++msgstr "" ++ ++msgid "Port forwarding enabled" ++msgstr "" ++ ++msgid "Preferred" ++msgstr "" ++ ++msgid "Prefetch enabled" ++msgstr "" ++ ++msgid "Queue stalled enabled" ++msgstr "" ++ ++msgid "Queue stalled minutes" ++msgstr "" ++ ++msgid "Queueing" ++msgstr "" ++ ++msgid "RPC URL" ++msgstr "" ++ ++msgid "RPC authentication required" ++msgstr "" ++ ++msgid "RPC bind address" ++msgstr "" ++ ++msgid "RPC enabled" ++msgstr "" ++ ++msgid "RPC password" ++msgstr "" ++ ++msgid "RPC port" ++msgstr "" ++ ++msgid "RPC settings" ++msgstr "" ++ ++msgid "RPC username" ++msgstr "" ++ ++msgid "RPC whitelist" ++msgstr "" ++ ++msgid "RPC whitelist enabled" ++msgstr "" ++ ++msgid "Ratio limit" ++msgstr "" ++ ++msgid "Ratio limit enabled" ++msgstr "" ++ ++msgid "Rename partial files" ++msgstr "" ++ ++msgid "Run daemon as user" ++msgstr "" ++ ++msgid "Scheduling" ++msgstr "" ++ ++msgid "Scrape paused torrents enabled" ++msgstr "" ++ ++msgid "Script torrent done enabled" ++msgstr "" ++ ++msgid "Script torrent done filename" ++msgstr "" ++ ++msgid "Seed queue enabled" ++msgstr "" ++ ++msgid "Seed queue size" ++msgstr "" ++ ++msgid "Speed limit down" ++msgstr "" ++ ++msgid "Speed limit down enabled" ++msgstr "" ++ ++msgid "Speed limit up" ++msgstr "" ++ ++msgid "Speed limit up enabled" ++msgstr "" ++ ++msgid "Transmission" ++msgstr "" ++ ++msgid "" ++"Transmission daemon is a simple bittorrent client, here you can configure " ++"the settings." ++msgstr "" ++ ++msgid "Trash original torrent files" ++msgstr "" ++ ++msgid "Upload slots per torrent" ++msgstr "" ++ ++msgid "Watch directory" ++msgstr "" ++ ++msgid "in minutes from midnight" ++msgstr "" ++ ++msgid "preallocation" ++msgstr "" ++ ++msgid "uTP enabled" ++msgstr "" +diff --git a/feeds/luci/applications/luci-app-transmission/po/uk/transmission.po b/feeds/luci/applications/luci-app-transmission/po/uk/transmission.po +new file mode 100644 +index 0000000..1736934 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-transmission/po/uk/transmission.po +@@ -0,0 +1,296 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Report-Msgid-Bugs-To: \n" ++"POT-Creation-Date: 2013-08-13 16:16+0200\n" ++"PO-Revision-Date: 2013-08-13 16:17+0200\n" ++"Last-Translator: zubr_139 \n" ++"Language-Team: LANGUAGE \n" ++"Language: uk\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%" ++"10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "Alternative download speed" ++msgstr "Ðльтернативна швидкіÑÑ‚ÑŒ завантаженнÑ" ++ ++msgid "Alternative speed enabled" ++msgstr "Ðльтернативна швидкіÑÑ‚ÑŒ увімкнути" ++ ++msgid "Alternative speed time begin" ++msgstr "" ++ ++msgid "Alternative speed time day" ++msgstr "" ++ ++msgid "Alternative speed time end" ++msgstr "" ++ ++msgid "Alternative speed timing enabled" ++msgstr "" ++ ++msgid "Alternative upload speed" ++msgstr "" ++ ++msgid "Automatically start added torrents" ++msgstr "" ++ ++msgid "Bandwidth settings" ++msgstr "" ++ ++msgid "Binding address IPv4" ++msgstr "" ++ ++msgid "Binding address IPv6" ++msgstr "" ++ ++msgid "Block list enabled" ++msgstr "" ++ ++msgid "Blocklist URL" ++msgstr "" ++ ++msgid "Blocklists" ++msgstr "" ++ ++msgid "Cache size in MB" ++msgstr "" ++ ++msgid "Config file directory" ++msgstr "" ++ ++msgid "DHT enabled" ++msgstr "" ++ ++msgid "Debug" ++msgstr "" ++ ++msgid "Download directory" ++msgstr "" ++ ++msgid "Download queue enabled" ++msgstr "" ++ ++msgid "Download queue size" ++msgstr "" ++ ++msgid "Enable watch directory" ++msgstr "" ++ ++msgid "Enabled" ++msgstr "" ++ ++msgid "Encryption" ++msgstr "" ++ ++msgid "Error" ++msgstr "" ++ ++msgid "Fast" ++msgstr "" ++ ++msgid "Files and Locations" ++msgstr "" ++ ++msgid "Forced" ++msgstr "" ++ ++msgid "Full" ++msgstr "" ++ ++msgid "Global peer limit" ++msgstr "" ++ ++msgid "Global settings" ++msgstr "" ++ ++msgid "Idle seeding limit" ++msgstr "" ++ ++msgid "Idle seeding limit enabled" ++msgstr "" ++ ++msgid "Incomplete directory" ++msgstr "" ++ ++msgid "Incomplete directory enabled" ++msgstr "" ++ ++msgid "Info" ++msgstr "" ++ ++msgid "LPD enabled" ++msgstr "" ++ ++msgid "Lazy bitfield enabled" ++msgstr "" ++ ++msgid "Message level" ++msgstr "" ++ ++msgid "Miscellaneous" ++msgstr "" ++ ++msgid "None" ++msgstr "" ++ ++msgid "" ++"Number/bitfield. Start with 0, then for each day you want the scheduler " ++"enabled, add a value. For Sunday - 1, Monday - 2, Tuesday - 4, Wednesday - " ++"8, Thursday - 16, Friday - 32, Saturday - 64" ++msgstr "" ++ ++msgid "Off" ++msgstr "" ++ ++msgid "Open Web Interface" ++msgstr "" ++ ++msgid "PEX enabled" ++msgstr "" ++ ++msgid "Peer Port settings" ++msgstr "" ++ ++msgid "Peer congestion algorithm" ++msgstr "" ++ ++msgid "Peer limit per torrent" ++msgstr "" ++ ++msgid "Peer port" ++msgstr "" ++ ++msgid "Peer port random high" ++msgstr "" ++ ++msgid "Peer port random low" ++msgstr "" ++ ++msgid "Peer port random on start" ++msgstr "" ++ ++msgid "Peer settings" ++msgstr "" ++ ++msgid "Peer socket tos" ++msgstr "" ++ ++msgid "Port forwarding enabled" ++msgstr "" ++ ++msgid "Preferred" ++msgstr "" ++ ++msgid "Prefetch enabled" ++msgstr "" ++ ++msgid "Queue stalled enabled" ++msgstr "" ++ ++msgid "Queue stalled minutes" ++msgstr "" ++ ++msgid "Queueing" ++msgstr "" ++ ++msgid "RPC URL" ++msgstr "" ++ ++msgid "RPC authentication required" ++msgstr "" ++ ++msgid "RPC bind address" ++msgstr "" ++ ++msgid "RPC enabled" ++msgstr "" ++ ++msgid "RPC password" ++msgstr "" ++ ++msgid "RPC port" ++msgstr "" ++ ++msgid "RPC settings" ++msgstr "" ++ ++msgid "RPC username" ++msgstr "" ++ ++msgid "RPC whitelist" ++msgstr "" ++ ++msgid "RPC whitelist enabled" ++msgstr "" ++ ++msgid "Ratio limit" ++msgstr "" ++ ++msgid "Ratio limit enabled" ++msgstr "" ++ ++msgid "Rename partial files" ++msgstr "" ++ ++msgid "Run daemon as user" ++msgstr "" ++ ++msgid "Scheduling" ++msgstr "" ++ ++msgid "Scrape paused torrents enabled" ++msgstr "" ++ ++msgid "Script torrent done enabled" ++msgstr "" ++ ++msgid "Script torrent done filename" ++msgstr "" ++ ++msgid "Seed queue enabled" ++msgstr "" ++ ++msgid "Seed queue size" ++msgstr "" ++ ++msgid "Speed limit down" ++msgstr "" ++ ++msgid "Speed limit down enabled" ++msgstr "" ++ ++msgid "Speed limit up" ++msgstr "" ++ ++msgid "Speed limit up enabled" ++msgstr "" ++ ++msgid "Transmission" ++msgstr "" ++ ++msgid "" ++"Transmission daemon is a simple bittorrent client, here you can configure " ++"the settings." ++msgstr "" ++ ++msgid "Trash original torrent files" ++msgstr "" ++ ++msgid "Upload slots per torrent" ++msgstr "" ++ ++msgid "Watch directory" ++msgstr "" ++ ++msgid "in minutes from midnight" ++msgstr "" ++ ++msgid "preallocation" ++msgstr "" ++ ++msgid "uTP enabled" ++msgstr "" +diff --git a/feeds/luci/applications/luci-app-transmission/po/vi/transmission.po b/feeds/luci/applications/luci-app-transmission/po/vi/transmission.po +new file mode 100644 +index 0000000..3125fc2 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-transmission/po/vi/transmission.po +@@ -0,0 +1,280 @@ ++msgid "Alternative download speed" ++msgstr "" ++ ++msgid "Alternative speed enabled" ++msgstr "" ++ ++msgid "Alternative speed time begin" ++msgstr "" ++ ++msgid "Alternative speed time day" ++msgstr "" ++ ++msgid "Alternative speed time end" ++msgstr "" ++ ++msgid "Alternative speed timing enabled" ++msgstr "" ++ ++msgid "Alternative upload speed" ++msgstr "" ++ ++msgid "Automatically start added torrents" ++msgstr "" ++ ++msgid "Bandwidth settings" ++msgstr "" ++ ++msgid "Binding address IPv4" ++msgstr "" ++ ++msgid "Binding address IPv6" ++msgstr "" ++ ++msgid "Block list enabled" ++msgstr "" ++ ++msgid "Blocklist URL" ++msgstr "" ++ ++msgid "Blocklists" ++msgstr "" ++ ++msgid "Cache size in MB" ++msgstr "" ++ ++msgid "Config file directory" ++msgstr "" ++ ++msgid "DHT enabled" ++msgstr "" ++ ++msgid "Debug" ++msgstr "" ++ ++msgid "Download directory" ++msgstr "" ++ ++msgid "Download queue enabled" ++msgstr "" ++ ++msgid "Download queue size" ++msgstr "" ++ ++msgid "Enable watch directory" ++msgstr "" ++ ++msgid "Enabled" ++msgstr "" ++ ++msgid "Encryption" ++msgstr "" ++ ++msgid "Error" ++msgstr "" ++ ++msgid "Fast" ++msgstr "" ++ ++msgid "Files and Locations" ++msgstr "" ++ ++msgid "Forced" ++msgstr "" ++ ++msgid "Full" ++msgstr "" ++ ++msgid "Global peer limit" ++msgstr "" ++ ++msgid "Global settings" ++msgstr "" ++ ++msgid "Idle seeding limit" ++msgstr "" ++ ++msgid "Idle seeding limit enabled" ++msgstr "" ++ ++msgid "Incomplete directory" ++msgstr "" ++ ++msgid "Incomplete directory enabled" ++msgstr "" ++ ++msgid "Info" ++msgstr "" ++ ++msgid "LPD enabled" ++msgstr "" ++ ++msgid "Lazy bitfield enabled" ++msgstr "" ++ ++msgid "Message level" ++msgstr "" ++ ++msgid "Miscellaneous" ++msgstr "" ++ ++msgid "None" ++msgstr "" ++ ++msgid "" ++"Number/bitfield. Start with 0, then for each day you want the scheduler " ++"enabled, add a value. For Sunday - 1, Monday - 2, Tuesday - 4, Wednesday - " ++"8, Thursday - 16, Friday - 32, Saturday - 64" ++msgstr "" ++ ++msgid "Off" ++msgstr "" ++ ++msgid "Open Web Interface" ++msgstr "" ++ ++msgid "PEX enabled" ++msgstr "" ++ ++msgid "Peer Port settings" ++msgstr "" ++ ++msgid "Peer congestion algorithm" ++msgstr "" ++ ++msgid "Peer limit per torrent" ++msgstr "" ++ ++msgid "Peer port" ++msgstr "" ++ ++msgid "Peer port random high" ++msgstr "" ++ ++msgid "Peer port random low" ++msgstr "" ++ ++msgid "Peer port random on start" ++msgstr "" ++ ++msgid "Peer settings" ++msgstr "" ++ ++msgid "Peer socket tos" ++msgstr "" ++ ++msgid "Port forwarding enabled" ++msgstr "" ++ ++msgid "Preferred" ++msgstr "" ++ ++msgid "Prefetch enabled" ++msgstr "" ++ ++msgid "Queue stalled enabled" ++msgstr "" ++ ++msgid "Queue stalled minutes" ++msgstr "" ++ ++msgid "Queueing" ++msgstr "" ++ ++msgid "RPC URL" ++msgstr "" ++ ++msgid "RPC authentication required" ++msgstr "" ++ ++msgid "RPC bind address" ++msgstr "" ++ ++msgid "RPC enabled" ++msgstr "" ++ ++msgid "RPC password" ++msgstr "" ++ ++msgid "RPC port" ++msgstr "" ++ ++msgid "RPC settings" ++msgstr "" ++ ++msgid "RPC username" ++msgstr "" ++ ++msgid "RPC whitelist" ++msgstr "" ++ ++msgid "RPC whitelist enabled" ++msgstr "" ++ ++msgid "Ratio limit" ++msgstr "" ++ ++msgid "Ratio limit enabled" ++msgstr "" ++ ++msgid "Rename partial files" ++msgstr "" ++ ++msgid "Run daemon as user" ++msgstr "" ++ ++msgid "Scheduling" ++msgstr "" ++ ++msgid "Scrape paused torrents enabled" ++msgstr "" ++ ++msgid "Script torrent done enabled" ++msgstr "" ++ ++msgid "Script torrent done filename" ++msgstr "" ++ ++msgid "Seed queue enabled" ++msgstr "" ++ ++msgid "Seed queue size" ++msgstr "" ++ ++msgid "Speed limit down" ++msgstr "" ++ ++msgid "Speed limit down enabled" ++msgstr "" ++ ++msgid "Speed limit up" ++msgstr "" ++ ++msgid "Speed limit up enabled" ++msgstr "" ++ ++msgid "Transmission" ++msgstr "" ++ ++msgid "" ++"Transmission daemon is a simple bittorrent client, here you can configure " ++"the settings." ++msgstr "" ++ ++msgid "Trash original torrent files" ++msgstr "" ++ ++msgid "Upload slots per torrent" ++msgstr "" ++ ++msgid "Watch directory" ++msgstr "" ++ ++msgid "in minutes from midnight" ++msgstr "" ++ ++msgid "preallocation" ++msgstr "" ++ ++msgid "uTP enabled" ++msgstr "" +diff --git a/feeds/luci/applications/luci-app-transmission/po/zh-cn/transmission.po b/feeds/luci/applications/luci-app-transmission/po/zh-cn/transmission.po +new file mode 100644 +index 0000000..9dd3491 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-transmission/po/zh-cn/transmission.po +@@ -0,0 +1,295 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Report-Msgid-Bugs-To: \n" ++"POT-Creation-Date: 2013-10-08 14:06+0200\n" ++"PO-Revision-Date: 2014-06-15 04:57+0200\n" ++"Last-Translator: phantasm131 \n" ++"Language-Team: LANGUAGE \n" ++"Language: zh_CN\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=1; plural=0;\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "Alternative download speed" ++msgstr "临时下载é™é€Ÿ" ++ ++msgid "Alternative speed enabled" ++msgstr "å¯ç”¨ä¸´æ—¶é™é€Ÿ" ++ ++msgid "Alternative speed time begin" ++msgstr "计划é™é€Ÿå§‹äºŽ" ++ ++msgid "Alternative speed time day" ++msgstr "计划é™é€Ÿæ—¥æœŸ" ++ ++msgid "Alternative speed time end" ++msgstr "计划é™é€Ÿæ­¢äºŽ" ++ ++msgid "Alternative speed timing enabled" ++msgstr "å¯ç”¨è®¡åˆ’é™é€Ÿ" ++ ++msgid "Alternative upload speed" ++msgstr "临时上传速度" ++ ++msgid "Automatically start added torrents" ++msgstr "ç§å­è‡ªåŠ¨ä¸‹è½½" ++ ++msgid "Bandwidth settings" ++msgstr "带宽é…ç½®" ++ ++msgid "Binding address IPv4" ++msgstr "绑定IPv4地å€" ++ ++msgid "Binding address IPv6" ++msgstr "绑定IPv6地å€" ++ ++msgid "Block list enabled" ++msgstr "å¯ç”¨é˜»æ­¢åˆ—表" ++ ++msgid "Blocklist URL" ++msgstr "URL阻止清å•" ++ ++msgid "Blocklists" ++msgstr "阻止清å•" ++ ++msgid "Cache size in MB" ++msgstr "缓存大å°ï¼ˆMB)" ++ ++msgid "Config file directory" ++msgstr "é…置文件的目录" ++ ++msgid "DHT enabled" ++msgstr "å¯ç”¨DHT" ++ ++msgid "Debug" ++msgstr "调试" ++ ++msgid "Download directory" ++msgstr "下载目录" ++ ++msgid "Download queue enabled" ++msgstr "å¯ç”¨ä¸‹è½½é˜Ÿåˆ—" ++ ++msgid "Download queue size" ++msgstr "下载队列大å°" ++ ++msgid "Enable watch directory" ++msgstr "å¯ç”¨ç§å­è½®è¯¢ç›®å½•" ++ ++msgid "Enabled" ++msgstr "å¯ç”¨" ++ ++msgid "Encryption" ++msgstr "加密" ++ ++msgid "Error" ++msgstr "错误" ++ ++msgid "Fast" ++msgstr "快速" ++ ++msgid "Files and Locations" ++msgstr "文件和ä½ç½®" ++ ++msgid "Forced" ++msgstr "强制" ++ ++msgid "Full" ++msgstr "全分é…" ++ ++msgid "Global peer limit" ++msgstr "全局Peeré™åˆ¶" ++ ++msgid "Global settings" ++msgstr "全局设置" ++ ++msgid "Idle seeding limit" ++msgstr "空闲åšç§é™æ—¶" ++ ++msgid "Idle seeding limit enabled" ++msgstr "å¯ç”¨ç©ºé—²åšç§æ—¶é—´" ++ ++msgid "Incomplete directory" ++msgstr "未完æˆç›®å½•" ++ ++msgid "Incomplete directory enabled" ++msgstr "å¯ç”¨æœªå®Œæˆç›®å½•" ++ ++msgid "Info" ++msgstr "ä¿¡æ¯" ++ ++msgid "LPD enabled" ++msgstr "å¯ç”¨LPD" ++ ++msgid "Lazy bitfield enabled" ++msgstr "å¯ç”¨ä½æ®µå»¶è¿Ÿ" ++ ++msgid "Message level" ++msgstr "消æ¯çº§åˆ«" ++ ++msgid "Miscellaneous" ++msgstr "其他å‚æ•°" ++ ++msgid "None" ++msgstr "空" ++ ++msgid "" ++"Number/bitfield. Start with 0, then for each day you want the scheduler " ++"enabled, add a value. For Sunday - 1, Monday - 2, Tuesday - 4, Wednesday - " ++"8, Thursday - 16, Friday - 32, Saturday - 64" ++msgstr "生效日期是对应日期的算术加和值。对应关系:周日-1ã€å‘¨ä¸€-2ã€å‘¨äºŒ-4ã€å‘¨ä¸‰-8ã€å‘¨å››-16ã€å‘¨äº”-32ã€å‘¨å…­-64。" ++ ++msgid "Off" ++msgstr "关闭" ++ ++msgid "Open Web Interface" ++msgstr "Web管ç†ç•Œé¢" ++ ++msgid "PEX enabled" ++msgstr "å¯ç”¨PEX" ++ ++msgid "Peer Port settings" ++msgstr "Peer端å£è®¾ç½®" ++ ++msgid "Peer congestion algorithm" ++msgstr "Peer拥塞算法" ++ ++msgid "Peer limit per torrent" ++msgstr "æ¯ä¸ªç§å­Peeré™åˆ¶æ•°" ++ ++msgid "Peer port" ++msgstr "Peer端å£" ++ ++msgid "Peer port random high" ++msgstr "Peeréšæœºç«¯å£æœ€å¤§å€¼" ++ ++msgid "Peer port random low" ++msgstr "Peeréšæœºç«¯å£æœ€å°å€¼" ++ ++msgid "Peer port random on start" ++msgstr "Peer端å£éšæœº" ++ ++msgid "Peer settings" ++msgstr "Peer设置" ++ ++msgid "Peer socket tos" ++msgstr "Peer套接字tos值" ++ ++msgid "Port forwarding enabled" ++msgstr "å¯ç”¨ç«¯å£è½¬å‘" ++ ++msgid "Preferred" ++msgstr "优先" ++ ++msgid "Prefetch enabled" ++msgstr "å¯ç”¨é¢„å–缓存" ++ ++msgid "Queue stalled enabled" ++msgstr "å¯ç”¨é˜Ÿåˆ—æš‚åœ" ++ ++msgid "Queue stalled minutes" ++msgstr "队列暂åœåˆ†é’Ÿ" ++ ++msgid "Queueing" ++msgstr "队列" ++ ++msgid "RPC URL" ++msgstr "RPC URL" ++ ++msgid "RPC authentication required" ++msgstr "PRC授æƒéªŒè¯" ++ ++msgid "RPC bind address" ++msgstr "RPC绑定地å€" ++ ++msgid "RPC enabled" ++msgstr "å¯ç”¨PRC" ++ ++msgid "RPC password" ++msgstr "RPC密ç " ++ ++msgid "RPC port" ++msgstr "RPC端å£" ++ ++msgid "RPC settings" ++msgstr "RPCé…ç½®" ++ ++msgid "RPC username" ++msgstr "RPC用户å" ++ ++msgid "RPC whitelist" ++msgstr "RPC白åå•" ++ ++msgid "RPC whitelist enabled" ++msgstr "å¯ç”¨RPC白åå•" ++ ++msgid "Ratio limit" ++msgstr "分享率é™å€¼" ++ ++msgid "Ratio limit enabled" ++msgstr "å¯ç”¨åˆ†äº«çŽ‡é™åˆ¶" ++ ++msgid "Rename partial files" ++msgstr "é‡å‘½å未完æˆæ–‡ä»¶" ++ ++msgid "Run daemon as user" ++msgstr "用户组" ++ ++msgid "Scheduling" ++msgstr "计划任务" ++ ++msgid "Scrape paused torrents enabled" ++msgstr "忽略暂åœçš„ç§å­" ++ ++msgid "Script torrent done enabled" ++msgstr "ç§å­å®Œæˆæ—¶è¿è¡Œè„šæœ¬" ++ ++msgid "Script torrent done filename" ++msgstr "脚本文件å" ++ ++msgid "Seed queue enabled" ++msgstr "å¯ç”¨åšç§é˜Ÿåˆ—" ++ ++msgid "Seed queue size" ++msgstr "åšç§é˜Ÿåˆ—大å°" ++ ++msgid "Speed limit down" ++msgstr "下载é™é€Ÿ" ++ ++msgid "Speed limit down enabled" ++msgstr "å¯ç”¨ä¸‹è½½é™é€Ÿ" ++ ++msgid "Speed limit up" ++msgstr "上传é™é€Ÿ" ++ ++msgid "Speed limit up enabled" ++msgstr "å¯ç”¨ä¸Šä¼ é™é€Ÿ" ++ ++msgid "Transmission" ++msgstr "Transmission" ++ ++msgid "" ++"Transmission daemon is a simple bittorrent client, here you can configure " ++"the settings." ++msgstr "Transmission是个简å•æ˜“用的BT/PT客户端。" ++ ++msgid "Trash original torrent files" ++msgstr "删除ç§å­æºæ–‡ä»¶" ++ ++msgid "Upload slots per torrent" ++msgstr "æ¯ä¸ªç§å­ä¸Šä¼ è¿žæŽ¥æ•°" ++ ++msgid "Watch directory" ++msgstr "轮询ç§å­ç›®å½•" ++ ++msgid "in minutes from midnight" ++msgstr "从晚上00:00起的分钟数,é™é€Ÿåˆ°ä¸´æ—¶é€Ÿåº¦" ++ ++msgid "preallocation" ++msgstr "ç£ç›˜é¢„分é…ç­–ç•¥" ++ ++msgid "uTP enabled" ++msgstr "å¯ç”¨uTP" +diff --git a/feeds/luci/applications/luci-app-transmission/po/zh-tw/transmission.po b/feeds/luci/applications/luci-app-transmission/po/zh-tw/transmission.po +new file mode 100644 +index 0000000..78da18d +--- /dev/null ++++ b/feeds/luci/applications/luci-app-transmission/po/zh-tw/transmission.po +@@ -0,0 +1,295 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"PO-Revision-Date: 2014-05-16 23:11+0200\n" ++"Last-Translator: omnistack \n" ++"Language-Team: none\n" ++"Language: zh_TW\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=1; plural=0;\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "Alternative download speed" ++msgstr "P2P代抓下載速度" ++ ++msgid "Alternative speed enabled" ++msgstr "P2P代抓速度啟用" ++ ++msgid "Alternative speed time begin" ++msgstr "P2P代抓起始時間" ++ ++msgid "Alternative speed time day" ++msgstr "P2P代抓起æ¯æ—¥æ™‚é–“" ++ ++msgid "Alternative speed time end" ++msgstr "P2P代抓çµæŸæ™‚é–“" ++ ++msgid "Alternative speed timing enabled" ++msgstr "P2P代抓週期機制啟用" ++ ++msgid "Alternative upload speed" ++msgstr "P2P代抓上傳速度" ++ ++msgid "Automatically start added torrents" ++msgstr "當增加種å­å¾Œè‡ªå‹•é–‹å§‹ä¸‹è¼‰" ++ ++msgid "Bandwidth settings" ++msgstr "æµé‡è¨­å®š" ++ ++msgid "Binding address IPv4" ++msgstr "ç¶å®šçš„IPv4ä½ç½®" ++ ++msgid "Binding address IPv6" ++msgstr "ç¶å®šçš„IPv6ä½ç½®" ++ ++msgid "Block list enabled" ++msgstr "啟用å°éŽ–列表" ++ ++msgid "Blocklist URL" ++msgstr "å°éŽ–URL" ++ ++msgid "Blocklists" ++msgstr "å°éŽ–列表" ++ ++msgid "Cache size in MB" ++msgstr "å¿«å–大å°(MB)" ++ ++msgid "Config file directory" ++msgstr "設定檔目錄" ++ ++msgid "DHT enabled" ++msgstr "DHT啟用" ++ ++msgid "Debug" ++msgstr "åµéŒ¯" ++ ++msgid "Download directory" ++msgstr "下載目錄" ++ ++msgid "Download queue enabled" ++msgstr "啟用下載隊列" ++ ++msgid "Download queue size" ++msgstr "下載隊列大å°" ++ ++msgid "Enable watch directory" ++msgstr "啟用觀看目錄" ++ ++msgid "Enabled" ++msgstr "啟用" ++ ++msgid "Encryption" ++msgstr "加密" ++ ++msgid "Error" ++msgstr "錯誤" ++ ++msgid "Fast" ++msgstr "快速" ++ ++msgid "Files and Locations" ++msgstr "檔案和ä½ç½®" ++ ++msgid "Forced" ++msgstr "強制" ++ ++msgid "Full" ++msgstr "全速" ++ ++msgid "Global peer limit" ++msgstr "一般連接é™åˆ¶" ++ ++msgid "Global settings" ++msgstr "一般設定" ++ ++msgid "Idle seeding limit" ++msgstr "閒置作種é™åˆ¶" ++ ++msgid "Idle seeding limit enabled" ++msgstr "閒置作種é™åˆ¶æ©Ÿåˆ¶å•Ÿç”¨" ++ ++msgid "Incomplete directory" ++msgstr "ä¸å®Œæ•´çš„目錄路徑" ++ ++msgid "Incomplete directory enabled" ++msgstr "ä¸å®Œæ•´çš„目錄置放å€æ©Ÿåˆ¶å•Ÿç”¨" ++ ++msgid "Info" ++msgstr "資訊" ++ ++msgid "LPD enabled" ++msgstr "LPD啟用" ++ ++msgid "Lazy bitfield enabled" ++msgstr "防ISP懶散悠閒抓法啟用" ++ ++msgid "Message level" ++msgstr "訊æ¯ç­‰ç´š" ++ ++msgid "Miscellaneous" ++msgstr "雜項" ++ ++msgid "None" ++msgstr "None" ++ ++msgid "" ++"Number/bitfield. Start with 0, then for each day you want the scheduler " ++"enabled, add a value. For Sunday - 1, Monday - 2, Tuesday - 4, Wednesday - " ++"8, Thursday - 16, Friday - 32, Saturday - 64" ++msgstr "" ++"數字/欄ä½. ç”±0開始,æ¯æ—¥ä½ è‹¥è¦å•Ÿç”¨æŽ’程,就加上新數值. 星期日 -1, 星期一 -2, 星期二 -4, 星期三 -8, 星期四-16, " ++"星期五-32星期六 -64" ++ ++msgid "Off" ++msgstr "關閉" ++ ++msgid "Open Web Interface" ++msgstr "é–‹å•ŸWeb介é¢" ++ ++msgid "PEX enabled" ++msgstr "啟用PEX" ++ ++msgid "Peer Port settings" ++msgstr "P2P節點埠號設定" ++ ++msgid "Peer congestion algorithm" ++msgstr "P2P節點堵塞演算法" ++ ++msgid "Peer limit per torrent" ++msgstr "P2P節點æ¯å€‹ç¨®å­çš„é™åˆ¶" ++ ++msgid "Peer port" ++msgstr "P2P節點埠號" ++ ++msgid "Peer port random high" ++msgstr "P2P節點較高隨機埠號" ++ ++msgid "Peer port random low" ++msgstr "P2P節點較低隨機埠號" ++ ++msgid "Peer port random on start" ++msgstr "一開始就啟用P2P節點隨機埠" ++ ++msgid "Peer settings" ++msgstr "埠號設定" ++ ++msgid "Peer socket tos" ++msgstr "P2P節點優先IPæ’槽" ++ ++msgid "Port forwarding enabled" ++msgstr "埠轉發啟用" ++ ++msgid "Preferred" ++msgstr "首é¸" ++ ++msgid "Prefetch enabled" ++msgstr "é é¸å•Ÿç”¨" ++ ++msgid "Queue stalled enabled" ++msgstr "隊列åœæ»¯å•Ÿç”¨" ++ ++msgid "Queue stalled minutes" ++msgstr "隊列åœæ»¯åˆ†é˜" ++ ++msgid "Queueing" ++msgstr "排隊中" ++ ++msgid "RPC URL" ++msgstr "é ç«¯èª¿ç”¨ç¶²å€" ++ ++msgid "RPC authentication required" ++msgstr "é ç«¯èª¿ç”¨éœ€è¦é©—è­‰" ++ ++msgid "RPC bind address" ++msgstr "é ç«¯èª¿ç”¨ç¶å®šä½å€" ++ ++msgid "RPC enabled" ++msgstr "é ç«¯èª¿ç”¨åŠŸèƒ½å•Ÿç”¨" ++ ++msgid "RPC password" ++msgstr "é ç«¯èª¿ç”¨å¯†ç¢¼" ++ ++msgid "RPC port" ++msgstr "é ç«¯èª¿ç”¨åŸ è™Ÿ" ++ ++msgid "RPC settings" ++msgstr "é ç«¯èª¿ç”¨è¨­å®š" ++ ++msgid "RPC username" ++msgstr "é ç«¯èª¿ç”¨ç”¨æˆ¶å稱" ++ ++msgid "RPC whitelist" ++msgstr "é ç«¯èª¿ç”¨ç™½åå–®" ++ ++msgid "RPC whitelist enabled" ++msgstr "啟用é ç«¯èª¿ç”¨ç™½åå–®" ++ ++msgid "Ratio limit" ++msgstr "比率é™åˆ¶" ++ ++msgid "Ratio limit enabled" ++msgstr "啟用比率é™åˆ¶" ++ ++msgid "Rename partial files" ++msgstr "ä¸å®Œæ•´æª”案更å" ++ ++msgid "Run daemon as user" ++msgstr "åƒç”¨æˆ¶ä½¿ç”¨ä¸€æ¨£å¸¸é§" ++ ++msgid "Scheduling" ++msgstr "排程" ++ ++msgid "Scrape paused torrents enabled" ++msgstr "下載暫åœé–‹å§‹åšç¨®" ++ ++msgid "Script torrent done enabled" ++msgstr "作種腳本啟用" ++ ++msgid "Script torrent done filename" ++msgstr "作種腳本檔å" ++ ++msgid "Seed queue enabled" ++msgstr "啟用作種隊列" ++ ++msgid "Seed queue size" ++msgstr "作種隊列大å°" ++ ++msgid "Speed limit down" ++msgstr "下載速度é™åˆ¶" ++ ++msgid "Speed limit down enabled" ++msgstr "啟用下載速度é™åˆ¶" ++ ++msgid "Speed limit up" ++msgstr "上傳速度é™åˆ¶" ++ ++msgid "Speed limit up enabled" ++msgstr "啟用上傳速度é™åˆ¶" ++ ++msgid "Transmission" ++msgstr "傳輸任務" ++ ++msgid "" ++"Transmission daemon is a simple bittorrent client, here you can configure " ++"the settings." ++msgstr "傳輸任務常é§æ˜¯ä¸€å€‹ç°¡å–®çš„bittorrent用戶端程å¼, 這裡你å¯ä»¥é…置設定" ++ ++msgid "Trash original torrent files" ++msgstr "丟棄來æºç¨®å­æª”" ++ ++msgid "Upload slots per torrent" ++msgstr "æ¯å€‹ç¨®å­çš„上傳æ’槽數" ++ ++msgid "Watch directory" ++msgstr "監看目錄" ++ ++msgid "in minutes from midnight" ++msgstr "從åˆå¤œç®—起用分表示" ++ ++msgid "preallocation" ++msgstr "é å…ˆåˆ†é…" ++ ++msgid "uTP enabled" ++msgstr "啟用uTP" +diff --git a/feeds/luci/applications/luci-app-transmission/root/etc/uci-defaults/luci-transmission b/feeds/luci/applications/luci-app-transmission/root/etc/uci-defaults/luci-transmission +new file mode 100644 +index 0000000..456e8b8 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-transmission/root/etc/uci-defaults/luci-transmission +@@ -0,0 +1,11 @@ ++#!/bin/sh ++ ++uci -q batch <<-EOF >/dev/null ++ delete ucitrack.@tranmsmission[-1] ++ add ucitrack transmission ++ set ucitrack.@transmission[-1].init=transmission ++ commit ucitrack ++EOF ++ ++rm -f /tmp/luci-indexcache ++exit 0 +diff --git a/feeds/luci/applications/luci-app-udpxy/Makefile b/feeds/luci/applications/luci-app-udpxy/Makefile +new file mode 100644 +index 0000000..cb8f179 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-udpxy/Makefile +@@ -0,0 +1,14 @@ ++# ++# Copyright (C) 2008-2014 The LuCI Team ++# ++# This is free software, licensed under the Apache License, Version 2.0 . ++# ++ ++include $(TOPDIR)/rules.mk ++ ++LUCI_TITLE:=LuCI Support for udpxy ++LUCI_DEPENDS:=+udpxy ++ ++include ../../luci.mk ++ ++# call BuildPackage - OpenWrt buildroot signature +diff --git a/feeds/luci/applications/luci-app-udpxy/luasrc/controller/udpxy.lua b/feeds/luci/applications/luci-app-udpxy/luasrc/controller/udpxy.lua +new file mode 100644 +index 0000000..36a40dd +--- /dev/null ++++ b/feeds/luci/applications/luci-app-udpxy/luasrc/controller/udpxy.lua +@@ -0,0 +1,14 @@ ++-- Copyright 2014 Ãlvaro Fernández Rojas ++-- Licensed to the public under the Apache License 2.0. ++ ++module("luci.controller.udpxy", package.seeall) ++ ++function index() ++ if not nixio.fs.access("/etc/config/udpxy") then ++ return ++ end ++ ++ local page = entry({"admin", "services", "udpxy"}, cbi("udpxy"), _("udpxy")) ++ page.dependent = true ++ ++end +diff --git a/feeds/luci/applications/luci-app-udpxy/luasrc/model/cbi/udpxy.lua b/feeds/luci/applications/luci-app-udpxy/luasrc/model/cbi/udpxy.lua +new file mode 100644 +index 0000000..d823da0 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-udpxy/luasrc/model/cbi/udpxy.lua +@@ -0,0 +1,63 @@ ++-- Copyright 2014 Ãlvaro Fernández Rojas ++-- Licensed to the public under the Apache License 2.0. ++ ++m = Map("udpxy", "udpxy", translate("udpxy is a UDP-to-HTTP multicast traffic relay daemon, here you can configure the settings.")) ++ ++s = m:section(TypedSection, "udpxy", "") ++s.addremove = true ++s.anonymous = false ++ ++enable=s:option(Flag, "disabled", translate("Enabled")) ++enable.enabled="0" ++enable.disabled="1" ++enable.default = "1" ++enable.rmempty = false ++respawn=s:option(Flag, "respawn", translate("Respawn")) ++respawn.default = false ++ ++verbose=s:option(Flag, "verbose", translate("Verbose")) ++verbose.default = false ++ ++status=s:option(Flag, "status", translate("Status")) ++ ++bind=s:option(Value, "bind", translate("Bind IP/Interface")) ++bind.rmempty = true ++bind.datatype = "or(ipaddr, network)" ++ ++port=s:option(Value, "port", translate("Port")) ++port.rmempty = true ++port.datatype = "port" ++ ++source=s:option(Value, "source", translate("Source IP/Interface")) ++source.rmempty = true ++source.datatype = "or(ipaddr, network)" ++ ++max_clients=s:option(Value, "max_clients", translate("Max clients")) ++max_clients.rmempty = true ++max_clients.datatype = "range(1, 5000)" ++ ++log_file=s:option(Value, "log_file", translate("Log file")) ++log_file.rmempty = true ++--log_file.datatype = "file" ++ ++buffer_size=s:option(Value, "buffer_size", translate("Buffer size")) ++buffer_size.rmempty = true ++buffer_size.datatype = "range(4096,2097152)" ++ ++buffer_messages=s:option(Value, "buffer_messages", translate("Buffer messages")) ++buffer_messages.rmempty = true ++buffer_messages.datatype = "or(-1, and(min(1), uinteger))" ++ ++buffer_time=s:option(Value, "buffer_time", translate("Buffer time")) ++buffer_time.rmempty = true ++buffer_time.datatype = "or(-1, and(min(1), uinteger))" ++ ++nice_increment=s:option(Value, "nice_increment", translate("Nice increment")) ++nice_increment.rmempty = true ++nice_increment.datatype = "or(and(max(-1), integer),and(min(1), integer))" ++ ++mcsub_renew=s:option(Value, "mcsub_renew", translate("Multicast subscription renew")) ++mcsub_renew.rmempty = true ++mcsub_renew.datatype = "or(0, range(30, 64000))" ++ ++return m +diff --git a/feeds/luci/applications/luci-app-udpxy/root/etc/uci-defaults/luci-udpxy b/feeds/luci/applications/luci-app-udpxy/root/etc/uci-defaults/luci-udpxy +new file mode 100644 +index 0000000..e93c078 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-udpxy/root/etc/uci-defaults/luci-udpxy +@@ -0,0 +1,12 @@ ++#!/bin/sh ++ ++# needed for "Save and Apply" to restart udpxy ++uci -q batch <<-EOF >/dev/null ++ delete ucitrack.@udpxy[-1] ++ add ucitrack udpxy ++ set ucitrack.@udpxy[-1].init="udpxy" ++ commit ucitrack ++EOF ++ ++rm -f /tmp/luci-indexcache ++exit 0 +diff --git a/feeds/luci/applications/luci-app-upnp/Makefile b/feeds/luci/applications/luci-app-upnp/Makefile +new file mode 100644 +index 0000000..324e3e2 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-upnp/Makefile +@@ -0,0 +1,14 @@ ++# ++# Copyright (C) 2008-2014 The LuCI Team ++# ++# This is free software, licensed under the Apache License, Version 2.0 . ++# ++ ++include $(TOPDIR)/rules.mk ++ ++LUCI_TITLE:=Universal Plug & Play configuration module ++LUCI_DEPENDS:=+miniupnpd ++ ++include ../../luci.mk ++ ++# call BuildPackage - OpenWrt buildroot signature +diff --git a/feeds/luci/applications/luci-app-upnp/luasrc/controller/upnp.lua b/feeds/luci/applications/luci-app-upnp/luasrc/controller/upnp.lua +new file mode 100644 +index 0000000..790bf29 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-upnp/luasrc/controller/upnp.lua +@@ -0,0 +1,74 @@ ++-- Copyright 2008 Steven Barth ++-- Copyright 2008 Jo-Philipp Wich ++-- Licensed to the public under the Apache License 2.0. ++ ++module("luci.controller.upnp", package.seeall) ++ ++function index() ++ if not nixio.fs.access("/etc/config/upnpd") then ++ return ++ end ++ ++ local page ++ ++ page = entry({"admin", "services", "upnp"}, cbi("upnp/upnp"), _("UPNP")) ++ page.dependent = true ++ ++ entry({"admin", "services", "upnp", "status"}, call("act_status")).leaf = true ++ entry({"admin", "services", "upnp", "delete"}, call("act_delete")).leaf = true ++end ++ ++function act_status() ++ local ipt = io.popen("iptables --line-numbers -t nat -xnvL MINIUPNPD 2>/dev/null") ++ if ipt then ++ local fwd = { } ++ while true do ++ local ln = ipt:read("*l") ++ if not ln then ++ break ++ elseif ln:match("^%d+") then ++ local num, proto, extport, intaddr, intport = ++ ln:match("^(%d+).-([a-z]+).-dpt:(%d+) to:(%S-):(%d+)") ++ ++ if num and proto and extport and intaddr and intport then ++ num = tonumber(num) ++ extport = tonumber(extport) ++ intport = tonumber(intport) ++ ++ fwd[#fwd+1] = { ++ num = num, ++ proto = proto:upper(), ++ extport = extport, ++ intaddr = intaddr, ++ intport = intport ++ } ++ end ++ end ++ end ++ ++ ipt:close() ++ ++ luci.http.prepare_content("application/json") ++ luci.http.write_json(fwd) ++ end ++end ++ ++function act_delete(num) ++ local idx = tonumber(num) ++ local uci = luci.model.uci.cursor() ++ ++ if idx and idx > 0 then ++ luci.sys.call("iptables -t filter -D MINIUPNPD %d 2>/dev/null" % idx) ++ luci.sys.call("iptables -t nat -D MINIUPNPD %d 2>/dev/null" % idx) ++ ++ local lease_file = uci:get("upnpd", "config", "upnp_lease_file") ++ if lease_file and nixio.fs.access(lease_file) then ++ luci.sys.call("sed -i -e '%dd' %q" %{ idx, lease_file }) ++ end ++ ++ luci.http.status(200, "OK") ++ return ++ end ++ ++ luci.http.status(400, "Bad request") ++end +diff --git a/feeds/luci/applications/luci-app-upnp/luasrc/model/cbi/upnp/upnp.lua b/feeds/luci/applications/luci-app-upnp/luasrc/model/cbi/upnp/upnp.lua +new file mode 100644 +index 0000000..f1bb450 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-upnp/luasrc/model/cbi/upnp/upnp.lua +@@ -0,0 +1,103 @@ ++-- Copyright 2008 Steven Barth ++-- Copyright 2008-2011 Jo-Philipp Wich ++-- Licensed to the public under the Apache License 2.0. ++ ++m = Map("upnpd", luci.util.pcdata(translate("Universal Plug & Play")), ++ translate("UPnP allows clients in the local network to automatically configure the router.")) ++ ++m:section(SimpleSection).template = "upnp_status" ++ ++s = m:section(NamedSection, "config", "upnpd", translate("MiniUPnP settings")) ++s.addremove = false ++s:tab("general", translate("General Settings")) ++s:tab("advanced", translate("Advanced Settings")) ++ ++e = s:taboption("general", Flag, "_init", translate("Start UPnP and NAT-PMP service")) ++e.rmempty = false ++ ++function e.cfgvalue(self, section) ++ return luci.sys.init.enabled("miniupnpd") and self.enabled or self.disabled ++end ++ ++function e.write(self, section, value) ++ if value == "1" then ++ luci.sys.call("/etc/init.d/miniupnpd enable >/dev/null") ++ luci.sys.call("/etc/init.d/miniupnpd start >/dev/null") ++ else ++ luci.sys.call("/etc/init.d/miniupnpd stop >/dev/null") ++ luci.sys.call("/etc/init.d/miniupnpd disable >/dev/null") ++ end ++end ++ ++s:taboption("general", Flag, "enable_upnp", translate("Enable UPnP functionality")).default = "1" ++s:taboption("general", Flag, "enable_natpmp", translate("Enable NAT-PMP functionality")).default = "1" ++ ++s:taboption("general", Flag, "secure_mode", translate("Enable secure mode"), ++ translate("Allow adding forwards only to requesting ip addresses")).default = "1" ++ ++s:taboption("general", Flag, "log_output", translate("Enable additional logging"), ++ translate("Puts extra debugging information into the system log")) ++ ++s:taboption("general", Value, "download", translate("Downlink"), ++ translate("Value in KByte/s, informational only")).rmempty = true ++ ++s:taboption("general", Value, "upload", translate("Uplink"), ++ translate("Value in KByte/s, informational only")).rmempty = true ++ ++port = s:taboption("general", Value, "port", translate("Port")) ++port.datatype = "port" ++port.default = 5000 ++ ++ ++s:taboption("advanced", Flag, "system_uptime", translate("Report system instead of daemon uptime")).default = "1" ++ ++s:taboption("advanced", Value, "uuid", translate("Device UUID")) ++s:taboption("advanced", Value, "serial_number", translate("Announced serial number")) ++s:taboption("advanced", Value, "model_number", translate("Announced model number")) ++ ++ni = s:taboption("advanced", Value, "notify_interval", translate("Notify interval")) ++ni.datatype = "uinteger" ++ni.placeholder = 30 ++ ++ct = s:taboption("advanced", Value, "clean_ruleset_threshold", translate("Clean rules threshold")) ++ct.datatype = "uinteger" ++ct.placeholder = 20 ++ ++ci = s:taboption("advanced", Value, "clean_ruleset_interval", translate("Clean rules interval")) ++ci.datatype = "uinteger" ++ci.placeholder = 600 ++ ++pu = s:taboption("advanced", Value, "presentation_url", translate("Presentation URL")) ++pu.placeholder = "http://192.168.1.1/" ++ ++lf = s:taboption("advanced", Value, "upnp_lease_file", translate("UPnP lease file")) ++lf.placeholder = "/var/log/upnp.leases" ++ ++ ++s2 = m:section(TypedSection, "perm_rule", translate("MiniUPnP ACLs"), ++ translate("ACLs specify which external ports may be redirected to which internal addresses and ports")) ++ ++s2.template = "cbi/tblsection" ++s2.sortable = true ++s2.anonymous = true ++s2.addremove = true ++ ++s2:option(Value, "comment", translate("Comment")) ++ ++ep = s2:option(Value, "ext_ports", translate("External ports")) ++ep.datatype = "portrange" ++ep.placeholder = "0-65535" ++ ++ia = s2:option(Value, "int_addr", translate("Internal addresses")) ++ia.datatype = "ip4addr" ++ia.placeholder = "0.0.0.0/0" ++ ++ip = s2:option(Value, "int_ports", translate("Internal ports")) ++ip.datatype = "portrange" ++ip.placeholder = "0-65535" ++ ++ac = s2:option(ListValue, "action", translate("Action")) ++ac:value("allow") ++ac:value("deny") ++ ++return m +diff --git a/feeds/luci/applications/luci-app-upnp/luasrc/view/admin_status/index/upnp.htm b/feeds/luci/applications/luci-app-upnp/luasrc/view/admin_status/index/upnp.htm +new file mode 100644 +index 0000000..d0c2e2e +--- /dev/null ++++ b/feeds/luci/applications/luci-app-upnp/luasrc/view/admin_status/index/upnp.htm +@@ -0,0 +1 @@ ++<%+upnp_status%> +diff --git a/feeds/luci/applications/luci-app-upnp/luasrc/view/upnp_status.htm b/feeds/luci/applications/luci-app-upnp/luasrc/view/upnp_status.htm +new file mode 100644 +index 0000000..d50ed0c +--- /dev/null ++++ b/feeds/luci/applications/luci-app-upnp/luasrc/view/upnp_status.htm +@@ -0,0 +1,67 @@ ++ ++ ++
    ++ <%:Active UPnP Redirects%> ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
    <%:Protocol%><%:External Port%><%:Client Address%><%:Client Port%> 

    <%:Collecting data...%>
    ++
    +diff --git a/feeds/luci/applications/luci-app-upnp/po/ca/upnp.po b/feeds/luci/applications/luci-app-upnp/po/ca/upnp.po +new file mode 100644 +index 0000000..3176bb5 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-upnp/po/ca/upnp.po +@@ -0,0 +1,167 @@ ++# upnp.pot ++# generated from ./applications/luci-upnp/luasrc/i18n/upnp.en.lua ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Report-Msgid-Bugs-To: \n" ++"POT-Creation-Date: 2009-06-10 03:40+0200\n" ++"PO-Revision-Date: 2014-07-01 08:38+0200\n" ++"Last-Translator: Alex \n" ++"Language-Team: LANGUAGE \n" ++"Language: ca\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n != 1);\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "" ++"ACLs specify which external ports may be redirected to which internal " ++"addresses and ports" ++msgstr "" ++"Els ACL especifiquen quins ports externs es poden redirigir a quines adreces " ++"i ports interns" ++ ++msgid "Action" ++msgstr "Acció" ++ ++msgid "Active UPnP Redirects" ++msgstr "Redireccions UPnP actives" ++ ++msgid "Advanced Settings" ++msgstr "Ajusts avançats" ++ ++msgid "Allow adding forwards only to requesting ip addresses" ++msgstr "Permet que s'afegeixin redireccions només a les adreces IP peticionant" ++ ++msgid "Announced model number" ++msgstr "Número de model anunciat" ++ ++msgid "Announced serial number" ++msgstr "Número de sèrie anunciat" ++ ++msgid "Clean rules interval" ++msgstr "Interval de neteja de regles" ++ ++msgid "Clean rules threshold" ++msgstr "Llindar de neteja de regles" ++ ++msgid "Client Address" ++msgstr "Adreça de client" ++ ++msgid "Client Port" ++msgstr "Port de client" ++ ++msgid "Collecting data..." ++msgstr "Recollint dades..." ++ ++msgid "Comment" ++msgstr "Comentari" ++ ++msgid "Delete Redirect" ++msgstr "Suprimeix la redirecció" ++ ++msgid "Device UUID" ++msgstr "UUID de dispositiu" ++ ++msgid "Downlink" ++msgstr "Enllaç de baixada" ++ ++msgid "Enable NAT-PMP functionality" ++msgstr "Habilita la funcionalitat NAT-PMP" ++ ++msgid "Enable UPnP functionality" ++msgstr "Habilita la funcionalitat UPnP" ++ ++msgid "Enable additional logging" ++msgstr "Habilita el registre addicional" ++ ++msgid "Enable secure mode" ++msgstr "Habilita mode segur" ++ ++msgid "External Port" ++msgstr "Port extern" ++ ++msgid "External ports" ++msgstr "Ports externs" ++ ++msgid "General Settings" ++msgstr "Ajusts generals" ++ ++msgid "Internal addresses" ++msgstr "Adreces internes" ++ ++msgid "Internal ports" ++msgstr "Ports interns" ++ ++msgid "MiniUPnP ACLs" ++msgstr "ACLs de MiniUPnP" ++ ++msgid "MiniUPnP settings" ++msgstr "Ajusts de MiniUPnP" ++ ++msgid "Notify interval" ++msgstr "Interval de notificació" ++ ++msgid "Port" ++msgstr "Port" ++ ++msgid "Presentation URL" ++msgstr "" ++ ++msgid "Protocol" ++msgstr "Protocol" ++ ++msgid "Puts extra debugging information into the system log" ++msgstr "Posa informació extra de depuració en el registre de sistema" ++ ++msgid "Report system instead of daemon uptime" ++msgstr "Reporta el temps actiu del sistema en lloc del del dimoni" ++ ++msgid "Start UPnP and NAT-PMP service" ++msgstr "Inicia el servei UPnP i NAP-PMP" ++ ++msgid "There are no active redirects." ++msgstr "No hi ha redireccions actives." ++ ++msgid "UPNP" ++msgstr "UPNP" ++ ++msgid "" ++"UPnP allows clients in the local network to automatically configure the " ++"router." ++msgstr "" ++"UPnP permet als clients de la xarxa local configurar automàticament el " ++"router." ++ ++msgid "UPnP lease file" ++msgstr "Fitxer d'arrendament UPnP" ++ ++msgid "Universal Plug & Play" ++msgstr "Universal Plug & Play" ++ ++msgid "Uplink" ++msgstr "Enllaç de pujada" ++ ++msgid "Value in KByte/s, informational only" ++msgstr "Valor en KByte/s, només per informació" ++ ++#~ msgid "" ++#~ "UPNP allows clients in the local network to automatically configure the " ++#~ "router." ++#~ msgstr "" ++#~ "UPnP permet als clients de la xarxa local configurar automàticament el " ++#~ "router." ++ ++#~ msgid "enable" ++#~ msgstr "habilita" ++ ++#~ msgid "Log output" ++#~ msgstr "Registra la sortida" ++ ++#~ msgid "" ++#~ "UPNP should only be enabled if absolutely necessary as it can result in " ++#~ "high security risks for your network." ++#~ msgstr "" ++#~ "Només s'hauria d'activar l'UPnP si és absolutament necessari, ja que en " ++#~ "poden resultar alts riscos de seguretat a la teva xarxa." +diff --git a/feeds/luci/applications/luci-app-upnp/po/cs/upnp.po b/feeds/luci/applications/luci-app-upnp/po/cs/upnp.po +new file mode 100644 +index 0000000..a712f82 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-upnp/po/cs/upnp.po +@@ -0,0 +1,150 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"PO-Revision-Date: 2013-01-29 21:54+0200\n" ++"Last-Translator: Astran \n" ++"Language-Team: none\n" ++"Language: cs\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "" ++"ACLs specify which external ports may be redirected to which internal " ++"addresses and ports" ++msgstr "" ++"ACL stanovují, které vnÄ›jší porty by mÄ›ly být pÅ™esmÄ›rovány na které vnitÅ™ní " ++"adresy a porty" ++ ++msgid "Action" ++msgstr "Akce" ++ ++msgid "Active UPnP Redirects" ++msgstr "Aktivní pÅ™esmÄ›rování UPnP" ++ ++msgid "Advanced Settings" ++msgstr "PokroÄilé nastavení" ++ ++msgid "Allow adding forwards only to requesting ip addresses" ++msgstr "Povolit pÅ™esmÄ›rování pouze na dotazující ip adresy" ++ ++msgid "Announced model number" ++msgstr "Oznámené Äíslo modelu" ++ ++msgid "Announced serial number" ++msgstr "Oznámené sériové Äíslo" ++ ++msgid "Clean rules interval" ++msgstr "Interval ÄiÅ¡tÄ›ní pravidel" ++ ++msgid "Clean rules threshold" ++msgstr "Práh ÄiÅ¡tÄ›ní pravidel" ++ ++msgid "Client Address" ++msgstr "Adresa klienta" ++ ++msgid "Client Port" ++msgstr "Port klienta" ++ ++msgid "Collecting data..." ++msgstr "Probíhá sbÄ›r dat.." ++ ++msgid "Comment" ++msgstr "Komentář" ++ ++msgid "Delete Redirect" ++msgstr "Odstranit pÅ™esmÄ›rování" ++ ++msgid "Device UUID" ++msgstr "UUID zařízení" ++ ++msgid "Downlink" ++msgstr "Downlink" ++ ++msgid "Enable NAT-PMP functionality" ++msgstr "Povolit funkÄnost NAT-PMP" ++ ++msgid "Enable UPnP functionality" ++msgstr "Povolit funkÄnost UPnP" ++ ++msgid "Enable additional logging" ++msgstr "Povolit přídavné logování" ++ ++msgid "Enable secure mode" ++msgstr "Povolit bezpeÄný režim" ++ ++msgid "External Port" ++msgstr "VnÄ›jší port" ++ ++msgid "External ports" ++msgstr "VnÄ›jší porty" ++ ++msgid "General Settings" ++msgstr "Obecné nastavení" ++ ++msgid "Internal addresses" ++msgstr "VnitÅ™ní adresy" ++ ++msgid "Internal ports" ++msgstr "VnitÅ™ní porty" ++ ++msgid "MiniUPnP ACLs" ++msgstr "MiniUPnP ACL listy" ++ ++msgid "MiniUPnP settings" ++msgstr "Nastavení MiniUPnP" ++ ++msgid "Notify interval" ++msgstr "Interval oznamování" ++ ++msgid "Port" ++msgstr "Port" ++ ++msgid "Presentation URL" ++msgstr "Prezentace URL" ++ ++msgid "Protocol" ++msgstr "Protokol" ++ ++msgid "Puts extra debugging information into the system log" ++msgstr "Vypisovat extra ladící informace do systémového záznamu" ++ ++msgid "Report system instead of daemon uptime" ++msgstr "Hlásit uptime systému namísto uptime daemonu" ++ ++msgid "Start UPnP and NAT-PMP service" ++msgstr "Spustit službu UPnP a NAT-PMP" ++ ++msgid "There are no active redirects." ++msgstr "Nejsou zde žádná aktivní pÅ™esmÄ›rování" ++ ++msgid "UPNP" ++msgstr "UPNP" ++ ++msgid "" ++"UPnP allows clients in the local network to automatically configure the " ++"router." ++msgstr "" ++"UPnP umožňuje klientům v místní síti automaticky nakonfigurovat router." ++ ++msgid "UPnP lease file" ++msgstr "Soubor UPnP výpůjÄek" ++ ++msgid "Universal Plug & Play" ++msgstr "Univerzální Plug & Play" ++ ++msgid "Uplink" ++msgstr "Uplink" ++ ++msgid "Value in KByte/s, informational only" ++msgstr "Pouze informaÄní hodnoty (v KByte/s)" ++ ++#~ msgid "" ++#~ "UPNP allows clients in the local network to automatically configure the " ++#~ "router." ++#~ msgstr "UPnP umožňuje klientům v místní síti automaticky nakonfigurovat router." ++ ++#~ msgid "enable" ++#~ msgstr "povolit" +diff --git a/feeds/luci/applications/luci-app-upnp/po/de/upnp.po b/feeds/luci/applications/luci-app-upnp/po/de/upnp.po +new file mode 100644 +index 0000000..2edd93c +--- /dev/null ++++ b/feeds/luci/applications/luci-app-upnp/po/de/upnp.po +@@ -0,0 +1,171 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Report-Msgid-Bugs-To: \n" ++"POT-Creation-Date: 2009-05-26 17:57+0200\n" ++"PO-Revision-Date: 2012-11-28 10:45+0200\n" ++"Last-Translator: dunkelschunkel \n" ++"Language-Team: LANGUAGE \n" ++"Language: de\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n != 1);\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "" ++"ACLs specify which external ports may be redirected to which internal " ++"addresses and ports" ++msgstr "" ++"ACLs definieren, welche externen Ports zu welchen internen Adressen und " ++"Ports weitergeleitet werden dürfen" ++ ++msgid "Action" ++msgstr "Aktion" ++ ++msgid "Active UPnP Redirects" ++msgstr "Aktive UPnP-Weiterleitungen" ++ ++msgid "Advanced Settings" ++msgstr "Erweiterte Einstellungen" ++ ++msgid "Allow adding forwards only to requesting ip addresses" ++msgstr "Nur Weiterleitungen zurück zum anfordernden Client zulassen" ++ ++msgid "Announced model number" ++msgstr "Angekündigte Modellnummer" ++ ++msgid "Announced serial number" ++msgstr "Angekündigte Seriennummer" ++ ++msgid "Clean rules interval" ++msgstr "Aufräumintervall für Weiterleitungen" ++ ++msgid "Clean rules threshold" ++msgstr "Aufräumschwellenwert für Weiterleitungen" ++ ++msgid "Client Address" ++msgstr "Clientadresse" ++ ++msgid "Client Port" ++msgstr "Clientport" ++ ++msgid "Collecting data..." ++msgstr "Sammle Daten..." ++ ++msgid "Comment" ++msgstr "Kommentar" ++ ++msgid "Delete Redirect" ++msgstr "Weiterleitung löschen" ++ ++msgid "Device UUID" ++msgstr "Geräte-UUID" ++ ++msgid "Downlink" ++msgstr "Downlink" ++ ++msgid "Enable NAT-PMP functionality" ++msgstr "NAT-PMP Funktionalität aktivieren" ++ ++msgid "Enable UPnP functionality" ++msgstr "UPnP Funktionalität aktivieren" ++ ++msgid "Enable additional logging" ++msgstr "Erweiterte Protokollierung aktivieren" ++ ++msgid "Enable secure mode" ++msgstr "Sicheren Modus aktivieren" ++ ++msgid "External Port" ++msgstr "Externer Port" ++ ++msgid "External ports" ++msgstr "Externe Ports" ++ ++msgid "General Settings" ++msgstr "Allgemeine Einstellungen" ++ ++msgid "Internal addresses" ++msgstr "Interne Adressen" ++ ++msgid "Internal ports" ++msgstr "Interne Ports" ++ ++msgid "MiniUPnP ACLs" ++msgstr "MiniUPnP ACLs" ++ ++msgid "MiniUPnP settings" ++msgstr "MiniUPnP-Einstellungen" ++ ++msgid "Notify interval" ++msgstr "Benachrichtigungsintervall" ++ ++msgid "Port" ++msgstr "Port" ++ ++msgid "Presentation URL" ++msgstr "Präsentations-URL" ++ ++msgid "Protocol" ++msgstr "Protokoll" ++ ++msgid "Puts extra debugging information into the system log" ++msgstr "Schreibt zusätzliche Debug-Informationen in das Systemprotokoll" ++ ++msgid "Report system instead of daemon uptime" ++msgstr "Systemlaufzeit statt Prozesslaufzeit melden" ++ ++msgid "Start UPnP and NAT-PMP service" ++msgstr "UPnP und NAT-PMP Dienst starten" ++ ++msgid "There are no active redirects." ++msgstr "Es gibt keine aktiven Weiterleitungen." ++ ++msgid "UPNP" ++msgstr "UPnP" ++ ++msgid "" ++"UPnP allows clients in the local network to automatically configure the " ++"router." ++msgstr "" ++"UPnP erlaubt es Clients im lokalen Netzwerk automatisch Port-Weiterleitungen " ++"auf diesem Router einzurichten." ++ ++msgid "UPnP lease file" ++msgstr "UPnP Lease-Datei" ++ ++msgid "Universal Plug & Play" ++msgstr "Universal Plug & Play" ++ ++msgid "Uplink" ++msgstr "Uplink" ++ ++msgid "Value in KByte/s, informational only" ++msgstr "Wert in Kilobyte/s, nur informativ" ++ ++#~ msgid "" ++#~ "UPNP allows clients in the local network to automatically configure the " ++#~ "router." ++#~ msgstr "" ++#~ "UPnP ermöglicht die automatische Konfiguration des Routers durch Clients im " ++#~ "lokalen Netzwerk." ++ ++#~ msgid "enable" ++#~ msgstr "aktivieren" ++ ++#~ msgid "Enable NAT-PMP" ++#~ msgstr "NAT-PMP aktivieren" ++ ++#~ msgid "Enable UPnP Service" ++#~ msgstr "UPnP Service aktivieren" ++ ++#~ msgid "Log output" ++#~ msgstr "Ausgabe protokollieren" ++ ++#~ msgid "" ++#~ "UPNP should only be enabled if absolutely necessary as it can result in " ++#~ "high security risks for your network." ++#~ msgstr "" ++#~ "UPNP sollte nur wenn unbedingt nötig aktiviert werden, da es ein " ++#~ "Sicherheitsrisiko für das Netzwerk darstellen kann." +diff --git a/feeds/luci/applications/luci-app-upnp/po/el/upnp.po b/feeds/luci/applications/luci-app-upnp/po/el/upnp.po +new file mode 100644 +index 0000000..775a7f7 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-upnp/po/el/upnp.po +@@ -0,0 +1,140 @@ ++#, fuzzy ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Report-Msgid-Bugs-To: \n" ++"POT-Creation-Date: 2009-05-28 02:08+0200\n" ++"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" ++"Last-Translator: FULL NAME \n" ++"Language-Team: LANGUAGE \n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"X-Generator: Translate Toolkit 1.1.1\n" ++ ++msgid "" ++"ACLs specify which external ports may be redirected to which internal " ++"addresses and ports" ++msgstr "" ++ ++msgid "Action" ++msgstr "" ++ ++msgid "Active UPnP Redirects" ++msgstr "" ++ ++msgid "Advanced Settings" ++msgstr "" ++ ++msgid "Allow adding forwards only to requesting ip addresses" ++msgstr "" ++ ++msgid "Announced model number" ++msgstr "" ++ ++msgid "Announced serial number" ++msgstr "" ++ ++msgid "Clean rules interval" ++msgstr "" ++ ++msgid "Clean rules threshold" ++msgstr "" ++ ++msgid "Client Address" ++msgstr "" ++ ++msgid "Client Port" ++msgstr "" ++ ++msgid "Collecting data..." ++msgstr "" ++ ++msgid "Comment" ++msgstr "" ++ ++msgid "Delete Redirect" ++msgstr "" ++ ++msgid "Device UUID" ++msgstr "" ++ ++msgid "Downlink" ++msgstr "" ++ ++msgid "Enable NAT-PMP functionality" ++msgstr "" ++ ++msgid "Enable UPnP functionality" ++msgstr "" ++ ++msgid "Enable additional logging" ++msgstr "" ++ ++msgid "Enable secure mode" ++msgstr "" ++ ++msgid "External Port" ++msgstr "" ++ ++msgid "External ports" ++msgstr "" ++ ++msgid "General Settings" ++msgstr "" ++ ++msgid "Internal addresses" ++msgstr "" ++ ++msgid "Internal ports" ++msgstr "" ++ ++msgid "MiniUPnP ACLs" ++msgstr "" ++ ++msgid "MiniUPnP settings" ++msgstr "" ++ ++msgid "Notify interval" ++msgstr "" ++ ++msgid "Port" ++msgstr "" ++ ++msgid "Presentation URL" ++msgstr "" ++ ++msgid "Protocol" ++msgstr "" ++ ++msgid "Puts extra debugging information into the system log" ++msgstr "" ++ ++msgid "Report system instead of daemon uptime" ++msgstr "" ++ ++msgid "Start UPnP and NAT-PMP service" ++msgstr "" ++ ++msgid "There are no active redirects." ++msgstr "" ++ ++msgid "UPNP" ++msgstr "" ++ ++msgid "" ++"UPnP allows clients in the local network to automatically configure the " ++"router." ++msgstr "" ++ ++msgid "UPnP lease file" ++msgstr "" ++ ++msgid "Universal Plug & Play" ++msgstr "" ++ ++msgid "Uplink" ++msgstr "" ++ ++msgid "Value in KByte/s, informational only" ++msgstr "" +diff --git a/feeds/luci/applications/luci-app-upnp/po/en/upnp.po b/feeds/luci/applications/luci-app-upnp/po/en/upnp.po +new file mode 100644 +index 0000000..72d21ba +--- /dev/null ++++ b/feeds/luci/applications/luci-app-upnp/po/en/upnp.po +@@ -0,0 +1,157 @@ ++#, fuzzy ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Report-Msgid-Bugs-To: \n" ++"POT-Creation-Date: 2009-05-19 19:36+0200\n" ++"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" ++"Last-Translator: FULL NAME \n" ++"Language-Team: LANGUAGE \n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"X-Generator: Translate Toolkit 1.1.1\n" ++ ++msgid "" ++"ACLs specify which external ports may be redirected to which internal " ++"addresses and ports" ++msgstr "" ++ ++msgid "Action" ++msgstr "" ++ ++msgid "Active UPnP Redirects" ++msgstr "" ++ ++msgid "Advanced Settings" ++msgstr "" ++ ++msgid "Allow adding forwards only to requesting ip addresses" ++msgstr "" ++ ++msgid "Announced model number" ++msgstr "" ++ ++msgid "Announced serial number" ++msgstr "" ++ ++msgid "Clean rules interval" ++msgstr "" ++ ++msgid "Clean rules threshold" ++msgstr "" ++ ++msgid "Client Address" ++msgstr "" ++ ++msgid "Client Port" ++msgstr "" ++ ++msgid "Collecting data..." ++msgstr "" ++ ++msgid "Comment" ++msgstr "" ++ ++msgid "Delete Redirect" ++msgstr "" ++ ++msgid "Device UUID" ++msgstr "" ++ ++msgid "Downlink" ++msgstr "Downlink" ++ ++msgid "Enable NAT-PMP functionality" ++msgstr "" ++ ++msgid "Enable UPnP functionality" ++msgstr "" ++ ++msgid "Enable additional logging" ++msgstr "" ++ ++msgid "Enable secure mode" ++msgstr "Enable secure mode" ++ ++msgid "External Port" ++msgstr "" ++ ++msgid "External ports" ++msgstr "" ++ ++msgid "General Settings" ++msgstr "" ++ ++msgid "Internal addresses" ++msgstr "" ++ ++msgid "Internal ports" ++msgstr "" ++ ++msgid "MiniUPnP ACLs" ++msgstr "" ++ ++msgid "MiniUPnP settings" ++msgstr "" ++ ++msgid "Notify interval" ++msgstr "" ++ ++msgid "Port" ++msgstr "" ++ ++msgid "Presentation URL" ++msgstr "" ++ ++msgid "Protocol" ++msgstr "" ++ ++msgid "Puts extra debugging information into the system log" ++msgstr "" ++ ++msgid "Report system instead of daemon uptime" ++msgstr "" ++ ++msgid "Start UPnP and NAT-PMP service" ++msgstr "" ++ ++msgid "There are no active redirects." ++msgstr "" ++ ++msgid "UPNP" ++msgstr "" ++ ++msgid "" ++"UPnP allows clients in the local network to automatically configure the " ++"router." ++msgstr "" ++ ++msgid "UPnP lease file" ++msgstr "" ++ ++msgid "Universal Plug & Play" ++msgstr "Universal Plug & Play" ++ ++msgid "Uplink" ++msgstr "Uplink" ++ ++msgid "Value in KByte/s, informational only" ++msgstr "" ++ ++#~ msgid "" ++#~ "UPNP allows clients in the local network to automatically configure the " ++#~ "router." ++#~ msgstr "" ++#~ "UPNP allows clients in the local network to automatically configure the " ++#~ "router." ++ ++#~ msgid "Log output" ++#~ msgstr "Log output" ++ ++#~ msgid "" ++#~ "UPNP should only be enabled if absolutely necessary as it can result in " ++#~ "high security risks for your network." ++#~ msgstr "" ++#~ "UPNP should only be enabled if absolutely necessary as it can result in " ++#~ "high security risks for your network." +diff --git a/feeds/luci/applications/luci-app-upnp/po/es/upnp.po b/feeds/luci/applications/luci-app-upnp/po/es/upnp.po +new file mode 100644 +index 0000000..79a2800 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-upnp/po/es/upnp.po +@@ -0,0 +1,165 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Report-Msgid-Bugs-To: \n" ++"POT-Creation-Date: 2009-06-10 03:41+0200\n" ++"PO-Revision-Date: 2012-10-07 16:11+0200\n" ++"Last-Translator: José Vicente \n" ++"Language-Team: LANGUAGE \n" ++"Language: es\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n != 1);\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "" ++"ACLs specify which external ports may be redirected to which internal " ++"addresses and ports" ++msgstr "" ++"Los ACL especifican qué puertos externos pueden ser redirigidos hacia qué " ++"direcciones y puertos internas" ++ ++msgid "Action" ++msgstr "Acción" ++ ++msgid "Active UPnP Redirects" ++msgstr "Redirecciones UPnP activas" ++ ++msgid "Advanced Settings" ++msgstr "Configuración avanzada" ++ ++msgid "Allow adding forwards only to requesting ip addresses" ++msgstr "Permitir añadir redirecciones sólo a IPs que lo soliciten" ++ ++msgid "Announced model number" ++msgstr "Número de modelo declarado" ++ ++msgid "Announced serial number" ++msgstr "Número de serie declarado" ++ ++msgid "Clean rules interval" ++msgstr "Intervalo de borrado de reglas" ++ ++msgid "Clean rules threshold" ++msgstr "Umbral de borrado de reglas" ++ ++msgid "Client Address" ++msgstr "Dirección del cliente" ++ ++msgid "Client Port" ++msgstr "Puerto del cliente" ++ ++msgid "Collecting data..." ++msgstr "Un momento..." ++ ++msgid "Comment" ++msgstr "Comentario" ++ ++msgid "Delete Redirect" ++msgstr "Borrar redirección" ++ ++msgid "Device UUID" ++msgstr "UUID del dispositivo" ++ ++msgid "Downlink" ++msgstr "Enlace para bajada" ++ ++msgid "Enable NAT-PMP functionality" ++msgstr "Activar la funcionalidad NAT-PMP" ++ ++msgid "Enable UPnP functionality" ++msgstr "Activar la funcionalidad UPnP" ++ ++msgid "Enable additional logging" ++msgstr "Activar registro adicional" ++ ++msgid "Enable secure mode" ++msgstr "Habilitar modo seguro" ++ ++msgid "External Port" ++msgstr "Puerto externo" ++ ++msgid "External ports" ++msgstr "Puertos externos" ++ ++msgid "General Settings" ++msgstr "Configuración general" ++ ++msgid "Internal addresses" ++msgstr "Direcciones internas" ++ ++msgid "Internal ports" ++msgstr "Puertos internos" ++ ++msgid "MiniUPnP ACLs" ++msgstr "ACLs MiniUPnP" ++ ++msgid "MiniUPnP settings" ++msgstr "Configuración MiniUPnP" ++ ++msgid "Notify interval" ++msgstr "Intervalo de notificación" ++ ++msgid "Port" ++msgstr "Puerto" ++ ++msgid "Presentation URL" ++msgstr "URL de presentación" ++ ++msgid "Protocol" ++msgstr "Protocolo" ++ ++msgid "Puts extra debugging information into the system log" ++msgstr "Escribir información de depuración extra en el registro del sistema" ++ ++msgid "Report system instead of daemon uptime" ++msgstr "Informar del tiempo activo del sistema en vez de el del demonio" ++ ++msgid "Start UPnP and NAT-PMP service" ++msgstr "Arrancar servicio UPnP y NAT-PMP" ++ ++msgid "There are no active redirects." ++msgstr "Sin redirecciones activas." ++ ++msgid "UPNP" ++msgstr "UPnP" ++ ++msgid "" ++"UPnP allows clients in the local network to automatically configure the " ++"router." ++msgstr "" ++"UPnP permite que los puestos de la red local configuren automáticamente el " ++"router." ++ ++msgid "UPnP lease file" ++msgstr "Tiempo de cesión UPnP" ++ ++msgid "Universal Plug & Play" ++msgstr "Plug & Play universal" ++ ++msgid "Uplink" ++msgstr "Enlace de subida" ++ ++msgid "Value in KByte/s, informational only" ++msgstr "Valor en KBytes/s (sólo informativo)" ++ ++#~ msgid "" ++#~ "UPNP allows clients in the local network to automatically configure the " ++#~ "router." ++#~ msgstr "" ++#~ "UPnP permite que los puestos de la red local configuren automáticamente el " ++#~ "router." ++ ++#~ msgid "enable" ++#~ msgstr "activar" ++ ++#~ msgid "Log output" ++#~ msgstr "Loguear salida" ++ ++#~ msgid "" ++#~ "UPNP should only be enabled if absolutely necessary as it can result in " ++#~ "high security risks for your network." ++#~ msgstr "" ++#~ "UPNP sólo deberia habilitarse si es abasolutamente necesario ya que puede " ++#~ "comprometer la seguridad de su red." +diff --git a/feeds/luci/applications/luci-app-upnp/po/fr/upnp.po b/feeds/luci/applications/luci-app-upnp/po/fr/upnp.po +new file mode 100644 +index 0000000..0cdb86d +--- /dev/null ++++ b/feeds/luci/applications/luci-app-upnp/po/fr/upnp.po +@@ -0,0 +1,158 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Report-Msgid-Bugs-To: \n" ++"POT-Creation-Date: 2009-05-19 19:36+0200\n" ++"PO-Revision-Date: 2012-11-06 16:09+0200\n" ++"Last-Translator: hogsim \n" ++"Language-Team: LANGUAGE \n" ++"Language: fr\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n > 1);\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "" ++"ACLs specify which external ports may be redirected to which internal " ++"addresses and ports" ++msgstr "" ++"Les ACLs définissent quels ports externes peuvent être redirigés, vers " ++"quelles adresses et ports internes" ++ ++msgid "Action" ++msgstr "Action" ++ ++msgid "Active UPnP Redirects" ++msgstr "Redirections UPnP actives" ++ ++msgid "Advanced Settings" ++msgstr "Paramètres avancés" ++ ++msgid "Allow adding forwards only to requesting ip addresses" ++msgstr "" ++"Permet d'ajouter des redirections seulement vers les adresses IP qui font " ++"des demandes" ++ ++msgid "Announced model number" ++msgstr "Numéro de modèle déclaré" ++ ++msgid "Announced serial number" ++msgstr "Numéro de série déclaré" ++ ++msgid "Clean rules interval" ++msgstr "Intervalle des règles de nettoyage" ++ ++msgid "Clean rules threshold" ++msgstr "Niveau des règles de nettoyage" ++ ++msgid "Client Address" ++msgstr "Adresse du client" ++ ++msgid "Client Port" ++msgstr "Port du client" ++ ++msgid "Collecting data..." ++msgstr "Récupération des données…" ++ ++msgid "Comment" ++msgstr "Commentaire" ++ ++msgid "Delete Redirect" ++msgstr "Détruire la redirection" ++ ++msgid "Device UUID" ++msgstr "UUID du périphérique" ++ ++msgid "Downlink" ++msgstr "Lien descendant" ++ ++msgid "Enable NAT-PMP functionality" ++msgstr "Activer la fonctionnalité NAT-PMP" ++ ++msgid "Enable UPnP functionality" ++msgstr "Activer la fonctionnalité UPnP" ++ ++msgid "Enable additional logging" ++msgstr "Activer la journalisation additionnelle" ++ ++msgid "Enable secure mode" ++msgstr "Activer le mode sécurisé" ++ ++msgid "External Port" ++msgstr "Port externe" ++ ++msgid "External ports" ++msgstr "Ports externes" ++ ++msgid "General Settings" ++msgstr "Paramètres généraux" ++ ++msgid "Internal addresses" ++msgstr "Adresses internes" ++ ++msgid "Internal ports" ++msgstr "Ports internes" ++ ++msgid "MiniUPnP ACLs" ++msgstr "ACLs MiniUPnP" ++ ++msgid "MiniUPnP settings" ++msgstr "Paramètres MiniUPnP" ++ ++msgid "Notify interval" ++msgstr "Intervalle de notification" ++ ++msgid "Port" ++msgstr "Port" ++ ++msgid "Presentation URL" ++msgstr "URL de présentation" ++ ++msgid "Protocol" ++msgstr "Protocole" ++ ++msgid "Puts extra debugging information into the system log" ++msgstr "Rajoute des informations de debug dans le journal-système" ++ ++msgid "Report system instead of daemon uptime" ++msgstr "" ++"Indiquer la durée de fonctionnement du système plutôt que celle du démon UPnP" ++ ++msgid "Start UPnP and NAT-PMP service" ++msgstr "Démarrer les services UPnP et NAT-PMP" ++ ++msgid "There are no active redirects." ++msgstr "Il n'y a pas de redirections actives." ++ ++msgid "UPNP" ++msgstr "UPNP" ++ ++msgid "" ++"UPnP allows clients in the local network to automatically configure the " ++"router." ++msgstr "" ++"UPnP permet à des clients du réseau local de configurer automatiquement le " ++"routeur." ++ ++msgid "UPnP lease file" ++msgstr "Fichier des baux UPnP" ++ ++msgid "Universal Plug & Play" ++msgstr "Universal Plug & Play" ++ ++msgid "Uplink" ++msgstr "Lien remontant" ++ ++msgid "Value in KByte/s, informational only" ++msgstr "Valeur en Ko/s, pour information seulement" ++ ++#~ msgid "" ++#~ "UPNP allows clients in the local network to automatically configure the " ++#~ "router." ++#~ msgstr "" ++#~ "UPnP permet à des clients du réseau local de configurer automatiquement le " ++#~ "routeur." ++ ++#~ msgid "enable" ++#~ msgstr "activer" +diff --git a/feeds/luci/applications/luci-app-upnp/po/he/upnp.po b/feeds/luci/applications/luci-app-upnp/po/he/upnp.po +new file mode 100644 +index 0000000..d673550 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-upnp/po/he/upnp.po +@@ -0,0 +1,136 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Last-Translator: Automatically generated\n" ++"Language-Team: none\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n != 1);\n" ++ ++msgid "" ++"ACLs specify which external ports may be redirected to which internal " ++"addresses and ports" ++msgstr "" ++ ++msgid "Action" ++msgstr "" ++ ++msgid "Active UPnP Redirects" ++msgstr "" ++ ++msgid "Advanced Settings" ++msgstr "" ++ ++msgid "Allow adding forwards only to requesting ip addresses" ++msgstr "" ++ ++msgid "Announced model number" ++msgstr "" ++ ++msgid "Announced serial number" ++msgstr "" ++ ++msgid "Clean rules interval" ++msgstr "" ++ ++msgid "Clean rules threshold" ++msgstr "" ++ ++msgid "Client Address" ++msgstr "" ++ ++msgid "Client Port" ++msgstr "" ++ ++msgid "Collecting data..." ++msgstr "" ++ ++msgid "Comment" ++msgstr "" ++ ++msgid "Delete Redirect" ++msgstr "" ++ ++msgid "Device UUID" ++msgstr "" ++ ++msgid "Downlink" ++msgstr "" ++ ++msgid "Enable NAT-PMP functionality" ++msgstr "" ++ ++msgid "Enable UPnP functionality" ++msgstr "" ++ ++msgid "Enable additional logging" ++msgstr "" ++ ++msgid "Enable secure mode" ++msgstr "" ++ ++msgid "External Port" ++msgstr "" ++ ++msgid "External ports" ++msgstr "" ++ ++msgid "General Settings" ++msgstr "" ++ ++msgid "Internal addresses" ++msgstr "" ++ ++msgid "Internal ports" ++msgstr "" ++ ++msgid "MiniUPnP ACLs" ++msgstr "" ++ ++msgid "MiniUPnP settings" ++msgstr "" ++ ++msgid "Notify interval" ++msgstr "" ++ ++msgid "Port" ++msgstr "" ++ ++msgid "Presentation URL" ++msgstr "" ++ ++msgid "Protocol" ++msgstr "" ++ ++msgid "Puts extra debugging information into the system log" ++msgstr "" ++ ++msgid "Report system instead of daemon uptime" ++msgstr "" ++ ++msgid "Start UPnP and NAT-PMP service" ++msgstr "" ++ ++msgid "There are no active redirects." ++msgstr "" ++ ++msgid "UPNP" ++msgstr "" ++ ++msgid "" ++"UPnP allows clients in the local network to automatically configure the " ++"router." ++msgstr "" ++ ++msgid "UPnP lease file" ++msgstr "" ++ ++msgid "Universal Plug & Play" ++msgstr "" ++ ++msgid "Uplink" ++msgstr "" ++ ++msgid "Value in KByte/s, informational only" ++msgstr "" +diff --git a/feeds/luci/applications/luci-app-upnp/po/hu/upnp.po b/feeds/luci/applications/luci-app-upnp/po/hu/upnp.po +new file mode 100644 +index 0000000..e4c5e12 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-upnp/po/hu/upnp.po +@@ -0,0 +1,155 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"PO-Revision-Date: 2012-03-31 18:32+0200\n" ++"Last-Translator: juhosg \n" ++"Language-Team: none\n" ++"Language: hu\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n != 1);\n" ++"X-Generator: Pootle 2.0.4\n" ++ ++msgid "" ++"ACLs specify which external ports may be redirected to which internal " ++"addresses and ports" ++msgstr "" ++"Az ACL-ek határozzák meg, hogy melyik külsÅ‘ portok melyik belsÅ‘ portokra és " ++"címekre kerülhetnek továbbításra" ++ ++msgid "Action" ++msgstr "Művelet" ++ ++msgid "Active UPnP Redirects" ++msgstr "Aktív UPnP átirányítások" ++ ++msgid "Advanced Settings" ++msgstr "Haladó beállítások" ++ ++msgid "Allow adding forwards only to requesting ip addresses" ++msgstr "" ++"Kizárólag a kérést küldÅ‘ IP címre történÅ‘ továbbítás hozzáadásának " ++"engedélyezése" ++ ++msgid "Announced model number" ++msgstr "Közzétett modelszám" ++ ++msgid "Announced serial number" ++msgstr "Közzétett sorozatszám" ++ ++msgid "Clean rules interval" ++msgstr "Szabály törlési idÅ‘köz" ++ ++msgid "Clean rules threshold" ++msgstr "Szabály törlési küszöbérték" ++ ++msgid "Client Address" ++msgstr "Ãœgyfél cím" ++ ++msgid "Client Port" ++msgstr "Ãœgyfél port" ++ ++msgid "Collecting data..." ++msgstr "Adatok összegyűjtése..." ++ ++msgid "Comment" ++msgstr "Megjegyzés" ++ ++msgid "Delete Redirect" ++msgstr "Ãtirányítás törlése" ++ ++msgid "Device UUID" ++msgstr "Eszköz UUID" ++ ++msgid "Downlink" ++msgstr "Letöltés" ++ ++msgid "Enable NAT-PMP functionality" ++msgstr "NAT-PMP funkció engedélyezése" ++ ++msgid "Enable UPnP functionality" ++msgstr "UPnP funkció engedélyezése" ++ ++msgid "Enable additional logging" ++msgstr "További naplózás engedélyezése" ++ ++msgid "Enable secure mode" ++msgstr "Biztonságos mód engedélyezése" ++ ++msgid "External Port" ++msgstr "KülsÅ‘ port" ++ ++msgid "External ports" ++msgstr "KülsÅ‘ portok" ++ ++msgid "General Settings" ++msgstr "Ãltalános beállítások" ++ ++msgid "Internal addresses" ++msgstr "BelsÅ‘ címek" ++ ++msgid "Internal ports" ++msgstr "BelsÅ‘ portok" ++ ++msgid "MiniUPnP ACLs" ++msgstr "MiniUPnP ACL-ek" ++ ++msgid "MiniUPnP settings" ++msgstr "MiniUPnP beállítások" ++ ++msgid "Notify interval" ++msgstr "Értesítési idÅ‘köz" ++ ++msgid "Port" ++msgstr "Port" ++ ++msgid "Presentation URL" ++msgstr "Bemutatkozó URL" ++ ++msgid "Protocol" ++msgstr "Protokoll" ++ ++msgid "Puts extra debugging information into the system log" ++msgstr "További nyomkövetési információk írása a rendszernaplóba." ++ ++msgid "Report system instead of daemon uptime" ++msgstr "A démon helyett a rendszer működési idejét jeleníti meg" ++ ++msgid "Start UPnP and NAT-PMP service" ++msgstr "UPnP és NAT-PMP szolgáltatás elindítása" ++ ++msgid "There are no active redirects." ++msgstr "Nincsenek aktív átírányítások." ++ ++msgid "UPNP" ++msgstr "UPNP" ++ ++msgid "" ++"UPnP allows clients in the local network to automatically configure the " ++"router." ++msgstr "" ++"Az UPnP lehetÅ‘vé teszi a hálózatban lévÅ‘ ügyfelek számára hogy automatikusan " ++"beállítsák a routert." ++ ++msgid "UPnP lease file" ++msgstr "UPnP bérlet fájl" ++ ++msgid "Universal Plug & Play" ++msgstr "Univerzális Plug and Play" ++ ++msgid "Uplink" ++msgstr "Feltöltés" ++ ++msgid "Value in KByte/s, informational only" ++msgstr "Érték KByte/s-ban, csak tájékoztató jellegű" ++ ++#~ msgid "" ++#~ "UPNP allows clients in the local network to automatically configure the " ++#~ "router." ++#~ msgstr "" ++#~ "Az UPnP lehetÅ‘vé teszi a hálózatban lévÅ‘ ügyfelek számára hogy automatikusan " ++#~ "beállítsák a routert." ++ ++#~ msgid "enable" ++#~ msgstr "engedélyezés" +diff --git a/feeds/luci/applications/luci-app-upnp/po/it/upnp.po b/feeds/luci/applications/luci-app-upnp/po/it/upnp.po +new file mode 100644 +index 0000000..a8ef2e9 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-upnp/po/it/upnp.po +@@ -0,0 +1,155 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Report-Msgid-Bugs-To: \n" ++"POT-Creation-Date: 2009-05-19 19:36+0200\n" ++"PO-Revision-Date: 2013-02-03 13:52+0200\n" ++"Last-Translator: Francesco <3gasas@gmail.com>\n" ++"Language-Team: LANGUAGE \n" ++"Language: it\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n != 1);\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "" ++"ACLs specify which external ports may be redirected to which internal " ++"addresses and ports" ++msgstr "" ++"Le ACL specificano quali porte esterne possono essere redirezionate agli " ++"indirizzi interni e porte." ++ ++msgid "Action" ++msgstr "Azione" ++ ++msgid "Active UPnP Redirects" ++msgstr "Attiva reindirizzamento UPnP" ++ ++msgid "Advanced Settings" ++msgstr "Opzioni Avanzate" ++ ++msgid "Allow adding forwards only to requesting ip addresses" ++msgstr "Permetti l'aggiunta della mappatura solo agli indirizzi IP richiedenti" ++ ++msgid "Announced model number" ++msgstr "Numero di modello annunciato" ++ ++msgid "Announced serial number" ++msgstr "Numero seriale annunciato" ++ ++msgid "Clean rules interval" ++msgstr "Cancella le regole" ++ ++msgid "Clean rules threshold" ++msgstr "Pulisci le regole degli eventi" ++ ++msgid "Client Address" ++msgstr "Indirizzo IP" ++ ++msgid "Client Port" ++msgstr "Porta" ++ ++msgid "Collecting data..." ++msgstr "Raccolgo i dati..." ++ ++msgid "Comment" ++msgstr "Descrizione" ++ ++msgid "Delete Redirect" ++msgstr "Cancella Mappatura" ++ ++msgid "Device UUID" ++msgstr "UUID del dispositivo" ++ ++msgid "Downlink" ++msgstr "Downlink" ++ ++msgid "Enable NAT-PMP functionality" ++msgstr "Abilita il protocollo NAT-PMP" ++ ++msgid "Enable UPnP functionality" ++msgstr "Abilita il protocollo UPnP" ++ ++msgid "Enable additional logging" ++msgstr "Abilita log addizionale" ++ ++msgid "Enable secure mode" ++msgstr "Abilita la modalità sicura" ++ ++msgid "External Port" ++msgstr "Porta Esterna" ++ ++msgid "External ports" ++msgstr "Porte Esterne" ++ ++msgid "General Settings" ++msgstr "Opzioni Generali" ++ ++msgid "Internal addresses" ++msgstr "Indirizzi Interni" ++ ++msgid "Internal ports" ++msgstr "Porte Interne" ++ ++msgid "MiniUPnP ACLs" ++msgstr "MiniUPnP ACLs" ++ ++msgid "MiniUPnP settings" ++msgstr "Opzioni di MiniUPnP" ++ ++msgid "Notify interval" ++msgstr "Intervello di notifica" ++ ++msgid "Port" ++msgstr "Porta" ++ ++msgid "Presentation URL" ++msgstr "URL di presentazione" ++ ++msgid "Protocol" ++msgstr "Protocollo" ++ ++msgid "Puts extra debugging information into the system log" ++msgstr "Scrivi nel log di sistema le informazioni di extra debugging" ++ ++msgid "Report system instead of daemon uptime" ++msgstr "Mostra l'uptime del sistema invece del demone" ++ ++msgid "Start UPnP and NAT-PMP service" ++msgstr "Avvia il servizo UPnP e NAT-PMP" ++ ++msgid "There are no active redirects." ++msgstr "Non ci sono mappature attive." ++ ++msgid "UPNP" ++msgstr "UPNP" ++ ++msgid "" ++"UPnP allows clients in the local network to automatically configure the " ++"router." ++msgstr "" ++"UPnP permette ai dispositivi nella rete locale di configurare " ++"automaticamente il router." ++ ++msgid "UPnP lease file" ++msgstr "UPnP lease file" ++ ++msgid "Universal Plug & Play" ++msgstr "Universal Plug & Play" ++ ++msgid "Uplink" ++msgstr "Uplink" ++ ++msgid "Value in KByte/s, informational only" ++msgstr "Valori in KByte/s, (informativo)" ++ ++#~ msgid "" ++#~ "UPNP allows clients in the local network to automatically configure the " ++#~ "router." ++#~ msgstr "" ++#~ "UPnP permette ai dispositivi nella rete locale di configurare " ++#~ "automaticamente il router." ++ ++#~ msgid "enable" ++#~ msgstr "abilita" +diff --git a/feeds/luci/applications/luci-app-upnp/po/ja/upnp.po b/feeds/luci/applications/luci-app-upnp/po/ja/upnp.po +new file mode 100644 +index 0000000..79e2153 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-upnp/po/ja/upnp.po +@@ -0,0 +1,160 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Report-Msgid-Bugs-To: \n" ++"POT-Creation-Date: 2009-05-19 19:36+0200\n" ++"PO-Revision-Date: 2013-10-05 17:27+0200\n" ++"Last-Translator: Kentaro \n" ++"Language-Team: LANGUAGE \n" ++"Language: ja\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=1; plural=0;\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "" ++"ACLs specify which external ports may be redirected to which internal " ++"addresses and ports" ++msgstr "" ++"アクセス制御リスト(ACL) ã¯ã€ã©ã®å¤–部ãƒãƒ¼ãƒˆã‹ã‚‰ã©ã®å†…部アドレスåŠã³ãƒãƒ¼ãƒˆã¸ãƒª" ++"ダイレクトã™ã‚‹ã‹ã‚’設定ã—ã¾ã™ã€‚" ++ ++msgid "Action" ++msgstr "動作" ++ ++msgid "Active UPnP Redirects" ++msgstr "稼åƒä¸­ã®UPnPリダイレクト" ++ ++msgid "Advanced Settings" ++msgstr "詳細設定" ++ ++msgid "Allow adding forwards only to requesting ip addresses" ++msgstr "" ++ ++msgid "Announced model number" ++msgstr "通知ã™ã‚‹ãƒ¢ãƒ‡ãƒ«ç•ªå·" ++ ++msgid "Announced serial number" ++msgstr "通知ã™ã‚‹ã‚·ãƒªã‚¢ãƒ«ç•ªå·" ++ ++msgid "Clean rules interval" ++msgstr "ルール消去間隔" ++ ++msgid "Clean rules threshold" ++msgstr "ルール消去ã—ãã„値" ++ ++msgid "Client Address" ++msgstr "クライアント・アドレス" ++ ++msgid "Client Port" ++msgstr "クライアント・ãƒãƒ¼ãƒˆ" ++ ++msgid "Collecting data..." ++msgstr "データåŽé›†ä¸­ã§ã™..." ++ ++msgid "Comment" ++msgstr "コメント" ++ ++msgid "Delete Redirect" ++msgstr "リダイレクトを削除" ++ ++msgid "Device UUID" ++msgstr "デãƒã‚¤ã‚¹ UUID" ++ ++msgid "Downlink" ++msgstr "ダウンリンク" ++ ++msgid "Enable NAT-PMP functionality" ++msgstr "NAT-PMP機能を有効ã«ã™ã‚‹" ++ ++msgid "Enable UPnP functionality" ++msgstr "UPnP機能を有効ã«ã™ã‚‹" ++ ++msgid "Enable additional logging" ++msgstr "ログ機能を有効ã«ã™ã‚‹" ++ ++msgid "Enable secure mode" ++msgstr "セキュアモードを有効ã«ã™ã‚‹" ++ ++msgid "External Port" ++msgstr "外部ãƒãƒ¼ãƒˆ" ++ ++msgid "External ports" ++msgstr "外部ãƒãƒ¼ãƒˆ" ++ ++msgid "General Settings" ++msgstr "一般設定" ++ ++msgid "Internal addresses" ++msgstr "内部アドレス" ++ ++msgid "Internal ports" ++msgstr "内部ãƒãƒ¼ãƒˆ" ++ ++msgid "MiniUPnP ACLs" ++msgstr "MiniUPnP アクセス制御リスト (ACL)" ++ ++msgid "MiniUPnP settings" ++msgstr "MiniUPnP 設定" ++ ++msgid "Notify interval" ++msgstr "通知間隔" ++ ++msgid "Port" ++msgstr "ãƒãƒ¼ãƒˆ" ++ ++msgid "Presentation URL" ++msgstr "プレゼンテーション URL" ++ ++msgid "Protocol" ++msgstr "プロトコル" ++ ++msgid "Puts extra debugging information into the system log" ++msgstr "追加ã®ãƒ‡ãƒãƒƒã‚°æƒ…報をシステムログã¸æŒ¿å…¥ã™ã‚‹" ++ ++msgid "Report system instead of daemon uptime" ++msgstr "サービスã®èµ·å‹•æ™‚é–“ã®ä»£ã‚ã‚Šã«ã‚·ã‚¹ãƒ†ãƒ ã®èµ·å‹•æ™‚間を使用ã™ã‚‹" ++ ++msgid "Start UPnP and NAT-PMP service" ++msgstr "UPnPåŠã³NAT-PMPサービスを開始ã™ã‚‹" ++ ++msgid "There are no active redirects." ++msgstr "有効ãªãƒªãƒ€ã‚¤ãƒ¬ã‚¯ãƒˆã¯ã‚ã‚Šã¾ã›ã‚“。" ++ ++msgid "UPNP" ++msgstr "UPnP" ++ ++msgid "" ++"UPnP allows clients in the local network to automatically configure the " ++"router." ++msgstr "" ++"UPnPを使用ã™ã‚‹ã“ã¨ã§ã€ãƒ­ãƒ¼ã‚«ãƒ«ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯å†…ã®ã‚¯ãƒ©ã‚¤ã‚¢ãƒ³ãƒˆãŒè‡ªå‹•çš„ã«ãƒ«ãƒ¼ã‚¿ã‚’" ++"構æˆã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚" ++ ++msgid "UPnP lease file" ++msgstr "UPnP リースファイル" ++ ++msgid "Universal Plug & Play" ++msgstr "ユニãƒãƒ¼ã‚µãƒ« プラグ & プレイ" ++ ++msgid "Uplink" ++msgstr "アップリンク" ++ ++msgid "Value in KByte/s, informational only" ++msgstr "" ++ ++#~ msgid "" ++#~ "UPNP allows clients in the local network to automatically configure the " ++#~ "router." ++#~ msgstr "UPnPを使用ã™ã‚‹ã“ã¨ã§ã€ãƒ­ãƒ¼ã‚«ãƒ«ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯å†…ã®ã‚¯ãƒ©ã‚¤ã‚¢ãƒ³ãƒˆãŒè‡ªå‹•çš„ã«ãƒ«ãƒ¼ã‚¿ã‚’構æˆã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚" ++ ++#~ msgid "enable" ++#~ msgstr "有効" ++ ++#~ msgid "" ++#~ "UPNP should only be enabled if absolutely necessary as it can result in " ++#~ "high security risks for your network." ++#~ msgstr "" ++#~ "UPnPã¯ã‚ãªãŸã®ä½¿ç”¨ã™ã‚‹ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ã«å¯¾ã—ã¦ã€ã‚»ã‚­ãƒ¥ãƒªãƒ†ã‚£ãƒªã‚¹ã‚¯ãŒç”Ÿã˜ã‚‹å¯èƒ½" ++#~ "性ãŒã‚ã‚‹ãŸã‚ã€å¿…è¦ãªå ´åˆã®ã¿æœ‰åŠ¹ã«ã—ã¦ãã ã•ã„。" +diff --git a/feeds/luci/applications/luci-app-upnp/po/ms/upnp.po b/feeds/luci/applications/luci-app-upnp/po/ms/upnp.po +new file mode 100644 +index 0000000..c3e7184 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-upnp/po/ms/upnp.po +@@ -0,0 +1,135 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Last-Translator: Automatically generated\n" ++"Language-Team: none\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++ ++msgid "" ++"ACLs specify which external ports may be redirected to which internal " ++"addresses and ports" ++msgstr "" ++ ++msgid "Action" ++msgstr "" ++ ++msgid "Active UPnP Redirects" ++msgstr "" ++ ++msgid "Advanced Settings" ++msgstr "" ++ ++msgid "Allow adding forwards only to requesting ip addresses" ++msgstr "" ++ ++msgid "Announced model number" ++msgstr "" ++ ++msgid "Announced serial number" ++msgstr "" ++ ++msgid "Clean rules interval" ++msgstr "" ++ ++msgid "Clean rules threshold" ++msgstr "" ++ ++msgid "Client Address" ++msgstr "" ++ ++msgid "Client Port" ++msgstr "" ++ ++msgid "Collecting data..." ++msgstr "" ++ ++msgid "Comment" ++msgstr "" ++ ++msgid "Delete Redirect" ++msgstr "" ++ ++msgid "Device UUID" ++msgstr "" ++ ++msgid "Downlink" ++msgstr "" ++ ++msgid "Enable NAT-PMP functionality" ++msgstr "" ++ ++msgid "Enable UPnP functionality" ++msgstr "" ++ ++msgid "Enable additional logging" ++msgstr "" ++ ++msgid "Enable secure mode" ++msgstr "" ++ ++msgid "External Port" ++msgstr "" ++ ++msgid "External ports" ++msgstr "" ++ ++msgid "General Settings" ++msgstr "" ++ ++msgid "Internal addresses" ++msgstr "" ++ ++msgid "Internal ports" ++msgstr "" ++ ++msgid "MiniUPnP ACLs" ++msgstr "" ++ ++msgid "MiniUPnP settings" ++msgstr "" ++ ++msgid "Notify interval" ++msgstr "" ++ ++msgid "Port" ++msgstr "" ++ ++msgid "Presentation URL" ++msgstr "" ++ ++msgid "Protocol" ++msgstr "" ++ ++msgid "Puts extra debugging information into the system log" ++msgstr "" ++ ++msgid "Report system instead of daemon uptime" ++msgstr "" ++ ++msgid "Start UPnP and NAT-PMP service" ++msgstr "" ++ ++msgid "There are no active redirects." ++msgstr "" ++ ++msgid "UPNP" ++msgstr "" ++ ++msgid "" ++"UPnP allows clients in the local network to automatically configure the " ++"router." ++msgstr "" ++ ++msgid "UPnP lease file" ++msgstr "" ++ ++msgid "Universal Plug & Play" ++msgstr "" ++ ++msgid "Uplink" ++msgstr "" ++ ++msgid "Value in KByte/s, informational only" ++msgstr "" +diff --git a/feeds/luci/applications/luci-app-upnp/po/no/upnp.po b/feeds/luci/applications/luci-app-upnp/po/no/upnp.po +new file mode 100644 +index 0000000..37ff9bf +--- /dev/null ++++ b/feeds/luci/applications/luci-app-upnp/po/no/upnp.po +@@ -0,0 +1,146 @@ ++msgid "" ++msgstr "" ++"Last-Translator: Lars Hardy \n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++ ++msgid "" ++"ACLs specify which external ports may be redirected to which internal " ++"addresses and ports" ++msgstr "" ++"ACL angir hvilke eksterne porter som kan bli viderekoblet, og til hvilke " ++"interne adresser og porter." ++ ++msgid "Action" ++msgstr "Handling" ++ ++msgid "Active UPnP Redirects" ++msgstr "Aktive UPnP Viderekoblinger" ++ ++msgid "Advanced Settings" ++msgstr "Avanserte Innstillinger" ++ ++msgid "Allow adding forwards only to requesting ip addresses" ++msgstr "Tillat videkobling kun til IP adresser som ber om det" ++ ++msgid "Announced model number" ++msgstr "Annonsert modellnummer" ++ ++msgid "Announced serial number" ++msgstr "Annonsert serienummer" ++ ++msgid "Clean rules interval" ++msgstr "Nullstill UPnP Viderekoblinger intervall" ++ ++msgid "Clean rules threshold" ++msgstr "Nullstill UPnP terskel" ++ ++msgid "Client Address" ++msgstr "Klient adresse" ++ ++msgid "Client Port" ++msgstr "Klient port" ++ ++msgid "Collecting data..." ++msgstr "Henter data..." ++ ++msgid "Comment" ++msgstr "Kommentar" ++ ++msgid "Delete Redirect" ++msgstr "Fjern Viderekobling" ++ ++msgid "Device UUID" ++msgstr "Enhet UUID" ++ ++msgid "Downlink" ++msgstr "Nedlinje" ++ ++msgid "Enable NAT-PMP functionality" ++msgstr "Aktiver NAT-PMP funksjonalitet" ++ ++msgid "Enable UPnP functionality" ++msgstr "Aktiver UPnP funksjonalitet" ++ ++msgid "Enable additional logging" ++msgstr "Aktiver tilleggs logging" ++ ++msgid "Enable secure mode" ++msgstr "Aktiver sikker modus" ++ ++msgid "External Port" ++msgstr "Ekstern port" ++ ++msgid "External ports" ++msgstr "Eksterne porter" ++ ++msgid "General Settings" ++msgstr "Generelle Innstillinger" ++ ++msgid "Internal addresses" ++msgstr "Interne adresser" ++ ++msgid "Internal ports" ++msgstr "Interne porter" ++ ++msgid "MiniUPnP ACLs" ++msgstr "MiniUPnP ACL'er" ++ ++msgid "MiniUPnP settings" ++msgstr "MiniUPnP Innstillinger" ++ ++msgid "Notify interval" ++msgstr "Informasjons intervall" ++ ++msgid "Port" ++msgstr "Port" ++ ++msgid "Presentation URL" ++msgstr "Presentasjon URL" ++ ++msgid "Protocol" ++msgstr "Protokoll" ++ ++msgid "Puts extra debugging information into the system log" ++msgstr "Setter ekstra debugging informasjon i systemloggen" ++ ++msgid "Report system instead of daemon uptime" ++msgstr "Rapporter systemets oppetid istedenfor daemon oppetid" ++ ++msgid "Start UPnP and NAT-PMP service" ++msgstr "Start UPnP og NAT-PMP tjenesten" ++ ++msgid "There are no active redirects." ++msgstr "Det finnes ingen aktive viderekoblinger" ++ ++msgid "UPNP" ++msgstr "" ++ ++msgid "" ++"UPnP allows clients in the local network to automatically configure the " ++"router." ++msgstr "" ++"UPnP gjør at klientene i det lokale nettverket automatisk kan konfigurere " ++"ruteren." ++ ++msgid "UPnP lease file" ++msgstr "UPnP leie fil" ++ ++msgid "Universal Plug & Play" ++msgstr "Universal Plug & Play" ++ ++msgid "Uplink" ++msgstr "Opplinje" ++ ++msgid "Value in KByte/s, informational only" ++msgstr "Verdi i KByte/sek, kun for informasjon" ++ ++#~ msgid "" ++#~ "UPNP allows clients in the local network to automatically configure the " ++#~ "router." ++#~ msgstr "" ++#~ "UPnP gjør at klientene i det lokale nettverket automatisk kan konfigurere " ++#~ "ruteren." ++ ++#~ msgid "enable" ++#~ msgstr "Aktiver" +diff --git a/feeds/luci/applications/luci-app-upnp/po/pl/upnp.po b/feeds/luci/applications/luci-app-upnp/po/pl/upnp.po +new file mode 100644 +index 0000000..e891dce +--- /dev/null ++++ b/feeds/luci/applications/luci-app-upnp/po/pl/upnp.po +@@ -0,0 +1,153 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"PO-Revision-Date: 2014-07-02 19:28+0200\n" ++"Last-Translator: obsy \n" ++"Language-Team: none\n" ++"Language: pl\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 " ++"|| n%100>=20) ? 1 : 2);\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "" ++"ACLs specify which external ports may be redirected to which internal " ++"addresses and ports" ++msgstr "" ++"Listy kontroli dostÄ™pu (ang. ACL) okreÅ›lajÄ… jakie porty mogÄ… być " ++"przekierowane do jakich wewnÄ™trznych adresów i portów" ++ ++msgid "Action" ++msgstr "Akcja" ++ ++msgid "Active UPnP Redirects" ++msgstr "Aktywne przekierowania UPnP" ++ ++msgid "Advanced Settings" ++msgstr "Ustawienia zaawansowane" ++ ++msgid "Allow adding forwards only to requesting ip addresses" ++msgstr "Zezwól na dodawanie przekierowaÅ„ tylko do odpytujÄ…cych adresów IP" ++ ++msgid "Announced model number" ++msgstr "RozgÅ‚aszany nr modelu" ++ ++msgid "Announced serial number" ++msgstr "rozgÅ‚aszany nr seryjny" ++ ++msgid "Clean rules interval" ++msgstr "InterwaÅ‚ czyszczenia reguÅ‚" ++ ++msgid "Clean rules threshold" ++msgstr "Próg czyszczenia reguÅ‚" ++ ++msgid "Client Address" ++msgstr "Adres klienta" ++ ++msgid "Client Port" ++msgstr "Port klienta" ++ ++msgid "Collecting data..." ++msgstr "Zbieranie danych..." ++ ++msgid "Comment" ++msgstr "Komentarz" ++ ++msgid "Delete Redirect" ++msgstr "UsuÅ„ przekierowanie" ++ ++msgid "Device UUID" ++msgstr "UUID urzÄ…dzenia" ++ ++msgid "Downlink" ++msgstr "Downlink" ++ ++msgid "Enable NAT-PMP functionality" ++msgstr "WÅ‚Ä…cz funkcjonalność NAT-PMP" ++ ++msgid "Enable UPnP functionality" ++msgstr "WÅ‚Ä…cz funkcjonalność UPnP" ++ ++msgid "Enable additional logging" ++msgstr "WÅ‚Ä…cz rozszerzone raportowanie" ++ ++msgid "Enable secure mode" ++msgstr "WÅ‚Ä…cz tryb bezpieczny" ++ ++msgid "External Port" ++msgstr "Port zewnÄ™trzny" ++ ++msgid "External ports" ++msgstr "Porty zewnÄ™trzne" ++ ++msgid "General Settings" ++msgstr "Ustawienia główne" ++ ++msgid "Internal addresses" ++msgstr "Adresy wewnÄ™trzne" ++ ++msgid "Internal ports" ++msgstr "Porty wewnÄ™trzne" ++ ++msgid "MiniUPnP ACLs" ++msgstr "Listy kontroli dostÄ™pu MiniUPnP" ++ ++msgid "MiniUPnP settings" ++msgstr "Ustawienia MiniUPnP" ++ ++msgid "Notify interval" ++msgstr "InterwaÅ‚ powiadamiania" ++ ++msgid "Port" ++msgstr "Port" ++ ++msgid "Presentation URL" ++msgstr "Przedstawiany URL" ++ ++msgid "Protocol" ++msgstr "Protokół" ++ ++msgid "Puts extra debugging information into the system log" ++msgstr "Dodaje dodatkowe informacje debugowania do loga systemowego" ++ ++msgid "Report system instead of daemon uptime" ++msgstr "ZgÅ‚aszaj czas pracy systemu zamiast czas pracy usÅ‚ugi" ++ ++msgid "Start UPnP and NAT-PMP service" ++msgstr "Uruchom usÅ‚ugi UPnP i NAT-PMP" ++ ++msgid "There are no active redirects." ++msgstr "Nie ma aktywnych przekierowaÅ„" ++ ++msgid "UPNP" ++msgstr "UPnP" ++ ++msgid "" ++"UPnP allows clients in the local network to automatically configure the " ++"router." ++msgstr "" ++"UPnP umożliwia klientom w sieci lokalnej automatyczne konfigurowanie routera." ++ ++msgid "UPnP lease file" ++msgstr "Plik dzierżawy UPnP" ++ ++msgid "Universal Plug & Play" ++msgstr "Universal Plug & Play" ++ ++msgid "Uplink" ++msgstr "Uplink" ++ ++msgid "Value in KByte/s, informational only" ++msgstr "Wartość w KBajt/s, tylko informacyjnie" ++ ++#~ msgid "" ++#~ "UPNP allows clients in the local network to automatically configure the " ++#~ "router." ++#~ msgstr "" ++#~ "UPnP umożliwia klientom w sieci lokalnej automatyczne konfigurowanie " ++#~ "routera." ++ ++#~ msgid "enable" ++#~ msgstr "enable" +diff --git a/feeds/luci/applications/luci-app-upnp/po/pt-br/upnp.po b/feeds/luci/applications/luci-app-upnp/po/pt-br/upnp.po +new file mode 100644 +index 0000000..ae9e7fe +--- /dev/null ++++ b/feeds/luci/applications/luci-app-upnp/po/pt-br/upnp.po +@@ -0,0 +1,166 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Report-Msgid-Bugs-To: \n" ++"POT-Creation-Date: 2009-06-10 03:41+0200\n" ++"PO-Revision-Date: 2011-10-18 22:17+0200\n" ++"Last-Translator: Luiz Angelo \n" ++"Language-Team: LANGUAGE \n" ++"Language: pt_BR\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n > 1);\n" ++"X-Generator: Pootle 2.0.4\n" ++ ++msgid "" ++"ACLs specify which external ports may be redirected to which internal " ++"addresses and ports" ++msgstr "" ++"ACLs especificam quais portas externas podem ser redirecionadas para quais " ++"endereços e portas internos" ++ ++msgid "Action" ++msgstr "Ação" ++ ++msgid "Active UPnP Redirects" ++msgstr "Redirecionamentos UPnP Ativos" ++ ++msgid "Advanced Settings" ++msgstr "Configurações Avançadas" ++ ++msgid "Allow adding forwards only to requesting ip addresses" ++msgstr "" ++"Permite adicionar encaminhamento apenas para o endereço IP requisitante" ++ ++msgid "Announced model number" ++msgstr "Número do modelo anunciado" ++ ++msgid "Announced serial number" ++msgstr "Número serial anunciado" ++ ++msgid "Clean rules interval" ++msgstr "Intervalo de limpeza das regras" ++ ++msgid "Clean rules threshold" ++msgstr "Limiar de limpeza das regras" ++ ++msgid "Client Address" ++msgstr "Endereço do cliente" ++ ++msgid "Client Port" ++msgstr "Porta do Cliente" ++ ++msgid "Collecting data..." ++msgstr "Coletando dados..." ++ ++msgid "Comment" ++msgstr "Comentário" ++ ++msgid "Delete Redirect" ++msgstr "Apague o Redirecionamento" ++ ++msgid "Device UUID" ++msgstr "UUID do Dispositivo" ++ ++msgid "Downlink" ++msgstr "Velocidade de recebimento do enlace (downlink)" ++ ++msgid "Enable NAT-PMP functionality" ++msgstr "Habilite a função NAT-PMP" ++ ++msgid "Enable UPnP functionality" ++msgstr "Habilite a função UPnP" ++ ++msgid "Enable additional logging" ++msgstr "Habilite registros adicionais" ++ ++msgid "Enable secure mode" ++msgstr "Habilite modo seguro" ++ ++msgid "External Port" ++msgstr "Porta Externa" ++ ++msgid "External ports" ++msgstr "Portas Externas" ++ ++msgid "General Settings" ++msgstr "Configurações Gerais" ++ ++msgid "Internal addresses" ++msgstr "Endereços internos" ++ ++msgid "Internal ports" ++msgstr "Portas internas" ++ ++msgid "MiniUPnP ACLs" ++msgstr "ACLs do MiniUPnP" ++ ++msgid "MiniUPnP settings" ++msgstr "Configurações do MiniUPnP" ++ ++msgid "Notify interval" ++msgstr "Intervalo de notificação" ++ ++msgid "Port" ++msgstr "Porta" ++ ++msgid "Presentation URL" ++msgstr "URL de apresentação" ++ ++msgid "Protocol" ++msgstr "Protocolo" ++ ++msgid "Puts extra debugging information into the system log" ++msgstr "Envie informações extra de depuração ao registro do sistema" ++ ++msgid "Report system instead of daemon uptime" ++msgstr "Informe o tempo de vida do sistema ao invés do tempo do processo" ++ ++msgid "Start UPnP and NAT-PMP service" ++msgstr "Dispare os serviços de UPnP e NAT-PMP" ++ ++msgid "There are no active redirects." ++msgstr "Não existe redirecionamentos ativos." ++ ++msgid "UPNP" ++msgstr "" ++"UPnP" ++ ++msgid "" ++"UPnP allows clients in the local network to automatically configure the " ++"router." ++msgstr "" ++"UPnP permite os clientes da rede local configurem automaticamente o roteador." ++ ++msgid "UPnP lease file" ++msgstr "Arquivo de concessão do UPnP" ++ ++msgid "Universal Plug & Play" ++msgstr "Plug & Play Universal" ++ ++msgid "Uplink" ++msgstr "Velocidade de envio do enlace (uplink)" ++ ++msgid "Value in KByte/s, informational only" ++msgstr "Valores em KByte/s, apenas informativas" ++ ++#~ msgid "" ++#~ "UPNP allows clients in the local network to automatically configure the " ++#~ "router." ++#~ msgstr "" ++#~ "UPnP permite os clientes da rede local configurem automaticamente o " ++#~ "roteador." ++ ++#~ msgid "enable" ++#~ msgstr "habilitar" ++ ++#~ msgid "Log output" ++#~ msgstr "Log de saída" ++ ++#~ msgid "" ++#~ "UPNP should only be enabled if absolutely necessary as it can result in " ++#~ "high security risks for your network." ++#~ msgstr "" ++#~ "O UPNP deve ser ativado apenas se for absolutamente necessário, pois ele " ++#~ "pode resultar em elevados riscos de segurança para sua rede." +diff --git a/feeds/luci/applications/luci-app-upnp/po/pt/upnp.po b/feeds/luci/applications/luci-app-upnp/po/pt/upnp.po +new file mode 100644 +index 0000000..91c94f3 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-upnp/po/pt/upnp.po +@@ -0,0 +1,157 @@ ++#, fuzzy ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Report-Msgid-Bugs-To: \n" ++"POT-Creation-Date: 2009-05-26 19:03+0200\n" ++"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" ++"Last-Translator: FULL NAME \n" ++"Language-Team: LANGUAGE \n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"X-Generator: Translate Toolkit 1.1.1\n" ++ ++msgid "" ++"ACLs specify which external ports may be redirected to which internal " ++"addresses and ports" ++msgstr "" ++ ++msgid "Action" ++msgstr "" ++ ++msgid "Active UPnP Redirects" ++msgstr "" ++ ++msgid "Advanced Settings" ++msgstr "" ++ ++msgid "Allow adding forwards only to requesting ip addresses" ++msgstr "" ++ ++msgid "Announced model number" ++msgstr "" ++ ++msgid "Announced serial number" ++msgstr "" ++ ++msgid "Clean rules interval" ++msgstr "" ++ ++msgid "Clean rules threshold" ++msgstr "" ++ ++msgid "Client Address" ++msgstr "" ++ ++msgid "Client Port" ++msgstr "" ++ ++msgid "Collecting data..." ++msgstr "" ++ ++msgid "Comment" ++msgstr "" ++ ++msgid "Delete Redirect" ++msgstr "" ++ ++msgid "Device UUID" ++msgstr "" ++ ++msgid "Downlink" ++msgstr "Link para download" ++ ++msgid "Enable NAT-PMP functionality" ++msgstr "" ++ ++msgid "Enable UPnP functionality" ++msgstr "" ++ ++msgid "Enable additional logging" ++msgstr "" ++ ++msgid "Enable secure mode" ++msgstr "Enable secure mode" ++ ++msgid "External Port" ++msgstr "" ++ ++msgid "External ports" ++msgstr "" ++ ++msgid "General Settings" ++msgstr "" ++ ++msgid "Internal addresses" ++msgstr "" ++ ++msgid "Internal ports" ++msgstr "" ++ ++msgid "MiniUPnP ACLs" ++msgstr "" ++ ++msgid "MiniUPnP settings" ++msgstr "" ++ ++msgid "Notify interval" ++msgstr "" ++ ++msgid "Port" ++msgstr "" ++ ++msgid "Presentation URL" ++msgstr "" ++ ++msgid "Protocol" ++msgstr "" ++ ++msgid "Puts extra debugging information into the system log" ++msgstr "" ++ ++msgid "Report system instead of daemon uptime" ++msgstr "" ++ ++msgid "Start UPnP and NAT-PMP service" ++msgstr "" ++ ++msgid "There are no active redirects." ++msgstr "" ++ ++msgid "UPNP" ++msgstr "" ++ ++msgid "" ++"UPnP allows clients in the local network to automatically configure the " ++"router." ++msgstr "" ++ ++msgid "UPnP lease file" ++msgstr "" ++ ++msgid "Universal Plug & Play" ++msgstr "Plug & Play Universal" ++ ++msgid "Uplink" ++msgstr "Link para Upload" ++ ++msgid "Value in KByte/s, informational only" ++msgstr "" ++ ++#~ msgid "" ++#~ "UPNP allows clients in the local network to automatically configure the " ++#~ "router." ++#~ msgstr "" ++#~ "UPNP permite os clientes da rede local automaticamente configurar o " ++#~ "roteador." ++ ++#~ msgid "Log output" ++#~ msgstr "Log de saída" ++ ++#~ msgid "" ++#~ "UPNP should only be enabled if absolutely necessary as it can result in " ++#~ "high security risks for your network." ++#~ msgstr "" ++#~ "O UPNP deve ser ativado apenas se for absolutamente necessário, pois ele " ++#~ "pode resultar em elevados riscos de segurança para sua rede." +diff --git a/feeds/luci/applications/luci-app-upnp/po/ro/upnp.po b/feeds/luci/applications/luci-app-upnp/po/ro/upnp.po +new file mode 100644 +index 0000000..84f5158 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-upnp/po/ro/upnp.po +@@ -0,0 +1,152 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"PO-Revision-Date: 2013-09-25 19:15+0200\n" ++"Last-Translator: Mihai \n" ++"Language-Team: none\n" ++"Language: ro\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=3; plural=(n==1 ? 0 : (n==0 || (n%100 > 0 && n%100 < " ++"20)) ? 1 : 2);;\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "" ++"ACLs specify which external ports may be redirected to which internal " ++"addresses and ports" ++msgstr "" ++"ACL-urile specifica porturile externe care pot fi redirectate si spre ce " ++"adrese si porturi interne" ++ ++msgid "Action" ++msgstr "Actiune" ++ ++msgid "Active UPnP Redirects" ++msgstr "Redirecturi active UPnP" ++ ++msgid "Advanced Settings" ++msgstr "Setari avansate" ++ ++msgid "Allow adding forwards only to requesting ip addresses" ++msgstr "Permite adaugarea forward-urilor doar catre adresele ip solicitante" ++ ++msgid "Announced model number" ++msgstr "Numar de model anuntat" ++ ++msgid "Announced serial number" ++msgstr "Numar serial anuntat" ++ ++msgid "Clean rules interval" ++msgstr "Intervalul de curatare reguli" ++ ++msgid "Clean rules threshold" ++msgstr "Limita de curatare reguli" ++ ++msgid "Client Address" ++msgstr "Adresa client" ++ ++msgid "Client Port" ++msgstr "Port client" ++ ++msgid "Collecting data..." ++msgstr "Colecteaza date.." ++ ++msgid "Comment" ++msgstr "Comentariu" ++ ++msgid "Delete Redirect" ++msgstr "Sterge redirect" ++ ++msgid "Device UUID" ++msgstr "UUID al dispozitivului" ++ ++msgid "Downlink" ++msgstr "Downlink" ++ ++msgid "Enable NAT-PMP functionality" ++msgstr "Activeaza functionalitatea NAT-PMP" ++ ++msgid "Enable UPnP functionality" ++msgstr "Activeaza functionalitatea UPnP" ++ ++msgid "Enable additional logging" ++msgstr "Activeaza log-area aditionala" ++ ++msgid "Enable secure mode" ++msgstr "Activeaza modul securizat" ++ ++msgid "External Port" ++msgstr "Port extern" ++ ++msgid "External ports" ++msgstr "Porturi externe" ++ ++msgid "General Settings" ++msgstr "Setari generale" ++ ++msgid "Internal addresses" ++msgstr "Adrese interne" ++ ++msgid "Internal ports" ++msgstr "Porturi interne" ++ ++msgid "MiniUPnP ACLs" ++msgstr "Liste de acces mini UPnP" ++ ++msgid "MiniUPnP settings" ++msgstr "Setari mini UPnP" ++ ++msgid "Notify interval" ++msgstr "Interval de notificare" ++ ++msgid "Port" ++msgstr "Port" ++ ++msgid "Presentation URL" ++msgstr "Adresa de prezentare" ++ ++msgid "Protocol" ++msgstr "Protocol" ++ ++msgid "Puts extra debugging information into the system log" ++msgstr "Pune informatii utile suplimentare in log-ul de sistem" ++ ++msgid "Report system instead of daemon uptime" ++msgstr "Raporteaza timpul de functionare de sistem in loc de serviciu" ++ ++msgid "Start UPnP and NAT-PMP service" ++msgstr "Porneste UPnP si serviciul NAT-PMP" ++ ++msgid "There are no active redirects." ++msgstr "Nu exista redirecturi active." ++ ++msgid "UPNP" ++msgstr "UPNP" ++ ++msgid "" ++"UPnP allows clients in the local network to automatically configure the " ++"router." ++msgstr "" ++"UPNP permite clientulor din reteaua locala sa configureze automat routerul." ++ ++msgid "UPnP lease file" ++msgstr "Fisierul de conexiuni UPnP" ++ ++msgid "Universal Plug & Play" ++msgstr "Universal Plug & Play" ++ ++msgid "Uplink" ++msgstr "Uplink" ++ ++msgid "Value in KByte/s, informational only" ++msgstr "Valorea in KOcteti/s , doar informational" ++ ++#~ msgid "" ++#~ "UPNP allows clients in the local network to automatically configure the " ++#~ "router." ++#~ msgstr "" ++#~ "UPNP permite clientulor din reteaua locala sa configureze automat routerul." ++ ++#~ msgid "enable" ++#~ msgstr "activeaza" +diff --git a/feeds/luci/applications/luci-app-upnp/po/ru/upnp.po b/feeds/luci/applications/luci-app-upnp/po/ru/upnp.po +new file mode 100644 +index 0000000..626672b +--- /dev/null ++++ b/feeds/luci/applications/luci-app-upnp/po/ru/upnp.po +@@ -0,0 +1,158 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: LuCI: upnp\n" ++"Report-Msgid-Bugs-To: \n" ++"POT-Creation-Date: 2009-05-19 19:36+0200\n" ++"PO-Revision-Date: 2012-08-15 15:20+0300\n" ++"Last-Translator: Roman A. aka BasicXP \n" ++"Language-Team: Russian \n" ++"Language: ru\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%" ++"10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" ++"X-Generator: Pootle 2.0.6\n" ++"X-Poedit-SourceCharset: UTF-8\n" ++ ++msgid "" ++"ACLs specify which external ports may be redirected to which internal " ++"addresses and ports" ++msgstr "" ++"СпиÑок доÑтупа определÑет, какие внешние порты могут быть перенаправлены на " ++"внутренние адреÑа и порты" ++ ++msgid "Action" ++msgstr "ДейÑтвие" ++ ++msgid "Active UPnP Redirects" ++msgstr "Ðктивные UPnP-переадреÑации" ++ ++msgid "Advanced Settings" ++msgstr "РаÑширенные наÑтройки" ++ ++msgid "Allow adding forwards only to requesting ip addresses" ++msgstr "Разрешить перенаправление только Ð´Ð»Ñ Ð·Ð°Ð¿Ñ€Ð°ÑˆÐ¸Ð²Ð°ÑŽÑ‰Ð¸Ñ… IP-адреÑов" ++ ++msgid "Announced model number" ++msgstr "Ðомер модели" ++ ++msgid "Announced serial number" ++msgstr "Серийный номер" ++ ++msgid "Clean rules interval" ++msgstr "Интервал очиÑтки правил" ++ ++msgid "Clean rules threshold" ++msgstr "Порог очиÑтки правил" ++ ++msgid "Client Address" ++msgstr "ÐÐ´Ñ€ÐµÑ ÐºÐ»Ð¸ÐµÐ½Ñ‚Ð°" ++ ++msgid "Client Port" ++msgstr "Порт клиента" ++ ++msgid "Collecting data..." ++msgstr "Сбор данных..." ++ ++msgid "Comment" ++msgstr "Комментарий" ++ ++msgid "Delete Redirect" ++msgstr "Удалить переадреÑацию" ++ ++msgid "Device UUID" ++msgstr "UUID уÑтройÑтва" ++ ++msgid "Downlink" ++msgstr "ÐиÑходÑщий канал" ++ ++msgid "Enable NAT-PMP functionality" ++msgstr "Включить NAT-PMP" ++ ++msgid "Enable UPnP functionality" ++msgstr "Включить UPnP" ++ ++msgid "Enable additional logging" ++msgstr "Включить дополнительное журналирование" ++ ++msgid "Enable secure mode" ++msgstr "ИÑпользовать защищённый режим" ++ ++msgid "External Port" ++msgstr "Внешний порт" ++ ++msgid "External ports" ++msgstr "Внешние порты" ++ ++msgid "General Settings" ++msgstr "Общие наÑтройки" ++ ++msgid "Internal addresses" ++msgstr "Внутренние адреÑа" ++ ++msgid "Internal ports" ++msgstr "Внутренние порты" ++ ++msgid "MiniUPnP ACLs" ++msgstr "СпиÑок доÑтупа MiniUPnP" ++ ++msgid "MiniUPnP settings" ++msgstr "ÐаÑтройки MiniUPnP" ++ ++msgid "Notify interval" ++msgstr "Интервал уведомлениÑ" ++ ++msgid "Port" ++msgstr "Порт" ++ ++msgid "Presentation URL" ++msgstr "URL предÑтавлениÑ" ++ ++msgid "Protocol" ++msgstr "Протокол" ++ ++msgid "Puts extra debugging information into the system log" ++msgstr "ДобавлÑÑ‚ÑŒ дополнительную отладочную информацию в ÑиÑтемный журнал" ++ ++msgid "Report system instead of daemon uptime" ++msgstr "Сообщать Ð²Ñ€ÐµÐ¼Ñ Ñ€Ð°Ð±Ð¾Ñ‚Ñ‹ ÑиÑтемы вмеÑто ÑервиÑа" ++ ++msgid "Start UPnP and NAT-PMP service" ++msgstr "ЗапуÑтить Ñлужбы UPnP и NAT-PMP" ++ ++msgid "There are no active redirects." ++msgstr "Ðктивные переадреÑации отÑутÑтвуют." ++ ++msgid "UPNP" ++msgstr "UPnP" ++ ++msgid "" ++"UPnP allows clients in the local network to automatically configure the " ++"router." ++msgstr "" ++"UPnP позволÑет клиентам в локальной Ñети автоматичеÑки наÑтраивать " ++"маршрутизатор." ++ ++msgid "UPnP lease file" ++msgstr "Файл аренды UPnP" ++ ++msgid "Universal Plug & Play" ++msgstr "Universal Plug & Play" ++ ++msgid "Uplink" ++msgstr "ВоÑходÑщий канал" ++ ++msgid "Value in KByte/s, informational only" ++msgstr "Значение в КБ/Ñ, только Ð´Ð»Ñ Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ð¸" ++ ++# Used in upnpmini.lua, which is marked broken, thus can be removed ++#~ msgid "" ++#~ "UPNP allows clients in the local network to automatically configure the " ++#~ "router." ++#~ msgstr "" ++#~ "UPnP позволÑет клиентам в локальной Ñети автоматичеÑки наÑтраивать " ++#~ "маршрутизатор." ++ ++#~ msgid "enable" ++#~ msgstr "включить" +diff --git a/feeds/luci/applications/luci-app-upnp/po/sk/upnp.po b/feeds/luci/applications/luci-app-upnp/po/sk/upnp.po +new file mode 100644 +index 0000000..5763163 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-upnp/po/sk/upnp.po +@@ -0,0 +1,136 @@ ++msgid "" ++msgstr "" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Last-Translator: Automatically generated\n" ++"Language-Team: none\n" ++"MIME-Version: 1.0\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n" ++ ++msgid "" ++"ACLs specify which external ports may be redirected to which internal " ++"addresses and ports" ++msgstr "" ++ ++msgid "Action" ++msgstr "" ++ ++msgid "Active UPnP Redirects" ++msgstr "" ++ ++msgid "Advanced Settings" ++msgstr "" ++ ++msgid "Allow adding forwards only to requesting ip addresses" ++msgstr "" ++ ++msgid "Announced model number" ++msgstr "" ++ ++msgid "Announced serial number" ++msgstr "" ++ ++msgid "Clean rules interval" ++msgstr "" ++ ++msgid "Clean rules threshold" ++msgstr "" ++ ++msgid "Client Address" ++msgstr "" ++ ++msgid "Client Port" ++msgstr "" ++ ++msgid "Collecting data..." ++msgstr "" ++ ++msgid "Comment" ++msgstr "" ++ ++msgid "Delete Redirect" ++msgstr "" ++ ++msgid "Device UUID" ++msgstr "" ++ ++msgid "Downlink" ++msgstr "" ++ ++msgid "Enable NAT-PMP functionality" ++msgstr "" ++ ++msgid "Enable UPnP functionality" ++msgstr "" ++ ++msgid "Enable additional logging" ++msgstr "" ++ ++msgid "Enable secure mode" ++msgstr "" ++ ++msgid "External Port" ++msgstr "" ++ ++msgid "External ports" ++msgstr "" ++ ++msgid "General Settings" ++msgstr "" ++ ++msgid "Internal addresses" ++msgstr "" ++ ++msgid "Internal ports" ++msgstr "" ++ ++msgid "MiniUPnP ACLs" ++msgstr "" ++ ++msgid "MiniUPnP settings" ++msgstr "" ++ ++msgid "Notify interval" ++msgstr "" ++ ++msgid "Port" ++msgstr "" ++ ++msgid "Presentation URL" ++msgstr "" ++ ++msgid "Protocol" ++msgstr "" ++ ++msgid "Puts extra debugging information into the system log" ++msgstr "" ++ ++msgid "Report system instead of daemon uptime" ++msgstr "" ++ ++msgid "Start UPnP and NAT-PMP service" ++msgstr "" ++ ++msgid "There are no active redirects." ++msgstr "" ++ ++msgid "UPNP" ++msgstr "" ++ ++msgid "" ++"UPnP allows clients in the local network to automatically configure the " ++"router." ++msgstr "" ++ ++msgid "UPnP lease file" ++msgstr "" ++ ++msgid "Universal Plug & Play" ++msgstr "" ++ ++msgid "Uplink" ++msgstr "" ++ ++msgid "Value in KByte/s, informational only" ++msgstr "" +diff --git a/feeds/luci/applications/luci-app-upnp/po/sv/upnp.po b/feeds/luci/applications/luci-app-upnp/po/sv/upnp.po +new file mode 100644 +index 0000000..11c20c1 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-upnp/po/sv/upnp.po +@@ -0,0 +1,137 @@ ++msgid "" ++msgstr "" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Last-Translator: Automatically generated\n" ++"Language-Team: none\n" ++"Language: sv\n" ++"MIME-Version: 1.0\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n != 1);\n" ++ ++msgid "" ++"ACLs specify which external ports may be redirected to which internal " ++"addresses and ports" ++msgstr "" ++ ++msgid "Action" ++msgstr "" ++ ++msgid "Active UPnP Redirects" ++msgstr "" ++ ++msgid "Advanced Settings" ++msgstr "" ++ ++msgid "Allow adding forwards only to requesting ip addresses" ++msgstr "" ++ ++msgid "Announced model number" ++msgstr "" ++ ++msgid "Announced serial number" ++msgstr "" ++ ++msgid "Clean rules interval" ++msgstr "" ++ ++msgid "Clean rules threshold" ++msgstr "" ++ ++msgid "Client Address" ++msgstr "" ++ ++msgid "Client Port" ++msgstr "" ++ ++msgid "Collecting data..." ++msgstr "" ++ ++msgid "Comment" ++msgstr "" ++ ++msgid "Delete Redirect" ++msgstr "" ++ ++msgid "Device UUID" ++msgstr "" ++ ++msgid "Downlink" ++msgstr "" ++ ++msgid "Enable NAT-PMP functionality" ++msgstr "" ++ ++msgid "Enable UPnP functionality" ++msgstr "" ++ ++msgid "Enable additional logging" ++msgstr "" ++ ++msgid "Enable secure mode" ++msgstr "" ++ ++msgid "External Port" ++msgstr "" ++ ++msgid "External ports" ++msgstr "" ++ ++msgid "General Settings" ++msgstr "" ++ ++msgid "Internal addresses" ++msgstr "" ++ ++msgid "Internal ports" ++msgstr "" ++ ++msgid "MiniUPnP ACLs" ++msgstr "" ++ ++msgid "MiniUPnP settings" ++msgstr "" ++ ++msgid "Notify interval" ++msgstr "" ++ ++msgid "Port" ++msgstr "" ++ ++msgid "Presentation URL" ++msgstr "" ++ ++msgid "Protocol" ++msgstr "" ++ ++msgid "Puts extra debugging information into the system log" ++msgstr "" ++ ++msgid "Report system instead of daemon uptime" ++msgstr "" ++ ++msgid "Start UPnP and NAT-PMP service" ++msgstr "" ++ ++msgid "There are no active redirects." ++msgstr "" ++ ++msgid "UPNP" ++msgstr "" ++ ++msgid "" ++"UPnP allows clients in the local network to automatically configure the " ++"router." ++msgstr "" ++ ++msgid "UPnP lease file" ++msgstr "" ++ ++msgid "Universal Plug & Play" ++msgstr "" ++ ++msgid "Uplink" ++msgstr "" ++ ++msgid "Value in KByte/s, informational only" ++msgstr "" +diff --git a/feeds/luci/applications/luci-app-upnp/po/templates/upnp.pot b/feeds/luci/applications/luci-app-upnp/po/templates/upnp.pot +new file mode 100644 +index 0000000..86aaee3 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-upnp/po/templates/upnp.pot +@@ -0,0 +1,129 @@ ++msgid "" ++msgstr "Content-Type: text/plain; charset=UTF-8" ++ ++msgid "" ++"ACLs specify which external ports may be redirected to which internal " ++"addresses and ports" ++msgstr "" ++ ++msgid "Action" ++msgstr "" ++ ++msgid "Active UPnP Redirects" ++msgstr "" ++ ++msgid "Advanced Settings" ++msgstr "" ++ ++msgid "Allow adding forwards only to requesting ip addresses" ++msgstr "" ++ ++msgid "Announced model number" ++msgstr "" ++ ++msgid "Announced serial number" ++msgstr "" ++ ++msgid "Clean rules interval" ++msgstr "" ++ ++msgid "Clean rules threshold" ++msgstr "" ++ ++msgid "Client Address" ++msgstr "" ++ ++msgid "Client Port" ++msgstr "" ++ ++msgid "Collecting data..." ++msgstr "" ++ ++msgid "Comment" ++msgstr "" ++ ++msgid "Delete Redirect" ++msgstr "" ++ ++msgid "Device UUID" ++msgstr "" ++ ++msgid "Downlink" ++msgstr "" ++ ++msgid "Enable NAT-PMP functionality" ++msgstr "" ++ ++msgid "Enable UPnP functionality" ++msgstr "" ++ ++msgid "Enable additional logging" ++msgstr "" ++ ++msgid "Enable secure mode" ++msgstr "" ++ ++msgid "External Port" ++msgstr "" ++ ++msgid "External ports" ++msgstr "" ++ ++msgid "General Settings" ++msgstr "" ++ ++msgid "Internal addresses" ++msgstr "" ++ ++msgid "Internal ports" ++msgstr "" ++ ++msgid "MiniUPnP ACLs" ++msgstr "" ++ ++msgid "MiniUPnP settings" ++msgstr "" ++ ++msgid "Notify interval" ++msgstr "" ++ ++msgid "Port" ++msgstr "" ++ ++msgid "Presentation URL" ++msgstr "" ++ ++msgid "Protocol" ++msgstr "" ++ ++msgid "Puts extra debugging information into the system log" ++msgstr "" ++ ++msgid "Report system instead of daemon uptime" ++msgstr "" ++ ++msgid "Start UPnP and NAT-PMP service" ++msgstr "" ++ ++msgid "There are no active redirects." ++msgstr "" ++ ++msgid "UPNP" ++msgstr "" ++ ++msgid "" ++"UPnP allows clients in the local network to automatically configure the " ++"router." ++msgstr "" ++ ++msgid "UPnP lease file" ++msgstr "" ++ ++msgid "Universal Plug & Play" ++msgstr "" ++ ++msgid "Uplink" ++msgstr "" ++ ++msgid "Value in KByte/s, informational only" ++msgstr "" +diff --git a/feeds/luci/applications/luci-app-upnp/po/tr/upnp.po b/feeds/luci/applications/luci-app-upnp/po/tr/upnp.po +new file mode 100644 +index 0000000..bf0e59a +--- /dev/null ++++ b/feeds/luci/applications/luci-app-upnp/po/tr/upnp.po +@@ -0,0 +1,136 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Last-Translator: Automatically generated\n" ++"Language-Team: none\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=1; plural=0;\n" ++ ++msgid "" ++"ACLs specify which external ports may be redirected to which internal " ++"addresses and ports" ++msgstr "" ++ ++msgid "Action" ++msgstr "" ++ ++msgid "Active UPnP Redirects" ++msgstr "" ++ ++msgid "Advanced Settings" ++msgstr "" ++ ++msgid "Allow adding forwards only to requesting ip addresses" ++msgstr "" ++ ++msgid "Announced model number" ++msgstr "" ++ ++msgid "Announced serial number" ++msgstr "" ++ ++msgid "Clean rules interval" ++msgstr "" ++ ++msgid "Clean rules threshold" ++msgstr "" ++ ++msgid "Client Address" ++msgstr "" ++ ++msgid "Client Port" ++msgstr "" ++ ++msgid "Collecting data..." ++msgstr "" ++ ++msgid "Comment" ++msgstr "" ++ ++msgid "Delete Redirect" ++msgstr "" ++ ++msgid "Device UUID" ++msgstr "" ++ ++msgid "Downlink" ++msgstr "" ++ ++msgid "Enable NAT-PMP functionality" ++msgstr "" ++ ++msgid "Enable UPnP functionality" ++msgstr "" ++ ++msgid "Enable additional logging" ++msgstr "" ++ ++msgid "Enable secure mode" ++msgstr "" ++ ++msgid "External Port" ++msgstr "" ++ ++msgid "External ports" ++msgstr "" ++ ++msgid "General Settings" ++msgstr "" ++ ++msgid "Internal addresses" ++msgstr "" ++ ++msgid "Internal ports" ++msgstr "" ++ ++msgid "MiniUPnP ACLs" ++msgstr "" ++ ++msgid "MiniUPnP settings" ++msgstr "" ++ ++msgid "Notify interval" ++msgstr "" ++ ++msgid "Port" ++msgstr "" ++ ++msgid "Presentation URL" ++msgstr "" ++ ++msgid "Protocol" ++msgstr "" ++ ++msgid "Puts extra debugging information into the system log" ++msgstr "" ++ ++msgid "Report system instead of daemon uptime" ++msgstr "" ++ ++msgid "Start UPnP and NAT-PMP service" ++msgstr "" ++ ++msgid "There are no active redirects." ++msgstr "" ++ ++msgid "UPNP" ++msgstr "" ++ ++msgid "" ++"UPnP allows clients in the local network to automatically configure the " ++"router." ++msgstr "" ++ ++msgid "UPnP lease file" ++msgstr "" ++ ++msgid "Universal Plug & Play" ++msgstr "" ++ ++msgid "Uplink" ++msgstr "" ++ ++msgid "Value in KByte/s, informational only" ++msgstr "" +diff --git a/feeds/luci/applications/luci-app-upnp/po/uk/upnp.po b/feeds/luci/applications/luci-app-upnp/po/uk/upnp.po +new file mode 100644 +index 0000000..7646109 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-upnp/po/uk/upnp.po +@@ -0,0 +1,155 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"PO-Revision-Date: 2013-05-26 19:26+0200\n" ++"Last-Translator: Yurii \n" ++"Language-Team: none\n" ++"Language: uk\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%" ++"10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "" ++"ACLs specify which external ports may be redirected to which internal " ++"addresses and ports" ++msgstr "" ++"СпиÑок кнтролю доÑтупу визначає, Ñкі зовнішні порти можуть бути " ++"переÑпрÑмовані на Ñкі внутрішні адреÑи й порти" ++ ++msgid "Action" ++msgstr "ДіÑ" ++ ++msgid "Active UPnP Redirects" ++msgstr "Ðктивні переÑпрÑÐ¼ÑƒÐ²Ð°Ð½Ð½Ñ UPnP" ++ ++msgid "Advanced Settings" ++msgstr "Додаткові параметри" ++ ++msgid "Allow adding forwards only to requesting ip addresses" ++msgstr "" ++"Дозволити Ð´Ð¾Ð´Ð°Ð²Ð°Ð½Ð½Ñ Ð¿ÐµÑ€ÐµÑпрÑÐ¼ÑƒÐ²Ð°Ð½Ð½Ñ Ñ‚Ñ–Ð»ÑŒÐºÐ¸ Ð´Ð»Ñ IP-адреÑ, що надÑилають запити" ++ ++msgid "Announced model number" ++msgstr "Оголошуваний номер моделі" ++ ++msgid "Announced serial number" ++msgstr "Оголошуваний Ñерійний номер" ++ ++msgid "Clean rules interval" ++msgstr "Інтервал Ð¾Ñ‡Ð¸Ñ‰ÐµÐ½Ð½Ñ Ð¿Ñ€Ð°Ð²Ð¸Ð»" ++ ++msgid "Clean rules threshold" ++msgstr "Поріг Ð¾Ñ‡Ð¸Ñ‰ÐµÐ½Ð½Ñ Ð¿Ñ€Ð°Ð²Ð¸Ð»" ++ ++msgid "Client Address" ++msgstr "ÐдреÑа клієнта" ++ ++msgid "Client Port" ++msgstr "Порт клієнта" ++ ++msgid "Collecting data..." ++msgstr "Ð—Ð±Ð¸Ñ€Ð°Ð½Ð½Ñ Ð´Ð°Ð½Ð¸Ñ…..." ++ ++msgid "Comment" ++msgstr "Коментар" ++ ++msgid "Delete Redirect" ++msgstr "Видалити переÑпрÑмуваннÑ" ++ ++msgid "Device UUID" ++msgstr "UUID приÑтрою" ++ ++msgid "Downlink" ++msgstr "Ðизхідний канал" ++ ++msgid "Enable NAT-PMP functionality" ++msgstr "Увімкнути функцію NAT-PMP" ++ ++msgid "Enable UPnP functionality" ++msgstr "Увімкнути функцію UPnP" ++ ++msgid "Enable additional logging" ++msgstr "Увімкнути додаткове журналюваннÑ" ++ ++msgid "Enable secure mode" ++msgstr "Увімкнути захищений режим" ++ ++msgid "External Port" ++msgstr "Зовнішній порт" ++ ++msgid "External ports" ++msgstr "Зовнішні порти" ++ ++msgid "General Settings" ++msgstr "Загальні наÑтройки" ++ ++msgid "Internal addresses" ++msgstr "Внутрішні адреÑи" ++ ++msgid "Internal ports" ++msgstr "Внутрішні порти" ++ ++msgid "MiniUPnP ACLs" ++msgstr "СпиÑок контролю доÑтупу MiniUPnP" ++ ++msgid "MiniUPnP settings" ++msgstr "ÐаÑтройки MiniUPnP" ++ ++msgid "Notify interval" ++msgstr "Інтервал ÑповіщеннÑ" ++ ++msgid "Port" ++msgstr "Порт" ++ ++msgid "Presentation URL" ++msgstr "URL предÑтавлÑннÑ" ++ ++msgid "Protocol" ++msgstr "Протокол" ++ ++msgid "Puts extra debugging information into the system log" ++msgstr "Включати додаткові відомоÑÑ‚Ñ– Ð´Ð»Ñ Ð½Ð°Ð»Ð°Ð³Ð¾Ð´Ð¶ÐµÐ½Ð½Ñ Ð´Ð¾ ÑиÑтемного журналу" ++ ++msgid "Report system instead of daemon uptime" ++msgstr "ПовідомлÑти Ñ‡Ð°Ñ Ð±ÐµÐ·Ð²Ñ–Ð´Ð¼Ð¾Ð²Ð½Ð¾Ñ— роботи ÑиÑтеми, а не ÑервіÑу" ++ ++msgid "Start UPnP and NAT-PMP service" ++msgstr "ЗапуÑкати Ñлужби UPnP та NAT-PMP" ++ ++msgid "There are no active redirects." ++msgstr "Ðемає активних переÑпрÑмувань" ++ ++msgid "UPNP" ++msgstr "UPnP" ++ ++msgid "" ++"UPnP allows clients in the local network to automatically configure the " ++"router." ++msgstr "" ++"UPnP надає клієнтам у локальній мережі змогу автоматично наÑтроювати " ++"маршрутизатор." ++ ++msgid "UPnP lease file" ++msgstr "Файл оренд UPnP" ++ ++msgid "Universal Plug & Play" ++msgstr "Universal Plug & Play" ++ ++msgid "Uplink" ++msgstr "ВиÑхідний канал" ++ ++msgid "Value in KByte/s, informational only" ++msgstr "Ð—Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ (КБ/Ñ) тільки Ð´Ð»Ñ Ñ–Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ñ–Ñ—" ++ ++#~ msgid "" ++#~ "UPNP allows clients in the local network to automatically configure the " ++#~ "router." ++#~ msgstr "" ++#~ "UPnP надає клієнтам у локальній мережі змогу автоматично наÑтроювати " ++#~ "маршрутизатор." ++ ++#~ msgid "enable" ++#~ msgstr "Увімкнути" +diff --git a/feeds/luci/applications/luci-app-upnp/po/vi/upnp.po b/feeds/luci/applications/luci-app-upnp/po/vi/upnp.po +new file mode 100644 +index 0000000..7c7ea9d +--- /dev/null ++++ b/feeds/luci/applications/luci-app-upnp/po/vi/upnp.po +@@ -0,0 +1,158 @@ ++# upnp.pot ++# generated from ./applications/luci-upnp/luasrc/i18n/upnp.en.lua ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Report-Msgid-Bugs-To: \n" ++"POT-Creation-Date: 2009-08-16 06:59+0200\n" ++"PO-Revision-Date: 2009-08-13 04:00+0200\n" ++"Last-Translator: Hong Phuc Dang \n" ++"Language-Team: LANGUAGE \n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"X-Generator: Pootle 1.1.0\n" ++ ++msgid "" ++"ACLs specify which external ports may be redirected to which internal " ++"addresses and ports" ++msgstr "" ++ ++msgid "Action" ++msgstr "" ++ ++msgid "Active UPnP Redirects" ++msgstr "" ++ ++msgid "Advanced Settings" ++msgstr "" ++ ++msgid "Allow adding forwards only to requesting ip addresses" ++msgstr "" ++ ++msgid "Announced model number" ++msgstr "" ++ ++msgid "Announced serial number" ++msgstr "" ++ ++msgid "Clean rules interval" ++msgstr "" ++ ++msgid "Clean rules threshold" ++msgstr "" ++ ++msgid "Client Address" ++msgstr "" ++ ++msgid "Client Port" ++msgstr "" ++ ++msgid "Collecting data..." ++msgstr "" ++ ++msgid "Comment" ++msgstr "" ++ ++msgid "Delete Redirect" ++msgstr "" ++ ++msgid "Device UUID" ++msgstr "" ++ ++msgid "Downlink" ++msgstr "Downlink" ++ ++msgid "Enable NAT-PMP functionality" ++msgstr "" ++ ++msgid "Enable UPnP functionality" ++msgstr "" ++ ++msgid "Enable additional logging" ++msgstr "" ++ ++msgid "Enable secure mode" ++msgstr "Kích hoạt chế Ä‘á»™ an toàn" ++ ++msgid "External Port" ++msgstr "" ++ ++msgid "External ports" ++msgstr "" ++ ++msgid "General Settings" ++msgstr "" ++ ++msgid "Internal addresses" ++msgstr "" ++ ++msgid "Internal ports" ++msgstr "" ++ ++msgid "MiniUPnP ACLs" ++msgstr "" ++ ++msgid "MiniUPnP settings" ++msgstr "" ++ ++msgid "Notify interval" ++msgstr "" ++ ++msgid "Port" ++msgstr "" ++ ++msgid "Presentation URL" ++msgstr "" ++ ++msgid "Protocol" ++msgstr "" ++ ++msgid "Puts extra debugging information into the system log" ++msgstr "" ++ ++msgid "Report system instead of daemon uptime" ++msgstr "" ++ ++msgid "Start UPnP and NAT-PMP service" ++msgstr "" ++ ++msgid "There are no active redirects." ++msgstr "" ++ ++msgid "UPNP" ++msgstr "" ++ ++msgid "" ++"UPnP allows clients in the local network to automatically configure the " ++"router." ++msgstr "" ++ ++msgid "UPnP lease file" ++msgstr "" ++ ++msgid "Universal Plug & Play" ++msgstr "Universal Plug & Play" ++ ++msgid "Uplink" ++msgstr "Uplink" ++ ++msgid "Value in KByte/s, informational only" ++msgstr "" ++ ++#~ msgid "" ++#~ "UPNP allows clients in the local network to automatically configure the " ++#~ "router." ++#~ msgstr "" ++#~ "UPNP cho phép đối tượng trong mạng địa phÆ°Æ¡ng tá»± Ä‘á»™ng định dạng bá»™ định " ++#~ "tuyến" ++ ++#~ msgid "Log output" ++#~ msgstr "Log output" ++ ++#~ msgid "" ++#~ "UPNP should only be enabled if absolutely necessary as it can result in " ++#~ "high security risks for your network." ++#~ msgstr "" ++#~ "Chỉ nên kích hoạt UPNP khi thật cần thiết vì nó có thể gây nguy hiểm cho " ++#~ "mạng lÆ°á»›i" +diff --git a/feeds/luci/applications/luci-app-upnp/po/zh-cn/upnp.po b/feeds/luci/applications/luci-app-upnp/po/zh-cn/upnp.po +new file mode 100644 +index 0000000..1749b9e +--- /dev/null ++++ b/feeds/luci/applications/luci-app-upnp/po/zh-cn/upnp.po +@@ -0,0 +1,149 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Report-Msgid-Bugs-To: \n" ++"POT-Creation-Date: 2009-06-10 03:40+0200\n" ++"PO-Revision-Date: 2012-09-03 18:02+0200\n" ++"Last-Translator: nKsyn \n" ++"Language-Team: QQ Group 75543259 \n" ++"Language: zh_CN\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=1; plural=0;\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "" ++"ACLs specify which external ports may be redirected to which internal " ++"addresses and ports" ++msgstr "指定外部端å£çš„ACLå¯èƒ½ä¼šè¢«é‡å®šå‘至æŸäº›å†…部地å€åŠç«¯å£" ++ ++msgid "Action" ++msgstr "动作" ++ ++msgid "Active UPnP Redirects" ++msgstr "活动的UPnPé‡å®šå‘" ++ ++msgid "Advanced Settings" ++msgstr "高级设置" ++ ++msgid "Allow adding forwards only to requesting ip addresses" ++msgstr "å…许添加åªè½¬å‘给请求的IP地å€(当å¯ç”¨æ—¶ï¼ŒUPnP的客户å¯ä»¥åªè½¬å‘到其IP)" ++ ++msgid "Announced model number" ++msgstr "公布的型å·" ++ ++msgid "Announced serial number" ++msgstr "公布的åºåˆ—å·" ++ ++msgid "Clean rules interval" ++msgstr "定时自动清除无效规则" ++ ++msgid "Clean rules threshold" ++msgstr "å¯åŠ¨æ—¶æ¸…除端å£è½¬å‘" ++ ++msgid "Client Address" ++msgstr "客户端地å€" ++ ++msgid "Client Port" ++msgstr "客户端端å£" ++ ++msgid "Collecting data..." ++msgstr "正在收集数æ®" ++ ++msgid "Comment" ++msgstr "备注" ++ ++msgid "Delete Redirect" ++msgstr "删除转å‘规则" ++ ++msgid "Device UUID" ++msgstr "设备UUID" ++ ++msgid "Downlink" ++msgstr "下行速率" ++ ++msgid "Enable NAT-PMP functionality" ++msgstr "å¯ç”¨NAT-PMP功能" ++ ++msgid "Enable UPnP functionality" ++msgstr "å¯ç”¨UPnP功能" ++ ++msgid "Enable additional logging" ++msgstr "å¯ç”¨é¢å¤–的日志记录" ++ ++msgid "Enable secure mode" ++msgstr "å¯ç”¨å®‰å…¨æ¨¡å¼" ++ ++msgid "External Port" ++msgstr "外部端å£" ++ ++msgid "External ports" ++msgstr "外部端å£" ++ ++msgid "General Settings" ++msgstr "一般设置" ++ ++msgid "Internal addresses" ++msgstr "内部地å€" ++ ++msgid "Internal ports" ++msgstr "内部端å£" ++ ++msgid "MiniUPnP ACLs" ++msgstr "MiniUPnPçš„ACL" ++ ++msgid "MiniUPnP settings" ++msgstr "MiniUPnP设置" ++ ++msgid "Notify interval" ++msgstr "警报间隔" ++ ++msgid "Port" ++msgstr "端å£" ++ ++msgid "Presentation URL" ++msgstr "显示URL" ++ ++msgid "Protocol" ++msgstr "åè®®" ++ ++msgid "Puts extra debugging information into the system log" ++msgstr "æå–é¢å¤–的调试信æ¯è‡³ç³»ç»Ÿæ—¥å¿—" ++ ++msgid "Report system instead of daemon uptime" ++msgstr "用系统è¿è¡Œæ—¶é—´ä»£æ›¿è¿›ç¨‹è¿è¡Œæ—¶é—´" ++ ++msgid "Start UPnP and NAT-PMP service" ++msgstr "å¯åŠ¨UPnP与NAT-PMPæœåŠ¡" ++ ++msgid "There are no active redirects." ++msgstr "没有活动的é‡å®šå‘" ++ ++msgid "UPNP" ++msgstr "UPNP" ++ ++msgid "" ++"UPnP allows clients in the local network to automatically configure the " ++"router." ++msgstr "UPnPå…许局域网内客户端自动设置路由上的端å£è½¬å‘。" ++ ++msgid "UPnP lease file" ++msgstr "UPnP租约文件" ++ ++msgid "Universal Plug & Play" ++msgstr "通用å³æ’å³ç”¨(UPnP)" ++ ++msgid "Uplink" ++msgstr "上行速率" ++ ++msgid "Value in KByte/s, informational only" ++msgstr "值为KByte/s,仅供å‚考" ++ ++#~ msgid "" ++#~ "UPNP allows clients in the local network to automatically configure the " ++#~ "router." ++#~ msgstr "UPnPå…许局域网内客户端自动设置路由上的端å£è½¬å‘。" ++ ++#~ msgid "enable" ++#~ msgstr "å¯ç”¨" +diff --git a/feeds/luci/applications/luci-app-upnp/po/zh-tw/upnp.po b/feeds/luci/applications/luci-app-upnp/po/zh-tw/upnp.po +new file mode 100644 +index 0000000..356801b +--- /dev/null ++++ b/feeds/luci/applications/luci-app-upnp/po/zh-tw/upnp.po +@@ -0,0 +1,147 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"PO-Revision-Date: 2014-05-14 11:40+0200\n" ++"Last-Translator: omnistack \n" ++"Language-Team: none\n" ++"Language: zh_TW\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=1; plural=0;\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "" ++"ACLs specify which external ports may be redirected to which internal " ++"addresses and ports" ++msgstr "ACLå­˜å–控制清單, 就是指定æŸäº›å¤–部埠å¯ä»¥å¾žå°Žåˆ°å…§éƒ¨ä½å€å’ŒåŸ è™Ÿ" ++ ++msgid "Action" ++msgstr "啓用" ++ ++msgid "Active UPnP Redirects" ++msgstr "啓用UPnP從導" ++ ++msgid "Advanced Settings" ++msgstr "進階設定" ++ ++msgid "Allow adding forwards only to requesting ip addresses" ++msgstr "åªå…許請求的IPä½å€æ–°å¢žå¾žå°Žæ©Ÿåˆ¶" ++ ++msgid "Announced model number" ++msgstr "已宣告模組號碼" ++ ++msgid "Announced serial number" ++msgstr "已宣告åºè™Ÿ" ++ ++msgid "Clean rules interval" ++msgstr "清除è¦å‰‡é–“éš”" ++ ++msgid "Clean rules threshold" ++msgstr "清除è¦å‰‡é–€æª»" ++ ++msgid "Client Address" ++msgstr "用戶端ä½å€" ++ ++msgid "Client Port" ++msgstr "用戶端埠號" ++ ++msgid "Collecting data..." ++msgstr "收集數據中..." ++ ++msgid "Comment" ++msgstr "è©•è«–" ++ ++msgid "Delete Redirect" ++msgstr "刪除從導" ++ ++msgid "Device UUID" ++msgstr "設備UUIDç¨ç«‹è­˜åˆ¥ç¢¼" ++ ++msgid "Downlink" ++msgstr "下載" ++ ++msgid "Enable NAT-PMP functionality" ++msgstr "啓用蘋果NAT-PMP傳輸埠å°æ‡‰é€šè¨Šå”定功能" ++ ++msgid "Enable UPnP functionality" ++msgstr "啓用UPnP通用åºåˆ—埠功能" ++ ++msgid "Enable additional logging" ++msgstr "啓用é¡å¤–記錄" ++ ++msgid "Enable secure mode" ++msgstr "啓用安全模å¼" ++ ++msgid "External Port" ++msgstr "外部埠號" ++ ++msgid "External ports" ++msgstr "外部埠號範åœ" ++ ++msgid "General Settings" ++msgstr "一般設定" ++ ++msgid "Internal addresses" ++msgstr "內部ä½å€" ++ ++msgid "Internal ports" ++msgstr "內部埠號" ++ ++msgid "MiniUPnP ACLs" ++msgstr "å°åž‹UPnPå­˜å–控制清單" ++ ++msgid "MiniUPnP settings" ++msgstr "å°åž‹UPnPå­˜å–控制清單設定" ++ ++msgid "Notify interval" ++msgstr "æ醒間隔" ++ ++msgid "Port" ++msgstr "埠號" ++ ++msgid "Presentation URL" ++msgstr "介紹URL連çµ" ++ ++msgid "Protocol" ++msgstr "å”è­°" ++ ++msgid "Puts extra debugging information into the system log" ++msgstr "把é¡å¤–的除錯資訊放入系統log計錄中" ++ ++msgid "Report system instead of daemon uptime" ++msgstr "報表系統å–代常é§æ›´æ–°æ™‚é–“" ++ ++msgid "Start UPnP and NAT-PMP service" ++msgstr "啓用UPnPè·ŸNAT-PMPæœå‹™" ++ ++msgid "There are no active redirects." ++msgstr "ç›®å‰ç„¡ä½œç”¨ä¸­çš„從導" ++ ++msgid "UPNP" ++msgstr "UPNP通用åºåˆ—埠å”定" ++ ++msgid "" ++"UPnP allows clients in the local network to automatically configure the " ++"router." ++msgstr "開放本地用戶端自動設定路由器UPNP機制" ++ ++msgid "UPnP lease file" ++msgstr "UPnP租賃文件" ++ ++msgid "Universal Plug & Play" ++msgstr "通用åºåˆ—埠隨æ’隨用" ++ ++msgid "Uplink" ++msgstr "上傳" ++ ++msgid "Value in KByte/s, informational only" ++msgstr "僅採用 KByte/s值單ä½è¡¨ç¤º" ++ ++#~ msgid "" ++#~ "UPNP allows clients in the local network to automatically configure the " ++#~ "router." ++#~ msgstr "開放本地用戶端自動設定路由器UPNP機制" ++ ++#~ msgid "enable" ++#~ msgstr "啓用" +diff --git a/feeds/luci/applications/luci-app-ushare/Makefile b/feeds/luci/applications/luci-app-ushare/Makefile +new file mode 100644 +index 0000000..5c0974c +--- /dev/null ++++ b/feeds/luci/applications/luci-app-ushare/Makefile +@@ -0,0 +1,14 @@ ++# ++# Copyright (C) 2008-2014 The LuCI Team ++# ++# This is free software, licensed under the Apache License, Version 2.0 . ++# ++ ++include $(TOPDIR)/rules.mk ++ ++LUCI_TITLE:=uShare - UPnP A/V & DLNA Media Server ++LUCI_DEPENDS:=+ushare @BROKEN ++ ++include ../../luci.mk ++ ++# call BuildPackage - OpenWrt buildroot signature +diff --git a/feeds/luci/applications/luci-app-ushare/luasrc/controller/ushare.lua b/feeds/luci/applications/luci-app-ushare/luasrc/controller/ushare.lua +new file mode 100644 +index 0000000..c811773 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-ushare/luasrc/controller/ushare.lua +@@ -0,0 +1,15 @@ ++-- Copyright 2008 Yanira ++-- Licensed to the public under the Apache License 2.0. ++ ++module("luci.controller.ushare", package.seeall) ++ ++function index() ++ if not nixio.fs.access("/etc/config/ushare") then ++ return ++ end ++ ++ local page ++ ++ page = entry({"admin", "services", "ushare"}, cbi("ushare"), _("uShare"), 60) ++ page.dependent = true ++end +diff --git a/feeds/luci/applications/luci-app-ushare/luasrc/model/cbi/ushare.lua b/feeds/luci/applications/luci-app-ushare/luasrc/model/cbi/ushare.lua +new file mode 100644 +index 0000000..0c2d1f0 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-ushare/luasrc/model/cbi/ushare.lua +@@ -0,0 +1,30 @@ ++-- Copyright 2008 Yanira ++-- Licensed to the public under the Apache License 2.0. ++ ++m = Map("ushare", translate("uShare"), ++ luci.util.pcdata(translate("uShare is a UPnP (TM) A/V & DLNA Media Server. It implements the server component that provides UPnP media devices with information on available multimedia files."))) ++ ++s = m:section(TypedSection, "ushare", translate("Settings")) ++s.addremove = false ++s.anonymous = true ++ ++s:option(Flag, "enabled", translate("Enable")) ++ ++s:option(Value, "username", translate("Username")) ++ ++s:option(Value, "servername", translate("Servername")) ++ ++dif = s:option( Value, "interface", translate("Interface")) ++for _, nif in ipairs(luci.sys.net.devices()) do ++ if nif ~= "lo" then dif:value(nif) end ++end ++ ++s:option(DynamicList, "content_directories", translate("Content directories")) ++ ++s:option(Flag, "disable_webif", translate("Disable webinterface")) ++ ++s:option(Flag, "disable_telnet", translate("Disable telnet console")) ++ ++s:option(Value, "options", translate("Options")) ++ ++return m +diff --git a/feeds/luci/applications/luci-app-ushare/po/ca/ushare.po b/feeds/luci/applications/luci-app-ushare/po/ca/ushare.po +new file mode 100644 +index 0000000..9d64596 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-ushare/po/ca/ushare.po +@@ -0,0 +1,55 @@ ++# ushare.pot ++# generated from ./applications/luci-ushare/luasrc/i18n/ushare.en.lua ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Report-Msgid-Bugs-To: \n" ++"POT-Creation-Date: 2009-06-10 03:40+0200\n" ++"PO-Revision-Date: 2014-07-01 08:29+0200\n" ++"Last-Translator: Alex \n" ++"Language-Team: LANGUAGE \n" ++"Language: ca\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n != 1);\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "Content directories" ++msgstr "Directoris de contingut" ++ ++msgid "Disable telnet console" ++msgstr "Inhabilita la consola telnet" ++ ++msgid "Disable webinterface" ++msgstr "Inhabilita la interfície web" ++ ++msgid "Enable" ++msgstr "Habilita" ++ ++msgid "Interface" ++msgstr "Interfície" ++ ++msgid "Options" ++msgstr "Opcions" ++ ++msgid "Servername" ++msgstr "Nom de servidor" ++ ++msgid "Settings" ++msgstr "Configuració" ++ ++msgid "Username" ++msgstr "Nom d'usuari" ++ ++msgid "uShare" ++msgstr "uShare" ++ ++msgid "" ++"uShare is a UPnP (TM) A/V & DLNA Media Server. It implements the server " ++"component that provides UPnP media devices with information on available " ++"multimedia files." ++msgstr "" ++"El uShare és un servidor de mitjans UPnP (TM) A/V i DLNA. Implementa el " ++"component servidor que proveeix els dispositius de mitjans UPnP amb " ++"informació sobre els fitxers de multimèdia disponibles." +diff --git a/feeds/luci/applications/luci-app-ushare/po/cs/ushare.po b/feeds/luci/applications/luci-app-ushare/po/cs/ushare.po +new file mode 100644 +index 0000000..d908e91 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-ushare/po/cs/ushare.po +@@ -0,0 +1,53 @@ ++# ushare.pot ++# generated from ./applications/luci-ushare/luasrc/i18n/ushare.en.lua ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"PO-Revision-Date: 2013-01-29 21:49+0200\n" ++"Last-Translator: Astran \n" ++"Language-Team: none\n" ++"Language: cs\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "Content directories" ++msgstr "Složky s obsahem" ++ ++msgid "Disable telnet console" ++msgstr "Zakázat telnet konzoli" ++ ++msgid "Disable webinterface" ++msgstr "Zakázat webové rozhraní" ++ ++msgid "Enable" ++msgstr "Povolit" ++ ++msgid "Interface" ++msgstr "Rozhraní" ++ ++msgid "Options" ++msgstr "Možnosti" ++ ++msgid "Servername" ++msgstr "Název serveru" ++ ++msgid "Settings" ++msgstr "Nastavení" ++ ++msgid "Username" ++msgstr "Uživatelské jméno" ++ ++msgid "uShare" ++msgstr "uShare" ++ ++msgid "" ++"uShare is a UPnP (TM) A/V & DLNA Media Server. It implements the server " ++"component that provides UPnP media devices with information on available " ++"multimedia files." ++msgstr "" ++"uShare je UPnP (TM) A/V & DLNA Media Server. Implementuje souÄást serveru, " ++"který poskytuje UPnP mediální zařízení s informacemi o dostupných " ++"multimediálních souborech." +diff --git a/feeds/luci/applications/luci-app-ushare/po/de/ushare.po b/feeds/luci/applications/luci-app-ushare/po/de/ushare.po +new file mode 100644 +index 0000000..d7d7e22 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-ushare/po/de/ushare.po +@@ -0,0 +1,53 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Report-Msgid-Bugs-To: \n" ++"POT-Creation-Date: 2009-05-26 17:57+0200\n" ++"PO-Revision-Date: 2013-01-28 22:32+0200\n" ++"Last-Translator: DAC324 \n" ++"Language-Team: LANGUAGE \n" ++"Language: de\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n != 1);\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "Content directories" ++msgstr "Freigabeverzeichnisse" ++ ++msgid "Disable telnet console" ++msgstr "Telnet-Konsole deaktivieren" ++ ++msgid "Disable webinterface" ++msgstr "Webinterface deaktivieren" ++ ++msgid "Enable" ++msgstr "Aktivieren" ++ ++msgid "Interface" ++msgstr "Schnittstelle" ++ ++msgid "Options" ++msgstr "Optionen" ++ ++msgid "Servername" ++msgstr "Servername" ++ ++msgid "Settings" ++msgstr "Einstellungen" ++ ++msgid "Username" ++msgstr "Benutzername" ++ ++msgid "uShare" ++msgstr "uShare" ++ ++msgid "" ++"uShare is a UPnP (TM) A/V & DLNA Media Server. It implements the server " ++"component that provides UPnP media devices with information on available " ++"multimedia files." ++msgstr "" ++"uShare ist ein uPNP(TM) A/V & DLNA - basierender Medien-Server. Es " ++"implementiert die Serverkomponente, welche uPNP-Geräten Informationen über " ++"verfügbare Mediendateien bereitstellt." +diff --git a/feeds/luci/applications/luci-app-ushare/po/el/ushare.po b/feeds/luci/applications/luci-app-ushare/po/el/ushare.po +new file mode 100644 +index 0000000..331c8a0 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-ushare/po/el/ushare.po +@@ -0,0 +1,48 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Report-Msgid-Bugs-To: \n" ++"POT-Creation-Date: 2009-05-28 02:08+0200\n" ++"PO-Revision-Date: 2010-06-30 17:26+0200\n" ++"Last-Translator: Vasilis Tsiligiannis \n" ++"Language-Team: LANGUAGE \n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"X-Generator: Pootle 1.1.0\n" ++ ++msgid "Content directories" ++msgstr "Φάκελοι πεÏιεχομένου" ++ ++msgid "Disable telnet console" ++msgstr "ΑπενεÏγοποίηση τεÏÎ¼Î±Ï„Î¹ÎºÎ¿Ï telnet" ++ ++msgid "Disable webinterface" ++msgstr "ΑπενεÏγοποίηση διεπαφής web" ++ ++msgid "Enable" ++msgstr "" ++ ++msgid "Interface" ++msgstr "" ++ ++msgid "Options" ++msgstr "Επιλογές" ++ ++msgid "Servername" ++msgstr "Όνομα εξυπηÏετητή" ++ ++msgid "Settings" ++msgstr "Ρυθμίσεις" ++ ++msgid "Username" ++msgstr "" ++ ++msgid "uShare" ++msgstr "" ++ ++msgid "" ++"uShare is a UPnP (TM) A/V & DLNA Media Server. It implements the server " ++"component that provides UPnP media devices with information on available " ++"multimedia files." ++msgstr "" +diff --git a/feeds/luci/applications/luci-app-ushare/po/en/ushare.po b/feeds/luci/applications/luci-app-ushare/po/en/ushare.po +new file mode 100644 +index 0000000..5e5d65f +--- /dev/null ++++ b/feeds/luci/applications/luci-app-ushare/po/en/ushare.po +@@ -0,0 +1,49 @@ ++#, fuzzy ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Report-Msgid-Bugs-To: \n" ++"POT-Creation-Date: 2009-05-19 19:36+0200\n" ++"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" ++"Last-Translator: FULL NAME \n" ++"Language-Team: LANGUAGE \n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"X-Generator: Translate Toolkit 1.1.1\n" ++ ++msgid "Content directories" ++msgstr "Content directories" ++ ++msgid "Disable telnet console" ++msgstr "Disable telnet console" ++ ++msgid "Disable webinterface" ++msgstr "Disable webinterface" ++ ++msgid "Enable" ++msgstr "" ++ ++msgid "Interface" ++msgstr "" ++ ++msgid "Options" ++msgstr "Options" ++ ++msgid "Servername" ++msgstr "Servername" ++ ++msgid "Settings" ++msgstr "Settings" ++ ++msgid "Username" ++msgstr "" ++ ++msgid "uShare" ++msgstr "" ++ ++msgid "" ++"uShare is a UPnP (TM) A/V & DLNA Media Server. It implements the server " ++"component that provides UPnP media devices with information on available " ++"multimedia files." ++msgstr "" +diff --git a/feeds/luci/applications/luci-app-ushare/po/es/ushare.po b/feeds/luci/applications/luci-app-ushare/po/es/ushare.po +new file mode 100644 +index 0000000..e8422b9 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-ushare/po/es/ushare.po +@@ -0,0 +1,53 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Report-Msgid-Bugs-To: \n" ++"POT-Creation-Date: 2009-06-10 03:41+0200\n" ++"PO-Revision-Date: 2012-08-25 09:23+0200\n" ++"Last-Translator: José Vicente \n" ++"Language-Team: LANGUAGE \n" ++"Language: es\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n != 1);\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "Content directories" ++msgstr "Directorios de contenido" ++ ++msgid "Disable telnet console" ++msgstr "Inhabilitar consola telnet" ++ ++msgid "Disable webinterface" ++msgstr "Inhabilitar interfaz web" ++ ++msgid "Enable" ++msgstr "Activar" ++ ++msgid "Interface" ++msgstr "Interfaz" ++ ++msgid "Options" ++msgstr "Opciones" ++ ++msgid "Servername" ++msgstr "Nombre para el servidor" ++ ++msgid "Settings" ++msgstr "Configuración" ++ ++msgid "Username" ++msgstr "Nombre de usuario" ++ ++msgid "uShare" ++msgstr "uShare" ++ ++msgid "" ++"uShare is a UPnP (TM) A/V & DLNA Media Server. It implements the server " ++"component that provides UPnP media devices with information on available " ++"multimedia files." ++msgstr "" ++"uShare es un servidor UPnP (TM) A/V y DLNA. Implementa el componente del " ++"servidor que proporciona a los dispositivos UPnP la información disponible " ++"en los ficheros multimedia." +diff --git a/feeds/luci/applications/luci-app-ushare/po/fr/ushare.po b/feeds/luci/applications/luci-app-ushare/po/fr/ushare.po +new file mode 100644 +index 0000000..e2e917d +--- /dev/null ++++ b/feeds/luci/applications/luci-app-ushare/po/fr/ushare.po +@@ -0,0 +1,50 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Report-Msgid-Bugs-To: \n" ++"POT-Creation-Date: 2009-05-19 19:36+0200\n" ++"PO-Revision-Date: 2013-08-06 13:57+0200\n" ++"Last-Translator: st \n" ++"Language-Team: LANGUAGE \n" ++"Language: fr\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n > 1);\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "Content directories" ++msgstr "Répertoires de contenus" ++ ++msgid "Disable telnet console" ++msgstr "Désactiver la console Telnet" ++ ++msgid "Disable webinterface" ++msgstr "Désactiver l'interface web" ++ ++msgid "Enable" ++msgstr "Activer" ++ ++msgid "Interface" ++msgstr "Interface" ++ ++msgid "Options" ++msgstr "Options" ++ ++msgid "Servername" ++msgstr "Nom du serveur" ++ ++msgid "Settings" ++msgstr "Paramètres" ++ ++msgid "Username" ++msgstr "Nom d'utilisateur" ++ ++msgid "uShare" ++msgstr "" ++ ++msgid "" ++"uShare is a UPnP (TM) A/V & DLNA Media Server. It implements the server " ++"component that provides UPnP media devices with information on available " ++"multimedia files." ++msgstr "" +diff --git a/feeds/luci/applications/luci-app-ushare/po/he/ushare.po b/feeds/luci/applications/luci-app-ushare/po/he/ushare.po +new file mode 100644 +index 0000000..4858a9a +--- /dev/null ++++ b/feeds/luci/applications/luci-app-ushare/po/he/ushare.po +@@ -0,0 +1,52 @@ ++# ushare.pot ++# generated from ./applications/luci-ushare/luasrc/i18n/ushare.en.lua ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"PO-Revision-Date: 2011-06-24 18:47+0200\n" ++"Last-Translator: GiladL \n" ++"Language-Team: none\n" ++"Language: he\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n != 1);\n" ++"X-Generator: Pootle 2.0.4\n" ++ ++msgid "Content directories" ++msgstr "ספריות תוכן" ++ ++# ×”×× ×œ×›×ª×•×‘ טלנט ב×נגלית (telenet) ×ו בתעתיק עברי (טלנט)? ++msgid "Disable telnet console" ++msgstr "השבת קונסולת telnet" ++ ++msgid "Disable webinterface" ++msgstr "השבת מנשק רשת" ++ ++msgid "Enable" ++msgstr "" ++ ++msgid "Interface" ++msgstr "" ++ ++msgid "Options" ++msgstr "×פשרויות" ++ ++msgid "Servername" ++msgstr "×©× ×©×¨×ª" ++ ++msgid "Settings" ++msgstr "הגדרות" ++ ++msgid "Username" ++msgstr "" ++ ++# ×–×” ×©× ×©×œ תוכנה ×•×œ× ×¦×¨×™×š ×œ×ª×¨×’× ×ותו ++msgid "uShare" ++msgstr "uShare" ++ ++msgid "" ++"uShare is a UPnP (TM) A/V & DLNA Media Server. It implements the server " ++"component that provides UPnP media devices with information on available " ++"multimedia files." ++msgstr "" +diff --git a/feeds/luci/applications/luci-app-ushare/po/hu/ushare.po b/feeds/luci/applications/luci-app-ushare/po/hu/ushare.po +new file mode 100644 +index 0000000..6efa521 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-ushare/po/hu/ushare.po +@@ -0,0 +1,53 @@ ++# ushare.pot ++# generated from ./applications/luci-ushare/luasrc/i18n/ushare.en.lua ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"PO-Revision-Date: 2012-09-13 18:29+0200\n" ++"Last-Translator: Gábor \n" ++"Language-Team: none\n" ++"Language: hu\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n != 1);\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "Content directories" ++msgstr "Megosztott könyvtárak" ++ ++msgid "Disable telnet console" ++msgstr "Telnet-konzol tiltása" ++ ++msgid "Disable webinterface" ++msgstr "Web felület tiltása" ++ ++msgid "Enable" ++msgstr "Engedélyezés" ++ ++msgid "Interface" ++msgstr "Interfész" ++ ++msgid "Options" ++msgstr "Opciók" ++ ++msgid "Servername" ++msgstr "Szerver név" ++ ++msgid "Settings" ++msgstr "Beállítások" ++ ++msgid "Username" ++msgstr "Felhasználónév" ++ ++msgid "uShare" ++msgstr "uShare" ++ ++msgid "" ++"uShare is a UPnP (TM) A/V & DLNA Media Server. It implements the server " ++"component that provides UPnP media devices with information on available " ++"multimedia files." ++msgstr "" ++"Az uShare egy UPnP (TM) A/V & DLNA média szerver. A szerver komponenst " ++"valósítja meg, amely információt szolgáltat az elérhetÅ‘ multimédia fájlokról " ++"az uPnP média eszközök számára." +diff --git a/feeds/luci/applications/luci-app-ushare/po/it/ushare.po b/feeds/luci/applications/luci-app-ushare/po/it/ushare.po +new file mode 100644 +index 0000000..5837a11 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-ushare/po/it/ushare.po +@@ -0,0 +1,53 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Report-Msgid-Bugs-To: \n" ++"POT-Creation-Date: 2009-05-19 19:36+0200\n" ++"PO-Revision-Date: 2013-02-03 14:03+0200\n" ++"Last-Translator: Francesco <3gasas@gmail.com>\n" ++"Language-Team: LANGUAGE \n" ++"Language: it\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n != 1);\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "Content directories" ++msgstr "Percorso dei contenuti" ++ ++msgid "Disable telnet console" ++msgstr "Disabilita console telnet" ++ ++msgid "Disable webinterface" ++msgstr "Disabilita l'interfaccia web" ++ ++msgid "Enable" ++msgstr "Attiva" ++ ++msgid "Interface" ++msgstr "Interfaccia" ++ ++msgid "Options" ++msgstr "Opzioni" ++ ++msgid "Servername" ++msgstr "Nome del server" ++ ++msgid "Settings" ++msgstr "Impostazioni" ++ ++msgid "Username" ++msgstr "Nome Utente" ++ ++msgid "uShare" ++msgstr "uShare" ++ ++msgid "" ++"uShare is a UPnP (TM) A/V & DLNA Media Server. It implements the server " ++"component that provides UPnP media devices with information on available " ++"multimedia files." ++msgstr "" ++"uShare è un Server Multimediale UPnP (TM) A / V e DLNA. Implementa il " ++"componente server che fornisce ai dispositivi multimediali UPnP, le " ++"informazioni su file multimediali disponibili." +diff --git a/feeds/luci/applications/luci-app-ushare/po/ja/ushare.po b/feeds/luci/applications/luci-app-ushare/po/ja/ushare.po +new file mode 100644 +index 0000000..a217ece +--- /dev/null ++++ b/feeds/luci/applications/luci-app-ushare/po/ja/ushare.po +@@ -0,0 +1,52 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Report-Msgid-Bugs-To: \n" ++"POT-Creation-Date: 2009-05-19 19:36+0200\n" ++"PO-Revision-Date: 2013-05-04 14:28+0200\n" ++"Last-Translator: Kentaro \n" ++"Language-Team: LANGUAGE \n" ++"Language: ja\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=1; plural=0;\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "Content directories" ++msgstr "コンテンツディレクトリ" ++ ++msgid "Disable telnet console" ++msgstr "telnelコンソールを無効ã«ã™ã‚‹" ++ ++msgid "Disable webinterface" ++msgstr "Webインターフェースを無効ã«ã™ã‚‹" ++ ++msgid "Enable" ++msgstr "サービスを有効ã«ã™ã‚‹" ++ ++msgid "Interface" ++msgstr "インターフェース" ++ ++msgid "Options" ++msgstr "オプション" ++ ++msgid "Servername" ++msgstr "サーãƒãƒ¼å" ++ ++msgid "Settings" ++msgstr "設定" ++ ++msgid "Username" ++msgstr "ユーザーå" ++ ++msgid "uShare" ++msgstr "uShare" ++ ++msgid "" ++"uShare is a UPnP (TM) A/V & DLNA Media Server. It implements the server " ++"component that provides UPnP media devices with information on available " ++"multimedia files." ++msgstr "" ++"uShareã¯UPnP (TM) A/V ãŠã‚ˆã³ DLNA " ++"メディアサーãƒãƒ¼ã§ã‚ã‚Šã€UPnPメディアデãƒã‚¤ã‚¹ã«å¯¾ã—ã¦ãƒžãƒ«ãƒãƒ¡ãƒ‡ã‚£ã‚¢ãƒ»ãƒ•ã‚¡ã‚¤ãƒ«æƒ…報をæä¾›ã™ã‚‹ã‚µãƒ¼ãƒãƒ¼ãƒ»ã‚³ãƒ³ãƒãƒ¼ãƒãƒ³ãƒˆæ©Ÿèƒ½ã‚’実装ã—ã¦ã„ã¾ã™ã€‚" +diff --git a/feeds/luci/applications/luci-app-ushare/po/ms/ushare.po b/feeds/luci/applications/luci-app-ushare/po/ms/ushare.po +new file mode 100644 +index 0000000..40b24f2 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-ushare/po/ms/ushare.po +@@ -0,0 +1,46 @@ ++# ushare.pot ++# generated from ./applications/luci-ushare/luasrc/i18n/ushare.en.lua ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Last-Translator: Automatically generated\n" ++"Language-Team: none\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++ ++msgid "Content directories" ++msgstr "" ++ ++msgid "Disable telnet console" ++msgstr "" ++ ++msgid "Disable webinterface" ++msgstr "" ++ ++msgid "Enable" ++msgstr "" ++ ++msgid "Interface" ++msgstr "" ++ ++msgid "Options" ++msgstr "" ++ ++msgid "Servername" ++msgstr "" ++ ++msgid "Settings" ++msgstr "" ++ ++msgid "Username" ++msgstr "" ++ ++msgid "uShare" ++msgstr "" ++ ++msgid "" ++"uShare is a UPnP (TM) A/V & DLNA Media Server. It implements the server " ++"component that provides UPnP media devices with information on available " ++"multimedia files." ++msgstr "" +diff --git a/feeds/luci/applications/luci-app-ushare/po/no/ushare.po b/feeds/luci/applications/luci-app-ushare/po/no/ushare.po +new file mode 100644 +index 0000000..321d29e +--- /dev/null ++++ b/feeds/luci/applications/luci-app-ushare/po/no/ushare.po +@@ -0,0 +1,44 @@ ++msgid "" ++msgstr "" ++"Last-Translator: Lars Hardy \n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++ ++msgid "Content directories" ++msgstr "Innholdskataloger" ++ ++msgid "Disable telnet console" ++msgstr "Deaktiver telnet konsoll" ++ ++msgid "Disable webinterface" ++msgstr "Deaktiver webgrensesnitt" ++ ++msgid "Enable" ++msgstr "Aktiver" ++ ++msgid "Interface" ++msgstr "Grensesnitt" ++ ++msgid "Options" ++msgstr "Alternativer" ++ ++msgid "Servername" ++msgstr "Servernavn" ++ ++msgid "Settings" ++msgstr "Innstillinger" ++ ++msgid "Username" ++msgstr "Brukernavn" ++ ++msgid "uShare" ++msgstr "uShare" ++ ++msgid "" ++"uShare is a UPnP (TM) A/V & DLNA Media Server. It implements the server " ++"component that provides UPnP media devices with information on available " ++"multimedia files." ++msgstr "" ++ ++#~ msgid "ushare_desc" ++#~ msgstr "UPnP A/V og DLNA Media Server for Linux." +diff --git a/feeds/luci/applications/luci-app-ushare/po/pl/ushare.po b/feeds/luci/applications/luci-app-ushare/po/pl/ushare.po +new file mode 100644 +index 0000000..2a26404 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-ushare/po/pl/ushare.po +@@ -0,0 +1,54 @@ ++# ushare.pot ++# generated from ./applications/luci-ushare/luasrc/i18n/ushare.en.lua ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"PO-Revision-Date: 2012-09-08 13:18+0200\n" ++"Last-Translator: Staszek \n" ++"Language-Team: none\n" ++"Language: pl\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 " ++"|| n%100>=20) ? 1 : 2);\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "Content directories" ++msgstr "Katalogi zawartoÅ›ci" ++ ++msgid "Disable telnet console" ++msgstr "WyÅ‚Ä…cz konsolÄ™ telnet" ++ ++msgid "Disable webinterface" ++msgstr "WyÅ‚Ä…cz interfejs web" ++ ++msgid "Enable" ++msgstr "WÅ‚Ä…cz" ++ ++msgid "Interface" ++msgstr "Interfejs" ++ ++msgid "Options" ++msgstr "Opcje" ++ ++msgid "Servername" ++msgstr "Nazwa serwera" ++ ++msgid "Settings" ++msgstr "Ustawienia" ++ ++msgid "Username" ++msgstr "Użytkownik" ++ ++msgid "uShare" ++msgstr "uShare" ++ ++msgid "" ++"uShare is a UPnP (TM) A/V & DLNA Media Server. It implements the server " ++"component that provides UPnP media devices with information on available " ++"multimedia files." ++msgstr "" ++"uShare jest serwerem mediów UPnP (TM) i DLNA. Implementuje serwer, który " ++"udostÄ™pnia urzÄ…dzenia medialne UPnP z informacjami na temat dostÄ™pnych " ++"plików multimedialnych." +diff --git a/feeds/luci/applications/luci-app-ushare/po/pt-br/ushare.po b/feeds/luci/applications/luci-app-ushare/po/pt-br/ushare.po +new file mode 100644 +index 0000000..5fc872e +--- /dev/null ++++ b/feeds/luci/applications/luci-app-ushare/po/pt-br/ushare.po +@@ -0,0 +1,53 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Report-Msgid-Bugs-To: \n" ++"POT-Creation-Date: 2009-06-10 03:41+0200\n" ++"PO-Revision-Date: 2012-09-26 23:09+0200\n" ++"Last-Translator: Luiz Angelo \n" ++"Language-Team: LANGUAGE \n" ++"Language: pt_BR\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n > 1);\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "Content directories" ++msgstr "Diretórios de conteúdo" ++ ++msgid "Disable telnet console" ++msgstr "Desativar console telnet" ++ ++msgid "Disable webinterface" ++msgstr "Desativar interface web" ++ ++msgid "Enable" ++msgstr "Habilitar" ++ ++msgid "Interface" ++msgstr "Interface" ++ ++msgid "Options" ++msgstr "Opções" ++ ++msgid "Servername" ++msgstr "Nome do servidor" ++ ++msgid "Settings" ++msgstr "Configurações" ++ ++msgid "Username" ++msgstr "Nome do usuário" ++ ++msgid "uShare" ++msgstr "uShare" ++ ++msgid "" ++"uShare is a UPnP (TM) A/V & DLNA Media Server. It implements the server " ++"component that provides UPnP media devices with information on available " ++"multimedia files." ++msgstr "" ++"uShare é um Servidor de Mídia DLNA & UPnP (TM) A/V. Implementa o componente " ++"do servidor que provê aos dispositivos de mídia UPnP informações sobre os " ++"arquivos multimídias disponíveis." +diff --git a/feeds/luci/applications/luci-app-ushare/po/pt/ushare.po b/feeds/luci/applications/luci-app-ushare/po/pt/ushare.po +new file mode 100644 +index 0000000..795a963 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-ushare/po/pt/ushare.po +@@ -0,0 +1,53 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Report-Msgid-Bugs-To: \n" ++"POT-Creation-Date: 2009-05-26 19:03+0200\n" ++"PO-Revision-Date: 2013-06-03 23:32+0200\n" ++"Last-Translator: joao.f.vieira \n" ++"Language-Team: LANGUAGE \n" ++"Language: pt\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n != 1);\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "Content directories" ++msgstr "Diretórios de conteúdo" ++ ++msgid "Disable telnet console" ++msgstr "Desativar console telnet" ++ ++msgid "Disable webinterface" ++msgstr "Desativar interface web" ++ ++msgid "Enable" ++msgstr "Ativar" ++ ++msgid "Interface" ++msgstr "Interface" ++ ++msgid "Options" ++msgstr "Opções" ++ ++msgid "Servername" ++msgstr "Nome do servidor" ++ ++msgid "Settings" ++msgstr "Configurações" ++ ++msgid "Username" ++msgstr "Nome Utilizador" ++ ++msgid "uShare" ++msgstr "uShare" ++ ++msgid "" ++"uShare is a UPnP (TM) A/V & DLNA Media Server. It implements the server " ++"component that provides UPnP media devices with information on available " ++"multimedia files." ++msgstr "" ++"O uShare é um Servidor Multimédia UPnP (TM) A/V & DLNA. Implementa o " ++"componente de servidor que fornece aos dispositivos multimédia UPnP " ++"informações sobre os ficheiros disponiveis." +diff --git a/feeds/luci/applications/luci-app-ushare/po/ro/ushare.po b/feeds/luci/applications/luci-app-ushare/po/ro/ushare.po +new file mode 100644 +index 0000000..3c99754 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-ushare/po/ro/ushare.po +@@ -0,0 +1,51 @@ ++# ushare.pot ++# generated from ./applications/luci-ushare/luasrc/i18n/ushare.en.lua ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"PO-Revision-Date: 2014-06-29 20:03+0200\n" ++"Last-Translator: xxvirusxx \n" ++"Language-Team: none\n" ++"Language: ro\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=3; plural=(n==1 ? 0 : (n==0 || (n%100 > 0 && n%100 < " ++"20)) ? 1 : 2);;\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "Content directories" ++msgstr "ConÅ£inut directoare" ++ ++msgid "Disable telnet console" ++msgstr "Dezactiveaza consola telnet" ++ ++msgid "Disable webinterface" ++msgstr "Dezactiveaza interfata web" ++ ++msgid "Enable" ++msgstr "Activează" ++ ++msgid "Interface" ++msgstr "Interfaţă" ++ ++msgid "Options" ++msgstr "Optiuni" ++ ++msgid "Servername" ++msgstr "Numele serverului" ++ ++msgid "Settings" ++msgstr "Setari" ++ ++msgid "Username" ++msgstr "Utilizator" ++ ++msgid "uShare" ++msgstr "uShare" ++ ++msgid "" ++"uShare is a UPnP (TM) A/V & DLNA Media Server. It implements the server " ++"component that provides UPnP media devices with information on available " ++"multimedia files." ++msgstr "" +diff --git a/feeds/luci/applications/luci-app-ushare/po/ru/ushare.po b/feeds/luci/applications/luci-app-ushare/po/ru/ushare.po +new file mode 100644 +index 0000000..ac08e94 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-ushare/po/ru/ushare.po +@@ -0,0 +1,54 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: LuCI: ushare\n" ++"Report-Msgid-Bugs-To: \n" ++"POT-Creation-Date: 2009-05-19 19:36+0200\n" ++"PO-Revision-Date: 2012-08-15 11:29+0300\n" ++"Last-Translator: Roman A. aka BasicXP \n" ++"Language-Team: Russian \n" ++"Language: ru\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%" ++"10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" ++"X-Generator: Pootle 2.0.6\n" ++"X-Poedit-SourceCharset: UTF-8\n" ++ ++msgid "Content directories" ++msgstr "Директории Ñ Ñодержимым" ++ ++msgid "Disable telnet console" ++msgstr "Выключить telnet-конÑоль" ++ ++msgid "Disable webinterface" ++msgstr "Выключить веб-интерфейÑ" ++ ++msgid "Enable" ++msgstr "Включить" ++ ++msgid "Interface" ++msgstr "ИнтерфейÑ" ++ ++msgid "Options" ++msgstr "Опции" ++ ++msgid "Servername" ++msgstr "Ð˜Ð¼Ñ Ñервера" ++ ++msgid "Settings" ++msgstr "ÐаÑтройки" ++ ++msgid "Username" ++msgstr "Ð˜Ð¼Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ" ++ ++msgid "uShare" ++msgstr "uShare" ++ ++msgid "" ++"uShare is a UPnP (TM) A/V & DLNA Media Server. It implements the server " ++"component that provides UPnP media devices with information on available " ++"multimedia files." ++msgstr "" ++"uShare - Ñто UPnP (TM) A/V DLNA медиа-Ñервер, который предоÑтавлÑет " ++"мультимедийным уÑтройÑтвам информацию о доÑтупных медиа-файлах." +diff --git a/feeds/luci/applications/luci-app-ushare/po/sk/ushare.po b/feeds/luci/applications/luci-app-ushare/po/sk/ushare.po +new file mode 100644 +index 0000000..4c9022b +--- /dev/null ++++ b/feeds/luci/applications/luci-app-ushare/po/sk/ushare.po +@@ -0,0 +1,45 @@ ++msgid "" ++msgstr "" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Last-Translator: Automatically generated\n" ++"Language-Team: none\n" ++"MIME-Version: 1.0\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n" ++ ++msgid "Content directories" ++msgstr "" ++ ++msgid "Disable telnet console" ++msgstr "" ++ ++msgid "Disable webinterface" ++msgstr "" ++ ++msgid "Enable" ++msgstr "" ++ ++msgid "Interface" ++msgstr "" ++ ++msgid "Options" ++msgstr "" ++ ++msgid "Servername" ++msgstr "" ++ ++msgid "Settings" ++msgstr "" ++ ++msgid "Username" ++msgstr "" ++ ++msgid "uShare" ++msgstr "" ++ ++msgid "" ++"uShare is a UPnP (TM) A/V & DLNA Media Server. It implements the server " ++"component that provides UPnP media devices with information on available " ++"multimedia files." ++msgstr "" +diff --git a/feeds/luci/applications/luci-app-ushare/po/sv/ushare.po b/feeds/luci/applications/luci-app-ushare/po/sv/ushare.po +new file mode 100644 +index 0000000..50fc9d6 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-ushare/po/sv/ushare.po +@@ -0,0 +1,46 @@ ++msgid "" ++msgstr "" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Last-Translator: Automatically generated\n" ++"Language-Team: none\n" ++"Language: sv\n" ++"MIME-Version: 1.0\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n != 1);\n" ++ ++msgid "Content directories" ++msgstr "" ++ ++msgid "Disable telnet console" ++msgstr "" ++ ++msgid "Disable webinterface" ++msgstr "" ++ ++msgid "Enable" ++msgstr "" ++ ++msgid "Interface" ++msgstr "" ++ ++msgid "Options" ++msgstr "" ++ ++msgid "Servername" ++msgstr "" ++ ++msgid "Settings" ++msgstr "" ++ ++msgid "Username" ++msgstr "" ++ ++msgid "uShare" ++msgstr "" ++ ++msgid "" ++"uShare is a UPnP (TM) A/V & DLNA Media Server. It implements the server " ++"component that provides UPnP media devices with information on available " ++"multimedia files." ++msgstr "" +diff --git a/feeds/luci/applications/luci-app-ushare/po/templates/ushare.pot b/feeds/luci/applications/luci-app-ushare/po/templates/ushare.pot +new file mode 100644 +index 0000000..7e4dbc1 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-ushare/po/templates/ushare.pot +@@ -0,0 +1,38 @@ ++msgid "" ++msgstr "Content-Type: text/plain; charset=UTF-8" ++ ++msgid "Content directories" ++msgstr "" ++ ++msgid "Disable telnet console" ++msgstr "" ++ ++msgid "Disable webinterface" ++msgstr "" ++ ++msgid "Enable" ++msgstr "" ++ ++msgid "Interface" ++msgstr "" ++ ++msgid "Options" ++msgstr "" ++ ++msgid "Servername" ++msgstr "" ++ ++msgid "Settings" ++msgstr "" ++ ++msgid "Username" ++msgstr "" ++ ++msgid "uShare" ++msgstr "" ++ ++msgid "" ++"uShare is a UPnP (TM) A/V & DLNA Media Server. It implements the server " ++"component that provides UPnP media devices with information on available " ++"multimedia files." ++msgstr "" +diff --git a/feeds/luci/applications/luci-app-ushare/po/tr/ushare.po b/feeds/luci/applications/luci-app-ushare/po/tr/ushare.po +new file mode 100644 +index 0000000..c905c57 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-ushare/po/tr/ushare.po +@@ -0,0 +1,50 @@ ++# ushare.pot ++# generated from ./applications/luci-ushare/luasrc/i18n/ushare.en.lua ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"PO-Revision-Date: 2012-10-11 22:33+0200\n" ++"Last-Translator: vincenzo \n" ++"Language-Team: none\n" ++"Language: tr\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=1; plural=0;\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "Content directories" ++msgstr "İçerik Dizinleri" ++ ++msgid "Disable telnet console" ++msgstr "Telnet Konsolunu Kapatma" ++ ++msgid "Disable webinterface" ++msgstr "Web Arayüzünü Kapatma" ++ ++msgid "Enable" ++msgstr "Aktif Hale Getir" ++ ++msgid "Interface" ++msgstr "Arayüz" ++ ++msgid "Options" ++msgstr "Seçenekler" ++ ++msgid "Servername" ++msgstr "Sunucuadı" ++ ++msgid "Settings" ++msgstr "Ayarlar" ++ ++msgid "Username" ++msgstr "Kullanıcıadı" ++ ++msgid "uShare" ++msgstr "uShare" ++ ++msgid "" ++"uShare is a UPnP (TM) A/V & DLNA Media Server. It implements the server " ++"component that provides UPnP media devices with information on available " ++"multimedia files." ++msgstr "" +diff --git a/feeds/luci/applications/luci-app-ushare/po/uk/ushare.po b/feeds/luci/applications/luci-app-ushare/po/uk/ushare.po +new file mode 100644 +index 0000000..d79f896 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-ushare/po/uk/ushare.po +@@ -0,0 +1,53 @@ ++# ushare.pot ++# generated from ./applications/luci-ushare/luasrc/i18n/ushare.en.lua ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"PO-Revision-Date: 2013-05-26 18:43+0200\n" ++"Last-Translator: Yurii \n" ++"Language-Team: none\n" ++"Language: uk\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%" ++"10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "Content directories" ++msgstr "Каталоги даних" ++ ++msgid "Disable telnet console" ++msgstr "Вимкнути конÑоль Telnet" ++ ++msgid "Disable webinterface" ++msgstr "Вимкнути веб-інтерфейÑ" ++ ++msgid "Enable" ++msgstr "Увімкнути" ++ ++msgid "Interface" ++msgstr "ІнтерфейÑ" ++ ++msgid "Options" ++msgstr "Опції" ++ ++msgid "Servername" ++msgstr "Ім'Ñ Ñервера" ++ ++msgid "Settings" ++msgstr "ÐаÑтройки" ++ ++msgid "Username" ++msgstr "Ім'Ñ ÐºÐ¾Ñ€Ð¸Ñтувача" ++ ++msgid "uShare" ++msgstr "uShare" ++ ++msgid "" ++"uShare is a UPnP (TM) A/V & DLNA Media Server. It implements the server " ++"component that provides UPnP media devices with information on available " ++"multimedia files." ++msgstr "" ++"uShare Ñ” UPnP (TM) A/V DLNA медіа-Ñервером, Ñкий надає UPnP медіа-приÑтроÑм " ++"інформацію про наÑвні мультимедійні файли." +diff --git a/feeds/luci/applications/luci-app-ushare/po/vi/ushare.po b/feeds/luci/applications/luci-app-ushare/po/vi/ushare.po +new file mode 100644 +index 0000000..20e5df7 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-ushare/po/vi/ushare.po +@@ -0,0 +1,50 @@ ++# ushare.pot ++# generated from ./applications/luci-ushare/luasrc/i18n/ushare.en.lua ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Report-Msgid-Bugs-To: \n" ++"POT-Creation-Date: 2009-08-16 06:59+0200\n" ++"PO-Revision-Date: 2009-08-13 04:01+0200\n" ++"Last-Translator: Hong Phuc Dang \n" ++"Language-Team: LANGUAGE \n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"X-Generator: Pootle 1.1.0\n" ++ ++msgid "Content directories" ++msgstr "Danh bạ ná»™i dung " ++ ++msgid "Disable telnet console" ++msgstr "Vô hiệu hóa khiển telnet" ++ ++msgid "Disable webinterface" ++msgstr "Vô hiệu hóa giao diện web" ++ ++msgid "Enable" ++msgstr "" ++ ++msgid "Interface" ++msgstr "" ++ ++msgid "Options" ++msgstr "Lá»±a chá»n " ++ ++msgid "Servername" ++msgstr "tên máy chủ" ++ ++msgid "Settings" ++msgstr "Cài đặt" ++ ++msgid "Username" ++msgstr "" ++ ++msgid "uShare" ++msgstr "" ++ ++msgid "" ++"uShare is a UPnP (TM) A/V & DLNA Media Server. It implements the server " ++"component that provides UPnP media devices with information on available " ++"multimedia files." ++msgstr "" +diff --git a/feeds/luci/applications/luci-app-ushare/po/zh-cn/ushare.po b/feeds/luci/applications/luci-app-ushare/po/zh-cn/ushare.po +new file mode 100644 +index 0000000..f426526 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-ushare/po/zh-cn/ushare.po +@@ -0,0 +1,52 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Report-Msgid-Bugs-To: \n" ++"POT-Creation-Date: 2009-05-19 19:36+0200\n" ++"PO-Revision-Date: 2012-09-18 16:26+0200\n" ++"Last-Translator: nKsyn \n" ++"Language-Team: QQ Group 75543259\n" ++"Language: zh_CN\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=1; plural=0;\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "Content directories" ++msgstr "目录" ++ ++msgid "Disable telnet console" ++msgstr "关闭telnet管ç†" ++ ++msgid "Disable webinterface" ++msgstr "关闭界é¢ç®¡ç†" ++ ++msgid "Enable" ++msgstr "å¯ç”¨" ++ ++msgid "Interface" ++msgstr "网络接å£" ++ ++msgid "Options" ++msgstr "选项" ++ ++msgid "Servername" ++msgstr "æœåŠ¡å™¨å" ++ ++msgid "Settings" ++msgstr "设置" ++ ++msgid "Username" ++msgstr "用户å" ++ ++msgid "uShare" ++msgstr "UPNPæµåª’体æœåŠ¡" ++ ++msgid "" ++"uShare is a UPnP (TM) A/V & DLNA Media Server. It implements the server " ++"component that provides UPnP media devices with information on available " ++"multimedia files." ++msgstr "" ++"uShare是一个UPnP(TM) A/Vå’ŒDLNA媒体æœåŠ¡å™¨ã€‚å¯ä»¥å°†å¤šåª’体文件共享到支æŒUPnP的设" ++"备上。" +diff --git a/feeds/luci/applications/luci-app-ushare/po/zh-tw/ushare.po b/feeds/luci/applications/luci-app-ushare/po/zh-tw/ushare.po +new file mode 100644 +index 0000000..eba6677 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-ushare/po/zh-tw/ushare.po +@@ -0,0 +1,48 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"PO-Revision-Date: 2013-08-10 12:32+0200\n" ++"Last-Translator: mp607 \n" ++"Language-Team: none\n" ++"Language: zh_TW\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=1; plural=0;\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "Content directories" ++msgstr "目錄" ++ ++msgid "Disable telnet console" ++msgstr "關閉telnet管ç†" ++ ++msgid "Disable webinterface" ++msgstr "關閉網路介é¢ç®¡ç†" ++ ++msgid "Enable" ++msgstr "啟用" ++ ++msgid "Interface" ++msgstr "網路介é¢" ++ ++msgid "Options" ++msgstr "é¸é …" ++ ++msgid "Servername" ++msgstr "伺æœå™¨å稱" ++ ++msgid "Settings" ++msgstr "設定" ++ ++msgid "Username" ++msgstr "使用者å稱" ++ ++msgid "uShare" ++msgstr "UPnP多媒體æœå‹™" ++ ++msgid "" ++"uShare is a UPnP (TM) A/V & DLNA Media Server. It implements the server " ++"component that provides UPnP media devices with information on available " ++"multimedia files." ++msgstr "uShare是一個UPnP (TM) A/V & DLNA多媒體伺æœå™¨ã€‚å¯ä»¥å°‡å¤šåª’體檔案共用分享到支æ´UPnPçš„è£ç½®ä¸Š" +diff --git a/feeds/luci/applications/luci-app-ushare/root/etc/uci-defaults/luci-ushare b/feeds/luci/applications/luci-app-ushare/root/etc/uci-defaults/luci-ushare +new file mode 100755 +index 0000000..8bcb6e4 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-ushare/root/etc/uci-defaults/luci-ushare +@@ -0,0 +1,11 @@ ++#!/bin/sh ++ ++uci -q batch <<-EOF >/dev/null ++ delete ucitrack.@ushare[-1] ++ add ucitrack ushare ++ set ucitrack.@ushare[-1].init=ushare ++ commit ucitrack ++EOF ++ ++rm -f /tmp/luci-indexcache ++exit 0 +diff --git a/feeds/luci/applications/luci-app-vnstat/Makefile b/feeds/luci/applications/luci-app-vnstat/Makefile +new file mode 100644 +index 0000000..6d98610 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-vnstat/Makefile +@@ -0,0 +1,14 @@ ++# ++# Copyright (C) 2008-2014 The LuCI Team ++# ++# This is free software, licensed under the Apache License, Version 2.0 . ++# ++ ++include $(TOPDIR)/rules.mk ++ ++LUCI_TITLE:=LuCI Support for VnStat ++LUCI_DEPENDS:=+vnstat +vnstati ++ ++include ../../luci.mk ++ ++# call BuildPackage - OpenWrt buildroot signature +diff --git a/feeds/luci/applications/luci-app-vnstat/luasrc/controller/vnstat.lua b/feeds/luci/applications/luci-app-vnstat/luasrc/controller/vnstat.lua +new file mode 100644 +index 0000000..3871fa2 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-vnstat/luasrc/controller/vnstat.lua +@@ -0,0 +1,11 @@ ++module("luci.controller.vnstat", package.seeall) ++ ++function index() ++ entry({"admin", "status", "vnstat"}, alias("admin", "status", "vnstat", "graphs"), _("VnStat Traffic Monitor"), 90) ++ entry({"admin", "status", "vnstat", "graphs"}, template("vnstat"), _("Graphs"), 1) ++ entry({"admin", "status", "vnstat", "config"}, cbi("vnstat"), _("Configuration"), 2) ++ ++ entry({"mini", "network", "vnstat"}, alias("mini", "network", "vnstat", "graphs"), _("VnStat Traffic Monitor"), 90) ++ entry({"mini", "network", "vnstat", "graphs"}, template("vnstat"), _("Graphs"), 1) ++ entry({"mini", "network", "vnstat", "config"}, cbi("vnstat"), _("Configuration"), 2) ++end +diff --git a/feeds/luci/applications/luci-app-vnstat/luasrc/model/cbi/vnstat.lua b/feeds/luci/applications/luci-app-vnstat/luasrc/model/cbi/vnstat.lua +new file mode 100644 +index 0000000..c60c649 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-vnstat/luasrc/model/cbi/vnstat.lua +@@ -0,0 +1,82 @@ ++-- Copyright 2010-2011 Jo-Philipp Wich ++-- Licensed to the public under the Apache License 2.0. ++ ++local utl = require "luci.util" ++local sys = require "luci.sys" ++local fs = require "nixio.fs" ++local nw = require "luci.model.network" ++ ++local dbdir, line ++ ++for line in io.lines("/etc/vnstat.conf") do ++ dbdir = line:match("^%s*DatabaseDir%s+[\"'](%S-)[\"']") ++ if dbdir then break end ++end ++ ++dbdir = dbdir or "/var/lib/vnstat" ++ ++ ++m = Map("vnstat", translate("VnStat"), ++ translate("VnStat is a network traffic monitor for Linux that keeps a log of network traffic for the selected interface(s).")) ++ ++m.submit = translate("Restart VnStat") ++m.reset = false ++ ++nw.init(luci.model.uci.cursor_state()) ++ ++local ifaces = { } ++local enabled = { } ++local iface ++ ++if fs.access(dbdir) then ++ for iface in fs.dir(dbdir) do ++ if iface:sub(1,1) ~= '.' then ++ ifaces[iface] = iface ++ enabled[iface] = iface ++ end ++ end ++end ++ ++for _, iface in ipairs(sys.net.devices()) do ++ ifaces[iface] = iface ++end ++ ++ ++local s = m:section(TypedSection, "vnstat") ++s.anonymous = true ++s.addremove = false ++ ++mon_ifaces = s:option(Value, "interface", translate("Monitor selected interfaces")) ++mon_ifaces.template = "cbi/network_ifacelist" ++mon_ifaces.widget = "checkbox" ++mon_ifaces.cast = "table" ++mon_ifaces.noinactive = true ++mon_ifaces.nocreate = true ++ ++function mon_ifaces.write(self, section, val) ++ local i ++ local s = { } ++ ++ if val then ++ for _, i in ipairs(type(val) == "table" and val or { val }) do ++ s[i] = true ++ end ++ end ++ ++ for i, _ in pairs(ifaces) do ++ if not s[i] then ++ fs.unlink(dbdir .. "/" .. i) ++ fs.unlink(dbdir .. "/." .. i) ++ end ++ end ++ ++ if next(s) then ++ m.uci:set_list("vnstat", section, "interface", utl.keys(s)) ++ else ++ m.uci:delete("vnstat", section, "interface") ++ end ++end ++ ++mon_ifaces.remove = mon_ifaces.write ++ ++return m +diff --git a/feeds/luci/applications/luci-app-vnstat/luasrc/view/vnstat.htm b/feeds/luci/applications/luci-app-vnstat/luasrc/view/vnstat.htm +new file mode 100644 +index 0000000..2b50255 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-vnstat/luasrc/view/vnstat.htm +@@ -0,0 +1,101 @@ ++<%# ++ Copyright 2010 Jo-Philipp Wich ++ Licensed to the public under the Apache License 2.0. ++-%> ++ ++<%- ++ ++local fs = require "nixio.fs" ++local sys = require "luci.sys" ++local utl = require "luci.util" ++ ++local param = luci.http.formvalue ++ ++local iface = param("iface") ++local style = param("style") ++ ++style = (style and #style > 0) and style or "s" ++ ++ ++-- ++-- render image ++-- ++if iface then ++ style = style:gsub("[^%w]", "") ++ iface = iface:gsub("[^%w%.%-%_]", "") ++ ++ luci.http.prepare_content("image/png") ++ ++ local png = io.popen("vnstati -i '%s' '-%s' -o -" % { iface, style }) ++ luci.http.write(png:read("*a")) ++ png:close() ++ ++ return ++ ++-- ++-- update database ++-- ++else ++ sys.call("vnstat -u >/dev/null 2>/dev/null") ++end ++ ++ ++-- ++-- find databases ++-- ++local dbdir, line ++ ++for line in io.lines("/etc/vnstat.conf") do ++ dbdir = line:match("^%s*DatabaseDir%s+[\"'](%S-)[\"']") ++ if dbdir then break end ++end ++ ++dbdir = dbdir or "/var/lib/vnstat" ++ ++-%> ++ ++<%+header%> ++ ++

    <%:VnStat Graphs%>

    ++ ++
    ++ ++ ++ ++ ++ ++
    ++ ++


    ++ ++
    ++<% ++ empty = true ++ ifdir = fs.dir(dbdir) ++ ++ if ifdir then ++ for iface in ifdir do ++ if iface:sub(1,1) ~= "." then ++ empty = false ++%> ++ ++

    ++<% ++ end ++ end ++ end ++%> ++ ++<% if empty then %> ++

    <%:No database has been set up yet. Go to the VnStat configuration and enable monitoring for one or more interfaces.%>

    ++<% end %> ++ ++
    ++ ++<%+footer%> +diff --git a/feeds/luci/applications/luci-app-vnstat/po/ca/vnstat.po b/feeds/luci/applications/luci-app-vnstat/po/ca/vnstat.po +new file mode 100644 +index 0000000..536228e +--- /dev/null ++++ b/feeds/luci/applications/luci-app-vnstat/po/ca/vnstat.po +@@ -0,0 +1,65 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"PO-Revision-Date: 2014-06-09 07:13+0200\n" ++"Last-Translator: Alex \n" ++"Language-Team: German\n" ++"Language: ca\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n != 1);\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "Configuration" ++msgstr "Configuració" ++ ++msgid "Daily traffic" ++msgstr "Trànsit diari" ++ ++msgid "Graphs" ++msgstr "Gràfics" ++ ++msgid "Hourly traffic" ++msgstr "Trànsit per hora" ++ ++msgid "Monitor selected interfaces" ++msgstr "Vigila les interfícies seleccionades" ++ ++msgid "Monthly traffic" ++msgstr "Trànsit mensual" ++ ++msgid "" ++"No database has been set up yet. Go to the VnStat configuration and enable " ++"monitoring for one or more interfaces." ++msgstr "" ++"Encara no s'ha configurat cap base de dades. Aneu a la configuració del " ++"VnStat i habilita la vigila de una o més interfícies." ++ ++msgid "Restart VnStat" ++msgstr "Reinicia el VnStat" ++ ++msgid "Summary display" ++msgstr "Mostra de resum" ++ ++msgid "Top 10 display" ++msgstr "Mostra dels 10 principals" ++ ++msgid "Update »" ++msgstr "Actualitza »" ++ ++msgid "VnStat" ++msgstr "VnStat" ++ ++msgid "VnStat Graphs" ++msgstr "Gràfics de VnStat" ++ ++msgid "VnStat Traffic Monitor" ++msgstr "Monitor de trànsit VnStat" ++ ++msgid "" ++"VnStat is a network traffic monitor for Linux that keeps a log of network " ++"traffic for the selected interface(s)." ++msgstr "" ++"El VnStat és un monitor de trànsit de xarxa pel Linux que manté un registre " ++"del trànsit de xarxa de les interfícies seleccionades." +diff --git a/feeds/luci/applications/luci-app-vnstat/po/cs/vnstat.po b/feeds/luci/applications/luci-app-vnstat/po/cs/vnstat.po +new file mode 100644 +index 0000000..4818374 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-vnstat/po/cs/vnstat.po +@@ -0,0 +1,64 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Last-Translator: Automatically generated\n" ++"Language-Team: none\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++ ++msgid "Configuration" ++msgstr "Konfigurace" ++ ++msgid "Daily traffic" ++msgstr "Denní pÅ™enos" ++ ++msgid "Graphs" ++msgstr "Grafy" ++ ++msgid "Hourly traffic" ++msgstr "Hodinový pÅ™enos" ++ ++msgid "Monitor selected interfaces" ++msgstr "Sledovat vybraná zařízení" ++ ++msgid "Monthly traffic" ++msgstr "MÄ›síÄní pÅ™enos" ++ ++msgid "" ++"No database has been set up yet. Go to the VnStat configuration and enable " ++"monitoring for one or more interfaces." ++msgstr "" ++"Zatím nebyla nastavena žádná databáze. PÅ™ejdÄ›te na konfiguraci VnStatu a " ++"povolnet sledování jednoho nebo více zařízení." ++ ++msgid "Restart VnStat" ++msgstr "Restartovat VnStat" ++ ++msgid "Summary display" ++msgstr "Souhrn" ++ ++msgid "Top 10 display" ++msgstr "Top 10" ++ ++msgid "Update »" ++msgstr "Aktualizovat »" ++ ++msgid "VnStat" ++msgstr "VnStat" ++ ++msgid "VnStat Graphs" ++msgstr "Grafy VnStat" ++ ++msgid "VnStat Traffic Monitor" ++msgstr "Sledování pÅ™enosu VnStat" ++ ++msgid "" ++"VnStat is a network traffic monitor for Linux that keeps a log of network " ++"traffic for the selected interface(s)." ++msgstr "" ++"VnStat je nástroj pro sledování pÅ™enosů dat pro Linux, který ukládá " ++"informace o síťovém provozu na vybraných zařízeních." ++ ++#~ msgid "The VnStat service has been restarted." ++#~ msgstr "Služba VnStat byla restartována" +diff --git a/feeds/luci/applications/luci-app-vnstat/po/de/vnstat.po b/feeds/luci/applications/luci-app-vnstat/po/de/vnstat.po +new file mode 100644 +index 0000000..aab7494 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-vnstat/po/de/vnstat.po +@@ -0,0 +1,68 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"POT-Creation-Date: \n" ++"PO-Revision-Date: 2010-11-16 21:06+0100\n" ++"Last-Translator: Jo-Philipp Wich \n" ++"Language-Team: German\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n != 1);\n" ++ ++msgid "Configuration" ++msgstr "Konfiguration" ++ ++msgid "Daily traffic" ++msgstr "Täglicher Verkehr" ++ ++msgid "Graphs" ++msgstr "Diagramme" ++ ++msgid "Hourly traffic" ++msgstr "Stündlicher Verkehr" ++ ++msgid "Monitor selected interfaces" ++msgstr "Ãœberwachte Schnittstellen" ++ ++msgid "Monthly traffic" ++msgstr "Monatlicher Verkehr" ++ ++msgid "" ++"No database has been set up yet. Go to the VnStat configuration and enable " ++"monitoring for one or more interfaces." ++msgstr "" ++"Es ist noch keine Datenbank eingerichtet. Navigieren Sie zur VnStat " ++"Konfiguration und aktivieren Sie die Ãœberwachung einer oder mehrerer " ++"Schnittstellen." ++ ++msgid "Restart VnStat" ++msgstr "VnStat neu starten" ++ ++msgid "Summary display" ++msgstr "Ãœbersicht" ++ ++msgid "Top 10 display" ++msgstr "Top 10 Anzeige" ++ ++msgid "Update »" ++msgstr "Aktualisieren »" ++ ++msgid "VnStat" ++msgstr "VnStat" ++ ++msgid "VnStat Graphs" ++msgstr "VnStat Diagramme" ++ ++msgid "VnStat Traffic Monitor" ++msgstr "VnStat Trafficüberwachung" ++ ++msgid "" ++"VnStat is a network traffic monitor for Linux that keeps a log of network " ++"traffic for the selected interface(s)." ++msgstr "" ++"VnStat ist ein Ãœberwachungsprogramm für Netwerkverkehr unter Linux. Das " ++"Programm protokolliert das Verkehrsvolumen auf ausgewählten Schnittstellen." ++ ++#~ msgid "The VnStat service has been restarted." ++#~ msgstr "Der VnStat Dienst wurde neu gestartet." +diff --git a/feeds/luci/applications/luci-app-vnstat/po/el/vnstat.po b/feeds/luci/applications/luci-app-vnstat/po/el/vnstat.po +new file mode 100644 +index 0000000..04590ea +--- /dev/null ++++ b/feeds/luci/applications/luci-app-vnstat/po/el/vnstat.po +@@ -0,0 +1,59 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"PO-Revision-Date: 2010-11-16 20:54+0100\n" ++"Last-Translator: \n" ++"Language-Team: German\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n != 1);\n" ++ ++msgid "Configuration" ++msgstr "" ++ ++msgid "Daily traffic" ++msgstr "" ++ ++msgid "Graphs" ++msgstr "" ++ ++msgid "Hourly traffic" ++msgstr "" ++ ++msgid "Monitor selected interfaces" ++msgstr "" ++ ++msgid "Monthly traffic" ++msgstr "" ++ ++msgid "" ++"No database has been set up yet. Go to the VnStat configuration and enable " ++"monitoring for one or more interfaces." ++msgstr "" ++ ++msgid "Restart VnStat" ++msgstr "" ++ ++msgid "Summary display" ++msgstr "" ++ ++msgid "Top 10 display" ++msgstr "" ++ ++msgid "Update »" ++msgstr "" ++ ++msgid "VnStat" ++msgstr "" ++ ++msgid "VnStat Graphs" ++msgstr "" ++ ++msgid "VnStat Traffic Monitor" ++msgstr "" ++ ++msgid "" ++"VnStat is a network traffic monitor for Linux that keeps a log of network " ++"traffic for the selected interface(s)." ++msgstr "" +diff --git a/feeds/luci/applications/luci-app-vnstat/po/en/vnstat.po b/feeds/luci/applications/luci-app-vnstat/po/en/vnstat.po +new file mode 100644 +index 0000000..04590ea +--- /dev/null ++++ b/feeds/luci/applications/luci-app-vnstat/po/en/vnstat.po +@@ -0,0 +1,59 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"PO-Revision-Date: 2010-11-16 20:54+0100\n" ++"Last-Translator: \n" ++"Language-Team: German\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n != 1);\n" ++ ++msgid "Configuration" ++msgstr "" ++ ++msgid "Daily traffic" ++msgstr "" ++ ++msgid "Graphs" ++msgstr "" ++ ++msgid "Hourly traffic" ++msgstr "" ++ ++msgid "Monitor selected interfaces" ++msgstr "" ++ ++msgid "Monthly traffic" ++msgstr "" ++ ++msgid "" ++"No database has been set up yet. Go to the VnStat configuration and enable " ++"monitoring for one or more interfaces." ++msgstr "" ++ ++msgid "Restart VnStat" ++msgstr "" ++ ++msgid "Summary display" ++msgstr "" ++ ++msgid "Top 10 display" ++msgstr "" ++ ++msgid "Update »" ++msgstr "" ++ ++msgid "VnStat" ++msgstr "" ++ ++msgid "VnStat Graphs" ++msgstr "" ++ ++msgid "VnStat Traffic Monitor" ++msgstr "" ++ ++msgid "" ++"VnStat is a network traffic monitor for Linux that keeps a log of network " ++"traffic for the selected interface(s)." ++msgstr "" +diff --git a/feeds/luci/applications/luci-app-vnstat/po/es/vnstat.po b/feeds/luci/applications/luci-app-vnstat/po/es/vnstat.po +new file mode 100644 +index 0000000..b91e1bb +--- /dev/null ++++ b/feeds/luci/applications/luci-app-vnstat/po/es/vnstat.po +@@ -0,0 +1,68 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"PO-Revision-Date: 2012-10-07 15:08+0200\n" ++"Last-Translator: José Vicente \n" ++"Language-Team: German\n" ++"Language: es\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n != 1);\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "Configuration" ++msgstr "Configuración" ++ ++msgid "Daily traffic" ++msgstr "Tráfico diario" ++ ++msgid "Graphs" ++msgstr "Gráficas" ++ ++msgid "Hourly traffic" ++msgstr "Tráfico por horas" ++ ++msgid "Monitor selected interfaces" ++msgstr "Monitorizar las interfaces seleccionadas" ++ ++msgid "Monthly traffic" ++msgstr "Tráfico mensual" ++ ++msgid "" ++"No database has been set up yet. Go to the VnStat configuration and enable " ++"monitoring for one or more interfaces." ++msgstr "" ++"Todavía no se ha configurado ninguna base de datos. Vaya a la configuración " ++"de VnStat y habilite la monitorización para una o más interfaces." ++ ++msgid "Restart VnStat" ++msgstr "Rearrancar VnStat" ++ ++msgid "Summary display" ++msgstr "Mostrar Resumen" ++ ++msgid "Top 10 display" ++msgstr "Mostrar Top 10" ++ ++msgid "Update »" ++msgstr "Actualizar »" ++ ++msgid "VnStat" ++msgstr "VnStat" ++ ++msgid "VnStat Graphs" ++msgstr "Graficas de VnStat" ++ ++msgid "VnStat Traffic Monitor" ++msgstr "Monitor de trafico de VnStat" ++ ++msgid "" ++"VnStat is a network traffic monitor for Linux that keeps a log of network " ++"traffic for the selected interface(s)." ++msgstr "" ++"VnStat es un monitor de tráfico de red para Linux que mantiene un registro " ++"del trafico de red de la interfaz o interfaces seleccionadas." ++ ++#~ msgid "The VnStat service has been restarted." ++#~ msgstr "El servicio VnStat ha sido reiniciado" +diff --git a/feeds/luci/applications/luci-app-vnstat/po/fr/vnstat.po b/feeds/luci/applications/luci-app-vnstat/po/fr/vnstat.po +new file mode 100644 +index 0000000..23b644a +--- /dev/null ++++ b/feeds/luci/applications/luci-app-vnstat/po/fr/vnstat.po +@@ -0,0 +1,68 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"PO-Revision-Date: 2011-11-23 22:33+0200\n" ++"Last-Translator: fredb \n" ++"Language-Team: German\n" ++"Language: fr\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n > 1);\n" ++"X-Generator: Pootle 2.0.4\n" ++ ++msgid "Configuration" ++msgstr "Configuration" ++ ++msgid "Daily traffic" ++msgstr "Trafic quotidien" ++ ++msgid "Graphs" ++msgstr "Graphes" ++ ++msgid "Hourly traffic" ++msgstr "Trafic horaire" ++ ++msgid "Monitor selected interfaces" ++msgstr "Surveiller les interfaces sélectionnées" ++ ++msgid "Monthly traffic" ++msgstr "Trafic mensuel" ++ ++msgid "" ++"No database has been set up yet. Go to the VnStat configuration and enable " ++"monitoring for one or more interfaces." ++msgstr "" ++"Aucun enregistrement n'a encore été configuré. Allez dans la configuration " ++"de VnStat et activez la surveillance d'une ou plusieurs interface(s)." ++ ++msgid "Restart VnStat" ++msgstr "Redémarrer VnStat" ++ ++msgid "Summary display" ++msgstr "Résumé" ++ ++msgid "Top 10 display" ++msgstr "Top 10" ++ ++msgid "Update »" ++msgstr "Mise à jour »" ++ ++msgid "VnStat" ++msgstr "VnStat" ++ ++msgid "VnStat Graphs" ++msgstr "Graphiques VnStat" ++ ++msgid "VnStat Traffic Monitor" ++msgstr "Surveillance du trafic VnStat" ++ ++msgid "" ++"VnStat is a network traffic monitor for Linux that keeps a log of network " ++"traffic for the selected interface(s)." ++msgstr "" ++"VnStat est un outil de surveillance du réseau pour Linux qui garde un " ++"journal du trafic du ou des interface(s) sélectionnée(s)." ++ ++#~ msgid "The VnStat service has been restarted." ++#~ msgstr "Le service VnStat a été redémarré." +diff --git a/feeds/luci/applications/luci-app-vnstat/po/he/vnstat.po b/feeds/luci/applications/luci-app-vnstat/po/he/vnstat.po +new file mode 100644 +index 0000000..f0ef3a7 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-vnstat/po/he/vnstat.po +@@ -0,0 +1,58 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Last-Translator: Automatically generated\n" ++"Language-Team: none\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n != 1);\n" ++ ++msgid "Configuration" ++msgstr "" ++ ++msgid "Daily traffic" ++msgstr "" ++ ++msgid "Graphs" ++msgstr "" ++ ++msgid "Hourly traffic" ++msgstr "" ++ ++msgid "Monitor selected interfaces" ++msgstr "" ++ ++msgid "Monthly traffic" ++msgstr "" ++ ++msgid "" ++"No database has been set up yet. Go to the VnStat configuration and enable " ++"monitoring for one or more interfaces." ++msgstr "" ++ ++msgid "Restart VnStat" ++msgstr "" ++ ++msgid "Summary display" ++msgstr "" ++ ++msgid "Top 10 display" ++msgstr "" ++ ++msgid "Update »" ++msgstr "" ++ ++msgid "VnStat" ++msgstr "" ++ ++msgid "VnStat Graphs" ++msgstr "" ++ ++msgid "VnStat Traffic Monitor" ++msgstr "" ++ ++msgid "" ++"VnStat is a network traffic monitor for Linux that keeps a log of network " ++"traffic for the selected interface(s)." ++msgstr "" +diff --git a/feeds/luci/applications/luci-app-vnstat/po/hu/vnstat.po b/feeds/luci/applications/luci-app-vnstat/po/hu/vnstat.po +new file mode 100644 +index 0000000..b198c5d +--- /dev/null ++++ b/feeds/luci/applications/luci-app-vnstat/po/hu/vnstat.po +@@ -0,0 +1,65 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Last-Translator: Automatically generated\n" ++"Language-Team: none\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n != 1);\n" ++ ++msgid "Configuration" ++msgstr "Beállítások" ++ ++msgid "Daily traffic" ++msgstr "Napi forgalom" ++ ++msgid "Graphs" ++msgstr "Grafikonok" ++ ++msgid "Hourly traffic" ++msgstr "Óránkénti forgalom" ++ ++msgid "Monitor selected interfaces" ++msgstr "Kiválasztott interfészek figyelése" ++ ++msgid "Monthly traffic" ++msgstr "Havi forgalom" ++ ++msgid "" ++"No database has been set up yet. Go to the VnStat configuration and enable " ++"monitoring for one or more interfaces." ++msgstr "" ++"Adatbázis még nem lett beállítva. Engedélyezze egy vagy több interfész " ++"figyelését a VnStat beállításoknál." ++ ++msgid "Restart VnStat" ++msgstr "VnStat újraíndítása" ++ ++msgid "Summary display" ++msgstr "Összefoglaló nézet" ++ ++msgid "Top 10 display" ++msgstr "Top 10 nézet" ++ ++msgid "Update »" ++msgstr "Frissítés »" ++ ++msgid "VnStat" ++msgstr "VnStat" ++ ++msgid "VnStat Graphs" ++msgstr "VnStat grafikonok" ++ ++msgid "VnStat Traffic Monitor" ++msgstr "VnStat Forgalom FigyelÅ‘" ++ ++msgid "" ++"VnStat is a network traffic monitor for Linux that keeps a log of network " ++"traffic for the selected interface(s)." ++msgstr "" ++"VnStat egy hálózati forgalom figyelÅ‘ alkalmazás Linux alá ami naplózza a " ++"kiválasztott interfész(ek) hálózati forgalmát." ++ ++#~ msgid "The VnStat service has been restarted." ++#~ msgstr "A VnStat szolgáltatás újra lett índítva." +diff --git a/feeds/luci/applications/luci-app-vnstat/po/it/vnstat.po b/feeds/luci/applications/luci-app-vnstat/po/it/vnstat.po +new file mode 100644 +index 0000000..8cc6e5b +--- /dev/null ++++ b/feeds/luci/applications/luci-app-vnstat/po/it/vnstat.po +@@ -0,0 +1,68 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"PO-Revision-Date: 2011-05-17 22:00+0200\n" ++"Last-Translator: coatto87 \n" ++"Language-Team: German\n" ++"Language: it\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n != 1);\n" ++"X-Generator: Pootle 2.0.4\n" ++ ++msgid "Configuration" ++msgstr "Configurazione" ++ ++msgid "Daily traffic" ++msgstr "Traffico giornaliero" ++ ++msgid "Graphs" ++msgstr "Grafici" ++ ++msgid "Hourly traffic" ++msgstr "Traffico orario" ++ ++msgid "Monitor selected interfaces" ++msgstr "Monitora le interfacce selezionate" ++ ++msgid "Monthly traffic" ++msgstr "Traffico mensile" ++ ++msgid "" ++"No database has been set up yet. Go to the VnStat configuration and enable " ++"monitoring for one or more interfaces." ++msgstr "" ++"Non è ancora stato configurato un database. Vai nella configurazione di " ++"VnStat e abilita il monitoraggio per una o più interfacce." ++ ++msgid "Restart VnStat" ++msgstr "Riavvia VnStat" ++ ++msgid "Summary display" ++msgstr "Riassunto" ++ ++msgid "Top 10 display" ++msgstr "Top 10 display" ++ ++msgid "Update »" ++msgstr "Aggiorna" ++ ++msgid "VnStat" ++msgstr "VnStat" ++ ++msgid "VnStat Graphs" ++msgstr "Grafici VnStat" ++ ++msgid "VnStat Traffic Monitor" ++msgstr "Monitor del traffico VnStat" ++ ++msgid "" ++"VnStat is a network traffic monitor for Linux that keeps a log of network " ++"traffic for the selected interface(s)." ++msgstr "" ++"VnStat è un monitor del traffico di rete per Linux che scrive un log per le " ++"interfacce selezionate." ++ ++#~ msgid "The VnStat service has been restarted." ++#~ msgstr "Il servizio VnStat è stato riavviato." +diff --git a/feeds/luci/applications/luci-app-vnstat/po/ja/vnstat.po b/feeds/luci/applications/luci-app-vnstat/po/ja/vnstat.po +new file mode 100644 +index 0000000..8708c6f +--- /dev/null ++++ b/feeds/luci/applications/luci-app-vnstat/po/ja/vnstat.po +@@ -0,0 +1,68 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"PO-Revision-Date: 2011-08-19 06:15+0200\n" ++"Last-Translator: Kentaro \n" ++"Language-Team: German\n" ++"Language: ja\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=1; plural=0;\n" ++"X-Generator: Pootle 2.0.4\n" ++ ++msgid "Configuration" ++msgstr "設定" ++ ++msgid "Daily traffic" ++msgstr "1日周期ã®ãƒˆãƒ©ãƒ•ã‚£ãƒƒã‚¯" ++ ++msgid "Graphs" ++msgstr "グラフ" ++ ++msgid "Hourly traffic" ++msgstr "1時間周期ã®ãƒˆãƒ©ãƒ•ã‚£ãƒƒã‚¯" ++ ++msgid "Monitor selected interfaces" ++msgstr "モニターã™ã‚‹ã‚¤ãƒ³ã‚¿ãƒ¼ãƒ•ã‚§ãƒ¼ã‚¹ã‚’é¸æŠž" ++ ++msgid "Monthly traffic" ++msgstr "1月周期ã®ãƒˆãƒ©ãƒ•ã‚£ãƒƒã‚¯" ++ ++msgid "" ++"No database has been set up yet. Go to the VnStat configuration and enable " ++"monitoring for one or more interfaces." ++msgstr "" ++"データベースãŒè¨­å®šã•ã‚Œã¦ã„ã¾ã›ã‚“。VnStat設定ページã¸ç§»å‹•ã—ã€ï¼‘ã¤ä»¥ä¸Šã®ã‚¤ãƒ³" ++"ターフェースã®ãƒ¢ãƒ‹ã‚¿ãƒªãƒ³ã‚°ã‚’有効ã«ã—ã¦ãã ã•ã„。" ++ ++msgid "Restart VnStat" ++msgstr "VnStatã‚’å†èµ·å‹•" ++ ++msgid "Summary display" ++msgstr "サマリーを表示" ++ ++msgid "Top 10 display" ++msgstr "トップ10を表示" ++ ++msgid "Update »" ++msgstr "æ›´æ–° »" ++ ++msgid "VnStat" ++msgstr "VnStat" ++ ++msgid "VnStat Graphs" ++msgstr "VnStat グラフ" ++ ++msgid "VnStat Traffic Monitor" ++msgstr "VnStatトラフィックモニタ" ++ ++msgid "" ++"VnStat is a network traffic monitor for Linux that keeps a log of network " ++"traffic for the selected interface(s)." ++msgstr "" ++"VnStatã¯é¸æŠžã—ãŸã‚¤ãƒ³ã‚¿ãƒ•ã‚§ãƒ¼ã‚¹ã®ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ãƒˆãƒ©ãƒ•ã‚£ãƒƒã‚¯ã‚’ロギングã™ã‚‹Linuxã®" ++"トラフィックモニターã§ã™ã€‚" ++ ++#~ msgid "The VnStat service has been restarted." ++#~ msgstr "VnStatサービスã¯å†èµ·å‹•ã—ã¾ã—ãŸã€‚" +diff --git a/feeds/luci/applications/luci-app-vnstat/po/ms/vnstat.po b/feeds/luci/applications/luci-app-vnstat/po/ms/vnstat.po +new file mode 100644 +index 0000000..04590ea +--- /dev/null ++++ b/feeds/luci/applications/luci-app-vnstat/po/ms/vnstat.po +@@ -0,0 +1,59 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"PO-Revision-Date: 2010-11-16 20:54+0100\n" ++"Last-Translator: \n" ++"Language-Team: German\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n != 1);\n" ++ ++msgid "Configuration" ++msgstr "" ++ ++msgid "Daily traffic" ++msgstr "" ++ ++msgid "Graphs" ++msgstr "" ++ ++msgid "Hourly traffic" ++msgstr "" ++ ++msgid "Monitor selected interfaces" ++msgstr "" ++ ++msgid "Monthly traffic" ++msgstr "" ++ ++msgid "" ++"No database has been set up yet. Go to the VnStat configuration and enable " ++"monitoring for one or more interfaces." ++msgstr "" ++ ++msgid "Restart VnStat" ++msgstr "" ++ ++msgid "Summary display" ++msgstr "" ++ ++msgid "Top 10 display" ++msgstr "" ++ ++msgid "Update »" ++msgstr "" ++ ++msgid "VnStat" ++msgstr "" ++ ++msgid "VnStat Graphs" ++msgstr "" ++ ++msgid "VnStat Traffic Monitor" ++msgstr "" ++ ++msgid "" ++"VnStat is a network traffic monitor for Linux that keeps a log of network " ++"traffic for the selected interface(s)." ++msgstr "" +diff --git a/feeds/luci/applications/luci-app-vnstat/po/no/vnstat.po b/feeds/luci/applications/luci-app-vnstat/po/no/vnstat.po +new file mode 100644 +index 0000000..c1e94d2 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-vnstat/po/no/vnstat.po +@@ -0,0 +1,58 @@ ++msgid "" ++msgstr "" ++"Last-Translator: Lars Hardy \n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++ ++msgid "Configuration" ++msgstr "Konfigurasjon" ++ ++msgid "Daily traffic" ++msgstr "Trafikk hver dag" ++ ++msgid "Graphs" ++msgstr "Grafer" ++ ++msgid "Hourly traffic" ++msgstr "Trafikk hver time" ++ ++msgid "Monitor selected interfaces" ++msgstr "OvervÃ¥k valgte grensesnitt" ++ ++msgid "Monthly traffic" ++msgstr "Trafikk hver mÃ¥ned" ++ ++msgid "" ++"No database has been set up yet. Go to the VnStat configuration and enable " ++"monitoring for one or more interfaces." ++msgstr "" ++"Ingen database har blitt satt opp ennÃ¥. GÃ¥ til VnStat konfigurasjonen og " ++"aktiver overvÃ¥king for ett eller flere grensesnitt." ++ ++msgid "Restart VnStat" ++msgstr "Omstart VnStat" ++ ++msgid "Summary display" ++msgstr "Visning av sammendrag" ++ ++msgid "Top 10 display" ++msgstr "Top 10 visning" ++ ++msgid "Update »" ++msgstr "Oppdater »" ++ ++msgid "VnStat" ++msgstr "VnStat" ++ ++msgid "VnStat Graphs" ++msgstr "VnStat Grafer" ++ ++msgid "VnStat Traffic Monitor" ++msgstr "VnStat Trafikk Monitor" ++ ++msgid "" ++"VnStat is a network traffic monitor for Linux that keeps a log of network " ++"traffic for the selected interface(s)." ++msgstr "" ++"VnStat er en nettverks trafikk monitor for Linux som loggfører " ++"nettverks trafikk for de valgte grensesnitt." +diff --git a/feeds/luci/applications/luci-app-vnstat/po/pl/vnstat.po b/feeds/luci/applications/luci-app-vnstat/po/pl/vnstat.po +new file mode 100644 +index 0000000..5b0d8b0 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-vnstat/po/pl/vnstat.po +@@ -0,0 +1,69 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"PO-Revision-Date: 2011-09-20 12:21+0200\n" ++"Last-Translator: MichaÅ‚ \n" ++"Language-Team: German\n" ++"Language: pl\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 " ++"|| n%100>=20) ? 1 : 2);\n" ++"X-Generator: Pootle 2.0.4\n" ++ ++msgid "Configuration" ++msgstr "Konfiguracja" ++ ++msgid "Daily traffic" ++msgstr "Obciążenie dzienne" ++ ++msgid "Graphs" ++msgstr "Wykresy" ++ ++msgid "Hourly traffic" ++msgstr "Obciążenie godzinowe" ++ ++msgid "Monitor selected interfaces" ++msgstr "Monitoruj wybrane interfejsy" ++ ++msgid "Monthly traffic" ++msgstr "Obciążenie miesiÄ™czne" ++ ++msgid "" ++"No database has been set up yet. Go to the VnStat configuration and enable " ++"monitoring for one or more interfaces." ++msgstr "" ++"Nie ustawiono żadnej bazy danych. Idź do konfiguracji VnStat i wÅ‚Ä…cz " ++"monitorowanie dla jednego lub wiÄ™cej interfejsów." ++ ++msgid "Restart VnStat" ++msgstr "Restartuj VnStat" ++ ++msgid "Summary display" ++msgstr "Podsumowanie" ++ ++msgid "Top 10 display" ++msgstr "TOP 10" ++ ++msgid "Update »" ++msgstr "Aktualizuj »" ++ ++msgid "VnStat" ++msgstr "VnStat" ++ ++msgid "VnStat Graphs" ++msgstr "Wykresy VnStat" ++ ++msgid "VnStat Traffic Monitor" ++msgstr "Monitor obciążenia VnStat" ++ ++msgid "" ++"VnStat is a network traffic monitor for Linux that keeps a log of network " ++"traffic for the selected interface(s)." ++msgstr "" ++"VnStat to aplikacja monitorujÄ…ca ruch sieciowy w Linuxie, który utrzymuje " ++"loga ruchu sieciowego dla okreÅ›lonych interfejsów." ++ ++#~ msgid "The VnStat service has been restarted." ++#~ msgstr "UsÅ‚uga VnStat zostaÅ‚a uruchomiona ponownie." +diff --git a/feeds/luci/applications/luci-app-vnstat/po/pt-br/vnstat.po b/feeds/luci/applications/luci-app-vnstat/po/pt-br/vnstat.po +new file mode 100644 +index 0000000..47cf09a +--- /dev/null ++++ b/feeds/luci/applications/luci-app-vnstat/po/pt-br/vnstat.po +@@ -0,0 +1,68 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"PO-Revision-Date: 2011-10-11 21:02+0200\n" ++"Last-Translator: Luiz Angelo \n" ++"Language-Team: German\n" ++"Language: pt_BR\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n > 1);\n" ++"X-Generator: Pootle 2.0.4\n" ++ ++msgid "Configuration" ++msgstr "Configuração" ++ ++msgid "Daily traffic" ++msgstr "Tráfego diário" ++ ++msgid "Graphs" ++msgstr "Gráficos" ++ ++msgid "Hourly traffic" ++msgstr "Tráfego horário" ++ ++msgid "Monitor selected interfaces" ++msgstr "Monitore as interfaces selecionadas" ++ ++msgid "Monthly traffic" ++msgstr "Tráfego mensal" ++ ++msgid "" ++"No database has been set up yet. Go to the VnStat configuration and enable " ++"monitoring for one or more interfaces." ++msgstr "" ++"Ainda nenhum banco de dados foi definido. Vá para a configuração do VnStat " ++"ehabilite o monitoramento para um ou mais interfaces." ++ ++msgid "Restart VnStat" ++msgstr "Reiniciar VnStat" ++ ++msgid "Summary display" ++msgstr "Tela de resumo" ++ ++msgid "Top 10 display" ++msgstr "Tela dos 10 mais" ++ ++msgid "Update »" ++msgstr "Atualizar »" ++ ++msgid "VnStat" ++msgstr "VnStat" ++ ++msgid "VnStat Graphs" ++msgstr "Gráficos VnStat" ++ ++msgid "VnStat Traffic Monitor" ++msgstr "Monitor de Tráfego VnStat" ++ ++msgid "" ++"VnStat is a network traffic monitor for Linux that keeps a log of network " ++"traffic for the selected interface(s)." ++msgstr "" ++"VnStat é um monitor de tráfego de rede para Linux que mantém um registro do " ++"tráfego para a(s) interface(s) selecionada(s)." ++ ++#~ msgid "The VnStat service has been restarted." ++#~ msgstr "O serviço VnStat foi reiniciado." +diff --git a/feeds/luci/applications/luci-app-vnstat/po/pt/vnstat.po b/feeds/luci/applications/luci-app-vnstat/po/pt/vnstat.po +new file mode 100644 +index 0000000..7297890 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-vnstat/po/pt/vnstat.po +@@ -0,0 +1,65 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"PO-Revision-Date: 2013-05-31 16:25+0200\n" ++"Last-Translator: joao.f.vieira \n" ++"Language-Team: German\n" ++"Language: pt\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n != 1);\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "Configuration" ++msgstr "Configuração" ++ ++msgid "Daily traffic" ++msgstr "Tráfego Diário" ++ ++msgid "Graphs" ++msgstr "Gráficos" ++ ++msgid "Hourly traffic" ++msgstr "Tráfego por hora" ++ ++msgid "Monitor selected interfaces" ++msgstr "Monitorizar as interfaces selecionadas" ++ ++msgid "Monthly traffic" ++msgstr "Tráfego mensal" ++ ++msgid "" ++"No database has been set up yet. Go to the VnStat configuration and enable " ++"monitoring for one or more interfaces." ++msgstr "" ++"Ainda não foi configurada uma base de dados. Vá até à configuração do VnStat " ++"e ative a monitorização para uma ou mais interfaces." ++ ++msgid "Restart VnStat" ++msgstr "Reiniciar VnStat" ++ ++msgid "Summary display" ++msgstr "Mostrar resumo" ++ ++msgid "Top 10 display" ++msgstr "Mostrar Top 10" ++ ++msgid "Update »" ++msgstr "Atualizar »" ++ ++msgid "VnStat" ++msgstr "VnStat" ++ ++msgid "VnStat Graphs" ++msgstr "Gráficos VnStat" ++ ++msgid "VnStat Traffic Monitor" ++msgstr "Monitor de Tráfego VnStat" ++ ++msgid "" ++"VnStat is a network traffic monitor for Linux that keeps a log of network " ++"traffic for the selected interface(s)." ++msgstr "" ++"O VnStat é um monitor de tráfego para Linux que mantêm um registo do tráfego " ++"para as interface (s) selecionadas." +diff --git a/feeds/luci/applications/luci-app-vnstat/po/ro/vnstat.po b/feeds/luci/applications/luci-app-vnstat/po/ro/vnstat.po +new file mode 100644 +index 0000000..093182b +--- /dev/null ++++ b/feeds/luci/applications/luci-app-vnstat/po/ro/vnstat.po +@@ -0,0 +1,69 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"PO-Revision-Date: 2011-10-07 16:01+0200\n" ++"Last-Translator: Daniel \n" ++"Language-Team: none\n" ++"Language: ro\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=3; plural=(n==1 ? 0 : (n==0 || (n%100 > 0 && n%100 < " ++"20)) ? 1 : 2);;\n" ++"X-Generator: Pootle 2.0.4\n" ++ ++msgid "Configuration" ++msgstr "Configurare" ++ ++msgid "Daily traffic" ++msgstr "Trafic zilnic" ++ ++msgid "Graphs" ++msgstr "Grafice" ++ ++msgid "Hourly traffic" ++msgstr "Trafic la fiecare ora" ++ ++msgid "Monitor selected interfaces" ++msgstr "Monitorizeaza interfetele selectate" ++ ++msgid "Monthly traffic" ++msgstr "Trafic lunar" ++ ++msgid "" ++"No database has been set up yet. Go to the VnStat configuration and enable " ++"monitoring for one or more interfaces." ++msgstr "" ++"Nu a fost setata nici o baza de date. La configurarea VnStat se poate activa " ++"monitoriza pentru una sau mai multe interfete." ++ ++msgid "Restart VnStat" ++msgstr "Restarteaza VnStat" ++ ++msgid "Summary display" ++msgstr "Afiseaza sumarul" ++ ++msgid "Top 10 display" ++msgstr "Afiseaza top 10" ++ ++msgid "Update »" ++msgstr "Updateaza »" ++ ++msgid "VnStat" ++msgstr "VnStat" ++ ++msgid "VnStat Graphs" ++msgstr "Graficele VnStat" ++ ++msgid "VnStat Traffic Monitor" ++msgstr "Monitorul de trafic VnStat" ++ ++msgid "" ++"VnStat is a network traffic monitor for Linux that keeps a log of network " ++"traffic for the selected interface(s)." ++msgstr "" ++"Vnstat este un monitor de retea ce pastreaza detalii legate de traficul pe " ++"interfetele selectate." ++ ++#~ msgid "The VnStat service has been restarted." ++#~ msgstr "Serviciul VnStat a fost restartat." +diff --git a/feeds/luci/applications/luci-app-vnstat/po/ru/vnstat.po b/feeds/luci/applications/luci-app-vnstat/po/ru/vnstat.po +new file mode 100644 +index 0000000..5254ca1 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-vnstat/po/ru/vnstat.po +@@ -0,0 +1,71 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: LuCI: vnstat\n" ++"POT-Creation-Date: \n" ++"PO-Revision-Date: 2012-08-15 11:48+0300\n" ++"Last-Translator: Roman A. aka BasicXP \n" ++"Language-Team: Russian \n" ++"Language: ru\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%" ++"10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" ++"X-Generator: Pootle 2.0.4\n" ++"X-Poedit-SourceCharset: UTF-8\n" ++ ++msgid "Configuration" ++msgstr "КонфигурациÑ" ++ ++msgid "Daily traffic" ++msgstr "Трафик за день" ++ ++msgid "Graphs" ++msgstr "Графики" ++ ++msgid "Hourly traffic" ++msgstr "Трафик за чаÑ" ++ ++msgid "Monitor selected interfaces" ++msgstr "Собирать ÑтатиÑтику на выбранных интерфейÑах" ++ ++msgid "Monthly traffic" ++msgstr "Трафик за меÑÑц" ++ ++msgid "" ++"No database has been set up yet. Go to the VnStat configuration and enable " ++"monitoring for one or more interfaces." ++msgstr "" ++"База данных не наÑтроена. Перейдите в конфигурацию и укажите интерфейÑÑ‹ Ð´Ð»Ñ " ++"Ñбора ÑтатиÑтики." ++ ++msgid "Restart VnStat" ++msgstr "ПерезапуÑтить VnStat" ++ ++msgid "Summary display" ++msgstr "Ð¡Ð²Ð¾Ð´Ð½Ð°Ñ ÑтатиÑтика" ++ ++msgid "Top 10 display" ++msgstr "ПоÑледние 10" ++ ++msgid "Update »" ++msgstr "Обновить »" ++ ++msgid "VnStat" ++msgstr "VnStat" ++ ++msgid "VnStat Graphs" ++msgstr "Графики VnStat" ++ ++msgid "VnStat Traffic Monitor" ++msgstr "Монитор трафика VnStat" ++ ++msgid "" ++"VnStat is a network traffic monitor for Linux that keeps a log of network " ++"traffic for the selected interface(s)." ++msgstr "" ++"VnStat - монитор Ñетевого трафика Ð´Ð»Ñ Linux, Ñобирающий ÑтатиÑтику по " ++"выбранным интерфейÑам." ++ ++#~ msgid "The VnStat service has been restarted." ++#~ msgstr "VnStat ÑÐµÑ€Ð²Ð¸Ñ Ð¿ÐµÑ€ÐµÐ·Ð°Ð¿ÑƒÑ‰ÐµÐ½." +diff --git a/feeds/luci/applications/luci-app-vnstat/po/sk/vnstat.po b/feeds/luci/applications/luci-app-vnstat/po/sk/vnstat.po +new file mode 100644 +index 0000000..5926ecf +--- /dev/null ++++ b/feeds/luci/applications/luci-app-vnstat/po/sk/vnstat.po +@@ -0,0 +1,58 @@ ++msgid "" ++msgstr "" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Last-Translator: Automatically generated\n" ++"Language-Team: none\n" ++"MIME-Version: 1.0\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n" ++ ++msgid "Configuration" ++msgstr "" ++ ++msgid "Daily traffic" ++msgstr "" ++ ++msgid "Graphs" ++msgstr "" ++ ++msgid "Hourly traffic" ++msgstr "" ++ ++msgid "Monitor selected interfaces" ++msgstr "" ++ ++msgid "Monthly traffic" ++msgstr "" ++ ++msgid "" ++"No database has been set up yet. Go to the VnStat configuration and enable " ++"monitoring for one or more interfaces." ++msgstr "" ++ ++msgid "Restart VnStat" ++msgstr "" ++ ++msgid "Summary display" ++msgstr "" ++ ++msgid "Top 10 display" ++msgstr "" ++ ++msgid "Update »" ++msgstr "" ++ ++msgid "VnStat" ++msgstr "" ++ ++msgid "VnStat Graphs" ++msgstr "" ++ ++msgid "VnStat Traffic Monitor" ++msgstr "" ++ ++msgid "" ++"VnStat is a network traffic monitor for Linux that keeps a log of network " ++"traffic for the selected interface(s)." ++msgstr "" +diff --git a/feeds/luci/applications/luci-app-vnstat/po/sv/vnstat.po b/feeds/luci/applications/luci-app-vnstat/po/sv/vnstat.po +new file mode 100644 +index 0000000..113c4d2 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-vnstat/po/sv/vnstat.po +@@ -0,0 +1,59 @@ ++msgid "" ++msgstr "" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Last-Translator: Automatically generated\n" ++"Language-Team: none\n" ++"Language: sv\n" ++"MIME-Version: 1.0\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n != 1);\n" ++ ++msgid "Configuration" ++msgstr "" ++ ++msgid "Daily traffic" ++msgstr "" ++ ++msgid "Graphs" ++msgstr "" ++ ++msgid "Hourly traffic" ++msgstr "" ++ ++msgid "Monitor selected interfaces" ++msgstr "" ++ ++msgid "Monthly traffic" ++msgstr "" ++ ++msgid "" ++"No database has been set up yet. Go to the VnStat configuration and enable " ++"monitoring for one or more interfaces." ++msgstr "" ++ ++msgid "Restart VnStat" ++msgstr "" ++ ++msgid "Summary display" ++msgstr "" ++ ++msgid "Top 10 display" ++msgstr "" ++ ++msgid "Update »" ++msgstr "" ++ ++msgid "VnStat" ++msgstr "" ++ ++msgid "VnStat Graphs" ++msgstr "" ++ ++msgid "VnStat Traffic Monitor" ++msgstr "" ++ ++msgid "" ++"VnStat is a network traffic monitor for Linux that keeps a log of network " ++"traffic for the selected interface(s)." ++msgstr "" +diff --git a/feeds/luci/applications/luci-app-vnstat/po/templates/vnstat.pot b/feeds/luci/applications/luci-app-vnstat/po/templates/vnstat.pot +new file mode 100644 +index 0000000..4dccf05 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-vnstat/po/templates/vnstat.pot +@@ -0,0 +1,51 @@ ++msgid "" ++msgstr "Content-Type: text/plain; charset=UTF-8" ++ ++msgid "Configuration" ++msgstr "" ++ ++msgid "Daily traffic" ++msgstr "" ++ ++msgid "Graphs" ++msgstr "" ++ ++msgid "Hourly traffic" ++msgstr "" ++ ++msgid "Monitor selected interfaces" ++msgstr "" ++ ++msgid "Monthly traffic" ++msgstr "" ++ ++msgid "" ++"No database has been set up yet. Go to the VnStat configuration and enable " ++"monitoring for one or more interfaces." ++msgstr "" ++ ++msgid "Restart VnStat" ++msgstr "" ++ ++msgid "Summary display" ++msgstr "" ++ ++msgid "Top 10 display" ++msgstr "" ++ ++msgid "Update »" ++msgstr "" ++ ++msgid "VnStat" ++msgstr "" ++ ++msgid "VnStat Graphs" ++msgstr "" ++ ++msgid "VnStat Traffic Monitor" ++msgstr "" ++ ++msgid "" ++"VnStat is a network traffic monitor for Linux that keeps a log of network " ++"traffic for the selected interface(s)." ++msgstr "" +diff --git a/feeds/luci/applications/luci-app-vnstat/po/tr/vnstat.po b/feeds/luci/applications/luci-app-vnstat/po/tr/vnstat.po +new file mode 100644 +index 0000000..5e001c9 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-vnstat/po/tr/vnstat.po +@@ -0,0 +1,58 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Last-Translator: Automatically generated\n" ++"Language-Team: none\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=1; plural=0;\n" ++ ++msgid "Configuration" ++msgstr "" ++ ++msgid "Daily traffic" ++msgstr "" ++ ++msgid "Graphs" ++msgstr "" ++ ++msgid "Hourly traffic" ++msgstr "" ++ ++msgid "Monitor selected interfaces" ++msgstr "" ++ ++msgid "Monthly traffic" ++msgstr "" ++ ++msgid "" ++"No database has been set up yet. Go to the VnStat configuration and enable " ++"monitoring for one or more interfaces." ++msgstr "" ++ ++msgid "Restart VnStat" ++msgstr "" ++ ++msgid "Summary display" ++msgstr "" ++ ++msgid "Top 10 display" ++msgstr "" ++ ++msgid "Update »" ++msgstr "" ++ ++msgid "VnStat" ++msgstr "" ++ ++msgid "VnStat Graphs" ++msgstr "" ++ ++msgid "VnStat Traffic Monitor" ++msgstr "" ++ ++msgid "" ++"VnStat is a network traffic monitor for Linux that keeps a log of network " ++"traffic for the selected interface(s)." ++msgstr "" +diff --git a/feeds/luci/applications/luci-app-vnstat/po/uk/vnstat.po b/feeds/luci/applications/luci-app-vnstat/po/uk/vnstat.po +new file mode 100644 +index 0000000..5f9d257 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-vnstat/po/uk/vnstat.po +@@ -0,0 +1,67 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"PO-Revision-Date: 2013-08-13 15:33+0200\n" ++"Last-Translator: zubr_139 \n" ++"Language-Team: none\n" ++"Language: uk\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%" ++"10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "Configuration" ++msgstr "КонфігураціÑ" ++ ++msgid "Daily traffic" ++msgstr "СпиÑок щоденного трафіку" ++ ++msgid "Graphs" ++msgstr "Графіки" ++ ++msgid "Hourly traffic" ++msgstr "СпиÑок погодинного трафіку" ++ ++msgid "Monitor selected interfaces" ++msgstr "Моніторинг обраних інтерфейÑів" ++ ++msgid "Monthly traffic" ++msgstr "СпиÑок щоміÑÑчного трафіку" ++ ++msgid "" ++"No database has been set up yet. Go to the VnStat configuration and enable " ++"monitoring for one or more interfaces." ++msgstr "" ++"Ðе була Ñтворена база даних. Перейдіть до вкладки конфігурації VnStat та " ++"увімкніть моніторинг Ð´Ð»Ñ Ð¾Ð´Ð½Ð¾Ð³Ð¾ або декількох інтерфейÑів." ++ ++msgid "Restart VnStat" ++msgstr "ПерезапуÑк VnStat" ++ ++#, fuzzy ++msgid "Summary display" ++msgstr "Загальна таблицÑ" ++ ++msgid "Top 10 display" ++msgstr "СпиÑок Топ-10" ++ ++msgid "Update »" ++msgstr "ÐžÐ½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Â»" ++ ++msgid "VnStat" ++msgstr "VnStat" ++ ++msgid "VnStat Graphs" ++msgstr "Графіки VnStat" ++ ++msgid "VnStat Traffic Monitor" ++msgstr "Моніторінг трафіку VnStat" ++ ++msgid "" ++"VnStat is a network traffic monitor for Linux that keeps a log of network " ++"traffic for the selected interface(s)." ++msgstr "" ++"VnStat - монітор мережного трафіку Ð´Ð»Ñ Linux, Ñкий веде журнал мережевого " ++"трафіку Ð´Ð»Ñ Ð¾Ð±Ñ€Ð°Ð½Ð¾Ð³Ð¾ інтерфейÑу або декількох інтерфейÑів." +diff --git a/feeds/luci/applications/luci-app-vnstat/po/vi/vnstat.po b/feeds/luci/applications/luci-app-vnstat/po/vi/vnstat.po +new file mode 100644 +index 0000000..0303835 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-vnstat/po/vi/vnstat.po +@@ -0,0 +1,59 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"PO-Revision-Date: 2010-11-16 20:55+0100\n" ++"Last-Translator: \n" ++"Language-Team: German\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n != 1);\n" ++ ++msgid "Configuration" ++msgstr "" ++ ++msgid "Daily traffic" ++msgstr "" ++ ++msgid "Graphs" ++msgstr "" ++ ++msgid "Hourly traffic" ++msgstr "" ++ ++msgid "Monitor selected interfaces" ++msgstr "" ++ ++msgid "Monthly traffic" ++msgstr "" ++ ++msgid "" ++"No database has been set up yet. Go to the VnStat configuration and enable " ++"monitoring for one or more interfaces." ++msgstr "" ++ ++msgid "Restart VnStat" ++msgstr "" ++ ++msgid "Summary display" ++msgstr "" ++ ++msgid "Top 10 display" ++msgstr "" ++ ++msgid "Update »" ++msgstr "" ++ ++msgid "VnStat" ++msgstr "" ++ ++msgid "VnStat Graphs" ++msgstr "" ++ ++msgid "VnStat Traffic Monitor" ++msgstr "" ++ ++msgid "" ++"VnStat is a network traffic monitor for Linux that keeps a log of network " ++"traffic for the selected interface(s)." ++msgstr "" +diff --git a/feeds/luci/applications/luci-app-vnstat/po/zh-cn/vnstat.po b/feeds/luci/applications/luci-app-vnstat/po/zh-cn/vnstat.po +new file mode 100644 +index 0000000..68e4905 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-vnstat/po/zh-cn/vnstat.po +@@ -0,0 +1,61 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"PO-Revision-Date: 2013-10-08 14:05+0200\n" ++"Last-Translator: Tanyingyu \n" ++"Language-Team: German\n" ++"Language: zh_CN\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=1; plural=0;\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "Configuration" ++msgstr "é…ç½®" ++ ++msgid "Daily traffic" ++msgstr "æµé‡æ—¥æŠ¥" ++ ++msgid "Graphs" ++msgstr "图表" ++ ++msgid "Hourly traffic" ++msgstr "æµé‡æ—¶æŠ¥" ++ ++msgid "Monitor selected interfaces" ++msgstr "监控选择的接å£" ++ ++msgid "Monthly traffic" ++msgstr "æµé‡æœˆæŠ¥" ++ ++msgid "" ++"No database has been set up yet. Go to the VnStat configuration and enable " ++"monitoring for one or more interfaces." ++msgstr "没有创建统计数æ®ã€‚ 去VnStaté…置,并å¯åŠ¨ç›‘控一个或多个接å£ã€‚" ++ ++msgid "Restart VnStat" ++msgstr "é‡ç½®VnStat" ++ ++msgid "Summary display" ++msgstr "摘è¦æ˜¾ç¤º" ++ ++msgid "Top 10 display" ++msgstr "显示å‰10" ++ ++msgid "Update »" ++msgstr "æ›´æ–°" ++ ++msgid "VnStat" ++msgstr "VnStat" ++ ++msgid "VnStat Graphs" ++msgstr "VnStat图表" ++ ++msgid "VnStat Traffic Monitor" ++msgstr "VNStatæµé‡ç›‘控" ++ ++msgid "" ++"VnStat is a network traffic monitor for Linux that keeps a log of network " ++"traffic for the selected interface(s)." ++msgstr "vnstat是一个网络æµé‡ç›‘控器,用于Linuxä¿ç•™æ‰€é€‰æŽ¥å£çš„网络æµé‡æ—¥å¿—。" +diff --git a/feeds/luci/applications/luci-app-vnstat/po/zh-tw/vnstat.po b/feeds/luci/applications/luci-app-vnstat/po/zh-tw/vnstat.po +new file mode 100644 +index 0000000..261747a +--- /dev/null ++++ b/feeds/luci/applications/luci-app-vnstat/po/zh-tw/vnstat.po +@@ -0,0 +1,61 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"PO-Revision-Date: 2014-05-14 10:52+0200\n" ++"Last-Translator: omnistack \n" ++"Language-Team: none\n" ++"Language: zh_TW\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=1; plural=0;\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "Configuration" ++msgstr "設定" ++ ++msgid "Daily traffic" ++msgstr "æ¯æ—¥æµé‡" ++ ++msgid "Graphs" ++msgstr "圖表" ++ ++msgid "Hourly traffic" ++msgstr "æ¯å°æ™‚æµé‡" ++ ++msgid "Monitor selected interfaces" ++msgstr "監控é¸åˆ°çš„介é¢" ++ ++msgid "Monthly traffic" ++msgstr "æ¯æœˆæµé‡" ++ ++msgid "" ++"No database has been set up yet. Go to the VnStat configuration and enable " ++"monitoring for one or more interfaces." ++msgstr "尚無任何資料庫被設定. 進入VnStaté‡å°æŸä¸€å€‹æˆ–多個介é¢è¨­å®šä¸¦å•Ÿç”¨ç›£è¦–." ++ ++msgid "Restart VnStat" ++msgstr "從新啟動 VnStat" ++ ++msgid "Summary display" ++msgstr "顯示概è¦" ++ ++msgid "Top 10 display" ++msgstr "顯示å‰10å" ++ ++msgid "Update »" ++msgstr "æ›´æ–°" ++ ++msgid "VnStat" ++msgstr "VnStat" ++ ++msgid "VnStat Graphs" ++msgstr "VnStat圖表" ++ ++msgid "VnStat Traffic Monitor" ++msgstr "VnStatæµé‡ç›£è¦–" ++ ++msgid "" ++"VnStat is a network traffic monitor for Linux that keeps a log of network " ++"traffic for the selected interface(s)." ++msgstr " VnStat是一個é‡å°Linux上的網路æµé‡ç›£è¦–å¯é”到ä¿å­˜ç‰¹å®šä»‹é¢çš„æµé‡ç´€éŒ„" +diff --git a/feeds/luci/applications/luci-app-vnstat/root/etc/uci-defaults/luci-vnstat b/feeds/luci/applications/luci-app-vnstat/root/etc/uci-defaults/luci-vnstat +new file mode 100755 +index 0000000..fa204b3 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-vnstat/root/etc/uci-defaults/luci-vnstat +@@ -0,0 +1,11 @@ ++#!/bin/sh ++ ++uci -q batch <<-EOF >/dev/null ++ delete ucitrack.@vnstat[-1] ++ add ucitrack vnstat ++ set ucitrack.@vnstat[-1].init=vnstat ++ commit ucitrack ++EOF ++ ++rm -f /tmp/luci-indexcache ++exit 0 +diff --git a/feeds/luci/applications/luci-app-voice-core/Makefile b/feeds/luci/applications/luci-app-voice-core/Makefile +new file mode 100644 +index 0000000..3641bdd +--- /dev/null ++++ b/feeds/luci/applications/luci-app-voice-core/Makefile +@@ -0,0 +1,14 @@ ++# ++# Copyright (C) 2008-2014 The LuCI Team ++# ++# This is free software, licensed under the Apache License, Version 2.0 . ++# ++ ++include $(TOPDIR)/rules.mk ++ ++LUCI_TITLE:=LuCI Voice Software (Core) ++LUCI_DEPENDS:= ++ ++include ../../luci.mk ++ ++# call BuildPackage - OpenWrt buildroot signature +diff --git a/feeds/luci/applications/luci-app-voice-core/luasrc/controller/luci_voice.lua b/feeds/luci/applications/luci-app-voice-core/luasrc/controller/luci_voice.lua +new file mode 100644 +index 0000000..b37018d +--- /dev/null ++++ b/feeds/luci/applications/luci-app-voice-core/luasrc/controller/luci_voice.lua +@@ -0,0 +1,21 @@ ++-- Copyright 2009 Daniel Dickinson ++-- Licensed to the public under the Apache License 2.0. ++ ++module("luci.controller.luci_voice", package.seeall) ++ ++function index() ++ local e ++ ++ e = entry({"admin", "voice"}, template("luci_voice/index") , _("Voice"), 90) ++ e.index = true ++ ++ e = entry({"mini", "voice"}, template("luci_voice/index"), _("Voice"), 90) ++ e.index = true ++ ++ e = entry({"mini", "voice", "phones"}, template("luci_voice/phone_index"), _("Phones"), 90) ++ e.index = true ++ ++ e = entry({"admin", "voice", "phones"}, template("luci_voice/phone_index"), _("Phones"), 90) ++ e.index = true ++ ++end +diff --git a/feeds/luci/applications/luci-app-voice-core/luasrc/view/luci_voice/index.htm b/feeds/luci/applications/luci-app-voice-core/luasrc/view/luci_voice/index.htm +new file mode 100644 +index 0000000..a3503f8 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-voice-core/luasrc/view/luci_voice/index.htm +@@ -0,0 +1,16 @@ ++<%# ++ Copyright 2009 Daniel Dickinson ++ Licensed to the public under the Apache License 2.0. ++-%> ++ ++<%+header%> ++

    Voice

    ++

    Here you can control OpenWRT voice-related settings and see ++ voice-related information from OpenWRT

    ++

    In particular Asterisk configuration and information is displayed ++ here, as well as diagnostics that specifically apply to voice but are ++ not general networking diagnostics (e.g. includes SIP device scans, but not ++ ping tests). Includes PSTN phones as well as VoIP and possibly ++ non-telephony related options. ++

    ++<%+footer%> +diff --git a/feeds/luci/applications/luci-app-voice-core/luasrc/view/luci_voice/phone_index.htm b/feeds/luci/applications/luci-app-voice-core/luasrc/view/luci_voice/phone_index.htm +new file mode 100644 +index 0000000..e3e88b3 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-voice-core/luasrc/view/luci_voice/phone_index.htm +@@ -0,0 +1,12 @@ ++<%# ++ Copyright 2009 Daniel Dickinson ++ Licensed to the public under the Apache License 2.0. ++-%> ++ ++<%+header%> ++

    Phones

    ++

    Here you can control phone configuration and information in OpenWRT

    ++

    You can control the setup of phone clients and servers and see ++ information such as diagnostics related to phone devices from this menu. ++

    ++<%+footer%> +diff --git a/feeds/luci/applications/luci-app-voice-core/po/ca/voice_core.po b/feeds/luci/applications/luci-app-voice-core/po/ca/voice_core.po +new file mode 100644 +index 0000000..0686209 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-voice-core/po/ca/voice_core.po +@@ -0,0 +1,18 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"PO-Revision-Date: 2014-05-29 01:58+0200\n" ++"Last-Translator: Alex \n" ++"Language-Team: none\n" ++"Language: ca\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n != 1);\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "Phones" ++msgstr "Telèfons" ++ ++msgid "Voice" ++msgstr "Veu" +diff --git a/feeds/luci/applications/luci-app-voice-core/po/cs/voice_core.po b/feeds/luci/applications/luci-app-voice-core/po/cs/voice_core.po +new file mode 100644 +index 0000000..e4eae35 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-voice-core/po/cs/voice_core.po +@@ -0,0 +1,21 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"PO-Revision-Date: 2013-01-29 21:47+0200\n" ++"Last-Translator: Astran \n" ++"Language-Team: none\n" ++"Language: cs\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "Phones" ++msgstr "Telefony" ++ ++msgid "Voice" ++msgstr "Hlas" ++ ++#~ msgid "l_v_adminphones" ++#~ msgstr "Telefony" +diff --git a/feeds/luci/applications/luci-app-voice-core/po/de/voice_core.po b/feeds/luci/applications/luci-app-voice-core/po/de/voice_core.po +new file mode 100644 +index 0000000..2a03b63 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-voice-core/po/de/voice_core.po +@@ -0,0 +1,18 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"PO-Revision-Date: 2013-01-28 22:20+0200\n" ++"Last-Translator: DAC324 \n" ++"Language-Team: none\n" ++"Language: de\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n != 1);\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "Phones" ++msgstr "Telefone" ++ ++msgid "Voice" ++msgstr "Sprache" +diff --git a/feeds/luci/applications/luci-app-voice-core/po/el/voice_core.po b/feeds/luci/applications/luci-app-voice-core/po/el/voice_core.po +new file mode 100644 +index 0000000..01abb41 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-voice-core/po/el/voice_core.po +@@ -0,0 +1,18 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"PO-Revision-Date: 2012-02-16 19:15+0200\n" ++"Last-Translator: Jinxcat \n" ++"Language-Team: none\n" ++"Language: el\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n != 1);\n" ++"X-Generator: Pootle 2.0.4\n" ++ ++msgid "Phones" ++msgstr "Τηλέφωνα" ++ ++msgid "Voice" ++msgstr "" +diff --git a/feeds/luci/applications/luci-app-voice-core/po/en/voice_core.po b/feeds/luci/applications/luci-app-voice-core/po/en/voice_core.po +new file mode 100644 +index 0000000..297f873 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-voice-core/po/en/voice_core.po +@@ -0,0 +1,23 @@ ++# Voice Core. ++# Copyright (C) 2009 Daniel Dickinson ++# Daniel Dickinson , 2009. ++# ++#, fuzzy ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"PO-Revision-Date: 2009-07-16 22:19-0400\n" ++"Last-Translator: FULL NAME \n" ++"Language-Team: LANGUAGE \n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++ ++msgid "Phones" ++msgstr "Phones" ++ ++msgid "Voice" ++msgstr "" ++ ++#~ msgid "l_v_adminphones" ++#~ msgstr "Phones" +diff --git a/feeds/luci/applications/luci-app-voice-core/po/es/voice_core.po b/feeds/luci/applications/luci-app-voice-core/po/es/voice_core.po +new file mode 100644 +index 0000000..74e2c23 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-voice-core/po/es/voice_core.po +@@ -0,0 +1,21 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"PO-Revision-Date: 2012-07-28 23:17+0200\n" ++"Last-Translator: Daniel \n" ++"Language-Team: none\n" ++"Language: es\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n != 1);\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "Phones" ++msgstr "Teléfonos" ++ ++msgid "Voice" ++msgstr "Voz" ++ ++#~ msgid "l_v_adminphones" ++#~ msgstr "l_v_adminphones" +diff --git a/feeds/luci/applications/luci-app-voice-core/po/fr/voice_core.po b/feeds/luci/applications/luci-app-voice-core/po/fr/voice_core.po +new file mode 100644 +index 0000000..71ef062 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-voice-core/po/fr/voice_core.po +@@ -0,0 +1,21 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"PO-Revision-Date: 2012-11-06 16:09+0200\n" ++"Last-Translator: hogsim \n" ++"Language-Team: none\n" ++"Language: fr\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n > 1);\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "Phones" ++msgstr "Téléphones" ++ ++msgid "Voice" ++msgstr "Voix" ++ ++#~ msgid "l_v_adminphones" ++#~ msgstr "Téléphones" +diff --git a/feeds/luci/applications/luci-app-voice-core/po/he/voice_core.po b/feeds/luci/applications/luci-app-voice-core/po/he/voice_core.po +new file mode 100644 +index 0000000..74440e3 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-voice-core/po/he/voice_core.po +@@ -0,0 +1,22 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"PO-Revision-Date: 2012-09-10 03:44+0200\n" ++"Last-Translator: Snoof \n" ++"Language-Team: none\n" ++"Language: he\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n != 1);\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "Phones" ++msgstr "טלפוני×" ++ ++msgid "Voice" ++msgstr "קול" ++ ++# מה בדיוק ×ž×ª×¨×’×ž×™× ×›×ן? ×× ×–×” phones ××– ×”×ª×¨×’×•× ×”×•× ×˜×œ×¤×•× ×™×. ×× ×–×” l_v_adminphones ××– ×–×” מונח טכני וצריך להש×יר ×ותו ×œ×œ× ×©×™× ×•×™ ++#~ msgid "l_v_adminphones" ++#~ msgstr "טלפוני×" +diff --git a/feeds/luci/applications/luci-app-voice-core/po/hu/voice_core.po b/feeds/luci/applications/luci-app-voice-core/po/hu/voice_core.po +new file mode 100644 +index 0000000..07eaa14 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-voice-core/po/hu/voice_core.po +@@ -0,0 +1,21 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"PO-Revision-Date: 2012-04-01 09:34+0200\n" ++"Last-Translator: juhosg \n" ++"Language-Team: none\n" ++"Language: hu\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n != 1);\n" ++"X-Generator: Pootle 2.0.4\n" ++ ++msgid "Phones" ++msgstr "Telefonok" ++ ++msgid "Voice" ++msgstr "Hang" ++ ++#~ msgid "l_v_adminphones" ++#~ msgstr "l_v_adminphones" +diff --git a/feeds/luci/applications/luci-app-voice-core/po/it/voice_core.po b/feeds/luci/applications/luci-app-voice-core/po/it/voice_core.po +new file mode 100644 +index 0000000..4d22ff0 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-voice-core/po/it/voice_core.po +@@ -0,0 +1,21 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"PO-Revision-Date: 2013-02-03 14:00+0200\n" ++"Last-Translator: Francesco <3gasas@gmail.com>\n" ++"Language-Team: none\n" ++"Language: it\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n != 1);\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "Phones" ++msgstr "Telefoni" ++ ++msgid "Voice" ++msgstr "Voce" ++ ++#~ msgid "l_v_adminphones" ++#~ msgstr "l_v_adminphones" +diff --git a/feeds/luci/applications/luci-app-voice-core/po/ja/voice_core.po b/feeds/luci/applications/luci-app-voice-core/po/ja/voice_core.po +new file mode 100644 +index 0000000..c7e60e2 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-voice-core/po/ja/voice_core.po +@@ -0,0 +1,18 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Last-Translator: Automatically generated\n" ++"Language-Team: none\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=1; plural=0;\n" ++ ++msgid "Phones" ++msgstr "電話" ++ ++msgid "Voice" ++msgstr "" ++ ++#~ msgid "l_v_adminphones" ++#~ msgstr "l_v_adminphones" +diff --git a/feeds/luci/applications/luci-app-voice-core/po/ms/voice_core.po b/feeds/luci/applications/luci-app-voice-core/po/ms/voice_core.po +new file mode 100644 +index 0000000..a866bec +--- /dev/null ++++ b/feeds/luci/applications/luci-app-voice-core/po/ms/voice_core.po +@@ -0,0 +1,14 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Last-Translator: Automatically generated\n" ++"Language-Team: none\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++ ++msgid "Phones" ++msgstr "" ++ ++msgid "Voice" ++msgstr "" +diff --git a/feeds/luci/applications/luci-app-voice-core/po/no/voice_core.po b/feeds/luci/applications/luci-app-voice-core/po/no/voice_core.po +new file mode 100644 +index 0000000..a0149da +--- /dev/null ++++ b/feeds/luci/applications/luci-app-voice-core/po/no/voice_core.po +@@ -0,0 +1,14 @@ ++msgid "" ++msgstr "" ++"Last-Translator: Lars Hardy \n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++ ++msgid "Phones" ++msgstr "Telefoner" ++ ++msgid "Voice" ++msgstr "Voice" ++ ++#~ msgid "l_v_adminphones" ++#~ msgstr "Admin Telefoner" +diff --git a/feeds/luci/applications/luci-app-voice-core/po/pl/voice_core.po b/feeds/luci/applications/luci-app-voice-core/po/pl/voice_core.po +new file mode 100644 +index 0000000..39950f8 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-voice-core/po/pl/voice_core.po +@@ -0,0 +1,22 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"PO-Revision-Date: 2012-08-24 07:03+0200\n" ++"Last-Translator: goodgod261 \n" ++"Language-Team: none\n" ++"Language: pl\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 " ++"|| n%100>=20) ? 1 : 2);\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "Phones" ++msgstr "Telefony" ++ ++msgid "Voice" ++msgstr "GÅ‚os" ++ ++#~ msgid "l_v_adminphones" ++#~ msgstr "l_v_adminphones" +diff --git a/feeds/luci/applications/luci-app-voice-core/po/pt-br/voice_core.po b/feeds/luci/applications/luci-app-voice-core/po/pt-br/voice_core.po +new file mode 100644 +index 0000000..18cab72 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-voice-core/po/pt-br/voice_core.po +@@ -0,0 +1,21 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"PO-Revision-Date: 2012-07-05 06:44+0200\n" ++"Last-Translator: rafaelff1 \n" ++"Language-Team: none\n" ++"Language: pt_BR\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n > 1);\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "Phones" ++msgstr "Telefones" ++ ++msgid "Voice" ++msgstr "Voz" ++ ++#~ msgid "l_v_adminphones" ++#~ msgstr "l_v_adminphones" +diff --git a/feeds/luci/applications/luci-app-voice-core/po/pt/voice_core.po b/feeds/luci/applications/luci-app-voice-core/po/pt/voice_core.po +new file mode 100644 +index 0000000..07d6093 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-voice-core/po/pt/voice_core.po +@@ -0,0 +1,18 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"PO-Revision-Date: 2013-05-01 00:34+0200\n" ++"Last-Translator: pedromrgoncalves \n" ++"Language-Team: none\n" ++"Language: pt\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n != 1);\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "Phones" ++msgstr "Telefones" ++ ++msgid "Voice" ++msgstr "Voz" +diff --git a/feeds/luci/applications/luci-app-voice-core/po/ro/voice_core.po b/feeds/luci/applications/luci-app-voice-core/po/ro/voice_core.po +new file mode 100644 +index 0000000..1776a51 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-voice-core/po/ro/voice_core.po +@@ -0,0 +1,22 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"PO-Revision-Date: 2013-09-25 19:14+0200\n" ++"Last-Translator: Mihai \n" ++"Language-Team: none\n" ++"Language: ro\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=3; plural=(n==1 ? 0 : (n==0 || (n%100 > 0 && n%100 < " ++"20)) ? 1 : 2);;\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "Phones" ++msgstr "Telefoane" ++ ++msgid "Voice" ++msgstr "Voce" ++ ++#~ msgid "l_v_adminphones" ++#~ msgstr "l_v_adminphones" +diff --git a/feeds/luci/applications/luci-app-voice-core/po/ru/voice_core.po b/feeds/luci/applications/luci-app-voice-core/po/ru/voice_core.po +new file mode 100644 +index 0000000..b6631df +--- /dev/null ++++ b/feeds/luci/applications/luci-app-voice-core/po/ru/voice_core.po +@@ -0,0 +1,24 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: LuCI: voice_core\n" ++"POT-Creation-Date: \n" ++"PO-Revision-Date: 2012-08-15 11:23+0300\n" ++"Last-Translator: Roman A. aka BasicXP \n" ++"Language-Team: Russian \n" ++"Language: ru\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%" ++"10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" ++"X-Generator: Pootle 2.0.6\n" ++"X-Poedit-SourceCharset: UTF-8\n" ++ ++msgid "Phones" ++msgstr "Телефоны" ++ ++msgid "Voice" ++msgstr "ГолоÑ" ++ ++#~ msgid "l_v_adminphones" ++#~ msgstr "l_v_adminphones" +diff --git a/feeds/luci/applications/luci-app-voice-core/po/sk/voice_core.po b/feeds/luci/applications/luci-app-voice-core/po/sk/voice_core.po +new file mode 100644 +index 0000000..9c30581 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-voice-core/po/sk/voice_core.po +@@ -0,0 +1,15 @@ ++msgid "" ++msgstr "" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Last-Translator: Automatically generated\n" ++"Language-Team: none\n" ++"MIME-Version: 1.0\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n" ++ ++msgid "Phones" ++msgstr "" ++ ++msgid "Voice" ++msgstr "" +diff --git a/feeds/luci/applications/luci-app-voice-core/po/sv/voice_core.po b/feeds/luci/applications/luci-app-voice-core/po/sv/voice_core.po +new file mode 100644 +index 0000000..803726a +--- /dev/null ++++ b/feeds/luci/applications/luci-app-voice-core/po/sv/voice_core.po +@@ -0,0 +1,18 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"PO-Revision-Date: 2014-04-28 06:14+0200\n" ++"Last-Translator: Umeaboy \n" ++"Language-Team: none\n" ++"Language: sv\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n != 1);\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "Phones" ++msgstr "Telefoner" ++ ++msgid "Voice" ++msgstr "Röst" +diff --git a/feeds/luci/applications/luci-app-voice-core/po/templates/voice_core.pot b/feeds/luci/applications/luci-app-voice-core/po/templates/voice_core.pot +new file mode 100644 +index 0000000..64c93eb +--- /dev/null ++++ b/feeds/luci/applications/luci-app-voice-core/po/templates/voice_core.pot +@@ -0,0 +1,8 @@ ++msgid "" ++msgstr "Content-Type: text/plain; charset=UTF-8" ++ ++msgid "Phones" ++msgstr "" ++ ++msgid "Voice" ++msgstr "" +diff --git a/feeds/luci/applications/luci-app-voice-core/po/tr/voice_core.po b/feeds/luci/applications/luci-app-voice-core/po/tr/voice_core.po +new file mode 100644 +index 0000000..642538e +--- /dev/null ++++ b/feeds/luci/applications/luci-app-voice-core/po/tr/voice_core.po +@@ -0,0 +1,18 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"PO-Revision-Date: 2012-10-11 22:25+0200\n" ++"Last-Translator: vincenzo \n" ++"Language-Team: none\n" ++"Language: tr\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=1; plural=0;\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "Phones" ++msgstr "Telefonlar" ++ ++msgid "Voice" ++msgstr "Ses" +diff --git a/feeds/luci/applications/luci-app-voice-core/po/uk/voice_core.po b/feeds/luci/applications/luci-app-voice-core/po/uk/voice_core.po +new file mode 100644 +index 0000000..4886d72 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-voice-core/po/uk/voice_core.po +@@ -0,0 +1,22 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"PO-Revision-Date: 2012-12-29 12:56+0200\n" ++"Last-Translator: Yurii \n" ++"Language-Team: none\n" ++"Language: uk\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%" ++"10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "Phones" ++msgstr "Телефони" ++ ++msgid "Voice" ++msgstr "ГолоÑ" ++ ++#~ msgid "l_v_adminphones" ++#~ msgstr "l_v_adminphones" +diff --git a/feeds/luci/applications/luci-app-voice-core/po/vi/voice_core.po b/feeds/luci/applications/luci-app-voice-core/po/vi/voice_core.po +new file mode 100644 +index 0000000..3e45434 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-voice-core/po/vi/voice_core.po +@@ -0,0 +1,15 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Last-Translator: Automatically generated\n" ++"Language-Team: none\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=1; plural=0;\n" ++ ++msgid "Phones" ++msgstr "" ++ ++msgid "Voice" ++msgstr "" +diff --git a/feeds/luci/applications/luci-app-voice-core/po/zh-cn/voice_core.po b/feeds/luci/applications/luci-app-voice-core/po/zh-cn/voice_core.po +new file mode 100644 +index 0000000..0978889 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-voice-core/po/zh-cn/voice_core.po +@@ -0,0 +1,18 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"PO-Revision-Date: 2013-10-08 13:41+0200\n" ++"Last-Translator: Tanyingyu \n" ++"Language-Team: none\n" ++"Language: zh_CN\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=1; plural=0;\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "Phones" ++msgstr "è¯æœº" ++ ++msgid "Voice" ++msgstr "语音" +diff --git a/feeds/luci/applications/luci-app-voice-core/po/zh-tw/voice_core.po b/feeds/luci/applications/luci-app-voice-core/po/zh-tw/voice_core.po +new file mode 100644 +index 0000000..e1bbf7a +--- /dev/null ++++ b/feeds/luci/applications/luci-app-voice-core/po/zh-tw/voice_core.po +@@ -0,0 +1,18 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"PO-Revision-Date: 2014-05-14 10:41+0200\n" ++"Last-Translator: omnistack \n" ++"Language-Team: none\n" ++"Language: zh_TW\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=1; plural=0;\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "Phones" ++msgstr "電話" ++ ++msgid "Voice" ++msgstr "語音" +diff --git a/feeds/luci/applications/luci-app-voice-diag/Makefile b/feeds/luci/applications/luci-app-voice-diag/Makefile +new file mode 100644 +index 0000000..c9c9a20 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-voice-diag/Makefile +@@ -0,0 +1,14 @@ ++# ++# Copyright (C) 2008-2014 The LuCI Team ++# ++# This is free software, licensed under the Apache License, Version 2.0 . ++# ++ ++include $(TOPDIR)/rules.mk ++ ++LUCI_TITLE:=LuCI Voice Software (Diagnostics) ++LUCI_DEPENDS:=+luci-app-diag-devinfo ++ ++include ../../luci.mk ++ ++# call BuildPackage - OpenWrt buildroot signature +diff --git a/feeds/luci/applications/luci-app-voice-diag/luasrc/controller/luci_voice/luci_voice_diag.lua b/feeds/luci/applications/luci-app-voice-diag/luasrc/controller/luci_voice/luci_voice_diag.lua +new file mode 100644 +index 0000000..16a79d9 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-voice-diag/luasrc/controller/luci_voice/luci_voice_diag.lua +@@ -0,0 +1,12 @@ ++-- Copyright 2009 Daniel Dickinson ++-- Licensed to the public under the Apache License 2.0. ++ ++module("luci.controller.luci_voice.luci_voice_diag", package.seeall) ++ ++function index() ++ local e ++ ++ e = entry({"admin", "voice", "diag"}, template("luci_voice/diag_index"), _("Diagnostics"), 90) ++ e.index = true ++ e.dependent = true ++end +diff --git a/feeds/luci/applications/luci-app-voice-diag/luasrc/view/luci_voice/diag_index.htm b/feeds/luci/applications/luci-app-voice-diag/luasrc/view/luci_voice/diag_index.htm +new file mode 100644 +index 0000000..15ccc39 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-voice-diag/luasrc/view/luci_voice/diag_index.htm +@@ -0,0 +1,10 @@ ++<%# ++ Copyright 2009 Daniel Dickinson ++ Licensed to the public under the Apache License 2.0. ++-%> ++ ++<%+header%> ++

    <%:Diagnostics%>

    ++

    <%:Under this menu are options that allow you to configure and perform tests on the voice operations of your system. These are known as diagnostics.%>

    ++

    <%:The diagnostics available on your device depend on the modules that you have installed.%>

    ++<%+footer%> +diff --git a/feeds/luci/applications/luci-app-voice-diag/po/ca/voice_diag.po b/feeds/luci/applications/luci-app-voice-diag/po/ca/voice_diag.po +new file mode 100644 +index 0000000..0396100 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-voice-diag/po/ca/voice_diag.po +@@ -0,0 +1,30 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"PO-Revision-Date: 2014-05-29 02:00+0200\n" ++"Last-Translator: Alex \n" ++"Language-Team: none\n" ++"Language: ca\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n != 1);\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "Diagnostics" ++msgstr "Diagnòstics" ++ ++msgid "" ++"The diagnostics available on your device depend on the modules that you have " ++"installed." ++msgstr "" ++"Els diagnòstics disponibles en el vostre dispositiu depenen dels mòduls que " ++"teniu instal·lats." ++ ++msgid "" ++"Under this menu are options that allow you to configure and perform tests on " ++"the voice operations of your system. These are known as diagnostics." ++msgstr "" ++"En aquest menú estan opcions que us permeten configurar i realitzar proves " ++"en les operacions de veu del vostre sistema. Aquestes es coneixen com " ++"diagnòstics." +diff --git a/feeds/luci/applications/luci-app-voice-diag/po/cs/voice_diag.po b/feeds/luci/applications/luci-app-voice-diag/po/cs/voice_diag.po +new file mode 100644 +index 0000000..4939d20 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-voice-diag/po/cs/voice_diag.po +@@ -0,0 +1,29 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Last-Translator: Automatically generated\n" ++"Language-Team: none\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++ ++msgid "Diagnostics" ++msgstr "Diagnostika" ++ ++msgid "" ++"The diagnostics available on your device depend on the modules that you have " ++"installed." ++msgstr "" ++"Diagnostiky, dostupné na vaÅ¡em zařízení, závisí na modulech, které máte " ++"nainstalovány." ++ ++msgid "" ++"Under this menu are options that allow you to configure and perform tests on " ++"the voice operations of your system. These are known as diagnostics." ++msgstr "" ++"Pod tímto menu se nachází možnosti, které vám umožní nastavovat a provádÄ›t " ++"testy hlasových operací vaÅ¡eho systému. Tyto jsou známy pod názvem " ++"diagnostika." ++ ++#~ msgid "l_v_d_admindiag" ++#~ msgstr "Diagnostika" +diff --git a/feeds/luci/applications/luci-app-voice-diag/po/de/voice_diag.po b/feeds/luci/applications/luci-app-voice-diag/po/de/voice_diag.po +new file mode 100644 +index 0000000..f60dc08 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-voice-diag/po/de/voice_diag.po +@@ -0,0 +1,29 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"PO-Revision-Date: 2011-09-08 15:21+0200\n" ++"Last-Translator: Manuel \n" ++"Language-Team: none\n" ++"Language: de\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n != 1);\n" ++"X-Generator: Pootle 2.0.4\n" ++ ++msgid "Diagnostics" ++msgstr "Diagnose" ++ ++msgid "" ++"The diagnostics available on your device depend on the modules that you have " ++"installed." ++msgstr "" ++"Welche Diagnosetools auf diesem System verfügbar sind hängt davon ab, welche " ++"Module installiert sind." ++ ++msgid "" ++"Under this menu are options that allow you to configure and perform tests on " ++"the voice operations of your system. These are known as diagnostics." ++msgstr "" ++"Unter diesem Menüpunkt können Diagnosetools für sprachbezogene Dienste " ++"konfiguriert und ausgeführt werden." +diff --git a/feeds/luci/applications/luci-app-voice-diag/po/el/voice_diag.po b/feeds/luci/applications/luci-app-voice-diag/po/el/voice_diag.po +new file mode 100644 +index 0000000..4ff4f86 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-voice-diag/po/el/voice_diag.po +@@ -0,0 +1,33 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"PO-Revision-Date: 2012-03-18 17:15+0200\n" ++"Last-Translator: Vasilis \n" ++"Language-Team: none\n" ++"Language: el\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n != 1);\n" ++"X-Generator: Pootle 2.0.4\n" ++ ++msgid "Diagnostics" ++msgstr "Διαγνωστικά" ++ ++msgid "" ++"The diagnostics available on your device depend on the modules that you have " ++"installed." ++msgstr "" ++"Τα διαγνωστικά που είναι διαθέσιμα για την συσκευή σας, εξαÏτώνται από τα " ++"αÏθÏώματα που έχετε εγκατεστημένα." ++ ++msgid "" ++"Under this menu are options that allow you to configure and perform tests on " ++"the voice operations of your system. These are known as diagnostics." ++msgstr "" ++"Κάτω από αυτό το Î¼ÎµÎ½Î¿Ï Î²Ïίσκονται επιλογές που σας επιτÏέπουν να " ++"παÏαμετÏοποιήσετε και να Ï€Ïαγματοποιήσετε δοκιμές στις φωνητικές λειτουÏγίες " ++"του συστήματός σας. Είναι γνωστές ως διαγνωστικά." ++ ++#~ msgid "l_v_d_admindiag" ++#~ msgstr "l_v_d_admindiag" +diff --git a/feeds/luci/applications/luci-app-voice-diag/po/en/voice_diag.po b/feeds/luci/applications/luci-app-voice-diag/po/en/voice_diag.po +new file mode 100644 +index 0000000..12bb459 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-voice-diag/po/en/voice_diag.po +@@ -0,0 +1,34 @@ ++# Voice Diagnostics. ++# Copyright (C) 2009 Daniel Dickinson ++# Daniel Dickinson , 2009. ++# ++#, fuzzy ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"PO-Revision-Date: 2009-07-16 22:26-0400\n" ++"Last-Translator: FULL NAME \n" ++"Language-Team: LANGUAGE \n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++ ++msgid "Diagnostics" ++msgstr "Diagnostics" ++ ++msgid "" ++"The diagnostics available on your device depend on the modules that you have " ++"installed." ++msgstr "" ++"The diagnostics available on your device depend on the modules that you have " ++"installed." ++ ++msgid "" ++"Under this menu are options that allow you to configure and perform tests on " ++"the voice operations of your system. These are known as diagnostics." ++msgstr "" ++"Under this menu are options that allow you to configure and perform tests on " ++"the voice operations of your system. These are known as diagnostics." ++ ++#~ msgid "l_v_d_admindiag" ++#~ msgstr "Diagnostics" +diff --git a/feeds/luci/applications/luci-app-voice-diag/po/es/voice_diag.po b/feeds/luci/applications/luci-app-voice-diag/po/es/voice_diag.po +new file mode 100644 +index 0000000..f2f4da2 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-voice-diag/po/es/voice_diag.po +@@ -0,0 +1,33 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"PO-Revision-Date: 2012-04-16 00:58+0200\n" ++"Last-Translator: Jose \n" ++"Language-Team: none\n" ++"Language: es\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n != 1);\n" ++"X-Generator: Pootle 2.0.4\n" ++ ++msgid "Diagnostics" ++msgstr "Diagnósticos" ++ ++msgid "" ++"The diagnostics available on your device depend on the modules that you have " ++"installed." ++msgstr "" ++"Los tipos de diagnósticos disponibles en el dispositivo dependen de los " ++"módulos que ha instalado." ++ ++msgid "" ++"Under this menu are options that allow you to configure and perform tests on " ++"the voice operations of your system. These are known as diagnostics." ++msgstr "" ++"En este menú hay opciones que permite realizar pruebas de configuración y " ++"funcionamiento de las operaciones de voz en su sistema. Estas opciones se " ++"conocen como diagósticos." ++ ++#~ msgid "l_v_d_admindiag" ++#~ msgstr "l_v_d_admindiag" +diff --git a/feeds/luci/applications/luci-app-voice-diag/po/fr/voice_diag.po b/feeds/luci/applications/luci-app-voice-diag/po/fr/voice_diag.po +new file mode 100644 +index 0000000..c550f06 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-voice-diag/po/fr/voice_diag.po +@@ -0,0 +1,33 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"PO-Revision-Date: 2012-01-15 07:08+0200\n" ++"Last-Translator: desillu \n" ++"Language-Team: none\n" ++"Language: fr\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n > 1);\n" ++"X-Generator: Pootle 2.0.4\n" ++ ++msgid "Diagnostics" ++msgstr "Diagnostics" ++ ++msgid "" ++"The diagnostics available on your device depend on the modules that you have " ++"installed." ++msgstr "" ++"Les diagnostics disponibles pour votre périphérique dépendent des modules " ++"que vous avez installé." ++ ++msgid "" ++"Under this menu are options that allow you to configure and perform tests on " ++"the voice operations of your system. These are known as diagnostics." ++msgstr "" ++"Ce menu contient des options vous permettant de configurer et lancer des " ++"tests sur les fonctions vocales de votre système. Ils sont nommés " ++"diagnostics." ++ ++#~ msgid "l_v_d_admindiag" ++#~ msgstr "l_v_d_admindiag" +diff --git a/feeds/luci/applications/luci-app-voice-diag/po/he/voice_diag.po b/feeds/luci/applications/luci-app-voice-diag/po/he/voice_diag.po +new file mode 100644 +index 0000000..3cd1c9f +--- /dev/null ++++ b/feeds/luci/applications/luci-app-voice-diag/po/he/voice_diag.po +@@ -0,0 +1,22 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Last-Translator: Automatically generated\n" ++"Language-Team: none\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n != 1);\n" ++ ++msgid "Diagnostics" ++msgstr "" ++ ++msgid "" ++"The diagnostics available on your device depend on the modules that you have " ++"installed." ++msgstr "" ++ ++msgid "" ++"Under this menu are options that allow you to configure and perform tests on " ++"the voice operations of your system. These are known as diagnostics." ++msgstr "" +diff --git a/feeds/luci/applications/luci-app-voice-diag/po/hu/voice_diag.po b/feeds/luci/applications/luci-app-voice-diag/po/hu/voice_diag.po +new file mode 100644 +index 0000000..79d2379 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-voice-diag/po/hu/voice_diag.po +@@ -0,0 +1,30 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Last-Translator: Automatically generated\n" ++"Language-Team: none\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n != 1);\n" ++ ++msgid "Diagnostics" ++msgstr "Diagnosztika" ++ ++msgid "" ++"The diagnostics available on your device depend on the modules that you have " ++"installed." ++msgstr "" ++"Az eszközön elérhetÅ‘ diagnosztikai lehetÅ‘ségek a telepített összetevÅ‘ktÅ‘l " ++"függenek." ++ ++msgid "" ++"Under this menu are options that allow you to configure and perform tests on " ++"the voice operations of your system. These are known as diagnostics." ++msgstr "" ++"Ez alatt a menüpont alatt olyan lehetÅ‘ségek vannak, amelyek lehetÅ‘vé teszik, " ++"hogy beállítsa és tesztelje az eszköz hangrendszerének a működését. Ezek " ++"diagnosztikaként ismertek." ++ ++#~ msgid "l_v_d_admindiag" ++#~ msgstr "l_v_d_admindiag" +diff --git a/feeds/luci/applications/luci-app-voice-diag/po/it/voice_diag.po b/feeds/luci/applications/luci-app-voice-diag/po/it/voice_diag.po +new file mode 100644 +index 0000000..620aedf +--- /dev/null ++++ b/feeds/luci/applications/luci-app-voice-diag/po/it/voice_diag.po +@@ -0,0 +1,30 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"PO-Revision-Date: 2013-02-03 14:13+0200\n" ++"Last-Translator: Francesco <3gasas@gmail.com>\n" ++"Language-Team: none\n" ++"Language: it\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n != 1);\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "Diagnostics" ++msgstr "Diagnostiche" ++ ++msgid "" ++"The diagnostics available on your device depend on the modules that you have " ++"installed." ++msgstr "" ++"Le funzioni di diagnostica disponibili sul dispositivo dipendono i moduli " ++"che sono stati installati." ++ ++msgid "" ++"Under this menu are options that allow you to configure and perform tests on " ++"the voice operations of your system. These are known as diagnostics." ++msgstr "" ++"In questo menu ci sono delle opzioni che consentono di configurare ed " ++"eseguire test sulle operazioni vocali del sistema. Questi sono noti come " ++"diagnostica." +diff --git a/feeds/luci/applications/luci-app-voice-diag/po/ja/voice_diag.po b/feeds/luci/applications/luci-app-voice-diag/po/ja/voice_diag.po +new file mode 100644 +index 0000000..715f411 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-voice-diag/po/ja/voice_diag.po +@@ -0,0 +1,22 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Last-Translator: Automatically generated\n" ++"Language-Team: none\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=1; plural=0;\n" ++ ++msgid "Diagnostics" ++msgstr "" ++ ++msgid "" ++"The diagnostics available on your device depend on the modules that you have " ++"installed." ++msgstr "" ++ ++msgid "" ++"Under this menu are options that allow you to configure and perform tests on " ++"the voice operations of your system. These are known as diagnostics." ++msgstr "" +diff --git a/feeds/luci/applications/luci-app-voice-diag/po/ms/voice_diag.po b/feeds/luci/applications/luci-app-voice-diag/po/ms/voice_diag.po +new file mode 100644 +index 0000000..bf65c14 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-voice-diag/po/ms/voice_diag.po +@@ -0,0 +1,21 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Last-Translator: Automatically generated\n" ++"Language-Team: none\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++ ++msgid "Diagnostics" ++msgstr "" ++ ++msgid "" ++"The diagnostics available on your device depend on the modules that you have " ++"installed." ++msgstr "" ++ ++msgid "" ++"Under this menu are options that allow you to configure and perform tests on " ++"the voice operations of your system. These are known as diagnostics." ++msgstr "" +diff --git a/feeds/luci/applications/luci-app-voice-diag/po/no/voice_diag.po b/feeds/luci/applications/luci-app-voice-diag/po/no/voice_diag.po +new file mode 100644 +index 0000000..de7aaf2 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-voice-diag/po/no/voice_diag.po +@@ -0,0 +1,25 @@ ++msgid "" ++msgstr "" ++"Last-Translator: Lars Hardy \n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++ ++msgid "Diagnostics" ++msgstr "Diagnostikk" ++ ++msgid "" ++"The diagnostics available on your device depend on the modules that you have " ++"installed." ++msgstr "" ++"Diagnostikk tilgjengelig pÃ¥ denne enheten avhenger av hvilken moduler som er " ++"installert." ++ ++msgid "" ++"Under this menu are options that allow you to configure and perform tests on " ++"the voice operations of your system. These are known as diagnostics." ++msgstr "" ++"Under denne meny finner du instillinger som gjør det mulig Ã¥ konfigurere og " ++"utføre 'Voice' operasjoner pÃ¥ systemet ditt. Dette er kjent som diagnostikk." ++ ++#~ msgid "l_v_d_admindiag" ++#~ msgstr "Administrasjon Diagnostikk" +diff --git a/feeds/luci/applications/luci-app-voice-diag/po/pl/voice_diag.po b/feeds/luci/applications/luci-app-voice-diag/po/pl/voice_diag.po +new file mode 100644 +index 0000000..cb19e22 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-voice-diag/po/pl/voice_diag.po +@@ -0,0 +1,33 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"PO-Revision-Date: 2011-09-20 12:16+0200\n" ++"Last-Translator: MichaÅ‚ \n" ++"Language-Team: none\n" ++"Language: pl\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 " ++"|| n%100>=20) ? 1 : 2);\n" ++"X-Generator: Pootle 2.0.4\n" ++ ++msgid "Diagnostics" ++msgstr "Diagnostyka" ++ ++msgid "" ++"The diagnostics available on your device depend on the modules that you have " ++"installed." ++msgstr "" ++"Diagnostyka dostÄ™pna na Twoim urzÄ…dzeniu zależna jest od zainstalowanych " ++"modułów." ++ ++msgid "" ++"Under this menu are options that allow you to configure and perform tests on " ++"the voice operations of your system. These are known as diagnostics." ++msgstr "" ++"To menu zawiera opcje pozwalajÄ…ce na konfiguracje i testowanie operacji " ++"gÅ‚osowych w Twoim systemie. Opcje te nazwamy DiagnostykÄ…." ++ ++#~ msgid "l_v_d_admindiag" ++#~ msgstr "l_v_d_admindiag" +diff --git a/feeds/luci/applications/luci-app-voice-diag/po/pt-br/voice_diag.po b/feeds/luci/applications/luci-app-voice-diag/po/pt-br/voice_diag.po +new file mode 100644 +index 0000000..c5d426d +--- /dev/null ++++ b/feeds/luci/applications/luci-app-voice-diag/po/pt-br/voice_diag.po +@@ -0,0 +1,32 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"PO-Revision-Date: 2011-10-11 20:31+0200\n" ++"Last-Translator: Luiz Angelo \n" ++"Language-Team: none\n" ++"Language: pt_BR\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n > 1);\n" ++"X-Generator: Pootle 2.0.4\n" ++ ++msgid "Diagnostics" ++msgstr "Diagnósticos" ++ ++msgid "" ++"The diagnostics available on your device depend on the modules that you have " ++"installed." ++msgstr "" ++"Os diagnósticos disponíveis em seu dispositivo dependem dos módulos que você " ++"instalou." ++ ++msgid "" ++"Under this menu are options that allow you to configure and perform tests on " ++"the voice operations of your system. These are known as diagnostics." ++msgstr "" ++"Neste menu existem opções que permite a configuração e execução de testes " ++"nas operações de voz em seu sistema. Estas são conhecidas como diagósticos." ++ ++#~ msgid "l_v_d_admindiag" ++#~ msgstr "l_v_d_admindiag" +diff --git a/feeds/luci/applications/luci-app-voice-diag/po/pt/voice_diag.po b/feeds/luci/applications/luci-app-voice-diag/po/pt/voice_diag.po +new file mode 100644 +index 0000000..5162c84 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-voice-diag/po/pt/voice_diag.po +@@ -0,0 +1,29 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"PO-Revision-Date: 2013-06-01 00:00+0200\n" ++"Last-Translator: joao.f.vieira \n" ++"Language-Team: none\n" ++"Language: pt\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n != 1);\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "Diagnostics" ++msgstr "Diagnósticos" ++ ++msgid "" ++"The diagnostics available on your device depend on the modules that you have " ++"installed." ++msgstr "" ++"Os diagnósticos disponiveis no dispositivo dependem dos módulos que tem " ++"instalados." ++ ++msgid "" ++"Under this menu are options that allow you to configure and perform tests on " ++"the voice operations of your system. These are known as diagnostics." ++msgstr "" ++"Neste menu há opções que lhe permitem configurar e executar testes nas " ++"operações de voz do seu sistema. Estes são conhecidos como diagnósticos." +diff --git a/feeds/luci/applications/luci-app-voice-diag/po/ro/voice_diag.po b/feeds/luci/applications/luci-app-voice-diag/po/ro/voice_diag.po +new file mode 100644 +index 0000000..e6ee682 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-voice-diag/po/ro/voice_diag.po +@@ -0,0 +1,33 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"PO-Revision-Date: 2011-10-07 16:50+0200\n" ++"Last-Translator: Daniel \n" ++"Language-Team: none\n" ++"Language: ro\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=3; plural=(n==1 ? 0 : (n==0 || (n%100 > 0 && n%100 < " ++"20)) ? 1 : 2);;\n" ++"X-Generator: Pootle 2.0.4\n" ++ ++msgid "Diagnostics" ++msgstr "Diagnosticuri" ++ ++msgid "" ++"The diagnostics available on your device depend on the modules that you have " ++"installed." ++msgstr "" ++"Diagnosticurile disponibile pe dispozitivul tau depind de modulele instalate." ++ ++msgid "" ++"Under this menu are options that allow you to configure and perform tests on " ++"the voice operations of your system. These are known as diagnostics." ++msgstr "" ++"In acest menu sunt optiuni care-ti permit sa configurezi si sa testezi " ++"diferite operatiuni de voce pe sistemul tau. Acestea sunt denumite " ++"diagnostice." ++ ++#~ msgid "l_v_d_admindiag" ++#~ msgstr "l_v_d_admindiag" +diff --git a/feeds/luci/applications/luci-app-voice-diag/po/ru/voice_diag.po b/feeds/luci/applications/luci-app-voice-diag/po/ru/voice_diag.po +new file mode 100644 +index 0000000..5c98de0 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-voice-diag/po/ru/voice_diag.po +@@ -0,0 +1,33 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: LuCI: voice_diag\n" ++"POT-Creation-Date: \n" ++"PO-Revision-Date: 2012-08-15 11:22+0300\n" ++"Last-Translator: Roman A. aka BasicXP \n" ++"Language-Team: Russian \n" ++"Language: ru\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%" ++"10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" ++"X-Generator: Pootle 2.0.4\n" ++"X-Poedit-SourceCharset: UTF-8\n" ++ ++msgid "Diagnostics" ++msgstr "ДиагноÑтика" ++ ++msgid "" ++"The diagnostics available on your device depend on the modules that you have " ++"installed." ++msgstr "ДоÑтупные виды диагноÑтики завиÑÑÑ‚ от уÑтановленных модулей." ++ ++msgid "" ++"Under this menu are options that allow you to configure and perform tests on " ++"the voice operations of your system. These are known as diagnostics." ++msgstr "" ++"Ð’ данном меню ÑодержатÑÑ Ð¾Ð¿Ñ†Ð¸Ð¸, которые позволÑÑŽÑ‚ вам протеÑтировать " ++"голоÑовые Ñлужбы вашей ÑиÑтемы. Это извеÑтно как \"диагноÑтика\"." ++ ++#~ msgid "l_v_d_admindiag" ++#~ msgstr "l_v_d_admindiag" +diff --git a/feeds/luci/applications/luci-app-voice-diag/po/sk/voice_diag.po b/feeds/luci/applications/luci-app-voice-diag/po/sk/voice_diag.po +new file mode 100644 +index 0000000..874e11f +--- /dev/null ++++ b/feeds/luci/applications/luci-app-voice-diag/po/sk/voice_diag.po +@@ -0,0 +1,22 @@ ++msgid "" ++msgstr "" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Last-Translator: Automatically generated\n" ++"Language-Team: none\n" ++"MIME-Version: 1.0\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n" ++ ++msgid "Diagnostics" ++msgstr "" ++ ++msgid "" ++"The diagnostics available on your device depend on the modules that you have " ++"installed." ++msgstr "" ++ ++msgid "" ++"Under this menu are options that allow you to configure and perform tests on " ++"the voice operations of your system. These are known as diagnostics." ++msgstr "" +diff --git a/feeds/luci/applications/luci-app-voice-diag/po/sv/voice_diag.po b/feeds/luci/applications/luci-app-voice-diag/po/sv/voice_diag.po +new file mode 100644 +index 0000000..5caf949 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-voice-diag/po/sv/voice_diag.po +@@ -0,0 +1,23 @@ ++msgid "" ++msgstr "" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Last-Translator: Automatically generated\n" ++"Language-Team: none\n" ++"Language: sv\n" ++"MIME-Version: 1.0\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n != 1);\n" ++ ++msgid "Diagnostics" ++msgstr "" ++ ++msgid "" ++"The diagnostics available on your device depend on the modules that you have " ++"installed." ++msgstr "" ++ ++msgid "" ++"Under this menu are options that allow you to configure and perform tests on " ++"the voice operations of your system. These are known as diagnostics." ++msgstr "" +diff --git a/feeds/luci/applications/luci-app-voice-diag/po/templates/voice_diag.pot b/feeds/luci/applications/luci-app-voice-diag/po/templates/voice_diag.pot +new file mode 100644 +index 0000000..ba28b45 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-voice-diag/po/templates/voice_diag.pot +@@ -0,0 +1,15 @@ ++msgid "" ++msgstr "Content-Type: text/plain; charset=UTF-8" ++ ++msgid "Diagnostics" ++msgstr "" ++ ++msgid "" ++"The diagnostics available on your device depend on the modules that you have " ++"installed." ++msgstr "" ++ ++msgid "" ++"Under this menu are options that allow you to configure and perform tests on " ++"the voice operations of your system. These are known as diagnostics." ++msgstr "" +diff --git a/feeds/luci/applications/luci-app-voice-diag/po/tr/voice_diag.po b/feeds/luci/applications/luci-app-voice-diag/po/tr/voice_diag.po +new file mode 100644 +index 0000000..715f411 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-voice-diag/po/tr/voice_diag.po +@@ -0,0 +1,22 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Last-Translator: Automatically generated\n" ++"Language-Team: none\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=1; plural=0;\n" ++ ++msgid "Diagnostics" ++msgstr "" ++ ++msgid "" ++"The diagnostics available on your device depend on the modules that you have " ++"installed." ++msgstr "" ++ ++msgid "" ++"Under this menu are options that allow you to configure and perform tests on " ++"the voice operations of your system. These are known as diagnostics." ++msgstr "" +diff --git a/feeds/luci/applications/luci-app-voice-diag/po/uk/voice_diag.po b/feeds/luci/applications/luci-app-voice-diag/po/uk/voice_diag.po +new file mode 100644 +index 0000000..60c55ba +--- /dev/null ++++ b/feeds/luci/applications/luci-app-voice-diag/po/uk/voice_diag.po +@@ -0,0 +1,33 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"PO-Revision-Date: 2012-04-28 22:05+0200\n" ++"Last-Translator: Yurii \n" ++"Language-Team: none\n" ++"Language: uk\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%" ++"10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "Diagnostics" ++msgstr "ДіагноÑтика" ++ ++msgid "" ++"The diagnostics available on your device depend on the modules that you have " ++"installed." ++msgstr "" ++"ДоÑтупніÑÑ‚ÑŒ заÑобів діагноÑтики визначаєтьÑÑ Ð¼Ð¾Ð´ÑƒÐ»Ñми, Ñкі ви вÑтановили." ++ ++msgid "" ++"Under this menu are options that allow you to configure and perform tests on " ++"the voice operations of your system. These are known as diagnostics." ++msgstr "" ++"Це меню міÑтить опції, Ñкі дають вам змогу Ñконфігурувати й виконати " ++"теÑÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ð³Ð¾Ð»Ð¾Ñових функцій вашої ÑиÑтеми. Інша Ñ—Ñ… назва - заÑоби " ++"діагноÑтики." ++ ++#~ msgid "l_v_d_admindiag" ++#~ msgstr "l_v_d_admindiag" +diff --git a/feeds/luci/applications/luci-app-voice-diag/po/vi/voice_diag.po b/feeds/luci/applications/luci-app-voice-diag/po/vi/voice_diag.po +new file mode 100644 +index 0000000..715f411 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-voice-diag/po/vi/voice_diag.po +@@ -0,0 +1,22 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Last-Translator: Automatically generated\n" ++"Language-Team: none\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=1; plural=0;\n" ++ ++msgid "Diagnostics" ++msgstr "" ++ ++msgid "" ++"The diagnostics available on your device depend on the modules that you have " ++"installed." ++msgstr "" ++ ++msgid "" ++"Under this menu are options that allow you to configure and perform tests on " ++"the voice operations of your system. These are known as diagnostics." ++msgstr "" +diff --git a/feeds/luci/applications/luci-app-voice-diag/po/zh-cn/voice_diag.po b/feeds/luci/applications/luci-app-voice-diag/po/zh-cn/voice_diag.po +new file mode 100644 +index 0000000..4bad894 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-voice-diag/po/zh-cn/voice_diag.po +@@ -0,0 +1,25 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"PO-Revision-Date: 2013-10-08 13:50+0200\n" ++"Last-Translator: Tanyingyu \n" ++"Language-Team: none\n" ++"Language: zh_CN\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=1; plural=0;\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "Diagnostics" ++msgstr "检测" ++ ++msgid "" ++"The diagnostics available on your device depend on the modules that you have " ++"installed." ++msgstr "检测您已在设备上安装的模å—。" ++ ++msgid "" ++"Under this menu are options that allow you to configure and perform tests on " ++"the voice operations of your system. These are known as diagnostics." ++msgstr "èœå•ä¸‹çš„选项,å…许您é…置和执行语音相关的测试。这些动作称为检测。" +diff --git a/feeds/luci/applications/luci-app-voice-diag/po/zh-tw/voice_diag.po b/feeds/luci/applications/luci-app-voice-diag/po/zh-tw/voice_diag.po +new file mode 100644 +index 0000000..5207a8b +--- /dev/null ++++ b/feeds/luci/applications/luci-app-voice-diag/po/zh-tw/voice_diag.po +@@ -0,0 +1,25 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"PO-Revision-Date: 2014-05-14 10:45+0200\n" ++"Last-Translator: omnistack \n" ++"Language-Team: none\n" ++"Language: zh_TW\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=1; plural=0;\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "Diagnostics" ++msgstr "診斷" ++ ++msgid "" ++"The diagnostics available on your device depend on the modules that you have " ++"installed." ++msgstr "能å¦è¨ºæ–·ä½ çš„設備端看你已安è£çš„模組" ++ ++msgid "" ++"Under this menu are options that allow you to configure and perform tests on " ++"the voice operations of your system. These are known as diagnostics." ++msgstr "é¸å–®ä¸‹æœ‰é¸é …讓你能夠設定並執行測試你系統上的語音æ“作. 這些都是已知的診斷方法" +diff --git a/feeds/luci/applications/luci-app-watchcat/Makefile b/feeds/luci/applications/luci-app-watchcat/Makefile +new file mode 100644 +index 0000000..7ad86c8 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-watchcat/Makefile +@@ -0,0 +1,14 @@ ++# ++# Copyright (C) 2008-2014 The LuCI Team ++# ++# This is free software, licensed under the Apache License, Version 2.0 . ++# ++ ++include $(TOPDIR)/rules.mk ++ ++LUCI_TITLE:=LuCI Support for Watchcat ++LUCI_DEPENDS:=+watchcat ++ ++include ../../luci.mk ++ ++# call BuildPackage - OpenWrt buildroot signature +diff --git a/feeds/luci/applications/luci-app-watchcat/luasrc/controller/watchcat.lua b/feeds/luci/applications/luci-app-watchcat/luasrc/controller/watchcat.lua +new file mode 100644 +index 0000000..27d5b74 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-watchcat/luasrc/controller/watchcat.lua +@@ -0,0 +1,11 @@ ++-- Copyright 2012 Christian Gagneraud ++-- Licensed to the public under the Apache License 2.0. ++ ++module("luci.controller.watchcat", package.seeall) ++ ++function index() ++ if not nixio.fs.access("/etc/config/system") then ++ return ++ end ++ entry({"admin", "services", "watchcat"}, cbi("watchcat/watchcat"), _("Watchcat"), 90) ++end +diff --git a/feeds/luci/applications/luci-app-watchcat/luasrc/model/cbi/watchcat/watchcat.lua b/feeds/luci/applications/luci-app-watchcat/luasrc/model/cbi/watchcat/watchcat.lua +new file mode 100644 +index 0000000..883416b +--- /dev/null ++++ b/feeds/luci/applications/luci-app-watchcat/luasrc/model/cbi/watchcat/watchcat.lua +@@ -0,0 +1,53 @@ ++-- Copyright 2012 Christian Gagneraud ++-- Licensed to the public under the Apache License 2.0. ++ ++m = Map("system", ++ translate("Watchcat"), ++ translate("Watchcat allows configuring a periodic reboot when the " .. ++ "Internet connection has been lost for a certain period of time." ++ )) ++ ++s = m:section(TypedSection, "watchcat") ++s.anonymous = true ++s.addremove = true ++ ++mode = s:option(ListValue, "mode", ++ translate("Operating mode")) ++mode.default = "allways" ++mode:value("ping", "Reboot on internet connection lost") ++mode:value("allways", "Periodic reboot") ++ ++forcedelay = s:option(Value, "forcedelay", ++ translate("Forced reboot delay"), ++ translate("When rebooting the system, the watchcat will trigger a soft reboot. " .. ++ "Entering a non zero value here will trigger a delayed hard reboot " .. ++ "if the soft reboot fails. Enter a number of seconds to enable, " .. ++ "use 0 to disable")) ++forcedelay.datatype = "uinteger" ++forcedelay.default = "0" ++ ++period = s:option(Value, "period", ++ translate("Period"), ++ translate("In periodic mode, it defines the reboot period. " .. ++ "In internet mode, it defines the longest period of " .. ++ "time without internet access before a reboot is engaged." .. ++ "Default unit is seconds, you can use the " .. ++ "suffix 'm' for minutes, 'h' for hours or 'd' " .. ++ "for days")) ++ ++pinghost = s:option(Value, "pinghosts", ++ translate("Ping host"), ++ translate("Host address to ping")) ++pinghost.datatype = "host" ++pinghost.default = "8.8.8.8" ++pinghost:depends({mode="ping"}) ++ ++pingperiod = s:option(Value, "pingperiod", ++ translate("Ping period"), ++ translate("How often to check internet connection. " .. ++ "Default unit is seconds, you can you use the " .. ++ "suffix 'm' for minutes, 'h' for hours or 'd' " .. ++ "for days")) ++pingperiod:depends({mode="ping"}) ++ ++return m +diff --git a/feeds/luci/applications/luci-app-watchcat/po/ca/watchcat.po b/feeds/luci/applications/luci-app-watchcat/po/ca/watchcat.po +new file mode 100644 +index 0000000..36e6405 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-watchcat/po/ca/watchcat.po +@@ -0,0 +1,71 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"PO-Revision-Date: 2014-07-01 05:59+0200\n" ++"Last-Translator: Alex \n" ++"Language-Team: none\n" ++"Language: ca\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n != 1);\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "Forced reboot delay" ++msgstr "Retard de reinici forçat" ++ ++msgid "Host address to ping" ++msgstr "Adreça de host per al ping" ++ ++msgid "" ++"How often to check internet connection. Default unit is seconds, you can you " ++"use the suffix 'm' for minutes, 'h' for hours or 'd' for days" ++msgstr "" ++"Quan sovint que es comprova la connexió a Internet. La unitat per defecte es " ++"el segon, podeu utilitzar el sufix 'm' per minuts, 'h' per hores o 'd' per " ++"dies." ++ ++msgid "" ++"In periodic mode, it defines the reboot period. In internet mode, it defines " ++"the longest period of time without internet access before a reboot is " ++"engaged.Default unit is seconds, you can use the suffix 'm' for minutes, 'h' " ++"for hours or 'd' for days" ++msgstr "" ++"En mode periòdic, defineix el període de reinici. En mode de Internet, " ++"defineix el període més llarg sense accés al Internet abans que un reinici " ++"es comença. La unitat per defecte es el segon, podeu podeu utilitzar el " ++"sufix 'm' per minuts, 'h' per hores o 'd' per dies." ++ ++msgid "Operating mode" ++msgstr "Mode d'operació" ++ ++msgid "Period" ++msgstr "Període" ++ ++msgid "Ping host" ++msgstr "Host de ping" ++ ++msgid "Ping period" ++msgstr "Període de ping" ++ ++msgid "Watchcat" ++msgstr "Watchcat" ++ ++#, fuzzy ++msgid "" ++"Watchcat allows configuring a periodic reboot when the Internet connection " ++"has been lost for a certain period of time." ++msgstr "" ++"El Watchcat permet la configuració d'un reinici periòdic o un reinici quan " ++"la connexió d'Internet ha estat perdut fa un cert període de temps." ++ ++#, fuzzy ++msgid "" ++"When rebooting the system, the watchcat will trigger a soft reboot. Entering " ++"a non zero value here will trigger a delayed hard reboot if the soft reboot " ++"fails. Enter a number of seconds to enable, use 0 to disable" ++msgstr "" ++"Al reiniciar el sistema, el Watchcat causarà un reinici suau. Introduïu un " ++"valor diferent de zero causarà un reinici dur retardat si el reinici suau " ++"falla. Introduïu un nombre de segons per a habilitar, utilitzeu 0 per a " ++"inhabilitar." +diff --git a/feeds/luci/applications/luci-app-watchcat/po/cs/watchcat.po b/feeds/luci/applications/luci-app-watchcat/po/cs/watchcat.po +new file mode 100644 +index 0000000..1bfd435 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-watchcat/po/cs/watchcat.po +@@ -0,0 +1,72 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"PO-Revision-Date: 2012-04-24 15:54+0200\n" ++"Last-Translator: awm1 \n" ++"Language-Team: none\n" ++"Language: cs\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n" ++"X-Generator: Pootle 2.0.4\n" ++ ++msgid "Forced reboot delay" ++msgstr "Prodleva nuceného restartu" ++ ++msgid "Host address to ping" ++msgstr "Adresa zařízení, vůÄi kterému bude testování pÅ™ipojení (ping)" ++ ++msgid "" ++"How often to check internet connection. Default unit is seconds, you can you " ++"use the suffix 'm' for minutes, 'h' for hours or 'd' for days" ++msgstr "" ++"Perioda testování pÅ™ipojení; výchozí Äasovou jednotkou jsou sekundy, avÅ¡ak " ++"použitím přípony \"m\" lze urÄit minuty, pomocí \"h\" hodiny a \"d\" dny" ++ ++msgid "" ++"In periodic mode, it defines the reboot period. In internet mode, it defines " ++"the longest period of time without internet access before a reboot is " ++"engaged.Default unit is seconds, you can use the suffix 'm' for minutes, 'h' " ++"for hours or 'd' for days" ++msgstr "" ++"Pokud je nastaven periodický režim práce, tak tato hodnota vyjadÅ™uje " ++"interval opakování restartu. V 'internetovém' režimu práce hodnota vyjadÅ™uje " ++"nejdelší možnou dobu, po kterou smí být zařízení bez pÅ™ipojení k internetu, " ++"resp. nastavenému testovacímu zařízení - po jejím uplynutí je proveden " ++"automaticky reset. Výchozí jednotkou jsou sekundy, pomocí přípony \"m\" lze " ++"nastavit minuty, pomocí \"h\" hodiny a prostÅ™ednictvím \"d\" dny" ++ ++msgid "Operating mode" ++msgstr "Pracovní režim" ++ ++msgid "Period" ++msgstr "Perioda" ++ ++msgid "Ping host" ++msgstr "Cílové zařízení příkazu ping" ++ ++msgid "Ping period" ++msgstr "Interval opakování testu ping" ++ ++msgid "Watchcat" ++msgstr "Watchcat" ++ ++#, fuzzy ++msgid "" ++"Watchcat allows configuring a periodic reboot when the Internet connection " ++"has been lost for a certain period of time." ++msgstr "" ++"Nástroj Watchcat umožňuje nastavit periodický interval restartu zařízení a/" ++"nebo provést restart i tehdy, když dojde ke ztrátÄ› pÅ™ipojení k internetu/" ++"danému zařízení po stanovenou dobu" ++ ++#, fuzzy ++msgid "" ++"When rebooting the system, the watchcat will trigger a soft reboot. Entering " ++"a non zero value here will trigger a delayed hard reboot if the soft reboot " ++"fails. Enter a number of seconds to enable, use 0 to disable" ++msgstr "" ++"Pokud je nutno restartovat systém, provede Watchcat \"mÄ›kký\" restart " ++"(hodnota 0); zadáním nenulové hodnoty nastavíte interval (v sekundách), za " ++"který program provede \"tvrdý\" restart, pokud \"mÄ›kký\" selže." +diff --git a/feeds/luci/applications/luci-app-watchcat/po/de/watchcat.po b/feeds/luci/applications/luci-app-watchcat/po/de/watchcat.po +new file mode 100644 +index 0000000..1bbc6d5 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-watchcat/po/de/watchcat.po +@@ -0,0 +1,72 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"PO-Revision-Date: 2013-01-28 22:40+0200\n" ++"Last-Translator: DAC324 \n" ++"Language-Team: none\n" ++"Language: de\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n != 1);\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "Forced reboot delay" ++msgstr "Erzwungenen Neustart verzögern um" ++ ++msgid "Host address to ping" ++msgstr "Anzupingende Host-Adresse" ++ ++msgid "" ++"How often to check internet connection. Default unit is seconds, you can you " ++"use the suffix 'm' for minutes, 'h' for hours or 'd' for days" ++msgstr "" ++"Wie oft soll die Internetverbindung überprüft werden. Standart-Einheit in " ++"Sekunden, kann aber durch angehängtes 'm' in Minuten, 'h' in Stunden und 'd' " ++"in Tage geändert werden." ++ ++msgid "" ++"In periodic mode, it defines the reboot period. In internet mode, it defines " ++"the longest period of time without internet access before a reboot is " ++"engaged.Default unit is seconds, you can use the suffix 'm' for minutes, 'h' " ++"for hours or 'd' for days" ++msgstr "" ++"Im periodischen Modus gibt er die Zeitdauer für einen Neustart an. Im " ++"Internet-Modus gibt er die längste Zeitdauer ohne Internetzugang an, nach " ++"der ein Neustart durchgeführt wird. Voreingestellte Einheit ist Sekunden, " ++"Sie können aber die Endungen 'm' für Minuten, 'h' für Stunden und 'd' für " ++"Tage benutzen." ++ ++msgid "Operating mode" ++msgstr "Betriebsart" ++ ++msgid "Period" ++msgstr "Periode" ++ ++msgid "Ping host" ++msgstr "Ping-Host" ++ ++msgid "Ping period" ++msgstr "Ping-Zeitdauer" ++ ++msgid "Watchcat" ++msgstr "Watchcat" ++ ++#, fuzzy ++msgid "" ++"Watchcat allows configuring a periodic reboot when the Internet connection " ++"has been lost for a certain period of time." ++msgstr "" ++"Watchcat erlaubt die Einstellung eines automatischen Neustarts, wenn die " ++"Internetverbindung eine bestimmte Zeitlang ausgefallen ist." ++ ++#, fuzzy ++msgid "" ++"When rebooting the system, the watchcat will trigger a soft reboot. Entering " ++"a non zero value here will trigger a delayed hard reboot if the soft reboot " ++"fails. Enter a number of seconds to enable, use 0 to disable" ++msgstr "" ++"Bei einem Neustart des Systems wird Watchcat einen Warmstart auslösen, wird " ++"hier ein Wert ungleich Null eingegeben, wird ein Kaltstart ausgelöst, sollte " ++"der Warmstart fehlschlagen. Geben Sie eine Zahl in Sekunden zur Aktivierung " ++"an, 0 schaltet diese Funktion aus." +diff --git a/feeds/luci/applications/luci-app-watchcat/po/el/watchcat.po b/feeds/luci/applications/luci-app-watchcat/po/el/watchcat.po +new file mode 100644 +index 0000000..4aa0c6b +--- /dev/null ++++ b/feeds/luci/applications/luci-app-watchcat/po/el/watchcat.po +@@ -0,0 +1,53 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Last-Translator: Automatically generated\n" ++"Language-Team: none\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n != 1);\n" ++ ++msgid "Forced reboot delay" ++msgstr "" ++ ++msgid "Host address to ping" ++msgstr "" ++ ++msgid "" ++"How often to check internet connection. Default unit is seconds, you can you " ++"use the suffix 'm' for minutes, 'h' for hours or 'd' for days" ++msgstr "" ++ ++msgid "" ++"In periodic mode, it defines the reboot period. In internet mode, it defines " ++"the longest period of time without internet access before a reboot is " ++"engaged.Default unit is seconds, you can use the suffix 'm' for minutes, 'h' " ++"for hours or 'd' for days" ++msgstr "" ++ ++msgid "Operating mode" ++msgstr "" ++ ++msgid "Period" ++msgstr "" ++ ++msgid "Ping host" ++msgstr "" ++ ++msgid "Ping period" ++msgstr "" ++ ++msgid "Watchcat" ++msgstr "" ++ ++msgid "" ++"Watchcat allows configuring a periodic reboot when the Internet connection " ++"has been lost for a certain period of time." ++msgstr "" ++ ++msgid "" ++"When rebooting the system, the watchcat will trigger a soft reboot. Entering " ++"a non zero value here will trigger a delayed hard reboot if the soft reboot " ++"fails. Enter a number of seconds to enable, use 0 to disable" ++msgstr "" +diff --git a/feeds/luci/applications/luci-app-watchcat/po/en/watchcat.po b/feeds/luci/applications/luci-app-watchcat/po/en/watchcat.po +new file mode 100644 +index 0000000..0f9099c +--- /dev/null ++++ b/feeds/luci/applications/luci-app-watchcat/po/en/watchcat.po +@@ -0,0 +1,66 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Last-Translator: Automatically generated\n" ++"Language-Team: none\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n != 1);\n" ++ ++msgid "Forced reboot delay" ++msgstr "Forced reboot delay" ++ ++msgid "Host address to ping" ++msgstr "Host address to ping" ++ ++msgid "" ++"How often to check internet connection. Default unit is seconds, you can you " ++"use the suffix 'm' for minutes, 'h' for hours or 'd' for days" ++msgstr "" ++"How often to check internet connection. Default unit is seconds, you can you " ++"use the suffix 'm' for minutes, 'h' for hours or 'd' for days" ++ ++msgid "" ++"In periodic mode, it defines the reboot period. In internet mode, it defines " ++"the longest period of time without internet access before a reboot is " ++"engaged.Default unit is seconds, you can use the suffix 'm' for minutes, 'h' " ++"for hours or 'd' for days" ++msgstr "" ++"In periodic mode, it defines the reboot period. In internet mode, it defines " ++"the longest period of time without internet access before a reboot is " ++"engaged.Default unit is seconds, you can use the suffix 'm' for minutes, 'h' " ++"for hours or 'd' for days" ++ ++msgid "Operating mode" ++msgstr "Operating mode" ++ ++msgid "Period" ++msgstr "Period" ++ ++msgid "Ping host" ++msgstr "Ping host" ++ ++msgid "Ping period" ++msgstr "Ping period" ++ ++msgid "Watchcat" ++msgstr "Watchcat" ++ ++#, fuzzy ++msgid "" ++"Watchcat allows configuring a periodic reboot when the Internet connection " ++"has been lost for a certain period of time." ++msgstr "" ++"Watchcat allows to configure a periodic reboot and/or when internet " ++"connection has been lost for a certain period of time." ++ ++#, fuzzy ++msgid "" ++"When rebooting the system, the watchcat will trigger a soft reboot. Entering " ++"a non zero value here will trigger a delayed hard reboot if the soft reboot " ++"fails. Enter a number of seconds to enable, use 0 to disable" ++msgstr "" ++"When rebooting the system the watchcat will trigger a soft reboot, Entering " ++"a non zero value here, will trigger a delayed hard reboot if the soft reboot " ++"fails. Enter a number of seconds to enable, use 0 to disable" +diff --git a/feeds/luci/applications/luci-app-watchcat/po/es/watchcat.po b/feeds/luci/applications/luci-app-watchcat/po/es/watchcat.po +new file mode 100644 +index 0000000..c1f58fe +--- /dev/null ++++ b/feeds/luci/applications/luci-app-watchcat/po/es/watchcat.po +@@ -0,0 +1,68 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"PO-Revision-Date: 2012-08-23 23:07+0200\n" ++"Last-Translator: José Vicente \n" ++"Language-Team: none\n" ++"Language: es\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n != 1);\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "Forced reboot delay" ++msgstr "Espera para forzar reinicio" ++ ++msgid "Host address to ping" ++msgstr "Dirección de máquina a la que hacer ping" ++ ++msgid "" ++"How often to check internet connection. Default unit is seconds, you can you " ++"use the suffix 'm' for minutes, 'h' for hours or 'd' for days" ++msgstr "" ++"Cada cuánto comprobar la conexión a internet. Por defecto son segundos, pero " ++"puede añadir 'm' para minutos, 'h' para horas o 'd' para días" ++ ++msgid "" ++"In periodic mode, it defines the reboot period. In internet mode, it defines " ++"the longest period of time without internet access before a reboot is " ++"engaged.Default unit is seconds, you can use the suffix 'm' for minutes, 'h' " ++"for hours or 'd' for days" ++msgstr "" ++"En modo periódico define el período de rearranque. En modo internet define " ++"el mayor período de tiempo sin acceso a internet antes de provocar un " ++"reinicio. Por defecto son segundos, pero puede añadir 'm' para minutos, 'h' " ++"para horas o 'd' para días" ++ ++msgid "Operating mode" ++msgstr "Modo de operar" ++ ++msgid "Period" ++msgstr "Período" ++ ++msgid "Ping host" ++msgstr "Máquina a la que hacer ping" ++ ++msgid "Ping period" ++msgstr "Período de ping" ++ ++msgid "Watchcat" ++msgstr "Watchcat" ++ ++#, fuzzy ++msgid "" ++"Watchcat allows configuring a periodic reboot when the Internet connection " ++"has been lost for a certain period of time." ++msgstr "" ++"Watchcat permite configurar un reinicio periódico si la conexión a internet " ++"si pierde durante un cierto tiempo." ++ ++#, fuzzy ++msgid "" ++"When rebooting the system, the watchcat will trigger a soft reboot. Entering " ++"a non zero value here will trigger a delayed hard reboot if the soft reboot " ++"fails. Enter a number of seconds to enable, use 0 to disable" ++msgstr "" ++"Watchcat provocará por defecto un reinicio suave. Poniendo un valor mayor " ++"que cero se provocará un reinicio completo si el anterior ha fallado" +diff --git a/feeds/luci/applications/luci-app-watchcat/po/fr/watchcat.po b/feeds/luci/applications/luci-app-watchcat/po/fr/watchcat.po +new file mode 100644 +index 0000000..23af469 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-watchcat/po/fr/watchcat.po +@@ -0,0 +1,53 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Last-Translator: Automatically generated\n" ++"Language-Team: none\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n > 1);\n" ++ ++msgid "Forced reboot delay" ++msgstr "" ++ ++msgid "Host address to ping" ++msgstr "" ++ ++msgid "" ++"How often to check internet connection. Default unit is seconds, you can you " ++"use the suffix 'm' for minutes, 'h' for hours or 'd' for days" ++msgstr "" ++ ++msgid "" ++"In periodic mode, it defines the reboot period. In internet mode, it defines " ++"the longest period of time without internet access before a reboot is " ++"engaged.Default unit is seconds, you can use the suffix 'm' for minutes, 'h' " ++"for hours or 'd' for days" ++msgstr "" ++ ++msgid "Operating mode" ++msgstr "" ++ ++msgid "Period" ++msgstr "" ++ ++msgid "Ping host" ++msgstr "" ++ ++msgid "Ping period" ++msgstr "" ++ ++msgid "Watchcat" ++msgstr "" ++ ++msgid "" ++"Watchcat allows configuring a periodic reboot when the Internet connection " ++"has been lost for a certain period of time." ++msgstr "" ++ ++msgid "" ++"When rebooting the system, the watchcat will trigger a soft reboot. Entering " ++"a non zero value here will trigger a delayed hard reboot if the soft reboot " ++"fails. Enter a number of seconds to enable, use 0 to disable" ++msgstr "" +diff --git a/feeds/luci/applications/luci-app-watchcat/po/he/watchcat.po b/feeds/luci/applications/luci-app-watchcat/po/he/watchcat.po +new file mode 100644 +index 0000000..4aa0c6b +--- /dev/null ++++ b/feeds/luci/applications/luci-app-watchcat/po/he/watchcat.po +@@ -0,0 +1,53 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Last-Translator: Automatically generated\n" ++"Language-Team: none\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n != 1);\n" ++ ++msgid "Forced reboot delay" ++msgstr "" ++ ++msgid "Host address to ping" ++msgstr "" ++ ++msgid "" ++"How often to check internet connection. Default unit is seconds, you can you " ++"use the suffix 'm' for minutes, 'h' for hours or 'd' for days" ++msgstr "" ++ ++msgid "" ++"In periodic mode, it defines the reboot period. In internet mode, it defines " ++"the longest period of time without internet access before a reboot is " ++"engaged.Default unit is seconds, you can use the suffix 'm' for minutes, 'h' " ++"for hours or 'd' for days" ++msgstr "" ++ ++msgid "Operating mode" ++msgstr "" ++ ++msgid "Period" ++msgstr "" ++ ++msgid "Ping host" ++msgstr "" ++ ++msgid "Ping period" ++msgstr "" ++ ++msgid "Watchcat" ++msgstr "" ++ ++msgid "" ++"Watchcat allows configuring a periodic reboot when the Internet connection " ++"has been lost for a certain period of time." ++msgstr "" ++ ++msgid "" ++"When rebooting the system, the watchcat will trigger a soft reboot. Entering " ++"a non zero value here will trigger a delayed hard reboot if the soft reboot " ++"fails. Enter a number of seconds to enable, use 0 to disable" ++msgstr "" +diff --git a/feeds/luci/applications/luci-app-watchcat/po/hu/watchcat.po b/feeds/luci/applications/luci-app-watchcat/po/hu/watchcat.po +new file mode 100644 +index 0000000..253eb77 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-watchcat/po/hu/watchcat.po +@@ -0,0 +1,64 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"PO-Revision-Date: 2014-01-31 18:09+0200\n" ++"Last-Translator: Sixtus \n" ++"Language-Team: none\n" ++"Language: hu\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n != 1);\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "Forced reboot delay" ++msgstr "Kényszerített újraindítás késleltetése" ++ ++#, fuzzy ++msgid "Host address to ping" ++msgstr "PingelendÅ‘ szerver címe" ++ ++msgid "" ++"How often to check internet connection. Default unit is seconds, you can you " ++"use the suffix 'm' for minutes, 'h' for hours or 'd' for days" ++msgstr "" ++"Internet kapcsolat ellenÅ‘rzésének gyakorisága. Alapértelmezett egység a " ++"másodperc, percekhez használd az 'm', órákhoz a 'h', vagy napokhoz a 'd' " ++"utótagot." ++ ++msgid "" ++"In periodic mode, it defines the reboot period. In internet mode, it defines " ++"the longest period of time without internet access before a reboot is " ++"engaged.Default unit is seconds, you can use the suffix 'm' for minutes, 'h' " ++"for hours or 'd' for days" ++msgstr "" ++"Periodikus üzemmódban ez határozza meg az újraindítás gyakoriságát. Internet " ++"üzemmódban meghatározza a leghosszabb idÅ‘t újraindításig, amikor nincs " ++"internet kapcsolat. Alapértelmezett egység a másodperc, percekhez használd " ++"az 'm', órákhoz a 'h', vagy napokhoz a 'd' utótagot." ++ ++msgid "Operating mode" ++msgstr "Ãœzemmód" ++ ++msgid "Period" ++msgstr "Periódus" ++ ++msgid "Ping host" ++msgstr "Ping címe" ++ ++msgid "Ping period" ++msgstr "Pingelések közti idÅ‘" ++ ++msgid "Watchcat" ++msgstr "" ++ ++msgid "" ++"Watchcat allows configuring a periodic reboot when the Internet connection " ++"has been lost for a certain period of time." ++msgstr "" ++ ++msgid "" ++"When rebooting the system, the watchcat will trigger a soft reboot. Entering " ++"a non zero value here will trigger a delayed hard reboot if the soft reboot " ++"fails. Enter a number of seconds to enable, use 0 to disable" ++msgstr "" +diff --git a/feeds/luci/applications/luci-app-watchcat/po/it/watchcat.po b/feeds/luci/applications/luci-app-watchcat/po/it/watchcat.po +new file mode 100644 +index 0000000..0acdd18 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-watchcat/po/it/watchcat.po +@@ -0,0 +1,72 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"PO-Revision-Date: 2013-02-03 14:12+0200\n" ++"Last-Translator: Francesco <3gasas@gmail.com>\n" ++"Language-Team: none\n" ++"Language: it\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n != 1);\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "Forced reboot delay" ++msgstr "Ritardo riavvio forzato" ++ ++msgid "Host address to ping" ++msgstr "Indirizzo dell'host da pingare" ++ ++msgid "" ++"How often to check internet connection. Default unit is seconds, you can you " ++"use the suffix 'm' for minutes, 'h' for hours or 'd' for days" ++msgstr "" ++"Ogni quanto si vuole controllare la connessione. Di default espresso in " ++"secondi, puoi usare il sufisso 'm' per i minuti, 'h' per le ore o 'd' per i " ++"giorni" ++ ++msgid "" ++"In periodic mode, it defines the reboot period. In internet mode, it defines " ++"the longest period of time without internet access before a reboot is " ++"engaged.Default unit is seconds, you can use the suffix 'm' for minutes, 'h' " ++"for hours or 'd' for days" ++msgstr "" ++"In modalità periodica, definisce il periodo di riavvio. In modalità " ++"internet, definisce il più lungo periodo del tempo senza connessione " ++"internet prima di un riavvio è pianificato. L'unità predefinita è in " ++"secondi, si può usare il suffisso 'm' per i minuti, 'h' per le ore o 'd' per " ++"i giorni." ++ ++msgid "Operating mode" ++msgstr "Modalità" ++ ++msgid "Period" ++msgstr "Periodo" ++ ++msgid "Ping host" ++msgstr "Ping host" ++ ++msgid "Ping period" ++msgstr "Periodo del Ping" ++ ++msgid "Watchcat" ++msgstr "Watchcat" ++ ++#, fuzzy ++msgid "" ++"Watchcat allows configuring a periodic reboot when the Internet connection " ++"has been lost for a certain period of time." ++msgstr "" ++"Watchcat ti permette di configurare un riavvio periodico quando la " ++"connessione a internet è stata persa per un certo periodo." ++ ++#, fuzzy ++msgid "" ++"When rebooting the system, the watchcat will trigger a soft reboot. Entering " ++"a non zero value here will trigger a delayed hard reboot if the soft reboot " ++"fails. Enter a number of seconds to enable, use 0 to disable" ++msgstr "" ++"Quando watchcat vuole riavviare il sistema usa un soft reboot, immetendo un " ++"valore diverso da 0 in questo campo il proverà un hard reboot se il soft " ++"reboot fallisce. Inserire un numero espresso in secondi per abilitare, usa 0 " ++"per disabilitare" +diff --git a/feeds/luci/applications/luci-app-watchcat/po/ja/watchcat.po b/feeds/luci/applications/luci-app-watchcat/po/ja/watchcat.po +new file mode 100644 +index 0000000..1ae0eb4 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-watchcat/po/ja/watchcat.po +@@ -0,0 +1,70 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"PO-Revision-Date: 2013-10-06 17:09+0200\n" ++"Last-Translator: Kentaro \n" ++"Language-Team: none\n" ++"Language: ja\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=1; plural=0;\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "Forced reboot delay" ++msgstr "強制å†èµ·å‹•ãƒ‡ã‚£ãƒ¬ã‚¤æ™‚é–“" ++ ++msgid "Host address to ping" ++msgstr "ping を実行ã™ã‚‹å®›å…ˆã‚’設定ã—ã¦ãã ã•ã„。" ++ ++msgid "" ++"How often to check internet connection. Default unit is seconds, you can you " ++"use the suffix 'm' for minutes, 'h' for hours or 'd' for days" ++msgstr "" ++"ã©ã®ç¨‹åº¦ã®é–“éš”ã§ã‚¤ãƒ³ã‚¿ãƒ¼ãƒãƒƒãƒˆæŽ¥ç¶šã‚’ãƒã‚§ãƒƒã‚¯ã™ã‚‹ã‹è¨­å®šã—ã¾ã™ã€‚標準ã®å˜ä½ã¯ç§’" ++"ã§ã™ãŒã€'m'を接尾ã«ä»˜ã‘ã‚‹ã¨åˆ†ã€'h'を付ã‘ã‚‹ã¨æ™‚ã€'d'を付ã‘ã‚‹ã¨æ—¥æ•°ã«è¨­å®šã•ã‚Œã¾" ++"ã™ã€‚" ++ ++msgid "" ++"In periodic mode, it defines the reboot period. In internet mode, it defines " ++"the longest period of time without internet access before a reboot is " ++"engaged.Default unit is seconds, you can use the suffix 'm' for minutes, 'h' " ++"for hours or 'd' for days" ++msgstr "" ++"定期動作モードã®å ´åˆã€å†èµ·å‹•ã™ã‚‹å‘¨æœŸã‚’設定ã—ã¾ã™ã€‚インターãƒãƒƒãƒˆãƒ¢ãƒ¼ãƒ‰ã®å ´" ++"åˆã€ã‚¤ãƒ³ã‚¿ãƒ¼ãƒãƒƒãƒˆæŽ¥ç¶šãŒåˆ‡æ–­çŠ¶æ…‹ã«ã‚る許容ã™ã‚‹æœŸé–“を設定ã—ã¾ã™ã€‚標準ã®å˜ä½ã¯" ++"秒ã§ã™ãŒã€'m'を接尾ã«ä»˜ã‘ã‚‹ã¨åˆ†ã€'h'を付ã‘ã‚‹ã¨æ™‚ã€'d'を付ã‘ã‚‹ã¨æ—¥æ•°ã«è¨­å®šã•ã‚Œ" ++"ã¾ã™ã€‚" ++ ++msgid "Operating mode" ++msgstr "動作モード" ++ ++msgid "Period" ++msgstr "周期" ++ ++msgid "Ping host" ++msgstr "Ping 宛先ホスト" ++ ++msgid "Ping period" ++msgstr "Ping é–“éš”" ++ ++msgid "Watchcat" ++msgstr "Watchcat" ++ ++#, fuzzy ++msgid "" ++"Watchcat allows configuring a periodic reboot when the Internet connection " ++"has been lost for a certain period of time." ++msgstr "" ++"Watchcatã§ã¯ã€å®šæœŸçš„ãªå†èµ·å‹•ã‚„ã€ã‚¤ãƒ³ã‚¿ãƒ¼ãƒãƒƒãƒˆæŽ¥ç¶šãŒä¸€å®šæœŸé–“切断ã•ã‚ŒãŸéš›ã®å†" ++"èµ·å‹•ã‚’è¡Œã†ã‚ˆã†ãªè¨­å®šãŒå¯èƒ½ã§ã™ã€‚" ++ ++#, fuzzy ++msgid "" ++"When rebooting the system, the watchcat will trigger a soft reboot. Entering " ++"a non zero value here will trigger a delayed hard reboot if the soft reboot " ++"fails. Enter a number of seconds to enable, use 0 to disable" ++msgstr "" ++"å†èµ·å‹•æ™‚ã«watchcatã¯ã‚½ãƒ•ãƒˆã‚¦ã‚§ã‚¢ãƒªã‚»ãƒƒãƒˆã‚’実行ã—ã¾ã™ãŒã€0以外ã®å€¤ã‚’設定ã—ãŸå ´" ++"åˆã€ã‚½ãƒ•ãƒˆã‚¦ã‚§ã‚¢ãƒªã‚»ãƒƒãƒˆãŒå¤±æ•—ã—ãŸéš›ã«è¨­å®šã•ã‚ŒãŸç§’数後ã«ãƒãƒ¼ãƒ‰ã‚¦ã‚§ã‚¢ãƒªã‚»ãƒƒãƒˆ" ++"ã‚’è¡Œã„ã¾ã™ã€‚0を設定ã—ãŸå ´åˆã¯ç„¡åŠ¹ã«ãªã‚Šã¾ã™ã€‚" +diff --git a/feeds/luci/applications/luci-app-watchcat/po/ms/watchcat.po b/feeds/luci/applications/luci-app-watchcat/po/ms/watchcat.po +new file mode 100644 +index 0000000..0da283c +--- /dev/null ++++ b/feeds/luci/applications/luci-app-watchcat/po/ms/watchcat.po +@@ -0,0 +1,52 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Last-Translator: Automatically generated\n" ++"Language-Team: none\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++ ++msgid "Forced reboot delay" ++msgstr "" ++ ++msgid "Host address to ping" ++msgstr "" ++ ++msgid "" ++"How often to check internet connection. Default unit is seconds, you can you " ++"use the suffix 'm' for minutes, 'h' for hours or 'd' for days" ++msgstr "" ++ ++msgid "" ++"In periodic mode, it defines the reboot period. In internet mode, it defines " ++"the longest period of time without internet access before a reboot is " ++"engaged.Default unit is seconds, you can use the suffix 'm' for minutes, 'h' " ++"for hours or 'd' for days" ++msgstr "" ++ ++msgid "Operating mode" ++msgstr "" ++ ++msgid "Period" ++msgstr "" ++ ++msgid "Ping host" ++msgstr "" ++ ++msgid "Ping period" ++msgstr "" ++ ++msgid "Watchcat" ++msgstr "" ++ ++msgid "" ++"Watchcat allows configuring a periodic reboot when the Internet connection " ++"has been lost for a certain period of time." ++msgstr "" ++ ++msgid "" ++"When rebooting the system, the watchcat will trigger a soft reboot. Entering " ++"a non zero value here will trigger a delayed hard reboot if the soft reboot " ++"fails. Enter a number of seconds to enable, use 0 to disable" ++msgstr "" +diff --git a/feeds/luci/applications/luci-app-watchcat/po/no/watchcat.po b/feeds/luci/applications/luci-app-watchcat/po/no/watchcat.po +new file mode 100644 +index 0000000..4aa0c6b +--- /dev/null ++++ b/feeds/luci/applications/luci-app-watchcat/po/no/watchcat.po +@@ -0,0 +1,53 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Last-Translator: Automatically generated\n" ++"Language-Team: none\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n != 1);\n" ++ ++msgid "Forced reboot delay" ++msgstr "" ++ ++msgid "Host address to ping" ++msgstr "" ++ ++msgid "" ++"How often to check internet connection. Default unit is seconds, you can you " ++"use the suffix 'm' for minutes, 'h' for hours or 'd' for days" ++msgstr "" ++ ++msgid "" ++"In periodic mode, it defines the reboot period. In internet mode, it defines " ++"the longest period of time without internet access before a reboot is " ++"engaged.Default unit is seconds, you can use the suffix 'm' for minutes, 'h' " ++"for hours or 'd' for days" ++msgstr "" ++ ++msgid "Operating mode" ++msgstr "" ++ ++msgid "Period" ++msgstr "" ++ ++msgid "Ping host" ++msgstr "" ++ ++msgid "Ping period" ++msgstr "" ++ ++msgid "Watchcat" ++msgstr "" ++ ++msgid "" ++"Watchcat allows configuring a periodic reboot when the Internet connection " ++"has been lost for a certain period of time." ++msgstr "" ++ ++msgid "" ++"When rebooting the system, the watchcat will trigger a soft reboot. Entering " ++"a non zero value here will trigger a delayed hard reboot if the soft reboot " ++"fails. Enter a number of seconds to enable, use 0 to disable" ++msgstr "" +diff --git a/feeds/luci/applications/luci-app-watchcat/po/pl/watchcat.po b/feeds/luci/applications/luci-app-watchcat/po/pl/watchcat.po +new file mode 100644 +index 0000000..ebb67ee +--- /dev/null ++++ b/feeds/luci/applications/luci-app-watchcat/po/pl/watchcat.po +@@ -0,0 +1,71 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"PO-Revision-Date: 2012-04-21 02:13+0200\n" ++"Last-Translator: Tomecki \n" ++"Language-Team: none\n" ++"Language: pl\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 " ++"|| n%100>=20) ? 1 : 2);\n" ++"X-Generator: Pootle 2.0.4\n" ++ ++msgid "Forced reboot delay" ++msgstr "Wymuszone opóźnienie restartu" ++ ++msgid "Host address to ping" ++msgstr "Adres hosta do pingowania" ++ ++msgid "" ++"How often to check internet connection. Default unit is seconds, you can you " ++"use the suffix 'm' for minutes, 'h' for hours or 'd' for days" ++msgstr "" ++"Jak czÄ™sto sprawdzać poÅ‚Ä…czenie internetowe. DomyÅ›lnÄ… jednostkÄ… jest " ++"sekunda, można także użyć 'm' dla minut, 'h' dla godzin lub 'd' dla dni" ++ ++msgid "" ++"In periodic mode, it defines the reboot period. In internet mode, it defines " ++"the longest period of time without internet access before a reboot is " ++"engaged.Default unit is seconds, you can use the suffix 'm' for minutes, 'h' " ++"for hours or 'd' for days" ++msgstr "" ++"W trybie okresowym, okreÅ›la to restart. W trybie internetowym, okreÅ›la " ++"najdÅ‚uższy okres czasu bez dostÄ™pu do internetu przed restartem. DomyÅ›lnÄ… " ++"jednostkÄ… jest sekunda, można także użyć 'm' dla minut, 'h' dla godzin lub " ++"'d' dla dni" ++ ++msgid "Operating mode" ++msgstr "Tryb pracy" ++ ++msgid "Period" ++msgstr "Okres" ++ ++msgid "Ping host" ++msgstr "Host do pingowania" ++ ++msgid "Ping period" ++msgstr "Czas pomiÄ™dzy wysyÅ‚aniem pingów" ++ ++msgid "Watchcat" ++msgstr "Watchcat" ++ ++#, fuzzy ++msgid "" ++"Watchcat allows configuring a periodic reboot when the Internet connection " ++"has been lost for a certain period of time." ++msgstr "" ++"Watchcat pozwala na skonfigurowanie okresowych restartów, jeÅ›li poÅ‚Ä…czenie " ++"internetowe zostanie utracone na okreÅ›lony czas." ++ ++#, fuzzy ++msgid "" ++"When rebooting the system, the watchcat will trigger a soft reboot. Entering " ++"a non zero value here will trigger a delayed hard reboot if the soft reboot " ++"fails. Enter a number of seconds to enable, use 0 to disable" ++msgstr "" ++"Restart routera Watchcat wykonuje za pomocÄ… tzw. \"miÄ™kkiego restartu\". " ++"WpisujÄ…c tutaj wartość niezerowÄ…, wymusimy \"twardy restart\" jeÅ›li \"miÄ™kki " ++"restart\" siÄ™ nie powiedzie. Podaj czas w sekundach lub wpisz 0 (zero) aby " ++"wyÅ‚Ä…czyć restarty." +diff --git a/feeds/luci/applications/luci-app-watchcat/po/pt-br/watchcat.po b/feeds/luci/applications/luci-app-watchcat/po/pt-br/watchcat.po +new file mode 100644 +index 0000000..fe97036 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-watchcat/po/pt-br/watchcat.po +@@ -0,0 +1,71 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"PO-Revision-Date: 2014-03-29 23:20+0200\n" ++"Last-Translator: Luiz Angelo \n" ++"Language-Team: none\n" ++"Language: pt_BR\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n > 1);\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "Forced reboot delay" ++msgstr "Atraso para reinício forçado" ++ ++msgid "Host address to ping" ++msgstr "Endereço do equipamento para efetuar o PING" ++ ++msgid "" ++"How often to check internet connection. Default unit is seconds, you can you " ++"use the suffix 'm' for minutes, 'h' for hours or 'd' for days" ++msgstr "" ++"Com qual frequência deve verificar a conexão com a Internet. A unidade " ++"padrão é segundos, mas você pode usar o sufixo 'm' para minutos, 'h' para " ++"horas ou 'd' para dias" ++ ++msgid "" ++"In periodic mode, it defines the reboot period. In internet mode, it defines " ++"the longest period of time without internet access before a reboot is " ++"engaged.Default unit is seconds, you can use the suffix 'm' for minutes, 'h' " ++"for hours or 'd' for days" ++msgstr "" ++"No modo periódico, é definido o período para se reiniciar. No modo Internet, " ++"é definido o maior período de tempo sem acesso à Internet até que uma " ++"reiniciação é realizada. A unidade padrão é segundos, mas você pode usar o " ++"sufixo 'm' para minutos, 'h' para horas ou 'd' para dias." ++ ++msgid "Operating mode" ++msgstr "Modo de Operação" ++ ++msgid "Period" ++msgstr "Período" ++ ++msgid "Ping host" ++msgstr "Pingar Máquina" ++ ++msgid "Ping period" ++msgstr "Período de ping" ++ ++msgid "Watchcat" ++msgstr "Watchcat" ++ ++#, fuzzy ++msgid "" ++"Watchcat allows configuring a periodic reboot when the Internet connection " ++"has been lost for a certain period of time." ++msgstr "" ++"Watchcat permite que se configure um período para reiniciar e/ou quando a " ++"conexão com à Internet foi perdida por um ser período de tempo." ++ ++#, fuzzy ++msgid "" ++"When rebooting the system, the watchcat will trigger a soft reboot. Entering " ++"a non zero value here will trigger a delayed hard reboot if the soft reboot " ++"fails. Enter a number of seconds to enable, use 0 to disable" ++msgstr "" ++"Ao se reiniciar o sistema, watchcat acionará uma reiniciação suave. Ao se " ++"inserir um valor diferente de zero aqui, será acionado uma reiniciação " ++"forçada se a reiniciação suave falhar. Insira um número de segundos para " ++"habilitar, use 0 para desabilitar." +diff --git a/feeds/luci/applications/luci-app-watchcat/po/pt/watchcat.po b/feeds/luci/applications/luci-app-watchcat/po/pt/watchcat.po +new file mode 100644 +index 0000000..f939dc9 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-watchcat/po/pt/watchcat.po +@@ -0,0 +1,56 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"PO-Revision-Date: 2013-06-01 00:02+0200\n" ++"Last-Translator: joao.f.vieira \n" ++"Language-Team: none\n" ++"Language: pt\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n != 1);\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "Forced reboot delay" ++msgstr "" ++ ++msgid "Host address to ping" ++msgstr "" ++ ++msgid "" ++"How often to check internet connection. Default unit is seconds, you can you " ++"use the suffix 'm' for minutes, 'h' for hours or 'd' for days" ++msgstr "" ++ ++msgid "" ++"In periodic mode, it defines the reboot period. In internet mode, it defines " ++"the longest period of time without internet access before a reboot is " ++"engaged.Default unit is seconds, you can use the suffix 'm' for minutes, 'h' " ++"for hours or 'd' for days" ++msgstr "" ++ ++msgid "Operating mode" ++msgstr "Modo de operação" ++ ++msgid "Period" ++msgstr "Periodo" ++ ++msgid "Ping host" ++msgstr "Pingar host" ++ ++msgid "Ping period" ++msgstr "Periodo de ping" ++ ++msgid "Watchcat" ++msgstr "Watchcat" ++ ++msgid "" ++"Watchcat allows configuring a periodic reboot when the Internet connection " ++"has been lost for a certain period of time." ++msgstr "" ++ ++msgid "" ++"When rebooting the system, the watchcat will trigger a soft reboot. Entering " ++"a non zero value here will trigger a delayed hard reboot if the soft reboot " ++"fails. Enter a number of seconds to enable, use 0 to disable" ++msgstr "" +diff --git a/feeds/luci/applications/luci-app-watchcat/po/ro/watchcat.po b/feeds/luci/applications/luci-app-watchcat/po/ro/watchcat.po +new file mode 100644 +index 0000000..cda0911 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-watchcat/po/ro/watchcat.po +@@ -0,0 +1,57 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"PO-Revision-Date: 2014-06-28 19:23+0200\n" ++"Last-Translator: xxvirusxx \n" ++"Language-Team: none\n" ++"Language: ro\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=3; plural=(n==1 ? 0 : (n==0 || (n%100 > 0 && n%100 < " ++"20)) ? 1 : 2);;\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "Forced reboot delay" ++msgstr "" ++ ++msgid "Host address to ping" ++msgstr "" ++ ++msgid "" ++"How often to check internet connection. Default unit is seconds, you can you " ++"use the suffix 'm' for minutes, 'h' for hours or 'd' for days" ++msgstr "" ++ ++msgid "" ++"In periodic mode, it defines the reboot period. In internet mode, it defines " ++"the longest period of time without internet access before a reboot is " ++"engaged.Default unit is seconds, you can use the suffix 'm' for minutes, 'h' " ++"for hours or 'd' for days" ++msgstr "" ++ ++msgid "Operating mode" ++msgstr "" ++ ++msgid "Period" ++msgstr "Perioadă" ++ ++msgid "Ping host" ++msgstr "" ++ ++msgid "Ping period" ++msgstr "" ++ ++msgid "Watchcat" ++msgstr "" ++ ++msgid "" ++"Watchcat allows configuring a periodic reboot when the Internet connection " ++"has been lost for a certain period of time." ++msgstr "" ++ ++msgid "" ++"When rebooting the system, the watchcat will trigger a soft reboot. Entering " ++"a non zero value here will trigger a delayed hard reboot if the soft reboot " ++"fails. Enter a number of seconds to enable, use 0 to disable" ++msgstr "" +diff --git a/feeds/luci/applications/luci-app-watchcat/po/ru/watchcat.po b/feeds/luci/applications/luci-app-watchcat/po/ru/watchcat.po +new file mode 100644 +index 0000000..83b95e2 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-watchcat/po/ru/watchcat.po +@@ -0,0 +1,74 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: LuCI: watchcat\n" ++"POT-Creation-Date: \n" ++"PO-Revision-Date: \n" ++"Last-Translator: Roman A. aka BasicXP \n" ++"Language-Team: Russian \n" ++"Language: ru\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%" ++"10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" ++"X-Poedit-SourceCharset: UTF-8\n" ++ ++msgid "Forced reboot delay" ++msgstr "Задержка принудительной перезагрузки" ++ ++msgid "Host address to ping" ++msgstr "ÐÐ´Ñ€ÐµÑ Ñ…Ð¾Ñта Ð´Ð»Ñ Ð¾Ð¿Ñ€Ð¾Ñа" ++ ++msgid "" ++"How often to check internet connection. Default unit is seconds, you can you " ++"use the suffix 'm' for minutes, 'h' for hours or 'd' for days" ++msgstr "" ++"Как чаÑто проверÑÑ‚ÑŒ интернет-Ñоединение. По умолчанию значение в Ñекундах, " ++"вы можете иÑпользовать ÑÑƒÑ„Ñ„Ð¸ÐºÑ 'm' Ð´Ð»Ñ ÑƒÐºÐ°Ð·Ð°Ð½Ð¸Ñ Ð¼Ð¸Ð½ÑƒÑ‚, 'h' - чаÑов, 'd' - " ++"дней" ++ ++msgid "" ++"In periodic mode, it defines the reboot period. In internet mode, it defines " ++"the longest period of time without internet access before a reboot is " ++"engaged.Default unit is seconds, you can use the suffix 'm' for minutes, 'h' " ++"for hours or 'd' for days" ++msgstr "" ++"Ð’ периодичеÑком режиме, Ð´Ð°Ð½Ð½Ð°Ñ Ð½Ð°Ñтройка определÑет период перезагрузки. Ð’ " ++"интернет-режиме, Ð´Ð°Ð½Ð½Ð°Ñ Ð½Ð°Ñтройка определÑет макÑимальный период времени без " ++"доÑтупа в интернет, поÑле которого уÑтройÑтво перезагружаетÑÑ. По умолчанию " ++"значение в Ñекундах, вы можете иÑпользовать ÑÑƒÑ„Ñ„Ð¸ÐºÑ 'm' Ð´Ð»Ñ ÑƒÐºÐ°Ð·Ð°Ð½Ð¸Ñ Ð¼Ð¸Ð½ÑƒÑ‚, " ++"'h' - чаÑов, 'd' - дней" ++ ++msgid "Operating mode" ++msgstr "Режим работы" ++ ++msgid "Period" ++msgstr "Период" ++ ++msgid "Ping host" ++msgstr "ХоÑÑ‚ опроÑа" ++ ++msgid "Ping period" ++msgstr "Период опроÑа" ++ ++msgid "Watchcat" ++msgstr "Watchcat" ++ ++#, fuzzy ++msgid "" ++"Watchcat allows configuring a periodic reboot when the Internet connection " ++"has been lost for a certain period of time." ++msgstr "" ++"Watchcat позволÑет наÑтроить периодичеÑкую перезагрузку уÑтройÑтва и/или " ++"перезагрузку при потере интернет-ÑÐ¾ÐµÐ´Ð¸Ð½ÐµÐ½Ð¸Ñ Ð½Ð° определённое времÑ." ++ ++#, fuzzy ++msgid "" ++"When rebooting the system, the watchcat will trigger a soft reboot. Entering " ++"a non zero value here will trigger a delayed hard reboot if the soft reboot " ++"fails. Enter a number of seconds to enable, use 0 to disable" ++msgstr "" ++"При необходимоÑти перезагрузке ÑиÑтемы, watchcat вызовет программную " ++"перезагрузку. При уÑтановке ненулевого значениÑ, будет выполнена Ð¾Ñ‚Ð»Ð¾Ð¶ÐµÐ½Ð½Ð°Ñ " ++"Ð°Ð¿Ð¿Ð°Ñ€Ð°Ñ‚Ð½Ð°Ñ Ð¿ÐµÑ€ÐµÐ·Ð°Ð³Ñ€ÑƒÐ·ÐºÐ° при неудачной программной. УÑтановите количеÑтво " ++"Ñекунд Ð´Ð»Ñ Ð¾Ñ‚Ð»Ð¾Ð¶ÐµÐ½Ð½Ð¾Ð¹ аппаратной перезагрузки или значение 0 Ð´Ð»Ñ Ð¿Ñ€Ð¾Ð³Ñ€Ð°Ð¼Ð¼Ð½Ð¾Ð¹." +diff --git a/feeds/luci/applications/luci-app-watchcat/po/sk/watchcat.po b/feeds/luci/applications/luci-app-watchcat/po/sk/watchcat.po +new file mode 100644 +index 0000000..2ff7de9 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-watchcat/po/sk/watchcat.po +@@ -0,0 +1,53 @@ ++msgid "" ++msgstr "" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Last-Translator: Automatically generated\n" ++"Language-Team: none\n" ++"MIME-Version: 1.0\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n" ++ ++msgid "Forced reboot delay" ++msgstr "" ++ ++msgid "Host address to ping" ++msgstr "" ++ ++msgid "" ++"How often to check internet connection. Default unit is seconds, you can you " ++"use the suffix 'm' for minutes, 'h' for hours or 'd' for days" ++msgstr "" ++ ++msgid "" ++"In periodic mode, it defines the reboot period. In internet mode, it defines " ++"the longest period of time without internet access before a reboot is " ++"engaged.Default unit is seconds, you can use the suffix 'm' for minutes, 'h' " ++"for hours or 'd' for days" ++msgstr "" ++ ++msgid "Operating mode" ++msgstr "" ++ ++msgid "Period" ++msgstr "" ++ ++msgid "Ping host" ++msgstr "" ++ ++msgid "Ping period" ++msgstr "" ++ ++msgid "Watchcat" ++msgstr "" ++ ++msgid "" ++"Watchcat allows configuring a periodic reboot when the Internet connection " ++"has been lost for a certain period of time." ++msgstr "" ++ ++msgid "" ++"When rebooting the system, the watchcat will trigger a soft reboot. Entering " ++"a non zero value here will trigger a delayed hard reboot if the soft reboot " ++"fails. Enter a number of seconds to enable, use 0 to disable" ++msgstr "" +diff --git a/feeds/luci/applications/luci-app-watchcat/po/sv/watchcat.po b/feeds/luci/applications/luci-app-watchcat/po/sv/watchcat.po +new file mode 100644 +index 0000000..dd2365a +--- /dev/null ++++ b/feeds/luci/applications/luci-app-watchcat/po/sv/watchcat.po +@@ -0,0 +1,54 @@ ++msgid "" ++msgstr "" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Last-Translator: Automatically generated\n" ++"Language-Team: none\n" ++"Language: sv\n" ++"MIME-Version: 1.0\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n != 1);\n" ++ ++msgid "Forced reboot delay" ++msgstr "" ++ ++msgid "Host address to ping" ++msgstr "" ++ ++msgid "" ++"How often to check internet connection. Default unit is seconds, you can you " ++"use the suffix 'm' for minutes, 'h' for hours or 'd' for days" ++msgstr "" ++ ++msgid "" ++"In periodic mode, it defines the reboot period. In internet mode, it defines " ++"the longest period of time without internet access before a reboot is " ++"engaged.Default unit is seconds, you can use the suffix 'm' for minutes, 'h' " ++"for hours or 'd' for days" ++msgstr "" ++ ++msgid "Operating mode" ++msgstr "" ++ ++msgid "Period" ++msgstr "" ++ ++msgid "Ping host" ++msgstr "" ++ ++msgid "Ping period" ++msgstr "" ++ ++msgid "Watchcat" ++msgstr "" ++ ++msgid "" ++"Watchcat allows configuring a periodic reboot when the Internet connection " ++"has been lost for a certain period of time." ++msgstr "" ++ ++msgid "" ++"When rebooting the system, the watchcat will trigger a soft reboot. Entering " ++"a non zero value here will trigger a delayed hard reboot if the soft reboot " ++"fails. Enter a number of seconds to enable, use 0 to disable" ++msgstr "" +diff --git a/feeds/luci/applications/luci-app-watchcat/po/templates/watchcat.pot b/feeds/luci/applications/luci-app-watchcat/po/templates/watchcat.pot +new file mode 100644 +index 0000000..490ec5c +--- /dev/null ++++ b/feeds/luci/applications/luci-app-watchcat/po/templates/watchcat.pot +@@ -0,0 +1,46 @@ ++msgid "" ++msgstr "Content-Type: text/plain; charset=UTF-8" ++ ++msgid "Forced reboot delay" ++msgstr "" ++ ++msgid "Host address to ping" ++msgstr "" ++ ++msgid "" ++"How often to check internet connection. Default unit is seconds, you can you " ++"use the suffix 'm' for minutes, 'h' for hours or 'd' for days" ++msgstr "" ++ ++msgid "" ++"In periodic mode, it defines the reboot period. In internet mode, it defines " ++"the longest period of time without internet access before a reboot is " ++"engaged.Default unit is seconds, you can use the suffix 'm' for minutes, 'h' " ++"for hours or 'd' for days" ++msgstr "" ++ ++msgid "Operating mode" ++msgstr "" ++ ++msgid "Period" ++msgstr "" ++ ++msgid "Ping host" ++msgstr "" ++ ++msgid "Ping period" ++msgstr "" ++ ++msgid "Watchcat" ++msgstr "" ++ ++msgid "" ++"Watchcat allows configuring a periodic reboot when the Internet connection " ++"has been lost for a certain period of time." ++msgstr "" ++ ++msgid "" ++"When rebooting the system, the watchcat will trigger a soft reboot. Entering " ++"a non zero value here will trigger a delayed hard reboot if the soft reboot " ++"fails. Enter a number of seconds to enable, use 0 to disable" ++msgstr "" +diff --git a/feeds/luci/applications/luci-app-watchcat/po/tr/watchcat.po b/feeds/luci/applications/luci-app-watchcat/po/tr/watchcat.po +new file mode 100644 +index 0000000..633e7fb +--- /dev/null ++++ b/feeds/luci/applications/luci-app-watchcat/po/tr/watchcat.po +@@ -0,0 +1,53 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Last-Translator: Automatically generated\n" ++"Language-Team: none\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=1; plural=0;\n" ++ ++msgid "Forced reboot delay" ++msgstr "" ++ ++msgid "Host address to ping" ++msgstr "" ++ ++msgid "" ++"How often to check internet connection. Default unit is seconds, you can you " ++"use the suffix 'm' for minutes, 'h' for hours or 'd' for days" ++msgstr "" ++ ++msgid "" ++"In periodic mode, it defines the reboot period. In internet mode, it defines " ++"the longest period of time without internet access before a reboot is " ++"engaged.Default unit is seconds, you can use the suffix 'm' for minutes, 'h' " ++"for hours or 'd' for days" ++msgstr "" ++ ++msgid "Operating mode" ++msgstr "" ++ ++msgid "Period" ++msgstr "" ++ ++msgid "Ping host" ++msgstr "" ++ ++msgid "Ping period" ++msgstr "" ++ ++msgid "Watchcat" ++msgstr "" ++ ++msgid "" ++"Watchcat allows configuring a periodic reboot when the Internet connection " ++"has been lost for a certain period of time." ++msgstr "" ++ ++msgid "" ++"When rebooting the system, the watchcat will trigger a soft reboot. Entering " ++"a non zero value here will trigger a delayed hard reboot if the soft reboot " ++"fails. Enter a number of seconds to enable, use 0 to disable" ++msgstr "" +diff --git a/feeds/luci/applications/luci-app-watchcat/po/uk/watchcat.po b/feeds/luci/applications/luci-app-watchcat/po/uk/watchcat.po +new file mode 100644 +index 0000000..a7c2dd8 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-watchcat/po/uk/watchcat.po +@@ -0,0 +1,61 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"PO-Revision-Date: 2013-08-13 16:53+0200\n" ++"Last-Translator: zubr_139 \n" ++"Language-Team: none\n" ++"Language: uk\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%" ++"10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++#, fuzzy ++msgid "Forced reboot delay" ++msgstr "Затримка примуÑового перезавантаженнÑ" ++ ++msgid "Host address to ping" ++msgstr "ÐдреÑа Ñервера Ð´Ð»Ñ Ð¿ÐµÑ€ÐµÐ²Ñ–Ñ€ÐºÐ¸ зв'Ñзку" ++ ++msgid "" ++"How often to check internet connection. Default unit is seconds, you can you " ++"use the suffix 'm' for minutes, 'h' for hours or 'd' for days" ++msgstr "" ++ ++msgid "" ++"In periodic mode, it defines the reboot period. In internet mode, it defines " ++"the longest period of time without internet access before a reboot is " ++"engaged.Default unit is seconds, you can use the suffix 'm' for minutes, 'h' " ++"for hours or 'd' for days" ++msgstr "" ++ ++msgid "Operating mode" ++msgstr "Режим роботи" ++ ++msgid "Period" ++msgstr "Період" ++ ++msgid "Ping host" ++msgstr "Пінг вузла" ++ ++msgid "Ping period" ++msgstr "Період пінгів" ++ ++msgid "Watchcat" ++msgstr "Watchcat" ++ ++#, fuzzy ++msgid "" ++"Watchcat allows configuring a periodic reboot when the Internet connection " ++"has been lost for a certain period of time." ++msgstr "" ++"Watchcat дозволÑÑ” налаштувати періодичні Ð¿ÐµÑ€ÐµÐ·Ð°Ð²Ð°Ð½Ñ‚Ð°Ð¶ÐµÐ½Ð½Ñ Ñ–/або коли " ++"Ð¿Ñ–Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð½Ñ Ð´Ð¾ інтернету було втрачено протÑгом певного періоду чаÑу." ++ ++msgid "" ++"When rebooting the system, the watchcat will trigger a soft reboot. Entering " ++"a non zero value here will trigger a delayed hard reboot if the soft reboot " ++"fails. Enter a number of seconds to enable, use 0 to disable" ++msgstr "" +diff --git a/feeds/luci/applications/luci-app-watchcat/po/vi/watchcat.po b/feeds/luci/applications/luci-app-watchcat/po/vi/watchcat.po +new file mode 100644 +index 0000000..633e7fb +--- /dev/null ++++ b/feeds/luci/applications/luci-app-watchcat/po/vi/watchcat.po +@@ -0,0 +1,53 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Last-Translator: Automatically generated\n" ++"Language-Team: none\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=1; plural=0;\n" ++ ++msgid "Forced reboot delay" ++msgstr "" ++ ++msgid "Host address to ping" ++msgstr "" ++ ++msgid "" ++"How often to check internet connection. Default unit is seconds, you can you " ++"use the suffix 'm' for minutes, 'h' for hours or 'd' for days" ++msgstr "" ++ ++msgid "" ++"In periodic mode, it defines the reboot period. In internet mode, it defines " ++"the longest period of time without internet access before a reboot is " ++"engaged.Default unit is seconds, you can use the suffix 'm' for minutes, 'h' " ++"for hours or 'd' for days" ++msgstr "" ++ ++msgid "Operating mode" ++msgstr "" ++ ++msgid "Period" ++msgstr "" ++ ++msgid "Ping host" ++msgstr "" ++ ++msgid "Ping period" ++msgstr "" ++ ++msgid "Watchcat" ++msgstr "" ++ ++msgid "" ++"Watchcat allows configuring a periodic reboot when the Internet connection " ++"has been lost for a certain period of time." ++msgstr "" ++ ++msgid "" ++"When rebooting the system, the watchcat will trigger a soft reboot. Entering " ++"a non zero value here will trigger a delayed hard reboot if the soft reboot " ++"fails. Enter a number of seconds to enable, use 0 to disable" ++msgstr "" +diff --git a/feeds/luci/applications/luci-app-watchcat/po/zh-cn/watchcat.po b/feeds/luci/applications/luci-app-watchcat/po/zh-cn/watchcat.po +new file mode 100644 +index 0000000..991fc48 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-watchcat/po/zh-cn/watchcat.po +@@ -0,0 +1,65 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"PO-Revision-Date: 2012-09-24 18:18+0200\n" ++"Last-Translator: shanliren \n" ++"Language-Team: none\n" ++"Language: zh_CN\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=1; plural=0;\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "Forced reboot delay" ++msgstr "强制é‡å¯å»¶æ—¶" ++ ++msgid "Host address to ping" ++msgstr "ping主机地å€" ++ ++msgid "" ++"How often to check internet connection. Default unit is seconds, you can you " ++"use the suffix 'm' for minutes, 'h' for hours or 'd' for days" ++msgstr "" ++"检测网络连接的频率。默认å•ä½ä¸ºç§’,你å¯ä»¥ä½¿ç”¨'m'作为åŽç¼€è¡¨ç¤ºåˆ†é’Ÿï¼Œâ€˜h’表示å°" ++"时‘d’表示天。" ++ ++msgid "" ++"In periodic mode, it defines the reboot period. In internet mode, it defines " ++"the longest period of time without internet access before a reboot is " ++"engaged.Default unit is seconds, you can use the suffix 'm' for minutes, 'h' " ++"for hours or 'd' for days" ++msgstr "" ++"在周期模å¼ï¼Œæ­¤å¤„定义了é‡å¯çš„周期。在è”网模å¼ï¼Œè¿™ä¸ªè¡¨ç¤ºæ²¡æœ‰ç½‘络连接情况下到执" ++"è¡Œé‡å¯çš„最长时间间隔。默认å•ä½ä¸ºç§’,你å¯ä»¥ä½¿ç”¨'m'作为åŽç¼€è¡¨ç¤ºåˆ†é’Ÿï¼Œâ€˜h’表示å°" ++"时‘d’表示天。" ++ ++msgid "Operating mode" ++msgstr "æ“作模å¼" ++ ++msgid "Period" ++msgstr "周期" ++ ++msgid "Ping host" ++msgstr "ping主机" ++ ++msgid "Ping period" ++msgstr "ping周期" ++ ++msgid "Watchcat" ++msgstr "WatchCat" ++ ++#, fuzzy ++msgid "" ++"Watchcat allows configuring a periodic reboot when the Internet connection " ++"has been lost for a certain period of time." ++msgstr "WatchCatå…许设置周期性的é‡å¯ å’Œ/或者 当网络连接断开达规定时间。" ++ ++#, fuzzy ++msgid "" ++"When rebooting the system, the watchcat will trigger a soft reboot. Entering " ++"a non zero value here will trigger a delayed hard reboot if the soft reboot " ++"fails. Enter a number of seconds to enable, use 0 to disable" ++msgstr "" ++"当é‡å¯ç³»ç»Ÿçš„时候WatchCat将会触å‘一个软é‡å¯ï¼Œåœ¨è¿™é‡Œè¾“入一个éž0的值,如果软é‡å¯" ++"失败将会触å‘一个延迟的硬é‡å¯ã€‚输入秒数å¯ç”¨ï¼Œè¾“å…¥0ç¦æ­¢åŠŸèƒ½ã€‚" +diff --git a/feeds/luci/applications/luci-app-watchcat/po/zh-tw/watchcat.po b/feeds/luci/applications/luci-app-watchcat/po/zh-tw/watchcat.po +new file mode 100644 +index 0000000..b4e52bb +--- /dev/null ++++ b/feeds/luci/applications/luci-app-watchcat/po/zh-tw/watchcat.po +@@ -0,0 +1,66 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"PO-Revision-Date: 2014-05-14 12:00+0200\n" ++"Last-Translator: omnistack \n" ++"Language-Team: none\n" ++"Language: zh_TW\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=1; plural=0;\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "Forced reboot delay" ++msgstr "強制é‡å•Ÿå»¶é²" ++ ++msgid "Host address to ping" ++msgstr "è¦Ping的主機ä½å€" ++ ++msgid "" ++"How often to check internet connection. Default unit is seconds, you can you " ++"use the suffix 'm' for minutes, 'h' for hours or 'd' for days" ++msgstr "" ++"多久檢查一次網際網路連線. é è¨­å–®ä½å€¼æ˜¯ç§’, å¯ä»¥æŽ¡ç”¨å–®ä½å¾Œç¶´è¡¨ç¤º, \"m\"表示分" ++"é˜, \"h\"表示å°æ™‚, \"d\"代表天數" ++ ++msgid "" ++"In periodic mode, it defines the reboot period. In internet mode, it defines " ++"the longest period of time without internet access before a reboot is " ++"engaged.Default unit is seconds, you can use the suffix 'm' for minutes, 'h' " ++"for hours or 'd' for days" ++msgstr "" ++"Watchcat的定期模å¼,它將定義é‡é–‹é€±æœŸ. 在網際網路模å¼,它將定義在é‡é–‹è¢«è¨‚製若無" ++"Internetå­˜å–時採用較長時間週期 .é è¨­å–®ä½ç‚ºç§’數,å¯ä»¥æŽ¡ç”¨å–®ä½å¾Œç¶´è¡¨ç¤º, \"m\"表" ++"示分é˜, \"h\"表示å°æ™‚, \"d\"代表天數" ++ ++msgid "Operating mode" ++msgstr "æ“作模å¼" ++ ++msgid "Period" ++msgstr "週期" ++ ++msgid "Ping host" ++msgstr "Ping主機" ++ ++msgid "Ping period" ++msgstr "Ping週期" ++ ++msgid "Watchcat" ++msgstr "Watchcat" ++ ++#, fuzzy ++msgid "" ++"Watchcat allows configuring a periodic reboot when the Internet connection " ++"has been lost for a certain period of time." ++msgstr "" ++"Watchcatå…許定期é‡å•“並且/或者當網際網路連線斷掉時經éŽæŸæ®µæ™‚間週期後é‡å•“" ++ ++#, fuzzy ++msgid "" ++"When rebooting the system, the watchcat will trigger a soft reboot. Entering " ++"a non zero value here will trigger a delayed hard reboot if the soft reboot " ++"fails. Enter a number of seconds to enable, use 0 to disable" ++msgstr "" ++"é‡é–‹ç³»çµ±æ™‚watchcat將會觸發軟é‡é–‹, 如果軟é‡é–‹å¤±æ•—, 打入0以外的數字,將會觸發硬" ++"é‡é–‹å»¶é² . 打入秒數來啟用這功能,用0表示功能關閉" +diff --git a/feeds/luci/applications/luci-app-watchcat/root/etc/uci-defaults/luci-watchcat b/feeds/luci/applications/luci-app-watchcat/root/etc/uci-defaults/luci-watchcat +new file mode 100644 +index 0000000..8cdb8c7 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-watchcat/root/etc/uci-defaults/luci-watchcat +@@ -0,0 +1,10 @@ ++#!/bin/sh ++ ++uci -q batch <<-EOF >/dev/null ++ add ucitrack system ++ set ucitrack.@system[-1].init=watchcat ++ commit ucitrack ++EOF ++ ++rm -f /tmp/luci-indexcache ++exit 0 +diff --git a/feeds/luci/applications/luci-app-wol/Makefile b/feeds/luci/applications/luci-app-wol/Makefile +new file mode 100644 +index 0000000..d935ee9 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-wol/Makefile +@@ -0,0 +1,14 @@ ++# ++# Copyright (C) 2008-2014 The LuCI Team ++# ++# This is free software, licensed under the Apache License, Version 2.0 . ++# ++ ++include $(TOPDIR)/rules.mk ++ ++LUCI_TITLE:=LuCI Support for Wake-on-LAN ++LUCI_DEPENDS:=+etherwake ++ ++include ../../luci.mk ++ ++# call BuildPackage - OpenWrt buildroot signature +diff --git a/feeds/luci/applications/luci-app-wol/luasrc/controller/wol.lua b/feeds/luci/applications/luci-app-wol/luasrc/controller/wol.lua +new file mode 100644 +index 0000000..73a9594 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-wol/luasrc/controller/wol.lua +@@ -0,0 +1,6 @@ ++module("luci.controller.wol", package.seeall) ++ ++function index() ++ entry({"admin", "network", "wol"}, cbi("wol"), _("Wake on LAN"), 90) ++ entry({"mini", "network", "wol"}, cbi("wol"), _("Wake on LAN"), 90) ++end +diff --git a/feeds/luci/applications/luci-app-wol/luasrc/model/cbi/wol.lua b/feeds/luci/applications/luci-app-wol/luasrc/model/cbi/wol.lua +new file mode 100644 +index 0000000..e87cac3 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-wol/luasrc/model/cbi/wol.lua +@@ -0,0 +1,94 @@ ++-- Copyright 2010 Jo-Philipp Wich ++-- Licensed to the public under the Apache License 2.0. ++ ++local sys = require "luci.sys" ++local fs = require "nixio.fs" ++ ++m = SimpleForm("wol", translate("Wake on LAN"), ++ translate("Wake on LAN is a mechanism to remotely boot computers in the local network.")) ++ ++m.submit = translate("Wake up host") ++m.reset = false ++ ++ ++local has_ewk = fs.access("/usr/bin/etherwake") ++local has_wol = fs.access("/usr/bin/wol") ++ ++ ++s = m:section(SimpleSection) ++ ++if has_ewk and has_wol then ++ bin = s:option(ListValue, "binary", translate("WoL program"), ++ translate("Sometimes only one of the two tools works. If one fails, try the other one")) ++ ++ bin:value("/usr/bin/etherwake", "Etherwake") ++ bin:value("/usr/bin/wol", "WoL") ++end ++ ++if has_ewk then ++ iface = s:option(ListValue, "iface", translate("Network interface to use"), ++ translate("Specifies the interface the WoL packet is sent on")) ++ ++ if has_wol then ++ iface:depends("binary", "/usr/bin/etherwake") ++ end ++ ++ iface:value("", translate("Broadcast on all interfaces")) ++ ++ for _, e in ipairs(sys.net.devices()) do ++ if e ~= "lo" then iface:value(e) end ++ end ++end ++ ++ ++host = s:option(Value, "mac", translate("Host to wake up"), ++ translate("Choose the host to wake up or enter a custom MAC address to use")) ++ ++sys.net.mac_hints(function(mac, name) ++ host:value(mac, "%s (%s)" %{ mac, name }) ++end) ++ ++ ++function host.write(self, s, val) ++ local host = luci.http.formvalue("cbid.wol.1.mac") ++ if host and #host > 0 and host:match("^[a-fA-F0-9:]+$") then ++ local cmd ++ local util = luci.http.formvalue("cbid.wol.1.binary") or ( ++ has_ewk and "/usr/bin/etherwake" or "/usr/bin/wol" ++ ) ++ ++ if util == "/usr/bin/etherwake" then ++ local iface = luci.http.formvalue("cbid.wol.1.iface") ++ cmd = "%s -D%s %q" %{ ++ util, (iface ~= "" and " -i %q" % iface or ""), host ++ } ++ else ++ cmd = "%s -v %q" %{ util, host } ++ end ++ ++ local msg = "

    %s

    %s

    " %{ ++ translate("Starting WoL utility:"), cmd ++ } ++ ++ local p = io.popen(cmd .. " 2>&1") ++ if p then ++ while true do ++ local l = p:read("*l") ++ if l then ++ if #l > 100 then l = l:sub(1, 100) .. "..." end ++ msg = msg .. l .. "
    " ++ else ++ break ++ end ++ end ++ p:close() ++ end ++ ++ msg = msg .. "

    " ++ ++ m.message = msg ++ end ++end ++ ++ ++return m +diff --git a/feeds/luci/applications/luci-app-wol/po/ca/wol.po b/feeds/luci/applications/luci-app-wol/po/ca/wol.po +new file mode 100644 +index 0000000..42f7cf7 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-wol/po/ca/wol.po +@@ -0,0 +1,58 @@ ++# Generated from applications/luci-wol/luasrc/model/cbi/wol.lua ++# ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Report-Msgid-Bugs-To: \n" ++"POT-Creation-Date: 2010-04-19 00:29+0200\n" ++"PO-Revision-Date: 2014-07-01 06:15+0200\n" ++"Last-Translator: Alex \n" ++"Language-Team: none\n" ++"Language: ca\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n != 1);\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "Broadcast on all interfaces" ++msgstr "Difon en totes les interfícies" ++ ++msgid "Choose the host to wake up or enter a custom MAC address to use" ++msgstr "" ++"Trieu el host per a despertar o introduïu una adreça MAC personalitzada per " ++"a utilitzar" ++ ++msgid "Host to wake up" ++msgstr "Host per a despertar" ++ ++msgid "Network interface to use" ++msgstr "Interfície de xarxa per a utilitzar" ++ ++#, fuzzy ++msgid "" ++"Sometimes only one of the two tools works. If one fails, try the other one" ++msgstr "" ++"A vegades, només una de les dues eines funciona. Si un dels falla, prova la " ++"altra." ++ ++msgid "Specifies the interface the WoL packet is sent on" ++msgstr "Especifica la interfície en que s'envia el paquet WoL" ++ ++msgid "Starting WoL utility:" ++msgstr "Iniciant la utilitat WoL:" ++ ++msgid "Wake on LAN" ++msgstr "Despert en LAN" ++ ++msgid "" ++"Wake on LAN is a mechanism to remotely boot computers in the local network." ++msgstr "" ++"Despert en LAN és un mecanisme per a iniciar remotament ordinadors en la " ++"xarxa local." ++ ++msgid "Wake up host" ++msgstr "Desperta al host" ++ ++msgid "WoL program" ++msgstr "Programa WoL" +diff --git a/feeds/luci/applications/luci-app-wol/po/cs/wol.po b/feeds/luci/applications/luci-app-wol/po/cs/wol.po +new file mode 100644 +index 0000000..6ee7f67 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-wol/po/cs/wol.po +@@ -0,0 +1,55 @@ ++# Generated from applications/luci-wol/luasrc/model/cbi/wol.lua ++# ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Report-Msgid-Bugs-To: \n" ++"POT-Creation-Date: 2010-04-19 00:29+0200\n" ++"PO-Revision-Date: 2014-05-12 11:17+0200\n" ++"Last-Translator: sairon \n" ++"Language-Team: none\n" ++"Language: cs\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "Broadcast on all interfaces" ++msgstr "Vysílat broadcastem na vÅ¡ech rozhraních" ++ ++msgid "Choose the host to wake up or enter a custom MAC address to use" ++msgstr "Vyberte zařízení, které má být probuzeno, nebo zadejte jeho MAC adresu" ++ ++msgid "Host to wake up" ++msgstr "Adresa zařízení, které má být probuzeno" ++ ++msgid "Network interface to use" ++msgstr "Použité síťové rozhraní" ++ ++#, fuzzy ++msgid "" ++"Sometimes only one of the two tools works. If one fails, try the other one" ++msgstr "" ++"Může se stát, že pro dané cílové zařízení bude fungovat pouze jeden z " ++"programů. Pokud první selže, vyzkouÅ¡ejte další." ++ ++msgid "Specifies the interface the WoL packet is sent on" ++msgstr "Zde se nastaví síťové rozhraní, pÅ™es které budou zasílány WoL packety." ++ ++msgid "Starting WoL utility:" ++msgstr "SpouÅ¡tím nástroj WoL:" ++ ++msgid "Wake on LAN" ++msgstr "Wake on LAN" ++ ++msgid "" ++"Wake on LAN is a mechanism to remotely boot computers in the local network." ++msgstr "" ++"Funkce \"Wake on LAN\" umožňuje vzdálenÄ› spouÅ¡tÄ›t poÄítaÄe v místní síti." ++ ++msgid "Wake up host" ++msgstr "Probudit zařízení" ++ ++msgid "WoL program" ++msgstr "Program provádÄ›jící WoL" +diff --git a/feeds/luci/applications/luci-app-wol/po/de/wol.po b/feeds/luci/applications/luci-app-wol/po/de/wol.po +new file mode 100644 +index 0000000..52940ef +--- /dev/null ++++ b/feeds/luci/applications/luci-app-wol/po/de/wol.po +@@ -0,0 +1,58 @@ ++# Generated from applications/luci-wol/luasrc/model/cbi/wol.lua ++# ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Report-Msgid-Bugs-To: \n" ++"POT-Creation-Date: 2010-04-19 00:29+0200\n" ++"PO-Revision-Date: 2011-06-11 01:37+0200\n" ++"Last-Translator: Jo-Philipp \n" ++"Language-Team: none\n" ++"Language: de\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n != 1);\n" ++"X-Generator: Pootle 2.0.4\n" ++ ++msgid "Broadcast on all interfaces" ++msgstr "Auf allen Schnittstellen senden" ++ ++msgid "Choose the host to wake up or enter a custom MAC address to use" ++msgstr "" ++"Zu startenden Rechner selektieren oder benutzerdefinierte MAC-Adresse angeben" ++ ++msgid "Host to wake up" ++msgstr "Anzuschaltender Rechner" ++ ++msgid "Network interface to use" ++msgstr "Verwendete Schnittstelle" ++ ++#, fuzzy ++msgid "" ++"Sometimes only one of the two tools works. If one fails, try the other one" ++msgstr "" ++"Manchmal funktioniert nur eines der beiden Programme. Wenn eines " ++"fehlschlägt, versuchen Sie das Andere." ++ ++msgid "Specifies the interface the WoL packet is sent on" ++msgstr "" ++"Selektiert die Netzwerkschnittstelle auf der das WoL-Paket versendet wird" ++ ++msgid "Starting WoL utility:" ++msgstr "Starte WoL-Programm:" ++ ++msgid "Wake on LAN" ++msgstr "Wake-on-LAN" ++ ++msgid "" ++"Wake on LAN is a mechanism to remotely boot computers in the local network." ++msgstr "" ++"Wake-on-LAN ist ein Mechanismus um Geräte im lokalen Netzwerk ferngesteuert " ++"anzuschalten." ++ ++msgid "Wake up host" ++msgstr "Rechner anschalten" ++ ++msgid "WoL program" ++msgstr "WoL-Programm" +diff --git a/feeds/luci/applications/luci-app-wol/po/el/wol.po b/feeds/luci/applications/luci-app-wol/po/el/wol.po +new file mode 100644 +index 0000000..cb7c3b9 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-wol/po/el/wol.po +@@ -0,0 +1,49 @@ ++# Generated from applications/luci-wol/luasrc/model/cbi/wol.lua ++# ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Report-Msgid-Bugs-To: \n" ++"POT-Creation-Date: 2010-04-19 00:29+0200\n" ++"PO-Revision-Date: 2010-04-19 00:29+0200\n" ++"Last-Translator: Automatically generated\n" ++"Language-Team: none\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n != 1);\n" ++ ++msgid "Broadcast on all interfaces" ++msgstr "" ++ ++msgid "Choose the host to wake up or enter a custom MAC address to use" ++msgstr "" ++ ++msgid "Host to wake up" ++msgstr "" ++ ++msgid "Network interface to use" ++msgstr "" ++ ++msgid "" ++"Sometimes only one of the two tools works. If one fails, try the other one" ++msgstr "" ++ ++msgid "Specifies the interface the WoL packet is sent on" ++msgstr "" ++ ++msgid "Starting WoL utility:" ++msgstr "" ++ ++msgid "Wake on LAN" ++msgstr "" ++ ++msgid "" ++"Wake on LAN is a mechanism to remotely boot computers in the local network." ++msgstr "" ++ ++msgid "Wake up host" ++msgstr "" ++ ++msgid "WoL program" ++msgstr "" +diff --git a/feeds/luci/applications/luci-app-wol/po/en/wol.po b/feeds/luci/applications/luci-app-wol/po/en/wol.po +new file mode 100644 +index 0000000..48c7302 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-wol/po/en/wol.po +@@ -0,0 +1,50 @@ ++#, fuzzy ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Report-Msgid-Bugs-To: \n" ++"POT-Creation-Date: 2010-04-19 00:29+0200\n" ++"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" ++"Last-Translator: FULL NAME \n" ++"Language-Team: LANGUAGE \n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++ ++msgid "Broadcast on all interfaces" ++msgstr "Broadcast on all interfaces" ++ ++msgid "Choose the host to wake up or enter a custom MAC address to use" ++msgstr "Choose the host to wake up or enter a custom MAC address to use" ++ ++msgid "Host to wake up" ++msgstr "Host to wake up" ++ ++msgid "Network interface to use" ++msgstr "Network interface to use" ++ ++#, fuzzy ++msgid "" ++"Sometimes only one of the two tools works. If one fails, try the other one" ++msgstr "" ++"Sometimes only one of both tools work. If one of fails, try the other one" ++ ++msgid "Specifies the interface the WoL packet is sent on" ++msgstr "Specifies the interface the WoL packet is sent on" ++ ++msgid "Starting WoL utility:" ++msgstr "Starting WoL utility:" ++ ++msgid "Wake on LAN" ++msgstr "Wake on LAN" ++ ++msgid "" ++"Wake on LAN is a mechanism to remotely boot computers in the local network." ++msgstr "" ++"Wake on LAN is a mechanism to remotely boot computers in the local network." ++ ++msgid "Wake up host" ++msgstr "Wake up host" ++ ++msgid "WoL program" ++msgstr "WoL program" +diff --git a/feeds/luci/applications/luci-app-wol/po/es/wol.po b/feeds/luci/applications/luci-app-wol/po/es/wol.po +new file mode 100644 +index 0000000..f5bcf6b +--- /dev/null ++++ b/feeds/luci/applications/luci-app-wol/po/es/wol.po +@@ -0,0 +1,57 @@ ++# Generated from applications/luci-wol/luasrc/model/cbi/wol.lua ++# ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Report-Msgid-Bugs-To: \n" ++"POT-Creation-Date: 2010-04-19 00:29+0200\n" ++"PO-Revision-Date: 2012-08-22 21:41+0200\n" ++"Last-Translator: José Vicente \n" ++"Language-Team: none\n" ++"Language: es\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n != 1);\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "Broadcast on all interfaces" ++msgstr "Propagar en todas las interfaces" ++ ++msgid "Choose the host to wake up or enter a custom MAC address to use" ++msgstr "Elija la máquina a despertar o introduzca su dirección MAC" ++ ++msgid "Host to wake up" ++msgstr "Máquina a despertar" ++ ++msgid "Network interface to use" ++msgstr "Interfaz de red a utilizar" ++ ++#, fuzzy ++msgid "" ++"Sometimes only one of the two tools works. If one fails, try the other one" ++msgstr "" ++"A veces, sólo se inicia una de las dos herramientas. Si una falla, intente " ++"con la otra" ++ ++msgid "Specifies the interface the WoL packet is sent on" ++msgstr "Especifica la interfaz donde se envían los paquetes WoL" ++ ++msgid "Starting WoL utility:" ++msgstr "Iniciando utilidad WoL:" ++ ++# Wake on LAN es un término habitualmente utilizado en el español para referirse a esa misma función de encendido remoto a través de la red ++msgid "Wake on LAN" ++msgstr "Wake on LAN" ++ ++msgid "" ++"Wake on LAN is a mechanism to remotely boot computers in the local network." ++msgstr "" ++"Wake on LAN permite arrancar ordenadores conectados en una red local de " ++"forma remota." ++ ++msgid "Wake up host" ++msgstr "Despertar máquina" ++ ++msgid "WoL program" ++msgstr "Programa WoL" +diff --git a/feeds/luci/applications/luci-app-wol/po/fr/wol.po b/feeds/luci/applications/luci-app-wol/po/fr/wol.po +new file mode 100644 +index 0000000..0bed86d +--- /dev/null ++++ b/feeds/luci/applications/luci-app-wol/po/fr/wol.po +@@ -0,0 +1,57 @@ ++# Generated from applications/luci-wol/luasrc/model/cbi/wol.lua ++# ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Report-Msgid-Bugs-To: \n" ++"POT-Creation-Date: 2010-04-19 00:29+0200\n" ++"PO-Revision-Date: 2011-11-23 22:22+0200\n" ++"Last-Translator: fredb \n" ++"Language-Team: French\n" ++"Language: fr\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n > 1);\n" ++"X-Generator: Pootle 2.0.4\n" ++ ++msgid "Broadcast on all interfaces" ++msgstr "Émettre sur toutes les interfaces" ++ ++msgid "Choose the host to wake up or enter a custom MAC address to use" ++msgstr "Choisir l'hôte à réveiller ou entrer une adresse MAC à utiliser" ++ ++msgid "Host to wake up" ++msgstr "Hôte à réveiller" ++ ++msgid "Network interface to use" ++msgstr "Interface réseau à utiliser" ++ ++#, fuzzy ++msgid "" ++"Sometimes only one of the two tools works. If one fails, try the other one" ++msgstr "" ++"Parfois seul un des deux outils fonctionne. Si l'un échoue, essayez l'autre" ++ ++msgid "Specifies the interface the WoL packet is sent on" ++msgstr "" ++"Spécifie l'interface sur laquelle le paquet WoL est envoyé" ++ ++msgid "Starting WoL utility:" ++msgstr "Démarrer l'utilitaire WoL :" ++ ++msgid "Wake on LAN" ++msgstr "Wake on LAN" ++ ++msgid "" ++"Wake on LAN is a mechanism to remotely boot computers in the local network." ++msgstr "" ++"Wake on LAN est un mécanisme pour démarrer à distance les ordinateurs du " ++"réseau local." ++ ++msgid "Wake up host" ++msgstr "Réveiller l'hôte" ++ ++msgid "WoL program" ++msgstr "Programme WoL" +diff --git a/feeds/luci/applications/luci-app-wol/po/he/wol.po b/feeds/luci/applications/luci-app-wol/po/he/wol.po +new file mode 100644 +index 0000000..cb7c3b9 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-wol/po/he/wol.po +@@ -0,0 +1,49 @@ ++# Generated from applications/luci-wol/luasrc/model/cbi/wol.lua ++# ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Report-Msgid-Bugs-To: \n" ++"POT-Creation-Date: 2010-04-19 00:29+0200\n" ++"PO-Revision-Date: 2010-04-19 00:29+0200\n" ++"Last-Translator: Automatically generated\n" ++"Language-Team: none\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n != 1);\n" ++ ++msgid "Broadcast on all interfaces" ++msgstr "" ++ ++msgid "Choose the host to wake up or enter a custom MAC address to use" ++msgstr "" ++ ++msgid "Host to wake up" ++msgstr "" ++ ++msgid "Network interface to use" ++msgstr "" ++ ++msgid "" ++"Sometimes only one of the two tools works. If one fails, try the other one" ++msgstr "" ++ ++msgid "Specifies the interface the WoL packet is sent on" ++msgstr "" ++ ++msgid "Starting WoL utility:" ++msgstr "" ++ ++msgid "Wake on LAN" ++msgstr "" ++ ++msgid "" ++"Wake on LAN is a mechanism to remotely boot computers in the local network." ++msgstr "" ++ ++msgid "Wake up host" ++msgstr "" ++ ++msgid "WoL program" ++msgstr "" +diff --git a/feeds/luci/applications/luci-app-wol/po/hu/wol.po b/feeds/luci/applications/luci-app-wol/po/hu/wol.po +new file mode 100644 +index 0000000..f47191c +--- /dev/null ++++ b/feeds/luci/applications/luci-app-wol/po/hu/wol.po +@@ -0,0 +1,59 @@ ++# Generated from applications/luci-wol/luasrc/model/cbi/wol.lua ++# ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Report-Msgid-Bugs-To: \n" ++"POT-Creation-Date: 2010-04-19 00:29+0200\n" ++"PO-Revision-Date: 2012-04-06 10:42+0200\n" ++"Last-Translator: juhosg \n" ++"Language-Team: none\n" ++"Language: hu\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n != 1);\n" ++"X-Generator: Pootle 2.0.4\n" ++ ++msgid "Broadcast on all interfaces" ++msgstr "Szórás az összes interfészen" ++ ++msgid "Choose the host to wake up or enter a custom MAC address to use" ++msgstr "" ++"Válassza ki a felélesztendÅ‘ gépet, vagy adja meg a haszálandó egyedi MAC " ++"címet" ++ ++msgid "Host to wake up" ++msgstr "FelélesztendÅ‘ gép" ++ ++msgid "Network interface to use" ++msgstr "Használandó interfész" ++ ++#, fuzzy ++msgid "" ++"Sometimes only one of the two tools works. If one fails, try the other one" ++msgstr "" ++"Néha csak az egyik eszköz működik. Ha valamelyik nem működik, próbálja ki a " ++"másikat." ++ ++msgid "Specifies the interface the WoL packet is sent on" ++msgstr "" ++"Megadja azt az interfészt amelyiken keresztül a WoL csomag kiküldésre kerül" ++ ++msgid "Starting WoL utility:" ++msgstr "WoL segédprogram elindítása:" ++ ++msgid "Wake on LAN" ++msgstr "Felélesztés hálózaton keresztül" ++ ++msgid "" ++"Wake on LAN is a mechanism to remotely boot computers in the local network." ++msgstr "" ++"A felélesztés hálózaton keresztül a helyi hálózatban lévÅ‘ számítógépek " ++"távoli elindítására szolgáló módszer." ++ ++msgid "Wake up host" ++msgstr "Gép felélesztése" ++ ++msgid "WoL program" ++msgstr "WoL program" +diff --git a/feeds/luci/applications/luci-app-wol/po/it/wol.po b/feeds/luci/applications/luci-app-wol/po/it/wol.po +new file mode 100644 +index 0000000..63ac0d8 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-wol/po/it/wol.po +@@ -0,0 +1,56 @@ ++# Generated from applications/luci-wol/luasrc/model/cbi/wol.lua ++# ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Report-Msgid-Bugs-To: \n" ++"POT-Creation-Date: 2010-04-19 00:29+0200\n" ++"PO-Revision-Date: 2013-02-03 14:01+0200\n" ++"Last-Translator: Francesco <3gasas@gmail.com>\n" ++"Language-Team: none\n" ++"Language: it\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n != 1);\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "Broadcast on all interfaces" ++msgstr "Broadcast su tutte le interfaccie" ++ ++msgid "Choose the host to wake up or enter a custom MAC address to use" ++msgstr "Scegli l'host da \"svegliare\" o inserisci il MAC address da usare" ++ ++msgid "Host to wake up" ++msgstr "Host da \"svegliare\"" ++ ++msgid "Network interface to use" ++msgstr "Interfacci di rete da usare" ++ ++#, fuzzy ++msgid "" ++"Sometimes only one of the two tools works. If one fails, try the other one" ++msgstr "" ++"Avvolte solo uno dei due tools funziona. Se uno fallisce, tenta di usare il " ++"secondo" ++ ++msgid "Specifies the interface the WoL packet is sent on" ++msgstr "Secifica l'interfaccia su cui il pacchetto \"magico\" WoL è inviato" ++ ++msgid "Starting WoL utility:" ++msgstr "Avvia l'utility WoL:" ++ ++msgid "Wake on LAN" ++msgstr "Wake on LAN" ++ ++msgid "" ++"Wake on LAN is a mechanism to remotely boot computers in the local network." ++msgstr "" ++"Wake on LAN è un meccanismo che ti permette di avviare da remoto un computer " ++"collegato alla LAN." ++ ++msgid "Wake up host" ++msgstr "Sveglia Host" ++ ++msgid "WoL program" ++msgstr "Programma WoL" +diff --git a/feeds/luci/applications/luci-app-wol/po/ja/wol.po b/feeds/luci/applications/luci-app-wol/po/ja/wol.po +new file mode 100644 +index 0000000..c18b831 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-wol/po/ja/wol.po +@@ -0,0 +1,56 @@ ++# Generated from applications/luci-wol/luasrc/model/cbi/wol.lua ++# ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Report-Msgid-Bugs-To: \n" ++"POT-Creation-Date: 2010-04-19 00:29+0200\n" ++"PO-Revision-Date: 2013-10-06 17:12+0200\n" ++"Last-Translator: Kentaro \n" ++"Language-Team: none\n" ++"Language: ja\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=1; plural=0;\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "Broadcast on all interfaces" ++msgstr "å…¨ã¦ã®ã‚¤ãƒ³ã‚¿ãƒ¼ãƒ•ã‚§ãƒ¼ã‚¹ã¸ãƒ–ロードキャスト" ++ ++msgid "Choose the host to wake up or enter a custom MAC address to use" ++msgstr "èµ·å‹•ã™ã‚‹ãƒ›ã‚¹ãƒˆã®MACアドレスをé¸æŠžã¾ãŸã¯å…¥åŠ›ã—ã¦ãã ã•ã„" ++ ++msgid "Host to wake up" ++msgstr "èµ·å‹•ã™ã‚‹ãƒ›ã‚¹ãƒˆã‚’指定" ++ ++msgid "Network interface to use" ++msgstr "使用ã™ã‚‹ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ã‚¤ãƒ³ã‚¿ãƒ¼ãƒ•ã‚§ãƒ¼ã‚¹" ++ ++#, fuzzy ++msgid "" ++"Sometimes only one of the two tools works. If one fails, try the other one" ++msgstr "" ++"片方ã®ãƒ„ールã®ã¿ãŒå‹•ä½œã™ã‚‹å ´åˆãŒã‚ã‚‹ãŸã‚ã€ç‰‡æ–¹ãŒå¤±æ•—ã™ã‚‹å ´åˆã¯åˆ¥ã®ãƒ„ールを試" ++"ã—ã¦ã¿ã¦ãã ã•ã„。" ++ ++msgid "Specifies the interface the WoL packet is sent on" ++msgstr "WoLパケットをé€ä¿¡ã™ã‚‹ã‚¤ãƒ³ã‚¿ãƒ•ã‚§ãƒ¼ã‚¹ã‚’指定" ++ ++msgid "Starting WoL utility:" ++msgstr "WoLユーティリティを起動:" ++ ++msgid "Wake on LAN" ++msgstr "Wake on LAN" ++ ++msgid "" ++"Wake on LAN is a mechanism to remotely boot computers in the local network." ++msgstr "" ++"Wake on LANã¯ãƒ­ãƒ¼ã‚«ãƒ«ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯å†…ã®ã‚³ãƒ³ãƒ”ュータをé éš”ã§èµ·å‹•ã•ã›ã‚‹ã“ã¨ãŒã§ã" ++"る機能ã§ã™ã€‚" ++ ++msgid "Wake up host" ++msgstr "ホストを起動" ++ ++msgid "WoL program" ++msgstr "WoLプログラム" +diff --git a/feeds/luci/applications/luci-app-wol/po/ms/wol.po b/feeds/luci/applications/luci-app-wol/po/ms/wol.po +new file mode 100644 +index 0000000..74380f2 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-wol/po/ms/wol.po +@@ -0,0 +1,48 @@ ++# Generated from applications/luci-wol/luasrc/model/cbi/wol.lua ++# ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Report-Msgid-Bugs-To: \n" ++"POT-Creation-Date: 2010-04-19 00:29+0200\n" ++"PO-Revision-Date: 2010-04-19 00:29+0200\n" ++"Last-Translator: Automatically generated\n" ++"Language-Team: none\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++ ++msgid "Broadcast on all interfaces" ++msgstr "" ++ ++msgid "Choose the host to wake up or enter a custom MAC address to use" ++msgstr "" ++ ++msgid "Host to wake up" ++msgstr "" ++ ++msgid "Network interface to use" ++msgstr "" ++ ++msgid "" ++"Sometimes only one of the two tools works. If one fails, try the other one" ++msgstr "" ++ ++msgid "Specifies the interface the WoL packet is sent on" ++msgstr "" ++ ++msgid "Starting WoL utility:" ++msgstr "" ++ ++msgid "Wake on LAN" ++msgstr "" ++ ++msgid "" ++"Wake on LAN is a mechanism to remotely boot computers in the local network." ++msgstr "" ++ ++msgid "Wake up host" ++msgstr "" ++ ++msgid "WoL program" ++msgstr "" +diff --git a/feeds/luci/applications/luci-app-wol/po/no/wol.po b/feeds/luci/applications/luci-app-wol/po/no/wol.po +new file mode 100644 +index 0000000..2f0a8ad +--- /dev/null ++++ b/feeds/luci/applications/luci-app-wol/po/no/wol.po +@@ -0,0 +1,47 @@ ++msgid "" ++msgstr "" ++"Last-Translator: Lars Hardy \n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++ ++msgid "Broadcast on all interfaces" ++msgstr "Send pÃ¥ alle grensesnitt" ++ ++msgid "Choose the host to wake up or enter a custom MAC address to use" ++msgstr "" ++"Velg hvilken vert som skal startes opp, eller angi en MAC adresse som skal " ++"brukes" ++ ++msgid "Host to wake up" ++msgstr "Vert som skal startes opp" ++ ++msgid "Network interface to use" ++msgstr "Nettverksgrensesnitt" ++ ++#, fuzzy ++msgid "" ++"Sometimes only one of the two tools works. If one fails, try the other one" ++msgstr "" ++"Noen ganger virker bare ett av disse verktøyene. Hvis ett av de ikke lykkes " ++"med Ã¥ starte opp verten kan du prøve det andre." ++ ++msgid "Specifies the interface the WoL packet is sent on" ++msgstr "Angir grensesnittet som WoL pakken blir sendt ut pÃ¥" ++ ++msgid "Starting WoL utility:" ++msgstr "Starter WoL:" ++ ++msgid "Wake on LAN" ++msgstr "Wake on LAN" ++ ++msgid "" ++"Wake on LAN is a mechanism to remotely boot computers in the local network." ++msgstr "" ++"Wake on LAN er en mekanisme for Ã¥ starte opp datamaskiner i det lokale " ++"nettverket." ++ ++msgid "Wake up host" ++msgstr "Start vert" ++ ++msgid "WoL program" ++msgstr "WoL programm" +diff --git a/feeds/luci/applications/luci-app-wol/po/pl/wol.po b/feeds/luci/applications/luci-app-wol/po/pl/wol.po +new file mode 100644 +index 0000000..c599b9e +--- /dev/null ++++ b/feeds/luci/applications/luci-app-wol/po/pl/wol.po +@@ -0,0 +1,57 @@ ++# Generated from applications/luci-wol/luasrc/model/cbi/wol.lua ++# ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Report-Msgid-Bugs-To: \n" ++"POT-Creation-Date: 2010-04-19 00:29+0200\n" ++"PO-Revision-Date: 2011-08-25 19:04+0200\n" ++"Last-Translator: Staszek \n" ++"Language-Team: none\n" ++"Language: pl\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 " ++"|| n%100>=20) ? 1 : 2);\n" ++"X-Generator: Pootle 2.0.4\n" ++ ++msgid "Broadcast on all interfaces" ++msgstr "RozgÅ‚aszaj na wszystkie interfejsy" ++ ++msgid "Choose the host to wake up or enter a custom MAC address to use" ++msgstr "Wybierz hosta z listy lub podaj adres MAC maszyny do wybudzenia" ++ ++msgid "Host to wake up" ++msgstr "Host do wybudzenia" ++ ++msgid "Network interface to use" ++msgstr "Użyty interfejs sieciowy" ++ ++#, fuzzy ++msgid "" ++"Sometimes only one of the two tools works. If one fails, try the other one" ++msgstr "" ++"Czasem dziaÅ‚a tylko jedno z narzÄ™dzi. Jeżeli jedno z nich nie zadziaÅ‚a, " ++"proszÄ™ użyć drugiego." ++ ++msgid "Specifies the interface the WoL packet is sent on" ++msgstr "Definiuje interfejs, na który bÄ™dzie wysÅ‚any pakiet WoL" ++ ++msgid "Starting WoL utility:" ++msgstr "Uruchamianie narzÄ™dzia WoL:" ++ ++msgid "Wake on LAN" ++msgstr "Wake on LAN" ++ ++msgid "" ++"Wake on LAN is a mechanism to remotely boot computers in the local network." ++msgstr "" ++"\"Wake on LAN\" to mechanizm sÅ‚użący do zdalnego wÅ‚Ä…czania komputerów w " ++"sieci lokalnej." ++ ++msgid "Wake up host" ++msgstr "Wybudź hosta" ++ ++msgid "WoL program" ++msgstr "NarzÄ™dzie WoL" +diff --git a/feeds/luci/applications/luci-app-wol/po/pt-br/wol.po b/feeds/luci/applications/luci-app-wol/po/pt-br/wol.po +new file mode 100644 +index 0000000..6a21a85 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-wol/po/pt-br/wol.po +@@ -0,0 +1,56 @@ ++# Generated from applications/luci-wol/luasrc/model/cbi/wol.lua ++# ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Report-Msgid-Bugs-To: \n" ++"POT-Creation-Date: 2010-04-19 00:29+0200\n" ++"PO-Revision-Date: 2011-10-11 20:31+0200\n" ++"Last-Translator: Luiz Angelo \n" ++"Language-Team: none\n" ++"Language: pt_BR\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n > 1);\n" ++"X-Generator: Pootle 2.0.4\n" ++ ++msgid "Broadcast on all interfaces" ++msgstr "Broadcast em todas as interfaces" ++ ++msgid "Choose the host to wake up or enter a custom MAC address to use" ++msgstr "Escolha o computador para acordar ou entre com um endereço MAC" ++ ++msgid "Host to wake up" ++msgstr "Computador para acordar" ++ ++msgid "Network interface to use" ++msgstr "Interfaces de rede para usar" ++ ++#, fuzzy ++msgid "" ++"Sometimes only one of the two tools works. If one fails, try the other one" ++msgstr "" ++"Algumas vezes, somente uma das ferramentas funciona. Se uma delas falhar, " ++"tente a outra" ++ ++msgid "Specifies the interface the WoL packet is sent on" ++msgstr "Especifica a interface para onde os pacotes de WoL serão enviados" ++ ++msgid "Starting WoL utility:" ++msgstr "Iniciando utilitário WoL:" ++ ++msgid "Wake on LAN" ++msgstr "Wake on LAN" ++ ++msgid "" ++"Wake on LAN is a mechanism to remotely boot computers in the local network." ++msgstr "" ++"Wake on LAN é um mecanismo para acordar/ligar remotamente computadores na " ++"rede local." ++ ++msgid "Wake up host" ++msgstr "Acorda um computador" ++ ++msgid "WoL program" ++msgstr "Programa WoL" +diff --git a/feeds/luci/applications/luci-app-wol/po/pt/wol.po b/feeds/luci/applications/luci-app-wol/po/pt/wol.po +new file mode 100644 +index 0000000..540e543 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-wol/po/pt/wol.po +@@ -0,0 +1,54 @@ ++# Generated from applications/luci-wol/luasrc/model/cbi/wol.lua ++# ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Report-Msgid-Bugs-To: \n" ++"POT-Creation-Date: 2010-04-19 00:29+0200\n" ++"PO-Revision-Date: 2013-05-30 22:54+0200\n" ++"Last-Translator: joao.f.vieira \n" ++"Language-Team: none\n" ++"Language: pt\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n != 1);\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "Broadcast on all interfaces" ++msgstr "Broadcast em todas as interfaces" ++ ++msgid "Choose the host to wake up or enter a custom MAC address to use" ++msgstr "Escolha ao host a acordar ou escreva um MAC personalizado a ser usado" ++ ++msgid "Host to wake up" ++msgstr "Host a acordar" ++ ++msgid "Network interface to use" ++msgstr "Interface de rede a usar" ++ ++#, fuzzy ++msgid "" ++"Sometimes only one of the two tools works. If one fails, try the other one" ++msgstr "Às vezes só uma das ferramentas funciona. Se uma falhar, tente a outra" ++ ++msgid "Specifies the interface the WoL packet is sent on" ++msgstr "Especifica a interface pela qual é enviado o pacota WoL" ++ ++msgid "Starting WoL utility:" ++msgstr "A iniciar a ferramenta WoL" ++ ++msgid "Wake on LAN" ++msgstr "Wake on LAN" ++ ++msgid "" ++"Wake on LAN is a mechanism to remotely boot computers in the local network." ++msgstr "" ++"Wake on LAN é um mecanismo para remotamente iniciar computadores numa rede " ++"local." ++ ++msgid "Wake up host" ++msgstr "Acordar host" ++ ++msgid "WoL program" ++msgstr "Programa de WoL" +diff --git a/feeds/luci/applications/luci-app-wol/po/ro/wol.po b/feeds/luci/applications/luci-app-wol/po/ro/wol.po +new file mode 100644 +index 0000000..154a3f9 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-wol/po/ro/wol.po +@@ -0,0 +1,57 @@ ++# Generated from applications/luci-wol/luasrc/model/cbi/wol.lua ++# ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Report-Msgid-Bugs-To: \n" ++"POT-Creation-Date: 2010-04-19 00:29+0200\n" ++"PO-Revision-Date: 2011-10-07 16:47+0200\n" ++"Last-Translator: Daniel \n" ++"Language-Team: none\n" ++"Language: ro\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=3; plural=(n==1 ? 0 : (n==0 || (n%100 > 0 && n%100 < " ++"20)) ? 1 : 2);;\n" ++"X-Generator: Pootle 2.0.4\n" ++ ++msgid "Broadcast on all interfaces" ++msgstr "Broadcast pe toate interfetele" ++ ++msgid "Choose the host to wake up or enter a custom MAC address to use" ++msgstr "Alege statie pentru \"trezire\" sau introdu o adresa MAC de folosit" ++ ++msgid "Host to wake up" ++msgstr "Statie pentru \"trezire\"" ++ ++msgid "Network interface to use" ++msgstr "Interfata de retea pentru utilizare" ++ ++#, fuzzy ++msgid "" ++"Sometimes only one of the two tools works. If one fails, try the other one" ++msgstr "" ++"Uneori doar una dintre metode functioneaza. Daca se intampla, incearc-o pe " ++"cealalta" ++ ++msgid "Specifies the interface the WoL packet is sent on" ++msgstr "Specifica interfata prin care pachetele WoL sunt trimise" ++ ++msgid "Starting WoL utility:" ++msgstr "Pornire utilitar WoL:" ++ ++msgid "Wake on LAN" ++msgstr "Activarea pe LAN" ++ ++msgid "" ++"Wake on LAN is a mechanism to remotely boot computers in the local network." ++msgstr "" ++"Activarea pe LAN e un mecanism pentru a porni de la distanta computere de pe " ++"retea." ++ ++msgid "Wake up host" ++msgstr "Statie de \"trezire\"" ++ ++msgid "WoL program" ++msgstr "Program WoL" +diff --git a/feeds/luci/applications/luci-app-wol/po/ru/wol.po b/feeds/luci/applications/luci-app-wol/po/ru/wol.po +new file mode 100644 +index 0000000..9a84366 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-wol/po/ru/wol.po +@@ -0,0 +1,59 @@ ++# Generated from applications/luci-wol/luasrc/model/cbi/wol.lua ++# ++msgid "" ++msgstr "" ++"Project-Id-Version: LuCI: wol\n" ++"Report-Msgid-Bugs-To: \n" ++"POT-Creation-Date: 2010-04-19 00:29+0200\n" ++"PO-Revision-Date: 2012-08-15 12:07+0300\n" ++"Last-Translator: Roman A. aka BasicXP \n" ++"Language-Team: Russian \n" ++"Language: ru\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%" ++"10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" ++"X-Generator: Pootle 2.0.4\n" ++"X-Poedit-SourceCharset: UTF-8\n" ++ ++msgid "Broadcast on all interfaces" ++msgstr "ИÑпользовать широковещательную передачу на вÑе интерфейÑÑ‹" ++ ++msgid "Choose the host to wake up or enter a custom MAC address to use" ++msgstr "Выберите хоÑÑ‚, который необходимо разбудить, или введите его MAC-адреÑ" ++ ++msgid "Host to wake up" ++msgstr "ХоÑÑ‚, который необходимо разбудить" ++ ++msgid "Network interface to use" ++msgstr "ИÑпользуемый Ñетевой интерфейÑ" ++ ++#, fuzzy ++msgid "" ++"Sometimes only one of the two tools works. If one fails, try the other one" ++msgstr "" ++"Иногда только одна из двух утилит работает. Ð’ Ñлучае ошибки, попробуйте " ++"иÑпользовать другую" ++ ++msgid "Specifies the interface the WoL packet is sent on" ++msgstr "ОпределÑет интерфейÑ, по которому будут поÑланы пакеты WoL" ++ ++msgid "Starting WoL utility:" ++msgstr "ЗапуÑк WoL утилиты:" ++ ++msgid "Wake on LAN" ++msgstr "Wake on LAN" ++ ++msgid "" ++"Wake on LAN is a mechanism to remotely boot computers in the local network." ++msgstr "" ++"Пробуждение по LAN (Wake on LAN, WoL) - технологиÑ, позволÑÑŽÑ‰Ð°Ñ ÑƒÐ´Ð°Ð»Ñ‘Ð½Ð½Ð¾ " ++"«разбудить» (включить) компьютер поÑредÑтвом отправки через локальную Ñеть " ++"Ñпециальным образом Ñформированного пакета данных." ++ ++msgid "Wake up host" ++msgstr "Разбудить хоÑÑ‚" ++ ++msgid "WoL program" ++msgstr "Программа WoL" +diff --git a/feeds/luci/applications/luci-app-wol/po/sk/wol.po b/feeds/luci/applications/luci-app-wol/po/sk/wol.po +new file mode 100644 +index 0000000..eea59eb +--- /dev/null ++++ b/feeds/luci/applications/luci-app-wol/po/sk/wol.po +@@ -0,0 +1,44 @@ ++msgid "" ++msgstr "" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Last-Translator: Automatically generated\n" ++"Language-Team: none\n" ++"MIME-Version: 1.0\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n" ++ ++msgid "Broadcast on all interfaces" ++msgstr "" ++ ++msgid "Choose the host to wake up or enter a custom MAC address to use" ++msgstr "" ++ ++msgid "Host to wake up" ++msgstr "" ++ ++msgid "Network interface to use" ++msgstr "" ++ ++msgid "" ++"Sometimes only one of the two tools works. If one fails, try the other one" ++msgstr "" ++ ++msgid "Specifies the interface the WoL packet is sent on" ++msgstr "" ++ ++msgid "Starting WoL utility:" ++msgstr "" ++ ++msgid "Wake on LAN" ++msgstr "" ++ ++msgid "" ++"Wake on LAN is a mechanism to remotely boot computers in the local network." ++msgstr "" ++ ++msgid "Wake up host" ++msgstr "" ++ ++msgid "WoL program" ++msgstr "" +diff --git a/feeds/luci/applications/luci-app-wol/po/sv/wol.po b/feeds/luci/applications/luci-app-wol/po/sv/wol.po +new file mode 100644 +index 0000000..44b5995 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-wol/po/sv/wol.po +@@ -0,0 +1,45 @@ ++msgid "" ++msgstr "" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Last-Translator: Automatically generated\n" ++"Language-Team: none\n" ++"Language: sv\n" ++"MIME-Version: 1.0\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n != 1);\n" ++ ++msgid "Broadcast on all interfaces" ++msgstr "" ++ ++msgid "Choose the host to wake up or enter a custom MAC address to use" ++msgstr "" ++ ++msgid "Host to wake up" ++msgstr "" ++ ++msgid "Network interface to use" ++msgstr "" ++ ++msgid "" ++"Sometimes only one of the two tools works. If one fails, try the other one" ++msgstr "" ++ ++msgid "Specifies the interface the WoL packet is sent on" ++msgstr "" ++ ++msgid "Starting WoL utility:" ++msgstr "" ++ ++msgid "Wake on LAN" ++msgstr "" ++ ++msgid "" ++"Wake on LAN is a mechanism to remotely boot computers in the local network." ++msgstr "" ++ ++msgid "Wake up host" ++msgstr "" ++ ++msgid "WoL program" ++msgstr "" +diff --git a/feeds/luci/applications/luci-app-wol/po/templates/wol.pot b/feeds/luci/applications/luci-app-wol/po/templates/wol.pot +new file mode 100644 +index 0000000..1305c53 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-wol/po/templates/wol.pot +@@ -0,0 +1,37 @@ ++msgid "" ++msgstr "Content-Type: text/plain; charset=UTF-8" ++ ++msgid "Broadcast on all interfaces" ++msgstr "" ++ ++msgid "Choose the host to wake up or enter a custom MAC address to use" ++msgstr "" ++ ++msgid "Host to wake up" ++msgstr "" ++ ++msgid "Network interface to use" ++msgstr "" ++ ++msgid "" ++"Sometimes only one of the two tools works. If one fails, try the other one" ++msgstr "" ++ ++msgid "Specifies the interface the WoL packet is sent on" ++msgstr "" ++ ++msgid "Starting WoL utility:" ++msgstr "" ++ ++msgid "Wake on LAN" ++msgstr "" ++ ++msgid "" ++"Wake on LAN is a mechanism to remotely boot computers in the local network." ++msgstr "" ++ ++msgid "Wake up host" ++msgstr "" ++ ++msgid "WoL program" ++msgstr "" +diff --git a/feeds/luci/applications/luci-app-wol/po/tr/wol.po b/feeds/luci/applications/luci-app-wol/po/tr/wol.po +new file mode 100644 +index 0000000..9be6934 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-wol/po/tr/wol.po +@@ -0,0 +1,49 @@ ++# Generated from applications/luci-wol/luasrc/model/cbi/wol.lua ++# ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Report-Msgid-Bugs-To: \n" ++"POT-Creation-Date: 2010-04-19 00:29+0200\n" ++"PO-Revision-Date: 2010-04-19 00:29+0200\n" ++"Last-Translator: Automatically generated\n" ++"Language-Team: none\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=1; plural=0;\n" ++ ++msgid "Broadcast on all interfaces" ++msgstr "" ++ ++msgid "Choose the host to wake up or enter a custom MAC address to use" ++msgstr "" ++ ++msgid "Host to wake up" ++msgstr "" ++ ++msgid "Network interface to use" ++msgstr "" ++ ++msgid "" ++"Sometimes only one of the two tools works. If one fails, try the other one" ++msgstr "" ++ ++msgid "Specifies the interface the WoL packet is sent on" ++msgstr "" ++ ++msgid "Starting WoL utility:" ++msgstr "" ++ ++msgid "Wake on LAN" ++msgstr "" ++ ++msgid "" ++"Wake on LAN is a mechanism to remotely boot computers in the local network." ++msgstr "" ++ ++msgid "Wake up host" ++msgstr "" ++ ++msgid "WoL program" ++msgstr "" +diff --git a/feeds/luci/applications/luci-app-wol/po/uk/wol.po b/feeds/luci/applications/luci-app-wol/po/uk/wol.po +new file mode 100644 +index 0000000..c09d144 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-wol/po/uk/wol.po +@@ -0,0 +1,59 @@ ++# Generated from applications/luci-wol/luasrc/model/cbi/wol.lua ++# ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Report-Msgid-Bugs-To: \n" ++"POT-Creation-Date: 2010-04-19 00:29+0200\n" ++"PO-Revision-Date: 2013-05-26 19:00+0200\n" ++"Last-Translator: Yurii \n" ++"Language-Team: none\n" ++"Language: uk\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%" ++"10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "Broadcast on all interfaces" ++msgstr "Широкомовна транÑлÑÑ†Ñ–Ñ Ð½Ð° вÑÑ–Ñ… інтерфейÑах" ++ ++msgid "Choose the host to wake up or enter a custom MAC address to use" ++msgstr "" ++"Виберіть комп'ютер, Ñкий необхідно розбудити або введіть кориÑтувацьку MAC-" ++"адреÑу" ++ ++msgid "Host to wake up" ++msgstr "Комп'ютер, Ñкий необхідно розбудити" ++ ++msgid "Network interface to use" ++msgstr "ВикориÑтовувати мережевий інтерфейÑ" ++ ++#, fuzzy ++msgid "" ++"Sometimes only one of the two tools works. If one fails, try the other one" ++msgstr "" ++"Іноді працює тільки одна з цих двох утиліт. Якщо одна з них не працює, " ++"Ñпробуйте іншу." ++ ++msgid "Specifies the interface the WoL packet is sent on" ++msgstr "Визначає інтерфейÑ, Ñким буде надіÑлано пакет WoL" ++ ++msgid "Starting WoL utility:" ++msgstr "ЗапуÑк утиліти WoL:" ++ ++msgid "Wake on LAN" ++msgstr "Wake on LAN" ++ ++msgid "" ++"Wake on LAN is a mechanism to remotely boot computers in the local network." ++msgstr "" ++"ÐŸÑ€Ð¾Ð±ÑƒÐ´Ð¶ÐµÐ½Ð½Ñ Ñ‡ÐµÑ€ÐµÐ· LAN (Wake on LAN) Ñ” технологією, що дає змогу віддалено " ++"\"будити\" (вмикати) комп'ютери у локальній мережі." ++ ++msgid "Wake up host" ++msgstr "Розбудити комп'ютер" ++ ++msgid "WoL program" ++msgstr "Программа WoL" +diff --git a/feeds/luci/applications/luci-app-wol/po/vi/wol.po b/feeds/luci/applications/luci-app-wol/po/vi/wol.po +new file mode 100644 +index 0000000..9be6934 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-wol/po/vi/wol.po +@@ -0,0 +1,49 @@ ++# Generated from applications/luci-wol/luasrc/model/cbi/wol.lua ++# ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Report-Msgid-Bugs-To: \n" ++"POT-Creation-Date: 2010-04-19 00:29+0200\n" ++"PO-Revision-Date: 2010-04-19 00:29+0200\n" ++"Last-Translator: Automatically generated\n" ++"Language-Team: none\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=1; plural=0;\n" ++ ++msgid "Broadcast on all interfaces" ++msgstr "" ++ ++msgid "Choose the host to wake up or enter a custom MAC address to use" ++msgstr "" ++ ++msgid "Host to wake up" ++msgstr "" ++ ++msgid "Network interface to use" ++msgstr "" ++ ++msgid "" ++"Sometimes only one of the two tools works. If one fails, try the other one" ++msgstr "" ++ ++msgid "Specifies the interface the WoL packet is sent on" ++msgstr "" ++ ++msgid "Starting WoL utility:" ++msgstr "" ++ ++msgid "Wake on LAN" ++msgstr "" ++ ++msgid "" ++"Wake on LAN is a mechanism to remotely boot computers in the local network." ++msgstr "" ++ ++msgid "Wake up host" ++msgstr "" ++ ++msgid "WoL program" ++msgstr "" +diff --git a/feeds/luci/applications/luci-app-wol/po/zh-cn/wol.po b/feeds/luci/applications/luci-app-wol/po/zh-cn/wol.po +new file mode 100644 +index 0000000..6d9cc72 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-wol/po/zh-cn/wol.po +@@ -0,0 +1,50 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Report-Msgid-Bugs-To: \n" ++"POT-Creation-Date: 2010-04-19 00:29+0200\n" ++"PO-Revision-Date: 2012-06-21 17:52+0200\n" ++"Last-Translator: phantasm131 \n" ++"Language-Team: QQ Group 75543259 \n" ++"Language: zh_CN\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=1; plural=0;\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "Broadcast on all interfaces" ++msgstr "å‘所有接å£å¹¿æ’­" ++ ++msgid "Choose the host to wake up or enter a custom MAC address to use" ++msgstr "选择è¦å”¤é†’的主机或者输入自定义mac地å€" ++ ++msgid "Host to wake up" ++msgstr "选择è¦å”¤é†’的主机" ++ ++msgid "Network interface to use" ++msgstr "选择使用的网络接å£" ++ ++#, fuzzy ++msgid "" ++"Sometimes only one of the two tools works. If one fails, try the other one" ++msgstr "有时åªæœ‰ä¸€ä¸ªå·¥å…·ç”Ÿæ•ˆã€‚如果其中一个失效,请å°è¯•å¦ä¸€ä¸ª" ++ ++msgid "Specifies the interface the WoL packet is sent on" ++msgstr "é™å®šç½‘络唤醒数æ®åŒ…将被å‘é€åˆ°çš„接å£" ++ ++msgid "Starting WoL utility:" ++msgstr "正在å¯åŠ¨ç½‘络唤醒工具" ++ ++msgid "Wake on LAN" ++msgstr "网络唤醒" ++ ++msgid "" ++"Wake on LAN is a mechanism to remotely boot computers in the local network." ++msgstr "网络唤醒æ供了从远程å¯åŠ¨æœ¬åœ°ç½‘络内计算机的机制。" ++ ++msgid "Wake up host" ++msgstr "唤醒主机" ++ ++msgid "WoL program" ++msgstr "网络唤醒程åº" +diff --git a/feeds/luci/applications/luci-app-wol/po/zh-tw/wol.po b/feeds/luci/applications/luci-app-wol/po/zh-tw/wol.po +new file mode 100644 +index 0000000..ee290ec +--- /dev/null ++++ b/feeds/luci/applications/luci-app-wol/po/zh-tw/wol.po +@@ -0,0 +1,48 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"PO-Revision-Date: 2014-05-14 10:25+0200\n" ++"Last-Translator: omnistack \n" ++"Language-Team: none\n" ++"Language: zh_TW\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=1; plural=0;\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "Broadcast on all interfaces" ++msgstr "廣播到所有介é¢" ++ ++msgid "Choose the host to wake up or enter a custom MAC address to use" ++msgstr "å«é†’訂é¸çš„主機或者打入特定的MACä½å€ä»¥ä¾¿ä½¿ç”¨" ++ ++msgid "Host to wake up" ++msgstr "è¦å–šé†’主機清單" ++ ++msgid "Network interface to use" ++msgstr "使用的網路介é¢" ++ ++#, fuzzy ++msgid "" ++"Sometimes only one of the two tools works. If one fails, try the other one" ++msgstr "æŸäº›æ™‚候全部工具裡é¢åªæœ‰ä¸€å€‹ç™¼ç”Ÿä½œç”¨,試試å¦å¤–一個" ++ ++msgid "Specifies the interface the WoL packet is sent on" ++msgstr "指定WoL喚醒å°åŒ…將傳到哪個介é¢" ++ ++msgid "Starting WoL utility:" ++msgstr "啟用喚醒工具:" ++ ++msgid "Wake on LAN" ++msgstr "LANå€ç¶²å–šé†’" ++ ++msgid "" ++"Wake on LAN is a mechanism to remotely boot computers in the local network." ++msgstr "Wol就是在本地網路中é‡å°é ç«¯é–‹æ©Ÿé›»è…¦å–šé†’的機制" ++ ++msgid "Wake up host" ++msgstr "喚醒主機" ++ ++msgid "WoL program" ++msgstr "Wol喚醒程å¼" +diff --git a/feeds/luci/applications/luci-app-wshaper/Makefile b/feeds/luci/applications/luci-app-wshaper/Makefile +new file mode 100644 +index 0000000..63e63ab +--- /dev/null ++++ b/feeds/luci/applications/luci-app-wshaper/Makefile +@@ -0,0 +1,14 @@ ++# ++# Copyright (C) 2008-2014 The LuCI Team ++# ++# This is free software, licensed under the Apache License, Version 2.0 . ++# ++ ++include $(TOPDIR)/rules.mk ++ ++LUCI_TITLE:=LuCI Support for wshaper ++LUCI_DEPENDS:=+wshaper ++ ++include ../../luci.mk ++ ++# call BuildPackage - OpenWrt buildroot signature +diff --git a/feeds/luci/applications/luci-app-wshaper/luasrc/controller/wshaper.lua b/feeds/luci/applications/luci-app-wshaper/luasrc/controller/wshaper.lua +new file mode 100644 +index 0000000..2d0fe48 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-wshaper/luasrc/controller/wshaper.lua +@@ -0,0 +1,9 @@ ++-- Copyright 2011 Manuel Munz ++-- Licensed to the public under the Apache License 2.0. ++ ++module "luci.controller.wshaper" ++ ++function index() ++ entry({"admin", "network", "wshaper"}, cbi("wshaper"), _("Wondershaper"), 80) ++end ++ +diff --git a/feeds/luci/applications/luci-app-wshaper/luasrc/model/cbi/wshaper.lua b/feeds/luci/applications/luci-app-wshaper/luasrc/model/cbi/wshaper.lua +new file mode 100644 +index 0000000..6bd0255 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-wshaper/luasrc/model/cbi/wshaper.lua +@@ -0,0 +1,46 @@ ++-- Copyright 2011 Manuel Munz ++-- Licensed to the public under the Apache License 2.0. ++ ++require("luci.tools.webadmin") ++ ++m = Map("wshaper", translate("Wondershaper"), ++ translate("Wondershaper shapes traffic to ensure low latencies for interactive traffic even when your " .. ++ "internet connection is highly saturated.")) ++ ++s = m:section(NamedSection, "settings", "wshaper", translate("Wondershaper settings")) ++s.anonymous = true ++ ++network = s:option(ListValue, "network", translate("Interface")) ++luci.tools.webadmin.cbi_add_networks(network) ++ ++uplink = s:option(Value, "uplink", translate("Uplink"), translate("Upstream bandwidth in kbit/s")) ++uplink.optional = false ++uplink.datatype = "uinteger" ++uplink.default = "240" ++ ++uplink = s:option(Value, "downlink", translate("Downlink"), translate("Downstream bandwidth in kbit/s")) ++uplink.optional = false ++uplink.datatype = "uinteger" ++uplink.default = "200" ++ ++nopriohostsrc = s:option(DynamicList, "nopriohostsrc", translate("Low priority hosts (Source)"), translate("Host or Network in CIDR notation.")) ++nopriohostsrc.optional = true ++nopriohostsrc.datatype = ipaddr ++nopriohostsrc.placeholder = "10.0.0.1/32" ++ ++nopriohostdst = s:option(DynamicList, "nopriohostdst", translate("Low priority hosts (Destination)"), translate("Host or Network in CIDR notation.")) ++nopriohostdst.optional = true ++nopriohostdst.datatype = ipaddr ++nopriohostdst.placeholder = "10.0.0.1/32" ++ ++noprioportsrc = s:option(DynamicList, "noprioportsrc", translate("Low priority source ports")) ++noprioportsrc.optional = true ++noprioportsrc.datatype = "range(0,65535)" ++noprioportsrc.placeholder = "21" ++ ++noprioportdst = s:option(DynamicList, "noprioportdst", translate("Low priority destination ports")) ++noprioportdst.optional = true ++noprioportdst.datatype = "range(0,65535)" ++noprioportdst.placeholder = "21" ++ ++return m +diff --git a/feeds/luci/applications/luci-app-wshaper/po/ca/wshaper.po b/feeds/luci/applications/luci-app-wshaper/po/ca/wshaper.po +new file mode 100644 +index 0000000..2560383 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-wshaper/po/ca/wshaper.po +@@ -0,0 +1,59 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Report-Msgid-Bugs-To: \n" ++"POT-Creation-Date: 2014-06-01 22:51+0200\n" ++"PO-Revision-Date: 2014-07-01 03:51+0200\n" ++"Last-Translator: Alex \n" ++"Language-Team: LANGUAGE \n" ++"Language: ca\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n != 1);\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "Downlink" ++msgstr "Enllaç descendent" ++ ++msgid "Downstream bandwidth in kbit/s" ++msgstr "Amplada de banda descendent en kbit/s" ++ ++msgid "Host or Network in CIDR notation." ++msgstr "Host o xarxa en notació CIDR." ++ ++msgid "Interface" ++msgstr "Interfície" ++ ++msgid "Low priority destination ports" ++msgstr "Ports de destí de baixa prioritat" ++ ++msgid "Low priority hosts (Destination)" ++msgstr "Hosts de baixa prioritat (destí)" ++ ++msgid "Low priority hosts (Source)" ++msgstr "Hosts de baixa prioritat (origen)" ++ ++msgid "Low priority source ports" ++msgstr "Ports d'origen de baixa prioritat" ++ ++msgid "Uplink" ++msgstr "Enllaç ascendent" ++ ++msgid "Upstream bandwidth in kbit/s" ++msgstr "Amplada de banda ascendent en kbit/s" ++ ++msgid "Wondershaper" ++msgstr "Wondershaper" ++ ++msgid "Wondershaper settings" ++msgstr "Ajusts del Wondershaper" ++ ++#, fuzzy ++msgid "" ++"Wondershaper shapes traffic to ensure low latencies for interactive traffic " ++"even when your internet connection is highly saturated." ++msgstr "" ++"Wondershapter afaiçona el trànsit per assegurar latències baixes per a " ++"trànsit interactiu encara que la vostra connexió de Internet estigui " ++"altament saturada." +diff --git a/feeds/luci/applications/luci-app-wshaper/po/cs/wshaper.po b/feeds/luci/applications/luci-app-wshaper/po/cs/wshaper.po +new file mode 100644 +index 0000000..bca6c4e +--- /dev/null ++++ b/feeds/luci/applications/luci-app-wshaper/po/cs/wshaper.po +@@ -0,0 +1,58 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"PO-Revision-Date: 2012-04-24 15:20+0200\n" ++"Last-Translator: awm1 \n" ++"Language-Team: none\n" ++"Language: cs\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n" ++"X-Generator: Pootle 2.0.4\n" ++ ++msgid "Downlink" ++msgstr "Příchozí rychlost" ++ ++msgid "Downstream bandwidth in kbit/s" ++msgstr "Rychlost stahování dat v kbit/s" ++ ++msgid "Host or Network in CIDR notation." ++msgstr "Adresa poÄítaÄe nebo sítÄ› v CIDR notaci." ++ ++msgid "Interface" ++msgstr "Síťové rozhraní" ++ ++msgid "Low priority destination ports" ++msgstr "Cílové porty s nízkou prioritou" ++ ++msgid "Low priority hosts (Destination)" ++msgstr "Adresy cílových poÄítaÄů s nízkou prioritou" ++ ++msgid "Low priority hosts (Source)" ++msgstr "Adresy zdrojových poÄítaÄů s nízkou prioritou" ++ ++msgid "Low priority source ports" ++msgstr "Zdrojové porty s nízkou prioritou" ++ ++msgid "Uplink" ++msgstr "Odchozí rychlost" ++ ++msgid "Upstream bandwidth in kbit/s" ++msgstr "Rychlost odesílání dat v kbit/s" ++ ++msgid "Wondershaper" ++msgstr "Wondershaper" ++ ++msgid "Wondershaper settings" ++msgstr "Nastavení skriptu Wondershaper" ++ ++#, fuzzy ++msgid "" ++"Wondershaper shapes traffic to ensure low latencies for interactive traffic " ++"even when your internet connection is highly saturated." ++msgstr "" ++"Úkolem skriptu Wondershaper je řízení provozu na daném síťovém rozhraní. " ++"Snaží se zajistit nízké pÅ™enosové zpoždÄ›ní pro \"interaktivní\" síťový " ++"provoz (napÅ™. SSH), a to pÅ™edevším v okamžicích, kdy ostatní síťový provoz " ++"zahltí linku." +diff --git a/feeds/luci/applications/luci-app-wshaper/po/de/wshaper.po b/feeds/luci/applications/luci-app-wshaper/po/de/wshaper.po +new file mode 100644 +index 0000000..39dd617 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-wshaper/po/de/wshaper.po +@@ -0,0 +1,58 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: \n" ++"POT-Creation-Date: \n" ++"PO-Revision-Date: 2011-10-18 12:28+0200\n" ++"Last-Translator: Manuel \n" ++"Language-Team: \n" ++"Language: de\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n != 1);\n" ++"X-Generator: Pootle 2.0.4\n" ++ ++msgid "Downlink" ++msgstr "Download" ++ ++msgid "Downstream bandwidth in kbit/s" ++msgstr "Download Bandbreite in kbit/s" ++ ++msgid "Host or Network in CIDR notation." ++msgstr "Rechner oder Netzwerk in CIDR Schreibweise" ++ ++msgid "Interface" ++msgstr "Schnittstelle" ++ ++msgid "Low priority destination ports" ++msgstr "Zielports mit niedriger Priorität" ++ ++msgid "Low priority hosts (Destination)" ++msgstr "Zielrechner mit nideriger Priorität" ++ ++msgid "Low priority hosts (Source)" ++msgstr "Quellrechner mit neidriger Priorität" ++ ++msgid "Low priority source ports" ++msgstr "Quellports mit niedriger Priorität" ++ ++msgid "Uplink" ++msgstr "Upload" ++ ++msgid "Upstream bandwidth in kbit/s" ++msgstr "Upload Bandbreite in kbit/s" ++ ++msgid "Wondershaper" ++msgstr "Wondershaper" ++ ++msgid "Wondershaper settings" ++msgstr "Wondershaper Einstellungen" ++ ++#, fuzzy ++msgid "" ++"Wondershaper shapes traffic to ensure low latencies for interactive traffic " ++"even when your internet connection is highly saturated." ++msgstr "" ++"Wondershaper ermöglicht mit Hilfe von Traffic Shaping niedrige Latenzzeiten " ++"für interaktiven Internetverkehr selbst wenn die Internetverbindung extrem " ++"ausgelastet ist." +diff --git a/feeds/luci/applications/luci-app-wshaper/po/el/wshaper.po b/feeds/luci/applications/luci-app-wshaper/po/el/wshaper.po +new file mode 100644 +index 0000000..6d2f092 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-wshaper/po/el/wshaper.po +@@ -0,0 +1,55 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Report-Msgid-Bugs-To: \n" ++"POT-Creation-Date: 2012-03-18 17:10+0200\n" ++"PO-Revision-Date: 2012-03-18 17:10+0200\n" ++"Last-Translator: Vasilis \n" ++"Language-Team: LANGUAGE \n" ++"Language: el\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n != 1);\n" ++"X-Generator: Pootle 2.0.4\n" ++ ++msgid "Downlink" ++msgstr "" ++ ++msgid "Downstream bandwidth in kbit/s" ++msgstr "" ++ ++msgid "Host or Network in CIDR notation." ++msgstr "" ++ ++msgid "Interface" ++msgstr "Διεπαφή" ++ ++msgid "Low priority destination ports" ++msgstr "" ++ ++msgid "Low priority hosts (Destination)" ++msgstr "" ++ ++msgid "Low priority hosts (Source)" ++msgstr "" ++ ++msgid "Low priority source ports" ++msgstr "" ++ ++msgid "Uplink" ++msgstr "" ++ ++msgid "Upstream bandwidth in kbit/s" ++msgstr "" ++ ++msgid "Wondershaper" ++msgstr "" ++ ++msgid "Wondershaper settings" ++msgstr "" ++ ++msgid "" ++"Wondershaper shapes traffic to ensure low latencies for interactive traffic " ++"even when your internet connection is highly saturated." ++msgstr "" +diff --git a/feeds/luci/applications/luci-app-wshaper/po/en/wshaper.po b/feeds/luci/applications/luci-app-wshaper/po/en/wshaper.po +new file mode 100644 +index 0000000..b685839 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-wshaper/po/en/wshaper.po +@@ -0,0 +1,54 @@ ++msgid "" ++msgstr "" ++"Plural-Forms: nplurals=2; plural=(n != 1);\n" ++"Project-Id-Version: LuCI\n" ++"POT-Creation-Date: \n" ++"PO-Revision-Date: \n" ++"Last-Translator: \n" ++"Language-Team: \n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Language: en\n" ++"X-Generator: Poedit 1.6.10\n" ++ ++msgid "Downlink" ++msgstr "" ++ ++msgid "Downstream bandwidth in kbit/s" ++msgstr "" ++ ++msgid "Host or Network in CIDR notation." ++msgstr "" ++ ++msgid "Interface" ++msgstr "" ++ ++msgid "Low priority destination ports" ++msgstr "" ++ ++msgid "Low priority hosts (Destination)" ++msgstr "" ++ ++msgid "Low priority hosts (Source)" ++msgstr "" ++ ++msgid "Low priority source ports" ++msgstr "" ++ ++msgid "Uplink" ++msgstr "" ++ ++msgid "Upstream bandwidth in kbit/s" ++msgstr "" ++ ++msgid "Wondershaper" ++msgstr "" ++ ++msgid "Wondershaper settings" ++msgstr "" ++ ++msgid "" ++"Wondershaper shapes traffic to ensure low latencies for interactive traffic " ++"even when your internet connection is highly saturated." ++msgstr "" +diff --git a/feeds/luci/applications/luci-app-wshaper/po/es/wshaper.po b/feeds/luci/applications/luci-app-wshaper/po/es/wshaper.po +new file mode 100644 +index 0000000..f562760 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-wshaper/po/es/wshaper.po +@@ -0,0 +1,58 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Report-Msgid-Bugs-To: \n" ++"POT-Creation-Date: 2012-04-16 01:00+0200\n" ++"PO-Revision-Date: 2012-09-03 18:57+0200\n" ++"Last-Translator: José Vicente \n" ++"Language-Team: LANGUAGE \n" ++"Language: es\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n != 1);\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "Downlink" ++msgstr "Enlace de bajada" ++ ++msgid "Downstream bandwidth in kbit/s" ++msgstr "Ancho de banda de bajada en Kbit/s" ++ ++msgid "Host or Network in CIDR notation." ++msgstr "Máquina o red en notación CIDR." ++ ++msgid "Interface" ++msgstr "Interfaz" ++ ++msgid "Low priority destination ports" ++msgstr "Puertos de destino de prioridad baja" ++ ++msgid "Low priority hosts (Destination)" ++msgstr "Máquinas de prioridad baja (destino)" ++ ++msgid "Low priority hosts (Source)" ++msgstr "Máquinas de prioridad baja (origen)" ++ ++msgid "Low priority source ports" ++msgstr "Puertos de origen de prioridad baja" ++ ++msgid "Uplink" ++msgstr "Enlace de salida" ++ ++msgid "Upstream bandwidth in kbit/s" ++msgstr "Ancho de banda de subida en Kbit/s" ++ ++msgid "Wondershaper" ++msgstr "Wondershaper" ++ ++msgid "Wondershaper settings" ++msgstr "Configuración de Wondershaper" ++ ++#, fuzzy ++msgid "" ++"Wondershaper shapes traffic to ensure low latencies for interactive traffic " ++"even when your internet connection is highly saturated." ++msgstr "" ++"Wondershaper modela el tráfico para asegurar latencias bajas al tráfico " ++"interactivo incluso cuando la conexión a Internet esté muy saturada." +diff --git a/feeds/luci/applications/luci-app-wshaper/po/fr/wshaper.po b/feeds/luci/applications/luci-app-wshaper/po/fr/wshaper.po +new file mode 100644 +index 0000000..2fc9f53 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-wshaper/po/fr/wshaper.po +@@ -0,0 +1,62 @@ ++msgid "" ++msgstr "" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Plural-Forms: nplurals=2; plural=(n > 1);\n" ++"Project-Id-Version: LuCI\n" ++"POT-Creation-Date: \n" ++"PO-Revision-Date: \n" ++"Last-Translator: \n" ++"Language-Team: \n" ++"MIME-Version: 1.0\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Language: fr\n" ++"X-Generator: Poedit 1.6.10\n" ++ ++msgid "Downlink" ++msgstr "Lien descendant (télé-chargement)" ++ ++msgid "Downstream bandwidth in kbit/s" ++msgstr "Bande-passante descendante en kbit/s" ++ ++msgid "Host or Network in CIDR notation." ++msgstr "Hôte ou réseau en notation CIDR." ++ ++msgid "Interface" ++msgstr "Interface" ++ ++msgid "Low priority destination ports" ++msgstr "Ports-cible à faible priorité" ++ ++msgid "Low priority hosts (Destination)" ++msgstr "Hôtes-cible à faible priorité" ++ ++msgid "Low priority hosts (Source)" ++msgstr "Hôtes-source à faible priorité" ++ ++msgid "Low priority source ports" ++msgstr "Ports-source à faible priorité" ++ ++msgid "Uplink" ++msgstr "Lien montant (envois)" ++ ++msgid "Upstream bandwidth in kbit/s" ++msgstr "Bande-passante montante en kbit/s" ++ ++msgid "Wondershaper" ++msgstr "Wondershaper" ++ ++msgid "Wondershaper settings" ++msgstr "Paramètres Wondershaper" ++ ++msgid "" ++"Wondershaper shapes traffic to ensure low latencies for interactive traffic " ++"even when your internet connection is highly saturated." ++msgstr "" ++ ++#~ msgid "" ++#~ "Wondershaper uses traffic shaping to ensure low latencies for interactive " ++#~ "traffic even when your internet connection is highly saturated." ++#~ msgstr "" ++#~ "Wondershaper gère la priorités entre les flux pour assurer une faible " ++#~ "latence au trafic interactif même quand votre connexion Internet est très " ++#~ "chargée." +diff --git a/feeds/luci/applications/luci-app-wshaper/po/he/wshaper.po b/feeds/luci/applications/luci-app-wshaper/po/he/wshaper.po +new file mode 100644 +index 0000000..f03d5df +--- /dev/null ++++ b/feeds/luci/applications/luci-app-wshaper/po/he/wshaper.po +@@ -0,0 +1,54 @@ ++msgid "" ++msgstr "" ++"Plural-Forms: nplurals=2; plural=(n != 1);\n" ++"Project-Id-Version: LuCI\n" ++"POT-Creation-Date: \n" ++"PO-Revision-Date: \n" ++"Last-Translator: \n" ++"Language-Team: \n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Language: he\n" ++"X-Generator: Poedit 1.6.10\n" ++ ++msgid "Downlink" ++msgstr "" ++ ++msgid "Downstream bandwidth in kbit/s" ++msgstr "" ++ ++msgid "Host or Network in CIDR notation." ++msgstr "" ++ ++msgid "Interface" ++msgstr "" ++ ++msgid "Low priority destination ports" ++msgstr "" ++ ++msgid "Low priority hosts (Destination)" ++msgstr "" ++ ++msgid "Low priority hosts (Source)" ++msgstr "" ++ ++msgid "Low priority source ports" ++msgstr "" ++ ++msgid "Uplink" ++msgstr "" ++ ++msgid "Upstream bandwidth in kbit/s" ++msgstr "" ++ ++msgid "Wondershaper" ++msgstr "" ++ ++msgid "Wondershaper settings" ++msgstr "" ++ ++msgid "" ++"Wondershaper shapes traffic to ensure low latencies for interactive traffic " ++"even when your internet connection is highly saturated." ++msgstr "" +diff --git a/feeds/luci/applications/luci-app-wshaper/po/hu/wshaper.po b/feeds/luci/applications/luci-app-wshaper/po/hu/wshaper.po +new file mode 100644 +index 0000000..2377fa5 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-wshaper/po/hu/wshaper.po +@@ -0,0 +1,54 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Last-Translator: Automatically generated\n" ++"Language-Team: none\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n != 1);\n" ++ ++msgid "Downlink" ++msgstr "Letöltés" ++ ++msgid "Downstream bandwidth in kbit/s" ++msgstr "Letöltési sebesség kbit/másodberc-ben" ++ ++msgid "Host or Network in CIDR notation." ++msgstr "Gép vagy hálózat (CIDR jelöléssel)" ++ ++msgid "Interface" ++msgstr "Interfész" ++ ++msgid "Low priority destination ports" ++msgstr "Alacsony prioritású cél portok" ++ ++msgid "Low priority hosts (Destination)" ++msgstr "Alacson prioritású cél gépek" ++ ++msgid "Low priority hosts (Source)" ++msgstr "Alacsony prioritású forrás gépek" ++ ++msgid "Low priority source ports" ++msgstr "Alacson prioritású forrás portok" ++ ++msgid "Uplink" ++msgstr "Feltöltés" ++ ++msgid "Upstream bandwidth in kbit/s" ++msgstr "Feltöltési sebesség kbit/másodperc-ben" ++ ++msgid "Wondershaper" ++msgstr "Wondershaper" ++ ++msgid "Wondershaper settings" ++msgstr "Wondershaper beállítások" ++ ++#, fuzzy ++msgid "" ++"Wondershaper shapes traffic to ensure low latencies for interactive traffic " ++"even when your internet connection is highly saturated." ++msgstr "" ++"A Wondershaper 'traffic shaping'-et használatával biztosítja az interaktív " ++"forgalom alacsony késleletetését még akkor is ha az internet kapcsolat " ++"erÅ‘sen leterhelt." +diff --git a/feeds/luci/applications/luci-app-wshaper/po/it/wshaper.po b/feeds/luci/applications/luci-app-wshaper/po/it/wshaper.po +new file mode 100644 +index 0000000..6a72c7e +--- /dev/null ++++ b/feeds/luci/applications/luci-app-wshaper/po/it/wshaper.po +@@ -0,0 +1,59 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Report-Msgid-Bugs-To: \n" ++"POT-Creation-Date: 2013-01-28 01:36+0200\n" ++"PO-Revision-Date: 2013-02-03 14:07+0200\n" ++"Last-Translator: Francesco <3gasas@gmail.com>\n" ++"Language-Team: LANGUAGE \n" ++"Language: it\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n != 1);\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "Downlink" ++msgstr "Collegamento discendente" ++ ++msgid "Downstream bandwidth in kbit/s" ++msgstr "Larghezza di banda in downstream in kbit/s" ++ ++msgid "Host or Network in CIDR notation." ++msgstr "Host o rete in notazione CIDR." ++ ++msgid "Interface" ++msgstr "Interfaccia" ++ ++msgid "Low priority destination ports" ++msgstr "Porte di destinazione a bassa priorità" ++ ++msgid "Low priority hosts (Destination)" ++msgstr "Hosts a bassa priorità (Destinazione)" ++ ++msgid "Low priority hosts (Source)" ++msgstr "Hosts a bassa priorità (Fonte)" ++ ++msgid "Low priority source ports" ++msgstr "Porte sorgenti a bassa priorità" ++ ++msgid "Uplink" ++msgstr "Uplink" ++ ++msgid "Upstream bandwidth in kbit/s" ++msgstr "Larghezza di banda in upstream in kbit/s" ++ ++msgid "Wondershaper" ++msgstr "Wondershaper" ++ ++msgid "Wondershaper settings" ++msgstr "Impostazioni Wondershaper" ++ ++#, fuzzy ++msgid "" ++"Wondershaper shapes traffic to ensure low latencies for interactive traffic " ++"even when your internet connection is highly saturated." ++msgstr "" ++"WonderShaper usa la regolazione del traffico per garantire bassa latenza per " ++"il traffico interattivo anche quando la connessione a Internet è molto " ++"satura." +diff --git a/feeds/luci/applications/luci-app-wshaper/po/ja/wshaper.po b/feeds/luci/applications/luci-app-wshaper/po/ja/wshaper.po +new file mode 100644 +index 0000000..d58476c +--- /dev/null ++++ b/feeds/luci/applications/luci-app-wshaper/po/ja/wshaper.po +@@ -0,0 +1,58 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Report-Msgid-Bugs-To: \n" ++"POT-Creation-Date: 2012-03-17 18:28+0200\n" ++"PO-Revision-Date: 2012-03-18 09:07+0200\n" ++"Last-Translator: Kentaro \n" ++"Language-Team: LANGUAGE \n" ++"Language: ja\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=1; plural=0;\n" ++"X-Generator: Pootle 2.0.4\n" ++ ++msgid "Downlink" ++msgstr "下りリンク" ++ ++msgid "Downstream bandwidth in kbit/s" ++msgstr "下りリンク帯域 (kbit/sec)" ++ ++msgid "Host or Network in CIDR notation." ++msgstr "ホストåã¾ãŸã¯CIDR表記ã®ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ã‚¢ãƒ‰ãƒ¬ã‚¹" ++ ++msgid "Interface" ++msgstr "インターフェース" ++ ++msgid "Low priority destination ports" ++msgstr "低優先度ã®å®›å…ˆãƒãƒ¼ãƒˆ" ++ ++msgid "Low priority hosts (Destination)" ++msgstr "低優先度ã®å®›å…ˆãƒ›ã‚¹ãƒˆ" ++ ++msgid "Low priority hosts (Source)" ++msgstr "低優先度ã®é€ä¿¡å…ƒãƒ›ã‚¹ãƒˆ" ++ ++msgid "Low priority source ports" ++msgstr "低優先度ã®é€ä¿¡å…ƒãƒãƒ¼ãƒˆ" ++ ++msgid "Uplink" ++msgstr "上りリンク" ++ ++msgid "Upstream bandwidth in kbit/s" ++msgstr "上りリンク帯域 (kbit/sec)" ++ ++msgid "Wondershaper" ++msgstr "Wondershaper" ++ ++msgid "Wondershaper settings" ++msgstr "Wondershaper 設定" ++ ++#, fuzzy ++msgid "" ++"Wondershaper shapes traffic to ensure low latencies for interactive traffic " ++"even when your internet connection is highly saturated." ++msgstr "" ++"Wondweshaperã¯ã€ã‚¤ãƒ³ã‚¿ãƒ¼ãƒãƒƒãƒˆæŽ¥ç¶šãŒé£½å’ŒçŠ¶æ…‹ã®å ´åˆã§ã‚‚ã€ä½Žã„レイテンシ・円滑" ++"ãªé€šä¿¡ã‚’実ç¾ã™ã‚‹ãŸã‚ã«ãƒˆãƒ©ãƒ•ã‚£ãƒƒã‚¯ãƒ»ã‚·ã‚§ãƒ¼ãƒ”ングを行ã„ã¾ã™ã€‚" +diff --git a/feeds/luci/applications/luci-app-wshaper/po/ms/wshaper.po b/feeds/luci/applications/luci-app-wshaper/po/ms/wshaper.po +new file mode 100644 +index 0000000..ede1386 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-wshaper/po/ms/wshaper.po +@@ -0,0 +1,54 @@ ++msgid "" ++msgstr "" ++"Plural-Forms: nplurals=1; plural=0;\n" ++"Project-Id-Version: LuCI\n" ++"POT-Creation-Date: \n" ++"PO-Revision-Date: \n" ++"Last-Translator: \n" ++"Language-Team: \n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Language: ms\n" ++"X-Generator: Poedit 1.6.10\n" ++ ++msgid "Downlink" ++msgstr "" ++ ++msgid "Downstream bandwidth in kbit/s" ++msgstr "" ++ ++msgid "Host or Network in CIDR notation." ++msgstr "" ++ ++msgid "Interface" ++msgstr "" ++ ++msgid "Low priority destination ports" ++msgstr "" ++ ++msgid "Low priority hosts (Destination)" ++msgstr "" ++ ++msgid "Low priority hosts (Source)" ++msgstr "" ++ ++msgid "Low priority source ports" ++msgstr "" ++ ++msgid "Uplink" ++msgstr "" ++ ++msgid "Upstream bandwidth in kbit/s" ++msgstr "" ++ ++msgid "Wondershaper" ++msgstr "" ++ ++msgid "Wondershaper settings" ++msgstr "" ++ ++msgid "" ++"Wondershaper shapes traffic to ensure low latencies for interactive traffic " ++"even when your internet connection is highly saturated." ++msgstr "" +diff --git a/feeds/luci/applications/luci-app-wshaper/po/no/wshaper.po b/feeds/luci/applications/luci-app-wshaper/po/no/wshaper.po +new file mode 100644 +index 0000000..1b1ab32 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-wshaper/po/no/wshaper.po +@@ -0,0 +1,54 @@ ++msgid "" ++msgstr "" ++"Language: nn\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Plural-Forms: nplurals=2; plural=(n != 1);\n" ++"Project-Id-Version: LuCI\n" ++"POT-Creation-Date: \n" ++"PO-Revision-Date: \n" ++"Last-Translator: \n" ++"Language-Team: \n" ++"MIME-Version: 1.0\n" ++"Content-Transfer-Encoding: 8bit\n" ++"X-Generator: Poedit 1.6.10\n" ++ ++msgid "Downlink" ++msgstr "" ++ ++msgid "Downstream bandwidth in kbit/s" ++msgstr "" ++ ++msgid "Host or Network in CIDR notation." ++msgstr "" ++ ++msgid "Interface" ++msgstr "" ++ ++msgid "Low priority destination ports" ++msgstr "" ++ ++msgid "Low priority hosts (Destination)" ++msgstr "" ++ ++msgid "Low priority hosts (Source)" ++msgstr "" ++ ++msgid "Low priority source ports" ++msgstr "" ++ ++msgid "Uplink" ++msgstr "" ++ ++msgid "Upstream bandwidth in kbit/s" ++msgstr "" ++ ++msgid "Wondershaper" ++msgstr "" ++ ++msgid "Wondershaper settings" ++msgstr "" ++ ++msgid "" ++"Wondershaper shapes traffic to ensure low latencies for interactive traffic " ++"even when your internet connection is highly saturated." ++msgstr "" +diff --git a/feeds/luci/applications/luci-app-wshaper/po/pl/wshaper.po b/feeds/luci/applications/luci-app-wshaper/po/pl/wshaper.po +new file mode 100644 +index 0000000..a85bf00 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-wshaper/po/pl/wshaper.po +@@ -0,0 +1,59 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Report-Msgid-Bugs-To: \n" ++"POT-Creation-Date: 2012-04-14 14:15+0200\n" ++"PO-Revision-Date: 2012-04-14 17:21+0200\n" ++"Last-Translator: Tomecki \n" ++"Language-Team: LANGUAGE \n" ++"Language: pl\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 " ++"|| n%100>=20) ? 1 : 2);\n" ++"X-Generator: Pootle 2.0.4\n" ++ ++msgid "Downlink" ++msgstr "Downlink" ++ ++msgid "Downstream bandwidth in kbit/s" ++msgstr "Przepustowość pobierania w kbit/s" ++ ++msgid "Host or Network in CIDR notation." ++msgstr "Adres hosta lub adres sieci w notacji CIDR" ++ ++msgid "Interface" ++msgstr "Interfejs" ++ ++msgid "Low priority destination ports" ++msgstr "Porty docelowe o niskim priorytecie" ++ ++msgid "Low priority hosts (Destination)" ++msgstr "Hosty docelowe o niskim priorytecie" ++ ++msgid "Low priority hosts (Source)" ++msgstr "Hosty źródÅ‚owe o niskim priorytecie" ++ ++msgid "Low priority source ports" ++msgstr "Porty źródÅ‚owe o niskim priorytecie" ++ ++msgid "Uplink" ++msgstr "Uplink" ++ ++msgid "Upstream bandwidth in kbit/s" ++msgstr "Przepustowość wysyÅ‚ania w kbit/s" ++ ++msgid "Wondershaper" ++msgstr "Wondershaper" ++ ++msgid "Wondershaper settings" ++msgstr "Ustawienia Wondershaper" ++ ++#, fuzzy ++msgid "" ++"Wondershaper shapes traffic to ensure low latencies for interactive traffic " ++"even when your internet connection is highly saturated." ++msgstr "" ++"Wondershaper wykorzystuje ksztaÅ‚towanie ruchu aby zapewnić niskie opóźnienia " ++"nawet wtedy, gdy Twoje poÅ‚Ä…czenie internetowe jest wysycone." +diff --git a/feeds/luci/applications/luci-app-wshaper/po/pt-br/wshaper.po b/feeds/luci/applications/luci-app-wshaper/po/pt-br/wshaper.po +new file mode 100644 +index 0000000..f973ebb +--- /dev/null ++++ b/feeds/luci/applications/luci-app-wshaper/po/pt-br/wshaper.po +@@ -0,0 +1,59 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Report-Msgid-Bugs-To: \n" ++"POT-Creation-Date: 2011-10-18 19:32+0200\n" ++"PO-Revision-Date: 2011-10-18 19:39+0200\n" ++"Last-Translator: Luiz Angelo \n" ++"Language-Team: LANGUAGE \n" ++"Language: pt_BR\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n > 1);\n" ++"X-Generator: Pootle 2.0.4\n" ++ ++msgid "Downlink" ++msgstr "Velocidade para baixar (downlink)" ++ ++msgid "Downstream bandwidth in kbit/s" ++msgstr "Taxa de transferência para baixar em kbit/s" ++ ++msgid "Host or Network in CIDR notation." ++msgstr "Equipamento ou Rede na notação CIDR." ++ ++msgid "Interface" ++msgstr "Interface" ++ ++msgid "Low priority destination ports" ++msgstr "Portas de destino de baixa prioridade" ++ ++msgid "Low priority hosts (Destination)" ++msgstr "Equipamentos de baixa prioridade (Destino)" ++ ++msgid "Low priority hosts (Source)" ++msgstr "Equipamentos de baixa prioridade (Origem)" ++ ++msgid "Low priority source ports" ++msgstr "Portas de origem de baixa prioridade" ++ ++msgid "Uplink" ++msgstr "Velocidade para subir (uplink)" ++ ++msgid "Upstream bandwidth in kbit/s" ++msgstr "Taxa de transferência para subir em kbit/s" ++ ++msgid "Wondershaper" ++msgstr "Wondershaper" ++ ++msgid "Wondershaper settings" ++msgstr "Configuração do Wondershaper" ++ ++#, fuzzy ++msgid "" ++"Wondershaper shapes traffic to ensure low latencies for interactive traffic " ++"even when your internet connection is highly saturated." ++msgstr "" ++"Wondershaper usa o controle de tráfego para garantir baixa latência para " ++"tráfego interativo mesmo quando sua conexão com a internet está extremamente " ++"saturada." +diff --git a/feeds/luci/applications/luci-app-wshaper/po/pt/wshaper.po b/feeds/luci/applications/luci-app-wshaper/po/pt/wshaper.po +new file mode 100644 +index 0000000..96a7be8 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-wshaper/po/pt/wshaper.po +@@ -0,0 +1,55 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Report-Msgid-Bugs-To: \n" ++"POT-Creation-Date: 2013-05-31 12:13+0200\n" ++"PO-Revision-Date: 2013-05-31 12:15+0200\n" ++"Last-Translator: joao.f.vieira \n" ++"Language-Team: LANGUAGE \n" ++"Language: pt\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n != 1);\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "Downlink" ++msgstr "" ++ ++msgid "Downstream bandwidth in kbit/s" ++msgstr "" ++ ++msgid "Host or Network in CIDR notation." ++msgstr "" ++ ++msgid "Interface" ++msgstr "Interface" ++ ++msgid "Low priority destination ports" ++msgstr "Porta de destino com baixa prioridade" ++ ++msgid "Low priority hosts (Destination)" ++msgstr "Hosts com baixa prioridade (Destino)" ++ ++msgid "Low priority hosts (Source)" ++msgstr "Hosts com baixa prioridade (Origem)" ++ ++msgid "Low priority source ports" ++msgstr "Portas de origem com baixa prioridade" ++ ++msgid "Uplink" ++msgstr "" ++ ++msgid "Upstream bandwidth in kbit/s" ++msgstr "" ++ ++msgid "Wondershaper" ++msgstr "" ++ ++msgid "Wondershaper settings" ++msgstr "" ++ ++msgid "" ++"Wondershaper shapes traffic to ensure low latencies for interactive traffic " ++"even when your internet connection is highly saturated." ++msgstr "" +diff --git a/feeds/luci/applications/luci-app-wshaper/po/ro/wshaper.po b/feeds/luci/applications/luci-app-wshaper/po/ro/wshaper.po +new file mode 100644 +index 0000000..d2569f6 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-wshaper/po/ro/wshaper.po +@@ -0,0 +1,56 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Report-Msgid-Bugs-To: \n" ++"POT-Creation-Date: 2014-06-28 18:45+0200\n" ++"PO-Revision-Date: 2014-06-28 18:46+0200\n" ++"Last-Translator: xxvirusxx \n" ++"Language-Team: LANGUAGE \n" ++"Language: ro\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=3; plural=(n==1 ? 0 : (n==0 || (n%100 > 0 && n%100 < " ++"20)) ? 1 : 2);;\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "Downlink" ++msgstr "" ++ ++msgid "Downstream bandwidth in kbit/s" ++msgstr "" ++ ++msgid "Host or Network in CIDR notation." ++msgstr "" ++ ++msgid "Interface" ++msgstr "" ++ ++msgid "Low priority destination ports" ++msgstr "" ++ ++msgid "Low priority hosts (Destination)" ++msgstr "" ++ ++msgid "Low priority hosts (Source)" ++msgstr "" ++ ++msgid "Low priority source ports" ++msgstr "" ++ ++msgid "Uplink" ++msgstr "" ++ ++msgid "Upstream bandwidth in kbit/s" ++msgstr "" ++ ++msgid "Wondershaper" ++msgstr "" ++ ++msgid "Wondershaper settings" ++msgstr "" ++ ++msgid "" ++"Wondershaper shapes traffic to ensure low latencies for interactive traffic " ++"even when your internet connection is highly saturated." ++msgstr "" +diff --git a/feeds/luci/applications/luci-app-wshaper/po/ru/wshaper.po b/feeds/luci/applications/luci-app-wshaper/po/ru/wshaper.po +new file mode 100644 +index 0000000..1984aac +--- /dev/null ++++ b/feeds/luci/applications/luci-app-wshaper/po/ru/wshaper.po +@@ -0,0 +1,61 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: LuCI: wsharper\n" ++"Report-Msgid-Bugs-To: \n" ++"POT-Creation-Date: 2012-01-26 15:09+0200\n" ++"PO-Revision-Date: 2012-08-15 11:53+0300\n" ++"Last-Translator: Roman A. aka BasicXP \n" ++"Language-Team: Russian \n" ++"Language: ru\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%" ++"10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" ++"X-Generator: Pootle 2.0.4\n" ++"X-Poedit-SourceCharset: UTF-8\n" ++ ++msgid "Downlink" ++msgstr "ÐиÑходÑщий канал" ++ ++msgid "Downstream bandwidth in kbit/s" ++msgstr "Ширина полоÑÑ‹ пропуÑÐºÐ°Ð½Ð¸Ñ Ð¿Ñ€Ñмого канала (кбит/Ñ)" ++ ++msgid "Host or Network in CIDR notation." ++msgstr "ХоÑÑ‚ или Ñеть в нотации CIDR." ++ ++msgid "Interface" ++msgstr "ИнтерфейÑ" ++ ++msgid "Low priority destination ports" ++msgstr "Ðизкоприоритетные порты назначениÑ" ++ ++msgid "Low priority hosts (Destination)" ++msgstr "Ðизкоприоритетные хоÑÑ‚Ñ‹ назначениÑ" ++ ++msgid "Low priority hosts (Source)" ++msgstr "Ðизкоприоритетные хоÑÑ‚Ñ‹ иÑточника" ++ ++msgid "Low priority source ports" ++msgstr "Ðизкоприоритетные порты иÑточника" ++ ++msgid "Uplink" ++msgstr "ВоÑходÑщий канал" ++ ++msgid "Upstream bandwidth in kbit/s" ++msgstr "ПропуÑÐºÐ½Ð°Ñ ÑпоÑобноÑÑ‚ÑŒ обратного канала (кбит/c)" ++ ++msgid "Wondershaper" ++msgstr "Wondershaper" ++ ++msgid "Wondershaper settings" ++msgstr "УÑтановки Wondershaper" ++ ++#, fuzzy ++msgid "" ++"Wondershaper shapes traffic to ensure low latencies for interactive traffic " ++"even when your internet connection is highly saturated." ++msgstr "" ++"Wondershaper иÑпользует формирование трафика Ð´Ð»Ñ Ð¾Ð±ÐµÑÐ¿ÐµÑ‡ÐµÐ½Ð¸Ñ Ð½Ð¸Ð·ÐºÐ¸Ñ… задержек " ++"интерактивного трафика даже в Ñлучае выÑокой загруженноÑти интернет-" ++"ÑоединениÑ." +diff --git a/feeds/luci/applications/luci-app-wshaper/po/sk/wshaper.po b/feeds/luci/applications/luci-app-wshaper/po/sk/wshaper.po +new file mode 100644 +index 0000000..4e03aa8 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-wshaper/po/sk/wshaper.po +@@ -0,0 +1,50 @@ ++msgid "" ++msgstr "" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Last-Translator: Automatically generated\n" ++"Language-Team: none\n" ++"MIME-Version: 1.0\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n" ++ ++msgid "Downlink" ++msgstr "" ++ ++msgid "Downstream bandwidth in kbit/s" ++msgstr "" ++ ++msgid "Host or Network in CIDR notation." ++msgstr "" ++ ++msgid "Interface" ++msgstr "" ++ ++msgid "Low priority destination ports" ++msgstr "" ++ ++msgid "Low priority hosts (Destination)" ++msgstr "" ++ ++msgid "Low priority hosts (Source)" ++msgstr "" ++ ++msgid "Low priority source ports" ++msgstr "" ++ ++msgid "Uplink" ++msgstr "" ++ ++msgid "Upstream bandwidth in kbit/s" ++msgstr "" ++ ++msgid "Wondershaper" ++msgstr "" ++ ++msgid "Wondershaper settings" ++msgstr "" ++ ++msgid "" ++"Wondershaper shapes traffic to ensure low latencies for interactive traffic " ++"even when your internet connection is highly saturated." ++msgstr "" +diff --git a/feeds/luci/applications/luci-app-wshaper/po/sv/wshaper.po b/feeds/luci/applications/luci-app-wshaper/po/sv/wshaper.po +new file mode 100644 +index 0000000..b85651a +--- /dev/null ++++ b/feeds/luci/applications/luci-app-wshaper/po/sv/wshaper.po +@@ -0,0 +1,51 @@ ++msgid "" ++msgstr "" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Last-Translator: Automatically generated\n" ++"Language-Team: none\n" ++"Language: sv\n" ++"MIME-Version: 1.0\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n != 1);\n" ++ ++msgid "Downlink" ++msgstr "" ++ ++msgid "Downstream bandwidth in kbit/s" ++msgstr "" ++ ++msgid "Host or Network in CIDR notation." ++msgstr "" ++ ++msgid "Interface" ++msgstr "" ++ ++msgid "Low priority destination ports" ++msgstr "" ++ ++msgid "Low priority hosts (Destination)" ++msgstr "" ++ ++msgid "Low priority hosts (Source)" ++msgstr "" ++ ++msgid "Low priority source ports" ++msgstr "" ++ ++msgid "Uplink" ++msgstr "" ++ ++msgid "Upstream bandwidth in kbit/s" ++msgstr "" ++ ++msgid "Wondershaper" ++msgstr "" ++ ++msgid "Wondershaper settings" ++msgstr "" ++ ++msgid "" ++"Wondershaper shapes traffic to ensure low latencies for interactive traffic " ++"even when your internet connection is highly saturated." ++msgstr "" +diff --git a/feeds/luci/applications/luci-app-wshaper/po/templates/wshaper.pot b/feeds/luci/applications/luci-app-wshaper/po/templates/wshaper.pot +new file mode 100644 +index 0000000..42de011 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-wshaper/po/templates/wshaper.pot +@@ -0,0 +1,43 @@ ++msgid "" ++msgstr "Content-Type: text/plain; charset=UTF-8" ++ ++msgid "Downlink" ++msgstr "" ++ ++msgid "Downstream bandwidth in kbit/s" ++msgstr "" ++ ++msgid "Host or Network in CIDR notation." ++msgstr "" ++ ++msgid "Interface" ++msgstr "" ++ ++msgid "Low priority destination ports" ++msgstr "" ++ ++msgid "Low priority hosts (Destination)" ++msgstr "" ++ ++msgid "Low priority hosts (Source)" ++msgstr "" ++ ++msgid "Low priority source ports" ++msgstr "" ++ ++msgid "Uplink" ++msgstr "" ++ ++msgid "Upstream bandwidth in kbit/s" ++msgstr "" ++ ++msgid "Wondershaper" ++msgstr "" ++ ++msgid "Wondershaper settings" ++msgstr "" ++ ++msgid "" ++"Wondershaper shapes traffic to ensure low latencies for interactive traffic " ++"even when your internet connection is highly saturated." ++msgstr "" +diff --git a/feeds/luci/applications/luci-app-wshaper/po/tr/wshaper.po b/feeds/luci/applications/luci-app-wshaper/po/tr/wshaper.po +new file mode 100644 +index 0000000..7c0acb0 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-wshaper/po/tr/wshaper.po +@@ -0,0 +1,50 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Last-Translator: Automatically generated\n" ++"Language-Team: none\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=1; plural=0;\n" ++ ++msgid "Downlink" ++msgstr "" ++ ++msgid "Downstream bandwidth in kbit/s" ++msgstr "" ++ ++msgid "Host or Network in CIDR notation." ++msgstr "" ++ ++msgid "Interface" ++msgstr "" ++ ++msgid "Low priority destination ports" ++msgstr "" ++ ++msgid "Low priority hosts (Destination)" ++msgstr "" ++ ++msgid "Low priority hosts (Source)" ++msgstr "" ++ ++msgid "Low priority source ports" ++msgstr "" ++ ++msgid "Uplink" ++msgstr "" ++ ++msgid "Upstream bandwidth in kbit/s" ++msgstr "" ++ ++msgid "Wondershaper" ++msgstr "" ++ ++msgid "Wondershaper settings" ++msgstr "" ++ ++msgid "" ++"Wondershaper shapes traffic to ensure low latencies for interactive traffic " ++"even when your internet connection is highly saturated." ++msgstr "" +diff --git a/feeds/luci/applications/luci-app-wshaper/po/uk/wshaper.po b/feeds/luci/applications/luci-app-wshaper/po/uk/wshaper.po +new file mode 100644 +index 0000000..94d20df +--- /dev/null ++++ b/feeds/luci/applications/luci-app-wshaper/po/uk/wshaper.po +@@ -0,0 +1,58 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"PO-Revision-Date: 2012-04-28 21:54+0200\n" ++"Last-Translator: Yurii \n" ++"Language-Team: none\n" ++"Language: uk\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%" ++"10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "Downlink" ++msgstr "ПрÑмий канал" ++ ++msgid "Downstream bandwidth in kbit/s" ++msgstr "Ширина Ñмуги пропуÑÐºÐ°Ð½Ð½Ñ Ð¿Ñ€Ñмого каналу (кбіт/Ñ)" ++ ++msgid "Host or Network in CIDR notation." ++msgstr "Вузол або мережа в нотації CIDR." ++ ++msgid "Interface" ++msgstr "ІнтерфейÑ" ++ ++msgid "Low priority destination ports" ++msgstr "Ðизькопріоритетні порти призначеннÑ" ++ ++msgid "Low priority hosts (Destination)" ++msgstr "Ðизькопріоритетні вузли призначеннÑ" ++ ++msgid "Low priority hosts (Source)" ++msgstr "Ðизькопріоритетні вузли джерела" ++ ++msgid "Low priority source ports" ++msgstr "Ðизькопріоритетні порти джерела" ++ ++msgid "Uplink" ++msgstr "Зворотній канал" ++ ++msgid "Upstream bandwidth in kbit/s" ++msgstr "Ширина Ñмуги пропуÑÐºÐ°Ð½Ð½Ñ Ð·Ð²Ð¾Ñ€Ð¾Ñ‚Ð½Ð¾Ð³Ð¾ каналу (кбіт/c)" ++ ++msgid "Wondershaper" ++msgstr "Wondershaper" ++ ++msgid "Wondershaper settings" ++msgstr "ÐÐ°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ Wondershaper" ++ ++#, fuzzy ++msgid "" ++"Wondershaper shapes traffic to ensure low latencies for interactive traffic " ++"even when your internet connection is highly saturated." ++msgstr "" ++"Wondershaper викориÑтовує Ñ„Ð¾Ñ€Ð¼ÑƒÐ²Ð°Ð½Ð½Ñ Ñ‚Ñ€Ð°Ñ„Ñ–ÐºÑƒ Ð´Ð»Ñ Ð·Ð°Ð±ÐµÐ·Ð¿ÐµÑ‡ÐµÐ½Ð½Ñ Ð½Ð¸Ð·ÑŒÐºÐ¾Ñ— " ++"затримки інтерактивного трафіку, навіть Ñкщо ваше з'Ñ”Ð´Ð½Ð°Ð½Ð½Ñ Ð· інтернетом " ++"дуже наÑичене." +diff --git a/feeds/luci/applications/luci-app-wshaper/po/vi/wshaper.po b/feeds/luci/applications/luci-app-wshaper/po/vi/wshaper.po +new file mode 100644 +index 0000000..e0b8e53 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-wshaper/po/vi/wshaper.po +@@ -0,0 +1,54 @@ ++msgid "" ++msgstr "" ++"Plural-Forms: nplurals=1; plural=0;\n" ++"Project-Id-Version: LuCI\n" ++"POT-Creation-Date: \n" ++"PO-Revision-Date: \n" ++"Last-Translator: \n" ++"Language-Team: \n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Language: vi\n" ++"X-Generator: Poedit 1.6.10\n" ++ ++msgid "Downlink" ++msgstr "" ++ ++msgid "Downstream bandwidth in kbit/s" ++msgstr "" ++ ++msgid "Host or Network in CIDR notation." ++msgstr "" ++ ++msgid "Interface" ++msgstr "" ++ ++msgid "Low priority destination ports" ++msgstr "" ++ ++msgid "Low priority hosts (Destination)" ++msgstr "" ++ ++msgid "Low priority hosts (Source)" ++msgstr "" ++ ++msgid "Low priority source ports" ++msgstr "" ++ ++msgid "Uplink" ++msgstr "" ++ ++msgid "Upstream bandwidth in kbit/s" ++msgstr "" ++ ++msgid "Wondershaper" ++msgstr "" ++ ++msgid "Wondershaper settings" ++msgstr "" ++ ++msgid "" ++"Wondershaper shapes traffic to ensure low latencies for interactive traffic " ++"even when your internet connection is highly saturated." ++msgstr "" +diff --git a/feeds/luci/applications/luci-app-wshaper/po/zh-cn/wshaper.po b/feeds/luci/applications/luci-app-wshaper/po/zh-cn/wshaper.po +new file mode 100644 +index 0000000..a35ccd0 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-wshaper/po/zh-cn/wshaper.po +@@ -0,0 +1,58 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Report-Msgid-Bugs-To: \n" ++"POT-Creation-Date: 2011-11-03 08:25+0200\n" ++"PO-Revision-Date: 2013-10-10 20:15+0200\n" ++"Last-Translator: Tanyingyu \n" ++"Language-Team: LANGUAGE \n" ++"Language: zh_CN\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=1; plural=0;\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "Downlink" ++msgstr "下载链接" ++ ++msgid "Downstream bandwidth in kbit/s" ++msgstr "下载带宽kbit/s" ++ ++msgid "Host or Network in CIDR notation." ++msgstr "主机或网络的CIDR标记。" ++ ++msgid "Interface" ++msgstr "端å£" ++ ++msgid "Low priority destination ports" ++msgstr "低优先级目标端å£" ++ ++msgid "Low priority hosts (Destination)" ++msgstr "低优先级目标主机" ++ ++msgid "Low priority hosts (Source)" ++msgstr "低优先级æºä¸»æœº" ++ ++msgid "Low priority source ports" ++msgstr "低优先级æºç«¯å£" ++ ++msgid "Uplink" ++msgstr "上è”" ++ ++msgid "Upstream bandwidth in kbit/s" ++msgstr "上行带宽kbit/s" ++ ++msgid "Wondershaper" ++msgstr "Wondershaper" ++ ++msgid "Wondershaper settings" ++msgstr "Wondershaper设置" ++ ++#, fuzzy ++msgid "" ++"Wondershaper shapes traffic to ensure low latencies for interactive traffic " ++"even when your internet connection is highly saturated." ++msgstr "" ++"Wondershaper通过æµé‡åŒ¹é…,ç¡®ä¿ä½Žå»¶æ—¶çš„交互数æ®åŒ…,甚至当你的互è”网连接是高度饱" ++"和。" +diff --git a/feeds/luci/applications/luci-app-wshaper/po/zh-tw/wshaper.po b/feeds/luci/applications/luci-app-wshaper/po/zh-tw/wshaper.po +new file mode 100644 +index 0000000..1814825 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-wshaper/po/zh-tw/wshaper.po +@@ -0,0 +1,56 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"PO-Revision-Date: 2014-05-14 12:40+0200\n" ++"Last-Translator: omnistack \n" ++"Language-Team: none\n" ++"Language: zh_TW\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=1; plural=0;\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "Downlink" ++msgstr "下載" ++ ++msgid "Downstream bandwidth in kbit/s" ++msgstr "以 kbit/s表示的下載頻寬" ++ ++msgid "Host or Network in CIDR notation." ++msgstr "CIDR無類別域間路由中的主機或網路" ++ ++msgid "Interface" ++msgstr "介é¢" ++ ++msgid "Low priority destination ports" ++msgstr "低優先權目地埠號" ++ ++msgid "Low priority hosts (Destination)" ++msgstr "低優先權主機(目的地)" ++ ++msgid "Low priority hosts (Source)" ++msgstr "低優先權主機(來æº)" ++ ++msgid "Low priority source ports" ++msgstr "低優先權來æºåŸ è™Ÿ" ++ ++msgid "Uplink" ++msgstr "上傳" ++ ++msgid "Upstream bandwidth in kbit/s" ++msgstr "以kbit/s表示的上傳頻寬" ++ ++msgid "Wondershaper" ++msgstr "Wondershaper頻寬管ç†" ++ ++msgid "Wondershaper settings" ++msgstr "Wondershaper設定值" ++ ++#, fuzzy ++msgid "" ++"Wondershaper shapes traffic to ensure low latencies for interactive traffic " ++"even when your internet connection is highly saturated." ++msgstr "" ++"既使你的網路連線é”到高飽和, Wondershaper採用æµé‡éŠ³åŒ–塑形以é‡å°æœªçŸ¥çš„æµé‡ä¿è­‰" ++"低延é²" +diff --git a/feeds/luci/applications/luci-app-wshaper/root/etc/uci-defaults/wshaper b/feeds/luci/applications/luci-app-wshaper/root/etc/uci-defaults/wshaper +new file mode 100644 +index 0000000..918dff2 +--- /dev/null ++++ b/feeds/luci/applications/luci-app-wshaper/root/etc/uci-defaults/wshaper +@@ -0,0 +1,11 @@ ++#!/bin/sh ++ ++uci -q batch <<-EOF >/dev/null ++ delete ucitrack.@wshaper[-1] ++ set ucitrack.wshaper="wshaper" ++ set ucitrack.wshaper.exec='/etc/init.d/wshaper start' ++ commit ucitrack ++EOF ++ ++rm -f /tmp/luci-indexcache ++exit 0 +diff --git a/feeds/luci/build/i18n-init.sh b/feeds/luci/build/i18n-init.sh +new file mode 100755 +index 0000000..b20fbc3 +--- /dev/null ++++ b/feeds/luci/build/i18n-init.sh +@@ -0,0 +1,24 @@ ++#!/bin/sh ++ ++PATTERN=$1 ++SCM= ++ ++[ -d .svn ] && SCM="svn" ++git=$( which git 2>/dev/null ) ++[ "$git" ] && "$git" status >/dev/null && SCM="git" ++ ++[ -z "$SCM" ] && { ++ echo "Unsupported SCM tool" >&2 ++ exit 1 ++} ++ ++[ -z "$PATTERN" ] && PATTERN="*.pot" ++ ++for lang in $(cd po; echo ?? ??_??); do ++ for file in $(cd po/templates; echo $PATTERN); do ++ if [ -f po/templates/$file -a ! -f "po/$lang/${file%.pot}.po" ]; then ++ msginit --no-translator -l "$lang" -i "po/templates/$file" -o "po/$lang/${file%.pot}.po" ++ $SCM add "po/$lang/${file%.pot}.po" ++ fi ++ done ++done +diff --git a/feeds/luci/build/i18n-po2lua.pl b/feeds/luci/build/i18n-po2lua.pl +new file mode 100755 +index 0000000..5129055 +--- /dev/null ++++ b/feeds/luci/build/i18n-po2lua.pl +@@ -0,0 +1,27 @@ ++#!/usr/bin/perl ++ ++@ARGV == 2 || die "Usage: $0 \n"; ++ ++my $source_dir = shift @ARGV; ++my $target_dir = shift @ARGV; ++ ++if( ! -d $target_dir ) ++{ ++ system('mkdir', '-p', $target_dir); ++} ++ ++if( open F, "find $source_dir -type f -name '*.po' |" ) ++{ ++ while( chomp( my $file = readline F ) ) ++ { ++ my ( $lang, $basename ) = $file =~ m{.+/(\w+)/([^/]+)\.po$}; ++ $lang = lc $lang; ++ $lang =~ s/_/-/g; ++ ++ printf "Generating %-40s ", "$target_dir/$basename.$lang.lmo"; ++ system("./build/po2lmo", $file, "$target_dir/$basename.$lang.lmo"); ++ print ( -f "$target_dir/$basename.$lang.lmo" ? "done\n" : "empty\n" ); ++ } ++ ++ close F; ++} +diff --git a/feeds/luci/build/i18n-scan.pl b/feeds/luci/build/i18n-scan.pl +new file mode 100755 +index 0000000..899d90d +--- /dev/null ++++ b/feeds/luci/build/i18n-scan.pl +@@ -0,0 +1,128 @@ ++#!/usr/bin/perl ++ ++use strict; ++use warnings; ++use Text::Balanced qw(extract_bracketed extract_delimited extract_tagged); ++ ++@ARGV >= 1 || die "Usage: $0 \n"; ++ ++ ++my %stringtable; ++ ++sub dec_lua_str ++{ ++ my $s = shift; ++ $s =~ s/[\s\n]+/ /g; ++ $s =~ s/\\n/\n/g; ++ $s =~ s/\\t/\t/g; ++ $s =~ s/\\(.)/$1/g; ++ $s =~ s/^ //; ++ $s =~ s/ $//; ++ return $s; ++} ++ ++sub dec_tpl_str ++{ ++ my $s = shift; ++ $s =~ s/-$//; ++ $s =~ s/[\s\n]+/ /g; ++ $s =~ s/^ //; ++ $s =~ s/ $//; ++ $s =~ s/\\/\\\\/g; ++ return $s; ++} ++ ++ ++if( open F, "find @ARGV -type f '(' -name '*.htm' -o -name '*.lua' ')' |" ) ++{ ++ while( defined( my $file = readline F ) ) ++ { ++ chomp $file; ++ ++ if( open S, "< $file" ) ++ { ++ local $/ = undef; ++ my $raw = ; ++ close S; ++ ++ ++ my $text = $raw; ++ ++ while( $text =~ s/ ^ .*? (?:translate|translatef|i18n|_) [\n\s]* \( /(/sgx ) ++ { ++ ( my $code, $text ) = extract_bracketed($text, q{('")}); ++ ++ $code =~ s/\\\n/ /g; ++ $code =~ s/^\([\n\s]*//; ++ $code =~ s/[\n\s]*\)$//; ++ ++ my $res = ""; ++ my $sub = ""; ++ ++ if( $code =~ /^['"]/ ) ++ { ++ while( defined $sub ) ++ { ++ ( $sub, $code ) = extract_delimited($code, q{'"}, q{\s*(?:\.\.\s*)?}); ++ ++ if( defined $sub && length($sub) > 2 ) ++ { ++ $res .= substr $sub, 1, length($sub) - 2; ++ } ++ else ++ { ++ undef $sub; ++ } ++ } ++ } ++ elsif( $code =~ /^(\[=*\[)/ ) ++ { ++ my $stag = quotemeta $1; ++ my $etag = $stag; ++ $etag =~ s/\[/]/g; ++ ++ ( $res ) = extract_tagged($code, $stag, $etag); ++ ++ $res =~ s/^$stag//; ++ $res =~ s/$etag$//; ++ } ++ ++ $res = dec_lua_str($res); ++ $stringtable{$res}++ if $res; ++ } ++ ++ ++ $text = $raw; ++ ++ while( $text =~ s/ ^ .*? <% -? [:_] /<%/sgx ) ++ { ++ ( my $code, $text ) = extract_tagged($text, '<%', '%>'); ++ ++ if( defined $code ) ++ { ++ $code = dec_tpl_str(substr $code, 2, length($code) - 4); ++ $stringtable{$code}++; ++ } ++ } ++ } ++ } ++ ++ close F; ++} ++ ++ ++if( open C, "| msgcat -" ) ++{ ++ printf C "msgid \"\"\nmsgstr \"Content-Type: text/plain; charset=UTF-8\"\n\n"; ++ ++ foreach my $key ( sort keys %stringtable ) ++ { ++ if( length $key ) ++ { ++ $key =~ s/"/\\"/g; ++ printf C "msgid \"%s\"\nmsgstr \"\"\n\n", $key; ++ } ++ } ++ ++ close C; ++} +diff --git a/feeds/luci/build/i18n-sync.sh b/feeds/luci/build/i18n-sync.sh +new file mode 100755 +index 0000000..d4f9666 +--- /dev/null ++++ b/feeds/luci/build/i18n-sync.sh +@@ -0,0 +1,18 @@ ++#!/bin/sh ++ ++[ -d ./build ] || { ++ echo "Execute as ./build/i18n-sync.sh" >&2 ++ exit 1 ++} ++ ++./build/mkbasepot.sh ++ ++find . -name '*.pot' -and -not -name base.pot -and -not -name rrdtool.pot | \ ++ while read path; do ++ dir="${path%/po/templates/*}" ++ echo -n "Updating ${path#./} ... " ++ ./build/i18n-scan.pl "$dir" > "$path" ++ echo "done" ++ done ++ ++./build/i18n-update.pl +diff --git a/feeds/luci/build/i18n-update.pl b/feeds/luci/build/i18n-update.pl +new file mode 100755 +index 0000000..c82b4fe +--- /dev/null ++++ b/feeds/luci/build/i18n-update.pl +@@ -0,0 +1,83 @@ ++#!/usr/bin/perl ++ ++@ARGV <= 2 || die "Usage: $0 [] []\n"; ++ ++my $source = shift @ARGV; ++my $pattern = shift @ARGV || '*.po'; ++ ++sub read_header ++{ ++ my $file = shift || return; ++ local $/; ++ ++ open P, "< $file" || die "open(): $!"; ++ my $data = readline P; ++ close P; ++ ++ $data =~ / ++ ^ ( ++ msgid \s "" \n ++ msgstr \s "" \n ++ (?: " [^\n]+ " \n )+ ++ \n ) ++ /mx; ++ ++ return $1; ++} ++ ++sub write_header ++{ ++ my $file = shift || return; ++ my $head = shift || return; ++ local $/; ++ ++ open P, "< $file" || die "open(): $!"; ++ my $data = readline P; ++ close P; ++ ++ $data =~ s/ ++ ^ ( ++ msgid \s "" \n ++ msgstr \s "" \n ++ (?: " [^\n]+ " \n )+ ++ \n ) ++ /$head/mx; ++ ++ open P, "> $file" || die "open(): $!"; ++ print P $data; ++ close P; ++} ++ ++my @dirs; ++ ++if( ! $source ) ++{ ++ @dirs = glob("./*/*/po/"); ++} ++else ++{ ++ @dirs = ( $source ); ++} ++ ++foreach my $dir (@dirs) ++{ ++ if( open F, "find $dir -type f -name '$pattern' |" ) ++ { ++ while( chomp( my $file = readline F ) ) ++ { ++ my ( $basename ) = $file =~ m{.+/([^/]+)\.po$}; ++ ++ if( -f "$dir/templates/$basename.pot" ) ++ { ++ my $head = read_header($file); ++ ++ printf "Updating %-40s", $file; ++ system("msgmerge", "-U", "-N", $file, "$dir/templates/$basename.pot"); ++ ++ write_header($file, $head); ++ } ++ } ++ ++ close F; ++ } ++} +diff --git a/feeds/luci/build/luadoc/doc.lua b/feeds/luci/build/luadoc/doc.lua +new file mode 100755 +index 0000000..383dde2 +--- /dev/null ++++ b/feeds/luci/build/luadoc/doc.lua +@@ -0,0 +1,126 @@ ++#!/usr/bin/env lua ++------------------------------------------------------------------------------- ++-- LuaDoc launcher. ++-- @release $Id: luadoc.lua.in,v 1.1 2008/02/17 06:42:51 jasonsantos Exp $ ++------------------------------------------------------------------------------- ++ ++--local source = debug.getinfo(1).source or "" ++--local mypath = source:match("@(.+)/[^/]+") ++ ++--package.path = package.path .. ";" .. mypath .. "/?.lua;" .. mypath .. "/?/init.lua" ++ ++require "luadoc.init" ++ ++------------------------------------------------------------------------------- ++-- Print version number. ++ ++local function print_version () ++ print (string.format("%s\n%s\n%s", ++ luadoc._VERSION, ++ luadoc._DESCRIPTION, ++ luadoc._COPYRIGHT)) ++end ++ ++------------------------------------------------------------------------------- ++-- Print usage message. ++ ++local function print_help () ++ print ("Usage: "..arg[0]..[[ [options|files] ++Generate documentation from files. Available options are: ++ -d path output directory path ++ -t path template directory path ++ -h, --help print this help and exit ++ --noindexpage do not generate global index page ++ --nofiles do not generate documentation for files ++ --nomodules do not generate documentation for modules ++ --doclet doclet_module doclet module to generate output ++ --taglet taglet_module taglet module to parse input code ++ -q, --quiet suppress all normal output ++ -v, --version print version information]]) ++end ++ ++local function off_messages (arg, i, options) ++ options.verbose = nil ++end ++ ++------------------------------------------------------------------------------- ++-- Process options. TODO: use getopts. ++-- @class table ++-- @name OPTIONS ++ ++local OPTIONS = { ++ d = function (arg, i, options) ++ local dir = arg[i+1] ++ if string.sub (dir, -2) ~= "/" then ++ dir = dir..'/' ++ end ++ options.output_dir = dir ++ return 1 ++ end, ++ t = function (arg, i, options) ++ local dir = arg[i+1] ++ if string.sub (dir, -2) ~= "/" then ++ dir = dir..'/' ++ end ++ options.template_dir = dir ++ return 1 ++ end, ++ h = print_help, ++ help = print_help, ++ q = off_messages, ++ quiet = off_messages, ++ v = print_version, ++ version = print_version, ++ doclet = function (arg, i, options) ++ options.doclet = arg[i+1] ++ return 1 ++ end, ++ taglet = function (arg, i, options) ++ options.taglet = arg[i+1] ++ return 1 ++ end, ++} ++ ++------------------------------------------------------------------------------- ++ ++local function process_options (arg) ++ local files = {} ++ local options = require "luadoc.config" ++ local i = 1 ++ while i <= #arg do ++ local argi = arg[i] ++ if string.sub (argi, 1, 1) ~= '-' then ++ table.insert (files, argi) ++ else ++ local opt = string.sub (argi, 2) ++ if string.sub (opt, 1, 1) == '-' then ++ opt = string.gsub (opt, "%-", "") ++ end ++ if OPTIONS[opt] then ++ if OPTIONS[opt] (arg, i, options) then ++ i = i + 1 ++ end ++ else ++ options[opt] = 1 ++ end ++ end ++ i = i+1 ++ end ++ return files, options ++end ++ ++------------------------------------------------------------------------------- ++-- Main function. Process command-line parameters and call luadoc processor. ++ ++function main (arg) ++ -- Process options ++ local argc = #arg ++ if argc < 1 then ++ print_help () ++ return ++ end ++ local files, options = process_options (arg) ++ return luadoc.main(files, options) ++end ++ ++main(arg) +diff --git a/feeds/luci/build/luadoc/luadoc/config.lua b/feeds/luci/build/luadoc/luadoc/config.lua +new file mode 100644 +index 0000000..9e4b9de +--- /dev/null ++++ b/feeds/luci/build/luadoc/luadoc/config.lua +@@ -0,0 +1,34 @@ ++------------------------------------------------------------------------------- ++-- LuaDoc configuration file. This file contains the default options for ++-- luadoc operation. These options can be overriden by the command line tool ++-- @see luadoc.print_help ++-- @release $Id: config.lua,v 1.6 2007/04/18 14:28:39 tomas Exp $ ++------------------------------------------------------------------------------- ++ ++module "luadoc.config" ++ ++------------------------------------------------------------------------------- ++-- Default options ++-- @class table ++-- @name default_options ++-- @field output_dir default output directory for generated documentation, used ++-- by several doclets ++-- @field taglet parser used to analyze source code input ++-- @field doclet documentation generator ++-- @field template_dir directory with documentation templates, used by the html ++-- doclet ++-- @field verbose command line tool configuration to output processing ++-- information ++ ++local default_options = { ++ output_dir = "", ++ taglet = "luadoc.taglet.standard", ++ doclet = "luadoc.doclet.html", ++ -- TODO: find a way to define doclet specific options ++ template_dir = "luadoc/doclet/html/", ++ nomodules = false, ++ nofiles = false, ++ verbose = true, ++} ++ ++return default_options +diff --git a/feeds/luci/build/luadoc/luadoc/doclet/debug.lua b/feeds/luci/build/luadoc/luadoc/doclet/debug.lua +new file mode 100644 +index 0000000..0b75f84 +--- /dev/null ++++ b/feeds/luci/build/luadoc/luadoc/doclet/debug.lua +@@ -0,0 +1,46 @@ ++----------------------------------------------------------------- ++-- LuaDoc debugging facilities. ++-- @release $Id: debug.lua,v 1.3 2007/04/18 14:28:39 tomas Exp $ ++----------------------------------------------------------------- ++ ++module "luadoc.doclet.debug" ++ ++function printline() ++ print(string.rep('-', 79)) ++end ++ ++----------------------------------------------------------------- ++-- Print debug information about document ++-- @param doc Table with the structured documentation. ++ ++function start (doc) ++ print("Files:") ++ for _, filepath in ipairs(doc.files) do ++ print('\t', filepath) ++ end ++ printline() ++ ++ print("Modules:") ++ for _, modulename in ipairs(doc.modules) do ++ print('\t', modulename) ++ end ++ printline() ++ ++ for i, v in pairs(doc.files) do ++ print('\t', i, v) ++ end ++ printline() ++ for i, v in pairs(doc.files[doc.files[1]]) do ++ print(i, v) ++ end ++ ++ printline() ++ for i, v in pairs(doc.files[doc.files[1]].doc[1]) do ++ print(i, v) ++ end ++ printline() ++ print("Params") ++ for i, v in pairs(doc.files[doc.files[1]].doc[1].param) do ++ print(i, v) ++ end ++end +diff --git a/feeds/luci/build/luadoc/luadoc/doclet/formatter.lua b/feeds/luci/build/luadoc/luadoc/doclet/formatter.lua +new file mode 100644 +index 0000000..2d72538 +--- /dev/null ++++ b/feeds/luci/build/luadoc/luadoc/doclet/formatter.lua +@@ -0,0 +1,84 @@ ++------------------------------------------------------------------------------- ++-- Doclet to format source code according to LuaDoc standard tags. This doclet ++-- (re)write .lua files adding missing standard tags. Texts are formatted to ++-- 80 columns and function parameters are added based on code analysis. ++-- ++-- @release $Id: formatter.lua,v 1.5 2007/04/18 14:28:39 tomas Exp $ ++------------------------------------------------------------------------------- ++ ++local util = require "luadoc.util" ++local assert, ipairs, pairs, type = assert, ipairs, pairs, type ++local string = require"string" ++local table = require"table" ++ ++module "luadoc.doclet.formatter" ++ ++options = { ++ output_dir = "./", ++} ++ ++------------------------------------------------------------------------------- ++-- Assembly the output filename for an input file. ++-- TODO: change the name of this function ++function out_file (filename) ++ local h = filename ++ h = options.output_dir..h ++ return h ++end ++ ++------------------------------------------------------------------------------- ++-- Generate a new lua file for each input lua file. If the user does not ++-- specify a different output directory input files will be rewritten. ++-- @param doc documentation table ++ ++function start (doc) ++ local todo = "" ++ ++ -- Process files ++ for i, file_doc in ipairs(doc.files) do ++ -- assembly the filename ++ local filename = out_file(file_doc.name) ++ luadoc.logger:info(string.format("generating file `%s'", filename)) ++ ++ -- TODO: confirm file overwrite ++ local f = posix.open(filename, "w") ++ assert(f, string.format("could not open `%s' for writing", filename)) ++ ++ for _, block in ipairs(file_doc.doc) do ++ ++ -- write reorganized comments ++ f:write(string.rep("-", 80).."\n") ++ ++ -- description ++ f:write(util.comment(util.wrap(block.description, 77))) ++ f:write("\n") ++ ++ if block.class == "function" then ++ -- parameters ++ table.foreachi(block.param, function (_, param_name) ++ f:write(util.comment(util.wrap(string.format("@param %s %s", param_name, block.param[param_name] or todo), 77))) ++ f:write("\n") ++ end) ++ ++ -- return ++ if type(block.ret) == "table" then ++ table.foreachi(block.ret, function (_, ret) ++ f:write(util.comment(util.wrap(string.format("@return %s", ret), 77)).."\n") ++ end) ++ else ++ f:write(util.comment(util.wrap(string.format("@return %s", block.ret or todo), 77)).."\n") ++ end ++ end ++ ++ -- TODO: usage ++ -- TODO: see ++ ++ -- write code ++ for _, line in ipairs(block.code) do ++ f:write(line.."\n") ++ end ++ end ++ ++ f:close() ++ end ++end +diff --git a/feeds/luci/build/luadoc/luadoc/doclet/html.lua b/feeds/luci/build/luadoc/luadoc/doclet/html.lua +new file mode 100644 +index 0000000..e77fb74 +--- /dev/null ++++ b/feeds/luci/build/luadoc/luadoc/doclet/html.lua +@@ -0,0 +1,275 @@ ++------------------------------------------------------------------------------- ++-- Doclet that generates HTML output. This doclet generates a set of html files ++-- based on a group of templates. The main templates are: ++--
      ++--
    • index.lp: index of modules and files;
    • ++--
    • file.lp: documentation for a lua file;
    • ++--
    • module.lp: documentation for a lua module;
    • ++--
    • function.lp: documentation for a lua function. This is a ++-- sub-template used by the others.
    • ++--
    ++-- ++-- @release $Id: html.lua,v 1.29 2007/12/21 17:50:48 tomas Exp $ ++------------------------------------------------------------------------------- ++ ++local assert, getfenv, ipairs, loadstring, pairs, setfenv, tostring, tonumber, type = assert, getfenv, ipairs, loadstring, pairs, setfenv, tostring, tonumber, type ++local io = require"io" ++local posix = require "nixio.fs" ++local lp = require "luadoc.lp" ++local luadoc = require"luadoc" ++local package = package ++local string = require"string" ++local table = require"table" ++ ++module "luadoc.doclet.html" ++ ++------------------------------------------------------------------------------- ++-- Looks for a file `name' in given path. Removed from compat-5.1 ++-- @param path String with the path. ++-- @param name String with the name to look for. ++-- @return String with the complete path of the file found ++-- or nil in case the file is not found. ++ ++local function search (path, name) ++ for c in string.gfind(path, "[^;]+") do ++ c = string.gsub(c, "%?", name) ++ local f = io.open(c) ++ if f then -- file exist? ++ f:close() ++ return c ++ end ++ end ++ return nil -- file not found ++end ++ ++------------------------------------------------------------------------------- ++-- Include the result of a lp template into the current stream. ++ ++function include (template, env) ++ -- template_dir is relative to package.path ++ local templatepath = options.template_dir .. template ++ ++ -- search using package.path (modified to search .lp instead of .lua ++ local search_path = string.gsub(package.path, "%.lua", "") ++ local templatepath = search(search_path, templatepath) ++ assert(templatepath, string.format("template `%s' not found", template)) ++ ++ env = env or {} ++ env.table = table ++ env.io = io ++ env.lp = lp ++ env.ipairs = ipairs ++ env.tonumber = tonumber ++ env.tostring = tostring ++ env.type = type ++ env.luadoc = luadoc ++ env.options = options ++ ++ return lp.include(templatepath, env) ++end ++ ++------------------------------------------------------------------------------- ++-- Returns a link to a html file, appending "../" to the link to make it right. ++-- @param html Name of the html file to link to ++-- @return link to the html file ++ ++function link (html, from) ++ local h = html ++ from = from or "" ++ string.gsub(from, "/", function () h = "../" .. h end) ++ return h ++end ++ ++------------------------------------------------------------------------------- ++-- Returns the name of the html file to be generated from a module. ++-- Files with "lua" or "luadoc" extensions are replaced by "html" extension. ++-- @param modulename Name of the module to be processed, may be a .lua file or ++-- a .luadoc file. ++-- @return name of the generated html file for the module ++ ++function module_link (modulename, doc, from) ++ -- TODO: replace "." by "/" to create directories? ++ -- TODO: how to deal with module names with "/"? ++ assert(modulename) ++ assert(doc) ++ from = from or "" ++ ++ if doc.modules[modulename] == nil then ++-- logger:error(string.format("unresolved reference to module `%s'", modulename)) ++ return ++ end ++ ++ local href = "modules/" .. modulename .. ".html" ++ string.gsub(from, "/", function () href = "../" .. href end) ++ return href ++end ++ ++------------------------------------------------------------------------------- ++-- Returns the name of the html file to be generated from a lua(doc) file. ++-- Files with "lua" or "luadoc" extensions are replaced by "html" extension. ++-- @param to Name of the file to be processed, may be a .lua file or ++-- a .luadoc file. ++-- @param from path of where am I, based on this we append ..'s to the ++-- beginning of path ++-- @return name of the generated html file ++ ++function file_link (to, from) ++ assert(to) ++ from = from or "" ++ ++ local href = to ++ href = string.gsub(href, "lua$", "html") ++ href = string.gsub(href, "luadoc$", "html") ++ href = "files/" .. href ++ string.gsub(from, "/", function () href = "../" .. href end) ++ return href ++end ++ ++------------------------------------------------------------------------------- ++-- Returns a link to a function or to a table ++-- @param fname name of the function or table to link to. ++-- @param doc documentation table ++-- @param kind String specying the kinf of element to link ("functions" or "tables"). ++ ++function link_to (fname, doc, module_doc, file_doc, from, kind) ++ assert(fname) ++ assert(doc) ++ from = from or "" ++ kind = kind or "functions" ++ ++ if file_doc then ++ for _, func_name in pairs(file_doc[kind]) do ++ if func_name == fname then ++ return file_link(file_doc.name, from) .. "#" .. fname ++ end ++ end ++ end ++ ++ if module_doc and module_doc[kind] then ++ for func_name, tbl in pairs(module_doc[kind]) do ++ if func_name == fname then ++ return "#" .. fname ++ end ++ end ++ end ++ ++ local _, _, modulename, fname = string.find(fname, "^(.-)[%.%:]?([^%.%:]*)$") ++ assert(fname) ++ ++ -- if fname does not specify a module, use the module_doc ++ if string.len(modulename) == 0 and module_doc then ++ modulename = module_doc.name ++ end ++ ++ local module_doc = doc.modules[modulename] ++ if not module_doc then ++-- logger:error(string.format("unresolved reference to function `%s': module `%s' not found", fname, modulename)) ++ return ++ end ++ ++ for _, func_name in pairs(module_doc[kind]) do ++ if func_name == fname then ++ return module_link(modulename, doc, from) .. "#" .. fname ++ end ++ end ++ ++-- logger:error(string.format("unresolved reference to function `%s' of module `%s'", fname, modulename)) ++end ++ ++------------------------------------------------------------------------------- ++-- Make a link to a file, module or function ++ ++function symbol_link (symbol, doc, module_doc, file_doc, from) ++ assert(symbol) ++ assert(doc) ++ ++ local href = ++-- file_link(symbol, from) or ++ module_link(symbol, doc, from) or ++ link_to(symbol, doc, module_doc, file_doc, from, "functions") or ++ link_to(symbol, doc, module_doc, file_doc, from, "tables") ++ ++ if not href then ++ logger:error(string.format("unresolved reference to symbol `%s'", symbol)) ++ end ++ ++ return href or "" ++end ++ ++------------------------------------------------------------------------------- ++-- Assembly the output filename for an input file. ++-- TODO: change the name of this function ++function out_file (filename) ++ local h = filename ++ h = string.gsub(h, "lua$", "html") ++ h = string.gsub(h, "luadoc$", "html") ++ h = "files/" .. h ++-- h = options.output_dir .. string.gsub (h, "^.-([%w_]+%.html)$", "%1") ++ h = options.output_dir .. h ++ return h ++end ++ ++------------------------------------------------------------------------------- ++-- Assembly the output filename for a module. ++-- TODO: change the name of this function ++function out_module (modulename) ++ local h = modulename .. ".html" ++ h = "modules/" .. h ++ h = options.output_dir .. h ++ return h ++end ++ ++----------------------------------------------------------------- ++-- Generate the output. ++-- @param doc Table with the structured documentation. ++ ++function start (doc) ++ -- Generate index file ++ if (#doc.files > 0 or #doc.modules > 0) and (not options.noindexpage) then ++ local filename = options.output_dir.."index.html" ++ logger:info(string.format("generating file `%s'", filename)) ++ local f = posix.open(filename, "w") ++ assert(f, string.format("could not open `%s' for writing", filename)) ++ io.output(f) ++ include("index.lp", { doc = doc }) ++ f:close() ++ end ++ ++ -- Process modules ++ if not options.nomodules then ++ for _, modulename in ipairs(doc.modules) do ++ local module_doc = doc.modules[modulename] ++ -- assembly the filename ++ local filename = out_module(modulename) ++ logger:info(string.format("generating file `%s'", filename)) ++ ++ local f = posix.open(filename, "w") ++ assert(f, string.format("could not open `%s' for writing", filename)) ++ io.output(f) ++ include("module.lp", { doc = doc, module_doc = module_doc }) ++ f:close() ++ end ++ end ++ ++ -- Process files ++ if not options.nofiles then ++ for _, filepath in ipairs(doc.files) do ++ local file_doc = doc.files[filepath] ++ -- assembly the filename ++ local filename = out_file(file_doc.name) ++ logger:info(string.format("generating file `%s'", filename)) ++ ++ local f = posix.open(filename, "w") ++ assert(f, string.format("could not open `%s' for writing", filename)) ++ io.output(f) ++ include("file.lp", { doc = doc, file_doc = file_doc} ) ++ f:close() ++ end ++ end ++ ++ -- copy extra files ++ local f = posix.open(options.output_dir.."luadoc.css", "w") ++ io.output(f) ++ include("luadoc.css") ++ f:close() ++end +diff --git a/feeds/luci/build/luadoc/luadoc/doclet/html/constant.lp b/feeds/luci/build/luadoc/luadoc/doclet/html/constant.lp +new file mode 100644 +index 0000000..2e35392 +--- /dev/null ++++ b/feeds/luci/build/luadoc/luadoc/doclet/html/constant.lp +@@ -0,0 +1,28 @@ ++<% ++if module_doc then ++ from = "modules/"..module_doc.name ++elseif file_doc then ++ from = "files/.."..file_doc.name ++else ++ from = "" ++end ++%> ++ ++
    <%=const.private and "local " or ""%><%=const.name:gsub(".+%.","")%>
    ++
    ++<%=const.description or ""%> ++ ++<%if type(const.see) == "string" then %> ++

    See also:

    ++ <%=const.see%> ++<%elseif type(const.see) == "table" and #const.see > 0 then %> ++

    See also:

    ++ ++
    +diff --git a/feeds/luci/build/luadoc/luadoc/doclet/html/file.lp b/feeds/luci/build/luadoc/luadoc/doclet/html/file.lp +new file mode 100644 +index 0000000..68f4864 +--- /dev/null ++++ b/feeds/luci/build/luadoc/luadoc/doclet/html/file.lp +@@ -0,0 +1,112 @@ ++ ++ ++ ++ Reference ++ ++ ++ ++ ++ ++
    ++ ++
    ++ ++
    ++
    ++
    ++ ++
    ++ ++ ++ ++
    ++ ++

    File <%=file_doc.name%>

    ++ ++<%if file_doc.description then%> ++

    <%=file_doc.description%>

    ++<%end%> ++<%if file_doc.author then%> ++

    <%= #file_doc.author>1 and "Authors" or "Author" %>: ++ ++<%for _, author in ipairs(file_doc.author) do%> ++ ++<%end%> ++
    <%= author %>
    ++

    ++<%end%> ++<%if file_doc.copyright then%> ++

    Copyright ©<%=file_doc.copyright%>

    ++<%end%> ++<%if file_doc.release then%> ++

    Release: <%=file_doc.release%>

    ++<%end%> ++ ++<%if #file_doc.functions > 0 then%> ++

    Functions

    ++ ++<%for _, func_name in ipairs(file_doc.functions) do ++ local func_data = file_doc.functions[func_name]%> ++ ++ ++ ++ ++<%end%> ++
    <%=func_data.private and "local " or ""%><%=func_name%> (<%=table.concat(func_data.param or {}, ", ")%>)<%=func_data.summary%>
    ++<%end%> ++ ++ ++<%if #file_doc.tables > 0 then%> ++

    Tables

    ++ ++<%for _, tab_name in ipairs(file_doc.tables) do%> ++ ++ ++ ++ ++<%end%> ++
    <%=tab_name%><%=file_doc.tables[tab_name].summary%>
    ++<%end%> ++ ++ ++
    ++
    ++ ++ ++ ++<%if #file_doc.functions > 0 then%> ++

    Functions

    ++
    ++<%for _, func_name in ipairs(file_doc.functions) do%> ++<%=luadoc.doclet.html.include("function.lp", { doc=doc, file_doc=file_doc, func=file_doc.functions[func_name] })%> ++<%end%> ++
    ++<%end%> ++ ++ ++<%if #file_doc.tables > 0 then%> ++

    Tables

    ++
    ++<%for _, tab_name in ipairs(file_doc.tables) do%> ++<%=luadoc.doclet.html.include("table.lp", { doc=doc, file_doc=file_doc, tab=file_doc.tables[tab_name] })%> ++<%end%> ++
    ++<%end%> ++ ++ ++ ++
    ++ ++
    ++ ++
    ++

    Valid XHTML 1.0!

    ++
    ++ ++
    ++ ++ +diff --git a/feeds/luci/build/luadoc/luadoc/doclet/html/function.lp b/feeds/luci/build/luadoc/luadoc/doclet/html/function.lp +new file mode 100644 +index 0000000..29d403e +--- /dev/null ++++ b/feeds/luci/build/luadoc/luadoc/doclet/html/function.lp +@@ -0,0 +1,64 @@ ++<% ++if module_doc then ++ from = "modules/"..module_doc.name ++elseif file_doc then ++ from = "files/.."..file_doc.name ++else ++ from = "" ++end ++%> ++ ++
    <%=func.private and "local " or ""%><%=func.printname%> (<%=table.concat(func.param or {}, ", ")%>)
    ++
    ++<%=func.description or ""%> ++ ++<%if type(func.param) == "table" and #func.param > 0 then%> ++

    Parameters

    ++
      ++ <%for p = 1, #func.param do%> ++
    • ++ <%=func.param[p]%>: <%=func.param[func.param[p]] or ""%> ++
    • ++ <%end%> ++
    ++<%end%> ++ ++ ++<%if type(func.usage) == "string" then%> ++

    Usage:

    ++<%=func.usage%> ++<%elseif type(func.usage) == "table" then%> ++

    Usage

    ++
      ++ <%for _, usage in ipairs(func.usage) do%> ++
    • <%= usage %> ++ <%end%> ++
    ++<%end%> ++ ++<%if type(func.ret) == "string" then%> ++

    Return value:

    ++<%=func.ret%> ++<%elseif type(func.ret) == "table" then%> ++

    Return values:

    ++
      ++ <%for _, ret in ipairs(func.ret) do%> ++
    1. <%= ret %> ++ <%end%> ++
    ++<%end%> ++ ++<%if type(func.see) == "string" then %> ++

    See also:

    ++ <%=func.see%> ++<%elseif type(func.see) == "table" and #func.see > 0 then %> ++

    See also:

    ++ ++<%end%> ++
    +diff --git a/feeds/luci/build/luadoc/luadoc/doclet/html/index.lp b/feeds/luci/build/luadoc/luadoc/doclet/html/index.lp +new file mode 100644 +index 0000000..b4b9f5c +--- /dev/null ++++ b/feeds/luci/build/luadoc/luadoc/doclet/html/index.lp +@@ -0,0 +1,67 @@ ++ ++ ++ ++ Reference ++ " type="text/css" /> ++ ++ ++ ++ ++
    ++ ++
    ++ ++
    ++
    ++
    ++ ++
    ++ ++ ++ ++
    ++ ++ ++<%if not options.nomodules and #doc.modules > 0 then%> ++

    Modules

    ++ ++ ++<%for _, modulename in ipairs(doc.modules) do%> ++ ++ ++ ++ ++<%end%> ++
    <%=modulename%><%=doc.modules[modulename].summary%>
    ++<%end%> ++ ++ ++ ++<%if not options.nofiles and #doc.files > 0 then%> ++

    Files

    ++ ++ ++<%for _, filepath in ipairs(doc.files) do%> ++ ++ ++ ++ ++<%end%> ++
    <%=filepath%>
    ++<%end%> ++ ++
    ++ ++
    ++ ++
    ++

    Valid XHTML 1.0!

    ++
    ++ ++
    ++ ++ +diff --git a/feeds/luci/build/luadoc/luadoc/doclet/html/luadoc.css b/feeds/luci/build/luadoc/luadoc/doclet/html/luadoc.css +new file mode 100644 +index 0000000..f9f9749 +--- /dev/null ++++ b/feeds/luci/build/luadoc/luadoc/doclet/html/luadoc.css +@@ -0,0 +1,285 @@ ++body { ++ margin-left: 1em; ++ margin-right: 1em; ++ font-family: arial, helvetica, geneva, sans-serif; ++ background-color:#ffffff; margin:0px; ++} ++ ++code { ++ font-family: "Andale Mono", monospace; ++} ++ ++tt { ++ font-family: "Andale Mono", monospace; ++} ++ ++body, td, th { font-size: 11pt; } ++ ++h1, h2, h3, h4 { margin-left: 0em; } ++ ++textarea, pre, tt { font-size:10pt; } ++body, td, th { color:#000000; } ++small { font-size:0.85em; } ++h1 { font-size:1.5em; } ++h2 { font-size:1.25em; } ++h3 { font-size:1.15em; } ++h4 { font-size:1.06em; } ++ ++a:link { font-weight:bold; color: #004080; text-decoration: none; } ++a:visited { font-weight:bold; color: #006699; text-decoration: none; } ++a:link:hover { text-decoration:underline; } ++hr { color:#cccccc } ++img { border-width: 0px; } ++ ++ ++h3 { padding: 1em 0 0.5em; } ++ ++p { margin-left: 1em; } ++ ++p.name { ++ font-family: "Andale Mono", monospace; ++ padding-top: 1em; ++ margin-left: 0em; ++} ++ ++blockquote { margin-left: 3em; } ++ ++pre.example { ++ background-color: rgb(245, 245, 245); ++ border-top-width: 1px; ++ border-right-width: 1px; ++ border-bottom-width: 1px; ++ border-left-width: 1px; ++ border-top-style: solid; ++ border-right-style: solid; ++ border-bottom-style: solid; ++ border-left-style: solid; ++ border-top-color: silver; ++ border-right-color: silver; ++ border-bottom-color: silver; ++ border-left-color: silver; ++ padding: 1em; ++ margin-left: 1em; ++ margin-right: 1em; ++ font-family: "Andale Mono", monospace; ++ font-size: smaller; ++} ++ ++ ++hr { ++ margin-left: 0em; ++ background: #00007f; ++ border: 0px; ++ height: 1px; ++} ++ ++ul { list-style-type: disc; } ++ ++table.index { border: 1px #00007f; } ++table.index td { text-align: left; vertical-align: top; } ++table.index ul { padding-top: 0em; margin-top: 0em; } ++ ++table { ++ border: 1px solid black; ++ border-collapse: collapse; ++ margin: 1em auto; ++} ++th { ++ border: 1px solid black; ++ padding: 0.5em; ++} ++td { ++ border: 1px solid black; ++ padding: 0.5em; ++} ++div.header, div.footer { margin-left: 0em; } ++ ++#container ++{ ++ margin-left: 1em; ++ margin-right: 1em; ++ background-color: #f0f0f0; ++} ++ ++#product ++{ ++ text-align: center; ++ border-bottom: 1px solid #cccccc; ++ background-color: #ffffff; ++} ++ ++#product big { ++ font-size: 2em; ++} ++ ++#product_logo ++{ ++} ++ ++#product_name ++{ ++} ++ ++#product_description ++{ ++} ++ ++#main ++{ ++ background-color: #f0f0f0; ++ border-left: 2px solid #cccccc; ++} ++ ++#navigation ++{ ++ float: left; ++ width: 18em; ++ margin: 0; ++ vertical-align: top; ++ background-color: #f0f0f0; ++ overflow:visible; ++} ++ ++#navigation h1 { ++ background-color:#e7e7e7; ++ font-size:1.1em; ++ color:#000000; ++ text-align:left; ++ margin:0px; ++ padding:0.2em; ++ border-top:1px solid #dddddd; ++ border-bottom:1px solid #dddddd; ++} ++ ++#navigation ul ++{ ++ font-size:1em; ++ list-style-type: none; ++ padding: 0; ++ margin: 1px; ++} ++ ++#navigation li ++{ ++ text-indent: -1em; ++ margin: 0em 0em 0em 0.5em; ++ display: block; ++ padding: 3px 0px 0px 12px; ++} ++ ++#navigation li li a ++{ ++ padding: 0px 3px 0px -1em; ++} ++ ++#content ++{ ++ margin-left: 18em; ++ padding: 1em; ++ border-left: 2px solid #cccccc; ++ border-right: 2px solid #cccccc; ++ background-color: #ffffff; ++} ++ ++#about ++{ ++ clear: both; ++ margin: 0; ++ padding: 5px; ++ border-top: 2px solid #cccccc; ++ background-color: #ffffff; ++} ++ ++@media print { ++ body { ++ font: 12pt "Times New Roman", "TimeNR", Times, serif; ++ } ++ a { font-weight:bold; color: #004080; text-decoration: underline; } ++ ++ #main { background-color: #ffffff; border-left: 0px; } ++ #container { margin-left: 2%; margin-right: 2%; background-color: #ffffff; } ++ ++ #content { margin-left: 0px; padding: 1em; border-left: 0px; border-right: 0px; background-color: #ffffff; } ++ ++ #navigation { display: none; ++ } ++ pre.example { ++ font-family: "Andale Mono", monospace; ++ font-size: 10pt; ++ page-break-inside: avoid; ++ } ++} ++ ++table.module_list td ++{ ++ border-width: 1px; ++ padding: 3px; ++ border-style: solid; ++ border-color: #cccccc; ++} ++table.module_list td.name { background-color: #f0f0f0; } ++table.module_list td.summary { width: 100%; } ++ ++table.file_list ++{ ++ border-width: 1px; ++ border-style: solid; ++ border-color: #cccccc; ++ border-collapse: collapse; ++} ++table.file_list td ++{ ++ border-width: 1px; ++ padding: 3px; ++ border-style: solid; ++ border-color: #cccccc; ++} ++table.file_list td.name { background-color: #f0f0f0; } ++table.file_list td.summary { width: 100%; } ++ ++ ++table.function_list ++{ ++ border-width: 1px; ++ border-style: solid; ++ border-color: #cccccc; ++ border-collapse: collapse; ++} ++table.function_list td ++{ ++ border-width: 1px; ++ padding: 3px; ++ border-style: solid; ++ border-color: #cccccc; ++} ++table.function_list td.name { background-color: #f0f0f0; } ++table.function_list td.summary { width: 100%; } ++ ++ ++table.table_list ++{ ++ border-width: 1px; ++ border-style: solid; ++ border-color: #cccccc; ++ border-collapse: collapse; ++} ++table.table_list td ++{ ++ border-width: 1px; ++ padding: 3px; ++ border-style: solid; ++ border-color: #cccccc; ++} ++table.table_list td.name { background-color: #f0f0f0; } ++table.table_list td.summary { width: 100%; } ++ ++dl.function dt {border-top: 1px solid #ccc; padding-top: 1em;} ++dl.function dd {padding: 0.5em 0;} ++dl.function h3 {margin: 0; font-size: medium;} ++ ++dl.table dt {border-top: 1px solid #ccc; padding-top: 1em;} ++dl.table dd {padding-bottom: 1em;} ++dl.table h3 {padding: 0; margin: 0; font-size: medium;} ++ ++#TODO: make module_list, file_list, function_list, table_list inherit from a list ++ +diff --git a/feeds/luci/build/luadoc/luadoc/doclet/html/menu.lp b/feeds/luci/build/luadoc/luadoc/doclet/html/menu.lp +new file mode 100644 +index 0000000..0fe3652 +--- /dev/null ++++ b/feeds/luci/build/luadoc/luadoc/doclet/html/menu.lp +@@ -0,0 +1,55 @@ ++<% ++if module_doc then ++ from = "modules/"..module_doc.name ++elseif file_doc then ++ from = "files/.."..file_doc.name ++else ++ from = "" ++end ++%> ++ ++

    LuaDoc

    ++
      ++ <%if not module_doc and not file_doc then%> ++
    • Index
    • ++ <%else%> ++
    • ">Index
    • ++ <%end%> ++
    ++ ++ ++ ++<%if not options.nomodules and #doc.modules > 0 then%> ++

    Modules

    ++
      ++<%for _, modulename in ipairs(doc.modules) do ++ if module_doc and module_doc.name == modulename then%> ++
    • <%=modulename%>
    • ++ <%else%> ++
    • ++ <%=modulename%> ++
    • ++<% end ++end%> ++
    ++<%end%> ++ ++ ++ ++<%if not options.nofiles and #doc.files > 0 then%> ++

    Files

    ++
      ++<%for _, filepath in ipairs(doc.files) do ++ if file_doc and file_doc.name == filepath then%> ++
    • <%=filepath%>
    • ++ <%else%> ++
    • ++ <%=filepath%> ++
    • ++<% end ++end%> ++
    ++<%end%> ++ ++ ++ +diff --git a/feeds/luci/build/luadoc/luadoc/doclet/html/module.lp b/feeds/luci/build/luadoc/luadoc/doclet/html/module.lp +new file mode 100644 +index 0000000..0798c1b +--- /dev/null ++++ b/feeds/luci/build/luadoc/luadoc/doclet/html/module.lp +@@ -0,0 +1,155 @@ ++ ++ ++ ++ Reference ++ ++ ++ ++ ++ ++
    ++ ++
    ++ ++
    ++
    ++
    ++ ++
    ++ ++ ++ ++
    ++ ++

    <%=( oop and "Object Instance" or "Class" )%> <%=module_doc.name%>

    ++ ++

    <%=module_doc.description%>

    ++<%if module_doc.author then%> ++

    <%= #module_doc.author>1 and "Authors" or "Author" %>: ++ ++<%for _, author in ipairs(module_doc.author) do%> ++ ++<%end%> ++
    <%= author %>
    ++

    ++<%end%> ++<%if module_doc.copyright then%> ++

    Copyright© <%=module_doc.copyright%>

    ++<%end%> ++<%if module_doc.release then%> ++

    Release: <%=module_doc.release%>

    ++<%end%> ++ ++<%if #module_doc.constants > 0 then %> ++

    Constants

    ++ ++<%for _, const_name in ipairs(module_doc.constants) do ++ local const_data = module_doc.constants[const_name]%> ++ ++ ++ ++ ++<%end%> ++
    <%=const_data.private and "local " or ""%><%=(const_name:gsub(".+%.",""))%><%=const_data.summary%>
    ++<%end%> ++ ++<% local funcs = { }; if #module_doc.functions > 0 then %> ++

    Functions

    ++ ++<% ++for _, func_name in ipairs(module_doc.functions) do ++ funcs[#funcs+1] = func_name ++end ++ ++table.sort(funcs, function(a, b) ++ local func_data_a = module_doc.functions[a] ++ local func_data_b = module_doc.functions[b] ++ local x = func_data_a.sort or a ++ local y = func_data_b.sort or b ++ return x < y ++end) ++ ++for _, func_name in ipairs(funcs) do ++ local func_data = module_doc.functions[func_name] ++ ++ func_data.printname = func_name:gsub("^%d+#", "") ++ if oop then ++ func_data.printname = func_data.printname:gsub("%.", ":") ++ else ++ func_data.printname = func_data.printname:gsub("^.+%.", "") ++ end ++%> ++ ++ ++ ++ ++<%end%> ++
    <%=func_data.private and "local " or ""%><%=func_data.printname%> (<%=table.concat(module_doc.functions[func_name].param or {}, ", ")%>)<%=module_doc.functions[func_name].summary%>
    ++<%end%> ++ ++ ++<% local tabs = { }; if #module_doc.tables > 0 then%> ++

    Tables

    ++ ++<% ++for _, tab_name in ipairs(module_doc.tables) do ++ tabs[#tabs+1] = tab_name ++end ++ ++table.sort(tabs, function(a, b) ++ local tab_data_a = module_doc.tables[a] ++ local tab_data_b = module_doc.tables[b] ++ local x = tab_data_a.sort or a ++ local y = tab_data_b.sort or b ++ return x < y ++end) ++ ++for _, tab_name in ipairs(tabs) do ++%> ++ ++ ++ ++ ++<%end%> ++
    <%=tab_name%><%=module_doc.tables[tab_name].summary%>
    ++<%end%> ++ ++ ++
    ++
    ++ ++<%if #module_doc.functions > 0 then%> ++

    Functions

    ++
    ++<%for _, func_name in ipairs(funcs) do%> ++<%=luadoc.doclet.html.include("function.lp", { doc=doc, module_doc=module_doc, func=module_doc.functions[func_name], oop=oop })%> ++<%end%> ++
    ++<%end%> ++ ++<%if #module_doc.tables > 0 then%> ++

    Tables

    ++
    ++<%for _, tab_name in ipairs(tabs) do%> ++<%=luadoc.doclet.html.include("table.lp", { doc=doc, module_doc=module_doc, tab=module_doc.tables[tab_name] })%> ++<%end%> ++
    ++<%end%> ++ ++ ++
    ++ ++
    ++ ++
    ++

    Valid XHTML 1.0!

    ++
    ++ ++
    ++ ++ +diff --git a/feeds/luci/build/luadoc/luadoc/doclet/html/table.lp b/feeds/luci/build/luadoc/luadoc/doclet/html/table.lp +new file mode 100644 +index 0000000..5cd0239 +--- /dev/null ++++ b/feeds/luci/build/luadoc/luadoc/doclet/html/table.lp +@@ -0,0 +1,15 @@ ++
    <%=tab.name%>
    ++
    <%=tab.description%> ++ ++<%if type(tab.field) == "table" and #tab.field > 0 then%> ++Fields ++
      ++ <%for p = 1, #tab.field do%> ++
    • ++ <%=tab.field[p]%>: <%=tab.field[tab.field[p]] or ""%> ++
    • ++ <%end%> ++
    ++<%end%> ++ ++
    +diff --git a/feeds/luci/build/luadoc/luadoc/doclet/raw.lua b/feeds/luci/build/luadoc/luadoc/doclet/raw.lua +new file mode 100644 +index 0000000..1e880b8 +--- /dev/null ++++ b/feeds/luci/build/luadoc/luadoc/doclet/raw.lua +@@ -0,0 +1,12 @@ ++----------------------------------------------------------------- ++-- @release $Id: raw.lua,v 1.5 2007/04/18 14:28:39 tomas Exp $ ++----------------------------------------------------------------- ++ ++module "luadoc.doclet.raw" ++ ++----------------------------------------------------------------- ++-- Generate the output. ++-- @param doc Table with the structured documentation. ++ ++function start (doc) ++end +diff --git a/feeds/luci/build/luadoc/luadoc/init.lua b/feeds/luci/build/luadoc/luadoc/init.lua +new file mode 100644 +index 0000000..649515d +--- /dev/null ++++ b/feeds/luci/build/luadoc/luadoc/init.lua +@@ -0,0 +1,50 @@ ++------------------------------------------------------------------------------- ++-- LuaDoc main function. ++-- @release $Id: init.lua,v 1.4 2008/02/17 06:42:51 jasonsantos Exp $ ++------------------------------------------------------------------------------- ++ ++local require = require ++ ++local util = require "luadoc.util" ++ ++logger = {} ++ ++module ("luadoc") ++ ++------------------------------------------------------------------------------- ++-- LuaDoc version number. ++ ++_COPYRIGHT = "Copyright (c) 2003-2007 The Kepler Project" ++_DESCRIPTION = "Documentation Generator Tool for the Lua language" ++_VERSION = "LuaDoc 3.0.1" ++ ++------------------------------------------------------------------------------- ++-- Main function ++-- @see luadoc.doclet.html, luadoc.doclet.formatter, luadoc.doclet.raw ++-- @see luadoc.taglet.standard ++ ++function main (files, options) ++ logger = util.loadlogengine(options) ++ ++ -- load config file ++ if options.config ~= nil then ++ -- load specified config file ++ dofile(options.config) ++ else ++ -- load default config file ++ require("luadoc.config") ++ end ++ ++ local taglet = require(options.taglet) ++ local doclet = require(options.doclet) ++ ++ -- analyze input ++ taglet.options = options ++ taglet.logger = logger ++ local doc = taglet.start(files) ++ ++ -- generate output ++ doclet.options = options ++ doclet.logger = logger ++ doclet.start(doc) ++end +diff --git a/feeds/luci/build/luadoc/luadoc/lp.lua b/feeds/luci/build/luadoc/luadoc/lp.lua +new file mode 100644 +index 0000000..adf84f9 +--- /dev/null ++++ b/feeds/luci/build/luadoc/luadoc/lp.lua +@@ -0,0 +1,130 @@ ++---------------------------------------------------------------------------- ++-- Lua Pages Template Preprocessor. ++-- ++-- @release $Id: lp.lua,v 1.7 2007/04/18 14:28:39 tomas Exp $ ++---------------------------------------------------------------------------- ++ ++local assert, error, getfenv, loadstring, setfenv = assert, error, getfenv, loadstring, setfenv ++local find, format, gsub, strsub = string.find, string.format, string.gsub, string.sub ++local concat, tinsert = table.concat, table.insert ++local open = io.open ++ ++module (...) ++ ++---------------------------------------------------------------------------- ++-- function to do output ++local outfunc = "io.write" ++-- accepts the old expression field: `$| |$' ++local compatmode = true ++ ++-- ++-- Builds a piece of Lua code which outputs the (part of the) given string. ++-- @param s String. ++-- @param i Number with the initial position in the string. ++-- @param f Number with the final position in the string (default == -1). ++-- @return String with the correspondent Lua code which outputs the part of the string. ++-- ++local function out (s, i, f) ++ s = strsub(s, i, f or -1) ++ if s == "" then return s end ++ -- we could use `%q' here, but this way we have better control ++ s = gsub(s, "([\\\n\'])", "\\%1") ++ -- substitute '\r' by '\'+'r' and let `loadstring' reconstruct it ++ s = gsub(s, "\r", "\\r") ++ return format(" %s('%s'); ", outfunc, s) ++end ++ ++ ++---------------------------------------------------------------------------- ++-- Translate the template to Lua code. ++-- @param s String to translate. ++-- @return String with translated code. ++---------------------------------------------------------------------------- ++function translate (s) ++ if compatmode then ++ s = gsub(s, "$|(.-)|%$", "") ++ s = gsub(s, "", "") ++ end ++ s = gsub(s, "<%%(.-)%%>", "") ++ local res = {} ++ local start = 1 -- start of untranslated part in `s' ++ while true do ++ local ip, fp, target, exp, code = find(s, "<%?(%w*)[ \t]*(=?)(.-)%?>", start) ++ if not ip then break end ++ tinsert(res, out(s, start, ip-1)) ++ if target ~= "" and target ~= "lua" then ++ -- not for Lua; pass whole instruction to the output ++ tinsert(res, out(s, ip, fp)) ++ else ++ if exp == "=" then -- expression? ++ tinsert(res, format(" %s(%s);", outfunc, code)) ++ else -- command ++ tinsert(res, format(" %s ", code)) ++ end ++ end ++ start = fp + 1 ++ end ++ tinsert(res, out(s, start)) ++ return concat(res) ++end ++ ++ ++---------------------------------------------------------------------------- ++-- Defines the name of the output function. ++-- @param f String with the name of the function which produces output. ++ ++function setoutfunc (f) ++ outfunc = f ++end ++ ++---------------------------------------------------------------------------- ++-- Turns on or off the compatibility with old CGILua 3.X behavior. ++-- @param c Boolean indicating if the compatibility mode should be used. ++ ++function setcompatmode (c) ++ compatmode = c ++end ++ ++---------------------------------------------------------------------------- ++-- Internal compilation cache. ++ ++local cache = {} ++ ++---------------------------------------------------------------------------- ++-- Translates a template into a Lua function. ++-- Does NOT execute the resulting function. ++-- Uses a cache of templates. ++-- @param string String with the template to be translated. ++-- @param chunkname String with the name of the chunk, for debugging purposes. ++-- @return Function with the resulting translation. ++ ++function compile (string, chunkname) ++ local f, err = cache[string] ++ if f then return f end ++ f, err = loadstring (translate (string), chunkname) ++ if not f then error (err, 3) end ++ cache[string] = f ++ return f ++end ++ ++---------------------------------------------------------------------------- ++-- Translates and executes a template in a given file. ++-- The translation creates a Lua function which will be executed in an ++-- optionally given environment. ++-- @param filename String with the name of the file containing the template. ++-- @param env Table with the environment to run the resulting function. ++ ++function include (filename, env) ++ -- read the whole contents of the file ++ local fh = assert (open (filename)) ++ local src = fh:read("*a") ++ fh:close() ++ -- translates the file into a function ++ local prog = compile (src, '@'..filename) ++ local _env ++ if env then ++ _env = getfenv (prog) ++ setfenv (prog, env) ++ end ++ prog () ++end +diff --git a/feeds/luci/build/luadoc/luadoc/taglet/standard.lua b/feeds/luci/build/luadoc/luadoc/taglet/standard.lua +new file mode 100644 +index 0000000..ef925f8 +--- /dev/null ++++ b/feeds/luci/build/luadoc/luadoc/taglet/standard.lua +@@ -0,0 +1,567 @@ ++------------------------------------------------------------------------------- ++-- @release $Id: standard.lua,v 1.39 2007/12/21 17:50:48 tomas Exp $ ++------------------------------------------------------------------------------- ++ ++local assert, pairs, tostring, type = assert, pairs, tostring, type ++local io = require "io" ++local posix = require "nixio.fs" ++local luadoc = require "luadoc" ++local util = require "luadoc.util" ++local tags = require "luadoc.taglet.standard.tags" ++local string = require "string" ++local table = require "table" ++ ++module 'luadoc.taglet.standard' ++ ++------------------------------------------------------------------------------- ++-- Creates an iterator for an array base on a class type. ++-- @param t array to iterate over ++-- @param class name of the class to iterate over ++ ++function class_iterator (t, class) ++ return function () ++ local i = 1 ++ return function () ++ while t[i] and t[i].class ~= class do ++ i = i + 1 ++ end ++ local v = t[i] ++ i = i + 1 ++ return v ++ end ++ end ++end ++ ++-- Patterns for function recognition ++local identifiers_list_pattern = "%s*(.-)%s*" ++local identifier_pattern = "[^%(%s]+" ++local function_patterns = { ++ "^()%s*function%s*("..identifier_pattern..")%s*%("..identifiers_list_pattern.."%)", ++ "^%s*(local%s)%s*function%s*("..identifier_pattern..")%s*%("..identifiers_list_pattern.."%)", ++ "^()%s*("..identifier_pattern..")%s*%=%s*function%s*%("..identifiers_list_pattern.."%)", ++} ++ ++------------------------------------------------------------------------------- ++-- Checks if the line contains a function definition ++-- @param line string with line text ++-- @return function information or nil if no function definition found ++ ++local function check_function (line) ++ line = util.trim(line) ++ ++ local info = table.foreachi(function_patterns, function (_, pattern) ++ local r, _, l, id, param = string.find(line, pattern) ++ if r ~= nil then ++ return { ++ name = id, ++ private = (l == "local"), ++ param = { } --util.split("%s*,%s*", param), ++ } ++ end ++ end) ++ ++ -- TODO: remove these assert's? ++ if info ~= nil then ++ assert(info.name, "function name undefined") ++ assert(info.param, string.format("undefined parameter list for function `%s'", info.name)) ++ end ++ ++ return info ++end ++ ++------------------------------------------------------------------------------- ++-- Checks if the line contains a module definition. ++-- @param line string with line text ++-- @param currentmodule module already found, if any ++-- @return the name of the defined module, or nil if there is no module ++-- definition ++ ++local function check_module (line, currentmodule) ++ line = util.trim(line) ++ ++ -- module"x.y" ++ -- module'x.y' ++ -- module[[x.y]] ++ -- module("x.y") ++ -- module('x.y') ++ -- module([[x.y]]) ++ -- module(...) ++ ++ local r, _, modulename = string.find(line, "^module%s*[%s\"'(%[]+([^,\"')%]]+)") ++ if r then ++ -- found module definition ++ logger:debug(string.format("found module `%s'", modulename)) ++ return modulename ++ end ++ return currentmodule ++end ++ ++-- Patterns for constant recognition ++local constant_patterns = { ++ "^()%s*([A-Z][A-Z0-9_]*)%s*=", ++ "^%s*(local%s)%s*([A-Z][A-Z0-9_]*)%s*=", ++} ++ ++------------------------------------------------------------------------------- ++-- Checks if the line contains a constant definition ++-- @param line string with line text ++-- @return constant information or nil if no constant definition found ++ ++local function check_constant (line) ++ line = util.trim(line) ++ ++ local info = table.foreachi(constant_patterns, function (_, pattern) ++ local r, _, l, id = string.find(line, pattern) ++ if r ~= nil then ++ return { ++ name = id, ++ private = (l == "local"), ++ } ++ end ++ end) ++ ++ -- TODO: remove these assert's? ++ if info ~= nil then ++ assert(info.name, "constant name undefined") ++ end ++ ++ return info ++end ++ ++------------------------------------------------------------------------------- ++-- Extracts summary information from a description. The first sentence of each ++-- doc comment should be a summary sentence, containing a concise but complete ++-- description of the item. It is important to write crisp and informative ++-- initial sentences that can stand on their own ++-- @param description text with item description ++-- @return summary string or nil if description is nil ++ ++local function parse_summary (description) ++ -- summary is never nil... ++ description = description or "" ++ ++ -- append an " " at the end to make the pattern work in all cases ++ description = description.." " ++ ++ -- read until the first period followed by a space or tab ++ local summary = string.match(description, "(.-%.)[%s\t]") ++ ++ -- if pattern did not find the first sentence, summary is the whole description ++ summary = summary or description ++ ++ return summary ++end ++ ++------------------------------------------------------------------------------- ++-- @param f file handle ++-- @param line current line being parsed ++-- @param modulename module already found, if any ++-- @return current line ++-- @return code block ++-- @return modulename if found ++ ++local function parse_code (f, line, modulename) ++ local code = {} ++ while line ~= nil do ++ if string.find(line, "^[\t ]*%-%-%-") then ++ -- reached another luadoc block, end this parsing ++ return line, code, modulename ++ else ++ -- look for a module definition ++ modulename = check_module(line, modulename) ++ ++ table.insert(code, line) ++ line = f:read() ++ end ++ end ++ -- reached end of file ++ return line, code, modulename ++end ++ ++------------------------------------------------------------------------------- ++-- Parses the information inside a block comment ++-- @param block block with comment field ++-- @return block parameter ++ ++local function parse_comment (block, first_line, modulename) ++ ++ -- get the first non-empty line of code ++ local code = table.foreachi(block.code, function(_, line) ++ if not util.line_empty(line) then ++ -- `local' declarations are ignored in two cases: ++ -- when the `nolocals' option is turned on; and ++ -- when the first block of a file is parsed (this is ++ -- necessary to avoid confusion between the top ++ -- local declarations and the `module' definition. ++ if (options.nolocals or first_line) and line:find"^%s*local" then ++ return ++ end ++ return line ++ end ++ end) ++ ++ -- parse first line of code ++ if code ~= nil then ++ local func_info = check_function(code) ++ local module_name = check_module(code) ++ local const_info = check_constant(code) ++ if func_info then ++ block.class = "function" ++ block.name = func_info.name ++ block.param = func_info.param ++ block.private = func_info.private ++ elseif const_info then ++ block.class = "constant" ++ block.name = const_info.name ++ block.private = const_info.private ++ elseif module_name then ++ block.class = "module" ++ block.name = module_name ++ block.param = {} ++ else ++ block.param = {} ++ end ++ else ++ -- TODO: comment without any code. Does this means we are dealing ++ -- with a file comment? ++ end ++ ++ -- parse @ tags ++ local currenttag = "description" ++ local currenttext ++ ++ table.foreachi(block.comment, function (_, line) ++ line = util.trim_comment(line) ++ ++ local r, _, tag, text = string.find(line, "@([_%w%.]+)%s+(.*)") ++ if r ~= nil then ++ -- found new tag, add previous one, and start a new one ++ -- TODO: what to do with invalid tags? issue an error? or log a warning? ++ tags.handle(currenttag, block, currenttext) ++ ++ currenttag = tag ++ currenttext = text ++ else ++ currenttext = util.concat(currenttext, "\n" .. line) ++ assert(string.sub(currenttext, 1, 1) ~= " ", string.format("`%s', `%s'", currenttext, line)) ++ end ++ end) ++ tags.handle(currenttag, block, currenttext) ++ ++ -- extracts summary information from the description ++ block.summary = parse_summary(block.description) ++ assert(string.sub(block.description, 1, 1) ~= " ", string.format("`%s'", block.description)) ++ ++ if block.name and block.class == "module" then ++ modulename = block.name ++ end ++ ++ return block, modulename ++end ++ ++------------------------------------------------------------------------------- ++-- Parses a block of comment, started with ---. Read until the next block of ++-- comment. ++-- @param f file handle ++-- @param line being parsed ++-- @param modulename module already found, if any ++-- @return line ++-- @return block parsed ++-- @return modulename if found ++ ++local function parse_block (f, line, modulename, first) ++ local multiline = not not (line and line:match("%[%[")) ++ local block = { ++ comment = {}, ++ code = {}, ++ } ++ ++ while line ~= nil do ++ if (multiline == true and string.find(line, "%]%]") ~= nil) or ++ (multiline == false and string.find(line, "^[\t ]*%-%-") == nil) then ++ -- reached end of comment, read the code below it ++ -- TODO: allow empty lines ++ line, block.code, modulename = parse_code(f, line, modulename) ++ ++ -- parse information in block comment ++ block, modulename = parse_comment(block, first, modulename) ++ ++ return line, block, modulename ++ else ++ table.insert(block.comment, line) ++ line = f:read() ++ end ++ end ++ -- reached end of file ++ ++ -- parse information in block comment ++ block, modulename = parse_comment(block, first, modulename) ++ ++ return line, block, modulename ++end ++ ++------------------------------------------------------------------------------- ++-- Parses a file documented following luadoc format. ++-- @param filepath full path of file to parse ++-- @param doc table with documentation ++-- @return table with documentation ++ ++function parse_file (filepath, doc, handle, prev_line, prev_block, prev_modname) ++ local blocks = { prev_block } ++ local modulename = prev_modname ++ ++ -- read each line ++ local f = handle or io.open(filepath, "r") ++ local i = 1 ++ local line = prev_line or f:read() ++ local first = true ++ while line ~= nil do ++ ++ if string.find(line, "^[\t ]*%-%-%-") then ++ -- reached a luadoc block ++ local block, newmodname ++ line, block, newmodname = parse_block(f, line, modulename, first) ++ ++ if modulename and newmodname and newmodname ~= modulename then ++ doc = parse_file( nil, doc, f, line, block, newmodname ) ++ else ++ table.insert(blocks, block) ++ modulename = newmodname ++ end ++ else ++ -- look for a module definition ++ local newmodname = check_module(line, modulename) ++ ++ if modulename and newmodname and newmodname ~= modulename then ++ parse_file( nil, doc, f ) ++ else ++ modulename = newmodname ++ end ++ ++ -- TODO: keep beginning of file somewhere ++ ++ line = f:read() ++ end ++ first = false ++ i = i + 1 ++ end ++ ++ if not handle then ++ f:close() ++ end ++ ++ if filepath then ++ -- store blocks in file hierarchy ++ assert(doc.files[filepath] == nil, string.format("doc for file `%s' already defined", filepath)) ++ table.insert(doc.files, filepath) ++ doc.files[filepath] = { ++ type = "file", ++ name = filepath, ++ doc = blocks, ++ -- functions = class_iterator(blocks, "function"), ++ -- tables = class_iterator(blocks, "table"), ++ } ++ -- ++ local first = doc.files[filepath].doc[1] ++ if first and modulename then ++ doc.files[filepath].author = first.author ++ doc.files[filepath].copyright = first.copyright ++ doc.files[filepath].description = first.description ++ doc.files[filepath].release = first.release ++ doc.files[filepath].summary = first.summary ++ end ++ end ++ ++ -- if module definition is found, store in module hierarchy ++ if modulename ~= nil then ++ if modulename == "..." then ++ assert( filepath, "Can't determine name for virtual module from filepatch" ) ++ modulename = string.gsub (filepath, "%.lua$", "") ++ modulename = string.gsub (modulename, "/", ".") ++ end ++ if doc.modules[modulename] ~= nil then ++ -- module is already defined, just add the blocks ++ table.foreachi(blocks, function (_, v) ++ table.insert(doc.modules[modulename].doc, v) ++ end) ++ else ++ -- TODO: put this in a different module ++ table.insert(doc.modules, modulename) ++ doc.modules[modulename] = { ++ type = "module", ++ name = modulename, ++ doc = blocks, ++-- functions = class_iterator(blocks, "function"), ++-- tables = class_iterator(blocks, "table"), ++ author = first and first.author, ++ copyright = first and first.copyright, ++ description = "", ++ release = first and first.release, ++ summary = "", ++ } ++ ++ -- find module description ++ for m in class_iterator(blocks, "module")() do ++ doc.modules[modulename].description = util.concat( ++ doc.modules[modulename].description, ++ m.description) ++ doc.modules[modulename].summary = util.concat( ++ doc.modules[modulename].summary, ++ m.summary) ++ if m.author then ++ doc.modules[modulename].author = m.author ++ end ++ if m.copyright then ++ doc.modules[modulename].copyright = m.copyright ++ end ++ if m.release then ++ doc.modules[modulename].release = m.release ++ end ++ if m.name then ++ doc.modules[modulename].name = m.name ++ end ++ end ++ doc.modules[modulename].description = doc.modules[modulename].description or (first and first.description) or "" ++ doc.modules[modulename].summary = doc.modules[modulename].summary or (first and first.summary) or "" ++ end ++ ++ -- make functions table ++ doc.modules[modulename].functions = {} ++ for f in class_iterator(blocks, "function")() do ++ if f and f.name then ++ table.insert(doc.modules[modulename].functions, f.name) ++ doc.modules[modulename].functions[f.name] = f ++ end ++ end ++ ++ -- make tables table ++ doc.modules[modulename].tables = {} ++ for t in class_iterator(blocks, "table")() do ++ if t and t.name then ++ table.insert(doc.modules[modulename].tables, t.name) ++ doc.modules[modulename].tables[t.name] = t ++ end ++ end ++ ++ -- make constants table ++ doc.modules[modulename].constants = {} ++ for c in class_iterator(blocks, "constant")() do ++ if c and c.name then ++ table.insert(doc.modules[modulename].constants, c.name) ++ doc.modules[modulename].constants[c.name] = c ++ end ++ end ++ end ++ ++ if filepath then ++ -- make functions table ++ doc.files[filepath].functions = {} ++ for f in class_iterator(blocks, "function")() do ++ if f and f.name then ++ table.insert(doc.files[filepath].functions, f.name) ++ doc.files[filepath].functions[f.name] = f ++ end ++ end ++ ++ -- make tables table ++ doc.files[filepath].tables = {} ++ for t in class_iterator(blocks, "table")() do ++ if t and t.name then ++ table.insert(doc.files[filepath].tables, t.name) ++ doc.files[filepath].tables[t.name] = t ++ end ++ end ++ end ++ ++ return doc ++end ++ ++------------------------------------------------------------------------------- ++-- Checks if the file is terminated by ".lua" or ".luadoc" and calls the ++-- function that does the actual parsing ++-- @param filepath full path of the file to parse ++-- @param doc table with documentation ++-- @return table with documentation ++-- @see parse_file ++ ++function file (filepath, doc) ++ local patterns = { "%.lua$", "%.luadoc$" } ++ local valid = table.foreachi(patterns, function (_, pattern) ++ if string.find(filepath, pattern) ~= nil then ++ return true ++ end ++ end) ++ ++ if valid then ++ logger:info(string.format("processing file `%s'", filepath)) ++ doc = parse_file(filepath, doc) ++ end ++ ++ return doc ++end ++ ++------------------------------------------------------------------------------- ++-- Recursively iterates through a directory, parsing each file ++-- @param path directory to search ++-- @param doc table with documentation ++-- @return table with documentation ++ ++function directory (path, doc) ++ for f in posix.dir(path) do ++ local fullpath = path .. "/" .. f ++ local attr = posix.stat(fullpath) ++ assert(attr, string.format("error stating file `%s'", fullpath)) ++ ++ if attr.type == "reg" then ++ doc = file(fullpath, doc) ++ elseif attr.type == "dir" and f ~= "." and f ~= ".." then ++ doc = directory(fullpath, doc) ++ end ++ end ++ return doc ++end ++ ++-- Recursively sorts the documentation table ++local function recsort (tab) ++ table.sort (tab) ++ -- sort list of functions by name alphabetically ++ for f, doc in pairs(tab) do ++ if doc.functions then ++ table.sort(doc.functions) ++ end ++ if doc.tables then ++ table.sort(doc.tables) ++ end ++ end ++end ++ ++------------------------------------------------------------------------------- ++ ++function start (files, doc) ++ assert(files, "file list not specified") ++ ++ -- Create an empty document, or use the given one ++ doc = doc or { ++ files = {}, ++ modules = {}, ++ } ++ assert(doc.files, "undefined `files' field") ++ assert(doc.modules, "undefined `modules' field") ++ ++ table.foreachi(files, function (_, path) ++ local attr = posix.stat(path) ++ assert(attr, string.format("error stating path `%s'", path)) ++ ++ if attr.type == "reg" then ++ doc = file(path, doc) ++ elseif attr.type == "dir" then ++ doc = directory(path, doc) ++ end ++ end) ++ ++ -- order arrays alphabetically ++ recsort(doc.files) ++ recsort(doc.modules) ++ ++ return doc ++end +diff --git a/feeds/luci/build/luadoc/luadoc/taglet/standard/tags.lua b/feeds/luci/build/luadoc/luadoc/taglet/standard/tags.lua +new file mode 100644 +index 0000000..e9d0354 +--- /dev/null ++++ b/feeds/luci/build/luadoc/luadoc/taglet/standard/tags.lua +@@ -0,0 +1,191 @@ ++------------------------------------------------------------------------------- ++-- Handlers for several tags ++-- @release $Id: tags.lua,v 1.8 2007/09/05 12:39:09 tomas Exp $ ++------------------------------------------------------------------------------- ++ ++local luadoc = require "luadoc" ++local util = require "luadoc.util" ++local string = require "string" ++local table = require "table" ++local assert, type, tostring, tonumber = assert, type, tostring, tonumber ++ ++module "luadoc.taglet.standard.tags" ++ ++------------------------------------------------------------------------------- ++ ++local function author (tag, block, text) ++ block[tag] = block[tag] or {} ++ if not text then ++ luadoc.logger:warn("author `name' not defined [["..text.."]]: skipping") ++ return ++ end ++ table.insert (block[tag], text) ++end ++ ++------------------------------------------------------------------------------- ++-- Set the class of a comment block. Classes can be "module", "function", ++-- "table". The first two classes are automatic, extracted from the source code ++ ++local function class (tag, block, text) ++ block[tag] = text ++end ++ ++------------------------------------------------------------------------------- ++ ++local function cstyle (tag, block, text) ++ block[tag] = text ++end ++ ++------------------------------------------------------------------------------- ++ ++local function sort (tag, block, text) ++ block[tag] = tonumber(text) or 0 ++end ++ ++------------------------------------------------------------------------------- ++ ++local function copyright (tag, block, text) ++ block[tag] = text ++end ++ ++------------------------------------------------------------------------------- ++ ++local function description (tag, block, text) ++ block[tag] = text ++end ++ ++------------------------------------------------------------------------------- ++ ++local function field (tag, block, text) ++ if block["class"] ~= "table" then ++ luadoc.logger:warn("documenting `field' for block that is not a `table'") ++ end ++ block[tag] = block[tag] or {} ++ ++ local _, _, name, desc = string.find(text, "^([_%w%.]+)%s+(.*)") ++ assert(name, "field name not defined") ++ ++ table.insert(block[tag], name) ++ block[tag][name] = desc ++end ++ ++------------------------------------------------------------------------------- ++-- Set the name of the comment block. If the block already has a name, issue ++-- an error and do not change the previous value ++ ++local function name (tag, block, text) ++ if block[tag] and block[tag] ~= text then ++ luadoc.logger:error(string.format("block name conflict: `%s' -> `%s'", block[tag], text)) ++ end ++ ++ block[tag] = text ++end ++ ++------------------------------------------------------------------------------- ++-- Processes a parameter documentation. ++-- @param tag String with the name of the tag (it must be "param" always). ++-- @param block Table with previous information about the block. ++-- @param text String with the current line beeing processed. ++ ++local function param (tag, block, text) ++ block[tag] = block[tag] or {} ++ -- TODO: make this pattern more flexible, accepting empty descriptions ++ local _, _, name, desc = string.find(text, "^([_%w%.]+)%s+(.*)") ++ if not name then ++ luadoc.logger:warn("parameter `name' not defined [["..text.."]]: skipping") ++ return ++ end ++ local i = table.foreachi(block[tag], function (i, v) ++ if v == name then ++ return i ++ end ++ end) ++ if i == nil then ++ luadoc.logger:warn(string.format("documenting undefined parameter `%s'", name)) ++ table.insert(block[tag], name) ++ end ++ block[tag][name] = desc ++end ++ ++------------------------------------------------------------------------------- ++ ++local function release (tag, block, text) ++ block[tag] = text ++end ++ ++------------------------------------------------------------------------------- ++ ++local function ret (tag, block, text) ++ tag = "ret" ++ if type(block[tag]) == "string" then ++ block[tag] = { block[tag], text } ++ elseif type(block[tag]) == "table" then ++ table.insert(block[tag], text) ++ else ++ block[tag] = text ++ end ++end ++ ++------------------------------------------------------------------------------- ++-- @see ret ++ ++local function see (tag, block, text) ++ -- see is always an array ++ block[tag] = block[tag] or {} ++ ++ -- remove trailing "." ++ text = string.gsub(text, "(.*)%.$", "%1") ++ ++ local s = util.split("%s*,%s*", text) ++ ++ table.foreachi(s, function (_, v) ++ table.insert(block[tag], v) ++ end) ++end ++ ++------------------------------------------------------------------------------- ++-- @see ret ++ ++local function usage (tag, block, text) ++ if type(block[tag]) == "string" then ++ block[tag] = { block[tag], text } ++ elseif type(block[tag]) == "table" then ++ table.insert(block[tag], text) ++ else ++ block[tag] = text ++ end ++end ++ ++------------------------------------------------------------------------------- ++ ++local handlers = {} ++handlers["author"] = author ++handlers["class"] = class ++handlers["cstyle"] = cstyle ++handlers["copyright"] = copyright ++handlers["description"] = description ++handlers["field"] = field ++handlers["name"] = name ++handlers["param"] = param ++handlers["release"] = release ++handlers["return"] = ret ++handlers["see"] = see ++handlers["sort"] = sort ++handlers["usage"] = usage ++ ++------------------------------------------------------------------------------- ++ ++function handle (tag, block, text) ++ if not handlers[tag] then ++ luadoc.logger:error(string.format("undefined handler for tag `%s'", tag)) ++ return ++ end ++ ++ if text then ++ text = text:gsub("`([^\n]-)`", "%1") ++ text = text:gsub("`(.-)`", "
    %1
    ") ++ end ++ ++-- assert(handlers[tag], string.format("undefined handler for tag `%s'", tag)) ++ return handlers[tag](tag, block, text) ++end +diff --git a/feeds/luci/build/luadoc/luadoc/util.lua b/feeds/luci/build/luadoc/luadoc/util.lua +new file mode 100644 +index 0000000..e1058d5 +--- /dev/null ++++ b/feeds/luci/build/luadoc/luadoc/util.lua +@@ -0,0 +1,201 @@ ++------------------------------------------------------------------------------- ++-- General utilities. ++-- @release $Id: util.lua,v 1.16 2008/02/17 06:42:51 jasonsantos Exp $ ++------------------------------------------------------------------------------- ++ ++local posix = require "nixio.fs" ++local type, table, string, io, assert, tostring, setmetatable, pcall = type, table, string, io, assert, tostring, setmetatable, pcall ++ ++------------------------------------------------------------------------------- ++-- Module with several utilities that could not fit in a specific module ++ ++module "luadoc.util" ++ ++------------------------------------------------------------------------------- ++-- Removes spaces from the begining and end of a given string ++-- @param s string to be trimmed ++-- @return trimmed string ++ ++function trim (s) ++ return (string.gsub(s, "^%s*(.-)%s*$", "%1")) ++end ++ ++------------------------------------------------------------------------------- ++-- Removes spaces from the begining and end of a given string, considering the ++-- string is inside a lua comment. ++-- @param s string to be trimmed ++-- @return trimmed string ++-- @see trim ++-- @see string.gsub ++ ++function trim_comment (s) ++ s = string.gsub(s, "^%s*%-%-+%[%[(.*)$", "%1") ++ s = string.gsub(s, "^%s*%-%-+(.*)$", "%1") ++ return s ++end ++ ++------------------------------------------------------------------------------- ++-- Checks if a given line is empty ++-- @param line string with a line ++-- @return true if line is empty, false otherwise ++ ++function line_empty (line) ++ return (string.len(trim(line)) == 0) ++end ++ ++------------------------------------------------------------------------------- ++-- Appends two string, but if the first one is nil, use to second one ++-- @param str1 first string, can be nil ++-- @param str2 second string ++-- @return str1 .. " " .. str2, or str2 if str1 is nil ++ ++function concat (str1, str2) ++ if str1 == nil or string.len(str1) == 0 then ++ return str2 ++ else ++ return str1 .. " " .. str2 ++ end ++end ++ ++------------------------------------------------------------------------------- ++-- Split text into a list consisting of the strings in text, ++-- separated by strings matching delim (which may be a pattern). ++-- @param delim if delim is "" then action is the same as %s+ except that ++-- field 1 may be preceeded by leading whitespace ++-- @usage split(",%s*", "Anna, Bob, Charlie,Dolores") ++-- @usage split(""," x y") gives {"x","y"} ++-- @usage split("%s+"," x y") gives {"", "x","y"} ++-- @return array with strings ++-- @see table.concat ++ ++function split(delim, text) ++ local list = {} ++ if string.len(text) > 0 then ++ delim = delim or "" ++ local pos = 1 ++ -- if delim matches empty string then it would give an endless loop ++ if string.find("", delim, 1) and delim ~= "" then ++ error("delim matches empty string!") ++ end ++ local first, last ++ while 1 do ++ if delim ~= "" then ++ first, last = string.find(text, delim, pos) ++ else ++ first, last = string.find(text, "%s+", pos) ++ if first == 1 then ++ pos = last+1 ++ first, last = string.find(text, "%s+", pos) ++ end ++ end ++ if first then -- found? ++ table.insert(list, string.sub(text, pos, first-1)) ++ pos = last+1 ++ else ++ table.insert(list, string.sub(text, pos)) ++ break ++ end ++ end ++ end ++ return list ++end ++ ++------------------------------------------------------------------------------- ++-- Comments a paragraph. ++-- @param text text to comment with "--", may contain several lines ++-- @return commented text ++ ++function comment (text) ++ text = string.gsub(text, "\n", "\n-- ") ++ return "-- " .. text ++end ++ ++------------------------------------------------------------------------------- ++-- Wrap a string into a paragraph. ++-- @param s string to wrap ++-- @param w width to wrap to [80] ++-- @param i1 indent of first line [0] ++-- @param i2 indent of subsequent lines [0] ++-- @return wrapped paragraph ++ ++function wrap(s, w, i1, i2) ++ w = w or 80 ++ i1 = i1 or 0 ++ i2 = i2 or 0 ++ assert(i1 < w and i2 < w, "the indents must be less than the line width") ++ s = string.rep(" ", i1) .. s ++ local lstart, len = 1, string.len(s) ++ while len - lstart > w do ++ local i = lstart + w ++ while i > lstart and string.sub(s, i, i) ~= " " do i = i - 1 end ++ local j = i ++ while j > lstart and string.sub(s, j, j) == " " do j = j - 1 end ++ s = string.sub(s, 1, j) .. "\n" .. string.rep(" ", i2) .. ++ string.sub(s, i + 1, -1) ++ local change = i2 + 1 - (i - j) ++ lstart = j + change ++ len = len + change ++ end ++ return s ++end ++ ++------------------------------------------------------------------------------- ++-- Opens a file, creating the directories if necessary ++-- @param filename full path of the file to open (or create) ++-- @param mode mode of opening ++-- @return file handle ++ ++function posix.open (filename, mode) ++ local f = io.open(filename, mode) ++ if f == nil then ++ filename = string.gsub(filename, "\\", "/") ++ local dir = "" ++ for d in string.gfind(filename, ".-/") do ++ dir = dir .. d ++ posix.mkdir(dir) ++ end ++ f = io.open(filename, mode) ++ end ++ return f ++end ++ ++ ++---------------------------------------------------------------------------------- ++-- Creates a Logger with LuaLogging, if present. Otherwise, creates a mock logger. ++-- @param options a table with options for the logging mechanism ++-- @return logger object that will implement log methods ++ ++function loadlogengine(options) ++ local logenabled = pcall(function() ++ require "logging" ++ require "logging.console" ++ end) ++ ++ local logging = logenabled and logging ++ ++ if logenabled then ++ if options.filelog then ++ logger = logging.file("luadoc.log") -- use this to get a file log ++ else ++ logger = logging.console("[%level] %message\n") ++ end ++ ++ if options.verbose then ++ logger:setLevel(logging.INFO) ++ else ++ logger:setLevel(logging.WARN) ++ end ++ ++ else ++ noop = {__index=function(...) ++ return function(...) ++ -- noop ++ end ++ end} ++ ++ logger = {} ++ setmetatable(logger, noop) ++ end ++ ++ return logger ++end +diff --git a/feeds/luci/build/makedocs.sh b/feeds/luci/build/makedocs.sh +new file mode 100755 +index 0000000..955c58c +--- /dev/null ++++ b/feeds/luci/build/makedocs.sh +@@ -0,0 +1,21 @@ ++#!/bin/bash ++ ++topdir=$(pwd) ++ ++[ -f "$topdir/build/makedocs.sh" -a -n "$1" ] || { ++ echo "Please execute as ./build/makedocs.sh [output directory]" >&2 ++ exit 1 ++} ++ ++outdir=$(readlink -f "$1") ++ ++mkdir -p "$outdir" || { ++ echo "Unable to mkdir '$outdir'" >&2 ++ exit 1 ++} ++ ++( ++ cd "$topdir/build/luadoc/" ++ find "$topdir/libs/" "$topdir/modules/" -type f -name '*.lua' -or -name '*.luadoc' | \ ++ xargs grep -l '@return' | xargs ./doc.lua --no-files -d "$outdir" ++) +diff --git a/feeds/luci/build/mkbasepot.sh b/feeds/luci/build/mkbasepot.sh +new file mode 100755 +index 0000000..7f07514 +--- /dev/null ++++ b/feeds/luci/build/mkbasepot.sh +@@ -0,0 +1,15 @@ ++#!/bin/sh ++ ++[ -d ./build ] || { ++ echo "Please execute as ./build/mkbasepot.sh" >&2 ++ exit 1 ++} ++ ++echo -n "Updating modules/luci-base/po/templates/base.pot ... " ++ ++./build/i18n-scan.pl \ ++ modules/luci-base/ modules/luci-mod-admin-full/ \ ++ protocols/ themes/ \ ++> modules/luci-base/po/templates/base.pot ++ ++echo "done" +diff --git a/feeds/luci/build/mkrevision.sh b/feeds/luci/build/mkrevision.sh +new file mode 100755 +index 0000000..02b7fa3 +--- /dev/null ++++ b/feeds/luci/build/mkrevision.sh +@@ -0,0 +1,27 @@ ++#!/bin/sh ++ ++TOPDIR="${0%mkrevision.sh}" ++ ++[ -d "$TOPDIR/../build" ] || { ++ echo "Please execute as ./build/mkrevision.sh" >&2 ++ exit 1 ++} ++ ++( ++ cd "$TOPDIR" ++ if svn info >/dev/null 2>/dev/null; then ++ revision="svn-r$(LC_ALL=C svn info | sed -ne 's/^Revision: //p')" ++ elif git log -1 >/dev/null 2>/dev/null; then ++ revision="svn-r$(LC_ALL=C git log -1 | sed -ne 's/.*git-svn-id: .*@\([0-9]\+\) .*/\1/p')" ++ if [ "$revision" = "svn-r" ]; then ++ set -- $(git log -1 --format="%ct %h") ++ secs="$(($1 % 86400))" ++ yday="$(date --utc --date="@$1" "+%y.%j")" ++ revision="$(printf 'git-%s.%05d-%s' "$yday" "$secs" "$2")" ++ fi ++ else ++ revision="unknown" ++ fi ++ ++ echo "$revision" ++) +diff --git a/feeds/luci/build/zoneinfo2lua.pl b/feeds/luci/build/zoneinfo2lua.pl +new file mode 100755 +index 0000000..d3f0403 +--- /dev/null ++++ b/feeds/luci/build/zoneinfo2lua.pl +@@ -0,0 +1,149 @@ ++#!/usr/bin/perl ++# zoneinfo2lua.pl - Make Lua module from /usr/share/zoneinfo ++# Execute from within root of Luci feed, usually feeds/luci ++# $Id$ ++ ++use strict; ++ ++my %TZ; ++ ++my $tzdin = $ARGV[0] || "/usr/share/zoneinfo"; ++my $tzdout = $ARGV[1] || "./modules/luci-base/luasrc/sys/zoneinfo"; ++ ++local $/ = "\012"; ++open( ZTAB, "< $tzdin/zone.tab" ) || die "open($tzdin/zone.tab): $!"; ++ ++while( ! eof ZTAB ) { ++ chomp( my $line = readline ZTAB ); ++ next if $line =~ /^#/ || $line =~ /^\s+$/; ++ ++ my ( undef, undef, $zone, @comment ) = split /\s+/, $line; ++ ++ printf STDERR "%-40s", $zone; ++ ++ if( open ZONE, "< $tzdin/$zone" ) { ++ seek ZONE, -2, 2; ++ ++ while( tell(ZONE) > 0 ) { ++ read ZONE, my $char, 1; ++ ( $char eq "\012" ) ? last : seek ZONE, -2, 1; ++ } ++ ++ chomp( my $tz = readline ZONE ); ++ print STDERR ( $tz || "(no tzinfo found)" ), "\n"; ++ close ZONE; ++ ++ if( $tz ) { ++ $zone =~ s/_/ /g; ++ $TZ{$zone} = $tz; ++ } ++ } ++ else ++ { ++ print STDERR "open($tzdin/$zone): $!\n"; ++ } ++} ++ ++close ZTAB; ++ ++ ++open(O, "> $tzdout/tzdata.lua") || die "open($tzdout/tzdata.lua): $!\n"; ++ ++print STDERR "Writing time zones to $tzdout/tzdata.lua ... "; ++print O < $tzdout/tzoffset.lua") || die "open($tzdout/tzoffset.lua): $!\n"; ++ ++print STDERR "Writing time offsets to $tzdout/tzoffset.lua ... "; ++print O < ++# ++# This is free software, licensed under the Apache License, Version 2.0 . ++# ++ ++include $(TOPDIR)/rules.mk ++ ++LUCI_TYPE:=col ++LUCI_BASENAME:=light ++ ++LUCI_TITLE:=Minimum package set using only admin mini and the standard theme ++LUCI_DEPENDS:=+uhttpd +luci-mod-admin-mini +luci-theme-openwrt @BROKEN ++ ++include ../../luci.mk ++ ++# call BuildPackage - OpenWrt buildroot signature +diff --git a/feeds/luci/collections/luci-ssl/Makefile b/feeds/luci/collections/luci-ssl/Makefile +new file mode 100644 +index 0000000..07c9c50 +--- /dev/null ++++ b/feeds/luci/collections/luci-ssl/Makefile +@@ -0,0 +1,17 @@ ++# ++# Copyright (C) 2008-2014 The LuCI Team ++# ++# This is free software, licensed under the Apache License, Version 2.0 . ++# ++ ++include $(TOPDIR)/rules.mk ++ ++LUCI_TYPE:=col ++LUCI_BASENAME:=ssl ++ ++LUCI_TITLE:=Standard OpenWrt set with HTTPS support ++LUCI_DEPENDS:=+luci +libustream-polarssl +px5g ++ ++include ../../luci.mk ++ ++# call BuildPackage - OpenWrt buildroot signature +diff --git a/feeds/luci/collections/luci/Makefile b/feeds/luci/collections/luci/Makefile +new file mode 100644 +index 0000000..4625c95 +--- /dev/null ++++ b/feeds/luci/collections/luci/Makefile +@@ -0,0 +1,19 @@ ++# ++# Copyright (C) 2008-2014 The LuCI Team ++# ++# This is free software, licensed under the Apache License, Version 2.0 . ++# ++ ++include $(TOPDIR)/rules.mk ++ ++LUCI_TYPE:=col ++LUCI_BASENAME:=luci ++ ++LUCI_TITLE:=Standard OpenWrt set including full admin with ppp support and the default Bootstrap theme ++LUCI_DEPENDS:= \ ++ +uhttpd +uhttpd-mod-ubus +luci-mod-admin-full +luci-theme-bootstrap \ ++ +luci-app-firewall +luci-proto-ppp +libiwinfo-lua +IPV6:luci-proto-ipv6 ++ ++include ../../luci.mk ++ ++# call BuildPackage - OpenWrt buildroot signature +diff --git a/feeds/luci/contrib/package/Makefile b/feeds/luci/contrib/package/Makefile +new file mode 100644 +index 0000000..f7fac77 +--- /dev/null ++++ b/feeds/luci/contrib/package/Makefile +@@ -0,0 +1,2 @@ ++include ../../build/config.mk ++include ../../build/module.mk +diff --git a/feeds/luci/contrib/package/community-profiles/Makefile b/feeds/luci/contrib/package/community-profiles/Makefile +new file mode 100644 +index 0000000..1992b7c +--- /dev/null ++++ b/feeds/luci/contrib/package/community-profiles/Makefile +@@ -0,0 +1,39 @@ ++# Copyright (C) 2011 Manuel Munz ++# This is free software, licensed under the Apache 2.0 license. ++ ++include $(TOPDIR)/rules.mk ++ ++PKG_NAME:=community-profiles ++PKG_RELEASE:=2 ++ ++PKG_BUILD_DIR := $(BUILD_DIR)/$(PKG_NAME) ++ ++include $(INCLUDE_DIR)/package.mk ++ ++define Package/community-profiles ++ SECTION:=luci ++ CATEGORY:=LuCI ++ SUBMENU:=9. Freifunk ++ TITLE:=Community profiles ++ DEPENDS:=freifunk-common ++endef ++ ++define Package/community-profiles/description ++ These community profiles set defaults for various free network/freifunk communities and are used by wizards like ffwizard and meshwizard. ++endef ++ ++define Build/Prepare ++ mkdir -p $(PKG_BUILD_DIR) ++endef ++ ++define Build/Configure ++endef ++ ++define Build/Compile ++endef ++ ++define Package/community-profiles/install ++ $(CP) ./files/* $(1)/ ++endef ++ ++$(eval $(call BuildPackage,community-profiles)) +diff --git a/feeds/luci/contrib/package/community-profiles/files/etc/config/profile_31c3 b/feeds/luci/contrib/package/community-profiles/files/etc/config/profile_31c3 +new file mode 100644 +index 0000000..469e0b5 +--- /dev/null ++++ b/feeds/luci/contrib/package/community-profiles/files/etc/config/profile_31c3 +@@ -0,0 +1,45 @@ ++config 'community' 'profile' ++ option 'name' 'Freifunk 31c3' ++ option 'homepage' 'http://31c3.freifunk.net' ++ option 'ssid' '02:CA:FF:EE:BA:BE' ++ option 'mesh_network' '10.197.0.0/16' ++ option 'latitude' '53.56176' ++ option 'longitude' '9.9833' ++ option 'suffix' 'olsr.31c3.freifunk.net' ++ option 'vap' '0' ++ option 'adhoc_dhcp_when_vap' '0' ++ ++config 'defaults' 'interface' ++ option 'netmask' '255.255.255.255' ++ ++config 'defaults' 'bssidscheme' ++ option '1' '02:CA:FF:EE:BA:BE' ++ option '36' '02:36:CA:FF:EE:EE' ++ ++config 'defaults' 'wifi_device' ++ option 'country' 'DE' ++ ++config 'defaults' 'wifi_iface' ++ option 'mcast_rate' '12000' ++ ++config 'defaults' 'olsrd' ++ option 'LinkQualityAlgorithm' 'etx_ff' ++ ++config widget 'customindex' ++ option enabled '1' ++ option width '50%' ++ option paddingright '5%' ++ option template 'html' ++ ++config widget 'rssbundesweit' ++ option cache '3600' ++ option width '50%' ++ option title 'bundesweiter Freifunk Blog' ++ option template 'rssfeed' ++ option enabled '1' ++ option max '10' ++ option url 'http://blog.freifunk.net/rss.xml' ++ ++config widget 'clear1' ++ option template 'clear' ++ option enabled '1' +diff --git a/feeds/luci/contrib/package/community-profiles/files/etc/config/profile_Freifunk b/feeds/luci/contrib/package/community-profiles/files/etc/config/profile_Freifunk +new file mode 100644 +index 0000000..b8f445a +--- /dev/null ++++ b/feeds/luci/contrib/package/community-profiles/files/etc/config/profile_Freifunk +@@ -0,0 +1,10 @@ ++config 'community' 'profile' ++ option 'name' 'Freifunk' ++ option 'homepage' 'http://freifunk.net' ++ option 'ssid' 'www.freifunk.net' ++ option 'splash_network' '10.104.0.0/16' ++ option 'latitude' '52.000' ++ option 'longitude' '10.000' ++ option 'splash_prefix' '28' ++ option 'mesh_network' '10.0.0.0/8' ++ +diff --git a/feeds/luci/contrib/package/community-profiles/files/etc/config/profile_altmark b/feeds/luci/contrib/package/community-profiles/files/etc/config/profile_altmark +new file mode 100644 +index 0000000..20d51b2 +--- /dev/null ++++ b/feeds/luci/contrib/package/community-profiles/files/etc/config/profile_altmark +@@ -0,0 +1,56 @@ ++config 'community' 'profile' ++ option 'name' 'Freifunk Altmark' ++ option 'homepage' 'http://altmark.freifunk.net' ++ option 'ssid' 'altmark.freifunk.net' ++ option 'mesh_network' '10.59.0.0/16' ++ option 'latitude' '52.885' ++ option 'longitude' '11.15' ++ option 'suffix' 'olsr.altmark.freifunk.net' ++ option 'vap' '1' ++ option 'adhoc_dhcp_when_vap' '0' ++ ++config 'defaults' 'interface' ++ option 'netmask' '255.255.255.255' ++ ++ ++config 'defaults' 'bssidscheme' ++ option '1' '02:CA:FF:EE:BA:BE' ++ option '40' '02:40:CA:FF:EE:EE' ++ ++config 'defaults' 'wifi_device' ++ option 'country' 'DE' ++ ++config 'defaults' 'wifi_iface' ++ option 'mcast_rate' '6000' ++ ++config 'defaults' 'olsrd' ++ option 'LinkQualityAlgorithm' 'etx_ff' ++ ++ ++config widget 'customindex' ++ option enabled '1' ++ option width '50%' ++ option paddingright '5%' ++ option template 'html' ++ ++config widget 'rssffl' ++ option enabled '1' ++ option max '10' ++ option cache '3600' ++ option width '100%' ++ option title 'Freifunk Blog' ++ option template 'iframe' ++ option url 'http://freifunk.net' ++ ++config widget 'rssbundesweit' ++ option cache '3600' ++ option width '50%' ++ option title 'bundesweiter Freifunk Blog' ++ option template 'rssfeed' ++ option enabled '1' ++ option max '10' ++ option url 'http://blog.freifunk.net/rss.xml' ++ ++config widget 'clear1' ++ option template 'clear' ++ option enabled '1' +diff --git a/feeds/luci/contrib/package/community-profiles/files/etc/config/profile_arig_arad b/feeds/luci/contrib/package/community-profiles/files/etc/config/profile_arig_arad +new file mode 100644 +index 0000000..55d012f +--- /dev/null ++++ b/feeds/luci/contrib/package/community-profiles/files/etc/config/profile_arig_arad +@@ -0,0 +1,22 @@ ++config 'community' 'profile' ++ option 'name' 'arig Arad' ++ option 'homepage' 'http://arig.org.il' ++ option 'ssid' 'arig.org.il' ++ option 'latitude' '31.26' ++ option 'longitude' '35.21' ++ option 'splash_prefix' '28' ++ option 'suffix' 'arig' ++ option 'mesh_network' '10.81.8.0/22' ++ ++config 'defaults' 'bssidscheme' ++ option '1' '02:CA:FF:EE:BA:BE' ++ option '13' '13:CA:FF:EE:BA:BE' ++ ++config 'defaults' 'wifi_device' ++ option 'channel' '13' ++ option 'country' 'IL' ++ option 'beacon_int' '5000' ++ option 'distance' '1500' ++ ++config 'defaults' 'wifi_iface' ++ option 'mcast_rate' '6000' +diff --git a/feeds/luci/contrib/package/community-profiles/files/etc/config/profile_arig_neot_semadar b/feeds/luci/contrib/package/community-profiles/files/etc/config/profile_arig_neot_semadar +new file mode 100644 +index 0000000..062b18e +--- /dev/null ++++ b/feeds/luci/contrib/package/community-profiles/files/etc/config/profile_arig_neot_semadar +@@ -0,0 +1,22 @@ ++config 'community' 'profile' ++ option 'name' 'arig Neot Semadar' ++ option 'homepage' 'http://www.neot-semadar.com' ++ option 'ssid' 'arig.org.il' ++ option 'latitude' '30.05' ++ option 'longitude' '35.02' ++ option 'splash_prefix' '272' ++ option 'suffix' 'arig' ++ option 'mesh_network' '10.81.12.0/22' ++ ++config 'defaults' 'bssidscheme' ++ option '1' '02:CA:FF:EE:BA:BE' ++ option '13' '13:CA:FF:EE:BA:BE' ++ ++config 'defaults' 'wifi_device' ++ option 'channel' '13' ++ option 'country' 'IL' ++ option 'beacon_int' '5000' ++ option 'distance' '1500' ++ ++config 'defaults' 'wifi_iface' ++ option 'mcast_rate' '6000' +diff --git a/feeds/luci/contrib/package/community-profiles/files/etc/config/profile_arig_tel-aviv b/feeds/luci/contrib/package/community-profiles/files/etc/config/profile_arig_tel-aviv +new file mode 100644 +index 0000000..fe7df22 +--- /dev/null ++++ b/feeds/luci/contrib/package/community-profiles/files/etc/config/profile_arig_tel-aviv +@@ -0,0 +1,22 @@ ++config 'community' 'profile' ++ option 'name' 'arig Tel Aviv' ++ option 'homepage' 'http://arig.org.il' ++ option 'ssid' 'arig.org.il' ++ option 'latitude' '32.056' ++ option 'longitude' '34.772' ++ option 'splash_prefix' '28' ++ option 'suffix' 'arig' ++ option 'mesh_network' '10.81.0.0/21' ++ ++config 'defaults' 'bssidscheme' ++ option '1' '02:CA:FF:EE:BA:BE' ++ option '13' '13:CA:FF:EE:BA:BE' ++ ++config 'defaults' 'wifi_device' ++ option 'channel' '13' ++ option 'country' 'IL' ++ option 'beacon_int' '5000' ++ option 'distance' '1500' ++ ++config 'defaults' 'wifi_iface' ++ option 'mcast_rate' '6000' +diff --git a/feeds/luci/contrib/package/community-profiles/files/etc/config/profile_augsburg b/feeds/luci/contrib/package/community-profiles/files/etc/config/profile_augsburg +new file mode 100644 +index 0000000..4ab82cf +--- /dev/null ++++ b/feeds/luci/contrib/package/community-profiles/files/etc/config/profile_augsburg +@@ -0,0 +1,64 @@ ++config 'community' 'profile' ++ option 'name' 'Freifunk Augsburg' ++ option 'homepage' 'http://augsburg.freifunk.net' ++ option 'ssid' 'augsburg.freifunk.net' ++ option 'mesh_network' '10.11.0.0/18' ++ option 'splash_network' '10.104.0.0/16' ++ option 'latitude' '48.37071' ++ option 'longitude' '10.89475' ++ option 'suffix' 'ffa' ++ option 'splash_prefix' '27' ++ option 'vap' '1' ++ option adhoc_dhcp_when_vap '1' ++ option 'ipv6' '1' ++ option 'ipv6_config' 'auto-ipv6-fromv4' ++ option 'ipv6_prefix' 'fdca:ffee:ffa::/48' ++ #option 'extrapackages' '' ++ ++config 'defaults' 'interface' ++ option 'netmask' '255.255.192.0' ++ ++config 'defaults' 'bssidscheme' ++ option '1' '02:CA:FF:EE:BA:BE' ++ ++config 'defaults' 'luci_splash' ++ option 'limit_up' '40' ++ option 'limit_down' '120' ++ option 'leasetime' '8' ++ ++config widget 'customindex' ++ option enabled '1' ++ option width '50%' ++ option paddingright '5%' ++ option template 'html' ++ ++config widget 'rssffa' ++ option enabled '1' ++ option max '10' ++ option cache '3600' ++ option width '50%' ++ option title 'Freifunk Augsburg Blog' ++ option template 'rssfeed' ++ option url 'http://augsburg.freifunk.net/blog?type=100' ++ ++config widget 'rssaugsburg' ++ option cache '3600' ++ option width '50%' ++ option title 'Augsburger Blogs' ++ option template 'rssfeed' ++ option enabled '1' ++ option max '10' ++ option url 'http://wgaugsburg.de/augsburg/rss20.xml' ++ ++config widget 'search' ++ option template 'search' ++ option title 'Search' ++ option enabled '1' ++ option width '50%' ++ list engine 'Google|http://www.google.de/search?q=' ++ list engine 'Freifunk Augsburg|http://www.google.de/search?q=site:augsburg.freifunk.net+' ++ list engine 'Freifunk Wiki|http://wiki.freifunk.net/index.php?search=' ++ ++config widget 'clear1' ++ option template 'clear' ++ option enabled '1' +diff --git a/feeds/luci/contrib/package/community-profiles/files/etc/config/profile_bayreuth b/feeds/luci/contrib/package/community-profiles/files/etc/config/profile_bayreuth +new file mode 100644 +index 0000000..90fccbd +--- /dev/null ++++ b/feeds/luci/contrib/package/community-profiles/files/etc/config/profile_bayreuth +@@ -0,0 +1,20 @@ ++config 'community' 'profile' ++ option 'name' 'Freifunk Bayreuth' ++ option 'homepage' 'http://bayreuth.freifunk.net' ++ option 'ssid' 'bayreuth.freifunk.net' ++ option 'mesh_network' '10.195.0.0/16' ++ option 'splash_network' '10.104.0.0/16' ++ option 'latitude' '49.945812' ++ option 'longitude' '11.575045' ++ option 'suffix' 'ffbt' ++ option 'splash_prefix' '28' ++ ++config 'defaults' 'interface' ++ option 'netmask' '255.255.192.0' ++ ++config 'defaults' 'wifi_device' ++ option 'channel' '4' ++ ++config 'defaults' 'wifi_iface' ++ option 'bssid' '42:CA:FF:EE:BA:BE' ++ +diff --git a/feeds/luci/contrib/package/community-profiles/files/etc/config/profile_bensheim b/feeds/luci/contrib/package/community-profiles/files/etc/config/profile_bensheim +new file mode 100644 +index 0000000..48c1d47 +--- /dev/null ++++ b/feeds/luci/contrib/package/community-profiles/files/etc/config/profile_bensheim +@@ -0,0 +1,9 @@ ++config 'community' 'profile' ++ option 'name' 'Freifunk Bensheim' ++ option 'homepage' 'http://bensheim.freifunk.net' ++ option 'ssid' 'bensheim.freifunk.net' ++ option 'mesh_network' '10.49.0.0/16' ++ option 'splash_network' '10.104.0.0/16' ++ option 'splash_prefix' '27' ++ option 'latitude' '49.63939' ++ option 'longitude' '8.633718' +diff --git a/feeds/luci/contrib/package/community-profiles/files/etc/config/profile_bergischesland b/feeds/luci/contrib/package/community-profiles/files/etc/config/profile_bergischesland +new file mode 100644 +index 0000000..0de4543 +--- /dev/null ++++ b/feeds/luci/contrib/package/community-profiles/files/etc/config/profile_bergischesland +@@ -0,0 +1,15 @@ ++config 'community' 'profile' ++ option 'name' 'Piratenfreifunk Bergisches Land' ++ option 'homepage' 'http://www.piraten-bergisches-land.de' ++ option 'ssid' 'PiratenfunkBL' ++ option 'mesh_network' '10.3.0.0/16' ++ option 'splash_network' '192.168.0.0/16' ++ option 'splash_prefix' '27' ++ option 'latitude' '51.26849' ++ option 'longitude' '7.19476' ++ ++config 'defaults' 'wifi_device' ++ option 'channel' '11' ++ ++config 'defaults' 'wifi_iface' ++ option 'bssid' '02:40:00:42:42:42' +diff --git a/feeds/luci/contrib/package/community-profiles/files/etc/config/profile_berlin b/feeds/luci/contrib/package/community-profiles/files/etc/config/profile_berlin +new file mode 100644 +index 0000000..b4694c0 +--- /dev/null ++++ b/feeds/luci/contrib/package/community-profiles/files/etc/config/profile_berlin +@@ -0,0 +1,50 @@ ++config 'community' 'profile' ++ option 'name' 'Freifunk Berlin' ++ option 'homepage' 'http://berlin.freifunk.net' ++ option 'ssid' 'freifunk.net' ++ option 'ssid_scheme' 'addchannelbefore' ++ option 'mesh_network' '104.0.0.0/8' ++ option 'splash_network' '10.104.0.0/16' ++ option 'splash_prefix' '27' ++ option 'latitude' '52.52075' ++ option 'longitude' '13.40948' ++ list 'owm_api' 'http://api.openwifimap.net' ++ list 'owm_api' 'http://owmapi.pberg.freifunk.net' ++ option 'mapserver' 'http://map.pberg.freifunk.net/' ++ ++config 'defaults' 'wifi_device' ++ option 'channel' '13' ++ ++config 'defaults' 'bssidscheme' ++ option '10' '02:CA:FF:EE:BA:BE' ++ option '13' 'D2:CA:FF:EE:BA:BE' ++ option '36' '02:36:CA:FF:EE:EE' ++ ++config 'defaults' 'ssidscheme' ++ option '13' 'ch13.freifunk.net' ++ option '36' 'ch36.freifunk.net' ++ ++config 'defaults' 'interface' ++ option 'netmask' '255.0.0.0' ++ option 'dns' '85.214.20.141 213.73.91.35 194.150.168.168' ++ ++config 'defaults' 'olsr_interface' ++ option 'Ip4Broadcast' '255.255.255.255' ++ option 'HelloInterval' '3.0' ++ option 'HelloValidityTime' '125.0' ++ option 'TcInterval' '2.0' ++ option 'TcValidityTime' '500.0' ++ option 'MidInterval' '25.0' ++ option 'MidValidityTime' '500.0' ++ option 'HnaInterval' '10.0' ++ option 'HnaValidityTime' '125.0' ++ ++config 'defaults' 'olsrd' ++ option 'AllowNoInt' 'yes' ++ option 'FIBMetric' 'flat' ++ option 'Pollrate' '0.025' ++ option 'TcRedundancy' '2' ++ option 'NatThreshold' '0.75' ++ option 'LinkQualityAlgorithm' 'etx_ff' ++ option 'RtTableDefaultOlsrPriority' '20000' ++ option 'RtTableTunnelPriority' '100000' +diff --git a/feeds/luci/contrib/package/community-profiles/files/etc/config/profile_carbodebit b/feeds/luci/contrib/package/community-profiles/files/etc/config/profile_carbodebit +new file mode 100644 +index 0000000..0b263f9 +--- /dev/null ++++ b/feeds/luci/contrib/package/community-profiles/files/etc/config/profile_carbodebit +@@ -0,0 +1,23 @@ ++config 'community' 'profile' ++ option 'name' 'carbodebit' ++ option 'homepage' 'http://carbodebit.net' ++ option 'ssid' 'VHDCARBES' ++ option 'mesh_network' '10.72.1.0/24' ++ option 'latitude' '43.633683' ++ option 'longitude' '2.160894' ++ ++config 'defaults' 'wifi_iface' ++ option 'bssid' 'DE:78:70:E4:FA:B8' ++ ++config 'defaults' 'interface' ++ option 'netmask' '255.255.255.0' ++ option 'dns' '10.70.1.1 213.190.64.170 213.190.64.166' ++ ++config 'defaults' 'wifi_device' ++ option 'channel' '11' ++ option 'country' 'FR' ++ option 'distance' '2000' ++ ++config 'defaults' 'bssidscheme' ++ option 'all' 'DE:78:70:E4:FA:B8' ++ +diff --git a/feeds/luci/contrib/package/community-profiles/files/etc/config/profile_demo b/feeds/luci/contrib/package/community-profiles/files/etc/config/profile_demo +new file mode 100644 +index 0000000..c11a74f +--- /dev/null ++++ b/feeds/luci/contrib/package/community-profiles/files/etc/config/profile_demo +@@ -0,0 +1,21 @@ ++config 'community' 'profile' ++ option 'name' 'Freifunk Demo' ++ option 'homepage' 'http://www.freifunk.net' ++ option 'ssid' 'demo.freifunk.net' ++ option 'mesh_network' '10.11.12.0/24' ++ option 'latitude' '51.163375' ++ option 'longitude' '10.447683' ++ option 'suffix' 'ff' ++ option 'vap' '1' ++ option adhoc_dhcp_when_vap '1' ++ option 'ipv6' '1' ++ option 'ipv6_config' 'auto-ipv6-fromv4' ++ option 'ipv6_prefix' 'fdca:ffff:ffff::/48' ++ #option 'extrapackages' '' ++ ++config 'defaults' 'interface' ++ option 'netmask' '255.255.255.0' ++ ++config 'defaults' 'luci_splash' ++ option 'limit_up' '50' ++ option 'limit_down' '200' +diff --git a/feeds/luci/contrib/package/community-profiles/files/etc/config/profile_duesseldorf b/feeds/luci/contrib/package/community-profiles/files/etc/config/profile_duesseldorf +new file mode 100644 +index 0000000..cb36aab +--- /dev/null ++++ b/feeds/luci/contrib/package/community-profiles/files/etc/config/profile_duesseldorf +@@ -0,0 +1,15 @@ ++config 'community' 'profile' ++ option 'name' 'Freifunk Duesseldorf' ++ option 'homepage' 'http://freifunk-duesseldorf.de' ++ option 'ssid' 'duesseldorf.freifunk.net' ++ option 'mesh_network' '10.40.0.0/16' ++ option 'splash_network' '10.104.0.0/16' ++ option 'splash_prefix' '27' ++ option 'latitude' '51.217812' ++ option 'longitude' '6.761564' ++ ++config 'defaults' 'wifi_device' ++ option 'channel' '3' ++ ++config 'defaults' 'wifi_iface' ++ option 'bssid' '02:CA:FF:EE:BA:BE' +diff --git a/feeds/luci/contrib/package/community-profiles/files/etc/config/profile_erfurt b/feeds/luci/contrib/package/community-profiles/files/etc/config/profile_erfurt +new file mode 100644 +index 0000000..dba31a0 +--- /dev/null ++++ b/feeds/luci/contrib/package/community-profiles/files/etc/config/profile_erfurt +@@ -0,0 +1,48 @@ ++config 'community' 'profile' ++ option 'name' 'Freifunk Erfurt' ++ option 'homepage' 'http://erfurt.freifunk.net' ++ option 'ssid' 'erfurt.freifunk.net' ++ option 'mesh_network' '10.99.0.0/16' ++ option 'latitude' '50.9768' ++ option 'longitude' '11.02367' ++ option 'suffix' 'olsr.erfurt.freifunk.net' ++ option 'vap' '1' ++ option 'adhoc_dhcp_when_vap' '0' ++ ++config 'defaults' 'interface' ++ option 'netmask' '255.255.0.0' ++ ++config 'defaults' 'bssidscheme' ++ option '1' '02:CA:FF:EE:BA:BE' ++ ++config 'defaults' 'olsrd' ++ option 'LinkQualityAlgorithm' 'etx_ff' ++ ++ ++config widget 'customindex' ++ option enabled '1' ++ option width '50%' ++ option paddingright '5%' ++ option template 'html' ++ ++config widget 'rssffl' ++ option enabled '1' ++ option max '10' ++ option cache '3600' ++ option width '100%' ++ option title 'Freifunk Blog' ++ option template 'iframe' ++ option url 'http://freifunk.net' ++ ++config widget 'rssbundesweit' ++ option cache '3600' ++ option width '50%' ++ option title 'bundesweiter Freifunk Blog' ++ option template 'rssfeed' ++ option enabled '1' ++ option max '10' ++ option url 'http://blog.freifunk.net/rss.xml' ++ ++config widget 'clear1' ++ option template 'clear' ++ option enabled '1' +diff --git a/feeds/luci/contrib/package/community-profiles/files/etc/config/profile_evernet b/feeds/luci/contrib/package/community-profiles/files/etc/config/profile_evernet +new file mode 100644 +index 0000000..0545360 +--- /dev/null ++++ b/feeds/luci/contrib/package/community-profiles/files/etc/config/profile_evernet +@@ -0,0 +1,25 @@ ++config 'community' 'profile' ++ option 'name' 'Freifunk Evernet eG' ++ option 'homepage' 'http://www.evernet-eg.de' ++ option 'ssid' 'evernet.freifunk.net' ++ option 'mesh_network' '10.0.0.0/8' ++ option 'latitude' '51.15692062509162' ++ option 'longitude' '10.716041922569275' ++ option 'suffix' 'evernet' ++ ++config 'defaults' 'interface' ++ option 'netmask' '255.0.0.0' ++ ++config 'defaults' 'bssidscheme' ++ option 'all' '02:CA:FF:EE:BA:BE' ++ ++config 'defaults' 'wifi_device' ++ option 'channel' '13' ++ option 'country' 'DE' ++ option 'txpower' '19' ++ option 'beacon_int' '5000' ++ option 'distance' '1500' ++ option 'noscan' '0' ++ ++config 'defaults' 'wifi_iface' ++ option 'mcast_rate' '6000' +diff --git a/feeds/luci/contrib/package/community-profiles/files/etc/config/profile_freiburg b/feeds/luci/contrib/package/community-profiles/files/etc/config/profile_freiburg +new file mode 100644 +index 0000000..eee3d6a +--- /dev/null ++++ b/feeds/luci/contrib/package/community-profiles/files/etc/config/profile_freiburg +@@ -0,0 +1,45 @@ ++config 'community' 'profile' ++ option 'name' 'Freifunk Freiburg' ++ option 'homepage' 'http://freiburg.freifunk.net' ++ option 'ssid' '02:CA:FF:EE:BA:BE' ++ option 'mesh_network' '10.60.0.0/16' ++ option 'latitude' '47.994841' ++ option 'longitude' '7.849772' ++ option 'suffix' 'olsr.freiburg.freifunk.net' ++ option 'vap' '1' ++ option 'adhoc_dhcp_when_vap' '0' ++ ++config 'defaults' 'interface' ++ option 'netmask' '255.255.255.255' ++ ++config 'defaults' 'bssidscheme' ++ option '1' '02:CA:FF:EE:BA:BE' ++ option '40' '02:40:CA:FF:EE:EE' ++ ++config 'defaults' 'wifi_device' ++ option 'country' 'DE' ++ ++config 'defaults' 'wifi_iface' ++ option 'mcast_rate' '6000' ++ ++config 'defaults' 'olsrd' ++ option 'LinkQualityAlgorithm' 'etx_ff' ++ ++config widget 'customindex' ++ option enabled '1' ++ option width '50%' ++ option paddingright '5%' ++ option template 'html' ++ ++config widget 'rssbundesweit' ++ option cache '3600' ++ option width '50%' ++ option title 'bundesweiter Freifunk Blog' ++ option template 'rssfeed' ++ option enabled '1' ++ option max '10' ++ option url 'http://blog.freifunk.net/rss.xml' ++ ++config widget 'clear1' ++ option template 'clear' ++ option enabled '1' +diff --git a/feeds/luci/contrib/package/community-profiles/files/etc/config/profile_gadow b/feeds/luci/contrib/package/community-profiles/files/etc/config/profile_gadow +new file mode 100644 +index 0000000..bc4a203 +--- /dev/null ++++ b/feeds/luci/contrib/package/community-profiles/files/etc/config/profile_gadow +@@ -0,0 +1,23 @@ ++config 'community' 'profile' ++ option 'name' 'Freifunk Gadow' ++ option 'homepage' 'http://gadow.freifunk.net' ++ option 'ssid' 'gadow.freifunk.net' ++ option 'mesh_network' '10.61.0.0/16' ++ option 'latitude' '53.11' ++ option 'longitude' '12.61' ++ option 'vap' '1' ++ option 'adhoc_dhcp_when_vap' '0' ++ ++config 'defaults' 'interface' ++ option 'netmask' '255.255.255.255' ++ ++ ++config 'defaults' 'bssidscheme' ++ option '1' '02:CA:FF:EE:BA:BE' ++ option '40' '02:40:CA:FF:EE:EE' ++ ++config 'defaults' 'wifi_device' ++ option 'country' 'DE' ++ ++config 'defaults' 'wifi_iface' ++ option 'mcast_rate' '6000' +diff --git a/feeds/luci/contrib/package/community-profiles/files/etc/config/profile_guifibages b/feeds/luci/contrib/package/community-profiles/files/etc/config/profile_guifibages +new file mode 100644 +index 0000000..a0fc4fc +--- /dev/null ++++ b/feeds/luci/contrib/package/community-profiles/files/etc/config/profile_guifibages +@@ -0,0 +1,19 @@ ++config 'community' 'profile' ++ option 'name' 'Guifi Bages' ++ option 'homepage' 'http://guifi.net/PlaBages' ++ option 'ssid' 'guifibages' ++ option 'mesh_network' '10.224.3.0/16' ++ option 'splash_network' '10.104.0.0/16' ++ option 'theme' 'luci-theme-freifunk-generic' ++ option 'latitude' '41.718437' ++ option 'longitude' '1.826477' ++ option 'suffix' 'guifibages.cat' ++ option 'splash_prefix' '27' ++ option 'extrapackages' 'luci-app-olsr-viz luci-i18n-catalan' ++ ++config 'defaults' 'interface' ++ option 'netmask' '255.255.0.0' ++ ++config 'defaults' 'bssidscheme' ++ option 'all' '12:34:56:78:9a:bc' ++ +diff --git a/feeds/luci/contrib/package/community-profiles/files/etc/config/profile_halle b/feeds/luci/contrib/package/community-profiles/files/etc/config/profile_halle +new file mode 100644 +index 0000000..0e8e43f +--- /dev/null ++++ b/feeds/luci/contrib/package/community-profiles/files/etc/config/profile_halle +@@ -0,0 +1,40 @@ ++config 'community' 'profile' ++ option 'name' 'Freifunk Halle' ++ option 'homepage' 'http://freifunk-halle.net' ++ option 'ssid' 'halle.freifunk.net' ++ option 'mesh_network' '104.62.0.0/16' ++ option 'splash_network' '10.104.0.0/16' ++ option 'splash_prefix' '27' ++ option 'latitude' '51.47911' ++ option 'longitude' '11.96901' ++ ++config 'defaults' 'wifi_device' ++ option 'channel' '13' ++ option 'country' 'DE' ++ ++config 'defaults' 'bssidscheme' ++ option 'all' '02:CA:FF:EE:BA:BE' ++ ++config 'defaults' 'interface' ++ option 'netmask' '255.0.0.0' ++ ++config 'defaults' 'olsrd' ++ option 'AllowNoInt' 'yes' ++ option 'FIBMetric' 'flat' ++ option 'Pollrate' '0.025' ++ option 'TcRedundancy' '2' ++ option 'NatThreshold' '0.75' ++ option 'LinkQualityAlgorithm' 'etx_ff' ++ option 'LinkQualityFishEye' '1' ++ option 'Willingness' '3' ++ ++config 'defaults' 'olsr_interface' ++ option 'Ip4Broadcast' '255.255.255.255' ++ option 'HelloInterval' '5.0' ++ option 'HelloValidityTime' '125.0' ++ option 'TcInterval' '3.0' ++ option 'TcValidityTime' '375.0' ++ option 'MidInterval' '25.0' ++ option 'MidValidityTime' '375.0' ++ option 'HnaInterval' '25.0' ++ option 'HnaValidityTime' '375.0' +diff --git a/feeds/luci/contrib/package/community-profiles/files/etc/config/profile_hameln b/feeds/luci/contrib/package/community-profiles/files/etc/config/profile_hameln +new file mode 100644 +index 0000000..f305b59 +--- /dev/null ++++ b/feeds/luci/contrib/package/community-profiles/files/etc/config/profile_hameln +@@ -0,0 +1,15 @@ ++config 'community' 'profile' ++ option 'name' 'Hameln' ++ option 'homepage' 'http://freifunk-hameln.de' ++ option 'ssid' 'hameln.freifunk.net' ++ option 'suffix' 'ffhm' ++ option 'latitude' '52.1030706' ++ option 'longitude' '9.3514778' ++ option 'mesh_network' '10.31.0.0/16' ++ option 'splash_network' '10.104.0.0/16' ++ option 'splash_prefix' '27' ++ option 'vap' '1' ++ option adhoc_dhcp_when_vap '1' ++ ++config 'defaults' 'interface' ++ option 'netmask' '255.255.0.0' +diff --git a/feeds/luci/contrib/package/community-profiles/files/etc/config/profile_hannover b/feeds/luci/contrib/package/community-profiles/files/etc/config/profile_hannover +new file mode 100644 +index 0000000..008b6c7 +--- /dev/null ++++ b/feeds/luci/contrib/package/community-profiles/files/etc/config/profile_hannover +@@ -0,0 +1,12 @@ ++config 'community' 'profile' ++ option 'name' 'Freifunk Hannover' ++ option 'homepage' 'http://hannover.freifunk.net' ++ option 'ssid' 'hannover.freifunk.net' ++ option 'mesh_network' '10.2.0.0/16' ++ option 'splash_network' '10.104.0.0/16' ++ option 'splash_prefix' '27' ++ option 'latitude' '52.38427' ++ option 'longitude' '9.74359' ++ ++config 'defaults' 'wifi_iface' ++ option 'bssid' 'CA:FF:EE:CA:FF:EE' +diff --git a/feeds/luci/contrib/package/community-profiles/files/etc/config/profile_heppenheim b/feeds/luci/contrib/package/community-profiles/files/etc/config/profile_heppenheim +new file mode 100644 +index 0000000..a830494 +--- /dev/null ++++ b/feeds/luci/contrib/package/community-profiles/files/etc/config/profile_heppenheim +@@ -0,0 +1,9 @@ ++config 'community' 'profile' ++ option 'name' 'Freifunk Heppenheim' ++ option 'homepage' 'http://heppenheim.freifunk.net' ++ option 'ssid' 'heppenheim.freifunk.net' ++ option 'mesh_network' '10.48.0.0/16' ++ option 'splash_network' '10.104.0.0/16' ++ option 'splash_prefix' '27' ++ option 'latitude' '51.151786' ++ option 'longitude' '10.415039' +diff --git a/feeds/luci/contrib/package/community-profiles/files/etc/config/profile_hooge b/feeds/luci/contrib/package/community-profiles/files/etc/config/profile_hooge +new file mode 100644 +index 0000000..62f6fa9 +--- /dev/null ++++ b/feeds/luci/contrib/package/community-profiles/files/etc/config/profile_hooge +@@ -0,0 +1,22 @@ ++config 'community' 'profile' ++ option 'name' 'Freifunk Hooge' ++ option 'homepage' 'http://hooge.freifunk.net' ++ option 'ssid' 'hooge.freifunk.net' ++ option 'mesh_network' '10.11.128.0/24' ++ option 'splash_network' '10.104.0.0/16' ++ option 'latitude' '54.572161' ++ option 'longitude' '8.559551' ++ option 'suffix' 'hooge' ++ option 'splash_prefix' '27' ++ option 'vap' '1' ++ option 'extrapackages' '' ++ list 'owm_api' 'http://api.openwifimap.net' ++ list 'owm_api' 'http://owmapi.pberg.freifunk.net' ++ option 'mapserver' 'http://openwifimap.net/' ++ ++config 'defaults' 'interface' ++ option 'netmask' '255.255.255.0' ++ ++config 'defaults' 'luci_splash' ++ option 'limit_up' '20' ++ option 'limit_down' '50' +diff --git a/feeds/luci/contrib/package/community-profiles/files/etc/config/profile_kiberpipa b/feeds/luci/contrib/package/community-profiles/files/etc/config/profile_kiberpipa +new file mode 100644 +index 0000000..c2a96e4 +--- /dev/null ++++ b/feeds/luci/contrib/package/community-profiles/files/etc/config/profile_kiberpipa +@@ -0,0 +1,15 @@ ++config 'community' 'profile' ++ option 'name' 'Kiberpipa.net' ++ option 'homepage' 'http://www.kiberpipa.net' ++ option 'ssid' 'open.kiberpipa.net' ++ option 'mesh_network' '10.14.0.0/16' ++ option 'splash_network' '10.14.128.0/17' ++ option 'splash_prefix' '27' ++ option 'latitude' '46.05063' ++ option 'longitude' '14.50402' ++ ++config 'defaults' 'wifi_device' ++ option 'channel' '8' ++ ++config 'defaults' 'interface' ++ option 'dns' '10.14.0.1 208.67.222.220 208.67.220.222' +diff --git a/feeds/luci/contrib/package/community-profiles/files/etc/config/profile_kyritz b/feeds/luci/contrib/package/community-profiles/files/etc/config/profile_kyritz +new file mode 100644 +index 0000000..f97e79f +--- /dev/null ++++ b/feeds/luci/contrib/package/community-profiles/files/etc/config/profile_kyritz +@@ -0,0 +1,57 @@ ++config 'community' 'profile' ++ option 'name' 'Freifunk Kyritz' ++ option 'homepage' 'http://kyritz.freifunk.net' ++ option 'ssid' 'mesh.freifunk.net' ++ option 'mesh_network' '104.59.0.0/16' ++ option 'latitude' '52.94' ++ option 'longitude' '12.4' ++ option 'suffix' 'olsr.kyritz.freifunk.net' ++ option 'vap' '1' ++ option 'adhoc_dhcp_when_vap' '0' ++ ++config 'defaults' 'interface' ++ option 'netmask' '255.255.255.255' ++ ++ ++config 'defaults' 'bssidscheme' ++ option '1' '02:CA:FF:EE:BA:BE' ++ option '40' '02:40:CA:FF:EE:EE' ++ ++config 'defaults' 'wifi_device' ++ option 'country' 'DE' ++ ++config 'defaults' 'wifi_iface' ++ option 'mcast_rate' '6000' ++ ++ ++config 'defaults' 'olsrd' ++ option 'LinkQualityAlgorithm' 'etx_ff' ++ ++ ++config widget 'customindex' ++ option enabled '1' ++ option width '50%' ++ option paddingright '5%' ++ option template 'html' ++ ++config widget 'rssffl' ++ option enabled '1' ++ option max '10' ++ option cache '3600' ++ option width '100%' ++ option title 'Freifunk Blog' ++ option template 'iframe' ++ option url 'http://freifunk.net' ++ ++config widget 'rssbundesweit' ++ option cache '3600' ++ option width '50%' ++ option title 'bundesweiter Freifunk Blog' ++ option template 'rssfeed' ++ option enabled '1' ++ option max '10' ++ option url 'http://blog.freifunk.net/rss.xml' ++ ++config widget 'clear1' ++ option template 'clear' ++ option enabled '1' +diff --git a/feeds/luci/contrib/package/community-profiles/files/etc/config/profile_l59 b/feeds/luci/contrib/package/community-profiles/files/etc/config/profile_l59 +new file mode 100644 +index 0000000..5e6f472 +--- /dev/null ++++ b/feeds/luci/contrib/package/community-profiles/files/etc/config/profile_l59 +@@ -0,0 +1,25 @@ ++config 'community' 'profile' ++ option 'name' 'Freifunk L59' ++ option 'homepage' 'http://freifunk.net' ++ option 'ssid' 'freifunk.net' ++ option 'mesh_network' '10.59.0.0/16' ++ option 'splash_network' '6.59.0.0/16' ++ option 'splash_prefix' '27' ++ option 'latitude' '52.26337' ++ option 'longitude' '10.52103' ++ option 'vap' '1' ++ option 'adhoc_dhcp_when_vap' '0' ++ ++config 'defaults' 'interface' ++ option 'netmask' '255.255.255.255' ++ ++ ++config 'defaults' 'bssidscheme' ++ option '1' '02:CA:FF:EE:BA:BE' ++ option '40' '02:40:CA:FF:EE:EE' ++ ++config 'defaults' 'wifi_device' ++ option 'country' 'DE' ++ ++config 'defaults' 'wifi_iface' ++ option 'mcast_rate' '6000' +diff --git a/feeds/luci/contrib/package/community-profiles/files/etc/config/profile_leipzig b/feeds/luci/contrib/package/community-profiles/files/etc/config/profile_leipzig +new file mode 100644 +index 0000000..671f3e8 +--- /dev/null ++++ b/feeds/luci/contrib/package/community-profiles/files/etc/config/profile_leipzig +@@ -0,0 +1,55 @@ ++config 'community' 'profile' ++ option 'name' 'Freifunk Leipzig' ++ option 'homepage' 'http://leipzig.freifunk.net' ++ option 'ssid' 'leipzig.freifunk.net' ++ option 'mesh_network' '10.61.0.0/16' ++ option 'latitude' '51.33348' ++ option 'longitude' '12.40297' ++ option 'suffix' 'olsr.leipzig.freifunk.net' ++ option 'vap' '1' ++ option 'adhoc_dhcp_when_vap' '0' ++ ++config 'defaults' 'interface' ++ option 'netmask' '255.255.255.255' ++ ++config 'defaults' 'bssidscheme' ++ option '1' '02:CA:FF:EE:BA:BE' ++ option '40' '02:40:CA:FF:EE:EE' ++ ++config 'defaults' 'wifi_device' ++ option 'country' 'DE' ++ ++config 'defaults' 'wifi_iface' ++ option 'mcast_rate' '6000' ++ ++config 'defaults' 'olsrd' ++ option 'LinkQualityAlgorithm' 'etx_ff' ++ ++ ++config widget 'customindex' ++ option enabled '1' ++ option width '50%' ++ option paddingright '5%' ++ option template 'html' ++ ++config widget 'rssffl' ++ option enabled '1' ++ option max '10' ++ option cache '3600' ++ option width '100%' ++ option title 'Freifunk Leipzig Blog' ++ option template 'iframe' ++ option url 'http://leipzig.freifunk.net' ++ ++config widget 'rssbundesweit' ++ option cache '3600' ++ option width '50%' ++ option title 'bundesweiter Freifunk Blog' ++ option template 'rssfeed' ++ option enabled '1' ++ option max '10' ++ option url 'http://blog.freifunk.net/rss.xml' ++ ++config widget 'clear1' ++ option template 'clear' ++ option enabled '1' +diff --git a/feeds/luci/contrib/package/community-profiles/files/etc/config/profile_marburg b/feeds/luci/contrib/package/community-profiles/files/etc/config/profile_marburg +new file mode 100644 +index 0000000..18cff80 +--- /dev/null ++++ b/feeds/luci/contrib/package/community-profiles/files/etc/config/profile_marburg +@@ -0,0 +1,12 @@ ++config 'community' 'profile' ++ option 'name' 'Freifunk Marburg' ++ option 'homepage' ' http://marburg.freifunk.de' ++ option 'ssid' 'marburg.freifunk.net' ++ option 'mesh_network' '10.128.0.0/16' ++ option 'splash_network' '10.104.0.0/16' ++ option 'splash_prefix' '29' ++ option 'latitude' '49.63939' ++ option 'longitude' '8.633718' ++ ++config 'defaults' 'interface' ++ option 'dns' '8.8.8.8 212.204.49.83' +diff --git a/feeds/luci/contrib/package/community-profiles/files/etc/config/profile_oldenburg b/feeds/luci/contrib/package/community-profiles/files/etc/config/profile_oldenburg +new file mode 100644 +index 0000000..e967fdb +--- /dev/null ++++ b/feeds/luci/contrib/package/community-profiles/files/etc/config/profile_oldenburg +@@ -0,0 +1,15 @@ ++config 'community' 'profile' ++ option 'name' 'Freifunk Oldenburg' ++ option 'homepage' 'http://oldenburg.freifunk.net' ++ option 'ssid' 'oldenburg.freifunk.net' ++ option 'mesh_network' '10.18.0.0/16' ++ option 'splash_network' '10.104.0.0/16' ++ option 'splash_prefix' '27' ++ option 'latitude' '53.14083' ++ option 'longitude' '8.21314' ++ ++config 'defaults' 'wifi_device' ++ option 'channel' '6' ++ ++config 'defaults' 'wifi_iface' ++ option 'bssid' '02:CA:FF:EE:BA:BE' +diff --git a/feeds/luci/contrib/package/community-profiles/files/etc/config/profile_openwireless_bern b/feeds/luci/contrib/package/community-profiles/files/etc/config/profile_openwireless_bern +new file mode 100644 +index 0000000..810ad8f +--- /dev/null ++++ b/feeds/luci/contrib/package/community-profiles/files/etc/config/profile_openwireless_bern +@@ -0,0 +1,18 @@ ++config 'community' 'profile' ++ option 'name' 'Openwireless Bern' ++ option 'homepage' 'http://bern.openwireless.ch/' ++ option 'ssid' 'www.openwireless.ch' ++ option 'mesh_network' '10.247.0.0/16' ++ option 'splash_network' '10.104.0.0/16' ++ option 'splash_prefix' '27' ++ option 'latitude' '50.814788' ++ option 'longitude' '8.769239' ++ ++config 'defaults' 'interface' ++ option 'dns' '208.67.222.222 208.67.220.220' ++ ++config 'defaults' 'wifi_device' ++ option 'channel' '10' ++ option 'country' '756' ++ ++ +diff --git a/feeds/luci/contrib/package/community-profiles/files/etc/config/profile_pberg b/feeds/luci/contrib/package/community-profiles/files/etc/config/profile_pberg +new file mode 100644 +index 0000000..1122eaa +--- /dev/null ++++ b/feeds/luci/contrib/package/community-profiles/files/etc/config/profile_pberg +@@ -0,0 +1,38 @@ ++config 'community' 'profile' ++ option 'name' 'Freifunk Berlin Prenzlauer Berg' ++ option 'homepage' 'http://pberg.freifunk.net' ++ option 'ssid' 'olsr.freifunk.net' ++ option 'mesh_network' '104.0.0.0/8' ++ option 'splash_network' '10.104.0.0/16' ++ option 'splash_prefix' '27' ++ option 'latitude' '52.5427' ++ option 'longitude' '13.4172' ++ list 'owm_api' 'http://api.openwifimap.net' ++ list 'owm_api' 'http://owmapi.pberg.freifunk.net' ++ option 'mapserver' 'http://map.pberg.freifunk.net/' ++ ++config 'defaults' 'wifi_device' ++ option 'channel' '10' ++ ++config 'defaults' 'interface' ++ option 'netmask' '255.0.0.0' ++ ++config 'defaults' 'olsr_interface' ++ option 'Ip4Broadcast' '255.255.255.255' ++ option 'HelloInterval' '3.0' ++ option 'HelloValidityTime' '125.0' ++ option 'TcInterval' '2.0' ++ option 'TcValidityTime' '500.0' ++ option 'MidInterval' '25.0' ++ option 'MidValidityTime' '500.0' ++ option 'HnaInterval' '10.0' ++ option 'HnaValidityTime' '125.0' ++ ++config 'defaults' 'olsrd' ++ option 'AllowNoInt' 'yes' ++ option 'FIBMetric' 'flat' ++ option 'Pollrate' '0.025' ++ option 'TcRedundancy' '2' ++ option 'NatThreshold' '0.75' ++ option 'LinkQualityAlgorithm' 'etx_ff' ++ +diff --git a/feeds/luci/contrib/package/community-profiles/files/etc/config/profile_piraten_dresden b/feeds/luci/contrib/package/community-profiles/files/etc/config/profile_piraten_dresden +new file mode 100644 +index 0000000..2af0e31 +--- /dev/null ++++ b/feeds/luci/contrib/package/community-profiles/files/etc/config/profile_piraten_dresden +@@ -0,0 +1,12 @@ ++config 'community' 'profile' ++ option 'name' 'Piratenfreifunk Dresden' ++ option 'homepage' 'http://www.piraten-sachsen.de/' ++ option 'ssid' 'dresden.freifunk.net' ++ option 'mesh_network' '10.12.0.0/16' ++ option 'splash_network' '10.104.0.0/16' ++ option 'splash_prefix' '27' ++ option 'latitude' '51.05081' ++ option 'longitude' '13.73420' ++ ++config 'defaults' 'wifi_device' ++ option 'channel' '1' +diff --git a/feeds/luci/contrib/package/community-profiles/files/etc/config/profile_potsdam b/feeds/luci/contrib/package/community-profiles/files/etc/config/profile_potsdam +new file mode 100644 +index 0000000..c15624a +--- /dev/null ++++ b/feeds/luci/contrib/package/community-profiles/files/etc/config/profile_potsdam +@@ -0,0 +1,19 @@ ++config 'community' 'profile' ++ option 'name' 'Freifunk Potsdam' ++ option 'homepage' 'http://potsdam.freifunk.net' ++ option 'ssid' 'www.freifunk-potsdam.de' ++ option 'mesh_network' '10.22.0.0/16' ++ option 'splash_network' '192.168.22.0/24' ++ option 'splash_prefix' '24' ++ option 'latitude' '52.39349' ++ option 'longitude' '13.06489' ++ ++config 'defaults' 'wifi_device' ++ option 'channel' '5' ++ ++config 'defaults' 'bssidscheme' ++ option '5' '02:CA:FF:EE:BA:BE' ++ ++config 'defaults' 'interface' ++ option 'dns' '85.214.20.141 213.73.91.35 194.150.168.168' ++ +diff --git a/feeds/luci/contrib/package/community-profiles/files/etc/config/profile_reihen b/feeds/luci/contrib/package/community-profiles/files/etc/config/profile_reihen +new file mode 100644 +index 0000000..a05d6a2 +--- /dev/null ++++ b/feeds/luci/contrib/package/community-profiles/files/etc/config/profile_reihen +@@ -0,0 +1,25 @@ ++config 'community' 'profile' ++ option 'name' 'Freifunk Reihen' ++ option 'homepage' 'http://freifunk.reihen.de' ++ option 'ssid' 'freifunk.reihen.de' ++ option 'mesh_network' '172.23.0.0/16' ++ option 'splash_network' '172.23.26.0/29' ++ option 'latitude' '49.21' ++ option 'longitude' '8.91' ++ option 'splash_prefix' '29' ++ ++config 'defaults' 'interface' ++ option 'netmask' '255.255.0.0' ++ option 'dns' '172.23.25.204 172.23.31.237 141.1.1.1' ++ ++config 'defaults' 'wifi_device' ++ option 'channel' '13' ++ option 'bssid' '02:07:04:08:08:09' ++ ++config 'defaults' 'bssidscheme' ++ option '13' '02:07:04:08:08:09' ++ option '36' '02:36:CA:FF:EE:EE' ++ ++config 'defaults' 'ssidscheme' ++ option '13' 'ch13.freifunk.net' ++ option '36' 'ch36.freifunk.net' +diff --git a/feeds/luci/contrib/package/community-profiles/files/etc/config/profile_rosbach b/feeds/luci/contrib/package/community-profiles/files/etc/config/profile_rosbach +new file mode 100644 +index 0000000..4444f70 +--- /dev/null ++++ b/feeds/luci/contrib/package/community-profiles/files/etc/config/profile_rosbach +@@ -0,0 +1,15 @@ ++config 'community' 'profile' ++ option 'name' 'Freifunk Rosbach' ++ option 'homepage' 'freifunk-rosbach.de' ++ option 'ssid' 'rosbach.freifunk.net' ++ option 'mesh_network' '10.212.0.0/16' ++ option 'splash_network' '10.104.0.0/16' ++ option 'splash_prefix' '27' ++ option 'latitude' '50.18' ++ option 'longitude' '8.42' ++ ++config 'defaults' 'wifi_device' ++ option 'channel' '13' ++ ++config 'defaults' 'wifi_iface' ++ option 'bssid' 'D2:CA:FF:EE:BA:BE' +diff --git a/feeds/luci/contrib/package/community-profiles/files/etc/config/profile_schwarzach b/feeds/luci/contrib/package/community-profiles/files/etc/config/profile_schwarzach +new file mode 100644 +index 0000000..c973ca0 +--- /dev/null ++++ b/feeds/luci/contrib/package/community-profiles/files/etc/config/profile_schwarzach +@@ -0,0 +1,12 @@ ++config 'community' 'profile' ++ option 'name' 'Freifunk Schwarzach' ++ option 'homepage' 'http://schwarzach.freifunk.net' ++ option 'ssid' 'schwarzach.freifunk.net' ++ option 'mesh_network' '10.81.0.0/20' ++ option 'splash_network' '10.104.0.0/16' ++ option 'latitude' '49.373' ++ option 'longitude' '8.983' ++ option 'splash_prefix' '27' ++ ++config 'defaults' 'interface' ++ option 'netmask' '255.255.240.0' +diff --git a/feeds/luci/contrib/package/community-profiles/files/etc/config/profile_seefeld b/feeds/luci/contrib/package/community-profiles/files/etc/config/profile_seefeld +new file mode 100644 +index 0000000..5d03f7d +--- /dev/null ++++ b/feeds/luci/contrib/package/community-profiles/files/etc/config/profile_seefeld +@@ -0,0 +1,13 @@ ++config 'community' 'profile' ++ option 'name' 'Freifunk Seefeld' ++ option 'homepage' 'http://wiki.freifunk.net/Seefeld.freifunk.net' ++ option 'ssid' 'seefeld.freifunk.net' ++ option 'mesh_network' '10.111.0.0/16' ++ option 'splash_network' '10.104.0.0/16' ++ option 'splash_prefix' '27' ++ option 'latitude' '48.03485' ++ option 'longitude' '11.21279' ++ ++config 'defaults' 'wifi_device' ++ option 'channel' '1' ++ option 'bssid' '02:CA:FF:EE:BA:BB' +diff --git a/feeds/luci/contrib/package/community-profiles/files/etc/config/profile_stuttgart b/feeds/luci/contrib/package/community-profiles/files/etc/config/profile_stuttgart +new file mode 100644 +index 0000000..28d60d8 +--- /dev/null ++++ b/feeds/luci/contrib/package/community-profiles/files/etc/config/profile_stuttgart +@@ -0,0 +1,13 @@ ++config 'community' 'profile' ++ option 'name' 'Freifunk Stuttgart' ++ option 'homepage' 'http://freifunk-stuttgart.de' ++ option 'ssid' 'Freifunk Stuttgart' ++ option 'mesh_network' '172.21.0.0/16' ++ option 'splash_network' '10.104.0.0/16' ++ option 'latitude' '48' ++ option 'longitude' '9' ++ option 'splash_prefix' '27' ++ ++config 'defaults' 'wifi_device' ++ option 'channel' '5' ++ option 'bssid' '52:CA:FF:EE:BA:BE' +diff --git a/feeds/luci/contrib/package/community-profiles/files/etc/config/profile_vogtland b/feeds/luci/contrib/package/community-profiles/files/etc/config/profile_vogtland +new file mode 100644 +index 0000000..8baeec6 +--- /dev/null ++++ b/feeds/luci/contrib/package/community-profiles/files/etc/config/profile_vogtland +@@ -0,0 +1,23 @@ ++config 'community' 'profile' ++ option 'name' 'Freifunk Vogtland' ++ option 'homepage' 'http://wiki.freifunk.net/Freifunk_Vogtland' ++ option 'ssid' 'vogtland.freifunk.net' ++ option 'mesh_network' '10.204.0.0/16' ++ option 'splash_network' '6.204.0.0/16' ++ option 'splash_prefix' '27' ++ option 'latitude' '53.11' ++ option 'longitude' '12.61' ++ ++config 'defaults' 'interface' ++ option 'netmask' '255.255.255.255' ++ ++ ++config 'defaults' 'bssidscheme' ++ option '1' '02:CA:FF:EE:BA:BE' ++ option '40' '02:40:CA:FF:EE:EE' ++ ++config 'defaults' 'wifi_device' ++ option 'country' 'DE' ++ ++config 'defaults' 'wifi_iface' ++ option 'mcast_rate' '6000' +diff --git a/feeds/luci/contrib/package/community-profiles/files/etc/config/profile_weil b/feeds/luci/contrib/package/community-profiles/files/etc/config/profile_weil +new file mode 100644 +index 0000000..ddba1f3 +--- /dev/null ++++ b/feeds/luci/contrib/package/community-profiles/files/etc/config/profile_weil +@@ -0,0 +1,23 @@ ++config 'community' 'profile' ++ option 'name' 'Freifunk Weil am Rhein' ++ option 'homepage' 'http://weil-am-rhein.freifunk.net' ++ option 'ssid' 'mesh.freifunk.net' ++ option 'mesh_network' '10.119.0.0/18' ++ option 'latitude' '47.6056' ++ option 'longitude' '7.6083' ++ option 'suffix' 'ffwr' ++ option 'vap' '1' ++ option 'adhoc_dhcp_when_vap' '0' ++ list 'owm_api' 'http://api.openwifimap.net' ++ list 'owm_api' 'http://owmapi.pberg.freifunk.net' ++ option 'mapserver' 'http://openwifimap.net/' ++ ++config 'defaults' 'interface' ++ option 'netmask' '255.255.192.0' ++ ++config 'defaults' 'wifi_device' ++ option 'country' 'DE' ++ option 'channel' '10' ++ ++config 'defaults' 'luci_splash' ++ option 'leasetime' '24' +diff --git a/feeds/luci/contrib/package/community-profiles/files/etc/config/profile_weimar b/feeds/luci/contrib/package/community-profiles/files/etc/config/profile_weimar +new file mode 100644 +index 0000000..65938e7 +--- /dev/null ++++ b/feeds/luci/contrib/package/community-profiles/files/etc/config/profile_weimar +@@ -0,0 +1,10 @@ ++config 'community' 'profile' ++ option 'name' 'Weimarnetz e.V.' ++ option 'homepage' 'http://www.weimarnetz.de' ++ option 'ssid' 'weimarnetz' ++ option 'mesh_network' '10.63.0.0/16' ++ option 'latitude' '50.989530' ++ option 'longitude' '11.338675' ++ ++config 'defaults' 'interface' ++ option 'dns' '217.11.48.200 217.11.49.200 8.8.8.8' +diff --git a/feeds/luci/contrib/package/community-profiles/files/etc/config/profile_weinstadt b/feeds/luci/contrib/package/community-profiles/files/etc/config/profile_weinstadt +new file mode 100644 +index 0000000..49a42fa +--- /dev/null ++++ b/feeds/luci/contrib/package/community-profiles/files/etc/config/profile_weinstadt +@@ -0,0 +1,19 @@ ++config 'community' 'profile' ++ option 'name' 'Freifunk Weinstadt' ++ option 'homepage' 'http://freifunk-weinstadt.de' ++ option 'ssid' 'freifunk-weinstadt' ++ option 'mesh_network' '172.21.0.0/16' ++ option 'splash_network' '172.21.85.0/30' ++ option 'latitude' '48.81' ++ option 'longitude' '9.39' ++ option 'splash_prefix' '30' ++ ++config 'defaults' 'wifi_device' ++ option 'channel' '13' ++ option 'bssid' '02:07:01:03:08:04' ++ ++config 'defaults' 'bssidscheme' ++ option '13' '02:07:01:03:08:04' ++ ++config 'defaults' 'interface' ++ option 'dns' '172.21.77.4 172.21.84.235 141.1.1.1' +diff --git a/feeds/luci/contrib/package/community-profiles/files/etc/config/profile_wlanljubljana b/feeds/luci/contrib/package/community-profiles/files/etc/config/profile_wlanljubljana +new file mode 100644 +index 0000000..eeefbd2 +--- /dev/null ++++ b/feeds/luci/contrib/package/community-profiles/files/etc/config/profile_wlanljubljana +@@ -0,0 +1,15 @@ ++config 'community' 'profile' ++ option 'name' 'wlan ljubljana' ++ option 'homepage' 'http://wlan-lj.net' ++ option 'ssid' 'open.wlan-lj.net' ++ option 'mesh_network' '10.254.0.0/16' ++ option 'splash_network' '10.254.120.0/21' ++ option 'splash_prefix' '27' ++ option 'latitude' '46.05063' ++ option 'longitude' '14.50402' ++ ++config 'defaults' 'wifi_device' ++ option 'channel' '8' ++ ++config 'defaults' 'interface' ++ option 'dns' '10.254.0.1 10.254.0.2' +diff --git a/feeds/luci/contrib/package/freifunk-common/Makefile b/feeds/luci/contrib/package/freifunk-common/Makefile +new file mode 100644 +index 0000000..c15f02d +--- /dev/null ++++ b/feeds/luci/contrib/package/freifunk-common/Makefile +@@ -0,0 +1,42 @@ ++# Copyright (C) 2011 Manuel Munz ++# This is free software, licensed under the Apache 2.0 license. ++ ++include $(TOPDIR)/rules.mk ++ ++PKG_NAME:=freifunk-common ++PKG_RELEASE:=1 ++ ++PKG_BUILD_DIR := $(BUILD_DIR)/$(PKG_NAME) ++ ++include $(INCLUDE_DIR)/package.mk ++ ++define Package/freifunk-common ++ SECTION:=luci ++ CATEGORY:=LuCI ++ SUBMENU:=9. Freifunk ++ TITLE:=Freifunk common files ++endef ++ ++define Package/freifunk-common/description ++ Common files and scripts that are needed to run free wireless mesh networks. ++endef ++ ++define Package/luci-mod-freifunk/conffiles ++/etc/config/freifunk ++endef ++ ++define Build/Prepare ++ mkdir -p $(PKG_BUILD_DIR) ++endef ++ ++define Build/Configure ++endef ++ ++define Build/Compile ++endef ++ ++define Package/freifunk-common/install ++ $(CP) ./files/* $(1)/ ++endef ++ ++$(eval $(call BuildPackage,freifunk-common)) +diff --git a/feeds/luci/contrib/package/freifunk-common/files/etc/config/freifunk b/feeds/luci/contrib/package/freifunk-common/files/etc/config/freifunk +new file mode 100644 +index 0000000..9a46f05 +--- /dev/null ++++ b/feeds/luci/contrib/package/freifunk-common/files/etc/config/freifunk +@@ -0,0 +1,126 @@ ++package 'freifunk' ++ ++config 'public' 'contact' ++ option 'nickname' '' ++ option 'name' '' ++ option 'mail' '' ++ option 'phone' '' ++ option 'note' '' ++ ++config 'public' 'community' ++ option 'name' 'Freifunk' ++ option 'homepage' 'http://freifunk.net' ++ ++config 'fw_zone' 'zone_freifunk' ++ option 'name' 'freifunk' ++ option 'input' 'REJECT' ++ option 'forward' 'REJECT' ++ option 'output' 'ACCEPT' ++ ++config 'fw_rule' 'fficmp' ++ option 'src' 'freifunk' ++ option 'target' 'ACCEPT' ++ option 'proto' 'icmp' ++ ++config 'fw_rule' 'ffhttp' ++ option 'src' 'freifunk' ++ option 'target' 'ACCEPT' ++ option 'proto' 'tcp' ++ option 'dest_port' '80' ++ ++config 'fw_rule' 'ffhttps' ++ option 'src' 'freifunk' ++ option 'target' 'ACCEPT' ++ option 'proto' 'tcp' ++ option 'dest_port' '443' ++ ++config 'fw_rule' 'ffssh' ++ option 'src' 'freifunk' ++ option 'target' 'ACCEPT' ++ option 'proto' 'tcp' ++ option 'dest_port' '22' ++ ++config 'fw_rule' 'ffolsr' ++ option 'src' 'freifunk' ++ option 'target' 'ACCEPT' ++ option 'proto' 'udp' ++ option 'dest_port' '698' ++ ++config 'fw_rule' 'ffwprobe' ++ option 'src' 'freifunk' ++ option 'target' 'ACCEPT' ++ option 'proto' 'tcp' ++ option 'dest_port' '17990' ++ ++config 'fw_rule' 'ffdns' ++ option 'dest_port' '53' ++ option 'src' 'freifunk' ++ option 'target' 'ACCEPT' ++ option 'proto' 'udp' ++ ++config 'fw_rule' 'ffdhcp' ++ option 'src_port' '68' ++ option 'src' 'freifunk' ++ option 'target' 'ACCEPT' ++ option 'dest_port' '67' ++ option 'proto' 'udp' ++ option 'leasetime' '30m' ++ ++config 'fw_rule' 'ffsplash' ++ option 'dest_port' '8082' ++ option 'src' 'freifunk' ++ option 'target' 'ACCEPT' ++ option 'proto' 'tcp' ++ ++config 'fw_forwarding' 'lanfffwd' ++ option 'src' 'lan' ++ option 'dest' 'freifunk' ++ ++config 'fw_forwarding' 'ffwanfwd' ++ option 'src' 'freifunk' ++ option 'dest' 'wan' ++ ++config 'fw_forwarding' 'fffwd' ++ option 'src' 'freifunk' ++ option 'dest' 'freifunk' ++ ++config 'include' 'freifunk' ++ option 'path' '/etc/firewall.freifunk' ++ ++config 'defaults' 'system' ++ option 'zonename' 'Europe/Berlin' ++ option 'timezone' 'CET-1CEST,M3.5.0,M10.5.0/3' ++ ++config 'defaults' 'wifi_device' ++ option 'channel' '1' ++ option 'diversity' '1' ++ option 'disabled' '0' ++ option 'country' 'DE' ++ option 'distance' '1000' ++ ++config 'defaults' 'wifi_iface' ++ option 'mode' 'adhoc' ++ option 'encryption' 'none' ++ option 'bssid' '12:CA:FF:EE:BA:BE' ++ option 'mcast_rate' '6000' ++ ++config 'defaults' 'madwifi_wifi_iface' ++ option 'bgscan' '0' ++ option 'sw_merge' '1' ++ option 'probereq' '1' ++ option 'mcast_rate' '5500' ++ ++config 'defaults' 'interface' ++ option 'netmask' '255.255.0.0' ++ option 'dns' '8.8.8.8 212.204.49.83 141.1.1.1' ++ ++config 'defaults' 'alias' ++ option 'netmask' '255.255.255.0' ++ ++config 'defaults' 'dhcp' ++ option 'leasetime' '30m' ++ option 'start' '2' ++ option 'force' '1' ++ ++config 'defaults' 'olsr_interfacedefaults' ++ option 'Ip4Broadcast' '255.255.255.255' +diff --git a/feeds/luci/contrib/package/freifunk-common/files/etc/init.d/freifunk b/feeds/luci/contrib/package/freifunk-common/files/etc/init.d/freifunk +new file mode 100755 +index 0000000..dbe648a +--- /dev/null ++++ b/feeds/luci/contrib/package/freifunk-common/files/etc/init.d/freifunk +@@ -0,0 +1,25 @@ ++#!/bin/sh /etc/rc.common ++# Freifunk Init ++# $Id$ ++ ++START=99 ++ ++boot() { ++ test -f /etc/crontabs/root || touch /etc/crontabs/root ++ ++ grep -q 'killall -HUP dnsmasq' /etc/crontabs/root || { ++ echo "*/5 * * * * killall -HUP dnsmasq" >> /etc/crontabs/root ++ } ++ ++ grep -q '/usr/sbin/ff_olsr_watchdog' /etc/crontabs/root || { ++ echo "*/5 * * * * /usr/sbin/ff_olsr_watchdog" >> /etc/crontabs/root ++ } ++ ++ [ -d /etc/rc.local.d ] && { ++ for file in /etc/rc.local.d/*; do ++ test -f "$file" && . "$file" ++ done ++ } ++ ++ /etc/init.d/cron restart & ++} +diff --git a/feeds/luci/contrib/package/freifunk-common/files/etc/rc.local.d/01-config-migration b/feeds/luci/contrib/package/freifunk-common/files/etc/rc.local.d/01-config-migration +new file mode 100644 +index 0000000..11f1ad6 +--- /dev/null ++++ b/feeds/luci/contrib/package/freifunk-common/files/etc/rc.local.d/01-config-migration +@@ -0,0 +1,51 @@ ++# Fixup various configurations to remove quirks ++# from former versions. ++ ++_log() { ++ logger -t "Config Migration" "$1" ++} ++ ++_uci() { ++ uci ${2:+-c $2} get "$1" 2>/dev/null ++} ++ ++ ++# Splash redirector had a wrong virtual url match ++# which resulted in "No such handler" ++ ++[ "$(_uci lucid.splashredir.virtual)" == "/" ] && { ++ _log "Fix splash redirector configuration" ++ uci set lucid.splashredir.virtual='' ++ uci commit lucid ++ /etc/init.d/lucid restart ++} ++ ++ ++# Newer OLSR versions have the MinTCVtime hack active, ++# ensure proper timings or olsrd won't start ++ ++FIX=0 ++for i in 0 1 2 3 4; do ++ [ -z "$(_uci olsrd.@Interface[$i].TcInterval)" ] && \ ++ [ -z "$(_uci olsrd.@Interface[$i].TcValidityTime)" ] || { ++ uci delete olsrd.@Interface[$i].TcInterval ++ uci delete olsrd.@Interface[$i].TcValidityTime ++ FIX=1 ++ } ++done ++ ++[ "$FIX" == 1 ] && { ++ _log "Fix olsrd configuration for MinTCVTime hack" ++ uci commit olsrd ++ /etc/init.d/olsrd restart ++} ++ ++ ++# Ensure that the community definitions are in the ++# new format ++ ++[ -z "$(_uci freifunk.leipzig.mesh_network)" ] && \ ++[ -n "$(_uci freifunk.leipzig.mesh_network /rom/etc/config)" ] && { ++ _log "Converting freifunk configuration to new format" ++ cp /rom/etc/config/freifunk /etc/config/freifunk ++} +diff --git a/feeds/luci/contrib/package/freifunk-common/files/etc/uci-defaults/freifunk b/feeds/luci/contrib/package/freifunk-common/files/etc/uci-defaults/freifunk +new file mode 100644 +index 0000000..fe6586c +--- /dev/null ++++ b/feeds/luci/contrib/package/freifunk-common/files/etc/uci-defaults/freifunk +@@ -0,0 +1,2 @@ ++uci set uhttpd.main.rfc1918_filter=0 ++uci commit uhttpd +diff --git a/feeds/luci/contrib/package/freifunk-common/files/usr/bin/ffdzero b/feeds/luci/contrib/package/freifunk-common/files/usr/bin/ffdzero +new file mode 100755 +index 0000000..24e8c2e +--- /dev/null ++++ b/feeds/luci/contrib/package/freifunk-common/files/usr/bin/ffdzero +@@ -0,0 +1,10 @@ ++#!/bin/sh ++ ++test "$1" = "-h" && echo -e "Usage:\n\t$0 -h\n\t$0 [ { ip | hostname } ]" >&2 && exit 1 ++ ++host="${1:-leipzig.freifunk.net}" ++ ++wget -O /dev/null http://$host/cgi-bin-dev-zero.bin ++test "$?" = "1" && wget -O /dev/null http://$host/cgi-bin/dev-zero.bin ++test "$?" = "1" && wget -O /dev/null http://$host/cgi-bin/luci/freifunk/status/zeroes ++test "$?" = "1" && echo "$host: no zero download found..." && exit 1 +diff --git a/feeds/luci/contrib/package/freifunk-common/files/usr/bin/neigh.sh b/feeds/luci/contrib/package/freifunk-common/files/usr/bin/neigh.sh +new file mode 100755 +index 0000000..cf43424 +--- /dev/null ++++ b/feeds/luci/contrib/package/freifunk-common/files/usr/bin/neigh.sh +@@ -0,0 +1,41 @@ ++#!/bin/sh ++ ++. /usr/share/libubox/jshn.sh ++ ++VARS="localIP:Local remoteIP:Remote validityTime:vTime linkQuality:LQ neighborLinkQuality:NLQ linkCost:Cost" ++ ++for HOST in 127.0.0.1 ::1;do ++ json_init ++ json_load "$(echo /links|nc ${HOST} 9090)" ++ if json_is_a links array;then ++ json_select links ++ for v in ${VARS};do ++ eval _${v%:*}=0 ++ done ++ for j in 0 1;do ++ case ${j} in 1) ++ for v in ${VARS};do ++ eval printf \"%-\${_${v%:*}}s \" ${v#*:} ++ done ++ echo ++ ;;esac ++ i=1;while json_is_a ${i} object;do ++ json_select ${i} ++ json_get_vars $(for v in ${VARS};do echo ${v%:*};done) ++ case ${j} in 0) ++ for v in ${VARS};do ++ eval "test \${_${v%:*}} -lt \${#${v%:*}} && _${v%:*}=\${#${v%:*}}" ++ done ++ ;;*) ++ for v in ${VARS};do ++ eval printf \"%-\${_${v%:*}}s \" \$${v%:*} ++ done ++ echo ++ ;;esac ++ json_select .. ++ i=$(( i + 1 )) ++ done ++ done ++ fi ++ echo ++done +diff --git a/feeds/luci/contrib/package/freifunk-common/files/usr/bin/watch.sh b/feeds/luci/contrib/package/freifunk-common/files/usr/bin/watch.sh +new file mode 100755 +index 0000000..728526b +--- /dev/null ++++ b/feeds/luci/contrib/package/freifunk-common/files/usr/bin/watch.sh +@@ -0,0 +1,11 @@ ++#!/bin/sh ++command="$1" ++interval="$2"; [ -z "$interval" ] && interval=1 ++ ++if [ -z $command ]; then ++ echo 'Usage: watch.sh "command [options]" [interval], e.g. watch "ifconfig ath0" 2' ++ echo 'interval is optional and defaults to 1' ++ exit 1 ++fi ++ ++while true; do clear; $command; sleep $interval; done +diff --git a/feeds/luci/contrib/package/freifunk-common/files/usr/sbin/ff_olsr_watchdog b/feeds/luci/contrib/package/freifunk-common/files/usr/sbin/ff_olsr_watchdog +new file mode 100755 +index 0000000..069f4c3 +--- /dev/null ++++ b/feeds/luci/contrib/package/freifunk-common/files/usr/sbin/ff_olsr_watchdog +@@ -0,0 +1,29 @@ ++#!/usr/bin/lua ++ ++require "os" ++require "io" ++require "uci" ++local fs = require "nixio.fs" ++ ++if fs.access("/var/run/olsrd.pid") or fs.access("/var/run/olsrd4.pid") then ++ local stamp, intv ++ local x = uci.cursor() ++ ++ x:foreach("olsrd", "LoadPlugin", ++ function(s) ++ if s.library == "olsrd_watchdog.so.0.1" then ++ intv = tonumber(s.interval) ++ stamp = s.file ++ end ++ end) ++ ++ if intv and fs.access(stamp) then ++ local systime = os.time() ++ local wdgtime = tonumber(io.lines(stamp)()) ++ ++ if not wdgtime or ( systime - wdgtime ) > ( intv * 2 ) then ++ os.execute("logger -t 'OLSR watchdog' 'Process died - restarting!'") ++ os.execute("/etc/init.d/olsrd restart") ++ end ++ end ++end +diff --git a/feeds/luci/contrib/package/freifunk-firewall/Makefile b/feeds/luci/contrib/package/freifunk-firewall/Makefile +new file mode 100644 +index 0000000..b9d328c +--- /dev/null ++++ b/feeds/luci/contrib/package/freifunk-firewall/Makefile +@@ -0,0 +1,53 @@ ++# ++# Copyright (C) 2009 Jo-Philipp Wich ++# ++# This is free software, licensed under the Apache 2.0 license. ++# ++ ++include $(TOPDIR)/rules.mk ++ ++PKG_NAME:=freifunk-firewall ++PKG_RELEASE:=3 ++ ++PKG_BUILD_DIR := $(BUILD_DIR)/$(PKG_NAME) ++ ++include $(INCLUDE_DIR)/package.mk ++ ++define Package/freifunk-firewall ++ SECTION:=luci ++ CATEGORY:=LuCI ++ SUBMENU:=9. Freifunk ++ TITLE:=Freifunk Firewall Addon ++ DEPENDS:=+firewall ++endef ++ ++define Package/freifunk-firewall/description ++ Various firewall extensions for Freifunk. Includes NAT fixes and advanced settings. ++endef ++ ++define Build/Prepare ++ mkdir -p $(PKG_BUILD_DIR) ++endef ++ ++define Build/Configure ++endef ++ ++define Build/Compile ++endef ++ ++define Package/freifunk-firewall/postinst ++#!/bin/sh ++[ -n "$${IPKG_INSTROOT}" ] || { ++ if ! grep -q /etc/firewall.freifunk /etc/config/firewall; then ++ uci add firewall include >/dev/null ++ uci set firewall.@include[-1].path=/etc/firewall.freifunk ++ uci commit firewall ++ fi ++} ++endef ++ ++define Package/freifunk-firewall/install ++ $(CP) ./files/* $(1)/ ++endef ++ ++$(eval $(call BuildPackage,freifunk-firewall)) +diff --git a/feeds/luci/contrib/package/freifunk-firewall/files/etc/firewall.freifunk b/feeds/luci/contrib/package/freifunk-firewall/files/etc/firewall.freifunk +new file mode 100644 +index 0000000..d2805f6 +--- /dev/null ++++ b/feeds/luci/contrib/package/freifunk-firewall/files/etc/firewall.freifunk +@@ -0,0 +1,40 @@ ++#!/bin/sh ++# Freifunk Firewall addons ++ ++. /lib/functions.sh ++ ++# ++# Apply advanced settings ++# ++apply_advanced() { ++ local tcp_ecn ++ local tcp_window_scaling ++ local accept_redirects ++ local accept_source_route ++ ++ config_get_bool tcp_ecn $1 tcp_ecn 1 ++ config_get_bool tcp_window_scaling $1 tcp_window_scaling 1 ++ config_get_bool accept_redirects $1 accept_redirects 0 ++ config_get_bool accept_source_route $1 accept_source_route 0 ++ ++ logger -t firewall.freifunk "tcp_ecn is $tcp_ecn" ++ logger -t firewall.freifunk "tcp_window_scaling is $tcp_window_scaling" ++ logger -t firewall.freifunk "accept_redirects is $accept_redirects" ++ logger -t firewall.freifunk "accept_source_route is $accept_source_route" ++ ++ sysctl -w net.ipv4.tcp_ecn=$tcp_ecn >/dev/null ++ sysctl -w net.ipv4.tcp_window_scaling=$tcp_window_scaling >/dev/null ++ ++ for f in /proc/sys/net/ipv4/conf/*/accept_redirects; do ++ echo $accept_redirects > $f ++ done ++ ++ for f in /proc/sys/net/ipv4/conf/*/accept_source_route; do ++ echo $accept_source_route > $f ++ done ++} ++ ++config_foreach apply_advanced advanced ++ ++[ -x /etc/init.d/freifunk-p2pblock ] && /etc/init.d/freifunk-p2pblock enabled && \ ++ ( sleep 3; /etc/init.d/freifunk-p2pblock restart )& +diff --git a/feeds/luci/contrib/package/freifunk-firewall/files/etc/hotplug.d/firewall/23-restricted-wan b/feeds/luci/contrib/package/freifunk-firewall/files/etc/hotplug.d/firewall/23-restricted-wan +new file mode 100644 +index 0000000..e71c852 +--- /dev/null ++++ b/feeds/luci/contrib/package/freifunk-firewall/files/etc/hotplug.d/firewall/23-restricted-wan +@@ -0,0 +1,65 @@ ++#!/bin/sh ++ ++clear_restricted_gw() ++{ ++ local state="$1" ++ local iface ++ local ifname ++ local subnet ++ ++ config_get iface "$state" iface ++ ++ if [ "$iface" = "$INTERFACE" ]; then ++ config_get ifname "$state" ifname ++ config_get subnet "$state" subnet ++ ++ logger -t firewall.freifunk "removing local restriction to the network connected to $ifname ($iface)" ++ iptables -D forwarding_freifunk_rule -o $ifname -d $subnet -j REJECT --reject-with icmp-host-prohibited ++ uci_revert_state firewall "$state" ++ fi ++} ++ ++get_enabled() ++{ ++ local name ++ config_get name "$1" name ++ ++ if [ "$name" = "$ZONE" ]; then ++ config_get_bool local_restrict "$1" local_restrict ++ fi ++} ++ ++if [ "$ACTION" = add ]; then ++ local enabled ++ local subnet ++ ++ . /lib/functions/network.sh ++ ++ network_find_wan wan ++ ++ [ "$INTERFACE" = "$wan" ] || return 0 ++ ++ network_get_subnet subnet $INTERFACE ++ ++ if [ -n "$subnet" ]; then ++ config_load firewall ++ ++ local_restrict=0 ++ config_foreach get_enabled zone ++ ++ if [ "$local_restrict" = 1 ]; then ++ logger -t firewall.freifunk "restricting local access to the network connected to $INTERFACE ($DEVICE)" ++ iptables -I forwarding_freifunk_rule -o $DEVICE -d $subnet -j REJECT --reject-with icmp-host-prohibited ++ local state="restricted_gw_${INTERFACE}" ++ uci_set_state firewall "$state" "" restricted_gw_state ++ uci_set_state firewall "$state" iface "$INTERFACE" ++ uci_set_state firewall "$state" ifname "$DEVICE" ++ uci_set_state firewall "$state" subnet "$subnet" ++ fi ++ fi ++ ++elif [ "$ACTION" = remove ]; then ++ config_load firewall ++ config_foreach clear_restricted_gw restricted_gw_state ++fi ++ +diff --git a/feeds/luci/contrib/package/freifunk-gwcheck/Makefile b/feeds/luci/contrib/package/freifunk-gwcheck/Makefile +new file mode 100644 +index 0000000..6c2affe +--- /dev/null ++++ b/feeds/luci/contrib/package/freifunk-gwcheck/Makefile +@@ -0,0 +1,40 @@ ++# Copyright (C) 2011 Manuel Munz ++# This is free software, licensed under the Apache 2.0 license. ++ ++include $(TOPDIR)/rules.mk ++ ++PKG_NAME:=freifunk-gwcheck ++PKG_RELEASE:=4 ++ ++PKG_BUILD_DIR := $(BUILD_DIR)/$(PKG_NAME) ++ ++include $(INCLUDE_DIR)/package.mk ++ ++define Package/freifunk-gwcheck ++ SECTION:=luci ++ CATEGORY:=LuCI ++ SUBMENU:=9. Freifunk ++ TITLE:=Freifunk gateway check script ++ DEPENDS:=firewall +ip +iptables-mod-ipopt +olsrd-mod-dyn-gw-plain ++endef ++ ++define Package/freifunk-gwcheck/description ++ This script periodically checks if internet is available via your own gateway. If it detects that it is broken, then the defaultroute is removed from the main table and temporarilly placed in table gw-check until your internet works again. Config file is /etc/config/freifunk-gwcheck. ++endef ++ ++define Build/Prepare ++ mkdir -p $(PKG_BUILD_DIR) ++endef ++ ++define Build/Configure ++endef ++ ++define Build/Compile ++endef ++ ++define Package/freifunk-gwcheck/install ++ $(CP) ./files/* $(1)/ ++ $(CP) ./root/* $(1)/ ++endef ++ ++$(eval $(call BuildPackage,freifunk-gwcheck)) +diff --git a/feeds/luci/contrib/package/freifunk-gwcheck/files/etc/config/freifunk-gwcheck b/feeds/luci/contrib/package/freifunk-gwcheck/files/etc/config/freifunk-gwcheck +new file mode 100644 +index 0000000..b174dd6 +--- /dev/null ++++ b/feeds/luci/contrib/package/freifunk-gwcheck/files/etc/config/freifunk-gwcheck +@@ -0,0 +1,5 @@ ++config 'gwcheck' 'hosts' ++ list 'host' 'augsburg.freifunk.net' ++ list 'host' 'vpn4.leipzig.freifunk.net' ++ list 'host' 'luci.subsignal.org' ++ list 'host' 'bbb-vpn.berlin.freifunk.net' +diff --git a/feeds/luci/contrib/package/freifunk-gwcheck/files/usr/sbin/ff_olsr_test_gw.sh b/feeds/luci/contrib/package/freifunk-gwcheck/files/usr/sbin/ff_olsr_test_gw.sh +new file mode 100755 +index 0000000..b86b668 +--- /dev/null ++++ b/feeds/luci/contrib/package/freifunk-gwcheck/files/usr/sbin/ff_olsr_test_gw.sh +@@ -0,0 +1,132 @@ ++#!/bin/sh ++# Copyright 2013 Manuel Munz ++# Licensed under the GNU General Public License (GPL) v3 ++# This script monitors the local internet gateway ++ ++. /lib/functions.sh ++. /lib/functions/network.sh ++. /usr/share/libubox/jshn.sh ++ ++# exit if dyngw_plain is not enabled or RtTable is not (254 or unset) ++config_load olsrd ++ ++check_dyngw_plain() ++{ ++ local cfg="$1" ++ config_get library "$cfg" library ++ if [ "${library#olsrd_dyn_gw_plain}" != "$library" ]; then ++ config_get ignore "$cfg" ignore ++ config_get RtTable "$cfg" RtTable ++ if [ "$ignore" != "1" ] && [ -z "$RtTable" -o "$RtTable" = "254" ]; then ++ exit=0 ++ fi ++ fi ++} ++ ++exit=1 ++config_foreach check_dyngw_plain LoadPlugin ++[ "$exit" = "1" ] && exit 1 ++ ++#Exit if this script is already running ++pid="$(pidof ff_olsr_test_gw.sh)" ++if [ ${#pid} -gt 5 ]; then ++ logger -p debug -t gwcheck "Gateway check script is already running, exit now" ++ exit 1 ++fi ++ ++# exit if there is no defaultroute with metric=0 in main or gw-check table. ++defroutemain="$(ip route show |grep default |grep -v metric)" ++defroutegwcheck="$(ip route show table gw-check |grep default |grep -v metric)" ++if [ -z "$defroutegwcheck" -a -z "$defroutemain" ]; then ++ exit 1 ++fi ++ ++# get and shuffle list of testservers ++testserver="$(uci -q get freifunk-gwcheck.hosts.host)" ++[ -z "$testserver" ] && echo "No testservers found, exit" && exit ++ ++testserver="$(for t in $testserver; do echo $t; done | awk 'BEGIN { ++ srand(); ++} ++{ ++ l[NR] = $0; ++} ++ ++END { ++ for (i = 1; i <= NR; i++) { ++ n = int(rand() * (NR - i + 1)) + i; ++ print l[n]; ++ l[n] = l[i]; ++ } ++}')" ++ ++check_internet() { ++ for t in $testserver; do ++ local test ++ test=$(wget -q http://$t/conntest.html -O -| grep "Internet_works") ++ if [ "$test" == "Internet_works" ]; then ++ echo 0 ++ break ++ else ++ logger -p debug -t gw-check "Could not fetch http://$t/conntest.html" ++ fi ++ done ++} ++ ++resolve() { ++ echo "$(nslookup $1 2>/dev/null |grep 'Address' |grep -v '127.0.0.1' |awk '{ print $3 }')" ++} ++ ++get_dnsservers() { ++ # this gets all dns servers for the interface which has the default route ++ ++ dns="" ++ if [ ! -x /bin/ubus ]; then ++ # ubus not present (versions before Attitude): fallback to get these from /var/state/network. ++ # We always assume that wan is the default route interface here ++ dns="$(grep network.wan.resolv_dns /var/state/network | cut -d "=" -f 2)" ++ else ++ network_find_wan wan ++ network_get_dnsserver dns $wan ++ fi ++} ++ ++iw=$(check_internet) ++ ++if [ "$iw" == 0 ]; then ++ # Internet available again, restore default route and remove ip rules ++ if [ -n "$defroutegwcheck" ]; then ++ ip route add $defroutegwcheck ++ ip route del $defroutegwcheck table gw-check ++ for host in $testserver; do ++ ips="$(resolve $host)" ++ for ip in $ips; do ++ [ -n "$(ip rule show | grep "to $ip lookup gw-check")" ] && ip rule del to $ip table gw-check ++ done ++ done ++ get_dnsservers ++ for d in $dns; do ++ [ -n "$(ip rule show | grep "to $d lookup gw-check")" ] && ip rule del to $d table gw-check ++ done ++ logger -p err -t gw-check "Internet is available again, default route restored ( $defroutegwcheck)" ++ fi ++ ++else ++ # Check failed. Move default route to table gw-check and setup ip rules. ++ if [ -z "$(ip rule show | grep gw-check)" -a -n "$defroutemain" ]; then ++ ip route add $defroutemain table gw-check ++ ip route del $defroutemain ++ logger -p err -t gw-check "Internet is not available, default route deactivated ( $defroutemain)" ++ fi ++ for host in $testserver; do ++ ips="$(resolve $host)" ++ for ip in $ips; do ++ [ -z "$(ip rule show | grep "to $ip lookup gw-check")" ] && ip rule add to $ip table gw-check ++ done ++ done ++ get_dnsservers ++ for d in $dns; do ++ [ -z "$(ip rule show | grep "to $d lookup gw-check")" ] && ip rule add to $d table gw-check ++ done ++ logger -p err -t gw-check "Check your internet connection!" ++fi +diff --git a/feeds/luci/contrib/package/freifunk-gwcheck/root/etc/uci-defaults/freifunk-gwcheck b/feeds/luci/contrib/package/freifunk-gwcheck/root/etc/uci-defaults/freifunk-gwcheck +new file mode 100644 +index 0000000..33b1b99 +--- /dev/null ++++ b/feeds/luci/contrib/package/freifunk-gwcheck/root/etc/uci-defaults/freifunk-gwcheck +@@ -0,0 +1,7 @@ ++#!/bin/sh ++tables="/etc/iproute2/rt_tables" ++test -d /etc/iproute2/ || mkdir -p /etc/iproute2/ ++grep -q "gw-check" $tables || echo "200 gw-check" >> $tables ++test -f /etc/crontabs/root || touch /etc/crontabs/root ++grep -q "ff_olsr_test_gw.sh" /etc/crontabs/root || echo "* * * * * /usr/sbin/ff_olsr_test_gw.sh" >> /etc/crontabs/root ++/etc/init.d/cron restart +diff --git a/feeds/luci/contrib/package/freifunk-mapupdate/Makefile b/feeds/luci/contrib/package/freifunk-mapupdate/Makefile +new file mode 100644 +index 0000000..a9281ca +--- /dev/null ++++ b/feeds/luci/contrib/package/freifunk-mapupdate/Makefile +@@ -0,0 +1,39 @@ ++# Copyright (C) 2011 Manuel Munz ++# This is free software, licensed under the Apache 2.0 license. ++ ++include $(TOPDIR)/rules.mk ++ ++PKG_NAME:=freifunk-mapupdate ++PKG_RELEASE:=1 ++ ++PKG_BUILD_DIR := $(BUILD_DIR)/$(PKG_NAME) ++ ++include $(INCLUDE_DIR)/package.mk ++ ++define Package/freifunk-mapupdate ++ SECTION:=luci ++ CATEGORY:=LuCI ++ SUBMENU:=9. Freifunk ++ TITLE:=Update script for freifunkmap ++ DEPENDS:=+olsrd-mod-nameservice ++endef ++ ++define Package/freifunk-mapupdate/description ++ This script updates the freifunkmap (also known as the global map, see http://map.berlin.freifunk.net) every hour. Config file is /etc/config/freifunk-mapupdate. ++endef ++ ++define Build/Prepare ++ mkdir -p $(PKG_BUILD_DIR) ++endef ++ ++define Build/Configure ++endef ++ ++define Build/Compile ++endef ++ ++define Package/freifunk-mapupdate/install ++ $(CP) ./files/* $(1)/ ++endef ++ ++$(eval $(call BuildPackage,freifunk-mapupdate)) +diff --git a/feeds/luci/contrib/package/freifunk-mapupdate/files/etc/config/freifunk-mapupdate b/feeds/luci/contrib/package/freifunk-mapupdate/files/etc/config/freifunk-mapupdate +new file mode 100644 +index 0000000..7e98f95 +--- /dev/null ++++ b/feeds/luci/contrib/package/freifunk-mapupdate/files/etc/config/freifunk-mapupdate +@@ -0,0 +1,3 @@ ++config 'mapupdate' 'mapupdate' ++ option 'enabled' '1' ++ option 'mapserver' 'http://map.berlin.freifunk.net/freifunkmap.php' +diff --git a/feeds/luci/contrib/package/freifunk-mapupdate/files/usr/sbin/ff_mapupdate.sh b/feeds/luci/contrib/package/freifunk-mapupdate/files/usr/sbin/ff_mapupdate.sh +new file mode 100755 +index 0000000..40a077f +--- /dev/null ++++ b/feeds/luci/contrib/package/freifunk-mapupdate/files/usr/sbin/ff_mapupdate.sh +@@ -0,0 +1,59 @@ ++#!/bin/sh ++ ++if [ ! "$(uci -q get freifunk-mapupdate.mapupdate.enabled)" == 1 ]; then ++ exit 1 ++fi ++ ++MAPSERVER="$(uci -q get freifunk-mapupdate.mapupdate.mapserver)" ++[ -z "$MAPSERVER" ] && logger -t "freifunk-mapupdate:" "No mapserver configured" && exit 1 ++ ++#check if nameservice plugin is installed and enabled, else exit ++nslib=`uci show olsrd |grep olsrd_nameservice.so |awk {' FS="."; print $1"."$2 '}` ++if [ -n "$nslib" ]; then ++ LATLONFILE="$(uci -q get $nslib.latlon_file)" ++ if [ -z "$LATLONFILE" ]; then ++ LATLONFILE="/var/run/latlon.js" ++ fi ++ if [ ! -p "$LATLONFILE" ]; then ++ logger -t "freifunk-mapupdate:" "latlon_file not found."; exit 1 ++ fi ++else ++ logger -t "freifunk-mapupdate:" "nameservice plugin not found in olsrd config." ++ exit 1 ++fi ++ ++HOSTNAME="$(uci show system |grep hostname |cut -d "=" -f 2)" ++HF_INFO="" ++ ++# Get info for myself ++SELF=$(cat $LATLONFILE |grep ^Self | sed -e 's/Self(//' -e 's/);//' -e "s/'//g") ++OLSR_IP="$(echo $SELF |awk '{ FS=",";print $1 }')" ++LOCATION="$(uci show system |grep .location |cut -d "=" -f 2)" ++[ -n "$LOCATION" ] && NOTE="$LOCATION
    " ++FFNOTE="$(uci -q get freifunk.contact.note)" ++[ -n "$FFNOTE" ] && NOTE="$NOTE $FFNOTE" ++NOTE="

    $HOSTNAME

    $NOTE" ++NOTE=`echo -e "$NOTE" | sed -e 's/\ /%20/g' -e 's/&/%26/g' -e 's/"/%22/g'` ++ ++UPDATESTRING="$(echo $SELF |awk '{ FS=",";print $2 }'), $(echo $SELF |awk '{ FS=",";print $3 }')" ++ ++# write our coordinates to mygooglemapscoords.txt to make Freifunk Firmware happy ++echo "$UPDATESTRING" > /tmp/mygooglemapscoords.txt ++[ ! -L /www/mygooglemapscoords.txt ] && ln -s /tmp/mygooglemapscoords.txt /www/mygooglemapscoords.txt ++ ++# get neighbor Info (lat, lon, lq) ++while read line; do ++ NEIGHUPD="$(echo $line |awk '{ FS=","; print $6 }'), $(echo $line |awk '{ FS=","; print $7 }'), $(echo $line |awk '{ FS=",";print $4 }')" ++ UPDATESTRING="${UPDATESTRING}, ${NEIGHUPD}" ++done << EOF ++`grep "PLink('$OLSR_IP" $LATLONFILE | sed -e 's/PLink(//' -e 's/);//' -e "s/'//g"` ++EOF ++ ++# Send UPDATESTRING ++UPDATE=`echo -e "$UPDATESTRING" | sed s/\ /%20/g` ++result="$(wget "$MAPSERVER?update=$UPDATE&updateiv=3600&olsrip=$OLSR_IP¬e=${NOTE}${HF_INFO}" -qO -)" ++ ++if [ ! "$result" == "success update" ]; then ++ logger -t "freifunk-mapupdate:" "Update failed: $result" ++fi ++ +diff --git a/feeds/luci/contrib/package/freifunk-mapupdate/root/etc/uci-defaults/freifunk-mapupdate b/feeds/luci/contrib/package/freifunk-mapupdate/root/etc/uci-defaults/freifunk-mapupdate +new file mode 100644 +index 0000000..dee7f1b +--- /dev/null ++++ b/feeds/luci/contrib/package/freifunk-mapupdate/root/etc/uci-defaults/freifunk-mapupdate +@@ -0,0 +1,6 @@ ++#!/bin/sh ++test -f /etc/crontabs/root || touch /etc/crontabs/root ++SEED="$( dd if=/dev/urandom bs=2 count=1 2>&- | hexdump | if read line; then echo 0x${line#* }; fi )" ++MIN="$(( $SEED % 59 ))" ++grep -q "ff_mapupdate.sh" /etc/crontabs/root || echo "$MIN * * * * /usr/sbin/ff_mapupdate.sh" >> /etc/crontabs/root ++/etc/init.d/cron restart +diff --git a/feeds/luci/contrib/package/freifunk-p2pblock/Makefile b/feeds/luci/contrib/package/freifunk-p2pblock/Makefile +new file mode 100644 +index 0000000..8eeafbb +--- /dev/null ++++ b/feeds/luci/contrib/package/freifunk-p2pblock/Makefile +@@ -0,0 +1,48 @@ ++# ++# Copyright (C) 2009 Andreas Seidler ++# Copyright (C) 2012 Jo-Philipp Wich ++# ++# This is free software, licensed under the GNU General Public License v2. ++# See /LICENSE for more information. ++# ++ ++include $(TOPDIR)/rules.mk ++ ++PKG_NAME:=freifunk-p2pblock ++PKG_RELEASE:=3 ++ ++PKG_BUILD_DIR := $(BUILD_DIR)/$(PKG_NAME) ++ ++include $(INCLUDE_DIR)/package.mk ++ ++define Package/freifunk-p2pblock ++ SECTION:=luci ++ CATEGORY:=LuCI ++ SUBMENU:=9. Freifunk ++ TITLE:=Freifunk p2pblock Addon ++ DEPENDS:=+iptables-mod-filter +iptables-mod-ipp2p +l7-protocols +iptables-mod-conntrack-extra ++endef ++ ++define Package/freifunk-p2pblock/description ++ Simple Addon for Freifunk which use iptables layer7-, ipp2p- and recent-modules ++ to block p2p/filesharing traffic ++endef ++ ++define Build/Prepare ++ mkdir -p $(PKG_BUILD_DIR) ++endef ++ ++define Build/Configure ++endef ++ ++define Build/Compile ++endef ++ ++define Package/freifunk-p2pblock/install ++ $(INSTALL_DIR) $(1)/etc/init.d ++ $(INSTALL_BIN) ./files/freifunk-p2pblock.init $(1)/etc/init.d/freifunk-p2pblock ++ $(INSTALL_DIR) $(1)/etc/config ++ $(INSTALL_DATA) ./files/freifunk-p2pblock.config $(1)/etc/config/freifunk_p2pblock ++endef ++ ++$(eval $(call BuildPackage,freifunk-p2pblock)) +diff --git a/feeds/luci/contrib/package/freifunk-p2pblock/files/freifunk-p2pblock.config b/feeds/luci/contrib/package/freifunk-p2pblock/files/freifunk-p2pblock.config +new file mode 100644 +index 0000000..291260e +--- /dev/null ++++ b/feeds/luci/contrib/package/freifunk-p2pblock/files/freifunk-p2pblock.config +@@ -0,0 +1,6 @@ ++config 'settings' 'p2pblock' ++ option 'portrange' '1024:65535' ++ option 'layer7' 'edonkey bittorrent fasttrack' ++ option 'ipp2p' 'edk dc kazaa gnu bit ares soul winmx apple' ++ option 'blocktime' '60' ++ option 'whitelist' '' +diff --git a/feeds/luci/contrib/package/freifunk-p2pblock/files/freifunk-p2pblock.init b/feeds/luci/contrib/package/freifunk-p2pblock/files/freifunk-p2pblock.init +new file mode 100644 +index 0000000..5ca60c8 +--- /dev/null ++++ b/feeds/luci/contrib/package/freifunk-p2pblock/files/freifunk-p2pblock.init +@@ -0,0 +1,95 @@ ++#!/bin/sh /etc/rc.common ++ ++START=82 ++ME="freifunk-p2pblock" ++LOCK='/var/run/p2pblock.lock' ++ ++# helper-scripts ++ipt_add() { ++ logger -t "$ME" "set 'iptables -I $1'" ++ iptables -I $1 ++ echo "iptables -D $1" >> $LOCK ++} ++ ++start() { ++ /etc/init.d/freifunk-p2pblock enabled || return ++ ++ if [ ! -s "$LOCK" ]; then ++ logger -s -t "$ME" 'starting p2pblock...' ++ ++ config_load network ++ config_get wan wan ifname ++ ++ if [ -n "$wan" ]; then ++ config_load freifunk_p2pblock ++ config_get layer7 p2pblock layer7 ++ config_get ipp2p p2pblock ipp2p ++ config_get portrange p2pblock portrange ++ config_get blocktime p2pblock blocktime ++ config_get whitelist p2pblock whitelist ++ ++ # load modules ++ insmod ipt_ipp2p 2>&- ++ insmod ipt_layer7 2>&- ++ insmod ipt_recent ip_list_tot=400 ip_pkt_list_tot=3 2>&- ++ ++ # create new p2p-chain ++ iptables -N p2pblock ++ # pipe all incoming FORWARD with source-/destination-port 1024-65535 throu p2p-chain ++ ipt_add "FORWARD -i $wan -p tcp --sport $portrange --dport $portrange -j p2pblock" ++ ipt_add "FORWARD -i $wan -p udp --sport $portrange --dport $portrange -j p2pblock" ++ ++ # if p2p-traffic blocked 3 packages to a destination ip then block all traffic within the next 180 sec (port 1024-65535) ++ ipt_add "p2pblock -m recent --rdest --rcheck --name P2PBLOCK --seconds $blocktime --hitcount 3 -j DROP" ++ ipt_add "p2pblock -m recent --rdest --rcheck --name P2PBLOCK --seconds $blocktime --hitcount 3 -m limit --limit 1/minute -j LOG --log-prefix P2PBLOCK-DROP:" ++ ++ # create layer7-rules ++ for proto in $layer7; do ++ ipt_add "p2pblock -m layer7 --l7proto $proto -m recent --rdest --set --name P2PBLOCK" ++ ipt_add "p2pblock -m layer7 --l7proto $proto -m limit --limit 1/minute -j LOG --log-prefix P2PBLOCK-seen-$proto:" ++ done ++ ++ # create ipp2p-rules ++ for proto in $ipp2p; do ++ ipt_add "p2pblock -m ipp2p --$proto -m recent --rdest --set --name P2PBLOCK" ++ ipt_add "p2pblock -m ipp2p --$proto -m limit --limit 1/minute -j LOG --log-prefix P2PBLOCK-seen-$proto:" ++ done ++ ++ # insert whitelisted ips ++ for ip in $whitelist; do ++ ipt_add "p2pblock -d $ip -j RETURN" ++ done ++ ++ logger -s -t "$ME" 'Done.'; return 0 ++ else ++ logger -s -t "$ME" 'No wan interface present.'; return 0 ++ fi ++ else ++ logger -s -t "$ME" 'WARNING! already running - Aborting!'; return 2 ++ fi ++} ++ ++stop() { ++ if [ -s "$LOCK" ]; then ++ logger -s -t "$ME" 'stopping p2pblock...' ++ ++ # unset all rules in $LOCK-file ++ cat $LOCK | sed -ne '1!G;h;$p' | while read line; do ++ logger -t "$ME" "unset $line" ++ while eval $line 2>&-; do :; done ++ done; : > "$LOCK" ++ ++ # flush and delete the p2p-chain ++ iptables -F p2pblock ++ iptables -X p2pblock ++ logger -s -t "$ME" 'Done.'; return 0 ++ ++ else ++ logger -s -t "$ME" 'WARNING! not running - Aborting!'; return 2 ++ ++ fi ++} ++ ++restart() { ++ stop; sleep 1; start ++} +diff --git a/feeds/luci/contrib/package/freifunk-policyrouting/Makefile b/feeds/luci/contrib/package/freifunk-policyrouting/Makefile +new file mode 100644 +index 0000000..a9301ce +--- /dev/null ++++ b/feeds/luci/contrib/package/freifunk-policyrouting/Makefile +@@ -0,0 +1,47 @@ ++# Copyright (C) 2011 Manuel Munz ++# This is free software, licensed under the Apache 2.0 license. ++ ++include $(TOPDIR)/rules.mk ++ ++PKG_NAME:=freifunk-policyrouting ++PKG_RELEASE:=6 ++ ++PKG_BUILD_DIR := $(BUILD_DIR)/$(PKG_NAME) ++ ++include $(INCLUDE_DIR)/package.mk ++ ++define Package/freifunk-policyrouting ++ SECTION:=luci ++ CATEGORY:=LuCI ++ SUBMENU:=9. Freifunk ++ TITLE:=Freifunk policy routing addon ++ DEPENDS:=+ip ++endef ++ ++define Package/freifunk-policyrouting/description ++ Allows you to send your own traffic via your own default gateway while sending traffic received from the mesh to a gateway in the mesh. ++endef ++ ++define Build/Prepare ++ mkdir -p $(PKG_BUILD_DIR) ++endef ++ ++define Build/Configure ++endef ++ ++define Build/Compile ++endef ++ ++define Package/freifunk-policyrouting/install ++ $(CP) ./files/* $(1)/ ++endef ++ ++define Package/freifunk-policyrouting/postinst ++#!/bin/sh ++[ -n "$${IPKG_INSTROOT}" ] || { ++ /etc/init.d/freifunk-policyrouting enabled || /etc/init.d/freifunk-policyrouting enable ++ exit 0 ++} ++endef ++ ++$(eval $(call BuildPackage,freifunk-policyrouting)) +diff --git a/feeds/luci/contrib/package/freifunk-policyrouting/files/etc/config/freifunk-policyrouting b/feeds/luci/contrib/package/freifunk-policyrouting/files/etc/config/freifunk-policyrouting +new file mode 100644 +index 0000000..3dd2998 +--- /dev/null ++++ b/feeds/luci/contrib/package/freifunk-policyrouting/files/etc/config/freifunk-policyrouting +@@ -0,0 +1,7 @@ ++ ++config 'settings' 'pr' ++ option 'enable' '0' ++ option 'strict' '1' ++ option 'fallback' '1' ++ option 'zones' '' ++ +diff --git a/feeds/luci/contrib/package/freifunk-policyrouting/files/etc/hotplug.d/iface/30-policyrouting b/feeds/luci/contrib/package/freifunk-policyrouting/files/etc/hotplug.d/iface/30-policyrouting +new file mode 100644 +index 0000000..327e879 +--- /dev/null ++++ b/feeds/luci/contrib/package/freifunk-policyrouting/files/etc/hotplug.d/iface/30-policyrouting +@@ -0,0 +1,104 @@ ++#!/bin/sh ++ ++. /lib/functions.sh ++. /lib/functions/network.sh ++ ++proto="4" ++[ -f /proc/net/ipv6_route ] && proto="4 6" ++ ++config_load freifunk-policyrouting ++config_get enable pr enable ++config_get fallback pr fallback ++config_get strict pr strict ++config_get zones pr zones ++ ++if [ "$ACTION" = "ifup" ] && [ "$enable" = "1" ]; then ++ network_get_subnet net $INTERFACE ++ network_get_subnet6 net6 $INTERFACE ++ network_get_physdev dev $INTERFACE ++ ++ if [ "$net" != "" -a -n "$dev" ]; then ++ eval $(/bin/ipcalc.sh $net) ++ if [ "$PREFIX" != "0" -a "$NETWORK" != "127.0.0.0" ]; then ++ if [ ! "$(ip r s t localnets |grep "$NETWORK/$PREFIX dev")" ]; then ++ cmd="ip r a $NETWORK/$PREFIX dev $dev table localnets" ++ $cmd ++ if [ "$?" = 0 ]; then ++ logger -s -t policyrouting "Add route: $cmd" ++ else ++ logger -s -t policyrouting "Error! Could not add route: $cmd" ++ fi ++ fi ++ ++ fi ++ ++ if [ -n "$net6" ]; then ++ cmd="ip -6 r a $net6 dev $dev table localnets" ++ $cmd 2>&1 > /dev/null ++ if [ "$?" = 0 ]; then ++ logger -s -t policyrouting "Add route: $cmd (IPv6)" ++ fi ++ ++ fi ++ ++ networks="" ++ for z in $zones; do ++ network_zone="$(uci -q get firewall.zone_${z}.network)" ++ if [ -z "$network_zone" ]; then ++ network_zone="$z" ++ fi ++ networks="$networks $network_zone" ++ done ++ for n in $networks; do ++ if [ "$INTERFACE" = "$n" ]; then ++ for p in $proto; do ++ if [ ! "$(ip -$p ru s | grep "from all iif $dev lookup olsr-default")" ]; then ++ ip -$p rule add dev "$dev" lookup olsr-default prio 20000 ++ if [ "$strict" != 0 ]; then ++ ip -$p rule add dev "$dev" unreachable prio 20001 ++ fi ++ if [ "$?" = 0 ]; then ++ logger -s -t policyrouting "Use mesh gateway for interface $dev (IPv$p)" ++ if [ -z "$(uci -P /var/state get freifunk-policyrouting.${INTERFACE})" ]; then ++ uci -P /var/state set freifunk-policyrouting.${INTERFACE}="state" ++ fi ++ uci -P /var/state set freifunk-policyrouting.${INTERFACE}.device="$dev" ++ else ++ logger -s -t policyrouting "Error: Could not add rule: dev "$dev" lookup olsr-default prio 20000 (IPv$p)" ++ fi ++ fi ++ done ++ fi ++ done ++ fi ++ ++fi ++ ++if [ "$ACTION" = "ifdown" ]; then ++ dev="$(uci -q -P /var/state get freifunk-policyrouting.${INTERFACE}.device)" ++ if [ -n "$dev" ]; then ++ networks="" ++ for z in $zones; do ++ network_zone="$(uci -q get firewall.zone_${z}.network)" ++ if [ -z "$network_zone" ]; then ++ network_zone="$z" ++ fi ++ networks="$networks $network_zone" ++ done ++ for n in $networks; do ++ if [ "$INTERFACE" = "$n" ]; then ++ for p in $proto; do ++ if [ "$(ip -$p ru s | grep "from all iif $dev lookup olsr-default")" ]; then ++ ip -$p rule del dev "$dev" lookup olsr-default prio 20000 ++ ip -$p rule del dev "$dev" unreachable prio 20001 ++ if [ "$?" = 0 ]; then ++ logger -s -t policyrouting "Remove rule: dev "$dev" lookup olsr-default prio 20000 (IPv$p)" ++ else ++ logger -s -t policyrouting "Error! Could not remove rule: dev "$dev" lookup olsr-default prio 20000 (IPv$p)" ++ fi ++ fi ++ done ++ fi ++ done ++ fi ++fi +diff --git a/feeds/luci/contrib/package/freifunk-policyrouting/files/etc/init.d/freifunk-policyrouting b/feeds/luci/contrib/package/freifunk-policyrouting/files/etc/init.d/freifunk-policyrouting +new file mode 100755 +index 0000000..05a7540 +--- /dev/null ++++ b/feeds/luci/contrib/package/freifunk-policyrouting/files/etc/init.d/freifunk-policyrouting +@@ -0,0 +1,161 @@ ++#!/bin/sh /etc/rc.common ++ ++START=15 ++. /lib/functions/network.sh ++. /lib/functions.sh ++ ++proto="4" ++[ -f /proc/net/ipv6_route ] && proto="4 6" ++[ -f /etc/config/olsrd ] && cfgs="olsrd" ++[ -f /etc/config/olsrd6 ] && cfgs="$cfgs olsrd6" ++ ++config_load freifunk-policyrouting ++config_get enable pr enable ++config_get fallback pr fallback ++config_get zones pr zones ++ ++ ++olsrd_rmtables() { ++ for cfg in $cfgs; do ++ # Remove custom routing tables from olsrd ++ if [ "`uci -q get $cfg.@olsrd[0].RtTable`" == "111" ] || [ "`uci -q get $cfg.@olsrd[0].RtTableDefault`" == "112" ]; then ++ uci delete $cfg.@olsrd[0].RtTable ++ uci delete $cfg.@olsrd[0].RtTableDefault ++ uci commit ++ fi ++ done ++} ++ ++olsrd_intalltables() { ++ for cfg in $cfgs; do ++ if [ ! "`uci -q get $cfg.@olsrd[0].RtTable`" == "111" ] || [ ! "`uci -q get $cfg.@olsrd[0].RtTableDefault`" == "112" ]; then ++ uci set $cfg.@olsrd[0].RtTable='111' ++ uci set $cfg.@olsrd[0].RtTableDefault='112' ++ uci commit $cfg ++ /etc/init.d/$cfg restart 2&> /dev/null ++ fi ++ done ++} ++ ++rt_tables() { ++ tables="/etc/iproute2/rt_tables" ++ if [ -z "`grep "110" $tables`" ]; then ++ echo "110 localnets" >> $tables ++ fi ++ if [ -z "`grep "111" $tables`" ]; then ++ echo "111 olsr" >> $tables ++ fi ++ if [ -z "`grep "112" $tables`" ]; then ++ echo "112 olsr-default" >> $tables ++ fi ++ ++} ++ ++disable_dyngw() { ++ for cfg in $cfgs; do ++ local dyngwlib=`uci show $cfg |grep dyn_gw.so |awk {' FS="."; print $1"."$2 '}` ++ if [ -n "$dyngwlib" ]; then ++ uci set $dyngwlib.ignore=1 ++ uci commit $cfg ++ fi ++ ++ dyngwplainlib=`uci show $cfg |grep dyn_gw_plain |awk {' FS="."; print $1"."$2 '}` ++ if [ -n "$dyngwplainlib" ]; then ++ rttable="$(uci -q get $dyngwplainlib.RtTable)" ++ if [ -z "$rttable" ] || [ "$rttable" = "254" ]; then ++ uci set $dyngwplainlib.ignore=1 ++ uci commit $cfg ++ fi ++ fi ++ done ++} ++ ++restart_services() { ++ logger -s -t policyrouting -p info "Restarting services" ++ /etc/init.d/network restart 2&> /dev/null ++ for cfg in $cfgs; do ++ /etc/init.d/$cfg restart 2&> /dev/null ++ done ++} ++ ++boot() { ++ if [ "$enable" = "1" ]; then ++ [ -d /var/state ] || mkdir -p /var/state ++ touch /var/state/freifunk-policyrouting ++ start noservicerestart ++ else ++ olsrd_rmtables ++ fi ++} ++ ++add_lookup_rule() { ++ name=${1/-/_} ++ lookup=$2 ++ prio=$3 ++ ++ if [ -z "$name" -o -z "$lookup" -o -z "$prio" ]; then ++ logger -s -t policyrouting "Missing parameters for add_rule!" ++ else ++ for p in $proto; do ++ if [ "$p" = "6" ]; then ++ rule="rule6" ++ else ++ rule="rule" ++ fi ++ ++ uci batch <<- EOF ++ set network.${name}ipv${p}="$rule" ++ set network.${name}ipv${p}.lookup="$lookup" ++ set network.${name}ipv${p}.priority="$prio" ++ EOF ++ done ++ fi ++} ++ ++del_lookup_rule() { ++ name=${1/-/_} ++ for p in $proto; do ++ uci -q delete network.${name}ipv${p} ++ done ++} ++ ++start() { ++ if [ $enable = "1" ]; then ++ logger -s -t policyrouting "Starting policy routing." ++ rt_tables ++ olsrd_intalltables ++ disable_dyngw ++ ++ add_lookup_rule olsr olsr 1000 ++ add_lookup_rule localnets localnets 2000 ++ ++ if [ "$fallback" = 1 ]; then ++ add_lookup_rule olsr-default olsr-default 100000 ++ fi ++ fi ++ uci commit network ++ if [ ! "$1" = "noservicerestart" ]; then ++ restart_services ++ fi ++} ++ ++stop() { ++ logger -s -t policyrouting "Stopping policy routing" ++ olsrd_rmtables ++ del_lookup_rule olsr-default ++ del_lookup_rule olsr ++ del_lookup_rule localnets ++ uci commit network ++ restart_services ++ echo "Hint: To completely disable freifunk-policyrouting set enable=0 in /etc/config/freifunk-policyrouting." ++} ++ ++restart() { ++ logger -s -t policyrouting "Restarting policy routing" ++ olsrd_rmtables ++ del_lookup_rule olsr-default ++ del_lookup_rule olsr ++ del_lookup_rule localnets ++ uci commit network ++ start ++} +diff --git a/feeds/luci/contrib/package/freifunk-policyrouting/files/etc/rc.d/S15-freifunk-policyrouting b/feeds/luci/contrib/package/freifunk-policyrouting/files/etc/rc.d/S15-freifunk-policyrouting +new file mode 120000 +index 0000000..3c3dad8 +--- /dev/null ++++ b/feeds/luci/contrib/package/freifunk-policyrouting/files/etc/rc.d/S15-freifunk-policyrouting +@@ -0,0 +1 @@ ++../init.d/freifunk-policyrouting +\ No newline at end of file +diff --git a/feeds/luci/contrib/package/freifunk-policyrouting/files/etc/uci-defaults/freifunk-policyrouting b/feeds/luci/contrib/package/freifunk-policyrouting/files/etc/uci-defaults/freifunk-policyrouting +new file mode 100644 +index 0000000..a1e6310 +--- /dev/null ++++ b/feeds/luci/contrib/package/freifunk-policyrouting/files/etc/uci-defaults/freifunk-policyrouting +@@ -0,0 +1,7 @@ ++#!/bin/sh ++uci batch <<-EOF ++ add ucitrack freifunk-policyrouting ++ add_list ucitrack.@freifunk-policyrouting[-1].exec="/etc/init.d/freifunk-policyrouting restart" ++ commit ucitrack ++EOF ++ +diff --git a/feeds/luci/contrib/package/freifunk-watchdog/Makefile b/feeds/luci/contrib/package/freifunk-watchdog/Makefile +new file mode 100644 +index 0000000..c720c25 +--- /dev/null ++++ b/feeds/luci/contrib/package/freifunk-watchdog/Makefile +@@ -0,0 +1,55 @@ ++# ++# Copyright (C) 2009-2012 Jo-Philipp Wich ++# ++# This is free software, licensed under the GNU General Public License v2. ++# See /LICENSE for more information. ++# ++ ++include $(TOPDIR)/rules.mk ++ ++PKG_NAME:=freifunk-watchdog ++PKG_RELEASE:=8 ++ ++PKG_BUILD_DIR := $(BUILD_DIR)/$(PKG_NAME) ++PKG_BUILD_DEPENDS := uci ++ ++include $(INCLUDE_DIR)/package.mk ++ ++define Package/freifunk-watchdog ++ SECTION:=luci ++ CATEGORY:=LuCI ++ SUBMENU:=9. Freifunk ++ TITLE:=Freifunk Ad-Hoc watchdog daemon ++ DEPENDS:=libuci ++endef ++ ++define Package/freifunk-watchdog/description ++ A watchdog daemon that monitors wireless interfaces to ensure the correct bssid and channel. ++ The process will initiate a wireless restart as soon as it detects a bssid or channel mismatch. ++endef ++ ++define Build/Prepare ++ mkdir -p $(PKG_BUILD_DIR) ++ $(CP) ./src/* $(PKG_BUILD_DIR)/ ++endef ++ ++define Build/Configure ++endef ++ ++define Build/Compile ++ $(MAKE) -C $(PKG_BUILD_DIR) \ ++ CC="$(TARGET_CC)" \ ++ CFLAGS="$(TARGET_CFLAGS) -I$(STAGING_DIR)/usr/include" \ ++ LDFLAGS="$(TARGET_LDFLAGS)" ++endef ++ ++define Package/freifunk-watchdog/install ++ $(INSTALL_DIR) $(1)/etc/init.d ++ $(INSTALL_BIN) ./files/freifunk-watchdog.init $(1)/etc/init.d/freifunk-watchdog ++ $(INSTALL_DIR) $(1)/etc/config ++ $(INSTALL_CONF) ./files/freifunk-watchdog.config $(1)/etc/config/freifunk-watchdog ++ $(INSTALL_DIR) $(1)/usr/sbin ++ $(INSTALL_BIN) $(PKG_BUILD_DIR)/ffwatchd $(1)/usr/sbin/ ++endef ++ ++$(eval $(call BuildPackage,freifunk-watchdog)) +diff --git a/feeds/luci/contrib/package/freifunk-watchdog/files/freifunk-watchdog.config b/feeds/luci/contrib/package/freifunk-watchdog/files/freifunk-watchdog.config +new file mode 100644 +index 0000000..b6e6543 +--- /dev/null ++++ b/feeds/luci/contrib/package/freifunk-watchdog/files/freifunk-watchdog.config +@@ -0,0 +1,7 @@ ++config process ++ option process 'dropbear' ++ option initscript '/etc/init.d/dropbear' ++ ++config process ++ option process 'crond' ++ option initscript '/etc/init.d/cron' +diff --git a/feeds/luci/contrib/package/freifunk-watchdog/files/freifunk-watchdog.init b/feeds/luci/contrib/package/freifunk-watchdog/files/freifunk-watchdog.init +new file mode 100755 +index 0000000..d6ede09 +--- /dev/null ++++ b/feeds/luci/contrib/package/freifunk-watchdog/files/freifunk-watchdog.init +@@ -0,0 +1,39 @@ ++#!/bin/sh /etc/rc.common ++ ++START=99 ++PID=/var/run/ffwatchd.pid ++BIN=/usr/sbin/ffwatchd ++ ++boot() ++{ ++ # If watchdog service is enabled, install cronjob, create device node and start daemon ++ if /etc/init.d/freifunk-watchdog enabled 2>/dev/null; then ++ if ! grep -q "$BIN" /etc/crontabs/root 2>/dev/null; then ++ echo "* * * * * $BIN running || /etc/init.d/freifunk-watchdog restart" >> /etc/crontabs/root ++ fi ++ ++ mknod /dev/watchdog c 10 130 ++ ++ start ++ ++ # If service is disabled, find and remove related cronjob ++ elif grep -q "$BIN" /etc/crontabs/root 2>/dev/null; then ++ sed -i -e "\\'$BIN'd" /etc/crontabs/root ++ fi ++} ++ ++start() ++{ ++ start-stop-daemon -q -b -m -p $PID -x $BIN -S ++} ++ ++stop() ++{ ++ start-stop-daemon -q -p $PID -x $BIN -K ++ ++ if ! /etc/init.d/freifunk-watchdog enabled; then ++ if grep -q "$BIN" /etc/crontabs/root 2>/dev/null; then ++ sed -i -e "\\'$BIN'd" /etc/crontabs/root ++ fi ++ fi ++} +diff --git a/feeds/luci/contrib/package/freifunk-watchdog/src/Makefile b/feeds/luci/contrib/package/freifunk-watchdog/src/Makefile +new file mode 100644 +index 0000000..e049ebc +--- /dev/null ++++ b/feeds/luci/contrib/package/freifunk-watchdog/src/Makefile +@@ -0,0 +1,12 @@ ++WD_BINARY:=ffwatchd ++WD_CFLAGS:=$(CFLAGS) -c -DBINARY=\"$(WD_BINARY)\" ++WD_LDFLAGS:=$(LDFLAGS) -lm -luci ++ ++watchdog: ++ $(CC) $(WD_CFLAGS) -o ucix.o ucix.c ++ $(CC) $(WD_CFLAGS) -o watchdog.o watchdog.c ++ $(CC) $(WD_LDFLAGS) -o $(WD_BINARY) watchdog.o ucix.o ++ ++clean: ++ rm -f *~ $(WD_BINARY) *.o ++ +diff --git a/feeds/luci/contrib/package/freifunk-watchdog/src/ucix.c b/feeds/luci/contrib/package/freifunk-watchdog/src/ucix.c +new file mode 100644 +index 0000000..f2f69fc +--- /dev/null ++++ b/feeds/luci/contrib/package/freifunk-watchdog/src/ucix.c +@@ -0,0 +1,102 @@ ++/* ++ * 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. ++ * ++ * This program is distributed in the hope that it will be useful, ++ * but WITHOUT ANY WARRANTY; without even the implied warranty of ++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++ * GNU General Public License for more details. ++ * ++ * You should have received a copy of the GNU General Public License ++ * along with this program; if not, write to the Free Software ++ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. ++ * ++ * Copyright (C) 2008 John Crispin ++ * ++ * Changed by Jo-Philipp Wich ++ */ ++ ++#include ++#include ++ ++#include ++#include ++#include "ucix.h" ++ ++static struct uci_ptr ptr; ++ ++static inline int ucix_get_ptr(struct uci_context *ctx, const char *p, const char *s, const char *o, const char *t) ++{ ++ memset(&ptr, 0, sizeof(ptr)); ++ ptr.package = p; ++ ptr.section = s; ++ ptr.option = o; ++ ptr.value = t; ++ return uci_lookup_ptr(ctx, &ptr, NULL, true); ++} ++ ++struct uci_context* ucix_init(const char *config_file) ++{ ++ struct uci_context *ctx = uci_alloc_context(); ++#ifdef uci_to_delta ++ uci_add_delta_path(ctx, "/var/state"); ++#else ++ uci_add_history_path(ctx, "/var/state"); ++#endif ++ if(uci_load(ctx, config_file, NULL) != UCI_OK) ++ { ++ return NULL; ++ } ++ return ctx; ++} ++ ++void ucix_cleanup(struct uci_context *ctx) ++{ ++ uci_free_context(ctx); ++} ++ ++const char* ucix_get_option(struct uci_context *ctx, const char *p, const char *s, const char *o) ++{ ++ struct uci_element *e = NULL; ++ const char *value = NULL; ++ if(ucix_get_ptr(ctx, p, s, o, NULL)) ++ return NULL; ++ if (!(ptr.flags & UCI_LOOKUP_COMPLETE)) ++ return NULL; ++ e = ptr.last; ++ switch (e->type) ++ { ++ case UCI_TYPE_SECTION: ++ value = uci_to_section(e)->type; ++ break; ++ case UCI_TYPE_OPTION: ++ switch(ptr.o->type) { ++ case UCI_TYPE_STRING: ++ value = ptr.o->v.string; ++ break; ++ default: ++ value = NULL; ++ break; ++ } ++ break; ++ default: ++ return 0; ++ } ++ ++ return value; ++} ++ ++void ucix_for_each_section_type(struct uci_context *ctx, ++ const char *p, const char *t, ++ void (*cb)(const char*, void*), void *priv) ++{ ++ struct uci_element *e; ++ if(ucix_get_ptr(ctx, p, NULL, NULL, NULL)) ++ return; ++ uci_foreach_element(&ptr.p->sections, e) ++ if (!strcmp(t, uci_to_section(e)->type)) ++ cb(e->name, priv); ++} ++ +diff --git a/feeds/luci/contrib/package/freifunk-watchdog/src/ucix.h b/feeds/luci/contrib/package/freifunk-watchdog/src/ucix.h +new file mode 100644 +index 0000000..b1f5ec3 +--- /dev/null ++++ b/feeds/luci/contrib/package/freifunk-watchdog/src/ucix.h +@@ -0,0 +1,29 @@ ++/* ++ * 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. ++ * ++ * This program is distributed in the hope that it will be useful, ++ * but WITHOUT ANY WARRANTY; without even the implied warranty of ++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++ * GNU General Public License for more details. ++ * ++ * You should have received a copy of the GNU General Public License ++ * along with this program; if not, write to the Free Software ++ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. ++ * ++ * Copyright (C) 2008 John Crispin ++ */ ++ ++#ifndef _UCI_H__ ++#define _UCI_H__ ++struct uci_context* ucix_init(const char *config_file); ++ ++void ucix_for_each_section_type(struct uci_context *ctx, ++ const char *p, const char *t, ++ void (*cb)(const char*, void*), void *priv); ++ ++const char* ucix_get_option(struct uci_context *ctx, ++ const char *p, const char *s, const char *o); ++#endif +diff --git a/feeds/luci/contrib/package/freifunk-watchdog/src/watchdog.c b/feeds/luci/contrib/package/freifunk-watchdog/src/watchdog.c +new file mode 100644 +index 0000000..f546985 +--- /dev/null ++++ b/feeds/luci/contrib/package/freifunk-watchdog/src/watchdog.c +@@ -0,0 +1,527 @@ ++/* ++ * 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. ++ * ++ * This program is distributed in the hope that it will be useful, ++ * but WITHOUT ANY WARRANTY; without even the implied warranty of ++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++ * GNU General Public License for more details. ++ * ++ * You should have received a copy of the GNU General Public License ++ * along with this program; if not, write to the Free Software ++ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. ++ * ++ * Copyright (C) 2009 Jo-Philipp Wich ++ */ ++ ++#include "watchdog.h" ++ ++/* Global watchdog fd, required by signal handler */ ++int wdfd = -1; ++ ++/* Handle finished childs */ ++static void sigchld_handler(int sig) ++{ ++ pid_t pid; ++ ++ while( (pid = waitpid(-1, NULL, WNOHANG)) > 0 ) ++ syslog(LOG_INFO, "Child returned (pid %d)", pid); ++} ++ ++/* Watchdog shutdown helper */ ++static void shutdown_watchdog(int sig) ++{ ++ static const char wshutdown = WATCH_SHUTDOWN; ++ ++ if( wdfd > -1 ) ++ { ++ syslog(LOG_INFO, "Stopping watchdog timer"); ++ write(wdfd, &wshutdown, 1); ++ close(wdfd); ++ wdfd = -1; ++ } ++ ++ exit(0); ++} ++ ++/* Get BSSID of given interface */ ++static int iw_get_bssid(int iwfd, const char *ifname, char *bssid) ++{ ++ struct iwreq iwrq; ++ ++ if( iw_ioctl(iwfd, ifname, SIOCGIWAP, &iwrq) >= 0 ) ++ { ++ unsigned char *addr = (unsigned char *)iwrq.u.ap_addr.sa_data; ++ ++ sprintf(bssid, "%02X:%02X:%02X:%02X:%02X:%02X", ++ addr[0], addr[1], addr[2], addr[3], addr[4], addr[5]); ++ ++ return 0; ++ } ++ ++ return -1; ++} ++ ++/* Get channel of given interface */ ++static int iw_get_channel(int iwfd, const char *ifname, int *channel) ++{ ++ int i; ++ char buffer[sizeof(struct iw_range)]; ++ double cur_freq, cmp_freq; ++ struct iwreq iwrq; ++ struct iw_range *range; ++ ++ memset(buffer, 0, sizeof(buffer)); ++ ++ iwrq.u.data.pointer = (char *)buffer; ++ iwrq.u.data.length = sizeof(buffer); ++ iwrq.u.data.flags = 0; ++ ++ if( iw_ioctl(iwfd, ifname, SIOCGIWRANGE, &iwrq) < 0) ++ { ++ *channel = -1; ++ return -1; ++ } ++ ++ range = (struct iw_range *)buffer; ++ ++ if( iw_ioctl(iwfd, ifname, SIOCGIWFREQ, &iwrq) >= 0 ) ++ { ++ cur_freq = ((double)iwrq.u.freq.m) * pow(10, iwrq.u.freq.e); ++ if( cur_freq < 1000.00 ) ++ { ++ *channel = (int)cur_freq; ++ return 0; ++ } ++ ++ for(i = 0; i < range->num_frequency; i++) ++ { ++ cmp_freq = ((double)range->freq[i].m) * pow(10, range->freq[i].e); ++ if( cmp_freq == cur_freq ) ++ { ++ *channel = (int)range->freq[i].i; ++ return 0; ++ } ++ } ++ } ++ ++ *channel = -1; ++ return -1; ++} ++ ++/* Get the (first) pid of given process name */ ++static int find_process(const char *name) ++{ ++ int pid = -1; ++ int file; ++ char buffer[128]; ++ char cmpname[128]; ++ DIR *dir; ++ struct dirent *entry; ++ ++ if( (dir = opendir("/proc")) != NULL ) ++ { ++ snprintf(cmpname, sizeof(cmpname), "Name:\t%s\n", name); ++ ++ while( (entry = readdir(dir)) != NULL ) ++ { ++ if( !strcmp(entry->d_name, "..") || !isdigit(*entry->d_name) ) ++ continue; ++ ++ sprintf(buffer, "/proc/%s/status", entry->d_name); ++ if( (file = open(buffer, O_RDONLY)) > -1 ) ++ { ++ read(file, buffer, sizeof(buffer)); ++ close(file); ++ ++ if( strstr(buffer, cmpname) == buffer ) ++ { ++ pid = atoi(entry->d_name); ++ ++ /* Skip myself ... */ ++ if( pid == getpid() ) ++ pid = -1; ++ else ++ break; ++ } ++ } ++ } ++ ++ closedir(dir); ++ return pid; ++ } ++ ++ syslog(LOG_CRIT, "Unable to open /proc: %s", ++ strerror(errno)); ++ ++ return -1; ++} ++ ++/* Get the 5 minute load average */ ++static double find_loadavg(void) ++{ ++ int fd; ++ char buffer[10]; ++ double load = 0.00; ++ ++ if( (fd = open("/proc/loadavg", O_RDONLY)) > -1 ) ++ { ++ if( read(fd, buffer, sizeof(buffer)) == sizeof(buffer) ) ++ load = atof(&buffer[5]); ++ ++ close(fd); ++ } ++ ++ return load; ++} ++ ++/* Check if given uci file was updated */ ++static int check_uci_update(const char *config, time_t *mtime) ++{ ++ struct stat s; ++ char path[128]; ++ ++ snprintf(path, sizeof(path), "/var/state/%s", config); ++ if( stat(path, &s) > -1 ) ++ { ++ if( (*mtime == 0) || (s.st_mtime > *mtime) ) ++ { ++ *mtime = s.st_mtime; ++ return 1; ++ } ++ } ++ ++ return 0; ++} ++ ++/* Add tuple */ ++static void load_wifi_uci_add_iface(const char *section, struct uci_wifi_iface_itr_ctx *itr) ++{ ++ wifi_tuple_t *t; ++ const char *ucitmp; ++ int val = 0; ++ ++ ucitmp = ucix_get_option(itr->ctx, "wireless", section, "mode"); ++ if( ucitmp && !strncmp(ucitmp, "adhoc", 5) ) ++ { ++ if( (t = (wifi_tuple_t *)malloc(sizeof(wifi_tuple_t))) != NULL ) ++ { ++ ucitmp = ucix_get_option(itr->ctx, "wireless", section, "ifname"); ++ if(ucitmp) ++ { ++ strncpy(t->ifname, ucitmp, sizeof(t->ifname)); ++ val++; ++ } ++ ++ ucitmp = ucix_get_option(itr->ctx, "wireless", section, "bssid"); ++ if(ucitmp) ++ { ++ strncpy(t->bssid, ucitmp, sizeof(t->bssid)); ++ val++; ++ } ++ ++ ucitmp = ucix_get_option(itr->ctx, "wireless", section, "device"); ++ if(ucitmp) ++ { ++ ucitmp = ucix_get_option(itr->ctx, "wireless", ucitmp, "channel"); ++ if(ucitmp) ++ { ++ t->channel = atoi(ucitmp); ++ val++; ++ } ++ } ++ ++ if( val == 3 ) ++ { ++ syslog(LOG_INFO, "Monitoring %s: bssid=%s channel=%d", ++ t->ifname, t->bssid, t->channel); ++ ++ t->next = itr->list; ++ itr->list = t; ++ } ++ else ++ { ++ free(t); ++ } ++ } ++ } ++} ++ ++/* Load config */ ++static wifi_tuple_t * load_wifi_uci(wifi_tuple_t *ifs, time_t *modtime) ++{ ++ struct uci_context *ctx; ++ struct uci_wifi_iface_itr_ctx itr; ++ wifi_tuple_t *cur, *next; ++ ++ if( check_uci_update("wireless", modtime) ) ++ { ++ syslog(LOG_INFO, "Wireless config changed, reloading"); ++ ++ if( (ctx = ucix_init("wireless")) != NULL ) ++ { ++ if( ifs != NULL ) ++ { ++ for(cur = ifs; cur; cur = next) ++ { ++ next = cur->next; ++ free(cur); ++ } ++ } ++ ++ itr.list = NULL; ++ itr.ctx = ctx; ++ ++ ucix_for_each_section_type(ctx, "wireless", "wifi-iface", ++ (void *)load_wifi_uci_add_iface, &itr); ++ ++ return itr.list; ++ } ++ } ++ ++ return ifs; ++} ++ ++/* Add tuple */ ++static void load_watchdog_uci_add_process(const char *section, struct uci_process_itr_ctx *itr) ++{ ++ process_tuple_t *t; ++ const char *ucitmp; ++ int val = 0; ++ ++ if( (t = (process_tuple_t *)malloc(sizeof(process_tuple_t))) != NULL ) ++ { ++ t->restart = 0; ++ ++ ucitmp = ucix_get_option(itr->ctx, "freifunk-watchdog", section, "process"); ++ if(ucitmp) ++ { ++ strncpy(t->process, ucitmp, sizeof(t->process)); ++ val++; ++ } ++ ++ ucitmp = ucix_get_option(itr->ctx, "freifunk-watchdog", section, "initscript"); ++ if(ucitmp) ++ { ++ strncpy(t->initscript, ucitmp, sizeof(t->initscript)); ++ val++; ++ } ++ ++ if( val == 2 ) ++ { ++ syslog(LOG_INFO, "Monitoring %s: initscript=%s", ++ t->process, t->initscript); ++ ++ t->next = itr->list; ++ itr->list = t; ++ } ++ else ++ { ++ free(t); ++ } ++ } ++} ++ ++/* Load config */ ++static process_tuple_t * load_watchdog_uci(process_tuple_t *procs) ++{ ++ struct uci_context *ctx; ++ struct uci_process_itr_ctx itr; ++ process_tuple_t *cur, *next; ++ ++ syslog(LOG_INFO, "Loading watchdog config"); ++ ++ if( (ctx = ucix_init("freifunk-watchdog")) != NULL ) ++ { ++ if( procs != NULL ) ++ { ++ for(cur = procs; cur; cur = next) ++ { ++ next = cur->next; ++ free(cur); ++ } ++ } ++ ++ itr.list = NULL; ++ itr.ctx = ctx; ++ ++ ucix_for_each_section_type(ctx, "freifunk-watchdog", "process", ++ (void *)load_watchdog_uci_add_process, &itr); ++ ++ return itr.list; ++ } ++ ++ return procs; ++} ++ ++/* Daemon implementation */ ++static int do_daemon(void) ++{ ++ static int wdtrigger = 1; ++ static int wdtimeout = BASE_INTERVAL * 2; ++ static const char wdkeepalive = WATCH_KEEPALIVE; ++ ++ int iwfd; ++ int channel; ++ char bssid[18]; ++ struct sigaction sa; ++ ++ wifi_tuple_t *ifs = NULL, *curr_if; ++ process_tuple_t *procs = NULL, *curr_proc; ++ time_t wireless_modtime = 0; ++ ++ int action_intv = 0; ++ int restart_wifi = 0; ++ int loadavg_panic = 0; ++ ++ openlog(SYSLOG_IDENT, 0, LOG_DAEMON); ++ memset(&sa, 0, sizeof(sa)); ++ ++ if( (iwfd = socket(AF_INET, SOCK_DGRAM, 0)) == -1 ) ++ { ++ syslog(LOG_ERR, "Can not open wireless control socket: %s", ++ strerror(errno)); ++ ++ return 1; ++ } ++ ++ if( (wdfd = open(WATCH_DEVICE, O_WRONLY)) > -1 ) ++ { ++ syslog(LOG_INFO, "Opened %s - polling every %i seconds", ++ WATCH_DEVICE, BASE_INTERVAL); ++ ++ /* Install signal handler to halt watchdog on shutdown */ ++ sa.sa_handler = shutdown_watchdog; ++ sa.sa_flags = SA_NOCLDWAIT | SA_RESTART; ++ sigaction(SIGHUP, &sa, NULL); ++ sigaction(SIGINT, &sa, NULL); ++ sigaction(SIGPIPE, &sa, NULL); ++ sigaction(SIGTERM, &sa, NULL); ++ sigaction(SIGUSR1, &sa, NULL); ++ sigaction(SIGUSR2, &sa, NULL); ++ ++ /* Set watchdog timeout to twice the interval */ ++ ioctl(wdfd, WDIOC_SETTIMEOUT, &wdtimeout); ++ } ++ ++ /* Install signal handler to reap childs */ ++ sa.sa_handler = sigchld_handler; ++ sa.sa_flags = 0; ++ sigaction(SIGCHLD, &sa, NULL); ++ ++ /* Load watchdog configuration only once */ ++ procs = load_watchdog_uci(procs); ++ ++ while( 1 ) ++ { ++ /* Check/increment action interval */ ++ if( ++action_intv >= ACTION_INTERVAL ) ++ { ++ /* Reset action interval */ ++ action_intv = 0; ++ ++ /* Check average load */ ++ if( find_loadavg() >= LOAD_TRESHOLD ) ++ loadavg_panic++; ++ else ++ loadavg_panic = 0; ++ ++ /* Check wireless interfaces */ ++ ifs = load_wifi_uci(ifs, &wireless_modtime); ++ for( curr_if = ifs; curr_if; curr_if = curr_if->next ) ++ { ++ /* Get current channel and bssid */ ++ if( (iw_get_bssid(iwfd, curr_if->ifname, bssid) == 0) && ++ (iw_get_channel(iwfd, curr_if->ifname, &channel) == 0) ) ++ { ++ /* Check BSSID */ ++ if( strcasecmp(bssid, curr_if->bssid) != 0 ) ++ { ++ syslog(LOG_WARNING, "BSSID mismatch on %s: current=%s wanted=%s", ++ curr_if->ifname, bssid, curr_if->bssid); ++ ++ restart_wifi++; ++ } ++ ++ /* Check channel */ ++ else if( channel != curr_if->channel ) ++ { ++ syslog(LOG_WARNING, "Channel mismatch on %s: current=%d wanted=%d", ++ curr_if->ifname, channel, curr_if->channel); ++ ++ restart_wifi++; ++ } ++ } ++ else ++ { ++ syslog(LOG_WARNING, "Requested interface %s not present", curr_if->ifname); ++ } ++ } ++ ++ /* Check processes */ ++ for( curr_proc = procs; curr_proc; curr_proc = curr_proc->next ) ++ { ++ if( find_process(curr_proc->process) < 0 ) ++ curr_proc->restart++; ++ else ++ curr_proc->restart = 0; ++ ++ /* Process restart required? */ ++ if( curr_proc->restart >= HYSTERESIS ) ++ { ++ curr_proc->restart = 0; ++ syslog(LOG_WARNING, "The %s process died, restarting", curr_proc->process); ++ EXEC(PROC_ACTION); ++ } ++ } ++ ++ ++ /* Wifi restart required? */ ++ if( restart_wifi >= HYSTERESIS ) ++ { ++ restart_wifi = 0; ++ syslog(LOG_WARNING, "Channel or BSSID mismatch on wireless interface, restarting"); ++ EXEC(WIFI_ACTION); ++ } ++ ++ /* Is there a load problem? */ ++ if( loadavg_panic >= HYSTERESIS ) ++ { ++ syslog(LOG_EMERG, "Critical system load level, triggering reset!"); ++ ++ /* Try watchdog, fall back to reboot */ ++ if( wdfd > -1 ) ++ ioctl(wdfd, WDIOC_SETTIMEOUT, &wdtrigger); ++ else ++ EXEC(LOAD_ACTION); ++ } ++ } ++ ++ ++ /* Reset watchdog timer */ ++ if( wdfd > -1 ) ++ write(wdfd, &wdkeepalive, 1); ++ ++ sleep(BASE_INTERVAL); ++ } ++ ++ shutdown_watchdog(0); ++ closelog(); ++ ++ return 0; ++} ++ ++ ++int main(int argc, char *argv[]) ++{ ++ /* Check if watchdog is running ... */ ++ if( (argc > 1) && (strcmp(argv[1], "running") == 0) ) ++ { ++ return (find_process(BINARY) == -1); ++ } ++ ++ /* Start daemon */ ++ return do_daemon(); ++} +diff --git a/feeds/luci/contrib/package/freifunk-watchdog/src/watchdog.h b/feeds/luci/contrib/package/freifunk-watchdog/src/watchdog.h +new file mode 100644 +index 0000000..6f2382d +--- /dev/null ++++ b/feeds/luci/contrib/package/freifunk-watchdog/src/watchdog.h +@@ -0,0 +1,142 @@ ++/* ++ * 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. ++ * ++ * This program is distributed in the hope that it will be useful, ++ * but WITHOUT ANY WARRANTY; without even the implied warranty of ++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++ * GNU General Public License for more details. ++ * ++ * You should have received a copy of the GNU General Public License ++ * along with this program; if not, write to the Free Software ++ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. ++ * ++ * Copyright (C) 2009 Jo-Philipp Wich ++ */ ++ ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++ ++#include "ucix.h" ++#include "wireless.22.h" ++ ++ ++/* Watchdog poll interval */ ++#define BASE_INTERVAL 5 ++ ++/* Action interval (N * BASE_INTERVAL) */ ++#define ACTION_INTERVAL 6 ++ ++/* Hysteresis */ ++#define HYSTERESIS 3 ++ ++/* How to call myself in the logs */ ++#define SYSLOG_IDENT "Freifunk Watchdog" ++ ++/* Process error action */ ++#define PROC_ACTION curr_proc->initscript, curr_proc->initscript, "restart" ++ ++/* Wifi error action */ ++#define WIFI_ACTION "/sbin/wifi", "/sbin/wifi" ++ ++/* Watchdog device */ ++#define WATCH_DEVICE "/dev/watchdog" ++#define WATCH_SHUTDOWN 'V' ++#define WATCH_KEEPALIVE '\0' ++ ++/* System load error action and treshold */ ++#define LOAD_TRESHOLD 15.00 ++#define LOAD_ACTION "/sbin/reboot", "/sbin/reboot" ++ ++/* Fallback binary name (passed by makefile) */ ++#ifndef BINARY ++#define BINARY "ffwatchd" ++#endif ++ ++ ++/* ifname/bssid/channel tuples */ ++struct wifi_tuple { ++ char ifname[16]; ++ char bssid[18]; ++ int channel; ++ struct wifi_tuple *next; ++}; ++ ++/* structure to hold tuple-list and uci context during iteration */ ++struct uci_wifi_iface_itr_ctx { ++ struct wifi_tuple *list; ++ struct uci_context *ctx; ++}; ++ ++typedef struct wifi_tuple wifi_tuple_t; ++ ++ ++/* process name/exec tuples */ ++struct process_tuple { ++ char process[PATH_MAX + 1]; ++ char initscript[PATH_MAX + 1]; ++ int restart; ++ struct process_tuple *next; ++}; ++ ++/* structure to hold tuple-list and uci context during iteration */ ++struct uci_process_itr_ctx { ++ struct process_tuple *list; ++ struct uci_context *ctx; ++}; ++ ++typedef struct process_tuple process_tuple_t; ++ ++ ++/* ioctl() helper (stolen from iwlib) */ ++static inline int ++iw_ioctl(int skfd, /* Socket to the kernel */ ++ const char * ifname, /* Device name */ ++ int request, /* WE ID */ ++ struct iwreq * pwrq) /* Fixed part of the request */ ++{ ++ /* Set device name */ ++ strncpy(pwrq->ifr_ifrn.ifrn_name, ifname, 16); ++ ++ /* Do the request */ ++ return(ioctl(skfd, request, pwrq)); ++} ++ ++/* fork() & execl() helper */ ++#define EXEC(x) \ ++ do { \ ++ switch(fork()) \ ++ { \ ++ case -1: \ ++ syslog(LOG_CRIT, "Unable to fork child: %s", \ ++ strerror(errno)); \ ++ break; \ ++ \ ++ case 0: \ ++ execl(x, NULL); \ ++ syslog(LOG_CRIT, "Unable to execute action: %s", \ ++ strerror(errno)); \ ++ return 1; \ ++ } \ ++ } while(0) ++ +diff --git a/feeds/luci/contrib/package/freifunk-watchdog/src/wireless.22.h b/feeds/luci/contrib/package/freifunk-watchdog/src/wireless.22.h +new file mode 100644 +index 0000000..1d19243 +--- /dev/null ++++ b/feeds/luci/contrib/package/freifunk-watchdog/src/wireless.22.h +@@ -0,0 +1,1139 @@ ++/* ++ * This file define a set of standard wireless extensions ++ * ++ * Version : 22 16.3.07 ++ * ++ * Authors : Jean Tourrilhes - HPL - ++ * Copyright (c) 1997-2007 Jean Tourrilhes, All Rights Reserved. ++ */ ++ ++#ifndef _LINUX_WIRELESS_H ++#define _LINUX_WIRELESS_H ++ ++/************************** DOCUMENTATION **************************/ ++/* ++ * Initial APIs (1996 -> onward) : ++ * ----------------------------- ++ * Basically, the wireless extensions are for now a set of standard ioctl ++ * call + /proc/net/wireless ++ * ++ * The entry /proc/net/wireless give statistics and information on the ++ * driver. ++ * This is better than having each driver having its entry because ++ * its centralised and we may remove the driver module safely. ++ * ++ * Ioctl are used to configure the driver and issue commands. This is ++ * better than command line options of insmod because we may want to ++ * change dynamically (while the driver is running) some parameters. ++ * ++ * The ioctl mechanimsm are copied from standard devices ioctl. ++ * We have the list of command plus a structure descibing the ++ * data exchanged... ++ * Note that to add these ioctl, I was obliged to modify : ++ * # net/core/dev.c (two place + add include) ++ * # net/ipv4/af_inet.c (one place + add include) ++ * ++ * /proc/net/wireless is a copy of /proc/net/dev. ++ * We have a structure for data passed from the driver to /proc/net/wireless ++ * Too add this, I've modified : ++ * # net/core/dev.c (two other places) ++ * # include/linux/netdevice.h (one place) ++ * # include/linux/proc_fs.h (one place) ++ * ++ * New driver API (2002 -> onward) : ++ * ------------------------------- ++ * This file is only concerned with the user space API and common definitions. ++ * The new driver API is defined and documented in : ++ * # include/net/iw_handler.h ++ * ++ * Note as well that /proc/net/wireless implementation has now moved in : ++ * # net/core/wireless.c ++ * ++ * Wireless Events (2002 -> onward) : ++ * -------------------------------- ++ * Events are defined at the end of this file, and implemented in : ++ * # net/core/wireless.c ++ * ++ * Other comments : ++ * -------------- ++ * Do not add here things that are redundant with other mechanisms ++ * (drivers init, ifconfig, /proc/net/dev, ...) and with are not ++ * wireless specific. ++ * ++ * These wireless extensions are not magic : each driver has to provide ++ * support for them... ++ * ++ * IMPORTANT NOTE : As everything in the kernel, this is very much a ++ * work in progress. Contact me if you have ideas of improvements... ++ */ ++ ++/***************************** INCLUDES *****************************/ ++ ++/* This header is used in user-space, therefore need to be sanitised ++ * for that purpose. Those includes are usually not compatible with glibc. ++ * To know which includes to use in user-space, check iwlib.h. */ ++#ifdef __KERNEL__ ++#include /* for "caddr_t" et al */ ++#include /* for "struct sockaddr" et al */ ++#include /* for IFNAMSIZ and co... */ ++#endif /* __KERNEL__ */ ++ ++/***************************** VERSION *****************************/ ++/* ++ * This constant is used to know the availability of the wireless ++ * extensions and to know which version of wireless extensions it is ++ * (there is some stuff that will be added in the future...) ++ * I just plan to increment with each new version. ++ */ ++#define WIRELESS_EXT 22 ++ ++/* ++ * Changes : ++ * ++ * V2 to V3 ++ * -------- ++ * Alan Cox start some incompatibles changes. I've integrated a bit more. ++ * - Encryption renamed to Encode to avoid US regulation problems ++ * - Frequency changed from float to struct to avoid problems on old 386 ++ * ++ * V3 to V4 ++ * -------- ++ * - Add sensitivity ++ * ++ * V4 to V5 ++ * -------- ++ * - Missing encoding definitions in range ++ * - Access points stuff ++ * ++ * V5 to V6 ++ * -------- ++ * - 802.11 support (ESSID ioctls) ++ * ++ * V6 to V7 ++ * -------- ++ * - define IW_ESSID_MAX_SIZE and IW_MAX_AP ++ * ++ * V7 to V8 ++ * -------- ++ * - Changed my e-mail address ++ * - More 802.11 support (nickname, rate, rts, frag) ++ * - List index in frequencies ++ * ++ * V8 to V9 ++ * -------- ++ * - Support for 'mode of operation' (ad-hoc, managed...) ++ * - Support for unicast and multicast power saving ++ * - Change encoding to support larger tokens (>64 bits) ++ * - Updated iw_params (disable, flags) and use it for NWID ++ * - Extracted iw_point from iwreq for clarity ++ * ++ * V9 to V10 ++ * --------- ++ * - Add PM capability to range structure ++ * - Add PM modifier : MAX/MIN/RELATIVE ++ * - Add encoding option : IW_ENCODE_NOKEY ++ * - Add TxPower ioctls (work like TxRate) ++ * ++ * V10 to V11 ++ * ---------- ++ * - Add WE version in range (help backward/forward compatibility) ++ * - Add retry ioctls (work like PM) ++ * ++ * V11 to V12 ++ * ---------- ++ * - Add SIOCSIWSTATS to get /proc/net/wireless programatically ++ * - Add DEV PRIVATE IOCTL to avoid collisions in SIOCDEVPRIVATE space ++ * - Add new statistics (frag, retry, beacon) ++ * - Add average quality (for user space calibration) ++ * ++ * V12 to V13 ++ * ---------- ++ * - Document creation of new driver API. ++ * - Extract union iwreq_data from struct iwreq (for new driver API). ++ * - Rename SIOCSIWNAME as SIOCSIWCOMMIT ++ * ++ * V13 to V14 ++ * ---------- ++ * - Wireless Events support : define struct iw_event ++ * - Define additional specific event numbers ++ * - Add "addr" and "param" fields in union iwreq_data ++ * - AP scanning stuff (SIOCSIWSCAN and friends) ++ * ++ * V14 to V15 ++ * ---------- ++ * - Add IW_PRIV_TYPE_ADDR for struct sockaddr private arg ++ * - Make struct iw_freq signed (both m & e), add explicit padding ++ * - Add IWEVCUSTOM for driver specific event/scanning token ++ * - Add IW_MAX_GET_SPY for driver returning a lot of addresses ++ * - Add IW_TXPOW_RANGE for range of Tx Powers ++ * - Add IWEVREGISTERED & IWEVEXPIRED events for Access Points ++ * - Add IW_MODE_MONITOR for passive monitor ++ * ++ * V15 to V16 ++ * ---------- ++ * - Increase the number of bitrates in iw_range to 32 (for 802.11g) ++ * - Increase the number of frequencies in iw_range to 32 (for 802.11b+a) ++ * - Reshuffle struct iw_range for increases, add filler ++ * - Increase IW_MAX_AP to 64 for driver returning a lot of addresses ++ * - Remove IW_MAX_GET_SPY because conflict with enhanced spy support ++ * - Add SIOCSIWTHRSPY/SIOCGIWTHRSPY and "struct iw_thrspy" ++ * - Add IW_ENCODE_TEMP and iw_range->encoding_login_index ++ * ++ * V16 to V17 ++ * ---------- ++ * - Add flags to frequency -> auto/fixed ++ * - Document (struct iw_quality *)->updated, add new flags (INVALID) ++ * - Wireless Event capability in struct iw_range ++ * - Add support for relative TxPower (yick !) ++ * ++ * V17 to V18 (From Jouni Malinen ) ++ * ---------- ++ * - Add support for WPA/WPA2 ++ * - Add extended encoding configuration (SIOCSIWENCODEEXT and ++ * SIOCGIWENCODEEXT) ++ * - Add SIOCSIWGENIE/SIOCGIWGENIE ++ * - Add SIOCSIWMLME ++ * - Add SIOCSIWPMKSA ++ * - Add struct iw_range bit field for supported encoding capabilities ++ * - Add optional scan request parameters for SIOCSIWSCAN ++ * - Add SIOCSIWAUTH/SIOCGIWAUTH for setting authentication and WPA ++ * related parameters (extensible up to 4096 parameter values) ++ * - Add wireless events: IWEVGENIE, IWEVMICHAELMICFAILURE, ++ * IWEVASSOCREQIE, IWEVASSOCRESPIE, IWEVPMKIDCAND ++ * ++ * V18 to V19 ++ * ---------- ++ * - Remove (struct iw_point *)->pointer from events and streams ++ * - Remove header includes to help user space ++ * - Increase IW_ENCODING_TOKEN_MAX from 32 to 64 ++ * - Add IW_QUAL_ALL_UPDATED and IW_QUAL_ALL_INVALID macros ++ * - Add explicit flag to tell stats are in dBm : IW_QUAL_DBM ++ * - Add IW_IOCTL_IDX() and IW_EVENT_IDX() macros ++ * ++ * V19 to V20 ++ * ---------- ++ * - RtNetlink requests support (SET/GET) ++ * ++ * V20 to V21 ++ * ---------- ++ * - Remove (struct net_device *)->get_wireless_stats() ++ * - Change length in ESSID and NICK to strlen() instead of strlen()+1 ++ * - Add IW_RETRY_SHORT/IW_RETRY_LONG retry modifiers ++ * - Power/Retry relative values no longer * 100000 ++ * - Add explicit flag to tell stats are in 802.11k RCPI : IW_QUAL_RCPI ++ * ++ * V21 to V22 ++ * ---------- ++ * - Prevent leaking of kernel space in stream on 64 bits. ++ */ ++ ++/**************************** CONSTANTS ****************************/ ++ ++/* -------------------------- IOCTL LIST -------------------------- */ ++ ++/* Wireless Identification */ ++#define SIOCSIWCOMMIT 0x8B00 /* Commit pending changes to driver */ ++#define SIOCGIWNAME 0x8B01 /* get name == wireless protocol */ ++/* SIOCGIWNAME is used to verify the presence of Wireless Extensions. ++ * Common values : "IEEE 802.11-DS", "IEEE 802.11-FH", "IEEE 802.11b"... ++ * Don't put the name of your driver there, it's useless. */ ++ ++/* Basic operations */ ++#define SIOCSIWNWID 0x8B02 /* set network id (pre-802.11) */ ++#define SIOCGIWNWID 0x8B03 /* get network id (the cell) */ ++#define SIOCSIWFREQ 0x8B04 /* set channel/frequency (Hz) */ ++#define SIOCGIWFREQ 0x8B05 /* get channel/frequency (Hz) */ ++#define SIOCSIWMODE 0x8B06 /* set operation mode */ ++#define SIOCGIWMODE 0x8B07 /* get operation mode */ ++#define SIOCSIWSENS 0x8B08 /* set sensitivity (dBm) */ ++#define SIOCGIWSENS 0x8B09 /* get sensitivity (dBm) */ ++ ++/* Informative stuff */ ++#define SIOCSIWRANGE 0x8B0A /* Unused */ ++#define SIOCGIWRANGE 0x8B0B /* Get range of parameters */ ++#define SIOCSIWPRIV 0x8B0C /* Unused */ ++#define SIOCGIWPRIV 0x8B0D /* get private ioctl interface info */ ++#define SIOCSIWSTATS 0x8B0E /* Unused */ ++#define SIOCGIWSTATS 0x8B0F /* Get /proc/net/wireless stats */ ++/* SIOCGIWSTATS is strictly used between user space and the kernel, and ++ * is never passed to the driver (i.e. the driver will never see it). */ ++ ++/* Spy support (statistics per MAC address - used for Mobile IP support) */ ++#define SIOCSIWSPY 0x8B10 /* set spy addresses */ ++#define SIOCGIWSPY 0x8B11 /* get spy info (quality of link) */ ++#define SIOCSIWTHRSPY 0x8B12 /* set spy threshold (spy event) */ ++#define SIOCGIWTHRSPY 0x8B13 /* get spy threshold */ ++ ++/* Access Point manipulation */ ++#define SIOCSIWAP 0x8B14 /* set access point MAC addresses */ ++#define SIOCGIWAP 0x8B15 /* get access point MAC addresses */ ++#define SIOCGIWAPLIST 0x8B17 /* Deprecated in favor of scanning */ ++#define SIOCSIWSCAN 0x8B18 /* trigger scanning (list cells) */ ++#define SIOCGIWSCAN 0x8B19 /* get scanning results */ ++ ++/* 802.11 specific support */ ++#define SIOCSIWESSID 0x8B1A /* set ESSID (network name) */ ++#define SIOCGIWESSID 0x8B1B /* get ESSID */ ++#define SIOCSIWNICKN 0x8B1C /* set node name/nickname */ ++#define SIOCGIWNICKN 0x8B1D /* get node name/nickname */ ++/* As the ESSID and NICKN are strings up to 32 bytes long, it doesn't fit ++ * within the 'iwreq' structure, so we need to use the 'data' member to ++ * point to a string in user space, like it is done for RANGE... */ ++ ++/* Other parameters useful in 802.11 and some other devices */ ++#define SIOCSIWRATE 0x8B20 /* set default bit rate (bps) */ ++#define SIOCGIWRATE 0x8B21 /* get default bit rate (bps) */ ++#define SIOCSIWRTS 0x8B22 /* set RTS/CTS threshold (bytes) */ ++#define SIOCGIWRTS 0x8B23 /* get RTS/CTS threshold (bytes) */ ++#define SIOCSIWFRAG 0x8B24 /* set fragmentation thr (bytes) */ ++#define SIOCGIWFRAG 0x8B25 /* get fragmentation thr (bytes) */ ++#define SIOCSIWTXPOW 0x8B26 /* set transmit power (dBm) */ ++#define SIOCGIWTXPOW 0x8B27 /* get transmit power (dBm) */ ++#define SIOCSIWRETRY 0x8B28 /* set retry limits and lifetime */ ++#define SIOCGIWRETRY 0x8B29 /* get retry limits and lifetime */ ++ ++/* Encoding stuff (scrambling, hardware security, WEP...) */ ++#define SIOCSIWENCODE 0x8B2A /* set encoding token & mode */ ++#define SIOCGIWENCODE 0x8B2B /* get encoding token & mode */ ++/* Power saving stuff (power management, unicast and multicast) */ ++#define SIOCSIWPOWER 0x8B2C /* set Power Management settings */ ++#define SIOCGIWPOWER 0x8B2D /* get Power Management settings */ ++/* Modulation bitmask */ ++#define SIOCSIWMODUL 0x8B2E /* set Modulations settings */ ++#define SIOCGIWMODUL 0x8B2F /* get Modulations settings */ ++ ++/* WPA : Generic IEEE 802.11 informatiom element (e.g., for WPA/RSN/WMM). ++ * This ioctl uses struct iw_point and data buffer that includes IE id and len ++ * fields. More than one IE may be included in the request. Setting the generic ++ * IE to empty buffer (len=0) removes the generic IE from the driver. Drivers ++ * are allowed to generate their own WPA/RSN IEs, but in these cases, drivers ++ * are required to report the used IE as a wireless event, e.g., when ++ * associating with an AP. */ ++#define SIOCSIWGENIE 0x8B30 /* set generic IE */ ++#define SIOCGIWGENIE 0x8B31 /* get generic IE */ ++ ++/* WPA : IEEE 802.11 MLME requests */ ++#define SIOCSIWMLME 0x8B16 /* request MLME operation; uses ++ * struct iw_mlme */ ++/* WPA : Authentication mode parameters */ ++#define SIOCSIWAUTH 0x8B32 /* set authentication mode params */ ++#define SIOCGIWAUTH 0x8B33 /* get authentication mode params */ ++ ++/* WPA : Extended version of encoding configuration */ ++#define SIOCSIWENCODEEXT 0x8B34 /* set encoding token & mode */ ++#define SIOCGIWENCODEEXT 0x8B35 /* get encoding token & mode */ ++ ++/* WPA2 : PMKSA cache management */ ++#define SIOCSIWPMKSA 0x8B36 /* PMKSA cache operation */ ++ ++/* -------------------- DEV PRIVATE IOCTL LIST -------------------- */ ++ ++/* These 32 ioctl are wireless device private, for 16 commands. ++ * Each driver is free to use them for whatever purpose it chooses, ++ * however the driver *must* export the description of those ioctls ++ * with SIOCGIWPRIV and *must* use arguments as defined below. ++ * If you don't follow those rules, DaveM is going to hate you (reason : ++ * it make mixed 32/64bit operation impossible). ++ */ ++#define SIOCIWFIRSTPRIV 0x8BE0 ++#define SIOCIWLASTPRIV 0x8BFF ++/* Previously, we were using SIOCDEVPRIVATE, but we now have our ++ * separate range because of collisions with other tools such as ++ * 'mii-tool'. ++ * We now have 32 commands, so a bit more space ;-). ++ * Also, all 'even' commands are only usable by root and don't return the ++ * content of ifr/iwr to user (but you are not obliged to use the set/get ++ * convention, just use every other two command). More details in iwpriv.c. ++ * And I repeat : you are not forced to use them with iwpriv, but you ++ * must be compliant with it. ++ */ ++ ++/* ------------------------- IOCTL STUFF ------------------------- */ ++ ++/* The first and the last (range) */ ++#define SIOCIWFIRST 0x8B00 ++#define SIOCIWLAST SIOCIWLASTPRIV /* 0x8BFF */ ++#define IW_IOCTL_IDX(cmd) ((cmd) - SIOCIWFIRST) ++ ++/* Odd : get (world access), even : set (root access) */ ++#define IW_IS_SET(cmd) (!((cmd) & 0x1)) ++#define IW_IS_GET(cmd) ((cmd) & 0x1) ++ ++/* ----------------------- WIRELESS EVENTS ----------------------- */ ++/* Those are *NOT* ioctls, do not issue request on them !!! */ ++/* Most events use the same identifier as ioctl requests */ ++ ++#define IWEVTXDROP 0x8C00 /* Packet dropped to excessive retry */ ++#define IWEVQUAL 0x8C01 /* Quality part of statistics (scan) */ ++#define IWEVCUSTOM 0x8C02 /* Driver specific ascii string */ ++#define IWEVREGISTERED 0x8C03 /* Discovered a new node (AP mode) */ ++#define IWEVEXPIRED 0x8C04 /* Expired a node (AP mode) */ ++#define IWEVGENIE 0x8C05 /* Generic IE (WPA, RSN, WMM, ..) ++ * (scan results); This includes id and ++ * length fields. One IWEVGENIE may ++ * contain more than one IE. Scan ++ * results may contain one or more ++ * IWEVGENIE events. */ ++#define IWEVMICHAELMICFAILURE 0x8C06 /* Michael MIC failure ++ * (struct iw_michaelmicfailure) ++ */ ++#define IWEVASSOCREQIE 0x8C07 /* IEs used in (Re)Association Request. ++ * The data includes id and length ++ * fields and may contain more than one ++ * IE. This event is required in ++ * Managed mode if the driver ++ * generates its own WPA/RSN IE. This ++ * should be sent just before ++ * IWEVREGISTERED event for the ++ * association. */ ++#define IWEVASSOCRESPIE 0x8C08 /* IEs used in (Re)Association ++ * Response. The data includes id and ++ * length fields and may contain more ++ * than one IE. This may be sent ++ * between IWEVASSOCREQIE and ++ * IWEVREGISTERED events for the ++ * association. */ ++#define IWEVPMKIDCAND 0x8C09 /* PMKID candidate for RSN ++ * pre-authentication ++ * (struct iw_pmkid_cand) */ ++ ++#define IWEVFIRST 0x8C00 ++#define IW_EVENT_IDX(cmd) ((cmd) - IWEVFIRST) ++ ++/* ------------------------- PRIVATE INFO ------------------------- */ ++/* ++ * The following is used with SIOCGIWPRIV. It allow a driver to define ++ * the interface (name, type of data) for its private ioctl. ++ * Privates ioctl are SIOCIWFIRSTPRIV -> SIOCIWLASTPRIV ++ */ ++ ++#define IW_PRIV_TYPE_MASK 0x7000 /* Type of arguments */ ++#define IW_PRIV_TYPE_NONE 0x0000 ++#define IW_PRIV_TYPE_BYTE 0x1000 /* Char as number */ ++#define IW_PRIV_TYPE_CHAR 0x2000 /* Char as character */ ++#define IW_PRIV_TYPE_INT 0x4000 /* 32 bits int */ ++#define IW_PRIV_TYPE_FLOAT 0x5000 /* struct iw_freq */ ++#define IW_PRIV_TYPE_ADDR 0x6000 /* struct sockaddr */ ++ ++#define IW_PRIV_SIZE_FIXED 0x0800 /* Variable or fixed number of args */ ++ ++#define IW_PRIV_SIZE_MASK 0x07FF /* Max number of those args */ ++ ++/* ++ * Note : if the number of args is fixed and the size < 16 octets, ++ * instead of passing a pointer we will put args in the iwreq struct... ++ */ ++ ++/* ----------------------- OTHER CONSTANTS ----------------------- */ ++ ++/* Maximum frequencies in the range struct */ ++#define IW_MAX_FREQUENCIES 32 ++/* Note : if you have something like 80 frequencies, ++ * don't increase this constant and don't fill the frequency list. ++ * The user will be able to set by channel anyway... */ ++ ++/* Maximum bit rates in the range struct */ ++#define IW_MAX_BITRATES 32 ++ ++/* Maximum tx powers in the range struct */ ++#define IW_MAX_TXPOWER 8 ++/* Note : if you more than 8 TXPowers, just set the max and min or ++ * a few of them in the struct iw_range. */ ++ ++/* Maximum of address that you may set with SPY */ ++#define IW_MAX_SPY 8 ++ ++/* Maximum of address that you may get in the ++ list of access points in range */ ++#define IW_MAX_AP 64 ++ ++/* Maximum size of the ESSID and NICKN strings */ ++#define IW_ESSID_MAX_SIZE 32 ++ ++/* Modes of operation */ ++#define IW_MODE_AUTO 0 /* Let the driver decides */ ++#define IW_MODE_ADHOC 1 /* Single cell network */ ++#define IW_MODE_INFRA 2 /* Multi cell network, roaming, ... */ ++#define IW_MODE_MASTER 3 /* Synchronisation master or Access Point */ ++#define IW_MODE_REPEAT 4 /* Wireless Repeater (forwarder) */ ++#define IW_MODE_SECOND 5 /* Secondary master/repeater (backup) */ ++#define IW_MODE_MONITOR 6 /* Passive monitor (listen only) */ ++ ++/* Statistics flags (bitmask in updated) */ ++#define IW_QUAL_QUAL_UPDATED 0x01 /* Value was updated since last read */ ++#define IW_QUAL_LEVEL_UPDATED 0x02 ++#define IW_QUAL_NOISE_UPDATED 0x04 ++#define IW_QUAL_ALL_UPDATED 0x07 ++#define IW_QUAL_DBM 0x08 /* Level + Noise are dBm */ ++#define IW_QUAL_QUAL_INVALID 0x10 /* Driver doesn't provide value */ ++#define IW_QUAL_LEVEL_INVALID 0x20 ++#define IW_QUAL_NOISE_INVALID 0x40 ++#define IW_QUAL_RCPI 0x80 /* Level + Noise are 802.11k RCPI */ ++#define IW_QUAL_ALL_INVALID 0x70 ++ ++/* Frequency flags */ ++#define IW_FREQ_AUTO 0x00 /* Let the driver decides */ ++#define IW_FREQ_FIXED 0x01 /* Force a specific value */ ++ ++/* Maximum number of size of encoding token available ++ * they are listed in the range structure */ ++#define IW_MAX_ENCODING_SIZES 8 ++ ++/* Maximum size of the encoding token in bytes */ ++#define IW_ENCODING_TOKEN_MAX 64 /* 512 bits (for now) */ ++ ++/* Flags for encoding (along with the token) */ ++#define IW_ENCODE_INDEX 0x00FF /* Token index (if needed) */ ++#define IW_ENCODE_FLAGS 0xFF00 /* Flags defined below */ ++#define IW_ENCODE_MODE 0xF000 /* Modes defined below */ ++#define IW_ENCODE_DISABLED 0x8000 /* Encoding disabled */ ++#define IW_ENCODE_ENABLED 0x0000 /* Encoding enabled */ ++#define IW_ENCODE_RESTRICTED 0x4000 /* Refuse non-encoded packets */ ++#define IW_ENCODE_OPEN 0x2000 /* Accept non-encoded packets */ ++#define IW_ENCODE_NOKEY 0x0800 /* Key is write only, so not present */ ++#define IW_ENCODE_TEMP 0x0400 /* Temporary key */ ++ ++/* Power management flags available (along with the value, if any) */ ++#define IW_POWER_ON 0x0000 /* No details... */ ++#define IW_POWER_TYPE 0xF000 /* Type of parameter */ ++#define IW_POWER_PERIOD 0x1000 /* Value is a period/duration of */ ++#define IW_POWER_TIMEOUT 0x2000 /* Value is a timeout (to go asleep) */ ++#define IW_POWER_SAVING 0x4000 /* Value is relative (how aggressive)*/ ++#define IW_POWER_MODE 0x0F00 /* Power Management mode */ ++#define IW_POWER_UNICAST_R 0x0100 /* Receive only unicast messages */ ++#define IW_POWER_MULTICAST_R 0x0200 /* Receive only multicast messages */ ++#define IW_POWER_ALL_R 0x0300 /* Receive all messages though PM */ ++#define IW_POWER_FORCE_S 0x0400 /* Force PM procedure for sending unicast */ ++#define IW_POWER_REPEATER 0x0800 /* Repeat broadcast messages in PM period */ ++#define IW_POWER_MODIFIER 0x000F /* Modify a parameter */ ++#define IW_POWER_MIN 0x0001 /* Value is a minimum */ ++#define IW_POWER_MAX 0x0002 /* Value is a maximum */ ++#define IW_POWER_RELATIVE 0x0004 /* Value is not in seconds/ms/us */ ++ ++/* Transmit Power flags available */ ++#define IW_TXPOW_TYPE 0x00FF /* Type of value */ ++#define IW_TXPOW_DBM 0x0000 /* Value is in dBm */ ++#define IW_TXPOW_MWATT 0x0001 /* Value is in mW */ ++#define IW_TXPOW_RELATIVE 0x0002 /* Value is in arbitrary units */ ++#define IW_TXPOW_RANGE 0x1000 /* Range of value between min/max */ ++ ++/* Retry limits and lifetime flags available */ ++#define IW_RETRY_ON 0x0000 /* No details... */ ++#define IW_RETRY_TYPE 0xF000 /* Type of parameter */ ++#define IW_RETRY_LIMIT 0x1000 /* Maximum number of retries*/ ++#define IW_RETRY_LIFETIME 0x2000 /* Maximum duration of retries in us */ ++#define IW_RETRY_MODIFIER 0x00FF /* Modify a parameter */ ++#define IW_RETRY_MIN 0x0001 /* Value is a minimum */ ++#define IW_RETRY_MAX 0x0002 /* Value is a maximum */ ++#define IW_RETRY_RELATIVE 0x0004 /* Value is not in seconds/ms/us */ ++#define IW_RETRY_SHORT 0x0010 /* Value is for short packets */ ++#define IW_RETRY_LONG 0x0020 /* Value is for long packets */ ++ ++/* Scanning request flags */ ++#define IW_SCAN_DEFAULT 0x0000 /* Default scan of the driver */ ++#define IW_SCAN_ALL_ESSID 0x0001 /* Scan all ESSIDs */ ++#define IW_SCAN_THIS_ESSID 0x0002 /* Scan only this ESSID */ ++#define IW_SCAN_ALL_FREQ 0x0004 /* Scan all Frequencies */ ++#define IW_SCAN_THIS_FREQ 0x0008 /* Scan only this Frequency */ ++#define IW_SCAN_ALL_MODE 0x0010 /* Scan all Modes */ ++#define IW_SCAN_THIS_MODE 0x0020 /* Scan only this Mode */ ++#define IW_SCAN_ALL_RATE 0x0040 /* Scan all Bit-Rates */ ++#define IW_SCAN_THIS_RATE 0x0080 /* Scan only this Bit-Rate */ ++/* struct iw_scan_req scan_type */ ++#define IW_SCAN_TYPE_ACTIVE 0 ++#define IW_SCAN_TYPE_PASSIVE 1 ++/* Maximum size of returned data */ ++#define IW_SCAN_MAX_DATA 4096 /* In bytes */ ++ ++/* Max number of char in custom event - use multiple of them if needed */ ++#define IW_CUSTOM_MAX 256 /* In bytes */ ++ ++/* Generic information element */ ++#define IW_GENERIC_IE_MAX 1024 ++ ++/* MLME requests (SIOCSIWMLME / struct iw_mlme) */ ++#define IW_MLME_DEAUTH 0 ++#define IW_MLME_DISASSOC 1 ++#define IW_MLME_AUTH 2 ++#define IW_MLME_ASSOC 3 ++ ++/* SIOCSIWAUTH/SIOCGIWAUTH struct iw_param flags */ ++#define IW_AUTH_INDEX 0x0FFF ++#define IW_AUTH_FLAGS 0xF000 ++/* SIOCSIWAUTH/SIOCGIWAUTH parameters (0 .. 4095) ++ * (IW_AUTH_INDEX mask in struct iw_param flags; this is the index of the ++ * parameter that is being set/get to; value will be read/written to ++ * struct iw_param value field) */ ++#define IW_AUTH_WPA_VERSION 0 ++#define IW_AUTH_CIPHER_PAIRWISE 1 ++#define IW_AUTH_CIPHER_GROUP 2 ++#define IW_AUTH_KEY_MGMT 3 ++#define IW_AUTH_TKIP_COUNTERMEASURES 4 ++#define IW_AUTH_DROP_UNENCRYPTED 5 ++#define IW_AUTH_80211_AUTH_ALG 6 ++#define IW_AUTH_WPA_ENABLED 7 ++#define IW_AUTH_RX_UNENCRYPTED_EAPOL 8 ++#define IW_AUTH_ROAMING_CONTROL 9 ++#define IW_AUTH_PRIVACY_INVOKED 10 ++ ++/* IW_AUTH_WPA_VERSION values (bit field) */ ++#define IW_AUTH_WPA_VERSION_DISABLED 0x00000001 ++#define IW_AUTH_WPA_VERSION_WPA 0x00000002 ++#define IW_AUTH_WPA_VERSION_WPA2 0x00000004 ++ ++/* IW_AUTH_PAIRWISE_CIPHER and IW_AUTH_GROUP_CIPHER values (bit field) */ ++#define IW_AUTH_CIPHER_NONE 0x00000001 ++#define IW_AUTH_CIPHER_WEP40 0x00000002 ++#define IW_AUTH_CIPHER_TKIP 0x00000004 ++#define IW_AUTH_CIPHER_CCMP 0x00000008 ++#define IW_AUTH_CIPHER_WEP104 0x00000010 ++ ++/* IW_AUTH_KEY_MGMT values (bit field) */ ++#define IW_AUTH_KEY_MGMT_802_1X 1 ++#define IW_AUTH_KEY_MGMT_PSK 2 ++ ++/* IW_AUTH_80211_AUTH_ALG values (bit field) */ ++#define IW_AUTH_ALG_OPEN_SYSTEM 0x00000001 ++#define IW_AUTH_ALG_SHARED_KEY 0x00000002 ++#define IW_AUTH_ALG_LEAP 0x00000004 ++ ++/* IW_AUTH_ROAMING_CONTROL values */ ++#define IW_AUTH_ROAMING_ENABLE 0 /* driver/firmware based roaming */ ++#define IW_AUTH_ROAMING_DISABLE 1 /* user space program used for roaming ++ * control */ ++ ++/* SIOCSIWENCODEEXT definitions */ ++#define IW_ENCODE_SEQ_MAX_SIZE 8 ++/* struct iw_encode_ext ->alg */ ++#define IW_ENCODE_ALG_NONE 0 ++#define IW_ENCODE_ALG_WEP 1 ++#define IW_ENCODE_ALG_TKIP 2 ++#define IW_ENCODE_ALG_CCMP 3 ++/* struct iw_encode_ext ->ext_flags */ ++#define IW_ENCODE_EXT_TX_SEQ_VALID 0x00000001 ++#define IW_ENCODE_EXT_RX_SEQ_VALID 0x00000002 ++#define IW_ENCODE_EXT_GROUP_KEY 0x00000004 ++#define IW_ENCODE_EXT_SET_TX_KEY 0x00000008 ++ ++/* IWEVMICHAELMICFAILURE : struct iw_michaelmicfailure ->flags */ ++#define IW_MICFAILURE_KEY_ID 0x00000003 /* Key ID 0..3 */ ++#define IW_MICFAILURE_GROUP 0x00000004 ++#define IW_MICFAILURE_PAIRWISE 0x00000008 ++#define IW_MICFAILURE_STAKEY 0x00000010 ++#define IW_MICFAILURE_COUNT 0x00000060 /* 1 or 2 (0 = count not supported) ++ */ ++ ++/* Bit field values for enc_capa in struct iw_range */ ++#define IW_ENC_CAPA_WPA 0x00000001 ++#define IW_ENC_CAPA_WPA2 0x00000002 ++#define IW_ENC_CAPA_CIPHER_TKIP 0x00000004 ++#define IW_ENC_CAPA_CIPHER_CCMP 0x00000008 ++ ++/* Event capability macros - in (struct iw_range *)->event_capa ++ * Because we have more than 32 possible events, we use an array of ++ * 32 bit bitmasks. Note : 32 bits = 0x20 = 2^5. */ ++#define IW_EVENT_CAPA_BASE(cmd) ((cmd >= SIOCIWFIRSTPRIV) ? \ ++ (cmd - SIOCIWFIRSTPRIV + 0x60) : \ ++ (cmd - SIOCSIWCOMMIT)) ++#define IW_EVENT_CAPA_INDEX(cmd) (IW_EVENT_CAPA_BASE(cmd) >> 5) ++#define IW_EVENT_CAPA_MASK(cmd) (1 << (IW_EVENT_CAPA_BASE(cmd) & 0x1F)) ++/* Event capability constants - event autogenerated by the kernel ++ * This list is valid for most 802.11 devices, customise as needed... */ ++#define IW_EVENT_CAPA_K_0 (IW_EVENT_CAPA_MASK(0x8B04) | \ ++ IW_EVENT_CAPA_MASK(0x8B06) | \ ++ IW_EVENT_CAPA_MASK(0x8B1A)) ++#define IW_EVENT_CAPA_K_1 (IW_EVENT_CAPA_MASK(0x8B2A)) ++/* "Easy" macro to set events in iw_range (less efficient) */ ++#define IW_EVENT_CAPA_SET(event_capa, cmd) (event_capa[IW_EVENT_CAPA_INDEX(cmd)] |= IW_EVENT_CAPA_MASK(cmd)) ++#define IW_EVENT_CAPA_SET_KERNEL(event_capa) {event_capa[0] |= IW_EVENT_CAPA_K_0; event_capa[1] |= IW_EVENT_CAPA_K_1; } ++ ++/* Modulations bitmasks */ ++#define IW_MODUL_ALL 0x00000000 /* Everything supported */ ++#define IW_MODUL_FH 0x00000001 /* Frequency Hopping */ ++#define IW_MODUL_DS 0x00000002 /* Original Direct Sequence */ ++#define IW_MODUL_CCK 0x00000004 /* 802.11b : 5.5 + 11 Mb/s */ ++#define IW_MODUL_11B (IW_MODUL_DS | IW_MODUL_CCK) ++#define IW_MODUL_PBCC 0x00000008 /* TI : 5.5 + 11 + 22 Mb/s */ ++#define IW_MODUL_OFDM_A 0x00000010 /* 802.11a : 54 Mb/s */ ++#define IW_MODUL_11A (IW_MODUL_OFDM_A) ++#define IW_MODUL_11AB (IW_MODUL_11B | IW_MODUL_11A) ++#define IW_MODUL_OFDM_G 0x00000020 /* 802.11g : 54 Mb/s */ ++#define IW_MODUL_11G (IW_MODUL_11B | IW_MODUL_OFDM_G) ++#define IW_MODUL_11AG (IW_MODUL_11G | IW_MODUL_11A) ++#define IW_MODUL_TURBO 0x00000040 /* ATH : bonding, 108 Mb/s */ ++/* In here we should define MIMO stuff. Later... */ ++#define IW_MODUL_CUSTOM 0x40000000 /* Driver specific */ ++ ++/* Bitrate flags available */ ++#define IW_BITRATE_TYPE 0x00FF /* Type of value */ ++#define IW_BITRATE_UNICAST 0x0001 /* Maximum/Fixed unicast bitrate */ ++#define IW_BITRATE_BROADCAST 0x0002 /* Fixed broadcast bitrate */ ++ ++/****************************** TYPES ******************************/ ++ ++/* --------------------------- SUBTYPES --------------------------- */ ++/* ++ * Generic format for most parameters that fit in an int ++ */ ++struct iw_param ++{ ++ int32_t value; /* The value of the parameter itself */ ++ uint8_t fixed; /* Hardware should not use auto select */ ++ uint8_t disabled; /* Disable the feature */ ++ uint16_t flags; /* Various specifc flags (if any) */ ++}; ++ ++/* ++ * For all data larger than 16 octets, we need to use a ++ * pointer to memory allocated in user space. ++ */ ++struct iw_point ++{ ++ void *pointer; /* Pointer to the data (in user space) */ ++ uint16_t length; /* number of fields or size in bytes */ ++ uint16_t flags; /* Optional params */ ++}; ++ ++/* ++ * A frequency ++ * For numbers lower than 10^9, we encode the number in 'm' and ++ * set 'e' to 0 ++ * For number greater than 10^9, we divide it by the lowest power ++ * of 10 to get 'm' lower than 10^9, with 'm'= f / (10^'e')... ++ * The power of 10 is in 'e', the result of the division is in 'm'. ++ */ ++struct iw_freq ++{ ++ int32_t m; /* Mantissa */ ++ int16_t e; /* Exponent */ ++ uint8_t i; /* List index (when in range struct) */ ++ uint8_t flags; /* Flags (fixed/auto) */ ++}; ++ ++/* ++ * Quality of the link ++ */ ++struct iw_quality ++{ ++ uint8_t qual; /* link quality (%retries, SNR, ++ %missed beacons or better...) */ ++ uint8_t level; /* signal level (dBm) */ ++ uint8_t noise; /* noise level (dBm) */ ++ uint8_t updated; /* Flags to know if updated */ ++}; ++ ++/* ++ * Packet discarded in the wireless adapter due to ++ * "wireless" specific problems... ++ * Note : the list of counter and statistics in net_device_stats ++ * is already pretty exhaustive, and you should use that first. ++ * This is only additional stats... ++ */ ++struct iw_discarded ++{ ++ uint32_t nwid; /* Rx : Wrong nwid/essid */ ++ uint32_t code; /* Rx : Unable to code/decode (WEP) */ ++ uint32_t fragment; /* Rx : Can't perform MAC reassembly */ ++ uint32_t retries; /* Tx : Max MAC retries num reached */ ++ uint32_t misc; /* Others cases */ ++}; ++ ++/* ++ * Packet/Time period missed in the wireless adapter due to ++ * "wireless" specific problems... ++ */ ++struct iw_missed ++{ ++ uint32_t beacon; /* Missed beacons/superframe */ ++}; ++ ++/* ++ * Quality range (for spy threshold) ++ */ ++struct iw_thrspy ++{ ++ struct sockaddr addr; /* Source address (hw/mac) */ ++ struct iw_quality qual; /* Quality of the link */ ++ struct iw_quality low; /* Low threshold */ ++ struct iw_quality high; /* High threshold */ ++}; ++ ++/* ++ * Optional data for scan request ++ * ++ * Note: these optional parameters are controlling parameters for the ++ * scanning behavior, these do not apply to getting scan results ++ * (SIOCGIWSCAN). Drivers are expected to keep a local BSS table and ++ * provide a merged results with all BSSes even if the previous scan ++ * request limited scanning to a subset, e.g., by specifying an SSID. ++ * Especially, scan results are required to include an entry for the ++ * current BSS if the driver is in Managed mode and associated with an AP. ++ */ ++struct iw_scan_req ++{ ++ uint8_t scan_type; /* IW_SCAN_TYPE_{ACTIVE,PASSIVE} */ ++ uint8_t essid_len; ++ uint8_t num_channels; /* num entries in channel_list; ++ * 0 = scan all allowed channels */ ++ uint8_t flags; /* reserved as padding; use zero, this may ++ * be used in the future for adding flags ++ * to request different scan behavior */ ++ struct sockaddr bssid; /* ff:ff:ff:ff:ff:ff for broadcast BSSID or ++ * individual address of a specific BSS */ ++ ++ /* ++ * Use this ESSID if IW_SCAN_THIS_ESSID flag is used instead of using ++ * the current ESSID. This allows scan requests for specific ESSID ++ * without having to change the current ESSID and potentially breaking ++ * the current association. ++ */ ++ uint8_t essid[IW_ESSID_MAX_SIZE]; ++ ++ /* ++ * Optional parameters for changing the default scanning behavior. ++ * These are based on the MLME-SCAN.request from IEEE Std 802.11. ++ * TU is 1.024 ms. If these are set to 0, driver is expected to use ++ * reasonable default values. min_channel_time defines the time that ++ * will be used to wait for the first reply on each channel. If no ++ * replies are received, next channel will be scanned after this. If ++ * replies are received, total time waited on the channel is defined by ++ * max_channel_time. ++ */ ++ uint32_t min_channel_time; /* in TU */ ++ uint32_t max_channel_time; /* in TU */ ++ ++ struct iw_freq channel_list[IW_MAX_FREQUENCIES]; ++}; ++ ++/* ------------------------- WPA SUPPORT ------------------------- */ ++ ++/* ++ * Extended data structure for get/set encoding (this is used with ++ * SIOCSIWENCODEEXT/SIOCGIWENCODEEXT. struct iw_point and IW_ENCODE_* ++ * flags are used in the same way as with SIOCSIWENCODE/SIOCGIWENCODE and ++ * only the data contents changes (key data -> this structure, including ++ * key data). ++ * ++ * If the new key is the first group key, it will be set as the default ++ * TX key. Otherwise, default TX key index is only changed if ++ * IW_ENCODE_EXT_SET_TX_KEY flag is set. ++ * ++ * Key will be changed with SIOCSIWENCODEEXT in all cases except for ++ * special "change TX key index" operation which is indicated by setting ++ * key_len = 0 and ext_flags |= IW_ENCODE_EXT_SET_TX_KEY. ++ * ++ * tx_seq/rx_seq are only used when respective ++ * IW_ENCODE_EXT_{TX,RX}_SEQ_VALID flag is set in ext_flags. Normal ++ * TKIP/CCMP operation is to set RX seq with SIOCSIWENCODEEXT and start ++ * TX seq from zero whenever key is changed. SIOCGIWENCODEEXT is normally ++ * used only by an Authenticator (AP or an IBSS station) to get the ++ * current TX sequence number. Using TX_SEQ_VALID for SIOCSIWENCODEEXT and ++ * RX_SEQ_VALID for SIOCGIWENCODEEXT are optional, but can be useful for ++ * debugging/testing. ++ */ ++struct iw_encode_ext ++{ ++ uint32_t ext_flags; /* IW_ENCODE_EXT_* */ ++ uint8_t tx_seq[IW_ENCODE_SEQ_MAX_SIZE]; /* LSB first */ ++ uint8_t rx_seq[IW_ENCODE_SEQ_MAX_SIZE]; /* LSB first */ ++ struct sockaddr addr; /* ff:ff:ff:ff:ff:ff for broadcast/multicast ++ * (group) keys or unicast address for ++ * individual keys */ ++ uint16_t alg; /* IW_ENCODE_ALG_* */ ++ uint16_t key_len; ++ uint8_t key[0]; ++}; ++ ++/* SIOCSIWMLME data */ ++struct iw_mlme ++{ ++ uint16_t cmd; /* IW_MLME_* */ ++ uint16_t reason_code; ++ struct sockaddr addr; ++}; ++ ++/* SIOCSIWPMKSA data */ ++#define IW_PMKSA_ADD 1 ++#define IW_PMKSA_REMOVE 2 ++#define IW_PMKSA_FLUSH 3 ++ ++#define IW_PMKID_LEN 16 ++ ++struct iw_pmksa ++{ ++ uint32_t cmd; /* IW_PMKSA_* */ ++ struct sockaddr bssid; ++ uint8_t pmkid[IW_PMKID_LEN]; ++}; ++ ++/* IWEVMICHAELMICFAILURE data */ ++struct iw_michaelmicfailure ++{ ++ uint32_t flags; ++ struct sockaddr src_addr; ++ uint8_t tsc[IW_ENCODE_SEQ_MAX_SIZE]; /* LSB first */ ++}; ++ ++/* IWEVPMKIDCAND data */ ++#define IW_PMKID_CAND_PREAUTH 0x00000001 /* RNS pre-authentication enabled */ ++struct iw_pmkid_cand ++{ ++ uint32_t flags; /* IW_PMKID_CAND_* */ ++ uint32_t index; /* the smaller the index, the higher the ++ * priority */ ++ struct sockaddr bssid; ++}; ++ ++/* ------------------------ WIRELESS STATS ------------------------ */ ++/* ++ * Wireless statistics (used for /proc/net/wireless) ++ */ ++struct iw_statistics ++{ ++ uint16_t status; /* Status ++ * - device dependent for now */ ++ ++ struct iw_quality qual; /* Quality of the link ++ * (instant/mean/max) */ ++ struct iw_discarded discard; /* Packet discarded counts */ ++ struct iw_missed miss; /* Packet missed counts */ ++}; ++ ++/* ------------------------ IOCTL REQUEST ------------------------ */ ++/* ++ * This structure defines the payload of an ioctl, and is used ++ * below. ++ * ++ * Note that this structure should fit on the memory footprint ++ * of iwreq (which is the same as ifreq), which mean a max size of ++ * 16 octets = 128 bits. Warning, pointers might be 64 bits wide... ++ * You should check this when increasing the structures defined ++ * above in this file... ++ */ ++union iwreq_data ++{ ++ /* Config - generic */ ++ char name[16]; ++ /* Name : used to verify the presence of wireless extensions. ++ * Name of the protocol/provider... */ ++ ++ struct iw_point essid; /* Extended network name */ ++ struct iw_param nwid; /* network id (or domain - the cell) */ ++ struct iw_freq freq; /* frequency or channel : ++ * 0-1000 = channel ++ * > 1000 = frequency in Hz */ ++ ++ struct iw_param sens; /* signal level threshold */ ++ struct iw_param bitrate; /* default bit rate */ ++ struct iw_param txpower; /* default transmit power */ ++ struct iw_param rts; /* RTS threshold threshold */ ++ struct iw_param frag; /* Fragmentation threshold */ ++ uint32_t mode; /* Operation mode */ ++ struct iw_param retry; /* Retry limits & lifetime */ ++ ++ struct iw_point encoding; /* Encoding stuff : tokens */ ++ struct iw_param power; /* PM duration/timeout */ ++ struct iw_quality qual; /* Quality part of statistics */ ++ ++ struct sockaddr ap_addr; /* Access point address */ ++ struct sockaddr addr; /* Destination address (hw/mac) */ ++ ++ struct iw_param param; /* Other small parameters */ ++ struct iw_point data; /* Other large parameters */ ++}; ++ ++/* ++ * The structure to exchange data for ioctl. ++ * This structure is the same as 'struct ifreq', but (re)defined for ++ * convenience... ++ * Do I need to remind you about structure size (32 octets) ? ++ */ ++struct iwreq ++{ ++ union ++ { ++ char ifrn_name[16]; /* if name, e.g. "eth0" */ ++ } ifr_ifrn; ++ ++ /* Data part (defined just above) */ ++ union iwreq_data u; ++}; ++ ++/* -------------------------- IOCTL DATA -------------------------- */ ++/* ++ * For those ioctl which want to exchange mode data that what could ++ * fit in the above structure... ++ */ ++ ++/* ++ * Range of parameters ++ */ ++ ++struct iw_range ++{ ++ /* Informative stuff (to choose between different interface) */ ++ uint32_t throughput; /* To give an idea... */ ++ /* In theory this value should be the maximum benchmarked ++ * TCP/IP throughput, because with most of these devices the ++ * bit rate is meaningless (overhead an co) to estimate how ++ * fast the connection will go and pick the fastest one. ++ * I suggest people to play with Netperf or any benchmark... ++ */ ++ ++ /* NWID (or domain id) */ ++ uint32_t min_nwid; /* Minimal NWID we are able to set */ ++ uint32_t max_nwid; /* Maximal NWID we are able to set */ ++ ++ /* Old Frequency (backward compat - moved lower ) */ ++ uint16_t old_num_channels; ++ uint8_t old_num_frequency; ++ ++ /* Wireless event capability bitmasks */ ++ uint32_t event_capa[6]; ++ ++ /* signal level threshold range */ ++ int32_t sensitivity; ++ ++ /* Quality of link & SNR stuff */ ++ /* Quality range (link, level, noise) ++ * If the quality is absolute, it will be in the range [0 ; max_qual], ++ * if the quality is dBm, it will be in the range [max_qual ; 0]. ++ * Don't forget that we use 8 bit arithmetics... */ ++ struct iw_quality max_qual; /* Quality of the link */ ++ /* This should contain the average/typical values of the quality ++ * indicator. This should be the threshold between a "good" and ++ * a "bad" link (example : monitor going from green to orange). ++ * Currently, user space apps like quality monitors don't have any ++ * way to calibrate the measurement. With this, they can split ++ * the range between 0 and max_qual in different quality level ++ * (using a geometric subdivision centered on the average). ++ * I expect that people doing the user space apps will feedback ++ * us on which value we need to put in each driver... */ ++ struct iw_quality avg_qual; /* Quality of the link */ ++ ++ /* Rates */ ++ uint8_t num_bitrates; /* Number of entries in the list */ ++ int32_t bitrate[IW_MAX_BITRATES]; /* list, in bps */ ++ ++ /* RTS threshold */ ++ int32_t min_rts; /* Minimal RTS threshold */ ++ int32_t max_rts; /* Maximal RTS threshold */ ++ ++ /* Frag threshold */ ++ int32_t min_frag; /* Minimal frag threshold */ ++ int32_t max_frag; /* Maximal frag threshold */ ++ ++ /* Power Management duration & timeout */ ++ int32_t min_pmp; /* Minimal PM period */ ++ int32_t max_pmp; /* Maximal PM period */ ++ int32_t min_pmt; /* Minimal PM timeout */ ++ int32_t max_pmt; /* Maximal PM timeout */ ++ uint16_t pmp_flags; /* How to decode max/min PM period */ ++ uint16_t pmt_flags; /* How to decode max/min PM timeout */ ++ uint16_t pm_capa; /* What PM options are supported */ ++ ++ /* Encoder stuff */ ++ uint16_t encoding_size[IW_MAX_ENCODING_SIZES]; /* Different token sizes */ ++ uint8_t num_encoding_sizes; /* Number of entry in the list */ ++ uint8_t max_encoding_tokens; /* Max number of tokens */ ++ /* For drivers that need a "login/passwd" form */ ++ uint8_t encoding_login_index; /* token index for login token */ ++ ++ /* Transmit power */ ++ uint16_t txpower_capa; /* What options are supported */ ++ uint8_t num_txpower; /* Number of entries in the list */ ++ int32_t txpower[IW_MAX_TXPOWER]; /* list, in bps */ ++ ++ /* Wireless Extension version info */ ++ uint8_t we_version_compiled; /* Must be WIRELESS_EXT */ ++ uint8_t we_version_source; /* Last update of source */ ++ ++ /* Retry limits and lifetime */ ++ uint16_t retry_capa; /* What retry options are supported */ ++ uint16_t retry_flags; /* How to decode max/min retry limit */ ++ uint16_t r_time_flags; /* How to decode max/min retry life */ ++ int32_t min_retry; /* Minimal number of retries */ ++ int32_t max_retry; /* Maximal number of retries */ ++ int32_t min_r_time; /* Minimal retry lifetime */ ++ int32_t max_r_time; /* Maximal retry lifetime */ ++ ++ /* Frequency */ ++ uint16_t num_channels; /* Number of channels [0; num - 1] */ ++ uint8_t num_frequency; /* Number of entry in the list */ ++ struct iw_freq freq[IW_MAX_FREQUENCIES]; /* list */ ++ /* Note : this frequency list doesn't need to fit channel numbers, ++ * because each entry contain its channel index */ ++ ++ uint32_t enc_capa; /* IW_ENC_CAPA_* bit field */ ++ ++ /* More power management stuff */ ++ int32_t min_pms; /* Minimal PM saving */ ++ int32_t max_pms; /* Maximal PM saving */ ++ uint16_t pms_flags; /* How to decode max/min PM saving */ ++ ++ /* All available modulations for driver (hw may support less) */ ++ int32_t modul_capa; /* IW_MODUL_* bit field */ ++ ++ /* More bitrate stuff */ ++ uint32_t bitrate_capa; /* Types of bitrates supported */ ++}; ++ ++/* ++ * Private ioctl interface information ++ */ ++ ++struct iw_priv_args ++{ ++ uint32_t cmd; /* Number of the ioctl to issue */ ++ uint16_t set_args; /* Type and number of args */ ++ uint16_t get_args; /* Type and number of args */ ++ char name[16]; /* Name of the extension */ ++}; ++ ++/* ----------------------- WIRELESS EVENTS ----------------------- */ ++/* ++ * Wireless events are carried through the rtnetlink socket to user ++ * space. They are encapsulated in the IFLA_WIRELESS field of ++ * a RTM_NEWLINK message. ++ */ ++ ++/* ++ * A Wireless Event. Contains basically the same data as the ioctl... ++ */ ++struct iw_event ++{ ++ uint16_t len; /* Real lenght of this stuff */ ++ uint16_t cmd; /* Wireless IOCTL */ ++ union iwreq_data u; /* IOCTL fixed payload */ ++}; ++ ++/* Size of the Event prefix (including padding and alignement junk) */ ++#define IW_EV_LCP_LEN (sizeof(struct iw_event) - sizeof(union iwreq_data)) ++/* Size of the various events */ ++#define IW_EV_CHAR_LEN (IW_EV_LCP_LEN + IFNAMSIZ) ++#define IW_EV_UINT_LEN (IW_EV_LCP_LEN + sizeof(uint32_t)) ++#define IW_EV_FREQ_LEN (IW_EV_LCP_LEN + sizeof(struct iw_freq)) ++#define IW_EV_PARAM_LEN (IW_EV_LCP_LEN + sizeof(struct iw_param)) ++#define IW_EV_ADDR_LEN (IW_EV_LCP_LEN + sizeof(struct sockaddr)) ++#define IW_EV_QUAL_LEN (IW_EV_LCP_LEN + sizeof(struct iw_quality)) ++ ++/* iw_point events are special. First, the payload (extra data) come at ++ * the end of the event, so they are bigger than IW_EV_POINT_LEN. Second, ++ * we omit the pointer, so start at an offset. */ ++#define IW_EV_POINT_OFF (((char *) &(((struct iw_point *) NULL)->length)) - \ ++ (char *) NULL) ++#define IW_EV_POINT_LEN (IW_EV_LCP_LEN + sizeof(struct iw_point) - \ ++ IW_EV_POINT_OFF) ++ ++/* Size of the Event prefix when packed in stream */ ++#define IW_EV_LCP_PK_LEN (4) ++/* Size of the various events when packed in stream */ ++#define IW_EV_CHAR_PK_LEN (IW_EV_LCP_PK_LEN + IFNAMSIZ) ++#define IW_EV_UINT_PK_LEN (IW_EV_LCP_PK_LEN + sizeof(uint32_t)) ++#define IW_EV_FREQ_PK_LEN (IW_EV_LCP_PK_LEN + sizeof(struct iw_freq)) ++#define IW_EV_PARAM_PK_LEN (IW_EV_LCP_PK_LEN + sizeof(struct iw_param)) ++#define IW_EV_ADDR_PK_LEN (IW_EV_LCP_PK_LEN + sizeof(struct sockaddr)) ++#define IW_EV_QUAL_PK_LEN (IW_EV_LCP_PK_LEN + sizeof(struct iw_quality)) ++#define IW_EV_POINT_PK_LEN (IW_EV_LCP_LEN + 4) ++ ++#endif /* _LINUX_WIRELESS_H */ +diff --git a/feeds/luci/contrib/package/meshwizard/Makefile b/feeds/luci/contrib/package/meshwizard/Makefile +new file mode 100644 +index 0000000..b4baab7 +--- /dev/null ++++ b/feeds/luci/contrib/package/meshwizard/Makefile +@@ -0,0 +1,39 @@ ++# Copyright (C) 2011 Manuel Munz ++# This is free software, licensed under the Apache 2.0 license. ++ ++include $(TOPDIR)/rules.mk ++ ++PKG_NAME:=meshwizard ++PKG_RELEASE:=0.3.1 ++ ++PKG_BUILD_DIR := $(BUILD_DIR)/$(PKG_NAME) ++ ++include $(INCLUDE_DIR)/package.mk ++ ++define Package/meshwizard ++ SECTION:=luci ++ CATEGORY:=LuCI ++ SUBMENU:=9. Freifunk ++ TITLE:=Shell script based wizard for Mesh networks ++ DEPENDS:=+firewall ++endef ++ ++define Package/meshwizard/description ++ A shellscript based wizard to simplify the setup of a typical mesh node (e.g. for Freifunk.net) ++endef ++ ++define Build/Prepare ++ mkdir -p $(PKG_BUILD_DIR) ++endef ++ ++define Build/Configure ++endef ++ ++define Build/Compile ++endef ++ ++define Package/meshwizard/install ++ $(CP) ./files/* $(1)/ ++endef ++ ++$(eval $(call BuildPackage,meshwizard)) +diff --git a/feeds/luci/contrib/package/meshwizard/files/etc/config/meshwizard b/feeds/luci/contrib/package/meshwizard/files/etc/config/meshwizard +new file mode 100644 +index 0000000..a60b0cc +--- /dev/null ++++ b/feeds/luci/contrib/package/meshwizard/files/etc/config/meshwizard +@@ -0,0 +1,7 @@ ++config 'netconfig' 'netconfig' ++ ++config 'general' 'general' ++ option 'sharenet' '0' ++ option 'local_restrict' '1' ++ option 'cleanup' '1' ++ +diff --git a/feeds/luci/contrib/package/meshwizard/files/usr/bin/meshwizard/functions.sh b/feeds/luci/contrib/package/meshwizard/files/usr/bin/meshwizard/functions.sh +new file mode 100644 +index 0000000..b0f6cb2 +--- /dev/null ++++ b/feeds/luci/contrib/package/meshwizard/files/usr/bin/meshwizard/functions.sh +@@ -0,0 +1,118 @@ ++uci_remove_list_element() { ++ local option="$1" ++ local value="$2" ++ local list="$(uci get $option)" ++ local elem ++ ++ uci delete $option ++ for elem in $list; do ++ if [ "$elem" != "$value" ]; then ++ uci add_list $option=$elem ++ fi ++ done ++} ++ ++# string_contains(string, substring) ++# ++# Returns 0 if the specified string contains the specified substring, ++# otherwise returns 1. ++string_contains() { ++ string="$1" ++ substring="$2" ++ if test "${string#*$substring}" != "$string" ++ then ++ return 0 # $substring is in $string ++ else ++ return 1 # $substring is not in $string ++ fi ++} ++ ++# Takes 2 arguments ++# $1 = text to be displayed in the output for this section ++# $2 = section (optional) ++uci_commitverbose() { ++ echo "+ $1" ++ uci changes $2 | while read line; do ++ echo " $line" ++ done ++ uci commit $2 ++} ++ ++set_defaults() { ++ for def in $(env |grep "^$1" | sed 's/ /_/g'); do ++ option="${def/$1/}" ++ a="$(echo $option |cut -d '=' -f1)" ++ b="$(echo $option |cut -d '=' -f2-)" ++ b="${b//_/ }" ++ string_contains "$a" "_LENGTH" && continue ++ string_contains "$a" "_ITEM" && { ++ # special threatment for lists. use add_list and remove the ++ # item index (_ITEMx). ++ uci add_list $2.${a//_ITEM[0-9]*/}="$b" ++ } || { ++ uci set $2.$a="$b" ++ } ++ done ++} ++ ++# 3 arguments: 1=config name 2=oldname 3=newname ++section_rename() { ++ uci -q rename $1.$2=$3 && msg_rename $1.$2 $1.$3 || msg_rename_error $1.$2 $1.$3 ++} ++ ++msg_missing_value() { ++ echo -e " \033[1mWarning:\033[0m Configuration option for $2 is missing in $1." ++} ++ ++msg_success() { ++ echo " Finished." ++} ++ ++msg_error() { ++ echo " \033[1mError: \033[0mThere was a problem." ++} ++ ++msg_rename() { ++ echo " Renamed unnamed section $1 to $2." ++} ++ ++msg_rename_error() { ++ echo " \033[1mWarning:\033[0m Could not rename $1 to $2." ++} ++ ++ ++restore_factory_defaults() { ++ echo "+ Restore default config as requested with cleanup=1" ++ cp -f /rom/etc/config/* /etc/config/ ++ rm /etc/config/wireless ++ wifi detect > /etc/config/wireless ++ rm /etc/config/network ++ if [ -f /etc/init.d/defconfig ]; then ++ # legacy (AA) ++ /etc/init.d/defconfig start ++ [ -f /rom/etc/uci-defaults/network ] && sh /rom/etc/uci-defaults/network ++ else ++ sh /rom/etc/uci-defaults/02_network ++ fi ++} ++ ++is_in_list() { ++ # checks if an item is in a list ++ local list="$1" ++ local item="$2" ++ for word in $list; do ++ [ $word = "$item" ] && return 0 ++ done ++ return 1 ++} ++ ++add_to_list() { ++ local list="$1" ++ local item="$2" ++ is_in_list "$list" "$item" && echo $list ++ if [ -z "$list" ]; then ++ echo "$item" ++ else ++ echo "$list $item" ++ fi ++} +diff --git a/feeds/luci/contrib/package/meshwizard/files/usr/bin/meshwizard/helpers/check-range-in-range.sh b/feeds/luci/contrib/package/meshwizard/files/usr/bin/meshwizard/helpers/check-range-in-range.sh +new file mode 100755 +index 0000000..c889c55 +--- /dev/null ++++ b/feeds/luci/contrib/package/meshwizard/files/usr/bin/meshwizard/helpers/check-range-in-range.sh +@@ -0,0 +1,31 @@ ++#!/bin/sh ++# Checks whether a netrange is inside another netrange, returns 1 if true ++# Takes two arguments: $1: net from which we want to know if it is inside $2 ++# nets need to be given in CIDR notation ++ ++dir=$(dirname $0) ++ ++awk -f $dir/common.awk -f - $* <= network2) { ++ if (network <= broadcast2) { ++ if (broadcast <= broadcast2) { ++ print "1" ++ } ++ } ++ } ++} ++EOF +diff --git a/feeds/luci/contrib/package/meshwizard/files/usr/bin/meshwizard/helpers/common.awk b/feeds/luci/contrib/package/meshwizard/files/usr/bin/meshwizard/helpers/common.awk +new file mode 100644 +index 0000000..5b03d06 +--- /dev/null ++++ b/feeds/luci/contrib/package/meshwizard/files/usr/bin/meshwizard/helpers/common.awk +@@ -0,0 +1,20 @@ ++function bitcount(c) { ++ c=and(rshift(c, 1),0x55555555)+and(c,0x55555555) ++ c=and(rshift(c, 2),0x33333333)+and(c,0x33333333) ++ c=and(rshift(c, 4),0x0f0f0f0f)+and(c,0x0f0f0f0f) ++ c=and(rshift(c, 8),0x00ff00ff)+and(c,0x00ff00ff) ++ c=and(rshift(c,16),0x0000ffff)+and(c,0x0000ffff) ++ return c ++} ++ ++function ip2int(ip) { ++ for (ret=0,n=split(ip,a,"\."),x=1;x<=n;x++) ret=or(lshift(ret,8),a[x]) ++ return ret ++} ++ ++function int2ip(ip,ret,x) { ++ ret=and(ip,255) ++ ip=rshift(ip,8) ++ for(;x<3;ret=and(ip,255)"."ret,ip=rshift(ip,8),x++); ++ return ret ++} +diff --git a/feeds/luci/contrib/package/meshwizard/files/usr/bin/meshwizard/helpers/gen_auto-ipv6-dhcpv6-ip.sh b/feeds/luci/contrib/package/meshwizard/files/usr/bin/meshwizard/helpers/gen_auto-ipv6-dhcpv6-ip.sh +new file mode 100755 +index 0000000..ca623db +--- /dev/null ++++ b/feeds/luci/contrib/package/meshwizard/files/usr/bin/meshwizard/helpers/gen_auto-ipv6-dhcpv6-ip.sh +@@ -0,0 +1,16 @@ ++#!/bin/sh ++netrenamed=$1 ++ ++local PREFIX="$(echo $ipv6_prefix| cut -d "/" -f 1| sed 's/::/:/')" ++ ++# Get the devices mac address ++local device="$(uci -p/var/state -q get network.$1.ifname)" ++if [ -n "$device" ]; then ++ local MAC="$(ifconfig $netrenamed |grep HWaddr | awk '{ print $5 '})" ++else ++ local MAC="$(cat /sys/class/net/$1/address)" ++ local IPV6_UNIQ="$(echo $MAC | awk -F: '{ print $1$2":"$3$4":"$5$6 }')" ++fi ++ ++echo "${PREFIX}${IPV6_UNIQ}:1" ++ +diff --git a/feeds/luci/contrib/package/meshwizard/files/usr/bin/meshwizard/helpers/gen_bssid.sh b/feeds/luci/contrib/package/meshwizard/files/usr/bin/meshwizard/helpers/gen_bssid.sh +new file mode 100755 +index 0000000..efe101f +--- /dev/null ++++ b/feeds/luci/contrib/package/meshwizard/files/usr/bin/meshwizard/helpers/gen_bssid.sh +@@ -0,0 +1,36 @@ ++#!/bin/sh ++# create essid from channel, takes two args: ++# $1 = channel (integer) ++# $2 = community (optional) ++channel=$1 ++community=$2 ++ ++. /lib/functions.sh ++ ++ ++# Try to get BSSID from profile first ++config_load profile_$community ++config_get bssid bssidscheme $channel ++if [ -z "$bssid" ]; then ++ config_get bssid bssidscheme "all" ++fi ++ ++if [ -z "$bssid" ]; then ++ case $channel in ++ [1-9]) ++ bssid="$(printf "%X\n" $channel)2:CA:FF:EE:BA:BE" ++ ;; ++ 1[0-4]) ++ bssid="$(printf "%X\n" $channel)2:CA:FF:EE:BA:BE" ++ ;; ++ [3-9][0-9]) ++ bssid="02:$channel:CA:FF:EE:EE" ++ ;; ++ 1[0-9][0-9]) ++ bssid="${channel/1/12:}:CA:FF:EE:EE" ++ ;; ++ *) bssid="02:CA:FF:EE:BA:BE" ++ ;; ++ esac ++fi ++echo $bssid +diff --git a/feeds/luci/contrib/package/meshwizard/files/usr/bin/meshwizard/helpers/gen_dhcp_ip.sh b/feeds/luci/contrib/package/meshwizard/files/usr/bin/meshwizard/helpers/gen_dhcp_ip.sh +new file mode 100755 +index 0000000..e559166 +--- /dev/null ++++ b/feeds/luci/contrib/package/meshwizard/files/usr/bin/meshwizard/helpers/gen_dhcp_ip.sh +@@ -0,0 +1,6 @@ ++#!/bin/sh ++# generates a dhcp-ip and netrange from a given ip/subnet ++# takes 2 arguments: ++# $1: Ip Address (of the Interface for which we want to generate an ip) ++ ++echo "$1" | awk 'BEGIN { FS = "." } ; { print "6."$3"."$4".1" }' +diff --git a/feeds/luci/contrib/package/meshwizard/files/usr/bin/meshwizard/helpers/initial_config.sh b/feeds/luci/contrib/package/meshwizard/files/usr/bin/meshwizard/helpers/initial_config.sh +new file mode 100755 +index 0000000..c1e5522 +--- /dev/null ++++ b/feeds/luci/contrib/package/meshwizard/files/usr/bin/meshwizard/helpers/initial_config.sh +@@ -0,0 +1,42 @@ ++#!/bin/sh ++# This is only run once (usually after flashing an image from the imagebuilder) ++# It sets up the initial config for this node. ++ ++. /lib/functions.sh ++. $dir/functions.sh ++ ++config_load system ++ ++# Rename system config ++handle_system() { ++ if [ -z "${1/cfg[0-9a-fA-F]*/}" ]; then ++ section_rename system $1 system ++ fi ++} ++config_foreach handle_system system ++ ++if [ -n "$(uci -q get meshwizard.community)" ]; then ++ set_defaults "community_" freifunk.community ++ uci -q delete meshwizard.community ++fi ++ ++[ -n "$profile_homepage" ] && uci set freifunk.community.homepage="$profile_homepage" ++ ++[ -n "$profile_mapserver" ] && { ++ uci -q delete freifunk.community.mapserver ++ for m in $profile_mapserver; do ++ uci add_list freifunk.community.mapserver="$m" ++ done ++} ++ ++uci_commitverbose "Setup community" freifunk ++ ++if [ -n "$(uci -q get meshwizard.contact)" ]; then ++ set_defaults "contact_" freifunk.contact ++ uci -q delete meshwizard.contact && uci_commitverbose "Setup contact" freifunk ++fi ++ ++if [ "$has_luci" == TRUE ]; then ++ set_defaults "luci_main_" luci.main ++ uci -q delete meshwizard.luci_main && uci_commitverbose "Setup luci" luci ++fi +diff --git a/feeds/luci/contrib/package/meshwizard/files/usr/bin/meshwizard/helpers/ipcalc-cidr.sh b/feeds/luci/contrib/package/meshwizard/files/usr/bin/meshwizard/helpers/ipcalc-cidr.sh +new file mode 100755 +index 0000000..6d7a1fb +--- /dev/null ++++ b/feeds/luci/contrib/package/meshwizard/files/usr/bin/meshwizard/helpers/ipcalc-cidr.sh +@@ -0,0 +1,42 @@ ++#!/bin/sh ++dir=$(dirname $0) ++awk -f $dir/common.awk -f - $* <limit) end=limit ++ ++ print "IP="int2ip(ipaddr) ++ print "NETMASK="int2ip(netmask) ++ print "BROADCAST="int2ip(broadcast) ++ print "NETWORK="int2ip(network) ++ print "NEXTNET="int2ip(broadcast + 1) ++ print "PREFIX="32-bitcount(compl(netmask)) ++ ++ # range calculations: ++ # ipcalc ++ ++ if (ARGC > 3) { ++ print "START="int2ip(start) ++ print "END="int2ip(end) ++ } ++} ++EOF +diff --git a/feeds/luci/contrib/package/meshwizard/files/usr/bin/meshwizard/helpers/read_defaults.sh b/feeds/luci/contrib/package/meshwizard/files/usr/bin/meshwizard/helpers/read_defaults.sh +new file mode 100755 +index 0000000..b6ffb62 +--- /dev/null ++++ b/feeds/luci/contrib/package/meshwizard/files/usr/bin/meshwizard/helpers/read_defaults.sh +@@ -0,0 +1,61 @@ ++#!/bin/sh ++# These functions read the settings we need for configuration of the router ++ ++read_defaults() { ++ # read default values from the 3 relevant config files and export them ++ # into the environment. Later loaded configs overwrite earlier ones. The ++ # The ordering here is from most generic to most specific: ++ # freifunk (most generic defaults) ++ # profile_* (community defaults) ++ # nodes custom config from meshwizard config file ++ ++ local community="$1" ++ ++ config_cb() { ++ local type="$1" ++ local name="$2" ++ local allowed_section_types="widget" ++ local allowed_section_names=" ++ system ++ wifi_device ++ wifi_iface ++ interface ++ alias ++ dhcp ++ olsr_interface ++ olsr_interfacedefaults ++ profile ++ zone_freifunk ++ include ++ luci_splash ++ ipv6 ++ luci_main ++ contact ++ community ++ wan ++ lan ++ general ++ ipv6 ++ qos ++ " ++ ++ if [ "$type" = "widget" ]; then ++ widgets=$(add_to_list "$widgets" "$name") ++ fi ++ ++ if ([ -n "$name" ] && is_in_list "$allowed_section_names" $name) \ ++ || is_in_list "$allowed_section_types" $type ; then ++ option_cb() { ++ local option="$1" ++ local value="$2" ++ export "${CONFIG_SECTION}_${option}"="$value" ++ } ++ else ++ option_cb() { return; } ++ fi ++ } ++ config_load freifunk ++ config_load profile_${community} ++ config_load meshwizard ++ export widgets="$widgets" ++} +diff --git a/feeds/luci/contrib/package/meshwizard/files/usr/bin/meshwizard/helpers/rename-wifi.sh b/feeds/luci/contrib/package/meshwizard/files/usr/bin/meshwizard/helpers/rename-wifi.sh +new file mode 100755 +index 0000000..e9139ed +--- /dev/null ++++ b/feeds/luci/contrib/package/meshwizard/files/usr/bin/meshwizard/helpers/rename-wifi.sh +@@ -0,0 +1,46 @@ ++#!/bin/sh ++# This script renames IB_wifi_ interface names into real interface names used on this system. ++# E.g. wireless.IB_wifi0 would become wireless.wifi0 on madwifi and wireless.radio0 on mac80211 ++ ++. $dir/functions.sh ++ ++posIB=-1 ++ ++IBwifis="$(uci show meshwizard.netconfig | grep 'IB_' | sed 's/meshwizard.netconfig\.\(IB_wifi.*\)_.*/\1/' |uniq)" ++[ -z "$(echo $IBwifis |grep IB_wifi)" ] && exit ++ ++for w in $IBwifis; do ++ posIB=$(( $posIB + 1 )) ++ export IB_wifi$posIB="$w" ++done ++ ++pos=0 ++syswifis="$(uci show wireless |grep wifi-device | sed 's/wireless\.\(.*\)=.*/\1/' |uniq)" ++ ++for s in $syswifis; do ++ export syswifi$pos="$s" ++ pos=$(( $pos + 1 )) ++done ++ ++for i in `seq 0 $posIB`; do ++ IBwifi=$(eval echo \$IB_wifi$i) ++ syswifi=$(eval echo \$syswifi$i) ++ ++ if [ -n "$syswifi" ]; then ++ case $IBwifi in ++ IB_wifi* ) ++ # replace IB_wifi_* with actual wifi interface names, delete old ones first ++ uci show meshwizard.netconfig | grep $IBwifi | while read line; do ++ oldline=$(echo $line | cut -d "=" -f 1) ++ uci set $oldline="" ++ newline=$(echo $line |sed -e "s/$IBwifi/$syswifi/g" -e "s/'//g") ++ uci set $newline ++ done ++ ;; ++ esac ++ unset IBwifi ++ unset syswifi ++ fi ++done ++ ++uci_commitverbose "Renaming wifi-devices in /etc/config/meshwizard" meshwizard +diff --git a/feeds/luci/contrib/package/meshwizard/files/usr/bin/meshwizard/helpers/setup_auto-ipv6-interface.sh b/feeds/luci/contrib/package/meshwizard/files/usr/bin/meshwizard/helpers/setup_auto-ipv6-interface.sh +new file mode 100755 +index 0000000..adf3429 +--- /dev/null ++++ b/feeds/luci/contrib/package/meshwizard/files/usr/bin/meshwizard/helpers/setup_auto-ipv6-interface.sh +@@ -0,0 +1,12 @@ ++#!/bin/sh ++ ++net=$1 ++. $dir/functions.sh ++ ++ra="$(uci -q get meshwizard.netconfig.${net}_ipv6ra)" ++uci set autoipv6.${netrenamed}="interface" ++if [ -n "$ra" ]; then ++ uci set autoipv6.${netrenamed}.ra=1 ++fi ++ ++uci_commitverbose "Setup auto-ipv6 for interface $netrenamed" autoipv6 +diff --git a/feeds/luci/contrib/package/meshwizard/files/usr/bin/meshwizard/helpers/setup_auto-ipv6.sh b/feeds/luci/contrib/package/meshwizard/files/usr/bin/meshwizard/helpers/setup_auto-ipv6.sh +new file mode 100755 +index 0000000..8e3f015 +--- /dev/null ++++ b/feeds/luci/contrib/package/meshwizard/files/usr/bin/meshwizard/helpers/setup_auto-ipv6.sh +@@ -0,0 +1,17 @@ ++#!/bin/sh ++ ++. $dir/functions.sh ++ ++if [ "$ipv6_config" = "auto-ipv6-fromv4" ]; then ++ mode="fromv4" ++else ++ mode="random" ++fi ++ ++uci set autoipv6.olsr_node.enabled=1 ++uci set autoipv6.olsr_node.mode="$mode" ++uci_commitverbose "Setup auto-ipv6" autoipv6 ++ ++uci set network.wan.accept_ra=0 ++uci_commitverbose "Do not accept ra's on wan when using auto-ipv6" network ++ +diff --git a/feeds/luci/contrib/package/meshwizard/files/usr/bin/meshwizard/helpers/setup_dhcp.sh b/feeds/luci/contrib/package/meshwizard/files/usr/bin/meshwizard/helpers/setup_dhcp.sh +new file mode 100755 +index 0000000..8cce831 +--- /dev/null ++++ b/feeds/luci/contrib/package/meshwizard/files/usr/bin/meshwizard/helpers/setup_dhcp.sh +@@ -0,0 +1,46 @@ ++#!/bin/sh ++# Sets up the dhcp part of dnsmasq ++ ++. /lib/functions.sh ++. $dir/functions.sh ++ ++net="$1" ++vap="$(uci -q get meshwizard.netconfig.${net}_vap)" ++ ++handle_dnsmasq() { ++ config_get interface "$1" interface ++ if [ "$interface" == "${netrenamed}dhcp" ]; then ++ if [ -z "${1/cfg[0-9a-fA-F]*/}" ]; then ++ section_rename dhcp $1 ${netrenamed}dhcp ++ fi ++ fi ++} ++config_load dhcp ++config_foreach handle_dnsmasq dhcp ++ ++[ "$net" == "lan" ] && uci -q delete dhcp.lan ++ ++if [ "$supports_vap" = 1 -a "$vap" = 1 ]; then ++ uci batch <<- EOF ++ set dhcp.${netrenamed}dhcp="dhcp" ++ set dhcp.${netrenamed}dhcp.ignore="0" ++ set dhcp.${netrenamed}dhcp.interface="${netrenamed}dhcp" ++ EOF ++ set_defaults "dhcp_" dhcp.${netrenamed}dhcp ++fi ++ ++ahdhcp_when_vap="$(uci get profile_$community.profile.adhoc_dhcp_when_vap)" ++if [ "$supports_vap" = 0 ] || \ ++ [ "$supports_vap" = 1 -a "$vap" = 1 -a "$ahdhcp_when_vap" = 1 ] || \ ++ [ "$lan_is_olsr" = "1" -a "$lan_dhcp" = 1 ]; then ++ uci batch <<- EOF ++ set dhcp.${netrenamed}ahdhcp="dhcp" ++ set dhcp.${netrenamed}ahdhcp.ignore="0" ++ set dhcp.${netrenamed}ahdhcp.interface="${netrenamed}ahdhcp" ++ EOF ++fi ++set_defaults "dhcp_" dhcp.${netrenamed}ahdhcp ++ ++uci_commitverbose "Setup DHCP for $netrenamed" dhcp ++ ++ +diff --git a/feeds/luci/contrib/package/meshwizard/files/usr/bin/meshwizard/helpers/setup_dnsmasq.sh b/feeds/luci/contrib/package/meshwizard/files/usr/bin/meshwizard/helpers/setup_dnsmasq.sh +new file mode 100755 +index 0000000..9297f91 +--- /dev/null ++++ b/feeds/luci/contrib/package/meshwizard/files/usr/bin/meshwizard/helpers/setup_dnsmasq.sh +@@ -0,0 +1,29 @@ ++#!/bin/sh ++ ++. /lib/functions.sh ++. $dir/functions.sh ++ ++# Set dnsmasq config ++handle_dhcp() { ++ if [ -z "${1/cfg[0-9a-fA-F]*/}" ]; then ++ section_rename dhcp $1 dnsmasq ++ fi ++} ++ ++config_load dhcp ++config_foreach handle_dhcp dnsmasq ++ ++uci batch << EOF ++ set dhcp.dnsmasq.local="/$profile_suffix/" ++ set dhcp.dnsmasq.domain="$profile_suffix" ++EOF ++ ++config_get addnhosts dnsmasq addnhosts ++if [ -z "${addnhosts/\var\/etc\/hosts.olsr/}" ]; then ++ uci add_list dhcp.dnsmasq.addnhosts="/var/etc/hosts.olsr" ++ if [ "$ipv6_enabled" = 1 ]; then ++ uci add_list dhcp.dnsmasq.addnhosts="/var/etc/hosts.olsr.ipv6" ++ fi ++fi ++ ++uci_commitverbose "Setup dnsmasq" dhcp +diff --git a/feeds/luci/contrib/package/meshwizard/files/usr/bin/meshwizard/helpers/setup_firewall.sh b/feeds/luci/contrib/package/meshwizard/files/usr/bin/meshwizard/helpers/setup_firewall.sh +new file mode 100755 +index 0000000..154b2b6 +--- /dev/null ++++ b/feeds/luci/contrib/package/meshwizard/files/usr/bin/meshwizard/helpers/setup_firewall.sh +@@ -0,0 +1,145 @@ ++#!/bin/sh ++# Add "freifunk" firewall zone ++# If wan/lan is used for olsr then remove these networks from wan/lan zones ++# Also setup rules defined in /etc/config/freifunk and /etc/config/profile_ ++ ++. /lib/functions.sh ++. $dir/functions.sh ++ ++wan_is_olsr=$(uci -q get meshwizard.netconfig.wan_config) ++ ++config_load firewall ++ ++# Rename firewall zone for freifunk if unnamed ++# If wan is used for olsr then set network for the firewall zone wan to ' ' to remove the wan interface from it, else add local restrict to it ++# If lan is used for olsr then set network for the firewall zone lan to ' ' to remove the lan interface from it ++ ++handle_fwzone() { ++ config_get name "$1" name ++ config_get network "$1" network ++ ++ if [ "$name" == "freifunk" ]; then ++ # rename section if unnamed ++ if [ -z "${1/cfg[0-9a-fA-F]*/}" ]; then ++ section_rename firewall $1 zone_freifunk ++ fi ++ fi ++ ++ if [ "$name" == "wan" ]; then ++ if [ "$wan_is_olsr" == 1 ]; then ++ uci set firewall.$1.network=' ' && uci_commitverbose "WAN is used for olsr, removed the wan interface from zone wan" firewall ++ else ++ uci set firewall.$1.local_restrict=1 && uci_commitverbose "Enable local_restrict for zone wan" firewall ++ fi ++ fi ++ ++ if [ "$name" == "lan" ] && [ "$lan_is_olsr" == "1" ]; then ++ uci set firewall.$1.network=' ' && uci_commitverbose "LAN is used for olsr, removed the lan interface from zone lan" firewall ++ fi ++} ++ ++config_foreach handle_fwzone zone ++ ++uci batch << EOF ++ set firewall.zone_freifunk="zone" ++ set firewall.zone_freifunk.name="freifunk" ++ set firewall.zone_freifunk.input="$zone_freifunk_input" ++ set firewall.zone_freifunk.forward="$zone_freifunk_forward" ++ set firewall.zone_freifunk.output="$zone_freifunk_output" ++EOF ++ ++uci_commitverbose "Setup firewall zones" firewall ++ ++# Usually we need to setup masquerading for lan, except lan is an olsr interface or has an olsr hna-entry ++ ++handle_interface() { ++ config_get interface "$1" interface ++ if [ "$interface" == "lan" ]; then ++ no_masq_lan=1 ++ fi ++} ++config_load olsrd ++config_foreach handle_interface Interface ++ ++LANIP="$(uci -q get network.lan.ipaddr)" ++if [ -n "$LANIP" ]; then ++ handle_hna() { ++ config_get netaddr "$1" netaddr ++ if [ "$LANIP" == "$netaddr" ]; then ++ no_masq_lan=1 ++ fi ++ } ++ config_foreach handle_hna Hna4 ++fi ++ ++currms=$(uci -q get firewall.zone_freifunk.masq_src) ++if [ ! "$no_masq_lan" == "1" ] && [ ! "$(uci -q get meshwizard.netconfig.lan_config)" == 1 ]; then ++ uci set firewall.zone_freifunk.masq="1" ++ [ -z "$(echo $currms |grep lan)" ] && uci add_list firewall.zone_freifunk.masq_src="lan" ++fi ++ ++ ++# Rules, Forwardings, advanced config and includes from freifunk and ++# profile_$community config files. ++ ++add_fw_rules() { ++ config_cb() { ++ local type="$1" ++ local name="$2" ++ local allowed_section_types="advanced include fw_rule fw_forwarding" ++ if is_in_list "$allowed_section_types" $type ; then ++ uci set firewall.${name}="${type/fw_/}" ++ option_cb() { ++ local option="$1" ++ local value="$2" ++ uci set firewall.${CONFIG_SECTION}.${option}="$value" ++ } ++ else ++ option_cb() { return; } ++ fi ++ } ++ config_load freifunk ++ config_load profile_${community} ++} ++add_fw_rules ++ ++ ++# If we use auto-ipv6-dhcp then allow 547/udp on the freifunk zone ++if [ "$ipv6_config" = "auto-ipv6-dhcpv6" ]; then ++ uci batch <<- EOF ++ set firewall.dhcpv6=rule ++ set firewall.dhcpv6.src=freifunk ++ set firewall.dhcpv6.target=ACCEPT ++ set firewall.dhcpv6.dest_port=547 ++ set firewall.dhcpv6.proto=udp ++ EOF ++fi ++ ++# Firewall rules to allow incoming ssh and web if enabled ++ ++if [ "$wan_allowssh" == 1 ]; then ++ uci batch <<- EOF ++ set firewall.wanssh=rule ++ set firewall.wanssh.src=wan ++ set firewall.wanssh.target=ACCEPT ++ set firewall.wanssh.proto=tcp ++ set firewall.wanssh.dest_port=22 ++ EOF ++fi ++ ++if [ "$wan_allowweb" == 1 ]; then ++ uci batch <<- EOF ++ set firewall.wanweb=rule ++ set firewall.wanweb.src=wan ++ set firewall.wanweb.target=ACCEPT ++ set firewall.wanweb.proto=tcp ++ set firewall.wanweb.dest_port=80 ++ set firewall.wanwebhttps=rule ++ set firewall.wanwebhttps.src=wan ++ set firewall.wanwebhttps.target=ACCEPT ++ set firewall.wanwebhttps.proto=tcp ++ set firewall.wanwebhttps.dest_port=443 ++ EOF ++fi ++ ++uci_commitverbose "Setup rules, forwardings, advanced config and includes." firewall +diff --git a/feeds/luci/contrib/package/meshwizard/files/usr/bin/meshwizard/helpers/setup_firewall_interface.sh b/feeds/luci/contrib/package/meshwizard/files/usr/bin/meshwizard/helpers/setup_firewall_interface.sh +new file mode 100755 +index 0000000..8ca5d3b +--- /dev/null ++++ b/feeds/luci/contrib/package/meshwizard/files/usr/bin/meshwizard/helpers/setup_firewall_interface.sh +@@ -0,0 +1,111 @@ ++#!/bin/sh ++# This will add $net to the zone firewall (and remove it from other zones where it is referenced) ++# It will also setup rules defined in /etc/config/freifunk and /etc/config/profile_ ++# Arg $1 = $net ++ ++net=$1 ++. /lib/functions.sh ++. $dir/functions.sh ++config_load firewall ++ ++# Get some variables ++type="$(uci -q get wireless.$net.type)" ++vap="$(uci -q get meshwizard.netconfig.$net\_vap)" ++wan_is_olsr=$(uci -q get meshwizard.netconfig.wan_config) ++ ++# Delete old firewall zone for freifunk ++handle_fwzone() { ++ config_get name "$1" name ++ config_get network "$1" network ++ ++ if [ "$2" == "zoneconf" ]; then ++ if [ "$name" == "freifunk" ]; then ++ # rename section if unnamed ++ if [ -z "${1/cfg[0-9a-fA-F]*/}" ]; then ++ section_rename firewall $1 zone_freifunk ++ fi ++ else ++ if [ ! "$name" == "freifunk" ] && [ -n "$netrenamed" -a -n "$(echo $network | grep $netrenamed)" ]; then ++ echo " Removed $netrenamed from firewall zone $name." ++ network_new=$(echo $network | sed -e 's/'$netrenamed'//' -e 's/^ //' -e 's/ / /' -e 's/ $//') ++ uci set firewall.$1.network="$network_new" ++ fi ++ fi ++ fi ++} ++ ++config_foreach handle_fwzone zone zoneconf ++ ++# Add $netrenamed and if needed ${netrenamed}dhcp to the "freifunk" zone ++config_get network zone_freifunk network ++ ++# remove ${netrenamed}dhcp from networks list ++[ -n "$network" -a -n "$net" ] && network="${network/${netrenamed}dhcp/}" ++network=$(echo $network) # Removes leading and trailing whitespaces ++ ++[ -n "$netrenamed" ] && [ -z "$(echo $network | grep $netrenamed)" ] && network="$network $netrenamed" ++ ++if [ "$supports_vap" == "1" -a "$vap" == 1 ]; then ++ [ -n "$netrenamed" ] && [ "$network" == "${network/${netrenamed}dhcp/}" ] && network="$network ${netrenamed}dhcp" ++fi ++ ++uci set firewall.zone_freifunk.network="$network" ++ ++uci_commitverbose "Add '$netrenamed' to freifunk firewall zone" firewall ++ ++currms=$(uci -q get firewall.zone_freifunk.masq_src) ++ ++# If interfaces are outside of the mesh network they should be natted ++ ++if [ "$vap" == 1 ]; then ++ # Get dhcprange and meshnet for the dhcp interface ++ if_ip="$(uci -q get network.${netrenamed}dhcp.ipaddr)" ++ if_mask="$(uci -q get network.${netrenamed}dhcp.netmask)" ++ ++ [ -n "$if_ip" -a "$if_mask" ] && export $(ipcalc.sh $if_ip $if_mask) ++ [ -n "$NETWORK" -a "$PREFIX" ] && dhcprange="$NETWORK/$PREFIX" ++ ++ if [ -n "$dhcprange" ]; then ++ meshnet="$(uci get profile_$community.profile.mesh_network)" ++ # check if the dhcprange is inside meshnet ++ dhcpinmesh="$($dir/helpers/check-range-in-range.sh $dhcprange $meshnet)" ++ if [ "$dhcpinmesh" == 1 ]; then ++ # needed or splash will not work ++ if [ "$has_luci_splash" == TRUE ]; then ++ uci set firewall.zone_freifunk.contrack="1" ++ fi ++ else ++ uci set firewall.zone_freifunk.masq=1 ++ [ -z "$(echo $currms |grep ${netrenamed}dhcp)" ] && uci add_list firewall.zone_freifunk.masq_src="${netrenamed}dhcp" ++ fi ++ fi ++fi ++ ++# Get dhcprange and meshnet for the adhoc dhcp interface ++if_ip="$(uci -q get network.${netrenamed}ahdhcp.ipaddr)" ++if_mask="$(uci -q get network.${netrenamed}ahdhcp.netmask)" ++ ++[ -n "$if_ip" -a "$if_mask" ] && export $(ipcalc.sh $if_ip $if_mask) ++[ -n "$NETWORK" -a "$PREFIX" ] && dhcprangeah="$NETWORK/$PREFIX" ++ ++if [ -n "$dhcprangeah" ]; then ++ meshnet="$(uci get profile_$community.profile.mesh_network)" ++ # check if the dhcprange is inside meshnet ++ dhcpinmesh="$($dir/helpers/check-range-in-range.sh $dhcprangeah $meshnet)" ++ if [ "$dhcpinmesh" == 1 ]; then ++ # needed or splash will not work ++ if [ "$has_luci_splash" == TRUE ]; then ++ uci set firewall.zone_freifunk.contrack="1" ++ fi ++ else ++ uci set firewall.zone_freifunk.masq=1 ++ [ -z "$(echo $currms |grep ${netrenamed}ahdhcp)" ] && uci add_list firewall.zone_freifunk.masq_src="${netrenamed}ahdhcp" ++ fi ++fi ++ ++ ++for i in IP NETMASK BROADCAST NETWORK PREFIX; do ++ unset $i ++done ++ ++uci_commitverbose "Setup masquerading rules for '$netrenamed'" firewall +diff --git a/feeds/luci/contrib/package/meshwizard/files/usr/bin/meshwizard/helpers/setup_lan_ipv6.sh b/feeds/luci/contrib/package/meshwizard/files/usr/bin/meshwizard/helpers/setup_lan_ipv6.sh +new file mode 100755 +index 0000000..2f6144b +--- /dev/null ++++ b/feeds/luci/contrib/package/meshwizard/files/usr/bin/meshwizard/helpers/setup_lan_ipv6.sh +@@ -0,0 +1,20 @@ ++#!/bin/sh ++ ++[ ! "$(uci -q get network.lan)" == "interface" ] && exit ++ ++. /lib/functions.sh ++. $dir/functions.sh ++ ++# Setup IPv6 for the lan interface ++ ++local ip6addr="" ++if [ "$ipv6_config" = "auto-ipv6-dhcpv6" ]; then ++ # get lan mac ++ local device="$(uci -p/var/state -q get network.lan.ifname)" ++ if [ -n "device" ]; then ++ ip6addr="$($dir/helpers/gen_auto-ipv6-dhcpv6-ip.sh $device)" ++ fi ++ uci set network.lan.ip6addr="${ip6addr}/112" ++fi ++ ++uci_commitverbose "Setup ipv6 address for lan" network +diff --git a/feeds/luci/contrib/package/meshwizard/files/usr/bin/meshwizard/helpers/setup_lan_static.sh b/feeds/luci/contrib/package/meshwizard/files/usr/bin/meshwizard/helpers/setup_lan_static.sh +new file mode 100755 +index 0000000..172dcf1 +--- /dev/null ++++ b/feeds/luci/contrib/package/meshwizard/files/usr/bin/meshwizard/helpers/setup_lan_static.sh +@@ -0,0 +1,17 @@ ++#!/bin/sh ++# Setup static interface settings for lan if lan is not an olsr interface ++ ++[ ! "$(uci -q get network.lan)" == "interface" ] && exit ++ ++. /lib/functions.sh ++. $dir/functions.sh ++ ++uci batch << EOF ++ set network.lan.proto='$lan_proto' ++ set network.lan.ipaddr='$lan_ip4addr' ++ set network.lan.netmask='$lan_netmask' ++EOF ++ ++uci_commitverbose "Setup static ip settings for lan" network ++ ++uci delete meshwizard.lan && uci commit meshwizard +diff --git a/feeds/luci/contrib/package/meshwizard/files/usr/bin/meshwizard/helpers/setup_network.sh b/feeds/luci/contrib/package/meshwizard/files/usr/bin/meshwizard/helpers/setup_network.sh +new file mode 100755 +index 0000000..7035e7f +--- /dev/null ++++ b/feeds/luci/contrib/package/meshwizard/files/usr/bin/meshwizard/helpers/setup_network.sh +@@ -0,0 +1,145 @@ ++# setup entry in /etc/config/network for a interface ++# Argument $1: network interface ++ ++net="$1" ++. /lib/functions.sh ++. $dir/functions.sh ++ ++# Setup a (new) interface section for $net ++ ++ipaddr=$(uci -q get meshwizard.netconfig.$net\_ip4addr) ++ip6addr=$(uci -q get meshwizard.netconfig.$net\_ip6addr) ++[ -z "$ipaddr" ] && msg_missing_value meshwizard $net\_ip4addr ++ ++netmask=$(uci -q get meshwizard.netconfig.$net\_netmask) ++[ -z "$netmask" ] && netmask="$interface_netmask" ++[ -z "$netmask" ] && netmask="255.255.0.0" ++ ++uci set network.$netrenamed="interface" ++set_defaults "interface_" network.$netrenamed ++ ++uci batch << EOF ++ set network.$netrenamed.proto="static" ++ set network.$netrenamed.ipaddr="$ipaddr" ++ set network.$netrenamed.netmask="$netmask" ++EOF ++ ++if [ "$netrenamed" = "lan" ]; then ++ # remove the bridge if the interface is used for olsr ++ # since this script is only run in this case, no need ++ # to check for lan_proto = "olsr" currently. ++ uci -q delete network.lan.type ++fi ++ ++# Setup IPv6 for the interface ++local ip6addr ++if [ "$ipv6_enabled" = 1 ]; then ++ if [ "$ipv6_config" = "auto-ipv6-dhcpv6" ]; then ++ ip6addr="$($dir/helpers/gen_auto-ipv6-dhcpv6-ip.sh $netrenamed)" ++ uci set network.$netrenamed.ip6addr="${ip6addr}/112" ++ fi ++ if [ "$ipv6_config" = "static" ] && [ -n "$ip6addr" ]; then ++ uci set network.$netrenamed.ip6addr="$ip6addr" ++ fi ++fi ++ ++uci_commitverbose "Setup interface $netrenamed" network ++ ++# setup dhcp alias/interface ++ ++net_dhcp=$(uci -q get meshwizard.netconfig.${net}_dhcp) ++if [ "$net_dhcp" == 1 ]; then ++ ++ # Load meshwizard_settings ++ dhcprange="$(uci -q get meshwizard.netconfig.${net}_dhcprange)" ++ interface_ip="$(uci -q get meshwizard.netconfig.${net}_ip4addr)" ++ vap=$(uci -q get meshwizard.netconfig.${net}_vap) ++ ++ # Rename config ++ handle_dhcpalias() { ++ config_get interface "$1" interface ++ if [ "$interface" == "$netrenamed" ]; then ++ if [ -z "${1/cfg[0-9a-fA-F]*/}" ]; then ++ section_rename network $1 ${netrenamed}dhcp ++ fi ++ fi ++ } ++ config_load network ++ config_foreach handle_dhcpalias interface ++ ++ # Get IP/netmask and start-ip for $net dhcp ++ # If no dhcprange is given in /etc/config/meshwizard we autogenerate one ++ ++ if [ -z "$dhcprange" ]; then ++ dhcprange="$($dir/helpers/gen_dhcp_ip.sh $interface_ip)/24" ++ uci set meshwizard.netconfig.${net}_dhcprange="$dhcprange" ++ fi ++ ++ # If we use VAP and also offer dhcp on the adhoc interface then cut the dhcp ++ # range in two halves. one for the adhoc, one for the managed VAP interface ++ ahdhcp_when_vap="$(uci get profile_$community.profile.adhoc_dhcp_when_vap)" ++ ++ if [ "$supports_vap" = 1 -a "$vap" = 1 -a "$ahdhcp_when_vap" = 1 ]; then ++ # VAPs are enabled for this interface, supported and we want to ++ # also use DHCP on the adhoc interface ++ local network ++ local mask ++ network=${dhcprange%%/*} ++ mask=${dhcprange##*/} ++ # Divide network size by adding 1 to the netmask ++ mask=$(($mask + 1)) ++ # Get first ip and netmask for the adhoc dhcp network ++ eval $(sh $dir/helpers/ipcalc-cidr.sh ${network}/${mask} 1 0) ++ STARTADHOC=$START ++ NETMASKADHOC=$NETMASK ++ # Get first ip and netmask for the managed dhcp network ++ eval $(sh $dir/helpers/ipcalc-cidr.sh ${NEXTNET}/${mask} 1 0) ++ STARTVAP=$START ++ NETMASKVAP=$NETMASK ++ # Add dhcp interface ++ uci batch <<- EOF ++ set network.${netrenamed}dhcp=interface ++ set network.${netrenamed}dhcp.proto=static ++ set network.${netrenamed}dhcp.ipaddr="$STARTVAP" ++ set network.${netrenamed}dhcp.netmask="$NETMASKVAP" ++ EOF ++ uci_commitverbose "Setup interface for ${netrenamed}dhcp" network ++ else ++ eval $(sh $dir/helpers/ipcalc-cidr.sh $dhcprange 1 0) ++ STARTADHOC=$START ++ NETMASKADHOC=$NETMASK ++ fi ++ if [ "$supports_vap" = 1 -a "$vap" = 1 -a "$ahdhcp_when_vap" != 1 ]; then ++ # vaps are enabled and supported and we do not use DHCP on adhoc ++ # Add dhcp interface ++ uci batch <<- EOF ++ set network.${netrenamed}dhcp=interface ++ set network.${netrenamed}dhcp.proto=static ++ set network.${netrenamed}dhcp.ipaddr="$STARTADHOC" ++ set network.${netrenamed}dhcp.netmask="$NETMASKADHOC" ++ EOF ++ uci_commitverbose "Setup interface for ${netrenamed}dhcp" network ++ fi ++ ++ ++ # Setup alias for $net adhoc interface ++ if [ "$supports_vap" = 0 ] || \ ++ [ "$vap" = 0 ] || \ ++ [ "$supports_vap" = 1 -a "$vap" = 1 -a "$ahdhcp_when_vap" = 1 ] || \ ++ [ "$lan_is_olsr" = "1" ]; then ++ # setup an alias interface for the main interface to use as a network for clients ++ # when one of the following conditions is met ++ # * vaps are not supported ++ # * or not enabled ++ # * or they are supported and enabled but we also want to use DHCP on the adhoc interface ++ # * or this is the lan interface and it is used for olsrd (and dhcp is enabled) ++ uci batch <<- EOF ++ set network.${netrenamed}ahdhcp=interface ++ set network.${netrenamed}ahdhcp.ifname="@${netrenamed}" ++ set network.${netrenamed}ahdhcp.proto=static ++ set network.${netrenamed}ahdhcp.ipaddr="$STARTADHOC" ++ set network.${netrenamed}ahdhcp.netmask="$NETMASKADHOC" ++ EOF ++ uci_commitverbose "Setup interface for ${netrenamed}ahdhcp" network ++ fi ++fi +diff --git a/feeds/luci/contrib/package/meshwizard/files/usr/bin/meshwizard/helpers/setup_olsrd.sh b/feeds/luci/contrib/package/meshwizard/files/usr/bin/meshwizard/helpers/setup_olsrd.sh +new file mode 100755 +index 0000000..d212ca4 +--- /dev/null ++++ b/feeds/luci/contrib/package/meshwizard/files/usr/bin/meshwizard/helpers/setup_olsrd.sh +@@ -0,0 +1,160 @@ ++#!/bin/sh ++# Sets up olsrd ++ ++. /lib/functions.sh ++. $dir/functions.sh ++ ++local protocols="4" ++if [ "$ipv6_enabled" = 1 ] && [ "$has_ipv6" == "1" ]; then ++ protocols="4 6" ++fi ++ ++clean_config() { ++ # Clean the config, remove interface wlan ++ handle_interface() { ++ config_get interface "$1" interface ++ if [ "$interface" = "wlan" ]; then ++ uci delete $cfg.$1 ++ fi ++ } ++ config_foreach handle_interface Interface ++} ++ ++rename_olsrd() { ++ #Rename olsrd basic settings ++ handle_olsrd() { ++ if [ -z "${1/cfg[0-9a-fA-F]*/}" ]; then ++ section_rename $cfg $1 olsrd ++ fi ++ } ++ config_foreach handle_olsrd olsrd ++} ++ ++rename_interface_defaults() { ++ # Rename interface defaults ++ handle_interfacedefaults() { ++ if [ -z "${1/cfg[0-9a-fA-F]*/}" ]; then ++ section_rename $cfg $1 InterfaceDefaults ++ fi ++ } ++ config_foreach handle_interfacedefaults InterfaceDefaults ++} ++ ++cleanup_plugins() { ++ # Rename nameservice, dyngw and httpinfo plugins ++ handle_plugin() { ++ config_get library "$1" library ++ if [ -z "${1/cfg[0-9a-fA-F]*/}" ]; then ++ new="$(echo $library | cut -d '.' -f 1)" ++ section_rename $cfg "$1" "$new" ++ fi ++ } ++ config_foreach handle_plugin LoadPlugin ++ uci -q delete $cfg.olsrd_httpinfo ++ uci -q delete $cfg.olsrd_dyn_gw ++} ++ ++setup_nameservice() { ++ # Setup nameservice plugin ++ if [ -n "$profile_suffix" ]; then ++ suffix=".$profile_suffix" ++ else ++ suffix=".olsr" ++ fi ++ local llfile="/var/run/latlon.js" ++ local hosts="/var/etc/hosts.olsr" ++ local services="/var/run/services_olsr" ++ ++ if [ "$proto" = "6" ]; then ++ local llfile="/var/run/latlon.js.ipv6" ++ local hosts="/var/etc/hosts.olsr.ipv6" ++ local services="/var/run/services_olsr.ipv6" ++ fi ++ ++ uci batch <<- EOF ++ set $cfg.olsrd_nameservice=LoadPlugin ++ set $cfg.olsrd_nameservice.library="olsrd_nameservice.so.0.3" ++ set $cfg.olsrd_nameservice.latlon_file="$llfile" ++ set $cfg.olsrd_nameservice.hosts_file="$hosts" ++ set $cfg.olsrd_nameservice.sighup_pid_file="/var/run/dnsmasq.pid" ++ set $cfg.olsrd_nameservice.services_file="$services" ++ set $cfg.olsrd_nameservice.suffix="$suffix" ++ EOF ++ ++ uci_commitverbose "Setup olsr nameservice plugin" $cfg ++} ++ ++setup_dyngw_plain() { ++ # Setup dyngw_plain ++ # If Sharing of Internet is enabled then enable dyngw_plain plugin ++ ++ if [ "$general_sharenet" == 1 ]; then ++ uci set $cfg.dyngw_plain=LoadPlugin ++ uci set $cfg.dyngw_plain.ignore=0 ++ uci set $cfg.dyngw_plain.library="olsrd_dyn_gw_plain.so.0.4" ++ uci_commitverbose "Setup olsrd_dyngw_plain plugin" $cfg ++ fi ++ ++} ++ ++setup_watchdog() { ++ # Setup watchdog ++ local watchdogfile="/var/run/olsrd.watchdog" ++ if [ "$proto" = "6" ]; then ++ watchdogfile="/var/run/olsrd.watchdog.ipv6" ++ fi ++ ++ uci batch <<- EOF ++ set $cfg.olsrd_watchdog=LoadPlugin ++ set $cfg.olsrd_watchdog.library="olsrd_watchdog.so.0.1" ++ set $cfg.olsrd_watchdog.file="$watchdogfile" ++ set $cfg.olsrd_watchdog.interval=30 ++ EOF ++ uci_commitverbose "Setup olsr watchdog plugin" $cfg ++ ++} ++ ++setup_jsoninfo() { ++ proto="$1" ++ uci batch <<- EOF ++ set $cfg.olsrd_jsoninfo=LoadPlugin ++ set $cfg.olsrd_jsoninfo.library="olsrd_jsoninfo.so.0.0" ++ EOF ++ if [ "$proto" = "6" ]; then ++ uci set $cfg.olsrd_jsoninfo.ipv6only='1' ++ fi ++ uci_commitverbose "Setup olsr jsoninfo plugin" $cfg ++} ++ ++setup_txtinfo() { ++ proto="$1" ++ uci batch <<- EOF ++ set $cfg.olsrd_txtinfo=LoadPlugin ++ set $cfg.olsrd_txtinfo.library="olsrd_txtinfo.so.0.1" ++ EOF ++ if [ "$proto" = "6" ]; then ++ uci set $cfg.olsrd_txtinfo.ipv6only='1' ++ fi ++ uci_commitverbose "Setup olsr txtinfo plugin" $cfg ++} ++ ++ ++for proto in $protocols; do ++ cfg="olsrd" ++ [ "$proto" == "6" ] && cfg="olsrd6" ++ config_load $cfg ++ clean_config ++ rename_olsrd ++ cleanup_plugins ++ ++ uci set $cfg.olsrd.IpVersion="$proto" ++ uci set $cfg.InterfaceDefaults=InterfaceDefaults ++ set_defaults "olsr_interfacedefaults_" $cfg.InterfaceDefaults ++ uci_commitverbose "Cleanup olsrd config" $cfg ++ ++ setup_nameservice ++ setup_dyngw_plain ++ setup_watchdog ++ setup_jsoninfo $proto ++ setup_txtinfo $proto ++done +diff --git a/feeds/luci/contrib/package/meshwizard/files/usr/bin/meshwizard/helpers/setup_olsrd_interface.sh b/feeds/luci/contrib/package/meshwizard/files/usr/bin/meshwizard/helpers/setup_olsrd_interface.sh +new file mode 100755 +index 0000000..8f21893 +--- /dev/null ++++ b/feeds/luci/contrib/package/meshwizard/files/usr/bin/meshwizard/helpers/setup_olsrd_interface.sh +@@ -0,0 +1,76 @@ ++#!/bin/sh ++# Sets up olsrd interfaces ++# arg $1 = net ++ ++net=$1 ++ ++. /lib/functions.sh ++. $dir/functions.sh ++ ++local protocols="4" ++if [ "$ipv6_enabled" = 1 ] && [ "$has_ipv6" == "1" ]; then ++ protocols="4 6" ++fi ++ ++for proto in $protocols; do ++ ++ cfg="olsrd" ++ [ "$proto" == "6" ] && cfg="olsrd6" ++ ++ # Rename interface for $netrenamed ++ handle_interface() { ++ config_get interface "$1" Interface ++ if [ "$interface" == "$netrenamed" ]; then ++ if [ -z "${1/cfg[0-9a-fA-F]*/}" ]; then ++ section_rename $cfg $1 $netrenamed ++ fi ++ fi ++ } ++ ++ config_foreach handle_interface Interface ++ ++ # Setup new interface for $netrenamed ++ ++ uci set $cfg.$netrenamed=Interface ++ set_defaults "olsr_interface_" $cfg.$net ++ uci set $cfg.$netrenamed.interface="$netrenamed" ++ ++ uci_commitverbose "Setup olsr interface for $netrenamed." $cfg ++ ++ if [ "$proto" = "4" ]; then ++ # If dhcp-network is inside the mesh_network then add HNA for it ++ ++ dhcprange=$(uci -q get meshwizard.netconfig.$net\_dhcprange) ++ uci -q delete $cfg.${netrenamed}clients ++ ++ if [ -n "$dhcprange" ]; then ++ meshnet="$(uci get profile_$community.profile.mesh_network)" ++ dhcpinmesh="$($dir/helpers/check-range-in-range.sh $dhcprange $meshnet)" ++ ++ if [ "$dhcpinmesh" == 1 ] && [ -n "$meshnet" ]; then ++ uci set $cfg.${netrenamed}clients="Hna4" ++ eval $(sh $dir/helpers/ipcalc-cidr.sh $dhcprange) ++ uci set $cfg.${netrenamed}clients.netaddr="$NETWORK" ++ uci set $cfg.${netrenamed}clients.netmask="$NETMASK" ++ uci_commitverbose "Setup HNA for network $dhcprange" $cfg ++ fi ++ fi ++ fi ++ ++ if [ "$proto" = "6" ]; then ++ # Set Hna entry for ipv6 net for static ipv6 config ++ uci -q delete $cfg.${netrenamed}static ++ if [ "$ipv6_config" = "static" ]; then ++ local v6range="$(uci -q get meshwizard.netconfig.$net\_ip6addr)" ++ local v6net="$(echo $v6range | cut -d '/' -f 1)" ++ local v6mask="$(echo $v6range | cut -d '/' -f 2)" ++ if [ -n "$v6net" ] && [ -n "$v6mask" ]; then ++ uci set $cfg.${netrenamed}static="Hna6" ++ uci set $cfg.${netrenamed}static.netaddr="$v6net" ++ uci set $cfg.${netrenamed}static.prefix="$v6mask" ++ uci_commitverbose "Setup HNA for network $v6range" $cfg ++ fi ++ fi ++ fi ++ ++done +\ No newline at end of file +diff --git a/feeds/luci/contrib/package/meshwizard/files/usr/bin/meshwizard/helpers/setup_policyrouting.sh b/feeds/luci/contrib/package/meshwizard/files/usr/bin/meshwizard/helpers/setup_policyrouting.sh +new file mode 100755 +index 0000000..f898bd6 +--- /dev/null ++++ b/feeds/luci/contrib/package/meshwizard/files/usr/bin/meshwizard/helpers/setup_policyrouting.sh +@@ -0,0 +1,11 @@ ++#!/bin/sh ++ ++. $dir/functions.sh ++ ++uci batch << EOF ++ set freifunk-policyrouting.pr.enable=1 ++ set freifunk-policyrouting.pr.strict=1 ++ set freifunk-policyrouting.pr.zones="freifunk" ++EOF ++ ++uci_commitverbose "Setup policyrouting" freifunk-policyrouting +diff --git a/feeds/luci/contrib/package/meshwizard/files/usr/bin/meshwizard/helpers/setup_qos.sh b/feeds/luci/contrib/package/meshwizard/files/usr/bin/meshwizard/helpers/setup_qos.sh +new file mode 100755 +index 0000000..25884b3 +--- /dev/null ++++ b/feeds/luci/contrib/package/meshwizard/files/usr/bin/meshwizard/helpers/setup_qos.sh +@@ -0,0 +1,17 @@ ++#!/bin/sh ++# sets up qos-scripts for the wan interface ++ ++. /lib/functions.sh ++. $dir/functions.sh ++ ++if [ ! -f /etc/config/qos ]; then ++ echo "NOT setting up QOS because /etc/config/qos-scripts was not found" ++else ++ uci batch <<- EOF ++ set qos.wan.enabled=1 ++ set qos.wan.upload=$wan_up ++ set qos.wan.download=$wan_down ++ EOF ++ uci_commitverbose "Setup QOS on WAN interface." qos ++ ++fi +diff --git a/feeds/luci/contrib/package/meshwizard/files/usr/bin/meshwizard/helpers/setup_splash.sh b/feeds/luci/contrib/package/meshwizard/files/usr/bin/meshwizard/helpers/setup_splash.sh +new file mode 100755 +index 0000000..3c3e6a3 +--- /dev/null ++++ b/feeds/luci/contrib/package/meshwizard/files/usr/bin/meshwizard/helpers/setup_splash.sh +@@ -0,0 +1,54 @@ ++#!/bin/sh ++# Setup_splash, takes 1 argument: 1=net ++ ++. /lib/functions.sh ++. $dir/functions.sh ++ ++net=$1 ++vap=$(uci -q get meshwizard.netconfig.${net}_vap) ++ ++if [ ! "$has_luci_splash" == TRUE ]; then ++ echo " Luci Splash is not installed, skipping setup of it." ++ exit ++fi ++ ++set_defaults "luci_splash_" luci_splash.general ++uci_commitverbose "Setup general splash settings" luci_splash ++ ++dhcprange=$(uci -q get meshwizard.netconfig.$net\_dhcprange) ++ ++splash_net_add() { ++ uci batch <<- EOF ++ set luci_splash.$1="iface" ++ set luci_splash.$1.network="$1" ++ set luci_splash.$1.zone="freifunk" ++ EOF ++} ++ ++if [ "$(uci -q get meshwizard.netconfig.$net\_dhcp)" = 1 ] && [ -n "$dhcprange" ]; then ++ handle_splash() { ++ config_get network "$1" network ++ if [ "$network" == "${netrenamed}dhcp" ]; then ++ if [ -z "${1/cfg[0-9a-fA-F]*/}" ]; then ++ section_rename luci_splash $1 ${netrenamed}dhcp ++ fi ++ fi ++ } ++ config_load luci_splash ++ config_foreach handle_splash iface ++ ++ if [ "$supports_vap" = 1 -a "$vap" = 1 ]; then ++ splash_net_add ${netrenamed}dhcp ++ uci_commitverbose "Setup dhcpsplash for ${netrenamed}dhcp" luci_splash ++ fi ++ ++ ahdhcp_when_vap="$(uci get profile_$community.profile.adhoc_dhcp_when_vap)" ++ if [ "$supports_vap" = 0 ] || \ ++ [ "$supports_vap" = 1 -a "$vap" = 1 -a "$ahdhcp_when_vap" = 1 ] || \ ++ [ "$lan_dhcp" = 1 ]; then ++ splash_net_add ${netrenamed}ahdhcp ++ uci_commitverbose "Setup dhcpsplash for ${netrenamed}ahdhcp" luci_splash ++ fi ++ /etc/init.d/luci_splash enable ++fi ++ +diff --git a/feeds/luci/contrib/package/meshwizard/files/usr/bin/meshwizard/helpers/setup_ssh.sh b/feeds/luci/contrib/package/meshwizard/files/usr/bin/meshwizard/helpers/setup_ssh.sh +new file mode 100755 +index 0000000..38b331e +--- /dev/null ++++ b/feeds/luci/contrib/package/meshwizard/files/usr/bin/meshwizard/helpers/setup_ssh.sh +@@ -0,0 +1,26 @@ ++#!/bin/sh ++# Setup ssh. At this point only used to store pubkeys. ++ ++[ ! "$(uci -q get meshwizard.ssh)" == "system" ] && exit ++ ++. /lib/functions.sh ++. $dir/functions.sh ++authorized="/etc/dropbear/authorized_keys" ++ ++ ++config_load meshwizard ++ ++i=0 ++handle_pubkeys() { ++ local k="$1" ++ ( [ -f "$authorized" ] && grep -q "$k" $authorized) || { ++ echo "$k" >> $authorized ++ i=`expr $i + 1` ++ } ++} ++ ++config_list_foreach ssh pubkey handle_pubkeys ++ ++uci delete meshwizard.ssh ++uci_commitverbose "Added $i pubkeys to authorized_keys" meshwizard ++ +diff --git a/feeds/luci/contrib/package/meshwizard/files/usr/bin/meshwizard/helpers/setup_system.sh b/feeds/luci/contrib/package/meshwizard/files/usr/bin/meshwizard/helpers/setup_system.sh +new file mode 100755 +index 0000000..e9ce953 +--- /dev/null ++++ b/feeds/luci/contrib/package/meshwizard/files/usr/bin/meshwizard/helpers/setup_system.sh +@@ -0,0 +1,7 @@ ++#!/bin/sh ++ ++. $dir/functions.sh ++ ++set_defaults "system_" system.system ++uci -q delete meshwizard.system && uci commit meshwizard ++uci_commitverbose "System config" system +diff --git a/feeds/luci/contrib/package/meshwizard/files/usr/bin/meshwizard/helpers/setup_uhttpd.sh b/feeds/luci/contrib/package/meshwizard/files/usr/bin/meshwizard/helpers/setup_uhttpd.sh +new file mode 100755 +index 0000000..b25a175 +--- /dev/null ++++ b/feeds/luci/contrib/package/meshwizard/files/usr/bin/meshwizard/helpers/setup_uhttpd.sh +@@ -0,0 +1,11 @@ ++#!/bin/sh ++. $dir/functions.sh ++if [ "$ipv6_enabled" = "1" ]; then ++ uci batch <<- EOF ++ set uhttpd.main.listen_http="80" ++ set uhttpd.main.listen_https="443" ++ EOF ++fi ++ ++uci_commitverbose "Setup uhttpd" uhttpd ++ +diff --git a/feeds/luci/contrib/package/meshwizard/files/usr/bin/meshwizard/helpers/setup_wan_dhcp.sh b/feeds/luci/contrib/package/meshwizard/files/usr/bin/meshwizard/helpers/setup_wan_dhcp.sh +new file mode 100755 +index 0000000..91fc1d8 +--- /dev/null ++++ b/feeds/luci/contrib/package/meshwizard/files/usr/bin/meshwizard/helpers/setup_wan_dhcp.sh +@@ -0,0 +1,18 @@ ++#!/bin/sh ++# Setup dhcp interface settings for wan. This is the OpenWrt default, ++# so all we need to do here is to delete wan from meshwizard after setup. ++# Also disallow ra on wan if ipv6 is enabled ++ ++[ ! "$(uci -q get network.wan)" == "interface" ] && exit ++ ++. /lib/functions.sh ++. $dir/functions.sh ++ ++if [ "$ipv6_enabled" = "1" ]; then ++ uci set network.wan.accept_ra='0' ++ uci_commitverbose "Do not accept ra on wan interface" network ++fi ++ ++ ++uci delete meshwizard.wan && uci commit meshwizard ++ +diff --git a/feeds/luci/contrib/package/meshwizard/files/usr/bin/meshwizard/helpers/setup_wan_static.sh b/feeds/luci/contrib/package/meshwizard/files/usr/bin/meshwizard/helpers/setup_wan_static.sh +new file mode 100755 +index 0000000..570470a +--- /dev/null ++++ b/feeds/luci/contrib/package/meshwizard/files/usr/bin/meshwizard/helpers/setup_wan_static.sh +@@ -0,0 +1,20 @@ ++#!/bin/sh ++# Setup static interface settings for wan if wan is not an olsr interface ++ ++[ ! "$(uci -q get network.wan)" == "interface" ] && exit ++ ++. /lib/functions.sh ++. $dir/functions.sh ++ ++uci batch << EOF ++set network.wan.proto='$wan_proto' ++set network.wan.ipaddr='$wan_ip4addr' ++set network.wan.netmask='$wan_netmask' ++set network.wan.gateway='$wan_gateway' ++set network.wan.dns='$wan_dns' ++EOF ++ ++uci_commitverbose "Setup static ip settings for wan" network ++ ++uci delete meshwizard.wan && uci commit meshwizard ++ +diff --git a/feeds/luci/contrib/package/meshwizard/files/usr/bin/meshwizard/helpers/setup_widgets.sh b/feeds/luci/contrib/package/meshwizard/files/usr/bin/meshwizard/helpers/setup_widgets.sh +new file mode 100755 +index 0000000..288252f +--- /dev/null ++++ b/feeds/luci/contrib/package/meshwizard/files/usr/bin/meshwizard/helpers/setup_widgets.sh +@@ -0,0 +1,14 @@ ++#!/bin/sh ++. /lib/functions.sh ++ . $dir/functions.sh ++ ++if [ -n "$widgets" ]; then ++ [ ! -f "/etc/config/freifunk-widgets" ] && touch /etc/config/freifunk-widgets ++ for w in $widgets; do ++ uci set freifunk-widgets.${w}=widget ++ set_defaults "${w}_" freifunk-widgets.${w} ++ uci delete profile_$community.${w} ++ done ++ uci commit profile_$community ++ uci_commitverbose "Added widget config." freifunk-widgets ++fi +diff --git a/feeds/luci/contrib/package/meshwizard/files/usr/bin/meshwizard/helpers/setup_wifi.sh b/feeds/luci/contrib/package/meshwizard/files/usr/bin/meshwizard/helpers/setup_wifi.sh +new file mode 100755 +index 0000000..41feb86 +--- /dev/null ++++ b/feeds/luci/contrib/package/meshwizard/files/usr/bin/meshwizard/helpers/setup_wifi.sh +@@ -0,0 +1,85 @@ ++#!/bin/sh ++# sets up a wifi interface for meshing ++# Arguments: $1 = network interface ++ ++net="$1" ++. /lib/functions.sh ++. $dir/functions.sh ++ ++##### wifi-device ##### ++ ++# Get the type before we delete the wifi-device ++config_load wireless ++config_get type $net type ++ ++# Rename wifi-device for $net ++ ++handle_wifidevice() { ++ if [ -z "${1/cfg[0-9a-fA-F]*/}" ]; then ++ section_rename wireless $1 $net ++ fi ++} ++config_foreach handle_wifidevice wifi-device ++ ++# create new wifi-device for $net ++uci set wireless.${net}=wifi-device ++ ++# get and set wifi-device defaults ++set_defaults "wifi_device_" wireless.${net} ++ ++channel="$(uci -q get meshwizard.netconfig.$net\_channel)" ++ ++if [ -z "$channel" -o "$channel" == "default" ]; then ++ channel=$wifi_device_channel ++fi ++ ++uci batch << EOF ++ set wireless.${net}.type="$type" ++ set wireless.${net}.channel="$channel" ++EOF ++ ++uci_commitverbose "Setup wifi device for $netrenamed" wireless ++ ++##### wifi iface ++ ++# Rename wifi-iface for $net ++handle_interface() { ++ config_get device "$1" device ++ if [ "$device" == "$net" ]; then ++ if [ -z "${1/cfg[0-9a-fA-F]*/}" ]; then ++ section_rename wireless $1 ${net}_iface ++ fi ++ fi ++} ++config_foreach handle_interface wifi-iface ++ ++# create new wifi-device for $net ++uci set wireless.$net\_iface=wifi-iface ++ ++# create new wifi-iface for $net from defaults ++set_defaults "wifi_iface_" wireless.$net\_iface ++ ++# overwrite some settings for type atheros (madwifi) ++if [ "$type" = "atheros" ]; then ++ set_defaults "madwifi_wifi_iface_" wireless.${net} ++fi ++ ++# overwrite defaults ++bssid="$($dir/helpers/gen_bssid.sh $channel $community)" ++ ++ssid="$profile_ssid" ++if [ "$profile_ssid_scheme" == "addchannel" ]; then ++ ssid="$ssid - ch$channel" ++elif [ "$profile_ssid_scheme" == "addchannelbefore" ]; then ++ ssid="ch$channel.$ssid" ++fi ++ ++uci batch << EOF ++ set wireless.$net\_iface.device="${net}" ++ set wireless.$net\_iface.network="$netrenamed" ++ set wireless.$net\_iface.ssid="$ssid" ++ set wireless.$net\_iface.bssid="$bssid" ++EOF ++ ++uci_commitverbose "Setup wifi interface for $netrenamed" wireless ++ +diff --git a/feeds/luci/contrib/package/meshwizard/files/usr/bin/meshwizard/helpers/setup_wifi_vap.sh b/feeds/luci/contrib/package/meshwizard/files/usr/bin/meshwizard/helpers/setup_wifi_vap.sh +new file mode 100755 +index 0000000..df58ad7 +--- /dev/null ++++ b/feeds/luci/contrib/package/meshwizard/files/usr/bin/meshwizard/helpers/setup_wifi_vap.sh +@@ -0,0 +1,23 @@ ++#!/bin/sh ++# sets up a wifi interface for meshing ++# Arguments: $1 = network interface ++ ++net="$1" ++. /lib/functions.sh ++. $dir/functions.sh ++ ++## Setup a VAP interface in AP Mode ++ip4addr="$(uci get meshwizard.netconfig.$net\_ip4addr)" ++vap="$(uci -q get meshwizard.netconfig.$net\_vap)" ++ ++if [ "$supports_vap" == 1 -a "$vap" == 1 ]; then ++ uci batch <<- EOF ++ set wireless.$net\_iface_dhcp="wifi-iface" ++ set wireless.$net\_iface_dhcp.device="$net" ++ set wireless.$net\_iface_dhcp.mode="ap" ++ set wireless.$net\_iface_dhcp.encryption="none" ++ set wireless.$net\_iface_dhcp.network="${netrenamed}dhcp" ++ set wireless.$net\_iface_dhcp.ssid="Freifunk-$ip4addr" ++ EOF ++ uci_commitverbose "Setup VAP interface for $netrenamed" wireless ++fi +diff --git a/feeds/luci/contrib/package/meshwizard/files/usr/bin/meshwizard/helpers/supports_vap.sh b/feeds/luci/contrib/package/meshwizard/files/usr/bin/meshwizard/helpers/supports_vap.sh +new file mode 100755 +index 0000000..0585ab5 +--- /dev/null ++++ b/feeds/luci/contrib/package/meshwizard/files/usr/bin/meshwizard/helpers/supports_vap.sh +@@ -0,0 +1,34 @@ ++#!/bin/sh ++# checks if a given device can be used for a VAP interface (1 adhoc + 1 ap) ++dev="$1" ++type="$2" ++ ++ ++if [ -z "$dev" -o -z "$type" ]; then ++ exit 1 ++fi ++ ++if [ "$type" = "atheros" ]; then ++ exit 0 ++elif [ "$type" = "mac80211" ]; then ++ # not hostapd[-mini], no VAP ++ if [ ! -x /usr/sbin/hostapd ]; then ++ echo "WARNING: hostapd[-mini] is required to be able to use VAP with mac80211." ++ exit 1 ++ fi ++ # get driver in use ++ netindex="$(echo $dev |sed 's/[a-zA-z]*//')" ++ if [ -d /sys/class/net/wlan${netindex}/device/driver/module ]; then ++ driver="$(basename $(ls -l /sys/class/net/wlan${netindex}/device/driver/module | sed -ne 's/.* -> //p'))" ++ if [ "$driver" = "ath9k" -o "$driver" = "ath5k" ]; then ++ exit 0 ++ else ++ exit 1 ++ fi ++ else ++ exit 1 ++ fi ++else ++ exit 1 ++fi ++ +diff --git a/feeds/luci/contrib/package/meshwizard/files/usr/bin/meshwizard/wizard.sh b/feeds/luci/contrib/package/meshwizard/files/usr/bin/meshwizard/wizard.sh +new file mode 100755 +index 0000000..3721489 +--- /dev/null ++++ b/feeds/luci/contrib/package/meshwizard/files/usr/bin/meshwizard/wizard.sh +@@ -0,0 +1,147 @@ ++#!/bin/sh ++ ++# This collection of scripts will take settings from /etc/config/meshwizard, /etc/config/freifunk ++# and /etc/config/profile_ and setup the router to participate in wireless mesh networks ++ ++# Copyright 2011 Manuel Munz ++ ++# Licensed under the Apache License, Version 2.0 (the "License") ++# You may not use this file except in compliance with the License. ++# You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 ++ ++echo " ++/* Meshwizard 0.3.1 */ ++" ++ ++# config ++export dir="/usr/bin/meshwizard" ++ ++. /lib/functions.sh ++. $dir/functions.sh ++. $dir/helpers/read_defaults.sh ++[ -f /proc/net/ipv6_route ] && export has_ipv6=1 ++ ++# Check which packages we have installed ++export has_luci=FALSE ++opkg list_installed |grep luci-mod-admin > /dev/null && export has_luci=TRUE ++export has_luci_splash=FALSE ++opkg list_installed |grep luci-app-splash > /dev/null && export has_luci_splash=TRUE ++ ++# Check whether we want to cleanup/restore uci config before setting new options ++cleanup=$(uci -q get meshwizard.general.cleanup) ++[ "$cleanup" == 1 ] && restore_factory_defaults ++ ++# Rename wifi interfaces ++$dir/helpers/rename-wifi.sh ++ ++export lan_is_olsr="$(uci -q get meshwizard.netconfig.lan_config)" ++ ++# Get community ++community="$(uci -q get meshwizard.community.name || uci -q get freifunk.community.name)" ++[ -z "$community" ] && echo "Error: Community is not set in /etc/config/freifunk, aborting now." && exit 1 ++export community="$community" ++ ++# we need a list of widgets later on. It will be populated in read_defaults.sh ++local widgets="" ++ ++# Get a list of networks we need to setup ++networks=$(uci show meshwizard.netconfig | grep -v "netconfig=" | sed -e 's/meshwizard.netconfig\.\(.*\)\_.*/\1/' |sort|uniq) ++export networks ++[ -z "$networks" ] && echo "Error: No networks to setup could be found in /etc/config/meshwizard, aborting now." && exit 1 ++ ++# Read defaults and node config ++read_defaults $community ++ ++# Do config ++$dir/helpers/initial_config.sh ++$dir/helpers/setup_dnsmasq.sh ++$dir/helpers/setup_system.sh ++$dir/helpers/setup_olsrd.sh ++$dir/helpers/setup_firewall.sh ++$dir/helpers/setup_ssh.sh ++$dir/helpers/setup_uhttpd.sh ++$dir/helpers/setup_widgets.sh ++ ++if [ "$wan_proto" == "static" ] && [ -n "$wan_ip4addr" ] && [ -n "$wan_netmask" ]; then ++ $dir/helpers/setup_wan_static.sh ++fi ++ ++if [ "$wan_proto" == "dhcp" ]; then ++ $dir/helpers/setup_wan_dhcp.sh ++fi ++ ++if [ -n "$wan_down" -a -n "$wan_up" ]; then ++ $dir/helpers/setup_qos.sh ++fi ++ ++if [ "$lan_proto" == "static" ] && [ -n "$lan_ip4addr" ] && [ -n "$lan_netmask" ]; then ++ $dir/helpers/setup_lan_static.sh ++fi ++ ++if [ "$ipv6_enabled" == 1 ] && [ "$has_ipv6" = 1 ]; then ++ $dir/helpers/setup_lan_ipv6.sh ++ # Setup auto-ipv6 ++ if [ -n "$(echo "$ipv6_config" |grep auto-ipv6)" ]; then ++ $dir/helpers/setup_auto-ipv6.sh ++ fi ++fi ++ ++# Setup policyrouting if internet sharing is disabled and wan is not used for olsrd ++# Always disable it first to make sure its disabled when the user decied to share his internet ++uci set freifunk-policyrouting.pr.enable=0 ++if [ ! "$general_sharenet" == 1 ] && [ ! "$(uci -q get meshwizard.netconfig.wan_proto)" == "olsr" ]; then ++ $dir/helpers/setup_policyrouting.sh ++fi ++ ++# Configure found networks ++for net in $networks; do ++ # radioX devices need to be renamed ++ netrenamed="${net/radio/wireless}" ++ export netrenamed ++ ++ if [ ! "$net" == "wan" ] && [ ! "$net" == "lan" ]; then ++ $dir/helpers/setup_wifi.sh $net ++ # check if this net supports vap ++ /sbin/wifi # wifi needs to be up for the check ++ export supports_vap="0" ++ type="$(uci -q get wireless.$net.type)" ++ [ -n "$type" ] && $dir/helpers/supports_vap.sh $net $type && export supports_vap=1 ++ if [ "$supports_vap" = 1 ]; then ++ $dir/helpers/setup_wifi_vap.sh $net ++ fi ++ fi ++ ++ $dir/helpers/setup_network.sh $net ++ ++ $dir/helpers/setup_olsrd_interface.sh $net ++ ++ net_dhcp=$(uci -q get meshwizard.netconfig.${net}_dhcp) ++ export ${net}_dhcp=$net_dhcp ++ ++ if [ "$net" = "lan" ] && [ "$lan_is_olsr" = "1" ]; then ++ uci -q set dhcp.lan.ignore="1" ++ uci_commitverbose "Disable DHCP on LAN because it is an olsr interface." dhcp ++ fi ++ ++ if [ "$net_dhcp" == 1 ]; then ++ $dir/helpers/setup_dhcp.sh $net ++ fi ++ ++ $dir/helpers/setup_splash.sh $net ++ $dir/helpers/setup_firewall_interface.sh $net ++ ++ if [ -n "$(echo "$ipv6_config" |grep auto-ipv6)" ]; then ++ $dir/helpers/setup_auto-ipv6-interface.sh $net ++ fi ++done ++ ++##### postinstall script ++ ++[ -f /etc/rc.local.meshkitpostinstall ] && /etc/rc.local.meshkitpostinstall ++ ++ ++##### Reboot the router (because simply restarting services gave errors) ++ ++echo "+ The wizard has finished and the router will reboot now." ++ ++reboot +diff --git a/feeds/luci/contrib/package/remote-update/Makefile b/feeds/luci/contrib/package/remote-update/Makefile +new file mode 100644 +index 0000000..4f8b3a5 +--- /dev/null ++++ b/feeds/luci/contrib/package/remote-update/Makefile +@@ -0,0 +1,43 @@ ++# ++# Copyright (C) 2009 Jo-Philipp Wich ++# ++# This is free software, licensed under the Apache 2.0 license. ++# ++ ++include $(TOPDIR)/rules.mk ++ ++PKG_NAME:=remote-update ++PKG_RELEASE:=4 ++ ++PKG_BUILD_DIR := $(BUILD_DIR)/$(PKG_NAME) ++ ++include $(INCLUDE_DIR)/package.mk ++ ++define Package/remote-update ++ SECTION:=luci ++ CATEGORY:=LuCI ++ SUBMENU:=9. Freifunk ++ TITLE:=Freifunk remote update utility. ++ DEPENDS:=@TARGET_atheros||@TARGET_ar71xx||@TARGET_brcm_2_4 ++endef ++ ++define Package/remote-update/description ++ The freifunk remote-update utility uses sysupgrade to reflash the currently ++ running firmware while keeping most of the existing configuratio. ++endef ++ ++define Build/Prepare ++ mkdir -p $(PKG_BUILD_DIR) ++endef ++ ++define Build/Configure ++endef ++ ++define Build/Compile ++endef ++ ++define Package/remote-update/install ++ $(CP) ./files/* $(1)/ ++endef ++ ++$(eval $(call BuildPackage,remote-update)) +diff --git a/feeds/luci/contrib/package/remote-update/files/usr/sbin/remote-update b/feeds/luci/contrib/package/remote-update/files/usr/sbin/remote-update +new file mode 100755 +index 0000000..6e45e48 +--- /dev/null ++++ b/feeds/luci/contrib/package/remote-update/files/usr/sbin/remote-update +@@ -0,0 +1,306 @@ ++#!/bin/sh ++ ++local tempfile=/tmp/remote-upgrade.img ++local D2='\([0-9]\{2\}\)' ++local D4='\([0-9]\{4\}\)' ++local NL=' ++' ++ ++find_architecture() ++{ ++ local ifs="$IFS"; IFS="-" ++ set -- $(opkg list_installed kernel) ++ IFS="$ifs" ++ ++ echo "$3" ++} ++ ++find_image() ++{ ++ case "$1" in ++ atheros) ++ echo "openwrt-atheros-combined.squashfs.img" ++ ;; ++ ar71xx) ++ echo "openwrt-ar71xx-combined.squashfs.img" ++ ;; ++ brcm) ++ echo "openwrt-brcm-2.4-squashfs.trx" ++ ;; ++ esac ++} ++ ++check_image() ++{ ++ local file; for file in /lib/upgrade/*.sh; do . $file; done ++ if platform_check_image "$1" >/dev/null 2>/dev/null; then ++ return 0 ++ fi ++ return 1 ++} ++ ++find_remote_checksum() ++{ ++ wget -qO- ${1%/*}/md5sums 2>/dev/null | \ ++ sed -ne '/'$2'/ { s/ .*//p }' ++} ++ ++find_local_checksum() ++{ ++ set -- $(md5sum "$tempfile") ++ echo $1 ++} ++ ++find_remote_info() ++{ ++ wget -qO- "${1%/*}/VERSION.txt" 2>/dev/null ++} ++ ++find_remote_version() ++{ ++ find_remote_info "$1" | \ ++ sed -ne "s!.*$D4/$D2/$D2 $D2:$D2.*!\\1\\2\\3\\4\\5!p;t" ++} ++ ++find_local_version() ++{ ++ if [ -f /rom/etc/banner ]; then ++ sed -ne "s!.*$D4/$D2/$D2 $D2:$D2.*!\\1\\2\\3\\4\\5!p;t" \ ++ /rom/etc/banner ++ else ++ date +"%Y%m%d%H%M" -r /bin/sh ++ fi ++} ++ ++stop_service() ++{ ++ [ -x /etc/init.d/$1 ] && { ++ echo -n "Stopping service $1 ... " ++ /etc/init.d/$1 stop >/dev/null 2>/dev/null ++ echo "done" ++ } ++} ++ ++do_wait() ++{ ++ if [ ${1:-0} -gt 0 ]; then ++ echo -n "${2:-Waiting} " ++ for i in $(seq 1 $1); do ++ printf "%-2dseconds" $(($1-$i)) ++ sleep 1 ++ echo -en "\b\b\b\b\b\b\b\b\b" ++ done ++ echo "${NL}" ++ fi ++} ++ ++version_compare() ++{ ++ local v1="$1" ++ local v2="$2" ++ ++ while [ -n "$v1" -o -n "$v2" ]; do ++ if [ -z "${v2:0:4}" -o "${v1:0:4}" -gt "${v2:0:4}" ]; then ++ return 1 ++ elif [ -z "${v1:0:4}" -o "${v1:0:4}" -lt "${v2:0:4}" ]; then ++ return 2 ++ fi ++ ++ v1="${v1:4}" ++ v2="${v2:4}" ++ done ++ ++ return 0 ++} ++ ++usage() ++{ ++ cat <] -c ++ remote-update [-v] [-y] [-u ] -w ++ remote-update [-d] [-n] [-v] [-y] [-s ] [-u ] ++ ++Actions: ++ -h Display this help message and exit. ++ -c Check for firmware update and exit. ++ -w Fetch image and exit, do not perform flash write. ++ ++Options: ++ -d Do not detach from terminal. ++ -n Do not backup configuration. ++ -v Skip verification of downloaded image. ++ -y Assume defaults for all questions. ++ ++ -s ++ Sleep given amount of seconds before starting flash write. ++ If ommitted and '-y' is not used, 5 seconds are assumed. ++ ++ -u ++ Fetch firmware image from given url. A file "md5sums" is expected ++ in the same remote directory. If there is no such file, use -v to ++ suppress verification. ++ ++EOT ++ ++ exit 1 ++} ++ ++ ++while getopts "s:u:cdnvwyh" flag; do ++ case $flag in ++ s) sleeptime="$OPTARG";; ++ u) updateurl="$OPTARG";; ++ c) checkupdate=1;; ++ d) nodetach=1;; ++ n) nobackup=1;; ++ v) noverify=1;; ++ w) noflash=1;; ++ y) noquestions=1;; ++ *) usage;; ++ esac ++done ++ ++ ++local image_url="$updateurl" ++local image_name="${image_url##*/}" ++ ++[ -z "$image_url" ] && { ++ local arch=$(find_architecture) ++ local image=$(find_image "$arch") ++ local repo=$(uci get freifunk.upgrade.repository 2>/dev/null) ++ repo=${repo:-$(uci get system.upgrade.repository 2>/dev/null)} ++ ++ [ -z "$arch" ] && { ++ echo "Can not determine the current architecture." ++ exit 1 ++ } ++ ++ [ -z "$repo" ] && { ++ echo "No repository configured in 'system.upgrade.repository'." ++ echo "Use the '-u' flag to specify an image location." ++ exit 1 ++ } ++ ++ [ -z "$image" ] && { ++ echo "No suitable image for the '$arch' architecture." ++ echo "Your platform is not supported." ++ exit 1 ++ } ++ ++ echo "Architecture: $arch" ++ echo "Repository: $repo" ++ ++ image_name="$image" ++ image_url="${repo%/}/$arch/$image" ++} ++ ++ ++if [ "$checkupdate" = 1 ]; then ++ local v1=$(find_local_version) ++ local v2=$(find_remote_version "$image_url") ++ ++ [ -n "$v1" -a -n "$v2" ] && { ++ version_compare "$v1" "$v2" ++ [ $? == 2 ] && { ++ echo "Update available!${NL}Local: $v1${NL}Remote: $v2${NL}--" ++ find_remote_info "$image_url" ++ exit 0 ++ } || { ++ echo "Local version $v1 is up to date" ++ exit 2 ++ } ++ } || { ++ echo "No remote time stamp found." ++ exit 1 ++ } ++else ++ if [ "$noquestions" != 1 ]; then ++ echo -n "${NL}About to download $image_name. Continue? [y] " ++ read answer ++ case "$answer" in ++ [nN]) exit 1;; ++ esac ++ fi ++ ++ echo -n "Downloading $image_name ... " ++ rm -f $tempfile ++ wget -qO $tempfile "$image_url" 2>/dev/null ++ [ $? == 0 ] && echo done || { ++ echo failed ++ rm -f $tempfile ++ exit 1 ++ } ++ ++ if [ "$noverify" != 1 ]; then ++ echo -n "Verifying $image_name ... " ++ ++ local md5_remote=$(find_remote_checksum "$image_url" "$image_name") ++ local md5_local=$(find_local_checksum) ++ ++ check_image "$tempfile" ++ local image_ok=$? ++ ++ if [ $image_ok = 0 -a -n "$md5_remote" -a -n "$md5_local" -a "$md5_remote" = "$md5_local" ]; then ++ echo "done" ++ else ++ if [ $image_ok != 0 ]; then ++ echo "unsupported image type" ++ else ++ echo "checksum mismatch! (local:${md5_local:-(none)} remote:${md5_remote:-(none)})" ++ fi ++ ++ local answer=n ++ if [ "$noquestions" != 1 ]; then ++ echo -n "${NL}Verification failed. Continue anyway? [n] " ++ read answer ++ fi ++ ++ case "$answer" in ++ [yYjJ]*) : ;; ++ *) ++ echo "Aborting." ++ rm -f $tempfile ++ exit 1 ++ ;; ++ esac ++ fi ++ fi ++ ++ if [ "$noflash" != 1 ]; then ++ if [ -f "$tempfile" ]; then ++ if [ "$noquestions" == 1 ]; then ++ do_wait ${sleeptime:-5} "${NL}About to start flashing, hit to abort!${NL}${NL}Starting in" ++ else ++ if [ -z "$nobackup" ]; then ++ echo -n "${NL}Keep configuration files? [y] " ++ read answer ++ case "$answer" in ++ [nN]) nobackup=1;; ++ esac ++ fi ++ ++ echo -n "${NL}About to start flashing!${NL}Hit to continue or to abort.${NL}" ++ read answer ++ fi ++ ++ for s in lucid collectd; do stop_service $s; done ++ ++ if [ "$nodetach" != 1 ]; then ++ echo -n "Starting sysupgrade in background ... " ++ /bin/busybox start-stop-daemon -S -b -x /sbin/sysupgrade -- ${nobackup:+-n} "$tempfile" ++ echo "done" ++ else ++ echo "Executing sysupgrade ... " ++ exec /sbin/sysupgrade ${nobackup:+-n} "$tempfile" ++ fi ++ else ++ echo "No upgrade image found!" ++ exit 1 ++ fi ++ else ++ echo "Image saved in '$tempfile'" ++ fi ++fi +diff --git a/feeds/luci/documentation/CBI.md b/feeds/luci/documentation/CBI.md +new file mode 100644 +index 0000000..0b47c22 +--- /dev/null ++++ b/feeds/luci/documentation/CBI.md +@@ -0,0 +1,248 @@ ++CBI models are Lua files describing the structure of an UCI config file and the resulting HTML form to be evaluated by the CBI parser. ++All CBI model files must return an object of type *luci.cbi.Map*. For a commented example of a CBI model, see the [[Documentation/ModulesHowTo#CBImodels|Writing Modules tutorial]]. ++ ++The scope of a CBI model file is automatically extended by the contents of the module *luci.cbi_' and the '_translate* function from luci.i18n ++ ++This Reference covers *the basics* of the CBI system. ++ ++ ++ ++# class Map (_config'', ''title'', ''description_) ++This is the root object of the model. ++* *config*: configuration name to be mapped, see uci documentation and the files in /etc/config ++* *title*: title shown in the UI ++* *description*: description shown in the UI ++ ++## :section (_sectionclass_, ...) ++Creates a new section ++* *sectionclass*: a class object of the section ++* _additional parameters passed to the constructor of the section class_ ++ ++---- ++ ++# class NamedSection (_name'', ''type'', ''title'', ''description_) ++An object describing an UCI section selected by the name. ++Use [[#A.3Asection.28.27.27sectionclass.27.27.2C....29|Map:section(NamedSection, _name'', ''type'', ''title'', ''description_)]] to instantiate. ++* *name*: section name ++* *type*: section type ++* *title*: The title shown in the UI ++* *description*: description shown in the UI ++ ++## .addremove = false ++Allows the user to remove and recreate the configuration section ++ ++## .dynamic = false ++Marks this section as dynamic. Dynamic sections can contain an undefinded number of completely userdefined options. ++ ++## .optional = true ++Parse optional options ++ ++ ++## :option (_optionclass_, ...) ++Creates a new option ++* *optionclass*: a class object of the section ++* _additional parameters passed to the constructor of the option class_ ++ ++---- ++ ++# class TypedSection (_type'', ''title'', ''description_) ++An object describing a group of UCI sections selected by their type. ++Use [[#A.3Asection.28.27.27sectionclass.27.27.2C....29|Map:section(TypedSection, _type'', ''title'', ''description_)]] to instantiate. ++* *type*: section type ++* *title*: The title shown in the UI ++* *description*: description shown in the UI ++ ++## .addremove = false ++Allows the user to remove and recreate the configuration section ++ ++## .dynamic = false ++Marks this section as dynamic. Dynamic sections can contain an undefinded number of completely userdefined options. ++ ++## .optional = true ++Parse optional options ++ ++## .anonymous = false ++Do not show section names ++ ++ ++## :depends (_key'', ''value_) ++Only select those sections where the option _key'' == ''value_
    ++If you call this function several times the dependencies will be linked with *or* ++ ++## .filter (_self'', ''section_) [abstract] ++You can override this function to filter certain sections that will not be parsed. ++The filter function will be called for every section that should be parsed and returns *nil* for sections that should be filtered. For all other sections it should return the section name as given in the second parameter. ++ ++## :option (_optionclass_, ...) ++Creates a new option ++ _optionclass_: a class object of the section ++ additional parameters passed to the constructor of the option class ++ ++---- ++ ++# class Value (_option'', ''title'', ''description_) ++An object describing an option in a section of a UCI File. Creates a standard text field in the formular. ++Use [[#A.3Aoption.28.27.27optionclass.27.27.2C....29|NamedSection:option(Value, _option'', ''title'', ''description'')]] or [[#A.3Aoption.28.27.27optionclass.27.27.2C....29-1|TypedSection:option(Value, ''option'', ''title'', ''description_)]] to instantiate. ++* *option*: section name ++* *title*: The title shown in the UI ++* *description*: description shown in the UI ++ ++## .default = nil ++The default value ++ ++## .maxlength = nil ++The maximum length of the value ++ ++## .optional = false ++Marks this option as optional, implies .rmempty = true ++ ++## .rmempty = true ++Removes this option from the configuration file when the user enters an empty value ++ ++## .size = nil ++The size of the form field ++ ++## :value (_key'', ''value'' = ''key_) ++Convert this text field into a combobox if possible and add a selection option. ++ ++ ++## :depends (_key'', ''value_) ++Only show this option field if another option _key'' is set to ''value_ in the same section.
    ++If you call this function several times the dependencies will be linked with *or* ++ ++---- ++ ++# class ListValue (_option'', ''title'', ''description_) ++An object describing an option in a section of a UCI File. Creates a list box in the formular. ++Use [[#A.3Aoption.28.27.27optionclass.27.27.2C....29|NamedSection:option(Value, _option'', ''title'', ''description'')]] or [[#A.3Aoption.28.27.27optionclass.27.27.2C....29-1|TypedSection:option(Value, ''option'', ''title'', ''description_)]] to instantiate. ++* *option*: section name ++* *title*: The title shown in the UI ++* *description*: description shown in the UI ++ ++ ++## .default = nil ++The default value ++ ++## .optional = false ++Marks this option as optional, implies .rmempty = true ++ ++## .rmempty = true ++Removes this option from the configuration file when the user enters an empty value ++ ++## .size = nil ++The size of the form field ++ ++## .widget = "select" ++selects the form widget to be used ++ ++ ++## :depends (_key'', ''value_) ++Only show this option field if another option _key'' is set to ''value_ in the same section.
    ++If you call this function several times the dependencies will be linked with *or* ++ ++## :value (_key'', ''value'' = ''key_) ++Adds an entry to the selection list ++ ++---- ++ ++# class Flag (_option'', ''title'', ''description_) ++An object describing an option with two possible values in a section of a UCI File. Creates a checkbox field in the formular. ++Use [[#A.3Aoption.28.27.27optionclass.27.27.2C....29|NamedSection:option(Value, _option'', ''title'', ''description'')]] or [[#A.3Aoption.28.27.27optionclass.27.27.2C....29-1|TypedSection:option(Value, ''option'', ''title'', ''description_)]] to instantiate. ++* *option*: section name ++* *title*: The title shown in the UI ++* *description*: description shown in the UI ++ ++## .default = nil ++The default value ++ ++## .disabled = 0 ++the value that shoudl be set if the checkbox is unchecked ++ ++## .enabled = 1 ++the value that should be set if the checkbox is checked ++ ++## .optional = false ++Marks this option as optional, implies .rmempty = true ++ ++## .rmempty = true ++Removes this option from the configuration file when the user enters an empty value ++ ++## .size = nil ++The size of the form field ++ ++ ++## :depends (_key'', ''value_) ++Only show this option field if another option _key'' is set to ''value_ in the same section.
    ++If you call this function several times the dependencies will be linked with *or* ++ ++---- ++ ++# class MultiValue (_option'', ''title'', ''description_) ++An object describing an option in a section of a UCI File. Creates several checkboxed as form fields. ++Use [[#A.3Aoption.28.27.27optionclass.27.27.2C....29|NamedSection:option(Value, _option'', ''title'', ''description'')]] or [[#A.3Aoption.28.27.27optionclass.27.27.2C....29-1|TypedSection:option(Value, ''option'', ''title'', ''description_)]] to instantiate. ++* *option*: section name ++* *title*: The title shown in the UI ++* *description*: description shown in the UI ++ ++ ++## .default = nil ++The default value ++ ++## .delimiter = " " ++The string which will be used to delimit the values ++ ++## .optional = false ++Marks this option as optional, implies .rmempty = true ++ ++## .rmempty = true ++Removes this option from the configuration file when the user enters an empty value ++ ++## .size = nil ++The size of the form field ++ ++## .widget = "checkbox" ++selects the form widget to be used ++ ++ ++## :depends (_key'', ''value_) ++Only show this option field if another option _key'' is set to ''value_ in the same section.
    ++If you call this function several times the dependencies will be linked with *or* ++ ++## :value (_key'', ''value'' = ''key_) ++Adds an entry to the checkbox list ++ ++---- ++ ++# class DummyValue (_option'', ''title'', ''description_) ++An object describing an option in a section of a UCI File. Creates a readonly field in the form. ++Use [[#A.3Aoption.28.27.27optionclass.27.27.2C....29|NamedSection:option(Value, _option'', ''title'', ''description'')]] or [[#A.3Aoption.28.27.27optionclass.27.27.2C....29-1|TypedSection:option(Value, ''option'', ''title'', ''description_)]] to instantiate. ++* *option*: section name ++* *title*: The title shown in the UI ++* *description*: description shown in the UI ++ ++ ++ ++## :depends (_key'', ''value_) ++Only show this option field if another option _key'' is set to ''value_ in the same section.
    ++If you call this function several times the dependencies will be linked with *or* ++ ++---- ++ ++ ++# class TextValue (_option'', ''title'', ''description_) ++An object describing a multi-line textbox in a section in a non-UCI form. ++ ++---- ++ ++# class Button (_option'', ''title'', ''description_) ++An object describing a Button in a section in a non-UCI form. ++ ++---- ++ ++# class StaticList (_option'', ''title'', ''description_) ++Similar to the MultiValue, but stores selected Values into a UCI list instead of a space-separated string. ++ ++---- ++ ++# class DynamicList (_option'', ''title'', ''description_) ++A list of user-defined values. +diff --git a/feeds/luci/documentation/JsonRpcHowTo.md b/feeds/luci/documentation/JsonRpcHowTo.md +new file mode 100644 +index 0000000..76d61f8 +--- /dev/null ++++ b/feeds/luci/documentation/JsonRpcHowTo.md +@@ -0,0 +1,66 @@ ++LuCI provides some of its libraries to external applications through a JSON-RPC API. ++This Howto shows how to use it and provides information about available functions. ++ ++ ++# Basics ++LuCI comes with an efficient JSON De-/Encoder together with a JSON-RPC-Server which implements the *JSON-RPC 1.0_' and 2.0 (partly) specifications. The LuCI JSON-RPC server offers several independent APIs. Therefore you have to use '_different URLs for every exported library*. ++Assuming your LuCI-Installation can be reached through */cgi-bin/luci_' any exported library can be reached via '''/cgi-bin/luci/rpc/''LIBRARY_*. ++ ++ ++# Authentication ++Most exported libraries will require a valid authentication to be called with. If you get an *HTTP 403 Forbidden_' status code you are probably missing a valid authentication token. To get such a token you have to call the function '''login''' of the RPC-Library '''auth'''. Following our example from above this login function would be provided at '_/cgi-bin/luci/rpc/auth*. The function accepts 2 parameters: username and password (of a valid user account on the host system) and returns an authentication token. ++ ++If you want to call any exported library which requires an authentication token you have to *append it as an URL parameter _auth''''' to the RPC-Server URL. So instead of calling '''/cgi-bin/luci/rpc/''LIBRARY''''' you have to call '''/cgi-bin/luci/rpc/''LIBRARY''?auth=''TOKEN_*. ++ ++If your JSON-RPC client is Cookie-aware (like most browsers are) you will receive the authentication token also with a session cookie and probably don't have to append it to the RPC-Server URL. ++ ++ ++# Exported Libraries ++## uci ++The UCI-Library */rpc/uci* offers functionality to interact with the Universal Configuration Interface. ++*Exported Functions:* ++* [(string) add(config, type)](http://luci.subsignal.org/api/luci/modules/luci.model.uci.html#Cursor.add) ++* [(integer) apply(config)](http://luci.subsignal.org/api/luci/modules/luci.model.uci.html#Cursor.apply) ++* [http://luci.subsignal.org/api/luci/modules/luci.model.uci.html#Cursor.changes (object) changes([config])] ++* [(boolean) commit(config)](http://luci.subsignal.org/api/luci/modules/luci.model.uci.html#Cursor.commit) ++* [http://luci.subsignal.org/api/luci/modules/luci.model.uci.html#Cursor.delete (boolean) delete(config, section[, option])] ++* [http://luci.subsignal.org/api/luci/modules/luci.model.uci.html#Cursor.delete_all (boolean) delete_all(config[, type])] ++* [http://luci.subsignal.org/api/luci/modules/luci.model.uci.html#Cursor.foreach (array) foreach(config[, type])] ++* [http://luci.subsignal.org/api/luci/modules/luci.model.uci.html#Cursor.get (mixed) get(config, section[, option])] ++* [http://luci.subsignal.org/api/luci/modules/luci.model.uci.html#Cursor.get_all (object) get_all(config[, section])] ++* [http://luci.subsignal.org/api/luci/modules/luci.model.uci.html#Cursor.get (mixed) get_state(config, section[, option])] ++* [(boolean) revert(config)](http://luci.subsignal.org/api/luci/modules/luci.model.uci.html#Cursor.revert) ++* [(name) section(config, type, name, values)](http://luci.subsignal.org/api/luci/modules/luci.model.uci.html#Cursor.section) ++* [(boolean) set(config, section, option, value)](http://luci.subsignal.org/api/luci/modules/luci.model.uci.html#Cursor.set) ++* [(boolean) tset(config, section, values)](http://luci.subsignal.org/api/luci/modules/luci.model.uci.html#Cursor.tset) ++ ++## uvl ++The UVL-Library */rpc/uvl* offers functionality to validate UCI files and get schemes describing UCI files. ++*Exported Functions:* ++* [(array) get_scheme(scheme)](http://luci.subsignal.org/api/luci/modules/luci.uvl.html#UVL.get_scheme) ++* [(array) validate(config, section, option)](http://luci.subsignal.org/api/luci/modules/luci.uvl.html#UVL.validate) ++* [(array) validate_config(config)](http://luci.subsignal.org/api/luci/modules/luci.uvl.html#UVL.validate_config) ++* [(array) validate_section(config, section)](http://luci.subsignal.org/api/luci/modules/luci.uvl.html#UVL.validate_section) ++* [(array) validate(config, section, option)](http://luci.subsignal.org/api/luci/modules/luci.uvl.html#UVL.validate_option) ++ ++## fs ++The Filesystem library */rpc/fs* offers functionality to interact with the filesystem on the host machine. ++*Exported Functions:* ++ ++* [Complete luci.fs library](http://luci.subsignal.org/api/luci/modules/luci.fs.html) ++*Note:* All functions are exported as they are except for _readfile'' which encodes its return value in base64 and ''writefile'' which only accepts base64 encoded data as second argument. Note that both functions will only be available when the ''luasocket_ packet is installed on the hostsystem. ++ ++## sys ++The System library */rpc/sys* offers functionality to interact with the operating system on the host machine. ++*Exported Functions:* ++* [Complete luci.sys library](http://luci.subsignal.org/api/luci/modules/luci.sys.html) ++* [Complete luci.sys.group library](http://luci.subsignal.org/api/luci/modules/luci.sys.group.html) with prefix *group.* ++* [Complete luci.sys.net library](http://luci.subsignal.org/api/luci/modules/luci.sys.net.html) with prefix *net.* ++* [Complete luci.sys.process library](http://luci.subsignal.org/api/luci/modules/luci.sys.process.html) with prefix *process.* ++* [Complete luci.sys.user library](http://luci.subsignal.org/api/luci/modules/luci.sys.user.html) with prefix *user.* ++* [Complete luci.sys.wifi library](http://luci.subsignal.org/api/luci/modules/luci.sys.wifi.html) with prefix *wifi.* ++ ++## ipkg ++The IPKG library */rpc/ipkg* offers functionality to interact with the package manager (IPKG or OPKG) on the host machine. ++*Exported Functions:* ++* [Complete luci.model.ipkg library](http://luci.subsignal.org/api/luci/modules/luci.model.ipkg.html) +diff --git a/feeds/luci/documentation/LAR.md b/feeds/luci/documentation/LAR.md +new file mode 100644 +index 0000000..f44d8dc +--- /dev/null ++++ b/feeds/luci/documentation/LAR.md +@@ -0,0 +1,87 @@ ++LAR is a simple archive format to pack multiple lua source files and arbitary other resources into a single file. ++ ++ ++# Format Specification ++ ++A LAR archive file is divided into two parts: the payload and the index lookup table. ++All segments of the archive are 4 Byte aligned to ease reading and processing of the format. ++All integers are stored in network byte order, so an implementation has to use htonl() and htons() to properly read them. ++ ++Schema: ++ ++ ++ ++ > ++ ++ ++ ++ > ++ ++ ... ++ ++ ++ ++ > ++ > ++ ++ ++ ++ ++ > ++ ++ ++ ++ ++ > ++ ++ ... ++ ++ ++ ++ ++ > ++ > ++ ++ ++ ++ ++ ++# Processing ++ ++In order to process an LAR archive, an implementation would have to do the following steps: ++ ++## Read Index ++ ++1. Locate and open the archive file ++1. Seek to end of file - 4 bytes ++1. Read 32bit index offset and swap from network to native byte order ++1. Seek to index offset, calculate index length: filesize - index offset - 4 ++1. Initialize a linked list for index table entries ++1. Read each index entry until the index length is reached, read and byteswap 4 * 32bit int and 2 * 16bit int ++1. Seek to begin of file ++ ++## Read Member ++ ++1. Read the archive index ++1. Iterate through the linked index list, perform the following steps for each entry ++1. Seek to the specified file path offset ++1. Read as much bytes as specified in the file path length into a buffer ++1. Compare the contents of the buffer against the path of the searched member ++1. If buffer and searched path are equal, seek to the specified file data offset ++1. Read data until the file data length is reached, return ++1. Select the next index table entry and repeat from step 3, if there is no next entry then return ++ ++# Reference implementation ++ ++A reference implementation can be found here: ++http://luci.subsignal.org/trac/browser/luci/trunk/contrib/lar ++ ++The lar.pl script is a simple packer for LAR archives and cli.c provides a utility to list and dump packed LAR archives. +diff --git a/feeds/luci/documentation/LMO.md b/feeds/luci/documentation/LMO.md +new file mode 100644 +index 0000000..961a45b +--- /dev/null ++++ b/feeds/luci/documentation/LMO.md +@@ -0,0 +1,144 @@ ++LMO is a simple binary format to pack language strings into a more efficient form. Although it's suitable to store any kind of key-value table, it's only used for the LuCI *.po based translation system at the moment. The abbreviation "LMO" stands for "Lua Machine Objects" in the style of the GNU gettext *.mo format. ++ ++ ++# Format Specification ++ ++A LMO file is divided into two parts: the payload and the index lookup table. ++All segments of the file are 4 Byte aligned to ease reading and processing of the format. ++Only unsigned 32bit integers are used and stored in network byte order, so an implementation has to use htonl() to properly read them. ++ ++Schema: ++ ++ ++ ++ ++ ++ ... ++ ++ ++ > ++ ++ ++ ++ ++ ++ > ++ ++ ++ ++ ++ ++ > ++ ++ ... ++ ++ ++ ++ ++ ++ > ++ > ++ ++ ++ > ++ ++ ++ ++# Processing ++ ++In order to process a LMO file, an implementation would have to do the following steps: ++ ++## Read Index ++ ++1. Locate and open the archive file ++1. Seek to end of file - 4 bytes (sizeof(uint32_t)) ++1. Read 32bit index offset and swap from network to native byte order ++1. Seek to index offset, calculate index length: filesize - index offset - 4 ++1. Initialize a linked list for index table entries ++1. Read each index entry until the index length is reached, read and byteswap 4 * uint32_t for each step ++1. Seek to begin of file ++ ++## Read Entry ++ ++1. Calculate the unsigned 32bit hash of the entries key value (see "Hash Function" section below) ++1. Obtain the archive index ++1. Iterate through the linked index list, perform the following steps for each entry: ++ 1. Compare the entry hash value with the calculated hash from step 1 ++ 2. If the hash values are equal proceed with step 4 ++ 3. Select the next entry and repeat from step 3.1 ++1. Seek to the file offset specified in the selected entry ++1. Read as much bytes as specified in the entry length into a buffer ++1. Return the buffer value ++ ++# Hash Function ++ ++The current LuCI-LMO implementation uses the "Super Fast Hash" function which was kindly put in the public domain by it's original author. See http://www.azillionmonkeys.com/qed/hash.html for details. Below is the C-Implementation of this function: ++ ++ ++ #if (defined(__GNUC__) && defined(__i386__)) ++ #define sfh_get16(d) (*((const uint16_t *) (d))) ++ #else ++ #define sfh_get16(d) ((((uint32_t)(((const uint8_t *)(d))[1])) << 8)\ ++ +(uint32_t)(((const uint8_t *)(d))[0]) ) ++ #endif ++ ++ uint32_t sfh_hash(const char * data, int len) ++ { ++ uint32_t hash = len, tmp; ++ int rem; ++ ++ if (len <= NULL) return 0; ++ ++ rem = len & 3; ++ len >>= 2; ++ ++ /* Main loop */ ++ for (;len > 0; len--) { ++ hash += sfh_get16(data); ++ tmp = (sfh_get16(data+2) << 11) ^ hash; ++ hash = (hash << 16) ^ tmp; ++ data += 2*sizeof(uint16_t); ++ hash += hash >> 11; ++ } ++ ++ /* Handle end cases */ ++ switch (rem) { ++ case 3: hash += sfh_get16(data); ++ hash ^= hash << 16; ++ hash ^= data[sizeof(uint16_t)] << 18; ++ hash += hash >> 11; ++ break; ++ case 2: hash += sfh_get16(data); ++ hash ^= hash << 11; ++ hash += hash >> 17; ++ break; ++ case 1: hash += *data; ++ hash ^= hash << 10; ++ hash += hash >> 1; ++ } ++ ++ /* Force "avalanching" of final 127 bits */ ++ hash ^= hash << 3; ++ hash += hash >> 5; ++ hash ^= hash << 4; ++ hash += hash >> 17; ++ hash ^= hash << 25; ++ hash += hash >> 6; ++ ++ return hash; ++ } ++ ++ ++# Reference Implementation ++ ++A reference implementation can be found here: ++http://luci.subsignal.org/trac/browser/luci/trunk/libs/lmo/src ++ ++The lmo_po2lmo.c executable implements a *.po to *.lmo conversation utility and lmo_lookup.c is a simple *.lmo test utility. ++Lua bindings for lmo are defined in lmo_lualib.c and associated headers. +diff --git a/feeds/luci/documentation/LuCI-0.10.md b/feeds/luci/documentation/LuCI-0.10.md +new file mode 100644 +index 0000000..5db9895 +--- /dev/null ++++ b/feeds/luci/documentation/LuCI-0.10.md +@@ -0,0 +1,202 @@ ++[[PageOutline(2-5, Table of Contents, floated)]] ++ ++ ++This document describes new features and incompatibilities to LuCI 0.9.x. ++It is targeted at module authors developing external addons to LuCI. ++ ++# I18N Changes ++ ++## API ++ ++The call conventions for the i18n api changed, there is no dedicated translation ++key anymore and the english text is used for lookup instead. This was done to ++ease the maintenance of language files. ++ ++Code that uses _translate()'' or ''i18n()_ must be changed as follows: ++ ++ ++ -- old style: ++ translate("some_text", "Some Text") ++ translatef("some_format_text", "Some formatted Text: %d", 123) ++ ++ -- new style: ++ translate("Some Text") ++ translatef("Some formatted Text: %d", 123) ++ ++ ++Likewise for templates: ++ ++ ++ ++ <%:some_text Some Text%> ++ ++ ++ <%:Some Text%> ++ ++ ++If code must support both LuCI 0.9.x and 0.10.x versions, it is suggested to write the calls as follows: ++ ++ translate("Some Text", "Some Text") ++ ++ ++An alternative is wrapping translate() calls into a helper function: ++ ++ function tr(key, alt) ++ return translate(key) or translate(alt) or alt ++ end ++ ++ ++... which is used as follows: ++ ++ tr("some_key", "Some Text") ++ ++ ++## Translation File Format ++ ++Translation catalogs are now maintained in *.po format files. During build those get translated ++into [*.lmo archives](http://luci.subsignal.org/trac/wiki/Documentation/LMO). ++ ++LuCI ships a [utility script](http://luci.subsignal.org/trac/browser/luci/branches/luci-0.10/build/i18n-lua2po.pl) ++in the build/ directory to convert old Lua translation files to the *.po format. The generated *.po files should ++be placed in the appropriate subdirectories within the top po/ file in the LuCI source tree. ++ ++### Components built within the LuCI tree ++ ++If components using translations are built along with the LuCI tree, the newly added *.po file are automatically ++compiled into *.lmo archives during the build process. In order to bundle the appropriate *.lmo files into the ++corresponding *.ipk packages, component Makefiles must include a "PO" variable specifying the files to include. ++ ++Given a module _applications/example/'' which uses ''po/en/example.po'' and ''po/en/example-extra.po_, ++the _applications/example/Makefile_ must be changed as follows: ++ ++ ++ PO = example example-extra ++ ++ include ../../build/config.mk ++ include ../../build/module.mk ++ ++ ++### Standalone components ++ ++Authors who externally package LuCI components must prepare required *.lmo archives themselves. ++To convert existing Lua based message catalogs to the *.po format, the build/i18n-lua2po.pl helper script can be used. ++In order to convert *.po files into *.lmo files, the standalone "po2lmo" utility must be compiled as follows: ++ ++ ++ $ svn co http://svn.luci.subsignal.org/luci/branches/luci-0.10/libs/lmo ++ $ cd lmo/ ++ $ make ++ $ ./src/po2lmo translations.po translations.lmo ++ ++ ++Note that at the time of writing, the utility program needs Lua headers installed on the system in order to compile properly. ++ ++# CBI ++ ++## Datatypes ++ ++The server side UVL validation has been dropped to reduce space requirements on the target. ++Instead it is possible to define datatypes for CBI widgets now: ++ ++ ++ opt = section:option(Value, "optname", "Title Text") ++ opt.datatype = "ip4addr" ++ ++ ++User provided data is validated once on the frontend via JavaScript and on the server side prior to saving it. ++A list of possible datatypes can be found in the [luci.cbi.datatypes](http://luci.subsignal.org/trac/browser/luci/branches/luci-0.10/libs/web/luasrc/cbi/datatypes.lua#L26) class. ++ ++## Validation ++ ++Server-sided validator function can now return custom error messages to provide better feedback on invalid input. ++ ++ ++ opt = section:option(Value, "optname", "Title Text") ++ ++ function opt.validate(self, value, section) ++ if input_is_valid(value) then ++ return value ++ else ++ return nil, "The value is invalid because ..." ++ end ++ end ++ ++ ++## Tabs ++ ++It is now possible to break up CBI sections into multiple tabs to better organize longer forms. ++The TypedSection and NamedSection classes gained two new functions to define tabs, _tab()'' and ''taboption()_. ++ ++ ++ sct = map:section(TypedSection, "name", "type", "Title Text") ++ ++ sct:tab("general", "General Tab Title", "General Tab Description") ++ sct:tab("advanced", "Advanced Tab Title", "Advanced Tab Description") ++ ++ opt = sct:taboption("general", Value, "optname", "Title Text") ++ ... ++ ++ ++The _tab()_ function is declares a new tab and takes up to three arguments: ++ * Internal name of the tab, must be unique within the section ++ * Title text of the tab ++ * Optional description text for the tab ++ ++The _taboption()'' function wraps ''option()_ and assigns the option object to the given tab. ++It takes up to five arguments: ++ ++ * Name of the tab to assign the option to ++ * Option type, e.g. Value or DynamicList ++ * Option name ++ * Title text of the option ++ * Optional description text of the option ++ ++If tabs are used within a particular section, the _option()_ function must not be used, ++doing so results in undefined behaviour. ++ ++## Hooks ++ ++The CBI gained support for _hooks_ which can be used to trigger additional actions during the ++life-cycle of a map: ++ ++ ++ map = Map("config", "Title Text") ++ ++ function map.on_commit(self) ++ -- do something if the UCI configuration got committed ++ end ++ ++ ++The following hooks are defined: ++ ++|| on_cancel || The user pressed cancel within a multi-step Delegator or a SimpleForm instance || ++|| on_init || The CBI is about to render the Map object || ++|| on_parse || The CBI is about to read received HTTP form values || ++|| on_save, on_before_save || The CBI is about to save modified UCI configuration files || ++|| on_after_save || Modified UCI configuration files just got saved ++|| on_before_commit || The CBI is about to commit the changes || ++|| on_commit, on_after_commit, on_before_apply || Modified configurations got committed and the CBI is about to restart associated services || ++|| on_apply, on_after_apply || All changes where completely applied (only works on Map instances with the apply_on_parse attribute set) || ++ ++## Sortable Tables ++ ++TypedSection instances which use the "cbi/tblsection" template may now use a new attribute _sortable_ to allow the user to reorder table rows. ++ ++ ++ sct = map:section(TypedSection, "name", "type", "Title Text") ++ sct.template = "cbi/tblsection" ++ sct.sortable = true ++ ++ ... ++ ++ ++# JavaScript ++ ++The LuCI 0.10 branch introduced a new JavaScript file _xhr.js_ which provides support routines for XMLHttpRequest operations. ++Each theme must include this file in the area of the document for forms to work correctly. ++ ++It should be included like this: ++ ++ ++ ++ +\ No newline at end of file +diff --git a/feeds/luci/documentation/Modules.md b/feeds/luci/documentation/Modules.md +new file mode 100644 +index 0000000..2897df9 +--- /dev/null ++++ b/feeds/luci/documentation/Modules.md +@@ -0,0 +1,94 @@ ++# Categories ++ ++The LuCI modules are divided into several category directories, namely: ++* applications (Single applications or plugins for other modules or applications) ++* i18n (Translation files) ++* libs (Independent libraries) ++* modules (Collections of applications) ++* themes (Frontend themes) ++ ++Each module goes into a subdirectory of any of this category-directories. ++ ++# Module directory ++The contents of a module directory are as follows: ++ ++## Makefile ++This is the module's makefile. If the module just contains Lua sourcecode or resources then the following Makefile should suffice. ++ ++ include ../../build/config.mk ++ include ../../build/module.mk ++ ++ ++If you have C(++) code in your module your Makefile should at least contain the following things. ++ ++ include ../../build/config.mk ++ include ../../build/gccconfig.mk ++ include ../../build/module.mk ++ ++ compile: ++ # Commands to compile and link your C-code ++ # and to install them under the dist/ hierarchy ++ ++ clean: luaclean ++ # Commands to clean your compiled objects ++ ++ ++ ++## src ++The *src* directory is reserved for C sourcecode. ++ ++## luasrc ++*luasrc* contains all Lua sourcecode files. These will automatically be stripped or compiled depending on the Make target and are installed in the LuCI installation directory. ++ ++## lua ++*lua* is equivalent to _luasrc_ but containing Lua files will be installed in the Lua document root. ++ ++## htdocs ++All files under *htdocs* will be copied to the document root of the target webserver. ++ ++## root ++All directories and files under *root* will be copied to the installation target as they are. ++ ++## dist ++*dist* is reserved for the builder to create a working installation tree that will represent the filesystem on the target machine. ++*DO NOT* put any files there as they will get deleted. ++ ++## ipkg ++*ipkg* contains IPKG package control files, like _preinst'', ''posinst'', ''prerm'', ''postrm''. ''conffiles_. ++See IPKG documentation for details. ++ ++ ++# OpenWRT feed integration ++If you want to add your module to the LuCI OpenWRT feed you have to add several sections to the contrib/package/luci/Makefile. ++ ++For a Web UI applications this is: ++ ++A package description: ++ ++ define Package/luci-app-YOURMODULE ++ $(call Package/luci/webtemplate) ++ DEPENDS+=+some-package +some-other-package ++ TITLE:=SHORT DESCRIPTION OF YOURMODULE ++ endef ++ ++ ++ ++A package installation target: ++ ++ define Package/luci-app-YOURMODULE/install ++ $(call Package/luci/install/template,$(1),applications/YOURMODULE) ++ endef ++ ++ ++A module build instruction: ++ ++ ifneq ($(CONFIG_PACKAGE_luci-app-YOURMODULE),) ++ PKG_SELECTED_MODULES+=applications/YOURMODULE ++ endif ++ ++ ++ ++A build package call: ++ ++ $(eval $(call BuildPackage,luci-app-YOURMODULE)) ++ +diff --git a/feeds/luci/documentation/ModulesHowTo.md b/feeds/luci/documentation/ModulesHowTo.md +new file mode 100644 +index 0000000..3f70b78 +--- /dev/null ++++ b/feeds/luci/documentation/ModulesHowTo.md +@@ -0,0 +1,153 @@ ++*Note:* If you plan to integrate your module into LuCI, you should read the [wiki:Documentation/Modules Module Reference] before. ++ ++This tutorial describes how to write your own modules for the LuCI WebUI. ++For this tutorial we refer to your LuCI installation direcotry as *lucidir_' (/usr/lib/lua/luci if you are working with an installed version) and assume your LuCI installation is reachable through your webserver via '_/cgi-bin/luci*. ++ ++If you are working with the development environment replace *lucidir_' with '''''/path/to/your/luci/checkout''/applications/myapplication/luasrc''' (this is a default empty module you can use for your experiments) and your LuCI installation can probably be reached via http://localhost:8080/luci/ after you ran '_make runhttpd*. ++ ++ ++ ++# Show me the way (The dispatching process) ++To write a module you need to understand the basics of the dispatching process in LuCI. ++LuCI uses a dispatching tree that will be built by executing the index-Function of every available controller. ++The CGI-environment variable *PATH_INFO* will be used as the path in this dispatching tree, e.g.: /cgi-bin/luci/foo/bar/baz ++will be resolved to foo.bar.baz ++ ++To register a function in the dispatching tree, you can use the *entry*-function of _luci.dispatcher_. entry takes 4 arguments (2 are optional): ++ ++ entry(path, target, title=nil, order=nil) ++ ++ ++* *path* is a table that describes the position in the dispatching tree: For example a path of {"foo", "bar", "baz"} would insert your node in foo.bar.baz. ++* *target* describes the action that will be taken when a user requests the node. There are several predefined ones of which the 3 most important (call, template, cbi) are described later on on this page ++* *title* defines the title that will be visible to the user in the menu (optional) ++* *order* is a number with which nodes on the same level will be sorted in the menu (optional) ++ ++You can assign more attributes by manipulating the node table returned by the entry-function. A few example attributes: ++ ++* *i18n* defines which translation file should be automatically loaded when the page gets requested ++* *dependent* protects plugins to be called out of their context if a parent node is missing ++* *leaf* stops parsing the request at this node and goes no further in the dispatching tree ++* *sysauth* requires the user to authenticate with a given system user account ++ ++ ++# It's all about names (Naming and the module file) ++Now that you know the basics about dispatching, we can start writing modules. But before you have to choose the category and name of your new digital child. ++ ++We assume you want to create a new application "myapp" with a module "mymodule". ++ ++So you have to create a new subdirectory *_lucidir''/controller/myapp''' with a file '_mymodule.lua* with the following content: ++ ++ module("luci.controller.myapp.mymodule", package.seeall) ++ ++ function index() ++ ++ end ++ ++ ++The first line is required for Lua to correctly identify the module and create its scope. ++The index-Function will be used to register actions in the dispatching tree. ++ ++ ++ ++# Teaching your new child (Actions) ++So it is there and has a name but it has no actions. ++ ++We assume you want to reuse your module myapp.mymodule that you begun in the last step. ++ ++ ++## Actions ++Reopen *_lucidir_/controller/myapp/mymodule.lua* and just add a function to it so that its content looks like this example: ++ ++ ++ module("luci.controller.myapp.mymodule", package.seeall) ++ ++ function index() ++ entry({"click", "here", "now"}, call("action_tryme"), "Click here", 10).dependent=false ++ end ++ ++ function action_tryme() ++ luci.http.prepare_content("text/plain") ++ luci.http.write("Haha, rebooting now...") ++ luci.sys.reboot() ++ end ++ ++ ++And now type */cgi-bin/luci/click/here/now_' ('_[http://localhost:8080/luci/click/here/now]* if you are using the development environment) in your browser. ++ ++You see these action functions simple have to be added to a dispatching entry. ++ ++As you might or might not know: CGI specification requires you to send a Content-Type header before you can send your content. You will find several shortcuts (like the one used above) as well as redirecting functions in the module *luci.http* ++ ++## Views ++If you only want to show the user a text or some interesting familiy photos it may be enough to use a HTML-template. These templates can also include some Lua code but be aware that writing whole office suites by only using these templates might be called "dirty" by other developers. ++ ++Now let's create a little template *_lucidir_/view/myapp-mymodule/helloworld.htm* with the content: ++ ++ ++ <%+header%> ++

    <%:Hello World%>

    ++ <%+footer%> ++ ++ ++ ++and add the following line to the index-Function of your module file. ++ ++ entry({"my", "new", "template"}, template("myapp-mymodule/helloworld"), "Hello world", 20).dependent=false ++ ++ ++Now type */cgi-bin/luci/my/new/template_' ('_[http://localhost:8080/luci/my/new/template]* if you are using the development environment) in your browser. ++ ++You may notice those fancy <% %>-Tags, these are [wiki:Documentation/Templates|template markups] used by the LuCI template processor. ++It is always good to include header and footer at the beginning and end of a template as those create the default design and menu. ++ ++## CBI models ++The CBI is one of the uber coolest features of LuCI. It creates a formular based user interface and saves its contents to a specific UCI config file. You only have to describe the structure of the configuration file in a CBI model file and Luci does the rest of the work. This includes generating, parsing and validating a XHTML form and reading and writing the UCI file. ++ ++So let's be serious at least for this paragraph and create a real pratical example *_lucidir_/model/cbi/myapp-mymodule/netifaces.lua* with the following contents: ++ ++ ++ m = Map("network", "Network") -- We want to edit the uci config file /etc/config/network ++ ++ s = m:section(TypedSection, "interface", "Interfaces") -- Especially the "interface"-sections ++ s.addremove = true -- Allow the user to create and remove the interfaces ++ function s:filter(value) ++ return value ~= "loopback" and value -- Don't touch loopback ++ end ++ s:depends("proto", "static") -- Only show those with "static" ++ s:depends("proto", "dhcp") -- or "dhcp" as protocol and leave PPPoE and PPTP alone ++ ++ p = s:option(ListValue, "proto", "Protocol") -- Creates an element list (select box) ++ p:value("static", "static") -- Key and value pairs ++ p:value("dhcp", "DHCP") ++ p.default = "static" ++ ++ s:option(Value, "ifname", "interface", "the physical interface to be used") -- This will give a simple textbox ++ ++ s:option(Value, "ipaddr", translate("ip", "IP Address")) -- Ja, das ist eine i18n-Funktion ;-) ++ ++ s:option(Value, "netmask", "Netmask"):depends("proto", "static") -- You may remember this "depends" function from above ++ ++ mtu = s:option(Value, "mtu", "MTU") ++ mtu.optional = true -- This one is very optional ++ ++ dns = s:option(Value, "dns", "DNS-Server") ++ dns:depends("proto", "static") ++ dns.optional = true ++ function dns:validate(value) -- Now, that's nifty, eh? ++ return value:match("[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+") -- Returns nil if it doesn't match otherwise returns match ++ end ++ ++ gw = s:option(Value, "gateway", "Gateway") ++ gw:depends("proto", "static") ++ gw.rmempty = true -- Remove entry if it is empty ++ ++ return m -- Returns the map ++ ++ ++and of course don't forget to add something like this to your module's index-Function. ++ ++ entry({"admin", "network", "interfaces"}, cbi("myapp-mymodule/netifaces"), "Network interfaces", 30).dependent=false ++ ++ ++There are many more features, see [wiki:Documentation/CBI the CBI reference] and the modules shipped with LuCI. +diff --git a/feeds/luci/documentation/Templates.md b/feeds/luci/documentation/Templates.md +new file mode 100644 +index 0000000..dc42c28 +--- /dev/null ++++ b/feeds/luci/documentation/Templates.md +@@ -0,0 +1,65 @@ ++LuCI has a simple regex based template processor which parses HTML-files to Lua functions and allows to store precompiled template files. ++The simplest form of a template is just an ordinary HTML-file. It will be printed out to the user as is. ++ ++In LuCI every template is an object with an own scope. It can therefore be instanciated and each instance can has a different scope. As every template processor. LuCI supports several special markups. Those are enclosed in `<% %>`-Tags. ++ ++By adding `-` (dash) right after the opening `<%` every whitespace before the markup will be stripped. Adding a `-` right before the closing `%>` will equivalently strip every whitespace behind the markup. ++ ++ ++# Builtin functions and markups ++## Including Lua code ++*Markup:* ++ ++ <% code %> ++ ++ ++ ++## Writing variables and function values ++*Syntax:* ++ ++ <% write (value) %> ++ ++ ++*Short-Markup:* ++ ++ <%=value%> ++ ++ ++## Including templates ++*Syntax:* ++ ++ <% include (templatename) %> ++ ++ ++*Short-Markup:* ++ ++ <%+templatename%> ++ ++ ++ ++## Translating ++*Syntax:* ++ ++ <%= translate("Text to translate") %> ++ ++ ++ ++*Short-Markup:* ++ ++ <%:Text to translate%> ++ ++ ++ ++## Commenting ++*Markup:* ++ ++ <%# comment %> ++ ++ ++# Builtin constants ++| Name | Value | ++---------|--------- ++|`REQUEST_URI`|The current URL (without server part)| ++|`controller`|Path to the Luci main dispatcher| ++|`resource`|Path to the resource directory| ++|`media`|Path to the active theme directory| +diff --git a/feeds/luci/documentation/ThemesHowTo.md b/feeds/luci/documentation/ThemesHowTo.md +new file mode 100644 +index 0000000..32154c7 +--- /dev/null ++++ b/feeds/luci/documentation/ThemesHowTo.md +@@ -0,0 +1,76 @@ ++# HowTo: Create Themes ++*Note:* You should read the [Module Reference](Modules.md) and the [Template Reference](Templates.md) before. ++ ++We assume you want to call your new theme _mytheme_. Make sure you replace this by your module name everytime this is mentionend in this Howto. ++ ++ ++ ++# Creating the structure ++At first create a new theme directory *themes/_mytheme_*. ++ ++Create a _Makefile_ inside your theme directory with the following content: ++ ++ include ../../build/config.mk ++ include ../../build/module.mk ++ ++ ++Create the following directory structure inside your theme directory. ++* ipkg ++* htdocs ++ * luci-static ++ * _mytheme_ ++* luasrc ++ * view ++ * themes ++ * _mytheme_ ++* root ++ * etc ++ * uci-defaults ++ ++ ++ ++# Designing ++Create two LuCI HTML-Templates named _header.htm'' and ''footer.htm'' under *luasrc/view/themes/''mytheme_*. ++The _header.htm'' will be included at the beginning of each rendered page and the ''footer.htm_ at the end. ++So your _header.htm'' will probably contain a DOCTYPE description, headers, the menu and layout of the page and the ''footer.htm_ will close all remaining open tags and may add a footer bar but hey that's your choice you are the designer ;-). ++ ++Just make sure your _header.htm_ *begins* with the following lines: ++ ++ <% ++ require("luci.http").prepare_content("text/html") ++ -%> ++ ++ ++This makes sure your content will be sent to the client with the right content type. Of course you can adapt _text/html_ to your needs. ++ ++ ++Put any stylesheets, Javascripts, images, ... into *htdocs/luci-static/_mytheme_*. ++You should refer to this directory in your header and footer templates as: _<%=media%>''. That means for a stylesheet *htdocs/luci-static/''mytheme_/cascade.css* you would write: ++ ++ ++ ++ ++ ++ ++# Making the theme selectable ++If you are done with your work there are two last steps to do. ++To make your theme OpenWRT-capable and selectable on the settings page you should now create a file *root/etc/uci-defaults/luci-theme-_mytheme_* with the following contents: ++ ++ #!/bin/sh ++ uci batch <<-EOF ++ set luci.themes.MyTheme=/luci-static/mytheme ++ commit luci ++ EOF ++ ++ ++and another file *ipkg/postinst* with the following content: ++ ++ #!/bin/sh ++ [ -n "${IPKG_INSTROOT}" ] || { ++ ( . /etc/uci-defaults/luci-theme-mytheme ) && rm -f /etc/uci-defaults/luci-theme-mytheme ++ } ++ ++ ++This is some OpenWRT magic to correctly register the template with LuCI when it gets installed. ++ ++That's all. Now send your theme to the LuCI developers to get it into the development repository - if you like. +diff --git a/feeds/luci/documentation/api/index.html b/feeds/luci/documentation/api/index.html +new file mode 100644 +index 0000000..c762b9b +--- /dev/null ++++ b/feeds/luci/documentation/api/index.html +@@ -0,0 +1,435 @@ ++ ++ ++ ++ Reference ++ ++ ++ ++ ++ ++
    ++ ++
    ++ ++
    ++
    ++
    ++ ++
    ++ ++ ++ ++
    ++ ++ ++ ++

    Modules

    ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
    luci.dispatcher
    luci.http
    luci.http.protocol
    luci.http.protocol.conditionals
    luci.http.protocol.date
    luci.http.protocol.mime
    luci.i18n
    luci.ip ++ LuCI IP calculation and netlink access library.
    luci.ip.cidr ++ IP CIDR Object.
    luci.json
    luci.jsonc ++ LuCI JSON parsing and serialization library.
    luci.jsonc.parser ++ LuCI JSON parser instance.
    luci.model.ipkg
    luci.model.uci
    luci.rpcc
    luci.rpcc.ruci
    luci.sys
    luci.sys.init ++ ++LuCI system utilities / init related functions.
    luci.sys.iptparser
    luci.sys.net ++ ++LuCI system utilities / network related functions.
    luci.sys.process ++ ++LuCI system utilities / process related functions.
    luci.sys.user ++ ++LuCI system utilities / user related functions.
    luci.sys.wifi ++ ++LuCI system utilities / wifi related functions.
    luci.util
    nixio ++ General POSIX IO library.
    nixio.CHANGELOG ++ Changes and improvements.
    nixio.CryptoHash ++ Cryptographical Hash and HMAC object.
    nixio.File ++ Large File Object.
    nixio.README ++ General Information.
    nixio.Socket ++ Socket Object.
    nixio.TLSContext ++ Transport Layer Security Context Object.
    nixio.TLSSocket ++ TLS Socket Object.
    nixio.UnifiedIO ++ Unified high-level I/O utility API for Files, Sockets and TLS-Sockets.
    nixio.bin ++ Binary operations and conversion.
    nixio.bit ++ Bitfield operators and mainpulation functions.
    nixio.crypto ++ Cryptographical library.
    nixio.fs ++ Low-level and high-level filesystem manipulation library.
    ++ ++ ++ ++ ++ ++ ++
    ++ ++
    ++ ++
    ++

    Valid XHTML 1.0!

    ++
    ++ ++
    ++ ++ +diff --git a/feeds/luci/documentation/api/luadoc.css b/feeds/luci/documentation/api/luadoc.css +new file mode 100644 +index 0000000..f9f9749 +--- /dev/null ++++ b/feeds/luci/documentation/api/luadoc.css +@@ -0,0 +1,285 @@ ++body { ++ margin-left: 1em; ++ margin-right: 1em; ++ font-family: arial, helvetica, geneva, sans-serif; ++ background-color:#ffffff; margin:0px; ++} ++ ++code { ++ font-family: "Andale Mono", monospace; ++} ++ ++tt { ++ font-family: "Andale Mono", monospace; ++} ++ ++body, td, th { font-size: 11pt; } ++ ++h1, h2, h3, h4 { margin-left: 0em; } ++ ++textarea, pre, tt { font-size:10pt; } ++body, td, th { color:#000000; } ++small { font-size:0.85em; } ++h1 { font-size:1.5em; } ++h2 { font-size:1.25em; } ++h3 { font-size:1.15em; } ++h4 { font-size:1.06em; } ++ ++a:link { font-weight:bold; color: #004080; text-decoration: none; } ++a:visited { font-weight:bold; color: #006699; text-decoration: none; } ++a:link:hover { text-decoration:underline; } ++hr { color:#cccccc } ++img { border-width: 0px; } ++ ++ ++h3 { padding: 1em 0 0.5em; } ++ ++p { margin-left: 1em; } ++ ++p.name { ++ font-family: "Andale Mono", monospace; ++ padding-top: 1em; ++ margin-left: 0em; ++} ++ ++blockquote { margin-left: 3em; } ++ ++pre.example { ++ background-color: rgb(245, 245, 245); ++ border-top-width: 1px; ++ border-right-width: 1px; ++ border-bottom-width: 1px; ++ border-left-width: 1px; ++ border-top-style: solid; ++ border-right-style: solid; ++ border-bottom-style: solid; ++ border-left-style: solid; ++ border-top-color: silver; ++ border-right-color: silver; ++ border-bottom-color: silver; ++ border-left-color: silver; ++ padding: 1em; ++ margin-left: 1em; ++ margin-right: 1em; ++ font-family: "Andale Mono", monospace; ++ font-size: smaller; ++} ++ ++ ++hr { ++ margin-left: 0em; ++ background: #00007f; ++ border: 0px; ++ height: 1px; ++} ++ ++ul { list-style-type: disc; } ++ ++table.index { border: 1px #00007f; } ++table.index td { text-align: left; vertical-align: top; } ++table.index ul { padding-top: 0em; margin-top: 0em; } ++ ++table { ++ border: 1px solid black; ++ border-collapse: collapse; ++ margin: 1em auto; ++} ++th { ++ border: 1px solid black; ++ padding: 0.5em; ++} ++td { ++ border: 1px solid black; ++ padding: 0.5em; ++} ++div.header, div.footer { margin-left: 0em; } ++ ++#container ++{ ++ margin-left: 1em; ++ margin-right: 1em; ++ background-color: #f0f0f0; ++} ++ ++#product ++{ ++ text-align: center; ++ border-bottom: 1px solid #cccccc; ++ background-color: #ffffff; ++} ++ ++#product big { ++ font-size: 2em; ++} ++ ++#product_logo ++{ ++} ++ ++#product_name ++{ ++} ++ ++#product_description ++{ ++} ++ ++#main ++{ ++ background-color: #f0f0f0; ++ border-left: 2px solid #cccccc; ++} ++ ++#navigation ++{ ++ float: left; ++ width: 18em; ++ margin: 0; ++ vertical-align: top; ++ background-color: #f0f0f0; ++ overflow:visible; ++} ++ ++#navigation h1 { ++ background-color:#e7e7e7; ++ font-size:1.1em; ++ color:#000000; ++ text-align:left; ++ margin:0px; ++ padding:0.2em; ++ border-top:1px solid #dddddd; ++ border-bottom:1px solid #dddddd; ++} ++ ++#navigation ul ++{ ++ font-size:1em; ++ list-style-type: none; ++ padding: 0; ++ margin: 1px; ++} ++ ++#navigation li ++{ ++ text-indent: -1em; ++ margin: 0em 0em 0em 0.5em; ++ display: block; ++ padding: 3px 0px 0px 12px; ++} ++ ++#navigation li li a ++{ ++ padding: 0px 3px 0px -1em; ++} ++ ++#content ++{ ++ margin-left: 18em; ++ padding: 1em; ++ border-left: 2px solid #cccccc; ++ border-right: 2px solid #cccccc; ++ background-color: #ffffff; ++} ++ ++#about ++{ ++ clear: both; ++ margin: 0; ++ padding: 5px; ++ border-top: 2px solid #cccccc; ++ background-color: #ffffff; ++} ++ ++@media print { ++ body { ++ font: 12pt "Times New Roman", "TimeNR", Times, serif; ++ } ++ a { font-weight:bold; color: #004080; text-decoration: underline; } ++ ++ #main { background-color: #ffffff; border-left: 0px; } ++ #container { margin-left: 2%; margin-right: 2%; background-color: #ffffff; } ++ ++ #content { margin-left: 0px; padding: 1em; border-left: 0px; border-right: 0px; background-color: #ffffff; } ++ ++ #navigation { display: none; ++ } ++ pre.example { ++ font-family: "Andale Mono", monospace; ++ font-size: 10pt; ++ page-break-inside: avoid; ++ } ++} ++ ++table.module_list td ++{ ++ border-width: 1px; ++ padding: 3px; ++ border-style: solid; ++ border-color: #cccccc; ++} ++table.module_list td.name { background-color: #f0f0f0; } ++table.module_list td.summary { width: 100%; } ++ ++table.file_list ++{ ++ border-width: 1px; ++ border-style: solid; ++ border-color: #cccccc; ++ border-collapse: collapse; ++} ++table.file_list td ++{ ++ border-width: 1px; ++ padding: 3px; ++ border-style: solid; ++ border-color: #cccccc; ++} ++table.file_list td.name { background-color: #f0f0f0; } ++table.file_list td.summary { width: 100%; } ++ ++ ++table.function_list ++{ ++ border-width: 1px; ++ border-style: solid; ++ border-color: #cccccc; ++ border-collapse: collapse; ++} ++table.function_list td ++{ ++ border-width: 1px; ++ padding: 3px; ++ border-style: solid; ++ border-color: #cccccc; ++} ++table.function_list td.name { background-color: #f0f0f0; } ++table.function_list td.summary { width: 100%; } ++ ++ ++table.table_list ++{ ++ border-width: 1px; ++ border-style: solid; ++ border-color: #cccccc; ++ border-collapse: collapse; ++} ++table.table_list td ++{ ++ border-width: 1px; ++ padding: 3px; ++ border-style: solid; ++ border-color: #cccccc; ++} ++table.table_list td.name { background-color: #f0f0f0; } ++table.table_list td.summary { width: 100%; } ++ ++dl.function dt {border-top: 1px solid #ccc; padding-top: 1em;} ++dl.function dd {padding: 0.5em 0;} ++dl.function h3 {margin: 0; font-size: medium;} ++ ++dl.table dt {border-top: 1px solid #ccc; padding-top: 1em;} ++dl.table dd {padding-bottom: 1em;} ++dl.table h3 {padding: 0; margin: 0; font-size: medium;} ++ ++#TODO: make module_list, file_list, function_list, table_list inherit from a list ++ +diff --git a/feeds/luci/documentation/api/modules/luci.dispatcher.html b/feeds/luci/documentation/api/modules/luci.dispatcher.html +new file mode 100644 +index 0000000..4ae88fe +--- /dev/null ++++ b/feeds/luci/documentation/api/modules/luci.dispatcher.html +@@ -0,0 +1,1151 @@ ++ ++ ++ ++ Reference ++ ++ ++ ++ ++ ++
    ++ ++
    ++ ++
    ++
    ++
    ++ ++
    ++ ++ ++ ++
    ++ ++

    Class luci.dispatcher

    ++ ++

    ++ ++ ++ ++ ++ ++ ++ ++

    Functions

    ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
    _ () ++ ++No-op function used to mark translation entries for menu labels.
    alias (...) ++ ++Create a redirect to another dispatching node.
    arcombine (trg1, trg2) ++ ++Create a combined dispatching target for non argv and argv requests.
    assign (path, clone, title, order) ++ ++Clone a node of the dispatching tree to another position.
    build_url (...) ++ ++Build the URL relative to the server webroot from given virtual path.
    call (name, ...) ++ ++Create a function-call dispatching target.
    cbi (model) ++ ++Create a CBI model dispatching target.
    createindex () ++ ++Generate the dispatching index using the native file-cache based strategy.
    createtree () ++ ++Create the dispatching tree from the index.
    dispatch (request) ++ ++Dispatches a LuCI virtual path.
    entry (path, target, title, order) ++ ++Create a new dispatching node and define common parameters.
    error404 (message) ++ ++Send a 404 error code and render the "error404" template if available.
    error500 (message) ++ ++Send a 500 error code and render the "error500" template if available.
    firstchild () ++ ++Alias the first (lowest order) page automatically ++ ++
    form (model) ++ ++Create a CBI form model dispatching target.
    get (...) ++ ++Fetch or create a dispatching node without setting the target module or ++ ++enabling the node.
    httpdispatch (request) ++ ++Dispatch an HTTP request.
    modifier (func, order) ++ ++Register a tree modifier.
    node (...) ++ ++Fetch or create a new dispatching node.
    node_childs (node) ++ ++Return a sorted table of visible childs within a given node ++
    node_visible (node) ++ ++Check whether a dispatch node shall be visible ++
    rewrite (n, ...) ++ ++Rewrite the first x path values of the request.
    template (name) ++ ++Create a template render dispatching target.
    translate (text) ++ ++Access the luci.i18n translate() api.
    ++ ++ ++ ++ ++ ++ ++
    ++
    ++ ++ ++

    Functions

    ++
    ++ ++ ++ ++
    _ ()
    ++
    ++ ++ ++No-op function used to mark translation entries for menu labels. ++ ++This function does not actually translate the given argument but ++is used by build/i18n-scan.pl to find translatable entries. ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
    ++ ++ ++ ++ ++
    alias (...)
    ++
    ++ ++ ++Create a redirect to another dispatching node. ++ ++ ++ ++

    Parameters

    ++
      ++ ++
    • ++ ...: Virtual path destination ++
    • ++ ++
    ++ ++ ++ ++ ++ ++ ++ ++ ++
    ++ ++ ++ ++ ++
    arcombine (trg1, trg2)
    ++
    ++ ++ ++Create a combined dispatching target for non argv and argv requests. ++ ++ ++ ++

    Parameters

    ++
      ++ ++
    • ++ trg1: Overview Target ++
    • ++ ++
    • ++ trg2: Detail Target ++
    • ++ ++
    ++ ++ ++ ++ ++ ++ ++ ++ ++
    ++ ++ ++ ++ ++
    assign (path, clone, title, order)
    ++
    ++ ++ ++Clone a node of the dispatching tree to another position. ++ ++ ++ ++

    Parameters

    ++
      ++ ++
    • ++ path: Virtual path destination ++
    • ++ ++
    • ++ clone: Virtual path source ++
    • ++ ++
    • ++ title: Destination node title (optional) ++
    • ++ ++
    • ++ order: Destination node order value (optional) ++
    • ++ ++
    ++ ++ ++ ++ ++ ++ ++

    Return value:

    ++Dispatching tree node ++ ++ ++ ++
    ++ ++ ++ ++ ++
    build_url (...)
    ++
    ++ ++ ++Build the URL relative to the server webroot from given virtual path. ++ ++ ++ ++

    Parameters

    ++
      ++ ++
    • ++ ...: Virtual path ++
    • ++ ++
    ++ ++ ++ ++ ++ ++ ++

    Return value:

    ++Relative URL ++ ++ ++ ++
    ++ ++ ++ ++ ++
    call (name, ...)
    ++
    ++ ++ ++Create a function-call dispatching target. ++ ++ ++ ++

    Parameters

    ++
      ++ ++
    • ++ name: Target function of local controller ++
    • ++ ++
    • ++ ...: Additional parameters passed to the function ++
    • ++ ++
    ++ ++ ++ ++ ++ ++ ++ ++ ++
    ++ ++ ++ ++ ++
    cbi (model)
    ++
    ++ ++ ++Create a CBI model dispatching target. ++ ++ ++ ++

    Parameters

    ++
      ++ ++
    • ++ model: CBI model to be rendered ++
    • ++ ++
    ++ ++ ++ ++ ++ ++ ++ ++ ++
    ++ ++ ++ ++ ++
    createindex ()
    ++
    ++ ++ ++Generate the dispatching index using the native file-cache based strategy. ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
    ++ ++ ++ ++ ++
    createtree ()
    ++
    ++ ++ ++Create the dispatching tree from the index. ++ ++Build the index before if it does not exist yet. ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
    ++ ++ ++ ++ ++
    dispatch (request)
    ++
    ++ ++ ++Dispatches a LuCI virtual path. ++ ++ ++ ++

    Parameters

    ++
      ++ ++
    • ++ request: Virtual path ++
    • ++ ++
    ++ ++ ++ ++ ++ ++ ++ ++ ++
    ++ ++ ++ ++ ++
    entry (path, target, title, order)
    ++
    ++ ++ ++Create a new dispatching node and define common parameters. ++ ++ ++ ++

    Parameters

    ++
      ++ ++
    • ++ path: Virtual path ++
    • ++ ++
    • ++ target: Target function to call when dispatched. ++
    • ++ ++
    • ++ title: Destination node title ++
    • ++ ++
    • ++ order: Destination node order value (optional) ++
    • ++ ++
    ++ ++ ++ ++ ++ ++ ++

    Return value:

    ++Dispatching tree node ++ ++ ++ ++
    ++ ++ ++ ++ ++
    error404 (message)
    ++
    ++ ++ ++Send a 404 error code and render the "error404" template if available. ++ ++ ++ ++

    Parameters

    ++
      ++ ++
    • ++ message: Custom error message (optional) ++
    • ++ ++
    ++ ++ ++ ++ ++ ++ ++

    Return value:

    ++false ++ ++ ++ ++
    ++ ++ ++ ++ ++
    error500 (message)
    ++
    ++ ++ ++Send a 500 error code and render the "error500" template if available. ++ ++ ++ ++

    Parameters

    ++
      ++ ++
    • ++ message: Custom error message (optional)# ++
    • ++ ++
    ++ ++ ++ ++ ++ ++ ++

    Return value:

    ++false ++ ++ ++ ++
    ++ ++ ++ ++ ++
    firstchild ()
    ++
    ++ ++ ++Alias the first (lowest order) page automatically ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
    ++ ++ ++ ++ ++
    form (model)
    ++
    ++ ++ ++Create a CBI form model dispatching target. ++ ++ ++ ++

    Parameters

    ++
      ++ ++
    • ++ model: CBI form model tpo be rendered ++
    • ++ ++
    ++ ++ ++ ++ ++ ++ ++ ++ ++
    ++ ++ ++ ++ ++
    get (...)
    ++
    ++ ++ ++Fetch or create a dispatching node without setting the target module or ++ ++enabling the node. ++ ++ ++

    Parameters

    ++
      ++ ++
    • ++ ...: Virtual path ++
    • ++ ++
    ++ ++ ++ ++ ++ ++ ++

    Return value:

    ++Dispatching tree node ++ ++ ++ ++
    ++ ++ ++ ++ ++
    httpdispatch (request)
    ++
    ++ ++ ++Dispatch an HTTP request. ++ ++ ++ ++

    Parameters

    ++
      ++ ++
    • ++ request: LuCI HTTP Request object ++
    • ++ ++
    ++ ++ ++ ++ ++ ++ ++ ++ ++
    ++ ++ ++ ++ ++
    modifier (func, order)
    ++
    ++ ++ ++Register a tree modifier. ++ ++ ++ ++

    Parameters

    ++
      ++ ++
    • ++ func: Modifier function ++
    • ++ ++
    • ++ order: Modifier order value (optional) ++
    • ++ ++
    ++ ++ ++ ++ ++ ++ ++ ++ ++
    ++ ++ ++ ++ ++
    node (...)
    ++
    ++ ++ ++Fetch or create a new dispatching node. ++ ++ ++ ++

    Parameters

    ++
      ++ ++
    • ++ ...: Virtual path ++
    • ++ ++
    ++ ++ ++ ++ ++ ++ ++

    Return value:

    ++Dispatching tree node ++ ++ ++ ++
    ++ ++ ++ ++ ++
    node_childs (node)
    ++
    ++ ++ ++Return a sorted table of visible childs within a given node ++ ++ ++ ++

    Parameters

    ++
      ++ ++
    • ++ node: Dispatch node ++
    • ++ ++
    ++ ++ ++ ++ ++ ++ ++

    Return value:

    ++Ordered table of child node names ++ ++ ++ ++
    ++ ++ ++ ++ ++
    node_visible (node)
    ++
    ++ ++ ++Check whether a dispatch node shall be visible ++ ++ ++ ++

    Parameters

    ++
      ++ ++
    • ++ node: Dispatch node ++
    • ++ ++
    ++ ++ ++ ++ ++ ++ ++

    Return value:

    ++Boolean indicating whether the node should be visible ++ ++ ++ ++
    ++ ++ ++ ++ ++
    rewrite (n, ...)
    ++
    ++ ++ ++Rewrite the first x path values of the request. ++ ++ ++ ++

    Parameters

    ++
      ++ ++
    • ++ n: Number of path values to replace ++
    • ++ ++
    • ++ ...: Virtual path to replace removed path values with ++
    • ++ ++
    ++ ++ ++ ++ ++ ++ ++ ++ ++
    ++ ++ ++ ++ ++
    template (name)
    ++
    ++ ++ ++Create a template render dispatching target. ++ ++ ++ ++

    Parameters

    ++
      ++ ++
    • ++ name: Template to be rendered ++
    • ++ ++
    ++ ++ ++ ++ ++ ++ ++ ++ ++
    ++ ++ ++ ++ ++
    translate (text)
    ++
    ++ ++ ++Access the luci.i18n translate() api. ++ ++ ++ ++

    Parameters

    ++
      ++ ++
    • ++ text: Text to translate ++
    • ++ ++
    ++ ++ ++ ++ ++ ++ ++ ++ ++
    ++ ++ ++
    ++ ++ ++ ++ ++ ++
    ++ ++
    ++ ++
    ++

    Valid XHTML 1.0!

    ++
    ++ ++
    ++ ++ +diff --git a/feeds/luci/documentation/api/modules/luci.http.html b/feeds/luci/documentation/api/modules/luci.http.html +new file mode 100644 +index 0000000..ea04fc2 +--- /dev/null ++++ b/feeds/luci/documentation/api/modules/luci.http.html +@@ -0,0 +1,854 @@ ++ ++ ++ ++ Reference ++ ++ ++ ++ ++ ++
    ++ ++
    ++ ++
    ++
    ++
    ++ ++
    ++ ++ ++ ++
    ++ ++

    Class luci.http

    ++ ++

    ++ ++ ++ ++ ++ ++ ++ ++

    Functions

    ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
    build_querystring (table) ++ ++Create a querystring out of a table of key - value pairs.
    close () ++ ++Close the HTTP-Connection.
    content () ++ ++Return the request content if the request was of unknown type.
    formvalue (name, noparse) ++ ++Get a certain HTTP input value or a table of all input values.
    formvaluetable (prefix) ++ ++Get a table of all HTTP input values with a certain prefix.
    getcookie (name) ++ ++Get the value of a certain HTTP-Cookie.
    getenv (name) ++ ++Get the value of a certain HTTP environment variable ++ ++or the environment table itself.
    header (key, value) ++ ++Send a HTTP-Header.
    prepare_content (mime) ++ ++Set the mime type of following content data.
    redirect (url) ++ ++Redirects the client to a new URL and closes the connection.
    setfilehandler (callback) ++ ++Set a handler function for incoming user file uploads.
    source () ++ ++Get the RAW HTTP input source ++
    splice (fp, size) ++ ++Splice data from a filedescriptor to the client.
    status (code, message) ++ ++Set the HTTP status code and status message.
    write (content, src_err) ++ ++Send a chunk of content data to the client.
    write_json (data) ++ ++Send the given data as JSON encoded string.
    ++ ++ ++ ++ ++ ++ ++
    ++
    ++ ++ ++

    Functions

    ++
    ++ ++ ++ ++
    build_querystring (table)
    ++
    ++ ++ ++Create a querystring out of a table of key - value pairs. ++ ++ ++ ++

    Parameters

    ++
      ++ ++
    • ++ table: Query string source table ++
    • ++ ++
    ++ ++ ++ ++ ++ ++ ++

    Return value:

    ++Encoded HTTP query string ++ ++ ++ ++
    ++ ++ ++ ++ ++
    close ()
    ++
    ++ ++ ++Close the HTTP-Connection. ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
    ++ ++ ++ ++ ++
    content ()
    ++
    ++ ++ ++Return the request content if the request was of unknown type. ++ ++ ++ ++ ++ ++ ++ ++ ++

    Return values:

    ++
      ++ ++
    1. HTTP request body ++ ++
    2. HTTP request body length ++ ++
    ++ ++ ++ ++
    ++ ++ ++ ++ ++
    formvalue (name, noparse)
    ++
    ++ ++ ++Get a certain HTTP input value or a table of all input values. ++ ++ ++ ++

    Parameters

    ++
      ++ ++
    • ++ name: Name of the GET or POST variable to fetch ++
    • ++ ++
    • ++ noparse: Don't parse POST data before getting the value ++
    • ++ ++
    ++ ++ ++ ++ ++ ++ ++

    Return value:

    ++HTTP input value or table of all input value ++ ++ ++ ++
    ++ ++ ++ ++ ++
    formvaluetable (prefix)
    ++
    ++ ++ ++Get a table of all HTTP input values with a certain prefix. ++ ++ ++ ++

    Parameters

    ++
      ++ ++
    • ++ prefix: Prefix ++
    • ++ ++
    ++ ++ ++ ++ ++ ++ ++

    Return value:

    ++Table of all HTTP input values with given prefix ++ ++ ++ ++
    ++ ++ ++ ++ ++
    getcookie (name)
    ++
    ++ ++ ++Get the value of a certain HTTP-Cookie. ++ ++ ++ ++

    Parameters

    ++
      ++ ++
    • ++ name: Cookie Name ++
    • ++ ++
    ++ ++ ++ ++ ++ ++ ++

    Return value:

    ++String containing cookie data ++ ++ ++ ++
    ++ ++ ++ ++ ++
    getenv (name)
    ++
    ++ ++ ++Get the value of a certain HTTP environment variable ++ ++or the environment table itself. ++ ++ ++

    Parameters

    ++
      ++ ++
    • ++ name: Environment variable ++
    • ++ ++
    ++ ++ ++ ++ ++ ++ ++

    Return value:

    ++HTTP environment value or environment table ++ ++ ++ ++
    ++ ++ ++ ++ ++
    header (key, value)
    ++
    ++ ++ ++Send a HTTP-Header. ++ ++ ++ ++

    Parameters

    ++
      ++ ++
    • ++ key: Header key ++
    • ++ ++
    • ++ value: Header value ++
    • ++ ++
    ++ ++ ++ ++ ++ ++ ++ ++ ++
    ++ ++ ++ ++ ++
    prepare_content (mime)
    ++
    ++ ++ ++Set the mime type of following content data. ++ ++ ++ ++

    Parameters

    ++
      ++ ++
    • ++ mime: Mimetype of following content ++
    • ++ ++
    ++ ++ ++ ++ ++ ++ ++ ++ ++
    ++ ++ ++ ++ ++
    redirect (url)
    ++
    ++ ++ ++Redirects the client to a new URL and closes the connection. ++ ++ ++ ++

    Parameters

    ++
      ++ ++
    • ++ url: Target URL ++
    • ++ ++
    ++ ++ ++ ++ ++ ++ ++ ++ ++
    ++ ++ ++ ++ ++
    setfilehandler (callback)
    ++
    ++ ++ ++Set a handler function for incoming user file uploads. ++ ++ ++ ++

    Parameters

    ++
      ++ ++
    • ++ callback: Handler function ++
    • ++ ++
    ++ ++ ++ ++ ++ ++ ++ ++ ++
    ++ ++ ++ ++ ++
    source ()
    ++
    ++ ++ ++Get the RAW HTTP input source ++ ++ ++ ++ ++ ++ ++ ++ ++

    Return value:

    ++HTTP LTN12 source ++ ++ ++ ++
    ++ ++ ++ ++ ++
    splice (fp, size)
    ++
    ++ ++ ++Splice data from a filedescriptor to the client. ++ ++ ++ ++

    Parameters

    ++
      ++ ++
    • ++ fp: File descriptor ++
    • ++ ++
    • ++ size: Bytes to splice (optional) ++
    • ++ ++
    ++ ++ ++ ++ ++ ++ ++ ++ ++
    ++ ++ ++ ++ ++
    status (code, message)
    ++
    ++ ++ ++Set the HTTP status code and status message. ++ ++ ++ ++

    Parameters

    ++
      ++ ++
    • ++ code: Status code ++
    • ++ ++
    • ++ message: Status message ++
    • ++ ++
    ++ ++ ++ ++ ++ ++ ++ ++ ++
    ++ ++ ++ ++ ++
    write (content, src_err)
    ++
    ++ ++ ++Send a chunk of content data to the client. ++ ++This function is as a valid LTN12 sink. ++If the content chunk is nil this function will automatically invoke close. ++ ++ ++

    Parameters

    ++
      ++ ++
    • ++ content: Content chunk ++
    • ++ ++
    • ++ src_err: Error object from source (optional) ++
    • ++ ++
    ++ ++ ++ ++ ++ ++ ++ ++ ++

    See also:

    ++ ++ ++
    ++ ++ ++ ++ ++
    write_json (data)
    ++
    ++ ++ ++Send the given data as JSON encoded string. ++ ++ ++ ++

    Parameters

    ++
      ++ ++
    • ++ data: Data to send ++
    • ++ ++
    ++ ++ ++ ++ ++ ++ ++ ++ ++
    ++ ++ ++
    ++ ++ ++ ++ ++ ++
    ++ ++
    ++ ++
    ++

    Valid XHTML 1.0!

    ++
    ++ ++
    ++ ++ +diff --git a/feeds/luci/documentation/api/modules/luci.http.protocol.conditionals.html b/feeds/luci/documentation/api/modules/luci.http.protocol.conditionals.html +new file mode 100644 +index 0000000..9728815 +--- /dev/null ++++ b/feeds/luci/documentation/api/modules/luci.http.protocol.conditionals.html +@@ -0,0 +1,556 @@ ++ ++ ++ ++ Reference ++ ++ ++ ++ ++ ++
    ++ ++
    ++ ++
    ++
    ++
    ++ ++
    ++ ++ ++ ++
    ++ ++

    Class luci.http.protocol.conditionals

    ++ ++

    ++ ++ ++ ++ ++ ++ ++ ++

    Functions

    ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
    if_match (req, stat) ++ ++14.24 / If-Match ++ ++Test whether the given message object contains an "If-Match" header and ++compare it against the given stat object.
    if_modified_since (req, stat) ++ ++14.25 / If-Modified-Since ++ ++Test whether the given message object contains an "If-Modified-Since" header ++and compare it against the given stat object.
    if_none_match (req, stat) ++ ++14.26 / If-None-Match ++ ++Test whether the given message object contains an "If-None-Match" header and ++compare it against the given stat object.
    if_range (req, stat) ++ ++14.27 / If-Range ++ ++The If-Range header is currently not implemented due to the lack of general ++byte range stuff in luci.http.protocol .
    if_unmodified_since (req, stat) ++ ++14.28 / If-Unmodified-Since ++ ++Test whether the given message object contains an "If-Unmodified-Since" ++header and compare it against the given stat object.
    mk_etag (stat) ++ ++Implement 14.19 / ETag.
    ++ ++ ++ ++ ++ ++ ++
    ++
    ++ ++ ++

    Functions

    ++
    ++ ++ ++ ++
    if_match (req, stat)
    ++
    ++ ++ ++14.24 / If-Match ++ ++Test whether the given message object contains an "If-Match" header and ++compare it against the given stat object. ++ ++ ++

    Parameters

    ++
      ++ ++
    • ++ req: HTTP request message object ++
    • ++ ++
    • ++ stat: A file.stat object ++
    • ++ ++
    ++ ++ ++ ++ ++ ++ ++

    Return values:

    ++
      ++ ++
    1. Boolean indicating whether the precondition is ok ++ ++
    2. Alternative status code if the precondition failed ++ ++
    ++ ++ ++ ++
    ++ ++ ++ ++ ++
    if_modified_since (req, stat)
    ++
    ++ ++ ++14.25 / If-Modified-Since ++ ++Test whether the given message object contains an "If-Modified-Since" header ++and compare it against the given stat object. ++ ++ ++

    Parameters

    ++
      ++ ++
    • ++ req: HTTP request message object ++
    • ++ ++
    • ++ stat: A file.stat object ++
    • ++ ++
    ++ ++ ++ ++ ++ ++ ++

    Return values:

    ++
      ++ ++
    1. Boolean indicating whether the precondition is ok ++ ++
    2. Alternative status code if the precondition failed ++ ++
    3. Table containing extra HTTP headers if the precondition failed ++ ++
    ++ ++ ++ ++
    ++ ++ ++ ++ ++
    if_none_match (req, stat)
    ++
    ++ ++ ++14.26 / If-None-Match ++ ++Test whether the given message object contains an "If-None-Match" header and ++compare it against the given stat object. ++ ++ ++

    Parameters

    ++
      ++ ++
    • ++ req: HTTP request message object ++
    • ++ ++
    • ++ stat: A file.stat object ++
    • ++ ++
    ++ ++ ++ ++ ++ ++ ++

    Return values:

    ++
      ++ ++
    1. Boolean indicating whether the precondition is ok ++ ++
    2. Alternative status code if the precondition failed ++ ++
    3. Table containing extra HTTP headers if the precondition failed ++ ++
    ++ ++ ++ ++
    ++ ++ ++ ++ ++
    if_range (req, stat)
    ++
    ++ ++ ++14.27 / If-Range ++ ++The If-Range header is currently not implemented due to the lack of general ++byte range stuff in luci.http.protocol . This function will always return ++false, 412 to indicate a failed precondition. ++ ++ ++

    Parameters

    ++
      ++ ++
    • ++ req: HTTP request message object ++
    • ++ ++
    • ++ stat: A file.stat object ++
    • ++ ++
    ++ ++ ++ ++ ++ ++ ++

    Return values:

    ++
      ++ ++
    1. Boolean indicating whether the precondition is ok ++ ++
    2. Alternative status code if the precondition failed ++ ++
    ++ ++ ++ ++
    ++ ++ ++ ++ ++
    if_unmodified_since (req, stat)
    ++
    ++ ++ ++14.28 / If-Unmodified-Since ++ ++Test whether the given message object contains an "If-Unmodified-Since" ++header and compare it against the given stat object. ++ ++ ++

    Parameters

    ++
      ++ ++
    • ++ req: HTTP request message object ++
    • ++ ++
    • ++ stat: A file.stat object ++
    • ++ ++
    ++ ++ ++ ++ ++ ++ ++

    Return values:

    ++
      ++ ++
    1. Boolean indicating whether the precondition is ok ++ ++
    2. Alternative status code if the precondition failed ++ ++
    ++ ++ ++ ++
    ++ ++ ++ ++ ++
    mk_etag (stat)
    ++
    ++ ++ ++Implement 14.19 / ETag. ++ ++ ++ ++

    Parameters

    ++
      ++ ++
    • ++ stat: A file.stat structure ++
    • ++ ++
    ++ ++ ++ ++ ++ ++ ++

    Return value:

    ++String containing the generated tag suitable for ETag headers ++ ++ ++ ++
    ++ ++ ++
    ++ ++ ++ ++ ++ ++
    ++ ++
    ++ ++
    ++

    Valid XHTML 1.0!

    ++
    ++ ++
    ++ ++ +diff --git a/feeds/luci/documentation/api/modules/luci.http.protocol.date.html b/feeds/luci/documentation/api/modules/luci.http.protocol.date.html +new file mode 100644 +index 0000000..d89a723 +--- /dev/null ++++ b/feeds/luci/documentation/api/modules/luci.http.protocol.date.html +@@ -0,0 +1,410 @@ ++ ++ ++ ++ Reference ++ ++ ++ ++ ++ ++
    ++ ++
    ++ ++
    ++
    ++
    ++ ++
    ++ ++ ++ ++
    ++ ++

    Class luci.http.protocol.date

    ++ ++

    ++ ++ ++ ++ ++ ++ ++ ++

    Functions

    ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
    compare (d1, d2) ++ ++Compare two dates which can either be unix epoch times or HTTP date strings.
    to_http (time) ++ ++Convert the given unix epoch time to valid HTTP date string.
    to_unix (data) ++ ++Parse given HTTP date string and convert it to unix epoch time.
    tz_offset (tz) ++ ++Return the time offset in seconds between the UTC and given time zone.
    ++ ++ ++ ++ ++ ++ ++
    ++
    ++ ++ ++

    Functions

    ++
    ++ ++ ++ ++
    compare (d1, d2)
    ++
    ++ ++ ++Compare two dates which can either be unix epoch times or HTTP date strings. ++ ++ ++ ++

    Parameters

    ++
      ++ ++
    • ++ d1: The first date or epoch time to compare ++
    • ++ ++
    • ++ d2: The first date or epoch time to compare ++
    • ++ ++
    ++ ++ ++ ++ ++ ++ ++

    Return values:

    ++
      ++ ++
    1. -1 - if d1 is lower then d2 ++ ++
    2. 0 - if both dates are equal ++ ++
    3. 1 - if d1 is higher then d2 ++ ++
    ++ ++ ++ ++
    ++ ++ ++ ++ ++
    to_http (time)
    ++
    ++ ++ ++Convert the given unix epoch time to valid HTTP date string. ++ ++ ++ ++

    Parameters

    ++
      ++ ++
    • ++ time: Unix epoch time ++
    • ++ ++
    ++ ++ ++ ++ ++ ++ ++

    Return value:

    ++String containing the formatted date ++ ++ ++ ++
    ++ ++ ++ ++ ++
    to_unix (data)
    ++
    ++ ++ ++Parse given HTTP date string and convert it to unix epoch time. ++ ++ ++ ++

    Parameters

    ++
      ++ ++
    • ++ data: String containing the date ++
    • ++ ++
    ++ ++ ++ ++ ++ ++ ++

    Return value:

    ++Unix epoch time ++ ++ ++ ++
    ++ ++ ++ ++ ++
    tz_offset (tz)
    ++
    ++ ++ ++Return the time offset in seconds between the UTC and given time zone. ++ ++ ++ ++

    Parameters

    ++
      ++ ++
    • ++ tz: Symbolic or numeric timezone specifier ++
    • ++ ++
    ++ ++ ++ ++ ++ ++ ++

    Return value:

    ++Time offset to UTC in seconds ++ ++ ++ ++
    ++ ++ ++
    ++ ++ ++ ++ ++ ++
    ++ ++
    ++ ++
    ++

    Valid XHTML 1.0!

    ++
    ++ ++
    ++ ++ +diff --git a/feeds/luci/documentation/api/modules/luci.http.protocol.html b/feeds/luci/documentation/api/modules/luci.http.protocol.html +new file mode 100644 +index 0000000..1d45ace +--- /dev/null ++++ b/feeds/luci/documentation/api/modules/luci.http.protocol.html +@@ -0,0 +1,753 @@ ++ ++ ++ ++ Reference ++ ++ ++ ++ ++ ++
    ++ ++
    ++ ++
    ++
    ++
    ++ ++
    ++ ++ ++ ++
    ++ ++

    Class luci.http.protocol

    ++ ++

    ++ ++ ++ ++ ++ ++ ++ ++

    Functions

    ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
    header_source (sock) ++ ++Creates a ltn12 source from the given socket.
    mimedecode_message_body (src, msg, filecb) ++ ++Decode a mime encoded http message body with multipart/form-data ++ ++Content-Type.
    parse_message_body (src, msg, filecb) ++ ++Try to extract and decode a http message body from the given ltn12 source.
    parse_message_header (src) ++ ++Try to extract an http message header including information like protocol ++ ++version, message headers and resulting CGI environment variables from the ++given ltn12 source.
    urldecode (str, no_plus) ++ ++Decode an urlencoded string - optionally without decoding ++ ++the "+" sign to " " - and return the decoded string.
    urldecode_message_body (src, msg) ++ ++Decode an urlencoded http message body with application/x-www-urlencoded ++ ++Content-Type.
    urldecode_params (url, tbl) ++ ++Extract and split urlencoded data pairs, separated bei either "&" or ";" ++ ++from given url or string.
    urlencode (str) ++ ++Encode given string to x-www-urlencoded format.
    urlencode_params (tbl) ++ ++Encode each key-value-pair in given table to x-www-urlencoded format, ++ ++separated by "&".
    ++ ++ ++ ++ ++ ++ ++
    ++
    ++ ++ ++

    Functions

    ++
    ++ ++ ++ ++
    header_source (sock)
    ++
    ++ ++ ++Creates a ltn12 source from the given socket. The source will return it's ++ ++data line by line with the trailing \r\n stripped of. ++ ++ ++

    Parameters

    ++
      ++ ++
    • ++ sock: Readable network socket ++
    • ++ ++
    ++ ++ ++ ++ ++ ++ ++

    Return value:

    ++Ltn12 source function ++ ++ ++ ++
    ++ ++ ++ ++ ++
    mimedecode_message_body (src, msg, filecb)
    ++
    ++ ++ ++Decode a mime encoded http message body with multipart/form-data ++ ++Content-Type. Stores all extracted data associated with its parameter name ++in the params table withing the given message object. Multiple parameter ++values are stored as tables, ordinary ones as strings. ++If an optional file callback function is given then it is feeded with the ++file contents chunk by chunk and only the extracted file name is stored ++within the params table. The callback function will be called subsequently ++with three arguments: ++ o Table containing decoded (name, file) and raw (headers) mime header data ++ o String value containing a chunk of the file data ++ o Boolean which indicates wheather the current chunk is the last one (eof) ++ ++ ++

    Parameters

    ++
      ++ ++
    • ++ src: Ltn12 source function ++
    • ++ ++
    • ++ msg: HTTP message object ++
    • ++ ++
    • ++ filecb: File callback function (optional) ++
    • ++ ++
    ++ ++ ++ ++ ++ ++ ++

    Return values:

    ++
      ++ ++
    1. Value indicating successful operation (not nil means "ok") ++ ++
    2. String containing the error if unsuccessful ++ ++
    ++ ++ ++ ++

    See also:

    ++ ++ ++
    ++ ++ ++ ++ ++
    parse_message_body (src, msg, filecb)
    ++
    ++ ++ ++Try to extract and decode a http message body from the given ltn12 source. ++ ++This function will examine the Content-Type within the given message object ++to select the appropriate content decoder. ++Currently the application/x-www-urlencoded and application/form-data ++mime types are supported. If the encountered content encoding can't be ++handled then the whole message body will be stored unaltered as "content" ++property within the given message object. ++ ++ ++

    Parameters

    ++
      ++ ++
    • ++ src: Ltn12 source function ++
    • ++ ++
    • ++ msg: HTTP message object ++
    • ++ ++
    • ++ filecb: File data callback (optional, see mimedecode_message_body()) ++
    • ++ ++
    ++ ++ ++ ++ ++ ++ ++

    Return values:

    ++
      ++ ++
    1. Value indicating successful operation (not nil means "ok") ++ ++
    2. String containing the error if unsuccessful ++ ++
    ++ ++ ++ ++

    See also:

    ++ ++ ++
    ++ ++ ++ ++ ++
    parse_message_header (src)
    ++
    ++ ++ ++Try to extract an http message header including information like protocol ++ ++version, message headers and resulting CGI environment variables from the ++given ltn12 source. ++ ++ ++

    Parameters

    ++
      ++ ++
    • ++ src: Ltn12 source function ++
    • ++ ++
    ++ ++ ++ ++ ++ ++ ++

    Return value:

    ++HTTP message object ++ ++ ++ ++

    See also:

    ++ ++ ++
    ++ ++ ++ ++ ++
    urldecode (str, no_plus)
    ++
    ++ ++ ++Decode an urlencoded string - optionally without decoding ++ ++the "+" sign to " " - and return the decoded string. ++ ++ ++

    Parameters

    ++
      ++ ++
    • ++ str: Input string in x-www-urlencoded format ++
    • ++ ++
    • ++ no_plus: Don't decode "+" signs to spaces ++
    • ++ ++
    ++ ++ ++ ++ ++ ++ ++

    Return value:

    ++The decoded string ++ ++ ++ ++

    See also:

    ++ ++ ++
    ++ ++ ++ ++ ++
    urldecode_message_body (src, msg)
    ++
    ++ ++ ++Decode an urlencoded http message body with application/x-www-urlencoded ++ ++Content-Type. Stores all extracted data associated with its parameter name ++in the params table withing the given message object. Multiple parameter ++values are stored as tables, ordinary ones as strings. ++ ++ ++

    Parameters

    ++
      ++ ++
    • ++ src: Ltn12 source function ++
    • ++ ++
    • ++ msg: HTTP message object ++
    • ++ ++
    ++ ++ ++ ++ ++ ++ ++

    Return values:

    ++
      ++ ++
    1. Value indicating successful operation (not nil means "ok") ++ ++
    2. String containing the error if unsuccessful ++ ++
    ++ ++ ++ ++

    See also:

    ++ ++ ++
    ++ ++ ++ ++ ++
    urldecode_params (url, tbl)
    ++
    ++ ++ ++Extract and split urlencoded data pairs, separated bei either "&" or ";" ++ ++from given url or string. Returns a table with urldecoded values. ++Simple parameters are stored as string values associated with the parameter ++name within the table. Parameters with multiple values are stored as array ++containing the corresponding values. ++ ++ ++

    Parameters

    ++
      ++ ++
    • ++ url: The url or string which contains x-www-urlencoded form data ++
    • ++ ++
    • ++ tbl: Use the given table for storing values (optional) ++
    • ++ ++
    ++ ++ ++ ++ ++ ++ ++

    Return value:

    ++Table containing the urldecoded parameters ++ ++ ++ ++

    See also:

    ++ ++ ++
    ++ ++ ++ ++ ++
    urlencode (str)
    ++
    ++ ++ ++Encode given string to x-www-urlencoded format. ++ ++ ++ ++

    Parameters

    ++
      ++ ++
    • ++ str: String to encode ++
    • ++ ++
    ++ ++ ++ ++ ++ ++ ++

    Return value:

    ++String containing the encoded data ++ ++ ++ ++

    See also:

    ++ ++ ++
    ++ ++ ++ ++ ++
    urlencode_params (tbl)
    ++
    ++ ++ ++Encode each key-value-pair in given table to x-www-urlencoded format, ++ ++separated by "&". Tables are encoded as parameters with multiple values by ++repeating the parameter name with each value. ++ ++ ++

    Parameters

    ++
      ++ ++
    • ++ tbl: Table with the values ++
    • ++ ++
    ++ ++ ++ ++ ++ ++ ++

    Return value:

    ++String containing encoded values ++ ++ ++ ++

    See also:

    ++ ++ ++
    ++ ++ ++
    ++ ++ ++ ++ ++ ++
    ++ ++
    ++ ++
    ++

    Valid XHTML 1.0!

    ++
    ++ ++
    ++ ++ +diff --git a/feeds/luci/documentation/api/modules/luci.http.protocol.mime.html b/feeds/luci/documentation/api/modules/luci.http.protocol.mime.html +new file mode 100644 +index 0000000..0b5ce0c +--- /dev/null ++++ b/feeds/luci/documentation/api/modules/luci.http.protocol.mime.html +@@ -0,0 +1,326 @@ ++ ++ ++ ++ Reference ++ ++ ++ ++ ++ ++
    ++ ++
    ++ ++
    ++
    ++
    ++ ++
    ++ ++ ++ ++
    ++ ++

    Class luci.http.protocol.mime

    ++ ++

    ++ ++ ++ ++ ++ ++ ++ ++

    Functions

    ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
    to_ext (mimetype) ++ ++Return corresponding extension for a given mime type or nil if the ++ ++given mime-type is unknown.
    to_mime (filename) ++ ++Extract extension from a filename and return corresponding mime-type or ++ ++"application/octet-stream" if the extension is unknown.
    ++ ++ ++ ++ ++ ++ ++
    ++
    ++ ++ ++

    Functions

    ++
    ++ ++ ++ ++
    to_ext (mimetype)
    ++
    ++ ++ ++Return corresponding extension for a given mime type or nil if the ++ ++given mime-type is unknown. ++ ++ ++

    Parameters

    ++
      ++ ++
    • ++ mimetype: The mimetype to retrieve the extension from ++
    • ++ ++
    ++ ++ ++ ++ ++ ++ ++

    Return value:

    ++String with the extension or nil for unknown type ++ ++ ++ ++
    ++ ++ ++ ++ ++
    to_mime (filename)
    ++
    ++ ++ ++Extract extension from a filename and return corresponding mime-type or ++ ++"application/octet-stream" if the extension is unknown. ++ ++ ++

    Parameters

    ++
      ++ ++
    • ++ filename: The filename for which the mime type is guessed ++
    • ++ ++
    ++ ++ ++ ++ ++ ++ ++

    Return value:

    ++String containign the determined mime type ++ ++ ++ ++
    ++ ++ ++
    ++ ++ ++ ++ ++ ++
    ++ ++
    ++ ++
    ++

    Valid XHTML 1.0!

    ++
    ++ ++
    ++ ++ +diff --git a/feeds/luci/documentation/api/modules/luci.i18n.html b/feeds/luci/documentation/api/modules/luci.i18n.html +new file mode 100644 +index 0000000..0111cb2 +--- /dev/null ++++ b/feeds/luci/documentation/api/modules/luci.i18n.html +@@ -0,0 +1,564 @@ ++ ++ ++ ++ Reference ++ ++ ++ ++ ++ ++
    ++ ++
    ++ ++
    ++
    ++
    ++ ++
    ++ ++ ++ ++
    ++ ++

    Class luci.i18n

    ++ ++

    ++ ++ ++ ++ ++ ++ ++ ++

    Functions

    ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
    clear () ++ ++Clear the translation table.
    load (file, lang, force) ++ ++Load a translation and copy its data into the translation table.
    loadc (file, force) ++ ++Load a translation file using the default translation language.
    setlanguage (lang) ++ ++Set the context default translation language.
    string (key) ++ ++Return the translated value for a specific translation key ++ ++and ensure that the returned value is a Lua string value.
    stringf (key, ...) ++ ++Return the translated value for a specific translation key and use it as sprintf pattern.
    translate (key) ++ ++Return the translated value for a specific translation key.
    translatef (key, ...) ++ ++Return the translated value for a specific translation key and use it as sprintf pattern.
    ++ ++ ++ ++ ++ ++ ++
    ++
    ++ ++ ++

    Functions

    ++
    ++ ++ ++ ++
    clear ()
    ++
    ++ ++ ++Clear the translation table. ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
    ++ ++ ++ ++ ++
    load (file, lang, force)
    ++
    ++ ++ ++Load a translation and copy its data into the translation table. ++ ++ ++ ++

    Parameters

    ++
      ++ ++
    • ++ file: Language file ++
    • ++ ++
    • ++ lang: Two-letter language code ++
    • ++ ++
    • ++ force: Force reload even if already loaded (optional) ++
    • ++ ++
    ++ ++ ++ ++ ++ ++ ++

    Return value:

    ++Success status ++ ++ ++ ++
    ++ ++ ++ ++ ++
    loadc (file, force)
    ++
    ++ ++ ++Load a translation file using the default translation language. ++ ++Alternatively load the translation of the fallback language. ++ ++ ++

    Parameters

    ++
      ++ ++
    • ++ file: Language file ++
    • ++ ++
    • ++ force: Force reload even if already loaded (optional) ++
    • ++ ++
    ++ ++ ++ ++ ++ ++ ++ ++ ++
    ++ ++ ++ ++ ++
    setlanguage (lang)
    ++
    ++ ++ ++Set the context default translation language. ++ ++ ++ ++

    Parameters

    ++
      ++ ++
    • ++ lang: Two-letter language code ++
    • ++ ++
    ++ ++ ++ ++ ++ ++ ++ ++ ++
    ++ ++ ++ ++ ++
    string (key)
    ++
    ++ ++ ++Return the translated value for a specific translation key ++ ++and ensure that the returned value is a Lua string value. ++This is the same as calling tostring(translate(...)) ++ ++ ++

    Parameters

    ++
      ++ ++
    • ++ key: Default translation text ++
    • ++ ++
    ++ ++ ++ ++ ++ ++ ++

    Return value:

    ++Translated string ++ ++ ++ ++
    ++ ++ ++ ++ ++
    stringf (key, ...)
    ++
    ++ ++ ++Return the translated value for a specific translation key and use it as sprintf pattern. ++ ++Ensure that the returned value is a Lua string value. ++This is the same as calling tostring(translatef(...)) ++ ++ ++

    Parameters

    ++
      ++ ++
    • ++ key: Default translation text ++
    • ++ ++
    • ++ ...: Format parameters ++
    • ++ ++
    ++ ++ ++ ++ ++ ++ ++

    Return value:

    ++Translated and formatted string ++ ++ ++ ++
    ++ ++ ++ ++ ++
    translate (key)
    ++
    ++ ++ ++Return the translated value for a specific translation key. ++ ++ ++ ++

    Parameters

    ++
      ++ ++
    • ++ key: Default translation text ++
    • ++ ++
    ++ ++ ++ ++ ++ ++ ++

    Return value:

    ++Translated string ++ ++ ++ ++
    ++ ++ ++ ++ ++
    translatef (key, ...)
    ++
    ++ ++ ++Return the translated value for a specific translation key and use it as sprintf pattern. ++ ++ ++ ++

    Parameters

    ++
      ++ ++
    • ++ key: Default translation text ++
    • ++ ++
    • ++ ...: Format parameters ++
    • ++ ++
    ++ ++ ++ ++ ++ ++ ++

    Return value:

    ++Translated and formatted string ++ ++ ++ ++
    ++ ++ ++
    ++ ++ ++ ++ ++ ++
    ++ ++
    ++ ++
    ++

    Valid XHTML 1.0!

    ++
    ++ ++
    ++ ++ +diff --git a/feeds/luci/documentation/api/modules/luci.ip.cidr.html b/feeds/luci/documentation/api/modules/luci.ip.cidr.html +new file mode 100644 +index 0000000..28fb21d +--- /dev/null ++++ b/feeds/luci/documentation/api/modules/luci.ip.cidr.html +@@ -0,0 +1,1269 @@ ++ ++ ++ ++ Reference ++ ++ ++ ++ ++ ++
    ++ ++
    ++ ++
    ++
    ++
    ++ ++
    ++ ++ ++ ++
    ++ ++

    Object Instance luci.ip.cidr

    ++ ++

    ++ IP CIDR Object. ++ Represents an IPv4 or IPv6 address range.

    ++ ++ ++ ++ ++ ++ ++ ++

    Functions

    ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
    cidr:is4 () ++ ++Checks whether the CIDR instance is an IPv4 address range ++
    cidr:is4rfc1918 () ++ ++Checks whether the CIDR instance is within the private RFC1918 address space ++
    cidr:is4linklocal () ++ ++Checks whether the CIDR instance is an IPv4 link local (Zeroconf) address ++
    cidr:is6 () ++ ++Checks whether the CIDR instance is an IPv6 address range ++
    cidr:is6linklocal () ++ ++Checks whether the CIDR instance is an IPv6 link local address ++
    cidr:is6mapped4 () ++ ++Checks whether the CIDR instance is an IPv6 mapped IPv4 address ++
    cidr:lower (addr) ++ ++Checks whether this CIDR instance is lower than the given argument.
    cidr:higher (addr) ++ ++Checks whether this CIDR instance is higher than the given argument.
    cidr:equal (addr) ++ ++Checks whether this CIDR instance is equal to the given argument.
    cidr:prefix (mask) ++ ++Get or set prefix size of CIDR instance.
    cidr:network (mask) ++ ++Derive network address of CIDR instance.
    cidr:host () ++ ++Derive host address of CIDR instance.
    cidr:mask (mask) ++ ++Derive netmask of CIDR instance.
    cidr:broadcast (mask) ++ ++Derive broadcast address of CIDR instance.
    cidr:mapped4 () ++ ++Derive mapped IPv4 address of CIDR instance.
    cidr:contains (addr) ++ ++Test whether CIDR contains given range.
    cidr:add (amount, inplace) ++ ++Add given amount to CIDR instance.
    cidr:sub (amount, inplace) ++ ++Substract given amount from CIDR instance.
    cidr:minhost () ++ ++Calculate the lowest possible host address within this CIDR instance.
    cidr:maxhost () ++ ++Calculate the highest possible host address within this CIDR instance.
    cidr:string () ++ ++Convert CIDR instance into string representation.
    ++ ++ ++ ++ ++ ++ ++
    ++
    ++ ++ ++

    Functions

    ++
    ++ ++ ++ ++
    cidr:is4 ()
    ++
    ++ ++ ++Checks whether the CIDR instance is an IPv4 address range ++ ++ ++ ++ ++ ++ ++ ++ ++

    Return value:

    ++true if the CIDR is an IPv4 range, else false ++ ++ ++ ++

    See also:

    ++ ++ ++
    ++ ++ ++ ++ ++
    cidr:is4rfc1918 ()
    ++
    ++ ++ ++Checks whether the CIDR instance is within the private RFC1918 address space ++ ++ ++ ++ ++ ++ ++

    Usage:

    ++
    local addr = luci.ip.new("192.168.45.2/24") 
    ++if addr:is4rfc1918() then 
    ++	print("Is a private address") 
    ++end
    ++ ++ ++ ++

    Return value:

    ++true if the entire range of this CIDR lies within one of ++ the ranges 10.0.0.0-10.255.255.255, ++ 172.16.0.0-172.31.0.0 or ++ 192.168.0.0-192.168.255.255, else false. ++ ++ ++ ++
    ++ ++ ++ ++ ++
    cidr:is4linklocal ()
    ++
    ++ ++ ++Checks whether the CIDR instance is an IPv4 link local (Zeroconf) address ++ ++ ++ ++ ++ ++ ++

    Usage:

    ++
    local addr = luci.ip.new("169.254.34.125") 
    ++if addr:is4linklocal() then 
    ++	print("Is a zeroconf address") 
    ++end
    ++ ++ ++ ++

    Return value:

    ++true if the entire range of this CIDR lies within the range ++ the range 169.254.0.0-169.254.255.255, else false. ++ ++ ++ ++
    ++ ++ ++ ++ ++
    cidr:is6 ()
    ++
    ++ ++ ++Checks whether the CIDR instance is an IPv6 address range ++ ++ ++ ++ ++ ++ ++ ++ ++

    Return value:

    ++true if the CIDR is an IPv6 range, else false ++ ++ ++ ++

    See also:

    ++ ++ ++
    ++ ++ ++ ++ ++
    cidr:is6linklocal ()
    ++
    ++ ++ ++Checks whether the CIDR instance is an IPv6 link local address ++ ++ ++ ++ ++ ++ ++

    Usage:

    ++
    local addr = luci.ip.new("fe92:53a:3216:af01:221:63ff:fe75:aa17/64") 
    ++if addr:is6linklocal() then 
    ++	print("Is a linklocal address") 
    ++end
    ++ ++ ++ ++

    Return value:

    ++true if the entire range of this CIDR lies within the range ++ the fe80::/10 range, else false. ++ ++ ++ ++
    ++ ++ ++ ++ ++
    cidr:is6mapped4 ()
    ++
    ++ ++ ++Checks whether the CIDR instance is an IPv6 mapped IPv4 address ++ ++ ++ ++ ++ ++ ++

    Usage:

    ++
    local addr = luci.ip.new("::ffff:192.168.1.1") 
    ++if addr:is6mapped4() then 
    ++	print("Is a mapped IPv4 address") 
    ++end
    ++ ++ ++ ++

    Return value:

    ++true if the address is an IPv6 mapped IPv4 address in the ++ form ::ffff:1.2.3.4. ++ ++ ++ ++
    ++ ++ ++ ++ ++
    cidr:lower (addr)
    ++
    ++ ++ ++Checks whether this CIDR instance is lower than the given argument. ++The comparisation follows these rules: ++
    • An IPv4 address is always lower than an IPv6 address
    • ++
    • Prefix sizes are ignored
    ++ ++ ++ ++

    Parameters

    ++
      ++ ++
    • ++ addr: A luci.ip.cidr instance or a string convertable by ++ luci.ip.new() to compare against. ++
    • ++ ++
    ++ ++ ++ ++ ++

    Usage:

    ++
    local addr = luci.ip.new("192.168.1.1") 
    ++print(addr:lower(addr)) -- false 
    ++print(addr:lower("10.10.10.10/24")) -- false 
    ++print(addr:lower(luci.ip.new("::1"))) -- true 
    ++print(addr:lower(luci.ip.new("192.168.200.1"))) -- true
    ++ ++ ++ ++

    Return value:

    ++true if this CIDR is lower than the given address, ++ else false. ++ ++ ++ ++

    See also:

    ++ ++ ++
    ++ ++ ++ ++ ++
    cidr:higher (addr)
    ++
    ++ ++ ++Checks whether this CIDR instance is higher than the given argument. ++The comparisation follows these rules: ++
    • An IPv4 address is always lower than an IPv6 address
    • ++
    • Prefix sizes are ignored
    ++ ++ ++ ++

    Parameters

    ++
      ++ ++
    • ++ addr: A luci.ip.cidr instance or a string convertable by ++ luci.ip.new() to compare against. ++
    • ++ ++
    ++ ++ ++ ++ ++

    Usage:

    ++
    local addr = luci.ip.new("192.168.1.1") 
    ++print(addr:higher(addr)) -- false 
    ++print(addr:higher("10.10.10.10/24")) -- true 
    ++print(addr:higher(luci.ip.new("::1"))) -- false 
    ++print(addr:higher(luci.ip.new("192.168.200.1"))) -- false
    ++ ++ ++ ++

    Return value:

    ++true if this CIDR is higher than the given address, ++ else false. ++ ++ ++ ++

    See also:

    ++ ++ ++
    ++ ++ ++ ++ ++
    cidr:equal (addr)
    ++
    ++ ++ ++Checks whether this CIDR instance is equal to the given argument. ++ ++ ++ ++

    Parameters

    ++
      ++ ++
    • ++ addr: A luci.ip.cidr instance or a string convertable by ++ luci.ip.new() to compare against. ++
    • ++ ++
    ++ ++ ++ ++ ++

    Usage:

    ++
    local addr = luci.ip.new("192.168.1.1") 
    ++print(addr:equal(addr)) -- true 
    ++print(addr:equal("192.168.1.1")) -- true 
    ++print(addr:equal(luci.ip.new("::1"))) -- false 
    ++ 
    ++local addr6 = luci.ip.new("::1") 
    ++print(addr6:equal("0:0:0:0:0:0:0:1/64")) -- true 
    ++print(addr6:equal(luci.ip.new("fe80::221:63ff:fe75:aa17"))) -- false
    ++ ++ ++ ++

    Return value:

    ++true if this CIDR is equal to the given address, ++ else false. ++ ++ ++ ++

    See also:

    ++ ++ ++
    ++ ++ ++ ++ ++
    cidr:prefix (mask)
    ++
    ++ ++ ++Get or set prefix size of CIDR instance. ++If the optional mask parameter is given, the prefix size of this CIDR is altered ++else the current prefix size is returned. ++ ++ ++ ++

    Parameters

    ++
      ++ ++
    • ++ mask: Either a number containing the number of bits (0..32 ++ for IPv4, 0..128 for IPv6) or a string containing a valid ++ netmask (optional) ++
    • ++ ++
    ++ ++ ++ ++ ++

    Usage:

    ++
    local range = luci.ip.new("192.168.1.1/255.255.255.0") 
    ++print(range:prefix()) -- 24 
    ++ 
    ++range:prefix(16) 
    ++print(range:prefix()) -- 16 
    ++ 
    ++range:prefix("255.255.255.255") 
    ++print(range:prefix()) -- 32
    ++ ++ ++ ++

    Return value:

    ++Bit count of the current prefix size ++ ++ ++ ++
    ++ ++ ++ ++ ++
    cidr:network (mask)
    ++
    ++ ++ ++Derive network address of CIDR instance. ++ ++Returns a new CIDR instance representing the network address of this instance ++with all host parts masked out. The used prefix size can be overridden by the ++optional mask parameter. ++ ++ ++ ++

    Parameters

    ++
      ++ ++
    • ++ mask: Either a number containing the number of bits (0..32 ++ for IPv4, 0..128 for IPv6) or a string containing a valid ++ netmask (optional) ++
    • ++ ++
    ++ ++ ++ ++ ++

    Usage:

    ++
    local range = luci.ip.new("192.168.62.243/255.255.0.0") 
    ++print(range:network())                -- "192.168.0.0" 
    ++print(range:network(24))              -- "192.168.62.0" 
    ++print(range:network("255.255.255.0")) -- "192.168.62.0" 
    ++ 
    ++local range6 = luci.ip.new("fd9b:62b3:9cc5:0:221:63ff:fe75:aa17/64") 
    ++print(range6:network())               -- "fd9b:62b3:9cc5::"
    ++ ++ ++ ++

    Return value:

    ++CIDR instance representing the network address ++ ++ ++ ++
    ++ ++ ++ ++ ++
    cidr:host ()
    ++
    ++ ++ ++Derive host address of CIDR instance. ++ ++This function essentially constructs a copy of this CIDR with the prefix size ++set to 32 for IPv4 and 128 for IPv6. ++ ++ ++ ++ ++ ++ ++

    Usage:

    ++
    local range = luci.ip.new("172.19.37.45/16") 
    ++print(range)        -- "172.19.37.45/16" 
    ++print(range:host()) -- "172.19.37.45"
    ++ ++ ++ ++

    Return value:

    ++CIDR instance representing the host address ++ ++ ++ ++
    ++ ++ ++ ++ ++
    cidr:mask (mask)
    ++
    ++ ++ ++Derive netmask of CIDR instance. ++ ++Constructs a CIDR instance representing the netmask of this instance. The used ++prefix size can be overridden by the optional mask parameter. ++ ++ ++ ++

    Parameters

    ++
      ++ ++
    • ++ mask: Either a number containing the number of bits (0..32 ++ for IPv4, 0..128 for IPv6) or a string containing a valid ++ netmask (optional) ++
    • ++ ++
    ++ ++ ++ ++ ++

    Usage:

    ++
    local range = luci.ip.new("172.19.37.45/16") 
    ++print(range:mask())            -- "255.255.0.0" 
    ++print(range:mask(24))          -- "255.255.255.0" 
    ++print(range:mask("255.0.0.0")) -- "255.0.0.0"
    ++ ++ ++ ++

    Return value:

    ++CIDR instance representing the netmask ++ ++ ++ ++
    ++ ++ ++ ++ ++
    cidr:broadcast (mask)
    ++
    ++ ++ ++Derive broadcast address of CIDR instance. ++ ++Constructs a CIDR instance representing the broadcast address of this instance. ++The used prefix size can be overridden by the optional mask parameter. ++ ++This function has no effect on IPv6 instances, it will return nothing in this ++case. ++ ++ ++ ++

    Parameters

    ++
      ++ ++
    • ++ mask: Either a number containing the number of bits (0..32 ++ for IPv4, 0..128 for IPv6) or a string containing a valid ++ netmask (optional) ++
    • ++ ++
    ++ ++ ++ ++ ++

    Usage:

    ++
    local range = luci.ip.new("172.19.37.45/16") 
    ++print(range:broadcast())            -- "172.19.255.255" 
    ++print(range:broadcast(24))          -- "172.19.37.255" 
    ++print(range:broadcast("255.0.0.0")) -- "172.255.255.255"
    ++ ++ ++ ++

    Return value:

    ++Return a new CIDR instance representing the broadcast address if this ++ instance is an IPv4 range, else return nothing. ++ ++ ++ ++
    ++ ++ ++ ++ ++
    cidr:mapped4 ()
    ++
    ++ ++ ++Derive mapped IPv4 address of CIDR instance. ++ ++Constructs a CIDR instance representing the IPv4 address of the IPv6 mapped ++IPv4 address in this instance. ++ ++This function has no effect on IPv4 instances or IPv6 instances which are not a ++mapped address, it will return nothing in this case. ++ ++ ++ ++ ++ ++ ++

    Usage:

    ++
    local addr = luci.ip.new("::ffff:172.16.19.1") 
    ++print(addr:mapped4()) -- "172.16.19.1"
    ++ ++ ++ ++

    Return value:

    ++Return a new CIDR instance representing the IPv4 address if this ++ instance is an IPv6 mapped IPv4 address, else return nothing. ++ ++ ++ ++
    ++ ++ ++ ++ ++
    cidr:contains (addr)
    ++
    ++ ++ ++Test whether CIDR contains given range. ++ ++ ++ ++

    Parameters

    ++
      ++ ++
    • ++ addr: A luci.ip.cidr instance or a string convertable by ++ luci.ip.new() to test. ++
    • ++ ++
    ++ ++ ++ ++ ++

    Usage:

    ++
    local range = luci.ip.new("10.24.0.0/255.255.0.0") 
    ++print(range:contains("10.24.5.1"))  -- true 
    ++print(range:contains("::1"))        -- false 
    ++print(range:contains("10.0.0.0/8")) -- false 
    ++ 
    ++local range6 = luci.ip.new("fe80::/10") 
    ++print(range6:contains("fe80::221:63f:fe75:aa17/64"))         -- true 
    ++print(range6:contains("fd9b:6b3:c5:0:221:63f:fe75:aa17/64")) -- false
    ++ ++ ++ ++

    Return value:

    ++true if this instance fully contains the given address else ++ false. ++ ++ ++ ++
    ++ ++ ++ ++ ++
    cidr:add (amount, inplace)
    ++
    ++ ++ ++Add given amount to CIDR instance. If the result would overflow the maximum ++address space, the result is set to the highest possible address. ++ ++ ++ ++

    Parameters

    ++
      ++ ++
    • ++ amount: A numeric value between 0 and 0xFFFFFFFF, a ++ luci.ip.cidr instance or a string convertable by ++ luci.ip.new(). ++
    • ++ ++
    • ++ inplace: If true, modify this instance instead of returning ++ a new derived CIDR instance. ++
    • ++ ++
    ++ ++ ++ ++ ++

    Usage:

    ++
    local addr = luci.ip.new("192.168.1.1/24") 
    ++print(addr:add(250))         -- "192.168.1.251/24" 
    ++print(addr:add("0.0.99.0"))  -- "192.168.100.1/24" 
    ++ 
    ++addr:add(256, true)          -- true 
    ++print(addr)                  -- "192.168.2.1/24 
    ++ 
    ++addr:add("255.0.0.0", true)  -- false (overflow) 
    ++print(addr)                  -- "255.255.255.255/24 
    ++ 
    ++local addr6 = luci.ip.new("fe80::221:63f:fe75:aa17/64") 
    ++print(addr6:add(256))        -- "fe80::221:63f:fe75:ab17/64" 
    ++print(addr6:add("::ffff:0")) -- "fe80::221:640:fe74:aa17/64" 
    ++ 
    ++addr:add(256, true)          -- true 
    ++print(addr)                  -- "fe80::221:63f:fe75:ab17/64 
    ++ 
    ++addr:add("ffff::", true)     -- false (overflow) 
    ++print(addr)                  -- "ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff/64"
    ++ ++ ++ ++

    Return value:

    ++
      ++
    • When adding inplace: Return true if the addition succeded ++ or false when the addition overflowed.
    • ++
    • When deriving new CIDR: Return new instance representing the value of ++ this instance plus the added amount or the highest possible address if ++ the addition overflowed the available address space.
    ++ ++ ++ ++
    ++ ++ ++ ++ ++
    cidr:sub (amount, inplace)
    ++
    ++ ++ ++Substract given amount from CIDR instance. If the result would under, the lowest ++possible address is returned. ++ ++ ++ ++

    Parameters

    ++
      ++ ++
    • ++ amount: A numeric value between 0 and 0xFFFFFFFF, a ++ luci.ip.cidr instance or a string convertable by ++ luci.ip.new(). ++
    • ++ ++
    • ++ inplace: If true, modify this instance instead of returning ++ a new derived CIDR instance. ++
    • ++ ++
    ++ ++ ++ ++ ++

    Usage:

    ++
    local addr = luci.ip.new("192.168.1.1/24") 
    ++print(addr:sub(256))         -- "192.168.0.1/24" 
    ++print(addr:sub("0.168.0.0")) -- "192.0.1.1/24" 
    ++ 
    ++addr:sub(256, true)          -- true 
    ++print(addr)                  -- "192.168.0.1/24 
    ++ 
    ++addr:sub("255.0.0.0", true)  -- false (underflow) 
    ++print(addr)                  -- "0.0.0.0/24 
    ++ 
    ++local addr6 = luci.ip.new("fe80::221:63f:fe75:aa17/64") 
    ++print(addr6:sub(256))        -- "fe80::221:63f:fe75:a917/64" 
    ++print(addr6:sub("::ffff:0")) -- "fe80::221:63e:fe76:aa17/64" 
    ++ 
    ++addr:sub(256, true)          -- true 
    ++print(addr)                  -- "fe80::221:63f:fe75:a917/64" 
    ++ 
    ++addr:sub("ffff::", true)     -- false (underflow) 
    ++print(addr)                  -- "::/64"
    ++ ++ ++ ++

    Return value:

    ++
      ++
    • When substracting inplace: Return true if the substraction ++ succeded or false when the substraction underflowed.
    • ++
    • When deriving new CIDR: Return new instance representing the value of ++ this instance minus the substracted amount or the lowest address if ++ the substraction underflowed.
    ++ ++ ++ ++
    ++ ++ ++ ++ ++
    cidr:minhost ()
    ++
    ++ ++ ++Calculate the lowest possible host address within this CIDR instance. ++ ++ ++ ++ ++ ++ ++

    Usage:

    ++
    local addr = luci.ip.new("192.168.123.56/24") 
    ++print(addr:minhost())  -- "192.168.123.1" 
    ++ 
    ++local addr6 = luci.ip.new("fd9b:62b3:9cc5:0:221:63ff:fe75:aa17/64") 
    ++print(addr6:minhost()) -- "fd9b:62b3:9cc5::1"
    ++ ++ ++ ++

    Return value:

    ++Returns a new CIDR instance representing the lowest host address ++ within this range. ++ ++ ++ ++
    ++ ++ ++ ++ ++
    cidr:maxhost ()
    ++
    ++ ++ ++Calculate the highest possible host address within this CIDR instance. ++ ++ ++ ++ ++ ++ ++

    Usage:

    ++
    local addr = luci.ip.new("192.168.123.56/24") 
    ++print(addr:maxhost())  -- "192.168.123.254" (.255 is broadcast) 
    ++ 
    ++local addr6 = luci.ip.new("fd9b:62b3:9cc5:0:221:63ff:fe75:aa17/64") 
    ++print(addr6:maxhost()) -- "fd9b:62b3:9cc5:0:ffff:ffff:ffff:ffff"
    ++ ++ ++ ++

    Return value:

    ++Returns a new CIDR instance representing the highest host address ++ within this range. ++ ++ ++ ++
    ++ ++ ++ ++ ++
    cidr:string ()
    ++
    ++ ++ ++Convert CIDR instance into string representation. ++ ++If the prefix size of instance is less than 32 for IPv4 or 128 for IPv6, the ++address is returned in the form "address/prefix" otherwise just "address". ++ ++It is usually not required to call this function directly as CIDR objects ++define it as __tostring function in the associated metatable. ++ ++ ++ ++ ++ ++ ++ ++ ++

    Return value:

    ++Returns a string representing the range or address of this CIDR instance ++ ++ ++ ++
    ++ ++ ++
    ++ ++ ++ ++ ++ ++
    ++ ++
    ++ ++
    ++

    Valid XHTML 1.0!

    ++
    ++ ++
    ++ ++ +diff --git a/feeds/luci/documentation/api/modules/luci.ip.html b/feeds/luci/documentation/api/modules/luci.ip.html +new file mode 100644 +index 0000000..549a553 +--- /dev/null ++++ b/feeds/luci/documentation/api/modules/luci.ip.html +@@ -0,0 +1,934 @@ ++ ++ ++ ++ Reference ++ ++ ++ ++ ++ ++
    ++ ++
    ++ ++
    ++
    ++
    ++ ++
    ++ ++ ++ ++
    ++ ++

    Class luci.ip

    ++ ++

    ++ LuCI IP calculation and netlink access library.

    ++ ++ ++ ++ ++ ++ ++ ++

    Functions

    ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
    new (address, netmask) ++ ++Construct a new luci.ip.cidr instance and autodetect the address family.
    IPv4 (address, netmask) ++ ++Construct a new IPv4 luci.ip.cidr instance.
    IPv6 (address, netmask) ++ ++Construct a new IPv6 luci.ip.cidr instance.
    route (address) ++ ++Determine the route leading to the given destination.
    routes (filter, callback) ++ ++Fetch all routes, optionally matching the given criteria.
    neighbors (filter, callback) ++ ++Fetches entries from the IPv4 ARP and IPv6 neighbour kernel table
    link (device) ++ ++Fetch basic device information
    ++ ++ ++ ++ ++ ++ ++
    ++
    ++ ++ ++

    Functions

    ++
    ++ ++ ++ ++
    new (address, netmask)
    ++
    ++ ++ ++Construct a new luci.ip.cidr instance and autodetect the address family. ++Throws an error if the given strings do not represent a valid address or ++if the given optional netmask is of a different family. ++ ++ ++

    Parameters

    ++
      ++ ++
    • ++ address: String containing a valid IPv4 or IPv6 address, optionally ++with prefix size (CIDR notation) or netmask separated by slash. ++
    • ++ ++
    • ++ netmask: String containing a valid IPv4 or IPv6 netmask or number ++containing a prefix size in bits (0..32 for IPv4, ++0..128 for IPv6). Overrides mask embedded in the first argument ++if specified. (optional) ++
    • ++ ++
    ++ ++ ++ ++ ++

    Usage:

    ++
    addr = luci.ip.new("10.24.0.1/24") 
    ++addr = luci.ip.new("10.24.0.1/255.255.255.0") 
    ++addr = luci.ip.new("10.24.0.1", "255.255.255.0")        -- separate netmask 
    ++addr = luci.ip.new("10.24.0.1/24", 16)                  -- override netmask 
    ++ 
    ++addr6 = luci.ip.new("fe80::221:63ff:fe75:aa17/64") 
    ++addr6 = luci.ip.new("fe80::221:63ff:fe75:aa17/ffff:ffff:ffff:ffff::") 
    ++addr6 = luci.ip.new("fe80::221:63ff:fe75:aa17", "ffff:ffff:ffff:ffff::") 
    ++addr6 = luci.ip.new("fe80::221:63ff:fe75:aa17/64", 128) -- override netmask
    ++ ++ ++ ++

    Return value:

    ++A luci.ip.cidr object representing the given ++address/mask range. ++ ++ ++ ++

    See also:

    ++ ++ ++
    ++ ++ ++ ++ ++
    IPv4 (address, netmask)
    ++
    ++ ++ ++Construct a new IPv4 luci.ip.cidr instance. ++Throws an error if the given string does not represent a valid IPv4 address or ++if the given optional netmask is of a different family. ++ ++ ++

    Parameters

    ++
      ++ ++
    • ++ address: String containing a valid IPv4, optionally with prefix size ++(CIDR notation) or netmask separated by slash. ++
    • ++ ++
    • ++ netmask: String containing a valid IPv4 netmask or number ++containing a prefix size between 0 and 32 bit. ++Overrides mask embedded in the first argument if specified. (optional) ++
    • ++ ++
    ++ ++ ++ ++ ++

    Usage:

    ++
    addr = luci.ip.IPv4("10.24.0.1/24") 
    ++addr = luci.ip.IPv4("10.24.0.1/255.255.255.0") 
    ++addr = luci.ip.IPv4("10.24.0.1", "255.255.255.0")        -- separate netmask 
    ++addr = luci.ip.IPv4("10.24.0.1/24", 16)                  -- override netmask
    ++ ++ ++ ++

    Return value:

    ++A luci.ip.cidr object representing the given IPv4 range. ++ ++ ++ ++

    See also:

    ++ ++ ++
    ++ ++ ++ ++ ++
    IPv6 (address, netmask)
    ++
    ++ ++ ++Construct a new IPv6 luci.ip.cidr instance. ++Throws an error if the given string does not represent a valid IPv6 address or ++if the given optional netmask is of a different family. ++ ++ ++

    Parameters

    ++
      ++ ++
    • ++ address: String containing a valid IPv6, optionally with prefix size ++(CIDR notation) or netmask separated by slash. ++
    • ++ ++
    • ++ netmask: String containing a valid IPv4 netmask or number ++containing a prefix size between 0 and 128 bit. ++Overrides mask embedded in the first argument if specified. (optional) ++
    • ++ ++
    ++ ++ ++ ++ ++

    Usage:

    ++
    addr6 = luci.ip.IPv6("fe80::221:63ff:fe75:aa17/64") 
    ++addr6 = luci.ip.IPv6("fe80::221:63ff:fe75:aa17/ffff:ffff:ffff:ffff::") 
    ++addr6 = luci.ip.IPv6("fe80::221:63ff:fe75:aa17", "ffff:ffff:ffff:ffff::") 
    ++addr6 = luci.ip.IPv6("fe80::221:63ff:fe75:aa17/64", 128) -- override netmask
    ++ ++ ++ ++

    Return value:

    ++A luci.ip.cidr object representing the given IPv6 range. ++ ++ ++ ++

    See also:

    ++ ++ ++
    ++ ++ ++ ++ ++
    route (address)
    ++
    ++ ++ ++Determine the route leading to the given destination. ++ ++ ++

    Parameters

    ++
      ++ ++
    • ++ address: A luci.ip.cidr instance or a string containing ++a valid IPv4 or IPv6 range as specified by luci.ip.new(). ++
    • ++ ++
    ++ ++ ++ ++ ++

    Usage:

    ++
      ++
    • Find default gateway by getting route to Google's public NS server ++
      rt = luci.ip.route("8.8.8.8") 
      ++if rt ~= nil then 
      ++	print("gateway is", rt.gw) 
      ++end
    • ++
    • Determine IPv6 upstream interface
      rt = luci.ip.route("2001::/7") 
      ++if rt ~= nil then 
      ++	print("ipv6 upstream device is", rt.dev) 
      ++end
    • ++
    ++ ++ ++ ++

    Return value:

    ++

    Table containing the fields described below.

    ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
    FieldDescription
    type ++

    Route type with one of the following numeric values:

    ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
    1RTN_UNICAST - Gateway or direct route
    2RTN_LOCAL - Accept locally
    3RTN_BROADCAST - ++ Accept locally as broadcast send as broadcast
    4RTN_ANYCAST - ++ Accept locally as broadcast but send as unicast
    5RTN_MULTICAST - Multicast route
    ++
    familyNumber containing the route family, 4 for IPv4 or ++ 6 for IPv6
    destDestination luci.ip.cidr instance
    gwGateway luci.ip.cidr instance (optional)
    fromSource address luci.ip.cidr instance (optional)
    srcPreferred source luci.ip.cidr instance (optional)
    devString containing the name of the outgoing interface
    iifString containing the name of the incoming interface (optional)
    tableNumber of the associated routing table (0..65535)
    protoNumber of the associated routing protocol
    scopeNumber describing the scope of the route, most commonly ++ 0 for global or 253 for on-link
    metricNumber describing the route metric (optional)
    expiresNumber of seconds the prefix is valid (IPv6 only, optional)
    errorRoute destination error code (optional)
    ++ ++ ++ ++

    See also:

    ++ ++ ++
    ++ ++ ++ ++ ++
    routes (filter, callback)
    ++
    ++ ++ ++Fetch all routes, optionally matching the given criteria. ++ ++ ++

    Parameters

    ++
      ++ ++
    • ++ filter:

      Table containing one or more of the possible filter ++critera described below (optional)

      ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
      FieldDescription
      family ++ Number describing the address family to return - 4 selects ++ IPv4 routes, 6 IPv6 ones. Any other value selects both. ++
      iif ++ String containing the incoming route interface to match. ++
      oif ++ String containing the outgoing route interface to match. ++
      type ++ Numeric type to match, e.g. 1 for unicast. ++
      scope ++ Numeric scope to match, e.g. 253 for onlink. ++
      proto ++ Numeric protocol to match, e.g. 2 for boot. ++
      table ++ Numeric routing table to match (0..65535). ++
      gw ++ String containing the gateway address to match. Can be in any notation ++ specified by luci.ip.new(). Prefix matching is performed when ++ comparing the routes, e.g. "192.168.1.0/24" would select routes with gateway ++ addresses 192.168.1.1 .. 192.168.1.255. ++
      dest ++ String containing the destination to match. Prefix matching is performed. ++
      from ++ String containing the source address to match. Prefix matching is performed. ++
      src ++ String containing the preferred source address to match. ++ Prefix matching is performed. ++
      dest_exact ++ String containing the destination to match. Exact matching is performed, ++ e.g. dest = "0.0.0.0/0" would match any IPv4 route ++ while dest_exact = "0.0.0.0/0" will only match the ++ default route. ++
      from_exact ++ String containing the source address to match. Exact matching is performed. ++
      ++
    • ++ ++
    • ++ callback:

      Callback function to invoke for each found route ++instead of returning one table of route objects (optional)

      ++
    • ++ ++
    ++ ++ ++ ++ ++

    Usage:

    ++
      ++
    • Find all IPv4 default routes: ++
      luci.ip.routes({ dest_exact = "0.0.0.0/0" }, function(rt) 
      ++	print(rt.type, rt.gw, rt.dev) 
      ++end)
    • ++
    • Find all global IPv6 prefixes on the current system: ++
      luci.ip.routes({ from = "2001::/7" }, function(rt) 
      ++	print(rt.from) 
      ++end)
    • ++
    • Fetch all IPv4 routes: ++
      routes = luci.ip.routes({ family = 4 }) 
      ++for _, rt in ipairs(routes) do 
      ++	print(rt.dest, rt.gw, rt.dev) 
      ++end
    • ++
    ++ ++ ++ ++

    Return value:

    ++If no callback function is provided, a table of routes ++as specified by luci.ip.route() ++is returned. If a callback function is given, it is invoked for each route ++and nothing is returned. ++ ++ ++ ++

    See also:

    ++ ++ ++
    ++ ++ ++ ++ ++
    neighbors (filter, callback)
    ++
    ++ ++ ++Fetches entries from the IPv4 ARP and IPv6 neighbour kernel table ++ ++ ++

    Parameters

    ++
      ++ ++
    • ++ filter:

      Table containing one or more of the possible filter ++critera described below (optional)

      ++ ++ ++ ++ ++ ++
      FieldDescription
      family ++ Number describing the address family to return - 4 selects ++ IPv4 ARP, 6 select IPv6 neighbour entries. Any other value ++ selects both. ++
      dev ++ String containing the associated interface to match. ++
      dest ++ String containing the associated address to match. Can be in any notation ++ specified by luci.ip.new(). Prefix matching is performed when ++ comparing the addresses, e.g. "192.168.1.0/24" would select ARP entries ++ for 192.168.1.1 .. 192.168.1.255. ++
      mac ++ String containing MAC address to match. ++
      ++
    • ++ ++
    • ++ callback:

      Callback function to invoke for each found neighbour ++entry instead of returning one table of neighbour entries (optional)

      ++
    • ++ ++
    ++ ++ ++ ++ ++

    Usage:

    ++
      ++
    • Find all ARP neighbours in the LAN: ++
      luci.ip.neighbors({ dest = "192.168.0.0/16" }, function(n) 
      ++	print(n.dest, n.mac) 
      ++end)
    • ++
    • Find all active IPv6 addresses of host with given MAC: ++
      luci.ip.neighbors({ family = 6, mac = "00:21:63:75:aa:17" }, 
      ++	function(n) 
      ++		print(n.dest) 
      ++	end)
    • ++
    ++ ++ ++ ++

    Return value:

    ++If no callback function is provided, a table of neighbour entries ++is returned. If a callback function is given, it is invoked for each entry ++and nothing is returned. ++ ++A neighbour entry is a table containing the following fields: ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
    FieldDescription
    familyNumber containing the neighbour entry family, 4 for IPv4 ++ ARP or 6 for IPv6 NDP
    devString containing the associated device of the neighbour entry
    destIP address luci.ip.cidr instance
    macString containing the associated MAC address
    routerBoolean "true" if the neighbour entry is a router (IPv6, optional)
    proxyBoolean "true" if this is a proxy entry (optional)
    incompleteBoolean "true" if the entry is in incomplete state (optional)
    reachableBoolean "true" if the entry is in reachable state (optional)
    staleBoolean "true" if the entry is stale (optional)
    delayBoolean "true" if the entry is delayed (optional)
    probeBoolean "true" if the entry is in probe state (optional)
    failedBoolean "true" if the entry is in failed state (optional)
    noarpBoolean "true" if the entry is not caused by NDP or ++ ARP (optional)
    permanentBoolean "true" if the entry was statically configured from ++ userspace (optional)
    ++ ++ ++ ++
    ++ ++ ++ ++ ++
    link (device)
    ++
    ++ ++ ++Fetch basic device information ++ ++ ++

    Parameters

    ++
      ++ ++
    • ++ device: String containing the network device to query ++
    • ++ ++
    ++ ++ ++ ++ ++

    Usage:

    ++
      ++
    • Test whether device br-lan exists: ++
      print(luci.ip.link("br-lan").name ~= nil) 
      ++
    • ++
    • Query MAC address of eth0: ++
      print(luci.ip.link("eth0").mac) 
      ++
    • ++
    ++ ++ ++ ++

    Return value:

    ++If the given interface is found, a table containing the fields ++described below is returned, else an empty table. ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
    FieldDescription
    upBoolean indicating whether the device is in IFF_RUNNING state
    typeNumeric value indicating the type of the device, e.g. 1 ++ for ethernet.
    nameString containing the name of the device
    masterIf queried device is a bridge port, string containing the name of ++ parent bridge device (optional)
    mtuNumber containing the current MTU of the device
    qlenNumber containing the TX queue length of the device
    macString containing the link local address of the device in ++ dotted hex notation
    ++ ++ ++ ++
    ++ ++ ++
    ++ ++ ++ ++ ++ ++
    ++ ++
    ++ ++
    ++

    Valid XHTML 1.0!

    ++
    ++ ++
    ++ ++ +diff --git a/feeds/luci/documentation/api/modules/luci.json.html b/feeds/luci/documentation/api/modules/luci.json.html +new file mode 100644 +index 0000000..761bd6e +--- /dev/null ++++ b/feeds/luci/documentation/api/modules/luci.json.html +@@ -0,0 +1,598 @@ ++ ++ ++ ++ Reference ++ ++ ++ ++ ++ ++
    ++ ++
    ++ ++
    ++
    ++
    ++ ++
    ++ ++ ++ ++
    ++ ++

    Object Instance luci.json

    ++ ++

    ++ ++ ++ ++ ++ ++ ++ ++

    Functions

    ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
    ActiveDecoder (customnull) ++ ++Create a new Active JSON-Decoder.
    ActiveDecoder:get () ++ ++Fetches one JSON-object from given source ++
    Decoder (customnull) ++ ++Create a new JSON-Decoder.
    Decoder:get () ++ ++Get the decoded data packets after the rawdata has been sent to the sink.
    Decoder:sink () ++ ++Create an LTN12 sink from the decoder object which accepts the JSON-Data.
    Encoder (data, buffersize, fastescape) ++ ++Create a new JSON-Encoder.
    Encoder:source () ++ ++Create an LTN12 source providing the encoded JSON-Data.
    decode (json) ++ ++Directly decode a JSON string ++
    encode (obj) ++ ++Direcly encode a Lua object into a JSON string.
    null () ++ ++Null replacement function ++
    ++ ++ ++ ++ ++ ++ ++
    ++
    ++ ++ ++

    Functions

    ++
    ++ ++ ++ ++
    ActiveDecoder (customnull)
    ++
    ++ ++ ++Create a new Active JSON-Decoder. ++ ++ ++ ++

    Parameters

    ++
      ++ ++
    • ++ customnull: Use luci.json.null instead of nil for decoding null ++
    • ++ ++
    ++ ++ ++ ++ ++ ++ ++

    Return value:

    ++Active JSON-Decoder ++ ++ ++ ++
    ++ ++ ++ ++ ++
    ActiveDecoder:get ()
    ++
    ++ ++ ++Fetches one JSON-object from given source ++ ++ ++ ++ ++ ++ ++ ++ ++

    Return value:

    ++Decoded object ++ ++ ++ ++
    ++ ++ ++ ++ ++
    Decoder (customnull)
    ++
    ++ ++ ++Create a new JSON-Decoder. ++ ++ ++ ++

    Parameters

    ++
      ++ ++
    • ++ customnull: Use luci.json.null instead of nil for decoding null ++
    • ++ ++
    ++ ++ ++ ++ ++ ++ ++

    Return value:

    ++JSON-Decoder ++ ++ ++ ++
    ++ ++ ++ ++ ++
    Decoder:get ()
    ++
    ++ ++ ++Get the decoded data packets after the rawdata has been sent to the sink. ++ ++ ++ ++ ++ ++ ++ ++ ++

    Return value:

    ++Decoded data ++ ++ ++ ++
    ++ ++ ++ ++ ++
    Decoder:sink ()
    ++
    ++ ++ ++Create an LTN12 sink from the decoder object which accepts the JSON-Data. ++ ++ ++ ++ ++ ++ ++ ++ ++

    Return value:

    ++LTN12 sink ++ ++ ++ ++
    ++ ++ ++ ++ ++
    Encoder (data, buffersize, fastescape)
    ++
    ++ ++ ++Create a new JSON-Encoder. ++ ++ ++ ++

    Parameters

    ++
      ++ ++
    • ++ data: Lua-Object to be encoded. ++
    • ++ ++
    • ++ buffersize: Blocksize of returned data source. ++
    • ++ ++
    • ++ fastescape: Use non-standard escaping (don't escape control chars) ++
    • ++ ++
    ++ ++ ++ ++ ++ ++ ++

    Return value:

    ++JSON-Encoder ++ ++ ++ ++
    ++ ++ ++ ++ ++
    Encoder:source ()
    ++
    ++ ++ ++Create an LTN12 source providing the encoded JSON-Data. ++ ++ ++ ++ ++ ++ ++ ++ ++

    Return value:

    ++LTN12 source ++ ++ ++ ++
    ++ ++ ++ ++ ++
    decode (json)
    ++
    ++ ++ ++Directly decode a JSON string ++ ++ ++ ++

    Parameters

    ++
      ++ ++
    • ++ json: JSON-String ++
    • ++ ++
    ++ ++ ++ ++ ++ ++ ++

    Return value:

    ++Lua object ++ ++ ++ ++
    ++ ++ ++ ++ ++
    encode (obj)
    ++
    ++ ++ ++Direcly encode a Lua object into a JSON string. ++ ++ ++ ++

    Parameters

    ++
      ++ ++
    • ++ obj: Lua Object ++
    • ++ ++
    ++ ++ ++ ++ ++ ++ ++

    Return value:

    ++JSON string ++ ++ ++ ++
    ++ ++ ++ ++ ++
    null ()
    ++
    ++ ++ ++Null replacement function ++ ++ ++ ++ ++ ++ ++ ++ ++

    Return value:

    ++null ++ ++ ++ ++
    ++ ++ ++
    ++ ++ ++ ++ ++ ++
    ++ ++
    ++ ++
    ++

    Valid XHTML 1.0!

    ++
    ++ ++
    ++ ++ +diff --git a/feeds/luci/documentation/api/modules/luci.jsonc.html b/feeds/luci/documentation/api/modules/luci.jsonc.html +new file mode 100644 +index 0000000..f82eb40 +--- /dev/null ++++ b/feeds/luci/documentation/api/modules/luci.jsonc.html +@@ -0,0 +1,397 @@ ++ ++ ++ ++ Reference ++ ++ ++ ++ ++ ++
    ++ ++
    ++ ++
    ++
    ++
    ++ ++
    ++ ++ ++ ++
    ++ ++

    Class luci.jsonc

    ++ ++

    ++ LuCI JSON parsing and serialization library. ++ The luci.jsonc class is a high level Lua binding to the JSON-C library to ++ allow reading and writing JSON data with minimal overhead.

    ++ ++ ++ ++ ++ ++ ++ ++

    Functions

    ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
    new () ++ ++Construct a new luci.jsonc.parser instance.
    parse (json) ++ ++Parse a complete JSON string and convert it into a Lua data structure.
    stringify (data, pretty) ++ ++Convert given Lua data into a JSON string.
    ++ ++ ++ ++ ++ ++ ++
    ++
    ++ ++ ++

    Functions

    ++
    ++ ++ ++ ++
    new ()
    ++
    ++ ++ ++Construct a new luci.jsonc.parser instance. ++ ++ ++ ++ ++ ++

    Usage:

    ++parser = luci.jsonc.new() ++ ++ ++ ++

    Return value:

    ++A luci.jsonc.parser object representing a JSON-C tokener. ++ ++ ++ ++
    ++ ++ ++ ++ ++
    parse (json)
    ++
    ++ ++ ++Parse a complete JSON string and convert it into a Lua data structure. ++ ++ ++

    Parameters

    ++
      ++ ++
    • ++ json: A string containing the JSON data to parse, must be either a ++ JSON array or a JSON object. ++
    • ++ ++
    ++ ++ ++ ++ ++

    Usage:

    ++
    data = luci.jsonc.parse('{ "name": "John", "age": 34 }') 
    ++print(data.name)  -- "John"
    ++ ++ ++ ++

    Return value:

    ++On success, a table containing the parsed JSON data is returned, on ++ failure the function returns nil and a string containing the reason of ++ the parse error. ++ ++ ++ ++

    See also:

    ++ ++ ++
    ++ ++ ++ ++ ++
    stringify (data, pretty)
    ++
    ++ ++ ++Convert given Lua data into a JSON string. ++ ++This function recursively converts the given Lua data into a JSON string, ++ignoring any unsupported data. Lua tables are converted into JSON arrays if they ++only contain integer keys, mixed tables are turned into JSON objects with any ++existing numeric keys converted into strings. ++ ++Lua functions, coroutines and userdata objects are ignored and Lua numbers are ++converted to integers if they do not contain fractional values. ++ ++ ++ ++

    Parameters

    ++
      ++ ++
    • ++ data: The Lua data to convert, can be a table, string, boolean or number. ++
    • ++ ++
    • ++ pretty: A boolean value indicating whether the resulting JSON should be ++ pretty printed. ++
    • ++ ++
    ++ ++ ++ ++ ++

    Usage:

    ++
    json = luci.jsonc.stringify({ item = true, values = { 1, 2, 3 } }) 
    ++print(json)  -- '{"item":true,"values":[1,2,3]}'
    ++ ++ ++ ++

    Return value:

    ++Returns a string containing the JSON representation of the given Lua ++ data. ++ ++ ++ ++

    See also:

    ++ ++ ++
    ++ ++ ++
    ++ ++ ++ ++ ++ ++
    ++ ++
    ++ ++
    ++

    Valid XHTML 1.0!

    ++
    ++ ++
    ++ ++ +diff --git a/feeds/luci/documentation/api/modules/luci.jsonc.parser.html b/feeds/luci/documentation/api/modules/luci.jsonc.parser.html +new file mode 100644 +index 0000000..4c19cf0 +--- /dev/null ++++ b/feeds/luci/documentation/api/modules/luci.jsonc.parser.html +@@ -0,0 +1,460 @@ ++ ++ ++ ++ Reference ++ ++ ++ ++ ++ ++
    ++ ++
    ++ ++
    ++
    ++
    ++ ++
    ++ ++ ++ ++
    ++ ++

    Object Instance luci.jsonc.parser

    ++ ++

    ++ LuCI JSON parser instance. ++ A JSON parser instance is useful to parse JSON data chunk by chunk, without ++ the need to assemble all data in advance.

    ++ ++ ++ ++ ++ ++ ++ ++

    Functions

    ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
    parser:parse (json) ++ ++Parses one chunk of JSON data.
    parser:get () ++ ++Convert parsed JSON data into Lua table.
    parser:set (data) ++ ++Put Lua data into the parser.
    parser:stringify (pretty) ++ ++Serialize current parser state as JSON.
    ++ ++ ++ ++ ++ ++ ++
    ++
    ++ ++ ++

    Functions

    ++
    ++ ++ ++ ++
    parser:parse (json)
    ++
    ++ ++ ++Parses one chunk of JSON data. ++ ++ ++ ++

    Parameters

    ++
      ++ ++
    • ++ json: String containing the JSON fragment to parse ++
    • ++ ++
    ++ ++ ++ ++ ++

    Usage:

    ++
    parser = luci.jsonc.new() 
    ++ 
    ++while true do 
    ++	chunk = ...  -- fetch a cunk of data, e.g. from a socket 
    ++	finish, errmsg = parser.parse(chunk) 
    ++ 
    ++	if finish == nil then 
    ++		error("Cannot parse JSON: " .. errmsg) 
    ++	end 
    ++ 
    ++	if finish == true then 
    ++		break 
    ++	end 
    ++end
    ++ ++ ++ ++

    Return value:

    ++
      ++
    • true if a complete JSON object has been parsed and no further input is ++ expected.
    • ++
    • false if further input is required
    • ++
    • nil if an error was encountered while parsing the current chunk. ++ In this case a string describing the parse error is returned as second ++ value.
    ++ ++ ++ ++

    See also:

    ++ ++ ++
    ++ ++ ++ ++ ++
    parser:get ()
    ++
    ++ ++ ++Convert parsed JSON data into Lua table. ++ ++ ++ ++ ++ ++ ++

    Usage:

    ++
    parser = luci.jsonc.new() 
    ++parser:parse('{ "example": "test" }') 
    ++ 
    ++data = parser:get() 
    ++print(data.example)  -- "test"
    ++ ++ ++ ++

    Return value:

    ++Parsed JSON object converted into a Lua table or nil if the parser ++ didn't finish or encountered an error. ++ ++ ++ ++

    See also:

    ++ ++ ++
    ++ ++ ++ ++ ++
    parser:set (data)
    ++
    ++ ++ ++Put Lua data into the parser. ++ ++ ++ ++

    Parameters

    ++
      ++ ++
    • ++ data: Lua data to put into the parser object. The data is converted to an ++ internal JSON representation that can be dumped with stringify(). ++ The conversion follows the rules described in luci.jsonc.stringify. ++
    • ++ ++
    ++ ++ ++ ++ ++

    Usage:

    ++
    parser = luci.jsonc.new() 
    ++parser:set({ "some", "data" })
    ++ ++ ++ ++

    Return value:

    ++Nothing is returned. ++ ++ ++ ++

    See also:

    ++ ++ ++
    ++ ++ ++ ++ ++
    parser:stringify (pretty)
    ++
    ++ ++ ++Serialize current parser state as JSON. ++ ++ ++ ++

    Parameters

    ++
      ++ ++
    • ++ pretty: A boolean value indicating whether the resulting JSON should be pretty printed. ++
    • ++ ++
    ++ ++ ++ ++ ++

    Usage:

    ++
    parser = luci.jsonc.new() 
    ++parser:parse('{ "example": "test" }') 
    ++print(parser:serialize())  -- '{"example":"test"}'
    ++ ++ ++ ++

    Return value:

    ++Returns the serialized JSON data of this parser instance. ++ ++ ++ ++
    ++ ++ ++
    ++ ++ ++ ++ ++ ++
    ++ ++
    ++ ++
    ++

    Valid XHTML 1.0!

    ++
    ++ ++
    ++ ++ +diff --git a/feeds/luci/documentation/api/modules/luci.model.ipkg.html b/feeds/luci/documentation/api/modules/luci.model.ipkg.html +new file mode 100644 +index 0000000..921153c +--- /dev/null ++++ b/feeds/luci/documentation/api/modules/luci.model.ipkg.html +@@ -0,0 +1,734 @@ ++ ++ ++ ++ Reference ++ ++ ++ ++ ++ ++
    ++ ++
    ++ ++
    ++
    ++
    ++ ++
    ++ ++ ++ ++
    ++ ++

    Class luci.model.ipkg

    ++ ++

    ++ ++ ++ ++ ++ ++ ++ ++

    Functions

    ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
    compare_versions (ver1, ver2, comp) ++ ++lua version of opkg compare-versions ++
    find (pat, cb) ++ ++Find packages that match the given pattern.
    info (pkg) ++ ++Return information about installed and available packages.
    install (...) ++ ++Install one or more packages.
    installed (pkg) ++ ++Determine whether a given package is installed.
    list_all (pat, cb) ++ ++List all packages known to opkg.
    list_installed (pat, cb) ++ ++List installed packages.
    overlay_root () ++ ++Determines the overlay root used by opkg.
    remove (...) ++ ++Remove one or more packages.
    status (pkg) ++ ++Return the package status of one or more packages.
    update () ++ ++Update package lists.
    upgrade () ++ ++Upgrades all installed packages.
    ++ ++ ++ ++ ++ ++ ++
    ++
    ++ ++ ++

    Functions

    ++
    ++ ++ ++ ++
    compare_versions (ver1, ver2, comp)
    ++
    ++ ++ ++lua version of opkg compare-versions ++ ++ ++ ++

    Parameters

    ++
      ++ ++
    • ++ ver1: string version 1 ++
    • ++ ++
    • ++ ver2: string version 2 ++
    • ++ ++
    • ++ comp: string compare versions using ++ "<=" or "<" lower-equal ++ ">" or ">=" greater-equal ++ "=" equal ++ "<<" lower ++ ">>" greater ++ "~=" not equal ++
    • ++ ++
    ++ ++ ++ ++ ++ ++ ++

    Return value:

    ++Boolean indicating the status of the compare ++ ++ ++ ++
    ++ ++ ++ ++ ++
    find (pat, cb)
    ++
    ++ ++ ++Find packages that match the given pattern. ++ ++ ++ ++

    Parameters

    ++
      ++ ++
    • ++ pat: Find packages whose names or descriptions match this pattern, nil results in zero results ++
    • ++ ++
    • ++ cb: Callback function invoked for each patckage, receives name, version and description as arguments ++
    • ++ ++
    ++ ++ ++ ++ ++ ++ ++

    Return value:

    ++nothing ++ ++ ++ ++
    ++ ++ ++ ++ ++
    info (pkg)
    ++
    ++ ++ ++Return information about installed and available packages. ++ ++ ++ ++

    Parameters

    ++
      ++ ++
    • ++ pkg: Limit output to a (set of) packages ++
    • ++ ++
    ++ ++ ++ ++ ++ ++ ++

    Return value:

    ++Table containing package information ++ ++ ++ ++
    ++ ++ ++ ++ ++
    install (...)
    ++
    ++ ++ ++Install one or more packages. ++ ++ ++ ++

    Parameters

    ++
      ++ ++
    • ++ ...: List of packages to install ++
    • ++ ++
    ++ ++ ++ ++ ++ ++ ++

    Return values:

    ++
      ++ ++
    1. Boolean indicating the status of the action ++ ++
    2. OPKG return code, STDOUT and STDERR ++ ++
    ++ ++ ++ ++
    ++ ++ ++ ++ ++
    installed (pkg)
    ++
    ++ ++ ++Determine whether a given package is installed. ++ ++ ++ ++

    Parameters

    ++
      ++ ++
    • ++ pkg: Package ++
    • ++ ++
    ++ ++ ++ ++ ++ ++ ++

    Return value:

    ++Boolean ++ ++ ++ ++
    ++ ++ ++ ++ ++
    list_all (pat, cb)
    ++
    ++ ++ ++List all packages known to opkg. ++ ++ ++ ++

    Parameters

    ++
      ++ ++
    • ++ pat: Only find packages matching this pattern, nil lists all packages ++
    • ++ ++
    • ++ cb: Callback function invoked for each package, receives name, version and description as arguments ++
    • ++ ++
    ++ ++ ++ ++ ++ ++ ++

    Return value:

    ++nothing ++ ++ ++ ++
    ++ ++ ++ ++ ++
    list_installed (pat, cb)
    ++
    ++ ++ ++List installed packages. ++ ++ ++ ++

    Parameters

    ++
      ++ ++
    • ++ pat: Only find packages matching this pattern, nil lists all packages ++
    • ++ ++
    • ++ cb: Callback function invoked for each package, receives name, version and description as arguments ++
    • ++ ++
    ++ ++ ++ ++ ++ ++ ++

    Return value:

    ++nothing ++ ++ ++ ++
    ++ ++ ++ ++ ++
    overlay_root ()
    ++
    ++ ++ ++Determines the overlay root used by opkg. ++ ++ ++ ++ ++ ++ ++ ++ ++

    Return value:

    ++String containing the directory path of the overlay root. ++ ++ ++ ++
    ++ ++ ++ ++ ++
    remove (...)
    ++
    ++ ++ ++Remove one or more packages. ++ ++ ++ ++

    Parameters

    ++
      ++ ++
    • ++ ...: List of packages to install ++
    • ++ ++
    ++ ++ ++ ++ ++ ++ ++

    Return values:

    ++
      ++ ++
    1. Boolean indicating the status of the action ++ ++
    2. OPKG return code, STDOUT and STDERR ++ ++
    ++ ++ ++ ++
    ++ ++ ++ ++ ++
    status (pkg)
    ++
    ++ ++ ++Return the package status of one or more packages. ++ ++ ++ ++

    Parameters

    ++
      ++ ++
    • ++ pkg: Limit output to a (set of) packages ++
    • ++ ++
    ++ ++ ++ ++ ++ ++ ++

    Return value:

    ++Table containing package status information ++ ++ ++ ++
    ++ ++ ++ ++ ++
    update ()
    ++
    ++ ++ ++Update package lists. ++ ++ ++ ++ ++ ++ ++ ++ ++

    Return values:

    ++
      ++ ++
    1. Boolean indicating the status of the action ++ ++
    2. OPKG return code, STDOUT and STDERR ++ ++
    ++ ++ ++ ++
    ++ ++ ++ ++ ++
    upgrade ()
    ++
    ++ ++ ++Upgrades all installed packages. ++ ++ ++ ++ ++ ++ ++ ++ ++

    Return values:

    ++
      ++ ++
    1. Boolean indicating the status of the action ++ ++
    2. OPKG return code, STDOUT and STDERR ++ ++
    ++ ++ ++ ++
    ++ ++ ++
    ++ ++ ++ ++ ++ ++
    ++ ++
    ++ ++
    ++

    Valid XHTML 1.0!

    ++
    ++ ++
    ++ ++ +diff --git a/feeds/luci/documentation/api/modules/luci.model.uci.html b/feeds/luci/documentation/api/modules/luci.model.uci.html +new file mode 100644 +index 0000000..9e50d99 +--- /dev/null ++++ b/feeds/luci/documentation/api/modules/luci.model.uci.html +@@ -0,0 +1,1436 @@ ++ ++ ++ ++ Reference ++ ++ ++ ++ ++ ++
    ++ ++
    ++ ++
    ++
    ++
    ++ ++
    ++ ++ ++ ++
    ++ ++

    Object Instance luci.model.uci

    ++ ++

    ++ ++ ++ ++ ++ ++ ++ ++

    Functions

    ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
    Cursor:add (config, type) ++ ++Add an anonymous section.
    Cursor:apply (configlist, command) ++ ++Applies UCI configuration changes ++
    Cursor:changes (config) ++ ++Get a table of saved but uncommitted changes.
    Cursor:commit (config) ++ ++Commit saved changes.
    Cursor:delete (config, section, option) ++ ++Deletes a section or an option.
    Cursor:delete_all (config, type, comparator) ++ ++Delete all sections of a given type that match certain criteria.
    Cursor:foreach (config, type, callback) ++ ++Call a function for every section of a certain type.
    Cursor:get (config, section, option) ++ ++Get a section type or an option ++
    Cursor:get_all (config, section) ++ ++Get all sections of a config or all values of a section.
    Cursor:get_bool (config, section, option) ++ ++Get a boolean option and return it's value as true or false.
    Cursor:get_confdir () ++ ++Get the configuration directory.
    Cursor:get_first (config, type, option, default) ++ ++Get the given option from the first section with the given type.
    Cursor:get_list (config, section, option) ++ ++Get an option or list and return values as table.
    Cursor:get_savedir () ++ ++Get the directory for uncomitted changes.
    Cursor:load (config) ++ ++Manually load a config.
    Cursor:revert (config) ++ ++Revert saved but uncommitted changes.
    Cursor:save (config) ++ ++Saves changes made to a config to make them committable.
    Cursor:section (config, type, name, values) ++ ++Create a new section and initialize it with data.
    Cursor:set (config, section, option, value) ++ ++Set a value or create a named section.
    Cursor:set_confdir (directory) ++ ++Set the configuration directory.
    Cursor:set_list (config, section, option, value) ++ ++Set given values as list.
    Cursor:set_savedir (directory) ++ ++Set the directory for uncommited changes.
    Cursor:substate () ++ ++Create a sub-state of this cursor.
    Cursor:tset (config, section, values) ++ ++Updated the data of a section using data from a table.
    Cursor:unload (config) ++ ++Discard changes made to a config.
    cursor () ++ ++Create a new UCI-Cursor.
    cursor_state () ++ ++Create a new Cursor initialized to the state directory.
    ++ ++ ++ ++ ++ ++ ++
    ++
    ++ ++ ++

    Functions

    ++
    ++ ++ ++ ++
    Cursor:add (config, type)
    ++
    ++ ++ ++Add an anonymous section. ++ ++ ++ ++

    Parameters

    ++
      ++ ++
    • ++ config: UCI config ++
    • ++ ++
    • ++ type: UCI section type ++
    • ++ ++
    ++ ++ ++ ++ ++ ++ ++

    Return value:

    ++Name of created section ++ ++ ++ ++
    ++ ++ ++ ++ ++
    Cursor:apply (configlist, command)
    ++
    ++ ++ ++Applies UCI configuration changes ++ ++ ++ ++

    Parameters

    ++
      ++ ++
    • ++ configlist: List of UCI configurations ++
    • ++ ++
    • ++ command: Don't apply only return the command ++
    • ++ ++
    ++ ++ ++ ++ ++ ++ ++ ++ ++
    ++ ++ ++ ++ ++
    Cursor:changes (config)
    ++
    ++ ++ ++Get a table of saved but uncommitted changes. ++ ++ ++ ++

    Parameters

    ++
      ++ ++
    • ++ config: UCI config ++
    • ++ ++
    ++ ++ ++ ++ ++ ++ ++

    Return value:

    ++Table of changes ++ ++ ++ ++

    See also:

    ++ ++ ++
    ++ ++ ++ ++ ++
    Cursor:commit (config)
    ++
    ++ ++ ++Commit saved changes. ++ ++ ++ ++

    Parameters

    ++
      ++ ++
    • ++ config: UCI config ++
    • ++ ++
    ++ ++ ++ ++ ++ ++ ++

    Return value:

    ++Boolean whether operation succeeded ++ ++ ++ ++

    See also:

    ++ ++ ++
    ++ ++ ++ ++ ++
    Cursor:delete (config, section, option)
    ++
    ++ ++ ++Deletes a section or an option. ++ ++ ++ ++

    Parameters

    ++
      ++ ++
    • ++ config: UCI config ++
    • ++ ++
    • ++ section: UCI section name ++
    • ++ ++
    • ++ option: UCI option (optional) ++
    • ++ ++
    ++ ++ ++ ++ ++ ++ ++

    Return value:

    ++Boolean whether operation succeeded ++ ++ ++ ++
    ++ ++ ++ ++ ++
    Cursor:delete_all (config, type, comparator)
    ++
    ++ ++ ++Delete all sections of a given type that match certain criteria. ++ ++ ++ ++

    Parameters

    ++
      ++ ++
    • ++ config: UCI config ++
    • ++ ++
    • ++ type: UCI section type ++
    • ++ ++
    • ++ comparator: Function that will be called for each section and ++returns a boolean whether to delete the current section (optional) ++
    • ++ ++
    ++ ++ ++ ++ ++ ++ ++ ++ ++
    ++ ++ ++ ++ ++
    Cursor:foreach (config, type, callback)
    ++
    ++ ++ ++Call a function for every section of a certain type. ++ ++ ++ ++

    Parameters

    ++
      ++ ++
    • ++ config: UCI config ++
    • ++ ++
    • ++ type: UCI section type ++
    • ++ ++
    • ++ callback: Function to be called ++
    • ++ ++
    ++ ++ ++ ++ ++ ++ ++

    Return value:

    ++Boolean whether operation succeeded ++ ++ ++ ++
    ++ ++ ++ ++ ++
    Cursor:get (config, section, option)
    ++
    ++ ++ ++Get a section type or an option ++ ++ ++ ++

    Parameters

    ++
      ++ ++
    • ++ config: UCI config ++
    • ++ ++
    • ++ section: UCI section name ++
    • ++ ++
    • ++ option: UCI option (optional) ++
    • ++ ++
    ++ ++ ++ ++ ++ ++ ++

    Return value:

    ++UCI value ++ ++ ++ ++
    ++ ++ ++ ++ ++
    Cursor:get_all (config, section)
    ++
    ++ ++ ++Get all sections of a config or all values of a section. ++ ++ ++ ++

    Parameters

    ++
      ++ ++
    • ++ config: UCI config ++
    • ++ ++
    • ++ section: UCI section name (optional) ++
    • ++ ++
    ++ ++ ++ ++ ++ ++ ++

    Return value:

    ++Table of UCI sections or table of UCI values ++ ++ ++ ++
    ++ ++ ++ ++ ++
    Cursor:get_bool (config, section, option)
    ++
    ++ ++ ++Get a boolean option and return it's value as true or false. ++ ++ ++ ++

    Parameters

    ++
      ++ ++
    • ++ config: UCI config ++
    • ++ ++
    • ++ section: UCI section name ++
    • ++ ++
    • ++ option: UCI option ++
    • ++ ++
    ++ ++ ++ ++ ++ ++ ++

    Return value:

    ++Boolean ++ ++ ++ ++
    ++ ++ ++ ++ ++
    Cursor:get_confdir ()
    ++
    ++ ++ ++Get the configuration directory. ++ ++ ++ ++ ++ ++ ++ ++ ++

    Return value:

    ++Configuration directory ++ ++ ++ ++
    ++ ++ ++ ++ ++
    Cursor:get_first (config, type, option, default)
    ++
    ++ ++ ++Get the given option from the first section with the given type. ++ ++ ++ ++

    Parameters

    ++
      ++ ++
    • ++ config: UCI config ++
    • ++ ++
    • ++ type: UCI section type ++
    • ++ ++
    • ++ option: UCI option (optional) ++
    • ++ ++
    • ++ default: Default value (optional) ++
    • ++ ++
    ++ ++ ++ ++ ++ ++ ++

    Return value:

    ++UCI value ++ ++ ++ ++
    ++ ++ ++ ++ ++
    Cursor:get_list (config, section, option)
    ++
    ++ ++ ++Get an option or list and return values as table. ++ ++ ++ ++

    Parameters

    ++
      ++ ++
    • ++ config: UCI config ++
    • ++ ++
    • ++ section: UCI section name ++
    • ++ ++
    • ++ option: UCI option ++
    • ++ ++
    ++ ++ ++ ++ ++ ++ ++

    Return value:

    ++UCI value ++ ++ ++ ++
    ++ ++ ++ ++ ++
    Cursor:get_savedir ()
    ++
    ++ ++ ++Get the directory for uncomitted changes. ++ ++ ++ ++ ++ ++ ++ ++ ++

    Return value:

    ++Save directory ++ ++ ++ ++
    ++ ++ ++ ++ ++
    Cursor:load (config)
    ++
    ++ ++ ++Manually load a config. ++ ++ ++ ++

    Parameters

    ++
      ++ ++
    • ++ config: UCI config ++
    • ++ ++
    ++ ++ ++ ++ ++ ++ ++

    Return value:

    ++Boolean whether operation succeeded ++ ++ ++ ++

    See also:

    ++ ++ ++
    ++ ++ ++ ++ ++
    Cursor:revert (config)
    ++
    ++ ++ ++Revert saved but uncommitted changes. ++ ++ ++ ++

    Parameters

    ++
      ++ ++
    • ++ config: UCI config ++
    • ++ ++
    ++ ++ ++ ++ ++ ++ ++

    Return value:

    ++Boolean whether operation succeeded ++ ++ ++ ++

    See also:

    ++ ++ ++
    ++ ++ ++ ++ ++
    Cursor:save (config)
    ++
    ++ ++ ++Saves changes made to a config to make them committable. ++ ++ ++ ++

    Parameters

    ++
      ++ ++
    • ++ config: UCI config ++
    • ++ ++
    ++ ++ ++ ++ ++ ++ ++

    Return value:

    ++Boolean whether operation succeeded ++ ++ ++ ++

    See also:

    ++ ++ ++
    ++ ++ ++ ++ ++
    Cursor:section (config, type, name, values)
    ++
    ++ ++ ++Create a new section and initialize it with data. ++ ++ ++ ++

    Parameters

    ++
      ++ ++
    • ++ config: UCI config ++
    • ++ ++
    • ++ type: UCI section type ++
    • ++ ++
    • ++ name: UCI section name (optional) ++
    • ++ ++
    • ++ values: Table of key - value pairs to initialize the section with ++
    • ++ ++
    ++ ++ ++ ++ ++ ++ ++

    Return value:

    ++Name of created section ++ ++ ++ ++
    ++ ++ ++ ++ ++
    Cursor:set (config, section, option, value)
    ++
    ++ ++ ++Set a value or create a named section. ++ ++ ++ ++

    Parameters

    ++
      ++ ++
    • ++ config: UCI config ++
    • ++ ++
    • ++ section: UCI section name ++
    • ++ ++
    • ++ option: UCI option or UCI section type ++
    • ++ ++
    • ++ value: UCI value or nil if you want to create a section ++
    • ++ ++
    ++ ++ ++ ++ ++ ++ ++

    Return value:

    ++Boolean whether operation succeeded ++ ++ ++ ++
    ++ ++ ++ ++ ++
    Cursor:set_confdir (directory)
    ++
    ++ ++ ++Set the configuration directory. ++ ++ ++ ++

    Parameters

    ++
      ++ ++
    • ++ directory: UCI configuration directory ++
    • ++ ++
    ++ ++ ++ ++ ++ ++ ++

    Return value:

    ++Boolean whether operation succeeded ++ ++ ++ ++
    ++ ++ ++ ++ ++
    Cursor:set_list (config, section, option, value)
    ++
    ++ ++ ++Set given values as list. ++ ++ ++ ++

    Parameters

    ++
      ++ ++
    • ++ config: UCI config ++
    • ++ ++
    • ++ section: UCI section name ++
    • ++ ++
    • ++ option: UCI option ++
    • ++ ++
    • ++ value: UCI value ++
    • ++ ++
    ++ ++ ++ ++ ++ ++ ++

    Return value:

    ++Boolean whether operation succeeded ++ ++ ++ ++
    ++ ++ ++ ++ ++
    Cursor:set_savedir (directory)
    ++
    ++ ++ ++Set the directory for uncommited changes. ++ ++ ++ ++

    Parameters

    ++
      ++ ++
    • ++ directory: UCI changes directory ++
    • ++ ++
    ++ ++ ++ ++ ++ ++ ++

    Return value:

    ++Boolean whether operation succeeded ++ ++ ++ ++
    ++ ++ ++ ++ ++
    Cursor:substate ()
    ++
    ++ ++ ++Create a sub-state of this cursor. The sub-state is tied to the parent ++ ++curser, means it the parent unloads or loads configs, the sub state will ++do so as well. ++ ++ ++ ++ ++ ++ ++ ++

    Return value:

    ++UCI state cursor tied to the parent cursor ++ ++ ++ ++
    ++ ++ ++ ++ ++
    Cursor:tset (config, section, values)
    ++
    ++ ++ ++Updated the data of a section using data from a table. ++ ++ ++ ++

    Parameters

    ++
      ++ ++
    • ++ config: UCI config ++
    • ++ ++
    • ++ section: UCI section name (optional) ++
    • ++ ++
    • ++ values: Table of key - value pairs to update the section with ++
    • ++ ++
    ++ ++ ++ ++ ++ ++ ++ ++ ++
    ++ ++ ++ ++ ++
    Cursor:unload (config)
    ++
    ++ ++ ++Discard changes made to a config. ++ ++ ++ ++

    Parameters

    ++
      ++ ++
    • ++ config: UCI config ++
    • ++ ++
    ++ ++ ++ ++ ++ ++ ++

    Return value:

    ++Boolean whether operation succeeded ++ ++ ++ ++

    See also:

    ++ ++ ++
    ++ ++ ++ ++ ++
    cursor ()
    ++
    ++ ++ ++Create a new UCI-Cursor. ++ ++ ++ ++ ++ ++ ++ ++ ++

    Return value:

    ++UCI-Cursor ++ ++ ++ ++
    ++ ++ ++ ++ ++
    cursor_state ()
    ++
    ++ ++ ++Create a new Cursor initialized to the state directory. ++ ++ ++ ++ ++ ++ ++ ++ ++

    Return value:

    ++UCI cursor ++ ++ ++ ++
    ++ ++ ++
    ++ ++ ++ ++ ++ ++
    ++ ++
    ++ ++
    ++

    Valid XHTML 1.0!

    ++
    ++ ++
    ++ ++ +diff --git a/feeds/luci/documentation/api/modules/luci.rpcc.html b/feeds/luci/documentation/api/modules/luci.rpcc.html +new file mode 100644 +index 0000000..f7cb020 +--- /dev/null ++++ b/feeds/luci/documentation/api/modules/luci.rpcc.html +@@ -0,0 +1,328 @@ ++ ++ ++ ++ Reference ++ ++ ++ ++ ++ ++
    ++ ++
    ++ ++
    ++
    ++
    ++ ++
    ++ ++ ++ ++
    ++ ++

    Object Instance luci.rpcc

    ++ ++

    ++ ++ ++ ++ ++ ++ ++ ++

    Functions

    ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
    Client:proxy (prefix) ++ ++Create a transparent RPC proxy.
    Client:request (method, params, notification) ++ ++Request an RP call and get the response.
    ++ ++ ++ ++ ++ ++ ++
    ++
    ++ ++ ++

    Functions

    ++
    ++ ++ ++ ++
    Client:proxy (prefix)
    ++
    ++ ++ ++Create a transparent RPC proxy. ++ ++ ++ ++

    Parameters

    ++
      ++ ++
    • ++ prefix: Method prefix ++
    • ++ ++
    ++ ++ ++ ++ ++ ++ ++

    Return value:

    ++RPC Proxy object ++ ++ ++ ++
    ++ ++ ++ ++ ++
    Client:request (method, params, notification)
    ++
    ++ ++ ++Request an RP call and get the response. ++ ++ ++ ++

    Parameters

    ++
      ++ ++
    • ++ method: Remote method ++
    • ++ ++
    • ++ params: Parameters ++
    • ++ ++
    • ++ notification: Notification only? ++
    • ++ ++
    ++ ++ ++ ++ ++ ++ ++

    Return value:

    ++response ++ ++ ++ ++
    ++ ++ ++
    ++ ++ ++ ++ ++ ++
    ++ ++
    ++ ++
    ++

    Valid XHTML 1.0!

    ++
    ++ ++
    ++ ++ +diff --git a/feeds/luci/documentation/api/modules/luci.rpcc.ruci.html b/feeds/luci/documentation/api/modules/luci.rpcc.ruci.html +new file mode 100644 +index 0000000..203779c +--- /dev/null ++++ b/feeds/luci/documentation/api/modules/luci.rpcc.ruci.html +@@ -0,0 +1,281 @@ ++ ++ ++ ++ Reference ++ ++ ++ ++ ++ ++
    ++ ++
    ++ ++
    ++
    ++
    ++ ++
    ++ ++ ++ ++
    ++ ++

    Object Instance luci.rpcc.ruci

    ++ ++

    ++ ++ ++ ++ ++ ++ ++ ++

    Functions

    ++ ++ ++ ++ ++ ++ ++ ++
    factory (rpccl) ++ ++Create a new UCI over RPC proxy.
    ++ ++ ++ ++ ++ ++ ++
    ++
    ++ ++ ++

    Functions

    ++
    ++ ++ ++ ++
    factory (rpccl)
    ++
    ++ ++ ++Create a new UCI over RPC proxy. ++ ++ ++ ++

    Parameters

    ++
      ++ ++
    • ++ rpccl: RPC client ++
    • ++ ++
    ++ ++ ++ ++ ++ ++ ++

    Return value:

    ++Network transparent UCI module ++ ++ ++ ++
    ++ ++ ++
    ++ ++ ++ ++ ++ ++
    ++ ++
    ++ ++
    ++

    Valid XHTML 1.0!

    ++
    ++ ++
    ++ ++ +diff --git a/feeds/luci/documentation/api/modules/luci.sys.html b/feeds/luci/documentation/api/modules/luci.sys.html +new file mode 100644 +index 0000000..860c5fb +--- /dev/null ++++ b/feeds/luci/documentation/api/modules/luci.sys.html +@@ -0,0 +1,645 @@ ++ ++ ++ ++ Reference ++ ++ ++ ++ ++ ++
    ++ ++
    ++ ++
    ++
    ++
    ++ ++
    ++ ++ ++ ++
    ++ ++

    Class luci.sys

    ++ ++

    ++ ++ ++ ++ ++ ++ ++ ++

    Functions

    ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
    call (...) ++ ++Execute a given shell command and return the error code ++
    dmesg () ++ ++Retrieves the output of the "dmesg" command.
    exec (command) ++ ++Execute a given shell command and capture its standard output ++
    getenv (var) ++ ++Retrieve environment variables.
    hostname (String) ++ ++Get or set the current hostname.
    httpget (url, stream, target) ++ ++Returns the contents of a documented referred by an URL.
    mounts () ++ ++Retrieve information about currently mounted file systems.
    reboot () ++ ++Initiate a system reboot.
    syslog () ++ ++Retrieves the output of the "logread" command.
    uniqueid (bytes) ++ ++Generates a random id with specified length.
    uptime () ++ ++Returns the current system uptime stats.
    ++ ++ ++ ++ ++ ++ ++
    ++
    ++ ++ ++

    Functions

    ++
    ++ ++ ++ ++
    call (...)
    ++
    ++ ++ ++Execute a given shell command and return the error code ++ ++ ++ ++

    Parameters

    ++
      ++ ++
    • ++ ...: Command to call ++
    • ++ ++
    ++ ++ ++ ++ ++ ++ ++

    Return value:

    ++Error code of the command ++ ++ ++ ++
    ++ ++ ++ ++ ++
    dmesg ()
    ++
    ++ ++ ++Retrieves the output of the "dmesg" command. ++ ++ ++ ++ ++ ++ ++ ++ ++

    Return value:

    ++String containing the current log buffer ++ ++ ++ ++
    ++ ++ ++ ++ ++
    exec (command)
    ++
    ++ ++ ++Execute a given shell command and capture its standard output ++ ++ ++ ++

    Parameters

    ++
      ++ ++
    • ++ command: Command to call ++
    • ++ ++
    ++ ++ ++ ++ ++ ++ ++

    Return value:

    ++String containg the return the output of the command ++ ++ ++ ++
    ++ ++ ++ ++ ++
    getenv (var)
    ++
    ++ ++ ++Retrieve environment variables. If no variable is given then a table ++ ++containing the whole environment is returned otherwise this function returns ++the corresponding string value for the given name or nil if no such variable ++exists. ++ ++ ++

    Parameters

    ++
      ++ ++
    • ++ var: Name of the environment variable to retrieve (optional) ++
    • ++ ++
    ++ ++ ++ ++ ++ ++ ++

    Return values:

    ++
      ++ ++
    1. String containg the value of the specified variable ++ ++
    2. Table containing all variables if no variable name is given ++ ++
    ++ ++ ++ ++
    ++ ++ ++ ++ ++
    hostname (String)
    ++
    ++ ++ ++Get or set the current hostname. ++ ++ ++ ++

    Parameters

    ++
      ++ ++
    • ++ String: containing a new hostname to set (optional) ++
    • ++ ++
    ++ ++ ++ ++ ++ ++ ++

    Return value:

    ++String containing the system hostname ++ ++ ++ ++
    ++ ++ ++ ++ ++
    httpget (url, stream, target)
    ++
    ++ ++ ++Returns the contents of a documented referred by an URL. ++ ++ ++ ++

    Parameters

    ++
      ++ ++
    • ++ url: The URL to retrieve ++
    • ++ ++
    • ++ stream: Return a stream instead of a buffer ++
    • ++ ++
    • ++ target: Directly write to target file name ++
    • ++ ++
    ++ ++ ++ ++ ++ ++ ++

    Return value:

    ++String containing the contents of given the URL ++ ++ ++ ++
    ++ ++ ++ ++ ++
    mounts ()
    ++
    ++ ++ ++Retrieve information about currently mounted file systems. ++ ++ ++ ++ ++ ++ ++ ++ ++

    Return value:

    ++Table containing mount information ++ ++ ++ ++
    ++ ++ ++ ++ ++
    reboot ()
    ++
    ++ ++ ++Initiate a system reboot. ++ ++ ++ ++ ++ ++ ++ ++ ++

    Return value:

    ++Return value of os.execute() ++ ++ ++ ++
    ++ ++ ++ ++ ++
    syslog ()
    ++
    ++ ++ ++Retrieves the output of the "logread" command. ++ ++ ++ ++ ++ ++ ++ ++ ++

    Return value:

    ++String containing the current log buffer ++ ++ ++ ++
    ++ ++ ++ ++ ++
    uniqueid (bytes)
    ++
    ++ ++ ++Generates a random id with specified length. ++ ++ ++ ++

    Parameters

    ++
      ++ ++
    • ++ bytes: Number of bytes for the unique id ++
    • ++ ++
    ++ ++ ++ ++ ++ ++ ++

    Return value:

    ++String containing hex encoded id ++ ++ ++ ++
    ++ ++ ++ ++ ++
    uptime ()
    ++
    ++ ++ ++Returns the current system uptime stats. ++ ++ ++ ++ ++ ++ ++ ++ ++

    Return value:

    ++String containing total uptime in seconds ++ ++ ++ ++
    ++ ++ ++
    ++ ++ ++ ++ ++ ++
    ++ ++
    ++ ++
    ++

    Valid XHTML 1.0!

    ++
    ++ ++
    ++ ++ +diff --git a/feeds/luci/documentation/api/modules/luci.sys.init.html b/feeds/luci/documentation/api/modules/luci.sys.init.html +new file mode 100644 +index 0000000..596fb7c +--- /dev/null ++++ b/feeds/luci/documentation/api/modules/luci.sys.init.html +@@ -0,0 +1,516 @@ ++ ++ ++ ++ Reference ++ ++ ++ ++ ++ ++
    ++ ++
    ++ ++
    ++
    ++
    ++ ++
    ++ ++ ++ ++
    ++ ++

    Class luci.sys.init

    ++ ++

    ++ ++LuCI system utilities / init related functions. ++

    ++ ++ ++ ++ ++ ++ ++ ++

    Functions

    ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
    disable (name) ++ ++Disable the given init script ++
    enable (name) ++ ++Enable the given init script ++
    enabled (name) ++ ++Test whether the given init script is enabled ++
    index (name) ++ ++Get the index of he given init script ++
    names () ++ ++Get the names of all installed init scripts ++
    start (name) ++ ++Start the given init script ++
    stop (name) ++ ++Stop the given init script ++
    ++ ++ ++ ++ ++ ++ ++
    ++
    ++ ++ ++

    Functions

    ++
    ++ ++ ++ ++
    disable (name)
    ++
    ++ ++ ++Disable the given init script ++ ++ ++ ++

    Parameters

    ++
      ++ ++
    • ++ name: Name of the init script ++
    • ++ ++
    ++ ++ ++ ++ ++ ++ ++

    Return value:

    ++Boolean indicating success ++ ++ ++ ++
    ++ ++ ++ ++ ++
    enable (name)
    ++
    ++ ++ ++Enable the given init script ++ ++ ++ ++

    Parameters

    ++
      ++ ++
    • ++ name: Name of the init script ++
    • ++ ++
    ++ ++ ++ ++ ++ ++ ++

    Return value:

    ++Boolean indicating success ++ ++ ++ ++
    ++ ++ ++ ++ ++
    enabled (name)
    ++
    ++ ++ ++Test whether the given init script is enabled ++ ++ ++ ++

    Parameters

    ++
      ++ ++
    • ++ name: Name of the init script ++
    • ++ ++
    ++ ++ ++ ++ ++ ++ ++

    Return value:

    ++Boolean indicating whether init is enabled ++ ++ ++ ++
    ++ ++ ++ ++ ++
    index (name)
    ++
    ++ ++ ++Get the index of he given init script ++ ++ ++ ++

    Parameters

    ++
      ++ ++
    • ++ name: Name of the init script ++
    • ++ ++
    ++ ++ ++ ++ ++ ++ ++

    Return value:

    ++Numeric index value ++ ++ ++ ++
    ++ ++ ++ ++ ++
    names ()
    ++
    ++ ++ ++Get the names of all installed init scripts ++ ++ ++ ++ ++ ++ ++ ++ ++

    Return value:

    ++Table containing the names of all inistalled init scripts ++ ++ ++ ++
    ++ ++ ++ ++ ++
    start (name)
    ++
    ++ ++ ++Start the given init script ++ ++ ++ ++

    Parameters

    ++
      ++ ++
    • ++ name: Name of the init script ++
    • ++ ++
    ++ ++ ++ ++ ++ ++ ++

    Return value:

    ++Boolean indicating success ++ ++ ++ ++
    ++ ++ ++ ++ ++
    stop (name)
    ++
    ++ ++ ++Stop the given init script ++ ++ ++ ++

    Parameters

    ++
      ++ ++
    • ++ name: Name of the init script ++
    • ++ ++
    ++ ++ ++ ++ ++ ++ ++

    Return value:

    ++Boolean indicating success ++ ++ ++ ++
    ++ ++ ++
    ++ ++ ++ ++ ++ ++
    ++ ++
    ++ ++
    ++

    Valid XHTML 1.0!

    ++
    ++ ++
    ++ ++ +diff --git a/feeds/luci/documentation/api/modules/luci.sys.iptparser.html b/feeds/luci/documentation/api/modules/luci.sys.iptparser.html +new file mode 100644 +index 0000000..122afcc +--- /dev/null ++++ b/feeds/luci/documentation/api/modules/luci.sys.iptparser.html +@@ -0,0 +1,466 @@ ++ ++ ++ ++ Reference ++ ++ ++ ++ ++ ++
    ++ ++
    ++ ++
    ++
    ++
    ++ ++
    ++ ++ ++ ++
    ++ ++

    Object Instance luci.sys.iptparser

    ++ ++

    ++ ++ ++ ++ ++ ++ ++ ++

    Functions

    ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
    IptParser (family) ++ ++Create a new iptables parser object.
    IptParser:chain (table, chain) ++ ++Return the given firewall chain within the given table name.
    IptParser:chains (table) ++ ++Find the names of all chains within the given table name.
    IptParser:is_custom_target (target) ++ ++Test whether the given target points to a custom chain.
    IptParser:resync () ++ ++Rebuild the internal lookup table, for example when rules have changed ++ ++through external commands.
    IptParser:tables () ++ ++Find the names of all tables.
    ++ ++ ++ ++ ++ ++ ++
    ++
    ++ ++ ++

    Functions

    ++
    ++ ++ ++ ++
    IptParser (family)
    ++
    ++ ++ ++Create a new iptables parser object. ++ ++ ++ ++

    Parameters

    ++
      ++ ++
    • ++ family: Number specifying the address family. 4 for IPv4, 6 for IPv6 ++
    • ++ ++
    ++ ++ ++ ++ ++ ++ ++

    Return value:

    ++IptParser instance ++ ++ ++ ++
    ++ ++ ++ ++ ++
    IptParser:chain (table, chain)
    ++
    ++ ++ ++Return the given firewall chain within the given table name. ++ ++ ++ ++

    Parameters

    ++
      ++ ++
    • ++ table: String containing the table name ++
    • ++ ++
    • ++ chain: String containing the chain name ++
    • ++ ++
    ++ ++ ++ ++ ++ ++ ++

    Return value:

    ++Table containing the fields "policy", "packets", "bytes" ++ and "rules". The "rules" field is a table of rule tables. ++ ++ ++ ++
    ++ ++ ++ ++ ++
    IptParser:chains (table)
    ++
    ++ ++ ++Find the names of all chains within the given table name. ++ ++ ++ ++

    Parameters

    ++
      ++ ++
    • ++ table: String containing the table name ++
    • ++ ++
    ++ ++ ++ ++ ++ ++ ++

    Return value:

    ++Table of chain names in the order they occur. ++ ++ ++ ++
    ++ ++ ++ ++ ++
    IptParser:is_custom_target (target)
    ++
    ++ ++ ++Test whether the given target points to a custom chain. ++ ++ ++ ++

    Parameters

    ++
      ++ ++
    • ++ target: String containing the target action ++
    • ++ ++
    ++ ++ ++ ++ ++ ++ ++

    Return value:

    ++Boolean indicating whether target is a custom chain. ++ ++ ++ ++
    ++ ++ ++ ++ ++
    IptParser:resync ()
    ++
    ++ ++ ++Rebuild the internal lookup table, for example when rules have changed ++ ++through external commands. ++ ++ ++ ++ ++ ++ ++ ++

    Return value:

    ++nothing ++ ++ ++ ++
    ++ ++ ++ ++ ++
    IptParser:tables ()
    ++
    ++ ++ ++Find the names of all tables. ++ ++ ++ ++ ++ ++ ++ ++ ++

    Return value:

    ++Table of table names. ++ ++ ++ ++
    ++ ++ ++
    ++ ++ ++ ++ ++ ++
    ++ ++
    ++ ++
    ++

    Valid XHTML 1.0!

    ++
    ++ ++
    ++ ++ +diff --git a/feeds/luci/documentation/api/modules/luci.sys.net.html b/feeds/luci/documentation/api/modules/luci.sys.net.html +new file mode 100644 +index 0000000..4a049e2 +--- /dev/null ++++ b/feeds/luci/documentation/api/modules/luci.sys.net.html +@@ -0,0 +1,569 @@ ++ ++ ++ ++ Reference ++ ++ ++ ++ ++ ++
    ++ ++
    ++ ++
    ++
    ++
    ++ ++
    ++ ++ ++ ++
    ++ ++

    Class luci.sys.net

    ++ ++

    ++ ++LuCI system utilities / network related functions. ++

    ++ ++ ++ ++ ++ ++ ++ ++

    Functions

    ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
    arptable () ++ ++Returns the current arp-table entries as two-dimensional table.
    conntrack () ++ ++Returns conntrack information ++
    deviceinfo () ++ ++Return information about available network interfaces.
    devices () ++ ++Determine the names of available network interfaces.
    ipv4_hints () ++ ++Returns a two-dimensional table of IPv4 address hints.
    ipv6_hints () ++ ++Returns a two-dimensional table of IPv6 address hints.
    mac_hints () ++ ++Returns a two-dimensional table of mac address hints.
    pingtest (host) ++ ++Tests whether the given host responds to ping probes.
    routes () ++ ++Returns the current kernel routing table entries.
    routes6 () ++ ++Returns the current ipv6 kernel routing table entries.
    ++ ++ ++ ++ ++ ++ ++
    ++
    ++ ++ ++

    Functions

    ++
    ++ ++ ++ ++
    arptable ()
    ++
    ++ ++ ++Returns the current arp-table entries as two-dimensional table. ++ ++ ++ ++ ++ ++ ++ ++ ++

    Return value:

    ++Table of table containing the current arp entries. ++ The following fields are defined for arp entry objects: ++ { "IP address", "HW address", "HW type", "Flags", "Mask", "Device" } ++ ++ ++ ++
    ++ ++ ++ ++ ++
    conntrack ()
    ++
    ++ ++ ++Returns conntrack information ++ ++ ++ ++ ++ ++ ++ ++ ++

    Return value:

    ++Table with the currently tracked IP connections ++ ++ ++ ++
    ++ ++ ++ ++ ++
    deviceinfo ()
    ++
    ++ ++ ++Return information about available network interfaces. ++ ++ ++ ++ ++ ++ ++ ++ ++

    Return value:

    ++Table containing all current interface names and their information ++ ++ ++ ++
    ++ ++ ++ ++ ++
    devices ()
    ++
    ++ ++ ++Determine the names of available network interfaces. ++ ++ ++ ++ ++ ++ ++ ++ ++

    Return value:

    ++Table containing all current interface names ++ ++ ++ ++
    ++ ++ ++ ++ ++
    ipv4_hints ()
    ++
    ++ ++ ++Returns a two-dimensional table of IPv4 address hints. ++ ++ ++ ++ ++ ++ ++ ++ ++

    Return value:

    ++Table of table containing known hosts from various sources. ++ Each entry contains the values in the following order: ++ [ "ip", "name" ] ++ ++ ++ ++
    ++ ++ ++ ++ ++
    ipv6_hints ()
    ++
    ++ ++ ++Returns a two-dimensional table of IPv6 address hints. ++ ++ ++ ++ ++ ++ ++ ++ ++

    Return value:

    ++Table of table containing known hosts from various sources. ++ Each entry contains the values in the following order: ++ [ "ip", "name" ] ++ ++ ++ ++
    ++ ++ ++ ++ ++
    mac_hints ()
    ++
    ++ ++ ++Returns a two-dimensional table of mac address hints. ++ ++ ++ ++ ++ ++ ++ ++ ++

    Return value:

    ++Table of table containing known hosts from various sources. ++ Each entry contains the values in the following order: ++ [ "mac", "name" ] ++ ++ ++ ++
    ++ ++ ++ ++ ++
    pingtest (host)
    ++
    ++ ++ ++Tests whether the given host responds to ping probes. ++ ++ ++ ++

    Parameters

    ++
      ++ ++
    • ++ host: String containing a hostname or IPv4 address ++
    • ++ ++
    ++ ++ ++ ++ ++ ++ ++

    Return value:

    ++Number containing 0 on success and >= 1 on error ++ ++ ++ ++
    ++ ++ ++ ++ ++
    routes ()
    ++
    ++ ++ ++Returns the current kernel routing table entries. ++ ++ ++ ++ ++ ++ ++ ++ ++

    Return value:

    ++Table of tables with properties of the corresponding routes. ++ The following fields are defined for route entry tables: ++ { "dest", "gateway", "metric", "refcount", "usecount", "irtt", ++ "flags", "device" } ++ ++ ++ ++
    ++ ++ ++ ++ ++
    routes6 ()
    ++
    ++ ++ ++Returns the current ipv6 kernel routing table entries. ++ ++ ++ ++ ++ ++ ++ ++ ++

    Return value:

    ++Table of tables with properties of the corresponding routes. ++ The following fields are defined for route entry tables: ++ { "source", "dest", "nexthop", "metric", "refcount", "usecount", ++ "flags", "device" } ++ ++ ++ ++
    ++ ++ ++
    ++ ++ ++ ++ ++ ++
    ++ ++
    ++ ++
    ++

    Valid XHTML 1.0!

    ++
    ++ ++
    ++ ++ +diff --git a/feeds/luci/documentation/api/modules/luci.sys.process.html b/feeds/luci/documentation/api/modules/luci.sys.process.html +new file mode 100644 +index 0000000..9c4f0a5 +--- /dev/null ++++ b/feeds/luci/documentation/api/modules/luci.sys.process.html +@@ -0,0 +1,448 @@ ++ ++ ++ ++ Reference ++ ++ ++ ++ ++ ++
    ++ ++
    ++ ++
    ++
    ++
    ++ ++
    ++ ++ ++ ++
    ++ ++

    Class luci.sys.process

    ++ ++

    ++ ++LuCI system utilities / process related functions. ++

    ++ ++ ++ ++ ++ ++ ++ ++

    Functions

    ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
    info () ++ ++Get the current process id.
    list () ++ ++Retrieve information about currently running processes.
    setgroup (gid) ++ ++Set the gid of a process identified by given pid.
    setuser (uid) ++ ++Set the uid of a process identified by given pid.
    signal (pid, sig) ++ ++Send a signal to a process identified by given pid.
    ++ ++ ++ ++ ++ ++ ++
    ++
    ++ ++ ++

    Functions

    ++
    ++ ++ ++ ++
    info ()
    ++
    ++ ++ ++Get the current process id. ++ ++ ++ ++ ++ ++ ++ ++ ++

    Return value:

    ++Number containing the current pid ++ ++ ++ ++
    ++ ++ ++ ++ ++
    list ()
    ++
    ++ ++ ++Retrieve information about currently running processes. ++ ++ ++ ++ ++ ++ ++ ++ ++

    Return value:

    ++Table containing process information ++ ++ ++ ++
    ++ ++ ++ ++ ++
    setgroup (gid)
    ++
    ++ ++ ++Set the gid of a process identified by given pid. ++ ++ ++ ++

    Parameters

    ++
      ++ ++
    • ++ gid: Number containing the Unix group id ++
    • ++ ++
    ++ ++ ++ ++ ++ ++ ++

    Return values:

    ++
      ++ ++
    1. Boolean indicating successful operation ++ ++
    2. String containing the error message if failed ++ ++
    3. Number containing the error code if failed ++ ++
    ++ ++ ++ ++
    ++ ++ ++ ++ ++
    setuser (uid)
    ++
    ++ ++ ++Set the uid of a process identified by given pid. ++ ++ ++ ++

    Parameters

    ++
      ++ ++
    • ++ uid: Number containing the Unix user id ++
    • ++ ++
    ++ ++ ++ ++ ++ ++ ++

    Return values:

    ++
      ++ ++
    1. Boolean indicating successful operation ++ ++
    2. String containing the error message if failed ++ ++
    3. Number containing the error code if failed ++ ++
    ++ ++ ++ ++
    ++ ++ ++ ++ ++
    signal (pid, sig)
    ++
    ++ ++ ++Send a signal to a process identified by given pid. ++ ++ ++ ++

    Parameters

    ++
      ++ ++
    • ++ pid: Number containing the process id ++
    • ++ ++
    • ++ sig: Signal to send (default: 15 [SIGTERM]) ++
    • ++ ++
    ++ ++ ++ ++ ++ ++ ++

    Return values:

    ++
      ++ ++
    1. Boolean indicating successful operation ++ ++
    2. Number containing the error code if failed ++ ++
    ++ ++ ++ ++
    ++ ++ ++
    ++ ++ ++ ++ ++ ++
    ++ ++
    ++ ++
    ++

    Valid XHTML 1.0!

    ++
    ++ ++
    ++ ++ +diff --git a/feeds/luci/documentation/api/modules/luci.sys.user.html b/feeds/luci/documentation/api/modules/luci.sys.user.html +new file mode 100644 +index 0000000..37126dd +--- /dev/null ++++ b/feeds/luci/documentation/api/modules/luci.sys.user.html +@@ -0,0 +1,416 @@ ++ ++ ++ ++ Reference ++ ++ ++ ++ ++ ++
    ++ ++
    ++ ++
    ++
    ++
    ++ ++
    ++ ++ ++ ++
    ++ ++

    Class luci.sys.user

    ++ ++

    ++ ++LuCI system utilities / user related functions. ++

    ++ ++ ++ ++ ++ ++ ++ ++

    Functions

    ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
    getuser (uid) ++ ++Retrieve user informations for given uid.
    checkpasswd (username, pass) ++ ++Test whether given string matches the password of a given system user.
    getpasswd (username) ++ ++Retrieve the current user password hash.
    setpasswd (username, password) ++ ++Change the password of given user.
    ++ ++ ++ ++ ++ ++ ++
    ++
    ++ ++ ++

    Functions

    ++
    ++ ++ ++ ++
    getuser (uid)
    ++
    ++ ++ ++Retrieve user informations for given uid. ++ ++ ++ ++

    Parameters

    ++
      ++ ++
    • ++ uid: Number containing the Unix user id ++
    • ++ ++
    ++ ++ ++ ++ ++ ++ ++

    Return value:

    ++Table containing the following fields: ++ { "uid", "gid", "name", "passwd", "dir", "shell", "gecos" } ++ ++ ++ ++
    ++ ++ ++ ++ ++
    checkpasswd (username, pass)
    ++
    ++ ++ ++Test whether given string matches the password of a given system user. ++ ++ ++ ++

    Parameters

    ++
      ++ ++
    • ++ username: String containing the Unix user name ++
    • ++ ++
    • ++ pass: String containing the password to compare ++
    • ++ ++
    ++ ++ ++ ++ ++ ++ ++

    Return value:

    ++Boolean indicating wheather the passwords are equal ++ ++ ++ ++
    ++ ++ ++ ++ ++
    getpasswd (username)
    ++
    ++ ++ ++Retrieve the current user password hash. ++ ++ ++ ++

    Parameters

    ++
      ++ ++
    • ++ username: String containing the username to retrieve the password for ++
    • ++ ++
    ++ ++ ++ ++ ++ ++ ++

    Return values:

    ++
      ++ ++
    1. String containing the hash or nil if no password is set. ++ ++
    2. Password database entry ++ ++
    ++ ++ ++ ++
    ++ ++ ++ ++ ++
    setpasswd (username, password)
    ++
    ++ ++ ++Change the password of given user. ++ ++ ++ ++

    Parameters

    ++
      ++ ++
    • ++ username: String containing the Unix user name ++
    • ++ ++
    • ++ password: String containing the password to compare ++
    • ++ ++
    ++ ++ ++ ++ ++ ++ ++

    Return value:

    ++Number containing 0 on success and >= 1 on error ++ ++ ++ ++
    ++ ++ ++
    ++ ++ ++ ++ ++ ++
    ++ ++
    ++ ++
    ++

    Valid XHTML 1.0!

    ++
    ++ ++
    ++ ++ +diff --git a/feeds/luci/documentation/api/modules/luci.sys.wifi.html b/feeds/luci/documentation/api/modules/luci.sys.wifi.html +new file mode 100644 +index 0000000..eb1f6b3 +--- /dev/null ++++ b/feeds/luci/documentation/api/modules/luci.sys.wifi.html +@@ -0,0 +1,284 @@ ++ ++ ++ ++ Reference ++ ++ ++ ++ ++ ++
    ++ ++
    ++ ++
    ++
    ++
    ++ ++
    ++ ++ ++ ++
    ++ ++

    Class luci.sys.wifi

    ++ ++

    ++ ++LuCI system utilities / wifi related functions. ++

    ++ ++ ++ ++ ++ ++ ++ ++

    Functions

    ++ ++ ++ ++ ++ ++ ++ ++
    getiwinfo (ifname) ++ ++Get wireless information for given interface.
    ++ ++ ++ ++ ++ ++ ++
    ++
    ++ ++ ++

    Functions

    ++
    ++ ++ ++ ++
    getiwinfo (ifname)
    ++
    ++ ++ ++Get wireless information for given interface. ++ ++ ++ ++

    Parameters

    ++
      ++ ++
    • ++ ifname: String containing the interface name ++
    • ++ ++
    ++ ++ ++ ++ ++ ++ ++

    Return value:

    ++A wrapped iwinfo object instance ++ ++ ++ ++
    ++ ++ ++
    ++ ++ ++ ++ ++ ++
    ++ ++
    ++ ++
    ++

    Valid XHTML 1.0!

    ++
    ++ ++
    ++ ++ +diff --git a/feeds/luci/documentation/api/modules/luci.util.html b/feeds/luci/documentation/api/modules/luci.util.html +new file mode 100644 +index 0000000..301cfff +--- /dev/null ++++ b/feeds/luci/documentation/api/modules/luci.util.html +@@ -0,0 +1,1717 @@ ++ ++ ++ ++ Reference ++ ++ ++ ++ ++ ++
    ++ ++
    ++ ++
    ++
    ++
    ++ ++
    ++ ++ ++ ++
    ++ ++

    Class luci.util

    ++ ++

    ++ ++ ++ ++ ++ ++ ++ ++

    Functions

    ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
    append (src, ...) ++ ++Appends numerically indexed tables or single objects to a given table.
    bigendian () ++ ++Test whether the current system is operating in big endian mode.
    class (base) ++ ++Create a Class object (Python-style object model).
    clone (object, deep) ++ ++Clones the given object and return it's copy.
    cmatch (str, pattern) ++ ++Count the occurences of given substring in given string.
    combine (tbl1, tbl2, ...) ++ ++Combines two or more numerically indexed tables and single objects into one table.
    contains (table, value) ++ ++Checks whether the given table contains the given value.
    copcall (f, ...) ++ ++This is a coroutine-safe drop-in replacement for Lua's "pcall"-function ++
    coxpcall (f, err, ...) ++ ++This is a coroutine-safe drop-in replacement for Lua's "xpcall"-function ++
    dtable () ++ ++Create a dynamic table which automatically creates subtables.
    dumptable (t, maxdepth) ++ ++Recursively dumps a table to stdout, useful for testing and debugging.
    exec (command) ++ ++Execute given commandline and gather stdout.
    execi (command) ++ ++Return a line-buffered iterator over the output of given command.
    get_bytecode (val) ++ ++Return the current runtime bytecode of the given data.
    imatch (val) ++ ++Return a matching iterator for the given value.
    instanceof (object, class) ++ ++Test whether the given object is an instance of the given class.
    keys (t) ++ ++Retrieve all keys of given associative table.
    kspairs (t) ++ ++Return a key, value iterator for the given table.
    libpath () ++ ++Returns the absolute path to LuCI base directory.
    parse_units (ustr) ++ ++Parse certain units from the given string and return the canonical integer ++ ++value or 0 if the unit is unknown.
    pcdata (value) ++ ++Create valid XML PCDATA from given string.
    perror (obj) ++ ++Write given object to stderr.
    restore_data (str) ++ ++Restore data previously serialized with serialize_data().
    serialize_data (val) ++ ++Recursively serialize given data to lua code, suitable for restoring ++ ++with loadstring().
    serialize_json (data, writer) ++ ++Convert data structure to JSON ++
    spairs (t, f) ++ ++Return a key, value iterator which returns the values sorted according to ++ ++the provided callback function.
    split (str, pat, max, regex) ++ ++Splits given string on a defined separator sequence and return a table ++ ++containing the resulting substrings.
    strip_bytecode (code) ++ ++Strips unnescessary lua bytecode from given string.
    striptags (value) ++ ++Strip HTML tags from given string.
    threadlocal () ++ ++Create a new or get an already existing thread local store associated with ++ ++the current active coroutine.
    trim (str) ++ ++Remove leading and trailing whitespace from given string value.
    ubus (object, method, values) ++ ++Issue an ubus call.
    update (t, updates) ++ ++Update values in given table with the values from the second given table.
    vspairs (t) ++ ++Return a key, value iterator for the given table.
    ++ ++ ++ ++ ++ ++ ++
    ++
    ++ ++ ++

    Functions

    ++
    ++ ++ ++ ++
    append (src, ...)
    ++
    ++ ++ ++Appends numerically indexed tables or single objects to a given table. ++ ++ ++ ++

    Parameters

    ++
      ++ ++
    • ++ src: Target table ++
    • ++ ++
    • ++ ...: Objects to insert ++
    • ++ ++
    ++ ++ ++ ++ ++ ++ ++

    Return value:

    ++Target table ++ ++ ++ ++
    ++ ++ ++ ++ ++
    bigendian ()
    ++
    ++ ++ ++Test whether the current system is operating in big endian mode. ++ ++ ++ ++ ++ ++ ++ ++ ++

    Return value:

    ++Boolean value indicating whether system is big endian ++ ++ ++ ++
    ++ ++ ++ ++ ++
    class (base)
    ++
    ++ ++ ++Create a Class object (Python-style object model). ++ ++The class object can be instantiated by calling itself. ++Any class functions or shared parameters can be attached to this object. ++Attaching a table to the class object makes this table shared between ++all instances of this class. For object parameters use the __init__ function. ++Classes can inherit member functions and values from a base class. ++Class can be instantiated by calling them. All parameters will be passed ++to the __init__ function of this class - if such a function exists. ++The __init__ function must be used to set any object parameters that are not shared ++with other objects of this class. Any return values will be ignored. ++ ++ ++

    Parameters

    ++
      ++ ++
    • ++ base: The base class to inherit from (optional) ++
    • ++ ++
    ++ ++ ++ ++ ++ ++ ++

    Return value:

    ++A class object ++ ++ ++ ++

    See also:

    ++ ++ ++
    ++ ++ ++ ++ ++
    clone (object, deep)
    ++
    ++ ++ ++Clones the given object and return it's copy. ++ ++ ++ ++

    Parameters

    ++
      ++ ++
    • ++ object: Table value to clone ++
    • ++ ++
    • ++ deep: Boolean indicating whether to do recursive cloning ++
    • ++ ++
    ++ ++ ++ ++ ++ ++ ++

    Return value:

    ++Cloned table value ++ ++ ++ ++
    ++ ++ ++ ++ ++
    cmatch (str, pattern)
    ++
    ++ ++ ++Count the occurences of given substring in given string. ++ ++ ++ ++

    Parameters

    ++
      ++ ++
    • ++ str: String to search in ++
    • ++ ++
    • ++ pattern: String containing pattern to find ++
    • ++ ++
    ++ ++ ++ ++ ++ ++ ++

    Return value:

    ++Number of found occurences ++ ++ ++ ++
    ++ ++ ++ ++ ++
    combine (tbl1, tbl2, ...)
    ++
    ++ ++ ++Combines two or more numerically indexed tables and single objects into one table. ++ ++ ++ ++

    Parameters

    ++
      ++ ++
    • ++ tbl1: Table value to combine ++
    • ++ ++
    • ++ tbl2: Table value to combine ++
    • ++ ++
    • ++ ...: More tables to combine ++
    • ++ ++
    ++ ++ ++ ++ ++ ++ ++

    Return value:

    ++Table value containing all values of given tables ++ ++ ++ ++
    ++ ++ ++ ++ ++
    contains (table, value)
    ++
    ++ ++ ++Checks whether the given table contains the given value. ++ ++ ++ ++

    Parameters

    ++
      ++ ++
    • ++ table: Table value ++
    • ++ ++
    • ++ value: Value to search within the given table ++
    • ++ ++
    ++ ++ ++ ++ ++ ++ ++

    Return value:

    ++number indicating the first index at which the given value occurs ++ within table or false. ++ ++ ++ ++
    ++ ++ ++ ++ ++
    copcall (f, ...)
    ++
    ++ ++ ++This is a coroutine-safe drop-in replacement for Lua's "pcall"-function ++ ++ ++ ++

    Parameters

    ++
      ++ ++
    • ++ f: Lua function to be called protected ++
    • ++ ++
    • ++ ...: Parameters passed to the function ++
    • ++ ++
    ++ ++ ++ ++ ++ ++ ++

    Return value:

    ++A boolean whether the function call succeeded and the returns ++ values of the function or the error object ++ ++ ++ ++
    ++ ++ ++ ++ ++
    coxpcall (f, err, ...)
    ++
    ++ ++ ++This is a coroutine-safe drop-in replacement for Lua's "xpcall"-function ++ ++ ++ ++

    Parameters

    ++
      ++ ++
    • ++ f: Lua function to be called protected ++
    • ++ ++
    • ++ err: Custom error handler ++
    • ++ ++
    • ++ ...: Parameters passed to the function ++
    • ++ ++
    ++ ++ ++ ++ ++ ++ ++

    Return value:

    ++A boolean whether the function call succeeded and the return ++ values of either the function or the error handler ++ ++ ++ ++
    ++ ++ ++ ++ ++
    dtable ()
    ++
    ++ ++ ++Create a dynamic table which automatically creates subtables. ++ ++ ++ ++ ++ ++ ++ ++ ++

    Return value:

    ++Dynamic Table ++ ++ ++ ++
    ++ ++ ++ ++ ++
    dumptable (t, maxdepth)
    ++
    ++ ++ ++Recursively dumps a table to stdout, useful for testing and debugging. ++ ++ ++ ++

    Parameters

    ++
      ++ ++
    • ++ t: Table value to dump ++
    • ++ ++
    • ++ maxdepth: Maximum depth ++
    • ++ ++
    ++ ++ ++ ++ ++ ++ ++

    Return value:

    ++Always nil ++ ++ ++ ++
    ++ ++ ++ ++ ++
    exec (command)
    ++
    ++ ++ ++Execute given commandline and gather stdout. ++ ++ ++ ++

    Parameters

    ++
      ++ ++
    • ++ command: String containing command to execute ++
    • ++ ++
    ++ ++ ++ ++ ++ ++ ++

    Return value:

    ++String containing the command's stdout ++ ++ ++ ++
    ++ ++ ++ ++ ++
    execi (command)
    ++
    ++ ++ ++Return a line-buffered iterator over the output of given command. ++ ++ ++ ++

    Parameters

    ++
      ++ ++
    • ++ command: String containing the command to execute ++
    • ++ ++
    ++ ++ ++ ++ ++ ++ ++

    Return value:

    ++Iterator ++ ++ ++ ++
    ++ ++ ++ ++ ++
    get_bytecode (val)
    ++
    ++ ++ ++Return the current runtime bytecode of the given data. The byte code ++ ++will be stripped before it is returned. ++ ++ ++

    Parameters

    ++
      ++ ++
    • ++ val: Value to return as bytecode ++
    • ++ ++
    ++ ++ ++ ++ ++ ++ ++

    Return value:

    ++String value containing the bytecode of the given data ++ ++ ++ ++
    ++ ++ ++ ++ ++
    imatch (val)
    ++
    ++ ++ ++Return a matching iterator for the given value. The iterator will return ++ ++one token per invocation, the tokens are separated by whitespace. If the ++input value is a table, it is transformed into a string first. A nil value ++will result in a valid interator which aborts with the first invocation. ++ ++ ++

    Parameters

    ++
      ++ ++
    • ++ val: The value to scan (table, string or nil) ++
    • ++ ++
    ++ ++ ++ ++ ++ ++ ++

    Return value:

    ++Iterator which returns one token per call ++ ++ ++ ++
    ++ ++ ++ ++ ++
    instanceof (object, class)
    ++
    ++ ++ ++Test whether the given object is an instance of the given class. ++ ++ ++ ++

    Parameters

    ++
      ++ ++
    • ++ object: Object instance ++
    • ++ ++
    • ++ class: Class object to test against ++
    • ++ ++
    ++ ++ ++ ++ ++ ++ ++

    Return value:

    ++Boolean indicating whether the object is an instance ++ ++ ++ ++

    See also:

    ++ ++ ++
    ++ ++ ++ ++ ++
    keys (t)
    ++
    ++ ++ ++Retrieve all keys of given associative table. ++ ++ ++ ++

    Parameters

    ++
      ++ ++
    • ++ t: Table to extract keys from ++
    • ++ ++
    ++ ++ ++ ++ ++ ++ ++

    Return value:

    ++Sorted table containing the keys ++ ++ ++ ++
    ++ ++ ++ ++ ++
    kspairs (t)
    ++
    ++ ++ ++Return a key, value iterator for the given table. ++ ++The table pairs are sorted by key. ++ ++ ++

    Parameters

    ++
      ++ ++
    • ++ t: The table to iterate ++
    • ++ ++
    ++ ++ ++ ++ ++ ++ ++

    Return value:

    ++Function value containing the corresponding iterator ++ ++ ++ ++
    ++ ++ ++ ++ ++
    libpath ()
    ++
    ++ ++ ++Returns the absolute path to LuCI base directory. ++ ++ ++ ++ ++ ++ ++ ++ ++

    Return value:

    ++String containing the directory path ++ ++ ++ ++
    ++ ++ ++ ++ ++
    parse_units (ustr)
    ++
    ++ ++ ++Parse certain units from the given string and return the canonical integer ++ ++value or 0 if the unit is unknown. Upper- or lower case is irrelevant. ++Recognized units are: ++ o "y" - one year (60*60*24*366) ++ o "m" - one month (60*60*24*31) ++ o "w" - one week (60*60*24*7) ++ o "d" - one day (60*60*24) ++ o "h" - one hour (60*60) ++ o "min" - one minute (60) ++ o "kb" - one kilobyte (1024) ++ o "mb" - one megabyte (1024*1024) ++ o "gb" - one gigabyte (1024*1024*1024) ++ o "kib" - one si kilobyte (1000) ++ o "mib" - one si megabyte (1000*1000) ++ o "gib" - one si gigabyte (1000*1000*1000) ++ ++ ++

    Parameters

    ++
      ++ ++
    • ++ ustr: String containing a numerical value with trailing unit ++
    • ++ ++
    ++ ++ ++ ++ ++ ++ ++

    Return value:

    ++Number containing the canonical value ++ ++ ++ ++
    ++ ++ ++ ++ ++
    pcdata (value)
    ++
    ++ ++ ++Create valid XML PCDATA from given string. ++ ++ ++ ++

    Parameters

    ++
      ++ ++
    • ++ value: String value containing the data to escape ++
    • ++ ++
    ++ ++ ++ ++ ++ ++ ++

    Return value:

    ++String value containing the escaped data ++ ++ ++ ++
    ++ ++ ++ ++ ++
    perror (obj)
    ++
    ++ ++ ++Write given object to stderr. ++ ++ ++ ++

    Parameters

    ++
      ++ ++
    • ++ obj: Value to write to stderr ++
    • ++ ++
    ++ ++ ++ ++ ++ ++ ++

    Return value:

    ++Boolean indicating whether the write operation was successful ++ ++ ++ ++
    ++ ++ ++ ++ ++
    restore_data (str)
    ++
    ++ ++ ++Restore data previously serialized with serialize_data(). ++ ++ ++ ++

    Parameters

    ++
      ++ ++
    • ++ str: String containing the data to restore ++
    • ++ ++
    ++ ++ ++ ++ ++ ++ ++

    Return value:

    ++Value containing the restored data structure ++ ++ ++ ++

    See also:

    ++ ++ ++
    ++ ++ ++ ++ ++
    serialize_data (val)
    ++
    ++ ++ ++Recursively serialize given data to lua code, suitable for restoring ++ ++with loadstring(). ++ ++ ++

    Parameters

    ++
      ++ ++
    • ++ val: Value containing the data to serialize ++
    • ++ ++
    ++ ++ ++ ++ ++ ++ ++

    Return value:

    ++String value containing the serialized code ++ ++ ++ ++

    See also:

    ++ ++ ++
    ++ ++ ++ ++ ++
    serialize_json (data, writer)
    ++
    ++ ++ ++Convert data structure to JSON ++ ++ ++ ++

    Parameters

    ++
      ++ ++
    • ++ data: The data to serialize ++
    • ++ ++
    • ++ writer: A function to write a chunk of JSON data (optional) ++
    • ++ ++
    ++ ++ ++ ++ ++ ++ ++

    Return value:

    ++String containing the JSON if called without write callback ++ ++ ++ ++
    ++ ++ ++ ++ ++
    spairs (t, f)
    ++
    ++ ++ ++Return a key, value iterator which returns the values sorted according to ++ ++the provided callback function. ++ ++ ++

    Parameters

    ++
      ++ ++
    • ++ t: The table to iterate ++
    • ++ ++
    • ++ f: A callback function to decide the order of elements ++
    • ++ ++
    ++ ++ ++ ++ ++ ++ ++

    Return value:

    ++Function value containing the corresponding iterator ++ ++ ++ ++
    ++ ++ ++ ++ ++
    split (str, pat, max, regex)
    ++
    ++ ++ ++Splits given string on a defined separator sequence and return a table ++ ++containing the resulting substrings. The optional max parameter specifies ++the number of bytes to process, regardless of the actual length of the given ++string. The optional last parameter, regex, specifies whether the separator ++sequence is interpreted as regular expression. ++ ++ ++

    Parameters

    ++
      ++ ++
    • ++ str: String value containing the data to split up ++
    • ++ ++
    • ++ pat: String with separator pattern (optional, defaults to "\n") ++
    • ++ ++
    • ++ max: Maximum times to split (optional) ++
    • ++ ++
    • ++ regex: Boolean indicating whether to interpret the separator ++ pattern as regular expression (optional, default is false) ++
    • ++ ++
    ++ ++ ++ ++ ++ ++ ++

    Return value:

    ++Table containing the resulting substrings ++ ++ ++ ++
    ++ ++ ++ ++ ++
    strip_bytecode (code)
    ++
    ++ ++ ++Strips unnescessary lua bytecode from given string. Information like line ++ ++numbers and debugging numbers will be discarded. Original version by ++Peter Cawley (http://lua-users.org/lists/lua-l/2008-02/msg01158.html) ++ ++ ++

    Parameters

    ++
      ++ ++
    • ++ code: String value containing the original lua byte code ++
    • ++ ++
    ++ ++ ++ ++ ++ ++ ++

    Return value:

    ++String value containing the stripped lua byte code ++ ++ ++ ++
    ++ ++ ++ ++ ++
    striptags (value)
    ++
    ++ ++ ++Strip HTML tags from given string. ++ ++ ++ ++

    Parameters

    ++
      ++ ++
    • ++ value: String containing the HTML text ++
    • ++ ++
    ++ ++ ++ ++ ++ ++ ++

    Return value:

    ++String with HTML tags stripped of ++ ++ ++ ++
    ++ ++ ++ ++ ++
    threadlocal ()
    ++
    ++ ++ ++Create a new or get an already existing thread local store associated with ++ ++the current active coroutine. A thread local store is private a table object ++whose values can't be accessed from outside of the running coroutine. ++ ++ ++ ++ ++ ++ ++ ++

    Return value:

    ++Table value representing the corresponding thread local store ++ ++ ++ ++
    ++ ++ ++ ++ ++
    trim (str)
    ++
    ++ ++ ++Remove leading and trailing whitespace from given string value. ++ ++ ++ ++

    Parameters

    ++
      ++ ++
    • ++ str: String value containing whitespace padded data ++
    • ++ ++
    ++ ++ ++ ++ ++ ++ ++

    Return value:

    ++String value with leading and trailing space removed ++ ++ ++ ++
    ++ ++ ++ ++ ++
    ubus (object, method, values)
    ++
    ++ ++ ++Issue an ubus call. ++ ++ ++ ++

    Parameters

    ++
      ++ ++
    • ++ object: String containing the ubus object to call ++
    • ++ ++
    • ++ method: String containing the ubus method to call ++
    • ++ ++
    • ++ values: Table containing the values to pass ++
    • ++ ++
    ++ ++ ++ ++ ++ ++ ++

    Return value:

    ++Table containin the ubus result ++ ++ ++ ++
    ++ ++ ++ ++ ++
    update (t, updates)
    ++
    ++ ++ ++Update values in given table with the values from the second given table. ++ ++Both table are - in fact - merged together. ++ ++ ++

    Parameters

    ++
      ++ ++
    • ++ t: Table which should be updated ++
    • ++ ++
    • ++ updates: Table containing the values to update ++
    • ++ ++
    ++ ++ ++ ++ ++ ++ ++

    Return value:

    ++Always nil ++ ++ ++ ++
    ++ ++ ++ ++ ++
    vspairs (t)
    ++
    ++ ++ ++Return a key, value iterator for the given table. ++ ++The table pairs are sorted by value. ++ ++ ++

    Parameters

    ++
      ++ ++
    • ++ t: The table to iterate ++
    • ++ ++
    ++ ++ ++ ++ ++ ++ ++

    Return value:

    ++Function value containing the corresponding iterator ++ ++ ++ ++
    ++ ++ ++
    ++ ++ ++ ++ ++ ++
    ++ ++
    ++ ++
    ++

    Valid XHTML 1.0!

    ++
    ++ ++
    ++ ++ +diff --git a/feeds/luci/documentation/api/modules/nixio.CHANGELOG.html b/feeds/luci/documentation/api/modules/nixio.CHANGELOG.html +new file mode 100644 +index 0000000..48bedc8 +--- /dev/null ++++ b/feeds/luci/documentation/api/modules/nixio.CHANGELOG.html +@@ -0,0 +1,290 @@ ++ ++ ++ ++ Reference ++ ++ ++ ++ ++ ++
    ++ ++
    ++ ++
    ++
    ++
    ++ ++
    ++ ++ ++ ++
    ++ ++

    Class nixio.CHANGELOG

    ++ ++

    ++ Changes and improvements.

    ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++

    Tables

    ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
    0.2 ++ Initial Release.
    0.3 ++ Service Release.
    ++ ++ ++ ++
    ++
    ++ ++ ++ ++ ++

    Tables

    ++
    ++ ++
    0.2
    ++
    ++ Initial Release. ++
      ++
    • Initial Release
    • ++
    ++ ++ ++ ++
    ++ ++ ++
    0.3
    ++
    ++ Service Release. ++
      ++
    • Added getifaddrs() function.
    • ++
    • Added getsockopt(), setsockopt(), getsockname() and getpeername() ++ directly to TLS-socket objects unifying the socket interface.
    • ++
    • Added support for CyaSSL as cryptographical backend.
    • ++
    • Added support for x509 certificates in DER format.
    • ++
    • Added support for splice() in UnifiedIO.copyz().
    • ++
    • Added interface to inject chunks into UnifiedIO.linesource() buffer.
    • ++
    • Changed TLS behaviour to explicitely separate servers and clients.
    • ++
    • Fixed usage of signed datatype breaking Base64 decoding.
    • ++
    • Fixed namespace clashes for nixio.fs.
    • ++
    • Fixed splice() support for some exotic C libraries.
    • ++
    • Reconfigure axTLS cryptographical provider and mark it as obsolete.
    • ++
    ++ ++ ++ ++
    ++ ++ ++
    ++ ++ ++ ++
    ++ ++
    ++ ++
    ++

    Valid XHTML 1.0!

    ++
    ++ ++
    ++ ++ +diff --git a/feeds/luci/documentation/api/modules/nixio.CryptoHash.html b/feeds/luci/documentation/api/modules/nixio.CryptoHash.html +new file mode 100644 +index 0000000..6158a77 +--- /dev/null ++++ b/feeds/luci/documentation/api/modules/nixio.CryptoHash.html +@@ -0,0 +1,316 @@ ++ ++ ++ ++ Reference ++ ++ ++ ++ ++ ++
    ++ ++
    ++ ++
    ++
    ++
    ++ ++
    ++ ++ ++ ++
    ++ ++

    Object Instance nixio.CryptoHash

    ++ ++

    ++ Cryptographical Hash and HMAC object.

    ++ ++ ++ ++ ++ ++ ++ ++

    Functions

    ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
    CryptoHash:final () ++ Finalize the hash and return the digest.
    CryptoHash:update (chunk) ++ Add another chunk of data to be hashed.
    ++ ++ ++ ++ ++ ++ ++
    ++
    ++ ++ ++

    Functions

    ++
    ++ ++ ++ ++
    CryptoHash:final ()
    ++
    ++ ++ Finalize the hash and return the digest. ++ ++ ++ ++ ++ ++

    Usage:

    ++You cannot call update on a hash object that was already finalized ++ you can however call final multiple times to get the digest. ++ ++ ++ ++

    Return values:

    ++
      ++ ++
    1. hexdigest ++ ++
    2. buffer containing binary digest ++ ++
    ++ ++ ++ ++
    ++ ++ ++ ++ ++
    CryptoHash:update (chunk)
    ++
    ++ ++ Add another chunk of data to be hashed. ++ ++ ++

    Parameters

    ++
      ++ ++
    • ++ chunk: Chunk of data ++
    • ++ ++
    ++ ++ ++ ++ ++ ++ ++

    Return value:

    ++CryptoHash object (self) ++ ++ ++ ++
    ++ ++ ++
    ++ ++ ++ ++ ++ ++
    ++ ++
    ++ ++
    ++

    Valid XHTML 1.0!

    ++
    ++ ++
    ++ ++ +diff --git a/feeds/luci/documentation/api/modules/nixio.File.html b/feeds/luci/documentation/api/modules/nixio.File.html +new file mode 100644 +index 0000000..d9e67ea +--- /dev/null ++++ b/feeds/luci/documentation/api/modules/nixio.File.html +@@ -0,0 +1,673 @@ ++ ++ ++ ++ Reference ++ ++ ++ ++ ++ ++
    ++ ++
    ++ ++
    ++
    ++
    ++ ++
    ++ ++ ++ ++
    ++ ++

    Object Instance nixio.File

    ++ ++

    ++ Large File Object. ++ Large file operations are supported up to 52 bits if the Lua number type is ++ double (default).

    ++ ++ ++ ++ ++ ++ ++ ++

    Functions

    ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
    File:close () ++ Close the file descriptor.
    File:fileno () ++ Get the number of the filedescriptor.
    File:lock (command, length) ++ Apply or test a lock on the file.
    File:read (length) ++ Read from a file descriptor.
    File:seek (offset, whence) ++ Reposition read / write offset of the file descriptor.
    File:setblocking (blocking) ++ (POSIX) Set the blocking mode of the file descriptor.
    File:stat (field) ++ Get file status and attributes.
    File:sync (data_only) ++ Synchronizes the file with the storage device.
    File:tell () ++ Return the current read / write offset of the file descriptor.
    File:write (buffer, offset, length) ++ Write to the file descriptor.
    ++ ++ ++ ++ ++ ++ ++
    ++
    ++ ++ ++

    Functions

    ++
    ++ ++ ++ ++
    File:close ()
    ++
    ++ ++ Close the file descriptor. ++ ++ ++ ++ ++ ++ ++ ++

    Return value:

    ++true ++ ++ ++ ++
    ++ ++ ++ ++ ++
    File:fileno ()
    ++
    ++ ++ Get the number of the filedescriptor. ++ ++ ++ ++ ++ ++ ++ ++

    Return value:

    ++file descriptor number ++ ++ ++ ++
    ++ ++ ++ ++ ++
    File:lock (command, length)
    ++
    ++ ++ Apply or test a lock on the file. ++ ++ ++

    Parameters

    ++
      ++ ++
    • ++ command: Locking Command ["lock", "tlock", "ulock", "test"] ++
    • ++ ++
    • ++ length: Amount of Bytes to lock from current offset (optional) ++
    • ++ ++
    ++ ++ ++ ++ ++

    Usage

    ++
      ++ ++
    • This function calls lockf() on POSIX and _locking() on Windows. ++ ++
    • The "lock" command is blocking, "tlock" is non-blocking, ++ "ulock" unlocks and "test" only tests for the lock. ++ ++
    • The "test" command is not available on Windows. ++ ++
    • Locks are by default advisory on POSIX, but mandatory on Windows. ++ ++
    ++ ++ ++ ++

    Return value:

    ++true ++ ++ ++ ++
    ++ ++ ++ ++ ++
    File:read (length)
    ++
    ++ ++ Read from a file descriptor. ++ ++ ++

    Parameters

    ++
      ++ ++
    • ++ length: Amount of data to read (in Bytes). ++
    • ++ ++
    ++ ++ ++ ++ ++

    Usage

    ++
      ++ ++
    • Warning: It is not guaranteed that all requested data ++ is read at once especially when dealing with pipes. ++ You have to check the return value - the length of the buffer actually read - ++ or use the safe IO functions in the high-level IO utility module. ++ ++
    • The length of the return buffer is limited by the (compile time) ++ nixio buffersize which is nixio.const.buffersize (8192 by default). ++ Any read request greater than that will be safely truncated to this value. ++ ++
    ++ ++ ++ ++

    Return value:

    ++buffer containing data successfully read ++ ++ ++ ++
    ++ ++ ++ ++ ++
    File:seek (offset, whence)
    ++
    ++ ++ Reposition read / write offset of the file descriptor. ++ The seek will be done either from the beginning of the file or relative ++ to the current position or relative to the end. ++ ++ ++

    Parameters

    ++
      ++ ++
    • ++ offset: File Offset ++
    • ++ ++
    • ++ whence: Starting point ["set", "cur", "end"] ++
    • ++ ++
    ++ ++ ++ ++ ++

    Usage:

    ++This function calls lseek(). ++ ++ ++ ++

    Return value:

    ++new (absolute) offset position ++ ++ ++ ++
    ++ ++ ++ ++ ++
    File:setblocking (blocking)
    ++
    ++ ++ (POSIX) Set the blocking mode of the file descriptor. ++ ++ ++

    Parameters

    ++
      ++ ++
    • ++ blocking: (boolean) ++
    • ++ ++
    ++ ++ ++ ++ ++ ++ ++

    Return value:

    ++true ++ ++ ++ ++
    ++ ++ ++ ++ ++
    File:stat (field)
    ++
    ++ ++ Get file status and attributes. ++ ++ ++

    Parameters

    ++
      ++ ++
    • ++ field: Only return a specific field, not the whole table (optional) ++
    • ++ ++
    ++ ++ ++ ++ ++

    Usage:

    ++This function calls fstat(). ++ ++ ++ ++

    Return value:

    ++Table containing:
      ++
    • atime = Last access timestamp
    • ++
    • blksize = Blocksize (POSIX only)
    • ++
    • blocks = Blocks used (POSIX only)
    • ++
    • ctime = Creation timestamp
    • ++
    • dev = Device ID
    • ++
    • gid = Group ID
    • ++
    • ino = Inode
    • ++
    • modedec = Mode converted into a decimal number
    • ++
    • modestr = Mode as string as returned by ls -l
    • ++
    • mtime = Last modification timestamp
    • ++
    • nlink = Number of links
    • ++
    • rdev = Device ID (if special file)
    • ++
    • size = Size in bytes
    • ++
    • type = ["reg", "dir", "chr", "blk", "fifo", "lnk", "sock"]
    • ++
    • uid = User ID
    • ++
    ++ ++ ++ ++
    ++ ++ ++ ++ ++
    File:sync (data_only)
    ++
    ++ ++ Synchronizes the file with the storage device. ++ Returns when the file is successfully written to the disk. ++ ++ ++

    Parameters

    ++
      ++ ++
    • ++ data_only: Do not synchronize the metadata. (optional, boolean) ++
    • ++ ++
    ++ ++ ++ ++ ++

    Usage

    ++
      ++ ++
    • This function calls fsync() when data_only equals false ++ otherwise fdatasync(), on Windows _commit() is used instead. ++ ++
    • fdatasync() is only supported by Linux and Solaris. For other systems ++ the data_only parameter is ignored and fsync() is always called. ++ ++
    ++ ++ ++ ++

    Return value:

    ++true ++ ++ ++ ++
    ++ ++ ++ ++ ++
    File:tell ()
    ++
    ++ ++ Return the current read / write offset of the file descriptor. ++ ++ ++ ++ ++ ++

    Usage:

    ++This function calls lseek() with offset 0 from the current position. ++ ++ ++ ++

    Return value:

    ++offset position ++ ++ ++ ++
    ++ ++ ++ ++ ++
    File:write (buffer, offset, length)
    ++
    ++ ++ Write to the file descriptor. ++ ++ ++

    Parameters

    ++
      ++ ++
    • ++ buffer: Buffer holding the data to be written. ++
    • ++ ++
    • ++ offset: Offset to start reading the buffer from. (optional) ++
    • ++ ++
    • ++ length: Length of chunk to read from the buffer. (optional) ++
    • ++ ++
    ++ ++ ++ ++ ++

    Usage

    ++
      ++ ++
    • Warning: It is not guaranteed that all data ++ in the buffer is written at once especially when dealing with pipes. ++ You have to check the return value - the number of bytes actually written - ++ or use the safe IO functions in the high-level IO utility module. ++ ++
    • Unlike standard Lua indexing the lowest offset and default is 0. ++ ++
    ++ ++ ++ ++

    Return value:

    ++number of bytes written ++ ++ ++ ++
    ++ ++ ++
    ++ ++ ++ ++ ++ ++
    ++ ++
    ++ ++
    ++

    Valid XHTML 1.0!

    ++
    ++ ++
    ++ ++ +diff --git a/feeds/luci/documentation/api/modules/nixio.README.html b/feeds/luci/documentation/api/modules/nixio.README.html +new file mode 100644 +index 0000000..a8da0f3 +--- /dev/null ++++ b/feeds/luci/documentation/api/modules/nixio.README.html +@@ -0,0 +1,374 @@ ++ ++ ++ ++ Reference ++ ++ ++ ++ ++ ++
    ++ ++
    ++ ++
    ++
    ++
    ++ ++
    ++ ++ ++ ++
    ++ ++

    Class nixio.README

    ++ ++

    ++ General Information.

    ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++

    Tables

    ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
    Errorhandling ++ General error handling information.
    Functions ++ Function conventions.
    Platforms ++ Platform information.
    TLS-Crypto ++ Cryptography and TLS libraries.
    ++ ++ ++ ++
    ++
    ++ ++ ++ ++ ++

    Tables

    ++
    ++ ++
    Errorhandling
    ++
    ++ General error handling information. ++
      ++
    • Most of the functions available in this library may fail. If any error ++ occurs the function returns nil or false, an error code ++ (usually errno) and an additional error message text (if avaialable).
    • ++
    • At the moment false is only returned when a non-blocking I/O function ++ fails with EAGAIN, EWOULDBLOCK or WSAEWOULDBLOCK for any others nil is ++ returned as first parameter. Therefore you can use false to write portable ++ non-blocking I/O applications.
    • ++
    • Note that the function documentation does only mention the return values ++ in case of a successful operation.
    • ++
    • You can find a table of common error numbers and other useful constants ++ like signal numbers in nixio.const e.g. nixio.const.EINVAL, ++ nixio.const.SIGTERM, etc. For portability there is a second error constant ++ table nixio.const_sock for socket error codes. This might ++ be important if you are dealing with Windows applications, on POSIX however ++ const_sock is just an alias for const.
    • ++
    • With some exceptions - which are explicitely stated in the function ++ documentation - all blocking functions are signal-protected and will not fail ++ with EINTR.
    • ++
    • On POSIX the SIGPIPE signal will be set to ignore upon initialization. ++ You should restore the default behaviour or set a custom signal handler ++ in your program after loading nixio if you need this behaviour.
    • ++
    ++ ++ ++ ++
    ++ ++ ++
    Functions
    ++
    ++ Function conventions. ++
    In general all functions are namend and behave like their POSIX API ++ counterparts - where applicable - applying the following rules: ++
      ++
    • Functions should be named like the underlying POSIX API function ommiting ++ prefixes or suffixes - especially when placed in an object-context ( ++ lockf -> File:lock, fsync -> File:sync, dup2 -> dup, ...)
    • ++
    • If you are unclear about the behaviour of a function you should consult ++ your OS API documentation (e.g. the manpages).
    • ++
    • If the name is significantly different from the POSIX-function, the ++ underlying function(s) are stated in the documentation.
    • ++
    • Parameters should reflect those of the C-API, buffer length arguments and ++ by-reference parameters should be ommitted for pratical purposes.
    • ++
    • If a C function accepts a bitfield as parameter, it should be translated ++ into lower case string flags representing the flags if the bitfield is the ++ last parameter and also ommiting prefixes or suffixes. (e.g. waitpid ++ (pid, &s, WNOHANG | WUNTRACED) -> waitpid(pid, "nohang", "untraced"), ++ getsockopt(fd, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt)) -> ++ Socket:getopt("socket", "reuseaddr"), etc.)
    • ++
    • If it is not applicable to provide a string representation of the ++ bitfield a bitfield generator helper is provided. It is named FUNCTION_flags. ++ (open("/tmp/test", O_RDONLY | O_NONBLOCK) -> open("/tmp/test", open_flags( ++ "rdonly", "nonblock")))
    • ++
    ++ ++ ++ ++
    ++ ++ ++
    Platforms
    ++
    ++ Platform information. ++
      ++
    • The minimum platform requirements are a decent POSIX 2001 support. ++ Builds are more or less tested on Linux, Solaris and FreeBSD. Builds for ++ Windows XP SP1 and later can be compiled with MinGW either from Windows ++ itself or using the MinGW cross-compiler. Earlier versions of Windows are not ++ supported.
    • ++
    • In general all functions which don't have any remarks ++ in their documentation are available on all platforms.
    • ++
    • Functions with a (POSIX), (Linux) or similar prefix are only available ++ on these specific platforms. Same appplies to parameters of functions ++ with a similar suffix.
    • ++
    • Some functions might have limitations on some platforms. This should ++ be stated in the documentation. Please also consult your OS API ++ documentation.
    • ++
    ++ ++ ++ ++
    ++ ++ ++
    TLS-Crypto
    ++
    ++ Cryptography and TLS libraries. ++
      ++
    • Currently 3 underlying cryptography libraries are supported: openssl, ++ cyassl and axTLS. The name of the library in use is written to ++ nixio.tls_provider
    • ++
    • You should whenever possible use openssl or cyassl as axTLS has only ++ limited support. It does not provide support for non-blocking sockets and ++ is probably less audited than the other ones.
    • ++
    • As the supported Windows versions are not suitable for embedded devices ++ axTLS is at the moment not supported on Windows.
    • ++
    ++ ++ ++ ++
    ++ ++ ++
    ++ ++ ++ ++
    ++ ++
    ++ ++
    ++

    Valid XHTML 1.0!

    ++
    ++ ++
    ++ ++ +diff --git a/feeds/luci/documentation/api/modules/nixio.Socket.html b/feeds/luci/documentation/api/modules/nixio.Socket.html +new file mode 100644 +index 0000000..105682c +--- /dev/null ++++ b/feeds/luci/documentation/api/modules/nixio.Socket.html +@@ -0,0 +1,1033 @@ ++ ++ ++ ++ Reference ++ ++ ++ ++ ++ ++
    ++ ++
    ++ ++
    ++
    ++
    ++ ++
    ++ ++ ++ ++
    ++ ++

    Object Instance nixio.Socket

    ++ ++

    ++ Socket Object. ++ Supports IPv4, IPv6 and UNIX (POSIX only) families.

    ++ ++ ++ ++ ++ ++ ++ ++

    Functions

    ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
    Socket:accept () ++ Accept a connection on the socket.
    Socket:bind (host, port) ++ Bind the socket to a network address.
    Socket:close () ++ Close the socket.
    Socket:connect (host, port) ++ Connect the socket to a network address.
    Socket:fileno () ++ Get the number of the filedescriptor.
    Socket:getopt (level, option) ++ Get a socket option.
    Socket:getpeername () ++ Get the peer address of a socket.
    Socket:getsockname () ++ Get the local address of a socket.
    Socket:listen (backlog) ++ Listen for connections on the socket.
    Socket:read  (length) ++ Receive a message on the socket (This is an alias for recv).
    Socket:recv  (length) ++ Receive a message on the socket.
    Socket:recvfrom (length) ++ Receive a message on the socket including the senders source address.
    Socket:send (buffer, offset, length) ++ Send a message on the socket.
    Socket:sendto (buffer, host, port, offset, length) ++ Send a message on the socket specifying the destination.
    Socket:setblocking (blocking) ++ Set the blocking mode of the socket.
    Socket:setopt (level, option, value) ++ Set a socket option.
    Socket:shutdown (how) ++ Shut down part of a full-duplex connection.
    Socket:write (buffer, offset, length) ++ Send a message on the socket (This is an alias for send).
    ++ ++ ++ ++ ++ ++ ++
    ++
    ++ ++ ++

    Functions

    ++
    ++ ++ ++ ++
    Socket:accept ()
    ++
    ++ ++ Accept a connection on the socket. ++ ++ ++ ++ ++ ++ ++ ++

    Return values:

    ++
      ++ ++
    1. Socket Object ++ ++
    2. Peer IP-Address ++ ++
    3. Peer Port ++ ++
    ++ ++ ++ ++
    ++ ++ ++ ++ ++
    Socket:bind (host, port)
    ++
    ++ ++ Bind the socket to a network address. ++ ++ ++

    Parameters

    ++
      ++ ++
    • ++ host: Host (optional, default: all addresses) ++
    • ++ ++
    • ++ port: Port or service description ++
    • ++ ++
    ++ ++ ++ ++ ++

    Usage

    ++
      ++ ++
    • This function calls getaddrinfo() and bind() but NOT listen(). ++ ++
    • If host is a domain name it will be looked up and bind() ++ tries the IP-Addresses in the order returned by the DNS resolver ++ until the bind succeeds. ++ ++
    • UNIX sockets ignore the port, ++ and interpret host as a socket path. ++ ++
    ++ ++ ++ ++

    Return value:

    ++true ++ ++ ++ ++
    ++ ++ ++ ++ ++
    Socket:close ()
    ++
    ++ ++ Close the socket. ++ ++ ++ ++ ++ ++ ++ ++

    Return value:

    ++true ++ ++ ++ ++
    ++ ++ ++ ++ ++
    Socket:connect (host, port)
    ++
    ++ ++ Connect the socket to a network address. ++ ++ ++

    Parameters

    ++
      ++ ++
    • ++ host: Hostname or IP-Address (optional, default: localhost) ++
    • ++ ++
    • ++ port: Port or service description ++
    • ++ ++
    ++ ++ ++ ++ ++

    Usage

    ++
      ++ ++
    • This function calls getaddrinfo() and connect(). ++ ++
    • If host is a domain name it will be looked up and connect() ++ tries the IP-Addresses in the order returned by the DNS resolver ++ until the connect succeeds. ++ ++
    • UNIX sockets ignore the port, ++ and interpret host as a socket path. ++ ++
    ++ ++ ++ ++

    Return value:

    ++true ++ ++ ++ ++
    ++ ++ ++ ++ ++
    Socket:fileno ()
    ++
    ++ ++ Get the number of the filedescriptor. ++ ++ ++ ++ ++ ++ ++ ++

    Return value:

    ++file descriptor number ++ ++ ++ ++
    ++ ++ ++ ++ ++
    Socket:getopt (level, option)
    ++
    ++ ++ Get a socket option. ++ ++ ++

    Parameters

    ++
      ++ ++
    • ++ level: Level ["socket", "tcp", "ip", "ipv6"] ++
    • ++ ++
    • ++ option: Option ["keepalive", "reuseaddr", "sndbuf", "rcvbuf", ++ "priority", "broadcast", "linger", "sndtimeo", "rcvtimeo", "dontroute", ++ "bindtodevice", "error", "oobinline", "cork" (TCP), "nodelay" (TCP), ++ "mtu" (IP, IPv6), "hdrincl" (IP), "multicast_ttl" (IP), "multicast_loop" ++ (IP, IPv6), "multicast_if" (IP, IPv6), "v6only" (IPv6), "multicast_hops" ++ (IPv6), "add_membership" (IP, IPv6), "drop_membership" (IP, IPv6)] ++
    • ++ ++
    ++ ++ ++ ++ ++ ++ ++

    Return value:

    ++Value ++ ++ ++ ++
    ++ ++ ++ ++ ++
    Socket:getpeername ()
    ++
    ++ ++ Get the peer address of a socket. ++ ++ ++ ++ ++ ++ ++ ++

    Return values:

    ++
      ++ ++
    1. IP-Address ++ ++
    2. Port ++ ++
    ++ ++ ++ ++
    ++ ++ ++ ++ ++
    Socket:getsockname ()
    ++
    ++ ++ Get the local address of a socket. ++ ++ ++ ++ ++ ++ ++ ++

    Return values:

    ++
      ++ ++
    1. IP-Address ++ ++
    2. Port ++ ++
    ++ ++ ++ ++
    ++ ++ ++ ++ ++
    Socket:listen (backlog)
    ++
    ++ ++ Listen for connections on the socket. ++ ++ ++

    Parameters

    ++
      ++ ++
    • ++ backlog: Length of queue for pending connections ++
    • ++ ++
    ++ ++ ++ ++ ++ ++ ++

    Return value:

    ++true ++ ++ ++ ++
    ++ ++ ++ ++ ++
    Socket:read  (length)
    ++
    ++ ++ Receive a message on the socket (This is an alias for recv). ++ See the recvfrom description for more details. ++ ++ ++

    Parameters

    ++
      ++ ++
    • ++ length: Amount of data to read (in Bytes). ++
    • ++ ++
    ++ ++ ++ ++ ++ ++ ++

    Return value:

    ++buffer containing data successfully read ++ ++ ++ ++

    See also:

    ++ ++ ++
    ++ ++ ++ ++ ++
    Socket:recv  (length)
    ++
    ++ ++ Receive a message on the socket. ++ This function is identical to recvfrom except that it does not return ++ the sender's source address. See the recvfrom description for more details. ++ ++ ++

    Parameters

    ++
      ++ ++
    • ++ length: Amount of data to read (in Bytes). ++
    • ++ ++
    ++ ++ ++ ++ ++ ++ ++

    Return value:

    ++buffer containing data successfully read ++ ++ ++ ++

    See also:

    ++ ++ ++
    ++ ++ ++ ++ ++
    Socket:recvfrom (length)
    ++
    ++ ++ Receive a message on the socket including the senders source address. ++ ++ ++

    Parameters

    ++
      ++ ++
    • ++ length: Amount of data to read (in Bytes). ++
    • ++ ++
    ++ ++ ++ ++ ++

    Usage

    ++
      ++ ++
    • Warning: It is not guaranteed that all requested data ++ is read at once. ++ You have to check the return value - the length of the buffer actually read - ++ or use the safe IO functions in the high-level IO utility module. ++ ++
    • The length of the return buffer is limited by the (compile time) ++ nixio buffersize which is nixio.const.buffersize (8192 by default). ++ Any read request greater than that will be safely truncated to this value. ++ ++
    ++ ++ ++ ++

    Return values:

    ++
      ++ ++
    1. buffer containing data successfully read ++ ++
    2. host IP-Address of the sender ++ ++
    3. port Port of the sender ++ ++
    ++ ++ ++ ++
    ++ ++ ++ ++ ++
    Socket:send (buffer, offset, length)
    ++
    ++ ++ Send a message on the socket. ++ This function is identical to sendto except for the missing destination ++ paramters. See the sendto description for a detailed description. ++ ++ ++

    Parameters

    ++
      ++ ++
    • ++ buffer: Buffer holding the data to be written. ++
    • ++ ++
    • ++ offset: Offset to start reading the buffer from. (optional) ++
    • ++ ++
    • ++ length: Length of chunk to read from the buffer. (optional) ++
    • ++ ++
    ++ ++ ++ ++ ++ ++ ++

    Return value:

    ++number of bytes written ++ ++ ++ ++

    See also:

    ++ ++ ++
    ++ ++ ++ ++ ++
    Socket:sendto (buffer, host, port, offset, length)
    ++
    ++ ++ Send a message on the socket specifying the destination. ++ ++ ++

    Parameters

    ++
      ++ ++
    • ++ buffer: Buffer holding the data to be written. ++
    • ++ ++
    • ++ host: Target IP-Address ++
    • ++ ++
    • ++ port: Target Port ++
    • ++ ++
    • ++ offset: Offset to start reading the buffer from. (optional) ++
    • ++ ++
    • ++ length: Length of chunk to read from the buffer. (optional) ++
    • ++ ++
    ++ ++ ++ ++ ++

    Usage

    ++
      ++ ++
    • Warning: It is not guaranteed that all data ++ in the buffer is written at once. ++ You have to check the return value - the number of bytes actually written - ++ or use the safe IO functions in the high-level IO utility module. ++ ++
    • Unlike standard Lua indexing the lowest offset and default is 0. ++ ++
    ++ ++ ++ ++

    Return value:

    ++number of bytes written ++ ++ ++ ++
    ++ ++ ++ ++ ++
    Socket:setblocking (blocking)
    ++
    ++ ++ Set the blocking mode of the socket. ++ ++ ++

    Parameters

    ++
      ++ ++
    • ++ blocking: (boolean) ++
    • ++ ++
    ++ ++ ++ ++ ++ ++ ++

    Return value:

    ++true ++ ++ ++ ++
    ++ ++ ++ ++ ++
    Socket:setopt (level, option, value)
    ++
    ++ ++ Set a socket option. ++ ++ ++

    Parameters

    ++
      ++ ++
    • ++ level: Level ["socket", "tcp", "ip", "ipv6"] ++
    • ++ ++
    • ++ option: Option ["keepalive", "reuseaddr", "sndbuf", "rcvbuf", ++ "priority", "broadcast", "linger", "sndtimeo", "rcvtimeo", "dontroute", ++ "bindtodevice", "error", "oobinline", "cork" (TCP), "nodelay" (TCP), ++ "mtu" (IP, IPv6), "hdrincl" (IP), "multicast_ttl" (IP), "multicast_loop" ++ (IP, IPv6), "multicast_if" (IP, IPv6), "v6only" (IPv6), "multicast_hops" ++ (IPv6), "add_membership" (IP, IPv6), "drop_membership" (IP, IPv6)] ++
    • ++ ++
    • ++ value: Value ++
    • ++ ++
    ++ ++ ++ ++ ++ ++ ++

    Return value:

    ++true ++ ++ ++ ++
    ++ ++ ++ ++ ++
    Socket:shutdown (how)
    ++
    ++ ++ Shut down part of a full-duplex connection. ++ ++ ++

    Parameters

    ++
      ++ ++
    • ++ how: (optional, default: rdwr) ["rdwr", "rd", "wr"] ++
    • ++ ++
    ++ ++ ++ ++ ++ ++ ++

    Return value:

    ++true ++ ++ ++ ++
    ++ ++ ++ ++ ++
    Socket:write (buffer, offset, length)
    ++
    ++ ++ Send a message on the socket (This is an alias for send). ++ See the sendto description for a detailed description. ++ ++ ++

    Parameters

    ++
      ++ ++
    • ++ buffer: Buffer holding the data to be written. ++
    • ++ ++
    • ++ offset: Offset to start reading the buffer from. (optional) ++
    • ++ ++
    • ++ length: Length of chunk to read from the buffer. (optional) ++
    • ++ ++
    ++ ++ ++ ++ ++ ++ ++

    Return value:

    ++number of bytes written ++ ++ ++ ++

    See also:

    ++ ++ ++
    ++ ++ ++
    ++ ++ ++ ++ ++ ++
    ++ ++
    ++ ++
    ++

    Valid XHTML 1.0!

    ++
    ++ ++
    ++ ++ +diff --git a/feeds/luci/documentation/api/modules/nixio.TLSContext.html b/feeds/luci/documentation/api/modules/nixio.TLSContext.html +new file mode 100644 +index 0000000..a91b1ee +--- /dev/null ++++ b/feeds/luci/documentation/api/modules/nixio.TLSContext.html +@@ -0,0 +1,479 @@ ++ ++ ++ ++ Reference ++ ++ ++ ++ ++ ++
    ++ ++
    ++ ++
    ++
    ++
    ++ ++
    ++ ++ ++ ++
    ++ ++

    Object Instance nixio.TLSContext

    ++ ++

    ++ Transport Layer Security Context Object.

    ++ ++ ++ ++ ++ ++ ++ ++

    Functions

    ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
    TLSContext:create (socket) ++ Create a TLS Socket from a socket descriptor.
    TLSContext:set_cert (path) ++ Assign a PEM certificate to this context.
    TLSContext:set_ciphers (cipherlist) ++ Set the available ciphers for this context.
    TLSContext:set_key (path) ++ Assign a PEM private key to this context.
    TLSContext:set_verify (flag1, ...) ++ Set the verification flags of this context.
    TLSContext:set_verify_depth (depth) ++ Set the verification depth of this context.
    ++ ++ ++ ++ ++ ++ ++
    ++
    ++ ++ ++

    Functions

    ++
    ++ ++ ++ ++
    TLSContext:create (socket)
    ++
    ++ ++ Create a TLS Socket from a socket descriptor. ++ ++ ++

    Parameters

    ++
      ++ ++
    • ++ socket: Socket Object ++
    • ++ ++
    ++ ++ ++ ++ ++ ++ ++

    Return value:

    ++TLSSocket Object ++ ++ ++ ++
    ++ ++ ++ ++ ++
    TLSContext:set_cert (path)
    ++
    ++ ++ Assign a PEM certificate to this context. ++ ++ ++

    Parameters

    ++
      ++ ++
    • ++ path: Certificate File path ++
    • ++ ++
    ++ ++ ++ ++ ++

    Usage:

    ++This function calls SSL_CTX_use_certificate_chain_file(). ++ ++ ++ ++

    Return value:

    ++true ++ ++ ++ ++
    ++ ++ ++ ++ ++
    TLSContext:set_ciphers (cipherlist)
    ++
    ++ ++ Set the available ciphers for this context. ++ ++ ++

    Parameters

    ++
      ++ ++
    • ++ cipherlist: String containing a list of ciphers ++
    • ++ ++
    ++ ++ ++ ++ ++

    Usage:

    ++This function calls SSL_CTX_set_cipher_list(). ++ ++ ++ ++

    Return value:

    ++true ++ ++ ++ ++
    ++ ++ ++ ++ ++
    TLSContext:set_key (path)
    ++
    ++ ++ Assign a PEM private key to this context. ++ ++ ++

    Parameters

    ++
      ++ ++
    • ++ path: Private Key File path ++
    • ++ ++
    ++ ++ ++ ++ ++

    Usage:

    ++This function calls SSL_CTX_use_PrivateKey_file(). ++ ++ ++ ++

    Return value:

    ++true ++ ++ ++ ++
    ++ ++ ++ ++ ++
    TLSContext:set_verify (flag1, ...)
    ++
    ++ ++ Set the verification flags of this context. ++ ++ ++

    Parameters

    ++
      ++ ++
    • ++ flag1: First Flag ["none", "peer", "verify_fail_if_no_peer_cert", ++ "client_once"] ++
    • ++ ++
    • ++ ...: More Flags [-"-] ++
    • ++ ++
    ++ ++ ++ ++ ++

    Usage:

    ++This function calls SSL_CTX_set_verify(). ++ ++ ++ ++

    Return value:

    ++true ++ ++ ++ ++
    ++ ++ ++ ++ ++
    TLSContext:set_verify_depth (depth)
    ++
    ++ ++ Set the verification depth of this context. ++ ++ ++

    Parameters

    ++
      ++ ++
    • ++ depth: Depth ++
    • ++ ++
    ++ ++ ++ ++ ++

    Usage:

    ++This function calls SSL_CTX_set_verify_depth(). ++ ++ ++ ++

    Return value:

    ++true ++ ++ ++ ++
    ++ ++ ++
    ++ ++ ++ ++ ++ ++
    ++ ++
    ++ ++
    ++

    Valid XHTML 1.0!

    ++
    ++ ++
    ++ ++ +diff --git a/feeds/luci/documentation/api/modules/nixio.TLSSocket.html b/feeds/luci/documentation/api/modules/nixio.TLSSocket.html +new file mode 100644 +index 0000000..3d99a64 +--- /dev/null ++++ b/feeds/luci/documentation/api/modules/nixio.TLSSocket.html +@@ -0,0 +1,575 @@ ++ ++ ++ ++ Reference ++ ++ ++ ++ ++ ++
    ++ ++
    ++ ++
    ++
    ++
    ++ ++
    ++ ++ ++ ++
    ++ ++

    Object Instance nixio.TLSSocket

    ++ ++

    ++ TLS Socket Object. ++ TLS Sockets contain the underlying socket and context in the fields ++ "socket" and "context".

    ++ ++ ++ ++ ++ ++ ++ ++

    Functions

    ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
    TLSSocket:accept () ++ Wait for a TLS handshake from a client.
    TLSSocket:connect () ++ Initiate the TLS handshake as client with the server.
    TLSSocket:read  (length) ++ Receive a message on the socket (This is an alias for recv).
    TLSSocket:recv (length) ++ Receive a message on the socket.
    TLSSocket:send (buffer, offset, length) ++ Send a message to the socket.
    TLSSocket:shutdown () ++ Shut down the TLS connection.
    TLSSocket:write (buffer, offset, length) ++ Send a message on the socket (This is an alias for send).
    ++ ++ ++ ++ ++ ++ ++
    ++
    ++ ++ ++

    Functions

    ++
    ++ ++ ++ ++
    TLSSocket:accept ()
    ++
    ++ ++ Wait for a TLS handshake from a client. ++ ++ ++ ++ ++ ++

    Usage

    ++
      ++ ++
    • This function calls SSL_accept(). ++ ++
    • You have to call either connect or accept before transmitting data. ++ ++
    ++ ++ ++ ++

    Return value:

    ++true ++ ++ ++ ++

    See also:

    ++ ++ ++
    ++ ++ ++ ++ ++
    TLSSocket:connect ()
    ++
    ++ ++ Initiate the TLS handshake as client with the server. ++ ++ ++ ++ ++ ++

    Usage

    ++
      ++ ++
    • This function calls SSL_connect(). ++ ++
    • You have to call either connect or accept before transmitting data. ++ ++
    ++ ++ ++ ++

    Return value:

    ++true ++ ++ ++ ++

    See also:

    ++ ++ ++
    ++ ++ ++ ++ ++
    TLSSocket:read  (length)
    ++
    ++ ++ Receive a message on the socket (This is an alias for recv). ++ See the recv description for more details. ++ ++ ++

    Parameters

    ++
      ++ ++
    • ++ length: Amount of data to read (in Bytes). ++
    • ++ ++
    ++ ++ ++ ++ ++ ++ ++

    Return value:

    ++buffer containing data successfully read ++ ++ ++ ++

    See also:

    ++ ++ ++
    ++ ++ ++ ++ ++
    TLSSocket:recv (length)
    ++
    ++ ++ Receive a message on the socket. ++ ++ ++

    Parameters

    ++
      ++ ++
    • ++ length: Amount of data to read (in Bytes). ++
    • ++ ++
    ++ ++ ++ ++ ++

    Usage

    ++
      ++ ++
    • This function calls SSL_read(). ++ ++
    • Warning: It is not guaranteed that all requested data ++ is read at once. ++ You have to check the return value - the length of the buffer actually read - ++ or use the safe IO functions in the high-level IO utility module. ++ ++
    • The length of the return buffer is limited by the (compile time) ++ nixio buffersize which is nixio.const.buffersize (8192 by default). ++ Any read request greater than that will be safely truncated to this value. ++ ++
    ++ ++ ++ ++

    Return value:

    ++buffer containing data successfully read ++ ++ ++ ++
    ++ ++ ++ ++ ++
    TLSSocket:send (buffer, offset, length)
    ++
    ++ ++ Send a message to the socket. ++ ++ ++

    Parameters

    ++
      ++ ++
    • ++ buffer: Buffer holding the data to be written. ++
    • ++ ++
    • ++ offset: Offset to start reading the buffer from. (optional) ++
    • ++ ++
    • ++ length: Length of chunk to read from the buffer. (optional) ++
    • ++ ++
    ++ ++ ++ ++ ++

    Usage

    ++
      ++ ++
    • This function calls SSL_write(). ++ ++
    • Warning: It is not guaranteed that all data ++ in the buffer is written at once. ++ You have to check the return value - the number of bytes actually written - ++ or use the safe IO functions in the high-level IO utility module. ++ ++
    • Unlike standard Lua indexing the lowest offset and default is 0. ++ ++
    ++ ++ ++ ++

    Return value:

    ++number of bytes written ++ ++ ++ ++
    ++ ++ ++ ++ ++
    TLSSocket:shutdown ()
    ++
    ++ ++ Shut down the TLS connection. ++ ++ ++ ++ ++ ++

    Usage:

    ++This function calls SSL_shutdown(). ++ ++ ++ ++

    Return value:

    ++true ++ ++ ++ ++
    ++ ++ ++ ++ ++
    TLSSocket:write (buffer, offset, length)
    ++
    ++ ++ Send a message on the socket (This is an alias for send). ++ See the send description for a detailed description. ++ ++ ++

    Parameters

    ++
      ++ ++
    • ++ buffer: Buffer holding the data to be written. ++
    • ++ ++
    • ++ offset: Offset to start reading the buffer from. (optional) ++
    • ++ ++
    • ++ length: Length of chunk to read from the buffer. (optional) ++
    • ++ ++
    ++ ++ ++ ++ ++ ++ ++

    Return value:

    ++number of bytes written ++ ++ ++ ++

    See also:

    ++ ++ ++
    ++ ++ ++
    ++ ++ ++ ++ ++ ++
    ++ ++
    ++ ++
    ++

    Valid XHTML 1.0!

    ++
    ++ ++
    ++ ++ +diff --git a/feeds/luci/documentation/api/modules/nixio.UnifiedIO.html b/feeds/luci/documentation/api/modules/nixio.UnifiedIO.html +new file mode 100644 +index 0000000..22e6e91 +--- /dev/null ++++ b/feeds/luci/documentation/api/modules/nixio.UnifiedIO.html +@@ -0,0 +1,767 @@ ++ ++ ++ ++ Reference ++ ++ ++ ++ ++ ++
    ++ ++
    ++ ++
    ++
    ++
    ++ ++
    ++ ++ ++ ++
    ++ ++

    Object Instance nixio.UnifiedIO

    ++ ++

    ++ Unified high-level I/O utility API for Files, Sockets and TLS-Sockets. ++ These functions are added to the object function tables by doing ++ require "nixio.util", can be used on all nixio IO Descriptors and ++ are based on the shared low-level read() and write() functions.

    ++ ++ ++ ++ ++ ++ ++ ++

    Functions

    ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
    UnifiedIO:blocksource (blocksize, limit) ++ Create a block-based iterator.
    UnifiedIO:close () ++ Close the descriptor.
    UnifiedIO:copy (fdout, size) ++ Copy data from the current descriptor to another one.
    UnifiedIO:copyz (fdout, size) ++ Copy data from the current descriptor to another one using kernel-space ++ copying if possible.
    UnifiedIO:is_file () ++ Test whether the I/O-Descriptor is a file.
    UnifiedIO:is_socket () ++ Test whether the I/O-Descriptor is a socket.
    UnifiedIO:is_tls_socket () ++ Test whether the I/O-Descriptor is a TLS socket.
    UnifiedIO:linesource (limit) ++ Create a line-based iterator.
    UnifiedIO:readall (length) ++ Read a block of data and wait until all data is available.
    UnifiedIO:sink (close_when_done) ++ Create a sink.
    UnifiedIO:writeall (block) ++ Write a block of data and wait until all data is written.
    ++ ++ ++ ++ ++ ++ ++
    ++
    ++ ++ ++

    Functions

    ++
    ++ ++ ++ ++
    UnifiedIO:blocksource (blocksize, limit)
    ++
    ++ ++ Create a block-based iterator. ++ ++ ++

    Parameters

    ++
      ++ ++
    • ++ blocksize: Advisory blocksize (optional) ++
    • ++ ++
    • ++ limit: Amount of data to consume (optional) ++
    • ++ ++
    ++ ++ ++ ++ ++

    Usage

    ++
      ++ ++
    • This function uses the low-level read function of the descriptor. ++ ++
    • The blocksize given is only advisory and to be seen as an upper limit, ++ if an underlying read returns less bytes the chunk is nevertheless returned. ++ ++
    • If the limit parameter is ommited, the iterator returns data ++ until an end-of-file, end-of-stream, connection shutdown or similar happens. ++ ++
    • The iterator will not buffer so it is safe to mix with calls to read. ++ ++
    • If the descriptor is non-blocking the iterator may fail with EAGAIN. ++ ++
    • The iterator can be used as an LTN12 source. ++ ++
    ++ ++ ++ ++

    Return value:

    ++Block-based Iterator ++ ++ ++ ++
    ++ ++ ++ ++ ++
    UnifiedIO:close ()
    ++
    ++ ++ Close the descriptor. ++ ++ ++ ++ ++ ++

    Usage:

    ++If the descriptor is a TLS-socket the underlying descriptor is ++ closed without touching the TLS connection. ++ ++ ++ ++

    Return value:

    ++true ++ ++ ++ ++
    ++ ++ ++ ++ ++
    UnifiedIO:copy (fdout, size)
    ++
    ++ ++ Copy data from the current descriptor to another one. ++ ++ ++

    Parameters

    ++
      ++ ++
    • ++ fdout: Target Descriptor ++
    • ++ ++
    • ++ size: Bytes to copy (optional) ++
    • ++ ++
    ++ ++ ++ ++ ++

    Usage

    ++
      ++ ++
    • This function uses the blocksource function of the source descriptor ++ and the sink function of the target descriptor. ++ ++
    • If the limit parameter is ommited, data is copied ++ until an end-of-file, end-of-stream, connection shutdown or similar happens. ++ ++
    • If the descriptor is non-blocking the function may fail with EAGAIN. ++ ++
    ++ ++ ++ ++

    Return values:

    ++
      ++ ++
    1. bytes that were successfully written if no error occured ++ ++
    2. - reserved for error code - ++ ++
    3. - reserved for error message - ++ ++
    4. bytes that were successfully written even if an error occured ++ ++
    ++ ++ ++ ++
    ++ ++ ++ ++ ++
    UnifiedIO:copyz (fdout, size)
    ++
    ++ ++ Copy data from the current descriptor to another one using kernel-space ++ copying if possible. ++ ++ ++

    Parameters

    ++
      ++ ++
    • ++ fdout: Target Descriptor ++
    • ++ ++
    • ++ size: Bytes to copy (optional) ++
    • ++ ++
    ++ ++ ++ ++ ++

    Usage

    ++
      ++ ++
    • This function uses the sendfile() syscall to copy the data or the ++ blocksource function of the source descriptor and the sink function ++ of the target descriptor as a fallback mechanism. ++ ++
    • If the limit parameter is ommited, data is copied ++ until an end-of-file, end-of-stream, connection shutdown or similar happens. ++ ++
    • If the descriptor is non-blocking the function may fail with EAGAIN. ++ ++
    ++ ++ ++ ++

    Return values:

    ++
      ++ ++
    1. bytes that were successfully written if no error occured ++ ++
    2. - reserved for error code - ++ ++
    3. - reserved for error message - ++ ++
    4. bytes that were successfully written even if an error occured ++ ++
    ++ ++ ++ ++
    ++ ++ ++ ++ ++
    UnifiedIO:is_file ()
    ++
    ++ ++ Test whether the I/O-Descriptor is a file. ++ ++ ++ ++ ++ ++ ++ ++

    Return value:

    ++boolean ++ ++ ++ ++
    ++ ++ ++ ++ ++
    UnifiedIO:is_socket ()
    ++
    ++ ++ Test whether the I/O-Descriptor is a socket. ++ ++ ++ ++ ++ ++ ++ ++

    Return value:

    ++boolean ++ ++ ++ ++
    ++ ++ ++ ++ ++
    UnifiedIO:is_tls_socket ()
    ++
    ++ ++ Test whether the I/O-Descriptor is a TLS socket. ++ ++ ++ ++ ++ ++ ++ ++

    Return value:

    ++boolean ++ ++ ++ ++
    ++ ++ ++ ++ ++
    UnifiedIO:linesource (limit)
    ++
    ++ ++ Create a line-based iterator. ++ Lines may end with either \n or \r\n, these control chars are not included ++ in the return value. ++ ++ ++

    Parameters

    ++
      ++ ++
    • ++ limit: Line limit ++
    • ++ ++
    ++ ++ ++ ++ ++

    Usage

    ++
      ++ ++
    • This function uses the low-level read function of the descriptor. ++ ++
    • Note: This function uses an internal buffer to read ++ ahead. Do NOT mix calls to read(all) and the returned iterator. If you want ++ to stop reading line-based and want to use the read(all) functions instead ++ you can pass "true" to the iterator which will flush the buffer ++ and return the bufferd data. ++ ++
    • If the limit parameter is ommited, this function uses the nixio ++ buffersize (8192B by default). ++ ++
    • If the descriptor is non-blocking the iterator may fail with EAGAIN. ++ ++
    • The iterator can be used as an LTN12 source. ++ ++
    ++ ++ ++ ++

    Return value:

    ++Line-based Iterator ++ ++ ++ ++
    ++ ++ ++ ++ ++
    UnifiedIO:readall (length)
    ++
    ++ ++ Read a block of data and wait until all data is available. ++ ++ ++

    Parameters

    ++
      ++ ++
    • ++ length: Bytes to read (optional) ++
    • ++ ++
    ++ ++ ++ ++ ++

    Usage

    ++
      ++ ++
    • This function uses the low-level read function of the descriptor. ++ ++
    • If the length parameter is ommited, this function returns all data ++ that can be read before an end-of-file, end-of-stream, connection shutdown ++ or similar happens. ++ ++
    • If the descriptor is non-blocking this function may fail with EAGAIN. ++ ++
    ++ ++ ++ ++

    Return values:

    ++
      ++ ++
    1. data that was successfully read if no error occured ++ ++
    2. - reserved for error code - ++ ++
    3. - reserved for error message - ++ ++
    4. data that was successfully read even if an error occured ++ ++
    ++ ++ ++ ++
    ++ ++ ++ ++ ++
    UnifiedIO:sink (close_when_done)
    ++
    ++ ++ Create a sink. ++ This sink will simply write all data that it receives and optionally ++ close the descriptor afterwards. ++ ++ ++

    Parameters

    ++
      ++ ++
    • ++ close_when_done: (optional, boolean) ++
    • ++ ++
    ++ ++ ++ ++ ++

    Usage

    ++
      ++ ++
    • This function uses the writeall function of the descriptor. ++ ++
    • If the descriptor is non-blocking the sink may fail with EAGAIN. ++ ++
    • The iterator can be used as an LTN12 sink. ++ ++
    ++ ++ ++ ++

    Return value:

    ++Sink ++ ++ ++ ++
    ++ ++ ++ ++ ++
    UnifiedIO:writeall (block)
    ++
    ++ ++ Write a block of data and wait until all data is written. ++ ++ ++

    Parameters

    ++
      ++ ++
    • ++ block: Bytes to write ++
    • ++ ++
    ++ ++ ++ ++ ++

    Usage

    ++
      ++ ++
    • This function uses the low-level write function of the descriptor. ++ ++
    • If the descriptor is non-blocking this function may fail with EAGAIN. ++ ++
    ++ ++ ++ ++

    Return values:

    ++
      ++ ++
    1. bytes that were successfully written if no error occured ++ ++
    2. - reserved for error code - ++ ++
    3. - reserved for error message - ++ ++
    4. bytes that were successfully written even if an error occured ++ ++
    ++ ++ ++ ++
    ++ ++ ++
    ++ ++ ++ ++ ++ ++
    ++ ++
    ++ ++
    ++

    Valid XHTML 1.0!

    ++
    ++ ++
    ++ ++ +diff --git a/feeds/luci/documentation/api/modules/nixio.bin.html b/feeds/luci/documentation/api/modules/nixio.bin.html +new file mode 100644 +index 0000000..fd82879 +--- /dev/null ++++ b/feeds/luci/documentation/api/modules/nixio.bin.html +@@ -0,0 +1,427 @@ ++ ++ ++ ++ Reference ++ ++ ++ ++ ++ ++
    ++ ++
    ++ ++
    ++
    ++
    ++ ++
    ++ ++ ++ ++
    ++ ++

    Class nixio.bin

    ++ ++

    ++ Binary operations and conversion.

    ++ ++ ++ ++ ++ ++ ++ ++

    Functions

    ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
    b64decode (buffer) ++ Base64 decode a given buffer.
    b64encode (buffer) ++ Base64 encode a given buffer.
    crc32 (buffer, initial) ++ Calculate the CRC32 value of a buffer.
    hexlify (buffer) ++ Return a hexadecimal ASCII represantation of the content of a buffer.
    unhexlify (hexvalue) ++ Return a binary buffer from a hexadecimal ASCII representation.
    ++ ++ ++ ++ ++ ++ ++
    ++
    ++ ++ ++

    Functions

    ++
    ++ ++ ++ ++
    b64decode (buffer)
    ++
    ++ ++ Base64 decode a given buffer. ++ ++ ++

    Parameters

    ++
      ++ ++
    • ++ buffer: Base 64 Encoded data ++
    • ++ ++
    ++ ++ ++ ++ ++ ++ ++

    Return value:

    ++binary data ++ ++ ++ ++
    ++ ++ ++ ++ ++
    b64encode (buffer)
    ++
    ++ ++ Base64 encode a given buffer. ++ ++ ++

    Parameters

    ++
      ++ ++
    • ++ buffer: Buffer ++
    • ++ ++
    ++ ++ ++ ++ ++ ++ ++

    Return value:

    ++base64 encoded buffer ++ ++ ++ ++
    ++ ++ ++ ++ ++
    crc32 (buffer, initial)
    ++
    ++ ++ Calculate the CRC32 value of a buffer. ++ ++ ++

    Parameters

    ++
      ++ ++
    • ++ buffer: Buffer ++
    • ++ ++
    • ++ initial: Initial CRC32 value (optional) ++
    • ++ ++
    ++ ++ ++ ++ ++ ++ ++

    Return value:

    ++crc32 value ++ ++ ++ ++
    ++ ++ ++ ++ ++
    hexlify (buffer)
    ++
    ++ ++ Return a hexadecimal ASCII represantation of the content of a buffer. ++ ++ ++

    Parameters

    ++
      ++ ++
    • ++ buffer: Buffer ++
    • ++ ++
    ++ ++ ++ ++ ++ ++ ++

    Return value:

    ++representation using characters [0-9a-f] ++ ++ ++ ++
    ++ ++ ++ ++ ++
    unhexlify (hexvalue)
    ++
    ++ ++ Return a binary buffer from a hexadecimal ASCII representation. ++ ++ ++

    Parameters

    ++
      ++ ++
    • ++ hexvalue: representation using characters [0-9a-f] ++
    • ++ ++
    ++ ++ ++ ++ ++ ++ ++

    Return value:

    ++binary data ++ ++ ++ ++
    ++ ++ ++
    ++ ++ ++ ++ ++ ++
    ++ ++
    ++ ++
    ++

    Valid XHTML 1.0!

    ++
    ++ ++
    ++ ++ +diff --git a/feeds/luci/documentation/api/modules/nixio.bit.html b/feeds/luci/documentation/api/modules/nixio.bit.html +new file mode 100644 +index 0000000..b29c29d +--- /dev/null ++++ b/feeds/luci/documentation/api/modules/nixio.bit.html +@@ -0,0 +1,744 @@ ++ ++ ++ ++ Reference ++ ++ ++ ++ ++ ++
    ++ ++
    ++ ++
    ++
    ++
    ++ ++
    ++ ++ ++ ++
    ++ ++

    Class nixio.bit

    ++ ++

    ++ Bitfield operators and mainpulation functions. ++ Can be used as a drop-in replacement for bitlib.

    ++ ++ ++ ++ ++ ++ ++ ++

    Functions

    ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
    arshift (oper, shift) ++ Arithmetically right shift a number.
    band (oper1, oper2, ...) ++ Bitwise AND several numbers.
    bnot (oper) ++ Invert given number.
    bor (oper1, oper2, ...) ++ Bitwise OR several numbers.
    bxor (oper1, oper2, ...) ++ Bitwise XOR several numbers.
    cast (oper) ++ Cast a number to the bit-operating range.
    check (bitfield, flag1, ...) ++ Checks whether given flags are set in a bitfield.
    div (oper1, oper2, ...) ++ Integer division of 2 or more numbers.
    lshift (oper, shift) ++ Left shift a number.
    rshift (oper, shift) ++ Right shift a number.
    set (bitfield, flag1, ...) ++ Sets one or more flags of a bitfield.
    unset (bitfield, flag1, ...) ++ Unsets one or more flags of a bitfield.
    ++ ++ ++ ++ ++ ++ ++
    ++
    ++ ++ ++

    Functions

    ++
    ++ ++ ++ ++
    arshift (oper, shift)
    ++
    ++ ++ Arithmetically right shift a number. ++ ++ ++

    Parameters

    ++
      ++ ++
    • ++ oper: number ++
    • ++ ++
    • ++ shift: bits to shift ++
    • ++ ++
    ++ ++ ++ ++ ++ ++ ++

    Return value:

    ++number ++ ++ ++ ++
    ++ ++ ++ ++ ++
    band (oper1, oper2, ...)
    ++
    ++ ++ Bitwise AND several numbers. ++ ++ ++

    Parameters

    ++
      ++ ++
    • ++ oper1: First Operand ++
    • ++ ++
    • ++ oper2: Second Operand ++
    • ++ ++
    • ++ ...: More Operands ++
    • ++ ++
    ++ ++ ++ ++ ++ ++ ++

    Return value:

    ++number ++ ++ ++ ++
    ++ ++ ++ ++ ++
    bnot (oper)
    ++
    ++ ++ Invert given number. ++ ++ ++

    Parameters

    ++
      ++ ++
    • ++ oper: Operand ++
    • ++ ++
    ++ ++ ++ ++ ++ ++ ++

    Return value:

    ++number ++ ++ ++ ++
    ++ ++ ++ ++ ++
    bor (oper1, oper2, ...)
    ++
    ++ ++ Bitwise OR several numbers. ++ ++ ++

    Parameters

    ++
      ++ ++
    • ++ oper1: First Operand ++
    • ++ ++
    • ++ oper2: Second Operand ++
    • ++ ++
    • ++ ...: More Operands ++
    • ++ ++
    ++ ++ ++ ++ ++ ++ ++

    Return value:

    ++number ++ ++ ++ ++
    ++ ++ ++ ++ ++
    bxor (oper1, oper2, ...)
    ++
    ++ ++ Bitwise XOR several numbers. ++ ++ ++

    Parameters

    ++
      ++ ++
    • ++ oper1: First Operand ++
    • ++ ++
    • ++ oper2: Second Operand ++
    • ++ ++
    • ++ ...: More Operands ++
    • ++ ++
    ++ ++ ++ ++ ++ ++ ++

    Return value:

    ++number ++ ++ ++ ++
    ++ ++ ++ ++ ++
    cast (oper)
    ++
    ++ ++ Cast a number to the bit-operating range. ++ ++ ++

    Parameters

    ++
      ++ ++
    • ++ oper: number ++
    • ++ ++
    ++ ++ ++ ++ ++ ++ ++

    Return value:

    ++number ++ ++ ++ ++
    ++ ++ ++ ++ ++
    check (bitfield, flag1, ...)
    ++
    ++ ++ Checks whether given flags are set in a bitfield. ++ ++ ++

    Parameters

    ++
      ++ ++
    • ++ bitfield: Bitfield ++
    • ++ ++
    • ++ flag1: First Flag ++
    • ++ ++
    • ++ ...: More Flags ++
    • ++ ++
    ++ ++ ++ ++ ++ ++ ++

    Return value:

    ++true when all flags are set, otherwise false ++ ++ ++ ++
    ++ ++ ++ ++ ++
    div (oper1, oper2, ...)
    ++
    ++ ++ Integer division of 2 or more numbers. ++ ++ ++

    Parameters

    ++
      ++ ++
    • ++ oper1: Operand 1 ++
    • ++ ++
    • ++ oper2: Operand 2 ++
    • ++ ++
    • ++ ...: More Operands ++
    • ++ ++
    ++ ++ ++ ++ ++ ++ ++

    Return value:

    ++number ++ ++ ++ ++
    ++ ++ ++ ++ ++
    lshift (oper, shift)
    ++
    ++ ++ Left shift a number. ++ ++ ++

    Parameters

    ++
      ++ ++
    • ++ oper: number ++
    • ++ ++
    • ++ shift: bits to shift ++
    • ++ ++
    ++ ++ ++ ++ ++ ++ ++

    Return value:

    ++number ++ ++ ++ ++
    ++ ++ ++ ++ ++
    rshift (oper, shift)
    ++
    ++ ++ Right shift a number. ++ ++ ++

    Parameters

    ++
      ++ ++
    • ++ oper: number ++
    • ++ ++
    • ++ shift: bits to shift ++
    • ++ ++
    ++ ++ ++ ++ ++ ++ ++

    Return value:

    ++number ++ ++ ++ ++
    ++ ++ ++ ++ ++
    set (bitfield, flag1, ...)
    ++
    ++ ++ Sets one or more flags of a bitfield. ++ ++ ++

    Parameters

    ++
      ++ ++
    • ++ bitfield: Bitfield ++
    • ++ ++
    • ++ flag1: First Flag ++
    • ++ ++
    • ++ ...: More Flags ++
    • ++ ++
    ++ ++ ++ ++ ++ ++ ++

    Return value:

    ++altered bitfield ++ ++ ++ ++
    ++ ++ ++ ++ ++
    unset (bitfield, flag1, ...)
    ++
    ++ ++ Unsets one or more flags of a bitfield. ++ ++ ++

    Parameters

    ++
      ++ ++
    • ++ bitfield: Bitfield ++
    • ++ ++
    • ++ flag1: First Flag ++
    • ++ ++
    • ++ ...: More Flags ++
    • ++ ++
    ++ ++ ++ ++ ++ ++ ++

    Return value:

    ++altered bitfield ++ ++ ++ ++
    ++ ++ ++
    ++ ++ ++ ++ ++ ++
    ++ ++
    ++ ++
    ++

    Valid XHTML 1.0!

    ++
    ++ ++
    ++ ++ +diff --git a/feeds/luci/documentation/api/modules/nixio.crypto.html b/feeds/luci/documentation/api/modules/nixio.crypto.html +new file mode 100644 +index 0000000..79a7458 +--- /dev/null ++++ b/feeds/luci/documentation/api/modules/nixio.crypto.html +@@ -0,0 +1,319 @@ ++ ++ ++ ++ Reference ++ ++ ++ ++ ++ ++
    ++ ++
    ++ ++
    ++
    ++
    ++ ++
    ++ ++ ++ ++
    ++ ++

    Class nixio.crypto

    ++ ++

    ++ Cryptographical library.

    ++ ++ ++ ++ ++ ++ ++ ++

    Functions

    ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
    hash (algo) ++ Create a hash object.
    hmac (algo, key) ++ Create a HMAC object.
    ++ ++ ++ ++ ++ ++ ++
    ++
    ++ ++ ++

    Functions

    ++
    ++ ++ ++ ++
    hash (algo)
    ++
    ++ ++ Create a hash object. ++ ++ ++

    Parameters

    ++
      ++ ++
    • ++ algo: Algorithm ["sha1", "md5"] ++
    • ++ ++
    ++ ++ ++ ++ ++ ++ ++

    Return value:

    ++CryptoHash Object ++ ++ ++ ++
    ++ ++ ++ ++ ++
    hmac (algo, key)
    ++
    ++ ++ Create a HMAC object. ++ ++ ++

    Parameters

    ++
      ++ ++
    • ++ algo: Algorithm ["sha1", "md5"] ++
    • ++ ++
    • ++ key: HMAC-Key ++
    • ++ ++
    ++ ++ ++ ++ ++ ++ ++

    Return value:

    ++CryptoHash Object ++ ++ ++ ++
    ++ ++ ++
    ++ ++ ++ ++ ++ ++
    ++ ++
    ++ ++
    ++

    Valid XHTML 1.0!

    ++
    ++ ++
    ++ ++ +diff --git a/feeds/luci/documentation/api/modules/nixio.fs.html b/feeds/luci/documentation/api/modules/nixio.fs.html +new file mode 100644 +index 0000000..d4fda2c +--- /dev/null ++++ b/feeds/luci/documentation/api/modules/nixio.fs.html +@@ -0,0 +1,1562 @@ ++ ++ ++ ++ Reference ++ ++ ++ ++ ++ ++
    ++ ++
    ++ ++
    ++
    ++
    ++ ++
    ++ ++ ++ ++
    ++ ++

    Class nixio.fs

    ++ ++

    ++ Low-level and high-level filesystem manipulation library.

    ++ ++ ++ ++ ++ ++ ++ ++

    Functions

    ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
    access (path, mode1, ...) ++ Check user's permission on a file.
    basename (path) ++ Strip the directory part from a path.
    chmod (path, mode) ++ Change the file mode.
    chown (path, user, group) ++ (POSIX) Change owner and group of a file.
    copy (src, dest) ++ Copy a file, directory or symlink non-recursively preserving file mode, ++ timestamps, owner and group.
    copyr (src, dest) ++ Copy a file, directory or symlink recursively preserving file mode, ++ timestamps, owner and group.
    datacopy (src, dest, limit) ++ Copy data between files.
    dir (path) ++ Iterate over the entries of a directory.
    dirname (path) ++ Strip the base from a path.
    glob (pattern) ++ (POSIX) Find pathnames matching a pattern.
    lchown (path, user, group) ++ (POSIX) Change owner and group of a file and do not resolve ++ if target is a symlink.
    link (oldpath, newpath) ++ Create a hard link.
    lstat (path, field) ++ Get file status and attributes and do not resolve if target is a symlink.
    mkdir (path, mode) ++ Create a new directory.
    mkdirr (dest, mode) ++ Create a directory and all needed parent directories recursively.
    mkfifo (path, mode) ++ (POSIX) Create a FIFO (named pipe).
    move (src, dest) ++ Rename a file, directory or symlink non-recursively across filesystems.
    mover (src, dest) ++ Rename a file, directory or symlink recursively across filesystems.
    readfile (path, limit) ++ Read the contents of a file into a buffer.
    readlink (path) ++ (POSIX) Read the target of a symbolic link.
    realpath (path) ++ Return the cannonicalized absolute pathname.
    remove (path) ++ Remove a file or directory.
    rename (src, dest) ++ Renames a file or directory.
    rmdir (path) ++ Remove an empty directory.
    stat (path, field) ++ Get file status and attributes.
    statvfs (path) ++ (POSIX) Get filesystem statistics.
    symlink (oldpath, newpath) ++ (POSIX) Create a symbolic link.
    unlink (path) ++ Delete a name and - if no links are left - the associated file.
    utimes (path, actime, mtime) ++ Change file last access and last modification time.
    writefile (path, data) ++ Write a buffer into a file truncating the file first.
    ++ ++ ++ ++ ++ ++ ++
    ++
    ++ ++ ++

    Functions

    ++
    ++ ++ ++ ++
    access (path, mode1, ...)
    ++
    ++ ++ Check user's permission on a file. ++ ++ ++

    Parameters

    ++
      ++ ++
    • ++ path: Path ++
    • ++ ++
    • ++ mode1: First Mode to check ["f", "r", "w", "x"] ++
    • ++ ++
    • ++ ...: More Modes to check [-"-] ++
    • ++ ++
    ++ ++ ++ ++ ++ ++ ++

    Return value:

    ++true ++ ++ ++ ++
    ++ ++ ++ ++ ++
    basename (path)
    ++
    ++ ++ Strip the directory part from a path. ++ ++ ++

    Parameters

    ++
      ++ ++
    • ++ path: Path ++
    • ++ ++
    ++ ++ ++ ++ ++

    Usage:

    ++This function cannot fail and will never return nil. ++ ++ ++ ++

    Return value:

    ++basename ++ ++ ++ ++
    ++ ++ ++ ++ ++
    chmod (path, mode)
    ++
    ++ ++ Change the file mode. ++ ++ ++

    Parameters

    ++
      ++ ++
    • ++ path: Path ++
    • ++ ++
    • ++ mode: File mode ++ [decimal mode number, "[-r][-w][-xsS][-r][-w][-xsS][-r][-w][-xtT]"] ++
    • ++ ++
    ++ ++ ++ ++ ++

    Usage

    ++
      ++ ++
    • Windows only supports setting the write-protection through the ++ "Writable to others" bit. ++ ++
    • Notice: The mode-flag for the functions ++ open, mkdir, mkfifo are affected by the umask. ++ ++
    ++ ++ ++ ++

    Return value:

    ++true ++ ++ ++ ++

    See also:

    ++ ++ ++
    ++ ++ ++ ++ ++
    chown (path, user, group)
    ++
    ++ ++ (POSIX) Change owner and group of a file. ++ ++ ++

    Parameters

    ++
      ++ ++
    • ++ path: Path ++
    • ++ ++
    • ++ user: User ID or Username (optional) ++
    • ++ ++
    • ++ group: Group ID or Groupname (optional) ++
    • ++ ++
    ++ ++ ++ ++ ++ ++ ++

    Return value:

    ++true ++ ++ ++ ++
    ++ ++ ++ ++ ++
    copy (src, dest)
    ++
    ++ ++ Copy a file, directory or symlink non-recursively preserving file mode, ++ timestamps, owner and group. ++ ++ ++

    Parameters

    ++
      ++ ++
    • ++ src: Source path ++
    • ++ ++
    • ++ dest: Destination path ++
    • ++ ++
    ++ ++ ++ ++ ++

    Usage:

    ++The destination must always be a full destination path e.g. do not ++ omit the basename even if source and destination basename are equal. ++ ++ ++ ++

    Return value:

    ++true ++ ++ ++ ++
    ++ ++ ++ ++ ++
    copyr (src, dest)
    ++
    ++ ++ Copy a file, directory or symlink recursively preserving file mode, ++ timestamps, owner and group. ++ ++ ++

    Parameters

    ++
      ++ ++
    • ++ src: Source path ++
    • ++ ++
    • ++ dest: Destination path ++
    • ++ ++
    ++ ++ ++ ++ ++

    Usage:

    ++The destination must always be a full destination path e.g. do not ++ omit the basename even if source and destination basename are equal. ++ ++ ++ ++

    Return value:

    ++true ++ ++ ++ ++
    ++ ++ ++ ++ ++
    datacopy (src, dest, limit)
    ++
    ++ ++ Copy data between files. ++ ++ ++

    Parameters

    ++
      ++ ++
    • ++ src: Source file path ++
    • ++ ++
    • ++ dest: Destination file path ++
    • ++ ++
    • ++ limit: Maximum bytes to copy (optional) ++
    • ++ ++
    ++ ++ ++ ++ ++ ++ ++

    Return value:

    ++true ++ ++ ++ ++
    ++ ++ ++ ++ ++
    dir (path)
    ++
    ++ ++ Iterate over the entries of a directory. ++ ++ ++

    Parameters

    ++
      ++ ++
    • ++ path: Path ++
    • ++ ++
    ++ ++ ++ ++ ++

    Usage:

    ++The special entries "." and ".." are omitted. ++ ++ ++ ++

    Return value:

    ++directory iterator returning one entry per call ++ ++ ++ ++
    ++ ++ ++ ++ ++
    dirname (path)
    ++
    ++ ++ Strip the base from a path. ++ ++ ++

    Parameters

    ++
      ++ ++
    • ++ path: Path ++
    • ++ ++
    ++ ++ ++ ++ ++

    Usage:

    ++This function cannot fail and will never return nil. ++ ++ ++ ++

    Return value:

    ++dirname ++ ++ ++ ++
    ++ ++ ++ ++ ++
    glob (pattern)
    ++
    ++ ++ (POSIX) Find pathnames matching a pattern. ++ ++ ++

    Parameters

    ++
      ++ ++
    • ++ pattern: Pattern ++
    • ++ ++
    ++ ++ ++ ++ ++ ++ ++

    Return values:

    ++
      ++ ++
    1. path iterator ++ ++
    2. number of matches ++ ++
    ++ ++ ++ ++
    ++ ++ ++ ++ ++
    lchown (path, user, group)
    ++
    ++ ++ (POSIX) Change owner and group of a file and do not resolve ++ if target is a symlink. ++ ++ ++

    Parameters

    ++
      ++ ++
    • ++ path: Path ++
    • ++ ++
    • ++ user: User ID or Username (optional) ++
    • ++ ++
    • ++ group: Group ID or Groupname (optional) ++
    • ++ ++
    ++ ++ ++ ++ ++ ++ ++

    Return value:

    ++true ++ ++ ++ ++
    ++ ++ ++ ++ ++
    link (oldpath, newpath)
    ++
    ++ ++ Create a hard link. ++ ++ ++

    Parameters

    ++
      ++ ++
    • ++ oldpath: Path ++
    • ++ ++
    • ++ newpath: Path ++
    • ++ ++
    ++ ++ ++ ++ ++

    Usage:

    ++This function calls link() on POSIX and CreateHardLink() on Windows. ++ ++ ++ ++

    Return value:

    ++true ++ ++ ++ ++
    ++ ++ ++ ++ ++
    lstat (path, field)
    ++
    ++ ++ Get file status and attributes and do not resolve if target is a symlink. ++ ++ ++

    Parameters

    ++
      ++ ++
    • ++ path: Path ++
    • ++ ++
    • ++ field: Only return a specific field, not the whole table (optional) ++
    • ++ ++
    ++ ++ ++ ++ ++ ++ ++

    Return value:

    ++Table containing attributes (see stat for a detailed description) ++ ++ ++ ++

    See also:

    ++ ++ ++
    ++ ++ ++ ++ ++
    mkdir (path, mode)
    ++
    ++ ++ Create a new directory. ++ ++ ++

    Parameters

    ++
      ++ ++
    • ++ path: Path ++
    • ++ ++
    • ++ mode: File mode (optional, see chmod and umask) ++
    • ++ ++
    ++ ++ ++ ++ ++ ++ ++

    Return value:

    ++true ++ ++ ++ ++

    See also:

    ++ ++ ++
    ++ ++ ++ ++ ++
    mkdirr (dest, mode)
    ++
    ++ ++ Create a directory and all needed parent directories recursively. ++ ++ ++

    Parameters

    ++
      ++ ++
    • ++ dest: Destination path ++
    • ++ ++
    • ++ mode: File mode (optional, see chmod and umask) ++
    • ++ ++
    ++ ++ ++ ++ ++ ++ ++

    Return value:

    ++true ++ ++ ++ ++

    See also:

    ++ ++ ++
    ++ ++ ++ ++ ++
    mkfifo (path, mode)
    ++
    ++ ++ (POSIX) Create a FIFO (named pipe). ++ ++ ++

    Parameters

    ++
      ++ ++
    • ++ path: Path ++
    • ++ ++
    • ++ mode: File mode (optional, see chmod and umask) ++
    • ++ ++
    ++ ++ ++ ++ ++ ++ ++

    Return value:

    ++true ++ ++ ++ ++

    See also:

    ++ ++ ++
    ++ ++ ++ ++ ++
    move (src, dest)
    ++
    ++ ++ Rename a file, directory or symlink non-recursively across filesystems. ++ ++ ++

    Parameters

    ++
      ++ ++
    • ++ src: Source path ++
    • ++ ++
    • ++ dest: Destination path ++
    • ++ ++
    ++ ++ ++ ++ ++

    Usage:

    ++The destination must always be a full destination path e.g. do not ++ omit the basename even if source and destination basename are equal. ++ ++ ++ ++

    Return value:

    ++true ++ ++ ++ ++
    ++ ++ ++ ++ ++
    mover (src, dest)
    ++
    ++ ++ Rename a file, directory or symlink recursively across filesystems. ++ ++ ++

    Parameters

    ++
      ++ ++
    • ++ src: Source path ++
    • ++ ++
    • ++ dest: Destination path ++
    • ++ ++
    ++ ++ ++ ++ ++

    Usage:

    ++The destination must always be a full destination path e.g. do not ++ omit the basename even if source and destination basename are equal. ++ ++ ++ ++

    Return value:

    ++true ++ ++ ++ ++
    ++ ++ ++ ++ ++
    readfile (path, limit)
    ++
    ++ ++ Read the contents of a file into a buffer. ++ ++ ++

    Parameters

    ++
      ++ ++
    • ++ path: Path ++
    • ++ ++
    • ++ limit: Maximum bytes to read (optional) ++
    • ++ ++
    ++ ++ ++ ++ ++ ++ ++

    Return value:

    ++file contents ++ ++ ++ ++
    ++ ++ ++ ++ ++
    readlink (path)
    ++
    ++ ++ (POSIX) Read the target of a symbolic link. ++ ++ ++

    Parameters

    ++
      ++ ++
    • ++ path: Path ++
    • ++ ++
    ++ ++ ++ ++ ++ ++ ++

    Return value:

    ++target path ++ ++ ++ ++
    ++ ++ ++ ++ ++
    realpath (path)
    ++
    ++ ++ Return the cannonicalized absolute pathname. ++ ++ ++

    Parameters

    ++
      ++ ++
    • ++ path: Path ++
    • ++ ++
    ++ ++ ++ ++ ++ ++ ++

    Return value:

    ++absolute path ++ ++ ++ ++
    ++ ++ ++ ++ ++
    remove (path)
    ++
    ++ ++ Remove a file or directory. ++ ++ ++

    Parameters

    ++
      ++ ++
    • ++ path: Path ++
    • ++ ++
    ++ ++ ++ ++ ++ ++ ++

    Return value:

    ++true ++ ++ ++ ++
    ++ ++ ++ ++ ++
    rename (src, dest)
    ++
    ++ ++ Renames a file or directory. ++ ++ ++

    Parameters

    ++
      ++ ++
    • ++ src: Source path ++
    • ++ ++
    • ++ dest: Destination path ++
    • ++ ++
    ++ ++ ++ ++ ++

    Usage:

    ++It is normally not possible to rename files accross fileystems. ++ ++ ++ ++

    Return value:

    ++true ++ ++ ++ ++
    ++ ++ ++ ++ ++
    rmdir (path)
    ++
    ++ ++ Remove an empty directory. ++ ++ ++

    Parameters

    ++
      ++ ++
    • ++ path: Path ++
    • ++ ++
    ++ ++ ++ ++ ++ ++ ++

    Return value:

    ++true ++ ++ ++ ++
    ++ ++ ++ ++ ++
    stat (path, field)
    ++
    ++ ++ Get file status and attributes. ++ ++ ++

    Parameters

    ++
      ++ ++
    • ++ path: Path ++
    • ++ ++
    • ++ field: Only return a specific field, not the whole table (optional) ++
    • ++ ++
    ++ ++ ++ ++ ++ ++ ++

    Return value:

    ++Table containing:
      ++
    • atime = Last access timestamp
    • ++
    • blksize = Blocksize (POSIX only)
    • ++
    • blocks = Blocks used (POSIX only)
    • ++
    • ctime = Creation timestamp
    • ++
    • dev = Device ID
    • ++
    • gid = Group ID
    • ++
    • ino = Inode
    • ++
    • modedec = Mode converted into a decimal number
    • ++
    • modestr = Mode as string as returned by ls -l
    • ++
    • mtime = Last modification timestamp
    • ++
    • nlink = Number of links
    • ++
    • rdev = Device ID (if special file)
    • ++
    • size = Size in bytes
    • ++
    • type = ["reg", "dir", "chr", "blk", "fifo", "lnk", "sock"]
    • ++
    • uid = User ID
    • ++
    ++ ++ ++ ++
    ++ ++ ++ ++ ++
    statvfs (path)
    ++
    ++ ++ (POSIX) Get filesystem statistics. ++ ++ ++

    Parameters

    ++
      ++ ++
    • ++ path: Path to any file within the filesystem. ++
    • ++ ++
    ++ ++ ++ ++ ++ ++ ++

    Return value:

    ++Table containing:
      ++
    • bavail = available blocks
    • ++
    • bfree = free blocks
    • ++
    • blocks = number of fragments
    • ++
    • frsize = fragment size
    • ++
    • favail = available inodes
    • ++
    • ffree = free inodes
    • ++
    • files = inodes
    • ++
    • flag = flags
    • ++
    • fsid = filesystem ID
    • ++
    • namemax = maximum filename length
    • ++
    ++ ++ ++ ++
    ++ ++ ++ ++ ++
    symlink (oldpath, newpath)
    ++
    ++ ++ (POSIX) Create a symbolic link. ++ ++ ++

    Parameters

    ++
      ++ ++
    • ++ oldpath: Path ++
    • ++ ++
    • ++ newpath: Path ++
    • ++ ++
    ++ ++ ++ ++ ++ ++ ++

    Return value:

    ++true ++ ++ ++ ++
    ++ ++ ++ ++ ++
    unlink (path)
    ++
    ++ ++ Delete a name and - if no links are left - the associated file. ++ ++ ++

    Parameters

    ++
      ++ ++
    • ++ path: Path ++
    • ++ ++
    ++ ++ ++ ++ ++ ++ ++

    Return value:

    ++true ++ ++ ++ ++
    ++ ++ ++ ++ ++
    utimes (path, actime, mtime)
    ++
    ++ ++ Change file last access and last modification time. ++ ++ ++

    Parameters

    ++
      ++ ++
    • ++ path: Path ++
    • ++ ++
    • ++ actime: Last access timestamp (optional, default: current time) ++
    • ++ ++
    • ++ mtime: Last modification timestamp (optional, default: actime) ++
    • ++ ++
    ++ ++ ++ ++ ++ ++ ++

    Return value:

    ++true ++ ++ ++ ++
    ++ ++ ++ ++ ++
    writefile (path, data)
    ++
    ++ ++ Write a buffer into a file truncating the file first. ++ ++ ++

    Parameters

    ++
      ++ ++
    • ++ path: Path ++
    • ++ ++
    • ++ data: Data to write ++
    • ++ ++
    ++ ++ ++ ++ ++ ++ ++

    Return value:

    ++true ++ ++ ++ ++
    ++ ++ ++
    ++ ++ ++ ++ ++ ++
    ++ ++
    ++ ++
    ++

    Valid XHTML 1.0!

    ++
    ++ ++
    ++ ++ +diff --git a/feeds/luci/documentation/api/modules/nixio.html b/feeds/luci/documentation/api/modules/nixio.html +new file mode 100644 +index 0000000..f02fe3b +--- /dev/null ++++ b/feeds/luci/documentation/api/modules/nixio.html +@@ -0,0 +1,2405 @@ ++ ++ ++ ++ Reference ++ ++ ++ ++ ++ ++
    ++ ++
    ++ ++
    ++
    ++
    ++ ++
    ++ ++ ++ ++
    ++ ++

    Class nixio

    ++ ++

    ++ General POSIX IO library.

    ++ ++ ++ ++ ++ ++ ++ ++

    Functions

    ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
    bind (host, port, family, socktype) ++ Create a new socket and bind it to a network address.
    chdir (path) ++ Change the working directory.
    closelog () ++ (POSIX) Close the connection to the system logger.
    connect (host, port, family, socktype) ++ Create a new socket and connect to a network address.
    crypt (key, salt) ++ (POSIX) Encrypt a user password.
    dup (oldfd, newfd) ++ Duplicate a file descriptor.
    errno () ++ Get the last system error code.
    exec (executable, ...) ++ Execute a file to replace the current process.
    exece (executable, arguments, environment) ++ Execute a file with a custom environment to replace the current process.
    execp (executable, ...) ++ Invoke the shell and execute a file to replace the current process.
    fork () ++ (POSIX) Clone the current process.
    getaddrinfo (host, family, service) ++ Look up a hostname and service via DNS.
    getcwd () ++ Get the current working directory.
    getenv (variable) ++ Get the current environment table or a specific environment variable.
    getgid () ++ (POSIX) Get the group id of the current process.
    getgr (group) ++ (POSIX) Get all or a specific user group.
    getifaddrs () ++ (Linux, BSD) Get a list of available network interfaces and their addresses.
    getnameinfo (ipaddr) ++ Reverse look up an IP-Address via DNS.
    getpid () ++ Get the ID of the current process.
    getppid () ++ (POSIX) Get the parent process id of the current process.
    getproto (proto) ++ Get all or a specifc proto entry.
    getprotobyname (name) ++ Get protocol entry by name.
    getprotobynumber (proto) ++ Get protocol entry by number.
    getpw (user) ++ (POSIX) Get all or a specific user account.
    getsp (user) ++ (Linux, Solaris) Get all or a specific shadow password entry.
    getuid () ++ (POSIX) Get the user id of the current process.
    kill (target, signal) ++ (POSIX) Send a signal to one or more processes.
    nanosleep (seconds, nanoseconds) ++ Sleep for a specified amount of time.
    nice (nice) ++ (POSIX) Change priority of current process.
    open (path, flags, mode) ++ Open a file.
    open_flags (flag1, ...) ++ Generate flags for a call to open().
    openlog (ident, flag1, ...) ++ (POSIX) Open a connection to the system logger.
    pipe () ++ Create a pipe.
    poll (fds, timeout) ++ Wait for some event on a file descriptor.
    poll_flags (mode1, ...) ++ Generate events-bitfield or parse revents-bitfield for poll.
    sendfile (socket, file, length) ++ (POSIX) Send data from a file to a socket in kernel-space.
    setenv (variable, value) ++ Set or unset a environment variable.
    setgid (gid) ++ (POSIX) Set the group id of the current process.
    setlogmask (priority) ++ (POSIX) Set the logmask of the system logger for current process.
    setsid () ++ (POSIX) Create a new session and set the process group ID.
    setuid (gid) ++ (POSIX) Set the user id of the current process.
    signal (signal, handler) ++ Ignore or use set the default handler for a signal.
    socket (domain, type) ++ Create a new socket.
    splice (fdin, fdout, length, flags) ++ (Linux) Send data from / to a pipe in kernel-space.
    splice_flags (flag1, ...) ++ (Linux) Generate a flag bitfield for a call to splice.
    strerror (errno) ++ Get the error message for the corresponding error code.
    sysinfo () ++ (Linux) Get overall system statistics.
    syslog (priority) ++ (POSIX) Write a message to the system logger.
    times () ++ (POSIX) Get process times.
    tls (mode) ++ Create a new TLS context.
    umask (mask) ++ Sets the file mode creation mask.
    uname () ++ (POSIX) Get information about current system and kernel.
    waitpid (pid, flag1, ...) ++ (POSIX) Wait for a process to change state.
    ++ ++ ++ ++ ++ ++ ++
    ++
    ++ ++ ++

    Functions

    ++
    ++ ++ ++ ++
    bind (host, port, family, socktype)
    ++
    ++ ++ Create a new socket and bind it to a network address. ++ This function is a shortcut for calling nixio.socket and then bind() ++ on the socket object. ++ ++ ++

    Parameters

    ++
      ++ ++
    • ++ host: Hostname or IP-Address (optional, default: all addresses) ++
    • ++ ++
    • ++ port: Port or service description ++
    • ++ ++
    • ++ family: Address family ["any", "inet", "inet6"] ++
    • ++ ++
    • ++ socktype: Socket Type ["stream", "dgram"] ++
    • ++ ++
    ++ ++ ++ ++ ++

    Usage

    ++
      ++ ++
    • This functions calls getaddrinfo(), socket(), ++ setsockopt() and bind() but NOT listen(). ++ ++
    • The reuseaddr-option is automatically set before binding. ++ ++
    ++ ++ ++ ++

    Return value:

    ++Socket Object ++ ++ ++ ++
    ++ ++ ++ ++ ++
    chdir (path)
    ++
    ++ ++ Change the working directory. ++ ++ ++

    Parameters

    ++
      ++ ++
    • ++ path: New working directory ++
    • ++ ++
    ++ ++ ++ ++ ++ ++ ++

    Return value:

    ++true ++ ++ ++ ++
    ++ ++ ++ ++ ++
    closelog ()
    ++
    ++ ++ (POSIX) Close the connection to the system logger. ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
    ++ ++ ++ ++ ++
    connect (host, port, family, socktype)
    ++
    ++ ++ Create a new socket and connect to a network address. ++ This function is a shortcut for calling nixio.socket and then connect() ++ on the socket object. ++ ++ ++

    Parameters

    ++
      ++ ++
    • ++ host: Hostname or IP-Address (optional, default: localhost) ++
    • ++ ++
    • ++ port: Port or service description ++
    • ++ ++
    • ++ family: Address family ["any", "inet", "inet6"] ++
    • ++ ++
    • ++ socktype: Socket Type ["stream", "dgram"] ++
    • ++ ++
    ++ ++ ++ ++ ++

    Usage:

    ++This functions calls getaddrinfo(), socket() and connect(). ++ ++ ++ ++

    Return value:

    ++Socket Object ++ ++ ++ ++
    ++ ++ ++ ++ ++
    crypt (key, salt)
    ++
    ++ ++ (POSIX) Encrypt a user password. ++ ++ ++

    Parameters

    ++
      ++ ++
    • ++ key: Key ++
    • ++ ++
    • ++ salt: Salt ++
    • ++ ++
    ++ ++ ++ ++ ++ ++ ++

    Return value:

    ++password hash ++ ++ ++ ++
    ++ ++ ++ ++ ++
    dup (oldfd, newfd)
    ++
    ++ ++ Duplicate a file descriptor. ++ ++ ++

    Parameters

    ++
      ++ ++
    • ++ oldfd: Old descriptor [File Object, Socket Object (POSIX only)] ++
    • ++ ++
    • ++ newfd: New descriptor to serve as copy (optional) ++
    • ++ ++
    ++ ++ ++ ++ ++

    Usage:

    ++This funcation calls dup2() if newfd is set, otherwise dup(). ++ ++ ++ ++

    Return value:

    ++File Object of new descriptor ++ ++ ++ ++
    ++ ++ ++ ++ ++
    errno ()
    ++
    ++ ++ Get the last system error code. ++ ++ ++ ++ ++ ++ ++ ++

    Return value:

    ++Error code ++ ++ ++ ++
    ++ ++ ++ ++ ++
    exec (executable, ...)
    ++
    ++ ++ Execute a file to replace the current process. ++ ++ ++

    Parameters

    ++
      ++ ++
    • ++ executable: Executable ++
    • ++ ++
    • ++ ...: Parameters ++
    • ++ ++
    ++ ++ ++ ++ ++

    Usage

    ++
      ++ ++
    • The name of the executable is automatically passed as argv[0] ++ ++
    • This function does not return on success. ++ ++
    ++ ++ ++ ++ ++ ++
    ++ ++ ++ ++ ++
    exece (executable, arguments, environment)
    ++
    ++ ++ Execute a file with a custom environment to replace the current process. ++ ++ ++

    Parameters

    ++
      ++ ++
    • ++ executable: Executable ++
    • ++ ++
    • ++ arguments: Argument Table ++
    • ++ ++
    • ++ environment: Environment Table (optional) ++
    • ++ ++
    ++ ++ ++ ++ ++

    Usage

    ++
      ++ ++
    • The name of the executable is automatically passed as argv[0] ++ ++
    • This function does not return on success. ++ ++
    ++ ++ ++ ++ ++ ++
    ++ ++ ++ ++ ++
    execp (executable, ...)
    ++
    ++ ++ Invoke the shell and execute a file to replace the current process. ++ ++ ++

    Parameters

    ++
      ++ ++
    • ++ executable: Executable ++
    • ++ ++
    • ++ ...: Parameters ++
    • ++ ++
    ++ ++ ++ ++ ++

    Usage

    ++
      ++ ++
    • The name of the executable is automatically passed as argv[0] ++ ++
    • This function does not return on success. ++ ++
    ++ ++ ++ ++ ++ ++
    ++ ++ ++ ++ ++
    fork ()
    ++
    ++ ++ (POSIX) Clone the current process. ++ ++ ++ ++ ++ ++ ++ ++

    Return value:

    ++the child process id for the parent process, 0 for the child process ++ ++ ++ ++
    ++ ++ ++ ++ ++
    getaddrinfo (host, family, service)
    ++
    ++ ++ Look up a hostname and service via DNS. ++ ++ ++

    Parameters

    ++
      ++ ++
    • ++ host: hostname to lookup (optional) ++
    • ++ ++
    • ++ family: address family ["any", "inet", "inet6"] ++
    • ++ ++
    • ++ service: service name or port (optional) ++
    • ++ ++
    ++ ++ ++ ++ ++ ++ ++

    Return value:

    ++Table containing one or more tables containing:
      ++
    • family = ["inet", "inet6"]
    • ++
    • socktype = ["stream", "dgram", "raw"]
    • ++
    • address = Resolved IP-Address
    • ++
    • port = Resolved Port (if service was given)
    • ++
    ++ ++ ++ ++
    ++ ++ ++ ++ ++
    getcwd ()
    ++
    ++ ++ Get the current working directory. ++ ++ ++ ++ ++ ++ ++ ++

    Return value:

    ++workign directory ++ ++ ++ ++
    ++ ++ ++ ++ ++
    getenv (variable)
    ++
    ++ ++ Get the current environment table or a specific environment variable. ++ ++ ++

    Parameters

    ++
      ++ ++
    • ++ variable: Variable (optional) ++
    • ++ ++
    ++ ++ ++ ++ ++ ++ ++

    Return value:

    ++environment table or single environment variable ++ ++ ++ ++
    ++ ++ ++ ++ ++
    getgid ()
    ++
    ++ ++ (POSIX) Get the group id of the current process. ++ ++ ++ ++ ++ ++ ++ ++

    Return value:

    ++process group id ++ ++ ++ ++
    ++ ++ ++ ++ ++
    getgr (group)
    ++
    ++ ++ (POSIX) Get all or a specific user group. ++ ++ ++

    Parameters

    ++
      ++ ++
    • ++ group: Group ID or groupname (optional) ++
    • ++ ++
    ++ ++ ++ ++ ++ ++ ++

    Return value:

    ++Table containing:
      ++
    • name = Group Name
    • ++
    • gid = Group ID
    • ++
    • passwd = Password
    • ++
    • mem = {Member #1, Member #2, ...}
    • ++
    ++ ++ ++ ++
    ++ ++ ++ ++ ++
    getifaddrs ()
    ++
    ++ ++ (Linux, BSD) Get a list of available network interfaces and their addresses. ++ ++ ++ ++ ++ ++ ++ ++

    Return value:

    ++Table containing one or more tables containing:
      ++
    • name = Interface Name
    • ++
    • family = ["inet", "inet6", "packet"]
    • ++
    • addr = Interface Address (IPv4, IPv6, MAC, ...)
    • ++
    • broadaddr = Broadcast Address
    • ++
    • dstaddr = Destination Address (Point-to-Point)
    • ++
    • netmask = Netmask (if available)
    • ++
    • prefix = Prefix (if available)
    • ++
    • flags = Table of interface flags (up, multicast, loopback, ...)
    • ++
    • data = Statistics (Linux, "packet"-family)
    • ++
    • hatype = Hardware Type Identifier (Linix, "packet"-family)
    • ++
    • ifindex = Interface Index (Linux, "packet"-family)
    • ++
    ++ ++ ++ ++
    ++ ++ ++ ++ ++
    getnameinfo (ipaddr)
    ++
    ++ ++ Reverse look up an IP-Address via DNS. ++ ++ ++

    Parameters

    ++
      ++ ++
    • ++ ipaddr: IPv4 or IPv6-Address ++
    • ++ ++
    ++ ++ ++ ++ ++ ++ ++

    Return value:

    ++FQDN ++ ++ ++ ++
    ++ ++ ++ ++ ++
    getpid ()
    ++
    ++ ++ Get the ID of the current process. ++ ++ ++ ++ ++ ++ ++ ++

    Return value:

    ++process id ++ ++ ++ ++
    ++ ++ ++ ++ ++
    getppid ()
    ++
    ++ ++ (POSIX) Get the parent process id of the current process. ++ ++ ++ ++ ++ ++ ++ ++

    Return value:

    ++parent process id ++ ++ ++ ++
    ++ ++ ++ ++ ++
    getproto (proto)
    ++
    ++ ++ Get all or a specifc proto entry. ++ ++ ++

    Parameters

    ++
      ++ ++
    • ++ proto: protocol number or name to lookup (optional) ++
    • ++ ++
    ++ ++ ++ ++ ++ ++ ++

    Return value:

    ++Table (or if no parameter is given, a table of tables) ++ containing the following fields:
      ++
    • name = Protocol Name
    • ++
    • proto = Protocol Number
    • ++
    • aliases = Table of alias names
    • ++
    ++ ++ ++ ++
    ++ ++ ++ ++ ++
    getprotobyname (name)
    ++
    ++ ++ Get protocol entry by name. ++ ++ ++

    Parameters

    ++
      ++ ++
    • ++ name: protocol name to lookup ++
    • ++ ++
    ++ ++ ++ ++ ++

    Usage:

    ++This function returns nil if the given protocol is unknown. ++ ++ ++ ++

    Return value:

    ++Table containing the following fields:
      ++
    • name = Protocol Name
    • ++
    • proto = Protocol Number
    • ++
    • aliases = Table of alias names
    • ++
    ++ ++ ++ ++
    ++ ++ ++ ++ ++
    getprotobynumber (proto)
    ++
    ++ ++ Get protocol entry by number. ++ ++ ++

    Parameters

    ++
      ++ ++
    • ++ proto: protocol number to lookup ++
    • ++ ++
    ++ ++ ++ ++ ++

    Usage:

    ++This function returns nil if the given protocol is unknown. ++ ++ ++ ++

    Return value:

    ++Table containing the following fields:
      ++
    • name = Protocol Name
    • ++
    • proto = Protocol Number
    • ++
    • aliases = Table of alias names
    • ++
    ++ ++ ++ ++
    ++ ++ ++ ++ ++
    getpw (user)
    ++
    ++ ++ (POSIX) Get all or a specific user account. ++ ++ ++

    Parameters

    ++
      ++ ++
    • ++ user: User ID or username (optional) ++
    • ++ ++
    ++ ++ ++ ++ ++ ++ ++

    Return value:

    ++Table containing:
      ++
    • name = Name
    • ++
    • uid = ID
    • ++
    • gid = Group ID
    • ++
    • passwd = Password
    • ++
    • dir = Home directory
    • ++
    • gecos = Information
    • ++
    • shell = Shell
    • ++
    ++ ++ ++ ++
    ++ ++ ++ ++ ++
    getsp (user)
    ++
    ++ ++ (Linux, Solaris) Get all or a specific shadow password entry. ++ ++ ++

    Parameters

    ++
      ++ ++
    • ++ user: username (optional) ++
    • ++ ++
    ++ ++ ++ ++ ++ ++ ++

    Return value:

    ++Table containing:
      ++
    • namp = Name
    • ++
    • expire = Expiration Date
    • ++
    • flag = Flags
    • ++
    • inact = Inactivity Date
    • ++
    • lstchg = Last change
    • ++
    • max = Maximum
    • ++
    • min = Minimum
    • ++
    • warn = Warning
    • ++
    • pwdp = Password Hash
    • ++
    ++ ++ ++ ++
    ++ ++ ++ ++ ++
    getuid ()
    ++
    ++ ++ (POSIX) Get the user id of the current process. ++ ++ ++ ++ ++ ++ ++ ++

    Return value:

    ++process user id ++ ++ ++ ++
    ++ ++ ++ ++ ++
    kill (target, signal)
    ++
    ++ ++ (POSIX) Send a signal to one or more processes. ++ ++ ++

    Parameters

    ++
      ++ ++
    • ++ target: Target process of process group. ++
    • ++ ++
    • ++ signal: Signal to send ++
    • ++ ++
    ++ ++ ++ ++ ++ ++ ++

    Return value:

    ++true ++ ++ ++ ++
    ++ ++ ++ ++ ++
    nanosleep (seconds, nanoseconds)
    ++
    ++ ++ Sleep for a specified amount of time. ++ ++ ++

    Parameters

    ++
      ++ ++
    • ++ seconds: Seconds to wait (optional) ++
    • ++ ++
    • ++ nanoseconds: Nanoseconds to wait (optional) ++
    • ++ ++
    ++ ++ ++ ++ ++

    Usage

    ++
      ++ ++
    • Not all systems support nanosecond precision but you can expect ++ to have at least maillisecond precision. ++ ++
    • This function is not signal-protected and may fail with EINTR. ++ ++
    ++ ++ ++ ++

    Return value:

    ++true ++ ++ ++ ++
    ++ ++ ++ ++ ++
    nice (nice)
    ++
    ++ ++ (POSIX) Change priority of current process. ++ ++ ++

    Parameters

    ++
      ++ ++
    • ++ nice: Nice Value ++
    • ++ ++
    ++ ++ ++ ++ ++ ++ ++

    Return value:

    ++true ++ ++ ++ ++
    ++ ++ ++ ++ ++
    open (path, flags, mode)
    ++
    ++ ++ Open a file. ++ ++ ++

    Parameters

    ++
      ++ ++
    • ++ path: Filesystem path to open ++
    • ++ ++
    • ++ flags: Flag string or number (see open_flags). ++ ["r", "r+", "w", "w+", "a", "a+"] ++
    • ++ ++
    • ++ mode: File mode for newly created files (see chmod, umask). ++
    • ++ ++
    ++ ++ ++ ++ ++

    Usage:

    ++Although this function also supports the traditional fopen() ++ file flags it does not create a file stream but uses the open() syscall. ++ ++ ++ ++

    Return value:

    ++File Object ++ ++ ++ ++

    See also:

    ++ ++ ++
    ++ ++ ++ ++ ++
    open_flags (flag1, ...)
    ++
    ++ ++ Generate flags for a call to open(). ++ ++ ++

    Parameters

    ++
      ++ ++
    • ++ flag1: First Flag ["append", "creat", "excl", "nonblock", "ndelay", ++ "sync", "trunc", "rdonly", "wronly", "rdwr"] ++
    • ++ ++
    • ++ ...: More Flags [-"-] ++
    • ++ ++
    ++ ++ ++ ++ ++

    Usage

    ++
      ++ ++
    • This function cannot fail and will never return nil. ++ ++
    • The "nonblock" and "ndelay" flags are aliases. ++ ++
    • The "nonblock", "ndelay" and "sync" flags are no-ops on Windows. ++ ++
    ++ ++ ++ ++

    Return value:

    ++flag to be used as second paramter to open ++ ++ ++ ++
    ++ ++ ++ ++ ++
    openlog (ident, flag1, ...)
    ++
    ++ ++ (POSIX) Open a connection to the system logger. ++ ++ ++

    Parameters

    ++
      ++ ++
    • ++ ident: Identifier ++
    • ++ ++
    • ++ flag1: Flag 1 ["cons", "nowait", "pid", "perror", "ndelay", "odelay"] ++
    • ++ ++
    • ++ ...: More flags [-"-] ++
    • ++ ++
    ++ ++ ++ ++ ++ ++ ++ ++ ++
    ++ ++ ++ ++ ++
    pipe ()
    ++
    ++ ++ Create a pipe. ++ ++ ++ ++ ++ ++ ++ ++

    Return values:

    ++
      ++ ++
    1. File Object of the read end ++ ++
    2. File Object of the write end ++ ++
    ++ ++ ++ ++
    ++ ++ ++ ++ ++
    poll (fds, timeout)
    ++
    ++ ++ Wait for some event on a file descriptor. ++ poll() sets the revents-field of the tables provided by fds to a bitfield ++ indicating the events that occured. ++ ++ ++

    Parameters

    ++
      ++ ++
    • ++ fds: Table containing one or more tables containing
        ++
      • fd = I/O Descriptor [Socket Object, File Object (POSIX)]
      • ++
      • events = events to wait for (bitfield generated with poll_flags)
      • ++
      ++
    • ++ ++
    • ++ timeout: Timeout in milliseconds ++
    • ++ ++
    ++ ++ ++ ++ ++

    Usage

    ++
      ++ ++
    • This function works in-place on the provided table and only ++ writes the revents field, you can use other fields on your demand. ++ ++
    • All metamethods on the tables provided as fds are ignored. ++ ++
    • The revents-fields are not reset when the call times out. ++ You have to check the first return value to be 0 to handle this case. ++ ++
    • If you want to wait on a TLS-Socket you have to use the underlying ++ socket instead. ++ ++
    • On Windows poll is emulated through select(), can only be used ++ on socket descriptors and cannot take more than 64 descriptors per call. ++ ++
    • This function is not signal-protected and may fail with EINTR. ++ ++
    ++ ++ ++ ++

    Return values:

    ++
      ++ ++
    1. number of ready IO descriptors ++ ++
    2. the fds-table with revents-fields set ++ ++
    ++ ++ ++ ++

    See also:

    ++ ++ ++
    ++ ++ ++ ++ ++
    poll_flags (mode1, ...)
    ++
    ++ ++ Generate events-bitfield or parse revents-bitfield for poll. ++ ++ ++

    Parameters

    ++
      ++ ++
    • ++ mode1: revents-Flag bitfield returned from poll to parse OR ++ ["in", "out", "err", "pri" (POSIX), "hup" (POSIX), "nval" (POSIX)] ++
    • ++ ++
    • ++ ...: More mode strings for generating the flag [-"-] ++
    • ++ ++
    ++ ++ ++ ++ ++ ++ ++

    Return value:

    ++table with boolean fields reflecting the mode parameter ++ OR bitfield to use for the events-Flag field ++ ++ ++ ++

    See also:

    ++ ++ ++
    ++ ++ ++ ++ ++
    sendfile (socket, file, length)
    ++
    ++ ++ (POSIX) Send data from a file to a socket in kernel-space. ++ ++ ++

    Parameters

    ++
      ++ ++
    • ++ socket: Socket Object ++
    • ++ ++
    • ++ file: File Object ++
    • ++ ++
    • ++ length: Amount of data to send (in Bytes). ++
    • ++ ++
    ++ ++ ++ ++ ++ ++ ++

    Return value:

    ++bytes sent ++ ++ ++ ++
    ++ ++ ++ ++ ++
    setenv (variable, value)
    ++
    ++ ++ Set or unset a environment variable. ++ ++ ++

    Parameters

    ++
      ++ ++
    • ++ variable: Variable ++
    • ++ ++
    • ++ value: Value (optional) ++
    • ++ ++
    ++ ++ ++ ++ ++

    Usage:

    ++The environment variable will be unset if value is ommited. ++ ++ ++ ++

    Return value:

    ++true ++ ++ ++ ++
    ++ ++ ++ ++ ++
    setgid (gid)
    ++
    ++ ++ (POSIX) Set the group id of the current process. ++ ++ ++

    Parameters

    ++
      ++ ++
    • ++ gid: New Group ID ++
    • ++ ++
    ++ ++ ++ ++ ++ ++ ++

    Return value:

    ++true ++ ++ ++ ++
    ++ ++ ++ ++ ++
    setlogmask (priority)
    ++
    ++ ++ (POSIX) Set the logmask of the system logger for current process. ++ ++ ++

    Parameters

    ++
      ++ ++
    • ++ priority: Priority ["emerg", "alert", "crit", "err", "warning", ++ "notice", "info", "debug"] ++
    • ++ ++
    ++ ++ ++ ++ ++ ++ ++ ++ ++
    ++ ++ ++ ++ ++
    setsid ()
    ++
    ++ ++ (POSIX) Create a new session and set the process group ID. ++ ++ ++ ++ ++ ++ ++ ++

    Return value:

    ++session id ++ ++ ++ ++
    ++ ++ ++ ++ ++
    setuid (gid)
    ++
    ++ ++ (POSIX) Set the user id of the current process. ++ ++ ++

    Parameters

    ++
      ++ ++
    • ++ gid: New User ID ++
    • ++ ++
    ++ ++ ++ ++ ++ ++ ++

    Return value:

    ++true ++ ++ ++ ++
    ++ ++ ++ ++ ++
    signal (signal, handler)
    ++
    ++ ++ Ignore or use set the default handler for a signal. ++ ++ ++

    Parameters

    ++
      ++ ++
    • ++ signal: Signal ++
    • ++ ++
    • ++ handler: ["ign", "dfl"] ++
    • ++ ++
    ++ ++ ++ ++ ++ ++ ++

    Return value:

    ++true ++ ++ ++ ++
    ++ ++ ++ ++ ++
    socket (domain, type)
    ++
    ++ ++ Create a new socket. ++ ++ ++

    Parameters

    ++
      ++ ++
    • ++ domain: Domain ["inet", "inet6", "unix"] ++
    • ++ ++
    • ++ type: Type ["stream", "dgram", "raw"] ++
    • ++ ++
    ++ ++ ++ ++ ++ ++ ++

    Return value:

    ++Socket Object ++ ++ ++ ++
    ++ ++ ++ ++ ++
    splice (fdin, fdout, length, flags)
    ++
    ++ ++ (Linux) Send data from / to a pipe in kernel-space. ++ ++ ++

    Parameters

    ++
      ++ ++
    • ++ fdin: Input I/O descriptor ++
    • ++ ++
    • ++ fdout: Output I/O descriptor ++
    • ++ ++
    • ++ length: Amount of data to send (in Bytes). ++
    • ++ ++
    • ++ flags: (optional, bitfield generated by splice_flags) ++
    • ++ ++
    ++ ++ ++ ++ ++ ++ ++

    Return value:

    ++bytes sent ++ ++ ++ ++

    See also:

    ++ ++ ++
    ++ ++ ++ ++ ++
    splice_flags (flag1, ...)
    ++
    ++ ++ (Linux) Generate a flag bitfield for a call to splice. ++ ++ ++

    Parameters

    ++
      ++ ++
    • ++ flag1: First Flag ["move", "nonblock", "more"] ++
    • ++ ++
    • ++ ...: More flags [-"-] ++
    • ++ ++
    ++ ++ ++ ++ ++ ++ ++

    Return value:

    ++Flag bitfield ++ ++ ++ ++

    See also:

    ++ ++ ++
    ++ ++ ++ ++ ++
    strerror (errno)
    ++
    ++ ++ Get the error message for the corresponding error code. ++ ++ ++

    Parameters

    ++
      ++ ++
    • ++ errno: System error code ++
    • ++ ++
    ++ ++ ++ ++ ++ ++ ++

    Return value:

    ++Error message ++ ++ ++ ++
    ++ ++ ++ ++ ++
    sysinfo ()
    ++
    ++ ++ (Linux) Get overall system statistics. ++ ++ ++ ++ ++ ++ ++ ++

    Return value:

    ++Table containing:
      ++
    • uptime = system uptime in seconds
    • ++
    • loads = {loadavg1, loadavg5, loadavg15}
    • ++
    • totalram = total RAM
    • ++
    • freeram = free RAM
    • ++
    • sharedram = shared RAM
    • ++
    • bufferram = buffered RAM
    • ++
    • totalswap = total SWAP
    • ++
    • freeswap = free SWAP
    • ++
    • procs = number of running processes
    • ++
    ++ ++ ++ ++
    ++ ++ ++ ++ ++
    syslog (priority)
    ++
    ++ ++ (POSIX) Write a message to the system logger. ++ ++ ++

    Parameters

    ++
      ++ ++
    • ++ priority: Priority ["emerg", "alert", "crit", "err", "warning", ++ "notice", "info", "debug"] ++
    • ++ ++
    ++ ++ ++ ++ ++ ++ ++ ++ ++
    ++ ++ ++ ++ ++
    times ()
    ++
    ++ ++ (POSIX) Get process times. ++ ++ ++ ++ ++ ++ ++ ++

    Return value:

    ++Table containing:
      ++
    • utime = user time
    • ++
    • utime = system time
    • ++
    • cutime = children user time
    • ++
    • cstime = children system time
    • ++
    ++ ++ ++ ++
    ++ ++ ++ ++ ++
    tls (mode)
    ++
    ++ ++ Create a new TLS context. ++ ++ ++

    Parameters

    ++
      ++ ++
    • ++ mode: TLS-Mode ["client", "server"] ++
    • ++ ++
    ++ ++ ++ ++ ++ ++ ++

    Return value:

    ++TLSContext Object ++ ++ ++ ++
    ++ ++ ++ ++ ++
    umask (mask)
    ++
    ++ ++ Sets the file mode creation mask. ++ ++ ++

    Parameters

    ++
      ++ ++
    • ++ mask: New creation mask (see chmod for format specifications) ++
    • ++ ++
    ++ ++ ++ ++ ++ ++ ++

    Return values:

    ++
      ++ ++
    1. the old umask as decimal mode number ++ ++
    2. the old umask as mode string ++ ++
    ++ ++ ++ ++
    ++ ++ ++ ++ ++
    uname ()
    ++
    ++ ++ (POSIX) Get information about current system and kernel. ++ ++ ++ ++ ++ ++ ++ ++

    Return value:

    ++Table containing:
      ++
    • sysname = operating system
    • ++
    • nodename = network name (usually hostname)
    • ++
    • release = OS release
    • ++
    • version = OS version
    • ++
    • machine = hardware identifier
    • ++
    ++ ++ ++ ++
    ++ ++ ++ ++ ++
    waitpid (pid, flag1, ...)
    ++
    ++ ++ (POSIX) Wait for a process to change state. ++ ++ ++

    Parameters

    ++
      ++ ++
    • ++ pid: Process ID (optional, default: any childprocess) ++
    • ++ ++
    • ++ flag1: Flag (optional) ["nohang", "untraced", "continued"] ++
    • ++ ++
    • ++ ...: More Flags [-"-] ++
    • ++ ++
    ++ ++ ++ ++ ++

    Usage:

    ++If the "nohang" is given this function becomes non-blocking. ++ ++ ++ ++

    Return values:

    ++
      ++ ++
    1. process id of child or 0 if no child has changed state ++ ++
    2. ["exited", "signaled", "stopped"] ++ ++
    3. [exit code, terminate signal, stop signal] ++ ++
    ++ ++ ++ ++
    ++ ++ ++
    ++ ++ ++ ++ ++ ++
    ++ ++
    ++ ++
    ++

    Valid XHTML 1.0!

    ++
    ++ ++
    ++ ++ +diff --git a/feeds/luci/documentation/i18n.md b/feeds/luci/documentation/i18n.md +new file mode 100644 +index 0000000..fdacb08 +--- /dev/null ++++ b/feeds/luci/documentation/i18n.md +@@ -0,0 +1,17 @@ ++# General ++Translations are saved in the folder po/. You find the reference in po/templates/.pot. The actual translation files can be found at po//.po . ++ ++In order to use the commands below you need to have the _gettext'' utilities (''msgcat'', ''msgfmt'', ''msgmerge_) installed on your system. ++ ++# Rebuild po files ++If you want to rebuild the translations after you made changes to a package this is an easy way: ++ ++ ++ ./build/i18n-scan.pl applications/[package] > po/templates/[application].pot ++ ./build/i18n-update.pl po [application].po ++ ++*Note:* Some packages share translation files, in this case you need to scan through all their folders. The first command from above should then be: ++ ++ ++ ./build/i18n-scan.pl applications/[package-1] applications/[package-2] applications/[package-n] > po/templates/[application].pot ++ +diff --git a/feeds/luci/libs/luci-lib-httpclient/Makefile b/feeds/luci/libs/luci-lib-httpclient/Makefile +new file mode 100644 +index 0000000..1e7fd1b +--- /dev/null ++++ b/feeds/luci/libs/luci-lib-httpclient/Makefile +@@ -0,0 +1,14 @@ ++# ++# Copyright (C) 2008-2014 The LuCI Team ++# ++# This is free software, licensed under the Apache License, Version 2.0 . ++# ++ ++include $(TOPDIR)/rules.mk ++ ++LUCI_TITLE:=HTTP(S) client library ++LUCI_DEPENDS:=+luci-base +luci-lib-nixio ++ ++include ../../luci.mk ++ ++# call BuildPackage - OpenWrt buildroot signature +diff --git a/feeds/luci/libs/luci-lib-httpclient/luasrc/httpclient.lua b/feeds/luci/libs/luci-lib-httpclient/luasrc/httpclient.lua +new file mode 100644 +index 0000000..c76cc54 +--- /dev/null ++++ b/feeds/luci/libs/luci-lib-httpclient/luasrc/httpclient.lua +@@ -0,0 +1,368 @@ ++-- Copyright 2009 Steven Barth ++-- Licensed to the public under the Apache License 2.0. ++ ++require "nixio.util" ++local nixio = require "nixio" ++ ++local ltn12 = require "luci.ltn12" ++local util = require "luci.util" ++local table = require "table" ++local http = require "luci.http.protocol" ++local date = require "luci.http.protocol.date" ++ ++local type, pairs, ipairs, tonumber = type, pairs, ipairs, tonumber ++local unpack = unpack ++ ++module "luci.httpclient" ++ ++function chunksource(sock, buffer) ++ buffer = buffer or "" ++ return function() ++ local output ++ local _, endp, count = buffer:find("^([0-9a-fA-F]+);?.-\r\n") ++ while not count and #buffer <= 1024 do ++ local newblock, code = sock:recv(1024 - #buffer) ++ if not newblock then ++ return nil, code ++ end ++ buffer = buffer .. newblock ++ _, endp, count = buffer:find("^([0-9a-fA-F]+);?.-\r\n") ++ end ++ count = tonumber(count, 16) ++ if not count then ++ return nil, -1, "invalid encoding" ++ elseif count == 0 then ++ return nil ++ elseif count + 2 <= #buffer - endp then ++ output = buffer:sub(endp+1, endp+count) ++ buffer = buffer:sub(endp+count+3) ++ return output ++ else ++ output = buffer:sub(endp+1, endp+count) ++ buffer = "" ++ if count - #output > 0 then ++ local remain, code = sock:recvall(count-#output) ++ if not remain then ++ return nil, code ++ end ++ output = output .. remain ++ count, code = sock:recvall(2) ++ else ++ count, code = sock:recvall(count+2-#buffer+endp) ++ end ++ if not count then ++ return nil, code ++ end ++ return output ++ end ++ end ++end ++ ++ ++function request_to_buffer(uri, options) ++ local source, code, msg = request_to_source(uri, options) ++ local output = {} ++ ++ if not source then ++ return nil, code, msg ++ end ++ ++ source, code = ltn12.pump.all(source, (ltn12.sink.table(output))) ++ ++ if not source then ++ return nil, code ++ end ++ ++ return table.concat(output) ++end ++ ++function request_to_source(uri, options) ++ local status, response, buffer, sock = request_raw(uri, options) ++ if not status then ++ return status, response, buffer ++ elseif status ~= 200 and status ~= 206 then ++ return nil, status, buffer ++ end ++ ++ if response.headers["Transfer-Encoding"] == "chunked" then ++ return chunksource(sock, buffer) ++ else ++ return ltn12.source.cat(ltn12.source.string(buffer), sock:blocksource()) ++ end ++end ++ ++-- ++-- GET HTTP-resource ++-- ++function request_raw(uri, options) ++ options = options or {} ++ local pr, auth, host, port, path ++ ++ if options.params then ++ uri = uri .. '?' .. http.urlencode_params(options.params) ++ end ++ ++ if uri:find("%[") then ++ if uri:find("@") then ++ pr, auth, host, port, path = uri:match("(%w+)://(.+)@(%b[]):?([0-9]*)(.*)") ++ host = host:sub(2,-2) ++ else ++ pr, host, port, path = uri:match("(%w+)://(%b[]):?([0-9]*)(.*)") ++ host = host:sub(2,-2) ++ end ++ else ++ if uri:find("@") then ++ pr, auth, host, port, path = ++ uri:match("(%w+)://(.+)@([%w-.]+):?([0-9]*)(.*)") ++ else ++ pr, host, port, path = uri:match("(%w+)://([%w-.]+):?([0-9]*)(.*)") ++ end ++ end ++ ++ if not host then ++ return nil, -1, "unable to parse URI" ++ end ++ ++ if pr ~= "http" and pr ~= "https" then ++ return nil, -2, "protocol not supported" ++ end ++ ++ port = #port > 0 and port or (pr == "https" and 443 or 80) ++ path = #path > 0 and path or "/" ++ ++ options.depth = options.depth or 10 ++ local headers = options.headers or {} ++ local protocol = options.protocol or "HTTP/1.1" ++ headers["User-Agent"] = headers["User-Agent"] or "LuCI httpclient 0.1" ++ ++ if headers.Connection == nil then ++ headers.Connection = "close" ++ end ++ ++ if auth and not headers.Authorization then ++ headers.Authorization = "Basic " .. nixio.bin.b64encode(auth) ++ end ++ ++ local sock, code, msg = nixio.connect(host, port) ++ if not sock then ++ return nil, code, msg ++ end ++ ++ sock:setsockopt("socket", "sndtimeo", options.sndtimeo or 15) ++ sock:setsockopt("socket", "rcvtimeo", options.rcvtimeo or 15) ++ ++ if pr == "https" then ++ local tls = options.tls_context or nixio.tls() ++ sock = tls:create(sock) ++ local stat, code, error = sock:connect() ++ if not stat then ++ return stat, code, error ++ end ++ end ++ ++ -- Pre assemble fixes ++ if protocol == "HTTP/1.1" then ++ headers.Host = headers.Host or host ++ end ++ ++ if type(options.body) == "table" then ++ options.body = http.urlencode_params(options.body) ++ end ++ ++ if type(options.body) == "string" then ++ headers["Content-Length"] = headers["Content-Length"] or #options.body ++ headers["Content-Type"] = headers["Content-Type"] or ++ "application/x-www-form-urlencoded" ++ options.method = options.method or "POST" ++ end ++ ++ if type(options.body) == "function" then ++ options.method = options.method or "POST" ++ end ++ ++ if options.cookies then ++ local cookiedata = {} ++ for _, c in ipairs(options.cookies) do ++ local cdo = c.flags.domain ++ local cpa = c.flags.path ++ if (cdo == host or cdo == "."..host or host:sub(-#cdo) == cdo) ++ and (cpa == path or cpa == "/" or cpa .. "/" == path:sub(#cpa+1)) ++ and (not c.flags.secure or pr == "https") ++ then ++ cookiedata[#cookiedata+1] = c.key .. "=" .. c.value ++ end ++ end ++ if headers["Cookie"] then ++ headers["Cookie"] = headers["Cookie"] .. "; " .. table.concat(cookiedata, "; ") ++ else ++ headers["Cookie"] = table.concat(cookiedata, "; ") ++ end ++ end ++ ++ -- Assemble message ++ local message = {(options.method or "GET") .. " " .. path .. " " .. protocol} ++ ++ for k, v in pairs(headers) do ++ if type(v) == "string" or type(v) == "number" then ++ message[#message+1] = k .. ": " .. v ++ elseif type(v) == "table" then ++ for i, j in ipairs(v) do ++ message[#message+1] = k .. ": " .. j ++ end ++ end ++ end ++ ++ message[#message+1] = "" ++ message[#message+1] = "" ++ ++ -- Send request ++ sock:sendall(table.concat(message, "\r\n")) ++ ++ if type(options.body) == "string" then ++ sock:sendall(options.body) ++ elseif type(options.body) == "function" then ++ local res = {options.body(sock)} ++ if not res[1] then ++ sock:close() ++ return unpack(res) ++ end ++ end ++ ++ -- Create source and fetch response ++ local linesrc = sock:linesource() ++ local line, code, error = linesrc() ++ ++ if not line then ++ sock:close() ++ return nil, code, error ++ end ++ ++ local protocol, status, msg = line:match("^([%w./]+) ([0-9]+) (.*)") ++ ++ if not protocol then ++ sock:close() ++ return nil, -3, "invalid response magic: " .. line ++ end ++ ++ local response = { ++ status = line, headers = {}, code = 0, cookies = {}, uri = uri ++ } ++ ++ line = linesrc() ++ while line and line ~= "" do ++ local key, val = line:match("^([%w-]+)%s?:%s?(.*)") ++ if key and key ~= "Status" then ++ if type(response.headers[key]) == "string" then ++ response.headers[key] = {response.headers[key], val} ++ elseif type(response.headers[key]) == "table" then ++ response.headers[key][#response.headers[key]+1] = val ++ else ++ response.headers[key] = val ++ end ++ end ++ line = linesrc() ++ end ++ ++ if not line then ++ sock:close() ++ return nil, -4, "protocol error" ++ end ++ ++ -- Parse cookies ++ if response.headers["Set-Cookie"] then ++ local cookies = response.headers["Set-Cookie"] ++ for _, c in ipairs(type(cookies) == "table" and cookies or {cookies}) do ++ local cobj = cookie_parse(c) ++ cobj.flags.path = cobj.flags.path or path:match("(/.*)/?[^/]*") ++ if not cobj.flags.domain or cobj.flags.domain == "" then ++ cobj.flags.domain = host ++ response.cookies[#response.cookies+1] = cobj ++ else ++ local hprt, cprt = {}, {} ++ ++ -- Split hostnames and save them in reverse order ++ for part in host:gmatch("[^.]*") do ++ table.insert(hprt, 1, part) ++ end ++ for part in cobj.flags.domain:gmatch("[^.]*") do ++ table.insert(cprt, 1, part) ++ end ++ ++ local valid = true ++ for i, part in ipairs(cprt) do ++ -- If parts are different and no wildcard ++ if hprt[i] ~= part and #part ~= 0 then ++ valid = false ++ break ++ -- Wildcard on invalid position ++ elseif hprt[i] ~= part and #part == 0 then ++ if i ~= #cprt or (#hprt ~= i and #hprt+1 ~= i) then ++ valid = false ++ break ++ end ++ end ++ end ++ -- No TLD cookies ++ if valid and #cprt > 1 and #cprt[2] > 0 then ++ response.cookies[#response.cookies+1] = cobj ++ end ++ end ++ end ++ end ++ ++ -- Follow ++ response.code = tonumber(status) ++ if response.code and options.depth > 0 then ++ if (response.code == 301 or response.code == 302 or response.code == 307) ++ and response.headers.Location then ++ local nuri = response.headers.Location or response.headers.location ++ if not nuri then ++ return nil, -5, "invalid reference" ++ end ++ if not nuri:find("https?://") then ++ nuri = pr .. "://" .. host .. ":" .. port .. nuri ++ end ++ ++ options.depth = options.depth - 1 ++ if options.headers then ++ options.headers.Host = nil ++ end ++ sock:close() ++ ++ return request_raw(nuri, options) ++ end ++ end ++ ++ return response.code, response, linesrc(true)..sock:readall(), sock ++end ++ ++function cookie_parse(cookiestr) ++ local key, val, flags = cookiestr:match("%s?([^=;]+)=?([^;]*)(.*)") ++ if not key then ++ return nil ++ end ++ ++ local cookie = {key = key, value = val, flags = {}} ++ for fkey, fval in flags:gmatch(";%s?([^=;]+)=?([^;]*)") do ++ fkey = fkey:lower() ++ if fkey == "expires" then ++ fval = date.to_unix(fval:gsub("%-", " ")) ++ end ++ cookie.flags[fkey] = fval ++ end ++ ++ return cookie ++end ++ ++function cookie_create(cookie) ++ local cookiedata = {cookie.key .. "=" .. cookie.value} ++ ++ for k, v in pairs(cookie.flags) do ++ if k == "expires" then ++ v = date.to_http(v):gsub(", (%w+) (%w+) (%w+) ", ", %1-%2-%3 ") ++ end ++ cookiedata[#cookiedata+1] = k .. ((#v > 0) and ("=" .. v) or "") ++ end ++ ++ return table.concat(cookiedata, "; ") ++end +diff --git a/feeds/luci/libs/luci-lib-httpclient/luasrc/httpclient/receiver.lua b/feeds/luci/libs/luci-lib-httpclient/luasrc/httpclient/receiver.lua +new file mode 100644 +index 0000000..b886e96 +--- /dev/null ++++ b/feeds/luci/libs/luci-lib-httpclient/luasrc/httpclient/receiver.lua +@@ -0,0 +1,284 @@ ++-- Copyright 2009 Steven Barth ++-- Licensed to the public under the Apache License 2.0. ++ ++require "nixio.util" ++local nixio = require "nixio" ++local httpc = require "luci.httpclient" ++local ltn12 = require "luci.ltn12" ++ ++local print, tonumber, require, unpack = print, tonumber, require, unpack ++ ++module "luci.httpclient.receiver" ++ ++local function prepare_fd(target) ++ -- Open fd for appending ++ local oflags = nixio.open_flags("wronly", "creat") ++ local file, code, msg = nixio.open(target, oflags) ++ if not file then ++ return file, code, msg ++ end ++ ++ -- Acquire lock ++ local stat, code, msg = file:lock("tlock") ++ if not stat then ++ return stat, code, msg ++ end ++ ++ file:seek(0, "end") ++ ++ return file ++end ++ ++local function splice_async(sock, pipeout, pipein, file, cb) ++ local ssize = 65536 ++ local smode = nixio.splice_flags("move", "more", "nonblock") ++ ++ -- Set pipe non-blocking otherwise we might end in a deadlock ++ local stat, code, msg = pipein:setblocking(false) ++ if stat then ++ stat, code, msg = pipeout:setblocking(false) ++ end ++ if not stat then ++ return stat, code, msg ++ end ++ ++ ++ local pollsock = { ++ {fd=sock, events=nixio.poll_flags("in")} ++ } ++ ++ local pollfile = { ++ {fd=file, events=nixio.poll_flags("out")} ++ } ++ ++ local done ++ local active -- Older splice implementations sometimes don't detect EOS ++ ++ repeat ++ active = false ++ ++ -- Socket -> Pipe ++ repeat ++ nixio.poll(pollsock, 15000) ++ ++ stat, code, msg = nixio.splice(sock, pipeout, ssize, smode) ++ if stat == nil then ++ return stat, code, msg ++ elseif stat == 0 then ++ done = true ++ break ++ elseif stat then ++ active = true ++ end ++ until stat == false ++ ++ -- Pipe -> File ++ repeat ++ nixio.poll(pollfile, 15000) ++ ++ stat, code, msg = nixio.splice(pipein, file, ssize, smode) ++ if stat == nil then ++ return stat, code, msg ++ elseif stat then ++ active = true ++ end ++ until stat == false ++ ++ if cb then ++ cb(file) ++ end ++ ++ if not active then ++ -- We did not splice any data, maybe EOS, fallback to default ++ return false ++ end ++ until done ++ ++ pipein:close() ++ pipeout:close() ++ sock:close() ++ file:close() ++ return true ++end ++ ++local function splice_sync(sock, pipeout, pipein, file, cb) ++ local os = require "os" ++ local ssize = 65536 ++ local smode = nixio.splice_flags("move", "more") ++ local stat ++ ++ -- This is probably the only forking http-client ;-) ++ local pid, code, msg = nixio.fork() ++ if not pid then ++ return pid, code, msg ++ elseif pid == 0 then ++ pipein:close() ++ file:close() ++ ++ repeat ++ stat, code = nixio.splice(sock, pipeout, ssize, smode) ++ until not stat or stat == 0 ++ ++ pipeout:close() ++ sock:close() ++ os.exit(stat or code) ++ else ++ pipeout:close() ++ sock:close() ++ ++ repeat ++ stat, code, msg = nixio.splice(pipein, file, ssize, smode) ++ if cb then ++ cb(file) ++ end ++ until not stat or stat == 0 ++ ++ pipein:close() ++ file:close() ++ ++ if not stat then ++ nixio.kill(pid, 15) ++ nixio.wait(pid) ++ return stat, code, msg ++ else ++ pid, msg, code = nixio.wait(pid) ++ if msg == "exited" then ++ if code == 0 then ++ return true ++ else ++ return nil, code, nixio.strerror(code) ++ end ++ else ++ return nil, -0x11, "broken pump" ++ end ++ end ++ end ++end ++ ++function request_to_file(uri, target, options, cbs) ++ options = options or {} ++ cbs = cbs or {} ++ options.headers = options.headers or {} ++ local hdr = options.headers ++ local file, code, msg ++ ++ if target then ++ file, code, msg = prepare_fd(target) ++ if not file then ++ return file, code, msg ++ end ++ ++ local off = file:tell() ++ ++ -- Set content range ++ if off > 0 then ++ hdr.Range = hdr.Range or ("bytes=" .. off .. "-") ++ end ++ end ++ ++ local code, resp, buffer, sock = httpc.request_raw(uri, options) ++ if not code then ++ -- No success ++ if file then ++ file:close() ++ end ++ return code, resp, buffer ++ elseif hdr.Range and code ~= 206 then ++ -- We wanted a part but we got the while file ++ sock:close() ++ if file then ++ file:close() ++ end ++ return nil, -4, code, resp ++ elseif not hdr.Range and code ~= 200 then ++ -- We encountered an error ++ sock:close() ++ if file then ++ file:close() ++ end ++ return nil, -4, code, resp ++ end ++ ++ if cbs.on_header then ++ local stat = {cbs.on_header(file, code, resp)} ++ if stat[1] == false then ++ if file then ++ file:close() ++ end ++ sock:close() ++ return unpack(stat) ++ elseif stat[2] then ++ file = file and stat[2] ++ end ++ end ++ ++ if not file then ++ return nil, -5, "no target given" ++ end ++ ++ local chunked = resp.headers["Transfer-Encoding"] == "chunked" ++ local stat ++ ++ -- Write the buffer to file ++ file:writeall(buffer) ++ ++ repeat ++ if not options.splice or not sock:is_socket() or chunked then ++ break ++ end ++ ++ -- This is a plain TCP socket and there is no encoding so we can splice ++ ++ local pipein, pipeout, msg = nixio.pipe() ++ if not pipein then ++ sock:close() ++ file:close() ++ return pipein, pipeout, msg ++ end ++ ++ ++ -- Adjust splice values ++ local ssize = 65536 ++ local smode = nixio.splice_flags("move", "more") ++ ++ -- Splicing 512 bytes should never block on a fresh pipe ++ local stat, code, msg = nixio.splice(sock, pipeout, 512, smode) ++ if stat == nil then ++ break ++ end ++ ++ -- Now do the real splicing ++ local cb = cbs.on_write ++ if options.splice == "asynchronous" then ++ stat, code, msg = splice_async(sock, pipeout, pipein, file, cb) ++ elseif options.splice == "synchronous" then ++ stat, code, msg = splice_sync(sock, pipeout, pipein, file, cb) ++ else ++ break ++ end ++ ++ if stat == false then ++ break ++ end ++ ++ return stat, code, msg ++ until true ++ ++ local src = chunked and httpc.chunksource(sock) or sock:blocksource() ++ local snk = file:sink() ++ ++ if cbs.on_write then ++ src = ltn12.source.chain(src, function(chunk) ++ cbs.on_write(file) ++ return chunk ++ end) ++ end ++ ++ -- Fallback to read/write ++ stat, code, msg = ltn12.pump.all(src, snk) ++ ++ file:close() ++ sock:close() ++ return stat and true, code, msg ++end ++ +diff --git a/feeds/luci/libs/luci-lib-ip/Makefile b/feeds/luci/libs/luci-lib-ip/Makefile +new file mode 100644 +index 0000000..eb80dcb +--- /dev/null ++++ b/feeds/luci/libs/luci-lib-ip/Makefile +@@ -0,0 +1,14 @@ ++# ++# Copyright (C) 2015 LuCI Team ++# ++# This is free software, licensed under the Apache License, Version 2.0 . ++# ++ ++include $(TOPDIR)/rules.mk ++ ++LUCI_TITLE:=Lua library for IP calculation and routing information ++LUCI_DEPENDS:=+liblua +libnl-tiny ++ ++include ../../luci.mk ++ ++# call BuildPackage - OpenWrt buildroot signature +diff --git a/feeds/luci/libs/luci-lib-ip/src/Makefile b/feeds/luci/libs/luci-lib-ip/src/Makefile +new file mode 100644 +index 0000000..76abd27 +--- /dev/null ++++ b/feeds/luci/libs/luci-lib-ip/src/Makefile +@@ -0,0 +1,17 @@ ++IP_CFLAGS = -std=gnu99 -I$(STAGING_DIR)/usr/include/libnl-tiny/ ++IP_LDFLAGS = -llua -lm -lnl-tiny ++IP_OBJ = ip.o ++IP_LIB = ip.so ++ ++%.o: %.c ++ $(CC) $(CPPFLAGS) $(CFLAGS) $(LUA_CFLAGS) $(IP_CFLAGS) $(FPIC) -c -o $@ $< ++ ++compile: $(IP_OBJ) ++ $(CC) $(LDFLAGS) -shared -o $(IP_LIB) $(IP_OBJ) $(IP_LDFLAGS) ++ ++install: compile ++ mkdir -p $(DESTDIR)/usr/lib/lua/luci ++ cp $(IP_LIB) $(DESTDIR)/usr/lib/lua/luci/$(IP_LIB) ++ ++clean: ++ rm -f *.o *.so +diff --git a/feeds/luci/libs/luci-lib-ip/src/ip.c b/feeds/luci/libs/luci-lib-ip/src/ip.c +new file mode 100644 +index 0000000..b91966c +--- /dev/null ++++ b/feeds/luci/libs/luci-lib-ip/src/ip.c +@@ -0,0 +1,1392 @@ ++/* ++Copyright 2015 Jo-Philipp Wich ++ ++Licensed under the Apache License, Version 2.0 (the "License"); ++you may not use this file except in compliance with the License. ++You may obtain a copy of the License at ++ ++ http://www.apache.org/licenses/LICENSE-2.0 ++ ++Unless required by applicable law or agreed to in writing, software ++distributed under the License is distributed on an "AS IS" BASIS, ++WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. ++See the License for the specific language governing permissions and ++limitations under the License. ++*/ ++ ++#define _GNU_SOURCE ++ ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++ ++#include ++#include ++#include ++ ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++ ++#define LUCI_IP "luci.ip" ++#define LUCI_IP_CIDR "luci.ip.cidr" ++ ++#define RTA_INT(x) (*(int *)RTA_DATA(x)) ++#define RTA_U32(x) (*(uint32_t *)RTA_DATA(x)) ++ ++static int hz = 0; ++static struct nl_sock *sock = NULL; ++ ++typedef struct { ++ union { ++ struct in_addr v4; ++ struct in6_addr v6; ++ } addr; ++ int len; ++ int bits; ++ int family; ++ bool exact; ++} cidr_t; ++ ++struct dump_filter { ++ bool get; ++ int family; ++ int iif; ++ int oif; ++ int type; ++ int scope; ++ int proto; ++ int table; ++ cidr_t gw; ++ cidr_t from; ++ cidr_t src; ++ cidr_t dst; ++ struct ether_addr mac; ++}; ++ ++struct dump_state { ++ int index; ++ int pending; ++ int callback; ++ struct lua_State *L; ++ struct dump_filter *filter; ++}; ++ ++ ++static int _cidr_new(lua_State *L, int index, int family, bool mask); ++ ++static cidr_t *L_checkcidr (lua_State *L, int index, cidr_t *p) ++{ ++ if (lua_type(L, index) == LUA_TUSERDATA) ++ return luaL_checkudata(L, index, LUCI_IP_CIDR); ++ ++ if (_cidr_new(L, index, p ? p->family : 0, false)) ++ return lua_touserdata(L, -1); ++ ++ luaL_error(L, "Invalid operand"); ++ return NULL; ++} ++ ++static bool parse_mask(int family, const char *mask, int *bits) ++{ ++ char *e; ++ struct in_addr m; ++ struct in6_addr m6; ++ ++ if (family == AF_INET && inet_pton(AF_INET, mask, &m)) ++ { ++ for (*bits = 0, m.s_addr = ntohl(m.s_addr); ++ *bits < 32 && (m.s_addr << *bits) & 0x80000000; ++ ++*bits); ++ } ++ else if (family == AF_INET6 && inet_pton(AF_INET6, mask, &m6)) ++ { ++ for (*bits = 0; ++ *bits < 128 && (m6.s6_addr[*bits / 8] << (*bits % 8)) & 128; ++ ++*bits); ++ } ++ else ++ { ++ *bits = strtoul(mask, &e, 10); ++ ++ if (e == mask || *e != 0 || *bits > ((family == AF_INET) ? 32 : 128)) ++ return false; ++ } ++ ++ return true; ++} ++ ++static bool parse_cidr(const char *dest, cidr_t *pp) ++{ ++ char *p, buf[INET6_ADDRSTRLEN * 2 + 2]; ++ uint8_t bitlen = 0; ++ ++ strncpy(buf, dest, sizeof(buf) - 1); ++ ++ p = strchr(buf, '/'); ++ ++ if (p) ++ *p++ = 0; ++ ++ if (inet_pton(AF_INET, buf, &pp->addr.v4)) ++ { ++ bitlen = 32; ++ pp->family = AF_INET; ++ pp->len = sizeof(struct in_addr); ++ } ++ else if (inet_pton(AF_INET6, buf, &pp->addr.v6)) ++ { ++ bitlen = 128; ++ pp->family = AF_INET6; ++ pp->len = sizeof(struct in6_addr); ++ } ++ else ++ return false; ++ ++ if (p) ++ { ++ if (!parse_mask(pp->family, p, &pp->bits)) ++ return false; ++ } ++ else ++ { ++ pp->bits = bitlen; ++ } ++ ++ return true; ++} ++ ++static int L_getint(lua_State *L, int index, const char *name) ++{ ++ int rv = 0; ++ ++ lua_getfield(L, index, name); ++ ++ if (lua_type(L, -1) == LUA_TNUMBER) ++ rv = lua_tonumber(L, -1); ++ ++ lua_pop(L, 1); ++ ++ return rv; ++} ++ ++static const char * L_getstr(lua_State *L, int index, const char *name) ++{ ++ const char *rv = NULL; ++ ++ lua_getfield(L, index, name); ++ ++ if (lua_type(L, -1) == LUA_TSTRING) ++ rv = lua_tostring(L, -1); ++ ++ lua_pop(L, 1); ++ ++ return rv; ++} ++ ++static void L_setint(struct lua_State *L, const char *name, uint32_t n) ++{ ++ lua_pushinteger(L, n); ++ lua_setfield(L, -2, name); ++} ++ ++static void L_setbool(struct lua_State *L, const char *name, bool val) ++{ ++ lua_pushboolean(L, val); ++ lua_setfield(L, -2, name); ++} ++ ++static void L_setaddr(struct lua_State *L, const char *name, ++ int family, void *addr, int bits) ++{ ++ cidr_t *p; ++ ++ if (!addr) ++ return; ++ ++ p = lua_newuserdata(L, sizeof(*p)); ++ ++ if (!p) ++ return; ++ ++ if (family == AF_INET) ++ { ++ p->family = AF_INET; ++ p->bits = (bits < 0) ? 32 : bits; ++ p->len = sizeof(p->addr.v4); ++ p->addr.v4 = *(struct in_addr *)addr; ++ } ++ else ++ { ++ p->family = AF_INET6; ++ p->bits = (bits < 0) ? 128 : bits; ++ p->len = sizeof(p->addr.v6); ++ p->addr.v6 = *(struct in6_addr *)addr; ++ } ++ ++ luaL_getmetatable(L, LUCI_IP_CIDR); ++ lua_setmetatable(L, -2); ++ lua_setfield(L, -2, name); ++} ++ ++static void L_setstr(struct lua_State *L, const char *name, const char *val) ++{ ++ lua_pushstring(L, val); ++ lua_setfield(L, -2, name); ++} ++ ++static void L_setdev(struct lua_State *L, const char *name, ++ struct nlattr *attr) ++{ ++ char buf[32]; ++ ++ if (if_indextoname(RTA_INT(attr), buf)) ++ L_setstr(L, name, buf); ++} ++ ++static int L_checkbits(lua_State *L, int index, cidr_t *p) ++{ ++ int bits; ++ ++ if (lua_gettop(L) < index || lua_isnil(L, index)) ++ { ++ bits = p->bits; ++ } ++ else if (lua_type(L, index) == LUA_TNUMBER) ++ { ++ bits = lua_tointeger(L, index); ++ ++ if (bits < 0 || bits > ((p->family == AF_INET) ? 32 : 128)) ++ return luaL_error(L, "Invalid prefix size"); ++ } ++ else if (lua_type(L, index) == LUA_TSTRING) ++ { ++ if (!parse_mask(p->family, lua_tostring(L, index), &bits)) ++ return luaL_error(L, "Invalid netmask format"); ++ } ++ else ++ { ++ return luaL_error(L, "Invalid data type"); ++ } ++ ++ return bits; ++} ++ ++static int _cidr_new(lua_State *L, int index, int family, bool mask) ++{ ++ uint32_t n; ++ const char *addr; ++ cidr_t cidr = { }, *cidrp; ++ ++ if (lua_type(L, index) == LUA_TNUMBER) ++ { ++ n = htonl(lua_tointeger(L, index)); ++ ++ if (family == AF_INET6) ++ { ++ cidr.family = AF_INET6; ++ cidr.bits = 128; ++ cidr.len = sizeof(cidr.addr.v6); ++ cidr.addr.v6.s6_addr[12] = n; ++ cidr.addr.v6.s6_addr[13] = (n >> 8); ++ cidr.addr.v6.s6_addr[14] = (n >> 16); ++ cidr.addr.v6.s6_addr[15] = (n >> 24); ++ } ++ else ++ { ++ cidr.family = AF_INET; ++ cidr.bits = 32; ++ cidr.len = sizeof(cidr.addr.v4); ++ cidr.addr.v4.s_addr = n; ++ } ++ } ++ else ++ { ++ addr = luaL_checkstring(L, index); ++ ++ if (!parse_cidr(addr, &cidr)) ++ return 0; ++ ++ if (family && cidr.family != family) ++ return 0; ++ ++ if (mask) ++ cidr.bits = L_checkbits(L, index + 1, &cidr); ++ } ++ ++ if (!(cidrp = lua_newuserdata(L, sizeof(*cidrp)))) ++ return 0; ++ ++ *cidrp = cidr; ++ luaL_getmetatable(L, LUCI_IP_CIDR); ++ lua_setmetatable(L, -2); ++ return 1; ++} ++ ++static int cidr_new(lua_State *L) ++{ ++ return _cidr_new(L, 1, 0, true); ++} ++ ++static int cidr_ipv4(lua_State *L) ++{ ++ return _cidr_new(L, 1, AF_INET, true); ++} ++ ++static int cidr_ipv6(lua_State *L) ++{ ++ return _cidr_new(L, 1, AF_INET6, true); ++} ++ ++static int cidr_is4(lua_State *L) ++{ ++ cidr_t *p = L_checkcidr(L, 1, NULL); ++ ++ lua_pushboolean(L, p->family == AF_INET); ++ return 1; ++} ++ ++static int cidr_is4rfc1918(lua_State *L) ++{ ++ cidr_t *p = L_checkcidr(L, 1, NULL); ++ uint32_t a = htonl(p->addr.v4.s_addr); ++ ++ lua_pushboolean(L, (p->family == AF_INET && ++ ((a >= 0x0A000000 && a <= 0x0AFFFFFF) || ++ (a >= 0xAC100000 && a <= 0xAC1FFFFF) || ++ (a >= 0xC0A80000 && a <= 0xC0A8FFFF)))); ++ ++ return 1; ++} ++ ++static int cidr_is4linklocal(lua_State *L) ++{ ++ cidr_t *p = L_checkcidr(L, 1, NULL); ++ uint32_t a = htonl(p->addr.v4.s_addr); ++ ++ lua_pushboolean(L, (p->family == AF_INET && ++ a >= 0xA9FE0000 && ++ a <= 0xA9FEFFFF)); ++ ++ return 1; ++} ++ ++static bool _is_mapped4(cidr_t *p) ++{ ++ return (p->family == AF_INET6 && ++ p->addr.v6.s6_addr[0] == 0 && ++ p->addr.v6.s6_addr[1] == 0 && ++ p->addr.v6.s6_addr[2] == 0 && ++ p->addr.v6.s6_addr[3] == 0 && ++ p->addr.v6.s6_addr[4] == 0 && ++ p->addr.v6.s6_addr[5] == 0 && ++ p->addr.v6.s6_addr[6] == 0 && ++ p->addr.v6.s6_addr[7] == 0 && ++ p->addr.v6.s6_addr[8] == 0 && ++ p->addr.v6.s6_addr[9] == 0 && ++ p->addr.v6.s6_addr[10] == 0xFF && ++ p->addr.v6.s6_addr[11] == 0xFF); ++} ++ ++static int cidr_is6mapped4(lua_State *L) ++{ ++ cidr_t *p = L_checkcidr(L, 1, NULL); ++ ++ lua_pushboolean(L, _is_mapped4(p)); ++ return 1; ++} ++ ++static int cidr_is6(lua_State *L) ++{ ++ cidr_t *p = L_checkcidr(L, 1, NULL); ++ ++ lua_pushboolean(L, p->family == AF_INET6); ++ return 1; ++} ++ ++static int cidr_is6linklocal(lua_State *L) ++{ ++ cidr_t *p = L_checkcidr(L, 1, NULL); ++ ++ lua_pushboolean(L, (p->family == AF_INET6 && ++ p->addr.v6.s6_addr[0] == 0xFE && ++ p->addr.v6.s6_addr[1] >= 0x80 && ++ p->addr.v6.s6_addr[1] <= 0xBF)); ++ ++ return 1; ++} ++ ++static int _cidr_cmp(lua_State *L) ++{ ++ cidr_t *a = L_checkcidr(L, 1, NULL); ++ cidr_t *b = L_checkcidr(L, 2, NULL); ++ ++ if (a->family != b->family) ++ return (a->family - b->family); ++ ++ return memcmp(&a->addr.v6, &b->addr.v6, a->len); ++} ++ ++static int cidr_lower(lua_State *L) ++{ ++ lua_pushboolean(L, _cidr_cmp(L) < 0); ++ return 1; ++} ++ ++static int cidr_higher(lua_State *L) ++{ ++ lua_pushboolean(L, _cidr_cmp(L) > 0); ++ return 1; ++} ++ ++static int cidr_equal(lua_State *L) ++{ ++ lua_pushboolean(L, _cidr_cmp(L) == 0); ++ return 1; ++} ++ ++static int cidr_lower_equal(lua_State *L) ++{ ++ lua_pushboolean(L, _cidr_cmp(L) <= 0); ++ return 1; ++} ++ ++static int cidr_prefix(lua_State *L) ++{ ++ cidr_t *p = L_checkcidr(L, 1, NULL); ++ int bits = L_checkbits(L, 2, p); ++ ++ p->bits = bits; ++ lua_pushinteger(L, p->bits); ++ return 1; ++} ++ ++static void _apply_mask(cidr_t *p, int bits, bool inv) ++{ ++ uint8_t b, i; ++ ++ if (bits <= 0) ++ { ++ memset(&p->addr.v6, inv * 0xFF, p->len); ++ } ++ else if (p->family == AF_INET && bits <= 32) ++ { ++ if (inv) ++ p->addr.v4.s_addr |= ntohl((1 << (32 - bits)) - 1); ++ else ++ p->addr.v4.s_addr &= ntohl(~((1 << (32 - bits)) - 1)); ++ } ++ else if (p->family == AF_INET6 && bits <= 128) ++ { ++ for (i = 0; i < sizeof(p->addr.v6.s6_addr); i++) ++ { ++ b = (bits > 8) ? 8 : bits; ++ if (inv) ++ p->addr.v6.s6_addr[i] |= ~((uint8_t)(0xFF << (8 - b))); ++ else ++ p->addr.v6.s6_addr[i] &= (uint8_t)(0xFF << (8 - b)); ++ bits -= b; ++ } ++ } ++} ++ ++static int cidr_network(lua_State *L) ++{ ++ cidr_t *p1 = L_checkcidr(L, 1, NULL), *p2; ++ int bits = L_checkbits(L, 2, p1); ++ ++ if (!(p2 = lua_newuserdata(L, sizeof(*p2)))) ++ return 0; ++ ++ *p2 = *p1; ++ p2->bits = (p1->family == AF_INET) ? 32 : 128; ++ _apply_mask(p2, bits, false); ++ ++ luaL_getmetatable(L, LUCI_IP_CIDR); ++ lua_setmetatable(L, -2); ++ return 1; ++} ++ ++static int cidr_host(lua_State *L) ++{ ++ cidr_t *p1 = L_checkcidr(L, 1, NULL); ++ cidr_t *p2 = lua_newuserdata(L, sizeof(*p2)); ++ ++ if (!p2) ++ return 0; ++ ++ *p2 = *p1; ++ p2->bits = (p1->family == AF_INET) ? 32 : 128; ++ ++ luaL_getmetatable(L, LUCI_IP_CIDR); ++ lua_setmetatable(L, -2); ++ return 1; ++} ++ ++static int cidr_mask(lua_State *L) ++{ ++ cidr_t *p1 = L_checkcidr(L, 1, NULL), *p2; ++ int bits = L_checkbits(L, 2, p1); ++ ++ if (!(p2 = lua_newuserdata(L, sizeof(*p2)))) ++ return 0; ++ ++ p2->bits = (p1->family == AF_INET) ? 32 : 128; ++ p2->family = p1->family; ++ ++ memset(&p2->addr.v6.s6_addr, 0xFF, sizeof(p2->addr.v6.s6_addr)); ++ _apply_mask(p2, bits, false); ++ ++ luaL_getmetatable(L, LUCI_IP_CIDR); ++ lua_setmetatable(L, -2); ++ return 1; ++} ++ ++static int cidr_broadcast(lua_State *L) ++{ ++ cidr_t *p1 = L_checkcidr(L, 1, NULL); ++ cidr_t *p2; ++ int bits = L_checkbits(L, 2, p1); ++ ++ if (p1->family == AF_INET6) ++ return 0; ++ ++ if (!(p2 = lua_newuserdata(L, sizeof(*p2)))) ++ return 0; ++ ++ *p2 = *p1; ++ p2->bits = (p1->family == AF_INET) ? 32 : 128; ++ _apply_mask(p2, bits, true); ++ ++ luaL_getmetatable(L, LUCI_IP_CIDR); ++ lua_setmetatable(L, -2); ++ return 1; ++} ++ ++static int cidr_mapped4(lua_State *L) ++{ ++ cidr_t *p1 = L_checkcidr(L, 1, NULL); ++ cidr_t *p2; ++ ++ if (!_is_mapped4(p1)) ++ return 0; ++ ++ if (!(p2 = lua_newuserdata(L, sizeof(*p2)))) ++ return 0; ++ ++ p2->family = AF_INET; ++ p2->bits = (p1->bits > 32) ? 32 : p1->bits; ++ memcpy(&p2->addr.v4, p1->addr.v6.s6_addr + 12, sizeof(p2->addr.v4)); ++ ++ luaL_getmetatable(L, LUCI_IP_CIDR); ++ lua_setmetatable(L, -2); ++ return 1; ++} ++ ++static int cidr_contains(lua_State *L) ++{ ++ cidr_t *p1 = L_checkcidr(L, 1, NULL); ++ cidr_t *p2 = L_checkcidr(L, 2, NULL); ++ cidr_t a = *p1, b = *p2; ++ bool rv = false; ++ ++ if (p1->family == p2->family && p1->bits <= p2->bits) ++ { ++ _apply_mask(&a, p1->bits, false); ++ _apply_mask(&b, p1->bits, false); ++ ++ rv = !memcmp(&a.addr.v6, &b.addr.v6, a.len); ++ } ++ ++ lua_pushboolean(L, rv); ++ return 1; ++} ++ ++#define S6_BYTE(a, i) \ ++ (a)->addr.v6.s6_addr[sizeof((a)->addr.v6.s6_addr) - (i) - 1] ++ ++static int _cidr_add_sub(lua_State *L, bool add) ++{ ++ cidr_t *p1 = L_checkcidr(L, 1, NULL); ++ cidr_t *p2 = L_checkcidr(L, 2, p1); ++ cidr_t r = *p1; ++ bool inplace = lua_isboolean(L, 3) ? lua_toboolean(L, 3) : false; ++ bool ok = true; ++ uint8_t i, carry; ++ uint32_t a, b; ++ ++ if (p1->family == p2->family) ++ { ++ if (p1->family == AF_INET6) ++ { ++ for (i = 0, carry = 0; i < sizeof(r.addr.v6.s6_addr); i++) ++ { ++ if (add) ++ { ++ S6_BYTE(&r, i) = S6_BYTE(p1, i) + S6_BYTE(p2, i) + carry; ++ carry = (S6_BYTE(p1, i) + S6_BYTE(p2, i) + carry) / 256; ++ } ++ else ++ { ++ S6_BYTE(&r, i) = (S6_BYTE(p1, i) - S6_BYTE(p2, i) - carry); ++ carry = (S6_BYTE(p1, i) < (S6_BYTE(p2, i) + carry)); ++ } ++ } ++ ++ /* would over/underflow */ ++ if (carry) ++ { ++ memset(&r.addr.v6, add * 0xFF, sizeof(r.addr.v6)); ++ ok = false; ++ } ++ } ++ else ++ { ++ a = ntohl(p1->addr.v4.s_addr); ++ b = ntohl(p2->addr.v4.s_addr); ++ ++ /* would over/underflow */ ++ if ((add && (UINT_MAX - a) < b) || (!add && a < b)) ++ { ++ r.addr.v4.s_addr = add * 0xFFFFFFFF; ++ ok = false; ++ } ++ else ++ { ++ r.addr.v4.s_addr = add ? htonl(a + b) : htonl(a - b); ++ } ++ } ++ } ++ else ++ { ++ ok = false; ++ } ++ ++ if (inplace) ++ { ++ *p1 = r; ++ lua_pushboolean(L, ok); ++ return 1; ++ } ++ ++ if (!(p1 = lua_newuserdata(L, sizeof(*p1)))) ++ return 0; ++ ++ *p1 = r; ++ ++ luaL_getmetatable(L, LUCI_IP_CIDR); ++ lua_setmetatable(L, -2); ++ return 1; ++} ++ ++static int cidr_add(lua_State *L) ++{ ++ return _cidr_add_sub(L, true); ++} ++ ++static int cidr_sub(lua_State *L) ++{ ++ return _cidr_add_sub(L, false); ++} ++ ++static int cidr_minhost(lua_State *L) ++{ ++ cidr_t *p = L_checkcidr(L, 1, NULL); ++ cidr_t r = *p; ++ uint8_t i, rest, carry; ++ ++ _apply_mask(&r, r.bits, false); ++ ++ if (r.family == AF_INET6 && r.bits < 128) ++ { ++ r.bits = 128; ++ ++ for (i = 0, carry = 1; i < sizeof(r.addr.v6.s6_addr); i++) ++ { ++ rest = (S6_BYTE(&r, i) + carry) > 255; ++ S6_BYTE(&r, i) += carry; ++ carry = rest; ++ } ++ } ++ else if (r.family == AF_INET && r.bits < 32) ++ { ++ r.bits = 32; ++ r.addr.v4.s_addr = htonl(ntohl(r.addr.v4.s_addr) + 1); ++ } ++ ++ if (!(p = lua_newuserdata(L, sizeof(*p)))) ++ return 0; ++ ++ *p = r; ++ ++ luaL_getmetatable(L, LUCI_IP_CIDR); ++ lua_setmetatable(L, -2); ++ return 1; ++} ++ ++static int cidr_maxhost(lua_State *L) ++{ ++ cidr_t *p = L_checkcidr(L, 1, NULL); ++ cidr_t r = *p; ++ ++ _apply_mask(&r, r.bits, true); ++ ++ if (r.family == AF_INET && r.bits < 32) ++ { ++ r.bits = 32; ++ r.addr.v4.s_addr = htonl(ntohl(r.addr.v4.s_addr) - 1); ++ } ++ else if (r.family == AF_INET6) ++ { ++ r.bits = 128; ++ } ++ ++ if (!(p = lua_newuserdata(L, sizeof(*p)))) ++ return 0; ++ ++ *p = r; ++ ++ luaL_getmetatable(L, LUCI_IP_CIDR); ++ lua_setmetatable(L, -2); ++ return 1; ++} ++ ++static int cidr_gc (lua_State *L) ++{ ++ return 0; ++} ++ ++static int cidr_tostring (lua_State *L) ++{ ++ char buf[INET6_ADDRSTRLEN]; ++ cidr_t *p = L_checkcidr(L, 1, NULL); ++ ++ if ((p->family == AF_INET && p->bits < 32) || ++ (p->family == AF_INET6 && p->bits < 128)) ++ { ++ lua_pushfstring(L, "%s/%d", ++ inet_ntop(p->family, &p->addr.v6, buf, sizeof(buf)), ++ p->bits); ++ } ++ else ++ { ++ lua_pushstring(L, inet_ntop(p->family, &p->addr.v6, buf, sizeof(buf))); ++ } ++ ++ return 1; ++} ++ ++/* ++ * route functions ++ */ ++ ++static bool diff_prefix(int family, void *addr, int bits, cidr_t *p) ++{ ++ uint8_t i, b, r; ++ uint32_t m; ++ ++ if (!p->family) ++ return false; ++ ++ if (!addr || p->family != family || p->bits > bits) ++ return true; ++ ++ if (family == AF_INET6) ++ { ++ for (i = 0, r = p->bits; i < sizeof(struct in6_addr); i++) ++ { ++ b = r ? (0xFF << (8 - ((r > 8) ? 8 : r))) : 0; ++ ++ if ((((struct in6_addr *)addr)->s6_addr[i] & b) != ++ (p->addr.v6.s6_addr[i] & b)) ++ return true; ++ ++ r -= ((r > 8) ? 8 : r); ++ } ++ } ++ else ++ { ++ m = p->bits ? htonl(~((1 << (32 - p->bits)) - 1)) : 0; ++ ++ if ((((struct in_addr *)addr)->s_addr & m) != (p->addr.v4.s_addr & m)) ++ return true; ++ } ++ ++ return (p->exact && p->bits != bits); ++} ++ ++static int cb_dump_route(struct nl_msg *msg, void *arg) ++{ ++ struct dump_state *s = arg; ++ struct dump_filter *f = s->filter; ++ struct nlmsghdr *hdr = nlmsg_hdr(msg); ++ struct rtmsg *rt = NLMSG_DATA(hdr); ++ struct nlattr *tb[RTA_MAX+1]; ++ struct in6_addr *src, *dst, *gw, *from, def = { }; ++ int iif, oif, bitlen; ++ uint32_t table; ++ ++ if (hdr->nlmsg_type != RTM_NEWROUTE || ++ (rt->rtm_family != AF_INET && rt->rtm_family != AF_INET6)) ++ return NL_SKIP; ++ ++ nlmsg_parse(hdr, sizeof(*rt), tb, RTA_MAX, NULL); ++ ++ iif = tb[RTA_IIF] ? RTA_INT(tb[RTA_IIF]) : 0; ++ oif = tb[RTA_OIF] ? RTA_INT(tb[RTA_OIF]) : 0; ++ table = tb[RTA_TABLE] ? RTA_U32(tb[RTA_TABLE]) : rt->rtm_table; ++ from = tb[RTA_SRC] ? RTA_DATA(tb[RTA_SRC]) : NULL; ++ src = tb[RTA_PREFSRC] ? RTA_DATA(tb[RTA_PREFSRC]) : NULL; ++ dst = tb[RTA_DST] ? RTA_DATA(tb[RTA_DST]) : &def; ++ gw = tb[RTA_GATEWAY] ? RTA_DATA(tb[RTA_GATEWAY]) : NULL; ++ ++ bitlen = (rt->rtm_family == AF_INET6) ? 128 : 32; ++ ++ if ((f->type && rt->rtm_type != f->type) || ++ (f->family && rt->rtm_family != f->family) || ++ (f->proto && rt->rtm_protocol != f->proto) || ++ (f->scope && rt->rtm_scope != f->scope) || ++ (f->iif && iif != f->iif) || ++ (f->oif && oif != f->oif) || ++ (f->table && table != f->table) || ++ diff_prefix(rt->rtm_family, from, rt->rtm_src_len, &f->from) || ++ diff_prefix(rt->rtm_family, dst, rt->rtm_dst_len, &f->dst) || ++ diff_prefix(rt->rtm_family, gw, bitlen, &f->gw) || ++ diff_prefix(rt->rtm_family, src, bitlen, &f->src)) ++ goto out; ++ ++ if (s->callback) ++ lua_pushvalue(s->L, 2); ++ ++ lua_newtable(s->L); ++ ++ L_setint(s->L, "type", rt->rtm_type); ++ L_setint(s->L, "family", (rt->rtm_family == AF_INET) ? 4 : 6); ++ ++ L_setaddr(s->L, "dest", rt->rtm_family, dst, rt->rtm_dst_len); ++ ++ if (gw) ++ L_setaddr(s->L, "gw", rt->rtm_family, gw, -1); ++ ++ if (from) ++ L_setaddr(s->L, "from", rt->rtm_family, from, rt->rtm_src_len); ++ ++ if (iif) ++ L_setdev(s->L, "iif", tb[RTA_IIF]); ++ ++ if (oif) ++ L_setdev(s->L, "dev", tb[RTA_OIF]); ++ ++ L_setint(s->L, "table", table); ++ L_setint(s->L, "proto", rt->rtm_protocol); ++ L_setint(s->L, "scope", rt->rtm_scope); ++ ++ if (src) ++ L_setaddr(s->L, "src", rt->rtm_family, src, -1); ++ ++ if (tb[RTA_PRIORITY]) ++ L_setint(s->L, "metric", RTA_U32(tb[RTA_PRIORITY])); ++ ++ if (rt->rtm_family == AF_INET6 && tb[RTA_CACHEINFO]) ++ { ++ struct rta_cacheinfo *ci = RTA_DATA(tb[RTA_CACHEINFO]); ++ ++ if (ci->rta_expires) ++ { ++ if (ci->rta_expires) ++ L_setint(s->L, "expires", ci->rta_expires / hz); ++ ++ if (ci->rta_error != 0) ++ L_setint(s->L, "error", ci->rta_error); ++ } ++ } ++ ++ s->index++; ++ ++ if (s->callback) ++ lua_call(s->L, 1, 0); ++ else if (hdr->nlmsg_flags & NLM_F_MULTI) ++ lua_rawseti(s->L, -2, s->index); ++ ++out: ++ s->pending = !!(hdr->nlmsg_flags & NLM_F_MULTI); ++ return NL_SKIP; ++} ++ ++static int ++cb_done(struct nl_msg *msg, void *arg) ++{ ++ struct dump_state *s = arg; ++ s->pending = 0; ++ return NL_STOP; ++} ++ ++static int ++cb_error(struct sockaddr_nl *nla, struct nlmsgerr *err, void *arg) ++{ ++ struct dump_state *s = arg; ++ s->pending = 0; ++ return NL_STOP; ++} ++ ++static int _error(lua_State *L, int code, const char *msg) ++{ ++ lua_pushnil(L); ++ lua_pushnumber(L, code ? code : errno); ++ lua_pushstring(L, msg ? msg : strerror(errno)); ++ ++ return 3; ++} ++ ++static int _route_dump(lua_State *L, struct dump_filter *filter) ++{ ++ int flags = NLM_F_REQUEST; ++ struct dump_state s = { ++ .L = L, ++ .pending = 1, ++ .index = 0, ++ .callback = lua_isfunction(L, 2), ++ .filter = filter ++ }; ++ ++ if (!hz) ++ hz = sysconf(_SC_CLK_TCK); ++ ++ if (!sock) ++ { ++ sock = nl_socket_alloc(); ++ if (!sock) ++ return _error(L, -1, "Out of memory"); ++ ++ if (nl_connect(sock, NETLINK_ROUTE)) ++ return _error(L, 0, NULL); ++ } ++ ++ struct nl_msg *msg; ++ struct nl_cb *cb = nl_cb_alloc(NL_CB_DEFAULT); ++ struct rtmsg rtm = { ++ .rtm_family = filter->family, ++ .rtm_dst_len = filter->dst.bits, ++ .rtm_src_len = filter->src.bits ++ }; ++ ++ if (!filter->get) ++ flags |= NLM_F_DUMP; ++ ++ msg = nlmsg_alloc_simple(RTM_GETROUTE, flags); ++ if (!msg) ++ goto out; ++ ++ nlmsg_append(msg, &rtm, sizeof(rtm), 0); ++ ++ if (filter->get) ++ nla_put(msg, RTA_DST, filter->dst.len, &filter->dst.addr.v6); ++ ++ nl_cb_set(cb, NL_CB_VALID, NL_CB_CUSTOM, cb_dump_route, &s); ++ nl_cb_set(cb, NL_CB_FINISH, NL_CB_CUSTOM, cb_done, &s); ++ nl_cb_err(cb, NL_CB_CUSTOM, cb_error, &s); ++ ++ nl_send_auto_complete(sock, msg); ++ ++ if (!filter->get && !s.callback) ++ lua_newtable(L); ++ ++ while (s.pending > 0) ++ nl_recvmsgs(sock, cb); ++ ++ nlmsg_free(msg); ++ ++out: ++ nl_cb_put(cb); ++ return (s.callback == 0); ++} ++ ++static int route_get(lua_State *L) ++{ ++ struct dump_filter filter = { .get = true }; ++ const char *dest = luaL_checkstring(L, 1); ++ ++ if (!parse_cidr(dest, &filter.dst)) ++ return _error(L, -1, "Invalid destination"); ++ ++ filter.family = filter.dst.family; ++ ++ return _route_dump(L, &filter); ++} ++ ++static int route_dump(lua_State *L) ++{ ++ const char *s; ++ cidr_t p = { }; ++ struct dump_filter filter = { }; ++ ++ if (lua_type(L, 1) == LUA_TTABLE) ++ { ++ filter.family = L_getint(L, 1, "family"); ++ ++ if (filter.family == 4) ++ filter.family = AF_INET; ++ else if (filter.family == 6) ++ filter.family = AF_INET6; ++ else ++ filter.family = 0; ++ ++ if ((s = L_getstr(L, 1, "iif")) != NULL) ++ filter.iif = if_nametoindex(s); ++ ++ if ((s = L_getstr(L, 1, "oif")) != NULL) ++ filter.oif = if_nametoindex(s); ++ ++ filter.type = L_getint(L, 1, "type"); ++ filter.scope = L_getint(L, 1, "scope"); ++ filter.proto = L_getint(L, 1, "proto"); ++ filter.table = L_getint(L, 1, "table"); ++ ++ if ((s = L_getstr(L, 1, "gw")) != NULL && parse_cidr(s, &p)) ++ filter.gw = p; ++ ++ if ((s = L_getstr(L, 1, "from")) != NULL && parse_cidr(s, &p)) ++ filter.from = p; ++ ++ if ((s = L_getstr(L, 1, "src")) != NULL && parse_cidr(s, &p)) ++ filter.src = p; ++ ++ if ((s = L_getstr(L, 1, "dest")) != NULL && parse_cidr(s, &p)) ++ filter.dst = p; ++ ++ if ((s = L_getstr(L, 1, "from_exact")) != NULL && parse_cidr(s, &p)) ++ filter.from = p, filter.from.exact = true; ++ ++ if ((s = L_getstr(L, 1, "dest_exact")) != NULL && parse_cidr(s, &p)) ++ filter.dst = p, filter.dst.exact = true; ++ } ++ ++ return _route_dump(L, &filter); ++} ++ ++ ++static bool diff_macaddr(struct ether_addr *mac1, struct ether_addr *mac2) ++{ ++ struct ether_addr empty = { }; ++ ++ if (!memcmp(mac2, &empty, sizeof(empty))) ++ return false; ++ ++ if (!mac1 || memcmp(mac1, mac2, sizeof(empty))) ++ return true; ++ ++ return false; ++} ++ ++static int cb_dump_neigh(struct nl_msg *msg, void *arg) ++{ ++ char buf[32]; ++ struct ether_addr *mac; ++ struct in6_addr *dst; ++ struct dump_state *s = arg; ++ struct dump_filter *f = s->filter; ++ struct nlmsghdr *hdr = nlmsg_hdr(msg); ++ struct ndmsg *nd = NLMSG_DATA(hdr); ++ struct nlattr *tb[NDA_MAX+1]; ++ int bitlen; ++ ++ if (hdr->nlmsg_type != RTM_NEWNEIGH || ++ (nd->ndm_family != AF_INET && nd->ndm_family != AF_INET6)) ++ return NL_SKIP; ++ ++ nlmsg_parse(hdr, sizeof(*nd), tb, NDA_MAX, NULL); ++ ++ mac = tb[NDA_LLADDR] ? RTA_DATA(tb[NDA_LLADDR]) : NULL; ++ dst = tb[NDA_DST] ? RTA_DATA(tb[NDA_DST]) : NULL; ++ ++ bitlen = (nd->ndm_family == AF_INET) ? 32 : 128; ++ ++ if ((f->family && nd->ndm_family != f->family) || ++ (f->iif && nd->ndm_ifindex != f->iif) || ++ (f->type && !(f->type & nd->ndm_state)) || ++ diff_prefix(nd->ndm_family, dst, bitlen, &f->dst) || ++ diff_macaddr(mac, &f->mac)) ++ goto out; ++ ++ if (s->callback) ++ lua_pushvalue(s->L, 2); ++ ++ lua_newtable(s->L); ++ ++ L_setint(s->L, "family", (nd->ndm_family == AF_INET) ? 4 : 6); ++ L_setstr(s->L, "dev", if_indextoname(nd->ndm_ifindex, buf)); ++ ++ L_setbool(s->L, "router", (nd->ndm_flags & NTF_ROUTER)); ++ L_setbool(s->L, "proxy", (nd->ndm_flags & NTF_PROXY)); ++ ++ L_setbool(s->L, "incomplete", (nd->ndm_state & NUD_INCOMPLETE)); ++ L_setbool(s->L, "reachable", (nd->ndm_state & NUD_REACHABLE)); ++ L_setbool(s->L, "stale", (nd->ndm_state & NUD_STALE)); ++ L_setbool(s->L, "delay", (nd->ndm_state & NUD_DELAY)); ++ L_setbool(s->L, "probe", (nd->ndm_state & NUD_PROBE)); ++ L_setbool(s->L, "failed", (nd->ndm_state & NUD_FAILED)); ++ L_setbool(s->L, "noarp", (nd->ndm_state & NUD_NOARP)); ++ L_setbool(s->L, "permanent", (nd->ndm_state & NUD_PERMANENT)); ++ ++ if (dst) ++ L_setaddr(s->L, "dest", nd->ndm_family, dst, -1); ++ ++ if (mac) ++ { ++ snprintf(buf, sizeof(buf), "%02x:%02x:%02x:%02x:%02x:%02x", ++ mac->ether_addr_octet[0], mac->ether_addr_octet[1], ++ mac->ether_addr_octet[2], mac->ether_addr_octet[3], ++ mac->ether_addr_octet[4], mac->ether_addr_octet[5]); ++ ++ lua_pushstring(s->L, buf); ++ lua_setfield(s->L, -2, "mac"); ++ } ++ ++ s->index++; ++ ++ if (s->callback) ++ lua_call(s->L, 1, 0); ++ else if (hdr->nlmsg_flags & NLM_F_MULTI) ++ lua_rawseti(s->L, -2, s->index); ++ ++out: ++ s->pending = !!(hdr->nlmsg_flags & NLM_F_MULTI); ++ return NL_SKIP; ++} ++ ++static int neighbor_dump(lua_State *L) ++{ ++ cidr_t p = { }; ++ const char *s; ++ struct ether_addr *mac; ++ struct dump_filter filter = { .type = 0xFF & ~NUD_NOARP }; ++ struct dump_state st = { ++ .callback = lua_isfunction(L, 2), ++ .pending = 1, ++ .filter = &filter, ++ .L = L ++ }; ++ ++ if (lua_type(L, 1) == LUA_TTABLE) ++ { ++ filter.family = L_getint(L, 1, "family"); ++ ++ if (filter.family == 4) ++ filter.family = AF_INET; ++ else if (filter.family == 6) ++ filter.family = AF_INET6; ++ else ++ filter.family = 0; ++ ++ if ((s = L_getstr(L, 1, "dev")) != NULL) ++ filter.iif = if_nametoindex(s); ++ ++ if ((s = L_getstr(L, 1, "dest")) != NULL && parse_cidr(s, &p)) ++ filter.dst = p; ++ ++ if ((s = L_getstr(L, 1, "mac")) != NULL && ++ (mac = ether_aton(s)) != NULL) ++ filter.mac = *mac; ++ } ++ ++ if (!sock) ++ { ++ sock = nl_socket_alloc(); ++ if (!sock) ++ return _error(L, -1, "Out of memory"); ++ ++ if (nl_connect(sock, NETLINK_ROUTE)) ++ return _error(L, 0, NULL); ++ } ++ ++ struct nl_msg *msg; ++ struct nl_cb *cb = nl_cb_alloc(NL_CB_DEFAULT); ++ struct ndmsg ndm = { ++ .ndm_family = filter.family ++ }; ++ ++ msg = nlmsg_alloc_simple(RTM_GETNEIGH, NLM_F_REQUEST | NLM_F_DUMP); ++ if (!msg) ++ goto out; ++ ++ nlmsg_append(msg, &ndm, sizeof(ndm), 0); ++ ++ nl_cb_set(cb, NL_CB_VALID, NL_CB_CUSTOM, cb_dump_neigh, &st); ++ nl_cb_set(cb, NL_CB_FINISH, NL_CB_CUSTOM, cb_done, &st); ++ nl_cb_err(cb, NL_CB_CUSTOM, cb_error, &st); ++ ++ nl_send_auto_complete(sock, msg); ++ ++ if (!st.callback) ++ lua_newtable(L); ++ ++ while (st.pending > 0) ++ nl_recvmsgs(sock, cb); ++ ++ nlmsg_free(msg); ++ ++out: ++ nl_cb_put(cb); ++ return (st.callback == 0); ++} ++ ++ ++static int cb_dump_link(struct nl_msg *msg, void *arg) ++{ ++ char *p, *addr, buf[48]; ++ struct dump_state *s = arg; ++ struct nlmsghdr *hdr = nlmsg_hdr(msg); ++ struct ifinfomsg *ifm = NLMSG_DATA(hdr); ++ struct nlattr *tb[IFLA_MAX+1]; ++ int i, len; ++ ++ if (hdr->nlmsg_type != RTM_NEWLINK) ++ return NL_SKIP; ++ ++ nlmsg_parse(hdr, sizeof(*ifm), tb, IFLA_MAX, NULL); ++ ++ L_setbool(s->L, "up", (ifm->ifi_flags & IFF_RUNNING)); ++ L_setint(s->L, "type", ifm->ifi_type); ++ L_setstr(s->L, "name", if_indextoname(ifm->ifi_index, buf)); ++ ++ if (tb[IFLA_MTU]) ++ L_setint(s->L, "mtu", RTA_U32(tb[IFLA_MTU])); ++ ++ if (tb[IFLA_TXQLEN]) ++ L_setint(s->L, "qlen", RTA_U32(tb[IFLA_TXQLEN])); ++ ++ if (tb[IFLA_MASTER]) ++ L_setdev(s->L, "master", tb[IFLA_MASTER]); ++ ++ if (tb[IFLA_ADDRESS]) ++ { ++ len = nla_len(tb[IFLA_ADDRESS]); ++ addr = nla_get_string(tb[IFLA_ADDRESS]); ++ ++ if ((len * 3) <= sizeof(buf)) ++ { ++ for (p = buf, i = 0; i < len; i++) ++ p += sprintf(p, "%s%02x", (i ? ":" : ""), (uint8_t)*addr++); ++ ++ L_setstr(s->L, "mac", buf); ++ } ++ } ++ ++ s->pending = 0; ++ return NL_SKIP; ++} ++ ++static int link_get(lua_State *L) ++{ ++ const char *dev = luaL_checkstring(L, 1); ++ struct dump_state st = { ++ .pending = 1, ++ .L = L ++ }; ++ ++ if (!sock) ++ { ++ sock = nl_socket_alloc(); ++ if (!sock) ++ return _error(L, -1, "Out of memory"); ++ ++ if (nl_connect(sock, NETLINK_ROUTE)) ++ return _error(L, 0, NULL); ++ } ++ ++ struct nl_msg *msg = nlmsg_alloc_simple(RTM_GETLINK, NLM_F_REQUEST); ++ struct nl_cb *cb = nl_cb_alloc(NL_CB_DEFAULT); ++ struct ifinfomsg ifm = { .ifi_index = if_nametoindex(dev) }; ++ ++ if (!msg || !cb) ++ return 0; ++ ++ nlmsg_append(msg, &ifm, sizeof(ifm), 0); ++ ++ nl_cb_set(cb, NL_CB_VALID, NL_CB_CUSTOM, cb_dump_link, &st); ++ nl_cb_set(cb, NL_CB_FINISH, NL_CB_CUSTOM, cb_done, &st); ++ nl_cb_err(cb, NL_CB_CUSTOM, cb_error, &st); ++ ++ lua_newtable(L); ++ ++ nl_send_auto_complete(sock, msg); ++ ++ while (st.pending > 0) ++ nl_recvmsgs(sock, cb); ++ ++ nlmsg_free(msg); ++ nl_cb_put(cb); ++ ++ return 1; ++} ++ ++ ++static const luaL_reg ip_methods[] = { ++ { "new", cidr_new }, ++ { "IPv4", cidr_ipv4 }, ++ { "IPv6", cidr_ipv6 }, ++ ++ { "route", route_get }, ++ { "routes", route_dump }, ++ ++ { "neighbors", neighbor_dump }, ++ ++ { "link", link_get }, ++ ++ { } ++}; ++ ++static const luaL_reg ip_cidr_methods[] = { ++ { "is4", cidr_is4 }, ++ { "is4rfc1918", cidr_is4rfc1918 }, ++ { "is4linklocal", cidr_is4linklocal }, ++ { "is6", cidr_is6 }, ++ { "is6linklocal", cidr_is6linklocal }, ++ { "is6mapped4", cidr_is6mapped4 }, ++ { "lower", cidr_lower }, ++ { "higher", cidr_higher }, ++ { "equal", cidr_equal }, ++ { "prefix", cidr_prefix }, ++ { "network", cidr_network }, ++ { "host", cidr_host }, ++ { "mask", cidr_mask }, ++ { "broadcast", cidr_broadcast }, ++ { "mapped4", cidr_mapped4 }, ++ { "contains", cidr_contains }, ++ { "add", cidr_add }, ++ { "sub", cidr_sub }, ++ { "minhost", cidr_minhost }, ++ { "maxhost", cidr_maxhost }, ++ { "string", cidr_tostring }, ++ ++ { "__lt", cidr_lower }, ++ { "__le", cidr_lower_equal }, ++ { "__eq", cidr_equal }, ++ { "__add", cidr_add }, ++ { "__sub", cidr_sub }, ++ { "__gc", cidr_gc }, ++ { "__tostring", cidr_tostring }, ++ ++ { } ++}; ++ ++int luaopen_luci_ip(lua_State *L) ++{ ++ luaL_register(L, LUCI_IP, ip_methods); ++ ++ luaL_newmetatable(L, LUCI_IP_CIDR); ++ luaL_register(L, NULL, ip_cidr_methods); ++ lua_pushvalue(L, -1); ++ lua_setfield(L, -2, "__index"); ++ lua_pop(L, 1); ++ ++ return 1; ++} +diff --git a/feeds/luci/libs/luci-lib-ip/src/ip.luadoc b/feeds/luci/libs/luci-lib-ip/src/ip.luadoc +new file mode 100644 +index 0000000..e32ae72 +--- /dev/null ++++ b/feeds/luci/libs/luci-lib-ip/src/ip.luadoc +@@ -0,0 +1,831 @@ ++--- LuCI IP calculation and netlink access library. ++module "luci.ip" ++ ++---[[ ++Construct a new luci.ip.cidr instance and autodetect the address family. ++Throws an error if the given strings do not represent a valid address or ++if the given optional netmask is of a different family. ++@class function ++@sort 1 ++@name new ++@param address String containing a valid IPv4 or IPv6 address, optionally ++with prefix size (CIDR notation) or netmask separated by slash. ++@param netmask String containing a valid IPv4 or IPv6 netmask or number ++containing a prefix size in bits (`0..32` for IPv4, ++`0..128` for IPv6). Overrides mask embedded in the first argument ++if specified. (optional) ++@return A `luci.ip.cidr` object representing the given ++address/mask range. ++@usage `addr = luci.ip.new("10.24.0.1/24") ++addr = luci.ip.new("10.24.0.1/255.255.255.0") ++addr = luci.ip.new("10.24.0.1", "255.255.255.0") -- separate netmask ++addr = luci.ip.new("10.24.0.1/24", 16) -- override netmask ++ ++addr6 = luci.ip.new("fe80::221:63ff:fe75:aa17/64") ++addr6 = luci.ip.new("fe80::221:63ff:fe75:aa17/ffff:ffff:ffff:ffff::") ++addr6 = luci.ip.new("fe80::221:63ff:fe75:aa17", "ffff:ffff:ffff:ffff::") ++addr6 = luci.ip.new("fe80::221:63ff:fe75:aa17/64", 128) -- override netmask` ++@see IPv4 ++@see IPv6 ++]] ++ ++---[[ ++Construct a new IPv4 luci.ip.cidr instance. ++Throws an error if the given string does not represent a valid IPv4 address or ++if the given optional netmask is of a different family. ++@class function ++@sort 2 ++@name IPv4 ++@param address String containing a valid IPv4, optionally with prefix size ++(CIDR notation) or netmask separated by slash. ++@param netmask String containing a valid IPv4 netmask or number ++containing a prefix size between `0` and `32` bit. ++Overrides mask embedded in the first argument if specified. (optional) ++@return A `luci.ip.cidr` object representing the given IPv4 range. ++@usage `addr = luci.ip.IPv4("10.24.0.1/24") ++addr = luci.ip.IPv4("10.24.0.1/255.255.255.0") ++addr = luci.ip.IPv4("10.24.0.1", "255.255.255.0") -- separate netmask ++addr = luci.ip.IPv4("10.24.0.1/24", 16) -- override netmask` ++@see IPv6 ++]] ++ ++---[[ ++Construct a new IPv6 luci.ip.cidr instance. ++Throws an error if the given string does not represent a valid IPv6 address or ++if the given optional netmask is of a different family. ++@class function ++@sort 3 ++@name IPv6 ++@param address String containing a valid IPv6, optionally with prefix size ++(CIDR notation) or netmask separated by slash. ++@param netmask String containing a valid IPv4 netmask or number ++containing a prefix size between `0` and `128` bit. ++Overrides mask embedded in the first argument if specified. (optional) ++@return A `luci.ip.cidr` object representing the given IPv6 range. ++@usage `addr6 = luci.ip.IPv6("fe80::221:63ff:fe75:aa17/64") ++addr6 = luci.ip.IPv6("fe80::221:63ff:fe75:aa17/ffff:ffff:ffff:ffff::") ++addr6 = luci.ip.IPv6("fe80::221:63ff:fe75:aa17", "ffff:ffff:ffff:ffff::") ++addr6 = luci.ip.IPv6("fe80::221:63ff:fe75:aa17/64", 128) -- override netmask` ++@see IPv4 ++]] ++ ++---[[ ++Determine the route leading to the given destination. ++@class function ++@sort 4 ++@name route ++@param address A `luci.ip.cidr` instance or a string containing ++a valid IPv4 or IPv6 range as specified by `luci.ip.new()`. ++@return

    Table containing the fields described below.

    ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
    FieldDescription
    `type` ++

    Route type with one of the following numeric values:

    ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
    `1``RTN_UNICAST` - Gateway or direct route
    `2``RTN_LOCAL` - Accept locally
    `3``RTN_BROADCAST` - ++ Accept locally as broadcast send as broadcast
    `4``RTN_ANYCAST` - ++ Accept locally as broadcast but send as unicast
    `5``RTN_MULTICAST` - Multicast route
    ++
    `family`Number containing the route family, `4` for IPv4 or ++ `6` for IPv6
    `dest`Destination `luci.ip.cidr` instance
    `gw`Gateway `luci.ip.cidr` instance (optional)
    `from`Source address `luci.ip.cidr` instance (optional)
    `src`Preferred source `luci.ip.cidr` instance (optional)
    `dev`String containing the name of the outgoing interface
    `iif`String containing the name of the incoming interface (optional)
    `table`Number of the associated routing table (`0..65535`)
    `proto`Number of the associated routing protocol
    `scope`Number describing the scope of the route, most commonly ++ `0` for global or `253` for on-link
    `metric`Number describing the route metric (optional)
    `expires`Number of seconds the prefix is valid (IPv6 only, optional)
    `error`Route destination error code (optional)
    ++@usage
      ++
    • Find default gateway by getting route to Google's public NS server ++`rt = luci.ip.route("8.8.8.8") ++if rt ~= nil then ++ print("gateway is", rt.gw) ++end`
    • ++
    • Determine IPv6 upstream interface `rt = luci.ip.route("2001::/7") ++if rt ~= nil then ++ print("ipv6 upstream device is", rt.dev) ++end`
    • ++
    ++@see routes ++]] ++ ++---[[ ++Fetch all routes, optionally matching the given criteria. ++@class function ++@sort 5 ++@name routes ++@param filter

    Table containing one or more of the possible filter ++critera described below (optional)

    ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
    FieldDescription
    `family` ++ Number describing the address family to return - `4` selects ++ IPv4 routes, `6` IPv6 ones. Any other value selects both. ++
    `iif` ++ String containing the incoming route interface to match. ++
    `oif` ++ String containing the outgoing route interface to match. ++
    `type` ++ Numeric type to match, e.g. `1` for unicast. ++
    `scope` ++ Numeric scope to match, e.g. `253` for onlink. ++
    `proto` ++ Numeric protocol to match, e.g. `2` for boot. ++
    `table` ++ Numeric routing table to match (`0..65535`). ++
    `gw` ++ String containing the gateway address to match. Can be in any notation ++ specified by `luci.ip.new()`. Prefix matching is performed when ++ comparing the routes, e.g. "192.168.1.0/24" would select routes with gateway ++ addresses `192.168.1.1 .. 192.168.1.255`. ++
    `dest` ++ String containing the destination to match. Prefix matching is performed. ++
    `from` ++ String containing the source address to match. Prefix matching is performed. ++
    `src` ++ String containing the preferred source address to match. ++ Prefix matching is performed. ++
    `dest_exact` ++ String containing the destination to match. Exact matching is performed, ++ e.g. `dest = "0.0.0.0/0"` would match any IPv4 route ++ while `dest_exact = "0.0.0.0/0"` will only match the ++ default route. ++
    `from_exact` ++ String containing the source address to match. Exact matching is performed. ++
    ++@param callback

    Callback function to invoke for each found route ++instead of returning one table of route objects (optional)

    ++@return If no callback function is provided, a table of routes ++as specified by `luci.ip.route()` ++is returned. If a callback function is given, it is invoked for each route ++and nothing is returned. ++@see route ++@usage
      ++
    • Find all IPv4 default routes: ++`luci.ip.routes({ dest_exact = "0.0.0.0/0" }, function(rt) ++ print(rt.type, rt.gw, rt.dev) ++end)`
    • ++
    • Find all global IPv6 prefixes on the current system: ++`luci.ip.routes({ from = "2001::/7" }, function(rt) ++ print(rt.from) ++end)`
    • ++
    • Fetch all IPv4 routes: ++`routes = luci.ip.routes({ family = 4 }) ++for _, rt in ipairs(routes) do ++ print(rt.dest, rt.gw, rt.dev) ++end`
    • ++
    ++]] ++ ++---[[ ++Fetches entries from the IPv4 ARP and IPv6 neighbour kernel table ++@class function ++@sort 6 ++@name neighbors ++@param filter

    Table containing one or more of the possible filter ++critera described below (optional)

    ++ ++ ++ ++ ++ ++
    FieldDescription
    `family` ++ Number describing the address family to return - `4` selects ++ IPv4 ARP, `6` select IPv6 neighbour entries. Any other value ++ selects both. ++
    `dev` ++ String containing the associated interface to match. ++
    `dest` ++ String containing the associated address to match. Can be in any notation ++ specified by `luci.ip.new()`. Prefix matching is performed when ++ comparing the addresses, e.g. "192.168.1.0/24" would select ARP entries ++ for `192.168.1.1 .. 192.168.1.255`. ++
    `mac` ++ String containing MAC address to match. ++
    ++@param callback

    Callback function to invoke for each found neighbour ++entry instead of returning one table of neighbour entries (optional)

    ++@return If no callback function is provided, a table of neighbour entries ++is returned. If a callback function is given, it is invoked for each entry ++and nothing is returned. ++ ++A neighbour entry is a table containing the following fields: ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
    FieldDescription
    `family`Number containing the neighbour entry family, `4` for IPv4 ++ ARP or `6` for IPv6 NDP
    `dev`String containing the associated device of the neighbour entry
    `dest`IP address `luci.ip.cidr` instance
    `mac`String containing the associated MAC address
    `router`Boolean "true" if the neighbour entry is a router (IPv6, optional)
    `proxy`Boolean "true" if this is a proxy entry (optional)
    `incomplete`Boolean "true" if the entry is in incomplete state (optional)
    `reachable`Boolean "true" if the entry is in reachable state (optional)
    `stale`Boolean "true" if the entry is stale (optional)
    `delay`Boolean "true" if the entry is delayed (optional)
    `probe`Boolean "true" if the entry is in probe state (optional)
    `failed`Boolean "true" if the entry is in failed state (optional)
    `noarp`Boolean "true" if the entry is not caused by NDP or ++ ARP (optional)
    `permanent`Boolean "true" if the entry was statically configured from ++ userspace (optional)
    ++@usage
      ++
    • Find all ARP neighbours in the LAN: ++`luci.ip.neighbors({ dest = "192.168.0.0/16" }, function(n) ++ print(n.dest, n.mac) ++end)`
    • ++
    • Find all active IPv6 addresses of host with given MAC: ++`luci.ip.neighbors({ family = 6, mac = "00:21:63:75:aa:17" }, ++ function(n) ++ print(n.dest) ++ end)`
    • ++
    ++]] ++ ++---[[ ++Fetch basic device information ++@class function ++@sort 7 ++@name link ++@param device String containing the network device to query ++@return If the given interface is found, a table containing the fields ++described below is returned, else an empty table. ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
    FieldDescription
    `up`Boolean indicating whether the device is in IFF_RUNNING state
    `type`Numeric value indicating the type of the device, e.g. `1` ++ for ethernet.
    `name`String containing the name of the device
    `master`If queried device is a bridge port, string containing the name of ++ parent bridge device (optional)
    `mtu`Number containing the current MTU of the device
    `qlen`Number containing the TX queue length of the device
    `mac`String containing the link local address of the device in ++ dotted hex notation
    ++@usage
      ++
    • Test whether device br-lan exists: ++`print(luci.ip.link("br-lan").name ~= nil) ++`
    • ++
    • Query MAC address of eth0: ++`print(luci.ip.link("eth0").mac) ++`
    • ++
    ++]] ++ ++ ++--- IP CIDR Object. ++-- Represents an IPv4 or IPv6 address range. ++-- @cstyle instance ++module "luci.ip.cidr" ++ ++---[[ ++Checks whether the CIDR instance is an IPv4 address range ++ ++@class function ++@sort 1 ++@name cidr.is4 ++@see cidr.is6 ++@return `true` if the CIDR is an IPv4 range, else `false` ++]] ++ ++---[[ ++Checks whether the CIDR instance is within the private RFC1918 address space ++ ++@class function ++@sort 2 ++@name cidr.is4rfc1918 ++@return `true` if the entire range of this CIDR lies within one of ++ the ranges `10.0.0.0-10.255.255.255`, ++ `172.16.0.0-172.31.0.0` or ++ `192.168.0.0-192.168.255.255`, else `false`. ++@usage `local addr = luci.ip.new("192.168.45.2/24") ++if addr:is4rfc1918() then ++ print("Is a private address") ++end` ++]] ++ ++---[[ ++Checks whether the CIDR instance is an IPv4 link local (Zeroconf) address ++ ++@class function ++@sort 3 ++@name cidr.is4linklocal ++@return `true` if the entire range of this CIDR lies within the range ++ the range `169.254.0.0-169.254.255.255`, else `false`. ++@usage `local addr = luci.ip.new("169.254.34.125") ++if addr:is4linklocal() then ++ print("Is a zeroconf address") ++end` ++]] ++ ++---[[ ++Checks whether the CIDR instance is an IPv6 address range ++ ++@class function ++@sort 4 ++@name cidr.is6 ++@see cidr.is4 ++@return `true` if the CIDR is an IPv6 range, else `false` ++]] ++ ++---[[ ++Checks whether the CIDR instance is an IPv6 link local address ++ ++@class function ++@sort 5 ++@name cidr.is6linklocal ++@return `true` if the entire range of this CIDR lies within the range ++ the `fe80::/10` range, else `false`. ++@usage `local addr = luci.ip.new("fe92:53a:3216:af01:221:63ff:fe75:aa17/64") ++if addr:is6linklocal() then ++ print("Is a linklocal address") ++end` ++]] ++ ++---[[ ++Checks whether the CIDR instance is an IPv6 mapped IPv4 address ++ ++@class function ++@sort 6 ++@name cidr.is6mapped4 ++@return `true` if the address is an IPv6 mapped IPv4 address in the ++ form `::ffff:1.2.3.4`. ++@usage `local addr = luci.ip.new("::ffff:192.168.1.1") ++if addr:is6mapped4() then ++ print("Is a mapped IPv4 address") ++end` ++]] ++ ++---[[ ++Checks whether this CIDR instance is lower than the given argument. ++The comparisation follows these rules: ++
    • An IPv4 address is always lower than an IPv6 address
    • ++
    • Prefix sizes are ignored
    ++ ++@class function ++@sort 7 ++@name cidr.lower ++@param addr A `luci.ip.cidr` instance or a string convertable by ++ `luci.ip.new()` to compare against. ++@return `true` if this CIDR is lower than the given address, ++ else `false`. ++@usage `local addr = luci.ip.new("192.168.1.1") ++print(addr:lower(addr)) -- false ++print(addr:lower("10.10.10.10/24")) -- false ++print(addr:lower(luci.ip.new("::1"))) -- true ++print(addr:lower(luci.ip.new("192.168.200.1"))) -- true` ++@see cidr.higher ++@see cidr.equal ++]] ++ ++---[[ ++Checks whether this CIDR instance is higher than the given argument. ++The comparisation follows these rules: ++
    • An IPv4 address is always lower than an IPv6 address
    • ++
    • Prefix sizes are ignored
    ++ ++@class function ++@sort 8 ++@name cidr.higher ++@param addr A `luci.ip.cidr` instance or a string convertable by ++ `luci.ip.new()` to compare against. ++@return `true` if this CIDR is higher than the given address, ++ else `false`. ++@usage `local addr = luci.ip.new("192.168.1.1") ++print(addr:higher(addr)) -- false ++print(addr:higher("10.10.10.10/24")) -- true ++print(addr:higher(luci.ip.new("::1"))) -- false ++print(addr:higher(luci.ip.new("192.168.200.1"))) -- false` ++@see cidr.lower ++@see cidr.equal ++]] ++ ++---[[ ++Checks whether this CIDR instance is equal to the given argument. ++ ++@class function ++@sort 9 ++@name cidr.equal ++@param addr A `luci.ip.cidr` instance or a string convertable by ++ `luci.ip.new()` to compare against. ++@return `true` if this CIDR is equal to the given address, ++ else `false`. ++@usage `local addr = luci.ip.new("192.168.1.1") ++print(addr:equal(addr)) -- true ++print(addr:equal("192.168.1.1")) -- true ++print(addr:equal(luci.ip.new("::1"))) -- false ++ ++local addr6 = luci.ip.new("::1") ++print(addr6:equal("0:0:0:0:0:0:0:1/64")) -- true ++print(addr6:equal(luci.ip.new("fe80::221:63ff:fe75:aa17"))) -- false` ++@see cidr.lower ++@see cidr.higher ++]] ++ ++---[[ ++Get or set prefix size of CIDR instance. ++If the optional mask parameter is given, the prefix size of this CIDR is altered ++else the current prefix size is returned. ++ ++@class function ++@sort 10 ++@name cidr.prefix ++@param mask Either a number containing the number of bits (`0..32` ++ for IPv4, `0..128` for IPv6) or a string containing a valid ++ netmask (optional) ++@return Bit count of the current prefix size ++@usage `local range = luci.ip.new("192.168.1.1/255.255.255.0") ++print(range:prefix()) -- 24 ++ ++range:prefix(16) ++print(range:prefix()) -- 16 ++ ++range:prefix("255.255.255.255") ++print(range:prefix()) -- 32` ++]] ++ ++---[[ ++Derive network address of CIDR instance. ++ ++Returns a new CIDR instance representing the network address of this instance ++with all host parts masked out. The used prefix size can be overridden by the ++optional mask parameter. ++ ++@class function ++@sort 11 ++@name cidr.network ++@param mask Either a number containing the number of bits (`0..32` ++ for IPv4, `0..128` for IPv6) or a string containing a valid ++ netmask (optional) ++@return CIDR instance representing the network address ++@usage `local range = luci.ip.new("192.168.62.243/255.255.0.0") ++print(range:network()) -- "192.168.0.0" ++print(range:network(24)) -- "192.168.62.0" ++print(range:network("255.255.255.0")) -- "192.168.62.0" ++ ++local range6 = luci.ip.new("fd9b:62b3:9cc5:0:221:63ff:fe75:aa17/64") ++print(range6:network()) -- "fd9b:62b3:9cc5::"` ++]] ++ ++---[[ ++Derive host address of CIDR instance. ++ ++This function essentially constructs a copy of this CIDR with the prefix size ++set to `32` for IPv4 and `128` for IPv6. ++ ++@class function ++@sort 12 ++@name cidr.host ++@return CIDR instance representing the host address ++@usage `local range = luci.ip.new("172.19.37.45/16") ++print(range) -- "172.19.37.45/16" ++print(range:host()) -- "172.19.37.45"` ++]] ++ ++---[[ ++Derive netmask of CIDR instance. ++ ++Constructs a CIDR instance representing the netmask of this instance. The used ++prefix size can be overridden by the optional mask parameter. ++ ++@class function ++@sort 13 ++@name cidr.mask ++@param mask Either a number containing the number of bits (`0..32` ++ for IPv4, `0..128` for IPv6) or a string containing a valid ++ netmask (optional) ++@return CIDR instance representing the netmask ++@usage `local range = luci.ip.new("172.19.37.45/16") ++print(range:mask()) -- "255.255.0.0" ++print(range:mask(24)) -- "255.255.255.0" ++print(range:mask("255.0.0.0")) -- "255.0.0.0"` ++]] ++ ++---[[ ++Derive broadcast address of CIDR instance. ++ ++Constructs a CIDR instance representing the broadcast address of this instance. ++The used prefix size can be overridden by the optional mask parameter. ++ ++This function has no effect on IPv6 instances, it will return nothing in this ++case. ++ ++@class function ++@sort 14 ++@name cidr.broadcast ++@param mask Either a number containing the number of bits (`0..32` ++ for IPv4, `0..128` for IPv6) or a string containing a valid ++ netmask (optional) ++@return Return a new CIDR instance representing the broadcast address if this ++ instance is an IPv4 range, else return nothing. ++@usage `local range = luci.ip.new("172.19.37.45/16") ++print(range:broadcast()) -- "172.19.255.255" ++print(range:broadcast(24)) -- "172.19.37.255" ++print(range:broadcast("255.0.0.0")) -- "172.255.255.255"` ++]] ++ ++---[[ ++Derive mapped IPv4 address of CIDR instance. ++ ++Constructs a CIDR instance representing the IPv4 address of the IPv6 mapped ++IPv4 address in this instance. ++ ++This function has no effect on IPv4 instances or IPv6 instances which are not a ++mapped address, it will return nothing in this case. ++ ++@class function ++@sort 15 ++@name cidr.mapped4 ++@return Return a new CIDR instance representing the IPv4 address if this ++ instance is an IPv6 mapped IPv4 address, else return nothing. ++@usage `local addr = luci.ip.new("::ffff:172.16.19.1") ++print(addr:mapped4()) -- "172.16.19.1"` ++]] ++ ++---[[ ++Test whether CIDR contains given range. ++ ++@class function ++@sort 16 ++@name cidr.contains ++@param addr A `luci.ip.cidr` instance or a string convertable by ++ `luci.ip.new()` to test. ++@return `true` if this instance fully contains the given address else ++ `false`. ++@usage `local range = luci.ip.new("10.24.0.0/255.255.0.0") ++print(range:contains("10.24.5.1")) -- true ++print(range:contains("::1")) -- false ++print(range:contains("10.0.0.0/8")) -- false ++ ++local range6 = luci.ip.new("fe80::/10") ++print(range6:contains("fe80::221:63f:fe75:aa17/64")) -- true ++print(range6:contains("fd9b:6b3:c5:0:221:63f:fe75:aa17/64")) -- false` ++]] ++ ++---[[ ++Add given amount to CIDR instance. If the result would overflow the maximum ++address space, the result is set to the highest possible address. ++ ++@class function ++@sort 17 ++@name cidr.add ++@param amount A numeric value between 0 and 0xFFFFFFFF, a ++ `luci.ip.cidr` instance or a string convertable by ++ `luci.ip.new()`. ++@param inplace If `true`, modify this instance instead of returning ++ a new derived CIDR instance. ++@return
      ++
    • When adding inplace: Return `true` if the addition succeded ++ or `false` when the addition overflowed.
    • ++
    • When deriving new CIDR: Return new instance representing the value of ++ this instance plus the added amount or the highest possible address if ++ the addition overflowed the available address space.
    ++@usage `local addr = luci.ip.new("192.168.1.1/24") ++print(addr:add(250)) -- "192.168.1.251/24" ++print(addr:add("0.0.99.0")) -- "192.168.100.1/24" ++ ++addr:add(256, true) -- true ++print(addr) -- "192.168.2.1/24 ++ ++addr:add("255.0.0.0", true) -- false (overflow) ++print(addr) -- "255.255.255.255/24 ++ ++local addr6 = luci.ip.new("fe80::221:63f:fe75:aa17/64") ++print(addr6:add(256)) -- "fe80::221:63f:fe75:ab17/64" ++print(addr6:add("::ffff:0")) -- "fe80::221:640:fe74:aa17/64" ++ ++addr:add(256, true) -- true ++print(addr) -- "fe80::221:63f:fe75:ab17/64 ++ ++addr:add("ffff::", true) -- false (overflow) ++print(addr) -- "ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff/64"` ++]] ++ ++---[[ ++Substract given amount from CIDR instance. If the result would under, the lowest ++possible address is returned. ++ ++@class function ++@sort 18 ++@name cidr.sub ++@param amount A numeric value between 0 and 0xFFFFFFFF, a ++ `luci.ip.cidr` instance or a string convertable by ++ `luci.ip.new()`. ++@param inplace If `true`, modify this instance instead of returning ++ a new derived CIDR instance. ++@return
      ++
    • When substracting inplace: Return `true` if the substraction ++ succeded or `false` when the substraction underflowed.
    • ++
    • When deriving new CIDR: Return new instance representing the value of ++ this instance minus the substracted amount or the lowest address if ++ the substraction underflowed.
    ++@usage `local addr = luci.ip.new("192.168.1.1/24") ++print(addr:sub(256)) -- "192.168.0.1/24" ++print(addr:sub("0.168.0.0")) -- "192.0.1.1/24" ++ ++addr:sub(256, true) -- true ++print(addr) -- "192.168.0.1/24 ++ ++addr:sub("255.0.0.0", true) -- false (underflow) ++print(addr) -- "0.0.0.0/24 ++ ++local addr6 = luci.ip.new("fe80::221:63f:fe75:aa17/64") ++print(addr6:sub(256)) -- "fe80::221:63f:fe75:a917/64" ++print(addr6:sub("::ffff:0")) -- "fe80::221:63e:fe76:aa17/64" ++ ++addr:sub(256, true) -- true ++print(addr) -- "fe80::221:63f:fe75:a917/64" ++ ++addr:sub("ffff::", true) -- false (underflow) ++print(addr) -- "::/64"` ++]] ++ ++---[[ ++Calculate the lowest possible host address within this CIDR instance. ++ ++@class function ++@sort 19 ++@name cidr.minhost ++@return Returns a new CIDR instance representing the lowest host address ++ within this range. ++@usage `local addr = luci.ip.new("192.168.123.56/24") ++print(addr:minhost()) -- "192.168.123.1" ++ ++local addr6 = luci.ip.new("fd9b:62b3:9cc5:0:221:63ff:fe75:aa17/64") ++print(addr6:minhost()) -- "fd9b:62b3:9cc5::1"` ++]] ++ ++---[[ ++Calculate the highest possible host address within this CIDR instance. ++ ++@class function ++@sort 20 ++@name cidr.maxhost ++@return Returns a new CIDR instance representing the highest host address ++ within this range. ++@usage `local addr = luci.ip.new("192.168.123.56/24") ++print(addr:maxhost()) -- "192.168.123.254" (.255 is broadcast) ++ ++local addr6 = luci.ip.new("fd9b:62b3:9cc5:0:221:63ff:fe75:aa17/64") ++print(addr6:maxhost()) -- "fd9b:62b3:9cc5:0:ffff:ffff:ffff:ffff"` ++]] ++ ++---[[ ++Convert CIDR instance into string representation. ++ ++If the prefix size of instance is less than 32 for IPv4 or 128 for IPv6, the ++address is returned in the form "address/prefix" otherwise just "address". ++ ++It is usually not required to call this function directly as CIDR objects ++define it as __tostring function in the associated metatable. ++ ++@class function ++@sort 21 ++@name cidr.string ++@return Returns a string representing the range or address of this CIDR instance ++]] +diff --git a/feeds/luci/libs/luci-lib-json/Makefile b/feeds/luci/libs/luci-lib-json/Makefile +new file mode 100644 +index 0000000..069886d +--- /dev/null ++++ b/feeds/luci/libs/luci-lib-json/Makefile +@@ -0,0 +1,14 @@ ++# ++# Copyright (C) 2008-2014 The LuCI Team ++# ++# This is free software, licensed under the Apache License, Version 2.0 . ++# ++ ++include $(TOPDIR)/rules.mk ++ ++LUCI_TITLE:=LuCI JSON library ++LUCI_DEPENDS:= ++ ++include ../../luci.mk ++ ++# call BuildPackage - OpenWrt buildroot signature +diff --git a/feeds/luci/libs/luci-lib-json/luasrc/json.lua b/feeds/luci/libs/luci-lib-json/luasrc/json.lua +new file mode 100644 +index 0000000..f7b57f9 +--- /dev/null ++++ b/feeds/luci/libs/luci-lib-json/luasrc/json.lua +@@ -0,0 +1,530 @@ ++-- Copyright 2008 Steven Barth ++-- Copyright 2008 Jo-Philipp Wich ++-- Licensed to the public under the Apache License 2.0. ++ ++local nixio = require "nixio" ++local util = require "luci.util" ++local table = require "table" ++local string = require "string" ++local coroutine = require "coroutine" ++ ++local assert = assert ++local tonumber = tonumber ++local tostring = tostring ++local error = error ++local type = type ++local pairs = pairs ++local ipairs = ipairs ++local next = next ++local pcall = pcall ++ ++local band = nixio.bit.band ++local bor = nixio.bit.bor ++local rshift = nixio.bit.rshift ++local char = string.char ++ ++local getmetatable = getmetatable ++ ++module "luci.json" ++ ++ ++function decode(json, ...) ++ local a = ActiveDecoder(function() return nil end, ...) ++ a.chunk = json ++ local s, obj = pcall(a.get, a) ++ return s and obj or nil ++end ++ ++ ++function encode(obj, ...) ++ local out = {} ++ local e = Encoder(obj, 1, ...):source() ++ local chnk, err ++ repeat ++ chnk, err = e() ++ out[#out+1] = chnk ++ until not chnk ++ return not err and table.concat(out) or nil ++end ++ ++ ++function null() ++ return null ++end ++ ++Encoder = util.class() ++ ++function Encoder.__init__(self, data, buffersize, fastescape) ++ self.data = data ++ self.buffersize = buffersize or 512 ++ self.buffer = "" ++ self.fastescape = fastescape ++ ++ getmetatable(self).__call = Encoder.source ++end ++ ++function Encoder.source(self) ++ local source = coroutine.create(self.dispatch) ++ return function() ++ local res, data = coroutine.resume(source, self, self.data, true) ++ if res then ++ return data ++ else ++ return nil, data ++ end ++ end ++end ++ ++function Encoder.dispatch(self, data, start) ++ local parser = self.parsers[type(data)] ++ ++ parser(self, data) ++ ++ if start then ++ if #self.buffer > 0 then ++ coroutine.yield(self.buffer) ++ end ++ ++ coroutine.yield() ++ end ++end ++ ++function Encoder.put(self, chunk) ++ if self.buffersize < 2 then ++ coroutine.yield(chunk) ++ else ++ if #self.buffer + #chunk > self.buffersize then ++ local written = 0 ++ local fbuffer = self.buffersize - #self.buffer ++ ++ coroutine.yield(self.buffer .. chunk:sub(written + 1, fbuffer)) ++ written = fbuffer ++ ++ while #chunk - written > self.buffersize do ++ fbuffer = written + self.buffersize ++ coroutine.yield(chunk:sub(written + 1, fbuffer)) ++ written = fbuffer ++ end ++ ++ self.buffer = chunk:sub(written + 1) ++ else ++ self.buffer = self.buffer .. chunk ++ end ++ end ++end ++ ++function Encoder.parse_nil(self) ++ self:put("null") ++end ++ ++function Encoder.parse_bool(self, obj) ++ self:put(obj and "true" or "false") ++end ++ ++function Encoder.parse_number(self, obj) ++ self:put(tostring(obj)) ++end ++ ++function Encoder.parse_string(self, obj) ++ if self.fastescape then ++ self:put('"' .. obj:gsub('\\', '\\\\'):gsub('"', '\\"') .. '"') ++ else ++ self:put('"' .. ++ obj:gsub('[%c\\"]', ++ function(char) ++ return '\\u00%02x' % char:byte() ++ end ++ ) ++ .. '"') ++ end ++end ++ ++function Encoder.parse_iter(self, obj) ++ if obj == null then ++ return self:put("null") ++ end ++ ++ if type(obj) == "table" and (#obj == 0 and next(obj)) then ++ self:put("{") ++ local first = true ++ ++ for key, entry in pairs(obj) do ++ if key ~= null then ++ first = first or self:put(",") ++ first = first and false ++ self:parse_string(tostring(key)) ++ self:put(":") ++ self:dispatch(entry) ++ end ++ end ++ ++ self:put("}") ++ else ++ self:put("[") ++ local first = true ++ ++ if type(obj) == "table" then ++ for i=1, #obj do ++ first = first or self:put(",") ++ first = first and nil ++ self:dispatch(obj[i]) ++ end ++ else ++ for entry in obj do ++ first = first or self:put(",") ++ first = first and nil ++ self:dispatch(entry) ++ end ++ end ++ ++ self:put("]") ++ end ++end ++ ++Encoder.parsers = { ++ ['nil'] = Encoder.parse_nil, ++ ['table'] = Encoder.parse_iter, ++ ['number'] = Encoder.parse_number, ++ ['string'] = Encoder.parse_string, ++ ['boolean'] = Encoder.parse_bool, ++ ['function'] = Encoder.parse_iter ++} ++ ++ ++Decoder = util.class() ++ ++function Decoder.__init__(self, customnull) ++ self.cnull = customnull ++ getmetatable(self).__call = Decoder.sink ++end ++ ++function Decoder.sink(self) ++ local sink = coroutine.create(self.dispatch) ++ return function(...) ++ return coroutine.resume(sink, self, ...) ++ end ++end ++ ++ ++function Decoder.get(self) ++ return self.data ++end ++ ++function Decoder.dispatch(self, chunk, src_err, strict) ++ local robject, object ++ local oset = false ++ ++ while chunk do ++ while chunk and #chunk < 1 do ++ chunk = self:fetch() ++ end ++ ++ assert(not strict or chunk, "Unexpected EOS") ++ if not chunk then break end ++ ++ local char = chunk:sub(1, 1) ++ local parser = self.parsers[char] ++ or (char:match("%s") and self.parse_space) ++ or (char:match("[0-9-]") and self.parse_number) ++ or error("Unexpected char '%s'" % char) ++ ++ chunk, robject = parser(self, chunk) ++ ++ if parser ~= self.parse_space then ++ assert(not oset, "Scope violation: Too many objects") ++ object = robject ++ oset = true ++ ++ if strict then ++ return chunk, object ++ end ++ end ++ end ++ ++ assert(not src_err, src_err) ++ assert(oset, "Unexpected EOS") ++ ++ self.data = object ++end ++ ++ ++function Decoder.fetch(self) ++ local tself, chunk, src_err = coroutine.yield() ++ assert(chunk or not src_err, src_err) ++ return chunk ++end ++ ++ ++function Decoder.fetch_atleast(self, chunk, bytes) ++ while #chunk < bytes do ++ local nchunk = self:fetch() ++ assert(nchunk, "Unexpected EOS") ++ chunk = chunk .. nchunk ++ end ++ ++ return chunk ++end ++ ++ ++function Decoder.fetch_until(self, chunk, pattern) ++ local start = chunk:find(pattern) ++ ++ while not start do ++ local nchunk = self:fetch() ++ assert(nchunk, "Unexpected EOS") ++ chunk = chunk .. nchunk ++ start = chunk:find(pattern) ++ end ++ ++ return chunk, start ++end ++ ++ ++function Decoder.parse_space(self, chunk) ++ local start = chunk:find("[^%s]") ++ ++ while not start do ++ chunk = self:fetch() ++ if not chunk then ++ return nil ++ end ++ start = chunk:find("[^%s]") ++ end ++ ++ return chunk:sub(start) ++end ++ ++ ++function Decoder.parse_literal(self, chunk, literal, value) ++ chunk = self:fetch_atleast(chunk, #literal) ++ assert(chunk:sub(1, #literal) == literal, "Invalid character sequence") ++ return chunk:sub(#literal + 1), value ++end ++ ++ ++function Decoder.parse_null(self, chunk) ++ return self:parse_literal(chunk, "null", self.cnull and null) ++end ++ ++ ++function Decoder.parse_true(self, chunk) ++ return self:parse_literal(chunk, "true", true) ++end ++ ++ ++function Decoder.parse_false(self, chunk) ++ return self:parse_literal(chunk, "false", false) ++end ++ ++ ++function Decoder.parse_number(self, chunk) ++ local chunk, start = self:fetch_until(chunk, "[^0-9eE.+-]") ++ local number = tonumber(chunk:sub(1, start - 1)) ++ assert(number, "Invalid number specification") ++ return chunk:sub(start), number ++end ++ ++ ++function Decoder.parse_string(self, chunk) ++ local str = "" ++ local object = nil ++ assert(chunk:sub(1, 1) == '"', 'Expected "') ++ chunk = chunk:sub(2) ++ ++ while true do ++ local spos = chunk:find('[\\"]') ++ if spos then ++ str = str .. chunk:sub(1, spos - 1) ++ ++ local char = chunk:sub(spos, spos) ++ if char == '"' then -- String end ++ chunk = chunk:sub(spos + 1) ++ break ++ elseif char == "\\" then -- Escape sequence ++ chunk, object = self:parse_escape(chunk:sub(spos)) ++ str = str .. object ++ end ++ else ++ str = str .. chunk ++ chunk = self:fetch() ++ assert(chunk, "Unexpected EOS while parsing a string") ++ end ++ end ++ ++ return chunk, str ++end ++ ++ ++function Decoder.utf8_encode(self, s1, s2) ++ local n = s1 * 256 + s2 ++ ++ if n >= 0 and n <= 0x7F then ++ return char(n) ++ elseif n >= 0 and n <= 0x7FF then ++ return char( ++ bor(band(rshift(n, 6), 0x1F), 0xC0), ++ bor(band(n, 0x3F), 0x80) ++ ) ++ elseif n >= 0 and n <= 0xFFFF then ++ return char( ++ bor(band(rshift(n, 12), 0x0F), 0xE0), ++ bor(band(rshift(n, 6), 0x3F), 0x80), ++ bor(band(n, 0x3F), 0x80) ++ ) ++ elseif n >= 0 and n <= 0x10FFFF then ++ return char( ++ bor(band(rshift(n, 18), 0x07), 0xF0), ++ bor(band(rshift(n, 12), 0x3F), 0x80), ++ bor(band(rshift(n, 6), 0x3F), 0x80), ++ bor(band(n, 0x3F), 0x80) ++ ) ++ else ++ return "?" ++ end ++end ++ ++ ++function Decoder.parse_escape(self, chunk) ++ local str = "" ++ chunk = self:fetch_atleast(chunk:sub(2), 1) ++ local char = chunk:sub(1, 1) ++ chunk = chunk:sub(2) ++ ++ if char == '"' then ++ return chunk, '"' ++ elseif char == "\\" then ++ return chunk, "\\" ++ elseif char == "u" then ++ chunk = self:fetch_atleast(chunk, 4) ++ local s1, s2 = chunk:sub(1, 2), chunk:sub(3, 4) ++ s1, s2 = tonumber(s1, 16), tonumber(s2, 16) ++ assert(s1 and s2, "Invalid Unicode character") ++ ++ return chunk:sub(5), self:utf8_encode(s1, s2) ++ elseif char == "/" then ++ return chunk, "/" ++ elseif char == "b" then ++ return chunk, "\b" ++ elseif char == "f" then ++ return chunk, "\f" ++ elseif char == "n" then ++ return chunk, "\n" ++ elseif char == "r" then ++ return chunk, "\r" ++ elseif char == "t" then ++ return chunk, "\t" ++ else ++ error("Unexpected escaping sequence '\\%s'" % char) ++ end ++end ++ ++ ++function Decoder.parse_array(self, chunk) ++ chunk = chunk:sub(2) ++ local array = {} ++ local nextp = 1 ++ ++ local chunk, object = self:parse_delimiter(chunk, "%]") ++ ++ if object then ++ return chunk, array ++ end ++ ++ repeat ++ chunk, object = self:dispatch(chunk, nil, true) ++ table.insert(array, nextp, object) ++ nextp = nextp + 1 ++ ++ chunk, object = self:parse_delimiter(chunk, ",%]") ++ assert(object, "Delimiter expected") ++ until object == "]" ++ ++ return chunk, array ++end ++ ++ ++function Decoder.parse_object(self, chunk) ++ chunk = chunk:sub(2) ++ local array = {} ++ local name ++ ++ local chunk, object = self:parse_delimiter(chunk, "}") ++ ++ if object then ++ return chunk, array ++ end ++ ++ repeat ++ chunk = self:parse_space(chunk) ++ assert(chunk, "Unexpected EOS") ++ ++ chunk, name = self:parse_string(chunk) ++ ++ chunk, object = self:parse_delimiter(chunk, ":") ++ assert(object, "Separator expected") ++ ++ chunk, object = self:dispatch(chunk, nil, true) ++ array[name] = object ++ ++ chunk, object = self:parse_delimiter(chunk, ",}") ++ assert(object, "Delimiter expected") ++ until object == "}" ++ ++ return chunk, array ++end ++ ++ ++function Decoder.parse_delimiter(self, chunk, delimiter) ++ while true do ++ chunk = self:fetch_atleast(chunk, 1) ++ local char = chunk:sub(1, 1) ++ if char:match("%s") then ++ chunk = self:parse_space(chunk) ++ assert(chunk, "Unexpected EOS") ++ elseif char:match("[%s]" % delimiter) then ++ return chunk:sub(2), char ++ else ++ return chunk, nil ++ end ++ end ++end ++ ++ ++Decoder.parsers = { ++ ['"'] = Decoder.parse_string, ++ ['t'] = Decoder.parse_true, ++ ['f'] = Decoder.parse_false, ++ ['n'] = Decoder.parse_null, ++ ['['] = Decoder.parse_array, ++ ['{'] = Decoder.parse_object ++} ++ ++ ++ActiveDecoder = util.class(Decoder) ++ ++function ActiveDecoder.__init__(self, source, customnull) ++ Decoder.__init__(self, customnull) ++ self.source = source ++ self.chunk = nil ++ getmetatable(self).__call = self.get ++end ++ ++ ++function ActiveDecoder.get(self) ++ local chunk, src_err, object ++ if not self.chunk then ++ chunk, src_err = self.source() ++ else ++ chunk = self.chunk ++ end ++ ++ self.chunk, object = self:dispatch(chunk, src_err, true) ++ return object ++end ++ ++ ++function ActiveDecoder.fetch(self) ++ local chunk, src_err = self.source() ++ assert(chunk or not src_err, src_err) ++ return chunk ++end +diff --git a/feeds/luci/libs/luci-lib-json/luasrc/json.luadoc b/feeds/luci/libs/luci-lib-json/luasrc/json.luadoc +new file mode 100644 +index 0000000..37f97d2 +--- /dev/null ++++ b/feeds/luci/libs/luci-lib-json/luasrc/json.luadoc +@@ -0,0 +1,94 @@ ++---[[ ++LuCI JSON-Library ++ ++@cstyle instance ++]] ++module "luci.json" ++ ++---[[ ++Directly decode a JSON string ++ ++@class function ++@name decode ++@param json JSON-String ++@return Lua object ++]] ++ ++---[[ ++Direcly encode a Lua object into a JSON string. ++ ++@class function ++@name encode ++@param obj Lua Object ++@return JSON string ++]] ++ ++---[[ ++Null replacement function ++ ++@class function ++@name null ++@return null ++]] ++ ++---[[ ++Create a new JSON-Encoder. ++ ++@class function ++@name Encoder ++@param data Lua-Object to be encoded. ++@param buffersize Blocksize of returned data source. ++@param fastescape Use non-standard escaping (don't escape control chars) ++@return JSON-Encoder ++]] ++ ++---[[ ++Create an LTN12 source providing the encoded JSON-Data. ++ ++@class function ++@name Encoder.source ++@return LTN12 source ++]] ++ ++---[[ ++Create a new JSON-Decoder. ++ ++@class function ++@name Decoder ++@param customnull Use luci.json.null instead of nil for decoding null ++@return JSON-Decoder ++]] ++ ++---[[ ++Create an LTN12 sink from the decoder object which accepts the JSON-Data. ++ ++@class function ++@name Decoder.sink ++@return LTN12 sink ++]] ++ ++---[[ ++Get the decoded data packets after the rawdata has been sent to the sink. ++ ++@class function ++@name Decoder.get ++@return Decoded data ++]] ++ ++---[[ ++Create a new Active JSON-Decoder. ++ ++@class function ++@name ActiveDecoder ++@param customnull Use luci.json.null instead of nil for decoding null ++@return Active JSON-Decoder ++]] ++ ++---[[ ++Fetches one JSON-object from given source ++ ++@class function ++@name ActiveDecoder.get ++@return Decoded object ++]] ++ +diff --git a/feeds/luci/libs/luci-lib-jsonc/Makefile b/feeds/luci/libs/luci-lib-jsonc/Makefile +new file mode 100644 +index 0000000..6a63dab +--- /dev/null ++++ b/feeds/luci/libs/luci-lib-jsonc/Makefile +@@ -0,0 +1,14 @@ ++# ++# Copyright (C) 2015 LuCI Team ++# ++# This is free software, licensed under the Apache License, Version 2.0 . ++# ++ ++include $(TOPDIR)/rules.mk ++ ++LUCI_TITLE:=Lua binding for JSON-C ++LUCI_DEPENDS:=+liblua +libjson-c ++ ++include ../../luci.mk ++ ++# call BuildPackage - OpenWrt buildroot signature +diff --git a/feeds/luci/libs/luci-lib-jsonc/src/Makefile b/feeds/luci/libs/luci-lib-jsonc/src/Makefile +new file mode 100644 +index 0000000..e15fbac +--- /dev/null ++++ b/feeds/luci/libs/luci-lib-jsonc/src/Makefile +@@ -0,0 +1,17 @@ ++JSONC_CFLAGS = -std=gnu99 -I$(STAGING_DIR)/usr/include/json-c/ ++JSONC_LDFLAGS = -llua -lm -ljson-c ++JSONC_OBJ = jsonc.o ++JSONC_LIB = jsonc.so ++ ++%.o: %.c ++ $(CC) $(CPPFLAGS) $(CFLAGS) $(LUA_CFLAGS) $(JSONC_CFLAGS) $(FPIC) -c -o $@ $< ++ ++compile: $(JSONC_OBJ) ++ $(CC) $(LDFLAGS) -shared -o $(JSONC_LIB) $(JSONC_OBJ) $(JSONC_LDFLAGS) ++ ++install: compile ++ mkdir -p $(DESTDIR)/usr/lib/lua/luci ++ cp $(JSONC_LIB) $(DESTDIR)/usr/lib/lua/luci/$(JSONC_LIB) ++ ++clean: ++ rm -f *.o *.so +diff --git a/feeds/luci/libs/luci-lib-jsonc/src/jsonc.c b/feeds/luci/libs/luci-lib-jsonc/src/jsonc.c +new file mode 100644 +index 0000000..b857c97 +--- /dev/null ++++ b/feeds/luci/libs/luci-lib-jsonc/src/jsonc.c +@@ -0,0 +1,390 @@ ++/* ++Copyright 2015 Jo-Philipp Wich ++ ++Licensed under the Apache License, Version 2.0 (the "License"); ++you may not use this file except in compliance with the License. ++You may obtain a copy of the License at ++ ++ http://www.apache.org/licenses/LICENSE-2.0 ++ ++Unless required by applicable law or agreed to in writing, software ++distributed under the License is distributed on an "AS IS" BASIS, ++WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. ++See the License for the specific language governing permissions and ++limitations under the License. ++*/ ++ ++#define _GNU_SOURCE ++ ++#include ++#include ++#include ++ ++#include ++#include ++#include ++ ++#define LUCI_JSONC "luci.jsonc" ++#define LUCI_JSONC_PARSER "luci.jsonc.parser" ++ ++struct json_state { ++ struct json_object *obj; ++ struct json_tokener *tok; ++ enum json_tokener_error err; ++}; ++ ++static void _json_to_lua(lua_State *L, struct json_object *obj); ++static struct json_object * _lua_to_json(lua_State *L, int index); ++ ++static int json_new(lua_State *L) ++{ ++ struct json_state *s; ++ struct json_tokener *tok = json_tokener_new(); ++ ++ if (!tok) ++ return 0; ++ ++ s = lua_newuserdata(L, sizeof(*s)); ++ ++ if (!s) ++ { ++ json_tokener_free(tok); ++ return 0; ++ } ++ ++ s->tok = tok; ++ s->obj = NULL; ++ s->err = json_tokener_continue; ++ ++ luaL_getmetatable(L, LUCI_JSONC_PARSER); ++ lua_setmetatable(L, -2); ++ ++ return 1; ++} ++ ++static int json_parse(lua_State *L) ++{ ++ size_t len; ++ const char *json = luaL_checklstring(L, 1, &len); ++ struct json_state s = { ++ .tok = json_tokener_new() ++ }; ++ ++ if (!s.tok) ++ return 0; ++ ++ s.obj = json_tokener_parse_ex(s.tok, json, len); ++ s.err = json_tokener_get_error(s.tok); ++ ++ if (s.obj) ++ { ++ _json_to_lua(L, s.obj); ++ json_object_put(s.obj); ++ } ++ else ++ { ++ lua_pushnil(L); ++ } ++ ++ if (s.err == json_tokener_continue) ++ s.err = json_tokener_error_parse_eof; ++ ++ if (s.err) ++ lua_pushstring(L, json_tokener_error_desc(s.err)); ++ ++ json_tokener_free(s.tok); ++ return (1 + !!s.err); ++} ++ ++static int json_stringify(lua_State *L) ++{ ++ struct json_object *obj = _lua_to_json(L, 1); ++ bool pretty = lua_toboolean(L, 2); ++ int flags = 0; ++ ++ if (pretty) ++ flags |= JSON_C_TO_STRING_PRETTY | JSON_C_TO_STRING_SPACED; ++ ++ lua_pushstring(L, json_object_to_json_string_ext(obj, flags)); ++ json_object_put(obj); ++ return 1; ++} ++ ++ ++static int json_parse_chunk(lua_State *L) ++{ ++ size_t len; ++ struct json_state *s = luaL_checkudata(L, 1, LUCI_JSONC_PARSER); ++ const char *chunk = luaL_checklstring(L, 2, &len); ++ ++ s->obj = json_tokener_parse_ex(s->tok, chunk, len); ++ s->err = json_tokener_get_error(s->tok); ++ ++ if (!s->err) ++ { ++ lua_pushboolean(L, true); ++ return 1; ++ } ++ else if (s->err == json_tokener_continue) ++ { ++ lua_pushboolean(L, false); ++ return 1; ++ } ++ ++ lua_pushnil(L); ++ lua_pushstring(L, json_tokener_error_desc(s->err)); ++ return 2; ++} ++ ++static void _json_to_lua(lua_State *L, struct json_object *obj) ++{ ++ int n; ++ ++ switch (json_object_get_type(obj)) ++ { ++ case json_type_object: ++ lua_newtable(L); ++ json_object_object_foreach(obj, key, val) ++ { ++ _json_to_lua(L, val); ++ lua_setfield(L, -2, key); ++ } ++ break; ++ ++ case json_type_array: ++ lua_newtable(L); ++ for (n = 0; n < json_object_array_length(obj); n++) ++ { ++ _json_to_lua(L, json_object_array_get_idx(obj, n)); ++ lua_rawseti(L, -2, n + 1); ++ } ++ break; ++ ++ case json_type_boolean: ++ lua_pushboolean(L, json_object_get_boolean(obj)); ++ break; ++ ++ case json_type_int: ++ lua_pushinteger(L, json_object_get_int(obj)); ++ break; ++ ++ case json_type_double: ++ lua_pushnumber(L, json_object_get_double(obj)); ++ break; ++ ++ case json_type_string: ++ lua_pushstring(L, json_object_get_string(obj)); ++ break; ++ ++ case json_type_null: ++ lua_pushnil(L); ++ break; ++ } ++} ++ ++static int json_parse_get(lua_State *L) ++{ ++ struct json_state *s = luaL_checkudata(L, 1, LUCI_JSONC_PARSER); ++ ++ if (!s->obj || s->err) ++ lua_pushnil(L); ++ else ++ _json_to_lua(L, s->obj); ++ ++ return 1; ++} ++ ++static int _lua_test_array(lua_State *L, int index) ++{ ++ int max = 0; ++ lua_Number idx; ++ ++ lua_pushnil(L); ++ ++ /* check for non-integer keys */ ++ while (lua_next(L, index)) ++ { ++ if (lua_type(L, -2) != LUA_TNUMBER) ++ goto out; ++ ++ idx = lua_tonumber(L, -2); ++ ++ if (idx != (lua_Number)(lua_Integer)idx) ++ goto out; ++ ++ if (idx <= 0) ++ goto out; ++ ++ if (idx > max) ++ max = idx; ++ ++ lua_pop(L, 1); ++ continue; ++ ++out: ++ lua_pop(L, 2); ++ return -1; ++ } ++ ++ /* check for holes */ ++ //for (i = 1; i <= max; i++) ++ //{ ++ // lua_rawgeti(L, index, i); ++ // ++ // if (lua_isnil(L, -1)) ++ // { ++ // lua_pop(L, 1); ++ // return 0; ++ // } ++ // ++ // lua_pop(L, 1); ++ //} ++ ++ return max; ++} ++ ++static struct json_object * _lua_to_json(lua_State *L, int index) ++{ ++ lua_Number nd, ni; ++ struct json_object *obj; ++ const char *key; ++ int i, max; ++ ++ switch (lua_type(L, index)) ++ { ++ case LUA_TTABLE: ++ max = _lua_test_array(L, index); ++ ++ if (max >= 0) ++ { ++ obj = json_object_new_array(); ++ ++ if (!obj) ++ return NULL; ++ ++ for (i = 1; i <= max; i++) ++ { ++ lua_rawgeti(L, index, i); ++ ++ json_object_array_put_idx(obj, i - 1, ++ _lua_to_json(L, lua_gettop(L))); ++ ++ lua_pop(L, 1); ++ } ++ ++ return obj; ++ } ++ ++ obj = json_object_new_object(); ++ ++ if (!obj) ++ return NULL; ++ ++ lua_pushnil(L); ++ ++ while (lua_next(L, index)) ++ { ++ lua_pushvalue(L, -2); ++ key = lua_tostring(L, -1); ++ ++ if (key) ++ json_object_object_add(obj, key, ++ _lua_to_json(L, lua_gettop(L) - 1)); ++ ++ lua_pop(L, 2); ++ } ++ ++ return obj; ++ ++ case LUA_TNIL: ++ return NULL; ++ ++ case LUA_TBOOLEAN: ++ return json_object_new_boolean(lua_toboolean(L, index)); ++ ++ case LUA_TNUMBER: ++ nd = lua_tonumber(L, index); ++ ni = lua_tointeger(L, index); ++ ++ if (nd == ni) ++ return json_object_new_int(nd); ++ ++ return json_object_new_double(nd); ++ ++ case LUA_TSTRING: ++ return json_object_new_string(lua_tostring(L, index)); ++ } ++ ++ return NULL; ++} ++ ++static int json_parse_set(lua_State *L) ++{ ++ struct json_state *s = luaL_checkudata(L, 1, LUCI_JSONC_PARSER); ++ ++ s->err = 0; ++ s->obj = _lua_to_json(L, 2); ++ ++ return 0; ++} ++ ++static int json_tostring(lua_State *L) ++{ ++ struct json_state *s = luaL_checkudata(L, 1, LUCI_JSONC_PARSER); ++ bool pretty = lua_toboolean(L, 2); ++ int flags = 0; ++ ++ if (pretty) ++ flags |= JSON_C_TO_STRING_PRETTY | JSON_C_TO_STRING_SPACED; ++ ++ lua_pushstring(L, json_object_to_json_string_ext(s->obj, flags)); ++ return 1; ++} ++ ++static int json_gc(lua_State *L) ++{ ++ struct json_state *s = luaL_checkudata(L, 1, LUCI_JSONC_PARSER); ++ ++ if (s->obj) ++ json_object_put(s->obj); ++ ++ if (s->tok) ++ json_tokener_free(s->tok); ++ ++ return 0; ++} ++ ++ ++static const luaL_reg jsonc_methods[] = { ++ { "new", json_new }, ++ { "parse", json_parse }, ++ { "stringify", json_stringify }, ++ ++ { } ++}; ++ ++static const luaL_reg jsonc_parser_methods[] = { ++ { "parse", json_parse_chunk }, ++ { "get", json_parse_get }, ++ { "set", json_parse_set }, ++ { "stringify", json_tostring }, ++ ++ { "__gc", json_gc }, ++ { "__tostring", json_tostring }, ++ ++ { } ++}; ++ ++ ++int luaopen_luci_jsonc(lua_State *L) ++{ ++ luaL_register(L, LUCI_JSONC, jsonc_methods); ++ ++ luaL_newmetatable(L, LUCI_JSONC_PARSER); ++ luaL_register(L, NULL, jsonc_parser_methods); ++ lua_pushvalue(L, -1); ++ lua_setfield(L, -2, "__index"); ++ lua_pop(L, 1); ++ ++ return 1; ++} +diff --git a/feeds/luci/libs/luci-lib-jsonc/src/jsonc.luadoc b/feeds/luci/libs/luci-lib-jsonc/src/jsonc.luadoc +new file mode 100644 +index 0000000..2ee9ceb +--- /dev/null ++++ b/feeds/luci/libs/luci-lib-jsonc/src/jsonc.luadoc +@@ -0,0 +1,134 @@ ++--- LuCI JSON parsing and serialization library. ++-- The luci.jsonc class is a high level Lua binding to the JSON-C library to ++-- allow reading and writing JSON data with minimal overhead. ++module "luci.jsonc" ++ ++---[[ ++Construct a new luci.jsonc.parser instance. ++@class function ++@sort 1 ++@name new ++@return A `luci.jsonc.parser` object representing a JSON-C tokener. ++@usage `parser = luci.jsonc.new()` ++]] ++ ++---[[ ++Parse a complete JSON string and convert it into a Lua data structure. ++@class function ++@sort 2 ++@name parse ++@param json A string containing the JSON data to parse, must be either a ++ JSON array or a JSON object. ++@return On success, a table containing the parsed JSON data is returned, on ++ failure the function returns `nil` and a string containing the reason of ++ the parse error. ++@usage `data = luci.jsonc.parse('{ "name": "John", "age": 34 }') ++print(data.name) -- "John"` ++@see stringify ++]] ++ ++---[[ ++Convert given Lua data into a JSON string. ++ ++This function recursively converts the given Lua data into a JSON string, ++ignoring any unsupported data. Lua tables are converted into JSON arrays if they ++only contain integer keys, mixed tables are turned into JSON objects with any ++existing numeric keys converted into strings. ++ ++Lua functions, coroutines and userdata objects are ignored and Lua numbers are ++converted to integers if they do not contain fractional values. ++ ++@class function ++@sort 3 ++@name stringify ++@param data The Lua data to convert, can be a table, string, boolean or number. ++@param pretty A boolean value indicating whether the resulting JSON should be ++ pretty printed. ++@return Returns a string containing the JSON representation of the given Lua ++ data. ++@usage `json = luci.jsonc.stringify({ item = true, values = { 1, 2, 3 } }) ++print(json) -- '{"item":true,"values":[1,2,3]}'` ++@see parse ++]] ++ ++ ++--- LuCI JSON parser instance. ++-- A JSON parser instance is useful to parse JSON data chunk by chunk, without ++-- the need to assemble all data in advance. ++-- @cstyle instance ++module "luci.jsonc.parser" ++ ++---[[ ++Parses one chunk of JSON data. ++ ++@class function ++@sort 1 ++@name parser.parse ++@see parser.get ++@param json String containing the JSON fragment to parse ++@return
      ++
    • `true` if a complete JSON object has been parsed and no further input is ++ expected.
    • ++
    • `false` if further input is required
    • ++
    • `nil` if an error was encountered while parsing the current chunk. ++ In this case a string describing the parse error is returned as second ++ value.
    ++@usage `parser = luci.jsonc.new() ++ ++while true do ++ chunk = ... -- fetch a cunk of data, e.g. from a socket ++ finish, errmsg = parser.parse(chunk) ++ ++ if finish == nil then ++ error("Cannot parse JSON: " .. errmsg) ++ end ++ ++ if finish == true then ++ break ++ end ++end` ++]] ++ ++---[[ ++Convert parsed JSON data into Lua table. ++ ++@class function ++@sort 2 ++@name parser.get ++@see parser.parse ++@return Parsed JSON object converted into a Lua table or `nil` if the parser ++ didn't finish or encountered an error. ++@usage `parser = luci.jsonc.new() ++parser:parse('{ "example": "test" }') ++ ++data = parser:get() ++print(data.example) -- "test"` ++]] ++ ++---[[ ++Put Lua data into the parser. ++ ++@class function ++@sort 3 ++@name parser.set ++@see parser.stringify ++@param data Lua data to put into the parser object. The data is converted to an ++ internal JSON representation that can be dumped with `stringify()`. ++ The conversion follows the rules described in `luci.jsonc.stringify`. ++@return Nothing is returned. ++@usage `parser = luci.jsonc.new() ++parser:set({ "some", "data" })` ++]] ++ ++---[[ ++Serialize current parser state as JSON. ++ ++@class function ++@sort 4 ++@name parser.stringify ++@param pretty A boolean value indicating whether the resulting JSON should be pretty printed. ++@return Returns the serialized JSON data of this parser instance. ++@usage `parser = luci.jsonc.new() ++parser:parse('{ "example": "test" }') ++print(parser:serialize()) -- '{"example":"test"}'` ++]] +diff --git a/feeds/luci/libs/luci-lib-luaneightbl/Makefile b/feeds/luci/libs/luci-lib-luaneightbl/Makefile +new file mode 100644 +index 0000000..f0185b8 +--- /dev/null ++++ b/feeds/luci/libs/luci-lib-luaneightbl/Makefile +@@ -0,0 +1,14 @@ ++# ++# Copyright (C) 2008-2014 The LuCI Team ++# ++# This is free software, licensed under the Apache License, Version 2.0 . ++# ++ ++include $(TOPDIR)/rules.mk ++ ++LUCI_TITLE:=neightbl - Lua lib for IPv6 neighbors ++LUCI_DEPENDS:=+liblua ++ ++include ../../luci.mk ++ ++# call BuildPackage - OpenWrt buildroot signature +diff --git a/feeds/luci/libs/luci-lib-luaneightbl/src/Makefile b/feeds/luci/libs/luci-lib-luaneightbl/src/Makefile +new file mode 100644 +index 0000000..f856d2f +--- /dev/null ++++ b/feeds/luci/libs/luci-lib-luaneightbl/src/Makefile +@@ -0,0 +1,17 @@ ++NEIGHTBL_CFLAGS = -std=gnu99 ++NEIGHTBL_LDFLAGS = -llua -lm ++NEIGHTBL_OBJ = neightbl.o ++NEIGHTBL_LIB = neightbl.so ++ ++%.o: %.c ++ $(CC) $(CPPFLAGS) $(CFLAGS) $(LUA_CFLAGS) $(NEIGHTBL_CFLAGS) $(FPIC) -c -o $@ $< ++ ++compile: $(NEIGHTBL_OBJ) ++ $(CC) $(LDFLAGS) -shared -o $(NEIGHTBL_LIB) $(NEIGHTBL_OBJ) $(NEIGHTBL_LDFLAGS) ++ ++install: compile ++ mkdir -p $(DESTDIR)/usr/lib/lua ++ cp $(NEIGHTBL_LIB) $(DESTDIR)/usr/lib/lua/$(NEIGHTBL_LIB) ++ ++clean: ++ rm -f *.o *.so +diff --git a/feeds/luci/libs/luci-lib-luaneightbl/src/neightbl.c b/feeds/luci/libs/luci-lib-luaneightbl/src/neightbl.c +new file mode 100644 +index 0000000..987ec5e +--- /dev/null ++++ b/feeds/luci/libs/luci-lib-luaneightbl/src/neightbl.c +@@ -0,0 +1,122 @@ ++/* ++License: ++Copyright 2013 Steven Barth ++ ++Licensed under the Apache License, Version 2.0 (the "License"); ++you may not use this file except in compliance with the License. ++You may obtain a copy of the License at ++ ++ http://www.apache.org/licenses/LICENSE-2.0 ++ ++Unless required by applicable law or agreed to in writing, software ++distributed under the License is distributed on an "AS IS" BASIS, ++WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. ++See the License for the specific language governing permissions and ++limitations under the License. ++*/ ++ ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++ ++char *ether_ntoa_l (const struct ether_addr *addr, char *buf) ++{ ++ sprintf (buf, "%02x:%02x:%02x:%02x:%02x:%02x", ++ addr->ether_addr_octet[0], addr->ether_addr_octet[1], ++ addr->ether_addr_octet[2], addr->ether_addr_octet[3], ++ addr->ether_addr_octet[4], addr->ether_addr_octet[5]); ++ return buf; ++} ++ ++static int neightbl_get(lua_State *L) { ++ int sock = socket(AF_NETLINK, SOCK_RAW | SOCK_CLOEXEC, NETLINK_ROUTE); ++ struct sockaddr_nl kernel = {AF_NETLINK, 0, 0, 0}; ++ if (connect(sock, (struct sockaddr*)&kernel, sizeof(kernel))) ++ goto error; ++ ++ const char *ifname = luaL_checkstring(L, 1); ++ int ifindex = if_nametoindex(ifname); ++ if (ifindex <= 0) ++ goto error; ++ ++ struct { ++ struct nlmsghdr hdr; ++ struct ndmsg ndm; ++ } req = { ++ {sizeof(req), RTM_GETNEIGH, NLM_F_REQUEST | NLM_F_DUMP, 1, 0}, ++ {AF_INET6, 0, 0, ifindex, 0, 0, 0}, ++ }; ++ ++ if (send(sock, &req, sizeof(req), 0) != sizeof(req)) ++ goto error; ++ ++ lua_newtable(L); ++ ++ char buf[8192]; ++ struct nlmsghdr *nh = (struct nlmsghdr*)buf; ++ do { ++ ssize_t len = recv(sock, buf, sizeof(buf), 0); ++ if (len < 0) { ++ lua_pop(L, 1); ++ goto error; ++ } ++ ++ ++ for (;NLMSG_OK(nh, (size_t)len) && nh->nlmsg_type == RTM_NEWNEIGH; ++ nh = NLMSG_NEXT(nh, len)) { ++ struct ndmsg *ndm = NLMSG_DATA(nh); ++ if (NLMSG_PAYLOAD(nh, 0) < sizeof(*ndm) || ndm->ndm_ifindex != ifindex) ++ continue; ++ ++ ssize_t alen = NLMSG_PAYLOAD(nh, sizeof(*ndm)); ++ char buf[INET6_ADDRSTRLEN] = {0}, *mac = NULL, str_buf[ETH_ALEN]; ++ for (struct rtattr *rta = (struct rtattr*)&ndm[1]; RTA_OK(rta, alen); ++ rta = RTA_NEXT(rta, alen)) { ++ if (rta->rta_type == NDA_DST && RTA_PAYLOAD(rta) >= sizeof(struct in6_addr)) ++ inet_ntop(AF_INET6, RTA_DATA(rta), buf, sizeof(buf)); ++ else if (rta->rta_type == NDA_LLADDR && RTA_PAYLOAD(rta) >= 6) ++ mac = ether_ntoa_l(RTA_DATA(rta),str_buf); ++ } ++ ++ if (mac) ++ lua_pushstring(L, mac); ++ else ++ lua_pushboolean(L, false); ++ ++ lua_setfield(L, -2, buf); ++ } ++ } while (nh->nlmsg_type == RTM_NEWNEIGH); ++ ++ close(sock); ++ return 1; ++ ++error: ++ close(sock); ++ lua_pushnil(L); ++ lua_pushinteger(L, errno); ++ lua_pushstring(L, strerror(errno)); ++ return 3; ++} ++ ++ ++static const luaL_reg R[] = { ++ {"get", neightbl_get}, ++ {NULL, NULL} ++}; ++ ++ ++int luaopen_neightbl(lua_State *l) ++{ ++ luaL_register(l, "neightbl", R); ++ return 1; ++} +diff --git a/feeds/luci/libs/luci-lib-nixio/.gitignore b/feeds/luci/libs/luci-lib-nixio/.gitignore +new file mode 100644 +index 0000000..a21f2a2 +--- /dev/null ++++ b/feeds/luci/libs/luci-lib-nixio/.gitignore +@@ -0,0 +1,11 @@ ++src/libaxtls.a ++.depend ++.config.* ++_stage ++conf ++lex.zconf.c ++lkc_defs.h ++mconf ++zconf.tab.h ++zconf.tab.c ++src/nixio.dll +diff --git a/feeds/luci/libs/luci-lib-nixio/LICENSE b/feeds/luci/libs/luci-lib-nixio/LICENSE +new file mode 100644 +index 0000000..f49a4e1 +--- /dev/null ++++ b/feeds/luci/libs/luci-lib-nixio/LICENSE +@@ -0,0 +1,201 @@ ++ Apache License ++ Version 2.0, January 2004 ++ http://www.apache.org/licenses/ ++ ++ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION ++ ++ 1. Definitions. ++ ++ "License" shall mean the terms and conditions for use, reproduction, ++ and distribution as defined by Sections 1 through 9 of this document. ++ ++ "Licensor" shall mean the copyright owner or entity authorized by ++ the copyright owner that is granting the License. ++ ++ "Legal Entity" shall mean the union of the acting entity and all ++ other entities that control, are controlled by, or are under common ++ control with that entity. For the purposes of this definition, ++ "control" means (i) the power, direct or indirect, to cause the ++ direction or management of such entity, whether by contract or ++ otherwise, or (ii) ownership of fifty percent (50%) or more of the ++ outstanding shares, or (iii) beneficial ownership of such entity. ++ ++ "You" (or "Your") shall mean an individual or Legal Entity ++ exercising permissions granted by this License. ++ ++ "Source" form shall mean the preferred form for making modifications, ++ including but not limited to software source code, documentation ++ source, and configuration files. ++ ++ "Object" form shall mean any form resulting from mechanical ++ transformation or translation of a Source form, including but ++ not limited to compiled object code, generated documentation, ++ and conversions to other media types. ++ ++ "Work" shall mean the work of authorship, whether in Source or ++ Object form, made available under the License, as indicated by a ++ copyright notice that is included in or attached to the work ++ (an example is provided in the Appendix below). ++ ++ "Derivative Works" shall mean any work, whether in Source or Object ++ form, that is based on (or derived from) the Work and for which the ++ editorial revisions, annotations, elaborations, or other modifications ++ represent, as a whole, an original work of authorship. For the purposes ++ of this License, Derivative Works shall not include works that remain ++ separable from, or merely link (or bind by name) to the interfaces of, ++ the Work and Derivative Works thereof. ++ ++ "Contribution" shall mean any work of authorship, including ++ the original version of the Work and any modifications or additions ++ to that Work or Derivative Works thereof, that is intentionally ++ submitted to Licensor for inclusion in the Work by the copyright owner ++ or by an individual or Legal Entity authorized to submit on behalf of ++ the copyright owner. For the purposes of this definition, "submitted" ++ means any form of electronic, verbal, or written communication sent ++ to the Licensor or its representatives, including but not limited to ++ communication on electronic mailing lists, source code control systems, ++ and issue tracking systems that are managed by, or on behalf of, the ++ Licensor for the purpose of discussing and improving the Work, but ++ excluding communication that is conspicuously marked or otherwise ++ designated in writing by the copyright owner as "Not a Contribution." ++ ++ "Contributor" shall mean Licensor and any individual or Legal Entity ++ on behalf of whom a Contribution has been received by Licensor and ++ subsequently incorporated within the Work. ++ ++ 2. Grant of Copyright License. Subject to the terms and conditions of ++ this License, each Contributor hereby grants to You a perpetual, ++ worldwide, non-exclusive, no-charge, royalty-free, irrevocable ++ copyright license to reproduce, prepare Derivative Works of, ++ publicly display, publicly perform, sublicense, and distribute the ++ Work and such Derivative Works in Source or Object form. ++ ++ 3. Grant of Patent License. Subject to the terms and conditions of ++ this License, each Contributor hereby grants to You a perpetual, ++ worldwide, non-exclusive, no-charge, royalty-free, irrevocable ++ (except as stated in this section) patent license to make, have made, ++ use, offer to sell, sell, import, and otherwise transfer the Work, ++ where such license applies only to those patent claims licensable ++ by such Contributor that are necessarily infringed by their ++ Contribution(s) alone or by combination of their Contribution(s) ++ with the Work to which such Contribution(s) was submitted. If You ++ institute patent litigation against any entity (including a ++ cross-claim or counterclaim in a lawsuit) alleging that the Work ++ or a Contribution incorporated within the Work constitutes direct ++ or contributory patent infringement, then any patent licenses ++ granted to You under this License for that Work shall terminate ++ as of the date such litigation is filed. ++ ++ 4. Redistribution. You may reproduce and distribute copies of the ++ Work or Derivative Works thereof in any medium, with or without ++ modifications, and in Source or Object form, provided that You ++ meet the following conditions: ++ ++ (a) You must give any other recipients of the Work or ++ Derivative Works a copy of this License; and ++ ++ (b) You must cause any modified files to carry prominent notices ++ stating that You changed the files; and ++ ++ (c) You must retain, in the Source form of any Derivative Works ++ that You distribute, all copyright, patent, trademark, and ++ attribution notices from the Source form of the Work, ++ excluding those notices that do not pertain to any part of ++ the Derivative Works; and ++ ++ (d) If the Work includes a "NOTICE" text file as part of its ++ distribution, then any Derivative Works that You distribute must ++ include a readable copy of the attribution notices contained ++ within such NOTICE file, excluding those notices that do not ++ pertain to any part of the Derivative Works, in at least one ++ of the following places: within a NOTICE text file distributed ++ as part of the Derivative Works; within the Source form or ++ documentation, if provided along with the Derivative Works; or, ++ within a display generated by the Derivative Works, if and ++ wherever such third-party notices normally appear. The contents ++ of the NOTICE file are for informational purposes only and ++ do not modify the License. You may add Your own attribution ++ notices within Derivative Works that You distribute, alongside ++ or as an addendum to the NOTICE text from the Work, provided ++ that such additional attribution notices cannot be construed ++ as modifying the License. ++ ++ You may add Your own copyright statement to Your modifications and ++ may provide additional or different license terms and conditions ++ for use, reproduction, or distribution of Your modifications, or ++ for any such Derivative Works as a whole, provided Your use, ++ reproduction, and distribution of the Work otherwise complies with ++ the conditions stated in this License. ++ ++ 5. Submission of Contributions. Unless You explicitly state otherwise, ++ any Contribution intentionally submitted for inclusion in the Work ++ by You to the Licensor shall be under the terms and conditions of ++ this License, without any additional terms or conditions. ++ Notwithstanding the above, nothing herein shall supersede or modify ++ the terms of any separate license agreement you may have executed ++ with Licensor regarding such Contributions. ++ ++ 6. Trademarks. This License does not grant permission to use the trade ++ names, trademarks, service marks, or product names of the Licensor, ++ except as required for reasonable and customary use in describing the ++ origin of the Work and reproducing the content of the NOTICE file. ++ ++ 7. Disclaimer of Warranty. Unless required by applicable law or ++ agreed to in writing, Licensor provides the Work (and each ++ Contributor provides its Contributions) on an "AS IS" BASIS, ++ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or ++ implied, including, without limitation, any warranties or conditions ++ of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A ++ PARTICULAR PURPOSE. You are solely responsible for determining the ++ appropriateness of using or redistributing the Work and assume any ++ risks associated with Your exercise of permissions under this License. ++ ++ 8. Limitation of Liability. In no event and under no legal theory, ++ whether in tort (including negligence), contract, or otherwise, ++ unless required by applicable law (such as deliberate and grossly ++ negligent acts) or agreed to in writing, shall any Contributor be ++ liable to You for damages, including any direct, indirect, special, ++ incidental, or consequential damages of any character arising as a ++ result of this License or out of the use or inability to use the ++ Work (including but not limited to damages for loss of goodwill, ++ work stoppage, computer failure or malfunction, or any and all ++ other commercial damages or losses), even if such Contributor ++ has been advised of the possibility of such damages. ++ ++ 9. Accepting Warranty or Additional Liability. While redistributing ++ the Work or Derivative Works thereof, You may choose to offer, ++ and charge a fee for, acceptance of support, warranty, indemnity, ++ or other liability obligations and/or rights consistent with this ++ License. However, in accepting such obligations, You may act only ++ on Your own behalf and on Your sole responsibility, not on behalf ++ of any other Contributor, and only if You agree to indemnify, ++ defend, and hold each Contributor harmless for any liability ++ incurred by, or claims asserted against, such Contributor by reason ++ of your accepting any such warranty or additional liability. ++ ++ END OF TERMS AND CONDITIONS ++ ++ APPENDIX: How to apply the Apache License to your work. ++ ++ To apply the Apache License to your work, attach the following ++ boilerplate notice, with the fields enclosed by brackets "[]" ++ replaced with your own identifying information. (Don't include ++ the brackets!) The text should be enclosed in the appropriate ++ comment syntax for the file format. We also recommend that a ++ file or class name and description of purpose be included on the ++ same "printed page" as the copyright notice for easier ++ identification within third-party archives. ++ ++ Copyright [yyyy] [name of copyright owner] ++ ++ Licensed under the Apache License, Version 2.0 (the "License"); ++ you may not use this file except in compliance with the License. ++ You may obtain a copy of the License at ++ ++ http://www.apache.org/licenses/LICENSE-2.0 ++ ++ Unless required by applicable law or agreed to in writing, software ++ distributed under the License is distributed on an "AS IS" BASIS, ++ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. ++ See the License for the specific language governing permissions and ++ limitations under the License. +\ No newline at end of file +diff --git a/feeds/luci/libs/luci-lib-nixio/Makefile b/feeds/luci/libs/luci-lib-nixio/Makefile +new file mode 100644 +index 0000000..41800fe +--- /dev/null ++++ b/feeds/luci/libs/luci-lib-nixio/Makefile +@@ -0,0 +1,14 @@ ++# ++# Copyright (C) 2008-2014 The LuCI Team ++# ++# This is free software, licensed under the Apache License, Version 2.0 . ++# ++ ++include $(TOPDIR)/rules.mk ++ ++LUCI_TITLE:=NIXIO POSIX library ++LUCI_DEPENDS:=+PACKAGE_luci-lib-nixio_openssl:libopenssl +PACKAGE_luci-lib-nixio_cyassl:libcyassl +liblua ++ ++include ../../luci.mk ++ ++# call BuildPackage - OpenWrt buildroot signature +diff --git a/feeds/luci/libs/luci-lib-nixio/NOTICE b/feeds/luci/libs/luci-lib-nixio/NOTICE +new file mode 100644 +index 0000000..96d1192 +--- /dev/null ++++ b/feeds/luci/libs/luci-lib-nixio/NOTICE +@@ -0,0 +1,10 @@ ++nixio - Linux I/O library for lua ++Copyright 2009 Steven Barth ++Licensed under the Apache License, Version 2.0. ++ ++Contains code from: ++axTLS - Copyright 2008 Cameron Rich ++ ++Thanks for testing, feedback and code snippets: ++John Crispin ++Jo-Philipp Wich +\ No newline at end of file +diff --git a/feeds/luci/libs/luci-lib-nixio/README b/feeds/luci/libs/luci-lib-nixio/README +new file mode 100644 +index 0000000..ba9b36b +--- /dev/null ++++ b/feeds/luci/libs/luci-lib-nixio/README +@@ -0,0 +1,13 @@ ++Building: ++ Use GNU Make. ++ make or gmake depending on your system. ++ ++ Special make flags: ++ ++ OS Override Target OS [Linux|FreeBSD|SunOS|Windows] ++ NIXIO_TLS TLS-Library [*openssl|axtls] ++ NIXIO_CROSS_CC MinGW CC (Windows) `which i586-mingw32msvc-cc` ++ LUA_CFLAGS Lua CFLAGS `pkg-config --cflags lua5.1` ++ LUA_TARGET Lua compile target [*source|strip|compile] ++ LUA_MODULEDIR Install LUA_PATH "/usr/share/lua/5.1" ++ LUA_LIBRARYDIR Install LUA_CPATH "/usr/lib/lua/5.1" +diff --git a/feeds/luci/libs/luci-lib-nixio/axTLS/Makefile b/feeds/luci/libs/luci-lib-nixio/axTLS/Makefile +new file mode 100644 +index 0000000..02c33d2 +--- /dev/null ++++ b/feeds/luci/libs/luci-lib-nixio/axTLS/Makefile +@@ -0,0 +1,181 @@ ++# ++# Copyright (c) 2007, Cameron Rich ++# ++# All rights reserved. ++# ++# Redistribution and use in source and binary forms, with or without ++# modification, are permitted provided that the following conditions are met: ++# ++# * Redistributions of source code must retain the above copyright notice, ++# this list of conditions and the following disclaimer. ++# * 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. ++# * Neither the name of the axTLS project nor the names of its ++# contributors may be used to endorse or promote products derived ++# from this software without specific prior written permission. ++# ++# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ++# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT ++# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR ++# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR ++# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, ++# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED ++# TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, ++# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY ++# OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING ++# NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF ++# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ++# ++ ++-include config/.config ++ ++ifneq ($(strip $(HAVE_DOT_CONFIG)),y) ++all: menuconfig ++else ++all: target ++endif ++ ++include config/makefile.conf ++ ++target : $(STAGE) $(TARGET) ++ ++# VERSION has to come from the command line ++RELEASE=axTLS-$(VERSION) ++ ++# standard version ++target: ++ $(MAKE) -C crypto ++ $(MAKE) -C ssl ++ifdef CONFIG_AXHTTPD ++ $(MAKE) -C httpd ++endif ++ifdef CONFIG_BINDINGS ++ $(MAKE) -C bindings ++endif ++ifdef CONFIG_SAMPLES ++ $(MAKE) -C samples ++endif ++ ++$(STAGE) : ssl/version.h ++ @mkdir -p $(STAGE) ++ ++# create a version file with something in it. ++ssl/version.h: ++ @echo "#define AXTLS_VERSION \"(no version)\"" > ssl/version.h ++ ++$(PREFIX) : ++ @mkdir -p $(PREFIX)/lib ++ @mkdir -p $(PREFIX)/bin ++ ++release: ++ $(MAKE) -C config/scripts/config clean ++ -$(MAKE) clean ++ -@rm config/*.msi config/*.back.aip config/config.h config/.config* ++ -@rm www/index.20* ++ -@rm -fr $(STAGE) ++ @echo "#define AXTLS_VERSION \"$(VERSION)\"" > ssl/version.h ++ cd ../; tar cvfz $(RELEASE).tar.gz --wildcards-match-slash --exclude .svn axTLS; cd -; ++ ++docs: ++ $(MAKE) -C docsrc doco ++ ++# build the Win32 demo release version ++win32_demo: ++ @echo "#define AXTLS_VERSION \"$(VERSION)\"" > ssl/version.h ++ $(MAKE) win32releaseconf ++ ++install: $(PREFIX) all ++ cp --no-dereference $(STAGE)/libax* $(PREFIX)/lib ++ chmod 755 $(PREFIX)/lib/libax* ++ifdef CONFIG_SAMPLES ++ install -m 755 $(STAGE)/ax* $(PREFIX)/bin ++endif ++ifdef CONFIG_HTTP_HAS_AUTHORIZATION ++ install -m 755 $(STAGE)/htpasswd $(PREFIX)/bin ++endif ++ifdef CONFIG_PLATFORM_CYGWIN ++ install -m 755 $(STAGE)/cygaxtls.dll $(PREFIX)/bin ++endif ++ifdef CONFIG_PERL_BINDINGS ++ install -m 755 $(STAGE)/axtlsp.pm `perl -e 'use Config; print $$Config{installarchlib};'` ++endif ++ @mkdir -p -m 755 $(PREFIX)/include/axTLS ++ install -m 644 crypto/*.h $(PREFIX)/include/axTLS ++ install -m 644 ssl/*.h $(PREFIX)/include/axTLS ++ -rm $(PREFIX)/include/axTLS/cert.h ++ -rm $(PREFIX)/include/axTLS/private_key.h ++ install -m 644 config/config.h $(PREFIX)/include/axTLS ++ ++installclean: ++ -@rm $(PREFIX)/lib/libax* > /dev/null 2>&1 ++ -@rm $(PREFIX)/bin/ax* > /dev/null 2>&1 ++ -@rm $(PREFIX)/bin/axhttpd* > /dev/null 2>&1 ++ -@rm `perl -e 'use Config; print $$Config{installarchlib};'`/axtlsp.pm > /dev/null 2>&1 ++ ++test: ++ cd $(STAGE); ssltest; ../ssl/test/test_axssl.sh; cd -; ++ ++# tidy up things ++clean:: ++ @cd crypto; $(MAKE) clean ++ @cd ssl; $(MAKE) clean ++ @cd httpd; $(MAKE) clean ++ @cd samples; $(MAKE) clean ++ @cd docsrc; $(MAKE) clean ++ @cd bindings; $(MAKE) clean ++ ++# --------------------------------------------------------------------------- ++# mconf stuff ++# --------------------------------------------------------------------------- ++ ++CONFIG_CONFIG_IN = config/Config.in ++CONFIG_DEFCONFIG = config/defconfig ++ ++config/scripts/config/conf: config/scripts/config/Makefile ++ $(MAKE) -C config/scripts/config conf ++ -@if [ ! -f config/.config ] ; then \ ++ cp $(CONFIG_DEFCONFIG) config/.config; \ ++ fi ++ ++config/scripts/config/mconf: config/scripts/config/Makefile ++ $(MAKE) -C config/scripts/config ncurses conf mconf ++ -@if [ ! -f config/.config ] ; then \ ++ cp $(CONFIG_DEFCONFIG) .config; \ ++ fi ++ ++cleanconf: ++ $(MAKE) -C config/scripts/config clean ++ @rm -f config/.config ++ ++menuconfig: config/scripts/config/mconf ++ @./config/scripts/config/mconf $(CONFIG_CONFIG_IN) ++ ++config: config/scripts/config/conf ++ @./config/scripts/config/conf $(CONFIG_CONFIG_IN) ++ ++oldconfig: config/scripts/config/conf ++ @./config/scripts/config/conf -o $(CONFIG_CONFIG_IN) ++ ++default: config/scripts/config/conf ++ @./config/scripts/config/conf -d $(CONFIG_CONFIG_IN) > /dev/null ++ $(MAKE) ++ ++randconfig: config/scripts/config/conf ++ @./config/scripts/config/conf -r $(CONFIG_CONFIG_IN) ++ ++allnoconfig: config/scripts/config/conf ++ @./config/scripts/config/conf -n $(CONFIG_CONFIG_IN) ++ ++allyesconfig: config/scripts/config/conf ++ @./config/scripts/config/conf -y $(CONFIG_CONFIG_IN) ++ ++# The special win32 release configuration ++win32releaseconf: config/scripts/config/conf ++ @./config/scripts/config/conf -D config/win32config $(CONFIG_CONFIG_IN) > /dev/null ++ $(MAKE) ++ ++# The special linux release configuration ++linuxconf: config/scripts/config/conf ++ @./config/scripts/config/conf -D config/linuxconfig $(CONFIG_CONFIG_IN) > /dev/null ++ $(MAKE) +diff --git a/feeds/luci/libs/luci-lib-nixio/axTLS/README b/feeds/luci/libs/luci-lib-nixio/axTLS/README +new file mode 100644 +index 0000000..c8926d9 +--- /dev/null ++++ b/feeds/luci/libs/luci-lib-nixio/axTLS/README +@@ -0,0 +1,3 @@ ++ ++See www/index.html for the README, CHANGELOG, LICENSE and other notes. ++ +diff --git a/feeds/luci/libs/luci-lib-nixio/axTLS/bindings/Config.in b/feeds/luci/libs/luci-lib-nixio/axTLS/bindings/Config.in +new file mode 100644 +index 0000000..12a696b +--- /dev/null ++++ b/feeds/luci/libs/luci-lib-nixio/axTLS/bindings/Config.in +@@ -0,0 +1,105 @@ ++# ++# For a description of the syntax of this configuration file, ++# see scripts/config/Kconfig-language.txt ++# ++menu "Language Bindings" ++ ++config CONFIG_BINDINGS ++ bool "Create language bindings" ++ default n ++ help ++ axTLS supports language bindings in C#, VB.NET, Java and Perl. ++ ++ Select Y here if you want to build the various language bindings. ++ ++config CONFIG_CSHARP_BINDINGS ++ bool "Create C# bindings" ++ default n ++ depends on CONFIG_BINDINGS ++ help ++ Build C# bindings. ++ ++ This requires .NET to be installed on Win32 platforms and mono to be ++ installed on all other platforms. ++ ++config CONFIG_VBNET_BINDINGS ++ bool "Create VB.NET bindings" ++ default n ++ depends on CONFIG_BINDINGS ++ help ++ Build VB.NET bindings. ++ ++ This requires the .NET to be installed and is only built under Win32 ++ platforms. ++ ++menu ".Net Framework" ++depends on CONFIG_CSHARP_BINDINGS || CONFIG_VBNET_BINDINGS ++config CONFIG_DOT_NET_FRAMEWORK_BASE ++ string "Location of .NET Framework" ++ default "c:\\WINDOWS\\Microsoft.NET\\Framework\\v2.0.50727" ++endmenu ++ ++config CONFIG_JAVA_BINDINGS ++ bool "Create Java bindings" ++ default n ++ depends on CONFIG_BINDINGS ++ help ++ Build Java bindings. ++ ++ Current Issues (see README): ++ * Needs Java 1.4 or better. ++ * If building under Win32 it will use the Win32 JDK. ++ ++menu "Java Home" ++depends on CONFIG_JAVA_BINDINGS ++config CONFIG_JAVA_HOME ++ string "Location of JDK" ++ default "c:\\Program Files\\Java\\jdk1.5.0_06" if CONFIG_PLATFORM_WIN32 || CONFIG_PLATFORM_CYGWIN ++ default "/usr/local/jdk142" if !CONFIG_PLATFORM_WIN32 && !CONFIG_PLATFORM_CYGWIN ++ depends on CONFIG_JAVA_BINDINGS ++ help ++ The location of Sun's JDK. ++endmenu ++ ++config CONFIG_PERL_BINDINGS ++ bool "Create Perl bindings" ++ default n ++ depends on CONFIG_BINDINGS ++ help ++ Build Perl bindings. ++ ++ Current Issues (see README): ++ * 64 bit versions don't work at present. ++ * libperl.so needs to be in the shared library path. ++ ++menu "Perl Home" ++depends on CONFIG_PERL_BINDINGS && CONFIG_PLATFORM_WIN32 ++config CONFIG_PERL_CORE ++ string "Location of Perl CORE" ++ default "c:\\perl\\lib\\CORE" ++ help: ++ works with ActiveState ++ "http://www.activestate.com/Products/ActivePerl" ++ ++config CONFIG_PERL_LIB ++ string "Name of Perl Library" ++ default "perl58.lib" ++endmenu ++ ++config CONFIG_LUA_BINDINGS ++ bool "Create Lua bindings" ++ default n ++ depends on CONFIG_BINDINGS && !CONFIG_PLATFORM_WIN32 ++ help ++ Build Lua bindings (see www.lua.org). ++ ++menu "Lua Home" ++depends on CONFIG_LUA_BINDINGS ++config CONFIG_LUA_CORE ++ string "Location of Lua CORE" ++ default "/usr/local" ++ help: ++ If the Lua exists on another directory then this needs to be changed ++endmenu ++ ++endmenu +diff --git a/feeds/luci/libs/luci-lib-nixio/axTLS/bindings/Makefile b/feeds/luci/libs/luci-lib-nixio/axTLS/bindings/Makefile +new file mode 100644 +index 0000000..7654fbb +--- /dev/null ++++ b/feeds/luci/libs/luci-lib-nixio/axTLS/bindings/Makefile +@@ -0,0 +1,86 @@ ++# ++# Copyright (c) 2007, Cameron Rich ++# ++# All rights reserved. ++# ++# Redistribution and use in source and binary forms, with or without ++# modification, are permitted provided that the following conditions are met: ++# ++# * Redistributions of source code must retain the above copyright notice, ++# this list of conditions and the following disclaimer. ++# * 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. ++# * Neither the name of the axTLS project nor the names of its ++# contributors may be used to endorse or promote products derived ++# from this software without specific prior written permission. ++# ++# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ++# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT ++# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR ++# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR ++# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, ++# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED ++# TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, ++# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY ++# OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING ++# NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF ++# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ++# ++ ++all: ++ ++include ../config/.config ++include ../config/makefile.conf ++ ++ifdef CONFIG_CSHARP_BINDINGS ++all: csharp/axInterface.cs ++endif ++ ++ifdef CONFIG_VBNET_BINDINGS ++all: vbnet/axInterface.vb ++endif ++ ++ifdef CONFIG_JAVA_BINDINGS ++all: java/axtlsj.java ++endif ++ ++ifdef CONFIG_PERL_BINDINGS ++all: perl/axTLSp_wrap.c ++endif ++ ++ifdef CONFIG_LUA_BINDINGS ++all: lua/axTLSl_wrap.c ++endif ++ ++csharp/axInterface.cs: ../ssl/ssl.h ++ @perl ./generate_interface.pl -csharp ++ ++vbnet/axInterface.vb: ../ssl/ssl.h ++ @perl ./generate_interface.pl -vbnet ++ ++java/axTLSj.i: ../ssl/ssl.h ++ @perl ./generate_SWIG_interface.pl -java ++ ++java/axtlsj.java: java/axTLSj.i $(wildcard java/SSL*.java) ++ @cd java; swig -java -package axTLSj axTLSj.i; $(MAKE) ++ ++perl/axTLSp.i: ../ssl/ssl.h ++ @perl ./generate_SWIG_interface.pl -perl ++ ++perl/axTLSp_wrap.c: perl/axTLSp.i ++ @cd perl; swig -perl5 axTLSp.i; $(MAKE) ++ ++lua/axTLSl.i: ../ssl/ssl.h ++ @perl ./generate_SWIG_interface.pl -lua ++ ++lua/axTLSl_wrap.c: lua/axTLSl.i ++ @cd lua; swig -lua axTLSl.i; $(MAKE) ++ ++clean:: ++ $(MAKE) -C csharp clean ++ $(MAKE) -C vbnet clean ++ $(MAKE) -C java clean ++ $(MAKE) -C perl clean ++ $(MAKE) -C lua clean ++ +diff --git a/feeds/luci/libs/luci-lib-nixio/axTLS/bindings/README b/feeds/luci/libs/luci-lib-nixio/axTLS/bindings/README +new file mode 100644 +index 0000000..8bc3109 +--- /dev/null ++++ b/feeds/luci/libs/luci-lib-nixio/axTLS/bindings/README +@@ -0,0 +1,43 @@ ++=============================================================================== ++= Language Bindings = ++=============================================================================== ++ ++The tools to generate the various language bindings are done here. ++SWIG 1.3.24 or better is required for creating the Java and Perl bindings. ++ ++Perl scripts are used to parse ssl.h and automagically give the appropriate ++bindings. ++ ++At present, the four languages supported are: ++ ++* C# ++* VB.NET ++* Java ++* Perl ++ ++To generate each binding run the following: ++ ++C#: ++> generate_interface.pl -csharp ++ ++VB.NET: ++> generate_interface.pl -vbnet ++ ++ ++Java: ++> generate_SWIG_interface.pl -java ++> cd java; swig -java -package axTLSj -noextern axTLSj.i ++ ++Perl: ++> generate_SWIG_interface.pl -perl ++> cd perl; swig -noextern -perl axTLSp.i ++ ++Java and Perl both create a library each called libaxtlsj.so and libaxtlsp.so ++(or axtlsj.dll and atlsp.dll on Win32 platforms). ++ ++Note: the "-noextern" is deprecated in swig 1.3.27 and newer. The "-noextern" ++option was required to get Win32 bindings to work (which is why is has probably ++been deprecated). ++ ++Each binding (except for Perl) has an extra helper interface to make life ++easier. +diff --git a/feeds/luci/libs/luci-lib-nixio/axTLS/bindings/csharp/Makefile b/feeds/luci/libs/luci-lib-nixio/axTLS/bindings/csharp/Makefile +new file mode 100644 +index 0000000..3414f85 +--- /dev/null ++++ b/feeds/luci/libs/luci-lib-nixio/axTLS/bindings/csharp/Makefile +@@ -0,0 +1,35 @@ ++# ++# Copyright (c) 2007, Cameron Rich ++# ++# All rights reserved. ++# ++# Redistribution and use in source and binary forms, with or without ++# modification, are permitted provided that the following conditions are met: ++# ++# * Redistributions of source code must retain the above copyright notice, ++# this list of conditions and the following disclaimer. ++# * 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. ++# * Neither the name of the axTLS project nor the names of its ++# contributors may be used to endorse or promote products derived ++# from this software without specific prior written permission. ++# ++# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ++# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT ++# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR ++# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR ++# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, ++# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED ++# TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, ++# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY ++# OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING ++# NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF ++# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ++# ++ ++include ../../config/.config ++include ../../config/makefile.conf ++ ++clean:: ++ @rm -f axssl* axInterface.cs +diff --git a/feeds/luci/libs/luci-lib-nixio/axTLS/bindings/csharp/axTLS.cs b/feeds/luci/libs/luci-lib-nixio/axTLS/bindings/csharp/axTLS.cs +new file mode 100644 +index 0000000..cf64a25 +--- /dev/null ++++ b/feeds/luci/libs/luci-lib-nixio/axTLS/bindings/csharp/axTLS.cs +@@ -0,0 +1,491 @@ ++/* ++ * Copyright (c) 2007, Cameron Rich ++ * ++ * All rights reserved. ++ * ++ * Redistribution and use in source and binary forms, with or without ++ * modification, are permitted provided that the following conditions are met: ++ * ++ * * Redistributions of source code must retain the above copyright notice, ++ * this list of conditions and the following disclaimer. ++ * * 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. ++ * * Neither the name of the axTLS project nor the names of its contributors ++ * may be used to endorse or promote products derived from this software ++ * without specific prior written permission. ++ * ++ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ++ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT ++ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR ++ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR ++ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, ++ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, ++ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR ++ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF ++ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING ++ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS ++ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ++ */ ++ ++/** ++ * A wrapper around the unmanaged interface to give a semi-decent C# API ++ */ ++ ++using System; ++using System.Runtime.InteropServices; ++using System.Net.Sockets; ++ ++/** ++ * @defgroup csharp_api C# API. ++ * ++ * Ensure that the appropriate Dispose() methods are called when finished with ++ * various objects - otherwise memory leaks will result. ++ * @{ ++ */ ++namespace axTLS ++{ ++ /** ++ * @class SSL ++ * @ingroup csharp_api ++ * @brief A representation of an SSL connection. ++ */ ++ public class SSL ++ { ++ public IntPtr m_ssl; /**< A pointer to the real SSL type */ ++ ++ /** ++ * @brief Store the reference to an SSL context. ++ * @param ip [in] A reference to an SSL object. ++ */ ++ public SSL(IntPtr ip) ++ { ++ m_ssl = ip; ++ } ++ ++ /** ++ * @brief Free any used resources on this connection. ++ * ++ * A "Close Notify" message is sent on this connection (if possible). ++ * It is up to the application to close the socket. ++ */ ++ public void Dispose() ++ { ++ axtls.ssl_free(m_ssl); ++ } ++ ++ /** ++ * @brief Return the result of a handshake. ++ * @return SSL_OK if the handshake is complete and ok. ++ * @see ssl.h for the error code list. ++ */ ++ public int HandshakeStatus() ++ { ++ return axtls.ssl_handshake_status(m_ssl); ++ } ++ ++ /** ++ * @brief Return the SSL cipher id. ++ * @return The cipher id which is one of: ++ * - SSL_AES128_SHA (0x2f) ++ * - SSL_AES256_SHA (0x35) ++ * - SSL_RC4_128_SHA (0x05) ++ * - SSL_RC4_128_MD5 (0x04) ++ */ ++ public byte GetCipherId() ++ { ++ return axtls.ssl_get_cipher_id(m_ssl); ++ } ++ ++ /** ++ * @brief Get the session id for a handshake. ++ * ++ * This will be a 32 byte sequence and is available after the first ++ * handshaking messages are sent. ++ * @return The session id as a 32 byte sequence. ++ * @note A SSLv23 handshake may have only 16 valid bytes. ++ */ ++ public byte[] GetSessionId() ++ { ++ IntPtr ptr = axtls.ssl_get_session_id(m_ssl); ++ byte sess_id_size = axtls.ssl_get_session_id_size(m_ssl); ++ byte[] result = new byte[sess_id_size]; ++ Marshal.Copy(ptr, result, 0, sess_id_size); ++ return result; ++ } ++ ++ /** ++ * @brief Retrieve an X.509 distinguished name component. ++ * ++ * When a handshake is complete and a certificate has been exchanged, ++ * then the details of the remote certificate can be retrieved. ++ * ++ * This will usually be used by a client to check that the server's ++ * common name matches the URL. ++ * ++ * A full handshake needs to occur for this call to work. ++ * ++ * @param component [in] one of: ++ * - SSL_X509_CERT_COMMON_NAME ++ * - SSL_X509_CERT_ORGANIZATION ++ * - SSL_X509_CERT_ORGANIZATIONAL_NAME ++ * - SSL_X509_CA_CERT_COMMON_NAME ++ * - SSL_X509_CA_CERT_ORGANIZATION ++ * - SSL_X509_CA_CERT_ORGANIZATIONAL_NAME ++ * @return The appropriate string (or null if not defined) ++ */ ++ public string GetCertificateDN(int component) ++ { ++ return axtls.ssl_get_cert_dn(m_ssl, component); ++ } ++ } ++ ++ /** ++ * @class SSLUtil ++ * @ingroup csharp_api ++ * @brief Some global helper functions. ++ */ ++ public class SSLUtil ++ { ++ ++ /** ++ * @brief Return the build mode of the axTLS project. ++ * @return The build mode is one of: ++ * - SSL_BUILD_SERVER_ONLY ++ * - SSL_BUILD_ENABLE_VERIFICATION ++ * - SSL_BUILD_ENABLE_CLIENT ++ * - SSL_BUILD_FULL_MODE ++ */ ++ public static int BuildMode() ++ { ++ return axtls.ssl_get_config(axtls.SSL_BUILD_MODE); ++ } ++ ++ /** ++ * @brief Return the number of chained certificates that the ++ * client/server supports. ++ * @return The number of supported server certificates. ++ */ ++ public static int MaxCerts() ++ { ++ return axtls.ssl_get_config(axtls.SSL_MAX_CERT_CFG_OFFSET); ++ } ++ ++ /** ++ * @brief Return the number of CA certificates that the client/server ++ * supports. ++ * @return The number of supported CA certificates. ++ */ ++ public static int MaxCACerts() ++ { ++ return axtls.ssl_get_config(axtls.SSL_MAX_CA_CERT_CFG_OFFSET); ++ } ++ ++ /** ++ * @brief Indicate if PEM is supported. ++ * @return true if PEM supported. ++ */ ++ public static bool HasPEM() ++ { ++ return axtls.ssl_get_config(axtls.SSL_HAS_PEM) > 0 ? true : false; ++ } ++ ++ /** ++ * @brief Display the text string of the error. ++ * @param error_code [in] The integer error code. ++ */ ++ public static void DisplayError(int error_code) ++ { ++ axtls.ssl_display_error(error_code); ++ } ++ ++ /** ++ * @brief Return the version of the axTLS project. ++ */ ++ public static string Version() ++ { ++ return axtls.ssl_version(); ++ } ++ } ++ ++ /** ++ * @class SSLCTX ++ * @ingroup csharp_api ++ * @brief A base object for SSLServer/SSLClient. ++ */ ++ public class SSLCTX ++ { ++ /** ++ * @brief A reference to the real client/server context. ++ */ ++ protected IntPtr m_ctx; ++ ++ /** ++ * @brief Establish a new client/server context. ++ * ++ * This function is called before any client/server SSL connections are ++ * made. If multiple threads are used, then each thread will have its ++ * own SSLCTX context. Any number of connections may be made with a ++ * single context. ++ * ++ * Each new connection will use the this context's private key and ++ * certificate chain. If a different certificate chain is required, ++ * then a different context needs to be be used. ++ * ++ * @param options [in] Any particular options. At present the options ++ * supported are: ++ * - SSL_SERVER_VERIFY_LATER (client only): Don't stop a handshake if ++ * the server authentication fails. The certificate can be ++ * authenticated later with a call to VerifyCert(). ++ * - SSL_CLIENT_AUTHENTICATION (server only): Enforce client ++ * authentication i.e. each handshake will include a "certificate ++ * request" message from the server. ++ * - SSL_DISPLAY_BYTES (full mode build only): Display the byte ++ * sequences during the handshake. ++ * - SSL_DISPLAY_STATES (full mode build only): Display the state ++ * changes during the handshake. ++ * - SSL_DISPLAY_CERTS (full mode build only): Display the ++ * certificates that are passed during a handshake. ++ * - SSL_DISPLAY_RSA (full mode build only): Display the RSA key ++ * details that are passed during a handshake. ++ * @param num_sessions [in] The number of sessions to be used for ++ * session caching. If this value is 0, then there is no session ++ * caching. ++ * @return A client/server context. ++ */ ++ protected SSLCTX(uint options, int num_sessions) ++ { ++ m_ctx = axtls.ssl_ctx_new(options, num_sessions); ++ } ++ ++ /** ++ * @brief Remove a client/server context. ++ * ++ * Frees any used resources used by this context. Each connection will ++ * be sent a "Close Notify" alert (if possible). ++ */ ++ public void Dispose() ++ { ++ axtls.ssl_ctx_free(m_ctx); ++ } ++ ++ /** ++ * @brief Read the SSL data stream. ++ * @param ssl [in] An SSL object reference. ++ * @param in_data [out] After a successful read, the decrypted data ++ * will be here. It will be null otherwise. ++ * @return The number of decrypted bytes: ++ * - if > 0, then the handshaking is complete and we are returning the ++ * number of decrypted bytes. ++ * - SSL_OK if the handshaking stage is successful (but not yet ++ * complete). ++ * - < 0 if an error. ++ * @see ssl.h for the error code list. ++ * @note Use in_data before doing any successive ssl calls. ++ */ ++ public int Read(SSL ssl, out byte[] in_data) ++ { ++ IntPtr ptr = IntPtr.Zero; ++ int ret = axtls.ssl_read(ssl.m_ssl, ref ptr); ++ ++ if (ret > axtls.SSL_OK) ++ { ++ in_data = new byte[ret]; ++ Marshal.Copy(ptr, in_data, 0, ret); ++ } ++ else ++ { ++ in_data = null; ++ } ++ ++ return ret; ++ } ++ ++ /** ++ * @brief Write to the SSL data stream. ++ * @param ssl [in] An SSL obect reference. ++ * @param out_data [in] The data to be written ++ * @return The number of bytes sent, or if < 0 if an error. ++ * @see ssl.h for the error code list. ++ */ ++ public int Write(SSL ssl, byte[] out_data) ++ { ++ return axtls.ssl_write(ssl.m_ssl, out_data, out_data.Length); ++ } ++ ++ /** ++ * @brief Write to the SSL data stream. ++ * @param ssl [in] An SSL obect reference. ++ * @param out_data [in] The data to be written ++ * @param out_len [in] The number of bytes to be written ++ * @return The number of bytes sent, or if < 0 if an error. ++ * @see ssl.h for the error code list. ++ */ ++ public int Write(SSL ssl, byte[] out_data, int out_len) ++ { ++ return axtls.ssl_write(ssl.m_ssl, out_data, out_len); ++ } ++ ++ /** ++ * @brief Find an ssl object based on a Socket reference. ++ * ++ * Goes through the list of SSL objects maintained in a client/server ++ * context to look for a socket match. ++ * @param s [in] A reference to a Socket object. ++ * @return A reference to the SSL object. Returns null if the object ++ * could not be found. ++ */ ++ public SSL Find(Socket s) ++ { ++ int client_fd = s.Handle.ToInt32(); ++ return new SSL(axtls. ssl_find(m_ctx, client_fd)); ++ } ++ ++ /** ++ * @brief Authenticate a received certificate. ++ * ++ * This call is usually made by a client after a handshake is complete ++ * and the context is in SSL_SERVER_VERIFY_LATER mode. ++ * @param ssl [in] An SSL object reference. ++ * @return SSL_OK if the certificate is verified. ++ */ ++ public int VerifyCert(SSL ssl) ++ { ++ return axtls.ssl_verify_cert(ssl.m_ssl); ++ } ++ ++ /** ++ * @brief Force the client to perform its handshake again. ++ * ++ * For a client this involves sending another "client hello" message. ++ * For the server is means sending a "hello request" message. ++ * ++ * This is a blocking call on the client (until the handshake ++ * completes). ++ * @param ssl [in] An SSL object reference. ++ * @return SSL_OK if renegotiation instantiation was ok ++ */ ++ public int Renegotiate(SSL ssl) ++ { ++ return axtls.ssl_renegotiate(ssl.m_ssl); ++ } ++ ++ /** ++ * @brief Load a file into memory that is in binary DER or ASCII PEM ++ * format. ++ * ++ * These are temporary objects that are used to load private keys, ++ * certificates etc into memory. ++ * @param obj_type [in] The format of the file. Can be one of: ++ * - SSL_OBJ_X509_CERT (no password required) ++ * - SSL_OBJ_X509_CACERT (no password required) ++ * - SSL_OBJ_RSA_KEY (AES128/AES256 PEM encryption supported) ++ * - SSL_OBJ_P8 (RC4-128 encrypted data supported) ++ * - SSL_OBJ_P12 (RC4-128 encrypted data supported) ++ * ++ * PEM files are automatically detected (if supported). ++ * @param filename [in] The location of a file in DER/PEM format. ++ * @param password [in] The password used. Can be null if not required. ++ * @return SSL_OK if all ok ++ */ ++ public int ObjLoad(int obj_type, string filename, string password) ++ { ++ return axtls.ssl_obj_load(m_ctx, obj_type, filename, password); ++ } ++ ++ /** ++ * @brief Transfer binary data into the object loader. ++ * ++ * These are temporary objects that are used to load private keys, ++ * certificates etc into memory. ++ * @param obj_type [in] The format of the memory data. ++ * @param data [in] The binary data to be loaded. ++ * @param len [in] The amount of data to be loaded. ++ * @param password [in] The password used. Can be null if not required. ++ * @return SSL_OK if all ok ++ */ ++ public int ObjLoad(int obj_type, byte[] data, int len, string password) ++ { ++ return axtls.ssl_obj_memory_load(m_ctx, obj_type, ++ data, len, password); ++ } ++ } ++ ++ /** ++ * @class SSLServer ++ * @ingroup csharp_api ++ * @brief The server context. ++ * ++ * All server connections are started within a server context. ++ */ ++ public class SSLServer : SSLCTX ++ { ++ /** ++ * @brief Start a new server context. ++ * ++ * @see SSLCTX for details. ++ */ ++ public SSLServer(uint options, int num_sessions) : ++ base(options, num_sessions) {} ++ ++ /** ++ * @brief Establish a new SSL connection to an SSL client. ++ * ++ * It is up to the application to establish the initial socket ++ * connection. ++ * ++ * Call Dispose() when the connection is to be removed. ++ * @param s [in] A reference to a Socket object. ++ * @return An SSL object reference. ++ */ ++ public SSL Connect(Socket s) ++ { ++ int client_fd = s.Handle.ToInt32(); ++ return new SSL(axtls.ssl_server_new(m_ctx, client_fd)); ++ } ++ } ++ ++ /** ++ * @class SSLClient ++ * @ingroup csharp_api ++ * @brief The client context. ++ * ++ * All client connections are started within a client context. ++ */ ++ public class SSLClient : SSLCTX ++ { ++ /** ++ * @brief Start a new client context. ++ * ++ * @see SSLCTX for details. ++ */ ++ public SSLClient(uint options, int num_sessions) : ++ base(options, num_sessions) {} ++ ++ /** ++ * @brief Establish a new SSL connection to an SSL server. ++ * ++ * It is up to the application to establish the initial socket ++ * connection. ++ * ++ * This is a blocking call - it will finish when the handshake is ++ * complete (or has failed). ++ * ++ * Call Dispose() when the connection is to be removed. ++ * @param s [in] A reference to a Socket object. ++ * @param session_id [in] A 32 byte session id for session resumption. ++ * This can be null if no session resumption is not required. ++ * @return An SSL object reference. Use SSL.handshakeStatus() to check ++ * if a handshake succeeded. ++ */ ++ public SSL Connect(Socket s, byte[] session_id) ++ { ++ int client_fd = s.Handle.ToInt32(); ++ byte sess_id_size = (byte)(session_id != null ? ++ session_id.Length : 0); ++ return new SSL(axtls.ssl_client_new(m_ctx, client_fd, session_id, ++ sess_id_size)); ++ } ++ } ++} ++/** @} */ +diff --git a/feeds/luci/libs/luci-lib-nixio/axTLS/bindings/generate_SWIG_interface.pl b/feeds/luci/libs/luci-lib-nixio/axTLS/bindings/generate_SWIG_interface.pl +new file mode 100755 +index 0000000..4b25179 +--- /dev/null ++++ b/feeds/luci/libs/luci-lib-nixio/axTLS/bindings/generate_SWIG_interface.pl +@@ -0,0 +1,393 @@ ++#!/usr/bin/perl ++ ++# ++# Copyright (c) 2007, Cameron Rich ++# ++# All rights reserved. ++# ++# Redistribution and use in source and binary forms, with or without ++# modification, are permitted provided that the following conditions are met: ++# ++# * Redistributions of source code must retain the above copyright notice, ++# this list of conditions and the following disclaimer. ++# * 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. ++# * Neither the name of the axTLS project nor the names of its ++# contributors may be used to endorse or promote products derived ++# from this software without specific prior written permission. ++# ++# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ++# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT ++# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR ++# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR ++# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, ++# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED ++# TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, ++# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY ++# OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING ++# NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF ++# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ++# ++ ++#=============================================================== ++# Transforms function signature into SWIG format ++sub transformSignature ++{ ++ foreach $item (@_) ++ { ++ $line =~ s/STDCALL //g; ++ $line =~ s/EXP_FUNC/extern/g; ++ ++ # make API Java more 'byte' friendly ++ $line =~ s/uint32_t/int/g; ++ $line =~ s/const uint8_t \* /const unsigned char \* /g; ++ $line =~ s/\(void\)/()/g; ++ if ($ARGV[0] eq "-java") ++ { ++ $line =~ s/.*ssl_read.*//g; ++ $line =~ s/const uint8_t \*(\w+)/const signed char $1\[\]/g; ++ $line =~ s/uint8_t/signed char/g; ++ } ++ elsif ($ARGV[0] eq "-perl") ++ { ++ $line =~ s/const uint8_t \*(\w+)/const unsigned char $1\[\]/g; ++ $line =~ s/uint8_t/unsigned char/g; ++ } ++ else # lua ++ { ++ $line =~ s/const uint8_t \*session_id/const unsigned char session_id\[\]/g; ++ $line =~ s/const uint8_t \*\w+/unsigned char *INPUT/g; ++ $line =~ s/uint8_t/unsigned char/g; ++ } ++ } ++ ++ return $line; ++} ++ ++# Parse input file ++sub parseFile ++{ ++ foreach $line (@_) ++ { ++ next if $line =~ /ssl_x509_create/; # ignore for now ++ ++ # test for a #define ++ if (!$skip && $line =~ m/^#define/) ++ { ++ $splitDefine = 1 if $line =~ m/\\$/; ++ print DATA_OUT $line; ++ ++ # check line is not split ++ next if $splitDefine == 1; ++ } ++ ++ # pick up second line of #define statement ++ if ($splitDefine) ++ { ++ print DATA_OUT $line; ++ ++ # check line is not split ++ $splitDefine = ($line =~ m/\\$/); ++ next; ++ } ++ ++ # test for function declaration ++ if (!$skip && $line =~ /EXP_FUNC/ && $line !~/\/\*/) ++ { ++ $line = transformSignature($line); ++ $splitFunctionDeclaration = $line !~ /;/; ++ print DATA_OUT $line; ++ next; ++ } ++ ++ if ($splitFunctionDeclaration) ++ { ++ $line = transformSignature($line); ++ $splitFunctionDeclaration = $line !~ /;/; ++ print DATA_OUT $line; ++ next; ++ } ++ } ++} ++ ++#=============================================================== ++ ++# Determine which module to build from cammand-line options ++use strict; ++use Getopt::Std; ++ ++my $module; ++my $interfaceFile; ++my $data_file; ++my $skip; ++my $splitLine; ++my @raw_data; ++ ++if (not defined $ARGV[0]) ++{ ++ goto ouch; ++} ++ ++if ($ARGV[0] eq "-java") ++{ ++ print "Generating Java interface file\n"; ++ $module = "axtlsj"; ++ $interfaceFile = "java/axTLSj.i"; ++} ++elsif ($ARGV[0] eq "-perl") ++{ ++ print "Generating Perl interface file\n"; ++ $module = "axtlsp"; ++ $interfaceFile = "perl/axTLSp.i"; ++} ++elsif ($ARGV[0] eq "-lua") ++{ ++ print "Generating lua interface file\n"; ++ $module = "axtlsl"; ++ $interfaceFile = "lua/axTLSl.i"; ++} ++else ++{ ++ouch: ++ die "Usage: $0 [-java | -perl | -lua]\n"; ++} ++ ++# Input file required to generate SWIG interface file. ++$data_file = "../ssl/ssl.h"; ++ ++# Open input files ++open(DATA_IN, $data_file) || die("Could not open file ($data_file)!"); ++@raw_data = ; ++ ++# Open output file ++open(DATA_OUT, ">$interfaceFile") || die("Cannot Open File"); ++ ++# ++# I wish I could say it was easy to generate the Perl/Java/Lua bindings, ++# but each had their own set of challenges... :-(. ++# ++print DATA_OUT << "END"; ++%module $module\n ++ ++/* include our own header */ ++%inline %{ ++#include "ssl.h" ++%} ++ ++%include "typemaps.i" ++/* Some SWIG magic to make the API a bit more Java friendly */ ++#ifdef SWIGJAVA ++ ++%apply long { SSL * }; ++%apply long { SSL_CTX * }; ++%apply long { SSLObjLoader * }; ++ ++/* allow "unsigned char []" to become "byte[]" */ ++%include "arrays_java.i" ++ ++/* convert these pointers to use long */ ++%apply signed char[] {unsigned char *}; ++%apply signed char[] {signed char *}; ++ ++/* allow ssl_get_session_id() to return "byte[]" */ ++%typemap(out) unsigned char * ssl_get_session_id \"if (result) jresult = SWIG_JavaArrayOutSchar(jenv, result, ssl_get_session_id_size((SSL const *)arg1));\" ++ ++/* allow ssl_client_new() to have a null session_id input */ ++%typemap(in) const signed char session_id[] (jbyte *jarr) { ++ if (jarg3 == NULL) ++ { ++ jresult = (jint)ssl_client_new(arg1,arg2,NULL,0); ++ return jresult; ++ } ++ ++ if (!SWIG_JavaArrayInSchar(jenv, &jarr, &arg3, jarg3)) return 0; ++} ++ ++/* Lot's of work required for an ssl_read() due to its various custom ++ * requirements. ++ */ ++%native (ssl_read) int ssl_read(SSL *ssl, jobject in_data); ++%{ ++JNIEXPORT jint JNICALL Java_axTLSj_axtlsjJNI_ssl_1read(JNIEnv *jenv, jclass jcls, jint jarg1, jobject jarg2) { ++ jint jresult = 0 ; ++ SSL *arg1; ++ unsigned char *arg2; ++ jbyte *jarr; ++ int result; ++ JNIEnv e = *jenv; ++ jclass holder_class; ++ jfieldID fid; ++ ++ arg1 = (SSL *)jarg1; ++ result = (int)ssl_read(arg1, &arg2); ++ ++ /* find the "m_buf" entry in the SSLReadHolder class */ ++ if (!(holder_class = e->GetObjectClass(jenv,jarg2)) || ++ !(fid = e->GetFieldID(jenv,holder_class, "m_buf", "[B"))) ++ return SSL_NOT_OK; ++ ++ if (result > SSL_OK) ++ { ++ int i; ++ ++ /* create a new byte array to hold the read data */ ++ jbyteArray jarray = e->NewByteArray(jenv, result); ++ ++ /* copy the bytes across to the java byte array */ ++ jarr = e->GetByteArrayElements(jenv, jarray, 0); ++ for (i = 0; i < result; i++) ++ jarr[i] = (jbyte)arg2[i]; ++ ++ /* clean up and set the new m_buf object */ ++ e->ReleaseByteArrayElements(jenv, jarray, jarr, 0); ++ e->SetObjectField(jenv, jarg2, fid, jarray); ++ } ++ else /* set to null */ ++ e->SetObjectField(jenv, jarg2, fid, NULL); ++ ++ jresult = (jint)result; ++ return jresult; ++} ++%} ++ ++/* Big hack to get hold of a socket's file descriptor */ ++%typemap (jtype) long "Object" ++%typemap (jstype) long "Object" ++%native (getFd) int getFd(long sock); ++%{ ++JNIEXPORT jint JNICALL Java_axTLSj_axtlsjJNI_getFd(JNIEnv *env, jclass jcls, jobject sock) ++{ ++ JNIEnv e = *env; ++ jfieldID fid; ++ jobject impl; ++ jobject fdesc; ++ ++ /* get the SocketImpl from the Socket */ ++ if (!(jcls = e->GetObjectClass(env,sock)) || ++ !(fid = e->GetFieldID(env,jcls,"impl","Ljava/net/SocketImpl;")) || ++ !(impl = e->GetObjectField(env,sock,fid))) return -1; ++ ++ /* get the FileDescriptor from the SocketImpl */ ++ if (!(jcls = e->GetObjectClass(env,impl)) || ++ !(fid = e->GetFieldID(env,jcls,"fd","Ljava/io/FileDescriptor;")) || ++ !(fdesc = e->GetObjectField(env,impl,fid))) return -1; ++ ++ /* get the fd from the FileDescriptor */ ++ if (!(jcls = e->GetObjectClass(env,fdesc)) || ++ !(fid = e->GetFieldID(env,jcls,"fd","I"))) return -1; ++ ++ /* return the descriptor */ ++ return e->GetIntField(env,fdesc,fid); ++} ++%} ++ ++#endif ++ ++/* Some SWIG magic to make the API a bit more Perl friendly */ ++#ifdef SWIGPERL ++ ++/* for ssl_session_id() */ ++%typemap(out) const unsigned char * { ++ SV *svs = newSVpv((unsigned char *)\$1, ssl_get_session_id_size((SSL const *)arg1)); ++ \$result = newRV(svs); ++ sv_2mortal(\$result); ++ argvi++; ++} ++ ++/* for ssl_write() */ ++%typemap(in) const unsigned char out_data[] { ++ SV* tempsv; ++ if (!SvROK(\$input)) ++ croak("Argument \$argnum is not a reference."); ++ tempsv = SvRV(\$input); ++ if (SvTYPE(tempsv) != SVt_PV) ++ croak("Argument \$argnum is not an string."); ++ \$1 = (unsigned char *)SvPV(tempsv, PL_na); ++} ++ ++/* for ssl_read() */ ++%typemap(in) unsigned char **in_data (unsigned char *buf) { ++ \$1 = &buf; ++} ++ ++%typemap(argout) unsigned char **in_data { ++ if (result > SSL_OK) { ++ SV *svs = newSVpv(*\$1, result); ++ \$result = newRV(svs); ++ sv_2mortal(\$result); ++ argvi++; ++ } ++} ++ ++/* for ssl_client_new() */ ++%typemap(in) const unsigned char session_id[] { ++ /* check for a reference */ ++ if (SvOK(\$input) && SvROK(\$input)) { ++ SV* tempsv = SvRV(\$input); ++ if (SvTYPE(tempsv) != SVt_PV) ++ croak("Argument \$argnum is not an string."); ++ \$1 = (unsigned char *)SvPV(tempsv, PL_na); ++ } ++ else ++ \$1 = NULL; ++} ++ ++#endif ++ ++/* Some SWIG magic to make the API a bit more Lua friendly */ ++#ifdef SWIGLUA ++SWIG_NUMBER_TYPEMAP(unsigned char); ++SWIG_TYPEMAP_NUM_ARR(uchar,unsigned char); ++ ++/* for ssl_session_id() */ ++%typemap(out) const unsigned char * { ++ int i; ++ lua_newtable(L); ++ for (i = 0; i < ssl_get_session_id_size((SSL const *)arg1); i++){ ++ lua_pushnumber(L,(lua_Number)result[i]); ++ lua_rawseti(L,-2,i+1); /* -1 is the number, -2 is the table */ ++ } ++ SWIG_arg++; ++} ++ ++/* for ssl_read() */ ++%typemap(in) unsigned char **in_data (unsigned char *buf) { ++ \$1 = &buf; ++} ++ ++%typemap(argout) unsigned char **in_data { ++ if (result > SSL_OK) { ++ int i; ++ lua_newtable(L); ++ for (i = 0; i < result; i++){ ++ lua_pushnumber(L,(lua_Number)buf2[i]); ++ lua_rawseti(L,-2,i+1); /* -1 is the number, -2 is the table */ ++ } ++ SWIG_arg++; ++ } ++} ++ ++/* for ssl_client_new() */ ++%typemap(in) const unsigned char session_id[] { ++ if (lua_isnil(L,\$input)) ++ \$1 = NULL; ++ else ++ \$1 = SWIG_get_uchar_num_array_fixed(L,\$input, ssl_get_session_id((SSL const *)\$1)); ++} ++ ++#endif ++ ++END ++ ++# Initialise loop variables ++$skip = 1; ++$splitLine = 0; ++ ++parseFile(@raw_data); ++ ++close(DATA_IN); ++close(DATA_OUT); ++ ++#=============================================================== ++ +diff --git a/feeds/luci/libs/luci-lib-nixio/axTLS/bindings/generate_interface.pl b/feeds/luci/libs/luci-lib-nixio/axTLS/bindings/generate_interface.pl +new file mode 100755 +index 0000000..c24bff9 +--- /dev/null ++++ b/feeds/luci/libs/luci-lib-nixio/axTLS/bindings/generate_interface.pl +@@ -0,0 +1,322 @@ ++#!/usr/bin/perl -w ++ ++# ++# Copyright (c) 2007, Cameron Rich ++# ++# All rights reserved. ++# ++# Redistribution and use in source and binary forms, with or without ++# modification, are permitted provided that the following conditions are met: ++# ++# * Redistributions of source code must retain the above copyright notice, ++# this list of conditions and the following disclaimer. ++# * 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. ++# * Neither the name of the axTLS project nor the names of its ++# contributors may be used to endorse or promote products derived ++# from this software without specific prior written permission. ++# ++# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ++# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT ++# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR ++# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR ++# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, ++# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED ++# TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, ++# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY ++# OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING ++# NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF ++# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ++# ++ ++#=============================================================== ++# This application transforms ssl.h into interfaces that can be used by ++# other language bindings. It is "SWIG"-like in nature in that various ++# files are generated based on the axTLS API. ++# ++# The file produced is axInterface.? (depending on the file extension). ++# ++#=============================================================== ++ ++use strict; ++ ++my $CSHARP = 0; ++my $VBNET = 1; ++ ++my $binding; ++my $skip = 0; ++my $signature_ret_type; ++ ++# Transforms function signature into an Interface format ++sub transformSignature ++{ ++ my $item; ++ my ($line) = @_; ++ ++ foreach $item ($line) ++ { ++ # our very basic preprocessor ++ if ($binding == $CSHARP) ++ { ++ $line =~ s/STDCALL //; ++ $line =~ s/EXP_FUNC/ [DllImport ("axtls")]\n public static extern/; ++ $line =~ s/uint32_t/uint/g; ++ $line =~ s/uint8_t \*\*/ref IntPtr /g; ++ $line =~ s/const uint8_t \* /IntPtr /g; ++ $line =~ s/const uint8_t \*/byte[] /g; # note: subtle diff ++ $line =~ s/uint8_t \* ?/byte[] /g; ++ $line =~ s/uint8_t ?/byte /g; ++ $line =~ s/const char \* ?/string /g; ++ $line =~ s/const SSL_CTX \* ?/IntPtr /g; ++ $line =~ s/SSL_CTX \* ?/IntPtr /g; ++ $line =~ s/SSLObjLoader \* ?/IntPtr /g; ++ $line =~ s/const SSL \* ?/IntPtr /g; ++ $line =~ s/SSL \* ?/IntPtr /g; ++ $line =~ s/\(void\)/()/g; ++ } ++ elsif ($binding == $VBNET) ++ { ++ if ($line =~ /EXP_FUNC/) ++ { ++ # Procedure or function? ++ my $invariant = $line =~ /void /; ++ ++ my $proc = $invariant ? "Sub" : "Function"; ++ ($signature_ret_type) = $line =~ /EXP_FUNC (.*) STDCALL/; ++ $line =~ s/EXP_FUNC .* STDCALL / Public Shared $proc _\n /; ++ ++ $signature_ret_type =~ s/const uint8_t \*/As IntPtr/; ++ $signature_ret_type =~ s/const char \*/As String/; ++ $signature_ret_type =~ s/SSL_CTX \*/As IntPtr/; ++ $signature_ret_type =~ s/SSLObjLoader \*/As IntPtr/; ++ $signature_ret_type =~ s/SSL \*/As IntPtr/; ++ $signature_ret_type =~ s/uint8_t/As Byte/; ++ $signature_ret_type =~ s/int/As Integer/; ++ $signature_ret_type =~ s/void//; ++ $signature_ret_type .= "\n End $proc\n\n"; ++ } ++ ++ $line =~ s/uint32_t (\w+)/ByVal $1 As Integer/g; ++ $line =~ s/int (\w+)/ByVal $1 As Integer/g; ++ $line =~ s/uint8_t \*\* ?(\w+)/ByRef $1 As IntPtr/g; ++ $line =~ s/const uint8_t \* ?(\w+)/ByVal $1() As Byte/g; ++ $line =~ s/uint8_t \* ?(\w+)/ByVal $1() As Byte/g; ++ $line =~ s/uint8_t ?(\w+)/ByVal $1 As Byte/g; ++ $line =~ s/const char \* ?(\w+)/ByVal $1 As String/g; ++ $line =~ s/const SSL_CTX \* ?(\w+)/ByVal $1 As IntPtr/g; ++ $line =~ s/SSL_CTX \* ?(\w+)/ByVal $1 As IntPtr/g; ++ $line =~ s/SSLObjLoader \* ?(\w+)/ByVal $1 As IntPtr/g; ++ $line =~ s/const SSL \* ?(\w+)/ByVal $1 As IntPtr/g; ++ $line =~ s/SSL \* ?(\w+)/ByVal $1 As IntPtr/g; ++ $line =~ s/void \* ?(\w+)/Byval $1 As IntPtr/g; ++ $line =~ s/\(void\)/()/g; ++ $line =~ s/void//g; ++ $line =~ s/;\n/ $signature_ret_type;/; ++ } ++ } ++ ++ return $line; ++} ++ ++# Parse input file ++sub parseFile ++{ ++ my (@file) = @_; ++ my $line; ++ my $splitDefine = 0; ++ my $splitFunctionDeclaration; ++ my $vb_hack = " "; ++ my $vb_line_hack = 0; ++ ++ $skip = 0; ++ ++ foreach $line (@file) ++ { ++ next if $line =~ /sl_x509_create/; # ignore for now ++ ++ # test for a #define ++ if (!$skip && $line =~ m/^#define/) ++ { ++ $splitDefine = 1 if $line =~ m/\\$/; ++ ++ if ($binding == $VBNET) ++ { ++ $line =~ s/\|/Or/g; ++ $line =~ s/ 0x/ &H/; ++ } ++ ++ my ($name, $value) = $line =~ /#define (\w+) +([^\\]*)[\\]?\n/; ++ ++ if (defined $name && defined $value) ++ { ++ # C# constant translation ++ if ($binding == $CSHARP) ++ { ++ $line = " public const int $name = $value"; ++ } ++ # VB.NET constant translation ++ elsif ($binding == $VBNET) ++ { ++ $line = " Public Const $name As Integer = $value"; ++ } ++ } ++ ++ next if $line =~ /#define/; # ignore any other defines ++ ++ print DATA_OUT $line; ++ ++ # check line is not split ++ next if $splitDefine == 1; ++ print DATA_OUT ";" if $binding == $CSHARP; ++ print DATA_OUT "\n"; ++ } ++ ++ # pick up second line of #define statement ++ if ($splitDefine) ++ { ++ if ($line !~ /\\$/) ++ { ++ $line =~ s/$/;/ if $binding == $CSHARP; # add the ";" ++ } ++ ++ $line =~ s/ ?\| ?/ Or /g ++ if ($binding == $VBNET); ++ ++ # check line is not split ++ $splitDefine = ($line =~ m/\\$/); ++ ++ # ignore trailing "\" ++ $line =~ s/\\$// if $binding == $CSHARP; ++ $line =~ s/\\$/_/ if $binding == $VBNET; ++ print DATA_OUT $line; ++ next; ++ } ++ ++ # test for function declaration ++ if (!$skip && $line =~ /EXP_FUNC/ && $line !~ /\/\*/) ++ { ++ $line = transformSignature($line); ++ $splitFunctionDeclaration = $line !~ /;/; ++ $line =~ s/;// if ($binding == $VBNET); ++ $line =~ s/\n$/ _\n/ if ($binding == $VBNET) && ++ $splitFunctionDeclaration; ++ print DATA_OUT $line; ++ next; ++ } ++ ++ if ($splitFunctionDeclaration) ++ { ++ $line = transformSignature($line); ++ $splitFunctionDeclaration = $line !~ /;/; ++ $line =~ s/;// if ($binding == $VBNET); ++ $line =~ s/\n/ _\n/ if ($binding == $VBNET) && ++ $splitFunctionDeclaration == 1; ++ print DATA_OUT $line; ++ next; ++ } ++ } ++} ++ ++#=============================================================== ++ ++# Determine which module to build from command-line options ++use strict; ++use Getopt::Std; ++ ++my $binding_prefix; ++my $binding_suffix; ++my $data_file; ++my @raw_data; ++ ++if (not defined $ARGV[0]) ++{ ++ goto ouch; ++} ++ ++if ($ARGV[0] eq "-csharp") ++{ ++ print "Generating C# interface file\n"; ++ $binding_prefix = "csharp"; ++ $binding_suffix = "cs"; ++ $binding = $CSHARP; ++} ++elsif ($ARGV[0] eq "-vbnet") ++{ ++ print "Generating VB.NET interface file\n"; ++ $binding_prefix = "vbnet"; ++ $binding_suffix = "vb"; ++ $binding = $VBNET; ++} ++else ++{ ++ouch: ++ die "Usage: $0 [-csharp | -vbnet]\n"; ++} ++ ++my $interfaceFile = "$binding_prefix/axInterface.$binding_suffix"; ++ ++# Input file required to generate interface file. ++$data_file = "../ssl/ssl.h"; ++ ++# Open input files ++open(DATA_IN, $data_file) || die("Could not open file ($data_file)!"); ++@raw_data = ; ++ ++ ++# Open output file ++if ($binding == $CSHARP || $binding == $VBNET) ++{ ++ open(DATA_OUT, ">$interfaceFile") || die("Cannot Open File"); ++} ++ ++# SPEC interface file header ++if ($binding == $CSHARP) ++{ ++ # generate the C#/C interface file ++ print DATA_OUT << "END"; ++// The C# to C interface definition file for the axTLS project ++// Do not modify - this file is generated ++ ++using System; ++using System.Runtime.InteropServices; ++ ++namespace axTLS ++{ ++ public class axtls ++ { ++END ++} ++elsif ($binding == $VBNET) ++{ ++ # generate the VB.NET/C interface file ++ print DATA_OUT << "END"; ++' The VB.NET to C interface definition file for the axTLS project ++' Do not modify - this file is generated ++ ++Imports System ++Imports System.Runtime.InteropServices ++ ++Namespace axTLSvb ++ Public Class axtls ++END ++} ++ ++parseFile(@raw_data); ++ ++# finish up ++if ($binding == $CSHARP) ++{ ++ print DATA_OUT " };\n"; ++ print DATA_OUT "};\n"; ++} ++elsif ($binding == $VBNET) ++{ ++ print DATA_OUT " End Class\nEnd Namespace\n"; ++} ++ ++close(DATA_IN); ++close(DATA_OUT); ++ ++#=============================================================== ++ +diff --git a/feeds/luci/libs/luci-lib-nixio/axTLS/bindings/java/Makefile b/feeds/luci/libs/luci-lib-nixio/axTLS/bindings/java/Makefile +new file mode 100644 +index 0000000..8df1d0a +--- /dev/null ++++ b/feeds/luci/libs/luci-lib-nixio/axTLS/bindings/java/Makefile +@@ -0,0 +1,94 @@ ++# ++# Copyright (c) 2007, Cameron Rich ++# ++# All rights reserved. ++# ++# Redistribution and use in source and binary forms, with or without ++# modification, are permitted provided that the following conditions are met: ++# ++# * Redistributions of source code must retain the above copyright notice, ++# this list of conditions and the following disclaimer. ++# * 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. ++# * Neither the name of the axTLS project nor the names of its ++# contributors may be used to endorse or promote products derived ++# from this software without specific prior written permission. ++# ++# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ++# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT ++# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR ++# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR ++# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, ++# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED ++# TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, ++# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY ++# OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING ++# NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF ++# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ++# ++ ++AXTLS_HOME=../.. ++ ++include $(AXTLS_HOME)/config/.config ++include $(AXTLS_HOME)/config/makefile.conf ++include $(AXTLS_HOME)/config/makefile.java.conf ++ ++all: lib jar ++ ++JAR=$(AXTLS_HOME)/$(STAGE)/axtls.jar ++ ++ifdef CONFIG_PLATFORM_WIN32 ++TARGET=$(AXTLS_HOME)/$(STAGE)/axtlsj.dll ++else ++TARGET=$(AXTLS_HOME)/$(STAGE)/libaxtlsj.so ++endif ++ ++lib: $(TARGET) ++axTLSj_wrap.o : axTLSj_wrap.c ++ ++JAVA_FILES= \ ++ axtlsjJNI.java \ ++ axtlsjConstants.java \ ++ axtlsj.java \ ++ SSLReadHolder.java \ ++ SSL.java \ ++ SSLUtil.java \ ++ SSLCTX.java \ ++ SSLServer.java \ ++ SSLClient.java ++ ++OBJ=axTLSj_wrap.o ++ ++JAVA_CLASSES:=$(JAVA_FILES:%.java=classes/axTLSj/%.class) ++ ++ifdef CONFIG_PLATFORM_WIN32 ++LDFLAGS += axtls.lib /libpath:"$(AXTLS_HOME)/$(STAGE)" ++ ++include $(AXTLS_HOME)/config/makefile.post ++ ++$(TARGET) : $(OBJ) ++ $(LD) $(LDFLAGS) $(LDSHARED) /out:$@ $(OBJ) ++else # Not Win32 ++ ++$(TARGET) : $(OBJ) ++ $(LD) $(LDFLAGS) -L $(AXTLS_HOME)/$(STAGE) $(LDSHARED) -o $@ $(OBJ) -laxtls ++endif ++ ++jar: $(OBJ) $(JAR) ++ ++# if we are doing the samples then defer creating the jar until then ++$(JAR): $(JAVA_CLASSES) ++ifndef CONFIG_JAVA_SAMPLES ++ jar cvf $@ -C classes axTLSj ++else ++ @if [ ! -f $(JAR) ]; then touch $(JAR); fi ++endif ++ ++classes/axTLSj/%.class : %.java ++ javac -d classes -classpath classes $^ ++ ++clean:: ++ @rm -f $(JAR) $(TARGET) SWIG* axtls* *.i *.c ++ @rm -fr classes/* ++ +diff --git a/feeds/luci/libs/luci-lib-nixio/axTLS/bindings/java/SSL.java b/feeds/luci/libs/luci-lib-nixio/axTLS/bindings/java/SSL.java +new file mode 100644 +index 0000000..b53a6da +--- /dev/null ++++ b/feeds/luci/libs/luci-lib-nixio/axTLS/bindings/java/SSL.java +@@ -0,0 +1,137 @@ ++/* ++ * Copyright (c) 2007, Cameron Rich ++ * ++ * All rights reserved. ++ * ++ * Redistribution and use in source and binary forms, with or without ++ * modification, are permitted provided that the following conditions are met: ++ * ++ * * Redistributions of source code must retain the above copyright notice, ++ * this list of conditions and the following disclaimer. ++ * * 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. ++ * * Neither the name of the axTLS project nor the names of its contributors ++ * may be used to endorse or promote products derived from this software ++ * without specific prior written permission. ++ * ++ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ++ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT ++ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR ++ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR ++ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, ++ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, ++ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR ++ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF ++ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING ++ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS ++ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ++ */ ++ ++/* ++ * A wrapper around the unmanaged interface to give a semi-decent Java API ++ */ ++ ++package axTLSj; ++ ++import java.io.*; ++import java.util.*; ++ ++/** ++ * @defgroup java_api Java API. ++ * ++ * Ensure that the appropriate dispose() methods are called when finished with ++ * various objects - otherwise memory leaks will result. ++ */ ++ ++/** ++ * @class SSL ++ * @ingroup java_api ++ * @brief A representation of an SSL connection. ++ * ++ */ ++public class SSL ++{ ++ public int m_ssl; /**< A pointer to the real SSL type */ ++ ++ /** ++ * @brief Store the reference to an SSL context. ++ * @param ip [in] A reference to an SSL object. ++ */ ++ public SSL(int ip) ++ { ++ m_ssl = ip; ++ } ++ ++ /** ++ * @brief Free any used resources on this connection. ++ * ++ * A "Close Notify" message is sent on this connection (if possible). It ++ * is up to the application to close the socket. ++ */ ++ public void dispose() ++ { ++ axtlsj.ssl_free(m_ssl); ++ } ++ ++ /** ++ * @brief Return the result of a handshake. ++ * @return SSL_OK if the handshake is complete and ok. ++ * @see ssl.h for the error code list. ++ */ ++ public int handshakeStatus() ++ { ++ return axtlsj.ssl_handshake_status(m_ssl); ++ } ++ ++ /** ++ * @brief Return the SSL cipher id. ++ * @return The cipher id which is one of: ++ * - SSL_AES128_SHA (0x2f) ++ * - SSL_AES256_SHA (0x35) ++ * - SSL_RC4_128_SHA (0x05) ++ * - SSL_RC4_128_MD5 (0x04) ++ */ ++ public byte getCipherId() ++ { ++ return axtlsj.ssl_get_cipher_id(m_ssl); ++ } ++ ++ /** ++ * @brief Get the session id for a handshake. ++ * ++ * This will be a 32 byte sequence and is available after the first ++ * handshaking messages are sent. ++ * @return The session id as a 32 byte sequence. ++ * @note A SSLv23 handshake may have only 16 valid bytes. ++ */ ++ public byte[] getSessionId() ++ { ++ return axtlsj.ssl_get_session_id(m_ssl); ++ } ++ ++ /** ++ * @brief Retrieve an X.509 distinguished name component. ++ * ++ * When a handshake is complete and a certificate has been exchanged, ++ * then the details of the remote certificate can be retrieved. ++ * ++ * This will usually be used by a client to check that the server's common ++ * name matches the URL. ++ * ++ * A full handshake needs to occur for this call to work. ++ * ++ * @param component [in] one of: ++ * - SSL_X509_CERT_COMMON_NAME ++ * - SSL_X509_CERT_ORGANIZATION ++ * - SSL_X509_CERT_ORGANIZATIONAL_NAME ++ * - SSL_X509_CA_CERT_COMMON_NAME ++ * - SSL_X509_CA_CERT_ORGANIZATION ++ * - SSL_X509_CA_CERT_ORGANIZATIONAL_NAME ++ * @return The appropriate string (or null if not defined) ++ */ ++ public String getCertificateDN(int component) ++ { ++ return axtlsj.ssl_get_cert_dn(m_ssl, component); ++ } ++} +diff --git a/feeds/luci/libs/luci-lib-nixio/axTLS/bindings/java/SSLCTX.java b/feeds/luci/libs/luci-lib-nixio/axTLS/bindings/java/SSLCTX.java +new file mode 100644 +index 0000000..1cd3e03 +--- /dev/null ++++ b/feeds/luci/libs/luci-lib-nixio/axTLS/bindings/java/SSLCTX.java +@@ -0,0 +1,229 @@ ++/* ++ * Copyright (c) 2007, Cameron Rich ++ * ++ * All rights reserved. ++ * ++ * Redistribution and use in source and binary forms, with or without ++ * modification, are permitted provided that the following conditions are met: ++ * ++ * * Redistributions of source code must retain the above copyright notice, ++ * this list of conditions and the following disclaimer. ++ * * 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. ++ * * Neither the name of the axTLS project nor the names of its contributors ++ * may be used to endorse or promote products derived from this software ++ * without specific prior written permission. ++ * ++ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ++ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT ++ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR ++ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR ++ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, ++ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, ++ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR ++ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF ++ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING ++ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS ++ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ++ */ ++ ++/* ++ * A wrapper around the unmanaged interface to give a semi-decent Java API ++ */ ++ ++package axTLSj; ++ ++import java.net.*; ++ ++/** ++ * @class SSLCTX ++ * @ingroup java_api ++ * @brief A base object for SSLServer/SSLClient. ++ */ ++public class SSLCTX ++{ ++ /** ++ * A reference to the real client/server context. ++ */ ++ protected int m_ctx; ++ ++ /** ++ * @brief Establish a new client/server context. ++ * ++ * This function is called before any client/server SSL connections are ++ * made. If multiple threads are used, then each thread will have its ++ * own SSLCTX context. Any number of connections may be made with a single ++ * context. ++ * ++ * Each new connection will use the this context's private key and ++ * certificate chain. If a different certificate chain is required, then a ++ * different context needs to be be used. ++ * ++ * @param options [in] Any particular options. At present the options ++ * supported are: ++ * - SSL_SERVER_VERIFY_LATER (client only): Don't stop a handshake if the ++ * server authentication fails. The certificate can be authenticated later ++ * with a call to verifyCert(). ++ * - SSL_CLIENT_AUTHENTICATION (server only): Enforce client authentication ++ * i.e. each handshake will include a "certificate request" message from ++ * the server. ++ * - SSL_DISPLAY_BYTES (full mode build only): Display the byte sequences ++ * during the handshake. ++ * - SSL_DISPLAY_STATES (full mode build only): Display the state changes ++ * during the handshake. ++ * - SSL_DISPLAY_CERTS (full mode build only): Display the certificates that ++ * are passed during a handshake. ++ * - SSL_DISPLAY_RSA (full mode build only): Display the RSA key details ++ * that are passed during a handshake. ++ * ++ * @param num_sessions [in] The number of sessions to be used for session ++ * caching. If this value is 0, then there is no session caching. ++ * ++ * If this option is null, then the default internal private key/ ++ * certificate pair is used (if CONFIG_SSL_USE_DEFAULT_KEY is set). ++ * ++ * The resources used by this object are automatically freed. ++ * @return A client/server context. ++ */ ++ protected SSLCTX(int options, int num_sessions) ++ { ++ m_ctx = axtlsj.ssl_ctx_new(options, num_sessions); ++ } ++ ++ /** ++ * @brief Remove a client/server context. ++ * ++ * Frees any used resources used by this context. Each connection will be ++ * sent a "Close Notify" alert (if possible). ++ */ ++ public void dispose() ++ { ++ axtlsj.ssl_ctx_free(m_ctx); ++ } ++ ++ /** ++ * @brief Read the SSL data stream. ++ * @param ssl [in] An SSL object reference. ++ * @param rh [out] After a successful read, the decrypted data can be ++ * retrieved with rh.getData(). It will be null otherwise. ++ * @return The number of decrypted bytes: ++ * - if > 0, then the handshaking is complete and we are returning the ++ * number of decrypted bytes. ++ * - SSL_OK if the handshaking stage is successful (but not yet complete). ++ * - < 0 if an error. ++ * @see ssl.h for the error code list. ++ * @note Use rh before doing any successive ssl calls. ++ */ ++ public int read(SSL ssl, SSLReadHolder rh) ++ { ++ return axtlsj.ssl_read(ssl.m_ssl, rh); ++ } ++ ++ /** ++ * @brief Write to the SSL data stream. ++ * @param ssl [in] An SSL obect reference. ++ * @param out_data [in] The data to be written ++ * @return The number of bytes sent, or if < 0 if an error. ++ * @see ssl.h for the error code list. ++ */ ++ public int write(SSL ssl, byte[] out_data) ++ { ++ return axtlsj.ssl_write(ssl.m_ssl, out_data, out_data.length); ++ } ++ ++ /** ++ * @brief Write to the SSL data stream. ++ * @param ssl [in] An SSL obect reference. ++ * @param out_data [in] The data to be written ++ * @param out_len [in] The number of bytes to be written ++ * @return The number of bytes sent, or if < 0 if an error. ++ * @see ssl.h for the error code list. ++ */ ++ public int write(SSL ssl, byte[] out_data, int out_len) ++ { ++ return axtlsj.ssl_write(ssl.m_ssl, out_data, out_len); ++ } ++ ++ /** ++ * @brief Find an ssl object based on a Socket reference. ++ * ++ * Goes through the list of SSL objects maintained in a client/server ++ * context to look for a socket match. ++ * @param s [in] A reference to a Socket object. ++ * @return A reference to the SSL object. Returns null if the object ++ * could not be found. ++ */ ++ public SSL find(Socket s) ++ { ++ int client_fd = axtlsj.getFd(s); ++ return new SSL(axtlsj.ssl_find(m_ctx, client_fd)); ++ } ++ ++ /** ++ * @brief Authenticate a received certificate. ++ * ++ * This call is usually made by a client after a handshake is complete ++ * and the context is in SSL_SERVER_VERIFY_LATER mode. ++ * @param ssl [in] An SSL object reference. ++ * @return SSL_OK if the certificate is verified. ++ */ ++ public int verifyCert(SSL ssl) ++ { ++ return axtlsj.ssl_verify_cert(ssl.m_ssl); ++ } ++ ++ /** ++ * @brief Force the client to perform its handshake again. ++ * ++ * For a client this involves sending another "client hello" message. ++ * For the server is means sending a "hello request" message. ++ * ++ * This is a blocking call on the client (until the handshake completes). ++ * @param ssl [in] An SSL object reference. ++ * @return SSL_OK if renegotiation instantiation was ok ++ */ ++ public int renegotiate(SSL ssl) ++ { ++ return axtlsj.ssl_renegotiate(ssl.m_ssl); ++ } ++ ++ /** ++ * @brief Load a file into memory that is in binary DER or ASCII PEM format. ++ * ++ * These are temporary objects that are used to load private keys, ++ * certificates etc into memory. ++ * @param obj_type [in] The format of the file. Can be one of: ++ * - SSL_OBJ_X509_CERT (no password required) ++ * - SSL_OBJ_X509_CACERT (no password required) ++ * - SSL_OBJ_RSA_KEY (AES128/AES256 PEM encryption supported) ++ * - SSL_OBJ_P8 (RC4-128 encrypted data supported) ++ * - SSL_OBJ_P12 (RC4-128 encrypted data supported) ++ * ++ * PEM files are automatically detected (if supported). ++ * @param filename [in] The location of a file in DER/PEM format. ++ * @param password [in] The password used. Can be null if not required. ++ * @return SSL_OK if all ok ++ */ ++ public int objLoad(int obj_type, String filename, String password) ++ { ++ return axtlsj.ssl_obj_load(m_ctx, obj_type, filename, password); ++ } ++ ++ /** ++ * @brief Transfer binary data into the object loader. ++ * ++ * These are temporary objects that are used to load private keys, ++ * certificates etc into memory. ++ * @param obj_type [in] The format of the memory data. ++ * @param data [in] The binary data to be loaded. ++ * @param len [in] The amount of data to be loaded. ++ * @param password [in] The password used. Can be null if not required. ++ * @return SSL_OK if all ok ++ */ ++ ++ public int objLoad(int obj_type, byte[] data, int len, String password) ++ { ++ return axtlsj.ssl_obj_memory_load(m_ctx, obj_type, data, len, password); ++ } ++} +diff --git a/feeds/luci/libs/luci-lib-nixio/axTLS/bindings/java/SSLClient.java b/feeds/luci/libs/luci-lib-nixio/axTLS/bindings/java/SSLClient.java +new file mode 100644 +index 0000000..f65fe9c +--- /dev/null ++++ b/feeds/luci/libs/luci-lib-nixio/axTLS/bindings/java/SSLClient.java +@@ -0,0 +1,81 @@ ++/* ++ * Copyright (c) 2007, Cameron Rich ++ * ++ * All rights reserved. ++ * ++ * Redistribution and use in source and binary forms, with or without ++ * modification, are permitted provided that the following conditions are met: ++ * ++ * * Redistributions of source code must retain the above copyright notice, ++ * this list of conditions and the following disclaimer. ++ * * 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. ++ * * Neither the name of the axTLS project nor the names of its contributors ++ * may be used to endorse or promote products derived from this software ++ * without specific prior written permission. ++ * ++ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ++ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT ++ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR ++ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR ++ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, ++ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, ++ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR ++ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF ++ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING ++ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS ++ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ++ */ ++ ++/* ++ * A wrapper around the unmanaged interface to give a semi-decent Java API ++ */ ++ ++package axTLSj; ++ ++import java.net.*; ++ ++/** ++ * @class SSLClient ++ * @ingroup java_api ++ * @brief The client context. ++ * ++ * All client connections are started within a client context. ++ */ ++public class SSLClient extends SSLCTX ++{ ++ /** ++ * @brief Start a new client context. ++ * ++ * @see SSLCTX for details. ++ */ ++ public SSLClient(int options, int num_sessions) ++ { ++ super(options, num_sessions); ++ } ++ ++ /** ++ * @brief Establish a new SSL connection to an SSL server. ++ * ++ * It is up to the application to establish the initial socket connection. ++ * ++ * This is a blocking call - it will finish when the handshake is ++ * complete (or has failed). ++ * ++ * Call dispose() when the connection is to be removed. ++ * @param s [in] A reference to a Socket object. ++ * @param session_id [in] A 32 byte session id for session resumption. This ++ * can be null if no session resumption is not required. ++ * @return An SSL object reference. Use SSL.handshakeStatus() to check ++ * if a handshake succeeded. ++ */ ++ public SSL connect(Socket s, byte[] session_id) ++ { ++ int client_fd = axtlsj.getFd(s); ++ byte sess_id_size = (byte)(session_id != null ? ++ session_id.length : 0); ++ return new SSL(axtlsj.ssl_client_new(m_ctx, client_fd, session_id, ++ sess_id_size)); ++ } ++} +diff --git a/feeds/luci/libs/luci-lib-nixio/axTLS/bindings/java/SSLReadHolder.java b/feeds/luci/libs/luci-lib-nixio/axTLS/bindings/java/SSLReadHolder.java +new file mode 100644 +index 0000000..91fd76b +--- /dev/null ++++ b/feeds/luci/libs/luci-lib-nixio/axTLS/bindings/java/SSLReadHolder.java +@@ -0,0 +1,61 @@ ++/* ++ * Copyright (c) 2007, Cameron Rich ++ * ++ * All rights reserved. ++ * ++ * Redistribution and use in source and binary forms, with or without ++ * modification, are permitted provided that the following conditions are met: ++ * ++ * * Redistributions of source code must retain the above copyright notice, ++ * this list of conditions and the following disclaimer. ++ * * 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. ++ * * Neither the name of the axTLS project nor the names of its contributors ++ * may be used to endorse or promote products derived from this software ++ * without specific prior written permission. ++ * ++ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ++ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT ++ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR ++ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR ++ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, ++ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, ++ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR ++ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF ++ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING ++ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS ++ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ++ */ ++ ++/* ++ * A wrapper around the unmanaged interface to give a semi-decent Java API ++ */ ++ ++package axTLSj; ++ ++/** ++ * @class SSLReadHolder ++ * @ingroup java_api ++ * @brief A holder for data read in an SSL read. ++ */ ++public class SSLReadHolder ++{ ++ /** ++ * @brief Contruct a new read holder object. ++ */ ++ public SSLReadHolder() ++ { ++ m_buf = null; ++ } ++ ++ /** ++ * @brief Retrieve the reference to the read data. ++ */ ++ public byte[] getData() ++ { ++ return m_buf; ++ } ++ ++ private byte[] m_buf; ++} +diff --git a/feeds/luci/libs/luci-lib-nixio/axTLS/bindings/java/SSLServer.java b/feeds/luci/libs/luci-lib-nixio/axTLS/bindings/java/SSLServer.java +new file mode 100644 +index 0000000..514ccb0 +--- /dev/null ++++ b/feeds/luci/libs/luci-lib-nixio/axTLS/bindings/java/SSLServer.java +@@ -0,0 +1,72 @@ ++/* ++ * Copyright (c) 2007, Cameron Rich ++ * ++ * All rights reserved. ++ * ++ * Redistribution and use in source and binary forms, with or without ++ * modification, are permitted provided that the following conditions are met: ++ * ++ * * Redistributions of source code must retain the above copyright notice, ++ * this list of conditions and the following disclaimer. ++ * * 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. ++ * * Neither the name of the axTLS project nor the names of its contributors ++ * may be used to endorse or promote products derived from this software ++ * without specific prior written permission. ++ * ++ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ++ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT ++ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR ++ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR ++ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, ++ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, ++ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR ++ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF ++ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING ++ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS ++ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ++ */ ++ ++/* ++ * A wrapper around the unmanaged interface to give a semi-decent Java API ++ */ ++ ++package axTLSj; ++ ++import java.net.*; ++ ++/** ++ * @class SSLServer ++ * @ingroup java_api ++ * @brief The server context. ++ * ++ * All server connections are started within a server context. ++ */ ++public class SSLServer extends SSLCTX ++{ ++ /** ++ * @brief Start a new server context. ++ * ++ * @see SSLCTX for details. ++ */ ++ public SSLServer(int options, int num_sessions) ++ { ++ super(options, num_sessions); ++ } ++ ++ /** ++ * @brief Establish a new SSL connection to an SSL client. ++ * ++ * It is up to the application to establish the initial socket connection. ++ * ++ * Call dispose() when the connection is to be removed. ++ * @param s [in] A reference to a Socket object. ++ * @return An SSL object reference. ++ */ ++ public SSL connect(Socket s) ++ { ++ int client_fd = axtlsj.getFd(s); ++ return new SSL(axtlsj.ssl_server_new(m_ctx, client_fd)); ++ } ++} +diff --git a/feeds/luci/libs/luci-lib-nixio/axTLS/bindings/java/SSLUtil.java b/feeds/luci/libs/luci-lib-nixio/axTLS/bindings/java/SSLUtil.java +new file mode 100644 +index 0000000..3d53de5 +--- /dev/null ++++ b/feeds/luci/libs/luci-lib-nixio/axTLS/bindings/java/SSLUtil.java +@@ -0,0 +1,116 @@ ++/* ++ * Copyright (c) 2007, Cameron Rich ++ * ++ * All rights reserved. ++ * ++ * Redistribution and use in source and binary forms, with or without ++ * modification, are permitted provided that the following conditions are met: ++ * ++ * * Redistributions of source code must retain the above copyright notice, ++ * this list of conditions and the following disclaimer. ++ * * 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. ++ * * Neither the name of the axTLS project nor the names of its contributors ++ * may be used to endorse or promote products derived from this software ++ * without specific prior written permission. ++ * ++ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ++ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT ++ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR ++ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR ++ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, ++ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, ++ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR ++ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF ++ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING ++ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS ++ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ++ */ ++ ++/* ++ * A wrapper around the unmanaged interface to give a semi-decent Java API ++ */ ++ ++package axTLSj; ++ ++import java.io.*; ++import java.util.*; ++ ++/** ++ * @class SSLUtil ++ * @ingroup java_api ++ * @brief Some global helper functions. ++ * ++ */ ++public class SSLUtil ++{ ++ /** ++ * @brief Load up the ddl/shared library ++ */ ++ static ++ { ++ System.loadLibrary("axtlsj"); ++ } ++ ++ /** ++ * @brief Return the build mode of the axTLS project. ++ * @return The build mode is one of: ++ * - SSL_BUILD_SERVER_ONLY ++ * - SSL_BUILD_ENABLE_VERIFICATION ++ * - SSL_BUILD_ENABLE_CLIENT ++ * - SSL_BUILD_FULL_MODE ++ */ ++ public static int buildMode() ++ { ++ return axtlsj.ssl_get_config(axtlsj.SSL_BUILD_MODE); ++ } ++ ++ /** ++ * @brief Return the number of chained certificates that the client/server ++ * supports. ++ * @return The number of supported client/server certificates. ++ */ ++ public static int maxCerts() ++ { ++ return axtlsj.ssl_get_config(axtlsj.SSL_MAX_CERT_CFG_OFFSET); ++ } ++ ++ /** ++ * @brief Return the number of CA certificates that the client/server ++ * supports. ++ * @return The number of supported CA certificates. ++ */ ++ public static int maxCACerts() ++ { ++ return axtlsj.ssl_get_config(axtlsj.SSL_MAX_CA_CERT_CFG_OFFSET); ++ } ++ ++ /** ++ * @brief Indicate if PEM is supported. ++ * @return true if PEM supported. ++ */ ++ public static boolean hasPEM() ++ { ++ return axtlsj.ssl_get_config(axtlsj.SSL_HAS_PEM) > 0 ? true : false; ++ } ++ ++ /** ++ * @brief Display the text string of the error. ++ * @param error_code [in] The integer error code. ++ * @see ssl.h for the error code list. ++ */ ++ public static void displayError(int error_code) ++ { ++ axtlsj.ssl_display_error(error_code); ++ } ++ ++ /** ++ * @brief Return the version of the axTLS project. ++ */ ++ public static String version() ++ { ++ return axtlsj.ssl_version(); ++ } ++} ++ +diff --git a/feeds/luci/libs/luci-lib-nixio/axTLS/bindings/lua/Makefile b/feeds/luci/libs/luci-lib-nixio/axTLS/bindings/lua/Makefile +new file mode 100644 +index 0000000..daacf92 +--- /dev/null ++++ b/feeds/luci/libs/luci-lib-nixio/axTLS/bindings/lua/Makefile +@@ -0,0 +1,67 @@ ++# ++# Copyright (c) 2007, Cameron Rich ++# ++# All rights reserved. ++# ++# Redistribution and use in source and binary forms, with or without ++# modification, are permitted provided that the following conditions are met: ++# ++# * Redistributions of source code must retain the above copyright notice, ++# this list of conditions and the following disclaimer. ++# * 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. ++# * Neither the name of the axTLS project nor the names of its ++# contributors may be used to endorse or promote products derived ++# from this software without specific prior written permission. ++# ++# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ++# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT ++# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR ++# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR ++# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, ++# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED ++# TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, ++# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY ++# OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING ++# NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF ++# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ++# ++ ++AXTLS_HOME=../.. ++ ++include $(AXTLS_HOME)/config/.config ++include $(AXTLS_HOME)/config/makefile.conf ++ ++all: lib ++ ++ ++ifdef CONFIG_PLATFORM_WIN32 ++TARGET=$(AXTLS_HOME)/$(STAGE)/axtlsl.dll ++else ++TARGET=$(CONFIG_LUA_CORE)/lib/lua/5.1/axtlsl.so ++endif ++ ++ifneq ($(MAKECMDGOALS), clean) ++ ++lib: $(TARGET) ++OBJ:=axTLSl_wrap.o ++include $(AXTLS_HOME)/config/makefile.post ++ ++# there are a few static functions that aren't used ++CFLAGS += -funit-at-a-time ++ ++$(TARGET) : $(OBJ) ++ $(LD) $(LDFLAGS) $(LDSHARED) -o $@ $^ -L$(AXTLS_HOME)/$(STAGE) -L$(CONFIG_LUA_CORE)/lib -laxtls -llua ++ ++CFLAGS += -I $(CONFIG_LUA_CORE)/include ++else ++CFLAGS += /I"`cygpath -w $(CONFIG_LUA_CORE)/include`" ++LDFLAGS += axtls.lib /libpath:"$(AXTLS_HOME)/$(STAGE)" ++ ++$(TARGET) : $(OBJ) ++ $(LD) $(LDFLAGS) $(LDSHARED) /out:$@ $(OBJ) ++endif # WIN32 ++ ++clean:: ++ @rm -f $(TARGET) *.i axTLSl* .depend +diff --git a/feeds/luci/libs/luci-lib-nixio/axTLS/bindings/perl/Makefile b/feeds/luci/libs/luci-lib-nixio/axTLS/bindings/perl/Makefile +new file mode 100644 +index 0000000..92fd3c5 +--- /dev/null ++++ b/feeds/luci/libs/luci-lib-nixio/axTLS/bindings/perl/Makefile +@@ -0,0 +1,91 @@ ++# ++# Copyright (c) 2007, Cameron Rich ++# ++# All rights reserved. ++# ++# Redistribution and use in source and binary forms, with or without ++# modification, are permitted provided that the following conditions are met: ++# ++# * Redistributions of source code must retain the above copyright notice, ++# this list of conditions and the following disclaimer. ++# * 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. ++# * Neither the name of the axTLS project nor the names of its ++# contributors may be used to endorse or promote products derived ++# from this software without specific prior written permission. ++# ++# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ++# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT ++# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR ++# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR ++# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, ++# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED ++# TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, ++# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY ++# OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING ++# NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF ++# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ++# ++ ++AXTLS_HOME=../.. ++ ++include $(AXTLS_HOME)/config/.config ++include $(AXTLS_HOME)/config/makefile.conf ++ ++all: lib ++ ++ifdef CONFIG_PLATFORM_WIN32 ++TARGET=$(AXTLS_HOME)/$(STAGE)/axtlsp.dll ++else ++TARGET=$(AXTLS_HOME)/$(STAGE)/libaxtlsp.so ++endif ++ ++ifneq ($(MAKECMDGOALS), clean) ++ ++ifdef CONFIG_PLATFORM_WIN32 ++PERL5_CORE:=$(shell cygpath -w "$(CONFIG_PERL_CORE)") ++else ++PERL5_CORE= $(shell perl -e 'use Config; print $$Config{archlib};')/CORE ++endif ++ ++all: test_perl ++ ++test_perl: ++ @if ! [ -d "$(PERL5_CORE)" ]; then \ ++ echo "*** Error: Perl not installed at $(CONFIG_PERL_CORE) - go to " \ ++ "http://www.cpan.org/authors/id/G/GR/GRAHAMC/SiePerl-5.8.0-bin-1.0-Win32.INSTALL.exe" && exit 1; \ ++ fi ++ ++endif ++ ++lib: $(TARGET) ++OBJ:=axTLSp_wrap.o ++include $(AXTLS_HOME)/config/makefile.post ++ ++ifndef CONFIG_PLATFORM_WIN32 # Linux/Unix/Cygwin ++ ++# ++# Could have used libperl.a, but it increases the library to over 1MB, so just ++# use libperl.so. But this needs to be in the shared library path for things to ++# work. ++# ++$(TARGET) : $(OBJ) ++ $(LD) $(LDFLAGS) -L$(AXTLS_HOME)/$(STAGE) -L$(PERL5_CORE) $(LDSHARED) -o $@ $(OBJ) -laxtls -lperl ++ifdef CONFIG_PLATFORM_CYGWIN ++ cd $(AXTLS_HOME)/$(STAGE); ln -sf $(notdir $@) axtlsp.dll ++endif ++ @install axtlsp.pm $(AXTLS_HOME)/$(STAGE) ++ ++CFLAGS += -D_GNU_SOURCE -I$(PERL5_CORE) ++else ++CFLAGS += /I"$(PERL5_CORE)" ++LDFLAGS += $(CONFIG_PERL_LIB) /libpath:"$(PERL5_CORE)" axtls.lib /libpath:"$(AXTLS_HOME)/$(STAGE)" ++ ++$(TARGET) : $(OBJ) ++ $(LD) $(LDFLAGS) $(LDSHARED) /out:$@ $(OBJ) ++ install axtlsp.pm $(AXTLS_HOME)/$(STAGE) ++endif # WIN32 ++ ++clean:: ++ @rm -f $(TARGET) axtls* *.i axTLSp* *.c .depend $(AXTLS_HOME)/$(STAGE)/axtlsp.pm +diff --git a/feeds/luci/libs/luci-lib-nixio/axTLS/bindings/vbnet/Makefile b/feeds/luci/libs/luci-lib-nixio/axTLS/bindings/vbnet/Makefile +new file mode 100644 +index 0000000..7da60d0 +--- /dev/null ++++ b/feeds/luci/libs/luci-lib-nixio/axTLS/bindings/vbnet/Makefile +@@ -0,0 +1,35 @@ ++# ++# Copyright (c) 2007, Cameron Rich ++# ++# All rights reserved. ++# ++# Redistribution and use in source and binary forms, with or without ++# modification, are permitted provided that the following conditions are met: ++# ++# * Redistributions of source code must retain the above copyright notice, ++# this list of conditions and the following disclaimer. ++# * 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. ++# * Neither the name of the axTLS project nor the names of its ++# contributors may be used to endorse or promote products derived ++# from this software without specific prior written permission. ++# ++# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ++# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT ++# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR ++# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR ++# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, ++# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED ++# TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, ++# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY ++# OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING ++# NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF ++# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ++# ++ ++include ../../config/.config ++include ../../config/makefile.conf ++ ++clean:: ++ @rm -f axssl* axInterface.vb +diff --git a/feeds/luci/libs/luci-lib-nixio/axTLS/bindings/vbnet/axTLSvb.vb b/feeds/luci/libs/luci-lib-nixio/axTLS/bindings/vbnet/axTLSvb.vb +new file mode 100644 +index 0000000..9388273 +--- /dev/null ++++ b/feeds/luci/libs/luci-lib-nixio/axTLS/bindings/vbnet/axTLSvb.vb +@@ -0,0 +1,200 @@ ++' ++' Copyright (c) 2007, Cameron Rich ++' ++' All rights reserved. ++' ++' Redistribution and use in source and binary forms, with or without ++' modification, are permitted provided that the following conditions are met: ++' ++' * Redistributions of source code must retain the above copyright notice, ++' this list of conditions and the following disclaimer. ++' * 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. ++' * Neither the name of the axTLS project nor the names of its ++' contributors may be used to endorse or promote products derived ++' from this software without specific prior written permission. ++' ++' THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ++' "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT ++' LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR ++' A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR ++' CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, ++' SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED ++' TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, ++' DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY ++' OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING ++' NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF ++' THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ++' ++ ++' ++' A wrapper around the unmanaged Integererface to give a semi-decent VB.NET API ++' ++ ++Imports System ++Imports System.Runtime.InteropServices ++Imports System.Net.Sockets ++Imports axTLSvb ++ ++Namespace axTLSvb ++ Public Class SSL ++ Public m_ssl As IntPtr ++ ++ Public Sub New(ByRef ip As IntPtr) ++ m_ssl = ip ++ End Sub ++ ++ Public Sub Dispose() ++ axtls.ssl_free(m_ssl) ++ End Sub ++ ++ Public Function HandshakeStatus() As Integer ++ Return axtls.ssl_handshake_status(m_ssl) ++ End Function ++ ++ Public Function GetCipherId() As Byte ++ Return axtls.ssl_get_cipher_id(m_ssl) ++ End Function ++ ++ Public Function GetSessionId() As Byte() ++ Dim ptr As IntPtr = axtls.ssl_get_session_id(m_ssl) ++ Dim sess_id_size As Integer = axtls.ssl_get_session_id_size(m_ssl) ++ Dim result(sess_id_size-1) As Byte ++ Marshal.Copy(ptr, result, 0, sess_id_size) ++ Return result ++ End Function ++ ++ Public Function GetCertificateDN(component As Integer) As String ++ Return axtls.ssl_get_cert_dn(m_ssl, component) ++ End Function ++ End Class ++ ++ Public Class SSLUtil ++ Private dummy As Integer ' need something here ++ ++ Public Shared Function BuildMode() As Integer ++ Return axtls.ssl_get_config(axtls.SSL_BUILD_MODE) ++ End Function ++ ++ Public Shared Function MaxCerts() As Integer ++ Return axtls.ssl_get_config(axtls.SSL_MAX_CERT_CFG_OFFSET) ++ End Function ++ ++ Public Shared Function MaxCACerts() As Integer ++ Return axtls.ssl_get_config(axtls.SSL_MAX_CA_CERT_CFG_OFFSET) ++ End Function ++ ++ Public Shared Function HasPEM() As Boolean ++ If axtls.ssl_get_config(axtls.SSL_HAS_PEM) > 0 Then ++ Return True ++ Else ++ Return False ++ End If ++ End Function ++ ++ Public Shared Sub DisplayError(ByVal error_code As Integer) ++ axtls.ssl_display_error(error_code) ++ End Sub ++ ++ Public Shared Function Version() As String ++ Return axtls.ssl_version() ++ End Function ++ End Class ++ ++ Public Class SSLCTX ++ Protected m_ctx As IntPtr ++ ++ Protected Sub New(ByVal options As Integer, _ ++ ByVal num_sessions As Integer) ++ m_ctx = axtls.ssl_ctx_new(options, num_sessions) ++ End Sub ++ ++ Public Sub Dispose() ++ axtls.ssl_ctx_free(m_ctx) ++ End Sub ++ ++ Public Function Read(ByVal ssl As SSL, ByRef in_data As Byte()) As Integer ++ Dim ptr As IntPtr = IntPtr.Zero ++ Dim ret as Integer = axtls.ssl_read(ssl.m_ssl, ptr) ++ ++ If ret > axtls.SSL_OK Then ++ ReDim in_data(ret) ++ Marshal.Copy(ptr, in_data, 0, ret) ++ Else ++ in_data = Nothing ++ End If ++ ++ Return ret ++ End Function ++ ++ Public Function Write(ByVal ssl As SSL, _ ++ ByVal data As Byte(), len As Integer) As Integer ++ Return axtls.ssl_write(ssl.m_ssl, data, len) ++ End Function ++ ++ Public Function Find(ByVal s As Socket) As SSL ++ Dim client_fd As Integer = s.Handle.ToInt32() ++ Return New SSL(axtls.ssl_find(m_ctx, client_fd)) ++ End Function ++ ++ Public Function VerifyCert(ByVal ssl As SSL) As Integer ++ Return axtls.ssl_verify_cert(ssl.m_ssl) ++ End Function ++ ++ Public Function Renegotiate(ByVal ssl As SSL) As Integer ++ Return axtls.ssl_renegotiate(ssl.m_ssl) ++ End Function ++ ++ Public Function ObjLoad(ByVal obj_type As Integer, _ ++ ByVal filename As String, _ ++ password As String) As Integer ++ Return axtls.ssl_obj_load(m_ctx, obj_type, filename, password) ++ End Function ++ ++ Public Function ObjLoad(ByVal obj_type As Integer, _ ++ ByVal data As Byte(), ByVal len As Integer, _ ++ password As String) As Integer ++ Return axtls.ssl_obj_memory_load( _ ++ m_ctx, obj_type, data, len, password) ++ End Function ++ End Class ++ ++ Public Class SSLServer ++ Inherits SSLCTX ++ ++ Public Sub New(ByVal options As Integer, _ ++ ByVal num_sessions As Integer) ++ MyBase.New(options, num_sessions) ++ End Sub ++ ++ Public Function Connect(ByVal s As Socket) As SSL ++ Dim client_fd As Integer = s.Handle.ToInt32() ++ Return New SSL(axtls.ssl_server_new(m_ctx, client_fd)) ++ End Function ++ End Class ++ ++ Public Class SSLClient ++ Inherits SSLCTX ++ ++ Public Sub New(ByVal options As Integer, _ ++ ByVal num_sessions As Integer) ++ MyBase.New(options, num_sessions) ++ End Sub ++ ++ Public Function Connect(ByVal s As Socket, _ ++ ByVal session_id As Byte()) As SSL ++ Dim client_fd As Integer = s.Handle.ToInt32() ++ Dim sess_id_size As Byte ++ If session_id is Nothing Then ++ sess_id_size = 0 ++ Else ++ sess_id_size = session_id.Length ++ End If ++ ++ Return New SSL(axtls.ssl_client_new(m_ctx, client_fd, session_id, _ ++ sess_id_size)) ++ End Function ++ ++ End Class ++End Namespace +diff --git a/feeds/luci/libs/luci-lib-nixio/axTLS/config/.config b/feeds/luci/libs/luci-lib-nixio/axTLS/config/.config +new file mode 100644 +index 0000000..46cd061 +--- /dev/null ++++ b/feeds/luci/libs/luci-lib-nixio/axTLS/config/.config +@@ -0,0 +1,112 @@ ++# ++# Automatically generated make config: don't edit ++# ++HAVE_DOT_CONFIG=y ++CONFIG_PLATFORM_LINUX=y ++# CONFIG_PLATFORM_CYGWIN is not set ++# CONFIG_PLATFORM_WIN32 is not set ++ ++# ++# General Configuration ++# ++PREFIX="/usr" ++# CONFIG_DEBUG is not set ++CONFIG_STRIP_UNWANTED_SECTIONS=y ++# CONFIG_VISUAL_STUDIO_7_0 is not set ++# CONFIG_VISUAL_STUDIO_8_0 is not set ++CONFIG_VISUAL_STUDIO_7_0_BASE="" ++CONFIG_VISUAL_STUDIO_8_0_BASE="" ++CONFIG_EXTRA_CFLAGS_OPTIONS="-fpic" ++CONFIG_EXTRA_LDFLAGS_OPTIONS="" ++ ++# ++# SSL Library ++# ++# CONFIG_SSL_SERVER_ONLY is not set ++# CONFIG_SSL_CERT_VERIFICATION is not set ++# CONFIG_SSL_ENABLE_CLIENT is not set ++CONFIG_SSL_FULL_MODE=y ++# CONFIG_SSL_SKELETON_MODE is not set ++# CONFIG_SSL_PROT_LOW is not set ++CONFIG_SSL_PROT_MEDIUM=y ++# CONFIG_SSL_PROT_HIGH is not set ++# CONFIG_SSL_USE_DEFAULT_KEY is not set ++CONFIG_SSL_PRIVATE_KEY_LOCATION="/etc/nixio/rsa_main.der" ++CONFIG_SSL_PRIVATE_KEY_PASSWORD="" ++CONFIG_SSL_X509_CERT_LOCATION="" ++# CONFIG_SSL_GENERATE_X509_CERT is not set ++CONFIG_SSL_X509_COMMON_NAME="" ++CONFIG_SSL_X509_ORGANIZATION_NAME="" ++CONFIG_SSL_X509_ORGANIZATION_UNIT_NAME="" ++# CONFIG_SSL_ENABLE_V23_HANDSHAKE is not set ++# CONFIG_SSL_HAS_PEM is not set ++# CONFIG_SSL_USE_PKCS12 is not set ++CONFIG_SSL_EXPIRY_TIME=24 ++CONFIG_X509_MAX_CA_CERTS=4 ++CONFIG_SSL_MAX_CERTS=2 ++CONFIG_SSL_CTX_MUTEXING=y ++CONFIG_USE_DEV_URANDOM=y ++# CONFIG_WIN32_USE_CRYPTO_LIB is not set ++# CONFIG_OPENSSL_COMPATIBLE is not set ++# CONFIG_PERFORMANCE_TESTING is not set ++# CONFIG_SSL_TEST is not set ++# CONFIG_AXHTTPD is not set ++# CONFIG_HTTP_STATIC_BUILD is not set ++CONFIG_HTTP_PORT=0 ++CONFIG_HTTP_HTTPS_PORT=0 ++CONFIG_HTTP_SESSION_CACHE_SIZE=0 ++CONFIG_HTTP_WEBROOT="" ++CONFIG_HTTP_TIMEOUT=0 ++# CONFIG_HTTP_HAS_CGI is not set ++CONFIG_HTTP_CGI_EXTENSIONS="" ++# CONFIG_HTTP_ENABLE_LUA is not set ++CONFIG_HTTP_LUA_PREFIX="" ++CONFIG_HTTP_LUA_CGI_LAUNCHER="" ++# CONFIG_HTTP_BUILD_LUA is not set ++# CONFIG_HTTP_DIRECTORIES is not set ++# CONFIG_HTTP_HAS_AUTHORIZATION is not set ++# CONFIG_HTTP_HAS_IPV6 is not set ++# CONFIG_HTTP_ENABLE_DIFFERENT_USER is not set ++CONFIG_HTTP_USER="" ++# CONFIG_HTTP_VERBOSE is not set ++# CONFIG_HTTP_IS_DAEMON is not set ++ ++# ++# Language Bindings ++# ++# CONFIG_BINDINGS is not set ++# CONFIG_CSHARP_BINDINGS is not set ++# CONFIG_VBNET_BINDINGS is not set ++CONFIG_DOT_NET_FRAMEWORK_BASE="" ++# CONFIG_JAVA_BINDINGS is not set ++CONFIG_JAVA_HOME="" ++# CONFIG_PERL_BINDINGS is not set ++CONFIG_PERL_CORE="" ++CONFIG_PERL_LIB="" ++# CONFIG_LUA_BINDINGS is not set ++CONFIG_LUA_CORE="" ++ ++# ++# Samples ++# ++# CONFIG_SAMPLES is not set ++# CONFIG_C_SAMPLES is not set ++# CONFIG_CSHARP_SAMPLES is not set ++# CONFIG_VBNET_SAMPLES is not set ++# CONFIG_JAVA_SAMPLES is not set ++# CONFIG_PERL_SAMPLES is not set ++# CONFIG_LUA_SAMPLES is not set ++ ++# ++# BigInt Options ++# ++# CONFIG_BIGINT_CLASSICAL is not set ++# CONFIG_BIGINT_MONTGOMERY is not set ++CONFIG_BIGINT_BARRETT=y ++CONFIG_BIGINT_CRT=y ++# CONFIG_BIGINT_KARATSUBA is not set ++MUL_KARATSUBA_THRESH=0 ++SQU_KARATSUBA_THRESH=0 ++CONFIG_BIGINT_SLIDING_WINDOW=y ++CONFIG_BIGINT_SQUARE=y ++# CONFIG_BIGINT_CHECK_ON is not set +diff --git a/feeds/luci/libs/luci-lib-nixio/axTLS/config/Config.in b/feeds/luci/libs/luci-lib-nixio/axTLS/config/Config.in +new file mode 100644 +index 0000000..dc40756 +--- /dev/null ++++ b/feeds/luci/libs/luci-lib-nixio/axTLS/config/Config.in +@@ -0,0 +1,114 @@ ++# ++# For a description of the syntax of this configuration file, ++# see scripts/config/Kconfig-language.txt ++# ++ ++mainmenu "axTLS Configuration" ++ ++config HAVE_DOT_CONFIG ++ bool ++ default y ++ ++choice ++ prompt "Platform" ++ default CONFIG_PLATFORM_LINUX ++ ++config CONFIG_PLATFORM_LINUX ++ bool "Linux" ++ ++config CONFIG_PLATFORM_CYGWIN ++ bool "Cygwin" ++ ++config CONFIG_PLATFORM_WIN32 ++ bool "Win32" ++ ++endchoice ++ ++menu "General Configuration" ++ ++config PREFIX ++ string "axTLS installation prefix" ++ depends on !CONFIG_PLATFORM_WIN32 ++ default "/usr/local" ++ help ++ Define your directory to install axTLS files/subdirs in. ++ ++config CONFIG_DEBUG ++ bool "Build axTLS with Debugging symbols" ++ default n ++ help ++ Say Y here if you wish to compile axTLS with debugging symbols. ++ This will allow you to use a debugger to examine axTLS internals. ++ This increases the size of the binary considerably and should only be ++ used when doing development. ++ If you are doing development and want to debug axTLS, answer Y. ++ ++ Most people should answer N. ++ ++config CONFIG_STRIP_UNWANTED_SECTIONS ++ depends on !CONFIG_PLATFORM_WIN32 && !CONFIG_DEBUG ++ bool "Strip unwanted sections from elf binaries" ++ default y ++ help ++ Strip unwanted sections from the resulting binaries ++ ++menu "Microsoft Compiler Options" ++depends on CONFIG_PLATFORM_WIN32 ++ ++choice ++ prompt "Compiler" ++ depends on CONFIG_PLATFORM_WIN32 ++ default CONFIG_VISUAL_STUDIO_7_0 ++ ++config CONFIG_VISUAL_STUDIO_7_0 ++ bool "Visual Studio 7.0 (2003)" ++ help ++ Use Microsoft's Visual Studio 2003 platform. ++ ++config CONFIG_VISUAL_STUDIO_8_0 ++ bool "Visual Studio 8.0 (2005)" ++ help ++ Use Microsoft's Visual Studio 2005 platform. ++ ++endchoice ++ ++config CONFIG_VISUAL_STUDIO_7_0_BASE ++ string "Base" ++ depends on CONFIG_VISUAL_STUDIO_7_0 ++ default "c:\\Program Files\\Microsoft Visual Studio .NET 2003" ++ ++config CONFIG_VISUAL_STUDIO_8_0_BASE ++ string "Base" ++ depends on CONFIG_VISUAL_STUDIO_8_0 ++ default "c:\\Program Files\\Microsoft Visual Studio 8" ++ ++endmenu ++ ++config CONFIG_EXTRA_CFLAGS_OPTIONS ++ string "Any extra CFLAGS options for the compiler?" ++ help ++ Do you want to pass any extra CFLAGS options to the compiler as ++ you build axTLS? If so, this is the option for you... For ++ example, if you want to add some simple compiler switches (like ++ -march=i686), or check for warnings using -Werror, just those ++ options here. ++ ++config CONFIG_EXTRA_LDFLAGS_OPTIONS ++ string "Any extra LDFLAGS options for the compiler?" ++ help ++ Do you want to pass any extra LDFLAGS options to the compiler? ++ ++endmenu ++ ++source ssl/Config.in ++config CONFIG_AXHTTPD ++ bool "Enable HTTP/HTTPS Web Server" ++ default y ++ help ++ Build the AXHTTPD web server ++ ++source httpd/Config.in ++source bindings/Config.in ++source samples/Config.in ++source ssl/BigIntConfig.in ++ +diff --git a/feeds/luci/libs/luci-lib-nixio/axTLS/config/JMeter.jmx b/feeds/luci/libs/luci-lib-nixio/axTLS/config/JMeter.jmx +new file mode 100755 +index 0000000..f62c03f +--- /dev/null ++++ b/feeds/luci/libs/luci-lib-nixio/axTLS/config/JMeter.jmx +@@ -0,0 +1,247 @@ ++ ++ ++ ++ ++ ++ ++ ++ true ++ false ++ ++ ++ ++ ++ 1152004173000 ++ ++ ++ 16 ++ false ++ ++ 10 ++ false ++ ++ 1152004173000 ++ stopthread ++ 0 ++ ++ ++ ++ /index.html ++ GET ++ true ++ ++ true ++ 80 ++ ++ ++ ++ ++ ++ false ++ 127.0.0.1 ++ ++ false ++ ++ ++ ++ ++ 1152004173000 ++ ++ ++ 16 ++ false ++ ++ 10 ++ false ++ ++ 1152004173000 ++ stopthread ++ 0 ++ ++ ++ ++ /index.html ++ GET ++ true ++ HTTPS ++ true ++ 443 ++ ++ ++ ++ ++ ++ false ++ 127.0.0.1 ++ ++ false ++ ++ ++ ++ ++ 1152004173000 ++ ++ ++ 16 ++ false ++ ++ 10 ++ false ++ ++ 1152004173000 ++ stopthread ++ 0 ++ ++ ++ ++ /index.html ++ GET ++ true ++ HTTPS ++ true ++ 2443 ++ ++ ++ ++ ++ ++ false ++ 127.0.0.1 ++ ++ false ++ ++ ++ ++ ++ 1152004173000 ++ ++ ++ 16 ++ false ++ ++ 10 ++ false ++ ++ 1152004173000 ++ stopthread ++ 0 ++ ++ ++ ++ /index.html ++ GET ++ true ++ HTTPS ++ true ++ 3443 ++ ++ ++ ++ ++ ++ false ++ 127.0.0.1 ++ ++ false ++ ++ ++ ++ ++ 1152004173000 ++ ++ ++ 16 ++ false ++ ++ 10 ++ false ++ ++ 1152004173000 ++ stopthread ++ 0 ++ ++ ++ ++ /index.html ++ GET ++ true ++ HTTPS ++ true ++ 1443 ++ ++ ++ ++ ++ ++ false ++ 127.0.0.1 ++ ++ false ++ ++ ++ ++ ++ ++ ++ ++ true ++ true ++ true ++ ++ true ++ true ++ true ++ true ++ false ++ true ++ true ++ false ++ false ++ false ++ false ++ false ++ false ++ false ++ false ++ 0 ++ ++ saveConfig ++ ++ ++ false ++ ++ ++ ++ ++ ++ ++ true ++ true ++ true ++ ++ true ++ true ++ true ++ true ++ false ++ true ++ true ++ false ++ false ++ false ++ false ++ false ++ false ++ false ++ false ++ 0 ++ ++ saveConfig ++ ++ ++ false ++ ++ ++ ++ ++ +diff --git a/feeds/luci/libs/luci-lib-nixio/axTLS/config/Rules.mak b/feeds/luci/libs/luci-lib-nixio/axTLS/config/Rules.mak +new file mode 100644 +index 0000000..c0308da +--- /dev/null ++++ b/feeds/luci/libs/luci-lib-nixio/axTLS/config/Rules.mak +@@ -0,0 +1,220 @@ ++# Rules.make for busybox ++# ++# Copyright (C) 1999-2005 by Erik Andersen ++# ++# Licensed under GPLv2, see the file LICENSE in this tarball for details. ++# ++ ++# Pull in the user's busybox configuration ++ifeq ($(filter $(noconfig_targets),$(MAKECMDGOALS)),) ++-include $(top_builddir)/.config ++endif ++ ++#-------------------------------------------------------- ++PROG := busybox ++MAJOR_VERSION :=1 ++MINOR_VERSION :=1 ++SUBLEVEL_VERSION:=0 ++EXTRAVERSION := ++VERSION :=$(MAJOR_VERSION).$(MINOR_VERSION).$(SUBLEVEL_VERSION)$(EXTRAVERSION) ++BUILDTIME := $(shell TZ=UTC date -u "+%Y.%m.%d-%H:%M%z") ++ ++ ++#-------------------------------------------------------- ++# With a modern GNU make(1) (highly recommended, that's what all the ++# developers use), all of the following configuration values can be ++# overridden at the command line. For example: ++# make CROSS=powerpc-linux- top_srcdir="$HOME/busybox" PREFIX=/mnt/app ++#-------------------------------------------------------- ++ ++# If you are running a cross compiler, you will want to set 'CROSS' ++# to something more interesting... Target architecture is determined ++# by asking the CC compiler what arch it compiles things for, so unless ++# your compiler is broken, you should not need to specify TARGET_ARCH ++CROSS =$(subst ",, $(strip $(CROSS_COMPILER_PREFIX))) ++CC = $(CROSS)gcc ++AR = $(CROSS)ar ++AS = $(CROSS)as ++LD = $(CROSS)ld ++NM = $(CROSS)nm ++STRIP = $(CROSS)strip ++CPP = $(CC) -E ++# MAKEFILES = $(top_builddir)/.config ++RM = rm ++RM_F = $(RM) -f ++LN = ln ++LN_S = $(LN) -s ++MKDIR = mkdir ++MKDIR_P = $(MKDIR) -p ++MV = mv ++CP = cp ++ ++ ++# What OS are you compiling busybox for? This allows you to include ++# OS specific things, syscall overrides, etc. ++TARGET_OS=linux ++ ++# Select the compiler needed to build binaries for your development system ++HOSTCC = gcc ++HOSTCFLAGS= -Wall -Wstrict-prototypes -O2 -fomit-frame-pointer ++ ++# Ensure consistent sort order, 'gcc -print-search-dirs' behavior, etc. ++LC_ALL:= C ++ ++# If you want to add some simple compiler switches (like -march=i686), ++# especially from the command line, use this instead of CFLAGS directly. ++# For optimization overrides, it's better still to set OPTIMIZATION. ++CFLAGS_EXTRA=$(subst ",, $(strip $(EXTRA_CFLAGS_OPTIONS))) ++ ++# To compile vs some other alternative libc, you may need to use/adjust ++# the following lines to meet your needs... ++# ++# If you are using Red Hat 6.x with the compatible RPMs (for developing under ++# Red Hat 5.x and glibc 2.0) uncomment the following. Be sure to read about ++# using the compatible RPMs (compat-*) at http://www.redhat.com ! ++#LIBCDIR:=/usr/i386-glibc20-linux ++# ++# For other libraries, you are on your own. But these may (or may not) help... ++#LDFLAGS+=-nostdlib ++#LIBRARIES:=$(LIBCDIR)/lib/libc.a -lgcc ++#CROSS_CFLAGS+=-nostdinc -I$(LIBCDIR)/include -I$(GCCINCDIR) -funsigned-char ++#GCCINCDIR:=$(shell gcc -print-search-dirs | sed -ne "s/install: \(.*\)/\1include/gp") ++ ++WARNINGS=-Wall -Wstrict-prototypes -Wshadow ++CFLAGS=-I$(top_builddir)/include -I$(top_srcdir)/include -I$(srcdir) ++ARFLAGS=cru ++ ++ ++# gcc centric. Perhaps fiddle with findstring gcc,$(CC) for the rest ++# get the CC MAJOR/MINOR version ++CC_MAJOR:=$(shell printf "%02d" $(shell echo __GNUC__ | $(CC) -E -xc - | tail -n 1)) ++CC_MINOR:=$(shell printf "%02d" $(shell echo __GNUC_MINOR__ | $(CC) -E -xc - | tail -n 1)) ++ ++#-------------------------------------------------------- ++export VERSION BUILDTIME HOSTCC HOSTCFLAGS CROSS CC AR AS LD NM STRIP CPP ++ifeq ($(strip $(TARGET_ARCH)),) ++TARGET_ARCH:=$(shell $(CC) -dumpmachine | sed -e s'/-.*//' \ ++ -e 's/i.86/i386/' \ ++ -e 's/sparc.*/sparc/' \ ++ -e 's/arm.*/arm/g' \ ++ -e 's/m68k.*/m68k/' \ ++ -e 's/ppc/powerpc/g' \ ++ -e 's/v850.*/v850/g' \ ++ -e 's/sh[234]/sh/' \ ++ -e 's/mips-.*/mips/' \ ++ -e 's/mipsel-.*/mipsel/' \ ++ -e 's/cris.*/cris/' \ ++ ) ++endif ++ ++# A nifty macro to make testing gcc features easier ++check_gcc=$(shell \ ++ if [ "$(1)" != "" ]; then \ ++ if $(CC) $(1) -S -o /dev/null -xc /dev/null > /dev/null 2>&1; \ ++ then echo "$(1)"; else echo "$(2)"; fi \ ++ fi) ++ ++# Setup some shortcuts so that silent mode is silent like it should be ++ifeq ($(subst s,,$(MAKEFLAGS)),$(MAKEFLAGS)) ++export MAKE_IS_SILENT=n ++SECHO=@echo ++else ++export MAKE_IS_SILENT=y ++SECHO=-@false ++endif ++ ++CFLAGS+=$(call check_gcc,-funsigned-char,) ++ ++#-------------------------------------------------------- ++# Arch specific compiler optimization stuff should go here. ++# Unless you want to override the defaults, do not set anything ++# for OPTIMIZATION... ++ ++# use '-Os' optimization if available, else use -O2 ++OPTIMIZATION:=$(call check_gcc,-Os,-O2) ++ ++# Some nice architecture specific optimizations ++ifeq ($(strip $(TARGET_ARCH)),arm) ++ OPTIMIZATION+=-fstrict-aliasing ++endif ++ifeq ($(strip $(TARGET_ARCH)),i386) ++ OPTIMIZATION+=$(call check_gcc,-march=i386,) ++ OPTIMIZATION+=$(call check_gcc,-mpreferred-stack-boundary=2,) ++ OPTIMIZATION+=$(call check_gcc,-falign-functions=0 -falign-jumps=0 -falign-loops=0,\ ++ -malign-functions=0 -malign-jumps=0 -malign-loops=0) ++endif ++OPTIMIZATIONS:=$(OPTIMIZATION) -fomit-frame-pointer ++ ++# ++#-------------------------------------------------------- ++# If you're going to do a lot of builds with a non-vanilla configuration, ++# it makes sense to adjust parameters above, so you can type "make" ++# by itself, instead of following it by the same half-dozen overrides ++# every time. The stuff below, on the other hand, is probably less ++# prone to casual user adjustment. ++# ++ ++ifeq ($(strip $(CONFIG_LFS)),y) ++ # For large file summit support ++ CFLAGS+=-D_LARGEFILE_SOURCE -D_LARGEFILE64_SOURCE -D_FILE_OFFSET_BITS=64 ++endif ++ifeq ($(strip $(CONFIG_DMALLOC)),y) ++ # For testing mem leaks with dmalloc ++ CFLAGS+=-DDMALLOC ++ LIBRARIES:=-ldmalloc ++else ++ ifeq ($(strip $(CONFIG_EFENCE)),y) ++ LIBRARIES:=-lefence ++ endif ++endif ++ifeq ($(strip $(CONFIG_DEBUG)),y) ++ CFLAGS +=$(WARNINGS) -g -D_GNU_SOURCE ++ LDFLAGS +=-Wl,-warn-common ++ STRIPCMD:=/bin/true -Not_stripping_since_we_are_debugging ++else ++ CFLAGS+=$(WARNINGS) $(OPTIMIZATIONS) -D_GNU_SOURCE -DNDEBUG ++ LDFLAGS += -Wl,-warn-common ++ STRIPCMD:=$(STRIP) -s --remove-section=.note --remove-section=.comment ++endif ++ifeq ($(strip $(CONFIG_STATIC)),y) ++ LDFLAGS += --static ++endif ++ ++ifeq ($(strip $(CONFIG_SELINUX)),y) ++ LIBRARIES += -lselinux ++endif ++ ++ifeq ($(strip $(PREFIX)),) ++ PREFIX:=`pwd`/_install ++endif ++ ++# Additional complications due to support for pristine source dir. ++# Include files in the build directory should take precedence over ++# the copy in top_srcdir, both during the compilation phase and the ++# shell script that finds the list of object files. ++# Work in progress by . ++ ++ ++OBJECTS:=$(APPLET_SOURCES:.c=.o) busybox.o usage.o applets.o ++CFLAGS += $(CROSS_CFLAGS) ++ifdef BB_INIT_SCRIPT ++ CFLAGS += -DINIT_SCRIPT='"$(BB_INIT_SCRIPT)"' ++endif ++ ++# Put user-supplied flags at the end, where they ++# have a chance of winning. ++CFLAGS += $(CFLAGS_EXTRA) ++ ++#------------------------------------------------------------ ++# Installation options ++ifeq ($(strip $(CONFIG_INSTALL_APPLET_HARDLINKS)),y) ++INSTALL_OPTS=--hardlinks ++endif ++ifeq ($(strip $(CONFIG_INSTALL_APPLET_SYMLINKS)),y) ++INSTALL_OPTS=--symlinks ++endif ++ifeq ($(strip $(CONFIG_INSTALL_APPLET_DONT)),y) ++INSTALL_OPTS= ++endif ++ ++.PHONY: dummy +diff --git a/feeds/luci/libs/luci-lib-nixio/axTLS/config/axhttpd.aip b/feeds/luci/libs/luci-lib-nixio/axTLS/config/axhttpd.aip +new file mode 100755 +index 0000000..412fe3b +--- /dev/null ++++ b/feeds/luci/libs/luci-lib-nixio/axTLS/config/axhttpd.aip +@@ -0,0 +1,136 @@ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ +diff --git a/feeds/luci/libs/luci-lib-nixio/axTLS/config/axtls.RES b/feeds/luci/libs/luci-lib-nixio/axTLS/config/axtls.RES +new file mode 100644 +index 0000000000000000000000000000000000000000..2929b3b679fddfb78bb58ebbccc5c0c4a9eb37d8 +GIT binary patch +literal 22748 +zcmeHv30##&mTzG?K4*D7Jw0!hH?QA&nx&IYC+SQlopu+K7&VE;M57o{F>Z(o7gA6}*Hq&q!t=JmYaq>@9`t*@3- +zr|PS({&mh#2qDIjfMH_tcY^lE#^*1vjEVB>CqMa%9~le1&cr(;3zCT#!@okf|D_TQ +z{~4~Lq`^+y-QAgXXRQ1cJv}{Q?AWnFqtOTp3k%_H;BO12-8I7TdV~c@ +zX7==$iXM#x(-!?lG`Jk2~{779^n&WI&i&Xvm|6ylcoW`ysCylA)(Z3=R$oCnqQ2 +z=jSK-`uap|ZLR3&=nz`1R_OJ5p;oKKAjhv#ISF0QplI$N6dHXk+tUh-RwrtkJIG6) +z&~*&5+#qE=D1w6YY`aew`UZu{NyYY6!kz60sr}fFmVIeOke`mf*}k?}=nc)n(9y$w +zdxWl8w$(56J^iAVq-DE$wqszw9V90e+j934enEbW)k0;dVLKe(EUj=NPby2TaCg!Q +zwMO#CH2d*mKN_80_;Kt(S_8*r5bB^>q1H7EZEZ8hOlocxIzxxh)piKIB#z5KYNjmw +z^gS%sBlP62mZUcHiDr(kgYxPj>B(;^^QhZa?UI{K9!S(GSqM`NE(jSR4Xhw +zUJEmhmt-l&O>&ZB_oIB(d^StRdK^2)ua=}CX>~%Y(+M*(J?rTyFTHRlSz1yyBuf=z +zcRlBZG3QV%NzRc*FSI1JmU1L%NovYdCrQt_Ci(dp_{_le8B@M`17)qLrMyYHTCQUf +z*Opq}%;%IlNk_TsNd{7ozJt#?xGuT&DF0^4UduJwOnG;3o$6}2p13yp`ul{2@-|T3 +z&7?j_{ry}wls(r<2iJ2yskRSXFAx}nuynEz|0FEM*fEx3-aJcTVQI;+lAK5uDy|uo +zm}Sa2vUKA5l5^$6wMFuC5t +zNeRP0pKF7Sk3Nz+ZSv$Jlc!ALkMWa6cTGMrjbXC0k|E1Kt2zGCq)DS&r<$5ZMNOSN +znrY{0Q%$2L%CN?C%#kURCS8&x$iXFr>1(4WPo6TRbY6WYoX1T3U`*76QKMwppdi_}3_(HchgG7YqD;rsuzc6li4#{( +z7&X&3(5uzgIbrpxFXnx)XYIRR>E_HaR8|@iRtJ4CVd5AL+gr`W7#3AC>%^>Cu3oeK#*d#eb;7(o2Sb8_ +z?q;tHTrz4%{b0e*ezy5k=lk8}=1Z6MF26WMZ8fKHu}g2S>#VLm6O-J;kdT>e8EYfL +z!(6X^Z5etiwCQJ?-+$lRd*>(T&z}#NYwn}X>|XBE+v~M$)}&8OOsuolS|FNSa`m35@bE7mPna-jZ%x`cIN0QQ<_w1TB{@$wBi>$t>nOBH@CU| +zOP78A%||zOf3)kuT;Cpt#`nw|^_j6L>USMxU-R&2QEgbie!X^m(fX1(^(7yheeJny +z*|HU~{O)CQeG;N-PHd@Oyrt2xB!BBM?2=OY`ilnD%ZJd@-)+gX^Tr2gwH&5c*gP5r|ge)+O;^f+ZX2Lm$)8pKD*<0SFSXpIzSErLR|c+C +zXKia7niwn>`JS+;qm|uY{`@ubqb>6n<{WCav&$+>DQRmm>z=#(;zi%t>%RK9ZSlsa +zF;S+b`{GmH;|o0gGZSFVnlh(Z{OvNXyKm_lC=_ +zAw#&QPA<~s7o;uxDn0veoSfQc^^KoCozML$eqG>LUyz@lpR{52aC!dy^xWi`Vd|21 +zE#D0bk507CbvSeFvrk#RfBa`>{zkW8L;c1L>abZ)i_65NNlRv0FPY>#+TFct%7~qb +zOgUFHE_QI3{d;>QrN!6h`OrUo{G}z6J~J`-jARVc7AT|P3F{T}hB +z)4xZdKUa}I{B`@`DY1`)KRnlezxW4<{b31wUpX4fX$eiovPnSV*ilO3&*ND6+?4bb +z$Nq>vjKRd1Q09>5TH-{Wr$=H}i6tfOl(0v8&mhdKg!! +zG{Q_`sCmRsl8hLNu|}gMj?og|4C5#Z_U&Y$BTgb_eS)DRF47PaY1G4*Qb){VsFm2K +zmN>GO7>U@17)N3oi7zF-k=RBE+pbC#O5Ez_M+$m|TeVu^S<2ju@>WSAc6Fz`EiIWQDfm@I{Oa@s$NKS}AZQrR +z1`*S$Ng7g+mTipZe8_om(ve5vTvCvX-I+(ctKj}1=Bb&-Ia9DNW1UP(3~Z|BnDjy= +zX&%W;ui#-n71K^kyXz@G;#yJ=$;pptlElVNT&K#N0@r|_hFF*+@v+3k@}5C&U>Qr^ +zRUbeDSN5uZ?2&tH1UY~8YT +zpT0E3$!A~2FMhG$tFOYHT;6{D)mK-&@yfVY-**0Bn#0@H6Jn>j{i^5wiWOGt*Ke@S +z4)|&r&ztMUnaqFN@7HD1y-GF|ZSlM~uwu2b+G7^0SFeBTz2Cg`)|o>({?!^PAti_uji{fl=|npT0ilwUl&n>XLRQP@?JyXRM*zVO0|tNF7NXMU2b|Ha|UmT$hPvU~si +zP4AjjEL*ztO4B?*3&;)vwPG_qg=gWU!m}K`0t!PFRT1$^XIb{4qCnY?z)Y- +z6!V2)adSSK)on6iyotU2H&@+Wwfv27^7q8?zkTI=@2}6lF#OPD +z(vx^(^xId)@vQqa=eH)~CQg|2tl+qbCKFiT-y-~3Up{s|e4cpr_ureJXFUz4EMMgD +zLE%H5V_s0YfBqcv6Xwb?#&eA6h_eebp9Z!l9zA*_9z1v`9u7ScLqiY6&_kw~_xSN+ +z@%Ry#_lRX4i%0y8$2=F{p}2DOsd15v80;(JQuc`$O{!>bJ1-iJw2RQB8nJnEuCQ93D(u#$2}i3;;k% +z^*0}hBLfhHO~*xiRH2C6(J0*Q4+ww13{hH9C8ATyMJ&G^`!WxTU7>km&5~r{?2;{F +z4t9y?Lsvw0*MP|H84&u@{bIXAidZ^thj4NB7tzrXqJX?d#Kw!b%xn?1S0}bRC5h0W +zTJhkF$`qcS-onk@ +zLljh1i_*G!VYS9q*r+_kj?hdIvaeXgrd4s=2gD|;Z6aBlBg(1|i`KT2;tuO~b#;k@ +z2M>w;`%{JMR#$Q0K$b{M)Cf1%t-?;VN!VK32q#BJ5uXq%viU4IDM1*@%f#*5w?$i9 +zn>cmql(=>4mbiB9n&>>$shlk@UcAUP0`ZXR#cASC6*6#beK^rveE#8AV#eGBV(j#} +zV(k1GV!`aWV!ruwF-OJ=z7z{S|5ChdwL+}mO6>pbPZg4D_A}D7C#&;q#(z><=0g0$ +z@MCf8#E-?pKcVh;mYqbBuZ7fQ$v$mXI*8TQ_G0V`Yx2KZ*srq|cI1DfjO{lGdz(!{ +z#j^i5yqf;xr$W-aKcP=4v&k&~k0cpJlVqM3nK$zC7W2N(7-aoF6vm8_yS4IX%$`wW +z#+aD+@7Nh&vTJu>P_T)~m@&@0vvk|$zTLyq%iG7-&uaaKjn+0Q+f8=%4vw3hw*12q +zUal>-SnE%~m{rPLJ|Kbf3lfU`N-~ROP{@dUG +zgULVs(|`Zx|1s)k#&5}A|5uYAOMXU;df`Vej{YxWOve1^FaGkcOyqR_!7z-)|6q}C +zeQ2zweN~9DEHR8Hf25Rsejk2^xfUc7rKAw|NW;0Fo(N0ET>e97~kF-d^* +z_*=ob@~TBg>6U%eLijW8TQVzAf+h=f*O|c;xeuY00w;#=Mc` +zWm@vh^CG&tyK(yTY4DyBckbK)&y=`)`7*9txuT@+-Mgohm353kj#bvDO$~VN#Ely_ +zaQ*sqr9Bx-x_R>^WZef39>6FYBQG+R?TzHg`0V+7+2_b|Qs$B*uafVwvNB|4WuZ{7 +zM_pYV>S}9IUS5vsg9mZ)u1k!_6RN2ZND$#EL_|F&4lOv>fz)vJn(d&olt`%X+sLYP_&-VY-r +zBm}|1!AMKdqOran-Dl3=($y=inLlxstl +zt0!Oe4GlQi-i}VTTS-~P#%b8E4`^cr7Z(@oA&%+bJ$vBb?1JrHUfAYJIXl=x +zMfuuF{>YQHY9p*|Y#48XwY5F$R4&+L?SxG>PO#m;`LNjxI~xaV+^`-tHr8;oXBj&Z +zV@Jo$*hYT+{rwQMI}jmzf)T>?st$`lVq5}pvvbhc*no@NPvm-+?^t?zx>DZPZwIz{ +zc*B0PJ+``fAR#3KC(d0&@7;T-J8=rd74>L4*N5sO%?OW(ho?sXc~ZgALB%y4%06MSULFbJ-sBAt4m5nV_8*Sj^xCJUJ6>O|F!`&kWA-jvn +zR}J<$P; +zPIflx8;_x~p%n)YA4kK{lPEcK3=PM6aQfV3^j^3^*$?7A*UzzI$GE1Fm3Pvb>(bVF +z8aCGy9t<6T*Zrq5KtJWhrJ`*SU?%`}d>$IQYd*=nKHQQi5-ybt4yI{R-JeMEKpTu0l;%ecdr@_y4@EWYsBP&&Q_CstLDzYeHT;c8(`6$nHV#g1 +z?h3_db;v9|4ByZ+c(_Ht%OeP`TLWQZy$5-<9XL6750&jFU}qJJ>A&>DKaX06nG^gF +z5Z3_b&}xL}nvqz38v80wL0x(gd&|y2fAkKrI`3j{^G(Dw^wG +z>nt4R?Z?__MbPE;qW;7cv~*sBq47MbT6=M@?F=egIakL|;@qW+7!=4KWD?EqXqxTVg>^8!W-^2d4dq`{>L~iFj +z=nnNkQ+*AGd-||zQ!XMrDv@7y7zt^m*b^ED-<=_F;X4_cl8C(gG8C0oqLlAMQ`<2N +z-WyQ9YuOcbh)&BzoURD8VMIamag-eEMOr}f!lK9z2)k!}^O1 +zESjE#FW%XUS-!Gxsj8V>>JE4IAOWeQc|vBmB94?%}sE +zmiu)fzvU-Sp1}1R*O6Jp@#dF8-_U~MmNsP9HzWPvF=SU9Lt?=}?2ar%@NPZABJvQO +zRLVKYgYWh{IB(vMjTVVmV;PTKDK*%oYk^Ne7XnMpU}td;LJwYmj_W3;^A-}0-Nb?J +z`>5y}Kxxka4s_f{PTO7RTkj#Ki|;{qFQNkTux4R69BjE3cd6mvvJ-aOcEXL{Om|mj +z?oH0z!fJ{RZ;)?2!b*K*1!6Ake#&=?8 +zR5rXqGU4Wz2J7|d{O+VfWxXGMAq9xZtHoZvt3efAP*{dpX$Ed$}~lz{aXq_x3t*&cwn +zIIitzHG=j8Vuz16c5qJ&4hlhLMi$ZzHDOmw0er&>;1;ZdTR;xnxliv&F2(M>1zdZ1 +z2-Rj|oBsjWQsy=)Emki+fKMjHWA>ylem6>xR@#R2I|e@o&{oJV|cF2L||ktT%9S?6(T9_|Q#qy;o +zu-}r4wHqks&Dn6+mWAcZld6N-MkL{ +z+1sQ+6!s0F^vVO&U4Do|q}nS3D7!XS{+-f>)^u((Qi`ewpuT{2V)_hZ#3@Glc$8=D)0dEU{3;Hd +zxQ>F}+bFwwABG!4IDGptj^B8M+FOs%GQe?g3>CfPy}J+X*RJ3w_s6{KY8*(bL|jxk +z-{TfU?rMP7s!FV-yjCxb!_ozDSU7hN+}vZ4SIF<_*$cRN=N7bwFCewy48pQ%v2{l_ +zY}cj0@tZWbEKh~Ac`6*t65+a13va7*xUEV+z_uI&2kNnVR|UTdC0J>h26fU=RJ5H% +zaa%9SyKbTIbUzAv`=P&b7v=r@#@~K~;~YZ+)3yC~QF87E482#;+;bi3=mhKv4nlfP +zAu0|YMRiRF_s=4fQ7$#rEzqUcATF#40S;BLH7n*=_QTa95!=0k(cOCyakVFqa`+^) +z^`}VPh(6eg(1I3tYYo`sor-O{bFpJ@5%%fous5d?G5LoOlv0j0oCC8(MVR*6{aC*y +z50%Hy;OMnMu7?{aIn$5oOZU*yKZN7AhRFW|G+e)nqjw*m{@QhvbzQ)zTLVbTticy^ +z*1*%<4MBmy$js64yx4@6);1ifX+&;5-@WiqM5*^7zn}y~C5I8GR +z!IOO37GcT4T&R|(BPOI6y1Wj!dDkHPz$xS(y@J~Fx6yKY5KWYO=Z*X5x^xR3-Vs=0 +z#&fts7OEP1keyryJ4^0|JBb~fo#DL28LqBwJo~!B*<~~LIv=dt5Q-#i2D-aWV{qX9 +z6NvrT2(_^*lHZF6KkN+kM?m;a1VxANY#syKFY<^3vJkFIMR-mD_M|qzH?9o62^Fw% +z$iP~z84JG4JGSN{BeM}93H8{wzZ)q$`&68}ifXR^roLM^cI_tG&R-_Zyog<4@$m9W +z#!8F*NXcwNRZ%-U9h2c55(!O`Mmg(;hVDT`xEj&1YB)RZ!;&u(`97CoVBqdktUoj) +zF~2+mJ>q`9725(_;Th-w?;sEO1^dHM6%D6ldbm0yLA7Ns>^)LoxhWE6=861Wj@9P5 +zFq@H%Eo)M_UmSvOa5;8pYLUiwsk-MX%FkZGLB@xOpnEfQzP+(sRkdvrNP`uNmwx} +z9otm~gzw-tE-V*&((4ghd7S%xFN)fGQF^==jU8vvdG{@w?Xk-&GxrUA>$wb&Yv0T-`SthS24hIQOCXBJ}K_#7l?3`!f1DDOw)d1Tlb +z;)~!&;?0O1@DK8XtB(_9y%uYhM8bMbCVbX&y?>n!$FFkXVv&dK8#1uVQwKjEEivYP +z1SjSqrLGG54>cg=;9+Ffw4$2$=JM6+c=&*KG4lR{yi5LNpybeV{tEUc7UOI4aBSI7 +zim0GE1i3ZA)}jm>%!;saehI9D~*Ghw|d4QKh@8}Ec3Q>ksd3zG53aGz_c@7g6C +zY^+C2VkTCu+=aDEqPfPii3Q?euZn`t_IOy??Si8x#~c%hh@=EW#U~?4mxHX5Dzu$G +zgLuyXZI)VCfR9yP~rX|_#SdT99zl4F8w0Bo?`mG@ +zmqkX(Mh<%9@9&eA{Ta&{)6aMqP8py7YvS)}^Z7phfBO9&MGyA_A3sRo2MPS=lfdv^ +zX|yZ-siTp+4D;`Yz^KGbYg{92+)RQLk-Jn~N>jy44ll-d^yhor1K(2nq~DDs3X# +z+uIcxNSlrD@NnwC{opKZFKCl+KwpC67cRm;J#sU3ocrQZsDGp`%6=m@scfj{@#TFW +z_3S%na}bzI{Z0X*_Ud`xS44erF6Fit4x4P@VCTU80w{w#)YR4}b9SWpC{CR2q#eLT +z1!FgGu6NV!fi}qS-xUU@t=q7E{W|#X4#n~F*Kv6Wh>DKI+LeyHQ`}13dL;bR)!3JH +z6#MkNb1yuN^y+iSXu5>#mdhwRb{WTce;KRZ4~tJjpoz~%WoS+ +zpK=&6Whb$lI^Xz;OVCkY7S(za@kei?u>B^Ac?X$B9lq+*0_sgKP?voQnMFrXP=6c; +zo7-`syBh<%yO1G1OOL1&9S)S&pzLTD;!>;O@5%c&+kDu4l?l5gxmY|S4Zrz&FRZtT +z!=BuB?ACQ)d)g_e0(y{IcMEat14un}4;d#1k=b|?aTQm2&wLsQ5qTV2Fz3}pu}5)p +z--f7&C?uz+p_T8`0Ph--3Tu#IXn_7m8?tJTBCDzyk=i1JhUG&Yqo>}EdM>9-sMaOH +zH?kOk)E5R6pFv=0FOm-5K*otX&~*=jzNoy%q<)aP&*HPUpet^`dh-x$*%E-w&cSeS +z<@)pX;JdLEZd{XlqoQ%Jn!1C$8U$;2j~iWtov|edPcKEpe%@QBWMhkOI&7$~Tr?*I +zOBco=HnX032HsU4zNpv~WKuVu+D*L}^?HVj_mSPp{(J6FXVwodmlVu-BMhtOYq09m +z6s-O_jO$nneQ^P@GSb+8l=3d_49SN5`Xp>HPl5Rt$yh$0`utUySVujJd-HY30NEOL+cDZ08s>O@Pg4x#SqL+V$CP)WU4F?BFaeK$~)U5DMyIoPp< +z`keX2Sn_@*R(})4_m=vTI32pU271q*K~mLeM5NX8-d_i6bL#vTq+-K7>RFa)slQ5v +zw__H91B&6{u18R8Eet1mQPE8uRX1%BF5gAXt%o>v^AVZ`sAr?CNzM72$S$rxN@^wy +z)lJARZsMI@D>CBivD>2@o0jEZ&2s9l_9UbEcsmlPyGp6=Kr(GgG>6)-Gp!2VQ6&iA +zoM;LTA-Sv$PTLDG=i^+gSg4~7%US9OzhiRg^|$sqwTuOG9cV?}@1&jtDmJ8_v7S2lAUUq_hVE0J^W;n-+r547E~1k3 +zij9H0V+kDAmtfrz9n3yX##-71T%^r_yoZ!`mBw>~tT!^8xp)qTYFm)BzmWRgLujOJ +zMtMyG4!5>MCU0>v{@cd#$MPhzO8qDCA1nXt`LlW>vA_@M|9ld7e!>5HOW^tb +zEa`$amYojYV@S`y-@nI@*A`<*#(NCYVYfBr{KpCM-ICvw=fk(<$+B`kGJb>PZ)1=+ +zjJ~T+@te$-{s{D6r5$dEV*fm%_|tuZ{<7%m>H_^`i5XLs?>_xyk(j6f{bgy(Ogm>{ +zBl^pN{<5IIEa)!_`pYVKkiNRabl$Wx@}MrX8uZnrovSTzi6`i*3;ODUzPg~VF6gTZ +z`s#wdx}dMFf_LdF4EhR#zQUldFz71``U-=-!l17(=qn8R3WL7Fpsz6KD-8MygTBH_ +z|MXP`eU(99WzbiddiZ3X39~_8Wzbg{^i>9Zl|f%+&{rAsRR(>PiFqSHUuDo&ns)KI +zpszIOD-HTegTB(BuQcc@4f;xhzS5wtH0Uc0`bvYo(x9(2=qnBSYJ7Z{q=$o#{R~D4tWcsJm +zPMbE4(T8}RxTdTj`lvr`=erW}`}*uN_e>9M{3gh?C`mb+@!M(q<{HlzO8;`*@)Y4n{D|9-ICjYf-i +zSVjJ81@d1T=I%81$uIt!O`~`lJN!%j%Lgw!DLGb1|JxruDal_f^Wu||V};xc /dev/null 2>&1; then \ ++ echo "Mono not installed! - go " \ ++ "to http://www.mono-project.com/Main_Page" && exit 1; \ ++ fi ++ ++endif # Linux ++ ++endif # not 'clean' +diff --git a/feeds/luci/libs/luci-lib-nixio/axTLS/config/makefile.java.conf b/feeds/luci/libs/luci-lib-nixio/axTLS/config/makefile.java.conf +new file mode 100644 +index 0000000..9b22462 +--- /dev/null ++++ b/feeds/luci/libs/luci-lib-nixio/axTLS/config/makefile.java.conf +@@ -0,0 +1,58 @@ ++# ++# Copyright (c) 2007, Cameron Rich ++# ++# All rights reserved. ++# ++# Redistribution and use in source and binary forms, with or without ++# modification, are permitted provided that the following conditions are met: ++# ++# * Redistributions of source code must retain the above copyright notice, ++# this list of conditions and the following disclaimer. ++# * 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. ++# * Neither the name of the axTLS project nor the names of its ++# contributors may be used to endorse or promote products derived ++# from this software without specific prior written permission. ++# ++# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ++# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT ++# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR ++# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR ++# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, ++# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED ++# TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, ++# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY ++# OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING ++# NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF ++# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ++# ++ ++ifneq ($(MAKECMDGOALS), clean) ++ ++ifdef CONFIG_PLATFORM_CYGWIN ++CFLAGS += -I"$(CONFIG_JAVA_HOME)/include" ++CFLAGS += -I"$(CONFIG_JAVA_HOME)/include/win32" ++JAVA_BIN:=$(CONFIG_JAVA_HOME)/bin ++else ++ ++ifdef CONFIG_PLATFORM_WIN32 ++CFLAGS += /I"$(shell cygpath -w $(CONFIG_JAVA_HOME)/include)" ++CFLAGS += /I"$(shell cygpath -w $(CONFIG_JAVA_HOME)/include/win32)" ++JAVA_BIN:=$(shell cygpath -u $(CONFIG_JAVA_HOME)/bin) ++else # Linux ++CFLAGS += -I$(CONFIG_JAVA_HOME)/include ++ ++ifdef CONFIG_PLATFORM_SOLARIS ++CFLAGS += -I$(CONFIG_JAVA_HOME)/include/solaris ++else ++CFLAGS += -I$(CONFIG_JAVA_HOME)/include/linux ++endif ++ ++JAVA_BIN:=$(CONFIG_JAVA_HOME)/bin ++endif ++endif ++ ++PATH:=$(JAVA_BIN):$(PATH) ++ ++endif # not 'clean' +diff --git a/feeds/luci/libs/luci-lib-nixio/axTLS/config/makefile.post b/feeds/luci/libs/luci-lib-nixio/axTLS/config/makefile.post +new file mode 100644 +index 0000000..033981c +--- /dev/null ++++ b/feeds/luci/libs/luci-lib-nixio/axTLS/config/makefile.post +@@ -0,0 +1,19 @@ ++ ++ifneq ($(MAKECMDGOALS), clean) ++ifndef CONFIG_PLATFORM_WIN32 ++ifndef CONFIG_PLATFORM_SOLARIS ++# do dependencies ++-include .depend ++all : .depend ++.depend: $(wildcard *.c) ++ @$(CC) $(CFLAGS) -MM $^ > $@ ++endif # 'not' solaris ++endif # 'not' win32 ++ ++ifdef CONFIG_PLATFORM_WIN32 ++OBJ:=$(OBJ:.o=.obj) ++%.obj : %.c ++ $(CC) $(CFLAGS) $< ++endif # win32 ++ ++endif # end of 'not' clean +diff --git a/feeds/luci/libs/luci-lib-nixio/axTLS/config/scripts/config/Kconfig-language.txt b/feeds/luci/libs/luci-lib-nixio/axTLS/config/scripts/config/Kconfig-language.txt +new file mode 100644 +index 0000000..493749b +--- /dev/null ++++ b/feeds/luci/libs/luci-lib-nixio/axTLS/config/scripts/config/Kconfig-language.txt +@@ -0,0 +1,255 @@ ++Introduction ++------------ ++ ++The configuration database is collection of configuration options ++organized in a tree structure: ++ ++ +- Code maturity level options ++ | +- Prompt for development and/or incomplete code/drivers ++ +- General setup ++ | +- Networking support ++ | +- System V IPC ++ | +- BSD Process Accounting ++ | +- Sysctl support ++ +- Loadable module support ++ | +- Enable loadable module support ++ | +- Set version information on all module symbols ++ | +- Kernel module loader ++ +- ... ++ ++Every entry has its own dependencies. These dependencies are used ++to determine the visible of an entry. Any child entry is only ++visible if its parent entry is also visible. ++ ++Menu entries ++------------ ++ ++Most entries define a config option, all other entries help to organize ++them. A single configuration option is defined like this: ++ ++config MODVERSIONS ++ bool "Set version information on all module symbols" ++ depends MODULES ++ help ++ Usually, modules have to be recompiled whenever you switch to a new ++ kernel. ... ++ ++Every line starts with a key word and can be followed by multiple ++arguments. "config" starts a new config entry. The following lines ++define attributes for this config option. Attributes can be the type of ++the config option, input prompt, dependencies, help text and default ++values. A config option can be defined multiple times with the same ++name, but every definition can have only a single input prompt and the ++type must not conflict. ++ ++Menu attributes ++--------------- ++ ++A menu entry can have a number of attributes. Not all of them are ++applicable everywhere (see syntax). ++ ++- type definition: "bool"/"tristate"/"string"/"hex"/"integer" ++ Every config option must have a type. There are only two basic types: ++ tristate and string, the other types base on these two. The type ++ definition optionally accepts an input prompt, so these two examples ++ are equivalent: ++ ++ bool "Networking support" ++ and ++ bool ++ prompt "Networking support" ++ ++- input prompt: "prompt" ["if" ] ++ Every menu entry can have at most one prompt, which is used to display ++ to the user. Optionally dependencies only for this prompt can be added ++ with "if". ++ ++- default value: "default" ["if" ] ++ A config option can have any number of default values. If multiple ++ default values are visible, only the first defined one is active. ++ Default values are not limited to the menu entry, where they are ++ defined, this means the default can be defined somewhere else or be ++ overriden by an earlier definition. ++ The default value is only assigned to the config symbol if no other ++ value was set by the user (via the input prompt above). If an input ++ prompt is visible the default value is presented to the user and can ++ be overridden by him. ++ Optionally dependencies only for this default value can be added with ++ "if". ++ ++- dependencies: "depends on"/"requires" ++ This defines a dependency for this menu entry. If multiple ++ dependencies are defined they are connected with '&&'. Dependencies ++ are applied to all other options within this menu entry (which also ++ accept "if" expression), so these two examples are equivalent: ++ ++ bool "foo" if BAR ++ default y if BAR ++ and ++ depends on BAR ++ bool "foo" ++ default y ++ ++- help text: "help" ++ This defines a help text. The end of the help text is determined by ++ the level indentation, this means it ends at the first line which has ++ a smaller indentation than the first line of the help text. ++ ++ ++Menu dependencies ++----------------- ++ ++Dependencies define the visibility of a menu entry and can also reduce ++the input range of tristate symbols. The tristate logic used in the ++expressions uses one more state than normal boolean logic to express the ++module state. Dependency expressions have the following syntax: ++ ++ ::= (1) ++ '=' (2) ++ '!=' (3) ++ '(' ')' (4) ++ '!' (5) ++ '||' (6) ++ '&&' (7) ++ ++Expressions are listed in decreasing order of precedence. ++ ++(1) Convert the symbol into an expression. Boolean and tristate symbols ++ are simply converted into the respective expression values. All ++ other symbol types result in 'n'. ++(2) If the values of both symbols are equal, it returns 'y', ++ otherwise 'n'. ++(3) If the values of both symbols are equal, it returns 'n', ++ otherwise 'y'. ++(4) Returns the value of the expression. Used to override precedence. ++(5) Returns the result of (2-/expr/). ++(6) Returns the result of min(/expr/, /expr/). ++(7) Returns the result of max(/expr/, /expr/). ++ ++An expression can have a value of 'n', 'm' or 'y' (or 0, 1, 2 ++respectively for calculations). A menu entry becomes visible when it's ++expression evaluates to 'm' or 'y'. ++ ++There are two type of symbols: constant and nonconstant symbols. ++Nonconstant symbols are the most common ones and are defined with the ++'config' statement. Nonconstant symbols consist entirely of alphanumeric ++characters or underscores. ++Constant symbols are only part of expressions. Constant symbols are ++always surrounded by single or double quotes. Within the quote any ++other character is allowed and the quotes can be escaped using '\'. ++ ++Menu structure ++-------------- ++ ++The position of a menu entry in the tree is determined in two ways. First ++it can be specified explicitely: ++ ++menu "Network device support" ++ depends NET ++ ++config NETDEVICES ++ ... ++ ++endmenu ++ ++All entries within the "menu" ... "endmenu" block become a submenu of ++"Network device support". All subentries inherit the dependencies from ++the menu entry, e.g. this means the dependency "NET" is added to the ++dependency list of the config option NETDEVICES. ++ ++The other way to generate the menu structure is done by analyzing the ++dependencies. If a menu entry somehow depends on the previous entry, it ++can be made a submenu of it. First the the previous (parent) symbol must ++be part of the dependency list and then one of these two condititions ++must be true: ++- the child entry must become invisible, if the parent is set to 'n' ++- the child entry must only be visible, if the parent is visible ++ ++config MODULES ++ bool "Enable loadable module support" ++ ++config MODVERSIONS ++ bool "Set version information on all module symbols" ++ depends MODULES ++ ++comment "module support disabled" ++ depends !MODULES ++ ++MODVERSIONS directly depends on MODULES, this means it's only visible if ++MODULES is different from 'n'. The comment on the other hand is always ++visible when MODULES it's visible (the (empty) dependency of MODULES is ++also part of the comment dependencies). ++ ++ ++Kconfig syntax ++-------------- ++ ++The configuration file describes a series of menu entries, where every ++line starts with a keyword (except help texts). The following keywords ++end a menu entry: ++- config ++- choice/endchoice ++- comment ++- menu/endmenu ++- if/endif ++- source ++The first four also start the definition of a menu entry. ++ ++config: ++ ++ "config" ++ ++ ++This defines a config symbol and accepts any of above ++attributes as options. ++ ++choices: ++ ++ "choice" ++ ++ ++ "endchoice" ++ ++This defines a choice group and accepts any of above attributes as ++options. A choice can only be of type bool or tristate, while a boolean ++choice only allows a single config entry to be selected, a tristate ++choice also allows any number of config entries to be set to 'm'. This ++can be used if multiple drivers for a single hardware exists and only a ++single driver can be compiled/loaded into the kernel, but all drivers ++can be compiled as modules. ++A choice accepts another option "optional", which allows to set the ++choice to 'n' and no entry needs to be selected. ++ ++comment: ++ ++ "comment" ++ ++ ++This defines a comment which is displayed to the user during the ++configuration process and is also echoed to the output files. The only ++possible options are dependencies. ++ ++menu: ++ ++ "menu" ++ ++ ++ "endmenu" ++ ++This defines a menu block, see "Menu structure" above for more ++information. The only possible options are dependencies. ++ ++if: ++ ++ "if" ++ ++ "endif" ++ ++This defines an if block. The dependency expression is appended ++to all enclosed menu entries. ++ ++source: ++ ++ "source" ++ ++This reads the specified configuration file. This file is always parsed. +diff --git a/feeds/luci/libs/luci-lib-nixio/axTLS/config/scripts/config/Makefile b/feeds/luci/libs/luci-lib-nixio/axTLS/config/scripts/config/Makefile +new file mode 100644 +index 0000000..7399501 +--- /dev/null ++++ b/feeds/luci/libs/luci-lib-nixio/axTLS/config/scripts/config/Makefile +@@ -0,0 +1,121 @@ ++# Makefile for axTLS ++# ++# Copyright (C) 2002 Erik Andersen ++ ++top_srcdir=../.. ++top_builddir=../.. ++srcdir=$(top_srcdir)/scripts/config ++include $(top_srcdir)/Rules.mak ++ ++all: ncurses conf mconf ++ ++ifeq ($(shell uname),SunOS) ++LIBS = -lcurses ++else ++LIBS = -lncurses ++endif ++ifeq (/usr/include/ncurses/ncurses.h, $(wildcard /usr/include/ncurses/ncurses.h)) ++ HOSTNCURSES += -I/usr/include/ncurses -DCURSES_LOC="" ++else ++ifeq (/usr/include/ncurses/curses.h, $(wildcard /usr/include/ncurses/curses.h)) ++ HOSTNCURSES += -I/usr/include/ncurses -DCURSES_LOC="" ++else ++ifeq (/usr/local/include/ncurses/ncurses.h, $(wildcard /usr/local/include/ncurses/ncurses.h)) ++ HOSTCFLAGS += -I/usr/local/include/ncurses -DCURSES_LOC="" ++else ++ifeq (/usr/local/include/ncurses/curses.h, $(wildcard /usr/local/include/ncurses/curses.h)) ++ HOSTCFLAGS += -I/usr/local/include/ncurses -DCURSES_LOC="" ++else ++ifeq (/usr/include/ncurses.h, $(wildcard /usr/include/ncurses.h)) ++ HOSTNCURSES += -DCURSES_LOC="" ++else ++ HOSTNCURSES += -DCURSES_LOC="" ++endif ++endif ++endif ++endif ++endif ++ ++CONF_SRC = conf.c ++MCONF_SRC = mconf.c ++LXD_SRC = lxdialog/checklist.c lxdialog/menubox.c lxdialog/textbox.c \ ++ lxdialog/yesno.c lxdialog/inputbox.c lxdialog/util.c \ ++ lxdialog/msgbox.c ++ ++SHARED_SRC = zconf.tab.c ++SHARED_DEPS := $(srcdir)/lkc.h $(srcdir)/lkc_proto.h \ ++ lkc_defs.h $(srcdir)/expr.h zconf.tab.h ++CONF_OBJS = $(patsubst %.c,%.o, $(CONF_SRC)) ++MCONF_OBJS = $(patsubst %.c,%.o, $(MCONF_SRC) $(LXD_SRC)) ++SHARED_OBJS = $(patsubst %.c,%.o, $(SHARED_SRC)) ++ ++conf: $(CONF_OBJS) $(SHARED_OBJS) ++ $(HOSTCC) $(NATIVE_LDFLAGS) $^ -o $@ ++ ++mconf: $(MCONF_OBJS) $(SHARED_OBJS) ++ $(HOSTCC) $(NATIVE_LDFLAGS) $^ -o $@ $(LIBS) ++ ++$(CONF_OBJS): %.o : $(srcdir)/%.c $(SHARED_DEPS) ++ $(HOSTCC) $(HOSTCFLAGS) -I. -c $< -o $@ ++ ++$(MCONF_OBJS): %.o : $(srcdir)/%.c $(SHARED_DEPS) ++ @[ -d $(@D) ] || mkdir -v $(@D) ++ $(HOSTCC) $(HOSTCFLAGS) $(HOSTNCURSES) -I. -c $< -o $@ ++ ++lkc_defs.h: $(srcdir)/lkc_proto.h ++ @sed < $< > $@ 's/P(\([^,]*\),.*/#define \1 (\*\1_p)/' ++ ++### ++# The following requires flex/bison ++# By default we use the _shipped versions, uncomment the ++# following line if you are modifying the flex/bison src. ++#LKC_GENPARSER := 1 ++ ++ifdef LKC_GENPARSER ++ ++%.tab.c %.tab.h: $(srcdir)/%.y ++ bison -t -d -v -b $* -p $(notdir $*) $< ++ ++lex.%.c: $(srcdir)/%.l ++ flex -P$(notdir $*) -o$@ $< ++else ++ ++lex.zconf.o: lex.zconf.c $(SHARED_DEPS) ++ $(HOSTCC) $(HOSTCFLAGS) -I$(srcdir) -c $< -o $@ ++ ++lex.zconf.c: $(srcdir)/lex.zconf.c_shipped ++ cp $< $@ ++ ++zconf.tab.c: $(srcdir)/zconf.tab.c_shipped ++ cp $< $@ ++ ++zconf.tab.h: $(srcdir)/zconf.tab.h_shipped ++ cp $< $@ ++endif ++ ++zconf.tab.o: zconf.tab.c lex.zconf.c $(srcdir)/confdata.c $(srcdir)/expr.c \ ++ $(srcdir)/symbol.c $(srcdir)/menu.c $(SHARED_DEPS) ++ $(HOSTCC) $(HOSTCFLAGS) -I$(srcdir) -I. -c $< -o $@ ++ ++.PHONY: ncurses ++ ++ncurses: ++ @echo "main() {}" > lxtemp.c ++ @if $(HOSTCC) lxtemp.c $(LIBS) ; then \ ++ rm -f lxtemp.c a.out; \ ++ else \ ++ rm -f lxtemp.c; \ ++ echo -e "\007" ;\ ++ echo ">> Unable to find the Ncurses libraries." ;\ ++ echo ">>" ;\ ++ echo ">> You must have Ncurses installed in order" ;\ ++ echo ">> to use 'make menuconfig'" ;\ ++ echo ;\ ++ exit 1 ;\ ++ fi ++ ++clean: ++ rm -f *.o *~ ../../*~ core *.exe $(TARGETS) $(MCONF_OBJS) $(CONF_OBJS) ++ rm -f conf conf.exe mconf mconf.exe zconf.tab.c zconf.tab.h lex.zconf.c lkc_defs.h ++ rm -f ../..config.h ++ +diff --git a/feeds/luci/libs/luci-lib-nixio/axTLS/config/scripts/config/conf.c b/feeds/luci/libs/luci-lib-nixio/axTLS/config/scripts/config/conf.c +new file mode 100644 +index 0000000..1524467 +--- /dev/null ++++ b/feeds/luci/libs/luci-lib-nixio/axTLS/config/scripts/config/conf.c +@@ -0,0 +1,583 @@ ++/* ++ * Copyright (C) 2002 Roman Zippel ++ * Released under the terms of the GNU GPL v2.0. ++ */ ++ ++#include ++#include ++#include ++#include ++#include ++#include ++ ++#define LKC_DIRECT_LINK ++#include "lkc.h" ++ ++static void conf(struct menu *menu); ++static void check_conf(struct menu *menu); ++ ++enum { ++ ask_all, ++ ask_new, ++ ask_silent, ++ set_default, ++ set_yes, ++ set_mod, ++ set_no, ++ set_random ++} input_mode = ask_all; ++char *defconfig_file; ++ ++static int indent = 1; ++static int valid_stdin = 1; ++static int conf_cnt; ++static char line[128]; ++static struct menu *rootEntry; ++ ++static char nohelp_text[] = "Sorry, no help available for this option yet.\n"; ++ ++static void strip(char *str) ++{ ++ char *p = str; ++ int l; ++ ++ while ((isspace(*p))) ++ p++; ++ l = strlen(p); ++ if (p != str) ++ memmove(str, p, l + 1); ++ if (!l) ++ return; ++ p = str + l - 1; ++ while ((isspace(*p))) ++ *p-- = 0; ++} ++ ++static void check_stdin(void) ++{ ++ if (!valid_stdin && input_mode == ask_silent) { ++ printf("aborted!\n\n"); ++ printf("Console input/output is redirected. "); ++ printf("Run 'make oldconfig' to update configuration.\n\n"); ++ exit(1); ++ } ++} ++ ++static void conf_askvalue(struct symbol *sym, const char *def) ++{ ++ enum symbol_type type = sym_get_type(sym); ++ tristate val; ++ ++ if (!sym_has_value(sym)) ++ printf("(NEW) "); ++ ++ line[0] = '\n'; ++ line[1] = 0; ++ ++ if (!sym_is_changable(sym)) { ++ printf("%s\n", def); ++ line[0] = '\n'; ++ line[1] = 0; ++ return; ++ } ++ ++ switch (input_mode) { ++ case ask_new: ++ case ask_silent: ++ if (sym_has_value(sym)) { ++ printf("%s\n", def); ++ return; ++ } ++ check_stdin(); ++ case ask_all: ++ fflush(stdout); ++ fgets(line, 128, stdin); ++ return; ++ case set_default: ++ printf("%s\n", def); ++ return; ++ default: ++ break; ++ } ++ ++ switch (type) { ++ case S_INT: ++ case S_HEX: ++ case S_STRING: ++ printf("%s\n", def); ++ return; ++ default: ++ ; ++ } ++ switch (input_mode) { ++ case set_yes: ++ if (sym_tristate_within_range(sym, yes)) { ++ line[0] = 'y'; ++ line[1] = '\n'; ++ line[2] = 0; ++ break; ++ } ++ case set_mod: ++ if (type == S_TRISTATE) { ++ if (sym_tristate_within_range(sym, mod)) { ++ line[0] = 'm'; ++ line[1] = '\n'; ++ line[2] = 0; ++ break; ++ } ++ } else { ++ if (sym_tristate_within_range(sym, yes)) { ++ line[0] = 'y'; ++ line[1] = '\n'; ++ line[2] = 0; ++ break; ++ } ++ } ++ case set_no: ++ if (sym_tristate_within_range(sym, no)) { ++ line[0] = 'n'; ++ line[1] = '\n'; ++ line[2] = 0; ++ break; ++ } ++ case set_random: ++ do { ++ val = (tristate)(random() % 3); ++ } while (!sym_tristate_within_range(sym, val)); ++ switch (val) { ++ case no: line[0] = 'n'; break; ++ case mod: line[0] = 'm'; break; ++ case yes: line[0] = 'y'; break; ++ } ++ line[1] = '\n'; ++ line[2] = 0; ++ break; ++ default: ++ break; ++ } ++ printf("%s", line); ++} ++ ++int conf_string(struct menu *menu) ++{ ++ struct symbol *sym = menu->sym; ++ const char *def, *help; ++ ++ while (1) { ++ printf("%*s%s ", indent - 1, "", menu->prompt->text); ++ printf("(%s) ", sym->name); ++ def = sym_get_string_value(sym); ++ if (sym_get_string_value(sym)) ++ printf("[%s] ", def); ++ conf_askvalue(sym, def); ++ switch (line[0]) { ++ case '\n': ++ break; ++ case '?': ++ /* print help */ ++ if (line[1] == '\n') { ++ help = nohelp_text; ++ if (menu->sym->help) ++ help = menu->sym->help; ++ printf("\n%s\n", menu->sym->help); ++ def = NULL; ++ break; ++ } ++ default: ++ line[strlen(line)-1] = 0; ++ def = line; ++ } ++ if (def && sym_set_string_value(sym, def)) ++ return 0; ++ } ++} ++ ++static int conf_sym(struct menu *menu) ++{ ++ struct symbol *sym = menu->sym; ++ int type; ++ tristate oldval, newval; ++ const char *help; ++ ++ while (1) { ++ printf("%*s%s ", indent - 1, "", menu->prompt->text); ++ if (sym->name) ++ printf("(%s) ", sym->name); ++ type = sym_get_type(sym); ++ putchar('['); ++ oldval = sym_get_tristate_value(sym); ++ switch (oldval) { ++ case no: ++ putchar('N'); ++ break; ++ case mod: ++ putchar('M'); ++ break; ++ case yes: ++ putchar('Y'); ++ break; ++ } ++ if (oldval != no && sym_tristate_within_range(sym, no)) ++ printf("/n"); ++ if (oldval != mod && sym_tristate_within_range(sym, mod)) ++ printf("/m"); ++ if (oldval != yes && sym_tristate_within_range(sym, yes)) ++ printf("/y"); ++ if (sym->help) ++ printf("/?"); ++ printf("] "); ++ conf_askvalue(sym, sym_get_string_value(sym)); ++ strip(line); ++ ++ switch (line[0]) { ++ case 'n': ++ case 'N': ++ newval = no; ++ if (!line[1] || !strcmp(&line[1], "o")) ++ break; ++ continue; ++ case 'm': ++ case 'M': ++ newval = mod; ++ if (!line[1]) ++ break; ++ continue; ++ case 'y': ++ case 'Y': ++ newval = yes; ++ if (!line[1] || !strcmp(&line[1], "es")) ++ break; ++ continue; ++ case 0: ++ newval = oldval; ++ break; ++ case '?': ++ goto help; ++ default: ++ continue; ++ } ++ if (sym_set_tristate_value(sym, newval)) ++ return 0; ++help: ++ help = nohelp_text; ++ if (sym->help) ++ help = sym->help; ++ printf("\n%s\n", help); ++ } ++} ++ ++static int conf_choice(struct menu *menu) ++{ ++ struct symbol *sym, *def_sym; ++ struct menu *child; ++ int type; ++ bool is_new; ++ ++ sym = menu->sym; ++ type = sym_get_type(sym); ++ is_new = !sym_has_value(sym); ++ if (sym_is_changable(sym)) { ++ conf_sym(menu); ++ sym_calc_value(sym); ++ switch (sym_get_tristate_value(sym)) { ++ case no: ++ return 1; ++ case mod: ++ return 0; ++ case yes: ++ break; ++ } ++ } else { ++ switch (sym_get_tristate_value(sym)) { ++ case no: ++ return 1; ++ case mod: ++ printf("%*s%s\n", indent - 1, "", menu_get_prompt(menu)); ++ return 0; ++ case yes: ++ break; ++ } ++ } ++ ++ while (1) { ++ int cnt, def; ++ ++ printf("%*s%s\n", indent - 1, "", menu_get_prompt(menu)); ++ def_sym = sym_get_choice_value(sym); ++ cnt = def = 0; ++ line[0] = '0'; ++ line[1] = 0; ++ for (child = menu->list; child; child = child->next) { ++ if (!menu_is_visible(child)) ++ continue; ++ if (!child->sym) { ++ printf("%*c %s\n", indent, '*', menu_get_prompt(child)); ++ continue; ++ } ++ cnt++; ++ if (child->sym == def_sym) { ++ def = cnt; ++ printf("%*c", indent, '>'); ++ } else ++ printf("%*c", indent, ' '); ++ printf(" %d. %s", cnt, menu_get_prompt(child)); ++ if (child->sym->name) ++ printf(" (%s)", child->sym->name); ++ if (!sym_has_value(child->sym)) ++ printf(" (NEW)"); ++ printf("\n"); ++ } ++ printf("%*schoice", indent - 1, ""); ++ if (cnt == 1) { ++ printf("[1]: 1\n"); ++ goto conf_childs; ++ } ++ printf("[1-%d", cnt); ++ if (sym->help) ++ printf("?"); ++ printf("]: "); ++ switch (input_mode) { ++ case ask_new: ++ case ask_silent: ++ if (!is_new) { ++ cnt = def; ++ printf("%d\n", cnt); ++ break; ++ } ++ check_stdin(); ++ case ask_all: ++ fflush(stdout); ++ fgets(line, 128, stdin); ++ strip(line); ++ if (line[0] == '?') { ++ printf("\n%s\n", menu->sym->help ? ++ menu->sym->help : nohelp_text); ++ continue; ++ } ++ if (!line[0]) ++ cnt = def; ++ else if (isdigit(line[0])) ++ cnt = atoi(line); ++ else ++ continue; ++ break; ++ case set_random: ++ def = (random() % cnt) + 1; ++ case set_default: ++ case set_yes: ++ case set_mod: ++ case set_no: ++ cnt = def; ++ printf("%d\n", cnt); ++ break; ++ } ++ ++ conf_childs: ++ for (child = menu->list; child; child = child->next) { ++ if (!child->sym || !menu_is_visible(child)) ++ continue; ++ if (!--cnt) ++ break; ++ } ++ if (!child) ++ continue; ++ if (line[strlen(line) - 1] == '?') { ++ printf("\n%s\n", child->sym->help ? ++ child->sym->help : nohelp_text); ++ continue; ++ } ++ sym_set_choice_value(sym, child->sym); ++ if (child->list) { ++ indent += 2; ++ conf(child->list); ++ indent -= 2; ++ } ++ return 1; ++ } ++} ++ ++static void conf(struct menu *menu) ++{ ++ struct symbol *sym; ++ struct property *prop; ++ struct menu *child; ++ ++ if (!menu_is_visible(menu)) ++ return; ++ ++ sym = menu->sym; ++ prop = menu->prompt; ++ if (prop) { ++ const char *prompt; ++ ++ switch (prop->type) { ++ case P_MENU: ++ if (input_mode == ask_silent && rootEntry != menu) { ++ check_conf(menu); ++ return; ++ } ++ case P_COMMENT: ++ prompt = menu_get_prompt(menu); ++ if (prompt) ++ printf("%*c\n%*c %s\n%*c\n", ++ indent, '*', ++ indent, '*', prompt, ++ indent, '*'); ++ default: ++ ; ++ } ++ } ++ ++ if (!sym) ++ goto conf_childs; ++ ++ if (sym_is_choice(sym)) { ++ conf_choice(menu); ++ if (sym->curr.tri != mod) ++ return; ++ goto conf_childs; ++ } ++ ++ switch (sym->type) { ++ case S_INT: ++ case S_HEX: ++ case S_STRING: ++ conf_string(menu); ++ break; ++ default: ++ conf_sym(menu); ++ break; ++ } ++ ++conf_childs: ++ if (sym) ++ indent += 2; ++ for (child = menu->list; child; child = child->next) ++ conf(child); ++ if (sym) ++ indent -= 2; ++} ++ ++static void check_conf(struct menu *menu) ++{ ++ struct symbol *sym; ++ struct menu *child; ++ ++ if (!menu_is_visible(menu)) ++ return; ++ ++ sym = menu->sym; ++ if (sym) { ++ if (sym_is_changable(sym) && !sym_has_value(sym)) { ++ if (!conf_cnt++) ++ printf("*\n* Restart config...\n*\n"); ++ rootEntry = menu_get_parent_menu(menu); ++ conf(rootEntry); ++ } ++ if (sym_is_choice(sym) && sym_get_tristate_value(sym) != mod) ++ return; ++ } ++ ++ for (child = menu->list; child; child = child->next) ++ check_conf(child); ++} ++ ++int main(int ac, char **av) ++{ ++ int i = 1; ++ const char *name; ++ struct stat tmpstat; ++ ++ if (ac > i && av[i][0] == '-') { ++ switch (av[i++][1]) { ++ case 'o': ++ input_mode = ask_new; ++ break; ++ case 's': ++ input_mode = ask_silent; ++ valid_stdin = isatty(0) && isatty(1) && isatty(2); ++ break; ++ case 'd': ++ input_mode = set_default; ++ break; ++ case 'D': ++ input_mode = set_default; ++ defconfig_file = av[i++]; ++ if (!defconfig_file) { ++ printf("%s: No default config file specified\n", ++ av[0]); ++ exit(1); ++ } ++ break; ++ case 'n': ++ input_mode = set_no; ++ break; ++ case 'm': ++ input_mode = set_mod; ++ break; ++ case 'y': ++ input_mode = set_yes; ++ break; ++ case 'r': ++ input_mode = set_random; ++ srandom(time(NULL)); ++ break; ++ case 'h': ++ case '?': ++ printf("%s [-o|-s] config\n", av[0]); ++ exit(0); ++ } ++ } ++ name = av[i]; ++ if (!name) { ++ printf("%s: configuration file missing\n", av[0]); ++ } ++ conf_parse(name); ++ //zconfdump(stdout); ++ switch (input_mode) { ++ case set_default: ++ if (!defconfig_file) ++ defconfig_file = conf_get_default_confname(); ++ if (conf_read(defconfig_file)) { ++ printf("***\n" ++ "*** Can't find default configuration \"%s\"!\n" ++ "***\n", defconfig_file); ++ exit(1); ++ } ++ break; ++ case ask_silent: ++ if (stat(".config", &tmpstat)) { ++ printf("***\n" ++ "*** You have not yet configured axTLS!\n" ++ "***\n" ++ "*** Please run some configurator (e.g. \"make oldconfig\" or\n" ++ "*** \"make menuconfig\" or \"make config\").\n" ++ "***\n"); ++ exit(1); ++ } ++ case ask_all: ++ case ask_new: ++ conf_read(NULL); ++ break; ++ default: ++ break; ++ } ++ ++ if (input_mode != ask_silent) { ++ rootEntry = &rootmenu; ++ conf(&rootmenu); ++ if (input_mode == ask_all) { ++ input_mode = ask_silent; ++ valid_stdin = 1; ++ } ++ } ++ do { ++ conf_cnt = 0; ++ check_conf(&rootmenu); ++ } while (conf_cnt); ++ if (conf_write(NULL)) { ++ fprintf(stderr, "\n*** Error during writing of the axTLS configuration.\n\n"); ++ return 1; ++ } ++ return 0; ++} +diff --git a/feeds/luci/libs/luci-lib-nixio/axTLS/config/scripts/config/confdata.c b/feeds/luci/libs/luci-lib-nixio/axTLS/config/scripts/config/confdata.c +new file mode 100644 +index 0000000..a59e245 +--- /dev/null ++++ b/feeds/luci/libs/luci-lib-nixio/axTLS/config/scripts/config/confdata.c +@@ -0,0 +1,458 @@ ++/* ++ * Copyright (C) 2002 Roman Zippel ++ * Released under the terms of the GNU GPL v2.0. ++ */ ++ ++#include ++#include ++#include ++#include ++#include ++#include ++ ++#define LKC_DIRECT_LINK ++#include "lkc.h" ++ ++const char conf_def_filename[] = "config/.config"; ++ ++const char conf_defname[] = "config/defconfig"; ++ ++const char *conf_confnames[] = { ++ "config/.config", ++ conf_defname, ++ NULL, ++}; ++ ++static char *conf_expand_value(const char *in) ++{ ++ struct symbol *sym; ++ const char *src; ++ static char res_value[SYMBOL_MAXLENGTH]; ++ char *dst, name[SYMBOL_MAXLENGTH]; ++ ++ res_value[0] = 0; ++ dst = name; ++ while ((src = strchr(in, '$'))) { ++ strncat(res_value, in, src - in); ++ src++; ++ dst = name; ++ while (isalnum(*src) || *src == '_') ++ *dst++ = *src++; ++ *dst = 0; ++ sym = sym_lookup(name, 0); ++ sym_calc_value(sym); ++ strcat(res_value, sym_get_string_value(sym)); ++ in = src; ++ } ++ strcat(res_value, in); ++ ++ return res_value; ++} ++ ++char *conf_get_default_confname(void) ++{ ++ struct stat buf; ++ static char fullname[PATH_MAX+1]; ++ char *env, *name; ++ ++ name = conf_expand_value(conf_defname); ++ env = getenv(SRCTREE); ++ if (env) { ++ sprintf(fullname, "%s/%s", env, name); ++ if (!stat(fullname, &buf)) ++ return fullname; ++ } ++ return name; ++} ++ ++int conf_read(const char *name) ++{ ++ FILE *in = NULL; ++ char line[1024]; ++ char *p, *p2; ++ int lineno = 0; ++ struct symbol *sym; ++ struct property *prop; ++ struct expr *e; ++ int i; ++ ++ if (name) { ++ in = zconf_fopen(name); ++ } else { ++ const char **names = conf_confnames; ++ while ((name = *names++)) { ++ name = conf_expand_value(name); ++ in = zconf_fopen(name); ++ if (in) { ++ printf("#\n" ++ "# using defaults found in %s\n" ++ "#\n", name); ++ break; ++ } ++ } ++ } ++ ++ if (!in) ++ return 1; ++ ++ for_all_symbols(i, sym) { ++ sym->flags |= SYMBOL_NEW | SYMBOL_CHANGED; ++ sym->flags &= ~SYMBOL_VALID; ++ switch (sym->type) { ++ case S_INT: ++ case S_HEX: ++ case S_STRING: ++ if (sym->user.val) ++ free(sym->user.val); ++ default: ++ sym->user.val = NULL; ++ sym->user.tri = no; ++ } ++ } ++ ++ while (fgets(line, sizeof(line), in)) { ++ lineno++; ++ sym = NULL; ++ switch (line[0]) { ++ case '#': ++ if (line[1]!=' ') ++ continue; ++ p = strchr(line + 2, ' '); ++ if (!p) ++ continue; ++ *p++ = 0; ++ if (strncmp(p, "is not set", 10)) ++ continue; ++ sym = sym_find(line + 2); ++ if (!sym) { ++ fprintf(stderr, "%s:%d: trying to assign nonexistent symbol %s\n", name, lineno, line + 2); ++ break; ++ } ++ switch (sym->type) { ++ case S_BOOLEAN: ++ case S_TRISTATE: ++ sym->user.tri = no; ++ sym->flags &= ~SYMBOL_NEW; ++ break; ++ default: ++ ; ++ } ++ break; ++ ++ case 'A' ... 'Z': ++ p = strchr(line, '='); ++ if (!p) ++ continue; ++ *p++ = 0; ++ p2 = strchr(p, '\n'); ++ if (p2) ++ *p2 = 0; ++ sym = sym_find(line); ++ if (!sym) { ++ fprintf(stderr, "%s:%d: trying to assign nonexistent symbol %s\n", name, lineno, line); ++ break; ++ } ++ switch (sym->type) { ++ case S_TRISTATE: ++ if (p[0] == 'm') { ++ sym->user.tri = mod; ++ sym->flags &= ~SYMBOL_NEW; ++ break; ++ } ++ case S_BOOLEAN: ++ if (p[0] == 'y') { ++ sym->user.tri = yes; ++ sym->flags &= ~SYMBOL_NEW; ++ break; ++ } ++ if (p[0] == 'n') { ++ sym->user.tri = no; ++ sym->flags &= ~SYMBOL_NEW; ++ break; ++ } ++ break; ++ case S_STRING: ++ if (*p++ != '"') ++ break; ++ for (p2 = p; (p2 = strpbrk(p2, "\"\\")); p2++) { ++ if (*p2 == '"') { ++ *p2 = 0; ++ break; ++ } ++ memmove(p2, p2 + 1, strlen(p2)); ++ } ++ if (!p2) { ++ fprintf(stderr, "%s:%d: invalid string found\n", name, lineno); ++ exit(1); ++ } ++ case S_INT: ++ case S_HEX: ++ if (sym_string_valid(sym, p)) { ++ sym->user.val = strdup(p); ++ sym->flags &= ~SYMBOL_NEW; ++ } else { ++ fprintf(stderr, "%s:%d: symbol value '%s' invalid for %s\n", name, lineno, p, sym->name); ++ exit(1); ++ } ++ break; ++ default: ++ ; ++ } ++ break; ++ case '\n': ++ break; ++ default: ++ continue; ++ } ++ if (sym && sym_is_choice_value(sym)) { ++ struct symbol *cs = prop_get_symbol(sym_get_choice_prop(sym)); ++ switch (sym->user.tri) { ++ case no: ++ break; ++ case mod: ++ if (cs->user.tri == yes) ++ /* warn? */; ++ break; ++ case yes: ++ if (cs->user.tri != no) ++ /* warn? */; ++ cs->user.val = sym; ++ break; ++ } ++ cs->user.tri = E_OR(cs->user.tri, sym->user.tri); ++ cs->flags &= ~SYMBOL_NEW; ++ } ++ } ++ fclose(in); ++ ++ if (modules_sym) ++ sym_calc_value(modules_sym); ++ for_all_symbols(i, sym) { ++ sym_calc_value(sym); ++ if (sym_has_value(sym) && !sym_is_choice_value(sym)) { ++ if (sym->visible == no) ++ sym->flags |= SYMBOL_NEW; ++ switch (sym->type) { ++ case S_STRING: ++ case S_INT: ++ case S_HEX: ++ if (!sym_string_within_range(sym, sym->user.val)) ++ sym->flags |= SYMBOL_NEW; ++ default: ++ break; ++ } ++ } ++ if (!sym_is_choice(sym)) ++ continue; ++ prop = sym_get_choice_prop(sym); ++ for (e = prop->expr; e; e = e->left.expr) ++ if (e->right.sym->visible != no) ++ sym->flags |= e->right.sym->flags & SYMBOL_NEW; ++ } ++ ++ sym_change_count = 1; ++ ++ return 0; ++} ++ ++struct menu *next_menu(struct menu *menu) ++{ ++ if (menu->list) return menu->list; ++ do { ++ if (menu->next) { ++ menu = menu->next; ++ break; ++ } ++ } while ((menu = menu->parent)); ++ ++ return menu; ++} ++ ++#define SYMBOL_FORCEWRITE (1<<31) ++ ++int conf_write(const char *name) ++{ ++ FILE *out, *out_h; ++ struct symbol *sym; ++ struct menu *menu; ++ const char *basename; ++ char dirname[128], tmpname[128], newname[128]; ++ int type, l; ++ const char *str; ++ ++ dirname[0] = 0; ++ if (name && name[0]) { ++ struct stat st; ++ char *slash; ++ ++ if (!stat(name, &st) && S_ISDIR(st.st_mode)) { ++ strcpy(dirname, name); ++ strcat(dirname, "/"); ++ basename = conf_def_filename; ++ } else if ((slash = strrchr(name, '/'))) { ++ int size = slash - name + 1; ++ memcpy(dirname, name, size); ++ dirname[size] = 0; ++ if (slash[1]) ++ basename = slash + 1; ++ else ++ basename = conf_def_filename; ++ } else ++ basename = name; ++ } else ++ basename = conf_def_filename; ++ ++ sprintf(newname, "config/%s.tmpconfig.%d", dirname, (int)getpid()); ++ out = fopen(newname, "w"); ++ if (!out) ++ return 1; ++ out_h = NULL; ++ if (!name) { ++ out_h = fopen("config/.tmpconfig.h", "w"); ++ if (!out_h) ++ return 1; ++ } ++ fprintf(out, "#\n" ++ "# Automatically generated make config: don't edit\n" ++ "#\n"); ++ if (out_h) { ++ fprintf(out_h, "/*\n" ++ " * Automatically generated header file: don't edit\n" ++ " */\n\n"); ++#if 0 ++ "/* Version Number */\n" ++ "#define BB_VER \"%s\"\n" ++ "#define BB_BT \"%s\"\n", ++ getenv("VERSION"), ++ getenv("BUILDTIME")); ++ if (getenv("EXTRA_VERSION")) ++ fprintf(out_h, "#define BB_EXTRA_VERSION \"%s\"\n", ++ getenv("EXTRA_VERSION")); ++ fprintf(out_h, "\n"); ++#endif ++ } ++ ++ if (!sym_change_count) ++ sym_clear_all_valid(); ++ ++ /* Force write of all non-duplicate symbols. */ ++ ++ /* Write out everything by default. */ ++ for(menu = rootmenu.list; menu; menu = next_menu(menu)) ++ if (menu->sym) menu->sym->flags |= SYMBOL_FORCEWRITE; ++ ++ menu = rootmenu.list; ++ while (menu) { ++ sym = menu->sym; ++ if (!sym) { ++ if (!menu_is_visible(menu)) ++ goto next; ++ str = menu_get_prompt(menu); ++ fprintf(out, "\n" ++ "#\n" ++ "# %s\n" ++ "#\n", str); ++ if (out_h) ++ fprintf(out_h, "\n" ++ "/*\n" ++ " * %s\n" ++ " */\n", str); ++ } else if (!(sym->flags & SYMBOL_CHOICE)) { ++ sym_calc_value(sym); ++ if (!(sym->flags & SYMBOL_FORCEWRITE)) ++ goto next; ++ ++ sym->flags &= ~SYMBOL_FORCEWRITE; ++ type = sym->type; ++ if (type == S_TRISTATE) { ++ sym_calc_value(modules_sym); ++ if (modules_sym->curr.tri == no) ++ type = S_BOOLEAN; ++ } ++ switch (type) { ++ case S_BOOLEAN: ++ case S_TRISTATE: ++ switch (sym_get_tristate_value(sym)) { ++ case no: ++ fprintf(out, "# %s is not set\n", sym->name); ++ if (out_h) ++ fprintf(out_h, "#undef %s\n", sym->name); ++ break; ++ case mod: ++#if 0 ++ fprintf(out, "%s=m\n", sym->name); ++ if (out_h) ++ fprintf(out_h, "#define %s_MODULE 1\n", sym->name); ++#endif ++ break; ++ case yes: ++ fprintf(out, "%s=y\n", sym->name); ++ if (out_h) ++ fprintf(out_h, "#define %s 1\n", sym->name); ++ break; ++ } ++ break; ++ case S_STRING: ++ // fix me ++ str = sym_get_string_value(sym); ++ fprintf(out, "%s=\"", sym->name); ++ if (out_h) ++ fprintf(out_h, "#define %s \"", sym->name); ++ do { ++ l = strcspn(str, "\"\\"); ++ if (l) { ++ fwrite(str, l, 1, out); ++ if (out_h) ++ fwrite(str, l, 1, out_h); ++ } ++ str += l; ++ while (*str == '\\' || *str == '"') { ++ fprintf(out, "\\%c", *str); ++ if (out_h) ++ fprintf(out_h, "\\%c", *str); ++ str++; ++ } ++ } while (*str); ++ fputs("\"\n", out); ++ if (out_h) ++ fputs("\"\n", out_h); ++ break; ++ case S_HEX: ++ str = sym_get_string_value(sym); ++ if (str[0] != '0' || (str[1] != 'x' && str[1] != 'X')) { ++ fprintf(out, "%s=%s\n", sym->name, *str ? str : "0"); ++ if (out_h) ++ fprintf(out_h, "#define %s 0x%s\n", sym->name, str); ++ break; ++ } ++ case S_INT: ++ str = sym_get_string_value(sym); ++ fprintf(out, "%s=%s\n", sym->name, *str ? str : "0"); ++ if (out_h) ++ fprintf(out_h, "#define %s %s\n", sym->name, str); ++ break; ++ } ++ } ++next: ++ menu = next_menu(menu); ++ } ++ fclose(out); ++ if (out_h) { ++ fclose(out_h); ++ rename("config/.tmpconfig.h", "config/config.h"); ++ file_write_dep(NULL); ++ } ++ if (!name || basename != conf_def_filename) { ++ if (!name) ++ name = conf_def_filename; ++ sprintf(tmpname, "%s.old", name); ++ rename(name, tmpname); ++ } ++ sprintf(tmpname, "%s%s", dirname, basename); ++ if (rename(newname, tmpname)) ++ return 1; ++ ++ sym_change_count = 0; ++ ++ return 0; ++} +diff --git a/feeds/luci/libs/luci-lib-nixio/axTLS/config/scripts/config/expr.c b/feeds/luci/libs/luci-lib-nixio/axTLS/config/scripts/config/expr.c +new file mode 100644 +index 0000000..30e4f9d +--- /dev/null ++++ b/feeds/luci/libs/luci-lib-nixio/axTLS/config/scripts/config/expr.c +@@ -0,0 +1,1099 @@ ++/* ++ * Copyright (C) 2002 Roman Zippel ++ * Released under the terms of the GNU GPL v2.0. ++ */ ++ ++#include ++#include ++#include ++ ++#define LKC_DIRECT_LINK ++#include "lkc.h" ++ ++#define DEBUG_EXPR 0 ++ ++struct expr *expr_alloc_symbol(struct symbol *sym) ++{ ++ struct expr *e = malloc(sizeof(*e)); ++ memset(e, 0, sizeof(*e)); ++ e->type = E_SYMBOL; ++ e->left.sym = sym; ++ return e; ++} ++ ++struct expr *expr_alloc_one(enum expr_type type, struct expr *ce) ++{ ++ struct expr *e = malloc(sizeof(*e)); ++ memset(e, 0, sizeof(*e)); ++ e->type = type; ++ e->left.expr = ce; ++ return e; ++} ++ ++struct expr *expr_alloc_two(enum expr_type type, struct expr *e1, struct expr *e2) ++{ ++ struct expr *e = malloc(sizeof(*e)); ++ memset(e, 0, sizeof(*e)); ++ e->type = type; ++ e->left.expr = e1; ++ e->right.expr = e2; ++ return e; ++} ++ ++struct expr *expr_alloc_comp(enum expr_type type, struct symbol *s1, struct symbol *s2) ++{ ++ struct expr *e = malloc(sizeof(*e)); ++ memset(e, 0, sizeof(*e)); ++ e->type = type; ++ e->left.sym = s1; ++ e->right.sym = s2; ++ return e; ++} ++ ++struct expr *expr_alloc_and(struct expr *e1, struct expr *e2) ++{ ++ if (!e1) ++ return e2; ++ return e2 ? expr_alloc_two(E_AND, e1, e2) : e1; ++} ++ ++struct expr *expr_alloc_or(struct expr *e1, struct expr *e2) ++{ ++ if (!e1) ++ return e2; ++ return e2 ? expr_alloc_two(E_OR, e1, e2) : e1; ++} ++ ++struct expr *expr_copy(struct expr *org) ++{ ++ struct expr *e; ++ ++ if (!org) ++ return NULL; ++ ++ e = malloc(sizeof(*org)); ++ memcpy(e, org, sizeof(*org)); ++ switch (org->type) { ++ case E_SYMBOL: ++ e->left = org->left; ++ break; ++ case E_NOT: ++ e->left.expr = expr_copy(org->left.expr); ++ break; ++ case E_EQUAL: ++ case E_UNEQUAL: ++ e->left.sym = org->left.sym; ++ e->right.sym = org->right.sym; ++ break; ++ case E_AND: ++ case E_OR: ++ case E_CHOICE: ++ e->left.expr = expr_copy(org->left.expr); ++ e->right.expr = expr_copy(org->right.expr); ++ break; ++ default: ++ printf("can't copy type %d\n", e->type); ++ free(e); ++ e = NULL; ++ break; ++ } ++ ++ return e; ++} ++ ++void expr_free(struct expr *e) ++{ ++ if (!e) ++ return; ++ ++ switch (e->type) { ++ case E_SYMBOL: ++ break; ++ case E_NOT: ++ expr_free(e->left.expr); ++ return; ++ case E_EQUAL: ++ case E_UNEQUAL: ++ break; ++ case E_OR: ++ case E_AND: ++ expr_free(e->left.expr); ++ expr_free(e->right.expr); ++ break; ++ default: ++ printf("how to free type %d?\n", e->type); ++ break; ++ } ++ free(e); ++} ++ ++static int trans_count; ++ ++#define e1 (*ep1) ++#define e2 (*ep2) ++ ++static void __expr_eliminate_eq(enum expr_type type, struct expr **ep1, struct expr **ep2) ++{ ++ if (e1->type == type) { ++ __expr_eliminate_eq(type, &e1->left.expr, &e2); ++ __expr_eliminate_eq(type, &e1->right.expr, &e2); ++ return; ++ } ++ if (e2->type == type) { ++ __expr_eliminate_eq(type, &e1, &e2->left.expr); ++ __expr_eliminate_eq(type, &e1, &e2->right.expr); ++ return; ++ } ++ if (e1->type == E_SYMBOL && e2->type == E_SYMBOL && ++ e1->left.sym == e2->left.sym && (e1->left.sym->flags & (SYMBOL_YES|SYMBOL_NO))) ++ return; ++ if (!expr_eq(e1, e2)) ++ return; ++ trans_count++; ++ expr_free(e1); expr_free(e2); ++ switch (type) { ++ case E_OR: ++ e1 = expr_alloc_symbol(&symbol_no); ++ e2 = expr_alloc_symbol(&symbol_no); ++ break; ++ case E_AND: ++ e1 = expr_alloc_symbol(&symbol_yes); ++ e2 = expr_alloc_symbol(&symbol_yes); ++ break; ++ default: ++ ; ++ } ++} ++ ++void expr_eliminate_eq(struct expr **ep1, struct expr **ep2) ++{ ++ if (!e1 || !e2) ++ return; ++ switch (e1->type) { ++ case E_OR: ++ case E_AND: ++ __expr_eliminate_eq(e1->type, ep1, ep2); ++ default: ++ ; ++ } ++ if (e1->type != e2->type) switch (e2->type) { ++ case E_OR: ++ case E_AND: ++ __expr_eliminate_eq(e2->type, ep1, ep2); ++ default: ++ ; ++ } ++ e1 = expr_eliminate_yn(e1); ++ e2 = expr_eliminate_yn(e2); ++} ++ ++#undef e1 ++#undef e2 ++ ++int expr_eq(struct expr *e1, struct expr *e2) ++{ ++ int res, old_count; ++ ++ if (e1->type != e2->type) ++ return 0; ++ switch (e1->type) { ++ case E_EQUAL: ++ case E_UNEQUAL: ++ return e1->left.sym == e2->left.sym && e1->right.sym == e2->right.sym; ++ case E_SYMBOL: ++ return e1->left.sym == e2->left.sym; ++ case E_NOT: ++ return expr_eq(e1->left.expr, e2->left.expr); ++ case E_AND: ++ case E_OR: ++ e1 = expr_copy(e1); ++ e2 = expr_copy(e2); ++ old_count = trans_count; ++ expr_eliminate_eq(&e1, &e2); ++ res = (e1->type == E_SYMBOL && e2->type == E_SYMBOL && ++ e1->left.sym == e2->left.sym); ++ expr_free(e1); ++ expr_free(e2); ++ trans_count = old_count; ++ return res; ++ case E_CHOICE: ++ case E_RANGE: ++ case E_NONE: ++ /* panic */; ++ } ++ ++ if (DEBUG_EXPR) { ++ expr_fprint(e1, stdout); ++ printf(" = "); ++ expr_fprint(e2, stdout); ++ printf(" ?\n"); ++ } ++ ++ return 0; ++} ++ ++struct expr *expr_eliminate_yn(struct expr *e) ++{ ++ struct expr *tmp; ++ ++ if (e) switch (e->type) { ++ case E_AND: ++ e->left.expr = expr_eliminate_yn(e->left.expr); ++ e->right.expr = expr_eliminate_yn(e->right.expr); ++ if (e->left.expr->type == E_SYMBOL) { ++ if (e->left.expr->left.sym == &symbol_no) { ++ expr_free(e->left.expr); ++ expr_free(e->right.expr); ++ e->type = E_SYMBOL; ++ e->left.sym = &symbol_no; ++ e->right.expr = NULL; ++ return e; ++ } else if (e->left.expr->left.sym == &symbol_yes) { ++ free(e->left.expr); ++ tmp = e->right.expr; ++ *e = *(e->right.expr); ++ free(tmp); ++ return e; ++ } ++ } ++ if (e->right.expr->type == E_SYMBOL) { ++ if (e->right.expr->left.sym == &symbol_no) { ++ expr_free(e->left.expr); ++ expr_free(e->right.expr); ++ e->type = E_SYMBOL; ++ e->left.sym = &symbol_no; ++ e->right.expr = NULL; ++ return e; ++ } else if (e->right.expr->left.sym == &symbol_yes) { ++ free(e->right.expr); ++ tmp = e->left.expr; ++ *e = *(e->left.expr); ++ free(tmp); ++ return e; ++ } ++ } ++ break; ++ case E_OR: ++ e->left.expr = expr_eliminate_yn(e->left.expr); ++ e->right.expr = expr_eliminate_yn(e->right.expr); ++ if (e->left.expr->type == E_SYMBOL) { ++ if (e->left.expr->left.sym == &symbol_no) { ++ free(e->left.expr); ++ tmp = e->right.expr; ++ *e = *(e->right.expr); ++ free(tmp); ++ return e; ++ } else if (e->left.expr->left.sym == &symbol_yes) { ++ expr_free(e->left.expr); ++ expr_free(e->right.expr); ++ e->type = E_SYMBOL; ++ e->left.sym = &symbol_yes; ++ e->right.expr = NULL; ++ return e; ++ } ++ } ++ if (e->right.expr->type == E_SYMBOL) { ++ if (e->right.expr->left.sym == &symbol_no) { ++ free(e->right.expr); ++ tmp = e->left.expr; ++ *e = *(e->left.expr); ++ free(tmp); ++ return e; ++ } else if (e->right.expr->left.sym == &symbol_yes) { ++ expr_free(e->left.expr); ++ expr_free(e->right.expr); ++ e->type = E_SYMBOL; ++ e->left.sym = &symbol_yes; ++ e->right.expr = NULL; ++ return e; ++ } ++ } ++ break; ++ default: ++ ; ++ } ++ return e; ++} ++ ++/* ++ * bool FOO!=n => FOO ++ */ ++struct expr *expr_trans_bool(struct expr *e) ++{ ++ if (!e) ++ return NULL; ++ switch (e->type) { ++ case E_AND: ++ case E_OR: ++ case E_NOT: ++ e->left.expr = expr_trans_bool(e->left.expr); ++ e->right.expr = expr_trans_bool(e->right.expr); ++ break; ++ case E_UNEQUAL: ++ // FOO!=n -> FOO ++ if (e->left.sym->type == S_TRISTATE) { ++ if (e->right.sym == &symbol_no) { ++ e->type = E_SYMBOL; ++ e->right.sym = NULL; ++ } ++ } ++ break; ++ default: ++ ; ++ } ++ return e; ++} ++ ++/* ++ * e1 || e2 -> ? ++ */ ++struct expr *expr_join_or(struct expr *e1, struct expr *e2) ++{ ++ struct expr *tmp; ++ struct symbol *sym1, *sym2; ++ ++ if (expr_eq(e1, e2)) ++ return expr_copy(e1); ++ if (e1->type != E_EQUAL && e1->type != E_UNEQUAL && e1->type != E_SYMBOL && e1->type != E_NOT) ++ return NULL; ++ if (e2->type != E_EQUAL && e2->type != E_UNEQUAL && e2->type != E_SYMBOL && e2->type != E_NOT) ++ return NULL; ++ if (e1->type == E_NOT) { ++ tmp = e1->left.expr; ++ if (tmp->type != E_EQUAL && tmp->type != E_UNEQUAL && tmp->type != E_SYMBOL) ++ return NULL; ++ sym1 = tmp->left.sym; ++ } else ++ sym1 = e1->left.sym; ++ if (e2->type == E_NOT) { ++ if (e2->left.expr->type != E_SYMBOL) ++ return NULL; ++ sym2 = e2->left.expr->left.sym; ++ } else ++ sym2 = e2->left.sym; ++ if (sym1 != sym2) ++ return NULL; ++ if (sym1->type != S_BOOLEAN && sym1->type != S_TRISTATE) ++ return NULL; ++ if (sym1->type == S_TRISTATE) { ++ if (e1->type == E_EQUAL && e2->type == E_EQUAL && ++ ((e1->right.sym == &symbol_yes && e2->right.sym == &symbol_mod) || ++ (e1->right.sym == &symbol_mod && e2->right.sym == &symbol_yes))) { ++ // (a='y') || (a='m') -> (a!='n') ++ return expr_alloc_comp(E_UNEQUAL, sym1, &symbol_no); ++ } ++ if (e1->type == E_EQUAL && e2->type == E_EQUAL && ++ ((e1->right.sym == &symbol_yes && e2->right.sym == &symbol_no) || ++ (e1->right.sym == &symbol_no && e2->right.sym == &symbol_yes))) { ++ // (a='y') || (a='n') -> (a!='m') ++ return expr_alloc_comp(E_UNEQUAL, sym1, &symbol_mod); ++ } ++ if (e1->type == E_EQUAL && e2->type == E_EQUAL && ++ ((e1->right.sym == &symbol_mod && e2->right.sym == &symbol_no) || ++ (e1->right.sym == &symbol_no && e2->right.sym == &symbol_mod))) { ++ // (a='m') || (a='n') -> (a!='y') ++ return expr_alloc_comp(E_UNEQUAL, sym1, &symbol_yes); ++ } ++ } ++ if (sym1->type == S_BOOLEAN && sym1 == sym2) { ++ if ((e1->type == E_NOT && e1->left.expr->type == E_SYMBOL && e2->type == E_SYMBOL) || ++ (e2->type == E_NOT && e2->left.expr->type == E_SYMBOL && e1->type == E_SYMBOL)) ++ return expr_alloc_symbol(&symbol_yes); ++ } ++ ++ if (DEBUG_EXPR) { ++ printf("optimize ("); ++ expr_fprint(e1, stdout); ++ printf(") || ("); ++ expr_fprint(e2, stdout); ++ printf(")?\n"); ++ } ++ return NULL; ++} ++ ++struct expr *expr_join_and(struct expr *e1, struct expr *e2) ++{ ++ struct expr *tmp; ++ struct symbol *sym1, *sym2; ++ ++ if (expr_eq(e1, e2)) ++ return expr_copy(e1); ++ if (e1->type != E_EQUAL && e1->type != E_UNEQUAL && e1->type != E_SYMBOL && e1->type != E_NOT) ++ return NULL; ++ if (e2->type != E_EQUAL && e2->type != E_UNEQUAL && e2->type != E_SYMBOL && e2->type != E_NOT) ++ return NULL; ++ if (e1->type == E_NOT) { ++ tmp = e1->left.expr; ++ if (tmp->type != E_EQUAL && tmp->type != E_UNEQUAL && tmp->type != E_SYMBOL) ++ return NULL; ++ sym1 = tmp->left.sym; ++ } else ++ sym1 = e1->left.sym; ++ if (e2->type == E_NOT) { ++ if (e2->left.expr->type != E_SYMBOL) ++ return NULL; ++ sym2 = e2->left.expr->left.sym; ++ } else ++ sym2 = e2->left.sym; ++ if (sym1 != sym2) ++ return NULL; ++ if (sym1->type != S_BOOLEAN && sym1->type != S_TRISTATE) ++ return NULL; ++ ++ if ((e1->type == E_SYMBOL && e2->type == E_EQUAL && e2->right.sym == &symbol_yes) || ++ (e2->type == E_SYMBOL && e1->type == E_EQUAL && e1->right.sym == &symbol_yes)) ++ // (a) && (a='y') -> (a='y') ++ return expr_alloc_comp(E_EQUAL, sym1, &symbol_yes); ++ ++ if ((e1->type == E_SYMBOL && e2->type == E_UNEQUAL && e2->right.sym == &symbol_no) || ++ (e2->type == E_SYMBOL && e1->type == E_UNEQUAL && e1->right.sym == &symbol_no)) ++ // (a) && (a!='n') -> (a) ++ return expr_alloc_symbol(sym1); ++ ++ if ((e1->type == E_SYMBOL && e2->type == E_UNEQUAL && e2->right.sym == &symbol_mod) || ++ (e2->type == E_SYMBOL && e1->type == E_UNEQUAL && e1->right.sym == &symbol_mod)) ++ // (a) && (a!='m') -> (a='y') ++ return expr_alloc_comp(E_EQUAL, sym1, &symbol_yes); ++ ++ if (sym1->type == S_TRISTATE) { ++ if (e1->type == E_EQUAL && e2->type == E_UNEQUAL) { ++ // (a='b') && (a!='c') -> 'b'='c' ? 'n' : a='b' ++ sym2 = e1->right.sym; ++ if ((e2->right.sym->flags & SYMBOL_CONST) && (sym2->flags & SYMBOL_CONST)) ++ return sym2 != e2->right.sym ? expr_alloc_comp(E_EQUAL, sym1, sym2) ++ : expr_alloc_symbol(&symbol_no); ++ } ++ if (e1->type == E_UNEQUAL && e2->type == E_EQUAL) { ++ // (a='b') && (a!='c') -> 'b'='c' ? 'n' : a='b' ++ sym2 = e2->right.sym; ++ if ((e1->right.sym->flags & SYMBOL_CONST) && (sym2->flags & SYMBOL_CONST)) ++ return sym2 != e1->right.sym ? expr_alloc_comp(E_EQUAL, sym1, sym2) ++ : expr_alloc_symbol(&symbol_no); ++ } ++ if (e1->type == E_UNEQUAL && e2->type == E_UNEQUAL && ++ ((e1->right.sym == &symbol_yes && e2->right.sym == &symbol_no) || ++ (e1->right.sym == &symbol_no && e2->right.sym == &symbol_yes))) ++ // (a!='y') && (a!='n') -> (a='m') ++ return expr_alloc_comp(E_EQUAL, sym1, &symbol_mod); ++ ++ if (e1->type == E_UNEQUAL && e2->type == E_UNEQUAL && ++ ((e1->right.sym == &symbol_yes && e2->right.sym == &symbol_mod) || ++ (e1->right.sym == &symbol_mod && e2->right.sym == &symbol_yes))) ++ // (a!='y') && (a!='m') -> (a='n') ++ return expr_alloc_comp(E_EQUAL, sym1, &symbol_no); ++ ++ if (e1->type == E_UNEQUAL && e2->type == E_UNEQUAL && ++ ((e1->right.sym == &symbol_mod && e2->right.sym == &symbol_no) || ++ (e1->right.sym == &symbol_no && e2->right.sym == &symbol_mod))) ++ // (a!='m') && (a!='n') -> (a='m') ++ return expr_alloc_comp(E_EQUAL, sym1, &symbol_yes); ++ ++ if ((e1->type == E_SYMBOL && e2->type == E_EQUAL && e2->right.sym == &symbol_mod) || ++ (e2->type == E_SYMBOL && e1->type == E_EQUAL && e1->right.sym == &symbol_mod) || ++ (e1->type == E_SYMBOL && e2->type == E_UNEQUAL && e2->right.sym == &symbol_yes) || ++ (e2->type == E_SYMBOL && e1->type == E_UNEQUAL && e1->right.sym == &symbol_yes)) ++ return NULL; ++ } ++ ++ if (DEBUG_EXPR) { ++ printf("optimize ("); ++ expr_fprint(e1, stdout); ++ printf(") && ("); ++ expr_fprint(e2, stdout); ++ printf(")?\n"); ++ } ++ return NULL; ++} ++ ++static void expr_eliminate_dups1(enum expr_type type, struct expr **ep1, struct expr **ep2) ++{ ++#define e1 (*ep1) ++#define e2 (*ep2) ++ struct expr *tmp; ++ ++ if (e1->type == type) { ++ expr_eliminate_dups1(type, &e1->left.expr, &e2); ++ expr_eliminate_dups1(type, &e1->right.expr, &e2); ++ return; ++ } ++ if (e2->type == type) { ++ expr_eliminate_dups1(type, &e1, &e2->left.expr); ++ expr_eliminate_dups1(type, &e1, &e2->right.expr); ++ return; ++ } ++ if (e1 == e2) ++ return; ++ ++ switch (e1->type) { ++ case E_OR: case E_AND: ++ expr_eliminate_dups1(e1->type, &e1, &e1); ++ default: ++ ; ++ } ++ ++ switch (type) { ++ case E_OR: ++ tmp = expr_join_or(e1, e2); ++ if (tmp) { ++ expr_free(e1); expr_free(e2); ++ e1 = expr_alloc_symbol(&symbol_no); ++ e2 = tmp; ++ trans_count++; ++ } ++ break; ++ case E_AND: ++ tmp = expr_join_and(e1, e2); ++ if (tmp) { ++ expr_free(e1); expr_free(e2); ++ e1 = expr_alloc_symbol(&symbol_yes); ++ e2 = tmp; ++ trans_count++; ++ } ++ break; ++ default: ++ ; ++ } ++#undef e1 ++#undef e2 ++} ++ ++static void expr_eliminate_dups2(enum expr_type type, struct expr **ep1, struct expr **ep2) ++{ ++#define e1 (*ep1) ++#define e2 (*ep2) ++ struct expr *tmp, *tmp1, *tmp2; ++ ++ if (e1->type == type) { ++ expr_eliminate_dups2(type, &e1->left.expr, &e2); ++ expr_eliminate_dups2(type, &e1->right.expr, &e2); ++ return; ++ } ++ if (e2->type == type) { ++ expr_eliminate_dups2(type, &e1, &e2->left.expr); ++ expr_eliminate_dups2(type, &e1, &e2->right.expr); ++ } ++ if (e1 == e2) ++ return; ++ ++ switch (e1->type) { ++ case E_OR: ++ expr_eliminate_dups2(e1->type, &e1, &e1); ++ // (FOO || BAR) && (!FOO && !BAR) -> n ++ tmp1 = expr_transform(expr_alloc_one(E_NOT, expr_copy(e1))); ++ tmp2 = expr_copy(e2); ++ tmp = expr_extract_eq_and(&tmp1, &tmp2); ++ if (expr_is_yes(tmp1)) { ++ expr_free(e1); ++ e1 = expr_alloc_symbol(&symbol_no); ++ trans_count++; ++ } ++ expr_free(tmp2); ++ expr_free(tmp1); ++ expr_free(tmp); ++ break; ++ case E_AND: ++ expr_eliminate_dups2(e1->type, &e1, &e1); ++ // (FOO && BAR) || (!FOO || !BAR) -> y ++ tmp1 = expr_transform(expr_alloc_one(E_NOT, expr_copy(e1))); ++ tmp2 = expr_copy(e2); ++ tmp = expr_extract_eq_or(&tmp1, &tmp2); ++ if (expr_is_no(tmp1)) { ++ expr_free(e1); ++ e1 = expr_alloc_symbol(&symbol_yes); ++ trans_count++; ++ } ++ expr_free(tmp2); ++ expr_free(tmp1); ++ expr_free(tmp); ++ break; ++ default: ++ ; ++ } ++#undef e1 ++#undef e2 ++} ++ ++struct expr *expr_eliminate_dups(struct expr *e) ++{ ++ int oldcount; ++ if (!e) ++ return e; ++ ++ oldcount = trans_count; ++ while (1) { ++ trans_count = 0; ++ switch (e->type) { ++ case E_OR: case E_AND: ++ expr_eliminate_dups1(e->type, &e, &e); ++ expr_eliminate_dups2(e->type, &e, &e); ++ default: ++ ; ++ } ++ if (!trans_count) ++ break; ++ e = expr_eliminate_yn(e); ++ } ++ trans_count = oldcount; ++ return e; ++} ++ ++struct expr *expr_transform(struct expr *e) ++{ ++ struct expr *tmp; ++ ++ if (!e) ++ return NULL; ++ switch (e->type) { ++ case E_EQUAL: ++ case E_UNEQUAL: ++ case E_SYMBOL: ++ case E_CHOICE: ++ break; ++ default: ++ e->left.expr = expr_transform(e->left.expr); ++ e->right.expr = expr_transform(e->right.expr); ++ } ++ ++ switch (e->type) { ++ case E_EQUAL: ++ if (e->left.sym->type != S_BOOLEAN) ++ break; ++ if (e->right.sym == &symbol_no) { ++ e->type = E_NOT; ++ e->left.expr = expr_alloc_symbol(e->left.sym); ++ e->right.sym = NULL; ++ break; ++ } ++ if (e->right.sym == &symbol_mod) { ++ printf("boolean symbol %s tested for 'm'? test forced to 'n'\n", e->left.sym->name); ++ e->type = E_SYMBOL; ++ e->left.sym = &symbol_no; ++ e->right.sym = NULL; ++ break; ++ } ++ if (e->right.sym == &symbol_yes) { ++ e->type = E_SYMBOL; ++ e->right.sym = NULL; ++ break; ++ } ++ break; ++ case E_UNEQUAL: ++ if (e->left.sym->type != S_BOOLEAN) ++ break; ++ if (e->right.sym == &symbol_no) { ++ e->type = E_SYMBOL; ++ e->right.sym = NULL; ++ break; ++ } ++ if (e->right.sym == &symbol_mod) { ++ printf("boolean symbol %s tested for 'm'? test forced to 'y'\n", e->left.sym->name); ++ e->type = E_SYMBOL; ++ e->left.sym = &symbol_yes; ++ e->right.sym = NULL; ++ break; ++ } ++ if (e->right.sym == &symbol_yes) { ++ e->type = E_NOT; ++ e->left.expr = expr_alloc_symbol(e->left.sym); ++ e->right.sym = NULL; ++ break; ++ } ++ break; ++ case E_NOT: ++ switch (e->left.expr->type) { ++ case E_NOT: ++ // !!a -> a ++ tmp = e->left.expr->left.expr; ++ free(e->left.expr); ++ free(e); ++ e = tmp; ++ e = expr_transform(e); ++ break; ++ case E_EQUAL: ++ case E_UNEQUAL: ++ // !a='x' -> a!='x' ++ tmp = e->left.expr; ++ free(e); ++ e = tmp; ++ e->type = e->type == E_EQUAL ? E_UNEQUAL : E_EQUAL; ++ break; ++ case E_OR: ++ // !(a || b) -> !a && !b ++ tmp = e->left.expr; ++ e->type = E_AND; ++ e->right.expr = expr_alloc_one(E_NOT, tmp->right.expr); ++ tmp->type = E_NOT; ++ tmp->right.expr = NULL; ++ e = expr_transform(e); ++ break; ++ case E_AND: ++ // !(a && b) -> !a || !b ++ tmp = e->left.expr; ++ e->type = E_OR; ++ e->right.expr = expr_alloc_one(E_NOT, tmp->right.expr); ++ tmp->type = E_NOT; ++ tmp->right.expr = NULL; ++ e = expr_transform(e); ++ break; ++ case E_SYMBOL: ++ if (e->left.expr->left.sym == &symbol_yes) { ++ // !'y' -> 'n' ++ tmp = e->left.expr; ++ free(e); ++ e = tmp; ++ e->type = E_SYMBOL; ++ e->left.sym = &symbol_no; ++ break; ++ } ++ if (e->left.expr->left.sym == &symbol_mod) { ++ // !'m' -> 'm' ++ tmp = e->left.expr; ++ free(e); ++ e = tmp; ++ e->type = E_SYMBOL; ++ e->left.sym = &symbol_mod; ++ break; ++ } ++ if (e->left.expr->left.sym == &symbol_no) { ++ // !'n' -> 'y' ++ tmp = e->left.expr; ++ free(e); ++ e = tmp; ++ e->type = E_SYMBOL; ++ e->left.sym = &symbol_yes; ++ break; ++ } ++ break; ++ default: ++ ; ++ } ++ break; ++ default: ++ ; ++ } ++ return e; ++} ++ ++int expr_contains_symbol(struct expr *dep, struct symbol *sym) ++{ ++ if (!dep) ++ return 0; ++ ++ switch (dep->type) { ++ case E_AND: ++ case E_OR: ++ return expr_contains_symbol(dep->left.expr, sym) || ++ expr_contains_symbol(dep->right.expr, sym); ++ case E_SYMBOL: ++ return dep->left.sym == sym; ++ case E_EQUAL: ++ case E_UNEQUAL: ++ return dep->left.sym == sym || ++ dep->right.sym == sym; ++ case E_NOT: ++ return expr_contains_symbol(dep->left.expr, sym); ++ default: ++ ; ++ } ++ return 0; ++} ++ ++bool expr_depends_symbol(struct expr *dep, struct symbol *sym) ++{ ++ if (!dep) ++ return false; ++ ++ switch (dep->type) { ++ case E_AND: ++ return expr_depends_symbol(dep->left.expr, sym) || ++ expr_depends_symbol(dep->right.expr, sym); ++ case E_SYMBOL: ++ return dep->left.sym == sym; ++ case E_EQUAL: ++ if (dep->left.sym == sym) { ++ if (dep->right.sym == &symbol_yes || dep->right.sym == &symbol_mod) ++ return true; ++ } ++ break; ++ case E_UNEQUAL: ++ if (dep->left.sym == sym) { ++ if (dep->right.sym == &symbol_no) ++ return true; ++ } ++ break; ++ default: ++ ; ++ } ++ return false; ++} ++ ++struct expr *expr_extract_eq_and(struct expr **ep1, struct expr **ep2) ++{ ++ struct expr *tmp = NULL; ++ expr_extract_eq(E_AND, &tmp, ep1, ep2); ++ if (tmp) { ++ *ep1 = expr_eliminate_yn(*ep1); ++ *ep2 = expr_eliminate_yn(*ep2); ++ } ++ return tmp; ++} ++ ++struct expr *expr_extract_eq_or(struct expr **ep1, struct expr **ep2) ++{ ++ struct expr *tmp = NULL; ++ expr_extract_eq(E_OR, &tmp, ep1, ep2); ++ if (tmp) { ++ *ep1 = expr_eliminate_yn(*ep1); ++ *ep2 = expr_eliminate_yn(*ep2); ++ } ++ return tmp; ++} ++ ++void expr_extract_eq(enum expr_type type, struct expr **ep, struct expr **ep1, struct expr **ep2) ++{ ++#define e1 (*ep1) ++#define e2 (*ep2) ++ if (e1->type == type) { ++ expr_extract_eq(type, ep, &e1->left.expr, &e2); ++ expr_extract_eq(type, ep, &e1->right.expr, &e2); ++ return; ++ } ++ if (e2->type == type) { ++ expr_extract_eq(type, ep, ep1, &e2->left.expr); ++ expr_extract_eq(type, ep, ep1, &e2->right.expr); ++ return; ++ } ++ if (expr_eq(e1, e2)) { ++ *ep = *ep ? expr_alloc_two(type, *ep, e1) : e1; ++ expr_free(e2); ++ if (type == E_AND) { ++ e1 = expr_alloc_symbol(&symbol_yes); ++ e2 = expr_alloc_symbol(&symbol_yes); ++ } else if (type == E_OR) { ++ e1 = expr_alloc_symbol(&symbol_no); ++ e2 = expr_alloc_symbol(&symbol_no); ++ } ++ } ++#undef e1 ++#undef e2 ++} ++ ++struct expr *expr_trans_compare(struct expr *e, enum expr_type type, struct symbol *sym) ++{ ++ struct expr *e1, *e2; ++ ++ if (!e) { ++ e = expr_alloc_symbol(sym); ++ if (type == E_UNEQUAL) ++ e = expr_alloc_one(E_NOT, e); ++ return e; ++ } ++ switch (e->type) { ++ case E_AND: ++ e1 = expr_trans_compare(e->left.expr, E_EQUAL, sym); ++ e2 = expr_trans_compare(e->right.expr, E_EQUAL, sym); ++ if (sym == &symbol_yes) ++ e = expr_alloc_two(E_AND, e1, e2); ++ if (sym == &symbol_no) ++ e = expr_alloc_two(E_OR, e1, e2); ++ if (type == E_UNEQUAL) ++ e = expr_alloc_one(E_NOT, e); ++ return e; ++ case E_OR: ++ e1 = expr_trans_compare(e->left.expr, E_EQUAL, sym); ++ e2 = expr_trans_compare(e->right.expr, E_EQUAL, sym); ++ if (sym == &symbol_yes) ++ e = expr_alloc_two(E_OR, e1, e2); ++ if (sym == &symbol_no) ++ e = expr_alloc_two(E_AND, e1, e2); ++ if (type == E_UNEQUAL) ++ e = expr_alloc_one(E_NOT, e); ++ return e; ++ case E_NOT: ++ return expr_trans_compare(e->left.expr, type == E_EQUAL ? E_UNEQUAL : E_EQUAL, sym); ++ case E_UNEQUAL: ++ case E_EQUAL: ++ if (type == E_EQUAL) { ++ if (sym == &symbol_yes) ++ return expr_copy(e); ++ if (sym == &symbol_mod) ++ return expr_alloc_symbol(&symbol_no); ++ if (sym == &symbol_no) ++ return expr_alloc_one(E_NOT, expr_copy(e)); ++ } else { ++ if (sym == &symbol_yes) ++ return expr_alloc_one(E_NOT, expr_copy(e)); ++ if (sym == &symbol_mod) ++ return expr_alloc_symbol(&symbol_yes); ++ if (sym == &symbol_no) ++ return expr_copy(e); ++ } ++ break; ++ case E_SYMBOL: ++ return expr_alloc_comp(type, e->left.sym, sym); ++ case E_CHOICE: ++ case E_RANGE: ++ case E_NONE: ++ /* panic */; ++ } ++ return NULL; ++} ++ ++tristate expr_calc_value(struct expr *e) ++{ ++ tristate val1, val2; ++ const char *str1, *str2; ++ ++ if (!e) ++ return yes; ++ ++ switch (e->type) { ++ case E_SYMBOL: ++ sym_calc_value(e->left.sym); ++ return e->left.sym->curr.tri; ++ case E_AND: ++ val1 = expr_calc_value(e->left.expr); ++ val2 = expr_calc_value(e->right.expr); ++ return E_AND(val1, val2); ++ case E_OR: ++ val1 = expr_calc_value(e->left.expr); ++ val2 = expr_calc_value(e->right.expr); ++ return E_OR(val1, val2); ++ case E_NOT: ++ val1 = expr_calc_value(e->left.expr); ++ return E_NOT(val1); ++ case E_EQUAL: ++ sym_calc_value(e->left.sym); ++ sym_calc_value(e->right.sym); ++ str1 = sym_get_string_value(e->left.sym); ++ str2 = sym_get_string_value(e->right.sym); ++ return !strcmp(str1, str2) ? yes : no; ++ case E_UNEQUAL: ++ sym_calc_value(e->left.sym); ++ sym_calc_value(e->right.sym); ++ str1 = sym_get_string_value(e->left.sym); ++ str2 = sym_get_string_value(e->right.sym); ++ return !strcmp(str1, str2) ? no : yes; ++ default: ++ printf("expr_calc_value: %d?\n", e->type); ++ return no; ++ } ++} ++ ++int expr_compare_type(enum expr_type t1, enum expr_type t2) ++{ ++#if 0 ++ return 1; ++#else ++ if (t1 == t2) ++ return 0; ++ switch (t1) { ++ case E_EQUAL: ++ case E_UNEQUAL: ++ if (t2 == E_NOT) ++ return 1; ++ case E_NOT: ++ if (t2 == E_AND) ++ return 1; ++ case E_AND: ++ if (t2 == E_OR) ++ return 1; ++ case E_OR: ++ if (t2 == E_CHOICE) ++ return 1; ++ case E_CHOICE: ++ if (t2 == 0) ++ return 1; ++ default: ++ return -1; ++ } ++ printf("[%dgt%d?]", t1, t2); ++ return 0; ++#endif ++} ++ ++void expr_print(struct expr *e, void (*fn)(void *, const char *), void *data, int prevtoken) ++{ ++ if (!e) { ++ fn(data, "y"); ++ return; ++ } ++ ++ if (expr_compare_type(prevtoken, e->type) > 0) ++ fn(data, "("); ++ switch (e->type) { ++ case E_SYMBOL: ++ if (e->left.sym->name) ++ fn(data, e->left.sym->name); ++ else ++ fn(data, ""); ++ break; ++ case E_NOT: ++ fn(data, "!"); ++ expr_print(e->left.expr, fn, data, E_NOT); ++ break; ++ case E_EQUAL: ++ fn(data, e->left.sym->name); ++ fn(data, "="); ++ fn(data, e->right.sym->name); ++ break; ++ case E_UNEQUAL: ++ fn(data, e->left.sym->name); ++ fn(data, "!="); ++ fn(data, e->right.sym->name); ++ break; ++ case E_OR: ++ expr_print(e->left.expr, fn, data, E_OR); ++ fn(data, " || "); ++ expr_print(e->right.expr, fn, data, E_OR); ++ break; ++ case E_AND: ++ expr_print(e->left.expr, fn, data, E_AND); ++ fn(data, " && "); ++ expr_print(e->right.expr, fn, data, E_AND); ++ break; ++ case E_CHOICE: ++ fn(data, e->right.sym->name); ++ if (e->left.expr) { ++ fn(data, " ^ "); ++ expr_print(e->left.expr, fn, data, E_CHOICE); ++ } ++ break; ++ case E_RANGE: ++ fn(data, "["); ++ fn(data, e->left.sym->name); ++ fn(data, " "); ++ fn(data, e->right.sym->name); ++ fn(data, "]"); ++ break; ++ default: ++ { ++ char buf[32]; ++ sprintf(buf, "", e->type); ++ fn(data, buf); ++ break; ++ } ++ } ++ if (expr_compare_type(prevtoken, e->type) > 0) ++ fn(data, ")"); ++} ++ ++static void expr_print_file_helper(void *data, const char *str) ++{ ++ fwrite(str, strlen(str), 1, data); ++} ++ ++void expr_fprint(struct expr *e, FILE *out) ++{ ++ expr_print(e, expr_print_file_helper, out, E_NONE); ++} ++ ++static void expr_print_gstr_helper(void *data, const char *str) ++{ ++ str_append((struct gstr*)data, str); ++} ++ ++void expr_gstr_print(struct expr *e, struct gstr *gs) ++{ ++ expr_print(e, expr_print_gstr_helper, gs, E_NONE); ++} +diff --git a/feeds/luci/libs/luci-lib-nixio/axTLS/config/scripts/config/expr.h b/feeds/luci/libs/luci-lib-nixio/axTLS/config/scripts/config/expr.h +new file mode 100644 +index 0000000..7d39ff4 +--- /dev/null ++++ b/feeds/luci/libs/luci-lib-nixio/axTLS/config/scripts/config/expr.h +@@ -0,0 +1,195 @@ ++/* ++ * Copyright (C) 2002 Roman Zippel ++ * Released under the terms of the GNU GPL v2.0. ++ */ ++ ++#ifndef EXPR_H ++#define EXPR_H ++ ++#ifdef __cplusplus ++extern "C" { ++#endif ++ ++#include ++#ifndef __cplusplus ++#include ++#endif ++ ++struct file { ++ struct file *next; ++ struct file *parent; ++ char *name; ++ int lineno; ++ int flags; ++}; ++ ++#define FILE_BUSY 0x0001 ++#define FILE_SCANNED 0x0002 ++#define FILE_PRINTED 0x0004 ++ ++typedef enum tristate { ++ no, mod, yes ++} tristate; ++ ++enum expr_type { ++ E_NONE, E_OR, E_AND, E_NOT, E_EQUAL, E_UNEQUAL, E_CHOICE, E_SYMBOL, E_RANGE ++}; ++ ++union expr_data { ++ struct expr *expr; ++ struct symbol *sym; ++}; ++ ++struct expr { ++ enum expr_type type; ++ union expr_data left, right; ++}; ++ ++#define E_OR(dep1, dep2) (((dep1)>(dep2))?(dep1):(dep2)) ++#define E_AND(dep1, dep2) (((dep1)<(dep2))?(dep1):(dep2)) ++#define E_NOT(dep) (2-(dep)) ++ ++struct expr_value { ++ struct expr *expr; ++ tristate tri; ++}; ++ ++struct symbol_value { ++ void *val; ++ tristate tri; ++}; ++ ++enum symbol_type { ++ S_UNKNOWN, S_BOOLEAN, S_TRISTATE, S_INT, S_HEX, S_STRING, S_OTHER ++}; ++ ++struct symbol { ++ struct symbol *next; ++ char *name; ++ char *help; ++ enum symbol_type type; ++ struct symbol_value curr, user; ++ tristate visible; ++ int flags; ++ struct property *prop; ++ struct expr *dep, *dep2; ++ struct expr_value rev_dep; ++}; ++ ++#define for_all_symbols(i, sym) for (i = 0; i < 257; i++) for (sym = symbol_hash[i]; sym; sym = sym->next) if (sym->type != S_OTHER) ++ ++#define SYMBOL_YES 0x0001 ++#define SYMBOL_MOD 0x0002 ++#define SYMBOL_NO 0x0004 ++#define SYMBOL_CONST 0x0007 ++#define SYMBOL_CHECK 0x0008 ++#define SYMBOL_CHOICE 0x0010 ++#define SYMBOL_CHOICEVAL 0x0020 ++#define SYMBOL_PRINTED 0x0040 ++#define SYMBOL_VALID 0x0080 ++#define SYMBOL_OPTIONAL 0x0100 ++#define SYMBOL_WRITE 0x0200 ++#define SYMBOL_CHANGED 0x0400 ++#define SYMBOL_NEW 0x0800 ++#define SYMBOL_AUTO 0x1000 ++#define SYMBOL_CHECKED 0x2000 ++#define SYMBOL_CHECK_DONE 0x4000 ++#define SYMBOL_WARNED 0x8000 ++ ++#define SYMBOL_MAXLENGTH 256 ++#define SYMBOL_HASHSIZE 257 ++#define SYMBOL_HASHMASK 0xff ++ ++enum prop_type { ++ P_UNKNOWN, P_PROMPT, P_COMMENT, P_MENU, P_DEFAULT, P_CHOICE, P_SELECT, P_RANGE ++}; ++ ++struct property { ++ struct property *next; ++ struct symbol *sym; ++ enum prop_type type; ++ const char *text; ++ struct expr_value visible; ++ struct expr *expr; ++ struct menu *menu; ++ struct file *file; ++ int lineno; ++}; ++ ++#define for_all_properties(sym, st, tok) \ ++ for (st = sym->prop; st; st = st->next) \ ++ if (st->type == (tok)) ++#define for_all_defaults(sym, st) for_all_properties(sym, st, P_DEFAULT) ++#define for_all_choices(sym, st) for_all_properties(sym, st, P_CHOICE) ++#define for_all_prompts(sym, st) \ ++ for (st = sym->prop; st; st = st->next) \ ++ if (st->text) ++ ++struct menu { ++ struct menu *next; ++ struct menu *parent; ++ struct menu *list; ++ struct symbol *sym; ++ struct property *prompt; ++ struct expr *dep; ++ unsigned int flags; ++ //char *help; ++ struct file *file; ++ int lineno; ++ void *data; ++}; ++ ++#define MENU_CHANGED 0x0001 ++#define MENU_ROOT 0x0002 ++ ++#ifndef SWIG ++ ++extern struct file *file_list; ++extern struct file *current_file; ++struct file *lookup_file(const char *name); ++ ++extern struct symbol symbol_yes, symbol_no, symbol_mod; ++extern struct symbol *modules_sym; ++extern int cdebug; ++struct expr *expr_alloc_symbol(struct symbol *sym); ++struct expr *expr_alloc_one(enum expr_type type, struct expr *ce); ++struct expr *expr_alloc_two(enum expr_type type, struct expr *e1, struct expr *e2); ++struct expr *expr_alloc_comp(enum expr_type type, struct symbol *s1, struct symbol *s2); ++struct expr *expr_alloc_and(struct expr *e1, struct expr *e2); ++struct expr *expr_alloc_or(struct expr *e1, struct expr *e2); ++struct expr *expr_copy(struct expr *org); ++void expr_free(struct expr *e); ++int expr_eq(struct expr *e1, struct expr *e2); ++void expr_eliminate_eq(struct expr **ep1, struct expr **ep2); ++tristate expr_calc_value(struct expr *e); ++struct expr *expr_eliminate_yn(struct expr *e); ++struct expr *expr_trans_bool(struct expr *e); ++struct expr *expr_eliminate_dups(struct expr *e); ++struct expr *expr_transform(struct expr *e); ++int expr_contains_symbol(struct expr *dep, struct symbol *sym); ++bool expr_depends_symbol(struct expr *dep, struct symbol *sym); ++struct expr *expr_extract_eq_and(struct expr **ep1, struct expr **ep2); ++struct expr *expr_extract_eq_or(struct expr **ep1, struct expr **ep2); ++void expr_extract_eq(enum expr_type type, struct expr **ep, struct expr **ep1, struct expr **ep2); ++struct expr *expr_trans_compare(struct expr *e, enum expr_type type, struct symbol *sym); ++ ++void expr_fprint(struct expr *e, FILE *out); ++struct gstr; /* forward */ ++void expr_gstr_print(struct expr *e, struct gstr *gs); ++ ++static inline int expr_is_yes(struct expr *e) ++{ ++ return !e || (e->type == E_SYMBOL && e->left.sym == &symbol_yes); ++} ++ ++static inline int expr_is_no(struct expr *e) ++{ ++ return e && (e->type == E_SYMBOL && e->left.sym == &symbol_no); ++} ++#endif ++ ++#ifdef __cplusplus ++} ++#endif ++ ++#endif /* EXPR_H */ +diff --git a/feeds/luci/libs/luci-lib-nixio/axTLS/config/scripts/config/lex.zconf.c_shipped b/feeds/luci/libs/luci-lib-nixio/axTLS/config/scripts/config/lex.zconf.c_shipped +new file mode 100644 +index 0000000..b877bb6 +--- /dev/null ++++ b/feeds/luci/libs/luci-lib-nixio/axTLS/config/scripts/config/lex.zconf.c_shipped +@@ -0,0 +1,3688 @@ ++ ++#line 3 "lex.zconf.c" ++ ++#define YY_INT_ALIGNED short int ++ ++/* A lexical scanner generated by flex */ ++ ++#define FLEX_SCANNER ++#define YY_FLEX_MAJOR_VERSION 2 ++#define YY_FLEX_MINOR_VERSION 5 ++#define YY_FLEX_SUBMINOR_VERSION 31 ++#if YY_FLEX_SUBMINOR_VERSION > 0 ++#define FLEX_BETA ++#endif ++ ++/* First, we deal with platform-specific or compiler-specific issues. */ ++ ++/* begin standard C headers. */ ++#include ++#include ++#include ++#include ++ ++/* end standard C headers. */ ++ ++/* flex integer type definitions */ ++ ++#ifndef FLEXINT_H ++#define FLEXINT_H ++ ++/* C99 systems have . Non-C99 systems may or may not. */ ++ ++#if defined __STDC_VERSION__ && __STDC_VERSION__ >= 199901L ++#include ++typedef int8_t flex_int8_t; ++typedef uint8_t flex_uint8_t; ++typedef int16_t flex_int16_t; ++typedef uint16_t flex_uint16_t; ++typedef int32_t flex_int32_t; ++typedef uint32_t flex_uint32_t; ++#else ++typedef signed char flex_int8_t; ++typedef short int flex_int16_t; ++typedef int flex_int32_t; ++typedef unsigned char flex_uint8_t; ++typedef unsigned short int flex_uint16_t; ++typedef unsigned int flex_uint32_t; ++#endif /* ! C99 */ ++ ++/* Limits of integral types. */ ++#ifndef INT8_MIN ++#define INT8_MIN (-128) ++#endif ++#ifndef INT16_MIN ++#define INT16_MIN (-32767-1) ++#endif ++#ifndef INT32_MIN ++#define INT32_MIN (-2147483647-1) ++#endif ++#ifndef INT8_MAX ++#define INT8_MAX (127) ++#endif ++#ifndef INT16_MAX ++#define INT16_MAX (32767) ++#endif ++#ifndef INT32_MAX ++#define INT32_MAX (2147483647) ++#endif ++#ifndef UINT8_MAX ++#define UINT8_MAX (255U) ++#endif ++#ifndef UINT16_MAX ++#define UINT16_MAX (65535U) ++#endif ++#ifndef UINT32_MAX ++#define UINT32_MAX (4294967295U) ++#endif ++ ++#endif /* ! FLEXINT_H */ ++ ++#ifdef __cplusplus ++ ++/* The "const" storage-class-modifier is valid. */ ++#define YY_USE_CONST ++ ++#else /* ! __cplusplus */ ++ ++#if __STDC__ ++ ++#define YY_USE_CONST ++ ++#endif /* __STDC__ */ ++#endif /* ! __cplusplus */ ++ ++#ifdef YY_USE_CONST ++#define yyconst const ++#else ++#define yyconst ++#endif ++ ++/* Returned upon end-of-file. */ ++#define YY_NULL 0 ++ ++/* Promotes a possibly negative, possibly signed char to an unsigned ++ * integer for use as an array index. If the signed char is negative, ++ * we want to instead treat it as an 8-bit unsigned char, hence the ++ * double cast. ++ */ ++#define YY_SC_TO_UI(c) ((unsigned int) (unsigned char) c) ++ ++/* Enter a start condition. This macro really ought to take a parameter, ++ * but we do it the disgusting crufty way forced on us by the ()-less ++ * definition of BEGIN. ++ */ ++#define BEGIN (yy_start) = 1 + 2 * ++ ++/* Translate the current start state into a value that can be later handed ++ * to BEGIN to return to the state. The YYSTATE alias is for lex ++ * compatibility. ++ */ ++#define YY_START (((yy_start) - 1) / 2) ++#define YYSTATE YY_START ++ ++/* Action number for EOF rule of a given start state. */ ++#define YY_STATE_EOF(state) (YY_END_OF_BUFFER + state + 1) ++ ++/* Special action meaning "start processing a new file". */ ++#define YY_NEW_FILE zconfrestart(zconfin ) ++ ++#define YY_END_OF_BUFFER_CHAR 0 ++ ++/* Size of default input buffer. */ ++#ifndef YY_BUF_SIZE ++#define YY_BUF_SIZE 16384 ++#endif ++ ++#ifndef YY_TYPEDEF_YY_BUFFER_STATE ++#define YY_TYPEDEF_YY_BUFFER_STATE ++typedef struct yy_buffer_state *YY_BUFFER_STATE; ++#endif ++ ++extern int zconfleng; ++ ++extern FILE *zconfin, *zconfout; ++ ++#define EOB_ACT_CONTINUE_SCAN 0 ++#define EOB_ACT_END_OF_FILE 1 ++#define EOB_ACT_LAST_MATCH 2 ++ ++ #define YY_LESS_LINENO(n) ++ ++/* Return all but the first "n" matched characters back to the input stream. */ ++#define yyless(n) \ ++ do \ ++ { \ ++ /* Undo effects of setting up zconftext. */ \ ++ int yyless_macro_arg = (n); \ ++ YY_LESS_LINENO(yyless_macro_arg);\ ++ *yy_cp = (yy_hold_char); \ ++ YY_RESTORE_YY_MORE_OFFSET \ ++ (yy_c_buf_p) = yy_cp = yy_bp + yyless_macro_arg - YY_MORE_ADJ; \ ++ YY_DO_BEFORE_ACTION; /* set up zconftext again */ \ ++ } \ ++ while ( 0 ) ++ ++#define unput(c) yyunput( c, (yytext_ptr) ) ++ ++/* The following is because we cannot portably get our hands on size_t ++ * (without autoconf's help, which isn't available because we want ++ * flex-generated scanners to compile on their own). ++ */ ++ ++#ifndef YY_TYPEDEF_YY_SIZE_T ++#define YY_TYPEDEF_YY_SIZE_T ++typedef unsigned int yy_size_t; ++#endif ++ ++#ifndef YY_STRUCT_YY_BUFFER_STATE ++#define YY_STRUCT_YY_BUFFER_STATE ++struct yy_buffer_state ++ { ++ FILE *yy_input_file; ++ ++ char *yy_ch_buf; /* input buffer */ ++ char *yy_buf_pos; /* current position in input buffer */ ++ ++ /* Size of input buffer in bytes, not including room for EOB ++ * characters. ++ */ ++ yy_size_t yy_buf_size; ++ ++ /* Number of characters read into yy_ch_buf, not including EOB ++ * characters. ++ */ ++ int yy_n_chars; ++ ++ /* Whether we "own" the buffer - i.e., we know we created it, ++ * and can realloc() it to grow it, and should free() it to ++ * delete it. ++ */ ++ int yy_is_our_buffer; ++ ++ /* Whether this is an "interactive" input source; if so, and ++ * if we're using stdio for input, then we want to use getc() ++ * instead of fread(), to make sure we stop fetching input after ++ * each newline. ++ */ ++ int yy_is_interactive; ++ ++ /* Whether we're considered to be at the beginning of a line. ++ * If so, '^' rules will be active on the next match, otherwise ++ * not. ++ */ ++ int yy_at_bol; ++ ++ int yy_bs_lineno; /**< The line count. */ ++ int yy_bs_column; /**< The column count. */ ++ ++ /* Whether to try to fill the input buffer when we reach the ++ * end of it. ++ */ ++ int yy_fill_buffer; ++ ++ int yy_buffer_status; ++ ++#define YY_BUFFER_NEW 0 ++#define YY_BUFFER_NORMAL 1 ++ /* When an EOF's been seen but there's still some text to process ++ * then we mark the buffer as YY_EOF_PENDING, to indicate that we ++ * shouldn't try reading from the input source any more. We might ++ * still have a bunch of tokens to match, though, because of ++ * possible backing-up. ++ * ++ * When we actually see the EOF, we change the status to "new" ++ * (via zconfrestart()), so that the user can continue scanning by ++ * just pointing zconfin at a new input file. ++ */ ++#define YY_BUFFER_EOF_PENDING 2 ++ ++ }; ++#endif /* !YY_STRUCT_YY_BUFFER_STATE */ ++ ++/* Stack of input buffers. */ ++static size_t yy_buffer_stack_top = 0; /**< index of top of stack. */ ++static size_t yy_buffer_stack_max = 0; /**< capacity of stack. */ ++static YY_BUFFER_STATE * yy_buffer_stack = 0; /**< Stack as an array. */ ++ ++/* We provide macros for accessing buffer states in case in the ++ * future we want to put the buffer states in a more general ++ * "scanner state". ++ * ++ * Returns the top of the stack, or NULL. ++ */ ++#define YY_CURRENT_BUFFER ( (yy_buffer_stack) \ ++ ? (yy_buffer_stack)[(yy_buffer_stack_top)] \ ++ : NULL) ++ ++/* Same as previous macro, but useful when we know that the buffer stack is not ++ * NULL or when we need an lvalue. For internal use only. ++ */ ++#define YY_CURRENT_BUFFER_LVALUE (yy_buffer_stack)[(yy_buffer_stack_top)] ++ ++/* yy_hold_char holds the character lost when zconftext is formed. */ ++static char yy_hold_char; ++static int yy_n_chars; /* number of characters read into yy_ch_buf */ ++int zconfleng; ++ ++/* Points to current character in buffer. */ ++static char *yy_c_buf_p = (char *) 0; ++static int yy_init = 1; /* whether we need to initialize */ ++static int yy_start = 0; /* start state number */ ++ ++/* Flag which is used to allow zconfwrap()'s to do buffer switches ++ * instead of setting up a fresh zconfin. A bit of a hack ... ++ */ ++static int yy_did_buffer_switch_on_eof; ++ ++void zconfrestart (FILE *input_file ); ++void zconf_switch_to_buffer (YY_BUFFER_STATE new_buffer ); ++YY_BUFFER_STATE zconf_create_buffer (FILE *file,int size ); ++void zconf_delete_buffer (YY_BUFFER_STATE b ); ++void zconf_flush_buffer (YY_BUFFER_STATE b ); ++void zconfpush_buffer_state (YY_BUFFER_STATE new_buffer ); ++void zconfpop_buffer_state (void ); ++ ++static void zconfensure_buffer_stack (void ); ++static void zconf_load_buffer_state (void ); ++static void zconf_init_buffer (YY_BUFFER_STATE b,FILE *file ); ++ ++#define YY_FLUSH_BUFFER zconf_flush_buffer(YY_CURRENT_BUFFER ) ++ ++YY_BUFFER_STATE zconf_scan_buffer (char *base,yy_size_t size ); ++YY_BUFFER_STATE zconf_scan_string (yyconst char *yy_str ); ++YY_BUFFER_STATE zconf_scan_bytes (yyconst char *bytes,int len ); ++ ++void *zconfalloc (yy_size_t ); ++void *zconfrealloc (void *,yy_size_t ); ++void zconffree (void * ); ++ ++#define yy_new_buffer zconf_create_buffer ++ ++#define yy_set_interactive(is_interactive) \ ++ { \ ++ if ( ! YY_CURRENT_BUFFER ){ \ ++ zconfensure_buffer_stack (); \ ++ YY_CURRENT_BUFFER_LVALUE = \ ++ zconf_create_buffer(zconfin,YY_BUF_SIZE ); \ ++ } \ ++ YY_CURRENT_BUFFER_LVALUE->yy_is_interactive = is_interactive; \ ++ } ++ ++#define yy_set_bol(at_bol) \ ++ { \ ++ if ( ! YY_CURRENT_BUFFER ){\ ++ zconfensure_buffer_stack (); \ ++ YY_CURRENT_BUFFER_LVALUE = \ ++ zconf_create_buffer(zconfin,YY_BUF_SIZE ); \ ++ } \ ++ YY_CURRENT_BUFFER_LVALUE->yy_at_bol = at_bol; \ ++ } ++ ++#define YY_AT_BOL() (YY_CURRENT_BUFFER_LVALUE->yy_at_bol) ++ ++/* Begin user sect3 */ ++ ++#define zconfwrap(n) 1 ++#define YY_SKIP_YYWRAP ++ ++typedef unsigned char YY_CHAR; ++ ++FILE *zconfin = (FILE *) 0, *zconfout = (FILE *) 0; ++ ++typedef int yy_state_type; ++ ++extern int zconflineno; ++ ++int zconflineno = 1; ++ ++extern char *zconftext; ++#define yytext_ptr zconftext ++static yyconst flex_int16_t yy_nxt[][38] = ++ { ++ { ++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ++ 0, 0, 0, 0, 0, 0, 0, 0 ++ }, ++ ++ { ++ 11, 12, 13, 14, 12, 12, 15, 12, 12, 12, ++ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, ++ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, ++ 12, 12, 12, 12, 12, 12, 12, 12 ++ }, ++ ++ { ++ 11, 12, 13, 14, 12, 12, 15, 12, 12, 12, ++ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, ++ ++ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, ++ 12, 12, 12, 12, 12, 12, 12, 12 ++ }, ++ ++ { ++ 11, 16, 16, 17, 16, 16, 16, 16, 16, 16, ++ 16, 16, 16, 18, 16, 16, 18, 18, 19, 20, ++ 21, 22, 18, 18, 23, 24, 18, 25, 18, 26, ++ 27, 18, 28, 29, 30, 18, 18, 16 ++ }, ++ ++ { ++ 11, 16, 16, 17, 16, 16, 16, 16, 16, 16, ++ 16, 16, 16, 18, 16, 16, 18, 18, 19, 20, ++ 21, 22, 18, 18, 23, 24, 18, 25, 18, 26, ++ 27, 18, 28, 29, 30, 18, 18, 16 ++ ++ }, ++ ++ { ++ 11, 31, 32, 33, 31, 31, 31, 31, 31, 31, ++ 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, ++ 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, ++ 31, 31, 31, 31, 31, 31, 31, 31 ++ }, ++ ++ { ++ 11, 31, 32, 33, 31, 31, 31, 31, 31, 31, ++ 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, ++ 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, ++ 31, 31, 31, 31, 31, 31, 31, 31 ++ }, ++ ++ { ++ 11, 34, 34, 35, 34, 36, 34, 34, 36, 34, ++ 34, 34, 34, 34, 34, 37, 34, 34, 34, 34, ++ ++ 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, ++ 34, 34, 34, 34, 34, 34, 34, 34 ++ }, ++ ++ { ++ 11, 34, 34, 35, 34, 36, 34, 34, 36, 34, ++ 34, 34, 34, 34, 34, 37, 34, 34, 34, 34, ++ 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, ++ 34, 34, 34, 34, 34, 34, 34, 34 ++ }, ++ ++ { ++ 11, 38, 38, 39, 40, 41, 42, 43, 41, 44, ++ 45, 46, 47, 47, 48, 49, 47, 47, 47, 47, ++ 47, 47, 47, 47, 47, 50, 47, 47, 47, 51, ++ 47, 47, 47, 47, 47, 47, 47, 52 ++ ++ }, ++ ++ { ++ 11, 38, 38, 39, 40, 41, 42, 43, 41, 44, ++ 45, 46, 47, 47, 48, 49, 47, 47, 47, 47, ++ 47, 47, 47, 47, 47, 50, 47, 47, 47, 51, ++ 47, 47, 47, 47, 47, 47, 47, 52 ++ }, ++ ++ { ++ -11, -11, -11, -11, -11, -11, -11, -11, -11, -11, ++ -11, -11, -11, -11, -11, -11, -11, -11, -11, -11, ++ -11, -11, -11, -11, -11, -11, -11, -11, -11, -11, ++ -11, -11, -11, -11, -11, -11, -11, -11 ++ }, ++ ++ { ++ 11, -12, -12, -12, -12, -12, -12, -12, -12, -12, ++ -12, -12, -12, -12, -12, -12, -12, -12, -12, -12, ++ ++ -12, -12, -12, -12, -12, -12, -12, -12, -12, -12, ++ -12, -12, -12, -12, -12, -12, -12, -12 ++ }, ++ ++ { ++ 11, -13, 53, 54, -13, -13, 55, -13, -13, -13, ++ -13, -13, -13, -13, -13, -13, -13, -13, -13, -13, ++ -13, -13, -13, -13, -13, -13, -13, -13, -13, -13, ++ -13, -13, -13, -13, -13, -13, -13, -13 ++ }, ++ ++ { ++ 11, -14, -14, -14, -14, -14, -14, -14, -14, -14, ++ -14, -14, -14, -14, -14, -14, -14, -14, -14, -14, ++ -14, -14, -14, -14, -14, -14, -14, -14, -14, -14, ++ -14, -14, -14, -14, -14, -14, -14, -14 ++ ++ }, ++ ++ { ++ 11, 56, 56, 57, 56, 56, 56, 56, 56, 56, ++ 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, ++ 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, ++ 56, 56, 56, 56, 56, 56, 56, 56 ++ }, ++ ++ { ++ 11, -16, -16, -16, -16, -16, -16, -16, -16, -16, ++ -16, -16, -16, -16, -16, -16, -16, -16, -16, -16, ++ -16, -16, -16, -16, -16, -16, -16, -16, -16, -16, ++ -16, -16, -16, -16, -16, -16, -16, -16 ++ }, ++ ++ { ++ 11, -17, -17, -17, -17, -17, -17, -17, -17, -17, ++ -17, -17, -17, -17, -17, -17, -17, -17, -17, -17, ++ ++ -17, -17, -17, -17, -17, -17, -17, -17, -17, -17, ++ -17, -17, -17, -17, -17, -17, -17, -17 ++ }, ++ ++ { ++ 11, -18, -18, -18, -18, -18, -18, -18, -18, -18, ++ -18, -18, -18, 58, -18, -18, 58, 58, 58, 58, ++ 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, ++ 58, 58, 58, 58, 58, 58, 58, -18 ++ }, ++ ++ { ++ 11, -19, -19, -19, -19, -19, -19, -19, -19, -19, ++ -19, -19, -19, 58, -19, -19, 58, 58, 58, 58, ++ 58, 58, 58, 58, 58, 58, 58, 58, 58, 59, ++ 58, 58, 58, 58, 58, 58, 58, -19 ++ ++ }, ++ ++ { ++ 11, -20, -20, -20, -20, -20, -20, -20, -20, -20, ++ -20, -20, -20, 58, -20, -20, 58, 58, 58, 58, ++ 58, 58, 58, 58, 60, 58, 58, 58, 58, 61, ++ 58, 58, 58, 58, 58, 58, 58, -20 ++ }, ++ ++ { ++ 11, -21, -21, -21, -21, -21, -21, -21, -21, -21, ++ -21, -21, -21, 58, -21, -21, 58, 58, 58, 58, ++ 58, 62, 58, 58, 58, 58, 58, 58, 58, 58, ++ 58, 58, 58, 58, 58, 58, 58, -21 ++ }, ++ ++ { ++ 11, -22, -22, -22, -22, -22, -22, -22, -22, -22, ++ -22, -22, -22, 58, -22, -22, 58, 58, 58, 58, ++ ++ 58, 58, 58, 58, 58, 58, 58, 58, 63, 58, ++ 58, 58, 58, 58, 58, 58, 58, -22 ++ }, ++ ++ { ++ 11, -23, -23, -23, -23, -23, -23, -23, -23, -23, ++ -23, -23, -23, 58, -23, -23, 58, 58, 58, 58, ++ 58, 64, 58, 58, 58, 58, 58, 58, 58, 58, ++ 58, 58, 58, 58, 58, 58, 58, -23 ++ }, ++ ++ { ++ 11, -24, -24, -24, -24, -24, -24, -24, -24, -24, ++ -24, -24, -24, 58, -24, -24, 58, 58, 58, 58, ++ 58, 58, 65, 58, 58, 58, 58, 58, 66, 58, ++ 58, 58, 58, 58, 58, 58, 58, -24 ++ ++ }, ++ ++ { ++ 11, -25, -25, -25, -25, -25, -25, -25, -25, -25, ++ -25, -25, -25, 58, -25, -25, 58, 67, 58, 58, ++ 58, 68, 58, 58, 58, 58, 58, 58, 58, 58, ++ 58, 58, 58, 58, 58, 58, 58, -25 ++ }, ++ ++ { ++ 11, -26, -26, -26, -26, -26, -26, -26, -26, -26, ++ -26, -26, -26, 58, -26, -26, 58, 58, 58, 58, ++ 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, ++ 69, 58, 58, 58, 58, 58, 58, -26 ++ }, ++ ++ { ++ 11, -27, -27, -27, -27, -27, -27, -27, -27, -27, ++ -27, -27, -27, 58, -27, -27, 58, 58, 58, 58, ++ ++ 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, ++ 58, 58, 70, 58, 58, 58, 58, -27 ++ }, ++ ++ { ++ 11, -28, -28, -28, -28, -28, -28, -28, -28, -28, ++ -28, -28, -28, 58, -28, -28, 58, 71, 58, 58, ++ 58, 72, 58, 58, 58, 58, 58, 58, 58, 58, ++ 58, 58, 58, 58, 58, 58, 58, -28 ++ }, ++ ++ { ++ 11, -29, -29, -29, -29, -29, -29, -29, -29, -29, ++ -29, -29, -29, 58, -29, -29, 58, 58, 58, 58, ++ 58, 73, 58, 58, 58, 58, 58, 58, 58, 74, ++ 58, 58, 58, 58, 75, 58, 58, -29 ++ ++ }, ++ ++ { ++ 11, -30, -30, -30, -30, -30, -30, -30, -30, -30, ++ -30, -30, -30, 58, -30, -30, 58, 58, 58, 58, ++ 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, ++ 58, 58, 76, 58, 58, 58, 58, -30 ++ }, ++ ++ { ++ 11, 77, 77, -31, 77, 77, 77, 77, 77, 77, ++ 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, ++ 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, ++ 77, 77, 77, 77, 77, 77, 77, 77 ++ }, ++ ++ { ++ 11, -32, 78, 79, -32, -32, -32, -32, -32, -32, ++ -32, -32, -32, -32, -32, -32, -32, -32, -32, -32, ++ ++ -32, -32, -32, -32, -32, -32, -32, -32, -32, -32, ++ -32, -32, -32, -32, -32, -32, -32, -32 ++ }, ++ ++ { ++ 11, 80, -33, -33, 80, 80, 80, 80, 80, 80, ++ 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, ++ 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, ++ 80, 80, 80, 80, 80, 80, 80, 80 ++ }, ++ ++ { ++ 11, 81, 81, 82, 81, -34, 81, 81, -34, 81, ++ 81, 81, 81, 81, 81, -34, 81, 81, 81, 81, ++ 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, ++ 81, 81, 81, 81, 81, 81, 81, 81 ++ ++ }, ++ ++ { ++ 11, -35, -35, -35, -35, -35, -35, -35, -35, -35, ++ -35, -35, -35, -35, -35, -35, -35, -35, -35, -35, ++ -35, -35, -35, -35, -35, -35, -35, -35, -35, -35, ++ -35, -35, -35, -35, -35, -35, -35, -35 ++ }, ++ ++ { ++ 11, -36, -36, -36, -36, -36, -36, -36, -36, -36, ++ -36, -36, -36, -36, -36, -36, -36, -36, -36, -36, ++ -36, -36, -36, -36, -36, -36, -36, -36, -36, -36, ++ -36, -36, -36, -36, -36, -36, -36, -36 ++ }, ++ ++ { ++ 11, 83, 83, 84, 83, 83, 83, 83, 83, 83, ++ 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, ++ ++ 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, ++ 83, 83, 83, 83, 83, 83, 83, 83 ++ }, ++ ++ { ++ 11, -38, -38, -38, -38, -38, -38, -38, -38, -38, ++ -38, -38, -38, -38, -38, -38, -38, -38, -38, -38, ++ -38, -38, -38, -38, -38, -38, -38, -38, -38, -38, ++ -38, -38, -38, -38, -38, -38, -38, -38 ++ }, ++ ++ { ++ 11, -39, -39, -39, -39, -39, -39, -39, -39, -39, ++ -39, -39, -39, -39, -39, -39, -39, -39, -39, -39, ++ -39, -39, -39, -39, -39, -39, -39, -39, -39, -39, ++ -39, -39, -39, -39, -39, -39, -39, -39 ++ ++ }, ++ ++ { ++ 11, -40, -40, -40, -40, -40, -40, -40, -40, -40, ++ -40, -40, -40, -40, 85, -40, -40, -40, -40, -40, ++ -40, -40, -40, -40, -40, -40, -40, -40, -40, -40, ++ -40, -40, -40, -40, -40, -40, -40, -40 ++ }, ++ ++ { ++ 11, -41, -41, -41, -41, -41, -41, -41, -41, -41, ++ -41, -41, -41, -41, -41, -41, -41, -41, -41, -41, ++ -41, -41, -41, -41, -41, -41, -41, -41, -41, -41, ++ -41, -41, -41, -41, -41, -41, -41, -41 ++ }, ++ ++ { ++ 11, 86, 86, -42, 86, 86, 86, 86, 86, 86, ++ 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, ++ ++ 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, ++ 86, 86, 86, 86, 86, 86, 86, 86 ++ }, ++ ++ { ++ 11, -43, -43, -43, -43, -43, -43, 87, -43, -43, ++ -43, -43, -43, -43, -43, -43, -43, -43, -43, -43, ++ -43, -43, -43, -43, -43, -43, -43, -43, -43, -43, ++ -43, -43, -43, -43, -43, -43, -43, -43 ++ }, ++ ++ { ++ 11, -44, -44, -44, -44, -44, -44, -44, -44, -44, ++ -44, -44, -44, -44, -44, -44, -44, -44, -44, -44, ++ -44, -44, -44, -44, -44, -44, -44, -44, -44, -44, ++ -44, -44, -44, -44, -44, -44, -44, -44 ++ ++ }, ++ ++ { ++ 11, -45, -45, -45, -45, -45, -45, -45, -45, -45, ++ -45, -45, -45, -45, -45, -45, -45, -45, -45, -45, ++ -45, -45, -45, -45, -45, -45, -45, -45, -45, -45, ++ -45, -45, -45, -45, -45, -45, -45, -45 ++ }, ++ ++ { ++ 11, -46, -46, -46, -46, -46, -46, -46, -46, -46, ++ -46, 88, 89, 89, -46, -46, 89, 89, 89, 89, ++ 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, ++ 89, 89, 89, 89, 89, 89, 89, -46 ++ }, ++ ++ { ++ 11, -47, -47, -47, -47, -47, -47, -47, -47, -47, ++ -47, 89, 89, 89, -47, -47, 89, 89, 89, 89, ++ ++ 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, ++ 89, 89, 89, 89, 89, 89, 89, -47 ++ }, ++ ++ { ++ 11, -48, -48, -48, -48, -48, -48, -48, -48, -48, ++ -48, -48, -48, -48, -48, -48, -48, -48, -48, -48, ++ -48, -48, -48, -48, -48, -48, -48, -48, -48, -48, ++ -48, -48, -48, -48, -48, -48, -48, -48 ++ }, ++ ++ { ++ 11, -49, -49, 90, -49, -49, -49, -49, -49, -49, ++ -49, -49, -49, -49, -49, -49, -49, -49, -49, -49, ++ -49, -49, -49, -49, -49, -49, -49, -49, -49, -49, ++ -49, -49, -49, -49, -49, -49, -49, -49 ++ ++ }, ++ ++ { ++ 11, -50, -50, -50, -50, -50, -50, -50, -50, -50, ++ -50, 89, 89, 89, -50, -50, 89, 89, 89, 89, ++ 89, 89, 91, 89, 89, 89, 89, 89, 89, 89, ++ 89, 89, 89, 89, 89, 89, 89, -50 ++ }, ++ ++ { ++ 11, -51, -51, -51, -51, -51, -51, -51, -51, -51, ++ -51, 89, 89, 89, -51, -51, 89, 89, 89, 89, ++ 89, 89, 89, 89, 89, 89, 89, 89, 92, 89, ++ 89, 89, 89, 89, 89, 89, 89, -51 ++ }, ++ ++ { ++ 11, -52, -52, -52, -52, -52, -52, -52, -52, -52, ++ -52, -52, -52, -52, -52, -52, -52, -52, -52, -52, ++ ++ -52, -52, -52, -52, -52, -52, -52, -52, -52, -52, ++ -52, -52, -52, -52, -52, -52, -52, 93 ++ }, ++ ++ { ++ 11, -53, 53, 54, -53, -53, 55, -53, -53, -53, ++ -53, -53, -53, -53, -53, -53, -53, -53, -53, -53, ++ -53, -53, -53, -53, -53, -53, -53, -53, -53, -53, ++ -53, -53, -53, -53, -53, -53, -53, -53 ++ }, ++ ++ { ++ 11, -54, -54, -54, -54, -54, -54, -54, -54, -54, ++ -54, -54, -54, -54, -54, -54, -54, -54, -54, -54, ++ -54, -54, -54, -54, -54, -54, -54, -54, -54, -54, ++ -54, -54, -54, -54, -54, -54, -54, -54 ++ ++ }, ++ ++ { ++ 11, 56, 56, 57, 56, 56, 56, 56, 56, 56, ++ 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, ++ 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, ++ 56, 56, 56, 56, 56, 56, 56, 56 ++ }, ++ ++ { ++ 11, 56, 56, 57, 56, 56, 56, 56, 56, 56, ++ 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, ++ 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, ++ 56, 56, 56, 56, 56, 56, 56, 56 ++ }, ++ ++ { ++ 11, -57, -57, -57, -57, -57, -57, -57, -57, -57, ++ -57, -57, -57, -57, -57, -57, -57, -57, -57, -57, ++ ++ -57, -57, -57, -57, -57, -57, -57, -57, -57, -57, ++ -57, -57, -57, -57, -57, -57, -57, -57 ++ }, ++ ++ { ++ 11, -58, -58, -58, -58, -58, -58, -58, -58, -58, ++ -58, -58, -58, 58, -58, -58, 58, 58, 58, 58, ++ 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, ++ 58, 58, 58, 58, 58, 58, 58, -58 ++ }, ++ ++ { ++ 11, -59, -59, -59, -59, -59, -59, -59, -59, -59, ++ -59, -59, -59, 58, -59, -59, 58, 58, 58, 58, ++ 58, 58, 58, 58, 58, 58, 58, 58, 58, 94, ++ 58, 58, 58, 58, 58, 58, 58, -59 ++ ++ }, ++ ++ { ++ 11, -60, -60, -60, -60, -60, -60, -60, -60, -60, ++ -60, -60, -60, 58, -60, -60, 58, 58, 58, 58, ++ 58, 58, 58, 58, 58, 58, 58, 58, 58, 95, ++ 58, 58, 58, 58, 58, 58, 58, -60 ++ }, ++ ++ { ++ 11, -61, -61, -61, -61, -61, -61, -61, -61, -61, ++ -61, -61, -61, 58, -61, -61, 58, 58, 58, 58, ++ 58, 58, 58, 58, 58, 58, 58, 96, 97, 58, ++ 58, 58, 58, 58, 58, 58, 58, -61 ++ }, ++ ++ { ++ 11, -62, -62, -62, -62, -62, -62, -62, -62, -62, ++ -62, -62, -62, 58, -62, -62, 58, 58, 58, 58, ++ ++ 58, 58, 98, 58, 58, 58, 58, 58, 58, 58, ++ 99, 58, 58, 58, 58, 58, 58, -62 ++ }, ++ ++ { ++ 11, -63, -63, -63, -63, -63, -63, -63, -63, -63, ++ -63, -63, -63, 58, -63, -63, 58, 100, 58, 58, ++ 101, 58, 58, 58, 58, 58, 58, 58, 58, 58, ++ 58, 58, 58, 58, 58, 58, 58, -63 ++ }, ++ ++ { ++ 11, -64, -64, -64, -64, -64, -64, -64, -64, -64, ++ -64, -64, -64, 58, -64, -64, 58, 58, 58, 58, ++ 58, 58, 58, 58, 58, 58, 102, 58, 58, 58, ++ 58, 58, 58, 58, 58, 58, 103, -64 ++ ++ }, ++ ++ { ++ 11, -65, -65, -65, -65, -65, -65, -65, -65, -65, ++ -65, -65, -65, 58, -65, -65, 58, 58, 58, 58, ++ 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, ++ 58, 58, 58, 58, 58, 58, 58, -65 ++ }, ++ ++ { ++ 11, -66, -66, -66, -66, -66, -66, -66, -66, -66, ++ -66, -66, -66, 58, -66, -66, 58, 58, 58, 58, ++ 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, ++ 58, 58, 58, 58, 104, 58, 58, -66 ++ }, ++ ++ { ++ 11, -67, -67, -67, -67, -67, -67, -67, -67, -67, ++ -67, -67, -67, 58, -67, -67, 58, 58, 58, 58, ++ ++ 58, 58, 58, 58, 58, 105, 58, 58, 58, 58, ++ 58, 58, 58, 58, 58, 58, 58, -67 ++ }, ++ ++ { ++ 11, -68, -68, -68, -68, -68, -68, -68, -68, -68, ++ -68, -68, -68, 58, -68, -68, 58, 58, 58, 58, ++ 58, 58, 58, 58, 58, 58, 58, 58, 106, 58, ++ 58, 58, 58, 58, 58, 58, 58, -68 ++ }, ++ ++ { ++ 11, -69, -69, -69, -69, -69, -69, -69, -69, -69, ++ -69, -69, -69, 58, -69, -69, 58, 58, 58, 58, ++ 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, ++ 58, 58, 58, 58, 107, 58, 58, -69 ++ ++ }, ++ ++ { ++ 11, -70, -70, -70, -70, -70, -70, -70, -70, -70, ++ -70, -70, -70, 58, -70, -70, 58, 58, 58, 58, ++ 58, 58, 58, 58, 58, 58, 58, 58, 58, 108, ++ 58, 58, 58, 58, 58, 58, 58, -70 ++ }, ++ ++ { ++ 11, -71, -71, -71, -71, -71, -71, -71, -71, -71, ++ -71, -71, -71, 58, -71, -71, 58, 58, 58, 58, ++ 58, 58, 58, 58, 58, 58, 58, 58, 109, 58, ++ 58, 58, 58, 58, 58, 58, 58, -71 ++ }, ++ ++ { ++ 11, -72, -72, -72, -72, -72, -72, -72, -72, -72, ++ -72, -72, -72, 58, -72, -72, 58, 58, 58, 58, ++ ++ 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, ++ 58, 110, 58, 58, 58, 58, 58, -72 ++ }, ++ ++ { ++ 11, -73, -73, -73, -73, -73, -73, -73, -73, -73, ++ -73, -73, -73, 58, -73, -73, 58, 58, 58, 58, ++ 58, 58, 58, 58, 58, 58, 111, 58, 58, 58, ++ 58, 58, 58, 58, 58, 58, 58, -73 ++ }, ++ ++ { ++ 11, -74, -74, -74, -74, -74, -74, -74, -74, -74, ++ -74, -74, -74, 58, -74, -74, 58, 58, 58, 58, ++ 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, ++ 58, 58, 58, 58, 58, 112, 58, -74 ++ ++ }, ++ ++ { ++ 11, -75, -75, -75, -75, -75, -75, -75, -75, -75, ++ -75, -75, -75, 58, -75, -75, 58, 58, 58, 58, ++ 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, ++ 58, 58, 113, 58, 58, 58, 58, -75 ++ }, ++ ++ { ++ 11, -76, -76, -76, -76, -76, -76, -76, -76, -76, ++ -76, -76, -76, 58, -76, -76, 58, 58, 58, 58, ++ 58, 58, 58, 58, 58, 114, 58, 58, 58, 58, ++ 58, 58, 58, 58, 58, 58, 58, -76 ++ }, ++ ++ { ++ 11, 77, 77, -77, 77, 77, 77, 77, 77, 77, ++ 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, ++ ++ 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, ++ 77, 77, 77, 77, 77, 77, 77, 77 ++ }, ++ ++ { ++ 11, -78, 78, 79, -78, -78, -78, -78, -78, -78, ++ -78, -78, -78, -78, -78, -78, -78, -78, -78, -78, ++ -78, -78, -78, -78, -78, -78, -78, -78, -78, -78, ++ -78, -78, -78, -78, -78, -78, -78, -78 ++ }, ++ ++ { ++ 11, 80, -79, -79, 80, 80, 80, 80, 80, 80, ++ 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, ++ 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, ++ 80, 80, 80, 80, 80, 80, 80, 80 ++ ++ }, ++ ++ { ++ 11, -80, -80, -80, -80, -80, -80, -80, -80, -80, ++ -80, -80, -80, -80, -80, -80, -80, -80, -80, -80, ++ -80, -80, -80, -80, -80, -80, -80, -80, -80, -80, ++ -80, -80, -80, -80, -80, -80, -80, -80 ++ }, ++ ++ { ++ 11, 81, 81, 82, 81, -81, 81, 81, -81, 81, ++ 81, 81, 81, 81, 81, -81, 81, 81, 81, 81, ++ 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, ++ 81, 81, 81, 81, 81, 81, 81, 81 ++ }, ++ ++ { ++ 11, -82, -82, -82, -82, -82, -82, -82, -82, -82, ++ -82, -82, -82, -82, -82, -82, -82, -82, -82, -82, ++ ++ -82, -82, -82, -82, -82, -82, -82, -82, -82, -82, ++ -82, -82, -82, -82, -82, -82, -82, -82 ++ }, ++ ++ { ++ 11, -83, -83, 84, -83, -83, -83, -83, -83, -83, ++ -83, -83, -83, -83, -83, -83, -83, -83, -83, -83, ++ -83, -83, -83, -83, -83, -83, -83, -83, -83, -83, ++ -83, -83, -83, -83, -83, -83, -83, -83 ++ }, ++ ++ { ++ 11, -84, -84, -84, -84, -84, -84, -84, -84, -84, ++ -84, -84, -84, -84, -84, -84, -84, -84, -84, -84, ++ -84, -84, -84, -84, -84, -84, -84, -84, -84, -84, ++ -84, -84, -84, -84, -84, -84, -84, -84 ++ ++ }, ++ ++ { ++ 11, -85, -85, -85, -85, -85, -85, -85, -85, -85, ++ -85, -85, -85, -85, -85, -85, -85, -85, -85, -85, ++ -85, -85, -85, -85, -85, -85, -85, -85, -85, -85, ++ -85, -85, -85, -85, -85, -85, -85, -85 ++ }, ++ ++ { ++ 11, 86, 86, -86, 86, 86, 86, 86, 86, 86, ++ 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, ++ 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, ++ 86, 86, 86, 86, 86, 86, 86, 86 ++ }, ++ ++ { ++ 11, -87, -87, -87, -87, -87, -87, -87, -87, -87, ++ -87, -87, -87, -87, -87, -87, -87, -87, -87, -87, ++ ++ -87, -87, -87, -87, -87, -87, -87, -87, -87, -87, ++ -87, -87, -87, -87, -87, -87, -87, -87 ++ }, ++ ++ { ++ 11, -88, -88, -88, -88, -88, -88, -88, -88, -88, ++ -88, 115, 89, 89, -88, -88, 89, 89, 89, 89, ++ 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, ++ 89, 89, 89, 89, 89, 89, 89, -88 ++ }, ++ ++ { ++ 11, -89, -89, -89, -89, -89, -89, -89, -89, -89, ++ -89, 89, 89, 89, -89, -89, 89, 89, 89, 89, ++ 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, ++ 89, 89, 89, 89, 89, 89, 89, -89 ++ ++ }, ++ ++ { ++ 11, -90, -90, -90, -90, -90, -90, -90, -90, -90, ++ -90, -90, -90, -90, -90, -90, -90, -90, -90, -90, ++ -90, -90, -90, -90, -90, -90, -90, -90, -90, -90, ++ -90, -90, -90, -90, -90, -90, -90, -90 ++ }, ++ ++ { ++ 11, -91, -91, -91, -91, -91, -91, -91, -91, -91, ++ -91, 89, 89, 89, -91, -91, 89, 89, 89, 89, ++ 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, ++ 89, 89, 89, 89, 89, 89, 89, -91 ++ }, ++ ++ { ++ 11, -92, -92, -92, -92, -92, -92, -92, -92, -92, ++ -92, 89, 89, 89, -92, -92, 89, 89, 89, 89, ++ ++ 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, ++ 89, 89, 89, 89, 89, 89, 89, -92 ++ }, ++ ++ { ++ 11, -93, -93, -93, -93, -93, -93, -93, -93, -93, ++ -93, -93, -93, -93, -93, -93, -93, -93, -93, -93, ++ -93, -93, -93, -93, -93, -93, -93, -93, -93, -93, ++ -93, -93, -93, -93, -93, -93, -93, -93 ++ }, ++ ++ { ++ 11, -94, -94, -94, -94, -94, -94, -94, -94, -94, ++ -94, -94, -94, 58, -94, -94, 58, 58, 58, 58, ++ 58, 58, 58, 58, 58, 58, 116, 58, 58, 58, ++ 58, 58, 58, 58, 58, 58, 58, -94 ++ ++ }, ++ ++ { ++ 11, -95, -95, -95, -95, -95, -95, -95, -95, -95, ++ -95, -95, -95, 58, -95, -95, 58, 58, 58, 58, ++ 58, 58, 58, 58, 58, 117, 58, 58, 58, 58, ++ 58, 58, 58, 58, 58, 58, 58, -95 ++ }, ++ ++ { ++ 11, -96, -96, -96, -96, -96, -96, -96, -96, -96, ++ -96, -96, -96, 58, -96, -96, 58, 58, 58, 58, ++ 58, 58, 58, 58, 58, 58, 58, 118, 58, 58, ++ 58, 58, 58, 58, 58, 58, 58, -96 ++ }, ++ ++ { ++ 11, -97, -97, -97, -97, -97, -97, -97, -97, -97, ++ -97, -97, -97, 58, -97, -97, 58, 58, 58, 58, ++ ++ 58, 58, 119, 58, 58, 58, 58, 58, 58, 58, ++ 58, 58, 58, 58, 58, 58, 58, -97 ++ }, ++ ++ { ++ 11, -98, -98, -98, -98, -98, -98, -98, -98, -98, ++ -98, -98, -98, 58, -98, -98, 120, 121, 58, 58, ++ 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, ++ 58, 58, 58, 58, 58, 58, 58, -98 ++ }, ++ ++ { ++ 11, -99, -99, -99, -99, -99, -99, -99, -99, -99, ++ -99, -99, -99, 58, -99, -99, 58, 58, 58, 58, ++ 58, 122, 58, 58, 58, 58, 58, 58, 58, 58, ++ 58, 58, 58, 58, 58, 58, 58, -99 ++ ++ }, ++ ++ { ++ 11, -100, -100, -100, -100, -100, -100, -100, -100, -100, ++ -100, -100, -100, 58, -100, -100, 58, 58, 123, 58, ++ 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, ++ 58, 58, 58, 58, 58, 58, 58, -100 ++ }, ++ ++ { ++ 11, -101, -101, -101, -101, -101, -101, -101, -101, -101, ++ -101, -101, -101, 58, -101, -101, 58, 58, 58, 124, ++ 58, 58, 58, 58, 58, 125, 58, 126, 58, 58, ++ 58, 58, 58, 58, 58, 58, 58, -101 ++ }, ++ ++ { ++ 11, -102, -102, -102, -102, -102, -102, -102, -102, -102, ++ -102, -102, -102, 58, -102, -102, 58, 58, 58, 58, ++ ++ 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, ++ 127, 58, 58, 58, 58, 58, 58, -102 ++ }, ++ ++ { ++ 11, -103, -103, -103, -103, -103, -103, -103, -103, -103, ++ -103, -103, -103, 58, -103, -103, 58, 58, 58, 58, ++ 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, ++ 58, 58, 58, 58, 58, 58, 58, -103 ++ }, ++ ++ { ++ 11, -104, -104, -104, -104, -104, -104, -104, -104, -104, ++ -104, -104, -104, 58, -104, -104, 58, 58, 58, 58, ++ 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, ++ 58, 58, 58, 58, 58, 58, 58, -104 ++ ++ }, ++ ++ { ++ 11, -105, -105, -105, -105, -105, -105, -105, -105, -105, ++ -105, -105, -105, 58, -105, -105, 58, 58, 58, 58, ++ 58, 58, 58, 58, 58, 58, 58, 58, 128, 58, ++ 58, 58, 58, 58, 58, 58, 58, -105 ++ }, ++ ++ { ++ 11, -106, -106, -106, -106, -106, -106, -106, -106, -106, ++ -106, -106, -106, 58, -106, -106, 58, 58, 58, 58, ++ 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, ++ 58, 58, 58, 58, 58, 129, 58, -106 ++ }, ++ ++ { ++ 11, -107, -107, -107, -107, -107, -107, -107, -107, -107, ++ -107, -107, -107, 58, -107, -107, 58, 58, 58, 58, ++ ++ 58, 58, 58, 58, 58, 130, 58, 58, 58, 58, ++ 58, 58, 58, 58, 58, 58, 58, -107 ++ }, ++ ++ { ++ 11, -108, -108, -108, -108, -108, -108, -108, -108, -108, ++ -108, -108, -108, 58, -108, -108, 58, 58, 58, 58, ++ 58, 58, 58, 58, 58, 58, 58, 131, 58, 58, ++ 58, 58, 58, 58, 58, 58, 58, -108 ++ }, ++ ++ { ++ 11, -109, -109, -109, -109, -109, -109, -109, -109, -109, ++ -109, -109, -109, 58, -109, -109, 58, 58, 58, 58, ++ 58, 58, 58, 132, 58, 58, 58, 58, 58, 58, ++ 58, 58, 58, 58, 58, 58, 58, -109 ++ ++ }, ++ ++ { ++ 11, -110, -110, -110, -110, -110, -110, -110, -110, -110, ++ -110, -110, -110, 58, -110, -110, 58, 58, 58, 58, ++ 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, ++ 58, 58, 58, 58, 58, 133, 58, -110 ++ }, ++ ++ { ++ 11, -111, -111, -111, -111, -111, -111, -111, -111, -111, ++ -111, -111, -111, 58, -111, -111, 58, 58, 58, 58, ++ 58, 134, 58, 58, 58, 58, 58, 58, 58, 58, ++ 58, 58, 58, 58, 58, 58, 58, -111 ++ }, ++ ++ { ++ 11, -112, -112, -112, -112, -112, -112, -112, -112, -112, ++ -112, -112, -112, 58, -112, -112, 58, 58, 58, 58, ++ ++ 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, ++ 58, 58, 135, 58, 58, 58, 58, -112 ++ }, ++ ++ { ++ 11, -113, -113, -113, -113, -113, -113, -113, -113, -113, ++ -113, -113, -113, 58, -113, -113, 58, 58, 58, 58, ++ 58, 58, 58, 58, 58, 136, 58, 58, 58, 58, ++ 58, 58, 58, 58, 58, 58, 58, -113 ++ }, ++ ++ { ++ 11, -114, -114, -114, -114, -114, -114, -114, -114, -114, ++ -114, -114, -114, 58, -114, -114, 58, 58, 58, 58, ++ 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, ++ 58, 58, 58, 137, 58, 58, 58, -114 ++ ++ }, ++ ++ { ++ 11, -115, -115, -115, -115, -115, -115, -115, -115, -115, ++ -115, 89, 89, 89, -115, -115, 89, 89, 89, 89, ++ 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, ++ 89, 89, 89, 89, 89, 89, 89, -115 ++ }, ++ ++ { ++ 11, -116, -116, -116, -116, -116, -116, -116, -116, -116, ++ -116, -116, -116, 58, -116, -116, 58, 58, 58, 58, ++ 58, 138, 58, 58, 58, 58, 58, 58, 58, 58, ++ 58, 58, 58, 58, 58, 58, 58, -116 ++ }, ++ ++ { ++ 11, -117, -117, -117, -117, -117, -117, -117, -117, -117, ++ -117, -117, -117, 58, -117, -117, 58, 58, 58, 139, ++ ++ 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, ++ 58, 58, 58, 58, 58, 58, 58, -117 ++ }, ++ ++ { ++ 11, -118, -118, -118, -118, -118, -118, -118, -118, -118, ++ -118, -118, -118, 58, -118, -118, 58, 58, 58, 58, ++ 58, 140, 58, 58, 58, 58, 58, 58, 58, 58, ++ 58, 58, 58, 58, 58, 58, 58, -118 ++ }, ++ ++ { ++ 11, -119, -119, -119, -119, -119, -119, -119, -119, -119, ++ -119, -119, -119, 58, -119, -119, 58, 58, 58, 58, ++ 58, 58, 58, 58, 58, 141, 58, 58, 58, 58, ++ 58, 58, 58, 58, 58, 58, 58, -119 ++ ++ }, ++ ++ { ++ 11, -120, -120, -120, -120, -120, -120, -120, -120, -120, ++ -120, -120, -120, 58, -120, -120, 58, 58, 142, 58, ++ 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, ++ 58, 58, 58, 58, 143, 58, 58, -120 ++ }, ++ ++ { ++ 11, -121, -121, -121, -121, -121, -121, -121, -121, -121, ++ -121, -121, -121, 58, -121, -121, 58, 58, 58, 58, ++ 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, ++ 58, 58, 58, 58, 58, 144, 58, -121 ++ }, ++ ++ { ++ 11, -122, -122, -122, -122, -122, -122, -122, -122, -122, ++ -122, -122, -122, 58, -122, -122, 58, 58, 58, 58, ++ ++ 58, 58, 58, 58, 58, 58, 58, 58, 145, 58, ++ 58, 58, 58, 58, 58, 58, 58, -122 ++ }, ++ ++ { ++ 11, -123, -123, -123, -123, -123, -123, -123, -123, -123, ++ -123, -123, -123, 58, -123, -123, 58, 58, 58, 58, ++ 58, 58, 58, 58, 58, 58, 146, 58, 58, 58, ++ 58, 58, 58, 58, 58, 58, 58, -123 ++ }, ++ ++ { ++ 11, -124, -124, -124, -124, -124, -124, -124, -124, -124, ++ -124, -124, -124, 58, -124, -124, 58, 58, 58, 58, ++ 58, 58, 58, 58, 147, 58, 58, 58, 58, 58, ++ 58, 58, 58, 58, 58, 58, 58, -124 ++ ++ }, ++ ++ { ++ 11, -125, -125, -125, -125, -125, -125, -125, -125, -125, ++ -125, -125, -125, 58, -125, -125, 58, 58, 58, 58, ++ 58, 58, 148, 58, 58, 58, 58, 58, 58, 58, ++ 58, 58, 58, 58, 58, 58, 58, -125 ++ }, ++ ++ { ++ 11, -126, -126, -126, -126, -126, -126, -126, -126, -126, ++ -126, -126, -126, 58, -126, -126, 58, 58, 58, 58, ++ 58, 149, 58, 58, 58, 58, 58, 58, 58, 58, ++ 58, 58, 58, 58, 58, 58, 58, -126 ++ }, ++ ++ { ++ 11, -127, -127, -127, -127, -127, -127, -127, -127, -127, ++ -127, -127, -127, 58, -127, -127, 58, 58, 58, 58, ++ ++ 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, ++ 58, 58, 58, 58, 58, 58, 58, -127 ++ }, ++ ++ { ++ 11, -128, -128, -128, -128, -128, -128, -128, -128, -128, ++ -128, -128, -128, 58, -128, -128, 58, 58, 58, 58, ++ 58, 58, 58, 58, 58, 58, 58, 150, 58, 58, ++ 58, 58, 58, 58, 58, 58, 58, -128 ++ }, ++ ++ { ++ 11, -129, -129, -129, -129, -129, -129, -129, -129, -129, ++ -129, -129, -129, 58, -129, -129, 58, 58, 58, 151, ++ 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, ++ 58, 58, 58, 58, 58, 58, 58, -129 ++ ++ }, ++ ++ { ++ 11, -130, -130, -130, -130, -130, -130, -130, -130, -130, ++ -130, -130, -130, 58, -130, -130, 58, 58, 58, 58, ++ 58, 58, 58, 58, 58, 58, 58, 58, 58, 152, ++ 58, 58, 58, 58, 58, 58, 58, -130 ++ }, ++ ++ { ++ 11, -131, -131, -131, -131, -131, -131, -131, -131, -131, ++ -131, -131, -131, 58, -131, -131, 58, 58, 58, 58, ++ 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, ++ 153, 58, 58, 58, 58, 58, 58, -131 ++ }, ++ ++ { ++ 11, -132, -132, -132, -132, -132, -132, -132, -132, -132, ++ -132, -132, -132, 58, -132, -132, 58, 58, 58, 58, ++ ++ 58, 154, 58, 58, 58, 58, 58, 58, 58, 58, ++ 58, 58, 58, 58, 58, 58, 58, -132 ++ }, ++ ++ { ++ 11, -133, -133, -133, -133, -133, -133, -133, -133, -133, ++ -133, -133, -133, 58, -133, -133, 58, 58, 58, 58, ++ 58, 58, 58, 58, 58, 155, 58, 58, 58, 58, ++ 58, 58, 58, 58, 58, 58, 58, -133 ++ }, ++ ++ { ++ 11, -134, -134, -134, -134, -134, -134, -134, -134, -134, ++ -134, -134, -134, 58, -134, -134, 58, 58, 58, 156, ++ 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, ++ 58, 58, 58, 58, 58, 58, 58, -134 ++ ++ }, ++ ++ { ++ 11, -135, -135, -135, -135, -135, -135, -135, -135, -135, ++ -135, -135, -135, 58, -135, -135, 58, 58, 58, 157, ++ 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, ++ 58, 58, 58, 58, 58, 58, 58, -135 ++ }, ++ ++ { ++ 11, -136, -136, -136, -136, -136, -136, -136, -136, -136, ++ -136, -136, -136, 58, -136, -136, 58, 58, 58, 58, ++ 58, 58, 58, 58, 58, 58, 58, 58, 158, 58, ++ 58, 58, 58, 58, 58, 58, 58, -136 ++ }, ++ ++ { ++ 11, -137, -137, -137, -137, -137, -137, -137, -137, -137, ++ -137, -137, -137, 58, -137, -137, 58, 58, 58, 58, ++ ++ 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, ++ 58, 58, 58, 58, 159, 58, 58, -137 ++ }, ++ ++ { ++ 11, -138, -138, -138, -138, -138, -138, -138, -138, -138, ++ -138, -138, -138, 58, -138, -138, 58, 160, 58, 58, ++ 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, ++ 58, 58, 58, 58, 58, 58, 58, -138 ++ }, ++ ++ { ++ 11, -139, -139, -139, -139, -139, -139, -139, -139, -139, ++ -139, -139, -139, 58, -139, -139, 58, 58, 58, 58, ++ 58, 161, 58, 58, 58, 58, 58, 58, 58, 58, ++ 58, 58, 58, 58, 58, 58, 58, -139 ++ ++ }, ++ ++ { ++ 11, -140, -140, -140, -140, -140, -140, -140, -140, -140, ++ -140, -140, -140, 58, -140, -140, 58, 58, 58, 58, ++ 58, 58, 58, 58, 58, 58, 58, 58, 162, 58, ++ 58, 58, 58, 58, 58, 58, 58, -140 ++ }, ++ ++ { ++ 11, -141, -141, -141, -141, -141, -141, -141, -141, -141, ++ -141, -141, -141, 58, -141, -141, 58, 58, 58, 58, ++ 58, 58, 58, 163, 58, 58, 58, 58, 58, 58, ++ 58, 58, 58, 58, 58, 58, 58, -141 ++ }, ++ ++ { ++ 11, -142, -142, -142, -142, -142, -142, -142, -142, -142, ++ -142, -142, -142, 58, -142, -142, 58, 58, 58, 58, ++ ++ 58, 58, 58, 58, 58, 58, 58, 58, 58, 164, ++ 58, 58, 58, 58, 58, 58, 58, -142 ++ }, ++ ++ { ++ 11, -143, -143, -143, -143, -143, -143, -143, -143, -143, ++ -143, -143, -143, 58, -143, -143, 58, 58, 58, 58, ++ 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, ++ 58, 58, 165, 58, 58, 58, 58, -143 ++ }, ++ ++ { ++ 11, -144, -144, -144, -144, -144, -144, -144, -144, -144, ++ -144, -144, -144, 58, -144, -144, 58, 58, 58, 58, ++ 58, 58, 58, 58, 58, 58, 166, 58, 58, 58, ++ 58, 58, 58, 58, 58, 58, 58, -144 ++ ++ }, ++ ++ { ++ 11, -145, -145, -145, -145, -145, -145, -145, -145, -145, ++ -145, -145, -145, 58, -145, -145, 58, 58, 58, 58, ++ 167, 58, 58, 58, 58, 58, 58, 58, 58, 58, ++ 58, 58, 58, 58, 58, 58, 58, -145 ++ }, ++ ++ { ++ 11, -146, -146, -146, -146, -146, -146, -146, -146, -146, ++ -146, -146, -146, 58, -146, -146, 58, 58, 58, 58, ++ 58, 168, 58, 58, 58, 58, 58, 58, 58, 58, ++ 58, 58, 58, 58, 58, 58, 58, -146 ++ }, ++ ++ { ++ 11, -147, -147, -147, -147, -147, -147, -147, -147, -147, ++ -147, -147, -147, 58, -147, -147, 58, 58, 58, 58, ++ ++ 58, 58, 58, 58, 58, 58, 58, 58, 58, 169, ++ 58, 58, 58, 58, 58, 58, 58, -147 ++ }, ++ ++ { ++ 11, -148, -148, -148, -148, -148, -148, -148, -148, -148, ++ -148, -148, -148, 58, -148, -148, 58, 58, 58, 58, ++ 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, ++ 58, 58, 58, 58, 58, 58, 58, -148 ++ }, ++ ++ { ++ 11, -149, -149, -149, -149, -149, -149, -149, -149, -149, ++ -149, -149, -149, 58, -149, -149, 58, 58, 58, 58, ++ 58, 58, 58, 58, 58, 58, 58, 58, 170, 58, ++ 58, 58, 58, 58, 58, 58, 58, -149 ++ ++ }, ++ ++ { ++ 11, -150, -150, -150, -150, -150, -150, -150, -150, -150, ++ -150, -150, -150, 58, -150, -150, 58, 58, 58, 58, ++ 58, 171, 58, 58, 58, 58, 58, 58, 58, 58, ++ 58, 58, 58, 58, 58, 58, 58, -150 ++ }, ++ ++ { ++ 11, -151, -151, -151, -151, -151, -151, -151, -151, -151, ++ -151, -151, -151, 58, -151, -151, 58, 58, 58, 58, ++ 58, 58, 58, 58, 58, 58, 58, 58, 58, 172, ++ 58, 58, 58, 58, 58, 58, 58, -151 ++ }, ++ ++ { ++ 11, -152, -152, -152, -152, -152, -152, -152, -152, -152, ++ -152, -152, -152, 58, -152, -152, 58, 58, 58, 58, ++ ++ 58, 58, 58, 58, 58, 58, 58, 58, 173, 58, ++ 58, 58, 58, 58, 58, 58, 58, -152 ++ }, ++ ++ { ++ 11, -153, -153, -153, -153, -153, -153, -153, -153, -153, ++ -153, -153, -153, 58, -153, -153, 58, 58, 58, 58, ++ 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, ++ 58, 58, 58, 58, 174, 58, 58, -153 ++ }, ++ ++ { ++ 11, -154, -154, -154, -154, -154, -154, -154, -154, -154, ++ -154, -154, -154, 58, -154, -154, 58, 58, 58, 58, ++ 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, ++ 58, 58, 58, 58, 58, 58, 58, -154 ++ ++ }, ++ ++ { ++ 11, -155, -155, -155, -155, -155, -155, -155, -155, -155, ++ -155, -155, -155, 58, -155, -155, 58, 58, 58, 58, ++ 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, ++ 58, 58, 175, 58, 58, 58, 58, -155 ++ }, ++ ++ { ++ 11, -156, -156, -156, -156, -156, -156, -156, -156, -156, ++ -156, -156, -156, 58, -156, -156, 58, 58, 58, 58, ++ 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, ++ 58, 58, 58, 58, 176, 58, 58, -156 ++ }, ++ ++ { ++ 11, -157, -157, -157, -157, -157, -157, -157, -157, -157, ++ -157, -157, -157, 58, -157, -157, 58, 58, 58, 58, ++ ++ 58, 177, 58, 58, 58, 58, 58, 58, 58, 58, ++ 58, 58, 58, 58, 58, 58, 58, -157 ++ }, ++ ++ { ++ 11, -158, -158, -158, -158, -158, -158, -158, -158, -158, ++ -158, -158, -158, 58, -158, -158, 58, 58, 58, 58, ++ 58, 58, 58, 178, 58, 58, 58, 58, 58, 58, ++ 58, 58, 58, 58, 58, 58, 58, -158 ++ }, ++ ++ { ++ 11, -159, -159, -159, -159, -159, -159, -159, -159, -159, ++ -159, -159, -159, 58, -159, -159, 58, 179, 58, 58, ++ 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, ++ 58, 58, 58, 58, 58, 58, 58, -159 ++ ++ }, ++ ++ { ++ 11, -160, -160, -160, -160, -160, -160, -160, -160, -160, ++ -160, -160, -160, 58, -160, -160, 58, 58, 58, 58, ++ 58, 58, 58, 58, 58, 58, 58, 58, 180, 58, ++ 58, 58, 58, 58, 58, 58, 58, -160 ++ }, ++ ++ { ++ 11, -161, -161, -161, -161, -161, -161, -161, -161, -161, ++ -161, -161, -161, 58, -161, -161, 58, 58, 58, 58, ++ 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, ++ 58, 58, 58, 58, 58, 58, 58, -161 ++ }, ++ ++ { ++ 11, -162, -162, -162, -162, -162, -162, -162, -162, -162, ++ -162, -162, -162, 58, -162, -162, 58, 58, 58, 58, ++ ++ 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, ++ 58, 58, 58, 58, 181, 58, 58, -162 ++ }, ++ ++ { ++ 11, -163, -163, -163, -163, -163, -163, -163, -163, -163, ++ -163, -163, -163, 58, -163, -163, 58, 58, 58, 58, ++ 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, ++ 58, 58, 58, 58, 58, 58, 58, -163 ++ }, ++ ++ { ++ 11, -164, -164, -164, -164, -164, -164, -164, -164, -164, ++ -164, -164, -164, 58, -164, -164, 58, 58, 58, 58, ++ 58, 58, 58, 58, 58, 58, 58, 58, 58, 182, ++ 58, 58, 58, 58, 58, 58, 58, -164 ++ ++ }, ++ ++ { ++ 11, -165, -165, -165, -165, -165, -165, -165, -165, -165, ++ -165, -165, -165, 58, -165, -165, 58, 58, 58, 58, ++ 58, 58, 58, 58, 58, 183, 58, 58, 58, 58, ++ 58, 58, 58, 58, 58, 58, 58, -165 ++ }, ++ ++ { ++ 11, -166, -166, -166, -166, -166, -166, -166, -166, -166, ++ -166, -166, -166, 58, -166, -166, 58, 58, 58, 58, ++ 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, ++ 58, 58, 58, 58, 184, 58, 58, -166 ++ }, ++ ++ { ++ 11, -167, -167, -167, -167, -167, -167, -167, -167, -167, ++ -167, -167, -167, 58, -167, -167, 58, 58, 58, 58, ++ ++ 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, ++ 58, 58, 58, 185, 58, 58, 58, -167 ++ }, ++ ++ { ++ 11, -168, -168, -168, -168, -168, -168, -168, -168, -168, ++ -168, -168, -168, 58, -168, -168, 58, 58, 58, 58, ++ 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, ++ 58, 58, 58, 58, 58, 58, 58, -168 ++ }, ++ ++ { ++ 11, -169, -169, -169, -169, -169, -169, -169, -169, -169, ++ -169, -169, -169, 58, -169, -169, 58, 58, 58, 58, ++ 58, 58, 58, 58, 58, 186, 58, 58, 58, 58, ++ 58, 58, 58, 58, 58, 58, 58, -169 ++ ++ }, ++ ++ { ++ 11, -170, -170, -170, -170, -170, -170, -170, -170, -170, ++ -170, -170, -170, 58, -170, -170, 58, 58, 58, 58, ++ 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, ++ 58, 58, 58, 58, 58, 187, 58, -170 ++ }, ++ ++ { ++ 11, -171, -171, -171, -171, -171, -171, -171, -171, -171, ++ -171, -171, -171, 58, -171, -171, 58, 58, 58, 58, ++ 58, 58, 58, 58, 58, 58, 58, 58, 188, 58, ++ 58, 58, 58, 58, 58, 58, 58, -171 ++ }, ++ ++ { ++ 11, -172, -172, -172, -172, -172, -172, -172, -172, -172, ++ -172, -172, -172, 58, -172, -172, 58, 58, 58, 58, ++ ++ 58, 58, 58, 58, 58, 58, 58, 58, 189, 58, ++ 58, 58, 58, 58, 58, 58, 58, -172 ++ }, ++ ++ { ++ 11, -173, -173, -173, -173, -173, -173, -173, -173, -173, ++ -173, -173, -173, 58, -173, -173, 58, 190, 58, 58, ++ 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, ++ 58, 58, 58, 58, 58, 58, 58, -173 ++ }, ++ ++ { ++ 11, -174, -174, -174, -174, -174, -174, -174, -174, -174, ++ -174, -174, -174, 58, -174, -174, 58, 58, 58, 58, ++ 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, ++ 58, 58, 58, 58, 58, 58, 58, -174 ++ ++ }, ++ ++ { ++ 11, -175, -175, -175, -175, -175, -175, -175, -175, -175, ++ -175, -175, -175, 58, -175, -175, 58, 58, 58, 58, ++ 58, 191, 58, 58, 58, 58, 58, 58, 58, 58, ++ 58, 58, 58, 58, 58, 58, 58, -175 ++ }, ++ ++ { ++ 11, -176, -176, -176, -176, -176, -176, -176, -176, -176, ++ -176, -176, -176, 58, -176, -176, 58, 58, 58, 58, ++ 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, ++ 58, 58, 58, 58, 58, 58, 58, -176 ++ }, ++ ++ { ++ 11, -177, -177, -177, -177, -177, -177, -177, -177, -177, ++ -177, -177, -177, 58, -177, -177, 58, 58, 58, 58, ++ ++ 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, ++ 58, 58, 58, 58, 58, 58, 58, -177 ++ }, ++ ++ { ++ 11, -178, -178, -178, -178, -178, -178, -178, -178, -178, ++ -178, -178, -178, 58, -178, -178, 58, 58, 58, 58, ++ 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, ++ 58, 58, 58, 58, 58, 58, 58, -178 ++ }, ++ ++ { ++ 11, -179, -179, -179, -179, -179, -179, -179, -179, -179, ++ -179, -179, -179, 58, -179, -179, 58, 58, 58, 58, ++ 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, ++ 58, 58, 58, 58, 192, 58, 58, -179 ++ ++ }, ++ ++ { ++ 11, -180, -180, -180, -180, -180, -180, -180, -180, -180, ++ -180, -180, -180, 58, -180, -180, 58, 58, 58, 58, ++ 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, ++ 58, 58, 58, 58, 58, 58, 58, -180 ++ }, ++ ++ { ++ 11, -181, -181, -181, -181, -181, -181, -181, -181, -181, ++ -181, -181, -181, 58, -181, -181, 58, 58, 58, 58, ++ 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, ++ 58, 58, 58, 58, 58, 58, 58, -181 ++ }, ++ ++ { ++ 11, -182, -182, -182, -182, -182, -182, -182, -182, -182, ++ -182, -182, -182, 58, -182, -182, 58, 58, 58, 58, ++ ++ 58, 58, 58, 58, 58, 58, 193, 58, 58, 58, ++ 58, 58, 58, 58, 58, 58, 58, -182 ++ }, ++ ++ { ++ 11, -183, -183, -183, -183, -183, -183, -183, -183, -183, ++ -183, -183, -183, 58, -183, -183, 58, 58, 58, 58, ++ 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, ++ 58, 58, 58, 194, 58, 58, 58, -183 ++ }, ++ ++ { ++ 11, -184, -184, -184, -184, -184, -184, -184, -184, -184, ++ -184, -184, -184, 58, -184, -184, 58, 58, 58, 58, ++ 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, ++ 58, 58, 58, 58, 58, 58, 58, -184 ++ ++ }, ++ ++ { ++ 11, -185, -185, -185, -185, -185, -185, -185, -185, -185, ++ -185, -185, -185, 58, -185, -185, 58, 58, 58, 58, ++ 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, ++ 58, 58, 58, 58, 58, 58, 58, -185 ++ }, ++ ++ { ++ 11, -186, -186, -186, -186, -186, -186, -186, -186, -186, ++ -186, -186, -186, 58, -186, -186, 58, 58, 58, 195, ++ 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, ++ 58, 58, 58, 58, 58, 58, 58, -186 ++ }, ++ ++ { ++ 11, -187, -187, -187, -187, -187, -187, -187, -187, -187, ++ -187, -187, -187, 58, -187, -187, 58, 58, 58, 58, ++ ++ 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, ++ 58, 58, 58, 58, 58, 58, 58, -187 ++ }, ++ ++ { ++ 11, -188, -188, -188, -188, -188, -188, -188, -188, -188, ++ -188, -188, -188, 58, -188, -188, 58, 58, 58, 58, ++ 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, ++ 58, 58, 58, 58, 58, 196, 58, -188 ++ }, ++ ++ { ++ 11, -189, -189, -189, -189, -189, -189, -189, -189, -189, ++ -189, -189, -189, 58, -189, -189, 58, 58, 58, 58, ++ 58, 58, 197, 58, 58, 58, 58, 58, 58, 58, ++ 58, 58, 58, 58, 58, 58, 58, -189 ++ ++ }, ++ ++ { ++ 11, -190, -190, -190, -190, -190, -190, -190, -190, -190, ++ -190, -190, -190, 58, -190, -190, 58, 58, 58, 58, ++ 58, 58, 58, 58, 58, 58, 198, 58, 58, 58, ++ 58, 58, 58, 58, 58, 58, 58, -190 ++ }, ++ ++ { ++ 11, -191, -191, -191, -191, -191, -191, -191, -191, -191, ++ -191, -191, -191, 58, -191, -191, 58, 58, 58, 58, ++ 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, ++ 58, 58, 58, 199, 58, 58, 58, -191 ++ }, ++ ++ { ++ 11, -192, -192, -192, -192, -192, -192, -192, -192, -192, ++ -192, -192, -192, 58, -192, -192, 58, 58, 58, 58, ++ ++ 58, 200, 58, 58, 58, 58, 58, 58, 58, 58, ++ 58, 58, 58, 58, 58, 58, 58, -192 ++ }, ++ ++ { ++ 11, -193, -193, -193, -193, -193, -193, -193, -193, -193, ++ -193, -193, -193, 58, -193, -193, 58, 58, 58, 58, ++ 58, 201, 58, 58, 58, 58, 58, 58, 58, 58, ++ 58, 58, 58, 58, 58, 58, 58, -193 ++ }, ++ ++ { ++ 11, -194, -194, -194, -194, -194, -194, -194, -194, -194, ++ -194, -194, -194, 58, -194, -194, 58, 58, 58, 58, ++ 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, ++ 58, 58, 58, 58, 202, 58, 58, -194 ++ ++ }, ++ ++ { ++ 11, -195, -195, -195, -195, -195, -195, -195, -195, -195, ++ -195, -195, -195, 58, -195, -195, 58, 58, 58, 58, ++ 58, 203, 58, 58, 58, 58, 58, 58, 58, 58, ++ 58, 58, 58, 58, 58, 58, 58, -195 ++ }, ++ ++ { ++ 11, -196, -196, -196, -196, -196, -196, -196, -196, -196, ++ -196, -196, -196, 58, -196, -196, 58, 58, 58, 58, ++ 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, ++ 58, 58, 58, 58, 58, 58, 58, -196 ++ }, ++ ++ { ++ 11, -197, -197, -197, -197, -197, -197, -197, -197, -197, ++ -197, -197, -197, 58, -197, -197, 58, 58, 58, 58, ++ ++ 58, 58, 58, 58, 58, 204, 58, 58, 58, 58, ++ 58, 58, 58, 58, 58, 58, 58, -197 ++ }, ++ ++ { ++ 11, -198, -198, -198, -198, -198, -198, -198, -198, -198, ++ -198, -198, -198, 58, -198, -198, 58, 58, 58, 58, ++ 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, ++ 58, 58, 58, 58, 58, 58, 58, -198 ++ }, ++ ++ { ++ 11, -199, -199, -199, -199, -199, -199, -199, -199, -199, ++ -199, -199, -199, 58, -199, -199, 58, 58, 58, 58, ++ 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, ++ 58, 58, 58, 58, 58, 58, 58, -199 ++ ++ }, ++ ++ { ++ 11, -200, -200, -200, -200, -200, -200, -200, -200, -200, ++ -200, -200, -200, 58, -200, -200, 58, 58, 58, 58, ++ 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, ++ 58, 58, 58, 58, 58, 58, 58, -200 ++ }, ++ ++ { ++ 11, -201, -201, -201, -201, -201, -201, -201, -201, -201, ++ -201, -201, -201, 58, -201, -201, 58, 205, 58, 58, ++ 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, ++ 58, 58, 58, 58, 58, 58, 58, -201 ++ }, ++ ++ { ++ 11, -202, -202, -202, -202, -202, -202, -202, -202, -202, ++ -202, -202, -202, 58, -202, -202, 58, 206, 58, 58, ++ ++ 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, ++ 58, 58, 58, 58, 58, 58, 58, -202 ++ }, ++ ++ { ++ 11, -203, -203, -203, -203, -203, -203, -203, -203, -203, ++ -203, -203, -203, 58, -203, -203, 58, 58, 58, 58, ++ 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, ++ 58, 58, 58, 58, 58, 58, 58, -203 ++ }, ++ ++ { ++ 11, -204, -204, -204, -204, -204, -204, -204, -204, -204, ++ -204, -204, -204, 58, -204, -204, 58, 58, 58, 58, ++ 58, 58, 58, 207, 58, 58, 58, 58, 58, 58, ++ 58, 58, 58, 58, 58, 58, 58, -204 ++ ++ }, ++ ++ { ++ 11, -205, -205, -205, -205, -205, -205, -205, -205, -205, ++ -205, -205, -205, 58, -205, -205, 58, 58, 58, 58, ++ 58, 58, 58, 58, 58, 58, 58, 58, 208, 58, ++ 58, 58, 58, 58, 58, 58, 58, -205 ++ }, ++ ++ { ++ 11, -206, -206, -206, -206, -206, -206, -206, -206, -206, ++ -206, -206, -206, 58, -206, -206, 58, 58, 58, 58, ++ 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, ++ 58, 58, 58, 58, 209, 58, 58, -206 ++ }, ++ ++ { ++ 11, -207, -207, -207, -207, -207, -207, -207, -207, -207, ++ -207, -207, -207, 58, -207, -207, 58, 58, 58, 58, ++ ++ 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, ++ 58, 58, 58, 58, 58, 58, 58, -207 ++ }, ++ ++ { ++ 11, -208, -208, -208, -208, -208, -208, -208, -208, -208, ++ -208, -208, -208, 58, -208, -208, 58, 58, 58, 58, ++ 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, ++ 58, 58, 58, 58, 58, 58, 58, -208 ++ }, ++ ++ { ++ 11, -209, -209, -209, -209, -209, -209, -209, -209, -209, ++ -209, -209, -209, 58, -209, -209, 58, 58, 58, 58, ++ 58, 210, 58, 58, 58, 58, 58, 58, 58, 58, ++ 58, 58, 58, 58, 58, 58, 58, -209 ++ ++ }, ++ ++ { ++ 11, -210, -210, -210, -210, -210, -210, -210, -210, -210, ++ -210, -210, -210, 58, -210, -210, 58, 58, 58, 58, ++ 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, ++ 58, 58, 58, 58, 58, 58, 58, -210 ++ }, ++ ++ } ; ++ ++static yy_state_type yy_get_previous_state (void ); ++static yy_state_type yy_try_NUL_trans (yy_state_type current_state ); ++static int yy_get_next_buffer (void ); ++static void yy_fatal_error (yyconst char msg[] ); ++ ++/* Done after the current pattern has been matched and before the ++ * corresponding action - sets up zconftext. ++ */ ++#define YY_DO_BEFORE_ACTION \ ++ (yytext_ptr) = yy_bp; \ ++ zconfleng = (size_t) (yy_cp - yy_bp); \ ++ (yy_hold_char) = *yy_cp; \ ++ *yy_cp = '\0'; \ ++ (yy_c_buf_p) = yy_cp; ++ ++#define YY_NUM_RULES 64 ++#define YY_END_OF_BUFFER 65 ++/* This struct is not used in this scanner, ++ but its presence is necessary. */ ++struct yy_trans_info ++ { ++ flex_int32_t yy_verify; ++ flex_int32_t yy_nxt; ++ }; ++static yyconst flex_int16_t yy_accept[211] = ++ { 0, ++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ++ 65, 5, 4, 3, 2, 36, 37, 35, 35, 35, ++ 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, ++ 63, 60, 62, 55, 59, 58, 57, 53, 48, 42, ++ 47, 51, 53, 40, 41, 50, 50, 43, 53, 50, ++ 50, 53, 4, 3, 2, 2, 1, 35, 35, 35, ++ 35, 35, 35, 35, 16, 35, 35, 35, 35, 35, ++ 35, 35, 35, 35, 35, 35, 63, 60, 62, 61, ++ 55, 54, 57, 56, 44, 51, 38, 50, 50, 52, ++ 45, 46, 39, 35, 35, 35, 35, 35, 35, 35, ++ ++ 35, 35, 30, 29, 35, 35, 35, 35, 35, 35, ++ 35, 35, 35, 35, 49, 25, 35, 35, 35, 35, ++ 35, 35, 35, 35, 35, 35, 15, 35, 7, 35, ++ 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, ++ 35, 35, 35, 35, 35, 35, 35, 17, 35, 35, ++ 35, 35, 35, 34, 35, 35, 35, 35, 35, 35, ++ 10, 35, 13, 35, 35, 35, 35, 33, 35, 35, ++ 35, 35, 35, 22, 35, 32, 9, 31, 35, 26, ++ 12, 35, 35, 21, 18, 35, 8, 35, 35, 35, ++ 35, 35, 27, 35, 35, 6, 35, 20, 19, 23, ++ ++ 35, 35, 11, 35, 35, 35, 14, 28, 35, 24 ++ } ; ++ ++static yyconst flex_int32_t yy_ec[256] = ++ { 0, ++ 1, 1, 1, 1, 1, 1, 1, 1, 2, 3, ++ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, ++ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, ++ 1, 2, 4, 5, 6, 1, 1, 7, 8, 9, ++ 10, 1, 1, 1, 11, 12, 12, 13, 13, 13, ++ 13, 13, 13, 13, 13, 13, 13, 1, 1, 1, ++ 14, 1, 1, 1, 13, 13, 13, 13, 13, 13, ++ 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, ++ 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, ++ 1, 15, 1, 1, 16, 1, 17, 18, 19, 20, ++ ++ 21, 22, 23, 24, 25, 13, 13, 26, 27, 28, ++ 29, 30, 31, 32, 33, 34, 35, 13, 13, 36, ++ 13, 13, 1, 37, 1, 1, 1, 1, 1, 1, ++ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, ++ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, ++ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, ++ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, ++ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, ++ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, ++ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, ++ ++ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, ++ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, ++ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, ++ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, ++ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, ++ 1, 1, 1, 1, 1 ++ } ; ++ ++extern int zconf_flex_debug; ++int zconf_flex_debug = 0; ++ ++/* The intent behind this definition is that it'll catch ++ * any uses of REJECT which flex missed. ++ */ ++#define REJECT reject_used_but_not_detected ++#define yymore() yymore_used_but_not_detected ++#define YY_MORE_ADJ 0 ++#define YY_RESTORE_YY_MORE_OFFSET ++char *zconftext; ++ ++/* ++ * Copyright (C) 2002 Roman Zippel ++ * Released under the terms of the GNU GPL v2.0. ++ */ ++ ++#include ++#include ++#include ++#include ++#include ++ ++#define LKC_DIRECT_LINK ++#include "lkc.h" ++ ++#define START_STRSIZE 16 ++ ++char *text; ++static char *text_ptr; ++static int text_size, text_asize; ++ ++struct buffer { ++ struct buffer *parent; ++ YY_BUFFER_STATE state; ++}; ++ ++struct buffer *current_buf; ++ ++static int last_ts, first_ts; ++ ++static void zconf_endhelp(void); ++static struct buffer *zconf_endfile(void); ++ ++void new_string(void) ++{ ++ text = malloc(START_STRSIZE); ++ text_asize = START_STRSIZE; ++ text_ptr = text; ++ text_size = 0; ++ *text_ptr = 0; ++} ++ ++void append_string(const char *str, int size) ++{ ++ int new_size = text_size + size + 1; ++ if (new_size > text_asize) { ++ text = realloc(text, new_size); ++ text_asize = new_size; ++ text_ptr = text + text_size; ++ } ++ memcpy(text_ptr, str, size); ++ text_ptr += size; ++ text_size += size; ++ *text_ptr = 0; ++} ++ ++void alloc_string(const char *str, int size) ++{ ++ text = malloc(size + 1); ++ memcpy(text, str, size); ++ text[size] = 0; ++} ++ ++#define INITIAL 0 ++#define COMMAND 1 ++#define HELP 2 ++#define STRING 3 ++#define PARAM 4 ++ ++/* Special case for "unistd.h", since it is non-ANSI. We include it way ++ * down here because we want the user's section 1 to have been scanned first. ++ * The user has a chance to override it with an option. ++ */ ++#include ++ ++#ifndef YY_EXTRA_TYPE ++#define YY_EXTRA_TYPE void * ++#endif ++ ++/* Macros after this point can all be overridden by user definitions in ++ * section 1. ++ */ ++ ++#ifndef YY_SKIP_YYWRAP ++#ifdef __cplusplus ++extern "C" int zconfwrap (void ); ++#else ++extern int zconfwrap (void ); ++#endif ++#endif ++ ++ static void yyunput (int c,char *buf_ptr ); ++ ++#ifndef yytext_ptr ++static void yy_flex_strncpy (char *,yyconst char *,int ); ++#endif ++ ++#ifdef YY_NEED_STRLEN ++static int yy_flex_strlen (yyconst char * ); ++#endif ++ ++#ifndef YY_NO_INPUT ++ ++#ifdef __cplusplus ++static int yyinput (void ); ++#else ++static int input (void ); ++#endif ++ ++#endif ++ ++/* Amount of stuff to slurp up with each read. */ ++#ifndef YY_READ_BUF_SIZE ++#define YY_READ_BUF_SIZE 8192 ++#endif ++ ++/* Copy whatever the last rule matched to the standard output. */ ++#ifndef ECHO ++/* This used to be an fputs(), but since the string might contain NUL's, ++ * we now use fwrite(). ++ */ ++#define ECHO (void) fwrite( zconftext, zconfleng, 1, zconfout ) ++#endif ++ ++/* Gets input and stuffs it into "buf". number of characters read, or YY_NULL, ++ * is returned in "result". ++ */ ++#ifndef YY_INPUT ++#define YY_INPUT(buf,result,max_size) \ ++ errno=0; \ ++ while ( (result = read( fileno(zconfin), (char *) buf, max_size )) < 0 ) \ ++ { \ ++ if( errno != EINTR) \ ++ { \ ++ YY_FATAL_ERROR( "input in flex scanner failed" ); \ ++ break; \ ++ } \ ++ errno=0; \ ++ clearerr(zconfin); \ ++ }\ ++\ ++ ++#endif ++ ++/* No semi-colon after return; correct usage is to write "yyterminate();" - ++ * we don't want an extra ';' after the "return" because that will cause ++ * some compilers to complain about unreachable statements. ++ */ ++#ifndef yyterminate ++#define yyterminate() return YY_NULL ++#endif ++ ++/* Number of entries by which start-condition stack grows. */ ++#ifndef YY_START_STACK_INCR ++#define YY_START_STACK_INCR 25 ++#endif ++ ++/* Report a fatal error. */ ++#ifndef YY_FATAL_ERROR ++#define YY_FATAL_ERROR(msg) yy_fatal_error( msg ) ++#endif ++ ++/* end tables serialization structures and prototypes */ ++ ++/* Default declaration of generated scanner - a define so the user can ++ * easily add parameters. ++ */ ++#ifndef YY_DECL ++#define YY_DECL_IS_OURS 1 ++ ++extern int zconflex (void); ++ ++#define YY_DECL int zconflex (void) ++#endif /* !YY_DECL */ ++ ++/* Code executed at the beginning of each rule, after zconftext and zconfleng ++ * have been set up. ++ */ ++#ifndef YY_USER_ACTION ++#define YY_USER_ACTION ++#endif ++ ++/* Code executed at the end of each rule. */ ++#ifndef YY_BREAK ++#define YY_BREAK break; ++#endif ++ ++#define YY_RULE_SETUP \ ++ YY_USER_ACTION ++ ++/** The main scanner function which does all the work. ++ */ ++YY_DECL ++{ ++ register yy_state_type yy_current_state; ++ register char *yy_cp, *yy_bp; ++ register int yy_act; ++ ++ int str = 0; ++ int ts, i; ++ ++ if ( (yy_init) ) ++ { ++ (yy_init) = 0; ++ ++#ifdef YY_USER_INIT ++ YY_USER_INIT; ++#endif ++ ++ if ( ! (yy_start) ) ++ (yy_start) = 1; /* first start state */ ++ ++ if ( ! zconfin ) ++ zconfin = stdin; ++ ++ if ( ! zconfout ) ++ zconfout = stdout; ++ ++ if ( ! YY_CURRENT_BUFFER ) { ++ zconfensure_buffer_stack (); ++ YY_CURRENT_BUFFER_LVALUE = ++ zconf_create_buffer(zconfin,YY_BUF_SIZE ); ++ } ++ ++ zconf_load_buffer_state( ); ++ } ++ ++ while ( 1 ) /* loops until end-of-file is reached */ ++ { ++ yy_cp = (yy_c_buf_p); ++ ++ /* Support of zconftext. */ ++ *yy_cp = (yy_hold_char); ++ ++ /* yy_bp points to the position in yy_ch_buf of the start of ++ * the current run. ++ */ ++ yy_bp = yy_cp; ++ ++ yy_current_state = (yy_start); ++yy_match: ++ while ( (yy_current_state = yy_nxt[yy_current_state][ yy_ec[YY_SC_TO_UI(*yy_cp)] ]) > 0 ) ++ ++yy_cp; ++ ++ yy_current_state = -yy_current_state; ++ ++yy_find_action: ++ yy_act = yy_accept[yy_current_state]; ++ ++ YY_DO_BEFORE_ACTION; ++ ++do_action: /* This label is used only to access EOF actions. */ ++ ++ switch ( yy_act ) ++ { /* beginning of action switch */ ++case 1: ++/* rule 1 can match eol */ ++YY_RULE_SETUP ++current_file->lineno++; ++ YY_BREAK ++case 2: ++YY_RULE_SETUP ++ ++ YY_BREAK ++case 3: ++/* rule 3 can match eol */ ++YY_RULE_SETUP ++current_file->lineno++; return T_EOL; ++ YY_BREAK ++case 4: ++YY_RULE_SETUP ++{ ++ BEGIN(COMMAND); ++} ++ YY_BREAK ++case 5: ++YY_RULE_SETUP ++{ ++ unput(zconftext[0]); ++ BEGIN(COMMAND); ++} ++ YY_BREAK ++ ++case 6: ++YY_RULE_SETUP ++BEGIN(PARAM); return T_MAINMENU; ++ YY_BREAK ++case 7: ++YY_RULE_SETUP ++BEGIN(PARAM); return T_MENU; ++ YY_BREAK ++case 8: ++YY_RULE_SETUP ++BEGIN(PARAM); return T_ENDMENU; ++ YY_BREAK ++case 9: ++YY_RULE_SETUP ++BEGIN(PARAM); return T_SOURCE; ++ YY_BREAK ++case 10: ++YY_RULE_SETUP ++BEGIN(PARAM); return T_CHOICE; ++ YY_BREAK ++case 11: ++YY_RULE_SETUP ++BEGIN(PARAM); return T_ENDCHOICE; ++ YY_BREAK ++case 12: ++YY_RULE_SETUP ++BEGIN(PARAM); return T_COMMENT; ++ YY_BREAK ++case 13: ++YY_RULE_SETUP ++BEGIN(PARAM); return T_CONFIG; ++ YY_BREAK ++case 14: ++YY_RULE_SETUP ++BEGIN(PARAM); return T_MENUCONFIG; ++ YY_BREAK ++case 15: ++YY_RULE_SETUP ++BEGIN(PARAM); return T_HELP; ++ YY_BREAK ++case 16: ++YY_RULE_SETUP ++BEGIN(PARAM); return T_IF; ++ YY_BREAK ++case 17: ++YY_RULE_SETUP ++BEGIN(PARAM); return T_ENDIF; ++ YY_BREAK ++case 18: ++YY_RULE_SETUP ++BEGIN(PARAM); return T_DEPENDS; ++ YY_BREAK ++case 19: ++YY_RULE_SETUP ++BEGIN(PARAM); return T_REQUIRES; ++ YY_BREAK ++case 20: ++YY_RULE_SETUP ++BEGIN(PARAM); return T_OPTIONAL; ++ YY_BREAK ++case 21: ++YY_RULE_SETUP ++BEGIN(PARAM); return T_DEFAULT; ++ YY_BREAK ++case 22: ++YY_RULE_SETUP ++BEGIN(PARAM); return T_PROMPT; ++ YY_BREAK ++case 23: ++YY_RULE_SETUP ++BEGIN(PARAM); return T_TRISTATE; ++ YY_BREAK ++case 24: ++YY_RULE_SETUP ++BEGIN(PARAM); return T_DEF_TRISTATE; ++ YY_BREAK ++case 25: ++YY_RULE_SETUP ++BEGIN(PARAM); return T_BOOLEAN; ++ YY_BREAK ++case 26: ++YY_RULE_SETUP ++BEGIN(PARAM); return T_BOOLEAN; ++ YY_BREAK ++case 27: ++YY_RULE_SETUP ++BEGIN(PARAM); return T_DEF_BOOLEAN; ++ YY_BREAK ++case 28: ++YY_RULE_SETUP ++BEGIN(PARAM); return T_DEF_BOOLEAN; ++ YY_BREAK ++case 29: ++YY_RULE_SETUP ++BEGIN(PARAM); return T_INT; ++ YY_BREAK ++case 30: ++YY_RULE_SETUP ++BEGIN(PARAM); return T_HEX; ++ YY_BREAK ++case 31: ++YY_RULE_SETUP ++BEGIN(PARAM); return T_STRING; ++ YY_BREAK ++case 32: ++YY_RULE_SETUP ++BEGIN(PARAM); return T_SELECT; ++ YY_BREAK ++case 33: ++YY_RULE_SETUP ++BEGIN(PARAM); return T_SELECT; ++ YY_BREAK ++case 34: ++YY_RULE_SETUP ++BEGIN(PARAM); return T_RANGE; ++ YY_BREAK ++case 35: ++YY_RULE_SETUP ++{ ++ alloc_string(zconftext, zconfleng); ++ zconflval.string = text; ++ return T_WORD; ++ } ++ YY_BREAK ++case 36: ++YY_RULE_SETUP ++ ++ YY_BREAK ++case 37: ++/* rule 37 can match eol */ ++YY_RULE_SETUP ++current_file->lineno++; BEGIN(INITIAL); ++ YY_BREAK ++ ++case 38: ++YY_RULE_SETUP ++return T_AND; ++ YY_BREAK ++case 39: ++YY_RULE_SETUP ++return T_OR; ++ YY_BREAK ++case 40: ++YY_RULE_SETUP ++return T_OPEN_PAREN; ++ YY_BREAK ++case 41: ++YY_RULE_SETUP ++return T_CLOSE_PAREN; ++ YY_BREAK ++case 42: ++YY_RULE_SETUP ++return T_NOT; ++ YY_BREAK ++case 43: ++YY_RULE_SETUP ++return T_EQUAL; ++ YY_BREAK ++case 44: ++YY_RULE_SETUP ++return T_UNEQUAL; ++ YY_BREAK ++case 45: ++YY_RULE_SETUP ++return T_IF; ++ YY_BREAK ++case 46: ++YY_RULE_SETUP ++return T_ON; ++ YY_BREAK ++case 47: ++YY_RULE_SETUP ++{ ++ str = zconftext[0]; ++ new_string(); ++ BEGIN(STRING); ++ } ++ YY_BREAK ++case 48: ++/* rule 48 can match eol */ ++YY_RULE_SETUP ++BEGIN(INITIAL); current_file->lineno++; return T_EOL; ++ YY_BREAK ++case 49: ++YY_RULE_SETUP ++/* ignore */ ++ YY_BREAK ++case 50: ++YY_RULE_SETUP ++{ ++ alloc_string(zconftext, zconfleng); ++ zconflval.string = text; ++ return T_WORD; ++ } ++ YY_BREAK ++case 51: ++YY_RULE_SETUP ++/* comment */ ++ YY_BREAK ++case 52: ++/* rule 52 can match eol */ ++YY_RULE_SETUP ++current_file->lineno++; ++ YY_BREAK ++case 53: ++YY_RULE_SETUP ++ ++ YY_BREAK ++case YY_STATE_EOF(PARAM): ++{ ++ BEGIN(INITIAL); ++ } ++ YY_BREAK ++ ++case 54: ++/* rule 54 can match eol */ ++*yy_cp = (yy_hold_char); /* undo effects of setting up zconftext */ ++(yy_c_buf_p) = yy_cp -= 1; ++YY_DO_BEFORE_ACTION; /* set up zconftext again */ ++YY_RULE_SETUP ++{ ++ append_string(zconftext, zconfleng); ++ zconflval.string = text; ++ return T_WORD_QUOTE; ++ } ++ YY_BREAK ++case 55: ++YY_RULE_SETUP ++{ ++ append_string(zconftext, zconfleng); ++ } ++ YY_BREAK ++case 56: ++/* rule 56 can match eol */ ++*yy_cp = (yy_hold_char); /* undo effects of setting up zconftext */ ++(yy_c_buf_p) = yy_cp -= 1; ++YY_DO_BEFORE_ACTION; /* set up zconftext again */ ++YY_RULE_SETUP ++{ ++ append_string(zconftext + 1, zconfleng - 1); ++ zconflval.string = text; ++ return T_WORD_QUOTE; ++ } ++ YY_BREAK ++case 57: ++YY_RULE_SETUP ++{ ++ append_string(zconftext + 1, zconfleng - 1); ++ } ++ YY_BREAK ++case 58: ++YY_RULE_SETUP ++{ ++ if (str == zconftext[0]) { ++ BEGIN(PARAM); ++ zconflval.string = text; ++ return T_WORD_QUOTE; ++ } else ++ append_string(zconftext, 1); ++ } ++ YY_BREAK ++case 59: ++/* rule 59 can match eol */ ++YY_RULE_SETUP ++{ ++ printf("%s:%d:warning: multi-line strings not supported\n", zconf_curname(), zconf_lineno()); ++ current_file->lineno++; ++ BEGIN(INITIAL); ++ return T_EOL; ++ } ++ YY_BREAK ++case YY_STATE_EOF(STRING): ++{ ++ BEGIN(INITIAL); ++ } ++ YY_BREAK ++ ++case 60: ++YY_RULE_SETUP ++{ ++ ts = 0; ++ for (i = 0; i < zconfleng; i++) { ++ if (zconftext[i] == '\t') ++ ts = (ts & ~7) + 8; ++ else ++ ts++; ++ } ++ last_ts = ts; ++ if (first_ts) { ++ if (ts < first_ts) { ++ zconf_endhelp(); ++ return T_HELPTEXT; ++ } ++ ts -= first_ts; ++ while (ts > 8) { ++ append_string(" ", 8); ++ ts -= 8; ++ } ++ append_string(" ", ts); ++ } ++ } ++ YY_BREAK ++case 61: ++/* rule 61 can match eol */ ++*yy_cp = (yy_hold_char); /* undo effects of setting up zconftext */ ++(yy_c_buf_p) = yy_cp -= 1; ++YY_DO_BEFORE_ACTION; /* set up zconftext again */ ++YY_RULE_SETUP ++{ ++ current_file->lineno++; ++ zconf_endhelp(); ++ return T_HELPTEXT; ++ } ++ YY_BREAK ++case 62: ++/* rule 62 can match eol */ ++YY_RULE_SETUP ++{ ++ current_file->lineno++; ++ append_string("\n", 1); ++ } ++ YY_BREAK ++case 63: ++YY_RULE_SETUP ++{ ++ append_string(zconftext, zconfleng); ++ if (!first_ts) ++ first_ts = last_ts; ++ } ++ YY_BREAK ++case YY_STATE_EOF(HELP): ++{ ++ zconf_endhelp(); ++ return T_HELPTEXT; ++ } ++ YY_BREAK ++ ++case YY_STATE_EOF(INITIAL): ++case YY_STATE_EOF(COMMAND): ++{ ++ if (current_buf) { ++ zconf_endfile(); ++ return T_EOF; ++ } ++ fclose(zconfin); ++ yyterminate(); ++} ++ YY_BREAK ++case 64: ++YY_RULE_SETUP ++YY_FATAL_ERROR( "flex scanner jammed" ); ++ YY_BREAK ++ ++ case YY_END_OF_BUFFER: ++ { ++ /* Amount of text matched not including the EOB char. */ ++ int yy_amount_of_matched_text = (int) (yy_cp - (yytext_ptr)) - 1; ++ ++ /* Undo the effects of YY_DO_BEFORE_ACTION. */ ++ *yy_cp = (yy_hold_char); ++ YY_RESTORE_YY_MORE_OFFSET ++ ++ if ( YY_CURRENT_BUFFER_LVALUE->yy_buffer_status == YY_BUFFER_NEW ) ++ { ++ /* We're scanning a new file or input source. It's ++ * possible that this happened because the user ++ * just pointed zconfin at a new source and called ++ * zconflex(). If so, then we have to assure ++ * consistency between YY_CURRENT_BUFFER and our ++ * globals. Here is the right place to do so, because ++ * this is the first action (other than possibly a ++ * back-up) that will match for the new input source. ++ */ ++ (yy_n_chars) = YY_CURRENT_BUFFER_LVALUE->yy_n_chars; ++ YY_CURRENT_BUFFER_LVALUE->yy_input_file = zconfin; ++ YY_CURRENT_BUFFER_LVALUE->yy_buffer_status = YY_BUFFER_NORMAL; ++ } ++ ++ /* Note that here we test for yy_c_buf_p "<=" to the position ++ * of the first EOB in the buffer, since yy_c_buf_p will ++ * already have been incremented past the NUL character ++ * (since all states make transitions on EOB to the ++ * end-of-buffer state). Contrast this with the test ++ * in input(). ++ */ ++ if ( (yy_c_buf_p) <= &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)] ) ++ { /* This was really a NUL. */ ++ yy_state_type yy_next_state; ++ ++ (yy_c_buf_p) = (yytext_ptr) + yy_amount_of_matched_text; ++ ++ yy_current_state = yy_get_previous_state( ); ++ ++ /* Okay, we're now positioned to make the NUL ++ * transition. We couldn't have ++ * yy_get_previous_state() go ahead and do it ++ * for us because it doesn't know how to deal ++ * with the possibility of jamming (and we don't ++ * want to build jamming into it because then it ++ * will run more slowly). ++ */ ++ ++ yy_next_state = yy_try_NUL_trans( yy_current_state ); ++ ++ yy_bp = (yytext_ptr) + YY_MORE_ADJ; ++ ++ if ( yy_next_state ) ++ { ++ /* Consume the NUL. */ ++ yy_cp = ++(yy_c_buf_p); ++ yy_current_state = yy_next_state; ++ goto yy_match; ++ } ++ ++ else ++ { ++ yy_cp = (yy_c_buf_p); ++ goto yy_find_action; ++ } ++ } ++ ++ else switch ( yy_get_next_buffer( ) ) ++ { ++ case EOB_ACT_END_OF_FILE: ++ { ++ (yy_did_buffer_switch_on_eof) = 0; ++ ++ if ( zconfwrap( ) ) ++ { ++ /* Note: because we've taken care in ++ * yy_get_next_buffer() to have set up ++ * zconftext, we can now set up ++ * yy_c_buf_p so that if some total ++ * hoser (like flex itself) wants to ++ * call the scanner after we return the ++ * YY_NULL, it'll still work - another ++ * YY_NULL will get returned. ++ */ ++ (yy_c_buf_p) = (yytext_ptr) + YY_MORE_ADJ; ++ ++ yy_act = YY_STATE_EOF(YY_START); ++ goto do_action; ++ } ++ ++ else ++ { ++ if ( ! (yy_did_buffer_switch_on_eof) ) ++ YY_NEW_FILE; ++ } ++ break; ++ } ++ ++ case EOB_ACT_CONTINUE_SCAN: ++ (yy_c_buf_p) = ++ (yytext_ptr) + yy_amount_of_matched_text; ++ ++ yy_current_state = yy_get_previous_state( ); ++ ++ yy_cp = (yy_c_buf_p); ++ yy_bp = (yytext_ptr) + YY_MORE_ADJ; ++ goto yy_match; ++ ++ case EOB_ACT_LAST_MATCH: ++ (yy_c_buf_p) = ++ &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)]; ++ ++ yy_current_state = yy_get_previous_state( ); ++ ++ yy_cp = (yy_c_buf_p); ++ yy_bp = (yytext_ptr) + YY_MORE_ADJ; ++ goto yy_find_action; ++ } ++ break; ++ } ++ ++ default: ++ YY_FATAL_ERROR( ++ "fatal flex scanner internal error--no action found" ); ++ } /* end of action switch */ ++ } /* end of scanning one token */ ++} /* end of zconflex */ ++ ++/* yy_get_next_buffer - try to read in a new buffer ++ * ++ * Returns a code representing an action: ++ * EOB_ACT_LAST_MATCH - ++ * EOB_ACT_CONTINUE_SCAN - continue scanning from current position ++ * EOB_ACT_END_OF_FILE - end of file ++ */ ++static int yy_get_next_buffer (void) ++{ ++ register char *dest = YY_CURRENT_BUFFER_LVALUE->yy_ch_buf; ++ register char *source = (yytext_ptr); ++ register int number_to_move, i; ++ int ret_val; ++ ++ if ( (yy_c_buf_p) > &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars) + 1] ) ++ YY_FATAL_ERROR( ++ "fatal flex scanner internal error--end of buffer missed" ); ++ ++ if ( YY_CURRENT_BUFFER_LVALUE->yy_fill_buffer == 0 ) ++ { /* Don't try to fill the buffer, so this is an EOF. */ ++ if ( (yy_c_buf_p) - (yytext_ptr) - YY_MORE_ADJ == 1 ) ++ { ++ /* We matched a single character, the EOB, so ++ * treat this as a final EOF. ++ */ ++ return EOB_ACT_END_OF_FILE; ++ } ++ ++ else ++ { ++ /* We matched some text prior to the EOB, first ++ * process it. ++ */ ++ return EOB_ACT_LAST_MATCH; ++ } ++ } ++ ++ /* Try to read more data. */ ++ ++ /* First move last chars to start of buffer. */ ++ number_to_move = (int) ((yy_c_buf_p) - (yytext_ptr)) - 1; ++ ++ for ( i = 0; i < number_to_move; ++i ) ++ *(dest++) = *(source++); ++ ++ if ( YY_CURRENT_BUFFER_LVALUE->yy_buffer_status == YY_BUFFER_EOF_PENDING ) ++ /* don't do the read, it's not guaranteed to return an EOF, ++ * just force an EOF ++ */ ++ YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars) = 0; ++ ++ else ++ { ++ size_t num_to_read = ++ YY_CURRENT_BUFFER_LVALUE->yy_buf_size - number_to_move - 1; ++ ++ while ( num_to_read <= 0 ) ++ { /* Not enough room in the buffer - grow it. */ ++ ++ /* just a shorter name for the current buffer */ ++ YY_BUFFER_STATE b = YY_CURRENT_BUFFER; ++ ++ int yy_c_buf_p_offset = ++ (int) ((yy_c_buf_p) - b->yy_ch_buf); ++ ++ if ( b->yy_is_our_buffer ) ++ { ++ int new_size = b->yy_buf_size * 2; ++ ++ if ( new_size <= 0 ) ++ b->yy_buf_size += b->yy_buf_size / 8; ++ else ++ b->yy_buf_size *= 2; ++ ++ b->yy_ch_buf = (char *) ++ /* Include room in for 2 EOB chars. */ ++ zconfrealloc((void *) b->yy_ch_buf,b->yy_buf_size + 2 ); ++ } ++ else ++ /* Can't grow it, we don't own it. */ ++ b->yy_ch_buf = 0; ++ ++ if ( ! b->yy_ch_buf ) ++ YY_FATAL_ERROR( ++ "fatal error - scanner input buffer overflow" ); ++ ++ (yy_c_buf_p) = &b->yy_ch_buf[yy_c_buf_p_offset]; ++ ++ num_to_read = YY_CURRENT_BUFFER_LVALUE->yy_buf_size - ++ number_to_move - 1; ++ ++ } ++ ++ if ( num_to_read > YY_READ_BUF_SIZE ) ++ num_to_read = YY_READ_BUF_SIZE; ++ ++ /* Read in more data. */ ++ YY_INPUT( (&YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[number_to_move]), ++ (yy_n_chars), num_to_read ); ++ ++ YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars); ++ } ++ ++ if ( (yy_n_chars) == 0 ) ++ { ++ if ( number_to_move == YY_MORE_ADJ ) ++ { ++ ret_val = EOB_ACT_END_OF_FILE; ++ zconfrestart(zconfin ); ++ } ++ ++ else ++ { ++ ret_val = EOB_ACT_LAST_MATCH; ++ YY_CURRENT_BUFFER_LVALUE->yy_buffer_status = ++ YY_BUFFER_EOF_PENDING; ++ } ++ } ++ ++ else ++ ret_val = EOB_ACT_CONTINUE_SCAN; ++ ++ (yy_n_chars) += number_to_move; ++ YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)] = YY_END_OF_BUFFER_CHAR; ++ YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars) + 1] = YY_END_OF_BUFFER_CHAR; ++ ++ (yytext_ptr) = &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[0]; ++ ++ return ret_val; ++} ++ ++/* yy_get_previous_state - get the state just before the EOB char was reached */ ++ ++ static yy_state_type yy_get_previous_state (void) ++{ ++ register yy_state_type yy_current_state; ++ register char *yy_cp; ++ ++ yy_current_state = (yy_start); ++ ++ for ( yy_cp = (yytext_ptr) + YY_MORE_ADJ; yy_cp < (yy_c_buf_p); ++yy_cp ) ++ { ++ yy_current_state = yy_nxt[yy_current_state][(*yy_cp ? yy_ec[YY_SC_TO_UI(*yy_cp)] : 1)]; ++ } ++ ++ return yy_current_state; ++} ++ ++/* yy_try_NUL_trans - try to make a transition on the NUL character ++ * ++ * synopsis ++ * next_state = yy_try_NUL_trans( current_state ); ++ */ ++ static yy_state_type yy_try_NUL_trans (yy_state_type yy_current_state ) ++{ ++ register int yy_is_jam; ++ ++ yy_current_state = yy_nxt[yy_current_state][1]; ++ yy_is_jam = (yy_current_state <= 0); ++ ++ return yy_is_jam ? 0 : yy_current_state; ++} ++ ++ static void yyunput (int c, register char * yy_bp ) ++{ ++ register char *yy_cp; ++ ++ yy_cp = (yy_c_buf_p); ++ ++ /* undo effects of setting up zconftext */ ++ *yy_cp = (yy_hold_char); ++ ++ if ( yy_cp < YY_CURRENT_BUFFER_LVALUE->yy_ch_buf + 2 ) ++ { /* need to shift things up to make room */ ++ /* +2 for EOB chars. */ ++ register int number_to_move = (yy_n_chars) + 2; ++ register char *dest = &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[ ++ YY_CURRENT_BUFFER_LVALUE->yy_buf_size + 2]; ++ register char *source = ++ &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[number_to_move]; ++ ++ while ( source > YY_CURRENT_BUFFER_LVALUE->yy_ch_buf ) ++ *--dest = *--source; ++ ++ yy_cp += (int) (dest - source); ++ yy_bp += (int) (dest - source); ++ YY_CURRENT_BUFFER_LVALUE->yy_n_chars = ++ (yy_n_chars) = YY_CURRENT_BUFFER_LVALUE->yy_buf_size; ++ ++ if ( yy_cp < YY_CURRENT_BUFFER_LVALUE->yy_ch_buf + 2 ) ++ YY_FATAL_ERROR( "flex scanner push-back overflow" ); ++ } ++ ++ *--yy_cp = (char) c; ++ ++ (yytext_ptr) = yy_bp; ++ (yy_hold_char) = *yy_cp; ++ (yy_c_buf_p) = yy_cp; ++} ++ ++#ifndef YY_NO_INPUT ++#ifdef __cplusplus ++ static int yyinput (void) ++#else ++ static int input (void) ++#endif ++ ++{ ++ int c; ++ ++ *(yy_c_buf_p) = (yy_hold_char); ++ ++ if ( *(yy_c_buf_p) == YY_END_OF_BUFFER_CHAR ) ++ { ++ /* yy_c_buf_p now points to the character we want to return. ++ * If this occurs *before* the EOB characters, then it's a ++ * valid NUL; if not, then we've hit the end of the buffer. ++ */ ++ if ( (yy_c_buf_p) < &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)] ) ++ /* This was really a NUL. */ ++ *(yy_c_buf_p) = '\0'; ++ ++ else ++ { /* need more input */ ++ int offset = (yy_c_buf_p) - (yytext_ptr); ++ ++(yy_c_buf_p); ++ ++ switch ( yy_get_next_buffer( ) ) ++ { ++ case EOB_ACT_LAST_MATCH: ++ /* This happens because yy_g_n_b() ++ * sees that we've accumulated a ++ * token and flags that we need to ++ * try matching the token before ++ * proceeding. But for input(), ++ * there's no matching to consider. ++ * So convert the EOB_ACT_LAST_MATCH ++ * to EOB_ACT_END_OF_FILE. ++ */ ++ ++ /* Reset buffer status. */ ++ zconfrestart(zconfin ); ++ ++ /*FALLTHROUGH*/ ++ ++ case EOB_ACT_END_OF_FILE: ++ { ++ if ( zconfwrap( ) ) ++ return EOF; ++ ++ if ( ! (yy_did_buffer_switch_on_eof) ) ++ YY_NEW_FILE; ++#ifdef __cplusplus ++ return yyinput(); ++#else ++ return input(); ++#endif ++ } ++ ++ case EOB_ACT_CONTINUE_SCAN: ++ (yy_c_buf_p) = (yytext_ptr) + offset; ++ break; ++ } ++ } ++ } ++ ++ c = *(unsigned char *) (yy_c_buf_p); /* cast for 8-bit char's */ ++ *(yy_c_buf_p) = '\0'; /* preserve zconftext */ ++ (yy_hold_char) = *++(yy_c_buf_p); ++ ++ return c; ++} ++#endif /* ifndef YY_NO_INPUT */ ++ ++/** Immediately switch to a different input stream. ++ * @param input_file A readable stream. ++ * ++ * @note This function does not reset the start condition to @c INITIAL . ++ */ ++ void zconfrestart (FILE * input_file ) ++{ ++ ++ if ( ! YY_CURRENT_BUFFER ){ ++ zconfensure_buffer_stack (); ++ YY_CURRENT_BUFFER_LVALUE = ++ zconf_create_buffer(zconfin,YY_BUF_SIZE ); ++ } ++ ++ zconf_init_buffer(YY_CURRENT_BUFFER,input_file ); ++ zconf_load_buffer_state( ); ++} ++ ++/** Switch to a different input buffer. ++ * @param new_buffer The new input buffer. ++ * ++ */ ++ void zconf_switch_to_buffer (YY_BUFFER_STATE new_buffer ) ++{ ++ ++ /* TODO. We should be able to replace this entire function body ++ * with ++ * zconfpop_buffer_state(); ++ * zconfpush_buffer_state(new_buffer); ++ */ ++ zconfensure_buffer_stack (); ++ if ( YY_CURRENT_BUFFER == new_buffer ) ++ return; ++ ++ if ( YY_CURRENT_BUFFER ) ++ { ++ /* Flush out information for old buffer. */ ++ *(yy_c_buf_p) = (yy_hold_char); ++ YY_CURRENT_BUFFER_LVALUE->yy_buf_pos = (yy_c_buf_p); ++ YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars); ++ } ++ ++ YY_CURRENT_BUFFER_LVALUE = new_buffer; ++ zconf_load_buffer_state( ); ++ ++ /* We don't actually know whether we did this switch during ++ * EOF (zconfwrap()) processing, but the only time this flag ++ * is looked at is after zconfwrap() is called, so it's safe ++ * to go ahead and always set it. ++ */ ++ (yy_did_buffer_switch_on_eof) = 1; ++} ++ ++static void zconf_load_buffer_state (void) ++{ ++ (yy_n_chars) = YY_CURRENT_BUFFER_LVALUE->yy_n_chars; ++ (yytext_ptr) = (yy_c_buf_p) = YY_CURRENT_BUFFER_LVALUE->yy_buf_pos; ++ zconfin = YY_CURRENT_BUFFER_LVALUE->yy_input_file; ++ (yy_hold_char) = *(yy_c_buf_p); ++} ++ ++/** Allocate and initialize an input buffer state. ++ * @param file A readable stream. ++ * @param size The character buffer size in bytes. When in doubt, use @c YY_BUF_SIZE. ++ * ++ * @return the allocated buffer state. ++ */ ++ YY_BUFFER_STATE zconf_create_buffer (FILE * file, int size ) ++{ ++ YY_BUFFER_STATE b; ++ ++ b = (YY_BUFFER_STATE) zconfalloc(sizeof( struct yy_buffer_state ) ); ++ if ( ! b ) ++ YY_FATAL_ERROR( "out of dynamic memory in zconf_create_buffer()" ); ++ ++ b->yy_buf_size = size; ++ ++ /* yy_ch_buf has to be 2 characters longer than the size given because ++ * we need to put in 2 end-of-buffer characters. ++ */ ++ b->yy_ch_buf = (char *) zconfalloc(b->yy_buf_size + 2 ); ++ if ( ! b->yy_ch_buf ) ++ YY_FATAL_ERROR( "out of dynamic memory in zconf_create_buffer()" ); ++ ++ b->yy_is_our_buffer = 1; ++ ++ zconf_init_buffer(b,file ); ++ ++ return b; ++} ++ ++/** Destroy the buffer. ++ * @param b a buffer created with zconf_create_buffer() ++ * ++ */ ++ void zconf_delete_buffer (YY_BUFFER_STATE b ) ++{ ++ ++ if ( ! b ) ++ return; ++ ++ if ( b == YY_CURRENT_BUFFER ) /* Not sure if we should pop here. */ ++ YY_CURRENT_BUFFER_LVALUE = (YY_BUFFER_STATE) 0; ++ ++ if ( b->yy_is_our_buffer ) ++ zconffree((void *) b->yy_ch_buf ); ++ ++ zconffree((void *) b ); ++} ++ ++/* Initializes or reinitializes a buffer. ++ * This function is sometimes called more than once on the same buffer, ++ * such as during a zconfrestart() or at EOF. ++ */ ++ static void zconf_init_buffer (YY_BUFFER_STATE b, FILE * file ) ++ ++{ ++ int oerrno = errno; ++ ++ zconf_flush_buffer(b ); ++ ++ b->yy_input_file = file; ++ b->yy_fill_buffer = 1; ++ ++ /* If b is the current buffer, then zconf_init_buffer was _probably_ ++ * called from zconfrestart() or through yy_get_next_buffer. ++ * In that case, we don't want to reset the lineno or column. ++ */ ++ if (b != YY_CURRENT_BUFFER){ ++ b->yy_bs_lineno = 1; ++ b->yy_bs_column = 0; ++ } ++ ++ b->yy_is_interactive = 0; ++ ++ errno = oerrno; ++} ++ ++/** Discard all buffered characters. On the next scan, YY_INPUT will be called. ++ * @param b the buffer state to be flushed, usually @c YY_CURRENT_BUFFER. ++ * ++ */ ++ void zconf_flush_buffer (YY_BUFFER_STATE b ) ++{ ++ if ( ! b ) ++ return; ++ ++ b->yy_n_chars = 0; ++ ++ /* We always need two end-of-buffer characters. The first causes ++ * a transition to the end-of-buffer state. The second causes ++ * a jam in that state. ++ */ ++ b->yy_ch_buf[0] = YY_END_OF_BUFFER_CHAR; ++ b->yy_ch_buf[1] = YY_END_OF_BUFFER_CHAR; ++ ++ b->yy_buf_pos = &b->yy_ch_buf[0]; ++ ++ b->yy_at_bol = 1; ++ b->yy_buffer_status = YY_BUFFER_NEW; ++ ++ if ( b == YY_CURRENT_BUFFER ) ++ zconf_load_buffer_state( ); ++} ++ ++/** Pushes the new state onto the stack. The new state becomes ++ * the current state. This function will allocate the stack ++ * if necessary. ++ * @param new_buffer The new state. ++ * ++ */ ++void zconfpush_buffer_state (YY_BUFFER_STATE new_buffer ) ++{ ++ if (new_buffer == NULL) ++ return; ++ ++ zconfensure_buffer_stack(); ++ ++ /* This block is copied from zconf_switch_to_buffer. */ ++ if ( YY_CURRENT_BUFFER ) ++ { ++ /* Flush out information for old buffer. */ ++ *(yy_c_buf_p) = (yy_hold_char); ++ YY_CURRENT_BUFFER_LVALUE->yy_buf_pos = (yy_c_buf_p); ++ YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars); ++ } ++ ++ /* Only push if top exists. Otherwise, replace top. */ ++ if (YY_CURRENT_BUFFER) ++ (yy_buffer_stack_top)++; ++ YY_CURRENT_BUFFER_LVALUE = new_buffer; ++ ++ /* copied from zconf_switch_to_buffer. */ ++ zconf_load_buffer_state( ); ++ (yy_did_buffer_switch_on_eof) = 1; ++} ++ ++/** Removes and deletes the top of the stack, if present. ++ * The next element becomes the new top. ++ * ++ */ ++void zconfpop_buffer_state (void) ++{ ++ if (!YY_CURRENT_BUFFER) ++ return; ++ ++ zconf_delete_buffer(YY_CURRENT_BUFFER ); ++ YY_CURRENT_BUFFER_LVALUE = NULL; ++ if ((yy_buffer_stack_top) > 0) ++ --(yy_buffer_stack_top); ++ ++ if (YY_CURRENT_BUFFER) { ++ zconf_load_buffer_state( ); ++ (yy_did_buffer_switch_on_eof) = 1; ++ } ++} ++ ++/* Allocates the stack if it does not exist. ++ * Guarantees space for at least one push. ++ */ ++static void zconfensure_buffer_stack (void) ++{ ++ int num_to_alloc; ++ ++ if (!(yy_buffer_stack)) { ++ ++ /* First allocation is just for 2 elements, since we don't know if this ++ * scanner will even need a stack. We use 2 instead of 1 to avoid an ++ * immediate realloc on the next call. ++ */ ++ num_to_alloc = 1; ++ (yy_buffer_stack) = (struct yy_buffer_state**)zconfalloc ++ (num_to_alloc * sizeof(struct yy_buffer_state*) ++ ); ++ ++ memset((yy_buffer_stack), 0, num_to_alloc * sizeof(struct yy_buffer_state*)); ++ ++ (yy_buffer_stack_max) = num_to_alloc; ++ (yy_buffer_stack_top) = 0; ++ return; ++ } ++ ++ if ((yy_buffer_stack_top) >= ((yy_buffer_stack_max)) - 1){ ++ ++ /* Increase the buffer to prepare for a possible push. */ ++ int grow_size = 8 /* arbitrary grow size */; ++ ++ num_to_alloc = (yy_buffer_stack_max) + grow_size; ++ (yy_buffer_stack) = (struct yy_buffer_state**)zconfrealloc ++ ((yy_buffer_stack), ++ num_to_alloc * sizeof(struct yy_buffer_state*) ++ ); ++ ++ /* zero only the new slots.*/ ++ memset((yy_buffer_stack) + (yy_buffer_stack_max), 0, grow_size * sizeof(struct yy_buffer_state*)); ++ (yy_buffer_stack_max) = num_to_alloc; ++ } ++} ++ ++/** Setup the input buffer state to scan directly from a user-specified character buffer. ++ * @param base the character buffer ++ * @param size the size in bytes of the character buffer ++ * ++ * @return the newly allocated buffer state object. ++ */ ++YY_BUFFER_STATE zconf_scan_buffer (char * base, yy_size_t size ) ++{ ++ YY_BUFFER_STATE b; ++ ++ if ( size < 2 || ++ base[size-2] != YY_END_OF_BUFFER_CHAR || ++ base[size-1] != YY_END_OF_BUFFER_CHAR ) ++ /* They forgot to leave room for the EOB's. */ ++ return 0; ++ ++ b = (YY_BUFFER_STATE) zconfalloc(sizeof( struct yy_buffer_state ) ); ++ if ( ! b ) ++ YY_FATAL_ERROR( "out of dynamic memory in zconf_scan_buffer()" ); ++ ++ b->yy_buf_size = size - 2; /* "- 2" to take care of EOB's */ ++ b->yy_buf_pos = b->yy_ch_buf = base; ++ b->yy_is_our_buffer = 0; ++ b->yy_input_file = 0; ++ b->yy_n_chars = b->yy_buf_size; ++ b->yy_is_interactive = 0; ++ b->yy_at_bol = 1; ++ b->yy_fill_buffer = 0; ++ b->yy_buffer_status = YY_BUFFER_NEW; ++ ++ zconf_switch_to_buffer(b ); ++ ++ return b; ++} ++ ++/** Setup the input buffer state to scan a string. The next call to zconflex() will ++ * scan from a @e copy of @a str. ++ * @param str a NUL-terminated string to scan ++ * ++ * @return the newly allocated buffer state object. ++ * @note If you want to scan bytes that may contain NUL values, then use ++ * zconf_scan_bytes() instead. ++ */ ++YY_BUFFER_STATE zconf_scan_string (yyconst char * str ) ++{ ++ ++ return zconf_scan_bytes(str,strlen(str) ); ++} ++ ++/** Setup the input buffer state to scan the given bytes. The next call to zconflex() will ++ * scan from a @e copy of @a bytes. ++ * @param bytes the byte buffer to scan ++ * @param len the number of bytes in the buffer pointed to by @a bytes. ++ * ++ * @return the newly allocated buffer state object. ++ */ ++YY_BUFFER_STATE zconf_scan_bytes (yyconst char * bytes, int len ) ++{ ++ YY_BUFFER_STATE b; ++ char *buf; ++ yy_size_t n; ++ int i; ++ ++ /* Get memory for full buffer, including space for trailing EOB's. */ ++ n = len + 2; ++ buf = (char *) zconfalloc(n ); ++ if ( ! buf ) ++ YY_FATAL_ERROR( "out of dynamic memory in zconf_scan_bytes()" ); ++ ++ for ( i = 0; i < len; ++i ) ++ buf[i] = bytes[i]; ++ ++ buf[len] = buf[len+1] = YY_END_OF_BUFFER_CHAR; ++ ++ b = zconf_scan_buffer(buf,n ); ++ if ( ! b ) ++ YY_FATAL_ERROR( "bad buffer in zconf_scan_bytes()" ); ++ ++ /* It's okay to grow etc. this buffer, and we should throw it ++ * away when we're done. ++ */ ++ b->yy_is_our_buffer = 1; ++ ++ return b; ++} ++ ++#ifndef YY_EXIT_FAILURE ++#define YY_EXIT_FAILURE 2 ++#endif ++ ++static void yy_fatal_error (yyconst char* msg ) ++{ ++ (void) fprintf( stderr, "%s\n", msg ); ++ exit( YY_EXIT_FAILURE ); ++} ++ ++/* Redefine yyless() so it works in section 3 code. */ ++ ++#undef yyless ++#define yyless(n) \ ++ do \ ++ { \ ++ /* Undo effects of setting up zconftext. */ \ ++ int yyless_macro_arg = (n); \ ++ YY_LESS_LINENO(yyless_macro_arg);\ ++ zconftext[zconfleng] = (yy_hold_char); \ ++ (yy_c_buf_p) = zconftext + yyless_macro_arg; \ ++ (yy_hold_char) = *(yy_c_buf_p); \ ++ *(yy_c_buf_p) = '\0'; \ ++ zconfleng = yyless_macro_arg; \ ++ } \ ++ while ( 0 ) ++ ++/* Accessor methods (get/set functions) to struct members. */ ++ ++/** Get the current line number. ++ * ++ */ ++int zconfget_lineno (void) ++{ ++ ++ return zconflineno; ++} ++ ++/** Get the input stream. ++ * ++ */ ++FILE *zconfget_in (void) ++{ ++ return zconfin; ++} ++ ++/** Get the output stream. ++ * ++ */ ++FILE *zconfget_out (void) ++{ ++ return zconfout; ++} ++ ++/** Get the length of the current token. ++ * ++ */ ++int zconfget_leng (void) ++{ ++ return zconfleng; ++} ++ ++/** Get the current token. ++ * ++ */ ++ ++char *zconfget_text (void) ++{ ++ return zconftext; ++} ++ ++/** Set the current line number. ++ * @param line_number ++ * ++ */ ++void zconfset_lineno (int line_number ) ++{ ++ ++ zconflineno = line_number; ++} ++ ++/** Set the input stream. This does not discard the current ++ * input buffer. ++ * @param in_str A readable stream. ++ * ++ * @see zconf_switch_to_buffer ++ */ ++void zconfset_in (FILE * in_str ) ++{ ++ zconfin = in_str ; ++} ++ ++void zconfset_out (FILE * out_str ) ++{ ++ zconfout = out_str ; ++} ++ ++int zconfget_debug (void) ++{ ++ return zconf_flex_debug; ++} ++ ++void zconfset_debug (int bdebug ) ++{ ++ zconf_flex_debug = bdebug ; ++} ++ ++/* zconflex_destroy is for both reentrant and non-reentrant scanners. */ ++int zconflex_destroy (void) ++{ ++ ++ /* Pop the buffer stack, destroying each element. */ ++ while(YY_CURRENT_BUFFER){ ++ zconf_delete_buffer(YY_CURRENT_BUFFER ); ++ YY_CURRENT_BUFFER_LVALUE = NULL; ++ zconfpop_buffer_state(); ++ } ++ ++ /* Destroy the stack itself. */ ++ zconffree((yy_buffer_stack) ); ++ (yy_buffer_stack) = NULL; ++ ++ return 0; ++} ++ ++/* ++ * Internal utility routines. ++ */ ++ ++#ifndef yytext_ptr ++static void yy_flex_strncpy (char* s1, yyconst char * s2, int n ) ++{ ++ register int i; ++ for ( i = 0; i < n; ++i ) ++ s1[i] = s2[i]; ++} ++#endif ++ ++#ifdef YY_NEED_STRLEN ++static int yy_flex_strlen (yyconst char * s ) ++{ ++ register int n; ++ for ( n = 0; s[n]; ++n ) ++ ; ++ ++ return n; ++} ++#endif ++ ++void *zconfalloc (yy_size_t size ) ++{ ++ return (void *) malloc( size ); ++} ++ ++void *zconfrealloc (void * ptr, yy_size_t size ) ++{ ++ /* The cast to (char *) in the following accommodates both ++ * implementations that use char* generic pointers, and those ++ * that use void* generic pointers. It works with the latter ++ * because both ANSI C and C++ allow castless assignment from ++ * any pointer type to void*, and deal with argument conversions ++ * as though doing an assignment. ++ */ ++ return (void *) realloc( (char *) ptr, size ); ++} ++ ++void zconffree (void * ptr ) ++{ ++ free( (char *) ptr ); /* see zconfrealloc() for (char *) cast */ ++} ++ ++#define YYTABLES_NAME "yytables" ++ ++#undef YY_NEW_FILE ++#undef YY_FLUSH_BUFFER ++#undef yy_set_bol ++#undef yy_new_buffer ++#undef yy_set_interactive ++#undef yytext_ptr ++#undef YY_DO_BEFORE_ACTION ++ ++#ifdef YY_DECL_IS_OURS ++#undef YY_DECL_IS_OURS ++#undef YY_DECL ++#endif ++ ++void zconf_starthelp(void) ++{ ++ new_string(); ++ last_ts = first_ts = 0; ++ BEGIN(HELP); ++} ++ ++static void zconf_endhelp(void) ++{ ++ zconflval.string = text; ++ BEGIN(INITIAL); ++} ++ ++/* ++ * Try to open specified file with following names: ++ * ./name ++ * $(srctree)/name ++ * The latter is used when srctree is separate from objtree ++ * when compiling the kernel. ++ * Return NULL if file is not found. ++ */ ++FILE *zconf_fopen(const char *name) ++{ ++ char *env, fullname[PATH_MAX+1]; ++ FILE *f; ++ ++ f = fopen(name, "r"); ++ if (!f && name[0] != '/') { ++ env = getenv(SRCTREE); ++ if (env) { ++ sprintf(fullname, "%s/%s", env, name); ++ f = fopen(fullname, "r"); ++ } ++ } ++ return f; ++} ++ ++void zconf_initscan(const char *name) ++{ ++ zconfin = zconf_fopen(name); ++ if (!zconfin) { ++ printf("can't find file %s\n", name); ++ exit(1); ++ } ++ ++ current_buf = malloc(sizeof(*current_buf)); ++ memset(current_buf, 0, sizeof(*current_buf)); ++ ++ current_file = file_lookup(name); ++ current_file->lineno = 1; ++ current_file->flags = FILE_BUSY; ++} ++ ++void zconf_nextfile(const char *name) ++{ ++ struct file *file = file_lookup(name); ++ struct buffer *buf = malloc(sizeof(*buf)); ++ memset(buf, 0, sizeof(*buf)); ++ ++ current_buf->state = YY_CURRENT_BUFFER; ++ zconfin = zconf_fopen(name); ++ if (!zconfin) { ++ printf("%s:%d: can't open file \"%s\"\n", zconf_curname(), zconf_lineno(), name); ++ exit(1); ++ } ++ zconf_switch_to_buffer(zconf_create_buffer(zconfin,YY_BUF_SIZE)); ++ buf->parent = current_buf; ++ current_buf = buf; ++ ++ if (file->flags & FILE_BUSY) { ++ printf("recursive scan (%s)?\n", name); ++ exit(1); ++ } ++ if (file->flags & FILE_SCANNED) { ++ printf("file %s already scanned?\n", name); ++ exit(1); ++ } ++ file->flags |= FILE_BUSY; ++ file->lineno = 1; ++ file->parent = current_file; ++ current_file = file; ++} ++ ++static struct buffer *zconf_endfile(void) ++{ ++ struct buffer *parent; ++ ++ current_file->flags |= FILE_SCANNED; ++ current_file->flags &= ~FILE_BUSY; ++ current_file = current_file->parent; ++ ++ parent = current_buf->parent; ++ if (parent) { ++ fclose(zconfin); ++ zconf_delete_buffer(YY_CURRENT_BUFFER); ++ zconf_switch_to_buffer(parent->state); ++ } ++ free(current_buf); ++ current_buf = parent; ++ ++ return parent; ++} ++ ++int zconf_lineno(void) ++{ ++ if (current_buf) ++ return current_file->lineno - 1; ++ else ++ return 0; ++} ++ ++char *zconf_curname(void) ++{ ++ if (current_buf) ++ return current_file->name; ++ else ++ return ""; ++} ++ +diff --git a/feeds/luci/libs/luci-lib-nixio/axTLS/config/scripts/config/lkc.h b/feeds/luci/libs/luci-lib-nixio/axTLS/config/scripts/config/lkc.h +new file mode 100644 +index 0000000..b8a67fc +--- /dev/null ++++ b/feeds/luci/libs/luci-lib-nixio/axTLS/config/scripts/config/lkc.h +@@ -0,0 +1,123 @@ ++/* ++ * Copyright (C) 2002 Roman Zippel ++ * Released under the terms of the GNU GPL v2.0. ++ */ ++ ++#ifndef LKC_H ++#define LKC_H ++ ++#include "expr.h" ++ ++#ifdef __cplusplus ++extern "C" { ++#endif ++ ++#ifdef LKC_DIRECT_LINK ++#define P(name,type,arg) extern type name arg ++#else ++#include "lkc_defs.h" ++#define P(name,type,arg) extern type (*name ## _p) arg ++#endif ++#include "lkc_proto.h" ++#undef P ++ ++#define SRCTREE "srctree" ++ ++int zconfparse(void); ++void zconfdump(FILE *out); ++ ++extern int zconfdebug; ++void zconf_starthelp(void); ++FILE *zconf_fopen(const char *name); ++void zconf_initscan(const char *name); ++void zconf_nextfile(const char *name); ++int zconf_lineno(void); ++char *zconf_curname(void); ++ ++/* confdata.c */ ++extern const char conf_def_filename[]; ++extern char conf_filename[]; ++ ++char *conf_get_default_confname(void); ++ ++/* kconfig_load.c */ ++void kconfig_load(void); ++ ++/* menu.c */ ++void menu_init(void); ++void menu_add_menu(void); ++void menu_end_menu(void); ++void menu_add_entry(struct symbol *sym); ++void menu_end_entry(void); ++void menu_add_dep(struct expr *dep); ++struct property *menu_add_prop(enum prop_type type, char *prompt, struct expr *expr, struct expr *dep); ++void menu_add_prompt(enum prop_type type, char *prompt, struct expr *dep); ++void menu_add_expr(enum prop_type type, struct expr *expr, struct expr *dep); ++void menu_add_symbol(enum prop_type type, struct symbol *sym, struct expr *dep); ++void menu_finalize(struct menu *parent); ++void menu_set_type(int type); ++ ++/* util.c */ ++struct file *file_lookup(const char *name); ++int file_write_dep(const char *name); ++ ++struct gstr { ++ size_t len; ++ char *s; ++}; ++struct gstr str_new(void); ++struct gstr str_assign(const char *s); ++void str_free(struct gstr *gs); ++void str_append(struct gstr *gs, const char *s); ++void str_printf(struct gstr *gs, const char *fmt, ...); ++const char *str_get(struct gstr *gs); ++ ++/* symbol.c */ ++void sym_init(void); ++void sym_clear_all_valid(void); ++void sym_set_changed(struct symbol *sym); ++struct symbol *sym_check_deps(struct symbol *sym); ++struct property *prop_alloc(enum prop_type type, struct symbol *sym); ++struct symbol *prop_get_symbol(struct property *prop); ++ ++static inline tristate sym_get_tristate_value(struct symbol *sym) ++{ ++ return sym->curr.tri; ++} ++ ++ ++static inline struct symbol *sym_get_choice_value(struct symbol *sym) ++{ ++ return (struct symbol *)sym->curr.val; ++} ++ ++static inline bool sym_set_choice_value(struct symbol *ch, struct symbol *chval) ++{ ++ return sym_set_tristate_value(chval, yes); ++} ++ ++static inline bool sym_is_choice(struct symbol *sym) ++{ ++ return sym->flags & SYMBOL_CHOICE ? true : false; ++} ++ ++static inline bool sym_is_choice_value(struct symbol *sym) ++{ ++ return sym->flags & SYMBOL_CHOICEVAL ? true : false; ++} ++ ++static inline bool sym_is_optional(struct symbol *sym) ++{ ++ return sym->flags & SYMBOL_OPTIONAL ? true : false; ++} ++ ++static inline bool sym_has_value(struct symbol *sym) ++{ ++ return sym->flags & SYMBOL_NEW ? false : true; ++} ++ ++#ifdef __cplusplus ++} ++#endif ++ ++#endif /* LKC_H */ +diff --git a/feeds/luci/libs/luci-lib-nixio/axTLS/config/scripts/config/lkc_proto.h b/feeds/luci/libs/luci-lib-nixio/axTLS/config/scripts/config/lkc_proto.h +new file mode 100644 +index 0000000..6dc6d0c +--- /dev/null ++++ b/feeds/luci/libs/luci-lib-nixio/axTLS/config/scripts/config/lkc_proto.h +@@ -0,0 +1,40 @@ ++ ++/* confdata.c */ ++P(conf_parse,void,(const char *name)); ++P(conf_read,int,(const char *name)); ++P(conf_write,int,(const char *name)); ++ ++/* menu.c */ ++P(rootmenu,struct menu,); ++ ++P(menu_is_visible,bool,(struct menu *menu)); ++P(menu_get_prompt,const char *,(struct menu *menu)); ++P(menu_get_root_menu,struct menu *,(struct menu *menu)); ++P(menu_get_parent_menu,struct menu *,(struct menu *menu)); ++ ++/* symbol.c */ ++P(symbol_hash,struct symbol *,[SYMBOL_HASHSIZE]); ++P(sym_change_count,int,); ++ ++P(sym_lookup,struct symbol *,(const char *name, int isconst)); ++P(sym_find,struct symbol *,(const char *name)); ++P(sym_re_search,struct symbol **,(const char *pattern)); ++P(sym_type_name,const char *,(enum symbol_type type)); ++P(sym_calc_value,void,(struct symbol *sym)); ++P(sym_get_type,enum symbol_type,(struct symbol *sym)); ++P(sym_tristate_within_range,bool,(struct symbol *sym,tristate tri)); ++P(sym_set_tristate_value,bool,(struct symbol *sym,tristate tri)); ++P(sym_toggle_tristate_value,tristate,(struct symbol *sym)); ++P(sym_string_valid,bool,(struct symbol *sym, const char *newval)); ++P(sym_string_within_range,bool,(struct symbol *sym, const char *str)); ++P(sym_set_string_value,bool,(struct symbol *sym, const char *newval)); ++P(sym_is_changable,bool,(struct symbol *sym)); ++P(sym_get_choice_prop,struct property *,(struct symbol *sym)); ++P(sym_get_default_prop,struct property *,(struct symbol *sym)); ++P(sym_get_string_value,const char *,(struct symbol *sym)); ++ ++P(prop_get_type_name,const char *,(enum prop_type type)); ++ ++/* expr.c */ ++P(expr_compare_type,int,(enum expr_type t1, enum expr_type t2)); ++P(expr_print,void,(struct expr *e, void (*fn)(void *, const char *), void *data, int prevtoken)); +diff --git a/feeds/luci/libs/luci-lib-nixio/axTLS/config/scripts/config/lxdialog/BIG.FAT.WARNING b/feeds/luci/libs/luci-lib-nixio/axTLS/config/scripts/config/lxdialog/BIG.FAT.WARNING +new file mode 100644 +index 0000000..a8999d8 +--- /dev/null ++++ b/feeds/luci/libs/luci-lib-nixio/axTLS/config/scripts/config/lxdialog/BIG.FAT.WARNING +@@ -0,0 +1,4 @@ ++This is NOT the official version of dialog. This version has been ++significantly modified from the original. It is for use by the Linux ++kernel configuration script. Please do not bother Savio Lam with ++questions about this program. +diff --git a/feeds/luci/libs/luci-lib-nixio/axTLS/config/scripts/config/lxdialog/checklist.c b/feeds/luci/libs/luci-lib-nixio/axTLS/config/scripts/config/lxdialog/checklist.c +new file mode 100644 +index 0000000..71de4a1 +--- /dev/null ++++ b/feeds/luci/libs/luci-lib-nixio/axTLS/config/scripts/config/lxdialog/checklist.c +@@ -0,0 +1,372 @@ ++/* ++ * checklist.c -- implements the checklist box ++ * ++ * ORIGINAL AUTHOR: Savio Lam (lam836@cs.cuhk.hk) ++ * Stuart Herbert - S.Herbert@sheffield.ac.uk: radiolist extension ++ * Alessandro Rubini - rubini@ipvvis.unipv.it: merged the two ++ * MODIFIED FOR LINUX KERNEL CONFIG BY: William Roadcap (roadcap@cfw.com) ++ * ++ * 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. ++ * ++ * This program is distributed in the hope that it will be useful, ++ * but WITHOUT ANY WARRANTY; without even the implied warranty of ++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++ * GNU General Public License for more details. ++ * ++ * You should have received a copy of the GNU General Public License ++ * along with this program; if not, write to the Free Software ++ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. ++ */ ++ ++#include "dialog.h" ++ ++static int list_width, check_x, item_x, checkflag; ++ ++/* ++ * Print list item ++ */ ++static void ++print_item (WINDOW * win, const char *item, int status, ++ int choice, int selected) ++{ ++ int i; ++ ++ /* Clear 'residue' of last item */ ++ wattrset (win, menubox_attr); ++ wmove (win, choice, 0); ++ for (i = 0; i < list_width; i++) ++ waddch (win, ' '); ++ ++ wmove (win, choice, check_x); ++ wattrset (win, selected ? check_selected_attr : check_attr); ++ if (checkflag == FLAG_CHECK) ++ wprintw (win, "[%c]", status ? 'X' : ' '); ++ else ++ wprintw (win, "(%c)", status ? 'X' : ' '); ++ ++ wattrset (win, selected ? tag_selected_attr : tag_attr); ++ mvwaddch(win, choice, item_x, item[0]); ++ wattrset (win, selected ? item_selected_attr : item_attr); ++ waddstr (win, (char *)item+1); ++ if (selected) { ++ wmove (win, choice, check_x+1); ++ wrefresh (win); ++ } ++} ++ ++/* ++ * Print the scroll indicators. ++ */ ++static void ++print_arrows (WINDOW * win, int choice, int item_no, int scroll, ++ int y, int x, int height) ++{ ++ wmove(win, y, x); ++ ++ if (scroll > 0) { ++ wattrset (win, uarrow_attr); ++ waddch (win, ACS_UARROW); ++ waddstr (win, "(-)"); ++ } ++ else { ++ wattrset (win, menubox_attr); ++ waddch (win, ACS_HLINE); ++ waddch (win, ACS_HLINE); ++ waddch (win, ACS_HLINE); ++ waddch (win, ACS_HLINE); ++ } ++ ++ y = y + height + 1; ++ wmove(win, y, x); ++ ++ if ((height < item_no) && (scroll + choice < item_no - 1)) { ++ wattrset (win, darrow_attr); ++ waddch (win, ACS_DARROW); ++ waddstr (win, "(+)"); ++ } ++ else { ++ wattrset (win, menubox_border_attr); ++ waddch (win, ACS_HLINE); ++ waddch (win, ACS_HLINE); ++ waddch (win, ACS_HLINE); ++ waddch (win, ACS_HLINE); ++ } ++} ++ ++/* ++ * Display the termination buttons ++ */ ++static void ++print_buttons( WINDOW *dialog, int height, int width, int selected) ++{ ++ int x = width / 2 - 11; ++ int y = height - 2; ++ ++ print_button (dialog, "Select", y, x, selected == 0); ++ print_button (dialog, " Help ", y, x + 14, selected == 1); ++ ++ wmove(dialog, y, x+1 + 14*selected); ++ wrefresh (dialog); ++} ++ ++/* ++ * Display a dialog box with a list of options that can be turned on or off ++ * The `flag' parameter is used to select between radiolist and checklist. ++ */ ++int ++dialog_checklist (const char *title, const char *prompt, int height, int width, ++ int list_height, int item_no, struct dialog_list_item ** items, ++ int flag) ++ ++{ ++ int i, x, y, box_x, box_y; ++ int key = 0, button = 0, choice = 0, scroll = 0, max_choice, *status; ++ WINDOW *dialog, *list; ++ ++ checkflag = flag; ++ ++ /* Allocate space for storing item on/off status */ ++ if ((status = malloc (sizeof (int) * item_no)) == NULL) { ++ endwin (); ++ fprintf (stderr, ++ "\nCan't allocate memory in dialog_checklist().\n"); ++ exit (-1); ++ } ++ ++ /* Initializes status */ ++ for (i = 0; i < item_no; i++) { ++ status[i] = (items[i]->selected == 1); /* ON */ ++ if ((!choice && status[i]) || items[i]->selected == 2) /* SELECTED */ ++ choice = i + 1; ++ } ++ if (choice) ++ choice--; ++ ++ max_choice = MIN (list_height, item_no); ++ ++ /* center dialog box on screen */ ++ x = (COLS - width) / 2; ++ y = (LINES - height) / 2; ++ ++ draw_shadow (stdscr, y, x, height, width); ++ ++ dialog = newwin (height, width, y, x); ++ keypad (dialog, TRUE); ++ ++ draw_box (dialog, 0, 0, height, width, dialog_attr, border_attr); ++ wattrset (dialog, border_attr); ++ mvwaddch (dialog, height-3, 0, ACS_LTEE); ++ for (i = 0; i < width - 2; i++) ++ waddch (dialog, ACS_HLINE); ++ wattrset (dialog, dialog_attr); ++ waddch (dialog, ACS_RTEE); ++ ++ if (title != NULL && strlen(title) >= width-2 ) { ++ /* truncate long title -- mec */ ++ char * title2 = malloc(width-2+1); ++ memcpy( title2, title, width-2 ); ++ title2[width-2] = '\0'; ++ title = title2; ++ } ++ ++ if (title != NULL) { ++ wattrset (dialog, title_attr); ++ mvwaddch (dialog, 0, (width - strlen(title))/2 - 1, ' '); ++ waddstr (dialog, (char *)title); ++ waddch (dialog, ' '); ++ } ++ ++ wattrset (dialog, dialog_attr); ++ print_autowrap (dialog, prompt, width - 2, 1, 3); ++ ++ list_width = width - 6; ++ box_y = height - list_height - 5; ++ box_x = (width - list_width) / 2 - 1; ++ ++ /* create new window for the list */ ++ list = subwin (dialog, list_height, list_width, y+box_y+1, x+box_x+1); ++ ++ keypad (list, TRUE); ++ ++ /* draw a box around the list items */ ++ draw_box (dialog, box_y, box_x, list_height + 2, list_width + 2, ++ menubox_border_attr, menubox_attr); ++ ++ /* Find length of longest item in order to center checklist */ ++ check_x = 0; ++ for (i = 0; i < item_no; i++) ++ check_x = MAX (check_x, + strlen (items[i]->name) + 4); ++ ++ check_x = (list_width - check_x) / 2; ++ item_x = check_x + 4; ++ ++ if (choice >= list_height) { ++ scroll = choice - list_height + 1; ++ choice -= scroll; ++ } ++ ++ /* Print the list */ ++ for (i = 0; i < max_choice; i++) { ++ print_item (list, items[scroll + i]->name, ++ status[i+scroll], i, i == choice); ++ } ++ ++ print_arrows(dialog, choice, item_no, scroll, ++ box_y, box_x + check_x + 5, list_height); ++ ++ print_buttons(dialog, height, width, 0); ++ ++ wnoutrefresh (list); ++ wnoutrefresh (dialog); ++ doupdate (); ++ ++ while (key != ESC) { ++ key = wgetch (dialog); ++ ++ for (i = 0; i < max_choice; i++) ++ if (toupper(key) == toupper(items[scroll + i]->name[0])) ++ break; ++ ++ ++ if ( i < max_choice || key == KEY_UP || key == KEY_DOWN || ++ key == '+' || key == '-' ) { ++ if (key == KEY_UP || key == '-') { ++ if (!choice) { ++ if (!scroll) ++ continue; ++ /* Scroll list down */ ++ if (list_height > 1) { ++ /* De-highlight current first item */ ++ print_item (list, items[scroll]->name, ++ status[scroll], 0, FALSE); ++ scrollok (list, TRUE); ++ wscrl (list, -1); ++ scrollok (list, FALSE); ++ } ++ scroll--; ++ print_item (list, items[scroll]->name, ++ status[scroll], 0, TRUE); ++ wnoutrefresh (list); ++ ++ print_arrows(dialog, choice, item_no, scroll, ++ box_y, box_x + check_x + 5, list_height); ++ ++ wrefresh (dialog); ++ ++ continue; /* wait for another key press */ ++ } else ++ i = choice - 1; ++ } else if (key == KEY_DOWN || key == '+') { ++ if (choice == max_choice - 1) { ++ if (scroll + choice >= item_no - 1) ++ continue; ++ /* Scroll list up */ ++ if (list_height > 1) { ++ /* De-highlight current last item before scrolling up */ ++ print_item (list, items[scroll + max_choice - 1]->name, ++ status[scroll + max_choice - 1], ++ max_choice - 1, FALSE); ++ scrollok (list, TRUE); ++ scroll (list); ++ scrollok (list, FALSE); ++ } ++ scroll++; ++ print_item (list, items[scroll + max_choice - 1]->name, ++ status[scroll + max_choice - 1], ++ max_choice - 1, TRUE); ++ wnoutrefresh (list); ++ ++ print_arrows(dialog, choice, item_no, scroll, ++ box_y, box_x + check_x + 5, list_height); ++ ++ wrefresh (dialog); ++ ++ continue; /* wait for another key press */ ++ } else ++ i = choice + 1; ++ } ++ if (i != choice) { ++ /* De-highlight current item */ ++ print_item (list, items[scroll + choice]->name, ++ status[scroll + choice], choice, FALSE); ++ /* Highlight new item */ ++ choice = i; ++ print_item (list, items[scroll + choice]->name, ++ status[scroll + choice], choice, TRUE); ++ wnoutrefresh (list); ++ wrefresh (dialog); ++ } ++ continue; /* wait for another key press */ ++ } ++ switch (key) { ++ case 'H': ++ case 'h': ++ case '?': ++ for (i = 0; i < item_no; i++) ++ items[i]->selected = 0; ++ items[scroll + choice]->selected = 1; ++ delwin (dialog); ++ free (status); ++ return 1; ++ case TAB: ++ case KEY_LEFT: ++ case KEY_RIGHT: ++ button = ((key == KEY_LEFT ? --button : ++button) < 0) ++ ? 1 : (button > 1 ? 0 : button); ++ ++ print_buttons(dialog, height, width, button); ++ wrefresh (dialog); ++ break; ++ case 'S': ++ case 's': ++ case ' ': ++ case '\n': ++ if (!button) { ++ if (flag == FLAG_CHECK) { ++ status[scroll + choice] = !status[scroll + choice]; ++ wmove (list, choice, check_x); ++ wattrset (list, check_selected_attr); ++ wprintw (list, "[%c]", status[scroll + choice] ? 'X' : ' '); ++ } else { ++ if (!status[scroll + choice]) { ++ for (i = 0; i < item_no; i++) ++ status[i] = 0; ++ status[scroll + choice] = 1; ++ for (i = 0; i < max_choice; i++) ++ print_item (list, items[scroll + i]->name, ++ status[scroll + i], i, i == choice); ++ } ++ } ++ wnoutrefresh (list); ++ wrefresh (dialog); ++ ++ for (i = 0; i < item_no; i++) { ++ items[i]->selected = status[i]; ++ } ++ } else { ++ for (i = 0; i < item_no; i++) ++ items[i]->selected = 0; ++ items[scroll + choice]->selected = 1; ++ } ++ delwin (dialog); ++ free (status); ++ return button; ++ case 'X': ++ case 'x': ++ key = ESC; ++ case ESC: ++ break; ++ } ++ ++ /* Now, update everything... */ ++ doupdate (); ++ } ++ ++ ++ delwin (dialog); ++ free (status); ++ return -1; /* ESC pressed */ ++} +diff --git a/feeds/luci/libs/luci-lib-nixio/axTLS/config/scripts/config/lxdialog/colors.h b/feeds/luci/libs/luci-lib-nixio/axTLS/config/scripts/config/lxdialog/colors.h +new file mode 100644 +index 0000000..d34dd37 +--- /dev/null ++++ b/feeds/luci/libs/luci-lib-nixio/axTLS/config/scripts/config/lxdialog/colors.h +@@ -0,0 +1,161 @@ ++/* ++ * colors.h -- color attribute definitions ++ * ++ * AUTHOR: Savio Lam (lam836@cs.cuhk.hk) ++ * ++ * 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. ++ * ++ * This program is distributed in the hope that it will be useful, ++ * but WITHOUT ANY WARRANTY; without even the implied warranty of ++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++ * GNU General Public License for more details. ++ * ++ * You should have received a copy of the GNU General Public License ++ * along with this program; if not, write to the Free Software ++ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. ++ */ ++ ++ ++/* ++ * Default color definitions ++ * ++ * *_FG = foreground ++ * *_BG = background ++ * *_HL = highlight? ++ */ ++#define SCREEN_FG COLOR_CYAN ++#define SCREEN_BG COLOR_BLUE ++#define SCREEN_HL TRUE ++ ++#define SHADOW_FG COLOR_BLACK ++#define SHADOW_BG COLOR_BLACK ++#define SHADOW_HL TRUE ++ ++#define DIALOG_FG COLOR_BLACK ++#define DIALOG_BG COLOR_WHITE ++#define DIALOG_HL FALSE ++ ++#define TITLE_FG COLOR_YELLOW ++#define TITLE_BG COLOR_WHITE ++#define TITLE_HL TRUE ++ ++#define BORDER_FG COLOR_WHITE ++#define BORDER_BG COLOR_WHITE ++#define BORDER_HL TRUE ++ ++#define BUTTON_ACTIVE_FG COLOR_WHITE ++#define BUTTON_ACTIVE_BG COLOR_BLUE ++#define BUTTON_ACTIVE_HL TRUE ++ ++#define BUTTON_INACTIVE_FG COLOR_BLACK ++#define BUTTON_INACTIVE_BG COLOR_WHITE ++#define BUTTON_INACTIVE_HL FALSE ++ ++#define BUTTON_KEY_ACTIVE_FG COLOR_WHITE ++#define BUTTON_KEY_ACTIVE_BG COLOR_BLUE ++#define BUTTON_KEY_ACTIVE_HL TRUE ++ ++#define BUTTON_KEY_INACTIVE_FG COLOR_RED ++#define BUTTON_KEY_INACTIVE_BG COLOR_WHITE ++#define BUTTON_KEY_INACTIVE_HL FALSE ++ ++#define BUTTON_LABEL_ACTIVE_FG COLOR_YELLOW ++#define BUTTON_LABEL_ACTIVE_BG COLOR_BLUE ++#define BUTTON_LABEL_ACTIVE_HL TRUE ++ ++#define BUTTON_LABEL_INACTIVE_FG COLOR_BLACK ++#define BUTTON_LABEL_INACTIVE_BG COLOR_WHITE ++#define BUTTON_LABEL_INACTIVE_HL TRUE ++ ++#define INPUTBOX_FG COLOR_BLACK ++#define INPUTBOX_BG COLOR_WHITE ++#define INPUTBOX_HL FALSE ++ ++#define INPUTBOX_BORDER_FG COLOR_BLACK ++#define INPUTBOX_BORDER_BG COLOR_WHITE ++#define INPUTBOX_BORDER_HL FALSE ++ ++#define SEARCHBOX_FG COLOR_BLACK ++#define SEARCHBOX_BG COLOR_WHITE ++#define SEARCHBOX_HL FALSE ++ ++#define SEARCHBOX_TITLE_FG COLOR_YELLOW ++#define SEARCHBOX_TITLE_BG COLOR_WHITE ++#define SEARCHBOX_TITLE_HL TRUE ++ ++#define SEARCHBOX_BORDER_FG COLOR_WHITE ++#define SEARCHBOX_BORDER_BG COLOR_WHITE ++#define SEARCHBOX_BORDER_HL TRUE ++ ++#define POSITION_INDICATOR_FG COLOR_YELLOW ++#define POSITION_INDICATOR_BG COLOR_WHITE ++#define POSITION_INDICATOR_HL TRUE ++ ++#define MENUBOX_FG COLOR_BLACK ++#define MENUBOX_BG COLOR_WHITE ++#define MENUBOX_HL FALSE ++ ++#define MENUBOX_BORDER_FG COLOR_WHITE ++#define MENUBOX_BORDER_BG COLOR_WHITE ++#define MENUBOX_BORDER_HL TRUE ++ ++#define ITEM_FG COLOR_BLACK ++#define ITEM_BG COLOR_WHITE ++#define ITEM_HL FALSE ++ ++#define ITEM_SELECTED_FG COLOR_WHITE ++#define ITEM_SELECTED_BG COLOR_BLUE ++#define ITEM_SELECTED_HL TRUE ++ ++#define TAG_FG COLOR_YELLOW ++#define TAG_BG COLOR_WHITE ++#define TAG_HL TRUE ++ ++#define TAG_SELECTED_FG COLOR_YELLOW ++#define TAG_SELECTED_BG COLOR_BLUE ++#define TAG_SELECTED_HL TRUE ++ ++#define TAG_KEY_FG COLOR_YELLOW ++#define TAG_KEY_BG COLOR_WHITE ++#define TAG_KEY_HL TRUE ++ ++#define TAG_KEY_SELECTED_FG COLOR_YELLOW ++#define TAG_KEY_SELECTED_BG COLOR_BLUE ++#define TAG_KEY_SELECTED_HL TRUE ++ ++#define CHECK_FG COLOR_BLACK ++#define CHECK_BG COLOR_WHITE ++#define CHECK_HL FALSE ++ ++#define CHECK_SELECTED_FG COLOR_WHITE ++#define CHECK_SELECTED_BG COLOR_BLUE ++#define CHECK_SELECTED_HL TRUE ++ ++#define UARROW_FG COLOR_GREEN ++#define UARROW_BG COLOR_WHITE ++#define UARROW_HL TRUE ++ ++#define DARROW_FG COLOR_GREEN ++#define DARROW_BG COLOR_WHITE ++#define DARROW_HL TRUE ++ ++/* End of default color definitions */ ++ ++#define C_ATTR(x,y) ((x ? A_BOLD : 0) | COLOR_PAIR((y))) ++#define COLOR_NAME_LEN 10 ++#define COLOR_COUNT 8 ++ ++/* ++ * Global variables ++ */ ++ ++typedef struct { ++ char name[COLOR_NAME_LEN]; ++ int value; ++} color_names_st; ++ ++extern color_names_st color_names[]; ++extern int color_table[][3]; +diff --git a/feeds/luci/libs/luci-lib-nixio/axTLS/config/scripts/config/lxdialog/dialog.h b/feeds/luci/libs/luci-lib-nixio/axTLS/config/scripts/config/lxdialog/dialog.h +new file mode 100644 +index 0000000..7bab3ad +--- /dev/null ++++ b/feeds/luci/libs/luci-lib-nixio/axTLS/config/scripts/config/lxdialog/dialog.h +@@ -0,0 +1,199 @@ ++ ++/* ++ * dialog.h -- common declarations for all dialog modules ++ * ++ * AUTHOR: Savio Lam (lam836@cs.cuhk.hk) ++ * ++ * 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. ++ * ++ * This program is distributed in the hope that it will be useful, ++ * but WITHOUT ANY WARRANTY; without even the implied warranty of ++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++ * GNU General Public License for more details. ++ * ++ * You should have received a copy of the GNU General Public License ++ * along with this program; if not, write to the Free Software ++ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. ++ */ ++ ++#include ++#include ++#include ++#include ++#include ++#include ++ ++#ifdef CURSES_LOC ++#ifdef __sun__ ++#define CURS_MACROS ++#endif ++#include CURSES_LOC ++ ++/* ++ * Colors in ncurses 1.9.9e do not work properly since foreground and ++ * background colors are OR'd rather than separately masked. This version ++ * of dialog was hacked to work with ncurses 1.9.9e, making it incompatible ++ * with standard curses. The simplest fix (to make this work with standard ++ * curses) uses the wbkgdset() function, not used in the original hack. ++ * Turn it off if we're building with 1.9.9e, since it just confuses things. ++ */ ++#if defined(NCURSES_VERSION) && defined(_NEED_WRAP) && !defined(GCC_PRINTFLIKE) ++#define OLD_NCURSES 1 ++#undef wbkgdset ++#define wbkgdset(w,p) /*nothing*/ ++#else ++#define OLD_NCURSES 0 ++#endif ++ ++#define TR(params) _tracef params ++ ++#define ESC 27 ++#define TAB 9 ++#define MAX_LEN 2048 ++#define BUF_SIZE (10*1024) ++#define MIN(x,y) (x < y ? x : y) ++#define MAX(x,y) (x > y ? x : y) ++ ++ ++#ifndef ACS_ULCORNER ++#define ACS_ULCORNER '+' ++#endif ++#ifndef ACS_LLCORNER ++#define ACS_LLCORNER '+' ++#endif ++#ifndef ACS_URCORNER ++#define ACS_URCORNER '+' ++#endif ++#ifndef ACS_LRCORNER ++#define ACS_LRCORNER '+' ++#endif ++#ifndef ACS_HLINE ++#define ACS_HLINE '-' ++#endif ++#ifndef ACS_VLINE ++#define ACS_VLINE '|' ++#endif ++#ifndef ACS_LTEE ++#define ACS_LTEE '+' ++#endif ++#ifndef ACS_RTEE ++#define ACS_RTEE '+' ++#endif ++#ifndef ACS_UARROW ++#define ACS_UARROW '^' ++#endif ++#ifndef ACS_DARROW ++#define ACS_DARROW 'v' ++#endif ++ ++/* ++ * Attribute names ++ */ ++#define screen_attr attributes[0] ++#define shadow_attr attributes[1] ++#define dialog_attr attributes[2] ++#define title_attr attributes[3] ++#define border_attr attributes[4] ++#define button_active_attr attributes[5] ++#define button_inactive_attr attributes[6] ++#define button_key_active_attr attributes[7] ++#define button_key_inactive_attr attributes[8] ++#define button_label_active_attr attributes[9] ++#define button_label_inactive_attr attributes[10] ++#define inputbox_attr attributes[11] ++#define inputbox_border_attr attributes[12] ++#define searchbox_attr attributes[13] ++#define searchbox_title_attr attributes[14] ++#define searchbox_border_attr attributes[15] ++#define position_indicator_attr attributes[16] ++#define menubox_attr attributes[17] ++#define menubox_border_attr attributes[18] ++#define item_attr attributes[19] ++#define item_selected_attr attributes[20] ++#define tag_attr attributes[21] ++#define tag_selected_attr attributes[22] ++#define tag_key_attr attributes[23] ++#define tag_key_selected_attr attributes[24] ++#define check_attr attributes[25] ++#define check_selected_attr attributes[26] ++#define uarrow_attr attributes[27] ++#define darrow_attr attributes[28] ++ ++/* number of attributes */ ++#define ATTRIBUTE_COUNT 29 ++ ++/* ++ * Global variables ++ */ ++extern bool use_colors; ++ ++extern chtype attributes[]; ++#endif ++ ++extern const char *backtitle; ++ ++struct dialog_list_item { ++ char *name; ++ int namelen; ++ char *tag; ++ int selected; /* Set to 1 by dialog_*() function. */ ++}; ++ ++/* ++ * Function prototypes ++ */ ++ ++void init_dialog (void); ++void end_dialog (void); ++void dialog_clear (void); ++#ifdef CURSES_LOC ++void attr_clear (WINDOW * win, int height, int width, chtype attr); ++void color_setup (void); ++void print_autowrap (WINDOW * win, const char *prompt, int width, int y, int x); ++void print_button (WINDOW * win, const char *label, int y, int x, int selected); ++void draw_box (WINDOW * win, int y, int x, int height, int width, chtype box, ++ chtype border); ++void draw_shadow (WINDOW * win, int y, int x, int height, int width); ++#endif ++ ++int first_alpha (const char *string, const char *exempt); ++int dialog_yesno (const char *title, const char *prompt, int height, int width); ++int dialog_msgbox (const char *title, const char *prompt, int height, ++ int width, int pause); ++int dialog_textbox (const char *title, const char *file, int height, int width); ++int dialog_menu (const char *title, const char *prompt, int height, int width, ++ int menu_height, const char *choice, int item_no, ++ struct dialog_list_item ** items); ++int dialog_checklist (const char *title, const char *prompt, int height, ++ int width, int list_height, int item_no, ++ struct dialog_list_item ** items, int flag); ++extern unsigned char dialog_input_result[]; ++int dialog_inputbox (const char *title, const char *prompt, int height, ++ int width, const char *init); ++ ++struct dialog_list_item *first_sel_item(int item_no, ++ struct dialog_list_item ** items); ++ ++/* ++ * This is the base for fictitious keys, which activate ++ * the buttons. ++ * ++ * Mouse-generated keys are the following: ++ * -- the first 32 are used as numbers, in addition to '0'-'9' ++ * -- the lowercase are used to signal mouse-enter events (M_EVENT + 'o') ++ * -- uppercase chars are used to invoke the button (M_EVENT + 'O') ++ */ ++#ifdef CURSES_LOC ++#define M_EVENT (KEY_MAX+1) ++#endif ++ ++ ++/* ++ * The `flag' parameter in checklist is used to select between ++ * radiolist and checklist ++ */ ++#define FLAG_CHECK 1 ++#define FLAG_RADIO 0 +diff --git a/feeds/luci/libs/luci-lib-nixio/axTLS/config/scripts/config/lxdialog/inputbox.c b/feeds/luci/libs/luci-lib-nixio/axTLS/config/scripts/config/lxdialog/inputbox.c +new file mode 100644 +index 0000000..fa7bebc +--- /dev/null ++++ b/feeds/luci/libs/luci-lib-nixio/axTLS/config/scripts/config/lxdialog/inputbox.c +@@ -0,0 +1,240 @@ ++/* ++ * inputbox.c -- implements the input box ++ * ++ * ORIGINAL AUTHOR: Savio Lam (lam836@cs.cuhk.hk) ++ * MODIFIED FOR LINUX KERNEL CONFIG BY: William Roadcap (roadcap@cfw.com) ++ * ++ * 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. ++ * ++ * This program is distributed in the hope that it will be useful, ++ * but WITHOUT ANY WARRANTY; without even the implied warranty of ++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++ * GNU General Public License for more details. ++ * ++ * You should have received a copy of the GNU General Public License ++ * along with this program; if not, write to the Free Software ++ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. ++ */ ++ ++#include "dialog.h" ++ ++unsigned char dialog_input_result[MAX_LEN + 1]; ++ ++/* ++ * Print the termination buttons ++ */ ++static void ++print_buttons(WINDOW *dialog, int height, int width, int selected) ++{ ++ int x = width / 2 - 11; ++ int y = height - 2; ++ ++ print_button (dialog, " Ok ", y, x, selected==0); ++ print_button (dialog, " Help ", y, x + 14, selected==1); ++ ++ wmove(dialog, y, x+1+14*selected); ++ wrefresh(dialog); ++} ++ ++/* ++ * Display a dialog box for inputing a string ++ */ ++int ++dialog_inputbox (const char *title, const char *prompt, int height, int width, ++ const char *init) ++{ ++ int i, x, y, box_y, box_x, box_width; ++ int input_x = 0, scroll = 0, key = 0, button = -1; ++ unsigned char *instr = dialog_input_result; ++ WINDOW *dialog; ++ ++ /* center dialog box on screen */ ++ x = (COLS - width) / 2; ++ y = (LINES - height) / 2; ++ ++ ++ draw_shadow (stdscr, y, x, height, width); ++ ++ dialog = newwin (height, width, y, x); ++ keypad (dialog, TRUE); ++ ++ draw_box (dialog, 0, 0, height, width, dialog_attr, border_attr); ++ wattrset (dialog, border_attr); ++ mvwaddch (dialog, height-3, 0, ACS_LTEE); ++ for (i = 0; i < width - 2; i++) ++ waddch (dialog, ACS_HLINE); ++ wattrset (dialog, dialog_attr); ++ waddch (dialog, ACS_RTEE); ++ ++ if (title != NULL && strlen(title) >= width-2 ) { ++ /* truncate long title -- mec */ ++ char * title2 = malloc(width-2+1); ++ memcpy( title2, title, width-2 ); ++ title2[width-2] = '\0'; ++ title = title2; ++ } ++ ++ if (title != NULL) { ++ wattrset (dialog, title_attr); ++ mvwaddch (dialog, 0, (width - strlen(title))/2 - 1, ' '); ++ waddstr (dialog, (char *)title); ++ waddch (dialog, ' '); ++ } ++ ++ wattrset (dialog, dialog_attr); ++ print_autowrap (dialog, prompt, width - 2, 1, 3); ++ ++ /* Draw the input field box */ ++ box_width = width - 6; ++ getyx (dialog, y, x); ++ box_y = y + 2; ++ box_x = (width - box_width) / 2; ++ draw_box (dialog, y + 1, box_x - 1, 3, box_width + 2, ++ border_attr, dialog_attr); ++ ++ print_buttons(dialog, height, width, 0); ++ ++ /* Set up the initial value */ ++ wmove (dialog, box_y, box_x); ++ wattrset (dialog, inputbox_attr); ++ ++ if (!init) ++ instr[0] = '\0'; ++ else ++ strcpy (instr, init); ++ ++ input_x = strlen (instr); ++ ++ if (input_x >= box_width) { ++ scroll = input_x - box_width + 1; ++ input_x = box_width - 1; ++ for (i = 0; i < box_width - 1; i++) ++ waddch (dialog, instr[scroll + i]); ++ } else ++ waddstr (dialog, instr); ++ ++ wmove (dialog, box_y, box_x + input_x); ++ ++ wrefresh (dialog); ++ ++ while (key != ESC) { ++ key = wgetch (dialog); ++ ++ if (button == -1) { /* Input box selected */ ++ switch (key) { ++ case TAB: ++ case KEY_UP: ++ case KEY_DOWN: ++ break; ++ case KEY_LEFT: ++ continue; ++ case KEY_RIGHT: ++ continue; ++ case KEY_BACKSPACE: ++ case 127: ++ if (input_x || scroll) { ++ wattrset (dialog, inputbox_attr); ++ if (!input_x) { ++ scroll = scroll < box_width - 1 ? ++ 0 : scroll - (box_width - 1); ++ wmove (dialog, box_y, box_x); ++ for (i = 0; i < box_width; i++) ++ waddch (dialog, instr[scroll + input_x + i] ? ++ instr[scroll + input_x + i] : ' '); ++ input_x = strlen (instr) - scroll; ++ } else ++ input_x--; ++ instr[scroll + input_x] = '\0'; ++ mvwaddch (dialog, box_y, input_x + box_x, ' '); ++ wmove (dialog, box_y, input_x + box_x); ++ wrefresh (dialog); ++ } ++ continue; ++ default: ++ if (key < 0x100 && isprint (key)) { ++ if (scroll + input_x < MAX_LEN) { ++ wattrset (dialog, inputbox_attr); ++ instr[scroll + input_x] = key; ++ instr[scroll + input_x + 1] = '\0'; ++ if (input_x == box_width - 1) { ++ scroll++; ++ wmove (dialog, box_y, box_x); ++ for (i = 0; i < box_width - 1; i++) ++ waddch (dialog, instr[scroll + i]); ++ } else { ++ wmove (dialog, box_y, input_x++ + box_x); ++ waddch (dialog, key); ++ } ++ wrefresh (dialog); ++ } else ++ flash (); /* Alarm user about overflow */ ++ continue; ++ } ++ } ++ } ++ switch (key) { ++ case 'O': ++ case 'o': ++ delwin (dialog); ++ return 0; ++ case 'H': ++ case 'h': ++ delwin (dialog); ++ return 1; ++ case KEY_UP: ++ case KEY_LEFT: ++ switch (button) { ++ case -1: ++ button = 1; /* Indicates "Cancel" button is selected */ ++ print_buttons(dialog, height, width, 1); ++ break; ++ case 0: ++ button = -1; /* Indicates input box is selected */ ++ print_buttons(dialog, height, width, 0); ++ wmove (dialog, box_y, box_x + input_x); ++ wrefresh (dialog); ++ break; ++ case 1: ++ button = 0; /* Indicates "OK" button is selected */ ++ print_buttons(dialog, height, width, 0); ++ break; ++ } ++ break; ++ case TAB: ++ case KEY_DOWN: ++ case KEY_RIGHT: ++ switch (button) { ++ case -1: ++ button = 0; /* Indicates "OK" button is selected */ ++ print_buttons(dialog, height, width, 0); ++ break; ++ case 0: ++ button = 1; /* Indicates "Cancel" button is selected */ ++ print_buttons(dialog, height, width, 1); ++ break; ++ case 1: ++ button = -1; /* Indicates input box is selected */ ++ print_buttons(dialog, height, width, 0); ++ wmove (dialog, box_y, box_x + input_x); ++ wrefresh (dialog); ++ break; ++ } ++ break; ++ case ' ': ++ case '\n': ++ delwin (dialog); ++ return (button == -1 ? 0 : button); ++ case 'X': ++ case 'x': ++ key = ESC; ++ case ESC: ++ break; ++ } ++ } ++ ++ delwin (dialog); ++ return -1; /* ESC pressed */ ++} +diff --git a/feeds/luci/libs/luci-lib-nixio/axTLS/config/scripts/config/lxdialog/menubox.c b/feeds/luci/libs/luci-lib-nixio/axTLS/config/scripts/config/lxdialog/menubox.c +new file mode 100644 +index 0000000..873dc58 +--- /dev/null ++++ b/feeds/luci/libs/luci-lib-nixio/axTLS/config/scripts/config/lxdialog/menubox.c +@@ -0,0 +1,438 @@ ++/* ++ * menubox.c -- implements the menu box ++ * ++ * ORIGINAL AUTHOR: Savio Lam (lam836@cs.cuhk.hk) ++ * MODIFIED FOR LINUX KERNEL CONFIG BY: William Roadcap (roadcapw@cfw.com) ++ * ++ * 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. ++ * ++ * This program is distributed in the hope that it will be useful, ++ * but WITHOUT ANY WARRANTY; without even the implied warranty of ++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++ * GNU General Public License for more details. ++ * ++ * You should have received a copy of the GNU General Public License ++ * along with this program; if not, write to the Free Software ++ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. ++ */ ++ ++/* ++ * Changes by Clifford Wolf (god@clifford.at) ++ * ++ * [ 1998-06-13 ] ++ * ++ * *) A bugfix for the Page-Down problem ++ * ++ * *) Formerly when I used Page Down and Page Up, the cursor would be set ++ * to the first position in the menu box. Now lxdialog is a bit ++ * smarter and works more like other menu systems (just have a look at ++ * it). ++ * ++ * *) Formerly if I selected something my scrolling would be broken because ++ * lxdialog is re-invoked by the Menuconfig shell script, can't ++ * remember the last scrolling position, and just sets it so that the ++ * cursor is at the bottom of the box. Now it writes the temporary file ++ * lxdialog.scrltmp which contains this information. The file is ++ * deleted by lxdialog if the user leaves a submenu or enters a new ++ * one, but it would be nice if Menuconfig could make another "rm -f" ++ * just to be sure. Just try it out - you will recognise a difference! ++ * ++ * [ 1998-06-14 ] ++ * ++ * *) Now lxdialog is crash-safe against broken "lxdialog.scrltmp" files ++ * and menus change their size on the fly. ++ * ++ * *) If for some reason the last scrolling position is not saved by ++ * lxdialog, it sets the scrolling so that the selected item is in the ++ * middle of the menu box, not at the bottom. ++ * ++ * 02 January 1999, Michael Elizabeth Chastain (mec@shout.net) ++ * Reset 'scroll' to 0 if the value from lxdialog.scrltmp is bogus. ++ * This fixes a bug in Menuconfig where using ' ' to descend into menus ++ * would leave mis-synchronized lxdialog.scrltmp files lying around, ++ * fscanf would read in 'scroll', and eventually that value would get used. ++ */ ++ ++#include "dialog.h" ++ ++static int menu_width, item_x; ++ ++/* ++ * Print menu item ++ */ ++static void ++print_item (WINDOW * win, const char *item, int choice, int selected, int hotkey) ++{ ++ int j; ++ char menu_item[menu_width+1]; ++ ++ strncpy(menu_item, item, menu_width); ++ menu_item[menu_width] = 0; ++ j = first_alpha(menu_item, "YyNnMmHh"); ++ ++ /* Clear 'residue' of last item */ ++ wattrset (win, menubox_attr); ++ wmove (win, choice, 0); ++#if OLD_NCURSES ++ { ++ int i; ++ for (i = 0; i < menu_width; i++) ++ waddch (win, ' '); ++ } ++#else ++ wclrtoeol(win); ++#endif ++ wattrset (win, selected ? item_selected_attr : item_attr); ++ mvwaddstr (win, choice, item_x, menu_item); ++ if (hotkey) { ++ wattrset (win, selected ? tag_key_selected_attr : tag_key_attr); ++ mvwaddch(win, choice, item_x+j, menu_item[j]); ++ } ++ if (selected) { ++ wmove (win, choice, item_x+1); ++ wrefresh (win); ++ } ++} ++ ++/* ++ * Print the scroll indicators. ++ */ ++static void ++print_arrows (WINDOW * win, int item_no, int scroll, ++ int y, int x, int height) ++{ ++ int cur_y, cur_x; ++ ++ getyx(win, cur_y, cur_x); ++ ++ wmove(win, y, x); ++ ++ if (scroll > 0) { ++ wattrset (win, uarrow_attr); ++ waddch (win, ACS_UARROW); ++ waddstr (win, "(-)"); ++ } ++ else { ++ wattrset (win, menubox_attr); ++ waddch (win, ACS_HLINE); ++ waddch (win, ACS_HLINE); ++ waddch (win, ACS_HLINE); ++ waddch (win, ACS_HLINE); ++ } ++ ++ y = y + height + 1; ++ wmove(win, y, x); ++ ++ if ((height < item_no) && (scroll + height < item_no)) { ++ wattrset (win, darrow_attr); ++ waddch (win, ACS_DARROW); ++ waddstr (win, "(+)"); ++ } ++ else { ++ wattrset (win, menubox_border_attr); ++ waddch (win, ACS_HLINE); ++ waddch (win, ACS_HLINE); ++ waddch (win, ACS_HLINE); ++ waddch (win, ACS_HLINE); ++ } ++ ++ wmove(win, cur_y, cur_x); ++} ++ ++/* ++ * Display the termination buttons. ++ */ ++static void ++print_buttons (WINDOW *win, int height, int width, int selected) ++{ ++ int x = width / 2 - 16; ++ int y = height - 2; ++ ++ print_button (win, "Select", y, x, selected == 0); ++ print_button (win, " Exit ", y, x + 12, selected == 1); ++ print_button (win, " Help ", y, x + 24, selected == 2); ++ ++ wmove(win, y, x+1+12*selected); ++ wrefresh (win); ++} ++ ++/* ++ * Display a menu for choosing among a number of options ++ */ ++int ++dialog_menu (const char *title, const char *prompt, int height, int width, ++ int menu_height, const char *current, int item_no, ++ struct dialog_list_item ** items) ++{ ++ int i, j, x, y, box_x, box_y; ++ int key = 0, button = 0, scroll = 0, choice = 0, first_item = 0, max_choice; ++ WINDOW *dialog, *menu; ++ FILE *f; ++ ++ max_choice = MIN (menu_height, item_no); ++ ++ /* center dialog box on screen */ ++ x = (COLS - width) / 2; ++ y = (LINES - height) / 2; ++ ++ draw_shadow (stdscr, y, x, height, width); ++ ++ dialog = newwin (height, width, y, x); ++ keypad (dialog, TRUE); ++ ++ draw_box (dialog, 0, 0, height, width, dialog_attr, border_attr); ++ wattrset (dialog, border_attr); ++ mvwaddch (dialog, height - 3, 0, ACS_LTEE); ++ for (i = 0; i < width - 2; i++) ++ waddch (dialog, ACS_HLINE); ++ wattrset (dialog, dialog_attr); ++ wbkgdset (dialog, dialog_attr & A_COLOR); ++ waddch (dialog, ACS_RTEE); ++ ++ if (title != NULL && strlen(title) >= width-2 ) { ++ /* truncate long title -- mec */ ++ char * title2 = malloc(width-2+1); ++ memcpy( title2, title, width-2 ); ++ title2[width-2] = '\0'; ++ title = title2; ++ } ++ ++ if (title != NULL) { ++ wattrset (dialog, title_attr); ++ mvwaddch (dialog, 0, (width - strlen(title))/2 - 1, ' '); ++ waddstr (dialog, (char *)title); ++ waddch (dialog, ' '); ++ } ++ ++ wattrset (dialog, dialog_attr); ++ print_autowrap (dialog, prompt, width - 2, 1, 3); ++ ++ menu_width = width - 6; ++ box_y = height - menu_height - 5; ++ box_x = (width - menu_width) / 2 - 1; ++ ++ /* create new window for the menu */ ++ menu = subwin (dialog, menu_height, menu_width, ++ y + box_y + 1, x + box_x + 1); ++ keypad (menu, TRUE); ++ ++ /* draw a box around the menu items */ ++ draw_box (dialog, box_y, box_x, menu_height + 2, menu_width + 2, ++ menubox_border_attr, menubox_attr); ++ ++ /* ++ * Find length of longest item in order to center menu. ++ * Set 'choice' to default item. ++ */ ++ item_x = 0; ++ for (i = 0; i < item_no; i++) { ++ item_x = MAX (item_x, MIN(menu_width, strlen (items[i]->name) + 2)); ++ if (strcmp(current, items[i]->tag) == 0) choice = i; ++ } ++ ++ item_x = (menu_width - item_x) / 2; ++ ++ /* get the scroll info from the temp file */ ++ if ( (f=fopen("lxdialog.scrltmp","r")) != NULL ) { ++ if ( (fscanf(f,"%d\n",&scroll) == 1) && (scroll <= choice) && ++ (scroll+max_choice > choice) && (scroll >= 0) && ++ (scroll+max_choice <= item_no) ) { ++ first_item = scroll; ++ choice = choice - scroll; ++ fclose(f); ++ } else { ++ scroll=0; ++ remove("lxdialog.scrltmp"); ++ fclose(f); ++ f=NULL; ++ } ++ } ++ if ( (choice >= max_choice) || (f==NULL && choice >= max_choice/2) ) { ++ if (choice >= item_no-max_choice/2) ++ scroll = first_item = item_no-max_choice; ++ else ++ scroll = first_item = choice - max_choice/2; ++ choice = choice - scroll; ++ } ++ ++ /* Print the menu */ ++ for (i=0; i < max_choice; i++) { ++ print_item (menu, items[first_item + i]->name, i, i == choice, ++ (items[first_item + i]->tag[0] != ':')); ++ } ++ ++ wnoutrefresh (menu); ++ ++ print_arrows(dialog, item_no, scroll, ++ box_y, box_x+item_x+1, menu_height); ++ ++ print_buttons (dialog, height, width, 0); ++ wmove (menu, choice, item_x+1); ++ wrefresh (menu); ++ ++ while (key != ESC) { ++ key = wgetch(menu); ++ ++ if (key < 256 && isalpha(key)) key = tolower(key); ++ ++ if (strchr("ynmh", key)) ++ i = max_choice; ++ else { ++ for (i = choice+1; i < max_choice; i++) { ++ j = first_alpha(items[scroll + i]->name, "YyNnMmHh"); ++ if (key == tolower(items[scroll + i]->name[j])) ++ break; ++ } ++ if (i == max_choice) ++ for (i = 0; i < max_choice; i++) { ++ j = first_alpha(items[scroll + i]->name, "YyNnMmHh"); ++ if (key == tolower(items[scroll + i]->name[j])) ++ break; ++ } ++ } ++ ++ if (i < max_choice || ++ key == KEY_UP || key == KEY_DOWN || ++ key == '-' || key == '+' || ++ key == KEY_PPAGE || key == KEY_NPAGE) { ++ ++ print_item (menu, items[scroll + choice]->name, choice, FALSE, ++ (items[scroll + choice]->tag[0] != ':')); ++ ++ if (key == KEY_UP || key == '-') { ++ if (choice < 2 && scroll) { ++ /* Scroll menu down */ ++ scrollok (menu, TRUE); ++ wscrl (menu, -1); ++ scrollok (menu, FALSE); ++ ++ scroll--; ++ ++ print_item (menu, items[scroll]->name, 0, FALSE, ++ (items[scroll]->tag[0] != ':')); ++ } else ++ choice = MAX(choice - 1, 0); ++ ++ } else if (key == KEY_DOWN || key == '+') { ++ ++ print_item (menu, items[scroll + choice]->name, choice, FALSE, ++ (items[scroll + choice]->tag[0] != ':')); ++ ++ if ((choice > max_choice-3) && ++ (scroll + max_choice < item_no) ++ ) { ++ /* Scroll menu up */ ++ scrollok (menu, TRUE); ++ scroll (menu); ++ scrollok (menu, FALSE); ++ ++ scroll++; ++ ++ print_item (menu, items[scroll + max_choice - 1]->name, ++ max_choice-1, FALSE, ++ (items[scroll + max_choice - 1]->tag[0] != ':')); ++ } else ++ choice = MIN(choice+1, max_choice-1); ++ ++ } else if (key == KEY_PPAGE) { ++ scrollok (menu, TRUE); ++ for (i=0; (i < max_choice); i++) { ++ if (scroll > 0) { ++ wscrl (menu, -1); ++ scroll--; ++ print_item (menu, items[scroll]->name, 0, FALSE, ++ (items[scroll]->tag[0] != ':')); ++ } else { ++ if (choice > 0) ++ choice--; ++ } ++ } ++ scrollok (menu, FALSE); ++ ++ } else if (key == KEY_NPAGE) { ++ for (i=0; (i < max_choice); i++) { ++ if (scroll+max_choice < item_no) { ++ scrollok (menu, TRUE); ++ scroll(menu); ++ scrollok (menu, FALSE); ++ scroll++; ++ print_item (menu, items[scroll + max_choice - 1]->name, ++ max_choice-1, FALSE, ++ (items[scroll + max_choice - 1]->tag[0] != ':')); ++ } else { ++ if (choice+1 < max_choice) ++ choice++; ++ } ++ } ++ ++ } else ++ choice = i; ++ ++ print_item (menu, items[scroll + choice]->name, choice, TRUE, ++ (items[scroll + choice]->tag[0] != ':')); ++ ++ print_arrows(dialog, item_no, scroll, ++ box_y, box_x+item_x+1, menu_height); ++ ++ wnoutrefresh (dialog); ++ wrefresh (menu); ++ ++ continue; /* wait for another key press */ ++ } ++ ++ switch (key) { ++ case KEY_LEFT: ++ case TAB: ++ case KEY_RIGHT: ++ button = ((key == KEY_LEFT ? --button : ++button) < 0) ++ ? 2 : (button > 2 ? 0 : button); ++ ++ print_buttons(dialog, height, width, button); ++ wrefresh (menu); ++ break; ++ case ' ': ++ case 's': ++ case 'y': ++ case 'n': ++ case 'm': ++ case '/': ++ /* save scroll info */ ++ if ( (f=fopen("lxdialog.scrltmp","w")) != NULL ) { ++ fprintf(f,"%d\n",scroll); ++ fclose(f); ++ } ++ delwin (dialog); ++ items[scroll + choice]->selected = 1; ++ switch (key) { ++ case 's': return 3; ++ case 'y': return 3; ++ case 'n': return 4; ++ case 'm': return 5; ++ case ' ': return 6; ++ case '/': return 7; ++ } ++ return 0; ++ case 'h': ++ case '?': ++ button = 2; ++ case '\n': ++ delwin (dialog); ++ items[scroll + choice]->selected = 1; ++ ++ remove("lxdialog.scrltmp"); ++ return button; ++ case 'e': ++ case 'x': ++ key = ESC; ++ case ESC: ++ break; ++ } ++ } ++ ++ delwin (dialog); ++ remove("lxdialog.scrltmp"); ++ return -1; /* ESC pressed */ ++} +diff --git a/feeds/luci/libs/luci-lib-nixio/axTLS/config/scripts/config/lxdialog/msgbox.c b/feeds/luci/libs/luci-lib-nixio/axTLS/config/scripts/config/lxdialog/msgbox.c +new file mode 100644 +index 0000000..93692e1 +--- /dev/null ++++ b/feeds/luci/libs/luci-lib-nixio/axTLS/config/scripts/config/lxdialog/msgbox.c +@@ -0,0 +1,85 @@ ++/* ++ * msgbox.c -- implements the message box and info box ++ * ++ * ORIGINAL AUTHOR: Savio Lam (lam836@cs.cuhk.hk) ++ * MODIFIED FOR LINUX KERNEL CONFIG BY: William Roadcap (roadcapw@cfw.com) ++ * ++ * 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. ++ * ++ * This program is distributed in the hope that it will be useful, ++ * but WITHOUT ANY WARRANTY; without even the implied warranty of ++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++ * GNU General Public License for more details. ++ * ++ * You should have received a copy of the GNU General Public License ++ * along with this program; if not, write to the Free Software ++ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. ++ */ ++ ++#include "dialog.h" ++ ++/* ++ * Display a message box. Program will pause and display an "OK" button ++ * if the parameter 'pause' is non-zero. ++ */ ++int ++dialog_msgbox (const char *title, const char *prompt, int height, int width, ++ int pause) ++{ ++ int i, x, y, key = 0; ++ WINDOW *dialog; ++ ++ /* center dialog box on screen */ ++ x = (COLS - width) / 2; ++ y = (LINES - height) / 2; ++ ++ draw_shadow (stdscr, y, x, height, width); ++ ++ dialog = newwin (height, width, y, x); ++ keypad (dialog, TRUE); ++ ++ draw_box (dialog, 0, 0, height, width, dialog_attr, border_attr); ++ ++ if (title != NULL && strlen(title) >= width-2 ) { ++ /* truncate long title -- mec */ ++ char * title2 = malloc(width-2+1); ++ memcpy( title2, title, width-2 ); ++ title2[width-2] = '\0'; ++ title = title2; ++ } ++ ++ if (title != NULL) { ++ wattrset (dialog, title_attr); ++ mvwaddch (dialog, 0, (width - strlen(title))/2 - 1, ' '); ++ waddstr (dialog, (char *)title); ++ waddch (dialog, ' '); ++ } ++ wattrset (dialog, dialog_attr); ++ print_autowrap (dialog, prompt, width - 2, 1, 2); ++ ++ if (pause) { ++ wattrset (dialog, border_attr); ++ mvwaddch (dialog, height - 3, 0, ACS_LTEE); ++ for (i = 0; i < width - 2; i++) ++ waddch (dialog, ACS_HLINE); ++ wattrset (dialog, dialog_attr); ++ waddch (dialog, ACS_RTEE); ++ ++ print_button (dialog, " Ok ", ++ height - 2, width / 2 - 4, TRUE); ++ ++ wrefresh (dialog); ++ while (key != ESC && key != '\n' && key != ' ' && ++ key != 'O' && key != 'o' && key != 'X' && key != 'x') ++ key = wgetch (dialog); ++ } else { ++ key = '\n'; ++ wrefresh (dialog); ++ } ++ ++ delwin (dialog); ++ return key == ESC ? -1 : 0; ++} +diff --git a/feeds/luci/libs/luci-lib-nixio/axTLS/config/scripts/config/lxdialog/textbox.c b/feeds/luci/libs/luci-lib-nixio/axTLS/config/scripts/config/lxdialog/textbox.c +new file mode 100644 +index 0000000..a5a460b +--- /dev/null ++++ b/feeds/luci/libs/luci-lib-nixio/axTLS/config/scripts/config/lxdialog/textbox.c +@@ -0,0 +1,556 @@ ++/* ++ * textbox.c -- implements the text box ++ * ++ * ORIGINAL AUTHOR: Savio Lam (lam836@cs.cuhk.hk) ++ * MODIFIED FOR LINUX KERNEL CONFIG BY: William Roadcap (roadcap@cfw.com) ++ * ++ * 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. ++ * ++ * This program is distributed in the hope that it will be useful, ++ * but WITHOUT ANY WARRANTY; without even the implied warranty of ++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++ * GNU General Public License for more details. ++ * ++ * You should have received a copy of the GNU General Public License ++ * along with this program; if not, write to the Free Software ++ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. ++ */ ++ ++#include "dialog.h" ++ ++static void back_lines (int n); ++static void print_page (WINDOW * win, int height, int width); ++static void print_line (WINDOW * win, int row, int width); ++static char *get_line (void); ++static void print_position (WINDOW * win, int height, int width); ++ ++static int hscroll, fd, file_size, bytes_read; ++static int begin_reached = 1, end_reached, page_length; ++static char *buf, *page; ++ ++/* ++ * Display text from a file in a dialog box. ++ */ ++int ++dialog_textbox (const char *title, const char *file, int height, int width) ++{ ++ int i, x, y, cur_x, cur_y, fpos, key = 0; ++ int passed_end; ++ char search_term[MAX_LEN + 1]; ++ WINDOW *dialog, *text; ++ ++ search_term[0] = '\0'; /* no search term entered yet */ ++ ++ /* Open input file for reading */ ++ if ((fd = open (file, O_RDONLY)) == -1) { ++ endwin (); ++ fprintf (stderr, ++ "\nCan't open input file in dialog_textbox().\n"); ++ exit (-1); ++ } ++ /* Get file size. Actually, 'file_size' is the real file size - 1, ++ since it's only the last byte offset from the beginning */ ++ if ((file_size = lseek (fd, 0, SEEK_END)) == -1) { ++ endwin (); ++ fprintf (stderr, "\nError getting file size in dialog_textbox().\n"); ++ exit (-1); ++ } ++ /* Restore file pointer to beginning of file after getting file size */ ++ if (lseek (fd, 0, SEEK_SET) == -1) { ++ endwin (); ++ fprintf (stderr, "\nError moving file pointer in dialog_textbox().\n"); ++ exit (-1); ++ } ++ /* Allocate space for read buffer */ ++ if ((buf = malloc (BUF_SIZE + 1)) == NULL) { ++ endwin (); ++ fprintf (stderr, "\nCan't allocate memory in dialog_textbox().\n"); ++ exit (-1); ++ } ++ if ((bytes_read = read (fd, buf, BUF_SIZE)) == -1) { ++ endwin (); ++ fprintf (stderr, "\nError reading file in dialog_textbox().\n"); ++ exit (-1); ++ } ++ buf[bytes_read] = '\0'; /* mark end of valid data */ ++ page = buf; /* page is pointer to start of page to be displayed */ ++ ++ /* center dialog box on screen */ ++ x = (COLS - width) / 2; ++ y = (LINES - height) / 2; ++ ++ ++ draw_shadow (stdscr, y, x, height, width); ++ ++ dialog = newwin (height, width, y, x); ++ keypad (dialog, TRUE); ++ ++ /* Create window for text region, used for scrolling text */ ++ text = subwin (dialog, height - 4, width - 2, y + 1, x + 1); ++ wattrset (text, dialog_attr); ++ wbkgdset (text, dialog_attr & A_COLOR); ++ ++ keypad (text, TRUE); ++ ++ /* register the new window, along with its borders */ ++ draw_box (dialog, 0, 0, height, width, dialog_attr, border_attr); ++ ++ wattrset (dialog, border_attr); ++ mvwaddch (dialog, height-3, 0, ACS_LTEE); ++ for (i = 0; i < width - 2; i++) ++ waddch (dialog, ACS_HLINE); ++ wattrset (dialog, dialog_attr); ++ wbkgdset (dialog, dialog_attr & A_COLOR); ++ waddch (dialog, ACS_RTEE); ++ ++ if (title != NULL && strlen(title) >= width-2 ) { ++ /* truncate long title -- mec */ ++ char * title2 = malloc(width-2+1); ++ memcpy( title2, title, width-2 ); ++ title2[width-2] = '\0'; ++ title = title2; ++ } ++ ++ if (title != NULL) { ++ wattrset (dialog, title_attr); ++ mvwaddch (dialog, 0, (width - strlen(title))/2 - 1, ' '); ++ waddstr (dialog, (char *)title); ++ waddch (dialog, ' '); ++ } ++ print_button (dialog, " Exit ", height - 2, width / 2 - 4, TRUE); ++ wnoutrefresh (dialog); ++ getyx (dialog, cur_y, cur_x); /* Save cursor position */ ++ ++ /* Print first page of text */ ++ attr_clear (text, height - 4, width - 2, dialog_attr); ++ print_page (text, height - 4, width - 2); ++ print_position (dialog, height, width); ++ wmove (dialog, cur_y, cur_x); /* Restore cursor position */ ++ wrefresh (dialog); ++ ++ while ((key != ESC) && (key != '\n')) { ++ key = wgetch (dialog); ++ switch (key) { ++ case 'E': /* Exit */ ++ case 'e': ++ case 'X': ++ case 'x': ++ delwin (dialog); ++ free (buf); ++ close (fd); ++ return 0; ++ case 'g': /* First page */ ++ case KEY_HOME: ++ if (!begin_reached) { ++ begin_reached = 1; ++ /* First page not in buffer? */ ++ if ((fpos = lseek (fd, 0, SEEK_CUR)) == -1) { ++ endwin (); ++ fprintf (stderr, ++ "\nError moving file pointer in dialog_textbox().\n"); ++ exit (-1); ++ } ++ if (fpos > bytes_read) { /* Yes, we have to read it in */ ++ if (lseek (fd, 0, SEEK_SET) == -1) { ++ endwin (); ++ fprintf (stderr, "\nError moving file pointer in " ++ "dialog_textbox().\n"); ++ exit (-1); ++ } ++ if ((bytes_read = read (fd, buf, BUF_SIZE)) == -1) { ++ endwin (); ++ fprintf (stderr, ++ "\nError reading file in dialog_textbox().\n"); ++ exit (-1); ++ } ++ buf[bytes_read] = '\0'; ++ } ++ page = buf; ++ print_page (text, height - 4, width - 2); ++ print_position (dialog, height, width); ++ wmove (dialog, cur_y, cur_x); /* Restore cursor position */ ++ wrefresh (dialog); ++ } ++ break; ++ case 'G': /* Last page */ ++ case KEY_END: ++ ++ end_reached = 1; ++ /* Last page not in buffer? */ ++ if ((fpos = lseek (fd, 0, SEEK_CUR)) == -1) { ++ endwin (); ++ fprintf (stderr, ++ "\nError moving file pointer in dialog_textbox().\n"); ++ exit (-1); ++ } ++ if (fpos < file_size) { /* Yes, we have to read it in */ ++ if (lseek (fd, -BUF_SIZE, SEEK_END) == -1) { ++ endwin (); ++ fprintf (stderr, ++ "\nError moving file pointer in dialog_textbox().\n"); ++ exit (-1); ++ } ++ if ((bytes_read = read (fd, buf, BUF_SIZE)) == -1) { ++ endwin (); ++ fprintf (stderr, ++ "\nError reading file in dialog_textbox().\n"); ++ exit (-1); ++ } ++ buf[bytes_read] = '\0'; ++ } ++ page = buf + bytes_read; ++ back_lines (height - 4); ++ print_page (text, height - 4, width - 2); ++ print_position (dialog, height, width); ++ wmove (dialog, cur_y, cur_x); /* Restore cursor position */ ++ wrefresh (dialog); ++ break; ++ case 'K': /* Previous line */ ++ case 'k': ++ case KEY_UP: ++ if (!begin_reached) { ++ back_lines (page_length + 1); ++ ++ /* We don't call print_page() here but use scrolling to ensure ++ faster screen update. However, 'end_reached' and ++ 'page_length' should still be updated, and 'page' should ++ point to start of next page. This is done by calling ++ get_line() in the following 'for' loop. */ ++ scrollok (text, TRUE); ++ wscrl (text, -1); /* Scroll text region down one line */ ++ scrollok (text, FALSE); ++ page_length = 0; ++ passed_end = 0; ++ for (i = 0; i < height - 4; i++) { ++ if (!i) { ++ /* print first line of page */ ++ print_line (text, 0, width - 2); ++ wnoutrefresh (text); ++ } else ++ /* Called to update 'end_reached' and 'page' */ ++ get_line (); ++ if (!passed_end) ++ page_length++; ++ if (end_reached && !passed_end) ++ passed_end = 1; ++ } ++ ++ print_position (dialog, height, width); ++ wmove (dialog, cur_y, cur_x); /* Restore cursor position */ ++ wrefresh (dialog); ++ } ++ break; ++ case 'B': /* Previous page */ ++ case 'b': ++ case KEY_PPAGE: ++ if (begin_reached) ++ break; ++ back_lines (page_length + height - 4); ++ print_page (text, height - 4, width - 2); ++ print_position (dialog, height, width); ++ wmove (dialog, cur_y, cur_x); ++ wrefresh (dialog); ++ break; ++ case 'J': /* Next line */ ++ case 'j': ++ case KEY_DOWN: ++ if (!end_reached) { ++ begin_reached = 0; ++ scrollok (text, TRUE); ++ scroll (text); /* Scroll text region up one line */ ++ scrollok (text, FALSE); ++ print_line (text, height - 5, width - 2); ++ wnoutrefresh (text); ++ print_position (dialog, height, width); ++ wmove (dialog, cur_y, cur_x); /* Restore cursor position */ ++ wrefresh (dialog); ++ } ++ break; ++ case KEY_NPAGE: /* Next page */ ++ case ' ': ++ if (end_reached) ++ break; ++ ++ begin_reached = 0; ++ print_page (text, height - 4, width - 2); ++ print_position (dialog, height, width); ++ wmove (dialog, cur_y, cur_x); ++ wrefresh (dialog); ++ break; ++ case '0': /* Beginning of line */ ++ case 'H': /* Scroll left */ ++ case 'h': ++ case KEY_LEFT: ++ if (hscroll <= 0) ++ break; ++ ++ if (key == '0') ++ hscroll = 0; ++ else ++ hscroll--; ++ /* Reprint current page to scroll horizontally */ ++ back_lines (page_length); ++ print_page (text, height - 4, width - 2); ++ wmove (dialog, cur_y, cur_x); ++ wrefresh (dialog); ++ break; ++ case 'L': /* Scroll right */ ++ case 'l': ++ case KEY_RIGHT: ++ if (hscroll >= MAX_LEN) ++ break; ++ hscroll++; ++ /* Reprint current page to scroll horizontally */ ++ back_lines (page_length); ++ print_page (text, height - 4, width - 2); ++ wmove (dialog, cur_y, cur_x); ++ wrefresh (dialog); ++ break; ++ case ESC: ++ break; ++ } ++ } ++ ++ delwin (dialog); ++ free (buf); ++ close (fd); ++ return 1; /* ESC pressed */ ++} ++ ++/* ++ * Go back 'n' lines in text file. Called by dialog_textbox(). ++ * 'page' will be updated to point to the desired line in 'buf'. ++ */ ++static void ++back_lines (int n) ++{ ++ int i, fpos; ++ ++ begin_reached = 0; ++ /* We have to distinguish between end_reached and !end_reached ++ since at end of file, the line is not ended by a '\n'. ++ The code inside 'if' basically does a '--page' to move one ++ character backward so as to skip '\n' of the previous line */ ++ if (!end_reached) { ++ /* Either beginning of buffer or beginning of file reached? */ ++ if (page == buf) { ++ if ((fpos = lseek (fd, 0, SEEK_CUR)) == -1) { ++ endwin (); ++ fprintf (stderr, "\nError moving file pointer in " ++ "back_lines().\n"); ++ exit (-1); ++ } ++ if (fpos > bytes_read) { /* Not beginning of file yet */ ++ /* We've reached beginning of buffer, but not beginning of ++ file yet, so read previous part of file into buffer. ++ Note that we only move backward for BUF_SIZE/2 bytes, ++ but not BUF_SIZE bytes to avoid re-reading again in ++ print_page() later */ ++ /* Really possible to move backward BUF_SIZE/2 bytes? */ ++ if (fpos < BUF_SIZE / 2 + bytes_read) { ++ /* No, move less then */ ++ if (lseek (fd, 0, SEEK_SET) == -1) { ++ endwin (); ++ fprintf (stderr, "\nError moving file pointer in " ++ "back_lines().\n"); ++ exit (-1); ++ } ++ page = buf + fpos - bytes_read; ++ } else { /* Move backward BUF_SIZE/2 bytes */ ++ if (lseek (fd, -(BUF_SIZE / 2 + bytes_read), SEEK_CUR) ++ == -1) { ++ endwin (); ++ fprintf (stderr, "\nError moving file pointer " ++ "in back_lines().\n"); ++ exit (-1); ++ } ++ page = buf + BUF_SIZE / 2; ++ } ++ if ((bytes_read = read (fd, buf, BUF_SIZE)) == -1) { ++ endwin (); ++ fprintf (stderr, "\nError reading file in back_lines().\n"); ++ exit (-1); ++ } ++ buf[bytes_read] = '\0'; ++ } else { /* Beginning of file reached */ ++ begin_reached = 1; ++ return; ++ } ++ } ++ if (*(--page) != '\n') { /* '--page' here */ ++ /* Something's wrong... */ ++ endwin (); ++ fprintf (stderr, "\nInternal error in back_lines().\n"); ++ exit (-1); ++ } ++ } ++ /* Go back 'n' lines */ ++ for (i = 0; i < n; i++) ++ do { ++ if (page == buf) { ++ if ((fpos = lseek (fd, 0, SEEK_CUR)) == -1) { ++ endwin (); ++ fprintf (stderr, ++ "\nError moving file pointer in back_lines().\n"); ++ exit (-1); ++ } ++ if (fpos > bytes_read) { ++ /* Really possible to move backward BUF_SIZE/2 bytes? */ ++ if (fpos < BUF_SIZE / 2 + bytes_read) { ++ /* No, move less then */ ++ if (lseek (fd, 0, SEEK_SET) == -1) { ++ endwin (); ++ fprintf (stderr, "\nError moving file pointer " ++ "in back_lines().\n"); ++ exit (-1); ++ } ++ page = buf + fpos - bytes_read; ++ } else { /* Move backward BUF_SIZE/2 bytes */ ++ if (lseek (fd, -(BUF_SIZE / 2 + bytes_read), ++ SEEK_CUR) == -1) { ++ endwin (); ++ fprintf (stderr, "\nError moving file pointer" ++ " in back_lines().\n"); ++ exit (-1); ++ } ++ page = buf + BUF_SIZE / 2; ++ } ++ if ((bytes_read = read (fd, buf, BUF_SIZE)) == -1) { ++ endwin (); ++ fprintf (stderr, "\nError reading file in " ++ "back_lines().\n"); ++ exit (-1); ++ } ++ buf[bytes_read] = '\0'; ++ } else { /* Beginning of file reached */ ++ begin_reached = 1; ++ return; ++ } ++ } ++ } while (*(--page) != '\n'); ++ page++; ++} ++ ++/* ++ * Print a new page of text. Called by dialog_textbox(). ++ */ ++static void ++print_page (WINDOW * win, int height, int width) ++{ ++ int i, passed_end = 0; ++ ++ page_length = 0; ++ for (i = 0; i < height; i++) { ++ print_line (win, i, width); ++ if (!passed_end) ++ page_length++; ++ if (end_reached && !passed_end) ++ passed_end = 1; ++ } ++ wnoutrefresh (win); ++} ++ ++/* ++ * Print a new line of text. Called by dialog_textbox() and print_page(). ++ */ ++static void ++print_line (WINDOW * win, int row, int width) ++{ ++ int y, x; ++ char *line; ++ ++ line = get_line (); ++ line += MIN (strlen (line), hscroll); /* Scroll horizontally */ ++ wmove (win, row, 0); /* move cursor to correct line */ ++ waddch (win, ' '); ++ waddnstr (win, line, MIN (strlen (line), width - 2)); ++ ++ getyx (win, y, x); ++ /* Clear 'residue' of previous line */ ++#if OLD_NCURSES ++ { ++ int i; ++ for (i = 0; i < width - x; i++) ++ waddch (win, ' '); ++ } ++#else ++ wclrtoeol(win); ++#endif ++} ++ ++/* ++ * Return current line of text. Called by dialog_textbox() and print_line(). ++ * 'page' should point to start of current line before calling, and will be ++ * updated to point to start of next line. ++ */ ++static char * ++get_line (void) ++{ ++ int i = 0, fpos; ++ static char line[MAX_LEN + 1]; ++ ++ end_reached = 0; ++ while (*page != '\n') { ++ if (*page == '\0') { ++ /* Either end of file or end of buffer reached */ ++ if ((fpos = lseek (fd, 0, SEEK_CUR)) == -1) { ++ endwin (); ++ fprintf (stderr, "\nError moving file pointer in " ++ "get_line().\n"); ++ exit (-1); ++ } ++ if (fpos < file_size) { /* Not end of file yet */ ++ /* We've reached end of buffer, but not end of file yet, ++ so read next part of file into buffer */ ++ if ((bytes_read = read (fd, buf, BUF_SIZE)) == -1) { ++ endwin (); ++ fprintf (stderr, "\nError reading file in get_line().\n"); ++ exit (-1); ++ } ++ buf[bytes_read] = '\0'; ++ page = buf; ++ } else { ++ if (!end_reached) ++ end_reached = 1; ++ break; ++ } ++ } else if (i < MAX_LEN) ++ line[i++] = *(page++); ++ else { ++ /* Truncate lines longer than MAX_LEN characters */ ++ if (i == MAX_LEN) ++ line[i++] = '\0'; ++ page++; ++ } ++ } ++ if (i <= MAX_LEN) ++ line[i] = '\0'; ++ if (!end_reached) ++ page++; /* move pass '\n' */ ++ ++ return line; ++} ++ ++/* ++ * Print current position ++ */ ++static void ++print_position (WINDOW * win, int height, int width) ++{ ++ int fpos, percent; ++ ++ if ((fpos = lseek (fd, 0, SEEK_CUR)) == -1) { ++ endwin (); ++ fprintf (stderr, "\nError moving file pointer in print_position().\n"); ++ exit (-1); ++ } ++ wattrset (win, position_indicator_attr); ++ wbkgdset (win, position_indicator_attr & A_COLOR); ++ percent = !file_size ? ++ 100 : ((fpos - bytes_read + page - buf) * 100) / file_size; ++ wmove (win, height - 3, width - 9); ++ wprintw (win, "(%3d%%)", percent); ++} +diff --git a/feeds/luci/libs/luci-lib-nixio/axTLS/config/scripts/config/lxdialog/util.c b/feeds/luci/libs/luci-lib-nixio/axTLS/config/scripts/config/lxdialog/util.c +new file mode 100644 +index 0000000..6f83951 +--- /dev/null ++++ b/feeds/luci/libs/luci-lib-nixio/axTLS/config/scripts/config/lxdialog/util.c +@@ -0,0 +1,375 @@ ++/* ++ * util.c ++ * ++ * ORIGINAL AUTHOR: Savio Lam (lam836@cs.cuhk.hk) ++ * MODIFIED FOR LINUX KERNEL CONFIG BY: William Roadcap (roadcap@cfw.com) ++ * ++ * 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. ++ * ++ * This program is distributed in the hope that it will be useful, ++ * but WITHOUT ANY WARRANTY; without even the implied warranty of ++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++ * GNU General Public License for more details. ++ * ++ * You should have received a copy of the GNU General Public License ++ * along with this program; if not, write to the Free Software ++ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. ++ */ ++ ++#include "dialog.h" ++ ++ ++/* use colors by default? */ ++bool use_colors = 1; ++ ++const char *backtitle = NULL; ++ ++const char *dialog_result; ++ ++/* ++ * Attribute values, default is for mono display ++ */ ++chtype attributes[] = ++{ ++ A_NORMAL, /* screen_attr */ ++ A_NORMAL, /* shadow_attr */ ++ A_NORMAL, /* dialog_attr */ ++ A_BOLD, /* title_attr */ ++ A_NORMAL, /* border_attr */ ++ A_REVERSE, /* button_active_attr */ ++ A_DIM, /* button_inactive_attr */ ++ A_REVERSE, /* button_key_active_attr */ ++ A_BOLD, /* button_key_inactive_attr */ ++ A_REVERSE, /* button_label_active_attr */ ++ A_NORMAL, /* button_label_inactive_attr */ ++ A_NORMAL, /* inputbox_attr */ ++ A_NORMAL, /* inputbox_border_attr */ ++ A_NORMAL, /* searchbox_attr */ ++ A_BOLD, /* searchbox_title_attr */ ++ A_NORMAL, /* searchbox_border_attr */ ++ A_BOLD, /* position_indicator_attr */ ++ A_NORMAL, /* menubox_attr */ ++ A_NORMAL, /* menubox_border_attr */ ++ A_NORMAL, /* item_attr */ ++ A_REVERSE, /* item_selected_attr */ ++ A_BOLD, /* tag_attr */ ++ A_REVERSE, /* tag_selected_attr */ ++ A_BOLD, /* tag_key_attr */ ++ A_REVERSE, /* tag_key_selected_attr */ ++ A_BOLD, /* check_attr */ ++ A_REVERSE, /* check_selected_attr */ ++ A_BOLD, /* uarrow_attr */ ++ A_BOLD /* darrow_attr */ ++}; ++ ++ ++#include "colors.h" ++ ++/* ++ * Table of color values ++ */ ++int color_table[][3] = ++{ ++ {SCREEN_FG, SCREEN_BG, SCREEN_HL}, ++ {SHADOW_FG, SHADOW_BG, SHADOW_HL}, ++ {DIALOG_FG, DIALOG_BG, DIALOG_HL}, ++ {TITLE_FG, TITLE_BG, TITLE_HL}, ++ {BORDER_FG, BORDER_BG, BORDER_HL}, ++ {BUTTON_ACTIVE_FG, BUTTON_ACTIVE_BG, BUTTON_ACTIVE_HL}, ++ {BUTTON_INACTIVE_FG, BUTTON_INACTIVE_BG, BUTTON_INACTIVE_HL}, ++ {BUTTON_KEY_ACTIVE_FG, BUTTON_KEY_ACTIVE_BG, BUTTON_KEY_ACTIVE_HL}, ++ {BUTTON_KEY_INACTIVE_FG, BUTTON_KEY_INACTIVE_BG, BUTTON_KEY_INACTIVE_HL}, ++ {BUTTON_LABEL_ACTIVE_FG, BUTTON_LABEL_ACTIVE_BG, BUTTON_LABEL_ACTIVE_HL}, ++ {BUTTON_LABEL_INACTIVE_FG, BUTTON_LABEL_INACTIVE_BG, ++ BUTTON_LABEL_INACTIVE_HL}, ++ {INPUTBOX_FG, INPUTBOX_BG, INPUTBOX_HL}, ++ {INPUTBOX_BORDER_FG, INPUTBOX_BORDER_BG, INPUTBOX_BORDER_HL}, ++ {SEARCHBOX_FG, SEARCHBOX_BG, SEARCHBOX_HL}, ++ {SEARCHBOX_TITLE_FG, SEARCHBOX_TITLE_BG, SEARCHBOX_TITLE_HL}, ++ {SEARCHBOX_BORDER_FG, SEARCHBOX_BORDER_BG, SEARCHBOX_BORDER_HL}, ++ {POSITION_INDICATOR_FG, POSITION_INDICATOR_BG, POSITION_INDICATOR_HL}, ++ {MENUBOX_FG, MENUBOX_BG, MENUBOX_HL}, ++ {MENUBOX_BORDER_FG, MENUBOX_BORDER_BG, MENUBOX_BORDER_HL}, ++ {ITEM_FG, ITEM_BG, ITEM_HL}, ++ {ITEM_SELECTED_FG, ITEM_SELECTED_BG, ITEM_SELECTED_HL}, ++ {TAG_FG, TAG_BG, TAG_HL}, ++ {TAG_SELECTED_FG, TAG_SELECTED_BG, TAG_SELECTED_HL}, ++ {TAG_KEY_FG, TAG_KEY_BG, TAG_KEY_HL}, ++ {TAG_KEY_SELECTED_FG, TAG_KEY_SELECTED_BG, TAG_KEY_SELECTED_HL}, ++ {CHECK_FG, CHECK_BG, CHECK_HL}, ++ {CHECK_SELECTED_FG, CHECK_SELECTED_BG, CHECK_SELECTED_HL}, ++ {UARROW_FG, UARROW_BG, UARROW_HL}, ++ {DARROW_FG, DARROW_BG, DARROW_HL}, ++}; /* color_table */ ++ ++/* ++ * Set window to attribute 'attr' ++ */ ++void ++attr_clear (WINDOW * win, int height, int width, chtype attr) ++{ ++ int i, j; ++ ++ wattrset (win, attr); ++ for (i = 0; i < height; i++) { ++ wmove (win, i, 0); ++ for (j = 0; j < width; j++) ++ waddch (win, ' '); ++ } ++ touchwin (win); ++} ++ ++void dialog_clear (void) ++{ ++ attr_clear (stdscr, LINES, COLS, screen_attr); ++ /* Display background title if it exists ... - SLH */ ++ if (backtitle != NULL) { ++ int i; ++ ++ wattrset (stdscr, screen_attr); ++ mvwaddstr (stdscr, 0, 1, (char *)backtitle); ++ wmove (stdscr, 1, 1); ++ for (i = 1; i < COLS - 1; i++) ++ waddch (stdscr, ACS_HLINE); ++ } ++ wnoutrefresh (stdscr); ++} ++ ++/* ++ * Do some initialization for dialog ++ */ ++void ++init_dialog (void) ++{ ++ initscr (); /* Init curses */ ++ keypad (stdscr, TRUE); ++ cbreak (); ++ noecho (); ++ ++ ++ if (use_colors) /* Set up colors */ ++ color_setup (); ++ ++ ++ dialog_clear (); ++} ++ ++/* ++ * Setup for color display ++ */ ++void ++color_setup (void) ++{ ++ int i; ++ ++ if (has_colors ()) { /* Terminal supports color? */ ++ start_color (); ++ ++ /* Initialize color pairs */ ++ for (i = 0; i < ATTRIBUTE_COUNT; i++) ++ init_pair (i + 1, color_table[i][0], color_table[i][1]); ++ ++ /* Setup color attributes */ ++ for (i = 0; i < ATTRIBUTE_COUNT; i++) ++ attributes[i] = C_ATTR (color_table[i][2], i + 1); ++ } ++} ++ ++/* ++ * End using dialog functions. ++ */ ++void ++end_dialog (void) ++{ ++ endwin (); ++} ++ ++ ++/* ++ * Print a string of text in a window, automatically wrap around to the ++ * next line if the string is too long to fit on one line. Newline ++ * characters '\n' are replaced by spaces. We start on a new line ++ * if there is no room for at least 4 nonblanks following a double-space. ++ */ ++void ++print_autowrap (WINDOW * win, const char *prompt, int width, int y, int x) ++{ ++ int newl, cur_x, cur_y; ++ int i, prompt_len, room, wlen; ++ char tempstr[MAX_LEN + 1], *word, *sp, *sp2; ++ ++ strcpy (tempstr, prompt); ++ ++ prompt_len = strlen(tempstr); ++ ++ /* ++ * Remove newlines ++ */ ++ for(i=0; i room || ++ (newl && wlen < 4 && sp && wlen+1+strlen(sp) > room ++ && (!(sp2 = index(sp, ' ')) || wlen+1+(sp2-sp) > room))) { ++ cur_y++; ++ cur_x = x; ++ } ++ wmove (win, cur_y, cur_x); ++ waddstr (win, word); ++ getyx (win, cur_y, cur_x); ++ cur_x++; ++ if (sp && *sp == ' ') { ++ cur_x++; /* double space */ ++ while (*++sp == ' '); ++ newl = 1; ++ } else ++ newl = 0; ++ word = sp; ++ } ++ } ++} ++ ++/* ++ * Print a button ++ */ ++void ++print_button (WINDOW * win, const char *label, int y, int x, int selected) ++{ ++ int i, temp; ++ ++ wmove (win, y, x); ++ wattrset (win, selected ? button_active_attr : button_inactive_attr); ++ waddstr (win, "<"); ++ temp = strspn (label, " "); ++ label += temp; ++ wattrset (win, selected ? button_label_active_attr ++ : button_label_inactive_attr); ++ for (i = 0; i < temp; i++) ++ waddch (win, ' '); ++ wattrset (win, selected ? button_key_active_attr ++ : button_key_inactive_attr); ++ waddch (win, label[0]); ++ wattrset (win, selected ? button_label_active_attr ++ : button_label_inactive_attr); ++ waddstr (win, (char *)label + 1); ++ wattrset (win, selected ? button_active_attr : button_inactive_attr); ++ waddstr (win, ">"); ++ wmove (win, y, x + temp + 1); ++} ++ ++/* ++ * Draw a rectangular box with line drawing characters ++ */ ++void ++draw_box (WINDOW * win, int y, int x, int height, int width, ++ chtype box, chtype border) ++{ ++ int i, j; ++ ++ wattrset (win, 0); ++ for (i = 0; i < height; i++) { ++ wmove (win, y + i, x); ++ for (j = 0; j < width; j++) ++ if (!i && !j) ++ waddch (win, border | ACS_ULCORNER); ++ else if (i == height - 1 && !j) ++ waddch (win, border | ACS_LLCORNER); ++ else if (!i && j == width - 1) ++ waddch (win, box | ACS_URCORNER); ++ else if (i == height - 1 && j == width - 1) ++ waddch (win, box | ACS_LRCORNER); ++ else if (!i) ++ waddch (win, border | ACS_HLINE); ++ else if (i == height - 1) ++ waddch (win, box | ACS_HLINE); ++ else if (!j) ++ waddch (win, border | ACS_VLINE); ++ else if (j == width - 1) ++ waddch (win, box | ACS_VLINE); ++ else ++ waddch (win, box | ' '); ++ } ++} ++ ++/* ++ * Draw shadows along the right and bottom edge to give a more 3D look ++ * to the boxes ++ */ ++void ++draw_shadow (WINDOW * win, int y, int x, int height, int width) ++{ ++ int i; ++ ++ if (has_colors ()) { /* Whether terminal supports color? */ ++ wattrset (win, shadow_attr); ++ wmove (win, y + height, x + 2); ++ for (i = 0; i < width; i++) ++ waddch (win, winch (win) & A_CHARTEXT); ++ for (i = y + 1; i < y + height + 1; i++) { ++ wmove (win, i, x + width); ++ waddch (win, winch (win) & A_CHARTEXT); ++ waddch (win, winch (win) & A_CHARTEXT); ++ } ++ wnoutrefresh (win); ++ } ++} ++ ++/* ++ * Return the position of the first alphabetic character in a string. ++ */ ++int ++first_alpha(const char *string, const char *exempt) ++{ ++ int i, in_paren=0, c; ++ ++ for (i = 0; i < strlen(string); i++) { ++ c = tolower(string[i]); ++ ++ if (strchr("<[(", c)) ++in_paren; ++ if (strchr(">])", c) && in_paren > 0) --in_paren; ++ ++ if ((! in_paren) && isalpha(c) && ++ strchr(exempt, c) == 0) ++ return i; ++ } ++ ++ return 0; ++} ++ ++/* ++ * Get the first selected item in the dialog_list_item list. ++ */ ++struct dialog_list_item * ++first_sel_item(int item_no, struct dialog_list_item ** items) ++{ ++ int i; ++ ++ for (i = 0; i < item_no; i++) { ++ if (items[i]->selected) ++ return items[i]; ++ } ++ ++ return NULL; ++} +diff --git a/feeds/luci/libs/luci-lib-nixio/axTLS/config/scripts/config/lxdialog/yesno.c b/feeds/luci/libs/luci-lib-nixio/axTLS/config/scripts/config/lxdialog/yesno.c +new file mode 100644 +index 0000000..11fcc25 +--- /dev/null ++++ b/feeds/luci/libs/luci-lib-nixio/axTLS/config/scripts/config/lxdialog/yesno.c +@@ -0,0 +1,118 @@ ++/* ++ * yesno.c -- implements the yes/no box ++ * ++ * ORIGINAL AUTHOR: Savio Lam (lam836@cs.cuhk.hk) ++ * MODIFIED FOR LINUX KERNEL CONFIG BY: William Roadcap (roadcap@cfw.com) ++ * ++ * 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. ++ * ++ * This program is distributed in the hope that it will be useful, ++ * but WITHOUT ANY WARRANTY; without even the implied warranty of ++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++ * GNU General Public License for more details. ++ * ++ * You should have received a copy of the GNU General Public License ++ * along with this program; if not, write to the Free Software ++ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. ++ */ ++ ++#include "dialog.h" ++ ++/* ++ * Display termination buttons ++ */ ++static void ++print_buttons(WINDOW *dialog, int height, int width, int selected) ++{ ++ int x = width / 2 - 10; ++ int y = height - 2; ++ ++ print_button (dialog, " Yes ", y, x, selected == 0); ++ print_button (dialog, " No ", y, x + 13, selected == 1); ++ ++ wmove(dialog, y, x+1 + 13*selected ); ++ wrefresh (dialog); ++} ++ ++/* ++ * Display a dialog box with two buttons - Yes and No ++ */ ++int ++dialog_yesno (const char *title, const char *prompt, int height, int width) ++{ ++ int i, x, y, key = 0, button = 0; ++ WINDOW *dialog; ++ ++ /* center dialog box on screen */ ++ x = (COLS - width) / 2; ++ y = (LINES - height) / 2; ++ ++ draw_shadow (stdscr, y, x, height, width); ++ ++ dialog = newwin (height, width, y, x); ++ keypad (dialog, TRUE); ++ ++ draw_box (dialog, 0, 0, height, width, dialog_attr, border_attr); ++ wattrset (dialog, border_attr); ++ mvwaddch (dialog, height-3, 0, ACS_LTEE); ++ for (i = 0; i < width - 2; i++) ++ waddch (dialog, ACS_HLINE); ++ wattrset (dialog, dialog_attr); ++ waddch (dialog, ACS_RTEE); ++ ++ if (title != NULL && strlen(title) >= width-2 ) { ++ /* truncate long title -- mec */ ++ char * title2 = malloc(width-2+1); ++ memcpy( title2, title, width-2 ); ++ title2[width-2] = '\0'; ++ title = title2; ++ } ++ ++ if (title != NULL) { ++ wattrset (dialog, title_attr); ++ mvwaddch (dialog, 0, (width - strlen(title))/2 - 1, ' '); ++ waddstr (dialog, (char *)title); ++ waddch (dialog, ' '); ++ } ++ ++ wattrset (dialog, dialog_attr); ++ print_autowrap (dialog, prompt, width - 2, 1, 3); ++ ++ print_buttons(dialog, height, width, 0); ++ ++ while (key != ESC) { ++ key = wgetch (dialog); ++ switch (key) { ++ case 'Y': ++ case 'y': ++ delwin (dialog); ++ return 0; ++ case 'N': ++ case 'n': ++ delwin (dialog); ++ return 1; ++ ++ case TAB: ++ case KEY_LEFT: ++ case KEY_RIGHT: ++ button = ((key == KEY_LEFT ? --button : ++button) < 0) ++ ? 1 : (button > 1 ? 0 : button); ++ ++ print_buttons(dialog, height, width, button); ++ wrefresh (dialog); ++ break; ++ case ' ': ++ case '\n': ++ delwin (dialog); ++ return button; ++ case ESC: ++ break; ++ } ++ } ++ ++ delwin (dialog); ++ return -1; /* ESC pressed */ ++} +diff --git a/feeds/luci/libs/luci-lib-nixio/axTLS/config/scripts/config/mconf.c b/feeds/luci/libs/luci-lib-nixio/axTLS/config/scripts/config/mconf.c +new file mode 100644 +index 0000000..406eb29 +--- /dev/null ++++ b/feeds/luci/libs/luci-lib-nixio/axTLS/config/scripts/config/mconf.c +@@ -0,0 +1,977 @@ ++/* ++ * Copyright (C) 2002 Roman Zippel ++ * Released under the terms of the GNU GPL v2.0. ++ * ++ * Introduced single menu mode (show all sub-menus in one large tree). ++ * 2002-11-06 Petr Baudis ++ * ++ * Directly use liblxdialog library routines. ++ * 2002-11-14 Petr Baudis ++ */ ++ ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++ ++#include "lxdialog/dialog.h" ++ ++#define LKC_DIRECT_LINK ++#include "lkc.h" ++ ++static char menu_backtitle[128]; ++static const char mconf_readme[] = ++"Overview\n" ++"--------\n" ++"Some features may be built directly into axTLS. Some features\n" ++"may be completely removed altogether. There are also certain\n" ++"parameters which are not really features, but must be\n" ++"entered in as decimal or hexadecimal numbers or possibly text.\n" ++"\n" ++"Menu items beginning with [*] or [ ] represent features\n" ++"configured to be built in or removed respectively.\n" ++"\n" ++"To change any of these features, highlight it with the cursor\n" ++"keys and press to build it in or to removed it.\n" ++"You may also press the to cycle\n" ++"through the available options (ie. Y->N->Y).\n" ++"\n" ++"Some additional keyboard hints:\n" ++"\n" ++"Menus\n" ++"----------\n" ++"o Use the Up/Down arrow keys (cursor keys) to highlight the item\n" ++" you wish to change or submenu wish to select and press .\n" ++" Submenus are designated by \"--->\".\n" ++"\n" ++" Shortcut: Press the option's highlighted letter (hotkey).\n" ++" Pressing a hotkey more than once will sequence\n" ++" through all visible items which use that hotkey.\n" ++"\n" ++" You may also use the and keys to scroll\n" ++" unseen options into view.\n" ++"\n" ++"o To exit a menu use the cursor keys to highlight the button\n" ++" and press .\n" ++"\n" ++" Shortcut: Press or or if there is no hotkey\n" ++" using those letters. You may press a single , but\n" ++" there is a delayed response which you may find annoying.\n" ++"\n" ++" Also, the and cursor keys will cycle between and\n" ++" \n" ++"\n" ++"\n" ++"Data Entry\n" ++"-----------\n" ++"o Enter the requested information and press \n" ++" If you are entering hexadecimal values, it is not necessary to\n" ++" add the '0x' prefix to the entry.\n" ++"\n" ++"o For help, use the or cursor keys to highlight the help option\n" ++" and press . You can try as well.\n" ++"\n" ++"\n" ++"Text Box (Help Window)\n" ++"--------\n" ++"o Use the cursor keys to scroll up/down/left/right. The VI editor\n" ++" keys h,j,k,l function here as do and for those\n" ++" who are familiar with less and lynx.\n" ++"\n" ++"o Press , , or to exit.\n" ++"\n" ++"\n" ++"Alternate Configuration Files\n" ++"-----------------------------\n" ++"Menuconfig supports the use of alternate configuration files for\n" ++"those who, for various reasons, find it necessary to switch\n" ++"between different configurations.\n" ++"\n" ++"At the end of the main menu you will find two options. One is\n" ++"for saving the current configuration to a file of your choosing.\n" ++"The other option is for loading a previously saved alternate\n" ++"configuration.\n" ++"\n" ++"Even if you don't use alternate configuration files, but you\n" ++"find during a Menuconfig session that you have completely messed\n" ++"up your settings, you may use the \"Load Alternate...\" option to\n" ++"restore your previously saved settings from \".config\" without\n" ++"restarting Menuconfig.\n" ++"\n" ++"Other information\n" ++"-----------------\n" ++"If you use Menuconfig in an XTERM window make sure you have your\n" ++"$TERM variable set to point to a xterm definition which supports color.\n" ++"Otherwise, Menuconfig will look rather bad. Menuconfig will not\n" ++"display correctly in a RXVT window because rxvt displays only one\n" ++"intensity of color, bright.\n" ++"\n" ++"Menuconfig will display larger menus on screens or xterms which are\n" ++"set to display more than the standard 25 row by 80 column geometry.\n" ++"In order for this to work, the \"stty size\" command must be able to\n" ++"display the screen's current row and column geometry. I STRONGLY\n" ++"RECOMMEND that you make sure you do NOT have the shell variables\n" ++"LINES and COLUMNS exported into your environment. Some distributions\n" ++"export those variables via /etc/profile. Some ncurses programs can\n" ++"become confused when those variables (LINES & COLUMNS) don't reflect\n" ++"the true screen size.\n" ++"\n" ++"Optional personality available\n" ++"------------------------------\n" ++"If you prefer to have all of the options listed in a single\n" ++"menu, rather than the default multimenu hierarchy, run the menuconfig\n" ++"with MENUCONFIG_MODE environment variable set to single_menu. Example:\n" ++"\n" ++"make MENUCONFIG_MODE=single_menu menuconfig\n" ++"\n" ++" will then unroll the appropriate category, or enfold it if it\n" ++"is already unrolled.\n" ++"\n" ++"Note that this mode can eventually be a little more CPU expensive\n" ++"(especially with a larger number of unrolled categories) than the\n" ++"default mode.\n", ++menu_instructions[] = ++ "Arrow keys navigate the menu. " ++ " selects submenus --->. " ++ "Highlighted letters are hotkeys. " ++ "Pressing selectes a feature, while will exclude a feature. " ++ "Press to exit, for Help, for Search. " ++ "Legend: [*] feature is selected [ ] feature is excluded", ++radiolist_instructions[] = ++ "Use the arrow keys to navigate this window or " ++ "press the hotkey of the item you wish to select " ++ "followed by the . " ++ "Press for additional information about this option.", ++inputbox_instructions_int[] = ++ "Please enter a decimal value. " ++ "Fractions will not be accepted. " ++ "Use the key to move from the input field to the buttons below it.", ++inputbox_instructions_hex[] = ++ "Please enter a hexadecimal value. " ++ "Use the key to move from the input field to the buttons below it.", ++inputbox_instructions_string[] = ++ "Please enter a string value. " ++ "Use the key to move from the input field to the buttons below it.", ++setmod_text[] = ++ "This feature depends on another which has been configured as a module.\n" ++ "As a result, this feature will be built as a module.", ++nohelp_text[] = ++ "There is no help available for this option.\n", ++load_config_text[] = ++ "Enter the name of the configuration file you wish to load. " ++ "Accept the name shown to restore the configuration you " ++ "last retrieved. Leave blank to abort.", ++load_config_help[] = ++ "\n" ++ "For various reasons, one may wish to keep several different axTLS\n" ++ "configurations available on a single machine.\n" ++ "\n" ++ "If you have saved a previous configuration in a file other than the\n" ++ "axTLS's default, entering the name of the file here will allow you\n" ++ "to modify that configuration.\n" ++ "\n" ++ "If you are uncertain, then you have probably never used alternate\n" ++ "configuration files. You should therefor leave this blank to abort.\n", ++save_config_text[] = ++ "Enter a filename to which this configuration should be saved " ++ "as an alternate. Leave blank to abort.", ++save_config_help[] = ++ "\n" ++ "For various reasons, one may wish to keep different axTLS\n" ++ "configurations available on a single machine.\n" ++ "\n" ++ "Entering a file name here will allow you to later retrieve, modify\n" ++ "and use the current configuration as an alternate to whatever\n" ++ "configuration options you have selected at that time.\n" ++ "\n" ++ "If you are uncertain what all this means then you should probably\n" ++ "leave this blank.\n", ++search_help[] = ++ "\n" ++ "Search for CONFIG_ symbols and display their relations.\n" ++ "Example: search for \"^FOO\"\n" ++ "Result:\n" ++ "-----------------------------------------------------------------\n" ++ "Symbol: FOO [=m]\n" ++ "Prompt: Foo bus is used to drive the bar HW\n" ++ "Defined at drivers/pci/Kconfig:47\n" ++ "Depends on: X86_LOCAL_APIC && X86_IO_APIC || IA64\n" ++ "Location:\n" ++ " -> Bus options (PCI, PCMCIA, EISA, MCA, ISA)\n" ++ " -> PCI support (PCI [=y])\n" ++ " -> PCI access mode ( [=y])\n" ++ "Selects: LIBCRC32\n" ++ "Selected by: BAR\n" ++ "-----------------------------------------------------------------\n" ++ "o The line 'Prompt:' shows the text used in the menu structure for\n" ++ " this CONFIG_ symbol\n" ++ "o The 'Defined at' line tell at what file / line number the symbol\n" ++ " is defined\n" ++ "o The 'Depends on:' line tell what symbols needs to be defined for\n" ++ " this symbol to be visible in the menu (selectable)\n" ++ "o The 'Location:' lines tell where in the menu structure this symbol\n" ++ " is located\n" ++ " A location followed by a [=y] indicate that this is a selectable\n" ++ " menu item - and current value is displayed inside brackets.\n" ++ "o The 'Selects:' line tell what symbol will be automatically\n" ++ " selected if this symbol is selected (y or m)\n" ++ "o The 'Selected by' line tell what symbol has selected this symbol\n" ++ "\n" ++ "Only relevant lines are shown.\n" ++ "\n\n" ++ "Search examples:\n" ++ "Examples: USB => find all CONFIG_ symbols containing USB\n" ++ " ^USB => find all CONFIG_ symbols starting with USB\n" ++ " USB$ => find all CONFIG_ symbols ending with USB\n" ++ "\n"; ++ ++static char filename[PATH_MAX+1] = ".config"; ++static int indent; ++static struct termios ios_org; ++static int rows = 0, cols = 0; ++static struct menu *current_menu; ++static int child_count; ++static int single_menu_mode; ++ ++static struct dialog_list_item *items[16384]; /* FIXME: This ought to be dynamic. */ ++static int item_no; ++ ++static void conf(struct menu *menu); ++static void conf_choice(struct menu *menu); ++static void conf_string(struct menu *menu); ++static void conf_load(void); ++static void conf_save(void); ++static void show_textbox(const char *title, const char *text, int r, int c); ++static void show_helptext(const char *title, const char *text); ++static void show_help(struct menu *menu); ++static void show_file(const char *filename, const char *title, int r, int c); ++ ++static void init_wsize(void) ++{ ++ struct winsize ws; ++ char *env; ++ ++ if (!ioctl(STDIN_FILENO, TIOCGWINSZ, &ws)) { ++ rows = ws.ws_row; ++ cols = ws.ws_col; ++ } ++ ++ if (!rows) { ++ env = getenv("LINES"); ++ if (env) ++ rows = atoi(env); ++ if (!rows) ++ rows = 24; ++ } ++ if (!cols) { ++ env = getenv("COLUMNS"); ++ if (env) ++ cols = atoi(env); ++ if (!cols) ++ cols = 80; ++ } ++ ++ if (rows < 19 || cols < 80) { ++ fprintf(stderr, "Your display is too small to run Menuconfig!\n"); ++ fprintf(stderr, "It must be at least 19 lines by 80 columns.\n"); ++ exit(1); ++ } ++ ++ rows -= 4; ++ cols -= 5; ++} ++ ++static void cinit(void) ++{ ++ item_no = 0; ++} ++ ++static void cmake(void) ++{ ++ items[item_no] = malloc(sizeof(struct dialog_list_item)); ++ memset(items[item_no], 0, sizeof(struct dialog_list_item)); ++ items[item_no]->tag = malloc(32); items[item_no]->tag[0] = 0; ++ items[item_no]->name = malloc(512); items[item_no]->name[0] = 0; ++ items[item_no]->namelen = 0; ++ item_no++; ++} ++ ++static int cprint_name(const char *fmt, ...) ++{ ++ va_list ap; ++ int res; ++ ++ if (!item_no) ++ cmake(); ++ va_start(ap, fmt); ++ res = vsnprintf(items[item_no - 1]->name + items[item_no - 1]->namelen, ++ 512 - items[item_no - 1]->namelen, fmt, ap); ++ if (res > 0) ++ items[item_no - 1]->namelen += res; ++ va_end(ap); ++ ++ return res; ++} ++ ++static int cprint_tag(const char *fmt, ...) ++{ ++ va_list ap; ++ int res; ++ ++ if (!item_no) ++ cmake(); ++ va_start(ap, fmt); ++ res = vsnprintf(items[item_no - 1]->tag, 32, fmt, ap); ++ va_end(ap); ++ ++ return res; ++} ++ ++static void cdone(void) ++{ ++ int i; ++ ++ for (i = 0; i < item_no; i++) { ++ free(items[i]->tag); ++ free(items[i]->name); ++ free(items[i]); ++ } ++ ++ item_no = 0; ++} ++ ++static void get_prompt_str(struct gstr *r, struct property *prop) ++{ ++ int i, j; ++ struct menu *submenu[8], *menu; ++ ++ str_printf(r, "Prompt: %s\n", prop->text); ++ str_printf(r, " Defined at %s:%d\n", prop->menu->file->name, ++ prop->menu->lineno); ++ if (!expr_is_yes(prop->visible.expr)) { ++ str_append(r, " Depends on: "); ++ expr_gstr_print(prop->visible.expr, r); ++ str_append(r, "\n"); ++ } ++ menu = prop->menu->parent; ++ for (i = 0; menu != &rootmenu && i < 8; menu = menu->parent) ++ submenu[i++] = menu; ++ if (i > 0) { ++ str_printf(r, " Location:\n"); ++ for (j = 4; --i >= 0; j += 2) { ++ menu = submenu[i]; ++ str_printf(r, "%*c-> %s", j, ' ', menu_get_prompt(menu)); ++ if (menu->sym) { ++ str_printf(r, " (%s [=%s])", menu->sym->name ? ++ menu->sym->name : "", ++ sym_get_string_value(menu->sym)); ++ } ++ str_append(r, "\n"); ++ } ++ } ++} ++ ++static void get_symbol_str(struct gstr *r, struct symbol *sym) ++{ ++ bool hit; ++ struct property *prop; ++ ++ str_printf(r, "Symbol: %s [=%s]\n", sym->name, ++ sym_get_string_value(sym)); ++ for_all_prompts(sym, prop) ++ get_prompt_str(r, prop); ++ hit = false; ++ for_all_properties(sym, prop, P_SELECT) { ++ if (!hit) { ++ str_append(r, " Selects: "); ++ hit = true; ++ } else ++ str_printf(r, " && "); ++ expr_gstr_print(prop->expr, r); ++ } ++ if (hit) ++ str_append(r, "\n"); ++ if (sym->rev_dep.expr) { ++ str_append(r, " Selected by: "); ++ expr_gstr_print(sym->rev_dep.expr, r); ++ str_append(r, "\n"); ++ } ++ str_append(r, "\n\n"); ++} ++ ++static struct gstr get_relations_str(struct symbol **sym_arr) ++{ ++ struct symbol *sym; ++ struct gstr res = str_new(); ++ int i; ++ ++ for (i = 0; sym_arr && (sym = sym_arr[i]); i++) ++ get_symbol_str(&res, sym); ++ if (!i) ++ str_append(&res, "No matches found.\n"); ++ return res; ++} ++ ++static void search_conf(void) ++{ ++ struct symbol **sym_arr; ++ struct gstr res; ++ ++again: ++ switch (dialog_inputbox("Search Configuration Parameter", ++ "Enter Keyword", 10, 75, ++ NULL)) { ++ case 0: ++ break; ++ case 1: ++ show_helptext("Search Configuration", search_help); ++ goto again; ++ default: ++ return; ++ } ++ ++ sym_arr = sym_re_search(dialog_input_result); ++ res = get_relations_str(sym_arr); ++ free(sym_arr); ++ show_textbox("Search Results", str_get(&res), 0, 0); ++ str_free(&res); ++} ++ ++static void build_conf(struct menu *menu) ++{ ++ struct symbol *sym; ++ struct property *prop; ++ struct menu *child; ++ int type, tmp, doint = 2; ++ tristate val; ++ char ch; ++ ++ if (!menu_is_visible(menu)) ++ return; ++ ++ sym = menu->sym; ++ prop = menu->prompt; ++ if (!sym) { ++ if (prop && menu != current_menu) { ++ const char *prompt = menu_get_prompt(menu); ++ switch (prop->type) { ++ case P_MENU: ++ child_count++; ++ cmake(); ++ cprint_tag("m%p", menu); ++ ++ if (single_menu_mode) { ++ cprint_name("%s%*c%s", ++ menu->data ? "-->" : "++>", ++ indent + 1, ' ', prompt); ++ } else { ++ cprint_name(" %*c%s --->", indent + 1, ' ', prompt); ++ } ++ ++ if (single_menu_mode && menu->data) ++ goto conf_childs; ++ return; ++ default: ++ if (prompt) { ++ child_count++; ++ cmake(); ++ cprint_tag(":%p", menu); ++ cprint_name("---%*c%s", indent + 1, ' ', prompt); ++ } ++ } ++ } else ++ doint = 0; ++ goto conf_childs; ++ } ++ ++ cmake(); ++ type = sym_get_type(sym); ++ if (sym_is_choice(sym)) { ++ struct symbol *def_sym = sym_get_choice_value(sym); ++ struct menu *def_menu = NULL; ++ ++ child_count++; ++ for (child = menu->list; child; child = child->next) { ++ if (menu_is_visible(child) && child->sym == def_sym) ++ def_menu = child; ++ } ++ ++ val = sym_get_tristate_value(sym); ++ if (sym_is_changable(sym)) { ++ cprint_tag("t%p", menu); ++ switch (type) { ++ case S_BOOLEAN: ++ cprint_name("[%c]", val == no ? ' ' : '*'); ++ break; ++ case S_TRISTATE: ++ switch (val) { ++ case yes: ch = '*'; break; ++ case mod: ch = 'M'; break; ++ default: ch = ' '; break; ++ } ++ cprint_name("<%c>", ch); ++ break; ++ } ++ } else { ++ cprint_tag("%c%p", def_menu ? 't' : ':', menu); ++ cprint_name(" "); ++ } ++ ++ cprint_name("%*c%s", indent + 1, ' ', menu_get_prompt(menu)); ++ if (val == yes) { ++ if (def_menu) { ++ cprint_name(" (%s)", menu_get_prompt(def_menu)); ++ cprint_name(" --->"); ++ if (def_menu->list) { ++ indent += 2; ++ build_conf(def_menu); ++ indent -= 2; ++ } ++ } ++ return; ++ } ++ } else { ++ if (menu == current_menu) { ++ cprint_tag(":%p", menu); ++ cprint_name("---%*c%s", indent + 1, ' ', menu_get_prompt(menu)); ++ goto conf_childs; ++ } ++ child_count++; ++ val = sym_get_tristate_value(sym); ++ if (sym_is_choice_value(sym) && val == yes) { ++ cprint_tag(":%p", menu); ++ cprint_name(" "); ++ } else { ++ switch (type) { ++ case S_BOOLEAN: ++ cprint_tag("t%p", menu); ++ if (sym_is_changable(sym)) ++ cprint_name("[%c]", val == no ? ' ' : '*'); ++ else ++ cprint_name("---"); ++ break; ++ case S_TRISTATE: ++ cprint_tag("t%p", menu); ++ switch (val) { ++ case yes: ch = '*'; break; ++ case mod: ch = 'M'; break; ++ default: ch = ' '; break; ++ } ++ if (sym_is_changable(sym)) ++ cprint_name("<%c>", ch); ++ else ++ cprint_name("---"); ++ break; ++ default: ++ cprint_tag("s%p", menu); ++ tmp = cprint_name("(%s)", sym_get_string_value(sym)); ++ tmp = indent - tmp + 4; ++ if (tmp < 0) ++ tmp = 0; ++ cprint_name("%*c%s%s", tmp, ' ', menu_get_prompt(menu), ++ (sym_has_value(sym) || !sym_is_changable(sym)) ? ++ "" : " (NEW)"); ++ goto conf_childs; ++ } ++ } ++ cprint_name("%*c%s%s", indent + 1, ' ', menu_get_prompt(menu), ++ (sym_has_value(sym) || !sym_is_changable(sym)) ? ++ "" : " (NEW)"); ++ if (menu->prompt->type == P_MENU) { ++ cprint_name(" --->"); ++ return; ++ } ++ } ++ ++conf_childs: ++ indent += doint; ++ for (child = menu->list; child; child = child->next) ++ build_conf(child); ++ indent -= doint; ++} ++ ++static void conf(struct menu *menu) ++{ ++ struct dialog_list_item *active_item = NULL; ++ struct menu *submenu; ++ const char *prompt = menu_get_prompt(menu); ++ struct symbol *sym; ++ char active_entry[40]; ++ int stat, type; ++ ++ unlink("lxdialog.scrltmp"); ++ active_entry[0] = 0; ++ while (1) { ++ indent = 0; ++ child_count = 0; ++ current_menu = menu; ++ cdone(); cinit(); ++ build_conf(menu); ++ if (!child_count) ++ break; ++ if (menu == &rootmenu) { ++ cmake(); cprint_tag(":"); cprint_name("--- "); ++ cmake(); cprint_tag("L"); cprint_name("Load an Alternate Configuration File"); ++ cmake(); cprint_tag("S"); cprint_name("Save Configuration to an Alternate File"); ++ } ++ dialog_clear(); ++ stat = dialog_menu(prompt ? prompt : "Main Menu", ++ menu_instructions, rows, cols, rows - 10, ++ active_entry, item_no, items); ++ if (stat < 0) ++ return; ++ ++ if (stat == 1 || stat == 255) ++ break; ++ ++ active_item = first_sel_item(item_no, items); ++ if (!active_item) ++ continue; ++ active_item->selected = 0; ++ strncpy(active_entry, active_item->tag, sizeof(active_entry)); ++ active_entry[sizeof(active_entry)-1] = 0; ++ type = active_entry[0]; ++ if (!type) ++ continue; ++ ++ sym = NULL; ++ submenu = NULL; ++ if (sscanf(active_entry + 1, "%p", &submenu) == 1) ++ sym = submenu->sym; ++ ++ switch (stat) { ++ case 0: ++ switch (type) { ++ case 'm': ++ if (single_menu_mode) ++ submenu->data = (void *) (long) !submenu->data; ++ else ++ conf(submenu); ++ break; ++ case 't': ++ if (sym_is_choice(sym) && sym_get_tristate_value(sym) == yes) ++ conf_choice(submenu); ++ else if (submenu->prompt->type == P_MENU) ++ conf(submenu); ++ break; ++ case 's': ++ conf_string(submenu); ++ break; ++ case 'L': ++ conf_load(); ++ break; ++ case 'S': ++ conf_save(); ++ break; ++ } ++ break; ++ case 2: ++ if (sym) ++ show_help(submenu); ++ else ++ show_helptext("README", mconf_readme); ++ break; ++ case 3: ++ if (type == 't') { ++ if (sym_set_tristate_value(sym, yes)) ++ break; ++ if (sym_set_tristate_value(sym, mod)) ++ show_textbox(NULL, setmod_text, 6, 74); ++ } ++ break; ++ case 4: ++ if (type == 't') ++ sym_set_tristate_value(sym, no); ++ break; ++ case 5: ++ if (type == 't') ++ sym_set_tristate_value(sym, mod); ++ break; ++ case 6: ++ if (type == 't') ++ sym_toggle_tristate_value(sym); ++ else if (type == 'm') ++ conf(submenu); ++ break; ++ case 7: ++ search_conf(); ++ break; ++ } ++ } ++} ++ ++static void show_textbox(const char *title, const char *text, int r, int c) ++{ ++ int fd; ++ ++ fd = creat(".help.tmp", 0777); ++ write(fd, text, strlen(text)); ++ close(fd); ++ show_file(".help.tmp", title, r, c); ++ unlink(".help.tmp"); ++} ++ ++static void show_helptext(const char *title, const char *text) ++{ ++ show_textbox(title, text, 0, 0); ++} ++ ++static void show_help(struct menu *menu) ++{ ++ struct gstr help = str_new(); ++ struct symbol *sym = menu->sym; ++ ++ if (sym->help) ++ { ++ if (sym->name) { ++ str_printf(&help, "%s:\n\n", sym->name); ++ str_append(&help, sym->help); ++ str_append(&help, "\n"); ++ } ++ } else { ++ str_append(&help, nohelp_text); ++ } ++ get_symbol_str(&help, sym); ++ show_helptext(menu_get_prompt(menu), str_get(&help)); ++ str_free(&help); ++} ++ ++static void show_file(const char *filename, const char *title, int r, int c) ++{ ++ while (dialog_textbox(title, filename, r ? r : rows, c ? c : cols) < 0) ++ ; ++} ++ ++static void conf_choice(struct menu *menu) ++{ ++ const char *prompt = menu_get_prompt(menu); ++ struct menu *child; ++ struct symbol *active; ++ ++ active = sym_get_choice_value(menu->sym); ++ while (1) { ++ current_menu = menu; ++ cdone(); cinit(); ++ for (child = menu->list; child; child = child->next) { ++ if (!menu_is_visible(child)) ++ continue; ++ cmake(); ++ cprint_tag("%p", child); ++ cprint_name("%s", menu_get_prompt(child)); ++ if (child->sym == sym_get_choice_value(menu->sym)) ++ items[item_no - 1]->selected = 1; /* ON */ ++ else if (child->sym == active) ++ items[item_no - 1]->selected = 2; /* SELECTED */ ++ else ++ items[item_no - 1]->selected = 0; /* OFF */ ++ } ++ ++ switch (dialog_checklist(prompt ? prompt : "Main Menu", ++ radiolist_instructions, 15, 70, 6, ++ item_no, items, FLAG_RADIO)) { ++ case 0: ++ if (sscanf(first_sel_item(item_no, items)->tag, "%p", &child) != 1) ++ break; ++ sym_set_tristate_value(child->sym, yes); ++ return; ++ case 1: ++ if (sscanf(first_sel_item(item_no, items)->tag, "%p", &child) == 1) { ++ show_help(child); ++ active = child->sym; ++ } else ++ show_help(menu); ++ break; ++ case 255: ++ return; ++ } ++ } ++} ++ ++static void conf_string(struct menu *menu) ++{ ++ const char *prompt = menu_get_prompt(menu); ++ ++ while (1) { ++ char *heading; ++ ++ switch (sym_get_type(menu->sym)) { ++ case S_INT: ++ heading = (char *) inputbox_instructions_int; ++ break; ++ case S_HEX: ++ heading = (char *) inputbox_instructions_hex; ++ break; ++ case S_STRING: ++ heading = (char *) inputbox_instructions_string; ++ break; ++ default: ++ heading = "Internal mconf error!"; ++ /* panic? */; ++ } ++ ++ switch (dialog_inputbox(prompt ? prompt : "Main Menu", ++ heading, 10, 75, ++ sym_get_string_value(menu->sym))) { ++ case 0: ++ if (sym_set_string_value(menu->sym, dialog_input_result)) ++ return; ++ show_textbox(NULL, "You have made an invalid entry.", 5, 43); ++ break; ++ case 1: ++ show_help(menu); ++ break; ++ case 255: ++ return; ++ } ++ } ++} ++ ++static void conf_load(void) ++{ ++ while (1) { ++ switch (dialog_inputbox(NULL, load_config_text, 11, 55, ++ filename)) { ++ case 0: ++ if (!dialog_input_result[0]) ++ return; ++ if (!conf_read(dialog_input_result)) ++ return; ++ show_textbox(NULL, "File does not exist!", 5, 38); ++ break; ++ case 1: ++ show_helptext("Load Alternate Configuration", load_config_help); ++ break; ++ case 255: ++ return; ++ } ++ } ++} ++ ++static void conf_save(void) ++{ ++ while (1) { ++ switch (dialog_inputbox(NULL, save_config_text, 11, 55, ++ filename)) { ++ case 0: ++ if (!dialog_input_result[0]) ++ return; ++ if (!conf_write(dialog_input_result)) ++ return; ++ show_textbox(NULL, "Can't create file! Probably a nonexistent directory.", 5, 60); ++ break; ++ case 1: ++ show_helptext("Save Alternate Configuration", save_config_help); ++ break; ++ case 255: ++ return; ++ } ++ } ++} ++ ++static void conf_cleanup(void) ++{ ++ tcsetattr(1, TCSAFLUSH, &ios_org); ++ unlink(".help.tmp"); ++} ++ ++static void winch_handler(int sig) ++{ ++ struct winsize ws; ++ ++ if (ioctl(1, TIOCGWINSZ, &ws) == -1) { ++ rows = 24; ++ cols = 80; ++ } else { ++ rows = ws.ws_row; ++ cols = ws.ws_col; ++ } ++ ++ if (rows < 19 || cols < 80) { ++ end_dialog(); ++ fprintf(stderr, "Your display is too small to run Menuconfig!\n"); ++ fprintf(stderr, "It must be at least 19 lines by 80 columns.\n"); ++ exit(1); ++ } ++ ++ rows -= 4; ++ cols -= 5; ++ ++} ++ ++int main(int ac, char **av) ++{ ++ struct symbol *sym; ++ char *mode; ++ int stat; ++ ++ conf_parse(av[1]); ++ conf_read(NULL); ++ ++ sym = sym_lookup("VERSION", 0); ++ sym_calc_value(sym); ++ snprintf(menu_backtitle, 128, "axTLS v%s Configuration", ++ sym_get_string_value(sym)); ++ ++ mode = getenv("MENUCONFIG_MODE"); ++ if (mode) { ++ if (!strcasecmp(mode, "single_menu")) ++ single_menu_mode = 1; ++ } ++ ++ tcgetattr(1, &ios_org); ++ atexit(conf_cleanup); ++ init_wsize(); ++ init_dialog(); ++ signal(SIGWINCH, winch_handler); ++ conf(&rootmenu); ++ end_dialog(); ++ ++ /* Restart dialog to act more like when lxdialog was still separate */ ++ init_dialog(); ++ do { ++ stat = dialog_yesno(NULL, ++ "Do you wish to save your new axTLS configuration?", 5, 60); ++ } while (stat < 0); ++ end_dialog(); ++ ++ if (stat == 0) { ++ conf_write(NULL); ++ printf("\n\n" ++ "*** End of axTLS configuration.\n" ++ "*** Check the top-level Makefile for additional configuration options.\n\n"); ++ } else ++ printf("\n\nYour axTLS configuration changes were NOT saved.\n\n"); ++ ++ return 0; ++} +diff --git a/feeds/luci/libs/luci-lib-nixio/axTLS/config/scripts/config/menu.c b/feeds/luci/libs/luci-lib-nixio/axTLS/config/scripts/config/menu.c +new file mode 100644 +index 0000000..0c13156 +--- /dev/null ++++ b/feeds/luci/libs/luci-lib-nixio/axTLS/config/scripts/config/menu.c +@@ -0,0 +1,390 @@ ++/* ++ * Copyright (C) 2002 Roman Zippel ++ * Released under the terms of the GNU GPL v2.0. ++ */ ++ ++#include ++#include ++ ++#define LKC_DIRECT_LINK ++#include "lkc.h" ++ ++struct menu rootmenu; ++static struct menu **last_entry_ptr; ++ ++struct file *file_list; ++struct file *current_file; ++ ++static void menu_warn(struct menu *menu, const char *fmt, ...) ++{ ++ va_list ap; ++ va_start(ap, fmt); ++ fprintf(stderr, "%s:%d:warning: ", menu->file->name, menu->lineno); ++ vfprintf(stderr, fmt, ap); ++ fprintf(stderr, "\n"); ++ va_end(ap); ++} ++ ++static void prop_warn(struct property *prop, const char *fmt, ...) ++{ ++ va_list ap; ++ va_start(ap, fmt); ++ fprintf(stderr, "%s:%d:warning: ", prop->file->name, prop->lineno); ++ vfprintf(stderr, fmt, ap); ++ fprintf(stderr, "\n"); ++ va_end(ap); ++} ++ ++void menu_init(void) ++{ ++ current_entry = current_menu = &rootmenu; ++ last_entry_ptr = &rootmenu.list; ++} ++ ++void menu_add_entry(struct symbol *sym) ++{ ++ struct menu *menu; ++ ++ menu = malloc(sizeof(*menu)); ++ memset(menu, 0, sizeof(*menu)); ++ menu->sym = sym; ++ menu->parent = current_menu; ++ menu->file = current_file; ++ menu->lineno = zconf_lineno(); ++ ++ *last_entry_ptr = menu; ++ last_entry_ptr = &menu->next; ++ current_entry = menu; ++} ++ ++void menu_end_entry(void) ++{ ++} ++ ++void menu_add_menu(void) ++{ ++ current_menu = current_entry; ++ last_entry_ptr = ¤t_entry->list; ++} ++ ++void menu_end_menu(void) ++{ ++ last_entry_ptr = ¤t_menu->next; ++ current_menu = current_menu->parent; ++} ++ ++struct expr *menu_check_dep(struct expr *e) ++{ ++ if (!e) ++ return e; ++ ++ switch (e->type) { ++ case E_NOT: ++ e->left.expr = menu_check_dep(e->left.expr); ++ break; ++ case E_OR: ++ case E_AND: ++ e->left.expr = menu_check_dep(e->left.expr); ++ e->right.expr = menu_check_dep(e->right.expr); ++ break; ++ case E_SYMBOL: ++ /* change 'm' into 'm' && MODULES */ ++ if (e->left.sym == &symbol_mod) ++ return expr_alloc_and(e, expr_alloc_symbol(modules_sym)); ++ break; ++ default: ++ break; ++ } ++ return e; ++} ++ ++void menu_add_dep(struct expr *dep) ++{ ++ current_entry->dep = expr_alloc_and(current_entry->dep, menu_check_dep(dep)); ++} ++ ++void menu_set_type(int type) ++{ ++ struct symbol *sym = current_entry->sym; ++ ++ if (sym->type == type) ++ return; ++ if (sym->type == S_UNKNOWN) { ++ sym->type = type; ++ return; ++ } ++ menu_warn(current_entry, "type of '%s' redefined from '%s' to '%s'\n", ++ sym->name ? sym->name : "", ++ sym_type_name(sym->type), sym_type_name(type)); ++} ++ ++struct property *menu_add_prop(enum prop_type type, char *prompt, struct expr *expr, struct expr *dep) ++{ ++ struct property *prop = prop_alloc(type, current_entry->sym); ++ ++ prop->menu = current_entry; ++ prop->text = prompt; ++ prop->expr = expr; ++ prop->visible.expr = menu_check_dep(dep); ++ ++ if (prompt) { ++ if (current_entry->prompt) ++ menu_warn(current_entry, "prompt redefined\n"); ++ current_entry->prompt = prop; ++ } ++ ++ return prop; ++} ++ ++void menu_add_prompt(enum prop_type type, char *prompt, struct expr *dep) ++{ ++ menu_add_prop(type, prompt, NULL, dep); ++} ++ ++void menu_add_expr(enum prop_type type, struct expr *expr, struct expr *dep) ++{ ++ menu_add_prop(type, NULL, expr, dep); ++} ++ ++void menu_add_symbol(enum prop_type type, struct symbol *sym, struct expr *dep) ++{ ++ menu_add_prop(type, NULL, expr_alloc_symbol(sym), dep); ++} ++ ++void sym_check_prop(struct symbol *sym) ++{ ++ struct property *prop; ++ struct symbol *sym2; ++ for (prop = sym->prop; prop; prop = prop->next) { ++ switch (prop->type) { ++ case P_DEFAULT: ++ if ((sym->type == S_STRING || sym->type == S_INT || sym->type == S_HEX) && ++ prop->expr->type != E_SYMBOL) ++ prop_warn(prop, ++ "default for config symbol '%'" ++ " must be a single symbol", sym->name); ++ break; ++ case P_SELECT: ++ sym2 = prop_get_symbol(prop); ++ if (sym->type != S_BOOLEAN && sym->type != S_TRISTATE) ++ prop_warn(prop, ++ "config symbol '%s' uses select, but is " ++ "not boolean or tristate", sym->name); ++ else if (sym2->type == S_UNKNOWN) ++ prop_warn(prop, ++ "'select' used by config symbol '%s' " ++ "refer to undefined symbol '%s'", ++ sym->name, sym2->name); ++ else if (sym2->type != S_BOOLEAN && sym2->type != S_TRISTATE) ++ prop_warn(prop, ++ "'%s' has wrong type. 'select' only " ++ "accept arguments of boolean and " ++ "tristate type", sym2->name); ++ break; ++ case P_RANGE: ++ if (sym->type != S_INT && sym->type != S_HEX) ++ prop_warn(prop, "range is only allowed " ++ "for int or hex symbols"); ++ if (!sym_string_valid(sym, prop->expr->left.sym->name) || ++ !sym_string_valid(sym, prop->expr->right.sym->name)) ++ prop_warn(prop, "range is invalid"); ++ break; ++ default: ++ ; ++ } ++ } ++} ++ ++void menu_finalize(struct menu *parent) ++{ ++ struct menu *menu, *last_menu; ++ struct symbol *sym; ++ struct property *prop; ++ struct expr *parentdep, *basedep, *dep, *dep2, **ep; ++ ++ sym = parent->sym; ++ if (parent->list) { ++ if (sym && sym_is_choice(sym)) { ++ /* find the first choice value and find out choice type */ ++ for (menu = parent->list; menu; menu = menu->next) { ++ if (menu->sym) { ++ current_entry = parent; ++ menu_set_type(menu->sym->type); ++ current_entry = menu; ++ menu_set_type(sym->type); ++ break; ++ } ++ } ++ parentdep = expr_alloc_symbol(sym); ++ } else if (parent->prompt) ++ parentdep = parent->prompt->visible.expr; ++ else ++ parentdep = parent->dep; ++ ++ for (menu = parent->list; menu; menu = menu->next) { ++ basedep = expr_transform(menu->dep); ++ basedep = expr_alloc_and(expr_copy(parentdep), basedep); ++ basedep = expr_eliminate_dups(basedep); ++ menu->dep = basedep; ++ if (menu->sym) ++ prop = menu->sym->prop; ++ else ++ prop = menu->prompt; ++ for (; prop; prop = prop->next) { ++ if (prop->menu != menu) ++ continue; ++ dep = expr_transform(prop->visible.expr); ++ dep = expr_alloc_and(expr_copy(basedep), dep); ++ dep = expr_eliminate_dups(dep); ++ if (menu->sym && menu->sym->type != S_TRISTATE) ++ dep = expr_trans_bool(dep); ++ prop->visible.expr = dep; ++ if (prop->type == P_SELECT) { ++ struct symbol *es = prop_get_symbol(prop); ++ es->rev_dep.expr = expr_alloc_or(es->rev_dep.expr, ++ expr_alloc_and(expr_alloc_symbol(menu->sym), expr_copy(dep))); ++ } ++ } ++ } ++ for (menu = parent->list; menu; menu = menu->next) ++ menu_finalize(menu); ++ } else if (sym) { ++ basedep = parent->prompt ? parent->prompt->visible.expr : NULL; ++ basedep = expr_trans_compare(basedep, E_UNEQUAL, &symbol_no); ++ basedep = expr_eliminate_dups(expr_transform(basedep)); ++ last_menu = NULL; ++ for (menu = parent->next; menu; menu = menu->next) { ++ dep = menu->prompt ? menu->prompt->visible.expr : menu->dep; ++ if (!expr_contains_symbol(dep, sym)) ++ break; ++ if (expr_depends_symbol(dep, sym)) ++ goto next; ++ dep = expr_trans_compare(dep, E_UNEQUAL, &symbol_no); ++ dep = expr_eliminate_dups(expr_transform(dep)); ++ dep2 = expr_copy(basedep); ++ expr_eliminate_eq(&dep, &dep2); ++ expr_free(dep); ++ if (!expr_is_yes(dep2)) { ++ expr_free(dep2); ++ break; ++ } ++ expr_free(dep2); ++ next: ++ menu_finalize(menu); ++ menu->parent = parent; ++ last_menu = menu; ++ } ++ if (last_menu) { ++ parent->list = parent->next; ++ parent->next = last_menu->next; ++ last_menu->next = NULL; ++ } ++ } ++ for (menu = parent->list; menu; menu = menu->next) { ++ if (sym && sym_is_choice(sym) && menu->sym) { ++ menu->sym->flags |= SYMBOL_CHOICEVAL; ++ if (!menu->prompt) ++ menu_warn(menu, "choice value must have a prompt"); ++ for (prop = menu->sym->prop; prop; prop = prop->next) { ++ if (prop->type == P_PROMPT && prop->menu != menu) { ++ prop_warn(prop, "choice values " ++ "currently only support a " ++ "single prompt"); ++ } ++ if (prop->type == P_DEFAULT) ++ prop_warn(prop, "defaults for choice " ++ "values not supported"); ++ } ++ current_entry = menu; ++ menu_set_type(sym->type); ++ menu_add_symbol(P_CHOICE, sym, NULL); ++ prop = sym_get_choice_prop(sym); ++ for (ep = &prop->expr; *ep; ep = &(*ep)->left.expr) ++ ; ++ *ep = expr_alloc_one(E_CHOICE, NULL); ++ (*ep)->right.sym = menu->sym; ++ } ++ if (menu->list && (!menu->prompt || !menu->prompt->text)) { ++ for (last_menu = menu->list; ; last_menu = last_menu->next) { ++ last_menu->parent = parent; ++ if (!last_menu->next) ++ break; ++ } ++ last_menu->next = menu->next; ++ menu->next = menu->list; ++ menu->list = NULL; ++ } ++ } ++ ++ if (sym && !(sym->flags & SYMBOL_WARNED)) { ++ if (sym->type == S_UNKNOWN) ++ menu_warn(parent, "config symbol defined " ++ "without type\n"); ++ ++ if (sym_is_choice(sym) && !parent->prompt) ++ menu_warn(parent, "choice must have a prompt\n"); ++ ++ /* Check properties connected to this symbol */ ++ sym_check_prop(sym); ++ sym->flags |= SYMBOL_WARNED; ++ } ++ ++ if (sym && !sym_is_optional(sym) && parent->prompt) { ++ sym->rev_dep.expr = expr_alloc_or(sym->rev_dep.expr, ++ expr_alloc_and(parent->prompt->visible.expr, ++ expr_alloc_symbol(&symbol_mod))); ++ } ++} ++ ++bool menu_is_visible(struct menu *menu) ++{ ++ struct menu *child; ++ struct symbol *sym; ++ tristate visible; ++ ++ if (!menu->prompt) ++ return false; ++ sym = menu->sym; ++ if (sym) { ++ sym_calc_value(sym); ++ visible = menu->prompt->visible.tri; ++ } else ++ visible = menu->prompt->visible.tri = expr_calc_value(menu->prompt->visible.expr); ++ ++ if (visible != no) ++ return true; ++ if (!sym || sym_get_tristate_value(menu->sym) == no) ++ return false; ++ ++ for (child = menu->list; child; child = child->next) ++ if (menu_is_visible(child)) ++ return true; ++ return false; ++} ++ ++const char *menu_get_prompt(struct menu *menu) ++{ ++ if (menu->prompt) ++ return menu->prompt->text; ++ else if (menu->sym) ++ return menu->sym->name; ++ return NULL; ++} ++ ++struct menu *menu_get_root_menu(struct menu *menu) ++{ ++ return &rootmenu; ++} ++ ++struct menu *menu_get_parent_menu(struct menu *menu) ++{ ++ enum prop_type type; ++ ++ for (; menu != &rootmenu; menu = menu->parent) { ++ type = menu->prompt ? menu->prompt->type : 0; ++ if (type == P_MENU) ++ break; ++ } ++ return menu; ++} ++ +diff --git a/feeds/luci/libs/luci-lib-nixio/axTLS/config/scripts/config/mkconfigs b/feeds/luci/libs/luci-lib-nixio/axTLS/config/scripts/config/mkconfigs +new file mode 100755 +index 0000000..3cb7bb1 +--- /dev/null ++++ b/feeds/luci/libs/luci-lib-nixio/axTLS/config/scripts/config/mkconfigs +@@ -0,0 +1,67 @@ ++#!/bin/sh ++# ++# Copyright (C) 2002 Khalid Aziz ++# Copyright (C) 2002 Randy Dunlap ++# Copyright (C) 2002 Al Stone ++# Copyright (C) 2002 Hewlett-Packard Company ++# ++# 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. ++# ++# This program is distributed in the hope that it will be useful, ++# but WITHOUT ANY WARRANTY; without even the implied warranty of ++# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++# GNU General Public License for more details. ++# ++# You should have received a copy of the GNU General Public License ++# along with this program; if not, write to the Free Software ++# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. ++# ++# Busybox version by Matteo Croce <3297627799 at wind.it> ++# ++# Rules to generate bbconfig.h from .config: ++# - Retain lines that begin with "CONFIG_" ++# - Retain lines that begin with "# CONFIG_" ++# - lines that use double-quotes must \\-escape-quote them ++ ++if [ $# -lt 1 ] ++then ++ config=.config ++else config=$1 ++fi ++ ++echo "#ifndef _BBCONFIG_H" ++echo "#define _BBCONFIG_H" ++echo \ ++"/* ++ * busybox configuration options. ++ * ++ * 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. ++ * ++ * 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, GOOD TITLE or ++ * NON INFRINGEMENT. See the GNU General Public License for more ++ * details. ++ * ++ * You should have received a copy of the GNU General Public License ++ * along with this program; if not, write to the Free Software ++ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. ++ * ++ * ++ * ++ * This file is generated automatically by scripts/config/mkconfigs. ++ * Do not edit. ++ * ++ */" ++ ++echo "static char const bbconfig_config[] =" ++echo "\"CONFIG_BEGIN=n\\n\\" ++echo "`sed 's/\"/\\\\\"/g' $config | grep "^#\? \?CONFIG_" | awk '{ print $0 "\\\\n\\\\" }' `" ++echo "CONFIG_END=n\\n\";" ++echo "#endif /* _BBCONFIG_H */" +diff --git a/feeds/luci/libs/luci-lib-nixio/axTLS/config/scripts/config/symbol.c b/feeds/luci/libs/luci-lib-nixio/axTLS/config/scripts/config/symbol.c +new file mode 100644 +index 0000000..ea62972 +--- /dev/null ++++ b/feeds/luci/libs/luci-lib-nixio/axTLS/config/scripts/config/symbol.c +@@ -0,0 +1,809 @@ ++/* ++ * Copyright (C) 2002 Roman Zippel ++ * Released under the terms of the GNU GPL v2.0. ++ */ ++ ++#include ++#include ++#include ++#include ++#include ++ ++#define LKC_DIRECT_LINK ++#include "lkc.h" ++ ++struct symbol symbol_yes = { ++ .name = "y", ++ .curr = { "y", yes }, ++ .flags = SYMBOL_YES|SYMBOL_VALID, ++}, symbol_mod = { ++ .name = "m", ++ .curr = { "m", mod }, ++ .flags = SYMBOL_MOD|SYMBOL_VALID, ++}, symbol_no = { ++ .name = "n", ++ .curr = { "n", no }, ++ .flags = SYMBOL_NO|SYMBOL_VALID, ++}, symbol_empty = { ++ .name = "", ++ .curr = { "", no }, ++ .flags = SYMBOL_VALID, ++}; ++ ++int sym_change_count; ++struct symbol *modules_sym; ++tristate modules_val; ++ ++void sym_add_default(struct symbol *sym, const char *def) ++{ ++ struct property *prop = prop_alloc(P_DEFAULT, sym); ++ ++ prop->expr = expr_alloc_symbol(sym_lookup(def, 1)); ++} ++ ++void sym_init(void) ++{ ++ struct symbol *sym; ++ char *p; ++ static bool inited = false; ++ ++ if (inited) ++ return; ++ inited = true; ++ ++ sym = sym_lookup("VERSION", 0); ++ sym->type = S_STRING; ++ sym->flags |= SYMBOL_AUTO; ++ p = getenv("VERSION"); ++ if (p) ++ sym_add_default(sym, p); ++ ++ sym = sym_lookup("TARGET_ARCH", 0); ++ sym->type = S_STRING; ++ sym->flags |= SYMBOL_AUTO; ++ p = getenv("TARGET_ARCH"); ++ if (p) ++ sym_add_default(sym, p); ++ ++} ++ ++enum symbol_type sym_get_type(struct symbol *sym) ++{ ++ enum symbol_type type = sym->type; ++ ++ if (type == S_TRISTATE) { ++ if (sym_is_choice_value(sym) && sym->visible == yes) ++ type = S_BOOLEAN; ++ else if (modules_val == no) ++ type = S_BOOLEAN; ++ } ++ return type; ++} ++ ++const char *sym_type_name(enum symbol_type type) ++{ ++ switch (type) { ++ case S_BOOLEAN: ++ return "boolean"; ++ case S_TRISTATE: ++ return "tristate"; ++ case S_INT: ++ return "integer"; ++ case S_HEX: ++ return "hex"; ++ case S_STRING: ++ return "string"; ++ case S_UNKNOWN: ++ return "unknown"; ++ case S_OTHER: ++ break; ++ } ++ return "???"; ++} ++ ++struct property *sym_get_choice_prop(struct symbol *sym) ++{ ++ struct property *prop; ++ ++ for_all_choices(sym, prop) ++ return prop; ++ return NULL; ++} ++ ++struct property *sym_get_default_prop(struct symbol *sym) ++{ ++ struct property *prop; ++ ++ for_all_defaults(sym, prop) { ++ prop->visible.tri = expr_calc_value(prop->visible.expr); ++ if (prop->visible.tri != no) ++ return prop; ++ } ++ return NULL; ++} ++ ++struct property *sym_get_range_prop(struct symbol *sym) ++{ ++ struct property *prop; ++ ++ for_all_properties(sym, prop, P_RANGE) { ++ prop->visible.tri = expr_calc_value(prop->visible.expr); ++ if (prop->visible.tri != no) ++ return prop; ++ } ++ return NULL; ++} ++ ++static void sym_calc_visibility(struct symbol *sym) ++{ ++ struct property *prop; ++ tristate tri; ++ ++ /* any prompt visible? */ ++ tri = no; ++ for_all_prompts(sym, prop) { ++ prop->visible.tri = expr_calc_value(prop->visible.expr); ++ tri = E_OR(tri, prop->visible.tri); ++ } ++ if (tri == mod && (sym->type != S_TRISTATE || modules_val == no)) ++ tri = yes; ++ if (sym->visible != tri) { ++ sym->visible = tri; ++ sym_set_changed(sym); ++ } ++ if (sym_is_choice_value(sym)) ++ return; ++ tri = no; ++ if (sym->rev_dep.expr) ++ tri = expr_calc_value(sym->rev_dep.expr); ++ if (tri == mod && sym_get_type(sym) == S_BOOLEAN) ++ tri = yes; ++ if (sym->rev_dep.tri != tri) { ++ sym->rev_dep.tri = tri; ++ sym_set_changed(sym); ++ } ++} ++ ++static struct symbol *sym_calc_choice(struct symbol *sym) ++{ ++ struct symbol *def_sym; ++ struct property *prop; ++ struct expr *e; ++ ++ /* is the user choice visible? */ ++ def_sym = sym->user.val; ++ if (def_sym) { ++ sym_calc_visibility(def_sym); ++ if (def_sym->visible != no) ++ return def_sym; ++ } ++ ++ /* any of the defaults visible? */ ++ for_all_defaults(sym, prop) { ++ prop->visible.tri = expr_calc_value(prop->visible.expr); ++ if (prop->visible.tri == no) ++ continue; ++ def_sym = prop_get_symbol(prop); ++ sym_calc_visibility(def_sym); ++ if (def_sym->visible != no) ++ return def_sym; ++ } ++ ++ /* just get the first visible value */ ++ prop = sym_get_choice_prop(sym); ++ for (e = prop->expr; e; e = e->left.expr) { ++ def_sym = e->right.sym; ++ sym_calc_visibility(def_sym); ++ if (def_sym->visible != no) ++ return def_sym; ++ } ++ ++ /* no choice? reset tristate value */ ++ sym->curr.tri = no; ++ return NULL; ++} ++ ++void sym_calc_value(struct symbol *sym) ++{ ++ struct symbol_value newval, oldval; ++ struct property *prop; ++ struct expr *e; ++ ++ if (!sym) ++ return; ++ ++ if (sym->flags & SYMBOL_VALID) ++ return; ++ sym->flags |= SYMBOL_VALID; ++ ++ oldval = sym->curr; ++ ++ switch (sym->type) { ++ case S_INT: ++ case S_HEX: ++ case S_STRING: ++ newval = symbol_empty.curr; ++ break; ++ case S_BOOLEAN: ++ case S_TRISTATE: ++ newval = symbol_no.curr; ++ break; ++ default: ++ sym->curr.val = sym->name; ++ sym->curr.tri = no; ++ return; ++ } ++ if (!sym_is_choice_value(sym)) ++ sym->flags &= ~SYMBOL_WRITE; ++ ++ sym_calc_visibility(sym); ++ ++ /* set default if recursively called */ ++ sym->curr = newval; ++ ++ switch (sym_get_type(sym)) { ++ case S_BOOLEAN: ++ case S_TRISTATE: ++ if (sym_is_choice_value(sym) && sym->visible == yes) { ++ prop = sym_get_choice_prop(sym); ++ newval.tri = (prop_get_symbol(prop)->curr.val == sym) ? yes : no; ++ } else if (E_OR(sym->visible, sym->rev_dep.tri) != no) { ++ sym->flags |= SYMBOL_WRITE; ++ if (sym_has_value(sym)) ++ newval.tri = sym->user.tri; ++ else if (!sym_is_choice(sym)) { ++ prop = sym_get_default_prop(sym); ++ if (prop) ++ newval.tri = expr_calc_value(prop->expr); ++ } ++ newval.tri = E_OR(E_AND(newval.tri, sym->visible), sym->rev_dep.tri); ++ } else if (!sym_is_choice(sym)) { ++ prop = sym_get_default_prop(sym); ++ if (prop) { ++ sym->flags |= SYMBOL_WRITE; ++ newval.tri = expr_calc_value(prop->expr); ++ } ++ } ++ if (newval.tri == mod && sym_get_type(sym) == S_BOOLEAN) ++ newval.tri = yes; ++ break; ++ case S_STRING: ++ case S_HEX: ++ case S_INT: ++ if (sym->visible != no) { ++ sym->flags |= SYMBOL_WRITE; ++ if (sym_has_value(sym)) { ++ newval.val = sym->user.val; ++ break; ++ } ++ } ++ prop = sym_get_default_prop(sym); ++ if (prop) { ++ struct symbol *ds = prop_get_symbol(prop); ++ if (ds) { ++ sym->flags |= SYMBOL_WRITE; ++ sym_calc_value(ds); ++ newval.val = ds->curr.val; ++ } ++ } ++ break; ++ default: ++ ; ++ } ++ ++ sym->curr = newval; ++ if (sym_is_choice(sym) && newval.tri == yes) ++ sym->curr.val = sym_calc_choice(sym); ++ ++ if (memcmp(&oldval, &sym->curr, sizeof(oldval))) ++ sym_set_changed(sym); ++ if (modules_sym == sym) ++ modules_val = modules_sym->curr.tri; ++ ++ if (sym_is_choice(sym)) { ++ int flags = sym->flags & (SYMBOL_CHANGED | SYMBOL_WRITE); ++ prop = sym_get_choice_prop(sym); ++ for (e = prop->expr; e; e = e->left.expr) { ++ e->right.sym->flags |= flags; ++ if (flags & SYMBOL_CHANGED) ++ sym_set_changed(e->right.sym); ++ } ++ } ++} ++ ++void sym_clear_all_valid(void) ++{ ++ struct symbol *sym; ++ int i; ++ ++ for_all_symbols(i, sym) ++ sym->flags &= ~SYMBOL_VALID; ++ sym_change_count++; ++ if (modules_sym) ++ sym_calc_value(modules_sym); ++} ++ ++void sym_set_changed(struct symbol *sym) ++{ ++ struct property *prop; ++ ++ sym->flags |= SYMBOL_CHANGED; ++ for (prop = sym->prop; prop; prop = prop->next) { ++ if (prop->menu) ++ prop->menu->flags |= MENU_CHANGED; ++ } ++} ++ ++void sym_set_all_changed(void) ++{ ++ struct symbol *sym; ++ int i; ++ ++ for_all_symbols(i, sym) ++ sym_set_changed(sym); ++} ++ ++bool sym_tristate_within_range(struct symbol *sym, tristate val) ++{ ++ int type = sym_get_type(sym); ++ ++ if (sym->visible == no) ++ return false; ++ ++ if (type != S_BOOLEAN && type != S_TRISTATE) ++ return false; ++ ++ if (type == S_BOOLEAN && val == mod) ++ return false; ++ if (sym->visible <= sym->rev_dep.tri) ++ return false; ++ if (sym_is_choice_value(sym) && sym->visible == yes) ++ return val == yes; ++ return val >= sym->rev_dep.tri && val <= sym->visible; ++} ++ ++bool sym_set_tristate_value(struct symbol *sym, tristate val) ++{ ++ tristate oldval = sym_get_tristate_value(sym); ++ ++ if (oldval != val && !sym_tristate_within_range(sym, val)) ++ return false; ++ ++ if (sym->flags & SYMBOL_NEW) { ++ sym->flags &= ~SYMBOL_NEW; ++ sym_set_changed(sym); ++ } ++ if (sym_is_choice_value(sym) && val == yes) { ++ struct symbol *cs = prop_get_symbol(sym_get_choice_prop(sym)); ++ ++ cs->user.val = sym; ++ cs->flags &= ~SYMBOL_NEW; ++ } ++ ++ sym->user.tri = val; ++ if (oldval != val) { ++ sym_clear_all_valid(); ++ if (sym == modules_sym) ++ sym_set_all_changed(); ++ } ++ ++ return true; ++} ++ ++tristate sym_toggle_tristate_value(struct symbol *sym) ++{ ++ tristate oldval, newval; ++ ++ oldval = newval = sym_get_tristate_value(sym); ++ do { ++ switch (newval) { ++ case no: ++ newval = mod; ++ break; ++ case mod: ++ newval = yes; ++ break; ++ case yes: ++ newval = no; ++ break; ++ } ++ if (sym_set_tristate_value(sym, newval)) ++ break; ++ } while (oldval != newval); ++ return newval; ++} ++ ++bool sym_string_valid(struct symbol *sym, const char *str) ++{ ++ signed char ch; ++ ++ switch (sym->type) { ++ case S_STRING: ++ return true; ++ case S_INT: ++ ch = *str++; ++ if (ch == '-') ++ ch = *str++; ++ if (!isdigit(ch)) ++ return false; ++ if (ch == '0' && *str != 0) ++ return false; ++ while ((ch = *str++)) { ++ if (!isdigit(ch)) ++ return false; ++ } ++ return true; ++ case S_HEX: ++ if (str[0] == '0' && (str[1] == 'x' || str[1] == 'X')) ++ str += 2; ++ ch = *str++; ++ do { ++ if (!isxdigit(ch)) ++ return false; ++ } while ((ch = *str++)); ++ return true; ++ case S_BOOLEAN: ++ case S_TRISTATE: ++ switch (str[0]) { ++ case 'y': case 'Y': ++ case 'm': case 'M': ++ case 'n': case 'N': ++ return true; ++ } ++ return false; ++ default: ++ return false; ++ } ++} ++ ++bool sym_string_within_range(struct symbol *sym, const char *str) ++{ ++ struct property *prop; ++ int val; ++ ++ switch (sym->type) { ++ case S_STRING: ++ return sym_string_valid(sym, str); ++ case S_INT: ++ if (!sym_string_valid(sym, str)) ++ return false; ++ prop = sym_get_range_prop(sym); ++ if (!prop) ++ return true; ++ val = strtol(str, NULL, 10); ++ return val >= strtol(prop->expr->left.sym->name, NULL, 10) && ++ val <= strtol(prop->expr->right.sym->name, NULL, 10); ++ case S_HEX: ++ if (!sym_string_valid(sym, str)) ++ return false; ++ prop = sym_get_range_prop(sym); ++ if (!prop) ++ return true; ++ val = strtol(str, NULL, 16); ++ return val >= strtol(prop->expr->left.sym->name, NULL, 16) && ++ val <= strtol(prop->expr->right.sym->name, NULL, 16); ++ case S_BOOLEAN: ++ case S_TRISTATE: ++ switch (str[0]) { ++ case 'y': case 'Y': ++ return sym_tristate_within_range(sym, yes); ++ case 'm': case 'M': ++ return sym_tristate_within_range(sym, mod); ++ case 'n': case 'N': ++ return sym_tristate_within_range(sym, no); ++ } ++ return false; ++ default: ++ return false; ++ } ++} ++ ++bool sym_set_string_value(struct symbol *sym, const char *newval) ++{ ++ const char *oldval; ++ char *val; ++ int size; ++ ++ switch (sym->type) { ++ case S_BOOLEAN: ++ case S_TRISTATE: ++ switch (newval[0]) { ++ case 'y': case 'Y': ++ return sym_set_tristate_value(sym, yes); ++ case 'm': case 'M': ++ return sym_set_tristate_value(sym, mod); ++ case 'n': case 'N': ++ return sym_set_tristate_value(sym, no); ++ } ++ return false; ++ default: ++ ; ++ } ++ ++ if (!sym_string_within_range(sym, newval)) ++ return false; ++ ++ if (sym->flags & SYMBOL_NEW) { ++ sym->flags &= ~SYMBOL_NEW; ++ sym_set_changed(sym); ++ } ++ ++ oldval = sym->user.val; ++ size = strlen(newval) + 1; ++ if (sym->type == S_HEX && (newval[0] != '0' || (newval[1] != 'x' && newval[1] != 'X'))) { ++ size += 2; ++ sym->user.val = val = malloc(size); ++ *val++ = '0'; ++ *val++ = 'x'; ++ } else if (!oldval || strcmp(oldval, newval)) ++ sym->user.val = val = malloc(size); ++ else ++ return true; ++ ++ strcpy(val, newval); ++ free((void *)oldval); ++ sym_clear_all_valid(); ++ ++ return true; ++} ++ ++const char *sym_get_string_value(struct symbol *sym) ++{ ++ tristate val; ++ ++ switch (sym->type) { ++ case S_BOOLEAN: ++ case S_TRISTATE: ++ val = sym_get_tristate_value(sym); ++ switch (val) { ++ case no: ++ return "n"; ++ case mod: ++ return "m"; ++ case yes: ++ return "y"; ++ } ++ break; ++ default: ++ ; ++ } ++ return (const char *)sym->curr.val; ++} ++ ++bool sym_is_changable(struct symbol *sym) ++{ ++ return sym->visible > sym->rev_dep.tri; ++} ++ ++struct symbol *sym_lookup(const char *name, int isconst) ++{ ++ struct symbol *symbol; ++ const char *ptr; ++ char *new_name; ++ int hash = 0; ++ ++ if (name) { ++ if (name[0] && !name[1]) { ++ switch (name[0]) { ++ case 'y': return &symbol_yes; ++ case 'm': return &symbol_mod; ++ case 'n': return &symbol_no; ++ } ++ } ++ for (ptr = name; *ptr; ptr++) ++ hash += *ptr; ++ hash &= 0xff; ++ ++ for (symbol = symbol_hash[hash]; symbol; symbol = symbol->next) { ++ if (!strcmp(symbol->name, name)) { ++ if ((isconst && symbol->flags & SYMBOL_CONST) || ++ (!isconst && !(symbol->flags & SYMBOL_CONST))) ++ return symbol; ++ } ++ } ++ new_name = strdup(name); ++ } else { ++ new_name = NULL; ++ hash = 256; ++ } ++ ++ symbol = malloc(sizeof(*symbol)); ++ memset(symbol, 0, sizeof(*symbol)); ++ symbol->name = new_name; ++ symbol->type = S_UNKNOWN; ++ symbol->flags = SYMBOL_NEW; ++ if (isconst) ++ symbol->flags |= SYMBOL_CONST; ++ ++ symbol->next = symbol_hash[hash]; ++ symbol_hash[hash] = symbol; ++ ++ return symbol; ++} ++ ++struct symbol *sym_find(const char *name) ++{ ++ struct symbol *symbol = NULL; ++ const char *ptr; ++ int hash = 0; ++ ++ if (!name) ++ return NULL; ++ ++ if (name[0] && !name[1]) { ++ switch (name[0]) { ++ case 'y': return &symbol_yes; ++ case 'm': return &symbol_mod; ++ case 'n': return &symbol_no; ++ } ++ } ++ for (ptr = name; *ptr; ptr++) ++ hash += *ptr; ++ hash &= 0xff; ++ ++ for (symbol = symbol_hash[hash]; symbol; symbol = symbol->next) { ++ if (!strcmp(symbol->name, name) && ++ !(symbol->flags & SYMBOL_CONST)) ++ break; ++ } ++ ++ return symbol; ++} ++ ++struct symbol **sym_re_search(const char *pattern) ++{ ++ struct symbol *sym, **sym_arr = NULL; ++ int i, cnt, size; ++ regex_t re; ++ ++ cnt = size = 0; ++ /* Skip if empty */ ++ if (strlen(pattern) == 0) ++ return NULL; ++ if (regcomp(&re, pattern, REG_EXTENDED|REG_NOSUB|REG_ICASE)) ++ return NULL; ++ ++ for_all_symbols(i, sym) { ++ if (sym->flags & SYMBOL_CONST || !sym->name) ++ continue; ++ if (regexec(&re, sym->name, 0, NULL, 0)) ++ continue; ++ if (cnt + 1 >= size) { ++ void *tmp = sym_arr; ++ size += 16; ++ sym_arr = realloc(sym_arr, size * sizeof(struct symbol *)); ++ if (!sym_arr) { ++ free(tmp); ++ return NULL; ++ } ++ } ++ sym_arr[cnt++] = sym; ++ } ++ if (sym_arr) ++ sym_arr[cnt] = NULL; ++ regfree(&re); ++ ++ return sym_arr; ++} ++ ++ ++struct symbol *sym_check_deps(struct symbol *sym); ++ ++static struct symbol *sym_check_expr_deps(struct expr *e) ++{ ++ struct symbol *sym; ++ ++ if (!e) ++ return NULL; ++ switch (e->type) { ++ case E_OR: ++ case E_AND: ++ sym = sym_check_expr_deps(e->left.expr); ++ if (sym) ++ return sym; ++ return sym_check_expr_deps(e->right.expr); ++ case E_NOT: ++ return sym_check_expr_deps(e->left.expr); ++ case E_EQUAL: ++ case E_UNEQUAL: ++ sym = sym_check_deps(e->left.sym); ++ if (sym) ++ return sym; ++ return sym_check_deps(e->right.sym); ++ case E_SYMBOL: ++ return sym_check_deps(e->left.sym); ++ default: ++ break; ++ } ++ printf("Oops! How to check %d?\n", e->type); ++ return NULL; ++} ++ ++struct symbol *sym_check_deps(struct symbol *sym) ++{ ++ struct symbol *sym2; ++ struct property *prop; ++ ++ if (sym->flags & SYMBOL_CHECK_DONE) ++ return NULL; ++ if (sym->flags & SYMBOL_CHECK) { ++ printf("Warning! Found recursive dependency: %s", sym->name); ++ return sym; ++ } ++ ++ sym->flags |= (SYMBOL_CHECK | SYMBOL_CHECKED); ++ sym2 = sym_check_expr_deps(sym->rev_dep.expr); ++ if (sym2) ++ goto out; ++ ++ for (prop = sym->prop; prop; prop = prop->next) { ++ if (prop->type == P_CHOICE || prop->type == P_SELECT) ++ continue; ++ sym2 = sym_check_expr_deps(prop->visible.expr); ++ if (sym2) ++ goto out; ++ if (prop->type != P_DEFAULT || sym_is_choice(sym)) ++ continue; ++ sym2 = sym_check_expr_deps(prop->expr); ++ if (sym2) ++ goto out; ++ } ++out: ++ if (sym2) ++ printf(" %s", sym->name); ++ sym->flags &= ~SYMBOL_CHECK; ++ return sym2; ++} ++ ++struct property *prop_alloc(enum prop_type type, struct symbol *sym) ++{ ++ struct property *prop; ++ struct property **propp; ++ ++ prop = malloc(sizeof(*prop)); ++ memset(prop, 0, sizeof(*prop)); ++ prop->type = type; ++ prop->sym = sym; ++ prop->file = current_file; ++ prop->lineno = zconf_lineno(); ++ ++ /* append property to the prop list of symbol */ ++ if (sym) { ++ for (propp = &sym->prop; *propp; propp = &(*propp)->next) ++ ; ++ *propp = prop; ++ } ++ ++ return prop; ++} ++ ++struct symbol *prop_get_symbol(struct property *prop) ++{ ++ if (prop->expr && (prop->expr->type == E_SYMBOL || ++ prop->expr->type == E_CHOICE)) ++ return prop->expr->left.sym; ++ return NULL; ++} ++ ++const char *prop_get_type_name(enum prop_type type) ++{ ++ switch (type) { ++ case P_PROMPT: ++ return "prompt"; ++ case P_COMMENT: ++ return "comment"; ++ case P_MENU: ++ return "menu"; ++ case P_DEFAULT: ++ return "default"; ++ case P_CHOICE: ++ return "choice"; ++ case P_SELECT: ++ return "select"; ++ case P_RANGE: ++ return "range"; ++ case P_UNKNOWN: ++ break; ++ } ++ return "unknown"; ++} +diff --git a/feeds/luci/libs/luci-lib-nixio/axTLS/config/scripts/config/util.c b/feeds/luci/libs/luci-lib-nixio/axTLS/config/scripts/config/util.c +new file mode 100644 +index 0000000..8fc95a2 +--- /dev/null ++++ b/feeds/luci/libs/luci-lib-nixio/axTLS/config/scripts/config/util.c +@@ -0,0 +1,109 @@ ++/* ++ * Copyright (C) 2002-2005 Roman Zippel ++ * Copyright (C) 2002-2005 Sam Ravnborg ++ * ++ * Released under the terms of the GNU GPL v2.0. ++ */ ++ ++#include ++#include "lkc.h" ++ ++/* file already present in list? If not add it */ ++struct file *file_lookup(const char *name) ++{ ++ struct file *file; ++ ++ for (file = file_list; file; file = file->next) { ++ if (!strcmp(name, file->name)) ++ return file; ++ } ++ ++ file = malloc(sizeof(*file)); ++ memset(file, 0, sizeof(*file)); ++ file->name = strdup(name); ++ file->next = file_list; ++ file_list = file; ++ return file; ++} ++ ++/* write a dependency file as used by kbuild to track dependencies */ ++int file_write_dep(const char *name) ++{ ++ struct file *file; ++ FILE *out; ++ ++ if (!name) ++ name = "config/.config.cmd"; ++ out = fopen("config/.config.tmp", "w"); ++ if (!out) ++ return 1; ++ fprintf(out, "deps_config := \\\n"); ++ for (file = file_list; file; file = file->next) { ++ if (file->next) ++ fprintf(out, "\t%s \\\n", file->name); ++ else ++ fprintf(out, "\t%s\n", file->name); ++ } ++ fprintf(out, "\n.config include/config.h: $(deps_config)\n\n$(deps_config):\n"); ++ fclose(out); ++ rename(".config.tmp", name); ++ return 0; ++} ++ ++ ++/* Allocate initial growable sting */ ++struct gstr str_new(void) ++{ ++ struct gstr gs; ++ gs.s = malloc(sizeof(char) * 64); ++ gs.len = 16; ++ strcpy(gs.s, "\0"); ++ return gs; ++} ++ ++/* Allocate and assign growable string */ ++struct gstr str_assign(const char *s) ++{ ++ struct gstr gs; ++ gs.s = strdup(s); ++ gs.len = strlen(s) + 1; ++ return gs; ++} ++ ++/* Free storage for growable string */ ++void str_free(struct gstr *gs) ++{ ++ if (gs->s) ++ free(gs->s); ++ gs->s = NULL; ++ gs->len = 0; ++} ++ ++/* Append to growable string */ ++void str_append(struct gstr *gs, const char *s) ++{ ++ size_t l = strlen(gs->s) + strlen(s) + 1; ++ if (l > gs->len) { ++ gs->s = realloc(gs->s, l); ++ gs->len = l; ++ } ++ strcat(gs->s, s); ++} ++ ++/* Append printf formatted string to growable string */ ++void str_printf(struct gstr *gs, const char *fmt, ...) ++{ ++ va_list ap; ++ char s[10000]; /* big enough... */ ++ va_start(ap, fmt); ++ vsnprintf(s, sizeof(s), fmt, ap); ++ str_append(gs, s); ++ va_end(ap); ++} ++ ++/* Retreive value of growable string */ ++const char *str_get(struct gstr *gs) ++{ ++ return gs->s; ++} ++ +diff --git a/feeds/luci/libs/luci-lib-nixio/axTLS/config/scripts/config/zconf.l b/feeds/luci/libs/luci-lib-nixio/axTLS/config/scripts/config/zconf.l +new file mode 100644 +index 0000000..55517b2 +--- /dev/null ++++ b/feeds/luci/libs/luci-lib-nixio/axTLS/config/scripts/config/zconf.l +@@ -0,0 +1,366 @@ ++%option backup nostdinit noyywrap never-interactive full ecs ++%option 8bit backup nodefault perf-report perf-report ++%x COMMAND HELP STRING PARAM ++%{ ++/* ++ * Copyright (C) 2002 Roman Zippel ++ * Released under the terms of the GNU GPL v2.0. ++ */ ++ ++#include ++#include ++#include ++#include ++#include ++ ++#define LKC_DIRECT_LINK ++#include "lkc.h" ++ ++#define START_STRSIZE 16 ++ ++char *text; ++static char *text_ptr; ++static int text_size, text_asize; ++ ++struct buffer { ++ struct buffer *parent; ++ YY_BUFFER_STATE state; ++}; ++ ++struct buffer *current_buf; ++ ++static int last_ts, first_ts; ++ ++static void zconf_endhelp(void); ++static struct buffer *zconf_endfile(void); ++ ++void new_string(void) ++{ ++ text = malloc(START_STRSIZE); ++ text_asize = START_STRSIZE; ++ text_ptr = text; ++ text_size = 0; ++ *text_ptr = 0; ++} ++ ++void append_string(const char *str, int size) ++{ ++ int new_size = text_size + size + 1; ++ if (new_size > text_asize) { ++ text = realloc(text, new_size); ++ text_asize = new_size; ++ text_ptr = text + text_size; ++ } ++ memcpy(text_ptr, str, size); ++ text_ptr += size; ++ text_size += size; ++ *text_ptr = 0; ++} ++ ++void alloc_string(const char *str, int size) ++{ ++ text = malloc(size + 1); ++ memcpy(text, str, size); ++ text[size] = 0; ++} ++%} ++ ++ws [ \n\t] ++n [A-Za-z0-9_] ++ ++%% ++ int str = 0; ++ int ts, i; ++ ++[ \t]*#.*\n current_file->lineno++; ++[ \t]*#.* ++ ++[ \t]*\n current_file->lineno++; return T_EOL; ++ ++[ \t]+ { ++ BEGIN(COMMAND); ++} ++ ++. { ++ unput(yytext[0]); ++ BEGIN(COMMAND); ++} ++ ++ ++{ ++ "mainmenu" BEGIN(PARAM); return T_MAINMENU; ++ "menu" BEGIN(PARAM); return T_MENU; ++ "endmenu" BEGIN(PARAM); return T_ENDMENU; ++ "source" BEGIN(PARAM); return T_SOURCE; ++ "choice" BEGIN(PARAM); return T_CHOICE; ++ "endchoice" BEGIN(PARAM); return T_ENDCHOICE; ++ "comment" BEGIN(PARAM); return T_COMMENT; ++ "config" BEGIN(PARAM); return T_CONFIG; ++ "menuconfig" BEGIN(PARAM); return T_MENUCONFIG; ++ "help" BEGIN(PARAM); return T_HELP; ++ "if" BEGIN(PARAM); return T_IF; ++ "endif" BEGIN(PARAM); return T_ENDIF; ++ "depends" BEGIN(PARAM); return T_DEPENDS; ++ "requires" BEGIN(PARAM); return T_REQUIRES; ++ "optional" BEGIN(PARAM); return T_OPTIONAL; ++ "default" BEGIN(PARAM); return T_DEFAULT; ++ "prompt" BEGIN(PARAM); return T_PROMPT; ++ "tristate" BEGIN(PARAM); return T_TRISTATE; ++ "def_tristate" BEGIN(PARAM); return T_DEF_TRISTATE; ++ "bool" BEGIN(PARAM); return T_BOOLEAN; ++ "boolean" BEGIN(PARAM); return T_BOOLEAN; ++ "def_bool" BEGIN(PARAM); return T_DEF_BOOLEAN; ++ "def_boolean" BEGIN(PARAM); return T_DEF_BOOLEAN; ++ "int" BEGIN(PARAM); return T_INT; ++ "hex" BEGIN(PARAM); return T_HEX; ++ "string" BEGIN(PARAM); return T_STRING; ++ "select" BEGIN(PARAM); return T_SELECT; ++ "enable" BEGIN(PARAM); return T_SELECT; ++ "range" BEGIN(PARAM); return T_RANGE; ++ {n}+ { ++ alloc_string(yytext, yyleng); ++ zconflval.string = text; ++ return T_WORD; ++ } ++ . ++ \n current_file->lineno++; BEGIN(INITIAL); ++} ++ ++{ ++ "&&" return T_AND; ++ "||" return T_OR; ++ "(" return T_OPEN_PAREN; ++ ")" return T_CLOSE_PAREN; ++ "!" return T_NOT; ++ "=" return T_EQUAL; ++ "!=" return T_UNEQUAL; ++ "if" return T_IF; ++ "on" return T_ON; ++ \"|\' { ++ str = yytext[0]; ++ new_string(); ++ BEGIN(STRING); ++ } ++ \n BEGIN(INITIAL); current_file->lineno++; return T_EOL; ++ --- /* ignore */ ++ ({n}|[-/.])+ { ++ alloc_string(yytext, yyleng); ++ zconflval.string = text; ++ return T_WORD; ++ } ++ #.* /* comment */ ++ \\\n current_file->lineno++; ++ . ++ <> { ++ BEGIN(INITIAL); ++ } ++} ++ ++{ ++ [^'"\\\n]+/\n { ++ append_string(yytext, yyleng); ++ zconflval.string = text; ++ return T_WORD_QUOTE; ++ } ++ [^'"\\\n]+ { ++ append_string(yytext, yyleng); ++ } ++ \\.?/\n { ++ append_string(yytext + 1, yyleng - 1); ++ zconflval.string = text; ++ return T_WORD_QUOTE; ++ } ++ \\.? { ++ append_string(yytext + 1, yyleng - 1); ++ } ++ \'|\" { ++ if (str == yytext[0]) { ++ BEGIN(PARAM); ++ zconflval.string = text; ++ return T_WORD_QUOTE; ++ } else ++ append_string(yytext, 1); ++ } ++ \n { ++ printf("%s:%d:warning: multi-line strings not supported\n", zconf_curname(), zconf_lineno()); ++ current_file->lineno++; ++ BEGIN(INITIAL); ++ return T_EOL; ++ } ++ <> { ++ BEGIN(INITIAL); ++ } ++} ++ ++{ ++ [ \t]+ { ++ ts = 0; ++ for (i = 0; i < yyleng; i++) { ++ if (yytext[i] == '\t') ++ ts = (ts & ~7) + 8; ++ else ++ ts++; ++ } ++ last_ts = ts; ++ if (first_ts) { ++ if (ts < first_ts) { ++ zconf_endhelp(); ++ return T_HELPTEXT; ++ } ++ ts -= first_ts; ++ while (ts > 8) { ++ append_string(" ", 8); ++ ts -= 8; ++ } ++ append_string(" ", ts); ++ } ++ } ++ [ \t]*\n/[^ \t\n] { ++ current_file->lineno++; ++ zconf_endhelp(); ++ return T_HELPTEXT; ++ } ++ [ \t]*\n { ++ current_file->lineno++; ++ append_string("\n", 1); ++ } ++ [^ \t\n].* { ++ append_string(yytext, yyleng); ++ if (!first_ts) ++ first_ts = last_ts; ++ } ++ <> { ++ zconf_endhelp(); ++ return T_HELPTEXT; ++ } ++} ++ ++<> { ++ if (current_buf) { ++ zconf_endfile(); ++ return T_EOF; ++ } ++ fclose(yyin); ++ yyterminate(); ++} ++ ++%% ++void zconf_starthelp(void) ++{ ++ new_string(); ++ last_ts = first_ts = 0; ++ BEGIN(HELP); ++} ++ ++static void zconf_endhelp(void) ++{ ++ zconflval.string = text; ++ BEGIN(INITIAL); ++} ++ ++ ++/* ++ * Try to open specified file with following names: ++ * ./name ++ * $(srctree)/name ++ * The latter is used when srctree is separate from objtree ++ * when compiling the kernel. ++ * Return NULL if file is not found. ++ */ ++FILE *zconf_fopen(const char *name) ++{ ++ char *env, fullname[PATH_MAX+1]; ++ FILE *f; ++ ++ f = fopen(name, "r"); ++ if (!f && name[0] != '/') { ++ env = getenv(SRCTREE); ++ if (env) { ++ sprintf(fullname, "%s/%s", env, name); ++ f = fopen(fullname, "r"); ++ } ++ } ++ return f; ++} ++ ++void zconf_initscan(const char *name) ++{ ++ yyin = zconf_fopen(name); ++ if (!yyin) { ++ printf("can't find file %s\n", name); ++ exit(1); ++ } ++ ++ current_buf = malloc(sizeof(*current_buf)); ++ memset(current_buf, 0, sizeof(*current_buf)); ++ ++ current_file = file_lookup(name); ++ current_file->lineno = 1; ++ current_file->flags = FILE_BUSY; ++} ++ ++void zconf_nextfile(const char *name) ++{ ++ struct file *file = file_lookup(name); ++ struct buffer *buf = malloc(sizeof(*buf)); ++ memset(buf, 0, sizeof(*buf)); ++ ++ current_buf->state = YY_CURRENT_BUFFER; ++ yyin = zconf_fopen(name); ++ if (!yyin) { ++ printf("%s:%d: can't open file \"%s\"\n", zconf_curname(), zconf_lineno(), name); ++ exit(1); ++ } ++ yy_switch_to_buffer(yy_create_buffer(yyin, YY_BUF_SIZE)); ++ buf->parent = current_buf; ++ current_buf = buf; ++ ++ if (file->flags & FILE_BUSY) { ++ printf("recursive scan (%s)?\n", name); ++ exit(1); ++ } ++ if (file->flags & FILE_SCANNED) { ++ printf("file %s already scanned?\n", name); ++ exit(1); ++ } ++ file->flags |= FILE_BUSY; ++ file->lineno = 1; ++ file->parent = current_file; ++ current_file = file; ++} ++ ++static struct buffer *zconf_endfile(void) ++{ ++ struct buffer *parent; ++ ++ current_file->flags |= FILE_SCANNED; ++ current_file->flags &= ~FILE_BUSY; ++ current_file = current_file->parent; ++ ++ parent = current_buf->parent; ++ if (parent) { ++ fclose(yyin); ++ yy_delete_buffer(YY_CURRENT_BUFFER); ++ yy_switch_to_buffer(parent->state); ++ } ++ free(current_buf); ++ current_buf = parent; ++ ++ return parent; ++} ++ ++int zconf_lineno(void) ++{ ++ if (current_buf) ++ return current_file->lineno - 1; ++ else ++ return 0; ++} ++ ++char *zconf_curname(void) ++{ ++ if (current_buf) ++ return current_file->name; ++ else ++ return ""; ++} +diff --git a/feeds/luci/libs/luci-lib-nixio/axTLS/config/scripts/config/zconf.tab.c_shipped b/feeds/luci/libs/luci-lib-nixio/axTLS/config/scripts/config/zconf.tab.c_shipped +new file mode 100644 +index 0000000..cc68dcb +--- /dev/null ++++ b/feeds/luci/libs/luci-lib-nixio/axTLS/config/scripts/config/zconf.tab.c_shipped +@@ -0,0 +1,2130 @@ ++/* A Bison parser, made by GNU Bison 1.875a. */ ++ ++/* Skeleton parser for Yacc-like parsing with Bison, ++ Copyright (C) 1984, 1989, 1990, 2000, 2001, 2002, 2003 Free Software Foundation, Inc. ++ ++ 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, or (at your option) ++ any later version. ++ ++ This program is distributed in the hope that it will be useful, ++ but WITHOUT ANY WARRANTY; without even the implied warranty of ++ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++ GNU General Public License for more details. ++ ++ You should have received a copy of the GNU General Public License ++ along with this program; if not, write to the Free Software ++ Foundation, Inc., 59 Temple Place - Suite 330, ++ Boston, MA 02111-1307, USA. */ ++ ++/* As a special exception, when this file is copied by Bison into a ++ Bison output file, you may use that output file without restriction. ++ This special exception was added by the Free Software Foundation ++ in version 1.24 of Bison. */ ++ ++/* Written by Richard Stallman by simplifying the original so called ++ ``semantic'' parser. */ ++ ++/* All symbols defined below should begin with yy or YY, to avoid ++ infringing on user name space. This should be done even for local ++ variables, as they might otherwise be expanded by user macros. ++ There are some unavoidable exceptions within include files to ++ define necessary library symbols; they are noted "INFRINGES ON ++ USER NAME SPACE" below. */ ++ ++/* Identify Bison output. */ ++#define YYBISON 1 ++ ++/* Skeleton name. */ ++#define YYSKELETON_NAME "yacc.c" ++ ++/* Pure parsers. */ ++#define YYPURE 0 ++ ++/* Using locations. */ ++#define YYLSP_NEEDED 0 ++ ++/* If NAME_PREFIX is specified substitute the variables and functions ++ names. */ ++#define yyparse zconfparse ++#define yylex zconflex ++#define yyerror zconferror ++#define yylval zconflval ++#define yychar zconfchar ++#define yydebug zconfdebug ++#define yynerrs zconfnerrs ++ ++ ++/* Tokens. */ ++#ifndef YYTOKENTYPE ++# define YYTOKENTYPE ++ /* Put the tokens into the symbol table, so that GDB and other debuggers ++ know about them. */ ++ enum yytokentype { ++ T_MAINMENU = 258, ++ T_MENU = 259, ++ T_ENDMENU = 260, ++ T_SOURCE = 261, ++ T_CHOICE = 262, ++ T_ENDCHOICE = 263, ++ T_COMMENT = 264, ++ T_CONFIG = 265, ++ T_MENUCONFIG = 266, ++ T_HELP = 267, ++ T_HELPTEXT = 268, ++ T_IF = 269, ++ T_ENDIF = 270, ++ T_DEPENDS = 271, ++ T_REQUIRES = 272, ++ T_OPTIONAL = 273, ++ T_PROMPT = 274, ++ T_DEFAULT = 275, ++ T_TRISTATE = 276, ++ T_DEF_TRISTATE = 277, ++ T_BOOLEAN = 278, ++ T_DEF_BOOLEAN = 279, ++ T_STRING = 280, ++ T_INT = 281, ++ T_HEX = 282, ++ T_WORD = 283, ++ T_WORD_QUOTE = 284, ++ T_UNEQUAL = 285, ++ T_EOF = 286, ++ T_EOL = 287, ++ T_CLOSE_PAREN = 288, ++ T_OPEN_PAREN = 289, ++ T_ON = 290, ++ T_SELECT = 291, ++ T_RANGE = 292, ++ T_OR = 293, ++ T_AND = 294, ++ T_EQUAL = 295, ++ T_NOT = 296 ++ }; ++#endif ++#define T_MAINMENU 258 ++#define T_MENU 259 ++#define T_ENDMENU 260 ++#define T_SOURCE 261 ++#define T_CHOICE 262 ++#define T_ENDCHOICE 263 ++#define T_COMMENT 264 ++#define T_CONFIG 265 ++#define T_MENUCONFIG 266 ++#define T_HELP 267 ++#define T_HELPTEXT 268 ++#define T_IF 269 ++#define T_ENDIF 270 ++#define T_DEPENDS 271 ++#define T_REQUIRES 272 ++#define T_OPTIONAL 273 ++#define T_PROMPT 274 ++#define T_DEFAULT 275 ++#define T_TRISTATE 276 ++#define T_DEF_TRISTATE 277 ++#define T_BOOLEAN 278 ++#define T_DEF_BOOLEAN 279 ++#define T_STRING 280 ++#define T_INT 281 ++#define T_HEX 282 ++#define T_WORD 283 ++#define T_WORD_QUOTE 284 ++#define T_UNEQUAL 285 ++#define T_EOF 286 ++#define T_EOL 287 ++#define T_CLOSE_PAREN 288 ++#define T_OPEN_PAREN 289 ++#define T_ON 290 ++#define T_SELECT 291 ++#define T_RANGE 292 ++#define T_OR 293 ++#define T_AND 294 ++#define T_EQUAL 295 ++#define T_NOT 296 ++ ++ ++ ++ ++/* Copy the first part of user declarations. */ ++ ++ ++/* ++ * Copyright (C) 2002 Roman Zippel ++ * Released under the terms of the GNU GPL v2.0. ++ */ ++ ++#include ++#include ++#include ++#include ++#include ++#include ++ ++#define printd(mask, fmt...) if (cdebug & (mask)) printf(fmt) ++ ++#define PRINTD 0x0001 ++#define DEBUG_PARSE 0x0002 ++ ++int cdebug = PRINTD; ++ ++extern int zconflex(void); ++static void zconfprint(const char *err, ...); ++static void zconferror(const char *err); ++static bool zconf_endtoken(int token, int starttoken, int endtoken); ++ ++struct symbol *symbol_hash[257]; ++ ++static struct menu *current_menu, *current_entry; ++ ++#define YYERROR_VERBOSE ++ ++ ++/* Enabling traces. */ ++#ifndef YYDEBUG ++# define YYDEBUG 0 ++#endif ++ ++/* Enabling verbose error messages. */ ++#ifdef YYERROR_VERBOSE ++# undef YYERROR_VERBOSE ++# define YYERROR_VERBOSE 1 ++#else ++# define YYERROR_VERBOSE 0 ++#endif ++ ++#if ! defined (YYSTYPE) && ! defined (YYSTYPE_IS_DECLARED) ++ ++typedef union YYSTYPE { ++ int token; ++ char *string; ++ struct symbol *symbol; ++ struct expr *expr; ++ struct menu *menu; ++} YYSTYPE; ++/* Line 191 of yacc.c. */ ++ ++# define yystype YYSTYPE /* obsolescent; will be withdrawn */ ++# define YYSTYPE_IS_DECLARED 1 ++# define YYSTYPE_IS_TRIVIAL 1 ++#endif ++ ++ ++ ++/* Copy the second part of user declarations. */ ++ ++ ++#define LKC_DIRECT_LINK ++#include "lkc.h" ++ ++ ++/* Line 214 of yacc.c. */ ++ ++ ++#if ! defined (yyoverflow) || YYERROR_VERBOSE ++ ++/* The parser invokes alloca or malloc; define the necessary symbols. */ ++ ++# if YYSTACK_USE_ALLOCA ++# define YYSTACK_ALLOC alloca ++# else ++# ifndef YYSTACK_USE_ALLOCA ++# if defined (alloca) || (defined (_ALLOCA_H) && defined (__GNUC__)) ++# define YYSTACK_ALLOC alloca ++# else ++# ifdef __GNUC__ ++# define YYSTACK_ALLOC __builtin_alloca ++# endif ++# endif ++# endif ++# endif ++ ++# ifdef YYSTACK_ALLOC ++ /* Pacify GCC's `empty if-body' warning. */ ++# define YYSTACK_FREE(Ptr) do { /* empty */; } while (0) ++# else ++# if defined (__STDC__) || defined (__cplusplus) ++# include /* INFRINGES ON USER NAME SPACE */ ++# define YYSIZE_T size_t ++# endif ++# define YYSTACK_ALLOC malloc ++# define YYSTACK_FREE free ++# endif ++#endif /* ! defined (yyoverflow) || YYERROR_VERBOSE */ ++ ++ ++#if (! defined (yyoverflow) \ ++ && (! defined (__cplusplus) \ ++ || (YYSTYPE_IS_TRIVIAL))) ++ ++/* A type that is properly aligned for any stack member. */ ++union yyalloc ++{ ++ short yyss; ++ YYSTYPE yyvs; ++ }; ++ ++/* The size of the maximum gap between one aligned stack and the next. */ ++# define YYSTACK_GAP_MAXIMUM (sizeof (union yyalloc) - 1) ++ ++/* The size of an array large to enough to hold all stacks, each with ++ N elements. */ ++# define YYSTACK_BYTES(N) \ ++ ((N) * (sizeof (short) + sizeof (YYSTYPE)) \ ++ + YYSTACK_GAP_MAXIMUM) ++ ++/* Copy COUNT objects from FROM to TO. The source and destination do ++ not overlap. */ ++# ifndef YYCOPY ++# if 1 < __GNUC__ ++# define YYCOPY(To, From, Count) \ ++ __builtin_memcpy (To, From, (Count) * sizeof (*(From))) ++# else ++# define YYCOPY(To, From, Count) \ ++ do \ ++ { \ ++ register YYSIZE_T yyi; \ ++ for (yyi = 0; yyi < (Count); yyi++) \ ++ (To)[yyi] = (From)[yyi]; \ ++ } \ ++ while (0) ++# endif ++# endif ++ ++/* Relocate STACK from its old location to the new one. The ++ local variables YYSIZE and YYSTACKSIZE give the old and new number of ++ elements in the stack, and YYPTR gives the new location of the ++ stack. Advance YYPTR to a properly aligned location for the next ++ stack. */ ++# define YYSTACK_RELOCATE(Stack) \ ++ do \ ++ { \ ++ YYSIZE_T yynewbytes; \ ++ YYCOPY (&yyptr->Stack, Stack, yysize); \ ++ Stack = &yyptr->Stack; \ ++ yynewbytes = yystacksize * sizeof (*Stack) + YYSTACK_GAP_MAXIMUM; \ ++ yyptr += yynewbytes / sizeof (*yyptr); \ ++ } \ ++ while (0) ++ ++#endif ++ ++#if defined (__STDC__) || defined (__cplusplus) ++ typedef signed char yysigned_char; ++#else ++ typedef short yysigned_char; ++#endif ++ ++/* YYFINAL -- State number of the termination state. */ ++#define YYFINAL 2 ++/* YYLAST -- Last index in YYTABLE. */ ++#define YYLAST 201 ++ ++/* YYNTOKENS -- Number of terminals. */ ++#define YYNTOKENS 42 ++/* YYNNTS -- Number of nonterminals. */ ++#define YYNNTS 41 ++/* YYNRULES -- Number of rules. */ ++#define YYNRULES 104 ++/* YYNRULES -- Number of states. */ ++#define YYNSTATES 182 ++ ++/* YYTRANSLATE(YYLEX) -- Bison symbol number corresponding to YYLEX. */ ++#define YYUNDEFTOK 2 ++#define YYMAXUTOK 296 ++ ++#define YYTRANSLATE(YYX) \ ++ ((unsigned int) (YYX) <= YYMAXUTOK ? yytranslate[YYX] : YYUNDEFTOK) ++ ++/* YYTRANSLATE[YYLEX] -- Bison symbol number corresponding to YYLEX. */ ++static const unsigned char yytranslate[] = ++{ ++ 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, ++ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, ++ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, ++ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, ++ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, ++ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, ++ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, ++ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, ++ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, ++ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, ++ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, ++ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, ++ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, ++ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, ++ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, ++ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, ++ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, ++ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, ++ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, ++ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, ++ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, ++ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, ++ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, ++ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, ++ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, ++ 2, 2, 2, 2, 2, 2, 1, 2, 3, 4, ++ 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, ++ 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, ++ 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, ++ 35, 36, 37, 38, 39, 40, 41 ++}; ++ ++#if YYDEBUG ++/* YYPRHS[YYN] -- Index of the first RHS symbol of rule number YYN in ++ YYRHS. */ ++static const unsigned short yyprhs[] = ++{ ++ 0, 0, 3, 4, 7, 9, 11, 13, 17, 19, ++ 21, 23, 26, 28, 30, 32, 34, 36, 38, 42, ++ 45, 49, 52, 53, 56, 59, 62, 65, 69, 74, ++ 78, 83, 87, 91, 95, 100, 105, 110, 116, 119, ++ 122, 124, 128, 131, 132, 135, 138, 141, 144, 149, ++ 153, 157, 160, 165, 166, 169, 173, 175, 179, 182, ++ 183, 186, 189, 192, 196, 199, 201, 205, 208, 209, ++ 212, 215, 218, 222, 226, 228, 232, 235, 238, 241, ++ 242, 245, 248, 253, 257, 261, 262, 265, 267, 269, ++ 272, 275, 278, 280, 282, 283, 286, 288, 292, 296, ++ 300, 303, 307, 311, 313 ++}; ++ ++/* YYRHS -- A `-1'-separated list of the rules' RHS. */ ++static const yysigned_char yyrhs[] = ++{ ++ 43, 0, -1, -1, 43, 44, -1, 45, -1, 55, ++ -1, 66, -1, 3, 77, 79, -1, 5, -1, 15, ++ -1, 8, -1, 1, 79, -1, 61, -1, 71, -1, ++ 47, -1, 49, -1, 69, -1, 79, -1, 10, 28, ++ 32, -1, 46, 50, -1, 11, 28, 32, -1, 48, ++ 50, -1, -1, 50, 51, -1, 50, 75, -1, 50, ++ 73, -1, 50, 32, -1, 21, 76, 32, -1, 22, ++ 81, 80, 32, -1, 23, 76, 32, -1, 24, 81, ++ 80, 32, -1, 26, 76, 32, -1, 27, 76, 32, ++ -1, 25, 76, 32, -1, 19, 77, 80, 32, -1, ++ 20, 81, 80, 32, -1, 36, 28, 80, 32, -1, ++ 37, 82, 82, 80, 32, -1, 7, 32, -1, 52, ++ 56, -1, 78, -1, 53, 58, 54, -1, 53, 58, ++ -1, -1, 56, 57, -1, 56, 75, -1, 56, 73, ++ -1, 56, 32, -1, 19, 77, 80, 32, -1, 21, ++ 76, 32, -1, 23, 76, 32, -1, 18, 32, -1, ++ 20, 28, 80, 32, -1, -1, 58, 45, -1, 14, ++ 81, 32, -1, 78, -1, 59, 62, 60, -1, 59, ++ 62, -1, -1, 62, 45, -1, 62, 66, -1, 62, ++ 55, -1, 4, 77, 32, -1, 63, 74, -1, 78, ++ -1, 64, 67, 65, -1, 64, 67, -1, -1, 67, ++ 45, -1, 67, 66, -1, 67, 55, -1, 67, 1, ++ 32, -1, 6, 77, 32, -1, 68, -1, 9, 77, ++ 32, -1, 70, 74, -1, 12, 32, -1, 72, 13, ++ -1, -1, 74, 75, -1, 74, 32, -1, 16, 35, ++ 81, 32, -1, 16, 81, 32, -1, 17, 81, 32, ++ -1, -1, 77, 80, -1, 28, -1, 29, -1, 5, ++ 79, -1, 8, 79, -1, 15, 79, -1, 32, -1, ++ 31, -1, -1, 14, 81, -1, 82, -1, 82, 40, ++ 82, -1, 82, 30, 82, -1, 34, 81, 33, -1, ++ 41, 81, -1, 81, 38, 81, -1, 81, 39, 81, ++ -1, 28, -1, 29, -1 ++}; ++ ++/* YYRLINE[YYN] -- source line where rule number YYN was defined. */ ++static const unsigned short yyrline[] = ++{ ++ 0, 94, 94, 95, 98, 99, 100, 101, 102, 103, ++ 104, 105, 109, 110, 111, 112, 113, 114, 120, 128, ++ 134, 142, 152, 154, 155, 156, 157, 160, 166, 173, ++ 179, 186, 192, 198, 204, 210, 216, 222, 230, 239, ++ 245, 254, 255, 261, 263, 264, 265, 266, 269, 275, ++ 281, 287, 293, 299, 301, 306, 315, 324, 325, 331, ++ 333, 334, 335, 340, 347, 353, 362, 363, 369, 371, ++ 372, 373, 374, 377, 383, 390, 397, 404, 410, 417, ++ 418, 419, 422, 427, 432, 440, 442, 447, 448, 451, ++ 452, 453, 457, 457, 459, 460, 463, 464, 465, 466, ++ 467, 468, 469, 472, 473 ++}; ++#endif ++ ++#if YYDEBUG || YYERROR_VERBOSE ++/* YYTNME[SYMBOL-NUM] -- String name of the symbol SYMBOL-NUM. ++ First, the terminals, then, starting at YYNTOKENS, nonterminals. */ ++static const char *const yytname[] = ++{ ++ "$end", "error", "$undefined", "T_MAINMENU", "T_MENU", "T_ENDMENU", ++ "T_SOURCE", "T_CHOICE", "T_ENDCHOICE", "T_COMMENT", "T_CONFIG", ++ "T_MENUCONFIG", "T_HELP", "T_HELPTEXT", "T_IF", "T_ENDIF", "T_DEPENDS", ++ "T_REQUIRES", "T_OPTIONAL", "T_PROMPT", "T_DEFAULT", "T_TRISTATE", ++ "T_DEF_TRISTATE", "T_BOOLEAN", "T_DEF_BOOLEAN", "T_STRING", "T_INT", ++ "T_HEX", "T_WORD", "T_WORD_QUOTE", "T_UNEQUAL", "T_EOF", "T_EOL", ++ "T_CLOSE_PAREN", "T_OPEN_PAREN", "T_ON", "T_SELECT", "T_RANGE", "T_OR", ++ "T_AND", "T_EQUAL", "T_NOT", "$accept", "input", "block", ++ "common_block", "config_entry_start", "config_stmt", ++ "menuconfig_entry_start", "menuconfig_stmt", "config_option_list", ++ "config_option", "choice", "choice_entry", "choice_end", "choice_stmt", ++ "choice_option_list", "choice_option", "choice_block", "if", "if_end", ++ "if_stmt", "if_block", "menu", "menu_entry", "menu_end", "menu_stmt", ++ "menu_block", "source", "source_stmt", "comment", "comment_stmt", ++ "help_start", "help", "depends_list", "depends", "prompt_stmt_opt", ++ "prompt", "end", "nl_or_eof", "if_expr", "expr", "symbol", 0 ++}; ++#endif ++ ++# ifdef YYPRINT ++/* YYTOKNUM[YYLEX-NUM] -- Internal token number corresponding to ++ token YYLEX-NUM. */ ++static const unsigned short yytoknum[] = ++{ ++ 0, 256, 257, 258, 259, 260, 261, 262, 263, 264, ++ 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, ++ 275, 276, 277, 278, 279, 280, 281, 282, 283, 284, ++ 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, ++ 295, 296 ++}; ++# endif ++ ++/* YYR1[YYN] -- Symbol number of symbol that rule YYN derives. */ ++static const unsigned char yyr1[] = ++{ ++ 0, 42, 43, 43, 44, 44, 44, 44, 44, 44, ++ 44, 44, 45, 45, 45, 45, 45, 45, 46, 47, ++ 48, 49, 50, 50, 50, 50, 50, 51, 51, 51, ++ 51, 51, 51, 51, 51, 51, 51, 51, 52, 53, ++ 54, 55, 55, 56, 56, 56, 56, 56, 57, 57, ++ 57, 57, 57, 58, 58, 59, 60, 61, 61, 62, ++ 62, 62, 62, 63, 64, 65, 66, 66, 67, 67, ++ 67, 67, 67, 68, 69, 70, 71, 72, 73, 74, ++ 74, 74, 75, 75, 75, 76, 76, 77, 77, 78, ++ 78, 78, 79, 79, 80, 80, 81, 81, 81, 81, ++ 81, 81, 81, 82, 82 ++}; ++ ++/* YYR2[YYN] -- Number of symbols composing right hand side of rule YYN. */ ++static const unsigned char yyr2[] = ++{ ++ 0, 2, 0, 2, 1, 1, 1, 3, 1, 1, ++ 1, 2, 1, 1, 1, 1, 1, 1, 3, 2, ++ 3, 2, 0, 2, 2, 2, 2, 3, 4, 3, ++ 4, 3, 3, 3, 4, 4, 4, 5, 2, 2, ++ 1, 3, 2, 0, 2, 2, 2, 2, 4, 3, ++ 3, 2, 4, 0, 2, 3, 1, 3, 2, 0, ++ 2, 2, 2, 3, 2, 1, 3, 2, 0, 2, ++ 2, 2, 3, 3, 1, 3, 2, 2, 2, 0, ++ 2, 2, 4, 3, 3, 0, 2, 1, 1, 2, ++ 2, 2, 1, 1, 0, 2, 1, 3, 3, 3, ++ 2, 3, 3, 1, 1 ++}; ++ ++/* YYDEFACT[STATE-NAME] -- Default rule to reduce with in state ++ STATE-NUM when YYTABLE doesn't specify something else to do. Zero ++ means the default is an error. */ ++static const unsigned char yydefact[] = ++{ ++ 2, 0, 1, 0, 0, 0, 8, 0, 0, 10, ++ 0, 0, 0, 0, 9, 93, 92, 3, 4, 22, ++ 14, 22, 15, 43, 53, 5, 59, 12, 79, 68, ++ 6, 74, 16, 79, 13, 17, 11, 87, 88, 0, ++ 0, 0, 38, 0, 0, 0, 103, 104, 0, 0, ++ 0, 96, 19, 21, 39, 42, 58, 64, 0, 76, ++ 7, 63, 73, 75, 18, 20, 0, 100, 55, 0, ++ 0, 0, 0, 0, 0, 0, 0, 0, 85, 0, ++ 85, 0, 85, 85, 85, 26, 0, 0, 23, 0, ++ 25, 24, 0, 0, 0, 85, 85, 47, 44, 46, ++ 45, 0, 0, 0, 54, 41, 40, 60, 62, 57, ++ 61, 56, 81, 80, 0, 69, 71, 66, 70, 65, ++ 99, 101, 102, 98, 97, 77, 0, 0, 0, 94, ++ 94, 0, 94, 94, 0, 94, 0, 0, 0, 94, ++ 0, 78, 51, 94, 94, 0, 0, 89, 90, 91, ++ 72, 0, 83, 84, 0, 0, 0, 27, 86, 0, ++ 29, 0, 33, 31, 32, 0, 94, 0, 0, 49, ++ 50, 82, 95, 34, 35, 28, 30, 36, 0, 48, ++ 52, 37 ++}; ++ ++/* YYDEFGOTO[NTERM-NUM]. */ ++static const short yydefgoto[] = ++{ ++ -1, 1, 17, 18, 19, 20, 21, 22, 52, 88, ++ 23, 24, 105, 25, 54, 98, 55, 26, 109, 27, ++ 56, 28, 29, 117, 30, 58, 31, 32, 33, 34, ++ 89, 90, 57, 91, 131, 132, 106, 35, 155, 50, ++ 51 ++}; ++ ++/* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing ++ STATE-NUM. */ ++#define YYPACT_NINF -99 ++static const short yypact[] = ++{ ++ -99, 48, -99, 38, 46, 46, -99, 46, -29, -99, ++ 46, -17, -3, -11, -99, -99, -99, -99, -99, -99, ++ -99, -99, -99, -99, -99, -99, -99, -99, -99, -99, ++ -99, -99, -99, -99, -99, -99, -99, -99, -99, 38, ++ 12, 15, -99, 18, 51, 62, -99, -99, -11, -11, ++ 4, -24, 138, 138, 160, 121, 110, -4, 81, -4, ++ -99, -99, -99, -99, -99, -99, -19, -99, -99, -11, ++ -11, 70, 70, 73, 32, -11, 46, -11, 46, -11, ++ 46, -11, 46, 46, 46, -99, 36, 70, -99, 95, ++ -99, -99, 96, 46, 106, 46, 46, -99, -99, -99, ++ -99, 38, 38, 38, -99, -99, -99, -99, -99, -99, ++ -99, -99, -99, -99, 112, -99, -99, -99, -99, -99, ++ -99, 117, -99, -99, -99, -99, -11, 33, 65, 131, ++ 1, 119, 131, 1, 136, 1, 153, 154, 155, 131, ++ 70, -99, -99, 131, 131, 156, 157, -99, -99, -99, ++ -99, 101, -99, -99, -11, 158, 159, -99, -99, 161, ++ -99, 162, -99, -99, -99, 163, 131, 164, 165, -99, ++ -99, -99, 99, -99, -99, -99, -99, -99, 166, -99, ++ -99, -99 ++}; ++ ++/* YYPGOTO[NTERM-NUM]. */ ++static const short yypgoto[] = ++{ ++ -99, -99, -99, 111, -99, -99, -99, -99, 178, -99, ++ -99, -99, -99, 91, -99, -99, -99, -99, -99, -99, ++ -99, -99, -99, -99, 115, -99, -99, -99, -99, -99, ++ -99, 146, 168, 89, 27, 0, 126, -1, -98, -48, ++ -63 ++}; ++ ++/* YYTABLE[YYPACT[STATE-NUM]]. What to do in state STATE-NUM. If ++ positive, shift that token. If negative, reduce the rule which ++ number is the opposite. If zero, do what YYDEFACT says. ++ If YYTABLE_NINF, syntax error. */ ++#define YYTABLE_NINF -68 ++static const short yytable[] = ++{ ++ 66, 67, 36, 42, 39, 40, 71, 41, 123, 124, ++ 43, 44, 74, 75, 120, 154, 72, 46, 47, 69, ++ 70, 121, 122, 48, 140, 45, 127, 128, 112, 130, ++ 49, 133, 156, 135, 158, 159, 68, 161, 60, 69, ++ 70, 165, 69, 70, 61, 167, 168, 62, 2, 3, ++ 63, 4, 5, 6, 7, 8, 9, 10, 11, 12, ++ 46, 47, 13, 14, 139, 152, 48, 126, 178, 15, ++ 16, 69, 70, 49, 37, 38, 129, 166, 151, 15, ++ 16, -67, 114, 64, -67, 5, 101, 7, 8, 102, ++ 10, 11, 12, 143, 65, 13, 103, 153, 46, 47, ++ 147, 148, 149, 69, 70, 125, 172, 134, 141, 136, ++ 137, 138, 15, 16, 5, 101, 7, 8, 102, 10, ++ 11, 12, 145, 146, 13, 103, 101, 7, 142, 102, ++ 10, 11, 12, 171, 144, 13, 103, 69, 70, 69, ++ 70, 15, 16, 100, 150, 154, 113, 108, 113, 116, ++ 73, 157, 15, 16, 74, 75, 70, 76, 77, 78, ++ 79, 80, 81, 82, 83, 84, 104, 107, 160, 115, ++ 85, 110, 73, 118, 86, 87, 74, 75, 92, 93, ++ 94, 95, 111, 96, 119, 162, 163, 164, 169, 170, ++ 173, 174, 97, 175, 176, 177, 179, 180, 181, 53, ++ 99, 59 ++}; ++ ++static const unsigned char yycheck[] = ++{ ++ 48, 49, 3, 32, 4, 5, 30, 7, 71, 72, ++ 10, 28, 16, 17, 33, 14, 40, 28, 29, 38, ++ 39, 69, 70, 34, 87, 28, 74, 75, 32, 77, ++ 41, 79, 130, 81, 132, 133, 32, 135, 39, 38, ++ 39, 139, 38, 39, 32, 143, 144, 32, 0, 1, ++ 32, 3, 4, 5, 6, 7, 8, 9, 10, 11, ++ 28, 29, 14, 15, 28, 32, 34, 35, 166, 31, ++ 32, 38, 39, 41, 28, 29, 76, 140, 126, 31, ++ 32, 0, 1, 32, 3, 4, 5, 6, 7, 8, ++ 9, 10, 11, 93, 32, 14, 15, 32, 28, 29, ++ 101, 102, 103, 38, 39, 32, 154, 80, 13, 82, ++ 83, 84, 31, 32, 4, 5, 6, 7, 8, 9, ++ 10, 11, 95, 96, 14, 15, 5, 6, 32, 8, ++ 9, 10, 11, 32, 28, 14, 15, 38, 39, 38, ++ 39, 31, 32, 54, 32, 14, 57, 56, 59, 58, ++ 12, 32, 31, 32, 16, 17, 39, 19, 20, 21, ++ 22, 23, 24, 25, 26, 27, 55, 56, 32, 58, ++ 32, 56, 12, 58, 36, 37, 16, 17, 18, 19, ++ 20, 21, 56, 23, 58, 32, 32, 32, 32, 32, ++ 32, 32, 32, 32, 32, 32, 32, 32, 32, 21, ++ 54, 33 ++}; ++ ++/* YYSTOS[STATE-NUM] -- The (internal number of the) accessing ++ symbol of state STATE-NUM. */ ++static const unsigned char yystos[] = ++{ ++ 0, 43, 0, 1, 3, 4, 5, 6, 7, 8, ++ 9, 10, 11, 14, 15, 31, 32, 44, 45, 46, ++ 47, 48, 49, 52, 53, 55, 59, 61, 63, 64, ++ 66, 68, 69, 70, 71, 79, 79, 28, 29, 77, ++ 77, 77, 32, 77, 28, 28, 28, 29, 34, 41, ++ 81, 82, 50, 50, 56, 58, 62, 74, 67, 74, ++ 79, 32, 32, 32, 32, 32, 81, 81, 32, 38, ++ 39, 30, 40, 12, 16, 17, 19, 20, 21, 22, ++ 23, 24, 25, 26, 27, 32, 36, 37, 51, 72, ++ 73, 75, 18, 19, 20, 21, 23, 32, 57, 73, ++ 75, 5, 8, 15, 45, 54, 78, 45, 55, 60, ++ 66, 78, 32, 75, 1, 45, 55, 65, 66, 78, ++ 33, 81, 81, 82, 82, 32, 35, 81, 81, 77, ++ 81, 76, 77, 81, 76, 81, 76, 76, 76, 28, ++ 82, 13, 32, 77, 28, 76, 76, 79, 79, 79, ++ 32, 81, 32, 32, 14, 80, 80, 32, 80, 80, ++ 32, 80, 32, 32, 32, 80, 82, 80, 80, 32, ++ 32, 32, 81, 32, 32, 32, 32, 32, 80, 32, ++ 32, 32 ++}; ++ ++#if ! defined (YYSIZE_T) && defined (__SIZE_TYPE__) ++# define YYSIZE_T __SIZE_TYPE__ ++#endif ++#if ! defined (YYSIZE_T) && defined (size_t) ++# define YYSIZE_T size_t ++#endif ++#if ! defined (YYSIZE_T) ++# if defined (__STDC__) || defined (__cplusplus) ++# include /* INFRINGES ON USER NAME SPACE */ ++# define YYSIZE_T size_t ++# endif ++#endif ++#if ! defined (YYSIZE_T) ++# define YYSIZE_T unsigned int ++#endif ++ ++#define yyerrok (yyerrstatus = 0) ++#define yyclearin (yychar = YYEMPTY) ++#define YYEMPTY (-2) ++#define YYEOF 0 ++ ++#define YYACCEPT goto yyacceptlab ++#define YYABORT goto yyabortlab ++#define YYERROR goto yyerrlab1 ++ ++ ++/* Like YYERROR except do call yyerror. This remains here temporarily ++ to ease the transition to the new meaning of YYERROR, for GCC. ++ Once GCC version 2 has supplanted version 1, this can go. */ ++ ++#define YYFAIL goto yyerrlab ++ ++#define YYRECOVERING() (!!yyerrstatus) ++ ++#define YYBACKUP(Token, Value) \ ++do \ ++ if (yychar == YYEMPTY && yylen == 1) \ ++ { \ ++ yychar = (Token); \ ++ yylval = (Value); \ ++ yytoken = YYTRANSLATE (yychar); \ ++ YYPOPSTACK; \ ++ goto yybackup; \ ++ } \ ++ else \ ++ { \ ++ yyerror ("syntax error: cannot back up");\ ++ YYERROR; \ ++ } \ ++while (0) ++ ++#define YYTERROR 1 ++#define YYERRCODE 256 ++ ++/* YYLLOC_DEFAULT -- Compute the default location (before the actions ++ are run). */ ++ ++#ifndef YYLLOC_DEFAULT ++# define YYLLOC_DEFAULT(Current, Rhs, N) \ ++ Current.first_line = Rhs[1].first_line; \ ++ Current.first_column = Rhs[1].first_column; \ ++ Current.last_line = Rhs[N].last_line; \ ++ Current.last_column = Rhs[N].last_column; ++#endif ++ ++/* YYLEX -- calling `yylex' with the right arguments. */ ++ ++#ifdef YYLEX_PARAM ++# define YYLEX yylex (YYLEX_PARAM) ++#else ++# define YYLEX yylex () ++#endif ++ ++/* Enable debugging if requested. */ ++#if YYDEBUG ++ ++# ifndef YYFPRINTF ++# include /* INFRINGES ON USER NAME SPACE */ ++# define YYFPRINTF fprintf ++# endif ++ ++# define YYDPRINTF(Args) \ ++do { \ ++ if (yydebug) \ ++ YYFPRINTF Args; \ ++} while (0) ++ ++# define YYDSYMPRINT(Args) \ ++do { \ ++ if (yydebug) \ ++ yysymprint Args; \ ++} while (0) ++ ++# define YYDSYMPRINTF(Title, Token, Value, Location) \ ++do { \ ++ if (yydebug) \ ++ { \ ++ YYFPRINTF (stderr, "%s ", Title); \ ++ yysymprint (stderr, \ ++ Token, Value); \ ++ YYFPRINTF (stderr, "\n"); \ ++ } \ ++} while (0) ++ ++/*------------------------------------------------------------------. ++| yy_stack_print -- Print the state stack from its BOTTOM up to its | ++| TOP (cinluded). | ++`------------------------------------------------------------------*/ ++ ++#if defined (__STDC__) || defined (__cplusplus) ++static void ++yy_stack_print (short *bottom, short *top) ++#else ++static void ++yy_stack_print (bottom, top) ++ short *bottom; ++ short *top; ++#endif ++{ ++ YYFPRINTF (stderr, "Stack now"); ++ for (/* Nothing. */; bottom <= top; ++bottom) ++ YYFPRINTF (stderr, " %d", *bottom); ++ YYFPRINTF (stderr, "\n"); ++} ++ ++# define YY_STACK_PRINT(Bottom, Top) \ ++do { \ ++ if (yydebug) \ ++ yy_stack_print ((Bottom), (Top)); \ ++} while (0) ++ ++ ++/*------------------------------------------------. ++| Report that the YYRULE is going to be reduced. | ++`------------------------------------------------*/ ++ ++#if defined (__STDC__) || defined (__cplusplus) ++static void ++yy_reduce_print (int yyrule) ++#else ++static void ++yy_reduce_print (yyrule) ++ int yyrule; ++#endif ++{ ++ int yyi; ++ unsigned int yylineno = yyrline[yyrule]; ++ YYFPRINTF (stderr, "Reducing stack by rule %d (line %u), ", ++ yyrule - 1, yylineno); ++ /* Print the symbols being reduced, and their result. */ ++ for (yyi = yyprhs[yyrule]; 0 <= yyrhs[yyi]; yyi++) ++ YYFPRINTF (stderr, "%s ", yytname [yyrhs[yyi]]); ++ YYFPRINTF (stderr, "-> %s\n", yytname [yyr1[yyrule]]); ++} ++ ++# define YY_REDUCE_PRINT(Rule) \ ++do { \ ++ if (yydebug) \ ++ yy_reduce_print (Rule); \ ++} while (0) ++ ++/* Nonzero means print parse trace. It is left uninitialized so that ++ multiple parsers can coexist. */ ++int yydebug; ++#else /* !YYDEBUG */ ++# define YYDPRINTF(Args) ++# define YYDSYMPRINT(Args) ++# define YYDSYMPRINTF(Title, Token, Value, Location) ++# define YY_STACK_PRINT(Bottom, Top) ++# define YY_REDUCE_PRINT(Rule) ++#endif /* !YYDEBUG */ ++ ++ ++/* YYINITDEPTH -- initial size of the parser's stacks. */ ++#ifndef YYINITDEPTH ++# define YYINITDEPTH 200 ++#endif ++ ++/* YYMAXDEPTH -- maximum size the stacks can grow to (effective only ++ if the built-in stack extension method is used). ++ ++ Do not make this value too large; the results are undefined if ++ SIZE_MAX < YYSTACK_BYTES (YYMAXDEPTH) ++ evaluated with infinite-precision integer arithmetic. */ ++ ++#if YYMAXDEPTH == 0 ++# undef YYMAXDEPTH ++#endif ++ ++#ifndef YYMAXDEPTH ++# define YYMAXDEPTH 10000 ++#endif ++ ++ ++ ++#if YYERROR_VERBOSE ++ ++# ifndef yystrlen ++# if defined (__GLIBC__) && defined (_STRING_H) ++# define yystrlen strlen ++# else ++/* Return the length of YYSTR. */ ++static YYSIZE_T ++# if defined (__STDC__) || defined (__cplusplus) ++yystrlen (const char *yystr) ++# else ++yystrlen (yystr) ++ const char *yystr; ++# endif ++{ ++ register const char *yys = yystr; ++ ++ while (*yys++ != '\0') ++ continue; ++ ++ return yys - yystr - 1; ++} ++# endif ++# endif ++ ++# ifndef yystpcpy ++# if defined (__GLIBC__) && defined (_STRING_H) && defined (_GNU_SOURCE) ++# define yystpcpy stpcpy ++# else ++/* Copy YYSRC to YYDEST, returning the address of the terminating '\0' in ++ YYDEST. */ ++static char * ++# if defined (__STDC__) || defined (__cplusplus) ++yystpcpy (char *yydest, const char *yysrc) ++# else ++yystpcpy (yydest, yysrc) ++ char *yydest; ++ const char *yysrc; ++# endif ++{ ++ register char *yyd = yydest; ++ register const char *yys = yysrc; ++ ++ while ((*yyd++ = *yys++) != '\0') ++ continue; ++ ++ return yyd - 1; ++} ++# endif ++# endif ++ ++#endif /* !YYERROR_VERBOSE */ ++ ++ ++ ++#if YYDEBUG ++/*--------------------------------. ++| Print this symbol on YYOUTPUT. | ++`--------------------------------*/ ++ ++#if defined (__STDC__) || defined (__cplusplus) ++static void ++yysymprint (FILE *yyoutput, int yytype, YYSTYPE *yyvaluep) ++#else ++static void ++yysymprint (yyoutput, yytype, yyvaluep) ++ FILE *yyoutput; ++ int yytype; ++ YYSTYPE *yyvaluep; ++#endif ++{ ++ /* Pacify ``unused variable'' warnings. */ ++ (void) yyvaluep; ++ ++ if (yytype < YYNTOKENS) ++ { ++ YYFPRINTF (yyoutput, "token %s (", yytname[yytype]); ++# ifdef YYPRINT ++ YYPRINT (yyoutput, yytoknum[yytype], *yyvaluep); ++# endif ++ } ++ else ++ YYFPRINTF (yyoutput, "nterm %s (", yytname[yytype]); ++ ++ switch (yytype) ++ { ++ default: ++ break; ++ } ++ YYFPRINTF (yyoutput, ")"); ++} ++ ++#endif /* ! YYDEBUG */ ++/*-----------------------------------------------. ++| Release the memory associated to this symbol. | ++`-----------------------------------------------*/ ++ ++#if defined (__STDC__) || defined (__cplusplus) ++static void ++yydestruct (int yytype, YYSTYPE *yyvaluep) ++#else ++static void ++yydestruct (yytype, yyvaluep) ++ int yytype; ++ YYSTYPE *yyvaluep; ++#endif ++{ ++ /* Pacify ``unused variable'' warnings. */ ++ (void) yyvaluep; ++ ++ switch (yytype) ++ { ++ ++ default: ++ break; ++ } ++} ++ ++ ++/* Prevent warnings from -Wmissing-prototypes. */ ++ ++#ifdef YYPARSE_PARAM ++# if defined (__STDC__) || defined (__cplusplus) ++int yyparse (void *YYPARSE_PARAM); ++# else ++int yyparse (); ++# endif ++#else /* ! YYPARSE_PARAM */ ++#if defined (__STDC__) || defined (__cplusplus) ++int yyparse (void); ++#else ++int yyparse (); ++#endif ++#endif /* ! YYPARSE_PARAM */ ++ ++ ++ ++/* The lookahead symbol. */ ++int yychar; ++ ++/* The semantic value of the lookahead symbol. */ ++YYSTYPE yylval; ++ ++/* Number of syntax errors so far. */ ++int yynerrs; ++ ++ ++ ++/*----------. ++| yyparse. | ++`----------*/ ++ ++#ifdef YYPARSE_PARAM ++# if defined (__STDC__) || defined (__cplusplus) ++int yyparse (void *YYPARSE_PARAM) ++# else ++int yyparse (YYPARSE_PARAM) ++ void *YYPARSE_PARAM; ++# endif ++#else /* ! YYPARSE_PARAM */ ++#if defined (__STDC__) || defined (__cplusplus) ++int ++yyparse (void) ++#else ++int ++yyparse () ++ ++#endif ++#endif ++{ ++ ++ register int yystate; ++ register int yyn; ++ int yyresult; ++ /* Number of tokens to shift before error messages enabled. */ ++ int yyerrstatus; ++ /* Lookahead token as an internal (translated) token number. */ ++ int yytoken = 0; ++ ++ /* Three stacks and their tools: ++ `yyss': related to states, ++ `yyvs': related to semantic values, ++ `yyls': related to locations. ++ ++ Refer to the stacks thru separate pointers, to allow yyoverflow ++ to reallocate them elsewhere. */ ++ ++ /* The state stack. */ ++ short yyssa[YYINITDEPTH]; ++ short *yyss = yyssa; ++ register short *yyssp; ++ ++ /* The semantic value stack. */ ++ YYSTYPE yyvsa[YYINITDEPTH]; ++ YYSTYPE *yyvs = yyvsa; ++ register YYSTYPE *yyvsp; ++ ++ ++ ++#define YYPOPSTACK (yyvsp--, yyssp--) ++ ++ YYSIZE_T yystacksize = YYINITDEPTH; ++ ++ /* The variables used to return semantic value and location from the ++ action routines. */ ++ YYSTYPE yyval; ++ ++ ++ /* When reducing, the number of symbols on the RHS of the reduced ++ rule. */ ++ int yylen; ++ ++ YYDPRINTF ((stderr, "Starting parse\n")); ++ ++ yystate = 0; ++ yyerrstatus = 0; ++ yynerrs = 0; ++ yychar = YYEMPTY; /* Cause a token to be read. */ ++ ++ /* Initialize stack pointers. ++ Waste one element of value and location stack ++ so that they stay on the same level as the state stack. ++ The wasted elements are never initialized. */ ++ ++ yyssp = yyss; ++ yyvsp = yyvs; ++ ++ goto yysetstate; ++ ++/*------------------------------------------------------------. ++| yynewstate -- Push a new state, which is found in yystate. | ++`------------------------------------------------------------*/ ++ yynewstate: ++ /* In all cases, when you get here, the value and location stacks ++ have just been pushed. so pushing a state here evens the stacks. ++ */ ++ yyssp++; ++ ++ yysetstate: ++ *yyssp = yystate; ++ ++ if (yyss + yystacksize - 1 <= yyssp) ++ { ++ /* Get the current used size of the three stacks, in elements. */ ++ YYSIZE_T yysize = yyssp - yyss + 1; ++ ++#ifdef yyoverflow ++ { ++ /* Give user a chance to reallocate the stack. Use copies of ++ these so that the &'s don't force the real ones into ++ memory. */ ++ YYSTYPE *yyvs1 = yyvs; ++ short *yyss1 = yyss; ++ ++ ++ /* Each stack pointer address is followed by the size of the ++ data in use in that stack, in bytes. This used to be a ++ conditional around just the two extra args, but that might ++ be undefined if yyoverflow is a macro. */ ++ yyoverflow ("parser stack overflow", ++ &yyss1, yysize * sizeof (*yyssp), ++ &yyvs1, yysize * sizeof (*yyvsp), ++ ++ &yystacksize); ++ ++ yyss = yyss1; ++ yyvs = yyvs1; ++ } ++#else /* no yyoverflow */ ++# ifndef YYSTACK_RELOCATE ++ goto yyoverflowlab; ++# else ++ /* Extend the stack our own way. */ ++ if (YYMAXDEPTH <= yystacksize) ++ goto yyoverflowlab; ++ yystacksize *= 2; ++ if (YYMAXDEPTH < yystacksize) ++ yystacksize = YYMAXDEPTH; ++ ++ { ++ short *yyss1 = yyss; ++ union yyalloc *yyptr = ++ (union yyalloc *) YYSTACK_ALLOC (YYSTACK_BYTES (yystacksize)); ++ if (! yyptr) ++ goto yyoverflowlab; ++ YYSTACK_RELOCATE (yyss); ++ YYSTACK_RELOCATE (yyvs); ++ ++# undef YYSTACK_RELOCATE ++ if (yyss1 != yyssa) ++ YYSTACK_FREE (yyss1); ++ } ++# endif ++#endif /* no yyoverflow */ ++ ++ yyssp = yyss + yysize - 1; ++ yyvsp = yyvs + yysize - 1; ++ ++ ++ YYDPRINTF ((stderr, "Stack size increased to %lu\n", ++ (unsigned long int) yystacksize)); ++ ++ if (yyss + yystacksize - 1 <= yyssp) ++ YYABORT; ++ } ++ ++ YYDPRINTF ((stderr, "Entering state %d\n", yystate)); ++ ++ goto yybackup; ++ ++/*-----------. ++| yybackup. | ++`-----------*/ ++yybackup: ++ ++/* Do appropriate processing given the current state. */ ++/* Read a lookahead token if we need one and don't already have one. */ ++/* yyresume: */ ++ ++ /* First try to decide what to do without reference to lookahead token. */ ++ ++ yyn = yypact[yystate]; ++ if (yyn == YYPACT_NINF) ++ goto yydefault; ++ ++ /* Not known => get a lookahead token if don't already have one. */ ++ ++ /* YYCHAR is either YYEMPTY or YYEOF or a valid lookahead symbol. */ ++ if (yychar == YYEMPTY) ++ { ++ YYDPRINTF ((stderr, "Reading a token: ")); ++ yychar = YYLEX; ++ } ++ ++ if (yychar <= YYEOF) ++ { ++ yychar = yytoken = YYEOF; ++ YYDPRINTF ((stderr, "Now at end of input.\n")); ++ } ++ else ++ { ++ yytoken = YYTRANSLATE (yychar); ++ YYDSYMPRINTF ("Next token is", yytoken, &yylval, &yylloc); ++ } ++ ++ /* If the proper action on seeing token YYTOKEN is to reduce or to ++ detect an error, take that action. */ ++ yyn += yytoken; ++ if (yyn < 0 || YYLAST < yyn || yycheck[yyn] != yytoken) ++ goto yydefault; ++ yyn = yytable[yyn]; ++ if (yyn <= 0) ++ { ++ if (yyn == 0 || yyn == YYTABLE_NINF) ++ goto yyerrlab; ++ yyn = -yyn; ++ goto yyreduce; ++ } ++ ++ if (yyn == YYFINAL) ++ YYACCEPT; ++ ++ /* Shift the lookahead token. */ ++ YYDPRINTF ((stderr, "Shifting token %s, ", yytname[yytoken])); ++ ++ /* Discard the token being shifted unless it is eof. */ ++ if (yychar != YYEOF) ++ yychar = YYEMPTY; ++ ++ *++yyvsp = yylval; ++ ++ ++ /* Count tokens shifted since error; after three, turn off error ++ status. */ ++ if (yyerrstatus) ++ yyerrstatus--; ++ ++ yystate = yyn; ++ goto yynewstate; ++ ++ ++/*-----------------------------------------------------------. ++| yydefault -- do the default action for the current state. | ++`-----------------------------------------------------------*/ ++yydefault: ++ yyn = yydefact[yystate]; ++ if (yyn == 0) ++ goto yyerrlab; ++ goto yyreduce; ++ ++ ++/*-----------------------------. ++| yyreduce -- Do a reduction. | ++`-----------------------------*/ ++yyreduce: ++ /* yyn is the number of a rule to reduce with. */ ++ yylen = yyr2[yyn]; ++ ++ /* If YYLEN is nonzero, implement the default value of the action: ++ `$$ = $1'. ++ ++ Otherwise, the following line sets YYVAL to garbage. ++ This behavior is undocumented and Bison ++ users should not rely upon it. Assigning to YYVAL ++ unconditionally makes the parser a bit smaller, and it avoids a ++ GCC warning that YYVAL may be used uninitialized. */ ++ yyval = yyvsp[1-yylen]; ++ ++ ++ YY_REDUCE_PRINT (yyn); ++ switch (yyn) ++ { ++ case 8: ++ ++ { zconfprint("unexpected 'endmenu' statement"); ;} ++ break; ++ ++ case 9: ++ ++ { zconfprint("unexpected 'endif' statement"); ;} ++ break; ++ ++ case 10: ++ ++ { zconfprint("unexpected 'endchoice' statement"); ;} ++ break; ++ ++ case 11: ++ ++ { zconfprint("syntax error"); yyerrok; ;} ++ break; ++ ++ case 18: ++ ++ { ++ struct symbol *sym = sym_lookup(yyvsp[-1].string, 0); ++ sym->flags |= SYMBOL_OPTIONAL; ++ menu_add_entry(sym); ++ printd(DEBUG_PARSE, "%s:%d:config %s\n", zconf_curname(), zconf_lineno(), yyvsp[-1].string); ++;} ++ break; ++ ++ case 19: ++ ++ { ++ menu_end_entry(); ++ printd(DEBUG_PARSE, "%s:%d:endconfig\n", zconf_curname(), zconf_lineno()); ++;} ++ break; ++ ++ case 20: ++ ++ { ++ struct symbol *sym = sym_lookup(yyvsp[-1].string, 0); ++ sym->flags |= SYMBOL_OPTIONAL; ++ menu_add_entry(sym); ++ printd(DEBUG_PARSE, "%s:%d:menuconfig %s\n", zconf_curname(), zconf_lineno(), yyvsp[-1].string); ++;} ++ break; ++ ++ case 21: ++ ++ { ++ if (current_entry->prompt) ++ current_entry->prompt->type = P_MENU; ++ else ++ zconfprint("warning: menuconfig statement without prompt"); ++ menu_end_entry(); ++ printd(DEBUG_PARSE, "%s:%d:endconfig\n", zconf_curname(), zconf_lineno()); ++;} ++ break; ++ ++ case 27: ++ ++ { ++ menu_set_type(S_TRISTATE); ++ printd(DEBUG_PARSE, "%s:%d:tristate\n", zconf_curname(), zconf_lineno()); ++;} ++ break; ++ ++ case 28: ++ ++ { ++ menu_add_expr(P_DEFAULT, yyvsp[-2].expr, yyvsp[-1].expr); ++ menu_set_type(S_TRISTATE); ++ printd(DEBUG_PARSE, "%s:%d:def_boolean\n", zconf_curname(), zconf_lineno()); ++;} ++ break; ++ ++ case 29: ++ ++ { ++ menu_set_type(S_BOOLEAN); ++ printd(DEBUG_PARSE, "%s:%d:boolean\n", zconf_curname(), zconf_lineno()); ++;} ++ break; ++ ++ case 30: ++ ++ { ++ menu_add_expr(P_DEFAULT, yyvsp[-2].expr, yyvsp[-1].expr); ++ menu_set_type(S_BOOLEAN); ++ printd(DEBUG_PARSE, "%s:%d:def_boolean\n", zconf_curname(), zconf_lineno()); ++;} ++ break; ++ ++ case 31: ++ ++ { ++ menu_set_type(S_INT); ++ printd(DEBUG_PARSE, "%s:%d:int\n", zconf_curname(), zconf_lineno()); ++;} ++ break; ++ ++ case 32: ++ ++ { ++ menu_set_type(S_HEX); ++ printd(DEBUG_PARSE, "%s:%d:hex\n", zconf_curname(), zconf_lineno()); ++;} ++ break; ++ ++ case 33: ++ ++ { ++ menu_set_type(S_STRING); ++ printd(DEBUG_PARSE, "%s:%d:string\n", zconf_curname(), zconf_lineno()); ++;} ++ break; ++ ++ case 34: ++ ++ { ++ menu_add_prompt(P_PROMPT, yyvsp[-2].string, yyvsp[-1].expr); ++ printd(DEBUG_PARSE, "%s:%d:prompt\n", zconf_curname(), zconf_lineno()); ++;} ++ break; ++ ++ case 35: ++ ++ { ++ menu_add_expr(P_DEFAULT, yyvsp[-2].expr, yyvsp[-1].expr); ++ printd(DEBUG_PARSE, "%s:%d:default\n", zconf_curname(), zconf_lineno()); ++;} ++ break; ++ ++ case 36: ++ ++ { ++ menu_add_symbol(P_SELECT, sym_lookup(yyvsp[-2].string, 0), yyvsp[-1].expr); ++ printd(DEBUG_PARSE, "%s:%d:select\n", zconf_curname(), zconf_lineno()); ++;} ++ break; ++ ++ case 37: ++ ++ { ++ menu_add_expr(P_RANGE, expr_alloc_comp(E_RANGE,yyvsp[-3].symbol, yyvsp[-2].symbol), yyvsp[-1].expr); ++ printd(DEBUG_PARSE, "%s:%d:range\n", zconf_curname(), zconf_lineno()); ++;} ++ break; ++ ++ case 38: ++ ++ { ++ struct symbol *sym = sym_lookup(NULL, 0); ++ sym->flags |= SYMBOL_CHOICE; ++ menu_add_entry(sym); ++ menu_add_expr(P_CHOICE, NULL, NULL); ++ printd(DEBUG_PARSE, "%s:%d:choice\n", zconf_curname(), zconf_lineno()); ++;} ++ break; ++ ++ case 39: ++ ++ { ++ menu_end_entry(); ++ menu_add_menu(); ++;} ++ break; ++ ++ case 40: ++ ++ { ++ if (zconf_endtoken(yyvsp[0].token, T_CHOICE, T_ENDCHOICE)) { ++ menu_end_menu(); ++ printd(DEBUG_PARSE, "%s:%d:endchoice\n", zconf_curname(), zconf_lineno()); ++ } ++;} ++ break; ++ ++ case 42: ++ ++ { ++ printf("%s:%d: missing 'endchoice' for this 'choice' statement\n", current_menu->file->name, current_menu->lineno); ++ zconfnerrs++; ++;} ++ break; ++ ++ case 48: ++ ++ { ++ menu_add_prompt(P_PROMPT, yyvsp[-2].string, yyvsp[-1].expr); ++ printd(DEBUG_PARSE, "%s:%d:prompt\n", zconf_curname(), zconf_lineno()); ++;} ++ break; ++ ++ case 49: ++ ++ { ++ menu_set_type(S_TRISTATE); ++ printd(DEBUG_PARSE, "%s:%d:tristate\n", zconf_curname(), zconf_lineno()); ++;} ++ break; ++ ++ case 50: ++ ++ { ++ menu_set_type(S_BOOLEAN); ++ printd(DEBUG_PARSE, "%s:%d:boolean\n", zconf_curname(), zconf_lineno()); ++;} ++ break; ++ ++ case 51: ++ ++ { ++ current_entry->sym->flags |= SYMBOL_OPTIONAL; ++ printd(DEBUG_PARSE, "%s:%d:optional\n", zconf_curname(), zconf_lineno()); ++;} ++ break; ++ ++ case 52: ++ ++ { ++ menu_add_symbol(P_DEFAULT, sym_lookup(yyvsp[-2].string, 0), yyvsp[-1].expr); ++ printd(DEBUG_PARSE, "%s:%d:default\n", zconf_curname(), zconf_lineno()); ++;} ++ break; ++ ++ case 55: ++ ++ { ++ printd(DEBUG_PARSE, "%s:%d:if\n", zconf_curname(), zconf_lineno()); ++ menu_add_entry(NULL); ++ menu_add_dep(yyvsp[-1].expr); ++ menu_end_entry(); ++ menu_add_menu(); ++;} ++ break; ++ ++ case 56: ++ ++ { ++ if (zconf_endtoken(yyvsp[0].token, T_IF, T_ENDIF)) { ++ menu_end_menu(); ++ printd(DEBUG_PARSE, "%s:%d:endif\n", zconf_curname(), zconf_lineno()); ++ } ++;} ++ break; ++ ++ case 58: ++ ++ { ++ printf("%s:%d: missing 'endif' for this 'if' statement\n", current_menu->file->name, current_menu->lineno); ++ zconfnerrs++; ++;} ++ break; ++ ++ case 63: ++ ++ { ++ menu_add_entry(NULL); ++ menu_add_prop(P_MENU, yyvsp[-1].string, NULL, NULL); ++ printd(DEBUG_PARSE, "%s:%d:menu\n", zconf_curname(), zconf_lineno()); ++;} ++ break; ++ ++ case 64: ++ ++ { ++ menu_end_entry(); ++ menu_add_menu(); ++;} ++ break; ++ ++ case 65: ++ ++ { ++ if (zconf_endtoken(yyvsp[0].token, T_MENU, T_ENDMENU)) { ++ menu_end_menu(); ++ printd(DEBUG_PARSE, "%s:%d:endmenu\n", zconf_curname(), zconf_lineno()); ++ } ++;} ++ break; ++ ++ case 67: ++ ++ { ++ printf("%s:%d: missing 'endmenu' for this 'menu' statement\n", current_menu->file->name, current_menu->lineno); ++ zconfnerrs++; ++;} ++ break; ++ ++ case 72: ++ ++ { zconfprint("invalid menu option"); yyerrok; ;} ++ break; ++ ++ case 73: ++ ++ { ++ yyval.string = yyvsp[-1].string; ++ printd(DEBUG_PARSE, "%s:%d:source %s\n", zconf_curname(), zconf_lineno(), yyvsp[-1].string); ++;} ++ break; ++ ++ case 74: ++ ++ { ++ zconf_nextfile(yyvsp[0].string); ++;} ++ break; ++ ++ case 75: ++ ++ { ++ menu_add_entry(NULL); ++ menu_add_prop(P_COMMENT, yyvsp[-1].string, NULL, NULL); ++ printd(DEBUG_PARSE, "%s:%d:comment\n", zconf_curname(), zconf_lineno()); ++;} ++ break; ++ ++ case 76: ++ ++ { ++ menu_end_entry(); ++;} ++ break; ++ ++ case 77: ++ ++ { ++ printd(DEBUG_PARSE, "%s:%d:help\n", zconf_curname(), zconf_lineno()); ++ zconf_starthelp(); ++;} ++ break; ++ ++ case 78: ++ ++ { ++ current_entry->sym->help = yyvsp[0].string; ++;} ++ break; ++ ++ case 82: ++ ++ { ++ menu_add_dep(yyvsp[-1].expr); ++ printd(DEBUG_PARSE, "%s:%d:depends on\n", zconf_curname(), zconf_lineno()); ++;} ++ break; ++ ++ case 83: ++ ++ { ++ menu_add_dep(yyvsp[-1].expr); ++ printd(DEBUG_PARSE, "%s:%d:depends\n", zconf_curname(), zconf_lineno()); ++;} ++ break; ++ ++ case 84: ++ ++ { ++ menu_add_dep(yyvsp[-1].expr); ++ printd(DEBUG_PARSE, "%s:%d:requires\n", zconf_curname(), zconf_lineno()); ++;} ++ break; ++ ++ case 86: ++ ++ { ++ menu_add_prop(P_PROMPT, yyvsp[-1].string, NULL, yyvsp[0].expr); ++;} ++ break; ++ ++ case 89: ++ ++ { yyval.token = T_ENDMENU; ;} ++ break; ++ ++ case 90: ++ ++ { yyval.token = T_ENDCHOICE; ;} ++ break; ++ ++ case 91: ++ ++ { yyval.token = T_ENDIF; ;} ++ break; ++ ++ case 94: ++ ++ { yyval.expr = NULL; ;} ++ break; ++ ++ case 95: ++ ++ { yyval.expr = yyvsp[0].expr; ;} ++ break; ++ ++ case 96: ++ ++ { yyval.expr = expr_alloc_symbol(yyvsp[0].symbol); ;} ++ break; ++ ++ case 97: ++ ++ { yyval.expr = expr_alloc_comp(E_EQUAL, yyvsp[-2].symbol, yyvsp[0].symbol); ;} ++ break; ++ ++ case 98: ++ ++ { yyval.expr = expr_alloc_comp(E_UNEQUAL, yyvsp[-2].symbol, yyvsp[0].symbol); ;} ++ break; ++ ++ case 99: ++ ++ { yyval.expr = yyvsp[-1].expr; ;} ++ break; ++ ++ case 100: ++ ++ { yyval.expr = expr_alloc_one(E_NOT, yyvsp[0].expr); ;} ++ break; ++ ++ case 101: ++ ++ { yyval.expr = expr_alloc_two(E_OR, yyvsp[-2].expr, yyvsp[0].expr); ;} ++ break; ++ ++ case 102: ++ ++ { yyval.expr = expr_alloc_two(E_AND, yyvsp[-2].expr, yyvsp[0].expr); ;} ++ break; ++ ++ case 103: ++ ++ { yyval.symbol = sym_lookup(yyvsp[0].string, 0); free(yyvsp[0].string); ;} ++ break; ++ ++ case 104: ++ ++ { yyval.symbol = sym_lookup(yyvsp[0].string, 1); free(yyvsp[0].string); ;} ++ break; ++ ++ ++ } ++ ++/* Line 999 of yacc.c. */ ++ ++ ++ yyvsp -= yylen; ++ yyssp -= yylen; ++ ++ ++ YY_STACK_PRINT (yyss, yyssp); ++ ++ *++yyvsp = yyval; ++ ++ ++ /* Now `shift' the result of the reduction. Determine what state ++ that goes to, based on the state we popped back to and the rule ++ number reduced by. */ ++ ++ yyn = yyr1[yyn]; ++ ++ yystate = yypgoto[yyn - YYNTOKENS] + *yyssp; ++ if (0 <= yystate && yystate <= YYLAST && yycheck[yystate] == *yyssp) ++ yystate = yytable[yystate]; ++ else ++ yystate = yydefgoto[yyn - YYNTOKENS]; ++ ++ goto yynewstate; ++ ++ ++/*------------------------------------. ++| yyerrlab -- here on detecting error | ++`------------------------------------*/ ++yyerrlab: ++ /* If not already recovering from an error, report this error. */ ++ if (!yyerrstatus) ++ { ++ ++yynerrs; ++#if YYERROR_VERBOSE ++ yyn = yypact[yystate]; ++ ++ if (YYPACT_NINF < yyn && yyn < YYLAST) ++ { ++ YYSIZE_T yysize = 0; ++ int yytype = YYTRANSLATE (yychar); ++ char *yymsg; ++ int yyx, yycount; ++ ++ yycount = 0; ++ /* Start YYX at -YYN if negative to avoid negative indexes in ++ YYCHECK. */ ++ for (yyx = yyn < 0 ? -yyn : 0; ++ yyx < (int) (sizeof (yytname) / sizeof (char *)); yyx++) ++ if (yycheck[yyx + yyn] == yyx && yyx != YYTERROR) ++ yysize += yystrlen (yytname[yyx]) + 15, yycount++; ++ yysize += yystrlen ("syntax error, unexpected ") + 1; ++ yysize += yystrlen (yytname[yytype]); ++ yymsg = (char *) YYSTACK_ALLOC (yysize); ++ if (yymsg != 0) ++ { ++ char *yyp = yystpcpy (yymsg, "syntax error, unexpected "); ++ yyp = yystpcpy (yyp, yytname[yytype]); ++ ++ if (yycount < 5) ++ { ++ yycount = 0; ++ for (yyx = yyn < 0 ? -yyn : 0; ++ yyx < (int) (sizeof (yytname) / sizeof (char *)); ++ yyx++) ++ if (yycheck[yyx + yyn] == yyx && yyx != YYTERROR) ++ { ++ const char *yyq = ! yycount ? ", expecting " : " or "; ++ yyp = yystpcpy (yyp, yyq); ++ yyp = yystpcpy (yyp, yytname[yyx]); ++ yycount++; ++ } ++ } ++ yyerror (yymsg); ++ YYSTACK_FREE (yymsg); ++ } ++ else ++ yyerror ("syntax error; also virtual memory exhausted"); ++ } ++ else ++#endif /* YYERROR_VERBOSE */ ++ yyerror ("syntax error"); ++ } ++ ++ ++ ++ if (yyerrstatus == 3) ++ { ++ /* If just tried and failed to reuse lookahead token after an ++ error, discard it. */ ++ ++ /* Return failure if at end of input. */ ++ if (yychar == YYEOF) ++ { ++ /* Pop the error token. */ ++ YYPOPSTACK; ++ /* Pop the rest of the stack. */ ++ while (yyss < yyssp) ++ { ++ YYDSYMPRINTF ("Error: popping", yystos[*yyssp], yyvsp, yylsp); ++ yydestruct (yystos[*yyssp], yyvsp); ++ YYPOPSTACK; ++ } ++ YYABORT; ++ } ++ ++ YYDSYMPRINTF ("Error: discarding", yytoken, &yylval, &yylloc); ++ yydestruct (yytoken, &yylval); ++ yychar = YYEMPTY; ++ ++ } ++ ++ /* Else will try to reuse lookahead token after shifting the error ++ token. */ ++ goto yyerrlab1; ++ ++ ++/*----------------------------------------------------. ++| yyerrlab1 -- error raised explicitly by an action. | ++`----------------------------------------------------*/ ++yyerrlab1: ++ yyerrstatus = 3; /* Each real token shifted decrements this. */ ++ ++ for (;;) ++ { ++ yyn = yypact[yystate]; ++ if (yyn != YYPACT_NINF) ++ { ++ yyn += YYTERROR; ++ if (0 <= yyn && yyn <= YYLAST && yycheck[yyn] == YYTERROR) ++ { ++ yyn = yytable[yyn]; ++ if (0 < yyn) ++ break; ++ } ++ } ++ ++ /* Pop the current state because it cannot handle the error token. */ ++ if (yyssp == yyss) ++ YYABORT; ++ ++ YYDSYMPRINTF ("Error: popping", yystos[*yyssp], yyvsp, yylsp); ++ yydestruct (yystos[yystate], yyvsp); ++ yyvsp--; ++ yystate = *--yyssp; ++ ++ YY_STACK_PRINT (yyss, yyssp); ++ } ++ ++ if (yyn == YYFINAL) ++ YYACCEPT; ++ ++ YYDPRINTF ((stderr, "Shifting error token, ")); ++ ++ *++yyvsp = yylval; ++ ++ ++ yystate = yyn; ++ goto yynewstate; ++ ++ ++/*-------------------------------------. ++| yyacceptlab -- YYACCEPT comes here. | ++`-------------------------------------*/ ++yyacceptlab: ++ yyresult = 0; ++ goto yyreturn; ++ ++/*-----------------------------------. ++| yyabortlab -- YYABORT comes here. | ++`-----------------------------------*/ ++yyabortlab: ++ yyresult = 1; ++ goto yyreturn; ++ ++#ifndef yyoverflow ++/*----------------------------------------------. ++| yyoverflowlab -- parser overflow comes here. | ++`----------------------------------------------*/ ++yyoverflowlab: ++ yyerror ("parser stack overflow"); ++ yyresult = 2; ++ /* Fall through. */ ++#endif ++ ++yyreturn: ++#ifndef yyoverflow ++ if (yyss != yyssa) ++ YYSTACK_FREE (yyss); ++#endif ++ return yyresult; ++} ++ ++ ++ ++ ++ ++void conf_parse(const char *name) ++{ ++ struct symbol *sym; ++ int i; ++ ++ zconf_initscan(name); ++ ++ sym_init(); ++ menu_init(); ++ modules_sym = sym_lookup("MODULES", 0); ++ rootmenu.prompt = menu_add_prop(P_MENU, "axTLS Configuration", NULL, NULL); ++ ++ //zconfdebug = 1; ++ zconfparse(); ++ if (zconfnerrs) ++ exit(1); ++ menu_finalize(&rootmenu); ++ for_all_symbols(i, sym) { ++ if (!(sym->flags & SYMBOL_CHECKED) && sym_check_deps(sym)) ++ printf("\n"); ++ else ++ sym->flags |= SYMBOL_CHECK_DONE; ++ } ++ ++ sym_change_count = 1; ++} ++ ++const char *zconf_tokenname(int token) ++{ ++ switch (token) { ++ case T_MENU: return "menu"; ++ case T_ENDMENU: return "endmenu"; ++ case T_CHOICE: return "choice"; ++ case T_ENDCHOICE: return "endchoice"; ++ case T_IF: return "if"; ++ case T_ENDIF: return "endif"; ++ } ++ return ""; ++} ++ ++static bool zconf_endtoken(int token, int starttoken, int endtoken) ++{ ++ if (token != endtoken) { ++ zconfprint("unexpected '%s' within %s block", zconf_tokenname(token), zconf_tokenname(starttoken)); ++ zconfnerrs++; ++ return false; ++ } ++ if (current_menu->file != current_file) { ++ zconfprint("'%s' in different file than '%s'", zconf_tokenname(token), zconf_tokenname(starttoken)); ++ zconfprint("location of the '%s'", zconf_tokenname(starttoken)); ++ zconfnerrs++; ++ return false; ++ } ++ return true; ++} ++ ++static void zconfprint(const char *err, ...) ++{ ++ va_list ap; ++ ++ fprintf(stderr, "%s:%d: ", zconf_curname(), zconf_lineno() + 1); ++ va_start(ap, err); ++ vfprintf(stderr, err, ap); ++ va_end(ap); ++ fprintf(stderr, "\n"); ++} ++ ++static void zconferror(const char *err) ++{ ++ fprintf(stderr, "%s:%d: %s\n", zconf_curname(), zconf_lineno() + 1, err); ++} ++ ++void print_quoted_string(FILE *out, const char *str) ++{ ++ const char *p; ++ int len; ++ ++ putc('"', out); ++ while ((p = strchr(str, '"'))) { ++ len = p - str; ++ if (len) ++ fprintf(out, "%.*s", len, str); ++ fputs("\\\"", out); ++ str = p + 1; ++ } ++ fputs(str, out); ++ putc('"', out); ++} ++ ++void print_symbol(FILE *out, struct menu *menu) ++{ ++ struct symbol *sym = menu->sym; ++ struct property *prop; ++ ++ if (sym_is_choice(sym)) ++ fprintf(out, "choice\n"); ++ else ++ fprintf(out, "config %s\n", sym->name); ++ switch (sym->type) { ++ case S_BOOLEAN: ++ fputs(" boolean\n", out); ++ break; ++ case S_TRISTATE: ++ fputs(" tristate\n", out); ++ break; ++ case S_STRING: ++ fputs(" string\n", out); ++ break; ++ case S_INT: ++ fputs(" integer\n", out); ++ break; ++ case S_HEX: ++ fputs(" hex\n", out); ++ break; ++ default: ++ fputs(" ???\n", out); ++ break; ++ } ++ for (prop = sym->prop; prop; prop = prop->next) { ++ if (prop->menu != menu) ++ continue; ++ switch (prop->type) { ++ case P_PROMPT: ++ fputs(" prompt ", out); ++ print_quoted_string(out, prop->text); ++ if (!expr_is_yes(prop->visible.expr)) { ++ fputs(" if ", out); ++ expr_fprint(prop->visible.expr, out); ++ } ++ fputc('\n', out); ++ break; ++ case P_DEFAULT: ++ fputs( " default ", out); ++ expr_fprint(prop->expr, out); ++ if (!expr_is_yes(prop->visible.expr)) { ++ fputs(" if ", out); ++ expr_fprint(prop->visible.expr, out); ++ } ++ fputc('\n', out); ++ break; ++ case P_CHOICE: ++ fputs(" #choice value\n", out); ++ break; ++ default: ++ fprintf(out, " unknown prop %d!\n", prop->type); ++ break; ++ } ++ } ++ if (sym->help) { ++ int len = strlen(sym->help); ++ while (sym->help[--len] == '\n') ++ sym->help[len] = 0; ++ fprintf(out, " help\n%s\n", sym->help); ++ } ++ fputc('\n', out); ++} ++ ++void zconfdump(FILE *out) ++{ ++ struct property *prop; ++ struct symbol *sym; ++ struct menu *menu; ++ ++ menu = rootmenu.list; ++ while (menu) { ++ if ((sym = menu->sym)) ++ print_symbol(out, menu); ++ else if ((prop = menu->prompt)) { ++ switch (prop->type) { ++ case P_COMMENT: ++ fputs("\ncomment ", out); ++ print_quoted_string(out, prop->text); ++ fputs("\n", out); ++ break; ++ case P_MENU: ++ fputs("\nmenu ", out); ++ print_quoted_string(out, prop->text); ++ fputs("\n", out); ++ break; ++ default: ++ ; ++ } ++ if (!expr_is_yes(prop->visible.expr)) { ++ fputs(" depends ", out); ++ expr_fprint(prop->visible.expr, out); ++ fputc('\n', out); ++ } ++ fputs("\n", out); ++ } ++ ++ if (menu->list) ++ menu = menu->list; ++ else if (menu->next) ++ menu = menu->next; ++ else while ((menu = menu->parent)) { ++ if (menu->prompt && menu->prompt->type == P_MENU) ++ fputs("\nendmenu\n", out); ++ if (menu->next) { ++ menu = menu->next; ++ break; ++ } ++ } ++ } ++} ++ ++#include "lex.zconf.c" ++#include "util.c" ++#include "confdata.c" ++#include "expr.c" ++#include "symbol.c" ++#include "menu.c" ++ ++ +diff --git a/feeds/luci/libs/luci-lib-nixio/axTLS/config/scripts/config/zconf.tab.h_shipped b/feeds/luci/libs/luci-lib-nixio/axTLS/config/scripts/config/zconf.tab.h_shipped +new file mode 100644 +index 0000000..3b191ef +--- /dev/null ++++ b/feeds/luci/libs/luci-lib-nixio/axTLS/config/scripts/config/zconf.tab.h_shipped +@@ -0,0 +1,125 @@ ++/* A Bison parser, made from zconf.y, by GNU bison 1.75. */ ++ ++/* Skeleton parser for Yacc-like parsing with Bison, ++ Copyright (C) 1984, 1989, 1990, 2000, 2001, 2002 Free Software Foundation, Inc. ++ ++ 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, or (at your option) ++ any later version. ++ ++ This program is distributed in the hope that it will be useful, ++ but WITHOUT ANY WARRANTY; without even the implied warranty of ++ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++ GNU General Public License for more details. ++ ++ You should have received a copy of the GNU General Public License ++ along with this program; if not, write to the Free Software ++ Foundation, Inc., 59 Temple Place - Suite 330, ++ Boston, MA 02111-1307, USA. */ ++ ++/* As a special exception, when this file is copied by Bison into a ++ Bison output file, you may use that output file without restriction. ++ This special exception was added by the Free Software Foundation ++ in version 1.24 of Bison. */ ++ ++#ifndef BISON_ZCONF_TAB_H ++# define BISON_ZCONF_TAB_H ++ ++/* Tokens. */ ++#ifndef YYTOKENTYPE ++# define YYTOKENTYPE ++ /* Put the tokens into the symbol table, so that GDB and other debuggers ++ know about them. */ ++ enum yytokentype { ++ T_MAINMENU = 258, ++ T_MENU = 259, ++ T_ENDMENU = 260, ++ T_SOURCE = 261, ++ T_CHOICE = 262, ++ T_ENDCHOICE = 263, ++ T_COMMENT = 264, ++ T_CONFIG = 265, ++ T_HELP = 266, ++ T_HELPTEXT = 267, ++ T_IF = 268, ++ T_ENDIF = 269, ++ T_DEPENDS = 270, ++ T_REQUIRES = 271, ++ T_OPTIONAL = 272, ++ T_PROMPT = 273, ++ T_DEFAULT = 274, ++ T_TRISTATE = 275, ++ T_BOOLEAN = 276, ++ T_INT = 277, ++ T_HEX = 278, ++ T_WORD = 279, ++ T_STRING = 280, ++ T_UNEQUAL = 281, ++ T_EOF = 282, ++ T_EOL = 283, ++ T_CLOSE_PAREN = 284, ++ T_OPEN_PAREN = 285, ++ T_ON = 286, ++ T_OR = 287, ++ T_AND = 288, ++ T_EQUAL = 289, ++ T_NOT = 290 ++ }; ++#endif ++#define T_MAINMENU 258 ++#define T_MENU 259 ++#define T_ENDMENU 260 ++#define T_SOURCE 261 ++#define T_CHOICE 262 ++#define T_ENDCHOICE 263 ++#define T_COMMENT 264 ++#define T_CONFIG 265 ++#define T_HELP 266 ++#define T_HELPTEXT 267 ++#define T_IF 268 ++#define T_ENDIF 269 ++#define T_DEPENDS 270 ++#define T_REQUIRES 271 ++#define T_OPTIONAL 272 ++#define T_PROMPT 273 ++#define T_DEFAULT 274 ++#define T_TRISTATE 275 ++#define T_BOOLEAN 276 ++#define T_INT 277 ++#define T_HEX 278 ++#define T_WORD 279 ++#define T_STRING 280 ++#define T_UNEQUAL 281 ++#define T_EOF 282 ++#define T_EOL 283 ++#define T_CLOSE_PAREN 284 ++#define T_OPEN_PAREN 285 ++#define T_ON 286 ++#define T_OR 287 ++#define T_AND 288 ++#define T_EQUAL 289 ++#define T_NOT 290 ++ ++ ++ ++ ++#ifndef YYSTYPE ++#line 33 "zconf.y" ++typedef union { ++ int token; ++ char *string; ++ struct symbol *symbol; ++ struct expr *expr; ++ struct menu *menu; ++} yystype; ++/* Line 1281 of /usr/share/bison/yacc.c. */ ++#line 118 "zconf.tab.h" ++# define YYSTYPE yystype ++#endif ++ ++extern YYSTYPE zconflval; ++ ++ ++#endif /* not BISON_ZCONF_TAB_H */ ++ +diff --git a/feeds/luci/libs/luci-lib-nixio/axTLS/config/scripts/config/zconf.y b/feeds/luci/libs/luci-lib-nixio/axTLS/config/scripts/config/zconf.y +new file mode 100644 +index 0000000..cf45da0 +--- /dev/null ++++ b/feeds/luci/libs/luci-lib-nixio/axTLS/config/scripts/config/zconf.y +@@ -0,0 +1,690 @@ ++%{ ++/* ++ * Copyright (C) 2002 Roman Zippel ++ * Released under the terms of the GNU GPL v2.0. ++ */ ++ ++#include ++#include ++#include ++#include ++#include ++#include ++ ++#define printd(mask, fmt...) if (cdebug & (mask)) printf(fmt) ++ ++#define PRINTD 0x0001 ++#define DEBUG_PARSE 0x0002 ++ ++int cdebug = PRINTD; ++ ++extern int zconflex(void); ++static void zconfprint(const char *err, ...); ++static void zconferror(const char *err); ++static bool zconf_endtoken(int token, int starttoken, int endtoken); ++ ++struct symbol *symbol_hash[257]; ++ ++static struct menu *current_menu, *current_entry; ++ ++#define YYERROR_VERBOSE ++%} ++%expect 40 ++ ++%union ++{ ++ int token; ++ char *string; ++ struct symbol *symbol; ++ struct expr *expr; ++ struct menu *menu; ++} ++ ++%token T_MAINMENU ++%token T_MENU ++%token T_ENDMENU ++%token T_SOURCE ++%token T_CHOICE ++%token T_ENDCHOICE ++%token T_COMMENT ++%token T_CONFIG ++%token T_MENUCONFIG ++%token T_HELP ++%token T_HELPTEXT ++%token T_IF ++%token T_ENDIF ++%token T_DEPENDS ++%token T_REQUIRES ++%token T_OPTIONAL ++%token T_PROMPT ++%token T_DEFAULT ++%token T_TRISTATE ++%token T_DEF_TRISTATE ++%token T_BOOLEAN ++%token T_DEF_BOOLEAN ++%token T_STRING ++%token T_INT ++%token T_HEX ++%token T_WORD ++%token T_WORD_QUOTE ++%token T_UNEQUAL ++%token T_EOF ++%token T_EOL ++%token T_CLOSE_PAREN ++%token T_OPEN_PAREN ++%token T_ON ++%token T_SELECT ++%token T_RANGE ++ ++%left T_OR ++%left T_AND ++%left T_EQUAL T_UNEQUAL ++%nonassoc T_NOT ++ ++%type prompt ++%type source ++%type symbol ++%type expr ++%type if_expr ++%type end ++ ++%{ ++#define LKC_DIRECT_LINK ++#include "lkc.h" ++%} ++%% ++input: /* empty */ ++ | input block ++; ++ ++block: common_block ++ | choice_stmt ++ | menu_stmt ++ | T_MAINMENU prompt nl_or_eof ++ | T_ENDMENU { zconfprint("unexpected 'endmenu' statement"); } ++ | T_ENDIF { zconfprint("unexpected 'endif' statement"); } ++ | T_ENDCHOICE { zconfprint("unexpected 'endchoice' statement"); } ++ | error nl_or_eof { zconfprint("syntax error"); yyerrok; } ++; ++ ++common_block: ++ if_stmt ++ | comment_stmt ++ | config_stmt ++ | menuconfig_stmt ++ | source_stmt ++ | nl_or_eof ++; ++ ++ ++/* config/menuconfig entry */ ++ ++config_entry_start: T_CONFIG T_WORD T_EOL ++{ ++ struct symbol *sym = sym_lookup($2, 0); ++ sym->flags |= SYMBOL_OPTIONAL; ++ menu_add_entry(sym); ++ printd(DEBUG_PARSE, "%s:%d:config %s\n", zconf_curname(), zconf_lineno(), $2); ++}; ++ ++config_stmt: config_entry_start config_option_list ++{ ++ menu_end_entry(); ++ printd(DEBUG_PARSE, "%s:%d:endconfig\n", zconf_curname(), zconf_lineno()); ++}; ++ ++menuconfig_entry_start: T_MENUCONFIG T_WORD T_EOL ++{ ++ struct symbol *sym = sym_lookup($2, 0); ++ sym->flags |= SYMBOL_OPTIONAL; ++ menu_add_entry(sym); ++ printd(DEBUG_PARSE, "%s:%d:menuconfig %s\n", zconf_curname(), zconf_lineno(), $2); ++}; ++ ++menuconfig_stmt: menuconfig_entry_start config_option_list ++{ ++ if (current_entry->prompt) ++ current_entry->prompt->type = P_MENU; ++ else ++ zconfprint("warning: menuconfig statement without prompt"); ++ menu_end_entry(); ++ printd(DEBUG_PARSE, "%s:%d:endconfig\n", zconf_curname(), zconf_lineno()); ++}; ++ ++config_option_list: ++ /* empty */ ++ | config_option_list config_option ++ | config_option_list depends ++ | config_option_list help ++ | config_option_list T_EOL ++; ++ ++config_option: T_TRISTATE prompt_stmt_opt T_EOL ++{ ++ menu_set_type(S_TRISTATE); ++ printd(DEBUG_PARSE, "%s:%d:tristate\n", zconf_curname(), zconf_lineno()); ++}; ++ ++config_option: T_DEF_TRISTATE expr if_expr T_EOL ++{ ++ menu_add_expr(P_DEFAULT, $2, $3); ++ menu_set_type(S_TRISTATE); ++ printd(DEBUG_PARSE, "%s:%d:def_boolean\n", zconf_curname(), zconf_lineno()); ++}; ++ ++config_option: T_BOOLEAN prompt_stmt_opt T_EOL ++{ ++ menu_set_type(S_BOOLEAN); ++ printd(DEBUG_PARSE, "%s:%d:boolean\n", zconf_curname(), zconf_lineno()); ++}; ++ ++config_option: T_DEF_BOOLEAN expr if_expr T_EOL ++{ ++ menu_add_expr(P_DEFAULT, $2, $3); ++ menu_set_type(S_BOOLEAN); ++ printd(DEBUG_PARSE, "%s:%d:def_boolean\n", zconf_curname(), zconf_lineno()); ++}; ++ ++config_option: T_INT prompt_stmt_opt T_EOL ++{ ++ menu_set_type(S_INT); ++ printd(DEBUG_PARSE, "%s:%d:int\n", zconf_curname(), zconf_lineno()); ++}; ++ ++config_option: T_HEX prompt_stmt_opt T_EOL ++{ ++ menu_set_type(S_HEX); ++ printd(DEBUG_PARSE, "%s:%d:hex\n", zconf_curname(), zconf_lineno()); ++}; ++ ++config_option: T_STRING prompt_stmt_opt T_EOL ++{ ++ menu_set_type(S_STRING); ++ printd(DEBUG_PARSE, "%s:%d:string\n", zconf_curname(), zconf_lineno()); ++}; ++ ++config_option: T_PROMPT prompt if_expr T_EOL ++{ ++ menu_add_prompt(P_PROMPT, $2, $3); ++ printd(DEBUG_PARSE, "%s:%d:prompt\n", zconf_curname(), zconf_lineno()); ++}; ++ ++config_option: T_DEFAULT expr if_expr T_EOL ++{ ++ menu_add_expr(P_DEFAULT, $2, $3); ++ printd(DEBUG_PARSE, "%s:%d:default\n", zconf_curname(), zconf_lineno()); ++}; ++ ++config_option: T_SELECT T_WORD if_expr T_EOL ++{ ++ menu_add_symbol(P_SELECT, sym_lookup($2, 0), $3); ++ printd(DEBUG_PARSE, "%s:%d:select\n", zconf_curname(), zconf_lineno()); ++}; ++ ++config_option: T_RANGE symbol symbol if_expr T_EOL ++{ ++ menu_add_expr(P_RANGE, expr_alloc_comp(E_RANGE,$2, $3), $4); ++ printd(DEBUG_PARSE, "%s:%d:range\n", zconf_curname(), zconf_lineno()); ++}; ++ ++/* choice entry */ ++ ++choice: T_CHOICE T_EOL ++{ ++ struct symbol *sym = sym_lookup(NULL, 0); ++ sym->flags |= SYMBOL_CHOICE; ++ menu_add_entry(sym); ++ menu_add_expr(P_CHOICE, NULL, NULL); ++ printd(DEBUG_PARSE, "%s:%d:choice\n", zconf_curname(), zconf_lineno()); ++}; ++ ++choice_entry: choice choice_option_list ++{ ++ menu_end_entry(); ++ menu_add_menu(); ++}; ++ ++choice_end: end ++{ ++ if (zconf_endtoken($1, T_CHOICE, T_ENDCHOICE)) { ++ menu_end_menu(); ++ printd(DEBUG_PARSE, "%s:%d:endchoice\n", zconf_curname(), zconf_lineno()); ++ } ++}; ++ ++choice_stmt: ++ choice_entry choice_block choice_end ++ | choice_entry choice_block ++{ ++ printf("%s:%d: missing 'endchoice' for this 'choice' statement\n", current_menu->file->name, current_menu->lineno); ++ zconfnerrs++; ++}; ++ ++choice_option_list: ++ /* empty */ ++ | choice_option_list choice_option ++ | choice_option_list depends ++ | choice_option_list help ++ | choice_option_list T_EOL ++; ++ ++choice_option: T_PROMPT prompt if_expr T_EOL ++{ ++ menu_add_prompt(P_PROMPT, $2, $3); ++ printd(DEBUG_PARSE, "%s:%d:prompt\n", zconf_curname(), zconf_lineno()); ++}; ++ ++choice_option: T_TRISTATE prompt_stmt_opt T_EOL ++{ ++ menu_set_type(S_TRISTATE); ++ printd(DEBUG_PARSE, "%s:%d:tristate\n", zconf_curname(), zconf_lineno()); ++}; ++ ++choice_option: T_BOOLEAN prompt_stmt_opt T_EOL ++{ ++ menu_set_type(S_BOOLEAN); ++ printd(DEBUG_PARSE, "%s:%d:boolean\n", zconf_curname(), zconf_lineno()); ++}; ++ ++choice_option: T_OPTIONAL T_EOL ++{ ++ current_entry->sym->flags |= SYMBOL_OPTIONAL; ++ printd(DEBUG_PARSE, "%s:%d:optional\n", zconf_curname(), zconf_lineno()); ++}; ++ ++choice_option: T_DEFAULT T_WORD if_expr T_EOL ++{ ++ menu_add_symbol(P_DEFAULT, sym_lookup($2, 0), $3); ++ printd(DEBUG_PARSE, "%s:%d:default\n", zconf_curname(), zconf_lineno()); ++}; ++ ++choice_block: ++ /* empty */ ++ | choice_block common_block ++; ++ ++/* if entry */ ++ ++if: T_IF expr T_EOL ++{ ++ printd(DEBUG_PARSE, "%s:%d:if\n", zconf_curname(), zconf_lineno()); ++ menu_add_entry(NULL); ++ menu_add_dep($2); ++ menu_end_entry(); ++ menu_add_menu(); ++}; ++ ++if_end: end ++{ ++ if (zconf_endtoken($1, T_IF, T_ENDIF)) { ++ menu_end_menu(); ++ printd(DEBUG_PARSE, "%s:%d:endif\n", zconf_curname(), zconf_lineno()); ++ } ++}; ++ ++if_stmt: ++ if if_block if_end ++ | if if_block ++{ ++ printf("%s:%d: missing 'endif' for this 'if' statement\n", current_menu->file->name, current_menu->lineno); ++ zconfnerrs++; ++}; ++ ++if_block: ++ /* empty */ ++ | if_block common_block ++ | if_block menu_stmt ++ | if_block choice_stmt ++; ++ ++/* menu entry */ ++ ++menu: T_MENU prompt T_EOL ++{ ++ menu_add_entry(NULL); ++ menu_add_prop(P_MENU, $2, NULL, NULL); ++ printd(DEBUG_PARSE, "%s:%d:menu\n", zconf_curname(), zconf_lineno()); ++}; ++ ++menu_entry: menu depends_list ++{ ++ menu_end_entry(); ++ menu_add_menu(); ++}; ++ ++menu_end: end ++{ ++ if (zconf_endtoken($1, T_MENU, T_ENDMENU)) { ++ menu_end_menu(); ++ printd(DEBUG_PARSE, "%s:%d:endmenu\n", zconf_curname(), zconf_lineno()); ++ } ++}; ++ ++menu_stmt: ++ menu_entry menu_block menu_end ++ | menu_entry menu_block ++{ ++ printf("%s:%d: missing 'endmenu' for this 'menu' statement\n", current_menu->file->name, current_menu->lineno); ++ zconfnerrs++; ++}; ++ ++menu_block: ++ /* empty */ ++ | menu_block common_block ++ | menu_block menu_stmt ++ | menu_block choice_stmt ++ | menu_block error T_EOL { zconfprint("invalid menu option"); yyerrok; } ++; ++ ++source: T_SOURCE prompt T_EOL ++{ ++ $$ = $2; ++ printd(DEBUG_PARSE, "%s:%d:source %s\n", zconf_curname(), zconf_lineno(), $2); ++}; ++ ++source_stmt: source ++{ ++ zconf_nextfile($1); ++}; ++ ++/* comment entry */ ++ ++comment: T_COMMENT prompt T_EOL ++{ ++ menu_add_entry(NULL); ++ menu_add_prop(P_COMMENT, $2, NULL, NULL); ++ printd(DEBUG_PARSE, "%s:%d:comment\n", zconf_curname(), zconf_lineno()); ++}; ++ ++comment_stmt: comment depends_list ++{ ++ menu_end_entry(); ++}; ++ ++/* help option */ ++ ++help_start: T_HELP T_EOL ++{ ++ printd(DEBUG_PARSE, "%s:%d:help\n", zconf_curname(), zconf_lineno()); ++ zconf_starthelp(); ++}; ++ ++help: help_start T_HELPTEXT ++{ ++ current_entry->sym->help = $2; ++}; ++ ++/* depends option */ ++ ++depends_list: /* empty */ ++ | depends_list depends ++ | depends_list T_EOL ++; ++ ++depends: T_DEPENDS T_ON expr T_EOL ++{ ++ menu_add_dep($3); ++ printd(DEBUG_PARSE, "%s:%d:depends on\n", zconf_curname(), zconf_lineno()); ++} ++ | T_DEPENDS expr T_EOL ++{ ++ menu_add_dep($2); ++ printd(DEBUG_PARSE, "%s:%d:depends\n", zconf_curname(), zconf_lineno()); ++} ++ | T_REQUIRES expr T_EOL ++{ ++ menu_add_dep($2); ++ printd(DEBUG_PARSE, "%s:%d:requires\n", zconf_curname(), zconf_lineno()); ++}; ++ ++/* prompt statement */ ++ ++prompt_stmt_opt: ++ /* empty */ ++ | prompt if_expr ++{ ++ menu_add_prop(P_PROMPT, $1, NULL, $2); ++}; ++ ++prompt: T_WORD ++ | T_WORD_QUOTE ++; ++ ++end: T_ENDMENU nl_or_eof { $$ = T_ENDMENU; } ++ | T_ENDCHOICE nl_or_eof { $$ = T_ENDCHOICE; } ++ | T_ENDIF nl_or_eof { $$ = T_ENDIF; } ++; ++ ++nl_or_eof: ++ T_EOL | T_EOF; ++ ++if_expr: /* empty */ { $$ = NULL; } ++ | T_IF expr { $$ = $2; } ++; ++ ++expr: symbol { $$ = expr_alloc_symbol($1); } ++ | symbol T_EQUAL symbol { $$ = expr_alloc_comp(E_EQUAL, $1, $3); } ++ | symbol T_UNEQUAL symbol { $$ = expr_alloc_comp(E_UNEQUAL, $1, $3); } ++ | T_OPEN_PAREN expr T_CLOSE_PAREN { $$ = $2; } ++ | T_NOT expr { $$ = expr_alloc_one(E_NOT, $2); } ++ | expr T_OR expr { $$ = expr_alloc_two(E_OR, $1, $3); } ++ | expr T_AND expr { $$ = expr_alloc_two(E_AND, $1, $3); } ++; ++ ++symbol: T_WORD { $$ = sym_lookup($1, 0); free($1); } ++ | T_WORD_QUOTE { $$ = sym_lookup($1, 1); free($1); } ++; ++ ++%% ++ ++void conf_parse(const char *name) ++{ ++ struct symbol *sym; ++ int i; ++ ++ zconf_initscan(name); ++ ++ sym_init(); ++ menu_init(); ++ modules_sym = sym_lookup("MODULES", 0); ++ rootmenu.prompt = menu_add_prop(P_MENU, "axTLS Configuration", NULL, NULL); ++ ++ //zconfdebug = 1; ++ zconfparse(); ++ if (zconfnerrs) ++ exit(1); ++ menu_finalize(&rootmenu); ++ for_all_symbols(i, sym) { ++ if (!(sym->flags & SYMBOL_CHECKED) && sym_check_deps(sym)) ++ printf("\n"); ++ else ++ sym->flags |= SYMBOL_CHECK_DONE; ++ } ++ ++ sym_change_count = 1; ++} ++ ++const char *zconf_tokenname(int token) ++{ ++ switch (token) { ++ case T_MENU: return "menu"; ++ case T_ENDMENU: return "endmenu"; ++ case T_CHOICE: return "choice"; ++ case T_ENDCHOICE: return "endchoice"; ++ case T_IF: return "if"; ++ case T_ENDIF: return "endif"; ++ } ++ return ""; ++} ++ ++static bool zconf_endtoken(int token, int starttoken, int endtoken) ++{ ++ if (token != endtoken) { ++ zconfprint("unexpected '%s' within %s block", zconf_tokenname(token), zconf_tokenname(starttoken)); ++ zconfnerrs++; ++ return false; ++ } ++ if (current_menu->file != current_file) { ++ zconfprint("'%s' in different file than '%s'", zconf_tokenname(token), zconf_tokenname(starttoken)); ++ zconfprint("location of the '%s'", zconf_tokenname(starttoken)); ++ zconfnerrs++; ++ return false; ++ } ++ return true; ++} ++ ++static void zconfprint(const char *err, ...) ++{ ++ va_list ap; ++ ++ fprintf(stderr, "%s:%d: ", zconf_curname(), zconf_lineno() + 1); ++ va_start(ap, err); ++ vfprintf(stderr, err, ap); ++ va_end(ap); ++ fprintf(stderr, "\n"); ++} ++ ++static void zconferror(const char *err) ++{ ++ fprintf(stderr, "%s:%d: %s\n", zconf_curname(), zconf_lineno() + 1, err); ++} ++ ++void print_quoted_string(FILE *out, const char *str) ++{ ++ const char *p; ++ int len; ++ ++ putc('"', out); ++ while ((p = strchr(str, '"'))) { ++ len = p - str; ++ if (len) ++ fprintf(out, "%.*s", len, str); ++ fputs("\\\"", out); ++ str = p + 1; ++ } ++ fputs(str, out); ++ putc('"', out); ++} ++ ++void print_symbol(FILE *out, struct menu *menu) ++{ ++ struct symbol *sym = menu->sym; ++ struct property *prop; ++ ++ if (sym_is_choice(sym)) ++ fprintf(out, "choice\n"); ++ else ++ fprintf(out, "config %s\n", sym->name); ++ switch (sym->type) { ++ case S_BOOLEAN: ++ fputs(" boolean\n", out); ++ break; ++ case S_TRISTATE: ++ fputs(" tristate\n", out); ++ break; ++ case S_STRING: ++ fputs(" string\n", out); ++ break; ++ case S_INT: ++ fputs(" integer\n", out); ++ break; ++ case S_HEX: ++ fputs(" hex\n", out); ++ break; ++ default: ++ fputs(" ???\n", out); ++ break; ++ } ++ for (prop = sym->prop; prop; prop = prop->next) { ++ if (prop->menu != menu) ++ continue; ++ switch (prop->type) { ++ case P_PROMPT: ++ fputs(" prompt ", out); ++ print_quoted_string(out, prop->text); ++ if (!expr_is_yes(prop->visible.expr)) { ++ fputs(" if ", out); ++ expr_fprint(prop->visible.expr, out); ++ } ++ fputc('\n', out); ++ break; ++ case P_DEFAULT: ++ fputs( " default ", out); ++ expr_fprint(prop->expr, out); ++ if (!expr_is_yes(prop->visible.expr)) { ++ fputs(" if ", out); ++ expr_fprint(prop->visible.expr, out); ++ } ++ fputc('\n', out); ++ break; ++ case P_CHOICE: ++ fputs(" #choice value\n", out); ++ break; ++ default: ++ fprintf(out, " unknown prop %d!\n", prop->type); ++ break; ++ } ++ } ++ if (sym->help) { ++ int len = strlen(sym->help); ++ while (sym->help[--len] == '\n') ++ sym->help[len] = 0; ++ fprintf(out, " help\n%s\n", sym->help); ++ } ++ fputc('\n', out); ++} ++ ++void zconfdump(FILE *out) ++{ ++ struct property *prop; ++ struct symbol *sym; ++ struct menu *menu; ++ ++ menu = rootmenu.list; ++ while (menu) { ++ if ((sym = menu->sym)) ++ print_symbol(out, menu); ++ else if ((prop = menu->prompt)) { ++ switch (prop->type) { ++ case P_COMMENT: ++ fputs("\ncomment ", out); ++ print_quoted_string(out, prop->text); ++ fputs("\n", out); ++ break; ++ case P_MENU: ++ fputs("\nmenu ", out); ++ print_quoted_string(out, prop->text); ++ fputs("\n", out); ++ break; ++ default: ++ ; ++ } ++ if (!expr_is_yes(prop->visible.expr)) { ++ fputs(" depends ", out); ++ expr_fprint(prop->visible.expr, out); ++ fputc('\n', out); ++ } ++ fputs("\n", out); ++ } ++ ++ if (menu->list) ++ menu = menu->list; ++ else if (menu->next) ++ menu = menu->next; ++ else while ((menu = menu->parent)) { ++ if (menu->prompt && menu->prompt->type == P_MENU) ++ fputs("\nendmenu\n", out); ++ if (menu->next) { ++ menu = menu->next; ++ break; ++ } ++ } ++ } ++} ++ ++#include "lex.zconf.c" ++#include "util.c" ++#include "confdata.c" ++#include "expr.c" ++#include "symbol.c" ++#include "menu.c" +diff --git a/feeds/luci/libs/luci-lib-nixio/axTLS/config/win32config b/feeds/luci/libs/luci-lib-nixio/axTLS/config/win32config +new file mode 100644 +index 0000000..6c8d607 +--- /dev/null ++++ b/feeds/luci/libs/luci-lib-nixio/axTLS/config/win32config +@@ -0,0 +1,119 @@ ++# ++# Automatically generated make config: don't edit ++# ++HAVE_DOT_CONFIG=y ++# CONFIG_PLATFORM_LINUX is not set ++# CONFIG_PLATFORM_CYGWIN is not set ++# CONFIG_PLATFORM_SOLARIS is not set ++CONFIG_PLATFORM_WIN32=y ++ ++# ++# General Configuration ++# ++PREFIX="" ++# CONFIG_DEBUG is not set ++# CONFIG_STRIP_UNWANTED_SECTIONS is not set ++ ++# ++# Microsoft Compiler Options ++# ++# CONFIG_VISUAL_STUDIO_7_0 is not set ++CONFIG_VISUAL_STUDIO_8_0=y ++CONFIG_VISUAL_STUDIO_7_0_BASE="" ++CONFIG_VISUAL_STUDIO_8_0_BASE="c:\\Program Files\\Microsoft Visual Studio 8" ++CONFIG_EXTRA_CFLAGS_OPTIONS="" ++CONFIG_EXTRA_LDFLAGS_OPTIONS="" ++ ++# ++# SSL Library ++# ++# CONFIG_SSL_SERVER_ONLY is not set ++# CONFIG_SSL_CERT_VERIFICATION is not set ++# CONFIG_SSL_ENABLE_CLIENT is not set ++CONFIG_SSL_FULL_MODE=y ++# CONFIG_SSL_SKELETON_MODE is not set ++# CONFIG_SSL_PROT_LOW is not set ++CONFIG_SSL_PROT_MEDIUM=y ++# CONFIG_SSL_PROT_HIGH is not set ++CONFIG_SSL_USE_DEFAULT_KEY=y ++CONFIG_SSL_PRIVATE_KEY_LOCATION="" ++CONFIG_SSL_PRIVATE_KEY_PASSWORD="" ++CONFIG_SSL_X509_CERT_LOCATION="" ++CONFIG_SSL_GENERATE_X509_CERT=y ++CONFIG_SSL_X509_COMMON_NAME="" ++CONFIG_SSL_X509_ORGANIZATION_NAME="" ++CONFIG_SSL_X509_ORGANIZATION_UNIT_NAME="" ++CONFIG_SSL_ENABLE_V23_HANDSHAKE=y ++CONFIG_SSL_HAS_PEM=y ++CONFIG_SSL_USE_PKCS12=y ++CONFIG_SSL_EXPIRY_TIME=24 ++CONFIG_X509_MAX_CA_CERTS=4 ++CONFIG_SSL_MAX_CERTS=2 ++# CONFIG_SSL_CTX_MUTEXING is not set ++# CONFIG_USE_DEV_URANDOM is not set ++CONFIG_WIN32_USE_CRYPTO_LIB=y ++# CONFIG_OPENSSL_COMPATIBLE is not set ++# CONFIG_PERFORMANCE_TESTING is not set ++# CONFIG_SSL_TEST is not set ++CONFIG_AXHTTPD=y ++ ++# ++# Axhttpd Configuration ++# ++# CONFIG_HTTP_STATIC_BUILD is not set ++CONFIG_HTTP_PORT=80 ++CONFIG_HTTP_HTTPS_PORT=443 ++CONFIG_HTTP_SESSION_CACHE_SIZE=5 ++CONFIG_HTTP_WEBROOT="www" ++CONFIG_HTTP_TIMEOUT=300 ++# CONFIG_HTTP_HAS_CGI is not set ++CONFIG_HTTP_CGI_EXTENSIONS="" ++# CONFIG_HTTP_ENABLE_LUA is not set ++CONFIG_HTTP_LUA_PREFIX="" ++CONFIG_HTTP_LUA_CGI_LAUNCHER="" ++# CONFIG_HTTP_BUILD_LUA is not set ++CONFIG_HTTP_DIRECTORIES=y ++CONFIG_HTTP_HAS_AUTHORIZATION=y ++# CONFIG_HTTP_HAS_IPV6 is not set ++CONFIG_HTTP_VERBOSE=y ++# CONFIG_HTTP_IS_DAEMON is not set ++ ++# ++# Language Bindings ++# ++# CONFIG_BINDINGS is not set ++# CONFIG_CSHARP_BINDINGS is not set ++# CONFIG_VBNET_BINDINGS is not set ++CONFIG_DOT_NET_FRAMEWORK_BASE="" ++# CONFIG_JAVA_BINDINGS is not set ++CONFIG_JAVA_HOME="" ++# CONFIG_PERL_BINDINGS is not set ++CONFIG_PERL_CORE="" ++CONFIG_PERL_LIB="" ++# CONFIG_LUA_BINDINGS is not set ++CONFIG_LUA_CORE="" ++ ++# ++# Samples ++# ++CONFIG_SAMPLES=y ++CONFIG_C_SAMPLES=y ++# CONFIG_CSHARP_SAMPLES is not set ++# CONFIG_VBNET_SAMPLES is not set ++# CONFIG_JAVA_SAMPLES is not set ++# CONFIG_PERL_SAMPLES is not set ++# CONFIG_LUA_SAMPLES is not set ++ ++# ++# BigInt Options ++# ++# CONFIG_BIGINT_CLASSICAL is not set ++# CONFIG_BIGINT_MONTGOMERY is not set ++CONFIG_BIGINT_BARRETT=y ++CONFIG_BIGINT_CRT=y ++# CONFIG_BIGINT_KARATSUBA is not set ++MUL_KARATSUBA_THRESH=0 ++SQU_KARATSUBA_THRESH=0 ++CONFIG_BIGINT_SLIDING_WINDOW=y ++CONFIG_BIGINT_SQUARE=y ++# CONFIG_BIGINT_CHECK_ON is not set +diff --git a/feeds/luci/libs/luci-lib-nixio/axTLS/crypto/Makefile b/feeds/luci/libs/luci-lib-nixio/axTLS/crypto/Makefile +new file mode 100644 +index 0000000..3ea8bdd +--- /dev/null ++++ b/feeds/luci/libs/luci-lib-nixio/axTLS/crypto/Makefile +@@ -0,0 +1,50 @@ ++# ++# Copyright (c) 2007, Cameron Rich ++# ++# All rights reserved. ++# ++# Redistribution and use in source and binary forms, with or without ++# modification, are permitted provided that the following conditions are met: ++# ++# * Redistributions of source code must retain the above copyright notice, ++# this list of conditions and the following disclaimer. ++# * 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. ++# * Neither the name of the axTLS project nor the names of its ++# contributors may be used to endorse or promote products derived ++# from this software without specific prior written permission. ++# ++# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ++# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT ++# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR ++# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR ++# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, ++# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED ++# TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, ++# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY ++# OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING ++# NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF ++# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ++# ++ ++include ../config/.config ++include ../config/makefile.conf ++ ++AXTLS_HOME=.. ++ ++OBJ=\ ++ aes.o \ ++ bigint.o \ ++ crypto_misc.o \ ++ hmac.o \ ++ md2.o \ ++ md5.o \ ++ rc4.o \ ++ rsa.o \ ++ sha1.o ++ ++include ../config/makefile.post ++ ++all: $(OBJ) ++ +diff --git a/feeds/luci/libs/luci-lib-nixio/axTLS/crypto/aes.c b/feeds/luci/libs/luci-lib-nixio/axTLS/crypto/aes.c +new file mode 100644 +index 0000000..038a45b +--- /dev/null ++++ b/feeds/luci/libs/luci-lib-nixio/axTLS/crypto/aes.c +@@ -0,0 +1,456 @@ ++/* ++ * Copyright (c) 2007, Cameron Rich ++ * ++ * All rights reserved. ++ * ++ * Redistribution and use in source and binary forms, with or without ++ * modification, are permitted provided that the following conditions are met: ++ * ++ * * Redistributions of source code must retain the above copyright notice, ++ * this list of conditions and the following disclaimer. ++ * * 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. ++ * * Neither the name of the axTLS project nor the names of its contributors ++ * may be used to endorse or promote products derived from this software ++ * without specific prior written permission. ++ * ++ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ++ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT ++ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR ++ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR ++ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, ++ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, ++ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR ++ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF ++ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING ++ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS ++ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ++ */ ++ ++/** ++ * AES implementation - this is a small code version. There are much faster ++ * versions around but they are much larger in size (i.e. they use large ++ * submix tables). ++ */ ++ ++#include ++#include "crypto.h" ++ ++/* all commented out in skeleton mode */ ++#ifndef CONFIG_SSL_SKELETON_MODE ++ ++#define rot1(x) (((x) << 24) | ((x) >> 8)) ++#define rot2(x) (((x) << 16) | ((x) >> 16)) ++#define rot3(x) (((x) << 8) | ((x) >> 24)) ++ ++/* ++ * This cute trick does 4 'mul by two' at once. Stolen from ++ * Dr B. R. Gladman but I'm sure the u-(u>>7) is ++ * a standard graphics trick ++ * The key to this is that we need to xor with 0x1b if the top bit is set. ++ * a 1xxx xxxx 0xxx 0xxx First we mask the 7bit, ++ * b 1000 0000 0000 0000 then we shift right by 7 putting the 7bit in 0bit, ++ * c 0000 0001 0000 0000 we then subtract (c) from (b) ++ * d 0111 1111 0000 0000 and now we and with our mask ++ * e 0001 1011 0000 0000 ++ */ ++#define mt 0x80808080 ++#define ml 0x7f7f7f7f ++#define mh 0xfefefefe ++#define mm 0x1b1b1b1b ++#define mul2(x,t) ((t)=((x)&mt), \ ++ ((((x)+(x))&mh)^(((t)-((t)>>7))&mm))) ++ ++#define inv_mix_col(x,f2,f4,f8,f9) (\ ++ (f2)=mul2(x,f2), \ ++ (f4)=mul2(f2,f4), \ ++ (f8)=mul2(f4,f8), \ ++ (f9)=(x)^(f8), \ ++ (f8)=((f2)^(f4)^(f8)), \ ++ (f2)^=(f9), \ ++ (f4)^=(f9), \ ++ (f8)^=rot3(f2), \ ++ (f8)^=rot2(f4), \ ++ (f8)^rot1(f9)) ++ ++/* ++ * AES S-box ++ */ ++static const uint8_t aes_sbox[256] = ++{ ++ 0x63,0x7C,0x77,0x7B,0xF2,0x6B,0x6F,0xC5, ++ 0x30,0x01,0x67,0x2B,0xFE,0xD7,0xAB,0x76, ++ 0xCA,0x82,0xC9,0x7D,0xFA,0x59,0x47,0xF0, ++ 0xAD,0xD4,0xA2,0xAF,0x9C,0xA4,0x72,0xC0, ++ 0xB7,0xFD,0x93,0x26,0x36,0x3F,0xF7,0xCC, ++ 0x34,0xA5,0xE5,0xF1,0x71,0xD8,0x31,0x15, ++ 0x04,0xC7,0x23,0xC3,0x18,0x96,0x05,0x9A, ++ 0x07,0x12,0x80,0xE2,0xEB,0x27,0xB2,0x75, ++ 0x09,0x83,0x2C,0x1A,0x1B,0x6E,0x5A,0xA0, ++ 0x52,0x3B,0xD6,0xB3,0x29,0xE3,0x2F,0x84, ++ 0x53,0xD1,0x00,0xED,0x20,0xFC,0xB1,0x5B, ++ 0x6A,0xCB,0xBE,0x39,0x4A,0x4C,0x58,0xCF, ++ 0xD0,0xEF,0xAA,0xFB,0x43,0x4D,0x33,0x85, ++ 0x45,0xF9,0x02,0x7F,0x50,0x3C,0x9F,0xA8, ++ 0x51,0xA3,0x40,0x8F,0x92,0x9D,0x38,0xF5, ++ 0xBC,0xB6,0xDA,0x21,0x10,0xFF,0xF3,0xD2, ++ 0xCD,0x0C,0x13,0xEC,0x5F,0x97,0x44,0x17, ++ 0xC4,0xA7,0x7E,0x3D,0x64,0x5D,0x19,0x73, ++ 0x60,0x81,0x4F,0xDC,0x22,0x2A,0x90,0x88, ++ 0x46,0xEE,0xB8,0x14,0xDE,0x5E,0x0B,0xDB, ++ 0xE0,0x32,0x3A,0x0A,0x49,0x06,0x24,0x5C, ++ 0xC2,0xD3,0xAC,0x62,0x91,0x95,0xE4,0x79, ++ 0xE7,0xC8,0x37,0x6D,0x8D,0xD5,0x4E,0xA9, ++ 0x6C,0x56,0xF4,0xEA,0x65,0x7A,0xAE,0x08, ++ 0xBA,0x78,0x25,0x2E,0x1C,0xA6,0xB4,0xC6, ++ 0xE8,0xDD,0x74,0x1F,0x4B,0xBD,0x8B,0x8A, ++ 0x70,0x3E,0xB5,0x66,0x48,0x03,0xF6,0x0E, ++ 0x61,0x35,0x57,0xB9,0x86,0xC1,0x1D,0x9E, ++ 0xE1,0xF8,0x98,0x11,0x69,0xD9,0x8E,0x94, ++ 0x9B,0x1E,0x87,0xE9,0xCE,0x55,0x28,0xDF, ++ 0x8C,0xA1,0x89,0x0D,0xBF,0xE6,0x42,0x68, ++ 0x41,0x99,0x2D,0x0F,0xB0,0x54,0xBB,0x16, ++}; ++ ++/* ++ * AES is-box ++ */ ++static const uint8_t aes_isbox[256] = ++{ ++ 0x52,0x09,0x6a,0xd5,0x30,0x36,0xa5,0x38, ++ 0xbf,0x40,0xa3,0x9e,0x81,0xf3,0xd7,0xfb, ++ 0x7c,0xe3,0x39,0x82,0x9b,0x2f,0xff,0x87, ++ 0x34,0x8e,0x43,0x44,0xc4,0xde,0xe9,0xcb, ++ 0x54,0x7b,0x94,0x32,0xa6,0xc2,0x23,0x3d, ++ 0xee,0x4c,0x95,0x0b,0x42,0xfa,0xc3,0x4e, ++ 0x08,0x2e,0xa1,0x66,0x28,0xd9,0x24,0xb2, ++ 0x76,0x5b,0xa2,0x49,0x6d,0x8b,0xd1,0x25, ++ 0x72,0xf8,0xf6,0x64,0x86,0x68,0x98,0x16, ++ 0xd4,0xa4,0x5c,0xcc,0x5d,0x65,0xb6,0x92, ++ 0x6c,0x70,0x48,0x50,0xfd,0xed,0xb9,0xda, ++ 0x5e,0x15,0x46,0x57,0xa7,0x8d,0x9d,0x84, ++ 0x90,0xd8,0xab,0x00,0x8c,0xbc,0xd3,0x0a, ++ 0xf7,0xe4,0x58,0x05,0xb8,0xb3,0x45,0x06, ++ 0xd0,0x2c,0x1e,0x8f,0xca,0x3f,0x0f,0x02, ++ 0xc1,0xaf,0xbd,0x03,0x01,0x13,0x8a,0x6b, ++ 0x3a,0x91,0x11,0x41,0x4f,0x67,0xdc,0xea, ++ 0x97,0xf2,0xcf,0xce,0xf0,0xb4,0xe6,0x73, ++ 0x96,0xac,0x74,0x22,0xe7,0xad,0x35,0x85, ++ 0xe2,0xf9,0x37,0xe8,0x1c,0x75,0xdf,0x6e, ++ 0x47,0xf1,0x1a,0x71,0x1d,0x29,0xc5,0x89, ++ 0x6f,0xb7,0x62,0x0e,0xaa,0x18,0xbe,0x1b, ++ 0xfc,0x56,0x3e,0x4b,0xc6,0xd2,0x79,0x20, ++ 0x9a,0xdb,0xc0,0xfe,0x78,0xcd,0x5a,0xf4, ++ 0x1f,0xdd,0xa8,0x33,0x88,0x07,0xc7,0x31, ++ 0xb1,0x12,0x10,0x59,0x27,0x80,0xec,0x5f, ++ 0x60,0x51,0x7f,0xa9,0x19,0xb5,0x4a,0x0d, ++ 0x2d,0xe5,0x7a,0x9f,0x93,0xc9,0x9c,0xef, ++ 0xa0,0xe0,0x3b,0x4d,0xae,0x2a,0xf5,0xb0, ++ 0xc8,0xeb,0xbb,0x3c,0x83,0x53,0x99,0x61, ++ 0x17,0x2b,0x04,0x7e,0xba,0x77,0xd6,0x26, ++ 0xe1,0x69,0x14,0x63,0x55,0x21,0x0c,0x7d ++}; ++ ++static const unsigned char Rcon[30]= ++{ ++ 0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80, ++ 0x1b,0x36,0x6c,0xd8,0xab,0x4d,0x9a,0x2f, ++ 0x5e,0xbc,0x63,0xc6,0x97,0x35,0x6a,0xd4, ++ 0xb3,0x7d,0xfa,0xef,0xc5,0x91, ++}; ++ ++/* ----- static functions ----- */ ++static void AES_encrypt(const AES_CTX *ctx, uint32_t *data); ++static void AES_decrypt(const AES_CTX *ctx, uint32_t *data); ++ ++/* Perform doubling in Galois Field GF(2^8) using the irreducible polynomial ++ x^8+x^4+x^3+x+1 */ ++static unsigned char AES_xtime(uint32_t x) ++{ ++ return x = (x&0x80) ? (x<<1)^0x1b : x<<1; ++} ++ ++/** ++ * Set up AES with the key/iv and cipher size. ++ */ ++void AES_set_key(AES_CTX *ctx, const uint8_t *key, ++ const uint8_t *iv, AES_MODE mode) ++{ ++ int i, ii; ++ uint32_t *W, tmp, tmp2; ++ const unsigned char *ip; ++ int words; ++ ++ switch (mode) ++ { ++ case AES_MODE_128: ++ i = 10; ++ words = 4; ++ break; ++ ++ case AES_MODE_256: ++ i = 14; ++ words = 8; ++ break; ++ ++ default: /* fail silently */ ++ return; ++ } ++ ++ ctx->rounds = i; ++ ctx->key_size = words; ++ W = ctx->ks; ++ for (i = 0; i < words; i+=2) ++ { ++ W[i+0]= ((uint32_t)key[ 0]<<24)| ++ ((uint32_t)key[ 1]<<16)| ++ ((uint32_t)key[ 2]<< 8)| ++ ((uint32_t)key[ 3] ); ++ W[i+1]= ((uint32_t)key[ 4]<<24)| ++ ((uint32_t)key[ 5]<<16)| ++ ((uint32_t)key[ 6]<< 8)| ++ ((uint32_t)key[ 7] ); ++ key += 8; ++ } ++ ++ ip = Rcon; ++ ii = 4 * (ctx->rounds+1); ++ for (i = words; i> 8)&0xff]<<16; ++ tmp2|=(uint32_t)aes_sbox[(tmp>>16)&0xff]<<24; ++ tmp2|=(uint32_t)aes_sbox[(tmp>>24) ]; ++ tmp=tmp2^(((unsigned int)*ip)<<24); ++ ip++; ++ } ++ ++ if ((words == 8) && ((i % words) == 4)) ++ { ++ tmp2 =(uint32_t)aes_sbox[(tmp )&0xff] ; ++ tmp2|=(uint32_t)aes_sbox[(tmp>> 8)&0xff]<< 8; ++ tmp2|=(uint32_t)aes_sbox[(tmp>>16)&0xff]<<16; ++ tmp2|=(uint32_t)aes_sbox[(tmp>>24) ]<<24; ++ tmp=tmp2; ++ } ++ ++ W[i]=W[i-words]^tmp; ++ } ++ ++ /* copy the iv across */ ++ memcpy(ctx->iv, iv, 16); ++} ++ ++/** ++ * Change a key for decryption. ++ */ ++void AES_convert_key(AES_CTX *ctx) ++{ ++ int i; ++ uint32_t *k,w,t1,t2,t3,t4; ++ ++ k = ctx->ks; ++ k += 4; ++ ++ for (i= ctx->rounds*4; i > 4; i--) ++ { ++ w= *k; ++ w = inv_mix_col(w,t1,t2,t3,t4); ++ *k++ =w; ++ } ++} ++ ++/** ++ * Encrypt a byte sequence (with a block size 16) using the AES cipher. ++ */ ++void AES_cbc_encrypt(AES_CTX *ctx, const uint8_t *msg, uint8_t *out, int length) ++{ ++ int i; ++ uint32_t tin[4], tout[4], iv[4]; ++ ++ memcpy(iv, ctx->iv, AES_IV_SIZE); ++ for (i = 0; i < 4; i++) ++ tout[i] = ntohl(iv[i]); ++ ++ for (length -= AES_BLOCKSIZE; length >= 0; length -= AES_BLOCKSIZE) ++ { ++ uint32_t msg_32[4]; ++ uint32_t out_32[4]; ++ memcpy(msg_32, msg, AES_BLOCKSIZE); ++ msg += AES_BLOCKSIZE; ++ ++ for (i = 0; i < 4; i++) ++ tin[i] = ntohl(msg_32[i])^tout[i]; ++ ++ AES_encrypt(ctx, tin); ++ ++ for (i = 0; i < 4; i++) ++ { ++ tout[i] = tin[i]; ++ out_32[i] = htonl(tout[i]); ++ } ++ ++ memcpy(out, out_32, AES_BLOCKSIZE); ++ out += AES_BLOCKSIZE; ++ } ++ ++ for (i = 0; i < 4; i++) ++ iv[i] = htonl(tout[i]); ++ memcpy(ctx->iv, iv, AES_IV_SIZE); ++} ++ ++/** ++ * Decrypt a byte sequence (with a block size 16) using the AES cipher. ++ */ ++void AES_cbc_decrypt(AES_CTX *ctx, const uint8_t *msg, uint8_t *out, int length) ++{ ++ int i; ++ uint32_t tin[4], xor[4], tout[4], data[4], iv[4]; ++ ++ memcpy(iv, ctx->iv, AES_IV_SIZE); ++ for (i = 0; i < 4; i++) ++ xor[i] = ntohl(iv[i]); ++ ++ for (length -= 16; length >= 0; length -= 16) ++ { ++ uint32_t msg_32[4]; ++ uint32_t out_32[4]; ++ memcpy(msg_32, msg, AES_BLOCKSIZE); ++ msg += AES_BLOCKSIZE; ++ ++ for (i = 0; i < 4; i++) ++ { ++ tin[i] = ntohl(msg_32[i]); ++ data[i] = tin[i]; ++ } ++ ++ AES_decrypt(ctx, data); ++ ++ for (i = 0; i < 4; i++) ++ { ++ tout[i] = data[i]^xor[i]; ++ xor[i] = tin[i]; ++ out_32[i] = htonl(tout[i]); ++ } ++ ++ memcpy(out, out_32, AES_BLOCKSIZE); ++ out += AES_BLOCKSIZE; ++ } ++ ++ for (i = 0; i < 4; i++) ++ iv[i] = htonl(xor[i]); ++ memcpy(ctx->iv, iv, AES_IV_SIZE); ++} ++ ++/** ++ * Encrypt a single block (16 bytes) of data ++ */ ++static void AES_encrypt(const AES_CTX *ctx, uint32_t *data) ++{ ++ /* To make this code smaller, generate the sbox entries on the fly. ++ * This will have a really heavy effect upon performance. ++ */ ++ uint32_t tmp[4]; ++ uint32_t tmp1, old_a0, a0, a1, a2, a3, row; ++ int curr_rnd; ++ int rounds = ctx->rounds; ++ const uint32_t *k = ctx->ks; ++ ++ /* Pre-round key addition */ ++ for (row = 0; row < 4; row++) ++ data[row] ^= *(k++); ++ ++ /* Encrypt one block. */ ++ for (curr_rnd = 0; curr_rnd < rounds; curr_rnd++) ++ { ++ /* Perform ByteSub and ShiftRow operations together */ ++ for (row = 0; row < 4; row++) ++ { ++ a0 = (uint32_t)aes_sbox[(data[row%4]>>24)&0xFF]; ++ a1 = (uint32_t)aes_sbox[(data[(row+1)%4]>>16)&0xFF]; ++ a2 = (uint32_t)aes_sbox[(data[(row+2)%4]>>8)&0xFF]; ++ a3 = (uint32_t)aes_sbox[(data[(row+3)%4])&0xFF]; ++ ++ /* Perform MixColumn iff not last round */ ++ if (curr_rnd < (rounds - 1)) ++ { ++ tmp1 = a0 ^ a1 ^ a2 ^ a3; ++ old_a0 = a0; ++ a0 ^= tmp1 ^ AES_xtime(a0 ^ a1); ++ a1 ^= tmp1 ^ AES_xtime(a1 ^ a2); ++ a2 ^= tmp1 ^ AES_xtime(a2 ^ a3); ++ a3 ^= tmp1 ^ AES_xtime(a3 ^ old_a0); ++ } ++ ++ tmp[row] = ((a0 << 24) | (a1 << 16) | (a2 << 8) | a3); ++ } ++ ++ /* KeyAddition - note that it is vital that this loop is separate from ++ the MixColumn operation, which must be atomic...*/ ++ for (row = 0; row < 4; row++) ++ data[row] = tmp[row] ^ *(k++); ++ } ++} ++ ++/** ++ * Decrypt a single block (16 bytes) of data ++ */ ++static void AES_decrypt(const AES_CTX *ctx, uint32_t *data) ++{ ++ uint32_t tmp[4]; ++ uint32_t xt0,xt1,xt2,xt3,xt4,xt5,xt6; ++ uint32_t a0, a1, a2, a3, row; ++ int curr_rnd; ++ int rounds = ctx->rounds; ++ const uint32_t *k = ctx->ks + ((rounds+1)*4); ++ ++ /* pre-round key addition */ ++ for (row=4; row > 0;row--) ++ data[row-1] ^= *(--k); ++ ++ /* Decrypt one block */ ++ for (curr_rnd = 0; curr_rnd < rounds; curr_rnd++) ++ { ++ /* Perform ByteSub and ShiftRow operations together */ ++ for (row = 4; row > 0; row--) ++ { ++ a0 = aes_isbox[(data[(row+3)%4]>>24)&0xFF]; ++ a1 = aes_isbox[(data[(row+2)%4]>>16)&0xFF]; ++ a2 = aes_isbox[(data[(row+1)%4]>>8)&0xFF]; ++ a3 = aes_isbox[(data[row%4])&0xFF]; ++ ++ /* Perform MixColumn iff not last round */ ++ if (curr_rnd<(rounds-1)) ++ { ++ /* The MDS cofefficients (0x09, 0x0B, 0x0D, 0x0E) ++ are quite large compared to encryption; this ++ operation slows decryption down noticeably. */ ++ xt0 = AES_xtime(a0^a1); ++ xt1 = AES_xtime(a1^a2); ++ xt2 = AES_xtime(a2^a3); ++ xt3 = AES_xtime(a3^a0); ++ xt4 = AES_xtime(xt0^xt1); ++ xt5 = AES_xtime(xt1^xt2); ++ xt6 = AES_xtime(xt4^xt5); ++ ++ xt0 ^= a1^a2^a3^xt4^xt6; ++ xt1 ^= a0^a2^a3^xt5^xt6; ++ xt2 ^= a0^a1^a3^xt4^xt6; ++ xt3 ^= a0^a1^a2^xt5^xt6; ++ tmp[row-1] = ((xt0<<24)|(xt1<<16)|(xt2<<8)|xt3); ++ } ++ else ++ tmp[row-1] = ((a0<<24)|(a1<<16)|(a2<<8)|a3); ++ } ++ ++ for (row = 4; row > 0; row--) ++ data[row-1] = tmp[row-1] ^ *(--k); ++ } ++} ++ ++#endif +diff --git a/feeds/luci/libs/luci-lib-nixio/axTLS/crypto/bigint.c b/feeds/luci/libs/luci-lib-nixio/axTLS/crypto/bigint.c +new file mode 100644 +index 0000000..53a5839 +--- /dev/null ++++ b/feeds/luci/libs/luci-lib-nixio/axTLS/crypto/bigint.c +@@ -0,0 +1,1575 @@ ++/* ++ * Copyright (c) 2007, Cameron Rich ++ * ++ * All rights reserved. ++ * ++ * Redistribution and use in source and binary forms, with or without ++ * modification, are permitted provided that the following conditions are met: ++ * ++ * * Redistributions of source code must retain the above copyright notice, ++ * this list of conditions and the following disclaimer. ++ * * 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. ++ * * Neither the name of the axTLS project nor the names of its contributors ++ * may be used to endorse or promote products derived from this software ++ * without specific prior written permission. ++ * ++ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ++ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT ++ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR ++ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR ++ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, ++ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, ++ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR ++ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF ++ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING ++ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS ++ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ++ */ ++ ++/** ++ * @defgroup bigint_api Big Integer API ++ * @brief The bigint implementation as used by the axTLS project. ++ * ++ * The bigint library is for RSA encryption/decryption as well as signing. ++ * This code tries to minimise use of malloc/free by maintaining a small ++ * cache. A bigint context may maintain state by being made "permanent". ++ * It be be later released with a bi_depermanent() and bi_free() call. ++ * ++ * It supports the following reduction techniques: ++ * - Classical ++ * - Barrett ++ * - Montgomery ++ * ++ * It also implements the following: ++ * - Karatsuba multiplication ++ * - Squaring ++ * - Sliding window exponentiation ++ * - Chinese Remainder Theorem (implemented in rsa.c). ++ * ++ * All the algorithms used are pretty standard, and designed for different ++ * data bus sizes. Negative numbers are not dealt with at all, so a subtraction ++ * may need to be tested for negativity. ++ * ++ * This library steals some ideas from Jef Poskanzer ++ * ++ * and GMP . It gets most of its implementation ++ * detail from "The Handbook of Applied Cryptography" ++ * ++ * @{ ++ */ ++ ++#include ++#include ++#include ++#include ++#include ++#include "bigint.h" ++ ++#define V1 v->comps[v->size-1] /**< v1 for division */ ++#define V2 v->comps[v->size-2] /**< v2 for division */ ++#define U(j) tmp_u->comps[tmp_u->size-j-1] /**< uj for division */ ++#define Q(j) quotient->comps[quotient->size-j-1] /**< qj for division */ ++ ++static bigint *bi_int_multiply(BI_CTX *ctx, bigint *bi, comp i); ++static bigint *bi_int_divide(BI_CTX *ctx, bigint *biR, comp denom); ++static bigint *alloc(BI_CTX *ctx, int size); ++static bigint *trim(bigint *bi); ++static void more_comps(bigint *bi, int n); ++#if defined(CONFIG_BIGINT_KARATSUBA) || defined(CONFIG_BIGINT_BARRETT) || \ ++ defined(CONFIG_BIGINT_MONTGOMERY) ++static bigint *comp_right_shift(bigint *biR, int num_shifts); ++static bigint *comp_left_shift(bigint *biR, int num_shifts); ++#endif ++ ++#ifdef CONFIG_BIGINT_CHECK_ON ++static void check(const bigint *bi); ++#else ++#define check(A) /**< disappears in normal production mode */ ++#endif ++ ++ ++/** ++ * @brief Start a new bigint context. ++ * @return A bigint context. ++ */ ++BI_CTX *bi_initialize(void) ++{ ++ /* calloc() sets everything to zero */ ++ BI_CTX *ctx = (BI_CTX *)calloc(1, sizeof(BI_CTX)); ++ ++ /* the radix */ ++ ctx->bi_radix = alloc(ctx, 2); ++ ctx->bi_radix->comps[0] = 0; ++ ctx->bi_radix->comps[1] = 1; ++ bi_permanent(ctx->bi_radix); ++ return ctx; ++} ++ ++/** ++ * @brief Close the bigint context and free any resources. ++ * ++ * Free up any used memory - a check is done if all objects were not ++ * properly freed. ++ * @param ctx [in] The bigint session context. ++ */ ++void bi_terminate(BI_CTX *ctx) ++{ ++ bi_depermanent(ctx->bi_radix); ++ bi_free(ctx, ctx->bi_radix); ++ ++ if (ctx->active_count != 0) ++ { ++#ifdef CONFIG_SSL_FULL_MODE ++ printf("bi_terminate: there were %d un-freed bigints\n", ++ ctx->active_count); ++#endif ++ abort(); ++ } ++ ++ bi_clear_cache(ctx); ++ free(ctx); ++} ++ ++/** ++ *@brief Clear the memory cache. ++ */ ++void bi_clear_cache(BI_CTX *ctx) ++{ ++ bigint *p, *pn; ++ ++ if (ctx->free_list == NULL) ++ return; ++ ++ for (p = ctx->free_list; p != NULL; p = pn) ++ { ++ pn = p->next; ++ free(p->comps); ++ free(p); ++ } ++ ++ ctx->free_count = 0; ++ ctx->free_list = NULL; ++} ++ ++/** ++ * @brief Increment the number of references to this object. ++ * It does not do a full copy. ++ * @param bi [in] The bigint to copy. ++ * @return A reference to the same bigint. ++ */ ++bigint *bi_copy(bigint *bi) ++{ ++ check(bi); ++ if (bi->refs != PERMANENT) ++ bi->refs++; ++ return bi; ++} ++ ++/** ++ * @brief Simply make a bigint object "unfreeable" if bi_free() is called on it. ++ * ++ * For this object to be freed, bi_depermanent() must be called. ++ * @param bi [in] The bigint to be made permanent. ++ */ ++void bi_permanent(bigint *bi) ++{ ++ check(bi); ++ if (bi->refs != 1) ++ { ++#ifdef CONFIG_SSL_FULL_MODE ++ printf("bi_permanent: refs was not 1\n"); ++#endif ++ abort(); ++ } ++ ++ bi->refs = PERMANENT; ++} ++ ++/** ++ * @brief Take a permanent object and make it eligible for freedom. ++ * @param bi [in] The bigint to be made back to temporary. ++ */ ++void bi_depermanent(bigint *bi) ++{ ++ check(bi); ++ if (bi->refs != PERMANENT) ++ { ++#ifdef CONFIG_SSL_FULL_MODE ++ printf("bi_depermanent: bigint was not permanent\n"); ++#endif ++ abort(); ++ } ++ ++ bi->refs = 1; ++} ++ ++/** ++ * @brief Free a bigint object so it can be used again. ++ * ++ * The memory itself it not actually freed, just tagged as being available ++ * @param ctx [in] The bigint session context. ++ * @param bi [in] The bigint to be freed. ++ */ ++void bi_free(BI_CTX *ctx, bigint *bi) ++{ ++ check(bi); ++ if (bi->refs == PERMANENT) ++ { ++ return; ++ } ++ ++ if (--bi->refs > 0) ++ { ++ return; ++ } ++ ++ bi->next = ctx->free_list; ++ ctx->free_list = bi; ++ ctx->free_count++; ++ ++ if (--ctx->active_count < 0) ++ { ++#ifdef CONFIG_SSL_FULL_MODE ++ printf("bi_free: active_count went negative " ++ "- double-freed bigint?\n"); ++#endif ++ abort(); ++ } ++} ++ ++/** ++ * @brief Convert an (unsigned) integer into a bigint. ++ * @param ctx [in] The bigint session context. ++ * @param i [in] The (unsigned) integer to be converted. ++ * ++ */ ++bigint *int_to_bi(BI_CTX *ctx, comp i) ++{ ++ bigint *biR = alloc(ctx, 1); ++ biR->comps[0] = i; ++ return biR; ++} ++ ++/** ++ * @brief Do a full copy of the bigint object. ++ * @param ctx [in] The bigint session context. ++ * @param bi [in] The bigint object to be copied. ++ */ ++bigint *bi_clone(BI_CTX *ctx, const bigint *bi) ++{ ++ bigint *biR = alloc(ctx, bi->size); ++ check(bi); ++ memcpy(biR->comps, bi->comps, bi->size*COMP_BYTE_SIZE); ++ return biR; ++} ++ ++/** ++ * @brief Perform an addition operation between two bigints. ++ * @param ctx [in] The bigint session context. ++ * @param bia [in] A bigint. ++ * @param bib [in] Another bigint. ++ * @return The result of the addition. ++ */ ++bigint *bi_add(BI_CTX *ctx, bigint *bia, bigint *bib) ++{ ++ int n; ++ comp carry = 0; ++ comp *pa, *pb; ++ ++ check(bia); ++ check(bib); ++ ++ n = max(bia->size, bib->size); ++ more_comps(bia, n+1); ++ more_comps(bib, n); ++ pa = bia->comps; ++ pb = bib->comps; ++ ++ do ++ { ++ comp sl, rl, cy1; ++ sl = *pa + *pb++; ++ rl = sl + carry; ++ cy1 = sl < *pa; ++ carry = cy1 | (rl < sl); ++ *pa++ = rl; ++ } while (--n != 0); ++ ++ *pa = carry; /* do overflow */ ++ bi_free(ctx, bib); ++ return trim(bia); ++} ++ ++/** ++ * @brief Perform a subtraction operation between two bigints. ++ * @param ctx [in] The bigint session context. ++ * @param bia [in] A bigint. ++ * @param bib [in] Another bigint. ++ * @param is_negative [out] If defined, indicates that the result was negative. ++ * is_negative may be null. ++ * @return The result of the subtraction. The result is always positive. ++ */ ++bigint *bi_subtract(BI_CTX *ctx, ++ bigint *bia, bigint *bib, int *is_negative) ++{ ++ int n = bia->size; ++ comp *pa, *pb, carry = 0; ++ ++ check(bia); ++ check(bib); ++ ++ more_comps(bib, n); ++ pa = bia->comps; ++ pb = bib->comps; ++ ++ do ++ { ++ comp sl, rl, cy1; ++ sl = *pa - *pb++; ++ rl = sl - carry; ++ cy1 = sl > *pa; ++ carry = cy1 | (rl > sl); ++ *pa++ = rl; ++ } while (--n != 0); ++ ++ if (is_negative) /* indicate a negative result */ ++ { ++ *is_negative = carry; ++ } ++ ++ bi_free(ctx, trim(bib)); /* put bib back to the way it was */ ++ return trim(bia); ++} ++ ++/** ++ * Perform a multiply between a bigint an an (unsigned) integer ++ */ ++static bigint *bi_int_multiply(BI_CTX *ctx, bigint *bia, comp b) ++{ ++ int j = 0, n = bia->size; ++ bigint *biR = alloc(ctx, n + 1); ++ comp carry = 0; ++ comp *r = biR->comps; ++ comp *a = bia->comps; ++ ++ check(bia); ++ ++ /* clear things to start with */ ++ memset(r, 0, ((n+1)*COMP_BYTE_SIZE)); ++ ++ do ++ { ++ long_comp tmp = *r + (long_comp)a[j]*b + carry; ++ *r++ = (comp)tmp; /* downsize */ ++ carry = (comp)(tmp >> COMP_BIT_SIZE); ++ } while (++j < n); ++ ++ *r = carry; ++ bi_free(ctx, bia); ++ return trim(biR); ++} ++ ++/** ++ * @brief Does both division and modulo calculations. ++ * ++ * Used extensively when doing classical reduction. ++ * @param ctx [in] The bigint session context. ++ * @param u [in] A bigint which is the numerator. ++ * @param v [in] Either the denominator or the modulus depending on the mode. ++ * @param is_mod [n] Determines if this is a normal division (0) or a reduction ++ * (1). ++ * @return The result of the division/reduction. ++ */ ++bigint *bi_divide(BI_CTX *ctx, bigint *u, bigint *v, int is_mod) ++{ ++ int n = v->size, m = u->size-n; ++ int j = 0, orig_u_size = u->size; ++ uint8_t mod_offset = ctx->mod_offset; ++ comp d; ++ bigint *quotient, *tmp_u; ++ comp q_dash; ++ ++ check(u); ++ check(v); ++ ++ /* if doing reduction and we are < mod, then return mod */ ++ if (is_mod && bi_compare(v, u) > 0) ++ { ++ bi_free(ctx, v); ++ return u; ++ } ++ ++ quotient = alloc(ctx, m+1); ++ tmp_u = alloc(ctx, n+1); ++ v = trim(v); /* make sure we have no leading 0's */ ++ d = (comp)((long_comp)COMP_RADIX/(V1+1)); ++ ++ /* clear things to start with */ ++ memset(quotient->comps, 0, ((quotient->size)*COMP_BYTE_SIZE)); ++ ++ /* normalise */ ++ if (d > 1) ++ { ++ u = bi_int_multiply(ctx, u, d); ++ ++ if (is_mod) ++ { ++ v = ctx->bi_normalised_mod[mod_offset]; ++ } ++ else ++ { ++ v = bi_int_multiply(ctx, v, d); ++ } ++ } ++ ++ if (orig_u_size == u->size) /* new digit position u0 */ ++ { ++ more_comps(u, orig_u_size + 1); ++ } ++ ++ do ++ { ++ /* get a temporary short version of u */ ++ memcpy(tmp_u->comps, &u->comps[u->size-n-1-j], (n+1)*COMP_BYTE_SIZE); ++ ++ /* calculate q' */ ++ if (U(0) == V1) ++ { ++ q_dash = COMP_RADIX-1; ++ } ++ else ++ { ++ q_dash = (comp)(((long_comp)U(0)*COMP_RADIX + U(1))/V1); ++ } ++ ++ if (v->size > 1 && V2) ++ { ++ /* we are implementing the following: ++ if (V2*q_dash > (((U(0)*COMP_RADIX + U(1) - ++ q_dash*V1)*COMP_RADIX) + U(2))) ... */ ++ comp inner = (comp)((long_comp)COMP_RADIX*U(0) + U(1) - ++ (long_comp)q_dash*V1); ++ if ((long_comp)V2*q_dash > (long_comp)inner*COMP_RADIX + U(2)) ++ { ++ q_dash--; ++ } ++ } ++ ++ /* multiply and subtract */ ++ if (q_dash) ++ { ++ int is_negative; ++ tmp_u = bi_subtract(ctx, tmp_u, ++ bi_int_multiply(ctx, bi_copy(v), q_dash), &is_negative); ++ more_comps(tmp_u, n+1); ++ ++ Q(j) = q_dash; ++ ++ /* add back */ ++ if (is_negative) ++ { ++ Q(j)--; ++ tmp_u = bi_add(ctx, tmp_u, bi_copy(v)); ++ ++ /* lop off the carry */ ++ tmp_u->size--; ++ v->size--; ++ } ++ } ++ else ++ { ++ Q(j) = 0; ++ } ++ ++ /* copy back to u */ ++ memcpy(&u->comps[u->size-n-1-j], tmp_u->comps, (n+1)*COMP_BYTE_SIZE); ++ } while (++j <= m); ++ ++ bi_free(ctx, tmp_u); ++ bi_free(ctx, v); ++ ++ if (is_mod) /* get the remainder */ ++ { ++ bi_free(ctx, quotient); ++ return bi_int_divide(ctx, trim(u), d); ++ } ++ else /* get the quotient */ ++ { ++ bi_free(ctx, u); ++ return trim(quotient); ++ } ++} ++ ++/* ++ * Perform an integer divide on a bigint. ++ */ ++static bigint *bi_int_divide(BI_CTX *ctx, bigint *biR, comp denom) ++{ ++ int i = biR->size - 1; ++ long_comp r = 0; ++ ++ check(biR); ++ ++ do ++ { ++ r = (r<comps[i]; ++ biR->comps[i] = (comp)(r / denom); ++ r %= denom; ++ } while (--i >= 0); ++ ++ return trim(biR); ++} ++ ++#ifdef CONFIG_BIGINT_MONTGOMERY ++/** ++ * There is a need for the value of integer N' such that B^-1(B-1)-N^-1N'=1, ++ * where B^-1(B-1) mod N=1. Actually, only the least significant part of ++ * N' is needed, hence the definition N0'=N' mod b. We reproduce below the ++ * simple algorithm from an article by Dusse and Kaliski to efficiently ++ * find N0' from N0 and b */ ++static comp modular_inverse(bigint *bim) ++{ ++ int i; ++ comp t = 1; ++ comp two_2_i_minus_1 = 2; /* 2^(i-1) */ ++ long_comp two_2_i = 4; /* 2^i */ ++ comp N = bim->comps[0]; ++ ++ for (i = 2; i <= COMP_BIT_SIZE; i++) ++ { ++ if ((long_comp)N*t%two_2_i >= two_2_i_minus_1) ++ { ++ t += two_2_i_minus_1; ++ } ++ ++ two_2_i_minus_1 <<= 1; ++ two_2_i <<= 1; ++ } ++ ++ return (comp)(COMP_RADIX-t); ++} ++#endif ++ ++#if defined(CONFIG_BIGINT_KARATSUBA) || defined(CONFIG_BIGINT_BARRETT) || \ ++ defined(CONFIG_BIGINT_MONTGOMERY) ++/** ++ * Take each component and shift down (in terms of components) ++ */ ++static bigint *comp_right_shift(bigint *biR, int num_shifts) ++{ ++ int i = biR->size-num_shifts; ++ comp *x = biR->comps; ++ comp *y = &biR->comps[num_shifts]; ++ ++ check(biR); ++ ++ if (i <= 0) /* have we completely right shifted? */ ++ { ++ biR->comps[0] = 0; /* return 0 */ ++ biR->size = 1; ++ return biR; ++ } ++ ++ do ++ { ++ *x++ = *y++; ++ } while (--i > 0); ++ ++ biR->size -= num_shifts; ++ return biR; ++} ++ ++/** ++ * Take each component and shift it up (in terms of components) ++ */ ++static bigint *comp_left_shift(bigint *biR, int num_shifts) ++{ ++ int i = biR->size-1; ++ comp *x, *y; ++ ++ check(biR); ++ ++ if (num_shifts <= 0) ++ { ++ return biR; ++ } ++ ++ more_comps(biR, biR->size + num_shifts); ++ ++ x = &biR->comps[i+num_shifts]; ++ y = &biR->comps[i]; ++ ++ do ++ { ++ *x-- = *y--; ++ } while (i--); ++ ++ memset(biR->comps, 0, num_shifts*COMP_BYTE_SIZE); /* zero LS comps */ ++ return biR; ++} ++#endif ++ ++/** ++ * @brief Allow a binary sequence to be imported as a bigint. ++ * @param ctx [in] The bigint session context. ++ * @param data [in] The data to be converted. ++ * @param size [in] The number of bytes of data. ++ * @return A bigint representing this data. ++ */ ++bigint *bi_import(BI_CTX *ctx, const uint8_t *data, int size) ++{ ++ bigint *biR = alloc(ctx, (size+COMP_BYTE_SIZE-1)/COMP_BYTE_SIZE); ++ int i, j = 0, offset = 0; ++ ++ memset(biR->comps, 0, biR->size*COMP_BYTE_SIZE); ++ ++ for (i = size-1; i >= 0; i--) ++ { ++ biR->comps[offset] += data[i] << (j*8); ++ ++ if (++j == COMP_BYTE_SIZE) ++ { ++ j = 0; ++ offset ++; ++ } ++ } ++ ++ return trim(biR); ++} ++ ++#ifdef CONFIG_SSL_FULL_MODE ++/** ++ * @brief The testharness uses this code to import text hex-streams and ++ * convert them into bigints. ++ * @param ctx [in] The bigint session context. ++ * @param data [in] A string consisting of hex characters. The characters must ++ * be in upper case. ++ * @return A bigint representing this data. ++ */ ++bigint *bi_str_import(BI_CTX *ctx, const char *data) ++{ ++ int size = strlen(data); ++ bigint *biR = alloc(ctx, (size+COMP_NUM_NIBBLES-1)/COMP_NUM_NIBBLES); ++ int i, j = 0, offset = 0; ++ memset(biR->comps, 0, biR->size*COMP_BYTE_SIZE); ++ ++ for (i = size-1; i >= 0; i--) ++ { ++ int num = (data[i] <= '9') ? (data[i] - '0') : (data[i] - 'A' + 10); ++ biR->comps[offset] += num << (j*4); ++ ++ if (++j == COMP_NUM_NIBBLES) ++ { ++ j = 0; ++ offset ++; ++ } ++ } ++ ++ return biR; ++} ++ ++void bi_print(const char *label, bigint *x) ++{ ++ int i, j; ++ ++ if (x == NULL) ++ { ++ printf("%s: (null)\n", label); ++ return; ++ } ++ ++ printf("%s: (size %d)\n", label, x->size); ++ for (i = x->size-1; i >= 0; i--) ++ { ++ for (j = COMP_NUM_NIBBLES-1; j >= 0; j--) ++ { ++ comp mask = 0x0f << (j*4); ++ comp num = (x->comps[i] & mask) >> (j*4); ++ putc((num <= 9) ? (num + '0') : (num + 'A' - 10), stdout); ++ } ++ } ++ ++ printf("\n"); ++} ++#endif ++ ++/** ++ * @brief Take a bigint and convert it into a byte sequence. ++ * ++ * This is useful after a decrypt operation. ++ * @param ctx [in] The bigint session context. ++ * @param x [in] The bigint to be converted. ++ * @param data [out] The converted data as a byte stream. ++ * @param size [in] The maximum size of the byte stream. Unused bytes will be ++ * zeroed. ++ */ ++void bi_export(BI_CTX *ctx, bigint *x, uint8_t *data, int size) ++{ ++ int i, j, k = size-1; ++ ++ check(x); ++ memset(data, 0, size); /* ensure all leading 0's are cleared */ ++ ++ for (i = 0; i < x->size; i++) ++ { ++ for (j = 0; j < COMP_BYTE_SIZE; j++) ++ { ++ comp mask = 0xff << (j*8); ++ int num = (x->comps[i] & mask) >> (j*8); ++ data[k--] = num; ++ ++ if (k < 0) ++ { ++ break; ++ } ++ } ++ } ++ ++ bi_free(ctx, x); ++} ++ ++/** ++ * @brief Pre-calculate some of the expensive steps in reduction. ++ * ++ * This function should only be called once (normally when a session starts). ++ * When the session is over, bi_free_mod() should be called. bi_mod_power() ++ * relies on this function being called. ++ * @param ctx [in] The bigint session context. ++ * @param bim [in] The bigint modulus that will be used. ++ * @param mod_offset [in] There are three moduluii that can be stored - the ++ * standard modulus, and its two primes p and q. This offset refers to which ++ * modulus we are referring to. ++ * @see bi_free_mod(), bi_mod_power(). ++ */ ++void bi_set_mod(BI_CTX *ctx, bigint *bim, int mod_offset) ++{ ++ int k = bim->size; ++ comp d = (comp)((long_comp)COMP_RADIX/(bim->comps[k-1]+1)); ++#ifdef CONFIG_BIGINT_MONTGOMERY ++ bigint *R, *R2; ++#endif ++ ++ ctx->bi_mod[mod_offset] = bim; ++ bi_permanent(ctx->bi_mod[mod_offset]); ++ ctx->bi_normalised_mod[mod_offset] = bi_int_multiply(ctx, bim, d); ++ bi_permanent(ctx->bi_normalised_mod[mod_offset]); ++ ++#if defined(CONFIG_BIGINT_MONTGOMERY) ++ /* set montgomery variables */ ++ R = comp_left_shift(bi_clone(ctx, ctx->bi_radix), k-1); /* R */ ++ R2 = comp_left_shift(bi_clone(ctx, ctx->bi_radix), k*2-1); /* R^2 */ ++ ctx->bi_RR_mod_m[mod_offset] = bi_mod(ctx, R2); /* R^2 mod m */ ++ ctx->bi_R_mod_m[mod_offset] = bi_mod(ctx, R); /* R mod m */ ++ ++ bi_permanent(ctx->bi_RR_mod_m[mod_offset]); ++ bi_permanent(ctx->bi_R_mod_m[mod_offset]); ++ ++ ctx->N0_dash[mod_offset] = modular_inverse(ctx->bi_mod[mod_offset]); ++ ++#elif defined (CONFIG_BIGINT_BARRETT) ++ ctx->bi_mu[mod_offset] = ++ bi_divide(ctx, comp_left_shift( ++ bi_clone(ctx, ctx->bi_radix), k*2-1), ctx->bi_mod[mod_offset], 0); ++ bi_permanent(ctx->bi_mu[mod_offset]); ++#endif ++} ++ ++/** ++ * @brief Used when cleaning various bigints at the end of a session. ++ * @param ctx [in] The bigint session context. ++ * @param mod_offset [in] The offset to use. ++ * @see bi_set_mod(). ++ */ ++void bi_free_mod(BI_CTX *ctx, int mod_offset) ++{ ++ bi_depermanent(ctx->bi_mod[mod_offset]); ++ bi_free(ctx, ctx->bi_mod[mod_offset]); ++#if defined (CONFIG_BIGINT_MONTGOMERY) ++ bi_depermanent(ctx->bi_RR_mod_m[mod_offset]); ++ bi_depermanent(ctx->bi_R_mod_m[mod_offset]); ++ bi_free(ctx, ctx->bi_RR_mod_m[mod_offset]); ++ bi_free(ctx, ctx->bi_R_mod_m[mod_offset]); ++#elif defined(CONFIG_BIGINT_BARRETT) ++ bi_depermanent(ctx->bi_mu[mod_offset]); ++ bi_free(ctx, ctx->bi_mu[mod_offset]); ++#endif ++ bi_depermanent(ctx->bi_normalised_mod[mod_offset]); ++ bi_free(ctx, ctx->bi_normalised_mod[mod_offset]); ++} ++ ++/** ++ * Perform a standard multiplication between two bigints. ++ */ ++static bigint *regular_multiply(BI_CTX *ctx, bigint *bia, bigint *bib) ++{ ++ int i, j, i_plus_j; ++ int n = bia->size; ++ int t = bib->size; ++ bigint *biR = alloc(ctx, n + t); ++ comp *sr = biR->comps; ++ comp *sa = bia->comps; ++ comp *sb = bib->comps; ++ ++ check(bia); ++ check(bib); ++ ++ /* clear things to start with */ ++ memset(biR->comps, 0, ((n+t)*COMP_BYTE_SIZE)); ++ i = 0; ++ ++ do ++ { ++ comp carry = 0; ++ comp b = *sb++; ++ i_plus_j = i; ++ j = 0; ++ ++ do ++ { ++ long_comp tmp = sr[i_plus_j] + (long_comp)sa[j]*b + carry; ++ sr[i_plus_j++] = (comp)tmp; /* downsize */ ++ carry = (comp)(tmp >> COMP_BIT_SIZE); ++ } while (++j < n); ++ ++ sr[i_plus_j] = carry; ++ } while (++i < t); ++ ++ bi_free(ctx, bia); ++ bi_free(ctx, bib); ++ return trim(biR); ++} ++ ++#ifdef CONFIG_BIGINT_KARATSUBA ++/* ++ * Karatsuba improves on regular multiplication due to only 3 multiplications ++ * being done instead of 4. The additional additions/subtractions are O(N) ++ * rather than O(N^2) and so for big numbers it saves on a few operations ++ */ ++static bigint *karatsuba(BI_CTX *ctx, bigint *bia, bigint *bib, int is_square) ++{ ++ bigint *x0, *x1; ++ bigint *p0, *p1, *p2; ++ int m; ++ ++ if (is_square) ++ { ++ m = (bia->size + 1)/2; ++ } ++ else ++ { ++ m = (max(bia->size, bib->size) + 1)/2; ++ } ++ ++ x0 = bi_clone(ctx, bia); ++ x0->size = m; ++ x1 = bi_clone(ctx, bia); ++ comp_right_shift(x1, m); ++ bi_free(ctx, bia); ++ ++ /* work out the 3 partial products */ ++ if (is_square) ++ { ++ p0 = bi_square(ctx, bi_copy(x0)); ++ p2 = bi_square(ctx, bi_copy(x1)); ++ p1 = bi_square(ctx, bi_add(ctx, x0, x1)); ++ } ++ else /* normal multiply */ ++ { ++ bigint *y0, *y1; ++ y0 = bi_clone(ctx, bib); ++ y0->size = m; ++ y1 = bi_clone(ctx, bib); ++ comp_right_shift(y1, m); ++ bi_free(ctx, bib); ++ ++ p0 = bi_multiply(ctx, bi_copy(x0), bi_copy(y0)); ++ p2 = bi_multiply(ctx, bi_copy(x1), bi_copy(y1)); ++ p1 = bi_multiply(ctx, bi_add(ctx, x0, x1), bi_add(ctx, y0, y1)); ++ } ++ ++ p1 = bi_subtract(ctx, ++ bi_subtract(ctx, p1, bi_copy(p2), NULL), bi_copy(p0), NULL); ++ ++ comp_left_shift(p1, m); ++ comp_left_shift(p2, 2*m); ++ return bi_add(ctx, p1, bi_add(ctx, p0, p2)); ++} ++#endif ++ ++/** ++ * @brief Perform a multiplication operation between two bigints. ++ * @param ctx [in] The bigint session context. ++ * @param bia [in] A bigint. ++ * @param bib [in] Another bigint. ++ * @return The result of the multiplication. ++ */ ++bigint *bi_multiply(BI_CTX *ctx, bigint *bia, bigint *bib) ++{ ++ check(bia); ++ check(bib); ++ ++#ifdef CONFIG_BIGINT_KARATSUBA ++ if (min(bia->size, bib->size) < MUL_KARATSUBA_THRESH) ++ { ++ return regular_multiply(ctx, bia, bib); ++ } ++ ++ return karatsuba(ctx, bia, bib, 0); ++#else ++ return regular_multiply(ctx, bia, bib); ++#endif ++} ++ ++#ifdef CONFIG_BIGINT_SQUARE ++/* ++ * Perform the actual square operion. It takes into account overflow. ++ */ ++static bigint *regular_square(BI_CTX *ctx, bigint *bi) ++{ ++ int t = bi->size; ++ int i = 0, j; ++ bigint *biR = alloc(ctx, t*2); ++ comp *w = biR->comps; ++ comp *x = bi->comps; ++ comp carry; ++ ++ memset(w, 0, biR->size*COMP_BYTE_SIZE); ++ ++ do ++ { ++ long_comp tmp = w[2*i] + (long_comp)x[i]*x[i]; ++ comp u = 0; ++ w[2*i] = (comp)tmp; ++ carry = (comp)(tmp >> COMP_BIT_SIZE); ++ ++ for (j = i+1; j < t; j++) ++ { ++ long_comp xx = (long_comp)x[i]*x[j]; ++ long_comp xx2 = 2*xx; ++ long_comp blob = (long_comp)w[i+j]+carry; ++ ++ if (u) /* previous overflow */ ++ { ++ blob += COMP_RADIX; ++ } ++ ++ ++ u = 0; ++ tmp = xx2 + blob; ++ ++ /* check for overflow */ ++ if ((COMP_MAX-xx) < xx || (COMP_MAX-xx2) < blob) ++ { ++ u = 1; ++ } ++ ++ w[i+j] = (comp)tmp; ++ carry = (comp)(tmp >> COMP_BIT_SIZE); ++ } ++ ++ w[i+t] += carry; ++ ++ if (u) ++ { ++ w[i+t+1] = 1; /* add carry */ ++ } ++ } while (++i < t); ++ ++ bi_free(ctx, bi); ++ return trim(biR); ++} ++ ++/** ++ * @brief Perform a square operation on a bigint. ++ * @param ctx [in] The bigint session context. ++ * @param bia [in] A bigint. ++ * @return The result of the multiplication. ++ */ ++bigint *bi_square(BI_CTX *ctx, bigint *bia) ++{ ++ check(bia); ++ ++#ifdef CONFIG_BIGINT_KARATSUBA ++ if (bia->size < SQU_KARATSUBA_THRESH) ++ { ++ return regular_square(ctx, bia); ++ } ++ ++ return karatsuba(ctx, bia, NULL, 1); ++#else ++ return regular_square(ctx, bia); ++#endif ++} ++#endif ++ ++/** ++ * @brief Compare two bigints. ++ * @param bia [in] A bigint. ++ * @param bib [in] Another bigint. ++ * @return -1 if smaller, 1 if larger and 0 if equal. ++ */ ++int bi_compare(bigint *bia, bigint *bib) ++{ ++ int r, i; ++ ++ check(bia); ++ check(bib); ++ ++ if (bia->size > bib->size) ++ r = 1; ++ else if (bia->size < bib->size) ++ r = -1; ++ else ++ { ++ comp *a = bia->comps; ++ comp *b = bib->comps; ++ ++ /* Same number of components. Compare starting from the high end ++ * and working down. */ ++ r = 0; ++ i = bia->size - 1; ++ ++ do ++ { ++ if (a[i] > b[i]) ++ { ++ r = 1; ++ break; ++ } ++ else if (a[i] < b[i]) ++ { ++ r = -1; ++ break; ++ } ++ } while (--i >= 0); ++ } ++ ++ return r; ++} ++ ++/* ++ * Allocate and zero more components. Does not consume bi. ++ */ ++static void more_comps(bigint *bi, int n) ++{ ++ if (n > bi->max_comps) ++ { ++ bi->max_comps = max(bi->max_comps * 2, n); ++ bi->comps = (comp*)realloc(bi->comps, bi->max_comps * COMP_BYTE_SIZE); ++ } ++ ++ if (n > bi->size) ++ { ++ memset(&bi->comps[bi->size], 0, (n-bi->size)*COMP_BYTE_SIZE); ++ } ++ ++ bi->size = n; ++} ++ ++/* ++ * Make a new empty bigint. It may just use an old one if one is available. ++ * Otherwise get one off the heap. ++ */ ++static bigint *alloc(BI_CTX *ctx, int size) ++{ ++ bigint *biR; ++ ++ /* Can we recycle an old bigint? */ ++ if (ctx->free_list != NULL) ++ { ++ biR = ctx->free_list; ++ ctx->free_list = biR->next; ++ ctx->free_count--; ++ ++ if (biR->refs != 0) ++ { ++#ifdef CONFIG_SSL_FULL_MODE ++ printf("alloc: refs was not 0\n"); ++#endif ++ abort(); /* create a stack trace from a core dump */ ++ } ++ ++ more_comps(biR, size); ++ } ++ else ++ { ++ /* No free bigints available - create a new one. */ ++ biR = (bigint *)malloc(sizeof(bigint)); ++ biR->comps = (comp*)malloc(size * COMP_BYTE_SIZE); ++ biR->max_comps = size; /* give some space to spare */ ++ } ++ ++ biR->size = size; ++ biR->refs = 1; ++ biR->next = NULL; ++ ctx->active_count++; ++ return biR; ++} ++ ++/* ++ * Work out the highest '1' bit in an exponent. Used when doing sliding-window ++ * exponentiation. ++ */ ++static int find_max_exp_index(bigint *biexp) ++{ ++ int i = COMP_BIT_SIZE-1; ++ comp shift = COMP_RADIX/2; ++ comp test = biexp->comps[biexp->size-1]; /* assume no leading zeroes */ ++ ++ check(biexp); ++ ++ do ++ { ++ if (test & shift) ++ { ++ return i+(biexp->size-1)*COMP_BIT_SIZE; ++ } ++ ++ shift >>= 1; ++ } while (--i != 0); ++ ++ return -1; /* error - must have been a leading 0 */ ++} ++ ++/* ++ * Is a particular bit is an exponent 1 or 0? Used when doing sliding-window ++ * exponentiation. ++ */ ++static int exp_bit_is_one(bigint *biexp, int offset) ++{ ++ comp test = biexp->comps[offset / COMP_BIT_SIZE]; ++ int num_shifts = offset % COMP_BIT_SIZE; ++ comp shift = 1; ++ int i; ++ ++ check(biexp); ++ ++ for (i = 0; i < num_shifts; i++) ++ { ++ shift <<= 1; ++ } ++ ++ return test & shift; ++} ++ ++#ifdef CONFIG_BIGINT_CHECK_ON ++/* ++ * Perform a sanity check on bi. ++ */ ++static void check(const bigint *bi) ++{ ++ if (bi->refs <= 0) ++ { ++ printf("check: zero or negative refs in bigint\n"); ++ abort(); ++ } ++ ++ if (bi->next != NULL) ++ { ++ printf("check: attempt to use a bigint from " ++ "the free list\n"); ++ abort(); ++ } ++} ++#endif ++ ++/* ++ * Delete any leading 0's (and allow for 0). ++ */ ++static bigint *trim(bigint *bi) ++{ ++ check(bi); ++ ++ while (bi->comps[bi->size-1] == 0 && bi->size > 1) ++ { ++ bi->size--; ++ } ++ ++ return bi; ++} ++ ++#if defined(CONFIG_BIGINT_MONTGOMERY) ++/** ++ * @brief Perform a single montgomery reduction. ++ * @param ctx [in] The bigint session context. ++ * @param bixy [in] A bigint. ++ * @return The result of the montgomery reduction. ++ */ ++bigint *bi_mont(BI_CTX *ctx, bigint *bixy) ++{ ++ int i = 0, n; ++ uint8_t mod_offset = ctx->mod_offset; ++ bigint *bim = ctx->bi_mod[mod_offset]; ++ comp mod_inv = ctx->N0_dash[mod_offset]; ++ ++ check(bixy); ++ ++ if (ctx->use_classical) /* just use classical instead */ ++ { ++ return bi_mod(ctx, bixy); ++ } ++ ++ n = bim->size; ++ ++ do ++ { ++ bixy = bi_add(ctx, bixy, comp_left_shift( ++ bi_int_multiply(ctx, bim, bixy->comps[i]*mod_inv), i)); ++ } while (++i < n); ++ ++ comp_right_shift(bixy, n); ++ ++ if (bi_compare(bixy, bim) >= 0) ++ { ++ bixy = bi_subtract(ctx, bixy, bim, NULL); ++ } ++ ++ return bixy; ++} ++ ++#elif defined(CONFIG_BIGINT_BARRETT) ++/* ++ * Stomp on the most significant components to give the illusion of a "mod base ++ * radix" operation ++ */ ++static bigint *comp_mod(bigint *bi, int mod) ++{ ++ check(bi); ++ ++ if (bi->size > mod) ++ { ++ bi->size = mod; ++ } ++ ++ return bi; ++} ++ ++/* ++ * Barrett reduction has no need for some parts of the product, so ignore bits ++ * of the multiply. This routine gives Barrett its big performance ++ * improvements over Classical/Montgomery reduction methods. ++ */ ++static bigint *partial_multiply(BI_CTX *ctx, bigint *bia, bigint *bib, ++ int inner_partial, int outer_partial) ++{ ++ int i = 0, j, n = bia->size, t = bib->size; ++ bigint *biR; ++ comp carry; ++ comp *sr, *sa, *sb; ++ ++ check(bia); ++ check(bib); ++ ++ biR = alloc(ctx, n + t); ++ sa = bia->comps; ++ sb = bib->comps; ++ sr = biR->comps; ++ ++ if (inner_partial) ++ { ++ memset(sr, 0, inner_partial*COMP_BYTE_SIZE); ++ } ++ else /* outer partial */ ++ { ++ if (n < outer_partial || t < outer_partial) /* should we bother? */ ++ { ++ bi_free(ctx, bia); ++ bi_free(ctx, bib); ++ biR->comps[0] = 0; /* return 0 */ ++ biR->size = 1; ++ return biR; ++ } ++ ++ memset(&sr[outer_partial], 0, (n+t-outer_partial)*COMP_BYTE_SIZE); ++ } ++ ++ do ++ { ++ comp *a = sa; ++ comp b = *sb++; ++ long_comp tmp; ++ int i_plus_j = i; ++ carry = 0; ++ j = n; ++ ++ if (outer_partial && i_plus_j < outer_partial) ++ { ++ i_plus_j = outer_partial; ++ a = &sa[outer_partial-i]; ++ j = n-(outer_partial-i); ++ } ++ ++ do ++ { ++ if (inner_partial && i_plus_j >= inner_partial) ++ { ++ break; ++ } ++ ++ tmp = sr[i_plus_j] + ((long_comp)*a++)*b + carry; ++ sr[i_plus_j++] = (comp)tmp; /* downsize */ ++ carry = (comp)(tmp >> COMP_BIT_SIZE); ++ } while (--j != 0); ++ ++ sr[i_plus_j] = carry; ++ } while (++i < t); ++ ++ bi_free(ctx, bia); ++ bi_free(ctx, bib); ++ return trim(biR); ++} ++ ++/** ++ * @brief Perform a single Barrett reduction. ++ * @param ctx [in] The bigint session context. ++ * @param bi [in] A bigint. ++ * @return The result of the Barrett reduction. ++ */ ++bigint *bi_barrett(BI_CTX *ctx, bigint *bi) ++{ ++ bigint *q1, *q2, *q3, *r1, *r2, *r; ++ uint8_t mod_offset = ctx->mod_offset; ++ bigint *bim = ctx->bi_mod[mod_offset]; ++ int k = bim->size; ++ ++ check(bi); ++ check(bim); ++ ++ /* use Classical method instead - Barrett cannot help here */ ++ if (bi->size > k*2) ++ { ++ return bi_mod(ctx, bi); ++ } ++ ++ q1 = comp_right_shift(bi_clone(ctx, bi), k-1); ++ ++ /* do outer partial multiply */ ++ q2 = partial_multiply(ctx, q1, ctx->bi_mu[mod_offset], 0, k-1); ++ q3 = comp_right_shift(q2, k+1); ++ r1 = comp_mod(bi, k+1); ++ ++ /* do inner partial multiply */ ++ r2 = comp_mod(partial_multiply(ctx, q3, bim, k+1, 0), k+1); ++ r = bi_subtract(ctx, r1, r2, NULL); ++ ++ /* if (r >= m) r = r - m; */ ++ if (bi_compare(r, bim) >= 0) ++ { ++ r = bi_subtract(ctx, r, bim, NULL); ++ } ++ ++ return r; ++} ++#endif /* CONFIG_BIGINT_BARRETT */ ++ ++#ifdef CONFIG_BIGINT_SLIDING_WINDOW ++/* ++ * Work out g1, g3, g5, g7... etc for the sliding-window algorithm ++ */ ++static void precompute_slide_window(BI_CTX *ctx, int window, bigint *g1) ++{ ++ int k = 1, i; ++ bigint *g2; ++ ++ for (i = 0; i < window-1; i++) /* compute 2^(window-1) */ ++ { ++ k <<= 1; ++ } ++ ++ ctx->g = (bigint **)malloc(k*sizeof(bigint *)); ++ ctx->g[0] = bi_clone(ctx, g1); ++ bi_permanent(ctx->g[0]); ++ g2 = bi_residue(ctx, bi_square(ctx, ctx->g[0])); /* g^2 */ ++ ++ for (i = 1; i < k; i++) ++ { ++ ctx->g[i] = bi_residue(ctx, bi_multiply(ctx, ctx->g[i-1], bi_copy(g2))); ++ bi_permanent(ctx->g[i]); ++ } ++ ++ bi_free(ctx, g2); ++ ctx->window = k; ++} ++#endif ++ ++/** ++ * @brief Perform a modular exponentiation. ++ * ++ * This function requires bi_set_mod() to have been called previously. This is ++ * one of the optimisations used for performance. ++ * @param ctx [in] The bigint session context. ++ * @param bi [in] The bigint on which to perform the mod power operation. ++ * @param biexp [in] The bigint exponent. ++ * @return The result of the mod exponentiation operation ++ * @see bi_set_mod(). ++ */ ++bigint *bi_mod_power(BI_CTX *ctx, bigint *bi, bigint *biexp) ++{ ++ int i = find_max_exp_index(biexp), j, window_size = 1; ++ bigint *biR = int_to_bi(ctx, 1); ++ ++#if defined(CONFIG_BIGINT_MONTGOMERY) ++ uint8_t mod_offset = ctx->mod_offset; ++ if (!ctx->use_classical) ++ { ++ /* preconvert */ ++ bi = bi_mont(ctx, ++ bi_multiply(ctx, bi, ctx->bi_RR_mod_m[mod_offset])); /* x' */ ++ bi_free(ctx, biR); ++ biR = ctx->bi_R_mod_m[mod_offset]; /* A */ ++ } ++#endif ++ ++ check(bi); ++ check(biexp); ++ ++#ifdef CONFIG_BIGINT_SLIDING_WINDOW ++ for (j = i; j > 32; j /= 5) /* work out an optimum size */ ++ window_size++; ++ ++ /* work out the slide constants */ ++ precompute_slide_window(ctx, window_size, bi); ++#else /* just one constant */ ++ ctx->g = (bigint **)malloc(sizeof(bigint *)); ++ ctx->g[0] = bi_clone(ctx, bi); ++ ctx->window = 1; ++ bi_permanent(ctx->g[0]); ++#endif ++ ++ /* if sliding-window is off, then only one bit will be done at a time and ++ * will reduce to standard left-to-right exponentiation */ ++ do ++ { ++ if (exp_bit_is_one(biexp, i)) ++ { ++ int l = i-window_size+1; ++ int part_exp = 0; ++ ++ if (l < 0) /* LSB of exponent will always be 1 */ ++ l = 0; ++ else ++ { ++ while (exp_bit_is_one(biexp, l) == 0) ++ l++; /* go back up */ ++ } ++ ++ /* build up the section of the exponent */ ++ for (j = i; j >= l; j--) ++ { ++ biR = bi_residue(ctx, bi_square(ctx, biR)); ++ if (exp_bit_is_one(biexp, j)) ++ part_exp++; ++ ++ if (j != l) ++ part_exp <<= 1; ++ } ++ ++ part_exp = (part_exp-1)/2; /* adjust for array */ ++ biR = bi_residue(ctx, bi_multiply(ctx, biR, ctx->g[part_exp])); ++ i = l-1; ++ } ++ else /* square it */ ++ { ++ biR = bi_residue(ctx, bi_square(ctx, biR)); ++ i--; ++ } ++ } while (i >= 0); ++ ++ /* cleanup */ ++ for (i = 0; i < ctx->window; i++) ++ { ++ bi_depermanent(ctx->g[i]); ++ bi_free(ctx, ctx->g[i]); ++ } ++ ++ free(ctx->g); ++ bi_free(ctx, bi); ++ bi_free(ctx, biexp); ++#if defined CONFIG_BIGINT_MONTGOMERY ++ return ctx->use_classical ? biR : bi_mont(ctx, biR); /* convert back */ ++#else /* CONFIG_BIGINT_CLASSICAL or CONFIG_BIGINT_BARRETT */ ++ return biR; ++#endif ++} ++ ++#ifdef CONFIG_SSL_CERT_VERIFICATION ++/** ++ * @brief Perform a modular exponentiation using a temporary modulus. ++ * ++ * We need this function to check the signatures of certificates. The modulus ++ * of this function is temporary as it's just used for authentication. ++ * @param ctx [in] The bigint session context. ++ * @param bi [in] The bigint to perform the exp/mod. ++ * @param bim [in] The temporary modulus. ++ * @param biexp [in] The bigint exponent. ++ * @return The result of the mod exponentiation operation ++ * @see bi_set_mod(). ++ */ ++bigint *bi_mod_power2(BI_CTX *ctx, bigint *bi, bigint *bim, bigint *biexp) ++{ ++ bigint *biR, *tmp_biR; ++ ++ /* Set up a temporary bigint context and transfer what we need between ++ * them. We need to do this since we want to keep the original modulus ++ * which is already in this context. This operation is only called when ++ * doing peer verification, and so is not expensive :-) */ ++ BI_CTX *tmp_ctx = bi_initialize(); ++ bi_set_mod(tmp_ctx, bi_clone(tmp_ctx, bim), BIGINT_M_OFFSET); ++ tmp_biR = bi_mod_power(tmp_ctx, ++ bi_clone(tmp_ctx, bi), ++ bi_clone(tmp_ctx, biexp)); ++ biR = bi_clone(ctx, tmp_biR); ++ bi_free(tmp_ctx, tmp_biR); ++ bi_free_mod(tmp_ctx, BIGINT_M_OFFSET); ++ bi_terminate(tmp_ctx); ++ ++ bi_free(ctx, bi); ++ bi_free(ctx, bim); ++ bi_free(ctx, biexp); ++ return biR; ++} ++#endif ++ ++#ifdef CONFIG_BIGINT_CRT ++/** ++ * @brief Use the Chinese Remainder Theorem to quickly perform RSA decrypts. ++ * ++ * @param ctx [in] The bigint session context. ++ * @param bi [in] The bigint to perform the exp/mod. ++ * @param dP [in] CRT's dP bigint ++ * @param dQ [in] CRT's dQ bigint ++ * @param p [in] CRT's p bigint ++ * @param q [in] CRT's q bigint ++ * @param qInv [in] CRT's qInv bigint ++ * @return The result of the CRT operation ++ */ ++bigint *bi_crt(BI_CTX *ctx, bigint *bi, ++ bigint *dP, bigint *dQ, ++ bigint *p, bigint *q, bigint *qInv) ++{ ++ bigint *m1, *m2, *h; ++ ++ /* Montgomery has a condition the 0 < x, y < m and these products violate ++ * that condition. So disable Montgomery when using CRT */ ++#if defined(CONFIG_BIGINT_MONTGOMERY) ++ ctx->use_classical = 1; ++#endif ++ ctx->mod_offset = BIGINT_P_OFFSET; ++ m1 = bi_mod_power(ctx, bi_copy(bi), dP); ++ ++ ctx->mod_offset = BIGINT_Q_OFFSET; ++ m2 = bi_mod_power(ctx, bi, dQ); ++ ++ h = bi_subtract(ctx, bi_add(ctx, m1, p), bi_copy(m2), NULL); ++ h = bi_multiply(ctx, h, qInv); ++ ctx->mod_offset = BIGINT_P_OFFSET; ++ h = bi_residue(ctx, h); ++#if defined(CONFIG_BIGINT_MONTGOMERY) ++ ctx->use_classical = 0; /* reset for any further operation */ ++#endif ++ return bi_add(ctx, m2, bi_multiply(ctx, q, h)); ++} ++#endif ++/** @} */ +diff --git a/feeds/luci/libs/luci-lib-nixio/axTLS/crypto/bigint.h b/feeds/luci/libs/luci-lib-nixio/axTLS/crypto/bigint.h +new file mode 100644 +index 0000000..2966a3e +--- /dev/null ++++ b/feeds/luci/libs/luci-lib-nixio/axTLS/crypto/bigint.h +@@ -0,0 +1,99 @@ ++/* ++ * Copyright (c) 2007, Cameron Rich ++ * ++ * All rights reserved. ++ * ++ * Redistribution and use in source and binary forms, with or without ++ * modification, are permitted provided that the following conditions are met: ++ * ++ * * Redistributions of source code must retain the above copyright notice, ++ * this list of conditions and the following disclaimer. ++ * * 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. ++ * * Neither the name of the axTLS project nor the names of its contributors ++ * may be used to endorse or promote products derived from this software ++ * without specific prior written permission. ++ * ++ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ++ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT ++ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR ++ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR ++ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, ++ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, ++ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR ++ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF ++ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING ++ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS ++ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ++ */ ++ ++#ifndef BIGINT_HEADER ++#define BIGINT_HEADER ++ ++#include "crypto.h" ++ ++BI_CTX *bi_initialize(void); ++void bi_terminate(BI_CTX *ctx); ++void bi_permanent(bigint *bi); ++void bi_depermanent(bigint *bi); ++void bi_clear_cache(BI_CTX *ctx); ++void bi_free(BI_CTX *ctx, bigint *bi); ++bigint *bi_copy(bigint *bi); ++bigint *bi_clone(BI_CTX *ctx, const bigint *bi); ++void bi_export(BI_CTX *ctx, bigint *bi, uint8_t *data, int size); ++bigint *bi_import(BI_CTX *ctx, const uint8_t *data, int len); ++bigint *int_to_bi(BI_CTX *ctx, comp i); ++ ++/* the functions that actually do something interesting */ ++bigint *bi_add(BI_CTX *ctx, bigint *bia, bigint *bib); ++bigint *bi_subtract(BI_CTX *ctx, bigint *bia, ++ bigint *bib, int *is_negative); ++bigint *bi_divide(BI_CTX *ctx, bigint *bia, bigint *bim, int is_mod); ++bigint *bi_multiply(BI_CTX *ctx, bigint *bia, bigint *bib); ++bigint *bi_mod_power(BI_CTX *ctx, bigint *bi, bigint *biexp); ++bigint *bi_mod_power2(BI_CTX *ctx, bigint *bi, bigint *bim, bigint *biexp); ++int bi_compare(bigint *bia, bigint *bib); ++void bi_set_mod(BI_CTX *ctx, bigint *bim, int mod_offset); ++void bi_free_mod(BI_CTX *ctx, int mod_offset); ++ ++#ifdef CONFIG_SSL_FULL_MODE ++void bi_print(const char *label, bigint *bi); ++bigint *bi_str_import(BI_CTX *ctx, const char *data); ++#endif ++ ++/** ++ * @def bi_mod ++ * Find the residue of B. bi_set_mod() must be called before hand. ++ */ ++#define bi_mod(A, B) bi_divide(A, B, ctx->bi_mod[ctx->mod_offset], 1) ++ ++/** ++ * bi_residue() is technically the same as bi_mod(), but it uses the ++ * appropriate reduction technique (which is bi_mod() when doing classical ++ * reduction). ++ */ ++#if defined(CONFIG_BIGINT_MONTGOMERY) ++#define bi_residue(A, B) bi_mont(A, B) ++bigint *bi_mont(BI_CTX *ctx, bigint *bixy); ++#elif defined(CONFIG_BIGINT_BARRETT) ++#define bi_residue(A, B) bi_barrett(A, B) ++bigint *bi_barrett(BI_CTX *ctx, bigint *bi); ++#else /* if defined(CONFIG_BIGINT_CLASSICAL) */ ++#define bi_residue(A, B) bi_mod(A, B) ++#endif ++ ++#ifdef CONFIG_BIGINT_SQUARE ++bigint *bi_square(BI_CTX *ctx, bigint *bi); ++#else ++#define bi_square(A, B) bi_multiply(A, bi_copy(B), B) ++#endif ++ ++#ifdef CONFIG_BIGINT_CRT ++bigint *bi_crt(BI_CTX *ctx, bigint *bi, ++ bigint *dP, bigint *dQ, ++ bigint *p, bigint *q, ++ bigint *qInv); ++#endif ++ ++#endif +diff --git a/feeds/luci/libs/luci-lib-nixio/axTLS/crypto/bigint_impl.h b/feeds/luci/libs/luci-lib-nixio/axTLS/crypto/bigint_impl.h +new file mode 100644 +index 0000000..1483154 +--- /dev/null ++++ b/feeds/luci/libs/luci-lib-nixio/axTLS/crypto/bigint_impl.h +@@ -0,0 +1,112 @@ ++/* ++ * Copyright (c) 2007, Cameron Rich ++ * ++ * All rights reserved. ++ * ++ * Redistribution and use in source and binary forms, with or without ++ * modification, are permitted provided that the following conditions are met: ++ * ++ * * Redistributions of source code must retain the above copyright notice, ++ * this list of conditions and the following disclaimer. ++ * * 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. ++ * * Neither the name of the axTLS project nor the names of its contributors ++ * may be used to endorse or promote products derived from this software ++ * without specific prior written permission. ++ * ++ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ++ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT ++ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR ++ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR ++ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, ++ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, ++ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR ++ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF ++ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING ++ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS ++ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ++ */ ++ ++#ifndef BIGINT_IMPL_HEADER ++#define BIGINT_IMPL_HEADER ++ ++/* Maintain a number of precomputed variables when doing reduction */ ++#define BIGINT_M_OFFSET 0 /**< Normal modulo offset. */ ++#ifdef CONFIG_BIGINT_CRT ++#define BIGINT_P_OFFSET 1 /**< p modulo offset. */ ++#define BIGINT_Q_OFFSET 2 /**< q module offset. */ ++#define BIGINT_NUM_MODS 3 /**< The number of modulus constants used. */ ++#else ++#define BIGINT_NUM_MODS 1 ++#endif ++ ++/* Architecture specific functions for big ints */ ++#ifdef WIN32 ++#define COMP_RADIX 4294967296i64 ++#define COMP_MAX 0xFFFFFFFFFFFFFFFFui64 ++#else ++#define COMP_RADIX 4294967296ULL /**< Max component + 1 */ ++#define COMP_MAX 0xFFFFFFFFFFFFFFFFULL/**< (Max dbl comp -1) */ ++#endif ++#define COMP_BIT_SIZE 32 /**< Number of bits in a component. */ ++#define COMP_BYTE_SIZE 4 /**< Number of bytes in a component. */ ++#define COMP_NUM_NIBBLES 8 /**< Used For diagnostics only. */ ++ ++typedef uint32_t comp; /**< A single precision component. */ ++typedef uint64_t long_comp; /**< A double precision component. */ ++typedef int64_t slong_comp; /**< A signed double precision component. */ ++ ++/** ++ * @struct _bigint ++ * @brief A big integer basic object ++ */ ++struct _bigint ++{ ++ struct _bigint* next; /**< The next bigint in the cache. */ ++ short size; /**< The number of components in this bigint. */ ++ short max_comps; /**< The heapsize allocated for this bigint */ ++ int refs; /**< An internal reference count. */ ++ comp* comps; /**< A ptr to the actual component data */ ++}; ++ ++typedef struct _bigint bigint; /**< An alias for _bigint */ ++ ++/** ++ * Maintains the state of the cache, and a number of variables used in ++ * reduction. ++ */ ++typedef struct /**< A big integer "session" context. */ ++{ ++ bigint *active_list; /**< Bigints currently used. */ ++ bigint *free_list; /**< Bigints not used. */ ++ bigint *bi_radix; /**< The radix used. */ ++ bigint *bi_mod[BIGINT_NUM_MODS]; /**< modulus */ ++ ++#if defined(CONFIG_BIGINT_MONTGOMERY) ++ bigint *bi_RR_mod_m[BIGINT_NUM_MODS]; /**< R^2 mod m */ ++ bigint *bi_R_mod_m[BIGINT_NUM_MODS]; /**< R mod m */ ++ comp N0_dash[BIGINT_NUM_MODS]; ++#elif defined(CONFIG_BIGINT_BARRETT) ++ bigint *bi_mu[BIGINT_NUM_MODS]; /**< Storage for mu */ ++#endif ++ bigint *bi_normalised_mod[BIGINT_NUM_MODS]; /**< Normalised mod storage. */ ++ bigint **g; /**< Used by sliding-window. */ ++ int window; /**< The size of the sliding window */ ++ int active_count; /**< Number of active bigints. */ ++ int free_count; /**< Number of free bigints. */ ++ ++#ifdef CONFIG_BIGINT_MONTGOMERY ++ uint8_t use_classical; /**< Use classical reduction. */ ++#endif ++ uint8_t mod_offset; /**< The mod offset we are using */ ++} BI_CTX; ++ ++#ifndef WIN32 ++#define max(a,b) ((a)>(b)?(a):(b)) /**< Find the maximum of 2 numbers. */ ++#define min(a,b) ((a)<(b)?(a):(b)) /**< Find the minimum of 2 numbers. */ ++#endif ++ ++#define PERMANENT 0x7FFF55AA /**< A magic number for permanents. */ ++ ++#endif +diff --git a/feeds/luci/libs/luci-lib-nixio/axTLS/crypto/crypto.h b/feeds/luci/libs/luci-lib-nixio/axTLS/crypto/crypto.h +new file mode 100644 +index 0000000..5c95f21 +--- /dev/null ++++ b/feeds/luci/libs/luci-lib-nixio/axTLS/crypto/crypto.h +@@ -0,0 +1,222 @@ ++/* ++ * Copyright (c) 2007, Cameron Rich ++ * ++ * All rights reserved. ++ * ++ * Redistribution and use in source and binary forms, with or without ++ * modification, are permitted provided that the following conditions are met: ++ * ++ * * Redistributions of source code must retain the above copyright notice, ++ * this list of conditions and the following disclaimer. ++ * * 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. ++ * * Neither the name of the axTLS project nor the names of its contributors ++ * may be used to endorse or promote products derived from this software ++ * without specific prior written permission. ++ * ++ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ++ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT ++ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR ++ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR ++ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, ++ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, ++ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR ++ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF ++ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING ++ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS ++ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ++ */ ++ ++/** ++ * @file crypto.h ++ */ ++ ++#ifndef HEADER_CRYPTO_H ++#define HEADER_CRYPTO_H ++ ++#ifdef __cplusplus ++extern "C" { ++#endif ++ ++#include "config.h" ++#include "os_port.h" ++#include "bigint_impl.h" ++#include "bigint.h" ++ ++/* enable features based on a 'super-set' capbaility. */ ++#if defined(CONFIG_SSL_FULL_MODE) ++#define CONFIG_SSL_ENABLE_CLIENT ++#define CONFIG_SSL_CERT_VERIFICATION ++#elif defined(CONFIG_SSL_ENABLE_CLIENT) ++#define CONFIG_SSL_CERT_VERIFICATION ++#endif ++ ++/************************************************************************** ++ * AES declarations ++ **************************************************************************/ ++ ++#define AES_MAXROUNDS 14 ++#define AES_BLOCKSIZE 16 ++#define AES_IV_SIZE 16 ++ ++typedef struct aes_key_st ++{ ++ uint16_t rounds; ++ uint16_t key_size; ++ uint32_t ks[(AES_MAXROUNDS+1)*8]; ++ uint8_t iv[AES_IV_SIZE]; ++} AES_CTX; ++ ++typedef enum ++{ ++ AES_MODE_128, ++ AES_MODE_256 ++} AES_MODE; ++ ++void AES_set_key(AES_CTX *ctx, const uint8_t *key, ++ const uint8_t *iv, AES_MODE mode); ++void AES_cbc_encrypt(AES_CTX *ctx, const uint8_t *msg, ++ uint8_t *out, int length); ++void AES_cbc_decrypt(AES_CTX *ks, const uint8_t *in, uint8_t *out, int length); ++void AES_convert_key(AES_CTX *ctx); ++ ++/************************************************************************** ++ * RC4 declarations ++ **************************************************************************/ ++ ++typedef struct ++{ ++ uint8_t x, y, m[256]; ++} RC4_CTX; ++ ++void RC4_setup(RC4_CTX *s, const uint8_t *key, int length); ++void RC4_crypt(RC4_CTX *s, const uint8_t *msg, uint8_t *data, int length); ++ ++/************************************************************************** ++ * SHA1 declarations ++ **************************************************************************/ ++ ++#define SHA1_SIZE 20 ++ ++/* ++ * This structure will hold context information for the SHA-1 ++ * hashing operation ++ */ ++typedef struct ++{ ++ uint32_t Intermediate_Hash[SHA1_SIZE/4]; /* Message Digest */ ++ uint32_t Length_Low; /* Message length in bits */ ++ uint32_t Length_High; /* Message length in bits */ ++ uint16_t Message_Block_Index; /* Index into message block array */ ++ uint8_t Message_Block[64]; /* 512-bit message blocks */ ++} SHA1_CTX; ++ ++void SHA1_Init(SHA1_CTX *); ++void SHA1_Update(SHA1_CTX *, const uint8_t * msg, int len); ++void SHA1_Final(uint8_t *digest, SHA1_CTX *); ++ ++/************************************************************************** ++ * MD2 declarations ++ **************************************************************************/ ++ ++#define MD2_SIZE 16 ++ ++typedef struct ++{ ++ unsigned char cksum[16]; /* checksum of the data block */ ++ unsigned char state[48]; /* intermediate digest state */ ++ unsigned char buffer[16]; /* data block being processed */ ++ int left; /* amount of data in buffer */ ++} MD2_CTX; ++ ++EXP_FUNC void STDCALL MD2_Init(MD2_CTX *ctx); ++EXP_FUNC void STDCALL MD2_Update(MD2_CTX *ctx, const uint8_t *input, int ilen); ++EXP_FUNC void STDCALL MD2_Final(uint8_t *digest, MD2_CTX *ctx); ++ ++/************************************************************************** ++ * MD5 declarations ++ **************************************************************************/ ++ ++#define MD5_SIZE 16 ++ ++typedef struct ++{ ++ uint32_t state[4]; /* state (ABCD) */ ++ uint32_t count[2]; /* number of bits, modulo 2^64 (lsb first) */ ++ uint8_t buffer[64]; /* input buffer */ ++} MD5_CTX; ++ ++EXP_FUNC void STDCALL MD5_Init(MD5_CTX *); ++EXP_FUNC void STDCALL MD5_Update(MD5_CTX *, const uint8_t *msg, int len); ++EXP_FUNC void STDCALL MD5_Final(uint8_t *digest, MD5_CTX *); ++ ++/************************************************************************** ++ * HMAC declarations ++ **************************************************************************/ ++void hmac_md5(const uint8_t *msg, int length, const uint8_t *key, ++ int key_len, uint8_t *digest); ++void hmac_sha1(const uint8_t *msg, int length, const uint8_t *key, ++ int key_len, uint8_t *digest); ++ ++/************************************************************************** ++ * RSA declarations ++ **************************************************************************/ ++ ++typedef struct ++{ ++ bigint *m; /* modulus */ ++ bigint *e; /* public exponent */ ++ bigint *d; /* private exponent */ ++#ifdef CONFIG_BIGINT_CRT ++ bigint *p; /* p as in m = pq */ ++ bigint *q; /* q as in m = pq */ ++ bigint *dP; /* d mod (p-1) */ ++ bigint *dQ; /* d mod (q-1) */ ++ bigint *qInv; /* q^-1 mod p */ ++#endif ++ int num_octets; ++ BI_CTX *bi_ctx; ++} RSA_CTX; ++ ++void RSA_priv_key_new(RSA_CTX **rsa_ctx, ++ const uint8_t *modulus, int mod_len, ++ const uint8_t *pub_exp, int pub_len, ++ const uint8_t *priv_exp, int priv_len ++#ifdef CONFIG_BIGINT_CRT ++ , const uint8_t *p, int p_len, ++ const uint8_t *q, int q_len, ++ const uint8_t *dP, int dP_len, ++ const uint8_t *dQ, int dQ_len, ++ const uint8_t *qInv, int qInv_len ++#endif ++ ); ++void RSA_pub_key_new(RSA_CTX **rsa_ctx, ++ const uint8_t *modulus, int mod_len, ++ const uint8_t *pub_exp, int pub_len); ++void RSA_free(RSA_CTX *ctx); ++int RSA_decrypt(const RSA_CTX *ctx, const uint8_t *in_data, uint8_t *out_data, ++ int is_decryption); ++bigint *RSA_private(const RSA_CTX *c, bigint *bi_msg); ++#if defined(CONFIG_SSL_CERT_VERIFICATION) || defined(CONFIG_SSL_GENERATE_X509_CERT) ++bigint *RSA_sign_verify(BI_CTX *ctx, const uint8_t *sig, int sig_len, ++ bigint *modulus, bigint *pub_exp); ++bigint *RSA_public(const RSA_CTX * c, bigint *bi_msg); ++int RSA_encrypt(const RSA_CTX *ctx, const uint8_t *in_data, uint16_t in_len, ++ uint8_t *out_data, int is_signing); ++void RSA_print(const RSA_CTX *ctx); ++#endif ++ ++/************************************************************************** ++ * RNG declarations ++ **************************************************************************/ ++EXP_FUNC void STDCALL RNG_initialize(const uint8_t *seed_buf, int size); ++EXP_FUNC void STDCALL RNG_terminate(void); ++EXP_FUNC void STDCALL get_random(int num_rand_bytes, uint8_t *rand_data); ++void get_random_NZ(int num_rand_bytes, uint8_t *rand_data); ++ ++#ifdef __cplusplus ++} ++#endif ++ ++#endif +diff --git a/feeds/luci/libs/luci-lib-nixio/axTLS/crypto/crypto_misc.c b/feeds/luci/libs/luci-lib-nixio/axTLS/crypto/crypto_misc.c +new file mode 100644 +index 0000000..59b72ec +--- /dev/null ++++ b/feeds/luci/libs/luci-lib-nixio/axTLS/crypto/crypto_misc.c +@@ -0,0 +1,357 @@ ++/* ++ * Copyright (c) 2007, Cameron Rich ++ * ++ * All rights reserved. ++ * ++ * Redistribution and use in source and binary forms, with or without ++ * modification, are permitted provided that the following conditions are met: ++ * ++ * * Redistributions of source code must retain the above copyright notice, ++ * this list of conditions and the following disclaimer. ++ * * 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. ++ * * Neither the name of the axTLS project nor the names of its contributors ++ * may be used to endorse or promote products derived from this software ++ * without specific prior written permission. ++ * ++ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ++ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT ++ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR ++ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR ++ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, ++ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, ++ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR ++ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF ++ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING ++ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS ++ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ++ */ ++ ++/** ++ * Some misc. routines to help things out ++ */ ++ ++#include ++#include ++#include ++#include ++#include "crypto_misc.h" ++#ifdef CONFIG_WIN32_USE_CRYPTO_LIB ++#include "wincrypt.h" ++#endif ++ ++#ifndef WIN32 ++static int rng_fd = -1; ++#elif defined(CONFIG_WIN32_USE_CRYPTO_LIB) ++static HCRYPTPROV gCryptProv; ++#endif ++ ++#if (!defined(CONFIG_USE_DEV_URANDOM) && !defined(CONFIG_WIN32_USE_CRYPTO_LIB)) ++static uint64_t rng_num; ++#endif ++ ++static int rng_ref_count; ++const char * const unsupported_str = "Error: Feature not supported\n"; ++ ++#ifndef CONFIG_SSL_SKELETON_MODE ++/** ++ * Retrieve a file and put it into memory ++ * @return The size of the file, or -1 on failure. ++ */ ++int get_file(const char *filename, uint8_t **buf) ++{ ++ int total_bytes = 0; ++ int bytes_read = 0; ++ int filesize; ++ FILE *stream = fopen(filename, "rb"); ++ ++ if (stream == NULL) ++ { ++#ifdef CONFIG_SSL_FULL_MODE ++ printf("file '%s' does not exist\n", filename); TTY_FLUSH(); ++#endif ++ return -1; ++ } ++ ++ /* Win CE doesn't support stat() */ ++ fseek(stream, 0, SEEK_END); ++ filesize = ftell(stream); ++ *buf = (uint8_t *)malloc(filesize); ++ fseek(stream, 0, SEEK_SET); ++ ++ do ++ { ++ bytes_read = fread(*buf+total_bytes, 1, filesize-total_bytes, stream); ++ total_bytes += bytes_read; ++ } while (total_bytes < filesize && bytes_read > 0); ++ ++ fclose(stream); ++ return filesize; ++} ++#endif ++ ++/** ++ * Initialise the Random Number Generator engine. ++ * - On Win32 use the platform SDK's crypto engine. ++ * - On Linux use /dev/urandom ++ * - If none of these work then use a custom RNG. ++ */ ++EXP_FUNC void STDCALL RNG_initialize(const uint8_t *seed_buf, int size) ++{ ++ if (rng_ref_count == 0) ++ { ++#if !defined(WIN32) && defined(CONFIG_USE_DEV_URANDOM) ++ rng_fd = ax_open("/dev/urandom", O_RDONLY); ++#elif defined(WIN32) && defined(CONFIG_WIN32_USE_CRYPTO_LIB) ++ if (!CryptAcquireContext(&gCryptProv, ++ NULL, NULL, PROV_RSA_FULL, 0)) ++ { ++ if (GetLastError() == NTE_BAD_KEYSET && ++ !CryptAcquireContext(&gCryptProv, ++ NULL, ++ NULL, ++ PROV_RSA_FULL, ++ CRYPT_NEWKEYSET)) ++ { ++ printf("CryptoLib: %x\n", unsupported_str, GetLastError()); ++ exit(1); ++ } ++ } ++#else ++ /* help seed with the user's private key - this is a number that ++ should be hard to find, due to the fact that it relies on knowing ++ the private key */ ++ int i; ++ ++ for (i = 0; i < size/(int)sizeof(uint64_t); i++) ++ rng_num ^= *((uint64_t *)&seed_buf[i*sizeof(uint64_t)]); ++ ++ srand((long)&seed_buf); /* use the stack ptr as another rnd seed */ ++#endif ++ } ++ ++ rng_ref_count++; ++} ++ ++/** ++ * Terminate the RNG engine. ++ */ ++EXP_FUNC void STDCALL RNG_terminate(void) ++{ ++ if (--rng_ref_count == 0) ++ { ++#ifndef WIN32 ++ close(rng_fd); ++#elif defined(CONFIG_WIN32_USE_CRYPTO_LIB) ++ CryptReleaseContext(gCryptProv, 0); ++#endif ++ } ++} ++ ++/** ++ * Set a series of bytes with a random number. Individual bytes can be 0 ++ */ ++EXP_FUNC void STDCALL get_random(int num_rand_bytes, uint8_t *rand_data) ++{ ++#if !defined(WIN32) && defined(CONFIG_USE_DEV_URANDOM) ++ /* use the Linux default */ ++ read(rng_fd, rand_data, num_rand_bytes); /* read from /dev/urandom */ ++#elif defined(WIN32) && defined(CONFIG_WIN32_USE_CRYPTO_LIB) ++ /* use Microsoft Crypto Libraries */ ++ CryptGenRandom(gCryptProv, num_rand_bytes, rand_data); ++#else /* nothing else to use, so use a custom RNG */ ++ /* The method we use when we've got nothing better. Use RC4, time ++ and a couple of random seeds to generate a random sequence */ ++ RC4_CTX rng_ctx; ++ struct timeval tv; ++ uint64_t big_num1, big_num2; ++ ++ gettimeofday(&tv, NULL); /* yes I know we shouldn't do this */ ++ ++ /* all numbers by themselves are pretty simple, but combined should ++ * be a challenge */ ++ big_num1 = (uint64_t)tv.tv_sec*(tv.tv_usec+1); ++ big_num2 = (uint64_t)rand()*big_num1; ++ big_num1 ^= rng_num; ++ ++ memcpy(rand_data, &big_num1, sizeof(uint64_t)); ++ if (num_rand_bytes > sizeof(uint64_t)) ++ memcpy(&rand_data[8], &big_num2, sizeof(uint64_t)); ++ ++ if (num_rand_bytes > 16) ++ { ++ /* clear rest of data */ ++ memset(&rand_data[16], 0, num_rand_bytes-16); ++ } ++ ++ RC4_setup(&rng_ctx, rand_data, 16); /* use as a key */ ++ RC4_crypt(&rng_ctx, rand_data, rand_data, num_rand_bytes); ++ ++ /* use last 8 bytes for next time */ ++ memcpy(&rng_num, &rand_data[num_rand_bytes-8], sizeof(uint64_t)); ++#endif ++} ++ ++/** ++ * Set a series of bytes with a random number. Individual bytes are not zero. ++ */ ++void get_random_NZ(int num_rand_bytes, uint8_t *rand_data) ++{ ++ int i; ++ get_random(num_rand_bytes, rand_data); ++ ++ for (i = 0; i < num_rand_bytes; i++) ++ { ++ while (rand_data[i] == 0) /* can't be 0 */ ++ rand_data[i] = (uint8_t)(rand()); ++ } ++} ++ ++/** ++ * Some useful diagnostic routines ++ */ ++#if defined(CONFIG_SSL_FULL_MODE) || defined(CONFIG_DEBUG) ++int hex_finish; ++int hex_index; ++ ++static void print_hex_init(int finish) ++{ ++ hex_finish = finish; ++ hex_index = 0; ++} ++ ++static void print_hex(uint8_t hex) ++{ ++ static int column; ++ ++ if (hex_index == 0) ++ { ++ column = 0; ++ } ++ ++ printf("%02x ", hex); ++ if (++column == 8) ++ { ++ printf(": "); ++ } ++ else if (column >= 16) ++ { ++ printf("\n"); ++ column = 0; ++ } ++ ++ if (++hex_index >= hex_finish && column > 0) ++ { ++ printf("\n"); ++ } ++} ++ ++/** ++ * Spit out a blob of data for diagnostics. The data is is a nice column format ++ * for easy reading. ++ * ++ * @param format [in] The string (with possible embedded format characters) ++ * @param size [in] The number of numbers to print ++ * @param data [in] The start of data to use ++ * @param ... [in] Any additional arguments ++ */ ++EXP_FUNC void STDCALL print_blob(const char *format, ++ const uint8_t *data, int size, ...) ++{ ++ int i; ++ char tmp[80]; ++ va_list(ap); ++ ++ va_start(ap, size); ++ sprintf(tmp, "%s\n", format); ++ vprintf(tmp, ap); ++ print_hex_init(size); ++ for (i = 0; i < size; i++) ++ { ++ print_hex(data[i]); ++ } ++ ++ va_end(ap); ++ TTY_FLUSH(); ++} ++#elif defined(WIN32) ++/* VC6.0 doesn't handle variadic macros */ ++EXP_FUNC void STDCALL print_blob(const char *format, const unsigned char *data, ++ int size, ...) {} ++#endif ++ ++#if defined(CONFIG_SSL_HAS_PEM) || defined(CONFIG_HTTP_HAS_AUTHORIZATION) ++/* base64 to binary lookup table */ ++static const uint8_t map[128] = ++{ ++ 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, ++ 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, ++ 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, ++ 255, 255, 255, 255, 255, 255, 255, 62, 255, 255, 255, 63, ++ 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 255, 255, ++ 255, 254, 255, 255, 255, 0, 1, 2, 3, 4, 5, 6, ++ 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, ++ 19, 20, 21, 22, 23, 24, 25, 255, 255, 255, 255, 255, ++ 255, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, ++ 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, ++ 49, 50, 51, 255, 255, 255, 255, 255 ++}; ++ ++EXP_FUNC int STDCALL base64_decode(const char *in, int len, ++ uint8_t *out, int *outlen) ++{ ++ int g, t, x, y, z; ++ uint8_t c; ++ int ret = -1; ++ ++ g = 3; ++ for (x = y = z = t = 0; x < len; x++) ++ { ++ if ((c = map[in[x]&0x7F]) == 0xff) ++ continue; ++ ++ if (c == 254) /* this is the end... */ ++ { ++ c = 0; ++ ++ if (--g < 0) ++ goto error; ++ } ++ else if (g != 3) /* only allow = at end */ ++ goto error; ++ ++ t = (t<<6) | c; ++ ++ if (++y == 4) ++ { ++ out[z++] = (uint8_t)((t>>16)&255); ++ ++ if (g > 1) ++ out[z++] = (uint8_t)((t>>8)&255); ++ ++ if (g > 2) ++ out[z++] = (uint8_t)(t&255); ++ ++ y = t = 0; ++ } ++ } ++ ++ if (y != 0) ++ goto error; ++ ++ if (outlen) ++ *outlen = z; ++ ret = 0; ++ ++error: ++#ifdef CONFIG_SSL_FULL_MODE ++ if (ret < 0) ++ printf("Error: Invalid base64\n"); TTY_FLUSH(); ++#endif ++ TTY_FLUSH(); ++ return ret; ++ ++} ++#endif ++ +diff --git a/feeds/luci/libs/luci-lib-nixio/axTLS/crypto/hmac.c b/feeds/luci/libs/luci-lib-nixio/axTLS/crypto/hmac.c +new file mode 100644 +index 0000000..9199ff2 +--- /dev/null ++++ b/feeds/luci/libs/luci-lib-nixio/axTLS/crypto/hmac.c +@@ -0,0 +1,100 @@ ++/* ++ * Copyright (c) 2007, Cameron Rich ++ * ++ * All rights reserved. ++ * ++ * Redistribution and use in source and binary forms, with or without ++ * modification, are permitted provided that the following conditions are met: ++ * ++ * * Redistributions of source code must retain the above copyright notice, ++ * this list of conditions and the following disclaimer. ++ * * 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. ++ * * Neither the name of the axTLS project nor the names of its contributors ++ * may be used to endorse or promote products derived from this software ++ * without specific prior written permission. ++ * ++ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ++ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT ++ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR ++ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR ++ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, ++ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, ++ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR ++ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF ++ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING ++ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS ++ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ++ */ ++ ++/** ++ * HMAC implementation - This code was originally taken from RFC2104 ++ */ ++ ++#include ++#include "crypto.h" ++ ++/** ++ * Perform HMAC-MD5 ++ */ ++void hmac_md5(const uint8_t *msg, int length, const uint8_t *key, ++ int key_len, uint8_t *digest) ++{ ++ MD5_CTX context; ++ uint8_t k_ipad[64]; ++ uint8_t k_opad[64]; ++ int i; ++ ++ memset(k_ipad, 0, sizeof k_ipad); ++ memset(k_opad, 0, sizeof k_opad); ++ memcpy(k_ipad, key, key_len); ++ memcpy(k_opad, key, key_len); ++ ++ for (i = 0; i < 64; i++) ++ { ++ k_ipad[i] ^= 0x36; ++ k_opad[i] ^= 0x5c; ++ } ++ ++ MD5_Init(&context); ++ MD5_Update(&context, k_ipad, 64); ++ MD5_Update(&context, msg, length); ++ MD5_Final(digest, &context); ++ MD5_Init(&context); ++ MD5_Update(&context, k_opad, 64); ++ MD5_Update(&context, digest, MD5_SIZE); ++ MD5_Final(digest, &context); ++} ++ ++/** ++ * Perform HMAC-SHA1 ++ */ ++void hmac_sha1(const uint8_t *msg, int length, const uint8_t *key, ++ int key_len, uint8_t *digest) ++{ ++ SHA1_CTX context; ++ uint8_t k_ipad[64]; ++ uint8_t k_opad[64]; ++ int i; ++ ++ memset(k_ipad, 0, sizeof k_ipad); ++ memset(k_opad, 0, sizeof k_opad); ++ memcpy(k_ipad, key, key_len); ++ memcpy(k_opad, key, key_len); ++ ++ for (i = 0; i < 64; i++) ++ { ++ k_ipad[i] ^= 0x36; ++ k_opad[i] ^= 0x5c; ++ } ++ ++ SHA1_Init(&context); ++ SHA1_Update(&context, k_ipad, 64); ++ SHA1_Update(&context, msg, length); ++ SHA1_Final(digest, &context); ++ SHA1_Init(&context); ++ SHA1_Update(&context, k_opad, 64); ++ SHA1_Update(&context, digest, SHA1_SIZE); ++ SHA1_Final(digest, &context); ++} +diff --git a/feeds/luci/libs/luci-lib-nixio/axTLS/crypto/md2.c b/feeds/luci/libs/luci-lib-nixio/axTLS/crypto/md2.c +new file mode 100644 +index 0000000..bfcbd24 +--- /dev/null ++++ b/feeds/luci/libs/luci-lib-nixio/axTLS/crypto/md2.c +@@ -0,0 +1,162 @@ ++/* ++ * Copyright (c) 2007, Cameron Rich ++ * ++ * All rights reserved. ++ * ++ * Redistribution and use in source and binary forms, with or without ++ * modification, are permitted provided that the following conditions are met: ++ * ++ * * Redistributions of source code must retain the above copyright notice, ++ * this list of conditions and the following disclaimer. ++ * * 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. ++ * * Neither the name of the axTLS project nor the names of its contributors ++ * may be used to endorse or promote products derived from this software ++ * without specific prior written permission. ++ * ++ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ++ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT ++ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR ++ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR ++ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, ++ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, ++ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR ++ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF ++ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING ++ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS ++ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ++ */ ++ ++/* ++ * RFC 1115/1319 compliant MD2 implementation ++ * The MD2 algorithm was designed by Ron Rivest in 1989. ++ * ++ * http://www.ietf.org/rfc/rfc1115.txt ++ * http://www.ietf.org/rfc/rfc1319.txt ++ */ ++ ++#include ++#include ++ ++#include "crypto.h" ++ ++/** ++ * This code is only here to enable the verification of Verisign root ++ * certificates. So only enable it for verification mode. ++ */ ++#ifdef CONFIG_SSL_CERT_VERIFICATION ++ ++static const uint8_t PI_SUBST[256] = ++{ ++ 0x29, 0x2E, 0x43, 0xC9, 0xA2, 0xD8, 0x7C, 0x01, 0x3D, 0x36, ++ 0x54, 0xA1, 0xEC, 0xF0, 0x06, 0x13, 0x62, 0xA7, 0x05, 0xF3, ++ 0xC0, 0xC7, 0x73, 0x8C, 0x98, 0x93, 0x2B, 0xD9, 0xBC, 0x4C, ++ 0x82, 0xCA, 0x1E, 0x9B, 0x57, 0x3C, 0xFD, 0xD4, 0xE0, 0x16, ++ 0x67, 0x42, 0x6F, 0x18, 0x8A, 0x17, 0xE5, 0x12, 0xBE, 0x4E, ++ 0xC4, 0xD6, 0xDA, 0x9E, 0xDE, 0x49, 0xA0, 0xFB, 0xF5, 0x8E, ++ 0xBB, 0x2F, 0xEE, 0x7A, 0xA9, 0x68, 0x79, 0x91, 0x15, 0xB2, ++ 0x07, 0x3F, 0x94, 0xC2, 0x10, 0x89, 0x0B, 0x22, 0x5F, 0x21, ++ 0x80, 0x7F, 0x5D, 0x9A, 0x5A, 0x90, 0x32, 0x27, 0x35, 0x3E, ++ 0xCC, 0xE7, 0xBF, 0xF7, 0x97, 0x03, 0xFF, 0x19, 0x30, 0xB3, ++ 0x48, 0xA5, 0xB5, 0xD1, 0xD7, 0x5E, 0x92, 0x2A, 0xAC, 0x56, ++ 0xAA, 0xC6, 0x4F, 0xB8, 0x38, 0xD2, 0x96, 0xA4, 0x7D, 0xB6, ++ 0x76, 0xFC, 0x6B, 0xE2, 0x9C, 0x74, 0x04, 0xF1, 0x45, 0x9D, ++ 0x70, 0x59, 0x64, 0x71, 0x87, 0x20, 0x86, 0x5B, 0xCF, 0x65, ++ 0xE6, 0x2D, 0xA8, 0x02, 0x1B, 0x60, 0x25, 0xAD, 0xAE, 0xB0, ++ 0xB9, 0xF6, 0x1C, 0x46, 0x61, 0x69, 0x34, 0x40, 0x7E, 0x0F, ++ 0x55, 0x47, 0xA3, 0x23, 0xDD, 0x51, 0xAF, 0x3A, 0xC3, 0x5C, ++ 0xF9, 0xCE, 0xBA, 0xC5, 0xEA, 0x26, 0x2C, 0x53, 0x0D, 0x6E, ++ 0x85, 0x28, 0x84, 0x09, 0xD3, 0xDF, 0xCD, 0xF4, 0x41, 0x81, ++ 0x4D, 0x52, 0x6A, 0xDC, 0x37, 0xC8, 0x6C, 0xC1, 0xAB, 0xFA, ++ 0x24, 0xE1, 0x7B, 0x08, 0x0C, 0xBD, 0xB1, 0x4A, 0x78, 0x88, ++ 0x95, 0x8B, 0xE3, 0x63, 0xE8, 0x6D, 0xE9, 0xCB, 0xD5, 0xFE, ++ 0x3B, 0x00, 0x1D, 0x39, 0xF2, 0xEF, 0xB7, 0x0E, 0x66, 0x58, ++ 0xD0, 0xE4, 0xA6, 0x77, 0x72, 0xF8, 0xEB, 0x75, 0x4B, 0x0A, ++ 0x31, 0x44, 0x50, 0xB4, 0x8F, 0xED, 0x1F, 0x1A, 0xDB, 0x99, ++ 0x8D, 0x33, 0x9F, 0x11, 0x83, 0x14 ++}; ++ ++/* ++ * MD2 context setup ++ */ ++EXP_FUNC void STDCALL MD2_Init(MD2_CTX *ctx) ++{ ++ memset(ctx, 0, sizeof *ctx); ++} ++ ++static void md2_process(MD2_CTX *ctx) ++{ ++ int i, j; ++ uint8_t t = 0; ++ ++ for (i = 0; i < 16; i++) ++ { ++ ctx->state[i + 16] = ctx->buffer[i]; ++ ctx->state[i + 32] = ctx->buffer[i] ^ ctx->state[i]; ++ } ++ ++ for (i = 0; i < 18; i++) ++ { ++ for (j = 0; j < 48; j++) ++ t = (ctx->state[j] ^= PI_SUBST[t]); ++ ++ t = (t + i) & 0xFF; ++ } ++ ++ t = ctx->cksum[15]; ++ ++ for (i = 0; i < 16; i++) ++ t = (ctx->cksum[i] ^= PI_SUBST[ctx->buffer[i] ^ t]); ++} ++ ++/* ++ * MD2 process buffer ++ */ ++EXP_FUNC void STDCALL MD2_Update(MD2_CTX *ctx, const uint8_t *input, int ilen) ++{ ++ int fill; ++ ++ while (ilen > 0) ++ { ++ if (ctx->left + ilen > 16) ++ fill = 16 - ctx->left; ++ else ++ fill = ilen; ++ ++ memcpy(ctx->buffer + ctx->left, input, fill); ++ ++ ctx->left += fill; ++ input += fill; ++ ilen -= fill; ++ ++ if (ctx->left == 16) ++ { ++ ctx->left = 0; ++ md2_process(ctx); ++ } ++ } ++} ++ ++/* ++ * MD2 final digest ++ */ ++EXP_FUNC void STDCALL MD2_Final(uint8_t *output, MD2_CTX *ctx) ++{ ++ int i; ++ uint8_t x; ++ ++ x = (uint8_t)(16 - ctx->left); ++ ++ for (i = ctx->left; i < 16; i++) ++ ctx->buffer[i] = x; ++ ++ md2_process(ctx); ++ ++ memcpy(ctx->buffer, ctx->cksum, 16); ++ md2_process(ctx); ++ ++ memcpy(output, ctx->state, 16); ++} ++ ++#endif +diff --git a/feeds/luci/libs/luci-lib-nixio/axTLS/crypto/md5.c b/feeds/luci/libs/luci-lib-nixio/axTLS/crypto/md5.c +new file mode 100644 +index 0000000..b4f86ca +--- /dev/null ++++ b/feeds/luci/libs/luci-lib-nixio/axTLS/crypto/md5.c +@@ -0,0 +1,293 @@ ++/* ++ * Copyright (c) 2007, Cameron Rich ++ * ++ * All rights reserved. ++ * ++ * Redistribution and use in source and binary forms, with or without ++ * modification, are permitted provided that the following conditions are met: ++ * ++ * * Redistributions of source code must retain the above copyright notice, ++ * this list of conditions and the following disclaimer. ++ * * 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. ++ * * Neither the name of the axTLS project nor the names of its contributors ++ * may be used to endorse or promote products derived from this software ++ * without specific prior written permission. ++ * ++ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ++ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT ++ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR ++ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR ++ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, ++ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, ++ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR ++ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF ++ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING ++ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS ++ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ++ */ ++ ++/** ++ * This file implements the MD5 algorithm as defined in RFC1321 ++ */ ++ ++#include ++#include "crypto.h" ++ ++/* Constants for MD5Transform routine. ++ */ ++#define S11 7 ++#define S12 12 ++#define S13 17 ++#define S14 22 ++#define S21 5 ++#define S22 9 ++#define S23 14 ++#define S24 20 ++#define S31 4 ++#define S32 11 ++#define S33 16 ++#define S34 23 ++#define S41 6 ++#define S42 10 ++#define S43 15 ++#define S44 21 ++ ++/* ----- static functions ----- */ ++static void MD5Transform(uint32_t state[4], const uint8_t block[64]); ++static void Encode(uint8_t *output, uint32_t *input, uint32_t len); ++static void Decode(uint32_t *output, const uint8_t *input, uint32_t len); ++ ++static const uint8_t PADDING[64] = ++{ ++ 0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ++}; ++ ++/* F, G, H and I are basic MD5 functions. ++ */ ++#define F(x, y, z) (((x) & (y)) | ((~x) & (z))) ++#define G(x, y, z) (((x) & (z)) | ((y) & (~z))) ++#define H(x, y, z) ((x) ^ (y) ^ (z)) ++#define I(x, y, z) ((y) ^ ((x) | (~z))) ++ ++/* ROTATE_LEFT rotates x left n bits. */ ++#define ROTATE_LEFT(x, n) (((x) << (n)) | ((x) >> (32-(n)))) ++ ++/* FF, GG, HH, and II transformations for rounds 1, 2, 3, and 4. ++ Rotation is separate from addition to prevent recomputation. */ ++#define FF(a, b, c, d, x, s, ac) { \ ++ (a) += F ((b), (c), (d)) + (x) + (uint32_t)(ac); \ ++ (a) = ROTATE_LEFT ((a), (s)); \ ++ (a) += (b); \ ++ } ++#define GG(a, b, c, d, x, s, ac) { \ ++ (a) += G ((b), (c), (d)) + (x) + (uint32_t)(ac); \ ++ (a) = ROTATE_LEFT ((a), (s)); \ ++ (a) += (b); \ ++ } ++#define HH(a, b, c, d, x, s, ac) { \ ++ (a) += H ((b), (c), (d)) + (x) + (uint32_t)(ac); \ ++ (a) = ROTATE_LEFT ((a), (s)); \ ++ (a) += (b); \ ++ } ++#define II(a, b, c, d, x, s, ac) { \ ++ (a) += I ((b), (c), (d)) + (x) + (uint32_t)(ac); \ ++ (a) = ROTATE_LEFT ((a), (s)); \ ++ (a) += (b); \ ++ } ++ ++/** ++ * MD5 initialization - begins an MD5 operation, writing a new ctx. ++ */ ++EXP_FUNC void STDCALL MD5_Init(MD5_CTX *ctx) ++{ ++ ctx->count[0] = ctx->count[1] = 0; ++ ++ /* Load magic initialization constants. ++ */ ++ ctx->state[0] = 0x67452301; ++ ctx->state[1] = 0xefcdab89; ++ ctx->state[2] = 0x98badcfe; ++ ctx->state[3] = 0x10325476; ++} ++ ++/** ++ * Accepts an array of octets as the next portion of the message. ++ */ ++EXP_FUNC void STDCALL MD5_Update(MD5_CTX *ctx, const uint8_t * msg, int len) ++{ ++ uint32_t x; ++ int i, partLen; ++ ++ /* Compute number of bytes mod 64 */ ++ x = (uint32_t)((ctx->count[0] >> 3) & 0x3F); ++ ++ /* Update number of bits */ ++ if ((ctx->count[0] += ((uint32_t)len << 3)) < ((uint32_t)len << 3)) ++ ctx->count[1]++; ++ ctx->count[1] += ((uint32_t)len >> 29); ++ ++ partLen = 64 - x; ++ ++ /* Transform as many times as possible. */ ++ if (len >= partLen) ++ { ++ memcpy(&ctx->buffer[x], msg, partLen); ++ MD5Transform(ctx->state, ctx->buffer); ++ ++ for (i = partLen; i + 63 < len; i += 64) ++ MD5Transform(ctx->state, &msg[i]); ++ ++ x = 0; ++ } ++ else ++ i = 0; ++ ++ /* Buffer remaining input */ ++ memcpy(&ctx->buffer[x], &msg[i], len-i); ++} ++ ++/** ++ * Return the 128-bit message digest into the user's array ++ */ ++EXP_FUNC void STDCALL MD5_Final(uint8_t *digest, MD5_CTX *ctx) ++{ ++ uint8_t bits[8]; ++ uint32_t x, padLen; ++ ++ /* Save number of bits */ ++ Encode(bits, ctx->count, 8); ++ ++ /* Pad out to 56 mod 64. ++ */ ++ x = (uint32_t)((ctx->count[0] >> 3) & 0x3f); ++ padLen = (x < 56) ? (56 - x) : (120 - x); ++ MD5_Update(ctx, PADDING, padLen); ++ ++ /* Append length (before padding) */ ++ MD5_Update(ctx, bits, 8); ++ ++ /* Store state in digest */ ++ Encode(digest, ctx->state, MD5_SIZE); ++} ++ ++/** ++ * MD5 basic transformation. Transforms state based on block. ++ */ ++static void MD5Transform(uint32_t state[4], const uint8_t block[64]) ++{ ++ uint32_t a = state[0], b = state[1], c = state[2], ++ d = state[3], x[MD5_SIZE]; ++ ++ Decode(x, block, 64); ++ ++ /* Round 1 */ ++ FF (a, b, c, d, x[ 0], S11, 0xd76aa478); /* 1 */ ++ FF (d, a, b, c, x[ 1], S12, 0xe8c7b756); /* 2 */ ++ FF (c, d, a, b, x[ 2], S13, 0x242070db); /* 3 */ ++ FF (b, c, d, a, x[ 3], S14, 0xc1bdceee); /* 4 */ ++ FF (a, b, c, d, x[ 4], S11, 0xf57c0faf); /* 5 */ ++ FF (d, a, b, c, x[ 5], S12, 0x4787c62a); /* 6 */ ++ FF (c, d, a, b, x[ 6], S13, 0xa8304613); /* 7 */ ++ FF (b, c, d, a, x[ 7], S14, 0xfd469501); /* 8 */ ++ FF (a, b, c, d, x[ 8], S11, 0x698098d8); /* 9 */ ++ FF (d, a, b, c, x[ 9], S12, 0x8b44f7af); /* 10 */ ++ FF (c, d, a, b, x[10], S13, 0xffff5bb1); /* 11 */ ++ FF (b, c, d, a, x[11], S14, 0x895cd7be); /* 12 */ ++ FF (a, b, c, d, x[12], S11, 0x6b901122); /* 13 */ ++ FF (d, a, b, c, x[13], S12, 0xfd987193); /* 14 */ ++ FF (c, d, a, b, x[14], S13, 0xa679438e); /* 15 */ ++ FF (b, c, d, a, x[15], S14, 0x49b40821); /* 16 */ ++ ++ /* Round 2 */ ++ GG (a, b, c, d, x[ 1], S21, 0xf61e2562); /* 17 */ ++ GG (d, a, b, c, x[ 6], S22, 0xc040b340); /* 18 */ ++ GG (c, d, a, b, x[11], S23, 0x265e5a51); /* 19 */ ++ GG (b, c, d, a, x[ 0], S24, 0xe9b6c7aa); /* 20 */ ++ GG (a, b, c, d, x[ 5], S21, 0xd62f105d); /* 21 */ ++ GG (d, a, b, c, x[10], S22, 0x2441453); /* 22 */ ++ GG (c, d, a, b, x[15], S23, 0xd8a1e681); /* 23 */ ++ GG (b, c, d, a, x[ 4], S24, 0xe7d3fbc8); /* 24 */ ++ GG (a, b, c, d, x[ 9], S21, 0x21e1cde6); /* 25 */ ++ GG (d, a, b, c, x[14], S22, 0xc33707d6); /* 26 */ ++ GG (c, d, a, b, x[ 3], S23, 0xf4d50d87); /* 27 */ ++ GG (b, c, d, a, x[ 8], S24, 0x455a14ed); /* 28 */ ++ GG (a, b, c, d, x[13], S21, 0xa9e3e905); /* 29 */ ++ GG (d, a, b, c, x[ 2], S22, 0xfcefa3f8); /* 30 */ ++ GG (c, d, a, b, x[ 7], S23, 0x676f02d9); /* 31 */ ++ GG (b, c, d, a, x[12], S24, 0x8d2a4c8a); /* 32 */ ++ ++ /* Round 3 */ ++ HH (a, b, c, d, x[ 5], S31, 0xfffa3942); /* 33 */ ++ HH (d, a, b, c, x[ 8], S32, 0x8771f681); /* 34 */ ++ HH (c, d, a, b, x[11], S33, 0x6d9d6122); /* 35 */ ++ HH (b, c, d, a, x[14], S34, 0xfde5380c); /* 36 */ ++ HH (a, b, c, d, x[ 1], S31, 0xa4beea44); /* 37 */ ++ HH (d, a, b, c, x[ 4], S32, 0x4bdecfa9); /* 38 */ ++ HH (c, d, a, b, x[ 7], S33, 0xf6bb4b60); /* 39 */ ++ HH (b, c, d, a, x[10], S34, 0xbebfbc70); /* 40 */ ++ HH (a, b, c, d, x[13], S31, 0x289b7ec6); /* 41 */ ++ HH (d, a, b, c, x[ 0], S32, 0xeaa127fa); /* 42 */ ++ HH (c, d, a, b, x[ 3], S33, 0xd4ef3085); /* 43 */ ++ HH (b, c, d, a, x[ 6], S34, 0x4881d05); /* 44 */ ++ HH (a, b, c, d, x[ 9], S31, 0xd9d4d039); /* 45 */ ++ HH (d, a, b, c, x[12], S32, 0xe6db99e5); /* 46 */ ++ HH (c, d, a, b, x[15], S33, 0x1fa27cf8); /* 47 */ ++ HH (b, c, d, a, x[ 2], S34, 0xc4ac5665); /* 48 */ ++ ++ /* Round 4 */ ++ II (a, b, c, d, x[ 0], S41, 0xf4292244); /* 49 */ ++ II (d, a, b, c, x[ 7], S42, 0x432aff97); /* 50 */ ++ II (c, d, a, b, x[14], S43, 0xab9423a7); /* 51 */ ++ II (b, c, d, a, x[ 5], S44, 0xfc93a039); /* 52 */ ++ II (a, b, c, d, x[12], S41, 0x655b59c3); /* 53 */ ++ II (d, a, b, c, x[ 3], S42, 0x8f0ccc92); /* 54 */ ++ II (c, d, a, b, x[10], S43, 0xffeff47d); /* 55 */ ++ II (b, c, d, a, x[ 1], S44, 0x85845dd1); /* 56 */ ++ II (a, b, c, d, x[ 8], S41, 0x6fa87e4f); /* 57 */ ++ II (d, a, b, c, x[15], S42, 0xfe2ce6e0); /* 58 */ ++ II (c, d, a, b, x[ 6], S43, 0xa3014314); /* 59 */ ++ II (b, c, d, a, x[13], S44, 0x4e0811a1); /* 60 */ ++ II (a, b, c, d, x[ 4], S41, 0xf7537e82); /* 61 */ ++ II (d, a, b, c, x[11], S42, 0xbd3af235); /* 62 */ ++ II (c, d, a, b, x[ 2], S43, 0x2ad7d2bb); /* 63 */ ++ II (b, c, d, a, x[ 9], S44, 0xeb86d391); /* 64 */ ++ ++ state[0] += a; ++ state[1] += b; ++ state[2] += c; ++ state[3] += d; ++} ++ ++/** ++ * Encodes input (uint32_t) into output (uint8_t). Assumes len is ++ * a multiple of 4. ++ */ ++static void Encode(uint8_t *output, uint32_t *input, uint32_t len) ++{ ++ uint32_t i, j; ++ ++ for (i = 0, j = 0; j < len; i++, j += 4) ++ { ++ output[j] = (uint8_t)(input[i] & 0xff); ++ output[j+1] = (uint8_t)((input[i] >> 8) & 0xff); ++ output[j+2] = (uint8_t)((input[i] >> 16) & 0xff); ++ output[j+3] = (uint8_t)((input[i] >> 24) & 0xff); ++ } ++} ++ ++/** ++ * Decodes input (uint8_t) into output (uint32_t). Assumes len is ++ * a multiple of 4. ++ */ ++static void Decode(uint32_t *output, const uint8_t *input, uint32_t len) ++{ ++ uint32_t i, j; ++ ++ for (i = 0, j = 0; j < len; i++, j += 4) ++ output[i] = ((uint32_t)input[j]) | (((uint32_t)input[j+1]) << 8) | ++ (((uint32_t)input[j+2]) << 16) | (((uint32_t)input[j+3]) << 24); ++} +diff --git a/feeds/luci/libs/luci-lib-nixio/axTLS/crypto/rc4.c b/feeds/luci/libs/luci-lib-nixio/axTLS/crypto/rc4.c +new file mode 100644 +index 0000000..57136b8 +--- /dev/null ++++ b/feeds/luci/libs/luci-lib-nixio/axTLS/crypto/rc4.c +@@ -0,0 +1,91 @@ ++/* ++ * Copyright (c) 2007, Cameron Rich ++ * ++ * All rights reserved. ++ * ++ * Redistribution and use in source and binary forms, with or without ++ * modification, are permitted provided that the following conditions are met: ++ * ++ * * Redistributions of source code must retain the above copyright notice, ++ * this list of conditions and the following disclaimer. ++ * * 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. ++ * * Neither the name of the axTLS project nor the names of its contributors ++ * may be used to endorse or promote products derived from this software ++ * without specific prior written permission. ++ * ++ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ++ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT ++ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR ++ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR ++ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, ++ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, ++ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR ++ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF ++ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING ++ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS ++ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ++ */ ++ ++/** ++ * An implementation of the RC4/ARC4 algorithm. ++ * Originally written by Christophe Devine. ++ */ ++ ++#include ++#include "crypto.h" ++ ++/** ++ * Get ready for an encrypt/decrypt operation ++ */ ++void RC4_setup(RC4_CTX *ctx, const uint8_t *key, int length) ++{ ++ int i, j = 0, k = 0, a; ++ uint8_t *m; ++ ++ ctx->x = 0; ++ ctx->y = 0; ++ m = ctx->m; ++ ++ for (i = 0; i < 256; i++) ++ m[i] = i; ++ ++ for (i = 0; i < 256; i++) ++ { ++ a = m[i]; ++ j = (uint8_t)(j + a + key[k]); ++ m[i] = m[j]; ++ m[j] = a; ++ ++ if (++k >= length) ++ k = 0; ++ } ++} ++ ++/** ++ * Perform the encrypt/decrypt operation (can use it for either since ++ * this is a stream cipher). ++ */ ++void RC4_crypt(RC4_CTX *ctx, const uint8_t *msg, uint8_t *out, int length) ++{ ++ int i; ++ uint8_t *m, x, y, a, b; ++ out = (uint8_t *)msg; ++ ++ x = ctx->x; ++ y = ctx->y; ++ m = ctx->m; ++ ++ for (i = 0; i < length; i++) ++ { ++ a = m[++x]; ++ y += a; ++ m[x] = b = m[y]; ++ m[y] = a; ++ out[i] ^= m[(uint8_t)(a + b)]; ++ } ++ ++ ctx->x = x; ++ ctx->y = y; ++} +diff --git a/feeds/luci/libs/luci-lib-nixio/axTLS/crypto/rsa.c b/feeds/luci/libs/luci-lib-nixio/axTLS/crypto/rsa.c +new file mode 100644 +index 0000000..31627bb +--- /dev/null ++++ b/feeds/luci/libs/luci-lib-nixio/axTLS/crypto/rsa.c +@@ -0,0 +1,268 @@ ++/* ++ * Copyright (c) 2007, Cameron Rich ++ * ++ * All rights reserved. ++ * ++ * Redistribution and use in source and binary forms, with or without ++ * modification, are permitted provided that the following conditions are met: ++ * ++ * * Redistributions of source code must retain the above copyright notice, ++ * this list of conditions and the following disclaimer. ++ * * 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. ++ * * Neither the name of the axTLS project nor the names of its contributors ++ * may be used to endorse or promote products derived from this software ++ * without specific prior written permission. ++ * ++ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ++ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT ++ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR ++ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR ++ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, ++ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, ++ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR ++ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF ++ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING ++ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS ++ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ++ */ ++ ++/** ++ * Implements the RSA public encryption algorithm. Uses the bigint library to ++ * perform its calculations. ++ */ ++ ++#include ++#include ++#include ++#include ++#include "crypto.h" ++ ++void RSA_priv_key_new(RSA_CTX **ctx, ++ const uint8_t *modulus, int mod_len, ++ const uint8_t *pub_exp, int pub_len, ++ const uint8_t *priv_exp, int priv_len ++#if CONFIG_BIGINT_CRT ++ , const uint8_t *p, int p_len, ++ const uint8_t *q, int q_len, ++ const uint8_t *dP, int dP_len, ++ const uint8_t *dQ, int dQ_len, ++ const uint8_t *qInv, int qInv_len ++#endif ++ ) ++{ ++ RSA_CTX *rsa_ctx; ++ BI_CTX *bi_ctx; ++ RSA_pub_key_new(ctx, modulus, mod_len, pub_exp, pub_len); ++ rsa_ctx = *ctx; ++ bi_ctx = rsa_ctx->bi_ctx; ++ rsa_ctx->d = bi_import(bi_ctx, priv_exp, priv_len); ++ bi_permanent(rsa_ctx->d); ++ ++#ifdef CONFIG_BIGINT_CRT ++ rsa_ctx->p = bi_import(bi_ctx, p, p_len); ++ rsa_ctx->q = bi_import(bi_ctx, q, q_len); ++ rsa_ctx->dP = bi_import(bi_ctx, dP, dP_len); ++ rsa_ctx->dQ = bi_import(bi_ctx, dQ, dQ_len); ++ rsa_ctx->qInv = bi_import(bi_ctx, qInv, qInv_len); ++ bi_permanent(rsa_ctx->dP); ++ bi_permanent(rsa_ctx->dQ); ++ bi_permanent(rsa_ctx->qInv); ++ bi_set_mod(bi_ctx, rsa_ctx->p, BIGINT_P_OFFSET); ++ bi_set_mod(bi_ctx, rsa_ctx->q, BIGINT_Q_OFFSET); ++#endif ++} ++ ++void RSA_pub_key_new(RSA_CTX **ctx, ++ const uint8_t *modulus, int mod_len, ++ const uint8_t *pub_exp, int pub_len) ++{ ++ RSA_CTX *rsa_ctx; ++ BI_CTX *bi_ctx; ++ ++ if (*ctx) /* if we load multiple certs, dump the old one */ ++ RSA_free(*ctx); ++ ++ bi_ctx = bi_initialize(); ++ *ctx = (RSA_CTX *)calloc(1, sizeof(RSA_CTX)); ++ rsa_ctx = *ctx; ++ rsa_ctx->bi_ctx = bi_ctx; ++ rsa_ctx->num_octets = (mod_len & 0xFFF0); ++ rsa_ctx->m = bi_import(bi_ctx, modulus, mod_len); ++ bi_set_mod(bi_ctx, rsa_ctx->m, BIGINT_M_OFFSET); ++ rsa_ctx->e = bi_import(bi_ctx, pub_exp, pub_len); ++ bi_permanent(rsa_ctx->e); ++} ++ ++/** ++ * Free up any RSA context resources. ++ */ ++void RSA_free(RSA_CTX *rsa_ctx) ++{ ++ BI_CTX *bi_ctx; ++ if (rsa_ctx == NULL) /* deal with ptrs that are null */ ++ return; ++ ++ bi_ctx = rsa_ctx->bi_ctx; ++ ++ bi_depermanent(rsa_ctx->e); ++ bi_free(bi_ctx, rsa_ctx->e); ++ bi_free_mod(rsa_ctx->bi_ctx, BIGINT_M_OFFSET); ++ ++ if (rsa_ctx->d) ++ { ++ bi_depermanent(rsa_ctx->d); ++ bi_free(bi_ctx, rsa_ctx->d); ++#ifdef CONFIG_BIGINT_CRT ++ bi_depermanent(rsa_ctx->dP); ++ bi_depermanent(rsa_ctx->dQ); ++ bi_depermanent(rsa_ctx->qInv); ++ bi_free(bi_ctx, rsa_ctx->dP); ++ bi_free(bi_ctx, rsa_ctx->dQ); ++ bi_free(bi_ctx, rsa_ctx->qInv); ++ bi_free_mod(rsa_ctx->bi_ctx, BIGINT_P_OFFSET); ++ bi_free_mod(rsa_ctx->bi_ctx, BIGINT_Q_OFFSET); ++#endif ++ } ++ ++ bi_terminate(bi_ctx); ++ free(rsa_ctx); ++} ++ ++/** ++ * @brief Use PKCS1.5 for decryption/verification. ++ * @param ctx [in] The context ++ * @param in_data [in] The data to encrypt (must be < modulus size-11) ++ * @param out_data [out] The encrypted data. ++ * @param is_decryption [in] Decryption or verify operation. ++ * @return The number of bytes that were originally encrypted. -1 on error. ++ * @see http://www.rsasecurity.com/rsalabs/node.asp?id=2125 ++ */ ++int RSA_decrypt(const RSA_CTX *ctx, const uint8_t *in_data, ++ uint8_t *out_data, int is_decryption) ++{ ++ const int byte_size = ctx->num_octets; ++ int i, size; ++ bigint *decrypted_bi, *dat_bi; ++ uint8_t *block = (uint8_t *)alloca(byte_size); ++ ++ memset(out_data, 0, byte_size); /* initialise */ ++ ++ /* decrypt */ ++ dat_bi = bi_import(ctx->bi_ctx, in_data, byte_size); ++#ifdef CONFIG_SSL_CERT_VERIFICATION ++ decrypted_bi = is_decryption ? /* decrypt or verify? */ ++ RSA_private(ctx, dat_bi) : RSA_public(ctx, dat_bi); ++#else /* always a decryption */ ++ decrypted_bi = RSA_private(ctx, dat_bi); ++#endif ++ ++ /* convert to a normal block */ ++ bi_export(ctx->bi_ctx, decrypted_bi, block, byte_size); ++ ++ i = 10; /* start at the first possible non-padded byte */ ++ ++#ifdef CONFIG_SSL_CERT_VERIFICATION ++ if (is_decryption == 0) /* PKCS1.5 signing pads with "0xff"s */ ++ { ++ while (block[i++] == 0xff && i < byte_size); ++ ++ if (block[i-2] != 0xff) ++ i = byte_size; /*ensure size is 0 */ ++ } ++ else /* PKCS1.5 encryption padding is random */ ++#endif ++ { ++ while (block[i++] && i < byte_size); ++ } ++ size = byte_size - i; ++ ++ /* get only the bit we want */ ++ if (size > 0) ++ memcpy(out_data, &block[i], size); ++ ++ return size ? size : -1; ++} ++ ++/** ++ * Performs m = c^d mod n ++ */ ++bigint *RSA_private(const RSA_CTX *c, bigint *bi_msg) ++{ ++#ifdef CONFIG_BIGINT_CRT ++ return bi_crt(c->bi_ctx, bi_msg, c->dP, c->dQ, c->p, c->q, c->qInv); ++#else ++ BI_CTX *ctx = c->bi_ctx; ++ ctx->mod_offset = BIGINT_M_OFFSET; ++ return bi_mod_power(ctx, bi_msg, c->d); ++#endif ++} ++ ++#ifdef CONFIG_SSL_FULL_MODE ++/** ++ * Used for diagnostics. ++ */ ++void RSA_print(const RSA_CTX *rsa_ctx) ++{ ++ if (rsa_ctx == NULL) ++ return; ++ ++ printf("----------------- RSA DEBUG ----------------\n"); ++ printf("Size:\t%d\n", rsa_ctx->num_octets); ++ bi_print("Modulus", rsa_ctx->m); ++ bi_print("Public Key", rsa_ctx->e); ++ bi_print("Private Key", rsa_ctx->d); ++} ++#endif ++ ++#if defined(CONFIG_SSL_CERT_VERIFICATION) || defined(CONFIG_SSL_GENERATE_X509_CERT) ++/** ++ * Performs c = m^e mod n ++ */ ++bigint *RSA_public(const RSA_CTX * c, bigint *bi_msg) ++{ ++ c->bi_ctx->mod_offset = BIGINT_M_OFFSET; ++ return bi_mod_power(c->bi_ctx, bi_msg, c->e); ++} ++ ++/** ++ * Use PKCS1.5 for encryption/signing. ++ * see http://www.rsasecurity.com/rsalabs/node.asp?id=2125 ++ */ ++int RSA_encrypt(const RSA_CTX *ctx, const uint8_t *in_data, uint16_t in_len, ++ uint8_t *out_data, int is_signing) ++{ ++ int byte_size = ctx->num_octets; ++ int num_pads_needed = byte_size-in_len-3; ++ bigint *dat_bi, *encrypt_bi; ++ ++ /* note: in_len+11 must be > byte_size */ ++ out_data[0] = 0; /* ensure encryption block is < modulus */ ++ ++ if (is_signing) ++ { ++ out_data[1] = 1; /* PKCS1.5 signing pads with "0xff"'s */ ++ memset(&out_data[2], 0xff, num_pads_needed); ++ } ++ else /* randomize the encryption padding with non-zero bytes */ ++ { ++ out_data[1] = 2; ++ get_random_NZ(num_pads_needed, &out_data[2]); ++ } ++ ++ out_data[2+num_pads_needed] = 0; ++ memcpy(&out_data[3+num_pads_needed], in_data, in_len); ++ ++ /* now encrypt it */ ++ dat_bi = bi_import(ctx->bi_ctx, out_data, byte_size); ++ encrypt_bi = is_signing ? RSA_private(ctx, dat_bi) : ++ RSA_public(ctx, dat_bi); ++ bi_export(ctx->bi_ctx, encrypt_bi, out_data, byte_size); ++ ++ /* save a few bytes of memory */ ++ bi_clear_cache(ctx->bi_ctx); ++ return byte_size; ++} ++ ++#endif /* CONFIG_SSL_CERT_VERIFICATION */ +diff --git a/feeds/luci/libs/luci-lib-nixio/axTLS/crypto/sha1.c b/feeds/luci/libs/luci-lib-nixio/axTLS/crypto/sha1.c +new file mode 100644 +index 0000000..be19100 +--- /dev/null ++++ b/feeds/luci/libs/luci-lib-nixio/axTLS/crypto/sha1.c +@@ -0,0 +1,248 @@ ++/* ++ * Copyright (c) 2007, Cameron Rich ++ * ++ * All rights reserved. ++ * ++ * Redistribution and use in source and binary forms, with or without ++ * modification, are permitted provided that the following conditions are met: ++ * ++ * * Redistributions of source code must retain the above copyright notice, ++ * this list of conditions and the following disclaimer. ++ * * 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. ++ * * Neither the name of the axTLS project nor the names of its contributors ++ * may be used to endorse or promote products derived from this software ++ * without specific prior written permission. ++ * ++ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ++ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT ++ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR ++ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR ++ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, ++ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, ++ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR ++ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF ++ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING ++ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS ++ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ++ */ ++ ++/** ++ * SHA1 implementation - as defined in FIPS PUB 180-1 published April 17, 1995. ++ * This code was originally taken from RFC3174 ++ */ ++ ++#include ++#include "crypto.h" ++ ++/* ++ * Define the SHA1 circular left shift macro ++ */ ++#define SHA1CircularShift(bits,word) \ ++ (((word) << (bits)) | ((word) >> (32-(bits)))) ++ ++/* ----- static functions ----- */ ++static void SHA1PadMessage(SHA1_CTX *ctx); ++static void SHA1ProcessMessageBlock(SHA1_CTX *ctx); ++ ++/** ++ * Initialize the SHA1 context ++ */ ++void SHA1_Init(SHA1_CTX *ctx) ++{ ++ ctx->Length_Low = 0; ++ ctx->Length_High = 0; ++ ctx->Message_Block_Index = 0; ++ ctx->Intermediate_Hash[0] = 0x67452301; ++ ctx->Intermediate_Hash[1] = 0xEFCDAB89; ++ ctx->Intermediate_Hash[2] = 0x98BADCFE; ++ ctx->Intermediate_Hash[3] = 0x10325476; ++ ctx->Intermediate_Hash[4] = 0xC3D2E1F0; ++} ++ ++/** ++ * Accepts an array of octets as the next portion of the message. ++ */ ++void SHA1_Update(SHA1_CTX *ctx, const uint8_t *msg, int len) ++{ ++ while (len--) ++ { ++ ctx->Message_Block[ctx->Message_Block_Index++] = (*msg & 0xFF); ++ ctx->Length_Low += 8; ++ ++ if (ctx->Length_Low == 0) ++ ctx->Length_High++; ++ ++ if (ctx->Message_Block_Index == 64) ++ SHA1ProcessMessageBlock(ctx); ++ ++ msg++; ++ } ++} ++ ++/** ++ * Return the 160-bit message digest into the user's array ++ */ ++void SHA1_Final(uint8_t *digest, SHA1_CTX *ctx) ++{ ++ int i; ++ ++ SHA1PadMessage(ctx); ++ memset(ctx->Message_Block, 0, 64); ++ ctx->Length_Low = 0; /* and clear length */ ++ ctx->Length_High = 0; ++ ++ for (i = 0; i < SHA1_SIZE; i++) ++ { ++ digest[i] = ctx->Intermediate_Hash[i>>2] >> 8 * ( 3 - ( i & 0x03 ) ); ++ } ++} ++ ++/** ++ * Process the next 512 bits of the message stored in the array. ++ */ ++static void SHA1ProcessMessageBlock(SHA1_CTX *ctx) ++{ ++ const uint32_t K[] = { /* Constants defined in SHA-1 */ ++ 0x5A827999, ++ 0x6ED9EBA1, ++ 0x8F1BBCDC, ++ 0xCA62C1D6 ++ }; ++ int t; /* Loop counter */ ++ uint32_t temp; /* Temporary word value */ ++ uint32_t W[80]; /* Word sequence */ ++ uint32_t A, B, C, D, E; /* Word buffers */ ++ ++ /* ++ * Initialize the first 16 words in the array W ++ */ ++ for (t = 0; t < 16; t++) ++ { ++ W[t] = ctx->Message_Block[t * 4] << 24; ++ W[t] |= ctx->Message_Block[t * 4 + 1] << 16; ++ W[t] |= ctx->Message_Block[t * 4 + 2] << 8; ++ W[t] |= ctx->Message_Block[t * 4 + 3]; ++ } ++ ++ for (t = 16; t < 80; t++) ++ { ++ W[t] = SHA1CircularShift(1,W[t-3] ^ W[t-8] ^ W[t-14] ^ W[t-16]); ++ } ++ ++ A = ctx->Intermediate_Hash[0]; ++ B = ctx->Intermediate_Hash[1]; ++ C = ctx->Intermediate_Hash[2]; ++ D = ctx->Intermediate_Hash[3]; ++ E = ctx->Intermediate_Hash[4]; ++ ++ for (t = 0; t < 20; t++) ++ { ++ temp = SHA1CircularShift(5,A) + ++ ((B & C) | ((~B) & D)) + E + W[t] + K[0]; ++ E = D; ++ D = C; ++ C = SHA1CircularShift(30,B); ++ ++ B = A; ++ A = temp; ++ } ++ ++ for (t = 20; t < 40; t++) ++ { ++ temp = SHA1CircularShift(5,A) + (B ^ C ^ D) + E + W[t] + K[1]; ++ E = D; ++ D = C; ++ C = SHA1CircularShift(30,B); ++ B = A; ++ A = temp; ++ } ++ ++ for (t = 40; t < 60; t++) ++ { ++ temp = SHA1CircularShift(5,A) + ++ ((B & C) | (B & D) | (C & D)) + E + W[t] + K[2]; ++ E = D; ++ D = C; ++ C = SHA1CircularShift(30,B); ++ B = A; ++ A = temp; ++ } ++ ++ for (t = 60; t < 80; t++) ++ { ++ temp = SHA1CircularShift(5,A) + (B ^ C ^ D) + E + W[t] + K[3]; ++ E = D; ++ D = C; ++ C = SHA1CircularShift(30,B); ++ B = A; ++ A = temp; ++ } ++ ++ ctx->Intermediate_Hash[0] += A; ++ ctx->Intermediate_Hash[1] += B; ++ ctx->Intermediate_Hash[2] += C; ++ ctx->Intermediate_Hash[3] += D; ++ ctx->Intermediate_Hash[4] += E; ++ ctx->Message_Block_Index = 0; ++} ++ ++/* ++ * According to the standard, the message must be padded to an even ++ * 512 bits. The first padding bit must be a '1'. The last 64 ++ * bits represent the length of the original message. All bits in ++ * between should be 0. This function will pad the message ++ * according to those rules by filling the Message_Block array ++ * accordingly. It will also call the ProcessMessageBlock function ++ * provided appropriately. When it returns, it can be assumed that ++ * the message digest has been computed. ++ * ++ * @param ctx [in, out] The SHA1 context ++ */ ++static void SHA1PadMessage(SHA1_CTX *ctx) ++{ ++ /* ++ * Check to see if the current message block is too small to hold ++ * the initial padding bits and length. If so, we will pad the ++ * block, process it, and then continue padding into a second ++ * block. ++ */ ++ if (ctx->Message_Block_Index > 55) ++ { ++ ctx->Message_Block[ctx->Message_Block_Index++] = 0x80; ++ while(ctx->Message_Block_Index < 64) ++ { ++ ctx->Message_Block[ctx->Message_Block_Index++] = 0; ++ } ++ ++ SHA1ProcessMessageBlock(ctx); ++ ++ while (ctx->Message_Block_Index < 56) ++ { ++ ctx->Message_Block[ctx->Message_Block_Index++] = 0; ++ } ++ } ++ else ++ { ++ ctx->Message_Block[ctx->Message_Block_Index++] = 0x80; ++ while(ctx->Message_Block_Index < 56) ++ { ++ ++ ctx->Message_Block[ctx->Message_Block_Index++] = 0; ++ } ++ } ++ ++ /* ++ * Store the message length as the last 8 octets ++ */ ++ ctx->Message_Block[56] = ctx->Length_High >> 24; ++ ctx->Message_Block[57] = ctx->Length_High >> 16; ++ ctx->Message_Block[58] = ctx->Length_High >> 8; ++ ctx->Message_Block[59] = ctx->Length_High; ++ ctx->Message_Block[60] = ctx->Length_Low >> 24; ++ ctx->Message_Block[61] = ctx->Length_Low >> 16; ++ ctx->Message_Block[62] = ctx->Length_Low >> 8; ++ ctx->Message_Block[63] = ctx->Length_Low; ++ SHA1ProcessMessageBlock(ctx); ++} +diff --git a/feeds/luci/libs/luci-lib-nixio/axTLS/docsrc/Makefile b/feeds/luci/libs/luci-lib-nixio/axTLS/docsrc/Makefile +new file mode 100644 +index 0000000..2826686 +--- /dev/null ++++ b/feeds/luci/libs/luci-lib-nixio/axTLS/docsrc/Makefile +@@ -0,0 +1,39 @@ ++# ++# Copyright (c) 2007, Cameron Rich ++# ++# All rights reserved. ++# ++# Redistribution and use in source and binary forms, with or without ++# modification, are permitted provided that the following conditions are met: ++# ++# * Redistributions of source code must retain the above copyright notice, ++# this list of conditions and the following disclaimer. ++# * 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. ++# * Neither the name of the axTLS project nor the names of its ++# contributors may be used to endorse or promote products derived ++# from this software without specific prior written permission. ++# ++# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ++# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT ++# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR ++# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR ++# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, ++# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED ++# TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, ++# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY ++# OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING ++# NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF ++# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ++# ++ ++include ../config/makefile.conf ++ ++all: ++ ++doco: ++ doxygen ./axTLS.dox ++ ++clean:: ++ @-rm -fr html *~ +diff --git a/feeds/luci/libs/luci-lib-nixio/axTLS/docsrc/axTLS.dox b/feeds/luci/libs/luci-lib-nixio/axTLS/docsrc/axTLS.dox +new file mode 100644 +index 0000000..d9959b2 +--- /dev/null ++++ b/feeds/luci/libs/luci-lib-nixio/axTLS/docsrc/axTLS.dox +@@ -0,0 +1,1237 @@ ++# Doxyfile 1.4.5 ++ ++# This file describes the settings to be used by the documentation system ++# doxygen (www.doxygen.org) for a project ++# ++# All text after a hash (#) is considered a comment and will be ignored ++# The format is: ++# TAG = value [value, ...] ++# For lists items can also be appended using: ++# TAG += value [value, ...] ++# Values that contain spaces should be placed between quotes (" ") ++ ++#--------------------------------------------------------------------------- ++# Project related configuration options ++#--------------------------------------------------------------------------- ++ ++# The PROJECT_NAME tag is a single word (or a sequence of words surrounded ++# by quotes) that should identify the project. ++ ++PROJECT_NAME = axTLS ++ ++# The PROJECT_NUMBER tag can be used to enter a project or revision number. ++# This could be handy for archiving the generated documentation or ++# if some version control system is used. ++ ++PROJECT_NUMBER = ++ ++# The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) ++# base path where the generated documentation will be put. ++# If a relative path is entered, it will be relative to the location ++# where doxygen was started. If left blank the current directory will be used. ++ ++OUTPUT_DIRECTORY = ++ ++# If the CREATE_SUBDIRS tag is set to YES, then doxygen will create ++# 4096 sub-directories (in 2 levels) under the output directory of each output ++# format and will distribute the generated files over these directories. ++# Enabling this option can be useful when feeding doxygen a huge amount of ++# source files, where putting all generated files in the same directory would ++# otherwise cause performance problems for the file system. ++ ++CREATE_SUBDIRS = NO ++ ++# The OUTPUT_LANGUAGE tag is used to specify the language in which all ++# documentation generated by doxygen is written. Doxygen will use this ++# information to generate all constant output in the proper language. ++# The default language is English, other supported languages are: ++# Brazilian, Catalan, Chinese, Chinese-Traditional, Croatian, Czech, Danish, ++# Dutch, Finnish, French, German, Greek, Hungarian, Italian, Japanese, ++# Japanese-en (Japanese with English messages), Korean, Korean-en, Norwegian, ++# Polish, Portuguese, Romanian, Russian, Serbian, Slovak, Slovene, Spanish, ++# Swedish, and Ukrainian. ++ ++OUTPUT_LANGUAGE = English ++ ++# This tag can be used to specify the encoding used in the generated output. ++# The encoding is not always determined by the language that is chosen, ++# but also whether or not the output is meant for Windows or non-Windows users. ++# In case there is a difference, setting the USE_WINDOWS_ENCODING tag to YES ++# forces the Windows encoding (this is the default for the Windows binary), ++# whereas setting the tag to NO uses a Unix-style encoding (the default for ++# all platforms other than Windows). ++ ++USE_WINDOWS_ENCODING = NO ++ ++# If the BRIEF_MEMBER_DESC tag is set to YES (the default) Doxygen will ++# include brief member descriptions after the members that are listed in ++# the file and class documentation (similar to JavaDoc). ++# Set to NO to disable this. ++ ++BRIEF_MEMBER_DESC = YES ++ ++# If the REPEAT_BRIEF tag is set to YES (the default) Doxygen will prepend ++# the brief description of a member or function before the detailed description. ++# Note: if both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the ++# brief descriptions will be completely suppressed. ++ ++REPEAT_BRIEF = YES ++ ++# This tag implements a quasi-intelligent brief description abbreviator ++# that is used to form the text in various listings. Each string ++# in this list, if found as the leading text of the brief description, will be ++# stripped from the text and the result after processing the whole list, is ++# used as the annotated text. Otherwise, the brief description is used as-is. ++# If left blank, the following values are used ("$name" is automatically ++# replaced with the name of the entity): "The $name class" "The $name widget" ++# "The $name file" "is" "provides" "specifies" "contains" ++# "represents" "a" "an" "the" ++ ++ABBREVIATE_BRIEF = ++ ++# If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then ++# Doxygen will generate a detailed section even if there is only a brief ++# description. ++ ++ALWAYS_DETAILED_SEC = NO ++ ++# If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all ++# inherited members of a class in the documentation of that class as if those ++# members were ordinary class members. Constructors, destructors and assignment ++# operators of the base classes will not be shown. ++ ++INLINE_INHERITED_MEMB = NO ++ ++# If the FULL_PATH_NAMES tag is set to YES then Doxygen will prepend the full ++# path before files name in the file list and in the header files. If set ++# to NO the shortest path that makes the file name unique will be used. ++ ++FULL_PATH_NAMES = NO ++ ++# If the FULL_PATH_NAMES tag is set to YES then the STRIP_FROM_PATH tag ++# can be used to strip a user-defined part of the path. Stripping is ++# only done if one of the specified strings matches the left-hand part of ++# the path. The tag can be used to show relative paths in the file list. ++# If left blank the directory from which doxygen is run is used as the ++# path to strip. ++ ++STRIP_FROM_PATH = ++ ++# The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of ++# the path mentioned in the documentation of a class, which tells ++# the reader which header file to include in order to use a class. ++# If left blank only the name of the header file containing the class ++# definition is used. Otherwise one should specify the include paths that ++# are normally passed to the compiler using the -I flag. ++ ++STRIP_FROM_INC_PATH = ++ ++# If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter ++# (but less readable) file names. This can be useful is your file systems ++# doesn't support long names like on DOS, Mac, or CD-ROM. ++ ++SHORT_NAMES = NO ++ ++# If the JAVADOC_AUTOBRIEF tag is set to YES then Doxygen ++# will interpret the first line (until the first dot) of a JavaDoc-style ++# comment as the brief description. If set to NO, the JavaDoc ++# comments will behave just like the Qt-style comments (thus requiring an ++# explicit @brief command for a brief description. ++ ++JAVADOC_AUTOBRIEF = NO ++ ++# The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make Doxygen ++# treat a multi-line C++ special comment block (i.e. a block of //! or /// ++# comments) as a brief description. This used to be the default behaviour. ++# The new default is to treat a multi-line C++ comment block as a detailed ++# description. Set this tag to YES if you prefer the old behaviour instead. ++ ++MULTILINE_CPP_IS_BRIEF = NO ++ ++# If the DETAILS_AT_TOP tag is set to YES then Doxygen ++# will output the detailed description near the top, like JavaDoc. ++# If set to NO, the detailed description appears after the member ++# documentation. ++ ++DETAILS_AT_TOP = NO ++ ++# If the INHERIT_DOCS tag is set to YES (the default) then an undocumented ++# member inherits the documentation from any documented member that it ++# re-implements. ++ ++INHERIT_DOCS = YES ++ ++# If the SEPARATE_MEMBER_PAGES tag is set to YES, then doxygen will produce ++# a new page for each member. If set to NO, the documentation of a member will ++# be part of the file/class/namespace that contains it. ++ ++SEPARATE_MEMBER_PAGES = NO ++ ++# The TAB_SIZE tag can be used to set the number of spaces in a tab. ++# Doxygen uses this value to replace tabs by spaces in code fragments. ++ ++TAB_SIZE = 4 ++ ++# This tag can be used to specify a number of aliases that acts ++# as commands in the documentation. An alias has the form "name=value". ++# For example adding "sideeffect=\par Side Effects:\n" will allow you to ++# put the command \sideeffect (or @sideeffect) in the documentation, which ++# will result in a user-defined paragraph with heading "Side Effects:". ++# You can put \n's in the value part of an alias to insert newlines. ++ ++ALIASES = ++ ++# Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C ++# sources only. Doxygen will then generate output that is more tailored for C. ++# For instance, some of the names that are used will be different. The list ++# of all members will be omitted, etc. ++ ++OPTIMIZE_OUTPUT_FOR_C = YES ++ ++# Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java ++# sources only. Doxygen will then generate output that is more tailored for Java. ++# For instance, namespaces will be presented as packages, qualified scopes ++# will look different, etc. ++ ++OPTIMIZE_OUTPUT_JAVA = NO ++ ++# If you use STL classes (i.e. std::string, std::vector, etc.) but do not want to ++# include (a tag file for) the STL sources as input, then you should ++# set this tag to YES in order to let doxygen match functions declarations and ++# definitions whose arguments contain STL classes (e.g. func(std::string); v.s. ++# func(std::string) {}). This also make the inheritance and collaboration ++# diagrams that involve STL classes more complete and accurate. ++ ++BUILTIN_STL_SUPPORT = NO ++ ++# If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC ++# tag is set to YES, then doxygen will reuse the documentation of the first ++# member in the group (if any) for the other members of the group. By default ++# all members of a group must be documented explicitly. ++ ++DISTRIBUTE_GROUP_DOC = NO ++ ++# Set the SUBGROUPING tag to YES (the default) to allow class member groups of ++# the same type (for instance a group of public functions) to be put as a ++# subgroup of that type (e.g. under the Public Functions section). Set it to ++# NO to prevent subgrouping. Alternatively, this can be done per class using ++# the \nosubgrouping command. ++ ++SUBGROUPING = YES ++ ++#--------------------------------------------------------------------------- ++# Build related configuration options ++#--------------------------------------------------------------------------- ++ ++# If the EXTRACT_ALL tag is set to YES doxygen will assume all entities in ++# documentation are documented, even if no documentation was available. ++# Private class members and static file members will be hidden unless ++# the EXTRACT_PRIVATE and EXTRACT_STATIC tags are set to YES ++ ++EXTRACT_ALL = NO ++ ++# If the EXTRACT_PRIVATE tag is set to YES all private members of a class ++# will be included in the documentation. ++ ++EXTRACT_PRIVATE = NO ++ ++# If the EXTRACT_STATIC tag is set to YES all static members of a file ++# will be included in the documentation. ++ ++EXTRACT_STATIC = NO ++ ++# If the EXTRACT_LOCAL_CLASSES tag is set to YES classes (and structs) ++# defined locally in source files will be included in the documentation. ++# If set to NO only classes defined in header files are included. ++ ++EXTRACT_LOCAL_CLASSES = YES ++ ++# This flag is only useful for Objective-C code. When set to YES local ++# methods, which are defined in the implementation section but not in ++# the interface are included in the documentation. ++# If set to NO (the default) only methods in the interface are included. ++ ++EXTRACT_LOCAL_METHODS = NO ++ ++# If the HIDE_UNDOC_MEMBERS tag is set to YES, Doxygen will hide all ++# undocumented members of documented classes, files or namespaces. ++# If set to NO (the default) these members will be included in the ++# various overviews, but no documentation section is generated. ++# This option has no effect if EXTRACT_ALL is enabled. ++ ++HIDE_UNDOC_MEMBERS = NO ++ ++# If the HIDE_UNDOC_CLASSES tag is set to YES, Doxygen will hide all ++# undocumented classes that are normally visible in the class hierarchy. ++# If set to NO (the default) these classes will be included in the various ++# overviews. This option has no effect if EXTRACT_ALL is enabled. ++ ++HIDE_UNDOC_CLASSES = NO ++ ++# If the HIDE_FRIEND_COMPOUNDS tag is set to YES, Doxygen will hide all ++# friend (class|struct|union) declarations. ++# If set to NO (the default) these declarations will be included in the ++# documentation. ++ ++HIDE_FRIEND_COMPOUNDS = NO ++ ++# If the HIDE_IN_BODY_DOCS tag is set to YES, Doxygen will hide any ++# documentation blocks found inside the body of a function. ++# If set to NO (the default) these blocks will be appended to the ++# function's detailed documentation block. ++ ++HIDE_IN_BODY_DOCS = NO ++ ++# The INTERNAL_DOCS tag determines if documentation ++# that is typed after a \internal command is included. If the tag is set ++# to NO (the default) then the documentation will be excluded. ++# Set it to YES to include the internal documentation. ++ ++INTERNAL_DOCS = NO ++ ++# If the CASE_SENSE_NAMES tag is set to NO then Doxygen will only generate ++# file names in lower-case letters. If set to YES upper-case letters are also ++# allowed. This is useful if you have classes or files whose names only differ ++# in case and if your file system supports case sensitive file names. Windows ++# and Mac users are advised to set this option to NO. ++ ++CASE_SENSE_NAMES = YES ++ ++# If the HIDE_SCOPE_NAMES tag is set to NO (the default) then Doxygen ++# will show members with their full class and namespace scopes in the ++# documentation. If set to YES the scope will be hidden. ++ ++HIDE_SCOPE_NAMES = NO ++ ++# If the SHOW_INCLUDE_FILES tag is set to YES (the default) then Doxygen ++# will put a list of the files that are included by a file in the documentation ++# of that file. ++ ++SHOW_INCLUDE_FILES = NO ++ ++# If the INLINE_INFO tag is set to YES (the default) then a tag [inline] ++# is inserted in the documentation for inline members. ++ ++INLINE_INFO = YES ++ ++# If the SORT_MEMBER_DOCS tag is set to YES (the default) then doxygen ++# will sort the (detailed) documentation of file and class members ++# alphabetically by member name. If set to NO the members will appear in ++# declaration order. ++ ++SORT_MEMBER_DOCS = NO ++ ++# If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the ++# brief documentation of file, namespace and class members alphabetically ++# by member name. If set to NO (the default) the members will appear in ++# declaration order. ++ ++SORT_BRIEF_DOCS = NO ++ ++# If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be ++# sorted by fully-qualified names, including namespaces. If set to ++# NO (the default), the class list will be sorted only by class name, ++# not including the namespace part. ++# Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES. ++# Note: This option applies only to the class list, not to the ++# alphabetical list. ++ ++SORT_BY_SCOPE_NAME = NO ++ ++# The GENERATE_TODOLIST tag can be used to enable (YES) or ++# disable (NO) the todo list. This list is created by putting \todo ++# commands in the documentation. ++ ++GENERATE_TODOLIST = YES ++ ++# The GENERATE_TESTLIST tag can be used to enable (YES) or ++# disable (NO) the test list. This list is created by putting \test ++# commands in the documentation. ++ ++GENERATE_TESTLIST = YES ++ ++# The GENERATE_BUGLIST tag can be used to enable (YES) or ++# disable (NO) the bug list. This list is created by putting \bug ++# commands in the documentation. ++ ++GENERATE_BUGLIST = YES ++ ++# The GENERATE_DEPRECATEDLIST tag can be used to enable (YES) or ++# disable (NO) the deprecated list. This list is created by putting ++# \deprecated commands in the documentation. ++ ++GENERATE_DEPRECATEDLIST= YES ++ ++# The ENABLED_SECTIONS tag can be used to enable conditional ++# documentation sections, marked by \if sectionname ... \endif. ++ ++ENABLED_SECTIONS = ++ ++# The MAX_INITIALIZER_LINES tag determines the maximum number of lines ++# the initial value of a variable or define consists of for it to appear in ++# the documentation. If the initializer consists of more lines than specified ++# here it will be hidden. Use a value of 0 to hide initializers completely. ++# The appearance of the initializer of individual variables and defines in the ++# documentation can be controlled using \showinitializer or \hideinitializer ++# command in the documentation regardless of this setting. ++ ++MAX_INITIALIZER_LINES = 30 ++ ++# Set the SHOW_USED_FILES tag to NO to disable the list of files generated ++# at the bottom of the documentation of classes and structs. If set to YES the ++# list will mention the files that were used to generate the documentation. ++ ++SHOW_USED_FILES = NO ++ ++# If the sources in your project are distributed over multiple directories ++# then setting the SHOW_DIRECTORIES tag to YES will show the directory hierarchy ++# in the documentation. The default is YES. ++ ++SHOW_DIRECTORIES = NO ++ ++# The FILE_VERSION_FILTER tag can be used to specify a program or script that ++# doxygen should invoke to get the current version for each file (typically from the ++# version control system). Doxygen will invoke the program by executing (via ++# popen()) the command , where is the value of ++# the FILE_VERSION_FILTER tag, and is the name of an input file ++# provided by doxygen. Whatever the program writes to standard output ++# is used as the file version. See the manual for examples. ++ ++FILE_VERSION_FILTER = ++ ++#--------------------------------------------------------------------------- ++# configuration options related to warning and progress messages ++#--------------------------------------------------------------------------- ++ ++# The QUIET tag can be used to turn on/off the messages that are generated ++# by doxygen. Possible values are YES and NO. If left blank NO is used. ++ ++QUIET = NO ++ ++# The WARNINGS tag can be used to turn on/off the warning messages that are ++# generated by doxygen. Possible values are YES and NO. If left blank ++# NO is used. ++ ++WARNINGS = YES ++ ++# If WARN_IF_UNDOCUMENTED is set to YES, then doxygen will generate warnings ++# for undocumented members. If EXTRACT_ALL is set to YES then this flag will ++# automatically be disabled. ++ ++WARN_IF_UNDOCUMENTED = YES ++ ++# If WARN_IF_DOC_ERROR is set to YES, doxygen will generate warnings for ++# potential errors in the documentation, such as not documenting some ++# parameters in a documented function, or documenting parameters that ++# don't exist or using markup commands wrongly. ++ ++WARN_IF_DOC_ERROR = YES ++ ++# This WARN_NO_PARAMDOC option can be abled to get warnings for ++# functions that are documented, but have no documentation for their parameters ++# or return value. If set to NO (the default) doxygen will only warn about ++# wrong or incomplete parameter documentation, but not about the absence of ++# documentation. ++ ++WARN_NO_PARAMDOC = NO ++ ++# The WARN_FORMAT tag determines the format of the warning messages that ++# doxygen can produce. The string should contain the $file, $line, and $text ++# tags, which will be replaced by the file and line number from which the ++# warning originated and the warning text. Optionally the format may contain ++# $version, which will be replaced by the version of the file (if it could ++# be obtained via FILE_VERSION_FILTER) ++ ++WARN_FORMAT = "$file:$line: $text" ++ ++# The WARN_LOGFILE tag can be used to specify a file to which warning ++# and error messages should be written. If left blank the output is written ++# to stderr. ++ ++WARN_LOGFILE = ++ ++#--------------------------------------------------------------------------- ++# configuration options related to the input files ++#--------------------------------------------------------------------------- ++ ++# The INPUT tag can be used to specify the files and/or directories that contain ++# documented source files. You may enter file names like "myfile.cpp" or ++# directories like "/usr/src/myproject". Separate the files or directories ++# with spaces. ++ ++INPUT = ../bindings/csharp/axTLS.cs ../bindings/java/SSL.java ../bindings/java/SSLUtil.java ../bindings/java/SSLCTX.java ../bindings/java/SSLServer.java ../bindings/java/SSLClient.java ../bindings/java/SSLReadHolder.java ../ssl/ssl.h ../crypto/bigint.c ../crypto/bigint.h ++ ++# If the value of the INPUT tag contains directories, you can use the ++# FILE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp ++# and *.h) to filter out the source-files in the directories. If left ++# blank the following patterns are tested: ++# *.c *.cc *.cxx *.cpp *.c++ *.java *.ii *.ixx *.ipp *.i++ *.inl *.h *.hh *.hxx ++# *.hpp *.h++ *.idl *.odl *.cs *.php *.php3 *.inc *.m *.mm *.py ++ ++FILE_PATTERNS = ++ ++# The RECURSIVE tag can be used to turn specify whether or not subdirectories ++# should be searched for input files as well. Possible values are YES and NO. ++# If left blank NO is used. ++ ++RECURSIVE = NO ++ ++# The EXCLUDE tag can be used to specify files and/or directories that should ++# excluded from the INPUT source files. This way you can easily exclude a ++# subdirectory from a directory tree whose root is specified with the INPUT tag. ++ ++EXCLUDE = ++ ++# The EXCLUDE_SYMLINKS tag can be used select whether or not files or ++# directories that are symbolic links (a Unix filesystem feature) are excluded ++# from the input. ++ ++EXCLUDE_SYMLINKS = NO ++ ++# If the value of the INPUT tag contains directories, you can use the ++# EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude ++# certain files from those directories. Note that the wildcards are matched ++# against the file with absolute path, so to exclude all test directories ++# for example use the pattern */test/* ++ ++EXCLUDE_PATTERNS = ++ ++# The EXAMPLE_PATH tag can be used to specify one or more files or ++# directories that contain example code fragments that are included (see ++# the \include command). ++ ++EXAMPLE_PATH = ++ ++# If the value of the EXAMPLE_PATH tag contains directories, you can use the ++# EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp ++# and *.h) to filter out the source-files in the directories. If left ++# blank all files are included. ++ ++EXAMPLE_PATTERNS = ++ ++# If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be ++# searched for input files to be used with the \include or \dontinclude ++# commands irrespective of the value of the RECURSIVE tag. ++# Possible values are YES and NO. If left blank NO is used. ++ ++EXAMPLE_RECURSIVE = NO ++ ++# The IMAGE_PATH tag can be used to specify one or more files or ++# directories that contain image that are included in the documentation (see ++# the \image command). ++ ++IMAGE_PATH = images ++ ++# The INPUT_FILTER tag can be used to specify a program that doxygen should ++# invoke to filter for each input file. Doxygen will invoke the filter program ++# by executing (via popen()) the command , where ++# is the value of the INPUT_FILTER tag, and is the name of an ++# input file. Doxygen will then use the output that the filter program writes ++# to standard output. If FILTER_PATTERNS is specified, this tag will be ++# ignored. ++ ++INPUT_FILTER = ++ ++# The FILTER_PATTERNS tag can be used to specify filters on a per file pattern ++# basis. Doxygen will compare the file name with each pattern and apply the ++# filter if there is a match. The filters are a list of the form: ++# pattern=filter (like *.cpp=my_cpp_filter). See INPUT_FILTER for further ++# info on how filters are used. If FILTER_PATTERNS is empty, INPUT_FILTER ++# is applied to all files. ++ ++FILTER_PATTERNS = ++ ++# If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using ++# INPUT_FILTER) will be used to filter the input files when producing source ++# files to browse (i.e. when SOURCE_BROWSER is set to YES). ++ ++FILTER_SOURCE_FILES = NO ++ ++#--------------------------------------------------------------------------- ++# configuration options related to source browsing ++#--------------------------------------------------------------------------- ++ ++# If the SOURCE_BROWSER tag is set to YES then a list of source files will ++# be generated. Documented entities will be cross-referenced with these sources. ++# Note: To get rid of all source code in the generated output, make sure also ++# VERBATIM_HEADERS is set to NO. ++ ++SOURCE_BROWSER = NO ++ ++# Setting the INLINE_SOURCES tag to YES will include the body ++# of functions and classes directly in the documentation. ++ ++INLINE_SOURCES = NO ++ ++# Setting the STRIP_CODE_COMMENTS tag to YES (the default) will instruct ++# doxygen to hide any special comment blocks from generated source code ++# fragments. Normal C and C++ comments will always remain visible. ++ ++STRIP_CODE_COMMENTS = YES ++ ++# If the REFERENCED_BY_RELATION tag is set to YES (the default) ++# then for each documented function all documented ++# functions referencing it will be listed. ++ ++REFERENCED_BY_RELATION = YES ++ ++# If the REFERENCES_RELATION tag is set to YES (the default) ++# then for each documented function all documented entities ++# called/used by that function will be listed. ++ ++REFERENCES_RELATION = YES ++ ++# If the USE_HTAGS tag is set to YES then the references to source code ++# will point to the HTML generated by the htags(1) tool instead of doxygen ++# built-in source browser. The htags tool is part of GNU's global source ++# tagging system (see http://www.gnu.org/software/global/global.html). You ++# will need version 4.8.6 or higher. ++ ++USE_HTAGS = NO ++ ++# If the VERBATIM_HEADERS tag is set to YES (the default) then Doxygen ++# will generate a verbatim copy of the header file for each class for ++# which an include is specified. Set to NO to disable this. ++ ++VERBATIM_HEADERS = NO ++ ++#--------------------------------------------------------------------------- ++# configuration options related to the alphabetical class index ++#--------------------------------------------------------------------------- ++ ++# If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index ++# of all compounds will be generated. Enable this if the project ++# contains a lot of classes, structs, unions or interfaces. ++ ++ALPHABETICAL_INDEX = NO ++ ++# If the alphabetical index is enabled (see ALPHABETICAL_INDEX) then ++# the COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns ++# in which this list will be split (can be a number in the range [1..20]) ++ ++COLS_IN_ALPHA_INDEX = 5 ++ ++# In case all classes in a project start with a common prefix, all ++# classes will be put under the same header in the alphabetical index. ++# The IGNORE_PREFIX tag can be used to specify one or more prefixes that ++# should be ignored while generating the index headers. ++ ++IGNORE_PREFIX = ++ ++#--------------------------------------------------------------------------- ++# configuration options related to the HTML output ++#--------------------------------------------------------------------------- ++ ++# If the GENERATE_HTML tag is set to YES (the default) Doxygen will ++# generate HTML output. ++ ++GENERATE_HTML = YES ++ ++# The HTML_OUTPUT tag is used to specify where the HTML docs will be put. ++# If a relative path is entered the value of OUTPUT_DIRECTORY will be ++# put in front of it. If left blank `html' will be used as the default path. ++ ++HTML_OUTPUT = html ++ ++# The HTML_FILE_EXTENSION tag can be used to specify the file extension for ++# each generated HTML page (for example: .htm,.php,.asp). If it is left blank ++# doxygen will generate files with .html extension. ++ ++HTML_FILE_EXTENSION = .html ++ ++# The HTML_HEADER tag can be used to specify a personal HTML header for ++# each generated HTML page. If it is left blank doxygen will generate a ++# standard header. ++ ++HTML_HEADER = ++ ++# The HTML_FOOTER tag can be used to specify a personal HTML footer for ++# each generated HTML page. If it is left blank doxygen will generate a ++# standard footer. ++ ++HTML_FOOTER = doco_footer.html ++ ++# The HTML_STYLESHEET tag can be used to specify a user-defined cascading ++# style sheet that is used by each HTML page. It can be used to ++# fine-tune the look of the HTML output. If the tag is left blank doxygen ++# will generate a default style sheet. Note that doxygen will try to copy ++# the style sheet file to the HTML output directory, so don't put your own ++# stylesheet in the HTML output directory as well, or it will be erased! ++ ++HTML_STYLESHEET = ++ ++# If the HTML_ALIGN_MEMBERS tag is set to YES, the members of classes, ++# files or namespaces will be aligned in HTML using tables. If set to ++# NO a bullet list will be used. ++ ++HTML_ALIGN_MEMBERS = YES ++ ++# If the GENERATE_HTMLHELP tag is set to YES, additional index files ++# will be generated that can be used as input for tools like the ++# Microsoft HTML help workshop to generate a compressed HTML help file (.chm) ++# of the generated HTML documentation. ++ ++GENERATE_HTMLHELP = NO ++ ++# If the GENERATE_HTMLHELP tag is set to YES, the CHM_FILE tag can ++# be used to specify the file name of the resulting .chm file. You ++# can add a path in front of the file if the result should not be ++# written to the html output directory. ++ ++CHM_FILE = ++ ++# If the GENERATE_HTMLHELP tag is set to YES, the HHC_LOCATION tag can ++# be used to specify the location (absolute path including file name) of ++# the HTML help compiler (hhc.exe). If non-empty doxygen will try to run ++# the HTML help compiler on the generated index.hhp. ++ ++HHC_LOCATION = ++ ++# If the GENERATE_HTMLHELP tag is set to YES, the GENERATE_CHI flag ++# controls if a separate .chi index file is generated (YES) or that ++# it should be included in the master .chm file (NO). ++ ++GENERATE_CHI = NO ++ ++# If the GENERATE_HTMLHELP tag is set to YES, the BINARY_TOC flag ++# controls whether a binary table of contents is generated (YES) or a ++# normal table of contents (NO) in the .chm file. ++ ++BINARY_TOC = NO ++ ++# The TOC_EXPAND flag can be set to YES to add extra items for group members ++# to the contents of the HTML help documentation and to the tree view. ++ ++TOC_EXPAND = YES ++ ++# The DISABLE_INDEX tag can be used to turn on/off the condensed index at ++# top of each HTML page. The value NO (the default) enables the index and ++# the value YES disables it. ++ ++DISABLE_INDEX = YES ++ ++# This tag can be used to set the number of enum values (range [1..20]) ++# that doxygen will group on one line in the generated HTML documentation. ++ ++ENUM_VALUES_PER_LINE = 4 ++ ++# If the GENERATE_TREEVIEW tag is set to YES, a side panel will be ++# generated containing a tree-like index structure (just like the one that ++# is generated for HTML Help). For this to work a browser that supports ++# JavaScript, DHTML, CSS and frames is required (for instance Mozilla 1.0+, ++# Netscape 6.0+, Internet explorer 5.0+, or Konqueror). Windows users are ++# probably better off using the HTML help feature. ++ ++GENERATE_TREEVIEW = YES ++ ++# If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be ++# used to set the initial width (in pixels) of the frame in which the tree ++# is shown. ++ ++TREEVIEW_WIDTH = 250 ++ ++#--------------------------------------------------------------------------- ++# configuration options related to the LaTeX output ++#--------------------------------------------------------------------------- ++ ++# If the GENERATE_LATEX tag is set to YES (the default) Doxygen will ++# generate Latex output. ++ ++GENERATE_LATEX = NO ++ ++# The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put. ++# If a relative path is entered the value of OUTPUT_DIRECTORY will be ++# put in front of it. If left blank `latex' will be used as the default path. ++ ++LATEX_OUTPUT = latex ++ ++# The LATEX_CMD_NAME tag can be used to specify the LaTeX command name to be ++# invoked. If left blank `latex' will be used as the default command name. ++ ++LATEX_CMD_NAME = latex ++ ++# The MAKEINDEX_CMD_NAME tag can be used to specify the command name to ++# generate index for LaTeX. If left blank `makeindex' will be used as the ++# default command name. ++ ++MAKEINDEX_CMD_NAME = makeindex ++ ++# If the COMPACT_LATEX tag is set to YES Doxygen generates more compact ++# LaTeX documents. This may be useful for small projects and may help to ++# save some trees in general. ++ ++COMPACT_LATEX = NO ++ ++# The PAPER_TYPE tag can be used to set the paper type that is used ++# by the printer. Possible values are: a4, a4wide, letter, legal and ++# executive. If left blank a4wide will be used. ++ ++PAPER_TYPE = a4wide ++ ++# The EXTRA_PACKAGES tag can be to specify one or more names of LaTeX ++# packages that should be included in the LaTeX output. ++ ++EXTRA_PACKAGES = ++ ++# The LATEX_HEADER tag can be used to specify a personal LaTeX header for ++# the generated latex document. The header should contain everything until ++# the first chapter. If it is left blank doxygen will generate a ++# standard header. Notice: only use this tag if you know what you are doing! ++ ++LATEX_HEADER = ++ ++# If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated ++# is prepared for conversion to pdf (using ps2pdf). The pdf file will ++# contain links (just like the HTML output) instead of page references ++# This makes the output suitable for online browsing using a pdf viewer. ++ ++PDF_HYPERLINKS = NO ++ ++# If the USE_PDFLATEX tag is set to YES, pdflatex will be used instead of ++# plain latex in the generated Makefile. Set this option to YES to get a ++# higher quality PDF documentation. ++ ++USE_PDFLATEX = NO ++ ++# If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \\batchmode. ++# command to the generated LaTeX files. This will instruct LaTeX to keep ++# running if errors occur, instead of asking the user for help. ++# This option is also used when generating formulas in HTML. ++ ++LATEX_BATCHMODE = NO ++ ++# If LATEX_HIDE_INDICES is set to YES then doxygen will not ++# include the index chapters (such as File Index, Compound Index, etc.) ++# in the output. ++ ++LATEX_HIDE_INDICES = NO ++ ++#--------------------------------------------------------------------------- ++# configuration options related to the RTF output ++#--------------------------------------------------------------------------- ++ ++# If the GENERATE_RTF tag is set to YES Doxygen will generate RTF output ++# The RTF output is optimized for Word 97 and may not look very pretty with ++# other RTF readers or editors. ++ ++GENERATE_RTF = NO ++ ++# The RTF_OUTPUT tag is used to specify where the RTF docs will be put. ++# If a relative path is entered the value of OUTPUT_DIRECTORY will be ++# put in front of it. If left blank `rtf' will be used as the default path. ++ ++RTF_OUTPUT = rtf ++ ++# If the COMPACT_RTF tag is set to YES Doxygen generates more compact ++# RTF documents. This may be useful for small projects and may help to ++# save some trees in general. ++ ++COMPACT_RTF = NO ++ ++# If the RTF_HYPERLINKS tag is set to YES, the RTF that is generated ++# will contain hyperlink fields. The RTF file will ++# contain links (just like the HTML output) instead of page references. ++# This makes the output suitable for online browsing using WORD or other ++# programs which support those fields. ++# Note: wordpad (write) and others do not support links. ++ ++RTF_HYPERLINKS = NO ++ ++# Load stylesheet definitions from file. Syntax is similar to doxygen's ++# config file, i.e. a series of assignments. You only have to provide ++# replacements, missing definitions are set to their default value. ++ ++RTF_STYLESHEET_FILE = ++ ++# Set optional variables used in the generation of an rtf document. ++# Syntax is similar to doxygen's config file. ++ ++RTF_EXTENSIONS_FILE = ++ ++#--------------------------------------------------------------------------- ++# configuration options related to the man page output ++#--------------------------------------------------------------------------- ++ ++# If the GENERATE_MAN tag is set to YES (the default) Doxygen will ++# generate man pages ++ ++GENERATE_MAN = NO ++ ++# The MAN_OUTPUT tag is used to specify where the man pages will be put. ++# If a relative path is entered the value of OUTPUT_DIRECTORY will be ++# put in front of it. If left blank `man' will be used as the default path. ++ ++MAN_OUTPUT = man ++ ++# The MAN_EXTENSION tag determines the extension that is added to ++# the generated man pages (default is the subroutine's section .3) ++ ++MAN_EXTENSION = .3 ++ ++# If the MAN_LINKS tag is set to YES and Doxygen generates man output, ++# then it will generate one additional man file for each entity ++# documented in the real man page(s). These additional files ++# only source the real man page, but without them the man command ++# would be unable to find the correct page. The default is NO. ++ ++MAN_LINKS = NO ++ ++#--------------------------------------------------------------------------- ++# configuration options related to the XML output ++#--------------------------------------------------------------------------- ++ ++# If the GENERATE_XML tag is set to YES Doxygen will ++# generate an XML file that captures the structure of ++# the code including all documentation. ++ ++GENERATE_XML = NO ++ ++# The XML_OUTPUT tag is used to specify where the XML pages will be put. ++# If a relative path is entered the value of OUTPUT_DIRECTORY will be ++# put in front of it. If left blank `xml' will be used as the default path. ++ ++XML_OUTPUT = xml ++ ++# The XML_SCHEMA tag can be used to specify an XML schema, ++# which can be used by a validating XML parser to check the ++# syntax of the XML files. ++ ++XML_SCHEMA = ++ ++# The XML_DTD tag can be used to specify an XML DTD, ++# which can be used by a validating XML parser to check the ++# syntax of the XML files. ++ ++XML_DTD = ++ ++# If the XML_PROGRAMLISTING tag is set to YES Doxygen will ++# dump the program listings (including syntax highlighting ++# and cross-referencing information) to the XML output. Note that ++# enabling this will significantly increase the size of the XML output. ++ ++XML_PROGRAMLISTING = YES ++ ++#--------------------------------------------------------------------------- ++# configuration options for the AutoGen Definitions output ++#--------------------------------------------------------------------------- ++ ++# If the GENERATE_AUTOGEN_DEF tag is set to YES Doxygen will ++# generate an AutoGen Definitions (see autogen.sf.net) file ++# that captures the structure of the code including all ++# documentation. Note that this feature is still experimental ++# and incomplete at the moment. ++ ++GENERATE_AUTOGEN_DEF = NO ++ ++#--------------------------------------------------------------------------- ++# configuration options related to the Perl module output ++#--------------------------------------------------------------------------- ++ ++# If the GENERATE_PERLMOD tag is set to YES Doxygen will ++# generate a Perl module file that captures the structure of ++# the code including all documentation. Note that this ++# feature is still experimental and incomplete at the ++# moment. ++ ++GENERATE_PERLMOD = NO ++ ++# If the PERLMOD_LATEX tag is set to YES Doxygen will generate ++# the necessary Makefile rules, Perl scripts and LaTeX code to be able ++# to generate PDF and DVI output from the Perl module output. ++ ++PERLMOD_LATEX = NO ++ ++# If the PERLMOD_PRETTY tag is set to YES the Perl module output will be ++# nicely formatted so it can be parsed by a human reader. This is useful ++# if you want to understand what is going on. On the other hand, if this ++# tag is set to NO the size of the Perl module output will be much smaller ++# and Perl will parse it just the same. ++ ++PERLMOD_PRETTY = YES ++ ++# The names of the make variables in the generated doxyrules.make file ++# are prefixed with the string contained in PERLMOD_MAKEVAR_PREFIX. ++# This is useful so different doxyrules.make files included by the same ++# Makefile don't overwrite each other's variables. ++ ++PERLMOD_MAKEVAR_PREFIX = ++ ++#--------------------------------------------------------------------------- ++# Configuration options related to the preprocessor ++#--------------------------------------------------------------------------- ++ ++# If the ENABLE_PREPROCESSING tag is set to YES (the default) Doxygen will ++# evaluate all C-preprocessor directives found in the sources and include ++# files. ++ ++ENABLE_PREPROCESSING = YES ++ ++# If the MACRO_EXPANSION tag is set to YES Doxygen will expand all macro ++# names in the source code. If set to NO (the default) only conditional ++# compilation will be performed. Macro expansion can be done in a controlled ++# way by setting EXPAND_ONLY_PREDEF to YES. ++ ++MACRO_EXPANSION = YES ++ ++# If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES ++# then the macro expansion is limited to the macros specified with the ++# PREDEFINED and EXPAND_AS_DEFINED tags. ++ ++EXPAND_ONLY_PREDEF = YES ++ ++# If the SEARCH_INCLUDES tag is set to YES (the default) the includes files ++# in the INCLUDE_PATH (see below) will be search if a #include is found. ++ ++SEARCH_INCLUDES = YES ++ ++# The INCLUDE_PATH tag can be used to specify one or more directories that ++# contain include files that are not input files but should be processed by ++# the preprocessor. ++ ++INCLUDE_PATH = ++ ++# You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard ++# patterns (like *.h and *.hpp) to filter out the header-files in the ++# directories. If left blank, the patterns specified with FILE_PATTERNS will ++# be used. ++ ++INCLUDE_FILE_PATTERNS = ++ ++# The PREDEFINED tag can be used to specify one or more macro names that ++# are defined before the preprocessor is started (similar to the -D option of ++# gcc). The argument of the tag is a list of macros of the form: name ++# or name=definition (no spaces). If the definition and the = are ++# omitted =1 is assumed. To prevent a macro definition from being ++# undefined via #undef or recursively expanded use the := operator ++# instead of the = operator. ++ ++PREDEFINED = CONFIG_SSL_CERT_VERIFICATION CONFIG_SSL_ENABLE_CLIENT CONFIG_SSL_GENERATE_X509_CERT CONFIG_BIGINT_MONTGOMERY CONFIG_BIGINT_BARRETT CONFIG_BIGINT_CRT EXP_FUNC="" STDCALL="" ++ ++# If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then ++# this tag can be used to specify a list of macro names that should be expanded. ++# The macro definition that is found in the sources will be used. ++# Use the PREDEFINED tag if you want to use a different macro definition. ++ ++EXPAND_AS_DEFINED = ++ ++# If the SKIP_FUNCTION_MACROS tag is set to YES (the default) then ++# doxygen's preprocessor will remove all function-like macros that are alone ++# on a line, have an all uppercase name, and do not end with a semicolon. Such ++# function macros are typically used for boiler-plate code, and will confuse ++# the parser if not removed. ++ ++SKIP_FUNCTION_MACROS = YES ++ ++#--------------------------------------------------------------------------- ++# Configuration::additions related to external references ++#--------------------------------------------------------------------------- ++ ++# The TAGFILES option can be used to specify one or more tagfiles. ++# Optionally an initial location of the external documentation ++# can be added for each tagfile. The format of a tag file without ++# this location is as follows: ++# TAGFILES = file1 file2 ... ++# Adding location for the tag files is done as follows: ++# TAGFILES = file1=loc1 "file2 = loc2" ... ++# where "loc1" and "loc2" can be relative or absolute paths or ++# URLs. If a location is present for each tag, the installdox tool ++# does not have to be run to correct the links. ++# Note that each tag file must have a unique name ++# (where the name does NOT include the path) ++# If a tag file is not located in the directory in which doxygen ++# is run, you must also specify the path to the tagfile here. ++ ++TAGFILES = ++ ++# When a file name is specified after GENERATE_TAGFILE, doxygen will create ++# a tag file that is based on the input files it reads. ++ ++GENERATE_TAGFILE = ++ ++# If the ALLEXTERNALS tag is set to YES all external classes will be listed ++# in the class index. If set to NO only the inherited external classes ++# will be listed. ++ ++ALLEXTERNALS = NO ++ ++# If the EXTERNAL_GROUPS tag is set to YES all external groups will be listed ++# in the modules index. If set to NO, only the current project's groups will ++# be listed. ++ ++EXTERNAL_GROUPS = NO ++ ++# The PERL_PATH should be the absolute path and name of the perl script ++# interpreter (i.e. the result of `which perl'). ++ ++PERL_PATH = /usr/bin/perl ++ ++#--------------------------------------------------------------------------- ++# Configuration options related to the dot tool ++#--------------------------------------------------------------------------- ++ ++# If the CLASS_DIAGRAMS tag is set to YES (the default) Doxygen will ++# generate a inheritance diagram (in HTML, RTF and LaTeX) for classes with base ++# or super classes. Setting the tag to NO turns the diagrams off. Note that ++# this option is superseded by the HAVE_DOT option below. This is only a ++# fallback. It is recommended to install and use dot, since it yields more ++# powerful graphs. ++ ++CLASS_DIAGRAMS = YES ++ ++# If set to YES, the inheritance and collaboration graphs will hide ++# inheritance and usage relations if the target is undocumented ++# or is not a class. ++ ++HIDE_UNDOC_RELATIONS = YES ++ ++# If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is ++# available from the path. This tool is part of Graphviz, a graph visualization ++# toolkit from AT&T and Lucent Bell Labs. The other options in this section ++# have no effect if this option is set to NO (the default) ++ ++HAVE_DOT = NO ++ ++# If the CLASS_GRAPH and HAVE_DOT tags are set to YES then doxygen ++# will generate a graph for each documented class showing the direct and ++# indirect inheritance relations. Setting this tag to YES will force the ++# the CLASS_DIAGRAMS tag to NO. ++ ++CLASS_GRAPH = NO ++ ++# If the COLLABORATION_GRAPH and HAVE_DOT tags are set to YES then doxygen ++# will generate a graph for each documented class showing the direct and ++# indirect implementation dependencies (inheritance, containment, and ++# class references variables) of the class with other documented classes. ++ ++COLLABORATION_GRAPH = NO ++ ++# If the GROUP_GRAPHS and HAVE_DOT tags are set to YES then doxygen ++# will generate a graph for groups, showing the direct groups dependencies ++ ++GROUP_GRAPHS = NO ++ ++# If the UML_LOOK tag is set to YES doxygen will generate inheritance and ++# collaboration diagrams in a style similar to the OMG's Unified Modeling ++# Language. ++ ++UML_LOOK = NO ++ ++# If set to YES, the inheritance and collaboration graphs will show the ++# relations between templates and their instances. ++ ++TEMPLATE_RELATIONS = NO ++ ++# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDE_GRAPH, and HAVE_DOT ++# tags are set to YES then doxygen will generate a graph for each documented ++# file showing the direct and indirect include dependencies of the file with ++# other documented files. ++ ++INCLUDE_GRAPH = NO ++ ++# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDED_BY_GRAPH, and ++# HAVE_DOT tags are set to YES then doxygen will generate a graph for each ++# documented header file showing the documented files that directly or ++# indirectly include this file. ++ ++INCLUDED_BY_GRAPH = NO ++ ++# If the CALL_GRAPH and HAVE_DOT tags are set to YES then doxygen will ++# generate a call dependency graph for every global function or class method. ++# Note that enabling this option will significantly increase the time of a run. ++# So in most cases it will be better to enable call graphs for selected ++# functions only using the \callgraph command. ++ ++CALL_GRAPH = NO ++ ++# If the GRAPHICAL_HIERARCHY and HAVE_DOT tags are set to YES then doxygen ++# will graphical hierarchy of all classes instead of a textual one. ++ ++GRAPHICAL_HIERARCHY = NO ++ ++# If the DIRECTORY_GRAPH, SHOW_DIRECTORIES and HAVE_DOT tags are set to YES ++# then doxygen will show the dependencies a directory has on other directories ++# in a graphical way. The dependency relations are determined by the #include ++# relations between the files in the directories. ++ ++DIRECTORY_GRAPH = NO ++ ++# The DOT_IMAGE_FORMAT tag can be used to set the image format of the images ++# generated by dot. Possible values are png, jpg, or gif ++# If left blank png will be used. ++ ++DOT_IMAGE_FORMAT = png ++ ++# The tag DOT_PATH can be used to specify the path where the dot tool can be ++# found. If left blank, it is assumed the dot tool can be found in the path. ++ ++DOT_PATH = ++ ++# The DOTFILE_DIRS tag can be used to specify one or more directories that ++# contain dot files that are included in the documentation (see the ++# \dotfile command). ++ ++DOTFILE_DIRS = ++ ++# The MAX_DOT_GRAPH_WIDTH tag can be used to set the maximum allowed width ++# (in pixels) of the graphs generated by dot. If a graph becomes larger than ++# this value, doxygen will try to truncate the graph, so that it fits within ++# the specified constraint. Beware that most browsers cannot cope with very ++# large images. ++ ++MAX_DOT_GRAPH_WIDTH = 1024 ++ ++# The MAX_DOT_GRAPH_HEIGHT tag can be used to set the maximum allows height ++# (in pixels) of the graphs generated by dot. If a graph becomes larger than ++# this value, doxygen will try to truncate the graph, so that it fits within ++# the specified constraint. Beware that most browsers cannot cope with very ++# large images. ++ ++MAX_DOT_GRAPH_HEIGHT = 1024 ++ ++# The MAX_DOT_GRAPH_DEPTH tag can be used to set the maximum depth of the ++# graphs generated by dot. A depth value of 3 means that only nodes reachable ++# from the root by following a path via at most 3 edges will be shown. Nodes ++# that lay further from the root node will be omitted. Note that setting this ++# option to 1 or 2 may greatly reduce the computation time needed for large ++# code bases. Also note that a graph may be further truncated if the graph's ++# image dimensions are not sufficient to fit the graph (see MAX_DOT_GRAPH_WIDTH ++# and MAX_DOT_GRAPH_HEIGHT). If 0 is used for the depth value (the default), ++# the graph is not depth-constrained. ++ ++MAX_DOT_GRAPH_DEPTH = 0 ++ ++# Set the DOT_TRANSPARENT tag to YES to generate images with a transparent ++# background. This is disabled by default, which results in a white background. ++# Warning: Depending on the platform used, enabling this option may lead to ++# badly anti-aliased labels on the edges of a graph (i.e. they become hard to ++# read). ++ ++DOT_TRANSPARENT = NO ++ ++# Set the DOT_MULTI_TARGETS tag to YES allow dot to generate multiple output ++# files in one run (i.e. multiple -o and -T options on the command line). This ++# makes dot run faster, but since only newer versions of dot (>1.8.10) ++# support this, this feature is disabled by default. ++ ++DOT_MULTI_TARGETS = NO ++ ++# If the GENERATE_LEGEND tag is set to YES (the default) Doxygen will ++# generate a legend page explaining the meaning of the various boxes and ++# arrows in the dot generated graphs. ++ ++GENERATE_LEGEND = YES ++ ++# If the DOT_CLEANUP tag is set to YES (the default) Doxygen will ++# remove the intermediate dot files that are used to generate ++# the various graphs. ++ ++DOT_CLEANUP = YES ++ ++#--------------------------------------------------------------------------- ++# Configuration::additions related to the search engine ++#--------------------------------------------------------------------------- ++ ++# The SEARCHENGINE tag specifies whether or not a search engine should be ++# used. If set to NO the values of all tags below this one will be ignored. ++ ++SEARCHENGINE = NO +diff --git a/feeds/luci/libs/luci-lib-nixio/axTLS/docsrc/doco_footer.html b/feeds/luci/libs/luci-lib-nixio/axTLS/docsrc/doco_footer.html +new file mode 100644 +index 0000000..20c4e70 +--- /dev/null ++++ b/feeds/luci/libs/luci-lib-nixio/axTLS/docsrc/doco_footer.html +@@ -0,0 +1,3 @@ ++

    ++

    ++Copyright © 2007 Cameron Rich +diff --git a/feeds/luci/libs/luci-lib-nixio/axTLS/docsrc/images/axolotl.jpg b/feeds/luci/libs/luci-lib-nixio/axTLS/docsrc/images/axolotl.jpg +new file mode 100644 +index 0000000000000000000000000000000000000000..7352bbae836739e469c837a7fdb8114f786b2130 +GIT binary patch +literal 3041 +zcmbW3cTm%58pnSjB!MU;N>O@=NRbjk3lRun2%sWhXhPVfgr;7!<++gTdge +zEO0g+cDA!;+4#?Maq@@=h=~dd2n&fzqGiM-6eNU%uV~0BD63%9F=8@WI+|)aXf=!~ +zh!qZJJHy7u&d#Tb6h^B4&pP=4$^`%r1oVf1e+t9|W`;mvEUfS|AOQSlc6$Gr{!7RS +zFoD2eCT1`M!pwZyCiFA|m=Tb3q9|?Xd1G6cm=~8~c;X8d@oSYW+$MvYNVJ`I1S_0} +z_rgWKOA?nQrKFXVRaDh5>N?l)x&%FagF8f1Gjj{eyY>!bM<-_&S07)$2mS$pL6K3> +zF+V^0g_4wS4OIyEF{{j8qF-QDg(0?)ig?!QsAXoq*;06Yr(j!1% +z1n6WEI12`yKEMb-3)nvbB!TBlVeo%1%vVZSkpMPR1+2MGqWR7gFczIJUnDw#SKbKt +z35Mb&hWO0KGyJeTHI!NRIcFpiNog)_MsCx>3cuve& +zY8_v>&G~*t+o4e7x?2ZhL>0|&)UBM;us1U2y+hqnr1zl8MlP&TeKtmuu@xzyFTbtD +z5^IB{EM;G3EEpmmqXCXWW)tsNQi5e`*4;)8rcd85vLma>Z~`hhbuC-<;K-!GCL)Jh +zEBdKs`V}XSz67XOgOjI5xZvM}`wGkrmbP7O4@qf@mW70RxAxL?nSpqg6F{rH(V+zU +zM9oUqH*GSU1=8P5FsH)k%e%`v%Opgmb1$`hxlFVsx*(Gne`&s60CX^#buRD(cy!fq +z?6)oX!6DzotoaO!ym?jfI*Z`9ATNt<^MRGTpBejEn0uX3a@0k?UfR=k;!}#J8a-_l +zYnQAqQ#}w7Wjgvx=tA&otci52@7iF4ZCmTl>vRq6omFR>h`1mj@&@FdKc8HKED|SM +zMlufH?L)6>f8(HW^EzHJ67AiY3`3|uBIluZaA@EwfvIt-w0T`>aDlYNwO}bt8u5jd?o?J5z}+0Ypf^v>Umdw)Bp7T;JrUnMvzb +zZOxlA>YX1AXRzSoc6;S+PfG*!b-#Bl4mf(`WIk3P$!y@`mh#*FWASuji|hQ)P;;gW +zG2T;z@(}-{Z7ZsN>A9r3jsTJsG4rcg>g4S#r;PZ;G_CH;QGx>_55i?%RwguO_13z+ +zW_|k@&LP~Rb$2XP)hDyznX0_qa8N;BwM;!XL9;zrDz-^9hOzR%4DZcR)Nugs`?NJ) +z`ek5Vqo8}i-7O6lL>Zu8*3W(XI7x>4GpJ9JEdf0oLb&Guzvkar$Q+6#c3DYor~H^)#;IDGE?``QB?^dO#pSy8^8!k*Ga`&_)QNa +zd`O!9nKGw)*tOuPfQqDD*w|RUMN81N+nj!%%TIzR%cOi&$>-ANhu*)g4IW^RJZ9t? +zdyO*sxmQQBAD$mtqqMtL0=c65+TcSo6Q?I{$zT1|X3m;j?Y+;&qbDFRb2ReXjbyv5 +z=Evx0in1l^6>c2+ZR?|C(~C;&ZtTDTMydE?%q+56E~IgSyp&3zw^6TUVk6j)frH~&EfNuGP*;$ +zePNy!P@BM|KyH1D?Ls+6J8Ng-er#uAZZxR`Xzp*)D9u^#AiCC;TK^J)_TXojbr~7r +zzJ53XaB6v0adVg4SjZJMkqk01C3f9|c6g^!bJSy?wUNeDGJ8W0tp0rFd>HTL&#=W? +zg2Sba=GQu6X735!iW;+VyyLo^WL5W#WAS=UX7Z!V%=d)nIspX=waeB?NroL_;V&T6 +zt!D-?8x@E5ttq#9vJ+afZK9NI6E54I04sS`(->d16F~S|nFhN|DTc&{2}^ceoc}R! +zuLb-pXgyDMkQiusJ5=Z)OJi;LaZeo?Z|Z1f->*4R>XawF8Fgq<>7-Xt6JfiTasm*H +zwELMiamTvad2>z@@;r>b2-zDqtH~;6deu_QT9?9i_g08WSI49@db4D8jO*gE*Qo)0 +zF3EPW@7pYaXKSv`#odI#O&OD2ggeKJWdn_LsHS22g5=g22W-yDJod-*G7Q)e(2 +zuS{1eSM5I_kT5M+#i1ol@%o{rNd{MJ+0I$Rxu)7>qtCv2zfIZBtvPz4P6x>kkJk8B +z-J&JXuVb`d*wGA<;3B+TOS--izD3pYJMiZFzd|?)a!ZP%3gtkIATQPdUnp= +ztj%21s>#ysY|6z=NnA!V084S|9F2h0Uy@tw0pjfVJlx*VQb)aQ} +zUQ3)CSFf=1IRJ_s$hqkb59mKI_4&c>Zsqi(i^3F+Q{Lc(5P7cD +z^3w1Wivc4HCGht^u~tb6^&>m$qLxjV&m9NTPn}CUx1m#ktVOOhiD&L_^577Szxwac +zw~JGr$g)>$5UXkj%QbuaJ;X{^0ui$nMi_gG{ijvO44YZFF;e-rh?P*gO4< +zKVe(17IiCQB=Qkgm4nhcD;idd*ge(qQn}3$(n$;_d$y4#R^AfOs=3x^;Y8w^rT36? +zDm)H9yeKmt7WNZN=WM0;7?)L70FDjXJOIvGbtc}M5qZ0C-AL5W|Tn>-g(X{+`5+quqaA0 +zeJe;yqcG7a!21E+l^7#uuzDzTD1?DJG=lJKre?z_0YgBWum)r&vMBn1K~d@wkSz!lB1iz2C}aQ?8-W%|T>|6kzOH~{(BAYt}7wXaX0*FwLb>5w{=e+0tZ_b>1=H7ho@Av)uz9*rA +zki|tMdU<)FD9Y#aMIsS~VQFb;GMP-NRN^>ZQ&ZE_)I<=3R;wKx +z92^=N8XX2xGX;!ujB1Qfv)!w6Uc01N;e00ICKz9>p!7>VN~L69gQP(Wf(iQ@1B +z$4Cs|a0{!zpD=iWk_1lTfWT24ZV8OQ;R+7{uJ1(XI}z|)-wA`)p_l+9315^XG3bb- +zIsu#jupdsK7!;5gP67_(yLBZA3%g7j%b6cVOK +zLaC|4h$tl3Qg2T0o{ESTB5HPU-jJM16tv +zA{FDFEOC{rAdb$PesyU<-@(sjE;ewyyd~7o!eAs$syx?qz{uCoJ=#%5s|mPb=p}PZ +zyWNd!#(IB}@}pEn{)Hcnnw=Bt_N9n&xdN+-Qu5`2l&>+GwePMT06Oqw=Cvey~$$G0jZ0PaAI}@>3=; +zV=z(L7N^4g+yzdIwL-T0_a)yjoCa3YS>n)Wx}CLSq97Q#ypF-?kjrQxN8)7xx7jp>=FigX2R2k9M +zUcz#tM@E&Gw>3VGrq|{LX*5i?GrBetzt_5UcBtoAhk5+gu}*I4nXzAOb6$^Kcii{E +zJC75|N3Oc9lzK5Z(YiOs%)-1h1Usy?kzihr`1i5gD4-!`-0?imFfUsgP`uP?en7G5 +z;K3|yuuzQN37gpQvTMaeM0Verfr|5eu5PxIbo1=9nRi8gt&R7?gc*~)V$$=%!1AZ} +z>$~EUGaBz>rDSBvfTX=e*S*x?c1}-_Lq+c6#Cdg#2x+@X_B}~`i!UJ=R=g!#A8z&S +z_nF$UkkQ;_mo-!nZ=XH7ChP3Nu46y%n(SpcJjoq0NwfR9>+HN;c?|wM+lhPT73Rr7 +zOJ<48A_R(OV#zg)d4*V&P&K%c_U+u?CAhbmPuJ!=lcYuqo`NC{(E-ZZ{j*EK3D#zQ +z^0DnN?yjNv%8oD!LU{QN0uP}oXdKwbs1rx-79BP{RgbWLN{_0&acNi$s(H_szfJGL +zEPKwBJS*}dhfT^u0+k-P+>f3staI*MQ7m!;0)<>|+Ez9Lq|%!5WnVI5t*5^#6dtcV +z!6*BDI1zo7u|nhiN}J)itfsK|k;6raC5K%IH9LIq`&n!FrZNNp;W3S@53Mhi`$k_O +zTid=XsOg-;34Ff5_$G&LD)q3r80zbtV2p83nO}?)BuuO{4xXiw9k!J$Ta-df82Y%` +z{!vrFZ0enTZhV=MuOscfvxy`(Mfs|jy=(dYl-*%RlvAD8!G~l)I!~zz6c!_lc8kL1 +zam#8?sf&vT?-uKR-Cp%xwB!mAuzAFM?+!QTaz%>M?$!8oEEW*WVP@)5o%6$tL+1pV +zUftws=D+B?d+E6Ra=0@Bbl>@{OVDoHHc@`^k=ydpd?(4=l*Z(Z=qfu8K0ZE0*4|Qv +zCoKG?x`3N$wa8mco54A_#k0Ng(xc2EgL0yDm{(md|J~{5=91O#e69<&-3jQ>$m>{I +zPMo&CQZU^J&soR+>?6?ZlrZM-1J~ +zF36HS{Vk>b>|E=*KnwE<(@9}=1;}xg3d-$yl?IHbJ3v6k@OgOyd=wlw +zm3HV0D>N}|x@@XtG_pQ#;MS9O%~Mx(hw68{T=n$*gQ;JpZ`bddy7lzq`>AVSR)cIt +p#1L)vbSpEep}>k5GW>j6!!Byr>lX1FD`~oo+ucz3cs3h+{vVmAG${Z8 + +literal 0 +HcmV?d00001 + +diff --git a/feeds/luci/libs/luci-lib-nixio/axTLS/httpd/Config.in b/feeds/luci/libs/luci-lib-nixio/axTLS/httpd/Config.in +new file mode 100644 +index 0000000..513d57a +--- /dev/null ++++ b/feeds/luci/libs/luci-lib-nixio/axTLS/httpd/Config.in +@@ -0,0 +1,163 @@ ++# ++# For a description of the syntax of this configuration file, ++# see scripts/config/Kconfig-language.txt ++# ++ ++menu "Axhttpd Configuration" ++depends on CONFIG_AXHTTPD ++ ++config CONFIG_HTTP_STATIC_BUILD ++ bool "Static Build" ++ default n ++ help ++ Select y if you want axhttpd to be a static build (i.e. don't use the ++ axtls shared library or dll). ++ ++config CONFIG_HTTP_PORT ++ int "HTTP port" ++ default 80 ++ help ++ The port number of the normal HTTP server. ++ ++ You must be a root user in order to use the default port. ++ ++config CONFIG_HTTP_HTTPS_PORT ++ int "HTTPS port" ++ default 443 ++ help ++ The port number of the HTTPS server. ++ ++ You must be a root user in order to use the default port. ++ ++config CONFIG_HTTP_SESSION_CACHE_SIZE ++ int "SSL session cache size" ++ default 5 ++ help ++ The size of the SSL session cache. ++ ++ This is not actually related to the number of concurrent users, but ++ for optimum performance they should be the same (with a penalty ++ in memory usage). ++ ++config CONFIG_HTTP_WEBROOT ++ string "Web root location" ++ default "../www" if !CONFIG_PLATFORM_WIN32 ++ default "..\\www" if CONFIG_PLATFORM_WIN32 ++ help ++ The location of the web root in relation to axhttpd. This is ++ the directory where index.html lives. ++ ++config CONFIG_HTTP_TIMEOUT ++ int "Timeout" ++ default 300 ++ help ++ Set the timeout of a connection in seconds. ++ ++menu "CGI" ++depends on !CONFIG_PLATFORM_WIN32 ++ ++config CONFIG_HTTP_HAS_CGI ++ bool "Enable CGI" ++ default y ++ depends on !CONFIG_PLATFORM_WIN32 ++ help ++ Enable the CGI capability. Not available on Win32 platforms. ++ ++config CONFIG_HTTP_CGI_EXTENSIONS ++ string "CGI File Extension(s)" ++ default ".lua,.lp" ++ depends on CONFIG_HTTP_HAS_CGI ++ help ++ Tell axhhtpd what file extension(s) are used for CGI. ++ ++ This is a comma separated list - e.g. ".php,.pl" etc ++ ++config CONFIG_HTTP_ENABLE_LUA ++ bool "Enable Lua" ++ default y ++ depends on CONFIG_HTTP_HAS_CGI ++ help ++ Lua is a powerful, fast, light-weight, embeddable scripting language. ++ ++ See http://www.lua.org for details. ++ ++config CONFIG_HTTP_LUA_PREFIX ++ string "Lua's Installation Prefix" ++ default "/usr/local" ++ depends on CONFIG_HTTP_ENABLE_LUA ++ ++ help ++ The location of Lua's installation prefix. This is also necessary for ++ Lua's cgi launcher application. ++ ++config CONFIG_HTTP_LUA_CGI_LAUNCHER ++ string "CGI launcher location" ++ default "/bin/cgi.exe" if CONFIG_PLATFORM_CYGWIN ++ default "/bin/cgi" if !CONFIG_PLATFORM_CYGWIN ++ depends on CONFIG_HTTP_ENABLE_LUA ++ help ++ The location of LUA's CGI launcher application (after ++ the CONFIG_HTTP_LUA_PREFIX) ++ ++config CONFIG_HTTP_BUILD_LUA ++ bool "Build Lua" ++ default n ++ depends on CONFIG_HTTP_ENABLE_LUA ++ help ++ Build Lua and install in /usr/local/bin ++ ++endmenu ++ ++config CONFIG_HTTP_DIRECTORIES ++ bool "Enable Directory Listing" ++ default y ++ help ++ Enable directory listing. ++ ++config CONFIG_HTTP_HAS_AUTHORIZATION ++ bool "Enable authorization" ++ default y ++ help ++ Pages/directories can have passwords associated with them. ++ ++config CONFIG_HTTP_HAS_IPV6 ++ bool "Enable IPv6" ++ default n ++ depends on !CONFIG_PLATFORM_WIN32 ++ help ++ Use IPv6 instead of IPv4. ++ ++ Does not work under Win32 ++ ++config CONFIG_HTTP_ENABLE_DIFFERENT_USER ++ bool "Enable different user" ++ default n ++ depends on !CONFIG_PLATFORM_WIN32 ++ help ++ Allow the web server to be run as a different user ++ ++config CONFIG_HTTP_USER ++ string "As User" ++ default "nobody" ++ depends on CONFIG_HTTP_ENABLE_DIFFERENT_USER ++ help ++ The user name that will be used to run axhttpd. ++ ++config CONFIG_HTTP_VERBOSE ++ bool "Verbose Mode" ++ default y if CONFIG_SSL_FULL_MODE ++ default n if !CONFIG_SSL_FULL_MODE ++ help ++ Enable extra statements used when using axhttpd. ++ ++config CONFIG_HTTP_IS_DAEMON ++ bool "Run as a daemon" ++ default n ++ depends on !CONFIG_PLATFORM_WIN32 ++ help ++ Run axhttpd as a background process. ++ ++ Does not work under Win32 ++ ++endmenu ++ +diff --git a/feeds/luci/libs/luci-lib-nixio/axTLS/httpd/Makefile b/feeds/luci/libs/luci-lib-nixio/axTLS/httpd/Makefile +new file mode 100644 +index 0000000..b8c18d2 +--- /dev/null ++++ b/feeds/luci/libs/luci-lib-nixio/axTLS/httpd/Makefile +@@ -0,0 +1,127 @@ ++# ++# Copyright (c) 2007, Cameron Rich ++# ++# All rights reserved. ++# ++# Redistribution and use in source and binary forms, with or without ++# modification, are permitted provided that the following conditions are met: ++# ++# * Redistributions of source code must retain the above copyright notice, ++# this list of conditions and the following disclaimer. ++# * 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. ++# * Neither the name of the axTLS project nor the names of its ++# contributors may be used to endorse or promote products derived ++# from this software without specific prior written permission. ++# ++# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ++# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT ++# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR ++# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR ++# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, ++# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED ++# TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, ++# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY ++# OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING ++# NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF ++# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ++# ++ ++all : web_server lua ++ ++AXTLS_HOME=.. ++ ++include $(AXTLS_HOME)/config/.config ++include $(AXTLS_HOME)/config/makefile.conf ++ ++ifndef CONFIG_PLATFORM_WIN32 ++ ++ifdef CONFIG_PLATFORM_CYGWIN ++TARGET=$(AXTLS_HOME)/$(STAGE)/axhttpd.exe ++TARGET2=$(AXTLS_HOME)/$(STAGE)/htpasswd.exe ++else ++TARGET=$(AXTLS_HOME)/$(STAGE)/axhttpd ++TARGET2=$(AXTLS_HOME)/$(STAGE)/htpasswd ++endif ++ ++ifdef CONFIG_HTTP_STATIC_BUILD ++LIBS=$(AXTLS_HOME)/$(STAGE)/libaxtls.a ++else ++LIBS=-L$(AXTLS_HOME)/$(STAGE) -laxtls ++endif ++ ++ifdef CONFIG_HTTP_BUILD_LUA ++lua: kepler-1.1 ++ ++kepler-1.1: ++ @tar xvfz kepler-1.1-snapshot-20070521-1825.tar.gz ++ @cat kepler.patch | patch -p0 ++ cd kepler-1.1; ./configure --prefix=$(CONFIG_HTTP_LUA_PREFIX) --launcher=cgi --lua-suffix= ; make install ++else ++lua: ++endif ++ ++else # win32 build ++lua: ++ ++TARGET=$(AXTLS_HOME)/$(STAGE)/axhttpd.exe ++TARGET2=$(AXTLS_HOME)/$(STAGE)/htpasswd.exe ++ ++ifdef CONFIG_HTTP_STATIC_BUILD ++LIBS=$(AXTLS_HOME)/$(STAGE)/axtls.static.lib $(AXTLS_HOME)\\config\\axtls.res ++else ++LIBS=$(AXTLS_HOME)/$(STAGE)/axtls.lib $(AXTLS_HOME)\\config\\axtls.res ++endif ++endif ++ ++ifndef CONFIG_AXHTTPD ++web_server: ++else ++ ++web_server :: $(TARGET) ++ ++ifdef CONFIG_HTTP_HAS_AUTHORIZATION ++web_server :: $(TARGET2) ++endif ++ ++OBJ= \ ++ axhttpd.o \ ++ proc.o \ ++ tdate_parse.o ++ ++include $(AXTLS_HOME)/config/makefile.post ++ ++ifndef CONFIG_PLATFORM_WIN32 ++ ++$(TARGET): $(OBJ) $(AXTLS_HOME)/$(STAGE)/libaxtls.a ++ $(LD) $(LDFLAGS) -o $@ $(OBJ) $(LIBS) ++ifdef CONFIG_STRIP_UNWANTED_SECTIONS ++ $(STRIP) --remove-section=.comment $(TARGET) ++endif ++ ++$(TARGET2): htpasswd.o $(AXTLS_HOME)/$(STAGE)/libaxtls.a ++ $(LD) $(LDFLAGS) -o $@ htpasswd.o $(LIBS) ++ ++else # Win32 ++ ++OBJ:=$(OBJ:.o=.obj) ++%.obj : %.c ++ $(CC) $(CFLAGS) $< ++ ++htpasswd.obj : htpasswd.c ++ $(CC) $(CFLAGS) $? ++ ++$(TARGET): $(OBJ) ++ $(LD) $(LDFLAGS) /out:$@ $(LIBS) $? ++ ++$(TARGET2): htpasswd.obj ++ $(LD) $(LDFLAGS) /out:$@ $(LIBS) $? ++endif ++ ++endif # CONFIG_AXHTTPD ++ ++clean:: ++ -@rm -f $(TARGET)* ++ -@rm -fr kepler-1.1 ++ +diff --git a/feeds/luci/libs/luci-lib-nixio/axTLS/httpd/axhttp.h b/feeds/luci/libs/luci-lib-nixio/axTLS/httpd/axhttp.h +new file mode 100644 +index 0000000..73c299f +--- /dev/null ++++ b/feeds/luci/libs/luci-lib-nixio/axTLS/httpd/axhttp.h +@@ -0,0 +1,154 @@ ++/* ++ * Copyright (c) 2007, Cameron Rich ++ * ++ * All rights reserved. ++ * ++ * Redistribution and use in source and binary forms, with or without ++ * modification, are permitted provided that the following conditions are met: ++ * ++ * * Redistributions of source code must retain the above copyright notice, ++ * this list of conditions and the following disclaimer. ++ * * 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. ++ * * Neither the name of the axTLS project nor the names of its contributors ++ * may be used to endorse or promote products derived from this software ++ * without specific prior written permission. ++ * ++ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ++ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT ++ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR ++ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR ++ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, ++ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, ++ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR ++ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF ++ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING ++ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS ++ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ++ */ ++ ++#include "ssl.h" ++ ++#define BACKLOG 15 ++#define VERSION "1.0.0" ++#ifdef CONFIG_HTTP_HAS_IPV6 ++#define HAVE_IPV6 ++#endif ++ ++#define MAXPOSTDATASIZE 30000 ++#define MAXREQUESTLENGTH 256 ++#define BLOCKSIZE 4096 ++ ++#define INITIAL_CONNECTION_SLOTS 10 ++#define CONFIG_HTTP_DEFAULT_SSL_OPTIONS SSL_DISPLAY_CERTS ++ ++#define STATE_WANT_TO_READ_HEAD 1 ++#define STATE_WANT_TO_SEND_HEAD 2 ++#define STATE_WANT_TO_READ_FILE 3 ++#define STATE_WANT_TO_SEND_FILE 4 ++#define STATE_DOING_DIR 5 ++ ++enum ++{ ++ TYPE_GET, ++ TYPE_HEAD, ++ TYPE_POST ++}; ++ ++struct connstruct ++{ ++ struct connstruct *next; ++ int state; ++ int reqtype; ++ int networkdesc; ++ int filedesc; ++ SSL *ssl; ++ ++#if defined(CONFIG_HTTP_DIRECTORIES) ++#ifdef WIN32 ++ HANDLE dirp; ++ WIN32_FIND_DATA file_data; ++#else ++ DIR *dirp; ++#endif ++#endif ++ ++ time_t timeout; ++ char actualfile[MAXREQUESTLENGTH]; ++ char filereq[MAXREQUESTLENGTH]; ++ char dirname[MAXREQUESTLENGTH]; ++ char server_name[MAXREQUESTLENGTH]; ++ int numbytes; ++ char databuf[BLOCKSIZE]; ++ uint8_t is_ssl; ++ uint8_t close_when_done; ++ time_t if_modified_since; ++ ++#if defined(CONFIG_HTTP_HAS_CGI) ++ uint8_t is_cgi; ++#ifdef CONFIG_HTTP_ENABLE_LUA ++ uint8_t is_lua; ++#endif ++ int content_length; ++ char remote_addr[MAXREQUESTLENGTH]; ++ char uri_request[MAXREQUESTLENGTH]; ++ char uri_path_info[MAXREQUESTLENGTH]; ++ char uri_query[MAXREQUESTLENGTH]; ++ char cookie[MAXREQUESTLENGTH]; ++#endif ++#if defined(CONFIG_HTTP_HAS_AUTHORIZATION) ++ char authorization[MAXREQUESTLENGTH]; ++#endif ++ int post_read; ++ int post_state; ++ char *post_data; ++}; ++ ++struct serverstruct ++{ ++ struct serverstruct *next; ++ int sd; ++ int is_ssl; ++ SSL_CTX *ssl_ctx; ++}; ++ ++#if defined(CONFIG_HTTP_HAS_CGI) ++struct cgiextstruct ++{ ++ struct cgiextstruct *next; ++ char *ext; ++}; ++#endif ++ ++/* global prototypes */ ++extern struct serverstruct *servers; ++extern struct connstruct *usedconns; ++extern struct connstruct *freeconns; ++extern const char * const server_version; ++ ++#if defined(CONFIG_HTTP_HAS_CGI) ++extern struct cgiextstruct *cgiexts; ++#endif ++ ++/* conn.c prototypes */ ++void removeconnection(struct connstruct *cn); ++ ++/* proc.c prototypes */ ++void procdodir(struct connstruct *cn); ++void procreadhead(struct connstruct *cn); ++void procsendhead(struct connstruct *cn); ++void procreadfile(struct connstruct *cn); ++void procsendfile(struct connstruct *cn); ++#if defined(CONFIG_HTTP_HAS_CGI) ++void read_post_data(struct connstruct *cn); ++#endif ++ ++/* misc.c prototypes */ ++char *my_strncpy(char *dest, const char *src, size_t n); ++int isdir(const char *name); ++ ++/* tdate prototypes */ ++void tdate_init(void); ++time_t tdate_parse(const char* str); ++ +diff --git a/feeds/luci/libs/luci-lib-nixio/axTLS/httpd/axhttpd.c b/feeds/luci/libs/luci-lib-nixio/axTLS/httpd/axhttpd.c +new file mode 100644 +index 0000000..35d36f6 +--- /dev/null ++++ b/feeds/luci/libs/luci-lib-nixio/axTLS/httpd/axhttpd.c +@@ -0,0 +1,604 @@ ++/* ++ * Copyright (c) 2007, Cameron Rich ++ * ++ * All rights reserved. ++ * ++ * Redistribution and use in source and binary forms, with or without ++ * modification, are permitted provided that the following conditions are met: ++ * ++ * * Redistributions of source code must retain the above copyright notice, ++ * this list of conditions and the following disclaimer. ++ * * 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. ++ * * Neither the name of the axTLS project nor the names of its contributors ++ * may be used to endorse or promote products derived from this software ++ * without specific prior written permission. ++ * ++ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ++ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT ++ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR ++ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR ++ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, ++ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, ++ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR ++ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF ++ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING ++ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS ++ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ++ */ ++ ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include "axhttp.h" ++ ++struct serverstruct *servers; ++struct connstruct *usedconns; ++struct connstruct *freeconns; ++const char * const server_version = "axhttpd/"AXTLS_VERSION; ++ ++static void addtoservers(int sd); ++static int openlistener(int port); ++static void handlenewconnection(int listenfd, int is_ssl); ++static void addconnection(int sd, char *ip, int is_ssl); ++static void ax_chdir(void); ++ ++#if defined(CONFIG_HTTP_HAS_CGI) ++struct cgiextstruct *cgiexts; ++static void addcgiext(const char *tp); ++ ++#if !defined(WIN32) ++static void reaper(int sigtype) ++{ ++ wait3(NULL, WNOHANG, NULL); ++} ++#endif ++#endif ++ ++#ifdef CONFIG_HTTP_VERBOSE /* should really be in debug mode or something */ ++/* clean up memory for valgrind */ ++static void sigint_cleanup(int sig) ++{ ++ struct serverstruct *sp; ++ struct connstruct *tp; ++ ++ while (servers != NULL) ++ { ++ if (servers->is_ssl) ++ ssl_ctx_free(servers->ssl_ctx); ++ ++ sp = servers->next; ++ free(servers); ++ servers = sp; ++ } ++ ++ while (freeconns != NULL) ++ { ++ tp = freeconns->next; ++ free(freeconns); ++ freeconns = tp; ++ } ++ ++ while (usedconns != NULL) ++ { ++ tp = usedconns->next; ++ free(usedconns); ++ usedconns = tp; ++ } ++ ++#if defined(CONFIG_HTTP_HAS_CGI) ++ while (cgiexts) ++ { ++ struct cgiextstruct *cp = cgiexts->next; ++ if (cp == NULL) /* last entry */ ++ free(cgiexts->ext); ++ free(cgiexts); ++ cgiexts = cp; ++ } ++#endif ++ ++ exit(0); ++} ++ ++static void die(int sigtype) ++{ ++ exit(0); ++} ++#endif ++ ++int main(int argc, char *argv[]) ++{ ++ fd_set rfds, wfds; ++ struct connstruct *tp, *to; ++ struct serverstruct *sp; ++ int rnum, wnum, active; ++ int i; ++ time_t currtime; ++ ++#ifdef WIN32 ++ WORD wVersionRequested = MAKEWORD(2, 2); ++ WSADATA wsaData; ++ WSAStartup(wVersionRequested,&wsaData); ++#else ++ signal(SIGPIPE, SIG_IGN); ++#if defined(CONFIG_HTTP_HAS_CGI) ++ signal(SIGCHLD, reaper); ++#endif ++#ifdef CONFIG_HTTP_VERBOSE ++ signal(SIGQUIT, die); ++#endif ++#endif ++ ++#ifdef CONFIG_HTTP_VERBOSE ++ signal(SIGTERM, die); ++ signal(SIGINT, sigint_cleanup); ++#endif ++ tdate_init(); ++ ++ for (i = 0; i < INITIAL_CONNECTION_SLOTS; i++) ++ { ++ tp = freeconns; ++ freeconns = (struct connstruct *)calloc(1, sizeof(struct connstruct)); ++ freeconns->next = tp; ++ } ++ ++ if ((active = openlistener(CONFIG_HTTP_PORT)) == -1) ++ { ++#ifdef CONFIG_HTTP_VERBOSE ++ fprintf(stderr, "ERR: Couldn't bind to port %d\n", ++ CONFIG_HTTP_PORT); ++#endif ++ exit(1); ++ } ++ ++ addtoservers(active); ++ ++ if ((active = openlistener(CONFIG_HTTP_HTTPS_PORT)) == -1) ++ { ++#ifdef CONFIG_HTTP_VERBOSE ++ fprintf(stderr, "ERR: Couldn't bind to port %d\n", ++ CONFIG_HTTP_HTTPS_PORT); ++#endif ++ exit(1); ++ } ++ ++ addtoservers(active); ++ servers->ssl_ctx = ssl_ctx_new(CONFIG_HTTP_DEFAULT_SSL_OPTIONS, ++ CONFIG_HTTP_SESSION_CACHE_SIZE); ++ servers->is_ssl = 1; ++ ++#if defined(CONFIG_HTTP_HAS_CGI) ++ addcgiext(CONFIG_HTTP_CGI_EXTENSIONS); ++#endif ++ ++#if defined(CONFIG_HTTP_VERBOSE) ++#if defined(CONFIG_HTTP_HAS_CGI) ++ printf("addcgiext %s\n", CONFIG_HTTP_CGI_EXTENSIONS); ++#endif ++ printf("%s: listening on ports %d (http) and %d (https)\n", ++ server_version, CONFIG_HTTP_PORT, CONFIG_HTTP_HTTPS_PORT); ++ TTY_FLUSH(); ++#endif ++ ++ ax_chdir(); ++ ++#ifdef CONFIG_HTTP_ENABLE_DIFFERENT_USER ++ { ++ struct passwd *pd = getpwnam(CONFIG_HTTP_USER); ++ ++ if (pd != NULL) ++ { ++ int res = setuid(pd->pw_uid); ++ res |= setgid(pd->pw_gid); ++ ++#if defined(CONFIG_HTTP_VERBOSE) ++ if (res == 0) ++ { ++ printf("change to '%s' successful\n", CONFIG_HTTP_USER); ++ TTY_FLUSH(); ++ } ++#endif ++ } ++ ++ } ++#endif ++ ++ ++#ifndef WIN32 ++#ifdef CONFIG_HTTP_IS_DAEMON ++ if (fork() > 0) /* parent will die */ ++ exit(0); ++ ++ setsid(); ++#endif ++#endif ++ ++ /* main loop */ ++ while (1) ++ { ++ FD_ZERO(&rfds); ++ FD_ZERO(&wfds); ++ rnum = wnum = -1; ++ sp = servers; ++ ++ while (sp != NULL) /* read each server port */ ++ { ++ FD_SET(sp->sd, &rfds); ++ ++ if (sp->sd > rnum) ++ rnum = sp->sd; ++ sp = sp->next; ++ } ++ ++ /* Add the established sockets */ ++ tp = usedconns; ++ currtime = time(NULL); ++ ++ while (tp != NULL) ++ { ++ if (currtime > tp->timeout) /* timed out? Kill it. */ ++ { ++ to = tp; ++ tp = tp->next; ++ removeconnection(to); ++ continue; ++ } ++ ++ if (tp->state == STATE_WANT_TO_READ_HEAD) ++ { ++ FD_SET(tp->networkdesc, &rfds); ++ if (tp->networkdesc > rnum) ++ rnum = tp->networkdesc; ++ } ++ ++ if (tp->state == STATE_WANT_TO_SEND_HEAD) ++ { ++ FD_SET(tp->networkdesc, &wfds); ++ if (tp->networkdesc > wnum) ++ wnum = tp->networkdesc; ++ } ++ ++ if (tp->state == STATE_WANT_TO_READ_FILE) ++ { ++ FD_SET(tp->filedesc, &rfds); ++ if (tp->filedesc > rnum) ++ rnum = tp->filedesc; ++ } ++ ++ if (tp->state == STATE_WANT_TO_SEND_FILE) ++ { ++ FD_SET(tp->networkdesc, &wfds); ++ if (tp->networkdesc > wnum) ++ wnum = tp->networkdesc; ++ } ++ ++#if defined(CONFIG_HTTP_DIRECTORIES) ++ if (tp->state == STATE_DOING_DIR) ++ { ++ FD_SET(tp->networkdesc, &wfds); ++ if (tp->networkdesc > wnum) ++ wnum = tp->networkdesc; ++ } ++#endif ++ tp = tp->next; ++ } ++ ++ active = select(wnum > rnum ? wnum+1 : rnum+1, ++ rnum != -1 ? &rfds : NULL, ++ wnum != -1 ? &wfds : NULL, ++ NULL, NULL); ++ ++ /* New connection? */ ++ sp = servers; ++ while (active > 0 && sp != NULL) ++ { ++ if (FD_ISSET(sp->sd, &rfds)) ++ { ++ handlenewconnection(sp->sd, sp->is_ssl); ++ active--; ++ } ++ ++ sp = sp->next; ++ } ++ ++ /* Handle the established sockets */ ++ tp = usedconns; ++ ++ while (active > 0 && tp != NULL) ++ { ++ to = tp; ++ tp = tp->next; ++ ++ if (to->state == STATE_WANT_TO_READ_HEAD && ++ FD_ISSET(to->networkdesc, &rfds)) ++ { ++ active--; ++#if defined(CONFIG_HTTP_HAS_CGI) ++ if (to->post_state) ++ read_post_data(to); ++ else ++#endif ++ procreadhead(to); ++ } ++ ++ if (to->state == STATE_WANT_TO_SEND_HEAD && ++ FD_ISSET(to->networkdesc, &wfds)) ++ { ++ active--; ++ procsendhead(to); ++ } ++ ++ if (to->state == STATE_WANT_TO_READ_FILE && ++ FD_ISSET(to->filedesc, &rfds)) ++ { ++ active--; ++ procreadfile(to); ++ } ++ ++ if (to->state == STATE_WANT_TO_SEND_FILE && ++ FD_ISSET(to->networkdesc, &wfds)) ++ { ++ active--; ++ procsendfile(to); ++ } ++ ++#if defined(CONFIG_HTTP_DIRECTORIES) ++ if (to->state == STATE_DOING_DIR && ++ FD_ISSET(to->networkdesc, &wfds)) ++ { ++ active--; ++ procdodir(to); ++ } ++#endif ++ } ++ } ++ ++ return 0; ++} ++ ++#if defined(CONFIG_HTTP_HAS_CGI) ++static void addcgiext(const char *cgi_exts) ++{ ++ char *cp = strdup(cgi_exts); ++ ++ /* extenstions are comma separated */ ++ do ++ { ++ struct cgiextstruct *ex = (struct cgiextstruct *) ++ malloc(sizeof(struct cgiextstruct)); ++ ex->ext = cp; ++ ex->next = cgiexts; ++ cgiexts = ex; ++ if ((cp = strchr(cp, ',')) != NULL) ++ *cp++ = 0; ++ } while (cp != NULL); ++} ++#endif ++ ++static void addtoservers(int sd) ++{ ++ struct serverstruct *tp = (struct serverstruct *) ++ calloc(1, sizeof(struct serverstruct)); ++ tp->next = servers; ++ tp->sd = sd; ++ servers = tp; ++} ++ ++#ifdef HAVE_IPV6 ++static void handlenewconnection(int listenfd, int is_ssl) ++{ ++ struct sockaddr_in6 their_addr; ++ int tp = sizeof(their_addr); ++ char ipbuf[100]; ++ int connfd = accept(listenfd, (struct sockaddr *)&their_addr, &tp); ++ ++ if (tp == sizeof(struct sockaddr_in6)) ++ inet_ntop(AF_INET6, &their_addr.sin6_addr, ipbuf, sizeof(ipbuf)); ++ else if (tp == sizeof(struct sockaddr_in)) ++ inet_ntop(AF_INET, &(((struct sockaddr_in *)&their_addr)->sin_addr), ++ ipbuf, sizeof(ipbuf)); ++ else ++ *ipbuf = '\0'; ++ ++ addconnection(connfd, ipbuf, is_ssl); ++} ++ ++#else ++static void handlenewconnection(int listenfd, int is_ssl) ++{ ++ struct sockaddr_in their_addr; ++ socklen_t tp = sizeof(struct sockaddr_in); ++ int connfd = accept(listenfd, (struct sockaddr *)&their_addr, &tp); ++ addconnection(connfd, inet_ntoa(their_addr.sin_addr), is_ssl); ++} ++#endif ++ ++static int openlistener(int port) ++{ ++ int sd; ++#ifdef WIN32 ++ char tp = 1; ++#else ++ int tp = 1; ++#endif ++#ifndef HAVE_IPV6 ++ struct sockaddr_in my_addr; ++ ++ if ((sd = socket(AF_INET, SOCK_STREAM, 0)) == -1) ++ return -1; ++ ++ memset(&my_addr, 0, sizeof(my_addr)); ++ my_addr.sin_family = AF_INET; ++ my_addr.sin_port = htons((short)port); ++ my_addr.sin_addr.s_addr = INADDR_ANY; ++#else ++ struct sockaddr_in6 my_addr; ++ ++ if ((sd = socket(AF_INET6, SOCK_STREAM, 0)) == -1) ++ return -1; ++ ++ memset(&my_addr, 0, sizeof(my_addr)); ++ my_addr.sin6_family = AF_INET6; ++ my_addr.sin6_port = htons(port); ++ my_addr.sin6_addr.s_addr = INADDR_ANY; ++#endif ++ ++ setsockopt(sd, SOL_SOCKET, SO_REUSEADDR, &tp, sizeof(tp)); ++ if (bind(sd, (struct sockaddr *)&my_addr, sizeof(struct sockaddr)) == -1) ++ { ++ close(sd); ++ return -1; ++ } ++ ++ listen(sd, BACKLOG); ++ return sd; ++} ++ ++/* Wrapper function for strncpy() that guarantees ++ a null-terminated string. This is to avoid any possible ++ issues due to strncpy()'s behaviour. ++ */ ++char *my_strncpy(char *dest, const char *src, size_t n) ++{ ++ strncpy(dest, src, n); ++ dest[n-1] = '\0'; ++ return dest; ++} ++ ++int isdir(const char *tpbuf) ++{ ++ struct stat st; ++ char path[MAXREQUESTLENGTH]; ++ strcpy(path, tpbuf); ++ ++#ifdef WIN32 /* win32 stat() can't handle trailing '\' */ ++ if (path[strlen(path)-1] == '\\') ++ path[strlen(path)-1] = 0; ++#endif ++ ++ if (stat(path, &st) == -1) ++ return 0; ++ ++ if ((st.st_mode & S_IFMT) == S_IFDIR) ++ return 1; ++ ++ return 0; ++} ++ ++static void addconnection(int sd, char *ip, int is_ssl) ++{ ++ struct connstruct *tp; ++ ++ /* Get ourselves a connstruct */ ++ if (freeconns == NULL) ++ tp = (struct connstruct *)calloc(1, sizeof(struct connstruct)); ++ else ++ { ++ tp = freeconns; ++ freeconns = tp->next; ++ } ++ ++ /* Attach it to the used list */ ++ tp->next = usedconns; ++ usedconns = tp; ++ tp->networkdesc = sd; ++ ++ if (is_ssl) ++ tp->ssl = ssl_server_new(servers->ssl_ctx, sd); ++ ++ tp->is_ssl = is_ssl; ++ tp->filedesc = -1; ++#if defined(CONFIG_HTTP_HAS_DIRECTORIES) ++ tp->dirp = NULL; ++#endif ++ *tp->actualfile = '\0'; ++ *tp->filereq = '\0'; ++ tp->state = STATE_WANT_TO_READ_HEAD; ++ tp->reqtype = TYPE_GET; ++ tp->close_when_done = 0; ++ tp->timeout = time(NULL) + CONFIG_HTTP_TIMEOUT; ++#if defined(CONFIG_HTTP_HAS_CGI) ++ strcpy(tp->remote_addr, ip); ++#endif ++} ++ ++void removeconnection(struct connstruct *cn) ++{ ++ struct connstruct *tp; ++ int shouldret = 0; ++ ++ tp = usedconns; ++ ++ if (tp == NULL || cn == NULL) ++ shouldret = 1; ++ else if (tp == cn) ++ usedconns = tp->next; ++ else ++ { ++ while (tp != NULL) ++ { ++ if (tp->next == cn) ++ { ++ tp->next = (tp->next)->next; ++ shouldret = 0; ++ break; ++ } ++ ++ tp = tp->next; ++ shouldret = 1; ++ } ++ } ++ ++ if (shouldret) ++ return; ++ ++ /* If we did, add it to the free list */ ++ cn->next = freeconns; ++ freeconns = cn; ++ ++ /* Close it all down */ ++ if (cn->networkdesc != -1) ++ { ++ if (cn->is_ssl) ++ { ++ ssl_free(cn->ssl); ++ cn->ssl = NULL; ++ } ++ ++ SOCKET_CLOSE(cn->networkdesc); ++ } ++ ++ if (cn->filedesc != -1) ++ close(cn->filedesc); ++ ++#if defined(CONFIG_HTTP_HAS_DIRECTORIES) ++ if (cn->dirp != NULL) ++#ifdef WIN32 ++ FindClose(cn->dirp); ++#else ++ closedir(cn->dirp); ++#endif ++#endif ++} ++ ++/* ++ * Change directories one way or the other. ++ */ ++static void ax_chdir(void) ++{ ++ static char *webroot = CONFIG_HTTP_WEBROOT; ++ ++ if (chdir(webroot)) ++ { ++#ifdef CONFIG_HTTP_VERBOSE ++ fprintf(stderr, "'%s' is not a directory\n", webroot); ++#endif ++ exit(1); ++ } ++} ++ +diff --git a/feeds/luci/libs/luci-lib-nixio/axTLS/httpd/htpasswd.c b/feeds/luci/libs/luci-lib-nixio/axTLS/httpd/htpasswd.c +new file mode 100644 +index 0000000..1a7a231 +--- /dev/null ++++ b/feeds/luci/libs/luci-lib-nixio/axTLS/httpd/htpasswd.c +@@ -0,0 +1,136 @@ ++/* ++ * Copyright (c) 2007, Cameron Rich ++ * ++ * All rights reserved. ++ * ++ * Redistribution and use in source and binary forms, with or without ++ * modification, are permitted provided that the following conditions are met: ++ * ++ * * Redistributions of source code must retain the above copyright notice, ++ * this list of conditions and the following disclaimer. ++ * * 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. ++ * * Neither the name of the axTLS project nor the names of its contributors ++ * may be used to endorse or promote products derived from this software ++ * without specific prior written permission. ++ * ++ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ++ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT ++ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR ++ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR ++ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, ++ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, ++ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR ++ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF ++ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING ++ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS ++ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ++ */ ++ ++#include ++#include ++#include ++#include "ssl.h" ++ ++int tfd; ++ ++void base64_encode(const uint8_t *in, size_t inlen, char *out, size_t outlen) ++{ ++ static const char b64str[64] = ++ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; ++ ++ while (inlen && outlen) ++ { ++ *out++ = b64str[(in[0] >> 2) & 0x3f]; ++ if (!--outlen) ++ break; ++ ++ *out++ = b64str[((in[0] << 4) ++ + (--inlen ? in[1] >> 4 : 0)) & 0x3f]; ++ if (!--outlen) ++ break; ++ *out++ = (inlen ++ ? b64str[((in[1] << 2) ++ + (--inlen ? in[2] >> 6 : 0)) ++ & 0x3f] ++ : '='); ++ if (!--outlen) ++ break; ++ *out++ = inlen ? b64str[in[2] & 0x3f] : '='; ++ if (!--outlen) ++ break; ++ if (inlen) ++ inlen--; ++ if (inlen) ++ in += 3; ++ } ++ ++ if (outlen) ++ *out = '\0'; ++} ++ ++static void usage(void) ++{ ++ fprintf(stderr,"Usage: htpasswd username\n"); ++ exit(1); ++} ++ ++#ifdef WIN32 ++static char * getpass(const char *prompt) ++{ ++ static char buf[127]; ++ FILE *fp = stdin; ++ ++ printf(prompt); TTY_FLUSH(); ++#if 0 ++ fp = fopen("/dev/tty", "w"); ++ if (fp == NULL) ++ { ++ printf("null\n"); TTY_FLUSH(); ++ fp = stdin; ++ } ++#endif ++ ++ fgets(buf, sizeof(buf), fp); ++ while (buf[strlen(buf)-1] < ' ') ++ buf[strlen(buf)-1] = '\0'; ++ ++ //if (fp != stdin) ++ // fclose(fp); ++ return buf; ++} ++#endif ++ ++int main(int argc, char *argv[]) ++{ ++ char* pw; ++ uint8_t md5_salt[MD5_SIZE], md5_pass[MD5_SIZE]; ++ char b64_salt[MD5_SIZE+10], b64_pass[MD5_SIZE+10]; ++ MD5_CTX ctx; ++ ++ if (argc != 2) ++ usage(); ++ ++ pw = strdup(getpass("New password:")); ++ if (strcmp(pw, getpass("Re-type new password:")) != 0) ++ { ++ fprintf(stderr, "They don't match, sorry.\n" ); ++ exit(1); ++ } ++ ++ RNG_initialize((uint8_t *)pw, sizeof(pw)); ++ get_random(MD5_SIZE, md5_salt); ++ RNG_terminate(); ++ base64_encode(md5_salt, MD5_SIZE, b64_salt, sizeof(b64_salt)); ++ ++ MD5_Init(&ctx); ++ MD5_Update(&ctx, md5_salt, MD5_SIZE); ++ MD5_Update(&ctx, (uint8_t *)pw, strlen(pw)); ++ MD5_Final(md5_pass, &ctx); ++ base64_encode(md5_pass, MD5_SIZE, b64_pass, sizeof(b64_pass)); ++ ++ printf("Add the following to your '.htpasswd' file\n"); ++ printf("%s:%s$%s\n", argv[1], b64_salt, b64_pass); ++ return 0; ++} +diff --git a/feeds/luci/libs/luci-lib-nixio/axTLS/httpd/kepler-1.1-snapshot-20070521-1825.tar.gz b/feeds/luci/libs/luci-lib-nixio/axTLS/httpd/kepler-1.1-snapshot-20070521-1825.tar.gz +new file mode 100755 +index 0000000000000000000000000000000000000000..d1caec5a53f93f043a32ec04807dff259223c32c +GIT binary patch +literal 768249 +zcmV(;K-<3`iwFQl4pK${1MIyEU{uA`IG#knZ`2af&6&r&Gxy%zBtY%g|L1;RC3hZY&YU@O&Y3f3W>%^3h??-0`^rnR{#m~=^gE}r +z68eW=2sU_=YcdK?fp{Bo#AE0Mc{MiT#l(5Wbq2ZDXUSW=amsuwP( +zZ3wiTSH)6L{T5s^7-4;h2SclZJ*puW2T^aM(V*8*<3U6iglR-Gk{)N9kyJ3E_w+#j +z(VxcZ2>hcC#1Wq8k2P9cj)p6xme!8OmIc*Kovqci^Q-3t+Rv-9DwaSA1bHzgSU8vr +zb_EU9B$(Wk3btR+BzNlxmp(@aQJW>Q9@5T5{|$GAO60h1BzqF7Q6i%(4f?*Y8Ug66 +zYinEt1i)3G!FDw%*DP#os_R50pgr{egQ)jfH?%1my?P2Y-=$(a5Zxm>>Se!{?4|T7 +zK`?@`Fryx#SR4&eENQT+Dd+~8QF5P}Fc7{zc?luDIk*M_(XXMgB}G*Ri}YN_i1;X~ +zjSJd4s+*de$fl`hbpQdNJfs5uS#YW_glIgXp?^(MKq_jKHru764x`3mI +zV0cjO4fY|1gr;h=STKQLc!35H4RsMCKpVvq%O{!e&w~ae4h@nZY2E5-xwx>H%kh+; +z9FHW+vW{q&(9kp#(3I3zSnHPDrgvZ6pv&}b3sl!NH7*Er)-@vL +zC`}m&E2*im2BlUN7W0KXr4g;mD$}^2wrOEqz^xpW9Fi1R(pufYH9)>i=w>znO+E#< +zTnQ8Cg%>uqaxn3y36fXeR9udpDr?fX2)}x;CDxYJ#M1DwzjG#6p~t-sypgi+L}9S>zk_QwO4r;M@qZ_E4itT +zrbnW(HxiCWNN06IQk54iH4|uQ;q7j1thLNP)4=nT$PVkzru<+T;T5$R?WL#GNQ6KM +zq7t|O)g>NZFfBkqu(mF)LrOFwcxHXtkrHbV9qmbji=c=D^@tN2s=Rejrmdx=qiXr` +z<%&~VL#j!yh3$b(W_NNVmL7C_xtTcf#)PkCUbvuf2~;5CA+A|HoJ`~R%r?86XqeX1(46n64|s7#m1~>O +zN!|m(l^;fnkZ1Rhn6_Ek_Bii|S$LR@*_+MSGZdc{_VEMwyd{bIC8$Hl=dtA|#pNvU>GI|x7|H|GVa +zykURbP!q@u@&{vjY%r>)4FB9vp8@S4#UFpETnKsnN(omg;L5Pg+~qd1xi`i^;M#ZG0ouy}cs4%fD4V~JHDqeW&# +zNY)H+JA>aH;YIyIVd8>Ed?%qcD{8Bt9b8<5T+S>B}g4DZ4I1x=CU&H%oS7D6?sa+!9>3n!<4c?Y-wNO +zB~a=5Ax_cq^Og-R>)wqT?B!3SBCamD0=X78lFZGVcqC=e4#PeU+mO;@kwMo*7aQN& +zmbL)Jn0N7$Ee3NOxl%U8=jz7K43rh1RfQsK7ffuKm1Lx};GbPZH$}YGHWHSD^c!X` +zVqWsG8~~cXT0I^#tZMaIL~S25l4{hobQ7g0%mZr9dT7BmE!IN;Nj$n1Zmd@pb}WVB +z$3ERKC)WdVz^%2nqL?xYNT@DB9$kB27NrP&TV^2)mVb +zMVAyL$l|{Vs`CX@S2<8!WkYopkLs$lsIGEB)vdINYN$tJl~@wpjm=ySc53Yv=`Jlz +zCSAsV!~Cuehph>%4kQynbGE~bj`5O;2&iJm4y;FBD&h6lOO7Ij7Ea_;gHs=uP +ze-p{3d~BAmc$q81c*rb;`A957hR!T8-&un6l!=oO_XieTY5IZ`amIc?ex^P^etP^N +z_b_qCd*|t}4?t!{{7H#SJs>60_krXeW-r!g@pOH-P>W~m0pw@GAM(><54nefdo*0> +zia4?v(_;;pX;FsEH26XmkF4ZtZD?7r)K9nZnRF&%k4OSA&SWDNj2pekXrm%88BBDE +z62Gw6QiLA%MG-c?F^1;XeDcM^;7H&xKRGB|N3Bl+N0M+K{0>Zbm=f)w-vvXlF$vSa +z@4%eLKw2e~neUDk-mSn2<1n<@NOYN?9zyQwAww;!9768O!C8&djSh(`h%d1*K`IE7 +z%wk`m25%M+n$CC7bcAYmBue+tRPG2Au9K##>@;1))6}IgL6Qoh$(r|WG+kxUv_8;L +z+aS=i8#@pznv!oyQ}W@Ysac7msk5v=Q(DDN(+ssRO>NZ}O`X*UO-;lYO|9-Bnz}T` +zXlj-NnvxHosj~*9Db6tW&FUK4aV$+0jS4ll=h)I!EQviCRV-|jh5?#UgF;-O(02Nz +zv26NeNC9zw&LcoUWJje@BWNU{9^hc$F|?L)381FE?V-c+Sa6_>R?sqyW{^O^fDAR~ +zw1<9RX7t!pjwCT%#Ol-zT_-QvCz~{9gW>U^Y+uhBmmDu^!@DvZMChJ<=F&5xXNJ9J +zHk{eKl2%Ix6uLT6h^P+Y00C#el$VIg-bA+xFx2#_u$GX$ZY@c9zEX=-yk0dH?24#f +zh%m_u#bs|>gRK(gHjfJ=S<36yVqv!&Z!8#9<=RE<$ch;VCJ-+WWTiX^`t^p^xS^e% +z-clY=&6`*~e1euv%|swqSB#!W2D`L~mK>Cm{c3QPn=8Zglpy*ySJ$G?&N>9VWodI@ +z0r=S3z{gcy=9`9EZLXdlfT@!wr`a!5tPMf}OK~lY9q|gwv+r&z-tZuzwia>}U>kf2 +z+vqmIv;A%b^(7WYBE*aS!9l`dnL_J~==!P@B0AzV^mj1K;U;W9D!jm8TVHq=ptGU6 +zy|aDcg3cz`#_f*j5R4hsV@^m-byZ4F$m{`iaMdSNwWht!r1!`u>b?b=iNYjKAR`%V +z7-sgCcLdryVDb#ZC24aMIuxuwgY1^1^m%kjVd8=Nm2Qvl4t-B);oM9hIKmIv4w~L7 +zS`B!SOqeULT`R+6Uo+4b?;cLoP&ku6LhGt*@fOagJF}KG5o{qEB#y&A{H!=v +zpG*aNF}w-K3iUup4ur+JI79uigVO(7Xv4BPT3XZ98V)HBjb^Ncz>)yMnXRLdg7!vb +zIHP4RS6AIp?I<^6`gB&Vy`!xWbt9QbsVs@D_l030t5hjZ>z0?nyv#5TD`vqyT8u&) +z;g}6)*Z?Y^GYh`EH4)KO6wv}~DGW6%mQi>Qr#fMoOv?yYA)cWE2y)oVwS+joVd594 +zVi(}{B^JfkdWpCVP|_obz4Ae +zTL`Vi0g*6DrDzyjBq@$AOkX{sb=fQPVv6@|i9#wQ0J^EX_MJEf)bB +zFc(H7aU~`nf>VdEA^r>hmolN{x$_g}4`M<1Cmjc3|B%3dEQZCy>T}!Leyf1Md}5Mc +ztZ8wc1qgdF()I(7js0YZo#PmIIw%t72~2uM +z=vTv<-ug^KaM2aV6W$U0f++ofT~w)-B79In_@bVy?mfEcx^?ZO_%ZvIAMVVwy}2kvgOOT6L8B{EMI}s +zxZ^2}9Uh#lAbYWJwme71hOeW&kP|J^7#_P?kL=aKtSy}FTDjM)b_gotfG!WTyjHgG +zMvyz>AvDBm(Lg6tMwOMIq(RZOgRrtwI18RS>~f- +zI0avEy0dLI0an53Ia#_q4cyEQZP7y^=5*0gam~RZpIdSGYpK2OcBo4 +zc?4Le9Q0hJyj`9RqrP+W+@wAO +zXi9!-mdX5tGX*Id7G6w>Qqeu~!-Z#DGz5pv$hCwO^1!PIoNCt(kO=?j1TO=x1z1Lf +zUBp`%qHxFQ$xfDYM8!JSX2=EkiXlZg51`i_LOStXWURf&2MphY_dmN*-Q8-!H+2># +z%K4n)rjlYrF(WC55dTm0)RdPP+8R~wF0Lu}lqjw(E1p?ecQJ)mRpz+_tA~`)8_{}t +zQJR{7%ZC7RpRR?cdJ>*lc0GbJ%hCUpd1kF!Ta=D`bdb~Zzc&q6xM>pMRHQ?bh}CWB +z!FUjTRJf`ax=)MdZ%3fB6}8hAxL_e#uAy}PhKwRbNk$}k +zT$vJ*)5!oEMs|T~p(#pRNFQ3%nn$geFNcOHVJ{B-yA!UnOWJS|!p;2V)n^j@BaI`6 +z1wrvH9PYH2$AaT%$n@OUQTDLoa*N?^uc+Rq%33U`(?BT6rGkYnP>kU;grCIaf)7^@ +z3FiQIt>WqdZeQBY?g4SBN3}jH%(C(IJ1)gdkF2fy;y{gCadJg0sT%78e~(L&up5g6*^n(DDVLeW^FqC7>d0pg3{lR> +zp-x#T@b1veHe$9J*~nVk4DlhxDFY8uA0OM7NXvT+>acevhJ<9>n{a_YY$$kp!ac&9 +zb7Hcwa=0&D2GQoYbPaU2e3#a>kPd-N&&M)xjH6BQDB-`rsm_J-`bjjZB;kM3$XpVz +z%1d1H46cXO=g!XgtpdDL+?K>z2A(DjI5@hc=KS_5g+pB#!rSfKc;@ef0B^W(bj}UY +z4Csi`+;I<5Mp^D!UYL<~_c(Vpfa55FnuDJl7>nG*#l%}ILFCA? +z!!(lsZgRc+YKYBS9t*a+#w9s-FHH1Z#}FT4=fikbN66S2orSh*F6d618OHCYVdx}^ +zW_2X}utBW4ZOG{1d5;OBi95&V=gQb)Qus6z0~W)9+HnxPg9TSuJxL=W#49!21Vs~n +zhlW{zzwJX&%&rI#C*~2we=VwxJvrNjYD34Hu){{SU=!3GPTm|^ADy8k>=cf`(B!6H +zH)f{SG;r*Uk4F%O9*Co^Q6A<_ocPUC6qt|kU+FoS9JjFXvUxj%hlAB5ob2=qC2c%y +zOXV=4ge0xHiV_+k)45<_bCptAR-Tq$#JgM4a14K8i&+FN9ksf{b2Wc-^)OJi^Q7bM +zzM&RC?sbL~qulv8k()^;+_sY)-E;6PcR)Kqp7xyKopgMZ=Ytm(ah! +zNam3`Kfc6WLjOs_KX90gXC8XPj)&AU&rbVU7SAw30%-|G0ze)PpJXuM&HJ0ce&^0^ +z`?*uzhlYZ{3AS56hZ0PV;+bWVc`lb@8bH{=F}7Za>|&lowRnZx#_wPh>T@x91^C2% +zXR^c}xAdEz=Gfa{;NiEYk^Le#kvQ^`3L^d8?yk)|1a384M}fa=S`qKO9ibn@B$CO4 +zJkbt=7NYyk^^$6jtvmR_QFc>8SWDnjg?4wFN34^{C1*N!c%KS)^RGgVK*A|Vdi=C> +zs-uWWAZ|C&MiF*AJu_WQK-60;9AW36W^_*ftKTvC;&*62?)@L)ockxVk@@|fvU8@F +zPq)ASGi`eL7w`Xk9={|0Tu++EdaRdL4(qiZx=+e>2dg;mY=%dBtjBt~24w@KtB3Mn +zkMpsfD!vkZtf!^jd{-qY8)`C%{e{ILM35e!i*Bg!VvpRU#Zm($sQ3~YebF<jZ&!^Wo8M8}=zc6{iaoE#n!J7B=q +zq{aB!)i^!{oWkJ&u(wEh``(Rd=2wOoHF4>9G4<# +zUd2H(q)N6HbkG2KaEK-#9&pLG>f?ozJ)Z=?6_{_N@jYS7r-qj1fW4xbiCUGbxM&P0 +zOq%7x6I_bmmbnF+OObvR1P(dxC17TSG*z+7cgVT}uO8`9Fm|Y~xz#LZ9$LfYlF>Mu +zQfRPaVR&l}$Be*T&MNw^T+F5^C69+rw2nYqYg?cLj0F7b5nJ1pVlmBt*5da(RQz~U +ztxL%eDoRS$5ZQr9(x)bH!}xApk174E%Ym(#rzOGEL92dlB9qH`ZB1cVW?QgHNzE7h +z;t0|r^hTIs{(fS@*+|Oci;B$_;L)LG`Yc)%t&d;jz&GGp@0XAY2o}f;L`^Sw+(gB; +z2YcL+#Fav-ZpBU+Bx=VO!Z|*3tU=w2j|$+|8*zx09M>aS2x*%b8%@N@p@d4`azSFv +ztS`pkwYIg?2HM-D^d)GN9%_sBAVG~8KPdiH!~h^#9ZWAOX^7CE>Ys#q7qB-K!wE!| +z1frJk0;aIzQYEwZ5(|(GHHb3I0_@6qCZfS6fU=>823Darvc@b*ud8nqWGn}`1-~^X +z!-E1&@NTcs(e}893mi?kRiQm@gCR^C3wYGyLX*0$-lTJ +zqmuB>fDJr*et^)ZuBJ9q`=n+3T!5`@{*?fyR(85MhW+DS41%Rc6eN{_nGftzlS^Tu +z0f!>_BQ36O14Fx|LiWbhFp^|iNcJwq*KRC^KY9?Md(fQmBC(fB#86TQ@i8*HwI2A0 +zYK8%O*YSj&)RTj8csXWqOhsm3*sJ0fA0YwRPGP+t{n4L5aokY*;qn`?+ud;Zg*cwjNHh<4^7?CU`Ol8}qen00|=a?h^Dj +zw$eQk%c7-l!h&k7_&V^V7>i&E7dD3d^zONmKDpdCy+W=iE1OYTUS3);T`oV@UsmZa +zn_vEHB|2L|GD;r~e=mc##(N*wVApfkV!J#9v1nce?09esV_|M@(A1ygW@ +zCQ=iyZh-6ik=U{B<)iCD5M0FA0DsK_FgA41s=*l2sKFT0>cls0BvakpGPc^0d9X@V +z<8qI#heaF4ClTioET9ecFlLov$zO$g;j&7>C*dv6ca^f-dJ&U2#})Inq$-8_gA^BM +zjS>-FR#wF4kE;}{brtJ1-YO-G#C9mD@GtUKDKTA<_-DYXltC4tz&~(HI-^*x+p+}q +zxGei-551yqH;t=E=4(D?C05X#NctEn`{o`{Wl8+0hcwCDgKr9Nnuw*?mJ+jb +zVAl}8$izXVA^Xl0?nOomLMgo15@t(TxBjCx>X21m+d&Tl;Kz<>3T~WFVAaVp%H)9% +zNiur%{!YZN@nVmBi4;Nx`s~?(mU^kyWP8TzlGh96WY-^d6F{~P6+`B8w>D6P(6kq8 +z#W^xr%hI)|<%zPMpO)O(U_Uxtz$;Nmm>;!i3>q*~kr{7qS7=js#vL2%#$h2q+Q;wI +zdcExJks)xXMT825QO}Q9^UOx`;>(!~BzF+`iOeu-(MKaeQjr26mEb{fjjTZc8F2F% +z!){zDv_z947ei3Hl~5wnmkg~WU(o0Cc@UCR&!W|G8ai1b7Om%yR7-(_5-;qA%@~%D +z1gg-bS{0LxW|hSbhdv@nW(o+da_|fiFFkY8V;?>9#19u+h8MyW-mUTK)O}yY1U6Kt +z#;#g4zNQC10{6V5r6?SEaaaws0wK?2)LmX=jS +z>(IgAmYkGB*;76!XT<%%imU`)x+`H%%axGzQVDxAZFnQZ>qm*dqSs!Fyt_l(2Ik8v +zGWcqGNKcqR^?Jjakp@bgF2|5%L9Y1M6GMYyRIMT+Asr}GzXa2?$-3uH?oQ}Yxd%}^ +zCKJ&;eEDlrpBy4g8d_6)F+`lC3~Vc57YjZtOHhK%vrsUG`ex{|5m!T6_n@pL4Z&}F +zXlPmLo5v1GCsFtu5_W=%{m{@Ob^}9=y?!d-CTNc~_C6~3<%g#*7Bb&`DmZ)`c^i&m +zr>Bx8f?OrS#1>*kDvo!o`hlXD?SQDbaVdaT-$+uieZdfBKt17HK_by%=?KVOc%c?QG~7_d;bX?kX;XzDk(U`UFt`r^F>u=8s#Hkh +z4cuV}XF)GeTc07zM00w!r`|Q=5D_-39|qFA{ml?3s>DWT0r7TR;t`nLLJI59NMA6LQmd4eQRd3kBkN(Bms;NeqTUBj#|9B5SV0>9;zdCFL^uF>4m7Ko{0iStaH! +zD#VB=w$j{^*sRgMw4I(Twb!z8I@<#s*hwIQ<5ssOINmiPg0phcfa6xGCO9E3)3s0B +z($TEN`@`I8iKdlVQFK$Kugcp!tghhois^0*61&B0jdOryz!KXNW*y5%mZ1vP^kx;y +zjV4wR9ehy74VI~hEgs{&P6Q;)vHO)wDu_)nkZ#RU^=Yvu=fcZ`zV+a?gBYOQEMk}r +zz>LJO7J>pSCdf^2g8$G4k$GL&wMs7Vh$1tgaqdA8mf*olLshaZ>e2`m>Simv&(XCR +z>N>RAVLicDlca6Il*jg#1Yf4uqOAl72I4RlTQS`=mS8Y_+8O47=u_Z@3h&v@G?AFs +z#o`~Q<2*A0LbIY{S**x;*1?HR5*@yE_eRX6wQFPPWwJ{tciAkgl3g1y4^X6S05&CE +zfpbm|&tVY5a=^Gi;h0JQ<6t(kb6ABdfkZ-2_>lp;DyH|xl +zf>?GKy;^q?nFTQw9#@s8U{gU}Q2*&7pBdXh?VU0-WlO2HbrlZ==lAQ3@ef +zvFx4Y#mg@8uR!*W-#3*rc?b-*I^Gym!Mv#-))%D^W6F=Q*caLWCI)6g +z`q;IZMQEsjB}*ZilLJGgn|U1b;Ccv4rAgOukPux8F(;wV=aVVa7!F~oTFG;bEV}wv +z@_nHd(se_uNd^fvC6;5}L(|U$kVdkuWT%kKk}Dk&!PIWNI3S4*;@J=a=cx@TUpiFS +zymLxCv|CI}VRc8I(lstr@_+u`FKPudA5zoB_-=QRc2 +zdL?+KeKNeCC>yZr7!=7L1u5@oo}WOeQjc7wija5$uUX<7CHAF&~8I8aEqu +zaj6TP;fBnOKpe=-etK6dfCOAMpWLC#M7cr4qzbnTgp!d#;VV1A}IJAa2 +zT384md1O@*3eixsGAq$kCl>C7_+ME-hnNlw{g^0>OzGn%RTVDR&2*{7x*cjEBN(IP)PPvrtxN%yEAb4*=Zg3_ +zY+uh0QLe4^Y}jE2 +z4hxTi0`zd20!|Nw_lHu}Hv{)5wsd!H(iBnl=lUdZ5B9$_WEYod6d5yi7*;rU?f)|{6B*>M|i?8b8vK4pm +z?2Zitx=E~#XimU3Il!7(k@#v3E@z23gq(}0vw#XF8WI@^yPbAeLe2{8w!`C>gEA-Y +z#g4dgtOZoD``*NzCUc6I-9__c7{lxaLr#-k%9^IUooS4P`Z${0na05r#@Hed9tmqt +zk8bk&xvujaQrxSdmV_z{PqzAz@kGa-vLimrv2*Uwr#MFH@Mk#z(?>$PstSvFu!yZ_ +z2I^ZVm6W|*a=AySPMZ^;Aa;x-<>`F0ZY|3$vs1QBP_nf)rwT#S3}hdzPH71>Y@0-~ +za~{c}=_E5(slelo&Qd1wxKuP5*ii{s$aBaNNC5WF6+)PnM^OG?c#7be=C(4$(>J`p +zaTy7aHjbK#y^0`2tm3XGg5bPPVlWPW#|#i5(KHf-Zv0x}!-<~aQh^E%5iwC}kR68f +z76;v#ukZ~h;${ZF(Q1;BWDz(ftT# +zb6`Ev-DJhK;~^JvI~`_w>_G+AChQL|xyngK;^ZH~c_l3P=Ug?y#R%yx8+_@ +zfOe-MkxuHjBNQ!a^3mi&~b}qH!G)+S{&JhC3Pl-aOl%a93k?<5G>)=YsLa) +zqEsFM7q~HkF#N+C_#-j)BN%=+S`3#7Z0GYu%JE9y{M+)$4|~Q^Ol;cpSAj +zTS2H134@ctpf&^kC$ODYftN-Q+H3LRuuO(W15&-em1EDh42ZyR4 +z08C9m29gigG4%xISzoVf9vgpJMoK?mU{yE)$gZgjY}(v}*PNvGVFq)At3&J&xS}u; +zb(kUXWG}c)@C_;GKLXrg%^p`i6=#fyOS%a|#*2;`<_Oz87k-oc4r53tPfZ~kRh;E$ +z`w-{scMF_SB#Q<}!Z^qPMO;k*!91f=#Mx%rCe5m09WJHO;hrHi3R42{w~_Q6#_)(U +ztsizD5ZHLoFf7NsmW&M2sBzcm2%pn%<-LXvo1-Qjem_@IKL?+=I_!C#_gL`zc2_+SrytMw-t$ +z3QHr_6f94|YBH!r44-w}&^pB8jGAyc2qK1M*v?m2`(~E+RXBObZ^?)!5Cs>id7_dX +z6yx^DxgB+h+dAVm?fIjZ+>RiB0FyswBp!Pd1L&>bFD``KjPA06x6SA+D@0lhz!HLx +zxo{~yywi+&vO;P3$R*ymcbtE8oajii!|v=@!`O +z=0b3$Np^>U_$|5n+uXfYlGB0a^i|=2Q##j$YqChJr(ZUAlt~%(LWkcvG{&-8949DT +z4qz#g6opMzavkOzxfEFpr7>jZ$Q9fN!HB}G(_^YnUP^ajVtT)vK$4*dz!X^r&8R^7 +zSD)cNoS)|rH>Qp88TsVcM%&hy%kJ5CRWnK?=Cau*Dz7vX_ZULV@7Bd{q&fW_%T{Ap@I{ADUY +z*Gm9IWr!dJiYq^_?Tp-gBbq+*hvstARPJZ}-ISGGGo?{Q +zE=uR$S|)#r7q +zkN@=YX%%0L|L5^bJN^))Q+{OH80!A-vgy-o<6ntNd}0569zWl5gbb+vhvch8FKjyf7vwuwCQrBx0~LS=IdyH5Lvk#w!n~m=yxq&s7Su{1{rQ>gI9Ls +z*UiM2`o4kmgaeFd&u7ih0-Ys97` +ztB=fCFjet&pgvu4)6{SwU_+Rt;Q??yVRllBy-)eiSVxC)I%@vQ61# +z#>lRX%6dZ5@QRgQ<`-s{3q!6?DsHvsusfXfR5G4QB7+*?+Xe`SzNM0ev3U +z8(4pKspKwVu+QbLU^3Jz+<*#wz}Gb3#2~)XGcxFtd`+!V2Lg<*x!{RfY^W*%8qxbb +z5}-s0KyL8B4nc+w+iB9s#X;OqXa=Srt;8Vs#0K$DK?_!(a#H7jpbpV12%&|b+!N8e +z5S{T2)c6AKFeVZLBcn0v2HXr4KJo211}sO=@*+m=bT?pULC0eTPoEI#6V +z6Rv=J$}qiSBs$Z&ifDC8ha16*yU^&w(4TOLeG*r~Io4&-2^AhLHrGTLq=)p}LQRXo +z2%>KZKh+A?z?PLr3Z~GD>fpgyBbw3Ip248ZD8C-4Cu;D2{h#Y2zHbmDmOp0gu7O +zlp21^Ijn_LgTqNCY*rv5bQ;0MOeE$nk8%+m~)h_LX)_A6gxH6 +zrzP|lCQKiiX@D0-fLvzT*a3a(1`jqO8@<1t@e?`Fj37ZvtUPcxg$>i049;Bhz9_kf +za1d}ZOM@!bENB5X?AHvngd1aMJ!lwcXz>137mfHQSK(sh@eMjW9H3nbz1xTI5jfld +z)uQFzA_>oYM8vQPW7q{e3A5TKG0zne8&Ft5rM*RpgjzMU9`KhDvW2ailnl}sB1%l> +z7zm(aCSpBCz?OUakSx~}iR({4olx|a<^=F1h&d>Nf1ka!>zgBUNz +z@M{z%7a(yIjVB2cpspcaguN*PvkJY_$B9FUBnWv_APSPyjLilRm>Ys*W|+GwOu7)U +z96`))4HXq3Xz-AjhsFkFf*fWs&4@>WgG4q;1Uc4{oQfs2h$~E}3hbuB^+yr{J&4*L +zkX6_qB6+D8!n9p4!Eb2v2M5VEC?ZxO6(=(cngCWq;~K>GP`kAPe1IAX0R!@l_@!VN +z*A8M1n^h!BRCGkOaF|>H9Tf2ml0bLB1!V$Ia+?qjRw`BpLTVfz`Ov}$SSo@@fUnJ= +z!XE~RzR6(BqEbGJEHnI8LqrGNXYDwpfUiDpil0wm1YPEuZv*eWe_nOPiRq*F?e}{Kd8bJgce+Q +z-P}rLRua5(qza)nrWikwFdX_G1=kc942V~>C=$~NI7)*jh6}Tf1g8oavmfw}`JjnP +zVIhmjP?JiAA;&0)RwqPeonYvh8aha9i&?Tsa10Z6N5SC< +z=aWnu02yr^j5*SpxIpro$u?+}H2e=&H +z097K9<5ZmOhm2QHtHTn?K8ipi!T=$Pr?3jZo-K)EVsCb*f>QV(-^_^ +zu{mbhMQAb)#;HRbo8bsiJW}ROXdJeE_;yhi*N2b>flfBC@t`a1fq-1y)ZU_4=6`WH +zvi7?Y68J;?rKSD-{c!2NPfzrek~L0a^}Gcw?H!G^?Gla_kfTTj;V>7=dNtHYHx`n? +zSP<@rA}Y6dYnR%5a-*6^8NrAaHA20JL7IGWgAehlT(9+{R0vYmv7(d~`{Y^` +z9I~)9gq^y7^%C`q-#_t}$^R2NLJpvz{XgY)|4;e!FZTaFmmlx{37HO{igSnO0ID6C +z2Pni`K+MhI=Kl%V96<6iewk&Y_4|aF<45qLfTt&!2*!*^5R8B3-I3w_gQT@I=6oIa +zi7zBYds0ZkO8A`<=Gnn_7h|nUy)pna;qC`v&X*`&L4;w?6H9Dl_?S*3Y-#kSVyno- +ztvGI-!h=mvSnj}`1^E7A;(7{!;=}8lU?`-)8*@l;!b*tRV+N7odUv;%n8(Bn57Dr5 +zf>x{f)C)j1mpfV%j+;^(s3z27NHvCn+?~l5zQ}~`2fNyIa}in%B9wKwy_D+IE)`ng +z2t!B9AngU=i8g~ijAvCQ_L>pw!*Hp|gLjk(%}xC5T|(tK6ro=+H3aH1p`q4{D4fDg +zkoO6lrYfPb&leXPdQwfzUXNWNb_6ZyzN9*=A +z%$PO_EdfbkEyR4A7;(Jf_enM8LwCeO$ph33&OwKT2g*fj7BIot31)MRpjllaW|A(E +z`E4%wosJ&{B&rQa;DBW`wK~GRF9%F7lHMxD`)CPkzyO<1yuo?^)-!sv3(pv2Ipb$r +z9JQ!Xjb~q2>+V()um;9!4)(r5MD@tX0!xC?XOs}(VGf4_BI&$~tA==Lurn=~VHLm) +z8J_jSbo5BY=E4C6o~(B9s@?SZFi&TaGH}qKWW^L9E2crwA=O4Pmp#^Gz$QB&L5yIw +zz!V0GvaK*lz_+ZeLhBgWT4?qYcS}sQjBE2o4Ah5+8YBx|WW^eI!3RX+d77^Ic^^NK +z<-lmx*w9JEt$L>lSBM7T9OUzlR1Y-2rn}Y_65^cBD2l_w>9;u0~_$GC>^b$ +z$o&sg2w*>c8<7RT=|~&~!>rR(YKXGICl$N%IuOL_(hAn=*x$;rgiJLXo&^@gs5YnC%SG%_(*cP`%b@_6q5;woYvPxcFhgm2 +ziq0F3RpMloPuhb{hRI#!EYu3Wslv7BlkokbFh?Wg;!m4S$4UXeETt0WaY`<~1Zpl7 +zhp9{&#uFUzY!}i)R+txY*BNB45jr5A#MioDO&?biWE_H^uM>KzhipXkB;aW}XkXT2 +zuJX2qF+Uzbh$qLE6j*FfOEXM&C@AS*w_3tHkA@mEXf-WK@WvPDz!g?@zmQLA(ECAt +zV|A4vN=lcJC6|DZGYZB?;Vqaj_4FcoC-J+-&=QDn#HS0uze;U9I)j)Q1Won^Bb3rQ +zDj&s@G-l|LKG5oj`wo2)0yXTDaDi^E_p!6z^e$7^6=qD6rmAg7INmcPaBs!Y^z2IY +z@V*Jg?fo?J-p2J*UxHjk|J9L6g8e!$>F|zD1ZfV{)RNc<*UflI4~0?*!cmD-EJnS< +zfJU70hqWC?ecfhv@o^u{6OVhF!gmf?xMN+EGE&$<6V`oFJ$pPL7D9Z4?ci7{+6BHQ +zpfO%X;MWWxz|V9~ve_?CY$$h5ePdGqd+_A)N?|aW6Of}~8voDd;r?-T_Sk(w@)zEp +z|9iiT@jt!EXygdAF_izOvhp0e|7S+|IbZmHK9Aq*DPHf$1At_&caAi>p`*D8{s~mq +zp?^9WJDLJ>ASwt!LF%YSon1=Oq}ff43+Bshfu<_ONDd+8Kb#;BSazq4_H?M9u-_0Qzqe +zfkbc)0n)B9NL-%|BMxbH>l`jD$VTr&k3|wkY3O()eiR)sNg}Xe#3dopAZS3Ef5XTm +z3;AJ2Clv|w8DV%5Y0VcS#2R6MlF;yx4N>BU5P0;^gOs>=GV(wrRGGyck%>5TsFJOU +zJzS}1E}|OqnBxJXArZFZe@@I2kkTb)3E^DiEyCyyD{Kjurxh~CEkT1r#VsLdinmYp +zY6>IRp+_!ZSavuR4Y%MWjyt{xVEViQn1Fp|5$^eSieUn@tBOp89OIei-zt&`;Z1{v +zOriF_AePC(s)ES{soR_y#jV&d_G1417lk)598?*w +z0DA&WeyskSK~7w*TbL8gmWlE_QlU-^L5&y?nWCK>Hm|650ZN2*)70`f?g?eluqVha +zF5(Kf#XkuR4JQJMHQz_9%CufHyc(lEFn-~L7a`yZn_bg}(yHld(8VdH%yCJaU0OYd +ztjjEK838{6ml@QjE;Ca1P{OA0iW)8_!E5AFSi0h+EM6@CtC#zZUt0eU=;5e(L|i~a +zo&T>av&a9;sHprR{^xV~xjS)?fzO_x#?$u5dUCMe1}1q!`A{=`c4PBAxxK9x0n>YQ +zUys(UAj#2D1$T}sa!pHHU7)S1Y!06Nbv(wk^pg_LF& +zjxAw3%y?G#5Y`KuFbU?ENSnJfFi(^@Z7Plm2*HM9EES9psl-=cZdCp%myL;hpFq#!>I?*0AR5SG&+s +zE=l@f>dsU=jLlAAgpih}`Z9vu85x@(^e#msg<4Cv3z!ppDG(zr3uX+)-$Ow@?56_rHJo>HqhSfBfTL%}D=$_?5taU@m0kewI~~H@V@y +zU5{N44kHSGV5& +z%r(`gkH2wBqIS%pb>+wBV +zRUzl*&i&8()=RT;uCIJ%RP_Xp;qza+@k!71+jsVj%`ID*z3FGSPK?Cjcidfo7(Wqy +zam={7x`Ld6)A!%_?KhquJL8Azr%#)3Q$bTl{or-2*KEsrByjeW{x1=-LzpHNE!Y%Kd^XxG>bxUsD{94}X +z(;M3+=a25M4D6}icKS(^UfFQg%srbYPki(C{mtR#x`v}3Y%c!&ww&Ibp{2Fs3ZE_5 +zK6%13Q?}1;du_@14}+&}m~-j5b4OpD-?+2z(w$Q_k1dS1ZaC`LwXe?|J$a|RDL?da +z`D@qZ{=GbS{pnpNx1IQ{#{c-kl$FoquMFno?*GHC4db3#I;LX%>StEXUXXYC%{kKk +z$8H{zf6f7A^>YL_%@SDv)|I@12)*Sz-(bsO27u~gE +z$$`hZ*H_3j6PK>3+jji4i67+Vl}z-lF*eO?tr=Ih{Jl+MCr7%c4=N=!#u=gT>MbXA +z7teU_{GI=K-#c&Yx#Fa`M=$?)+0Mc>ukD|^?K`9A*1Ue_Z$7y8m>++ws`A-A<97z0 +zJ9omU2C444iK~8jZv7<_+N#E0y6*X#^Hye`{=FXW{^Ra1KYjhUl9Ss$s%h9T{*zBO +zAOF))SE)bnHgC-R(75VJ>EmmPC-0te$-xU=%xZWjdhE($t3$bM-C4Wed2{!ajn5ok +zKlYle@n_XdkXN4mZe8E4?}ztK*>PXin>A(UZ25k6_Sn0&pK$v2l2I2$wtV)|ZEd4l +z@A!IS@9s-Kkmlx}k{IP#SvW!JJ*xJjx$CR556nACxq5KYlAEMS(dX?~drcf~@1W*X8F9Osx4}|6PkdIWYIyEB{dV&aTIoO1o-~8LZt} +zSTp+csfFu~dHcdMei*p*n7Q|E|LoJ?1f%u*jVHXKkG~*i?FsMaj-B-Um(Q#DRo2d> +zGfi+AV)go&U~R2Y)j2v5#&HPDvCO)UDk# +z@y&ZmX0EL(`o@@@*@N|?Je}+FpLoVNYQwijXD8p?UO2n8N$Xm@ZjLnf_}O3CIWMy7 +z_8(M)kDheywylY}^T*ycp>k8t9cA}_FmT=e>YRVfTwgU=ov?DrZH@0$`p+AqU9f!i +zaT8ZQSMvVAD_@^ny`%M^JAZ!J`yVXc`nxRo)uTHK+OD7Z+b7?u9lK%kF|bvd3Sx|EN(r +zK3e$p=v||_zcHmcr+V||m%p}g&))Uj$G)0dxcS8?@v@xYaR-X$jXpbTW&UT+D8>7K +z_V}+;H;m2wkI`LoHP6>WM#E{DX@N +zem3#N9pkTDbng#exZ_*V+8GBQJh|d~TlenT_sj$Pt{wRJ=J9Lp+y1LD*;4DShmP8@ +z{!9OL@}1dh4~|*%QqIJ$tlYHl=G5%$-qrP6uk9>f`=4_vF4BueuOIXK{r5ih@PXPJ +zdUwsq{?6PhpMGFd?p5!U{G)(8$;?$bam1h@@>sS}ve#ieb)IRm=ZR7om?!V#0tW$5AH{s$*ImfNv +zKl(qKU(LVnv>UU^zL8&e?tv-M-oI4Gf7AVsnvWm-@Y$>9%F*xmTV8#B_KdfZ>%RPQ +zcKnsu<#Uy1lQ-uVHjIBLPrh5J`SXRJdcU&e{u>^c@n)oF&+7Fh{;auck8aI+IWPEp +z{igNru2m7^LqX2y~osz&D!_VuU~bZ@jsi_Px-;E&zySYXY21SsK4&rX}A2~03?vST-HzvAKZpW1s)aZYdG +zz>F~^M&l%7{7oxIZTe{ZvNIP~Je6J99a7HS +zctTe8gRdohzo0`oB)eu6uEG*4(V$PRKg_pqBeuR_E=jPgCa=95{Mm$MiS1 +zoNz_!=K6unfk}CNJL_H#o^Yw0^J!c5569$v_o!sf&M|*_@2J^I@x=U5?{7X~%%sH+ +zR!6+AY@Bq%vc0M9`wO#M&&oKKi~5?;k&^<)iGW@f^?o9pCzR$G5(b)4KhPlXi|?zwgv**XLfmD`(>i*;9Ar +zRJ>T3^KSNzoV;tZ@-~-^Ia4k^YVN2TpBQs%&FR5SvG#qJjNLHm4|NMl&pdz23t#&E +z$6p$|Y4XVjvrm&J-94dr(zHp(?#e!6U-nnK${#GuK4Vw*lCNj4*p}bcI_l*2#%%jh +z{>(pJcwo}h9M7ds{cXV;FM0QTP_QMjV$X)FelQ_x!PoPz+?BPXcl^9~zD2X;L(j+Cx+plLX+&uVMD>yWCy7ZsdUVU}=t8WZ1{-o!&tM~tJX7`gUg2eq!5&zgxNf)3e`u +zWZQ4F%O6cJ1n};qC*wp8uk`F}J;YNBO_Mbn>;%Z>GC1KKDl-{dWF^pI>`p&w=#+br-v* +zx*p%y^Qo&Hi-SGR@h|_2J-hsaFZ}VNANkgUckS)zy8l1+Jos?OLPyV$+|H4XZQn{? +z`RI?*>w7!8kMH>HkM}HI?Rct>VD{FU;fywnXkOE +zv+zXMC$8=odTo2}i`xhM9iO;*^vds@8-26;j;mkzt(#8|{eJhzt$WLU$HL;5#=o}L +z`u?$npLeES+&FsEu2&xM?Ta^^?0D*bdUh`^_Sp~IR#^M`3qR?1FL(PFzS!5Z``%wX +zwd4EO?YhwE9skp(I(N=4E?m0hk)?+_E`R1Td(JL)ri`xojZg1*Y1f}Uv}gHv*E8RF +z`qyvjntScKgHbDaKwf|5hM`^eO>}?iYUg}+ +z*Yee;t}X67d%Ww8=Q@Aq^~*~yU-$Swd}H58*W!zvryjoW*+2aJneJ!5{m;*S@6Bgl +zzVXk0@Osa-Z5>D7Bnzg9c|86Uv>l602 +zDWJ!C^^WPEw^Tn@^Szb&x!&)$R|Q?leT1dIS8C|84WN8Q0%wVe=pe1)VVjjMx|HC2 +zZ*|cX$-kY7=#pVb9e24{S}CT(NHhuKhO)SAYo>E$dEW`u^r-0vqjl1*W_kmoe-E|O +zalJK)*=?<&9!iDji}QW0rLGS(Dakf0?Jc#{RbM?N0S6V}_8sZ0YpGjmtvA%yptr6q +zg%5(_x*AkJ65;$%cl`sZyUtsh?}!e&BEvu`Eq$oQ&QN1-MFieB#%%&ves05P +z(wi_g7KRdM~z^;oAm$CT;$zv!(T<%OCp36KRHyfiREm~g1Bo$W@1P8Bra99uO +zKD^&x&D!(fy>`B)q?}c$)Io{IOEIGMgD#|3I~rx&rxtcP8!hq8bK=OQv-oF=Jgo(^ +z#p%ebDKU78$W339&7KiMRCS7_nz0{7>nPGg9|&U`A*C#yo#|V0;HXr!;qV=4eAiLw +z5e5hJz?61$YSJ`Hf~jrVK-bB`aUGkrZ#0c`F4HClOpqT}GT>5>d>BX&o}ME$fOK|7 +z8$5X?Iy-M5$2ykwNjr7IKzh@~?X`K@H!96bh{lVC)>F(A6C=ZX$i>-2n^3?C)~;86qi0{So;sWY=Cca$b~6eo8|+!sq_yXNGL1s`4$ +z#Embh`J*(|qd3(|HhC}>eQ2YA3>A>U{ugltwt*fYw48rLsm +zYS?S&^EoGQa*hjc6H9dl|G|Dkuj&4JTAC3_f?d+iK)fLP7G01VlNG2?nc@^+B{j*&rrv1AuP +zKXM}pFb06JCYpz*wwWaCIAF)Mwc2#L*cy8nu!rTipTPIQhKXxU1Y&GP6cN>0J=o<=*`v>AxaENnyTVZ*JAHnMQZ +zz@^Ud>n>wU!HtZzvD?X)b5i~h$WJFSv`^7oS3*BWsHZg2i)IZz=JAFXNLg-uxCgb< +z%`t!iQQvNY4Ic86&L8A)fRE$J9zT={vRI(k)RSf&_7f+0!87NV@qeh3R=$ymoX +zovN5m`kR~|KIf&g@SB&HMoNWv7_vr0C<-Uz%DAJXv-CGPf5l!G6a&AL^U5J&j*y?n +zr#<|`$St}j8iIe4b63qZ`=UrmXH|%W5hQ^K@t2i9kof~vezF#nj?4xnAp#qgTRKaB +zIr-&^2)HXEh^>gAtrb!8=<8`Zt3n)%qFEJUV8l^R#;&8shv{5 +zKvzA`3!#*D%2=zKzFq>v+re)*wrlAHU;<+Yg40+({ubL%6yYMnJth`y16}gGRSgZ% +zHqancprIk!1{&oUG&siFz-yeLIjxOys`8Gj6;su&z06YTJ{ls_3Xv(?GJ^PAvUy~f +zU7yRKy}1k;W+P~GHiAuNqdjgNVj9LVXnP!MRdM&vA)9STNG<`+HWO&PGo6jXOkBaO +z2PKKaFcXL7Rwd3=uU8BlSZtFp2r^NDZLdlc1lg$CrChxb0x`zKqMV^bVwiE7_4?&3 +zs1OSyXF!Em7?fg042D=3Ib$ls!hkR+LLk6H;9~({FvvprVMRW>CZZ%6U?FN{pKb(E +zn1{o|k_@mAl6q8#af2{xrG7If=0}CNn7kK)M39RLoQgt;AQx3LE5ix~;Wls@jETzI +zjw?|Rj|Ab6VM0ubb*A`lmI5gz}-AQL6H +zplTlk`KSn#jPU|Eg}{+gg;*F1uh}xdLpX&(%_&QijIfYW=MjN2%)~i0333=?E;5R% +z4c=42APYsVN)SasCJMyfC5r4}YZ@#>U3G+Fnnqb~Ldf+y)Nh#BB|WaW-Bb;C9Bh?)%y}VT|$GjcQ|g +z6hKR7^%xiHROl<89^+!gv9Y3%5a#04=A*~B*uaZg8+ck<8(-mP=sWP1kMM5YJU``% +ztq84aQ?PX-AlrIHXD9h;+>nrrrkzxUlJmE|2b4dSt}QxMQbeR;44kLhnS7OnTorpQhz=?$#=>bssbV~w +zHke_Qg^UlUmcT);*Ay&CSPOD_xqI;f7=@ED+7X0#0`V0y^EsT%uLq?VZ_yHX=zN|e +z@FTcNVdCQ~CYHo2p`b5ZErEx2^b^09z(a4sD0B{lZKZKoF@my{7EO5>DKoQG{} +zZab~jmunQ~VYO{Hj53i;gmQ^ZDUo=i9%JE9#4!qUF^&#O_`4b49c;uN2md!pWGL +z7u$2gC)bZoZ^qa0*xe+r`9J&-Bxk90)0mQsUyoS#I*)U2M9eKNI^6ikY=&BjuF~OZ_24{z +ze!30@L$PQTNo>yi`6at3AxlXTIhf0|Eczs-$9On>spttjG}x$(pn=q)W#AerZKuwN +z_eD_-vRcGvTZNQS9x{50jG_!=PE0tcy-TEuGLUe8f(=L_Rg{B-UYV5*g_Kb)(y7#R +zWTHMzENjTF<4N2STrZ@FFwVxtNJ>xQmY}izSPBSjoojr +z_aSrF;#_P!+)wlb23n~AY7rJH)>(_YY0jV5moaw@%NOD3{2Nc=mk^y0=i7T`7TNJ5 +za~NbG;Poq~?>$ih6Rph*Pwz0y8k-%i_914j*lUd=r6=)9h~D$&`44*Y=RsUsZ0dnT +zswfLti?}95*eH!-MhQH$#w}%xiHprol)yvBxMUdTVH+!E*XxVhbc~v#1P;0$l;CFV +zsyT`h80e~9kT4Nq<=0*u=J`(!^YQcYJpaH(m49prBOqLi7HyxJ; +zR+jKLD9C5q@B}`1cp{UT7&@|vCvY$iOE|ItKVg)eidQvk%c-TnWbChm&DbsNziNa0 +zR_kbK|8+bwJlN#_XDlQBd}#mmUHF;2>BPbeSYb6_rj5n3)AMsPM!Iic;Lgm +z69y2k0k(-wIu+9$7??c+MkF9R(0EDQ@@l64bjn2|sOEJuucliA6RA0LZE`FWMw4<~3P8tvi>E({`omT&&wo)=y2>vde<_qzzPGG#UNFyg!X!%BIoy +z`Y_U}yqKxzWJ98x!{hxC$f +z7&53uzJql4ATefC5Io-qyh3fwtlBhJ4tgxQtV+i* +z;P<4-<~&TXs7oA4(E$|HYl-o5(7R3^I3$>_#R(I$uRJf2JDz+BH+To(uO5m{^_k$Z;K2Bo7IqsGR4m_TtK3 +zY|3jKShmI1Xc@B>nkPLd7rxxMhV_kWIGv4KeU5Eh2+k`bX{#D`NW0N#NyJIQr+o +z)~4=*IWTdAuMmTRdIJg$0w*qmLzyVo#{(Rx)ZJ0iJsJ>={rhsujk16PoJt>@#^4A| +zqXX_(D(FcJyc>l7>`krO8#vI7xh8YjRrtr`KrTyTN3)`kVkXNuuetOK0(cBS`%Tyn +zj?y|;Tt~TNQo94qQNa_3NP}iZ`DoKtzof=tX+J!oN3hAasWovV%wb8GFfeDxx26cC +z4&VVtaZ!NtB`;USyEvG2h8BsExfrGr5Jn;{7 +zx+JzS^4o(v5g3NZE%(#BCs@2==@tpC&^|EKLC$tWE6Tw5!~LW`bzr3_FSSP``eNYV +zq(i5ZdKGsrQazkVK_B3wnAn5RAwUIOSX6;`yMD>cp)u;*#wJkZ%nuJ_aKsQyJRC1@ +z;1mrWQUc}^TnW0MdkKQ&jtmZ8jRSqH6+G~X31bDbq3DqgCs3pqRJ(e~w$vGc#y317 +z;$Tf+c~x=eGvEhu(hqsRf*;G1Nrvr;LqZsG3WTvkOud=$E#BQs+b|OMxk20ifDAeJI>Bp2ZWxu#Ulx +zhxuY^rbn6GS=m)3se4*A5~$VcZh?A1s-6XnMvlsis)|--Ms`MKExil_w%I-AvjH3P +z9*oCevxAMz!`Q55HJibJ$3Gj4H!vUO<9UDBVBS63z31Mzk(ni_o54Q|rlpLyarb-f +zS^o$BdmsMyZv5|i@xO1TqDJ~Nf8K}xed}PlN&ncDf0!q!JfZURSquN$#{WK#|9uhv +zdkz14oeI$xXYjur{BM{3+ok_@y}bg5=`utS0j;Ky5&`5B-OmTbu%L{sDaIP&oNyLZ +zLs7~ZoY!Y(W^NRN?qwCTQ+Z((iNCp>4MSsY>t|=cRGDc!LF@P)VN*|}t?hg;Xm{+J +zZS^MW-NYnm>h+F$4UwbijuGh8>ydjs$`1e#N4=c5m%VIa_Qh__hffunxlODJCX~3{VK%v$Ueoh@y-gD>pPg`@Wn-}O +zm18sQ*LacmlWy|3IaiQ+$6Q9KZCxKUBmt(+JVgm<|0|Li`Jo859FduvR~H7B<2w-2 +z%i$FYsnEuT>opV|+W_W%WZ33OK^fu(vpjJeQm{4ne7^^FX}?b*tdeAMW`pDvkum$R +zx%Xz6oCf@Ui1!|vHt9;ntb|j^gb1Rv>lOE+5OLCbZ0rOE!rAw+8Z6Wy5834B&aI!I{^7fLH-4)QBw_bF=F5z&QY|P3Nsetl!5pS +z75j^AHj|aO+@|7Wqy1u%aC%%>G| +z!polFl*Q>j?uU)f;dAVxV2Nv6H^Rml0fy4)TD1@MDZIg1+p{|= +zG0&&k)G`V>*4&*fkh}x(M>%8j!(Kj~s%Z}fWsc<7)kB97G#|uV7CELRJ&=^A(P>5H +z?lA8c879Z|X}i!t%wcA)yo#p)HE#Xd707yc)WUW679;?Cq5+tWxogMt^^!<_91A9a+Q|1vNxwQ9=#&CRE)brI< +zCsU1%h~tvfmYF>Pmv&fTc{ugXR<;8-cu|d5+5_W~?!ItBhHh0X +z4tt8B94S~gc@ikkK~cfcR25>IOVkIMzVpg#3uMM(1lMd9RTn8Zb|y#~fngC{N5800 +zwLxjS^WnIJgbstFt{4C}ID4JaTy3nJtLL)w)K*s3M?Uz-do#yoIX|qcgk_lunlBECwm<08azj7!AJ+X>D-Mcm!uqs>YZ-*jG3h8xLZih))=9J>25#=w(Z| +zFcAC5#Ua?wB&Y$)pn3)#k|!We7iu=SGbq#S(Gtrs!KnjHF7|jE4}xJ*Q?O?7g*!cR +z!jLm~VfImXxnn(>AQwr-@JSAG5lysdDBG??F3aFp?96!GsE-e+DQfIz1sz4z8+4V% +zyL}GyV(`10JX8YJwPTS2?u%gtrX8TQWXd2t-ewYv1It0ic+|P^B)S#TLqnOlMdWkU +zJS7WHx-%%z0Jw@_E^Wz^Zp4&JNQUyPLX+F}tQhn|(;Dw=v{NDrZWUOzVYW#C%f?lA +z5>bnh;1zZT^fgGh_%5q9(FBAdkTn#ViP`Dy$$izvfnRkyQxDvn>g)(_GAC=9Q^F*P +z#91_tpGibeip#wAbFhNM<=(ValWyBaz%<>rz8jQ1^sQh7+BE+JLfO_PO4LgMt!Tlf +z7)p{QBcD3+u`=!>DKcDl^yP)5);1v;iIXOZm$V$5Ts>nhmWpQGfj)p?v +z%55f4JXWOPH>APH_U00N%y7}DUD`fkz8A(iREYwSWHA?y21XF{vyq6qs$tmFGE02! +z>l3b~TPFKy{~KioAk>~dSP*%69?#DNh7Jw@(4M)~ +zNQ8jb+7KVz0E%Sm^8|iIV4r~rrXqN_$Y%n4aB$Xrh3Gg+3Q@Fdn8G +zAI>|F8Q4qGC~}0QWb;~OVTRulZ_MsKm2S5j;Z;n<4K>R5Q4WK<1gRPG7~&~p>x<2h +zy}#TLA(v}a_6%pDhX7!1|G(!H(>Cq=CY@@A_tPyJ=7d;ooFn=pj0Yq=O{nF1dEI>8WxK +zGN!8CY=U%xi(XqnuW+YuaeSI+G^~=qEIV$MlF0(k1y5*AjX5@LE7PfW)7npAR%Vq9 +z*XrnrKWB1H2~pwXMdsl_Jr581R~+vr#YyuCC$_X@*u6nJBrj_@LkjeJdTxjn~4ey-REHKZx$q^f*-BtPr{B^wtYAGE{hZGcZxj2f5IwA +zPn`jVePG0}0_79jlDp_#$$U2oo+oYEb1ixTGv(5tqtJO$37yQdm=d`NC9* +zW}i~8^_+?3k +zoNZu4oZ-5!LX2>;NpeOkNd^`6HN#92gIPR|8wWRv6odEv*aBMa#xD27L&=%)z +z`MqYfpg9gzIih2V7J)8nFWK)!Y!_grOTkBp?-PyiH8? +zj*OEv4bBd0&!h&Cxb|PU)NTl)X7G`|DyafdRQ` +znc6Gxxb5?85G@b~_ +z5%~nP)A}CG~TiX=_6tybZ5@yU+oIrt*RjbNRG9T?1lah~!6Z~BO +zK@yZ|Vm1}4DU9aD%#cvKHlVwJQwJJl=b=rTQPpn*p3>=wYa^!AO#M8--O2=owOs%w{N9@2NkxH?jSa1Xfm0p!cUao%yu(C7n%V;V!F$$Q^X6 +zpkw4+wG%wW;r7hf6|AB#wlpuiZoCVT58Nyedu<9mSC9acU+*R~ArGw4N?WOD*Sl%I7>! +zt(-$VbtW)1lbO{-pyLiYP&@xr@P#3lgUZ%ns0a;@hyv)eOt+uPD&R~^4=;2jw81(G +z7_m`_n!?(PDo2aTIG5~1VJC_BtBmD#E2y0c1+`NssO`;0H>*HQgG**MDyE(iQJm_5 +zU=h_O+hGrCV2cqr^_gE#hJ(I*uR1*~bVkq|MzLLeE;=oMkz=B5zpz>mHoez8Fsgi5 +z^vXdwa<>_E2JW-xp`P>_TxOfB55J&B89SXA +z&rh}9!EIu7K$;_4nS|FlbD1Ta;0%q?S7v%Sf(p5ds+>)F6w+ubhYCpsz#bEe4GXwQ +zjwhm0!Si8i1muTdry3Ox=grP}_JY3|KsEifFc4mWwbV^92aa<@YDosN`l4CXDR;o(SV-0g_ +zrb)6slG*KZbPTbNpt{~Zhmj}v+mT3irGVh{0V(as50i%#5wcHdA^Vip%*a+a8E%D> +zE9aahG@{=_JES=uv%$20=u&r=v1%P8V;!wWjE6170=V8%j_Kz3qd~r7BpgFi$RW!X +zWPfTT3tW_t2cRt36mqc%naSD)n?HQZVP-j~T{vU`ymGQCvRO=L;FI-QC>rfW^9IEz +zD#IV7&qLvkE^MB@n7mFt!Ga)e)eD-ZFZ$ci4iP%dp`vxI&1rQZXswM>O(-@aA-^Y? +zZ*r@lIPk0w0;R-(i|=$k+67zRPVk|%DU)j#U#LT;nFFz9gmLqt0R>ZrHAaZS4rH_J +zAUg^w+Q|=`D!5h?b_0n!2TIaiiu(7XR4G?ZR2bTYpIR@p*d{{HS-z1yrVAS!X%8an +z`Gdw>=8{qf1fN(RCvSeiLgSVKCmHv@*mkTpDprKjBs+l@Xy`Fz!C+8rrZsLLSbEQ! +zKxv{J<)G^}hmK{S8N?Q+m7WU<(j<#FjJ&po%tf6~;DUlVC3Ddpd98T@Pm!KYPx3#_ +zm2j=NZXOi(u6NRnHMP&dx@b*wC#@#PY`=}Q4lYRvkqJ9H5W4FOf7eb)QEUHlGDTqp +zr;#o1E17r#`f1BFbh0fg#QuL3L1M6vY)x>%*cUz2!%li+24`L$s*#!H#cR9L&Pirh +z_>!gym^%uB%tP&*T7igy?w0g(zP56%jxGfXH)zzT}qn +zSn#H=u3qquSfaHJ-j~PHIaCcg2aLYFn6m^Si7h-=IY&l&1$oe8z|BP%e6 +zEA_roeXs@54OwdPi_>_d1)$~X)90ZPj9P9k^kRCAOSxy)<2{R4Nb1s?gxQD75P#WmmI +zY%cJmn(5p=M`?g6drhPRKb(apA}Rp7d0-$7QKf4wUY7W@%-by;mM`U?(oU&v7UMDd +zNl=8-p=KZ5E`Z`^;?&J{SP_Wx{z#DBw!0FwtHktD=tMbg-VA)qTq8<%XAKN0&WDw8 +zXgtm;7udohLURf4KO-Ly0|*Y=rj}6-0t*8l&6mxI@lQx1SCxwRFtQ2^?;t8v41_ph +z`Jw0+<*;HVpl|nj9z$6$uL+#Oy>%{Oqw-+E^jZEMCP(W*i%~)*@fLQt%}R_wYj8Te +zfei@4<5 +z@ieFl!*VAW)FXx_(AYX}BUI_pZG*^md%UF-0)$-mk<%dELWhi)Dj|(&0!W1&KE1x2 +z25XD=I~K7%P4;liQ6v=oWHvK~%&?Y^0HAb1 +z5Rt2CKDKC%MqZxyMF@2ur9gz7l!wv%0l*L*a|^@RH@q>{wyr{8@(umtB=y7`lVD2B +zys0^hGUTvj{CLMc#~%t>3)H!vO;m%Zn^eDH{M6vtR8pa|RG-_O;PFQM@ks_1;^vDT +zyue$!12(wF^}#-}-Ds0okI2TYHqHW9NoS+wcN!5!)@(JlDFP+&8*2ku48O;6u?lu$ +z6}b788I~oM58ZozJ^kml8UN$-UVk#=BRdQJrg%c)U+qzc-7rH4*+D@b5#)3x^dt|o +zc23cN_fm=B$4VW9#EQZ!CF&WO6!b8Fs4}<`Y+%sa?}JvUZKD2qa6cxjg}3AmlZm4p2>!7Lj>N(g9#tS!vb!wr{+1aFnPOn&2SCgVi72eY8>e +zLg33YPFx8L6rD<)ceZxg!N_p4$P!`sq@f^Swx#C?*@TP>7xUd-7(Y}SYexBj<))`4 +zv7D?21wDbh4PE6L27(KCYu7StX;jyO#5@vVm~{2?1ateH_+Cad`tbP0kO^M$X5)i> +zLoPN!A`buV*pd<#IgUUXY< +zyRMkIZ~c;I5v2_&mF2$|-A%W6%{X$cr!lI|wzmv$sx~s2ln5j5B-1dQlNd+QQ<@K$ +zFu_2;0B%8IQm{C}71}c|R7#?XqnFiA(^XZ?yQYFG?xnh=?)YU=`D3_I)JC!RZXqd5 +ztY%HuOL(K`kQcg6>0&|ODI3)8`gsdCixLCx55>UyjTk6bzyBb$~p3Te^|K@cvBU+#S8Y8DAp_lhXvtc)yCGI=bV5avKN{@ +z)GB(IhL;zZ_i%e1T`aYz7&xZ@iB<0k56j#@kv%6D|8Ps +z;_8qB?gwIT6C6v;FJHO35!_3&lf}AjpQ30j-c&<`f>McEg{6g00URaIg@o48x}9K9 +zSy(aI#2WxlumP<SH(C(bipd`n*NNSXNw^|xZ$q;@^pgJ$>%i54?kVh}*o&0Xa%G-xwf +za(k#Vd6GV~sYm&CAy6%w?CLGsNht7&T|^M# +zv79=D3fvP6QPJ^~))GlLN;I4yQSyCiM~2N&-N&9d>mEd&ixf%;LkE-lqyXT>Fwin; +ztvjvv#A!?JCix&^7wNelZ|ILV=wm~8b`j@l?w2R^mnRjKWlL1g@B)O#ZtICvb4phu +z9&t}M%?a9j@#U}>&6b}I_Z?88lB~DK9TZo9;cw)PHP$?Qq&n>w6c|#`1R9*nj?(6cSt_G2V-av8SLOZss-%#*q=l!zGJ!iw6#S6=N +zf{E`Mu(kjPW8MEa*#>yeW#|MOWAzq{#hOQ2Ec`%6+tLKFC=sVJ?(L{lPG2da(f9MD +z#qp9$_D*XpQZYAwe2iRNZ@P^| +zoNAyxUCMgWLRVG96*3>f0fa~|&@>e69yzZfbg>Bl>B0{2aQum($(=JX8~!S)37x-+ +zC;jjE)aqShzO&E-jSI-%>DjM+hfxjv+Ianz4?9O4HBzYo9Qa7*(A~n9u57#QZ753sPX&?Mes~ix6h?DzkVga{xs^y1$y!M-WPDH(kH2 +zgpBth7u5S=-D5%rB6dI{0seFtXN4@ldB;3GIkq};EyC;IGUrAXW4g{D`@kV4)W>_J +zkFBiFnRa9mEPQ6Gnr%-3E)C!EhxgdGe2*JO%lrI3TcBU;BPN{v_HOrW*`E!{wpP!* +z*S-{N)PgGBOem#^>%8mXDBsQ41&4259Q26u#|Quu#ssr?qG6jf&_yB$7&R`#lUg=3 +zOUAdU17L~!^kD>t8WNjHBte|Rf_=n;gl31&_qJBox~J_H1y*u4wfJC&C}NSADfWL- +zmeaa}Fj&Z8)-@b;R(ZE@mfme{i?e6VKUN_J!(Ml1P?nQccHegUo^8)FK(fzG<;+ZS +zfN|_|vR}cg#7*$CmO_$#uj!b +zB0o44fH&+gNd`W&DKY%C8NPdjh2KG$Pt!USp|qZWh=s$CBr19l0MS8f!Z5gJ&k78# +z0B@V+HvRQMDlr(HH@XAGMYt~t@vzxZrV?ISlm4~TFD1nN +zh_kSP%JWGAT}oR51}5lC0d|wM8d7Q%TjO?swZwQG;ON76PNAD5LCxcBLoCmcRsEou +zz&fqa_vVb6qjZEgL8$*`z%DW|QkkU1Km_&fBZ;vNft)4GeTiqT4rgk1(tc6SssRuI +zb7iB#oV!E&Lo5m8dyl<0^GSz_G7if2aEXm9@Ks^~65+d*{Mi-s+b8I)I-QHa9C|*p +z9-I-9Aik(QtnAfqS#er>4{VysD875?JWo_l`SwY}bfhOcZXE!hjw-Q{i +zcD?S`Hoa!5vdTB*)%_>OwdfUI-__*g@)^=G&mI5K>ox*-sgnwOi8^jLbYg_=DL+vHX +zjh*ty-d4mf&%LXd06b&8qE&r7b+#h7n;61~_ghlzDA$zm3Q9dLdNV2Ac50}dMO>+# +zjZ#Gw?H-#pkJG#5UGu}+og`7we*-J)lRgHSO9Pav2@st-Niz@IKrxzaG* +zIM(JdAi4`v9ipjN91#-Bsuy*a^4XrJoZ;uuaORx1x-juOr_kt>$;@A +z4~90GoK>()uQinJ1U(YJ2GHb7;^IlZi-3p-QrwXo(W6x$4$S``*Said_py$HMUTMzCiduFxW86K4JY_Au-*?eV@TQvv +z6M?x0c35?QK*HE*XC)+Zm2>c&*RakxKNZwp;#)8!Ei8WcjaWU%bs({0ZFf`uJl-Fk +z$NN{#Jw<&%X;0BVIh)c~fC^%Y$ILT{!|dp49&{+I3$TAMo@}q!g_#>qiW0EZ{d-XI +zqh{h`w@4%4bO&cSduF%m<>{m!UZPIE2r((^o2gXVLb|~U-uG&EPtIp9xM}29rnRiV +zZ94(c%?l^R(pQi0a_ZiQTnKdY`bsM)_Fh{mQM!+bAZIA(bP9N6M3K-;j81C+%i(?C +zZHfoNP4R#s(zvV_l&#&r92-sX)*7i`@KOn3SF(SmzxFsQPG877%i-`Lvaf4TXDD{S +z-xP}}Foxwsy%PG1oSbzeB3_MYhG58Azhz8#ZNmn=@v1n%(51wBlRU4zJ+5KxU^2Ll +zFJJT=P3%i@TS0*F=czyWn0~*=RhS3Y`2*Y1LKM+>EYk~f;+$R}#}?ZMY0C4NCa)Ha +z-Q`&?2;dQW%JdM^({Y+VQ~x^P6qvs^tVW?vDK1FdKd@^Ch#iw7LgBiZi;5a*(7Fgt +zeIxHSEH`kzu@?vsjD1*ul^}rhUSV_H6(d4XVibpZ3#w{7B(b^+zuHc!L;MTXrN7h1f5DL3tlaY-1BBL +zw$|Iw?cGfRDOfpL*-QccU>(ephwV;!?c^F1*f_bFo;sbrILC#3uH*U?+Ivx+Oky`Dwy-U?H_(RG5H>EPBC_|ady4Ng5#Z-gBzDcY +zWC>Uu&q`^-jtc@}lpQ;$L6kS<*#S4>{j#8Nn~r2!rSW+^7B7!lr`t(jC9O9-50HoE +z7e_EewsAlAatux#cRUvl$VDtD4un6F~w)NlA~H +z5xC4sP)4%dr>@AgYeAXoqETqi-(owhS`UsrP~T(P?lI2p3tJQo=frD5?txWei-hGT +zVBL-m@S&{hn8uf)$kd9n+}3jVvo!+BFjr>xm@d&{yyGg8LbBm@u{$%8NgheR$?-yf +zlabfBu^swnYq#A!Y-JiM3T}miayIBA8Xdu=t2t75Ka9MFTn*P_nOs1QDYyd}Fl+~< +z1`SSaCU^qI1kB%61pT#Ilqu%w;X&BsKU7(%$J}j9W)Tf?jeb;r?27<)* +zwxDa!Ue(tSd|>ex_}a-heOWLQz)%glW5CJ96~QpA+@@x8V@OwS1edZid*E+Cvv3p&cl3(fYP6jqr9 +z$nD{w!5A);8c_8*HD?W7(MCs%`d*CaJmEIq23SDTW>W7d$5X=2RMp|-u$PU;`N%>& +zszfVvMmr3JHr)$xXMoQDg)HxLpIcHXV>db75FL3+5*nLO3+h5j$b?J~WPnm@pjM1d +z%?LVSH=*2RVjCh~2|MY&ii}$X_qn!~GHjHn_8s&-*+}m}(IoJt)Zz-d{gO*sX5Amf +zN%*k6DPKj}W!L1q?^lnm8PY&wH$|FJtnY&%>-(T$eIIsFClM=wQqDx;RJ4x9zLtP; +z%X)58SS`SRQ!xYrk24ly29T{Y7EJ&zn$hz(8FlR;COhQ&sbZsu1xdyRfQk$^l6V|o +z_~8@&N46e6Oum+ATejTX` +z?pjpK5fes6U8e$Mr|!*dpMWKO*DIm +z^}m-pKwUxL*D`*>xdE#nL!ZwqIDpRvI*{7y3-yUwvq8zRN#JXiP8k%RGUZuVc?*(G +zJ}0O{miEnP3Q32if#|0t#Lf;&7uNwm?h97|xG=tYAD4BxvC{$WxqH +zj2gZwd%t>xXOo=K7Oa2v$N~wJVZ=>0dDuE|NOkrqtc0xK5>j9iqYOH?4~%`q9M~c9 +zAmwvros0XRo{C7Ay{D|tJ@A%rzlTAw#9vJEq!vT$2@#~-auj#05ySl;>Q1O#_hUz| +zvu-?yD0PP-mT`!66IOMmvr7cw0#wLam-Qzu0-=+rxFy{ZC$i{+|GGsl(ea9`k`XY* +zM4T^{36d0CGLB@1Q{l8L&`FRygZ7*kKaCN;@?^Ws1hyGEfkKLLbDNSsDzKi1hWu&A +zJMfsDVXjFW`Y;hG&n0PM=r}!gx4DDSQz*FyQ798Y#v*k_d{wBIf&p1i6n(-Td)a8z +zp1=)iBl(!4LNO|$q_r_{5`)TcM6N_qTFi3|eb^ifw;*&+MXW6wlgGsuHGC(c@O*in +z>=@3N?la^ub}QgjT3ILERtRkN%`U#_K)6%vHF#C=9IkgZIw$Ka0Nez5OyxDq2x^Hu +zneFxlXeLGQOm)1yYg@t}%Z2loFKf%jQ|GUofBfRs#Vc2Jkl9Y_q#q=hojqyBch)(L +zwao8R?OK6T`gJEg-EMe2fq1C(HTQZQUW;oRzSkY#_Zzy8yUl&Xbr7erv;}9tOkvx8 +z7w>u}O&5P>#?(pQ)}Hs>=`?+td}0dgp=4)I<2b`lHq!K@CoEi1C_vWC;vCGIfNPgc +zBXViSy4Fs>i7D5C&RYnH|DT#7bEM +zK9>oO>pPbaA)uRthqY8&9-c?w@N@slxpz1Skt?%$9^Zs>i5cP?Y>KY%8sr91E;0y?j)I{$>|qkMQ9&iC*|3DFjGRRxgq|+~ +zpD?1$*K^5*KM=9(CkGJobXby0gJvE3=9{mf_QSB;iNh1@6-T^-kiQiCrAE`%VcW0V +zbN{6tAKq)t(XlRphDYZa3L)FLimNDk5;`Ygg@FBn}o7>v# +z#n2xGlE>JS$eD7qD&*+w(Y@N0jcNugxa +zr2=MuNmVJD4l*T5`x$Ip+UtZ7x2@%5m{xld(1%ie811Sqo4}Fqft7O?A*vvK3=%G) +z9nZUJ +z632`Yvt($;1ra^r$WJpv&5R&0DGkj8N5)~E@diO>;H)BIN?A>~14D>O*>$ey)P;V| +zb{w0WPkd6`mylzPrwhzAe(GQ>BC~-%)J&)Y?tvSEd2b5G8_G*anD1qae681#H}Bz` +zd!)o}zrcm&Z7b&Q~%H$nATELEXK40@}{B8t1(t(?RduFi2IP7cwY2wPZn>0h}8ZGLK-v84nq7 +z-t#H$7;I?AaHK9HI0*fAlwq{|0cow!9iGAbZA8~}&&D!KB2_jq5%!IdHF^?|uXT~k +zE`qxiN2T7lVZOBf1ob{q>IXBoeYEm%^=!A)icS!fDf=1G%)aD8p?&bq+{I7c%#S!e +z)iy-8+)-iSPB$ZW?S))s_2+x +zn>;&1XKSv`Wg8cC3@=Z2E!DXFM&%numbU1QVwIRV?tS>E1seh5OT__{g&)FsB(&1@j~RwOJTG;?(>|Legi$$2jeA;Wcn5Y`sfb1t&0uFPE#z>ziE4Z7DF&DB)fyhB1S{Bc% +zsak^5aGT0QiEmExY0tS{xQ{u21#h^$@&Jh?#p)xW;*jtVO@%ap6uhls*E@blMaPd4 +z!zbk3-!~jJxcumz^e{EJ;odpZa^_KqZEL@03MZ2fa=Ve$x6N%TN@wtJMCWLa*;2$7 +z*%XeqK*q~bSwmz5r=2-#&W9J6nB;&v?*YFBP0k@sN@%O;JZ%6MYD+o3+&oyLhYvi3 +z{XoiEl?tT7jl-Ht3;_ZU{FYCt+QP_GxX$QzRG1B-$*&!N>=buFdzpIGKtV-pnuf$i +z!rjVCjOFV?_LJ!XFhd1EjBjF7Mby({;&u^L7ZO-@VS`dAqVFVDZ& +zA#$M|4INk!G9{>;AZwNyjWzNWqy6%xM58Dc%Ashw8U%Spw8-xEbM@_H#UN=FQ}U%b +zvd%{Y55&Qe6rJpl`pp|Wkm$yOdpAJs@(zS^S)E+kX2q;fIqz|i6We%H}VD?wA6JakmZoy^%aCamr>iw#Hq=Rl;^X-i^ +zZI$Eoj`?E4ZU)wfNG?9NZ^rAg3Da`oz1Xn3Gol`O$l>ZJo}LtVp)^HnVOmP>g+3{7 +z>gZ6+vQw5-H;lHgEUoaqo##I5LtXz-bc#zD}5aTlFmBk)Y~!Y8au6&_HXLQmn`1mO~}*9)wZpWmT)n +zSCUG;VTOsU!$_lA0wSWwP_j4hsCvWKU+|ds>Qk=$~>ama4PEt#hl6#0YsvjZP$pzYK%xcB)d|X^WhV^_f^TD0duw08o1|9HeiI0 +zS_Ajp(Giq&I(qkQG|+JYKlT|1OO^oSNQimm`hDd_`<~K;kA^3vxyR%3pw{C?bi~^n +zLU3i6rfox35y?^|-~n3UGdae1W}~4RPZY>8VDRc>(bVC{Vn`5uTIkU}NAna`P9w2f +zEs4ynHj+8hk2;yt>Ls75bzKvt+!kd31teZ|4azig4KYHfFQ#_)#tqYpTcv%`mORS$ +zkxug%2qrus*3Bzzd9rwW@#doPjn}T3;1=*Qc+Ub@##-O3ZZ=z3jrS-w2GVUUk%Tj9-1lNIxIgscD} +z7_E!HUeQ%CFHJ32R{q2mhZI73Rl-(Ctr&0Q&E+@^{&if9@|Xh+Qm +zpwf}LkaUW~50fyPkhg(_f3(hjXk YXxC^qAC}G&Q`96+aR{7@ixnC?xYwp`@XY^ +zXyWb8+YLaF)cVtg9}d@pEx+yycCO$?P;etGXu5&boyEesX?Tp=JJyxDWgU@Nt-Zxz +zF$;cCgQI8u?7S;#-VDL1b0&7w!Pl7|g2@ZY%C4xNFW|1mI2&*wQ8PYKLLk(7JD8}E +zSTcp&i-jZ20DA@5QruSemW{76wT=9{%*?c&q>#2X-(f!W)Kj$Re&T3VvkKcyz%7FC +z0*RM1n8IxrBpTjtbxsH1racF|u6JS)a~jjcB@LybFV@Un73o5x~>c&njn+M><2O>>nsZnQkQ(V}-(126Tm +z?X_EZr|Ie +z?v7Y}FkN_$V@}{8sOyG2IGjEj2yzE(kFy~ufGw0r#x1EHC5=>HPGck8M^iDM$gREH +znvTW%z=j{-Rj%F4kFMK#8d)tYD@T-J?9G>fGG#A3vsiMDgu!lwhvdL +z&2`M1YTsXdUp}FxjfjGS4-UrJdSw9z=i>1#gy`E_mI-NWMVK!hF=xO%c=iV0&g~=&u&B8ui}4EE+zQ +z9UQ!912m2YSI%8@Vb`G_?L#?u+bh>h@Y-T=v)o}fG)diJ4Y;0jTf)Iw?6^j7pEaMO +zeAtmKLN0LVI^{YhxI7T~p*o{O#wDPRaH*Y}U1DADr01Ty9qC_GJvOJ1S9Q>1-}w)n +z76?onv^Qpdcauv~>q8Sj2AX3vn~>WbJFpKqro^^l!EC2x;#}31>KW$&A}mpg@qoGH +zNSoYSYxaC*6nY)YD{4d?lFy2%V&d8`vx}a>gf8SlP +zAnLRh2pcA~zO|uyyUAFzyZ$D{lf7fq+H`4xA3E4Y}F?j7oXMmnq%39r0==veLG2b4lGJ +z+lvTUU-K`s^|h6AkFqcC1@h%BY}yaG(>(v%Y&IGX*M!nOF|s*S~P^6 +z(bAw>q{uHJ(Ud7Y$_wl{!JnC#EFp~}MD|l{u)AFPvdR!kDGO14n6F~$@Nu*v7ognA +z5#)$~ARF*VrXUvRT_x4q-eVZASxjDDMzssvnk7LsnaTmA9sC;1-vBSbWzgpv^Nqpw +zF1lF(HrMbv!m<>)d-nb6+ +z)~02dRs)RH=qG+s`Jg04Jpw#KwMTQu^S0$~(@wh4Xf$8M9 +zEQkm4kfKYBk`tICGv@WRHJ+`EJn8LzUx!FjmWHZaF-{Uli914wP~y+Cq$?(Kpo~!QiOdr?rZyrG7(>9{YUC%D;)37WNI;C8} +z@%&mjY8g=NEu0u#1>7GrEhIYAtFxe|wYAJ}x_8K&++@h(9D<3fIEM%l546hO%s +zUps=P?k0@%{OGNY9HCR(*Dz9T2#bx{vBNAl4iegFu;TCbL@6|bPePrhr>vn8U6`pk +zM(n+yrifaF!{0pgGwgX2JHVKJZUcII-ihcK$AF1>F%dN}T%6lJ4@;v}+nq!lyHx79@{vPgtDUxft0q5{K9c3?=!Mvb^^tekr% +zpgM2qaBZO^=W*}{@IDB=W;F<5IOdj{zrQwH7pju1=~Ya}-q98e2~AJNt=L4VfrL +zaI15gT^6dQ9Aanle{dMO-STw04j|W?VSoz^Mk6fozVioW|1#iMpo=45Usblg!bT1tRcHatP>i;%Gk~n|p*JAyFfQXo-v+(oLQo4JchQ>03=Ds-d(x +zGFSA_P=Y&66?MlPL{OBxkeJ&3pNtZhIv;!+{+w&OopS&1Tg&a+vr*sH&T^dQQ0hP +zjR*=P9|Z>&X!b#wLeB9spiLZ7Zn^^jbM;RJ?_j{du!kLDwukbolV)~E%+^u59EkYX +zr1a?9t{LKqD53|DeMW};n-celhD(c$BAXZ!df)aUspRUCOx^74!K`v%Ct<>}Ig5B{ +zgdIali-<*cxQjNexpdKoY>KToZHQ)TfNL2`);olcJyOc((_tI-WGW1WJ2!eIS#}cO +zDtX87y&~B@7&$Jm8j?$ZQZq9=Uyaxk+v;cEvHA}LX|TWezUD3A)zY?`Rdxeke|KU# +zAhWR4wp~ojmR@qW@c>7Ibo+3ZP{*8=+kQ=uA|-%|At&h37|S}NN{cg9n)28paNQ1J +zWWm+HWY>A72;l69z+97;gx*`r03t}#L$x4b7m0%NER<3%ei>CQhZM^3O(q!IRI<(mYwO*EK%PHCjDt5&@1()CuW+EUPt&Mx6h*i+he|r$X9G=#e +z^BTxH+n%>IH`^;$0c9DQ2K;wjf^>-!K>sYuR(9|D{O>2Rk2`7Qb&Cd(-MektTV2p0 +z__!T$B{Scyn8B~uY48g1bZ~8O=dE|D$HnXrW{dV`J%LTJd(PB2o&_3Xo=%(d*W%EZgsJS|&Lf9l{%~+rddjb35-+vR +zb+10?7Z*_IqlV8Ik=pKKDIg(a40p%3I9lZGwE2m)*3X^PI*yYo=YSbF4;eDZvX(x@ +zdEPDoG}BJj%USQSF1X-?8I(&_8iG2i0`rczw{=qC(#WEhqbyu=X0maqLP#`fE16)1 +z!`TQEk0jzUM2-U3n5zgaSp%X;=yZs_S|ugNsTiI~kewMJ*31`LF9*4s8T0`&ZR{yi +zVRtXWAzTFR6|YML#{^QD@-Xcn-87R)aO>PI^c<|J+o&DiFZ$$w1kM}1NhvoujS_7~ +z_#9!bG~!$_QTHlmrNd;Z7ST}b-@Z@}m%Pnt0&*gI0wKV1+d^D(W^jcMdz9`K{k|D6 +zQ1jIsQ-)WH=7aJHmXBANAS?>jcw-a(nsEyVTvrn28znj#T== +zqtFhFm}smV1ZfFDcNu~=ktBkYiBYA8l8K@P2=_v9BO4dkOSLE5L+|nh`2qKnlr#O_ +zvHPbhI>(c~b@e2eR^dQig~W~#g(Jf^W2%~Bf(c|QDoW|OkP8z=1}zY*;J(0^d6IRd +z5HK~&AgPs&xIlyp+H#0l9k!}>SV7HjXId#`^H-6__Jxk)2$bx$n@>fFhHb0dI$Fs| +z36}{r70b~#i%611k*sHyq4b!f7{>Gk$#$sy6YN7DYnmqh5jqm$Gu%n=Nhff>b +zg=}!>O?iGGqa*mW0DEukx>InGBqUc(-GyAB-btK_6x;*}sEaWzF&F|j=b7ZZ5fdwN +zp~uI8iW{>+Y**!AHf6IOb%{PQYtV9@Ia8YYbryOwDC1`9@ +zl|gge19srUz>?Y7P +za!09gtOEUy6V;OHPSB*zw6v)|SzQ;^Lu2`d9+EPaYMBDygaul~X<3bT#2b4T;FhcG +zhz~5!nk2GAYEOpk0@0l@c^9V-mZ`Ov2skaKAF8*7*t#HwG~a}9!xpyCrr)NtzIK5gtmj~3?GMflt3AyI1C$sf#p)dnbpRtQ0_%DpAnOOMTMdrgm +zqRG0c0x@nOW;gZ@AYgX}fFy-_;&%sd>JIe6qcwyR3l(T$X2`*-H +zi9cu;aI7}vo?z2?*Xre`&)<0b(i2y=&R_UU>4$!%MN*$0uuqRLj@_j3;{fzwW37{5 +z>W&P&H!1xzOg0ln-*1Lr;QkH|bt +zd#x1HH*8SQtD-dF0l`zN6|u^8Evz%30<|_&3hB$38rF*gP56eGo!1RUsSUNUeaEEbPj~C*E=C%9Bsjx}u*)WZ*5kb|`H}oIAo<^0R(;v3PZK +zb8of9Psh(j;qM;XY!)`$fgCj(z@J9!-e&to!;%c2vVE>4XLa+W>eFeda3 +zhbw;SQ1*QyCyv46ItgMup|Sw>CS_vR7P`%iQ9!;Lj(%P{ro{Kg0rdTpzi>81)QMN# +zS{L*R4q}14t89j`7}*VKwj|zPl#^SSJ&ue;UssBjbcxRV +zAW4id0fywj6t=u9b6-=8tisvFLab4+?qp2o)&A2&HmMQWD;FQVbam^>yK7X|d*N-R +z^RB;=q6%H-vCr%YEtWU-xWh@GiqjqDj_P3~bIFKyeYz+vy27iCqWFrL9x3x4cypa8)p6f#5!d1 +zOt5cNF>=hfzOq3ugJ>G<7Af1su^oKgoe%IZhx@CjhK9sQNSG^^%?^t}0e$AaTXti@ +z;X}^JQTCgQ939UlW55#hw*US9_P;+&mWClI!AU^n{D|h<>IG3LWz!vwcApuFoat$lEis;ke5#<;p)P +zz!IRjwb8Y1Qb8)N5L$SW_mELRHwbMbg%+$%5jAtBC@N7GAl1#Q?`? +zN7(T)j->rrF6kDc)5{lAExe*4yV)ppa{&&xz8dJr`FBRA3}d!uqc)4!`4J07evi*2 +zKBq9s576qMuT^>05ZsUADCGP0tLlI{{B^#Y +ztU->LS2@h3O3{iL$(SulGn)u4Lwc`(={eU;o~aonHUTaxF&v5u82MN`!w5#w;5W0r +z;zEtEmOVRT4=|u)5f`juobXL3~X`*4S>SBM5I+G*V{`0TlSQnEW{y%SP^ +zlj_)AfQ!%G9<_Eilg7qi$+5n~@rW>MYJzFjaV@tcfq)z6+@9LngWg(4$FQeKFhj*u +zd>VEN_RgB*W}iVc;S%iRkd%ANC=cx6+9q}<^iWS$AUPG|(FNM+fov%|jA +zoH^x}V@LmT?CkrX)$kTliXwd;+`#TAs;&t4acJ`*a-BXe-(yqlS$|XhiPf85_uYew +zinDOfeJV_}g;fBw*qW**#bebn9o2Yld}84Q*rzYXLB+Tz?~WFZnD3T^zYFqtp+w6& +zCsBZz*b!(_Q~+qY7?mlxaIj4+nsHJV0{xQIk5;Ji +zH0MFpJ=P7erq+viVB2!UDBrw6YRtCJYOAe*PeK{wI5I_&eePuTB{D +zwng!NTA^1<73<_JSpKqC4$dSyl-teIu7&~EQ9l6G=#Kby4SiSKHU+&Veh%(P6zV|y +zw~~qLeqpLre8IQ~Y$Xli&6ZdK%TvMhDhlFj7u7JJYtU45=;RKk_)<3Z*io~t6~teFNF&1`oHVdJtt^drdV!nzehTqy#%O>XN +zTVyb67WAhtZ(X^#>^@GK$BRpDp9x+>*2&2 +z;vFyz_)~@U(_>F?uy2!=+pdB|<8Risv+cWpHH&YG?k(=aa@0s}P!Z#N-K_z>=FjH4 +z!OzAA*`!}3EmrWylyM$)bYy|ucY +zO_+2=3wkuAYE2CSj|m+@g?!K>UD4_~x|X{hneU;;vS(nIbPv+g?QkD1g;$ +z#KvUmq9W;u>4|_U)#iwm*HD{Tuf`d|T2D^;@i~I|hZ;_rO1KVF98bfEofD*7KN--{ +zbs4L!sG2|7nLlF)=tE}L6WIxNU#+r@D|4_(* +zVI9fe3*TBf9#qf8?o9F}AQwz{4H$4@R(!WC`xZo%Zeh^D_VRhW#nSGW5v3Gx5u}l_ +zAGCd@BhU?jUI>J*(5uxc3yB5>-tg?jY;I@qKLaaRs8C$MiiqQfq&|XD2Zq>;vk4$5 +zAs`Y#L^*nmik>r(wm`*Q?6W7Va^z-wKcMOGhHm44z^ARn{79Qp)z|M{3b5`d>nWh{ +zm*bWbcr@1@<2|_V5j4-OdcRtzv^Z+B^_E;J*4bCMqRYm^Cy+AD9YnB9f$Fzj+!#ku +zpXg^$@kd_AQ-ECZFVD`r$!)wnL)oUr!;mqO>{;TTrj97(J0_-pb_-(JY`cw`fRnMg +zC9Q&!(VBf6(%67qkS@teBON}Q3_-TCos31G1-rk#V>9a~!sAZNxH;oV7IK|xmLOum +zh(;*FfMI?%JQGu96bK_*24ukL3Q+Pe_qDe(Hkqo%wyV=Wz$Z^o3Ddf%V{KE{TG(Ge +zVp@eMu)diV?BF&s|Gf8JPiX=Aj5k50Ma79eK}c$QWuiBFF~XSfp4<8>e)bV-o`A8r +z7caVh!T|22S+HqFvGuyDL^|L~nUC)qdDoG*;r$t_eX4F+yvQ&YcI{I>pc}Dk*;^?& +z0`lpLz6()IoL%1UQe8T*#D2M$e2X!-{;hLSd+4GOo4ot1uP!SX%!k&L3|eC5=?CSs +z3f%iHxu9Z-PV=<6ffwvUIj422x_NYIYjIk=*TRr)++=h24kdHdn+KmP+C5k(s+9_KP&Vl-^J%OlkmD&1adAyrCmDmII&ceQ +zyEZejpI7R>R$nUAFsYs{Ah3ohdfIsd;}7ef*tqPA +zt^P53J&x%jebqE20};bVOd+W(?m>c6_^BX2ea8+lUg|=OQG}ud+TvgeRiu|?+(F0) +ze6^HwS70cPLFpvN_L}h6Qp&|)ffMjFAJ=(mRyxZVyhLpQFg{uM4TULZeg2uzzM6 +zY#d}wbGya2GL;466KVy~XVV(*(V59=j3;hlCfSh!_OvEf=$;gU6eE5?<|C5~fGX#ax-e*H%oP#k_SQ>)xLY +z$NF>lJ)g)xi5Q7_=cE7y=>h&F6b6B9eYORC*pz7lZ`|!-gife?vyoZYD^7sA?B$Y( +zA0^~XoU^c388U{36w1u@q?#{*7d$qe?lo`tfwonf>ah(LwOrwOL%!}6*39omaG(-q@jW> +z1Uv)9L?VbxsOrJ)Y$j`Ti4f{I*oE0eRNB()xg~anp}famwUcSOKdtE|$0V2m3@ptDj$K&)d&+UB|uF>sny +zH^Je$*F*gKU7;6t=BH@iXC1MS!#ykPfD#OI%5j=M720;;>eiD_NioDgghT|5-SyK2 +z>UyqRyt;M%%9d9Zr!u&O+AchK`SQgJer+xVkeMoT7@Hv6=hyr66JZ}6Gb@oa*|3~Z +zI3J7YEkl$(bNk4gls4xpu`1IAZ9UZ3*dzz^AO?)@7yCuu>KSU?z@`Ce!^@c>3Rv^k +z`r5{+d40LMb@8c&$@FvVU{)1~6Rc%c=(?;cE1=F@(^4q8eA|u*j0}|efd@gnCbz>GAO~0e;I}vG~JCQ;*4D#`4mN& +z9q$H_hs|zr=oz1Sg~MBgWPqBQ;ffl{9G`WHw?+1qRf<-BWK{v;rCaj=?y&Z=oDeTY +z1@3Vlg4e^HbvB=SKl^Fz)T0GrHJ57SPW_pEie%-$>jnAuFydJ@CHpr`m9XH4R5px8 +zBdqFYON<9Gd7B2*A#^oNQIOtqbJ_9HFsM7zYd0mIx{XSu7lFH2Wb793z}i)HAa0lO +z$SxBSo#u9cxt>mnT}(r#IBZM)I3;|_*<+SSJ2ZCz$Ri?H0eZN23D}(?SOY!r6rz5d +zxo0ZGRg1=D=p4q$-CH52FfyHQ+k7*_c6dE)UGA7$b_qwFs=d%8W-74R8-nSx&lj-I +zs^o1SOji?6V0}|2bqtV8R{SEMBcOq}buqnDp=+{|HRVIrSv01R3r6HTrFvssx+exL +z*qyQ2T}F#2#cq3AUmkjpIKAP`d380p1O@_=NGuTK9Jrab#6JT`B +zo5oAz;i%`4AI*2H8&4;IS#X24AAb@Lv(y3pml<|+sxa>eB48r96|JW8p(C3Cy5P(* +zHvEm+R@8~XD+Ni66s$)0tiY{d7d5id3U&(bkgT@{cP546SIJ7R9GW8yl=Nt2?%t~y +zG~C;M@^Jo1wZ)d)gEeJogxZD|9U66TnA{d=*7&Gd1KRu{_AG9$H%R+<(J*bnmvW%E +zD*~(Qtqe9k)@6tKvW?Utp|&{Z+J%$=p4(*mJl>$uax8{pf8^e)MZ@IQxROmZb8-9I3Awjm2JzX#=_9`HrKSSn7(DS{ +zjrI+1XHnY(EBh9PPc{0(r)P_X&wY8RhfmGW@MXqB9QoRO&_}m)sA_^KKUy>$$B{~J +zeKuGwzlC8To@6jCP7JtUV1z{Zl8+3Vxs{>C@AYM`^q1{6mxe4ygT}pbLf8B)ur&~~ +z3C_nJzz{#1KWZs;M_d~01k{Ed^JM_{-y!1BC)RO#sTww{2(+}X0|Xm0WPm4~V^Ha03my0lMt?%-lbGlgccdW$L<7uWvy#m9s8%#&JUO)zf0 +zwXm+8ME~6Z?+;u$Kie#2NfMpMF{gYsEr;2ZU?0E+vTr85v`I+F|553$ +z7^%`bpX6u@afJB*OF*>0_6(3H5wJaupZzw6pS@VwyrhXXFkv%|)rE=pl5KmZ(NA7G +zEF(z1O*F%nYPm+E*j*gF#K?zC;~+|hp%w?2g+aV_c&+X1vy*pVZm8ocZ6dq^xu)SQ +z7#@34`b)r0D!~1o$$-6OC~(bXdJ3%Y9e=x7d^Na=fwChs)Ddk!i!0)KZ1w|qh|zVu +zV3n8gcaEvcrPw^n!mawDUlOB14Z#T7QjYOpvs^R(@4|EEkG00s+lR~U=@@rEZ_v!9 +zdxLdD^}~5RAiXRgVpqe{cr`eRv^%`CE|~T}`rzFAX?yx!$NFNb3_~L@=Fn9K$A_m1 +zHa{DsB}&dB#^S0}ZGtTXT{9<-k<;vQ(*|ZcMm+p~H{d|wEK~OvY?_$3q#n;XCietIL-B!;&0;u|dO0NWLbep4 +z|2Zebz%!jfD#uYnE>(bnR2{;Z>SZA3Fwh)okT#=Km +z2saCcCj>Kvh%|=mT5BdH>P=fSbl03@2lT3#9(h>#jQoQ2S}#?9{zU|{j>byJ(#T`t +z;6QJXj1IF2$KTp2Aqfi{ShExQjEaaWs7GSQNdX*C!3Z0om{gcOKdx2QW!_;qocgEa +zu)*jm(itYXUeYt6#3+}#C7+g6!7J+f%-+}M-0mbU7SB6c^O2iqM&9ZV+xXi%Ad4a)K+<5a>T`_4ZWU#IYm +z><;S!ux>(dn^7?!U;`VS57REC3`;84K8ynH;AuO3lMkzCzC>>Rg!%G>8Iv@(y3xj6 +zdji+Ud$ZnFA^ezQcBi#+ca^TDcUSL$9G!K!9W0r!|5_X}1-}{Kr+uvQ>+QBfFR(yB +zm2`8{Oh7)C(d;0)=OGxMIT1<-TL8cii0Ko;3J^(v`Qrs7WIojVw|%{=N8ZK}!IqWvaAm}wc2hQ2qza58?$WCBdErdyW>GGrlZ8sxar{1+{naC3)XE8&z(TO= +zv1S#JLGrXt0SuK@8uxHDFCTk|#~%V4GUb|{D!*Hc?-f9s)qF*5@B{B#56yyjxZ22_ +z)a(Ig6qSe1Zw2N+m#$RqO)a}=x2~Ak2=f67UNLy2Ii(aQYiwN_dA3_z7Itq0^-pW5_V=kyx86yAaxZU_T{EX3nJ6kjfWt3wuAhgh#Gd;mld3 +zDkxj}ePZZQjhbjRD$CE_$U3QmwqXzHN!H7^adUC9O;>}P@ZAiLZ(oTRJU2C)$`a@p +z=EU}LcAwPq25Oht=%6%GX|qm#@e!*9O05Cumi=KS05GD#&j37y_%>5$sSf%hX-SBJ +zW^61|)2>CKMvOmKo_->*#F!^FOHAf(+gg-bq~hB%@nDie+zXNm$*PDgBj3COm+7DR +z|Db>7|7-oD`bjVo9HwR3ogc_H_Px!=O|IrvCp-=v&7%lOD9Hy1LROGo9+&`bu86a( +zdc3H&u4Js&+tJ8~OdMw|IWweB$3|>h3wkZL@Vt>6BM)QKSfuCzxS~;fQDk_aAoO!o +zHe^YDITB_D9a)?bHj+vcspE0eWg^a}>#Xi)#H*NeBwoulWl0=3J822T8nc`nW|~{p +z9{Z@0Q`SLNx9VD^WA3EHju&<8oH&ftPuPQSbwdPGm;cYVrrCo%%?T&ZBKCyylZ06} +z_2P6x#_)LKBluB?0&@aTd=lwUP|eS7Os?kM +z)WRcE&DToq8PKvf803_+Vaa>&|f6NxR+dGO>gi<&>Yod1qhMMjI#_(@7;s_8^rnEk>Vc +ztQBdGtp}VKBk|5Lq7g*$04fWoRy9|H$Ad!3m6Ua{q+%$oUWO6TL^(tI=}e+jM1{C} +z@w~z4F8g^IYU&;g+(3xB+&$@74}!WOv+ePY$lsGwZ-us12F;kz4fyP=KzlEAh%8%M +zTGg>L$UvWSQ1qvJ=5I4HvxYsJJhriFP%)xC%n)(bf8BkzD8K+31>)&oGUTOwXDt!z +zbu0y{*w=vHw`w-Tuoz`-({$*vFx^LOnhXy5tSa1zRp=l4CDg&H!f~uZ*|B)a_wvK6 +zZ{}!d#D7Gl&IaoHe&qX+b=wpbHaWN2k9tdeM9ss2%*-NB+Dmi!E}KC}D~fsXe%|#a +zxqKs+8%F>(Go0k4USp(3x5h{}hA!1!E-|dR@k^ZHtYKII_-34kKBf)buQOsq=bdPc +z=RBceI;W{-+qoE^J_1hY1j=mK4D7ERBAU1JsjqJ +zV9UWS27F2+v4CM!cI?IVsm2M^Gx +z67(s-?EICiyD++^3+#Ee+!7}Somr@`yAU@#4`+5WMGv;DYqwjjxBD7!5v +zzMtKowBnQ9fZMs~yXe+*HA~B&oislLlRf!EVAQKsVbHhS2_X@N5uWlMswIW-a +zi%E7+gSVAu^AD4h`p5*iHRA8En40MmXGImo1y@Qro7zP6cRrYl#L6Y2xy&T)=F?#E +z&65QunhGs>oUf|<>fZKT5>tu1bQq5oJUmI0oV1E=-gUF-&*GvX7xgh0OAWf1gYwp_ +z)L)3^GhPcjZ;N7PPNR&sQ_*U +zXwq$Lo~piis--qhb?nXaaLIgtio>vwsjz3#v+4dzvu_j%*#5k_>e*A~qJS~DXrTPZ +zEo#^1PHxjB;?5$ThWc{m42ASr`*@c;-`$PDtMNZ9+ujokN~p!SSpcVF#rt)Wix`}Q +zhWdi?`Bc^;aa@?2e{K?hMd5_bQ(oeEAx;Wau?Q$$#DHj>&7iACiU9^}KM0H|f#+Vr +z#z9O+UK<1MXdpf;eVEy`R+LgX0!pGS`OPrKz`#EFhgHhj~ +zPhE)~U@f+;8(nmW1LrSrpp{^}qb_3?bw8ZuYmr1FrXG)^@v}uVjf*XDC_)&{XrZ}w +zI7~H<_J%OIgbf?4ffxf=_8o-ol<~GMcSc|vdXG1VR?LEAM$wV-Bl4^B +zR|TFdToX*6yR1vE^W9q{Un%&!KE(8>Z{h%YI|X~*>}KOXI0!u>Is<~FKacom;Y4Do +zI|)W8{pI))xDyM=Cn`*conVz#2V-M6AKg~>tv;ZF!WSs-m;nI>Q4 +z;HXk&0ZE5DWLbV<#t26Vf#s>g5EN2rL(NZyI%qfE(Fg>oCA +zy9ILTHh-5>mN-5JvSGpMSlL!p5s4XDVy@YN!#Q0GHKSNKBxo^_dTWpG9Ba3=83Wx^ +zSF;MjJ|PXXK;~0inGFKv*ff`{OXreiJsJgDvv}MDD1H=zXCDQ~*@)ts#glyD?OXPb +z8of@Im`E9b`cjvQ~c;pGbR(#a$OhtG%+d>n6Ll +zM>g+5r_gpZQ=IZyCR)kfr>J}lGj9=40U&*r4A^NI#AtK(t(&}!R|4@7XP0_vv3=*;buqPLFDi%mffIQGP^-_i`fn62*zdxb=U3) +zzO-^v6{I}y_U|p{Jg6FS9#l)`Jg9CV=fQlc7MoJnL^Dl`WJ8!c@MW~04IAk=qx}P< +z5}o9hNW`Mt1OdWMl8Ffcu_)t<%IvKz@VAvoABPI}lmX2D6ay%Gk +zuD-?8Rs!tSvtUt|XEHQA-c@e`QMz+an<+i3ywiqH7Th~nX4!loTv`%>5a;T2*Dbj|b_)i$-BC*BHXfdo850_reUZfP;w`J=FcV*VMMmXRPc +z`*8kT+hR-7whM&IOjCc^Mq$hc%caN;A}QQl!VWKjj>|-Gz0JYd7?x;cXnSu2!pG8M +zRtXYusTo&`(iDn&{gkEa?Q=WX0Fo7Mb4htQ+XhP$teJg>N`O>HoEP(`zjh&q#nojmT#vB +zJ~{3_JN^#SIEI}$syU|^D+?@HrYG}1YAsJY5?rY9M7GObXkewZcE0Fk5 +zb90Xn@&u?6hUi2Rzs}nsO9B$jaiz1x=O{G9GG250zHO>)Bbo*7S#TMV=q;oh-Wzqy=jGdS!F0rNo4XO| +z5_80fnjSN6Hj#*BLD|3~0c?b|f@q#-(YJ6%?^%<`q;^7(7QnU*GCo@vheXjKBiiW~ +z7#S3ySs(?dxXBkKpIm;?AA`tCHV7!bpq73zZ$w +zIypQv!8~-COlb9@oMX5EOHS9kd+K2;oCt<7o^Kd@>I4_Av+8;X#Rs5PD`kgygl3y> +z9|WHj6eyg88a7d&s}nRL6jDH#sv)}1-$F4ec03m7SP6>edHyedQ7P{O#k$x4!DC7a +zb;k>N)=WMXy0;X5Nly?^FYzAHku{m@Qrot7l8UNE^Qe|vV$$YKVk~slJ)NV;y~i)P +zwn}?o!^76&=PsCnb-MVt=iAQ5^ +zw$49v`C{zFBTqkZVe8V9(dwSQdhyD`=eN#BD}3zA#q$r_H!j!*-(J4-=wspMi}ob^ +z3g=y!Ru|n4TsnsqK$muH7{=8x5i6G<$P4{dBWwZ|iPB$z +zMfT_N-RMNBeI(;k!boh4RFkDP_Fq{Fm +z?1m&gWR0C6Y}>P9FkO`dWxKEj=7VBjSVl1NU!pK>jIt|tFwt>F7*pAR+zFui#N1Ux +z3C$$P)*v5$AOL%i0fY6tTjblpAEJBffxyv?$Vq^Av85@=&0<6ph5DESj;p!d084*T +zQJzso%P)-(OY;puYv~FrPnD3q;#SA=hG?P$IFWii@WIk99JCIQbprv|!G{NOPK2&` +zn~F`i@1C?Z;#3=9xdSt_%?0Ij87X%)Qm!gzlb&i>mxInSRJFO1yzXJSfhsqejVrH! +zDmQDZ(=i+K`LLft-7G59n$TSVjdiT7H#8WOp_P;AjcU@n27LIXhp%4x?2Feoy>jN? +z<4Lg(^mzi7_LDQzKiJLG&AFS;f4U7VELjUZI_vWelnlx9jI?~;g*42CL!CaWo; +zVK<*5?FfS3@tMar6hM8g6TKc-QtkwvHyxBC2N?Y~gH*g*Dh^AJzK(Xi@D!xtac<;) +zecU=p#4jHLJHB@V2Me$IGpo-Ydtfz2zw3%~o#b_l# +zvLORny&AeF@XoPz#Q8M>Wt&r9MIlt|UBR}VPZv`U4^;{1fI1D-qlRZqb<3IYMxCWA +z2-1kYq^Y0_+W2y>LmlS$3799yP+P@YRma(Dmz=mp_Esgo(J2O|fb)^u4&DUPgfukd +z(~jG3449I5Q$TrZ^|RKNO01Zhcg1dtpkfP5>41y*s|)%Y#wn_!9CKj^N~@QLmM~lm +zi5@bEECxES*p+Ek41!M&GA}s@?&Ch#*HS3V2`o9e!2nQ0Cm4Rz(L4sxmO35OqmR$1 +zx`S#HE2$K40o}@xc1=$zGmmickcl-t8c?XA>k!Q7z8Me!=`}TuPH8!6)K}NzJyt3k +zi+P`CRXHO38_>3hbFbf1XHRtu6vOM13+tqsuJ+7suB=a#spQDRK?TZjXwD!sb0$Go +z4ObZ(d7M%QLgNM1I&|+u4bOnD1^cZLZ6{&^K|;l@>p-4$g5EkscMHE~#G4L@ +zVB)Z@&FO4*9S|lpjO9SN$nDhTF$d2L%X)g_+ZG&#h{C#U5|U8iOfcEzYaWCJi$d +zTOo_S-hzE;6M^Y!$N|uv`f^MZI?snF?tqWQQMVnRe8WlBj(LQC3@GxlK&rbig=NT7 +z!J}sL(_`jss!A^Fmn*~xztNc53p&>;XQOGPhxmNH{y~?#rEcPvOZ0J=Rk2Bg$4m7P +z3f@u&;ll;}Tg+F+`vryO#ZSR0?kI`wo@^5DbkrlBT;+Nygj1t~jP@B&T7|j;fL5%k +z$XBF533U~j&Bg94lI$4+qDLk;^ya*aDyB*}PGTD}4Vt0t7v-#KP_!&7p_G$^?Om02 +z-v=OOJWh2_lgENH`j~$}+sBzD8@yjjVol*E7^Uo}x~A1a&BRU5IZQFb{np*-rtsX7 +z;0bdDR+fW^+=DhGF^pWO1yZ*$c};;PwO)=qHfDz`ASDJ^UyzAWgJq4Vbue^NMJJIc +zZ`3Q-%yyvh)>=Wg&$G#uZ`+Ii>g|&d3Ut{0&R=;rSuihL48X +z&f?uf&u#V)w{oFmdBWFcpTN6~MR)Eo1?$#X3zb^WXC*d+3zXZq>a~&7+o9NuAOlYAojY|mq2kniV% +zhNdnr)08mW2YZlhUE?`|EkII)N)AjjQLK1?5=8uYpE{1DMabp!mgW{LHSCWu;si=~ +zU{oR)=xWD7uw_~Z6H+rqQoL=XpPS^p(M_JP9t_mEV$>VV`ocfbGuS%4a!5cX?SQqb +zTSr{ri6s3>T00)yMCS+|{a7e&ZFA0zn>195xN`rp!)MFc=cRNE4Z?C1QIp%F7&IKY +z=?W?s_X +z`d<^(tBl|?f|Skz28Z6((GS`Yt?x41OxZYXT_?ovW)a1sOVmA7d9r_paM3t$tPSS)GRdgl(1Y^i#lDH;~Zbd09ed +zgE2RgNR%YC@4+*=o4=orr+XMvq=GN!?o!bK`F-N2OJ7=CKDK9JBAd}^8?P9NwoV^C5{5j{lL)jXJ^1a9tqpgmv9#D5^x*g +zx-L75AoEm;>;$(C0&vQJZBl0_&d(a?cc+1XGkYp4;DpO!L|z4WN;oT{j=VCH{j|(1 +zs*KI123k<`W&oyaPAGVGk#orr&K#4-sY+>2*aD7+yjpf#c_OZC$uj>x*)FDtFMxI1 +z(5X90)dM#S**lc}HMm}?5QHPH#SGM?37SEy`X2Zl*Gls_T)?PAd*pH_wdZydtS4D`448L`q81;)1Yo>s|qml;X5$ +zhY;C`Y_MutPwEciUJy}EJ@@%?hDc@JH*9+iGluw +z){q92=>`I8p>6zJyF2O}*;Am5SNKv{PiziH1lc4(l_{eAT!LMRZlB>uec-l4I5*cW +z;&qf03odTMGis#d@$*+}q*I>FCxK8ZAb#Y4k+%`sw0y$xhn@B<-=%y98NRX>eg*e+dmT#ap`D +z!qB2C<}$tKu0i()c_wJu?mI{bE9@+%Ghsf&;>uFyVjoqw$@yeU{DPJqQBjFRUM9|} +zq-fp_BU59w5QBjl)N(@AndAG+Y&d4BS_o2e-w0kgLSZvg1^g$}&=$Z1;;wK5?`7k0 +zj!4gnQ|?3BUh?RMdt4A&L_ +z>l_oWNvoO2ML7?uh!(Coma@0HWo56uVH|69JU#DIHnVn}jd!*rM+8BukL=p5C?aF{ +z>PvoF(|s;E>zoN@3Ao3^5&)jKxFjtARtunFmlIl{j+aXjSw)o-)iG5()orMFVw*Lh +z-GLcC?xIPbZfnhIXQ8GqnR_Hqhk2{|poXKd?B`1>zmKuw8kHnAoMipnDIH95ib6@w +z&kl=00UDgk1g^+iYMr+Maaf@2wFL)K5cIC&Nx5GD|5U*>fw@3OhI$n_Z!o+Z5;VO? +zRLBJq{VzjiWs+c^@7q~b^bnceR*9Z3l1xweI*N`a!8$X3D$!~eBaC+axb$!4I|k~DlgGqUHzcA +zqs(VMm+oBU#b2^Z99EH_w`k2m@az&8lA0H+LckiFl#lPq@$?=$Z!lvt +zdd~@Wl7SdyLp&wp19ptjzbbPHSAd1)oOqG_3v(urHXID-xItwUNh|N}c01_`^=v!q +zJMrYrl2CG`OnL6Yz`7HZiMQee(b2UYN3yqB2+2-qsD3U0dEF5k%deYm0&nY7R1*P4X3+G2Q{ +zUB2-U1tj0|P>1fkUVv5H?^l6y7c;SnU&PZu_0Y?QL?>LQ@zSE#b9xj~_j!Y_!?Wne +zOH6@A%kyU;o+-UyT9(d|PT+NNvfSh)FUjO>xvpuTvZYg+;}pTr!wFVt-{#FO#jb}_ +z%X2x3&E=e36!C9Zav~B33b^C1faPYyLt_B5H0F?b@D<{&7>b!iJ77K>Z`V8F9v^2r +z$9MD6n|Z0d+^~ahCA;}cb>@R@+nkGh(R_wHq!jbT>Nn1a&ft3Kubtx4N0Av-a`Jc_*;FFa8`y@khSdsMeP^~19=Nk^^C;jlW}4x +zM#t>z4zW!N8Y5!NW6sD=4gt%mDmBvIq{uy>#-0V__q~>VzUi%l=_ZUAyo_PJ;5XEb +zzgzH2MhZ_BW)#82z>$P2i4W%*A6&7f6nUK`mf*@C(h04*Ad&G|QpzFVCU3z)vg|n?tW~Q`|yPbh1k^+-)TlHLmP3bZKswzon$=-*MA?Mu;eyT(Pr} +z3N3f<1RsH?05!r>0&VCs94wTsDBOIQXAq1DXlZDpM71-{V-)~^SgXS$=-dc$ML+Ki +zP=In8GZsgb6H6UWbh+8L6a<=*7Ze#hT~#m-P!J*pFi>FIE~%-HR0 +zixv*%PALBf+Wk4b$z(Rb{szZqS$?kDPR{R4)ea6hcDwC-j@>@iT6Ayt3KKOUO_x<9 +z@(6J*>}fSD2BtcVZQcUi&&G4ftsH5upYm`KOC;qYwv|SH_LA*-m;Kd{Yax;yKUMlT)6_F?)$L1h4}jS(I0YJY2wuNU<0vQf@yJFd_jH$kt|; +zs4B=LKv2DKp0pRFc`7uOFv?xhGxE_as>D5_BHAO#hAAb!GX@G?8*Ko&C;&T)pF9I(a0Q`H>m5kC8t#zcVA#Fh2zHikE6; +z&Qi$Gipm?CP7CTQoHK#7b0KtK)y>9Z7_}&14B2HRO>Ry}#iHP>npuYj2|d1Sb8do% +zZ-K54Aj(Qj1wn3t3@s7e(~{#>IfA*Gm${BlP#BS>A1}rDH3lnI&-qe9O;h>kL@+&B +zxd192mm0Vnr}w57^VudJy7G?O2vkAHK0>aF +z{19)(UGy?3>(=?jG_C1+JpS!C|8jh}Zp6hS4#3*g)1~%LQ`!XL01%h{j*Jy#3(`x{ +z_F9_bnFVPy^y4`ryeBBSoKAmQ&%k~=Yb!}IB$QT9fCdnWDIiAqK`b}A|6*xnL?3Z@ +zy?W@;f@_`%&BI)R_w`x3Tmrl}Zt5A|bPS|tiboRA2NsfgGI}zF4otOB1L&D;!|4kz +zpwsRcgnD?hM!+|ZKYe-Y%Ec}7yDfGOyy{eRF4L|sbQnCo*WngGy@Odidc0tUBebVK +zH+hhndAB|arbgifQ3VT16f$F5XR=P>7Q$+^LH8WN&jroWPCXTrdhE&2;&%%^ +z8KN}b&UXunDq~6{V<7FYU|s^#JKbwSTcy!sT-XHE%fg^FA#}!(4PFwn;;q^gck?OG +z(wzVb-+!@SgXyBTqOX0b8Lud!UUl|hdkM(xvPiGn4HUpud(O_PwnB_}DR%r;g5pl0 +z>oP#CrS+ijWv0J=$LSY~*ce@Q-Z_ul?afoKl-~|d33Us2Q0jMh!Xn(noHTPNk6wm5 +zeYcuz`?F>qEXm?R(Iu1Y_|AySlxj}Hqe}(X*#&fhr%W5;BeHp_7=P=@XsGNY9}lt~ +zam`0UkVd`S88p?0lEEd^3<(vnhvO*+_dupNCpdbl{2<(6?h?UO8gbBbj~CDuS8%Dt +z($fo{H56Nv2r0~G5am0p?}OlBV;FI0p^M}PhB4`T41Rl7&oYHa?D1>rWbKG}L&m%U +z;g#p=ioz`KoafX{&sdfs8)$(ae;%u|ib#1)HnJ)yu;r +zHr8!%_QW;3Y>SW0CD0qW5T$qea*Mt}y-`$$g%O>|?Rrs3qkcAlSdZ~++U3Ls;C{ns +z4hScjL!mj)#_;*;Q!^k+x5Zj0h<{mF`CYF%H;>SVM#xKW# +zNapxV`?uvwPVyv*3FM8BggtOv4lA|~bkSonl+0jTCNLYoaXBLGmw9nBKZ@{#MTjpF=VplqCf#lG{dcr(kMu$zzeRpXZ&72nL +zPOLZL!k(~qQVEHzD-VVkuNsnYFIce_i--P=l2Hvn`r)Le<7}j{$|I4i*%Zs@Uh*R? +zVvvd+;hd`^3(~@*Zk6d)WF5e43b?UKeY0aW-5_yFoLT}?GqE^7DuJ#x<`&8m2R8Mv +z#M3ii^mI|e%-JJwISq>K%G)FIaFGlt<>mq2KZzg+?1W9T5g3W&Oo$qe^C!;f@-%dS +zp+^e{6cw7UweLp>(=lz!jxa6l^l~X;wac~*Z%dtwg=85wMypAh1L_k*h0g90{-{)w1L7QtwtYB<9^DU86cZG3oMQ5>$4OM|BxxyB6>3nM2W@npG +z@$8JC?|`+wnICmQFDb!j7(Gc@7>C)&?I2ZNL^u^z>G~Y(<@r;c8c}gJk@d%pjesif +z@Ie3KK;m88okaZtA>p~fK~5-e#SPfET_v#)#~YLE01#)vT>}EWojqKTWI|dn8-;_y +zCwf>rlN|LVt|zcWh&<`cq}21qprhzg2RFg-CR^(>1wOT|@V;{KktZ&B*s1iy6MMGi +zR`JA><`Z25KG0nOXOLMoF<<9QigT4Boscv~dL?yW(y>N8mk?aZea^%DjuV1dl(Z>~ +zxzKCr&l3_}FW3zPJi;a=;Kt7yqN%~FIY>G$NS~nm%V~Sp7oA=Pb3hN5v%5K`6ZUS2 +z2is?CQ=AAEjzb(hKRRNs?9eS|(InF~n2#Ki1#msZC?5c}E5R+1qd00;>tl#_H?xQV +zUY69km%?)M7`^bM+%g=f$G;ZaWbSM(X!lwuz_FrDaH%vNz6TD%!=aX}pYpTd%Nu7MUH5_On}VUkbj52`)#uvX>B8dKI8FD>MQ2+iKnq +zji(t1HvIJVojhDpu9V_2&adbnHs^W8kF+l{|Jx!EX?D-lv;0aN5^N$lL +zdM&bL42tB3kl75feC(F=`D98CjmpDTBgfQwpl-JDr0manQSJh(@FpFfcs>QL0o&o= +zhSfVl@;y1Ma(9KPaRfEsKGM~Ye5ZoI=WL$EENk>u!$MKHhyF5e!$V*WFA#$o3+^JG +ztP9Cp;U{{J%;)qNlnl8B!Uh_a9x@O+ZB`s^LyA8Z8<_8=oaW{@3b#p3qnh5*|I!U_dCnQkg0;_<;Mr@!!V+SPcoZyjP+fdTqWg=EXDox<{$Lpo +zRIAtFoI6(QB1cR#zvB8U3H-9DBuJwk?>l`mqt#mwsV*?+fb%&x(keUas^I+7$w947 +z_RvGa60S4&NT;QNhl*y!QpD9$!wp=i^%@(`h;hgv#Xrxdy|~XyQ3+Zt<1$%rUJy~D +zUUvzCEuYp%tfyDbUA4wvG5iKd%UjxB?pufjmp2GitP-064cJo*v@>1p7ZY<nwNf(tS^w520cHxQE!f+x~2E%w{pI^1%+d!@-0; +zJA+i(JmF@I(RsZ$DG1`$un)MqNfI|@Cluv~J1yzw&=u6i*p@O05WOJXV~?wH;w7mS +zaA&vp;qvNLEq8W`9xRkwUK}ud!&8O+K2;7GPN#Mo49)e92=o{D;2lx2qxvDXJJNQ@ +zLl`3<-C394aF|SfN(y!?nYXe;Fwz><4UTeK +ze}W#FxBuUVneJZ8UoT#hb|+pVFJ)LMKaSQLoPwsBYc@aiG+Hko +zp#{~3-i+>Hv{E{F3+jaP7gh<+qBVMlbwR~N8CF}A(MkVY=LWK)!>ZH$!UhrZGo_0RMcC9;iyY^T6*=Q4FZ^r+rlU(|{`f5FQwdEgvAt +zZ-qxnrHKIEqX+4pJf-esNCsh~0%dKH^zq1KN<9T4{~6*p9uGJpu?L(_fVw@i6z1L@ +z9NF+|C^BM+M0kkAznop-2cf5m-ZM$9ar>~ufJrv7mO=WJw)WF&9pMbGw`-jLrK*~d +z`atvtjB??WVLCAva|`=QSlTgi7T{}jb6_T{5d;OI?Q{4Rv9_3ZVmr84;rO=EiNCOB +z?y(l<0^d$fZ%o#BN;61s9mI~&_)*KB6=oB^X@ywgrrBfBayOf7E8^-uh4kc8m`~H) +z$Xqt??dHk^HI3PYF87FdT5`SI3^)W_nhIA}Im?SaWrYmDXJUIq3!1!&D^+Vo*97k`l5z6 +zcLr*PBDcnt#6VT7+93Id8}@KW^S&4261^!iHF$?R^^wLB@AI>!ybeb;1U~Xysp|9asHk%DJ#$NKZjlJ2cY` +zwEi&zWi7QS095vLsIj@_kvtk65>?|?zVWE+;~S6GHthMDakWL5Z8B7f$w~Ig0e6wh +z=cD~%QjTyr1HGWRE_Tc}G7rdHJ!{SeyUT-p3NwX1axK(n(sk7CCxP{_i-Pd(MO=J +z==Qz2cD<>yFdhu3q&Q{TM!JszlwFf+$*rVqZd>Z+BcLEXah`CT +z8b|vttAYw{S}&+`pPMs>#W*u!i_9MVGBlxS%G@!S69+NxckG>aDbwA>dUe;ONg +zX1z1Lwk~cQ=0f7f8|Lwbdi>U5(eIbj&G7F|G8>ERNOGTY{}jh`->$k~A-o`G2-I%D +zOai}R&0~#{uEdU0TsNt9c6>%dyMFP-4OE(vW^|K_pn@hyMqs4m$=2LabcW^+gFO9{_rE?LvgCVIzfPudJ;@wC)VLb2_r$(f;U +zRYcaa2KuqY_VO@3EN;g&5oQ{<*VSTJ82K5uhIccEd)Bk2gW+sfat70Y@Ia`HrvbnQ +zTrmy!8Aw~riaUrgK}%a=+<`V-p)>H`OC7R1I}46XJA6*I(ctN4I6j;Fn}cI)MioRj +z^9UvB*;)#8uWGkjI@49-B#rVztFDB9n+pKx_O%YVo;1$MdCFImSvwJs#7PFcTuvT% +z%3j4(@KQ}xrXBCZ4crLq<;b}|C5-FlK#s+i&U)>de#cl391ndb4rgdEi};)KEnD{w +zbp(R5O9Z{^%;^L68WWOGFOJi&6+5;haH1|cbEzJ7`BXMC> +zcz=%=QV;c|W*be3M0xcX={%cEi{8u}4pO~K<{#G)$50Tj4mx?!#9NokiiY9bE^^8o +zn_35F-1wtD+VtTH0PJPFfxbe16l@3!>;m(U?>?VIrBqsl?4t3fdO@_4aJZ^!b&6JqdsC-_KO|BoiyJd +zV}VCHTzCrDg7mC|+z`oH>ACdBo3C4ALF=m!61AuqdI6KFLrIqAR&Nrwdh5(85KhBJ +zzSZ1+)!rtp9nA_*ut;ZJ)@>#F9b-0l7x&Ee$w+rdiw?GQH$i=ufz0l-MGLD|jZ|1F=7M}7Eg?z15+Ze)_xLegKP0;`gYHd%2$OHgQL|_cy9Al`SAT06`_z;m; +zU6)LO)L12Fe=}i!ZqcEPmF3jT>a@4#X+r(zH-Pt;RS2%7FGr3JEG)9R6iQoJx?Ps$ +zn2p*xbLj+P)^?P09%Na|`<2xr3#iH^%)mxCJkcJbzos?}3apctLb8)cjv!^Du +zGa7A4T};+K*~o;?-)R$tfPz2L*76(dijjhf{hSbXU9vo-c}LfsiRc##Ye}-=QZ?j~`W;C=;GPQ1<7G-c3In_sE_0o;+EAEK1rJ`1SrythB&>Giw +zk{w_~j#MMR)7HKrCHouoHI3%5-CtLe6@>WgZ`jq7BU6m_%bSvnOXoqeCKEY|i@R^6 +z0M&UAz+0?ULhi0UfJa4a03@f-hKQeDBkp|pZmVxS(SF;qKbu?zYqn*~_SnuHC$V_2 +zl{eTb9BhZB{@R$Y9&^lU^;81IJ2DfU*i1NPO1T68Rn(k#nX&!GE1^8wSatg5 +z6}!Z4mT9;#;g8%A96=Aj(Lg1jmdJ$j#s~HEIoHLu>Vsih^K+fvqNvc8}5u@kRRIxT9* +zMS@Bdu{czo#eu1ueX?+0__&L1_E;Kgz1wBtWgAyb8;9$=zn%N~Cy5r#|!vY#< +z(;n>5r@juL0+B&;tqY>fVUx$C*hSEZTQGUVk&NyTVVsse6p{Q+Td3XuOF*>00teuj +zD*!s$EB4ECy(2kVqXYSgvjnU&vy^AzwB}r60XisE5vyDLPS($sg(dPd*$x6ClGy6} +zh|@@^Sh#>vY-5ON>C`-=IYZ^jpex>+x#k1J+#xxgH&9+ad4Gr8G$FY&p1^I4cFVTS +zc4A_)Mnd->hn(f<2^#Tv9_k5n6Uz(S(X;WGCT~z45F%RMHe1tl5EN9EtB)&r$W~G- +zwB8Y0zBy&nJz@~#yU(tF2P<{*v>idZz83Rf;N?Ya3E2w!W?CUPH)uvWkYeH>hZ_>N +zw_Sz&a9oZs`YHp*(3-=N@>gPaCDRQ$>7=fZ?}InCfW^Advk~HaWR)2^lR3lrlN15A8nY2x+?lBqWDv=O1_R=HL8W&G +zL=1%_;t@7>1d$UL5HCAh0qye6tS89Xbj9f0Y&MlyaOdq#uVYKI}GP=?()lhnqn +z3n-Oz&x&Y~xaY5R5Qb%BruhyI5|Uj@q})Lb1S1BE;R49RxU4E5X;xKGGG3QL|H_jU +z);|@Z09XNKhL|?sigVtQDmie+eyFM9ihb-&ynD=&S?#&LJ=|02XuUYH6Yepr48IbT +zWO=z@9cH7kO43Ka(iUP8fTacg^UU=Hz9*7CFSH`@bzJj#hFCN+p>%C|s!BaZp3jh$LG-OB4%BIFXvHp +zlZTFk##+h1@hHNsI@bRg#lX<50_cQtQlPg;g(Y_tbK6pC%svY>5`4OQ+7V&%L*-Cu +zcGY?ZK&?Ibgmu{B-?!mD@LfWc!xqdLZ)6ZFPIuRr +z+{cHWTKCZDbqxczv@?FyWKON?j6H*@-fv=T0{sHPXOPO!@X7r_KJjhthk;gho-(=S +zaw-Zv>n|Af^0e)q5A?_p8E1hCIqYqqL+&K*eyR1zc}j{A(X!_ZyN#YfosR%TbWK1z +zd>J&+(G4+Q70r`Cs-9rJRg^cxMs4`9Q5!4gE|e29Y{>fYxC&y8gh+AlDMXh{@KP39Xa+mFZb=xoku^11u%10ad|96ss(i8>o3i6v+<0 +zF8zdQuT$p81<8yWM`)XczV&5K3Gx +zF&U?g0TJR=HTAe2Mr2b)a_^}(PGf$gauO!3B5WUDS8Y^YxJtsn5O1y{wb;Zm5cTCD +zZH45xaX`0e8B`~S_F&{l@#btT_Bn8BMzzf;!ctsv4wM@Y&(bhM9}Ch;F4rZ3# +z+hU|e@Euh3{uTFhPF#hqKyZZfzU|{tKDEt{Ks7M1(tNDxtOu|IDOgK65D98Yypcjv +zv~9s*k2Ey45{4S#7W?W7sJFL=&<-5wCnU1wd(SOGtmrs*aF7bXdWmgyFv-UCO$AT? +zK<`v#*1#F2X{~~JLZl45amX)C!hi@}Q?3C==scqadRXPmu_vJ^$Zji-4t4#*1dgW> +zLKyi_2`X|^T1#;lMc0W2%q_j5M>^?j@c1}R5X>3Sk&Cbc!ft!SPmpe9h1gWF?dW6# +zg&^p%;<4fw=1kCt)<+rO)Kef=_h?I{p8BI#|Z)_!j=c19S*wy8SccP +z0w4S!o)1%OzW(iVDrU%Lf9 +z*AXtN>Ue0MKFX-Z?_|>$*Qu=8e*P&9(G&RWIpLfXc!YAhL>o&WvZ6kI2~bwns`^;L +zKIX*2c?ornD6+H1bMc&Iny1|xPn>`J;@rX8l8@Jl$wmmqNkNHi?F?W(f9m{&&piKV +zy)8M%&|1=>yTLFNTsQ79!>bx@34N|X)-@z-otJ0SFIF5>-!_?fVm$tSvm&TI! +zHl*+**DVWv9q5U@(-2%Y{8Vpr3i~is^>Y$R^T0Qdd#`sn?>VXr?~a0Yx!NiInezN# +z==|d5=|l8=^cZuqj-Kk<#PE;eieTh}J}1k-FBt&CLTlND<1ivFPh}z7)5Kz52VH)4 +zmSZD+_r{YPzODD~l9fc9t0>tOV6-h#1T*{+a{SJ&AyyjflfKiU{i^b8f@*KlEFuIZ +zewkYD+GLzTlJ05gptd4gWUMgC^fQksLB;@lz!9xBD+VOv1)X4C_SX8*i*=;8OivQK +z6EbpVH+Rr#Fn4wz{{mIDiVa;89iF|T +zv6&iJ+e$EGDXJLr)ezj7>3dtrko1WHZ;o7dVPopD+h1P|?zMkQZTDz9F%~M76nCIj@Z%-(E#MR?*q`Fm0 +zIN(WHPCcA(|1$EY6LonsMrZ!>nTBFYvqs$r$b=eYc;lNX+yMrvL&@XIo18VMAUFg8 +zy0q&f{jX-*)K{<>rht8yA7ET)}dXfw+ogH08k6Do)R +zb7-=*=_b@7@k`c+Gh1 +zY{MY5xj^!-Av}CnXP@XS5!20#(mQYxQDC?W(N*Nu= +zocdhRyr~e}0jo$&7sVg33e_FUGzB +zlS}>b0I@Bb8{G7~iM$LzKul|_ZHMoCc8IH^wP;`r?WhyDRaSLQx|_7FmYsN2WQZX+ +zcT$Q?%4yj%JE)#d#3g9csKEB2n!I+~(_o;c!8EW+IV6-RerjEQ5wROp_?4%egQ4=i +zBn0+u^7IIyjgPstkTbJbP7EuGcLd35NJ?2zpE#Vd*|cPUYRc<~)`ffoeswnLGDsDs +z!5c4-&&V>196FD2X}zTPywiKwkPfzPug=Dlroq34wU4I_ +zi}&>Z%U!JDy&7DrhBr%?<38S%YJCZ!-QfMiwU9ZGrT5KEk=unASvaatN}swQ4(zSV +z0*ig8MASK?S*3)_m{cnt!WL!N5MP^J<>sO&2S^+q5oNS|5avT!y!I$b3YH;Mh3>uP +z&LQl`VK%vG;X1exXMhgil$1|q^oDnmS|1!7v??Q6Ap<0!IP-AJ$%?rm05>4BZo~KK +z<$!b8-Xu<2Wa8B*BU=k_`u_Xc1m%KNupzbo>xqeyZ4#W(3N%szP+btRG2M@qs)RR%9sfU31MN)b2n~y5yxb$p=4(a=^i(`YaAHB4xyb>jLc1B +zQBSMH1!u&7FI5gS6&Qw^(KvX^LOZ?Z+HlHuZ8!y~rf^Vmy^odB)%rIGT)y*5z`apV +z*JEadDFX=N;{AYb89hp-Guvk5iVkPNf#^RlaZP)aJPpMYTock$yXY~DW_2o1$iZl8 +zCG}9|QkZdYNJ7CBQwHco=QhZ)gi&-3Iw}JO*e0YK<-3?=CY4-C0pOMG*S6W52Znd3 +zI&O^>TA>SxnpGU;n9b>Oy6WN*oepekFU;pMFDX#y-R&n+@q_$oP$S5ZqnV+Kog-ed +z#DOT!IXr^CT&jY8NSuvPGPRlN^G>SK!j!V!%iBtB)vM*CpmbN&^r)_<)y;Jw$v_LN +zH$pU$AQCAPDo~xlvbNw{*A!KI5NQaH%;mUz6c=u<5kV6$s2G&CukGCQp=%(_|gysEeWJ;eXr#TVMaLfeeIkhrSVT1(W +z-w6+}Hz}*ii3p1V^l3q0{(?2a)UCGy3G`e(DN|$;m@Yu5t#(}GO?yC?=NMULk!8@6 +zBZenrG405E!4e2bxYn>ksAh|$??smCM5izNjQ3~5aWLcXh)`_N_`ASaITq)ZrQ5{_ +z=%0RFzX2aWMFqd_h&L$*KPpaXlB<>EYT@v3cSVQXYbs`P!uGXD@HeL>H +zf&-ZiwGCsNLEjBDPA*b}>MSsj)T~@Ficz4;R^jAsQ@nt|UqzTNtj-?kktWOBgTN7h +zOnw>F*m`A6b3!=kLu;(7lM3+X>b|*gY!_y1UyW|dBz=t +zAdeEvoz)KrHiGn|q{dSxMr&W`aTjVtk_Z9D9 +zt3ioeIEhQ(Nq4ym&ZF4{c=b9kuc!(wHKUGmB559zFl{A)0b3K%giH}SNEPAgT%zl2 +z2se)*J{Igb&}3KC5b6yDa7#FN8*$FwaQ7i*Wnt!oY1uu2P(BELUk-kcg5P7ya5?W% +zQDNCD)T%uba@?doi8Yfw)2WA2@3S5o=06izkhe*IqJbLhYF1dmeH*5FCr1NH)=xk> +z5hWL?1#N8jnM4tCNVUSOu;91!%Nf-9?93cmhC2jV!+#7;sgRP{{3|zGtPg=Xz#j1j +z(0pYCo;`AOcMT?l<1t~McC-013}As%${h(A`Y8t+c#0qIEVWMD{p^WOdctSGR;a5h +zNQB=rLN{9I@`-i`xymW+RX6?2)GL0)@8O!?!&OruTmMR;vvF^^Z5g>M)Hwv=Y21tyE<$_LPnH{mefD|cu2t^lqwpFsj< +zZ5_1f_cHLxIJ9!o=jn`2S|`DJ(Fx|tuH^)Mhs +zX_RPGfAag{U=*JSP0b`d|Du{OsNgKlmzm)5tUp~hJL!IW##(nD+}l2j|Mg~WdhOCY^Px+gPQ${6XVW~=C$odr4UmmSa}+a9!V3fvE33ouI+4U`YoZ4WV-2^> +z)tY#g6|u7r3L7oI%Q>lH3CEUQNu0e_@n9W`Q<{1n1R{~b960*zU^F^G4g>4KT}R7A +z*`S!t=pGwp{XF9SY5U2xGwvLlfhsE;k-~ciBRlL2aP*)^8Co2?+bZtO-l=%=5a-}N +zIFo=q-`eYnQKVZUu>~L<>J|^e1Na{WJ~Q^3Mmu2(zphk;kD)+k!9-bB+lzmd7Nw6}rVRcTxEq!J)aX +z)iu}BEYynJ^ze_n*VDV#SC}VSU485BbTd6X%f&U{MW0f+<=QY!;9qO$-D~C_>x&y% +zx_ZY2%2@8M?r~$nTAq*_qlYU)_fB24hv^evA)`S?YIuAjiKr>|bTg3Y`|S}d#X +zuGvbX{rV88hWp^}`zEE?MbpyO#J}hF;ncmSp;5-+Gr!)#ZFg7Ocf-H!p>0)dVc0Zs +zpU(8uQY8!W1SYM-C4VJ*&)VABb`Sm=tLOA`JS_s=h66?r+~W^f8!nt#L$0?3L3R<2 +zf)IHtc0cNq)5`(9>_Vz9cDPeYVVHzLzB5hDPNlD`Z4q74NI7{xsa4XjDIkI5fmn$P +zqJ%@^)?DQG%M%lm&TGQC7)X{hivUN5b=WN9w`m_KN4clx=E^oVpa +zt96^QlEu&aoPI}pl5%wmvm8+4b%|O8YIbj!@7>_!o|-I;T}{N6XZMc0Wza%Fq%+jD +zkWhJXGq4Ft>PklIiBQ`*_F!nd*hro`!+9f^6RFm%6@PVIoTdw9-^jcPCj#HDCBzd& +zb{fv7na=gjGwpx|U@k=r1+D8Lw11njwz~Oz`H+1m!Oqc^$*MP*?#X^TJ5{L*RJ1l +z@9L-VuF=5%zKfLC6ym{j4P$9K=ekHcm}@#i$%ixWdTy&s0VM3Z`HIzXcji?Re9Rj$ +z{$+38mlDObsQLc9O8Q1>o;G|qnA`90D8=g-&#Pk$vdWAu%SEH8=2cXUjYPb#irKs> +zYAkKMj)Qr1WP`CG44emaQEv|C)wE~icu5N}Z;763s>I*zNB{$WsI_>F?qK*^KXyVf +z@m)DujgNb&)7Q1ZUu+H_lRoE`W7RDwU;Lv_F&@z!l(sO1D_X%25yyPl7I)4ufaCN< +zv3|l=be>31S5v2rL?g(c&U|v5U|fTt89IuCyRN6OHXA?~Q;$QKjrbCQyDD&_QPpB{ +zbd2`!h_!Gq+A@%EAchN$?dvZj2@+PuVL3b{t1=~Y8)9!Q+>6YY+73+qLH~zf{?HjT +zAvm}7M4>y?hZMVVgHmciOv#~HlKoslXvBcX%W(I>4I6CQvTmo>ZrpuvJ$5LH*j=>I2sutK_Y3*_+zKt644h=I+7WtIK?cZ6h~W=Ui;J!Uc1E*XmAm>&OJu +zlI#???&KaP>l+4ADZgvp_u%q>Gq>}ctv+W*;^sM9z58x?oS;?92$7I870vh2gY(|y +zPY#AlN#-0rgV?si@q`Lx$< +zGdJ&f-PV*Eb4O^YMcje??yHfV1mghGT)P?7mT-(KQUdBqhb~ic=?D&Fx;rUn<0|nZ +zKtnz@$norGo!uL5#{iXJ=ua={NE)ypU5QmWC46vtX_^m1W>@q!g?UGdPc%`ppNYl# +z2$)o7Go`!9T>jM=RFR5EX#~KXsXR#4>p6L%FwUDC>XdhO!zC1@Et0Um6ZUudn&^I0Hpm +zwg>Kl6%({OIOI>8yAjuYlawddH6MgVdpX5_G@8pdDIN^w!ks~-7xLmGnylyKI;c$N +z(Y|dX<8tKpuEycwoo)WX8Q9T(^q@3XGi0gnsR*qq)^#!aN*2utWqDxxx^1O{JemLI +zh%YnffC{6U+cV4-pAFz*=*JV4qsIW;>;-BYP?PigSMMhKn75zS4e-`Fi4f%aU3ge!BwsAzX(D!a$Ln +zGCy!XnR^CKVdb*{;Vsi}!8i%Xi~H8s4+toYZcp3!ZbA4&p6e62IWc4?5&$Znc;#7J +zig`oCA<{PWmar)fG+d$)9g-MUKV?=xf)LGRSs$DEzSaxj{Un7e^MI_hi*fUI2`;eB +zL9c;}TsV@LA53avc~i3#gR&xxlv-tsMmw@X3Tei;em*T2OUe-`HvLe?*G*UP38F;0 +z^rbb$ph=$aXj-Z{I-G6Fvpz$Yml>!WFX->c!vL7oo?#sE>=4~6CUj1{4IF^^jXXaR +zHZiucds^N0-3P6^t9#mQm!N@)PAs2k<8(PPL@bo*YnPFrN_c>oKF#9E(_&O&k{>9= +z0*;FfHWc@-t`ytoim!ZIA?F(=@f2pFD%$8If`5!739B)EwiSh)I5{WJ@YI@mWkgh; +zBQ&zsiDrX&25q=*OFU)T5!l58Leo8pE?GOvT5h(9+fID5^Ufg4va!pDLB28q$OyNU +z^zlr3l7?*NivDrhgR#JtC1)_7EZ3DLCOFl->vyWZkrDxXJ9yR*>!?IDb|{d +znBG+IGtN{E=DaE&>&WGZaqm$Iz>>kz#SW`tvr!U-WV$+${H@N7U3K7EalP9$ZFal- +z^WOFA&1sZW!6oCD%@@kZ=T1I*rh2i=(WvKi-BF=>!TA{{T~_RRwY!LJ4x1wzh4woy +zK2rC0QEFFg&m4z*5-c-4vkA$s86wuXPLtIXihBt^sbp2TkDmX!1}|V&gR*kuBdwpg +zPEzd^J5y4XFzaEr4Y=6>3@GaJVdP)72B+ +znsyG`ik{+xhT$}pox>~ukpvD)t@%NhEbK+w=v_?<$me9#YYS@E$l_k5lsj0;E&`f@ +zXp^G@cL!yPVzi3hxh(sJ8{wM8-f%ijdNI0ws}rj(4(PwWJ1|h%`e(a<+%RhvdsG0s +z=#SFR_6qUmWFT|QJ}_)%*U|k%o>~wglC*4U5gJEHAdan!vPGM}>_j_u6_UWZ7;0FY +zcJt_xRM~Lni`&ru%(n`u>%3k7pn@6YOLv_?q=p +zREnjh@M1KE?0{K-b!lNB^$_6GEE50iFx5kaf;bE_7R*cN1R#6acBQ|C-)ZY`nLEmq +zEC;h`EhEw4a@2xa>y<(C=E1VB$LPisHaJ`CZoelRwXSTKzI4)~Tkp<&N3jld5=iDa6Tn$QKsO(4n>*PB +zjkpXIAfg*G(4S<^b|-nITY{TKDZeWf-Hr+bPVYzkvArRz3}BzS?ImW%(DH#dIq+b~ +zb*hFC;Z#ipv51&G7CykpE*kjbAE)p%Eq|Dr50dYAdCXm8s@)5Fw6|oJ_KwWevRw{} +z=3~B07y9|G*8}r=*#m|4op3%ZD2L1gx#bxVav=%{wx1u4z5bZrOZLa{nZN|)Z?9%! +z=okFO+SSFa?+nUv;2ar!q27Y?5+F>(A!-6`57I+&pqG9w!e1oR9yaCLLFy5bGvWx*QRr4Y49 +z)2%#opCznOBZnkt^4ePWGz5#0r)Nt9NflCes9J@0OP&6`nM*clA2iI?mfPI;{;{VY +zy?Emt=PeRU!Wpd^sUN60o(}rq>f)2MH8f1M>8L`^8L_^Kz>uX^b*4LKo#J0I|S54{L?8GoT^txbv +zBYik-8eQEr2{z^IF2j;j;n>*Wr8*X{jzi=eZ?j{?=nizO?C$4C9lD8dEhrv9xQj)kWn7a_>p(> +zw%*NnsmOW?XsWY~%RIc-a-5hUWH_Ep8BmXC)iTWIB=c`d^ZU+lG|a`c6?e1DWSV=V +zUk-yV!K1WwZAj1_jmo@Q!h)#i44FvsWL)L5e!0qZqru9@?V%39dl?(c)Hd@0iQX5? +zdOcC5yR!@gh#X`Da$9EDO0XXS3XhLteip +zxkd7bUBn%}g}Z55Yr#Q0`FFZa+3Kd=srUpV)9;0_4fP(Zchcc?ZLQZGP?VvWuNf`f +zt#ERZ=57sP8!dglsk$o9!;>P9=Ny=;dBiS2=Vt|LOe7$+VMCrth$(@>7MCfNXXMC& +z;w{hQG6M?L6U%ESUJ|*^RJs@T=N9C;TbJspXPuVWK3H}}%t}l++hC;erAhf3*q&~e +zn1>3V<@G&tbUnAVwx-^_uuHeFwvF8jRIU&BD%S^A&RrUffs`70^5kp^|9r#(r`GhY +zd3x!-C+pq}3u@%k(T`AKygb}B-BXlm%XD>vjh!QY(>53YMHgikjMA=t +z{HYpI7fVpH_zjHGc_YfemD611ed~i3RHKa;+C*lDN>oEOq8W|hs306lQtyNVw&}_W +zNaZwh&U-$F8V3Dy@g{)@^7Op&R7)4eV(0bF=9W&Q^s_XbWZ5_MQ_?`8jlYI5J +z)Fq^Vs!K#a7tCgaPqs;n5P}@2geXLYatOfyF$JthBNgXuBEpz!19*Qj9thu8r{)pf +zm>Z=pF~uEcP{c~ftHKpHPSvmhoD~GC)=o*{6B(;Y+=r~)1J6g8s&JAOvXSsTAf}6B!_BZGwyp*(0jakO*M^CA +zv1f^;A9BQ7?K6HQiqnE+qv@#}b@ApWw(~DBwjgeNoo~{4^t +zIYCHsg4%b1^JE|k!K2^^)RoDK1km#dHv7;mUVD>5M5Ocqmj)DanvkGC#s#u5#z{s> +zOz!0(vvEJ;N;-szFv<6e(u~x)FxHd(ydU;r`6|o~t!m$A_xio`s%h>;#}F16 +zI77lyc215f^FvN>vvZpgVmo)iY{)qJ%GgMBL8R3oEhgoct>n0fEbt~NQF8$BK#KTAH+WQ?_Wdtkf6ywI_TeGlDCM}y*L~lUr-e@R+8Wq6DsQ5rC +zZqA5HTQ_wQ0}PuT&};(Sq$D|U*;Gqrg1XF51--%aAx4M4`^YW&ZPT`%}!9@Jb7RG9q+rv&EmTtKx&3pI)F|9Rm +zS!X>$#Th|s)fryeoC&F9#EA^b?q-v1P)2Z00l1~NF6OLG5N6+z|6Foz#a0!YOU +z$P2{+zccn2k)2qnaa>*>9~fxmp3G}%YNL8kA|+4-)c#C8ZIigwcatYap3Wf+)Kh-U +zT-f-a*0`O(v{l_K#$%1D1pqqcOR*OX*>Y2ZIHFzXIy1+S8fQd5q8sKs^ +zwoIu*sCOH3$&Ovxu`5LWbgZd?_ROx`t08WVf>23+$A{I2U<>mphuNk#J<0(OjHCpF +zsFz;{d86Ffsqz>?voe`Oe|Ph#A|A3uI>|84DvT?)RJ{haK>80RDK=<}Xp8mOq<&cM +z4%Awpe_7&XYN@epG!!dzWCGJtg*pmTI}7aFs5h!ySJu*2w9}#D!W@vGitxw;ADE>J +zK2VFf8OZiZmCFW-PADnE@`a8T)LC%MYFZhP+>fRj-8wqjF6Fq;7a7=Ys)kgborD*O +zmqX!~T5WTHmKBYX^A=DEd@$MWW*YU?C;nb35Zxr?BAgb}ZhWW4jOf@CfA;KUfssY1 +z5xgKlg&COMQEit2=G1U#xO&4I4vuPf*v@Pqw;23Ww@|AO2uePIJ1Fnt +z{q5L2`YgqhWoiN52j79-MeOARA%vdE&9aU`tn@rHpIU`>yEY`un@B^#o47tC(@lD4 +z#zA1R(eDSofi~`R+q+TRHb69X3Nhu9B*6j{A@wwpj=sB)CrPP0HEs +zUd+M81zD9^zMJbPP*&g=(7Wlrq~A+P)3^l>i=mfdomC56jLue^)!mt2`bi^ +z6JizHf{kl>1nN80LDc58uCah&=r`2d?8;lqeL%WHoIjNq6l=x1%hc9MT+ZYMxzgj~ +zynPZR-QuliYPGI7k_SUfD;!~K9;L16hN0T)OGS#gbbEZAkQ@lrFl7}CA6!KBe8agRjMAr` +zyn5+fo%Ef>sBgq;5-5<>Bc6f{$4rK822!yL2Q?z*CE;#nEZ6jIjoE=XTXJ0wObYi=gsHA}T=cS=wk7B+m;xJixhfR-qeK +z$AR02zK}kuhi*BNVn-?;l_LQW%BXEDZ4INao>;)TdM>jT#nfAfVv4IU$A*2u9PW99 +z0qU@FKe^wH-1Q`b?mMkDtQ*M`Q@Y*pFk9AWp6)@_W3M$*y)5GhXY&-Q8K4JgYd@Qy +zchnN+(*qb1i@m9&n3N;raZFu>a!BT??f7dda;lWS2?6OBjmQUavJadSRMU_i&IkEa +z`IG^Z*e?K|p)@?Wz3hqggNnMz!~7ZqIFVjR8A=C;P0BBkVrtPmz)x=;&;_hj4*KMM +zYGmU1OAK$T$Xt-8DpyRkDZ)X|xpGHvUj7-V@+sYWY7*?Tw8eh|?2|coyJldE6+r%d +zs`fk`RceM_de(9;XZI1MNTOnrnN0c++Ul8X)F*;yt9*uGK8PVC%;$?qu^J +z=oY6ndhLlJ7d*zcxpDeZV4GA5v8dCznkEmaR~S>~d7R_t2>oH=OAzps5^+d$Q5Jde +z>5NFM=H^AoYM~q-il3y7Z05R2-1k^%p(Q@2T{G1v6hpSzG43o-dvsGIkxyVdoWvKC +z@j5CL)rnCgG+B%=uRkMo5d0Bw78?Xe*9PT6MEMd^E_kM7n_=8C +z(l%i@*l?@dB7v){ct;>36R&t2j@`3)B5b@C91Bivxe7-|*BR&oJ#sRa6X34cA>JRyU3(9^z(9DB_RDH6#T|IXFW&`n-Slb2Devpgia% +zkDCPq-y|R-<}ZX{^`Qcj{h}P8siMR@sMTyZ<~T=$wuWhhotU)p?ryh3+e^fNO7f1E +z3cfONmwbjok67_db%;t>PAF6Z60D=6&Cu{OQ>xE>tFRZP4{bTlj9m}og(zxMIYbbu +zSVAKqV@~hBy?r5(SpX5Pb{K31S>;55CweCqS5^)y{?PQ6ZzI1Q94C8tvy&KFAhSND +z-_p#afBAbU=o0#dz2|LZb?Xylsqrr2y@`U-j8Y;TO1C~bdNe1zZ$t@LM=p!mK1ZTh +zxeV60lT2o0o<>WQPIN3qz!wTFN>AfqB>aw)l@OImdPQB@u?8Aq$gqkYb_8huG~FGP +z+mP4Vd`COf?$}O38w;8)tjQ|P;U6%sDm#hXY$^CGohJ_?WtYGk0-c}AN#9ETBdZ*x +zc&R)HopXS@Vv5JxQPL#C*(3!IdP>nmJ3mxABTm_%mdcqia=Zrz`62tMjtui{b~Y>v +z`0|gATz_Pck`jajN-oH*39shrre1(Kr@ci(eXMf2y;NP(2-D;=#LsHr1J=_NANj+N+_tARN2my+Yn8 +zX=Nm4FbnLngEX`%HeP<%$Qmv)i^XWCtj!`kw6oZ`?&Oqf9dzPc!tSRmHc;Dy4VHBC +zxEqD8Z#dt;9;TWL;O#m%LUH0q7qdQ%S)dSOO9t2Al!BCLixV?xsh6o&1}Dng^YIF- +zAcmQ5r&;f2;$yDkJe^6f3Q|$7*#z~x+_p(Zg5z1XvMHuJZExy2)@{xv4?UWtu2?mj +zi6U#48m2>w1|EW*uli@2@3LcP!%xurxVKw9&kL0x0J1Zk23TpkP3qp&jL>$#c8-+6HVQJ=?cMO$P0^@>CjLpum +zxcEub293#Ut)H1%{=_AX@u@ggD!Uhd#HjYNL>uqz8r7!TT#;?0B^|oum$PrxR8TT! +zp2@*y8xkh+kcvVn`U2W%n+QlP{yQj(Bo=Z}SiPA=JOIU~-#liuz}A^+D&DS>kUN_7 +z4P&C_*U)XpRiQOq=Y)+T^nGG`5SS{kGYsTUUYxT`LA6{T0%Mu-v=>nDo2{i^-Lnf +zNHdyA3*%Yf7MPTpgSWa2;Qw(QLz5p){X+06I|Ww$tWA!6gF%Ca(O3$K(|+VJ0L;K* +zH9|OIaVR#-hvThnb;}NClJ6GgYCEcpMqVsdFOklkOGne{oODTbPI5|}W&1Z9BcZ5u +zkDsS4SjSE}8{bKC#Ff|S&}`g9glgAkgEgd?1jvYDXMd^Ls$z0fW#uT`OPzFXmLO{- +z3&g6q8`JlwV@;{bnbQrxs=bew9a*ESqOT|T-9hPyQo$Hnz1Seg0cQ3#!2o4b5ksGO +zs2HYZt;$vWt%&rqQOFpom^ +zP;>-V3Eqmy`O)T_W)Rht5z*e$9kqd9<>XGXmdsV^0r-tdux3gYw7u(00{#;{dGYo3R&Axm%3!gn# +zZ%sqoP0rVxP`N>wZU==$fM9t)iDj!tEt@nHtJXXFd}U5^WDCXCh(*BfmEA9Nl}SsP +z8P_}h7Jvacj@o|XyQHHt!1_5aVcz{K=ioNF3NBNt*`OTdJgMvF#A*w?)$Sf%TEMJq +z=YUd@!;U8OU7&i0(|m-Qx`82PGc$SUy^CI-oGBXttk8j%RRwH8$0&LU{I`sNils*uhE{W%wZsh +zrSzI%daLW#6)eh@)g2>DMO1)UC5V1-N+(}^EgGtGLPN$E)7Q)wCQl)GVHR +zn&;?;@i}GBG==|6d)DHO$6E+xE{gE7rGW3|lAYSthPl#Gc`#+21R@?d(x;dP1z~#; +z_)cawgvw~MR9KJd%67g-kVlp4X1cnc+O>Cby*)Y%C|sYpHpy5Lc+6b0SF^n{rz-RT +zCh#G0V6m3P(UIr%=^yDHVUlrNd)$Rz-*T6qK7ZrV6PLE+dXwMk-a>m1ij5SjX$6Q+ +zhglb&e0`og%buE2yS1i!g7;91RctCQcN?3aoTH8+APlI5B%Cw)vdJtsw%x#zgx(f!3@tvFU3Etb8HOO +z6SFwm!Y%9D!#Z+_QaZt*dI-D$K6W#Ol*v2L_RSMl4I8D-Me8w_tN1OUXETQAfX|ev +zCVe;fcG3^jQf(`YbF1d(-D=hQfX>7{qwYkG8e^VOa#|Nn&cL+n$3n12l(U&Ub~yT1 +zTd&Q>9%so{55YSFRRBM7;9`hhU1N+W-P%MR3mH_P +zLifT$i}ho?gtMkr?PRxv_D1i*u9Su)cQ+q8o$-G&{IPS?}vhT5ZHCukBZ +z0an{6>uTl$_ifLxywltoF};S(M5Jfa=hJJe8`sT0R?NpM9rJ4)f0+)gbf}>GxweLH +zu$#4a^wo47s-XI&8!PFHY9PTOsC9o^b>G_+POC>Q_OgRqitmnkxZxf)0WBn%0!`RV +z2q%pAMRAcrcWt*-Eca%pGt8T^B=d3acDr)m72tZvYG9-^XsZZf0qGfdJ3>4ZWlM-( +z7Y7*=cGBn37od{bh9Hk>MsY4qIm)EKkB#T!7{6d{Jay&C$DgwI3;)zgOm^MS!M#(8 +z8&olz!em2x(h0`X9UOHebYz*HYy@4|SkRZoZjknneU43sk`~OEdEcMWRTWtQurqEs +zm>^0)j9=R{VdBdw&Pp~ASdqbi21GBb6&~N&6T>5F;;p;W&Gf{I;b7G1L7#cU3z^L@ +z&I)wYd3IL9*`_dlcMr(!8A(wtV1$`AdQ`EupmwIlxKq?A@Ldqw1r|ILoip7XXs>Jd +z5P9s{zTb505_L}yUk}jl`Wf(7&(XDdK*HJtBiJ2q)TC%qFsK17W^cKY@y8H9;Z20n>{Vopn@HPaA-xLApyq5mAwn&IJ^ZMv))Q0xBIM +zohwoT!YYVJt~8R;&C(%KA{|RF&63OJ{rJwg^T)mC{`1~BGw+-`^FB|_z21tZIFX)y +z7sY}6QV+!t^gm4HAU^BSjO&g#mmxu1hzjaP@KMa;?(=9CbZRo4v<%`dkwmbWkVrRr +zUTOx&01q@=AXGF#k!oa^TC!)_U7bX&%7?T$^ixqrx`h*b-*8V`C>D55T(t +z74|eDs+F6DJ>ZXSpgL>6Awt?vyiZu(=Gd#pYd>cBc5C^@KSPi0sn36Ms>n^b9j`2c +zZw$!jZ9Qo!@H!Zp5q2`A5q4;#I=Q8#Ud%e5W|2bGy1(M+H+xN*Q{Qt79vP|d^MEP+pCx31#VP)x0z1kI|pL5WC4Ts50BDP3TM?09hNnVC#bZCwuQ +ztT>mWf5iTP@)%eVvi02gqsMpO-cnHoaY|)n!8iXrLX|$#4i(4jq`fLvOnYe;PrJ7& +z?~R~rX8cbD^(Ou1Yktn}n;WK3ZLf^=1mzqFo81aj$o-IK67C$i(jJ#vWsgw|KL4U` +ztP-|FNU+Kdq8h!VZ*%5%JrcLSk{;jhMFrDroxNLN7c9nf-e4P*HvQ~7le~7}i}&Q9 +zxHUs*2~GZBI@SpkWOw)7)Ym!%jkx2C~4vm&KqF3Q1;$RLj_T!6vE69@JcKY{+*0Q=gm7;zMj* +zw>~>@|0Z!J|JbmvV*4jBG}~LUb!{!Yd2ua6=bmei;N2LvTHKSGal^u4_cZp<>_zp3 +z3)tSbZa1VwSWzL}*nrnKt^edpsEcVu9!Dr+1FyXH+x^^g@8#46Yc$?8orhZ|)UE3a +zWnx3{&TKx@u-rEbCGL8>KX8s5z&FP2JD%XCj +z{+Ew}K$49b-`GUbb+KjS$oXdOQ=>N1wrIi=it^QgLH%-Zi3N*v +zALnWD-Ploo3}x^)B&&DQR$d@n%#G9Vl{8AZu8O{yTVzXPhiQv0ansW=b!AS{&tZmP +z@Oy9An1ZS`-1nC&_imE->z*pTFvwB#l?&%*FbX*| +z=AjH?{f=mIvTs~$Cpw1EJHF;wv6J`r5YiL-7uk>@V!_4#UXm^odcoGIQr>yjo+ju_ +zGqe53|MF#iIi2cb@VP!|#~{a_<6E!!&bl}h=APVoRUZUR$7&8&H!{VN&0Bd)I_k{Q +zCEUB1KQn1zX4__e>^oSrRJT8A7e7ZJ=lbI48^fr)*6UtVGMk=B<;pB~|6z%Jmk>9t +z*yxLkImy4Ctz44~l)!rxrK($PFEcgQbc`Qiy8=$EHpE+VGd-Qr4?I+D+!X39`en^g +z6hRH19|?x!62^AU%JeV?=iIn})>ghC{GA5Ky)Xvnt|Q;lUi^=T?P*fR;KCF?nO{Ym +zs~$&eakV|Ojw2DaAUb%dKdV#E*mqE&k>|7G3R}-Y(wfT4JLl1QFJ{w*@E;_kHpX{f +z--G80!s|Hymfux^tA`&25N=z_<@|?8LQy<6T(B_`{zoCvn8;kH)^kT1Q?grtd->mb +z%;!dRMyr}&ukyHdi34W^FLTA_pZ~t)H%ga&|9KM_c<7c?p2K~4TP-A4cUoiqxS@cW +zDq&=8{=>TqhEKuA+Dc6Pq2KL0rUb*x)%%tEyL}SsXmq$N_7=ZyDjhFdPv%o^%*fKYhZf*lxCF)PE?pbzGSa +zt^~D~5O+GU1?U-pWm^avzllN`3V$ugaO#jzQRNM8=M}rY!sJd5!kza!B%#uwR2c$( +zNf{5acDZSbsi^-`+=8wWvO0F}oiWvb51O%a>_T*Q;duPk2r^}aNyy-*==fb|*4btA +zZBbry$v&^M5h!Q?zmX?uy*se5KvsN*xOwPpWm|O2Mb9EF&u0mLE;-|Ix4e8vu4kT{ +z;jI!m@uUj4Ktd8g@<|F`jsKf%+qajs?PrHqgD+Rjo6OAu^OI!HkVMmx)#D2)qw0P5 +z+Bg=A{n<7%dxTK%cRM6GL)*IVml%6`ETvT~#}9B4G9rtV4UZQ@%Q`&fY`i9Mph5_0 +zAbjPc#nzAPY+Zzbeu@{*dhUhSkx|z~+d~O~ZV>8S$t^?kz*+|>1*O#g=1Z+)|GL$X +zRTpdTSdUWnAMMa7X{nz+JqvPaPP{%UXvFMH$Hya3RuUC9s48=?vJxV)yeJ7MyAlI$ +zV&mxfH_tDq+n-Q13QV87*t?iZ$yQ#LexUpNW`&OGvN1N2y+Cye_wz6uv2^woNxi_c +z^#U33oLw*y1W`^?9~?Vi#^zL}@IP8a$b)U#nqz6#-0m8)+X~~VN|gkHqd7T?xvUqp +z5!2ES4s2bW?G)*(T-smG2ZsN)1>uJS376i$xhS{=7c1XRL_+}dc#blG9-&113B#7v +zwx5835jgSso!=6`={P10jOiR5l>oX0uCOp%3mn4>KiL2-co7)T3OW`bBHQ4Ez+!+X +z4>@mwTzC_a0+@CITn!k*2uH~RCkO(osqVyFRs_ +z^T0476HZIx)xLTTMh5_8(3sPOSPPFp=h}K$!q!S_ksS +z9ekAs1J=M{C(d@bI`8`tTV`;q1Q;C)$-wKK?gxegO+XSHcml$i+W{N>w2*L=02u!r +zg6}zlAWz%8iM_@^w{iFd6!P-4N`Tk{a}Qr|UqMZ9!Y`=oPUOL7rm$1uUPCniM2uVq +z!a7cz!j}kuLeIisr#Qsq8k};whun5Gw(c#;sxW +zBSx1HH%0Bv%8qf}Fx(P?SeaJs36#v2gK>KxV%2|_Wl%VtXdX6pJf?;(0RO@j9~1xJ +zfJ<8dWgKxiK!gHI<>-j3jVhoe4t|(ZjVU#TjJ5$6Fj#=v6)VKi`S2$i?zqp_562_~ +z9)@keF~89Vz`!#2WX~AL8ONQPLxNA-!42ry&XZZ<>1tcV#%!k&?zg-xzO)I@JlO}3 +zYt{HYSO|d@*piPRxFdkfP~sug^_Vzrbw6WVRq0%U@a#euzt{{GEH8S$A|b$mLQG&6 +z0D21y16lw$83aE6#|rJdjd{Jgyz+LpCa(HBTp|2364F(*Q{!|KR@u~s)?wr%CMQPJ-35!UKkvH59u?^Ca(rjylh##}w? +zVhR-d&S8<0cLM|i^_N)opVhH#Jx5_Gdx4FnPOS7G?DUlm=u#0LcB%|Nd!>Z%nG5Y7 +z?A)4yA0(x#?RP>@K7b;o9E=~Rz5?(yRB)eDG02(-821X;&QjZofm~fl5Y`LiucxUa +zTm*8YGjyM~>A#2rUJ-B17l{?z2s&(-SAu{uw+S8*RU?W8hOgMd&esGmoy+h`V=(Tx +z5p+Ujhgma+{QVslv4a}~p`-ymkEYC$(Li__E!hsb5+(Z*$ +zA98-;evC^#2DV3uCB*I37AnYAAmkVvwpsw}9@_<9b-?^Cl$8mvt3qdBejL(&PF4*J +zf-g3kj>FMuf$i)4kP|XQFaa4sIF4|+xUQ9}1Dp{r!jZ#AgJDa~5M+8dVHSQA6$n`w +zT=CyhmIJ-L?zL|S>?dE)NghDl6d_#l0{zOJ$dLs^Y6DyqNHGQ$fkknBuDF^Y@BKRwf?fa-&Jcv3pr%Vt(B+yuk$}JzAQ6`_=AFl(5xZbwIsO86E-g>Q +znu5_eU>}Sr-2a$tx4iR^HUS)dWCkg`a0aHwfm3J%!CAEl6PSymb%vvRtDo6*q}UQo +ztzkg!`1Qxbp_EtfK)o6OKNPOMayBN8TyCv2Ma;@GiZ9`(0Rh3S7~qgVx%{AoIq=0w^3;9&z4wnF7V7 +zFy`<_%w)K0Va$m~u;yPU4Ir#7IOzHhDUjIPD-i*364t4JKaAdCligSF+(lwbj=62{ +zRvhTW7jgm*1C)s?RKPl-6Nz5A8bt&kc8&4F)#2O5Kw`Hj#AyM%vH%tV2GT>|Cv6~NkF;|{_&!9r^?F*xR_83^ssh7_NccXL+Saf! +zb}|*R?F}c4hxdCE577`E+%#nO_X;e0a|MJutMulx+gU-lg=<~FfOTMGCGEYePlJ0? +z*`Lbk#)sctaFgnNxUFvS@~$Ax@dmFthlYXX`!Ap4Ey>9X#r?aj)GKE?{u4XmU7xv` +zKYOz=;j5d^;Ck|Z%$z1)fo$p2n5X9uua0vyz&}@KID1QZ@sA=R`z-vp&0FfEyd~fq!%^VV02E`{BSo1fuRua=yEw`AR&2zY#ATRcyV7o3Vudwl=3ctaB +z2hN_bq~9ybVS066+i|N)TMOm=aRGc{>r1T>_G68|Fq@R)qvFUVW}JsU0)KNdhoaGg%c3(l_nFL5GGEn^B_o}GnEtb;+DPo#s3s``2` +ziPb#!;BV=xj$qNSl+ddF4$h_|QK`cKHhIwcLBsv3qo2Dra57V5Q$vXOii&)J4r-G! +zd7O6IZvLaT^q^=W(EiP}Q-=8B*w(8fV)H1mp`MVxO2Fm&ozZg}`z{R+ZRZ&@d1$Tu +z$%q<&QM*`hZDg35FbSwU+B@AKihWu<@I4Y+ZXHYK#IM?C_!~u|ca%V0*lW9i&qeK* +zMCd=G^URrkq5po`Sn$boi_L|MFAI~pYh+_Cg!b}4eJ^cPhioQ_1{RjEr#~CMMS%!w +zgKGO%_!YcA-PDU?gbgKs&N7!@9j2->+-pHG&R%E5=kFP|U?r{0JLG`ZJICHO=&(uS +z4S$;XHJ*J;TtI4Z|LvV!OIT;o_=MGXjyrq9Z1K?&T)}B)lCv%>Ht3IluY_O=W-giR +zsJnimmni`L=)98zWtWGbAgCJRiROHuC72me-wj(4zvR3CmhO8{&D$}s4?ZIER +zl#qv2OD%8JCryO+x6E?k71r@j@>Z)y((Um4xo^xY0*^I)-c4_LkJuQSHHh60m7=R} +z^N5%Z2qx26H3?Ktg?C{%Cq7{Bn`=`AEqZT;-ff0Gpobntlgq~D-QMAB1 +z^cWOzzu@HH=II+#iNrM77Eg}K^uONB@^D>#cPDP!=Wp}Ddl&)@V)&iebWu32@$UFy +zM3_z~e(xUzj6QSOid*h>lf$CGMN$>~Edsr(=!8dKcGkx%k#OA>{(EWas^EGR`!C5Ku^c$@$5A +zY=>*AG$#^_P2btmUQa(zO3Pv%ZU2W-Dj +z9*S!keu +zjiPxEO#*^)Yh}D=`Up)_q>RFr$8>5;W#OL$LSu?Xi8V^=Z-)u5cs +zT)N7krD0DOW;UEM&M-pdt#9L>M;F?j4j$u48J^RuqhXa*(u4O+<&kd=32$q<&M+;t +z`I%%Ko}gkw$Z6t=AqDCm~RNa +zF>IcsLCf!?_293Q$!Q)EGODap!ddX^2p+B#AAgki@X*)RslMIW&VTE_o%$DO-o?&b +zY-t1_F&f{y5&j5$*D&*L*6TL?hTGo$sbCukS8F@MB}v%jLLoAB!%l74R4(*IyKVP> +zrp(n3PXku&wzr!!T>LiL0F-L( +z1UM9)YwwS0os~#wMHVF;!91;hd36k9V8s<*A;A$bO}NA^3NZ>VvB@WAptqkOENc60 +zVu&SgKEr6$i= +zrS(slyJ9ZpY7zH@a{CRaIUI>g->dPQPgL7`r6&hi+zCUy9gPaTXqYm-89`ftuf`Ya +zKcD~dQ)GM|p*LS2lghes8ax}0=Cd8qDPhgmpdC?Vu;Z%l3E54~G?cA#a+1F?8B(3LmM(zA6+H->)=hs1=k`i875 +zYwzk@bzS|*?RPi*FDS)l%su>U?B15rKpVuRv8<}o4UQXM2_4m9p8C@ogzgPE9+9{8 +zJ?wV%()~Rg`qU-N_K8^ornoezLwgP~=lMjxe4a6_pQO9rr(-_R&JP0ooXWhr`zaPG +zQI%qW{hIEJ9Bmb5_5K6iU%RKoTDNBcB#KfLL;oY{&(m$Ic&_*!O1)=)zfx>~J=uO-ygKGHka^ksjNa0axk5_Hf$ +zHMZz~oKAiuFSz|`W+e9f(`e_OW8wpGMCe^3FC*?gx6b|*e&N#Z;j+gb`RnVaLWU14 +zrsSrW$0pHjhX;-J`p=JD(0{}odb)VYbY53=-cq{y`@Q$z36#(t^kv-Z?I+?V|IGw7HDh>>B;+x>EBdF9x=c=_vY2~K(pp*ney_D +z7L{{n`!<(-!{gm?x)Nq4AHmgi9aLc|_|%jY>&jIsqtD>d>-Sc21@I3-6A;|y39OnD)BH8AW9NP)mWo{W%y(Gs$NywO`5&)7 +zChsRqT|fc}9s6m=@TbC!ki<7#fnm*w`frJKuyyHN24jmfO4GlblINMw{eius~;AyIhI+BY1^uCdu@&~mbv){|;U)u5HhM0tQ +zbD7--P)ho99;(9hFG|$(^sw|#GVc-{roMhth|1@l^c}2e7?c#{QD6#;6Hd)$W9*Rp +zi0;*O*rB4H=2n-a>-+IV_I7OAk6+c_CmsmjQe2rkwY1=f&3~l7cJSoAj9p)-=pJ%5>vAJUibavk`zgJzfLW@^>Sphj)sGl +zRL$iD!}G^;k}(PYj7iQk$--1g9&0A72dPwjxk35yb^F8Ak9Uh$@(%p__e8o?eJEw3 +zoL0RQ$TD>H3meA|<(?*!qga2SX=F;ZNL@1Cu_V(%B%+ijeAiH`}cl6$i +zP^sj4OwgI|_O3MfzIOf1tgl-X9YT4&k28kn1Lfv%XYj7^5&6F3%C9HI7)Wys0Y-*i +z#(+y~s8ciE5u!cztxO(1Z7cgvFXi70@^Z~Dwmrra3>*)h*yVoR=Oo2-E8Yq%()?3A +zck@14l|JS1Vb??R#2@~4cW4k{43tuSf*)89m%iOIpwPNYL-T<5!=E{m_L4h!)G1F> +z9*S{Sk(+Bi38)khjWwwiEUU`=eDBUP4i%gHo+pl18Y^qR4wwWpJ}|Q<>Qaz@Pt)x5 +z$zuy!bi7A&`#EW)lXu!fTEw&Sj1|n{+@JRt`%EYCFEKiec{2tKlpmt-bc +z>gJCc4vVEP5cMX@S?kK~K{?D#%u`FnX9PXpO3a%Q8B(7z-!Pa%?6NR3Bw@Zz46)Q6 +zb*W{NPW7}uvXF|Aw51H^Ui(W6#8R{WbQ9*kp|Nq +zlP!%|4Tcbn+)NKD)uZ^=(P`B+fHqC>eZ@O@H>GJx>`Ttuc+5xaUvY0x_YrxkUPQ6; +zAfvHb>H?b4f^r;rky7ef6mHaY#lBFAa!QK73=8DjSqh%df7m?}h*X`5lq2n<_UL +z8%)rf?^<+>6u3kK`ajN%XttCjhaZ0x=*|;;1P?eLPOOqKM&qZvhapGP +zYxwHPtQAde?@Yk9B^Cz}7w<)k0y*z2Z%^|+7~-i0Nn*J;nB~4v)rZiPPO2D`cww#W<)5YSdbM!d#tokoE*O+j4O>C4N{L3DB4^ +z5QI_ujq5X+d}MHz7#9T#0~;3Kf3P^lSnx0Gt*Bvd#kto`5K5Z)W142QHo32x2u1Hl +zHNS(x$5PScW{w}2_^WOxrbvF;X7TAY(AMvJaMw$k!zG<5N+RYiv-sDWkB!Qge(?M> +zJ6shZsf4aMHa9p%v02EoS|v6(VSn74r0=QJ>23JtJxbp2CNe~w+IG&~BACNTlik46 +zmt3##Map_%&Fi_6-8Zis@u=cJU*}m+j&oDa!^WCuqC|Jd4<9J5ppYpY-y~90hxg%(DWn&;?Ib +zs**J7zaF6j6fgsK>cw|-4LBJ31hef>IRAB}v8cS~+Li3l@8$9-H7aQcgEjr08qV&x +zn;W0#>1dODq$ioC+b`#L&(o@UF)*xLnCP4K=K%5@JrYuNrVNZ5wN$)y`;m8vSd)9t +zj;Ai7k!5C4_+BB4CHZ9d-?Po;(P$qP-e%^)B<{f|{>|2)NR9UQI-%e9Q^;dtb%IVX +zG`AKnUAvd45ZUS_h{Yt@vz7d!Bj+@oTgT~mLR>GzK`O{-`qGH7JszMI&T_M~2k +zT&5Maeo|d=T017Ffi?5q*KSC1YsGDcPApAVLBZ!P^WQ5)x^QK^sAYq0~f=9(HoLgr=?+($ah +z<{Ad-AhEbK%1*9=B*Ly=WwO$zCHn5t#=AkNNZb^RdqF8jUSIl=u$ +zwhbmi8E+khuc_vrFN|i7|Lr%NK@x0;a=(L835=Zgaj`^T?Dznpv{la1fu +zCpork+Z1`Y78$UW=GJ1Pr=EGUAtBns!Ljetos^F;Oq$HkIn=dTcxX77Z8TiJ8?oeG +zENs}g={FPztpKRHma%4~Fu>pXAEfP*{4PY?D3%DR5Uby(X7 +zygDqBvUjzm>1H+i7F=oC6B*}RVa>gf3FuI0aCX%)pnT|Ji- +z(J$o1(a!HpKA3#VNH*frP4d|D_&g!$xo@DaUMH1sAa59RCRkka%_lvBsp|uqj^u|p +zHY`8JUbQE`D-{{$Bmqk305{-OjS^ +z$vG+2_-HGT75^AzVwt=bc8BT>MH1Orv7OIjT_r8HfhqQ$mo+}zys)19PcK$qFITy3 +zygA8qa^3sFaN0|1GHp`j7skVwE8i_G?Z*>;)SX>98gCi^GN7DZ{#AF8%ONJ8LLb%p +z#YcgTmy)-n!g6(12J8M(l%GNDg{0xl7)ieK#wx{^_oq?jO;~?J?Mih|8Mm9uOdCoY +z(UiZwrWCl6*@E1n)n!w6-ToT)fC!F2*8lVKkQrNzhx3B{Y`PlpSXS?_Ub5pJSf}oF8G#X|8+YkN)XQd?l +zh<=chx{Xj@^ij{|=VZGkSLWZoC>yIFIgH%qdQ%9(@JZEZj7=^DU?cSu$2qEn45}W)8*Ehh^Ee%c6~<= +zzmcjGC)};@cd#?hq4Ue_R}NIx4YaO-at1YO)Og9>g88rJIaS46Iewa1MuI~3yFrit +zQR&E%O+$^|BU6JyH;i5vadY!seBJ +z!t{lQg?zOUCBdt+3S)Z69Iehe6wq&=^)2!Qf_hLy%$4oB(r;&|{Vx!t-X!uU=Y` +zKi=>iOy&zco)g%6FD1Ndpc(ZveB!;o&=``lH}XSytS@G7E{5Z~O&JH+&xh~O&pe+@ +zRf2p(uW*~j8$veBCo-9Jk2HjW{ez(grQG~nMyvF+{3+GH6!_004mvfr7JW9FtP$`p +z61N*xlEjt?Y>ZN592tc$@ihHjEuZO0Km!$xr{YO<$l0%k6@jEoycu82mA`6> +z(NOgbXy66yW?$G}(^pst{SLJ-GlUk&v62WVKtrasp^53J^B{_ +z)O&zIr5fFNOFsyRS1+600J(lX4aq<_=4~EBiLW`CLH|0hN{Ij-3Jk&kqzlF}jJ_*64L)EaPMAI~Y@ya+2kKn`@r_WxPSsR;WK?)X#Spa4dcye(8yih=c +zNRElI01mj3OSY{eV5t&Fc^F1KQAOd6qklo}{2`2gs;SR~jFh8_>^fHw5aO)rqY@^r +zeFA12l6Z(egA;|CtW}C4n5LPzcf3!|;gFgpv;=S+KLA|8{xwhQg`dN_ArPW~z|RgN +z#I=CO8V;mGFFWzayw?w#?*jyYAfG0P!JK&?u&Mx{ABPfQ+t~n2HE3raBH)D&1AwV8 +z6&$$nXx(pLAO2CWQYlMxnDlGm+o9pNf*XSAW_QwM7c_GY$b)tDb`lKfidiLHlR|Eu +z&u^g^=Qu1#J-v0>z(=>#4xg5Q1M*YHc6W(uQ>i;X$kiSB$=&CEr;dOO_HZ(Bqty56 +zf_O5yRyVfxvy2_D9tEdh{8htKv3JRGi!5~q(>=CJ!|*D5>-9!-F#7aDIH(~h51V)7 +zjk@>6i_u}AFu=bUn(H*s{oL@SURy8+`wxf1{?w0lFL5HWADNWhO}xL@LETq6@Vk6Z +zCz&*-h(Fv--zzF+1RuekQsLrqhHjIzS%#z)J{fxGdS7EK0N;)@ZY&52s+<4`Xgez& +z)ZdMSBXu(kVpUD-463IWE^F~T6;0!a8;2&c{|3xPQdk>4(#A9Bm*_;JZ#qO+#@YIx +zt`DaYym^|-vqenUnr>Ku;%!TkV0T`fkaN`Z$T7Oz!T-~T!!Ed1)*J74xTR6mtbDM1 +zzkZzXO0oAF?CuWmt4b`mvb!pCV><^tLlTx$B#eFc_hbDVmED#6w!rR72(p|ZNcE9e +zBrv$0Lp(n{b=qZs(TczQ5$$)={;ij`&9Ez{q^`rd#eu2h7AI&v<0%s}#*}0*xcssm +zPcQRhE#QH?0a=F?o`21`nZe_B)doFn#8~A<5?@4_(#EqAH@CH>{6xf7R&LmIRA9P! +zZG||pAj-7Dc_a-*sm&nrVtPnbvUj`){Qj8SD+2NY{l{beEhXU*b)3v{D%BXa^$F0( +z9&dL4dE%|#{fyn7l*=!N+DZmiR0$PM{E=EWvvc2%8z(2j=H*{o7Q%W-7&>|VoO497 +zj95cJb8#a4yl-A?>v6d8*$DiEDCn}qd`Jy_k4E_k(=U<*7JJbi=7+d(xR>4j^>5%S +zNJm7!*+DK(_12B73+RS!7>!*!hDD|E$1fpOt($reJpDq--G*#sK +z2BSt^kuYBUS4`!u$Z*g>DX2W#%zTiWZe6KcKbj~sqkZ~@m3F`xV$R-cr^0>>&5jX{g?l*^*<8 +zAdrRrH(pE;Z{U_{TF=#<-}ly$88ataU(LtyE`y~oCsyxszmU_LCz`|0;($BPie4q$ +zlLo|XO+R1-=6(qLf(FI|SE%ms69Gtq@fH?%O#~{bc;5iy#@3)k0Jtk)48*BqmlI4M +zBR$#P|8+IZa>6hEC74m&|Lj8(@Kv&c$@y;<){TzWq-#LvmpDr9N90H6A7tEk>W7~h +z3)XIY@pi@;Sxny0&RG_^;2jWVLTdhR2v +z*KRUHADLX|t#Fa4*j`l9`oStET~(^qt>;vo>b!H*yc%WB<|w*D9cc?jo@)`qV}~S1 +zkLRC+6Mj9B`tSY>B}M3@_Wc=hE$ddMJ|iaDQuxW&X#OU>Z1#UMI +z!=oRnL@N!AD~RDqJ-R9h?e_Er=bh!ApAXWl)hWiGNHy~0#0=!tX&W0g&G*$( +z>O?KXFB-f?ebCh%wlqBM_mqi(&di{W7i0`m$sf(vH(V{ETFWGZ^b{e +zx7u^;kXrtr?H#spF^XNBOujYLYx9V^>dll5bqwXOxt9L7hWUDru}?R*TV3NZO@>aJ +zr2Z%j#fg{0$5ryB40o@ip0~cFZ`CHK4XF7&5=iO_Tj~u*tHtDmwx7!T$2D2o=87{! +zm*6{1dmCjq<}O6SCM>%48J5oO&Ct@dE$O>Z&iUFKYR++Gf8x%!NqU^XGSxBM9%0{{ +z*WH4m`Sb!^+n3*ak5O@=Ggq%vAd|nrvgLWY$)owczaW}s{VYhl)Pp+cAu)!_1JDm9#BF2-mCO4XFOSToNRr(SCyw#t5*||<>POtd1I0dN +zmLBnz`?Wu*2tp)(tnXDq=4HyhQ|Ray=2O2&z_2C9#lEVXb94ImV}AZFV?|7C?9E)m +z^>OE!(n8v^c_Ux(h2@PTgo9%GCsNNTmG)&UOWkJfM``(JMkD2~qE@Ztfg-2Jzk#pZ +zzV}K?jg|^$NTX``cx@igkMaIx5xtUYNVqT4pasohs_(C-a{TGo5yoysfcI51&7X%7)_O}TXAb!BKwatdN;@#`v|s0v +zk|UgYCsAp3V<+8&kxnll_qf-**?w_!Kt6R1qs7eU)c-5}7kf*-3=`GU&3B2u{mty3 +z|BR}UtsufvI0-@TjzB^w_-C8hCL2eWPI26MT^}M|BqXX+CeVV&`n437`(j{T>-k@8 +z*6;kkeU|EhXiw3;{?v?;*0za$tZj3}Eo8r-uYbpHnEG-5MQZ)k<(v9Sqr?S?>4#q0 +zvZpugM_@d_ifRaPaf46-&Mia0@#2*Zm>gH1FNW`Ioss>!={kcVwS9>jQKLJfS@Qcs +zbcSOmqa1Wkt68eJ`!e)XpTEnPWfXij!*|9OF*~JwjtO`PvIu?odc#HR1z7#dv^C&BCR^}BZubRC*ZqWuw|i$yYH<=Bw}~zuCsWhY +zl}(b;M)E;eS(^tsq6*&vmLw?ByU#xm_G3ry&cT!UwRq13AJe~{Y|Qnk*DIRI=g?M; +zzvJwO+B@@K9BOU!Anh2>eWGTzcjQ +zY@S~=;o?Gbyw6|jZM-c1MH2ACJzye_#211OU@ud$MS90-9h0`1+iFdAq`72^Ohq&n +zuU6eR=6{etMjz?v5ge3t&x^O1BYWvBHP7?hQM%?U##={T=DOWe@uVCRBn|5JsS7d3 +z#U!5?f+7PbB#~`yH+4g%`vm>nB4?%YwG5HXe$CaH!lT|-_~tvDdMUjtK}_0~Z^4Z!O2EfJ5}LrIAz%MtyGqhH +z%?tVMwQK>M@;UV_?ay}#l94zi1vbx@6#FatOrszA5Oj_g?kSr}M}O}}9eSR^zU?$D +zbiU-=?TbLqkIA=*lqk1>Ww}^dK1@)OWQL4ar3~M=Gl_X?wtN`x(4$i0s=r0fj9*G& +zeAMT1U(cgWxUnzDDs!oeuH@(Ug1lQTv|1f*%kF+#DNN)d;y26t852I)XIi~yki}1I +z=&yNwaeaJvqxBc)Zq4NuM65kL9YSPh{1 +z`tmQkw&_~hUr@3;lr1gnxtZ1%d<+q~@j4q8E!w^qp8q7Qr@EPI@Mk_1e@ZJw&CvVU +zjm}|h!i~MM66P-CkD5#B{hlW$rX7X%nw$hFItLRw2(QX9>;`&*G5s>!12HJ{_=8*f=q_{L1_ +z<+pT>SGBj?@EvS@&6;tl0skgpqI0X7#+$kdBDnLVa_6l|WL{CC(JDx9yVefAq>BzPEn&jz5a^dDKVm_vDnf#~CW>1R*clSB`ZyZaDS+p@;ub +z4~+jhvI0F3CJXnUPQg-67|zQ#-#v3wXFavxaz& +zl~nGap{uY4S?>>UbKqL|LN9TzswvFH+q?o1#D?au?0O`rAM;}PB1q&xf!K)rHC@vZF|?rApp*$sP&58UMx<2q)!t6!Jj +zX*`ZIAg5fm_>T0I^L~E6n~dyZRt{~(kkF$CbDGnCV+y%7sr$&*9_1Rue&^+Lmldl1 +zuA@$E_|~x~KOhs99!<6mGc5FULecNr@PEpVcx%$M{H2TbRY}wB +zP`$oC^a`h?M$Rh>1ujj@Y6l5fCz@^LH&q){zL7A5oTjjJOpqU?>uC?VZ1%NLq+H#T?4GT7zT|c3FX-HA+d!_sf8j#DV1Lr?Xpnkkcp6GA!^6Yu +zx5$E6WN@n26Y4#s4}Ii(X#b_Lts`ILmE%kxz+gEvoEs-N%HRI2A4U` +zH$A;{eV(%@7mlyWG3YqH>_bi#tuNH6J>SW&&!iFjjPhdSqhQM}R&$q8Dbp%(;Ia_X +za!yQCFt|%3bh+!U|DAQ3X^P4b^5CA1(_xyRJoUv*7x6 +zTY2Phy&dswG}p8@}H)@Ab%J<^EtiBVktIy)pUSBAJd|}B$66q)|OWK=O)XmMJssH_S +zDx=>xkYB*hz*06zLSy;sjD(*U&>5F;FZ4@(-tC&zaFdq}H*}ud(48h(HMGki<4w|< +z@V@IazC>YJn_taVmiANY@;3Jgc2HcD!I!KsS`_vr$I&~S>GSFLy+?hyo${AysGn6_ +z3Q?w$Wnbbw)5w~sC8l}XkdbieO!cp`8apwGj|w>=2HDj|Nq60IDDI2*EavWX+C)n6 +zch*5y&~`ThiY%5hj)pSc@JDqO6!qua&vKglZT5k?h3w<9XZ>p#o2r9vd%dq +zI}(Kh_MG(;&z4n_A`4F5??|u*QdDL3nu;MbOPG)3hotnJO5X{-<2u#bR=-u0^N}m?%X6O7W8j +z^3|}c=@YkEO2383{^t}z9Ei>T0aHM%zaUZfss=;N&l1$Ir+ITNtVN%Bw>wCk>vN-d?~N9lYtZ-%Wyldt_6h8@ +zT^s^euysC0F-2zIE}2E$}j#ZJ4l +z^mS=ktV?;F+G0%rqY@NU`2CqW%24~Gt*m>cSu`qc-)Kp-IIgAf +z!o4B9<(!6<%Ph`_>bvXt7sBq`vZ}e+c>#-Qgbz4d-e=)RrBJyq(|9t8Z}|Hp>D_|S +zEE6J}0OO=?7#n>L`Y3a2hbEw)h~N)uGta)q4M~Qdn1EZ$R@Fv`kQ2;XQqxC3G(G#i +zQaEMq68qKbsfsJYt0$z@F=uL#Ue6XYxt-~v?P#G=R%Wtad~3)4vQ$;;1Sx^JW!SZ$ +z<&tj@P{xBxZG#(F@(*Ak3G}&SzPqro$-7x_%vVSlO#=fo2pLz4C5^ckLV;kLLX$bS +zLDq5D=1N2eti!G9qY-M(L#+z!K?$iA+yBIU$nh>h^Yb5(fvL2N`q4R?yqdG|;JCJCfp|;MDV`vI +zXFlgWaA+0-RMZdnY*i27dx`H^Yum4e&o%Z`6?Mv(cPkjZC*SlQ7Iw23DhF1;NZF|q +zFSQ_?vM`+H+M8*%CBGHhQpK>`3T|`wma5}TF#%hAv)~U*#xWXjS +zHV`&Me0wXN%G|Go87kEaK@C2{#aK@xTx(S!wA`v0!M8Zao##>|u5k2N!c5t1#sWhT +z7f5qQQ}Wviv3AY?ye8(DP#P|*Rf*oWVZoT&)@t5HkIWvQy*M~M?wqm_IeRY& +zhux6p*H-ja^oK|%x{Fnhx<3~y>+r(s_m6*c+|Sm;D6sgN`V%XLeCbX|$_Mk0uy}u- +z8|fZLCO0R*aj^}F4XqM3dh^tsm=2%}Td|wfugeBT=!d6lmXyr59y(XRS^!e%|F`7N^O)u2mwg>0e=8VNep*_QPuMc@yD +zpeOb5w9kH(vgZ{v?g#%>_py@W`eoqs)*caj)E5B+$6U{7l5c?o^edT6p!L8g&D3G8 +zQ&f|Ti%EYt7<7vt5o=&i@}OXQY|wehxa6xIDohCUq^t&_@}w|L=kZlyTtYL$mh{%E +z(b#opfc!-X;#$HcpuKfHGcfuy2oy0y>7re_!ELj<_`a#yIR4J@F7hgG<2GjB#_^tGp`zj*jpR#d +zlTmpgRlYA$J;0D{8(BKKfxFPDbq5b?ODtuO%7l#yA*2^13FXC_4fp^p@OHl0CmL?O +z^(nZ+PWv+vezyYSS&7tSBeq2lx@7mAm93%R*Krc}(L5La=xGB|SD6AxO-b)!n!X0V +z6oS(4_K%`J%!Lh_mWrC@s{%;viyGJXT^E9Nq7LK_O*1?gSR(*Jy;~`Qp{`{+c~_`G +z2$&Gmelr<@J=YujBcWzJPVD@REPGo{-*So?Zo~XQ8Ux}INl?7N5hIZltodkNZ81Go +zTw6vYV_;(1XuS)hNC2WHs-2I?rS*K_dy54zUDbD#mK#D@pa7he$x_feZ^xR6C=WCCi?!vWkenC#}&vw4)9=v$g +zc{X2me!6?yIXT@qKAq9rIiNuikIrriZA3r2$=#!agU+sK5(SgNbTm4bQA=hw@#0W4 +zpvdymT~6+TsRTKEq +z%x3RK8`t*-gM}JCIqf``km_D0mx=*UG6o*4^nfW(^!evW<0Y!2L};aH#_xuy5>2=Q_tHJ_`|aDGQp;X +z;DT1UwOSL6-e#>9kSypOdsgd_X2k{cq%gRj&AsM=S3BSyr0>zuS7;Cx!;Cm!YYhUp +z3~+#wD^nW*hZz5X`8{B-q*+@ra=I|)RuzUf=8=@YR5lP%pf#6c1SSmZ1sP(Ec +z8f0^A8|mr=mRgwxpccT=DQ#^;iK+GyfW|`Ns)EY2YzbiY%7TV~Q*cyaQmy54De=V9 +z>n{D_SH%)FcNGE%jGzZwMSRZP#~#|A_uBL-53^Q0x-+?Th%mcRi>-326*H+WLCBT +zqN5bxR8s-OWzkh&M%_8dOg{}Ivv&bE452o%bJ+Gom#w6JRd`H8p9P%!#{rJs69GUC +zhW;UMK{Jzo2|yS&-7H|rOBETUMU{7qKLc@A?9OvaE(Gm)@t-d~NQ~jx@t-#~9&D8I +zzqTKI`g8o}pW@@kf4;!@&us|*{P5n!gM00VQR~;6?FXAmMlOYa-kDwxN5gn>BkuDs +zeBr@u;zIvoI8b|PKyjQe+_26UOH1K6%19{oyKuv6IE~xH%iL1!D$#K`_+LEU{fzz3 +zImX_=e>UV)kk!CFFFm +z192F#!C=@MDh?2slWYL9TF2?9cH&V#>5VYk<3%!on0M1rAFdTamt7<&L=BGBzhj7$ +z7dy)1b)tlZ^x;Z)LG2IrAJ2ze{$MA?mW4(aR=@^Ckp=P9jK-; +zNd{`DDM!pk2vDqyB8oZo1X;1FC5OC`5E>Fn8WWAPyeq@5->E~a^+(YLnnMgRHf1UN +zcJu|l+JuCc@L}ecSVatWP7e4+|MWveqVG8$ydwoY(%K{$XOlu|u2!m&htF@6m0pn7 +zSg4i`x{%PatoyQ8_^#P*a$QW~%lzC5ynB#SW +zeh_OMkPVf17WeJ-p!Sarcs>4cXuPUn*xE?DqJvl*SMW&R|e4O#OkXbNVK@Kf8C +zG#Wkt^#;==nvtEhG)^eu^N_5t{fDUF9TU~p9kGHNc96&@By+WEM(8~QE>l{^%-etTmJM>Kp%QR~fa;M0xXH6x;g){;$z+?zw2ssLDC +zJ_@-18H7De-c))iRFHJ073g1tx;vjcYZ6r!v_oe}p|j0IaYp`x9S)k&T1zt~P$NjwJD?ZxiPWaYtl*EdgG$GJPyNAYjYM(*&Z(ZEpi;T0eyWJr0J(-8|fH?%01&gh# +zBM9?wbrbpG&~PEK?e|i$xpxkU6^o(MssLBhe&xb(NCO=i)`>;L26V70V;cyL$T)#j +z5%W0GRlbl103(E%3b&`L_cJ9Ms3YS7)+)9$_6~$wqEs(aheEIL0Vv0$1FF($ssGyH +zF#&^UnkyU|0D&>>hI99MmK7Ja^V~HYptxT8ta|I8QZBCmD<)@$7Z7yhNSwfXgt>Rs +zWu{_IQkHStOI(b(Ohn8c+@fB>6sXcLF?=Ljn!DLoSVn*bXK+2(dR265!ED(15gto79E?o`9oKS(7b^!#M}FP0B{cF8SAA{=SY?&*@RCM5&*>2 +zAynXQIld+E42osouu{Y!n6QaFUG>zt7?dZrTp}N|9*kgsHlQw7tq!Vd5l>X?o8{!- +zvkrTrW{5#tFgcn&Slx1Tx)SL?nU7K}C>B)B6H|96$;()>RiT854Q^pHce)BAW>40M +z42LW6gU24JCfKplfu7{=g2NCofw|(0xWF#lbyW*^9iaEG8}iPSfg_wf;l($j`*A?D +z(30^$X0DmxOqrvobYsuXzW4NDS4v3qPA;Dr~=IWZYBD@Y(%M9q4xyI|g}+ +zwn2n4Lu*WuD)NoqUAcq?t+O&%VCKpgR$O<2yb3!Pv^0-Do29Pfn20M+CXHDl&}evu%BH#7 +zh2>Rf_&7ON6%9$*S9>B!RYSNhxV>m({Wn+%g)1>UgR?HGS2Ty*8x&xBS(HnaP`dUA +zZ|9>CjaG2LMB9)J$-uV{vR#Q|6SmGvdkDwKa&*U@4LbDkUgj +zM8xD;EnY5ESqI&LLO`?W1JXpTdvLU~*V(H%`Tu+|1cU}XMk{%6)o=ODOFx8o*Z3Q2 +z62NE;S&gP?-&cegfmCi^Bh!*&m#qT)|Kvs|le~&2LlWJAda&fG*dQ2;5^qqV+CG-5Y6EPMPzi)uNG?Ab_9%zbW!9gn;aP=*fv2Yn^yO;(PRiD6 +z_x<%Kt;IG5&UR?t+Xbj4x8qjCwZt@DSf#FTceSNM5@I#FmAv6<=mH3GkG9*gcGAJk +zX|aAtGq$Rw;peI|&WA|h=f^j;S=AB9tYDa0(y3ZF!dA0*ErVks_0fK%ZZQYkIAaJb +z!sB-Af*5bHx&)=1ys!X&j~h4$h_(j7JT{3u0GKeg*n8i?{X*>nx`$K~#%$Hkp6{G? +zpLR|U8xAqn>`O4$Q8v!TmL{hhq}|Ah3ZebPI;5y{8A>R&2?qBre5rM5dsV)!0NuX= +zOwbu=0o6(ko}KLfu5(hG#mMNx`4#lF9J!oRH6?=p)S^(8y3O7x1StY%9mJmB3`Zll +z6(1_1pS?-TTn;0$!}&3j7QQ8TeO0U418q1gx{8b?`YORTd)Qc~S8!dY+L$?mVDs}< +zgLB$uc!v^cHbv8wN~H#DmLRG+){TYFtXbyP2T)oI@V$k>7QH=a`E@Q#_YNqAj3&uM +z;Vdz@uhQi&e1Q2~n%v1{?2w|E04_x)vZJ#+vuO*lC^xsqdh3oV|I#pC@0QB_Lc-iu5fli$vVglbBAaZRG_y94Oc=b9%$jSR)wFr0?%u}Hn +zw!A9D+M;OU+)@)Ok7CvzfQpsTBiRaVNbQ@}&v-!-TJhe+q|S{luP-wx#0Vb7s0E8+ +z8OV`Nm^KgsfT2d>zMHL56l(Y-OY~qavyxAH7m=$pMFy0d!3+ohY1YNeGs;}S_ +z)vOgO*HU~N15~vJ{TdMjSXD=#bDJ557>Ty?P6k9=d!P>;C8OFAs8MC^5J(;}9&9s2 +zR;qRZR)-3f=^C|oRZiSmq1&>0EfIqeKHA}ngdwUycV?4JRk=jgb{tR8!Vp9qdvCm$ +zJZHpbhc6uPrE5Y?PpT{fcolBlOA4Z0Gnxx44Fllvjo4=PVapO*1 +z{j>H6+mBF+J8@PtJg +za_tDD-iU+xZgJi!dNH1bt$3(el!gs~T?!On^ktM0XjLhtS&qo>v@#D6jfTN9(uqNI +zYf!wdDzD_LtF!LB4RbT6Ut!!RxVOhu$#}{gS*9oqRu`n6Ih)zJdhN~nR_OBeK&_Ks +zsl$rB$Kbu9s8RE-&_OMH_saU=sWE-NEorJfKMOj4X^Q5|yi6{8;~SXZ7-4y3!%3lW +zB?-)280nPSM^_`kF$I|y^qdk@(Yr6I!r_vlvn@u$o8l}PfDQuK3g;*{Ik@fmlhUQ5+VpOo|GuN!JUmC%@R^cE_1~42^kYq2<8jkAI@2H +z8-55?OHU5>*=p#OYIT{JxoJB5y;>n9!6bd_!QqDW;M^EEzNX^^BJM&4LnZc+LkI_r +z&^Alp)NN#MU(u;&0ELQgW!q9G5S;I@C`}mv2W@>U)J|a0BZuXvn%t>P;2JvA1sd_X +z)$*ATsrz$**{SAVHvA2##S=Ni+%BL4JXdkS1@x9UGS$$=YKIF|u+4PSYx! +zZfbnC$0HPdB%C)YuzWspRlwUW6T!3!b%J_2J?#Y-vb>HkJE50*e}Uit;?sRFcOtlJ +z0Ba_W+Xsz5F=PiVPQZE|An;`Wpu^D_@Q4Ev`K`zKzf?FuZHTCi@>o=B_oOOvqczd8 +zVK8VsDrf7OHC{X3?q?b18jCs +zj>(`~7+|tfCJhc`r^=^u$sB-$aKT4m+otRtv5Awz^s) +zjEfEgxZphM93KPzRU7?4)W&&W()~-+8d10r6NZo?DB6&Oc!#II*zqxRr0bvwcm=PO +z++_fnrG7f?(O|uVm56Z$_9ZoFN%Ou9PNu23eHvi=QGDj!UN{ZNW%^rO83PliodKA0 +z)a`oJCN-%w!$Nw9yh@Cw*fi9xm6j93;zFdcr08KA_7(_rD8E?NXYh-3c&&&}(p$&z +z*(2D68*g8&P3E0;4;QR7-sp^0=U9X2@W$azd +zJEt#>JKt`+gq{#IAM--!>6{HybW)a68NiKtVq2a8`m>thGTaK%gLLAqhJnMep+u+A +zpc&GNGqKRy7Jx_;&OtJ7X`BThjtCx*19lz20D#8Od1^CbdwD~$jk-IzNpq$LE`W(H +zoTnfN>A=p&C%)2iT=rOScg^B{crz_RJY^u!z*&D%J|%=$%QjzBvid|nx$TL5qE7T& +zpXeu*CwfkikzAFYe*)`Lc$%0Rgkt(41s=~nI)nxfLb3W^BCIK*_fWP^A +z&U#G!lZLNnB(8$QUO0ihkh70gaAI{cGukOL?Gy8|1+Ik&I&KK94c=*KR`&g5VW|>b +z8FeY3THPWKyB!r11NV$#n(?pHVilo|M59cD5S_dQ9?@<^g^Oz1HQKl7(?z6FBk|w> +z>o}g2jsHAeZ5*e=UdWh6qjt3$jvCTftyD3nD*~nVzuNiFcMkV=Hx-ezG1l2VJ;hM# +z(9i+JyFrf`#lHrTvYKRS)7XG5IFEnCzJ3$~m8KC=h_QtZ7OV4GHt8VJi=aROrQ!mi +zgg3(Y&EfSpIMmOdfA^oc@qa!*2(a1le_Hq3t%v3KKcD>^|L3Rp1mgc(VEmt7{ffi? +zJh<0_a9|Mrr}gkB3;&}-f>9uxi&AJDComYq^-=FD!v6$f=FGMn4W8m)wpBX6NkP0- +z;g*nBR?&8RTT8#d1J2A&_oV3Zuwl=RdO({vY&6_@IoE4`->~)YsMs)`8QJ(_jNZex +zQx#x1dfquy^KsfY&INZy@!*x=WR_*zAfZm6k@5re|5Xh9 +zvCE@lJAIho2bH)AKQ6ls}i4$n@$i(%br42 +zO=*9l_iRQxRR^1?ic(Y2miFNdw>7=2j>fcAW!S}Y6;7j7jqkj>QyzSbi|o9ySV!Ft +zG?Hp>U3VzZ*P(R?bv!y}3}sFu#>+I^#7@A?bgR;NQjCl55pFdww;Ah%Sv|B{fLV4> +zo`oO{)^R`BZ~h0*^WR5bzbV*ZGj`YP(@cBXS2p0y10F|QSB5E>N#_Ean&eM0hAHK? +zSU7k_C3rD-Pp}~}SqM^=Fj)yk6Dq?)%z{F_EJ*7X3%XMscBg72cmsGVo(As}XE8OC +z5<BUnhGQzlPb((DS9)Eg|(Z&h0r^O>Db +zXY(l^!W`YTK;N1(BxC6u#EILOI?pq9Mi!1QZr|~))!w-R_BX6b6zOHW>4O6?`uV_Mec0m7HaBfI@Po!* +zxnXxuhUJca&;}eUnqgC>MCY4 +zQ~fmRJzix+J1@s-RnCT^VR1vzF@!dO8l4tqaCb_>Ezbla6g(zMLBn6&M&zvG7qvlS +z>8O(nyYko*+r(jMr`;&ow^lJ+)^fL0r`pVTMq`V$HLC?Q4_$l$)`&P%=l$=mO33kM +zSX`jNSALTh$t9KobJ$6;#=0&q>b2BK9UdKbo-jXBUu!pErU$$JF0%lqfCdjs- +zCR(SzUl`lcATgvE*xcY~>PM`pQSuIVz>v-`JIk|CQY5toohv#_XqiY8!>$@bww*tg +zldmGtP}*xqQT0+wBi9yiMoaGQnsHKHK5Eb7H+1TGVf +zgQ`gSpxcYm1Y)P_Dm-%R2ts7MLZgIbQ&Y(T*=Ur#!Nh^8NzBoi^^*}s%~fZ3dJeB% +z4HQq5FJtb8X~Fywm*AV$AyXrdk?7od(7b%>_@>`errTB1>Qjs{sxywDjc +zHX&9gQG;{L+lW`w_;D8p8nV66u~kOWVAE%2bxi!+vb;lmxuYsk)FeC^wIu~vL~`Vv +z7DV3JPC4)nnV6KUs%AwfF#*;w77&_uBz@m5-TGBSEgNAMpp3H@a4Hwk +zmSxB&3`*@L8K}rAfFYU=>H;)TExIJ+!{V{dY6;l}W~pU#OE{gHb|=Jy-j7<12(hYO +z`>ufSTZrvkf?nj_(^1(OME!K8i7}SA)zod(HIMPpO$XDg!Z@G?1aF~Th}un^78&M5 +zWwzlFn~DO0_v1;QQ=#N0XRZt~9;Y`vC2RRPb%RG*2Ox_*_AMcSQ+mr?UpB4Pp@)Sj +zv4hnuJwq?}xgHu9Ytyf33dxWaT7!NgO1JE^q^_!sK5+n8PHAn_aGoV@_5JBsE;H|7;sqAIN0@F&QB48HGXb56_1(kTcu8 +z4s(oMT(6rckdUaRro=?mr1q*o8`@$L4>A7-RuU1OVGybcSr~5^b7xF0K>eGl(0<%2 +z6bh8XN;_*=w--~5)GVXFkbzjz)DGx4WRw*+P-0CN1Cho3ZBUtVd8o5bgg1e){<{o8b#*znCluq?V|l!ZOH`pAzA%YlZ2gMJPc-s--Go +zYK8W2Wzd9NeL<1`V0* +zF@`6^>yv$lV3W^*4c_GF6N)3CwQXn_bB)Loz^G`aJC6@Kwu~erg$Z5#vqrJ5EsODo!(lw8>20sdHAtawL^7$H()G+ +z))8YbF1pCI%a~WOPdvX8nN!By_Noh!SVM<=!tK0SQrXK*=&mI1`)yDQ1DxqMvKMCw +zh8Ibb^BB^D)w~n2BDIZ^Rikv>(GpoPu#$}MCR5!EM0%tQ1rAh=9n3*>BFwO2L{1 +z|AgmLiK}uf&M^`#ZhX1sijUFicY=!#SbFNjm~%bu&Es4EtnD5VZWQRMwQif67`G|0 +zUmQ#pNU8aDu80DFOYOW#pAW&qhBBts7Fb=KlH(SqYUy#?S=X~nNtrUx@bG5LSWR5ExnhV~oswd_OSY`*Of}<$%k?s)u>PDgu#uUfEhI +z?_pLyo!EYM2fa**)V<<7o}9(!K@KF~-9+Eva{60v=Ki6Ut7+EID+{!DAcxktVJ6Zw +z98wK)nj~0M0bv|Z^Mt>{ +z&)uVggU;?L^{*ejI5h81PCKURN$2$W&Wn?d_zkb0y`Yg`=Z;WE)WB)m)5`_iPaO#UP2Z@a{PNUEP5AF-M%u46cGBvyf%$!i-NY(uqgJpX>xLe +z1Sc5MDqNRX`RVLlYoq;OmN4uL1^~BN60-$enI!qlw))8+o{oxg8_pH>7JFTvVQc +z?EvpuDN$9zb{r2URpF8snx(^1zyl6@P0=n)lyDx&IT#7VMK)HQGnVHy)$sgO%5ee +z1|r~m5p5_zqaDW9;lHJo6u{Vc#{~tWn{H`6nY^O)V^BG+mhjA+H8gAfC5A(n +zQO8OsNhT<=p0gp-D{{5bBE_b3Z^w-0ifW_%Bjt|93mpiys}MLZ$Yz$(6HKUWSAK9R +zt8-#K+E-ImC7Td->2;EfbByaw%6-(n(&7)(D2AG#tD0OT{U{%0z-8sbeqs%m-gy3sWC?iDOg?hJpyQI$aPo +z3_3RYtoUIo(x1N4Pdccz^`ek*$Yquhh}1z6MX^j`jc}Q9rCh2&LblkK_eCNWGaOIh +z!i#4h6S|smgwO?2CWdxp)mdr7$vCuQ7Tu_A*P+EmZO)1MHg7SSQ2xt7MnJ> +z2bnk{Jq7m3-5Ln+iZC2j?zP_F~vF2v5 +zvlZBsCm?<=Zsj1TyIB*PRECmtg6?u<MDFnEF$O-+zsS8j5HhgQi7^7?uh +zeGY3f#B>*{I;)X6S%%RgNIinDD=rCIu&hI^y~hw-fm>n?TtJr@G9I3eb7^_S{&gs) +zF=_XyMXO}uUZIXg0@E3@kpzgJH%Id{ +zbx!KCHB1=1zQ;i8cHk7e$&Ua}y{~S02+%9`aJH9>*2u=(%;-EhmDvwlG9gYb(=ylA~G!^hT{1w)yQP2A`cwjpCwo +zRN^QI%-fndfzbV!!%_iDv}Ftdrj3^XcH6FV172ZJ;$JEShtDOQL6sKW%exqkzU&15 +zHibI*k-Cl$XurBMu +zNyT?Vs@f0CZqvrr%>UaazH%?1bP@L{7bU?+7olJL3eQXZ27mAix{=S9DnE+Xd0?tzz=?* +zZ*cWH{oB4)(-JS$FZ(KYUghQ$G2HqU{W7l{sOAn-^8i%yGE}v_fG(nco7XPz^l$xI +zog3zr`p%D8CTU9XjbB|mV7(S_C0QP?B$wW9eTYESyV*qX;Ak3e4fNlwIdW?h=UY6z +z2Bzz>6z^C3>Scazc9(rMg0>LzpbjNowrh&K_FsT>ST*D-I7rdl? +zJS)C0Yd?9GeXtDaX@Gj-%o-oD%u0{qbC<+j>ky%4b|pE5x~V$_yqf^94Y5CgKl<%{ +z=U`7}qfNy%ubHWp@_b-}2nqL_6=qTf+M2!gU@a#H1J})oG`lyz3@4mLD)*RTC>#)2 +zOO3W^*Z~z-(Jp#r_!3!N^z?J+Iyw3?pEkx6tLb*;_4To2T)T@Z~=?_UN!?$Eii?yyOiNu +zVEkgnTQ_79UhY!pQEs%Yw2$B6N$^qg&cyN7G!aA8!qEn&bLd2#Ow-g{6bbqyRVen{ +zw{n)zC*XOhwF2Q&KcD8~L{W*pRV+BF1#WG_nhb@EussRTvNjuR0R2c`?4uK*5{WKi +z%m@@KI_&tHR46{c*!rFq%7z1*k +zE%7jChaQXcuA%iJa&9jxNx4KqtO!fLwKPRMnt4gT^-JDFO>fFtY{LCx-_mb>3G~Rm +zf?xasNsE4iKf*H2hYVP*=p$xhm=P0eM%+xOBw~g(y$4g*^3^$zrj>Mi;Q3WKx#&f# +zcsUJJVw5LB{c}!Ow$txEt*~4woBZ1`2*=s(Q`#M>RqRkng@F5+ZeOU~MjWaE!;|XD +zO`&mdU?4Uj4CQNx`QqM)%Te%aO(Nt3`4x=;GM|x=*fMGhU-5VFmyXb9+Yde*=Mgh{ +z%u6zkV87IqMpF9Kv}SfVT3OyH&ZUixM8olwR`JrXfYUPyLNOd+3Q|f)teFm*`1jSD +z<%)$i8dNCqW;hzbZGVj58&wDURuDvIh$))#%gnR$t7{-u$Psi~@N$%c5B%mCTo~L;c=ig5+$9X-0 +zxMWFV?NI>+QuuA)W$8xmHzeLlh*DklAiB1c`0B~pqu0RcfBn_ri)SEQC(s^5lQ`=B +z-HT_>`O!c;V)jI*k^HI)M!$7nikOlPa?Wz6L}DGt9y`s<29QX3GWMepT_NMi)5ijNJnQNAvs}r5ZoVaW4CGCE3TB} +zWw=2Cla5J2y-|d%cm%BbP1M7?FXzTg2%VA5RKFeFg)Rnbk6`t`rD3kMUT%r8JncYi +z{oSLzPTjx<1+k;&-Gif@y~F*3h7c(Mv|}9qcBHEA96#;uh>BZo!6LK89*2vmAy9jt +zZ<9hpt-k)P>aVsmL?H%^;-OQ}T%9SQ-jhZ(TvyYzmReC&)fFU9N~35-y1W>Vfxmg8 +zWx!IHgs-{))t$$?b-+Fgt|nulZr$FMa~uWmaT;C@{}5|qT)=H+6u#;L%6YhL?(-+5wO{fIQrBz8)YS*&}qQz5%0^-zQcpV%9?voz< +zRphb=kge}8$Np9x_g-pEaW)tLGrEnn*XrZms^wwnmbngZfMCnDg#8kq<#nnKil1jY +z-@p!0IAE^0zUk&SX%SzOvKFaij*7Chm}Dc4A*vW@w0nfuEySwxUIT1`!8dt~j+=m1 +zt!u*iYTR2kwil>*LfZ?38Ik3vZcVNysxN3o?xdWeEP|Y!^rqnTk8zg +z3?U(>U>&66$GUcK4wf@`G;Ym;l6$BRt2PH5Ej>7ATX3ipY7?A3Q}3N4uRb2a^@yu4 +zgJ)ZTIgf`DgURyd%|(K7P!Lj>3O&7Hti6cUmd+6GlziBq_7XBCno?jhGG3v_5Lx$1 +zZB>0E+3@0+fehazi9G}u=$x^WERAtAcE|IBZH)c1}*!?r#Y7p`+j2&?a9H(_)(T1BQ{~xaeKLVkrqYIN4OKp^oc+9zckpou?c< +zR5SZVqCjcz0o5trx#QTP3>Vy?Eh78pIm7+9gZ9(>z%oHY#U6LWdMyrA^=2n0(e;+Hoc$I1abRs%D$ +zd!}M;u>5-Z%qWPrJZf%6+;)_U>H!nh5*f<$^@To1wf!Qk0}PsWsSnuxFb8$@c>-Kx +z=qQws$3ZZQ+2kWoFPi?{s9-}~#?Z7nXEEj40BrSvtWRXa#c-2FhL_sTs(8i(%r9|E +zpUYtfW=liSD5a+=7VB+jW;BdBd&glzh@lLy-v-<~AGbFu8SH3f)Z!l7;tr|p@DWxH +zGPiZAnk+(OW`v>sd>?u}9XLux9G5_E5&ESQM^|l{hO@~~rXH#T16VKZyd%sITwD%q +zjZr(eCf4dGeAoyd8cdC%$`OJ=o>(C6tK@lt9z?nXX%rMcav5La6YKoxm)r)v`{Z^H?Hjh~I{qH>WyUhV7qxRmUfMmU?OvowV2XxVEzh6eV)350We{H{B +z1+(hHT+q>07aR6D(#n@zHamwR7tM&)`1vGL2f@lfBd?JjM}0<)0cFU3t&zDXOdu=O +zwqtkCU{zm_j4kca+4ptLg}?q5F%8_gQo16-7GA2O%rn6XmeV{VkrU#-GK}zBSk7_F +zHTGB3U~;4B0c4#t?KP1#a%HT-AY^GWvRD(MwuSqNh%z@@L71|oVb!rTIj +z&5y51Fs5PBb(i9lCWBG-M(;`{c^c-Qn;sfC33CT2ly}D|#-^jdV2liDNBTvXfN#_D*e9NE-h*?BKMs!pI +z%e=S-faG*mW$+*G0@EqsSGiL_GES*C33kiN3$0G(_a}B8m&TL0#x9Ui( +zrr(d#fx@aQJsGp`SNi&v^mm{o7lmO=ap?5i$Qur`caNerlX3hQy{*Iha-x63}%I#{WENCj(5)?y|ilc`#Y-DabG58!+1uD)-#E!l}CR0-syF5>b6)zh!>kY~6N<>-UclBLS4Ry?}f5 +z1_$q4cikX-4b%jkPuPW6qQaA%gOkpt{&jl%qT@AJ2?T84kV>d2cX>s3UjR=<*|YIze-FH&%!9w<+cx;fi+#o1U2xWmekNR# +zOzc +zHo+JaY!f#ykH(`QQWgsA4^QD!WE0pK)yS`2%B^ti>MqpVdD;tyx(n%7lBjElpfU*n +zPTD%o&~acOcYUV%lfHJ3XOGi9G0Km`8^i*Fk+0>r{Wz}0IJEl1AIQ8>l=K{>VH|(8 +zAShUS;laWDRBXm#N`-(7vSAz>DO?d?-D|ioRU!tWq1{md_rnqv`HIWYU?#(EzQ0ax +z?2Rd?B@Mq3JWR^G31%g7?&>NzmbPVPN}xV?(!{1b0ncAD7;b4G@UYCb>B-EO!pM{> +zXzS-6dSyX5V7cUzJZY&AG-@078hBsoJ#)>RRDp#L6ZNTXOPYMLApdb)*oH&C^wRYR +z%u&f_nL^Ncf*=$MXvK}%A!x#u5GYG32j6fl(YEe~N2gZaVN3ZnCs36!tEbW>rcPTK +zYb5lnt%eC%TYZf4k=t5ZhMz-_>q#~}zp(KSe2ISM-kC9w6Nr7NO;nsM!NYMk{CPGU +zpy)W4c|@~J=6ZW*G71J7i2T~;?p;)PiiMDBtdJ(ou_2-$6{9!tO^!0}7F%9kIG*RT +z^?gpmt~e{3w{x4(q!N$ifuRY4r~bm8O2WV*lpkx_O{7JU$|F_yEI3*bCHoo!ev0EE +z77+9y1E~)Q3gD>VqRrrB1vG +zaf*3}Q!Iiw1C2O?S%?Ev9GLd^(lNXXLg=#|R&$=ZeLlg`tzjo~np=#1%+<)tS(Y^C +zGtL(Hl+PEQ#GG3?bvAyOtIkE(T{e`sh{tdbK8wXgJXKzr8$iu1soC4oWDW{!v2DAxiFOe?^rmd6iNT+e8H`XN8EnGc!bl7OL4-`c3I;UG +zFCnj}yclGoKE@Rhu26Pcwd9YsHAG|EoGbPIs@&7S>eUuGq=Jty;K##g%3K1nyyTOz-iZ=!rFe31$5fZ6ptuTo&M +z+|}f9zsskL2Xj`!EO=l&OHyRuk&X3;!n%%GYOtmA_wrVh4n?|)(aEeQ=NzCDBk2RF +zdG+}+n6SV4eA{eTK5nzt7R@GWZ_%)Aiy35c*an2sm1smFxrDpgjvNfDK`S8^+bs3p +z1>8_3$zWJ^0E|F$zbJZ<9*rm7{v-(K-wF9bwATwf%hsJ6U-g?*?utvqUxs9C%slLl +zyU+FyU!0T_>wI +zLSe{?6Wr9yyBSEC${!P%7hK*gX0XVpRrB*lU2$ZXtuOht5Mn$YmNDbXRp$p*b?0!; +zo4HoK;NY(ofb!9CpatY=7j9zr=x}%EG_VBn8uE(QfUm(!p7o6GPhO!H$nrcn7AFmi +zoB4%YnMLy#2jZ9Er|kP9Sr@qvxg`X@c}0op9ile_7$Iq6vAQKUuPk2_L4rs7EzreS +zAhp~WD!f!Efa`UFpjR?hVU@J(#BlZG{x)iiptpf3r6vJhUPSh8g{pG&gP&&f1&zLV +zm(f@55_4m1J4f=|F6pX0t-Pb52Jwh=(bSO)yW#=M9&*C7*l)~e8!)RyY0r*rCc{(jT2%DPtP@6obrX1&8s +zxZcK`dIzWFdIzWT`#T8q2bZ<;>OHOKZ{9ecR`gd6x`;80-X1;Je5aVQimNl&GwovSy$r;zKRbS<~)aEt+i(IZ)Q(BU@090R=khO(a& +z!KdVlNql3p%#KGNdp&Vn5bKrBZg=!hj6EcnJ=^)FyMK6!&V8ykblh|O`rPnZ0KMVX +zk`2w&%O;Z~A1l!VG!?iq0PxAB3I8-};Cg*ZgSRgr1>(C7+*^LT^j$&= +zlzj;aV#g<;XBCKy!0OC78sqgf1%Do@CjBdJRpzlS0wU*lXL5cBs>L%>ag~ej28;J> +zao?W-x1R`=p++C0H$#s-zD6AL2a!4mi88xag2Xh^aQy^k$WR1LO79&!f#~Na-RGU- +z?vsNTCtqS(1}=UEsw!?oXBW{aS2>M4zx4p3>wK&i9aR`?e}*1~j;XkBsdKOom-jR$ +zL{Q_y+vW%x+-+>z=Bm_Cvvw)|YrFMx{MVo2Q;Pq3(Y%UU>koca4*$Aw|HFoV{l##QDo%?7y->6C>rNCfXV_7Wez$ +zebU4mP7I`nR6)^|*HQgVHXZfpJNS!mEEN+ij)LLonQI4+x)LYNSkEWPII0~T?{$uW +zm#qPDy~(DUZBvuTVH(rR9GZdzWB^onptT@CMOoTvYVoP5<)Nk)aGF|TX=)Lq$@N&g +z<6noJCd(T732@-V)i;?-=f53YV&{-sJvuhc96jDYR9}|f@-QLWnKOFQ{{CPUvQ4e% +z)ZHEGCoiC-=q***647*pppEf#75i&r*I`UuEjzz#h|t4+kj|{R(*#D~j&JS?FY54S +zRYr7l8-n=jN}6Ct)`T0ep8nb_L>{*o*L=SVdF7*9az8sB_k;XPWoz@eNdJHcU@8YZ +z+ixY@-|dX0!)@HsBqZF(B1W7QQ@E|)LM13}A3CJ6rTL*Vg3B0+r(Csx7mG+7u6@g} +zbu${77a^{Kj4T%JEeNBkfVUNcT=-`6suH~yzd@@Q!{T==SMrYKs$Gp>?0zC-fXqX65u}Ac@DtXgi<6n(MgpbpPb^__sDU +zS7jPH>cM7m3U_fp%&cPbL@rvL-?uvBydE4xY0()$)6CBsH8V|~8ecwVd`Po(R!Ak( +z*}SA9KOKdF5^^n{4+=g1|{uHf&V(Je<=r +z#;$gI1Y7oViu1T|m!c0yx=EQJy`GU@w0Y4@I$@bbRqtCUr|s{YjIQORt6t`2uDRjV +zJP6xa77*tXO|&npoiDjLT4>+ZIoc%{2yUE!{h+IUT6|UI +zS0R($V3eLr-Bk4^{wo)=3omIp1^)#o)YTvxwEO})sV1eDZ8+9HKFJ>?S4srQrnrA6 +z_5xU-NK0B>d3j{ryv^=_b$0_h@!F$LAd4cyh8Ny}R2MjWkwkkdj5XBLmX8(+D_TDG +zd;0_r9Ygf69WTl=fux*{SOXu>2Vu_xXE4w02Uc7wlBudaqso~eEeTif=v_?ernlvj +zWdmbPMJeHKHl6e!)oVOir|%3Qx70;8DY}Za=YsmDTXu+LL1#w{RG&(V2f^}ukLK2K +zABM*C<{~brFnlx17o7cQnPKhp%qeZ4A8JTEsD|V;*j73n=hO&%tFE0^tOL*?ic~_ogL`mT7`e*Cm>WmTrRTncye$C`FlI5~yG_Ou{q-a2$6*X%`$!yI~f| +z9+{P=T!`-x=v95L+GM3Aj=(z*WbsysFR*;-kGH&k9ZOjfs-VLC0GsVT51c{eCF2Gb +z#E;ohgOXNtO5p%QY4UUg_YCOOG;bn1ZhH{W5=VU_?Y3vhB`w@R*DEHxC_ +zw09Bh+Put0Re&qTTL{vCe4#fI7v&+O4GMY(AoSnJy@YnnFCc=m^nIMMfp8Y+QH^^C +zOnX*c0T4#DS}6tw*TG4_X%|Z~=)t`;qoER7-k0NZ+t&&C+$8dd17CH1+x_zB=qm;3 +z<%{JlkMY0Ave$zUw@=%2MW=r#x4S~$p#cCZCaA}4_(KgMWUHgDMnkPJV^KphxoHZg +zV6BLi5YO-5%EcOiqG+mCrmsYEm|7jjxzf0+Ct?fhN}49*Rp0 +zUn_ID7O5-*kU57yLl_@Y=M=y!fa;;(P#_}ShR8+YOPgMCZU`xPh=z}xd=Zvs1;C#m +z&mrWm(b`JP21^c#Sfs&dqetMXTN=gDi^Ef~tKhw}Q)%kc)Ph7$ +zxGBM6VKJ0|z#4a*IX5D#@a=GQ6)Zs&a4HI;^_^RGQdJga>lYqjVSa{BzS~$9Q_V|r +z#f_$r2M~Ie2J%DiQ^N&76i}V4-rI3>087@WEJFE=(}F{stE7nErF)R3tQbILLs&If>xX;T?2JNhD;s)dLI0u|x(OR>D(sXtJm2giwhH +zZs)#Zx#@8q%(0a@kn(i!0BahOrKti@DE(LS!Vz2H!q3`ETu#>#h*i0zh9v_c#Wp +zm@b0xPvPyy#HfLfmi~<^*kFg|BAGyJVR&Zvdb>geIvv8f=9H}YmcyZSUSOqNa@8U_ +z5aGyx9kk2lYA;Q}>cy)R^WFyeRD0gk37ug*8V)uJZb85s(H&+iS;hMyl%ZR?0K!m8 +z$t~j+snH>seA|Aw!FkOG<7tuC;jWAtdK4)(BQN?&<`P`b0K~dFRc@kpL^j}`4J3$;m;~$wB0#0+%yBwQZmD6 +zor9CsomTq}5Epbl8K8A5TGK@1cv9#mWcwy;PN{PHPHV%joG0k>AFS;m5sKJ@vnslS +z0=K3iI3{d#TPv9I0{oE9k^wjom>IuXUteFgdDY)r!4Oijx9!1+N`dVeign2gIDCkE +zS)to87a(6mEez%%^zIuv{|Cmy&)$fvLM9eI?`A{`M0%K8B^?x`Pq0z$i7e!E2D}nh +z^7uTl(YJFpXw+G#gMED`6xjYd!jNJT_mVU9ZIepsbgm^04?tse)xEI5$s?E^Y1D>e +z!r+bFf_!xiSW{fYY4nPbd6}MJBe@7~T%l&dL2y;6)HlnigHygvl5upNIWg(VKDGgP +zeOD-4u4z6iQ)7nA)igfoSvwm}?hw5+o#nDXzizZq8gQ)4Sa#|{hz2tEY1Va^GH +zVpIh=5wJrYfu)Msp*6ZPKk+sF4kqaSv2V3`moK^N%XpYB)E^X7r|vX;T{9<%%?>M@ +z-dzT>3FlF<+?a`y(H9yUcO!WRhUyqN^IQa995|n=<^81ps5Ue1j$HhT>m`eT996*b +zH%t-NB2DZy?=-(;P^C&j4e|}g$$5kpM4-gNwfv!mEP_Ha%`3fa;$t@QpcnkZzCv!a +zDOhs*3U-Tm1wZU7)DD|>_{+Z37Dwj2eqf6jI~G&MJh6pXTWE^#Z!VC_Y30teayhNs +znO5$MJ$J{Rmj;%X2bOyS%l(0wBZb~G$3ZVil!bp4V+5K_wLuT|A9r`2?`ykTNZnV> +z>*C^T*FG)b?>$y+9PT{pGzlll81$Dm-unQb8TOw5te?RC^ZsY|%l>~4Kl}7&`_G@^ +zQbySo);Zrn(w#A=Ouv)U0k#fSO9G_I>hM)p|K{?wXh +zFwzIy25yQ1d5bvRn0hSNU4?&>Ez2jt57X{VShFxeJ#6f_#=NV^<`O_9Df#aK^jVhQ-I-lV;YNtQy;{d%%~z8>|bC<`i~ +zaCn}^qXz6;*kIyR4ePg?Ruf2RA?#I&e`y5DAxuKS>OjTEl8zArs{RnrOB>!la7q<-!VWDT8--Nx&sc43#J+mDLLY0lN4`tc>0AMML@Ww +z@fd&9%LJC|*UjQZUzBKgv`O|J0fCOKl80$OV7KHSd*u9EX*Q$7Dve3us7GBF)Ly+) +z%U-wUU{8z;2hY^|W(3hkyu+f=&{rYOL4h4>RRt%-gET`!N<^P}how;1(H=M{UhhNL +zfy*HfIp+jbP*h)(XslqTUaYpjBc2H)V=`7-!)<^eP#$eZDaVq(CRM_t +z%X~R&X2ZOTO;9)2DjsLWq08{To<_J8!M_TUdc8TyF}}3-XBZ!I`DEFK*^LavtOJ#_ +zfrp(auJ$U4S{OMkl(&v%-t0r>eiY@`756lOh!*0{8MxkTau`<@F)o=vv3KiWn*#5#www_7x^d?YYHHOt={MmP!`vR@qB-t0?ohoAi0?V> +zfn121&T(NQ{WiSX5NupkR)2KuI(%2P)MF)oUdGobJwpA47jI!aNwA7GLT6cgti4>Y +zIp|zA!m&qBPIq>#{V^jql!e?$@g%;?SMldC?<(OM{G{(jU+)}4Ah$1fPSl?UPSR`K +zZ}8))HV!+TJ!(ammCOYOC2`>eI#6fb;np=Xc%wk}v@4&};!`X>RbaIRLHPK9a7spXC+fAE +zxN-a0<5LFN +zjt7wVJWe4Je=3YHN_OQqjGf8(GYk*z?Fth0Az&E9P{i28&p>y43ER?vn|-3EjDd_d +zd72ZRTsfdR6nn85etx{^?0AT87cThKrUTUdldtL%V7$dXghK?ofY%q$Rx?wabBF+s~R1dnt#$*RimG)v;G-3 +zdeRUtH7>>ry8V=&D8QCc5<3?kC +zjULw64b`Y-;2|J+)%dTSal+XxM`S{hf7Rd-oyo1VVDEWl_xYmzAG^{InhGa`@x9g7 +z>e-ffDOd_DqnHZ(>#-HG3iOL*P$w;WlCGy1kx*@;IMPAq=nBjcwOr)yOXP4 +zHbt-EWhtxKhED_gh=@pUwOv{UZX38Vlxu7{uxdV{w`#eEzk|F(Vie^pOd>7i(azrE +zqoV_fj=a;f&p3xCwFGZ`<*gFg8A*nsiq +z^b8B2(DBvT^1@?L(0uXy>z#v5@A-*-UIL8X@Puj=vUV~n|{j&=^_Dr;$g +zJpzEWOH?5q43vl)0f&hZl;bmSHGxfnH#3V)TF<%s`1x_iJTA@QzF1lCsLB+BG|8st +z7lMp%Q%+{?nMa7$qfIfP4eWW4nkhkg4q$o{Px|p#X +z!03!vkeQ&LLkc}Xb4I(-YINqohO_NNlsagk9(NCpPF@^${LQ5fjArz`&(TW$aV+{) +zrI}S4E5c95jb9fw1Qx91z!Y7bd0)6pByD{hyvSm`oS+&nS>{9y<2;%6vo#^R +zEq=(5il}_VROyoTPv}cS(JY65jpl2tB8oJngR2tz6F`pNmLs1db$yMv{Gs5HEx=@LGXgH +z^l#(wyM|o>nz +z_q7tl(T%dRcobn?1>e(6TrfG9dF}`f8n_N#o=e)U0Y!b)sz@e~c7M=89hH9R>xsx` +z54Z^u-_A&UirK}KNe?j0$RKThpE +zwy3!IBY^4>Y^=+$THqMN>uG&+JIxa%#%QEqyMStf`>uW+2#XS715_3kw`j>MjG>7m +zRos*D>mW-;c|h37KoxKy@I5_%M%NX(tDn>Kb(*~~3hbegOZ=+j4H6*W%mDa=`=y?Z +zL)&!H=N+<(3cb_Pmc6qJmSW-8nR$7y3pyjB&iO}b +z-Y8~UfiZ_N!W)O(0vCIT3!y<(M?30fl&O>Qi)!Y@MFy^84Ei%`&kq4D*{rC#H9ZRe +zCydBMf_U1UOj8r$vKAL$Y>gS_KFQ(#+FM?`+RZJwQMhOJ +zWgEvx&s5)CTXN72t}dfi%Y18FE>AEEV~AmaBH$PUo61{wuNc1;7zKld9%?*}RQ*>g +z4H8psFMxsLR_O_knSTRt^pdHDzU~$o2Ooi|cj0xzShygF$8DIHc8|l@EjlZ^B9(6@ +znGQS=m={EuR%O9gEW#Uhf#9fV{~J7D6cJqIC-#){T6^xm`b@7Sw<3Mwwzs1KqgapJ&T< +znV(l#-}lVHTM}o~s>4|c2b?wIGI6=A5%Ejbh4uRiZAQsv*l{p2`S`4$BaAV(G>EJP +zGj!9`jF{*6V$9J?*38^UAn?a0{Y?TZH4L3MBLL0TlAl}sDY^Kom%*q)kYQl$kt%{l +zdeZjI#`Z`f!g92El+1*ICD9t)3S8~beLj(Sq}u#a$Z#J!)^YlM0|vd<1y%MN9YLUT +ze60R&ZIi7Rgtk$Wo)1>kh$rV$%&no_w8~YXN;5KphPc$slsF* +zPaBLwdk|_}3EaX)p$d_G)k>1~u?>3+XmrxH-+yV(`@fFQy!a0vA_4TA{Lk%;2d#4c +zuLnQJfA}dr<@gU582{luMSs|MaIgIk^FKe>Y;BaIKkQ7ehofOUxe+exs3`HmLV)?% +zbhKb}2$L9^!aH2}@g6RgmV!|ftnndv|AV4z+_+Q69PsMsYl0ONgafLN+3c`^l-EfY +zj0fTX?G@|w`k-N*S-?8Yc>tDC5ZO&MQ1T+bQ)ky~?QrgUST~lI0yz?IAqUM7=vV5M(2i!xstNVRz@PWN4)Ske7Eo`>NkDwv?)bZ6W^RF@AM*lzut +zX7hiI&y4dw`yj!eKAIc<>A|P1&;0Yh)oT5G{{Ivo=lst&_|yGg!Ri0$J@`MK{`WuK +zY&|HS{wJt81oZ?+wGj~zaK*|7Ah+H=7F1Gve>r}~#Gl#i<3PP@h^KS^!DZqHW4c8Y +zsBt{WlgW=78fu#MrvTVMyeRSD55tTjNWH%sQwPqiwMo)b@~q?z-`96(iHuqSgFtQs +zb9>N=p^X&83`28Tz`H+JfDl{Pys4=bO#a +z^WztX&TyrxabwynYnNpD^ +zgB8>er;G}N1skgW>FR|-vsmA?wW#yW>G4h%z1K`s3|4tTi7rJK0*>z4&Npybbz*{L +zq3Y{RoTDR=+Ixdh_T~$z{~M;$Jdv@5Pz6~IFT^TIEUh3AeeQS2R`$^=MP0Jxa%ZeK +zQt%y(vfl1KE007IR_o_Mc1CBUi +zFL-QYkB@=*Rdl6CzQwswyE~g3nxXNC=4b@zF5Q>1n~Qn^P(aId3vBv8Nx~pJL9CG +z=p`fs5i~QI5YD+Pf0ufo#W?;g#=IYWPtt3BWzfK+5fnqYQN|lF4xMBGQ4k1SsBfJ} +zPtON&?tKmB+{h-1BKN|Z-Do&QeSBZOK7k27-9181OD)TIOVaMTIS*_DtA@^+D{M4j +zRZl?-MiY{)NIl|^T=;!k{j>JyymzslCf5aBMxFPv_Vh|sR#EY$Yy_-{)0eGGko%XHT-}3}kEj`oIxKcRB`O~>#(`lk<#-}k^??>Cq +zwkacDb=kmO|6b+U(N(J5FUcDqk;#Z$oW@joD^4^1-E+BugAc11PED{wc5PrP{$e^OdL>(k;bxgNxs!SACk)`VHU59hiWO-an`oqDXOQOVf1R;jylG^Yjwq$SE4Hss@Zf|Fu#5I^K +z0mlyv8T>U*-55*o$HJX!keNPYxC5&;Fx6+MtLi4sC&>*uT+9~Opi!WFX+RL4LB8Cf +zxsnzU9Bo_kMG9IfN*1R<0FDIvha9SdB)1d;`dkjv;pOy_vku`F;odFSYe7` +zzR?0_}~?WI1R)4}i>tD{-3iMIl; +zIj-DA5uXYBJn9?Jr5UNZ6o!z4no%!G1l6r>DKfxaFR@0ziw~rjs4cijj5wxWopgfF +zp6{HpBTa*M`gl(4mLCuez&NN_C(9spOs(a`jhY12a^&k&J%jj1G~_igWHj(Z3oy`I +zDQ0pK8&i*5B9b=NpA{j-V9ze?r>DCHr5La>W*-bnSa@K{%;=SBciGKOC*$)$9g4@t +z)+I%0%xb<_s2Q!IX{T(mA*1)f@D%c_I*~sSYO9f^6FRa6dFv;rP(n-e=vBHb%wkeE +zJ|LJWnI1ygskGK;uoWhZ26}DqHsJd%Vek(~7$Mpw=v8Q1 +zU(uN#auGViA|(np%oPVxBy~UyB{ES%4gZ8EeNBlh6_Xo~PfnkO@1xNWN|+~V5u&)% +zCWnv_=<@7_6*m-`{`46dgEuS%LNU^w+fZ!cAKS(vtZWZfTsDNkqGO{;JyKR|tgYaD +z1hIbLC_x=F9xOJ|UR*@4pwhBf__4s5v0|z)bh9F{YYlhZ!BL3)d^{7d3R^dvsJ0~2 +z+6p}OAXgm+lE`%eK(oVhJ2N$P%}ks}qc&OYkmT77q*~9}<(LiCSF@L$f$x&lh +z+yi8B`c9RrGiO2a8p#A0tr6K{D7A^@@B+Ml5l=`wf&dqos?pa*T9#E&1!gQ84XGM} +zU^*rMZ3yL9nqVh<)=P@$!U1dwBMw^;D)8}|o3t1uvqfG(vmq=>ikKGw_E);5{xS9ZN(Y*X$s9>@K^GR +z9r2t +zPEp4%CD}&-NO2<3@|fsTJc7)tH+aG%z@a34@AgNFU*O1ECLlocvII9q1y_`bC7-} +zw$4GTTOve2mQF!SxB?mva{hzsp58j#cQl+>D=c-%bEPD4v&v6rvbX`U!VTwOaqPGI +zorAqCL4f5{6r*0UqfZS|+eUUR9S=y`(8Pp{MoY3bvl$=+93#AGhYEh8e1wa_jCM+D +zo5jdgF3WM})U1lkqr+@c@N{Pwaw1!;r_jU?xK!g}fGQ23bLQ67PpvZ(X;`CWMkoY` +z((akKK2T=q7KArFo=|vkXyZ)`q^?QY4xgMq2GmZl6zj$drch`%C-V5zcOeU}+ER`6=oAvT2W2KW +z;M8)WWg4^sC9P5hm}`tW%DY?v0gdk{zHA{{#mc|ANKzfysEKiupom_aa$|o +znQ9%d4%#xq)flLHxEFa^`nj^yv6Q7?H=$&vEh-*u+lvHk`XUb@V|h_3XDNzzN)g +zLHdmTs2rMz6WN!2zwE4u?v#{`0n43fIS_$sH6cjs&g7g0l{!8(rVF!tB!y{-aQZ`} +z1TvCM6>cVSo|eC1wSm4q)RY8OocKo{8@M}%e}Fwj5TP$3c*z){ +z37L?SdRgpa#H>1gk?@$66u}<#$K4tmYsFk)+lASp{?1S>yBdllzs5%p?IdC2kgkImF@5h+6XBgOMJaf +zI%!Ni!>K~TWW^{uLODS^rr#wTAIq)e9v-&DhP#y=0OFy+7lS;wzLJA2{Rtf)l%hi{ +z(yiK0vve(==3tkYlsaPc7OQPjC)xw(}qsVc|iZL)`rpi4zDX6`nE+H#9=B}m? +zD#D6CrZ-BlVWG){2(P&!cX+&TH8cy7sWO)uc;F$El +z_jcFtxIcsFGV$c5rnz0`W(pQnO9`y#Lj=$|k5L9;V-v70F=BxMq~2w-0J+xkWwQ{I +z$TpbB?=VAA_Sv&?aW?9AkuKRs$sj~1rYU4MR$B@awLv{=xoZLKD)FIlWK7_Y0{sr# +zaqxm65@R8AbI+}r-{tnKy|3Myyd3sbGFWI=5|pO1wxNlQkoC}vr0<19V9WQiB8mZP +zH8sMbnjIN#VNgAL2kZ9q4z?>}mq~1IJ6c*3TBefH%sbCKLDs$AFa@LyhP$#-j*JagsI38CI>@-4~`&x?^{lb3r;VR``2C0=Kqb62;bxsh|}JMnKw7O?g2T$ +ze_=!hom4_~{X0c4v)A#3Iw-(|;t!gR`i2q(B(kd82*)S;PY-uaUmSP7-FOL?imJ+s +zE_qHxoAB$mJi!LvFa6=RUd!GG!WvQ_lrblkGgoi8u@pOX!21O)b_Nt;w;Az;`#Ink +zrwSTTI^^w$;AylcU?mWJZt4nq4#o8s!*~QbYqLvD^gXSS#%A$p{_XIk7#KcdK!($A +z^+shL(53SltHWqRDBCO{o@0Ek5n-%xz*6?{`XAJI|FEULa3nCD%^7h7rcaoU23q5F +z_z~cG#zwH<)rZ2(pvhk;UJQ0Lm?TNKqrlex$^AcP`u~22;2$5&jsJ1~;e&@||KIk{ +z{=YxP$MgTC;2)oH@Q+{JYd?rupKi7uZa(<+kL3PqgMDO9q>s!G^AYr@%>!<-#*Ni9 +zR=Uzl8+X2A=BQ4TrQw?2uSMcH--^}K#tMWHX}~>SHmI{%KUtdL=~wWci>jY%65G>MPI5_@jz5+gd8e2YL4cIuyy|b_V)^a3!}l +z#i}00!Z#4%alEs9TJ>>6!LryI9>t2N$9!7jmop>Q1KbhE+=pxXzBDf;R_bA!G>pSKVD +z@&O~d82(dzj1EJ~$h$n(Fp(T3m+Ba2Ul{F-Y1ANE;bERM$rJMuX)kKY6phtA)Ty~f +z!|FQJIZ6sUHns0@oYqsIZKwN3l)JYFW>mv`SGyMB?<57E=EVF?jaooz>A6cG$g=Hr +z2@VH8Ivfr@031dPhYj=Fg~Mn*9N4CWo`9`WPpD7m=}Y19_w@q<)+gdf +z@ptSaM)^8)3CthDS|sbqzcR*92M5wC-%fnIC4nHo4%OIkA1<`eQzBJUFS6+sylkLv +z{-bR<9N*vS3R(cY9798x1K`_jTbu6AF*1Kl_r>`*BPBQEiMVE`=+1C=RX?|D0?A;t +zp~kSlJ47d`6xr&zE;A6~R$CGP%J-yKrp=3FO%4@%iQohsV{%<+opcrc*i?EjwN33S +z7Nf-~q%Fj*04s`uuXqTfG(y3J9U7P+8q(m;9dtto@+|>}b5ncYjj8 +z?soXN-(WZxr$twQ2PQcVn+Mv_(?!}my6OGuF5Rgyd_pd5Fc} +zas%&#z{k}b#y~R|&ySBzkI2<9tbF8$h+e(i+L2^Q9X +zZu)qD(#4E=1oWo2EKPl{c#!qJ=9mq^`WkDRKBB21pJ13ye~MVK5n7H4>B!1J!fu7o +ztggj2xTbdGKv!OynNi3UoLm9N9lDZ*(cq9|EuI4@4i2;rN4i#AP&Px8#~QO;gIN9w +z{#`~Feyt5B7gw}DKjx&mcm}bpCGwtV!(j>g510GhH63r~BL3m`MJTOmpN*rjG0EJW1oucTZc$7<88qFt+a +zLl${vDQ&hfhmG#V)Zl&~e*>TD^Z)z<-Tuxy +z{~vtT`mCJ)W8>k^=l@Ufk>~%pzWp`%KOUk1;DgQk4>mUfm%mTr$r;4f-_1rN3=O;J +zu|6x2$N4+l=>F7+JVIuNx6ICAXZ&>cE6hgPq;49`Bzv{`i|O_fI?O +z+lgdnF5}mH2X)@OCd0|7UcYWoP;7JEV_Po0ylV&0i2mqa49TAGS^FH+EUF`n1K(DI +z%>4$N5e{@ijg-H(VECpTR5ZKosAkHon28JC4ObBg)N^+TxvE^`S969Sj5Bi##-RAN +zetp`wa|dibaTL>rz9ef#dd>En@xxoE@~Eq)P+i&f{8i_-zv=9JWe#P%&ivfz>g%0@ +z7adVrmo?A1ZD(xke$a%p;1OpXOY>n~Bx&!ap0U|0sp5M?8(<%>>R$%|JnvCE8Qg-R +zQP~YNP8&|OF5YiNZ`~1?LJ*;Ydvfndiw0We-nkQKITD4iX}kPM0ltR$MKN_=5%$&@RS^2)#+1XPIt;6Dg+oXEGrSDDXuDI;D +z@4`q;(!D}z%A20j_zmoFeLr^YU-;HZ?`yh0&}nWm+K)w1N_2C2a(cXf_|)cnu^#oM +zv@xeIPCCbXJEuFgG)oqjcsUEP`Blei<0NW2@J1`zU`TC!EkzKUq6-y-y+{?`KfxmI +zJ^rN{t&2{Vg}Lr=U)Zjb)LseAoC;i}+j&T156&@=IeqD^=-oQmtIX}tRVGS1uB|}; +z6nJ@Q?nf+0u#|6d5T1@UvavIQS@cE-livDy4=<|l0v!fm)`fn;m7;!Boi*t6bm#Fw +z$L-+)JNQ7&e|fC-l-qvsAv?hPGPnKldpEBLT09*Un{uCSut%c5{Q;4R%V}xX)2`G1>zPN}%F9A08bnwPH><%u$D{cmD>oI0%L2OJ8!7LTD +zsFi@OLk)GFSY}p@asOqoeT!?~U5p$Q0!+}R)f!TB>T`r=t43bb$q-^!=(z#Q|IAV%ZEbvN6 +zv@WPKM&*6Fi(xI32J-zajc_$s|w^&_&y&_<+A9O_F>rG){s1-8?!a;cf~9x7du#ltyo +z9j^#(m}f_O9m66+QQgN>`;yFi_o>B0HuHF-Riy_)6gFg|RZcyB+<5mTQz`X`~htgdkDa3G!R0 +z@*f?cRgdKJ&m$oyMS*}t@>91nR}~$p$!zZn_auiJTb9N^ST`6Zc$;B_wx_$85ZaEI +z>j(p@3!Wbo%QFnk&t{PE7z`mN;Jp?w0&-!l@I%0y_ex8n(8qE;XuZ@3F6gctZ6SE+ +zO&~peJ~({oT~z~1e>;3>0wQ4W4Ao4ka04c@QlaPTLI<}7% +zg8;9B(iP3I^vZA;Mry04u2~<_%?Mr%t)ILf8`K!RnGUq*CK>dPc_A7u#B|wGQCu2JJ#2mXZc&l@y{ub#u1| +zJ5@=<5KAV(ARl-_^eIY(WivIomwMHG=(xl_Hhnj#8QA!wLa)SZGXpf^aM_i?$~G|4e2 +z2*Aznb}agH4;TG%Mqg}DQtlD2h1QHcOK83UW0c^uD~wi%M-SqSxiBkXjtCz@$m7l! +z!dReNi#Z?Z3B{ij*cR@5n?}B=iAH!Xqj#B$-?)hfQXx)SCv?E2ilD}q@wMIOJ&c28w8&K{q`V9|uX;nY +zDx2z%v}ht%YDx7Za{cLW^$;&owLxA6P9qB>RIARQ#>x;KlN#)-ifr1uur3X`?dHLX +zp7`f7m7O}5+bfTEPWE@ZyZc?Z7;xU3h+mc2Ebg@%Ivza|<>5JJuQP1LLg_K|;8rQ_ +zfF5%$hir^r@7`sMX|L32>=?8FhrcSK7&N?!<=F&7A-wmLOsh0}FGQk4XV^WtL}dgT +zk7O{@OuZUj0)YHb(C$%P)JN=?HpHAXCJdd;3OXuf1s#>Mf=Uu$gSL+XLEF)gP<3V! +z2Q;{Ekrcoj0a;`l*@`k%iANY^I@f?RpUj?TH~tt2|v=NWtxCEw!x4irx#M=e6oSBS}c!(2-(MG-R(b5^EK2=7~>{ydcxc +z-T-$%h`-lKG6vYX`feSfh^>!M9#!qPa!YIbK~e=peelsO-@(2VVrvn5?q84La`@Qmc#1L0ZFJ +z2H>~^KPj`ojK>udCg&JCS?L*}MmrXsD~s(9?I>X@j~A?I;XKw3H>=S?HNj`XRx@5K +zi*?IB6QVvF)Gs({<2PYjFubZ*;EIb4y&M}Qo|M(=hVo<7lpx{fl12s3ItfM(C3%Cg +z*EvDhvz7b4lqcCKraikZL=67~qF27TNKii>!@Vp-`zO({2a$ZNDhO^rpcU57ksV2N +zn5AptMwrh=c{fK|3aXD)@lb`r`FcbUhH$MH3ac@kF2Q%X32LNrD@B&A!wCdm2*5GxVzz)#dwy0>VFH_0|;>os#<7;6a+>c-n30y+@_W4_cAs8zD3tT+wNQy-5F<*!1gKSj +z5tq&p3^aP0-vMI?9V8t`rD4Z+>o6Hs-8uFp){?^Erbz#37Racr40aG^_=*~=#!7L^ +z3^C8ko5Hw&mKYa(nBr0dRfbZ1$5t^H)~v-*q6Q+y2dW5#t<>(#Y1`f_m6eY;GmTbo +zX(ZH`_8Nk1Gzc5(3jH>i^`brfM(r>Ie1`!mamP}{=y;;aD~+JyG(7ql%2SbiQ0hJb +zr^q!ZU9(Eg8*kWRx(W~51yzOw5_EH@U!Ln18;yp9shqaaU6v>B#p<7>k44iOL})Js +zt%TdiXP(Pi3oxq=1b8ahy)3}mGw0!2i0k{#F_92)VIN|3eJgQY8yVfI>TEnx_H{O< +zBULq77#TqxUG1%?#gNK60X~&?wP8_F9}k%2Jb8-wyX3c2QQv=o(aP=VOd}bSEKz3W_Lj08Iv*lGP1sXt+sD~g8;8! +zAsf~6Ng}~GHP40#(r(A7jKh2aHe0n1$LKEO +z9or_@FbMW|5kue$#s4$12DH&#GiRGXv=rmT4UnMC=8Q##KEeE+!1nVSvilTf2Ew)m +zThQh;uhHxe-$iwF*2Ro)H$4#M-_P8X320ntL8%!+52AN#GC?=z}8bzdwIKQx3cbuc8OeE(C0i$Hr#^Wae3Dv!?{IDj0 +zYFc~c5JCbG=76_mXLb-Jn=>O3UiwCJBC$sd!j7NMBhsfN#Q&s;3Bz$J;boH8(2`^} +zj?jgLv+VY#xXqvLma=w7UbCu^_6h($E8-ChkCU{-jHs&ZWNfbUWXg6OrXP~F>z7k6 +zi2rJfVPymJU?SOVv5hFAu9E|`-Q@g1q0|}ig_|0ZW?VHnfTdgBzU9n#elkV%p946Q +zZngL1E{?Wp12ZE+T%+C+I54PTG8ov#Ff524gm)e>Fqge*wjBS5&gN~)K16>E9FY1v +zR|hEO%tXNwC(N6b;TYm(%vot|8zPe(Leh0{EsTMYII=t7BeZ65DcA`%1IH8H4u=el +zFU#Hq!RQ=xX?^(OS@(43=?M+X@LsU}3+Tf)xYy6OjHxf&^T6Bz!6Q%60Wb00trpO# +zi!~kel<49y8*b?*<F>!aSk^B0;wfl6&TgVN6QEOP@nkXt +z4R(sDf|g}7%v(rhyKR}rX*JrpIm~%OY4gb7=5d83*WJs*_eOcM9T@rv1Yw%uWwI0m +z?G~`*&J;k=^gHJ9)^U$F7MLZ@h$upNlFl_;1@#EDPB;>62Ye5J0&i&5G{2aGIqde~ +z&iK_BoE|4vkVn8&r`U_sxx515k%?(zVgmEtww5Nj#to}ouJanZ8a=D7)(B|S)ehFc +z2{jsyO$5ll6cA)()5?tt`{b{38T6UaT7ep+poJ|yc0 +z=H>&8rzj#UFP7tEA+I_db(uU$Z2Nqk;}x3`(6ulfxNP&Z5os1(!io3_8dx?sBZPe- +z%4YbS?-sFrd|~pLhsN$Ik@XzJdP|+3X8!#}*Ge`*U47}O>s=guwC(V04Xs|f +z0Gfu-P`ePz`&y4O;&K{lMa%K$8Z&zyWCZPnDL(S%D6i5DKCdDFu5dmG4u-UFXAj{E +zj_Ec~cJ{5*g^D*#;acxNc}3PX;@^VMwOXFKO;KD1x+cON+jW!B-k!SC*+8azbsImzaYu(%FQ+4|(7?hbj38Gvw*zaf#=W)<4H#kmO3Sqn +z2v*BySy{zlTtK0NwQX^H)uq>uTn)P%8Wqfah;inG)*i7^!K?qVs4uPu?6^M{0X7!f`@a>YnXaQ`+ThY=R15g$wm|2O_8w*w+` +zX#quxx^V`ayDwPp%VVOxXZ%lV8%VY{Bbpxl*$_`8KGQDm{)#K +zi_(Lv;kQ(|6yZfjn0QT)U)x=>GO&Jacu{XuMQ}$&hPx^H_%^6 +z*ps%^v`ft*QL>KKm&4TPrG2ftl_=w!MKioogS>dSnzTcCIdebmy;$Wnlvb*QnP3>+uVcz{FKrGxWQja*Y)DO*yJCIyQ>R-3Y@Zg_y(`hst=J{Z3dB&;4dBi?tl5u +z%=nK#P5$RkTkZRP{Kt*Y9{e2t@u&EB@gFJrbL-(^383FO{v(HVK6ipTpU({GOapzM +z<@pefOr$Kiw(kiH1C^V)>Z{fVX*79RokMDiAi|fR886uijEqkNmF47f?#oN +z_lBj#)PjXgh(=YKhA&#L%c(^$0dG)VRcC0kD#NI}x^keQsy1sze3MNJybA>!0bvl* +zj1lX!tYp4q)ZavJ3H5d(T4SX)y7G|~A4Xl+Xy`Jn$}%lertOqL&O^VtuU<(}Zrvn!x;SAL{fr%Cl&v|yT$c@?jTTDo?;+o6sH$9^qC +zvMvx+R-wI}{~a%^=XEeD>a`OY*Ab@fxMziW;=#?Gwc7~ZQas(QU0TWyH%8M;4tH7mEaf^P7P`_scy&}+!swXFyQRQ$n+pJMNRS0rBW2&NwS!1Bt +z(je5Pztu2s=GC*dxd?6@IWd$0q0)vgTsUl_7cLvPiK%Ebq(KiCy^T7ix`kULe0UFC +z>C9$kYT|y*`0#J@Q!W1w(_!&pGC<6c|6BJzE9ZZD(E3^a|0zCF{-+ghUPTHUI000v +zeXsrNNQwXV+ncRcSp%@Istj$MRV9v(hG&zQoQ&bxO$q(I#k2zUV1jXYIUo-9AJ0hv +zF;$~D^D-^O(`$Zctg6UaLX|$~9w+A!Rm;DHwCtdn{h?OFI6vU;)rCkrZz1{34>*LQ +zojo;-!<}axTV$+gVtg)2!TpS12-!SaWdEpCVwl<2M<=D%S#DpSoF13nlfJ^1dA4)< +zWvS3*TwK^9d*xxG2LhFVo6aWQcfMVEyG0qMRQc}C^L=wJ9CV=;KreKW?7?|Om7_ZW +zs9+3%w*Xz%9zlcz{OZOy8c*|!o{pXXET}2m*m4T7+omod5+I@x9Q!A}%zDWVJ0oi~yTMsr{ffPV$ +z*Qb3YJx2TYj-onPgy%Pki@t2|L2$Du@i#evlF1~^ASIAY6VxA;A0cUfG$)%7&gs^N +zi9I+%CyY3&_K&*zhtFR~y^(r!^x_nrwf$pA!v_cKm!K9zn~+vuW}xC~5y}lLJ+FO|Z$_Ww3N*Sf +zrf61k$tLy0#Jx3sh*gc$g4J|c1*7DgZc~%gozMNSp9hQvTMG)Vlk-_Ca_ecr!Wm11 +zgRW|xUZ{%L6*O36wzajEjsjzp)!7&tR?xpwuRqy8=tL_k4Qve6LB@fgMM-3!#FsmV +zdk39H!$rhl)YLO+jyq5H +z6~pt}{lmS^H>I)ZOL%CO;|2WjkI~26ka60eF3hV*{3iMRl;UEnwFz1wG&L^!F)oTQ +zfI&-P3&&~SW-4$R;$XwLzMYC(O-Z%Pyp!C$azRBoLipnG=6iTs0;>vrT|ZBWEdqCQliJBH}Op_ +z5(m7ZMwewdiVlU&ZNONvT_B{)R*QuNx1v15{2&y%eh4j*b3=sVZ|cC**s6LBtB1Kn +zpg}hpB!ehT-pm2w7@#Qk3??NN*vsL|s03|Os${cmi&?_3SXVo`v2Z}-!jIfux%#WN;S~8y6vn33WA`WGNVBHsR{1cM%cQ$Tc{7nHq1eh`O95 +z6F~F1-uoRyw>y88YR9&!^aTCHdyk-JH^SfdEL~>1>Tm3 +z*5EzHQ>V&xh)aSN)bBeU#a)E*&Dzre$e>!5YTCG_2z8B@!`YN|qOOkA1O%=g2215A +zI6^~rn5S9F6x0$o2tbe&LyexD!>{*`j}Dng8~%qp?=uZjYxIV(JJrcG#RvzujV*=c +zi5M7Fj67_|KqB`D7SrB6UwGSg!}4H_ +zXfr(Z@n7xSaanQx2a=ck@E|BI$BP`Cp)qpR`mF{;FZ{t!S3rvbybv+tkP|$)cJ`B| +zs58kJ*F#kmY(R$vaQWA@){IRlc`HL|KFJM_LfaE|90`QfFI=g@MQJ(xFcRg}NMyVkY(N|Bt}JBi`N%kz8lwgw +zv>UmS#ujK_D=jox3D9;_LoD7L9r&ufH{tfc35F1- +zV9&V1v{@ll%&<(JszO&3*4FnxL}0EK5a7)P**p#N3+*LuG|?gwqnMH+&*do(LeroD +zzbiT#*f^@}StwCC1edvUX@GVC)a+SqTwK-jH$zN^mtbrGNPVH*9V0?NF1ZMchzRJa +zS_XQ4X48m$eCv~SHW3PwAbrYK(w{lh$5|uh*%jladacrvSt0F*?RWZM287Pe9{hc` +z7Pd(ND{u!;yUS@-yp6~wsNH*qRIG0fz`PfygZhA${qV)J$DQNu$?nc!GrCK9l9sPb +zq@Dm|{UD4O4-6B{#57i$Bp!~8=a85HSTS{ztYr7#j2`pOfG`tT)AYl8klyyEA!Mt10I7F|Lp56+`TSk1EXB_jy+!bYoQ>bOmDu&00$81o#t+ +zh!a=v8zov8B~M;K{d7chTvM>1CQo~jxsC$(aw}son-NOnpxYaNJ6dbKgq2wSE?sWO +zF~@z3xuFKEcBRl5%XqC`DKu$wviRtGfLBR2T7F-kv;-2zpre9_dvWSEZk%LF7zImR +zIwKjSnkF8i6Vo0bN1a||Z=y@gNR&l3_>HbK@sli3U!;W_-G~|sV=Z(YZTtAffsQ6O +zW*m43;>ajQ>+q6~KI2rrAc|v$j{pGNb*isDFgiVUMqwP(0UO2n>%@35rVxO3fU$?i +zMzsgsDhdvbY0415nN-IEO~LtF1Cr7eVYq!g&sXU(LzN=fXQVeej-RYd< +zscJFaXvnbm%z}1!xv1K-6#8+z^ +zP|$InOH$NUQKYqe9QR252?m8!iQf(tm!5A +zd7HUuX2eddMGx>CFf-bs_SV(_cQjC=)Y?*5jt_l`VE_#iGMSEOCqz3RE1>$M?=16* +zYchRH<_?d^F$nPb2&Oeqg1aSL_{dV?%8(tB{1Wn6j%FabfR70EEn6RP +z>&Pn1ZrexfIW5QBvQ@C!Piaa1p{^Hv!$##-yB@-X0L|{6O2QQyqS{;#eU$Ed^kc7d +zX{0)4iZ?jioTVF2xr}NbT*if5#+^UgW +zgCcLWl<%vuXK2#k3A;a|8mz7p57Kd=PYXxUX3-mN5=JnH8`i3Q;m}~KhYOb`Jfd#G +zyR90Jybe5r1ABoFEl>|`!ew#dC_zGIR3#t@Ek+4O?S>KD&yy5{b9Fp$3SI<^7jHi2 +z!`MdY4X9D7RsufG^@d_ +z7Zbl7K7+9;UHIbmlV_*eD8!ybFh=C4Hm#xD)M%*Klx +z*~G1*NtU(LaTQI1e;q(BHX!0vN;z-UiYvv`-*Vx)`$vb5pEM)&_X+LscOO|G^ +zRN!p{f8jLx0Bc4%EN{uw%=QUBQT_+9Y658YOG+ct-6X+1PjG_Ow0*!@s@?ks$3Deb +z!wKcK-f;G|Z@@7E)~R|Ax-AZ{c)enqH_E*^%l%G$nH8vR-Lr{D(^TPkK-L^hW0ygu +z_%&>v9^+SjtW8Gs-48!T^)o%julyJk-SiZ`>4#)&+O#)5{9;AosUq`K9f%n(_fcx)3ay{(D +zqi83MM>l^+7L5NTT()|^8Mq|QU)eB5V$7-pU?8N{ZnkMf2(;BynuMKK|NK%)eB_6G_gW#ibW +zGW+>q@&?tEs_GrLD&2+SEua5*vfQBjNJqzeo#W`ZbJ98fy0ZtQyDXI|Kz^gx)z?Xy +zM~3~5qFRh9gc>UJ;Y%N-Rgk>(-=X4|sVu1*YJ-^Hs?(4}TRI%zyDdD#--rqDB^}bA +zjC|yHWuO5D2%P8MG!T?MDEU0ryjzBT2dG@54l8y;5+#iP2~ +zY0UCLO|)Gh*6*3VZAAa-oH7_{wiTSAqt&RTxYsj!lZ$xJZsJ6He=dqb=pKFhb9%2W +z%qqU=s;xu%Z5UB)#H2tcE`;k$(D>A>n%QP(ls&9e=VXNGD7N6tPskYQ29n9QFvZo? +zmz?4SRf~$bZ@A%Qzv+TaLeLhjD(RTs5u6W=Aa;5}w)!gtD@0E~?qYqp-XfHKjAwMx +z9SpDQMQ-CNV{V=3O*ZN0B2~OidLyonIL<0x&wE|0wjc=m>Cso6!|p-nkh?4t$cp@G +z-E<^V-wan

    fDedKz!lqMsb^T21q>Hq=W=8SH4EA>zM;NrmJbFUrC +zpUS2_>6u2Pp_&|-Tr&K#=Fa|QKtDv_Ev}1Ggu`sW>T7H9h;M#Rzv_Y%wdp+J{Mc?O +zyfn~IFvMy3yNzX|)wk36U03W)OsYy{ygS^|`~gX@T?sIEi)wn}Pua0#&(BLRz&9|I +zZwYB%vS@MC?OjaM*Ta6DlDdN7TR{WQv+1OlD56U>a5$=I+S3)Qoo{~9XD3~158lAR +zOD9AV8ZbI*8s5@u{DBD1YUnj&UjF_BTTlSvl^4*`!qQ&1xR_*bbPFgh9Uq_k_V5(* +z*tp=#Z_*-O2%<)ds5m;3=zZ{K$+Qrsk#$Y!q}yatnsKO#e8z1FI||# +z0$)WE_e5Kc=!CZ!75fq-NiGGA4b*=Z3V@pOsxxVFgH-;NDkW0j7R4}!JNk@obRn!C +zX?8Lz09(H`s*RS=euzrP#Hz^4$r6G4GYI3t%brG*8AR{~T2f~6SYrAR8k&1xtFza` +zar6p!KbY@#a=NAJa78EC!;dj}P=inGP^-`$wfkKvT3%gscZB90_76|ZPH@nY7zf;> +z=#^?Lph#6)#^|I7xH&W<7w>+ze-y3!p=l9`H#=dS8eu=_jlq^lL3w$7d5fO{5+3Lu +zqbz$JV{S@5jDS#fj!tZb993WqOVAc&l?U+Xz_IIg2D$JO^`OHS&G=LubZ9ssp3$h` +zQU$*-5`-BfO^cgu=4@WJp^nkyngY6OOZL>5kB+wNJ?Y&2&X(m$MC^RCzq@k~?HukL +z{PuU9?cd(Tq>guuk^^@x8S$39#JiVtP|ofK;IbaH +zG#VHOWHIEgMdldirqQ-NTane1hpS@&7e0Tr1?k$FO_4kPHbvt%=(Z8jFV%5*+=?!m +zE#Zy(B)QyA2N{6ya;U!0s6iEvmREG&x~Z*rr{g}xAV1BP>*e^ynXAc{ufd23LiqBU3>#pf19wku{p6UNN`lkO{bxT +zHASWw^vx8!!E5iiBe0ll_v^v+XhwG#T5FFc#;wkSS%ms`?O5+XY|~^kq)S_43*t{i +z&Y?-uWozMnrlYyk;lQIFFOxiv&uxZ>fDEU`0E1KjAR47u9m60BmQD3xtxf!t%Gv-D +zVp%MPPU37E=KbOMu&6ux5;`^};K4mzqT6h=pzCy&Ti@P1i`RGH?Q*DX)lGK%fAAHDi^7U$Vu +z4+)$GsNogMk8}}J%R(uGP!8wpb)?M>eeWn1jh$VmZQW4#?Hv8i3jbwtST|Ja3s55( +zuTZpZ;*0#b+5`NQYWK2BP?8aSReYteU?%Hm?V{i<2BeWtpd=klzfMZ;XU}&|y9Y|N +zZ^+3h%(nSD+3=J%5OV#1bs8!3XW`}4A3zI0ZWxp|7y(QIsR*+}-prxSySU3=9Fm5inZL+q2 +z&qJ-Q5E>EU(n1Gmv>Mgh>L0+c<{}g%s*n%V8PQ%bO*JZxi||PSM?pUsRk3A@9)llm +zLn|MQ>PlK^tffj+5_Z5aohCB~p}qRf +zA-*#KZF>a&AMkQs{w`kLs&W!KGlkBo3k^)6L3N?j6iTZLO-!Llb)mu(Dyj=znL=09 +zg}&3iTjv>MgvqAo7v3pmshmgKLVSl=a=!&YY!4w&O*n~%5J)d&ISjQGKu_F31PB--Agk}YAs1)D2_$8XL*9G&(8r=j-0 +zn8oKPS`XR5wHEQ6&%f3}=U(-xS2o-RTaJY_4pj`uyT}o9Ii?w$QPq-BJ8Moe<_&>b(YpahE9eg5ff6EB^(Grpz-%xfxlQTK%liV +zun@~FkqQ!N7c$%Lu*bH=9^3ZE_=8~NEC4!xzvX!+>j8ZJo&)%Nu>l-(ss`}rJqPe; +zu>m}-9Kb)k=K%g;u>l-b4xr}K?`3C1LWuGWw}fs}6c1y)+vj>osIHJtLt5(fTEnBm +z6@@$ssRy=qbPAW5K%&;y*Ihy=qb;eTyGMt+JEx|wEF0LwVP4g&)Ou;9eA>cS2d>&U +zNK)wjp-fU7Fe6j`Ltts(Hn)OJ@^lEp990nBjO4(DR=G^eozaI_+VXJ{fNL16KLYfe +zKI75&B3|U)!WjwNIrr7e;Q$hsXOob%nf?fK4>`_~^e|(8IQKsb-?Yg3x8hwF;akIO +ztJ5c%p7_Rk=wwu~&nt;)#>B*{z819+A2gxUl`^bnLaMrhuBCIux7d&-5}rF=A3;avq50y8>4_Q-yh}xqH`O9!7)Y@ +zCS1_7VxJJZ@6vO7H)rfX5LCvl#k11WqY1*&62jofx1}a8JU4fE_PwQMKl}cCz|U;| +zpNkLD$DI6s57ZCe|L6Y3#?SsgKgGxQ|GB{Qe-D3U{D0c_!T+ayfAfC(L;3&wVmL?@ +zuSG6A7p_Oo#nN0~9OF4-b85>2?@s&SXK15x8D9@Cr`r9|;OeTtrl^gJQ14BBd{dgl`*=+<1n +zn;HNH%2`hwpr>%BkW4Ni2YZy?T%KhkxCKo!uu(d@@x2L<@+$(nbGWAnsS6d9gC8Gv +zcD`y-p}ixzRyjE7m@oTJ=<6XBf3l-rJ~=w3zb_7VPxp@wxeYGAe~5n$j&^qr$YN-p +z{~n#r|Z{k=Fmg-erL3X_KJR +z)Zz_Igc?HmRWihp6&l? +zi%}_xCzJSwEFb6;e1&m2@VW={@$T)M?gWB`xNceCbp+mYu(PHqxZ&y(nPc=KGvn~v +zZ?%4uxvk_fR$O~8kKm*QvmSQlwGFfR9=RrHdlDQ1G_JL+d{#pTr}VDWg5e!>Bbq-X +z?`h`MVYYD(l+C#Jz@~}qNkHFgxiq$O1>0a`khFjGk9Az%pT+_g{W-|asa8? +zraBi7&CnZ;F!iPP9tQ_MqmorH&-jTVC(JGla#nqsXJ}i)p89Z&2tcsr!?L$# +zp*f4Fms~pNm=(%GeM{@_IWn4W8!mf%Z}*1q@B`vUxL_57T~Ye>PBRtYUCdp?9ml&k +zg#DZ;{IBUVgZ~E&dj26qfO-7?gNJ_p?@v{QpZWiv;^XlDyy7SVeEMsf0sOP5_1R{t +zy}7Xw5CO1KGdhd&VK0JHJ|_zU2;|Nz+baln8jnWEP^|TnvD*F#7?dLCG(;=++lmg@ +zts_0?Co;Z(o|2b3R@K2^0)b!whEYK(_hSF>R0%$#sXC{M`|U0N^|Q`1czKyz`mgW} +zzd$aJBIly*Y@A2=C4`Vp<6=6A6%Sj_Gm3xy3W^~&U>Hp}tPLZSBLiglJmDM*0|7T* +z>3(i}x9^zHzV&~wL4McT4Y%w8%t)1`IYC+e#$}zt3N}$){R6fX>Mc9UkF8$5rh-f} +z#Xn_dqvVn^M9TUc`TYXCO5oKS^(`@d;aHahC%>N-&(U^$tR_{rF37-t8qka>7z2oC +zkP#KlEzv_zgCHKMTKdY@MH?jnbaxK+pB_HzDDa&|2i+H{7FO7zHaV6s3aziEIi$ce +z8S^Z}mMII1VDd{{?d-Cj#;7}udxxym#6EELAW4zR4t-4k!ozg!0>bh}m=XS*b1|r` +zhda-x_(U8Eym(5k$Ms$_Y23L}m+p#ilUtaRacJfxU}^$`{pWfQpFu)BYF_Qc!8WHfIS7~X8{79jeA)? +zQG~d$BrsHyRkh(vUz%L%T||-hF}^;gtCm5gWUvB=qJO9Ta6?yD=L%K_w?`CrE)s1W +zKtbo~dP3vu4T<*c2ID!dA%^BZKHYf?^wV}FpWeCOwrd~ilsmMREV^;WPtyrvW1c#V +zn{!VswUV`7JNpA3K)gEmFuKA$l2c}y+ETWR#X;Nt5S+{*EH*^tl5IFIbbmiMjc>{E +zY`vAhK@^I6lMJ>HTzO8i5hYd8q#qfE3rLR#LDt|Jgco0RIsyR`mR+GwWJdet&hZ{D +z{AuUp^u(flmiD0?tc`7njf|595;ME>wFS+;Ygwh5|G$ij3rKkX{xQI2^Z%{;_c!kQ +z{C}(U;Aj5-r}#+z->f(Z0H2Wnu<@&V?N31fxc_PJ4&X#5wS?*kC=KC8fCD|=Iv|*0 +z&S3}+!wwC*vA=kvUi`0v{l{~{e^H7S?><2tdh|>cog!U%zHi!nz8}@^ueTnw9{#%h +z>BIXEfA#Cneto}v|5pz_wa4u7&ffmc;Ys(o;_CJ~PmepDsQ!HaUh7vI>l+QvV;x4` +zjn9I4`EF~tdC3-XZxbnXq3It{ciGMFiCB>8&&YVdI<(g4t8_#?)~(#1%ajt +zzE>{`&IU@pdp~N^EY^)G_+Gs%I2$PW?)}6Iqgwo4xE3#r1o3-eLA>zt#P78}P`kZ& +zN9~H9no;O^dm(&JhNA`XU6p+InGQx-Hd&D9LDBc<=`suEvk7#hN`82Vsz!sE0{Yn$ +z#Ev1lWAcvym|#PN%3<6cj-7bF_HE^h!B`Hm9VXhpp9I6<1&H?VC&jxjhLWuo>t+mL +ztv>WpjI#5^dRGPCeU7SfYh&SlS{v`)Q=)jTh57+?$UFDaPZot*u!nnPc4&T|lW-2I +zMf+TNmp%uR3V1?^q+)MPszIwZYtnG`q{y9-%-@rv{=(~vMHkpFp!=!XECI?DKEyG5 +zlAk%rPZMgA7TVz7IyEpfyIrwxTTA5-oNWlfxt%(JH)VSjjSbn36wEdI(dXE&HhbXw0_}=(ahbtgpvAhkI~uQCf=$=CL%t8+B^%6J4PZ-E-dS=KvVv +zDk#xFTL)9F<4Sa3e}#?BK$258f1A516UH+h{#jDINs=_$KoGWUP2n8<)^^v@-N9{2 +zG#!uOHUaL;Y(-euse@2VRdmveK=#en=i5_EkY2+(1_gdt&E#@i+|*>PAm=w(nKn$I +zTIgNRsfBZTHC>)JtG1ri2vxgKOH3_y=Qf%>x60|atEWH0>9^l?`t|AB2&}_aM*$$b +z8Z9pX2II;S&QJJe0?u*)T&$T;wu@}?Ty4)_QY_pv0ia6qu`w$*5-WH_uAle}BCke9 +zfx=03K+c2bMm*HdbBrNw#Z&zp#3)EuX2dV?!d6f}_&JC@<~jV(&oj(16j`-_ec?Rk +z$BL`6kJS%;tj=-!Sp6_5j4}*!Ze=I^LP-m@0{qf1Ce)N=ZFJtFzIcH@^b24{%?tQp +zU)V0x4}Pr3zkRHJ=*I+T!$RoCN~#gh)i0A=>WzJ_e&|F@v6$Dy&HsqF$)eqbT+G4wgbQH3+H)7J}1(&9zhlyC}}mM_o{OJ +zV6m!vPk!E43SgWY@<%_4C?$*|*It%-8AlwKR?OGx&MI`$Ge}; +zHmvd2r%~(v=KY784?Zj3{XoXZ$soqCDABXzGMn5)&*C&be}_~s!Ys?)^CXw=kmCic +zR=hi&Qr;Js>jHUSOo|snz<18FX@P +z+F_lm*#XyKq;z&|G^6W=PI^W$8KX0}+sDg#XyeuOa=3x9stS2O;Aui5rJAqC%Q!!U +z1ZdNhkCWbT0Q{fg+nW|_Xq&-Q9)}Ji1&ervLQ^Hjjc%G1Lsp&kvjhWGf|(fh_U2-! +z#4=#Pe?J{6Zk%lSad348Od9PRp6o}v8jxlrG>9BK0Kr*_Mr=*SDc;b(nGF=k`$x&M +zG4>0w%%$-HS`Vc#3MCPMc?cK*Lc&!5Cbv3>hog@h9O_zHo$UXvvvYjB^V>TQv_B@8 +zTtDlcPqH_Vk=wV6ry>Y;GQVDNunqq}vX;EUSe{%gl)U5`fTIv$k_J#G3Nx@Dt*Q_i +zWkA)iqBF^0bNAXtBBmK@#du+(eU>UUWCfUUlw2hs*^h=r;b%C1+MP^OBkY&~lYC^8 +z&|t&t`BFfjt_ujYrj41<3l}gXqKMv(TP>?xY+E$k#!A~NSoF)!oz>Io7F$)mflRXKvo0eRX71xv<`w3)n_`V|@+;h)Gq0?5SxR8iPIz@%$91)$@_>cxuCJW0 +zJ<=qoQCB~J#_?!)82Y&2oK3PZ2p^Qv{?Wl!M>czi%^dQq^Q<(=bp9ySaEh#mM`Y`# +z%D4~KXoL{tE7fFxSJ0x(Uz+dv`9q)C{Qpnl|K0wq-7fL}pSFMI|9^^)&;OJ2$Nd)D +zem%I?ei*fWz1e=S*$Oy+yf^=E>`sBxzi=7M@`loFh_ +zI=|~w4zl_^iV)2jZXq<=ZftwQ)6741b(iWj&DczLr9tXx>2XF^O(kQd8VnV^Nnl)I +zCY96&Mx*TJ`wooOsE_ap3nmMFgp^Zuc%8wmR+PP^kTq}Mz6{nB($>7XL1Apmy0qMm +z{#T#>S=|3H=HGM9{|66S<^0c|J^1G4SH!a&;nH3izjcu*5z5;i;hmBZyHb#>IcgHW|;P~H|*0I +zM|m-&uF12N`(9tfj9nzLw#1kw^T7?-6%R6=s0OcTtZ?b1)s*Ovwad#jOq>uV(E0PD +zCwK1D^c_?U+p=kSZr$9`latQ#JGHLlwAB2bA9tSYe{-jHaI~|her`sBVZ#ydP-LC% +zlb!v8J2mK@=SblS(6tOlHX3ySqA)f&4#obd>UZw6|@l;T==&1ylQ-vRCfRZF&}i$1~_YFL+my-zi89>(ol=IW~F~ +z4@c;zr||1wm`<;o5gPfZKiNp3n%a{4$NS$jqbG_FeSEUlgvJh&0=`B&``<(l*4xeK +z%jYk?iCSz?gdW1G%^O8&K*NVy7-`60q?q*y>~dEBL1QsaExDYM<9alTZ@^pv)VO1q +zVyYf1Qe$?)`g`Oy3_V%zsW{`z3R496(mu=N9Y{5Fb +zY(~eY2YcPaqu&@!6qeB!4*D9IgKB~m*@$$2jxC6);|%aU_kyvSv~3KuS(ka#=#Ny{ +zIyOKXh{iv-_2>sUc14cfzS~Mitn5!lq3wI{f%ophJ6D{3(G((a{-_A=q5B)^m`_V` +z%d!O8#bo9&?=Fl?(6{Y?}FHE&Wp +zL!RZyaFiUzm&s0@gha~5>Z)i{%HQCRDBiK|5$1pD`)r3qjjfTNQt-_Ty +zT+*PWXPCI5@F>a@k4M4TIEa$XEH76KHWh~&sxZICmk8hkMU6YO>9*u@CX;Vl +z?O(mr(0zgd%brn^%bog@qvK~_bJ96E*?HRO?ms;|I#z!UPddk^C($1x@BNeGqi5Zd +z-=3Uyo@oJ$77_=7LO=D{l&FzR8co)V8`!w?f=lVua7qnqu^RD_Jnc{V-+@ID{%A;3 +z@%bbl&cXv?#Ow7h!B>6faJSR=5GR0XEuvH4K-J`~cIwQ^1Wo|6)O;iIm!$X#o1Ray +z-cG+iQF!73sPYu3n8A-q^?!S?_al(~L!#eW?1}DaNoe0W1b#fK4zVTHvU~lTQJ*Ng +z0w0Vf9z#eVFfw@6U5?I@0i?g(wXq&B9wKt|?4T#CDw*rp` +zimJl%!xP1azV7sgM2~XVp<9+4z`K#*HF}bs3!M-h7$_o7t +zBzOi9D5@Wx9H9{l90U88iVhwls_w$eiB5v8jnvHpHkvL~-cQxCOtSH0s9*+9b&dqy +z05zC{&IuYTQU{r)YFjf}+)*c---uQlaC9HCOx}I|0t1uGY>gHixe=6j{3S7y>Jl_ +zirnL9PH(d5sE_evB5(j<1E8~M0g8(&^m^z`IMfrF-CQ7*$aO;5`o~?MBi%6s%1VoR +zLps91J{my+n0SQeE0jb$<`1JsYOWbk)9QI?HJ=~vf4y_siT+rnBMw!fK)YS_t#f>Qbj%Y! +zJlRVWX~}N9!PfPRXihlBs)NvgPnGiBh8!YhX%teOl1;~lW&{pTPB1pG;<0lAahAQF +zj_Kik8s0$i^v8O7+AdbPTpRX6XV2fCs4r;2l_^SCvkg{Z86|>t7?i^k=1q-kq{i5Ab_tM$rI?LrDDSJ4---zN$AL +zZlv#r<0jaY3x8Mu?JRK{UDwJOWt8yF|0MqeynKuzo2a&79e1AYpPU~5 +zcK>j%^9@VPgp`K;Nh2EM@qA|&4jJPWe678pX +zGU>-f%#B#xfc7-RMxq;aLK~}Ak%I*053Y>XEiTken!J(yXr&24n9At{I4fLT(?hL} +zNQ%ouEsX|Tt;?4KHKBUQy+Uhk@$wd{WB^J)wZAK%Z)mBheD(^uRD5itSt769?s+dN +z;`2xi^&;zUD&}T1%Jo_==g})kW|pm-Lowhl5-17{QTA4#j=}-&yjKL>Yc;x;mWI9X +zrg~{wCD@|DEs{Aou=mZ2GLZ{G=WD8t9gDW@i1(n~o +zI`sNZ2t;B_>OEYzZQR^p +z7;h`_7+;?W9dTqMnq>HXMcshv1 +zeSf}hc>>N8lf+W1_vQB_#z9<3ipnVw1_W?W{jhFx|DdCuDdZU7{gZyHsM(~(hbkOn +zYMamvHK-@dQ7ROA?v|jkN|M*~Ye2VVgX&lZ&JKXZPp%8a0gp$pO%`G?oWS|e4=1qW +z4W;-QRA=p+etFV)-azzUT@_iF&4qk!XK3nzn!n*NS9*tBf?iFJRC8!_`2cqhw9A~X +zsVb5k%wS+G0ZhLmabc#~!cnY3lOw()bhKL|i~iKzC|YB3%=vB@j`A!SRe~Qzh6_Cd +z?1&^)B6H~DteHhXe<@*Fm=$B&y-#7JT(1%9u(yAVkhHv^ac;#+mcy_2kB<(Ku~0C< +z?x3tCt^VbVrht0AtFDMpDm|#z#)@Vs(y*?Wp@x!CO(0*sq^ZeXL&_7qxrorjz1|eB +z#5E2u>hf?Re?yq#wgDOQq(~jw>O}1HFCVg%H&uYH-Df+;UlH^dx~szRy6C1AIYf*M +zg<-ZE{mKy8l553w=pZG!xNt(!$E==|djct%kFD5@Dq;5ZyY#yv&8V!_F*Hr13(Yau +zkAizI)-fz7iD19aGJqnU<1EjIK#Sc2&^RIm2n#DcLh>(}gOwEU&EV<_|8{%PNwuLJ +z&;_!Mn9#X^Zpj5wRNDmD0rOwl_C5*$2HBG&fMAU>AB$7!f+}GSdnB>ir${r|Cb0oD +zg%gwoFxN8fwybx+wRE;4VpZ)jY41zi0hW%#XprgR-t4M;ylwo5^l~}{oRiY&lzFY3 +zbfAOjXmsOYiIb`3H82-AnHkukP#{c{b!8viD6N=Nj;r%QxBnE#h5;rNZA4rIg7ZPu +zRXG2n$c)XSN~S?W^3mw6QLf`}@#jZRYAB-WVul7+Z|P;|c3CF~kf)@bei&hQ=b~!` +z{N|!-2k{M}GN`8>Su~P{q&ks9h$(g_gZmcOf=2>=PsJc#@R0*=6*d +zi;nX-;Tm^kv4FLqR`=IxEW-Ahb{yUpTd4)d0ugCk+7Z;k8t8qo5EG{wkGvs$yZlMM +z{IVu`n;~xE-h`~`X)@|6*luhI%Vm1ZHp|gUkbmzbG(icqzSQW55j?12 +z?Cf#2jW^(6e}?Y$YV#-8QQOiE9}gT|tJYO^_QH$R4y;v?on_f5iBq#)CPDYGAl11O +zYapm42U??{*pM3gEE~HK`6ROnZy~e;Tw)JZlhI7>)sa@*P0FZ(R+=MByP;1RvsXbR +z1FaPzHSS7?XMlnmXz(F3khP+w{hL=q-P?U!{=IjfX=m2%n=Nr_38W->ax_c@u~H<= +zN&H4laHu0l4Y@%um5jBEiiZKt4iB$xnJyb5uo;v#EJZGzbM1zZ;9R|+C*HyB0qgDc +z=7L9&jnZhRAXUJIQuT*`8l=UcDF|7WVh55|pQcyA%|Ky_2w{421tku-h_EGOR;@To +z=*H;?38H$56EQnuIT^T%dh1}&`900mgv3B +zFy3DgPvHGvdiW?RS7gT}tvmy-QR*(o{bj9wonls$>?lVeD;7~7@{^4aBf5)KYVTY^HT&6|z>dk}aDiVsuWzg1ph)atCTG9b0f?HQv6^>lT0Yl$2NPNB(=?ioROFKk`N#8gL)BL#oMW3LXnz(F}?Ax{sE9`78SFl-E3wCr66 +zGcMsc%($Rxkq4t;ufQEp5)dSARqyLE-i249v;z^;M}%rR)9E>gVYAI78MACeNYTH^j3E2b?`RdA01^Cc#*J{@~IgK(O2 +zi76T%Iu_E3478*OA2ff-6NrLQ8PgYm4tDQ+KmZP$p6)z8=(qs%Eu~tH?K5GudAUJ5 +z1=f_%9TwbFpUGQE#PT|2>FkewTy&jH+ptMER +zew`BDaw1&Cdp4xw_|A)O;CA57o!WP;TG{Ea6rb6@)l$__8(t+>Cue-or<|6Vvn_?*j+S+C5Smj7h=nZ|Z2tFR}Ox5x`BZ^Bc(svzc +zowSDZhJP&BnY214Z4h(_Rb8cWQ{1eY@4HRs-h?~aqA)|DsOg%=tMDuxGHWP^A*Mjq +z29f40I{=H;Sq7#Q&k{74AcPc*J`5Nyd>91IGPWz`3dT8GBi6>thB=ARaEbI}XjrSz +zY>naMszX_ixUpsMbNEs-a6tjlS#n!P(uw#@F7=PA?vYu-46AM>ozk>`VdJe2Fjy8q +zIAA_}5GnDd%+g0;53|>Kvh(8Ll$!)uh#P|{ftGrrsa@OFuGg5`R!=mBk#xbt3|QLX +zc?8lwc;Xo&%Yd%eT1dfNNzEbH&I2^>!AD_||9`Xh?hkDoN#gkZivNl+cQG1}014Yk +zz&MAo>~QAc1)OBp@yUZUz}V7^Rx{$UiSKX!)~la0Bf$1%?>^sXH%6N2u6|WlS5?=; +za#%MNt=s*|Y3GjWEoqI5xw-{wJC>OLI>|_xv(_*4psGcof~H9%K+<46Jm;3|*4&s& +zT$qBZ(;&3$BGCjGsAi_*CvST?e08P0?LwKl{TcoBf6-?~{5Ot=|4)zq*6uv2i2wFy +z{)a#2nYyo#jqP!oPJ^+N+rU`{CO9qpI}Zn1)To+crVL==Kr#xPXD?w+#oY +zA_er3Df8o}4Wh|e=~yS65+E+zC|93%N8(@}SYi_rYS&`EM>xtQSb02!J1;%?wF@4Jt|wqnAm} +zaoB}zKLD}6=$xJejcJ-EXULx6n=30E4B0!#RnIs>$<;PJzQQ~K?Z=8sLj^+P3gh!W +zeae=5AgZ!X_>&06SHY9uJ8eaDrFBWlEw>RA{2*9sD^Xp=T(9ra6_o!rT>6gs)rf`7#g6DkhuK-DdKNvI +ztcUB4>1cbMw?KcD{1*U+-EMZ^e{1r;hu;4l-S9sG^0@hB|05vZHoxqDUk}K4%`f}k +z|64$C7wNkOz?&AKu)Pxjp-_Q843;*7?=}L&cKTvnroubHzN>dYwHzb{(TOso9GrYm +z?m$8V7mK!1rRgUf*;}xM3R0aGtbCUrozOB}R9i}gK+zSPKq!iwdXYSYkXS|D>^1QGM4&9|p{`gM;1f*1iYlL{~<-aH6X-5tM6lzNl7KHSOU3 +zeJ7VFf#2PE`Q!1MqweAJt>Z1Pk+IXr*fc`LynrUi?@N-1B=2X#Asj;_oD^*}C=K|m +z??Bc+mCDRnZ#V=y1K05@XL}jRX}ZWaI#xKh#W)>|IarUpl>07(B`NE246j4Qv^tc3 +zlFfo|(8`27C#Oxz7mWO>Otpop1&r8cKlx=L6pz^J6S}`RkFP+&>n9^PDQQemYBJlH +z-qMi*U2Q;@i)=cy`rE{_%y_3-joFS}ZFOafvzCoU&~sXK`(RA+e2f|xisP-11)RdB +z8bk=l&)@ijw41!|HK~k$5u1|%U?0pBvJwa|>Vq(;oG+^rP3wS6FyvW!a}0UJhgMwV +zggG6$XxYUyBV$61BMJPDx5_eAX@Am_#LMb*CPQ&;?aI#7Ij6dL|IJ{b3IF!t-)~Og +zzcG7GzW*j)koZBQ9C94>5L-#S76Z?j%KuT(1Wu_pBu}Bq+1Sk#P1Ho@LYcfNP1MFl +zm4{SpjJ65(!Z!<+AF*W`Z6$-fVFHKJIKhis@JH=rXEq6vkjzEmj8y-G&@AK&>-ve? +zYmC1Fvj7v&z)5JzV@)u`lG^khE6g|2>2Mg%n?lx1QdkBk`4mdd1qC} +z2dnR7H#T@*IK74C3PZ0#`<)X?(d(WSD)ELM4xApsQpq8qR!LKca*yok^H=JIR!={x +z)nRWM^(Eu=m$W{vS(S&2qQ@2cWnd4!d&jEAa}_8`5_b?qqm2^5ZXH`$kYPAu*p|hq +z1ks%T2J_xJ<8T8}eD>0P;|#;z#^21}1VN`}u9}CnO6-L8s&J6^qW7lrh1kjerpUWV +zGBY3x05V?cC;`fXha^K(ia%NAoas_qFo{w>6Ka9H0$(s3w9(M3H)x1uj*Z;LNK4GA +zq{X)-#mmdf6*e_Fg)OtmwERY`P$5X81_`B^&2UcvO+ksuOMN&&8~V2jlZCD6lxYN~ +ze?Cn=CdmCzf3m5UZ7+vV$Iinl$Zt2-pBcq} +zE||kbMm9Zr)U2 +zH}|LR{M&uP?a~;w+!;o*Cv8lI7FQ*2T-7A(8g3FgYFhntuUx|EFBd3H`CHi%^WxwA +z&NQcHG){$^$j539*jGhIQpj=dk*6}^2Qmvu8qc0))$Xr2j9;NyZvvsXHHF*<`B^#t +z2A&Iu`}-EEy)!H-PXNh6AQd4YvaQW!Pq?$#3}~(Huo9Lf`iy1qAi+$`TMLHL&%avh +zYd$yX|Gz>CxY_#u&g#QQ-0 +zAEWUEY0wka{7d4OyD9!nA~?}+pO+N%rF3v|8F1@-a3m2%XWT<#G4kLd;ZO$@LjZei +zXD``0I_@2By_{n+ydMv{ThGn?!Ty^)e0en2Q00IZ)B5)=IV9-T&}oBPytnA4M>&3d +zcyN5+0&(8IdHvJYuJyj-y?+k9de!}_RbtI_<4r0t{n6^s(%G2BS-FQgFr4`*m3_I* +z0YUW_bEmM)N`@a}o!_ShDy4TGMg2)el5~@OGAO?euL*f^bL>c|658{^4RJejx9BV|WFB=4_ +zDDL@V#U@2{ik-9TW5dT*%NUq@lI6H~MU1B^Zggvvih}KUvv5unsTnEzl=?JuOR`d~ +zx-cnH-SWa(SC&6IKHS-V>6T|zWMy$Spmj=X^PS2H=**3wbKN@1RjIOyC~@5y+E=Qw +ziqgq?<2Xkf>zaWO33AK3K5v!P91U>jEvi?bRh)>PKEt9C%eQk>g)EYaIF0)||$UQr`Tsp9ql^I_|r@;z&)h^u4&Js{^c +zR1n+e5%mwHax|Dq`yig2eBdmZ)}6?GZv$Wv?g{N9{E6wb@rymAv;O&V;iN;Q)`rPN +zoMMiOv*sNd!%~e~wuo~AUyJxKd9vSUNNCPSMHVc4ye*3fK<8^qV-ja}y^OO~`rS +z16P`_=1t%^GpyCfS)Y@&8g>KL^eXh*<)c&8cTo*<);FPa==W;+&+e6(>pS(UIR9sN +zj8EJN1ooeGh9n~?{{2=R4 +z@9p3ZicaAUsHU7>4BbOAL9SBS +zw0@YWHB5(Osk0e`VmO1Hvl@TVv8&4aEVaekKlMbRdq&bzcz9HN+!@#|zj_&C&h?bD +zQyin!5vy8R*kz@KXkV%IvTS=SHBgM)?Y$XAR}paVX)u_MM%V6b0lZ5_(@{VL$nDI4 +z7Y_^(Pg$+*%HX817eOCw6ekz)fS)>cZs$>cE?3oB$4wVj$h4De%N^dZCYWLuOd7!9 +zbJ}QWMsV%G +zRP{1WFRG_(N;5`Xw-q1SjqCL!D>9-#75WrZHp~ogLyL=JH>_E%oS`t$M>2>jpi-uGywE@o6&2Bb%=9E1b3S3*E_}Cx +z1zkMd&H6vlEo26w@FZ8e%y_#*CwLV@Yo~oI1%%o-i;GicSEaiAGP%x7QFRZfltj2( +zy0Z05=9Lml!nyGNqo{c>iV-JQJvOGc%GTr(SY$flptpvlHR@Q#; +zo=&G@nE{sIu~juVktMQ8LUqU{qzE%-4<57MO761$Qwtxv|;Ht$3~&) +z_y5fp_VCQjeIXuf*lunPos1076L^$ergq#Rqbk)fghS$7Ve&I*T%!LlCz{Za85Av) +z_{>v^be5za(ZdgK^tlqcGU+OTJCsF?8?jOOh7`_xZ^w7gKp2TG;%iGU4qZYD?r3J^ +zp(x9Ly*KAfmxaCC8}?361fjHH5JZW1msV$6n&kzuyP)*VR&EMw(WK$Gm=^bwhO$wC +zzB3ze=`!iKWh$wGT;T6kz-KIQpsOFGHrEXgsfPxD#Vp-UtBZ;cqcv+i?JvV3gch9L +z+rznE0mx|Wk>)#lNI0ig@wM3GTL-zTinow)ACu?FAnt#Vjs9 +z62Ak@RIDI@GrE5el`bMeZt7Oj`-rtZQL&2JjC)nvUm@}7Fgg=@-hT3A9E{>9#poVq +zoC~Kh4pquX@i>7o1Xlea((Dvlm(W0G9g=a>d4#VPf@m^{uAL*fir-NriAqa=IjTqo +z8B|+lR}M!0g$LN_B$ggT>2-j=FfKY>abo`^MJY!jR?i7w)lsL;POBe!JoL;O&?g>= +zMULOAfL}nyCd^(S4xCGJ#0G()Fp-zhHAZF`XP118cARUqA;4+mP0C4)YsL!X~0hmUq|dc1I2wE%=V<& +zs47|GyHr`$bqcC1a#!z%N+7p3skdu?k*Tw`in-&*v5>y8H+M1ivw?lK!5te2-P5_{ +z{?+ChU;Q(~{)gqDuiyYY+x}&;I9edu{bk`=3AJnYy?d7#^(E#Yt +zO1r(X`d!fee*NL2^|i+p4#2lC?$M?^+(M<(t>Zu|JyB*m2ZztQhrz*X(pcHsRmYfl +z-ODJ6P5u@Qa}Hi_A3X0KEwzzVnkjIgm214}Rt^Z}#^D +z?7^`Np}Wstwh#8Vx8&h}?Y-tN-M>gFU7G(McaM(EH|Vjz*xHpo9B=LHnqQnyn7_X` +zINUurc&&fDKJ3bmW9JnB-Q7{GZ0{Z%b9#aeT7sNN@Bog?N?I=M>G+YZKCle0tlyWb3wt!LX|FgJ(z{JMt-NgQLdT5chIE!mY2$?NL*J+$k=cDSiIzna=OcO9GFVmI~kRk=ahQ+~bG8yY;S +zYjE|35gyfy&~MQ1=uu5aZ(2Y_H10YvNM3GQ1-}juqPtcBl6BWAK-}(H1<2r?TRFJ% +zSb((Nb(;VYzH1dA*LU8G-Tj-Y9C}sw2&h9+r=i^17I0cPb=o&0cK0uLt+9K2=NetV +zhChCP+u&LDIdx#0-gSrK*?8AF>P)>W_2JX^R`_EttDMH4QxDJdy5-uh8(mF%{^ +zo<|oH5Q4kUiR+ZV<>TN4JMUg_=RqIiM_@H7nGJ{8C91plR$%?!-21JCU_JPbD#Nd5 +z`0IQ1Yuowt>%?oSFzxFqHU; +z?8aYh$PDF8>NC&By}-nX!l!z=_$i0kf3+OE!UFMC)Gvm7_pfXq*l>o!ArO4slSZEL +zlNOZq`*m`SCj}03iQnD}{P&$jctatrlKwf?KaYl|PTSlj#;}|~#c`IRP1QZi+C=qb +z`QBGVI?|KGFnzF{_UMWR4;?w_bDwCX&8 +zdJTS~ARoLAof6wpVoMd+a^F9b_quD_-h1dgz1K6vRD>42Vty8b%b3DmH+bzs_N&PN +zS<+<8d5S0ii>}n9=|>!muh|>*l;gOPGWyxh@zKuyajPx6626cr6aeR|n&ec?a`42f +zq6f0K^$VIAKoR*g@ZLqL;jM;WGPjEA%1@uRl^GME6;lG(5Q62{8*+E8Z5AH%pl35$ +z(i6GE|=S;avZCTVhQ5~8Jd7_NZ|MBLLiF~6=t`H)r$dt +z^s3!Rn`88b`5*khMYY4#@X3=jgn!22%yw39)y}H4^FO9h?W^FP3L`enKaYoF4<+qm +z$gxUz**z8|S0jNo=!WlLybWmIggHyXr%!qR;dLLkFWa!W8d}$SM;4eSxdzleVy +z@E}w@frl!%U+=;0)YV+|)pQ+dG~K9QJPjw|k_E`VecwLpZXE;uKHF|&tYi;w+O9O}If;+y +zmWuS|m{G_evbHKmmb0A~)CkZ7sy7zUUw_4D3 +zx$J7LEY58O&*lyru+P>vVLF}xM#6`S(A}1lxzdGj9!X{Al*8*RDH?3+vW;h1HVmI_ +zP>dKjo5ua6C8yf{&aU5y<>h777yO$hLtR5%WcgLdqH!9(efCZ|b}@ZTLqe_%>Xww-p-rM_%Vmrz^`=^acCyOh99Atj?$lsdDFk +z`y}RQo58cDQwJ}jobni7S%$k2R1RKhZasfqF-zDv5c2G<@m*A1*_K~+?@a{`aoI(` +z?DL(U>dLN^;2zZW_Zz?L>w}-`%Ko=s_RapDkBTjC5A7cu`$f>uQk9aO(B1b74de6- +zgcKnDR?&O<4yhVRVdpH3h$~Z7oXQ5xz?03V!M4-OIW%H57f5cC +zhuom4V^1TW4Fm;Y+>`4hch1S8EokDl*=}`0wTBzLkF2-PD5V~cT-`7kP!fl3MpZRy +ze9NTp#H#01=)l>W$1%=K9I9E9n;)*53ng6I#2RR=2y>O3@(eurfrf#UfTrcQKrn^~ +z!qQr}NyR>Km*ghOh1*ha0}I*I@;NaR*Kj@RJhMKGRzfueiAS963Qy^cmw@B~ed855%D#Pe^{(kJbsFmBTe8*9`MU43tkyj2h2z&=@8k +z=@vr`ixgYi4AE;-^|92ZP!h&Z>aAN*ZIkMipbB;*z-_w(&E0!z-WK?N0LHhiT6uxa +z6B)XZB{^{OO}y(E$Nl6qfh}~20z@Ab{xs{j+9YI22wDu4GcKg{28CV+XcU6Pj2~}- +z-eY9Sd?9Ec0SKL&BqAnxLUxVmxE(cD$)%?0-FNr +zkeYI})m{foBs(|#u+v&whb2c}Ip_Jq)}wV;A@6zcc-?6gF-c2nTdL5v>moa2A8|Ht +z&OzkCyyS8rvNbu|LscqTa;iIdcIGhmQ+PU)8z~v$sT+L1lvm=gTp}`Eq!7cnHn1^H +zvGb +zv?DGlFARw!e}$xoM=F5Ubi`_RaSDn8WyNA6zom)TeX-NseSXw?-97BR*nM;K5h +z)*pSlzWQB-^*_+IK{Oe_{wL?O^ei~K2EsSO)PcZCT;DqWr;6+uPbR6C(u@4)%h|wY +zr1>(>iewafiNA1|o(sb6&a)fRenrzOYR`)-D$krm-&s!1N|Nfs^Hri8w0@pw5Wp!M +z%Wv9`8zZjcL`b9r;Pr{xpnVM{yhVmjD+-g`_NPX^DDe}Ps#s`N5_CJQjfvdt)S@)) +zUgmi#==uCN`Fik8KHm(~2q+&1r?-#O(5oqV$grjkyDXhp<4$}k&0~BO_oqc=GT#cY +zIbmLd@>^!(!t}JwIW8r2ft#JgZBU}3SF~5PVk%WNc~V-<+08iEfNv#*v{`lJVa*(d +z)!m}zZtB(~8{OC~yF!u8DBihY6j-&Pn#3Tl&S>O$SzVQ?9gtV9K4HAxXXmcy3btz;_$NXn>5Fh`G~LMGd0Vh1i1#-LwBbjrBsfDOJt9 +z=o|{O@Q4$#&%#>+P?EP-FIgz@*kMqJ!jyc0v<{2qL_2O5K(5D_P4zvHh?%>1J8FDG +zL#o#Z!xj7C_U^&m0Umghc%5&_e_H(A-(Z2=PaWvWd=C4hV +zEz;tA^P5pK7(~~b-wc`oNM`Wr$0pj8ZGN){Bp~i@ese@tI6-hp#V%38zNW7qfd1x# +zyx9B!s0|ePO!Hw!I9C0 +zEDys%B^icwup_7et+c2ys;MK7gfnRW$?KL(1KxXaW5 +zsUn~^9B#Qfru>tA{+m9NYGn0#MNn7;iMa9e(9l<&M>ye{RHwnbffd1|7-1H&k(&KQ +z%1^a$U#FRPbG)rL2b6;b&qf64L803xD5+_RK45A3To;`h3PD^O4IMKf+43J(C_Q?P=w0QrWgqlBgRvazR4AZ +zKfF9pR0BB|%+r94KRA(IamqQs_YFi^liEfQ|2~1FtcQ)9H1Z}BAqDNq?A(b;nL2TD +zuTbOBV1UDDJUD4WV>(reHAh`y_Ih +z)gPE1Nuaf~WT%tkRyi}yDQ!t+EG5GYF@8YO`?O+KJvBbb=S)N7nhep)BlF3uh{aRO +zf>=pXE4e!CRu!pK#Lqi1vNX;na^&IFppquz0qO5CN*(I^^>QKcG&IrVG3rkz9CS2M +z*^8`&GgPz4Ep#JVOW~84P+QUXjbw;HG4(+qk@!Bw0mXVMbeyw-wei_l_cLE+qJy-z +zOqJ9o=3+p0{9;U(++s*~{BlB?+8q}lY-_(HZ~RuE_PU2V+f@8`XRrHd!*9}7 +zk3-X}8mIQ>fmQ(e&0{3mh*HJR_i;C0+9jeN8=+|^?xLx>?bnI!K5?tTkNPD0|JiU+&Imf0lJvLm$3Ep +zwDnZtI=|%yQNMs+ZE +z^C6hFJR8|@nc3=yCkN%8REGt3042F@%LVtIsxGiSiW&E@|AtNsu~LH8J00Fa)-PJ;jE&kE-sZXUV>aXeyefQgm*O_-m#U3}OQ3T2lsecOMMeL-s*AX;>RYD1#1rdk?7mt +zE2!I*idodC<&CiDz+bTI})(C<{X3`n7LB7 +zg51vry!+`DEy1fEgLy>=faE%_BJX;lYg<#KT=k1)nyq%sGT~g7iJ1~zz%q%L_ns+9PxT81A)6uu}8O +z0Z~Q&Ir&91IQsGMxVN|U3#zU%3Z`)Fr*C0(>g9QYIy}|QCte$&)tk3cXld!)vdl`r +zcX|lODra}vE@~wPfuV2rKG|%1&xM?1sBbf +zGo0D)6%q2;qWSsYqRF0q*(vb-EAkDwgAfC5G=ntskkf`+i#u#dglLf7gg+I+2#=e& +z^`&%)Zya`TRY4FsYNCKvv7lH<#2u$T>fl@t`WzV4qFLGrG$phI6?-xoe3<5iDwiqxw;V~PvAA@IZDhGD>4uWP1ONud-)?W6Bl^MJa`cJFZraQ_v+vYZ3aSRhdp(w +zVGT_nEG9Cs&u+fT#bkG>7BwsO7mosOfz93`KjSxD++V6yZ8_&q>r+jwRXGi@>Cayk +zsn(0tRDp$%63rya3S4NnYLR7^9P0woD|}r?e@`|2)pKjD0IeWuV0I6-w@4+UpU`w^ +z!c%GzF~Hj1SZzjO;XR!48a3<#fh(x9z}g;p98LP?M3ZaxhPN36udPkkY6D_pPC~?W +zLuL@cNu=@BPU?sYD=^Z!|3F8BMQdOtDRSkR2hFRg_zj$Z2j2 +zf__t$7bM|QC(RAM<{t^rPZBmj!e7W0JMaP#+C(IIa5l_NtV7W?`BT*^Oj5{>5KSc% +z0@2#0p-S76kr!%YEC;BYx|3*jNEl-ooVXpQtpn_hrduSB(WGeNpckJSztD~2F@Kp1 +zhiDu^E?<$+r5QsIHAZU5P(w9L5BL0`Yy`#R8bFTGP%4cLSTet|mYrw?Vh&6Xv1_O- +zAX>naYlc&vbo}53b0iJxMB_;(s4{r!`z4H*Ne}E*6Rg~TLn_0h$W1;-3P{v~+KXj6 +z#x<&CJ~l;F$WE?6cTC>A4(e3g?`_t*jR~7_ica5b?GCSEW +z)Zq$h#Oxj(1DNHrj@gs1Feeq#*^Kd`?fX?RiSS$^rmMw3)MQxq0w}0zRRvX228nXD +zkdqk@Cgh8Ur}nnw7RVY{HMXi1q_6OfRve#cvWRPfQflkLNrWR>M*Z?dLU}aLW1Y0P +zAD3Htii<>`CA%x|*8&^gi$RS~eXu&B@qN7JIM{hEAfV|E>H`1uiifxr*y)buSN&Hv_zsGoKoBD74%ed +zV%vECa}?g2bJdh2v9Z1$wW3=1(5y@v3$EG&KnRo7U( +zNoH%i#v-(jwcG^Xq?IbkNr!GFLoPdrSpXrE^;myUdl$^D;s$+iU~QHQKM+JSdzCHdWF=@aY%xUF0iOnN&aSr +z5Zyymo}P6(v&}~J#>%)$C6LHKsLfR-_+&|hm1f~vZpK_^>3kBIsOmL`<0)joD))@@pwr-%Ws4P{4Q@4mFXhpn< +zGMzmBK&31K?{0EkJ^kqX8auy4$>}`PM}U4r^wdIE$?MHiU{Y(t8#{3{yzlVr7}B!3 +z(xw3Ll53NFGV~Ok^9uZkD4R`PR-)2(jf>GFmR22WySkJ0dwu62aO +z0{?YR$koZox~%oI$b=r8%Vz51HTqaqAIgu5stV=8rTYYAnktZUHa6ak4qB%gV*RQ* +z7?8PQr4vu0WVA+`1QA9QmEY@Oh!;czCX-Ae`xFpE$d~*e%xu~b_d|scQpizv*1}e4 +z)6M;Yc_3||Kb8es6}TPzj~ehtp>gn+Q-0b&KdPhf<4kDIA)$^9SqdB6Sb-bQ9(>K+ +zig)wE_bSdD=&fp(oY|J6Cv?<z>cGVgSMF1 +z;JETomPtxd7{`A+Dr`#{bIC3%PHJ7YNb_A4|F&}wEdHYz?47V<(IUIB*oGhGVo&7* +zS7ZUC4LUG3%sWE}^l?JdC?%H>Jo35lM<)LllrEEWJY^3hRk9iUgLr`>MOW2jOJI)A +zhE@83ZjW(7{aQXnjObq?!ghi(^S{1WMiiu5})NZmR6NgihDB8@wb9n4@<*ntBws2 +zMx-x{#s+f&Q}yz2Yj1DsFgSd(+dT^C*%tzJk1p}Wt+hTQ9HtWm%e9^cZx@yqg5QIM +z^@Vo<8I{r6)t_Yw7NtuMjPd~lYo&X*sIYf2E}^6r$tYG79Pyb(7Nh+FL{|Q_1fKMM +z@ql6Lm;RxB%~6$a9y*tUp)b5$U}L?7cMCp>m-~#R+5ZcwP%ke+X9h0lLYd7JE)2G7 +zBN}KW{0boh{0~KAo({#FaXXVkKAYrU;OJj&gb|JC8@92{vavXb@El)QsxTcZiiv}o +zI9>~}MdhPH1z(2FYopclT=|d`PLRI$6W~@R16a0UOj$>)Dp7S6&M#jsUt~EnDORMl +z#m6ya!9fM+2_9c`G)X`+??Sj=x%DchY_Z?hxTvcEIyTs*GkE`Y0cNWG9?%6%ap3Ds +zd(tTE_?e@$vo`$NkoMAZ`$m!@gTWyp0pS=6l`me+2G{CM +z!W_33ddCH_x!tPV1H9TR?X=AWrsOz8rRl~kddP}y4MK0_2bOB4q&CuVqN&NkDAAkT +zLbKcef~!#A;F8oRZYpIE+(m*`o?3AhUg3gbPcKBOXEm`M%c3CjJqjLZ?Np;a^0mni +z2%MgE0?cqXtoCF}VVk8$Zx$+%Dji$Zc;rkeEo&q%7^0Gbh8O}yFv4k2`JAbnK}JQj +zc_jcrNl^)O>dPkB8t|%~;CrPj37N9cp9A&Yo8h}m5?VR#z1clJ>>jIqMsHdz6|{sd +z^7`2nZ|}TYfClhqX?B@fCknxOH`nY%cSU^+aS!XTt9++C+N3a*TyOyPg1^J*JQ&9a1ofc)y}d2Yu|ZwnclA}X-$x_MUW8# +z6QD+GZH68lSg<2B17&sUuI-3XNL4fAXi{J^hThn7I%DV+4bjD?x@mCC>ld0Z%Yakv +z!;OW|ND*wy&o4eL5VkgHqcat=k1_|RbOJ5$^1x01cHDm_HugXfI;STM+RPYm4F#UK +zp#7Kt8_nD>>4a(AI{0iI`MH=uw;<4=9X`!8OUR0@YpvIKnDd+FW+9pCY2TwLpYrwNpz +z7eO__s3sXaJQ%eR_SL6k0bMdnX{y03Em^qkVY}H_rU%atj*m(`c)z^7yx>t2*RKK7 +zLW)mPgWX~GUT+<%F!@$JwB*4s@G!>PS^(@yEwo-}*Xd=|qJe8&$R2>jFc;8sigyem=AkLxP{pUXIK&)e`VHCG? +zXz&XfE`MG29Sf=H3K_StpiLiCSJmFH#c?cTMgOT<$*L=7jPf^J`ERBE; +zBxe*QZqz^5P!+uYoc_Lev%h`3bFgn6ah7&iTC;2x?71Y{C*K+s78l3TzJ+>F7lj2T +z?I0fu^!1aaZz8K#zTrf}NR+M68q&A2^0b9@$G;;RRikx@I<|nS +zhh;si=yElD?YUmn3cs-%a2)vvezW8#S+iy=IpIwru?$jvL1i&`j|D9ZD|Oe13pV)D +zd2F1sRf_D2W7z17j6;g+(85yZ{=q&;%~TP$9bfP&)rn4!?wx{!%leMgQb{q|NzgOH +zuv+RQl@TINEhwHYNRan-svyPz-zZfl5|Q~feX%vCz%Jn6mdxR#H3o1#|HLVRDlPu# +zjYFrM25AgD)F9~W&x>F|pUSG=fZ%LA-sdkmmuSX}@ +za26pdnTSr3Q8c-}?NaK(t*3eym<0x&3PeA1;e{}Q_wVo~`u)1R&K+j-U99t`>PF0}S$$`I +zi|($Q?v@tf7JV*nrrN7NtG6hZ)O1xfewQgn3g9ypwM>kwBrP9Y7oXi3y(@3tTzN7Y +z598bIEmIcB~6JX22`4zl1(r3W_yea!8xXhcT&o?uR)hyw~40f;bfx!Oz@SW6QuklN44g!YW7ERa>)p?bGU0ZmuK+lxTA +z5_@iQ;;Sv^9o;?=#SN+OdbR0C-MIr}V7BxPT@*>g4_PEc>rHw9JlPr4Ni&Rg#&K)K +zLQ<%N`fcs6gJVSuVfqj8_l7mStp(@p-p>A;Bm4coyYF|q`y1{c9nf#~;qQh|ZJ#Bo +z=O@XnyS}jGw!HQH`HX%ay?JK8UGzrvX4ihZ;=X;p^OODd8?Wwx)9!z}Z(kq$yx~kY +zC$V2+&s|GB#+ +z`_J712Zzr4gTqTqa9safV`f%sqaOe21bKfb^#jNGjSw)=`6Gi5HdP0IJTJ9N^?DqgE +zqI!updPHY*Y0AFD(bL}38xC2SUY9V2vJ6M2JLfR>FnS8>_nwSZ7OdEmLf2F?wOnK~ +z&{2JKC!D)3 +zw)qf?cUq>NqC?MxYe=Zq!aCqst&e!e`ggOS=g~#1<``2USIjaaoEkA78>JyD2SRJm +zOjGbOP4DPz{BD^D##4LdEeqNXk5$$JCyAG!a@Iu9vnRyNhcV2D$!%G;5`bm%5?BlJ-~zUqGXx?7&az~AsTWjH3K2{*8saS+Cu@AF67G%FwH}+{lUu%UwgctkQ&I{`|oZ3$DH~YsZbm{j8N9ztls`7;R$M$OJtmcbd_B*e%_~3VVXF<2L +zHz<;{pE`S|8xMchW}`FzYWW7#@$6o<9Qw7xCl}K`@{Lo)S<9)S11MuGOA6(T3TGX< +zO+`vZD$+VfibfI@TCS&9p963pe(>SI&PqQXsmL6(ex;|2%B#yW<=4S+8XW$k$suN% +zDr`zKp#18jYSO2xjD%yb!cm9D#!WJuOs(!weh4qpV3UXDJVQ`us0?x*dxhbVDA5Zn +zXyiT021em>u!HfXn?a7m9mv)hx=$h?1zIA$L{Q=s$p0|vv&$NatrP}^p7*oywVH3$ +zraQ;W<>=5NJD(1deknR^#l#QK@8VEz2STyU{P~2tfF1!)1$Z@O@TY3<_=r; +zQ<*Ap?7ZPQ{)Y{pv%jAm*9xC0TgaXL=iOhr&)w8nT)@Pc@x!($`I%aF?n15Zv@Hdp +z2ahLUL){pZFoD7!;X;}<)NOpK>?cO3`ik8oa9`d_C4`gFwKVBi33$p3^w)3NSkbgc +zWQ=Jk%aq+Dpsnv!hi87koW$286~2XaH!mp4Lm9^w1w=dcjDLUM#El0_Xh1)3rQ+5{fq?tDOsN +zRLpS~eEl0OIfo)WcdMIzDacKpOi8ag%;QzT&eu8m +za`V)f2B-XGFqmg_5)T_Za*f +zrFVd3MM;CPy#zd|qb63A8kh2;p({kam2(V6lH}*Ys!O7kk~i!ar1e{^zEu>K|FHYI +zyLBw56g3Yq(HND9p76JEWt)PVzZQKW)>h)`z6rD6+?j2LXQsIu_v^Z>-Rk{xA +zWYkvF1l#7;U0j+J`o^_v6WI!ctRluB&y&z-^)ECO8mLWYnJI^fx2ocbm<-G=E~zLr +zh!_mkW-bjnYxg?oYSUgO=fJhmtHjXsGt}|H!sqcQN&)S16f{%uYsIre2SSm4X!37n +zB{{X`q`>M_sN8ee8-CxdxTAQze#?omi&oE#x82JVgpw*hHIp-=*@{gnCeiJxv(Vwt +zvEWDdglAmCgF9aSsEJ6G$?^jyHvh*8tK@7_Wr=T0ixssfg%G8b@FtjrzySiH4-J|b +zkLu4R7;yBCK^RX501ls3S;wy_92H+kqnD}hC^QrvK~vmD=ymXebr|O+zT1m~!`HB- +zm9?T$7X|AsLd;M`SwsgV`9a(tMi{Ta>tv+^hmN0LDGi#}?palVbTEIYjk>uTm1hr5 +zlnfD<0b|w4QrFMg?!iIDtW}GLRcz3)2V=D~9c2?yCD#`?+~OQ|;(PAQ0ve4^irk}L +z6{mVbVS^0STj!7`gA$Kd?i{RqLn@Mr<5nsv151uC(Zqk=(!cNYX1WE(r3{hXfD^Ue +zC**xg+QLvfq0BDKmn8Fwftp=7F93Ju(YV(y%gTN=Cu>#iEF$9K6j&#O_$^wA=)7vp +zs%o5QOdqIa)dLHmP94tj3vJ;jY-4Lj#G{v+LEAY&yf~4&2V2iyd5R#8$VL~nd6g-PlzMVomWQEMqtuPluUEQgQbkDD3`d>$OOZ!5vi3_RL +zQArd*w{R7;pp_2BoqZ;+b+*}MebHL8q;}FQ2JZuGgM9r7iPcffYM^|KI)1!UL9K#b +zCkbI$gXJpL_*yB;ox=88i8!hp;5eKR6ode2@b3!w!`n!>K5f6{9aX!;7SN$2Mjcfc +zUMHlyhstsnJ}Yp&aGrQ+t1ldk7w(P5`VSIB&~3z{WMzwhvlx9zl}i2i_>^d-CU5|tbnU@6-6QV!wLo-w`LFJ +zmfoyePrnrUyYIXJsr5WFiQqrWp9DJ$kyZgwGo}7rySL9vcp_9nZWkubBS*Pl>)&-Q{>KUG*udko5x|gSJ``0^d|k@&I?Uk +zO7W5KY_1DntX21L+RYY=Z*$BuA8#%#E=&p=i@Bt6Y-03kXC@p-z1N +z$;>cbM>0SB*1olSXSt#KJg&aQbJ$@WGvuy}TYbQqnyb}K!y?w-6aD8t +z^_EwMv(y^i$%z}IoR_saPO2)Z1r%}s!vzudD0?v^4uk4_l>=Wj`CeFF;92wC%c?xf +z*B4Bn2i>5UBKY;~umDoHIy%7ZI9XK?Sy|;Qq^HOTY4&8;xTq*j9aYvaMO4wFQ*G!= +zMxQX4XdQ;#s=og;l)=&MXzi=f?~s)+tB2p8N8@pv<_pRmh&fz3CTa{3Z?V;hK>uF4 +zxUHwhW$S|rRxi4S2Fg%?FI?4?EBZo*<@V)#)1jS!&~a#R1<42zBs=M#2xz`S5hU4X +zIWK7~R5N8O3T-N(aubwI8ZPQ>P$qH3)lzA454*>24z(8H&dLK?V8APA%+G~D7PP#n +zNWM1r4D}a0)EBK1vdt@9S?KrQOHoiaG-;R+|Ak#LAurYD&YX@|1XhZd$grz+Qdj5B +zrHP+f%Zg!H6L-S3;)pHG!&`Cg$|mN$VhkywWJp-$7+3)+_6}ZeA3X2c$Vl=&s%y7) +zb_ta?bOp=m@+G73mRB>ZO0J`fF6_zmvL{&+Sc;7xQ^w|*HyD|aO^X>lO+9iS=ZL(0+cq!+QHSG8BJh=ci*d4#O +zBx>AlKnH^FEraEEX3}6-8?k(n8)8(IHLTY8-wvKAmZjvmgL;5q6z6$#riOD1pI0<+ +zb}637npTt=xq9@%1=z;SzGooa-ur-!t%QcHAKeZ7^8+7t+1^4HvXZ1hX%iyFz7(QH +z>V=l)2Y2Y?3v}Xgd#RLZx^a1Mx6$+6xewd2MbO~Qv%9rWcI;HllLe=A8vAY6!zVGp +zAApfDZd^YWGn_a|4kK?3Aq+)Tg;vDMW!IrpTHLgez={5;duErIy+U|omRG2>JVg!E +zwiW2-L=5;0xo}9eYV+A)ck7kkq%j=3aZahe7dhz5dsp(|RorFeRPwp1QYl?VlN62@ +z=V&T3RO}E@WB5n!U><(s8F~ADW8s}02rbE}^CI$;eZ^FSK`F<^aW(9ZHZ)f-^^};g +zmV%^eMUPJGp$sLxv{p|`@$sQI8bcMLdL^t%F7MzMES0NI(O2dF^wp!G{@b6QS)Y&b +zcoBy&4DqfmL^>QSh27;;$pv<=ff# +znmwfVGoY>HVg$Igd`|9l|DK$tK+08Xy>pXqRzHD4oTNCIACeV8zI;A!Kg>=(#Qnm1 +z_>UyRC(7~4ituG}t56p(85ec|*36A(e@Yzxt8jdGP-?ga_b+HANSq&Y^j!RJvO66K!(E}@$_j_gj +zr}`nu;Hx@LK4TjJd+q3_cDie4M9Tfd0>xpiRc~ETdJGMaEC7n!C;aqZd#}BD)VcXE +zL_ZfYf%0!Esl5cOf)Yy3n?;I0hZ4-&25=U+InehxF-0nN@}GjKQqPD|hAvNZ_RjZo@yM2-lWDwQn3U5S +zij$G^f*u!kA3Yhpfe}{ep{ZyNVgxCPoiQ3C0MSJ^Ox`4QU2ka@*`-ktpuUPPzjA8!W^W=7?m~C^!SrJ2f!~p{mziqwT`(s&M6^%9~CmacXkw1sL~VA;~ej392Ma +z^b6{q;zBmq`gEGdp-Gcu?~qdC>|83wfoR-|W(;<>%SrWs0aej8u83OjeAs2}6n@Gk +zb9_x3`aCA$T&`m~b4VTXutoAE^Fgesl_qN3mlPDhaXOBbv=EK>@6!YpTKrkxr}$Lu +z@kCOta0=KBCR*>u{RM1~_}lk*n;GzX3t2y?Miru}L^j$mfS?%Uw!J`EZ{u*CmQMbo +zpYN)22|0@W%%Wqp+UMB>3ag}+v#LlLoobCYjKeHjdALZk +zoreMN{_RKWk5^edL0-JZ9 +zkZpq}5DYT!0i|_yAD#IR;HdSUjN*~^geS^>hIWbGL*g0yXCszU)Bt(FsF`V8g>w!3 +zlAXfWU@0K7+WqDDaO>#x)^<14bug1K)oTo)3g(t*sDos&2?RF`gI0ZQOxVPAftIS; +znnX7PAKtL4FQFE+_9D6r7VoOj2{e&o5DI?6>_XDtG4^nOD#_PE?1H# +zXUJCWQmPO?cqkrD?C9nkIqjyyC0Pkj$*dh!V%yPhxPvS{XZoRIa<|=jidL|_e!`be +zdzgOMo2q>>6^M&884~-`kjH4!BVN|ReJ`NCcEX{~$l~dJKUr|G +zK%inH)=z0fy)k3PZ%cevy0b6yQZhFI=9Cx6tO|2U|c{8J(@Olc$ipS +zk(zC~D{HN}iNiyI@5kcF6BTq>*pDz^2T;Xqa^0e&?QBd&*M_+t3g)y2T_7;tDCzCu +zbif02_V^;IkzY3WZu`yto1^aY1{7q|54Fi@ES86gomCxH{an_(8Jt1UkY@Eql|X!z +zW8YhHoz`{a6%bg0m|V|u*F8MkJCY?vxp)n6#V|S?Z3#nslyS?hOGZ}Z8KKR8jmB=t^DO&Velm*kk5*O0 +ze|*e&Jx@utA^tYR +z=pr7FU8MC8MlJ+v)hAVivlRxdoc^a`Np9LjQ1(TSYSX@vrEpx0(Ud_;ikcM4F|P1& +zn~BMA*id_~p8?MVXE#=7y{xeUQdd!cYLhH0&iZHo0fjne{fr0b7lTbuET>3d>|FI8 +z3By52(eo%jcOD2SQ*I&(!rur2i<}7J0knm`=)I=ILQ_h;GW!I(B`n&mY^?_FBmhCA +zFvQ~1LDOQ%NV +zq%=^y4(*UVK8}xnJnU{gSFXBd_cxG-dZ`x7Cc*8QG#Fb*6$!>x1g-h1_#7S7tEn#@ +zOxAw4cE37q{jKj)gAEIcflx&Y+WvYc`QM(+^C>hfjHL9csn~CnpW9+6HuZ!|+cca1Cj*l%AZijVv#dCq^v-Nr> +zaPb+@*`ifjh@ru$fAo{)d&9%;65qc_#|qa(a@|-w4I8-8aIka|yL-%-4eJ?E3#du3 +zy@&XegeMOgP#p*dQWSNRk=oOt-G#D+lT9OMtmsb(fiRR!Qgje&8$bWJbKG5hwsYJJ +zUhMqReGcE$88nI}A2~G~Zcau$_7ea+?Er+lp-Y+C&EUuZ?iSuBZa&U%tV5_Om +zEK;rxNB3xOpWzu`t&V+;TAZ6X32>rnP6GHoj?%GshW*VuzdM~$MZvm5SjW!;SrbF{uqP5e@K|FRNB_^A&u*sACH+#L~t(Qme9V9G5tm19* +z&gvHJ#%c7tH;FDM({wz^3i2T&TBF2-rtH=GluVv4$q;Es+z5PeW1Us}D4`_o{YYT* +zN)2TuyK8mFcU7_|C3ZyWD577%i$Q1L|7ZQwI(_&ksbUv)h5fU4_=d5$MRm-`R^3D?nqUz)>x?0r#;?so +z<}oHAD`FZM0@MDv@xRe|{qh0HY_+Wjp~w`xDje2Mf8J9pUjRyuO+O)E@n^YV1nq +z?F+!Ff3+6+&(FW=bJP9LS1|v&>HeqvX!T*~{-@LV^Zw_L_>}K|&guTA^HA=8IxDM> +z(fq6P?fRqdzsCKKHUMLO{oKF$Iltkir_%PT@ULjJG1xuJP-2*+XCFr6vf;@fvy4uv +zL{im95@6>V4}hW%duK&R6>QC)DrhmDP@Kv1u&18#<%x>PK{B(B%z@F&p?zQ~_{5;# +z=Gh2(gkjydj?*VgRSsv(BkO9(xnQvF&%g7FSjv3)G&+m6_8L3vU)Hd`l4pz5f7=JN +zG{NE`a^zwT1f0iOCqTBn)+$09TOgl`*E<$u6G+|iTZTzF$)+Gd&=ghNBkB7b?AKB8 +zac4jQO}GbiTx;IMwZP%B_-sRadeU1qV-v4OOUpqO<_eXq0U3ZA&}_7@V_A?bidIk= +zbEV=zr~rgX?^RAHu +zrCQE8j@aB+*D2=CB{Y|d{e(;Q6RRlxDwRC#CHd|&;*$5RdH{Dh$+t~Ot6Whexf-+$ +z77gkxfaZ4cy?y1l&}6j}paaPg!kOl5FNFc`Yc3`oRm5+k1T)BwLMYERNuvCa0~$?? +z*MX%05sBPGu>xI4MZi(_D-vi%#EA{PgP~qDy-J1&=E`AKISbw^z@BZ9t(35h^hB&R +z?l(;JqRB~g7Aw7OX4y>{p;qh&l_413Uf?@2aKh=39vG4!!meY_g$p39Fv+#G#}+ja +zv3XXT48GJV%Fu3`Bxlz&q$O^*iYkqPg@Hm(VAD=eM2d=RgjRXOYabBG=q?PB+6y+` +zYA~SwFh)!a{mR13OMQyB&4iNd~ucGx3e3x4{R)n0y1>jN|KDTH-uv7sgO45Vaf62nyRUv_UonglnO`9~!cE9o@&eR)Nxt*u0L4w@RNQ#(*e1 +z3j!kw!6BOT1Ei9w@9M^-7@p(~*nO_SvXFI8URPB;?2&zn +z=0Xuz2K@m|0#RNA+S=EbL2DbOA$ +zvn?!vk6xy*%I +zra!#7A?3@h8|n|emd}CXAiH)NEZ?AX0!) +zWCSGm^_~kyX^1ht${oSdBHw0m=sMKk4Ni|nTnBH{Yw}OY9NaZD$Y8CyT)R-VuBK2k +zfTtww85e}x+Ei>Gm9sS8=#?RaDY=_Ro8i-W{hpyoSoROG+Tal+c +zlS{P#{H@B!Qa$JHDA7&TGo5q{DKrQ)UIxtax03DY2d|qf1_G;mYllI10U5iDt|G77 +zh-j*^)DE5ojlHd3=w{?NXemP)sULI`Fhy&}s_k~6t)FYwl%_!ix6Gw^IS +zv9WN`hPLFlC9sIcULImlJob)Jk7Sn5?PpcCW!jEY6*8u5%=6ptBuec-*)0GG?T@b; +zMZVOgn5i%jr`K!{+u#KYsazPo9U{st{JOfJ+@Hyfca@Q|ing3v8%g1n(`UhZO%~1_ +zyvN<9?=%9tlx3<_xi?2MP=n~873f?woe1EbTAdc+pAFp&Y4%o*3 +zs^nrvxg2D`22ZlffzpqPkx?OL_!>{NUH@IShJWT{8}};c7!A#Sihf?o2uJlxKuW%i +z#_;LWN8yshY)Z7p0$TWFn0+rjYX*ZXT`2e>gp^%?{n*Fc0XS^y6J*%l9B#mar<>Rc +zerwUUP>jn*<0)!n^ufW%aUT3PpxOD8C(xh9`O~MJaLFAIwn-TJ767*2F=A4KnKp~k +z#)EGau6cIk;X6epgAC1YOqfo30=Q(TusXLa+JeC+Ea{kQ5{B8k7%&~tsexN-G;YvR +zo?$qz38E-@-;pW22{}ocIch{=_YJglm1-f$@fq#)W{^Q$n2+=<7Q<#gTvn00ov@DppHn +zrwXS9T8YHw!IB4w>!F-GgHSTA=R9Iepba2ovbm}upGu2iz%rT6t#*_a-QtY+O`M{U +zZ7i&kKEHuo;JM_4GOT2^%=SXND?$~0qd&G^M#$A~ETTBIZ62q8+J^l<|G82A|L4d5 +zYCn8bmjB!BKjr^F;!`32bNsJ|YpeiReYnzj6oB;KdAQ!L2mnx40DQUpZ<&aZq<>zL +z{m<{+o9V?rTd=pB?}3^#$VP6Q?;ZU=Fc|Qz^%Q8i&!dMfAhu?n`f&KPS%Mb?#HyrD +zOFEvQn$7OfGdg&o4s^g$#a4KGR@I)LM*zRxEGVh&=AJy$YKMMj(b*K*8e+ujlceC8 +zF_MPm-Eyx&yLuaiiLI6WOs2vH@rA7P|MP)mX43y*a`MmD|2}&3@X@0`>Hojze^R*klugg>h5>$x2%k +z5*yy%SsmO*ixboaR|S!Ao}vA(_Xr2)J*!kMLpe{myu0)42HkQry&~}QZZUc0-hjPl +zDRlwuSAph4eF;vcTAbq3MnBZ_*%fQUMxSoH+yL;C-q4S+z|xhXWnz)A%V}=pASK_M +zX7FIB9ZSa399E`?&)7R|XbS{wM|WrL^~YI0iHDeq!g*%ss0tQON?<66_Emx*N-Me! +zC%_rM8O0Ic%L(58lcj5%x@wXJ)OotOipg-{Td;058{#Pq50}~%G4dz9e0p-z6gg)B +z3xu<#%nTUm2x*mNG8(3)HJ_bO&8cM;kq%1rFe8Pjwbl$;ZC#UOWNPgRW>HWLx79m@ +z_tcq`P};Dcd5|`-h!(C14Xgp@OH{1Yrp(YS`mxkDNsM$A!;;L;*Q1VFk4elI6SqOz +zXJXp;8H+@((f(1z4Ux<@$_J~}3b{-)7|`CsR66=Y~&x{=DIruzLK@#%SW0 +zonm-*w5zf{-+=IGs|5sN)tw5}4&lBcHJ`KiWG?s5qOy2g+(0Zl=uTRuvg3@rG;biY +z2;UG|oaLsuk)_6;kYlp+L(|*_k1nKEo}$uL+8a8RpVDI;i9noIWZHV4kTol<@yH;D#R3~Rs +z&*i9^`rJTH+Bmq))VZ&wRIyb%GBKGMV4qFS=$#pUpVa$(CmWmIzH|m?gx8Y$J;;d?7zfkpP4^Hq%RRmwzppQ +z-t52F+21+(vHN_k0UW9G?)AaZ4$e2c>4YV3!95iDjK#il08IK6lf#N5gw8$Lbkf&i +zf@KU@Bdg_`eC{8_M6tcyN%dRQ(6le)&eY!R8~vbR6%PqSZFV3><7VOm2&W5 +z-j@+34a2#@C-_4RVE9hmV7jPbTPE521ncfvR8Dn`OuQXwVOXLGQnpuQD&U1X9xK%u +zb=B&&xoXB=t=0w?d5UM0JPP&ItTR4*SvN-ARn^4J;}z|P8q2&J-_6FK{t(TA5UKrD +zvrCPIuaeYki(_*dQ7R`w8gY>E+Ty>La3N6`?SZDZ4C6e=aTnmC>l27MB*hqG<(0?EOy^yzv9HzIi`I)TMpiT^KKzDz1ML+1k$^O8|JQ* +z^-2}9Z|uFjLfW++;Se#5#9iQ@q1h#qm`$Gqca-#p=I}NOEkp~!Iu?cvmE_TId>#Sg +zvB5dLHmq`eyIemlCd2A-1H0THIfH|@vfR)vCw;3bH@3@-@w}}rm)qsY*S@;k)Go&& +zVP&~XcV6J=s4jP9m%ExV;D4BcjlKjwv`cA3P)e{q1vcwzCQv=s(=|i|8A4nS?!%w3 +zL{kY*PA0(D$Ayb64wZ3##(jfCd2(jUK)7Mrq2ASuMqEa6+qpZ1Qf~gY?CnoRJY8BE +z!vUlkvNt?!L}LhJ(G8;A2Jahv#U=xl49#YhNrFzh+)*R)(zRXt3+pIEgi()A6{~4!xbAQQn)f4WB65BbKR| +zb*`3<*^L>XPNHFy_AB@+7ov4s)P5??c7yuFj~VnVOCjpSo2JqwedNt+v1T#HQwM>2 +zp%AU)x#ZgzV5trL8x*laouq(o!hwhnA@l#{-kRP{N42(1@3g6W^ +zXp$4_Ey7?x9K&jg26)D6G&0*(ju;q>8iF3?vS^Dd^=NX1E>6)+JlJhk_7?lkhzW^_ +zWk!yqIc$lmWHcQG(jDZ9Kp-9Q#*=w(`Ko%{~Bnr!gvZI71B|L-BAiHlA +zlWVf*$aph~<2FT$t87$%V7ChBv=LH4=@Ptref!AT(5*tpGfm#&WLrP8}oO@FpY +z!F3*qL9REkj_mIXi6r{ci>H$3+(_qP6{$td=ZFqM(HAhKt&kx}sUeo2bs{G9S`|%?yofI;b%YwO40o4(Q-Cf-O1F8ea`k?Wbu9l9pNp`*L;S#e#Q`7rp+!+R9ZO +zcepfU$m>e`Fxb$)HjveX^%S(mvv}+8QAmqulaPkITdGFE<(%DQN+<#-zYdRc8+t6ZVRk=PM;N12DXcKIo;T +zG8y@bES#WM0&F8L1StT{vI1jHz?p&9KqE9vqaaz6xIdlbCM#bJZ`@e0a%4{mcVQK& +zwgifBA#@`cNd+f`xSAB3N@{Fe>NFiqtJWPjImTy$Xg7ULR#{aO>XG4@Q5u&tU{M1L +zd>NdlhSJl?f`G*ea^okuam~jv2j|Qaz)_o3idnN{DRPuYL0t@R^#PIY;RazuU?_!+ +zkuF_WdI-|F)tyh?AWrolPA9;lCh^4Uy~`79@HdRKon+J8=~%F|8Fc&siTdcRqlc4rSnunTuiVmSaNMt0`{TJV|HIc@8=6j6PU0a% +z>a71*V9(=7?QXMSs_49n?IbV%5TM4+h_7^LtHIcJTKJ)9Hj`#`U1Jo!P*al7{)_aS +z7&($g>(Hdn-Or?1L>}x;f`>vWeLBSB^3m{vURyk{vospk6ICqN@kEUI +zC{i+&OH_T)O0a$tE8S)9}?0n#_B7Q*U5YSH}WLDmw|`=eSCM#Ao0C^@4{^=cZD#3FDN +z1B;O;IE%Eyv$l=FZ2Lw5%Bk5gH9JOeIP7>TwYF_;q&##m3lExMUSFQaip$g50|4<9 +zdgD$VM{h$T5TqsAZ1?@Jy` +z%w;khQaDAVi|kqS9tDr{iK#__7}~92M}^D-=n@^{Bo@b2W`HQefK*fFpy>9$O0+`6 +zcGrf58*AWl(aaBR(qRq?s7gu{r}IdChv<2Et^4nY3nD>@$kahZ!xc3`leI0dP^)c= +z0E#QfCKL4hrUgNT7R_i`HO3zpZflc)V015=m{bT=JWjk0+b~*qY^3h!rYr|!G#CIX +zWy4r_3rkC8;M~C`;*-0hEQ=CPXiv1zZe>35%@!(e478PtWtvceqNPr6Hk3u5fb)7p +zTd3tQ^x9<6pOmV}tpKOg7Nv`CLNa5!a|Z=MZ1hiw(h;VF2PBiYSV7DTGHPu&`5XeJL$)hq&3_U+Q57unNpJtqIg~K!IYyJJqHFl5XgxxSwa>n1a)&2UFPdIe +zdFSCfSF1#n$=AuvHsx)Xba>;s@*OPS@ho_S8sA{SOSZr5P-V%b4UQF`;1(AUt6JaW +zsJB?!J*!=tks&j*~SB0I@ovqzNZ?jcH;Dt!Ae=_hDu@%L$*7Z&#q!yKPX +zJ~n`hQD$65&8S2>z=$;CP>#UnYCoY|!@(2=7%^`=M1n5Isk)4Hm;(x?!W;))z3>id +zxA@DLP8hS@^Nu;gDr|Q1PAgwBB6wYiq0zwzW_H|LI*XuL+jOL^eNv1M*guC!*mNv~ +ze!%{uKuM-km%y|L-vn>j>{1^$n-4KNEJ{~Dd|^j +zV*pFOctG4@oAt;g4#D73=y0o5bK2%vx3rB8qg+u1deNd2Nr}Q$oV7zRxx1214^w_y +zS|`I`JF3Q6fNX^F0imn{+TJ}M>FA~2I(wj$Ol +zQbYBWS#Sju(Kp{3%xW3T8Eaok)Rp0sc7P(Xc@2RDqGJ(Dd?0asiEU^g34AatUzv<` +z?HQFjVW}Rh5MQ;J-Bhuc{GF8RlMNozrOZ;GNGO-xs{#9sW%Ott +z=z4d1o0PU_tS@>PRVV$LJ&N7h;a&!u%#vK~;#O{Nd5X>lKtf$cU7xb3MNRzx!etQQ +zeGKY`@H(|RAe^_46-0;Rg6xcupl_PE8JiPF99z12>zaJEVxLu_bFF>8a6tO-FS(NF +zW4^*R-#qhXV%2%k?{nm3%5|xC7jOWxT_4V9qhgT2(-}M3HSSkBaB&wV5Tp#hjB==f +zf$TA~e7!Q=2SDAOugdQXvO}+ebG5x57Eiv0lvKg|>d<=30^21J2}_hmnA!z`?2Ik1mlInCbmVbesfvGB4Ybhq-s0umMmU4ci6vYr84&{}_xsb)bV!*t_!7Xf +zHTE=7KAv%O@IL_8YVgh8eIm(n{#H=|6Sj#@&zftNO#VIlZ}y&b57)h?9K+D)|7b_i +zbf0)rETK~^wT6MBe1|N>KT3o?+bfBX6xG2G-lV$(S1EuU3f`v_>f}vlxM|DW*Y6O; +z95=nGLZ{V=X3!N59h2NXmf9(4O_j5nrh#kP>u*JQHLY;WAC;#HB-x;5W{6N;Iddr!k8GVN_$CkMWy>I{;!&Vr(QMRjV%e?s9_Ca_6%6Rv?6?JRn3tVuC;eHn +zI99nq8uw3Wwiv(aX&Ij-Z<2b6p%{u>cn9H4d2P~<5*K`Hx6B!gspecQ))aU~HD$^n +z8YK}N+nrd+YA({SnUE&AFZtZhpime2ZD1J(eB{5{F%TF4G0xfoIor@;& +zuQ3EfCfb^b%Ci@Hv&c-fb@p2H0wIZzW*&dKS3VQ69roN^m*Qn!QzSv)WUYID$5MTmFDDwc+S$LY2zuHGd1{WW8s_czhD0T +z`_l#7`tjQ8cX&l_MRcL~u*coKxkv2|w!jqSbQqmcB9=&?>&zWGA(sO1Vt4E1(cFA% +zDfsu*dGQgQ(M=CfBggz$z^pEO(^{pT4i+dBTVtuciu8vKjgf!jfm{XS;S?>8CqP39 +zHj=~eo;Rcy2ZwuG$2!~@buu(zHu2!v**|`9xVPKg$LHn0#D=uH}I!yjIXL9+ecDX)P +z+ZOjDNfLTPgtyblsA$ShtWdTU#l+Hey$&9E`a^mt>Xh~>1Jv_T1bb|6ab(su`bJMAr6&js@-sY&l7-e}8 +znu>D3FKdr4?Ui-AevBtTs&Y#W^4Y!lR6ms4%q34qHnDo7LR-khE)u;br%)iJAoeV(rA9_R2S>s_Sx9U99s-x|#po6j1v58xiZtIBfm1^6HJ!~%MfS4=4 +zBgFupmX89N;F$*k)GO;cxuW6~`PY)PaBGfKDY>N=PXY_9Xf=sUMq;sy7t)T|cn0!sVcJ=mdI76uIlG#|jC_hNaE~lNMWlQS +zc>du7?|RQ~H}}VBvCmdhcVnZ~hjb~z3GtK>D*)^fxly%OSKZr9xm&OfSxRtU$|NC4 +zb2UBKaA3g4)$;g;vHU6N>HHb?H8euLZ(M@+H!Oi`)$HklX$>lHE%(~?(8-2bW$?(V +zrD2YCUceO6;^)Epak@J^U#PtPtzn4RxYmjD@lBsDJZ4>TsE?||D>olD(Q01^HXQu+ +zj&W@!t91xGLBi1B4+X%=Rdnm%SB&LU<1ju8IM(Z1MMm9TosbJ4W88+mgk6|8$H^@eYW)a{mfnomyz4t|xVFgNlL +zzNu#z1wuW=@A6!M)i>Mn97G9u3g7fIiqEN^(=T~vI%4`k0W;(&edp(FQ-J?|;zXu4 +zN83kajZI>V>Py8Q7t_k@RZa +zuOw$qp_8)cju>!Sg)JuZ#gJ7%NINQ6lqGXIm|48{Gv9Gy>9L_$tCWFitZlx +zcqnOQ95V8+4%Yoo_|(ULr&;(K;oonF|GxI^KgR9d&q@X77&i~#%aMve8<*{OyVeT+D} +zd)`#ZyPE;!3D3`^P`HdBj=2JHgQyaU86YP(zXU!rniTmuFqx7p9)A$MaaN4D~$%85_tl +zOsY(`WXM7Yl(#BpFxtYYku1l{%sDHTeZjn?abqP~5saOgBP4XiDS&^3YCOl7(LJHu +zfmXB9UUr$fZSs`F80IC$V4Rl<$}o!t!D)m!Pl3Eg6wL_4ly8~=Ff7EJVVy~g(DL9c +z%LdDml}6(KLFPRuCA|59+_t>!B};)^ENP^*HVw>m +z=fC&1etEWYd_*@vfB}?f1s{L_UqGP0Bp*BtI*;x9A$&eJhtJ4pwDhK7*T$HkDxtPj +zato8d%{AJ=lP9WTXhp_Egc)a-okr12C0|1047unA+BjoYzeXCea}+-fSsCmAz>M`r9w6+maF +zc4sLI4OW8VRL9_Syv(39}?F$u7Ft>ilrL_SG);Qbx^8t`rGRG9VO +zN@YZD`6QMllv0#r7#=%OEL>pI`y59r-Jy;wVj&o|@*|T(MMcx96i9{)Cr@YeRwnD6 +zGL|6AycBN{+R923=oRK9RIAWnY-+8BhP{^@!!oH6g{YGsDT~vR*EMPe57K6!3%X`~ +zZE;TFK8bN(^mg?f_9v3m%)&5RID;iZC%Q405szskv({OVxyK4#j*DE#r$kQY0sBWG +zEW|o>a?nDCrRm2O%t_?0f&Bi7kpNcMjfhu}2^v10ZGq;D9K%5Z=#)h{s=VRV6+5+Z +zU8Y8uITQ#_ef?(#2fN*^{R#kvG6g3y0POC({86W@tN>$3Krk+WQCg>&)z11}y-$`P +zY2yG3rif?nq3i;(7V;%0#%(;FWMkw~V%mW~0*B0`32C%XDPgn-XHXanGWa>UOo&HX +zv2U8F5;xtbK>|wFS|qvXd~GbSw=V1rYpLb(6I%FaEY=u82g%(>GHcOSK=3xf*YV#u +z2{_`;#}LbSvAwjZjr?v23E-&$&Xi2HC7uBuH!!GyHZY$x^SI{(3@!riH^~|w4fEyT +zMKXcuIm?i>91anP!)7}xApDwNz%bj$8zYDlkp9z@vP5C~x;Mb1# +z@3M04J-^x3N5#jTL10!=d-ka%O@^|b-gKVQSV>c4jPsHF8GO;pjKEfbBqpfurqmDx +zr+TKcIx>VHvz&{1rnCi@a_CiExQ>CkBDq_zSE(U>y=-j09hQ8pnc7h(CyV0YPBdt# +z<12Gm31EtGdzkHph{KNHvTh_n811nff_CCzacD+WZ6Ul(_7S^?IkXd^;qNg-gr$QP +zyg%pxm5culLejy>2b|PS0o#Z;Hd;6@Sc}l&GkAyR7TtCtC41i8dj6{WS6YJ{WdxWc +zQsEE~9i2)(iYnP)97^SQXh~LK;!^-e0?kdWhT7WnS{5itE%DS=xUUGGp!Wm{ZcGtk +z<%rH`k)^Q{f8@%6e{FSdloGg)NZF_>VnO(S1~M#x&u;712xQC3!01| +z&*Ds;cqQoghP>mgGsH4Pxvyx&0{}rq$elplwxCgF3oVxke{7S?xG+aTGtiVhS+Z_G +zpb#cr&T(8&488rGW;WadzzPih$?#>ZO@DM~ZeUn^ceqHJH7Twf=oxN7jpm6JZD{6b +z?Sargyq6t7GsazRb@t$WUnPzyqBodx;C*H?4V?sIF*uBI&b}a%hK9A`r8VIE_LPQ} +z<23`41oL^9Xdz7NZoqr?253v +z&nS1Hze|h-w~os*QaUe+?ctR-K0-|y1Pd1YeFZ~p%cu!&b)m)0pyPNF;WQ=hD239<7@Wlz%gafo^+!7m +zSqlF?F^yTWT^g0sb6`vOrOZhyRG!*NIzGEgC3sg?OVWi*}TIu +zYxhnmXP9iJd^#Fw#rS)KwO}Q#3bYP@hePpQBF?9X*uecF1-99F!?R7?c+fm1u^OH| +z*%YN3{-Es!uNF7;F2PD3e~y6Tr;&8v*;9{0R$EufI|muN +z%6yo@ymCT8D3lZ~7l|p=;IZ+}v-U*kRDdbsxpIQM=^3;|mPwSJ!QSrtH%u9&-o%A^ +zrz&#vX6E>zb;r-Ko^PNGXS$=qz8$$-uoc??8aC|n8^Q0XbH@^zd> +zl!!|sC#67g(9chbWFM}dg|0SJa?eB!HwO1cfWcYAqMDGGS(Mb~)YU{OI^+ryv<=mP +zpa$y4jaO4b$}E~*J=>~E*&G)*8Cu+nn649QIa^N6@DD%C3>4q%0m1@>>N5ypaRp$nYez2+l5tTKY|G +zPv!i8^~g% +z72+$|FxYe=;Mv%rWa7$qvgzDi1HB)reXV3=G@Y`Bh(+M>=_HQrj`4fVyeM@A3&&L0 +zb%rEFoW#s?&B8$5#`68VV%Oo9Y&eM2l6Zo(ygoOt^$78`%rTVUm-L(oAl}R1b3$Zo +zrbFy%B-o?cW!;d)@{RDAJDXTpI$hc#vagVB?1(Xa0-UjgI=bDpc_V6?fI9nFK|EJ0 +z;r8{3)z{xDdz+t6lJuj!S#3(fU^dhdJBeFKimayD@|4{BBEryPCYz{z!X}#n1h8Fo +z=9XuzebTbHS#%1Cm+>Q-1EDa^6M!OlrQogE10JZ1-*_g^B;BgNO^uHh;r?`Q=A3u} +zx|W%kcqrWD5LW@kwL^m7pQDVSh^R|R-60AuO>Bh9c``Z|K2NEJ$m{f7jfYSN+q}PN +z5oj}4xTR@s$gdL$HvRD^N+)r%W8O@9){zzv5umOyB@pKOW^!OE>>Y^unpB@NNt7x7#ccTGJ^(vp~K +zF`jC-t23cE$4m{{2FEeVaqBK^THLQ{9xpQ^>zHx-;cYS_1zdp`rEYrl_-x)X{%En3 +zE;~t3NTowWxmFEA>H%B%)9^a12n0dU7h1?AAzZ0B2v~6>UeFadswb!gkK9YxPhUZk +zB}gr*-OH-TfvM0#K8?|gg3w)U2aD}#s9mD0Hn)32AiMY&wS{N>tbx`*CLD(1E{v(F +z;cVbBdtKT*$^WdXi7n#MI78!Am0`O{{yhcJs*JmT5?Ud{z7u}8`?`}i(skf>) +z9*Zeb&u(C4@6{gpS^-mie&eLt(#nQMDv6ZVkR$7!Q#yDX@-1Z@!y1cEt*lTf(pYDr +zu0-Wsy2`VKR=)5aIK`mh_FqIvi_@eG_tH&UZ>Uc{QpH9rCR! +zT|`8DXi=CDbzsS6<71w~C11*w5vu&G3!@FbhiG~?bExbRYdW$nRCWwWPOU8mJEzzK +zznU?XqeV4#a%D&qX|hJW4!a2-vi+MpiZe+%VVhsGGQL +z-@>MbN|(=02b7&(U|kNYQx$4qrCXlC`o>A@MaDC(P|G~j2qVW~YUHuUN;u3I4qrmz +zSW=qCXu7CDoPtLsL{i9`nrsXz|3g}deU|o`xslS%8A=-dMWyiy@;JY6!(&%90wb8z +zh4V?#45eC5U6R6c!1GZ(&&+7zv>LWm$^)d)*wO`is3htAO6X_Jhq_*`!fzT9&tfSw +zpO6?9qPaJr>W&_a^VYhe)cH*`I2R7;<7J8mnRV?>q8yqB<5&nAP_;H1TUY6XM}V@5 +zB8{(Sj%qo8i3PHV_pszEhWje?`-Owrbi#XIa?hLk~se(ZCiESY0h1wGQ${WWbAJMaKq|YdvM7!A-70*79LJHpyn_nfU#qAT{ft{!e!SDPw|zJ%oBpcZPaVy9>-f4_*1fL(RvNyWo(;88WzePPlAef4iqN~m=V9JK52a|J)LcB^-=M3 +zWGSUBTMSjTE$}{mCA$~T5=CWzY{jyg@L9~x_UfA2%mWo}g6Z=p*BHv{A +zILqGg28&0>2n!E*HmkyOqNvKAWYIH1KK`hSI0>+0l1R4ih?g6krvT&%X63*?`vF;%E$nqUt6`2VU_kgYB~bUPNibL1?o%X1BB-?a#Xu +zo`o5YYp7lXI@xDwLvJzrYByN|&zDZPyb>B>Y~vn$Y`RDJjDbJ+IAh#&V%3eie16pr +z-aE_wDTB|ohc}MjP>>r(ZQb=x(-XAC?8y;ioiC0D$%hKB61++Hz?33Eg!@N4$pT8l +zB(_h2i$pv=XuT#0GVc?~DD=U0StKy3GQR#GY6ONM^hHa}9-@6P7x~;Z`uc%PzKj6) +zA$VHFQBo|S{bQ3hL#|z2iBH@fqdYj7CPTR*JBctY(FCY@oa0HEXOn_`3(^?FWjPr& +z0x`I8rNO!(q5Y!Dt8T4qqLPvrfkK2U%H(m9q^OaUhLtiO4hlEd`v-u6W-o0uYtHJT +z8BHTu`Vg*IlULKt5q9$fo@zE_Q@<^hS7Nh1#}hIY7NrBBA$B`adVu%E!g8<`yjO3O +z8;4TgYu6ovKm}eh5X!K9DdG@3TWY@(+KWL)2f->1rg*ELhU6EZjf-($zGl$f4OO?j +zf?Jf;r+kt4fr6E31Z5N2Nz7>!ov}Mk5bHsMS2MH|otYE4v>_#=Y~2#yw8-uTP +z_pMd-*V#+zl~@;)RFLj^D^}aPKrzQ+<-M9Vf>*wzq{Z`HAU+rlhRQ^_33p*9<8#R$ +zQxUn{@Z&{1?>>9;GQ4+>c{oCp&vFRUX#lGjz)zNqdy;c(57F_XW1lAN&ZKO>G%KIi +zf0h6LP4OSjzd{?c<3Fr+I%^Nh@gLfM#((%DKIQli=M?{;y=vk=tOo71b@>14M9q(pd}I->$EHx88nK!2oa&IFfIe2<$~^GRAx+q!PbXG$=ce&H%_zIgn0r +z;ziQg-FbFHAf0G>g~M@!-Ap5SX5d3PqKJ)MikC9fkxy0fq0})tlH3GRgWU8T%?wNg +zddwts;j6U`9x7w4wo7T!RP&vto0G^k{cnpCO6r)!mLdtNK!W-j$QZHu88?#9+F+CEua6j#lO!-`TSwG~pzsi+fZF*!iv; +zmr!3(#}=Mp2gahP^Fl_`w`?UXNH;i?by@N{)7Yu#X0WI!b5uX>I>THsQr*E_{)pXN>A}OaROXz8{*7j@dMBQ>KlS^(d?FTX +zH(!w3r|-~xn-qN2F}g1&7#rQ#{hKv)qId98&R53DwzieBjMuj6I%JqTD3~%mEclKC +zyHHl=HKe={GI{IGvSD^ZIm28>}^1W*h9xExps){>pV@Wu(IFG~t{Dzaf$u2ihS#N;3Xe3HFR +z6+{i>^?r4-m7$;QM5m>W$7;0_pv_TE#sN+Wfp}~!qLo4bV=vEBcItRs!(EjR@uZ9p +zYnoriIH~5fxGouDL)i%(j$KZ&VNL25$G01Y=5y914p_aRjG5G~^uo_CNfqS29}^2u +zfKj~j5{s;P2UaO30sFh(=Wh8aUYxvp@wgf28NPLp{4Wcaf>r-AP5K}49+i^Ioxr&; +z2+%2aYj~DT;3OK6$>-j|^EbO&t+j<_a7f}Lh=_x;_!8=FV8vi-Fi3KkmY?H%hyf(p +z-+#Zh96G^Mlv{GAN_&?y?aS{<8eREZ?vQM*2FB7uZ=0%SBK~t?d?;L=xub8T6$`Jg +zyRaTCg~dX9oPYI;sHJEZ5G{&kFdD~cj-9$uN;uKsgIB- +z65H(SJsGlg!se(#Pl6Nw9uPqc;ULE-DKv2Czq2@;3~PEtm-ZEFGvq&0$3J8UO-=34 +z7O(?Rj_gkz12I7%F+@QB&&+nwjNT64VN}b;aA_K@bl!0^>9^B&^M4F|>J}fU!twp58 +z#pH*<(ozzjXXcQQ2ECzQm)thW!-iTI7`k$)f71&`NAA;U=(FKERnBAp%#mwd4Itql +zp4XT#8!?j#;lPZo)%u{v_CaRj=CMJo(%9BivTbKY;B2#5SYJ=O6u4>2+Gj*zscS)l_d+NU7p$e^O#=w5w+ae_ +z8kLi!wvEgt%n{~pLem!&B#c6nv7Zd$f5K-Cv|$m#w&6SiKm +zNfAbeo5@ngo*jpXet@^ARoy8ATsqBBz`hk&VtUrG=-*u@&xkBAtlXR6jZPgV%!9Vgu +zbR12km(w|`kow?b{-)AZF~rSg9H~$w-W=(uP*mnLxoUXTwJQBW!Y=?`O6nv+7p2EFhV+`X +z=4?{aT;11&4Q{>c8fh7`XEL +z`rVG;(w;tfLa#OJ*~i#8=jfLn^$Smnq++yaeUpmqF=B;h-DI6y16lF4N^arInn5R` +z&4_g2t~X~^;mb+dZIwTRa#@SCo`qIK8ztdb;*J5~C+{FA)7wGu5_nKmM(9!TR`vRw +znmn1e1{C|j!2?XT?d$`Z5DbOm7Vt6J{;#dBcPdQ(?#%xgtN)Q>@{hl24gRr*!OvTV`{d9L2g!9d +zMP>%$Go#vo)l`)B2R(++ubeZtH1A=Un|K_|E3Rf9dx5kKJAoycaPReY_MdluY4Z2| +z?$7qmm)r7X@8Ee?zIOk@iNomb(HvkBt_6?ng&^vqAp##rP-W}+bE$mv=9z-{W>>yF +z-}%Y3BHvyg{4C$z?C;69-R{2ncB~)Cm+gc7?Jf0mduvz0-k+OWsf_6_PHQv|sBpmp +zZNpBscE$`y<`jju~Ks#c0A( +zLjy~P(L{oqq$DRslQTC9{CSp%P`}1KrcI`0gOTJ!| +zphb&73)4uN!O_mk-t!k|MvIznOw>pL%JNVuKBvW41!in+8K~bui`$2i)9?PO!)9Mny;EFLsBH5H1_vtf)gyR7go|Pc<1^FmerAk$ +z#;gtT&>)!qCSMQco59$$UoP=0-Bkdz8~Vp~K;s%C7A!Q)O^^6D1}Z2U=PLz+I~r}L +zr^VW}0R +z$g6LtGovBj1f4IyBOrym5DIxU9rUd9)oo$^F&T?0%(mw;6RQEZHeKcpms5{>6>2R< +z2N_kW_MScCZ~bAcjxmGKN<)kGfr6mgn4JPuPtH8g7b_r*nt;AN>AK5m_NEwBSC7NB +zjiWWA8$&XSgHGsLl)rMCqCnX{pJK>=zS9*sPEJBT?wabbq@|Uu$)g#o3Fe7t&@4z~ +zc{-2Y>>k7E6sp$Cp!G>B{pG7nufJkvQ8!Mual;_JWb23S55ZY9IYC?!{WQ-ls}xZ* +zM10H5#kUOVK3QASGWGTD+ulCd-R*84D@LP!cUxzyIy0_5Qn% +zUc2eT{PalPtvohDNzMRl3q$uV>AhBCy-!vX%u5*4b=QJ{fG(l&^L&wIoCDs0p-ye< +z?jv22yxrIpD=m=PNakdq@yb01kqOE!qDd$tvkb(&TXCR!{%qCoOXjy|{fF_9QvbZ* +z)hf}R)5O1ncaL&&m0<{vvJ)R>(E#i7sIc7czY95QF!Stq0`UQjZ{$F(=#H>&Gdh&t +zt$!zEcTbICyOUv@HuCVR^;hwZx0*qr(9Cy}93d>|yyIhMR$8-0r5-utu`Pm%+d;bz +z&}t7DjM2D~KO(Ox4A*7fSqXEuaql*4gN6Xqc^*Zzz1PR{K&9394v%nL&qr~DIL$+0 +z$%YM8L_mNg#9siLnX5FO=eIoyM2=L|@dZDo|r}!9iaY=?q&iyMbC+ZM7oS8RlKfi+_!3^2Zd_lm1HlVN(Jw(pl2^F#*}Ozj5o42t4Dp437mDj_;jt! +z5e|BSDe`1~lVtOGYoFdXFrY&fuVlIrV*rAD#x*$D63FesBLf)i50gO(0T +z=pHH{BIr5}Z?dXo-x6C=0Y#$dS`y(?lQ0tbU2(+(d?J~`LXI+CtYIK!XTmcS5e2wo}Zl)DD +zwRah7Ye?0}YK2OEWq)0bWcM@2z-yzhMyay2_5E~ +z92T?-|9O;CT31S#PB+;2Dt`0}>%4(AOSiqN9=rF7%8 +zsx0`IFlcd{s4x17p953}1%Pu_=?!6b3sM-E>uWdWnIc +zY{3*5^cay~#bYgU8Bgzba?dOX5lCdSIH~Rl!xla8%Hwb$D&Yh(75_I*ko;B^I654%p-! +z@Oh{WYiUiqW41x+)=j+^mx9iQvxcgKT0f`4(vr#(?sc3?$<_#6hy&}eq;kmRHZYGg +zIa#6LHSeGKzHnJu{7*h2){GY^ynWDA4%rk^qxP%S4qO+k8@nigSkUCMRf#3q>a@zn +zSdp}Dlo9bpXFRyFH0ih7SKYy&$#1&i>A^J`?%1w}Dl%dOjWx +zUU|W*v5rFX|6FiHGS)ege<2i-U>^D$)rAaFVKKxh=INwsJmAR`c#;_X(!Q!k_ +z=9kF1^1o{QeKrYdf*kTOr77x2e$6JT`mIEe4GgdCHN<U7(=hg?;GdDH!6=eYM`YiIY(VOJq(zATq?id52r3n3XBo+Q=lYjOSo5lZ;0{4OgL +z5maNC<*_W2Vz33|@4rK9N~8XR(>=g-`g!zbd%Jsd^nc6IVW$1(A7cOCdHiVY(VzaG +z|Dum)|9MXKpPlx1(d`XDTfr9W*DK(`@&xVOJ1!5p2mowBqyneIYI!v-= +z@N5$O12emv7sYseW##hna(T#w>XQgqY6NBRkCai_lIlQ`wtE5naxF;FdeXNlRbhu+ +zV^Cl>Pu+0A$QS(7Jv`bu*q@un@xz{(cixKmf_}T)nXjtd+kdk+_h_~4xx9*{!`!?X +zd}BMr7+4QmuqNM@X3_<|_2&4;gTtd>ZvJpN*oh~=2@I1_-ao$vmS#ElaTyr%;6-va +zjT1^X`ylvvIoOVean8;baFR?ulJGd5#Him-FpOj$jRhO;pTv3pDYU;3T3VbrZ1!m9 +z<^I+&P{X+P3RQq?*FuNc(8AmXuBos`(i242_57j +zpIn$uv{7ncItss93!ZYH19s|F2QelzQZk6$=3jTZyU*ub#ONL#9=_S1>-Z1(5_fLR +zf4Kf#=hjvtAHKyK*^6 +zpxDVU>wnBK#%W4-3c#zc45olzz_a5 +za~`@K?;;UW9;P1JNl4>459=iB=$wal?CLrPi03?2@lWRF9=k7eqjTSSaDF`OZatry +z`|h4lDv-NI(~p{u(N;M +zeJLPzxbTLF>BxNh$cfCqa*xi7*E=@vFJZ7Rse)`1!q(u_Y%_K_qN?Jq@-wV5r+k^Wk}s{H?bhWU0Pb#ea5vZN~ihAe0jCb0HuVxkX*;G{(=OuFH0U +z74?g;z1m*eRGxAi*R|c&-#Ya}P|@$c5+oIK^mdRO5+x!1t$EFEja(Mdw(ASg|LlcT +z(OExxb(O7O9RR~`4dc{;CQse&WG5f6)a_=&P;ot&yKEICEpyVi8p|E_iFxlps649b +zXH%bzs{WW(bk=%m784y9EULDR6piVseOP&?38qB7&1q#aMpT}lD!Y4q0?O&A_*_rz3!o|qC({|<)R)_K1x?lJXQhu!*mP1R +z%I?NGP0e{)18ElhIGM4&sI{owZX)VbGZ0w4mLt@RdSUMk(m~y@JCKz_x!`Urkg^@G +zCx7Zd$TFK$61a~BIV-v{VWhXwg(VL|?tups{oEXePK1=cd;pRo*X^;<5(d(`EK +z@{SdE)}r7$&Hy!Ku^07-b*qE5>oE2#*C>nDpLq@OxC;pW6;CGE-x_JA8lXo;;Y+1x +zYyrY~s073MEK-xj69r{(hqI<+Ln9W0PA{lo)U{RifmLDwY3WQKaO;~@?q@n$udUp2 +zhDxBXYj;ZB(uuH%(Rgc@uCk80jVm1!a!RnPW6N@Nbo^q)rGVt|e+7iH5 +zlxauEIZsK3FW&4Q`${r-{LI&qVYA)WzLpH0c8_0gy*cXoYBG9*RrcQO&V5_4-e+a? +z2)?^Kk0c|lx5Oh5M&scyN@L)Z-DR#qX);@$p|!D!Qo7_Bl%$FlkePioKKOzctEbfI +zL3-HJ8m6N{cO}%0t5t1}D(x35=Wy0OFRrqaG$qeQ6#VgYI^@WY`BwqF;s!%u8(++I +ztxiHV`fXvpYFkq*=fAjpN_o!}l+5AXDpuIzw5jI5^4V8O|ZG8=W2t9ay)zfg! +z=WhjIxi8vvC6Vs4=t<=hzahtcUlM@oJbu_Qoybo|?Dp!bX_;A>vl)3c9Y*;k2#!YH +zhs2Q}D3y6Ffc>3aznV$kGP7y9Bq$A>81)-RPHOv7hqE-kxyJ|lr8#rLuva$xWV3`3 +zo|8}>&i#5%w#rd44_D+H9-M(3V&oR7v)k(?wjC)YxB=umXYzTFBN10ncbeLv9fdICLXGJtla +zX20s-7Ntwsa{aSDdDpAzZomPG;NvgtHgY}8K=Ed0o~m4i85}OdJkJ;Byed=O#ekzX +z!TItPsJMZXc5aT5AjV@Y3Oa_6hLh!;|a#Q4H$+daHnJ*}c3I$sV@^RcxPVr9hLirv!_rZJ{ +z{9~4tuS-m~Fc6r;FSJt;a0uQ~z#K_`1q}|%Kq^3B_@-IvCgvCG0NEu4AYOx)qQdB? +zj0Q?seD#6lUlSPgObj)u<_qZ_iNm+*)!hJ!hrSD{UTSV@jCryX=w29)=-psCaJvTSPNm;yoXU3r*B6^!W=N +ziTH(MtuB20bKB`N+zFQkf!c{ZK&V_kJo<>l>9CleS9dV=uFq4hGI +zj`Ix)t=gD|R!A4Yjog&P`eHdyZUaNe))t`d<>#2kDWCKy#K6w;qn*EX-%$iUT@GUx +zO^{Z_!8n>&nT3;HKe33JnN +zEZ;*IuQAAA&e7`f08{AzsXm)TX%P>a0s8#o%HeFE#Z59DNw0%(JjtO#c7ka-ftR|s +zNZ$41Yi)U$XQ#zwG~pcQQJ!c01eO3@wEN@?Db_&A5U`;ECj&s3Kax80AvH9JfxJl| +zUiFFsAY@ZY5D8oytyfd*QMezfz%Usl(h4P1;<01ewVVRmjjx*+<}W$LzcCGNJUtmE +z`8mc$9w4KZoJCPkPdI9TB{15x`D?ZIGo4k!h5zD^5x3~!?o^po#vbV$V_ +z6nlcJF*b`Vukv$@Pj-UyE=D>7oa@LM*93b3r)Y{UBLSL))3NT2m$B&h$8KNjJostndG~oRzjXw^=bORLJI6mByg9~b)rVXA$A1kDUIbhFe+^y%vx_s{ +z{pIyx_vk1%I1G07UhnR7pErY@{q5a1&v*7;2G5}8{=spuyR)}*3}BBBs7V2~(}j93 +z0LWhVaQjDiu=Q+bcjx%8&EUn(@jgO*0bsX+*IS3jJKJw|w+>-v9KJp{>OvQu1K|Cg +z{TFDS)!pmvAH#^CWq2BNe}bRE(T^BA6Pr`^qX10Xq6R-6>^|?p!)IOS9SXAC*#2K} +zgYIta>@|buTYFnCyHxK0;2csx>EX{mcIgqcxCQ?wAsXjq`(Xe05Pss^93LDW>&idx +z9Ce$)*5S?(PRxtL184vz7U~=j7^u15WjHwL*mHoPR|g8=SU^}d{dwNq0$%au5mvXC +z5~kv-e#jEp53~Hg_A|@=pKYJNyp7rR|Bu$z%JKid{q|4$|3Bp8+W+&4lMldm9pwV> +zkg`C1x8C`7y|Y$!0oaB*$=P&bPCGJKg!B2{Z9_nd*?ylO*{1vYiDjx!hhAQ9zRx52 +za)yR`A5Hq_G@kkY{Lgtjyr5$PIYMOIXl_a!<`ZlA>ojj<{{Q?>HtgR&B4MPMWJ5|i +zh^IVRmS$-yO7kQ*jiX`;Oat`*&xn^@jD*yX*-VO1rBAqo1CQ?Gkk=te)Pe`h4+8MP +z;$bOH!^^%wY_Er=zuU*u$zIQu$MKmliN$L7Z9`go9ipe52KMvL{#wU{0gp6@3QOD` +zQ1&;!xK;2m9Dh5%l%77{J$T)fvgynjITkNv+jTl@H)!LG2C5jKoKROu0T^?pxDL=f +z1w)GG!7nQZ=o5Q%4G%{5{u6ivv{yQf`cToh^)!Bg6}u71fVCnp$o~C8sLMLXVO&BV +zr>o^@*?V<#+}(R!dcJeCb$tBSidlr!Ej@j+d$9lVzYvNs&Q{a(dJ9+xWF+y&Hvi(J +zo07Uq_`x{6NG4fIfleq>@d>i_=;(lRMfckr5+x(+1Rzr&j}_;zA*CVo0hg4a9LswK +zV0NHDGWwqqY9$v-aL2zH6@m6zP$VjQo5NsFW0YfgEX%&0j)p6rdG)~cDcZKm%m9sZN +zz4$o}@0>hvksbp1MfC=49hle&Ii3@>JWt{Yo)yoYS;;&pteWtZTg~^%jOm^=+bg%8Z0JXxc~eafN;92j^HoG0iX3%cYs#R}I*-Q@Fsm3H +z=al9DQ8t(YA@`3opA6{p7x|?5m3cfcYd|9)JWnKezUD2tM^UGn~zIRvy8sFSJ?IK3AinlA3bA!`uO^%M!CE3S$7)UhZ5fF=lh!v1Pq!Y^y +zQQzA-e5IgB2xJ0*>aZX*LN;&`N2oHi +znI8#$fGAU(XE~8u6BZ3HqPu*y+(amtKZj^5l(HkIB@)$hgonL)j9?O$wpI-O@c|zO +zuR%zIdAX)jXpkAE5yo#ar;RFE0m7P%3Oa#PIXC}<`$iTFh`GlNyyW67ml04-YJxFj +zMm~WvkKEiSuMMoNx;7Rg^A*0)mS67tN3=`F#RQq0o=H|QKzEP=<}-D+FmJ$7mKO*` +z9>U>i0GuTk$Rh`5SvG*F%1~NWF+s^{5)SYzJ(C^kus<}iIStB{-SA>XV<9DRB?%I+ +z4`1n9cZIn+>v*XS>M94(WS}{Jt8O(Ds1{y2%lKt%H1U=aahI+tVJR-7Yl8HGSWRrM +zA2)rDMq+s&%Bo%Ze0P^4_Yy(LSSyZz@V91qngnJPU29OhGi>Frk)@SXfnabNpS{`H +zecszT>S1G0_l%hAuu`6|%Z6n!3{y*U71n{39$%r7IIN(! +z<+900l@(Et>iCuB=0KE-C#lvNl4~nYV0KziDB6fL+G-+m3VfI0{Ty0tI#ccq>C%#7x%??<3?$Sx`5Z+NE~?@7_qWxktYL6D1^u8vTlNM^VK%Nxp+cPkg}S> +zc245iP0dDmrup=u0?UK$@O0&@-$x(~3E7heYs(!vy763^gcb-m?dQ*v!5~ga52SK3 +ziwhzGp;H8pbr`dboItVzv1@}`^$Acon3!JQK|WrhIS%*bz98>t3=}jP7bN>5YB}nd +zm-}zFdp%OCH1yBK_UdY|6v)rLo&AGDEc0|TSX=E-*ud*!VpE!5UkFDeusf7yk;V=Si=z$eU7<)qNbgTGHR +zPBjL{&Pb=itYrL{LPeJRjOoqb`~`woIywKci$P517v_Vj0RDB~9nH;2nfY(>`OrNP +z={{G^9o)yG=!%@$(eRA649m3~p9*QB$X|SEje7)Dc6O>9Hb4oiyj-^&A2wMU8Fz5* +z@#@#Kl_K4$l{c_&>yW>u{?yxLu*GbeZ}y$62pf-@&|Xlo0N#qCRuH*mK39%l4$Mvj +zZUG7};3Y4sf)Y6BRF%tk0Z7_pn&Krgwm@u;WMLa#S4$nid31q^dw};qw%j@r5hYM( +zK)SLO{3a(bf?=k!tT%8qW>(OGC(|^60h2b}F`%`>o6RM8gkM%ekIsl@)`nM+u2CM< +zgYOCa9tEPz8uU8!&)ABJZ8mMl(RVg{u*@1Ru`C;j4={!-!%)a|<)k%)qVO +z@oP)eRMxxP1nO3bItGH$!Cx`gafEl)xy`!Y<0vFpC>UG=+s_hY6Xya19Fk%(iN2Tz +z((x5FfHL>WFF^c%8q8O`=-?ZCTOS)3rZOAgmVv+dZ~Ic_o&^uXVWc}7({j_AAhKc#=nt5Og5K@Q*t>9BJM1PS|EA6 +zMBSD(Rg`oFKJAZ%ZQfv4S$oxh+LO?_WRO6YsXHcLY!O$=b +znw|MBqKl12Ov3dEs#eHyW-$QPC(tv6lOg>KPNP1uFA3{`s>!Fi{RwBMs8#S+^bo3F +zOVd7ev@*P$G{@mwgR`ZfDR<)}+|;kfoR5J`yB#WNQcs|V4eHZO+)CvcfiEazCx1D$+H7DmCE71n0Tv4-WA+5dkI3#;O_#DPmMe6-ofc{wZC_}+m +zrzdE7$q6_;J7K=yJ&))VZDt!MO=l-H`RFi{$zF}ZWUNiw_L4fz63H-b+y +zhF_|2LglrPsD;2!U(N&t?j`b0@8vdmlj%+9-kP8=uGAf#{~YG1xbB0{g@l6W@i+zs +zG%cXa4E_?~zuZRDKo?NV^a9+A7WmfF$Vg&toVOq@M=k= +z7|b{UEHDw;0OZ0r>VHIpRuICP!OEyA#{1LO;nv~H8yD^Z4XzMct99m^+Q;#{(0?E +zQ8z2PkCrtvsEZlE&3@eX+W00N}@S?9CY7@Wf-1vF<#JeAF&6Bd~SQygObkQ +zv!$k_7mX7(+7Zc)^JlP6q!#1x1(4&`HeT1*L-0V9t?T3zWbLz9@rZ0lh8LP(Bn4;i +zLs^V2h4AQu1NRt@M7%IT)&~giWvZ{vM3N*r6r5nLiIZtTWl!SZ?^6uADsJV3yrdR9 +zL-gI|c)omprY*ckg^eqSii%)M)t$ta_9;>B1u{>|=e5ETjA8r7?)EENSW=Z7fyYcB +z@W+|MA4@WmEMyMZlM!ZA{8XX*+37voIX>FiKXw>2{KJGzJ$Eh^=!hTKT20*pa~-GG);@T3CBfSvZkZy$cQ_W0rI?mfyX!CAZ_^dba)9iZ`0d?rkR +zTT&oTcQP)pZqJX;9aCpzTDE}8zaRt+_Qvosx(2Z=n|#a- +zO}a$c4>)rq>13eBx9_|Jj~}*R<`DuO^|!WRNQ|o6+2DAk)p4B144X;pwcZ*JuI)GMNOqa1!^YlN`le`-CItuqEg)o4_35Md=2a +z&=S)4cyVcA)}D8$|EDZCj}FC+oH|KlG3HgG$mN^ +zz;3;Is#Lt}hu?kGunE@eG_b!T^rcsdh_Kc)B=@Y$$p)A2+7SXQ1q}!-ekLWG6UzpQ +z?1D+#gb+mi;TfpDDm{80D+Gxc?}{u#KTJ5VWeI_l9c9|mJCE7(I6?v-Tr_Je +z@Vb|o1!_RWlSj6AGC^``^P*y1K$1H +zwy?I#!B0GEICP#Qoa;U*6C*WY1V>mHb3CzvC_81!Kr@4G<^L=n8b)L$XWm85ARfy- +zj*zr%nUMzhUx#$vgts}@X@OU_7?wavqVl{z=hGA~+t^T2UvpJ#BqlmYbxM5$>A%!7 +zvsfGq!Pv`;t$6U*w+1m?!27FBM5aTXN2?`mgKn(48*g6!w6*)DJEJSw%l!-cpjy)Q +z1!Di!d-mqV3rv&pH+{dz8OwR2*n43ZO|L-e)9-1|`i#0c +zntq_IGJqnt)*2IKh*rp^0o+mtwR5C^u&k0`Zr~U|MOtpnh`A~*CLIB8HK(k@v)T!> +zr(|w!{+r?HeAR0hJHB0RKRlbawE@;J8#%@m%PAS(X`_*cO%DJE3M)|~GiDHK17g=< +z8=NHt1*1Mon{2?&;SYXYEnN-jfkOwz(1Bu7WCLy=Z)^4XqZmc{3n;y)!f$E&T(nQa +zBO6a;*0k~-Mr6}VTcLCzlU7UFLJC=5)dB#b!JrZGJ!}*%@%5`$B%hv`BCX0Iqv_BT +zS*$EFNG?o~m1-!N)t8_Z0DF*4bn$AiaC9$y53&$CPYH6`hlaENiP> +zp7qmS@93!85sO{6!flv$$=Y|1ZNtT&(cA0o{Ng^8asVSV-QG)(wq&P;X6Tz*dpkNo +z{>=9@+B@3D1a*EuP>oiNq&Wzod%a$ik6^zJf`R#!VOQ=Q1YY6 +z?K)2_@ZM8s0X0bhh3&mI3xRqi6e5ZQJ#_oSC%quFf2h#eZE-m(P`f3JEugGj6=d#4pSBn$dvr=@?xZa>g#MmMcxdbs&-x +zX~2d`Nl6;RYfPVqL{xle$bb*&vg{AEzp`Lj7fghYch#mkJghgVbBy77w*Z23T;yDB +z8bo1dU50llso7 +zsdG8IxMe*QPIbtJHb{E$kc)Ec8Qs1$xp=83bX6DSA9-!WJ8INa9;H;t8#d{AE|a_* +zSfSVJkB8G7|3jy7YTW9ezu2@=jooHHoTGEO;d`XO`r+#)urqK-0v1HUr=X8l$qmd% +zf+lvqQDSJQX;OGoLT=|t&}w^>F6qHYK!l&8xZxP>0+_>V6AYp3!%XGrT;v4RWiBPfwG60^2y8H36zJ59Op8wCm>rM=Whf@lZxhGgLWF_|t>G_srdZ +zx|&g2z^rxf0l40o%XP=jetus|7WJe>e~p=6XQ+$%(U>CBC`I`=D#(RLwB$gL22&Cb +zhBz0UD|wiF&d}QNK4krcu6Zo5013krHUybo{-v| +zIit61u^}^by!U#4YmaqKU4M?0KpnA#I)l?T(A=RqTF5>ksl&vgAq$V9!Df@>iI4nh~Kr0#4U1Jmq0RkKsxyt#ZkIojF0xriyg^8C0oXL%?mog4a3a&Kz +zi09$B><5?SFu(OqI+d|>I5^B~pO(@x%vsliW}+J>%^1xHfQ*6c-XCA1sqp*?yd)>& +zU+6O*ZeW2JsF;ic_6)EZ&$ih+e_#sK~>La +z7nAvNl{K-2`-&%twzM>}^LS94Gl1@qk`;_x(uj6o?#Y*~qpe=g0Wa8?JX)ckBN{N^R^WA6o#0tQJIDHE=p~S +z8@zr43)wUN{fzI}utdkO0a9VsFLPH4KyV5He*P +zl?)F3;gAL1QxPW$Aiu}V3UV#lUAF!m1OPY(`5tl7U)hU3#fV`2M=dmNAsh9aBE +z_69EFBOcJq4u;$t#gh}N#Avb|uw{npJrx9vpOqM5nVgSQ+tjN8H78F0Qx3a89j8~% +z)jsE;qg&dd%(0SD*hdw_el^Fk#_Aky8Y@n`^`#qDV*JM@CW3u*aUd18wA1sxOPuxI +z);1pSzql{|y8FDAJaMD4{~uCug~V1+VdQDo{Bm)X{X +zU{Y_$?rvC9P^k1RO6p84yY2AC!sL~88>l=a$^UXg*=tE@;uQ5_!@M}$+wJP>F!8OV +z0M-d!Gh1oU&9xKxBLUtk%Vxe0TUd6%_Vj(3f;Y +zp*B)nrGkh4fj%2*%C9+sOvyc6s0vE6_+RMWZR*)U@6@3mdXI-VH>caJ3^wAxm<8gV +z6IrGOQ%3CWX0fk{4Z;NAl7%_!8#VxZ=`fI$F?1^wpGR}1ded7cmj;|&t`~1 +zbMQ3c**3%aS4Z9b-}9Lj{~3LQzC!rt8{$91_isz_pC7kZ|BV0qM||A)&$Qwc{(0>& +zIzm2LX?IpS-v;e(*V~=-)zxzJXR(B|V^SsTN^qCR&(yLV_*p$LQvE#DW3T++Rea5{ +zn1^wTm9R|DJzWpVHbAYP@1jpX2|8Hcbq(3wc}7nE^E$=lJmx~t5x6A#359|?iE=+j +zB_>00r1-688X|dm)kCYw&FX{OG5t%jdQeGr1Dt~+4JXU%;bc|mG;KIX$A=maAGr0v +zDsx%;0Qa_zf7B4sVxb-$zP$n3b2Itm?NSenUf%#sybc+jxGL5|lmgXhs{@kTP((58 +zg&i&00?LV@Y=@@uq6GKc-P2=78ApZ}-?Ik20B4OJ^jBJE%(0;jkzKI|06g6 +zeEQ#Bd-Ny$|06y&{l^st;@??*yryFR!~Y)z?MLg6zFU9veKqyJNG1gu$%)){Ytla> +zfCfCGlgNEW>^+9~*I0fr>h(Qxe%P%#Gpr}H@$sSkEb|_q>fd{G=0C_NdyW5aOo{ot +zrz8NCp7D5`hjb+P&qm&ZixHoLNLKj5gQD$l)SKw6B~~{5bKrz?GOA|}vSF5ubLY-$ +zZ|j%iEs!=2UeC4344AWG9g{&fWjp(+S7dUH({NwH@SFNa8dCl*%MJ)CVG=M@i5EqZ +zi&-303Pa%J(bpC;klRHhvIrJIBN%{nKo)g_M$QQ&@l7*$0H8u{E+Bt-ewjA0$#8=n +zO9LtX`UL-xC}h1rHTlLpyr!0HXFuu4CVo=3qvGSvAfQhDCY`^U` +z+p>k>JMOAIWx-~UnxUHaj$tFEl#{XZ#B_4h_0oDk=_Aa}$vIBl*=X}@e4^xSsK(=y +zrkH@Bg`sq-v+V7NNj^nR828mW_sAxJ63J}_yRD}xt(-~x=2XmvgK?irV*C{Nfd$Pk +zc*T!!ehKPR;SMC)b)1(-4DJn3Q&nU6~!4 +z;^&ln9$zZ8xlS0_q$?XL`bp49ck+SXNhCo547=-o=*`d}b51ksR%(i4~;C$|89uP=Fem2hu*psJ@dc9d&uxL|=5-paw(Cz}DUC;U|Xyzg|B$3%s2Sh7QA%rs74 +zQvnOB5f$ql@8KnKr3D87PpP|r +zTCf3mC&FSE8O*||L`T9{#!lkBs^Uw~g>hSIwDZE)oYz(8K!uJ}=wMD7rvgtk`J1c0 +zu7$Gc&?RhXGg#ZWXDx|=9JGQpv>?FOINh6+h%TErqlUS#z_nUt5_0Y(tp~pinbuaU +zW;M+*>sMZ<$`$q3u2gT0SMz_}Dpgc~sfX@zg*7x}ylGhY%M7b9Gb^VU;f(V~JaBaZia +zoC@1q;KN8)$aW3D9q&2NY=nV98Um!wI6Ugr?@#g-C^CRFc>5oUc2@!t9h`<}oI?oek6xC>^Ru&zAA5 +zd3Fa4-Rhwwa(TvuD2$4>^}T+Utw=Jq0?m_(PDm1KATcmZ9* +zCG3Qu+d=7#reoGf?p0_n{QZ&Z1KlhtRX74`e=|YGjqhcr^TU>Vbvq_ +zi8B+=3G0Wf7eIy3P~=YvK@$w=*v_HZ{9<_+ryE|yiK#eoE8?4pTaj3ljSY2>V8_wg +z6-8j^eFm}x@}Kq*gm3SY(nTRIJlQbEATuYdXydR$v^K$X%>H!me_dTLN4V-*oN|*G +zxOga3l#V~V;b-zp72&`+$%=Cg-{DCJ3e3%f*Pc8h(V75rk~?gJ^juc}_T`6QHCSi; +znRB9BMG)rjCYTDbsh|@d0Vet+=7<>+6~$aZ3JoNv>x@tWg%gPP(3^z~%ng(2_+Y5c +zj7|&5TY!^f0fX{OOIinpk|VA=qEJh|PRzrJdT1%a9Q`TK)tve@aRz)^0}I2u?Elot#DB=jY~FQg +zx_W77H!}4>mJYVxf_HStwA}=JLh#*nH+(n4E_~Sc?}80_lM)_W+=L26i9skj)rY@m +zn$%S@BSg_A@l1Ync+GMU9Qx;hDWc`tC>O(t{hi%)=dQweN%tn}KAOaTS7-ttHJ+$O +zZ2->>4tBd+`x?TDu7;gG(G?YwZY)`Yc5wf`ntlUtcjx7g$LJl2DTy@Lu>*E&zQ!^TGUPRh396c_$sqDzj28#W77Qff){zXfMCzCk($aA8lU0^UB3D=AY +zjbFO%kj|YUo!@Op=hZ_xuN=~6^jyrs_3EAVo!;u7olxB*vItO;09G}}s+ABmEF=7f +zOsGOMy2Vl5x`BZ-+9=qE{iyJFF)?TuCz8Joqg;6QK_*MW@^L{*CjgD+Ou-TrggC(|&1g}q%Ibp8I$PwJ;Mc9E!s|)C3@yM@ +zXbDW5VexxxZQ~6kXa#D`jT%hp7GU=BK$%Mk9P195b8M*jEiN+^OowA|ZIGHeLcey5 +zXaNh7<#{4bvs_o-rijiqGISC0INJ~AVAS4^69}>o2B9e-Ywr+@I21FlVbyMJc +zxYUCOfxogTIl`qz!D)5V?`7)uQ&@To^SQV6OAj69j$wie;7iKND48qisfs~2Z)y1o +z=6-!Op9B;mar19vi$zAs2=u|r#xA(Y-N93bO{ah+w-#ev&2e^5Vo)rO2x3MEYD;0dqP0&!SyYN7k7es?p +z$u?&oxx7yo^stPJY@6Bq#lx14qAxDDhTjt(AIl})Q;1%NQNB6tgZIXFg_){ +zvwu&#H9;L^^&N3k;&M+ak3z3dpY@4Ai3wTdISRKYP5RR>YdPS}qBd!0oG=<0bD9RU +z96TTpCXEkl6h%Y&@3z +zExQ_=vY{0?Dm_7vnD~beSg-ccn`d>kF{acFwfEla*44&vQ#aIpzVlOEZHz>9Q`-l% +zl3{rJN?Kk^-b+s{&ReDmYsW}&m{a$qoDQgvdq$?Z|%mLZjs^wdR^b9nprEN)PO?s&lo)HlJsJc@fNZhO!V +zC1%9^24c4GZJ$hy!>vXV&NYx*S$f$$-a35Q!zUE)ffCYkI7n7>=(CT*w34fumH9=( +ze1C`T>`d!2VmPS +zuvd5N+N&md{_Y&TYS^6%eh5A;(M^)~e0|nHUfppdrM90U0-1uZwMguNjaT=7}%QsRBe!JTE +zv_S(gTr|hLQT1v60K)+EwONet%>Pv%GUnic+Pu~qRj>Q>dfR*LDNiORWGZPt>4$E6 +zwP(Y`KOAt6I~84m1j8{@%oO`%eJ4s|Lr@b*M>5fp$j}|U*=`ll=_JYz|oD3?omPXvLi23 +zmps*cd0YuVgs~|FuVR0UuD)RzZ3Yj5hHc0g{I2a9$pkVC4PyeVNvl<|vP9v{1?U(? +z8ZJXyo6?<4U-PG8yJ;c@Vg0}Eba$UCmU#fEL8gwhWgYdpw?#n`&`O26EBx{rsCTF@ +zh$fgq_5OX>0w6A+w<3jt#<*#6pr}-t5(zxPjgkxyP2W!tdsGlqqkZ%+S`=5?pOE8i2xv{@Q3LtvnyedO90Quy&BSh2(dO%MMv9nJ{ +zSLk%kGumLR5crskIdGw6q70|aX|NsIsCt{Oks{Re%snxlX=K8W*6ip(q{&dxcMvyC +zNiAUk7!aE$(H-Us#!PX#?Oq{u#12_AwNbl5NZTl4c>ea}UF+$^-P(S+d+=>Jt@Txt6MOm9Y35i>Dv)%lMR&nM7@4OpozVoXds8@q +zyS8+6yE**qX_5_CH&wYeRb2ct22n!7H)9w?usFSt^HXrl!pV0&QnIETaIop_0oxXg +z%QWw{Nsew>PJ0@N4!*M2^e$7e-~GAN)Xe=z1|sI=cKz-U(ep>;L_#(crzaE&6d6YQ +zcfW4QxA_2hxebi{Q&PpSOodEn@nnS$s=3(iHW{ +zU51S6k{M9*=}A-6DtCZNYLppJM^nCVgmQO)O6rvvPzT9HQ`9hb>FdGlc^zduuTbs| +zP)Qv#1L_zGv$Xqk`8@Z_NzTG!pjdrk&G(#t*biqDVsebh}6H^WMP1$}!y@ +zr}^IS>l~}j8N~NJr0r~-;BnPwHB`+>>6~vQKZ?fiB_d>5wvv1Aegz6Trz09mmw~YW)f|2(7hxYPoFcMBR(Z|x*NR?YREuZRk;MUIW-4OMUKtM|~;_U>b%?4@f +z_^^9i!F5(4tzF~Rc#Hg6l(4#bJs3|54h4WY#_?8`)2Z9pyRtO)(PSIy?xd$#u-H!& +zX3&OaFKJbif%+(h!CI$RE}pO$kGM+#5%?~os>oQ%H2TRB8vIZ>uT`}J*#5r)!=b;Z +zxF$^ySp&W3saVE=r&71pRPbCCusRwnVKM{m5WQ+~KRp<9Ap=8aZ%!()gg>7M#%x5~+g-KPQp}-%>Sej1dR}i@EprZAwwIR_4%{aQ +zlWB@~cENj$zP;di7Ta@~X4>4>Dr31PUB~&lUNlOp%%^(k1g9Ch@erMLdt6b*x?Njr +z=(sUz7J&|n1q3r|4wPz?uS1U)2Z!iqZsUigl*)^EY^kN9rB1j}RW2D^@lqNCF;xY_ +zi31dN8BfywM56!ul-q*F(X8xd+deOCJa<+Fe(;0sH3A)KGMutX!T+q=6{$`W2jrc% +zGX-bD7!zE_!4FqEgMhjCbW9h;bg7T2HfTncmzV2nV^9!NABy6gb9`mjw=3UX;Q>hS +z`mp=DURj3mc8Lyb)D#%2HN(ZKEhOlKcvMdvjGhpS^L0C=AyWC3tRZrk0c9GAy<~;H +zyQy4DV3iF4&T7hqK(T}=p|TaXTxTb>bxX#CPB%Fgd?6gYQ?oo_cWn-*gj(y|tu>nY +zS&hvw*0grAe5Y-6GWu#|i)tOnFk#F1@a>!%wf+~!y@D(Vg1q?ld+JU=+hZ34*L;qGDg;Hc|y +zV-{z9CtC!B_2#go`Ng1w28cGBO#4F@(Sf&b1|KX9sWDF+YvYP5*SZ4g;3?jE3SV;T +zabE%ny+DhC-9ER81ENOC7A7e^0x=VTZMcj3VG|bi!xN|of0mY-L=W6m77H!SL67^2 +zTUItqE>|e6iQUMDcQtk-2@TF_kS{~l?01e|jak-*-nyOPcKzKjPdUtKY43Izjup^+ylaAAZf~?>ckA#mG+jLBH6K=Snq|vY1gWLIDRoA_JWQq+d +z3CW+If7z%0{QpOieWe62H=O@#?X^|^{O^3*`Sbk$BR=-|Pb<#ZzuLk9JYHE{gRkrD +zN9&ym4j>B7;xwL6s4+A*;C#@0wQ(BtKPMSXIm-)l>+We@NXzc$VHw4KE|sdxEI19s +zPsnNVH;~6cz-#<%=O9@8heVR+5FPjjB^#UE!8!kr*3(^lY=>UN5E`oJG#zFrVv_WP +zFSrgmB(wJk{J@;8&ESE)WXF0|EfQ?0ri6|F4uo>aZ`$z}y9a;6!T^q9DB^n&kKqwY +zo~l<;9=l4u9g7Vt0FtH~LhNtQh3sQ=jww!^`M~aQE0+3GF6?;z8vh{11$v}ZFm4|` +zffIo#(*UyueCt1uz&V(MWP{9HNN1c_76aIOPD)?`A(Y05g}m5Gf9uhWmv?^gNJ%x= +zJETPlc&(az^ey6I@u+d>QJEog%*9Z|r!Vr9^6_p`T3%~;R;_h0F-?HOJ!P{s`oV6OZw*t +z86VMZ4Nrn4_1M&~uxOQ5=gSwztP*rxqPsfbhJ0MyldwdK9DK-KEWUzxO52*l6A}He +z_9F&mB3;^c-Vp>2!NYZfq+yBB5O8Gdx+zRw*TsL?a$BcKC}71 +zucH9EiT_*eRPcX)=KuRcK0g1)*_P)KZZ6sOrZ~Ig9 +z>Rcuk$R3+Vau%ZG5HJ&V3FKljk0tzAS(ZT)S@KvmnAwy4Hur1Z->pY?tMxEWCK+bW +zT{IJHx4NsVUscuB)m3Hr?-i|hV8|@^eRkYe6z#6_l3r!Z*Rl+k$%nvcYK>;cuGMPf +zy<>n(MGB%=8){0hGPdg#e+v`j=SHYcEfDy24Nn^y@SSf{HD)nhSPLka9x!{l@|qR= +z^(vV9$nQ|W^Q#TKrP;J!w1HXW1Sy*(DK6=5yuUPgXP;a`V0D8^{KH&#OkEg*bc%bCSxmUGvsYuIH{PMF{%k_A1;$Al +zN|SZvQBr#q%JnTSZSDlx7jT8%U_hn4h*GnnYOrL!BM!rjT01;4WQb&e^l_(33tZUK +zJ}Tq>U7yAB-(WTxe;ozj68Z0Gd$V-@w+Y!F<-Z4bO!<#ToCLtmmJ9&B{%z+e1%Teb +zBf#i-mNCixEhK{Oei#;S=S+T)=1Gk$JTrV)OZWzsdu`DlOkErsiVt +zf*b~PUsKps(&XUJA0{EXU%RCbNHa)vov13RF30*i`Y}VvY#%BiNQP{NX>Wp2qwmBH +zNfG;Y4bxtcey{H|VtchgvID%ymHOVBH0GFH)D)0!=1zy8B*Vs>3go=uW^kED71=CH +zF&fKN0RW%_P*t$6{IR(%NFh4Fvs7NfTh>Ho*&3_xojb^;_fB87k5yiIJ*EOcb|6KR +z_kfk694_uEkRv`jcS%)a<5dTAjG!fyieJi?eT;6G)!#x&NrIcBvV^Q&tQ{e}){p%`61Y`(zg?9Py_Q|Y^0 +zIfn1V>NRwrLhEsFk~!t7$RgCL-W?Zucc)@*V+k*wrX^VAals2SPV7pIKkSs|g7h(t +z?!}*@qjA`1)=RNERz>1|128_EhZm|hX@x0s2HDGbHz*0+G$7SsK1xTumU$2 +zGy;#-B6<`6)9*yV>x9=3O$I_zM^8K5YN4K6zH`AX<`41M5+7swAQqNjr>( +zi6W1B38)v6c);Wbcyb2Z2M>0~-X#5u8E6a*R?Fp~A6oDkdn0pcBe;AXx>P^*@67`{ +z7M0`Uy|~ZDGE%}Pk6nhhDvJZSVAy^uZBV3LR@Tt-!*$6Qr`Z}J&D@}D3g!9*hLtJc +zp#08DrzZDTQ5_$d)7xnXNJ|C@? +z2d>Y7Fzj8v?(Xh)Pcb6I1q*KPF0Z-RwW@{r$hA|*uWDt97=^>U_XfUps)bz=bWx0z +zJL-3rRHR{wj%o&EGs2W49Ycn6G7-|47Pz0^N32^%?h$>mbmiXC4=m_P33R_jgIVWA2k4?^K5(L*>iNK(KFA$)$}{zGu{#K)aQ4O0D)i>RkmS77WKQ9j3zu%yd{1jLX*~f+4 +zbzxB(u!uP4s?!T`juQrprWY-M1i5x^yf7j=Zd!~`1YKOf>YS$Vv{wwTIZgA&@ +zs;su1BVdCBukDjs5We`1oN!d)BHL$6jjn75iPJa_DO>yEPp*vHC02Dx+s@X%Ow4wg +z9o%VRedbP?CbmTNPc*S}#tgDYcEpDu7-wdVT1BD#ML^rFX4A446sI5ssyOL&*4FsO +zB^H(~v>{P`-O1JRu~gH-iZG5f&Di@fjWhsa9-Mb=O>&lU{zT_5@Fm$ANwujXp=B4k +zY4U~EZ?38Y7%CqWFgN+OIslrX&l>42!)&*zi|sV4I%lkr&6bjEqGE>aauZWs +zYQZX#ATkcwDFeC5fS5~A^{+9ySguy%ys({((HohhmzM@~(tXu*0y7rWWViQkap +zMFBiz(`-4hb1fw(&1QI^_^O7crXClP6cq@Qkc1aU=d^p&-R*T97T4bXbc*qJwJEe( +zo`e+!P|m1C@7>;Bx7U-%%l&O=(hT&AhCB4ekrUdYVTA617i;L5gRZ1!*9Yv8Ku^Rf`DYJ=%`ngwo@0cMBx4!K&o +zgdZ|vrc{blP)AfD&_yxJZCD}`|7=T@Fm*UQ!^Xb5z8bTOAE`%o$#Mn&YO9&C@0f~o +zRlU@;yWA|)hL(%Q4mZ~l@!A0=(9&*rzGnm +zF2&llRpyI3WKCkAJ;wYwtO+3#8W15gtIj3aSYnz0o0y>b3ay=}OI59STvV=Irruy` +zPOY|MuxfN{gV1v~`4JY-Y?iI9X_9cLT)wkH+f=Kl3@);0QzliyoGZCOrk<6AQc)#9 +zR302EzP$pkH)@|R?#C2cgmb(QDb6QomQnVfv8|(0-cJ>|3t#p~( +z4H&Fr$h(DoJFA6?XIKo`7mAsKQmi~>XT$uELJYv%yhpq%9P;OuK&s}HE5$^DfrYU) +zVlr;HL(tY-HSsX{c_vd>abiv}aTVUkZaYHyM+STiHC#ukkL4uAT~-h$v#V>o%#cj( +zXm*kz1A$0ev{2+Kp0laD@Xg#W*K?$Q6o +zU&{h)iT)Sf7483@w%d>P{}1xy^uMuT0rs@L+yV?)+gGyytI*TNzs&}WHcbVc=~vX$ +zF44(W+$3FUU`9sJcnwn8Zm){ImU5VHq1b@-WJl2D+MX;NB2+rZJUe~YJG*>!c)WXh +z*zM^aJ3MIkPHNZxgSHrj)LM;P$=U2*v(dwhIdz=$Dygc35p_gfRd}a3>B;4ImR=7f +zKk1?Im(-k*=kemfspUWxsWiNkjA#FnynS+E9O~}rY44}wv)vy_MwJH2*<=8;&a9%owlOm9CsiY_n`T}1TRquZDT5(U-#@Be6&L9IdjOG)s{E7E9B?x +zOcA95n)y!7aL#vhm8Bj_*Zh0pYAbr|vcE}VJM7HE1JRfOuXltsi-Y+Xu!4?<{1G+MPB|Vc?)nHiPAslHb +zRI1A~()%>jwRHx=VsWSlHh(aW}VC1Xn(f3(fWPd>G^(gPT~YJ5qPvOonuxWq*z +zfT;tBRsX4#qKxw5DpS1Nbd@+^X>GfZ$2zmLDcap}GnL87lC~<_s$z>jENCtp*%>YU +zK+UYOEiyf*DT};&ji{;(_{gD(Yf!Bn(|T`_*&d|SOazie)^*yHPnJ-2e2!7$QiHzC +zu`rjDOLlQdZPN!O*^X~L<}PLca&Z;`WR`tMQ96>I_;RqVTxMm=R~*@rLQ0NorjyF4 +zq^d?%si5Sdzb{K}2KO?v!18$*=47L&-#BHJvEPFBq2*uJIGwp_kye`x+SRqPjoyMv +zj}jlKr&+Jeeoxnytq1SvXkIzhrE(K#r<6^a9p+n9$U|m_`5cv#N?8srq8gG|86BZZ +z+|v_=J>rtNX67t3`!^C*oNWuV(miR-pVLb###W`BRs}NsbRI|6`D7N6Qahp(#@Pgy +zW{u@(m^XVYy+^A@*ANI*s-d|VQ+4L^(z3JO6(jFMAUhpgHD%F}_6 +z^squ!v{^G1Yse+qd=PWJ<}P>(FITVE*5rjAni}8Zyf`_ocyn-a`eyem|6-Mqw7;3} +z)bxpT=*2ObPN3Lp})+;h!7%`QMX9r#~#Hn-aw+ntTC +zuK$ycK%}bgx}^NOUVgh%Y1zJ&2qomx1CZDe!$~sA^qP6s0bh@I>`>hXA-%ui#Uz#i +z5h|rdR6+XcR}V6!qBN2vH|O}ih!3SMZW$LUU5LTN;VeSWqe`8JfmA?#m0ghxh2)KV +zX4Y(ScyRb1=N6DB!-7?qtfE$H&$l|C0S~>jC&OXrV+6@z2(`8$kXy +zwl~__?X5id=S8lqxIg#E$H!xl1xEd!WvpLy-t!qY_EqNe*fJ$Y*D{Kh<>;vcfLeoO +z$%+Gk?@tc*8)H0XFfV=EkW@GUpxUZ0Yfn?&qZuqGb>$W4X-XSzR!!qA;c0fu8eWWN +zQ!LPUVm-N6!$@(D+*E27l@igUr|NgxN8#GZ+;yro)KA-7*WhO6|$*auM +z&*kY?<{9Sl3@h`*xjb=Yo=Gmxq%zMmmuFg;=O&luCZ9(sDe1&5OxbED?_SLIIkFpU +zVARl|%}=dHdqYgsz*pKEGs`Iz&orF*vHw^x-IM~Nl0}Ecq^ndwS6mdQ^NqqaafNXl +zMtMDK)va-vS>G8KFNFoWt-uo7!lL-;i(qJ#vjl;OoOXHe=FHL8$rlvYdS`PT<}Q=x +z3hJR;bah;{`lZ0$aaRVGqx;DKR62^0<1z>eV`2=3u>oBrC6FtRPj+~3KK3(b0Wz7^ +zJ(*C#TU_}RHHpW|04G9M8Zr_YIH3!>Fz7}sBeswvgDO|X_}MiQ`)(nu8WWa6I5o;S +zcg-kLDml&4)7%Tx;UUq(&&JRh^Gw&vVY)JaB?-wgoF5y>#lZ_Q#OF-sD}xKngz2y_ +zWz28+u6glZ+IVZzeQV?@q3cGh7AcKJ5J!gUh}Yjb^8Lc)Z{J5r3l-!G0dj-f}p80gg{_ +zR0!(=Ap_*++f|6VT)|&$qg7Oe=K$#byx6V!ZGXO~rqrw|fePMU{^iYEJJ)ULJ&@Bf +z=#Rz-CHY|i=tn2J`+v<3&HL$&Kw6!rio=Ci8?nT;&BUIWn1jBOS`MqS4HZ95&X>y3 +zim9ycU*O=NS?N91e|L29s$9R3T0$T-&m8;n3;RCsXS=VCx&`P*2iZ{Zq{5()%X%@J +zaXT{fQ@O%kRfW6z`*{T3y~_Q5^Df`~{lo8bzu%txko(>J-?^VhXZfGqeB=5Q8%8#h +z-q18E%^FV3O4*A#pl=r^u^!-Ty_Nv_ivjwJ0WRuiSX#M8tC*{WGzth@nnTk>$kn(8 +zgm!)5>`|cy%ad?yIV2I&Dd@d3P(|+4L*l!xLCXmm;6idYF|9Sg=|Y0b^@++_rgi$% +zxI{g4*;rZ@8y7`-J(Bq6c%9>=Wo=ujmA%7PbBD52Fm|b}U&z`E!o7JY%%=)zb`Fv1 +zLx_|jqGm@AY4y27>ROFHpElUWaRVkBsaeZcQt^Bx-Ch|uD}xuJv4ZwFT2xp`9q3f) +z3)7pz$l82auU7Cwf}{4*Lfd2LDdk54=8#jb6&#jS_$aB@dJRL8u}!Z{tGx=ZO+2}1 +zR%MI=8bXJ866Z8Zrt+&KxcJLrgfe$0=272EYYnisa9qtiwnET6__Lj!@}^S2Lqv)1 +zMY3vTn;?Ixp5ePrM!V&ivxG{9CC2x0-a4i%+86yxE%GR(uvBQJIN&x3jw@rllIp}} +z=Pukx76r0U%40)%P4;1k+!csNqHtEBt8K%TN|%L94N&c}(L)kOf=>=(oOz}8L7 +z+P2VVl2#E{v=Yz!O=3z1<=M7rs2fD(3C+Ta7-ln4&MhNF_xDiRbW|Bux2>Uk`=F&%e3;ck%cK{&muVv@fq? +z$@y=)Q`Y}K+j{z_|9^<5*%Ua?c#C<2QFKrQ(-+^PkBD_HmOvLkj{r$ht-~(@O-vllA`T~O-;0=>$g6DP32qBG4y-spH-$^vX-*;W>|5&yC?(V*8{a;HZov5Uy1=LJAa~uSbch|7d9^m-oth+6GKlRSKZ<_nv +zx839Y?(vx;yur^fH_+{49H0*#Z*o^>Cj_C}aXL72feNCfS)F{@Fk+#bq%EH;A?>ve +zBi+c7o`<$7g#R*xc27@te_G#f+&b5|VP{}d;fjCUx{&5xf0UKqLFLy(e&Ly(-(6rH +zR{7xTIlR7AuQ|i{{K9RsZiH~#sCt1SBAWO|LG;Ry>S|2VM3 +zZ8*ISW3rv_gD3({G4bxQRxp_DbnM;64JzV9!EowKld-MwZ#(p+b=~YJL>Y7S;x>DM +zjxM6%Ir`y%h9Io9IkuQGp5Lv?0&DZN&PAb#)GmyEH)DMFb}3BUc#;feen3eSSA-&1 +zl5dq#JA#`ex(OPXEgO`(QOCJ+?#A#pbP+pjh{InT^`))?=iPVB6@>p0P?Q8Zqtb93NLJd8!mpi!7n?M)|ODro&z}Y>$tOq3C)f%14M3| +zAg}yNdG9!{IZKq+tm}a1G*0`}p9Dd9RtzTIZ6lixP|~$5qyV1p&qlKd4Tz!iB%paV +zj6(lIFfmpy&k#ABYR&SXXJd>|;a{uOfd0@Ogr^4BD@5CFf>! +z(rw*j+Ige;ESY3&q$cL6kPp3AAWwdamN>lNKH;DAg4ay;hJVv5?6~X&{>tc(uh2rw +zXjP{$!$S^*jh%!X0jZB*;sX89PXI0yc-`GSJwwtZI_#ZA{)PW`#I3sl)N=!N^WPmE +z?srcqU)#vnF6Qh0`1a^zzbi8uz;yPu%DxHN4-R{;b>1vzTjo~ZIw}RrZppH*-kqIw +zPY;fM(%82hv&yys%D`5oDNtL2i8fAN@?J54aRxa)8`Y!3gRUAo9QjE=lk_&>$)08$ +z2gDp8h=5PUM8Gv%dYOZmCZmAl2~LF}f;EM#(x9>_GIPMpL40EjAsmHhPDhOXu1PK~ +zpt!_D@)90AXUo~NOYh`>IqO@%mCLVjfSgUIv#xMOhA@k#VZ?fW-8?AbcJxxQ-nZAE +zov;7JvTIO=q!&L5@InMr1x1`St5UTZOap$}<~t|rLHW&*Zy~bYkXOlFU +z|ojM&I4jKZJ}SK!BsbsQlY4eAk1N}5e6C)E&_IAO8L +zq?|OdHrviRbo?JJ%0527;aR-@8;1R_v;A9Y|KHgt`G0=ee)RwRAP=l-80aJh*(J<; +z-4mnrJ^wl&#&Q!(&|6kO*3uZ%u3RMJHSn$hWUqGY9s`v@gSYtkI#HK;t)`+s*OgV9 +zy0V6anjL$MzW}YSnbMhzGw(&s@oWN{%|MW*UZSY0rk{-=6qb^U3)>l8h02BJvo)FH +z&hEch}Q1hA!n>%4)+cX@cEYv2){0ontA+#pv_t9HelNkk&VeOrx-rKr1HPN2!Aw +z&IltJ@PZaU{s_gUNi2h{*mVYNS&kLMKPm;E*b?{%;CBklgW6$@BRtJ@0F+&aKd$U? +z{K*+8VIXt-(Ube}S^C^V|2^CpgkJQ;Twodf-)I;0f6v;T_9Oj&hzALVCZAD~&L#o5 +zq88)iHkb@&5$`M}o{mF04Cle1IZo(S&=}=RAUJdv=vfpcy&lz*XZaBVXaiCXZX6} +zr^bOTXd9KK%F9$VF@&5LLvcWDjgwnqfn}bE%vC9H8*|6{6F>*Pp`cJ; +zgu;-p3tC&%GTdfDA)W7$k6HOjJJ@ARY<#j}?9J4E6h^C`#p^#!CesI5|Lf1zpO)_b +zZ$94te~<@-yW2#BBbWwg@{y@%J%KYI+u$2lr@dGNa}SG9Sc4Yb&A!HyQsDNU=+DAv +z+6)bG#X?XP2?W6$gh}#8NHXKwOi&bW18)++esv5qLv%XrOkns0%Y%>*IWyczqpTA> +zpYdK@iEtx#|ZCSHt+<$7vt~-w)?0n_hP6mYPDtn +zX?`AEIP>$-g^Pb2{8^(-b$aWKWf=;rG69KZoTMZZXUcO|7QhmmnKsjqVdO?STj)ll +zer5e}_}rZ-6*3eH;~NjepLn{B$gFi*tnT7rbq9g>SVhU6Pdr<{! +z5@5`bAcG<@$X|@0@UBQtHqTC5^{H|{pqhd~eeV9l`iqA;w}YS$f8Tf$_`5rv(Dys| +z`GE0NuEFupCtvZ0XBM76wi>H#sk=0$oPO(s_Oj`ulI?&z#3Qi`# +zb)!4h7({7Om&F1Ps0!L%1%bfeWmrs-r4&Swir?b%rJuv~I +zf#+YVBHL*4A^Ks8zF=T}*J}J7`S~cAUMB+%tCB=FxB-cin83k=2!5IIR){X94!Q6& +z7?Hvo+XG#p0;{o+Qo|3TG@NnhTj-AXIta;ZP^g;}c@675R`(=`-;|1AVmL`+%p_== +z&_};huW-X1tD0~9H5<;6b*J^u7eCypkNyT>_&*dYw +zP|_-?ny3|&VEC4AxG@OW@#eS42!=D%Nj>ikXeUgWY0?)5Lg&H!X$bgct)ZV3L2)R$ +z*g+`@??I}MQDC=R=ud(oH8cR^)3)$XhVOA?Xwq*-Tmf7R&;)BSBCl|?E(kY|4zz<2 +zm4>Z*(8Q=hJZ$t^(C_TEIj)?+OVjX*rZz5)swp}jFizLOoc!O_A4Q0Vc^32kjB0*q +z9m~#t*V{$=pQjt0$NL`-@}U0zvsq$&5JXeY?F7xIxaXfHFonF>4-6dw18oe^|BEy9 +zoMB(95`4Get@Z71*9|p9>{yU)IX--PF8X${L?1r;%5*Ut!h6?4I~Vxu<0q;6ynfp7 +zntl5@p_DuN^qqdwV|53qDpdVLJnZ!u=FnRm`p@%6rUvRhp^g!9j8jwn-p8i-*tDD} +z`7i`lH%SsY1sw``T_Qwr;RdQdhaS0T$q=){hG(x18-Tx|?M%sll)BDF+}jHCU!B0s +zcPtclu(+u|l1C)$(o(4=(D}hM7^eYs-2XkugXH@+>}tp!!*9FI^|rIsZsL77vdhTSM0*0rc8#*Re%tZeYn?XV +z>#Efjk*bxAR(mMWU5~W?tQGXsH8bVlo*IU3mcdk5t@xH>wJd3| +zChDr6_+zc}^k0^YEMEV{HvS9iShoJ3ZkFOdY(Cq3T>lU8;ME0Ku+sEPMiFOi9joNh +z1v)u$9Dq8i+iO(EdMX?2EO41j1JeJJTG*R>Pzo$-)gnWZyK#sFBO^DyXpTiQ(#B!p +zzljJLlMqr!o5e4*9;;qA@8K2cP?-uDH{2vi``}zUk&}#_D_0Q^*ssvCK3{3RY^)4c +z?Ujp_bhUB*UGKtHel}apot1R0(OR|tm)xKxACwga{usNi)w8%#_yH~FT_k?Dq)CCM +zDOW%_(BCYgA$PoLOZoeb|KjyuQs({UI+oi1ZxsFiJllHuX#e>j4;%L{*U{E-bpRQQ%|cA!MdQ{>&17f7X{E4(nLh$zS}S^KA4581PE`>wc8 +zuFmn}B6}kfTxt47C1sb11vfzi+d=tL(~IjQ`OtuO@l>n*OSID5QxO~>Rxe(> +z$aYt1M@BDgma(SUMS~n&EmKW{x;jWfbJ-pAw#~Guh}Sw-M92e^!IoYV`b*dn{$TYr$X0&dBdjfd!j%~1X+rBj>)DUXYP7qC|(fL +zA$*s>+#`tRn24x4)`d_EtI~j#$1%l2ESP=x$Fckgyj8RGk6vv5g3mqlU+u8IxQ?az +z|Bd4P->038NB!S}Jm`1tGwnd=mI6A<0+DlF_(?Py#i?lEJBP~HiXH4$?9HRX-aNW* +zZ+;0|a}elq`|`+nV!dpfU#{F7Qwcm&-d0pUr_Jj# +z0V&XwKYC~$retpJOi^mN)%Pm6S^Vca3# +z0*CL*o9N2qLfNOmLh{DOEqvQ>e+Ua&xT538yXj0KJiHeaXa4UpNOxfn4S0`^kLL(1 +z-gktz);I1fWmoLUMJHMs7-%-o2^qQGlunD84E)i(|HnUz*MDaI_@#9$TmS1@Mf>lk +z8=H^*pC0644a-8?)@;qocn_^sYq6~nzLbklg@@qVA}cB16oF3w#la$y6t`SKd}F=q +zbx$o4`O$4rU|c7GJRnd!Uf=%xo_qZNvjzHBsAK8+e_Hnc_Gtg}FpoU{TYR-3Bpv>p +zxW!Yx^09!_`{Xpmp}r=m*SKQ1%M`)Gk9JY(tJJzkC7idrXRjY=!B>3l@&BOiD131p +z%k;mS?ehK4$Me63dF1`i-*N+`@*H0@199w<%U?Z##D7aI0lSu$QaPy@$P2r?F+>u= +zI-Wkpxvj=$Z86wC|GI-)iP9z_v`d=>vQCcBLfS+{;fPW0#NV%;I8gg2A%pnQESiR6 +zB#zKke;+?F9bXch#@G>8pN??Bi?H^!411ibhT8Nf-(HorR4NDA!;g|dBX-2t7XQ?) +zz>3`vXAZxL-Er(5qacRk$Ic{iOw3zq^*JII#EoNi3am#H$n*$0Wj4kEJkBY8j3&*c +zFJYKAA7IbN{VlyQ4-!5eEw;VZ>I +zpU4BBlC{|1tyU{+wX7$Wv(9wKFg4(>-?>^6EC`61VECPBA%Ie1DvNZStCGk#@owQY +z8dc3LXTz?~-SzsN%YJ|g=>Glg$-nXHU$Fl7PTu}>didSzv#(Rfvitwfo|WSNJ$Knh71#3@y_U2hK0R30=K<={FXHU&{~i>?6x +z1iA%C*;-5j9Zmvtf-{`nqJ1ce7O*Ullh3dw6yf>_$eNz-4T4eV*C_`GA;HAQd+X8% +zI0YZ}`YDK((;<_yj)4t*v_f03Zy2iiDB0WcAoBZQ!t9f$4O-{q486x3|dKTFK<< +zTiJxx^>h>ofZ%@Jr(WMn#&?tO>Ut^~d$#EO`Ollp^>+IiIavS%9P#$uUh_0epzgOA +zBrBymIM7$95d$FRaG)w>{ +z*V|s2CeV{8-wqOgmMQ+w`Zfjn4g+iTWC_crN(O-!)#Y7A^~&%dfQmrk4j94Jk7fhJ +zLA{Q`Q7CJ`;?xgmox^-Ngr~#Nzwk4lW{qe42v(dU1|fp(!w|#ZVImEbgYEbh@2Lh+ +zR0jxQpr@q5&S5K&1p5Z+mt92Wjknhz*5+CgrXa{qVyKb>kiqUDO{m771D~8)klTSI +zf_aTi^OKl8BB$GR^nk(PXs9hb%)n(rpSzm|V4RJrd#`edRn_M51~j5&MV6}^*#vmbU(yW+4X-kzR(f4JY>7uIeMep`ycl2)m@c29N3d$Xy +zoQb1DSnL4w>_lLN64YV0hrr%+PxoHK&)rvtM~7!WIrW3XvtxvLaB?bk#oOJ}v%|f2 +zN4uvm(NEu=^tw>}K7c(wJU%#uTDot#$7d}8)k31^ehk}C#y~J_bl+tvv`YT}^<4kZvyA_5mF|CRu5Ug1 +ze}9mNhg$jj5itJsdJj0v;c@Q_SDy;P2y}@FcqoI0At`E6*4KwUSSvqKR?qar11u`O +zLgR2CaBLJFc_}iBDDaTc%bTV!<5$HGC>{Wr1SDRP>qtWu5lU|Gv{!lucnVP2=50X4 +z)^InkeZT<6O2eyI3KYS73X6aY%!M}|0~=vq1}zOcN)u$R7?2Vj6Okx_u62r`M}R2+ +zNgg!4i1ih!zE-7l(?SnKD34&s%qW;5wdd0^;*~dH8j@J_Bo((oAG!(^W78@T1;i4D +zL>ryJpG`4FqwMa5f(?b>(qfI!o?81s5OW)Wr;kvA0QNf!&^{7-6PX^y0Z3-VzXJC6 +zrZEs?&qvpV7S;^FQ(f_@*u4R9%{VbRDp9y3f0#brxmbfCCV2Q_2lE=@pW3lPtBx8z4t?5fnL=i3(beAT<-|T{;bb +z00JMHMW}Az7-b+=+_l63Ifu*Wnnywk?2(WN?07Kkw4uEUaB_kyb4owRmdL$Wzzn0}cVpvK-)QNQc14Fx_OGg@hVk{h! +z?1wN0&Y5a1mA0}LiCgJE(!UP;51GbD%Paqnz3%{zs%rjTiW07(fGF5rFAK^BH=Ar| +z5=bC~0HFnwASiXqO>$)$dv^&DQ50;54G|l55gTG}fQkzGqM{-q0)l{u6vbXp@H;be +z&Mmu}gr=YVU-CT4?%i`woik@<&dhHTz$2Z;I>C(vB)cWBBd>{MTylN@)|F04gph&3F*%GsA +za3H#c#$>Y4lIlyfY_!?CEyi}vw9}0n!NexlYh$oqjExfL_Y&IeJjwvf1lACZG=(OsqWSll+RFr~? +zT394J5S$Pug8IP^HDo^pW~Q6SeQ^Ci%VbOf&>FbTA{aHfEhu20L_;uaSUP$#n4Yb0 +zBQT)rCd?5ygR{3x=P$j~kBZX%HWy@ver94}_`O^~I4R9iP~QVMJI4BYe6ctz4PWRm +zy@8htylP>JhK?kRD}p8+)2;8o?OA>;v;c$ubrWLk=1|M+mpkx^G!6X7Pft +zpa?2_R9c8NIOS|jk&g+=LD2?JAM|A5MivLeT(F4*1Y^!kL?vKCNhceKXcDbxsy7NY +zAD~3+A(MF`QHA~AsmlPO4ky^K%!d_!nVlw{i0Wd5fFR!NUy7cD4`KX&JQ#t0;npAi +zt-${Wl!-1MWX}yUF$JgyuSf7x1S-2r1&O<` +zXig^o`jkja9Q!aR=mH;@OD>L*G9>!Vs$`E*c)*)G>;PIw`P}GYY`7|<3)L3h2?GEt +z7C(FpX$%^MDyb$o-ce_;YzJ&QAMTSwup0#zGRBQO*!_`LZ_8)hb4jmKYe>-;Ud?f$N-|}a^yfN8-3i#Cx8fOF|XeU<| +zY$_;H=dlY`B7QLfqUYIc`&Ypof1EKOuI1{FH6;jl+&+?vxoOBG&rx8aR?`bi77S%p +zu>Y9~REJ`oiJ8`NtU^z;!c@&Ow$u&WU4hJd00r=A4;hau&ut!j2OnakO +zx_hk;Wmb0NM8ollN@AAmbh3nu8KVN`t5(Fxr}?8#9~}lM?(x`_Xznj!sV3ogIgY%Od_U&sgWrCvTDI!MkYx_1}G#F +z=!Fa8SP%yIQu0=~r4HAubH@xXJ4=EdUnRJ@b9(ULjT;vuEaeAzd~$KAJe&&R{h%l6 +zH+)yfa7HRRXaeHEbZ~2chumJk+Q2p#>i+39Zo`gZ8)hBEHe{29S0x%anIIAudx#2$ +z?%1C&2;)eGgFE8!jq^}X2{V8fk9jJ=7c8HI$^7Xt0| +zhgIP2ZXP&R$J7#qbsIQIBA=7(R`eY^6>yY0(nTbe$j}XjaRlb#&uJ0L>4iz`g~=c? +zg4-O&f2KRZK!D!TQoS~k(RM{htlEeX>^t9$m=GN9%E9^^Rl`v=riww~jT^sO7vm^5 +z#ha6{QYD9D#l5bvaPV1*s~8?Udso*aZ+1GCrn?a6 +zV>=n+B;0?Uy|N7!3o{;^!!<}$lkt>PqNEmR{1tYJK*W#MjV?48dEj#zDdC2au#XkN +z{)q|=nei3hIMW%-roj`7ctW%bm}0;v)CZ&HCh`G +z&ON5bHGxV*@{V!tGqn$6W8$1iq>2QU2M*02Q#81!3{7TC-_*e3Di_6om68RVkz7w8 +zUa;2N(M|;^z{vRMlsSkD?gwDaN}xP>hEb3~M;*FzVB7@zN0voyMNSA+uV6=Vh|7(p +zTw2`tX{<(q-AlKjfb|hhb+#`V!||}Cl`*^Q1Y{$+-HUgYk)IG&GPtmUi>jYt;-pfz +z(h3_srl4hnZnYF~Va5cwDEKEZ5zhzaJg*u8iNMcc8q>uo%%xLSf`l6;FMv}MZ-}QL +zX3G#k{C?Gdzhnm)6+*C`cI^Z0((&NKa9~py)l>{Bcf<{0{hX*&N#V*=`3m27ENO9a&YF^wgLl2d)Be`^Zo5(k(V?3dIo;h2X3}~Syb*qLx +z0C(X1$S>(zQdmYENEYiYVxY0SDF%Etzii{Mrn=;8RDkdEJ8RRCJD5#Be9?7*46Y1t +zmnUH)#U)no3KegU#JjYrtcIG77CJw`_Dxyma_G2Xj}nd$YzC;I(xX)prd9=rK$SxE +z4Tmy#>b(i6*h)fiM$35ca|JIh&JpAK8dn2-`2-xVmDr7KQ;tM$Ruo}z=nPMI$;_bL +zoh@pS?5KhyjS-XCc}0 +zlMDh;P<&z|jD_O?W6Na#aJz@~zPD-3#D%CD5t=>XjRP;_o%Of7@^fqXl@fMa~XEXR_{T3bY>W?hI{akIwGM*AGd*0%jMO +z8W|2~JJ5Y$c$}6l2azg-o;n6uxK8P8+h7xh01Z^6`bik9P-ueb@(!+@STm+08k+*u +z8V+^M#ALBg9v`|80g=rj+&_S)zni|Aqh3}cMZ6b_U76y}!=Eh)@lQxXnU2g7mA)HKD~2f`X!tQ}xK +zvBx9C#_c9eh4dV8xl3xGVK`&+L>h>=n-!)Gru-|qp$*&WUCcGs!oj^oX{0B(`vS>c +zY!`^PhC4eB@}DD5!rR8EKLh+WyWs^Pev~JRdiGN@L*b2v$aE>DrO~it%r54t&UN#z +zVW#>)F7})X$3-GQzFY?bhghdLW2V%CLp)Enh*NM|KzpC^*)ra%#?T@o#4vz9L{-t5 +zARq~C({mxpoPN-En0{NqG#Kt7g@QjE2^sN7H-l}H?GrC-=+02_sV0%b=mPF;O>FO2 +z7%XIUZ1QATTEw>t`v;7aF*wa)SmSGvQV4==74-mxn=A{))-uF6_{K=iZYVQCkVcV5 +zuy%gPhvQ!1DuCeu$ZgPB1GJZNCZ5MI@(C0nd<$Lr`0>I$=#vC5lc>jJhzwo!Hi-Xh +zU41Yv%*dXF7j7Eq9%$kLwFOI&W&kcDdXi%3Hmb`Y&eQhED4^2Oc!XxC0sxay_^6p- +zWV<>M!`MGrnixhw@!*2OA!Rv?e;HDgo#wJE*}TRCl|aDDlx>9Zfpq~rB_pW7ysKK! +z8WzF5DP)td2Z?gQe-2$n;1*f0uaXI?dcuzoUaL9Hq8(OL6^@RRF(i@hxhp*r#055D +zi9&h4!w_|p0^1C6UzQ6eQaTdaX6S4HH{zy_aQ9DaN?1B5>cph*r{Fvm&NgX;GBGkr +z&SjGkaiWQCa`JxCjU>8CY-~wGkY)sEvK{dYhxFvy^yop{nLw>X$Bwp4y@npN#Z)2m +zNw;tbIn!7o)*d@@Nw5VmOXKzv%*$PaZ5tT3p#j4?4&jNGZg~kzjij^+Gl!K?=$^k; +zOL27y84FJge$ijcrs#+QiL29oZVEL_;sm9mFvcSkKr-wAb{#2JfRF-`YXzCD&@Ct6 +zPk1p=#o?v}R)wkuuP{+5tQ+ct#;y<6s&nDlt!Jj-`fiOE4@|!TUAJrLhXw_<&;%u7Yj{7;qy3tGbNug^h4Z~4!g7}F^ep?=1V17 +zj=Tw-_jJ(?-40+%DL{+c3z%$1JjSkX`4lEv%kI=264BO$-b2KGQoM+^5`%QHgsx{o +zAg`WHo-Z(n7I@GczU6S!a_p}jVRRk{4Wt+dRZ@HbxX9qPdZzx_NsO|ScLrGGYSPEy +zYE=h#P2^G$HBw9G-J$3(X9vq{NCY69Bi +zx+=0@!;ORAZ2xb#aUArY)&E0d8h{eZ$aZD1?}x1o4D#vJsYd)C_Lu1Y(W#5uCU-h) +zJ*egHf8770mi4Eb{KL>jUGd-U&WZTHow^+H|M`3V+HeNl1`f+oTz>SJM)Aht%OSOq +zB%^dOnXs@J955RDxo~({E>n_9iwg!6mW??t7s*H(R5YlNeR1O#{#$8rE|Hq6t%JRl +z&i)Z^rOWgND-u+Licx^-NtcEWE*cKM#zX2v{;RoTl*fkX3)1{dUJ +z6lKP>XeOFVGI?Pj|4vy_o4SgCf0WT$0ZNA8HfK2hvv$ZBp6kRThrG35DK` +z)L&EJa2vTq36QG^d%056UBp=_)vxHmcCo0Uu%=Am31dq8<(CxZnmUdi4$$pP@D?!_ +z9az-MT#!wYUaZZ2SLwEvt+7rvWujc~{IdL9Uqt_2IJ~d`z9-Bnikkd3Zyc&TF-%O! +zem48tu<^GkD9Ekw`J^_z3;X2aRRpJ`-i5t}_LVbwBfa#?FC9}lbnuvgg@f4}eFoEe%Uw%g3aO)D4NTpMG&h7baZa+=Y9fL3L5j|)lqs*#8M|7Lhc{w#mB +zoc~O(IXp7pfy;lLIzaxPBl6#0|5wNQ`$Gh5a7b;`A^&ym*dY=Brwb#2Bl6$h@z=d| +z@8W{8^M@45{mKRnl!pxMHL$2awr6B!4(m{mnc2InH~rAjmF3RNEF5f?(ROAx0bx{i +zKpc#+l1!kKj+q1n=kmw=_B^ROJj;{Vzlz7tzJd)J1;$)E6VUKd7CaW|ej*gZY;+`s +z=E%JVmkJ|+-TLY{rMfB{^=sDmoQ4eRgqNN2U?m2&VfKS?_bD~%i>a}Il9#%@?wRzf +z)Ey382r`6pv(*7bt5lSjU9OBO<+*m<+T`+StS?|N&9%cdOD240FK5!IrS9IazZ(8+ +zosl8KGj@!heJFo&Mg~;pS0~86fJf7EsZyA4_@56fEbxI$bQ~neG`Wz!HH?!G&FdcX +zlUGqLf33TRk1rYR1YS{tfb8dwRpz?0&tanh7exH%MQ@DUELNL&A?+Zp=Gt}k;);Z@ +zo=i_3n`S@!FPge1U_*s(v2Y}hFQvsmC8D4N1e0X0j}q9i4-q~^UJpFh#}*C}2#`Gw +zK0a=0`QYMV_6Ow~R+Myk!s|y`q1|@@x(w +zFcCU6AZ=taq7kIX*!!W;p+Sn3*|O@-WfkVJZNvyao3+p8K2I79mpxGhVLB0GQnz7p +zt9W-Mn8#+PdnWtWa;ryRmL`Z039ErPNp$KW;^w$P=xs$KX4?&}vN1I^qp4V)c+W5A +z%9FZ#*({tD@@kQ8^nXk^nJaf!^L%g>ulh3JN%u@O&zV$~(W6JB!uT-*uDeqgRU=eR +zjbwQIe%1q{FqWMRBpS<;yJwnu%cqQzXmgkf7y&j$<)IQ`VpoEZShY)xx;5gl$KVPG +z$8?A*D)tT5#n#qTHCtQ0mq9@2?#(m(=16BF$`gGOm6(`)o>XG;N!LyAcyonqiLI^s +zQGpekyEV$@!N$UeJl2{9YgC;yR^ulJjFc}f`=RcE7mybdx1<*hk@?GDNY}^jN~|K{ +ziGqKr64iiB#`5xci%1SY3Fwp&GS?>yS8771Nvx4}ULFFM>RuQkQb5eLOcx5|!i^il +zv_^c_q5Ca%%46!3lSdr04Tmx9vN@OlJ)kW6T#qSWg(av}7W*6kLD}#C1_du;;QrA` +z+dZ+@Z2qAeAvJ(qz@^Z8fr0hb>q}O(m6X_iJ!m4TgOt=r3L;V?he$rgVle74*8cA! +zA6ehXDM*H5P0V$cBbXp;?j(AV4w_zME4@gEKrV7Ba*=d$F;h!>#zGro2Rr0D5r6M5^Ws;EIJ(ELa7|7Yy|@aq4p!aTN% +z%=$lUD%sHo?t;pqo{+|RCV9d2;gt|#2sc=Swj7pHZ4IC1 +zf{06>5@SoJ_~V(E_(3+wjF$W0zpSpEy1HT$8OJH +zR{duuI!sekfa1~AK(#>fVK1mr2_o-})*(KgqBqdi6RIX#kKT6^N-CG=*(ynbBwPg1 +z4E7MG4h@>PN+xxV{jV$x5p@v%36W*3V9V^WcyNBVMlOVs#WQjg-QKSC*J9h6io%z8kDcU{NSB9~5bRhkSy$8;eLR4YN*L=vf(I{LHD4#n;3ziEs4cOC6^OakytiGQ4wpuKeYlCVL1wzsHq%A +z8|+7YfFo?4u}C}^L2%)kUf|~vz9Nn!V_0knC)a6r6Osm7Y~sbbISHVtnOrIpNB~L? +zT&6&t2tOkVik>Cb10e)Cz<7lisp(q_LrCyQ29Ae`%eb|Q6$c}@B#hwDjtM&^h*7+N +zkBJ9tARMCu7QN88B*v-27@8*2(`?uh_D6dfg`z0%rlOiYYsPd3hW0tD~5RpCL<0O3G!zEqN9(?alMK8qts~U5>SqQ +z67w?Y8jYQ>q9Jd9K#Ip*V>HJN +z1)?ovbri{1+nH${Vz%3;k3}>_hA%tIRqKRQHkTwN(@RYhb$VpVy-bx|LA%tyA*He3j1-)WZgul(wON%U0$E*NMn9unE5 +zWGV~uPQCG?xQ|jy(q$YZpopWIgbA)<##tglZp>I-a6}lVhUs)LFo5+FBJuLWP4{XE +z_aunVASGYVr?@F0O(Fr)h>lFJ2qwiJ&1zYViVATUrg#W7y>3+mUL6>&fN`UEW7pY& +zo$z~*lI$R)#S~vf)Kl(?#C;i2HSF?6?M})U>_~Ojf=k4+$+#aj<|aT9x;oX!p@0^1#3?MFngQu=(qz*E=r(J` +zh2V^$Y{X^Aly<1Z&L49L8M}^OT$CF+W^N;DU5yC+#tAse0SFOwIviqKlfBGdz|8OZ +z^n*$P5eJ8{nRCrM}63I38epjk~U#<=r7eLz}Ez~zM)cZ +zQ?ganWSi!hfe*#34Huy3hGP;9OXT|DV3lhtftJ`CmGB +z>6jG%=k9zY|L@=O_m7MJDslRrnQ8z=*05tjlHbb`uFCL{oagY>UsI +z7Uo`6G_#1ttplKAMpABEBtrw-5#jt9ScqUYn +zaW}|x89Qzi7hx9UI}7A2Imj-DEfCBku@!iL{;=shN38BANfu&F_Zww&$tJ6s09tuU +z1!3wnkQhl3OQ1{vWCLl00RYi(#e@JWM%5}|9b#@u6?1}%T(g#WLj)%r7@#-d$Q;~p +zm9e3)A2X3Sjq-3UgvE!J3?v@q(9@n^8cl?IWxH8ZF+PmvdG?2SiusU|j>FU|By9|< +zG}(?EDe#MTZKG~b+FrHtCxw3WdhhF +zrd;QIT4J3Gij;I5DV97(Ig+pWR3lm*R8%Gs-f$;o#yH5z3|qe3l7*C~W%n4VK;c&o +zri)mu5E1CrS%GXYWwYaQf#|k;7L1@9s6rhxKp!$IP%b$id|IF!Sf0>u;CGQul^+Ke +z?Hsv#{(d`-+Vf0x8?jefhipB)gh;t5 +z6c$QN2aAJH<0k5X2{ne#nLH)Mu#%94_trJ-q8~8tz4&MJy_S#z)Y!ghusrcGbcIZQ +zltDC$C{J)_yfQL2i$@+GSAFB87%YjtVRa~g3{L>=={!+iCA^1sE0}K$ldbTx0B$fP +zlOF=(;GSwU-TQJz>Li60Y~+R^l+fUJk;sbQ>4njBDv8TT1F#QxGnEk;E5zGF^2_?^ +zzewU~f$l`7oz{UJuSamJ6_AX*w5S^ +zE`K0UODSFmsxmwM_o1!riJ50!94s*bo}Vb?!2~jX!;cq~6qvRn@u`VXvNIPXl{Qg> +zs&Bgp=DFcaMHhgb9KIeWi%AgvaLT*H{hV3Ce&p2a%9ds0Xmb>#%kHjS@m%XDmyvUi +zQywz3AfrSLOZYl$HN$`|Z0zvVP6aR{n*)VHD8$&u{)9*XBsP;4Q7SVrN_)DLk%86X +zrr}q;VVblm#Y;0*0S@>8xXu&tF^Ph0@_=PMYuLYTvpf)Lhd}^R4co&d_s1OJv_%a- +z57@+#d4HOAP=RF&C2uTbACgHV@#6iGznW*2JFvAqXv$AbCN4Lp6L(Ei(izhxFlPDx +zmr4#3kwE%~kWMCk;LS|eszygcyfgL?w@VcLlk6PHW)95&At$&O-0!R($N*J9s=p(` +z@t8zu;$@RQiB*`7b#@?{VLX_OGwyI&EU3b~(um?yp>z1vBm|aGR%D29(T_MLGO$@D +zx<{n)h!VzBERdI0i&s>zl{FOnN+rOiU*aIfw8%NpYQ*h-9#lL`o15V=YMyo^M;L(i? +zFe#XR07nxGhg&mQ0sF|hhZG+Ow6@@Wfc;8?={j8G#p*(97$cd%N|lAKR7`(!A#hhV +zAMuKea&=;6JOa6B!Qc#;z+B1kUqi8gKL=G1V(M1T9qoiXwwp}li+G;59P*$t@gCi& +z34On!VK4NAQCQFu07DB~CX4}em#!G^p^lpjun*5k+XhOF|fJp@$nbF^* +zfGqnNU^dS&+nX{cW-xx30iDQ*M+0a`P{=RGE^+I*W0)EUsGgu)#w4zBN;J7!H4axF +zDHAx=0QVf>dlkKV7>A4iM`FWfOX1GS$^borX;@9)N~bIvkQL; +zNKAq^*nB`t(EvYNkw}isd!IlUC%zYC4v!`@!LuEq2NmFC`=|{_+yki=(4&Mxqd`;i +zMKPNWwZZlmV+G*|TEQHHJTX?HN*nT3OS0`f*pP$ANg>+*ns +zM8}eer3kJmlwh+K+}$JXckF8oM>gxDJx_vcOBf<9=LaC85v>u^_>8W>No>j%Y=lpv +zj#~{L3W}5}kqv;faf3JVb4y|yM*JEh$A2u+(ZBGH<#4$gWOw+hTn*~F|BoF80H8YX +ze>!J(=$Lr_pY6^*a{vE#{QcwZ|4mo%aCLHk_&@N9>B@iDuwhQQS2SFuLE2y4B|ygj +zl2bSUm|Oja-}4{2=Klv@^B>G%^8e?W9}N?SbiyYHTTmgt_%v{Ua9=t4RYN}FGRU=T +zzyTR(K-`Ty0SyRb@rjhzQ8EKT$^sGyEE*YJ+UIm{#vN1zPLM8h6JSRYQV>t^oQCpX +zo&%;Zcq6;8O#A@rEH@g0*hgxYhfhJn0i_&nMTDl8gtQXEJ_FEuj+{hZYKUhDr%*{0 +zsPJ@PdoUa&j}IsY_7-5fY&L@IU^K{*Takj~<)M>QlIuz;gsKAvq%tw1nh>e#LYFdP +z*fe2a!uLvwho7JLVl+Ily3RKb2O3p=-@?I(-NwKXCS-=j1ICW?_fdbSO^j#xtRf-5{$_c(d!Pf?d +zV@2sp2GVVf(b~xo?mWa+%^Q`f+XoumO|-TjT^Dv)D(el0AyxNZ95XIRYk$MV4Ztah +z5T*=kGf;fr!ZJ%R^pN6G{(!F_-s5XLtF{Erm^dX`3OFjZqex^0xrEq*rH&L%D*Gp} +zCCY32gJ4BS^r>RcE%tY7{JFqVQDc&E3C%boTGXQfe)nC(p)ue{aDs&B!2+=NNYP+* +z=_sBabG_!kb{?WlbH=MkoPEh8JsRy7!$DA`V&gH>tXmh9UX{$R?oYIS!o0zK6pv)J +zgy*B@7$Y;t2Of%vczig;{ +z5W|eYN15u))Bw +zpygXDDfO|lp2;>4P;R)(x3M;5&jXnQW-1+UZ~^8@Wr~f=r-gEuGmTy<31W@uVHYj^D+5JOPphhga`hhhe#WgCJ+FmS`h$<{!PK_$WO$?(ys}T{fzSM +zTo^!Yi_R52T)SHLU}oLH+Qi8t0{C@rI^K+_G83vq&R-4R5Vqhph#>=a!F56@P(pSE +z&&X>Bys6A@GU7E;r=4zt>1s8ggeo|&gIyBUbGsyxF@}UEvno$42APNS>4Fl_1IFU$ +z?$%cs4~-LdvWzanuuSN=u2c!jjIg$(Cr9FAS|fgzo2UNo1Q7^=GX{~bEFCaZfXhH~ +z01?7Oy>Rd%#v{oV1~36eLYNyO*?wZRX$FLt!Rsp}8J%y>a!){0^bJZh09Fj{n4^yn +zy*hvog@Nz*5GL7B1Uh87VbMEeWsAP)vW>XiHg)LV283WjJ>xJ1HRXp%W_bzuVWfm~ +zLN&v;;jwPUZevPXg!P;)3g0y*!NA;zr7Tm=VsQ#o;mB~P1J^^q+y#PRqT4u+L!a>Xmt<@%B6hT&4chm`tk7t4zY$A1l5jt`K +zuj2DSKvJR?^=u_HmyFCkj=6A|jumukKNOvVMK +zZ@YPd+3eaytL2s%#T^8y9Qbh}XHzCJrs9$~wqokp)LS91bQxn_*r7=gAWEun*(tG{ +zV4Zf;?L#Vdkq=={+}a5sL>w>6uw5jDG#(7UsGT9eYbE^l$)d3l1$cDz$%zAnXXbEC +zmCYinVW_4cbGHO8@LMH4l2O&b2NtX3u@DuWcm-YZ0Ey$ehvjkL-bu{zBK>Mo^a8EE +z{s|E61*?~0JIDZ#qZ{Vz{R;DYBZ^Hj%SeG{%H#0ZUKb1QW{tqV*;zdFr;^`&a(TfL +znIV*|9NHzhtS{_?Ec?kOW-p7gX>p&!gxd&I=w|=R>6o39?UwrvDkFR$ak~q}^CKR1 +zT4uUk9bAlEJ0KW1U6vgsY&-Vz#4<4wE?vAf!p_JcmLaV2_EAv7Fi^L%IvEXSb>GLw@x0x0YV9?EtM +z(^lxVU>JonQSh-x21AjMew;~XCuq8d$D>vUY{Hg6oFoTjw5kKTCcopB&|Qd|AbEfZ +z>ZG0!zd2=vF@21A_nH#Vq`E1ANwBg}eL6~kJ>#V%Pnp9g)<`6yMs){XJZFuJ5@LS| +zZ+mczgle2-(G%}Mx%o&U@lFeqnJAI1L&S?Y|D~?3gJh_3OB5Uw)snuo4Tygs-Psw} +zCo6FcoZp@-UC~t%dO7G00eV(l9?H!mK(Gua^qI2&EyrYAk`fvg#wA^XWW?NCg%Acg +z(G10l3M6R*A{4Iwl^8p2zybJRyc4oI8+XYve6xBdm?r|}fsABH-P4Cce&#Y+49$1Q +zr03~@eTf&!{O5Rx?T~17gx~#`2}T&W$us|fAo6fQ*XV~>I2;%U*b%6pK`^G2EQRp{)W1LAf1<38YhC*x3|Io@U*S7H +zn+p!Ryy-Lv7`g#J8E7;XMq$dB28*SxE?Lw94!B=}DYTXkRxL(3j3oi>KtPs{M^^I4 +zD6_qfb8o!XHgyxl2$M~bEIdFQATXqo7LrASI(iH8gvn*~f5+cH+5f-D#KeUD0dbxO4hC3OFvJM}Udb^4PN~R5;;AD7iYzSn9~}{J +zBqZRU91`#kJKSpt2{3o;pb1is3COeVAQ5?)5UlN%bvFkHu?9d1u(lE&kwD7<;05&9 +zV6rZ*Fb~P(L94>608AM1D0>|>G#)ig*B^$PGzY|klozI_;O^lIqw!OYC>|de?E=*@ +z2lS%|hIg0uv=CD2-OAJCfGfffSwB)2@xj3eufF&YHZvSdV)p`IvmWI%CsJb0nGQ|@l!=J9R +z8aQQulp)p<^pddV384EJPe3eCR}9=f8Lx<{6dFH*^KrC!#WIN&FejIATQYv-fCNFt +zn86GcC8QZA)J*qYV4LFjchC!PVu@=ULsCOXCcLW(Rm-Rc85Unu3u#P}MyfUTHK2}D +zfK~zoSAsFN2sPjdX;okXFwiP0JLL7&(b@(na{E88NhvQdr%bZb8GJ7CnNtZkjfh~L-enV4aQ#-P-mK5|Z +zDlsf2l7M%Cp9Y$La^fX5SW7{Rb;%MK;gIQsAQVCk$-!#Iy(5f900aZ9h3%lC%(xcK +z#QV8Swqr4=7NZ@kvK=C9rtS#zBk_GE&PA14YOwUz1W#XH+(iNnvA_mzlq_rQPbQk2nr$uSfn+9tL|J~L +zJH4dG{9qQ(3#`vGK^j9qofI$8^OVX+dT)li +z8BA!IWLinsfpqsyFOh#|m4Qzb39z#Q*{NPk3v=Qz=lCuPkwd>OsF<;`1o(}IjyFyL +zh+rE6u8Ofw3ZyQZphm+XyzQC5&MlB=G~M@$-1o`lgB&+fmB)KbN<);;1^tSwCQLLD +zc@zVBjmF}U9Jyv1G$6}rqegQKlDJ#Y!Ewduuj3=OwtyqT1aS`n$;6rk)APpF09=Zh +zQfeecLh!o@#zRw2E$}ATZo&b{1e?GoBNmo)*f)PQQ%zK#Nvgo>P#vOJfQxc3QIo;W +z%)JRkPh2QieM|!iS|jx;wc0GMIx0TAV?8)01;09lr8f@oRYdL(U<{0a|DXQ;-# +zLc9z(tX~(=jNyx2gS=Mk5|euv(w)A^T*iqxRG^fVa)3Ymv>c{SlNTKK82QH|;&ii+ +zH_m55&orS68ZdQi3n?D0S^%IL_@{(-#&(sGw0XIRs5@J8Q+0xSIUpiJEFd`xSdu7l +zN)lIQwea%OBlMQ5n;geg* +za~;%;%J%QIg8zGzLkC=h~C(OVm@;@|EL@Thl!~YWrU!Xon86u}l7eZJvDH4P9!ROWt +zAX179AbRQ#%5O|oygG8sNc*2-hV*bV4Zs5F7SI9-tsIt&5T?i+j%HD+hv)G4RMv|L +zs)s`Fy$DAy5|{WqAxXzDFc4!{-)V3A!(g{&#R~{Y9aRWE+vZ4HSV_|=Qnp<%auP5l +z21RLnx=a@bXw26w*ig2#bRauNz+5Qx#T_5{$Zz%&MMZ3N?w +zlkP1reKug}fR##L>;kL>9H(%ZG##d0Q6RH$5d73Ap@~)Xc1fiQ#3|n9Gz488rzjDT`hjcI9PR^g`hy;DG15$9 +z6W(fiPz;d+DW`Fb;(M@*Ixuhr#F4Q*L&HM+4&8)@vtJz2ovuY0v7uBE;zcpX5r~zH +zLeyErL-rzogWWNiq&wv1-Wx6r*#*qg7`U3LZ3I=(dKp{sC$J~+(qD>ep +z)fZAK*x9Ti>WJCcmd`I6&_O+hv(J|kZ_5G(MhAx;k%9_9f2mr~CFdh;7dUn74ik6> +zjRK|s2-RCHAUh~VN_V(NU&iF{L&lvc@KE6?z7eg+l($DO%16uNG4Znzqi9J!q`v~p +zJrct==%euh_rR4nHL(@u%T5lI3XCz)We#0{rI?Z!UkN@j;;Y_yi8}A(F~&x(fTjs!r&?z0S%FK}pb9KE +zBVeZTqDF(4k+cSD45Fb)KskuCGQ2&!Ig<4(S-`Ia +ztsBTe62z3VJwgHHV1{D9ahL*Q7xhs?WI;3HcE~*y?$yG9ICpqPPh=EfJW&i!5wU+V +zbpyd0Ojt)izMLXuqEt!~Cl?I?(T3HnaZXD?JOqDKgi8)lS(5%3nuf$LA->~u=;ZNn +zg}iX#DIIL>G~R9DK`oJ^E?EI#FBr}1@sKVV{QqTBHWIYGvL!P2RTB8+dZIhaB|w?^ +zTHVhi3#9y5Sfwar_+V^Ry3I^33}c2N^H;=I(~HIg>v>Fi4=&YjQKBXvV~XZt6A{zF +z4UMVBnKuv5dW{jTP=K{M`4LKhi5f+n3K5E5LeF{-8->Zc0c*Z_v?)XSYX_fca2dczG1SIC!(@ +z)bFj1!HV^UqS!f&H3&*i2yc*Os1vE5y}}kZ$hz$}?_RuVrcFUdr~)EhS*3`l1;79= +zgw$~mK;nV~jG#jC0BaSXFLMkr +zfTDcO0OTmUz+6YYYK*R4C^saqUk#(E?bv~M#1z*Eyo>}FJDvP^(N_@;`^`d1jd}Ut +z`kbv|T-7RxsldvBEe3Usr^X(t*gY;Hz);a&f{&haVZ<`6ReWHFCP`HAAyMA3LMfOlN+CUgFOCwz +zy6B^6#0AJJHH?JtB#d6-z&*qV_0e-sS6)b0gm}l2o99HB$AMEq0)B%8M2V+u6BDOV +ztd~A_Q6-3|JEqCAkV$dKx*SQ2h^K5!JvDU-mVoqA{sSOB6*vYK#`bWP#Fr3e3|oSjtK5QW7ZkUAs@gdntPnGZ{T4p|67vL>sLQ&Am9 +z7CSgfNcmbs0ad|xO?)?R^1q3GQoK|dkAdBfUg2M?1a|=RW+Jyj(uW1$mK9`|Y3U-8 +znCadksLq*W1HvT~u5G~QHA)dJD-rOCWKx2JwmApLH@bBeyj?@$q)W1LrGt94@INMRRh`wW0IZV&4tOz*ffeJM3gsb#PY@mMY;LeF14gI{GxD{I +zaXXQ@BX|N+J?#hrN)jA3$KX8kJh%pkyJC~5rGe%lC=WNOBBSZFd*o4#!<{m`RiVD+4q#o1ZV2lud +zVf}-bYrypeH8t)(%xWsDFmGsYvziLGNRFX^8VrgbG95!jOiiCbUW&#(=A;7LaMuzsxy^adj%<9;Q9SxL0WuQ^D)%r-bS!LUswn +zu4>4Ll~@iIkmseUp<=Hh89K92kadlfw8&UEsQSpAU7sK@V0qAl28sUgVobujE*;Ag +zCRZ=6V^j(rkAN9rVG6U_H{f6}0d#Tr1`mk6LJ4R39AvQ&^@~gsx?!6uz@Uhm?nfLU +zi(X5fiiA6Ewzxwvkz5VHz$g=fB+{*6LNyhWMwkwD!y@Jpsl!+``ef5o20a`=4qW&> +z)tbajL-eZ#cSvEsOz9^ni+u<>#h8*B^~HnaqR(gr!MmV4OoFUr^hntlBbd*@XSo&3 +z4-qL^v`#o<`k=mM#jMurcw1R#@MO=HBBj)f(@8x5L-&Y6sxNChay +z^fQcpWIG7Q$X28HB>~yQ=>FJcVAHUw8_#gvMK{oqyouvG%plE&&|;~$i$ +z2Kha@v9b(#Cpcq2XJ)YfFZ~lP|NDp +zLfK}$;(%6`wuF(JkT0@+=UVGFOQCZn5DIP}Ji#R0C75#JAQ|vE7gv~xHl6*WYl(P0 +zo+N^Zbh?CeG!=Ls#15NsJs&!>D{Qg4k3@&8Gc7zF-M;;CBM);bW(hap!k8puk`#k= +z3JN2^j57_qezV-a;awA-kd(w_(Ui3mnzGEV_Rxey%#vF=1@07+S@k&q7HUEw$6Ik> +zfRwB_vt*!_xteI`iL%ZD1#iagQ}7D5M25_uO7VH<9|3bp^%<&+sD{xE}7%AupgVP`A?9j@4z +zg~m@6SXPd&k%4N;#sUD?k{WhZMb((%FjcMVo$2YdX?25ue;iJ&4sMY1xSz1__cO&F +z_gWM}Igw`72duVawL*JK}ajPXM6X3qw@3got +zn&Y@}EAuRTz*59-<>IG4{1?l;HU?PY&)~L5xZ4W42SE&-5w(r_gYerE0AA=m07nC| +zSe}82&j*+BMLSl{RKqcqqvKk+&5?MQe^I>45x}Q^(_bC&KNJ>zhzX$U$p73aMgC`Z +zmm~R~|CYaha{LcZ>2*K}piMzPJpYGNrVJqLUo|w&DGiASBL@7F$Q6yTE{V}U)B!r( +zjzs(%iTL>+i1?wb2Zuz7)?Cn7p~$(TXM;wa4?TL|=Y&+ai6}yp&k$kjlatbsy=-7>s7T{6FfBvc_IM-ad8^D7GYKqDTq +z#gkaF#_H%!peQS&=PF`0)t*Z@)eIh3GGW%!Y_~OYMvciYtTE_(1`h|ZprU1`8tr*} +zZG@85nv`+%;IYUojV0#OOUZ;K1pNL6H39)$z$ReOHq-!MXIqWk?5zaGDXTIydSP4P%=LEHA9_; +z6m;suL{6Lvxv5z9EhS`k15^s?7kNDB9m%T%!c{s@m>-OiWVAqYwJCc6IniQ9L61fY +zf%a%M=9J=W`^J=m1--6gztPXNU|;K|98CoSs|xqIz)biERllCF#Z2T5$o~Krr-b$I +zu%iLRpMf?Q%s!p&Oe_N6Vx2phe()=G{E%F!l)yoJ)xN-?+G^_B)X+q#O%2a+Qv(gK +z4eN_dbkgO~fo{@DCh+hq@#g)CEdX8P&IGf4m9><&S^`p{93ixIF>@Xv$pB~}<#<35 +zccKvyfCm1$H}b%6m7cfO*~AYMtdIUJC=hK&W}TDrsh3| +z=@3~1`hLR)Y&)@MxYsnUi(xjn{n=&MeY}VA1h^Br5u8AYZcQmU>Ds`OZm#B2C`HD; +zB+B#ftVOt?75I!!-mx&`X~uw`Xk1*7cqt<=ghD|)A9sVQp<4brPuj@er^c*F0KuKo +za%o|&UVi%L;19VdVu-qdl*b)SJIYsKx|w +zR*@PXr4XnOfPxB8-qB3Cb2NUBh1u!Mf-)D{qWt(Z39m>~{GwT0X_Hf|hfB*f&>GAc +zE!$r>XV^f}oZ(ZPGfpvwFkQw}dA#8$sM+Srbv-5qo0KRCGc}2`VY!x34_SVzeKMed +zq`APfgE00=HZF+jKBy@%O#^v&6TyT@?NaI%u=-)^h7?4zL4DFQX;)ecrOc(BG{?eA +zs6x2pLQEj{>*9%P4^X>G9<8oNa)X6I_@*x7ogR7t@CZ;CA^LlQJFb&rq?5@B!kZIG +zO43P6P8@D(J+CM+bDSQ;&wf{ZaP>?{@X%2flaQ$zN5mlYOahGV5G%?wBb}B2W6lk!nsH=7SVOBJi>%%ErS^&!-8UbJ)4BQ2_0u>8M|&$h}Erp%Gp# +zQOOF$4_)G`b&o;=NqZC?Iu1mOGN_2HALGoaEge=~%+WWh4`q0@4ox(WG(7PG$w7y9 +zdT~b?oB-N|j9NS)Uv+KA5E=6S!c`@eJ#pOl6bC&5KklEdoRa6p^hHJ)5W|Z-G%j)q +z;*Y_w6Y!wItQfwU5K0>kK{BflIuVQDR`R~2blOQ;W+DeKgT{2;EW8XW!vQ}xM?nXG +zl}jo4wnYf^@i8LMMO8=)JKeC@Isc`q7bgL$@?{W#u6_vxp6f*i +zzNATt`u^)*5?8_`-nUEKl!gN|8KL4 +z=E1g6hyQoyF4-Lu^FL&n|U+wdVB|4X@rMO+BX7ZRh628;;Mv +zz1byOKA(}ZV%{Yyx^`GG+Sw&MPE5T +z+dF#b-hB`MxaGsUzKQkfciYDIC++znHu}|J3wCUHbW-@U`AxT-cFDAT4c2cw{ntNF +zzoc!?9&g;x@T-bnZ?f$@wny`O@7dJ1{*N90=r`q(qaS&-+Xn@ajjzbl_AD&Tz3fk0 +z{fA%dlQw?EQTIRB^0}(%lUn(96sNWRdg|hj&;0N#TV%tBCr``SFs13{(=NXF)R&K{ +zdVR;YBcHr@>cmyvua}*A->fzbr;WY!xBT=*wq6&{-7~+REpvG3tGhmZX5Q0J&n(#y +zIVYC$*&E0A2xQ;h%GYYkW5X7F`NbE*owGmx{PTJZjvnqjY3h=DgZTp*Y`o^t!ra!U +zzrQxnf6#T$&0Ts~Q|Z`_y?g(4b%!gArwoCu`?yV(DmNdh^ +zEz7REcE*e!mFFLA@!YzvZ*`5D**3j>`~FQ^`4&~YfA^j}dx~y8i*@Ma>-vm2XXftc<-fccem(&a<8|KX|m^L +z+Xb`j??ej=3rCKe)3#`HyT?9WyJ}U76HhEm8-LT{_MdiKx%-s8&#v#Y_XXdxXX7AWOPVwZ9^d^*-|h{&o2~Rc-stlg +zqps?)?czquPO~llerxHU`+oT?=k!hMx8!{F=ZPPzTJ_^+RU282>C>OS=%*d`-Yd84 +zp1thNFXEqEo^w~}+Gf}6ZsohR^N0~6jydL-0RslKbd7wte_DpRw9SgMPxFL&d5mM*XQ|Z=Z8|o_yE!Z-4*sJ$nPMKOg+Xy=>^2Lnob4y?ySjdyf8TZRU>GS`-%b +z>o|GPTLkQ!vQ9S?Q5$%@vpN+lz>E};;Hhb1Ae|hxnko>L>PIuQgiM>fVJddd|^$J$U7n +z5B;?Bh6YoH%pJM=#p*U?6|3hCxb^w)#?hlk=T&{P{*lso(o0o4hlg`MyEg6PxzDf8 +z39MN+XwdWjDL!vn({0x`Yh#zB^QPaWjagtjfA*h0Ex0s&`uDq@d4I(nod#^}vG}UI +z7nhv>;DkQ?((bFe=F>aw9P#O@*onTCTi8yrz1*Q<$NO_$Y8blq-dn3)zu?TiclCe0 +ztm!GIJo?Gb=RTP{@3IdzJi9FOiyyvsdhyZO?*&_Cj$S;z&vi}fkGD$ +zY}qn2G;y+t$c%#&<}5mK(S_%<@6+On#se~YwQ5~9W+R)Y>R-QI>U-zj{nV6Bl8Z#3|Z7K_K`FTeb#f-Rdb +ze^Yv3R<(WV2OI0jd3pUFzwMiy_kJ?PecY5STc*AilzzVcltMD}p0EDlOXZ!} +z*Zn8=0;Sui`$xC>)ZM35oAV!<^z*F8$K3Ph$HUI-JmMJJ(I0pQPIJGr^w+JYH~gsO +z_cyyGxk1*{CE=fUO?&GMN#t=%iG`H?UymFP7U==YY-{wRk7la +z?5@>Qnoe6>WSf8H&gHk9J?x2*MFR)!nz{Y4Js7}Od;Egu+GXzU-mCetqvMTYH{bWhEAQPlReS5J4+}P2G;YI>+rPVT!K&Ow +z%N~C4i{)#c+WqXaL*{K+`b$RJw_0^Lt6ke^bI$qhohi1-3+CJAN6)|Df;;ZK^Reay +zSuYNL>DBYrG{1b^x?9HV`~KP=fBfb9@0X{2SJ1CG{p%BUHL!VSl=g2nGwr)f$HTX| +zeS1$R-W3YQub%t)Y4sh_fPu$Wf4B5}TQFzT3m+`K>*4eE{W!0>UcJ+2tT-woxAl~q +zPuw{ch)m$yGgC=ghcn@Ty;)il@1co>elV$+WLF +zUi#yPvkkN)tIj_5P}0BksBA!Y{`y`0PIK#?yP`j;vSzzT0oVeePVw9$mMzEqd~S!Dmii +z{m6Chi#A{L{-r-Xc4>pLGk%&i{XI{Qv1ha%)}Yzk7QWnND?7ZuYvl90I(YJ%kB+a% +zpV#Kk-(MYY$=;paS}Yy>NR!q#w(WKGlabiPY56mIH{CqzdGE0cUVY`O&#HE}ShM@R +zhtr16+_mn7%&e@)>(d%Pded7cY;1Y=b*s<&t)j=eJzH-*YG#Xj9gp8x|LdbKYal=M +z_5EejGOxbOH^aTmJ8Av+JKK5+pIUKuZuG6|f6q8+>Q{@_xcfEFyZFV;zis>F^zOr@ +zu~pwRS?XwIJ8JB-+jhS)Y0Vjbo-^*(Z?g(L8y=W?Q9oO8>$K5NZd@N&xbulYpMF|# +z=6_!eKeh3)iy}$g>;r92M&s~4vbMHLeq-VVkJda;>T%()r&41^?qQ+w` +z{_ffjhTPoh^0EEBIoq}l-M#+&IX7!hEn0MLlXv^~OS?TUH?NIvcr^O(DX(w+?3-0h +z>c2QCW6{pv+izRa>iqfFSO1W={J-fpwe3-O-{h{}-8Cxs(e@e7l%JU~@;1it%3{wh +z4Xi$Q`5kuzwyhZT+t2HszVy$9Pd@nIDXkl~&h@phwY|pCf9IRmOnv6**+(CB^3tBR +zo{v3hpXR^)`4`SkyX@1)wb2dFKdJMHH|+SeNwc284<`k#zUUd}Gu?Kt|MjO&u9*47 +z#%*ifvPs*Pzkg}ozOA=bJowq`VnV1fO_CVtUMyeS3c&H*Q?Fw68vXIsMtI`<}7) +z@i9-{;Qn%bvsRUBUix9v{1GkNwY#ch`I{4l{eIu9ce2lH$jJZg(s}3QegAfg{_E1} +z*&cM1&HUrI|NP +zGZpWDv-Y{i7BBv6z(<2uzu$Ptf>$mYyJcCMz1hE;yae85=vdvm(JIJfY>|LxlM>a6Q*%dTwD +zXvISh^|_&ydq`l*;@e)jeCpH%BVQ^RGUUeDv%lQ@WvtOX=S_L}o56F=Ik&X5L&b{I +zcK>oreEvfZZM~*lUW1-+(ePD{aeq_;aU*5Ilt-f7PE1NcBQr~G>_=dD4GoJcn +z^qqI!eRpql;gd_oA7@)xTD&)0Solm^Pv+0fzni`;{OaQ8pYNQRS-f-uBZVupZ7T-d +zmgV{UwadJF7H+(EZQpvIZ=Y8+Y-p#Z_itO2+2!Te_bGRF8u!)rTeqYuIj4V9(){HQ +zdZw*oO&lXPZqRt!jHaVTjoPx{lIPYbw|(LEX|1AO>$C1_(d_c{;P2nQ@%tHy!NUZt%#vvHSBpN^i``k0>4_Vp(>YSm!d^|NMOy)ImAv-NtS@xU|kyFGi=e@d6uT9=F^`lMSe)4Mh +zt+#yqQ`aBP{czs9bGi +z?#JT((osX^Y&r3gwjcG_H~x$DFCD#Pea_^OzrWD3vvGnRar(JaHoCdaQu4}St^Zga_l_#9wt2cIS<3VX^FgSV3b*FvhTyx&F +z9j6VcuKsQH{1JEc**N&MQ|p!OedN(ccl`R@mYHp<7oX6!@vxzz_I~@u3AQWuWq+rw +zsCVOsj(V|zZ!fBpY_IuOj_PsqoA#{0+Oi>|H?%$JvX&=h7Onhl%UfrkefE;6c{@Im +ze%<%`ZlBld_4yX3#oR6P_I%ab=R2YG%J&9$`?jHd%3GU;lpVW4UK5zUZs6u={m$F@ +z@$q?YH+cWro@rBWgTGeIZrYe0%eOr>$=SaBDLFC6#HMXF-_h1{)zr}1GTXg7kKcBG +zPQZ4rT{_|7CmT*Yy<7b$OyIP+7LESav-ivQHoow}J2R){`mSuyGa8Madv3GJ*BdOD +zG~m{~PhK#8`u%D3Cr-KkoGZhxq-V5$w6NdCF&~W?+sO9)592})Hty8*-uv#G|KJyr +zZT!j2woQ5Jn?HUVaQ^vcesKPi*PL|a@n^W+iI$d@&Uchx3ve;Df{-T+EMn?Wer-s +z_So#rjaS|4wyjz8+oXBYo1cwoc<-NkcCK8uY(nv#hi$#C{;&W0FHZfopDn&QYr(qn +zJ6*qH%~OvqUw(Gl_B{)Kp4O`Ei5K4g)xfH|2G7badi|)Qo?}|*$+iY_?;4oCqMq-O +zC!R>}@2FP;5X#hf*_DrXh_dc&pNzhy^B +zn!Ebb4#z5U__nXnKC;=GG-|8<{57rp4V8~R{8jdpfmeTVew#kFj&0xk^S-Md +z%3Ahbd3v{no4?((^3L>UyHySu`f+#PvOV+ezT^8pet4m<_pb{lW;fk2{LQrc7)6hG +z=B%@OygIAt33ETcw&n4@-j9qdi&Zb5HGFpiCWdd1o&CX4^)9^d!amoXvh^0*X|@&j +zyjuUYMPGb3c19~-vu69kuXHV*{m9_H`~KLr>y4`}mEV+SEbDT^(P`Vy*~U(SKi@e1 +zhnB9>*a^wx=4P8V?K`@GXT}T9p0j-U9moA=(UZzM+aKsVpx%_GJ^D|+?$i?s@-E#c +zO&ncs^UI$GPC72TWycBmQ&c8B78d3Y+w|qut%F`U=aX}`*|U1jYqR*a>P@E?&grnC +zS?f#Adu;NSW$Ujy^@guvUp|@D;Ww^bJ}bR+)tqCFuc~ibwfgyA&l!`pWag@KS3gmlX1m`vtHd_& +z>f5y&l?z6F_SKv%X;b>me6{J(pEdbU(+_(-_gu#3pZ=I}fBBZpn>TOSGU|h!H`(s! +z{>b1*cfR;}3)?BD216%3HloR@hkG@g()8udk(<)zE}p+Iqf6(tw%6WhvDh_r?cCE^ +z#Gfw&9slFFDVKJ+aqDS!T(JA|3nDM&gf`xJg7e|$K5l*gn#l|Q%=vcN +z<|vo +zTkz{UF1m6@lgl3{DO5MD4|Uwprp;8Zx0l^sf6!UE+n&Dv*~s99x16y3v!-n?c{#du +zIjfDSIHQ_w%_to`d+W{ZiXWOg_lhg7sQ&H>&x~oCKIwb&fa7iK?45brIg#xv-P2z` +z<FZuo9g*U;|Id`0*ZJgZZ#4Cml8#8(L;w^VfI%moNQb4W0+v`Ht&N%Jc&!_q> +z+4Iqx4?g(8Ydsq*>-U8;Yu3n57yj}`qcgtvc=hNdYreSCcgthrZ@4>cO4AF2!QAni +zr=_)DW&h~ZdTooc?|g5=`1Wg8?)>kdpX!aB;TSq|X0Oo`J^zorD}jfqd;cRUCTS0? +zW3*6=r6PM-<1Hc;+Ke$6&B81xT2$I>?RhIAZ3-z%l(bV(QfLv879^#zmDK;7d+&^y +zv81>9{eS<@|Lv1m?mYM0bDn#i=lPyYO0IXBZVahe*H*iD-MUA(i6PkohYizQ9&`dsr# +zd^BX)9{rRjYG2=6I({-ZbF|!+g}u1ktO1dllX5JAgQ`eNQtG@kD52BS+oHcuVU%6S +z470R$vVL0f^5e(joT?Gt-U+5V^hXuBY0;mqC}*UP*L?lgTAg$!S?|G-6VE&WajEe9 +z!`k|Dy&C+pW|`M{r>aaXk}Al;rH%=_kQ-$k9CbadSe;yFk@GSmV|~&^?GTQw^acOo +zZ(}c;`yD-UCGVsHTBfWZkO)|K +zr9QY96Qd)C>Mm02vu>SHpzex^^qH}8VSZ}+XCL3XRl0fPxc7-6A9>!Ef46?Bw6U>K +z!PUf1k~EUY(T{9QOq9dj$|v<5*cvFeX4&5s5c7K1{dSf0Yn6dZfLJOUT*NNpJ5MN#xJ8 +zAL@K=|6K{n%?V*+MjLah1Fvob2CD}At7MPeI@5Yz12ZcYOB#!DGip@7WGEO)k8cd!V}In@&9IPLd6_G(H`XzSrnYJfGe2Iixqox` +zh-n2L^Fl3a>YoR%`})GkHa{CwB$?iKu4bQ{>RUTM7=Ij_GwO(?Mfm8Es^54IaMP=X +zhm2QIiMwz?pGb6jd246Yz39s;KU8k&C*SnGyu6@b$F5z26%}PjYq#a^nCy6GPgB#1 +zv@td({2X$}%an2KY?dxnG_?#om??L0+`(S;w`Q3{#0L><>UK{YuwPf>_VXCaBMs@7 +z*EAn2e`~tc_w>A4*TEY`%VnxGlnmQSl>WHHuYb0}wp}W=Hhw-do0>>Hj#SRz!Gkx; +zDiUw7DU>5m=zXR&7x!!GZ8sa3j;(FeyU0NiQ?xgKzxRDq#wx`Rq!Vcw-{r1IocVhf +zi6Rk0qiNw{9_@bPU7M%jDKTr;(Ro8Blxkno#a-!bRfjh}u-W%R<)C*_zWda#Y>^wC +zo0n%M-G9VXuQx>}iB~30o$9#vQ{*R-p_|LiqbGt)UMAetW4pJ!eX>zv)FmkuVi4}k +zh!d|~y(lFvkvw9ry?=4(*wN0Zl70K+N9r9dydSisHH7u*)xv}YiWF<}De*QFM@L+%q`t%>M=itFi##5aP*` +z4p8?8-~8TiVio6gkyGMbVrmE{S1)0)UclW0+_W>>hpXaRTHi01xbi&4Y;%xdlT%6N +z`*)Pt_Y?+~C|7CH94d3dnuB8}1-Y7P=HLUPI7iO8jyL^V>t?~>ogu@+aOw4O>yITT +zCl?gV9n{D7?c=jSK~lJk=4S!rtE!@a`GRp(TG0%7sksyfxiN;1OG{Tbm-+d*9L4G7 +zDZSyYEIxI6yYYqoN*gm(hHt9QRy#Cp`K?GjnWg6puYH(oopI?>T1HFkxX*3%W@XQ> +z51Zm4d+zC8>)o-RK1I7^>gZ}DS=u|9n$~Nq)$(|D(H!?U<7~z0%w1+?ci-%rd*kE# +zr+$}?9#zuPa@?U`BD6*Vn#e+hnuq1fakjCnjw;gri7Z +zd6@9z>4Qp5g>lZuLC8&9Vqjv>x>MO|%+rgj?vM5xhr6=u`+-lnlUp}z42#+3^m>%$ +z1O|ffMaD(ma@0rI59f4gbU`uurXP0h&M+!2FJS7au8 +z&v%($JY|51VV^6O(t~pc9BbOMCyttzbAI-^#6#Nj$C^j(XMh37#ful$OZK(2vXZ<~ +zQ+Pu4SY@Ui$+`~U;jp~iT>VuaUoz6mUf))mG<^M1yKnVd_J_!`*!%Nwafx$4*x2ws +zhnVB!8gusCx!${SeyqveyLB3uS6AHCy}WJvc0+F5 +zHTuISeV+Bxp*cBs?i6yW)}}JcjLbGm8B`6Fw=ay)NWaw9bpO#ZlcJK6i{$IuF1ImG +zyM)e|zBuY?|0{ZHK4kBou)DTl;VRyuMF*eI*S_3orNb;$X|c1lwVg9(4wK2WwA_5v +zwSYY+x>BaMd`VV7^X=UeqXXXQ)jiq3bb7bL)UPZ}Ysx2CB@fS|(Qi)ITwNtCg^QQy +zANpjx^#Nle-<;5lj0{3l_~J{Y2cnl{1~d<7Z0xUaP?3_KPQXoDHtOUi$56``k$ToO +zHD|T7h6l}MBsNyxf0K}~D<@~N!a8ooK(-$N-4H`6PrYg@wddTUU8|+kVD*y8Gs@`p9T+_RCw7T0-75d{dXBIBqFX_tB +zlHIz*F5Q?^Mh^9r3sM+=J9^+0r3oK;E5+*9PP-SIKgKHm#Oy~Vw#7GPv`&U8kK6Wm +zNMMu6SMtN^`-8mi`$;r5Huh@W^Pr-l;>;P%oeHueva=Es=PXevu`bVgsVaZ1C1$x9a@`eqYqfpzLIfHxe +ztcFd2m1UoouTO6c>p#@2@Z;{164+-B>2W-&3l8^_CrJgSKl7h#XlSUZS>Uey`SWK* +z+08{oMYj8`n%$m6I!C6arA;Fcu1x8Fy133@W&O2Cy^-$Djrcat`!O#X6oQ-N$(NfZ&(3?#KQQZU&D6ffv$EP!?ioKlOR=)I +zzkk$v_i<3EAw%XlI_}xKmzw^RLZMg~E;!+AS*9FVu!^U@#L4OL=_Q!}K1eP5H1I(1 +z4L!>}9~&B+OdHBqb1Zj#Q}!xYzs7>L=J}>o-`mQkqy~`WuS-(iwl$Zt==9lkc8_Ws +zw{6?j%Y;Uw0Ze3KvhK##K@)b%7*pebV6q3>HvW;Z)-SUUY=_-KQDd-tY!+#Qh?c~~tk +zpy{o(o!tOAx#N2-jLLb}tIXimoTmj*e$Q6D3Qm7JqpmF|Ft(t)jbt?LMygx3T)vjl +zg+&g!uM~#lQ*CMt-m5J=&yJn=Hh%MtQ>RXW0Y=tRjXdofC&y`eU|boi0^%Pl;(hJs +zK@*0DQ0ptMk_Mlg=NGoSkJG-I7u&ag|Cnb5T>GALf9>))RZ4Vo9`|ubPKjhM+30nb +zxUX`zCC^@RCP{9$-n~5`!NI5E;=CA)VLR^y$5wMM052VKw1{-i=dF%JYL@+Wb>D4o +z>l?O?BRhjp;)GEq-->Q*+c@mlrh(NppBHC^t_jsricwLg1aK6tln)j3!P +z`kK}DF=;M|_wV0Vwh9LT-*{zx%+jQYajLqy&EQu61eVR6yCXujJUoXr?&Pd#dzg>U +zT=h;fZfhu<#JCtj^>q!IzMYyKTz0}PLfQR>6Z>@SB_&BeOB>b5rw$Hoj}kL$zoeAv +zZ!y&s2{v>_tjH{%lcQZ{@&Isqm&n+(KqnixpUi1zGbAQa*I#R2Lsj>nORv`Mg+o) +zX&Y83zIr@lICr$fAh%G(upILB&2>*wsw%TXj#zDP`sSu?Fxax}Y<2L~RLBV%xp48~)vxdDx86NrkZGu;GW!s_%4na}m9Rq- +z6IM($G+h1p%5pZF#7be%a=}{CK(zoR{6HnyI+I0L~2p^_U+5g(f8}iUbVg$ +zp*MGVI9|=%yybGkgV1TqkGp#uYOOx9yR|tYEzKF!pfBO%bcau+Mu!*q$nCxFdwT9E +zoX>7m*OJtiTgHxA(_Cg|vF~Vw-nDDWBZgMz-@Ety~xD_09`f#(kJML4xLsD9AoZRG6yZXdv(Df2Q +z;GZ++@ZrP3v3nvS#_F+;W@J3}NU^s$F?)Y97y)}8S~UT93osy3Qc?n5_5GFglII5~ +zE{T#oFTXGl|EB&Dz)?xyu7(@D``aks+@mA9hH1*zW|%*}D)&&MWwZR2xI&Ayb!v`t +zKF*aNUmVr%bX%D2GuP1Z6DI77h|rxn)!f1YE->EOp+u!ppQf|EXM@4SinotRQR;1G +zIQ8b63ef-!e0qKNuYGEY)4ccWi*8ED^kx~&cb|X6FZKJ1^ff_q!N3g+Bsm<8sp+*F +z+lE+7-P=MdyTDt&emywJeyBy+tERx#aE+?!;rX|24NR`<(^`IA`EJ%m{mf0;r{*LN-8_`nTycBtqlg&q=_Of{ +z{U#LMPQDZ6DQ~lj3y=y3hydqqoHxC^;w|uQ3BA)6xs0}5{JHwbcFi0`MMcRzvi0`U +z%f}TQ;LV)!s<^ky!iCMC3*I?oWH4=7o0PI$t}|C}0H`*;-p$hYVL|KY1HBp>*kqppaYk-_?=rFp~V)JgB&t_T3|f9=|}Yu2m*H(<11=^%Oe6Km31lk3ZJUn`fYDOSk6(U~JV +zLu%eB&$|+VcRdzmu1L&w+pkGBb#T}E2P()Ur5)OFx$-vVvli#B1UxfDKlpslU#f9AZOJ+b#xUEPHX +z77QOgJbbK)v69kEs{f?S+GNu=b2eOBB;n%Y=iMuCoHek>k;bbtVpXd0qd0>kt-?nE +zPpLT7Yp$znOtzbhoZRq{{nTR>DZ#OGZ7jl+c@r}zH|3o7$tZ#D1SCmD_VZ(m2Y!o+ +ziCxF@k#LdgXKQ)*RTkKeg-r|Gl6gHKM4_1lmxB_ZW?B4tH<0(C*?*@q7o#24$kUcoU4 +zMIT<=9AsLFD~ySWdHmQZG011<@HXv2qpRxXIJ=k&eyJr&ErC`MMvMpv$+lkKC8P$% +z)Ons@j#YOlTkc+-TtC(<@cY8&#}!_zl`4P!z1MSxoAZi)UQR&xZ4nkBn1C4F#ENDBL$`r5-PKth>PT{8 +zBo`MG-GGhw4w^7OJ%dbxxdUlTLI<9DXiyXm2{Iy6s9bP5)t#rY)*bGo)L?s1;GeeU +z)M+H{O5mv+EX@e;n`m;kpDRiSEed}6m11-S#pwQ?Vy1V@U;lGOO&1iUC!X7WCY?^` +zj#-~7?C%M9bhEy2ssSH1l>;ruz0-U62XYN`&+y-g_52*czi@Nmm0{L$jOQF-RznB? +zINfuN^S9@t?qgOv8S^i@4}>fUvO62k5~p|;;Y>o)5YzmB&2M$JAzn~AxN8XNg`61t +zV<_Jlh@{J@>>d&yq1pOi4hIewb7LYd1T759bBJberBN_;0Q9#X(|ycA7q +z9;~3zF(!YQ<`td{LIiLTbh0Op3YrgkAI$sBfj9#i3JK;7rL{*4HOS!se^5h9K(Gl` +zIZzIQPGBVAC$~mOJdmV#Xs+TPbO<#9jYK7(x+hZzcJl}-W)7<8eVfmutt6<-wgg}C +z7zi>)1;8<(pv1xQveSf!w7h^{W6)ND3U#6!F(x~tT^z2Ub$(PjU9CN*IE^bvnSd80 +z7e{r9bU^`07s_OWMpL9r$TpAWE*By3LGuOt8KMicY$2n@k`q7+=4US8TQovp(3xC^ +zL(RzR?I)AEVOJPWnsA=eyA*Axem&L%yJ<5^pGmD +zbFHBlz_doDfL?@JjYBoq=;R6Ce%&m<0vmO*PDY9YRYPGx#>y-=m_PZ7X(cNW6x4z7o? +zx_1t#RX~AwvO7d#9(3wTni~zmGnjSV6v@Ow6Tj^gei%g+BEnaU0sb!UI|6l(dLRr@ +zLe;RZYv>z7cIqEdvL4_fWgxUl?8`UP3r~_37 +z$`i$p;V`J;#nW`7Y3|WFb(@x^CrxWdK|RO`({*!EMkAhw#~-6>gM|zEF66sPyRZ6r +z;-XIR3sNkWdI;vo<@3IAx-dQglIfUZS19Q{JOsbBr{)$!V>}Nf-=^^g%LI{}>Lh|Q +ziwDWgKsbg}uSn-WxFu;=#`slW(1GVOJwpC7WR#7ProrF%Eg-Ee& +zu|#uN`Qq*qgcLlD3DaT2{s&QCr$Y*KB8ANYO@*nUd{`VBh6>TNK!{SsVu`K}f^)Gd +zq8jb0k`NPe2;Mw^W9hWzSO#{qAp8$oi1bKI8oR&PmD`DwL9j(;YmoDh62)(xQ0Wl7 +zl9xk;Pyoco!yMd#DIHX8*iahIq0y-b*BC(F917WoicIjZ$rL1;5CR2Y%;ATAJfc;! +zjs(Q|AbbWAKv|vJI!rhwVElu2h$ZJ@iU&+VWbFVvx{S_9)Z&K+H5hP3m4Dj{& +z=N`VB#9*ke?>@;_r@oMXdxW|+I!YqAcQ%9*8ri6!&I?Z#%m$#8!Fm&UBbb8w%=diYAmaGU +zpd&T!8TJ-$0qnzA;N!zB0jloc>_kd}MmtkvW&%Sa1Z?2X2VrzF8^lgX3`hm`1&<=< +znvqE67)>x{lt^+vejz;2b~l?5kGs^ZnvCwOuV2rgE1 +zx{LO79g3BuKV^#h3JSyCNEB+ivwodn9W}U4<`h_5)ZUmv_6823{K(MWOn=?p5Ns&` +zo5-{+vpquaS!!7xcs~9_ZYkEmQ0@Ej;EE7|2$2E_z7T&rrzmQ)$n`~yw%yi9go*GA +zN=Z8r8HS^oaocBr1mTr~PIZXX3jr`3n9vZ5(7@-5T>+0=fq`8C;~?fzVF!dIftsr! +zsXF=L6m)-!!1u5#zc(=t_LB6r2xo`s1lu*gpNZE +z&B_2rHDp0?*tn9u3PlkfG&V5W_IB`_;YG%%l+jdV+TA8|z-$9cYvIY^xuJFfd!4o# +zfk;}+Ud)`w?=9T+#vwnTFCcUii0~5;zJoU*gCdc-I-N;E{(cbB|D(ejykG=F_5>YX +zj3k})=h7R3vO5M^a8M}Fsu6x>nV>rd(8=UHV*1zuGXX`Lf~28hbGT4fNJv=DgcB?L +zU<>D-`8LVVLM>`Ep!>q!34$$f4O~84?pPOaanJ*>JlUwb!1J?&iY3RxaumCPNaD_? +z{zWN$2{V~!qEitcgBOqk!|@LX3m_1CBlr$!GhFBp;|1=SOXKUXqgOM>yjpuu=C^C+ +zJTq%+%uZR|s8Y=Ts6oBc(44_!5I33bG}u(cTeSmJWK6C}V8Ka6KN^RM4bx0T9Wm^J +zWR6hXL>(W6$A-ZgkEuj_bx7cw5xsSCH(`7cUo83oxwt@)e0(kMAeSQ9j?RFT}bq$-l@2&r$<{zPEM>N3* +zi`R~2fkjbJgP@=%AV`CZ;e5fK4&*fG8dTsiLY@6SFl2c{z~g@UT2i$O;yJ+7*4wn +z3cF^~IV?52=*3vf_DNgxE}@UJfr|rw>xoVqqd81E+%A#DT^{o{%oBBG97y3ELm+ba +zPfQgdE8YJf=AkR(zZmoQh5V72C)Bck67vwBjb?d5LI9FvRj6isOY#Hlflr#CkQ{c} +z_J;kQ`6BGe3qdSG2I)PVFZ$;Zh{yZ`F$nF(#Li}hgu{~PoRVm4g7x}y#@8AAghzji +z>0!^y{@juR9=Y9cJ>g#y6*EyX&y#^Z0{Xu?pWC&4{%5e_AF)&vEn?_U6f#!55VgoZ +zi4{9Vihl+tiZA3MeF_g_)}}jf|WXCT21gxXj%;%`eD}F +ze?eytL8s$CL3y1k2+e5BrgDIepd|~hEyJfN;ba=9D}~N;M-3Hr5A69&{tf*%_0|8W +z)K^pg52U{O!TwK?eQy8s8r|>z)YQ_^(dm%?NlW+N{h$Adf5_5T0J^CYI2%tIQyqFu +zeS#L1VIXpt4R`wqANK$_L*0YSpwU<96Nn3_Y-P}wvOAh-sP=W+=F +zot!X}=}rc)We$tUBEsi`nJi>y3wn;1mKwoJ8~jZHe^WsPMe3#r>j0$iUQ@tNa0U^0 +zRCO-P2df_V$w&Mg!4D(^00eZ_hOVmwWjkD_qtcLy!TOUIK}WL$T!zA;v)K9sW!Teo +zJ&-E6(SeyEkIjfzatgnaY$^$ZPMGf8$du)t2v7rMQ79Ax;VN}i9l_C`X(l2IABoi` +zAU?|gxgYFKI|*zrUPh#D{C0xF$fi&rLZB401i-)g+%^QaP!2^L~0^( +zbCKJKHMIQz(k=B7Yyz6k<-#2xcrWc99GN0=r1MSz;sBPXUX1`hV^O~Ip8xyozsLUn +z7f1lQ_y1bcrfO@8`~QFU|Nn>n{WtIbw?+*cPHtem5RMvnWctsO0U$-G5#}JLs}Zm* +zP0@CV0F9PNGpSzOwq;lKEg}(6j +zpNrH+^_}zyGeg`i-Z6NdjziIxw +z(~86Lu@=s9?6!#lNoBZ?oyy_D-j00eX!IqkB_=+q+7 +z7=4H5=yxNBKIl(0M&873b0@;9D0I-Zk+)9u^rOo8@EAU@$1r@lt{D841pFJ(7`${{ +zB}9zFrGoO{>p!XvWLN;FgV(OB1ApzImJm@Yo6Q31N8WxQ3baZ^Zj`u35f^0gpgQ2| +z4+N1V1DeMw*eLYV4^BXLWEf+6X8wr^k!@q(ddNGXMnX4&Bnlar8hGiZUYKCdRE`QG +zi={y6@a@OKJ-b7waF6a0D*98($4)_3ZD0?E?>%)rzmc1#)7vW`bt7VgJze@8fuu6z +z=K$D8K+qv(Q0;<3JQ_mF6C!$Q7v^uyN8h^?<8Mnx-@6pUHh>~;T?(O_4&iIh?V*;T?%{vF`Cj{L5R*eDvalj6#+f~8+7lk2<%x6 +zaJv^+ILx!Qv+ZgB1vUGV*2-4{(b&;!ZV$(J0@aZz6sixn_2_$73U;GGn}x4kNl@r4 +z4urn&txFjelZo^*>_b;_zzBS(RJLH8$p6xfJZ!N*p8usgc`ljDL51O`t|YOo7jW={ +zeCSF})TebW!DXRSb;g2^-N<6~lSENl*A~iUXEa%9woaofHd@Q+XukGqWBq*UK0R{jqtEu~c-hcV7 +zX-@z+Xmrvewy{WHk87{J_S$QNjd7D0taf4T$=hf1VzA!1Q!r1LnG>Vz^7CMnENteYRlgdxTE2l)BaG5-rT*{h%Hhcb=J^yU>{O7=KyX*vu2wT$#@zE3JWj#ba<+uS0&tJ~h(ncm!j>CL0xf$7a};xj}4tFJv*>0?Ix_tnn& +zaxwmUr@eZo|GkaRZ(0A#5fCmL{~c>L{oTcvK{Qa&;9sKgCAu{?z4-#e+e7$`D|zp< +zymwmO>(KIEqi~KR!()RYhtrYa$r##Kp&^Q);Y(54If^%i+Q1MY;o=bXw2phimeocy +z?Qg%{L$Z)XS&17?5#1`cF`7aE^Bi9rScy+$^-B&dU^mwIK(^AojwT8giyA5lCa$LW6Vi6-JXl +zbWGu}R{=*ZN4yUya5S_=K^W3x0Qb;7hWDeOpUO!n5I>Kk7dEU&f1@V|!b0QFjznzc +zP-6%5-bZ@sA1Y^)*J+X`-DGgNi16Qa+E%E0_{Dtqw!j{r!umyss^}<#t~-HuiC#KR +zFCD%Yu&4J)@+njf1bf&~43zMtL~?nK8jQT<>2pH|d-Ut5{ttDOQVQ4}2AE#ILCc +z-wOo0_Y1-9y~<$s^ed;`FEiDe1g(uyvFfAD6L%QERhUU1b|P;H4!p^w&csO!VTdT6 +zVLUiK38K{ZC3sY*d +zZ#qI6&i&HJEnli}tZvOygI1K#3vHrDaL%CzApx1oC&4~R*B!fv1Y +zFSqwz(L!$cy@aR)P&D$eJ4wSZ7k9=K_Uopp_Im%#p{gW(6OTz%b<`bJ1i)HZH4k>* +z{AKq|p)R*SN9{vcko~vCu0_g7RguToTiW+AO94@~%&Pu>_h0Q+)b;-fTn{3`c%b<_ +zWM;01&nvoCQrs`!BjEuCVuqi;>d3s#Mnrd3+JMSJqG}7L-BDgFg)x)#gGI4#sjAF} +z5LYKND_`m2s!G43Xz#@leJGbx4&?Kcm9?LzRm3nV$G(h{$_X0J({~<@?8&29mCpuM +z)fFUUEmK7yL|B%K!fJk*=?8lN>z!Hg@F+-s3S@5-Ayq-Aj}~x~Xh@2vfh0h)RS`Qv +z2EaWqyBT1-4!&G*97O-^n-?l?!gJXCfCy*|C_Ahe2E;(ozgqt +zG{$ij^uvaAE^rYU>H(MMBNmS!_}cQH*?A?1O+^Fen$?I%!LW(fNU5eY&{?zUF}aeO +z&zN@6Suyb(cG|)Se3F|A5EFM24vbpZ^sOlpRii$x328L3G)tyNjEiigaKRx8L6F-r +zPo!0xh|gr0ps6feWwS~b3^y#mq*$i39c$z?qv0R{G$xcM;q@N)A~kuVIOp31{N`w! +z`lq30XQyE-Ov!LKjs@#7WxE6$Tk;tZAIDroAqx}*+Q4*t0L~1kUm+l+^3-p){CySb +zu(}AIG88%h<8#mekDmy;$T*K88?^2;a+oO`E{kw!H8g|CR66Q@JZJK!ZcPF4ye_>X +z0TaO)_f(Ukbzmd_{a#TtO2t9p>i;yzHvs}cocxzu7Fz&UjBz1>>nq7MCBuU+sV3Ei +zI0^RfR+c!b8gLZ5UYPi1Y4|khJop%zctRAV31veVzaQ=pmEe0Co#0t)r{M}%YS0TY +z)lJ_YMj7mXG`wMICXm$eOhOO%f?OhJ>7$CTFM7C`?uzk%0y`Wg9ND4CKX*6-n>gyNU2<3rT@))?XyQ#8IjsV6r*uV)>HG`gbGcbnEcN9?q7}kQj{+f`F*}s5ijW-0UIa_&a(;EbJ_13N{GtBG#P9?%o--NZbZ#$46kPm&s`;p +ze +zHi8X|0su+F8NBBl3?#|MP;LovW+a8@eQXUJ$rwrha}`86E@9vh?h=B0y$Iurb1o7T +zwOI33bj_VOJk>LQIzXia&)=i@Tf=vTZV{=%Sk6fHZ3^SeRN@t+FrVOnU_OZj`4d|b +zk%V8`I)|*r6U}7xv1j7ubcuIQ`C2zhg_qP~OQgwIou%%8j~oseAHyj<(1IpZ1qjY& +zyu)#mcrXo^@Q{*-@$=I4063p48HRZ8;lN!J7P)k9v(tQePRys`h1rU;&HRVHC>kXM +zOoC9&Lz_RBz!&z&USFGri?`s2O#vQGyqSH0OL;xdtWgKQYL5+ +zL+_dCe!It#5!JQ>K9Z-93>sP2ctElO8m~v*R1Pz)dtvM?qymt%pfq#Q;?TM>Cp0)W +z{0|~E1zF{D=`7&0@-!HY!uSuR`vdRzJ-F44LKfe^^Avd^Ny?mM;3^6oNVQG6 +z+-p-ldY8>eU3qTLh@g%_Ek1cr9VFNKximyrdxx*y8SBOAMsHo)nK>v+;)tKZ>b3F( +z1<(B2aX7$Gg2fkDg;<6x>Xu%&@GV}q7$>CZnj%-Fqq}LksaXsuwj$>$Q7&RP!-zJZ +zqC`k_B=DLVif#f9ME@9%w_-!ZLr3J!HN2;38$?mdBzYtwaIt7T2sBRf}LBU +z0(#un7Y|wR6V;uiaU+8(SUDK)bL!vk1^z)a_!Rgv#^n3mE>v5nJ(Y3!&s+X0w0W)h +z(}ugim9z2jKTx&<9lt!6pnS?r3JQF|QgmH_0`~5u{BSKiVkA>=)87-S2@8q@LK#=I +zmzS4ug)=e3MZ-d!42p< +zl&sjOJ=9PrDG(0lf(Zu;lF;k99VsCd9otMDVkeCyt!NXI24)f7c8A*Zp$;1=0(?m$ +zyab2gs4+X?VS!Omf)XppsS-nrEkrT>4Cgr~=s6K#jrNda8THsiI8E_FlOgk!<>|N! +z;0zn{sl#di$wO7Os0!Dcw4^#QTlR7Egnvv^Ov%ovP)j+wE%m^ICweUw8K1PC+G?D$ +zU%CY=hx-opMKHv<&Y?zXf8bKO-wM@PXLgw?W&AtTc9Di@b{F9&8YGyey?V%BB+u)- +zI{ONwea^}a))E-2E +z6q6jq$^(nWVL?V$9wTgYY)p+Hcz$-3Rx8RezgvXo$z1HKXmcVmztLszw|>d-SFE@6 +zKv>_dO4sZgr3*0^fpuBI8`fDu2q`wA%)$_c;sppABKa1D4Qz@Ch@x7nB7y(<)sH?f +zuZX!Siw?k$^W(O>O5UT2eFLV!e-jQv3Q$bAW82(3h)&`p4SNp|A2jdNVpDs?|I`kc +zbp)jH_Xn`^qLdlHNh~EZahK&BZSK#=_8jP1=8i>vkY{b3Ftxot%h&nd?klytF+jAN +zYxF;`l7be|u2|OL#7~4Czf#UqwG!6B~Q2s<;wFfwr9%!JZcmBigTYyFPJNjG-*tDgT8&yD`ai!4ZS|f +z`c?Cgjm?T{O#TN5|05RoU0WLB6qRz +zhKTaYJG(ixW}i@Up`RsSv2XhHrCGe)-v!41eR$`tweP%he=DC^{=X)E%;o!-?*H3) +z)Lw5F{eRawD|i0CxAFNc`~R}lD5{o~N6sa@faPx~;`4OBU*dIH_pCd=^Z&i`|NYcsz-8hlc{rL;$|r;M{Q31H{C1UuG2L=;@#;G}PMz3pmL>FQV2!^NEaWFm4C +zRx&SsSdx0#9(@R5j6-%s&zlKKC~TQzlmv#y#}x966j0iDpEk<7CM6Vs4L@IIv%_L) +zx`6G@x?{2R&;mJ~5)R8?JU7uyCnQYrjycsFI)pIHa6M#fuJBjenm5U9nfxd`j`F5t +zNXCCEYx(;kPad2%J#ykfkviXQ$iVX42;_O@u7#}LFbP~!c`}`Y0 +zH)-6#IC)l$bhzg5jK1Kr8^=Du6u~|jTi8=BNkcSQAni?(DU<6Qt(-{@ +z5Y0;3_F$o0%9c3RI9g~6SEx%t4PfdL#x?9QAmHdMn@vyG +z>9PI*E^NsV2G2W2564(}&rIkT^+KQ^0ox1V&<4su08N&)$2A=Xg_sy*D##Hpl*hcf +zGE89|`bk1kE9P_=4s|tP5!_j{8qFz5^i40Am~>48h@J9P5!;%sQfvCForYG3Qrht=~ztCMkNe%haSp8vn-J@&?Gh)BHLDk_~825BlE%g~&`GG19U_V-yY$kpZaAM_-Z{vze7QtL#L*3o}*=1mv*fxIaXhp)X{b +z(+%?OY3S6Y*0h_c_Ju_(rP)!AWX!IoI)dA3i16IY!RKf=9{Rx$?wagHgLWnqm6_DQSp%Cs1275{1z=b}VCHXol{w;L*ccSb1p|-_ +zqdZq!h&>L9#G*Ji9FgO$ixy~P83oK`gcIY0_tq+?%YX$hb<6PJ2qm+9HpR*m#VQQ6 +z<-bbeMG;3xU>GEL@)eiXi=hOdPnZBqK(oI_T^vr-MOQ0XEn1#TAKDqJV$r}~%v2__ +zZ4)f9tT+QULh-d8o#X{;nsbyTG~hrGy$V0zLrrlkoqDafL^Z^-KnGPpq==Yy1!%UB +zYfs!F{Y{h$f;c|vo4YIrVl)6G=|+SmO+sr)7DMx)9Ymdr+h@u_n%FPsUIw&cm=Q8R9y0KB@Er>WC7DT|V#( +z5d&)cws6E%#KLDMeJixMYE^^4E}Js`3*OzY$4=CvSxb}} +z;B>-ZsKCjxsM+W8OGUgeY$Ndo*SF1~dSsXl@0x^7%Bo-5p>;}gLw=l%kDs(3FX12apu-RFM(^u~ulV77%<(grbLKF{R(u~zF2|?Bke%CSUN@gP +zOIX!526=+66))$^Po1|M+ryoeVuwTFyQIAf3dZb)dk+iU`jfhy8a1UPa|awngE~Aa +zKP6GmS79{~4!!Ykcn;hpU>mYQGqh+YD%1~gITVXloD~u7InXwun^xQw3@(Ts$07=2 +z;!bhRlvz3ASEs4&lo)omj<&K*zxMa~{T}|WQE&awKv9sRilh8ZH?#?`X?GXk6WRup +zBWoUfex8QmKSSk3nVbM#!hJUEj@k5eoU-Sy_>DL>o@rRkV&Fr{)K!Vua#JFrL?G%D +z^>DB+PvIM#nu@=c;|iHjQK!XWz>#}_gE|R|1c>eVZUp$$vTlx{45-KS5~D?UaX=j +zRq0U+44=&d+AQCtIKD$xexN8wYeQ8~N{r=(!XPGj<~@qjNc}-t$}!%Yy`sKDscqOj +zQ8G{#CD5)q1H&Z&Rqe-KA0>F%3vW$FzmqxnQQwZAdyo3xLO>N +zUf_9BYG1H#MwpJS3baAyg=KWBB$dwMdo$FxCTvI3|8BX+q)Ot>n}}K_1K|txnOKzdKG-JX4LWsdVffBzF!RzY_~|Bu6+*Gqd>$pR;Tp&iTjLwkcvcLH(xzH|S$bN~2X;Qnz9$=+S} +z4~#kvJ4w5G7$1|?mHL_}`O~q^ovUbfG+SQaPq5)dmG}@iC2g|b^0(awco{?E43=vp +z=}`IR2L)SyeOC}wt}#=a;%877#hcbvt1MlV*q*9zZhNWFkXWeLy<-8--FsI5x_f2I +zPl4xEetT(;@6U8&W|gs0L_3)Xf&xfHT4iQP0x#}>lbz>|A4O||oNCY9<|Vj18j8f> +zS-C$YilKn$jtHPx8C2e?(wr~CJYuid3S7q)DPpgf6rg_xV$B8&njg&}>|(<(qJjV) +z<=tRJiz>_mH|+`3TugVdrI6Dpuw8B@si-gsKw$TZegQfs02&d+QI0p{UbEDnvw}Xi +zRAHrqAlR)tm$2g?wHE_j?O48bO3$5*fgsKuT##Y>H~nPn8C1n^j$Ne$AP +zlBo&GyS!=}nQ~#W45_q)@r@;n5VJWfU?v*Cc(wryi`yw0J=?hOFa_B#+69IRc4ZIO +z;FLGRE03ww#ze2Yxx}4MBZ=thkUo*CO?RY|{V!Tnls2{eDe}l|yD=qejD28;m17eb +zPwG@Gl4t0(?rw;gfVh&V|CDM*nPrjL<-6rpYkl?4=ry<3FHHj-TWEhiP-!8Egq_3e +zhqPv-qeNWgY3amHnK#z9AXtCz)%LSzZ;rNK{Y_>hax02c>cR=STz2|#0$+RG(xx;!Cmf_= +z9S=_>|5$8%hDm!TXOlS$S;45INiv4(?Z?!av)Eeo&Vo$bY*EVzS3uud8y%6KthiK` +zAG8;S^-uYY$t&p9S;#F+g(|@^b~{?T;pYUO8$Rok1s{{x3zYAV(!x%|M+vEJ*?rP=0ofgb7lT*_&yAZeV34yG6Xc|P +zp;Jj9+;izV9C&BA@7lXzlK1XhhtoEvGRy45U=>G|_PoWjqiOC;VpPW$7tdi00VX^4 +z?@V9%RbDi6&7ka)PR0n%_pA$uiu{RiLipVjvl_xA3VYDm;amT}I(gkX!Zt>R6^0q$9XCH)?8_`A2HWeMWlDqb+E{qkuw6As~+81V5pLex` +zQE{n-gRwHTSstWxHzT&+Nb))@;9opPojn`b6oV1;`>MM+=j=TO|EO!hg)Trv&k;dSui#H38Ho=qJ7KY4 +z*Uk)9LOkm#>jAlj*HLy_uyVKd`lU(rWD^)oRxI|!dVB#(m?-8vcN7-#I2q^46c*_* +znI$FG{ar^pRb+Ukvgbcj3jajF(_#9M(zY7Oes0Su +zH{6ATVd4wLrfG&rooY*mQ9r +z@!7;xEWC7=u<&xOR1@7U8V(aFw-!%{3q^w_2H<@$g30p%S&#PpV^{%F{#8N*}Z+QDO^I7;t`N)=$COgM&r7G{a4xlG5r*wMK)(+ +z<03v;kYc(u@^F>wI=Aix>V{={5h=JUamOqGct@TrrT^^+q;PX8oW6m*scw4~5mf<1 +zaE$Lp2vcBO-!(CUd_Vg9VLrptH(}6ojlCUKsYzrt?a8L4-K;acqG%f3U_I%asI)z|hd(|wZFF6@RClT?# +zv#yP=)##jSqfV!#eF!R2d$P}XPfovLiqB}Kj#v;wX{1h=`^FbI~a4Ach6Yx!fza?n-Nl_ +zRg|T+JSLb%iIalz2Df)Q9VtQ2H%{pi)xfIhdnI=Y1v;;o&aZ?;w5#k06FQN(Fm@bx +zA5%#K%wwBfJPuEyI2J|&QO|YHbUa3;X(WqT$t#!<-LinNN{3vIudMi_E~&?yvV)$H +zQLj?LioY2%@=8kF^0o(A(zN2nJM*281wQ9fkft)WMXcm!(8rjvgjyg3I3)$|z3|2qrX<0&&TES4Mef76>EWP`@SlIo +zc~BpaZ#PaEtDE3;=+`}6x>522*7c1imZ4vqv4bpS6n)bk8B{%T6|?^k4LO>ysT8V% +z=%XSEP%KC}42ih4X5(Y7LM(w5R3^~O0*k{$k{I|NR4I?~YIG7~*L+qi03jlt3ncc7 +z7_;6*xHt;X0lNkqAJ^T4gMdJRFd>ouJS3tjT?0iW +z*Dy^~3&N%OD$St8sH_!#V;&Ue(l6`?j=b4-qJ1N*5M@q5;4Qu20yH(PCm;zY%}Eh;)+H%_ +z9C9$Dd_%5L)^!HMl>`H&ro>y#0SZD0zaj-uWdy`wcd;ifZ-WJQnA}eQCOZilM-TXr3gm1IKB@pMVTM3}7U@{W@PL-PW-k#^I_1VI*zaGK(*aS4U^;*boe1uakD +z#kC|;Bt&lO0Fpt^1YY)><##NYSiMEYafA&FZiRwkSi!O-zL6{XDMllLH7p?{7{Vm@ +z>RvH$Jmk>lk_>VCo;&D>d9i*lP$nYKOxUN6cx3LehrRd6y07w`Z+Nq|nD4yzP+UP*Q^ +zMPbmkb;(*}iI$)hf=3gmZaFWfeLh^-P5i +z6*UR-$S^qP%ytg?`Kvic{ruIY%Sf@Q8&oh=1T&?q*cs5b-#OcQ2!kAyM +z0l8P9sm)0trVf-2PVC4N6YpPhBE4oRrbMSKpsHfNZva)5dd5Xoc}fVx=O%E97;@#q +zWK5m2j)SJN>r6M$B;kgM4?-6d36P-ZmEujGo+}}1(?jZu;&{tek}VHa6it)^0Br{( +zXp-1c6Kv~7kj*q%^XIi$qXeIG=Nyb2wh79*?3LvYt4 +zLrJy0Rahz#zBAK9+$6$J8SmlEl}9D%tc}c3xErPLFcNAV?TT&##B)f*6J{OQjtL5? +zPB2K8KORw2#JakcO5Li21Vz_<b&2T4b9o4X7ZP5?G;mF1!+Dmyr(Gst!-7IuJmc +zkC$MU4*R0-NH|#%6BQ=w&UMOUNn3=Ib?3^vCm^wb&%~r0x(e9`kNLC~jnSW~Cqdk* +zWMm9J6tGEHU7G?CeWB5LZh+}mDr~iCOh}wgHAGTp7O_obn1X?X_bs->O%2gVL2@mV +zCM?P%9FOtH_69+Eq9`Tre2)80>P;=LMs6IZgLg|Z8+QBajYCgVM7$ACO=_8(Y`2Kk +zswiX98S(Kw!`k`#2W(GLc#bPe7c-axrsefn!%;}h!d`&dW;UayR3>X}^G)x_R(!xg +z`@~Vn?3ZH|o(GD2;!W)h61>{dHKRcG96-$EZj(VpfN~+&5vIV#RYK(f3$AIbN<`@? +z?FpGG08nv50G%N#lN^o=vaBZsGhd3NT>=I?rZ~@@ByNLdU~b3gk?>J2_z}f*ChSG^ +z3M(^`<4;jCF7Vo?AtkuzK36uI1?T>li+bJ#H=AzGZ^E}-&+C>!QTplIlLq!2RH +zHhjFd(e+UIcStZ?atxK2c1l(ydXg&5Gm&G{gXUx=_uw>YRkit>s@juAHTg1W>jlf^ +z-*=&hen+8)9^Hi=y3Wsx_&?*`jmQ64X}8zc%kh8i@;~3o=fd%SZa4hT+h^Ah`v)4i +zaO@we@2L6EtpTIV%3jA}Gz6zXt4aq?b`>UD8Yfr4u +zKk&QSp~WFV6Y_VW;?U?lkt!&8;9KkYR6F__iTCoPrX_rNQYGW7DIs5NmS?Iii8ofK +zG(M=VVOizZ<}uT+89V*jY(xE;WvO4AVyf?ySMF=NLfKokP{W-;RyhMl7FuI}fLfK) +zEC;W>;E2ejQ`zq+A7}Rx;^G)%Qf*ooqiPKErUWyp6ctShX5>w^yuXHE3zK)G0N+>+ +zRK-=WravRNLUF@#c!j{(mWQXM=nCGn=n7i0?0T`GWLHI2@JwU{-;JzL5m=!ZSHV-a +zR!dN)!YYvX)(NUm8B@ViF%{g93Vt!9LJ3?b4XRmQjd*FdBPy7H3S-ku=219>Tt!nr +zNt_C%U}7n_p%m;$3TR*M1*JF&{v2@>ys2>%{3&r1ys9_~*X*A=8O={@%HbmWOfTI6 +zPQM9(eGXB$QSGUVjd_+^rKCNpJfbGkBHMej;7Vz`;aU#6vyp2)m)UXo)VyxL*{SPf +zPLR?%Rd~l1NYhLg+45pu#YuMZ`c-I(tG#5s$zHOwvNN4zy(#WpGjM{gP!gd<5fUb! +zY)_+r;Tg^21rK{MN1cz;vc%q!nOyD-UO!5++++!5LPZc^)t)uzLc}L^c%WXjx7ZER +zo|;tSy4~9*W3}cQU5s{|+_LDO1vPpBwI`RJiQ_u`3fhHHh9a#j$b*&SFVLH1!~~p9j(Po&p5U1pXVc)pZaTx?-~u!(WJdh-#Hxk&ummy)9)i +znoyJ>5^^uT>17~xbFnv9FDhKW?u~HV6f+%KJZir%12h%m6uIIqDnQbJA!sRXy3V@} +zQGz=sX9(sKm~-y?chX>QRAmg2v2`F~qc$eWI9pWhWnR&elN+B*L +zhnuXR6@;=kMJxE;IDrP>%Zt;2pOf@sru|qX8~2=7TNO{XDM>Yu?xqfl;+0qwH20u{ +zO>SC~x&+xF+$WuUHbAKqq7$AqVZR@BQPbBbnDbrPnQ4k#0vaz;XUC-pF>OvTvollR +zkQYT(DPT$=e9I(O!XbIew~59v*|OcxRhGDBa)qwm*?79*sGzC!)j#_{&Bqxsn}gsS +zhxsW?QBc|Peu6E6YHvgO$wI(Vev{ahtBnG>V^9YYvd8PE!3mNDBs5G#Fi~+2Cl@6t +zI(pcC(SRRIl&E|V1;^1K%Fm~fj+q`&j(5Cwg^*UW!ZjB7?U<$7>awV{ty&3BFlD<3 +z9W#TDSX3oPY{^1aPw(E=nP}qjZ8y3kPKX*1GTyaO!zCl;`ody=?Tu??l=vD3gsr--7uo9SAfIgXF{ +z!hd>J_|I8XP~Z2QkmG=GcC2nKTCcqCYs^*hFL4m$l(D^H<>L@<@+BlzSq#u)nrJC` +zStCI;)XhZp*2!IwYMsPMS`i_s^5V$E^%D2K5@DVcowOKEsT`fuCE*8=Na?G>E1H~? +zXqW4;2!cKGO2)4H2Mj534XdILnMb-MSO5SXZZ91ilMIJVphjgZs$88dUsFCt5c!Pj +z^mv4$Sy{gCoW;15WoN4!6AC+$#tKrcCBBy>)f}?FAp0VE>&S#}WFJ@WQYWH5ucI4K +z->V9!Z@K2`q>mMm^+~`rBcT4|5cV3L2a>U+#0vXaVxfUu%Cin +zgS>T`ei*Sb)Ey$r@nrabs+cf0>P9)gtCI3dPS==p2cfb^FA|5V22Yqu9Fz@2iRGI& +zghH95Tq2G_>AqPJNx|m+tVjyplt>Exe32BqsgV>a11X5TZxt=OKo|vYVi<*)Q4|WE +zP(<>26eD1q>p%+gcs6?lhi%Qw>d*L4IYlW@(Hzw6O1Ee+&yxE^Sw-;>3ik3-^^23-uP@92P4Uex($)FA +zv%O01?CW-Ub%}yDbt+MXl1J(cS}?Kv1ulRE=cuCRs_nX3G)v +z!xPn?&lA;~#}l<2rnao6oW~nA$aL1PxqMM8xg!BV(W6y-5Uusbn?}jG*f=11mvKOx +zBD$J&Z+AiiQ>nZ+)jA-vC0~Bs5v&4O|AA>R%sq;)PZ}c#qt(UG%5~NdCtu_PZJAqM +z<&}rn6DJE})L^z-NP^z){B`uWp5{k-`+{jR|a>-L?nexIh`SM(HPND}94>>~h +z?kG(@MHutOx{Xm754fzLItL5nC>|xQ{&*Y##|!P_brNolAqF-IGOI2*=nO~b;(+0V +zG5$tK6+Dt29HT6QeZ2$cHhIQ>6mkw$TY%~pdFy3}dl_?rXpV)U%o|=fmc>MvQp$9{^ +zqhH1xiyfs=e;VYQ(DI*7@=bqZW6OVs53(*wmhsufhj&X$_$U~|y&;7w1wMs`_-qv9 +zr~Gr1f1ZigD~l3(M67A4Wiy6x7N%%xk5B*W13p3J2>yDvLA?R_ +za2v8~P&?|ORSA{>Pae0Tng><-l>iXxfi8V1Jdju-2s~hpEqF?bd4;c6-;AXc^V0Ma +z51BhmFfR`zR}pSCwI$|DNsT*^bP4t@Q%O;1o8fQvK(II4>~MZhgDjjPBi3yvsTVMr +zAd;Z+`}rIaQ0AiB@rvy@gPInduM|Y2JSH0kGsE*x+)q|npP>yV7hiQf3fAq8O(SvQHWFdHc58%X;8 +znG?zshu4}yx@2U*((zJvskb@$;TO+)=y@j_n7kf7TfPt9y%XQpznv;4UTf)O(yNoD +zNwtcs9%pP0|H&Y~_)U>9a^ovL*)1M+--b*u@erk4?Fbb>U`=1I<^yE7Eh3QSER +zRU#!Znu8kmnB#Lxq)&rpi70)w%!*zlXBZfdG=-)eOxR$=%T10mrP3au`3BN4SQoen +zNL_mn6jD#v72ztTXAPW#;vyJxhumreIKo5u+M}MDrd=$cM}!J;&}XQ)$b$aG&QUtG +zY>qa&A0g+=G~=&XT( +z1|vFY^28&Nu42bA;v))*n|_wCf>h2_wDQ4)qBUUjq{!Ajtv){W^qgj7<>RQl3{wl+ +z1pq4RgF%T&5b*>eViqHd!xs@sO(j9Tea!n)nIJ^N%q!&U8iaicot})lr&IFo(G5r= +zwaKzqf!Dsrm^}j>++e@FPS@(suh726ZPzr?^KU|Uk-*HCC7uGAn`;X-gEN;#Q2!;@ +zFP-Rn7ahzgxeDfjiBUs_sx2rm3ezrC(s|a3Sz0ivDpfrN{-XzkYe=b>M!1s7nGBE! +zNw3On?o~%uETZI&%z9!)=(WtPCyF%(!53<|!FHCjw$$%ghrLY>J<; +z3M-Q3Dix1hX(-PFkga{R!r>pj)Kv-2>4uf^>5Dnc0WS+$M;s<~>_!qMb*6%@XIT(X +zOb6=hqE{k2JH}w3fn#7>B}jNIUAEVu&kt5k_vwD)XC}y +zK(2wxIf#S=g{g^sC6=~ZfR;<$lV~swmMEVWino6VwmRRE3n|k@7ccP%Mt&ANqeg2@ +zerjV?tw7b5zPaL{scHwcT)m~)2(?cyQ(JRkmnZC+wB*@ +zQtnRhmMWP}G?v!vcD_`ceK&KbFipD$pt)1vm-+4yX&8K*e2;KQu^fd!rSbHeeUq5h +zFJDR}u5h)$jzH%el9P@Wc5i?y1zuter_FKl4Hxc9l2jJmV;|?_+C$72Us*hKRv@Du +z>&TpW$#M=)i7{lNyUW$XIpXB3HdnvgJsr`jCG#}1%i>YAsOhtbkHf}~~cfg>|~vrSis4f`Cx$8UBH{Jm!z{vY>x8@}LY^ON6heTS#O>eBN1 +zQhVKBUft+?x6x_)r04W^Kac!Bde=KyHnSMyal2z*MCk$CmiYBBqN|a9i@)_tj(Z8O +zsZNW3wh#byxW#2Ta7?-=nx5%`@WU>ajB`~^fbB(nbaob1@yWaP2Y+kJUs&uda2PP* +z&1hY=Xpk-DhU&FrS{fK*ILJaO$Sw18Rhk8qR%ui4EDc7g7=Eue3f=J}VEmX{2blXP +zu5&X@stY~GJ+C}rE-B5BP5MWeHN78=hocr8{dESRdik|C*YDsngZ{(SzWZ?z?H;qs +zp93@K|N3gt{6i87R5y8o8na7P1sRVGTuQu +zaS|^o&oRmk_9+VZ))r-OXYZ053P}Q6S35>-=2(~}o#YZ~9(FPHOcz4YVnsV7acp?1 +zcjF)|KCA358e~i&r>ohsTgE)#mB_HvHho{6AofS#y|M~?F +z4z`{;3G=uP&l~<@zimzpG$YFEwYTWXx$!;*qOZt?UmzC#yT$l}|LbG41N|Z=MEE(% +z>rCKrmD~w +z69+P*zYHf8=TU$NMc`zFiStwR#zKK9W5P+8E05%SoJp9VH!rMU4rU0R7L%NC2H(F_0>3(i@gt6GFr=S$x1ZITr2@Q? +zd3WR#`r`ZoNTi&e4PgMhDgnR;77i75VSV9!zR={Z{Dt@Nf;%-tstIK`eE6OxEXJyL +z8&cgzw6L3~0`Z~+Vkj@W6ea0Lgokl&5!Zai;f~RI<#&?p9kEM3){^R?9xW9OR +zv9*Z*-hTqat2uWuX1TWTV3$rPXfCWJy_w$p!n>bNKfHUBet5SVet7r1|KWc2U<>}M +z)!+TS_TfRJwqSCi)=}nbkdKeiCDu=_cYjnwK2$@r8_DGzy}WIgPC0_Yw`VDlWv(ZEnP5R8Z{@&nm50;BjD0 +zL}R0-t2cy+;tbXLbbR73tCkG^5srj|{n~f8>-fxd{~rQ7oSt7=05IeJzr0$^|JYfE +zuXp$V+xWQLPo_k5lz!)gv+>mJy&d4b?xNv^JU;sIUG~AcqRwvOxYz`fl+16n{MyF* +z+^^xc`tf4Wphq9g4F@^E!c`g{8Ih|gpnqzKt5un9&(4!H@Q+qLt!KqPYwR{R~$fEj_OnE&%=?2gz|TxNd;| +zw10r&*%~1$S|fU|_ut@?&U)uNuPDF0&YlUQRK!Q@-rs(`cO&S8u{m({fAx=!$flJp +zo@j-txeSv3plv2c(6!kDT6wkL>3KaLwIo&^RY0i%0+B1?F9cxI7tl2t#annQ3v(I~ +zqGrRu_$g*(I2b|m>=D6PJEH|dN#^n-6jLK3R +z5z1~&ZXIel!=QRb&VlpH6OPGUSFFs(XjJbswLAj`QRj}}?)vxpJ^Y_vzu$ukd}GGQ +z;Q|Jv8US%m-|WKb(W?Am4P6#0vf$w!U#h6?zhMisYIvu*ch9*HLutAY!VU4>z4^Mq +zf!`Cba9e;c-9Xx^y^m|tC&%Fq>KNaR@5y*HF|gG$l)kI4fN`}yVEXfWRg0Ajhj2lx +z*PiV@-+Q$S7fVwSd06IYse>{WbSa7-%oiGyWpA%7+kg}i&ON;IMo1-8CAys6yXVww +zH!6S&YfpvLiVFO2Hl}U|d$o`a>rDmW5cLKY1OerOd~QJcT%LtJ0qto(j#&_XxqZ0v +zQvtvLUjQ$+qJCMxcEHoofE_Zm`f?%c#`au2t=~U**zoHu +z+L1+3DU9-+YV!ljXWU0bWNjI%v-VC|wKVq#1?S#n)3F44n2IEDmLn~_S6a#cdAoNA +zdsOXVyNgbH21&Jq{#JErUS5fg@j8z=I7)wtPEK#*EER_=^0FWl)+z^LeE0}ZP7a2t +z_@eZH8g3-uulJ3rg=FR|FSpbpB~?k^NZJZ5iXy~0yInkT)Fm<#wH2)c-WKBXto&LO +zvyZTnxf9*gC6Saa)GAsMm6EDWx+zRBK%AvTZ->36&l>M3yHYpz_oaHPf!p$rwes+x +zEgpFd377gc#7R6B6n~;4L&Hpl3s`QUS22FeQj1PVY=h!x1A!WZXczq$_w5s$(%UyL +zq=CF8-8A8=&TO%zCrO25vX&5=l-jkwZ`9xYedEK!hApt}H=re`-HeAQxpnZ6pP845XUD!_+I2u>)}tWc^lV}|vG1EPB7*rK222v?m68Mhx5 +zRj+Ccu|r*;mv{X5gHh^Plm^FBQ1X>#Qe1NT0LPIqBT_XHVM#7ODeIIgj-1rVn&`-Q +zYZD1)hKudcO&k@>z@exLUkqkYTPLAKWF_>1F@rED1kht#JRkAOHVA-nk#`m*bCJ)U +zndx242Cmv)TUK@Vx&F^g`LEa>T}1{wBmV2^a%a65|8;$>b0`13jnDP+t|+nfPcaQ- +zuWYCJTQt)wNV3FtH4ve877RX$mV99D(?ppe5Lgni@Dq^sj2a`Or!1%+?ZG9U0ayj9T|xw4W49O +zJP&&D<%TZnFT<07$WhCGmf)n|3d0&Hj)wy5Bl*u>f6r$WW(9gY#{ep@bJHZt6wDJH +z$reLqogvdjR-G6IhFr?K$>$N4buGCuyHby)A(VxPf&_gfJA2Bp>avK+cU=N#pn3;s +z1_H&bY>}(PRkiSmILub7<=#<<^A$)Gq8LNlNA}kn3(2L;3E=en#%Za7}mQ9 +z+X%JBF=i4bJD$cDr@EGxJ7(I_s5aHsqBAM(+#Hb7B5N#_-nBmvgSx+D)EIC +zlWMtsT<;JHJFc6MBdF=Fi7bNHq&h~Z$T<{5)3(Jvmc&3jn2sy2bQ1DY%t7D>X91i4 +zLxUSunzdzZZLRk&!G+kJ5rwqC%(>y2P6$PL#7Gdu@Jli|ZO^om51+~ydM%B5p_SIM +zWzmuTWEGYalOp$Zw2bPbN_|XKs2r7LkftV9}Q<^Zk +z*9@YMA$cm8%NUopx)A^4UzPt2vtyj@+0G0|d>F?OqUkKFG-pi;|B3mIQ%ZG=QexGT +zcBjL6XEP>FmGmaSaoMOyq^RkeYl3V8CQ-l?h=Y)T4B07{>#$*2wT5j+qD{8}4((dr +zG>G2Js-jR@vb|M}KJJmax5=4doBklkEPBi7Vz>M{e}Vl1=eq4;WOISGR}6ltxJLfK +z(6#vk#+{+OftGxM60n7IH--cSQ!yblSpU!a@*9WM)uhmz;DyTEb^lbmCc~@D^@9(oum(SWD5= +z3&>Q{UF?VL;&L09iuWcE!m#P{F{9jyFkd@RM2-~9-4q)*#)xG^vN<}$ASoQEk;=gS +z?;>;*G%Dv&b>>>zLDbwA+!0VQ(YI*n9mAtVgxEo^$v&Te4BGKjr;tRaOl-s5RZ86s +z2$6?r+*Hjq3fo3`aFiFF-xJ}ux$Pvw{2lBl9_g*@DczOxQb@ZXqrwi}Rz0QUN~ +zRm+FdB58{2Uja{x4bTCj4@I>|fEZ^epv;RaQZMh(29BDWnF97oaLweNt(`1}f>%1* +zY-2;)IuSn=$Cj+-v|5^KO~=0(+p$G^kQpH#EE +zoLAUD>{xJ|q$M=?+D9FNh6HdJJMtK~-6p$%@z^woa2H7)>;Blqwu>&bOq{DxVtc*p +zR&rEM`|KWDZFe#y-Liwt3d=ENa434_s;chrE4E7jvmRY-w{R1dnw*cD_65%x2e}ba +z8oA4;XRV#e0sY&;?%OzaMEW|2C~mloprsX&0Z(9@CXJ=ys_yhQRcch`u!fwnJA=Suopu)DCyMji}D?_iQeX;7K8pk!`CL_xR+(~8otW;CnUbe@Jy;fYO~OSv=Q +z3NLb3#)u$tP1mnqXtY00Z%;Oa)On`60Gj=gzLemp?B$y#<2dg$B|w@W?`QNw!lvt$ +zw}5^{3oX)BXQACv&I;3yNzK{FD{{FLmIBnvA{a}ZpqpqIp}dC7#|WJRD!?#dgbD}U +zY1;Vgwtp6U49BC&9<-)A7c;d|e`@<{*keZe9H~56N;RoYy%UaKO_l{hr!yK+ExR5Xm7 +zsgNE!q)cBkMx^S`9+AVMm&P+n1`)7P=YEi3Cgjl|=(6z#2HP@*1Q?8=H&6%#Ff$B+ +zaHz;Yb0l?}$CMaW$=M`QNg{aE91vC2v*bzg`0<4^O}y%MM=gr6%{*Cm^egi;Uuv}U +z*x{ly`9yh?m5&JC-DN0EDpXk9N=B&=&7-v8RIsZmDpFRz>w?9Da{_@ZQhjaWq02j3 +zQif1LM`|(Hw(3)rrN8#RjX4gyT^2tSo*ot9T%Zt&ixsg-aqGTQ;P~}Rp^iNQ{pO3U +z*_8E}I2c{xrib&zWr!`Fl2mx*W3R-d+Zw+)c}j=JPi)@uYg;AWeQxVB!~Qo+1~(u7 +zyS?5n#(!Av+{J&rmCyBF?JDCx1U+K9QTLei+3Ro^q#rS4+|`3W2!fgb;I|n1VU7sj +zv!a6&9N;|$Y@89Z+b*0!aiZ@!%wkS&DCTyI0qh3RKf^lLm>zAMqiRnHK;D$*FA$0R +zE++Ty<}-u-1HXM1q`j-10W;|T>T)Un1H8SX|F`l{iS^I`rXPHQKWKp`BJ-<+- +z>Z$RH8yAd9eUT{CH9Lw}4ZmXWX$y1x#}QsPHxks{Y$W*oiQj6qq+){k=AyjbHfHn2 +zKQr-3f=vdiB)~@31F<~H`TCuZeNe&TjpSHaU)ETlSy}!VCslh;let%x!9;jrTwm!l +z^w1S4Q1+%WPBH95D}+o`kO*;HF-xjNjm!-8Jwe-OYsU;+WTZ+#R*=_l8Ls16ik2)g +zG}gIecCk--mnk?+%oW4D07O8qFq1Sor2R#+#jwz@nLECkiV+oa$2!wyUM#9q;r33b +zsKN?>Y%Cgffl?-5((_|GJwsuu+7Xyen)=*u#Sc+trP9Ra%Eh$reqk6vKM#2p3UQ@p +zAeJcfMoNR|t)*O3Cq+wz3rk}um7sBA8Krvt +zzl!u{rbqbn3_fyes4UXAO3V(NIZ@Ii?D8<+qn85Ipdc;_;T-Q}oB{fDJPcx^Fvaqg +zPjl1_Ne7piK!BvGsd@MCg!iBL>ylvN-aU$D=r5ta`MrBoYzW25<=lc?@)S#|qOhQ< +zs4m-CrJq!|S0grQI2__L3I@pk(m&A1fE_CfF;Cni5BJwv%l-QqaJX61A7HpM%Z{#G +zwquno-bYFRK0eRGdBK~ZxbD~m?^6cvF~Fj|Y@mVRvyTB5_)LNL&rb!$#lpqXT>Rxz +z1?W=wQU$K@ruUlu{cI^ymJK5`sP)Kpe#*QB{{5R5RVJvQdgY%Wvfi|ks> +z%JC75Pr~|1l4J0*0bb^DdG+F^oHPjD1DL4*ZzCu}vS0f0WJ`%V?o~tAf`v +zZG@lcc(H6-5W})MFAT1q)^Mj*oF&)zKw>r}#*d@uB;P$9t2`CLA8F`-M7}JF4jzVIm438cEeW(_85UOFr`(lGA)CprU6QT*w +z1vrDRuyRgW7#2_Ai4Uw}wSg&X2*Nbo;2c)9_b7aruvsd6cy;yuV4R)SOV=TD8?r68 +zWF{nLQubyS8&N|AldbAYDdZ7?B`H-81xZ87YDo7k+}MQQ#1tT_<0J;cr?h{@hE{MY +zGv7_~AM=);l}wQEdNP!`VR5mz3D__rg`EGZK)R_EVbq&~`@h}9ZVq;36em)U +z$)6M2{mH=YeAOxuIStx$bD8eTR{&6H@#;&65q6;%&DI`Xo6;qT)&e8qM8kmO| +z-vhTsRCDYNS)`4UbXZOk`tBav$QLpnHKuN4ibm>YOQc7%bID5>z!s60)@e9SBOsYw +zl5`~lbUUC>flyD0e-Wid32=r(8V$qSh?QZHYfDRjGc?38P7QuyFw`-P^4`>JbtZBw +z-8sIPfV)m6Gdqvi^?*JAJ6a~P-OK#PXesr?fdqDnPi>s+v-2aF +zRUz&GeL#Z0s7!$P048^KT+waFO)*{o=)NDrchOPS^qKGWar@`W=-|qJtm+m;$l4cK!?yh +zTU~_%N076*07ZR$*OBNm^WFbv$bSZ-tBZeT#s6DhT`R`_TVH*2C;z#X&-KbgP@?nt +znV*eEq#aWVpcjDGgCIT`1H!vfpFBwhAEUhGNPK|0^!%se^d!tk6!bFbMSW!Rfeu;X +zAP&>Or6aOAhSMbF9vm?dBQZ&d+Ln~4?JqytSYF*&UA;jm(cxmLA2P#H1OftJ*l3BJ#xuem? +z-zL!EtV}R7V(%%vmu?PqU*w=; +z9d#0uonN$6<`N#TRZO(UQp`?iVzY7|ZFMiYo9i1Q+?g>Rx6yTxuI*zkjMm3oDb~sE +z&W@rjT~eE<;B_x+=r&Fd6W{@?q1M?Oy&J?uuW0&Lrt_#%4E4cs7htHY8`CHZTy+r+QSiAZHYtPhte^_whl?hcEHkip4 +zV_MNs&JO$b^>Q5NkqzP}{-YJsoei;%%-&j|oTo!occUO$;o$5>cT^2xPmGKBua4aa +zbWYQ;wbqKiyy7qV2Z((@>Bgam^y=9u0bb_t5Q*eNA(r+J{w}5dg^m5o{~v1SU;e>s +z_~!*M)%fSR|E~+RwIfl*DL3+>zao$K(Yp#Bx8d1qCIB+-Sb5h#A>xJ;E{eIc-=YZ< +z7NEP`Kayh+|7JA5JuAjSRUt~0oB$O@uPHn;2YATQ2Bte1#hSu~piX8*pTY*IvWQLb +znQBt`QfF|vZ_y|)kZKxcBRFY7xsz-k?Ck9!jSqvNIB@mCteZy1a={td5NN4ZqymZ# +zq8Lsu!A=e-rhT&s@3WTg?;?!E;+H(bupQWnQ8&Pt6*PDr2`r-W4#y)r=%W2ii#z4o +z!{D3(S6~xZ6xnaC`_o}nT@O%j)n8t%M8QE4pIjURS8oUdSMMzEZ5@}@sNY0MNQ_GN4l&9}I_p|ry<(k#d)E!o}tt=G} +zmMCvBmio#js&Uw7n+O%if>1e9T)@-y;*Kj6n7VDIZoVB#ZYSsLD@4vYHsWPBB_6o1 +zN?QBUY~4yYZ5kMD!m4TW<}q&=(~raQ@u!sEp?zFQE9SI<&8yBTIha`8S2j4{EzONb +zsv*LOKq9_#bVi%(?VToiA@NR4nftuT;;f8)v0x+*1G*|%#{S>D>+jH +z3?ngUIu)Hnxy6pSWl7hB*Jm0T^9ZK_VIfD3W==)gvWJY@yRfH6X@X{`6y*q)A?bF< +zDS~61p`I8GJ5y_V1%lObSCxofO`}hZX+>5br-wVQ-H=70HC#LdFxs~-dbq3#^e~To +zR2X9b0P8gsM=_GLbsUBmq81JDQ#4wziI*mM)-qxNK`V}g66Ds@Y0ZyAgj6Qf5TG#{ +zggL>rbOKeA>CZ$n%rv@(Ip7^-5^8Z&&Pe8|U* +zQuLaq%*KTc%D**7rlt+k(aJn$Y{AOR+bQPCNolr|ShuRdNq5&h!1DO)ql^aV-WVqi5K)On*FSA4`z+CI +zjQgJQ{b4IPe_6RNz`N!U)+;!nTm`2ac&Dg;*Z#g^^5TvAwqQ3?6QyjP_JpCJ7AaFd +zTl@!&v9x?u-fM_Zxh;Pg0ig#tjIyD)Nm4zXVxzEJVr&(Pz2g|IM2l!y1YmK+O(tCE +zS;vTb_f7{~qvbg2^>td=+E2AsOD+kR=u+7x13e_oe7m{QZnRo8zK6&M%|H`^Lv81B +z)hQAW*8gv}K7vgue*b-`qNxu=T|{EF7j6qEm#Xg8ZGrDS#{p0|^nyI0w)UVcZ6by7 +zcjA0nGpa2v3E&-!hj?p1E~CECUmyt@u1f8tJIEny6BuN>^WBu@*~VbNF{oIM(Ic_j +ze<|R@FD94Mk0Q6rI1BDVkrhOSF!25*nqskS?nad}1{~#gRDK +zO`N(qQDuonRcq-nC;B#y`1t%tcmQB3vM~HuufgCui%PQ* +zUBj;haT1>olQBB3xT6@11O*GiTDYy=UumuM?k{2;0!`D*u(4^-Z%Em|tj+&UVKY7Z +zKsn+E3udV}YGK91`3)3T09Ritpm)?fYIgHMKQ06;V61OFcz1v4{`>bIFx5R_PN6LJ +z%8$qdG#V%_Lm6#$87$sCzX+M103`3@9s2jb>EGA%@BLOgqc3mi-&gc+t%)s|Nzmfa +zJn4l@9H}`jlQxc$;C#fh&^Lf`Q`U+f*xzX)jZNmTV%Xye5Z#gNL3pXq91|KykIa{d +z{jJPZ{S*?} +z*f8NI9S;&Ond%USHnF3_>W;XQ;{S>r**zgn$*+O)tH02&he0e|!(8FYL-~0EB%54S +zh9Orlxy}}>iS+0>V+)LCeXXG+l|&9%kHfcbbt$v-KGJ|_ZS0DUSY6k*c2IZNt5gKR +zUD^;B+$Of~4%z=tAUcjTLUqybCXPx~v1J6@fm_EgUxjJ(CQoAprqOe!;T*8@Orcjj +z1tTx@%OV7)lLnvB#x_e~fIQhWw`duSQ{5v&I+4l(y9A32JjAa!*sUh5_?GCL|F!U7 +zp(%uZ3()#s3mN>zU@2Q)5Gy>YI)#a%c(Hhjj>M|`t8xaThJA#25^Y`Y`H?I$onA0e +zATOL%HIvwNeD1BVVH*Ef6>3l^fhl^DcJF8YeZms{}}_h>n)Ns4Bq>$9t+|ZW8}YvHvX$i%j-++M}DWhvAVv|>D+iE +zh*_aNr-ca>5S2WMq$;P6FT@5#I=2YSFS;9Xi7kF$7$g-=UE+cIr2wI};rcHl^*)U8 +zW>T;H!izLgi&V3VOO{QlK*6Xd6<5oz{QfwasCfSAp){fYCN;`#P41+QOOu*ov`xRp +zB9$8$w>wy?EVbJUCjrn3+Is15tkT(CJl4C<)ju=N|2Mna&tC3cv5y(&|JwS>YVrK< +zz@xkK{}w)EV9|pUsY`MYF)GQ}w1xEQ@P3GylgC-uAET{xKxQKzAJSQiZ8WI-gD88T +zod3ce8-M#bx?7`XYgr0 +z9b!%89^dlz@{B!mVXTzj4|7c`|LH1lHCR+6h{KL{5bUb$r!D@a+&0y>F@c- +z`iDJEGfv)6GAIRt7KQx>$I^0M@w?d=?DXmDN~xc?!nUW}uE`agwn8o{;6e;%ETLs;@& +z(qeF902a)9&nZB}ghY-Rvh`(eFb)cg2gfiP1gR(SZ+|+3MIg=uSA$DMVb)|wbpc(D +z344U~!>L5Ehh|Hf;`jl&9bS%e^e9JRGS;pJ6jTXD(}#(r +z7&A3j5rq*EB5^|yKhR2fJbJB)L9&W{Oba4a%J^tmFe}+1dAde`P0Ggm8QWo-6(Jx{ +z+Hq1zQaCgy@HUPL^U{YVJP`vT%L1=@r>| +z8V#^Ii%Eac3ivNLg?N_9FqGSS#hTb#K1_u&4ETDX?-%e0w*{{R4-TN5v2ogSK}?TP +zlxbRGmJw=dQ%@Qu_X!P?1=)YY+2Ez)*!R49RWADEm0$4D_dGk|9fdN&vfOZ8;wfMh +zg^i^pWZ^Ls0eo#>jwD)AWw>Rjyu_AGO_|(K7>9VCp6SnyRb_`BYKqC9N=K?{ggpGv_g?!5)PWHCC`A0 +z;{2!@p%R&&@*U*=Plj`R^9v5B{%@F(k$p|A|DV@jS`s$b?SC9_LjEe3k|F1v0)s=B0A2_wfAS +z40c$1VKH9tGdP+6`EU|2maH;AZqwt~JQ}sKrZ1M_FW>I`1fYXirhj03wqwxGz-K9{ +zV)NQK?YuFEswDBvkT|jkL5I+$wMhYG`sk1ccmR+I;xHL!uns(aXJVMVP1e)X16wR^ +zw3h!jgc$}h9LG(L1;(d~9Iu6_``;~px4Z!u{Q0~EM0R7P-TBTZ@(7#<9Y%y}S^y%0 +zr}GhAow2$Ku}|V|Z$US*BGiz0`?q)L9JS +z$mrqOo#iRTsFO_{enuNuYcmjA#sTao=up!42<|vEy%~5T5ccC~4=lp?Gpn^?z{jq? +zf8hTWrto8u0MQ?JKQ=v*bG2^eYChxsr5nl2E+U +zA=7om05DU;yb2*Xn#=kv$NatioXaneZ4;qzPfNV7vyA!mPaem=hqDmGdtRG +zA$&~EQIfBJVO|UCMJ^x#u-Z4WENC!lbmjOR0n%_syGqjEJ*l9__vQ3tA=Cpna61|IB}|E&K~D +z;2)}2`*IV&4+w!ML@b`xIq3HYWQ@8K)y +zEX<=yCx@SJr59MEIx%=AsC07H^iQLcQ+$9KcFBAd+TwCezq7Uug|P&@*Rg+)cJ3CP6g}A~wIm1kMkj8~>s6u;av_Nk+;g`8u({ +zAY2d!gYyg+##=(TYy{UV+M)_RvQ`Xy7d|Uh@LAPW#LU66%8(*!2Ek;Zl|e)0TG6g9 +z45!N)$P0{Sn4Ng{(CiSu6|4@Wa1G53-vb9&bH-RO{opKAG=TeX{!{#Q7UM$0jT=G- +zj#z@)Lb#sZEDGc%5~gKNCR%sTYX)&W;$XfND%S_w-gP5 +zo|BmoK=bcQ_^--A$2Bkj>o^XxZZHb#_)HTqO6G*?b5Fvc-Mc3qcVe1E=1+N2$D;^q +zLfhmCS!*z +zj8@S`H6D)#gSu`*Ts%n*LE~Yp$-H|N`NgPDqC;E?;4Wm*J>l-jRNxhWOtDwZ5^XgL +zq04V=DUJ=6eH?Q}CX{i}TM9bfaAK=Q6ws8&a +z3M{@B-+0LmTQb)l~X_CXDU +z!cPNQbb*D+g-bdKE%=q}jZGW4)3t{dJ?2C@e8*>dUd5}qz1zui%)nIOY`CR=ZE4rt +zr}&v7|9!Eyv-|4cs>VP6XAb+{N5%YaYioD$zi;PbB(b#U{vhgxaTa=+}*l3DLHMls3AXasJ|r(qf%pQG+PChnn+v02cgiehp%+4}b!EeA4GzZ~bB +zy~q!|E_B6uMpRlR{rn8A4oJtUIL96^V%@RP-mvLJ9naO;fz$vFnRM@XZ4=`M^@=!7 +zvq+*h^HHy1~aZjb6!qLW#qRqvt*65rhHc=n{hBU3w_;>)A(L_BN +zG<`hI(XtXB5*(YTi(5)Chwos(*^0DIRgI1nh?LtD0GbPksNb_wj(O+lnUHKEjiF06 +zCFx;O3F`45k{p(z@=$~u2_DmnILtU(v;@cOu&$ODc)qBs%ttV=iCI;71$fV9HViN_ +z2=W4JIw^KfLefaWMUx`0FwGY9|I@C2u>bt<=j}JU{@#KA`py1d_MYuN^K07&@EZ>1 +zpZ5-b+JAfKLy0%ruMYp_??3mqU;WMh^WLjxO@H^Vuixw*9QgZhyuFvNU+nF|v%Ob4 +zFWx@ed-bFL6zaX&KlEShz1%y5Mi2LW>`Uhclx`3Zh*Kizw=clfua_k8d0 +z6}I_&|Bb)xzutaxxVQ86#r7Nj_1ibE_YZcV`)APXtG!px-#{%YC(`|+nk|EK*I&vxPA(_I+Z_R|-;+!ah}=f(Ek +z%clQq`{nkJyHsl*T6yDPF&>@&^H00@2>aWH|L+{`?Z3il?Ciffd;>q5Fv~ZGy6Vq+ +z2fIyw`_0|~4Ap!7W*?eIa6*lJY6R-N+T~Ud)V{MKPy~O!J=is4dA7U#0@^yj%68$~ +z(N5ldZu&Fj{MWx**&x13AG6N?we{lp|7ZpN+@1fo@Oc?^(*zG)|1S}RLOjUfOiX}k +z55{!VKBt%p&)L22FJdJ6U2A#y8}D_R;Gt8m{rcV0o$q&cpMJOa-P6_W#diDI^5S>T +z+U>>Vr)r*BLBb#zpk(EuI%i#R~NtgZuQyX>h|vT +z;`h%x%Zu%`?d7Mt+t0t-S=;_n`^LK`Js+^mNL_wDg9|izOn2c_!oDyVioAk4yK&F0 +z_KjyAU2-zy#M9)z_C(s9?{>d?3KiRrpo!J*o+0?>ueqLSx@OYOmbXM1CA3 +z$H4%~@fX#!TF{*&CNtSUB5(MkG*s`P(!FQl@fZd6^cNqz2?rr7kL4Q=!D+qJn~bL1 +z8O+4)ZN4RM(O_EJU5wYe)7QiM*UwSB(z$RuPsh=q*IK@GD*^{+Jo4<)ZJ9BZTbc`- +z=77;f+L;Wa`C6F|Mi*;qGK^;8<1SimWzjL3HJ;|J!-gzB~VKC6a^2u}0GsS;OM&v4U +z4%bA|;IW-?5T8(bEA;U=flDJ=8su!z9EZ^0-m8N{xGo(X?C<<}_wWerPH%R%{#aL! +z5BFd5v&ItRVzI)Dy{CoZ@T64u<=)HPX>H?q?G~QUE*0dN6!!@Jk*`B~cC^#53Y +zx&7zehX2R^vZ3;v1QV#)M602}0A_r+?@V@M%YX0Pqm-g(Bn#hBj4fZy!@l{N4f(r= +zP3cK+J1iDf1tp^v|0145RWksAdiH?#c$}6+UeN6(Ddz~F#1YAG7-E +zYZJV?kMo&!{+mn9)%uum{y$n^jQu%gxJ_@&LB1qVI_z-Wne^E_8YPFZ~0S39> +z;+wOn`QzKYXImGzH~%?2KZ8?>M!3?!Mrts+dyiiaf*dW!GW=zJ;t%PVD%6&!^paEj +zv2$CM7My2RGuExBMvwQ&De0N=vfQcx73DV+D1I3BP?1sf-syrtC~fYjbW#Uljt^-_ +z_Z}Z6$$-AeSpKrJ^I|6%j)1_X_>L>z+aKl8F#0DoyH#73r*LT@eLyhSW8O{;DGDDwPS +zkKos{{htpukKP`D;RQvA$3E$4qMr04asA7OZv3-cJLKT^1?`m>g7q +zg&#!6QuId&s#~0&GkGzYe-;3U;C5a)tWi%jc`!acIM4EMXa=-5#Ff`;R;X%5bBHR% +z{3Ux#1JRlSvX^_$Ud({%Yq-1<^mji2fMyj=!;6$f*w0h+O~{7c&NiN0{O9oaAWT0+ +zT|nmK^SP`}GOOBOU%tS_nYTFf@(kF6H +z^~XyNot#dc9r@62l|J7NC4MyzCHChc#YLLhxdcsJy*`?{{9B@_?Hi)06;x8r_3%yD +z4^!aPuwnIXH%7~^o&A?^HGG~7n2Wn3uXp7266Ce;hjA>kCtJWQjHoKeM&!0DYVSh8}4K^eA?{xH!&Ep{746-5q_nGUwjWLGJ9tK9n +zI2lm;*VX4ck5(Q%Z!hjV+Fn~+U3s*=xV^l-zS!Ab={$p*!PcTea5vBE_|Sw7RPL64sy56gEU#s-hNsg-K6<5fjfU7@Yzt*fBEKd6mO;{+2%>q-~7ku1pW)@pUpJPCNJjtqi5Ue +z+fUaQpMST!ytvw3Mm_AK?Zxj_o<41N+S}XDmfMqt&8tyZ*VcRZKM*%QG?9iAsWUBv +zjL8~xAB%p7ADbVKmnts5Pkw6(oeO@Z$bVk#{(L=s%#i=ISJq1QpY7E<`;S}s{CpbZ +z3z`2aJS#-*34Gv67W>iXrSYhT&O51SVL8~w1OF{O?rr#Sa^|a`D294&s&c?}q{$~N +zNJ;=fP8&F +z=!TMHGLUv_JDh=T5e?io?9gLNpBK;0&K7YLi{o^_kwtqo6XYB}^`D~w9I8YA5Y9bd +z9jk^^oT-^)_$eAlC>M^UC9P5{^C*VFq{%2HZ>cuWKb7g+m(*qe5GNRz>HK;0xzzI+ +zB{-FI&pxn&97shH$8pdnPdSQkOcvoDy`pMpWD8_VzWOh**LW)MKZ2^j@bp2TiG +zIG2v1*jIY90+?F<@0(2D*k=m;zn0ja_?bcfmphM&@jusA*Y4tf-pWVOd^gA!A;6>n +zMn6aKUtc$M=pr(4=cq<4-+#@bIP6^SC(IPuAIB0Ii5(E`ERe6`GiCovfY+rf_rXfOwTb&5KIQno +zYyZbzyN3DA{QNK9|8uN=x7RzqQVg(J_FwDEkBau+>#KM6U$^p^Ghh?4l@%eG@G(YT +z65nx2Tp(X1NrC#+`CweLDR^nUX5#-U9P=LoCk`Y&J%8dq?nPO5G3sH6RpywVd{EhI +zvR3#xqNop+zpX?_q)Z9#Ryad~#8*XcH0VM8BjW +z-OqmL4traO_YW}?@WcBV{Qpm<;b4$#X$BCVnjdf+{E32CZ>`sy2yJet9_phhyRaz~ +zpecL5>2pjF2}?oyhVP+SQ-v3zyDPcMrvoM`Dk?^2*+OZ9s0uE8SKKP?Tp>#w;Kjx` +zraxRwZkfh|U6(@akD8wl|3^WTW)fz?+6B}}(xONi^{DADZ1@X+!0_dLywIpzTJn*% +z`e*m}uSWmpIRAUWIja4-gE+q&8!$`$w_42q)MBUf(1}gm;bRJE43Ar_R*jl-A~kVf6fzc2?^I;2m4?UR%Q#jIzlAfrro058 +zIha1a&2_SSq>T;D<}rNB?i*bG;<7K>rbQuAlhZ_{fxhnZrOYx0jYXey6jsy1D@j<84!Z +z>(X4L{Z^*c0_}fvTckh8fHBVtQ61&s6lz{LCM285%+rFune)Pmr+1Gst!yFRj294~ +z-uHxj(+j+DQUSQENU$lFfZuZljh8_vjzQ6w`s!JTbqn}2xa@@Q) +zKR@3Yf$z#^gj+^&{%i0i8a36p@$HG#g07~@=(FbMAj(PA&*4~6=}3o4G@>JAW7Y{H +zH-$pqZWLTRbj*FhyC>&EZ5OZ$`{t04T!O&|P^}&X2IN$yQJ&Nby<@CQTdKtUM5Bfg +z34O)GXb$?1dRw#@y)pW~`lw9**YD#0-OA^B2_uG1-!b&RoC~}+9*#trAltFWsoF45 +zcgzIs$_Ipvu$E}(w|qf(P&ybe{grbz+^aqq?%m+2kd@AaW7NJlq(6dhK*!+nF@d#xi2cD+$Hi5NheAgP!2IoJkn;XgwHyZX@{!bx?N+i?3eBAGEpeD2F +zX+NI~*quXzMq!500iQl+A* +zmFCBAC{#F$dim)V{mUg8GH#u$P^mkBqhhP@@E^%>@ewXY@fl$eo^>wh_&uVhF{xl( +z{6qs7xzofla0*}5AogmAKtfqXw6zT}rFc|^a6VzPAJ#^fn +z{I`k^GDa@VaBDDXkwg$mSvDw1E6aOuAKhTRPoD5(>!kV*8%?9DckXG@AdTXJEn4b- +zohAX8)LhctqbV&ivrI8t)*q%(YF87{(**6p6%y+ii+%L#B59wNI(L&rN;i +z;Qy}d2QZ8O>y-JwcIPhs&#ipO{=cW99^l0c1M_1Xe&C1X@-6pw@g?%?OzEd|%J=B9 +zh2&lmzlJJ>ynPk-tq)McOeKKznV51q6S@eN5@u8RyoX`^6R8NCsogfkuQ!z`gTOJy +z^tar@fRI_vUK#lrU^;7};=XuF*@@u&H{%#O_q=-xL@%ulfl0tFeR^R!Uhq6%l6z5~ +zyrN-t7)?J0_MzpYryb_%rfxY~bWAmAz-Q55;2n!)SlGi9?c5!{RlpooK!$+>uath( +zN*&%!l7W`K;4Gm%Y}xURqRa!>tH)UtjKkOq)Wf|N2KiZl39+>_zlls)Na@5mApm95 +z9&*e8m@WE_P(FEVNDdk|1$R@jG>b)|UX@lo|ycyxNUp!3la +zcYx63Nl7MlZC_jl-OjUTPfM`lmN1bVrn`fA2g=3JD&F#6QNpZXFgW*Mvi1=I#0diP}R6H_9Ra_}&CKWe1 +z?n7YxX{#37T9Of>-6fKl@SIXHQl<_sfvGBVr`alh${_R4!ofgBo=5R{ly*zYj=9d# +zE^M!lp?{nvL9dI+$IPJA?vVwTk)W?8+(d#X&+rW}NkJSY<7`0ak)I`=6jVv%Dfe|a +zh|#)Ti@R`V>_RDtj~eBk$d@u+99l(HizY~eG2`Sot3DEva{+{E9vvbDFLCz~mnq~g +z9AI(~eTm2X_StE2mia2PJ!RSrOOuBC9Omk?NFt)4M`&n4mnb2t>PPSoEW;47tUP-! +zV5)l-#6Y#5X=!3qQpb+{7r4ZjJRmnDRg2Pc!6?0()(Kn7phEE7- +z&ruS6Q&Q3VK{*N&BTOn9zm7vXXX`Jz6(pm^26i&At;N0(rOklGH6Te*jlL^2&Ntdb +ztSbg$q(VZUAEDf|YwyCZ_nC+Oo0I->eaxW$Yb&d3Mf$(Ga;N{fmCv;jJtV>h +z%xkI>K=?^b@n>3rwdU3GTWHBj{?*^Q6__ab+d|jdTFsBYI`XtbPut(MFK8InE|L7U +ze%En)V(AGBrFk*hv()_UMnj5rW)F(D%o>UbfSoYGP3vpQdO +zQ%LP@yf$hFa@RXf#&M7QI1w}SwIwe|8A$G4aRurnVTS#8jil%dZ+Msi5hqC3EV#eJ +zg=LW76`8D0BD~6<26$bg>tn!56@0}vD7-hu;Ta8t+zzum9d|LXh4C+j_wd?r2u|@n +zM>&=p4Nw+ZN+FeUH_V4&9&i$1_|f!#Jvu^N-DjP9nRFB}E)qP_3LGlS`Wx4OQRV%n +zA-tm!AIc88bfYE>5;r}uJszvm*p{t(f_iQRJ7G3_Z(4rKL(Ek<#~c`33JPxT#mRE1 +z%K4RsjrzS}AxYDmjP$g4oaKp0hgkIAN>5hVuiZD4#-3@El?9=jcl4Ivnv6jZ5<9hiK`{Sy19G_g=rWtKr-;v1tV0)!=OIusMqJXF-b)Qva +zk~hFnhD%z9i)Jz&rdb6@T`RWAq?D?0Z)$`|?-9eHS>$!7(gFDcgI?2+eO8$nm^i*EldUb3I=hF}7|)AHjxi0|%>vF-fCfVRb|IvJ@{pMV +zs(Z9YV3Q;izu4L(Y7`~Ub-Q(`^>10N$#hD6xPtM((RZwgwTg6!x-LE>TWM=$Unz+& +z5sh=nNrZ^>hd=xQyJMfAd-tlS+}Ad){vCX#-T&$%Uqp511!+xnQo4x4%6IrTmo`QQcDckc%9Qyox4~U*gX>Ej(^{HE+N~1*ndxILMaDOM-;|<; +zuQ9XCHB#ss$}Dr^6#93agyxP^-;wIOG&D%J1A*7Yv(6lk(eU(Q^{zSbP52pQoENVL +zd;BuBl8e{Ta*m5vO-5|Qcj1aG;k$UfygRx?B^DQ7yyCcbiQdi%z~s_p_Ntn}k~%io +zn8Ej$Gt00pVUG_>eQ?Y0%Y5HmE~dL&Om`pinI`{DyH}6>kDrUj|6f~KU%rd~e;c0} +z>u*?*EA%l#{=c$XA^%^yv;Vr4&(edf>-s!+?>+DpukWY8fslnStH^^a^H1Sa3DWNA +zIl2c#qw#<(bRJliU^$%gAEVrR08brjFN27#vDfm_@*{tFbz^mTW6d@8dVh^GTk^gY +z*@^#HT%}K+IM3h|!bj#=O^^7r=6Tl*=H1WiW~WVKvTL62(t~R=l%oOfpb~y +zqcGkD=)xox??a5#-^-xjOaA7cohDgGAqg@}Ad%)={OE|>q{K3fo#h6k3@2DBd$86u +z!xI5z018u}88|@25d3kL``uI6^AG4fM+$&KFOJgi#D9P&s$fq~p&?_!hApUCjZJ^) +zfj`WB=o?GJ4{=OVCT>)RJckCD*iQhc%HzOBsdumFF$xYbso7zNEm$Vy812X=C +zh89;!bFZAao;c1i7!33}kdvH^wWHcQ32+SX8)B>Z(t8jzXB-YtJX(Cihgqmo|@woqPrSoA^1qiAC +z0gIm4Rub_590lQCt4B_mTA<4sbWE*gg@Sh$OX +zlyHy-Gz8^MeH^0OgX5n`sMkbi33a?fOOitg&+@Yv36o< +z0AI*$WbTS({@o!XUw$h{Mcd>nB9(P0Uvl>wfWP45VeCTOB?Vvp_vsJk)&HDcp^q8< +z|Em@8|5n!4?({#m@%c9D$Gx!cZ@>NP-iy8MH%C8t-}cZ9G_)W6Hnl{49fPf@Aj5-m +zk{+^QWscG;4v%H3vCbiDkalU?dLbeLlGCGb6n-ULwCL?IBMT*s1QQ6NT^E|7!)8kL +zKoQby=?Q}lGPxyc8=tE%(nwwV++HTp6?xDYLg!P|6Xl7LQ3hz)3QcU#jC@~tp&M-j +zRFF48ucsd=QHXwtUclHe4=+(?LZ(_p%1P0A<5{N#I?}S3g{z)O%lhE4fCF{iemHQn +zJYyl`2q-wr5yg-X92_tLcSN4SAUWe1BrzIdqM!X^2HlfiA5+;UUt0c4#sFvtmq75` +zf%!iYeT*%FtsNtDc6@{n2d5WAlMO3R8;phhm3CS~zr8P3V1;YI#eBaUjD; +zBI(%+*D3(oAie?^4pk{+@GVRKF;v2FNZ|yr$*xZ(;%b3i2W!W^k~0_LHATt +z2PSYRj!T14v;|xTT2iVI+ExZ(5es|45}eiz4dVD92#=~hvFbQZuwKR)TegPsasQ0TiR!g8hTo@AIPXt8$Cl$x_O<7 +zzhYxom5`Piyz~We^BToV)ooo)7Ex+zUQT%a=B{vC+q{f8b#orA&nDn6W=ZIyCd@D& +zs1f_xT+)B;X9oYT49c(6$8`R`v$D3bQsn=am+#^~-pc2?Ir}|~9%M +zJnoT;R-we_Gx}24M~7+W(bqEhntqs?r!w4|u=m>INY_>(9ty;bOx|@{eq|Uqt4q{7 +z4ZEMx;H*A6;;H$hgU+IVhDSNY@C|!%-aqB{4~~I~7aG9eAcYoYRS5=z3)J9pc&rsF +z*@qbk_4U{vbdzzMn`Y>Qly)dKOXZ9Um9TFNe^Q2!-LcazwO~d8wXr=9Ek7a(%M3gx +zMNv-^GHOz{^Ot+C^tBwm*FQJ?^M+rqe{T4X{W^U8!T;=Uz%w~PO~viMnu^}Yn3ba7+Hb)|(Vp*)iC5>}gmhP?jZVgeEi*cb5`Ms>BGe +z-U#qn)wCD2+B{ayy7gHU(}K5a;uHT +z>%Gzl#uxj{DXuKgU#6_u*kOXP(*PyFv?Xxu|HuOYB5oc +z%|^e|QLAlNz&P+zim#F`)@W(DeNxUBx~k()9@4{yb`9)+$~!%AX?XOos`YlM^|ssK +z6ZM?t?>3E(N=AM+zaYnp3~wR6h%wR6PC1`WI0#1ML@`cDFg^;|I~c{+l&c7t3!y@67hSNspMH8- +z&v;|Po`f+9cU`an(3>19CZn6Ac{=*$t&u&|<9w9Qp;panBZT(7@wh|;%VclFn_tl* +zi|7IUs?}V=2Y3}}=2_;>stJx00N3^KbDokCs~>&#m9Imcb49VvGl{zZn>e7DqEPTt +zl#DS3b&Bl*vSi~yo;55ad_fQ-78-{2r(=7jL9eHV{HNn4wZgYeGh$g5QW1`V9K{Nm +zO-24tJnK7-MT`S111RTks680eto@3uj+A%Ag9ZOjfAU8d!5n`M78GsNq5>k0dRqA5 +zkf2jq37l3?dY~Ke-By$h9g$QV?lO;9nY1hD2xRPO0PIf4h6a`r=!el59-pI&R~>Hf +zWr|B5;N6lEaEE*Sl4k@KpSTvDijxT +zrkX)~PPob0+VFgY4vs@W-jE7Nwm5rsm_?9uj0ufH$?@R3$*u;_$uRvp$FpTEzGUVr +zxbM6mvdcT6?jXiBonJ)em0eiH@m6vEq#-$=QKi)>C*AC^-<@ukJ#z4L!(d;SVG%Z< +z#(6Zvh|f9vz921bMZvsjc#c;HGc4|Hyir7 +zbz;*9k?_*xS5siR^H8lObpmG>4xs64h7CX5;lnL!aBSHAK<=wlz!KZhEtB +z8}g6{2v;ZY0yl-RSJcf+;SSu+ZcR#SobTW#gt&wqg2Z +z%#P5zHJqENo12bgf=-i>r-UvpI$aWZt_LB$IQ%n@f9J*i!S1t$LI-EE#1GyQCE~Ps +zoNijo=mLM|jsM~~CDBFmzJFi}VS4`JIU6;?dsI3?8E6U3+&B{u4%k@Y*=b|h7B0%V +zLE1x|9-7!04*zB`Z?+=&im2xv$98Io!Z2A^BUHP(Iy&pzPgY~g*pU=I&J +zd^?LyV!VA}6ovQcLT2BW6oM97N*5aHI+EjT)CQm;);MLX4xG9s>)|XZxxoVL(BY-O}r~XE1taIa>XFye+ +zb2qhD51`{r+e;U@2HH&4O$F17%Pl73=W4s5O>G*)8D-@h1m`!k^Dbf*QK_eL&rR$0 +zL;+>@kquH%gXX}-BSP}@B4r*EGh;e7+>EL1IA9vn_4yK{Wa77Yh|?* +z|8f1%qepl4pSST*hGMvtA2Gx1?h+EMqwETP +zfKq!Bk4EvQWbla`fRODNB7x5+vc2C0Zi>BrfJ)=7%g+YMnd^k5Q;TMD3Y%fNv!NVn +zOOjI!IOnd)d##+CnkbOXLf`^`$>xUi^u@7ckCPo{zPi}8d<8k+_<&J=px^k%VK*3O +zp(XT>6Um7REu97D$Yl%zas{HWD~3nHF>$j*)XtLephwqEXp}UwmSc@T0f!U~Xkw_R +z6P9alY2Ocy;eHiJhE+nP9wnknTBnwOjXE=i6b@cRe<2=EJNBp;)~5!tt%(N0>}}KT +zd~E|^>j_TTwiwp)A>&}h5RfGXvJ}JsS|Ukx#IZ=ys)4GNG#OZSdQc0^fN>M^LqC_3 +z|45G7UNT13McL};xMNG`b(SW1j+t}W{|W}vPd3<%kW#`&=>8#Ww2}^@W17}rZBjct +z0e*uE&A&AtC=Cb~QHrkz4eagvy);6!8>2LX)j}HiO#_DC*mN7HK&pyH?#UeJ&~B1C +zWK*@k4sC$V%so(g`G9WBIF|&$o8We#eS&QfH$}H7wOk)m06r`V!|=0_A_+1ERr!lv +zrA@tj>WTkgq~A@q7Tvs@S>@)1ZIsG2=1}jKE6rncST(o{)~eLRIPOJ!z}llJrCnrGae`n`R>p +zvuZ2Y*80+NXQ{L7ciJ26&c^B^;K9>0JP8KEtvMdeCdT&EP~1~}wai0nM97iZ@-8@| +z$lbico0S8`SdtVwT%-M*?LuLA-P5$rF0>1+g@W<3Hajtqf0T$CO-9QWla@6aw~5^> +z`W2CED?^T|my-Ls_^LV<5{ooUDe|Nzqt=IQOK3A~zF(YKyK|ToCbeR`U)<%&{*#x> +z1iD=FCZz$m~h4S_Qt$gRM7*hwjMj +zn5fQ(D}tp8cD{JK{bKJaW-48sQ?i_y^Q_O=LaB9<#V@iWB2521)XfZeL1P5EuBDntQb4=n`M6|(v0Old#)vSJRF;J#6&(VEUi6w#ZY +zPzQ?l5Tl-R+2>`tG7}&o~XGcO)}SqV*FFC2D1bTfv!H%TKj@ +z3&J*B;MDrs7m>TqSNUA>{(m8b;EenK^4iLJ>HfdAdUyZ7jn56<|CcHS0IaL|ZvOi} +z>nC^iU%uWxJo@Q|*=zlo!e?)4Esc0Tg)uT{);N@;`FB86FS-Ar?EHPq$p5#xvi_*J +z{~xvQ;=kU?XK~S6T(tK;{kkUkAGEdI?ItPdzEqXVRYG+z)~oq&nbq^{S`*%xFyoyGQ>GbbNyR|m&0x|iYlwh* +z79cKEoSLsGWEtuNLQ3LtmZTpgxgt>XxEG{7xe-QTW}%3>?QRvXzl<>M!&Wam9-ly2 +z`dfU-IIQ=Zz8r#Zu +zwIg2aZ$I08R)WG@o3S-YLo7b$rqso^N)5Q1^vy1gs$9%dqe5{WhYCl}E9m`V^{RHiRcl%Y2bAK*WZNiG@{Zd0;N4^5 +z>(`NH*0E3ny$foL5;a9Sfm*0Z-Ov0XIbwt`3tfzd1ievE0Gbhw+NUOASnvM6`QagK +z$zI~!yVuo&?&64Rt(J2biAWm?3LFU8T6lUv4SWtu*5`oH_wL>6Z;%U-U&lB1#D=vC +z-+_nq_#b(QVp>=Rt%C6IrCOYl=$M2tk--bWu=4WIi}Xk#MO{YkK$ZpCm5_yz){cXo +zNhS7e8<~y&CzN3UW3kXiRrz(AXaMZr&l)v8>bUVnu}g)J+%4fcRH*&G0(LG~%gKcr +z8epo4cZ@7HxR4i8KwSE?&!U98P!QkmP1CHE;W6{%~GcQ6Sj<6{4{~yU7(Cg +zh+2R5_tu98jn?8Hk&xbR%W{keJ! +zP5gTcW6VT(?fPh$Y*M9>`+vL=P=O91ml;g6BBz&9!iQfAXK&LwarF0{rnAaT|BJ&! +zzBwqjtxq{p;lk*UleE03RIzGeq7X((5#gKFl0$SbA{$qoaCB=}RUF-9zppwc>vg&; +zTWt~#W>_mJS+};L*@gxmtSwbse0#Yyb0upI%dJ)#&8vZh9|+9UPuvs=e07RRr=X89 +zo`jg<6J6@)$CkP_)uHbyvaKH966Ho(A$O8@()9YG`pHiB+G +z4h9&himrAo_yYClFFg2FjT5$_R7gYI;?%XZqyVIp)6yVlD*A=DGIrg#>6+@7E0tkh +z(QuxQL-znFEwAE+iKH{ps<^lD9kUK(r(eX;eq(FP;ARbXPT+GKFHSPUlpS~@op7Sx +zXtipMnj!SKf&1{RRa1|Wk3eRD^vhWTm;|T6LcO)vxZhepHM)0??Y@$aHYFejLQXMA +zqdl`uaNyXsK3t#hhXQZyr5!d*zplRg|Ixd(X6$uHQr+7R)Y#SWSRWmcj&Xw#% +z$-M%(P!uu?Lv$}!OW~3axdW?0b>2f7s1%|_hzLK|%jVMK3KCN2zs}3=k`Y``cNtN3 +ziQI-I#k58xt3ZVWoKk@nBCDv?q|ypl_`Rhv9+9ZUzR4ljhHgftBDIy*h8nb5Ej@TL +z=&2-rOewP}e4t9!{y6&45HAbyvLab@B($(M%H}My2x7%%j};No-L{TiZNJ<#gO%S~ +zsy%u5QYzCABcx@nQ3I<+Y$NfEHMJxnx%TTFGEC9OcHcg+0k`C|?)!Brr5LBLt#2=X-y7eWTspSZ&{iJEw6qxOfg2nZa%6fN9-a5}1=gat!<+_628f(f_bq5Y0E! +z^C{(|rLcE2r4Sr#6jpaikzR5Hhs|kK9~PS) +z$C=KTrj(GuQxO+3stBe@ZYpgS{`lg3*}VP`C5P#`-v?ejNpC2e2x)-M(qL4Xprq1J +zw;V*YeKo^+%iyz9wzqFP-XN2)rkG$nPgKG>YNX0{Lyr?5h@~X4e|2r6sf%Oe00||G +z|1Z4G#7f&u1Ws@*hJ6(y<8r?6WhcOFRfyFhASUe%WuiYJzl>jKX3Cbf@W4#bj;Ze$ +zkRz0}QLEaM_`(cyis`Fb)>}#w@tQaE&2BFQ?>L^gzYGK&tMsXH^ozmsr+R@+ialJh +z$$weUm7BA)m|~o6H?i5xw-*bM}J2=(kzt^78GA!#BH!xG6CV+OiEkY(wDx +zLi@S-9m|(U;)P%5ww!jB7Jy^pzk%m1?EuUPb#uwD_-LM-{K__~#Od>i%Es@@jRMK~ +zy#!kNjeh34|J`W(r_TENTIv3`(z(0;-Nr}RSMUCHXZQ7?6#_~>xc-EI>S`#lY^tt? +z7&9A~5FCF!X~_kcK4S4e*l7 +zVm6(39YZnY9Cs-|*)5u;QDTo^NHOQ6mu}Ld_*I9eVTJ?IH@p*6?!okF0#Tm>vgScX +z@zHfJ)M;jCKt~~1FAO-@LSSEmvQvuiWLfkCs94D)>WwH&A4qn9GgQ7r#8~%CCJB!5 +zld2$zGU;KMWvCsg!*{CPz?me2L2`zJgsxg}u=riHSHoyJ<8C+1I1(0Rgpw2mJPz(Y +z%2=Kl4VoA?3f}Uvi|0}=!7LR+3J7LquP2`PahRF8ONcKWVycE$J^fZ9eQ61<_`;UP +z#B=ASSZiCOKvBLs}@Ng@KN6Je||n)*JD{4B~s!X5@*MloDvHuRJOCP@e|oXtov +zqsGNlYLehtKc;0q4o`zm&{X&tSXV%sLG&>c+|~t6HyK7%B-Mo5R4)lL1S|%JIN6w%cYD44s2Kloef=)~_pN-cjkm`SYQvtJV^SygAzQ~FJ{hCsJ=;FI$9;=j +zMaKDQl5Y6VXve(*Qg)1woeeAaNc(klRa`|@mfEZS^7k9ds~hb#XTx6a?5?>vnA@|k +zJHYtXqI09@lS2ZX;&!@hy?&kjvewaJ&jLgM^qh3=6F=A|@Y~A&HQM{`HV(qS9 +z57{tFYV&H_wdsj2Fir>Mw=H<8OXQ=90{KY4ALMbnV;7+Z@LF60Rh2%~x&Ebm&CxsA +zaS)ii>t3}*oqY*;S7tRbm4_>5Mu7%^mhhQB9^nxgSh*s+!@ZZg`)>~cM(fMi95DI; +z24K)z6+i!_;OG4}=pInh +zegBvKhJI(Y8(7vCzyS^LT0n$t`}N+9Y(}y_Aj2MGW$^14|BGj=2#6oR)xpr?dgf;{SAk3*41lRy4GYa9dHsiyn}*p +zFAg!(>}YUaS_NzeZ)m^PIxVznUs-8?X(;h9RzzDPc*sU5N_0DUEI8(x89MC|p*dDG +znCdaqX$(>ffn-Z)XD)dqdKQNEsdiz&ID^toOsGRf8d|^Kd)T=DZ04VuRXu>)7Lbaj +z-vcomTm>a~b}0Y?hv`!xOAqkl(j{?m~OTGa>{wZ4|tdSv;a +zl2KE=cE8tB|Az%NgKik_f1-k0(A9&^+PeP`I>GdWUvR(Vz+) +zrth(t6s?YxXg8LjqIwi7tZ3v8UDd2Y7@*Q3jjK2C2QDfaU)77Kucud}M#s3|*u}C{ +zWnz~C!D&5l+37S|!B(()AnulEZ&&9t5|-E50LY`#D<4>rL1PKt+X$W-cTRFtt`|`& +zYu@iQ39o2wr%h}{Io8ygwV7KPx<;f-Pb$fA<=&l(kWd6?{3ow!mr(>Ip$7VBG8@9F +ztT+NJ!&0l7KGL0}nm)H8PU4uFM~t8;|6YLP@-M#3R5bvlDD4!Q#S;67XPKSAEC#Mm +zpG3~~lirY>#NY1esFxo4P;FD{6%6;RZAyu>SOe0l%&$2kd*0FyEQe?0QO9wZb%Rk@ +zcQAsgkUJ;<4Rb=*{{C+1{reAWpQw)@(~EX)v3o}8nTx(MP(3R38+*Zc;x#p2eCnW73 +z8eMGuuL@nVDED6aceLteLa-(+&Zko +z0fL1_*d*~fkZoHv&K2I}qYn&G=BH*5D-C4(xPuuMrsZNiu7Wi%_*Jjb!McbS$wkZx +zQEM6sp%Kh%_Q61sG->1~$*_y~)-s{ZfUF^{eN!+&uZY>hHZ#MUfzZ5R&}>U0n+(Ic?3Fjg>!(D@W!iJ*|G>aQ+TX5UZq4z7UH;Qr4EJ{3` +z5mB-KF+(zTvI*SX0 +zVgNWSIF$+PtSw)J1!V6b_-9u4SVkQ2W(;8YLIXHS!%#^sE|06%vaWND_m^>0EgQ0d +zg@tO@%&gnErpO+lo0+1GlX_MaH`A&cY2}?0M=RZm&)0RzG2yiODLOg5QCX>xg~D9Z +zsE4j{3M`~7aPPZgKs+SHWXuA~ +zJkFTe8p{YU_qB(1!KD#1ZPnpF899DK?|(HR^Tv|m;=|Tyf(eUi!zjy8tcpMJ+FUD2 +zY)MXR)u69@7pAYa(75mH*uIGHsF=v{sInu>L%&;mN`BUafPE%B`l&&`zAfHz*pxos +zSIu<$_Gaum8>GaQa7#)NfzqIR5}l{ERBL+oGT4>m-_M$ZFQr9bj2JtTb60R~@Mhdp +zJvB-T1Lu--C4IpHouz2YBF`5vzLl?w!S~uit)iKE7I#D%g4*8^#9Q@NmckY0JcZ{=ygnF7=VMc;~wp6}v-HPhe>_h4u6X0o3Df?V~FT;ZNP%xz{QVosx +zj-Nbl3x&3-BfGvsEA&Vd(P)&Z1}1bxt75K>-)yR3-dGEV4=+YFtQz!{sRn(WO*N<( +zQw^?Mq#E?JL^br&2~?x6FB@i(4y{nSAop-9A``;T+3y0v36$X1FB;A*xu6PG!4Hnd +zrp}(i(x^qnBB*=o26jK%L7r5jgw+Fm +z6~!a9G!rGL7^4JNc2I&DDfiyvjF5g6Za}Eop+ZW?6+7(^H)aYnY^0ijGqCAS!f7G9;N$SnF!WU+2C0!O#qR24{fi+iVUEfg!GP{6n +zNRG1@FNZE?5oa+9vz!dDwtw7xb!d*oqrdFFIoR8Obprs!ex>%9JUp=yi^!z&;8KDx)HecTG9+S1=R +z_AR~>ofJC^U>n>dHO9gJut&`ZYbFHW*~|v%aqyv~c~HFp5hSrKK=T;L??-ALHE$fq +z6-%=ciJt$P;hqh?zTu)MnN +z_R}cOwKfa}sF@GZ8D#|fFjVucIdU2a_a|dOhlNz4wH4+Uho5-`{5sELNMZ1gF%8!M +z(9FsTrB|nVdFEXr>723JM->nEBu*i^3@=U<6z^xXlGI8q0{?}(x5g@a{F6t1k_Se*=a#p^y498FCAu7;=EV)t|$e++xI4~{CiOr!)36*iq3s+c>VXE&ogqX|>! +zHOrTceH|4{6Q`gr0myHY``86Hd10x)4Mf;SJ-VH5`x_s(IttRf +z2yh%iqf{5~@YEfvFPs%BO&32ZB)RU*DS?Dw!t?-00IMchGoZl$kkB+^lOuI5x)e%% +zmTAPy9sfJp=%|!xT8mn_Q7lBUyCUU5ZTWrrKF0rQ +zWxR2AY|)7CuT)7hB?A<6VMh&j45c2aIXH=ASa>#Z_Y>Fdda1wTkAN5LukMf_I;N64 +zf{9Bk_ewH;p$msF^OgfBaKdaG!xtD^ee7ywq)D_Z(I)T>N4<19!Dj&*>Xtngq(K#5 +z28je4%$?5iN;oZhC6Hxau5W7MnxpP6Vv}{s6Paw%stPEh3BDV9v)qFczc@k;Et6>Hc+96Vi$|nus-}>Nql5eaU*2v^5gDd&1%ijMk^(H +zm$#PmF~i3Iiz+HyasMI}APs|Mz8n&=sN_`@ZKfG(MzoxilCT-%KST1& +z>3s@f8bKHf3lg$L=_zb=Ex$WP!GHnzkPSTCV@X|56?^{8inL +zVK`bua#E`{T$pSeWLpgm$y9__q@itv<}hPp%Sze+t_2erTo#R2x`tV)GIW`I>*e-< +z%cK2rzxUvN3;yxz_j~xiM!|kWcj|JR*bPk%+nQ^3YP(doUgT^TdUG{gKwo2^#Rw^8 +zo%qKfE^5!>F)ZNRSSu_&;Z2G6o`_#XeV#6;tVS2Zm}71LE+XANMKic@6=KVwRP$YV +z98rIT=WJ-6bCiD!Q4;0nH5bRr`$IxL&pRWxx#M&7X8tW>+wj?&r77UG++!SbyLk;ZId&(`Qh`5-;*poeY@aFpRmmD~6=W+8NL5n0=1B27M@ld}XFzfxcj*Z}MTo0yOw +zt+YGe>HS=+MuXv6JT7$c +zQZt`CLq(3w94+y_5@T7^5e1qK2D~HB%0-gx(by6L23M8jF8WxZXk|7%tg`-04)RXwjN+0AhldHD%Md@ +zw4q;&1%bPWH2-(CfK-OjKLb5x=QdY+8e~zIxjVm(%BR-x`fA_pI6~^EVT=z8n}rJK)F28uP)Ub0B&#rz!^*hGxLmS^ +z;+sdl;QWB-2AR>}Ph&|(YP1SdI!0KzM7Rh``-w)xdym}zEwqiXw8B0thRbX=qIzuX +z?_8Bh_<1ylx)DbSOJYE+%&ZL5o3R!MdLDvUc-ls`vEHq=$-n*7|8Ch_2Mm>stsSq) +zECHRZ;pDUzt29%(;TXsft1%pnbDT(o17ai#C@hnjByWIN;1n51MhGZ#V8za=1a#8S +zkjTpxXH#)xS#9%doXOjSxX^r$+ZRN)l!;b@S{LS$JF6unFQbFC(xQu^N2FmdO4*a? +z7nDE{S5qbPmS-(&h4I#v7uizWVp;U=%vhi+im^gvMpZQyEJInu8l`gDD}A|*OJsg_ +z%4PN8Z|>9fPee<+UROQ;X?OdXC6j^=uC!?}RzuBnZR^ove{F&hoq*hM{|4#}hiDha +zQj~$(TTKC>v%KoUWOZh(CtH4dd0Cu1F>X6rfK06A-pkRuDoM{UOKgwKE@-J0*;E9r +ziQgD777Lsg&`u$WD>KP}WED`dX)cwj2kX$LKr5mD=J}4F1?QQ#a0*hree(kMKgLMG +zbXCV$G63?x(a*AE7}~9{GeAZJj@CTG>?s_fP!(fq4y3lKEsNml30XG+C5)g_a{qSj +z3;G@29gJW_?{$0YTaNf8wykN7Z3`>6WS6}`fbyi$n&H*{>2Ol{AbRkEYnkz +z0Rmy}e#8ibfq#lY*v<^-<;*Hkkgf6~I@bBSjdD|Qp>VybK1$Cp(OEJQ6+Zkzoy{2r +zy@T&(L7X?0zZ>b2r4ZT@Q8*UM6BkNToIPwHvhTaq$ROQA5b2w^gmMH?_PDXC +zXf{E%hQpGc8VR2>x~5Y{|H6y5Ut}|*lNbfaXcGW4SVW0H6r)W7M_1%guw8(nnmAL~ +z^=3ctHD3{((}^N4cdMRO3y-X^QBX#VwwlOpk!ViL=>vN~kvG|MoQ!xlKBn#B4VAh9 +z@-v#o@nu2zd{Zzfs-}f~ye)|bF~KI)ViY)nxQZpvcj##=R}AZ+>~#xNzqtELFd}4< +zZAcmhfCV}N7YA(4Q)|qP;;1U6Zn2@bHYzzIIjs`Xw5L*|;=!+|0lH&MFqPMu0yjL1 +z95bbpVv;qz4#0Bk&fi|H2_7B|x3IxxM=;`72&1=bMc}b339-tP*CbtbgAramXw{cK +zFP@#9E#h5v5hhDwMJ3@g6VjtnoRMF9y?=06a~8^uxlm>p3Xa__g`VbnFm^X%=r8@4i01Fii4^Bsu +zdpyC@wz^A95%%oW!Nu}}`8Av_#{Mcmz*ot?u!Q!&E0$9)tkTv93&pKBx;Q67v2%)D +z-wJbT2IQ@Q?KZpidXeZR^3+6Rx|7{px*A%QayWL+&DSGrD6CJd7iTpqe^FJMw3+#B +zCZjgp!RFM&p>FLE$@!E0mM+~Ws$YyZsR&Z$|JFQR(kqO_v>#RNcz>tui +z>&QhfykA~02w=Cyu7en>*MID$X`CM!Y+l;$qcuveHW?B4EGze8+Oz16RbM5*q=mh9 +z{tFo|77_jq*e-M_#yo3$r5}Z1dK0*)kr3g6D2N@EP_XHbj?_Rhg^#k4@j33@qbR0P +zZfc{AK^PzL$dBMFnX3}tgHIX`rs_@~jDV8W54MR}!lzCCgAH5}c~u_;P*sv_m9&K3*hPcu`2BmCQB@}|#I7k@+xc?$@nBaUANfoPaT45EiF3eh7MhjhOV +z4pG6T{JjP&QoURSi)bttLL*aSCLUcMRjU+%{niQR>mbWQ<|8$)Xfu>~LZ<+kBCvDf +z&1HALgsjaz>K{A^22qeX+@a>09#|Jt+<{Fs-Cnh1M89S()Xt$i0oggq)uh*@%R^D3 +zqWYWMK{T4&e2u2A-lOrIa0c`ob?D49;;%59A`C*}K&9+0&szQZgVKxYJs4R#w0gMG +zQn^^Aj7fc>hYvS-Lhz-a()=xrO^AbS2fs^(S&RMb>6XPh(8;Y}(qxYH#jD4{rSmx4%|+j2&hTL7eZg*uR| +zlq4Dxj5v!}nh&RNJ3L=Q#bHVK$1ofM2G{?@1z-`h%#fcn^hFqd +z5o6E~h7skFko7AS5ZmI@9Hv7lTA+=4xZ`19-QmapyY>JhJzF_|pv)htB%oH~yps#$ +zVX{P{s#w+0ramUx#AH#Zk$>0&FUmpOZBPpw!Xm$Yb?|z3Miv;l0Q(j7HRh#bZG_NPfrL}{6}kW3u&pDzEw +zTimiCFEKxreW0tOw;#8`Xeu=bd9rR0_v<*2+Wm1${r^5jnD|ow{~g1BUHGpD|HT&i +zq-c(~?EmXu*y$EZQjEqN%XCNn!!18H6=1T(GIY)GpZJ}%HEihEeC?XAJ^or%7eQrF +z4VoQv8t}EifBbmM|8BGN`gr>5?)29^i(hS +z{paZw`y+$2AFbTkf8NFi4ux2s3P1VYx9|fUbky&!Zy$PyN2`QHj)s7( +zLvr;+{U-?p#GBI&&XM%-RI&Skb{MyT4X$$Zh99Nh;81U +z=%>1?Id7cP`oW1`Ms>S+DSh3hcOBgAre09~i`QJCgMde0n^ND*XV&?jT-p0$_W9pg +zFXn$(Z?CN0o&UG-x&HHgG|rdy$C%X!-PH3m;6$hMxql?${2_=u0&XH9(vBYE_z(WT6rdP`_Y?kL +zr(gQF$y)3O-Tbq#BH{$qKj!ZME16!gaodHQx(~Hv461pOc$z2LfCRa +z32b@#Oi=6~2{_W6I++yBh-f3>q#^8akFKDs;q +zZ{wry|NBQjnHvuN`0AX2eevgk6>q;JZ8w#}&m#&9qXJGq8x-%8G)IHrJWM&12T;Ud +zNYZN@Q9>i)J2%|b1H6z^!J`~5I&bsf=0FwPS+@aj?& +z2o&_A7y@%$sSCGE)QBS{cg5m~F+)S@<=s*16qT!&U2-cG-njF +zu-I;vs^eICKHiy44L<&`LZ_)ZB%zd%Lt((CV-&OS(TJ7rLCv?X{`_kH=T}&DMf^Bz +zq)ud_66eK;mY_Py2XMREhkX5ka77KjPJ`22k%k2gj^bE+&Lv|KihhVwk{K!Q4f_L? +z49u}$qhhesNYxmzMI0LzxYE$<$zodUCRd`^GnfTCkv%6-f5!fO#%Hf)FB!ox9dUFnZUa|ph-ElUpn(l5=;MaBZRmiTR;5fOO +zb!pl(UCGVBL98z{y-hu5{N+Cw(X;Ejt!>V{rEEGvxP2DE-7){y{+Yr5bEKs!CV-vJ +z|F<7KD#`yIEw9}1|F`nFHpv5iC_&BPt9Hj<^q)tA+)8XADFQe%8V04$u9*B)Vy1RSpP6KJVp7#&4px<9Rb_bf`n22}4^GEv!|xpL4Zh)` +z^EaGrXL%j;NFayTq`dd$xKe>NuQW*#k>Gs(@?+(yU2m^gD+OJKlQ2yPbl65H7^oi*U +zF%u!jeV|Bf=x~(gSisGGu9MDF>MP^oC6WA0tXTL?O`~T{a#p8KRNgMrm({eYtfSmx +zKWqWK;}zo*E;@$hl|(GC(O2BqpSccc=46F)~oe^p4Wp+MpcFTwHzoXJ0iUY8klfo348qEx#QTP!%q4=mwsj{RXv68GQ;PBsv0-<7^ +z(nI`EzxeONawQt6Gz}%njTY14Rdq56D3ofdHWM_JfVKz5e-|s}Z1?W2vprx3lGQy~ +zYd_EWsFusiQkf@_iqe*6Ub-gqg!>?YS1=l-$taCbi5^FTio|(UnFy_Ye9dI=fRBnB +zBC^WkDfTH>marnl@TPViEfY7q5SO_k=a!VEN1DtTx~_xE0x>6>UKTWFG#p%?a^u>7 +zxsn8x$gIjHS*Eo#ZyZFQvIg_Ci{0V7I*{AmAZ+5TPIru%yXbK-2J58p;K#}cibkhY +ze*+`=*7YGiE5oByvJ&e#6)LxiMo}xIr~^)(7}1DvOzaJuEoi4hu&Fg1z^S$C2XR-S +z3yUWLk*H1rCcTaN=XJO>mCs)Na54;w8C8#x6#XSpk(qX_a`1~amZ|_sw9~HbE>N8~ +zQ(=qLGZ3^O$F(Z9y+$cvAtynBy(lw{M_Dmb3r>=}LNA3@5`_`7G@!v0{QsfGuEll% +zzmQ%6t<(jI*vF0j+vN9{NQ-R{*(n8PAs`crN;sw=vblth6JW_DX5dpP4)YAYrGy>M +zJQbLkgF+vyPdYO5O#E`ubUJ3Kw@z{H6_`YvVJ<9YIkl>WW)Wb_5W+B;e!miA#HaOb +zz+w92qbP3j7nBN8ZXCq~nnZw<1E(K`lrqkGr>O5_Bo=t-4oX0`4(tU*aWXzt{;<&W +zJ7oyqXDWj!BesTI&6DWqi^EQ71*N^Y^JMEr8I=9H^e{0=@?@}B1*MV6Wr|>&$@eUj +z2ZW!Aye)n#)}XTP1cpqFA1C?m>5QmGw2(4y*XDtT{y|Mw4Z<3`8p!4N@3|M&6r90$ +zo2kqw=|IQXhNYQITf%8LQmaiuipdN6zXOA>2cxE6D=e1P=9^*4y>S;FOAP)DFB6>}Fli37~(GN-UXoh?CL6g4m-<{Xu9 +zGsSRuGfo61-B`Uqxr;1dB}sPg>l05`DLOaho-vyV%XZE8wF49u-soMB5G*3-0eWS5 +zl7^XL@HyI!S@}|O3Z#6wm4r_2k^WYJ-72KBcUP>M%W>92XR5NHuJEbp=aa50IIqHG +z1s)YA(T&6z-sf8)vz(n>)^4qsHrojx$oB66eEfYm#gU`;_o6hwkar +z>U>MqSm`hx@am|@e7J~kWH7<4qv@xk7I7D`M41>Zq*EsEM+!yMZsgfw%setYqR9r< +zR0GLaKF&}$6>vs*HSNOuDH*y<-_BTHB`nYoDrBm6bJSOFBKLHZ$_2nz?3Q^sxQVAj +zdpfUO(Erb}|4`4a;s!Ru{`=AT>RQqMV{N5#Xa8{{{H*#jXn4vI!=T1oSdrz%)pKZETDJ4PgwyI +zc4ZE;Ecz4$3B9bU=zd{8821VffC9i~6>o-XV+CiX +z0lT@(0Fo4d5>if104Alz@gNC$Q_3OtRUJOzx}o)wOxM^D(RRkYzFst#*vMI@6B{Ny +zJDZrs%v#e|UkL;%-EGdiNzFu*x^)HrmDXX7I23 +z7_b>0!@urh#%XxNU!0f4TxGLztJM&ZYGUkf;g;^~NRSB2I9TQOC?7jX+V!n09RnXR +z7K+~w&(IQSOfFhqVV5a~XXFWn=xgC*Z-K{l>J}`87mPw^ZGTbKT~uM3jRl|o1mmdv +zKwmd>zOn0@Cc^S9Eg-W@!r9$8D62@30JDxB3Jw2-iSLimN?AX{){&YHLd^b+p<1#LIWCcK(S%!q?z7`A7#*^Sc=~P{jqQ%1TN8)47ZPb1NU^|8MZ#gaNRh{g&lK-#cQW2~r4ldhe{x^b@+_`~0;N +z$enSTqGU+rQ4;znC)IVw5H6vHa>#*C%`9q%y>iOMclKZZ?akhgKOI8xon&;LMklAa +zU*Boqx~wkZ;@GQO)x`GO!=Luw98ix=(d&-^PZ21BZi-?>7{+HggF+R|3D1a|x^Qapn#R{b|{_Bw9D7QOn<4cK?hpBd*rGQB9~yiy-C&i|Fw +z<>iw9@7mhk`F|UqZ+Z85-}*1$R*Vv>esnVCuqWQPo;tl+ttEa1`%TyQ3HBz(QHc`@ +zbwJs2PT`nFpPTdi6i@QwkW~((yNN?+(`rG<;;>MBqI4sSgt*zUv~219r~iGhvE{$_ +z?wK<^!JkTMOFu+fOW&h}|7rm+{YplxvEU-HZlycoFDSUBFCrnP?;^bA0=o0*Ga16T +z)FfW+z1)=<|Sr{UfEWBtW5tnlL5^B3Dc9yI*L#Q)=e6^nVM +z#SPW^tOl$?P@P~P)ipe(RksRRpnnl%q(|(9aMbj|xEqBTK-j=>LyKoyUGw$SQ&8V9 +zF`tySfWj>KTA|=6WZDo>E)-Q72#=9af+Tk(RN8tIEpx% +z9kwQ-hhlZ}9xkEoWQya`1L4?HK50CBrRMM$$v0>lK+p8&)YIs=;j6DUNcF?X^T&ai +zu6a=%iQO(J|#M$;a%>m711 +zadYp+J>1)hk0~8+U;F(1+MikcAMM^N_A#CRTkou_td{aWtl#B-xRuX!%XM%|8tKi< +z@Pps=qzt^R&FUcA^Dh|KJmV~F@|~1$L9^irGA#g3%P$5 +z#AG~`r)XmxX5C;EQgE)Io3o`6ngQk4ZM&g@jOqLV6c6m}&ZetCr>8q_UOXp#aqWHj +zKCV?2+5I0=XiG}ne8OqV*rIjK@UirDhyX{T!8}W+SzOp9kJne{EIE$nFZ;{9-H+qB +zi~cg2e^y~Kn6qRr$xHGgDJl^Lu>{uYHq{gIGiRy`>u-0U +z#QG|LFvvnvNZNxpaHmLmA(n$~urx)UH9f+g86BFoMnO-KSzNK9UU=z2Ibir@WT5cN +zs5=NSH3U@jQe5WpstH7Mq%DEwqBu4pTS`(vN6GIbT1xP8WnK1&#!2 +zUphX0LklL_&-gV!|KJ*?WHUV*B9mCII*ph5~DTqhQk{60l1_N$=_!!|2DK_Wt|NFJ8XdfBipi4i4Y` +z<>$Zt?f(YHUEoMgPNRQ(91P=R^h=uM<4?U`WKL!qFJWloZO9FN$tN{>LD +z!20yHPF^xcQH+Ysq!evTt{rQCr0wk{lKai$Z8xQu`@!JcKTgBoBYA)_4v=RxsxZXc +zLLPSmbjbY_(gj5-wVQu_QnWuteKGdKRpSND +za1fTFX;WQ}QbBQ@;SDu+|=2u{uu@3%d +zD7ugj%;xMgg^BnRc35hFK(oc!Bm9RnD0@J-R_>6Xbu*xqrvGT&Y+k#ZKhVp9Wu^oh;ibd;1L#{wISAm|I*cgxMH7<-V`Nb*Ll|q@ +zEMn6H*2fBEE9e&@yJZK6$r3Q;##xjBdwa&oA<2Q)YM6`>Ra0>^a4ZS+a}6lzykuR_T+fe5z$JDHZmwr2=#GcZnH%sRjYS7_U;My1=~} +z1dEF^=WhC;h8{k&Gh9oT*=ZVP0Gzsu8C3|^&j3h3x4+$kv2!D4-p?s*0`tIpu>~SN +zx+xMnO;q7~CDT>gP&GoV>8!1Zm8#)$qYq3!8}zoSp1;0Ys--yb=!34V>}7SCg{_4T +zOyO?;@Y~(-a6F*65`5rAu_CZcgU4|m4g3}BIJI)}qCFTU0>TF9h+NUFz^N^F8qDoW +zo<+e3mB}V=2C@WiBz6VHF)5zCFcekrM$q7b!YJ25zaXm6SOfLmVflv-anZV)#&>`Y +z>Mei8COOz6^!#r1gW14Z@{3jv{-uqlro18#mdv0Qu3a-9#G +zwy+0Aw}MkqsLG}PFXAsJlXQsH{DvDOVw&$s@8I;mIY8ns1-Y-C~ci(SPg2T +z>91Ne*X635Fp|vM+`v}cjX8}I?jzYc#J03CxaQ~`+;R8FKLx=2*g)C +zs8{Das8u-%8}s`)sOM68%tKc2T6hvCDTcBJyoq{7wVT-&O2dYAKlo38g=@Iy0F|pg +z^q~u3WrG}mY&EJ_fz<*lz{PuT-Wt?HK9mO7oXiSr+3cd)+s=MnFIM^2R;fz+;#E2q +zud?#tgT1eK!X3^1*3I_s_Z#;1|E^rEeYtAOx*8R8uIxEVI=i@g0K4&wr9;-bu`{x4 +z$^Dr|zJ*6k!~X$J>J9aL#eUv_=PR29yqrdqWTZ{*ZK87_W`9Ey<6)xG&&fc)6yn_7 +z5XWN41_$RzH3pH(zfhLYK3hv*tWuvCZLw)qQbZOEK4n5)-)Z{Kv_KG>V&1%`#m`A! +zgmLLfnC0Sxf=_q+R?B}Tc}mf|rWbvRvIr&A$LIb^3%Wqz4_1az2T@F>*hIi|ZMc48 +zT)SkPKhR@sNjB0j$Rg~KZMe^p@t}uEdeFYx1W~2t^Rq-HvL<@!Nn@dO&aB!o(C#xt +zHncVgFj!BI2M_EXN{G3K-Wb7(&0{MRkcK0PorOBp-wpaiPqmy7S_+g4DV!!-LX0ED +zL}S!hho8QP;IXX*kI_7m$H5|07q`zoM5@!n%XG-Y`&kLeC)%7S%FxRTcp;f#l +z&fz;U$y6^R!_!?WaGRU$1Ca$aX{BUAij7`G3T!V1i&!(DS(wKRX9Qc9VzO08J*$Ch +zjTo;DQwFJlGf|4Ad#OLbwaF7R{>65q(YUUa)Y4tOrW9S!0)tx1i70v_%Q&Bm&stS| +z>{yN7hS1MFJ~+bioX3ZXc6f^i$m$gikXs?o73OLM0=;@ipnr1&T5dGAN1!iEn}1`} +zw&{@DG|VQf&((?UMV97wLv%})TAHS2-BX~(Pz2q%>+Ju;8hq4$ho1pTsMrUVck8cz +zMJM|gZ(iUl)TUBq=OG$O^J^}#vI6UpCgYP+e|?#Q-C+z$)y!xBG!%-hcXY9KXMJ+H +z?}?dS={V1u{x}{WHi(j5l*FvbZAxlxYh;=i?}=4`dKV`oV&q(tvHxhDLzZJGD1;6I +z0z*G0eO4qdvXU6L(3ZSAOca}sdkPN*+GWZMGz(S8O@I|#5lAZYbAnWcWOcAH&oHR% +zSx80Ubi;^2O^z)II~Oy7;>37KF#p4Fh^OE69xm4&zzJ?Ix&KQM>nv#t>59loC&WYd +zHQZ{FA?!HZ+<0b_Dv*?E3RQ1VD>&P7ccy;O@2sthqEA^Vl5$X+6c%c&tcY51eR)DP +zvPmq|TJK0L*fO)LsaFf{^96Y;#*8AC&;|VB`$GLxz2A8=d-k?&RI5exd>Q3vGNK%Ua?EA(xX-T(HcD}^}J4x*X@#z=+Ptl(RcLdyJF?<>GAh=$!#9C +zGnGI+D^!2V&z(6QS3KL{XQhdE)pP6FGk)ekqohJP%2TWnbv*-M*1iQX|egntT +zJ|%>dAnwZ721q-}rjdN#gQ%vBPFnaj_y +z?2V`sls>^G#jHaR&M+IJ4&fN{IH6G;5b0hR3^?xtoMS_ji|xnV&@SJUjGijizM7OA +z&fO#h>Q2UZ!<#bhxM8n`>56`m`70nHA7ufTWqoWIDNL%cqQr7OagC9b&QcR~CDt!m +zETMTW1q?c7_G0G^^FPEUWZ^I45ZB0(VAE`o;UFSjZ68G=0$N_7?I;#i$^(*jzmFFt +zT2#5_QVKH|))nSX_;JPE_D3Y#YR@X@sL-wz?NykF*`O14i?}V40MJ#R(y%l0qRj{a +zm&rK8F1wbTa+si2KL+Jao|(p2&)YWC$CJp;Q#4Q+QehlYFz-Z__>kA +ztt5|XK=ZAz0FzglcAm4O!Qd=7&nB%Tb8F>=yc*IuLyD2Ztr%EgL=$ZpuLz=otsra0 +zjK1F>kTDH11PU-$nIqnU{`;AI_W1oM4jkfo!)M7wJ=a_t?Fsh;+WX8Zn@xxt*QNPn +z8)z8%#_xAjkWmp?zi7daIfN!`W_BgMjiA4-U>Htj*d)2-b^u$Yc%d{h;9o{0 +z0@lO_9q{R!BBms(;N3RP_-dYpqX80s=gh?H72}vPPi(iYEKtS_8!Wa^)kRJWBz%0F +zvk${>Tfkg&Tm~e!u{<#1QbsX%#x$kS;*Wh=AtZyOtF|+b`08D*l=x5Cts1=a!8E_5xZ^~k$l;2OSL)QO{n@p +zV$Ar2HwR_`_6Kq&6zZgSd7#}_HmvKFpLafdD0QW;eL<`&6PrK?Nf#l*sF+_D7`OHs +zhSllOH^akCGBFcOS}EKSCf~cD5441C05SUi+4~m2xT-SY^xcG4TR{*|Z>J=gNhgz; +zByAySOVcK8gJ}|yl=2QYGdIblGjoTzcajDuwtxsei=ZOD3WDO|D#)(S6^o*v{;RN{ +zvOYmsMO|G)SJvPC@ju^p&bjxTd+$7w&ZGr0N;-4zd3@(P-}%mWzVkg2u1a3K +zmcAlwDr6382T2gwDq(n@m4TnD$muQaA-k +z-3XsD$4YQ-NO1Z&Yzsf{{avNQC=`xUFwGbRdHder)3q2!p``+G6g&jLKYJDbah5%l +z0(|&k!P}=e{@ARJf0l;-vWz6L9kvKGrBl(pCSkNG7pLj|ad8&6CE$>Hf|N_ZMwHMK +z=v4`uA!cJ}pm>NVyPzR6N0=Fr;u_HN5w{$sOs1~Z?D&&{K23-zqb3b7JT$V92pf}2 +zlYT~~$VQ&f0YhNNPD(()B(yUR6YwrhGx!LElMo7n_DlB98awQb(6y;(YJ8k}5J5~= +zY$B^@R-D#0(varc0llVyRm23|XgUaoH)V$!SNaCS>|cfKvghp}KX*cw1%Rg$UaFu8 +zB8{pbuMlQALQaTNR9>WxXU2#b&r!5akij{*uj5>Rh_iG|jw*y$aE{3&Xv4ZN8-to=)X)^9+Cw>VSz1os^UZ2N`s7SW> +zT`}g;I$E7|_4Np}jUp}++ac(#fkL};*J!Ir*tKOTijvJ#M?w`OuyE|ExwM)Z(Z_OR +zF(juVO1)7pG>;dV6g!l~NNWc*F3Ds>lH>^sV-;sfY2t}XESS&6tvyPC1ifxA74NMc +zmyk<7uZxvu>Ef`66zLn*tf&N?M+)}tx>4ulbj9C-2YNbn0xNV5^yJmy-7h)Nlcr`v +zWEfI+!%3Ri?BmXdsfJM#KZ^GITB5?2J=2Q0UC0iVb54H#hz|K~7LKjWuZ{^#bHJOAU_)-`kae`e*wv&>>Z>g|esTI9dW +z9Tj>DoT9}fL3vXH(d4@rJsfz_gbp{kPD%vGSf3)a3;R@l=Xp5CgNy@*8`VPRM#unW +zKqy??#0Iu*QJSNzYa&WF9?8*4k{mCP@X3k*uSz{WPSpVb1KIY*^)XNgB((_*SR^^J +zkAguZ8qw$ujA~N1rr-$Wo9Bq;qmI3D^HJj@&rUXKF`7E;0s-thCg-5WLNiW3O(V{~ +zx-w7mDElrXc=Jt9Cmg?&v6*q1xn#{p>{H7APhK2WA4T^6)-`L^dGbFu&*gufl~39D +z27GE78(j$i*`+&#_)4njv79=lMW9qi&KfteZ6dFQ$6MTcvx%EC;mfUO!F%sE3R|>0 +zVPLZoJ+rN)rLFlaX(KJ~P|MsL8C<6pPr{WAlX*aFArcOtQOZnQ-hOF*X)x3zhqK{r +z?03>i$C}B5tae3CCmcM04+0_f8Za-urHLB}tG7$&hWK7L>=#VsEWD&oNC7%-+8X%@ +zD4|vnVLP@Y_yT6t4A~0DjI3^rr&uPG8d?xe+gI(ap{3amD9^q^i}9?6H(*Xu5~hzH +zHw=?L*OPc_Go_?eGE5eIX-uDh913VLNJnDVr&WXaE+n2pd5Iu26ozcNG5p)?=oZN~ +z2)K_x`amoeQm)ycaGb!}NlV%vcS~eo0j4GjgoU?`AwfFfr~@e6qz=M*5sr_n&_G&G +z1}+g{0t;MJ;HMQWn>Dh*KrX#IZA_+>-P)8A41jqeg_|2`QP|1jKqvsFwz4GyM@Ue> +zfejk`3;)6NFhRriJi_=_I3e~NUsO+H=c8x7jbaJ$NUafCFA|@M6RH|n+Zt8^gsiY9 +zyD7IdsN5)_NUd1IS7e~wusvR^1WLcah@K{*Zy4 +zEwvCMKIa7^#t@Fhd5j|qd6@xfMbR!G4Fs0ducR&sbVM~a(EP0y*)9J!lSgy% +z|15mUuis0h;QAlwMo^BGmI2%*H)V=~hrV5syfN{sD3t&I@s(A0D} +znwn-Cf&mjoNotr-le}O$G?&?vEN?ZL#B3{Bg9sgfSGLl}iIAHtyX_jE%9Lh}!+g@t +zJhMt3LosQB`DL(pA&Und(F#Yn%?-8Fi3k6Xk<0m6Dnd>)vW*Dor*R`TR96S`Xgrm1 +z&Uf^U;3h|&aZ^&fy2Uau*^;FK0GBeyE^1vP#vDPZZZt?Hqx@j +ztY_ywxAQj`Ug6P=UR9G;q$n6nT(RMSVgzZ-=7h*wG{b0C%bDozK!toYk;uZ`urM`P +z0-onzYkVr4KE-8@9fy^{zMkR1zAbO+8iMb`16?}@yE-~M2gtlIm=d~4fdYZBR~;Jz +zC5f#F5J0lxnc*~%EtBfhVFK0N-#^ed)Hgh|r9Z5YKf}F!on1X07ciiBhr2Z`LuAeg +zt-LsRQ&(4iM^E>8U9RpDM%v06IjhXwb@ufR4fO3C>Y`M@dmG6bY9g+h1(@kfdfPnE +z*U`D9V{l0BP0tLc$eBln4u_M5QD8@z)(m#{!}sAGJ9~z@q1WM_zP^6BYjU_COQv{# +zWYOp1=m-P>RFitU;`@;q35^6QT5&)>x{1%x!Y;(DQeeyG3%3PrqVN$k1CM%kb_@>< +zb!_hG3b`yIgapJ!T1-7WrddKa?QReRjDeq>J9US^M+i6pR$8ey()Hv(q$Lw@DW$~; +zW3v0yBgtVSZH$7dDVQ5J#|ht}ZZDQ0_m+1AmY&iGiBDq~jzLHXqhM}c^{ktMBViNm +z9g5UryALhqA^o22-fdk2f(u_=Qm3YH#%M69hYG9+%Ssj}P?kogpbJ(D-S1=~g^G+s +zXE+cPnAk|jckfWhPBC1HxahyQg_{2Bo9r0FJGypk?iv`}-reu%Jwe14-hBmn?;Pms +z_jF%wnX!YNH!3DGmQ%i$StgKjR=Wa-(~oH$Nsft248)jea2(k`xd_K$7a#R@NBMXT +zGx5``Vbx-?uFDlVjO#3-r?SI#YeoC#slP-3^bD8i@@J|K*k|}kW5(_%A7=QV?Sc^# +z_zAG)ae}I3u)7x|#^H|M3j~mujP8raKtq5qtvcz7rDWXOV3dw~VTfMb`?FlOqUf3^ +z#%S5ntvQ?{u+Pa?@Z2FSLIb4nU_*ZJur}0G*2|Gzi&?4)bm#P>jH=}5Ws`w`E6H}% +zYZ>a=m181~4qxHm*=@Ndi0-w5pwkkP*`3VjpkU!`cUm+sJ^f#a`rpGc0WD_#*|Mh9 +zqyKG*&gp+=w6?jmBbg`~Pfw%DuM_ +zBEdMW8EB+Y+T|~&HEPe{G3vR>ym%+~F>^x&SM%OM*2TOPH@{PmyE?Bq^^s!3Y%hgTjRbB?71 +z=JCBC+pc3GfZ08$gAT}pG%1KPtEkH$k|ox-2u#c9iT5f-y@9aY*i$HI$zOj=|v~=7Nv**BUNW> +z>cM!m^fqj`yZ5|~p6*VLVm3sqOEHZGuFk$gD`!200gJ4{MkRW-5{*RL6png|_+fOv +zud`BQcM-75-+~=0ZX!^mF!*2=!nP#_wlEV}bfBPw!D)<^UL9jFvkG<`1iL>_6hnP7 +z1c)u=3`kT3JNsvk-Ja6{BUSuM>wC1nyy~QHRZ8(fOc-$+?V(NQeK{$=bO(|}V{<;p +z4IBJb-1#rFg(h31CJQ!#Hwp!ss06$AnibBz{K&9k7ePXnmtEewD{L;`y;WngK(5?~ +z0PZE&t(A8+Ce&n3uFBs+^eMKeW5O#8n^@2~fwEe-s^Q4Dkn0k2$Q^2+^qkFGBX_>z +zPBxN-CMOPgRnPbgD-fzJm_QK!X%lVKL$As!o?yY`m&tGb-Alt;z1kzV%#558GBV&p +zmdci%0iUIEShU6u1rDuMT+`v*-P!R2@(1GdMB5cy*K8q>AKoN_1RdRjBJU_=cDSmg +za5-OgFqVI@`%R!9JJ{>Sa#1ahdyj#90_sSfvy7VeEaSJs9PZjIxce9HKrB)EvQYgI +zU%ZiJN{l{QePuG?q +z!TiI1aAa?Yy43hM7)wDFA#kvgQB9W56mE|xnK~C9ET1)vmIQVsaB*xT*j68+F}>Kn +z#uGi6@vNS)Kyzn!Iv_3N2%56VDX>&@^%hY&(kw(c_7Y|?LWpcd<3=vYH&B4X%H~jW +zK(l+0<4uAvAO+KT;Fbs9po<_2kAacPScphS%Z-sABYE%6sI|&E3})37UE35}t3+dM +z(dM@3x=LEB6jVJ+0iQTk&4qkAN5Tiar5=7K*J>(@W{ +zQ``VUJ&*x}C{6amQX)CAC{Zc~OmU(_k>B=9!xUc`rqe8?2eDavVi&M7-j@+8W51t4 +z>?$Gn6l)L2i^iZTC%(x%_h*f>m}=T8_mq+@_yrxTI?_#ALn)}tg3XwN%m{vfnive8w`v#!Z +z<~8`n0ApL)8u@p7S5F_>=>kE+e@?II1oQ!Qx<`2mK@_qSRoSwwn;bKg +zFsBDH8+6J-QnVbt+IH)iU@TmuLl&DS5BNY#L7m +z@$aJAQ9dmGP;&221sYeP)GjRq@A`Dm~hj` +zW#gLAU%ql0^ahd7A~gJ2xrR&lxD_lm%5!&i50$UWcoHI2`Lvd?UlppJG{*FFkg&*X +z7>}8gMmAAw01$c@=%uG`TX*l_%olGFV>XVgZACaj&b>DaB&nLKy8dq$bL@~@z6!t#siJHh7*RE%67Osh`)#c6TS)Gc_}GMUd#@D +zr;qZ;c%!6)AZdwE3IKl5r5C3!SPUPXrh`_ZkHU1duxNH6u%*G5xO>QSjOraKF@{n43$uu- +z;&Ma@oeSnK?TR!+ +z{f)WAF~41*CuLHwHMTG +zuia5QSRZmI2TqxhEMeV7Di{qbXTb+FvCvgWVi&_4fuyTRH4A4GID=DtG#`^w4C_sy +zV>;+E#x*qoc_kq#zY19{VIApKy{U|*kiBnxLn2eW +z@v`KYWsdnRNU{LO)d|9{b6K03Xi75R=4`M6jz-`<*h@|ffowuHDA-+u|0amMir&ky +zCl}STEFq1+$T4JUzBi<9y*-Skl)gtx)X%V~NW`A8`gVJ?8v;0GFfy3IKs{R@`Dlgj +zbQ!`HQ-FB3FVP{xOhx!Bc`I_yyHABs-oiX!u}DZ963EV~AVrv3238Nx0Bf@chn$s^ +zXDhV9kZ9T$fW}4|cRJzFx4?>pl^RU>gNpgMB(O^8r?C;93BB0^&*(&M%K1$Je^v4n +z@Cv0*foswFELFBG_^nKKW-GQVRYj!XiZ3;1eL$4sCKMan(OsEr^cw=YX*8aB=9;q_ +zV|NyWTN3M%Hi%gLcx{1m4ly4(XTyq +zgfQ8>0yQe|4Ub-6wrMIp-`S@2oUf+YrpPF~=$wtuB}ln;G0syQ^vUM{frGiu0R^@} +zMi}{<;XsHjd6zAci+7S;CnJlgKJ6XVMI~zD@|9}S_l#Zlngi*B&TAYTozDFT)s0FGglkDjz7NdEg +zn$jX-6e`kC5MaQ_HDI!>k2_Qf@(w38y%86yg@k7ok +zle#sIUFimCnnK`b1IW6g@iU@FDt<-)psYYxi+(mUikZ>k`lufFl2F-)Gzv>&cvp9C +zOS3RQdtw7Mt57HJyvm8MXmZSQ<6&rA<7OR5W@;RC*FsbW_CU1_K^Ud#SyEdzyEWbgF{)aMNVj0UO1kEa#xbB5=D%fmZ<*=Rs7>f%pb1i& +zND~@b*O~x?K01Z%@px=#+?%7BhEfrwV$>-_V}W28%fm->OD6bjxdEbbS3 +zOeH?{9GzL%i-bn7XiNp=cwAx$b3A7yjLCG+6K-?dm;|?1p&JlCEkiCT#HVQf38rO7M!Jxsnr_%J8PfjrWz7M}nWgA0h#yB{<1 +z^xlxSdl_Gvl{V5NM7rM%=lueR)vP?F#PLk3I#|SekZ(>F!U78iU^{K49bd5QXu@=U +zO-jEs{AHuWJxr0H*ma=<*L3Dgq8oO&^$e08gqVXBS@rZA21|+?NqNX4aP?g>I4%H^ +zx@l=XBtD{&ipH4S6J_6WVdsY`cI;4BDP$xr71kHn#*r0DgB1e|puKGOE9p}T*e7N5 +zz(F&F4WW~Ufm~dWSrm1I)K=qykcW_S0ZR66;3Z_ngD1~&Ed0VtyVPYZt!7t~KFHGz +ziaQShFhmMajDZV@X^l)_U`VkoH?83uvrP)Bz=qJ!FrJY|Ww(dX(0$tTZ9w$cVCR52 +zkBwL4r?m6`;dy`*IsdO)*Wx+#zyV69#fF +zt#|4D`g?X9p36o)&kUaVTXvzSi1&mY^-uLCK`C!%PIhl5in3%4-0Cf9|4zaKNnKCI +z&+m}A6 +ze*O5OLmFDq4g}kO*L@cb0z?sxWiB9>9lJOdCy;c&j>R1aqiH~>018}CPIvHfW9(=k +z4Rpqcq-KlEUNIyf_LZHY9>Md?Q=d0Y{b6OPFDIV?k4ef`=@l*2ZJT;}H$CHk&Ifol +zIac)y^~RdZ-#xoDwgbR|w$9WOny{1G?`kNJ7BvO{DB0JV%{}CtFxY(|cuqA(ThFYa +zZ!Zd$T?yo%f~u=Hd!ynqmoJBYRS>CU?dch2%iz9PpW(Vp&V2&85Td>s$Y5`(k0_rX>K$mEgX9U +z%&diBACea|g4XVpjd#JoDi5;qVl`F@8ae+0BziGRi#aLmu>@hiY_VJv7@2A$r}Z%+ +zOL=Ai(}Qa9XIj9nuUDN7yvXfJx)%Hn^CyFj;IE +zdAW@*^|^`0p&E(r_>&SZEwCS2FjP{=sUrFxB3d72@{g)w`k&^tYuCBsf2?h3UNfiv +znT=1`Z>P8P^Keb2W&J=3qftC!vz%qiC*_ASgPb2+7m+VbmtYx@c0aMxj7bSY2ufx< +zF-YZd$g(i?>=G`2Y7orr#MKK$im_93ky2DAQn(C?h(*efZ4@4v#oH>a+!)Pli8nIE +zi)J*KwBkkWoAe^(_|{sa7`uinHea|;7RQTE!Y==U>?*AUycEnc!<#E!$TuSmUTwxR +zoRiVGZl+&q6jDmcj50ht77v8^&hFrd=SCp~xH1BY*(pQ$L%STsKW|Ey61xPDx2r37 +zWWUFL?E*fau*JrTi0jWTLIZ$HZQvuj0FAIN6~ISg0Zzezu!pF{Vth>q#rPws7%VZ` +zqqI8hGN!kT=`KSVh=g7G$S%Q_iHIEbNa)Bj0q{r!#ElzM!i~K!u#mh~#6oTax@XDs +zB2S_OXI()@uBGObVhlvY8++u8Tp(z2^&ipU>Wiz5s;juNpwe)dlow^o0f0(@(%&Z +zy%8W;qU0uS=&Hn%5M0ybNsnzNnARro6-}BE&s>#4SL(f>l#gdv=-vFKY1Fw=OH(%r +zxwH#JWh`stGF~_d;WgtcA3*V^nx5Jla6{m&sk={ry?nhjl^~chE|LMphSJFfC5S&luFT{4 +zR)s4$1|8F|(;MdSA#8Lbc@uJH9LO&_RuV4WVR6v>h4f0oX7^YeIRBGDWhXQ*aFtsn +z^4?$Z1>$?Es3{exGE+q^>cOZ_&f%UgO)*T7iptxHV3mc*<{?yPhw1nntIC5Gd5(T`+7)q&Q0r@}K@TQc63Zj~kGpU~siv$kTHpRRS&|Lu>3BcfnY=9G*qNR=8 +z*tp_PK$RJ+Jt$9Fryg3{!9ug|j$6VRwY<|JBv)F=xQK3QsSN4WVIKZdR6cTaC0n$e +zn87cK1r%oIan-T_IJg&g0-W+#@T3(UWs2z`E4ya=6eZH^Flb6+?v8NB=SVa!2D=Dv +zox +zv12{c9+{L0NkQ0cOLyOJC-~e8*GLpE@nqT(u)E>?ouY}V5WFu1W3Oc?NkTisQdZ+NxS +zCG+%rhh#pzZZm%v%?3r-fSgI-Np^B+Qy)u{1CBWk;s(kbq3U2QInTU<(-iFh8q}N2c!%EO>f!uNx=sb+Q1WO(v!oynXsE? +zp@t+zGx$WV;dpfl3l@?|`bfg1uia@%OGOv6d`2qDiM;2MBSegYESB#cnL5j2VzN4G2umbLjTg7wO%dr_q%YkwRb=g8(m6X9z)&tc(f@nk`V0yuT+)%W_dR~y3W=|vO +zZvazPJueD@p8k5gTHcaPc`65<-JcJ5m78)RUeDIOm%j~ASrKZV6I?yoC`D1f5_g~O +zYuTgx26T%ZnaX>BtsEf~Fd1ZI;G^LzaI~ZCFx@5uG#DNn8tCfS;T-2!t|>z4MjS(E +zD&`a!Z^}olxso2g9L*M~Zr2mgBPbR9h;|z4PB5;~AcwYzVM-L$bcu9ASNSD4NBk|I +z8qI1D5(Sf-9=4KHyavgmBgG<>RFS$*PzaZ#A!W5uA9#Hx +zYfONfD@#nufB_hT9b1RHd%K398F9DZm+=t>YF2Yh+2F#NA}`U#xO12*%xFdnI6p^l +zfQ)%lm7#8uwp4K1CPSnCEwMl|quh7<;hlid-b^$lYC5M>XmQGlFg +zOjZel#HBQzH;d{wBgz(0vxjwS8l>8qj)=B9v>W28Ud&w$Oo}SvFfb;vPFZf$&$gs!xjWMO*PPoqJB0If`KgITcM&yU(16U;g_nKIA>05O9fnw;{Jh6q>PwMG}F=;}#uGqrs +zp*lWyAe=Ir?5B3PVI`%fQRYagd&qzBtbvC&F6r&)?zQDS@;$gGtW1TJU~o@JS+4}i +z*Rz#9N*j5`o3tx-obOcZIA5%|(YN9&#DS5Y7hxM6qq?F3PGw?gGpT7A&-Po)OGF8< +zUcfcM+qc3!Mu@Zl?Ym0hGpCGW$)#|=lJcPm=EM%kWiRu{QLfYK_OS#jvn~q*@k)9I +z(NF=hV&@>JGpbJPUxbj=B)_|{QjHt&H6*)CI#MEejOD=C0sgIs+P709>x^&_a;||J +zs8lXKPP3--Tv17F)Z&4@$nVo+O7D$9z!1sUQbA +z@-Gam%@bPOnH{o4P*YG^7COaC6gX3)ObQNxrZL7k&f>u_ZBVF_dWvi`<(*+ZXKaqi +z+LWf4Pa`M{ovB=}L?cn9u1=Und?a4jF;!2atU~f>N36u50jjW@ZWN(It`$;N<9jrX +z@o1NTr<3z0H0|4WVSsJu@~FPb10vb4?2f`B#34sDR`%tP%y0l$WXn>h&0F`cbxxWWl`Co&@<)H&qcnwG9#u +z*$51i-jW2h)cW%rHJyX&+*nwNowY8i1a}T?2`O$~!t0jXx>r6!df5fy2(xl9TyE{| +z>4MDa$|xgQUWfi7BOOEz3y1g)bE}@z;9Ib6)N*c0chLhX*|1n=WYIeNqKJ^S(HKQY +zh~FJr3WN@`B8kZ!W3rQ+h@knVSR|^gBg+Y2K=wWUrXkqcd{*mOYu7cOwKfu^oG2a!ERHbjhcf)-igvDn(y*4A|`YonAs>}4nL5)jLEyyW== +zVHXn=NLJDqO{i1Bx`{B_8}V|OkFp_zM>A(ohdq*sh&3^6YH@;3{F)=*5p!$lfcU|@ +zd~`T_!3Ed^cy-!r7K*sGSKdNukh2P4VT2HJ8uexC?sGUY(}Gd%+lJBo=mB22D2xWR +zm)J~$GG)bX44H^V=srOi3zTkC0wV$Jgl>qecewMXkLd=+RZmKgg_I*bhblNng-m%| +z88g`A3Hz?E32vjGeI#JO*FdrbY#QCxkyyOAain=PeLct)+?>FEQm +zV(}U_mkF~KiA%DAzB@%VkTqB3nPQK`G%F_BsDcFMWAm$WBc}vSYmLNL(wt4W9Eo5J +z$Z`}^!Vv_~At0D;h()6)xKnY!wckTFLWS^KW+`m({g?X_r0H{V(%N9Z6pE(Bvca^{ +zpv0p5BX|%vWjAgROGu5J#XqzjO>`ejt7(Ixrw+mvWJBPJAf2oPn6nauZYZ<-JLfA* +zo^WrhNBUB0?o;xo#QWdFvH>e<|J5Ax-v2hw-T%(U$F~0>$HKmyVgg|2$vk(sBO(NEK9#sf$j)#aG9&_(Nnn;6+>(}AKggRWYRXv74MMb2B`cg +zC^Pk>&UR&N&(RghO;OF3+!P*1Mt!v3Pvx7p0rTbkvkN4xbgWr? +zj}JT<0V7tXB1r-Jv&L9fO;N?5nzqV~Hnu&I0j`Z!0Q_#A@tv9xl)ZfrMY!30mT>zi +zB{*roMIi`(uu75o$V%nYX&cv#q01Gi5sZroYT`yh3oG$lHj5dRO)Vq5OcE)CC+CUV +zX2QCfPCg6XeVC3vjAS7kg +zgO-X8311`HI8| +zm^oGifN@snzmbR%xHuhvf2CpBgVx~mfH}TR$j}E!wF_Z>8j5FvFa{=bf}uE60$A9U +z$B@o3w$C%|DR$B$q*in$WFAB;VJW-^(@ABR91{}S9!y84>=kk!Vvz`Y-9}aE#%?b` +za|}3C4{66D@e-)V#tAR#BupedVY);Pjw|Vqr!1fc2keub2vDGhl?l)~V=XRA)( +zB@B;Sq&_N90UhN;$Up0mFb^zaBGZvVwGf{ccMUg9x_^6+WWTjlsRf~hk%`zY5j0Q6 +zC3%8GNX4SY?qL27LQV$Ae57ThQYwI+N`w_P>m>6e-({rpd|OCgEK6M~fvZlzMMrAj +z63miC7_#9krM_6D2)vM{E@(mqu8b-ru$3~bIjqVq#k(if#hiQv`vMrj&slCk7yx}) +zsExdE&{m|^h1y|R(R`ZVZwl3B`O$o8^EXBMX8Iw&CJLhv(|WP&UclhBjFcCbrXb|o +z0L-nBqcE(9%#3fu7N2Ak*dm!+DicwYNv97TCKq}F(>I}z(>a5mw`DW#IE~K*_hvZ) +zel|IUDyzI}N65Fv(8(WF+levlwy75)+kfbW?SzX};(UwnK3)>gv)aO#7e=-!f +zlVPa<*v3N>4Tt1R!*QRz+7VjX1pN)y*O1njKq<`y?K0lx1y#-oEHje0CsCaQiQg{k +zlTHw>cH(=(bV?Zg9_e%G+-G(^Mf5+pMCJ4Ut!rNA_5W{anbZHw#;4qOJ3Bk4ng0(d +zjH-3cn#=!(4*@0YQmMSIe9DY{`IJ|RGvBnb5tfo15Xx9anUe0YVxw6jb%c@#mfosa +zdaJMCEP-ULmXIZol&VaYz@j<+jB<g) +ztO~r~b(|^{&K*d2$SXQ`AQ@lTatD&OuCiklLC8DupkP8ks6Y_zUu8yF0X-ln^jQf> +z{(OL$PE~iWCT5bl3eNg7>DjOPt31!3=z;)bYX{|K;la6aEkuS?>TyF()YEvviU9(> +zA|RQ-sB%+t2={B*F|{UX&@ZanX<+fRocLN+mej*LON?H=v7Ux4undC8Ci4XAs`D6*KG%fSVRQxuRRmtGNIfd4R7Cvbth0lYn{ElA?=TBeREjU}^>jgei6-nxDH?bkw#L&xd5qQU7?o1&dc*;R +zjfO^rPQo0pIumaf?W*MpWG^k45~A39of-hJS@C1=5URLrXO&dlC(IcVtBbeWc_#`` +z~BLI&cxhFlKLW%)FgZHKpTyGz&)Qdd*NYP5>~2 +zLKdaztbIaM#a6#`tr{Hc0FPCM8xb+DYBn)I52q$&6>vr+yFTbaXN5ZyPRU!0J;lpxLiJcG3dRZ`Yz +zull8gE06L3$|9$bH}WhANvNZXVQ!E-22@~XVs917X_ +z>*P7u%_S@@->P*dEOralM+nz0&RHPwZRMHfVG2?uk@S(ty`G;{jp(k6C5cbX4v#uQ +z;m%(62_6M8%I^pT1oAC;3!A0HjiM$&PTVL( +zWZ^QJPwK>%T^ht!?WY9)k4oo%gh0XG{EzGA{6A*n!yN+PdcukQMSoS!H>6YTA{0fMHCG{r}}4?ILz +z25Ad}y~XRz@%Wa!fZrmRxt +zMOk|C{kafaWhCm5 +zT>d^%Qu=l@`obbr%F6@Qp +z)A7sGACDjb&M@pegnZ9eQ#)PPJkripRM(7NcIm=?c~F|(bC+70-tS1IXXd~s14@6F +z;({lGJiU4j@ZNeD41Bkyn4sH*v%XEa7>zHN0pC(gh^WSQt7G6!27&YP_~Y>)p6&!m +zq!(`ZAaK1r>uK$JPaiJ*EnP6eZ6HLv#;8N&WuwautwJ|46>|fuoCOUv +zWz`apIcl~{Y4ZESQHh7$ZIB-Y?kHv2cip(rQ4Kr&p$Sd8aU*%*Z-`dJxuFt(@h*$P +z<}a*P7C5`lqR{z^$d#Vce9*mGEcl9H)y3^+V8fTLqzT{AXZ?M62+eE%ojy9vzYlM; +zd{iabfBX2~Ps;$jJQE|Be6M7jL^rim#sXU+#z1DnU}%@BTQnfH6Gzf?TUaWpWdUp$ +z$kM)M;deKr70I%w(l%XwiX(Y?7&xV}ct`ZiW0UFi9IB&rmu1Su^5QE&V +zOszJU@rD!1L@;M;!d%~Gj#MV`jy$rP1+eYvGd3$xJTIJciC?gb+4Z#Atiz#=>?Vv|z$LM8 +zKU@*!F(b96oZ{H_ha}7&L)S`fjLZ?z%91ZZrW6%;fMfUv1vlC*lh{zi%%z91juWi} +ze!`Uz=_)tm +zx0a8I_<5uVR~@tHk}}iVotnIiEUTpqOY>n>#n_sMlhKx@%gSgik(bdYE@tLxTp~E( +zotK@7d$Si;Qo!cxZ74gHL$@!d&d%+59L8(XBMSr*tGPRbw@7%6K| +zUf+iu7-yOXv!ZKX*2xrK`(7=`5hBOIaZZndt_iN_30KX6E+IKpX>GT!rPGYb(#uuF +zO=R4d@%klA=#cX^G0Cp7-kQ<7=dg2(AFMfS@-xWmf1mUJnU#<2|B1Rk$8(PUtfY5PQBP2v8@GZj +z#^oTDscA*qqe8xHutS6+1BkDCEQr(X@()!Nvai6UJnhZT84^hw9gfaAQvOCh&XAPl +z%AP^R93;ICji8Jx9Cs$j{xZ-*ewaow2k)SsXBUXT(~cZDe`nj2PUOYC+PFFbk7Y(qX%snm +z%bARow-RoSe(h`8TAL+SUfvOxxj8bnPK}&c$a#Y~c9ge$mMa>?Y;qvUYFFg+tQHI~ +z*Rl{R07-($>)~zeH?{H?%F`6}p&ANgkZ(q0D#*j~<75Yw112Ef7LrRj+aEr!YhbXu +zua}H30CX7x?iZ-QD7w;+P#*LOYywb64F_7yjH_gCRmO>UlhERN3e$6E$O_TYmdck% +zcRG`^;0rl=wkace8k8!mDbmmg*quTT30xx7h>;fO?aOU~5XGv~#>zZo$3F$T51Mky +zbLwh6X68nM5RWl<(WM=Y7pjd{MjOu>z9hsPQ_%c5?#XY>Dvui3lxhV7wY9a;W^l}6 +z&qt;#jntym;7HALhnI7B1hf5F!=iyf@UBxawXqb3k$Q#S66Uly=r-7E?pA0tgQ{!?y21)u}OlFe2fw( +zK8TCXGT6loDIHc~Yb(zrH|KOvoU#?l(uJUefe%0~R2|6>p1CFv$`14Aie1!xBu!u3 +z$dYNx7&PXrI)XB$-E29B=32A7D+DWO!yK034RLikn;4i+sQ{T1xVQmLd!Q*GtyQTU +zu0YhCA{fkQM@Cikps(l~ +z=W4>+Co5@>mULcd!1ACYO%eCNVW=XPwFfQ@olUTC<*c>P7z9WgH9#PMmt$Eql_E!a +zvU|j{`iMr2C@|M93&O@cc0kt0mZ6RH1dxqNTiXU@y%`_ZQrgD0rl$2O9zS(!YGc!S +zz{bXQ@(*d>+<5l-D{@+PYU8T)qgfSq*NxbWQ-d}JS6g~|)Y!Ob{kUOT8{5`{YaK0X +zzjKOiyoeM~O>>frbmJvh3i~A`K!{q;cJhr)d+o0-W=Y0@x=q-@@ra$v#x-0l7GxhC +z#WS2{veF4{RLv!=HWBOWnKGd!NkR0A($x4ky#Vv@TcM&Q%>%tJ3zJo;5qS;fi_8J@ +zodUralf{m!6B=Xkng()@h6Xr^Hu{ik-Z&XVp5u58D;#a~8(0}qe1#RjFpGuG>vKa{ +zn6$8hb4Hd7n=&ZWH)68R0Q{t;B8AmA)q|LN6`S_Gpn?W-6+MA&*+4dcOZv7_q5zx< +zv>=(#FrO2;JPEYIT_v9`9HRz8t+Xvw%-UN9`D}Y4Kz7mm~RG+Y! +z1nC?d^l;_sChvi)skENtn_Jqj@IAzWC;z}+Ci5UtRxtAbwSm|H*xwRSfbesRCdlS5 +zurY}*B6b3`rm(e1EX&7DiDx4C+nM1 +zZNZ)|4PI0`c?tQic6DuIZRC=MP%Swr*zMc!m>~`aZ4?@7mv>O9YkQ#-?!Bpr?jw=_ +znf8p`ZjH2(E^+X<$XK7`{{`WwJsT!Kgy9Mg479xs$`vK{PZxXPZrk16W<1@}W@BL~(Xve}?}!CJ0sA7n5@;0?*aox_=NN}5 +z0P%?`wk(q>`qP9-nyACtV*f;C4O3^3N-%HfDTQzIG+7AOF{3WNnKzjiGk&AIscIs1x>r?$~u{te38@rn=gv +z4!ovnE0GZ(G-7GzJ3!VZ4GbzEVAVy}yVwz~Ee2S%e;s%uBAP8)UP-KFfAzx0szD73 +zCjATBgv4{i@k-5Y!scZ5RxM1VYg?eR7-(v8RU<#dt;ZP{6E%d&@(X83{`GB<$%lwm +ziKws(3esOmLLTFJ%2!)w>AslmX%rTNh!K4TC|+w^(e7| +z9Llf+q0MQiDsd{~6r>s}dM`-V1K;hK9*P}A?BPqV1;!Q>$}_bH_wDnxMvq7~43ZXw +zD~N2(mQ=@gSg`Gj9r$YBIPd@#tK;rOtS1ea)p3=V)?1(|ejr +z$@ETG)Ir%dWA?)kyC;^fQ}W%SFap)hVS6VfeJgoeVAk+?+DPbGa-=bE-Lghz;~XYm +zrrF0X=OpHkuuZ_u@yj`3xlIk6gOziO&geOpHq}wB4fvgv&1qr#HJ;Ld1v(v!Xk=0~ +zTO9&x+wv?Bc-!U@ZfL)@&ZxY2lh0w|IV;RYC#(>pe^?Ck0r;zUsS_!NR^`IKK+WmK +z7$sk6joDH!p>?*ih +zhT`9Fnl^kGV`IzOXVr_f15NBW!fsTn-FII{+Ca0ypJMjEJjKr8^id@LORTkJt;_y* +zU2`ltXa74JpK^P6FdJUjn20<#q9^q$sr?Ld<-mMhX?;(@3}9fG1KUU1n51TN*<8kI +z1ZEpyB{EuCO_FnnF^aCb=&478mx43ngrSqIC}&PJPO7>EEg9(~Xa>pSNnk?_DAaW~ +z^-)LPQB_a!;Mt>k)+9SxQjKd7#m8%eF9>RGyq2ZWiZwMiE73FCT3XtgXFXGm@K7Hk +zcp(pK@@3L0+oo#A&BQ4s;&cKw$)-ti48$)^Mm1A#%VCZsWp<)v@r%I6wQFd&zptmq +zl|(0FBpFtif77mx?xC%n!vp**0(H83-LH3vulsfmx!-T$?}N1d)vR0yJz|&(Baq-I +zgxF(v$Pm#CUr&am2%Fr=7v7Og$d3F39z6j6XhO-1CRk+7(L`hvag8E%`3I65hR`4fvURuhKIU$bdgcCqgO0MAWp$OGl!Ij!%-S)fVsjZ +z3<5dXszKey!;9EG5TS`QoSlL`8e$sc4z7kh7B+4&s9+s|5ruUNqG(0WR>-*tT~Mp{ +zGJBpNmfk>~Ds^?>>zp>=XIFRc(0~wp#4crz1dDnKMEyo;7cwWIj6J=i!=Q-7I%%f6 +z1_nYB;MjHgFJ!M(fZASbwn +z9a)34AOt%?95zVLpiy_56%66b(j|z3Ef@)sVJ9m`JB&fvUft<1->4htPR)N!O20Jx +z<=8kC+x(>s*0a$&DChfp@$JXGpD335rMQ_WWH(V7omwHKL2>UW5Wa>B2t+u9!x~Nor{tmRMZ7Gz^q2VH9JcfO6~yr5D;Z +zwzwVyA=(&6t=yIv?Z|GW(7I@)*ICaA;WHQY1mHJR;cVr(Pi^j~o$@5`iec({puvf=*wMMtKb>b)*gk +zx{nr`NdGOK$z!e;6}@^*fx{%gGs+yGti%>@Wr9{m=o8=KTBTjqLDx*FNQf?|w6`k~t%&T2H$Wg#!7_;=$HfFf +zB}j@6B?+6Y)CHqo${z6OMh?iDw~W26#f845ueY~jbKk&FSEsbxdl +zcUyZM)|#$|BN{m4p;H}Owa&PA_P(jNZ&z=Hk^`m_v$P;EIjFQ8#8A-?DKyMebHt4t +zgnMv~s`PP#iBTY=@&^8*ag}_cIbC)aNv9;LcwOy +zXDE2FaP`#+=LFDZzDZH4B{KQdMn0j=v**iWR%Ppm@ccP +z0s0D!dNhbM;me-<`H)9KfE<>-1n80mcpt@>*shls6SIt2WMh^wJw_(;FMAqFllJ{M +z+_ZVs%()F2s}H{sx9xVpB6$|M$xK)KjAVqF3j?LEquE(312j>TZ;18Pz)noV0pnd6XE*~EzrLzX3e*L?TTji&A +zWm@E3MD|sV1ieq79rf%HJajiBqA$2J!IhdRNi5a3LPVLt+bg$WN)#wXjSLp1O48Bc}B +z($&$~Indp^bFj-92hZTHCc!3t3fu~ErY4Ms*6bbx{jpGu6}QdiJvBPEZ0Q$?*{%LrXSGx08RmuKehm``TNdBMZSj#%E +z|5t3z|7$ircK#oB0u)jJ*-wr-A2DB#ESkz^9dpQvHbvKA{)cGWno2rkl^r>o2Rjw+ +zyELjNwelxR6wDg%M$2)PLM{t_QlO_tqhZ@~S}K=I>!y`p1xHDVv=|2&!s3`@QoxuZ +zK^5L=+H!S;Cj-_36Bl6~@iJNVbDJ`oz+}+mg(*4s0|tdTIfzYj%T;g7=PPSo+8J>9h$Bg~X +zW(=~fNC`H^LQ-xg&Nt@LJG~4(MfU&6S@8c}+tS?X-TzzW_W#-V9ErVsm!58EF6aP$ +z#N4}WdZ+H)YaI9PC?p1KjS*|<+GnOnB%(M8hQ;&J +zq~}=N{z~&g+cntH*)h~X=2PudEtQ`3cJ&Q(DwF5YBvJ!33_3 +z=yC3DYKzpA=F=2=hKR=>VpBnv`yfT8*DrkrK7@rl(q(USo3%NFl(&6;| +zSYhJR>>k1)^ueU2WrD#@5K2fBF>*|5utI*@G9_I(p^rnnc^zG4Ki4^*bNb2Sg{Ii* +zFtD5jD-j}QQ?nOB9bm4#tGl_{&i2A6{IrbGA(41qn-xYiQ{cO&!vanxe +z!hnM~DjnR;BZuQVqMEz8XNqOm&Xq!g(|47Gm`S$v0Y*5c?dvAEFt7;ruAc1Ea6U1I +z9eYU$a-81T(}|Wqg3lDZaJ(kH#?6)Vk<>&d2*>eZT+L*(v{?xU$h4(M9(RsS0fT9b +z8ds+Y4>ajkLU0bU3(N;y1HmZ`3@CMTEN5Cem{tm#43!dME{`5^{z@o-y~*(@7&db$ +z5$X|H21aObx4OZ;o?%Lh@O`*zV4!cnaoMCEn|0KDU+jpq4TduSZB|2f7?n9LMF2VV +zr2l%LrzkoUVW=NEKh9pL1aj%!X|e^-dI9R$qg(YR3$2cRKSmCGhryRs4(h>Z2P{U< +zhA(ZRHIL#W86ly~#fd0?oQOO;;T09rpd2A1N4N9M%6d-Q6)NaB +z4Iz;rKDL3G@Zw2bv$5v!>MNUnbxE5}KH8PG6zYx2D)YdN&i<0NMG^x9-rZ#Tl(OVXnS|>HU%%|Ae*Xvluj$^^bi_~Qso3?F3%yA=^Owbess)+#!b7L91f%o&o*4UA9Z* +z-E+&~h%bku)G0eRjQ6B!b}S=gATi=r(zzTBD_gt!dN+6Xg_Sxe_-gdDmhlujf_QqB +z`%o9W`#efqpxKLAx}YuO!u(2bNG4c3Y@g&wxle9&cSM|$VTYTsUozK=&cJUNFL$Tw +z)r`PS)3Mp5yDjE<>_I;I_f;3x%23LGQ)E?Fa4X{3;RT4fPFO +z&@WW$XQoZcWEPF@rZUu@C_nhUeb`K2zl+YekreZy%-er&-{8*ve!^yafPj6$%w-^M +zhySnv^+P@_aGxgtzi1XwT{>dC!8%1W_I5b#x0%VvCvvP*f9KZ;?c)$4>z^LuAEHaz=C7=+&%A +zBfA?6S-@5?Po14)d+FG+-M3mUjq2@ue1g<=ZB4vxB5Pza)P1LPCk`5; +z)+F3_;9aWJmO4V_r^MZIi@5z`o;}E8uVwug-R7NJ1*X?)@M}ObqY@rkm}|Nu2)0;s +zhX@MF5`+fw)dxx_Sa)#yPS@Ns`oSA1b=1;0tFbLtOA{Xi8`0T5AH)Wc>+v?y2gJf=88yY8cGdJRx +z9~RzL&+8gs4ADjCyL8;fB8g;DnV?Q?XpmrxD&*)g=GPW!sJpj&sJo-58&U4d+6HrR +z7!+JkJAQyjOj97bX<4!ZrTizQ6N%XYaa)#r$qn%O2+?*HMhh( +z{{PW6bN>Ic@!|1*c6s9e>^h?He+tJ4@b%fJ0f1Ux?g4jtOHc +zV4a{alpYQ@S`7Qb49=y$ISYt0ROkhF5Fa(K7h%uTeBt~|A&u@|F2oICR(Me +zDM#nUKCg2AUu^zCV&BnqczqPv|D&yInqBk1wzXw0{@<*8hQMH!oIxgZhz19yy9zlc +z7%7b11{9!}@vNQ!w@6SQSO#?)bNt4V`bbvIPSucR;4BBXsiZk_E=o>CYHEhY*#^e@ +z0FABIR)exSG;d}nvJpag;?b+Ik@c))$w9*|8c(LJd_}3HJL!)cU~?Gh2MoudeU_I8 +zoT&=Z%tMOT+sX$E)stGnwZ2=L>16UqaLp7L`YJ-CRz^gM` +z&TJty?7Jc`xerDnkr1w6))Cm$(9l+(H&Lx%E}c>1yMt^-*M6J0RiYNt&Tv}^3Kp9p95@BSG +zWE&dkn@S|Yh9SPoQhQVn9)ZyW;ZGj?OwXDCMrSLI0v29ajUjH~I~%@JVA_qlp^uMi +z@!i~nFKDI6945nxmQ*t)#0WzdS|gJQqoq+;QIkpVKM3)Ae=DV|CpB;{63x&^6|jB_ +z073)uTUG)zcwjVuyBN}9AO-u~2zPVQ5^Mta2TVvvMdrF}-)++taLoqj2F{Hted^QI +z7s#cxJsBFPiuxVY*P8W#FuijI1W9$=paTTgcp#uHGtV8G%huMJhZHX){t(N(v+qz| +z#4gMQ#erd|Nq_vZDO5JX93g;GiJ1?@(@d$O5$BKrx1Ix+4>kuJoSH&?8@u!L=R0sl +z$ayg13qfJ3@ol3Rc)Uy@0P;*vNuA2`krx6t(n?tXg&^@6w&Epf@-Olt#thirHQd>? +zdFM8VC@AXtlNu=HnQEqIX9v@`(83@MgC0JWfi&8-=8ZGEa{+99|u|&RSMK-U!$%RmO?3zAsx{+1dKD$Kt?*j +zIeT6L{Jx8+rVzxAs8SH%n&}Z_{*Nr^41+hKkuZZWCL$EjUvwTo`#l_1CNQiTeW4@_ +zk)S~DiZw5qxFm#(jW-_fVZ?|J)bYlX-~W&{5s +zQvKVcDQkdV(b=vP0`)ywA_%SsY~jfZoQlSno|jM#5sJqnMC?pLg{D@qNG3+!lPyW# +zqaZGrgqtOTe_&4_Oq&Sd0F#7g5{@HQZidPU!}Qjj@~NA3)oy{>S#{D|`%1a?$P^i~ +zRJ9eVqEP6nIa#FUNG290f12S>3;b!VVN5G1A0h(eC+P%NHJ90I6QMv@rY=?~3E?ne +zq1EEgX8C7}{IfO04=3o_NS8R{A>ch7i$pTb+G9d{#I>f#q)Ds_Ppa_Qr`#lYk#Y#EyONAJPYQ}XPmR~Vu +zL1qHY_G3{Rb_J1K!)V+&``VlVnF={V1kukR7Ukp&Ex3xS7mh^Ys}ddB*}UFp(lD~f +zjl_zy8e7t_s7=;BOOcVY|KcI#>HN-U-H`t4FTOZk&sPk`#Z1T^h>g?-s)3e;GbT() +zURt3qXO~b2BQ7(Uu&-d19c*0}nhwc`Rb$Q3aC0oYZe6%Fye1qCuM4-V4Y#(2W6@~H +z#f^`8+IrQJRxz>~SCgY$QgJ4*S)x3$bD7N^s*CyXCTNY#e6#B{2qvWIMp|ULdq2ho +zDnuQzQl>6X-R7BX^F?UMMtteyM0Q7lH-VzibuTYTvA45JQ>e3I8VO;j;Fb!?$D%9@ +zRgxKUa@N(PBhv?J!Cu>fpo6tUl*dlE-h)2MfE{swdDqE(`H+$l6wbo@gviyTgrw|u +z9_CrE)R +z!b)=kjGsCvCJ_-K=_D+wgPD#oR70o0S6{*KAkU4hMRwD5bAwIUrD&f6tX{x|MT|P+ +zNTDzh1a+);3?a&Tnk{NZL{FQPv4x|Ckln0vR>`#h2)<-1vh{+r>$^|`Y9Oo##E6B9 +z(6GFgN+Msp0`a3=I<>Pyrrd?Q(tOu;OrK-Dhs%0rk*)GsJE}OVi)1UoT#o>?zJmDc +z4A^QV_^Ly^v&~uI8enQzCP2@H&2+9&Dtil4{AMK(D0r{p(wm{G+}&^Cs~UQnSY1sU +zkQ0~k2-LQrj>1vQsSEE`u$jsoQFN2~*9YT#KG9_--bR2OO$0+Ubq=sY=~1xx(w1h( +zCn{T4sBv&vVkx`w5{TU=ATi`~1rO6OqOq8m?wc#IaW-W|8_d@jB`ATD<`NlaR>=<^ +zpvlwez)Xr41UXN0eoYBvSjmlu0VZxR^vv!sGp5q8cOQbY`lN1INsZBNz3<%90kA;8 +z;3TRfG>cv&2Bx{?5cUby2rl_UM6}Nw1JehlOACNWsuO})RY2jS$SMkZ%z5=*l39<} +zj%3WREb^kB;

    @=p+Pl2R74UBM^_PJ`jnJB7_apD|*_r0Aa>xzQ$l0NMjsep{<0T +zps_n?fI(g&tC_i^CAPvQXpFl*@}78Akr)fkEne2=n_Tx~7M-+wrxo{RYVXLoF_rv3 +z0GeC)g#2gA#olQ!>ozd@fe@F>6B_)PA-0i9_%j!#FciYd0F$)}Zw7+I1SP16e2FnTVC{GT#%@McLX<@sxoU4o^(l-xix8uy +z$+~N+s6_&m4{b@C@db~KkvBzx5(E(dQun6EAPA7fV&8|_6p3bJO2BL!0WiFcLTFME +z6;M#Dm|xE*9ztSbl{o85mU>zH7(@Y14UTj|i*aiaaY}4j3cC!HDKW@NQj}n=2{#NH +zBQ!tAA(5U$>B@Sg+0(dX7`tKnr5V}`J1lvyb_{#4_zi}%-WV4&j6~(=gl%ob2!*Fz +zDuq&3x=AJPjLWl2OIY!YJil?9e&Qm5*ekB2KC-lrc$IUuo{`KBDkO7p%@J9QDAiF}J+ +zLJE{(fyeUBbh~G&>5~M^H93RXXR(m;n3F)W&kQH>@(Ai$rMa+-2KZV56xcz7Tquyo +z;%u5F52Y+%SC}glrVwuczJfTim!9LWL-tOY0&sy%f1>2bA*De9bt1YMVViP6Si-YC +z0a*q?oS&N99MNtSAvBF6nS&=|lPe}n#3htRlTrFo5L59>@7 +z+D>E%2^pzi3=e6};jg#?0FhrnX*1iaXCSX120giMvKg +z&jc!mk>gP~$X11*_0^-R_Zt@#$<+g?IFcOiVT(^>OiIhZ~)B>P?{P&Qv+LWNaM1jVdRyc7zlN- +zWiMVvL?dfL1uBlvijI37>YoTi^sltzQT?l +z>XYx)ye6qhrXz6ZC$BrsNLEvKdo0a4xmifk9t6^9bJ;+T@E0L3Zz(iS1(v`6{P7s^UPEpZ1X9hc#YR)0|`V=LWe^Iv!9vDmPwm +z#NwO^)_a7HP*((eM!gXxOy-`z%oa%rkI-J`9jc}VcccLGj-b8}G}b2R%j3Agck(a` +zrpr$F>;^3W8!i8ihYtG(JJhhB2|a5~@gFF)3O^voB1jX$BQ9Wwk6;_%zfIR~damHV +z?E7k7*a6ZM`?kdp;ei_%(+iA46!sGyD=}QNH&o+`MHJ|5EHYdvd2w*K2y?FNrQeYK +z!hXiCMV%j(A^gNHm2x4<#!E23QVrVvJdElj#V0GuwFE+0uYSROx9T}-u*RrZ$j_d# +zK+KBJOE`Lcgr!`!avUtG8WfHzw!R)~$#+3^+o&4jLt)LklxpsSG^@+WANO=p&n;bY +zxW?5ifmqApg$xJ8@eYW2pRDsdY6h9o^{h2|mbdPi(b!pM`8=f;2c?zvZP*V2A3$UF +zxY1Ec;m#K}8$8F4SIX^0Okx2yu2`l!l;%N#wU(VsxG(g>fQ~ZcO0G)t_I}R +zrH&n#r3@)<;6>Rv=J#x!&qJqM@u>it_*fi*{9G7oDHZax?+=VG+zw78J5sQ$z??JkxFZg;U3f6#r32|U4N +zSLVjIpJ|&9^o5EwmsU)GzDTjc(7Vu|$DFkI7z#{6k&^jGQfMk%H!K+PK~F2Sk>*h| +z5ca#L!BYo0;2i1rMsuISpHkv~@fdA0?W0)yzqQRRp7>u7|8Xw@>awC<3y9c|fCt8(|P0&>YcK|XPu?QUjYgKq2Od4u}sXh7I5Wkn> +z)-$s@|0S(|dMh_$7EmnycZ)mzXLEGzy1Df~D<9z!Oie(f&LAi$LN(P?l?Ohlx)Fhl +zNkJO0Kad?E;!8ENdK;yhLuTH~t*EP=$aJG^&@c;5P(5njzT1hdT&BLJp3;+QHb|Xa +zg>uY~!kE;uTpXcc=+KH7Os)g9CXGdhHcq07I#11JZ%w}-gDG>2DjvxfxMngj-#s(z +zqv~^-Zi~D@>Bxw +z#m17x2o8(mB8YZpVP&^A6;>wHBt+P$ra|lCVAw*SMU5|c&lK#MaM=4Ca5$nz{8qE1$gcPkuGVn$L`k>7$3+M`8It +z7G1Np)gAx8rFky?_pE%jb#Fa$ow~1TU)787Gh0+Hzu^t#cOhxPAM_&N=5}J9gaN)AOW@7cBM-U}}HhYK(K +z)TNhx`r?c4z3j5jjEvkrHg>5tOnlk0zBo1Y<*Tmx%A4Q( +z)oZT#%3I(1*8ThU-+1GV?|kPwZ@u-_4}S22AN}Y@_wD=Y!Gj0yzWeTb@4ffapZ@d% +z4?OVs&wu`lU;N^O4?cL^bq~GutzWz8rmw&4ZQpp;yS{ngz$5Q@&!g{s@3%kjf$x0a +z1OMlvAN}4PcYN>8J0HLM?tlB_C!hG_C!hSsfBeDy_y6$z`=9#ffBw;zzx>mG`InzQ +z^w2}!_{KLLee}_P{nvjzbm-@gJ@(iSe(-}I|MleRx +z{y+ZXh3B68({FzB=Rf@6FE70C!t>9+NIrl1(_deF@o)I~e}Dh`-;Xp2y>dQb_ycR9 +zYUxW=tEx}me&4}|u3P$=hKnD)?~bp(b=j(OKD7P*JHPSvQ(7+n$)opw?2&gXTi$kh +z_h;|=)-A!of4KNtpS}A#?~m3tzpdN+<%a_MFOOXRaLYj7hZmkyd*g~fKCWyse{pQ! +z(dW)RXZxl_ThEQY=9!P(weT6G|FVViPP(>lg>vrvuH}zx(Qf?7f&Cw=xxH)t9iKh@ +z46XXs56xe&a@;&{&Wcsl?};9F*Nx{6Uc3M4Pwjut^^YC8x3~URH$Ss!)4uP#f6>rW +z&wS$U6Blm3{q(b*9zD3?j3pmlzyFv2Gjed@*4qz#@<)$7{;qlR7Kbl8^uZVB|Kzw& +zead>zrgt6Mmb!4;+ss2>*uFXaKIOJwJhtqnsxL2j?guYjv~IyqnofV|j>N`CF3axU +zcKdBZiTAAxoG|afzklSbd;j)_s&N0tg1eMHHeQ@ueuc)u8QEEST>!#GQJ^d?|d}?{M +zGSKj$eNQg@{xS0(U03&x +z#^aaWvFyarhnKF{R`skuJ@$_$UvuV-pIq|&n(8;k +zm#*AWefm&UhjIMSp^ob2r7IV|@fU3mKXTg>Z@Azex4!$7n-6yEKI7?M_AWT-g|{5r +zHBz^)>N9KqL%XDpfD*LLfpCpWZaUN`yR +zn%nOB&V$EQ#TGQ|*}wGunw(N~chj$ae6Z@Tsk=@-_uXBeyxcSLLcYagddfFYCe?9Nv#rqZ>_nv(>9`nbQ3+8?C+}p4C +z-uf3`S9kXpzjfbRU)ntSpX+l^Y0{ZNBl@s?UEkVqCrM!JmC= +z{ifq@IOB|Ke?IW0H>^B%N1J;6{I35!?bDks-G1P-1=iP3op|uai>l_G{M{8pTR-x? +z`43()?>h6(+Y|3T_EXjwZ@K5bD}Vi^`V;;(@$*FoH;>)B`MnF?KJ@uh)YnEjcHZ#Y +zPyPD%FTZfh*Tef3CKjH0@-fGbzGMA&=KW{YEz6GmVdLLl{PVq^d9dp2Qx@KI?7crs +z4gcw{zgxQUJvSWqe|LW`{pSU5oSb;#v>$vWxHRnNiSWuDmInCR8_Jle5f;#VK8y7kb73%~Wu;&s`D+t=K+=(1z)JmtT)SA{$K +zb}szub$|TQ$#)$5P2bM!)b$JB@`I0Dzv=EJQ^$U6*>%CHW1hNW;uCLw_=Ni&_*&I- +zhgNnkeQYrB$3=@n#=F%I9s0qur#!NK+5THzyyNw&S3PvY!V@1oV=A-rcVDaj=6Ch_ +z*KfIb=;7;^qAXT*LbM<@$~$ITe=Q5_xv@ysj4Abz2dk3bl}0q|M3Gq +zUp==OM1V* +z{PDo%Meh&Xwfy8w$^}yweDw3@J-qwpH@|Puo%bwT_v}5v>g_|DzkBeB|86|*{;%Hj +zSo?x2pL%%fAG+p0c5vIT4pyaqk-YM?sh6I+> +z7v8&S!=dy3{>K;YP;07Qv+t^>jyrMJ*_2uRFT)(UD +zjsN(wGyWRdcijKZyX80U?0oHiUi8t4`RBbWv+VqBy_eGF)A!GN?gxLl^So&18=tS5_ut2z^7XG)@2mdyz8(AjXaCZF +z_+9VaZDaf2(9$*UyZZL$UpugL*S~+^@_GMr?WPqS^N#!8(AVoOzHQOSriD#ccO0`J +z+Hw6mzVx+lU845{^}3hdxh(L5MHe<~9(dQn_l|w%(v4qyT}#b%KY3x~+4HYo+P8A> +zX?63z-S@MeMq=EUG=Tc|~H`XU;yM@zd##Dqi<_Jt=-YL`}5n{pTBDP3-ir4HoxVbk57KS +z>T_@S#IOJNv2)iw_08>@)ta|_>dQ;N)x7e$OyltW4Zr={!ykC6=K88d!Ka^%bzS!3 +zn>YNnYGdZQhH>?no_qFx_mpGrs9Jy8$~T>V`qqOhZrFaq#8V&X{aM$)Dj(VL*)O&4 +zx$m{d{o9MD&HJaPZ~MO=`})$S{`FtBeCLYl)4%`d?|=2f=XckidUf-P?Posn&sGdiouw&gta^oLtNQ}^?;<_EqQxc=FBpIiIv?|T3H%bySa*OT!>pR2uZ=g${zx^w3z +zPTjiU&Z;Nwp8VyHKK!?D{AtmZ_cm4iI2j>$koyR$qPTq3ar-oY&BQ#aBKx^ucAFQ+Iu{@i=FEW7g7f2$h3VOjTMji-00|5 +zn!j*SRp_b9|8U~@*Bz|-!6%ka9k}GhwQv4Z{jxJoNiKM->LhdOQ@>2#{Pc+zD)W}T +z=IjNVa`PVD|J5s&9P{|%t&dGC?O3$@{mZ`7y5`t>VvpZ>#?Y?ox7|7Kk~?$TZtGI3 +zs($uN^U1mEjvv`^>_ba8Jhd#jul4<(>&^Y8D! +z`9H?zJvP{X?xMSci4&Biftwe;@V;e#|BpABkIehg=Te7GdB=%W^UnU*h3~v?-ovd` +zRm(Qr^JrkjzTS(gsun8i<~=>HxF1zYL-*10;dH>Bzf3@db +z&yBz9-J6#DzIA2qLrYd&cGgMDCf;?R>&p77u}v$_e!Ahmr>?2@l7(fgNV5{o*OW#M4e8Y-v?O?P +zwb8%m_$QTlmn}GU`I4noLvMWir6s*}lk=(;f4Od1@8o&UC6+xN%%1aTY|Vi!BhjkR +zre)VGOCR%C)mLs=_NGI_fq5r&RBe6Z!TG_1^Us@l@A)^q_m8KndhNbNZ&u!L;IgIT +z2j?IA#JuymcdTDk^@dHcUp%w)T4izFq3D853o~~uj=rX9-d)Qs|GKs6ig&E4YdPUH +zw_O{$?XxGn@sy|My}oMRFAXc> +z)0SWN*eS>E-+RT9mUm6ue(h72H9UD+*1Y|l=VdnHhZkl)KnwtG5zV7j+JO63f +zm+v`$vTOHe|GF-F=H{FKw5#Evl~H}!yY4&d1ylX*^~vLN$%(tqQ106my!j2sJ+$P6 +zmo8JS#k&ulH@5wS(@wZ=-TQ7_o;hGGI?{2Un{DORm4z +z`pbtmPi*+|`xfs0_=llsrSbEN9j>d$`Rz*X=2==@*3?RBr~ +zzb^Xvz#U6>?>q3@6VLw1_dmS&!p!-ZTe6QWTv~nml1(4Ic+292``VXZxbri=eEs}Q +zRU?^O>hIWbLr&jwaNhiffrXiYdb< +z+`q8qz=yQU-*d$mTb}vV$DVz-?U*K!8Ko4 +zS=GLF`GWVn^@o3b=fYLXtW67+J>Po8(huF2?fC4L1z%XV{Q6BF56@d#{q(IX_Ad>7 +z?6%u~`}zkTYP;{$mR+l=mi4#Xxa$)q#FlQ|x3Io#{rvq)wW@`6oBF@~m*}2vMo+wK +z{-*xL?fOk$xqZd;%NBj_xA!i1eCbvFi!XS7!I{ezG~PFV_4D)BJ-=Yr8SiXUXz`-{dIp_xcK=Uzdh$o+kfzx`5lWsaL=dT +zabRWdrcYG8{oZve$JgAy_^#XUyY7zHr27|EANcgL4=&3ppE;vr>9**Jr(Sh`&$$b0 +zltuqmx8fa}7S$f}*~Jen-5nh}^)G*3{*FV77u@^V70Z`=;GU&V{KK;Fy#!%Z4{m$l +zls}%lL%DB7Y}10+(ypf$W)3{C>8g?B(+k_LJ!Rm&#i_>@C%(P-oC6C3f4gtTX)87c +zmTcP;tUh?>?#C7mKDKztzyI^)U;bS3$Dd38?Q{R{)MZueNA!&A`sCIB;T>9J+)5=6 +zyN|;9zvfs=izol*nl*Fzzh~vMer0FhmZ1y!yA+serGMwG +z<^1hKJ9?B@B&rNrSv_twHFfpkwRd3LvNCN=O_P(8k;#^bksWIq8fe-B4aJ})``Tz? +zwMfEB1UA;JhiCAQrY1JxmF;>rO1c4;F@&IET)NL94HiMB#pOzP>~N>)p52$vS#5NK2s9=B +zOxCzuBk%$Ig!m(I(+ps=lnnt(+haAs@1~74)$8H9S%K<}U@JATA+W_rTUy#`93q7S +zXn#b0v05<9b_Ki+OwHP`b7*Vhnb6AmCOYu-BSvCsV@=Kagg&9@i4EY+VX1mr%Mu(_ +zJC6x)iCo-*hwf*?Nn^|iY+SFFFfdX~PmL*Rl7QDks#$u*01GIJ^nhY!;{*gpb_lDzLzq(6!0H#`AR386r@4lA@PXEZ72gvgFLb#zFkIv^wBy1$JhE +zjh*aUY4r$)vyALiVB>c3rOu#ZCM(w{t-78@^AbxR(UZDGn&}oFBvdl@r8N}K5|XgU +zptoe}GztazZIoIY))6e2t!h$(HEEcx5v*@wlgu7SEv3|SPEBG{fsH%x2UN~K-9iO| +z0zw=xa0{r>L)!%gAh$whJ(*-Q+Ks=w3#G)y2m(fRvi!H;zd4^3S7JkKQ3f`W#i9(- +zA0<|WL|(scOjkl90Srl7&zjL6c^d{BZ9>U^O0^QbJ+HTIE&1t5> +z-%n>YkfjAS)^*caNGJ5TM)vPfb%ZlT%gve#t^t~-UDr&u1~%&>N!_rtxM~(Af4L$d +zU1PTnG_r+$DKH{eO;aQEmDH~!s2}8Cr&HTBks%J!FQt#%R5Lmo^k7GSw^-5DVO&d_ +zoJaJ)FMD~5!=#8XEydRB3Jm- +zE4h@a5OT@lGEkK(a+;FSvMC6UNmw&E&}8`X1&dG$isu^IB}3VP)LLVrk0*Ck`ubkZ`2H#Uedw@g;mi~AWTMT +zYIYJ#CI~hrRD#GcEiLdm2i+$5@&DPo7Wk-&bH53Jgn*hv5Jc3I@Y?8-2M?ium?bPp +z6q1kx@C|2oPm+b*JRLLMitH|uiq=jmLoiT)X_!JwJ5+~~?j0gt92?r`K`O?%Uk(Qkb83>>A_%J@Q +zoSc$m;o}fe9JdUEYF=D%?NFe&CVxqpG^0EQ3~J9alglc~*c(Oe=c+9<GBrBBIDW+;*tGCv`ipufU{&U)TR< +zRTAaw0;X}(3IuIaC1?(`fkCoqnCGEu;?N>h8>iC=hS_B|n9%Pk3r%DrRMPJ&(m4|* +z0^cr85={kunNU$N`8*=T61*3F8&9%+*+rTxMi5XiLjGjPW-A(Glr>}$at#P4$-aVd*-nf!vh*Puavz~_Wl$=OJ#B}b%)3cSm%e5q8mzpT?w%1dURfxj?vf{Zqg +z->)Ba8Ft)3_G!7OhU#ZC-o%KGg!~OtR+D7Tz&)Hue9r}C+;Y8mAyK=0(GG`MRIBm0 +zVk-*CjwM}@F@YchtV7D*3a2~aQVYq+iV>M|rVJuav3b`F(2r(Po-GT<%5X`8io0}1 +zIew$BwHzQ@MyAp%;)l#E1t+bdY+_Oi){_qfbWplCB)F*%?n=;jP6?C`0ylL=(@uvfICpu|YMQ9X(7M6N|zh}>)y +zJ35%T%D4)^AQf_?!lvZ>rKRJO^jrcL0%@YaCsV1AkG7}s2yjT|y^33_l4?BhP&iGe +zIRbw`G4t6m56R0~9In#;Sqn+4F$l-Q5C|hTwk%6_*jm*t4?Ch1vAcT%jls$Yo{&Z<-5WKV=c5iQWZ(j$4JL480{wM?W{8ywkEiyGmS)uftaNRu@+ +zEPG&&stDz$WGtaeW;Vhff!^JFbRE=tjMyiLz0w`p<= +zwIs<@;VztV3stSFMkYwKA##&|r9yFIL)KOhykv%@@Dh&vcgrLg_72BNX$w0U)X<8sFFT-k79-ARtD>quLP +zEMhD{WUEf5iDeV$re{5R2yg4W14205mL&IeKrU%lQ2?87Zsg1&J5URlT9bQ8oZR&I +z!mCuJ(V#dpSwzrl&3DhJ@hdEujhe3#1`M&?mjP+W>DAM&){^nIP?ByrB2Ebpr8*Os +z>W^v_k-0SYSJY+<_Tz$pT*wF;&LOIs5+YQc1$R(jT(c+$^QlEcs@)A2c!J!e+TwC+ +zSu7bCPu_(L*`id}kk9BQuQyBzF_o~V8_qLXs{GD(CYOpNrTTINwNo`}>~BJo{4Gh(9jc8j&(t0R)!{) +zRifH6L2?5_vdt4w;*=)|8z>q%%XOZnyGB#m;37_ThUpQcl$pn=p{BG<@}=@Wyg-I? +zpPnweVp#*|u_Ni(#ZjoeQM3}g1yF)L7`ao(e{9f~6UP^!rG +zNMvYn1x6(3EunBiod(a0uWuON+~}P*zNOY%e@1ha%{hgGNvM=}o0TM-5HMepiBlj- +zi25MlI#bLII2L;_xB4<;u;p9yOIz&3N7n_XNroHN(?PnNh(@OJ%F6PJiBjd%X_KZ-n>07dW`f=*Kbs%X|kutatPf|5Y)0(qv2g*OW;U +zru4;seH%Z0@n3!MUxyk0Wm0bi)%M>f5-c^$sKgo;md=CT7ZKJM5!M$G))x`h7ZKJM +z5%y0I5ylQ^Qvg_xQO$i(U|(Mp7}!CaqP^tP?rAf9?jBo}`BAO;tn$S!U +zV5-Ge%NEPSoUwcbSO^x7)ZolA3C%7<%Zj5lR1;t4k^C|_d+4_qGM0$jSSG38gaOK$ +zyfj3D24IB<8l-iXDtSmI!d-*#E0af-4UhLA?4_iJd=36}87-~}<{F^H +zl6=6xt%6V%WIXd9GDji$pz&EH+7Y60ivjBiFV(iRG=isrww0Z)uX?y1Es!qj3tewC +zi?cP4QXgsBb)^C-leNX0{Xcwtoe2*lLnAix>_}*Ep#6*uCqTKA$F?P=v;I7Qz#NKr +zBw&Y>MGGo1HKeidonUfR2yOETxy{-uXl+8T;u=D0qhYzVWdLG3z+VxhE}uhQ#UPn+ +zLdjqeX+ye(nJ=EN(>OkQULnaHG%q%~pJ?08&Q8{}w2Zk|($7~91|g)e#(f$J0ET`V +zNO8L}qVe%i!AoD05M2J;0Kw!CeUHHz +z=&`fqau7@`z!w-EB8PQJFr9Tr2W#q05dUf{K$cw&vvVLO2jeCQ6AIe;)OqKW0GW1< +zjnj22xlzcc% +z5o{0ROVyyKfnUoAz0olCMw4bJk(nHAct$z-gKTT~EJ@x0_2}qlf&&tweU@1-8PehT3u)`6mjo +zVDMB3au-xMBV-T4aFekG;#V=#z>*9*GMw0?r28iKw|jRFo;qj(uTBlG$e57mAebCr$j1VFy3Vcl3b&KB=O@ivKi)wC{`m`8Iy~;(z+$ +zfBNvB`l5dNqJH|Ke)^(*`l5dNqJI8Oqkj5upn8e`VrGDpkRRPV@O8xf%(cMeq{RF< +zBk@cF2e|=PL%nZcHfRk&USmKGat{?@2neG9OI4hRH2^9ASQ~QHQK@6COf)7KPPe$a +zl4yv8)L?gY^1SJZ?qioH)x`9G8Y3EZYl8j-rjVNY1p*Y5k<{VHNlb=h=q~@foNoJ5DQ%aXL-#DZ> +z;f8&PPIp#)r2b=Hjmf*o~yLI!KJo%+0V*%ZUXcP(K|19FB% +zu&iL(l>`(Ln6V5Q!Bq4%vySLrrIgzfak72G?Q)#imw6-HH%=1X!vasqjoX6_$+Frx +zOFZbfqk@Hc56NBzT9Mh2|3;Wz1;3Jee;9s=B|*T!Z+b#B`CY?LaSh4-E+>54p%5O8 +zo9KlH4+aT7MW38!$nXmQ(Y<>(Ulk(0P$l|tGtTs=J8>eXmY7S5d>kC$I4_` +zJAg~k-H1M^0C*2-eUtO(NFfGoiX3CJwhFn-2F2tpw8 +zC4zAP22ooS>70P58j(n4!oZpv=CmyGHu0=W;Ezx~_$^ +zX;>iD&9i*yk?QKJ=PszLpWQ&aoLe`Kd_K0CQPoQcL%t*(m|j=iFwfUiUFV%!ceZWw +z**-F$lrM;6Sul@0-r{STS62_SYnXMqk4%hAlPE!Yv%2~@O{q_p0WGTQnyMGnH@A%S +zBD2(!F-YFIH4El>rG{q7yP&0^$%m6|XvP=S(+|k2sv8>5YO1TLZ6PylGTv3)P~TiP +z+t)-!(=3sujpXmKUP`2ezPe_qv7rg5Ti1-_ZSvJEB=oAQHpbULyYdlo&i2+f(6=vW +zY4Ym*d1uwlt(#4VLYhE#^L%v;l#2DFSxbZEK^(|jZ*^TmJ&uZe>;tk@H#9Yk^%?Uf +zlUmT+0RPb$%6PTS_$0zr^L)+o8aOZZxu+!2v(o3B>ihYJ{y6&o1nb-3z9YT=Z_>mG +z6DqCsU#3jx^Z$J-KYjkcKL1}|{(qk*u+J0dkS5E0e?4Z%_BjCi9Dscez&;0Hp9An; +z)dBb|LjcS$P_pr~fS#RCj1)&909@PYej>azx`S9!B5b}SPn6I>GljY#sAOeYJx1_w +zslcv;C$%K(M@0;X&*a>YV#zqG1=FiTLvojeW2I%%0<7f1depr(2vtA^$`Zq9k%TsK +zhRCe+3r$Lbqy|V#lT@pm<>@8niXXHbixGg$>Qw~7So{D6L(ytslqOfM5aSQm1M0Yq +z$nk&;o~7i58<$5qlU%!$M4+scrXhd>j8Is%pxiQE0Hv5GO(N1a_{h-tOJP0Pr-IU{ +zS7MMgivG*i6IQ}JYnG=9-Y$Jki~_+F8W=`rO;{LQU`?lu8BLS$C3B{=^7jUmknU2z +z5veg7hn|YHCm^j08pptC0Exb#2%KPS>0x>SGQ4uJZlIT<(|3b=3b8BofT9%vepIfVv1AMvQ@{#8Y<3*llv8I9e^sc9H1 +zK*kl(4=P9j^%&mXppov24kQkl8|3H@)~ZdI?}Ys?>JNPOaDHp(W3+(p +zJIhS5k&}QF{ktfB5(@H)O?@kJLWP1M3hEn7;)aRPiU18#RK#EpMO(2fgD3|WRdo<^ +zEUqD(EADg$a4GH!%JgB_8DbZNMBMEKX*Rrk6&5cMq70BnTV-+t(R_1DEi8~8tV8al +zCqoW|sLW(QzAE*>iSBI(nUOKI$JCi=@mXmYvP;1m9|MDZP%TTXuazbr^ReUK_^Erhz^h8 +z(-uxyHEEo3rhp_G6rew1yx$JF$9%t~>W|YMH%0vcw`|5?GS0PP=yo!S#YoiIuPMvN +zCXgAnmUP>zGJ3KNNK0lsJhN@SF +zq;o{jW@*@{DY8k$X|xE>$|QSK*E*76&f+PM-e_W=KupeNhLp90dI(&LByT%VR+XPH&`9zsqd;y^(j!BXl#W>UZGA>0?u{=p?MlO9R +zS|iXMEM|*ZzZR;zNN)XjHsgLc8Y+^69OPUMMeW~}^1b*nrH5{*ik7ZpQwyn$h3b(A?sbc@Db_4<(E*qU)HTJqSfYp@*K< +zRZ|iXxib`vL1=&_0a*VgGXm2Guu>z%C`#>(e<>CLN<$PcM96{SMPv>@rs$?GTjKY6 +zH)u)6b(B?#Rf82DK)vIVH35~p)XX=HIgQ=AXUsY6nGiV@>crZo1^2`tG`q~&Pgu~9 +zI7SO;YlknO=s;l^0SzcxMAdH@ED#kC%i?jYkz$1%U=LbBeT1{pY7~XJ*&0UqVOgu+ +zl@i=y?L-A0`Dg76M#{Xb!qvbQqan@iz>(XF9?Q2PFX-4}fX2k73LhDwGI?lGW4qCC +zpa{Gh0LOyo(~SIJUK6;tSYHBp`%tkG&>VPlpA-v`+a0#B=K&pz0$(782V)(YxGI3r +zF;$p?d)XnA=w_NUwM@_^0fQ>TiJH%vn5t*@p_>*mAgdPFK +zF9(+C@C%2@18Op1D{qA_Z8*ST=y2o&AwW}+_#Yi&SzcQFD+TLC@`))CfYYc$lIa#H +z4@Bs8FxAU!iX(i4!Ia{2z(Npws_XA`13^I}3DQ3n_= +z=FRv8l7hT4<0_Y=BQnZ1A|z-xbLk(@j|VSX%%D(u$m@ygMc!dqN&d08hWe$OhtqOE +zJ0NhJ0#`6GYsNJJLhE8kG!6iKrfqd-Zux-snyerC?ZMH6X2ei)V{0meTZ#$Q6xYX; +zc!j9YVTOi7x(%uc8pe%#m)XkDrtGj4;f9T-4SGL}^WzuIk36n6O2fuYCThXD0^$0a +zakURqA?Oe!lg^%Lp_f4m8Bv6zn$y*Wa)qGm3t{pGnjzR>S-iT66E}?59%&K$Q{CLm +z%-JSdgFR3%E#SUa{R$BVprRtZ)i?m^fk8XYjscb8t|FBg&L=e1WTP${H3Tc6IK^+} +z2Erb_xha4_%!vY*VK69qnC9RSx^?W;@bB8VaVbV37?C*PY%E83YB9UMv$oDJi4g|c +zOs7&p9U_F>1-zfIOQo0@ji{0sM*aZt%Bt +zh=^IMf17WDu*JV1^i1f8-Z$)eD#mAx?`dE9(5t*?Fopmuf4r{Sl +zZtSZAO;Y!yu$j`Eg27zCC*WihSVcS~88Q~TTk9t#-7s20^bkPO8klv#Se?#+#Qc8D +zI;`LL6a=+o;>s9brlf$`2^56oKyz9Agb8;Z;~*s31|n=3pj(EXZO2AtcQsowL%Jptaf2%jrz27E^o<=+3FFIf +zJ_Rv#r$brg;Tk+vIo6$TEJ!D=hH?9QQp*zqXQ+63(fbIblgZ>@NIk=QEj02&trGdX +zEG$#^zI5uT(l{mB77l6c0`J$v7C(5~TrIM8TC6is_OcHXO +zMGB59E90*&D;sB)ftDvt64B;6F5qlmXh=hwHws_cywagxlNcRmlA`q%(FwW|E0s;p +zOSnyoYlk;!Zj%i`tPmAU(9YC`)gRV0;l3njVLU&($5=eeJ~qc;d7vyUum{r!5X>Jf +zUqs3z!{Tm6iRUIKJlgw8@roov@Rf+04W3}5c7#gX*Z5jWg=iF_H?nXp%mj|e2_6L^ +zQJ1uh<=zxe)ycAj@9CZJy-IYf0)ACCV^VRYzO(xMJ%z@?R +zy_KRwHLf{Cbm?1DkMK}U0Upe#VRDqxG6qD&66tG=Zm~;h=kI{3BQOYN2_c_iO=qUL +zIz_tZK`Jc7g^UN2H&gFt#(fezlsZN;Rd=1bcZhaTSVC&hTz&+vijYDSrg +z)5w8>az4;bj$JC`PZP>kI5-v>`Tpgb!ovA!?ca&|kc`Cj`>4fMOO|K?!NCYMS +zgPcwixE2Z<3t$bL}lrxtqg$`EwjMNL$_`!0W5l5(=0x59)Fh6$`3C +zz?$PGHXRTuEwavLV042N>Hd%sCBdB8^eSG?ey)}zse +z?K{1*G5o{cSZ?4~cI9yFE;H+mcp?5{k#NIouX?jLult +z$kIz-NT05SgH)9LYCMPzB^}p2C_-={zB}FedIcND&>`W*cH!dGCZu&D>UX9b_d5BjS;Bk +z@E#-DPJb1lgMVcLEm&#$b?g(a5_$j-+#`g}Q%YyhN*Ubz!t25SfEW$Ur&=o)285|1 +zkU=jnhYfz$vj3fDg*(HkigfoOCSO+(mFt48+{wBd>sPi^y+uhC7SXj-p|aVS8eRAN`y2#bI5zwj|X#4P}B*C=b +z2S@e)?Z*-S$sD6`Snuco|7l9aq?GzElPV|l;Xi#FKYjR5efUp(_)mTKPks1LeU)JT +z9{@oy;gpK|)FZrCANW%r_|rc>_){PH)4u}xli7f-ixSM6PZcNJDDHJi0I-Q^F@+5= +zh#xVt-M%ogLi0_)4n^a^s2@&CpcTciXmaO<&a5SZjZ;7afcffq1?3JUdQI&lHz?j% +z5dePasZ2Y@5Mf}UW%^)L;@UZML@kjl_Lv)#^s48m4J-Ik@*69+>*Z)KdL>^|oD;L2 +z^Bg<+l9a0GT+g-+a5{U8&C}*dHW<5y52F-xkE_9#f&LdlnZwCLUxqfacN9ZyOji{g +zRxB#0AZR(}7GWUPZvdL0>Z&8as4~EEjCa#1T +zmX#h!99288cSbhBH)YfhchjE8j9EveBKQ#uP45mpRp5T>Kp>*Hv4ez}1yz(UEX>E9 +zGR{(SeR4J(HHHs|X{9BV>!t`BNMtE)U)TtzQs$}R`#OvRKe9~rYigJblTbd*CN{N`+%Y-P-oqxY +zj)!Q%81M*tSZ4M%9g_z7;X5s8Y+1J2O>BuReFzD%=|odx85t_PAnmkR8_7*?#?m=d +zLY_9?ALeX~J9f-p;7y5&uY|&+UmO9fQ@Lhc3W<-zF&5N#W{jjsy`7v_CgohLs>P6FIO;=-#FEinj9R5zH?tMO0dj*6wk=#7kp{E66 +z;iw`EESAIyT0wZiu`>3BkRwb%FBPZL9<>*i_hN)2*hc;yqFQE*)rlm=xHBe7W9k55 +z=W`Y?g45hWa0of}>3fYZ6LzjEI)RM1;6vbh`<<#O32NPqs6COv)Kqf&RW+>0(H>~w +z#i(`Qbd3hELl$t59g!xhGDdbnlhpIHRTkrwA}lI8lL&AH4;vZ6VfD;U+`5>GfFVB= +zN5&k2&VunATodg^EYeyL3~-0HPHHj%A)Y-h5^G1ei~O4byUyky +zKlDoEptVsm17klS>Nj05zOfFNJgx`hGBw8@H3*|v*j8W@;3D7HE^at%*%5LWR7Dg{ +zm_>S`>di7dwiaMwU5`XD-Hc`X;5tMDOGzQ1xCaQ8rSq +z21Rn&Cy@ZEPq{E35RuXEjr;G+L +zGb4lv@$>*+NcI>z-_0V?=zZiV8TcNIg +zPD4hU!15+%VwoCBZt`0ODwN}a$>Q@Hg&I9FWY6Xn)*{n$iN%3`3*6LP-Bj1uvbf$m&u8YRuLTA)oe{wf +z^3zasXw?P;hmI@MT;O1DjG$?oJ}+X*%hr!2|Gxc(Th5{^DNUH3=<;QRMd +z4%y&TJ28f}X>VA=5zyD2vbd$Z$WUBgLUR(7Gg!xAZ<16X@HE5_TYihQ;CRhn3mI%l +zU@ah!h6bjll3VFac%*NV5;k_CIE`;$fVdQH5R5np&<3!4mlc(W^-exEd_vyL3t^bb +z(v2ee0n)&7N8umap^CC$i@;iLeF7<1w56s}NP=U+&Kc3e>!>X)^<^=g5QoMzcBLSk +zxF)4-?;@g@r!)m+T`#r4z4DHp62mg82GQpJ(He;T6$wsXQeW})xGCZ_G*EA#}Yg5+% +zc0)}oQtiumq-PFO>wgaR5P;_XjhVsL3{N$v9>P;}=b()XQ=a*CFcQ&A!y$hU7AxLH +za+7~D_2r}*=@iLtL=E>)2Z@?3L_`(tbEJrMTz|EeK1%jPTWp4f{^CYLvhAnBr9%fq +z5pE5KnYf;4%Xq(FI6Zc7(jsebwOHb4_Zry7UMg?a2s@<2RRn)`~z8IMAH +z5CPB;YE$8oqA4sYRQKvzi?9d*z5wkZq7Xt1CfphT#E9t_hTWZ9HN#4WeAwP_p(0Uw +zw!l_j15Yq#v}tKfD<{*1V)Z+NBH#RrFM{3GQ%~^#^4q6mpt-B3{Ev*{@11)|HNf$p +z0~4iq;FQMRD{NK@5J$mp802Sf?P+3oWIB_oHDHpc7x14R*peRV40Tu66je$-48j)C +zB{=9IV_^tT(}SboP~hNk%=}Fm3=eJ~3!WX!SIc03%2UG7WCriS(LbDg(FRD3DO}DR +zCCAschaInI0Xdctd9h)JcFP_~Ymm}p)J%!F)13(!O$OmL60IR69L!)wLTk7_wE=7n +z=_a%60WXWF)_olA)TsGVLGP4Rh9k|OKJ+rssI#$$;dlMnG%?u>{D^kA)F`oq=qMcH +z#S8_DAsk#!HG_}PA`tqy8YQY`NKD+KudmdrEux~?p{8#>K_4oj);r*#$N}Y9wad{=ntT4umy7OV2bTPT&+S8ulMoy*kAui@s(z80lQ&BKZ +zIZ=x@p%I%IgsS^kER~Qs;|_8mWrSr4u1lhN)hMj)82CDf_+ZuS5Nn%5M6qn;&Jd_h +z`bE`{2J9nDtN^xhaHpr=$$@3*g00EdlDn*|tQRh9%x__gj$oFAF;*$S{2bj$IB4|} +zAZZorSU8mEDNcd6$tb&kj~5~4xDtki-ZUyQG`*&X`6kRt0r65nY`xj1ws{HqDVB!i +zS;{X=uE(@r%I^AYE7e_*T1k_T40ojIDYIEWrKG3rGZs5|YVF+Ar)&(NHf3;~p0ilV +zZ0p>nK5I!sHT`MV-Vh3gkvg@NNuf6B%S^tO+CHVbwTHm#Tl=khsSk9=Cr^AXbp +z#d2P$Ep;Q69;F_R*}l}I9GY~$bVIeI2bun~Z?6Y|=)c;vqf#q|g)QyAHMA2^`AADt +z-HTv24pLje_x9i5ou64Ztlt?)j{G;fR;KVwQxv9STS_TYw3~BVv=f>F^&H!Fh;2K1 +zXloiohvO(L;WeqTL8(ueatkc^0}gDO5_pkPp4Ryp9tU78XKMQdH@xb^9}tt;y>!qkca<{^!SexPN|qU#e)BM%B0H5KK#dTT5C5?b +z|FIAMu@C?8{{jA^JpGh|OTp$deFjjxRO( +zrZaFXo~aoKgBY?2miTZxnLXB{i$V>bR`5BobP-cU8H}-sBq7EIOQ3)pF>1_(JwiwT +zJcq7-lr?dq4+h7?d|hy?$+Xy}7HXrFs(8>2uR=}K85Uk(Lu{t%3jN@mv_vSXiY1|> +zh>8MFD5=YfWkCTs^!H2Nm>g(VJkq>SfCyK$H6hj2HG8BMH9|;E=zpe+Ay%v&6k9+A +z7s3N+el+QGj;tl{mxvl%9EOsbbvRV?t9OKz1j|G+W@8kf@BpW_c_s?FuWT4dM#5ddgBkP +z0hI^jnIhmQ03{%uSc+`v7+n}mV2O)X&BeDc1{dP?D7#=BxKPbWVedDG=9-FP(O7Lo +ziYn1|hl*b;$SSB}gsdcZ@m1D8s}ip}^)au;)_3b*`A@R|*7Rw|C?%fc*li3i82I52;!%3;cw*CD=BH)7=dpzr0KYrjf?9^NtR><%9!EAvL@aI +z026Umqt8lsX*@CiRKOkEskF +zte*3`u(UkCqqkzHKL%YU2G0S)O!q-%&M5D^nTCyjbX +z-T_o7j9=oYWV&1t&1JF1D`;67%MD`qR)+;l%9<(7S!E$t +zr?FrwhDnNL{*+bJhbmZeAT1iVI0peimJrC5oC$}L?T`= +zglf5Q-SVYMb&V2ENK0VFP6pgSZefxhoZH)X*P`ld^KK6Cf^SQC4Gr(sH;k}&RM$|_ +z3kO={Hb}E>1S(kh0KZpkR=wBrteZ^^@g8+8Jb&4BFRtJBbV!>Jfb=;qLerdT={plE +zJ+{L&-4S#KrI&V2Xo~{J7MP4A8B^j6GD1|OIXXj{9iiu)v0}gaLd1sqH0hN(Q%_ahw&m|R8Nt_54 +zgD|6wnNMIxbTJRR2GEFpFv}*?@yt>{YanMjKwr~BUz5`SEmBI@AYi>Ahp~+I^Z<51 +ziND$P&5(IuD^F3YQ948Z(APNJ#)c*bp=vfZ$TVv&rOtrBBvk$C#TMm5XliI_sBW0+ +zOf|(uyB9BVX?0C;L%|lb8L^?$>wO-oX3yr-+%TtQk+&%gC%~M{3L9q5w;<5+Gw+1&YuL!CTK9wf_RZrWoP33!21b(Jz{ +zzOKFo$ZiiL6s$vm9gNpA!rOHVfD$c*K{!@x5!FFNe9&uDq;#*3)2$`_NGULqk+V); +zHnbTjoq=#N6c_aD)S64MwnE;S0xFsTE?~KKgJsa0Oth9q;o}hxMI65x19J`?0i6l6OC=5UGs(HeW^Nj=dB{?eophx@SsFRq +zMxMo!p905k +z>SZh9WQ~O6G^v-_X=xUwmneQLQA#$?hU3lYRWGcx&uq{c4fq?akCnnkw)KGY)pizU +z7P&z=s98yjr!HE~Q4M+(AfZoMn<@>rMQs?5CTYWMIO!+aZz5@fEy=Y9Cx1{68<)#m +zDClL=(nzQ11)pZLhi%370?)0LOEcF>@8M;>{}QAb^R#1ZQY3okw9 +zn9B+aHw+!R@z`T8KmPddo^ZmIBSu_NTzu7-F;|zAY#K9Wb7|={rKQ(-Jl9U1d}C$h +z^{1S2b7kdC)27`rZQ89fXWlkz)*Z8F-#%+rcWv#Rr=Nc3ym{N^&b_m-@$QzE@6Vrq +z&!R=!&pPV|XPSDTzTb{*Ijqr_rCYNJMOq+&6=NgcXw~wwr%_N +z?f2h*|HBVI{OF^PKK9sSPdxF&+O@kbyX+SmH$Hj!<-fe@s;4(?dghvIc3*$}b2s1o +z{LMH2=N)(addrqyZ{50g+qU1_d+&?)-uu!IfB4FS55D@~gZqB`#x85#vA0T{m(q}&NI&(c=p)?&pr417hZUG +z&z|>QeDM!2zx=_zeILH@#-Cn$?T>H0_11v{2lns(^ZW0=|K~sd`R%t4{{Hu$y#M~E +zfB3^^fBMtspM3Jk!Gm9rpHDyi@{2G2ia-DR_rL%BAI(DlK0hA#2lj$1?5CKSTSb8<#pOSx0ZA*EnD~0#HNPZa)yrCQ1tO$sY-i$aLMlX=bv6%)ql?Xilg7U +z^RAq?q{byVSwk;rD3a!9`wE|_RyO>0Q`epOxA?NRJT!8&GVr=vv-=gdYnx6l8a42m +ziX-mYFu(bduKo9QU9)b_&h7Q%-rf9GRn?m3Z|vW)@2$JH4aup!W#o7Ew{{ne&b@6$ +z*E@glcjwHxW#_%G?b&-(R@MN|lAYiCBKx;T+;?B%nyRaI)E}w +z-czvA^?2_4uY7gRlzzW0ANkdm;LK;1#Jg&4xv3?1LvhJbSx@}^_Mcz)*FU*DjWY}9 +z7Bm+1Ys&l4fb8dPo1Iq_9(iEa>Op(n>s~uJXaCxUF{N96SJgPux(w#?ksK`HR7fBx-a}} +z`8Zd;H0F`(sv-rQjYYZl6%Le|Wtj}6pxGrbN{8O8PYcCk_ +zhqtd8dFt|YH}sz`uPIvopS#u<*2SLN(~$r1=vQZ7GO7E#ZC|aP>0UEn`}v=3$liAB +zQ*-KcJ84qv +z*cDGqzUi*#pE$x*+3%#zuDl2Hlagy&`Ma-oyS|LvHEjOXzK7Ol?>}bruoI^@7Py`q +z|KaBop7`|Rv6`#s{hc*G*!#_N_EdTY4 +zFOD6%?XhQfT=vzh)<4cj?n@rMV?|APWbCOCvDKfyJ8Q!M*Q0losjH_v@w;bdR2{i~ +z^yo|8Y&zqF;=%K#$?LLxe>?8}s`G0%9oH}MT<~pMLpaUhy^SH~sIn +zUq?UdcjAhU7ms`8XYN^*?-zN0(mm~lU;gKW;qJ9xPRQPRZslEt?!Vmf-68i>-FsoK +zKmYlwI!Y4RKiNOHaKZbo=#Zz^6vlR)tvtNDsPV;3bFQme_m#iotuH+9xQ;%sCU40u6224H!R5ca_z@I9k!+W4-E_AE7#>*`pWI= +zs9DHZNTDNP^zAYVhfA^`Qc0BwG*ZVt*>+<$AmweoRK&g7QeCy6v4h(;$wxH|U +zFSZAw;&3Vh8%!<}+o_yxUWe>b`?XN%hqC2Z)e``_K>Bmg{!`-f&uHviDtR8i8 +z{NzW*j6N#otM+|=`z-H?QNH$B56{gjIcd#|z%6$j(IV#!y6M>QI|uHKW_MTnx+l#2 +z(o^L+sbXN!2S3{M#NHp?{N~AR{m-3Rcu%Zr)oCZcSv#aFCsKM>&P7`5Ksm9u@XVZ( +zmM*#TrJRCG)(`gIUR2!u(LVQ!n??+5AKta_z|>O)gpM3Nuw!ste&XzwO;7LMG<5z4 +z+2yOU*Ebdii+8R4;s-yy`^JGgzkl?VImd7KX;s#Bb;S?7^>&T)Uq8EW>os@0{;X@{ +z8K<9KF~^--|8n8pl3D$4EV-+2Se10v%Cqixbm3FW-rRgc|E>2FOgV6mdthzLtQWdp +z{O|D#AN={oJ=6QG+V|9)Kl!rvbl1Gw?TWq~UUf|5tM|`)e(7CrE?M(XVb|ruc8-2M +z?+t0k8#&uYow{@3-#`9ji=6K|dd&s9CJnp;5nCH^!55_CwbnbAH{_@2suA +zan`goW3qEMygbjy`yMa6XWgQP +z6My)-(O;IXIpS|w*Z$$k*~k3xoI5(Q7hV-BIJ2g{YQf^Mq5BSe=6Pmx!TPBsacRR% +z-npR*_7-_Y7vxu!&l%a3_5LfLZ(Ue1`^1B;tp7e@_>(^$xMtvUYvy(Rr7Q0TAJ%W1 +z*4A~xL|@hmq1uDTH03S&ub(W<`pYF%Mc%9*6+iuj +zXKb+kD0%HyR~D4K(*Nv}W;I=vbA8+M=g)lX*opaTfBT95z?tjv8j73u%d>v7<9C1e +zt$c35BOiWv)yc09m|U^6-!ZNcQ;YhKnL42;Sn$AUM~#1P_PE&I*FI{#^OwW79C`7I +z;=exj*^M8(Hg4*u*Pc_}7&EV7*`qbn4_;9CNw#+4giG)F{)$IkkDPG#dw<(Af6Bh6 +zYiG&%m)`ey-m?>m*T%*#?mG2@zdm*IzWjBr{_gz;Dt${{-+bx^u9>m5C$-Ci=HAow +z!tlXcTr-XIp@)Q=fS$x9hh%uN(HW?CP)1u6SD-(7if7dQi>p +zmMnIkv-;P^t{AiHqlbTd|ApgSle-H>@2SW+!PPZrdSymp*x$w>$D)+%|$W#23K +z;|F_RzU}GdliNmrdhxQm-`V_^&YwJg@_XfPuXLT$-8gvPm(%VaH#&b-e8X`?(o40H +z|NSFAI`XBBA3c1N`nTFMU;Q6-sx<6)*Z#fz+*QY1y5!GqR_(uHMAqzO!?sR5d(q!s +zzWnx|KHc`a+xoTL=50&PE;+LD-u0C`|8(60W8eHvcFAKU>kec+a>{`Z>;L=lN8NvZ +zDX{aAF*_E#nNziO!QCU~oVwNZ;^Zs7Sl*N%TF>!ilzKfABxdj+#s-t}z5 +zpAI}f>cl%=x$Gj>?nS?GEi71n>i$QruP#`1-EUm2>kI1kj34Qh|2Ss#>uneB`uw;v +zFYEXHNhe=;O2NiWxeK~;ul-`p$bf&){G4016*lh5sX7qfUbFhhGwW~2J?rOkmiNXy +zAWvax%j?u1*3@L0mtErCP`PN``cwLSHDqftyJFSms`wk% +zR%Wlc^s!f?B~vauvTJ$OKBJBME}#Fcg0oo8RUBkQS2E>}U-J-bVa +z*3_Tta^*-%}BFi=4@v#NktV$||0Mva|#)X_IxQhL)vLr)yOKkIl`)}ZRrK`*x7 +zu-7%>VAja)2`fLDSadLJ#GcC^{^a7ktp2}H3fJx#KDg_`<+&5D>bT{SeM?Sy>87}L +z%asdb_dOe4^H^2Z&WrN9h8(-MeCv-29>3?z6~1K;eK{pQb=Kxj7oD`LxFS?=)sF9c +zqRB6;3m=&bcWfIi?O5dAe8LgCa*z6IiJTa)tb1Ww?I*__wPVT+8wz8a68(n^y!GYV +zUY|VY-YH|V8?SlvzuYIwO}XpNO?-aatd3J3zaeMY_lp|k{$GSzf^yk%=PeK6#--@bg?fU{#~#;%R;$;lgdOK#O2 +z=T;BMSu?%x>;(_Jb9{D{%OAUT+?ILklcCP;tn7W~`-Uznyd+C$x_wku|A9NZ@4hxK +z@XT!=tqi=d@woA^iL<8_U41a8^W%bhuf5`m&u=Zro>$Pl?5JIN^|5X9-}0=N`hEAy +zk~hB$Jv-J_DJ?$g!JPa}w<=4oS^n6>x8A+;z*Ex(P0Vh|Eqto$u5lla|Eg&DfE7Pz +z`~2uzuWO$ClVaEOQwsZCbJ?q3UYRqhAW_w?;NYa?dAII}dmpOq_me4w>#Dx*$;unJ +z|GJ{CJolY9-SWZlPwbkuW5mQoqg(}z6E`fn`>4viIcsvpO`DP3m8ZCJ##S{x_jyI< +z(-lLOWLGr~m>$~rvs;SR74-l02iyDY&AXs+z*z_TO)cm*enteQ^32wXZyo?d^Z_J@;R+ +zskpxCZr69WPbqGn{NRAQZrQPR%hA!soPnF}FZf9v=SjuzAvs +zqROg%m3hAXIk8O-S6$!_@6VZj$?&Ef10s6{1fLsl`lg(czwVfKT+z&u+?p!)!0xTf +z_T)708Ib#5KVJIyBjMK{iT?GG{~b}_n*I;H<63?k?SDoB{b9eO2mBYX_FCSH5L}oeyB1-=*&n?GY-wP>{gcDAr~qqy_~dBP5G~aC>MlEMd799i%|7^y1ln3bYmWyYaAO`El&Xiv8h(zolCC_hACJz~6_4 +z*iuV>ITV~0b}C3U3X$eLt>ia=$ijsCLjK92CfTP^2 +z5g0HlUiRBciNjX+9$Cd3jB^Le}R%6l%@@hH8&{GJz>snP=zK*?--vHI3S|vFM +zI3GAA@|Qsca$GZbl>mP)j3f#9C*hS`ZKF^OW%*~RNhu&l^%2PWoQ+{1MOE@v<3XHr +zJQ;;akOp#erKFO##PfwFiFP>w30RP4qOop05_u1Ks+H&lFcet|hFWQ^ixig0E^miV +z0RlQKPMM7f1`5RhH6=(XL-Ws+#7dZ@@oHRT4-Q+A1MTcn4?dG`eIaQMftvgeAR(*Y +z90HIE=mhA8$TJ2>>4@@y4DhY-ZuZ(v86X_kEGe`Kd9bdoS%MU7in#)xP&Aja{FZjb +zfC)BmA!PIWj3JX@8bt!q-izobDqU5mi +z!^Y0fmo+T9I=QSue}%Y{xdIJsxf0Fck*bq%TohP7m@^p=bW>^5jiFORM}}Ulcg28! +z)MPw>WxN#5Is8e&Ke*M&UP+-MSs1c{ZAw{GNt81}YTS^5*xq=`&w(}w_W`?_j?z3# +zU4@5Mx*E@`nWQ4tEMzlh)8+|A=S-+5Z&qUE6DlfBInNxmYY+CZ09LIU)&B95%POTN +zB~0XuLi#o9chI&PxK9%*<#N4}7tOGFre0ZLlnzGzWZZ7oxGq9S*nzwZIl0J9y*aZa +z+GeFq*G)=<^i203jeia*{-j>I2C4^;Dba;S35bc>?79kx5`?}mE}O0q21A$Tq*JLi +z)CqNj;|dTb2r}DvEgB85-UWX*JIl}%Q7ZIrq-e2N^>j=ivcSah)01Iffyo)M0NVk< +z5Uipy^#BVKIyg^Xk9=3vFiHcH2l2m+K6Zfg +z#4HOh3|rJnt&O26gKeXtZ**eA#I+C{nz5+B#6b@Gh0Ew<{AV`pN)jP;3Yu#njX=(k +zCpUbwlKn2(mWso8a4VPOKIIfe1?V6$Rkkexj0zpsA(#4EkO@f}OMz@|63GTH6qoYA +zodIVZBVmdA+-A>m7;bh(l{V4)Fd~_7o98@^K{=)A3p-R^mrCa^%stAJL;41zVVA)5 +z6Y)ubGjcL3xMIQdumh$V+QODyRdAJGFbi^E6lI4dBX{Pu7=V1B;Fza$P%cGkfcP?U +zBghLyJ3=DEFFg1F-Qlbt=4~;x^_Nem)NDq~STF2?luf*Z3ogtSV%o&Q0M(I^r6}Vc +z*y))-Uc%8%XrW|D*k#9}^C-g3<}Nb|POntdU}R(|A(qkFA=`kZ6mCb>!h07DT^H*W +zoC*BAX9H#d4Ni7|CIG3v6zgCiR(CQRj{*RA(z{tVXvqeL5gxBG| +zU3_z6b9fJEU)dL`6z@U~DdNq~nW{yXF9y9@m3;))1o(9(<1rvUH-Khhe~sp3hnZ%> +z)L^EwRyZE(u_E350rFW-L?sZoF;}=k!B%KZ%6P|?u^=0>!d5aK7LnZe{nkE|h4m@K +zkQhto8C{4VJ4~|U<`uIHv3=Q25Vvun7_4d3*{GV#JZ;5{u>|ZS+)}_Fii6OCfvHP` +zG5;a~(f|lY?B24N-C@|JdA=yLBbGE4hph;^p`kB7G-6&j5sN2{)@&Ru^iYa69sFL8 +zJOZ>9FScyq=Po~O%sRszX@Dk)b;UAlGqDi}b^z?LYz4eE=Fw{yzd-(?VhJ-9>`L~s +z64+rhzoD^y3GPAG^1PWMiPRC4es1HEBRKiWdnoYUR_9%vY;fHN)(A(#Dc}fs5mmuT +z*u=av>QvfPAdOLWr|jW3N*MWYG)lZ5JJDnMMTgBSTa+={`r=00hlmNVU^`>16>+vZ +zG_G_IJ!EG>;r$0SbR^RW*c-qpn7t5;jY|-KVGO5PrB*+9;)|7`RzkCxfB>KKO}6(S +zEcG0?;nEVbZ_c<3Y0Fk)IFol8GiIbK9qtUKvXL@?UW7H&YR+B2o~cb&m%*lHVi4#T +z(7nP&X!`Uiet630b07Rk5V{{o_gH&+8NtR~1T6#9-Tn+njj*&nM6gKkt!j0fjOE~0 +zzVRCJz`|soiLx4~8g!7h9SLhd47n;1cPU#*3juTlgh|~=BDS!h&~hFpJV63%KO9*UFT +z$sq=OD_e)QHP{!60%b-i8p!U9E)bT|QdQD4S|ygl*iO+1G`5M{K&qpl5EfhxS|;S4*4` +zD|5Ui-x31OaNGhXWe^9Vq*BbVm>v=uqL9FXVSzEHgTliPikvlWlN3QO%4c__li5^z +zELt0?sP@i+XTS!JYt|pS<>8_RHHA)iHqmSH+Y{r~TKoYL-4Gft0VL_^1Hi#K6JGN>-bH&ymgmejKx&uZu3G6fg_(rm6 +zlgj`F$#m$WKv@JrV6zhhbx;8!(euL-#cCFufUqxkA~g5QW>Q&_8nUvvoue6Lbtb_m +zu!n6Bly(byJ;qkWKx{5;jkIN9YaY}VwNO}UUtVbeY-lue!uB!}CfTE)u_tMOWG-Hv +zW`oJniW0yEFJ_xWC<+yL9nf3eEmZ^oItGvw`jzIe-$4FU8Rd>b@^*(7yQQym+Y*i0_XcbxZ9tW#LEljY*Y(h> +z>8J?`;Xy2EN=Peu@Jo3f=5kVvyero5v5t}PH`@ZZ`e=p(a`~!Nt9Vj>(2YbnmIWr+ +zJPK-~o&yf9G&_N04&z$IDWZL?;uZ(RIJnJ;EYk4dh7LfRVG!8F05_e;urCDp-Zn6? +z;bp0Pn9*z(xTQ3w7*vaR#kHBX^NUEeBqV$QF&&NT3|B3up8Wtd7#ODUH>iWn7;-&C +zXAp(w!oEm<1it4c+p_h{?=G~O`Tb>+nBYh}X%(V5yow;EGkgQA;JJ{>(oBhYZlfjK +z3%!rW$(ApcFkEY)@x(V`38QU2TLEC7$JO#3CafY{9=@!VMKb|h{a~bvN&JK2=hQ(3 +zCjdXrMeGy|F@bHbgGGfZR4`@e3-^nrv3pz=S7sR3YXFbU~x{dB+JeoV*ILBLd)XC=Xqb?R5^ywzo +z9B^9#K3-6|sK#QEuM)LbgpM-Pn>oD7*`i>7(Dr%Y-YjCtEN=Fi#(<5R(<@p>g?bj| +zTqv1>XtM|GKW7PI8ZJA?3CK(h3@kuehQ;+j*p9Bkx6y>~PAfP*EY-k7MzVL1dQdZn +z)**Qk7ie=bWhMsEXh=3-tD9INH_9k_gBCv8l_3AV91ORG(iffGlJv|@=g5EyY_SwE +z^< +zhKC&Yvr+Q}V<0y$=eiTlt?LN-vMCo~UUD>+9!!Vy^o9?vi33trFi^CUOHiaF(RYMm +zL?qMw+*Hj@nV@)$Hs#8+U{k6h2FnWluiFOMMc8N`R5_j72klcH+Q+D@s)3jZ(?{)t +z@_Y)||0rSo7S=HU{(EJ0MWxgJClngRe;<+0sQu5V{m=gZ{?n+{YUsMXJ?)z7Ha +zYUC=S$!TL4L`C~op2@7F_N_ajSnn*BInYHGmNK!*ha*WQjKNFgF@_xEsgCKTqR +z!RgME%BE8&#|P7(4htOQz#A$7agD7EiXcHhM_y;?WItoNKo8A|UC_9+EFN2F8mzG? +z#+r6!ydGWSBH^MSJ}b!ISRL*lJs<=kbQ;0ATIErYM8r@iPlFCJHKPSn;Yt%-4jK&^ +zh~hm#U5PAKCNh?HrNk+_V96r%PSQZ6K#dbiAcR#4!XZbvw%y=>M}xy2 +za&xscR+?rC)vhp#X^;*O`cWLO^5l3vIuI&=O4?vX()d6bP5eat&(&X?Kc^SBh91|m1>8xxYDRECwFeuUy8|F}VYR&JMy{S&w!8|_HtUn%h7RP!8@DiW7sNBfX +z42~3mY{QGeFebvd%m4{cRT+qZunzmeQe9tSrV&7d>V>gmz3WN?_6i_^!NOpR2kv%V +zW&r0J76oGyKzNMK`vgk{b$W1_v0`kXSYgXbMq+4BWE+0c(2=vIw}t2M`U8aT#wZV$ +z@`_h--Dxx=psfz^8pCN*4JfXLF#*xDhb_ARwle_O9ACE%`j8u8}mJ+QC&`yWI^lU&ge27rw-Pg?lm1Iv)Sf5U?DoLpwO)_eQ +zHKN}nS9Fqw1-cdi0WH$Z8rzx;cO-kYZD8y4JC`K`<9n(K{*7Gp_s(}4~1>gO5Wx)%1^8!(nN +zv@UE~+G?;A&2^2f2OCZEjk?Bzjr|)M=LJ0V2Q6u?Z)q`_nvI6VOBOZM&kGn0jdK?* +zo!8K~z?j4GH8!;xiy9U;w6a25n+&Ls7u8VD^3C@wu5X^Zko~Ni)3B(a_27UpzoE4e +z%AC&%tuvO?HMcg*UAm~Q*;ul)c}Y`CJ*$46r?IKAp>cjQtEGN%ePb&-B^p^(M*V^8 +zhtaaIZqXvFs%|N3eKWRiZqt&3n;RA^Y&8}(Et*%~+~S#2&stVDXHh*>#X2>2QC-90 +zfHALbaovJ?%+myGl3VpN{Q*AdM$mk{d& +z^#eD&FovRl9#W(SZm}4X!aQ;}15;ViMzVoqh4ezT;1c8M38z0J0)^0wL0(l`>Ij1IVu+TLw1`M1h4-P~g^b6nJB;Y&=8o +zv(zkVzJzV}@WxB|kTx|~f`Y?`ddwrp3qu6!$Z`oPyCEc#WJ#P5uFE~1j<6Mr5V)h6 +zLQhsMxP|)!V}aNXwipqzl=-pV+Muzl8wLhqOQ;qggdUA7G+f4{$QO)+u=WDlg0MWY +z9CjwM4rLq*n_{Do!#u1o4*m=>Yct)0tp$YxW5(F7V~aiD=|Isn>O};YF6b9xoftKw +zmp$xBW)rBZ!Ppt#Bc-gb)!^3&sWAE2XZn%`V??@>(jOOd_W;a#Kuj}0ZN|X+f0-j- +zibsRO1`Q3W2sN#aSW%{hs~T_%!ybuGtlfE_JD6Eg3fWp1d0e$3 +z90F`4)~Q$;6;YNBojgdgke3!nbxHNCx^$#FmN9Ww7%i-})55U!7L`CT7&sJ@!$`-& +z{b=!y3b&E*Tfb5zj^jpz+X@qDEPd +zm9m*pV&rIOQDQu@L9m3d!~b1zV_F?kXW520%jqH`gAz#}9VRkJ8sYQ;zSaX5@0<`o +z0*jOO4nOSdfr~8e0|&ktputnS$iqSH@kr7w13Dx|nJ1+%kNkwYl+R{H}py^2CvWN>DbY_rnRa@6&vdFyIV~ +z%Yyn=^2TwLHWv}^Ir|}N*St&ej$+#E0?1*2{07fnustEKUU`=)m>H)V6!lc2bZ+56 +z9109TfkvQLXyI1y4tInjD+SM)Ovk!nz(&Y!3yAw( +z;dkFG+d>d*Ez_R@mJUzxJ_X}XJ(9KA#ulbBUq`_ZAeoMWLt2tYGSJ6bcTp3U@StZI +zjXU7c+mvAz;ekWT%6c-gYCT@0ZNcc$9jPy6viTAe943f +zOj-IMeh?sSpu@4^Px1=A0&rd-$#XWzqXnm9EK)Cb%%eMq1Tseq>NsN~1K4t7@qu&8 +zIzdF$mrSozRHZ515zDy78nesu=+dam^qiMQqJCChxLOTCi4vID)WFPma#aa34`Ns}H}^nGcfRA| +z9WG~dES*u~U`fQ3aI>jcM#GVz$|uZiYMd|XwO5eio9dxT3<>WptoHD#i|7`x{MpEh +z0pg(V2AVEt*y;`oHq~szvk;*xEds8{H%fMj2v(uI7`Ip^TtKpr^C$U2MhFHbAEU3J +zq&f}BU6GrpM4V^r5RhO#`H~~TnHUI3fsR|A#}WL+`Pv!&#RpeS#JkTc+y&kQBi6as +zkn`SI1)gsO3#UV@Q1P}D&I(|hwQUP5FXrNs2|1b^o~Jt#&}U- +za|zfc@O{3LuNNF9SldXsY^0TJa^(d>T|Wo47;y~0B82l&} +z$;QJxj7d_P&Iq4Qd$Y69O^T1KuH5K?&JK(ghvZ67Uc3VWx24Kb05>_L7-fgZF2dzY +zKZcfwkY_T)i6)((kgVb;V%$Uyzb-Cc9_P(R48O)T$1;f9Y4&6(Y#0g(fPdCl41ThD +zP%@VUc@G8ZSZT_uZ3=|0gfhg(g>g~t3)1kZZ+=fPPZUkE>%Py+yW{nH%tX`=rKe4G +zHe&!AG38QXg-|MC&ULA4sRmPE32xmVkZeLUS-A0B;OVu)CU`xCU=+ONnVwX+H*d#X +z;6nVKJew;gHNLeE3EY|*lNo+#Lc*_ue;I?I3myS|B|x@-S9C`np&J{mvko&7CahN- +zTuDxeb~5C<(8IZ#dq)~fXgs_i=ajnP&IxJ!4q-OQ9omGRY;_0R$fSRKvD9s +z%DBIhaG9YNAwBcf&o^Zdw&XqSyV3RTY4!vd_2zYSy;w1=u +zV1SYuY}2s*fC5|1ypQ^wi*$u6#Dn{&gWbv#36AbUvA=0&;X;ygN%DBwNB&{oGuRhX +z+`VfJH(KF<+mX))yM;_p8)(}I$T`H+vg}ByoQsFsg#FSFSA9FzkE5sQRy^HF6afRmpw@(GZs%+t!Yi?1AuAF_1sdec3YP4OrA78mXFwl4RZl9>`3*LzNVHF7X&o +zTJuY-+`{mfP{Ik^YuaiYfSSgWAQWO%w6h^>2gI3L<0wz@a&I}i3$Y +zL1+!-4hBohX9Ha*W#4A7KY9{RF)T3q`DFv^6Y4CW3pSOOyx-fDtN@|}(pmDE;Rckj +zZP7wq>Vo<5LQ7EC(Ri=)gxQ!tAw)2}>2RMHRi2On)z(}D&dP%@Z6;str2Mwu=RD#* +z2a1@q#0u7^rc*zwcZ193xg3Gxf$OXbV3H>+`_0zVs^L|Jd559d;wr4E$^*tS_%pYq +zg_Pz(=D<}Qc+QdFij#bHP{1BV{81@mB#TQE6}SYB8DImSwlatg%g+ms5aZxDX$6E}(37_p><@LoaS>22 +z^xH)y=@Fxc>P$?)2wd|x#Z|k%O%ee_UZh$&auPD(Y?J<0;IuYtLma(0>^Oepp +zkkceOFQYMw-Q@cP^9W_K-gp<9Y}pvglIeJKyjO_16jZj9^DC{8T6lwEk=20uBtyu$ +z?OVRwgP_UmHQ*h4bOdE~KZ2iV4-UVzMj}YEeBrTSCgU%#%GS!D>#L)X@t94$qGDuD +zDwH>@t#|w|RaM+6Ij#xit&TYD?F7RGFA|R$y!v@S2G~V|D-2ZBxQDgtA_c|F +zkiZeRJ;N)*0edt)5vU}~*JFl-s07NUdj+G;YC%Lq^HqIx7RLKM959)SSHQ427NPZo +zKy)f(rcMAm049%hoHM8tRg&E?J$Svvo-b7T*SQR^AaOAX+372$_H{=!8p++Dn%z +z^OS2NFr^Oql5imS +zB*&&<7%O&UP^- +zUr^ubmxu)6Y$gdL0}bmuQ4_k$m4K>kVD+ObOu!ru=xJY!-Tsr@fj+OPpR3+VGrtmy +zEjPiEY^~D(64_cAvL5f&MCGs<9j<1J9w&4>H%g*N7`aB5B6MxiB-eUgB&Nao$&dKnF7gxe5cXq5G^oc3E{Ghq`wXYnxqK?3rvyOZiES=iT>w`dGOfA +zA)xWo8Y;fMZyH@zR+x4^+Yo$qDwoX$acw`AEsnCZhwxiTH5Zl^ym<5~k&ilKb0R0` +zVE#eRQjW=Ow-Ln^Pd1d63?5C>M@6vLoO!gZWxc;Gu|z~P1xF_b(w$q93VoO@%77&< +z{GPDBsd3fe_-TmwJd^|Ju0%()rnJ({JsL*MTwJYiZRQK<*i=}H*qbj+oEJ>~$#VK}4EG@k9Neq5&gv=%vuFIMPLo7}XI~_+GRkU0M(nW2N +z9Vu~ETcSt&kO8Lo2p0#)%lq +zjtU&06v8IVgYXftOxCso#mGSL8MLs4vkxzYY-iKYR5+G~4JNk?V}^uuK^U#sV!=rJ +zcRUTdVJs8ZUDYR`2V-q&cfLn)3%Sq|BeE=OFRPi)Ds!I;dL`I{&iuR;Upgy1ySCByY +z2o2H}xWuH{RRI*GFiBq9^mzSjaJ9WW7+I6piTVU>-tJaAcYrcCV~Y!61#V!r`|#u; +z8&73#g{l7I)5ruEwn*}bcJ17QiE5J#AH$YnEY27l +z#+DD-=?8EsSkBJ8@fhX}1|d^0h|kLTLsG9fbCk>K^a%pOrk&5&6V?Q|4N5B7*Uqr4JyQY9pS +z13boflnuC#M1&OwT3*?O6i@ +zxn7fm6a!Z>j4(w6Am0N5X52T*Dri4zAtph6`OnTEEdU>O_0zIKQLdX@o`ffHD@YGjuS`Kp7X~ +zGx1ufHIVDB(mjSxDsmagNtK?Kxg)ZumBD?<=u;h=Dt^L>&BbU8?qM{rPhdE}Rj{LRpYT#hvl|oo +zlZ=pg(Q1jhiZY$J5J1PB*bstBE3%O32EKW^kA%yK|tlpekV2ibc8G +z2s_^D_Q6ptXb;L9RD&QPdjh&p+tq=jt++jGhL_!8%Y%1*TsmpE4&ec=mk5dYxg-uE +zC3CVe;Gm@Bw;sxh+*cYnWO7Bt+ZWm|%c^-?G2!lx<>*R1ygK2smfp@a!RMgoA1i68WIxXFgu +z<+FngsRgH=kX2yxDR#f)PF-o44Tia_hn=jRa5M_iAj2nX?Ka~nI8&XjHLQn>Zml#k +zaD`wK!J3pXGv(-d-GVPrS|6J~= +z;r3cA1GUK#QF3+!65mDqCU-~DwcjGS-PTLP0pK^Gt|YtQ@UuX27#?$jQ_kd6jwg|Tp3r(*KhNkWltO!QJ>#^YW +zf7EJEF)@F1RH?T!I@VaVek`UHjSAW95Uw&7*jzuqzPY{`RDT5v(aaoeLktXm +zJ1@iw^|+Mbp0lOC`M~<-_Qtx!_3V=8DK5^FY;JSIl2%Ga-2g9c#kRZF2%vmk-IkLN +zGIS!KnR{A(!zDL+iiUNC$0KP$m_*a(&(mv_GM37d#LJTY3^xy4LV= +z2?8=P-hi>1?T})Spuo1k&XMH>?_BAMM5&)8S&i*%k*Ybz5@%5Ua%N0mS_t=bun4or$b)c^JhqW31d)koyQ1 +zdIxKP%pyoolohBI%Vh1Ml>c@7Z_QYU;J>Fy`0vU}qoT5=B2-ho&nW!&$b9nRf7@>n +zTU1A3{O{^1)m2lS@jt7pt48s^0AxU$zenOTivK-||2>NTJ&OPRUyA=d8VU4&76_b^ +zAPx6>K=k)f@b6LZ?=1lT9!3BD>Y{(!6_|2oL*a6F3za2*kc)T{bznE3$%sU65~4*4 +z5{h`3MzT}cwhJwQTvlGq0zpGJgCk8S($eNcZ6Al4#0LJ0G4x+|-okhvj>P%ctk+{?() +zePQ9v49ymt_s2c4OWn=fniF*83hKsgI$>V|1x8p5E&UsyAsFP)qH#7O5R_M7zzK03 +zcm0I%XDy{+R|q3yAgP=U-KQym7UJ-3Q8L2M6>a*sF#$~y_DoNm(m+B~1dq@l?S*O*ZPeWGz}wH%-b#AgFeuFJ&gUfFpkR~M2FW=^$* +z2lgZh<<4sOoHJBo$g3YtihnbgC~(K1TP@HJk;L$^Gco}4Vr^=705~HFS_FWeqtY}@ +zC~bc@cf(QXln-TT)@PuPLz5C}8Z<&$vQa4jUB}AM#zC5T$+g7B5%aK)NSIu{c%XV+ +zN-TY+u_)1M+&we6YdX3sfXvvJ(ZMAT7VjlMUf2*sh`n=3@syRr@{iRHTX)E +zctXO|#ssc}4hZScA^;hn`G|?5Y{n%p4&}oZc*Uf0b|&@?1E4~ur?F%ZmA4Y{4wQVfU(tfFFUAT$_hp(w?zV^c +zSq19S7D@o@kJ}W-d=1Hf$DDd=F7vCED`nOim`_V!cRYO__#` +zLpq$W;?ic=j_J9#e49JM@|6=pmMZ2pxV$0>ID)xI6E0dPH?*oB3q%WcogApd0%`2zt`nLlAJOF*iDc;r^whwm +z8;=vxf#CUVp3chAISVFCXxpO9sFm9^`CZ6R2Gl6C=Go +zCHZddA@R}UR~$FBiMnNG?w{6}4jwC0;sro~@(>YGU(!67(O}0L6plfTIqv8` +zH*U&1tOHBlc#477mVP#j)DqI%Pwb1xO-i#VE}fjQaQJR&0vrhrrK(l1PE+42_hAiA3)_Ely- +z+AXC+n*M0+;f5}@lgD$w!VSOLS(Z%slyG#z*Cv@-x&fnM8^8a{JX +zhMX>ktnZp2o<}Sov~1#%%rv^UN)S>}3VUEzmkIn*d$bHd*>G^)(Ij=r!F7wr4&-=U +z-y)*DLwUa3cm&vZzdd@}-kO@kO*P^atGjA=WL+tHRhu#QZn5d|O@2<=O|z<+t70HB +z!pzsL?KDLhljUF_1duD2onrl1CW;i)y2nW`Xt5PTvz;Cly%}Ihq*ir?Iu5a+QC%j8 +zATM|x^X4nDJ4$WIAO~T6M1fKe&vPSAo9dP*z{n;t$tr&{hY01Ho}E%lc$ +zkz6{f>)Wjup;lE)7u}A*TQ-?RU`oC*VNyg57{%Ve +zFpdV*1Cs>SLQV;a9tqMd24t9y2A$a>ATB_l#lpBaA^Z&sv1b!jnnEv`I6WXRK+MbEg-tu7Ld}r`e5(R^!UX +zbnrteNO0a^-Q*#4W4xuYJPan-&6wO^UblI7UgZ-Jt{ic@#cSaZ8CwQLa*I!ba^(Ki +zec}F1y`Jl~Z-rzms1ngqGlGuM>k6*{n0nUOGRi1OH)AvfL>B^sacv>VPiPS!Q6=1B +zD2ofdoQ6>_4xJcHM_~+>YgUoE!2n5o3h06)te&u;6840WJQEB>p`Bz}k#K5IBZ&zI +zDe-U{#qc0iU3y12_(Gu$5P%4(ga^?JEw$kTd$Ir)GdM%-x~Pj7$7Y2rqZUB<0y$0E +zC1_GhER&n5xfs9_vLT0Hq|(B1w!otOgat;;4UlkyC`7I~i9j|)v8y~;Fx&!b7_T-Y +zi5S#^OZ1cuCn;10J5J@+YZtwsrn@%|RAlV6r +z+kvOtyPyxk#Vhx;8|0}3k#-9V2L<8ma~63LK!8`feefZ$^;Q#c@P-UfPB|#O{S24 +znD}-WuAvGV&EXh@tl&Muv7?KPkTWMF0;rWm(8Yj6d>_nk<{bbCXIaQ#81NT;!C-LE +ziZvk98jG6ShcMVdib#mjZbZlQwzlZrsE)DC;` +zBI!lz3M7v*0JziS$Yw8}cXxBIOWfKyo|m+-~JgTL-?#m-j(#N1Ri#@@!a^TWjNnoDZy +z6!xS`Dt=yx!>CY+qSN_%t2>M7Q9E-}N_mDfdX1-CE46X4HYT-DQytzcwx90lrFL3= +zbxTK-Dup1fZf_Nc8w{%j{!oRqtkqoxt +zp9}3SxvO*b^e8f%9ghLQ;i~qL;BX=KwW=nxPfhjoQE<2+`{c!cljccVUPod4x610u +zsnZd`9u#M)BW9@!v-A-$wD@M)BYNyYS!KQM|l5AY7pZFp32?iUqd? +zSa73IaIR>K1pg+vgOSC61G#bwc^qOhbQ@&#-0(po2_z`T)R;SpCfG&Z%EpDwbf0u( +z^aw*fv=b0MjX|T%fI^j%V@w2$05rLn)kEc?$puuad?P)Xr0`4Sz;Zo3*#yL<;i>|@ +zk;p#Y!kk+48Y@T@^OC_{E8JmaFv>2uWI!J=xC+GI;V1(J$ZKP9aIoVa$2>4P2Z`PudMQPcWJp*tb|@G}4b@04Pi+Hggdl9}fYLLAc>`7n=f+ +zIj8~%?T@^z7)ZH24KzmS5djLJSGJMo@O%*SAOS&(tZWKeYCLsMf>sh(58Y5G9e~pT|G9 +zH7{TECQJ2;^i*1Z5PJZQU8N`POBx{Zg_EMj!@YqtKPb&mz_7g~45vKdzVesD>k28kV;w^w5RedPYeWVv;a)M!bV3t8CeO_4~l51fJZen*trMuFSAl+B-Y8;5_^%h__k~vbD^)P +z9PaE)dV#*qZE9?-Z)|N}RNuIub)id#VJPEfqD%VF%EBZZ3wjsj52U(@Ey*+R;8O}} +ztr*4)j77R-Q52p!lMxU*5*7hW#UtI&FhqDo>H%}HWNEAWxQiYkII39RVDB^NPAsTv +ztzTAmaC-ymOY{7?xo$ma#e=RlX3@bWOB2qwV$x;284=PGeWq~Tp^r1LaWXSS*{Xp8 +z%0=OWZne`(+1Xli6=OBfk6IRD8|FMy4~82&+-Wim5r2h!tVT)TLxD7<;YKWNbKNFu +zK;8I-nq$Mi$k;|v8o9w%V?_kDUg+6GWFXdlIRt7*(RxfzF7Ya*Q4{YkpB1wD(SjX? +zWm#~`=@9n9NC9k7tZ~}8b?GKeS`KD{bLx20M7&Tn<~q6-hvk7Wlj9H&%MR_M$%+L` +zS`tyRFA696Wnp}}$}-8aRCm7>!@z)yedYGHu}$dJ0ZZ$f4{mR1ZEk2>kf%%fl-MZ& +zEfQ+2ceYnY9i+}kmLc{b7vVRz3H85n8%K?{OkjsNBm|e+rfDWqj~;ZV|rDHU3=lg@04srhE|FW +z&?3xyp${7PfHq6Wkl+}mO~xXcy&Tv>8?&IX)FQUuUb=JLvU=jNo*4J-=TU6YiDHw7 +zXK72l+qxT0<_dGeKRV+)zaF&xW08^Q$8BZxi!4!+XVhd&4Yh|m0|yynaJRqnu{Z$x3kU;m*QAVHdHAt$6&*Y +z{AVYISdMp=3F69;S~p=7wLq)|kFioql7xUPZeAn1-^XKN3#?{!vV|^kjP*d8n@X8s +zjE_DvOYcyl?=RL&hQmBrI|&9**b^0r~}8+T*6!LX8Pm4~(^|@PHLREOshy33MfB)Fp(; +zb(wUC>JEd%P++~Qw$q41fNKnjA;T9?{`TDbL7le*)M0ZKSyKWRB+xWDuqqtI+|!Ud +z%xK<;;(`Vun>t2?lj+!zDhxuv-Mcnm1E3VI>5|GNL+m6;m{3U=TuCza#zwl6NeiJv +zv}TiBBaOlaT4-7<5a8_5UX(AS9!^$ReiMOj`VFh!%CP6!G-8Q(Vp?u;qOiM51O`=) +zYCa-vGCilLt`j7XLn5oAYD8QTya;b9q)tJP=p5K=-Jsl((7!S$d%DN)LV>cNa&+ew +z5k=T{uhU(&Cu`Bz=ipPoJPAk?e)S_f61O4H;kVu9uaI9(fsx%rq#~|lG%Y)#i$ZCq +zi?>)x12uC{O&q$ADQ?s42p0jf#l5qfL`;zfZ;P2JBjuP^&>jp8A&XHwstP)S<+;Xe +z;nz1IKTDfPjb$4K*b!nACP=%HH;XcU<}_Pu&>@;9Thx$E+Mce#X7X)K!x_+n_NpB4 +z@Ss=UAh!rbE#K7rv4uNB(BJ=c>s)CNiiWwB(?$(*|9|-8+W)e}RX((JfR*pGDO2*; +z|Ki7C|63iJHnqr@GPKQb|NM{J|GLjV|2jl!%lBua*p<7{Xq{s-8XF#x-W7PYFQyGQC$hF#I*8? +zDdnMRBUD{8Wok{Rl5w3qjKN1f!ZW0;^u&{(hiYFCAlsZ;`IW!nCW!0>$cq>!?X^QC +zczL>bDmO_yCEkKfOYVDkD)V<*S_1Y|MU=Re_ +zsuWyoS=K?M;^lR*J9B`?YzqKa+!;$m@e9b2()bONWRm>$`^Wru&@Jbe^awOku!@1MeQ~y +z-&&e*h?NmBJ6HpG;+#aedEJWT_nle|s@AdxbItnS5!SBSdxzkvSc;7(71uNftHG5nUF>pQV)?xRRS^aJF;QygDP{w> +zh-;4sGPpROhy**7_pR4}8Oi&)fW4GgQ}}r|zXn)&K7XP7D-u`$>#_8UK`j=C?QrI_ +ziQSav5j2rz1h%5#qrdD)zrD!NOMd%sV%k>QBQ}*znEu!#Pw{2KQQno1ZQr-zu-CeO^83$r_p(F&~|CXhfVz +zCgZ5>lE7lo{zSMZ7D0Q`6oQ_@_UZ{IVkxjHrch_lXf%36l>lrhb^x>=Sl`@YuVYHE +zA{g=t3Pb)0N@V02+QX66AS8A?xG|pJXy+*8K`o9b0l5jujL@0R9;Szj;)b;Kyn(fb +zo7{5vMoJfIyNm`tb`FMaN|u|2%dvBEiRU>Php=Pv*eDo-ydZ_bxZT0h^3q^XrU!B| +zOfw)YCwNme0y$h`qrgObg@?jMtQASs0#w&(KZb3MCTs&F13`0%s0h5QVHz%NUZkx@ +z2(9Z}ix6~GO9GH(Myn2Frw4uY33F`!aLtHYsBBL$<99eqi;umBg4ooWUE}o=UsGJn +zxpnA+RqOS#C$UcI3{Ox@?|>rD_6FVXDt)}NVwm6JVh*tDE|Z651cOv0%VNTrG*A{B +zT8vNP!C;TDYG5^>?qS(unqHDrrP2;aO+G4$oeRVk6vdu3$Zv(z>q1dyTrv(}_Z-&p +z^5Age4TpYYm!v@n3@Tci4o@s;ZG3^rY!w0sDNO7S%fvSS@V*gqVCc7PjRx +z!JrqeEtSK$&E|_iD`jh-l;e-b5Hwg4(T*_M(8l{ELL1v9sMUc}#t+2^Z5=lvggYtA +zi5Z=~Q!(^)0f=Hf;I2`Mmw-}X=Zn8AEE>_U!H>+|D%lpXFfELPfG~gUO-oysENum6 +z8u*RH(B0L*xIyTc7**?&a0)qY04orU$TCs3GyFPxly@`G78YDFGnel&%giX3>Ms2{#BQhsAvn +zNw^aoKDGgh7v1ow=CQ$p#n;Y;74aBRf~LPWqDf*Fa0#?8Sl-n}f)j}}C^-mx$rei@ +z7KaI@d6rK_df+74hp48{s|W&{(=IlrrLbcQ540DHAT|X54%__K3#U~PXC8KTL#GDU +z2_X)$AOvI$EVcA-V&vB;LgOU3&Aoo?DRXV&5wry)qZJflH;|0b`jJLuHlBlgZ7{Ml +z&mvJl^)iNQ)!E@wF-D&tDy&r~wne#g5HLR=iJlH!4`E~^i^@rc6wA#GCkW=1=IF2z +zt2D@F41IBfD-tCZqYk1#tjwRoibCnW;Upkp0mV^!5 +zyXLlXX4J|&2?5c{Q5?iOgRTXD8>*vL|boC1-V +z$R@xP6)ywu3=V-BM3{xWz>9F(yhFW3=;}_Pn?-yJF9x{qYSBbo;#ufNE%`GyO8;iP +zFbbNYqMZmE>h5G*3ve-{Q?F)T!*lc{c)N==NiIDbkwL|AfPon+RQJ*VHvj<={F^cCL_ca``G(ZUHn?AMOc#H`YH+?m7yZai(36dMeK)g +z%#^H= +zO93VV!r5!_YGRp@7PQMFRkG(k;X=wIo`%&53afjvpN5GL?eIQbtT|c`^h+vc=4_7K +zK^wx^luK;D;CS-z(?Uk7#aKLmsz4mo-O@6_@R7z}m7okUfZ|3;_E=ql)3u3;os#=lLPX1A +z*U#aaa;f$(eAFnZ<6#X_(RgSt+QM{o$Uqy>q&5Z~o9YMDJ6?}d_cLhK4+>jI*~Au+ +zXkjQ2@}mf_T*`v@$cerLgJOu;H>%Bf6VFMCK=gTX4*&8LswkXtZm4hftPl%WTVvP( +z=dwfu4m}a~A1%0kWg?#dXR0M2V(*u^G&TJk1zQQohO)&W+gz)f&+ZS@Y+N>wr3Mxb +zu9#zLjneW`wFc3A1-0oothCq!b;F+dyd_pmc{%%2Vu5rAvhkYWyTiyybF22|e+{n8 +zR1yS_87?6ZV%6cy4isZ1Jm8`VYfCDRZc)~OaTHGc@Omk%ly9Oht`y@SkX4gKf$ZXC3qe&RnR#KT&)Zdab)rIL}fxLx1h{( +z9H2N3PJxVw;;m6uA8Pm`hz+2Xh1-x@ImoU8#v74RpCa1Mwgo-Kc8e|j7lH}cmZ<~h +z#w+X_LFS|9wAn8@DzKM0uW9bm#Q-(c+|<JPF_mh@ +zwT8%v?{#mMgx>MW0TL;Di6F3E_evBV`UZ*!dFbfphOHI7y#8Ww$mCRR>!vuF@|IU1 +zv%MBLYmtnB<`ck504WC#URsZMmO4!{bw~{_o~wv=Aqi#D%22>SG^;xbR3V7u=TPfw +zfP+BZilZ?r5>7{j@F|=kT+CFEzi8*M0qx*~hB-L%*p6&=&XDPVWnNo)j+d4<2Z60o +z9!(r3zKZ9X#76stZ*dH3aVX*UYCg(t;S?Qh&;gdbg16ErNej>bi!k?WL9;D+1tQ72 +zh;464H(Cx@(+|aflf1Bo=F3QyQ)?WxS|eO|y7QOAAT1cQoX3rz30qTn`6wWo8Pwgk +z(A8JJ`Dz#6VL6fOqEV^SvkksBYVC54bH)xW{mW2op%Uf2dZ5w0yo|E>Rx*qzpnTX7~c7|jUZjwg+sL0W|)>+VQERQ +zG+>0JiJD`~YxylBH>1$_yXL^DaW>r9E$AwCMk=uZU5Jm2>W6#_M(mDlyxd-e&~Oin +zG{30>t{+4b#QfRKj5$%@KHs#gb1ojajATwqr{n}BB2*>936aunxE3ipvK))l#yG?R +zpaol%QQV@qg?LMXj9Cn}O}250&KZ-d1Il1MDJ}K44a3^Q-WYg8EX~4xxj-(4qS!qx-0!g|mFWnB&_D9XM +zyju*DF3mE$wlH%xD-JuvhElzE^rHwA5e}s$ng?|yi!~*YR7Q(JRo%sr9b`Gm0sz;J +z72~$40%V+x9yp5d>?HA2C>3If=&MZZ^5Ij)*?hZvoyw%FQ`nSsa+|VFJ2|$Qd?@Fz +zPN(^pv;}EMAR+`7S|g3cjKf5UrDQh-HX`7e)j3?Y#OgN6aX9r*gM(T&Z2gP5*OrB{ +z_#5Hb<9z03PoDDA8?L$2D6XX)+MIAE>?T<@zRbpyNw_38M!223oNB|6Tp18{F13by +z9kBT`()c7-I>e%s%|0GtoatR|54DR4a>+WVKI1*p2w?+|j)bJ25w{Oa+^!O{+lOcM +zkS}@0Pus?x##2Bg8sW|iHP4MZcFscD?21_|{Sd2~ZM?88obqNZZtk>e_#6Yw80j1% +z*P&eLb8VCFwpQgO3QmR?>(1UeO$-H$vJhEzI^HdhwfPDzKD^Tna_vFdFMH`JtB9}4 +z+S8+QZ`snbkMD4=ye56-aTMpmf`I=8?*u3Rj38h2Yeqokh;@ZG;Y(EuCt5U +z%C*08U%1Vt1>75H5=$*|Sa+*94GB?@;pR?TJg_rwaUmC7kpJ1EO?jNGjjP|g;|O*0 +zNrs~N&DF}eq>`-3K2rRd%ek<6ShyiBkJKbo!?d*kjSOc{ldI8%h+Y44#2;QjGzds5 +zN56ZT6iXrulc;17!%mA1kNS_gDC+3gymEWgxvXluzYp^XYfdQAZ6!{ +z^K;{77&VVNv}Up0o*!hu-lP@eL=PpaUT8`@)LQ7P777H3=K$_U5L$U5-V+=*PQe_bQEH!+l`UWH;m1HOm#DTLJGvF6)m{v)B_u@5be;{Xyd5k2*D5%APD(5_?76o`M+Q!CIWNT+1})mK7*=JQ&FbdQ1fL<&aKk)|SS}MOgFP&K +z9$!9SQj1QcGGdk%J+ahKfiH6>3=d@;Ko~-Rs^C7hxCmUur41Ch+F*Hz}^Id-tyV7GiRX8TD_J>oqrVIb%Z_x +zoc|bgc1sz60nY!a71h(6=l|4D#pwAz5}zTwZ;}v>mW)C1j{7~X_>XE?AwMyV<3CoH +zho%DlV@0T@YB=#9^PxKGXlIO45dH?YlVMf%{Xc`HH|+CnyXSV=>v`-MI)TBQM<0s+H*5ZP%F_1+YwQFFsJ{t;CZYHrX9f)7zvF>JH!i2Nd%c%LR(tu&JwZG7>{$7R?5VGTW@b +zXw3bNlf=q3CB|T2bDNs>Z>UEIB0LCHYVQm@aKr;Rf@auL0Q2JGKf!*?nlyv`4`zTf +zynX^q;9$%YH`ih}IE)`FE|?jBKvq?$qYgY5urlH1V6?aMsny&ZWYxSRje_$rV+X9@ +zeZ-MDJgZ@z34Z66MgiE>pKSsHa24T%fJS&%ty<;X!hO71TQZ7G6gyJeiuqXxC;w1u +zgghASlox`1(aIVw(evo%EAT0J|Bt7(SoRN}!uS7BMRoO5$Nhiml&PcfA4cRe)Fe|f +zHAbu1lY%JX8t_Ll?H&+<))~qILX{&d3~&vqzz*C_GtnDBZ3W%q13)3+VQz4RLaD{g +z6Qd#IND;t@zt%NkLLrF)`z}n_l8FeU5_T^lJc4|#1xwH@kF+=o@**D$2K_^Sg6g(M +z(WGHRix)u`7^lEmgRG+$h31innc{3%5@Ttm(p;6%88hQ-y&N{-Xk#X16N;o9C!|?m>I#7m=s@8VHHg6qpE%2`pHjgzddH0?s3l#dHq>TVE)K6oI_ng +zOc06`%k=@d<#p!dCF^DPoSGAKtx*(u{eA2*eWiw>y-WLV~DT>M6VFFu- +z*N1d6P8E0YYQ4VYD^{#XtSD^*{7dhO6(u1rsq$F@D-+9r?xl1^x)d0>(iNqXOW9Y7 +z>z*+VQ`@%`?9UnV!xm2@!#F)hEi2MgdRjBI7Xm7y#PXGvSf&0M1~5^y#@W^#E*`Zt +z9ZpzrVG^AYM3?P1F~e@l6)i$U&it!Jq=?FbhOqI9HpngrAXRM#3lCO({3jd@SBaxb +zCSZh%+3f6KZ%abP>{;k#YD+tFd`VeJ*@Ov@W5NXZK1=12d2l7#^Ocl9mXZ>;{I7GK3`pNcDHlYn9ZZ5Wo53@==#cc0^w;Ll-WVpw@c~Wfmq=0&-+0g=y +zJ?saMNQ74;YTs;MN#7*@a$`lNZIZ8cwjY~28=8wX`w5&BgqJZ=#u*)HGrW>^oiLU3 +zA>1Tercfy6gJ3~y+w$zx1}>CEKTq`l75998V2>f#9^3S6;mttA4UQ%k;~Oa^Lu8AC +zpxC_~GyvEHftAXd!iE8Q&Smk!1-$5OCM1{^1voi^O?r7C!kG*8io +zAY#l(Cc!QY6#uB8hg-i}iAboFoj?|`;A~@{$B+VFQX7jh^sbTiSX5A1EKYVVk#M9N +zWJ{b=f?v|@dT6Vc2NQ$8pT(0j_CdQ>(g=Vk%J!=47^>WMp8XRr +zs{B-}t#$#4%Ze|A}SV)W0gU~aXZu?*!F0H&28;1$6^$q_W((uJ4--`XwoC3 +zaPfX#fo6TYS?B^z3?drnwHT>9o5;Im)T+usGz&mE#33V6Mn*!wx*;sM +zVj1LvGO*H-!bk=H2BD@>4hN?Y%3jxojG*>KnjPY$`<4cSISAVAaPLNrfejnyPul6` +z&adhcIIr#S+Ai18p;mI!311$&2JO +zX4SA%#lpUaVy&_V4xB&6?XZVAXhH0mfC~zz03@hA5|06DPY27t5|P%EL5{-%X>(wM +z^56wQS_fbdFP}8t-iU@@j5@od1+N(`azY8|MM*3n_rmCPp5i3V5ESShUQxbtjpRsg +zIoJ>lEIwN8D&G}!&4gs50F__LV=3 +zWynQe+Of$I5As(zahB~9fcD!ue*-MG2IJHN91h4)%Ao^gxP8f+kjm|Vzz{%b$g<4f +zF#qx~=Y2VtFRWf*KrpybDHL0ZF^;qX9U$pgCMz%pLLTRlFywQilj=>eOGY%2dWE^Bp +zzU5GhnMa2Yd@0$=91BJ~E&K{LK><@b7Y_QW=#<$2Ll-S7o(uY+EW_v53?SMA+FF&! +zJ^Hu@46jI1f(8^5yqZCT;Vmok27|H?n>##5Y~^kYj#~zu793a8Z9}1|#icJOLln7v +z-O)6pR(%q0YRT4s0uu97j9>RHKeQxLV%4-w_SckHliAM|3HH4-pn@P_uY1FBvPcvN +zdjg<{;F;kKuW30vfqN&*LRN{|`0zA#zh{2U(MABTWdMDYcOVR&+ks7zmZ1>~4l?=L +z290_kF+9*G6h`JF7^%SKS>ixJ5r!4P3;*sx@i!fMY*4+|p2k +z{9uG8n#{qfa=pDF-VnYEmVu5LwoMFRf!!p@pGw|UmgMe}EgesA#NuWZ&d0OUKDPYg7o6QB*C46{85L +ztQesy2SSBtfmjQ8gZClqdD23(A$i;P6LA3BAV%M$(oW8~3uVAEDd3rpw^?l`t&n!s +z4;UuC>?Nb8CGob&jNwd1?Lsz?&Vr=TFe*G8Z`no#n=ja`RxR6}wO*h+UVWEB`DnYv +zhLx3q)h&m=YAf;&-;vTlo10FP(|_SpJ?OPTuzFV{7RM;DOXvB>Xg1d())BNVNYW1a +zE@sP>F6e@fuu+;eyRz|cx|Gj7$|mR>D71TIA!_>wJ2$l<1lf)Q3NGJS8Z|GtZ$xPn +zMLXY~(QB}89^InO4vjI$sacU&nvh@_IxWJ;_PJ;i?xPDcVH;WpbK}!kD!x`(i#~AnPARDV +zLG2SP+cM3S2DlhxSfeWZYWvVakrm{{nAx%&l`}lH_>?s4xQWQ!R*w)UA%+d@geohO@@j2=QD%7#2|9HY-#Ug?L5{_@p`_-us`fm|_-#yn +zUG3pY+*Chc3B|bA5kKZR+=+qvACEZprx!0-bWfLOFKFVS4z@zzpaey?+fl1dP|n9K +zXQ|tWj}hk|9YeOmhzPDWS3+Rs#(MH3PM%XkMx=|Qyhfs_Q6$-uXNd)nd4yEC(a-eD +zYk)g3rOi$=Z6+ez4I-n1!m~oqz>AeFI8CJiMZEZ^F!q}dvC`1PomL_@VUjIX9S)Nr +zb1hkQsc7!XGo)KiMgMXUpqmwjO#o|0OQ{9yhH{kf+UfF2SSlp*}cRj=e3 +z3ZP;@_cA6LR>U$vqai^SQ-Ht>5;-<7IGAi?y2I+Cg0c^OTe0$QW31e_((LEm_S>Pp +zi4m5saTNSPqbX(Edln4>YM$ieQ%^*oXBZ3UOgL^Ob7nfmLE*7GVaX-q^;lmimNs#! +z3LY2KK79dgSZt#pFMD#3-7ZOs5l;zeGf_nXOCON$(4okYu%n=+SeNz$+_(;URfzA9 +zZP{GDgBow~;D`l;Z%93INegSICat3Ho?>14B%A2O4AXxJSr-0a`IU4;lcD%vsGX)$ +zx&{;P@-&s)smxNWkCIS0@47zCWJ;v6+f5atU{amT9;&#D4;%S^3MybJ09r{TiN4`3 +z(t}Y^%hXxRk3ie)P+bn~mD*{7ER1vZf@ziURDnxVT&{l9YX>SF1Gacs#o{EF%);P# +z1!cx13dy-B`2;&ho#P^J$KVk`KmxXWIqbQ%HVP_%)`^q{Q(};jfT8)0C=UlcX%_9$?1uZH46oX9Rfw(kC2|tWEV1`+`MH?Sq>52+n66B`_sc`d7WoOO=sMgB`#anGhid65_rA<6`-b!;|C~c{R +zF)-Q^6hQ*1z@^WF)F|eb_}WM$nHJ#)fEg553S>&WoUsvDpva-ND5fdb0M!Q}S_`YU4*f*HENoy>w?RYj)ZgHE)4NN^u7UN27@1y{T +z5{uK1JQ*4c5WqHkD3Ov?F%lLDYFTz6OQb*G_@Zr;&6jb%@z_e!XlQ8h8(e)&1RK<7Iql+l0mji5=i|i&~d822VnGD-QaW5{}LWwYX +zu&Pr+G0VCFhO>iyr{sBQ!pf%DB_(4U@EU{NRJ0oX!wZS|KlLeS|ECN$w#W!@ApFm1 +zl~s28zsibG^(g+=hznzrnVpyUK&W6FkcCNHycUZ8e2R#weZ8ee7JQcJ;=-`z>R&tygoFT-eRgS8M +z1j-5F_r)%Rx<|(l4vD%Sic1`8xnD=P2L6DwusQL;S;I;DBX4o+iJW=%1yaE2FT-vb +zaCkXIQN{3FM>L^Y;nW2=PHQ!@1R%dONGL(bpNF8AbOnZJoXQyVr>p&xt;H3cLq +zkMQ$0mnSNC{xb%SBxJ*S{!f_}nwES1PaQq~N8&T2#23NS(n6@pV>*{%Jh#4NdZk4e +zb|@96NC+ZEYotFS0wah=$}1p=#&TJ<7`dgd6^oiOmaC0}ur1gx1zS{jaFgk`umGpK +zr^{2D<+jr>Td*U^vxMY>V=i8{Z9Xpt@IG3DF$Ijlj(Wc>f@IpvpF7QN`>R|s +z58((p;rKPgjwtL&Y;Cfoc#+nAB2&w +ziNJ;Rf1+PDW|lEU4lcgH(G?TH{uT3J*oL~D$4HT+jlIkusy(h=HgfDmgby++UKTBT +z-rgB#w*u|Gk^nw+@27AsrlD} +z*i-t3%cRA;@wdxijL1tolNJkws*&buB^IS30)hQRYiAxB*wJ!KI;f^|(ie6%3D*zz +zTo31O6D1p5qbThb4k)KYG@fwa+K7UmR!Dn5EE2Jt^)x&nTTWj}j>yvyA~l=4INX+H +z+VtCK_iC@g8Ob@%$(|VANPWM&9{1)wodj`ZX-GHeN?M(xa0KgquMh&uOhjKCnS|$@ +zFE>43M1#*j>K-YlR_Cu<|2V;SYr0;Af4DS^GJ=X&ptXu)0M|ym1*#{T%>NH?|09NN +zSmQs0s;j3|<-~ue8jb%nBA+2$tVm1kQlKueQW@M#h#NeVE +z>x`M{Qj4z#*C@%5x;+M(+NeS)^GV%rj19c^(30rn3G7}eq>pxsc0vOSYgWP?VYu6a +znXj7|fK?_4hiGIZoY5$PE1;z%Q9*evZoQGlkG9@utXO#oMxtQ{x)@@%yQ2Q#u@+K@ +z;+r}OL)eZS@bH*!FK3&6zX+(R+^hI=JqETJPP1H=?nuDRyv2~ZPE3M3ZTW4uLPRlq +zA}0h3^AgApcfsnGzBwFBh|Kc@FO=3C+Qe+r{nY6tBUNW0{8yX9w&oghUOD^0GUI5e +z#RW9T@J$z=VOmP|=39=11@GSp`oRTiNJCpoKp;i +zPv9W~;z?wvY1ZziUN%H+}J%^S>&t&cXHFNDt@dxu7YBN=M`0&0j8U_@C!XdBpMGiTeY} +zy)n>cs;L-cuX34N;v4&|moJ;dw@N*B+~#CeyH5%lyNv)#t5FJt+HGQo_X-OGVJWBL +z7$fwfpH1NMu8C4YpvC>MRzA6xr7xrVz}9s0QeVi^=llELmR3gI +zG>04888vI1xK>&quQoMw6~5)3xZ0ZZUQgV@1n74SqbFc+CE$v0p8w>}arS6lggkRH +ze=&P@ov&+Piq(0~)Z37y+U&0`%E9cq&lcF4b8Dr1rmD+lLpmWpMsMEKfhcJR{nFwy +zzWbKkyoi)!fB9QzOdVk4pFj�+2<0q?WSkfEG&b3{^wur0u)!H`f#%f6o=B)*bY;_+D;s9@b#z(s-0tC%)GAlpT;|^es5K*-Fg#duYjw!#ls5U2#of +zylmC#nvgs9Bv7#j=7ouQ0h3*JjIR&6$J>(HH=-;AyB{2gQ> +zB@^xCbnq7UN@baPYtrZMqp^KiUf|V7_jYs>KX*C>JesZ#C{Ev1 +z<0EZtuN;PA8kIMA=KFGtoIs +zfH(v73u0I<=h%|ld&Ki^c;q`yT;qy%(jA>Dc;ssvG|e|xn{_vKDoXWv#rRm)aJpod +zz-8FFWO&fsk(kf(AC}Z!61b-2vj6c2YB`b#wJ^Bsn|qivz6|9q9vAUa5q(WDLAc); +zU@2R?Zy!^btGV6*MR1N&BigJ!);!H(QW3j%S0NG9(tmv(^8o*iTVjiT?rNN*$lpI) +zZaMJk-7i};gYl+qpL!|{ZUZ9&lc>c%pFEP0yv5pC`ycm3+dsFmq48}d|3I6x5bOGI +zX3HnQ4!OG)4`20)Gdc>C6eY=z15{)50+Aap4eu{BNN7H3H10bzM@prKd|!CV%iH)@ +zleh5UK)j10p3pmG8guzv-D~7djm+(&ZPt;fhU-sK*b~3Mh?0j$$aWSb-3$?UE$aNL +zD{;{*DtEXmnIZi#DO~a=UQ<@5?aibA@LJ!#ef9XGT@c+YlgP{C=r&~PdhoGN^=h|; +z!J~Ww$B$z|TwjOvuYc7FWD5CRez;k_sTWpLDNUCFp(w(b?UgC|3$zhPHx?pFhyoo(eYn` +zC=MAN%plUnr1u0;JFH*WybA;BhbU)!SCe}WbuDjiMHJSuIC49eo6gg`2l;L%ia(BP +zxfH4}&PF3#CQ1>kD4BB#jOO+N5!< +z9rr6C@%~G}ufHYenRD3$`+pj|z?s68x?NuTzEeKQ2)H(ks%zA)FW_N +zgqJzxF<9Sk;kTxx|9p1A>-A^qjMR&__mE3p^5Qrl-wM+lf4djZH)FmGjCS|*Jz!=G +zK<4Ade+7KJ{-RbI*W2jfEg@e^g#JnPUv=Nyey~Vky1d9mr1G<5QQ%Jwr;{D#Oh@+X +z40(5FHF^|A!+Uy?wrwO>G#J<~`z#Rz_4Fp?5gD};&j~{fT|Q{bf-M-UhPQ;dFF9ucJmGhd5ur(;Bwr9Q`tmDFf+K-@LzOFk{$_b`2O6ba1#Kz!?LS)w&qN{Al+$h12#h&K`u()N{0Z3jCng +z?UvtxKnvz2Pb>Q*&)CpN0V54qVJN@$Nsdy4h3RbfOLYG9^F)xiIJ-RQ&a%|H#GPC6 +z5c|Pvs?|bpX0{xKZY84qr|8}4i+PLJ#^S987pbhJ!3%RVsJWq1_p&g{1gX~u~peIIT$zD=6~>VoV$aP-sW`$>X{G} +z6x-7;!z&&*w&|KTx?AWr6JT$S7z+ex$vwb^Cp1y7GO +zO*(bYX^6VbkE?oR@th+He+W>c9`;ke{CAlaN!3)%cTA&d2q^R(vlvjG$#ik6~XwuVCQk<$F%DR~}Wd);B7WK=i +zSD>fAwP1NU9uD*tAX*aD7@W&jLjFxkAP6V|j(Ri5??QX?n|#JLe*@&Yts`jvh_$^N +z&-bQ9FgU$A{BSw*CZ*{sD1IcQgZ>U@<&4OMFVJFdTC33M>MV8G9C#)CbIllmN&YI1 +z`l1?>N`SIx6e5f45gZ=|2RzhY?KswG-JV%|{n?di?1`&C2a&HalMAD%xh7A!g#`Vs(F*wzp&ElxMhR+9azS^+Qn&4%OauPnY% +z7lbH^jPdSSOGVhWPNr6hUgmCo^(m@w=oXyhW?kaRS>Lj^Z@xO8@iw3;TU_tmg5cL~ +zd6qxYEi^Q9aVYw2ea79Sb_a!ymWc`8wQ$p(rXI@NrdF-lKTBVRc^Qjqst(vp#wU6o +zm184rX41~i^*$cayd744%J{P|$>EB>l8n2Yk5glmYK~b5Lz4Y81A2Y`M*8bG^S?m9 +z7htw=QR52z}F#u0*nzb*-YG(3v-h%~g*CfuAD*p-_N$t+|tFZ0qt;KQ#HQ#80{^0%b +zONP#(NsJW7qqiVAjTc~2JCHeWdzRwynt$2j*{|->YMp=6rN%!A)>e-ngzsN>08Ro4 +zHsWV&Tk7(ZLDi#M*Rerx-y>-3n=|x9t5wzs=*dBpu;GJr{W|9hZrl>fjfB4~Sz*cv +znw0X}C{=wmvNuy0IdFT}qT?A*&VugkH#U|Y?)R@H +ztqPy~xkhuDF#smoK>zXua?;J$f+_MQIGxWf##_oa`N+)`qRmlwRd&{(4&75Ub3I-z +zx_iCC!)B{S)DosTofvI>$8TpVr`?Qe-~*?c!n5HcxM%s*>w5{R|I)jb`J;YHls$ex +zKjPFE$Ic8f9kvz~YyH#Oqf@WTd!NCaewBLVDO~PHNV)xn!QS*gHhA+{p1bT%()iANXb4So;-Ep4= +z3qvl4Mn0BAp@6Mp+)izZfA`IkChMg#V&B!FHkN781D#Bk%fgrGej_;3Gw9qZmz*z0 +z-pDX{)~cBP-FWD_(dwbl`^nv-90$tYH!Od +zeDKLin?YBJbfu{q-xkK~O|16cyUMfo?@Gn=4TcS&^VX8|3QJ4VMC6+=QoEy*kkeg1 +z;eNq9ak1W4L7ie1PuO;(r0Ytft9}lpcMV%)y0f<@OTDEVv*rGiHbI>R +zgO}G?7k@>K$OuYFJ>uQpSNs#WmM;l=Rv(qz6hCs&xKjQhnfufIJL!8iU;2V>TfDu2 +ztG#){gf+1V`|FW;>>m2&`g;)BbimHANowGRn50F^REN3DltA3z!`!gL4!!l-&nmYZ +z9CS)cSt{t=?4rXGwK1YKwI-hmt%J1wNLHCLmMT}inwFYc-urFc9`Ef!f$n#AQor7g +zca)L2BoM?#ee^xHkeVoM@trF3m`9t;d-Ocqr(>mAwD*x5e(Oayb(^+G$(%U*lJQS-sNolAXBzYu>^{ +z%g@Sb{@qUh=U%;Rb5@<-Ujn`mye9`u@4rkr4#R#zK>nFBBEf# +z^ys7`{V}Eo*{mxzS@<6zd +zd{GDSrAsF+*_Q_YgAmRS^Yv1*1pAS?Slx_;(8T7xH-qyDF$gObP +zN=^PED^SeGCiLY&iyNz$`u^< +zeE6f^m+AR;0=i!O){AccNt@nBrxo86e?2?Rj<8E|RYvSgZe{q7^;RXE&z*BrEF~Tt +zfIZWFUKhq6g58l)s>@XuvHb7#gxlG(69=Ky4|%Fbylg96lpMGPW{0m@J|ajYA$Amo +zk$&_Ij?6O31ramC{Bw^x9oXhlRGMKYH?D&w+{C=-YW{xq{m}{#Plg#rTe}i3dC@mL +zG$HjY9#MZd^dq;rLLxtk@{uSxJ3T{|xSpYp|C{kWL%|pGL$HPQs#}g~*Yzfs-rEMe +z?FTD0;rVMUqv2mHK3`N{|Gh_BeC*!)*9At(2b@p|A4Tu5U14kbb%5a?O*z2yY+uN_ +z@0>bD^G_M2f0TH4hc4Zizhrn>+oGvQE$23~Ov=sN?@vV-Sm57+*JY!mqONVqD0w_Y +zXzL`ZV11M@OVY

    2bm+X^54>e7*eCs3InBgzoH +zX~a#~Hshu1huW7Doy+h1z3-e#_$iIzR$k@%?|#m|#ytJrJUV5Y`o<@25?@_vK$9w0 +zto{K-mH3tzMPhhM4S>yGn9%+?ubH_{MP+)%P+)D!Qdx_msT|!2=snMM;UDnXu}Y}_ +z{nY@GyPpPzWUIAeSUzlAP3*_t8Dz_UhgLrpPN%y&lbODxCLq8_ce5sr#Uv-7U+q)z +zqr><<)A1QQjdXs>-MaBHU9BR4%ZiHSHnQ=V|Cm({;vzf0_dnA^XLyTAfdlW|?vKb5 +zsQSnyL7_5#6Gf5%MQ7AdeoZwh)n@d9xT>^%n1eg_s$Yn1jkuDW&$D7oBmYp>+LoTi +z;(D`jezTrtL7CM@R=?)8-k=cCUy|hBw8>_lo4Zi4RPM`E5b}~V5&F;c{~g9PBzQ-u +zRC@6+8t`3dNUbQ+pY}o +zq4`VwUEq9#9#uLm`+#?(lX5LQvee=~G-TI{cF)P4R<*+Y7L5(PkV(#qVN +zp*x}BW_kCwB-lOkrI4xCC%5az= +zerJ%J(=vZ{& +z3oK}7*g(gbw+Hd&`W~?+UMXA_~@F<*jsYK^7PNGYU<8HrA68NPw*p?zV +zavdhuA*$f<-<=zArDeYOg&aAPC&#SrwwzInosYO-f;m+Vw`?OfU!-Uh$`vXn=-i*9 +z&V_lYU>^ii3kRC1TP)VcjO*!1YZy##v?U^2sO>!>-Wj*96{29|p&@1v4EB_sgXcn047#k)jp%)`hfnzFu>qYY_J6`YfXP;@a_B*B?!@ +ztedDm3qfpXCsl`-Hz+sW$ph^0nhV!6Z6nKb&UZZvo}$UQ=sI?>b)Jt^Hnd(pHQM`C +z`6)xG?f2yi%5DWYd*oSwQ3F`ZNDQ)uOcG}Q +z*~Loo-tLJT|C&GvDkym2d`>M8P~L|st*)$tnTTJEZTbxOAf^m5FaNWSL^SMX%h8!R +z?RD{et(#|;K^!9^OIIx8*SQdtFGLuWv{`ld$sml8oYP*(2 +z{T%DgIFSh1RrhOJ%G-sFuW76o<0~X-tj8>cBKnWMIK4@c98}2J`znFsexcy==bf=> +z_3E^uX9M)Nmu6sE3+tW*|Hu4B7iipP+og|n6%37}S;oD9u8h*P>6HD1`t;^Mr9D@}d)9aFaeO>n +z4-ZHEdUq>AZgf37Vkkx2NqiuKhnun6U4ynG&UNuo884vO8# +zUWhU!{Rw3_ReFpFDjkuz{ord(xH66P2Nns97q+=Lv28xtr*Pk6fc~vZ^66x&TNGkt +zs7=<{MTkRgLAN2&ea{215^q^!3TYlc)T%bV4ZkqTNVyGsFyoud`P0x1!KfIIE&s&2 +zK>s#!A*(@l`RnVUNA!Mn+0`8%YX2B>-V3+Qxmr|oN#O0Nuj`4$gACK>88uQ5j!M?m +zx-Y$=pQ=JhmAL+Ia<6Jk$c9exsdRL6LeAe)i(SW?nkfFXD^DwTL2yh`U>eGppN2P~<+(i^AOXO{zd)UgXFH+2!N8vUg+1&imV47uiF` +zL1_L1n(6|}9&rvja}y2Kqw!ujL%lADLurtTzP_;MDztmpv?8F#-<)41^7@f~C*15S +z!tsgSeXRlKE)IrUUJTO=mZ*|7X{P5KbqZ;RpK2H?SnjKhZ%dlvvU`&64L;ZZAzgLE +z5S+@OXKdZ)Tjuht*RocAm_vn+`5|S+vQLh@(``o+I=-T`H9qd=kx7SaYUQ8lqqld; +zdRkYebt&$WiCoK#QnqlHtEE+195y-KlztFGPg1=_vM@OHw(O)AT*L)e_2Osf<9R`Knf1!LC8qVq%g66y_xY*i`McU18hhuHPl5X1I^Pn}HX581 +zbnG9KqjR1R*xu53EB_cNg +zUncG?bbj<4gCTcEW%S!q2NkUpz~$3P$7PFHvK#z*J)mm2*l4L|#>#95M28+D5udC=fic;k=S@(H7P +z>%*OXgQTVnCeZMk;~TBl_4l)LSMkWWJ1v~jWz`>UD~Gt7vn1qB0_fOknNRBbg*O#!PU`z8zn@)jdrHmGzbDsr@6l1gkng(> +z1=nh=;+3_@DDE +zd(>b&v!0D}4dhw&Pb)_Oe|MRvovlkiQBw7I^#ibNWb%@#D3?m;^F*8A#<7)FKgpcW +z(I3pN+)n+6m{m=txdw^+`+WWZZ251`r}CC}QMuB^9)k6KcF|sYY1gE$L|t+W){8%E +zRXcL^x3PGjvt3>;Tgv3?*rWoKZi^2-xy$JO)r`I`95Nm-%+vUO)!}I6^*UK9y}f +z*79%bQr$eo7iPyoVLGQLY0H5N7<#c}tBdnaGQ2L-+S?c~YWTpYwUC>1V#c#G{S6(b&`oKVOZm~8JM(1!!S~5# +z$=&}-eHH~*=K@qXhzR(k5oT^~45t{&+&fYUfLYwFynryek416#y1qaXTC2Ua=^GxY +z^54T1r3i19qi(CeGDK|E&{Glx-@LVX`&r`O&##BAGfer&a=HvRMjqP7enijue502Q +zx3I^d&tLrXviBa}_+W!{8Oiy~pxP6UGF1jBoDOe6MOmtQf--JBJV;*|?4*{#{3+U+ +zqH#kBq73%kr{}OyYRW0>*%Jj6jifiFP~g3W(#FLNz2p$ir6*d-b~q@Xb$B6g^*V$B +z{PI6c-X8m!Kt-fTOAsl*Hw9FV#6eiRxbR8fMt#$`cb3UggCzmaegeg5;qaL(JgI{e +zel;Q4DO0L&8+C)~vnJ>UI +zglo{X#m-J-WgIKALY=V7_yt160o6brU!meQQ?qmE1T{qakV*JFtHDOn +zZ|06%?quNnPol)EEaAUd3rvXM%v3op@T!)ZJeeXPQBPSRrwIT==&e99=3n@VQQWXKjezdZPF_o^mzZ9_ +z0LbNecWWABYv<2fbvJ~QkUn!~vlnDnFHOx@6N3ianL;Ow2VmKkpi%>|n$zf<8?I^< +z+Az|4wK3)m@;cj|m~eK(kW_nPs-aP!}>UGWsuifK>*TcFMm{0Y!s5^-|&WBP@KvG1gUnFTO;_%V?u`5OY)rGz4#^^6h?qvy0{NIeElE +z9Y+9vo=biXDu$dTkboX%d$tQHhk5k`szSd2QzMx$J81;j8P`_Vt2ZA=AyLR%v|)T{ +z`+FmgpJ?o>Eytt^%Q6?;)kU=20^_?$; +zLgAt81qI>Vx16lJ$@N?lDc`A}GmKXO-k*rDeeI3tosfV`6d}*CR=HtnjZTAI9UIY| +zKBfCB`ohxdV%YG&$&TXMd}6--K;6=|KNE_SAS2RvvRqj5Wuy~ +zxvKpfMvgNIVaSHhJ1;z9BUy--msf;~1fMw`Y>TY3nv3B_Qy0g<+-I$;aJARfl)s0? +z79fNyCCy2w-hjAT-RX5klP1))6?Kd?YB>BC-B`UF{07EV@6?L2iZP;E +zTJ|AI3?)D-A|S4cXD?5W(But~P5@~F&W$827ATb1c^;+C%D5SP1K5!Hh@3UYM_Z#* +zN3CgE9!<52|UM9mMF#dwT*P +zuc#XtHlw+xUX5R#uO7;|yxZKojtxWClhjr&pl`LlI}t$gwl;R67(&P`+2H{YVm&}9 +z%+d(!C4btOKIl;wEYC=X~v(yx|fr-8Z@BSytppd&P#}*?#E6 +zI7@vahr5%_cI{Py$4&cKnmHM__SZWIqnj$hV$&33CKf9c|n>iHywCiw56Fc^ZiuOWEaqW|1p +z{k&Vf=ZdcwUqcygcQ9_Z2GeRMNs!*&;g~F$w**k-_qSgKxuiBM0*M5J4bZh2J_;FN&{($UWC)AaukkGvzNk;T?KmVR82;bkMLID1#$1? +zHf;=f2f_#UItXA{BJGl!-GqdMIHVlr2yKTxgo-MtfUvMUxK5%B(mpWh?Q$H#WlQwN +zV*2fajxQQ3j&R*I2mp0RITwUl&n@XT>nMi)I|;_yOIYRg%6l#aNOcaP@aLz6^@M5S +z78oeKeh79zE(LZ%8`D#V)AQo1Djeqa_rsKn<D+f4!Ph5y#69R|d03zE^%(Gs*V9}C-1ubEmtnMclB@f_j@ +zG4-Tf3X>6PInylC>wM%4i>EACOasrIJH>pcWAq|(W!rE>sRIbwG{}S8X+nW@YnLx! +z&Y0cm2p{kgDr5_}#%_U&b +zr`;jltG1Nmz6b$?_4yVCIP17Ry>SYfo&nFF!*MmhVHj8swOwrnlRx9p=62LuZHBoa +ziW9$+$0DKRfq8utp=G!Czfk#8Tt67h=6p0fi1KkYhlTOT|0KVQ>Keq$;mT^{=eA?s +z5JmK>?do@`W%8YO^1~NPD4WwI`5VXQTQmO9R<&H`L5pi^v!FETmHaMxM8ns0^mb0N +z5rjGqfX}-(f_gk)_jbzHe{*e&6_NJlQ%k1s@#?Zp3l{PANK(ZonUd4hQFR2;v^i@d +ztxSC~ixuu1=>&2gOvG+**3T!2NK%ZGX+iaw_(MpCJ$SHVutsK=i3ioA_KyvJ?s8BL +zTkxs2I6a7Vn?dAnIaG_gg}vndwKI?Xu+WE})R=Bk0odn9Ky +zsOe;;LJ9hC^~77>dw^!CAzv$cQJTb}%2+yGl1ywQ5OM!4`+K;#M9`F(GRzSD2wwpB;`Jpd2%WL&xAH3d7k>pZ4x +zHO_s!`3QX!j<(%FzG8`Dp$)IcK?Xqp?|P__*HBW`N+{K%w*rBwI;)!Ge)B^wq?>M< +z1t2qMhs2YBpoSW!`2j`r#X>N_Fv2b#>$P0FTvF>9I)VlUvW**o@Kk&63Y+b*d@zc- +zw>s}OyVKpv3OL=BG!v;kKL}C8=@?M3Cz_K6&LefMlSbhA?u)>Ilye?WM)kT)Oa9y$ +z-zb(@Mm`}z+z717UM@IR1j=!4Y{7Lo-xgFgLY`M0`%iq33JG^I-H3Jhb5(DZ+aK&YUFgy3I!g@A^e>02+3iWa2$olQsbRZOlw^ +zm3zo`XSLURF^Z%eDgFm3<0QhH2yL7^c2m7X?j)CIXAdRik2l)UuNkEmF_1Z|n8fSV +zIP6ypP9Vr_q%eU2+&m@gm14#*rME+}h`j1IvvyGoDEB%jHUY*Ag=O(r7W}WJVLsQR=&0wg*W$eHM()ybfAQ=mUd*RB$l6mNMz*Hoe +zIE$~>SQ$*wA9qzhnN9*b_&BWi=22HVF?DwMQ?OT^5AnJg4^yWYE5aWdlXf%KtXAi&(-BEJZk)NjizXmgTn +z<{^8!na6{w@ZQLRsGhe5IsY^IwW5vdAl}2#eEeQH5m+p(x +zqm$4Uof$agD9n=`9aVX +z6gie99^f`Kjd(Ani4o6?dgpk~;wx*YL1otVV6Og?EJ~+v +ziH!IAS^Ipn?D=SSI1kCl;^=pwi0pYsZrP+E6q^O8w^+f##O`BnVyb3qglG193`OLq +z!EF;FtX$IzJ{|mdeTV8Yhz;$1`}iWV9jUxVJ?V?A2f8atxzT%an+!X1--eORL=sC! +z2ZgOk%V%b@+!VCTErYVxmmBC6i#8`!I)qp&JlV2bm%!OAmiwY=qoI@)c^ANSHE +zZyU|F;!L51$q}YF)Q$G{AtF^G3y1qb+6bAQ=@Z3_uAYH`m1kbkHt3OLjJx>32rqLX +zrmKibW`la~47Wp66IY9i8aA4*)1O})e4~Yk<`Lvkj4qQp;q<;>O2r;*rCR96UfNXI +zY)mV@mPpG3s@ZX1>JykDCKaM=vo_RHB|UIXc_{~*0HV*PHWj&D%F0yS_~Pe*F9)Rx +zNWQE{@+n`+*8thu$i8tLt<|h4p^P;+w&YE-@dQlF5tE7VhRs!V$wqByr)8J}Hi6g# +z>x$;eEsy1Y5X#?^_1{;|0C; +z%#r-zs*F`h15P>5D20(?jxS$9ACoKmIke@dSP=O%W*qxI3MMR>CR=C+nJ6>tfa#uP +z31DieC{jrzm(N)_7I=O#%(hV?XSI;jF{+NNly?7kOyU5@6Si|wH^6-|=Tl|z2HwZx +z;5nyG0QGE^cXBUnVBHN(PF6c$g#+HuC8E@L*Z!l$i!jrQWTzI +zxjWNJ&_7dLUO@EgBD1TCiBZbjCd9vmjgXcgvG@imo{8d)#mx^=&gPh?vRgg%>UvO& +z^B|e95~O}k014!#orHlGydTM|r-TW664O>FlzJZW9x)bkOWP9ev8xW^CbceLz4!Sp +zybJjN(})V^i4#(;orD9izVQUNq|pf{`0vP5+%~wx(omo?h&r&sH`N&0Q0mqZMfLRF +zUYO)QI79B#fl)gr10?R(d%rqCDpa|zE>NnUB&K*4He0`W7&{3lSMGuUmv16Y-^UX3 +zZ;<-(gB!@B7V%(3Jjlbr@E>ueiz81cVT}l^!iEXSI0)7S8A|b~r}gc+5z`0}@l)eo +zo!xwrJnoBYjm+9w=Su|~fGx+lX!+_fWdh?v^_SD;s_wT4D><2$ +znT!x1@7{oUwS~f$xSahYsK2o#jdjFUDXKeV4dgyC|JwH03fmE|F33skjECx0DGa;X +zqshmwH~^&S!NytQ0$3hxn-_tfpC+~ss@K}$NeJs3jeF+_H;7ark8oGF{@=vv`jZfE +zCinG}p$=`HX{xQ1*C9z!#?WnDja8z*1SLV5aKO7Xo+D=EA^06D(2RuRmtmQBxzuTJ +z@;DsrjGX|I&Zaig_<9{Jg-6)k$`G@%~=W2-r~<(Y?48MUiEbQHaD +zJ>89m8lYBp5Bvq-1v19{x=e;=4w!j38cpG22A@+}QrCg#r6dJz>}lComq8?>I)F@^ +zG{S}|O?pv?ToEeXRCjxVkwtWgPX$o~fUew{+n!45xL!P&rvjKg?bn_?+pd{)yP&@@ +z$)0bYV(Kaza04O>)K(P<1gzF!*etd4+`NOUrccNd48QJ;rxs@{9f5qX`cQ|nvZ~fC +zTXpHJVt^sFv-m|4Jgm?2Xg!(7vk}@JWGnBvQEW)`v>|%KbX@kxc|tSZGXYHG{jXlF19ahfj@yG=Qb!vOGws@-dgf0f-eXN0DcRt+ZlRX-s4YGG`5t1^;NE2%} +zeypD_*LiyaDIGUvai_D@SKk*7$l&5;MZ7lGs_12kF{zpaTrcZ=kn?=biHWzzX`NYg +z%>z7V!z4=ubPkP?f|AcUcu=Df&ot@}Lnj0pzmBmpLecoSFbvAnaJYT4T*a^zuBLaA +zWyUQ#ePC3vLm&NY_v=wV$S2y6tCL0rF0+-F^Xa8k?!IJe?fH!VyZxP=1`zVqhcrYxZVQ-rln$;L17YSb5d +zL3Wa}hwY;lW_qyR^5g+^H~4z(aqi$GE6a{+U%@L|wR3DjHP1z?nHe})I9exldONm` +z$zW!7wb6BvhHszvV!T}D)D)#~uSwK$4j;#3==%8Nq|cG+Dsm+fn^<>{S*$L*-&S0` +za2CYWI93g5^-h&S9Uh=2$JFGjtv_$BYGBC3JbVRYAWe*kh=vSCsKfX@Nr_LmQRanD +zByrN~$MsZlA%_ncYbBB(Vbib16}!QC0;F|seorA;F_>dEWsXf!ca +z1UPcMlf^9uUP)t}i17Ao4YZ);Mp7uGNlw@1M~RvU5jOOC$bb})>RuS>3Q>mFZ&i`1 +zXKmZn+B@+co%?9P&**WK=5SvG^$d#hz9IYFe)i;DK>ko>wj+ZLhkiLoH!v5c5S9JP +zIU)a5t6=r_7rZJQHXiTwz6bw};pJ7N&xwht8uI%s$lDEuCuSTS$>I;s;Y0`;PoyRR +z6P+(gw2cVT48nH6AU<){g5j`eiFGqW@q=a8w}i7C3{kY-GsQBW`2wA8;*>Syw9uIS +zq?uSdZ6EsWcTA6Xd<2iDq$5MA#XyC?KmUpkq^Kvq^ON;829j@aaQzKso^Om6DszFg +z9FI_+Ggd$oYFhC>h%#J}T^?Q(DPj#RJ8tKMyr`9Zts^C5 +zSoOMGVKdldk#tZl8kP84u7k|z#%|dtVCe5DPt@J1l3(^|c~kJS@l&63ZG$S4bJVxQ +zk<=!(dQ_f#WjuQ=c2}27bbUYdKq6%IV|G2U%xZl*C1kbbH1jhB-_V0V#*c{l4!O4 +z>=M~$<|}2wyhf(De`nQJx0wS?e%Kth1nR|p-&E8e|N8Gdx6!Nbp6D&@g+z@VZ!0HF +zY^td1^_5@XFc!WBgM)>)_vOb^E@k4#z7a&&gKZi#qW<_`{j+me#wX@bi-aQ;v7AE5 +z<2fqb1^gnee*Lx=_78JK-qD2bp)Gwo1}j27Xsp%!lu)iUFr4pMI^!HR*Ow@klT-Np +z!(h@tf-V;)v0R7R=X*V&v$)=Crk?jj>r~F!l>YcpZ(|j$vzKiK7V%04|F0z{7a3m$xFtRY9tc*H`adNRAZ@}>0u-XJ9`2AN`DmE +z8=n^IdHg|fa%wzQ<)+))y=#TnSHfBVJE8Tb+nNL1J90z9Yrb8iZa#ddvFoU?QOY-| +zuU^!Ei*m1AW1~e_!`ZoB57gkYWBWbGwZs!G(w^mN^X4G9~?98bw9+; +z5dCQ7I<{hdWr^Wx!+hafrrjI&{??>F>8i+@vaug4MzQL?f0EnsE4=T9*9MJPc$Toe +zaA@s+PRCyyygT?YF8O`;Pl+U&ccT5Q*k^#7N5Evi@If&lpTnomU^cI)npcK_l<5fF +zpqx^-qKJSz!cygb&WsTU|7reI^G5QTo0^s{KP;&tgnCXTT79y=Yu{UC5Q};JN09S} +zUZ`rqmU7ZR^}(F8l<_E0K)GY>2uEskxqafNhb_I8=JX`i?vgF4_48-BClBSNh%=o^8XU^nKuj9p +zu=Dj?z9VuWBltr3B+}n0Q%6IKk+p{?&1y5fh#U5jHZ-CrRBmK9@1puY_j4%nb^Xwh +zNY(%0w$d1E{cOdfC`f-#{HMX9R(#)N$LW86PPq_8*SxF2v(aNgkN%F$ejB9$>*=>W +z4h+Qdh23UVvP7?-9DX)r$c&A+Y~ +zREyYcPq;<9!6P&A*7@$;nOYS)9j_Uy(MCS*ze=n$$wV#pVTk<)qjh-kCEZAq6>&KE8QSZS-R9tA_nxd3vi2{DrN<=TVrur~W&WljC7ndA(V^scR+v +z$}Y!)p}080zzlG-?3(a)-6M9xIvI9;DC+9u)2HGY>Mxr2-rFl*nPvEf`mn%qegm;a +z$zBX~7u8KkqHB-uR#ZjIZyDwNw>`z-tgYc3ZFSpbKlxfdAJe407aS~~zGCD{?f%FY +z*dhNY>JLLrTJ%WR{{d7$tG}$CbvU1&XK$kazLq($*j?Wx2wMRAFfA*orj9^N0QkQ?uKfmCxz&(zd{oxM$J_0>-|t38K-eSP3f +zoW5fv#wmI>~ra&sUpmm|c +zL!Fk*VbJzt$K;FRa;IH`9V1E$vmyTnwkmOA>3Un;4VQANuP{B2>*pD_L`Xr(D*Y4S +zdKV;FtH^c5g$A!Ik)lT@OQ2#2DrwEj8RLs=ZKFQc;o2@JgD}Hl|8i+x+GN#S7mE@R +zGcz;nnUcbjB0@#UW{Tl5AsVwTdAvvvd28~et2{y>X#y0^36}v1#4>2Bo=?IeX!p>d +zBx~QPp*)RJXp)3*(E3#4n=SE*DzZBwBFHgS*9slJ$k8n{?(z5J#OnAv|Hy+wt#D#sY_N1C=U8 +z<;1qc4mM1IPMtcXJa=xYex9#zO8L5dJ0&F-;m+N1t@hab`T_JNd43emeN*U{2+6$) +z21_^(lL7s=oj4&3bgsF1Xm7}goyTiBY!AzUcwyjkTYXiNltITIpDPa=qs0{rQ!)uWc|s)iW1N?l}Ss_&Z`)AY5PJT^B`90 +z@4RlRopZjc0S^D|=&Os1*)*Dkqhm+>B5mtE(~0-&5?qDW=3btUK%WV56P8Bnv3%y4 +z`TP4XTej=`d8X*q;~h!oIZHO=&BkhLFHu#+84k*p?o4utxYU1W!W5{ear4Ht>(_gx +zyJ*U$kZ&*7VHm|93C_55$?TvngefhOu_d&2rhFllC;cXC5*n2IiFs5~d{yzQvP1YK +zR+Gi+*1vcux5r%MLmvALZbo#(LG$+&Nr`XuY$|icb@@G;9u^TXXfU)~O!&gySz7B# +zV}c42Wp`J4eq|Xck(+_;xOn#MP8<=i%co_r3So}ZLwqH}mG}AFmsPgw%~M#|l<={= +z+J4Q<%B&}rLIDLsg&!M;6`QWyJ$#~epeJr_>cqWxgZigUp93L@u##9#u`ncOY=D7! +zL!8z!z7BPQ_#?I@dY|&1myY+OcL@6_I@XH#+uY3cd%4cW_}Yhf6^#doCG;&QYmU)sUSVcXz=TMV0}r +z@!HlnmC5wD(BsE9H@W+F+h)6!x=ww*dc6n%3-zBm)!)7GZnjc#}3YTxjOVj +zO2O0H?nS!`8q!5%w~I=u&7Z#ydA_~c{mzi6!kkozBKEO_GH7>{mm@K!Zj&BUUuj-K +za#S&3%F4=O=v>IA6)!~z*zk2w8FP!Fn({4c=ePjj?B{CN!gma`_Z?=d5!#xU#qO$a +zkddt!+%faC!P5va7HQ`3h1Yt({6dVW7xbCjsAnP#HIKGEIS^%UGSC9Fjr^WS@rX|e +z`h?Wf{ckE(tveTZMS9{_8O;-o>Ra@y8XJr16jZz?*{HN;S7ffqcODPNA9zx>SbFbp +z_g<~jHmMp%+wtpXzB#~l&1ri-FX@iM#6jvKp|Fa?^l?x@qQo4Tt6n8&&Ic}zhw!Ahd6Ef>=RVzj_of_| +zc;55MntYCJY^b_tra{0tO4BVNoujcy@<-x&?&NdboFKi=bDVuiz2f#D5yX#fi-hoeVuMcLjK6OntFZYU( +z$$pTaA5@X#30>;N8TmIYyRgim{BEl2#g=AC(=Rj@%k!x1lvln_GlxR!^OeFsIoy*f +zPN +zes!*2L0R+JRKnN(+Rj4B*;=K-BD>?`cS9#KFTCt+?VM-d@Zsb23c1C~&MtR@R=6Rx +z3SYZA7M-7inK;oT;M}EE>R{6@8PzBKI~yiGKEnk5?Q;>)e%3i7wTq{jbr-IF{d{+o +z=g?EH)GdP@T3ZInI5{#~#c~ZOVt#hVHZo%Gwge0)S(C10`&6`X^7kuQZyRj+Dp4KN +zQ#5&@fktVzw{LBM?keIr3tO+Zw>F85gVMz($2?ai{HCGEXu5Uy@L@P{PhIXK&TE^J +zhQd{8X^eGruSpO^(-7*rs^>H@Rc3eT0%DWa;uFBaNSVjSzmA(%CMl0Qn^72X +za8I4;7N&SIcBm$2gP7v})VJ^Jw;fVnd(~w96RT*v{|gD)@_~R!LxWg$O$CZ78%3S>S8va6w!@?RfpwVB&OBzc(|R_M9M2 +znew&v@{scxr9HF7hdZbbS+kT&skN7nSz3!mIo*0+88FVg+&g=X~nJwIA3p6hAD-M3*l*>hdO<(eQKgqHTB^_p>@@n +z9u_+%5eS6tuQM7RC?81ozVS4}ee#5xO(oG)AM>;(mbi%%ut#-$OuuxgJ+OG{L5%bI%(aFZfgprLWu_i?j(1u70Fm)7#l- +zs-f|)?A#2YM8z-%)-1BPxOler{hB=@vZ_E-c31R=)AoCfH+|mkcyhx0A~Ac$rq8|Sz3(rVGT1Bn4g`X0m}2jy3ZJDSF}A-gS)i{!@YvpT{N6cd +z_P8AAnWF)}eU>Gf6v~oKSxnY3Uv^YGIA63+Oh_?Y(=es~wtRu%q7C@aQ0DO-D9q=b +zQn;+FY+8DH)o{oWTh>IaL__COa%N=m$$AFhr>6$Hj5=2xSnP;&Kg)`ZQ26?;c!yVb +zjLeFrHQs@~lT=+k&LZkvQBkqFKJXfMrl77SCrD`B(C5Ah+g~1!kpHmueWQ?Y*lc;{ +zp3gNYTVsUy#XJ$8C_I2O9 +z`D^oD(}wg_=OrS)8ZHgfp}qKAGL-k*%9*k&U9`UrRNU6}HK6HKi@eo*syHst;QpnO +z`*-yZB^+vZ{GCK%FN#mt(H>C +z4eIte=h9lXM9G-1@`=H}{kRN;+nK)l(sd$#WBQ>W?z +z8#gt?5Ih*Gajv-j!i_yw7(?&x>_2f@MGJ!7Ldw$CZTf+MZ)a>gzT5-C*A@9L9@wkU +zxaIl9;~yIgmnFnH)6SPh)W7s_VLb_^WgL4z8n&Cd)I&BtK7O_iT})Ea^CBhk*s)`} +z?s1D|-BNn>>a~a{roU7DPWjc9t5=J{454XLmUq*tvXlZ!=O~cgwklz_mG0@#C0o_? +zw)#6dsuCV$I7%ixpT1`Cfx_n<`A4BU{*T=~JnDB&o?Tg430VKQ_PxTp;SPsX&96A` +zf9*Z+;ni>N-hE)dN&E02^Uy&Z=T+|I-UYZa$Yxq!i9uq^n=_rY)w&B8!V6L>_9-4$ +zva(d3yW_BpL5A?_!Xp1$WipDVKp1)M9KGev{?(_rvVDPvA-g3~c$FvV33<&A7In%r +zt?V=3f9S<@GfE6_LE77W`}$UGc1V4uE>hglk^eyCTK1fWuS4gjxL>B{ +zg${fuKcaOTP?WYiV}+Sg$mi%;f3@|9Vh0# +zCN0a5+UmgN_O0^V6dxBiZPu*d3geHrN=mrnOB0hf=r1)4$=c>Tp0G}F(W3T(&T9p4 +zk~W?=c`~tlhoMQZY6JekZ|iSIIm(%C{sP1b-Tv*!{0O;%1d*DA>-pu;(b1A~^c +zp8&ydJZY73=FIF#6Ea>nJsOvY-ML6Q$Aq0;wO&K!$qmgmdukHbdKG8hHH`X@#w!0S1*N>`DomL`t{PX9}U%q^K_wLPHlMobjLdx9PJs$|-ym|8$ELecWVqthGUV*dRAT|1PoV|&Dz`MiOuMdX_ +ziR_eAFrhw#{q=Y0uIQ)Z>bveP-)@6qi +zo2^yqdggIn+r_98Po6&2S+e9wRaN}KgZ-_KecnCGT4)y+8{5>3zIL2_WF^J4e#(`X +zG@ifhQnK`vWVdEpTU#KvJ9g}djEpSaH)C8-&wbspd-uY7ySlsGvb=We-Me>PVpLR= +zZbOho(23rVO{-V`7Gk+#5L5M{&23RjggK;|J27DW7TkgbsTmnLwH+66O5s*}=A>p) +z3+gvFmrmZYWs8D>LPveHUF5_r5e?{N1OcMjinxSs^eZyk;FME-KTB~~BT+#(gf7`N +z$v4Vdm8w3sGA*q}A!lQs@Ld$C4T{#v^ +zU$h)C1QUGGBDp>Y17VRk2nF^EhVeuP*qX{@bNHna;Q16JfJR1){TRM1Qs4qi{A1@F +z^!aQ8-p(@9eBHMHuIIo1==pydgMtM88+yN^uRnkOUsH35uI}%C|F8Y4|HpsiWu$0n +zZ-JIMfl*q+4ld?41Pd6es;<6D%R*h<(%BMrRMUWo92SktQCG*?VbR7vSSp9( +zXP~Yg7#OG)sHMha`KUWPsRyAGX`&+qhpKGeFf|H?f;Aai5?;_gh*tpK0%bo~6}Diq +zm|PBxfxz}G^cS%}UL2S#ex*J$b})lXWic5{E*mDI-ImA*n^(cahD#c$B+s9ePGf9< +zSqR-2%jN{r5jGV;I9NfCqVM45^S>X9xgG%^qFVq0phjl1vENnxR7cO%O)%m{z6gf| +zqr+9vx@iH%qcsnl(H}s=f}cYhfBPx4AzBlh#YQ;BF3wh}dgv@8mF@+F?u{t40GLKG +z#-f8sVBah(TGV9ZDgcebC3CRo>OWlbq%(b(*l(?u{%l+5cyS||uMbS3b5O8RWb?+u +zY!(?^T=07z{yurln!s{DTNSN>ik2#+`Is01(lQx7eA*eQ3(kzxd7u5!cnZSTc{C;i +zYw{1M&6}S81{*1=s*XVytf~sI_zjI{1@SR>Wsm}BJ|sR6fEzVO_5hABMqK(R7me<5 +z8PgXT-Qu?nkt4T`UOv!K!0+WtYECkGXBBe8%<^*6dDHrV8K85o1;<5 +zLS@K;e*pgsiAL(9R3E)QWN9ZU$G?fH2EMWm^rfi*Gb`oPZokNyJkel{_i?EB-S7AuMW4+x|K +zCCgxspwEVX_H7>i_#d_IcgmEnc*htupw`jC+Ca-LM%Uq2(dO$zbmDJ15q!=s=fyWq +zG&WkalE(HUamZAJ1$&X$z&tP+z|0Da1{>y3NgS9=V!&Pq%EG8`jd8YcP$xLR{Ca6@ +zHJE@3Ji^BO%uten(PPm7e{h%#HH5-d-%Oz)K1`JU-uznIBsz*|HWLts1NZ=#9wP6U +z#|b190t5!)h_Jj#WCZ5*aYrwW00H#P1~q^%wCEc6Zzcc>xF$Ym+Z3SA_+$86<`*h~ +z!Ri4t3R<&M(3Oj4_0U?aXmK81nNhGK0h;)r!6OCxdEGbIXq7Y+3>L!nW1{qgM@&A` +z4}}>Z(1$u^MhuM+z}$fFHv}-uA4x%lQ2+!$r4`yh2P{RW!yv+>BWQfXqdUy>1|RU( +zKx^S)1ltT|a(U$8$tABZ$Y1eR)PqO?B!E+_i7WqL1leFFB#4BrEWjy>)KPBnW+4bb +zhc_pX#6m`}#NQAbFdh5{OiusC&caGTN5uUZ+HSXlVD9fSv +z0N{Y2ipP9`U{Vm?A#|o6ptit&0ZV8I7WqLkzFBN^oo`nA2k8(n{m9+u%xG0wU>twP +z=wmd6H;etFrU2krp`WAc!G0iC{T{h1i7<)Z)diJDI-B`jv3cH#Bclbo8M~J;-UDwx +zV?2ma?D4jQ79Qe{U;{Cy2ZKNVW}$@_t7-7*44C7uu_Br23ltD)ozQnxZ2+SaLPvlu +zg0*=Fn@{uRu{p|fJYzUQ-UUCy$fzHLjve)d_;{euVKSY>W`B1VUqMqiqi!g`(Wn;+ +zyD!#ICnA38Xg?eepp-cy_f!7ZBJw?b5`_Yk0Ek28FW_wgoTIfPDQE|-AD8^ActQ;& +z2otdYMh(8j7==?)SKXErjKZn?_uvF7((m^mqJw{e84cJR#Al<+qN`dVUO!vaipFAd +zU_Y)Gko^&nLppm&!8;|X-5H5XyANHCbjkHq4j`V{D`pR)f?g1Z&GOYnD23LHqKk*OFe +zlMaLlzzbBmUoea2L*ew{sDKN_CwVZL)EX><1Z6AL^cpp}fVdU{w`-Gr|~`~+Zr*AnboWXCI3w^&cm4@@6OI;^Q>ps8t~r2)t$ +zkg+i>!T65Y4>;oEtb~E1~-A^6A2@EouqlR(j^;$whHE@Z=3J8*Y^)QbC(7V`vG!|_naWR4f6k=YEek4Q2;}8z>n|eaI0z+a1j}RZFy@236i~+9# +zrUJ$UIs^AQ~X!9-$a_l~6mV?X2@GTLV +zqM4pu_PM0u#jzSYLo5-nxNQw0+(8JE5^L +z-dq*~EQ#>O0MTJHc`KsCL9d{|o~POt5gVF>?a(wv&TB5f7HP#Ms%}5$vqcW+-^HPm~&1 +z6)XkgSAr9mxXjGPhPM>j$I9M`2cLz#gPRk1K(}fco_7hXXJ&^nvv4NZ+o3o?yIwhgQykc(lk@1% +zRRkg)2b(z&h$up=ob18$C_2Fi6lZoAFwPFop9MuVJcc6R7WCYOi2nwQCEm;i%tb^Y +z02eSLH>>?LTlar1-}!wmj^CbRi6G;tr;Z+K8ffW)fB%_`C+1fJi2t8nf0Y0IE}r|x +zYy6A)-&#M(|LSP|dj9u6^7{4s@2|A+ue9;6wDG?l|9?JhEa2{uMDgEy68u-T_*b_0 +ze{;6@zy0ywv5)?YiU2zG_hRtFLyr861N#s2nly&Dnje>}%AzsVyjbd+Sxhg4#bK)Z +z(ddgoBuDb&AS_L7H9yLKvG*k4QB+9>J`|=wWbr;}MuZ7WCX<8^jD|IkK%ybRB!FCo +zPNtI#naqUg8DazkS4COzKo?mARCEzg@jyYr6Zu&|1Ox>ISCn7T1r`s)1908Hs@{8j +z%uEu90rlVXrzGiqXT5s$s_NBIZtqtE07gH&>VQXO7d?h4W)kTKp>?u03JD!ysVa-1 +zsvf&bDm*?bR;K$+jKKDCZ$&sLP9Bq0q2&{qaA_*-X_=%oxiV0TUGwpf_5-F8MwJz6 +zD%GH`PD0&@Fh7)4{{%14DAaG63_7LUNOMK5i8G9@eP|e1C+jmO=aT!YvO;<$QqPhm2-_%AknF(V;k2*Tn10-1 +zUM1$Ih07|@GLBmVvt|rSQP!P4M=PS4DJ8=;;|;=7ocj&ip6hnzm8!1>KKTqSJe*0o +z2{gAk*G<(=fX%r}%2CNy4FIQVsPgtRw&z|8eq?G| +zxEk>Sm%7RiRimoov{8YL*6X|>7W1SCYP>;M0sS+7#Vy@KXo^>+qW&J~0!y5U+sCi+%O1Iyx*|jq-D9;(}68Isj+yh9OQY)i^ZLT7=S(_-L9Wo +z?emKZ0by>mZUrs7jESmQ>m>y$U?=TWT2V#!3IGyEW{Xi!A`@s~o{#(RiZURK!t54y +z7Mk7CD*~1ID~G;OK#X5sAW6L*sIMQWE#(>2y&~8sTspF$g(nBC69-KIkkzuvfIiP! +zPKnbSS`-}^ST%>$bZAwu8nVptvxb6UG?u3mk0p2I8BncL;&o)aLt+IoWIJpxkSHhz +zD?3I@VHvCFcTBB{KTTkRCY&-$yvn}g|0bjW`it}%K~GBuh^oVf0}yX4(1Qa3FHoJO +zkQL+?q&PL`CsSP?ac`1&fog+Fjj=j_cRn@52s6H6Hnn9wyllh!6LeDXdz7HZ*aFyM +zlK~Dtbhy$;j%^{JRJx8?O<4nMfL5RZ;7i2;-Sx)2$2j0kt~i#PBIF4SBsM$8NIIV4 +ztQsaAy6HXZ)WLo@%`mi(kAYr49;tKzg=(shd1#ykF!>RQ!v{t(F06%!AT+p$Y&_@^ +z%U#{=q51#t!=c%TyHQO_W+EUaSWX +zV29#|Ll<3X0Iz}X(C>)(P>lICt$iT +zcgpM@o;!!t_!Pg+jzMR1ZO$2(YHtMw;Lv#^SSCb*P+g4|>5xJFcrRg%v9uw*2NO#u +z;l7c{<|IVM2;3^-7jh2H>>65YSc$ZAFmF5*8@LARE#Hp^6u+ +zLYQqrX;?!E${QjkjKm6p5u@9PN(PN2TPQi?tyYPx)dD`o_Zp3mtpW0XehD{}X~6`I +zX1J!QK4?D1+2zUX>6Y%#42^9+sPmB!_)aQ#(=P+W_}`~607K6G|gm}Vu;bwJPwUf^0KT})+M +z1h+@jnN5^WR4%|e^=*!JA$)W&N22aHQB^{}R?WPO%p;XVb*o51_JL%R8N(%CHXX8D +z#bFi+BtxG0WwfC_$%PHWB0LnSXdK2j9&cETwo=jf7!?odW_8|}vttE*gH%dh&GPj) +zq1pbYVT9T@xS%P1SkBQPf0KA)nor%;&n7Nu*Yzb>inz6?c=yh=5|23)l}N_$E>Kcg57kT7I*h0jOgnh4=c&{9R?F +z9x3WCQ!iwNgTly~T4Yc(_sF;htEPZJ$tKItOP +zr#|~nt0BcN>!T6>|CByyNfGv+X(?`Zi~Z-xcv|c~e{K8E76Z@|XaL$`|Jh>y*%CJ3 +z7#jNjVhGA9kjd`T;`bgkfEMG=lVSXc!nSEiB8@zCZ5^5jYHE$b(j=fBzBVA!%rujO +zr*2QBL~S$+-}PxxgQJ{u^#sS^7$KXR(AONkFw=uq0dzwlw4zM)ZRkZ&Wo*6% +z4w|fitZ>osgK5I?nv2e6Md%Fppm+nWD@w_^TgR#x1E9O+sOxmDJ!97-9@brCGba6W +ze1jcE%qqt1HrJ(Dhr+dGtRKBevXP_)g$k*(^*oc@GMZXy0(H}%xCc7a05=JrX +zdb}YcHg4=N!Y)oJVuu8^;xoVBgC8D1VwcNx90)9~@FLNYqoagq3M^oQ>$jtxY&-igeAPgim_&Brgt=3rj@*{OuIMHpb;E8 +zn+&vYPKKe5(BvwnCY`c~V9Zsv#y&J6Gl+cv1vQ~9wrpOQNhlojvyk7`ttc*^1py%p +ziMdO4q{96wP|duC_*;YPNNUbwTgPmELCp<3XeD)(>u+WihogPL|C{v_;e6R07o)fa +z-@qfr$Fvd97!MF>#w-~V(bxq#)o0`+GN?PBjv$c65gf}tn(O_!nCogXe^KrWYn61X +z)i62^#By{z@^z^VB26g`qj`c$j&3sEbhdG0b9TQ4YeKCe4aeON5Q!pndS$#k^OC^? +z5^6vxRnrut8v%At0pBQS4K*0c-W@Lx{5pRp>;{f!&&IrPZ5UXEw7$ljo)Uq~fU<$0 +zM+7Mnjk4<(x<=Gl5Xr!ERyRG;oSxyk#f8Q&9w8<|SO5oVH62bC(-aOIhEm2!MyK8J +z!z;q9y^+(3t|`S0Wh9&ofLK6a@i&Mue`XG@apdGtldLdtGJptLa{|Gk-x@azh~ZF7 +zi*too7oX%ScHQD&KDTfWR8xzskleHPcIXaE-QXurUHgIcxRrpBV6|Ls?B)*BIa +z3zzb{zlDps{{h%0HdEW;!CM{-=p6h0hn|T0pWg12v^Y7nna2_H`7gi!iMjslw`S|( +z_}4!*sdw*|^*vO}6imRW9vkUumZ$Twkp;=nBXng=inA=13bB&IQ!EP@7lq5cm}C>bj!qFGTafpG3LC;dxL7}2GiMi +zg`20PJGmB3{_*`48Aj!ZK>$c)Vf@IX3ZA?y=Ag-170TDv$9$VSJUQoVsn4|>&;kh+ +zJP(y2Xv$%K$m=t^=U|WrpBhrF?U2L_t@QM$H2?`ziS*=VgXpdyv8|FBh7km{bc*<@ +zT0*_bmQb&3U-67QRKuK%M?S7(Jd(amd5}&D$(j%mkX3fXG$V-TwTUIxPY9NWCDq8o +z(pOIElb+HyJ;^PPt6+(Zh#8ieo8B-FV!pN+GLHr<+u0ktgkvpKDS)$T5~oaB9zqDK +zL!^*8X-OSqY^>;UNW|q5zp6kngkd#zDkY%A8^+7L9CxR5;QM&8`$YlJ&}ul4yht`1 +zn^2HuGm)G&sfrU24+EGufTYC7Pu2@ElK?17bQQK@bpUoERCgv}Yp_*$3G$q_*=)RD +z-WvRc#n9SP|K#`joYwEck2-2n=%*8`bCjd~FznnQlx=uk`fyd22M43!kU5PN2E%3HyU`97X=1LASN^-iGeYu&t1FDtufKw<6>io#0uj`J{vCWd7f7GZT+@0#W4 +zqg~a!+ZZ5J#9}{aYA7%Wz +z7gmLHmqzDC^GlNpIiMFF%0OT%QWh04cCzWU#*oBSwuetdV}c-6 +zs397MwStJ)z<+m2ri%^S=EpJ#1}6aqYxj|}Wu;Wb)?X1m7tGH{vAG2wsYgGh~y%X7A}^{$VvBak7KJR100$nCoJMtj9j< +z@pCAEKGed!V&@}eVRUrtGq-AlGvaIEqN(dMDKWWwGf9Z?Z-l;xH<)G_os}pL0Nzv( +zGo#h0l;0(U(lbR6t7Ri#fGn#F`>Ql3HW2pfau+3bAc>Dp(c_8&@en3k{wk2R!q@@C +zrLM;Kn2}*;BDX!BPzam4F~e@x|9}-if)kIG1%)_?3l;O0j^|Yo3YN$lH>_yg3W9pn +zyA|jriVsS-AX-)iBiQNhXy;|fNk$>Wl?>S}(UqKOg?LH&(M#ry7z@Yi@rBcaLOH1d +zTR6cis@I2t6cGmmG!g)7l^Ri?LZQ4PBF}s!Fy2i4fRPY90d&t-s?-RZA|9-10t2By +z5(n`8l`d$`6R371x!v({Klw8FS3huU^)4j`G8?v7_~Y5z1dT>9#?(zLjKN4FTD1Cu +z;w&)@h{srVUVtu*&3@!I=98)`mQV`QPirU6h55k>HH^gx9hnn6)Ek>MHbo_f^N5@; +z-D4Y*wH;%}4k!bATEr6Ih5ci#eTsm1xOq;5&LcGp+RE0{aNfa^57dFztS$Q>Ixd?G*s1&Fe +zeRHu9=|vdthah30?4sM!Nve%&0|a)~s<-Lo^T`Cy(}{PCUv2 +zw=A{0o+#;Vz=59Vo_tvJO5ocK1QRM7;qAs35nry~Iicswmoo6Qzlg@zzyQ +zwQ#j+w8`{sGSg^c3($O^id)Ap)irB`uO9u8E~HE-60g4`!PY_jmIZJV>N-V=w^PN& +zOG-l75sd|~zWPe@;fpn8vm-rfRfsi1#{>q?bcnC9@Ct=R1Fw+Th+#=7>#9^1HYsW$ +zxFsZg)NiZ|v}XrMRLmv9dOb`P@E|su&IwtL-q_oR8R$EV-fR|x5XX?smXILWOuj7o +z5oI|7d6+E$2p&~SuuI73GgV#G>_gBe8r}(-rw>E#7PScU(Yym=H8Y$J*{F6n8xXsl +z=H6y_;ltFEOqNeHY-GJbBbboMGo!gjpu^-?ZbM}ec+iA2;z)xX<93lIMQAHVv7dOpB2yrjROah-hN +z*}}UV1!YKwiXrV{5ewcuCl|lGe`@G>2Ed9r3=Yo^0;-dP?1U{n`L|IQ6l(+{x*{$T +zQ;7#L(n@2p+S%>I7O0W!WKE{0Y0#ZF=m}7j;SQXuR(Y~8Oz-Pa_k@k +z@XG?ON{GIsWRe1Y_sYFU|6mepfJZM;C&1cyQ3Gvbf;4gGq?O>y9Vyb#nQZD@5c>>+ +zWKt1o6Ao-WXqAw3M7+iNm;f9K@;O*mC$vJ*ZS>BB3>_~`U-XGcunjHy&IH?dNosIm +znDlC08G$YJuZ-NJrRmiy3j;(~KtMnL1=vjABEV*Ru>y=!3e%k9qd5>3D^u1@dBizD +z!iNdiG##fIfcy-C+-Bc*iPvRMFz;|1tEnReXLKbL{PNxQd}fqCIw6qWuky&BVR48N)`kaqy$d@ +zzOWGH^jfP*=Q~1t#IqxvA(}ctw@fgJ56ufC>)NTb92%|RaV{U;uHz-%#u&6 +zI&*7bc6>?6iSFKL$CunUJ^30HvUc +z@hK8hT}hI}L!6{bw(2SmNVy46(ZTD*GnA8TWi@gPv-21QeSSGXi+bNc6?`d4Wj3&b*#1vWj*S17+B+?+W&fXyCu0BOsuK;M4C85u?v%u&RP=01 +zPD}6IC&IJML;%XtN5f8o9Y2~jTxrSLnP>o@SRHQl(S&QGW9{2t8zBE>Pt^Vw +zSqPhv0cgbkD=8@@^88OtO6}9K|4+tqN!P?uuOCir*rw(3C^@0rpap@Tw?ZCsxzI>d +zPl)&={*ubQl0-S%?8U)4?gP)#IbeWdBaLKUSaG>rcIpZk`LaqG_P*Xe{9XcM$r!7D +z8f&~Q0p=lNEc}DP2jy=3?O2IxK%(oWCLKd<960_F3C$ybRh2=+!W(QI^Xn(M|7R +zlHFJ{)bS`Z(a}ZCis8%M)|MB|M$c{^{jtcfa@BY!Tq-}{y#aTcO?Jc +zCoQ>!|34{DbL;Jz!~d5xfZax!;gk!?oX!ca7-VT<7?YoFVfT0M*{_J@&`cw*d$L^WnZLn_AJz{pH@p2D72 +zH_tS=O5&_DJT9|Qwz-_iWEBe1J7G1f_r}d9p%sx=$?}JgNYa?-Jr3>F>E6F8qwX!uT5Zo<4-;3KmOY+XFooT>HpG_lOxZ6;1^rY +z|C8~cbt&EKnRDuiJnY#h1Ttd7`?8rqFUTmJ_{+7hCtDm|Nx9q=%OynY7L9BdxcKU`Vf!&Em +zyxR>_{+LpRTQY4O-};;OKgJXXu&^vl%_#vkA^wv)C8yLSWnyHT_tbb}+ +zpO*DM8Bc@jA8sB+(DAQ-pXB7!mi0dwPh;!PLu+WiBn?<2{9kHXTAFqJlim2ah5tJV +z&##>S%f^#`<%N}jfO|!Rd%w3tUd@-uOOF)Ml$2f;81k%MmOZU!_o5y|GMnQ`^A)j7 +zO-T2J)n!&+&hwTAG4i*FZjbj#LxO>dpi*5;>B|*=MOdj&o0RFx)SFA)|4b`hJ!B<0d8cOWdP`&ySaWzz{{sdeN)@ms67S>DT +z(C06XDc@GT3vs*&vKnlFOj#(iRe%25F;?Waq>AX-`0E%OFva^feJ^KQequb+t##L*lx_MSd0dmM;{Xl8_A7j +zYkG1lYbt6zw=%YEtRhR9RhiN+%Nqpn!+zztLjnLIc&(?nC=ZAz_`D@v4ughLLJ!%a +zx4>L&%fdm;J3;l;QAAOe&_fBaP?J2}BE?T5bq`>**Mn`k8cGW-G&R0*)YBNwRnRIL +zfnt!9N~T!B)_KD+ly<>q_Ejimxb}t0V8jO(i=bls?Xu`%*uynLEX+%#%he;Xhs(vy +zAB>0laN9?Ru$l5$;l*&o&4#5q)wy4eNu@L^N_5!S2wvRO5p(fiwmjOckSJnl%z&OxJ#ql1m>mtd=SB +z`+s`|0gEg}R+g!*WM*xhmgr7RboZqk0;%aqNhc_WKx7gDsZsgQIK-PSV>B%PB_*Y} +zQzGTR^^Lx>x4i{RHH`27|IKhctf%dne7h^TbH +zEi#~`t>2CeXiyPs+@K^PZ?c7cvDCM*4h(<UTC`r&qE(M0v3QfaC4hL035Hw`7`g#K(l?PRfUr`>aRd`)Jmn()X +zmFih$pRvps*%YUj>Piy*n3qiuaV#nbxmdCRERe3A&(DjI)PebT$+;nzxF#EGg2!P4 +zy%=O4`!Ps=Y~;`a;b0j^=n5Jd%A&5w+z51BY6=OUUkR_|fmoI(K@G;dmvhU>>4PQM +z#uzd&+AsC`m7rH8*Dt*xEFy^;AWt_BV>-laY1&lU)-`5uE9OS&?XqD0i=mHWpp=Xd5@We*fdzvP?J(& +zs6iZRpJN)T;z2CZvokBfiZG)gfoLYye7G4~)y|VDT9qq$PQ_Tq73);criMETRs+c} +z_dzcjY`zrE97>O?2WK;Co9iAksE>(_kJwu%irY<#l*GoWFI0+K;8f~yER?Q;GiDSD +zgv%=R9P1}~Qf|wn+!2#XPD;E=@yD1H=J{>_gWYm}5ai5g>`u%NOu&YEM>ix=S(>-L +z&es58K%T$ih;-gIHZf&%TJu)0ti^I+pi~XQiIuAc!OIbxsMB`E*wm%+z$b +zHK$K;pt`%lK4|iwuvb&GfKS0=g@QV>G^J4#vmW8kYWt1DcS_9ttulZinlW5&nXns= +zMfG&%oThGK(8cV5Xv)=rplUH+XHH;}Y0r6mp+GtoNyslqC>oMEIH5QvGym$MD`O10 +z%pwQ4qyd3ymgy7^j9S$P6j1G|pW!3mBtfdK_%sRuRVK0|^SO&dlP7b9^E{{tOG7Jo +z8b0Q54kkV^$=%!D58olSPbDNP +zr672QG2gK4M-{NfQvaY{6#n-Iq+p;94i&FTIc5gs4^8l4idl5Mf-|@rh;C42$2w)@ +zvMS=F@qokLa;&UG>lg7T1ChdppaZdr3l5u%w1A0$cvmYWrCwg +zZ-y$fn0;3G!%Q*3D<)Rd2%<7*NFI|$qd<i?z8O)P^@I`_SSS+U8+*mng|(P +zLIW-ziA)~gPrN=hyHb#GYhALWi^W(>tMLZCLS-PJfkUQDMM4EjD8mxNL`)9R1ruy> +ztU#pTm_Q&z-{(reT^7s-L;r>~Ha=2Jasw~Y_=!HfO!MnuX=p6HIawrC_$+DAw9g|~ +zU<#HnOrDMrRHk_SWxg<_1H%a^H2}Ywpcj*E>j1*#fQbSoRI4n$kcc|Nc>zRL1Sud? +zSkE8ovcSy>1%4xfbI=t#xU_l(Qj4NTvMPGy<5l!907hgtE-!ydi33{ +zt8aqHch>YX;sJC==v=Oc1W2O{URHE705C)iR(myZ0f7*N$yHE}E02>Q3m_CSx)rLE +z79KG~4Qc_u6evZO7S~6i6=A3c%~-Bf6io}1dFjH)vIr8L9GFZQs7Mj7VUMRyJSrvf +zq;(gc1QJRnI^#6qh`>=;3oi#GrRGDJXdL66G)^Z*XYiK8aseU4Y0*a3DxJnH6};4F +zcO%f9IFCe(exUj=QhyE5F^O+8F*+yP{{e&z^v^-0vA9>TewLYdF&$da4_&fbG}s_o +zfO;Hfa+o#jHsN6Ku-wAw7R+Ti^&&R|r$iW3!dP7X2_#mSLa8b-xIy!M^<>9%-IR!(D +zWhhaYnO{6YE*L0h=8urC&dtwqO4-*ADaByrEgS`Ge&C +zP%porSkB8GoLdZy78l6aA#W--8|n>|24@!z$bmmI`{(B67LRbs19OY>vCVaKz|g$RLXc$(hZGcLL-$!yenEb2{=h=$C3|poez6OBg|6i6Vep4sl#`j4M_pwO +zh0zz%_>2G?IR$xH*@Z4aGp7VA}q=N4rHT`9~hLVye`EP&<_oKOQ{mM=lQ +z{A|_=f?Bq$2o%A;hZbcUW68?S%!9Uya0Ku|5`|mTnM|E&R&bF*^RlMvGaFE6{#Lb_ +zjq3j*6$nk}qhbADvO6_7(*G~1PfPr#lk-d;l0WD)>3l@H({gjN3gPEe{J&jm_&0C# +z_w(Z7Na4i~ +z4x9Y^8tp;thA*opPCR;T_3~}QuBcuD{v&R2(iXj|~X!~@HJ82Q!tAAk2$ZKk`!&3~MeUQ_h%R{z=iQ~cEU&kI`R +zB~6jW{`qiGT+!QI^5WiqYRrc9>*wry+TG)pB|pdA{D*dJ9{tbIp0no9pC4TLk1bnf +z4t&)6)Eak(%y){XIMd(hQhD)^QKRP0o!hJP^vd2lS5$vk*?VMd?GFpDo_%WDwz=Kz +zE$(?5Jg1*N=-|IU-#9m~`+fO~fCydQx9{8YE<5AyHw(hj^X|b_aUIrd+_>@9TW=jR +zW=yxv-o0BFe*5{xHM?s%oI0Re=e29sUbCclVPW0gt(Ts2&g|t??{}X5KX1MD)}ce8 +zv+qdNKF^E0vZ|_T@ZdWaE$T5RZ_~PUiwZSNHmg^!w%KgYKKrbqDBHGe+q-vf@AIq2 +zj{RiOLpR>=&Ht_~?(xG}?=C)d-JXN*z4zYIQ7i!bb0yMKGa;0~>Cn%aLsT->UcUfMP;46Qzq)w$i7 +z(xpjBTefcPJZ*R2wSTWzx$?Xvj_!{XE;)L1&@KJrJGS*zC;T%cb*#8{?E~FfbvXU> +z*|TOXU$NqUYhHZ#VR_1wDc#W{w{MS|decp<(&s-l?1}ZBWs4Rq8o6}f4au--?c2AHi@W>H=T@v( +zv20oY(oes+{^E--UN^N`wY14K;^^|LH^*vWDw9j0(e*O9vpI=0Kl>{dbxU1tPhI}T`|p3hZsx4<<6m8zvGJDn4=-JM;NYGOyLa#I+O=!n +z3p>UQ898#_zI{?04EgETem=7I-9^tm_uQk8JW|v5!Zw*#E$kdOR#BeyzT3Uqspn3c +zIB{aZL;c1S6|LD5+#5Rb`s;CVuW#6JM^3k0E43c!>F3}5<_ph1KYC?QT{G>poV(h# +zX(Qjg!L#h=pKq+FsQ9ep;=9|fd1id;Prkivg>U5zKloF|ty`78dgt=lyC$Xl^RxBm +z_MFvsR_k?}H-Ayncfo=M4=i&Bc3rV?3=o7{Zn@=-a}v|j(@#C+6z?00x9#gu@L=D| +zF6+AHtX{o(wfj@2!&~+qI(YCPpzOMJ>!5JSjfeNFz2lrSrEI|UYoB@jo?!<{NUA6Gwp+nCvTXyi9Z$>;@x_0B-v;zkY%yga_cV#Eo0mau| +zyKYZ#)>W#iE}TFAqbEl^7Z_W$1(so_HX6@QjrtLm- +z=n$a!%$YNP{PB9vBsd{MU+sDYw%_@8etzJ*WJ!pSEU~8JNd}-4?R?p +zle6x}d*;lU0~2V~suf^IpFVva4IKDr;j2Scj_P4)< +z!r@kNPcB`Wk&$uPg?HU?#~sBzU%BDC#}_W#GdJ+6E%ToK3;Nc6Il7|ai^m4feLMNe +z_fF}sX58|T`=2~_+U}h@cg~wP@6}iPxn{p~!*}EU_Q+pm*J>+2Ub5})6=%-Rf9mOv +zzxrhCWj}AfB`veKXZVXv^Pvk*@|^XayPi4<+vw%muP%P%`L3O(&rJ*TyYZ(Vv!b*~sgjy>`Z-r`El;E~m?RrwoRD;c~lc_PjM~-D~!l +zy)Sum`=QDyN0yAPDl7Z>{C7V1;I9upc-M@NCN$1W;7`5WX7hkM=Z27yltXR=X%igwS +z!KFR#YxB<5t@qx4|BBMJf4=nU`{m*HwCd6(6OeOuVo66y`t$9#zZl+s_8n_SJ~MVT +z9Ers}&r1IEqBG8FlL_>4ao`r^#V4-by460e`mApb512f8%_WyywWQb<_wbOf&y==o +z+5`i9W6jO0%TvaTu6%6&JT>{b?{b4H?_ZqPIqtSK)9<|VmGPfWD_qi{efyi`%D>Mz +z501yXyZrISAHP;Yp+oa7)8uyd=5%}D=QnR3I`gJhBd*)E;ZJ{B(W4-}XU`js93ABD +zx6V`8y7jepoV~G~ZG8Lo+M;*w+&jjZkUQ{-g=e*IpD^pgoL0rdhiiQ=lx}@vPtew; +z|GGE&KtbHH8aKVi~?%r|W!#l59xO4RM+3Sl}u3QTLwLN{;h~;lpz3=k-o;>~RJHL73 +zR@di8rk&D$-kT-8gWa7obL4h~ONu*B_W5OyE8MNr#Yd-zURkOa>JiE)~-@o|kbyLs(Ak_E5&sX2P`okACZ+m*_h38$<_wp`h +zP5)c>S6%LRo_*5y!u^{z%dKwDdSv1cU#|W8-|dfn2Q=)=v(J7C4z=(9wIgooV~;&{ +z^=ubx#iz%-boOm)x<2Plo-LooVyA5Cpc&wEDnESfKNGx5c1-(lV5f7}rQdi(y7TQZRU^DrXB<5` +z0tEE>mVC-M@9~){4y!R_|Dr{oH%E&A6!A=UcXH*^#41 +zUwP#f`27Rl1VveJ+ih)^O(W$o(y`?h+vzMFFB-Ga?8t?H&IU!M8a +z2f+c0if+&P>6MB9-0xoXN`>1QHrsi}@5ATD6;jiWEKHjlo`kSA^{#pH> +zgo!(L?)2|^dB@hRg$sr}ylK&c{SI9J>77-l{U3W@9th>uKR&HDQreSBPZUPhk;+;U +zN}{VxMbj{Y2{Rajl(Zr3t|aXx6|E{Q+_(|lZlq1xRZ5Fek`}`EobxR6%ox#od*9#t +z{e7=Liu0WFIp=)NXFunBPPc~mgv(pzpG;yht0!+>JNRVk^w%p_?pilZ@qAO`Q-kbP +zx5WM9S>20&*y3GSx4X951p((Yl=sKDzM|0 +ze13TN;zf3x!s*UkyLtc(+Fi|U<@NU~9W@7;pMHHS)zxAiTQj*U!^maYp%PP5(_XP1 +z8P^^?YJ7G%{>~lOBC{dw6C4JgKWeTPJE7meZ6OtouQpW}YPz`Ww6|xg7}pJpdw*%Y +zt!4NrOR%WLC&vuxGvpn6UiOQ}7v|sUiS4&yL_Yz_|L|emF3V>gnUk<<*SlxWPAzE& +zUolc|{F8}}j<3rv4W5>CEcrv14Kedo4o+WSIlwS7yXNivxo_X-7P!T5fXsaHx@4>U +zhIsRLX?6Q2&AYJdPr<9dH-#HuDZ(GqHTTDAE+5FPE^HFxrqifd~*4K7gF0!j+ +z{n~R)%AuJl77_PMFAuO(wNRULdhOsL?{dP@M{FzFcYUHx-v_0m-DckvH7%)mex+oN +z_t2UO(}(A?iV6zmk5F8zGOFi5_r81g?(N||@bxs8RF+xYc!8j@V@kWO+eR1HJ&W(c +zW}CaW+vHH2FruXC%cX{D57*!C)K)$8pJQLW-*c_b_-TC?M?`pfdfLx@zQI0ad0ANb +zz5F!^y{l_o=d+kEt{$0tvOszA;|tbb8yn6P@6;P8if9OL+70$g1N9G7;_%_apFe+I^P;#knQImN@_KAj6P~pFbNG +z6`kp+q1JVb>4L%)7FgGv`Qe#VFt{T)lb~n9&E9UGK!m3kV7M +z1nifcRuT7Z-}d5gE^t|aW40$Jmjh|;s@sp%|E5DoNcq(rNz*bqt+dmy4BL3nS23+? +zm*u&+4~F;px}`cd+1}tqk?6+FRqMhH))l`1#D0O +zM(L6RtD-r_J?%T&9l3mhccrebF742vUv2hw-Mw$$Fkl2!6eg{z{v6$H;DZMbSS;3h +zHOqT+KIQ{;aN~x~8NrSfbzzQVK?ryni1g%1ZYO|i|S$Q$cBqO|MKNaA79^Tsq<3xI&|m|w_~S;nh-d}nG61i)97Sl +zQ(&N$)G0KyV5Qyg1RdqU;VYk41H%p|msd$|Usn#_IW}^ho15dFsTLL%z>A5=Q&3jk +zuxiz{npNWrzvU?x7bb)yU(dNJ=#e?H$BU~8k>3Kxtl>p{8h#6ypPxR3xJR4Tbvzzk +z`}*3oYZVn01qB5U9=LJeol8ud6%g=#OG8)H?E0#^oBBu2pD8+Rbf|suv0WCkzm09` +zy{9P*X +zq}XzgZrYZ6(z_x(edFa#GiIF6tO^O~&h<`q&HxOb?_qRevx(Y{_6H9hyyjPN;}0&& +z++6(nqrtqxtjQ;)06Wj_m9XT9>=X;t6beNqIAgPilVx>o>7ff +zLt^q?&DJVCr?%8@gJ1#r0qdue(6POBiVKhz{I|{@KFrg14-fJ9a8qS(@_E6d2Og_O +z?LEDDNRI%;5-XDtmFxbTxc<8Ex~bxFY*oHTy6a)!r2&&1EG%$NfW=zW`DI|)b)O2| +zk?R1#M>b@PvU*f@_EO1$u(Is?u7_8gJfS+JCu6_UmI>;CV+Qq#-RC_%F7fk?TNcKn +zvqE^IMi1nN2fw_gv37sJ2DLp}gQA~AM|X~!II^+d?O%H+$qq37PI)Ad>R@4-gs1)D{DWOI!evz1kxeGfS`T>Quha}9hl +zK0m5!Uk1b1_e4Tpg}^cUr*6sYsd(kvuDmB})1OWFGKEo9RTUT*_-AIatFFM`-}dxT +z-}ZOz-sP_qT{4XF%_%T4#0IKtOd2stO*x_#h^r};-(HPwcjw-{_356=IAL7w1dU#n +zBeo|u>~Hu*y@$%K#SuFUpXwFo=C&`nkT}8P^o@`97dQRIRTDBgUzagYo6t +zP|NmRl(<7LELiYmPN(DE#osjSXWsD18R$|T&|`&lw{BwPZsMl;vcxy{5*F6#%=}!y +zWrcs}c|W>(W?=>M-09Q3Ga@g%88qg&wyCLIeEk9w-5yFcVZS}$MD0)Ku~PZ`f&KKh +zE;Dk{y+8U{kZDKja{J$!X15OrI$;*<)9J?1)%iCX>V@g9>^pY{2ZmTJ;ML9^H}1pd +zvP7(#S?tQDm&qwx;)Tmpy|~HV_ujX?17D7L?Y@9i%`>yMW# +z7-Q9VV{};`zL%k)Qre-fS)pZP0-q+#xcl31fl9+z&q>*diKR!~vkHp2zs>_frM~Xk +z`Gf`Hi>z)*mh}lq_scK6^*lY_XX2#PaZ6lh#~qyR7%^~L(YS6ln(-N#D{U9Hi@$s; +zbFE?L$jFcWU2iUnQD(26z+#LGOn183zGz>s`k;z1=YTubJsB%5T!Zy&LiafKoptn< +z+c}ryu}U$XEA&p3Z85&|Z5U<-+kHAnvdM7yT(n0 +zNg16jeLQVyKThB;=$qH%hVpc3);eO10oBoUCyT@aX&$?;p +zm)xo69XC=BHnK~wyt7@25a6)_{D{J6#?Bcn4mBLXgOmgG@d{+L9D}Fcc +zX<<^1@z-~62mATF6#Be8mikIh=k=S)fk)HAFa53n9Cz<@*EzLcy?QS_bEfF<>`x^n +zi*F{gdRngd+_nF0jdRL*@8h)wA8<-|kX1U;%jEL?`%9hf+`sR&c1*^N+qWxTzfQ}D +zun}^AhhS@)|7VxXGgsFQ^iDF?SeJkO*G2bPk=ddN7Y|iDy_0@v=+LqI_gRb%)Dz}K +z&p!CbcfN{UVO_=}+x|=E9JyLpc=1Ge(3Q=m(P~de_6#_8FLA?o8}_-Cy}Lv=eJ!rf +z4F2;@Ji~hamCX#L3%hG8OY6UU@rfM#x(2wtB_$c@Js*D9n8&f35VmD_?^>IbUg8X6 +zAOl%0i)MSK&%3*Cq=`c9om$UbH+AQ|S)I~wU3tIt`dz!&?(T!ryd%3Tf3(nh=;ki# +zY*H5|_|BX;%suTd<*`a9Pu~_~?n!5FGs>GY%P2J9xJB^9T`}p`-#pB^7F>2~iy0>} +zvgz>Q!xa@??zIzb+_oP(bH?AML*|Pa`lb9bE5{p|i_Q!%wLFlX&KB9dE@j*6%?(*n +z=<#N!WldScXxCEHG*$bLSFfIO&#H*{{LpoH`SMOzQ&Sb@&C3zzPT1?DHLR-Y3OFfhS9j{&&$hIw)a!m}e|lifo?U1C=Y~7{C3+TWePMn68uz%e +zqM}@3_QE;SZ!r@Oef#$2w0~E(^xWQz_j$@G!t?o^7`JY{_bxI^jg4_EC@pe;hr-@biY)jOu3E5lqdN(aNv9d(*K+|ZpNdSPa@_)Eo>eBEw_N|8+sCxM~2 +zZJYAi{tU+a5}jj(g*j`>79H8MckiO|0(MoI^LC^1(F6bZTvluq{xP&`fZwQ^{57Fd +z`{(X+d38P6J~=tL_UzSBO)lzjtD3&mBve-?o{HGmK5NI}&Q_5VYk&>D=uRZkC>oF=RFMQVr6_l(^KeA6#~#rY>MI&xm-ElVveg^c0Zch(~$)WZ2$s4R})qe%DligG|t6|AWrMbOHNbnN)-*|Yhn9m6cDzI_er-@n7vu1QyqyUt`XD~q0X@*dgQzJJf2 +zL;ENi?Yvy|(xM^y6kPVl{jyLRg7I=HV{q`F$>fdO2Y#qi( +zaf#i2YlUJ*Yk-|QPx3}Iy82%S3UYDXE7sa`$7UWn#?Gm#tn|IM@K4R6l?L;EpQs*p +zygogK^QAE9#F?^ePF?od*ywS83?8f2a3-f{^uhGEZ{BbXRW@(ld}oMJYUkfS-SeF> +zW5ylxL0y)IRBaEfsn{G_(^=S0MajXgpi-D~{*S5RoHc9KSf5jN?6dU1ffqMYCJP^C +zMs0Up9|ydd{Cr{Hxr#tPpOE$)X4~3k%{=zW$Wljl%RPmdsHlbE;g2%KS9b3&ycs`x +z>hXpZ%9|ZyOt{^8bnHIJ_2ZXnC!sL-*bCL@=;)7U18pKxU)`IUI$bCJ^6^14$L!3_ +z{dDG0<~;X@z86nc;Wq)76Ui +z^fm6f8yK=CCM88h{^bSh>~?iGh-VrbR{~L&6`7O&`wPIeXIFIzadDZt`1hPwI^*3d +z`gi6uYOcCep0aNrFzvD%>nfwWufBAxboAnKyN7S@uTxe#wdLvh+}oQ~dtO+-{?qDp +zwI$^&ABQa)t;S(J_NAnJ{rdHY+qoOMJ#`XZ*VScT+F-7u6P}h9zHM97jvXB`_urhL +zel&t;k2BOqZaK>iJEbudqk!h+PqM6oPO-)TRZlcPDKBL-4jUV1? +zQhi;tz1^l&2Ygsb<5GJ0`Rl1DtyatHoeZ3?$X__{JyXC#li&0**=)jWGyg{|KwfXt^mA8-Nh3T%fcC_m@Rl84r +zeK+9JcInown}R~p*%1EnrJS&UfT>N(mf0CknzC`u5q&1}Tx3&rMn>&c6JIxXcdaKW +zb{+DLJ8I@-AM{X+pRN)(=0R>$SKy1EJb7};5OZhk#a2xhR{YY?(2y1SZj`6@p*75^ +zm2qdBd&hO@2)9`O`pco;n!W=Dyn6D)NMXpR{Gvc0`ThO* +zIADM9`TQwUipm;4jed6VL2QQsH%5*eIepfw(BR#MTjnIEbhySBp)PEWgTcI)WT +zqrin2J$f`)gx+F@{D5=k +zl>HhvpK6?X`WF7^#b3_M%nY-5q+?eCv!fB)Ur +z{s`(KFZ#)(-}~pb-#@qg{{Kw+CQZAr18MsGC;3~OlfTi?D&c5|1qoM^=#;q@M_fl!C!=fWB|y6?ki~oaJ}>bfFOej=R6@2fDl5+pr;ZFup(32 +z;hBrzbzXRP5>B5OVoS;H6t!uo$^86?C1GNm5DwoDF%+kjoJXyu_M4%3Eng1E=#!i#$VfIE}Q +zf$IMs5$R16!4mj2Z##lZY+f2tUpbkzy!J(DOnJB;S%>eJm9=U1cpWC +zcqbHGLYjep$fZD<6lyMkw=TLQ2|GgB#&D1hCy;MNO8(0D@vjNEpK=#ZK@WU`d +z^XuYwO@nv=fbLP^HaJZ@8irp3hkx@0@OcYRgU^N6Oa=Owvw%wDNkXE!kp%`XLKEmF +zuc88*!WSdFYVwLWBsDxmAqnU^a|I*%Npr>Lh7V8PyzoX)BMO9ol{o@rZnSZjG=luj +zIB_bK42-%oFS&dTqqD^r>6k52}lfa||7R9dwg^;RHrX0p(WQy>YY$;Oy9z^`` +z@50AHf=Vzu12AJy3g1>>BHsQk%5m-oT3G0b#2NWalsS!X+s^PFe!i_u1Da6&B=zAW +zhD|bX#_*wn#&UWl@~A;2t00>zm&&o~gJ&U@Yonr%#A{gJH%M*JV&RnTNu&}F6$bfA +zJI92GLY5!RM59@u`W7BRFcU8PNE*3#CHNRRWeQ1*PLUYVJ0{O~4e%2~cMX6030bbV +zV$zqhFj7bXKCx#gw?(Yr^FydVBq&or> +zaP#I1O?L`Hp+6CfC*Q$M92g@YMvD*3g~LaQnMhpny_ypu=>l+MXZ1adLtbnN;ga3i+;vMYc-kR&@2>Bfh3kd?4BZ*4Q%ttx0U>+_qmo_9W +zlyBIA=WhjbTH)az3j^?{IfYpwLIMXxi#Q;4=f%gJ6x^@~g6f6v;3Uosv2e{D7EdaW +z!-wlZV|dae0{B2P0B#o7Km=?V&>O@PQ^EwH(p3?V&>%oe2D~s&z!A_CM@>+Eu;!j7 +zDLxRE>FfkOBw}?C;;B*7QkKEc6GFp6M4$iyoN0g%K1atP9+iXXoNx%{czQDl3JH&_ +zjWP{)Bw)A=k8Z(a-h_1X68o70p@$$ydE2^l9%@PcNlT1YiP+!wJAwm!#I(UbuySik +z0lCkRSOvUL8Xw_4F)b7TCl29}-V~@V&GSD8g>nNH{|*$Asr}`m5PfVb3SD^qK;q&< +z2;+-_rBp@hi2N@_;P-Hcvi`S(JM>W|UWPOb_{AUo(yI8J#v@H+BmwBgEYekkLW4cX +zN>jcF7aTD3iDU!eOVQ#RRAqc=q(vsNK$OhI-?OBJ$*77%?36=;%p{kW7(DzW6YBBd +z2Q`P`FAqkuS>q%<9*Qp<2{51pT=Wn=k(3J`p$OBK4bn?aA)&;Eq`g3GxX8TgAOyAt +zs7($?Dp=TTRB*ULe||7Z{w6bb+UQU;i%Srv7cPV)vycKnT3sY`*zmuLHCmM|V!`*U +z4E!tI&iHW)V+Mlpqc#TKyahYshinX-s!2Pe?P{G;$$wL=qgRI@od1Mc|2NPL`HIN@ +z^~`Cs$h71o2-ZI@LHw`!Y4Q9gASr{N)CWA}Ioiaeh4Y{2NBaDyk;y3d{;$bT>i@ex +z|HsdNes}#*H0JO3@%{6^#>OV#oAmmRG8tv`&-vf~#E*fFqK=Nt(E?B)$uBION|?$s +zJPOlp`}1E+01`sAqXk!i_TUGIiIXP8K^lEn37J1+US`Ru0ieEVrv*SgU_X3so1ZMl +zxBDdx=rLDXDLv*WDVA52FaUk<02A#4;k(OJC)`n)(zZBSlG>Ej=|f@?PhAQJj;mf) +z3rR~2WmK=Cj)9`029XXJn3F+40-?T-6|G1FkkG6MnLtuy$g7dAwNPXLw-#V2DE8v= +zyfF5xNlwNrS|!|JmTuUrI{*mIw^^U?gP7`==O^OPK8gjvedkIyfV~N1dh_xW1p76I +z3-_T!(#5o{1i*8m;SHXw*7s4T7jVR3fM#V1VH$kdGO%W#K+!-4n*h&B@h~lbUSw)& +z;oD%;E;1(=riw-x=&3_`z-|RANMP5=nLTZ~i>-@`vx}kz7l%dy(`GXj)QO`vVgWjI +zfii95CnN9(Gpwgh&5kxAJU;)gjK|(~y3MQ!)M#)(+5x&Erh?N9M@N|tY%~M~bvx48 +zp?ZeBP#&nqLShu^Nv8ICxXiaZAV?q +zhzTYJ+%Rnn*>k6Y4Hq(?Yt +z7}bFR7735R1D|qhN_m|CCrG{%hdFU<5bQ}F=RmWPSup^;rR5@M%V#dj#AF1^omdr; +z1rfHu7ba$Di9ud$wnj2bBw1lPn>9nSqCzt)OIjjgXc^5mkdjCj9^d2Q5rT!t=MQEM +zYf!-wh%OR^{9t_=a_lAnuGT@c$wpPBFrPYxB?#d +zh87vJ48U(50iEX0MdwHt&1 +zj)1l!O9Yto$>}(acSQ5~d(&x4KQ5@FX~cmUHrY2-1OF~v10tKMFvAJ2K}Is=3|1Gz +zBiZQ4yALM>zG4H|J0OS`!WW7~0Ll2M^%W6N7oImd{4I$B;-B#&p&np8y!;j-?w8cS +ztzy_Aeoh^70{%P+8CT_n@u{*X|VLDFM +z#WcN`l(k7J32oGFs3oQcZ6!)uVDuvr$Ymb~ucG*48b-K>kMBcBePN-y!{qrBv|9MF +zRIo1aw1F;bx60c}UHfM}Ztr&?)MD927ljaZV(5-mwq1_MNeu%a!%pYrOAB2^tzh$Sk^T>1O@b5hD5nfsV4wqj +zYK{~c4j_yoASnb~=(GZ|_C#VsLPJ#aN{0)L1<9Y#;bjL4;SB}K--Siu0OWz8%l(+P +z5tE<^M>Z$O8=)T69Lm+R!W~jv781@WMFvnR%CalKKWK#_WYF6+gfqf``-dOy!Oy8e +zdm7cGRmJCr*Mh}FSPhsm_+*(V(xGQW_|Ec{RwiPBra&$#MqgF>veG4`JOFs_`ji(= +z7qXBh$mVd40$y0NDWYki57cBObCRACgdlwY7qhg&BLcMG8G@{Uz~Y}MxcK;}H3K*` +zqL0|{XUtZ{QpZE`m=2mWq0+Q*3|OLbs`%kOJ$Us9tl&_2u_{{ks3oY(mJNEysI(uz +z6pjnpD3CcXiz9k$g^JQrc8!f6dT5v1jHN|#c$!$0W|HoQc+^NfXGs_m)6~SMbw@a9 +zks@R#ORb??h!91%pVbz`MaViChIG%ujzgT$_i7{V;5W7x(dut1i +zNsN(IBt3I!I>x}C0{AzuO{ameLW`5!I3tR*@#qU~JZrK+sU0X~f~Gk3r9imY+RK6f +zMRGuZ(iT8CI!%@Z0g5OPhAlLk=4{if9V~0Lq1_}qXW53Ztks4#6Puw66v>$@C~X16 +zc*kaA21W9ECjKMnRwxMJ1<|i(%U%&i$uG#`j*?wnV$}({mJN2WNXioni089KK0?q9 +z8Ggg1L~D%+=S$KEpElYBks$~sa&QRxR7cw$(C48xO=L(=y1K*=ZQe#gFieX6)#24& +zIdy47BHaOg3tCPK8gX(AyES_|5RX*o?Kgg|RTze!ECk$gsXsMYBrj&_D0 +zok?kSke}F$Aunah4W6Ku-`B`qxGrp2BNH|wgykXj0{?sHVmjbA(r<&%f$9ks20)7* +z>IfqyMhHu|olNe)g8mKAc#weyLE+lOoVIxhfa?Q00@eb`AN~)+r$i)%xDZZ{*PsRf +zE3LOM*2N^iQB!;bnxIq?RVNUJ^7mk%!Vm4C%Q&Ri-}Ol0VG#L3LbB8$LOvi}0E#UN +zX5+zJ>CHl7^A# +z;n6}SH5dSp910qPmWWJH(ZUEot)Dvr0FWF(Yv~DE8WYNU@N-9nK$7EXme!z!afre1 +zKXnuUAUTHSnGRYQg!j)Lgtuf6ZOCoV(y)SlI_U<{Xje`qgO&!uX)eHjU?f!U975}Ts&bmZ&=GQ4r@85m|419sS8-~b*c +zJINAR$e;-z4ibJ$Ci~mBs=8Y*1lW#;%-)NRA5yEjy1La}RsETTF#{BiTZQH7C>?L1qWhQ*D8mRXD`|Uq68E0r);MRqQ*< +zD|coY^C6#`-y4Kef}=0RcuELDJT +zp63DunVo>~^CVnJ2(Tdm!`Z|V9^DUvog;!A>WBam8gZC|_v0n3VqgihqT5NRa2H3+ +zVu|B3DY*&y%f3*@;0pe!;Yd*ggL*oq8OgF@RR7G$r&W4oQ+jgtd +z>ngqh^_TAHyDRG2IQ~apU&f~Kf0%omkK$ +zveA{}Uxu4_f-*LZe~|X!@qe(3|F)fLpASm;wP{@D4p(>+2s`polwJwPv+_$xCP +z^Q3-SVyQF_K7xInTfRS!@po}W>2@mJ68bDkKkubcKFm(x?@6P4 +z+QmCS)^Cxf6K6>)RH9peBEpRb%^C7j(vDPoFL03IYs*DMdD(vg8#@ +z+RUG+m$IQXblj#bz=UFgAS;M`{P*8D{!=&R^eg+==JB5o>;JjKSG)1QjVm<%@oN(g +zICwM*a7R4n0Ep2yknp`V?C# +z&=2Ac^no#6hUBD)8sI8~xCQR_b=tzp@!zSHt7o+*>0=wle>S%?|9^Fq-T8mo$`xE- +zOmd^Uh(MhHr+AYBZ;`isUP*RLOS%7KKvDimYqqISh_DTT>DVI!)3K#GU(F35%er!I +zG?8av8@^B$BJ3dA-#0|~xr#W?CS!sD7Gk+6V8WIR-GpxP +zmNDL&^br7z*>k8tA)?S{yrSSrEd7z_6bkZ2$0UIA8Jj?B%rO=e28Od}Mr2+Cq9Hne +zSK7QJZV*Hck}aM5iSjKun5W6O(tL{w?J<0NcByYY8vg%XEBQa~Bu`StCjOr}IttJK +za=F7D|KG;7&-}p?U4CX7wz4nezzf@p*XUz-u^S2kA>tHz5Zc@q;4-dwI!=kfz@MXQ +zH*JjGG_b>Ah%+b%Ih;@%eML~-db1M9D8MlDD^ND~S*r^Y11(2@%_!cSt_0I59`RtG +zV4cqU(9&UGfjsg-YSYv$4Y!=mU{jRmR_Nd +zlK#dsuc7TO${j4Bm1D^ZWXj2_cD(}k_&6M*{_Ge@u}74=(1E=swXr$Ghly#U8z42oSGcMSRL77gR3;G! +z(xF|4x{j5gDF7evr2J=BY5z;^1iy9n-CbXKZQ%b;F#Es9`v21U-x2)m`2RMpt@3}p +z@E+NAD*GP5@4@yxcmXBy$hgY_w;vG55w|!^4l-@r-`vEq)2*CfqUrlGQGFcZq3$9| +z{;$tQH;jLn&wPCu8~lG~Gx@Op@57_~ZvTHP*Z#9K44Je&QWW!w{fcYMq7wrX7_tu( +zUIK$pOs)ej#Pa@?sVIg%vY6VN-|-O0jPr#%YvGG?4x=`eN~u%`cMJ!;&Bcw|UqD6a +zqx2~N*_fyANE|NepG1JEh_J;>^*WL;dJ5-=CI4}G1o`YBF`llIwMe3Uz6~P +z6BDDOgf67&zNEN)*e<-i@C90jCr#dpNrS2OAD(vmhl}D5RW`9i)dY2KzL>HXI6Z$s +z6ZaSXnfeP=Hi<_UZdqPgpx?TS0CJT8-^LKfY~jc_=d4}sy^gEYHs88m?yl`zEBU_z +zGY3oObU;=iFCr|4Cw}Bn=eVM{_DZ-u +z?hB5v=Ng!SJQC3tgj6VtR_Zf-L!+ +z4!9)lxmD*_h1(Twr@`aaacc@_iJ4~3ZBZ1pgI5b5B)82lrUS+OM}P4T{wm2NcehQ- +zh}25_(>-2!X)|A9vZlfC7_oRYz_~B53-8+%{`40(55qP3fZo3!9o_mv*n}sLf526s0mu +zIsdp))5PQJhFm;@1Vu3Nz7eRb@QcVn +zgI|Dj)ljHXRdyym&=TmXdSVYFMxVf_kim~5;Kg_nJ`a3lp$~pvZcA{EkI)BYEz}o< +z_fvT0CB|uxc$~wuQg}KqCTb5AxdB?Q3gkE^=4h93?OGFf-@Kr{4# +z!q7Mi)tI}nbFqp%DN!Qy6v7#3WjpA*LtV}tFu7idV<}jq8dd4Y5T6@cAC?khCZp^#+z+oe +zPYbNt;z#1E^&V?=Shd!u^=hp5y540Mt!Owt+CzXDB^|SK%^Jntzd1(wmm9?$KTsJ6O +z8Sc$Fb8D=KKnuRp&6twn;o=PpR~3=z%a<>{at?Sol=$TBayqsywQ*s&T0t7}er8;xheW>Sgfm2o+0TMM$+25TmA|GQG1F +z7#mUqWV{3FllSOf +z@q3}>Re3C8?DEH?goq&t&+SgD&C27kb<;NH6{>nwoP*c#9A-wsbalOt*>Lzq=|_IJ +z2Cm1qF+c=u=T_S7l0Hruw}x`oYm_GDfIoD)mC{_NTjg2(gfSIOGEd_wEjn&)U`3XB +zT<+G`xoz~%PAVS7ZYs4}zu}%O4MMaQ&TQfItLB`kE@nSKed-u<5!Q7LSWlayBP#-M +z-z*WemL5MTsT5f^fBFl^7Z_m4(YNNp)8s}wH +z-@EU+z1mq{EC9f(cYyz-%F?=^BuGRxNJO352Y$FIgEmf*qnU;FDkDuhR38+Y|7i|7 +zqfxh40cuLND}+HY}NQgIpSc +z1S-_?KO73m1<}-#D98T@`P>#AyE~q~aaUbYtwJ_}M_3B0hYT_r!Na+H=n7BcT(9au +z?UZioyi=)_fJN7*z@(77$5jO+s6#;g%4A@d^a1lo*!$g_VW$XAZDEp-OH%hu!FzYb +zaG%vcA&4kfc~)z5YY&hPLfk)6He^@I27!0IWQYKIyj;jWplo$O6%Ztr9qUA+@y}an}4OJdpy${J45LMM@v!Y(qZ*Plpy$Cbd;=E`L#zmN}6i2h)ikF(>laL-p +z#g&bz)O+~h9OOOvR^hivv?J41DdT)O*I@%ph=LCPJv8fkvF93@4^yaJ!mae$&<4;B +z8(L`ujWH{Zpp{0GqB$LZMVpMiqD@8*t6Rsg@6`uP-74yfdGT^GE5aazo{)oIrwBu# +zI3L=@p?OvOZ8n5ogZ`+YLh)X7Z2lmp+TVJK?oYk^>%ZD!s*jBMQyu$ouZN%i$R8aX +z?9P8|*}vr{RY+Tg@a+hsD_- +zkxIKK1jpTbjmc}+&0M3SrrI1$QVB0;&jahmmcg7H#BV!`tE&{NJBUde4Dgsa1L;1M +zG4A}pHzo!%#zflgFb%%=&@*Su!5HeeS%G-ay%iaMOf4rA$TA@;l7Uhi&)7;E5yaZo +z=p;8MQ`Y%>h7lzP1(wUQt}#Oc{|uAt7MmS()n1`T8IC39%i%!=TL++LNMzb;O%4~)kO7saSD$k{X +z&vS#H%^uK})M`R&x3e*jHD~%L>Jw=%wiWK3qx9VZm3>flG6I`Gf~oSzm`>)MBdzBV@awK-on+L%>#;miM$djI8lpa)H}nG~#*JxDX6sL^B#2Bi^LlME^9W091-j`;*`z +zsnO2_USXZZw1>tR{tP~N+Zn*@7Qwx=2?e?fr5P|D?t*C!#()YWsX-YzQoVrLwDh9v +zlY=Qb3f0F&B{xP3Mw4<=fBjJE(@no$bXyT^AqYvoS-Wukhs(H8G_D`b^%14 +zK)^wSb;%NfKApk0u3T`L5W9`Dn22zH8&Au-Uo#)#aX%J9a^9?0TGbk)lOdLRJ~ipQ +z6Yibg84j}-xL9cnR4=C}uGcBQgS^dtr2&MpelMmjm752l+E3sWC~ALj>q06fYE+Gcj2*pJTY4 +zKQ>5wxJXHU&1PdEK@^{0eCd~xg~FsiBQYpL4J$k(&w0Js>$iKIFfeu4dA*8!ti%pp +z9Uc`Ggk6F=({541Ip(ZkOot%-0Q~TvNDNSlUi8w)EeBJnl&|3BLN)u-r8eh5?FVOM +zdRHiPVEzqYb3X3Q4BOU*MvT5r0A9uTyss~sKy(Q42*gi)dTr7sJ;t4T8qP#)aLQe6 +zLhGlihI{{1MJR!q_#R?$g`WnjPff?vpv!>(p_of6bG)uMyS;L=Qez|ZvXs~(4)|Il +zw{vLH>2)OTm;-q$7cbPRBd&g6zCAGvc&8T9)f}T4u5KFF2G@rC%8ji=%1G)4i;58O +z;@c)<@1ZjuQv6T&OQh7svyAY6Mg&D;ZnP`CE_7`BccFoKu@4b5(kHYy>b=oOUL!jo +zxJ39>py?1|T?OmarTm1Uj&1@`Po((CE>Y2_j$5q;yL@eesGqX*%hE}?(XG8qCj>D( +z9csi)ZmsFxmr-nLs$=9g))e(sC;&MH$BzZjJ2W_)vDi)S6Y;0`y%9QNBY;vO6c`-> +zK)fqZRxeteDjVF0OvL>VU%h_P2dy95AxI;A+%*XKhjHnf7}ml;jM>b~blm+w9*rD; +zBa9k(n8F!Rj1Mn&yhQYGU#H}qi+YIowh2GM{%?{9HE1H(9*J;uI6t6BdjY24CtTD8 +z`{I==!??g%C&n-`x|CEB!3u%3N?66Yr(c*-Nd$C!%>@^89;AW*JPC$yz{M%in81W2 +z_T8lKpj)9#f(hk-65`^!O!}9#DcT+mAU6#gH(d-HNbhydy<~2CI&hOkx>)5!mAVei +zDdl6P82$eEu5H;aj=f2Lf-eT4o=Ev+!QGK{gVk@NZZaKu^a=pzC?uML<&L@SaWdA1wkTd`Pke_F6`}rlw|0?xLj|9cHT +z%Z{@zoDP`liPMs`+t_!O?X^CL?%W&56~mc%zuhSJPFkHa9%!@=6Bqu +zRa8I)MC20$^;2XJ1Q);!P=6QP6>(tz#RWf56j0fr|2cPg@4h8TJ5vUiK6ul-_wGIS +z-gD1A_uO;OJ*SNRmjOqM7t>dR=`)lPH^N-mEwxJSE*9j*1e_s?Np(Q^p=4~(Ncmip +zAmW^PLd5wF$3r7bc0>XUua~AW@;1aJ{`F=?6ByIBn>Srg=kAhtBDFl7mtltNhLTeQ +z@o--}v`#u3AJ&QweLd0M=$b?q%at#V6`-4jOG*ZEBIMzCtk+FN9(>!S)uA`9hPS~~ +zfkpWA*O1%#T5A`+)gJV(KroHQ484_-s+5fHMoT@wyvB*1MEsC1s%Igo<6fHiJ;5;h +zV3ey3r6(p?QKU1O3tB@jAt_;c%FM_dXq0d$&ov7-Mvb0&)|!(d3=O`J%<*kwn +z9w&0+6By6e0?Vay6qj3CEcv#Ljk%Etv{24MqVwuG+!Q6-wbs$)ri=6uV@3j*2@`=9 +zGF@V5wOiSA>+4Z6yLf?EazzH0w-pVlVTlRL!YNrwlerfSfnm}sQ|+JvlUj)jvs5Z( +z)ijeQHgw%!Dl|OoX5)h`{U{<~9g7QDl}oTx!&oVj#i+IVZnD5nXUeF@5K2vzGiqKg +zxHQUlODno<0cdlO#z-W_RM;0IcO_qhn)fo-2e`OkOED%*aIkcq;zODeiOa}5JY-ew +zbbF+AiPUgxcx1Tx5F%IaI-JP*!u_FpumeHt +z8Hyz%{iNZ2p=3yp=fH4<Ca?j*pSIg@ZA;`P30ItY+_X+Pyi`~OmSKqjRw)W +z3K7>7b&#cKG6l#WBHwm1_F_;-t^lq?bd9`Y+0uBFuN=hDi6=>$DdYT{{kH_Mc&zu(sy~7utya}Unc}fP+!|x+n +z#Gp@7WyqOTEzL4d<1m{*CLn3^2VnO>pIEeENS{r|G&WyIg0qHU>_rM=ipR8C1p*g3 +zs20Ig1FBQ +z;kOu3758w}FGVL6&Ev8PD{#Ylo{NbL*)RqHmi2AZw>l{<5?LTIi&06+^=@ilE67ml}n0*)LRxAJhFD`9#K*isofnr{bo_BfX$WHTV<- +zY14~=>Pq}QMH3Ddowsy$61}`K%>+vJos>O4T6(UmMW*IH)MGn>b^d{u%_JiXYH_q1mX!i7 +zU1AQFtQuZLbTQP{)eV{!!;HL9J;(wND>PwrHfTG;Ao_-e2rsL4 +ze{do+^hXUs6Ih7NWc)ACMZUR-Gk8^D#m3%{>UM`2HMV_GlTR>PA{W(FlGS;YVPZkF +zaa+NHGz4f}`FGPYj2ygXPik#9eYIsR7ILoHXs#kfbu+#|Z8Oo|3)n!F2YGaZ91vB~ +z*~las4+uIeq68K}c;GoQ2onv#0r~82^GI;RuV_3KjfML9!jIi4g0d +zhN;JTW6@Zgpk}YMKEa}?nutOq2_(GwsGxc~LJqr042_NAKsL8^Rt>Q0#@SW>RqV-n +z?UEd{dWM#*X35+VG5KNb5SSciO{)w%rjzYd)*^P4{3)g?{kf7#-r?>HeHBgfH*N_B +z0S-_xowU-BrW$8#WV=3)DpW#qI;w3IvPw;c^3i*&#!>ATDCN>L-=x58C$bwt8-i|Y +zMPOa^;#!mdn{OyO`(Yd +zLZ^?qL_pfQR4NYeH;f1hLzPK{G>c8qVA7^XhY78i +zr8hB$QHYxhO|atydyFl!eLscG!P%&u2Vs!rdZx>AQdyVF%DodXxAqRFLcPPpP|!ez +zP5yd__ONYzIs-Hc7A|}n+K^v>U5&KGtssUs4a7V%7k0>}pPjMlBrI@3;Tu%!Gc3e1 +zr5rig&`EZ1F$o@+Gw)?9TV*=4Y8K1xbW^%cVzLw6DfO0eFiN4qEPN4$s?X#~8DgYUo{-j) +zQ(qF_D`f})@obdZuCrZen?A-sDtIo2+57-zdei3W*lui-b3|%xtIUZjP6mle5s6$M +zJ5Q~UI5T6Fyoa(Ki3Vkw=aXnyCOu>~I*qZ=qAz!8A%2paGd+UMf=JI +ztxK?31e&gGZ6u^6BTFzOteKD667pdnNwYO1Bo~=5C7o!vC85Ojx(d}*yvBLNU`^PQ +z&gIG8CI;`7mz3zqE~wl(AhN(3uVI1`bi`J$9O7D7Zj50d9*jO)OqbG=GFr)bb)&mI +zu;;06`$9O8+b{*{wl3tOX1Zfrk=fhpP}2*+=3@ISjEy+0h-Nv~YFcb@c4(EYYlCBN +ze^cG?#>V2tYHd@^%to}Y**)7DZdYS9sIgemRMn~zD;oS*)qsYKW!CMseOEQNW-G&u +zWO$bt#Nt^Q$Jm>*=yoh7!9Uls$wuBtOXMl7Bb9cKgCu^=Y2Q7)(v)+4YjNq +z3`;@Q264-M{w9EC>ypsmFMyrCBj=T?tY3zN^ssPtQLA{0X<{WYcX{4m(p&zOyr;GGh#(DrUXd9E`WceJW}-rNgzgQuXc4g(bncd2MCx7+WQ|X!}Jd +zOBzU*OL$~T&eF5xH2xvTT#%!b+bRogEVP4?Xg$kaWuvutm6a~HIb$@UJ?jcogI${b +zU{HrKjih9xTT=<{Do7DhSeBb&@s^$vKUVKC13E1=Ty3i1-W$jKWNWQ~Y_f}X*&b-w +zM+hgVS +z_0_dtEE54p(~|s}VScy7AvD(Cm|*bOQAs=|$%q+$@&i`n60ok!|*&WdA +z?xv94D5+Ufup^q?yhyjCZ*nkOltx>y6l#~vSAOb~LPSvrU-kc0Es9g?+qNs-;qji2a(S +z8I-S#^6s^7)7}{Al!HzX?*r(RrgWKq4o4J*(MZ(90%LT4PgCZHx8i9iNtihKOWe&9cctbco%*5%(G=G|sj|d2 +z&k&xt7b?6K4->LXMZOm*B$JvXVFT5$0chSsT`BqKIRML-6%4ewWtQ#S+HEuKYZ})_ +zz9<)5c?27D=fQkz$(k0Kb|?AFd~mtsaVb59t2f!`Z%gI=b4oJ0$}6j0X_z?mMUhIT +z%RYo@p&M=7@PnvD^g=}3cY&asj15cC@Y--xcW{u;Z6RPz841TX429PXhoV5dVRu!! +zG7zN;(#J!C($p~OlRQ$CKIX}zMsI}k=ktP5ugL(LA<$+(RjEaSx@V&c18yRN!jwl6 +z?d1}3hWcO-2%igGupS?d;7G+lc_F}_E@j!*x6x2pzO7LWP4HJ-{LngTXo?N3HY2II +znJRvzGb_2w7U(&sY_3d$AyIWR?gWEfAIi!aY@BX_sGGu|o5sl^BS{lkTM*xPj>A +zmJ7U*(HQD|UA!Z@iBKQy8A&E%LnFh;P=qqwf_}DY<~Yx6;Q8A%Zbv#{k7XndNfebN +z;o|)y7+KF+ZZg8w#iz#Yh9YdG7XGohxreQ^fakDu5-GPw9>a4_l+uAb&@+Kv+r~zF +zCZNNmi@3~$0!x0n7|0Q?l)wtJR7{avWSeXZ2u?g4GmpZY`GBd(2caO_i52gox;Vnr +zVHBgcOQ>{FDZ=<5qk^X$jv=QgqKsv;Drlrz6^zRliHOETK=KBvNO)BveDZF?0Ul1K +z)~6_6cInx)G}A222HP|z7}l4#IwX!Wu$09`TWqkiJ|&qt($G#Lah(KGiI6yns2D~p +z7?4M{u1OQQzAK$dvQbPN8ZTtc5Rv_4<2onDe9WlHow9og9zvcSyUz^6K#?>RF`*kHR0bgaUJr +z$gM=2W|azw_=apA&nC*btuo+19B^ss(3JWIl()&5N?HG?jnTOgh?ZJkGaFe`mC>oC +zF>;xZO$iBG+x!H8m}GNFU!HP +zx+_crUW}tn9Opo*y|KZ;&`_U;FK9V#j7Fk{5k?o +zbFlsq8e&=D*>{fC65ZuCu|}?5H?B#+DT^&y;H?pb%qZFAo>e`GhGWXUS_$sIn|fr; +z)~uI7T{Ca>Gp7oiFZhU5b&Rt; +zbg4*_c^Io*BGg%xK?qVM=LFfTajr6KPMJ?L*E+e&%=_aqLL|J5s48GSnBtDziR*6o +z&Ap$ZV&1ToWOhCw`qY|cDkbJ&g13?FNa?3=>mMvPuxNsfL^2YMN)!c*8&9OS;;96> +ztv0Sm1=Ii_m*AY)_OQ2pYL*qkbdc4Ki_W_i8Urj(!h|!KL)V_olj&{jCmoAIAOybe +z6N*NALcMFGexOPg27t*0Q%IY(Q$I5l);$Pr479c}OJN+Y{I!e15E62aGrR}-fViiC +zR&p%7!yw8Hl-LQIScQG0Dy&mLt|DqB)Q=Ey*dohC=p9^)bGk*lo6KaEM(cyTwH!0)&1Y4}>U*9$sy3aqx;L+6 +zwiuh8&YpquD2e@mEoUJ%aMhPa|E-z~AakDB$7aM|oFwCVh8Ks0nG_QM0!M18J +zy`xIG4C7-3t9R2%`l6{7m$_&|)-9C)t&n7_lEs+~7LH2EYnX<3*0NH>tD +z1L4T(fut1liAr0-l37uBuqdZ3osqC8!)Bk+Z=i633wz0s-AryKS`m|acvEx?h6|O+ +zUXYYo@v1q4zyyi3gS^jefx;&|)&rCfV{1HQIHz-Y>I`X|&4ZX(mxPFd9EK@$t`yFZ +z*+ttv$*F}UWe%@YDUfvoFmy6UrAcUqt<1|VV*w;cq#n|SSrySZIt3WHDu>1-NkAri +z&!%CmHkiwl6jd23vu|uw1sp=jR4|+mT9@m9j(1B51zX4=;+afnC1GD^=tpLGHJ8=c +zlL|96Th@rXM@pdp2q7r)O6xRmTMFDsy*XeHWRfYO6bg+F6K=##2QDpBs~atkh+$JQ +zvAx9@rhvn7MafFz6P(oI%xMU?$=2`fgPTRx7J)t;p>zFPUd(x%8bU95sTz_WX +z9lM#fUjHD_Zek!rUUSJc)H9e`4H7%u_Zp5RJd1^VHg2NU$s9GZBxh+iRl_G~FKwJg +zcmiS=L;<&6j72PMO_y>Csu~5(M%VFxGMGj3in4_uPJ^NX#bqXh7JDnF!6Gig +zLOtPBG~A!;w7!lbyXZ8qL)vO`&coO>)(+>GFtO8;#)l>J7bn!Slws_+$?r2MoOm`? +zK(%ab_PLN#+Z1MG;9>?!#g+`@wK2yiNW5E&udH}X#)fUM+Y?JBV}o-+FB@FDja_)X +z8)%&qPDvH3_g^is}A}nrCsGS+gk@NawDj;luXdvyuq7*uX8x$}*XpGr3 +zAEwJ*^ms(i<`6{jb^`_lE=S~Ju@HmuP%T4mWnlW^69t_MvuGAcA0}jxtm({zvky)U +z#M(Ts8Je?6CTQ#|TqGJAnZ-p1g+?S~=zQdy9yZ?y^SF!w+zQA@X%w?`VVa2XUV2nS +zR?B>j$|~4aBC(F<0f~?imds**Fw`OnJ!l&;kuItd&||L5YeSojSYd4@(*jJRAhAj6 +znH8W_O|v+pnPafXa;8QL{;OF#iP33pyi!V|5R%r!3r&P^X+$DTC@M}%fEc>!(&Q>F +zcwQPr50J%ptMo7x22{HVPN$R#9w5xakjqZfWlknt!3F|i>A6D8TvuMStS;(Ej0n)k +zS(=ReX{C*L?5@tvx+OC-Yj*q683S!HaNw18(zku_bXj77W|QA$kE1#}jIHrX1JE5f +zj@SYdd0k=Li}8>Nqe^Q#YGmw>rcn>X##x4%Oc73@jcMp)@|!MJhPC5fc-F&(mM^Py +z%NLK&L))b9t?VYk4Kv$pF|~sk`O7o}q$6}?c%@GvU!m9?zqvru3HRoa5 +z#cZhwpmT#cX0ax(!j)$yTbSzhMb*3}GA%vzi^lh$1RW;xL(h(-+xns>DoWv$iYbDa +zCQ3Ipn!cc!p5VMbyv^nFNX`T)%4y@fp2VLpxt5>HBgwDrxw9X{NVbuwS&bDJtV*m0 +zXcBUnx`gMNV^e0MX`g1{ZC&~gQXQe3RA}5Wu@kBov0!a&s82&Q{?T+g{V>0K$giX# +zY!aAw?>bGhgXsmXYtl?Crho|6@N-`&J;f-GBv2WsNFPvdsy8%D=vRl#ei8@*Hm$_S +z+|D*8cs-*^VVnV9y)K$cBsWCE9=#cMpWV{pbC7)2MiP-8;&QB(0rVi%(8^fN`RWRe +zMXfim52{XpdM8i}TXJL7YIhCmJ)sOUp)!@uJoO&_YtW)qEpSh}@@!*IQmV;91Nh-M +ztuX#?ybp%|a9=1H9*SWgA$$%+qrC%>XkR=$#NPDBLxW+-;+bB;ux{s6|JEmI5_oRfY+|30x>Wz>%U?r&-JwVC6;`&!!<;=k{W +zt67NuKGBIT>f{ove05JSRU^Oeas28I4v9vKM{lJVw-((hsC11unLc +zHxe@O-O4*6)L6n4f~7;5Kv~uNTv0WhG}C?cSVpFQb6A +zm_=qTj~gJ9P)$6Nk}j2i(M)qt;cZ2-psb7&A|o|mM@>+1g6NYAXDHL!0hGLqR-II% +zj%I0q4b0pO-K{o5DJAq118r6rHlRPS{zTnC7PpuvFSG3tgdd^1t7Exs&Cn}Ksi-hJ +zHW}%!OfAI?@;JOS$#<-+KngVgnxu>#@T58_BoL*Xr{Nalv^!a-xk14M#|1 +z_C1Lz&#V)(GW72_9!(;OK6)TeQl}?JmAooVqCG$KazS$pLxZpB-eD5SC=d!6w?t%8 +zwY->wDlH3Ckx5t_jvt-^ciF^L#xkfKGEg+t{HmIAz^k>9eRQ!eoh|JhZD{VShn7cs +z6hpB2tupT3taMa}%?H`JDt+`UU0u#nLCWK-~#5CtE2Go-#GWP~}m|Z`9&z&B0v85bI +zxt6XX#FTr;#(nzh5phSP>8-a1Rv@WoI%y_ +zYiIFY$0*rey}?Pk8ZB2LVl-_eq@eqXw)EhvozAnsjMmKcos}E1&e?@`w?rI^3Wb{w +zXN#ZgymspYg`7{~TPxZ*B}z4Oa;#vY+u8d5U?#spZJ0xTUOHNv^8g!?y_1rRyKqfJLP`)lz;LX;x7 +z7kDBY(6EGLyNI8TGD;(CFNq9}s+%8O)}+Ttoav8QQhtgECEY7COX*>Lz4yNt#Su{hB84iJI2fv8VW4>yq^9HQ* +z%fx7|Q|FkGLav-k=b^7T6K1cgxqk>HV}qu6+9s(JPiArk$MH{hfDDJO2k7bl?K@^s +zRa4Aq>NlZ_vfakUM%_;ol`VL6=p`H&6}gRm@hH=cHXn57ZR{N`cNyzLJ&BR;;o29u +zk03u7!0Af>Ne7ozfM>;;6Pjg{Cf~2B28J&WL@)zs;Rp=bcc<&Dsz6v=w65Af=;6a` +zRVb#@AYIgug_&*=FsQRYWN8~Rnqh#rA7cZWxX2Y6iJ;MP6D@)<1nC&$u9ReT6-Bqc +zqUR8}FvDaQjmK(5a34C%ahdH5Om3RJ$8dWvycx} +z4%;F^?7lN+PCD&d4iD*Uit;1lSYlj*;JcPxg3(DnoryFI3iFVdiq4icZsoh|VM%re +z9t~;fkTmVN8LLKGf*YEFHOQo@Y#xi#Tg?*yU3Rd|d(OHO1>IawnoJjMrr}0mma}p2 +z#FmPBnmIV@v2CnS-W*--==+iAC|K7r&Y!mRwcf?q{j1*opYYoY=-I6@YVZH~0=_ou +z{$Ieiu>ZGru6-KzZIGnH$nXE#x1nJ%{5|Y2`s~`Lq2bWi!C&|-!F>`*zaRN_-oDi! +zo=5&~IPX0A2mixY@XtN>+yifB$o~y9GxQJshp+IT*OJB^=t +z0_`(PV1C9QPYW6F$IR2FXZk|o*=N`b;hDS;pJ!@+=lRX>ZOa$ySFb(h_KWy&iV36! +z5e1l91F^4GRUPZrXFYwD=LXXwUIaD2MM^ks=B0+$&pg-gx|t^%_L=!De7dKh;at4W +zYiL--Z^&|-`4+$PJdpp#0OxhjHSD|3OAQC?Gt+Qv!_04Ag7RM3hu$-E9Wr@XWt!=^Kp5H@q_cB~@y8>D-2f +zCjn!>eFMGkdA)w~cliCKGa>zNh5M2 +z{@)uHh{2{VmO4@Mg}!*`Da8UF4J|6D`PRZa>UJi?c0=3mrP6vd92!c6h=y)+&>GGAdF(bSn4K=(=SGKX2JM``v46P^elwrYy +zR#1MQb_%?4-5`ldo1z*j=3#!BUq2?E2uJbY1p3j5jU**M>4eqP$JN?&DTn$X=r5BF +zt*en;c!-&u70EFrmSX^DCJG60qa-22s&hgq!J1gKK;yP*T@GkviUyQl8trl*b#9|{ +zoFZOoji|Teul1y4;|Wq}9$uN7k49L% +zYwA|2Y2_MLzNWUz6&h74<=T1B#WiV8x>8n9JCGq~BXte*=(IGND+Dr9Q +z?u#U)rOgh5I;2uibK?a(eGa%c_R+@8-P;{fpxq<2w|V@2_`4kL4xdMo{BXAjcN^Rt +za4%w_B# +z_d$WnTj6&rd8Xf5$Zv<#f(bhG8j3(|ZvfujVtnThYQG)k7km1=n*hx(e&Up2v8pJxd$Q0Lh^^jd;d6U_B_mH=C4{p^@s1~XeTGY4}oFGqgp +zXLp;%IFV^m=E-qpqSyAIr67m+0y#0|ye+c^V8{>o925v^Vz6~?0L&GD{EpfHOt+cK +zkOGXYaM1b0PjThLQUh?e(s{<`7cv?PqxfzWzPAgVLaHBRO=x3(eRQ_t8T=+|0n)6ko*j&amQIs($hEaOOoEBOf->Ez}& +z)zHH312*qDAqRxt#`F$rVxN%7G+JuSH-=7`(`~L9peWEG05mURB-2#dw%h~^aJk&C +zJ^Po7lNXE>e``=k>?a+hmk7@R-sBErI`%uDtpIqZ1Wc26ONR-739lW?g>L~?U_g84 +zpiL5cuZ=7m>AL`%E`?`;65e4grovHj(3S*jN!zj9SR+Y9NkCWuuxC=CfR^4th+0h0 +zVJbD)Vl1HDZvbEc=nn>k7eS$hG^3x)y#fHzU2_0C{3tn_i%$0)CG!HzI>I +zm0-jfMR&wG&ea8PEqSQDeHP@|qOMqJu-$Cck?bsVcm}aMeOikEKl*i3qK}DOjkQQUoYs +z7H4{y(}Ty&luDUEmCK`*F&BNo-7+*f8q<|+^&kLdjS%34?nxqBDF$3AJXKjx7GqG*kwkNi2+nQ)HnN0f6xA*@3=UkkdbFRAIRaL8M +zt?GWOmI2Z*65Mztv68SuxR{6c81JSo5~Ez^E2H>^rx?d<6|g^d&AR!G{lwx8@eEJX +z*d1y*D?O3o%Mmn_$%>`>pI=+J99Z#qHfx}omBNY-y^@vrIY2X}FOt|R6s>fAZKf41 +zhJNSq^O8XOn^YuiLcDW+Vl_r8XD2`3q)bNF$izc*7lRU^)|7PeAibnqOMBk5z$(C0 +zlA&E$C?qiBu;W^_%b70C1R51}|AM;BKa-Hka8)*BS$pERS9j9?{Zm%B`l07V!K;o3Dcd(CnB5;T|qLF +zVf2K`jDrn=)?~J%h@G}|)CjARWM;ErsRpfQ2Qo}8EF826;Qd8mHYIwl;O3R#s_ZMp +zg6O0@7W%vqL>g!pn>z7v`67f{xJf9uqR9%y$C+aWBl{pcc}BA5Yn`T6+-O9yV_XLw +zv_7UC+y2!qjdIdFddVGYGK7SR%7-SqzYs2CSPSN +z1ZM@l6-pU4lsGdt=@dUb30HP-5u{OyX2s?zl}9bwk!^FU!yZk+HP*{&?@8j;9HyjpEFHQgi!vKx +zfBW7fD@qhzE~iJ%*`D)2C>5EG8R(wmq7l!S5OuQ5<&OKMMZR{pa2hc>m6fKD`lEG+6 +zNpI+}F!eO7qCAJ;+JW3aIHMoFBE-59GuOsT!3NspoqUM;EK7K|qS#)EHGj18Cp@&N +zE>M%4_cweL&#wc^SgTIdXF*a)cZLb8#YDy=>Y@<=n4c0ezlL#3n}Y?V7K-2#>D)gx +z^M%VX5SXz$E(FM>^fgQ|GjMb;_S!>1mu%F|oTZmG>D?FS7$nm>ikA(Jw9V0w^O^T2 +zIzwhZavr?%g4Hp1HM+QmBI!_`|MZ!`?N%JYq_)VBV?sKfVPaO7o4K4cLWfCYr;*)} +zMM4Ia+1|7RgZ^^V<6m9JnfN8WEUAaHGJQ<*3tkNsp7;luVfWYAX +zMB$|iiD-K+ilLan9*3K;06`;b{Kt8G*1+A`{Phg<^i&m3INYa*lw +zB)B{!+&bNfS_K8&)>gdXAvK9=3;YrNUSjy8dR=A$d?D!RmhA`T9#Y8T0V=`BRrX)f +zMzoImZJ=u|r-S)JVj3qdRx!5hvM=NF3K&%FfL^_L}2O$}U%*ZM@d~)<_HhUr2 +zrR-62UcNyMl1GA`PAFr^En$aiND^wyuf@(Q01HB%RZ5{t^(t=vz&v}FJTlML2D!Ka`xMQH2DqF6 +z!O(Gvf^cq^=q5rs)m2D*^f)K6G~_YO;)81LgOw4d9e-WesQ<#k<1QTcR%BXEc5LCF +zHyIa$MEW&p0yG9EV$1>W`D9|8u_iNw(7``339s5=2zGWSPPo~8N#soyFlZ-Wc#WA- +z9;p|as-|zeC{6xlu|e;@D=I3h44|P&K<9L$!ccxKn579{qh5wY+g-$k^Ic9%WTghV +zq}S&>uv+1EZ%l7ZS8O!ei%!Eu$I_;|K*#OXX4n`stum!IY+a?-)a^(QJ|n|l8Vjpb +zQgJ4iQU@Dcg=jRg?v>cNvYab}SzeV``_G@+(qLD9vI +zt6P(0rF&9q^vj_=iK$;ZR6~j3Nqd%5)-;8;_3RoXU(z3NK2k75-`-CUj!o!*ixDA`W@&G7f!}Otu{y6pam^Zr3n%4UB +zq@nRw=*GIm@H&2H)|TJ2|{~1o$8B68fbYO@KD^PlnG7luwKiKx|<|zgLwlzhVo26o|DJBQbQwV +zHXETqsTq_OvK4EgI_H`jL@w+h5g^uUy+xx|aU2TgETblr0803@t>sEc-BOw;$}y_hp+fDI0SX78WNJH?B@=LoxVfI@p5|{86FNu2n9q? +ze1O6Nq{yN`6H;+5Q4LEa(eTd4?aS0r*O5PkZ3pUH-JpJIkTC1DCb!J#=}UR|JWgRq +ze#AV>=q~?`rpI)?#fx=5HcMeB>QWK5$EQ%XadANqQjr_zbzvZhB +z3{$jl{*Ep4Y@)ZFPyGT*b!S}CK~yo^gVX>YR7>BhETy)$;q-S&Lo0Ntwm}vdL6sw8 +z*jQa%`s7;^YkdC0)dY%mb)s2v%7?S+FViiq9%e^!T%s?r+wBidg|iv1Vr_ +z>)neF!*6nx1f!G;dUlEyybQ4=H$qOH#cmnRiS1SFG-z^DugdwLj^R@4EUp=v(dx)Q +z$b&mIq6@(cpe42;3}NE(`a?gJS+SI)Lz>!*m!yWtoW-PgG;y~JId)f?m5aI1f;@|; +z?Q>eZ?|vHy=qZmveCh7nQY!ODCTt%dAh*PzznnffpkePQUMN&Un);MeM~{XOX|eob +z1<5(d6QKw`D9VT{N`yF5N5Ez0218Q^8ku3cQt@5kaN>)}NsPp|J%0LvzpusE(((V< +zQAGA2W8O9^U0+^1x+ET-9|WwR-6U=O4KIIa5fT9-TWotE!@5(vQTj +zcI}b1-q|U|DuAY48?;KCM9C(`z}3OmMZfdauu?-IhYf;4C^pCZysRZNb)dDU<<^!} +zaKRW+sK_iVKe0xZK@pWu&hb->9z3YUGtNkf(nZ@;YIPf^86g^qny^7bSRFJu-FW@H +zN|H9@#>0i93ME*@v)mypj2*KmCL_6p7V(NhAen}>`ew!M@mW^4%51tKl6>f@0qg6} +z@|(66F+5GRi`5`WL)+ygb;`+|GknG}KRp94BRgx7s +z`}0;kmXFKnq+61LrGOs*8Z5?oCc#A-pC#M=(MyUdMv<&&Me^52`|+xtOgODgSL)pP +zl5bxw!tI$0D|^Pvi7n6Oo8@SQyMvG}r~Q18ov(#|&gFt>^etxS+9CpETy~MS=0>E| +z*g^1GzL&yFz{_(#uko!vuKR01@aLMx)2EWrAn<;#i&=FF=qfH0ozDZs +ze%fwjNN&N+2Mef{2CKQ^%d8{d_z^)@cUb=bsI;?ZudAg +z#uDX1mOd@6jO4KUaq-yf8*1B+BgwT>jt<_e0Q5|1~!uDxoNZs9+zKUa)k$Q_$eI;?dIhZ6zHr`pR<-@|!{ci(CbXDICpZFKq- +z2rB`#9y)MbT9^(4$?at}I!SXkVd4UH(w4Q|EX5Ozg=9EZj=wbJ?7y;sB5A2bgp-Eg +z)a+2US-Wje)h1_Kfz=!gXJ=ajtIM&*(Q%hFBB~vAH};R%s2X^6WL)}jwsk(o-|Jj=R@>&?%HU3pn +zM+fT__-m=H<4EYH+|cj3?OyZ)diY87BO>e#8UE)ttoq&Vt9jr`xvA1r=F`W$qob{1 +z=GTB1M=s#K>)YYc@u3%?h2M(d&2T<4m;V`T>pXqXZ|#6m+=F{(ZYd4#Jt;3iKcf8W +zG|MW(-q*}+rlawNqhUM*YVKMQUyHZ>@j&tYB|?X% +z^<2eiNARUbPvcL+&NmImPi)Q-&mXb8uRxD$ppouZA)bD&`uxH6l8c7+zZd)gs^A6Z +z$fe&9^bCMJV87;|rjGEi2HAG_4)cS4kbuoQ-G}-@-9ZWO!2AOeAvZw!A1HkL5ce+6 +zX?|e05kCKL5BAp#qt3)vCrj%4Auy?fF8~5oAIyJR5Oxqzy~2H|cG#S_|^V^K10pcnlPcWnT*({o55Bu*dV-&tY!hyQ8m#HajsdMBQLK@Jg? +z|8xiU9A^A4?jO`>|6PgL#ebK7!WjI&E@BY>E-mH1lO8y968sD582;ZPjj{iOJ4?TH +zS@J(5UH@-Id0qcMNmC)k4f=-@u}1$zh&E69FCWAY{>M;e*ng>={=Y=>{Y#|Be>Z1S +zBFY8gAO16g5&j3EbZyMP<57bC)_8{HKLJO@3CNJ{QjJVrC{IxxbKTmV$}2J +z3(iz~-G=|VS2v7?ZCfIPR6ESflFZbjD!-jl-JA9*_W5~eY`hGdo(*YZG8QO&R&QED +zgKRlydas3UUxRra1c|QR{JBy4`qDkBStDRA(hGM}t<4W8^!VHwO@Uis{Cv#b{Iyx( +zfxS}W-wVb6Ap9~{vOdY-dk_R|!}SeCnF`qF{&@d~DL+7I+c5(89p3Y1%Uvo+y^izK +z{!hUE^yT<8s_^Y+M_E4@FuL)&5rpr(KO~^1gz@h-r!bw9=HH)|T%Tbd?&JN0K-4S4 +z4B*C3A;N%`g8WU`}pfbq2BujbPK)-jwIbb +zz6W;+GKqVh!(tWx`1&-Ayz4{R{Z7*TN7T&|)DnJi7rXdJ&c?c^+pn;TyRSzD4&DDp +zmtVlbi#rZeoL_JJ^cE%w^9z|s#DNqwMD-&bbeUmV@pXTMz7ITopR +z*ky4&Q@a(3($u?JH5k1K>67T6jHG9ot;SuBrS-^PaV*r~yxo|SG+5JQx|GZFTNX2* +z6m)48xwN}-=T0?{*wty2s43diczJp`s4_}dF}u`@g~h_`WYT?>%aZx?=S)oo+ib!+ +z0ro}p8gcO&xF-@xb`@s0@I-FEuf}`qXZ-_O`o$hQJlmo8LhP5!bY_kG2BKPN!#Xg_ +zB;tRMu>)dO-PKj5E;{NiCg`%<3<6%I13{{Er|2%}->qC|sy+1>r^D(P&$Az#*a@fx +zBXb>Km47&!mb;>#Lfm{DD}zl7 +zL6@pl)`~Kh1r@1iO5_&G1m2Pv4mBkqgL_Qj8#~~|=7J$}x>FjfI7m|o=PChp%wOkY +zn8sKf3M#=m8VO{P*vN@Sd$X3E<)ii`Pq3aZ8Ot!(D8jy@L +ztFyex5$MUA55Y90jTDUB1F3zr|K6Megj&`$Gh=zukR<#)|ILnN6!^2F{S9jlc$;<& +zLA&+9NQI_=@65h`W9x_nK@NPJ6ZWNwM_Jm$GNHXVyoI-E|?A +zDN9(ArY9%|u6F*E7eAJAG80P5zzh4Eq*RwMDn3+oabZIFUYPsNgWaN;v*Cx42@P#o +z^9Y=~Xps(yBEoM00@-q-_w~L9YzIqh7!zHyD%fiG68cMeO9Ij3nNBX+- +zb9@U$1?+R|qtax=89HH%t0xz41LI~It39K>HL)AR_vT}u@c8VLHWcgc*R{3kpWhBy +ze*)71Z)9zAmK4?cz|)U@9U$3t787ZvFR-J%6$0x$z)_FmkB}ygnuppsm4W+-kfCl( +z7w|A4K;&~9f4!$Zva2|DIj;Vjt^F%>Huy9}fB*8g3%j5ArIX%uA>d}YvIZWcpuR!L +zy;`^x!$mZBsl|GU$}ixLl*?S%K>DNMRyg$)@!bv}0~aQY6W83*Pu$YK +zgUqQ!gsk8KZB%F~ABk84eclTI{XCy+cW{icz+UHBy6@M=h86fjAYc<9TRGnuWvWMvOlT@@3k#ZUFwh0>U9l2VICEiU$=k4 +zZyof`GCSo!mWDmLsc<@l!5V?OL^VP=hlsia8Hu^D8>cHyUcM}q8Z@}71y#P{E)Vp7 +zDUqk>j-e(}uDCZ_Crp)b3; +z^)pB91>k+!v?B0ZDHdX1yhVS)CD5J$k6_YarDVJM6aD9&ct}0M&9qbP2Xg +zs@elOC6tt7s#!(9rj*a7+SnrBK!75*QHd6;HIX)=Y8H3=4)&0 +z`{({&i_iVO#?O7ej3}U~X9`bYn#@hzNVPpr+R&u$<5+cbr}Xl74l#uW|OfC6s|CE{A%hf +zqw%6(&y`zr+cNtxH5d#=;cU<#c`h3MZ2un!(5X>lX31&yRfs(%}zUF +z&&uUuc+s)2d{hakLssb!{AqE@fA9UC0|@$CDs74kzBM0q`6l#G%?Tu1pPEs_bw2}Q +z87|lWPYoM^`*fO5s^d##s=+rJGAc$C12reAP2?GifNz2nMTe?QrLkWDvQ}1dGd9!F +z>eU#f?2{t3Nfj=quqL53ip|i9?b}|>rPD*=B6%_<7q9Dn6{`y0vp7$a-T9rEV?r1 +z38}X`8Cuhmp*e`pb%S!_vxe0CW-M9!AWEImTwOlCSO_@G7PhgE%Vw;lrzCYj$EAeA +ztSDf}*4^gQ)wRQ#mCIrI@Hkmu7zQu=T +znhMppZamCyNo`B7Mtwd>hgYBmf6IfTQ!pg4jWYIt*xGJvxp=<<}l{GT&+*uKjwOnML +z9BpaY*;cTphgYShuh8WA7k7tN!n1G*c@lRO6ID&#dw7B-Hu*u8?5N?qg^O`qN=yqk +z&W`%=Y6?RdH!Qvx(5t3-^F2+y{mhy8$x3(;Rb9m@s-KCqo-n?MfK!R#B*|qoAoiV> +zVbnNm!zhm~GB{pxMot11?p+n94?B68WDtMdnU1+!@`F@IWYgwIz<${t6lMP_MgK3>N38z#l#>Y|nsbvB4M +zd(Yl31&Q;JW|f|-<%!Bp?c(#DbaHO}0|a_taO#ARo{I6u0e4jS+i%LH+sJPh4K4HK +zA(1erCm{(R^FiG&?KcaZ_+t!G>7jXiu)~HfhYfDl{KMnKAA8--Y$VXmk2_ECuPaqzXgDnk9{nyNMNUD{qM~R2b*N5Bwe&7 +z0ktX2X)p4Odcunq;>Y7DW4G++$n6vPve+?3gIO=(5`Izu)B1BFs8D|WONU3h)^p<1 +za^xrG=W0EVkAgh&><%{KAI89McDCAIFE4z}y3c|JHe%O%V7t*k#{$szxOyA-@r +z3gLf-?!Eo`L;t#e@^L=&7Vy&GO^CKS7XXndQq;eRP0W~Vgu338F&E(VrYgw~Q{3BX +ziS7IJ23=?Ck1&Oqu79$r{l`fhsYsYD=*N={dIphSnY4|ZBI#||4)^>SAU*6w~}bx@E?Wt +z!@oa#OQV{Ecv7@NhYlw!HvnY=Z4>{!}2ATx0t7& +ztWY_>F^jJV7OnOBQmvekjwx3LGQUX?U7Nk7jE5#yOOuB;BMwdWuQ_*mV|jj-Aq~B3 +z6NI9l;NDW_sz8vQ@7lnK_&%BK_UDkR+kT$&HV6nn11vw0+o87^KEG{)!9M}_I{z_w +zE&gV*kHlHoIYH0@A*T$mEc||mu+hJQ+o*XuvfjUA%$P^O9mbe@sKY(n<`iywh>&qv +zO#y6byC#~(X*=yV8aVq<(*4q5&l_}IBpzCXB#AbuI>c*CJw(W8Ekk)nB#CQSSCmAz +zl1)&-kc7$0h~P>jiWwrW2zv*%ArYeSxpA#8;4KRrL1p`M3RAWeIW#Oj7ha`2f +z!%gB477yyAoM`tH931^A01r7(u{Ib8xia>yWu0`21|>&W$LZI*-ENp&sbXUqKx$QC +z#Zk>J_}XlhpFHoL&R^2Qm3kH~T2VdX$g8*mnMO+RqM|;l&Zb2f4A3`=Dm5k4s4`Nq +zVKSMw{Ha53_viwv4Y7~%#Kjm0YM5f~$qX~h_ig&vqxD>=CGc}uxu}DIQZ+QgxwH}? +ziYR!5lIUPK?jfaaVM-Z3twbKRdQnCt3pz9(qyZa97EF94u5w>FBfvM}g{P5= +z+zxSaC+tHU2PkED8%@Oc79GVppR`F8G)b-E0>oRmC6C*MpR$pbm#Qe1l^Z6bbZ&}( +zJxS+r)r6qLLzDhpajifau9mW3K&BS!>=Eikka~y_ypZ3u8O{9mx)ni{E^$i|j#>DV+MyBn#8236p7Srk*(S7pXLpsYIu;*r6`JorHPgOX;^N(4YpbpkHFFOIFH +z;k9$JD(5u$ji6j!6C&mGh@^8>*s-58vxp>Kz2Q~kovJbpWCiX|oL}$~u2p`(VulTo +zz2l%&pcDvCWVwMtV}Ijoo@Y5dH5MVoqrb**j=n=hC9 +z$^}*%c|3d18Cy5$W(^-hTZ>0qx~jivk_Fu0SH%p`!uQKjgO?3DL~dg%o4Hl7;XhKD=5bm*N9KyTpO%k=SK51l>i6k>t)(0afUNY<}ypeCAa? +zS4ty~=kMIdov#!d%Kh~hE(x<1IfcQ#CUGJ!xFx8k;jYtIYWpfsJbqTcsj`skl9$o8{W>ti!kzYAqhScj=vEF|! +z{=TgcgA~I&1aLJY)ufYH;ri*nVtoysfKL&DqF4h +z0@`(bsW{N`)GkczDb&!jI-d~T%ze$Wow7e|Gp@oylPVz$%I!0tM-Y^nq8W{NC-CR< +z)riGI<~bKE3g;|m9To0}j)08C#1?o)2*)#hL{CJGhW#RO{n5v259HD_AHjQna49h^ +z1qN$>Vo`M3d|Fi`GJE1Qo|zTr?#6^U!9L%JwMLy#ooLsNGd$+pAh1bzG7%_iQms&VRrysHqFY(`#1|y*1?z0z%*AFkGis{=L)2S%Jor^=B7@)a +z;kNK9Yu=PwFpXgu<_v-<7Ajmu@W58n8|U_EGdfu{i@^t}yAyr_Y{4~*h+OmUZJ*SA +zC~)2Y%iA#D&UCESfuVl_r%?e#s9 +zsCcqjKeQy-S|M!pDAP7J{-7vnFyDzk?E(?eyL42$SuZ$j)nn;W?_wVZ!ES7Kj`7pM +z8ucAg@F0c-(q?hBY<38J!#q$+Ycm$Mg~lPL`=@CKM*Pc@#wm5Hc}zacI*b*_!SiqM +z!SuEE*Z5Nf11hZB_Q|H!PCHx-$?LX|3AKk#vlK^I!w`(G{2?zVY1687AqOinyu9@AP^M=Bi(^CfEx8tISvu}Iu` +zi8rIkdZp)jdh}fA&4p3bHPVr&vV@oSQoqP5!kcD;GsP1TsP)WI*o$dI7$qCu)kznJ +zo=<|^g`=|)l!K&oqTbNGgl2dvXG_0V)22L(ydFccgrlK}(!kZxILvVU<|6ydu%o4S +zj^R+SY>6bUq--QIP7y)>QCn3?X%Cp9H5(k|f>O#z`$!g$2s0$!Ww$Y3rqwCO4Z3e! +zUPj>^LTZP>&UQ#b6$?Ux_7(M86s1a~v2F&t3DlY`+dP?LOS2*!J2E<0Xs+Dj5n?#W +ziY6Tz{r&4gFENk`dkmuYNLATF`HOd6hp@P<0t+|v}lZ7c1uR+Pu +zOIy3g)RWUChRlvQbyw1~G-+j)qu`uFbF!;ZH!(q0Rq2YA>WtC&llE$?ZF%$3AJPD- +z?$9gq>E{~f1XpT|DY|8xW7BCN14#$pGu$FoMdD0g$4eK`TS`O(G2q3wBjF}!LzcS3 +zOBKbczcRo0(o~t}m0$_;DkF}GR=PVB_vCJjYOvyJYy371nkS$qvk|j}HKym|QJVLn +z+uUFDDau*1!o|0P`0Ms8V+XCVETHBf%%cx#uG>ylh_#HH#jMM&Tim7IOd-67Y8p&Y +zZJioJs+kQZRVp*>wDc_&fg<@!#3Yt0!rd|JX0GdqgV*#~{&s>?KhWty_owzbrEde$qUG!;y& +z#!gkzU7EZ;Hyc=_>*b~;xm+lSCU3Vc~W@oM~cNmNk>%HK<3P +z?+UufRL1&Lr_RCHUGbyo!KGuCum;jz#gaMJVR=ZIx;V&{#rc(0H^fhP>Wa&%c1Gnd_MDW2Yr6)|AmhDn3(t?z(SIi5xszABo +zBs+}lN#%)&KcCRp8EavxvE{&n9Tc{i8L^eIL3Z+Wpp{P}R30gFN>eBN@X~bLgjN?q +zGmK4TQ7~N0OG@h;X_-YZRPQ!=!&=P@q!TJK6VmX&AQ2Y3BGE-R(EEgs(9N-jmd>S~ +zZlvL=IfX<^lJ@1#=1lg?SwAM^05pZ?u8DCX%!)Oo^1S-6{K_?0f113S29h^KU{WLt +z1DGdY#@}ax-N~D?DwjBB3dbZ0odq=ztBH*<;f+L;*U!(+%GTh92T1cyRcA?^^BXWh +zh2yYnzv`W|x31`;CkD-K-94xdaJ+ihTTPF&T79?kBH50rA3`_>>15<12uY%MYyuxc +zTSOvXyO#y*MM9x$qaQwGtCJ!?i2A?8k8CzPDDTHJx*BZ#e&!kyX2_QXl#DJ{a}JesQ}v51o)k?4Rh_?D>d)HXSkSuyW7?k|?)Cg#JiZaZmVs+*eg6nMrt +zm)mIQO-KjnOVX0P1N=Wf&x?Re&3JX%rqUZ6Kh6O)-jPB6l=fgtx55vZDF% +zl8q$EgQw{`9E#d18$07=knM`go$}k=och(x;~Ub;AZ^NZMB(;@xK0h_EL>+pO5@jj +zLGMWvgec_BIdfoH;+&6*^$e}Wq1kee+|NSv=$Dlt1{-&!lKn*X{k9PiJr=KhMBmS& +zzZ3hozUP0KHB6Q&7^W25a9k?AXMdb5#JB_vh8y0Ps|4s`7?e~VuW)*9$hB)K?zcdH +z!k($T68Se}grY8WoKX2H&_LJ8L5P~{TWMPFUy%KkY^w_u;_-mNcc4^Hz-5_rX0Z^4 +zwB5_x;Eg|K0gp~2s#KvSB&^hjX|-27;jOr>(@9y&m;Le4>cC%C;|waH +z6!%lt>^@u74WRJ5SF+Xk3d^pKlR)_Og4!w`X{+hU1Za-xe+XA1Ov|YV#e0;?=>QwQ +zv(qttyo*z<)4dBsaXMQ~@VyK7R`l7Yopr!~>xV8dlMOgZ&3U +z=XP&1`R+>IOJT;oh60W5*j1 +z`3-yS%a(Hual{x^0G!A9*i&AY{z~VysuB@xO^n=d3^5L?+Mhg6r`A~!mu+{%FN;gY +zNlMDCs1n>yWdKG*&L0H*fiY?4K`?>(l|onKsG#7Fk*td6U$nm^oWq8Qjn&)$@iC}2 +z2%jiA!Z<4F@1;dv5NO*`Qe2q)qf+yyC=!I$i(ZVXGr~Giz617*N?0rb0Tcxp(HE6a +zi39jb$8CkfHMvvsFjqenVeL9#_(Ya%8@s3^1N%8ONzb`tP_-lsBkniR^20^FXyVGfSWX1|6hYv%= +zakrUd{-kF1G)X1L5%uthWYRGW4bUAq>XB*OIX1R6kszNrWThmi>=eG&+pv5~r63hRVIjK9cOzc?pqh{3TDv +z*fp0M#Ge{#hr}{aTruSDB}R+n;H``824VC@LbNOae8Zhhz9l7#NcwS4(G8MxLwIpG +zwxte>S4Xvrf$RuxA{$PoFNrf_fuW)%IU6(SR%YQR>BO^ZFdXE)San&BMB7sKYkh#I +zJ$k>6gd=&uVygBn5nF1>MQkPx3Mcr6QU@7?ilKhucZDeJU+^lHZy9=nxty9PDQ9p< +zIvTDM)~`zhp4li2?PpQqug*gij~)K$sukfA5LXnbBty;Uzb +z8OT2JK}h2GQ4_X5JY|SHnW-Mop6dVVkX?USa0EYJ9JZHPudV|AS^)R$Z*LjkkH0L@ +zcEF0HNfEc3Ah(8FaKtb7PiD`30XF?Y_PkB +zN%Gk0St7X;yp<5qyz_jSVr5lN5mWE}SF|&@Q&$^Do>T*hxx|nOF?5Ujqzj!W6%}tQ +zY%uA98k#TJ<>yl6PXJ`*Jhx59@GEw;aRRZ`xAc`0S)PW-nrDYlFhP7S@Y6{LSh`+TQ68YNS&Cwhpl|9ma|*+~Xhc6K$KIq3?t~kR$v~d^1ea +z_B!eKd&Y=gGMpsYyIr(Jz-??qfIAiy=y7tRlA3vh+eldlCkG{1XnP!t|( +z`f+;VA;=Vb`vh~yz>lEB_bGSYF@Ye?g3;IciagBOvu_1??0^Jey=cds4OHN$XtP_q +zTyeBOdI3qKY)`>U_5@XXH_9RGK+V~*Pz%gLUpz}me=iL8|0Y5C```&4SD{qoVU^a8 +z>!p=R`jHQY6_#;?1R7T!LDWV{vM1NY?cm|rGw{`g4`Xjnq(b>}*f6u9)hvfIdbrmJI)geDcC>D9 +z8j@TCD%cBtq(*~#qfbTSGm@g_ngJ)ev+_5G)g_~px~Q4s_ApR5H2$Tnc6ElGqC=R= +zCa65)gk_y}z-1|bkQlN%SH-u6`FeA;GYwRC4({-64Fpdr)cx(ZtzXEG;SID1bMZF? +z$V?0F={HURaAEX%`gw~zD{{6;cJSb5a~stG^<&}2IoBB6!YY|^+_`tV`a>5sVYT4G +zhB?>5vlcN{g{ZajHJ*QlF6nMx@#idiW`eY5mCx`9<=9&Ju>7)QGtM#4D&RYNz9DuE +zArZ+t_dwrmhgJYlU@DD2^?kmn%rWkYx=V+)738ah)j4~!yE9*gzi#oisr!4=SQ~yN +z=(*zOk!e`yr}~FS>uJ+iL0NaBRUTH5)A(`-t)P|XPQG``_-ujlcMiNRLU>3_oBzSc +zd+A=eQi@1G9@vb++KG8M6R8bOjbDW4kZ69;)@ZE*9 +z65hoMcGiV>32QF!)~;!J5R2C=3EX=7u%mO#n0wuJV{I-Q&B$y72NE?z*NOo(fq}hl +z<)~twG+)>FkgTmW+W<-%+Ns=Fhv%>Zsi05tC(B&u@X|gd=O({)+mcLf?PYK)pl1>S +zlA-qZ^d)b?ptIJRC%M>y>BV2Q3N>E{Fee^Z@^H+tQY?$n9+@ +z$EvS)I|s*N{jjo5L?hBzEGKufmAvx$#!`6|Hh~A>P!_~!+}!8OFMCOL>pFx?Nw`ZN +zfuhW)9ngM&ber+j0#<~eK?@f6SL7SPDkZB_8&NH9-Ik5yGh|mt!vtc@t4-JjixFag +zAKU`kyaA$-!G2VXD|DXF88`AeNOcscYnHEjp@kk4BxaDlq;X#z-)^(Jr~Ph5T)50g +zh9IGn?1OV}To(;z489;ll6@O&KWvEA@*WQiA5{+nF$lsOBJt;Kp;}nugLPBw8Dcly +zn)7NnWd&Bm?Hju-Z<0n^+Z6+g)rnv0E8aL~&8b2g>6LoiWj3ZmtD5+h+e#hmpi-do +zDbg6#_On}LGv{#bQI0QSR&re5IT}QnlKya2os^vqE=65DASj2)vJLr)!HC=aVtVzx +z*A7EPXM(%p9#Wva&S61*10rHtfddgPba!r#1Zg`flahGNVFBOP1^{|BoY2f<@8DqS +z5{p~0Mo5%r=z-(k(zG))V#vp6vipN=2ebt(#E$-91~ft9uO(n!H-DBE>`5`q%s`_J +zP?cxxJaPa-R`%Mw+HJ$38M@Tqd|@qGfyiZDBsM!GAKMW()jGO@5KY!h6EnX6>(54n +z2r_%cFXr0F+`>6$`1F-eAV|W{DuNG{Sl>lua8W+&tpdWr16FjCyXJYx7ECF +zwv}2CoS8s>+7`9F9QZh2ZAtMoM>ad*jQXr4O|zkT-nELbu#;k8U8FOv^@NLkU{U9@ +z8f(FR`J12zs%_l9cRP3(%hVo0XI}WPqV>-#P&kDF>z37(5v(VR+TWY4#teOh^Mkwo +z79g`VWKXWwwFQJN(+hy}u3?165}U8=1x#GvdIlVWH~F*N>~zaBz5EfD5#NIk9EA98 +z&|7a_TZRQiuD>2UkOQ+&b9^_8Lomx$w5h!*<1AK~25NB}7qMCNjLTyNec+#mHd@B8XJ-a` +z@~i=|+n81ksO_y1YSL@zvUM#+Kgull3rZ{`?XhY#3pYtC;SQH(&i-1opg3ZkpV7kQ +zWY~v-eT?BP{g^xJPv5K!f`eIuW^l(i=FEQ1=H&8&uj&?v^mg7WS}e~W>v`JPB8lu} +zNY78Vsg#$%r&NH}ZF}z-3wPIdfBB~A#NEn(Sl?d-$jQ#;X{p-2yUERRbIs7F!DjNf$|1J8YQwfci}Xw5}l1~6NX2>*7>TugI(}fJX@H+#>KEkxdw@Ja~YvK +z3PB;}z7V{%YW<$&D|J=+GlKj#N=Q41Sz-p}M!m`b7X~4HeiKW2DDXk2BcDSV>soWe>NfMf$+C{{19riVN%QOXD!(xV|8DnH(DE-ExK(@U*5C782&=sT +z7FT>Zu$H2D?|`!RuZHx`YXML7?;b01%Xc`dR5e6h8N`>>z)nF}uUI`P!}n-R7phwrGz}tZ6Myi-(Rkd5$|~zXmA_BsnT+3l+^3 +z35cxLD{MG+mv0fyn|Nl`L3m^(d!NmlBRf_QM*8a6o_(|PCti6hgZTpYh=FZX-q-BY +zUZgE&jfRj~&$X*I<_2EbvuHDNdQbJE^tDBV**vXf)~z0Q6UT9_w51zKf;5#?P+wjpM- +zE4-t)s}q)3uypQ527?q=GYr^C7jlRU+pIXM{)U`DHKPwCT5ks`E-opmoUu{6Z*uzR +z#&C)(;Py&$z2%cg0e`b}C6MM)eQW9$*XWB^H8u6Rk8?^q3QXzVj>75j5i8LlB +zs|z$TN(afn=jjM9F>0g)sT;GmAOO@Q2}V3(s4_DMV^>4)+L^=Y$6s)&rEKGZ?EN1At3Xu0Tz*pBb}LiQC`z*Wb2VF><&3;K +zNCBpy*KTT32d!-z+v;F0KycV`0Os_xQP_}*+?gX>+_3R6jU57H1ym85^r06pPfDWD +zWZiJ^n+^fv-R-!=oCzpJNbdYho0f%IaFmcWct +zN~c14OQ)Dd3W-(7;_`M=Phg{!u`v=W)g{F3bocl@Eb?!U-)(dgwqwC9=pI~k{Qps3 +zt$SETZU2A%wzf8F{I|A+_%D0qYF_GCx>Sk~FYz$o3M3AS1ig*{P`vn!_y-n;BUfrg=!)-4|!4@H-Ol#g$dPz4`Z4x@}2~w#&Dw24h`n&a55F{?U9zcT;cV}@K7QW8%p)Y +zhLZ7EG}RN0^{!dE)J+2;S5&!_O=Cb(8dAPeB(X?IOjVcP?RE=|=U`n@HL%iBw`-Pg +zG0-yy+#e5zUBz;VG@JY#E6FnX)us1TU${Rq6iz`clHs^(40xD_gp8F-9%(Em=d*5U +zlcP}#bqz_(QCKlaW7XOhp?O^-3I3A0=LLfdAgL)PLeNbsX^rVOE&3@w?a*6HMr$e> +z=@|+Qh8gWUg$|+LzAKe;Xx4+A6;gk{sFRWRgoQlyY8Lph|cjJ@XAu1BdHO{+4Etk+3;1c?5eVF4H(#*2>qWH!*Oz +zw6s#n!yAe$l!P!KIU`0k{@}CDG$6S($T>(($Vi+eRwD^hO~M3-QF+o5i!P0A!V)kz +zOSzPn3kZw^K-a-jTBQ-I5|v_6DV6(SRAC@0_6-QE5b5&}4i^ufl1hYu<&VUp@X!~D +zhkKLoBQfj&DtASP*Ty1!ZYaegEyj{r0AN~K!pJ05E@aWetX6d%6a{NbOUzE8tLg-i +zC414OZMPKk1+d<%hkWMlNdV9RIh~bDs)--WrgsSM##Rl4Lw(_RD!e`w8S0No6Y4|` +zOU1w5qIwpsQMHisBvmFep`~(>K4wg$P?;R1+##SP29UJUHXwr{NG(+rkS$u`u{E+> +z#2$mhY;LPbUAx)+*yFJwc%xwq`@eB9)`17&uG;exw4v9H_}j4 +z84nZT>ED8kpgZ=2l;$6u;@HKCA%(F}h)~zs!*{h@9)|Yzq1ZHM>>~h%dP1&CO_+B< +z0t*i$9RSiLNwcC`@@b;E&#q@C)A_uTA*oqIGZ@vbu%s-JFIZiwz#!r4iqII80jqQd +zO0@*jao}zB#xsbp +zgijPbS+4DtRMsU3>-uq-G8YjAG`Y4iAu_Fz7L2kykV8@_r}I72Wm)xT%N^Q#(4U)aHm-$M!W2z_`xn4z7K6p=kh3k+SOY7XqOv> +zV+_z{Ut|8YTFxZ$^*lQ6uby8|V+ZAwid>pb@GLeUgamf^S@^g?xjdm%sRaGz?lKR3 +z%8S;fOF1IC&ldw|B*Q>b&l*Zkg4o);bbV7l6RIHWZEY!QZ~{`cA{Ap;)Rf +zlniz1Lm4@mA#Y-&zdzC&2@fSxJ@7Le$HaTe^BAw^7^CA}<8-sdhJo<`fbDbRbWMb> +zo0*l!(~zkdKf?+(UCEa_XT#NO8);&0jiV(wy@j$*y9tlh95O{yC3#%eux;E-!ZkK- +z*B5F|k8vp}?eLKAC>y7^VC)gsGdu+m4d4?I8Tm_?hiOIO1DAIAH)vr>rBq?jWOHZitGcoy@$fno| +zpQaTUmza<(BvX@wE77C|CMG7P{hreL-DBljhW3*gB&Fk0pHjqR_&t^8vjRNwc_FgitEGQ_hLcI#b0bn#3rxv-~sxmtg6D +zWZ&4Q+G`gwc&Q*Mu3N~6XkkEGnj)0r}b$n7o=cZ^P?(ji#$z)H^~*3$74mgutuH^Z*$={5RiLA(bQn5 +zcL1hEkBtV+gF9cCG7f8C;BWxUEp>M@o}3uz?F}aql+QQPN?<93cGsf*5DJ1Uo~nvA +zZ6YZXv4=L0XjN>Akyc55sgpFb5lZRB@TSlhEWvGHT<}Ne2p%GKB3;PlMSAzHr+OMS;?w3vEq(vJCL+ex6;>}bkr^yLjHKc^4m8>Sxqe?!? +zR%58qgQ*q18B~pghgY)L0ku`V1$j!)^|D>cYFS7*O9@yewU7w_>p&EW9;0&CqfZNL +zt%4;2<}uqv^aQJsX8K^Ow%^g)}&wQ8lSYY6@`hstDeh3Pr>5q?oIy6#3H0aYAma +zfPoz&L%q?FJ{Y!G8#*{FgU&^Xk@p>mIZZEBRFP@Hph#Eab^u*`m^OPbGMN*;6|%W8 +zM{{$df&URU=Ug#Sp3JXYF{)&zS7HNfQ<-&WAUae{>Ri!GfURgIkQq!}FTzp*(aPf$ +zIVYvhtmNR4h=(8o(Pk2*NF$42Y$=-y5;TZ$R9uQ#H;Wo~NQfH(uzn^s>dC-{u}rk< +zY{1%t^K)U&wc$7+VxrhwT7*wztl|$;xSI1oiv~k$!qM2!YM0;RBXVrHRLB&kT{H`d +z|5~O#SizX$$}WSvI~w>dWVm^jy+F +zXs9n5mL>*Ce0h(gQJm?b+)JwDK^#b{N+AW3YzkwPRnNlIJNaTkpH7AIz5hF#{r^3U09Y^nr!Q!Z|J&|wU5Nj? +zS1!)LQ`$U|8gOv7`dU|R;d<4t>f>LC$-IYU)EWP6twD4A-}ZpNePR6XjjL%MFGo|8 +zg!8V1^Eq9ldGTGOEXmvCOa-+AwQrj$zm*y2W^9v1{mSDOl#Ar`i +zg{3YqaIXV3a(QCof?GKf2=gguy9<_-^b1oLQ5{pGw(aZ$lt{5PPO|DFq8Lp8(nk>% +zVyGkCj#`LDzWC$ML{9?`7$6pZmoSPf6pX!wA`vWrhBw3`s|S);O0QC!F6G82%95+s +zjor}Fgt6wOHG~aGuvR>S=(|YHzA#IQm}bo&LPBc`RGAWz9oFpY#EPHc+_EOnpXgK{riXv!c|5nd{FfqCC5>Zdm +z1C3?UhV&$*fInjsO$jOG7`jVuy#ezcQ|}2SaAGr)8z&MI7FPvaQC~Lhlu7H4hJV)K})TrGHI`Mz9{Hw4T**KdSau-){x%# +z3A6A_q(EF?qV~rppq4OH%*++<2K*NEu_k;c0}HS&0A1N_Xff{twh%4k@@)6lm}{9- +zz>RNHi+ELD?ewx6RVNybA%iD)Pp?z1M; +zcXcrNDI?+dhEyUMj|{Cgq!qVxh$Iq*q={r|Fq|BS8NnJibu^hq8*6kQN88mk47c>8 +ztdF=c4wj&CBYxbh_tqE@LC0Kf2_`PRbki;o2ZRy^Dyb8bw~27* +z#7z?_WjnoCI+wOa6{QU5Oc$BZs6Bfmrk(_FL>a57*f6=U)#Y3h9*%}__c)Stl6G(0 +zD7@Od+3moA%OTNWD(NqPA(Dw#GIMR6mOF$2gSG!IQo#08px)B;HhL^5Z7Om%7xneiMfE}RYr +z{ozH7V?F=%H7NDh|0Q{R56h^h|MLf1Ec(CpwuSZo-nio7)#1KKvc=)pXx+fvq*?nj +zWB*pKZ?nT}%HK^?_#>fIUnIV1leW}${_7L}!eu-DCzWiVc^=EaG2Y(VT3!F|GoSx! +zY4f!~3;REN=Q@F^NO^A){ir{v +zDM$k?L_ylt>2I@9kUEmx5)zBU!T07DxnSkcA6X5u&mep(rxqn~E^rJ+yCwd!m;TH+ +z1_#)$2}cs`B>GtfSYwPi=reyBjP;>SA}KC~5|*ksP6!RdG!+iurd79;F5;3efFHlV-G}8Im;C +zbFz?B5tAxfQd08(tASROp$0SsEm$kTP%uqF%hLcG%5yk+`=g=NiDifen8b(N@HaBl +zo4~((#t!$BN31*j-4t2m;&_F`#uuUCIC%+z?Pw*J&$65V$=!*+2i%MRI83Y`{uX)) +z7ed?cw1EUdMl7)&${mizHVl&0W+=Wooa}b`ecqt63t{yVh@>6(3%4g@L?H|nQ-tD8 +zgOzD+QBe5DttkK+xrVLiyK(Ypkb7*wdDG;STR;mEhsZ$>-4(P5ZrI{oU +zgeqsHCRnJdXK&iLNnB2D+PrBqdAG|KWdY;OB%xilbO7nE&zd-CZ(n^X(`alQg0srQOUpg +zw8miuX@|`QLm~yQT3C=+ud4E&H!By_`6;8W{f|ZdZ*2`M?EmkTt7`ufHZVVB%zgdW +z+S=k@SpV&ft9JjR3V+WHfa;C^_JGCyFW_5P|Lv7)zV{-iw;)C~bTx^K$<}6npxM_Z +z`P(`J9i1($QdyaNmF#RLiAk-Ks3DP(z2sbx!=Wkr(b!&cmE<$snjJB2j_tOgirG#j +zM8sSvAkmsswOA4DQf%{ZV-=IFN0I-0L&eoRBV8^S-0_e_QT1B%P +z7%=n)e_Mn%eBX|(NS!uZgFBd+|Lxl9`}Vws!k&F-1UJv=E_}M^O;>QgobJ6_cJuX3 +zY|7j?cY}PmEzK;P@FO0(U?ysLxiDUyaMJy00V*qVw_uXdSx%+1*%D7eo6W!spgC?g#}rFFp{Qj&$#5*rlAtP0e?O8S +zsE7A>SdP3mS#Q86YOVnv>3qs9Ix$lzH)o_ki7>+oKm^+if@LjNhvECC9i+yJEaydTj|j#4<6o`S59Ip&xrP%+;T`W=@f*WS_UwJLDU#&4zqpP +zEZAys%NIsRgi7FVO&d1dNKmVpX1>XIwF_{kLJ7qb^+=Q&g?en!1|uVx-hq*!HQ_#b +z3eHK+wL-qw8fxijX}o53h!wyBCeVL@wFI|xPPgRK>tteeHZ`KnV)k9SLFp{>X@;V^ +zBe%`hRZsq7)|PuD0M?QJ{H^BmUjZNfS&;ws!ZoifNtge0veDhewm17)n*FVke|cxH +zz0u5lb7sL@S_e6) +zjuTVAyu4M;n;>h3c?_f_Er)D(0D-*nNW|l*2`&g12$!3GrxcKd#YzjgcnP(RNi;Gf +zSiw1?=$nQfCFY6sY7midFt!$^kz{xf1b|RH65SvaYBhBCdc7tfC7Otq$3DNt{Cuug +zRsOGS*6n#2wfTRG-ybmRf7=4Bfd&4*H!kY`TT?$-9Di$MK=^p8nU62;^!p8bd}*`j +z(|cNNMy^CWcnc1<(S>)`=!2Wc?y&wT%O&FnObaZoB-^~^Vz}{Bx>#aX;;Ky^;A?e# +zgzNsm?Hq?2iej7J@D>}2C#j+63h*lCPDgj)3)j*zS$OE4b;wmt0mtid?2yQEu*>8i +zioBGHrJRD!6lImUhr*28o${nyLia|J6dFd~jN!p>eDw|w`?}p!Vp-hio5=ImZz9#i?ezw-Vt2E7liaaroyOsEu%yb_RHc;L>rFHi +zzMBmdVa%eruSF~OpmDQllcspz`)o!ld3X5?2T;G2sKnpv4J3u`X4^3DEchq&8@Tt` +zCo6Y%xhKtT*FMS6K7&kQ-$-e0jg;&gNxhvQ43dtEpW-&0CXq>2e3;Mk?k-|P81=Ek +zH@RL5%oxkIMT(YWH<7{fR~ZIGRMu(64^URMl +zZV_pXL8tH@sYG^wn*7`wel(>oUw9yb3Fs9q9D!0P7b`S$jM+Cc>!qF?4LX8LII>PK +z?MTgAS9R*UT0^l^Ppof)v+72dq?7! +zc55|NwT?U8xT*Ji0>rjM$kNROhAhp9f6Qv-*=!{4 +zeyIjvvoD+X-aM7gz-i?>43QorL&z$TL7OPvx<$GtoY_K&=3V^Vxg22tN!0Uc1^A2t +z_1H>G0gwzQ)7dmSi&o*SRGCamTjjI7j+g|smd4U&$>>M8l$PYJIn@5<)UvW_ekx@% +zquA~@SDjo;y>6G+JpSBO<{D$4n)jmjkcY8)D$Gj@7J}|fOad7j{J?^d`d}=CV+lJ( +zWZfv=JvM|4h@Q{cXjbPf^KWL86{&Du9xHQ3r4-Bfp0Ox%Mn1=JpGgHCYeK0MxR-Do +z4u&UUGJDcVFeDPv9O6B+5AT3DdgtR$lc4D5Lx +zrG{*4<_ZU|Akt4w-Hd_^ +zg^1H5M>+EoP0|q}TegfvtbqTaT{#@G@J|6oqpGG$)2m2p5DO$ZpG2r1F)F8$_j8#O +zj7v7XL+5wV#)KitOl;*=t>9U)Op<7bJiD#3xdv=j3^SX<^Uhh#nGllso-I%7NMm*d +z&U&V>&pg|y!lJHL_i%bJFTKBr&HEV8uxWnD>;5cp +z2ZnFGRGVSAZRZ|~xSGuapFWI2E{iM2vfz$Fx>QO}b7g!P0Ax!lz9bB|M1z&4Ecrw +zK@Z*K!Y1pb6tEcJmt{o(@vAT`hHa$&9bGxdc07IIt_uW1F6)T|#u}urcToP!hZe^cp9#pEN9i7M +zke0?_m=rj%>v%RIX;zpyUTmjvrqz<*`XjB%WDO!D*X)EiN@s-tF^Cdx_YTMGW|V|n +zMxH?z;PbOtXwPVts5DepXs8d$0lS*Bzf8dw12uaY5wTy#VVf*mj0pPJYiFqAa$2LK10 +zF*3zaa%j~=XlGB?bVfoG!CJS))!pBI#Jp9+Dr^p(3?yOd=C?T_SS!i#(}=shUtH8- +z)L4__ve9(nY<^ow0TaWXs(ojwz;3Q0ZP3Cra0b{Vva4E@y&E$xLlG%bdrVz$)CAXMBsfH{} +zOwdJY(_JGKj!9A*+W}lk<;qH07`gZTsFXt-f=w8ONJak@FokAI(P=w6rGEdb7O{-HpPNEH&0h +zX&&0yLsn!(>?K%aP}J}afzon(u|yUlID=`&O0*Ls{IH02E`%Qf(GPp@a~?o +zJWh!?H_A?FVT5<{DHD43$^Iw{3kokBxL~QZEaG_%mYN@25RmGHNvfSK +zU`eSly(yt2TIsWdqA|LV++yp_lN(YQlk2H8BWYt=qX9NcizbFPAT?WN-gaufYfdQ| +z2D6lAyI7&eEGDxo3%B~TL9Av_%92v!MO(x&yGEAKYVk!fRk7RSnXCpwn5&u{lGtK% +zK|+gdvS@qh)*jOL>{(j7y=kYX`kuE?D@yN%GEBRdn^FC)RGzwKD=f1ucVEb+ZD(nu9IBH4?O0 +z)C-x6OI1TA(*oFt>Mk+3-?ANL*YK##QY;qOgu02g!;JGLPI9=M?xuU$V*(D4TYj9<`s$>7JH=XAB{zu{ZX)5 +z+kfO)L(uq0G$|A(T&9l(lJYTn683b-b_2*Sl1>p%1*n#=bt0n) +zk8a2y;M2;q>ICy)=sw|YxGc--&o`6MTVAT{v`rWxa01@LSA;nmGL0ml=xN@nBvw6o*fc4n>De?bE#=WT3PfJIGr=@-YL&)t$68PU +zo^qqu7yQH*yI=vpb$u$UZI;(guW)ZkM)asP`-ASWunin)zNA`KLQ69QR7%4N-6gE$}8_MS^RjTp?EmVmJ%FX~b(qHOXBA(=?Up +z*M0@e=!UlXE%;W^&fSg=2qheO1=&l_L+oDBfq5u;hj?^a +zz=(dnf>R-WwbCYHz_5c%2XqnSoNPU2RApS_6qzgM5DaG^1_oAj-0KCJ36g5-;JaFs +zGn^Ln`i;pns|Nx=n^7&`mMudSG3M6NvsW@77>=Wb~^#~m079>|y86)voS|TWoMXR2Y +z)_RX*#6@ni)wIXoW#cr)PJU*>FI^u@!LnMW=eA{ZO9A|lhN-AQm%7Nk`!vZ#6iSfH +zFpw@h7~KQULV(=9q-mw$D>~lMmMZ$R!U=iSq)YHBG{{6yMv6kH5#nAUpVf|~a%ZXB +zsD~gFK=07jV!Ed(VcMbeLad|IN)fl|ppv80oI{B2Iv5I-Nf;qnLV18dKs?_Mvt1;G +zhDk))R5G+C>~{g3I6=l4gocv9UB+(2H)P`l{=$e1(O*uTSqX&UbTqm>+Dgl|lmTwf +zzzQ<*vATt6EP#~MNSy1^?I1?F!xeSHXz9qD*pjV_(s%`?(s4E}TZ98}`TO6e)+g&f^I3J?doWO$UuH~Nu)N?HYIN|F#;x;h%` +z2}Ki;p}z2XnkTgy!}ma*)8Wq&qIWSGE!C_JLMT@4I|7VQ)s9+xE2^Zk8na@97WcVI +z6iJrBJ(zjhu=C*0?x~aHJw`_QntkENeWkjPl;Xph>;qo>1=^(rGM@ +ztzR-=@|s%^YN3S{9m}yjK32LLHx+%tW+DNgbs+BWBm3Y5k;B@ID{1wlemPKE2EenD +zvV|lwQa<7Wt0mTmN{-yovfsl?(TIu^PQD9YOr`5AkZ)De5^ZE3#IiWsTF0N@>849m +z7A=hm@+Iv(sya^L^4ub=(kFX)*=`cDIpAWNd4$;ve-gcfSv67x@~oydN-xKo#1S;O +zBn@y2f)%%Dz)S)Xph8f-T-fSz3c<>qloVY;!tQSBcR_q5rP=_k?zCgs +za$i?8V#h=UcNMc$PWU`JM52=z19q9GfZ_` +z-3jv!9tYQyo?5eM%r?;%nY|mM5;Og-J`7WtyrRmsrri2GS%W)iHgSS&Kg$0UDwVEu +zYjyTo6m{I9&lADUpOh=g!w3~fDof{#x*Gy~@1n|_Yh2;YW{HtNy3ME~XHDh$4T5!GI3dlx{7F>C?KT0mgsQf{<@3qcy~ +z29NnK=7DZ_1RNw*j(P)^|MzF|8UZthcLwaS%^x=GZCSrAZ<@%OcUo#fQMRZi(k4xu +z^BxJH1cB)SnJ%1p1jAUm5it;ptw}{giKH#J(Bu#fQyhhcL0Jc~wtS)r2UV6k4elAV +zJ@8JxQ_02~eIh!C*=`S0OI&EgP+utC7x3}qiR4IsKP=mAHX1x+DN=pQL)5P$ime)R +z0)g(@%m#pYlha%Q!-inh(uKTw(Y3Qu^^Auty-;nVZzr$>Mw0Zv+=Pi?G>)S0GE^Dz +z6g030(k*J0y8c`2mg?I7>;?P3pgI00+W)jK*#GQ}iwWU_p~w&ox~$o>^o9FFBhh3^ +z|71u-#P1quoy`@s)J#HdHUs8Lax+jNt?>`@kLsP=vd3lA8~-hSOZ>++--7+$Ub#+i +zoIt%-!T%_TH5X(#OZP}nQ4<;t^$vss(r5*QBT1cxnR3!`g2Mp=4;SpHv!TO{%g-r# +zcx1AeE;qG${lpNC%p-Xik&Cvoe4X81HLt)Lagi%AkcvizKmuOm>W$+0goImaD&Zkd +zcmu%XZE^9|i7*kQqc4(3_C~{@p;R&yUmZ>+XeAjjgV2i1C<`wo +zy=spCT2@hY{F8NKz>A{So|aKB{w2c2?%fk5I8`lX$iN%H%%EKYH)H5pZaCPf- +zAhYOK@_8PFD&efwW!%86B3mG{7wGObycN3dmhG#G(7j}y-e +zY23!f{Z`E6kY&1!LS;3eP +z(~1)V&>oo={C*a8JlGuYN&fcEpuaQdGlU(V*Je1#s#PLBM!HFDb0yiSri(c*sTc7} +z!VUbn}=_w@-J(-#Vbd{Pac +z=;p&H)g;10Rw2^@trdKrukjT(;E`y0@3>rcZEyL +zo|k5VqPA)o@pf>0P>le`m9hn`MzEb!Z%)5@advY%9Jw(xuOMfxVG?ygLb6BZqmRTlm@P*1@ENU(e*x(Quy@UuUH(jAcIk$8w_0$g)?<>qy!25BsBY|X#-d@1mM +zazLy3RVV|Qe0yta)%8DICjK7`w6!)!t*=5|EZ2WI|F`siR>{ma4a~j&TYSO5LjUiL +z%eMb3^UDTyqyJml{0sfRH?C^^pDSeLZC>=TyXR%pmjC^}mVib7+tRuq|L>J+#qoWy +z-sFbiutfYR50CUjBfXNdskwPwu(!FnFWD!pA4m>HK@9gv2@s1i<>uz_kP`(ta!9+g +zxp``8$~zVGDy8w}WW0GB0`g-{_7fxaK{ju;oOP~rtiX5pM^0x~5^-=vIakihE8|Fh +zozftNAw#Vat__G8in^kirl6_wxxyCIhjcsD@^oHSCuF(olqO2@ShrXqO4!Aca)u0L +zW8HwVy%|+?62YD&?}>=tT_O34?eFMd`1ha@k6zj4#da&=5p% +zvKFUj(K-auxFR<>E~WEOO@d5`0Fl&ErrSwR-xmwxw7Jdcl`EQ|OuM3q|FxAXMswpU +zS3uV(g>l+9E1KEUie~byTK=p|mvrd(ZKZ8@l8p3^wBmSJ^@-S!nwmu1q1bOkTOqwQ +zH=d^8fsXvVcJK>oQ^^xd&fu{10d$F9!tPEfYWrL8%6%DFPeeo=%$ +z@|yXmL637~g8ZFbo~$xeKwBN>%0BjMcKIeSXl-fQxpIL1m|d<6#uzC>6?^HAS>{6e +zMMCYRKO|G*Rx~rLvlj+9lj%YwohN{R9LNJ^uHF$sh7)pyG9?Sr+Y#ZZM$JV4WaA3G +zRIcn{zh;>+hyJee`7|$Cf0`u#cp;bMLI%cCoc|;ZmuxPA3A+!B<=Gc8nI^U^nkzEI +zFR_}_-sp9mGjKJZ-YSc*6Zm3&Kodm)87J`92nbM0@;2LHWEN;=n-WmpF#A=5RBda@ +z*lfO%9s|ZIdkb>8nQ>Z`2}#bC!}NuvLv1^OE(A}JV#m$*~Uk^LJE6&_?jMX!fdaG%$4??|hpX{}yAhcDuiPfVDU +zPfi?<4q6SZ41H$dTkNnn@cKw87<5>flG0n#xja!S;*OS{Q=iMS!dzxoAw4Cg&}Tkl +z=VsCc+(zVy={BOOR7x3{xc;YI2-BEjE`t|$-~bnZu6|5H8dgk0S}8InO)C}R1HYm| +z+F62yx1+fNF(hs#aC_Jjg7!Gl(mI$+anH1fhw#`LF^*hiOwt=m$Zu4pp>Db7O(X#a +zudPICYJ*X&*RW7cCZPDt=A}$Nt*SyQDp_XBnv}HG*xBr@v~gAQs%G4l-3%kT%(G=z +zhO+4*(l(5XDW$Z99>dfrFq^Gag3nNb-`6~tF4+~*PY!SvE2DX|GN#!*q&!tD(8mgd +zfAeOvXaWzSMH70AWHtqZ2lz#9yg&_K;>xI8f`&!pQbkSYbCYUjf<}N#DwB)TY23-^ +zQl-_EoSIgZd>RK|FI(k}#8a9q1T`FdaOyO1Ivzc1Y}`YW5W{vy?1G +z4^WEa*ehlyy8}vzg0K)ZR&Ojl3Tw1Q1=g?!ADQ(po;dG1Ub5zO1WeAXpHQR2+-^h9L1W83`inrJ+ +zIU=z7Wa2YjhSK9OIqt2>w$SlHg_OoKHjfuMD_uPtrE6Oa$7syPqLVV^NLC@n-z*e~ +zZ3(l|KsdI@a*=w^LM)bWF-MRt<;m(R3o=tKPn$IgOXVqD^+0_37IUSXrUzkdp?>eu +zWe3--5fUjYBrFPT6Osk`C1kyiozHrlU<|`zO#o@K;GgOi$Vzo3Bn}=kBP8k$Ru+08 +z#Nx6-DIQeH7RYOML;-yi!gq;ImZ%(|=eW6F+H?`nRV)#=uNpce8uAi)d{Sn9{Rq&K +z#KapUMnoVGPDNAW81cj;Hm0`D3F;>jl#wfdYN(?e)zwk9S|mm_S-Avl&QirG>z}MP +zTs5Um2}RrD%3iI_i?R7#FOgHoOF2+k%vl1fG@ +zA{+yDP$bpJ0@bSu +zDG@t|M~xjLCwH)Ez|6CRnW>!yvP_Snw=pxNGp+*tP}Dn@eS$S{K9Ag;IY2-Sy#rtI +zR+X?8BytdNcM|KE#7r`^R;M3Fav&@vV*SZ=p?Fw|B&6YZY;B}3+$T9h33zsTq;-+x +zKx`x_L5g^2D7it3^-H0l4bqy(P@hK%uOE)17yMY<5g8ngM#Aupx)_QKt(JNqANm%L +zMg}8E0GfPhPc!uSfy3&H=r +z$w+Jn+tC{vLT7nN4>U8L)UvLNB*Gpk6pthjBmME%pvQsugd8yf1o91qDHO!DWatt| +zg3lv~um(`-3x}cr3;Jis(0{X0an41SA +zhHC=r8elHi{moV%x1dK{&?ElG+Wi@aJ{Djc{tNbhv$Ox>@Wm$0a#W(t8q9ms907PT +zxlBTbVCV((@IhSY&~wGiN{u$2Ia8)pF!rm?k+BG!E1T>P4Mv9qIe=Q$G@|Zx +zDGP;R+%V#pC|4#3&!-FH6|5pB2;veDWHPzLv_l9CQ=-1D#15eI5=r2(QQ5&}0CY-O +zLR%mx(!p1EtdgkFE#-)QS3*NUKtnG#Or)+-P@SS_e~6irMwN~gXwC&Jdy9-|S2UAH +zN3kRqDOwfoNuFs@^|r985f}W)30f8dM}4huV7d<$oaHG{wUVP2KOH;IVligMI%Zjp%#6P2r= +zKzNo*1z6~6o>x5%*4C1w6pit;F}v3hD-d0#QbHY)0G>xv5qi+$pbUWNI;lF5D?2f* +z-m{v<(_v%BW)uM^2NJ~qjbf7%+%Yt2YSHL(nxaE=fm6&;^rwZ`SWIJVtEb1a?zmi` +zL$n#lUR;cyP|S`s6=7;XGtdko7r43u|I$4IU6IC(PN@+aZo=>|8~3K` +zSh>}=s}PVx`oTzw#ca&rmrc+e!=Gc}E&0qva%^lec +zm{W-_RGCg!jDu_8?Ah$46!yBYQVvSt16pB^-+^ATMj1C5yhg);7D@xVMPpbimC +z-D0R1Q-zFDkHlg-=oYRRM253Yx?NcSuD~V@L#P=y-GIr1K%{aagckB>5x{UrWImWI +zrY2;9SX%$A%o~@bt;qm3ac=HrVZscKd?Gs1tbj$HRpSaOaXPP|M8_1}ULcO( +zkWcDJ(-}OYeyptC6gr^!c-DrqM=Ip^_s01E$K_ac#To6k!D2{ +zU5P)G?-#8kN@!PEMoF@h?93#J@@0~;#$-#DjD4Mjgrq1!vP_bY?Ae*IWZ(DQ*mq{e +zVD@=`e*eMyd7gXUd+#~-IVa(oiS5lN@%n_bc7dh@DEHa>{F54~B_DHpe?BXH_8+*v +zGsQTFTdDZIvksremAy;!z0^Bf5w1fX#v_QZq3{P5mWxz@hgcOxV}sGBtb^h^Hz&&m +zURj`AstBJY+J~i2YsP==6{I)HDhUiYOX~DogLk#J+*T@Tpw;{_ldpdOD_Op&8S@}1 +ztVwu}ig(&wS6lwOcrzjI#YY`8{%6@y +z6OWI+z7dJf9i-GG$aa+9&nQ$qe=WWv@LJs)&N00TzMzw)mFYqjvctjUk1b`j{(f*x +z9I*fE(0D^!(&}%!=)KxZ+e^lWeBF`3g^Mq5*nh$LIfTWQizQ*;(r|@fUqC)J66MNlKu@5G# +zi?ujy`HG~c47#fdhLx_QDoJrZ-}qFt)03(_sbsh7Q8_$(Bhm0;idocC={e6EcPx(! +z=!#G9bxlu6n;4aZb?OWGYGfM=q7(#VTr()%P9L_9+&Vh_%9eauyR=(E@bhiI^k@}q*c>Vqi~eso(%lm +z)ax;V6|2RA)T5CN+ftdT@%o`UW->YS=!CoE3XXLnRWyAt%e@iJ%5opsg8a2v3@TR4 +zbpQrN&;6yMPtmOfwjc+s`x*0@BT;IxI`--}ZubjB;a2C7b66tWcSvch0n@tBaN;7H +z?^7)>D=RH{HMU-KP~eeA$Xv8rj;b)Nt9IuKFnyL`gW9y7^<|>)7Pa_3i39ZF^&&&C +zlLd|3=RZq}DIe4JBKrksBgV@3r}q~uRe^=Tc6PvzIY0MvwpdO +zgOAp3$H)L;anp>EXE+8MBme?^sM{0{V9_S}UV>hOfPvjw2zmyd0a6zr)mXtOKtpmc|N^s+wA`mHiHY&u30eC%y1EeNH^$nSC +z1Q=vYQI%>)cQy+{bzz%V?)c2_wd;eg^gWY;)vf>4*{gsGDF?X# +zg)li98DH2*?X6w=F*kw^Y8&ed8PY^EW*iFR@D^KY2Ms)rV8QEx1g%?M&Hd$#BwhZx +zxlZY#=f3~y<&o@SR+2mn)%o#ZUup$nZl_@+83Dve$k#9(K$`58a=12qO@0|Ie9O7c +ze0oi7t;XE;Nr+QW*6zeoH9w2mR>1Dc2!1){M41giw3UF+dznZpLAg(I+i06+Z5WQY +zAFa2ru{J(DT$Y?(T=VhH`~v>*H8K$^^kfP(s#MK6dqlgkt~K`)EjuMrR?5yg|;Q4YFm66RcON3Y-*qb;BB +zlXwMDEC!(tJ>xtILUk(|#s&6GnWrySZ!pGeeR`C~Y#GdnRma;n^h&f1zc%#+a55$& +zBt$i+h~7&`HD+wk@&BQzk$n&B*U9FUr*sn*=aH3s`0T=X+ToUSY&tf&?nK +zqtFoIUxzrD&`p5;vGi|Tk*~6)&s6SMu&B!U0d*`oqpxar3CiA&HJTk$ohEO>;DHA{ +z3?!0Hh%=K)RML!PIU?xmkZA^W(OD?4kw+d&ofyLU?=DCi)4I-r0(U#~v9#zB0%W^) +zp>2n{TmS-7BBn#6V8Oc0+Gr+Qxn6*^&sxsQs<^Wy@E+;glHAK=)zZ_GUyOD +zc<@?`^=Qi?gmG^Ni#~3PIDi|<2~rKFmY!5HTGKUgBm>e{L%gyt$8#91(|i_$E(YqM +z_oSh=WhX@7?`&Cn@+wks>A}qbvl#j`oq(7hhH&8pZKg*H>-u39kSI9dAH^C!;nUgrv394H&@L9Mwm@vAxTv{!dY*apa(j{=$tI(L +zbqO;Nl2{25!BS_CxDZ;4vz`0>OE$CQl6{!gVyD}PgJ62HHnl5{q7U(_1;#n#5OjGQ +zma&$flmt^FAPFJ(&xVoTBjf6K>$g@jQ1tbH`pwW}!9v>TnkIg~P_=&DDBZ@UC$AP8 +zOzufQhriS&3k3L({kA(@CboWTq7ZFKwP_goh9NBY7=8YytSXY;+Wv0>9x}!5(+29& +zdg!y>#2z<(*H?kgP{*EcZ#Q!<^5cCG#D+sKbovSmag;l6x_Yq>R~6I~rS;ihX$)34 +zy*JT^QmL_!O#~;?hx4=(65wFvVWipUx)f-{vvGZSS71T4@D|JN1>>MFGP0Q;GEKhO +zUhB1&mm16dw+bnW{rK_qY@PaNwcXON00Y8~5BNzPIYPj;in-eb;DOCedUMV!b%`us +zyoCmuIde9}(&G?^Ie=VADad>3>T}&9uz2ySA;fpaF942Q7+zWF+d=oIW+2$v!|Huq +zXy$Ap4E(oaRT{Nf4?k`;)=yljC}Q^kLL6^dCG(h>0GJb*ozZ-d?~Ww2ew+uv0!SzU +z#MbmRmDtRstn4rxHO&es!S +zY3uFzDzG_{cb=#T&@21gsmv@$&B1q`LdgEhqAtI$i|NG7$G493!h$z6+gKVvH-90Y +z?PSP!3tnR}rp>)xVw|)NMF&qw3huDBWFz`!_f~Oi+WSR$OW);1{dz?NDSM1w@kcw) +z8Sj==iQee62>|bRi6z&u!rU^VPQGN6#RSyt4L1td)*T3}YO|?}c*ZOR#U?whmggLv +z@*?!`b237Vtq?6CSX#R@P-Qn#E*%i+o1;Z)5D05yu?9eLKDC1U>Pr|X1lc`B(I&pp +zFVdj@tp!)D=i{t!>}q+$jt_*nyH9XeZX*vnY5V&8N4c^0gMF +zl)z+n%fCML9Jytp&swa6;m%lW*#s24by@6m+B{~iFMwoyNa8B2UI`1pF`DB3=6J-g +z_WgLFY^Ub#`)%p|{W|jC-Dy*SkK0-++5`inB(XsWSEpXSVLj0=0QPBU_|X-{^}66G +zn3f0SWkC%WQJG{Yy`g*zyZsu@!G|Jp=7et{d)14WOA^f!TcFSx*g<15E?`%>5{hyo +z1z>CU-?k7Y=~D@hv>D(p$TqTkI2A7x+p-z|9Gnu*rS6_)1EYw_G&&jBv)Z$qWH%)DeC^?5&as{@v7tF&y8?=&D +zuW!q2^?}hC5Pb1&Z;8*Z9qqqb`;p0j7am_&e-Jo|i6*3MxpMpcG%+h8vjo!u()X8v%sc7%G$oa$FW=9TxLrt0#si8F~2UHO#b& +zkUCTl!ez5t8m&p%j{=V~s(TynhI0lQ4@HsMfZEN%TDhvZV{^wL)JFac +zL@AX5|1hf(Ojt%kNdG{<^6#!mFmb-pJ!H$-M!%l&IXMH^)U5;pm(5igK2h;w4Ez)3 +zdK;#WvE0#Ap_$BdS|k?D62n5u;0GR8{e?NVq%TkJQ}KoLCBW8au~%tld;y79&L0cm +zJDolTM2|`zJe(#rrOq-ZasU<5^9saizy}eUE?{_dCc`o%RaY2<1UBrcH6^z$w*a +z8mk3{_LvLhk-r7@nU9#=i^6>89{SX_|O0C_xLwn-re>oY9IW8PM2ZtrBF2h@Z +zc+?`ve8#usA{w&VB9VcqV$^a;2jI48j4{^os5L*n94`Pxk_Zs+QjM@%AGNzSmJj=P +zWhpAW3m?)}o-<9F#r*diNa;fW{h%$2V88(icx~u|X0$4(6UeJOLH{U~MI!3)HP)zw +zun_*L#Ug&F2l^m0CQg0HnNUYcG`FQquO1_)c`^F%)Fu8Yf?7L?x*?Ei9JoZmK{i_o +z-1;=~vz+NY@STa8{RkiD$pF?t1l&fbmXVz^h4*3ylwm>$A;PoyayyKX)k5rk0{<*+ +zs4u;2u@uT&E=yHaoi(YVZL90Ao*fK}5nwG@XJMH13jK_rg`WO8esl$TWnyUbFdLz$ +z-Gq<_a7~spPIFm_p|#h)TwvW>y`3|LCL0Cx{CPf0Ybc~(!M@{$cQq(8#D!}CpvyI@ +zU5WX8xMg(cNxWy9Z~$V`vHLL1 +z&0Pi_VC0}iLQI%*xH~&If`dF$NsBnkZ|gg-;kdhs0ikbG55i+>R-x!Pn;|cz9T#e@ +zK^2#`otPuC_khl3Vi9kQNwyuiA)tB$D;)Jz_@Yszi(?WXxax&UuA*Xkr4fv%= +zAcI$XvlYbZ_ohuNuhZ(O-7~dv_ye;SrI4xvMx{TDLuhjfo)L6dH$?(pGCN*N%Rv_E +zmcUt+GeL_VcPc7W>sKFslGV_RV-2cet+d$fG0mVU_UC8$U_?B;r5S>gr^Y=~iYAZU +zlxG~QdQ?Z8rh=g019Tk7Yo{#L8j9Q?6S`(7=K&+@N>qp+V5y&DmI%O?{qlPmv!(np +z+JxCH8-Ur;8kSk4MIx>&%T6SNv=Qr25yqTkRN9serIITLA50+VAcO&uzIAwZfA5L= +zG;2ollx?NT27Rt=*>mN)K8EEtv<6^FGtq*xVCDTD3Pibh?OhBuWvXx;#>W*3sg)-lXq>c_%)K=$U +z>+3$@gNjO#z21yu;0%q_@YHlQ*0<0UGd`D~*D{fK3o|!N|k&p?jXF9teT@zI0Za!2< +zCZK35a0J6GhTlfJj%|KE=i|kwJ_PBYk+huy61VY^fA?M<$MmNA!N99-czS=uW>l{h +zdEr+KRK0wiCsCFy#zxSsouy4J6$VHhFj_S!ka|NnUe(D2EsEms9dvY{hy~0Y;r1*{&IkVtouSMz8gA +zdye{G>1#7Z)4s$uTl&zWL8&YxFBLj{0?%47_K +zC4nM_a}>=m&(B3;D~0^Se3v`$=p_({-aiBdSbf&LYjw2mwUBC{bJgxq$kfy&U~Vx7 +zq>Pw!fkRd0)ZY=JgUzrSzK_|cn%ynco?xDc7_CjwVZ71p}ox> +zQDx5md7aE$ps~>G&Dt7F(C+6ff2LoT07PLcc!4A~itt|Vf>zoF?NU%_8Y=}hjGquK +zBDlqGxg%;jz-6qj@AV{5y}HBf3h#1QtgN8@#80#TDJFw`$h>H&pD40&k!raHvm$X7 +zQ4S=Jfr93Wz7goeY~em&ZS?NkMz}nEWq^Q|K@M{rB4Gj;Ep~R|6x3BMc>C)r2MEcK +zwdq6B*%?`JA`nWo{*K0K=vajDMm=$l0WRNCUF}7{o!JARJ9UeRn{w8^GxZa?nEjbu +zx{uimIiG^)#8F>Y+MKh}@~vR5O@3yK6(Uy}fsdC?jj{KC#PDn2idI(xsCe&TdRBU} +z5pzok9_$M&4Kjd!|3+{Wh`kgrySI%5sBJ6YRW>g#JdhzirNUcOQ&LpCJ_zyE0(-`7 +z)@8&Ysf{SSHpH-MmQo9`p^W;#)PuLgwuNz5pLsA2YgNfo6;v6_ibEf1t10h6E-h$c +z&^x`GkP9KO=KJ_*IAA)N7{~4_kGchc`E3n9MNo^^bhx5kNHOj%y+wi%9|+xe7LFoR +zy(E|pqqVM6rY97ANU8Fgd*3RBgV*k_PxaaoXgvun;|q*J7JXm7j+(e^BZ1ffCbKIF +z7^qg(pf+XNhrMZwHw*M!$gdPS-Mp0sSG|+Qre*bMdjgsSE%!|rn3+BOS%AW&+9i*@ +zB@wU#M7Jg9<38FDN6IjeW0xjN#8e6B2cE3biv-$;*I@%OqCYt{!y2wMw_y#I0hg=D +zjfu0G;E<`;=-}mLiZ)`>!CXdthaRUD#Mpk__FThk($jI1O$cmDS4jC=VUV6#kq!dW +z^U?GyX5e}iPa&E~ayGU=KA4{`Yx7{Wo9KUtOcDzDM>sXcZ*z2df7++7ej&Ot1KBUJ +zpxSiqrr@~$knk=g9l~mCNXp4@30XT>E005?w|123`n0@;fCj`Qdu!MlgQV-u8sbUb +zA{*bHTUqXH?Ipxw(nu|yYFY|^*OQF&q2LPoH}+WlIs;If`%nh6@_$yc>Hxd~kFhGI +zujxZUUW0aqn-q8JFFFzL66tOaXQ=kXOSthNG;)kcsF +zW9_{mA8kk#PfV598lI(-GWl}I0rE_8pY&`YlVAzd{>oPU;sHzyxpb00!Cs6NcM0-XCzAMEP~-!qQPp%{Jt!B5e-ii)2oq%|vRHS@l!5 +z2{qJs26&&TpNwV;Q?P%7JH+upz&|br)#qM`tITJzMUY!4kF`&_e3Aj+y#iJrZTBFj +zEWr(Z4d&IxDFFUU8lF-WA{RJ=*qvOE-34>DhB!d#(&vKK(m&wfAweUD`m^=ByP1cT +zns$H#14MrS51K(^A{Pj3yo4NbGcqzVNhON>R#oeuXECm7I|?%W%+`NIF}b3khEZsZ +z>3%&u;yF>vAJkknFfM3+csHZD_@D{pftEN4Ovpm4Gz{@_=~Fl^WPK*?0-!*w*GC89 +z*Co;zyF7^p2bw!|We$sieVPZI32_LAWpgw&TM4(5afq4{K|s~=r;0vc@n>_Vyf&q$ +z2S(dWnDV!ww?;;W$c+PBhf^yEcPJl(W-|{(R%%%C+SP3$aIM`$r6OSQVo4KBBv|oa +zbfJ-pNiJc`dImF8*^h(S^F^<53-6^p-q{LQG3NwSu+CHOoxwk}G&1Uc?SE{;l?<0> +zhTx0PbBTE!5?DZ7Sp_^RMBN-bgwsFfl|jSA%{Q~-PzXj#C2RW^1n_pyVrMy+Blo6q +zaLY+i_!-Jxm;CJCeRw5;$e`e;TQw3WY~U$dd!vcqmVT7!}r|+(FhjVfdQc` +zm=9w4@e9Zew<-KV0bHBfKB*51k=gbKp}S-O0u;j6?0C>4Q78zIatdp9SI8K()tDSG +zsa;iGgFeSjfT9QkYyxOM!KU_bOs(G=G|a(Nk%kZTeeeMtbNW((G1+im%sywO58j78 +z4_?p~e`Z5T*^krOHK;i>ZQDdG)gNM}rGAwLT`bB=9Ac*n(DL7>roz-1dBx;iE*SpE +z>Fupmk?J**{VMAOhSvVD=^=K?eyp`MS)@%|?zALP3j|K|8u01yqlgvVN3++HqILkB +z1O|1rLDr_?kLqmTCLN^Zj~@Uq^*OxmzuPZe_+o2*=|a$Z3lDg{(W8VrudNisUsykq +z{0W-+Qk3-V*Tc!kUk_D4e-Rg+>Y1B-iYk83UHXSG|Dz$~9XI&#T^&cxqen5)#TWGU +zj{ZR8hL-xgT$!B?@zEV9XsJA4x3|?RIrpZekQIGa)0CVZ^>t|Id-ukd>&HC<@~VA| +zfDBcS0^0~*;73?>Q3h*w=^?{r*}`wMBvRA#l?iwE?-jn79LpE=0~7<{Yk +zt)NA|jYyhXa{LY2wz%{k=M6au^Hc +zUtLD^0^83?gNC$-2wjvXUr=Eik65xFrWEUt^D!BhzVF#02zB9As)bh(sT2l&`tyEw +zOR0G;q0+dX_AAx<6K9BX&#&He&43y?IoWM9>$oa8!nOr!4hKOpmz;ZaceZAfi4+DF +zOLZF9$Oim&sU(5-&!ib!bq+6ef|n!8FaokdpZthKj;&2oEIN21*F;I+z)c3385lOI +zk^PdPHKw(#Du82nbPoxD0^`@46v##iy+wsn@b2NgN+;uV@8HRg0kIEJ4)5g-Z0p%0 +zG59?O#z!nUqx=0-RZ%he`SY|#e$2%YKkcD(OG^-zGTRm4WY(AF;r(@7Zb!FdS8D90>u)kwKfHgY`kxD3VV+sZuYEg{%g1B!FI)~b4(x{uSITim+zWuR?V5g# +zZBSm_TZBzMt92OouFJ*mK@?KBxin+aKRr$htdxs$r?Sh7pdc)XIT4M)1TOUF7s`LK +z83;)Y8iSv)OvR@tnoW7`#MBF_Y%zX47@>rvV|c#>nq?16Gspj&V*HDa^W9cz3D}!) +z;Sp%v|Jb8@Vk*UfU_Dxe(f0qxc9~d+Pd;%c?P_W|a)un?wu99lp+uP5sz;Cd32XXK +zgP{qFXvT|UO30bPYz%1TfV49srVqF2CpQ)x#7$eTTAns5q*NHDR`J*I7g$&F +zDZX=Q2n|0Eu63h+BuslAFpDob*gUlAo9r*G*A@)^*Lu@YOEshs*2AfqBm5Alx)W`O +z92e#PGA2oMAc5q>& +zAX>?}M+-vkSgmcz2;SP;45%KvqNJ3}Tqh6$FzIFo%+A4|wY7d%f;+V619tNM=&d#S +zzIfj^nEFtbXlBr>rZ@T^qtw~0ac}yz7kRaB%$FQA!MrpgIXe08dN_=Hmo(F(uFONb9!se*Z{!V4q-Dnj(0v?1LcB +zpCtqtj+ydD)gc!WYLtfHwc8awtG!o(T^=(eB|*O1B1F#Cq+~c`%gw_BteCUaEwL$4 +zU|I2Jhdd+iPnbnAKS=xA;S9gk(ijE5 +zMNU7-h%+18t2A#x6+8E(EY>EuPn0gF>Y57h?)c3$6mvkeOIbsw!{0eus#{jFq>aN*kUL%V}ib;=p)ja{JU*2cYe96e9RdYwD2~>iv+3=p&@};ZD%11 +z0jr9zdKdbyo;daaosZ&GX41j6>Ysiv_p2@p=aV)*Hs76}Zw@&y9@*P!5lh|{7Vxfx +z&3^jpOQ>pTX^T5dk-fEnp)$B(hSel(FjX*lRR)i)CH4|_{RA?qnXTB~ddBxdo0%6o +zYoZ@nQ(-+tQMzxHjroNh+>qe+k!^9eEl@pkL!|Rh=e!W1RMQ9yt;dgkf4QF5#7$=)oN{BLJ%;Ya)v +zo<+WixetFXjxk4Cdf4XGhZFz7sB2aP8MYp|cUt|>2eJ|axF#4T|GObxGT=aHFhx{- +z?mdYpR^;G1Hk`dTl>MtLI9zerHtU*Ae4OA&sam?bTIh>w(E_Wx2KM%f4>cmAb4nI1 +zV$;+|M!gqO=T5xcG4QCec~%-y@mQ=rdc$7cPJ*XoTxRqMcaGWDXP>%ub3SDE`ILG` +zt}LA2SWh7I?k~H{d@VT3g9K9)QLe2ZF(6JMrIXZIhdoJpFA9V|U6vy8Doc4(EO1m_Td;C$mFRQ&sq?CB +zE?x!AEBB#`b6oAbwOZ4Ezdh%y?RcOHa*xD&?pn>R9B96dJt+hB*b<#-Ok7*vx_fg; +zO=9?*pWv}Z4dT<{}SCXpEb +z-r!R6*^u3~v)u37{OZP*8#1pJ{LQEe$#uUiO^-Vw?hs$qZr;DyeEbNU8#lNY2GYQVETpA8;g713Mx$Q^3%?sjQn=<+eODD#Mh2$*z&#@}oC@xw$u)02*!QnjR+muEtlzY45?wc{^O#fr@a&<7E%@8G!!8fkYOI-asm5E0W4dei +zv&uxLk5jL&A2*T?8~J%o?XsS_)U&W_RlhBt30?5#Jia@>5G=(X=p}fn!MB0;`k;OE +z!y|8s#Qr7mHa|;gaC&Aml7bNZK5}`(+BH5Qjc|;8_c>=qg6pK@E19TBXye@@0jIbn +ze_VJgf1y!K>)n?I>XYLwdZLxb?1Nukzj^7`mtp6`(1r5&yF4%CkH^q^KNAIge=*z^JG&^IZ?hBui{MqU6ma)y7&gnbA{0~ +z$*T#A*|$Eo>3wI{`_GS7OIl*Zk&0e +z_||dWejTXZ(?)I|mxmrMxA*Q13!vM>89IR{h!4sPj>2_D^u8Xw46o<5)G@ojoAW|E +zy=7T3NdXlq^7?b=t}Kt)2S;o#U)wVkuUh3EcysmB +z!v}s4;iKn98X(ua_d}&Eqrb#G7q-c^T<}sMUezZheGhFieA)5yV)*Kx(O^AyaUU=@4%Q3|pA3}3p*h)T0jq7pz-1gG`VV&%4Wv}+* +zCI)BB73^o{T*9;i&`ha|8xa#nWH=ppLh@TU6$R!j?~g7pf7CuOj=PmVb;~#FOy=<| +zr(&t`>LWf}?#e$Tn==#FE`Rkh@zo5KP=bZ;RB$V4yF15cb3D0n6#VWiCf-!Wdbl&; +zJ&{KurtMlfEWZ4F-iu4g#m%!Ef27xRQ^v1*>#0QDx_sy3Zuk8O%R?p2m`?-O>@>qp +zyw~Koas1OO-0@Tc#I1-&k7c44UP(S}b1Y44uQ1ljm%Ex3A9*Z1^l3cnf)nk&O)c6o +zRc}1Djr{S;QzgagQ|A*f3q}vGs^hbRNB-k7{!IMR9Dc5(ML+Jw@KXzjRGIP>&$EEu +znM?9#)(Y(l#&iNBJZ{?CU%S!^k>(N;8GW9hcFs-8Qp?q-gBqNhT4x5y(Uxwd0>pb}810(3vg$i7c3<$7RDFmqt>_nu{tyzu7kw}hRZ+Mv-$KF7ul*?)e895`d9r_^UW={&$TftWtWtfaAW-otFYjrmpRLCoWy9YE +z6FW~rB_qF_>u}Rd8awgvO@CxOb;c(UyfD_cE{jEZjMxsmGA(_DyqOf2eFGW#?@otF +z^kRES;$Tj+)umwb2)a@jbn#a7t+u?(F$)IOyokEi#)IA4}(1DRcS3Vrom +z-nyFqO+lm>wffWO^|F7~`r&IjYI2qc{n+2}ulD4}T+1&C)%`sGm+wSGb1mz?wZ&Vn +z&q^K +zebYg)D`DTTHb7;|Md%$F$c6>(*ICwY=t%Zu3uL6?efV(Bo5_+XrZKeOyHm=OtKOfk +zxLnUacQYr~(*TtbJ+ff{KBcyy7yC*)w_S<*nMJ&VV#$y2$p1_Z6gq_En;S646V)Mt +zAN-Zw^p1SLaL%;%LHmiuOODGIEFXv!Ja(76%5g>Y^G8^GvbF2Np5){mx${v1J&ig=wza3GGI5j$@RTlJ(_e&pYXZ7==tBb;n_=9E9o(aGg# +z)SmIp&4c1^u4d<7v?M+%KML2Aj=$OTD~>AZ5G5<~_B&4G`-AoNkq_vn>@k%pt%5sk +zR!cxT8MD64#H%EK0PKdHZr?@Ar~cMIQK49X(=y3>bL0#)od{_-ugDzdj?4+Dd$xG_ +zfm;;(PX5W&jjcZ(?^Nf(iah)cZ|we*zGz6f=Eql=8iCk;@VxlK^ks{5)eCnzr3PK? +zz=@tH_L(#ZwE$mi_S4Qz89Q_JW-;lckFRu|=pA)Du63pOQWbvQSHI$6@O@4GRM9<& +zbE&7!U3&v`RF!WCxrG7yE?0Kf@2r-Pb9&#@+m}AZUS{i$Z+73fX(n)r>K7=Uty?TQb7l$o +zJ@;0{e`SX#cv3{kzI)eX==jCR{Apg-jS>CpZQoQ8 +zb<*%-q$O;Z?C2Vc94I6Y6}}JxVjfX(GdRQ@TSd-P-;D63%6<4cfB;el^Z>9 +zTDKancly-pCWBY$X#(f?^WC(rj+j`A_un&-%D=*?A8==+g{Hoy$}Gq`x-R1Dy0&4e +z)ak)NVt<6YAa$4A^H6}c;C +zA#4TyjgQ`)EU|LjQ4{`jakf`fGy&eg%mWwiBkoB|E5 +z8p}zdkz){<*Qhn8)IoAk!vT#w@eBBqS6&#jML)VF$)WQiywAyS!OHy0qn4jLt}Q=j +zWE0}wxWLc+7~Eu((L+A2yR?2eUG0J{Sao8IsF+`%fp#kwPQ2h@1CMrLm;n!7gIzb+NZllRN8ar+TlKd~N+!Lu4|Oo5wVpn0p&B_WoyP-Z|u5S5cL)*#gJ3olw&f +zj~cd=E62k4A$iRE032nN_~rUZgreGyR=WhnjUytKoF=v35Bdd_f +zMI4i9{)HqVIbyYb{IMYeIDxETGUIgcShib&p_;we>8d~ma7y3(`jbjl+7;s5Qyn*_ +zh6Kl2vG&}mAM;+*BlQXlf!e}$V2RlVk>#|S1|AwElF+yhU;G(3BRNSRic82aY#1cZ +zIeA`<4H(W*^9A1E7Np-Zqx#IW0pS_;SkAs-au;wK`8(5wefWa}Nd$+V)YS21)ceJz +zE|hhveLZG0W)$1ngw-t`CA{W#Mg=_6HTJ5Ddoxt#YJD=y^8>GpnyF=C*}&>wu5`X& +zW7U)b{^8sb^HW<%-yx165;sqvzK#FWyLp0;PgL#CF-uh&<)C~X=)epwb1G>w-RvX$ +z4U7ts+(OePza0PVZJfVcUuz()EcGNz^;Mb*7xj7Ox!l6X@3^>^htp~%y>(#Xek$&~=!@+3+Dj#-Jey$n__RKk@!NAV!pBRM0^z_{uPd0R(i`f +z&xsj=5l$_T0hO)Z7zZIc<~fcZ4L;s?I0pLvRAin^>mIZawugBLov?e7VD-SsSqw~g +z-S#fVI?`@9zRFJSPTH$&@o`rXt>=GFTNVr`k(NZHVl$GXy1vwYdU#3f`b`LznnwIj +zp#$!i!HZVMLQa=OAI+)N_`E;CoRfS1=cZ@|zvAgLkGg+*j{kXkH@JPU&$LA5Bpk +zj=mI?(j +zUVHGX%F77|_$7tc@se^MKbCq$^r7PE)ia`&t|vW}mbNAmjJ&ifUV45ldC59bY8?V$ +zYoGs(r}(WL036Z%wy!y<#VMI{A&G*X?Wf*ao-dZ<(b^R>)u-!JAag +zzh;bs*Ae^67nbj%;`8F3_|zYH;GlTqzQoZ!|=+dRtc +z=i&$v3|r&XGavjO#`=>`cJ12r5)-jlnVVKcw`9C*&(=8>OR=o`JyOUXx|}B!yZ^yn +zeQA_9RPB!c`b4I@ySU(bS_g73Mx*;2?UMOjyxpxTJ7-jB?4t?|$i(meetGqdhWoJd +zjIz?Mz1l41K%3clmg&iB>~d=L%g?vKB9EmHRpi;}#Bg6len&R{GwS`rGz-N9hW2f7 +zBSOFad+{ve{kZX)lll^wd;Fch6x5jK??irPx=0wl!A>K}tj7CP{;YXaB=Y8aa9E1+ +z8O1nE9?>sZdi=MdNz=0I(vOmNEj3~u(9Ej$hA9Qu)dyD6f~tcG^9Ylu@xOM@kBx+0 +z!1X_7c-5YHDGg#cUsKobpMQK`TsSZN<-^;qd2*6pZJs!rJ&eCs^7H$zpZ4jIWrkL) +zG!5Q-ao*(Iky#8n^ys*$kmkrav--X9Y-P*?nJTSzla-!DD=rhBL$KcKZ_ym&82i!4 +zabz+)Q?K*&l*&^7ko511b+_9{F%#B-BrNMFOq&z~)hvgayI~4Pz&1HKmrF}`Gmnnv +zp6QS15liL#ON*k|O_Hvh(tEP1p2mdU7=KMS-AQIS&`FU8KbHE@qvzkJ3`d`1b2 +zu=u4IVm8|nza;$kMygxsd4)5iPYEuAE%~99N+plS4&;)gB@PnqJ&FTCbybr?7LF`gBCrbk8J> +z@4K?{l)7}oMuJV+7ps={d%@qhA0*1@f8Q&v#vl2O;mV(nt#!$;mCH>Jb#P|{lOX^r}nK1$XS_Nk5+4r +zU*wf4X?cNA=6G-rBrhOIsj)mDCCEx3MnTv4qwe^8t~NWvpbbnCcc^(P#xd;k +z8U0`IBi$R{bD5Zqei>W$tIzj+Gc^3|KQQy1)s?o#1tc3pk*Eaf{bW@SCOcYs>Pd2xC +z&~sc!=h#u=wUIEV*E_Xl)sH;+J`_pVl)-221rTWwf+t9pVZHMLuTCo$`uVckzmaT; +zc3G=UAqU%ifEAMMUTz8afpC)t$umTeK0vAnu!5mSU9iARTah<=tht7xLFAi6sP?da +zsJ2YT(Su@34I+!RvJX&qJvysASmq)1LI7tC+UIaRf;oHK_J+OUf8%nvIfu2LvmX|o +zK)&;aGO*io^GbR_S;&n=!L1!kaaN^!0O19} +zF)p3?7w?P{s%KTB>*~weY_~yM+QH**J_Imyh^9Owp05RUAmd*h_b*~=(2`dnI{lDvqNkxeh&4yD+z;1sL +z6c~e{FLqiEE$0frbVQ0yR^fAtY*R2JMSXphqx&o7tey&>rfnMg;c(Aj#&-MZ7*M3T +zc=%FB`=yUo=Dt}3_!s2kd +z7WIahl-muTg?nVhPs!kyIzC!__s$%DL*kk|m*PqI?10Aa^$qeIphl@q#SuM0X;sESF6W4vitFE~sQT(xZ5#h4e +z&!75tX9@o%6`m5Ev+EB}lrh1RjTOZXpgvos2A-jxrWEhJOnTj%pT4-5p;|$^h#n92 +z@$OGOj;#rq!mr=Ys5_xTfhoSU<1QSFIS2bD`_%Hh)b6rBI<7v3ww`LPc_M$pA%0?A +z=TcMVm!(@qzg)a)1oad+dva4H54@^@w~V9qZa#zQRRiy&AJOuqoXIJ-X(g}U8y%0m +zonyXyGa=q|-VI~SrI{FcG)C#v@8a6}T50KHysc@EKeQMqtoEGrL0LNWZlWFBxmUK{ +z^lpO+{bg#jre{KEJLPrYh}Bws+}_AcYO*GM*9O?$X$-6TtTQ-LCnCZ+mGD(dH;6+l#%VbEB@R7-x7^-4Q4%Ghe*g)Ws~-_^g1_hI +zKj257ICq)5C?1A&Sna=ysGH2}_oQAkv595gwb4mj$UEau6IQX?Cbr+YFF&1Udh4UWLOMr5~!24Vo#z&H8pUyb$W`9S{1@<p*Xi_sCdo +z%LbR5U$%Um7uvM@oYg`6Z0=vVg5JBQIDkZ_K|8^W)LU~76L*FDf8{@2N_aDLNG7rD_j0!s=5@tn;ko7o=6~ +zN2%nrQ*~(0JH(BzSvKWe#e1;~n00P<6JdAugaQKMRC(dx2?s@!dr +z2}2Vy>OC*_WaHrD?O_r%wpabQ5?lm=FW>RwV&6Dq$vy78ug!Wf&QcR@1R0|(6W@>? +zxc#Z?y4i=n`jioiI>F{qIritQ$Mxz(PEptyActIM33$ol=m(UDfG7K0nr-ii_|v17F +z+alZjV|Uyg{h2$U4#AVyZ`z#Ld8&gahx?!pYtt4=HEsPptxbQgxZDo9d8(lXYNrskSY|=R( +z5g+%gIQaw=&Nxpjb{6qr&tzGuzWRzs+=JTNUL0Gr2dif#FokmP-a$rj&pgBI%eaX6 +zqG#=h5LfdqpJ2!UTId0HDi>C=i(50Im?yn=C$E-YAeBu=R(o?G{7*o%wdn^JEbx04 +zW_MxQ7lDZKr*exyVqy8EXQw!Gw6-?g8&u3vf(a%g=8l0!khMsHDeW}QMQ`CzAw4U% +z1Iz8s3wsJLoUKjAg+IVU9V-|+6<8SrBlyc`%S~qhndtGXtUiyuD45c=|E+g3TYgrv +z6IJ;S+kCXVT#y=DUN(g}0r^@5p@;58Fmh$tppoqY>u?MFrl6}29)L>alBUz3$tGG` +z`{6?1dTGMDULa6LkXUD$neDN-;L%0EFRiVA1@QtfF!p&D!$w5zSPB|4&ZQtX*jihC +z`uAped~q3$g$tcG&A1Q!cJRu_7-xLI~D;(m|-uRGBKmzm*S+>mMN +z7uW+{x%BNk6mhBGO-HqndQhM=aYN8%)mU%nW_~Lf86F3?bPF|!6l7oCEqET(XWY%2 +zZB9Lk#PTrvNDS}XFC~Wk6HUd@;3Ef7GI@W)%A-6?&Ij)2g% +zzN{B6H~fgL&zMcg_=?RQ#UugwILN +z!B}X*dw6|w5sd?nhq11~0p96mb`2_$M%i>37O7;tlz$=jaMsBr&g2?HDOY$7Z>L*F +z`VrGTjtQoli$Qf_ZDMV;-*9Q +z_NFtXQX^nw?8Y$&PbwI&n(c>E4#ie{J$(-kj@<+i$`6Ym1;~v=P$bHQZ^`2FbgI0K +z%|XPREw-?yYBm*dtc~ymA44r@5lrBL+ejxwZtD6`Zf41=sCAh*s9+NTZqO4GkddzV +zB$pgHsKm8pxkT?sZuBhC&2mW27k*Dg(tYCNUbH7;TnNRUOn8jce+%WyT!g3+QX{B! +z^Ny*Sv`)BcGm|7$60m%z<19+^zSGD|5uy;>)hrD*UI65nOuKMBtT&lYVu!3EdFK)0GC|q`TrhH;IjGt +z6!#&OoSJPh}UIbuPLH>aUliN%Wh15fy8QLlC_Ml;43$1fDJ=TR9^JFCHyJ~uk +zR~71+rIW-z4?2*={YjpTLIn1}p>4@{7@JP8wIsJ>defx*2IK!`50)unMxNn4E&{92 +z`XJv;fvHOo`Lo_b){8m0ao-QUlR@CjcfLS(G%M#BE%=G$>zrZrHpfJ2^8YmtO+mSp +zaFipASi(`UV9sCDzzUo|IwfK#>IyON=SdK{iJlEdfv6|TP@Pm%7m?DS4=T#XGE6cE +zOe+?68iZ>m`3yS>+*rp{n#~@zYlXcuPEF28SKSnA52aM}bT)CV7^MQXp`V3k?w8Y* +z3RPhn9|t~0P#5g?luphFVQl9{w!))sfJ6}#bSA)s*I-X|RRry=R1Y7zY{4Bx?gh~Q +zd|o>1*A^_hMnwjpm~b4g!fQR|3ZV%Nqvm3)Y(n(3yd+ESVpqa@Mb1P<5~ac<1~^R< +z7X?kyn$4r?pmriYw+AdqRzTm0q#XZNEhMhqgbdenaPuyG*Cod(MQy4S4qYP+lVZ15 +z&cSBKdQ&`)a%eX9I>aG0=Ys16k=KQKM1sx0f@kyi?O|i=Az0&Y02_ZkYD^~i8q7HN +zzskqT^!W6j*nw;ig?xmLRe9*SX>u?3r))o^QCYtCQUD)HJRm@=s9-({qk9t^8%Br? +zhW&Lh>>M#{5bW>bHy8iS=3lof;~M-IkNYX(zn!&a{nx$x8vM7xe;fR_!G9b4x50n^ +zHu$eXTQkge{(7-y2^iPm=*=ZyZuNCN6f9SLMTIqA%E-3TiOwrmia|aW3B)%j)t=MG +ze-N=FS`o+7c)(ucgq6X-iVxk-LwRw?`4s;`pR&Z><2+a|6kB39UN)vF%tVp2M0~CQ +z8^SAS(q4t@i1@YywZW%PGMGE!Be01PK?Ww!lGD#-_wIm4i4-}Jb3>3q4f?`{9Et!A +z0~tKP#Zx!9f)QAsvoKFQ6beKsVHxfqqSFepW+!y4w!kGe2d7s!5h+6ih9(MKJOBfj +zOv~Q_U{*W_(aRgL)F3Aj)NnbbX*%dy8TS!WaI2v^CVF_%LcIc;$V~}d!S=C5 +z(-T~U@5Baph{5~oB~UlUfl!T`}^UIPJ=aW=p;vpJSnT{GWofoWcJgUo#`WG=&U8ep#Z<-fW3Up^1JRTxLLo$UQ#C>(*ObyG2W#f>Fp~&M@?K0DOoFSfb~6 +z?i9}sBsU9>);^-MjUDq_3Oz>7?badAtP%JUONM`90;g2KYn&Rp-o5QCQ +zhQaSIU6^{0gA4c@!6!sc5hH+U6`P?S^={p$;yQXL+L$b$T{br^RzCNNm>~CzS^zWQB4`heAdn_d +z98CdrP*f0wp1Q+B>>-s3z<3Kf;fUKIPaIW;*qn_GDVQF1S`5BF;Z)aZ +zOsxF7ZtIxGO9bkU?{KL7{?MnAZCyJZXof^i}U*;_t5TJ9fjzga%{Y5VZ!{y%Fh5pk0U +zY2f=jrNy2=v;a>VDiTa+u`$RyexxebV0jYD%e^Lnd20yfJ#$u8oz*sidFyK%>zxM7 +zYkoKQ&Bg!B;mIw^xCa00tUOz-#D80F&i}iYUxWWO_+PXBuUY@spnnbe*PwrQgZ}AH +zASF1bxQg+Xi~q{RYv;eSA*l_<$CcGo2)qnIPnqkv{sNclu%MsEEjj~`M_xdo;}9)_ +zVUqw~GD;^lJIqbknV#FQNPGfUgJ0DqB!0`60P%!xK~R*F&|r3m4?Q +zK741h`a0377Fw*Mm*5z+tVN0NsB(Eef%f*XBTqg=fvYw?f<)@T1Dd-(^|ZzLs&VfabdyNKhC&jlxs{qjJ0*JEN&qx!1=Ba>iT`LRbT&;YzpS +z*4U|DCN==VxU^8PA{^L)?wn`>6WTYMGCzoTfQ_4i)rY>$j?n9ZwK{{g9P<&X0B*p` +zI2eOlAQaUdxWSdk(UEOXTunW2u{n$KGC@RNqNEqXQ;G+ghz}%yY77Beh8R$wxCI#! +z!W*=OxN;2jGYCBqMF^MR^2B(`W0%ldxJ9gkmJ$LJk*sC#N6p$tDl>><0SYc~Ijfdt +zh#S)RRWMSVhR`kYssQOF=DD#j>w@cIX&omXIny%7T!gC_t1%JDCWy!@cuU~?BT7&q +zLK7}G71Oavxzb^G0s|u9aO_MGA`8rg0ns!HFf-I2+n7d3Koz=X2xNtq65do@j!IID +zrvgu%G=Z;eHV8ng{-3=sfrs+@{vT2?T4<4|JftFH-zha1jAce+iwa{5Mq`GVu_f^- +zl~7uwluF4*qD4i~MoEj(BBfH=q=-t1i2nC^W-*r3=llJ9KfnL)`}4fM-#%vMdG0;; +z+;h)8=lz^}4wFNrko&=&{lG5rU=WrN#5M4D3|bg$`zhcBVTGC*NI63|29!k$Lqv?P +z9(XI40`r6|fX-N&+`(B0I5!(+qA3io=&8dPOTYEg%MVAvq`z-j{m4Btqn1q~KX +zjDa0Eo_awnd3Z&`yaJ;G{|#dLa$_$s@M{vF-hm_phr+rG{>m2)w5Iul(!k$rIlyK>d!#<43uSGCJE!(PDCqbH!KO) +z8!T%@BoS~HcuOKreh5Se=j4n9pK%V*A{QL|3Ga#{@xwu#z}MDT5|-eM$2vilIP@YH +ztUb7o1Ucg!i5LjC*wKDAp4+$u-Wl9Obb;^={l3INc!Gt!3tZ!k+oV0-0enB(g2z=X +zmoY>P8Z;o>9b`dtz>zHQSbMz3Ah$zUOB^6*zz;yHxHy2vopB@wJOLgZ(cBgX21Z2V +zfT1I}4NtHl4SZSy=7j~GWZ^<^a-NMvgoOZTfUx$~E)H0T=mcS1oQWhHGFYM$(h&jq +z0u8#dAUe8}@YXiYV5FqpzAT6YC%h$&1gLR>z^#tp^K2}aNv=4&6XZxFff>N!oe=ht +zaCle1FT6!BeMD|kI42C+5=$U*dv|drVFm4B&GGhlOTZMsakx1L9G=MKA_3gy3>enu +zL4*){tOcG(K&T?Rpm8wUEQlo1Y+UcS!Ju56i12>|0@d5~AoM{%svK}m4n&P%$iENd +zFAT*Zpua8;^w-hU(So#%;0Rt_{bA65`1)(t(D?rVB=BGAV`%(e$52ndAO5cce;CI9 +z|A}jZBf)wsS`J>+WAQeYB=Fx@`2XUf;9vWtU(-=2jl*DLaE^G~9339vf_vOys@qV= +zF^49TY}UpqE>uyPj$Megr0+YV7Oy6g*Y&Qa)<3c3bn(&R*u{&TlivDZ6P&T$iu>2? +z5;Hd!ej|oG5*Vp=g(%8 +z{0QwBFS254k43EKx*t**J6fBVl@mw*pG5+$u9aD=X{5g`TSlF)7qXN3&W>w_sJH +z;z_ou)Fkcl6wR~YB{yVcU!~~SUdcVvJcoF;aqaYsJVvE4WsIV-+03|`exJ)X%71Qc +zJ$LTh%IIi2TU(No)8)&Tw_B%BH|1~3nz;%mE^R(7hP17y;t7r;iaK#qO4M8n<@T(? +zI6GxTu(=e9B-bt{QYJ1-5vAUUE!%sx1uh=}~?e0Z_-^XJ5b +zgiDt%Pj9#w-SxG#m1UcA#piB-Uh=%w_)>50Byy6xyu7ZiZuj@^onPKfoHXfmLqm4e +zyZfdKBlqmm+G9RnFs@G|qR6iVvJYN>;(j!zMX{+#1@ +zEXjiWB{Vd&;r71v_I9GJty0{n!ooMNUt^Y@(V90eowVZW^zf9Fl-I9c*RE(f(kP)~ +zS>4pu)6*kMIq!MQv(@k9w@Yg!{Z2lj8yM>AZ=5lIMd|91fk|qViE5W8%GG$@FmBiy +zw|lqxg73jST_4!Qy?KZ7=!G7tsJEP5AA{?(DM~G8H6!2LTzn+e@rIOW($luOHDZni +zQFy#W`QjJKs95dF8#f*ohvx3s;fBLqxu4_Ia5Jsy{{1pzK(5Iz&cmi^wM>im +zBT(f5w|3>#{a6(f8L5vF-HZ}Pi9Yu`nRWbQAesEl&1*W*CO)F8nHK(ZyNxR4=Jc@) +zF-eo)=L=n2suMLYsL1rZxV&Cp?p8kKs*JkFq=^&R?`!fm${RidoC5QRa`f_A;9Y{! +ze(>>QaBj7Sv$LM>H7Wh^i)4;<(j7H@KVh@0#!fSGG?u+W?Cxwk%XxRNv#m+m{L`mT +zpBru)%8m)ko8Y|CVr52(^y=lymnf_Vcy)A{zx2HcFUOVy`OiZ^s5q(e#g~m=*Sp-@ +z)Ai_8a$WI?Hq6F#TII{`W{j4|I7few=kDO(fWFY!*!Z>OscCpi?arOD<%>N$9+$2e +z-Tt92ru}Jnd(*=Y?;oAKyl$*h*_gyDtataa6fM@(w5giaOurJAjz+!Tq)-_d7}yvu +zJ=4R(gT-b`N=j~@VL9UL#0o1qL0m(Vxy!8kb8YPeeCz&{MYbaE^RFAnTgXz>%O4jk +z{}Ebm+nuUDUT%!s6I972vH7#s&6Qk3l9QE{m6I!`R-_geo1k`Tkyn>`OSR6*a$d=P +zStgNNZ2}fVUS1x%p;F>PNXN$)85tQ{w@%0peIMMMz=S4yCtX<+s2Z>Rrnz}O>-Dv+ +zmb1j{Dplg-DO0?PSR*O)@Oj=z9!rjd*PS;rJng)7B{hvzIX(Z_3{i@GYLV5ei~hu~ +zGn46)PQ6GUQB#rqy8Ysh=+l{=kIrRy9NcXXboj`T=_Z^*gzV)30oQKdRxl0A+Zhxb +z{PEMPtLicpJGCjk?$1uqoK~&sd3HWZLQ&Vha^8wB0fB*sOYXM?EJ?7;NOC&j0>zD+ +zF|VWTq1VF)57w<;9~BjqxKFG-;?tEqU@6#Ue%elT58gelZWJm>8-LH=-%Dc5m+88G +zsH|y}uF$GmV#l2V9A;Mmp|!BE7(2=$BBJBLktLa#nO$F-B@P`!n@xjCKw +zK26s@?0wDM2M2S1~bhx>^=qe>DcuQxvJ +zoiu%_&3fkZ^odH<4-E3$*`la8m8^9w{#c*c@7}$eI(4dMc($XVF +zjj1`!R46wxF?n1EB)a9Pwzf7*dCbvV8}Xc6;*^x5bM)s)!4;%V$J9 +z7tz$ze2ZV6JpIX-@#B+|lN+Xqmu}zgP_g5KR+^Z0u~zI?>%hRrsT$K~;cFO5PiK!* +zWl5U9{rKYY+O=yn&wtr^?3gBsUUwn-Rr$vK`}c3zvPIYLW=%c?JQV2c>~5gXpTk=s~~-!>bE!{yv2X6qeqZaO;NGw6j>wjN6STlcjs_tvemN*cQ< +z@wD#FyRTm_y>&fjh5;r{n|vr>J;NIt=3$0fTFg;ZR4je?&@Gi(UX$m3a_iQu7dji& +zwq4g-^}XXlbk{1doKYX2uNe<3pkVdoZ_=0R?E=bMV&d$wva*^-!INI?!06^~Pgvmo +z=Lvh4AI%47H(TPQZtpdAk|@!-aP*e7xajfMuboZDy(t#Y*qV}dA{bTj@ZsqT7iKss +z-Dy5u=ecBw+D9|yvvVCC5h$q>f9gcG$@v>dEx4hxjat4_s#=7C!7t8KB>Yg8pd?98 +zxG9zAdic(WdAf;*H_FVKwQ==!uki<@%u#u#PTdVbE%V0)=I@dsd3s(5dQuqm;k+RP +zdDk2#0}1=~?ORAl$O#N3sk^&-^tfp|_w0!VS^(%-D;%y!?oh&Q$aZS^LUGsBKd&qA +zNHs{^t}io1{+MUbkt0DtK?NR|NvKmEK3V~*SC8rLj2tifTwz9wyz~oytpKS&|Ff6O +zj?`$*KUJD$&srZePwZrx$*M3yR2KgR^p{<*TR4evNLnHx74~H_q%m{->SJI=7@3M2+tq-%v@hbN1bH=s!T9>= +z6D=U11FTCRToE76xA*v%TgH<{q2itw8Z2MYnb!Wyl=Z?~6@_{$u86vH_5N7soO22Z +zrHd-NvR2c}?9CQy#;30j=2B4A3@NMlb)%}Dm#WR3yGu%GnZ@Mtcx|@F +zLp`KV>KdR*fFe4OnYm{5>asub?gns7o)&?~vn=6BmTIH;AcAm6V~56$dRGZ9-D7a(=-{sXzw%mwZBI~t-_ +zo>Eoazcr5PUW1K!gic{;YC0@h)SXXR8~3*C)t+ee@}2A|<|^IDFK@-I*^Uiiu|9@w +z5r*X*FoV?9qhG9@@@2*RtQ090FkgVBx$U~Mr)SS4NzMBYAMQv^UAJ!CsF5R83EtGZ +zRNqMp+G{KG^6bR%vQ1+9-WlYby&`EIuPxb-x`eUeTUVVwAzd~r$#xN>Wi@hS=;igt +z0vR%28whD@jLLUvH)UY|$R^BhZpsa<71?uVL`p%jHe>nnii!#~4Gq5}b+EliwYHr7 +z;9104E9Ijn*Z%&|#0e8vx97J5O1z3WIY8qBabI+Nd^5wP_QC80-Cw?bdbObPMzMXo +zp}B|cyRoHaD5%^hYm(vyseQWs33D7gPIBHQtEK=O8KY@J)M(cT{r&e +z6gctpevh6CFTc*tLfzt{3YXANjAMGfuNx~bOF4l7JNE58rocOS0oZh{qC#@a7(Ka- +zV3{SGbsoZ0FfVq09Wj2MR=^#|J$3sU=hQSSi%m1smz@fDbtN$?E+RzZ{fG0DYi5Rx +zaC|&r;>1G6)9;^NjYdb>k6HYFP1J{{AD@QL(UV({yM4v+@kZu0TaQ;i?r5zz4O(qZ +zDa@@}HYe67ba`OlvzQ;<*SF0{R#*!Z7Huvx`ds +zSX5U+feBdzl#qtUDHVPF$*9V7V>VDyg@uL1#l^GiQsXbXhXjr&ITq9XYR+J-M}~ZKPsJCY-l-z)mp3Y~^B_mFmX$_=q=Y +z{*&G(Vow!ZXTQn&@p@Yfe(U%w!=25+D5+2LP^c24>~ts8Che`tN_o?hv~96lSDO8p +zM|pGe%b&9)6&Jf-Out;$6V|ogf=JjYb=!D*y`QZ^dc^^?$|EU-*IByd0ng6eugc!H +zs^^>b>g`4OD>=JHPB&W_QIV<+3;`0DkhRjB_SGOF5}(rg=j@Z!fufs5^kkRsk0vYPFP*4O +zPc;bW`ihJ0k}I23wqlC-ts8THyjU-pmNpBAYqRx!0G80iIaas!?VF@f=N7Po;Bro5 +zLP=rjJ8Ok#XP{~$KKabL-*CSD8IX>%pDRr#uTiNPlkQXI;EVPj!f0o_ay#s7aizCkL+p%LE>A@ZE8@G>vp|pnA)yqsunW?OJkeVbKt1Ru# +zn5sW_MSF|&2+=P-N~jDO7in`>wV>tOq(wC~H#XZH_gL$Y^-AScrS!rt)ejyNk}t1& +z|NcF&JB}Ye{{B7P{Mrd>g=PA-70rp`UDbBaH;ul%cPYNL=ta#{lukqIrL{AAKCZ`a +z*nr(6yXa#_cY8xj*OU2c*G`U$*r4lr$NN%T$Fj3C?!JqcT3_PFn4r8!W&cXNc)6@m +zyULqN36cB7M<3fW*VlpzxD7yKUAuNI$0xaX<2U0=Rr8qVmFrIcet +zMAqFlTcXAEJP<6QGS8AW=fWJZ#E;wj_de=*mz@?Tt1?o4?5+=InXec8C~{Q4885DY +z^K$C65O;BLseki^uv6;~se3QR1^bK*{c=0!?%@v9sPQwVO`Mon9az18Ut`Q#?WT=} +zYTclOVLHxdLyjZ7v>NJva?LCqLe6_F??J%Xl_kiVe`wav*fiOJQ)*c*m8fQx0%^4z&|^@M7~E( +z@U}lr#%t7Hyd*oPg5LW2?HfO1UEO_BWI2(f(9z?TPBXx)ytcW=d}DZX#+&HQFFCon +zreKi+8~#3rg|4AZK{=90Tlenm0WQY0`74|w3QA_LNEnq(+-D%S@lx%dH*Xb6ol$;~ +zknkqU&QJuZG+l09+$H&<6bDiv#;#?UyjzqGVeRaLd1pkTp|?`&6B8AWAf +zWy|I(-Ho}&fT0Ey_n$QnCq0f&``+j#pFBfdxh!~1eRPsGh4T~4R76%_V$c6L5~{P^{2--4#=GeuSM +z%CBC9w>aSBXv=K`PMGPc??$LEAL_hvtM{5kcY=jK-mD|T^O)O4Pn+(gTR%SZ+SgUJ +zZrsTryX!-?Bx-|F-M0Gmcg^XM@tEn%7EZ-Mx#w +zyng+n8+)eDxme~>R$e}Cs!rJ^L!-#dC{>$xM+*yG?<~x&db+Bs`D(I4aza8e@O!84 +zSYUo=e`(6D&eHmdHgQ_9uf+!w?=ea46DO{@y?5E4cR83iqmlb9@DqAotgrp{xk~$i +zZh6qrmBvb!e%#NYVzHh{Aul-Wg!$I@Ocah+xp?m$=Q5@dutK +z*okHn(ho5(&s4@e34dnH`No>8_*gzE`bos=>)SH*(iRMmNR=8Q#BtAGk_mrkmWa{0MzXIdEWI +zN{WkBW|kXCO9Goxc+{O;_wq`PQd;hEF~>rJ$KyFylcy|en)v3~v)6$1)mMxeqNeY2 +zs_zlxU)^6MncyKcY0|-T_245PN1)VPry0oY7TK^xlgtu)4HM_s +z+S!$^o!7Vtm0(W`Psynwyifg69GczOBrm>Yh0?CtiBcl-WD>_*tm!-^X+QfBc~(K< +z!F|!GBaa&Xu{c8-xgI@wbhPuswB2D7(=qrOpZ#8|B1bK}y!cq;8B47-@t5M7>^4tn +z0JP0S6`BT2rJx?SHQg>Oa9_Lk#TVSmijIyBV4<%`eBHW9!rNfCy!_MK*-zEJe7?Q5 +z;kKL7!R90Nn#V_=<`7+%5~n0AT(snghoj@@h41~!jJ@-UI5|Miiypte>Ztd}=cTT> +z1^f4xzB{HNkrBK%Jw1K=g70^Z`mM2`pkkR9Z;i@OsyI1kQLRV|>R@-5rfzv{p2O|V +zKW19n1}@(yYqu#{{L#lJO!m^YjE@cR@$vN)I}*S9TfdDMy|jpR1-P;YLy7`t;?Lw< +zKNr=W^{jpYszlb>hTXFC+aDv`N{*zwMAKVGqDng3{DYLF!dFVihTYzKsk74{WYSqt +z^Y~Klw+XUyJ$7v0je_KfR)6Wrd2ARTB23P;rz**_6Ux?C%)StzC!d2|wCnA5G?uiDld6k~ +zjGR1al9A87r{hquBSwz{3f#)lvS!wU8hy37fghF2;y-_#h6vlZ~f1&8lOv^6yZY1t%wS~rRv9jzNXHP$nf^y174k|6+xrm>nr<=bN#LsQ5n?*@|c>dMdHc +zoICfduv{9oMOh(4mSYgHFfQKN)nJYMzA5GDpRZlBnPu$u^u!3!w{0t=6Pk2RNh_ib +z9WyjuoX0S5Jb=d0a=m6(8Xv0hb~}u{|8O@7byh0ieyMX<{h5;UGoZuFzyc4$pt$c( +zYU%HqQ8C0VR14d)R~*C&HY^xP*&9A*v7=ogPI+R)gC4oy(<3l4c6N4&l(7U;@1!M1 +z=7(?Y(TON6EqS9CzFi?CNcT>B~kbC7q)Ao}_Dm)T9u%2vXDKMyA-A +zCnBTPym+x*VVs17NN~dwr<>UMIiuJpW%E{QQQAG%Sy`9dbss&*yY*mQuAKOv_TWqQ +zNzY?r$BvDU7at?>$x!xG`V#od$2pA)TgGB*T~$9c9lHn&m#}!&oOKCuW}7Tej!4=v +z;ro3HJ*iJnetx$?v>qjdUxYioJ(0<-;rmqjd} +zg)I*VxD(Uuc4K;YS^1T=w)ThQB+H`MW??QauM;`>um +zQ=PI24*SfeADutK#IdZb=!L8FD{;jmsb3C_M^P+urcIgB@uZG`iUk{Eb#Ah$oIma) +z`SNP7sAdC{5&O^9SINn_TJch%<@R3n!qQ8G~ +zsEdgiML8cOCw{rW)y`y6qfrBp8C&Tpuk!bYy`H2Te`+|cyKsE>C?oQuq{K-QhE9_e +zj=FrZtS3}`zD?|Sn`zp%0>2o)WXTa6ZtS;j1(PQ`yo3rCAKJICWjC|sY;z$tDQ*69 +zTWxnxqDrEQSDiaiab;=~dex(+6I^4i@6^{h +z@k8N<(ONb^Jdmz;v8VIGMtSz~Ko8Y=lj$2awS0bmGIIxJDmmZrNb0%P8$m$m6S9|G +zlteA|&UiL9LG0A2Q{G9_aW}^KonSmQk)F`#aeEX>e0=*^36jH8k#g~p6xIQsn7|cX*aw{o&TxK?Zd?w%iLKgEg#FB$BredV=Bjf{207o +zWeMqSvA +zQ_LtUgWObDNzJF0KPQcuJYGypEPkiV!*%1tP!bZ@!u0mtoGHPTB6@YJq8gtti71r0 +zoH++IZU5J;*mT`WYV4ashs5OZCVM3*V;1_)j6Iv$_+2S^lJ;E{J-ta3d)3hMBTy)% +znIpjeP$s@R&WkHadmg*n@wRQ1I87xe^OQ^K5?NglEibQVI{o8BqW!Y-of^a_OVq-d +zO5YD;cEv6~ri{`mmy?$tDc5XN^tw1)40Zkb^_O8I4drCA?6bG68$VtZlUKHwo%#Oe +zGLcGbDiv&<_4TGJBWl%8i_K9M!EwCor;x=UMP4tZ795%;K#$M##SadNUaal-cK +z*$YqGR(t#)DT<;x9v6gVccWc`U)tQ+cm&Ygj`=zF&8h9M>LrtZ4C(WK?9eFKA +z_T-r9awaPyR8Bp_hddrLVxgz!-jC%*CNieuh^IY{_}|_eM5BdNkv?{xZLt;G{4`?S +zS;^Xi=R`ilzzJG~N$D +zCC(8^5LZOymC=g6oy@Vh80)Dybxc@G@>g4p?yfH4-f6E=R+g5Uy>wc%XqnTt$rQZh +za@DcQ8&He4Ztc9JiB6GkzB-Raat;jKN%^$lYm0N%;p!;|YQpP93dq+sD~=pF(lxhw +zWA&1c-B%K==Z*-jo73PL>*vl`WL~heJ4B<#RX>+ZG +z6?U3WWq?E-#y`P2ZNse;m-tj2sNJx1Ys%Fv%F>Bh#ztp801fxF&@677q^Xw6r!-B^ +zd7?|jyq{zR7nLpIgr8~aaEU2W%iPqdX*9i# +zqK0w}&+lW+O;Ax=Qa*oeQ>vifNZCoN8dbC?GKKyw*KLW$Qk5;rAI_aSoRstuzwN*+ +zKVxmIyrZo!a842geqe26@;A96I*WKq~)xRJ-R~l|vgh +zHZL!@H(9MkcD~8?-AvZu!@CMRbOIco*A{I!>3{VdhZG&X+f(yhn@#q%y{lGy@A{xX +zqvgwPoc&~}QTa~Nw@3b0(b=nW?H4P4q}N?|>aAtJcb@y6yQ{`F&bvM_Y~Q=X9#m+W +zT&7iY#MitUv1UCf^C!CTkq{PTV}knBe2v@+bSu|@Aixnp-nLxSl13TCM{lMOSpG^ +z+hpJ~b)T-&m^Sas#YY%QlAc^^E!)&JuSWBR1{7y}T6y-@1(B?@QposLncD?=P*C*e +zTZSLbyxR2X)zz~~vDwvC)%nGZ%Z;ZS{^4r3s{QPBNtu=JJ{koE70j3yafN+an{u1wI-%+sp&d&2^Sm0iu}6&3%OIyEc0^X=`u +zM~cJdH=Yiv*sD!>YOU~e^2E$qbQ$hG$HAcj*gDUm+r8})Lz*8u#dJLxlQlOX_{`%7 +z@nC{iO!SG;=d5otmxR2~^{))j+qGq;_3EbQJ%ooz?3417INnJOH}Q3a>g%O&b6r-; +z76&Vcij>$c96|BJZ=Fp@+M}ncqocDhQ&C_4NH)QR{v<5_@L?-wchTbsk3>|yy|ht1 +zc;I1EwnL))f>qv@aSG;#PMmmGli&LEtYl+Tla>JrNGQ8uc3r63fl_GucKztich^5R +zs7Y^?GEXXS*qz!@MNCeZ78zW=t>{R}=OxVZ+js5^a9fnACg!-=lSEoAMN*o)=faZr +z^`9G#ZIWvv+a=O3FEbrm?5#1`*X5*lrE!BFYF50HJvKMaUyT_e{y{o9v30}E*tfFL#HRQ+&^5{{q1GqZs#jEj$ZZ8S(Q2h%9^HJQ<$l4l>JI& +z>!uk@W`@0E8EwPMkeHs&>26+oyxq>+oIEzJ`;qEZ*ODsI$d{K-(W(v~K78Wj$z^L% +z8$RH+R8H}fHH`Y|=q{5V`tY5$RoFh&dZj1k-=2S(?={`**|UY;wgXFROZ|g)RiiI< +zHj0J3SmTs_c)Moy3g#3ERN)$2%H0WuuZmnXHXpE9)q4HhA0yVNv?-r?_2)>%a1V2f +zuJ5lD!qs#+_gWt7-m_pld3WzhRW|WhZtlb@^itzTrKH#d9}D*bawNs0g7NUNn{Z_1r+8&6R^ +zFmbl!(PdHNW8G8QJ5C?KMybqfctbQRifX(syD0i@^yZ95bkBmo>g(I)l%Di{L^uxB +zUnwmuwT<1ftI4=$%nE6Kk3d=Ng8+uX%Mf*`G?4Saz8vPkkHbox9!a +zQ(63U(^b{k$$Re^;3p8a@Ag%Tw_J5;@$O^C7)=kXcc{x#3rL1FZYNjWojrH%jk>zJ +z%ZFq{mMO+cv8GahLCk)0^U-m#1&x+Ny7Xl1SY?SNM>yq4*g1rG`hm`;FoqLF4c8}> +zXv@&Ejb~AxZtjH9pudF59-E>1>26eI{xVAz@tUiPaZz}ZBO{PnD3wR|C~KDR)#Xx{LWMIpUr-R +z%0IN#Vy`@T!o0q9(Xn$ngil@*l!OfJ0TJaq|f%{dnp0 +z1u(+M_72SRCZl?%J(YL_k;`i2yCycY|fS=JZIL(O}hYr2HJbr;a +zfw1cB{`K>wZaYzXe{ldUpZ+BEBID`1?k>&Kg$5$1*ij2f!3SR#oi#sgBssZJ^xDf& +zj5Vd4C+n +z@D<3^>j0MWnuvqv&e0woUA@OtQb*U$)=nN(rtW>oLbd1UyP7wql)?r3-_kB$5-r~- +zuf_IzpENaJTDlo~_u+vHYeZ|GOYMJuofe)c0m+OkKeK;7xvjA}CnpE&OwMZcdo9gX +zDrEM1S#ANAyQgQ6tLwK%CtZq)-0bY+b90yM+J$k=ogABU?!w~CEh|@^>h6lNw(OWS +zs|~Enh_d+O2M`Zgx2;-L9E&>t^qx$3`-UY> +zrUic639X+$FX;YKgt2_->RFZK7mXoo(@Yb4o7yi2 +z(o3#|eRK2ArWAOzH$OQ|xw=W!>Cc;Kx(z0go2Ey|O?j=Tvd-PKxaUh15!mbpT3y%Q +z+j98ySF=(XkwYA{uyvW&AFiA3`1W-TdA;oEiJ6jU^w$q{KWZq+8{`w8cM_I$iG+U` +z7i^+n`_6w~bn1>BhH${v#MvBopQc5QpH44t#Y>x?z??29_}1B3d}~sp(ie=#{fVYP +z)x5d2dxWScthU;oGVdIbJY2EH*)Aic;(By6v(8zQU3Ud^t~mU +zY75t=?%b`oY>jx_;oMxnfpDNmK7Rb@e$wwsdHGkd^5zWx@Yoe!!ra!NG1H7$ufak* +z>32)cC^%zJ@tx*vZm*V=<*Ba7ldXPndA;Vc;xF*XIS1rVPLEnS+Gx+k6E}f&4{LrL +z`mMFTr@JdzPJgbtxNXTP1GJuT-@VH%)q4~%Vk^Qoi4{-}%5{p8#$K5?7x2HXTH;>HbdW7OA2{>}Ho +znX+@T~q{xx1k?%cAWQudo2^C;e};D)r@V)fTbWkDGp2E32^3 +zASvG}GbDvdbw7IS7?Vz?2L!07t2aM9R(B@k)ui;|kR3lh~Av#iuK@cq|&~vOgEk9z~QoF-niyn=8y}PPIG2>w+ +zs{MJ2el9jzb&H3yOH7VgE|c*7vcuUCJs%coF8$V};CT7R=<}o~d`7sbGYW;8$H6V; +zP?$mRiAWTL4Wb$&1-h(!)pMRz93 +ze1=2h@i>CzQFHIr|8qh5|G{g>^B+Rl9{!y^esTUoTSrH$fBq)}E#2YsAOFNPod0P! +z|I={(_u))X|FxN*c*4ie{q)Nu{lf{Mh7&;juSx&jH{WkxafLhhxyb&fGr?1X{>e=6 +z&|k>rj_#Yy{a?-@-I@5y}RPl-XR2!;h%#%ChJKh^#<8TlMQvw>3LWz7#@hQg&u`3)KJ +z!~}>Al6Z3w$} +zu5S3*4m5~v=*=?5OT*Kfct((W4Mk(zU(MYg1Z0ekv7q6x)>`ny- +zfhRf~CX%lTkp(!36TG~6wTFWS)E*Yftc7SZSc3o&^Bt-|=793CT#Y4ILEMU?f~1Fn +znINj3Vl=IXEx4qtEjX`iGICj51g$Cr3wC3)r36+!0dyHp70c!p +z89;VSCd-$rTe*4ndDI}e?R=?Vme>?3QX2uug@r-)(_lh*2ZQ?LB!sgo`u3^j$~Obt +zuq1+DdlRf<(7v!R0NNORawzs~15dCb^7%tW_x;ThXYOLn|50dKg?P}bI0d5bOXrtM +zf4l))lFMoF^ +z+`ENG(r4m&hePI$0ZwX&By59?EkG)wf_Md{nL?Cumq_@GsX2(lvAFvt@vNOZTrWbt=mQwm4M~ +zeT-x$gvDI-Crlvmv`SyAmFs3O1}``LYtHjaB10;FSMP{2`i*YkrTq8x3hRyE=ro+n +zV*Gub!t47tIz@^}|9!n8OZYds^&@QK6{}m*#7K=t9sL2Q@P&>>>b4Og=yoNqA&@- +zq+!v5sAv^95hhpH!3uH^OZz9@BiAfqQH3&bs`fX5sKSmJyoHbjJ`%Zaxp#r#H$-iA +zs84bBU({u1P{UOK-3aib0{f>JsGq7rSpL%saEHO^uib`z1b7jlV2N^Aq12&n1pfAr +z4WS1LqtFg6DDw{fqatjl@Qck;8DTWU?m@7fAxq9PkW{S@w+a=qgRo)f-IvMgS5h8U +zJ-nxS@8NB+3}M@mn-)2Ah>G+=&kH>%FyzT}3b_{$jm?)_m~?^A +zgUu0mAS}derqdV!LWVyVTH){dK}_Ca`-NyiL?4)DDu3y+nP8h0PUb6=yPb=}_%esG +z4hJ{90Vy1W7-07!IgcUq5UNDjQSawb2pexhE-Uyh=(pw*jp%LYFV0=>r14dk5O|2d +z7F^9H1e7B>3^-?k8-=D$s0>>FG{11dZhkK0!N9*hv)LcR`b{8y!2Lr3@dIxD2@pT< +zz9E750k;nU#0w!_ShzgpUvFAF +zKfa_=0Ig^u9~T(}JMDdv!{qQCiUHLyH6U{`oCums2P+-Pf8Vzr0fGy|J02g06h;+< +z@Y}%%7@Q$IU^EQbM1??XCR%`x^1vIem&srTQH3Bs4G2MO_)KJR4S|6@fxa+kAv6xb +z?zpIRXwX2m!I~cyLOx;unq_k_J0_0;CZ7T{q8bFmYCw24TL_cjg!(dvvkUjlE-Zvg +z4xU_C&qQaqqTqkyHDvskkb?eq`WQO?OUqDOcR>9=1D)aefB(oe9RD>O|216yZ#e4f +zzbxu&xc=X8_*cLCc<83U&+J={?|)s?7oX+)s3oqgh5#YGE-eDy^5?04xj#g^A_y95 +z2$+Ybap5<#uw&M*E4Vlx`RA0tFC*dKAm71bKR8s1Ka1?A5gbZUXVI7%+?o^I29#iJ +z?8Iw}AM?=fZ56oR46>vKGieB&NSMHYp$Mb6U?dncY+wLxQX>YbqKDM?BV&ZHTnv{- +zzGMX9?fV=C@}q)H-j_Ti_QZ!~1$ZrYfGT8PUl>y6MzKIkFyLoLG6(qijAcR~U?2Pj +zaejHv@mygOzy;vjfr&t7K@g(C6pk1e@EhI{X_Of%@ShPtA3hEPk(o$r1T-+_N;q1J +z#}$oUw5A`K@TmIHh~)9Nn0y3Mh(`h$g5P8! +zoI(0U+9UFUO!~Gfc!Eng7yq5*O9qQ}7J|k@vv_FyQU>=&-jFl~z+OC6E?D|Qyjtk< +zW`QS*zj(pG6IlL};2u~|_?5o&ffF|<>fZNph(qN+BS6cMcbdGrk-w4qH8h3*)sepy +z2VmvHP!1Q$5%Sp)C`Si|a`ZK|wKcU3AsubFPL#IMFqAWVaj&8ApOAn5@E__|_>Z=> +zp4Nc#f7-+KpZ=L^82=f@e}?g&Vf<$p{~5-A{&(U(d|YRd{jV^c|F(mF!VnNL{NAWI +za^If@hkm$+FIWQ(U+|A9a1W-zaXvm|1_i-Se377Z(4q!}1M4vqh%IdenO8d;c#gk$ +z!UqOzo(Au1%h)M{ix!e1tj|p9bY#Pj0vGf@q?lnROB~5 +zpmBi40}k*!ni>Crd73mcZXog!z!*9e-t@S4aF25!zc1t70NRGVct0AI?mNUih>!oP +zn|KJokhd+TQiFkC8O9^XhY8jd8KHO?1|2;VmNa0{{Xi2(u=CQ`WZtP4GKUJ2GR-+G(UJ#gPakBgw6=U2LXc-GMU@}5~R6-Am7g+ +zBf)$QfYi9qnBa^iBIgLa!-B}%qZq$LPBnf3{%~m#0)T)8;tUfs7~(TH-X)N=pU@BZ +z0>q!$mwYfR1c~Fy{_h~C|H?=#0cpQKklqFH7e>N`2>TzX{JjzVRd5cB2#Hhu{UHf2 +z-@h_F+;cuc`0IacKn`3Ae{)CzRnu=UxFCqb{4Mx>@YTr+W$&lchsNc(r+<+Khs5T& +z6gp9nbKapsNB4mKpuw6f2nnR+F})vM{GO35R2VAm#}A--;b`dp074tW6SsapBYUVu +zpsx?5FM3O5gkj)=H86hLdymQ-z+jD_Nd9LHOBNuSHAnU5pl=8rf_KKj_C-OoIXAkS +z+XA?e-!Y)Ug!i1v9Jo6Zq-P`x01rLZgyG;hn4!bW;cE_u5pHL_zw0Q~yI=|Htv)A?IJ%U;j7y +z_(lAufu6R0-}wj1U^xEspSk`&#Q(88{1<_OIk3ql*qDJyM+Un*6+U1-jQjr%?k^!B +zg!=cMT|pWd0`7;gseb_Q|4UQ-KaKUn?`{q;Ws?DsdOf7%8&P>VsK!N9Pk +z(5HXlB>@5>{l#|!$RB_4oqz@RkN?Tn0X%5%Uw#F^{qz@Me|uh*9Upk155=^f!T#L8 +z{?o8O4~-Y#{6nMjLSVlYZOGRG|6-y)ek9@F0QV2Nn)qq%LdkwW_fj<&RE{Q38MB3r +zDmJV6e8? +zl%Rg?TDUq5-X51jy`O&XwFsN~_q`9{2^!R!=Z*hDg#QbT4RHdf{P)Wo!JQfqo&yB} +zQxFPg(csj8@Llkm5FUERMhgxj(wG`-jxTUHdx4(6@UnqtQL8NZ-B{0`MKdC|VWD8| +zZxDsdfPBEfxabts7v4;H0gF%oGaMNYZ!CZb$iwhR0r!NX6rBTL6vU4lO6R}`Vkp8e +zE*(lg2}@KO0`KB$nO_55O8xkw^ixoZ&%l21hW#5rVhxr0p*Kpx5r#_rFdHRqT%l5* +z-7%)B@{^5!$goEBi_kVBTa2R_~fa!j)|TT5N{TX +z>JQ{$7!3NGuOa>a-YxOp>f=}Oe>z&){p0`ibPb37|9|2d_Wy_d|6%`s*#95)|A+nm +z{}03d{!t`=hfnaF|NdyjFaq%ZKLUVE-5~zIGf+>xF_AoH8EiI)pUei|BF;YSi~_e2 +z_Wr?m{R6mJqXpsAN#RV^PooKu1aLop8a}Lw{Kg0k@`1VB`tx(gFHWE3?t09LC_Hx&0uq9oau)kAY5kiCh_MXPB6EB +z(jFXU7)*nwe$Xai+Z7=jo*Xg+7(@l8FVOOl5VC&(frHbGBVz|1GABTgUHqrSz!NzL +zF)r}@!s15`1!OQdNG@C^V~EqZyh$IVEl0jQ{FU~&LNZ8ePF(5X0#I-O5CrGovgE-^ +zy?~M+5J>5lF=qo$5_9Q>CGl7N=;;5ld9KtB(t#ycoRLUhzP9jZQQ@Pkh-|?F6?Dml +zf92waU|`(vJ)j!kOsUAJYPgl3)4*FB8XV^DN*+(%aaZ*D(G&jQ(B+d=sR#zjM5Ehb`@0H0TY7XfO>oB?kP +z5b!6Gdxn||KJnopV(p1J~Spf +zlFhH$%VcZ7z48VkP#^*UL-44eU@#j3j&q^Mfg=Xv@e4&J9c;v8q@Ep(9tmUDL10-0 +zfInejfLmZ|@MjRlqq(RSnZd<8dCxK#RKe|VEjrLxBoxq#l(BhI#Yef^)n^5%&+=93 +zh3L2(M5b0ib}zigdyYd53ZBK*06qO0H~zl`>A@`fIiiQ?8zmS$<8coI_0GZ1qA9s5 +z<3AfpISj`MU={?8GaN?ahOd9@8WR8O^|}77K7N7!>F62g4~YLX9M1pvk6gp}-!T67 +z@8N$uM_m|B6Zr1`1xO%oEL`x9_hA?T97X_#5y1b#2+(05@V@{E>{CFxR|~^!_iAE3 +zGAOhsg82!f`BITGtiQV#X`t~OHm|Tf6i#MCK4cj2VKN3J!sNTumX)Bo_U&GXDpoOTTgaQYU!J$XOc`o6AI5tKQr^>@+V4x2!z#`~cc%_nsS1MAR +z1p}dZ>k@;wpcrmk2!>Ze00Cm)h#TNd28VLky@f@E$)d3#KNgh=p7G;^lUY>cDFiG< +zLgZis=OB4!YAow8bDp>$L;mJ9=#a!SI9yii>*jAAtu12Xuiwc%bb5N{t~9 +zA(G7%vVw0!CN&twWCx|PkEMZ7+Q-@$WNivRBEajYFiOh-g!@GD+3MR{P1%Ikvo9Yr +z_vH*?tU?w{7La_w(QzQXecmCkg{)c70IwxqA?4OrPYd=zzBu)+{Jx>|e-|4lYz?^BJcY_( +zGBl{Zp_;3FX;gnEEL46}HX8xo2Q2{w>AG{R(cn;YGEiG! +zM`MOEkR@b6X3?2!2s{$XhF^&VP+9Q%B5s7biYj+|qk_MYX22vefvTjyI})<+kZ^YH +zkpOtF7<4*d3blnO)YaB>AhQOeklO(KY0yTrgoml4NnnP-jp+S;BZ8SlYF;au@oIs? +z(YOE2b)8IKLfWV@M#9qzwj_3cv}i=K5+GzC7D5^Ga+Xr^&z|todalO +zeT3q3&b=*k}x9=2>&k7wtaNxPlq~m=PG3Gu^7ET)xr85Kq!{sD@gDU%Mt=t +zYYd|P1UMCTVss&;#9sQ|Um9QWblx8+T?Xvc-_;Y$n7)-ipA%j|5OHauR{tm%sz#{Ks!2Dl-N78E`BQHs` +zwT9o4{4Ljz_`k5h{%`d0%lr=px&!h*YUvE)|Nq1_jQIVKKaBnl +zqyPUY^uJF(d=!q40QZgc{x?H_1+5O|boYm=O<>ekIJy%Cb$x)l2azdcUuqDI0{eJq +z3hXhmC^R@SG?WF$Rs!FT1Cf1zB!|MWt`Gwb8Dt{|m0{Qf_AJ3yEM_Fwd4Uo|gJ!J> +zF6wYJBLpZ82KI>`*tNj^h8Ra+SZocUQjAEED_+zj8~DBG0h>J>I?HB;vM5x(3B%U( +zrTWnrG~_HcS9*!yCbScB7vlZ$hYh3I@X2X}Q(Ql|A8sx1wb8YKEMeN7eYLcBjmv}7ESQlfJY@a>nE75NZ{DRPa+b)vo?CEMI%wjj7a_r!xPM# +zRfHqJU4#OF5W*44OfW0UVJrcO`eZWbk^E>(7+4T=Nb^Jb^zGjj{N{$rKz?I`cIm#5 +zKP`-k4rN2!4H3pyXbcKHR1gmhlrD=I%z^`}dpQF$7Yq^1Y7iAc>tIfUM&WW;$kqf$ +z^1{3X!VwA+#!u-W#4%x;kmkc8vm#;YheD*#LjXaTK5*0kSO_hEg%G|88sdUHTxkJ) +z!-Z*hZzFh9=!+IeE+0^0X_|3g*a)~W8)l3tj0@meVgdF!CIij%f$eo9>K&O0uCT!gVT9j+k=bC&p&>6P +z`Y<1jyeWZH;5k)t;yt0Hige;j1rp9%EBv4Ml7|*j6c{1d;0q?57DVH*5q=zD2%9J4 +z7=%s?I*92@^NYklK$F44LY5;t00a5b;HG`R1YzKV`aG6n;BjaI0b*0>aA}`lM2q?L +zp$@}c#Y~ttpno2Vkbc7h!0h!I35|{R3uQ4tm)r3@uniDER}jt>e1M#6u=e&yS6CN7Jqe-Dg6QZ@!du%o +zLpDTvOB~4wZH@z!Va@Gv+^)c&EbOs(2MlD1b--HVkf(^C6%ukAk2*IS9P$CfWujO|EsQ{@!tW^(7)8j +z(D<*8p`QK#{MSHVYZ(9iC$0^S1naSAIe1Zx#oJhtz<*=m|BH))f9;okO-G?L4&yDc +z&JmBBqr)RyaF07obsGvf=Fnu4&DvPSg(^zZu?w-5^nHia;?-pGy59BF`X{!WE-J?<8o3ZK=At7Z=QKk2s@lsHph9y}9f4i=tXn|H_+P +zmFGTx#ip}6#($ad{Mn3>AE6!NMOIAhv556t_d_aU$BPAGZ>eW;Bub2bcxfJdYAGgl +z=FP*^o!LLOLv3GCkN;qAlA2(1RaP=-W?b#5(_Q5buXaymBuvlnRzPW$TV>{FWo2Es +z&~sHGCWZRwXjW_K|6}h<;Gyik$A?sm7Fr})9upyB-`BELc3Gn=V+=-PhMBP?-yv&GO{L<;;#mL +zEL|o2v9a;gsZ$GLV{NRhot&M|pFh80Mhazh-um5>7Fr66n~huKw7#(Hp(R@oclfH9 +zpqU!Z{YjaAR?2`-GclZ#RI`*oiLfMDka8uiWFvl0$vIQukOxPzw{Q2oyiQI)K;TEq +zy|axUKPDz5oI8Jhe9hU|*3XTNOzZ3mez$_Ol8qWy6#M!nk&>jPr8PA*+rE8k`SfPw +zs8KI#YO>1T+%cRMy>+wNRx@Ln6=LyX8fh;R685|b5H-70W(R9)Lj2K!f>$qJ66YRQGcrndntyS8WJ*fP%a<=7 +z&9B>EE23agQP=eS`*%t5Y43yHjR8l#o?9v!aO6HsM^{^W)db`D#ft|9Cn=FfDxDuG +zRq1_2zh+(hmMzLtzlDBpeaCXh$laSuEAUjry=HHIA6lhOCN!K>jed1?_Wo4ID`J94 +zkDIEN2s!G+SXqgb&VD9~i&MXT<;sH-;W-;Ox?5UaxRdQ%b2Y8}&Yco{0Iqw6osG@I +z<6&eQo5W+sj*YL|q#3ySh4erlJRa|PW`TaqBbtu8ySvT0U8RlJw;CSwKD{|LRbuSe +z?0a<;N}1+w2jEJBu5He(`mu0PbhI{3a1BlvC-^kr$nHb$gGr>X?mpukX0C{8t*1sl +z-Y`>T0T{Gb;HyaL5nEmJG?y0v|<$o5mTySW~Ac6RtPwY9aM8y*`*Hayz2 +zNwRddr{{y>C4-yaRV`|M9NAoV@7>$`N6s%B>Rd7;@dESB?cFlw%PN}`O)AG8NlHpeNu8jSrJgupfZL=- +zT3qZa)+o2zWdZAXiAYX`0U(In++0@8b&)e+U*134zJ2?;btCe^--gyFFp$x{Nf(v` +zE3Qy~RbOw+e0iz0;iN-WxuV19F=KoRnFGnRNF(1Q&pG=et4^Ef9&=f@fRe_%K0fc@ +z1VOTGYT@)3X9FERPfDhZI{GYqKxJ9h%jUB`Vvl8d-#@k8bJrG~kbV32k2hfNwa=Ot +z6m;pvjfsX4xtl^lL*IXRaZy>KY?C_K-{Z+qs`J8y-=Cb05s}dhylyoAQ&4d5zM?x# +zL30u;wkJ97cSYidO)&b>bkFDB-Mh<{FOP|dN!%vX9QEPCRzM2YnIAS#JVLh&s~Ut$ +zQn$Jt80aH1UgQ;^!rC6=gtBGlD0JUwIOs2Ipo=lXHd3N3K-O<^^i>t>=8_z#l?0ei^ +zFwT0GBLk^6H#0M%(cY$M21dNCymj|(>ZVN!n{M37+- +z`Q6}$5@Sske0f^DL|G#7K23#49A_Bu7T^rP`1!2}9$#CY<>0Vs$tVqlz%ScPmt@2= +z6fPAV^FT)(SClY%x&ATVr14{CE@wPVA4#aVtCQ=&62!$T>|WLoXzDll&6_u4$Bs2I +zF&VT(MoB5hVVjA#xcGoULn@CkCYI_M7(A!~E4tyay1F`GnUthA>=Qf8mrD&9Wc>y( +z?dJN2?z3lqDR-EvUOFM_ser1g>T9cc$>Sdm89qEYIk{$>aPfu>c4Zsisig_2pHPeY +zJR>;xL8{7lIjc%K;ql~wicC?n*YBU5U%GUu>giAG4jxp+(W=hGz9?O_W5I_gG#|JE-qjqC=_sL&OI@Bt9|pQa)+8%ucTI$TCJaKX=#~#!y!xSP<`Ej;oc$7 +z#Im$-!e84it-ZZ$+4Q8Ls}qlDZo2jI<=ktRvnS{f7b^TGllX|rwUhGDOzOzV?+L;5_W(W%&dim1DaM-I8 +z!rRxSq#X{$72Ugc?97=7E`*!)$Ev*N%u#x8!gzA(%au7zYNx=late#FV7PLx5XCtoLz_ueRghXTwL7RNi!OroSq}xw7Qfu!$#FiQik0W +zT()-7?y+O#E+%iRuDO@GQFm6bz#6YIS>b5}3u&oZ=`myUf?d8G4;xULv{HE3=i=j! +z4;1M)m$-=Fo;=yyK#1G8as7b^^QL++oBi3IqXJ2!o2%flTLUPRb1!t%oE?w+#SqB73d +z^TC}vLem6Rd@-N7B=7F%=P9h6M~@yj`lujY}zM(p>m +zH5C;VX8~k@18f5jZ`~TACOJKM!uW|3eVm<-FsrWs?y_v@QjzD1t5N>0kz(D2CP +zP{6gz+ZIkyOWQ1<7B`4YNb;ES!u=w$S|CZBoUV@d9q4PYwfRo=l2qbY^?7dTZZ?uH +z%!pzB)`zdkioAQ`rA98zlB_#H94JDw8gb=vw1J7qOxsh^!id2M_8X`9^IPB+?LWb4 +z9Z{m}$_6DME^Ui?E<##Nr_(=w_&^N``U2<@EUu_`r<=d~nOUrG8ib2~TA(v;eoI>O +z6GP@RGesQkwXh8C+{HUXky9=yPB=|m$%Un=J|?f$&Y*wze0K^NS3wt>zGB&+@~6d0 +zQ>JVdBY2sQE?uF{@_bN~Ib$39)5UO4@gtf#xFW!ac4lTSS-iO9uiRTfY=g&zU~kJX +zR?6L^4x +z-<1r6ro{(|-M({I>KJ2cbM?lW*ab%w6?d$Qr+8GFF1n9TVXCUy&6?GgM_wBLy5z;y +zSmn}9ta8Re&FD|Bg=erFYa-(OblszLOTRz_DJ#c5TRP^`eB<3IVoV^u07-NGWfyPn +z@8?8S@7%k$F*SABvSot?4pg-FrQD+UkDA*2=z4Chjj)wuozS*7I=Lq=h?=cX7p+O1 +zLtpu|wJOj)U2=Dl^(;hf`oMwV=a(N0rb~RTu}@o~SGq~PZoBDUS@y>DbvfaW1h(EB +zkdmLQPMNMc4dZ42iO&gkHsJVR +zxz9Q@yq@m*=`i-wZ7_!6Bu3yGO~a6x*g5m>_TGd4&BY +zSy@@a?7^|cV&eX37fJ`6`Q9=r&TZ8m=irgYc6fd-^9g8aDbPG|VB$IaL;XeHzbzXo +zElEC11UvSPt%l%q@(iHqQdybkkRe)9s{olLo3!jDmNCw@eI78}NG<3l;*q*xiA!qQ +zbo12{l)a7yy||FLJ3cB*@Ib9LH +zHS3B&;lY^rLAVuSw%KE4K3z9F;uA$8?zR=4C1@!jdb%cK=);1o>tuZ{e5|Hb)_Vy! +zTF==wKlt|GiB}_*w%LnKyA`Dy^1#K_H6IYwg>WE376K-u;(1g-TYEI_db&OfFsXuq +zf)giB$l0W>IPVb_JfP^{qP7?E+s4V36zMkrf^pn&++S$XMafAeiXpL|ZiUUe`^a+U +z$*E35GFacQD8)R9jhu>`F;jjuUi-$V!NlDuto73~7uD@I%viKAspyQ-11};c!KIS?SKW)#~eH3Ay8w)U8d|Ein0EM1FPk)1JwqGP6C-rk}6+9?`nP+`)d6 +z*bV&+)dALa>18{WuJ2DNxXjcn4SI6wPI=b0h2OubFWyj?w}8EQ;CPb-QDv#hKoD>O +z6S8!JP3En)50AYAyNBwj_lrG?-0c^LJNasDes%S0t0SO(_L3DoPiLR1>lBl +zZ~Ckg6>XK$xM%W_ieSMt0$P&ucEplotj-;Nl%A>+)cV;nwpFTRRLT4?!q=`$`SEPI +zXj+<_rDc<~?_EGbBju-G+qP}g#47iojrOjmR7MmPq`sLkG1djJ+NckHa(8M@H$MTZ +zjjw)Nc0+g%{Vwr+uopd$)jee%af%Z-Lx#=+L3JZ)s+i4pYi3($~+g +zPaN*1w8hvk_D05BtH#1-l^1auHI3(%PWt|Sxz);*rmH1qz5mkIT(hY4q4CnCqvNAi +zYP#L@Js1DQ>*R!6Z&rvcFAAWKke#KlV}X@$sia=B!mH~d0(VXvcwoy|{s<&+YyceV +z(xpq;&RGdhwW}!whsN0pdmnw>`sq`q?u1rJaw$kh44g6ALkZxVOLkz>Q}GqH>v$4cKg|| +zP`{z!pKfH|+V=%FX!wM2BS&Ud1Xt|XR=a4adfh7BVW04y#m^;qoIm$1qG18;_08{Y +zN~4*l5Bs`)92kGd(UEO%IHLa1-o0^EZS=vVgG#5RX3Ku1RfZa=9C)|wyOyi%6_wjA +zZ)~4}(?|$dY9ta#L_}nK15UmG`H*xg=<4+8`;9Shna#Yn6x$5QYzF +zhD@ofDyVm(dzuzJ3*; +zuc^6Bj3gzH6h3&^+;KX@1(()*H(M21zx`Eg%cty|9790lK!(4=X5uTUV{nd6PU|u< +zzJnviIOF*)QTaua=O+xxa@eLLwd&lXJy)+4h#i-GmXPpjw~ejSa +zixz!eAx@GI9WC>sL41c$vH0S#WX4%z^0zN~)(=`j%+JrC`r{kR%}qi^R#w)c{z6-A&Osok0mi+j^4_Qi +zE7HEzx=SZdP?jwTT~ZyJq)y(W=sW`SF0uQn`iNcTQY$i*6tk-yn=|cRLCv8coA-K;ESXW +z!+m;J<&#s9VG`Q{2!FWAm+jsM-B)?fY@568{XL&;t>xPm5=s(pOXt?%7u<5qX-G({ +zQ*wM0J#+0jGsWt)YXt&txOp9SoIdkpNV-`4QqkSFZke86zI@h|t>fj-mbjLbmJS=M +zQL2SKlo|-25|&ii!q`N_=Zx^dk}+{K3f+>_n68)A!PePZWkdjC`Wc +z{>mIJ^FTT&_F>e^%j+|>rFPEVaPnrdm@eaVxbL*MiDZ{t+I4-I2e)tMfE+Pe*s_S@ +z5h-mIGDY@--g=8W53Y?1(YPsp*r-t&R{#pE$wbt7LrdGZo~zW9PZUC{7tcExRb=@)lqi6(f8jT*Hp +zT{(3B`vEv5w{bdBTZGphkWboPhU{EBc-SZR@Y@?c0q{V$z-x +zE8Uv(%!Nmf9vxD7$aI&f-oRvuY|n|Ml8I`X+F2vZeAb0}c)Y0DwoUM6Q|eZaUG}e= +z2&!)lP731GB(?4xkbP!b5&N||ZRgHGR_6+?iq;@jw^xpox3;k}3Jd?V|z(x;C%me$;GC+w=t&+4^9V>kQ +z{X+(8ZqxSnH7i!Es4m->_$_e8>!`tV3z-+dQFd2YVellYZG9Aielf_36fJhH*VNq +zIeq$KyV0TJ4s3e);RR*)?r>r1{F6tMH_49n+bL;Vb9$ley7y_C8>(VA4tQ#$o6IVj +zy>DNz9&^_yn*BgsW2MR?^X>`=Y~Hd3NK_VjXXk|v!1=y=Vut%_plNktfEan4%=x?f +z?^i8YuPiuh>w`h*b{2WXINYh0T6#{!%gMS9j`QC=v7w6z53@>(xG5mIj-s!x?{P;d +ztRivR{D6R!FGv+O2q9t@rL5pp&Ani)lHlFJb*Uc%X_d!3(`29NRv8^4&sZJftWq;B +zZk);7ok+2zv~N;%b@j?z83z$0biA0@`qX +zzo<(%9w~ZmAF<+&*0r?t-g9ZAv>elq4kOsLE~2E(x{~jCcz)A|AI(1^NVL#xlEh)( +z9zEJzTPu;Yc1!l8cpX~hnk`#Ihoz4@S%3P);ppf0&Ye4vB-aZL?;Oyf;@mZ?Wt*zH}~4#wII`S<9eA|LX~YsG`BN`!Z8TXg1I +zW7$cE45Eusmu8wCNkeuysVGT4#!=!n=l+4 +z&Ll=W|MO$yG6{2MJU4YLwg?eti45{^P5m8M>-rU*4~I +z>N|1kYPHfWTa-7d>VB*9aX<6jptUm342P6F{21!0UTw3nwy0^CSXE4P^ypEe^!#o= +z9)^n>FnAbX;L|NED&_80YAa0%elJ_H;^XI0KC70o-JjSjS9qQtwp#cDJy;_vYoe9I +z)P1+2n(Aso)Mh4qST=|i8><;NHqJM9`Da0ujFcCSYZ4O@q>7dndw3Kt89ZEKM)nNi +zOx$kvjSORNZ*RaW4y;k~cK5jd_St+HAseTdO|OQ^;8y%K%UVE9#+$%8e(Kbdf>LqZ +zTG@$Vl5Cx*Y4Iyu+;o;mZyQsZ{_)bKnR5E>j}H$JeBCr(JfTkGsJIMn??GMt*|~Hb +z$DMdfYL3t3>-u{ueckt&-nq90hdU`2bf?%QqWXBz=?Ta_MsU8TZbT!!4 +z)>6!^PhPMS%3nEkAUPvaezv1cqNVJ}sJq{#LXQm~O4!)gB$9{P8~P^A*>4=V=DS8z +zadFWrt;h`%!$LG)ofx_!g=KGPa>(h^Dlvjap|Q8qrC>@@n0u5{-T7LE(D8=?gO)sd +zwtV6+5fOpVnupF;O^ve$v2e0xjg-Q)+ir5Z&v|IxzngpQ?y?*y;XSq>lXb-V;LxE% +zSF8{oBJx33@@V=TnE4>Pc3Q(w(?@QK@9GYo1%gY&3a0$B1Syl%7DomotsU|0j=7fD +z2P7}AZDOpJWvWMP?87S?E{k0N~z6OS}DmL^X%*%5qRz~V{7yr7_) +zi`v|;jE^iSz0lOue2Ei=l8%ja$ej?~mt=PY}> +zZ6@On7!NRTEGa2`<|h6^SZ06fr@g~*WQ*)^W5#@WSY?lk0~=#SPO_m?pyd(L`Ncjl +z^*T5`)}F=}$;mltE5rm#ZEZHLUR1Mntci)|Nvp44-<&(QK;Ay7f{NYyRlbcF&Rg*?YHbYuLhQI9Xp{nv`bz)bh~{ +zhvhC-q4vdod7;-U^0o?s5j|RvxmmgP;XPbY%!!4k4wqdRTZdnG|M3X7MVB{eYaISD +z@rT}0mc4K=P3!FUmNToQS@VKD6{`)#uUy^m@$He!jl{8}Jjea1ry8$>fJL8><#kpR +zH`{mnlc5PhM~@!$O&V``Wmv#r`eOs}5w)H-2H}K$5T2eR?n^&Wuvz8ws#mKKIk{1|Q>V0m!2G08 +zbH+MB+JX2BvaG}A(iOO+?5%M(Cox@g@8O@B>s~NOJMo+KugZsw$ +zajy?7`tjY2$vh|`Kl$@OM0eknY3^}(5rMHbi34%N#!nFxn?J3!bacQh+@l9mV$N)_ +zl-XWVg19R%lj@Jod+Ib~^l%{|p%t4X?kyW8gcA`lEl6+P!X6WPT|ld9VNC5qh64^~ +zCS}IPjoa~gooTw}bxPc;y?ceEtqd|m$wQ_EPKrC3TKkQVJWBnRf|k}OvaMqH=>a$# +zVbTEbAI`vk<7r`nxc9+ZUtTvY6s9VKWFB=*og=9!pyuNfOQXFX>0s-1x<$ny#sW8O +z65-p<%+|Ph2W4?;rBc$;1EuQq3SXXx6vAD;eEE6AKwT+`-L_flmkl4TNX#vn&B}ax +z)l1;IX(|P5oz>Nb3!)w=9}|+76|$T$*uvt=z`?CT1EZ<=7GdV$m0KJQot(@pF3V>L +ziFsArySM0l@nD-&qKK&Ik-Ae$HiyNFkwlsE5^%UpT8g!;?;M(RmOaMJ5N6SvKHNI} +zt?|yqi4!MGXvhi>PH6COtr#)trJPm9TZ&K-AP>PYgf)kQbN201*iFzWo3uP>e5F@D +zSywn-4`-V$xoXY#J;sCLHxP(d88z2uEFV^{nyV|kqd;e#hlewj`U1$>V^r@pRQXsa +z8qQ~nMEO40nIaG*@34AVM8r#Lhs8U0?%ci|sh%K~EPRu+aQA+Xm{kXNm@jd5Ha~pW +z`oPIEkDC^I{&12J#C>^?A31#dgDU@ZP4g8eWqvt7JUK8RH6>NYbAJGCEZH|{viywb +zON%6r3>hzFupmm|=sl~j2SWx-^Y+eoU#e#yVK~g;nCJe$8yO)~YFN3``?iw})uKxb)R`~tO3=tfaRT7T^OR;9`AsA7LSxfCAJOH9a}-A3s{i(N +ziQMI~H;*Sg7Od4Z+)yZ>hm)|mJxmnGzPd>mcQe>3I=Xz~_e0Xt*2yyBW#c|K{&m<^ +z;P}(MI-gLH1+kP +zYVQQ$66FOFgk^BKCDg*NN3v(0jq_F=J0zkZ`Lnf3TWhOB#<&+L3yOkD7 +zG}+2xp5jp1mAKjK*0r2d#ivNuUo@gRxdaDqB7a!-sz>M{hu~o0IIA4For3YQ +z;$~{o%4}30OMn%%&+4J6^Lon#!Xh6kg4Jv0u1mSNR#rT5x4z!-cYwn^E-;B-FKVdf +z`XNo#+emP(knh9Yp@qeB20N`8;glEs@m1m&)r7iT=@WF%AtsUZ+c$SStGVv#n;RZJ +zDzQ!7uO!Z=E%?O2gV(7y^H=TlRhv2Wd(?+>OQ+znk5?)L({V*U-!)hdjwbAxoGD!Y +zJe@hLEY%L2M?P4SCTbht-rqm60q2`{bJM0GIh)c2?~A=lk0!}HD}OQW_HDoN@^`C~ +z-zicy>%O0Wy)wbx0@t_6Zs}}Vcgw=Qw>8rZG-k6e6Ayw_bsN` +zdy2x|Rjcaf<=-By)F5eW@NEl&xo_X*d{2!a$ES}9R~`wx_=fEi8@t6@^-a^vto0cS +z=YMN`H<3!slUz0V;at7aO-^6$2VTTyEzYr>E%TmMb>^|Jnr()W$JSd5ht?Wh9vQLi +z%|1^GG60G|b-zw3b9!vl=iEx6dMz=thfj-1`ub(tCzThD7nl(HX?b|v>Y#iR37dzP +z)(&W{Z{3ib>_!`S($6aXDcJTuluA#nsa9@oyq#gEat*_tUrABi*7joJ$7MrB-7GYocu#-yt!C=P1+Dd` +zWn}&uJ9c+$%j+8%`%gp|*B%Qg%TOmjo-y(9=#iO^@FkXa*mibhK-PH@+w5zT7*_wl +zc~R@bA-ks}gdTqoB^+w+vncj(@l)p4Npr%UX$D>o(%QUs(u~D*PruvWOJW_79>w-e +zs<~=aRiM0F%yNqBV#yPs69ol|tfvhi2Ux9}Y@f7MOHo5ZV_K$+w)Xxkdso`Sh`fFK +zrn`6u9!j_`pz!tiOvPP0@6~15B}z|S=xY%_(QNPG!*43{8Xun&t*xt5)4_oi%Bq=M +z74E*X7}>BvJGSM`<&QN=;_JlBlJf1gq<$%PNKP0R9a_4+aDUOqIgHaAHf;)WpOvX3 +z^P{ +zl^9{d@5GZ68&_VPEQB}7ma~|2jwx=Iz9nVNeBAz3uA!$VjMr~`seCM6p<7y1UO-U-#ozM-Po}yRUfBt*G2- +z;PdlGspb3j?K^zrh}Tlw%6FD)uaEJT)Q$P<=pm68e(#O?^oVVW)r5y;U!Q(3_8D*T +zw)*ay^1)|YYK6j{EpblYw?Q>)K4Xjsu3(8}%B>N)FACjM*6cK2*m(KW +zUjvpXG|3)+v1g!6q^FsA>$evZBb7ASw;LX4-ZrN{d~^Fkd6vV$oScythR?mfRIlco +z#b}9FTQbf#X37-YPW%y}C8kG_%>48zX7I32V|K6bT3Rn0ucfW6SUt-?Yf9v5T>8hN +zqN2cz=;?EXUX?oE&>y3?bL3=;170!1<2+KDzZ~0X8ly0&=9PmW&?)B +z$%@Q+(D-W0kqL{8TxCDAFSSJ0KcM7$u3x{tSTpTlIq{NudHMDCyA}%KN|ugNJ+0M{ +zyeQq0nkc(t(O~a8t7ARrU+WoxXFfj=+QBL;PSRt7W7sf2aW{;cC5H^s)lt!A@7}kG +z`7PmLpjVng2`NsDAaq$Hrmbn^kB?I$FEf=&ckcRVXER{6*kmF9!lvPiHno*XJC9m* +z&-kN2+$w3^VbVH8eSHrvdZjU2Zu{I>qIdVt$tr)-aQ4T->evH!%+@N&SiM~Da5!TD +zb5hMFF}oXu^aF!iB}ZQ0pI+{o)8Jh|b6H+Fc*9Ol7nf0DFg>0A@$izmeL1=jZ!2G1 +zOb(<_M7+*Zr75rDeRDRLd?;Bl-f&?>R&vH|9jg)c8@Bi>t*}^lZuXXg2kCWpXKYlK +zrsO;6R=OWqcx&>MDOakhs?P6~5b%gxSNBy%b?+v(iHp+jXw=Im#e +zCYj3H8)*l-93|?G6x3awP^2zF%hH#lJY6~RY=)-1_a!6xp?5)Jony|N@EIOzp+u%N +zzPt<$u}=TMy2ZtLsZY=u#wWjscn{vgwRYQeBtp{8je&A#9fx^p2_U-$+HFDUZ +zZy)mZOr8`cK^|&$^D${peSrP-ztolDEDN86yFz2#2BjO}sSE5y^ME;7;8jr{)YtFPwZh@d0Y`%co7rffF(t~c-6=G?}{ +z92{=@=(X8fPh7ZrSysHVp=t+C0w*jY;(1E1>9YKcWy@O&3vb3?^td$cKzW;cV-7s^JouK&(a^iX=_zIR-hw* +ziyJh}DRkG%!jopl^h8J33SN3Xh`yva@?8Ah850VtuN#iENZn-?b7AUR{JVrTnOAN0 +zx3Pz|KDNS9s4i}92fR-kXlVgro%k87sh2@a*(FiCPMxCOJFs}Gp{RzYjkS$5u0+}Q +zoVnun18*u{8IlX8?s!c-e@?J;m9!cw;BC^_JaO@Q(_8m;o>?OJ=&9I_x0k7rnIee9 +zz|!M8c95ECE3&h*!OrBORGndArcfra!^dJRklek!L)_fH-aq16Sm{DlEXRcka;AmTG%nXY!a&k?8E~83T9NM)DSz?+gQDhXTr?Y76q<9w>my`_~ +zR*lnlT6I(<^UM|z-x&jD`I|i=4k~Edp>TDA{hXDP4u3>6N>@!^e=A5w%5L&{;uO~) +zt=R`Rers!5xbQ?A?)2l^5|Pa-=QtbY2W+r!{P=Nd+oy8VC4-c`PaU5(A~1R6G`j&! +z``$HXxK>rjT_-)O4PzN*8raT!^l4{$(WQv5?txk4e9z|khsVelS1UU2xtgX~V-UT1 +ze3aCfmof^=JPc2K|5WY(WcHnnZp&}4-FNJ>NwI{$Uba%ivdqi(mW_9O{j!p@T=Lk+ +zOi?`k^Si1amE`1=(uq%7?7dnABHs-QHJE7qCU9G9>c)+_&|quiWVVN2-7Los$L2L! +ziJKiJ9?Q@F+R}33+NfH>C!)Zek%oZPyt=k!fS@2`TTPD{H}{L~D_i1Xla{1@i5`f +zv7KCgm{KMa*o})PzaF7JE_-i5 +z8h~x9eb$gte+_XnEvZ${S*HaIpO%Uj4UGUWX=-Y!f@x&GaWdSP;e0sz!u*OgB<0^y1S>@*;E*y68H-!H0RZ+HMrkQ2qa-9= +z)zoBdAAX`_Yl`J*a7su@8sg(q_4@T|0KB}c?20l|qr9EXLZ7~jeTu&`Wec*zE7msg +z0u#V~B=83Fy0+A{M}@5A!^ZDZ+g(tglax0-Gc1Kd@i=hsAcIDu1qCT6E7#vUSam$? +z#i;bja&i~YB;uC&8Sx%|u+Ct@{IvtKO|KEA<(JNxGe=2DNmNvHwg-@9>#pKJ=0i>0;gYyCPStq2njIJ#k8#7C^&_j6pAouI` +zO&dW6O-)S_i5G(N3GvfckIT*tO1$9Y?EIpxuCBUz_nC^vDxm^&!GU6Qd%>c7Eyv1Z +z(gViLwb}Q%@cyuuTgt!4Y`=FM*Zed^JI6FuajmC|>!NIv9ESbd^L8f(e1A7hb?(>J +ziH_%g3_k4?W3@ff&;^IX8L=&Av&opNCmdoG0;6{XQs@+(%fK1-uE-1+w-$3qfhhP> +zBB*4FaVR~6Ns3g&wpi=P;SV&*D8(Poi_eJdx>y9r$RH{?2nk}){2}f;1hm9LOwuWl?fB#|!}hk|`sPK& +zYSXH!vc^8Jh`K0fPxdMlyvOLE-NduP~1ec2MYi2@OC1hTiT*96ay}D&jjt +z{KSR_y#aTPsmd3plmn0{{UYwN*m>0|+L73gbwK?zf!0xX)NHP=CNL^4*c5+)3f>8N>43xiTk#zDcT}(#1E_)FOs-JM +z=gz;wE6j%%1zR4d3k@tjDFflagG~V7ZqUgP^cY29(xRbPC=xHu0EHew1+xWLQn$ew +zcvJ=Y>MUk(C&RSkq5?c50Q$i0=)VV?n}Qhr98Xwid}UUL0L$%U09}4#ZngtBD+sHJ +zdiWw@zQcI&crj|{Ej^5Lgpi`)v_LmaV9&zBuM+Xln-uiTg?)XZEiiBJjKm3x49-eyDqtv7b~I$}(770jEGnHE5*~ulDRi=gabthfZyZ0D +zRdF|UvgbmG`XB4~+RA>q1NSv_^VRXKg{7J64DM^RFIIb~Y|Pson?vj>yucgWkOi0@ +z8#oI&lN2L7}Xsk%LFn0vAJ@PoDm>_Ck5Dj&3#f=>e +z=s6Iq4W3^rK2V{rIx+()9e5}}JL}63ux0VnAz($i9YQDrid|H|d!msb5;FwilSO5R +zlQ5TtedyoP$;rW~7XUbAx`hCX0nRtafFvN=SZuf_lOQ|dp^zVCoFLCsdN>7PhSTX7 +ziT4WbbW;~o+g`xsl<5{+z*qo70=Zxjb_G2W?l7F$rm(_80M7s{jY9J8GUJdl`2q1y +zrBf^lO%pqeeFAo^`S-|>!Zd&kS^kI4ssh}dYS9X3EHy|pt^J`uDto$!e~?TQg7^t3BSxZ(~ZYfc$# +z&*q#*VDB732qj(^*@%saK^QRb?8N~F&+%^vy$t%3nEsroYG??kNKhFv1WeL_jkF&E +z{23IMB2V=ANf>y98??RW5b)smq`+-h0iG0yNGDS7q7~?nP|!Maho4trQot!0Fe_#_ +z61MqgZSSTzu3(pnV +zf0jh~iQwpFRSM6^IfqpXL!I +zQJ9q`8UdM-L109s;BX*t(<$hg +z3J>O*9*8YASQ}fhT&4Uyai~Hm>T#A64N&g%qBvJ>e*spo)%!>dW9F +z1EXRf;V2qVy#*R!jL$tYo}+&vbviNypwrxO`~V&xt`Wfjk;US8Z^m=`foC!qHmwMf^uL>Z3pY)BmRVM~AT1o#PDkTYdbuS$%NBm-D`-b5sN1P|D5g +z5bO!;I8Z;-K{LWLkRWj^C{*yBnuQ_;8a9O9eUKzJg$z!T9X>&K7ttJ5W?*qp0O!L8 +zGyGJH{FvZegvS&_@PjBHU}(4*I-T?J7mNr7fP&#__`kWMx*9qg&ke5Bu?CsO0Ha0~ +z9o=eecuGg^`4)p&f#mNGzdI4p$SBAhB6#gcVzVhsx)+~ftAjZLdM4)7;wq}yc;mk +z54mtmAy7Gi0Rp%@1u|DGk~vpp#6)KBhyjM+G9MI{#Y+RQ@-$>`BCMIZols3zd8L}{}cA>mw#}5i2tpj*;)UiuC3Xx +z|M?TCU;opu|LNEN^y`26^*{akpZ|aKKU}@eEZg3cI{g=a{>M~6vur!-e>mm?{BJsI +zfl%}G4%X?I7MV1bddVKr7Ct^J|qCyb_w>3uLAB@w~5Un_tn>%1N~ +zH+nGl1Xu-rNPlW_(^YvBMvFnGqFo6TK!S!6(cpw`L^a`7FjA$O5Yd8j&=I0a7qkRs +z_l~~z!U}-4p7xqztNc=&cY3(?2Z+qk)4nZ3G7(KL%hNBotyVB0lzKx~DFK +z?pFN+jS0D`AHEAm{MINW-bA$P(m2*B?TzrNcDe@yt@@(bRA~9ZUmu#maI6!t8AAK= +z?^&(Ho0uMySm>N_49T#2R=h>cQJV4en<|J!CzTP_7p67>JBtfyvDQ&f)V-#Qw-ovS +z6*kQsph7iN;B{wBCx+L~Q1U@&0V?(h!1i_c&mhFKXa595)Jm~WF!GbZKZBC1DEudI +z+F^Bjhm=Q&-N0x?#}<0e>S~VhE0582R9|;c=z>=qRVOF9cu#6k0H_&GF_i9VSXoU7mbYD;j_V*+6^rsYh1QFf|fEv{H +z*9!7vMuf(Za*$}9G)b`7H;ko9-R_<8ofn7u950vQIC$2tZu7;x$-$iwao +z(4NtYs~jb+D%8))6Mt^_3zIyX94b#l2i2N7&(D@nPZw9;@t#-J#=t +z1mL?N&9RYyt#ZnmhO>hhOqK!sjUL2FfegePNT?*l5sGh!0vpYnM)jwVs4NvINBaSx +z6RT~`2#scozBqjwO5LtnIU=R@oO9h_W6%@O4^z)wjauE>7 +z{yn@?#DjPLX;S&GOuh4eOeg-&xqq+xUsFv>r!)W8RO`S0@ki3{W^Y{n&s#Nri~FPB +zTzcgGP?-}*ji8{ek*J|mXzBQ0wG&|47*+^76fs7)Z#iGEU~YGN1&U||)Ey0rvrAwP +zpb5?o1`~;i<$I$7jS=AGSmVwa?IqEFr~%vp=-oCodCK^_*9 +z=ktw2WpRh$k6MiISbTfSOmZl@4=uxDy|&!r9{CGfBxg?e)N36#N6s+%wnzSaGY;r9 +z9V)DF>{4k5y!4cMsM`zNor?cs;CtS?`Oz4{3IqVfAU!QWA_7%GAe)86{##C%YUdf#;=Hfy~%$X8eQc-b~Hnhp^PM%=sIH%>a(Zrx%GPzyST)uJ8-;RKNW3 +ze>wHO|MOVIzoh?HSJTw#vj6L7>Gtpce4L_09NMs +z>VkH6VD~`S42&6fGS0)ima#BfH>e39hcj7J!2P1Tl@BaPfUh$U7gXR-K;@3Ef&nOJ +zO7~~JLCm>8DR9A?*2S(<@&7Nu1KUubtU$zY#@*zI9FrU(;=@C=@y`o#%i-~uqiLQg +z4)m@E#%Krc%kar=cpq~IM-L~f88cm=@WF=y^PW*a!24KOI-5ILIl5Rm*u#2%}KiY%&FMHpBa!v2`H4%t`74aYTJt^;SSP37l*<;XTq@2pZgQWWBmb;&>!t^w7VDW +z=p4A4o`2>e7_{~eTm<9M-T_eXZ#zuw&Pe<2?H6>^P7`(_Fbi%#BgE|pB +zK}>rg;7J2ML1dv%n(zr70W7HnpU@WJlQwDq_uCl*WJx?bXUK19{5MN}dv`o04i5&H +zEk58GBHUvPCkH*maEo$|F(M)z)WO_~C*4?Ys}S%as4iHflXYZFEX;xrD%grJ#uxxk +z@Z`M2pa5^NA9!9Zp7YUmD@ug_P@@Q-pW;Nauw+S6STPP0UW-Az;A~O%ou-Dh!N+p9bPZ)ym2ND{DOds@FtrJT-PJ3 +zh)BCNuyK3$e51iy;yY|omA<-3B2G>8U}C!Trq!Q7+WOkTH+Yf3rc9k#%mcLoxK6_pfj`N9^p( +z;$4N{x@7*{eep2T`AZAusP511N}7CD*fg{_`b`A$5(4I}M?W4NZ032onm|^#AD2)7 +zo0O9yp#OruTyt+u7yRY1Otc{Ei~s@cTX7UB0+0Rmr3wc)LMJsv`%(Y}|GlMPjs^DM +z-0I<6h~SIyf$vldy$gfgxj=20-WNbXojgIU +zs|{Eu*L+Ag>SCSeUGKl^;~;16z((5H9;~}>huyjB>*lNBA2yKc_rm|LQXlsJ +zuwS$O?sfmyR`2Zp4e(p_e*bTOB>nDfjJN-X{eA0i%>1XP%^x)Z!kk;QZ~I}i|E@j1 +zTQ@H4*4-k#ns)QMaOsi-6-qo0AN;jC`E}_oms1z@z0s*^2X`;sW^*cIUNJh=?&Jri +zhZmd{xc(}zuLhj5-S|1c?8!kTRPoVMxxRdAuxIeO>E&}J!R?Ay8&frlbmLZ`lf`?x +zZ-WkdG@lcOp5RsB*RF83(cdi1K~(~jAv(jV2$2aLH*j#P*f#;A?}O?ED2`myw_f@1 +z(kIadrryMx-yqe|F!BMo;L5=SIS*yI5M?=kL~f>moSlK3b1z11SVNfJ3hAn?v$A)# +zbaFwg>|GoXIToTI2jpSwe?`R2)YjF~8BvgzV?n1Jynhu5eQ@Q`W9rOfh}|&{Vz*p@ +z_;Z}~sozd)g2=`3-&^#3xew5O@Cb#@oggWwU_tyqXXrA=W~Fa81p0dJ`0t?~PMh4( +z09Xt-=u_wm;`oNqXXO1G!}ujOz!|{L_ko@g#8_VrSN)eo`cvOi_vb%5(mV<@W&S;V +z^m6`F)7I+j|65yEv;Y3@A4!w2;~ICu+if*dHz%;q725Tz!{z*w0c$1O8@mfdZ&NgF8+V|>Hp89PV^5a9OVI;93G&ls;-S_s2gbLcJ%Px`z}ej?`2@5mC`vpFoGM{>8Cj@Uc6 +zAeOVOoL%_nmD>PHkk8yd$6s=z5w$LHrqH7Bmy@&7t-G`9V2pU0f!Gv27}%8J*?%+ +z!HX=n7$O7B_4v?&4IG-2Qc)XGUP%J)rFjsEj*1jqj1f4Xp(iF|UX4yCC}`{Ek0?_y +zY%5a`0&799=dSh=vb-J^5ZdR83zIz~65gLd4oF>P`OF(CIw?y6Wov=l?&FxL1Q=$OiPTA_4w1Z$GUQh@8CX)J_?8 +zoRd2*!eDJaJ&*kQrSU>oED*<1^m|3 +z8~soJW$$l&p#Lu4|8#ZL`|p4Jk<^*~vD0Z!#EOboj +z*uj4qMgP^QH~P2xRp;Nh-sxYb^ZhSC{~G=D|3^}1`bWRV^~?a!*GNon#!8q|X9UK{ +zqD_M_!=Sx&?{JBLrntRd-EuRaFZYi}twkh%=i>C9_pk +zE$z`u{N2Q;cX3k1Les;VoS(`pw3>=P+n->9H^PFv8$k^kC+0ny%BE3FY{N;;vuq8Z +z^F?^H262(@9&#ESP5u*_3^c+@KhVpcTF~J-aiL;acV&f7$W2#=!~0f +z?CLUISr4{iq>ACh2*yA&!Q+kmsSya(-9Vt)`L85nSY50i+pGC$r!0Ma|6 +zoKA|M29hw~z!FyH4G#PSg9)dhxTI0rF;AuYQ=(8FN-&wp2%$jiL9fW1vOSib#E76U +zBdC-}f{7cI)jo(B6efv=O#!I*(-r_@V~4W{CeG;JzSZ$(MAB&t5+GCy&ab}JBQpWA +z*`PCX=41*9-s(04&x}6yiY{=tk|EWQ*o+Rfj8r*j3%j$ytE +zlc;nyHu30uT47IJ*3D0bz~2~|5fVy;D-n(Y{v^@;`&yS{P)p(h0-w4r;665n9-P5U +zxG+g!K9~b}f{AH}9}Lq<=`#|! +zI$vH3kOxHl?a2sdvKY+vHqggD)(vH_*f5BK4`9_4ItvCiAecB}nJBIIsTEYa+@T4( +z=)TuxFiB(@r9*WGG^=;Y;ILWCC<+kY;FR=kh1;G?{@>FW9m9kj>RQ +zcdU$UDqwpE0NV&fg-&6sa`qJ#SC|BtgE<&UcTj1gNd4T6bTcp&0}z3B>bpW9}ULprr7Cvz)n#4DY +zSWBHZB))y7)1JhUB(QBMNCWl<_grHFS6&CZFKE4e`au~`J=Db1k3@}P5RnK5c`}7e +zWs(hH9E`~%Y`T%~5F`|cE)+TgpVAes@*VjzCpN-Qeej7f+e)sIGH +zuqkAc3f?jVVNn9Z!H!Kt7~x>)@tT7{Qowc%_#|kTNd-bT=o8Pw*CZ;Ng1Ytf;f#b} +zg68;Rgp05keoP9&Kww}F8XIIot`;6b0)IfU5GtMI4;!bWZ&i#`L&2~ChBVtTZmw4+Y>#6HG-Y=!Q%qu~ +zP#PEuCUJNn9xzH6UIP7egeY{Xte}X-79yjf4`>0P7v8zx$~<_~1rx6_|7R@@7|NKg +z6>WtHx@OYRR@fvz3XOz^e(*bZUm;jHIXEINre?O5U +z&`pblr%^dJ$?yw5Higy<7FWCg=wN}fLU;tgHxcW?m=MfhQKpg6Ow4oui6!z?2Lb|v +zLPM+>BrtIy?bSlie3f7kL0O5SIY~Vml=s{OKMNg0rQqrMU}&wS~xCO63d~ +zkSmZ1_Z=4WiUhk4f +zEI2KlK>`^Zm^kPQpn#=}u)_ghuo%}Z55J2ZlrlNL0XJe&FgEPafq}8$&0F-m1GpxS +z85>~St9wp_jktS4Xvab)Lg3Wuxc=Kq_q_gj6+0|@{+b<@J#VBPId50i&Sk&=3+-GU +zW4}Pw@`v}4naJdDY=ms+$}fPzq>w4-ropX&o&U&?@pBg(Y>F_2y!eAO?POT!^!xNWQw5S +z;UL<(Is22yR3Iv}Q$CqNgBlyK&}cv^f`8#Vd +z6!2k=u%rlNCv0_dprJ&;z++VGKu6&LhbRC!gc?94!^0*XtP&DvnFLA$VgURd?Him) +zgGekzj!4v5(&WmM95J)gTT}zmNdhJL0l5xUI)!$Trz1!-Ao;$H6yJ|B769LMrvAMrsDPS>0NuDbLIhqdh>o=`@Wf<0&~vU +zYwf+(+H0@fDhO?Y{gTXl#m86m;^+?`7{?58SG9&2nm!1hB&p4azkKp6cL0cNzXtf +z?Lq-VT!!H2G3V5o;Vc^tP>S!@vb!o>r^Ei=F65r5MwMUpZgTb+4{7YxoSr85@C1XW^uf;*7} +ztIfs~Fb-TPe5|m=`8d>{!C(-+N?WkPFm!___$Y&UmPTrvvS4Y;Ft6mG6oyGzo*Ii% +zfw2Us5)@I0MzTbednql=;?uhYSi;J>-%PaX9qj-jP8`GidC)H(lY6y_U^lCfhVWJq +z-pVSR%@FW>JnrCt8(5dXUoJg!^1L}qskn@%3=BYoA%G{udm4b7t<1#M^U`IA$W;A$WU@ +zi8t-SRuxEyWjSFnj`rfDZLfU(dp_*f5gaIcwlfK%BIIt +z942LeMw$x2ZfUb8%ik9i1>T1B62ZEOHCW2)Fq9W7{4^2dx+qR8!?{tnpc|KWqI^W& +zX3(zLY9QE~vrbm-d734@fM%Hj3+RKw$r0#ld|Jyw-4v;WNes5rwl{`SFs&(}V_H=W +z=H=014wm9ZBs>O@9%1(I&!8R7EfT1i_leP*I>1fpNt6b)B^Qh)2)P)pbO~*W5yrn; +z(T4df<*-}9Hq4Bj=iyN}fmn?jX`Bz{Ekp|3!A?A%Cpest7{SjQ7#QwA=sXbWKs27_ +z2p8Ja)Mfg_7RmgPbxk0-pb8lCgAOUpjmX##hFWxNQ4A;Dn|!+qP*u+4{}a$E!BySS +zLISG>OL<%s28jq192p%P6&)Jh3Re|SRlfV)99q2vvU;}xtACPDyZEnbc7De^Zh`-X +z1-IG%AtJ)J|Jxt)@!`Kd{MU#7{x9Ia0<1zHU;c{^_x0hvKHS%b``#6}uWt?bpC1AC +z0DxTs2d3?9@W3E2hBx>j-nEjsyn3)x|E~bG}Mfe~C +z*8)+D?U03EWMNeR6+nJ-tI>sJS>CV&FH%RW)o3rJY0D6C6q$Y^EAZXp;jhkz~zFO@50B^(5gff`D$%0#2#FQ*{& +z-asX>8_mc-Trw(fLZATNsNC`2c6cIxH`Fu}`W8G6{24tAsGv6_1NpPU!a8@F#4vB! +zkegQ@Q7oqx7p52%D3!pEU;>j#y)=cxvf63PEg7m36etSG)QYy0dDOUF%D=lwA>LGy +zdJ~oKXkjWIN@_jK^|mrW}rQt@MIHI8RY0QCoS)~_Uu_ME63LD +zik<~$3l-q6wSA+;NRFmAIQyJ)nW>S6AR3VssdmOj7Wq0TagosX3K$DMm_vL!<8TmL +zXf4HgFgCELu*h?81GY){dD1VDSWVJrEOM}p){YU~7B4d9>!5NrhGv5Z{doQx$@qm6 +zpQ53;b3{VKc;NALK3p_S*4MgWw_YUV%&TEN@ZQoxKD5@Vvwa$?j<$g!6|~L4QYOaC>I=(Y7_%6h>`(#^ +ziHd2YwVItTB%x#n!&0o(#J@6yEdiTK8$Gl$r{`lXltylGj`!wkq;JuCT_8Pfsh-b$ +z@D24|a|x0g9Fz?d@f2R5?qnrF+Cqi``&VQ8m!KrD87p{pRu5w#Uac%aiIjygS&`NO +zm6sqft^i|!p39hB$pD5Wz>1C0IT$ZF7z1(Eg%s3ZW3?9oQ^GS5A}VGg@B_a^TP>t| +z$FoEn)DhBeY-wVh5+EE9L2vndr!@<~Zo{ci%>=W@RShP5GWpT@L;}<7DgaQKteg-!xk)c6c +zO1hBJA%8qh4wHz%Sn*3d2^7mh8zt>oEY2@_S3UA~jmyJ$dGlTp_nZ=|sf2OPUESqP +z!6aSJkVODR_@y1M{lG{;PzOfI6hKo=_>Gi6oy{*UNvI>a3k@T;ai0L&Qz+$X&{Kj^ +zUF_XW2p9!%69P^lyjIEiOp-Li8=u+CUgR&~LuuM9cANAuCcBkvmKLB?1!Ssa83Ec9 +znKCVNl$Xw|cfljrZ4M~Gqa6FFE9?T}yQwqBb#tEu +zNyBi&$)|Y1T=Wi>^_ZArS6k%aZ(PmA790{d(m9(?&W5o31ho+hsnfh%k? +z1c9G1QFe+W#4&NI>;HT9&4sAB&Tn?6-lC#IMnp^RDE0QId#l0sx!q5@`9Jpw=NddFM;Pv;Q11G +zz69RClE4$jzgB4$&#koXENz$0#n&z*fgio`>RTI4J5xi^V#W@0Hw#SVVNy&R@KhS< +ztoA}g>0xL!GkSuy;3c=TP0zsmuE=47o_Mo1Ob*2##QJ~Bz(iR94H`Q#bED@5tpJ^uRx5o2pVT~ +z*z~jzf3ZOZ+Q?WKOo%sC6+DD8$y3C#geC`y6?VLD0TB>OYRX|?jLt-pg8;qqEU-8T +zGofHmL6I=NB&*Xo1k@#De5^HN!H0N*z;sXs8LT*JAku`Zw~Mp#c!!$1M%sZ-=Rh!~ +zA}mE4p3D=WBNLf^bM{= +z5j)(Bvq)!U3nfn68Yd7~(u1+kCAb|yU_2~sGKql#acxGA+DW)RZsiv! +z@FHUImC{1cpGQj=R%~?GEWnZ`WuP~(R*CaGF}Q*sH(E{5lX26)%NvN3W1~H+mD0hy +zpiKwhy$!>1b>WoD-(m|PvcztmlN+#SEMj~~Xq64u0wPX}ow$9gjj(OqT9^HZwJCCx +zsY=r3$TV`K$V6(5DqE2#PegvQO!)36K{*O-iYiNs;0cXPsU3qBsS3OQU;C==4N5*5m16c6Q;DlJM^WGJ*iRI5UmAx}yn&&0$s)Cj8bxx77Nw}t6XkF*UJg|wo7NFt(5i%V +znIc1i5@i{(WH~9N0xB9YevGRg%1M#qOPHSw{v~J?DkW}5f=a2?z*h-0Q=@ej%~52^ +zB}k@GWMYXVX;c{!F_tHkP!S?fPATW8U|Ay%mB1tTdse30Nf0H3j_#PpE%4t+X?W}Neoa#N<2Ul0` +zX}WK1v}Jj~;8!}m?4LU?W20z8LJuU_Z*9Jse8uQLWOL*f)4wjbc70(({pM54*yjqK +z+FK*(>HWm0ZWmfw?iVfp=%bObv4@JZmoHzgtENOR0n!3?^@TI!{ +zIrQdZJ-+yMrK;(dUw&z7s$9DCuiD`Q=T_D9m(80vVRUqeU)^!h{dF&;{_T_FqpEdp +zWZv`Lo;@c|oTz#G?Zl)cAR`)Ov)PJ^&s8VSHJMC0oi0qiyo3}3i$<3?qAdb(1%`uj7>moI;{U!-nH_f^`m#vQYM-rFxV?Stv@Gg~$-)&=bRp!96q^ViESH6PXv4-X1j +zS6gd2`uE8P9x*>6?efIJoyU(;B2gd7=;f31Mvsn)i)%i6w!!$mV#xgWcE``V^2?Yb +z1yv)@{M;|H+peQk#XqTS6Sv&>Zs{3A^Zm!KU%x(c=FIi$*E389nKU@Kd&h07R}UA7 +zqWaHC^n18}|FH8c>NG#)?fV|+lO8Y`dRy3=DMPkQym;n#-HaR8FKtb$(Of7NcU-V) +z)&7{0L&0OOh(uwLv-Z?}w1G~Wqg@@=-`2ck`OKM}MI!%RJ9lk0naz{S%MTnl(4%Kh +zP|&XvVyhZTi;H((dtzZ~Omy@c=|f-KCVlc@ihLF~O+NP!^L&(D?W=)>ls8IZ6 +z$(z%D+UmGoo>6eB(9&!j*6X7Tb9P5m@nuC#`CoBPb#o>mcf +zpD5pCdiR}oPF_BLDz)aDg9l^c;-33{byjU{?Y?)|p>qe0+`^ukGYaL0ERKkX$h>jo +zr|Rc_Jh}0WK4$j)uXpb@p4OCB-q6K%x^(GMRZMB1pP%2bVKYae&rkeT5j5_~l`G@V +zX!G*&9FB`$RmOyy;}aAL#ZyncmRhr6)26wvydv(>Wf}t0no@6selz$XUEdCM09in$ +zztXCPAb0b?Vx+K-$-~d1>A8!ewU$=MrJqglB4-1_}taW}e#uIaVtMQNw0UGA^0tqlwd)7EIh;b(TX +zczXP#Nt1GO4<^qY*tz4>*|TTw+O=!NiWO(hj9;ZqeM{Y;Lx&aB)s8v4&cCo?h4Osb +zAkmaLb9SFJJ~e7eY9}+>!j~yuPKf?)c;cGj!zmd>U(E795>#5;Nyb_Cw;jn;MG@O?InIJDr(ro7$DCN#mdWuNgCTTLyl8I{VQ_cYU66iT*P7haX~BX`kq6D|q(V +z3(vh4XEMDUI!K46z>srf>+@BqHH%(zuZ)O+&D1a{?H0RaJfYoEDVZ+))u=bx_v{i#!@?%TKT(@zuozBK5` +z=dNA5%ubI#-rPK}XV1pw<~c*-7p7KL?45WrJu5G7NoviG;pdLS6SwsD +z&u&UQ9%sLPYG|*VX9b_%ZClpXV(jmKc+H|&33rPdZoWE}o14EOl=iefD3_`!Op6`f +zXR}jW7t%q%m(HFQR9xT2zt|G=>#xP&pwkwlAAF=_ue|nN)t&k-T`%6w&9WRDr$Hjc +zOgiiTz@@dd{J=y{*1?2%9(~J~`h=x<#AGOj2}obkuK%~Mh0JF4EEf%u}4FZOGV!1wo?9_*L@Eeba5RS0odvU +z@f$Zj|5WAX%H~r?k2>gvKh9oRnxC(6=5xrW;~Q^ViJO;f7=M22fWz)NM_uM@*bqI^ +zuqNtD?Zp<4dnKt#@z=8WUMXvWXFTe4t)l+&<;!JdWg0^!tfp)N+-Kalj|~k!X=&|> +zhjNh$&>-1=JVCvMvBWa#nbhYFI@0E;VvAf-F3Mdxm${` +zD$FO}Jzrcn=vM8j{>z#~nGwZCiQzU%EjL0QPYQZFFv@+JUSD->$ELa*$DHUjfn9do +z^7b}a>bI3~rt$sD+ct-c$H1Tab)W7urZ;aJd$R0eewy2vLG~-M9-Q#t7y1@G$ags) +z3Tdui_x$;uriE9ZT}t)u+WLOakw_1|>1Z30Uux6W+KWevUMIPqh_bibkK! +zv)#Ky=H{vnQ;twnEG$cD3tnmI)TRb9HTTW1&FF4&vYSXOe);0XP4BbCNppHAEBj_E +zSr>#4b@)_U&VRa-aprBqgX9BN)v1dPRn#wH=q_(*y7bDo-@X}X$wRF*saj5N-gNIt +zE;+T3TQFWjT_ZRnq|K^FkJz-+u8fZZ4!Y_OnYg0y?W5!!J9gZ==Qe88s3Bo<+}+O! +ztDIMYHFE=qBW#HHj^CF-l>j|W{7SuC?!}KeI4j|l7r(KwVr?X2)Aq$>7uya*PE%UB +zcbrOaP>^5L+9}b)h7M&uyRyN;)<(1We0f>(vyGXL9IXbu5+(KQfB(e1b$)%uk3RG; +zc|>jV(kCfZfYU5If3A0!gSo%Xz<~(~37f;h9Ey5IF41?1ExdB&3Poj>z7`;?CMO^l +zy7q9&{!%$G=p|d5Mhn`oVIPxeH8XTXc%A?K#)|s%D_8C$ojXleUR0%V%cA@Z#37cJcXKxGv$5Gbv1P`p +zXveEMlMamGb{nPXc#fB6KRa%K+7w4em6))s=Y?h6)=<)Y3w4c*j1IYieKj2t*28+o +zlzC2l4+3eMl;q#i)X=0HP%)*VDyDz_!Y{gl%G^OZIz5Dp0C8&4$#;BS>$OiyJW5ZW +zGGZ3$zTj=kc}883u6d@X&E9U8jVA!?F@Ju^!-tN;`V7_8-A(iK^Y>r=_Tibjy1K^3 +zCDHtCVYj<>y;xmiUp(KZtC7)skJ2H#cJ}M~;)U4>k6>1bt&dM>Wo4P^oSX4$0`%0@ +z9^A5J+LS5R>*@mL&6~G$=@+0c0FJ^kdG!16X&*0$>z*=u?w&{@jhfT6*9&0YVIzc& +z!?J9YW~>}%X7*)L+wA6-dkppt`-wYpu(tNyyLVgbHcqm0aPSw+Ir>_||8=d-q-7rs +z^fsGDK3JGDC8Fed=m4!Fwqccx_3uy8M(f2GpNw+V-*x23kqgT|)4Z}5c!}N +z&w2DHBO_y;7m3;p(9*@WC+~~F$$rPnLMS|zc%^ce7i~`QgKG1Gk!y`xWjSQC4|F_{?V8Gt#8ihiiRRx8^)ko4Y=?4{1>9 +zowH|$d|Y;0c*(1E7AO8bYxd5k*SAf{p)jttFYwuk=+8s9m^k{Oe2m +zv$D>Wrp@4o`9}NOiCXb7^p$v +z)%qahr^9M(&0n5gUEgK&TxVzJXP-?%zI?piX*mB$*4z*0&z?P%qP1=_ +zS=Y*nSzq5j=-rB%oi5KsC5irkq)(p~mS-=Y@MN{>Bd@bp^8yC+=&><8JUlZ0Oz+A5 +zqY_WvFD(4@s?aU3c3lsh{B0x>$u;3#`HBy3zt$#=<*3|y)or|G>GJ@JT8>j(X2R6D +zt_7>U2s~M=7MuSqHivx0kw@23RzH8v(9zMca~K#MJ@itRgYL}5J`ccuT}X@g +zF7d98gElgq;xa;Aeebtvt2pBNMX+I>*Zi#Q{soN*=z)IULu1Uq3%7+4vkD0iA9=FMy;mkA{ +zMv9xInqxdj>E=sK#@@DTdv}8ODB+F+2M+Z8SY5d}GF){vWs#4=;i407-#Y4@H=n$- +z1%MeqNx5b}o13WsW##G9MP>$+K2=w~>Ta}sFn6odus@70t~hKo*HJ~-0w|uO+~wA- +zotYXZ0IVLvoxgu~W&c5cq$Cfm2sk*um&^2<)o(&qHJ@pCoZ%Ond$hpYYh=V2bMv_P +zc<1HY^DI`|MfI%RGI8S8{E5?mN<`UfMp<3p8m~8(89VtX$;5Q1`e3JX$zL}Zs;c+6 +z>wEvqnFHXzkY;8sIDKPzS(77;O$Ltts;R6*G8WF!*%x(tQSR=RE|n`9=`S|-WtZHY +zlSB`9yjwnr7OtOK`aqP~@bdP+@bF_RMv+LXudlE@#y6$7VNF3dpu;*1>th$K6&$?0e}8hF +zf9T{(OP3d!nhw2lz|;TU7IpRePoAh)8LQ<0-O3_DS#$p60Qh5kcvOhC`qtkVWm%hp +zo^t|Kl(qL%UwN6?U3pwnq2<=yG@C80Mb1?!z@kXKge9)=HsMx +zadT_G4eOOZow6Zmk=bpndjYJR9{*0y(nL3|XxrXjV@F484;VnQE-0LN!*$Ig@+Y8& +zJfWBlQ;a{)Kt#gSO4xEPj6>J(K@xo +zUFsUdDrAA5ujXEzh{yqZvwVE`1-pQH>Jsy5|Acv8o+^cuuzx>ws`t9nr%vUV1-?0w +zl(gj0cB^^bhzpMzJ7{Eaeq4N@LA+`1h?uL7N~=H3J5uZ=3{HD6CoejhtD!x2jfvIyAj8q+W6cw- +z#~B;fJ-M*FrlzK;Bz*TrQHYn<6#r3YYh7p$Sf6=rcQZpSdJ3021K@Fe6p;81VJD|g +z&l*=_JjT@Yd2HC>6ngw2F*tdCXMwleu~=3QnrVh*eFnFD +zxVE#VW@!1Uug9~p<{VnxrHgj?awE|-GM_}cvp?ZUc63kDWM(Wy|5f^!AtnRM@1Au? +z7OGmmxxJ^F_jpNRnW5g!dL^ap{`ZxS9R2#NKD}_}z=)<~k8?R2r(JAHoKD@HmzDGE +z#jTXw+y|O{Lu#K`<&}-AB$KS1hHLc^Frqe0a_^$j)5F#6V@Ukq#q2fo#*eQPfmBFK +z3mG>XaKEh9Oc&m}(qX?pS?1|sc{;G7yeD}~#`(6QgRJuG=AjO&0!cR(7kOnhT0OVk +zJ6+FG@WRp0FLBMjfoCQG!mAHy@qgdcFlTY=@SO&Q)wle5tLUX(T$;7!$dN5R`6r{t +zyKUcgYf?)}-NQ3Sr|a2&h=|NS^{&i++O+ecCXvNHtCgP@i`)Qlur{hk{NbH=>LTsy +z``cPwTfVO8I@NdkFV%0}Ox9E*o0wU~M4TT+AFwdPk?L7X%h1G6`AI$xmi|($dd3zJ6 +z$d4YS&Tfd=WAvFyeY|yCb7JwEz9XDZKYE*zV%GKY*1oF&XuJK=!szDSDITQ(zOQb5 +zNl50YySuM{^JegxH8+#KCX)L<1@?zofVpNH=okd(rK}U1q(cnTsz+HwCMHS +zrlw^dyQ-_K^+*eCYpk$LuIe?Uudi9s{{3kHE#*C|Sv7X-*jOhWXmid-fQERF!O +zWZJay@{5xePu%~DzmoOS9F3v3|2Wswr0czRrEA; +zXjXxT8MF%vOCD+lzunYWp~L)`U@&O%3HS1>rOBzO;-dH&n+_YHF&B(gF_w2azBx`AXQ^T4{ +ze(yK4FB+5Ioy+IsvrwfnmI`yTv(mIenxUG+1Tr;Rr{Rr4%IUHEvW@qqiPs&DVP +z#S|yC^h#GdtCDQeeUsf`ut`0Xm4}TO!R&L$DUQePy*r}e-hK7^4>VHK!ajc5{@TO2 +z@8)r1$1WeUub=kYEZ@SlHyuB(COPb?4BGVNO?7ooRcm(#yL?WsD}6Svx6>V%ez$1) +zE+=1+o1T`_ky#PfXPZS%KYdQmc)%F5s0gKNeRr~XylioGzn!-pr?C4jOIEe3yiN6; +z*wxyVPN%ck277LMW(bC#OZB6ji=_{sjT|{>(Aj3c+h+6U&mTE*t@T+o{%Q+i0Hg4P){Py9R +zXN!_FdTLyWI+foy94yuI=g%`UE%bIq{{H*(moLqGs3r#l=T_85MMVKEyizYMbm{vS +zQ$s>Rrc9Z#XwlRC!>?a4eERbCp0FWSZ(h9$5D3UUdsYZCy1#pIU3-Jg=;DyA3uq(y +zY!(*OOlK`T-ZeBd6daqMfBtz=ft>O}1R93!UGC?=|RaI4gEv*+-RX!!x4c&8xDou|~ +zO>KCVv(eVpR#SOq!o6L)b|vgqCvWHycB3L7Ju=!{*_v@?F126S_U-B#8b!Wlv^_~J +zX|b`kC)~l>-r4!`W|rf6=M^jA&r88lFE6iKNd>>D?3ycA?O#m!1^1FBO=JkXNu +zbi*%PxDXK$am~klQ}g_8br(a&M++`6^l;B;^CaHy!J9rSC#C?=IYDGUS7ZyrLU|$* +zWh$5M!=m`Gc(4*18WHE<{42%5moF4y73lQ6SwUz^GV)PqfsLTxL&6 +zkq&D+7fZ@iI79}_AIGB1UW)!ABqW&PAt^eAaF_vrAM=F;atQ!ZBc#SWx=IOJ9-g +z;gGR6WeSMXF%%`>(wDJ#ul%6L&{LWE?Mo`B48P$ +zd^rZ<0Oq5^((Z)hp^5|xogi4KWIl2YRlXj&Onby^qzc3gvz?fMiP>bIq8SI#`tG1j +zN&Z;4UEpkj!@-jrXsV)#$cZJUL@ZJ9Y_IsJ1!%Hax&Wn}cBkXpnPY{2A!{s!kTq6e +z>N5$vL6e_JA&%UwWy#RmWs~Eh=?le3!Y@BDhD@*`ZbB>rrY%K}=S>&-T9OF`-q4R& +z#F}qRaDpWh;P@hK!_rsaY|D`?S)WJ;G`!#ug(X8DG$!`k03U#Cf9Mdi}& +zZKZ!8`~k^GiKnjQQ{XhQ0!1*p8DFkuom}5!q;7{q|came0k0y!(XGGy$UC;rdileB>$ecFXNCw1tFE+&PF@pn(bP300 +zh}{szMuDDtM5HM?^RloU6{H0XA1ZFPYusV4!fh(6EUs$+tn1&>R*QDu#zAhtJWw4 +zBrQOB1U6_y24T|%XP-yR14#CU$rgD?-b`5Jk0qi5mMtWZh)|kB7MI;{Meqfo!BEKM2W6pTk%;|)^*}0_g7f4H +zlS4|j52(LOv6` +z!nH?I+qYZzZ>=*~;X(r%01{y_EkMjP1SgWl5E!izfOZ4nf`e}%%Z(+vCY%T&3&f2H +z@MDDrg^q+jR`n7JF(!&e=?nk|=qM*cWVJ#WCDAd+GL;6}S^Q`~V-Udm?vU>x)h8i(z797srM@m6$FQVO?6Izkwf4EW=MYZu;AT(6fLtj@Nb~B +z^9W@Zd2EgZOTf+*$#f$bBu+(S6C17F2=@zYu@JYR!l6+h{zlXT&?EU9J3?3+SY0<}gmaw>>un~E!9?Y=9wh7_4K1j-n?aAX+; +zL!xL(UhLRB%t8i=Ap+8ct{$0+=wU1Q~WDe_JB*O +zbHIh-L*@lFS^`6YG7{D)=AucL+fgFU#2{oxTZUkSh(d7G$%pI`qYFjaDd5N~)KUfb +z1)aTwFG*DlGykCVsxiwJfEXCUqu`DSzBhxZ3%?;?VN=EWrN|Wd?Q9Ire5_IlWGRsQ +zf~n)hYAKQ_lBIJ3a|gTtsaL}BLA4xXJd;10qjsCG-If@^!23W`{T +zaXphpc1DN<^vx$`VVB5I0Q`kAY7u(ih-Xo*W&&BdPw3#jebN=>I9FtBfow!-$;bJ~ +zuZW061*ue-6F>_f%9|lLQ7nNv(JBekfajSAdT{F$TI-?XxnUrdxEpwzWPM0(FtI&q +z=!fFO0KpSDX;HsLyI_GRRulr^>KhPgRD>7?CF8}dK+>f`nT0Gzg4(x?m5;TA** +zOEakxaVr(&Re+4xLR^W0Pq0@IJ1(GFTmhkxQEf3$jEn=yGcZQt5UB{?Hbj(3A;hNm +z3Svl?$PQ3xkJc~XljX!d?v_<}1Y`^#eqbFX{Fks37T>)Sumy@fv{TU#DnlO7P~oRb +z*dbrDi8EvbFjNU=7c017ZAUB;e?H-rgLFmf*L0K)35Q#t|- +z2rnQya!?t>!n`+@lD1{hSUdS|H`|%O;xHH?_ZB?=f*?t)7jX1g?VEQZG>=%Fxwyj2 +zm)iB?9JEC_n(Rc8@4ihQSf`6ffqh0wF`Btz(Dl#oe +z@daJp0Rvs0Qpih3lm0&e~HwuO!i+1P|v;(lOjFN{P +zE*Vdjlyeb~7S69wD-0?Cr1gjXmb`*3cPy~rr+-FbwOa~lGk;QW@udO_Is;iSZ7AXo +z1B_0AoZ`#LDGH)kv>Ohc&GV*9qzQyVBKkir(ul7u2HXjz%KWy(LN|fW1zL8;yMTP$ +z**4fOW{JdbAAqvQ6DlxXAPOGh&_Qe!IE|p}pP*#`OvYrxnpaY0#g#hq+eg?zL`nF% +z)Cta&9}2;z{V!n&Ns|CVK`&|hRp7}vZJ`Z9z(TYQa6X`sk6`X0s29>{dDFjROHp5N +z$CQPAt`8&dkY+pEUDUTs!Rbo!J^bV$4gv^}I#^mh<-5Gi;9&Uj#X-oT;KfX-a9QBW +zVce0+5=a-?8wy|_=+K3P$N_{XwLxNH^*feJz~^unbf$lY>xIA285P*Egp29Reo(=G +z1{DZdB05;yPWYS5Tlx$>pTnZ_I@xDyz{in+db5Od^mnx2t}bkfg7x^_n@rqX;?e#G +zHko3t;M@@VP}nqRjzQ-D^njTwz(O&Ra-ZM}y2wO{^F+;ZunEGDBz<%=G|Vr|WijbI +zHnfIFq%vWf`6wwX#H9btCsr{Im1T?w2F0L)zpZAFS%mk$8Lj${;aIWY +z8!%QZ_%kRLAqaHw|4n-b+Jj?P&7Ihx#5sLFKSKsDN`I$<}#3 +zomx1ss^*Zf1_*HAzJ$%?OXNM&wIwJ)Zn0|gg1co2irc%WrMkyq(dy@}QBX;OQYwZeYo`t!zQGctK3I9XsJ +zHAZ;L#dss<8#|J^JYCu22~VbEP*QFR9dQ!E!N(7033}&=C7fA+X#4sBbZ@EW+yEu5 +z4o5)$`y-%p7SrWNA=@h|jU<1`8tza(b|*>1##5acu=RGG;Rw9jiKSwLe#7$wWlHHn#R6R1x>94fBq9KX(lRzaNV2VsIOXqT*$>+d7gdK@~ +zA0Py=S2{yKGS*%EvH(;(B=n2KOmf6Ly70RO2JgRiGBD(ozcDb3L=+DUgZF5`3d}h~ +zK%pH3wJF56@LeLt#q|JdjuiWQqp>|G2Scu+3MmXp(Q`HoB0w*Au)PtsENB;tPL+m7 +zxZ>_->`n;c$Aghrh}t0E4IS`h_%~ZpOQsXt{1;tf9#ohH0(-_6h&(+zg^Y2NJ-3!+`QP-iyUxUR +z-8tFj_FMDqR$eO+$`LQ~K`hD7@#TLbZgj|hrzmO%26 +z)Z2-DtV=joNH+$5#uwJvrJ#S#uceR?w&QjHEeZI+opQQwPfDT57LEAt(BLa$u$48` +z@(7w6jNV{~h0M;)BkjF~uz$>B_^-1?)Mt$PasL0|j9AE-0{HM(xFSW~ef@86#UJGN +zKSh3koB+TCts&u^*oo=ndK4fDxllzjnlTmpGa78ZIn5aKM}}dR$ibsgtkH1%_TNG@ +zAQ2l034ve6NDjJd;nBe(n>(~E)4@lwfte_L6OwK0Y#{QU>g){AKD>GaZ$HUIE5aee +zSA^I#92EUyfKSp8wf#L*GVWG@W^sw#4Sk5akmQ4EWZVxDA=utYz*Q7bt-!(w4+U=J +z{MVTxrYOmBMa(oz=t05@Ie&!}{OWNnPreWy<-fKP-v7-X#rfaFLZg4M518d` +zthspy`QMNqx%_WtW6X?66!U*@3?2UbAJ6~R;r`2{lKFdmbW;D(WVDI={*N_<`~M^V +z-@pI!pO^p74v)CS6@?(SXemlZpF+~))VSY1183C^9N)q^eYe_rJ +z-G}`3SM&8DuJ*s2t`Gg|Pp0UD7p4UiUpmkGPxSr|X6Lh)KKok<`mjeolJk9Mwn}>p +zP!Y82@5;!>hnZ{ssYHC}ZG->oiTH%XUHj`9_*CUC(PA5nnu(;_jT?#_;dN*>ywX6y +zUZwCCBjOGSLN*gRPVfg<#v&TodNJZ-@}-NY;Cp=VnLzSop)X7{1OB1FXi))+4paQ_ +z2${#&Fk%~=A1}%6N&E?NX$VRvq&L*i0{f<85hCP3F$;8$+LOR6O{KF$#_A=;L-K6! +zp@VsvPVC^$CRkG_l<=qp`77@@ee1#(v562k7X@V+*v(IP6;&Xj=*xXq-@pL*Hp-Xa +zioly&6x6y8(-INBN;LmtV=xr4gd$zE4H)SHIu#2jNSq28x@)aq%Xn0!uH7sbSBjgp +z&2)Q80E-Xjh`ogOKzP~10~}A=S@za$_A+15M@}tVQwqGG2Z5r#xv>EidCUUPg+qJ{ +zo*IxnJ(2Ozy}hC1j};7KM&JSo$uL|FbiW+DwjA3hCqBH;L>E$QVa&f!mx?xOrRxVi +zn9M{T(qKLqDrF^=@I4@t`792_iBAWc#Fc)Hi#(_Kq0c8X>Hm+tD}isS%K8z}4-ZnU&eN!zqdm!u|XfvG@~=B0V?nuNTBQfU*<-?SIZa$L0n9{}w60 +z(PAh%6%arv34CK12^HykuR;!sK3a)fh;|^CnRc^SxVSx`i1-e-%2);GY!c2z3{wz3 +zBc#w1Zb<0>w3_IOKE(~LJU2a9?8vM +zqbbHp$gy(#4CtTW@QD%`*nx_|8u19e>aqLXph(JKw^1{ +zP|`#B%N$YOwHfY!PQibPeh3pOnfh=m#b(oRbeXbp?L@a2hJ~yPLt36)$UT@^TAe^b +zO3KDqEm-%-C}vgiLjWG5G4H`C#K%wENmx8$S&XM}e9Z&v60)U%a2pUhij^y9M-k(-3S$R}fap^jt{`e6#Hpk`Oc_5+ +z_{x+k@W4l`D?p*tPLb6P{D6=u6med`9f>eBR4~~6S#3X@@y8FO<;*|PqWLFkFp7#y +zh>5}felzn=(E9TS`?QMxOE;poS;kH9e^pFObRhm86&)GG|9^{55dRP2|Nq@AKS4`C +z&=L@|1OzPse*#NDt7&=!s5l@^4?miURscW4LC_TNJ2D0MTLSpCGY8{{(&Ov^KIcsF +zsq0)bqrz3;QKGm}0p8C=;eU7)J<8uD^A^>cckm>rKVHPxomM~*xcxlmdhd$?fp}L< +zHF?17i}hrqg;UAmY|tGWJrVqZodT3V +z`@EzT7P#;9ItWynLyx0SE<`G3DM#oH$#8))AqXwPgD!+z7u;^8uW3cJgJL~?ck*0T +zk~~*Dp92k&KG2HCI>Pl%T=Vd_Q3R()NU7wCjiDyeQi$JaL$26pv}bG>9VO5+dUh +zqGJOv&7ed3ullr#|M|9gw_V0f@W1FtRUrO1Xi#)8|Mze53F3c2{4a?A-3b2^HsJ*F +zyJ@QFAnq5${erk(5cj(++%M=1{6|LsePcg4GA@q)VmdB<1_pOvKGT9E_crkkf|(D( +zSs}=vP5f~v2W(N{4auyCpApke5!E9(4pV%7uv}tol3tM0*X#0YbFdg}VI{GA#C>d{ +zz#5>d;r+VIZVT-J7iE7hAOD99f&(S*JP6)UW^msLvy_E_8zJvOW;3&P0;C1(m?ccI +zxhcw*^BAh?C1C^b3V{U|+8bp&<^(J^vtp{_mQo-Ivo1U<%)Eipn&87v!lRJFhx@2P +zp^^YFnJ1WOh9C)W*XN7vo1m?d30ji83cR2!v*lcll6dGIiYE^<3T +zDo9-fu~FsxBo*pMTZ%B>h&WL6waKp?h_r)ezc1>AoCA1N{!QT!nOiHbg;Mk>S`-i2 +z%KWJMBhdemRzwBJAoJE_K#1@uQ^~H313a_v-!VubWwyT2a)l7moGbm&LWjf}(_9|3G9fTkqdpxFUlhQiypLSz6W76!fp$!|2TMZif2lI%9z +zWq0{c7SiOm$b~l!;RtDMsLbglK83{7`PQ@QT4;wE4{0oyv^JUlMrg;9F~LAF6zpZ9 +zlybAkQ$GGPXn-(+IBfxq=gb*qk2s{sg_`rVZfVRCSMMa6wXlNcMlE}cke)RP%mWa1 +z8AKq3fJ@B~_mIPXIk$6z6Ov~*k(P3MSu;bIutoMVJb5^*ZZR}X3J<%H&S!FpDQ{Vn +z4goq?Cu2rjVm;n^?gbT_?D8WfmYHWdCT=vB8}B+ +zhD=D0LwqSoJT{Y^HWx!^G?Ec54GY|fM_0B8>x#op(q>uZsb&YwIFZTAK*~!}K3*r5 +zf%|R|MDb(^5j~t4skvnV;8EEeF3$m0l;Cj3c1Z?+(^^vG`XaTDZ1S8EsdDsPMXh& +zB<`k#rAL}z3F5;G5(&7tK}NDop&7gkgh#@3`Y>azIw#DOq1I&?hqchniu^Y1;c~nW +z=1e;b_wKEF5n4-zq%KbAd5FzB>s&-vq+bN&F~T!Jp#K~ql9loK@N +z1Wh@APE(HHaUiS{{G;jodIJvZ%SEEX_PZ4eM1q|52*@3rI43im1@DWIxyWp#O6Vf8 +z83sQ^%3Va`J($bu#+nbt8xJyDSSRE4P)r$@n}_ufw8eMK+3hUD^Ex@R?MCUkyf6lQ +zoN--Uc=2Py6Qi5r)>NRo;evGnvQg7Ec+1STh+yDdx`PXdBCL(r2rFfy9W?P{=2TOU +zA3_{ZOH@i|a=2XUVG+M8;IM)K5U9m6iydB4nDAmmu}hdR(sQ|F)DklfU_&&A9k{#} +z{0_1@VcI9$ye%YAK8~VXh$arKt}-|5xH*W6AzNhL&z3aHLNU(La6iKg>!RJX#}}Q4 +zv;`^*k$L0-m`qf}<0OH6_%?xF5NwbWKS-Y!Ibj*zb>qon0y#17#9|wV-{q?1bYSh^ +zLlqE^iZ2Y&9C&S&7Ndld`wnuQkB&i3=|gs9vK9bL%l~Y?*@gM#a?=oMM`Q@FA2&@7 +zZo#EQA8A6=jrbKAs3Wj2!2ey!DPbwf1u%kIi#Vj8XE6t~-Ihp^hccJ6h7c2!k%IY^ +zwt<2KEibl#)mp)B(@>Uddr)~=KQ +zyGq289t=z;#^nfbt)>`84jK1I1{}ZIaRz9Qkj0B<5jl}iYUiy%VoPXNZu7bwxJb?s +z9nuXtNr_{5t2aE(Ir~G?@F;I3gPbo0iX>b{U4vkKB}@K}LO=X}H>;L0TiqHR$uTshU(2qBi31Axbn{ +zYs%2)nGk-$pw^j2B7GWC>qeq1tu9rGG$V2i8lw^E4RUQxZnjo~uW5BD*?Fm2T{=p} +z@9Fd=l&#ItnlMq59zlUTDXqo`#Bwx-lnne;ovh8)nno(+XKt{thPjH@0Ro}qzD +zP@Wq9OEGEnI%r3VUS~4kuS(oZgGqdKxYnpqBDFzl1dgN`^f^j7@DsnGCq(djIt@n! +zc#Zr-f**nJc}9&$5T$C=*_alVkIqkiw*pZA5`6l1ACp89l7t}BQq=Gl#3T7nfz!cg +zB)|02I{qsnNVi?aP4M41RqXZt|FN+_{P(x`%*fTH-zR?vddhv;j8p^uJsJMDYlDAg +zKXHDEOxA0aHdSq!xUZ?I>^0HRW-Ys?pl-JSQggzg?7&?3g+f)kgZSYjFfww&6m?J +z*%bXY#eF*Mi{dL+7c}hHbYdy{RPke54xgT^YJcb2bv@&=9yv0mYIvJwRCe2`jW(U*EiW^Xk=ED^2)KcGDBxX4YPuS%38FZ@!ta)$-7b +zwv+P~^*wHqsoD=WnZ7%5;;WOM`={SIrLdr&ASWj$JA3;J4?H@owtPH)TV~{^#od|G=yLJAeAs3VqX$KmOR%RJCNu-%JC0&#A8M +zsh<1f#1RQmA@xUPch^6c`S%Zx4y&=eV!Y$)UAvASJ68Mp>#1pJn2cm7E6rg;}d5)-6gAEw_w2oRl0vRp80Cq@PP|9Y}la7&d%29R(*47*|KFX_K34A +z?zGZW*7)(vA9nZ1%z9^9@{IGF7B3!EKIHO_xMvNFKNG7n%>62F6B2tgWka9R5eezK2R4Qni0{!M3AE%`#ax<%ne! +zqeqO0PfBV&eY(N+wzl8Aw{|Aaz4YVAL&eoYPyNs%uH*K@)#Ja +zyqeK(^OHZHI$A&d+SLnNvT6?BzU%7H`;)DZ{Ph678V&Z1*s(Wuel{MS6DyFBq +zdGoRvGwzYe6kWG%-@=rXRFs$R+qbWCmo8X9|C%_Yx}kLZ_?=fCU625jKx@C5n2_*F +z_JC(UP(AjbnSAEYpTB0!nx>{EYt)0sW>!=*YPEk^{OZ*2w|K9X=MB3Q0{DAp`-#+}x64RTb +zD?a_(m%DRE?77(dPMq^lx$*FkS=Y{1Uz=5Oa!dKepFW&+@6e$`yUM3EoWOcH^||Nf +zeQNE|WARTvx!XK*q_HtN_T7wruP#~gV{>!2nOn0e!|#$6GR&KAym9>E*%O(yU+&+Z +zn3VL?H>>jM>gx8q!48pDH89T)K2=>?zae(WAZIpFgikj4eq{(Q37i +zKmJl??fQ)y=e+QOynXwr2&>lQ9X8x=`rdEp-lkqv-4LNrbnn@-eTNQX{yuhrEhN_% +z{r<6~hSfO{ih&Cbe7XLgd-qN_KBoJ|$psr7gA)?!M!l0C9ow&CyY_dd6g-bBKBV{B +zHEY6Ds@%jo$CsA&=?$Ob?oGXV_3|WCZM6(eOzbk_qfJVzK*KtET&{KRnqS{8oxa6y5g{N2jgb1Zw>6n0OV_^-n9@^U;ZoYxi?7nhVY?b-9n +z^y%riryn_Tq&BN^SjSnjytB8TeP;P`-Px=@vdOb&?>ugMeAwj1|2@&YVamLD +z^VYxpc85Mm?dvi9JMOrHrs<_im!ftHD=SYNJGN%TTT{|%YFDhNSG}3PdVKtWo)@A& +z{;=`qq6hN4-fM5(`~Lp@lRjG*_Tq~#c9r*!kKgn8=eo<4)zxE0k3NK(Ypc1h?FW1J +zFaKa}U0vjx%TJx$+3A7vKgil&&D`m2E>pv_Q*{N5rk|j%+ci*)$gAVT4@%feG{VR*UxMt5)cv7c5BP;CQ+|*P; +z(`U||!^7vU??%3s+y4Ih$DUtg?q0WcZ9_wYJ~MOuh7E%TU41LEZ2XzezWlOog?`f5 +zasM-Y`c6mhFHYt^{P6ZqGA>Y`4f*!lAuCOfc5xSv8+Y!hmy#If`RG0tG#O7hhqgRj +zomso^<(Kgu_3msRz8&0JXc?eQHS_lO() +z^1=y=^Y2Sfvu@oQF>~ga-U+760gW}wNAwuf_8(_HP98oy@!U%j%XV&$SbnX~0~N

    +%Mc3Se$=H}jAx->R7 +z|C_xhfroNye?-M3wA{9<%$-Wq7_zkJYC(|-#nobKFqn)PW+81_soNsAR4S>YLc3&1 +zT9oQWNKzz~qLNT4$?`wvyze{nj_odA-~ImI|KI$|k9p5~mghYCInVQK(=?5+irQVY +ztYY>rE-w45VzWknSX8^Tw!UcP1>f>hF4du)Hyf_5`}E>P>*m|XE~b4tx8OcUHRp#b +zfOegooE%O$DN&|Qn7Ds3@AJE@ +z%UYZDe0&bCSv)W9USa*MSI4unb2o%ApVkFrGt`91F(dnKvWo3SISBaDxpRW@tgZaZ +z%>lpsQV0;8>6CKtk=%5Jwf8IU)^(G=d?!17()d_a3MG2VIiDh%mX@*ulbzWI;}$yh +zD+}@p{}Nr2X5{20Hk?nHJ9loc0gTnOSD&g&0HfcVIAe6g=y1#ZQBg*d4u)v!R4+RB +zB72w4#Hgs4ipqioX%}w>yiMuX$3On~aXVM9+M3p3F~TNu)y?eImai=1R{gn@sHmvD +zzd{P{(mmzV1)^UE?!baZn31{zLgmL*l)OiB4rShzhX$oj!KVf*$@j +zV`WKhuIky(!Jkfq-Z2q3E!{Bj;+8>&9WsyE%-^sfYP3%E-Y+$mn;q{LC&?YXk#knCT3TAFI_&4ww2grKOqlSozW#^){dY!0JbL)>gk$oysdH60Y;il=@c!i;(?fdW +z;O9Z@r@IX)O;f +z_q&foI`R$1no^b|HGZwRe5~Mgg2TzZ#+QH)&%S#%KqOjGbuw9bzkk>k%Yu8%h=}?H +z7ZxP3*WX;Hr#y9g@l-i;^OTC0m#SWQ8&pqJ&P+;LH=bv>Yp2M_NXcTx5t^d$q!Omn +ztNt1_N&fC?`{tOX_Rv4oT_hI2eDUIz$GO6U`8^dByffsc<%JKo_*7HIf4al%?A!XH +z!~-T(NsAAa*DZFVFK=$V^2&R_zB$Q>!>6e+`dhtu)1w!)__T{}-b7Uu)xgx?R+FAR +zW0KFWCm>5 +zu+QDyWNyf)@LHb-4drzy*RI`-%XLjxi!bzZqyIPuOk{X6uT&rwPmj6fk>;@8i3zmE +zy1Kf%ckeb{dr_I}Te{arTO2%T(!I>keWs>+W?bsNcCpj`%7zrT;uVLEykIX)*}TS@ +z`+H!uLbqvVX7ao57&(tWpPrtck>PUE;YY>Vr&s0WO&&gddc7hiStlj0xnke_>6-`a +zsiiBf4Q{UbHFj38|EZptR{;5MTy$s%P{}r!vOqs>mZjZRvrwOKGdix`Tk}qo%@?LSza3gOXowIq)swm6r8dDC8^X)!H&GG^- +zXS!YNAmtgBmWt6~>Cf{^yRV_8c<0k~b#)Kff_*g@7S?mx_8AMU`W*z)HX*^Mxv{=c +z!LNKqd1ds#T$e9&K}Gfu4UL{cH$QPw!l`$BUdxS7OC3wjoYr;Er@!EB&3wjiN>Mx8 +z%XClot9m~J-DAI3$*RIJF%9#0$dt8CeJ7Sd3azwhR+?ycckfURBQF9P`j$7`-gaa>PX8QEEc=zAev$0Wo>W^8U|EbDq-PtLGLM +zrvU`Mc+t_7vc>nhbyWPhrS(1ae(@?eUix~)s-~sgpI0gO$b9rDH8pjiD}~V=(9-4B +zC+`aZX20WcjlC%p<&X7103F?$YXAs6H}^DbsJos)Np)iGxSjX*(GLRvpV{ITAru~u +zzgDr+l{vq#sLCkkRrSz2xfU)?04qoF3t?q4~uewW6o<2Of? +zRD1{vKF>PWecpnHai@FT^ZTOzo_TuTzLJ*aul0kc(s~^{b}aO^2R;6`F%h=b);qog +zWv$;eAb-cG(u$kHXQo@9QKqy!T3_)s)8VnqeG%+kU`&-Tj*^M>wbImps(gR))f>r6~A^!^*8qU!GoH-)-yy +zYisLSn^o-i+y`gUhhG&D5KEe1zL4Zo6ZL7(gCRRsQZqb%mz9JRF^66$Uhn;K&4{h(D{ +z#iFuD#!qrr^qdwgvWm%9>%RDEqHDpRA9sXpy?yrAlb1EVe7v0rKkgMmvvp^(G!A@H +ze@L-wKHA)i-Z%2VO0#aZ359A3hx|{Bo4jqIZ=;c$wY&ZZO6)wPOuZp;w_d8b?P8AL(bOHyK$!uQlx_HZXAgjX!AfMv2X94#o4=>yH%`cV7=JXk5hbaegZ4p@?O~#X1G>TNs%b6 +z{^gy);o-+ujG<6gXRRRYHHfB +zL$(=;N)!DXMX^WCfB=hLm8Q-0bZ4fYuXlkB!z10-9M?}Q>d;1JhRUPfN=gXD7 +zMshhUL998ND58tgzxbBIZjVz#HSesGTtLD8H +zMcq^^P*gS_=eS3;{|}echepU#Z08;-aS1I01SKpRzRqcJguzpQmcVNR>jp%D0)ju$B`M`nHTAz@qSAv!o7#Iw{d%)S} +z{$>@G2Tz_Tn&>HK0^7U1iI!Zl&p)0-kgI6&2KXS6zFV)~wN?>T@uBwtV&KTaiL_h;&c-x?ds-1pVJd&kq<5m&HI*|S@1y;zYdSmLd=M#;GY$RU97#yne8VmB)w$Vm_75IB +zIGp;%y*!J?=ylJ203)w78EA%@BbpvNuc-g!(K&YIxpN2h1?}1$-e>(%-@eM3BIA|C +zCzTd$?|#rBK`0dFFL28EaF_0`>%X^miqpWTT%ZFPiET&x*7Vw@d*i3=`Cf7gYXYAr +zP3xol_zY`ZbaeE)+@CURGTmE`_Gp((-v$p1Jps(S^CONBy;r +z8f1@(zW%7B>eIp_g|5QDI>HBn_LXg8Cy2qD1O=mJ-yl|mzGyoS2q@i +z@A@bTc6FWMGv-{44YP>-nP-15E%>staJe;5JhH|BiEj~hYWD2(3DtVz3=E#fgdIN5 +zI(kS9FmFk+uVX`;UBURluFG@k@5PQkx;L=jrezWDO-$nW>4%D@D=o`QOW=5W*M9tX +zKS-(2@NRVFrPfv3?p~gt9(v(|NtR~arO!Mz+oY(8sZ-i_X!C~~JF2UPm#zAGB0YWn +zq1D~Gsh2I+72TlnDU`eWO?5^THUYcL3 +zqq(C_PHvme1BD~UzCNo<$)7toqA}6<2c!%Z>4~8M|`QGoQVDK|X}T+c!qo{E}izisR7Db43=AD%rn +zTXXt{h{%l7?@E1U&AKRR6dCU`S^3#hWDkgg9jX%XyGQ)#%gnFu@AQ{%{<=nfruVj= +zs@}Yrs-{fUH=Gn5ad8A|kV~rmk6Y#Tai01;egE=6U7d@Ii(y|ST{X-2_(q{%uWi~x +zO*KDl?fvXKKQCY`S63-2o6_=jA>YNN%3kM#kxx^>y%p7OZvhke(W4~0`sm%dpBaqD +zTP8Hc7ryB?%KFTsx986r%3s~mZ#7Wb?z}YCy|rhCV~L;ltJ`1V5_u{P4(s2%8MKHJUu3a-V +z+)4?%>71VOBqwL%SJMiE*_tEA_{eLz_#Jfqoxj2Y>xB?50`2L3(q>&Z^vcvB%P{)oLf2W-VL~)>3?4yFdHs+O^#%l)U+Q6VvXk +zsCja{wWVf#>X!i*R=l72_NIoe*}`XOX=$U!j4>J(H8+dDi()@I!fD&@jUPWg#!5raj`HNmlRLY0TVEfGZfx9g=FA-H3VVBQ +zrNFCs+tLEX-t1kw`Ho4y=QbVBTl|iuK5$@Vb#-%r&6L4~5kQvAnpIYId5Y)c{XhB0 +zO?#TDI{eP>7aAMsj%-fk{{8nk-NHV_RMdq0?xCORWF5Qr@S&C$Ge3W-4jeKhJMHYy +zet_Ie_r*$^F{OAsO;YZ&duX$e3?#qp?{Gq>yW?W%NrT5vr{mPT{pt{ETH5L3mZ|pAXQQuxX*wWH+ +z;sm3|y1ECB{K1p74}{oir7lmNsC&BlS*D8c@m#$@50sSN-nWk~Ola<%qI^y9;IV$-LqY!+Wy)G+P#n#o=i0zT=!K +z7YY=nv=pjSSH7&VgxMb1S6bNht@ +zP(6SCJT1*wb4TQFzde8X(x|6WqF-QkdEMTK^!~-n;NajHGiEGa{B-}w +ztZO#aTKI*~8^#$0Q}yKg$d?Gc!|Dm>YM0 +z=gysRyHuzfx`o{=_e+V4GE$i4c6I?{K-jizDypgl-iFNG3C+ndF=i(n0BrB>czG+` +za=rD6mGJXY5ajCW8XVkeXi}5tmHVqXogQvUQ>$It^se+`(hmzq^o^R}54e_(kI#^; +z*0-h3%YwThh=XAexL;-kPyHm8SQx^yWbBI1UZ!^WmX +z-D@w0OpFp-a?>PEMw_Paehb|ASt0&B5S>4ZrY{iTv7Hp!OkbF{)Qio7rIN7AcNW&a +z&@8<9LJ?kAOUr{Dz;S1r`0;!NtUzsQcJ_r0@Q8TkbZhfdri<79hfb)!fBv1HPVaw^ +z?#utHV|0E0!%)v)T)X=3;Dzt^KmLi&|F-zQ|1bF;|Bu8A{#T`c{2n^^pAQ|xF@y*f +z{KI^j-y;UUM+|EnTIl1MKsKnF%x@_Dc|g9?*NVfl%8Y)QnXq&%{ebUVleg-r&&2lK&! +z>3DJZZY)%Rodff>!EA0=0ykI}0!$ApM}bikQTK*w4`+lm!z&RZpo?JoCRC>w23oSX +zoMl*W6;`)`2o0j*sqcuYB`~fHZZqBpOIC;V2*foD6*`f|&UMJ@N#Eh{MI;~S%>h6n +z&5-Di)LjQWU-}iPGq6Xrb`MZwEKvbkHa{rB4t4SY)3uKsrAb2a!FF +z=lEl|0BA-4w8moq$@s{W)LMbLbS`_o}CD(D2+hL}E}Ys4I@ +zE2Exxc_`JST>iWP_Dv1eK-`X8l3Vytb+xVg|A~ +zPo;6DGa*fRU>ih=P)9V333*t^jV2T$X~h!ZS*1x8oe(wvQW1!GJR)HDPgc+Z6I=q; +zh2>3!nQO^P9O|1CJiY{ICmbP>2ms}|b>Ik~#DJNOy@9O8O6UQ!@NU-!Ig2hHbPFTU +zVP;2(?gYslrZdDx2*5k{?YMJ1AvFYIS1?2wwq-%s5x}S&LQKSV_Y$x?nSNq-9RY{W +zbQ9>V0&H2}4Cc^u3WC8*1K3j;21kgN1wx*f5-1lDR;_!*%hRia-y6 +zLFr(lF+RcLaHSO!AzOw#2zwO`0hBwT5b|7DUX9}+?YJFq+pIMZI!$1PU9c8d_mBZM +z5kgI>iow8s6y%F*PS}zeRML8Z(o9||gNo^xNHLRSm&Z2~D-}pXkPxsqP`5|OjUJOW +z1<80fHq2=O)<*!2SUp@H!5#MtF7k +z9&YY*_=bRu0|JgLY+LD(V254I!Bo`Pir5+Cr$ka6Y=WbNZR``O#6H0VALbJ9 +z_`{VjutdLPLkn4}2;BHi5+!jVO)zMLs}wSO0DPD{8pnS|mlOt;Ni(65$V*F`Oi753 +zi+~nPc0P0j8H4ceWp4s)=N^H3khc?0IZ9#zvvk#=oN?#~6=AxPx&0 +z3o%Aa>ws?q1qICxCDf6bAA?3E0Shf3Lt0;`1i8T+`$8dRjEf{`&n5DepmiAz&0GS& +zBoXg~HAe=y@t=k`?24uZT?kA>KIjW3Cco&Uo$xlCJO>k)MDllOHEAsQ2VgeP9jSzB +z#FCKT)t$>1vN4<|&S0?BfQQEDp_aD9RFxd#!Sb<6u+**@mrpoM$lEUILc)ENY~Vfv +zUIS}Ic#63&Ulo=fhtNz=RvjYm5j53ASb}&o2@eeRu%;Ez!Hxjd_=sou2M%p!zSG+*s#Z1m0nt%=aodq68M_rh +z0w7C-yG}8qL}~;(Iq`h|Rt?pEy9zK!%pR7ePC-ng5PJPuNKp#A`zqJN98lh~LH +zYbUkzWO2A+lvNF9wr<0xU|}X?t4zS71gGhkk6#j|w&mdOqO{pd!Q;;BFLX +zzeANusR_6Dukn=YZwXmT&^3--KSF^5e>S;$a$cV +zkOrH5N6J4yN+Das5{vkMzy)MlX}R(FTsDi>)ehLh_0zBeE50YDl+a-pG<+m@K_DgyJr +zi-Y~4mD$1KJlP_5@6Hy79%?xvkB}n+k}GDWbZu7>wO4VA3G4-wT1a?dVvSh;OiyA# +za2(0fg~Z7SkrkM9+JLQ;DC#Ob9f5#^$86}(lp932O;AUWEBu+EXe`3_)zKK(*({LL +zJiKr0Oh=-20`BAm&u&>*PIB3a!5NUek?{5sU@4FsSX_K!Qs@%1lRAM&>E2;aBIy|# +zVK;Jk9_aQ0_|+RbgC~(bHYf5iGY`Bbc1K4U$mWKF6J5cT`Hxyngq|p%K;CoHy +z(Pj4??s`WngU#jBa=eelf&kENKS|Crq7;kW=~a;FjCyWhdp;T8FKg7aiC1s +zWIsq7{6NcXj~eLu2nGrydnLO}Rce0=jG#qAC1`&L#iEIM9Dgx^-Oy!#3QQuhVGD7$ +z0#ykj2@r4sJ}%#3C~Y>(KJO)Fq4eY^{k0f734!4b5-{LYXN5CHZYSXqnyenYsa|>sYWrXEF46>)Phkk +zvPA<}TrsL}fK!T)ssy0HWlNpT@O2qqkdT-#Yy<0MOQ+gS2tawwKzFiWW^knXw>!&~ +zF%keg(a{Ao3BXdN2V}Uygbs!=bp>BVyZ+D(Fzl=rgM62=!ky1WINO=H@B&DJH|g4P +zkXlHvydq5tA)7XK*^DdpkI6XQwyR3ckU?&i2h@23 +z`BGjfRTa>EZ0ytvlZ_ai67#@3czgjmO~n_%MDI-F!hHT6oyCwOW1E8oa*0$1>IHEL +zq(S4-qD}n-33c1f#k=uvYkQ=FI^wj01a@N$J=9_|y_hsS4Z37g+WH2y=pJqe5uwW% +z$vxsOB6Jy}D`JvIQa?Wam`>U!G>kS4<6Ln3j(o>|?m93Qd?4xQU-AaywAm4gLRJ98 +zFl3RPu>lO>I$B9rPMgl=-+{LV-$5W%1wpcGwnKZcy&D}4g-NAv&Lm`xxBnYC1bG4f +z0CV_`@ZSRA0oFooMW!MOM?D6%fO1!Bn5V}KvntzcMo9gkqZ&;Ukm(9lT&@^%nc +zIbeIN0Zt1-bnpoG7X^EgyiF2+2i4Tv6slk|t*wD-hpEFt(p5u-%*5clkP8U6Sm8wy +zY-U2Tf{QvqvV}@`YzY4!bcjjL?yxTjFD&Uu75Bi%cnT$s0B8vjZawKm;F(y_ChUS8 +zw43ldX8I74e*t%>&|Z*S4@Oriz&;b}2fZ=%Aq2R9mINJM5$(WZ15pasm%lk@lRcA_ +zWo_tg7KyX{b;kDJL1zE)V&(slI^|R)R1b!9u^%f{t}iJEW1vUV*EiNPFg9ve4o2yF +zvGRZF(?0(Pz!cqYI|j`1G2Y0ill&j((xbiV)KKMZ~Q24i%c|3_bc>{$J_^`G<&^}px;`6oU)-{M0B(s!D< +zjl^~!oeWFVT{D|G)NeBwar2*!helDqQNLgj7zvOfg}zbOTs}O2;Bwropz) +z7XrIDLNn}AB3LsztS3E#cM&0) +zhlk{M$uDhsGNJJ}-1ZNdkYAAh(xHuQ-xoeAygxxD4~Tw9mPd*T>(PeLrejC6^iBt|lX#;gfjGov +ziZ&xk{`i|hjQlbm2oo>?U!fQ1!Vlg(LGp`f18{|bx@OS+)W&oK21KAfouU~aFkr&Rq<& +z+MSXOt^+Z#OK;Ns)53N{!WgyN(-z(Xpe#(Le><6mO-3Tcqz3`tT8MSEdVtyZ`u~T$ +z=KzeWIM&oy7YKx2lCVA-`_7zBcWO40Wss$lEv$x$3${6)?w+KFule4cWnm0~gb*OK +zkU|MPv=AV`2SP$g2m}Za2n0yzCG-|ThYL+1c6I*_qiE +zoZT%hOJr1-dA@Neqlskbe0Hm%xF`zWadS*&gfzn%7Xq(xVT}_?>56cXh%&El1UMJf +zxn^19XdhP5d}CkfOx4*ecLLIk?|jL#XXzL-MPJpju4o!ubIL^`X9LqQOygXA*`3SudN!J8nkl9TQ1ET9)6=@|QA9=IfP0>u9^ +zL5c7~yXs+iG_A385hBAvmNsE&GRk=3;(@bU1SL}*o8@CaVaFtkOj!qx4MSd&hL3aR +zIioudO^q3oKYz@z^n4{bq}6F@k`Mc&Squ$=DoS^}l!eU^AJ#~an*Qs%0R2mfY3tyN +zbst1l3_D$))+;d6n=mcc7^MHCnngzE3!{ycUL;Kzpow}nrTRTc_r2LX%!`svVT?;k +z4hB=?prhY1K+Mf7(Ai>c(V({pfXgt?jXz1DA>4jWF%DWK1WLSs(=mvU +z3$rYfB+r>%zma$3V1NdHohiWhh+>*Ao&+>a8sVw7m={-EfeWz{<9@PlWI4V%EW$jY +zVP4r1umvMVV#`Hd%mr)ekQbG}%;ZH=Gm=+Iw|Fp)u|{4g?d%nOrKn4@fS_aszt@bJ +z&IDxyq;GCZrqVN-$KL)AqMjAc0JL!X&l-PKP09XqBAzVcUo=DTQH=k*%IebiPsEdB +z{7KOMv9?k8_}A7}m*)S3Jo$`2I0}uWjl#!&UUgMz{!hr0@Aw<8^eB)T3LgK;$|_%J +z{!hp=y76aO^K7H=@vo}&mHdAuG=Ny0|>X+V(T5EITG9=W3IDEL^Mxuml^Cr^jkVpuwm^_RO32p9;T*1shLj=4gZtY;` +zG_xq9-b)G#Im4laM*x+ZCT4;Wo{gF=RYVnPKrZdwjk_@@rzo|xB;(OORZc=EI#;E; +z-m2@?`^Mhg_fBPy&vZ +zOqIi0=2FC&STR>Cf{}p-)e8YMBWmkl472_wNu`Ds43pxq5S{n*gG+1#jty}mLMx`D +zXs}Hp7zGJ +zHb}Iur8&^ligOr>GWTG~1rGgZ;i*B#oxG=f*(JP@1-cq6SX>g;R_GH92}=GDH0iWOhOGvsz5ASva4J}RNle| +z$!#l6*ohyySizCX!Z_aVuRI=dt3O+gXzc_8|HXx%o|F0>X|4q!3$M}=WXvY!> +zE=T+~f0eJwr2qH%{r-~ve5O(gpGIbT4)3GMIyB +z^6uf})UU+CO%W1CiG#_Yw6}G)^Xsv*KQ~fxAhzD+9xt!haUV;&z6i)2?~rz1?O1eL +zaXjQL;IhK*KTt@VdvenNx!aY8xEFCjqo2u7*lOO%IXdgxOaI1#d5sG%%{RjR?hKVm~-p@Ltf%-6?@&?3q@Rw%QoL +zrOFi^l)_`|i$_2~MxV~&HK7we%-1<{bn>U~x#xR+E@2{C^JBCH1pTvAmPhQq?4kP# +zne5hxs~e4Rdd*WW?{K}F1Qs*_!33!sF_nV}8YRAb#E36>$iL0Ddg)Y@&*H@*^YJyz +zk_S|Ce#EwN1cAyZQ{q8%Y= +z!cKemO~ZU|W*%Qf?e5VASWS6l9^6k&jW)0!RGAIRq^#D9wGt2tiGru5AX0#K3g&WC +zXa&}7iUkDEgv7<8ko6_PWF;fVYKC0+J7YEV*-34*vGb-5t!88|yhjtpVC(|YeF^Z0 +zyVZ!h)nwq-9%LJEZ%im1n`lgg?jnlDqF6kRG3S_6OfAogQ+@6@a~hWe(S-3hL5R&K +z)?6l4x+|%Q_fgnHq0^(?=ohC5S3^Kp(;yYE`L515)y#3`Hs2JZxEPc6q@b{MX6aI2 +z1#ARPjHb;M#BK_V$k-#v!6R}`^4$>Hiy(+c*MSTkFp4)WYz@H_Gu7gOW|s@w4=hHJ5oD4H3pN +z3zycpCg5ZY0T6SI9uJXL;OLE76eU4q$4L||1s*HHlg0k4U0N#-C=q$gZDhCq^7*T) +zt1R|^^Gg2T6Y|U?7F&*knwK`9S+0W`mo)~LbhZcFj+yl63Wb%V1F{5rx|SSoYr&lY<>M?Du3SwIK;;#4NmvG` +zSg*_N1|0X`pAE?CVAXUqwg(!RL6O7Z0BD1hwbwbyl2KHi95ABFQ5Ic`$J(4o18OQU +zXpwf-U60UeM_D+ITx?jI-1vt+3~miN(giny8$DyPqYQF)!T%=$ +zt8q3`dkD@jcMI1ef>XB93Y +ziv`FSXiSe*VNoGuJe%iM(d@d0@@HYH(EsW6dN{-oP?ZAjWFzBrs1VdBTBy$!x%~9M6b7k{+}(z +z&Wda$F&g!fTJSmBGL$nJ3t-v6Hg8z&PY-JO;`W(99Ef5Z=gJqB@j@LUB7~lGV1VW= +z4uXZz>PjlHlnQpE1L+8&l9gypOaRDE2gMwERvBiOpqrxz!QcSlmo1P(Lva+9RTWD@ +ze1N#D2Xe?pW6~yqGIKFP2Sah<9W`sC_GX_M%xU$^+FO>Isp|@n=d}9uH2Z>dXe(%^ +z$7hOnCFO*aBmvwQdPc_qiw&D$pc52G;C~4@7FLC!r=lO>f_#|q%ccpyToXeV@lk@k +z04ya1FvbbN92-*sa~zihdt|=@`znS&ksoe?LTbv2T12=SB$6K_LE}s`S$oAFIeUXI +z{P!l(eAxnRk3(L|77!F-;LYG*#*S-(crvOSQ}Lp-9#=OatF#(i5Z95ClQESHHce7u +zp-4I`GepdtOLibhI?v#Hg}Kav3f4S@t-=7@0;(GvcdA+}$K)iqSpr$%9YNuZaZ3_jsLW|3B9|d81P9@egwqD_mJTg% +z?Wn30G7Kv*H6B`9Ns8eNN=!x_ox!HI)<8#Z5Tf9bKaQE00V@Lnq)yt+A*Yyzrxv6L +z2~v6k0TdDk&5`WWLf~9AIN`uSa0wg_Cfgr@O +zv?)N-?Mk%=np^wYSvjGUn4Sr3cCG2@cBOa$bEh&EfY6k71xUJGfsVj(y^K(Rr)O#e +zB3#-vLelNg-EIq6)&eAkrcD8wZdWP*EYqeLl5RUM1KN}^&dWfrEx!8N+U&AJy3TLO +zvJhk*5kWU{xz@*(usi5B<u01BaWEFBHSBWk^=bd1E@(*qT%=5m6qB{SQrw`rBcI8#BL+d>Vc6Ol9x*hpWQnu~_cfn;bJblOk}TsttxDhitlC@KO410JX_>K`$M +zE}{Y#2yiU8KLZ~~cR*4itP%t8#Pvc=q0kVP#^>V3j0sUUi=YT)AoyWSiMXK0Wjuj4 +z3X$&(z}RQO^)q)d>$fN`g4+*CDM;dx6q(^+B_1dZ)lEZkXf25dN#iOA1n(74z~>p7 +zi+8!=q%aO4kh`9hMrd*A32vOZEf|6((9ZkBpPC}RG>$+JCQM%|zJ#ps6EG$uuqTcFf%WLQKOV;dA()TY@6Q(7+ki{MF1$b}|Be9wR) +zT%!>~X3Odf*hwc%$f4!z5tB}ecK`J^6@%Q!L2AX7 +ziCtJs%$!*mvlzr%VH}uVCcq-<4q_G_W6OzQ*a>r_rsMb%DT3KWI*Q;=kf4I!r43>I +zaX0XCDhB$8j+K!p;kMf*7Q)=JH>v~WAsZC#i&Ae>lQF`-dGBLQ2HCgHrXG3)fF--( +zvH+VMiCtA>gJCTKy9jG4Nd9$5>?{=wY&)xM6RhO3n +zdK7xAJa4E3)W8|5AhGMsxl>BizJw)r)|@N^z9~B<=V-#V3<&8q)D!46QlOl&Elp$I +z8%8e@Avv|k^}@$=jA>yY$0m{gG8a{tiV(k=M7m}-z*B!1h*rcBSVU_R$Dz)lSf+@8 +zG-zf!2F6V0B<%#*O`y57W(*XW@6Z6Wx~j&vhDpK-{#Uz^p6(Hd?-u0%s*5mLDr9o$ +zCMFM4hYa9bMB*hK0m0PvGvy-inMS`BFGqpeH8~nWUK6fj6s-sgq~NSl%KdA+EN(T; +zmz0L_7%C)Fd6fq#Iru2p4i(4^kUD?{v93Vm~FTwq-a+WZzDN>Aj=D>nwTtqCg1Gyas6Ck}}EVtAkNEl?v +z6ZSFG$625@{5c&{l|fK#k_B}x9RyV`*SVYkX{1}6;$p;VUUm(%#kK)-%ND1Xr}5jH +z0PlQm`{~%R#!Zc}RMsGE5gNcVolOA`s&uoZQrMKl6De(E;I~faRn)%~NC_&#UqV9| +zU69Fx=EUZ>xu`@d1)2g)I=AS+TSx0HPNX~9Y%kNNp^r?%OtY}8Ob~Xc6tYTLLj)1% +zH2zJ%w9-6~{C`vhEBZmxIdhLxwB0DD-&`fdC<4Cw_)oAln2N +zVyWOtBE-SjM;V2u5i=1f5*g9+(Xpfu6h63&nzdntHppy>Cy2-olc_77Q1t<$H*moL +z4~ofT$4}bcBuqmBfnKpT>8M6TziEJ!+(e~hf*Orh^z8?pbo!P;L#Jt5?@Yznb%#tn +zLnmAA0deGuGkwP))S!1~CQIX_LOUji46t_**8|Y~#1otslTLaeV>iQ<4MQgTpUu3D +zGh*FtPp3~|vRyOs=YD#<5~3#MZk7fX#D#9{?y=iH-^B4oiQtBM^;{KDSWZ{FDw?Oi4nVn%vu9T2W4RMgm< +z6tNskp%EEEoq)$Up-Nz<5IKSSWrGB(61fIyk&KE=B}Lk^k!~!4F6kp%H?s)29;7Nq +z$U(RYW`ORlK|u@%ZJ<}H%yqk5beVMnP3}iB)>DdU6_yinZph@SaGZD%lNH9pRt(gS +z1tCgGK&i9|(;Aa;Z6U3(u^`eOIqGJ;vjf4c3D7wfB!GhmZCtajp$!)Zd7^IQ3L2Ae +z|1tZH4`{O;XL7qWis{xbcjQ;>=nIN!C+`UX18kU#FpO;;UFO5mmIsMb!H#+}!eZGQ +z8DXKLSTHPnj%A!l^x7#+qYrlo*#Uubkn4r40BGVStplJSndr?tZpx8B<3h`e5NeDm +z6M%GciDw+#;>v>X$LY02BnB?P&*q-icWV*_Lo5Bl4kyLqqr4XG01ftt +zr!L%5MsBy3*;$ar7bVj)SF|}z^V0h*)}`g-h=&H)7*^j4sjo>1I{J@ljF7RFxeFt^#E!Lw%sJYV-o*xX?1XlVW;7; +z6bTYc7{|q!W(o4+0D?CO4>nyfD|`q18mMB+xRUQ=7L^o6jz6w9;P&)fn?JFVSLpibts<3t2|z<;5zC9v^~B{ +z?+xbU48~a84ovYF9tM*RUO0}kfoR9NK({uyoneWlOQwE0tTQX&;XFx2UayBS%b)ZBK*R2n7>96y +zJqc4Ym6T$tWI1Qm7ZqA$wEVze-eRF`)_tErNMwdC1wqNJW5x)lW@M8Wq;RRd6Krk} +z?Vl5AZeiMum)aRNYKI7EsI#M@v!%tZ3x?RJqwWXSQKsVJvc$EN7Be9e^JJ+OiL~ape9Fi>59dNIzPjKOtLP|l}p&Q +zidESJUZWi2tLI7748$O#ilaf62xdxUBc?JLN31IM>4WX~QB+g4DCKT6Mg);<;7LeH +zDO!g|Pi8hi#AZR3LPMef7Re>2$n_YK66S@WLRz2Q9Wfp>6jvFM#FG}8225mF6ZTU| +z7gmJ(QY_MnCaj1h^qWacs(z;FC#r8#8U5xGn=;k*Wk?6@^4FO2LyrLqLT;P{S!>zU +z)M*}w!f0~DPxOc_i4>O2HhP3ad-19Zik}!?Ml3rMjb=3w1v0xhq+IG3%_Xd>U|31Q +z{Xk}`Ew&=^Mq`6@s54FU2vIp2$3mG?JE)l<2#PGfi}EPIr#&gb(V}oM3!u`&b~Qe? +zo62xxOvrj0jH-jH{62EnT82j@7D|jDm-fknEQ_<-gZAH_tjm_21w}pG?-BISi2HifPf3KqzWKIj~b^KFe7B +zpg4w5b|@ZJS3$&n{YLtYPSPKzM<2~i9`P%s7XF>S;T&aU8!7JLFT8K6w}n8bwwwUy +zY7PSgY}3j!uvZh1L_+h3LaiYK7yWn^{%*)*kkNQfL!wQ;p=hSAlf72%Zu3JQ12BS~ +zmgNyrY;qE%mLVreG2|o%-z*RLZTQL*q3k<*%iLow0a3~{3qh7y?6IRocdly8vXsY$ +zo^n?rXdgYMQPEUASn%XVzg80w*+3rQSA8m0O$(i>V>0*6AcFEtIV4a!7Meu_ +zHF7myR^~-dL`)nEk|^I&8Eys@6^nW#Gn8f4=wQi?DB=myvf8=_?Tp>gM!bxh=NYY? +z%`Z%?)EUp|u^EXBjH}Fsz3S@@00n{11Pu2!E@~rDqWIl!Y{AgSBuFj3+DsPb5e4H# +ziqQ3(4i0l`b7sj&RZBgAZk(69!3o)MbNWF^d6jwjvHE{z^#6^Al=;PR|IOk5TT@-> +zGsl0bnO9wk|2H9z(f_wIDTOfc*f;?963^VlX+_1Gw1|YsUyjF!NAO~Z6*V*}k6=n; +z)FF7@ml-q$LZQ|>qCGEa}9WIt%u1wgcosUwv`iuq7$En!gLH&1{-z2!P<-Lt)cOH2nCsj^$LZl +zA0Sw}1c~y>ejw8Ql>(&jy`F(=besT)Q}PBKS#v>L=6RV_4Y#$!wN?wYLUKfo)thrt +z3o%we1S2YKsOOl&zm;e@O5`+>RW)P<19T3BqLSAGIC`7uTmfL|w4rvbYzhfOA)*O^ +z9!J1k!8B~0Orv+EM5FhoLMTTv?BRWsxo0v5vcP_h@~}4$)q%5Lao7*)Il~Q +zpfG_;%}jc7s;30#(irm^Kol4(Kynt|*n_3cUMyG28xkIHphO#4Q7moaw0cCWgZa6j +z&>l3xd@d)y-z2O}Mb$Iq;X|3ZrYY@EnHiO%v?R&LxiVu-Q_Isb3+@WG(9Of^(zcSk +zT`kHPd#bFt+9i?o#B!HA0od-|H10zEx-jxwuvCS$Dn!%pY> +z@j9@!-lmq|^48uZ!PbtJPD6cyWs4DSJ?RkcH#sIIE7S~Xm2T5OMs+sF%)H|CM_7EEhT0758^<1P1oa!dT5nMuj0s$`F^&?w1Gv;E|YM(>I +z*JH{nLo}3mp>(mv#0gc +z1J@j6(h#ZDC5lEM8F{FHM&x|L6b$xMWZMyslrLl_xttQCaOG5p)JDHi2ko+`93{tm +zTDk|(zvhe#Xwo-1N-QjIKuIY!2-;i-3F2q2XvB64m?fNDGI`UQ+b85M_gmyw7$n^J +z*_y)_b<1?q-FX*S1;D{M{->Vp-RPdp;V7fBCm~UumGBo*6P33`2GP^o-pgDtCYnW)WJj47c{k7ry-Y+3MGMxxyCY3eY6Y#4VDAqISs`!L#VI8dVTsbj5$beuxUwm +zogty8*OaiVsmGYm*wSQ5SVj^G@36JYcvp@)Vd-j5>mdPJAj@#D>5FHcmzbA}90S)2 +zmzWEdK|Ck3CN#oMcle7&y5g#dcp02@ujMww#1=(`u^-X^`;8&k&rkDnJYzXW8<)8i +zxU2~opmd<)UrENFVvN7B^_QSE(9+n~)@y?i1CBml$F()wCE +z>X;Z-Y*fwGM|T$W+i7EHzY +zNg_QT^5^eAE1Js_z->+{vsBLyRV(dhg&ImKiBvpEmpy8hK{U74L7|h2j)gw;F-~z- +z>QY9=M&tHAn^74@N>hPguw3kBFXsw9?n}gU)WS1wIfvhTqwjf(Sx+Sy9cS?+I +za*4up-!PiFZ`jGW3MBC;3^qca!92EECL9q24JJr1xy3A{5SLAZkfKg0DFxscWHxax +znsFUuJTD7ZWPH<>RTOa%1>i+8&B~s#&CwPe3v?Z_PQ`2#nm2W(V{2paVS1x3+kI5b +zr2#=)PC`nIhFtDC)JHO-UYxfMNSPd%z^~OYrw0bntEA-UDw0fNgLr5jWGj55U)saw_4GZDCm?(V+>Z}?XQ`C)|lf)uA +zWSTX0j+nxNo{^@DIFD?0&D>AfD*a_&{z3kZ#QVW{DdXaA6%j@)4vd2YFqT!nE#8mC +z_%?c`#{3J&X{34QhGj0Ay$u$bIPnMNCQ;@ +z@T|-Y2u4SW5+2c@4-@&M9fh!dbjwmWdk?H#Fi7&VX+yfEj1}TC0@8uyc^E{3AmQVs +zKrQFOh4>c_YU=Fh=|$Qrt^oe{-EO26!qNu3LG6AwkZMy;u(iFbt+lDuPU5hQa3?}Z +zd&Dx6#Yg{2Q#T>a-NbfUIT_dAGe&7l38F=~>i`Np5w5n>Ci%^-z} +z5~rVQ5?TViO-q6uffc^qlVJfoaF%u|@qagmv62pU$iZk1ull?9jX{P1UvdSq~u +znoNO|7)=mz +zFi^uLZC}f0udvmHB+$fjtMNiZHEB4aYnhuaUQ3Am3*AR*(n}Uqz5&~G)yP#5TP|(R +z3<=^xNotA1#+8}Z0TEmL-0}_RW01LXN!-k8LAUHHFR%Yn#I4F6g$PLy*dkl}sse)) +z2;RR=yLOQwXj?W*V(y3^Pp&=(V|L +znxJM+cB +z>J9Ov7SBV765NyZ%-m+gVwo1H;zZjrYvv}c)#RAsZ;7RKafN8p9HN(cW*rPDR4}&j +zf5hpJ5{~N3Q>3)U_R;|&x;7>YYl++mgGjnW={6W27%(dssWMYjXR%uwGRu@=VS#>^ +zH8u6}S*U}MTSV2fNli9&$I(S=OZoi4=MDAOl# +z-l8dN)UPA90vp2+I;#WU{KYsohZqZTNRdSfKVWBQ0^Ab#sY +zNqGaYc@Wl0!T7-;nyqnBg|C0Q`H8?ibR!6=*%yivLkJ_^!#E(9HQV~;dWZKK!E_%{2&xtneNtx1z0BEw~WkCU@~@=V3?_}tpqy@Gi)X@+JG5ZpOw4ySh$;J +z;+2iR@j+)|4itq)ZpN-hL*+XtYhYDz +z$>``^7VKHs(c8Gf){fBxrg;!G58Hg!2;BiB8ycxePNwAn@>9EH1Hx?JRM>4n{N$6A +zWU)bkA(B`mbbd0SpC=jj7J|z*l#5aq7wQqw-rm|9#5*;1_^DSVQy6h4GQjRVL$L!hW!(D!AOc$O^o0-fy +z`|L-+#&O$}edzf4GK=ZYWO~Cnvt3kMD${ca4KaoV>jVAR%cv}&^^*k`ziFXkp=SjV +zzLo9;!Z%bc%m7Cj8(nP@U4)F%eOtcron8En>w{a$E{0g-W=@5#a7 +za98YSKMPrG8FSJqhCP|3QLmTueiDVhwdsQf$avxoHnsiopc3Oj5HsSXpkTY~!jn08 +zt1Hj(z*j8b^8VN(l@=I~@Z{$uR5FTGDZfb!7BdA%Kq+;-CtJ^dwrSg8M1j +zADZV@i02btIg3s!i?YnBPS>_awxN^_8s<#%&#DF&qcn5HvmuepHbJeW&nrFAs?YM9 +z0UoVBYpnVvgP0+NB`M3Td_pGG6KzJ^P8dQAC7If!C=kX2` +zvWx!RC5Mx7)GhTZvG{t0oOX7{`{iURj#}kp8t*=os2Um?@t|f!9*m<7c}VK_KozFA +z;iHNYPAHK?39qV!DB-mgzWEiEl@KMoy0Wfj|A~tdo>HPbNcaE`*6j)|Z|$h6bPL&r +zl~@>zZH@J0fQuFW-+}D2{vKM +zdHZ^3@F^FW9H`St{^lE(TrZ&u1sS7~3z_qaNp2TIS=_AQFS!0CxDW7U$R=7hY%7G# +zscs!nKtOU^C^7{NA5Fw?=mTH{`he%6O&_$_+kz%o?2D$+9bISQV~I&U+JMwt8rH8n +z&l-(78I?%uLQrbJ8=SBL-iZ05r3-d;F~-QvIMXoI2SubK$St;&r5DUEA +zD7@BB{)o`PZ;Pp6v{v+$i3pt$m80}+utBA$?VhX=p&`p?+?O+>kJed?xX?J;=tD!} +zZ)Ptf*c>O*vO!a8b_a*U4clAnGO38+o1K=cMN%Rv8dg$6#z556>=y7xEC6DObP9{L +z^y<+R2^vK#kML^17;#!9fn#BFo+ON&=A~cjvg9&GJj39a91oaF0Y+(0dt+N$Yez5Q +z;iysct`;!K0ogx8&pJ=m&J0bS&;_2<&cZwhvEZw!9$UN +z>lFIz0oXmraDO;FOk0mXx^V%92e*E;H;bzAe7{rvpP0MY!Qyy;KwH95b~=->^5-?Q-%P`qSGhUHWAwcOt27heO+3?+)1YE +zEhS~(SQ0VfCN~=y`Mz%UK(`91IFxhQlcsi~B=gJ_(+K4-pVnYs$I_0@y^ZZ%b~TwQfl1Q6tg%h3BU|yd&W^<#P6J6< +zoOLZl7qu=1w_vfMj+Mp~yhRFhw>H_r9cXH8H^9l}w~)dI$F6)!TW6!#RCmBoS#xLK +zB8XaU*CowM*``Y!jomAaLug53C}ZiiE%YlfDLLY-FVo`iVSt~wbjfg{w>96sP@YB~hh +z5DcUv5f6&RW93K4$++%_QEwBbka>~V_{fR7Aih44&BYM)|IrYNKlEvAL*e|v;6F#B +zd6Q&FpiU6*%A6hqq%eHz=*iy;LiZjwXD{~?zZf7t$io?^5S*S7UrM*@3Z~+^g;qHi +zJ&1b+$yM03)~#a1RfTO9z5KpMYWz%FU*%sTEU)ndGeHB`@taEX5-@2P{fG%y9Is(n +zicoookg*gB#gk!nVKg`6hpd^HJM5JE$WGZjG3TV`)R9X#%lI8$m@2^{qD+uV2IDE7 +z#08F!zP`hWI-?_4)nTn*EDEpHxHb~8dp53v`qL`|?AmQtGUPS{HX?Es#?TOT0wHzk +zWpD-B`i|#1UEv*KJSr}`l?9YZMP<-?fZz>CdQgeh=4ba#MONKR{q9Ib0R#Y~FG&cfVAJ{Ka +zR1x{PPQx3lQf1$3>41k59DJ9?)0io*CAMu$dOBmrp2MJNiW4x@5d0rZE4(y_HXNF0;e +z0qBf+AlfE}X<>sIa!?wJ&~^rUJ9``3c)>FA&0L5A%{}Cjn2loQ4N+fw5Z=??J~6^Lpd3n?%spNx#UP{2p}Am2^J`bwp%b;_GJ?tdOV_s5=NIL +znt(Y13lqQu$qX?EVybwiLJNz;h|DSgMzSRKs7o*9W;u;m7ea}0mTcxNCi&XWx4T*l +zQGIF3F?!kKf*M86ddFx2gvN;bJGG_H5GIu8BcU^`IVEGxyn_+xQ5>1{t%r`(g>KG1 +zbSBT;xy`{Y;TwTaLKbOcI%G~ +zOH^3Y2bEq!r}D5~JQO3vnh>=R?1@uk9p&gWW))(K8nfoRerY_3-b~XkH^n0Yzav{N +zzSm-hK +zy?BtQd^TcPyjTm1>qcdf3~}9*#Heq&m^RATZ(5yv*U2`V8KSgl +z+4bc(569N1w3gC~nu1#^GFe?wY?xRi<%|4WI-@TmAx~Q~nVf+@&AieSfr?RH0roQ( +zX1`|wjAtfyV9?1N0dq8QOY;!)M7Z?zO;H&F7`nj*Ge2P)6AZ7F7qS)QZSsw#^6Y{s +z3vZ+{s|35yawR5a^Mk-W8hXti1%?r9VcG;ULc#jxRPKZr6fMRi8OJR}a +za!lee#g)@E2;9~dPzpLc4Zrn*Jt^n0Hj9>x?4}JlaZNOC-=JnJ^c1jxBg4)HT&SCc +zDdYNXekGcYd3s>g(c5Fwj3CfuRO8z2KK0L*=!QbrEn{>-7I=n&t;O8Rgn@AaEi6;T +zxonQn&B)sTWJfyMP12iS(dHUfer$$A_DMd5AcLOjI{) +zgVbDD&4pGQt(omPvj#+d!=#1e(ql`hh(!I7j8THd7>p}7!!s}+HpgONh(u&rX4nxn +z38z<(^2o4IG0m;bx|3&|EnA!v6liN4u+rVx*0!jzY3cakr3aMxfD<9s76}VjoTyg? +z;-o%TOe_s=7;Y9L3Zm}0%!nhA@*4YkJ1Je!fB>*QbrKsuH_fDd4|aAi=~jpbIBspV +zwD87?KdQFj(=D3QQHD^@;2WUrxeZ$$f*ehV$%{U+?4re3P&8~%%0jZ-+r~V{Oyie% +z(|qaPqM&1(1vv@?X4063MTHVc{(fwyZk +zskELx7)>l`F1R)mx@B}a&}=Tp7Q9Y$TN+~|JN>9Klusx-eq3HqEIVWhW+!q3E8izn +z52m*4dP?mkc^gMU+pP>@ODLhkA;N!V=iJ3wY&C5|!e}5cu!sf)s`F}E3Jr2ToOaMQ +z@u8+1NZ%X@vAfvrh_WJ{K@Sk7eb&C|p}`83jH2-~M#YB;<>0 +zKN0lFFtK(l$HR8IodV*DW!1-J_X3RhdzoErmDws)RSn6qd*u(#RCg$Ql>P7!+wN!Hf6`G^XH1+D>qk!Ha15Q3Nj< +z=a_o+dKiQu?bR%+8zaX +zY#cD3*ni@>XY7t_9Wsm<=Rq3m&F~|R!S6x$z|1}YhG5%K<9duY|#uNpt +zNlIcCkN;6soYy7}mRODP0zu>%a?4aIci1g+0UmlQuP{+# +z43jmQXjnpV;fjEIp}3DoA5kfmmLgnD4JEr46XiF4<|YP%EYQqUjg7@@6Zsyi(AZeU +zSY_c=Ag^nhIR6OaWv%F|622-EBEMR}t40&KDkJ6!cC4{Onr;AFc*H7mxGJ)1qz7V{ +z|IJjWSs(dLnNc!6Y*8T!hiFC?qp_;FNn(E;V=RsSROofmc&puYFc>VV#HH3nvhr;D +zjh)=bl5ODFQLv3gIjM|+W2sB*Z*iSgEmUH5sxTmfJE(FFUZ&xOe-YLNW`9IKFKoa) +zjL~ajT|ymhqYj;Uqtdk`j-qkFdQdb(;yzcVHpwYwHt$n@3-~CUPKiHsCU;Xe^H~N- +zm=dDOZVQ%^N=S-m7Yb7^$GrXh%8Vzy2Ew4WNm=|OH`#+NdeSTPhzQXO@)2 +z8EqHZPr-H5>ep%G)`@btb!t>GVcwjMJi2V>nJIK-CO7P3<3>AWzU_w@P!ZEyThkHk +zhG=tmzpRd(lV@p}aG%YtgG0E^q=AXmPfn-90&nYqm4!sh0)=i2Pkb#xFpsk+EHs4R +z4MGXwrS!Z8eRdJJm`{+BJN9;AnEA>-FcN`OV> +zD!gW)93Mf<|7If1!i=1Kh2a1-em(*n?g2`VN~xO(V4z0eOgIHGke?hf<> +zd;7ZD@IReP*#boh@P(3Og%e`RQ7M|3(T6TDP-g1mB(CxNXac#YA%e3%0cD-;h6W!f +zBTQe{OG)js7K|iD%(N6d8Ip7q@S8XYs2o*O&a9!C;b32Hr4RRW->}!sluH_XHX(baLxl)l{DENUR2IB86EwJKZc93o>!yvLt)1_t +znZj)aCZ*o!Tv?zKWsYT)4i8^h&C)@6rRGqW7v`w<*jO-U@~s% +z3MIWth{U7e +zuK;pk0fME>K7E-)jn)CdHyrPr=A`f}R`6ht$l%l|L2M!rSg7s?4Wwhtl#9C&5@#dH +zsI$^NQJH+8t>hM}BxqtN&O(smJ9r8py +zcm;O_jfof?n4kpjT2IuC^SMoN1FY;PbL0cTEW}1U6-Jp&1{ztT&FvAjpho7NNh-<+ +zT*i0?f>BH1!12JHM*f)zI8FIs^rN$biaDs*KxA}gVG9ZqL6A#?P~Wv@J=o`#?4nEH +zXsy^YdX3wQl=*B=isJiCb}-qjzw>qQE;D&|W7N~Nmo4UQy=b9+-e&cP2nZcWoI+cv +zw=*o~Yh!`V-$ud^`7betB4;Zu({fH_04C=Ng0`@1IjLR0ldHqb73-In7g+Bi+=C9N +z7TMOzt>{KmHFpVe8g+PdZ!TGVJqq$+pQIY{F?py@h?_PRmz9`;S&?zP-1P-+n7Jb= +z&X>tM8V1?G29*JmYb)`C5>O%T(PMFl))jMR +zt+D;|(CXr31DR*fM#dd8+4eOw(CsqtfX0qyZNE(Q#0)DGV{+Ii=jc9~5(pu9#zw=v +z`u>^?a=qY%%ux0b7We|w&vvlJ@N@fDo&WaMy4kg>EYm156 +zExSN^=$*;sa*ST6c64Q04vfr0IHw0~2~$iM89lIUd)DID-2<~RA6tPhm-FeEeNQvt +z!m!dz5^VIyDdZG<_nat^gqu@RBYNB`;iQ-B@#etYF>^fdHHI|I*rSpb7?3b%yaX6` +zrI-wv3-5(Hx!NH=yBn*`2oSztH)f!q?~8@w#NBFkZk(r{{bXN3zl{-vKLB3=QIFhb +zC#(u&(CN9L=#)w3ZtoBlUzkNU257w!W^wa|r4fUNow+n|)P!4v29@>XW&;BwK?x~| +zw>re^TLSqAPW>>2CL{%?s1UUTlU|s*aUu|chKH1ttR^Hlr&K`d;u6UKE|Fq};(E1i +z(tM@Xd^{%e61oeL4LF!8B}Ho&`a`?p5xo9%AHSiv%H~=;X_3sbyOW0Ubq*CoF8!zl +zzuLH*!h|4-N@&MoA%|&^fT0KW1A@RPf(r!s5whs~IHy54NOm)JMr1wKt#H3sz#!9v +z@^NG}`LX8b$ZGOqH5M8qBVt#iCSws8JKG|)S`o4Dm{P<2ZE@h;v^h)=qz*%DLOA#k +zacQL7y#^NMu=fs)kmUKdVDuL_e?^ekTL+za_g|7v; +zSlU6L6I)IIbcKomf{Y%QB9OLzmwJXQ-j{l&QTbp((M(;p^Tf32w&0Jcf3-SS3Mn=@ +zML$g;#gH?TrzcZCvoGu|b6@j!{%wf8uRW5xoC$`v3W>YpTrtf7QO~ +zlKQy0Q7$70JzxqN_!TVKg1VwrlI7f`tQkx9tZ<)KPU1;o9IGixA|_ +z*Ek8gD68hE?E|d3TxP+9wGl-utzW+oi?J)MBGOUHw>)Sz%}vzP6v5;?o@glan?>{z +zTJSRd&E$_}Nr$$RQpBQMwaKb0j2TdR7T$-XEJx+2%kmwn2$7paxt5=QVPjOuuRyn4 +z6)R-2_;^f&_n-!ZzO2k8cowj(U9+KS+vfsE;#klibSk?D1jZdI;m&I&Z1}YMLcrvN +zHLRxOgbQebPNUhl1zm5?msg{wp?04=H~47KsHnNKBVcJ)qe0C&*HBug!S2rG`4rCN +z!N};h5HCi96QjW$(AJ5O!?tmh?u)2%5HK~BEWp;Tq!^#Y|^Yq%vi5}_>Xhf0eN>6H{?ZG+y0t+Y@e@3@S5p`p6ptKTY +zk)0@Qkp?v2u(+6-IzL$)D2;5>VU@e;3z8$oUyR7dr?QwXm08zv?TmHu-Z&{5pcdx* +zS-9`#Xk9?x5#!&*Z3`B_OVI27if+?h=AD#^#qM +zW@+5nERdN}a3*pD;m+c(k?$pcWo1@?vH+ts%|?nZIT@K}@!UN${z~|e60_q&+R>H3 +zinO4mDX^4cxdj_E2(JU$$B~R;>_qwpa35rS#CMl1LoaLI#N#!NRBW&;D9Ca@#-p9F@tjK<&?XCG9 +z(R^KiM(y;HQ*z3ou_{zyHSTUN8KtK2zL;?gE;V_0)Buq%PEN;-e&mXE8^@Y2lV43f +zRBBYjj_R60zTy#mh=6gbTB*;ZE7Mm~8+{9B4R)FnIOFJn@hDS*TU>CganDF;BA15&QX}&y6DZkJ<0S44f=Kj%whJ2KKrxf=h4*VnIKf$+^lmtUB==0}|mPmM$o-3B=%J(9<&`lUQXwKRB69g|(B8fstVk-F&j#8krcoCY< +zZ8A8M2`f_C-gOX_BV{lKM^t3ZFq}(dBRieMjnv22aH9^N*Ju?Y361jEl+kZdr-xkA +zfrVViHYKu83nRb0L77)ZH}MJUTNubTUIJ%|I#Ejq0er0q-Dgz+^M^f6w)TlTh1|gjpp+4mm9si+-CEZ<5smL +zZ@H4UT%q1_`FX@;@Xn$$G=HbKY%6cxesP&j%qD?rTpp~iaM!r3xX&)HOj7SSI}2`N +z@}A2tjutF=#ZBCk!~d(Q7!F{$?tiQF)mr?&YD@lK6Y@;3|CiMPtcrPnRWS#!>WV5K +z^7-m2tLv&OQB+bxQc{i$O{5!G)tA5ztZHo7V!PvvM!d3LOj0K +zl7o^vSjio%tEu+8EKR+fpf`S?&7C76;oP|G8Q +zUlwOFSuOd5S#R6Rf=3%PehFQ}MnPC5f3Yd$FP34MFS&}9T*XSRV#RV5<3iYE@)k3} +zB*Ihj3@dqt73?#WQ&510TpG2ByFQa7I;C92a&|i`hsdapx$7mrv6A1I{Y^|7#g)9q +zG}E|TcE&7UF?`2#6^pgnyq(BWk`l4iuOyOiQA1V-GT6dW_c5p?4{LbNeKP6mEF>hd +ztI4E;<7~dT-ejUu3%==#y@|IIPGMAjZ7$!kD$TjfunW(}t;{`v&SX`hZR++goR321fs+>$=iW0g^R24n`u62=eG@3#;Qp3n=c}#tenf(81@V_PhzlnG#Bcm>PY|x22UM0DZt+v89zoN1dE@Z2&tgG4I +zcp+Q9cfOfC_P8tFd-R|}l +z=vRMwU|^Ns=Uao>dqS1d;W%5rF(j~{8`9i1){cI@C&2}@JqeudrIMk<2y#IK9^@2U +zN{HeOXGmbUQUh9!eG_=4!*Z{kBzyW1?+4CIKy)WhQ?x~YE|=e6Kmdy~$R{i}>5xI^p|D#p +z>hLj9h&idOd +zG@-^pTEIlkdOwUG$$;zd0P{c$zc;FCI?5z=nhB#Lj|pmmn8~pgE@(e|O`TmUyIU78 +z>CHHLPJIz|HMwEsttyA*7cC{?8R|;L0kv6%D?`)Gfu5%B)-KpBW^TNVc>hy-B~^(g +z04t!P9gy&9K9Gz@AwB@rqBbvT?Hg=5d93pP5WSGuuU*JoiGNnr`LX;z&n_NELA!u~7z92DGR~?6n9vfmEIRKs +zN1-4|OoTUmqN^WgCw0gY!9vqeaFO4VLr@eUX8?53Oi`m7uSqe(S%AKnW{$Fvu`1Du +zKTAbKTbHF0YKSUSV2UvTYZHqxp~v75q;cCA4949|wgsB*PR383tskrKkgWo{wH)Jv +zk=W**pX2@5^Z)1wZ~{y}MQI}k|Hs0PCH|AIW?qT^Ps9^g(bd`A+e0KSQPWH);7d>a +zrN@5$$3x2eqD}ui=6{V@{;R2}D$W0icrwj@pn%f!|MEW>=6|?9v{~nWZDr~FXF{Hg +z^B+?{Y5srtAN%>Ah^wi=q^uT)2jrap)qb=5UsF@k|4hh}Y5sExDDi+V_hUc*skKnC +zB!JxOzuEqyw$fjk{}b|Ln*WpnO0)mV{$!i~RYhU|xz~U5`A==-Jb!8aPsEdb{#TV4 +zz?b~7&i{64tvsMacY{~+0oLvxB+=9Lh;yuGU#w{ +z>&RIy`pu1#2IO_fIm=>%=|s*NpU;UaY42+64R$t=LgaUIYqz^XFu;sE*x7C8qJw%G +zkYH^PN9^j6S-tqTRzW9j*U{76WXwDyzJ$RiyBZ;0*g2d82(#FK*309T?9wV7+m9f9qtQs*6k>hHzeQ? +zw!N{bvu8!HIndSCxsv!K^fq=c4)iuS{a^r751nsv!{3&+#>G8uRF3g+AR<);JBc-q +zn^%heZSHQxgAv3ZaT|`zn6Jw`Dj`Q1ZL>UN(`?2O0W&f18DLrtZ2oEF7w9>wMKV77m+xijM1(ng4r-m6#VM&Y0WC#s7V^X8mt% +zZOQ(BVjh@-tsPAbp}N(0{PC<_&DcIzOu&p6zTkfx`kWO%U{=UJ7_$SHAbhg7fhd$6 +zj8)+l+xnUV4Gw{IksMW(G{3eutmcbD|KaqNE)V^OI~?8+{0m$nf+|9&q9u-*RYhkd +zs%WLW1-Ifx70tn>?%rTepsBAr5bWp#uG<}GYU~Z@oRfirdC~&HyjSBU!kDY+j60&l +z)}jiWhX2R|bv%zefGXnYR2|`xcI;T^a&9DY%hndu(b|9iD_sqVjk&lik2u!*WDufxdHWe7QN|SL?Cz|L#Czb9r+5b$)Bieq0l{efIYp4szmjIF>++(ZRS(jMbx)oU;drPbtqQqtmgaaU4K}XSye4-Y35Rm?bKlabiJ +zDtcDFPKjByH1I#^izyqBI-=rHp(PS>lEk@;g=8;oh$2T%!^4M(m=X@jPuZTaXVg;; +zH$ieh30jpfBZU!>LIgw +zj>^_1oTz0OL9SsEbh=-O!K$U_fGE^V+y)m?VcUW*n@d(i;vp$gf%5~|SKxh$p&>lU +zEludFV}|<8m1BBI%0l%}0oz;&J#g?Hm{^o$gTgg_2P=yatpavfY*-f!^9!z~s*ERX +z7}q(dq)6BtOw!=&$4XG}1btlt@sGyUcJ^RSn~-B+Jm8L*x^}4nl@sX0XeKb%HYJwc +z;4pmdPeXK9RGyA;&+PCBCJZGMjKt$>(+OIzT?*kQRyZ6?J=1{jenO2qbcIp_@_Lz0 +z2~M5>D7*wD6h;XNDGC0hxE~IUQq_bUQU(-ESnQ!Itz)LRnMCDn0zL_8!f2!N2>Bg~ +zDB!zM9yvlQhQ|PkwOWet4YAgozGlz2HaZlK$`x^vqXK7Kf?xftKDB0_X2ARAT^gF03c>#`w&=CmM!-T-TEg5B6@tj}Di3OUSx +z#S4d-(PLk|IVwfEXjWp@!&m7eiygnjIi%uWYR7K-AE>UhXb +z217Xzu9Mb5ZUI2JAa(M0(1@70KphXC*WBINg@`*S-YLct;4?`x@fL*4t5)ItUlZQU +z^#%+@T=ZT95QouvDGC0Dt{R`4MuU^1k`fV+;Kadb~yj;5!i^~yoP+Y=e +z6xEAGNxJuNntotN8h}X2_BA9Gi8S3DPl_!^;lqL9cv5V6lLKTu#e)(+HVFyKrFd|0 +zf7~b>ckp@*t<=beG}0uswoYc;kfg_rsJ5;!WrI&^A7#MiRz^d%y%@iVD$V;>p +z8if&sMKudI>944)!9VLN=hs#F4B;k=18H`~M%Bo!+M1fG8aG5yAwd)ARV~QX)Ylzs +z5A-hSZ0^C*R4g3@@eT`y#$16Fy@3wUwDyp@#UPK{Q6%Uw?iQsLEIIQMK3S-GGH`5*CkyIU`$B9{jw>=+bW5Y0z5G(WHIEQZqzqWIN$t +z`$`NkQ`A$3)}89un%m$_*DlIdS)#rX%@qzy~H`gjX#dX>4q!?2mqYK$ogN!*8iG{DnF|9*Hu^5`7QPl#R0a6t9o;wrM07#-o;=ePH^pC +ztq%(mSp^RkV0PliKjZudrX +zJ*bfwP&Tt`F`xn;d;tNqM^1uS1O4X6+-d`^&5@~D^09cLb1w*q@d0`QLl3yA`6f|c +z3x77C@=uz7lioOla~T2)n6i_4&?-Y)F7AgJE3%fS*J-9)z(NsMJnr +zs(fzzUWNLV6e7|v#zZRt39L=2-HiwAPHF6K8de;}Qi82x%1Kka0+@aiIIM%X@wf&J +zDWu}OJ`bAHxTvW)FbAT9{ZZH_2ue2mNDUg#%`*RJUXHFVv)I+EP4jA0@mI8;^dmlZS7{F+7E>FfW +z&Y1C1Qcl1b9WyO8R!mU9PB#WBwUP|!SxUl1r>t0&Rt(0{QidS5IT=p~k-({;EUzoW +zJo6dH)8!1~N{rOybR%;9G&RmcGOhn6^Vu=Ak$wI5`)jJq_8;?V{U!b1ggkcoe@EU% +z0ll5Qjcvj1&gDIrU*ILYh$|4i+mhIJO9H1&4Z-0igkUBYvM2*^!-fL3{^aV+Vl7A7 +zqN6bcer=+M0^>n&FC|glfI0~-$Yi<~dROM0IhqQECg8tb@0``KIaG_n^X<1A~4EvhVqVa>)la9J%AuMqOVqEcKP8@uy? +z*v1zd_k^Lc2H-{*a-$262~AiyAre>>I2d>>5|>{mzg>o}Q*b2=UK*5GD4rxyt%ZVY +z!A~Ve$muw}FGILGN2rzu7|;8j4H!-F;tCE3rDDu%qe?0T&FY>u*4uk50IHb)BsX|_ +zP$C4T3NG=PT;92fP6JrV$5bD?8dJEGQ@mT#a)l;umda(LY?WU}X}asubfM*@Vo&sTNr@F} +z7lxT88FDE(xXQoAjgHbcUyO@VLmQ(R45pbr6>mY%zA9QkcOMJUss)0P7=HDj1u*C7 +zuLPzxydMiMT(f2k#tAg%Bg7R~y_nupE`}sZvn;TF1EOH@R9ro+oqefXgYZ-^7@e`K +z&@j8688TLpj4>s`K67Z;=W6XUH>N`zAr7O39H^z@?2G_$PQWT9_lr|`on}}?yRing +zOM(jxzTeVZb>nRqZRbfX%>?c%$Xvj1vtkm1YuIuM4e?#)oB{tF&zylu +z_)`Ucs^L!!{HcXM^We|?Ic|NYrT4N->?X?6PetzvlR(%6r@Kgohj2YLnB%)zCpkBT +zGerq+dmY-=*1oT%ovnceHR@%B0lz|89nE1qg|k|r2MeLsb0*R +zLu*}7sW48)dSR%_%V{yZ9me}wyhk0V_6*c`25LP6^E?Cd#Vt3f4DeJ)32I3=;3tjc +zS412NhUYp2SLbP+LRjGN8!%YM?l>pN@*BvRd|A=g0)rHpz~mTE^H8z@ +z28-NHxyLnSRF|aq=o!)>nGR8k6tjF32SZ2GgpCJPD@l>Wkc9guCzTLdE03sO;$iX- +zotDi|!8fY#$~a(p7ID}J_6XW0c-Z)e5pCpGYY1am$1s-1AjT}C7#Y7YBx@bn>P-PQ +znCFUSKq?tVKqp1JkPc-;JjdkW@#1l!yqdGHeg~IUfx*!vdvU9ui*st|e&NZe|K(xy +zif{&;%l@OrS83M&`b+WOC*~>6j@}q}q<~Xkk<4sQg8en)bP`-NBaqEKf@6C!&3_jC +zvM3fHx#B-n&a>EmmF|C;pr<&q2@Z^iTYn*QUneoc%oi-cs;b7x0<1XI0M|>#!|4zS +zMnyPZirjUH1pzGkVDSr`spS4A|6ir?u$Vqv0x)!HGa5q+_>vG{PT +znZ*rr1v-||vkI_frUxrPTu^j#&z`COWas}?6XE~wud>L0wY8=A{}b~Rhf$1y|5s@X +zfIrWeCB*@`v;yB}3EG+omaGJAtpusvxMm+nj2JY-K`_!We&UAjB`d;-v?5$(uq4cGN=WkoY?(U4 +za!|{vIjS5Pn4`xUCFn~~1C-2mh)i7!=a%+1hNG}n6zUZ$6f?C{sP*A!>>Wh_bn8WX +zi1M^d9EJU(&}ISK1#RqON`&B6H+OSZq-l|InB?V9$O+UyCY(A12Ye8+i?1I=XNb5# +zyhqli&A2c|(gw4dbL*}|Hs_UiVq)yz0bvyDvX~ND-E0UtY2dG{N1_&X!^ePHo6rJb +zu|#GTgxmD8;*103Fk1wM$+#mw-5(Tpu6~T;0-(V*-fTz6z^B@14Wh-wInoKUZ +zbZbKD#&{1&wC*{cIdtbiF1`+VdDPiQONCOEu<_(XhMNQ=^5L<5g;o%*Cl#8w4VnR&w++ +zqLwfN#yhxh7Kd$2tp=BEa2*Giakp+i-w)AfLtr3JE7xMq!hq%Bk*!_WFhs?%fRA|SN4qWgAaeDovmO@cZAR=pRB?{p^gs_vqds-EonDQNzd>Rdprcrrv +zQ9@FV#@EY?0926zDlHTsY8O-NOo>Ev;IlDIN58lniiE_VR>MpV)XY~sT1;iW&cNDE +za)p(F0SsR(FKyGM$H3I +z-yr-Mf43L)eNuUS6(DZ_$Yg8pe7|uc*`%J6?k}KC( +zI5Z?zt+C8;NUmOEnV&SmhJCVig46IA_Q}V+6LHg-z`0-zg_IX{aO9h)Lrbo-Pp-00Hc|(lZzk&C^UXvZe7>2egU`1dbHWk@ +zYIFB}z`pN;_I)3+@4GT5_sr0HKPhHNe;ohGJU7Va%``P)11LLtnq&lo9TzXCSG~=_)BMlgLc&6}wRFmo9JF5od +z8~~e3=bZKaIZj>ITj?>XLW$a!mc?JqHa+{Qo`HSCxEfx&f#k<};l`Z->&LV1R= +zh7U@H$xUV9@tfDyaWN=SSWpU0b>g;@1PxoFaTrG(85@f`hL+xac?OZXmXothBBemI +zTVb}D$56{ING;6=y+YT%xQC{blj%1|&Rb!p?CbN4o)_ +zC^OZ{(5Mey7M#PtBYIg; +z15IeIj2X&nty;=c0JQS99*L}Z(oAep +zpji_|=DTD(uQRLj +zoOW!?WqS%Ys&Oo?&l2;nD9{^8>=~`Y+_!vPmNeH6S`C4TR*(O(mpW~%SXLr!b2$BZCrAF}jM#@BMg5Ygq3bew_)KP%sN-;ib3BDn#HR5kE8& +z2LRgx>u)rzlI2$lhiNDf;vFucl9Of}vN5VHeoPxJ);qZxGsh}#kqg}7g_?Me8WN+& +z(~sg}M-s~Q`&NmHBR=dkUdx&FK2@8ujy%{r17uXa@)z2x)KF5EQ8b>E=~XwbR6K>T +z+JLIvW9Vsr{yiO4{h@KLKRo^;Rc#)rGP_}FCQ`mee5SEBb|~wPz|b3(li2an@R%}a +z{)fldrK)_1kM|0M63A;DsH(gaYhwX4_uLoF43Hjuy~w`cU*;?9%$L{Yb!}b73+pmp +zRfo~o7MI8#oi(XNeC6wg3do^=GF0&U@9<_*Gx!`-)BW_qJ0B=g4t1?Mv|`QNeJkAF +zxwByU?CS?n57$JCk=TDUBqc|18LQCgG?=TU +zTb5TBjKIF$Bn9$rlf4pEdO$WoC&IJn5Yo@#b^JYJT65!!G{o`cQ2} +zabt`^l-GGRH5u=J!H+5aYqh_+avG{BE*SRDS3Lf!{rKZ8i8qBAPI21Eb^njwZyx`e +zn%de@{NIUq+FBQNH+HWqD{Jm9tWlq +zh*=h-^g_!`@mp}dx{v+*XX{s39WF*2Ip%*=Wwqu02Y+o&oL7%Z|v@9?O0rgnmbWP +zXDLYw7j!>X-`*UQvkKJwgqN595ajiI2>562HCETZ*Za` +z_)oPjh}oI5!Moa$h)Fwv%25}VIbl22IgG{dh6U9NaZNO-VL{D8$Ht8t9h)|75)!M0 +z#0lzz->wt>snv-ZyOF4wIwKJeDf5jz;3-oB{BVEB1U^fd65#Vo0*ze|Q>R2X=zTZF +zPUvZqvI~nN@qQ^%mkWlf@q}S>uaIBvC!73dS}#Z4Mt1qn@2|zb4f0>55C1O7e-rV{ +zL|G(2#=(gEhj~+n6qOrn1T0&&m9^rY#+XqNla +zgN_;Pfu5em#R1b1Ex9uUMWwYe(dDAvI3lKM)P_F6&_u(vbhI}v4S4jL(kear32aEj +zlPT2BD$zm!6E~1_OfR7SB2}S^0UN2-i-B=^?Fy}or%C)rs*oO`HaGeOY;aN)g9c+7 +zuzK145gIC%o8UzyJcI}%j(ZYtpd(5QqX7>Xk~c`8nXVfR{7|zEK^e!yX;*VsTvZiN +z&xVHL3RtcU&`8}vKc%ESP+8jRmLoFU1b|!+G&>BP&P`wLysD;M8EwTt@{5S~A)Au; +zy{o&k3pK)hAzgB^iFCbLPROya91AHJBR-y|Clm@oF_^w~`y(-58z`8&;9SM&^*S9* +zU0n^K2!u^{wD-0(M3pdo>F#N2NQTHy$Bfn%gq*Wncr4vca!`{S!4BT$qQ;&8>Qm)l +zdrOlJv6f1(7NiI<^oiu?Os5j*RIph|BBxffn4vY6l9N$6tiT~h=4`!Ea!_XVXkRQq +zWrars#p|tzDE-1Zs?}+Q$AYQ~GlZ>!v3ODrQtkmw>y4V>ZftI*9m2zgDq`_Sd@znG +z+IvyO@+wrZcm=BHtV9*fnDkmZsw$o2XGe2jQQubtH}_#f6P~*#6ppD7|+BExk&Tn +z)n1>svbKB}Xv?k$+`%QKDsTbk`1ZS{+uCZp!QAJoQ$MR(Syr`$Csml8aiIwVJUJ@JUF +z|B})vUVT~#lOGxaf%#P6Rcr{aS9Psb^J^J|3^+n;qy+wt3@wF7jfd8XoZlwX==r|C_Zw}WLyF=K($%dg7HU! +z?OG5lcrD0X!hS6XW?u_}U!k=i4AacaQWN2RFy^XLfU6`ec1P9I40qpZcN1;r0DeO0QU`(c$Rn?CWj{G+?Bx#{Z{G +zXEjC%`&nM&^?O55Hh_20V##c^;hLa|h#I6M7#d}Hda7G+>D9DVjE2#b#8OGpzEMaa +z<6<7AC9(u@XLF3w5FU&~{SY3dp=iAli)0@YBNm1V1E^b8^CBE26t54ZllA@4L_MD8 +zn0zYnf2n#r3+t1EYW<)xP=9!05dSBWKTcDl@SDvB`ocH-OqdKgIRG{w(@mn=u(z{jY!g^uKmpnPmE3|M=^F?Gaqk +z|JvvQ{8LZ=>)+h^Uo5w54*jpW-zEL;WZv_Ch4jDvank<^^Q;j4ukCVP(*N4={i&$` +z&BXpUkN$VmYr*&V)VbJWn)zO-wZp5+*wQd-^rr?^-l`@Z`Lsx +z8ts@&acy!={cp|q+yBm+S7p`zR+jX?6Y-2m|64Pa?SE^gsQquv6u1Aa$zuO&Hzwn$ +z|E(E6`(N9xOfLOz&G_5@WHWjC$+SdTQsPnZSig8l-S{f^owl_m3CXK3Bo2lcZ=go-M +zl9Jc3)#rGcDjHr6Z{F(N=HjV$p>6mxK{{QVu9g(KlX(lDk3ts@>SWxg=e0uzf-JHk +zSDR9hJ*ut`Cn@JI +zL`4h4I==c@`}H6%oor@_KS#bVqc)Z-)f26ZrSd@rU2I9Ay19*Nr_hsC|0@IuA4?m# +z^uJY==KCM!)mD|_KTOCoYW*({DL?h}zYOxJrT^tqaZ2icMc@tkU)!M=Fa58%v0~|e +z?K?4f^uK(jj+g#76JAUDU!%H!;c3d~e;K?JWZpX-YTevDD5-Qe-)Owvj{sTj{T@ +zHOGIb^_A>@C*&Ee{?~9P=aka{i_lLgJ+NU)PDNd?r30cqIP+u=bJz;=_SZ$q=XtBW{z}kKjJg!gG9Y1ILUwHH +z##up~C+bQ{>d9h~mS-S|#Jb67f0maDgOg;Dt&j7YZaT}$s@u*cCY1Eswrk1M(sAeD +zixX?6JPFp93BY4XxjtFen6ZSXn4AkwAu4oEvg2#~Jc{KgFP(h$y-pr^zl^$hO{AD; +z{k$&AlyvkZ9ewGsd$Q^O@&6SpQ;yjJJiGqC(qCCyX^H<_Rnq@Y$TM2~zfK!dPy4UK +zKBaX3!gQR9ntv1cqTWB#fQ*yY-=?`D>HITxWYTE-g?T$p`u;4~Eou7=8X6r_Q$^RW +zL%cbHKGW9AE4}l*{(0l9nz!v~DJaNfR-ELcoS$Txk-StQloX4skQe7tO`Z{*GcVI6 +zt-B3RpISQitgL-v!#R(J&yRbzOA7MI!skb=AfIH+zYw)JCDZX$iW{cgXks;Ill*h$ +z{4#33*~&f9dT%Z;l(gQPMeA*76vGLFk*m$TkSNa9)rQ%+T1urb8!4Pt^QbwU8kc(e +zQ%PAKzlsYctvo9ZCi}+)XwWB)N5xbzHXi5*#SbdJb+w;iR%&P7+fa +zlF{j4rzH+dHSvTT3r6%i_)1fB>O5KIe>Gg$SBy4t%>U|nepCDhf345&FU|jncq%Hg +z*l7-GcA819J6A(VC6V$vDk>Z^**Pw9@~29ZhY0%>h)Y^}qzWG_WB_bsj|qYi2rz +z5s?K8MMnebiYHU)!L+Q($h9ab9ic?rTDMg^Fv$PMM7CqZ)B?r3Z5SlkDuiSQ!`Ye3)PzCcgFgL?WFnbLxIZ8@a1t+lbk +zF_Uij5vZ7gpb2r|RlgEfF2}+cu8Im)J+wv;7i@2A8W&1o_Qmk#Sk@C<7U=H5D_yX) +zqootE7x?W!Ev;<uREd|gYz2FhQdo{k$+ZMi8FF^w+7t{BbR=d33M8=% +zrMj>zhB+NEozGG^-Y0k%?|Nj +zMuE$uWHvfw&0wU))QH5W0~5Um`SCz#6~cdWm_8EkYIQUf5xN&R8vd*P}=5b*# +z!n#A4jNh;lHMjOOHFh^QE@}%PVaf_?D4>h-IVxcrw*{`YTA`M#j9nsGe<$XNU4+yK;+4gg9UfYJsa +z7rsjyfU#}>?B#!czkG3I%$)XrRaIvDzv|kO{m+Cvn*ARg^4#WskPo>!lTs)myEB;q +zLZ*@x;8b`r%zt*XS#jFPZU0+op8qwK)us7A5syCq*&Vbw=ReMuaoXc=rD;E<9{c$( +zMou1k8@bni%lUuxJYQ-4PsF3mfAQjvTs(m1&BO=z_YyCd^iPiYUz7uYocjMN^ZH*~ +zRb5*DC*&#V|4aJ+lK#J>{~wM1ze~GC1;H&UdD;NAhGj`n^FIRMYtcBJ0pzHDGaUkm +z(%5*M0tiD_ItnNq1(c2g3TWv|brfJP|LX);3>h=m{=e2=ZI=K2)g}9%33)0iHg4?b +z#3D);p51|trq)2urcFTKd2I_gyCL_YK&d{s(C`tg?zc|!^WObB}kH>#xB +z%^fj$7{&WxX#kFZGID3j~nYYc6YX!a{GO7WsM~>1~6c*n1MlMJ@(J$7=QcuuSbwAMjN^He?H6n_m|>-Ovt0@ +z|MXi1a%ul)&P=*L`n9C_n<9^K{>vL6zJ9UWfH^*|rY7V3$B$|LSIw)forY?P4T#u?|fK=PoiG{C@UZTzn^foyCK5vz?9-3%!qw=_^YD9hpJIUJT=GCI|2$>iTN9OL- +zW$tRoQO24JK_;T>BW=$*Fk2yvcubm+NS&iBx;CsNQF#JUlw%MfyQ3_Wuz}x@A#6;k +zN0AsRA3)_Q5)1Wu)wrb<0@18qy_MdINIdGrT*8#W5sJuC41<}BLfsaK=+HQ3qFJrs +zI_(-o&w5O8RaHcVRssK?kAK!x`|GObqf|U9sc>Z?npF}c#`m$~|FE-a4-~JBT=IX- +zJhT5#b#2YO691ow2aERs7<9PpR6;A-+Ykx*oJ87vmF)IXoJIfYb+o3C1Xob12-g62 +zpbjRbsETK9ox@QM%HEKy@*2bOP#O*mKwXfO;TJACf;_nDw2Jy=xNsB#^WxHINQ#B= +zuc7pytd&#Iu#y^zr&A~@N8`y6gm)WKB&En|J%ZM{ +zd-DT#tE%w(EBy13zoriVziQs(;%;{HpRWAHYa_?}2OOE@Km5Pa{GW(tCTgW(2E92K +zO8{~x6^9$~@Pgelf~QqoYWjnTe$d;4oS1H&>2FDk%%qLj_EX6?#C5wstfbin44FbC|M4 +zYq7uz5ZE#m#3eg>P?%lFn{w##WCIqv0I)Ec32Kx!C6?acm}&UlpC;U|oY)S)Q9KIM +z3xb1@czkU-K})tvA>70Yhl2@O4OD{j&RWL$x}II39ZN_1H$OXu7znOH&& +zORhwhs)Mf!)G;> +zR6?mtUt=;R=WsaW&Gt0QWSqwy+f&JWGroDm;e2hRh8!P +zpI2Mb|4z)aU`BIi6R{zLQAS;Ti`rV7kh8p^VtG|lMMZOOGg`5v7jNSIULWcqQcp!i +zpo3TiIfqiIL|sM2@bIvAxXK$(4p#JbS8RZa{7{npET_VfH=GJP7djR|8vG+m;f0Q} +z1t}#Jkr#3`L>*BWP|+JU=^(L!$O}7fLD3L}^oSH2OiP3Ef(lv(5u6sl-Nh&=M;e@J +zY6Mg7kSwR1XecQUG>Gt0x=&D}Gy*!NdT&Tooe1Q)1}ALkE8x8Xpv2;)grIo2ye_S* +zZ*Vrnu^1OimG|PzP86bVtQ7RH9)*TL$&hO3>uo8Y549|)pnYD@9}kZ#bT}4-mGwvo +zH#niRgr)r?Mo*cZoS?RMkZ4W|!ZpIqg$txSI_6xcNt6qe=pd3J7*0*?Ln;EDZG)4~ +ze{Ui-NPAr&EnHB6o3?|1SSl`D(60^b6qQ7YuG1lWAEQCMX@x3f`A(ApFp| +za7jEW1BP%Oo;PFenQ^>zTCd2%&V`-q7ey}4p0yliPN}r&T-ZbY&94mJMZ_X;2~W0W +z_A9?~n8U&T7Wa()$gdQB$9wcxNXAfhYrpd=8^W7mC4~z%(I0u1g6RVDqKW=6lv+^1 +zhK(f{Dv3(5v=m|E*G^utkDyRsCf>JE$|4lgD!gR@+gO3FXn_j!w>&GLT1)4`E~>rk +zq*hb8yU%80fUW1k^t8bdobgZu!Mvkwp!RrJj_3_({6s9sco60yc;XJq-k6-KU~EX$ +zWeW^FO(TdG%%Kn&0c3h|wvb9np|x_d;($T8H!6rHw!g}`a8Y^?_0lg^sPnE{4Mk1$ +zHZAM1uaDwgf3riZ5|U$ZogzgpeG>+cR$=C50+%u|G`8jto;Fko?Ep(|aB{H?GiO}6 +zKIk|P&Y4))i&-joVIX-!2rm>V)GtTk!wAnsDFx~^t{exQJE|m#^L~s;{3RB449IdA +z^5C2)L=_XDQBqP~)XVhhf(qS`i{4_VI^cs=sRxk@8@X~lDXZy7O7$+NNDyE_aUYRX +zRqGY*Z4y@Cr0k4rNH`r1qI|>sNyk#C0r?y{xD99{84%1mlc@kz*5gEeHh^5TpB{oX +zw>EZ4+)LChF6Vy8>0!`&lXAl4gm==Cn-&72`Z)}DwY +zle!Xh1ZY>ptpcx1AW6-J%M!Q9%q=JwhOxGVgjQ*XlDXMhr0G@;WttppMPQULB(108 +zo6iK9tItlmc`{d+pf+=+5tHo@CQIY&?5DFMt;)c&U@{Cy5m?6YFHCDlawH;BNFItu +z!pvG$Bv3EvNhcDRCDF+^%xeX{17uI;z9SxsjOY^;cP<`Mh_yXgk)ch}0otZ^3XNy5 +zHpLyVnNlg-O4bR0@?mM(Co;S-RSC<+TouM_`7plaz+#~9%vv7$3p3s{m&bMbDg)#d +zH8db6>46i#i0KC~<(T{^e5z?8^vjqOm3TU-PeBfgx9}+=Od9L7;8Vl+i%if$8AYxR +zXXyh_IYkKU4KY3hI?o82eJ#cZgaM(dVlV)aL^G^{c=_QI8yCiM1gu_&&3J7}CBZI4 +zRzb*MbrP&$+8oqmRFk~UrE(^$o4yhygh`H<`r~P; +zkWMNMbl;74gG8xA6gXCOTq_1grL~k(Wt`7R6+p`%O;_#BaH1g@oLU>4RemStG~v`x +zgLD3TC#qOT_b3Slp&G?Rf`1cR7lVqJn7q_5gTAVY$|~gZ)%o`alb4W`gcH~ZvwFdM +z9a;^k){G>I5PJmbsxtnaD$^DarQ1SOI?OEa$)f+)RW4&}BbWZ)Uu%y4GtXbT|94`Z +zlKy`R>;H9yQ+@{l1?m4a1zqU~Kv1Gmtv`Dyss2l<|GYH!{SXWT6E0|`>95ItX29z* +zNO(>`oh+4(55APg2Rgfg%5|2-j}MFv19l6KDs2$gRm{N}S3q5vybBz5l|+<&x){+a +z7+1!XP($Dm?TEkt&_Gg_5d;3|Tp2 +z=9p+6 +z5QAY4T8{Z4_+7a0M$1>RqRUP4Gn-(lBck}I#7+C`I-#!;&<%a1unaMa`4*C5p!nj& +zc*qmXwJk%JWBP*Qmr7Ve3*;gQhhShBMFVIgo+exFG%WpgH4{^F1@j`Y6;j(G_JvRg +zHAe2nTXjrisL~;6C}Xzje1PHuNb4%=<3K!(k;xS0985$&v_Yh{Y(l%*(n--6j&Q|< +zmWxVL;glv!u&_#$Of;zitvaCMpmeMPHqvYGgii5-Va_59ybid86qXV|C8;Waohay0ccMiN6}MSdTL +zsLEOsPKcOik0?IE1QJC^3oGJ$+`<Lu45@0XJp +z53O=Ctx6Fks)mL}Jg6}iPR^F4P&y^oJDRvw57YKPHoIm9r2eE5l8Eb!L}zOu^owrL`l_WjnHbCqzb;?}qru0-2Lj7$t@oQk1#P5E6F?+XN+& +ziq}Dw@{Z2(p039B^4=wl9ZP!-w9y@~1`*wgdL29vBw4bDK?>?zbYzom__5R)pkM$~7#h$o)RI +zZRCEP`+bIC7@HXzn{7Ye-#_PZ{yFDy9*^_7KA*4m^To07^Qpy(g`LIs&o?gj$hzoD +z+?SlS-f}qYv8&>25|B}FiYd%5nj(f9F+(2SBf9myoI&N(_G5-A1{9kE# +zW;**Qh6vLhx_U~*var@(WOk0VZh6(Oqh_(-=<@Ff*I+_>Sg4@WcP#mjKW;oMZ&ZL$ +z9+mm3(O)K*N0pEFs=rT4$O>o{9#YBmupBcomOO1!{-JwS`GkG*^%H?caY6sxeeyTJ +z#{w`vjg$9!b;A44y?|8W#N9>H{y!4KgN74F$KPyUFFeR|`B +zNf5SIHTVVgQG(poWwC_ckGz^+b-akAeC}}cc@-OX|9RAuEJ&)FbPO-naiu&Cg4Eij+-7=AJ9yFE^O|Y@nc;cm1Nt#kNMyvx4~=We}Nf +zDW3#It>@*J#IJT3YKR@XR8cwUqWu2u^}SPH#%k+TqInZ+8~RQq9`DF{R`?I#?cHs_ +zd%j0F_@m7spDf}1L$RRJW8)VRYyLSJ{yJf3ca2-9O3Ug6?}hr(Q{}@dF}&hu9X!q} +ztsje2J1*WJcs%ok6K7q}xj0#Y<8Mt2P8t05DB!)U9D7&Nt+>lY<$Rjt9|i3vFZ0h$ +z{7sbur(D&#A+#}R+8^UP@pZ^zr6NkkL?o^we)kJ0p$wc)aie9D7ww=%ev&feo|Jhd2nTHqOh_x{a2*Ph|Wli$8B1Uy`e>U#t^ +z9dVQHCJq;jtT8B5n~=L2!Fw`I*X7o~DcqyWw+6=SUn<<@{*gPFHouaHIX*VSslIUA +z%ZFb@%H34}0t_Ge--^i`Fyb_R?FejhjMK7z>e}_VrlvN3nsYIwkyBT`z +zDogj{e9F*FrHK5$6)i20xxE+2OR=m5E_gSpq-f%p!sOB$fgpAH*7C%7yIDJsb@)?b +zFF&ra=}0-B`;LhiM5zhbClM3Mp23Vy3$_fXYio5s(8JWH9{X^tV-v-x9?j9W&9h-U +zGBshC<+<551QguQ(rU5_fh#zT#HR(-sd6=fuEcYQ{P$Mzl*buh(cjX_T1-@y=>L{< +zJp60wV65KL`NJN0T|dPilqi#_kT4MY}E8gdr&K6 +z{$X&^Bn@0xRaI71H;88xW!ygEc9qD`exIY`s(a%$OYBLj|ECL&V9}%gJcU*Mi!JxR +z+ar~=-k-b5YsHVVP>;MjyslflX?a)?2~K^P@TIu48e`%E`ublWcJj>o~&2k6m&d{hk-^;5WTxW~94*JaPERcQhTloKjDa$J}kZnDRn`v(xB4 +z<*t^2PBMbO3^4-sTwgg~k#BVlcKwv-eZ|bY{`2PF6-u6UziMd%y9SWHomC(H@5be* +zy8AuHJo0~DbFq?2;119iZhQyt6p`fLc*J+=sP53`d7`*>|HkS1rMuOJCz>qeDetZs +z{nPo>SV_6%F*N5^w3Hv>_=Eg`F7i24|M>B}Zwq^A+xzDpT?N@&$fnl#B{WJu6QD}k +zzTx|HHahu}L(%Q2@qsavhOj3JKcw~C)^&>*{zC}d=ygYQmYeU^mpgwVe%_ZJdK1&W +zP@N3_I`U9+>YsTRbN}6`Vl}&8XI6!=0(Ro}Bh{jIzC5@o>1pHnD4NTuU5@A0kFzVu +zrqa*VZ#|9v5%h1oFv$C3K*WE1UYuJpD+Vpki-J-vl23m07@Jqhvx*CU{pIzJh<=AY +zJm{3NdSFYk{!%CTdS~=wi{N9Ck`paW0A_G{FTPOXq%ZT;jfnIQF>pBiW~W0g^&d5&mM-sJ^jZ@2s_&gF-F}6~!4A=9MU6 +zMO0sDm~-0Ip80%rFZT2D5!6A?d05oWw$eH-J!jx_`F`x;?ZAiGrw%!hrM9l8qwcy^ +zEsx3)Wq1^RRo>IV&G{NkaYY(zjGA5e>fPN__W09Ttt5A^k7`xs_HNeaih|0Nu6s%_ +zKNG(lnkMhrOEaxJXnZL>_)cCJbFs)hNa6E% +zT@LqW+k=0!5)}sx0{mlIkgJ`!FF!i)KfXnXS$XAoqO`5OieIo#>&b1x&B`|~^{%Vx +z9OL#cy7yD=Y1PZWDpOpgF~eV8uI;_xU$xNJmBuDpAnd^n`>&p34!I?MfKD`{uHC(T->-lCh_Ia{T$>(o; +zPut4b!T1LqttmpkmXz|jv*z+X8UK#TS^YS-BUe`Vnr{8`R~b`Q?r4uxz3%ibJ5ta8 +ziO=#78(mzagk`Ii|LL_pqP^P#?^$;(ZHa+e59g7=j{?dH(*WdH;7s~l05xD`a;q6aaO_o}X((z?V`ER2A;@uUqD1zkv@Wz)vA3-rSLCR1KT +zz}KN*c7B&S0<%5*Y(rThhZfeRZQq}PTroE>lAy90u*_@V=V&0B@e3R;<&+B_D0bJK +zhj*lPT}gWwqzmdWuy+VtNsGPmw%ZvEScqRR=<;!>CLFD?x7AL~VK1Ns8ka|tzNUe# +znJ$A)AQD3DGLs5NAxP`SLJAHVY0dCng#z;2by?F#7~R9ZiyRn#YaP +z<&mH148_Lf6rZFAl+^*k`g*3?78=T;%$l(wv>YH(FM?#M?aS;Wlsf~Ndko_9kpB1X +zgYi)JnVKBa{YgH6{n{)z-6OG}bi0{JorRZz0%kF$Gkd?9s8hZRUyNtVk@Srm(|QWI +zE0!I)srH6`Z7x&rUn(e<(vqk?S3yb|Ein0x+^Z}HQvjmA4JDMrYP1&NyNn76j)iFF +zY%`naT#lp==X2BktH)CZ0aw(v2+jgqL8K(C_I?gdq7mHJpn;xikdQb)O-dkkC};q{ +zcbFoOtxQ@ob8gz4NR-F{4{DO3hlZCg(-$QKnpV2aLbB9+T7lx5D7Ev6W#8HIyy>`l +zqt`3~!c07L;k~ePL;yYqSf)c@HIZ_0A@KQM&4=@ja@JPQEfJOY%a1T>;h( +z0Ubj2-j&!YXTMNdwEpdoy#qV|WWMlA9UES}G-Mw$QHBBGbKss4YcoR_X5J7n_oDEA +z5`F7seNyQk6Hr8hz@+e*=s|5#^9G_0ut$_b$2kl)v9`vOiQ;oBQ39q&7kXd$EyDa^ +zSGnH&P#E5+=l$=|L8!lzn;WewolT#lu@BI*rr%dJ%Ao$+`v6_G;z`_Y-K?+n!SYuD +zz5RtIVq<-=xfUzI!nr$xCPKGwa7f +zpr?JvS{_>G=wp-h=%W-gHZPz{Fe`ZgD?rO+D!e6dKKjb7M@hh=W +z%C2s*0LD5<0_g6*rCXDvk{*^rHhu#qb09yS(W=&td#y$iVr{X)_zvKo$Y13Y& +zGJ1|&q$=u%48f!n0H=cCdtVCBdbByTB7%sP1AH=N9DoH5R}?{8wUd(S9fOF?RIgPv +zQvmg&RMP%nB%gpT!@I**Mr<1kRhM^c+{HyDYb=f8b3sJ33<>diZ$l1ypQs{e +zc`06T-epD{OP_#Kr*M%9ld%$z`Yz_|78PBP8@|ylXm+@auomLtpb?w5_S#4~n84|< +zUies>0F+W^Vhpt1-Hk096064uepqRprXr6bXKNtMbkIJwEmM`dNi0 +zZ(5?CchlYk$|;Olm&{iH$Os{t_q_&GHF`~$3OnV^LE89eN7JW3nsH8!z>AK2!{Q3Ay_6J2BEJ@u%|SBj!BSN+_eHwpP83`=lNhr +zC^L#HJA9R$b{K(`$qif0Y$72y=>&A>iv_bbQ6U}5T56w}7P&oMq45nB3}_%p_dg?Q +zdC-8l&Fig3;ti}uLSs$=KxG#S*l(>9!N3&`mfq#CLZ_f?2G-5GoVA?etd-J(@YUFB +zqoDTpsxGo4YC$|IOf(RSpl}1{q0rfAM|SA$@NTRhi?Tav27p6E^7G{D9F2|p0-=!Q +zT#!R>uu(I4%5t$6s>j+lv33~N@{(C;cBMrS{e+>eFSmc1@XUvM?QJR->7lm1$rQtN +zR%>8~%Y*4D7mK0aLs>~ar?{LCCQ<(ap;|yLXGhGOSOGg^Z@fzkIB6E+hgeBlx5tu) +zJj_(GoAJ^px~2a?E4Xi!wf!TxjNZ{B1BcgQ*t?`yC3VnYktId10aUS5^4-Nud%K!R +z#VdH1wO5g2pa3{Md)%)X(k^Z71Zh9lq%zqbK{tZ#w@H|4u3Sjy#ph~o;*z&7R}QGn +zI=tYlG>k`@~fdRjoko#={-^GM=Bl^?O9m^9Ff(p&s2Qt1kj6)?KBk{0h +z$ylA?uogTUP7NRdO_>L_?ifbIPc>HmcQgRHIPMrb-#F^qBw$Uf{6jeuV6$jj$jUYl +z7q)KspROKrc>xCUn_47nglO|>n_F{>*0Z?ueAkta!$^AC +zMHoOg;t_}eFM^>K2aTX~7)qXn(}rV_%Te7(y!BjY8y?W)H_2mayU3;!p@avpPTe8D2tWfI>?27`ppra8%kZrCSYjQK2CnDy-fUsU#;<$x!Ixj +z4EKNlfVpe$hdhX<41ySYlThHYOpnLtof?r)ngaBIj5G!|Z?@_}g7)w*1iUY{Kp;0_ +zZn8XMGypGFRUaxLq?4xTS9-i+$f0NX(fh@90C#FA!nEAVkn|{O*qaWaRCgwQr_ULIt1o9WHo?fijqK6% +z7v`&3a%J_jT+n&KB>Zq``&bGO?P@bIS*ozwt0>QWau5JWVW|ymzhEkwqmamssmnyq!ZJFnu#o;BQq3(1Rms$ +zWcnz&`T}>7At$~Pj+|wMN5X*sWpT}-L5%7Be3@F^#&SxMnG3fvss7T +zZZ8yfc6H(J6*ujd-|`3X$Y_E+a_1fK_xKkQI)f$mM4yH^lHM=14xK>luQ6=H8^o>)R<`Gi;!IU`A8hB@ +zQb!#O{Y{b>0g&qrm;DFE@_iW0AlA_3FzHAp1%6a5)O@f3a#(O0tAsNKlzWJNj0D|H? +zY7>iP%+M4-8}aNp+P`PT?l1(G5YRbn`|yReu$F6Qlp=ad+yB+86Mej&-gX3o*PLe=utZpMF9q0p>M%e*d{T=Ex +z&dm5eMbzQHBWKzjl_KhF{csd$-uKI39^w%+Qw;uCbG>4{R}%&qxT$9Ex3$qa%LfPT +zkD`g`y10Gd(MqLQtbgZv0b31$h1MZoMi)%rweP$=Y?Zjeh{7df1Dn!< +z8eh+nQcYlbh?33KJ-?j9^r;8&NeCP^Z|GY8O?6+L{etA2y;x}O-dNk@mXx#5)N3}= +zED2ksKu@REdI57w^%yMma?$#QAMw7(u;p$kHe=9Sf+?<8gQAa@hvbgF|1JIGV;~B$ +z%P1$#`48!hA{lF`W^624*z|kIO4WDgP`G;-t=Adm&tUu7R5sW8;ouPvc57c6^B|Sx +z6tNiXSO?zA0go*X2BIU@y3K@q4hap$>Jj9Fn!xWs3>jO%+OY1b$G@BatunuxYPwDI +z2s43`ZK#%ebKbYx*(>SVPZ({rd0Tp2J|^Fl@c@A5G_Xs$Ai`_eND=x@-QG(AMgNpc +zGBz4S;t!w_d*tYNUpwGF(AlgUl~){69E?_^FKB+7!?zwG1Xuc;P;6#V>L?O{4fJD; +z1`veV4BswJw$3J1th#QNXFjfLO7R3~=W~)V$Ad6)B`4BonzeBv_6O=!%snL(w;u$7e~61dG$RG{ofC;zPtDYxtN4-klDyObWQV0Mmcx()gQIFbh7D;hqklo9Ia8**s&gZj +z5MD{h#qkPUI_kh=wAT@C<^1-rD{!CzuLpiPN(R`j8!{aIr`@_Fg5mlT0iR!w&p+1{`Ri0Z6n +z&93TExBE~?>Tcjs;5`{kb8a|HYBFOo4SNAYgM^1{-TsUQ)l*15P$5 +z+ksQrD$G8NT-{bN>;Q9w9??qF{od$EQ{9^r=~gOL5!>I=ogu86(dS*3v!snVpLOA* +z7;)R_oO3B)DvZu{4DGiJo;3l4Ojo(F!{{{k!>#uu2S&Rj0-HImMMx6B(y=H&=#fXw +zG8aUH1EKpY20VMe4a<66LCM3jcbjqf&P;9!@gh5vHm@n+I1@&Qrm;xTO@9;_`zz_r +zoe6|5!1*`ROYgZ9*yEDM>AB=3OdcLvA4)!;!KzkjJPPEwU1Ne<*jCxWtHrZ`hJjv7 +z{FPM$dv&TagWxskm~?5^8A5ND6M$HON4C_9^JSB47G0 +zl*`@(uqwOeL6fK;QE?IOe +zRdCyIVtIrY%Wodau02pkDO$6(&Ct;8;lCu`wW9=(g`+=HWUipoZ|gGuyRLg7Oo&uJ +zyqmO`gKc7_cz{UE?*5KGV(7tCyrLeJf=)u#FsPzzzt)x+bXnt4EleVK%q>|bVjdP! +z${73$LxnMo)19Fk-}AmoM7WW3sc%4dzwYSQgU$Ot<&6d%mEEa#Cnf6FrZ9eCw1sIb +zXftbek}VTK`C{)k9=h-+CQ$<62<^C-gPwE_UA$F>7O3B!pB>b6xBTw_Mni*fx#iaU +zVh3$Z0_c<#)4LpxwP`ZhmI2sf574ge{h49pI`~VAX%L!60D7KB=*Z~8`dR@$|fNlohB*$0Cd)IL2@iUlDVC&~Zu*{|5D-AjZyRE(BN0{6ahv3E0g{=5uO +zsw`O6*eIOW25%_QuxhL5r +z55>49w^@~kG+?@#cP5L&=T8@I^kaZ*mJ{d-sFhpho7iO4$}X6_t)bJz-uk^&hw+>( +zACKiygm|$;vGbnATZ4(Jj@0FIQgTor#WtCDYp1r{F{l*fTC8cL$UG2KMk8@!&rCJ_ +zSdEY;PN)V3wADBZpn)F`TW7fSD;F*lv8iwZJ!n~vCP8@8MN3on=gInlY +zY+pJw=w-=9W&z9>^$RrFsLp~+q?ze5TmDEvnRHQhgbP`kF<1)1mXV7wU +zQ7eUiYWr!9Lm+9?%hdOvYt&34%mq^>0HCiKqjiC;eo3BvfqOn^9P+{E;003o1V^M)aFycPp#eQ0B$_iQ7p4y-sbSevCo-QY(O(rA} +z>e`!@;Yaw7pC60*m$2*#0UjQ5)tNGh%i4NPBzG99V)Pa?oJ9eeVOA9tVN`gle4XB( +zh;e9B-Mr@!BJFEa@ghARMJE1{PYxqC;KjrDr@D`7Lgo)a$hYv#4`PgaizM1@&~}Y9 +z78<-(rbwl)7s%8~)KC*8v>?ziMqahqEZJ*ZB0D_PS}Uwi9-ciNvc4$btL!ra9PUC( +zKu7p|3N&9cHTL`7x0yLO&8qJNxUkmK*#?^HfAhsdSDX8=*}&1nT82y;gSEm`hq0KS +z645N?4&qnnq1clO^*R425UQg`*vUJTzP?k9)&!3Z3!tnR)3L&Ohf{di12%JpwXy=G +z4~%ShjG9i%>~A@a5?CV=t)qL%SOyLnp<6KS95l+OYOIY^g5v0t?$M2=Ai{436|(V{ +zt@|Idqy4T78$aiKd%B6r>auRmiMTltIIcR$EAthDCN&h|K1zu*H*>5Vj97%dHdxqx +z)kK{$V+P`kTBy#2 +z%}ql)4$!h)jzS`ht4;5}I{9iWG2J0=)7{x(aO83d(oZ#l-d8+NH#ma>b>%oau%}~- +z#Shko7-jV?XlX8Rc*n`uoInEJXp)8f!uDWdP0%dTw!EoF!+x3+Ad~#>r?S9(3F!VS +zoeO7tYFEr$Vs)rtaEfRbl(k&lS9V5Rj2X15#Kl_6Omf3&6uj)*vSxdhUz|j4{~Op4 +zO&?^etH!2@ZBLi8!FcZUJytIh3qyv?s`>#C)DK@F?0DGLL|6c$0j>v|TU}FBL&iks +zyYe5Rjo|FVLfQ`VX0}$WVcOe+Z4of2c*=^sk)gN- +zu80Ag_h^k*)Y)rcj-r@b1!=6q?P)Xdr{^M?fE|7)@Rke!p&nt2KS*c!yz$-Qvq$LB +zD)REA%N!NLX~Y7FvSw-Wp{=^yq%%TyzW#8x0EOC{7*)?j&1n0r_6uVh*QecvyA&a- +zo9&Ikq+ENz;m~*YKV!1D5lw12HM{vz0EdP>r%-6ZWCNZJL&ymv7j;uVF5R*2I(gE1 +z`+UIK2U8Bo<2NMl-s8A$pnvaza5o_cYpM{`2%^v5;EwH1D*J{C*-sS`86Sg@av| +zHzo_VW~v!Xy-Z}nah}zEuww{|`3o39!sdQSy+}SVy*U*^Oo-w9oi`xij)EM%cl6Q5 +zkVk62>M=K09`qgo0XB@yeAh-3g>39^uSp;tqeQH!p4~bvLB~^|mnQMVMA|A09d(_cn%TU-@}G8n>>4SAY!bTI}wV@L^3f2IyRD +zRhmTyU(#SiO_Wkg#dbG>V-wIJX3e|P6dtEJ1Z3^g%h-SUhKb=oCzSRdGjxx_Ot7sj +zTrH}p<~wwT%ie5%zd6T?M6znwKTs@i`*UR;FdIDCIPG_kCU36>B+e<8HxZXCm8nVw +z2LyVYrR6O@;4PhjInV%CAcc@S6JkZ$ds3B-0a4h#u(#w)&=ue{ItWxpyT;D>(cx7X9C+ej^!W+^g};{^q$kfOF9BVL3Y->p_Wq0NET@X8(>Q +zHTjKI^UxyBBN+p&qM4VQ2>INujEjI8IxKqqwcB?;e(@6Ofnm~>OH=fvRQq0}9;H*1 +zK%j;ID%eG)C*LPqg=A|5Z@3{9))9Ion85KN>ZNB{PEA{Xaf5)Bc({9rsBZYKR63xp +zY&j+buG9Dsy7sp~NN)|gM4kogS4=jV0Gz5MBZww)dh`B`xriY0l3$r$;0vqHQ7)RI +zyj|VOH}TZ3H%uC-GwJ};L0{(sP7(w+YKAO>g)ha-v52-`+$PbaIS;2*>`pxT4QQ$5 +zy-dhj#RxnIc_gs9o?Fs6pI0it>s+&*Idii|0tTl>K3+VY+0Mx*@xU%V(vVMFmPmQes8k15jit2?N$r%SZ5Tg +zrzPfhzlc}Ft2&g=EMeM02W)}KNF{z^*(Nrj0NW3aG@m|Mga;81H;T){wJzw);c5g~ +z8nqQ3b~ByCbZXOf`z>pv4eHh6zYVW)@WJdO=WONRL=?82G?h>Ss0SMRUcD2@66Qqf +z?Y14HGs%B0{=IZ589)^oEuAcLWE?TwI$`d#L%I3?aT9uAtzt&ck@);Tds7y_xWjO8 +zhqkq)s^h4Zx}x7qDcpCiCe8yXHc~EYR}XpJWlYa)z5N%?ALe&+Gosgo_C)Mij@$Db +z_T%yMYVH|Kr)>-sr`U`N7;{x`{)~7%kaYy>#|(4=vS-%kC6!~X(i`mfo_x1e1GeNk +zHXRW|=h{>T{Pz(LGjsR6-^}8UNX8kNmujhJ&YYP-1;%*KhY_5`GqSTVP3nZw`P*%cog~yT46#`NZRe~T^+KW-*AqzWnAZ`@7k4y!t%kgee;{ +zlbV@9HD8;X&ui`E1yek2c+O8bIz^st{b)7t>Xz$yOW{hFN4Bb`!O2&HF09#%UtPIn +z4L1Kst-5z23~=Yf5a}V5_^0vYm8|gxa`7HFU4HKcpQ7E>NIQM|GFKyS;`IvA?n-wYegZI2G4>`;Lu8ve-tSz +zINTp{#^HmdpnPSx%b(*)*9s4U1<%c0_=g*@1$rKzXUxCG+d0`$qdGaK9gfXFhFb6&uA^ +z{HsQXPDlJVr}5~+;Og3q!nU&~@81cyhv7`nJ$-tq$Kspa>%6q3cb_DE;2R6?{PZI5jJ1)Amw(QNmH#E<+^ +zCnXQGKHfUhp;nU03v<6|5OvzEJMD+eo5$lknOptEuM!&;IJ-EmKDqlIbQ(J?<@H`d +zHttW+v#&qFCKG>_UxdwHgmoW$D5*5!Xx)yuKrwSU{;DCV`|Fo>?w+6GbDWQq`(6p^ +zj^_P3I9z{uL;dQrZ^9x2&riP6aO*oO7k%EbyZQ^T$nD3E%o8?eiWCoFxttC0%ZJym +zjb5zf{7=^N>DxW2W#rrGtEZ6q`u+1Z{$u&+U*s(J5-4lOA8*e;iA)w+IUC3Uypf)R +z8rdJ+&Y$))Ifj2CB&*wu^8`OE+;b7K7BL?(^%o7f<|tAaC|Q_a+xKzvmN%a=LoVTF +zxp<|z>&F|D8E2IQ$5TF@{4S}c+hJk$%OpMCKrS}-Ca!hU>K*2NL#ECrGg|(EyB48* +zJOjBL_-Zxpjq~4^b3VaQ2A2NNk9jk7zdze8Mcw~&p(W;?ka*5h{x|BC-||IjxlfkY +z^e8JF4~e`ty>NW4?lI?m`<8@@3vlz-QIUGZ2iO0deBz~+kzX=up7GfGLUqogg_5%C +z4>`Gb6br{2^zpT_M<7MKn9PMs(VzT^mTkT$e|-dg@n4!poj4EmcogmAOks;soX2EQ +z>NRK_?A$-r_Wz})UnipR6S2g+^ZRu9A!ZmA`q55y$rgCRnHp-&d*0#HfCuX5U1u~<5uC!rZ +zzkA4`$Iw;(>h-s#7GWII4{(uur_@D1haXc`JGUPd!%gs4bIBC7(34XtY`z{%E=YlN +zcD4MoKE1OjdCI2lQA9yT<8e6^4|t5RAV-Hl$(f0#H{VsD&+&yU24vYOHMdvTYg+_P +zEWa`TuJr8hNt3hA39nM~=cG-zpSg9MK7F3=N)V^jpVs`z2LJP}9d%}%r*Fh~>Ad7L +z)KEqKkvle;^*xLOC!**6*lBEH$%pWbFW}f>io;c>-J??{nP^{)P?I4_%(H4H!V +z`R8KK>9ET9=>9tKW84#*vK;vpZi7h)H%l7|)43g?Drc{HDb(E=J&cG^Z8)a; +zNCoE}sGk*OsGzcLcxvMEc=tVeAIIq*07Tv~HqU2#K*E&s;^$V_%<6x#o2uS*pE?Q;OxA>mGGCB0Y$QI~La@PEieyJBsb8&BzCLWl?4}qJ3~-5x5Nb)%X4R{_Q`m +zJZf@nela=_KX&!L<{Qnsi2{vJGw1?x<}dstvsDd^bGXEAJeeME>o--c4PB9O7=pPD +zofaG7;W=6vB<$_@3Fx$RROVoi?fW%*d0UYoIJTElc0h6 +zdyXy5d*w0W1vtC!y3VSFoACt4C%GMcHEZL9ou>1&gdV2Tw#5gA%#Nyv%vXM8>J%l@J2#k&q~^{!!M7et=5i9hiA)1z!r +zW!4g6_)rB!w3LK?h~477y#HwW+Npi1-f_wA*LLi<6yHY(gkYDku!?dZT~{{AvK +z-KoxDEvcXTR8s$NJF4jURntfJt~d|)s&qeGy~^|P&gC;Ffjq)4=hq=YS^=lNT*}V! +z4i1;TaBqSpYf}3mwp(q>y)Dm{U$5>&4_RFLj@Gdl&M|{s&wJ%RZ*UA=y0ck0TY0xS +z(K|lD(s}yLRZh2LH;a$`N7JbXp;0P$-tZpesP22 +z5?5qhu6y#Qt95Q^DToIe*Hg3n&MlnpJZH50tc@ +zZ>{vNpPTnb;NBu5lL0+kO%~PxwG->73OOA_cialUiHHiAwM*J2YV;mIdEfQS$z{T# +zf9B`sClQ*E|MsGlM{j}muKMVEpNqfvWbzc}iA?TDvAHx^Z`rIaqo)~frLQj4uXbZ( +z^jx&WxX=F{IKs7@7$hwx9$gf+_T{qyY&KMu6&3;eGe8VEplc=k}s1ow=Ik`#kWfDU6;!Bo~?Z8^|*1l +zVYz3kd;Bhc(yJuC+7p<7n3zm_cCOH`x{0W8m!|^Puij61b>3xZMoPB(c}32wgXhRJ +zr)_oyBx#!Tq$BaVhkbv}bstLq2QBF-o-@j=Gh(>eub`Q^cA!WY>O=o(%S=_@x4#F= +z{YoWi&(>_>O6hm5C)LQ_AjLMzUX{*@u|2Lk`1`KW2Q|h=%@4MuAIH@0s;HiwnD}#i +zl|Sz5=d6(*mu}6;C;J+H?~q^m>vmP<8~RZ9VUM%vw`0>kr4Ma3q9l8~<3vgprev90 +zr6V7ZsrR47`{vgx4YUns=u>^v4jth3c$umX!n}!g+Q~kwiRf#3nSvu2jlVaVuEG4j +z#Cf)mx-K3YNfq;~^nD9%6)BEwTbfE*@47L0!rO;~g!2E+QRtbwvV1fwc+svoK)BrD +zi^t}3pYKYlZW4CNXUgm&SJ@}EhdF}PeKW&;JvkY`V`8eS|B&F{ywPv>5@=H2GG*5m +zrK0ERIyYJYKVec2Y%h2ATwAR4I%g4OZ3Y**EBO0+{EfMsb9T4Vt6x!!*9F#UyBZ0X +zMgug>@0~a#pF#;8(|zhVsL~kz*(W|!J8{d_P&P;ZWMzG@-D(w2$5^6*+HA3mqA6KP +zMNz_ns{ZN&2;(PV9DUE#Hoo;>LDk_GC8I9R +zTOfufR#*DUapUoHj+wtN)RO{=w7L0p_2)SevcoB`rH3qnkmmbm&#%h^+%hh7{>x}z +z6_eZyd=i`@HD@eau)QtPt)a?&Nl?Q(B4q;esU^v5NDuU=U7~@*Mf}@22N!`#>qi?G +z^~v&raj3Gro^i$EL7NAw-E{>IiVbLz?y-}ii65JJC$iMMgO%>OM+-kFkZt$zZ`}3( +zKl3g<3HfqGr}{HnM#La-6$dKn9bNLjmWBPkl&pLHOhg3emGtP}1Qu`CElre|>=!@1Y`m~54ZyLlV3QI1NfN#|0yZ^F+`g-SC|kNgM>nEse@&f3Kx +z#}49l@Nr4f^ArF3zRyoTC7w<>+CPw=+tf28#zFV)N%7>q&lf{G +zm!7Y7__%8z{x!S&NZt7JHS$REgD~?usFt_v^WsU^eR$t8CBlp6(bNA9xDoe!-66p} +zvh1(Kl3S0~ICDCF_I3!=fB0^HjfgI6>D7WlxeFwRwCY@3+jBRygwM@b4;-D +zvA~GqfBf?Lc}`Eu97e~E=lL6)_)uae^k1-IR?FM_B`IltZ}vvNO1t;ud#jp~a{eFv +z@Yfl7SCv*TWk>u|X1qKjpknd`cJ~Aq=$h{KeL|&H=$f^*{cK)w%}?mcN=I9taZH+J +znkDZeOBvJWuDO4~G^hW +zq;ipf?eH8sAu!$m-D@vPh*!3OvOF=`EvA_cXtLN`yT9ZXDD3t`Q_pI#SEY-VW +zlIVK5x^;@O8>vBz6V6UNto9!(eEGPdSj7@@&vivM*p;tiC{$B762;|lL+^4+ke9WF +z>Nxop1||fn`l*BRyJdgNZC7EgO7YafNq2&1?f04d2iS{h8Ft()fNqIlaG`Ls +zWRIy<<}0)aOgiSRP}kesO6AuY7K_C{tYmVJxt+3)l|Pwuq)e`XDzq3{3p8RFRYH4;h!Pu6I-OSU9Q-KZDm!0y +zmdj9OfUKv;jr$?+>E3rc_8WxwkkbCMxq>KF{&~l@2RkBAwKH$wV9DF(QEHfaNL21= +zjiBwx(-{^<4iz4GTgbcjftZYStpP$x9;>{Y?|!1a*IL+W1+XKUv1uQX}Et$ +zE8vC=r~ancE_4&j6C`DnT4-SN5u|=r&re;Z;_1<(vW=i^)%96rSNq)Vy3KRssicyg +z{`TC^U5~zjZqG!!%d@;O6(=65h4s;n@#sK|9}0<7>Dy?CrWw5Z+9l(^zsY@q<9HSR +zT-Egt=<{mFcZj8Cz~Ex(J{bA>f*!@(+8SdYOqeJ=B3m$zpZrNNI`3*gZgT=#%*tJO +zsC!ngvp19iQlbzYh4f1Dmh<$p1WYEjYCyE~><-zc#ai-lVSGlRm +z*-nSXd>5YQ$TZoETfK1hvI+k@f|1S`wuYZ|yDWjVFZiz@DnL-Tv&H6<&!~MT+NqJ# +z2vYUP(CB{&|2;hadHB-ImBV*ldT%#f0t>cg`^;JkJD=TPIf#C~X^-iX3J>X==au$R@vv5% +zJlu2`h|8_b$mKH^-CUVTS#vQwXW04kH0j?*X#o;HC{&vudwBNva*UN#WRtn&gJgmv +zmwAp94DEEXv_6dvGI7hM>1N4nj5ts{-IPUfBPY_|KhQ3^Un1`E`~LtMr! +z+GM)0dg!DtYPHR0-Q!-X$?BJ0%9j#exH(`sgDI_D+9UkaveKx$g`%kp9tf6QY!#+# +zMaf537MA)%4KD0>5#t`ZBDGyX&@$pRb2h<=8#9%zhZn?fvlycBNJHL)#xVy{wq;J* +zWc!S>jok6s&%3&rM=nlx+Sgdt+Mi!zdCPUQ=`P|!{h-NCeYKT*4F!eEYy*QXCq_Su +ze_F4@9q#otoepBdtJ^7jz;Bs{_+Y2$l0ku5${ZM2&koXZZLEK3pHka{rDtq&0Fo9R +zwpL)X2?IuE(-^Btl{FY|Lkb&|v;|cWWrRB0TOoB&pPo%qWz=r&YIJ;0DM^D0cz+V? +zRp+zCJ?3L@EJ!^u^T-80V0w +zmi3LBM(fObj)tst_G1mL({2b|N`86&A(fo3N{moZ_j!gxio +z>wV0i&Y +zcj2t9IKbzIn%Ixp#x}-NppPZSMxeYU-Kf?^lvFt)>gMbt`-odlZ=;Gn>1k@paTgw&Y-7X$B(|}jv?c=qC%xdD5L4t+so211 +zoEtM_LFDoVlJ^yrRr>(&UYV5bJJe3$^BRn<%{Ukk@>hBH%l7#I(6WGIb7>i|$a{u< +z=dPS5c6s~B311eN4g{izH#~cf#tDw4I{~pYPdL(6hyxB!cfjFkjo{e33=N>MOb(bV +zseZr7=G5ArlfF98^7Ptn;~)GEqp&CTTFagjgL^`9;Bwex>o=~}cu?EKnmmqbIKI|4 +z*YVl!VIuLYn_D|}Vw65Q5Xv9wfpuz#Zn*YWH(>jVC*->7kOPBfE(a#h9G)1x7t{`P +zwOJgvYCp?MyHF#iLKLiC^A+1X)N`vaZP|jnD*OwfyqEjl=nSZdG$*$S^PH-~Sr%SE +zVmhV?S1~cyiQ-b!a2iEeZR8ZF7X_x7e0Ci^mF_l&nrv}sh4xBDVKE!o{yVOAh~N-S +zwnFN4d)`F0_I|+}} +zw#rw3knp-RRDD)ep>lcw;OR}fGS;mX1wNCmF0Sat>h_YUv&usk;2GIXK=LKe)b3kZ +zj=Y{;yv+BI`Jh0`B^l9v+@@u^N4UvdA!nduE7~wMC0JHHYhmf+R@0A%`ztgn_;PDAoI9b?SmFo +zaHvsCQ@KPqop|=Ab&TYaOMqv#34%HaW$W6KgNt6lP>fXUWz$7;hh(j6cLa12@Kq;) +z!-By4-5TK5MB(MiCCKUF(e5_W3x|`lJDs^mzRf{$HiKBzttA2LzmB>Sqs`f*AK1h_ +z88ME7mxg?eXEMs`#`-3XCXdHFsZX>-JSiiE&|epYoVx%V +zV6@I^rT!{X76bIuT1c`hmBd{YkVlp61#xi+fMf2lZUm^y9<0*hoE5W9d1;{ms*7U?r>i?Nu#L20j!(43noxJ;1+7DLjw70)kBPtDS?c +z>ilBmW<%%crku`(F|~B^Q+6v51YNacf)up{UR%k~<_%k%nxPjUnNp~Go!u>Eltj=> +zdPX7OKA`~>pV5o6MlFA~x&%LAR@%Ywi6hCx$o>>EiFY3R%xK%74-ce9+VNB>xtyL_ +zCj25`ap484X~b!4!tiS71E6_#*NImyM4 +zuQIeE5Q$coai2AYt+~pb4^L2V4yL>4{=Xx#b^d=-p7`O3@nmX}3KStS&UT%)p3Qq2jQ4If~|iVnOw4N&Wm%Jbt|IEw!&%Dj=Q;<6cQ6@V70K2bI6s0(sM1>>>eh7tVF +zg4?3qg=J*tw4s0|IP3;&@li<6{{mi9}HQ^linS4L%)4;2+U7TMg+08pftKmaSuExa_RXuBph +zxOs!H(X`=KlewX@&9K{xXX8#egM3CU_H*0Y9Jh@yE^udYU%2FT?8x?zqC8No@#GYp +zaO%|Zvg6aTRc}6;=*`7hNB32#pr&c%vP5j74vnSUw96@Z7)x9GH{)SOzoz4}ZRZ!7+Qy<*m71nh`-msPPc2Tl}~cy!hBADS38&Go<%cpA6V=i$z>&KBD4 +zPgWa+->lp`XEw>X*3RU1cEWr$F1JqPZpS211E=$?Tn~>DHO{(LewPyx*4*L2D`#}L +z6|szxYp=~Qb=-tn>$v_}1wFle0FQ@L@Jhzd-Yv_Z`|*!`oARKCMPh6)n(di}{_hHerg^+d1-}d>lF}FWkEV_$23#NXjQHTpj=?bT +zqcT45lF2B>X`bc_3nTMVMTsAth@}wy=)s|Qbg*ZdP9^Q(Ku4fsdeW$tvl@lX@*#9r +zo>4txVh$GWlVS>F5q6K#nk|rEmIQ~59hZ^dc$fqeJKA__ee}hF9g>D-29v3o$@t*G +zWPE09d}b&W?1Gz$>hwNy>2KkiMf?hmMf{+IPXtO<5CT*4kjcTO_ +zaPz!GAcSV%3#XTlpwI#yM6ePLr8O~3#>P`5emF6ivhxGsePsT4PA@ytpuI4E%Mje( +zJ>cO7%)IeX4|rbh0R7I!tP*4S1_~( +zjR;-go~{m(O_$4B9@GhDM>yM~s#y+F+f6W|7m*8up$3bht}KxgQ0N2{Ist`F +zgz0?{X)`z5PXj}u@d`@eyV4hAB`APp$*9Im!X@dlG$Inq)9I7`o`dceEP+^sq +zl~$gP#y0-TC=*pxT3JCz=RYuc8uT@4>60wfq|Njb_0)7x^;yQJqJd$NPNu05s+88t +zCasOnHb;5D;P?XphR|o_oT{)`KL!v?&uyY2&g3;e+rr-CX*~aL$oB6F^M9x-5{lI9|Aw~o|4n(k=6}%I +zmDTPG3vRJDhUwiQ9edzsPo&d*cZk>+X8XciO5g%RI79jr1f5BndX~awu?LF=MrumW +z!}wBacA;QWFZD=Hxoz?w^(lO3lW*0)_{L>PHeHIUU26ZF-WP;-7|A}x-j`7nfeo-s +zO)0Ao35wFUZD@Qjbz~w=@?}k{pj4Xz`PwILh+C{KR*6clq@@m~_`Xl2H}v&wi=|Sd +zsHa!>vH_hWjhwi_m5}YjiNoFWTqin4`99_m{T;H)S0gzE(PLy1e@; +zph-;b+&jlriB~SRYbluASMvpVzJg;;H(;J#0+t7kU&PY|>YT1(H`!$l2a1R$LW6=H +zrZL01I&g;lT^dA( +zDZL^Nei1{_R4p06`KBc03tRcJs>NI)pPdk4c|ZV2Wg}KuO_Yt);;@>*S$Z9V*L!c$ +zHGI7T+*xC|$zEcz7H_re+lPksIb(r{)jWGxfIZjx|2)=iX0m0IB*_(pkU1+tG +zYVqQ>WkQ51zju%cF8e{E?8D394Ydgpv&u5Zn5ysxGb+zCv!MGJVVn +zi9Vtxb~;)26y1i^^m+6VH8qN2fdI{>D7?C!wdFTpJbCIY+34EXU{qNjppDM08T(e- +z~;i)WXaW$ESQz@G-%$8(M18q>5F`d +z@sL2!S5T2NBTxEJU6&R0sOnJu)u78(B8dZ5aYt@zuuDyFu1PxCC#NlemFhm~Bn8(r +zyOAMQ#}U?*>oQBY7bzYdc8-~+SQ7=ICib~J9o1%UFsC(g_jb&1jn_pmeD-;myp+C0 +z0uyf0?4ebS?o07s`cQVdt+2wN!t}3IHKai!L{&p_ +zRlAsUTw?Jky4WN^N`|RZX>9j|bBx#1*(5QJB9;y^sG4E6`If2iZ&_KDDgw$JGhd5~ +zA&&v9oi6>&bN$6y>QLpn9b&ZGM-3nrDXa5EKS^iIfYo}1TCg1=kX=5jQj3Zd2-dQS +z&|o|?v@>s^pRU1~y&_71ElblyyOedpT)olkVLmpqalBY?!z$` +z1wfyxYG?;Y6LTJKf67$zxa%`oO$P!2cD`jkU6~8a8@V>!PoOZ1YR8VcxbgB`Wieb% +zEwi1_CMwKHNpS&Jw~1<#b^+J0A +z-17h1jHh1zifs^v)TkN=Ov4|In*rO=6P-a)ZD@Xe}`vEFTiuQH&E2mDKQkIvOrNmAt@eDRdjKrB- +zp`b;cO49r_57N{wL$Hp#$-a!Ld^Or|wR-{O^i% +zMYiPsW<04m&D2O5w|V9?a;0uoK}+BhKsWB0qZFc>=O^_X3oVQpodNh11!o8ohJ35M +zZm{2ktdde#=s=dpm<=R{2J$Oi0W`BU@QT@t^k$R*X=@-51Tl_(sc*WTaV6!PX^=<5 +zb4}8_>wC_fp$0-OP|9T(YU(W~PCMD}x!MH1a9mM_jD=#sNP{*=54MrnvN7MIw9Zv3 +zrJi7LVPPS_#v-SAz$oYKA$i97f2H-G=(+XaSi%1@)LnD_b9Z-lcx(J`#J3{!{2hX +zXcw@5QBWi}>sdvR3;|P#Tgf3NVDJ*%ub0(CNvvlCP=coT+c>gax(oip^T +zW>Tw|vvn|ac~-?6RZ=TxbnmIn3gEgj8~Ij(${Mg%n8?%vT3#<&)9H3HksO~Ou|mOE +zn9$0Dw82AKNyGCHS#+Z45P2rES-d&rr8qWm<5x-^MT_4=x-y69gA)_cYyqY>O*xPn +zjn3;i_L7_&jFz+Xr?M?EOo+Op4SLF_3fH0fG*kq#f!Ji695l6=1H*%M&8$>Pof+0} +zN8M?T@oJ@1t;`JRWujV;2!zp#`kA +zA~Jb`?ph`CMWd|EFadz*Y((z5#)gJiBcPW^uxJ#Fyg`BoQY3gNLV_cQ+4=P$V5`Jf +zB&^b(V?*(QgCp$s45SZ@ADZNE2L=Yk&x4c6q0v$HGI}t^PM|}|43GN>UycCy;UN;t +z@`^a?FyyR5f>H+l$clAPR;-b1YQ2njxS%7*BMiv7K+N#SL+YkAlu{f9gWXyg+dST` +z25kv(<5U7lKZ@Fj +z5013a#MtFf9^(|a3$st;ICPIzh=g&ai_=z_|IFuf{tMb-mJFjnU!bRQg*^X~&Yet` +zL^g9yD+oA7L9>6Qs}%vhs^?g0E|V1*;AghPUo67XkP0vx&B46WlZfo;<~8S)ri?^O +z$k893Ds5r0Aylp+(B(GMBY=ybB(!F(r~dFkxwLX#_n4IB6Ps-&alHWA9$SZ{fGEo3 +z_`&30JPLC_q6nf8Cl8;hz${#$nPvv(b7nM~BX-SOU#6p0r4b(DxrFy@G}CxCn%SC-f;k*&Zb4qk +zWze^#$J9!dr}`A-*+7q(D#xcPx$S3g;u11{TYPK?W(iweVj>OSnfB9ITWOff5~B?A +zNZF{Ch{{4xQ4@t}PdeP2b_SB6+C%jrc8s2tRmH?9m23npAOcXWwp?IZ3eT1GER89YG;Tue +z*U~v4#R`O)1A3Ht=YUXi^Syepunw}!t(q*3=FP3Hc}dM|iWBs#(VMN7do%N;UKq8& +z4`KLQ>4mY=Th5!kd40C`rKLRl)#yK}3n~8QOwC?|LEy~U|5mjB+IIRi<5*$;r#rmc +zwf__D=U4F^7s=dn!?A04* +z&JgUvwvsK_#ZR7AV9y4u9^hu1fSa`X)*;xI;nzi>8ryGk%65~+T}ihbO$@ALv8}b% +zvPpe$zQ9gJOS&#JqrM8<*buv7rOvL=b3oEENjvW0J5UmZ8}A| +z8`-{j7{mt;%tvs4FHB?i(~CnD>AH=r;rNt$oa6sx`o`V*X+Nt!{}t)%+`V=FYcrnO +z{?8fN4d#J0oc{}lw$A@;%H!St)s4LVVJ-dN-5J^H|IK*n_CL4rnl#Ms`f#kY|I-z& +z@&BjyKX0x7&irFXDaL*#69)%I6N5x;4+alK27|$&)DStmKXqUfmwjZCMsf%S<74zT +z1XVh_vJjyMR#M5}A_59wN&d5)1%L?TDmk@Z>BBVq50uk>8t$gAqE`x9KP)w`(n~#{ +z-KR00GCKl9_!Sc9NJbO-f-E;HNv~fjYlWz4R+ixFoTgP&GFR4SqiVy0HNfP7tZAw= +zFbak?TC4=|J&4y&%xjf2!Q$;0r21r39mEK4#Y#Kgcc`*>Z^a5Ph0WJ9%MfprTT)L^gO`ja;kf4<@k_|F9|G9GG`Ot~;$yORmn8_OPGEzS3VF=H{IM)J2tr8UHG{qdQ_HzT7 +zHLfjCSP9~KR)k+Er?bbka&TWB4RSLu#`dWF1Jyi9u@81bR}I?C&O5;lUODLvjuFs) +z^WY)*Y67)?l)Xv4z(Ba=iX<*vqJ@ikjDinxB#elP)CoeYj#Mf+dG~>Q31jI}zcN`Z +zl?+oO3mTbApJc88vj%SF3aLltbgi5&XXloBph6{D4nt%Y(xz#_2gJcNZE`SUwLFV% +z)sP;hDVcBprlByrNAO2P;XFVy0pPNRplP##1hg#SbCAiZg_YS!1Mcl)WWtObETI7y +zg|6AJpcK@L3`Y;m*2XTuVR56V +z---aoZ_fc#SOdbSLmg2VYQ4g1JR7pAOX0E#b81?VutFFuE!0znnY>Nig`xBqPBR4U +zfe#|28G|7OQ)lQY!-+OAmgYC|xM_vu+jgddnP4`^*whLR#q#=;oCo}{j6jSMjv`zK +zM>v=X2W@`FKwVJEj-<#70>ZEd#)ynj3`dSJQU_xs=-_`pImJ*i)Dd;r#vKv3BNlFJ +ze7hu?kXu}wxxUf`lS|U2Ge(uIK1((7n)*SdVdWrJ`Pn%wdwgHDtVh|bSLUlty0)xU +z3KCEqlR;@`Dgj>dfGg80sfU%NU~Gf6yN0*TMAb-0B@244G8a|%>`@6@p;9?XYe>f~ +z{HAx$I8;@70Zk{rfF=?QNALog&aR$t$bG3O%mxe$1?wgfBZxNv?KQmk&Q|$-R2%3g +zPa!*aUH#u))2$oF3g`bjI(CO^?tkjs(*HN*+0y^F^#4C&{hwEzsr>w9OYi?P()+1H +zHwHuQAK<^9+y(;y$+6~9B?E$6bKbHYoORnltJ8L1iw=Ztiw|Ku;NqI;sq%|`P*dXq7sUZ2y5(+wq(HfhO(YOG)N6^D`n+C% +z^$`?Dy%U(cm`j&)3ZNs2;JAeZ$^?WJLu$ZmS%X5xY-Ir>jM1wXOpWRBCVKAGA%4Lo +zK1rJxdYGV#8Al+~QixN`DnzQF<6sq*`=HnI`x>!6p+Gng36MmEECAdbKbVrErwKAf +zWsaljpjB;v)|SYK*p|w!F65`i@MK0tBcc%ED;x8mZ=1@hMkehe+SPapBhQS~r8MLw +ziCMB_RB0SHdLG3Ka7HguKi+_hgn}F3Uns%5(7#9cSdy@kMrTT>yGba3C5xWMEaC0s +z4V*Qqc(SEp^)Ipsttp|k^dO`)MImZynqp+k6@-Pw%Egu_xr#M$i_=21W33sSOzjK4 +zq*@H35_l9wY(*5z^~ZAQQiY9&1*3c%&uBF0cqpJW#2J=whC71?(q%8C2lOH})-0k) +zr)Zrh;$iIZWJeRILK3QuJ)(VGo~ZB~FGbe`+zuHotlPCL!tHdytplj3wW#12s +zbqIS5#j8!hF3~JE`eD6nR>%asKt=E-s}lTMaC4QlghBY$GR8GHnFKKPd{N8sp5Orv +zhtfs8V31T5LmcAGf$4IEo8oH5Rh`ARGd?0#!;AZ^MH8*3SU8D#;z=ud0T;$S$Fp%r +zwi0c+BCRO&LdEF8EbU|C?UNI+1MR8(v9Zf1FY~BY)?S=}oCqlVJ~opIjs>ldg>~>Y +zOOA_EW$A)RXOHY0p_f#M=#N5vmQ5kr%ceLq<_ZwmP|jf+qtxprctuvp)_s>y?WXU +zXTDfvHUeHSm@f$-FfuVpRX>Ty7??$88Ya6YRl|dh(faSH-k9|YTl3vy;wx$bY=|9$!Povy`Bxz +zO@LX*k-UBqd6O_Xk9H4skX?8`rAt7uQW+2N+a$pbfTq#w()pE!6lj_7$r%|Ei70N@ +zqoc}AE3qKq#^V}GjE=$&OV`?C0?LGKjbUC})KH$&%Fv!1GwMvH><7!4(Kbbdj`Yish(Pq)X +zYR>u5#STDcs(6X0Nk=e_6F;^i2&`jjg@OVQbldq&)XvYwxPi0*{G3E4wdBt6{L-U1sr};zQ+OR$GB%bvLdJ(lZ0rcRJTW%pC-K7*$@t_X8BZ#S0~4c(IHV=U21gGL +zCB{a`0F=WBTce2si4*`$jT1!3K_%jo2<$*SIk+EQV*`oNMCyoN8BV0e5a#fBlElbF +zESX9S9vqD&VF)EB#wX)|eh9#hCB}x6fF*t)K9&j)KnsZ^ekHt-$^Eg>QN*Rh4np;l +zSV1y4K5-W5|~Q&!PKiOIO1#FB|gq{wh`{D5CUdP0eD3IxiH +z#TgW&HF0zaWWo1?lW_|m8H&e70T%Snn4|x!em(1^%(LmUC!3e3C9}(R+3O;q&YrHl +zJssgKm%TIn)VKdROa$w~(b)bM?&=PA*4Y1ccW>GMHsiT|Vr=AmB5-+L&kS5oo2KlPy>{@2AX*!D&LjyJTN^QH?f_`FI! +z{*2gVmv!&G|3}JCzI4l;f4b|I$bJ9#%LiWm;(xgR5#J48y5$SxesaUpcD>X856@LE +zctiUI=UqU0@9F(NA9(!VKlIouQjgw$)1&?!cm2<2ZhrR7Kl_glAFBT1^wh$Kr>--f +zwJ-L6&w2QPbAJEI*S+VwZ`|?7^UmqH@D=K1&-}vp(;qnYyX#y2_OJFm=e@6vJ@~*m +zw_R}W*Z$_(iIHc2=;BA-6Ki=@@!AW1I!&$`Z#n2-y^?i +zZF$#y7rlG&+=1)N^B$Rh;90j_`^lf}&3`F$=QrNca{7x`{a5e%-m?Aa*B(3nRp0wX +z%VqoDoBBn|(;gVPclsmx6F>O(QwzH8`{`#s_OUl!@bP1JJna+r+;!m>F8t2jchAnw +zzV(e|YRQfB83;9C%0PvCp-f +zzwr0(C)fVnt6$x_@bC*?_(K0%uWNbd*G~TU^MCQqug!kq9{*o|HTvkik^I+R_)z=z +zZogpQ9Uu7B<>!9$n$XwxzHP_!q5KoS|Mjn@KK1|JwdacIWb)>==eOKAyf+Z2{O*z8 +zz3#)ij^2Kj{aNaIS<_Z`tg_F +zdiwO~TW-1Th8rRm{?)@fo`2VeyYBwQZ7=%r&)?oYaL+yW96562rkid$?|uEtkKOf- +zuCErld#|{w7d>qc=Y%e5}y&qZ_;Kc+Z>fdsV3S +zn#cZQ^3ji89gV-W^`}>VCpPum&uJGOy7lUZzID^(hY!E~wQqdwYhQct!&jzneDj;$ +zR4$hveDJ})4qkol>8ahZb07U-XW!pH<3*n&kNSR=-|^YwPrv)I+papjckkXqAD#Zk +zz2*o1b?|}2r7t@1$Ipj`$*q(wYcZb3$qgkFCQL$;%|Fj +zG28vsub=bjmyXO2x19g@J8n7p*_SV6GC%pkv-kNwaK~qtAHV3LivaJtU;eAaFTeHr +z{>N^)?Y7_C^tP+N_3J&IKWLwR`oar-^}5I3ar?=KE^67aW5?XBckjP?=GGfu@aT`f +z`A>%~_6;38_^O`!jB_vh_~`R*I{EOu+upPM+m7t?Wb(fs`rhZBd-n~0apMUf-O|$D +zmf!z8zwh=(e|Rc>?wh}yy7J1CzkB4zcf9(U=U(%n51seE*S+`^pMKx_e*C33ZvRo@ +z){*mCKWbe1hoi?PrxKa;iJdK<``Nc|KJ<~pA3JgXonQINOAcJn`pqZ4f8WE=m;L7B +z{=fYB_E&y);SD2Kq!P*xKC}1nA1r*LV|ZY&`l`F1d)dwJy5hzYvDp7-?>*qDe%r_K +zV%Q)5-s8G!3T!Tv6T6n8US17KN=$rSMzGS+S%5Om +zR@t78PpV}^@!$*z`uh5Ib}x>}dYrs5xa|gEBZfiAXsBi(pF@e8L0H(t$h-QG!RP!5 +z%lHANX5V_LK@+ph!V`6l$aq)=^>pAeA4dG*5uuCQeSNi1H{KbrK6vmTZ2HHyB`jJ& +zL057yD0KbE74J5HJZz|dfPnt~e!Uc4PG*kWlce6ptrxDmWPNSAjC;+O53K{cxSft} +zB4%6hFruzc4KHsT;=#qd-{*Z-QCPd++&QO;;mxSTu@(j9W+N|6{jFP{y}06i)+96i +z&>;(3Tj5V)^&_|x)%46vvA4#$x^<5-H!WMYIfg?Z0ky@?&(GR=70T1jWKYa1xi?wM +zR?E1(C?g~X7~I~lA^q~Lo6I{-AC}Mfv0w>L4{9V`q8EcteY@{d`dZiHma*7Z0Qvx@ +zaEWh|cDsMD=U&Q%0^sx5^Ymd|Jw3A%Nxvx2OgVFBAs~J)5rN=D2O55cG_VcPL@$C>m~?rt&LOWJyRQjS;UHg43F-5ZtnyowZPc&tE1=TvuIfwj%~;aka1?58e#4UKVY +zw&z6of3Rjl-Kn%$k;=imLp|hDLzJ}d$py7{?|$#*zSY-yA)~n|A&gMbG3NXJQ6`|H +zLSI+M78Mn}xwEIkr+i|xx9PaNn2L(SO8oFrHvbR&hXFXrY^@y9b*TyXW1-*mSJd$c +zzWrn<%HGG +z*{-d9_u}@_a-a6p>})lc+X)Q~4L_#7nE@O-_-a_R>b0XyK98VgQQh(V`@J+Yd|h0I +z#s=g!5ue#wx3sm11uHK=#m63f6zFz(;?lLaYe566xVhKx@c~+ZRZ->qVVOD}ex7RC +z2dbL5yccU)25Q{%hSke~fnk<=svC(tW{hfn{v7jD$iNbhfA_4={;ct_k$UH!G8jxE +zhfLVW+d}(_rE3+$1q5!__ANx&;BP-o;?QM%d7bd+q3Gtw@w#H%t_(?=Rh-)~SD4Pd +z3R=O8UhbN>f635GW!Jvu%0q(JmhkcNtzREkeCKj?l@`a;1}*=h&aKR>>?6%K-nKD2 +zzjR*{uTS96KpCX&OG;|H)H~i>M +zTBQEnd`Iy%6b7}NFTpK&$t#Yt28D5P598u87cP5`I(YD4v&)@s_XhoJY#vclvvQlu +zVHu*^7S@196dH?lxOnvaz{!dj?9!N(EAP~pw0Saxlo_S4#K&@2Iy)~zRaI5-MSZad +z51+gqHj3IpvgX-emz=!##x3KMPN_w?%`dNwJ}Xo%COSLeaO+Vl2eArl9_ju&1C|~R +zjONi`1r!30U|p!AV^1s-_tJIux0j2D-cE2z;#!g|lV4G@h55WnszxNAN~Ks#i!0}S +z1Jp)?Gi7BMlz%|@l_-@h>3D-wOg^Ca`655n92T(}zBRowHvC3Go`?mYehvzCHlOr) +z?*HL(^rNf(rvQ&CIf0qU->@o?C>J7hdyuS_$cAM=XYSwmW9-=FTWU|Qg>*j2zrzn`Jy9BoNw7AaYqNg(ZtrdYc`+~Ek8Vtej;=7 +zu$3VL2fusrqYTL-;@e9U<%3$U2DN7~@o%#^W?q)nz)8> +zPfu*YvSg@N6f3VmacB-aE3B`tj~IC%JoR-*EK+;8F}!9x;q{$8mv4Q#Jv=yA&uYN4 +zHb^DHzUIvlTtj2kkKt<(KR-^J^2%g@DO&Rfg)Sok{!l4F*TJy5=f>y;4-bI{4#jMb|~UAfA}zuEEDo4)w3< +z<`GPg&fkyf>p!daeWGc#i_1nEyxnHo#bbpPH>V#F%j*L@N#6t3p_a#Ce4k&Rc&tdW +z6v5xVae>$p$QWwO`B?8{nGXy1;04h%{K%bU3sTgs4t3WuYQ}BW8#)lqEwdvb#?ref +z+p+C(j=Yz3$f;F{C!8g6)~3N>%x +z*x0m0-d(pyH>uB1|J0pyNB+T6cdW~spvuUJKvUDk_+@IWYC{H5<{e%(?;Bs1dAEre +zu-mi-yGQQPX4xZpJ4m*4;N +zOw`DaZ`>P1PDd4g+@gw0Capy+lxAL-86PKPSXJw4byye0xuxzoYH8EHlNv9JTyEU_ +zIr&)9vB8x+u4{p^hX;4m&xu_P4QnSRZ0uaOUUpiJs}pKGe&oqnGj54p^%Y&`+nG6T +z|7bp?74dD@vE1j_`^GQ3qp+??wQ6A_lMM|j2JBl~-4}kfi;pTc!futSKl8aKqABZ` +z3fZ%*va;wT`k3Wb$Csh~mhWofZ7X~pJg67b)YrUU&9eYyAW-17Ua9Qfs~ahM_GI4G +zu3nBOpDSSH*EzLhiKr&WDk0@)W}W3~oP)O7n^I7ke)4@ve6?Yuhn-TQJB>75~#U&A$p +zQ;tXVYE!mq%If_GzVP~A&15!^GxStn5r<`IWO`WTy>~-rbF(yHrz3`|7Dm1w+snY8 +zz$N)TSF0!m`@Zwl`LxfYO?(|?1k)TfM{Oa!lLk}f4>@$ +zFEKF@2xa3a`a(+{q*OQ=r4oqvNAH3 +zPh0GDP~5d$c?(`Y0hE@|o69$^R(d{GNH#I$)1Ml;iV_#nepTALHIRMV_hnDkzOEG04 +z?w!s0MCpkzxpLFW4|V|oFS~1~8Pc;EcQBO*n{BG^Mp_^K?jCdrp_U_)5MuvtZrKL6JtI7Zqe`jBA +zXJvp^r9#vuu4%RD?-{#xaVGF=CYpI0jo(^xFXiJ@i&eY`z9jj_aDt>9N9K?{(Iilp +zk)t=6qpGazLsjoh^070@(sjdE2QC5Ld+)n<6H$aMVq31CFDmkXbX;EG(W9PgwKt_s +zzdf6i-CpuePctrIVdV`VRMS7Fc9tl%=B_)&{P8H%Szw$aUq)XM(3dgVQWwJ&iDVBsnzq}Umq$d}TKC_aKkEQy{ +zViVS4yTa%n-Wx*=%Ue|&IW#9GCNdR#a}S4mzu$v8UXlZNKF5!L(3;>Jbl$dY>f5ax +zX6fL=Imbv#V~jVl*=0zuo1XGgs5enG5NGTW&dGY%bouMifJ+MvQV;N{JDHoKoW58% +zGdB~_0u@brdNe-Wo*WYfe1En>FBG1v-kiwHd(E*``njQ}kM+yVdshl<7r(+6owei@ +zcWkvyB>4H>Ug~jUjPD$m(DnDP2^L9VhAYZD`T;^_wJ4yce>aPcTULaH@n+PQ{-?d)Cq`eddVh)dS$XNTmwv_DA`7ez +zoNJC{vTe+f(zxGjF(_5Ugc3GgRdHsK#8L+fi<}Hwwk;0scNKStJKuCD42 +z^71Ok#k97z@=kv^f;wKU6!CTNL+gboAHmlS%$b{V7Mv7V8m(+GxG)6ue^FR4q7;1iGt9(_-G72fDcPK%+{)z#(Xte-}!#0j}1 +z)s}~Re0Si8I;xsSPhX96rmur|Io3>~cJ1a0B~;A*wPwmT=;5CNs5_gw9L^VbeL9oE +zj!roG$eq}6R*Et4*{)r?_U_&L`rWESTu0P`FBY9Vxq`ncFDW|F!1B~aFJWcIsOPJ- +zjtE75uzmmpYpCSI;X6bc8F1&z%9O+|pipI_3tv^+hgL6R5a%)i!ZJ-w#?ZF&I(w$R +zIWw5shozpDKw;~a%Y5t%`&!!6Xt-jl&HLf9&oYPX^;V)@AF=%^YM7UjtgX@iV@hgj +z3%bvhg|}mTxyHWS)A{+e_wL1qiK!sjB+w(pVCQlwtvvS(%082o$zs_mu!*{Nmm)h+S|dL=-aou +zQO9>A**Zn0Z;J$jH+Y@-Om#i&O@EO-gj~~7&_S`3(r>C{Gyr4kokXvFg8!C(cdQ6Mro2mMy%Pdl> +zmDVggd*;mUJ$tlb1oTn)Uowd|+1T0lrKEh@?eO_(YU)+g#4ZkTgLUgXGCCF>Tv>SZ +zAUYth^4z(H4|-T*^eq!dS6Po<)IYSu+R}32t6d5D4o3R=9PbYs8L2Z%A2Y70sZk5( +zzGZ78e>Lpluv~Kq`=QOZ&g$iwE-pX4M%%_lu=2#sr(@9Fqo(A-cYpC!IV +zZ|$k+XRYnZN;T@{Zi9p{*BelphT& +z;py4;Wa;A&Ng5(gp4eq0H3l_P$x}qX$zsiL)56Q*r1TN)NV9pIm&D>_Yjm;f^CxSv&pc6LRvMf%F9)BZegV)iy;@!sE +zcI6F<6?b=Al#kEbrf9WKu?thfzYRY*pJvgrvUHnISlE$>uMR)Qdj?Ze4U-?mF4$U? +z{;h96ik1IDYxv092YXivYd%%2PT_y=bg3C<6d&99j0XiU@s*H|iEU16m!KvlS})l0 +zkwO~xxihh7-HHXk9H}xojb?!jW}y-xrz_H7?Klj7;pDj))nF` +zRmZ59^XSg)B+W~+<KR)nq?tu3ZC|&3 +z{m@U_%fT^ylA@x9o~Ab?-n@M)i8}4*rBcShLt-8%+^URqgBiF=FJ;{v$faqm>9Nn-8|GN`!S?X^mP`~eZVGn +zUZ2>ELJO^QWq!@N{LO;ytbj|5EgLp|4NAQ`?ZAUW=?XJMUTL{L$#If@Mg=V9k~?>BC*G656r; +zJCZRIZx5kz!6{Um3tJ`Z%I^PQXIAGdW#zxk{q`v*14=sBr~6rQb~GI2Wes|J45fZfQ$Ne@<&CM&KY!#Ud}HBnX+F7%%Z{Dh3orp!LyNncPemHG +zFH;wfLpj(VmO;9yP;-|E%pTg4YAqINdfDrG7T@9yhTS5j5os653| +zS9ic>Pv?Mae7x4g9zL~}ThZ3IJTDo8JKj$FzN`50S)sk5A$zE6Urb4!`j0PG%gw*0=L=jtAunc=>eo}OpV490 +zIlZ)+p=gHzw>YZ#&7B^G>K$kuopkk|0a7tS1~se(-8{Vc4mKhv?iH6>zn)9E;~CpW#?kluD{Y8mU7svy*B2f +znxZZ0gLP{`zE{|k|L|r(;jEJd4|DUho;<~&)+}KW5WQxwf}fdbn{#;o&HMM!7A7wi +zh;!+wem;8CJf4BnxWOP|oxzIYj)B~~YuA5HY70jvqPc@t7IZ5+SNcnb8dN{yPGXSK +zlVu)%99MRD-%v+|^YzeT=UY2pk=@>KcI@{jQSx#pk8r@uG7O-^=A%GW&|9AK)rXM@qk>)%H(g+(d6 +z>rvxh`d6TeItWeK%agd4IA8Hn$FbBMOzaO>dS~|r-{+qWVhS`_H!|ZcGCtqDNm0;S +z6I+wqKJ|6~3Ds+S%m-hcYU5=J(&@`#jxjxzw|ht`S5dJ9dDw=6;__^F&Y^jKCw!Fti!M2DY%|J?h|MrcEj#j45S +zYs)%GW}O~6C&VNQWqI^3J1v)W7cx8XqQmoWLBSg1jSt*3b@RT|J0Gws7O3~S($*rU +z)O#CScetQQU0suzQ`?E>l~*!j;3QCV$%s +z{?MTpJ;dt)=uII6^Mh~h@foo!v6HwfUYA&0ciw7hsB?mZ(rdcCQuqLK5_9cJ;eFiV +z&##7!UTMoSfX$6*(Ha +zke5f^>+mKoapE&;8SK%kN*y^rzr3_34yEkfyE(G*B+27x|I>VviN{}B +zZ9Rld?52NCJq4n=!M7@sC1>jE3qRfn`EnxUW~rUG+V@Xyoqx(0i0PskFPW}p%zD~2 +zy)&zQ@W_utqiR>I&YC_b5tropoZi`$EPb`B_2elgoQm&@-Is4FofUg_Y6G_HwHh;H +z%#{R|I-gXb{j1aDf_*eKH7mu_Mn)#ngp&Yo#+5)&taGnJZCPH*)ZCaPSa@*X1Gk6w +z`&7NGzm1PeCzu=Teb@Im_eR8ML4hb%foVtGpsf38lbmcH1*2WN(o@uw0)9raX|B*r +zEZ&`*{5EQe_ggSFb2p~$`N+Haw6rw7@IHRxARmT7?sQjW02BXdyl8l2#kTt1rml5L +zl)l(Pw#IjT#*LqIbhEAqO3!QEbQ#UzYcCEifri)u{b?y +zduxqikXN(~XH`&PGLK-!$HRdEFEpnF4zAu|tHu{1*ZlLLqHw}FuOD~!p1*uu#;#NA +z-SV^HJ@t7nJ2V+%NVvTR4)AXFf1RxwQJoPGE4OweewlmlM_vO$QqspRHuM+M2p^x` +zTR(>QeRuP|kbf!2bh!Kx=6OO^YqO}Bn9gS=;!gfyai!KP-hI25jJh4$EG0FOk{4So +za)-zFxpYOuH`CmLs}*JIV>yy)b5D4G8?g4{W!T)ieEISw)o%_tYEhA2#O(G7=H}@M +zM~=VoL1mtk`^=}qq$euaTfR&!)bn;icJ5^EMON9BR<9>`r{UaOiwgD74hY$ZTqR^S +z_N9U`o}|>q5b-6OHIH(bw@w14@xxkT@;Cc9r>Urpa$hEv#ekReRB~`+k;HWkEsn?^ +zlViGh0YAS_OlCHyE;Y?Ma!_cbW?_4iO6h)*abo8%rv%gSb#)1(U8Jjl@3f547mp=H +zHLot1n3w>(!Q5PxvMScVJFo4_u9ln*4H1 +z!S}@(lT3DY_AFk;%gE)a2GzVLjtb6`r{IfIQ +zOX&5fs1=8IQL{q@9fKAn{T=g*&44jx41h?%avfawLizVSDA%p~lC)$`eL +z3Yv-cj;jpChbP2v+&+53a_UL`%90YUvEi3GeJZHeYo}OGy?F7Wq(o-u7K3|Q=WXNq +zrJVhG=C-yT6&|?CqOs}l +zPe9!{3El0#sZhWpg_2EOo +zR{^b+Eqitag^#sjrLIdmXjhgE+=<-Cq~w0X<<4%S49Oeg-AN~uL;TYFfL20J$4+s7 +z?DabC;JMAt?%UT6y=RwHy^32Hx{5!ZYYC0hk_eluDx38bk2f%3+E>P%txmHp;i0({N*yW=eAj?EuNQa_uP2n +zXcbr%)?b*D?s7|l?PRg8fx&|htru`O9Jly3juk6b+<*4gl;yL&#UXrC_Vt(7MrCA) +zt5#VvCE8bOCs;-vCl4l{!1n6#gzvuOct`KRph8&SlhXzUpFbZs-FN2P!mj#Noic}+ +z+J|0bqT)oP>sniZ82PfPnOTlXSjj8QGNF~4IQxK#1L=3NGVKqYa3oKX38syY;^JPE +z$Xuv(wOyqXBFxKJT_V0KfhRXNuBYdYrRDG%X>|Cf*Ox>@4!M_Jw5?|3-rN|vS}*|! +z{kXZfmadl3PATKcySbn3wI-8=+if?Q{zp2Gb}aROVaI#Oi1`rK$?EAgE8K&VZw +z-23E=B?x8w}C&rqPggp1_6hqHMn^QYJoB_$;d4Gl@$Qj$*BpKmzbd&nnT +z<<)Tmt9Y&HN+$_j*4CC5hpS`}W#wxnB_k8PIU$NSJN#0M;@Mv3hN1wUA%WvjdSg?Q +zdO)|fp`l?L!0)$j%YD&EI-OS6(osQFj~w^+^z=;ORb^SSrlo@D9H6L=cKXu6P!YB4 +z6H9oS$-$a@wKFgMZiNF8`O~wCy(QvJN3nU)(?5@!dwF_R^VF9NUaBuBu(PqTvA4H( +zbaXT~_iu9y*}qQF@(uxj`0>?^h;PFZ+WXbwp0C;77N|l#$@(PTNjv7iy@7!NBSXVW +z4ppgHS>lTc8ZqCxqHh%ynd_&VJb6+liEF`v1$*e +za`6{%g$I>)p~63L4Yo{&0%i^H-mbm8gkjh8ynm2?jb6vl*O8Ht=H}*;C((tCNzdY6 +zH4phSaSR(XZn0Y9+1;^+Y3cFQhuBTMyCXf6)S1c8d0($p+2^j>C$-_pg@Q@Gv52t~ +zd!s6Gw$;;oo;F_HX3gQ_>I^*9+`)J1G*Kv&3R!0x83$)lL7@$N!JE)Ms8^i3hJgq4 +z(0ZOk5*a=KjmEg)g9$jis=uFapi77d`(zT=D7Y8bK*v=3lID)MzjOcZFZX}boo)S} +z!uX5*-&pCn`@f~7|GEF~Z~6R_|KXqf5C7zU_$U9v|6cwFgnK9%AO124??35Z|H&8e +ze=7a!tfYT4c@~5)lW+e!X<*sG%m6boQv6{?SOYSgvvp1izi^-sczZXTFoG_jDDncr +z13r2U9)1RoHhY4{@WB)Mv|O>2gtPciF!=$56?kZ$F8{1Qk|>jwkCs47NE<{70xv9q +z?$ZGZK`8^--Glt#%oku%f?xuY)$v!^8xh(e4zHBFq%^(nD=06i0LZtL+00x52vy0|D>@SbN7(c?5xx +z4kd{LI7FV%h4UnYrNG1%U{Nx3aXTe#EW0n@al@zMA)Sc_ub%;vNcw~!C!^^wB)Ypp +z*(K2?^eIz;alixggcDPM*;9i8Y55Ms*;T--5NedXs?ZN{_7G13&Xbb*0)P&hG??8; +zK?E|K!h&9>17+O7+?#0y6QmHpyb(lyxEdvm30Pf{-OLXU=E5Kbg1G|dnujxe;AdsxrH%=u +zw@AJeIEe&3gV9J&nw@N5rlz8|aj>SMw{sMJqD$$4bjXd8E0{)bDER?Ia2K>2ArLSy +zfG0x99`a{`iJc*s{%-CP{(uPqGYjKDN(1^IqBta!R91$wk|KB@J^C{jS_)2I1G+Nc +z{}S?G3SKZHwGW9%Q(&_*FQaYz2%*p;UzaenAD)tb0(RK`bv25Xmc+_R$|_LL($5PN +zNzn|epkL-`MiNqx&`8_t7?`iaf$v!G_IHH2MI_PlumhdP0wP1_wNUak&&|(Fx$Ovz +zq25A87cbCf__YT0B1LmU7b?xTIt&zyKs-4p5PIx~523w+6hD{)+YeGuV1J=j@qvL* +zG8$?ngwl%Y-)MPa(f4B{Y&KD1&; +zwrIfr@k2uwynz7Rf&wWSrojFN`9m%y;+TRSRv?^@ClDAOe=sW#ocM}jL1CvBN|^=c +zLI(A#i>nVFY8=WkMr)cL7ZTWGKwJG%_-NPEp)r3ZV^CpeG@y=y#D$$SM5`j=j4=Ff +z;Ubxueg)T(BD_GS$#{rqXlOwGJ5%-KDfX*aB_{?VLgcE#6e+we$Ft~=1 +z!AN)hb^)UNre*rKf6_KBZiGh<{Pv3x{GV7k2s$*3gxQf8a@!;NPdIFr7*h=h=!hV^ +zFn5@!y{Ak}&IS!-!GlGY>b6l;7n~l0G$yAY=7Ixs61_HpO#s{|;CLYchCd!ha1R51xsWLlHXU8S +zl>U&g!PUf(;Xv4dCc}spq^dJ;dKnB714&Se;-CTq4Ku+V$ukN1`QRIPoLtB*w7M`# +z1ULsJ08|of3uXd@Wt^JRjoJ?a67Pd4_1s;8d?>FdY6hSWVsZe5>_-N#JM{z9ED*5( +z!3u_iN75sT%wk5DU>6`52DK6b33Og(X&5$|7=sszQY9Ax3IPo9B>LbH!w0V0kfGFg +z@P#8d+}g!nv6QpC20)f|_5DuPZoj20WUH)=a(u%pb(5U_MEx +z1|`iP%t#d6!14fgFq~N^&Z`J#3pxG0Kv0fFm_yAJfo98KfW_4zR!C +zG_^B>jD5?0#pzriXc(h4Uvp_35~|k2b|I($`Clp)Ykmq +z01o;Ca0s8#1e6{Sc%K&JCIEijZxzbF=j6}tfl+-wst@)Xz@Sn14|@5K^`Y`S9DL2| +z$1>#E^O{gHOf2@V?)CX673M#m|HNnR{x3iTr2exoz+GOO{ +z{|oxe+W#ddBddTy%l~K5nE&(t`2Mf?#~=PGiTlsM`2GGrSy^dduxF0H{3fjIKl}gw +zj*pZmJ7sl9;xD$|0bazP-0}$cJ{m!QyBVl7BXK`FnwCKygA<`kpFiuWKz1~oAR1vo +z*d9vHwudrGax?9rC;(UxS>QseAU?aN+Kgvz;6fYyGXZcR3|fMd^c0|bi~yhc%q1uk +zst-PNNAtt$v4As(F}Bfg-l}71WngCNY-(d7f{u(t&w7SdLCZ^H=~}~4*A$@!0S}7c +z4s-x+6K!W;u4`bdqpxAAZL9=2X~_paKMNI!Cw#waGgkCfP(?Z;0$h1!=puw#i6$Z +zaoBH!CKAx1)ag!i1mOAsRKXD7uV`@moWZtSi9{c~iysDP0ET`?Epn@z+g(&JE*nwlDZD1)X3h=i-98b+12zO}l +z112_I4R^FE8bkXn0#r11hMe6Xa8?k+2d*hTlgA*OAVQ;6Rnew4#>OIOs4lp71L`qd +zO#xRIH>z3?fT|*$aaW$NBS1g?jcy>FrvawoC`v<;LUUthDwYB+WHLCbN4aLj1rFhU +zfwAaZltHS%#3vwP^vBpERcWIDKlqDbm@CHrwc&v90lM}->Des8{5=B%*eL)!JaZk0 +zcOg^E6ta*_5(mPu5SK6#{1yt>cfidG)0YDqL3Z|lK|A%X8yt1jSQ)w~gy2qFr*J|0 +z;(ftY52y!F@C-HsFB!oTnc$^M$lQP=Xo=>EG7zuNrS%-X_n$|8oq?+0CKd|gfYTd9 +zcUmD>pNK+LL6R$@(Nd!HeWsh*^9iF-1wa!S84o-e-0}`B8iEk!Y6cJu(yUSvGW5gb +z|4TUn(El~J&E+uv`Gn_pG=NI|SBUTnx%^{d(3@4z2*68(bGuJ(QGs&QbvsowO>fZ5 +z5o|@JMCofm>tRT7qCc5dSOyTcKtP^A?`STkAxw!_T9|r}xpE@}LfB&H&=E&w@*n~C +zpCRGDw%zlYQ+V4Uv@;DP2sB7LHjsotBTEA}(@M%vdmS5S?k+i&+C_qVI4sP +zC~hZ!ILVoe76n%wRiSEg8vF0*jo*$MI2K^f2_$-Ep@|M45Hy<%Z%m=BO~Wf;i%K(*+0bw4z{ytk}(uE)p2i;es?l0}9IX4BAjF1wCnyh{{(S?MFk$lNbWd2ZzyZ +zcM1VL5$bZHIt8*HW#|Cgwbj7%iXf=;4A7C;CZ1w#Rs +z1uz5v32C4Y;D5?!0ubo>0so1K&4B_Afd?`Kzz7h;DB~jTA7l3D6&;pWBVT6A4Ohcy|Bn7C5!S8|b#s`w=%slNC +zAWS$H@(kKT0VOEbzK-zt0JdUAw`eW+iiuHvMA65eM1T5l8Gc1;QW^n7uP#9)L47Dq>dO-3AFd(~A%53llMsYr`=$G6;-O`5HKoSuUhj9MAi{t)pbo}>0 +z>;EnVC_4`SWlDfN;DP(S82oOm`6)aOYEy!T9}!ycB~rISQ?w)1qecV(!AE*Ne84R~ +ze-+;9m|Ba1JH{xU@?7r}ehfT^e*J~Z4L%9-hipAG`G7%a4fZmKPLio{AQ;K}fQW`6 +z-BqWv;PfVN{?Y=leup~{PU$odG62wMju7;ko|R}+W1rV;naBRj+Q13`o@Z7OJdUpB +z=8OYNAO!&bh8B;?{#EOMjdTV=SWlwc?*V|t|0Mu(cHsV|eG=LEU+w_KTF^I3dySwC +zo0Iul{cRwHY{dRG8>2<%3#1T+032k9CERBqPp9YSpIU)EBk(=AY+$LQXJBP*x!u52 +zTW8yhhHxM&1_eTJ>BWxXb^fYbE+PAVew=0Lc@FC3K!Pf1_DpYw{Ldap06-{pS_libP1AH>+wi0dq#a?1wBi&U0a-?J +zAYe+7s1&URs&Tj`7%rhhJn_)+Eok7t^UY*W(D_DMf`d{YpmRto{&ZdPxA&32I)Z8t +z6fY5aOaYe(q!NH8;KI=@zs{VGm{AHX0cuwWGdCg>K~h%Hci@RW!v9lJV3m^qlV8 +z3fdR6kVwKcE%Lj$|A$2=tEvLE)qujz42Y +zicI=JW*M|wzmU#Z4CvtuA8h&^^TCU`fh01rMFaTh=Mv~aLZ+qwwL=DHn?yh%qqup< +z7JbT3KZ?CTDnhOUtcm~=2s{gdPTx{>5>g$2KvlWW8ZmVwRAG$75Xpmv02W0wvhxHU +z1BxL*)Se&c`hrJI0OdsTcfrAX@4>yra4iybb3MFMN0>BAQL1iWvUaL%7PGp)H{fP +zHEerD=%za<_5}30;qQniO|!s$bkm76>@Yr5507G7;UPdP(Wx!y5ls!#CLw1il0pb%K-&N|1nWpo +z3p9L!MA%1I37!WAEjisp?jLX-<%76-vs-pST86@qSuM{Y+D;5*M5IMT=qw00)efpt +zXKQ+OG9QXqXsr<0wLp11tMnX9k+UaCvyg+NXU+x@dP2kgB|V{|W(;~1B5)vo@*~*H +z@cXE9(nw!@iNRnN7!rAg%+8q&hDw9K;q!{f0eh-^Bd7z~8Ihp55!qZFHzUY{l^}@Q +ze32_08P7jqHP;seCkK#%phF48XULh2dA7p2g~DGTg--Lb=SKX$*+=lFkw0}!3xGP~ +z1>G7kj0c^OkpitNY;GW)1`jBKTXhH|Pdv?O_~pz3*mH5T?0ix3JVb#BFz@UEol^-P +zawZEyxf)=`q}!tbp+qG*GFSimrSIPi=6tgoe>pEPXIfE)Hm&$ynpH%cq?sB^WJXLy +zX9mG|7=b{wB}6(dn9~7S5fO^HMzYcZHVa;ng{eO?n1JTXU}2Z0YKu8+_$xAjpBb|n +zbS@8pJTrKp#kF&NYk&y;7Q@!)yPq)wrj*lor3Lk)f;CIkhq+UoMVCLb+(AOw&i1+4n +z7}>n4K_UUs1c`2A31AMOv#tJ=bCFP7LcfC)azg;&a0b)0%+-c$vm6dIWNMtX%*?l2 +z8tCa;gEBjR8M?z5TE9MwL9I_&L_t$mQGNkhTgOVv(!ksrP*%SN{`+$#|2j}aJN_D= +zF?_-WD=8x>`vo#4fcg6gblFUxw8d#jAi9 +z=14PrH2UoV&d!k86`0>i1h=Ws9B&#>YIE>zC`!NK6&Ok>Nu+H+66e-5hBOBtsThRA +z#UT{~+p^yfWj+`9x3r;{)cJ`t^X>mBYSG9Aa2v8e3(6Vl2Ps2nBM&GF^KEjV^5d+< +zV_H|RG^fD$tlUpqH!*PfaeHU0s0f5 +z?tnISM`}BJQqMk8AIv=E2_C+rR-$R+*+(XUM{J-Hg$43yBHp-y?;M2b)$Cekrn&}ts%S|mIPo?+J4MWdFz`DO;E_8%04*RiXO=?%Eg&x~EdVrPVy%3M&i?D3D*c)YICeG|t^|$_GyqI! +z%kL_&Bl)lAkb%wD+l>&2mheZzg9E$(YqPWA{O967vw+*oC(39aKeU89T7rb8uVgJr +zBC@mNz)4CacD6uYu!xZHFKF|R+xho>=IVb-9Sv<0o&O|^zw-ZNWas36k(K$!|NC1$ +zl$#cybI!o`xi^RWE4PKPn}geD@Mtg%s2dSS0yorv_sP*N2m<#={DBwwj|%vkK6B+C +zw%`9r7=Pve$;)ngf0g(CIm{5 +zfLt~~D*;|gLA_u^gq`LasG_BUNP$v5M4XF{6i^;yIPkii8GwRZ=7Ip#(r??J-8e8( +zfq1&+!3L;zUr?Kesv4MT&8UhL11rk|HSLfCg!9z4vjZKyU(^SpI<%P;+6@mxeQtO^ +zGCR#FR0Vt^5I;AxAUM%!Oz;Z|Wfz?B-ZcnX4wne>qbv-%h55Po5^&B)UVEsfi3<(@ +zv5g(+AmzFb%8p>#X<8B67ZHL1CbHGA1bbvAgO;!bw`xhan;U2W-@%_A9$@%R#!Dbm +zjuN&w7ZO>*#fRVl{_rJ`z`IQ(0P8>|g6m}@;GrLMYk>rOnGW~>prsoz1o#3i!AKxS +zrP+aT0fGSu1K2qQeu+RosDlRor1O;7VJ{jCJwTj6XB2D$cn%D(2M+2Z6e_{`5ek$P +z{xVMb-xlw`{LIz=;D#~Me>4N&zmfk>0gL@7|KH#7`PKL%({I4v|2d4`+kY%}ll1KT +ze+mk63jf&uzvE+W#KgP`_@5OelGiTXb0*g;68Mz^{AB_D!m;4`{mM&kOLJ&P7**ZL +zsvcHkS|ER-Ce3XFPVd!z)~xI$k5u}HJkI#P9CcJk6v%s6@*>mYwrVI(rXf)+ELlbE +z`H={|eP#lwpUshA)A3xZ_~#8kSyF7Hz-I_{fs_(S#& +zIi>e%Ty?reR^tpb{8Rw^DwDdLIvG%?*G%9O6pAu!RcL8J%#`NX>2&)0p0w0G(tCA} +zmu2Xyn5UZ<%USbVO>M2JGdHW#E#IE@bMhqvp-+h*rNuZn`Yr0)%L%R`)$mg%D1i|lJ=}xQjoQOjwO0AWf4!hncw6y!Oc*BeS2o7*eU8|2@5~XickiSuZzX+uD>2RdX8rp;MORH$Iy^1ERCumf{uJlU(luIH +zihME~ykE#YQ9M6Tbfs=>wAZdXC%GDvWLAaV+iHcHvOezNpklw*veEwS7yO0=8%>4X +z^WPVUEjad5C1-G)dBbg>bh*EtxC=p}a>UVUZI+;#npvd`K`ql@}CuHWYxOJ((H +zoC^M4aW}s+F>QwBap@ub@Iysh0)5?xjn;)(q5~7V;S@}I$Y9CBUTi=kejq6_`AW>dE +znY4uQ2Mdh@h{>^7+4~tBzROT3=FKn%AbJYdy7q@vhwfJonY3w_flTIho}yE2eBG%_ +zO|sI@YsqXGe({z^@4nbYt#rB6b()xO6UZ$|Ddar}No*0;Uqb0?AKOK%R_W!W{SOBrUqNl)icJ`OSTnjm>$d4~KQ% +z^Lo&ur_&#Ay#)1#L_Tdb;H>NHcfpt +zU$DC5s(;F}wC-b}mStBpwL%t%x-Le`G(GLi+Z1YSnXMkGAh> +z2>2mzQS3mJ!~ta^k&hZ_JsEn!J09SV^P8FMV>n^<)?-72w*h8pg6)k8mv^4)jPd^R +zIpg^$)}NnT^4@B^`hml`b%{M8c^3A~uIjhk8VmCa7ex!iD6R-gY7@=AU9%!MCiAk3 +z?t_yrZse9(9rBWsUbEKKe&_aw+qW{ZV;AB^bvVxMa?lMudnoWQhqr*GX_?weFW>wX +zyp?*wNlxE;KkQCqWSQoOmY?`8d?i2kXV+PoDU9_lmff)4i=kbERaKh@m;jN@ZNN>Kv{W +zIMRUxmQj@qgVkNuB^riD(k1bVXYtDI}NcTOy?)_;NW#)^V +zOJm8mFDBWb&+}yD3aV#ZT(=@XuX-xm^#jA?B#!?ruf(aoL)Xp~Ex8-K-ak<^#0t&X +zW}%q>rNO(|9}sjzha!lz!UW?q3icv#sz?U#MUPIStT +ze2`mMzF&voxbWR=3Q^g&3$L?oj6kEm%W@nV=VjiITPX2vwBop2e!o#Z!JJ%%H!XSe +z_3BGvrffk?&()*rw)Lnysn~5E@jCulVxZ*xm5pj#%+*Yb8*ax753O#$EVMAqK0-IR +zGN^+^LS~E8?ri3X^5DL^1G$XncOE^#q_*c(`?K`0Yo!}9@{e)KG`Q_L<5A{%&m)

    RcN`2aH6L*_J&fb5ixa(4defu)<^q>biA8-5Y2I~f +z0zdf5w!hL;sJbA~5iNDT#nK=w?PbKxZFv#R&ZPn79{VR%>lCjG1SdN%I*cG~lf*In{uj@zFuxD`z{PphLBtAz`9Ur2~c4_MvVvr%lx>$O8n +zJh{2`%pGhGj|XUQW;Ptsibxc=P>~>xiP?C;NCWK`8p$H>Wci^qL2Gl{kk>koz8~2n +zwgU~aqI=Gr>LIiX-XhiaK2luMA%L}v$m5x=kqj72HuXn3qyOO!8U?X@mr9*TPG+3>3PVWrO5&z5N +zAd0(CXVogs;-{sGRa^CY_q|6FAV6D@|M&lW9LO&(_nmX@dFQTk?|t_i?V5|+?~9jp +z_JzNGx8Lr0VeGjzNyV%^Y5aXwhkRTFyOzR`(p9!I#4GB3SEXZ^BFX!9MM?4Lf*n6* +z^$eJQcU{aqyUJ~x>)pm@RMZ4B81a7|ud3+yy@SuMJ(90_yZ)8-;G)+!ON(_O_rL02 +zOR(#s{zJFs@WiuHtJDF(Y5sF;x+|5rGnR>Rhm~~d-#;sEWrDZ2S- +z)bzVIl`B7UQr-yTYp7H9;I0dkF5N3jc_q3R{~+Pu=N25sA?Wai +z;P|2$e~}%mOWr^K;z+*@>jxbfJU-@Ot~Q)IJGC${^l~DbeeyyMiLmMLmQLGcmT=67 +znkD&zp$)Rfk2a-8eSTH2;LeuVM0QrME>~XnTj{r?Ecy|&`%U?XlQ-XK7p{J+NuD=0 +z{}_MtNcYM)Q&Byk +zhqsd8{Fl;|Yjk_pIF_p_-OJVdz1JTetNgO}?O5_zyRZZPz6AA|!F{UwXPoJv9Qvpm +z|NPtZBHB^vo)v=bT}Oqy+ecgbWS>JmtL!zy`kPl%7ti7!ayK7I34HM5G&*<34uys8 +z#Y +zzVyUu!Se-Mcnel{xG`$Y_2K4T{Bx0^0Z#^G7Y}%MMRacMtAbmMjSCmYsTNd`M&BRO +zYgJM4vT}!~y6SblzioK^2HrSjZuhUlo}Soy`OnV%@>X{-U*F?ghSWA|ba-i(dG4XB +zDBfkOCXXuhoMWCwy=-^D%Ds31W!#u@ch114n*+zuqu!Q?2MqHa?i4$Ewo|61q*A;& +z)cV54E4?bOY@r_X-y2uy5U9*NVCE6pw`T90H#N1FYo1)cn=Sr@BG~LY>7?~+&xq-z +z-#pVr9i%9&`&Pa3?zgn}meAbT!ob{THnJ0ol5&MJyw*=#zAwJ$K +zU)XdhJ7RBs1-aUSQ07*6d1u3+E0t8{N(M>L{yYmbAzZ>sc0}_-Ph{lWuaozloFV9vyaeoM7w8 +zUN_eLViU74`gZ +zTwI?bdUws~tXT1QSN5Q7v&m7zmTk0oU%NFDnp`Z}t+;V5?1AmIQH4}eZEgkWP^nLr +z+kO&baMzw!clW%PzA*0R1${posI@4YWZvO5qj>9bm*j%<8N!W+_tz{u&^P(kx9(*! +z$DL2cZtM2ptY2Dot$SeqOFY;4J#2C;_w#2$c}c&o8SHWXFdTt)? +z+O?dW&w5ZiMZe!Ht-PpMdhXqnuy5R!=dTVc+7@>snEC3EbULR`F4H%x`=T7%qTZX2 +zJG=SRoY=YRdj7#*Po&z_RQ#?ZaklbRvVcdoy}K^o_{-?W_H5;yTjv!J5;6oQ>^&IU2DuUy6@j|;x4(W;%;2brHbrH&c7iz{6I$Zp%oLK&Z!-9V>A7p*WFOb$z&3l +zN*u{4A0PDiX76cRA7m?DE_%J~>fe=r!2m-StS_cT`_Q5$X+K>s-piAa)(aS?1ZxquCAO~c(uz{W4G7^^|d{A +z;Be#~6|Z`t7k$tvXa6v}8S|d(JVmI@>pyho58p2T(a-VgzFV`MpN!gm_=3Icg|Gi@ +z-F4q}t9@eD*<@QRcAca9%JSaiwedIm^9rYaYuRo1v;UF0d6q0WHOh9gHBc+o_WLx=%ZiJM_cxp$`O}ASRY#Jtk9?t?-hW!A`?O_oT_5e-Klv@sZbdJPcZ~U> +z7msp>96CB+!w}SCIlmF!r6|ma$qIG8Ib@e+%ZKM*CU6#QwdrOZn>^qL|2&O_=yIm#%LAtlIh-0< +zExzTx_^s$ze2*DrpI;lF`qJU8JO&mC&OM$X`g6pV!k5!K7^dW0!Zgb9_2W)YM}C!< +z)tizhRXvEhz&#tzi4dGFDEF9u@s|ftoi(%&Un6sqwZq{^E~>0|@K_67)@F$9@0 +zPHOs0D)iF5x(jj*K3(-VayltBJyilpA(=G+tNTsoi$Qn%8YZP@<3y(sPNzb&AZ+y88&on5jf +zo$iEOgOADf-{!5~lvEf%W-Yh=)D~3uUky#R|5khh;GggRGbr@-{r@(BrpsU2YBk_r +zls}C@YcKz{fac0y)=DNoOXEM)yW#miZyL4z{7;*JVd!3n43g{Vlhk1B10OI@%JpM5 +zWIUdlLd5{WzvadQsX6ioW|FRL^i1vW_o2!5Pis8`;9vCrR1p8Qz5oC8&`kMDXc{5MLi?vv8}0x2P#Nv*zfHi?bIcgeRsw=?r9po{G7w-A99F}R +z^?G`a8`o;tA>1JB5Sl`&P%2U<8?rM#5XT@}J +zL^u^zrMVF6QW0*5a6}S00H|mfkzfU@1WC2+{=&meY^|tqO+B@vM2_#v-9OjjIP1+Re3*yuf9p{(iC~ +zQ6VE5=}g|R7NPEOozay=GP*!yq&Im(jW?=;#?){FY8ZHCM)c5-iJaC17hv6z_4b4_ +z@bQaGb%{pu&>9KU5-+$ZUNEgG@#sykq?3&|q!5-F7*C8hotSAPD7}%OEpdfg<_gmr +ziHw)MAX%+O`XjWo?Hkn{eU(8H>Qx_?cCRk~C!w+ZmnQRW)ziQK>ijPi_ukK +z;YEcD_{<IfV?B6cv*pETC+3#rV&#U&p%;(3!)u*QG5 +z*9e3bOY$Gi7(vL$$RK29W*Q}W86~#5*da=_RHF22Ne23-l;J;J1KZ(038wr1*7X6` +z()zCtqmln#^!=aq{{Pd1FbUSes81y@nG-3rI%Ecc4*=c}?wC!Bub&{(Ze(f-5F7gJ +z1tWwO>Bp?VIr%@;S5v*`mc_|t>eqT$%5E9gyM3|(4Q^`{>7gcrNo)i+5M)F0bcoGds +zI)xTcM`^nJo3;NmvR0{MEwq0xA4;SB9}1=Y{r@%rGPxNGFj3zsH85T;wK9z&C6z=V +zlZ_l{*WJauY2$venS6mTn#JLXK^x~qa^u8;xQIX=SAfvAA`sAj$fyHBS`OMr3E8ni +zPGk@_n#G1_`X^{0x+EbTxq}Mcx?(w?&fA*NLaVC*;;S{OxK|K6 +zz(P&o4&_{!!Lf))0$y}f5L?UwAvg^X_kH^*YWFwhmyfhQ5ia3bk60+$&X63q-@ +zL*PQp=S2ylL!#LNwg)7L4s4Jn4vb=s=5RU8NPz%QSBbY&-q^98W7x0T966pQjaUz3x5dH&P6VSN|o&ZrjXdYA#3IXCr@mSG8 +z!ba%;8Fe5R!4!l;lyrImSFbo0J1{!L2nD%KqjKwlY1K=naP@(*Kspa3dVxNYizNu- +z_-ufO|3p-dryzuZ><~^Q8qF$@%L@vJhyrwL0}Ra^Rf3v`-O?i&A!6OIltMJzsD}nX +z#Ny~GP#+~lqM95jNe01@h#WaAQD~dM1;VjltWyDjK=rYDn!(2l +z5a42A%0Q67Ch$3UpqM&guz{@!WG)CMppQ}j(CeEyPyz7w$7qgPsFBFwWC=2HZbm^o +zguen2Dj47CFbD<=geHji8bun?zXj?PN_jK95mDtjS!&($Hmgh=_n+ufkOIpT5~W@W +zL~Kt6i9(`bQPqs>4`T-GNEX5P8?SaEiKe;AiD!wZRHelnOCmWUH60NUDF!`5@Tu!Y +zAT-pxJ=%8=>e`>a3+6`%q}@=l|LS9H3_G|GIGx-Fx?h +zz@Xx9yufO5J+)bmhQ@>rAaWa0w +zp9BfjkQ9|T6`11FspTTNl(Aw+N{;9Zqu@G=SbXmlzAf#C{e +z1(6es*Re^66hx9K>^QX!l1WsM7L3XXlOYN2oLHy9{4k>dpOKtYdMORG(#e>)U$>8+ +zEI|qlLR5u@q)akM3xa2oKoLQ3x+EFtE&TqG;DDuZrKzueqA6Z{wN|SDar9(KY6UWY +zpl|fle=>>2v>2u`ih|Lg1VqS1DgmJk5b~BQk8AThG2#C$M^KRi!J9Gq1vCdRvEV~Y +zrBXeK4{L(Zhh^d3!)3tjIi(IqAd`s!8EB2j@Nb;V1^fSe@VXF^9>nMS%akNI9VSEw +zx&FxtIrbw;5ah3sp_c@EPA~)l@*rj8N(4Lp&FPO&msKEBz=oo=us9+($RL+K71fQH +zt9RI5AA_e$P0^)_Sqcq^1B!DtMnFyWWLU01x`}4cgs2a53_*XVkxUxNmQvduo!FdATvWY4JBo=SlA;VB?OUGYNa|+4Ur>+(Eqacq|J@nN`AI} +z1;V6KlX{k@%g2mlXJtvYwb9{{?vw(PMTvSutE +zK%>!UbOViUK>Si7;@MXs_KHMo088PFSfICEI)`NUI8$!)z6|(N=cMl5UJm*&m1ht9 +z1hVE=oQ`9H-vRJxgNQOmAzXSRTzZRA1pcv&)+Ig5&sEyXyIb4~i&FiGgj|^@JX;8+ +z^Y@jH*F8XzN0OltIMeOu>Pk^%9mVGdXjFFO(=R}#ewT9}KE*r` +z@eaEU&$f9ES`c(nBI-E#FYFUh@$&IB3qPL>>ZRh*$d*xa(LNpkNuIf|8K9UvUW4gmuTil};vv^KiAxk+O-AIYMNb)0T!YCu5$jlGT_Mo|rhT=ns +zN9w1-LjA*I8Go&Jq>us!@?|DkD7Z=98_O&RbSwiIq#xX9`zn +z!FoT3dIN>hZGb-Ur(a9};xn5~Et~x;N#hAz2KCG`<|YvaY{itiM)=C9p{Jhv*Nsab(u3LH^{|4s$^O2r!6m9chR`L{WS|0?|>EGv|2 +ztW{;MMZ{o-`W9X2!RK#^W^K-GYeQG9=Y&oze9s47n_U~v2;S7^0OJ`8K;Nxr1W!Yj +zo)JD3WXaHjeFyKkI$#g3Y3_Sl=%4pmy8h#P?LDcC75-lb`=xSp{b#S7p8xwI*Q3{e +z7;n6uC7=PtC$jic4lVvLl;76+5AT9+atSDaduSCXsU4ncAt+MTsNu+u-5H2{x@nTh~h4R?L>Q8OGmt +zMdKu393okC;15}dPGSH;?|g$rJmx@HVWLi!bE%cu>qudwHt0s{8=@C7=M!wq&)c^) +zNB{d;U!SLcDY?x|c8gTk@?@{aaQ8%`-BN?ycQm^_(d70xbKBM|U)!~GZP&83WlPqU +zEmvE&RBhQZwQWn(o3%V8+kbq&^lg-}D*ksrVgEG56m7Fx +zZ#4&h|BY_%YlQ{6Q3zD-V6ID>#R&WBKAG+$jgVqL=z-U~V^V$4Ny(7km1{q_r +zg)tj3m;YEiof~&}1xc>D&96g0zKuna@T-t7B&4nPI-Od#5l%`l^eQ=Zci8W>BdH5{ +zG+MNJXaRZ0JZDC)O+ +zC6E7Kc>lLp{CB$l+e=-`_J2Eg+Wv31GG>o%0T+Iov-R2XUEpY|7`TEBKd@UFM7Jeb2=skaU9gr6I@~_i_Qn6Gx%x6!_&BJW@mg;`X +z?Cj7La(K&}C3klC!aBU+ceL;j=x9kCk9a{)gFs2^HG7UClB)seTeW`eq4s}tL4Q*) +zbas`?KNbilK?ocE?y;bJjN*XS;h#0=vjLdJ^jQnYdi2={)I$2K;=<;=qt0x8P!RiM +z$GLDLC^bcC&DH_py?A}IjAi;iAeWz1#&Z2%Jix`CnE!t{)&DPXRe!yo>h4ilM?xW& +z7YHaB1J5BkLSJSWM%r04*b2WMXR2(Fz{Uuk_Te|f2U9%~{51qnWuINR2f0EXo?|;m +zd6~~HTa6>(uj0o>xpq)K&7PEtdms!N4`fbW@4WJ9w6Im3E5 +z63`#YojA}GLAS_Ix}^POAbqH4MrBsirLFd^JE!#{Ay1!c!*)lTX;bY_)vovFv!OOs +zx$pU-bNcRi~%kDM04)+Ob5%L +z=(wmrr7%k1l%E~dyf>v8XDRj_gr$aGB)!E9ZEnqBJaZIxtlW+JRPM&zDR)Djl(d`+ +zO9g=?tF~=e4I14*+wh1x6j$h4L&XioukhgeN;vMmvMT1DmBmc%7eE-=TZa8hM%x{r +zz2no~qfv7vjdYJjZSN}R596Gox7 +zJpj?{%*_*NhLJ@95^8<2#6L!BQ0i75M2SxGjA +zT61=*S;h=$?ok{CEU%l(y+IR`-=`d%SJUr^Tp2B@rng;A^A<{6%9KEZ^;07AtWM}g +zp~nUKS_H4pb!Tp2Gv>?t3k&(8js~iAtH~h4jQa;}(KD>2n0@WEk@wb13?)Fn)QyMf +zstR|c87MvFizS(+YOM#oHou3lJ+%GG%vCX@mzNC^0+XjL4iUKX`l}xx=zwq+WxiJumraC!lxG +z?-KiHIOsCaM`Ll8kLr<=NA$=I@_Y+8d~Z_gNK9s++AFKMBnmSXB&i^I2ZCgIaB#}x +zDU-irCg(BhDVL{Q{*JkvZ>5lOdCKMQn9IE#K2knU`TQO8Ip26D&~sQQ|<8b@+L{b#< +zd!e+A<|(Gf!@pu_OOd)^+D`53p!G*m+F~s2;Jn}J{xO@{m$4}uNI|EaRK<%3`OwfXt4 +z#r;w~J^%G3u1NbUhP-_q*u4EqrGve+{a@lrX#ctW{m*~S!;mm-{};HD+g}3>d!L&) +zQ+*p{EFb?D@}<4#`EUFAVlf^6zrY~^fHptiW +zVW&+BxjaGNYS|IRW|tmwDezOu?(Xh#ccq+Rjm2SKyhlI<%*k)FHqDk(97TXhIKIOl +zRZ@=WVVPA&b6_stY3zL>b?d=&(EH7tXfok`eRO!(o=a7crDVBuZFYmlogN9c^8nNS +ziK;pRnON%eQ4lf4;QSyviX-rNPPT1{<0cbM5v>s2ej! +zojF-N`=T1$+A`F=yG_PJwzx~kyWlbGL(noOs1-6w?tEp1k5eLn9xES +zjQ`qXXT#Dchse7t-549fv3DwKRa&El!f{obj)|lLo6-&aNYWl?S=a2W9Mie{xC*bk}xkj;juLbBN) +z4W~fBF!^TEtu~feL6C4#U}(ZGpf%U2kx19PI-DC*)vE-xC9yO-l}lh>1pa8;q7R*V +zCmi?q9TKl9Lh_~ga2;Z93&#WcyIvmm)IQ +zO*n>51=Hh}kJ-kcWCp0d8Vqaf_}fHYNGz9&GQi$H+|oUGlnzRSV{WUB(JPToD}g(f +zB;Tl(`0Lm*=H?a1kiy;`a>SSn*{8)-UJ2Zmr%}N5&x2%uVcI2j7hRLpnXU5v(q>Nq +zmSZ5IvNIqOBjS@QFeWLBSk8>v{(TvTzWResW9-uG1S}X7HC|k@pw*eJAs@8`3kp=YBeR^gj8vHG#t0kv5ZX +zl}My;PxzC|61jV5dcs3bGo~M|;nCT+CT?{l-8Qh!*Tx*V#qpcm#h5T`F#|AKW~8b! +z;sB=sygSXA&=QM@&F<+`#LUyHjN*z;WL>iDKq@wxQXFrj@j1vA-jIX*PySHsNDpEW +zX2t&tJ=bw_^6_v@!IlFgrqYe-)j7ab)saO+mX=eAxD*X0%N5=69ROa6Tp@s5u^`sw +zV?=I089B*B(m4jXGprj%!jS=gSgCp1`8Gl{pDV44Xg)Cd45D_bS++yW`3O3+OR*e- +z2Y>Zw!+OIWY*=sT6YSAl)cr65upP;k0q_hNn*y*L>>St!)|@GX5At3leY_DLC0Jn8 +z=h6&%8krg(2{b>Jh?wkv*uVfo(;edzCdqbt*}+AvlO3Mdy1xznD*-b(G`P%V>c$l5 +zZ&QJDr|KXT)E_)W@HpP{Ft;!$kGPwFBG%jtPgEFBM~0hoFAX +zmxW_|2l9{T(4avIMwGIvdbvi9e5Lc6h_aSO#+*$H&Dfyh7PwBqXc>3vE#unxuX9T~ +zVna>Kl}I=jq?5n+biD;Q*$h;cP1f@Qn>T*OcmCA>2bfu_+IRwAN(BLWy@I|Lhlc`T +zGf7%wil#kZ1!EHv-D%~&tB$VcqQBaf}^CTm$AzJS3Zc@|4QY2YX5tQ +z>s8tRh&R7^TZTT@(wAuHOYMA5vGZ+i=8GGw1a9+NW@SpveecoSms;&otKC|_w`8^B +zBGXf2o(SEBtd6884eoKaH_~n42ps3i4yYSvYzd0 +zM&?FUO&e`%1ZiR6T#1s7=yYEGl0;HzO(_Lu8^^Ii@ZgcIzf8{^9H5G0Bp$wL10?AJC08bq#{%b+HI=dQI66m +zP>b*Z05TMk51M~Y&%C6KA2Ic=u*;CA*kwFW%zD8aUQsQmuEI>Gyjc{lxA}HMOJr!) +zy$b(~b+6!@x0J<+ugfYqLTb8BXd)Zhz=lDFs^q+iUZ~bovu%z8k_svYV=AoUF5>{; +z5*&<<)m_@I$N;Kkqh)l2<4$Y{iIP4;`3b;;Y~zw`8?r|Ictg~t-n=&XfQ={&cn;wg +zT8N^8sNlW8{p9gjpwsULn8E!F?V#}zFgvSxhOzN3#dDWT4Mn@gUzJvib~Jmk>s!g- +zrA>Puwg6om5P@TCRo62Bfl8$75O!<<0ZK8EpbjUIO-+{*Xv|PeG&^%Ww`NczGj0O^ +z+XgKWRT#d(P& +zpTSpdtt`X>MlLf4q&30qX0h04ZF2!}a^56^-s$j5t=}ZA0lDb+KDQdp1`%olcoufa +zm)7tcJ#-;Ozt$c8PI{-L*8QFQ*6KEPN%QMPzd0C?UO&_7T(nzFc-QLI+n0@2_l%rC +zzHVyrMb(;P9IXu=*TJ6^G_ub5CYuH7Yr@cO@k&9Y?*s5Q) +zYklYx{fpk93B@-6Y`4`t?L#TePP03Nj?(JFOVa!dPh@ajYqzniOzjfT?<0bw-n;m{ +z-#R-VlJj1>(S(;LO+XEOm04L(t9rZE>g|V<~rCPB+&>|TtQqs4ZZdUeisKG*kN?M +zi48RK&;!DPsVrQg#PvQ0z&;$9$^HBTepzQ93))C*wLh(l7H44r{sMb`WCiXOXx# +zhNX`oEtvGFFpc{>Z}c(}+XW#}nh_yTQ7&%zM?J2@6_kz|Q8 +zRO)vcoW9rmNgfSbW0K^F2(VA=@w?(B#Q5Jz5f>s*Fs>NCsxBiUFc>o;3ge0rWH3CI +z7fQiMUN}WZU~B{I7K7diCx&DCEMys)a-lQOWFA+`}VwM+^Ra$0!gX +zJ1hj&2tnB3aqpVn=ywE9X$j*H-Vbbs7_W_cSgx;NW1oe=-2py?=N7n;#|^-eTxQTc +zufPg5C>Q7oC=Js1gH1}aKeAqk5qJaXVQ7QzW*g<@nF*b}}{I(qsh +z+URsx1@#Tf!1W3pz*ib*m{8#^fp1<#lShkS1KSFDL^CPAZG=mlj)j{L49}(l_e|IT +z!9HeHddApw8uq+=_Av7lY&OaR(D^WMdUz3pco|5Uia+Bf7-(!Df<`@Xr~p;Q0wlsC +z#fe~Wg~jF-UAVz%G>aqv>JF0t06vclcO*f9id9=e(V>Vo_{=d-NTYFsz-X$&Txqb8 +z5%Dk(Gb{8bna-w@5n7lIJyaX@y$D-}6&Rprpsz>ftVELn7h7u>`~|dL^N%`m2`vpm +zR#LyKsjl=8)bU{44toi7GB*;!{#f|{*B4O!!JY_#9V3q&;v7+JFwlp=s%Vlx4*^9r +z`Z9D1`FnfCG78>KN$?6J5?)L~WkmD&*0yazu}MIg@YP9pk2_{;sOPe_wSqOQ>C7O6 +zr5%V8@<+W9C}AL)!>8~yvjb`cx>R|VG+I?TST8$*FOJZ@q=jz$-=Tw*e=&nVCw@r_ +zu>YSC12bpxsJRel2UI;E5(or9Be2Hr4N>z;6CSq0Kv1;=bir0os|ZIOD2;@dT)3Wz +zm+i3-Hh6RhBk&837;G|lhLnaTmo46I$%LI_w-SUPp){_YgQ6x%mq&<355(dE2b+dx +zu~;uLaf&lx+@!Ica@a_4AUBUe{aHBbfJmeKAQ1uy*az@P41;M@4i(jXB!CLyHtKGc +zF;MQ%qz)a17uk4({L#pQ=XQiUi9<__n +z!!QA0V;G^xckPeJ=|@}Ow=8ci@`dH$RdhTYebuBw!qAB4k9v#LOQVmdpK49mI>k)FTXP;5*&d!Zv-#g^Jb&F7%2=5o@3HL7sDh%!o;eH +zO9!4c3&wT<=6z4V$Vzng8f-n3g8nz<3KR@jBuATy1!81n0D6F+l#fnE&lQ(8o6C_N +z&x(e*)c;-bUiV!|qJzO*DIAax`bPrBG|;P)PM0h(OA(N{#6^A@ooh;IS-=Bt{s+YNnDkz?b<;kF|| +zHm=UFT@ZuK!RvtV46^Qw!gJY05HxlpWv->$%H174)3-FwlRbZD(a|_jhumE^Ep~?F +z3JQeCX;dZ{AJh!Ilprf!`ou!a$xAHIOH4gj&|uz)+@)vgLt~2Vl^n|6n$G^@we3x@ +z=UaBmK~Ki|eHDtQ#MdKF*7)>^xy7+Np+<-) +z7w{SCZMowc0!c!<=OnR11&&S%Sk!XsEq~3kDY54?yqc;9)u%#+FXdMukX2>>N~m=@ +zE$x?O+pqT5Tr1f{8(R^_PQQCnB;dx&nL8_vpO)~Wv>=f^Q=nGJAEGQg*SEobM;gSe +z-46A~tUYx)abe@)InaAMmEX{&-rfmzPGEWuMlj@fW`PIlpo#Zcq^nDzXWyG#DuDcdP +zN}VZ{`Ia+auL)h$XsT{k;kPhu;@h~*Q>!gn;MgwzKG$7wkd^Sj0ns?Ywuh!Oe%j40 +z?}&=<`V^L&y0)Z=JlP$x55ExHAT6Agv#EDTaIc3_YwpjrKFOC-Y5j}eCT|#%d%GPvR@|~lwQTLik9M_Z9Hvi8*zxinylGo<*PD$u +zB^C=yl#S`CGHu!3l7IW~+iPRu*^RApCEp5ejxo1zd|&(q*1O`*+C7EujcMELfZ#jK +z@+(RP?zb7~l**r0hCEN&5p9vyAY=ti*Gm*?v^exIY-@z$bf4vGHw>(i-mSl+G^#aI +zD1a1@7BVTS>}G-28V$q8QQ~~U%5{B*{ayIZIseATWC`V%w9Tyjl*s-ptPGtvF(fL- +z>gKCBMq1kL)kB8bGM9Kiy*r^!S;&uFJIlX0|E90ip@F0Wc2MHW$=zYAu1L*B^&{JQ +z|A2y2aR&QBVQ;ur_JG3q80)mB4X35V-pH(yfkYefi#nOLp8D$QNjmX#4N>$D8DnX)b>_6n;T8?F~! +z>*+Fo>SKLXP)$ne+V-XK{<$BA6i!B0NU8gYjk`~g|9sU{XIg}Z6zvwO{LfAM8zQ?? +z?0xPY)Ulm!6*%$N6E4ChCr`8~QoAj;dVa`zL*emW`#2N#@9@)?$yn(GxhEzUA0Pkx)VHM6 +zp`Vo9Tz5uWL~oxJJFUjdUGad$Vs=pOCUb-PP}MSrHXCVE9cjg?p{UJ|r)qJ=ZfdIU +z=}9rjY096WEO3-8df!B(wcOmu=ibv#sp=thHjue_^I>7DJu~0;#$TQ--zpWZS)h`! +zI_c^8U-wE`y0zCi3DVQ%Kk85PI_WMP*3CC>utw&UwF&30*!B<0O{>Nl_;&}@E9u^w +z>nvhg6<@bppyrv~`|ZEE6^p-a71%hrSJ|;*+`jb@5>NOpPwIv}4j=Nl$6vBu^~Ib| +zu^%O>Wn26bRwwKJdi?0)eX*Mtbg5)dE5BH$$LE>b-R!(Vdez5{5*rwKKUv5lA?j?e +zT(05r;-Ev#s`pN<>oZZ4vMMOBOw3(daI-dd(({(vtq!HK3>Pg={VZh2;)Ry9u=Mq- +z9PwWS?c10&UTk4Cz3OYeResFCFRQ@ +z)hoqr6?&0|``evRmghU|wF}4>f3{fmEM-OjpGHVm-F0O9{@QDmKfkf`xESAN6sq$0 +zWJtSN(!%vVy#iAOA^mkOhsz4bWL{!@YOm-WDtHxgreuY)oJg!=S8n0`b3N4i2YPRj +zo}5(@T4S4<_(0Aq{<^L-bbQ9__fa2j1fu?+Y$)c{5lAj=($?3SF}00?x>uz41S?Ux +zPZmaO*qe*+3uxyaqF1-_b!Pg;84ez1?d)v47PGA+r(CSUJXc=&x{qUt!iH^Vm{4pw +zUQ%r=vWhL6y=D?cKRV;8;ox4@&Jc@nc91!%amC()eC9h$StsC_TD?-J>bIP$?{bQ_ +zx2IFZ7bZ7H4DCu9UN48_ +z`$D_}&-6{b+?8S3nT43{o0oOEJ%$waQ$_ri9npL3#_!WmteOyf%C;kYm6C%GU-I4s +zpKo{zKo!enRBsJ+cC4m;l=*q!W^0~z0L3Zl`7)sr5w-rI2EVa#;|}-pRX=a5ed9Nw +z!0X7Gx2)8N;?>Zxxbngmjn?m=6COiI{;LR*Y*hWx5^3tklkKens{(fM7io3ai)%yd +z2frMQC)GUd_mxWYJ?Ut*nbtL^(-@i&6D_evZ|kmo#%VkAp@Da|7&=Q`t+I!z!lSAx +zD~FCQ9ZEO(e4_g-sb*ZFFFN^2zi%H$ZEJO@o09WEzAcfE*359D4CWav31{2vp}7+Z +z)b}p&e7UP$u727+=(g%w$2Xteylh!veMUP(hBLn+U()$(-b{|5g)yt{QvI%2v3(7C +zirxYbf6866#1=|+)b0E=q8hR27aAKzr)obw9UR_*83D?5%tYt8t+6H +zj|V)W_PknFCAn|R>CULrok^Zse%?&GdVHYHAXk9%yw)~TuYfJEOr-kQ&nAbwdnK=T +zzlE8b)W}nJY)Q4eu6yV5$qQM>Mc~COqlc?~8#|&qHsocuiI@F)h@ZSlWo>Kv6h-x} +z*OBYGJF^W3<8%iED4WlFJv!X~)bQ0^L(=w(J6;HJs!NXr>_~@bw;8QWSEuL8!}bRY +zWEQq8n6++-l1Bz=Pty^v;|Ah+@RM{aSAN3@ukVyy7JD#8y1QR)mK6rW~mr=jPV+SNI1V1JCrJD +z5X4_UQEd#|`?0yxXsE&mh(eWmeZHs0&r#&!A3hHfK_v90)5GC}XulK^V +z^Wu*j4+*dyW|8&pK$7okDphVcLTi(dCMojvEF((uuylwC0}v1@_B*teg%ze(;cqFHMLo +z4tij6TwC;fXHM&WJFQs?<)tYGaptz6oZwR_-4`xs*rV3qEoRIyPDDjnuXT9$OQFmy +z)~_guV5G3 +z1VSnC;nNd3cV^yicb_a%9nmCu_R+pKZ|2^ad+*%2bLY;y=Suc|_R1w&R+V;bpRZ>w +zyrKNQD?fPo8w*Bft?W9wMn124_l)xwA9!iUZ@)I@`SWgDu=%7fx4yZx{nOv={npXv +zw>))jUG;6J-+M~z)!|DI9%yPBS^kIWYuqo2j)6ShXBfIgVGv5r% +zn}5dZ4}Ek1R6wi0q4aJredYIkd!uto7XI^RUw-hD)*U0$X52aLSjn-6gNGLMEgpPS +z=)Pt7qM>J=tUvtK(2Sj@y+7}JH=MNpnWrw96L=^vbNgF|?)%{{J7+%nU+b0ibFLbx +z``vk0c7AsDn-5HX>%XU^uH4*x&gzT4eeG?3eZRE*tfo`$oEQ7?js>w7o*ao>GyCy_ +z=bt8D@ZxWN(D=QR&$u0?DOZ0(_{j$!%&0rG{^5;O&3JoKDHwGN#n@$r+4oB)+?80H{EpR +z;ax8-s6W~3*FLGADIDP*-~H^vrTY$FviRw{kGxkYZ_}?h=h>>8x;NhAX_zVevc2nx +zCGQ^CiQcB1GWH+^vWW5Ul4-a2b>-`;mS%PxyApFXSZ-aBgUd2aW+ +zO?w}#J@)E7L;rbpN6mn)lr7$N_~3%a7x#9TH2Is4u0H$mA1iBa_9PdUw4$HCan+gf +zl51A(ee=+f!<>(kL!sBNUVB!_O|t{x2R8m=;;)V#kxITl|5o27PP*;}aqD;g?e=$` +zyJycwO80k5nhrekAu6jVzyGNpt@Q7d_PzFZuO?3YkL*)-uZq6<&Ys7f|G}J+uY9Lc +z{r6wZn19`6LqD26bj>5XcRfOm0?iG}>+h?( +zeA^f0keIqA^~&@AWrzQNoc}Hh;i>b#C*vx@fBc(H#VZmMhT}N?Us0Cw&;OCb^3?vH +zNx3S^%RS`?(WM^7_##{D#2Bx{r2KUrDCykW0qdDf5bJ9#Ub0AF$h+7$%n(+iNP;?& +z>%;Gh@7wm2S9(02`NpS)sesi(kw#XC9cd5+0x7m62q<*qNvk8H3>bV-2F;^U +ztGb4KEh}q#FKuY=Xl`5HyL@FUhc<6Ud1j(y|w~hSA$W +zqY5*Kh6PHKUH#^AFI@r$YC)9ofUyD_a|_s^d1*`)LbYb(9RY1-sr0}?GG-ZB&L+#n +zjwNig$%E($F)Xxp2}%#FsAf|e^fPu6?*f}67i<9*AeGr}OOAEmuM>7qL +zW>ANU +zNgRHIP-VFh@OCl6JR*TFSZQG%RQ^CEQ1e%l?sZ-YAFa0kT#yq +zB-T0`8gQ~+hp;`OQRppACgq%>wpQPeFEjiR +zWn$yQ1mPgj%2`B^G8!DBp<{hB27yVem_b8$aNXVIyli}6{IT(*cwZc&KVig}_&hDm +zfJ6Pe%=Y!r@EamH^cEC9!=GlqP=upzLBf5h8ommps!brMtPB~r@C&~`Kpt^tX00YT +zQ$6Ui8bTSrzsiyXRnrUsg3bIjEn7lTm#Rom6?51jLm$b$$TnOR8~#Y9!tu{J#^G)YQPm_bu|DC( +zuu17IL`U>F<0>P7^)J;*&^k~J?Z-0TxZ +zIQV!%!C7Ri)u*jq5;G(BY4>Gd!7L@mPPxX&k1ss_|Ez=TeVgoZfJ*20VsoE>dq1{X +zoZl5~8e^0!r3^vY^HhZb`Tj2dBcv2JFo1pW}iS#bJ(F55msE)Q3>uvcx%Tr#CYO~pq +z0XBrt{gWwrPJd>|+SQ21R=eyF;|tsJz3^p$Lg^_r6;3Lr595)KD9B#(mG^9G1NX-j}4z}^&`LVOP_i8KwTkzba^`aVu&cQhR) +z!2tw+@!Yiv*JB);FD#=Na^dQcM&isEIIS<9?y-T_keMPbrZ3tvJ2_Wz|NjI!|4WYR +z|CdE2l<)r+m8tXpC*{iX|1;-5`3DM5spLicpKSEN|3$2a2k^*ldjB1MY}g;<@akJ< +zu4b&mRs)u^zoO8?Z+P>I`OXb5)z{nF>yaed99bR95I@?;E)SgR1z(6C8Ds~=5*rvw +zNn({{!@7J#Sxlt)&Y*Vskkz}(o>`u)ROT;kK +z0Eo}nsl=hC+Kwg|{t3B0-|jAGHXC8vb!;qbRIzn7oWUchnxV70!CXqqAj~!uSfypM +z)R(NOxRS#uY`CV;!uo}9E^00{lws7Y0Dx^QYgUC*VzYR7SD`p&-NM0QECbXz-B%w#I17hcTVGvG?l$AwMT>j@J_rdMRJ&D83}c8_jIg6ibWGeKJbnRG +zI06ngM}yBF>FEqo(`&G>`}ru9Y+`Fy@n4wWI_29BWgZN<+dVIzl8 +z8YPw%DY222*g&4Pk^)wVCVL57;4(k~e>d7PHQO`M*N}I!1r8d$PS0iFyG1}D9hyIq +zOOcjl3R(&c1(`$oKpg+1i46)Yv1}wNER<`gvrCbCYBm*jIPs%eSW#6u9Kplns2)j# +zR#jIZnj$6zKBPfr +z9uIed93nN*BC4P(5eg)%Ny&I3;tE6*bRnVXgd+(_3iDx&+$Uu%#A}f-X-+7l3Nkj- +z-GHc3UDBg`h!jldNmWV`A}e7f$%|T)5LOdaIT3Mh4rYQXMP)*hNH{DcSrZg3swpPH +z^^g?d6Ye#Uh$ClO)W$(ZG8MRK;+D(kCISiIAeW14+taR1{fr +zBvDN!ql6=B91}`X!<67rNd-i%5*rG|L(v40jYyJDBoa|d%%q-7%3&fukx)bqY1$Zl +zC#golx=j0vE+%wEC&W}GY+p$Nt)b3G1VJ4`?86}`tVam;xF)GdQ6e-ERV}QEaiR+J +zctp{ps6Y*L`}NNT!wA5b?BgSvZFt5n4+s@*u?M06AIquv+l2!%Von`%^uDezSA|O~!c*+X7o6E#h_jOlPqh=hbWgRO|{ +zFlz(u11QXvoCus6fMPsL6uiX1^8~Pggn;+;bAExLz&BMSw*_9pc?FTP-~oKzgfCL~ +zB7-jx$OaY@zG%P~34GB8ADSvy^%n_z$%HRZ_yU7(5Qbtg;Y$X5iNF_Z@S&}uReyoN +z7ki9F6C1z86Xn;^;{5W3$}u6iGOV7Hv|hgcpn!=S?y0f^v2!pq9tJLTVIW561B?bz +z&cN#D9atp?Rv=<@JbYd1!dHq`EP~eASkZx&@LL`azn8l3o8py<;1wNs1qWUt2mE;C +zKsr%5XmXJQ3ClsKP!1%?T@H{u9zkew5d?|JK^{^N0~^vpF%X3D$U&2f97s$I^07Lb +zT0{zz@kl|Fixfyq2=cLt4y;9FKpKw>$R{cT%`P$!F7Gdt0698_1SsQ?fMyp72vZ3t +zGiej)E|IE(OJaN&KvC>1KpA*ui-@$+c+8toEfLIwk$ +z56;x7mcR`G4lu$koGIkUg!3#~>p6BRHEp27V_V1<@d!rkFNe +zTfXE-I*k;WvYLZj0?wrmW=7WZVX4Us5N_f*2~W@Sg9FhZ#pxSEJ_y5@No&272$q-*>g!pWF&VMK +zVHLT@SdYgrsufew8H?W}bQREm6U$uBR$0uTI=F@`sSl^{FQznGK4oz;Mr0a>;U_i3 +zWL0G14r4(%7_C)fSRdw%xEWGAoD-yAVYkTh3uzHYV+5Ku1WTn*z)Uo>)(a|cpVMtgh{|}VbupU5>3j~hkiseB$v%_P>~T-5&^%nz +zyqTodi>b-Ln~Ce~anHyQ7bRO{VlXAJN|7m)1;&6<;{)Zogg7v?UGPVC_Qm&Tfy7t=k)rcH3uBFo+TZjVk +zwv4FQ%=da&2mvCI0-lCdE85ySJ3RU8@KgQrkMDBn|9umQ<9PjFR`Sn(lf{rS)&D2s +z%3uHQBkTVnTl<&re?0q)@p4R#=CA!bcm54zw2`!K?Dne||L(rzAgtAc4(T&jNa<7I +z{yi%Oz*rM!voP4M@_ARr#}QHl3ma@x-xtlW3BFwVKW_cR;W$qJ7eu~b|F6PNo&Pu~ +zS8xI^PcUdH5-dSPmB>t$L@GrA3DKA+$M8+wKH>?jg$E)~(!`eZ-qBtMS1xW))zXE +zS%wv%AL8(N7x3b!H(;c~EDjg5mBY#uKjOcCY6|s_?8?*s#)qvY6vuJ(zbF;Pe@@wd +zlXA_c8r$HzU1bYmrO4ykm=KQPn>>~6>8t@g9@`xR-0OH +z7y0NrtV>f#{R-s0sNjqRFY<uBh$oZL1-L$bEftJ6CBtUm@dRrz^D8{Y6I& +zGAx!1vYlO$v5L2G9*oSE5f4n@kH=5A8qIafYg-#Q6vG7o9_K05N8vkWsI_)UTgR&2 +z`i2!PZL8sH?MoXvYrFzqA$h9+!x9euHn!9*?SMNBt+$QLoH-Pv^|7Ha5O~~M +z7ISZP!c$5S1`{@%7|TVA$13DupGk}5)y7jguvSYAqu>yt%)l>5X<%t-VyLk4d6_Ed +zz>z5c1Q`ef^4P)IlRb&Ft`5dLrNaX#m^3JoU$rl~OZ-_~F8aS>eQI#Ra2!wn^9Aw$ +zA%05#PtKL6|AFsh3IDFw;@eW<77`M{N_~*9!XU&pR5NwJWgroKb|bpgOaEN|6&t1J04=s9*_LgpvTVa?Ck99tTa1=UR>3MSGfl&IaL<9 +zt=I;8V+(Ahl#WP>lFA<|)3<`o`@)>jY$0cKrJOT*dCF*VNp@y2G +zU!TH)yY}^WittRuq3eu@;pRGbz(jLZAP%KTOWD}Bpp56oNueF-1u^@E8M@BCWr={{ +z@6JC25K$Y|6gE(#thdWry1tp?r)wj>&hN;sFTLdHQOwNZRYi~0YU*tTes@Bi_9;($ +zSrjp=U*+u83G(g8WYsg&-&OB;zYphlIU3=LBo$Tl9=dwwfF`c;z#rko#7{79ZxyDc +zG{TL+3ET`}MiFjRCc4KP&|_|N2`87a52&()mesRqgrQ2}DhOXXu7FIyI;FZV?Q6K& +zpo`Mmmx^4R;Oi?S8clHog8Lv%BZnGE3ofZ>7hbm+Er#jzT3gT^6Q00oON8V6lk1-{ +z{+H_iM_v8jsB)4W1K +zxAT%({;;2I^^p9+2N)c$>Ps$G1=Et>idDvMIf~!3jKvwM4`86ivyiRfyN5M;E3sC7 +z4Y8(WEGg)c8*yNrk-y={UV-4#b;N-IAc1!1u9)Ejx}gzo{%W~=KAz@S(EqsqCwc4) +zFkg`WrQJ54^S?aBv9$m3_anN1-m(5`8EtFv`)|{Fe*gC*2h9J)J1(>Ya01mUm6F>e +zhF;@IBI0x%KhI)7$MvP8_ky0?sV616SuD4r21;}im02b +zLRZE0jb#9mS_&Sv2qhcp#BtmxWSgCo(e+v%Hau*qRwON4Q;~+Z{uA +zrfqXeZ#lNp5~gTdd}UWGVrymCJOjkZwp`Eaa&#hXby_X6+iG%GcRj0hKWvu5*06P_ +z!=1L?@H%G4)|-yy7~M9^T)=D7=-dxmTVbkX>` +zqr+=AtoHq|Wxe3En+@J<3Eee?#kKHgwT-49mvxvZ0*}M+&V8O$TR{wjfW2IX#i`@ +zyfJaYa*=WyC2H=Jk2ywW{$0h}@OwJ4ngV(KqZzn8u1%Mh`|xM}y}f2>8uPIRMEf$cz;wSw|^V0tOWtpUh7UIrVFq;gRo!aZzrHii$)7 +zlqo`6N|(&4Qc6LvQOSjj9?lP*QWKD9_J8FHY=&MX?8D)!_j{WKrdc9`yYHzzL<$Mazmo}>EASJ~!UCW;BUG&J +zv5dhrAVI4wEBZq;V_?9rWGWory9S!G&vx>=?Ik)ZLN#GdVgYMktB=n3tp>M}VrX>+ +zOrj(!1O_pNhuykA)rc<_lzFae%di|rN#bM55oa9vj`9SZZxfG~6L6!J +z6G0z3G`4PY{L})lcT3C0EeIvqUy2UJ_BH0v$_5i$ADGiAO9_GJ0KYY_KsLSsXht3ajXN~z1M-*q_eBj4S%Q2S= +z?4yU(M7TbvhFglA@^~Z^p8UxTqHd+9OiHarK8P^k<;ZRlqBv7uBxrvWMzJ`T!yIcW +z>R2T6)nFj$hrVI;Fbbkk#OjBqtbW#D^|#-XQ$>9MQnmk~VQO^xVX*i5<6C)t4)+H~ +zXG3*$_`08+ejJ_*4i4nS!N*r`_7C=kKMYUz4$oD99(eQv;D0k_r5XB}@5;Nb +z?PLYu)S0S_oUydq3TBis%pF_%jgF-#S45K}5yanwe7R8!#T~zlplysQBj5c>RuJBT +zVKClWJ$4XCDQ-Cx3~}OyWw|tiPNA8V;nByF{$3CC@;*kiN0q*T0DCYMFDYJmv3D@s +zyHk^^DfbKYxUo`?E4;UB@g;@6T!$NfSclJ(^9UN;RoZhRHRzA~phew9O?dw3n(*z9 +zE7kc5iXKm||GBMMs@u;WtlRH~Sgza8Z`bYT&$_+t;uu=gkyF=3$NH^AOw+%i!e82^ +z+w{Jx6o0wh51Ix*d4Cvy?k?5_QsvJzx1DY0>S{Z7wqbF&9dAc&unlX6?eX-NZJVd1nXAB9$>*$E?GyZ$ +zYU7jKC|rb~$S1K976}t3`tHd4Y%WK6u#MMO}zZ2XAF5bc8F|cyF +zJq8|+C)<7)`~i-R{{TnF4{O_rNbV&;z7uUbvv}K{Ot)d&f*hIflWxQ4*^Woa_Q?0P +zf0>TpN6;^Ap;A0oLqJ|+YvsTC?btv6SpNR^FOUD*Y(MA!e3Ikg@qdly_`m<4W7YUi +zE+4OsyY~MX`px*?X8U>kKgDs&=bE!9{+vv?n*LXPsKFgy`ybwJ&3&#pI$?vogS}H& +z@xR+2Vn&7c!{b-|J%($+7hp#`?op{IgJG+9OD?U!>_g_#k5v_QtGCnIt^DUdG9`pf +z29UCQ$ZrCD9^xpFsX5#h{jJq1DvIUOqQC$CdkK3}VyByr-txCWWbw{$QGpZos_j@A7yuD}-bDKb@18>f@ti|e@E{%^L>*>A4@O}+UX|Nm)@ofm_n +zKKWE(7qjD!uMhV7Osm%GXN`WnJ~$n)@86vs9^lfS;?O&3y}tJWH!?G=6#VV7K@s0h +zPwH2Q$UsPSO5t>zwC1L+wp-c3d-z9icbAOlozzbQv5P^}zLz3MyOYm^&4wbrfCb53 +zNfg;3h38Lp>Jm(%plF}52zpwQUc=L|5UIw-vG97@ts&|_*lSLbXbfNF_q0@8rFFcn +z?^eFrp^VrFUd7#T7d@>H_B~KhJ%z%wK^w0W6t-)da*HG)?R`9bQ|%y@ow{skWyg-( +zYq)m(3+B5$4WYRYYY`0}W_N)$cjly;YS+T;bNp_h?e6eZwUO^>tiHQb=L)C}6|W!xH_8JEwm;h4fu4=R(XPV0Q&-nJb$WUW5?3Tn>`&3P +zOWS?5*x!`sp#OHCLcz?Y_=#2_lYiLGi)wX_U94Iyb8!NUonvdrFZ>ag)q(681<7y@ +zJv{@F{OT(Zqk^}7=!z>+eA@22Xd-gvWCsDUxnl)_m(c}w^AY^M@Wmx!+Nnd)dqT?` +zecJAj{yr4ijV{9=;xP6G>g=HyK=om$9AJYyc_=)7yof>=DbR+pquWFApd4@;qeTKO +z$Hm2i>4`DUBM{SRnQ*HM|p4^{7bEuU<8S-EFRY|?vD3_5C_>Kq@ +zq4;?quZp@Cn6K1lFykI5Oi>F(T2~r0$;}}^GvjaYdFK3E!Y3QBsFh0EMk=Oxtq&tX +zL)fv2q=e*EUADF~QpC$AJ%Fiv1+Y_W3{07cpnzMPdE%0lk*I`RNfz_Um0DHlJ&Iv+ +zy#|mT_v7F?-$up*z>7J2Clv5?%r686ow{Z*W#|>|2-ApSU{ZRHF4Kt+6Io`K2yYf( +z3{whaRYU$vOZ4uCY(zfb!6w!Zv}Z)3JF_hifh*mYF%Td6D2LFjY~mVojGGuIHO2tb +zIPko0?`3S?5g>E**AOoWin1K0-r#yy2 +zvw+8d`I28J7}5qb24(`g6n5gL3K%ZMbI>u!xSjG6#x;?-U!+| +zig=K00%pR14V8}Ms)?JD_{c-{OpxF>mHn3SgR^&%3pbeiD(90bfiCU8fO(6;k!=!8 +z$Iv+=ktP((R%Q%JaMDF5^1#Q)xw!Km<3C`t0Bwep(kV^RxRC+ZRI#;$eLOkXB#vO( +zAq=i2Bk`!-BKARDgby9O6A=R1>}f0@J^ +z-$2(upIr(SL7gMCO{Mihr(aIG4eh%#LiF^6mp +z#Rh1vk8+n0xXFZ1{qIQS3z!RnpwJdH-(7ck%5$pn&WT}e#O)EmHH|PZBh$=HKZma= +z1)_ifz2}QS4Q`%gwTfbjk{rkU8ih&4vn;oH+$eO96Gfk4I+kijU10bR&^C<{hx+n~ +z(l@wI0BH7r;u($~PYOSbifquK9%9pgrx?6gjuVhbm0b(Ya6Khp@F&4FV0WUa4}A3E +zXhJPkW7Eg22YGm8DQ7Z63-Uh}B4;0swoHc*noM78w)sf-&D0B!C7@G@*=eXL)ntT +zq@geOkzjlCz>R1)LcjQOlZhQim!Nhsti-nkw33%;1V{-M6$DpUH%skTtXt%PEC||3 +zJ>O&_Xm3bZ&4u(1QVrz10)PUF#=n*AxYJm)KV}H +z)^DmFoCfmUM6izLC>;z7mw2(DHb6lpw4g$@p)LxwQLwHU^Z`yhNS5qT3P^&gkh)XG +zG6Ri)-xp!#3zaCs$|09%oKHiVU(rgDTu)H`F2I4*tBMFe;KhE4mKa5+5l({9 +zDD?lWL|4wkpkOIz2X{Vi=8{i(b8aZf($E?ueKZqLGh!e@C@?thXht*rO5l1_m3Pr0ZnsWe`Bs4dksa>&47!qFvH +z0@x|D(TJisqimqG=X2mJ^ncAX2t~J3N^TQN0&D#VG92eDXH4+~A`E>9lQxmdPC#yO +z9AfDa4F)A^fR0q&y6++M22;aQ5^r3FpixX&gOdn#QU(KtO_)l%bHrmC-3d@+U@{f%YU|1s&>xv~ +z<%<7j?@QpLs?NnH3rhx-u&B7VW|I;KGmvOC+c}*8uoaAspKcW}W)Q%K +z4ND{n-Z^vuz7VoGClWXc$U0ou04`o5Zx37maJ=@23JYVG^T27Tl_CxqJw`AIXhcsS$H7h}8KYMQU}QlX_yE`|9$9Nd)|u=qx{&ao +zL<+JSkb0aQ$ey7`EH2?CP?{nz7r3#$xp}d6&UqQAaXBPDi3TBx1?TMUh{E#+eisp% +za~#+gKYTuxA0IC6*C0Lt4~V)2!Z9&rG%g1tnB-hgRCCS{Y&Y50>2ri|9=u$88aZUK +z7|%HvXx$*Qv~##DOc%ilXCU-Y$a09YKs(zRw_wE6pwO>

    7vILk*vAofp%dpOsD +zgan(9rx(nYvXB=FW-@Jp38e8b1OPA*9>}0>wZN$9^i5^xp<^oBYsLY=Xz&%6DyS_V +zKBYONie-bUZ#dbCU_x1VF~pmeiC`{H3(zBt+vVUr2}PO_jt@a{6YW+Zy{_nxx355y +zN~$?a!C?Z=8X-kOMMp|YCqK)tkJJS=&5uHeM}$wu57(A~y={7!kroPW2iJ5)m5p%N +zVk|eIL?Pf<9Y|K~W8i$cL{ff^BLQN>Q8L16gxfMPZp2=*le4Q6ky1do(qTOb8_)Tb +zYauBX=#La&nM}bCUQuu5T|V^TZEiTgl>r?13ex3*F_{oDrzZ`becpyWMK5{98;Z0 +zM?jxvd9J+3H>dov%D3kAq%fu)pF90KzIpbYCyp+gFvY!K{jyUym)j2u`s` +zvo%_T-H;3h0)b+*96)<{!gTPO)K4jCu;4CfxdBwRg<9AJ2jEj|WC~?YfPsPLC4@7z +z6q7A^iak`PijM*R1Oo6WW#-Z(_YQjRkVL~=7r~q3YCSxOrr0Fq$AFSt@z7KNf)J2Y +z64F4O>ewBQU~~HHtYGeRor$Nb7e4f`-=@!)$^JQKm1m*eGqtMS@IY!Y&&(3fdAzrx +z`C{L!S|zprlf#KQ(u9qMYQ==zP}e+{Y}oisS)c@M*OS{5a~uP}x9}nUURPD?XdoIj +zH#9G(gKuhx0>Ed*@>#)f0Bt0RGw<&$v+0nSmT!Hg<<4+ue&SA(taKI7V}x +zj5rP2EkE})YxpH&wpVu7Y0yWSdC=RFjK{T)lCzKUf@&ymkiFCalXzq*OxiEbvLLBi +zMtK%s)I>4bGZ;AR7mPkN5MqZVQGpeJvUBUqC`ErGT!`%S^y6Hx`d1*Jd0_AujLdb< +zfLPcMtpLC9ke@T7u9@d6`v>PELR_>C6V3pEi*v~~+w=!L1DLKNMQEOi0GG<(s9ozd +z5);yg2VfiA(3#=aL*3Qm5w}5*?100v&lL{;4Pem%DTkq_)9CGkI16Gv69J8QhTHqp +zVN<>Zu04RtJD(a@(&h|qC4{{p*ngH#S>{Q@uYg-M)KKa`+<|rku@VqU#F{D(`=Jvk +zmK2fMR?xBrFfJz*4xg58YS!YuQ_ZjX=Ah*Yx&YK<*q=7ju0welFN4azua +z+Tq+Paa58;6~Ya&BKD_J1VQLbYmH}Pv$?j7f$v6s6#&IAo*PDeAjitpv7CACZh^(C +zB6XW7^vS5<0M5xwaFdlD3>rKG78+7O5V35r4y3ShjXNuVDl>p4+c-PZu3|bQe_GX2 +zF6oGZ+&U)oVq=EQPLf#$V4(YvcRek@v+z$sEwmUi=8bXIJZs&iVuFrd1)^xKdmlEF8}*K%;p%Ld<^ +zKQ4zuO+mUf!12DNu!a5&w!{U>D8*K!AOTy+1YRg;c@myJ;w5u^JHZ!d^1$>KLG3zL +z%E1rY!bT5Vmk%5~NEavNs3-`3U3v^JFrzvv6IQZy6QFRnjhp~l5lZ$zauOmBl95qh +z0x>xu)$Fzf$S<4$y7V5iE7_$1B4&flEa9|_YZW2@+x!4g{bKQsXpQI69STmI-efjj +zFwR_pb0+Mn;L#KW%gr^MhbOHBcyI__2X%F+rb0CDv(FisN(MP8g|zly4X~}xCLJuvgiI*pZGg25i5}|Db$h9teQ52KN+bu-x38XD +zki>DIXi7;9{$F(qKAA>Rk??|`a%6a9+XbTaH(oasvQCriI< +zyRal48pra$u>kKP_B#Lx1#S!+5hc3}ADjl&Czt$D( +zY>CEzCro!(5jcYcjMLIq0316tAsxYKX-q$IqBL+hb*m6Pu(86gI{GEUf)T}e03190 +z>i`s?WV@w#`LZFAe9E+9h_DGCvo>;KF=vJNU>$vcYoO+iMc~w+eYRUA)2{&;_-tDz +ztqfYe1VT>Par#7fX)Lae*BG&oZM*92Si>yaym%+@ri*{Gze@ikvA{M(2Mhz`o(W$3_~R&F+JD`1_Ph_ +zv`l!QnLCuw7{KD8sQ}k!^e{Me?kbB@0U0Q`Qvv>w;!vPEULkYB87-Ww(=cN2B!ZoI +z`^Yc($<3L(jA6`V0%Wy>;O{`lP1r^|c4}?mXg7o1`Eapl=|WQ)3hmO_rWNZ;GFgf& +zSVFLZSxn?iy5o#vHWPvg;G3}rNE2AIVSrR)1&mZLeSQQ}$hiJ?21)ENs5SYu%Pk>X +zpve$DYGBY{baARGgG^%r;=LYf!WhH;zg%1ZlmGJ2yzI=2g576vKBvF6KVr<}dUUHAs8R` +z3%+0xK_|(>Z%&$z8y+&c&nagnW`Ml^R!0V@vw^$wIoQ4wM?+i#t`V=#+^yRG)8`-VJ*4SKeV0ANf$$(VE0OX#FA|Y^=M7Cn& +zl-9;*ExZF%XLI4WHwao&IDWR7b|&p+cx1L?2fbTV<3h=6PWai +z$Bh*+Rv`&xsu@vZBhFjapg|B3dXsbM9$ppqg^Nanb{g`<7gb0tQP94xWmQer0-ZD5tf%jpu)%GgmUU6#0j2FQT{ZXLRx;zyRD9-H)_<#52!goESvXSijjZy2W= +zh>2(c^vHE(D#aim{f<0wqm2#I;X&^%v(1Jc5kH(asbX+sf8$AqV4US>q&XE@N$RI%DIX$k +zsL;-ljG-BUqJH)SK4moi+exLu>qFiVAaUE1C1eaZ#?=1CIFB~Nm@V|5O&X%=U^?f@ +z9jn?X&7D^|fi-W>7uZ +zd0|iXZ7YKB$g7>!>u%S +z3`cjAgWWnkZUXwU{PI2G7M!S1`KnBf6=NJx!qmg&*<{BqQKAMUN^t~eC{%)idK_3& +zF@}^&YfmtfEreZ=%}9$EZ6AZg7Gx!*P)BsZX9J@*x+Njuj0`gr&$h!jUXIULMq|B621ev2Wt!>gmAX&a)M_Lg(47LvTtPg{2})q-@z4 +zF@lC0aQq;%b*GRcR9c{1kEy!vOX{2n8050Z3=%TiOcCYaxNj_=C8>ywRtQD-WuRkF +zmu4TDE(`NTj_Qb`%r0J?0^-f1X_SEk#tdY^Z`0*uEQESYfeGacNI6tcIFoKN!GohE +zISxg^H41c!gHpJmc?Bb_*+LDSM?*=fh;9WIFlAk_M6aUFlKv +zS1?t(I2mqIp1S50MR7UX4-yYTMUZjlLU`wMMX_QC<1G!aO`(9qt)6(yb|o}^(waAw +zO9e@B1v^K^d3Tu>PQ;^RZJCLX0Rt9Duaiu85OC@ADU>VBSq%GSv(=MC#>1NJ;3A5Y +zA~=SpugmBnca}sr=*gXu1xIg%g%CKT=DffvcWB<@nVZmm^0Z{!tYFQUlmTgp3fL=x +z^g);_C_ULz16YY^q^XqZsl-F6hL&RuJ()Oaf``d7kT0UbGp*Fa06CQCsPN35EpiUw +z&Qf)+=md;T{&;ms$VV}SafGs~u>=6{}5QhKQV +z=V$Ws?~woP-!;|S;B&nde8NO;98V7_%^SzQrDd~itPFpor+-Ud)xqX|OCRB1IPn|b +z0Ofk)fBfG}_!d%Qxn?OHQ^k+Rf5k81_HoMYB3Uz%Yo?&>vP9z`D)C@}jcNLsc +zZPjv3QCM&hvm0t`1l+>!#BtJXpz?vz9Np+o#kOesn1UHI3y6em5OFifnJrI_uim$y +zG0;xX8FAk=JblhOUh0D_rZiASnjBcLoo#__Jdj~XX~8-*0J;)5EW5^PLw0mW_;3- +zV>%FX_y+*&U`7jCff%E2K_d~31dLF!`23J*v_}CL+Q<~HhXG8iD8u9lJdCCID?|aO +zPh`_GcKE=;r(P74z!8ZR;VFL7hvO7yZ8-Q>C<6bLabP+7GKbPX4na^s#EjZER +zXR!%FlPZ=BlzuXhIrw8an9(syBIA7E9}sv4K4kXaFh^-1zbYAu!3?S(^APAsyD%RK +z!x5kjZ#5%&yjQc6BWqp>q<*(^XMlNeRX+R`6C+Ym3QCiK&ZNpniaP;N8rI%T$qO*M +z53Mqczbiv!!j6)Ehog`@JmAEB(HY)^fUi|$CB;jPSaDfN$;>qwK+FMNa9PWM08>D$ +zzszMuH>qqAy+}*zN`@J=1ye?dc#{q+%W0+es0xKdn_x#W0`VbTKz)QMCA~)@I3@5{ +zgDxY{5e@lyPMGGU;j3DRADWHKKop3;tpkhyifhg%CHF4et +z-7Aa;=EIp*QpSVcRaZ;+yj1f-hE17M4vXBj`_hN4VQ2yTqy!D+aa!OTr~xPXRc5=c$~hUj_-IZm?wQP2mtg7mF~;yBI^X-l#0tzM_6b^qTp-}!H_+M +zHBh$!ap&Ohhd3t27<-hrz;T{@52aJb!9=P0;@syBw2G|+JyqJlONsiHO +z^sp9=-oi!0)(b^rfh?m1qdhTn8YvCT%nZb#XfP=gDiR;aC0F`{TSG+FE1rg#B2p9a +zBnkoqGT)Mr$OBa7%0CI0)B+Ptt8NTf6fZrrZR>_!D9KjJt +zmBov=)=wNT2qt)n4RBG45e)rtTI(^n^ +zMzw{y6=c*l(xH=SeSyIktavD@&5MT2NJli2$Ok|Rv$N$Hmf0TR*6jWkgAFpSC!jSX +z+#GJGOOb`b8(pjbiL?P6t%x&+Cd!2d+_E#q!gR}YYP?bAy_N9HhS_(PaUa}w8(jj? +z%sx1cILAARrifh55GR_gNpfC8`LfA~=nTMW;*5WYL~&uYdc+JzwdN$M5!5}Xsjb<5 +z+{iOTdE)s@YirY6<7Q9~ne8UjQDQt=pf&C})dm*$R;#72NoEK8dxnvKXjyUqV0;jB +zWMtc$15~BMgaNCMd8W5{>F%3%n!HbT>@&HpsLx4fyurl9L(c)=H<9mzI{7&0_b)pJ!c9Oq*#D=MPCI1(|15s~9qj*_w0a!!1NhAR01E!?od60Bm4ExJyaAj8 +zeNx|mL*4*~ya5h*12`t&cvTWYM%hBloAtf(42Q?1eE5Voh*Yy)L*YZPJ+ +zn5=7bnHW3ZhAgc{94p|&lJQs+eFGAj-fBg|N%Vlnt#_&B;VcHW;L(o(-{MZ(D$Rtnnq+booPbq~c?C@j +zCL_RH1i3d!{f0m#HVrBj$X|zNL{cr;M$J~CFUvS-dn8G=E8erXJti>4yu}Mp_*5-L +zp!qT*Zd>7{g`(&)K4|xZOzICeW_&O)q%PJQ2XargqcDnbPz=Ki)23PtNb6t=>KGgm +zGvlVrna_7Z@s&EJ*1(=^RG$F#pkhZ5I|#wp901_{`K9BLG1*X*kpS(r1u1;FQ7aPe +z6{)$qD1Mw~GbzhQ$T5$ff;O&Nl`sZGM!K;Z)~<`e52r&>`ThIw8|u*J7}aiV${8 +z2h1+4Jq`yM@)KY|CN;)tw^I!VgefC#MI-KLD=^g}Z%M3|z!VY@sLnI8phn1fd2Tc) +zYhHi}&r;sQSj#?|g^QLrh&)*x~pF{SirA&A#oqw6v}B8tU=Fd+MK +z#rx{eF&@}0tCIqPle@z5hsjnmM)sxyrQb9PHR}IEpA%0 +zyrH(PR`XOXWq*78+KPte`bEo{HP)i3sGr)>kc9fKyd1W2+mBsUsa>Ks;0SNQ6rp5&7#KU +zCibVF?Xsy^c3si1w9c1ETVr^SDj&MY~k|NSg}{w?&sLZNa<{d-9L +z`_GL5JEZ+Rr2QSd_LqaZKu`Zj%-|uV?;)k{ze)(0gg+Qtg~2pOIZ_Ew9=c4#$&9oG +zV#(mtxET$!#*5F7M_Y|}B3c|X!(~j;(qjoDUOFQX3$=Mpg>1QybpyPx$!G$~WQrFk +z_fOtzgIr&XnAoK)Ei8x5whfRGCj%#AMn2c10Ot +z3EWC7ftEd%Ksc;J)!Y8y*%?e_Yh9$;T6F<7Em&l)ER`XOsAKpa`EP+bkKEX!aYjjO +zZ4xD(nYf^#TBM_yis!~R7&cqudK_s_N{3}t&JI~yuBcOn7VF1w0HGDM6m6-UYgU~? +zEWK9&NVTRcl`5h*jm1#9k=N>EL$oZeYOa?l0wV$_MD8m77y^!xo}yK$&n=QurJvKm +ztf?k-Q8j~GRWQr4Krs!vedS7pbqJE$D9Ohudut3bXxa-l+eFr8x1ICcFEUNr>PPWH +zxQ{t(RJBvMRSALz7RsDgJcyL1ALRK)TR1^!!Ke$RS`(YxEmMVO3(>#yo;fYAWJ_lx8$pf$#-5%GePKvl>SW;?Snp@aLKqP|rGyyi0 +z^-bMvD(uL(60}a@(E&XCJahUZj_N=&HaLAO2Ir=2P; +zra`?mUJ07&9^n4@o2QU}xH(D4bQzjNp>bkB)}R`A3m{n#pIRoP4a?lwxElnAh#~XW +z(XD`c0A@dDpc&y{DpK~j!Oa{dmgX*cb{J95%Vh%rrB6BOq!(vK4u&&RV4)$B74g6+ +z^8=vNirpPiNEgYz*0JQfNg4MN+%D(l<#r`@@;eFX#QH@G>m)>l1{6Zv_NgWY~ +z02W`46>hUqZu4O7(hi(gGh|4?(4peQNO;FwgPsYyiWyMQbc|fw1tnrtNP!AV_EZP6 +zBTDX|?1m&>=X}(t{~2Xh8@@o^bK4z+IzU|GpqI&&4FZDjFUJDIiAZUg4IP;l1V3%4Eu=n`e*}uMJqO3>LftX`qs)n+g#XZ-(9=FY9x$77pAZDCKL27F +z$*jzGdfL;}WW=+xH>xaCR-36esWzQmDa(kXYx*_ub4o)S1I{Qq5sWgaOnytc?QpE$ +zA+YAM+9p#YFp+7F9~DO<(&9#9U-k`wAu7ulX`MtGa3JbcAPFWY=6YYuTJ6S*R1im89|ZrqIV=4 +zP=4U`xq10=Ga9fGjPSE|@2-j+kL88?I;&u=c#;kXLsbt!vh} +zWi@A!2SV19#-sN79Cto9%Cm<#ZhAmbh2qqOvP<5Sd*GV_prdz*8rc{sQrx1pL8NU) +z37l_*0F=PMY1*(>OW%PaV2uy+NV +zQi~B`mQS0Zwxq^OKINn&{-3t0;+OWONtrZNwriuNshW#;SvYATE6s-gzUR5Q5 +zxWp33#HpWfYAD=k79M{FLzG*wxCEeV7%F%HMd8#ik6@ytn%g3Eq-A!QVLk50NFGu| +zyA^%E!ddws9Llz-X(R*1K?3u +zcFNNx+FD$i@~;2W)dvL(b{PqQ=2VFyN(=>j%!YD&%ovmZSb3s3O$RD~(Y8EsQ;1V9 +zslZ=$(@)$`6{U&}JcbrlQMH~;KqDz|*=k0F{l>U?6LEs-i4nJ_98t)5L_$rQqNYB$-LpXkvwIsI4153p-34r1 +z(nng+%m9HXsRx-49 +zp)Uv~qU&`Fle{cB2Bgt(yxh_+O(?+xKPBKXFp$%--Jn9z{*N2DDg2Mvf@5d4fuB~R +zHWX{>(tAbPOHB`TLA9p@m{!+;ENZS}D{eO&`M*Lp=4)y+zktc{S*4ZcDQ&DJ(FRb&xW-Hw@(diop=@2pG{q>kdb5im=7ekFhh3;NdRH61u%*7qIob>0(?}k78-1!fnk`Y#Z7hW +zzo`Qj6V_$J+G)D>AdUFs7t1ysDw?IpS6jb*2GQa25=<$eE2z +zaqc3YBgIyyE>Er%oOO}B(Cm1=6#=+~5VNvO^f<=g>h|FKGTUJ1H +zBq!#_Y2#c`qaNN;hAm_`!B+BHPVLq2v16r0+9&Km?9;9_5A`0&1=x+-!E_N_F^FKm +zP4UtV{d-g?s0Z)(6r<}@Mr@(_UAWtYL-p#+` +z8Hdq*UeuC42V{L`sTNUm6TU|9fqclt9;*3_0Atr8PFX&+!P=!bg-0klJm=vz=lM0a +zZDPf_mE+4Y^OVd}D;-m(1zws?fsR8=PV$pIx8rg$&VCM?9+vOd@Ry|SIWOa493uq) +z4c3c#;IssvSi*U9!=@Dr>%CachqBQNj1RHzQIYdT);obnJaq?J=AbxoZV(k9iHPg+<$Y3UjdwTFTq39q9}x7Rbta{7r;hyl#v +zwS3wn%Oh%u!{~l0lOs2dYWWP`VvSRiea%ijwu1AzTtpxA0b1Q6OR? +z@r4sBANw6SF3)d5>I*UsO|886FU%4;L;#{vu8~v +zKyaTYz`)7X$yhvK>tsBhWa;=P@(FOGQrJ& +zusDO9m=O{80L&GwUf5fJcEEE}UrvNu$flh(It|x{os)$?Px8ufkPBDvC#{l7J96`9pc+2mg~j|BoHE|4HZQKmSkJw6bZl((At;%K!73 +z{QO(w|KV99{?pU{;Ku%CG63OfDDh6lg&k}jpp1hYN(J_1u4|L~h3l~TvFQ>)q5VeOHS9a125B*M@F7}?e=WK7%u +z`F!FLDwqm-FJdT*l^js+G^I?2U}qRg59u+mn}CuMhoZ#jxIL>FRLs3rF`E6>8CEgl +zDW}bz5r}of*cPkiSDlU?mx?rK1&E`doX<;1Zia?TB#eeT&4dqY)!7Af-HYoNgQ(fu +z5$%GSx$J}@5b%wCC^CYHk)UApR9U@|UKCsF}hK^$4jU( +zaeS&3oeG~Oj9^D3$_RF^tvMBwP_`kFH34-UXylu>tN|oqVAA|VG4W$`NzlRE1jUGX +zf)GeVM5SP-T4u;l7D#!c+j;sBt`ucLCc9=+CzB577D1~(np#mW*WGGB4|20Iph_D# +z{c+U?hLb~D2*yI%F39%o=psTFs9FP9w35YAOq~ +zmQjhEV3!=>PTr*Z)5F1J81*gTn1mde%?dQ*T)!@pltih11FZ*?|KGArM4~!nvQF=XM +zK#yOJP3_D!-jvR=h0eT%V*m|G4MVjBJ~PZWX>xmFj;gmN>j6Nra5B&-Em#8l-gFz@ +z5L5*iTc9IG(BkS|b;Z&$K_CQBLSMiel7ND+)N0`JXi!jJV!e`Z*m91WaeJyV97=;& +z9UPcAD#vtHpwxuot~im-Z`#dA2n=-FAR*#`6~JF8*TSC*=@J-9fsc#j=hTd*xBs5R +zI8oXL=xAHMB;SJ9$6C;Z6u1lIIftSx;+9*2t=_YJ+Bs|lp}z!&-a0BQQQg}R@_Nqp +z_ySl_U8~T}W+R=KZ7?qlv`&v}0GO;PYgo|3x@8@^M~n@Pd;4qItG4WEaXbNk%9ebz +zN<2H|u<&nr;tmiMmM8U2Wbz#)d0LE&-#nKXm>U&D>W22@eB?A=X1pAkbc_jptz^K$=nE!>;+c8u!xW2*vom1}?2c-9 +z2bKs0>Pe5$k$n(zBH3>K91MQ +z*f2Q~chMVQTymL;8F5@+7TV_L7zuHk+114)OdXEbzGBDB?zGcmpeX(FO)PUED7{TI +ziNO+M6j@?EJZHBqVsY7}%54WUOzC6WX8h?Fr%WA7l0nJMzZ0eq#(sebgYk!8HL@>i +zK%@ogEF1fnkr?n~QiKx+Tg&WyQCfSknrD8ZN_`_^#cZ+IB~i82ge20JS}4(vBa++CXSj-dOQae3SMCVbY>KuxQ +zZ!zg9^9_=U2%k?q2ssH{ka$IilX&qxAoU@$jVH;J?+=qRTbQyzd1AKdz8n{VER7iy +z8hfa2#p_Yo)_HJ&HQQJtu)=ro00o;ZVJOHsia*PYv;&eTcqp?te^AzN-INf!qKGKq +zj#q%(!aeL5CW@fU!F@CYO6Ke5VBqCBG5|^Y{3>!#n64$dv|bbUJHt8f;zOTz+eJUfVxy+VGP8F^Cq9N?g;6kN^8NHUhn +z`uaI80VM@cKnQn2q=xPIal)2hEso(cy)_YFscM^2^bE=^2~T&o#!muUO5_008bY3j +zAB~M~5||VgDGV%@gQ&#VZcRZk9QAPg733L4Qs^C~ex!ieP{@)k@yRN1A^=oujWk$( +z#3YvEn+*J@3}tlSqO>#R+7UuXP)QHrFXU7|NpuWHYCD7S01Eif0o_a{OQUnhhq4!J +zD9lBFu&y3Mh@EVZ@0bK<-WDq034VpELTt&N>zG7ZS@o7U2V^rl_G%TB*^nTu1%jDq +zM|_73W%8H>$$*^7kr3)7L~6z`&rdC-1R~y)1s-9};L0a<>TEy-naDtDanq8K5En&q +zAB9?Q|FQ&>&x^28({5X?U%6=kswrw-TEHBxy>Rq|ql{W6XxRNu;C0aG6cHx%n9Mf& +z0QuNZ@luDXq7eunjv^$pcVfgbiUh!3(%@5yqhU@0+Ona18*X%GuuHemYRN*I(x2E& +zP~?OTX)**!1G3Qu`FK7($}o7sAYP%82s?&O{5;`+xWqVxtFno);vpMRsM5<%X~jaD +zn&$9^L?2^30kX720YSvM5+o3g6~l_){qUnq9i=}a1-f~#QFMr~7CqbzQ2`F(H4tvM +zY~6&yVscP2<2GBs_UzZV@XzHYpokxn3CuM5&xQKm^qXY;wAbL6H +zO)12?3_YT}XNNdq!wC~LxorsKP%(=l{#sNH)-rej*$|uAZ0m(NI}KS7!HpFWgd|}P +zplDeBRlGMp&&rdw-yeEz&iY)-PJZ6*asTl@+5JBiU$IX(NB{nxr6u6=nOgsG`XT?% +z&*W!b!`#`k^gdUg>#y)9+u%Bv>-^!vFNj1U$z<}}bI;Ao>pSeQ4Wmb2Ja+6Q#~pXM +z$Mcm*leSKoa`p7-*Ugx5!<;!cS6AO!S9ja|`P-K+y<^$3Z?0Z_kFI|!6uLhg{`OgC +zeK(Q#-Z|$yx?#hHE3UZWs;jQL>86|d`hIZ9B|qH0efvH4-1Fdr4?gEwyzH{a +zue|cftFQj?%{M>0ZQD<`Z{KszJulpU|4R=&^va`;zV`Uzk3aqN(>r$j`uXRdfA!T@ +zckSBy%rkH9-u>I>pa0!!ul;G?zI}W5zVr6mZ|~dp-rH~g<m=w#POVeqsL2_4j}6N0*OmxY|2m|J?P*)t*1@zN+n;){m~< +zxaDOnKe%hWHuBWrvC6(@Z=7kpF*c_44Y{tMA~v?;u^l5l)u)c#zdP<3c}$=wvAc3v +z&8D$|*#2>?@8&*x)5*zSz52~*F1Kg3@79u7aBj}%g+rdGyM9BJ>(;f8{r=fUt_z?3 +z!`YofJNojvsz!AG=uamc*H=@wb^7p+A09R4woATM-g)I;?!NB*H*Ot~sC@LE@3n8b +zxMFzo&@;Zasp{V2MqlvpBM*NNzBMPb_MXc3`~Jsu%(xG<(k1mdSGrF=_swViHuKCM +z%$YT;N1yGv=vO~`x_oH)?!5Ol7G8Vcz+X<-v2(}R>vx|0)A84@Yx&C`KAQ5x;p-pS +zQMmQUw)*1l+|j$8J?e?dy4tuO4m65 +z#EqRF6imM=dfdnJYWs#qE?%|1_W0{hi0mA-XK%Fhu;#~x9RBCAJ2oFU{QkSiHk^>9CTuIfvyo+&G0z;`-x~>YlZ` +zDl2;W%)5vEeajB(*k9bR?b5*3#g)TLdrKaxynXz{{1HdIef@2>zOi}I%WF@X-MOW3 +z#O%L%&a9}=wieu7H}|n&wWF@vQaEbu@;lCX{ex?Ydb=lVbLEzQ@WkY6tB$|AX4n}2 +zw!YlM7i`JB;r!}}cNPv^{m7OPxqm7cxAwr?S+~?Zdd*RlBM$ra-S7RE`$vWEpVR&E +zO)I-9%-E7bcjfV}2fzBnF`j4iU)|tZc6{yruU$6%r2oFnb!_71Er-2c@ywYnzrVS9 +z_=NH;ueVp{UcY@$ZvGAigB@GGc7bo-f!9{JM#QwdLSI47#=}nV_TADoqjX!es$#5b +zdd;xn>G^qY+<3{?ewcs8%V%CV;wLY^l9LxYcSY`Dp}jQ^{{7fB&*fGu$}g&^&z(GR +z#TQ)n{pL@PzW=M|^7Cfg-0_<4u;;bN9iw(Ww&v0gu6F(8)CV>l_p@8)ZvImBOZWSJ +z{lT*6JLi4>=D$wN`R{&hG*#l#Z +zX|sM@a8Yi~^M`lrxOUTrYlnAxN`qu|uhAJu+w +z_*v`MTsU_9ljrU6OxLQ0pFiZJksH~0Y|A;U;EfIE-~YgppXZ%kx@YdF*I%#8xqH=9 +zBgg*umXXb)CY<2<`Co4xcj8UHXFaFZS6+Yi0|#yy7TFxR>FUtAqeBfhzx(9$n)u4v +z`TM_k(f-bk9OL=NuD|N0dn*$;t)0sXe=zCZ*Pngx%&}d4IbU75<;bVrZz-s6um0MQ +ztz(${xO%6nwzGBoy?=Wy`SBT7pJYDZ8tUJ>>XPbf8!s61-y0u#bHX1I+p3Or?Y?pP +z-c#P#^Sejio4#!OEB9X-4c_b;w_~bx{t>e#SO4s{9~|Y{>nmPedu06)ACK-kXXc3E +zr|iAG@|l$n^-bNk?5b763%+wn;kem{otoP-WyRy}pS$jRs_r=VYgarKTt9YuUvA@e +z-yilTrd|1yh9Nc9UHb6O?;Lr|TX$D1@vj=CawshuGf2cZr|B4@1KYr4TZ|y5e|Pz#n#-v5zL@9Pl2bkOHlOc9->Q=yDm+u)KCF1^Q%78Q(=p}W +zX{!0~&86@B>c#I*{$O)&!Fy{K4()qpR^oz14JKN8#yzeQf!R)ArYtKJw9lXJeZmy!p2aep~*_kA8ah +zvDX~_z@@((_CR>(M-$c$8&ci6Vc+i`H?MuVpl!>mRg+c@tG;*b^oq)<$y;2PYu8s@ +zTkzg(T{raQ&w6=!)#>*IUkTll^L~wXX?tbO`kQy;YJY?7JAMX3*(r;UvZ_SOZ{=zFeW=wnQnu4`|+L>AL*pZLV)G-}{5>Uh{9SJnnZV +zjPLx4`OVu8d+74}#{cx0X9K&+uADgJbZ!0Ys;0%?{dj)Q^^ae%{Yx#@Eekd;DJlKV +zQ{@fs@ +z#vQfnzvf=KYu~6H`OCL#c;B;f=oX@@m$>7vtvP!q=M5V_%$Rkpk^AaVqo%t$N94qlZ=C<$yZTR;jVj$+?jAj7 +zbWX1OqQWw*@$J06`NLXosTuX!q-i-@)_hP}9WN@}8S2)SMe4`6ewH^%AKO(?dclZ2 +z9Ut7ke9rL7NAgbl)0p~w_q$H~Fp)QE(HRdPebyy~FOBuIP9MK^$g(LPE_r*2H9VG6 +zvNvzxg#44YDq@cy6MjGC;#QR)jv9+TAMQB{ssGA+O%QFlFMH|?e<`~|KhVo +z+~+?JAxOCB-tBk5I_uTJVI4b|x`&>U*?>a(TU%Pk3wGWs6byMM!Lr0w$+c<2( +z^4`(2_RU^ujQa9(Pie-4^)q7ggO{A~?4B{6wiAmMZ*b3EoV#*!Q}^bMy78A?QPc*Bm`$=-6AYo>tMbb=aHJH~nZvjko-vcfF&wz#+d!Czd@z)!N +z#*DG|=Y6++{7*a1UgZ7q1-Ebh)&Xn%v+s@d@6H*y_{5Gq)A#N>Z}?etW2*Az)oyxc +z$4sT3?!&e#)Y^ +zrvCCeSL<`D&a2KJVa_@2{%e=ijsMM3--ag(-)-{bO~^ZDN6xa+8wEhjN=^aG`L73Bu@=T6y@bJ~Tyx7;~?dR5NpqmDc}=IyD<@fRNX$Om%{ +zpD^~#>a7J!HlO>{rPE(JWx@5=egAsz`X5i(_heyZ$&GJ*@4|1*E+6&6825of^RC>h +z^K+*C{5O45hhDPoyO&i|edUO+2Sz@$>DWuUPkeD>I2q~wk?)!ZR*bwq_uhvudT`Ih +zW2Sudx#g$*`mNC`Hhnd3XWq2ed%pbSMK?V^=C*Gd)%V>tbba20pRBJ*t{Oji+!1T_ +z!*g=q$!}lnnYUubxxZ*HzHq(k__b#oku!Dt8NRL7?Ni>*9b0n6z8gHJ-dNhZ(K_#m +zKu7-Eo3G9DFJ5!RwneVQn1a2oG23!Z+Ll-R;pnSofBmQ>-zeA<{&==AVX^Cl6;(gJ +zzOuS9H2TkZMHhb~zclag+S4YLoOJe=3P=1oXUbh`rx)g4ebk*}w$^?>|IWC+wlkF5 +z^5UqRJMIkZ$(vc3_voynD@yLTcG&;><~DbGPL6BNr!EN}`uU80GU)%Tc(C|WoddLd +zvu4c5qW{C66#XCjt;D6x_*7Ss<>&vn{x8e@gMqBuX#I5H;Nb6nCdU6Cy8nOv&j9xi +z|E@4v!3zJ6&(XjBzhv61=_&ai${4)NJf#2sEPkebnm=x(u0st$j+;KMN+vp@@p5nr +zfPlGqNh2QD-Bik=7juDW-k=XmjWa}I9UkQC{&ZJpXSbwuh=Ew#hPLU8W +z!}`?RyHRO<2VabZ{BUr^8eg(s>+)-<)A`&5Y`(5QOG_8e9~gnK9d1bkTXrbG29$Xx +zQ%B?-*)R}ORsh}#o&I&;KM~W-xTSf!d|D{VhBVs>z;|EscKWo63e7_v!yb%BDJUr5 +zIU=oOD{J8|^_Tjz^I5AF*?>B)qt0Tl;Ns7hTtK-gW0*jbuP+er6ng@JPWXDDEyZ9v +z>wM6Z9Z2diiGvx`I5@2sY_J`s$R2o*^k4W7#s)H|ttKZpnc9}Zc62RabU_(t044-M +z@wetx%cWtKzoItqC@S)imlbz}(yZP{Lhpg@Jdt&ZZ@2wK>;U0%`wlcOd!YWfVfh1r +zfX@Ttumgl@6`0>osTfUhENZYVEyPR!JS#pZd<+x(rFF%{2R}%0?SWVeXM4)zhTdeB +z5oRxhdtIv??buZGeNE`WPCiJqtII_H`BE4iBF#;YZY0{^H*ClT3R^~cU)p#-Jx?m-@6^p- +zOB*~EaIk^kQZpKW1b%$cKA&h5i$~j8v$l?M2rlz_rsy8_9s4sFj#`G7{jMP9fMq12 +z$pmae^Lp5gmxD8A3&f>EFFuyqAraRj76B}L>t|;Gu*%*otwVP5h@hQ}fVY|*Ss*}* +zW&e6sN7%d`JYxKe9}3^MS|5eSE{NGHm6@S;o94tYZE&&dIJ^Q^!0Do!swIvZn$V?d +z^q338(%BbqGf)WyUOKo~YFPLr?Zs!M{{!-W(N3sL^Uvh}rkBhpN#*}aryt_~K9iqM +zm%DQCe+W4?Z_+Ot$e5lOdSJHp3jaP1dY=oENNE41D&1 +z7CoNO|qs`u>X75C!RG^e4Zj= +zzX+9OV6uR2Oq3)8)?s3xAJ4fd-A^%|*8;b9v1lC8-i6H}(f(L}bpNkNnYE0#BJ~Vc +z*`urph+Lnm_yCZ5d7Z)*anvamim6%bB{_!eguds9i1>AWnMV{-L7#^h-Cll$)|rNb +zB}~BGAhpprVZhpb2?r$b{bvFn9MuUTEsS+f0VRq~P}Yyz$GMa~avCHk_7?%})USNP +zx0`807H!C)4f#bx0PleiZ#f{|N`-j!qgCRf?8A192g%~;xARig5i+n$kGd4O1}(ii +zpIm+eX(ljvb_HXnw6tA$dU|?1%7|%az>djMFUwM|7H8wXrr$Cgf6C3mfD)SEjNtLm +zO5%z{qzuPpBfC52MdYL5^&`BiR!y=hJd-TXoaGcJSK%r3tXU&A8mHU$Q6dNV0Qup? +zZAgIK$!xm7v;2Sdo&&JW;%eE>vXVd+G@${$C~+($8kScQCr)r2CvldI?M&MUS^8`% +z)`~vKBM{1N36#B|p=`p2LfEtHSs;uOpp3F<%P5##wWp1uczM4TC#7Pl3VgAhe0mn4QFc=Le(VcR$)a +z;YJ5tB@qp%)WEK;8mCYNqZ+VS=rJNS+Un(`iyYI~C%qUNK}3XC`p?a$419LaCnNu# +zi0y9qZ*f7XLH_G4EF9qf_r#}v8E3>tp;gn+j{U}z2~jDOR0PW|Rr@wDxdCIm|2P3L +zJ3fgmk--1+$TlRaw@UzOcMLTed)tRCluAOZBrdb1b;NvlV1P^U^? +z6B<~;V?e9ziN?ZaE)JnbAQ-N70{7?iYRluYN0gJk5oiAjks7BI?87!Fp7Su7r2S-2 +z?X2ku-f&uPDw+(13HEY|9imNAO*d?-!vbk2a8reG4Ei1g{wJVcu7vaf+ +zM!zb9hl*T$ouk2=98wwIa5$Yram8@$5)U4Qz;ctAwg3RZ3)KoPG^i|`@UiU;x&|T2VPCw8rNThq>68^@-n(QZ0)iA!$`9 +z4}(E-L-z@uHv|c@1=YI@!`b}JxLC& +zeW~FA2gxo(fDU?9q0)DZ9E+t}5k$MKZ+OU{xxvC#4*F7wup7EYX@=Qo;HDD71!NU> +z2FEhQ!wp~c4Y8_=hEBo2b>P3}lY#$dlx27F|AmEm{hvaJ05ZV;?}<`FxFtT^AOWWMvli`*>e5<4hAH{%#*Uh?h%6r3D2bVg`R??XeVN(S1R=)kme; +zwl%97s(kfT_4PKIyS#dZufBQ#$Rg>7WmK%88MEle!0<)oE}s%26rY7v1*WaQn%mV5 +z&!O;h4yyrpR`h!=LyUg&9yOwzW+E>mC?cQ;kwAkGi%51_LX|Gza{>XH$VS<4*dyHt +zUKpK7w+=cD14c&*^LDt6Z1^1bg%%oO({`6VUh3rSSP(0W5NZvdK+@lGNuL6eVqlfa +zv8Z3eH|jvGgi+LpGr>=i-62iqivlWTt<#H{5fZ0#7%g8eBHM%;%SIV8ph>#XOUDED +z+wegffNu%~8H-{ZzGx`SrP&OPK{!7kSNsq7WH|p}^~51jvd +z;*<7hqh|_U0KNzgcq{pQIED^B=A=y`1Uw&5NH>KN1XcK1m0a_}Aw~6ajnnN8fu&!U)}jExb#mMeuD|9F1_?&^(Ta$x>gXs60fEt3i-QbAsgpXjPK>Jz%G=RB +zvy~r_sJ8OMAhR5j5p;PgC-otGw!1*d3Wu*J4@)8XvIHS2+|XFAoG5i-nlH_j)cYX8 +z5rVHRXjC-s!=iFcd@>PNP>RE3n9&6_%!is!bhwpFfp|I+7;Q`8Y9DIrrKJ#_Q;M}F +zvGX?2G=QL^Sl5*_cjsCf*DVSTMAm6;EBQy)4c^5rJu74a!1_nK5SJ677&r|KhkNvG +zN`^qZ=ipo$n^=%IVn>L4@aC3la>?owUV~9Of8k@2NMW5|ktF)+h6dQxCG&Grr-9Gz +z{-ino)fmy>C~g-SfQN5)YM76bMlzRr6Crr-PQe>bMca#@LZ{EZPeHx^ywsNw{#TG2#z9CF~Oq)B%Y* +zb>=9a*5aV((6WRuJd#VyWO<<$npY|0kQ0pefqDi6NvIsfei}Uv3Wa^)8MguUiC0K` +z;&}@_-dR#%A^5~ADbf4HvkF6tYvU4!XlscVnpiG1Hm<2yRj~qH{VQu$ENpJ3Ahcfy +z3P6^vte9U>Usd8&^GV-We)W8wk1GweB>agUN$y66qC)lJRVS3hFQh#Pj*pd?Bqsw7 +z6)h^maQdp&Gyq1{!qrvtH7!QJNrm)-M=;hZy6ZF(xTs?P0C7N$zwS6%I<;tI?9dq} +z9vINmqI%+fYJ0xf;4ELTrPYXaAp{ivPrB2_f +zs=E5>niWpTM%SXv!Nv_95B+Vjn+}UGAAJ2e>1uTd-~kOh=^$T_h`j-pR3eYcb{mcY +zr4kn6v>kgQ#a2wbO}OI7>7aa7)hX@k}f$tN-Arz}DLW$&^SyoU~ +zR#GTM{0ia{q)nHn$}fOQOTTAE!qX|1Fv;0a=DicpEygqn&meJKd{S +zR5#eLs9ZhqA+5RD0f!97#SRmmVCP3bDCSm@K~z;41TB^A$rw4Bunv-N9D=YIA71(w +z7@Ku>ti@$9Ka0^|;6bT&5MHcW2AGdQ{X#Sh^^2<(kdUr4xuJS_Rn5uCR}M1}_B2M}(SAYu`y(Ejk_oz=gS!WHXa;O)lFIrXh{ +z46q9Q^+_xL?~cRr=@$neKf(V;VL{1&|BpTK$u$4$%dT*Mnf!kg6dL%y67P%w{%=ow +z`kR(xE{Z8UEB;o*(&6<(0zu$!G&UC#$5cfF{1OA_j3@WERkehMrUPs7dJM +za4Z%l5)8O%D(rx5fq=t)7O5si1lhv1@H(&*39HSK7~D7{ +z1-I}=ry?nf*dw|<^z3F`tVK>BxN13(QvBgiLt(ayj__4scLwe{gjB|DB<|GrIcqBB4G?|u-wHoXVSom+O97>?Ln2mGnG+rGV3aT8> +zs&P1Y0CI{)ug(n0{ieG2qyjo#I-3VWEo2<%Jws?1@pPku7Mdiyg!b=J(XP)uzC8Kr +z#0CR=IMj7ZLG2Dcg?4dW!N52PA$3Rt4}bqdpEUd*4g%C)ULbd#|1T*){|xZ|d*IXS +z{PPHWyH-c<{J*!T$XlY<|0)`=|J*Yl#y9e*#!O?8D!ued-dSbn|AnQ72TsZZwS}D2 +z1rzbb#C|dTFygX{$o`yCOks*BVw#mb`h_5vCz#@}V;ud8F*wTimG=!!)!Vk=-r2aq +zHVJF(16?#xWt)b<^Q96Y{F25j*nn%-Sm96=Edd@}IB^p*7Hm<_6rwJwA|3t~B^FL4 +zW$-Oy=c&vMAWI>F@lJmt1OsKOudJ)CZSbwASYCzQQrSHCA65^f%u6Wc3B~46{e$SN +z;&jm+HF`{#pVPUY5IopW=XIooy>)Kax}kS%qVE8SHLkVb(>gS$B6`x;n}KaP_;^FB +zc1bFXmhh|@Qb7qk)E5+B2NGBd!6hvK?L_)A9``Fr1IlG6(X~7l47G+3s|tvje+mg4 +zRQSO`g_PGK=^a!+<3Ndx#LA3N1P1h#{y@9zswCoF((Y)?6@XMH4gl{;$TVP}Y{M8K +zII;(kYXhpkq^Eg$oLZ{q>?6rbOY`*TwN%g98_jd*Xr3MwrFsGmRHRp$$L5kS +zD{k-3YrYhCG@7v`|N;=lwxJqqshfE3}l1e&5c +zI?B}#JdiGjK9SU5wm(58)PJW3-sl9GUgN6`drXQ%Vo~3EMKo(@Y(!{19u`@dMCAs# +za+ql9kz7zY2xz3hu!ZDAG$JS4V?ogShtmsjQ-oRf1?84hn-5^1b-=>SCLLGp?o>E? +zQtnPVq{HYUvFlNg^909cx7+IK7nDgh(8z~EC})!qD=2mOVl5zqwo|-fb!e^XK*(#f +z+ihcp@3<=!voS+}7!Hggx1tb4p~h9>(SYov__bDT*-yduNB^v0%0olICDgcUX?LCEHzIlr(+1 +z1ABVQB@Qy-?{s_$6Y5kBD~Ft%cAOGwCN0&2C!#?N3!?*vlHCDnC=J-60T%#EBa_ue +z^01>0yKPYwc!R@Tf}PGYqu?i`2ZYXY03FBJ)Kn0I9>%yNd$$`y)&nF=U@`3+9oX5% +zxk<!s!LNy;qacOD1l|Ov0l(EU4@;y;1&Z)S_+7+!~kKcG*jJdS3x(CVFjNtcGwss +zRU8(+z+iT%?^LJ`eai&gKR6839%=e-n3)#%5|;}%*+2x~ +zH=RUq6v>kCV${@aPBMNfz1THkp+9tf21+5yU;ibgRMk6wddNwYZ^li(q60Ci)@6j*BV +z$YL6aAhZ2&>b=vW`-UWU!vl=e10EhwQy7L&3~}(RKGV=veAMu`mmvlMR^SToJ;?`< +z8Zcu22Z>lLxgeBqV=G9*%VV2NA8n{MpZPd3my6;!p(*Kg5Cr2Fi98;VX+({MnS?6v +z;9}hL*-RI617MvJ4{qibMpvglM_|pyjPq)03Anie=M~lSTAC4M%L@`U_vTh`a>8Oi +z8HbpyI<*)bwbnGlLa?IE0xUF+871+cQDxNGl|$_Z0yJ&5V%}^Tt3quC2{}OrGNx#q +zWn}1yK8^$5xW>Yo;WC8G%2*lN)?F?5!39PEn^#G8))Qe^v?CGmcaWnTMghFJ;=KT0 +zuu28~!Xwa-->elJfG5CHqr0}QrncT=6S}H}5++9L+lPQTIdvTH1@<$2`o#a$$?=#H +z0^;?Pn7|DBUxi+;-u|NyOhN|uzdi8jUoOhX|6zVF!Pn1!Fw1A~{}~BIWFdKH!hb2T +zR3aev${!LCU_%(J$|3TX-OOkh5YYiKqEbaII1i5RIz*ebUf0yqh6+;5O0kOU0J;*S +zsG5T;7*aY+7%Ln_QDCjouu!bDdJuDNQ&f)NQ3{+sXS@|Z4~dE*yk)jS?CxnE2e7`b +zDWLbKWlGDn{1`F%6&NebBDg4D<>7pl;6Fsd2QokD&HdM*BI+!oF>z{fz)xY+*jJ~@ +zki$Q?5bi4aYt7x{6zAC>Pb1Sso(zAs83R_Bu`;|@h-0xiRL&&rr9;50(FWZ4DgTe0 +zluEGTW-4SqZCYr*gd3PTW`Ydb7Y=pG>=uf6I;)z{XhWo#Gzc{W>)9|32huXASS1jB +z(*ALh*5XY@o>6FP^wpxq#>4&|U}Mc|CCz7!k=gy$k2qw*6&F`&cF(1yp_Eo84H@R` +zBGc6CKwx)%h!!rclUr4(vjI^m4zhDOh&s~IE563YISa}FN{%KIJ#($}ml8mGXD<37 +zcL%~L1!4Eho#PSn7$j&R03f~rs6aT`%6@5)r>P1tHwih|5B0FO6~nNgaf1Mf5mA@6 +z-&P#K8o=v0&AMYd6dG+_Ioz*BjD~|k8!gd>1|-0@vuCc2`{QH)HbF39G8|OJGJS(| +z%dV2ZH(+%u(#!N%$?M$C;H?jBG`TdgVKZsKP7fGXxAml=p>CH7ME9pk<+0x~J)IYK +zdY;?fc!;}sngi&3E(0h3QVm#IqsYp^Fe_3c25Y8p8N15HBu!U=yVdtn1yfLAvL+Z0 +zQ(z{kGO2a}j>_Z6B#$!6T7=^^(P9&XQfl03u3tyRPSiOJ>|m=H#tEkgLYJA|StQyj +zxPQTU>BUVrUywJc0Y_Lpf{TFVq!?m)x_RYT-T +zRHD+-n>2;Df;l$lm4gyE@vx&8AQ_n^RYjYWFsPF--B+o&uvj92C20&V;Z&nF_Oh_5 +z!RamH6y&(TYP3Pc8h3kqo2BDM*l!+}2XQCCP=aNX3i)jUcN5o%w@U%vD{Xko3X1Xi +zFlUrjQLdjVnyQ$*=`k@qhdxmzqf}L0AI1v+*0eA(hwL(to2zQZ8-%sJpftHxXix$F +zgAZ4YWSFld7S7aACoYplLTt8cg&EY|_{geg?RHY%i5M|6OHkX%zOaAIr<73zep(vr +zjRGkUd}Bb(6@+bQ{gr{OLEw-bj6`LgdGle_Amc;3QzOfIK!vtsv`mNSCryDvFUU99 +zO{@uceQ;?%(I{z?qneAg8O4=)Kc;H2U5rkIpt`~|EyI{*;iOlL_c`&LKg2T)-Ra0F +zuc@fD+wDeWduyQj=%W^}p9w{XE~WN;+FHV4vj20WQ0gn$QT{JP|NKvp`>SIA?zlS~i=>nBGd=Jy7Sgkf-lP5!QmJ5fRq-Bh +zu!DVWlc4X+A(cOh-$BCYS_R1vdp_Y0g)vAwx_BsYe?Zo2fgltSbZ|I~s^@K(CDHzX +z(=$(*2I}HA2i6&%Hii6915hNuD`XPdx~yioOG);C|4YVJp +z1fU8wM@2)S-hEQkq@D&!!K|AQE5&cBO^Qkx)Ijp{6smll?<7K3N%A+smu9`9saDSv +zBeO|1wWla0o?<=49U==i0JMLh_{P@_Ug2|E}?i%*?pWgf1#8?)0A3$aXP-57&}&0@v5CcvtA9#ue`h9(Gd +zDu1Gw1)R`y+Z>Fq+YP~z8DeaLI~PkU@S+jdOE=@eg#l{}HPbPp{4c=_ytay&Af#7} +z-mCTyP$5bVj)lw2c4>#4#DyK$$>Y)VE3hKOO%IENE)c_=W`hs69ev?jMcGJg?^PRq +zT9u0l@6`B1IMN%whHT_-EK#cU4>$;cDx)?BhyrX>d(Q#2Hv|^c)lgQvF)-GZkV@hv +z0AlrGm47~7#237RrR$h_p)J`4j^ABMD47z+2$Mq)&Z~nZ`CF4RR(%RU9Jy$le)Q1D +z`JxKmDZx-6sR~cJjn>n>?IH%)EzzY5*zi3*kW>|4Na!I2uVpYc5&9Iv%?EIB@C$~U +zDv=}BOybHV`-CiC*oAVdAB->c!CB}Ekf_4qx1~Uz%m=u09_(Gp97JTl2(O^lf?y?8EvDh +zOj9w;1+AFjQ!^NO5r+WZ#DQd>)e~qBVWZ9<%nvLb)O%=!3B6-$9%b`YuaT2>^Ua4i +zhJ-&EBerIUlfeEpfv`KPuoT|hq=Jz!C+g9M9 +z?PwoTaQ#-aYFu0BNDb5J%N1YpwW95Ab_V#Ia#)U-9t3oU+X2Ab+8jYZCY~OcIsT)( +zoHbk!*BE3l7_lg&>8sA9*k{@u3H!vzG*e*RCo|`PeVr=UznDl7nXcK)RZ*P(!*hpa +zV`_3gPo)gOOo(4tvd<8sK_(A2Ilv)?5OE5ak%X~9+Zl5BBw*1a+hUR(@?fmMk0T!M +zbi0uZcfZb`I(<^6`IC$jsF|zu4?_UrzjUT{|rygTz)qn!hj5u|Xv +z4Iz8FHC}6U_<*y-r;FKzh8-kySPA(z8CR9J#UPZq?e&IZG8P0#ipY@`#7^N+pnlef +z>Ivprp}(>ml!Mw^4r+fHfyO^N%A^jt$6$!yM{FX%P!V9#32%JK#tvWy@IRD^VvR;g +z>V_fhA*&wZUxcElJBXfviyR5eS^WVB8b!Jk4+9fJv_4QzP+{r?+8&P~9dba@{7dKWI +zSp)MA_z204ssWkxUXCau)>!75H@R8$b)?aLGLx9oa)?#RTkWvtbxn8J)E8oS7bu_` +zyMsh6rE4$BqLt +zz~5W&<(?W8rNx7nrx~)jdCD9Q`Ug-FPQfr1`nvG>BR)v(?1&T>6iX{&$%U~L(IVK@ +z?(aq3DkS!vKkuePrn8#rtx}J+)^w1@ +zsb5e={4wAq%YVRPz@wk3vmV3HXzk&2izn#s^Z`6oo~14ZokT<5*TM{PTJSTYLVdR5 +zxLf6#%|An0o(d;Ju6hj6lxT|Dta{g$RF>7i)Z6lbOY$WO>&jiw59fk7|M8j%|o&gWtoDLPo76o>`LGqZroAwuD50gUR* +zhtYg-mpweqA(CbU3Jk$9!WRgmgAAusnnx3M8E|V*9B&d+|;6429hhmrO39bP8>l2*s#f|ToWy$dC&nGn4{e0br;z9dC4Y8nnxB`dL#?VBCsf^ +ze-U!TEhxu&i8fMJRqZ9mFKri7?0^AempxpJEma#OHr(1F6cvWXpx=b|wJ=@$Ro$j4 +zYBMuDf!bsGL|vTnHo934n29E|hd3T)-+ala?jA>00%`?iszgY!Z#r!hpLzo55HbX+ +zMvB^OVjJ13?gG78!-`@hurQl!c8x9)M@TbOe8NW2*nMhrfT(D@9i0py;bEE=W-OI`6 +zQQJ-qIyxe~mJkk0TnHEpategC+%ztQ#e(!e3p2e~t)pi8jo%-^Epu;7V4OI;{LkY8 +ze=3u=(;S+PLHo(<*?$akX2M`G{)NjfwX9AC?hEDgq~gRCGvUDkk)V&ru<{K(*5cIK5dNLCUqZ-0XcT%L2Z3y%f%F;T2f-ob~ +z+2!c{k!>faym;;C_2}sB?xH2&yXB0@c*N|)3A1xY%PyQ0B%HC*hjT)u`e=!hU>06y +zp-o@8V4u}ny=dez)Vb5dTXWUlMH-&rnCs1K&b;U{)nG5ZAsW1}6p-4>z{#eM;jvTd +zOf0iPy;+qJ+Q=~kiRl!z*b?Q>z48w!v)OTEKEZeXtj)z2e*$W-Y}Z5MX%(bLs!mk` +zY?4*&4U=gu$#hf`wJgCBrFZQuhcq1?U#NkdveBALVnAxK&6NtsjNoXA+MMEoS*1jE +zsRe6`;osPxko?xd6B3%%I?hbh3!%YeSl>bIZx?AjT^lAVuMZ0*(h-P-_tcWXYe2uP +z(=xI!^UJZ5eGuSF72$BKOAbkq--@|(8U6HgfmS_nDgL0IWqBFVkRGAq&_JJ_>^Mq!g)r?e&x>qY|8mh{O?isq! +zfa(9o@P>kqOCgG3QlHwZ2YZWYvO5U25L0!{0a9c{mL_QG@hH= +z$IAhM4VnmOgG@k6_&fx|`3x!^KuMg%pOwxXeOv5Z`e?@eI}lcCJf=uIh7dEnSECX$??jqrW4)9>hrdmBE3)hlhaG~WO1J@tt}2PI +z@_ubP8P4iRoY^DPSJYPTjw(cpus|%4z?NV%s1W#h!2UY0(mbrA5_bWNUy0jm(1)XC +z>`{jmB3$bAYJID!>go|I=#*>}5mT;}=!fZigCVcY?PeiX5kj}y)@;LYm?hU2Ag#0; +z$~ZxP-$4s%HL-A*AsnO#tqgS0V96L0@uDLWYc!QLj1qjTT4-jpnecJ6cqr(jTCU|% +zK3i{%wtQ5sx!KKQHQBwWb&ZW+r<8AN&Nl|Yk&`}uJS2GOfXOFZcy1kgoP}p2Cr%*t +zk@WW_eC1wDxK3*>lytK)>^6dp2Q&`J9Qd9CaS?-T2-VI&JKch`)I`o|(!G2^^IqGE +zgiQRv>{1h!#fY1^ov)q-Efp(o2esb}_1mC+kmmVV)KimMo!X`p;zS2piL?gX986U4 +z02(HUc)T)Jx@mhqCVCb@uG}yaF9jdg*(5Jep%Bt#BRiJ8asHjbj$_Z?N +zO9U?no32W2kn^;)Qd&_6_aW^dPypDhl40UE!0CXHD~%>&(~O&}svA&Dm||n{K)0{3 +zulqzD;XDTUm9Mg9Il5n$cvX7ob4trrR`^irVtlk|x?G7 +zAv$iea+>OMYKrt3G47*KIMBD!0a{#b6N%Jqvyy<_ApXYRtleq?`Kp$|XSU56@rR;5 +zSWy^AG+ENvkkO!40Bxt1WY*?pQvyuqo8F)Wk8wDfHd_vqDA!ljp$YWW*DP#UT~SxX +zjKT4egh;1d{sf3B7~G1AX)GwVmXlNc}>DTwnY6VXh>yUb!|hM?lK_MjJmbH`i8pd6^o2eXmcleNPCyp +zG*tN(1I59L2ts1Tf(3PYi(=dqf0xpc1fgVHmJ{R&9Nch}s@zC{3Bj@cv +z(g~e730}eaYqi8Hn?d-#{AA4FQVtPd!Pwc{z$eq(oDrgu{ +zBeH(K>eLBW9mBo2e`_-rKnrWI7s0d2A@yM^4hV1mD?XXzf3aw5sBKrAzgaTI|MQj< +z=;OZ>6ci4`|Jx&<{-!^I1dyzqR03a`a3B~r5!UTKNuVGKzo|r+-PF`2It0nN{HC1D24|f0Tbl +zFKEDGf?0<+Gxo2O0b!(Mu{sOxD3q9T<$vdm8 +zsGzK*WOwda0-Wk%|&^J=spHF +zL0~;*@b3!U;7);ds$;Cwp6Hx9FMaJC#60#Vk|C^UO;rydz>UKDCnaM5NL*7>7hCXy +zg3Cb(8%yAwNuTK%d^E+pi?#HC?3EXB)2drjVWD2`K?^m~;B+oYY9aC^HS!xt)kv)y +zZPa>0)da^tW+9_ZWY#W#!&M$-GJZIC9mYd<*8Mi8d;r# +zYl0RzG5CB3gBQH83af-I5Rl3$M4y*0dmJGNuZ>nb)iJst=$k+F)C>B$90B$(3O$E~ +z-~_TkgtBB`1!0Y}QqOM;3OuKoECs-a>$bO2K_e@`7X^(QMSgU($M8!l_RdNnd4LYN +z74E6}WLzEsa-lqkWJP1400x4MSlI|r5eRh?2}P-G6r?&ab_ZK##F~c`N4>{2b88-b +z_$-b@un$nfXtCKR^Ji!nwumJi!~eM0Vh+nuG1^w&+RwG=d$9o{+9lw^*N;%Jb6huX +znhUimC2sL6G7bJsjj`zS9*&i>sH(w6DT_8^aaF|vy}NU>*P8TZTJ-ss)-TccJ6a2r +zjFx+*rP|gcaZ7IOW0iQHR$X*D=#tMItk3XTYW{{w +zU)y>&R46L&O3P!N=t!xR6A^zDjLLdM(<*bl8mOZs1@1EK+L|3ki!7$qV``aY%{A2@ +z5{xZ{P<>+bI36`l6HZSbO>gJsC)cnc%Grj{IOD^IlP`=J2$N$HBjF%@vM?%@YAH*g +zvp~r>JiH=KHQ+(fK(IL&v`-V+@J9viJY#Z7jq6pDgHId;ZCA|1T`?7U}i>XOzw;7`XrMiBErCeKq%g +zAU=Ec{?FGczWEmwlNTRvp{HP$R8Uk_R9NPniP#whUH;`Lcp%;_qQ8uHe3y$StBPkX +z7tu5mbkAHaqxP9mcbq&andpqutEg5LjF4V!9_VGU5aDPj$&^vGY#hfM7lwJ6rq-T+TXDRPXHuhc=TjKiHAc;tUJW{{jOLd$h?;l<)kh#{5L@g +zCEz|?&*Oe;y<%V_PN~aquHX!n$6fA^qOpS;4SuzZ$~2l!#NX3`uE-E4Nw`ewy-O<{ +zNvTWnzJ87gpUPr+Vb$YY9RQNNtqu(ITO&0cD%1zEW#A +zrL=1d!GZhfkmb0~4>2G)%hrOr)1kM96xNQoBqV!8X#@2ur$m+!Gq|OcfB=JsOC20p +zMj-QG3}FFv7le604TRnW_X1F!lJc-gI)--kEi^m!c9RxuW21G>V(;9ly1JUWIUe-Q +zIwy`T$m4UZ#PO}5P>6eD!&Tenv?M%pq0K@RGc3vzA~OkcED0E4{cc5hWgI{au|Wk@ +z)E7S5TOhWGbrAbnh_opY_Z)05V+J=!gds^4HDm0_X(W-wtjR=cvkV^(s<6%O2LTlI$rZg~)x6l+Sqme1{lJRJWfPA%IZP3^R<8YT|AZ3`&rc +z2t~|AZw7m1+GF(xYdN~&Md8fCi-XdC0lmYaL8cxjRIyadLuW%ixrm+jC^GhbZ>&Z(8z!3m +z=KB8?VN+2VG4pX*4^CYpaQ04NuRSaT8$ZI?Dpnm~ +z5D5L2qcj8aP78?UcHhoHY>a@}9V6p|xhL%mgOL|%95?jBas_I^rEYQV@L3f}wv(3; +zJIjX63l0NC&m>IB)6Nv}$zmk|eP}_mpiFw#e;ANjm8rrV4fexSs7*R~GI=}DJT93;NjOYI=h`9EAV;H0&V)*t +z;yh5B5b6zSJmH>rQMGb&`i^f((0`Lx4`H_PVpE6+%dYR4&Wb?{=gyVmVzCYqYL7&x +z({_{`L3*f50K%a2Hc3T@v@AJK2*0N->!8LZ!eJm9nJ79V6DGkU;m!^6 +zJCqE~)5b=@u;@fV|97Zv(6o&*2`@uATbt&j5~8r^FxVKwY&EXDa=h$j>)zOy#FGf9 +z!#JKU;qJ)I5d$$4*c%mDYv@!~NPHswj*w=XY>C`l{D4!Y)(1Z`ExRD~3I}@qIGQKt +z^KcHDGGaz4#&i*vpXilKI~Wu=-2zwFE@>wXXNrBcxdZK~Xa{17HDc{v=Wz|4L-9!r +zcgW!|ML;@hmcu8QzqqC?oaTr&y=L+YEW3Sk>me8<@#ai^K(e~7Ophc05iEksbti|D +zjlPOTKN%c^+RAE{1-aO3UMo1`E*kxb#|xV{vJsA_y(Zw*L<%@gbO6G!ypa|umsxIjxr6^HevK76HcG($vzxY +ztYK;PsP4|7krv=XjWr!gKpsL5YAZaPu6i}K8g{ygxPomqHe7rQ_O_q#$wb%%p|Bwg +zAVWdtP`yFu9)YwZT*N4F-<&}))ToP(o%tn8qz~q`kxfm5CTAFno%Z#Xv3&(P%?%wv +zMD!Q|*u@jm#Ct3@-nMFQYuMzIt`4XPwRI_4Laqu}Ua;|uOd`Q7l+hHi8rCS=^uiX_ +zmY++NmR?@NoT(qI?)ouZ3;O_3l(@YCoubUJi;G`f7eNvWg<0MqZ&oi%4xJl4pdHan9LphikOJqO--dG +z8@kRQ4W9bVcTK2&tYwrPD64hz4>>5U^W^Gi-d_Z +z9LJ*6=H&`GaP7&}U3^%sc|2O(<%a=Nw;g;%X(~BP1ly!1FPeu4I^5b7VWvOO3%Q|z +z=Oi3?u5UpYY&Zx*domI>c;_~e)lOPaQ;AK_7dI?lCe^N-zpT1avbj8->Z*o?9?yb? +z1th1?UEuLlt+36t&Vk=^=YU2J`q5C`u&ipXrkQg*B+)v@gMsGEuUW8mE*1+5Fd!Ok +z(C8(utXqbdcB#v+5IqclBO!Rf$1A>GyXVvbT8t2(fQAr9qk^!(G26&Y=!UfNtvQ9+?$ +zJD6$=>6^eTy|7CR@&qPnr8b}l8N8XlDG$@pZONj9mR{sPhzQs1e-)4TK +zl1DehND~k{1$7E6pTl^h_%JFvsGm`iuRili67d)+`S?ZLE;azuZ%|tkiJu*330?>~ +z9Dp1~TK>ufteEL`WMbQ7j +zE2mEiK&IM0y(#+W7o}?E_j9THaLTK-YgTmwaXO8;MqTzn%1ZIsMs**=UrlYE#zQ>K +z*kzE2!B}=DpL`esCd<^yY4|~_0ql?C))+p*%o(^r*Hb&H;z;yGU9&H9La${%_io(t +zpA7ULl;L+({WFvQ-@@Vg$?2q+N?qx)<- +zBHq<#*b-4WDMb*y^pml}&zFipq74i@)>{d6GP5mitY}vpZb_<_vC+N8yRM4YC?7{n +z3Ppf__hThS$nB9jqOmTi9sP&E2?3?}2x+HQgUquF={{|Dz>hA{A(WkvT4Z>gK!bvQ +z;D^MP9xA;?FcrZdj*CT32-F?in5fhfOC_ii7hHkjhIkiJB$kjxU!0P^C6+QDIwuz4 +zGpAtwpj5Z85=65lPWW4j|IWaFXFBmJEG(EY1C1Qqg-!4gB{8@kCVF7B(1gvQhiz9^ +zmpkN-`rWZan+IJ6Lv2y)I@yCuW5;}oXRh1aRu|j?$k-`>KOPT<$jR&R!;a{3!PP5i +zb0QFb5-lh_5K5cg9SLKA_6^!NV?GI$^HnzfaQ(7!-U)YnPE1zXM~Zv<%}?aFq*oI +zP)aOw$HIoeGwFO=MwnR8*!iHJWVIQKx3%G{c(7HUg_6h`3K??1iBBLAijzeq#|;CZ +zgUASwFjkL}__9$VhBlxio@W?1p4pc08`i&)Xj5orw{gKjF0VHdGBm3*8blkBj7)dR +zP#kB+Hip7szZ+$9Ox9B9sxLJ0nD= +zVPPYP&JbDIalxi!tQphM<hD-)sNv2v`Lv%(vi_JF|&EP-@lffYA7{qk#vZb30n5=)4NHWc4 +zmdz{r7q~rB0Lb7#86Zru6R}n@Pf4?u^IZ7STYkiELcMUdD?(Rq#K3%T2$=ww>^urU +z4mfg2HNfCxGDBw5)8!8-F5(Rr18oc$b}#Wlg;;|W&PfGBF;9zM36V)vqCvCdNJvOV +zKSC@uWRl!L8?FP6xA}$SxZFmQ3r$mtOj7;yNXMz&F7%UeIjw0k0;U;}qLi2pHGria +zo_)%7(5yH)nek7W-)lD7u3|p=NqMvuNJeK|1WiO3N(NiVhVI#@%RwpRn2q4c3q|~G +zvIqSjB&aQ-CZZqY93cZk65A+;6Ox5Q^n*}*)KfKeJsa8ear0E!BsCrtVB^s?N-u;& +z^g|^_)c=_=CrM|GZ;EPFeD1e)RwH(kklA}RNCqu0*<{1G+D4~#M +zGoDISmY}J|L_guFaU$aALS%I$yOSoViDWlVO@spN@P%fysu@YjM6?NQfFCT?n3z;L +zc_LaHE(Hu1Aylvn>oqHk{pUae*Uzs8W|`s*QD{3l|7G6x2qh(*p`ffG-R7yXN$Q5A +znz$hq3Unkx?0k%Mrp@Y3sag1vB~WiaVaiD+BJ2wO#!!Z2F;i&^xo{#~KsXc8fmpOv +zPRP*!CJM1wIOz|=wPn+P$qRP|`9FKQ*`+7o4DY{%MMZ}9-x=P4_|2RY|oK^IJ9KWpt2B+k8dYMr(1}O(GR!rlQqSZXfQx8yw*lA=LJd`vX +z3TYHK{G|BG^!S*+EMsd5Rl|o~>Q?mtz$BMA-hzMdY^ge>W}dsqkmzkK)diW>HdLp)+^8w-%c76yy}Jh;OiMTQ^)*jv3DwNe82NFio^mun7WmNzYJh9=Pn +z#`47+l7@O|(r)OLUmZIs9O{sDoq^%-pq_-1y>tcxnPq6w=np-U#nxQ}uRG?2R2LrA +z+_$yVn`dheb8SuI-NlmRh0QKu*a@4$VgIv6V_~khJ);X`Py4|}0NfX# +zZH%W03+)xtdE_Nkm$kZRx5RIk7?sp)0g&LNtf7KG9L(v#p5@Nd5nrE(#Y5l)gOMYK +z9UHWQYjH&-G@Kk!G~k9I73Z#|V=-bji(PV|MGp%L=paWOOKAM^P~S>=pYy<*a~~<# +zNJ8~2F5DToKVa%j2b%;_qc>s|VH{Jk8UX`fl^WyCWW}{>eB?0ycX3k>U#d|xfz$YX +zh0Ue8wNPK>3>sfT+|xV`SoJQv#kkL3?t2##5 +z;AXQ@F14po+7-`Ybas<@ptg;8{9rz@2_DYF8(wtuV07!=>%}0=#IyOO)6Uw1>NfS+ +ztKKl$4eopYpLlfLxlacEUk&563tGULgSbvc76wzX*6jzB|Ttm+kZnGUPFSn(kbqrR+@gVAtxgF0u +z#_xcAxp^bfaRa1E|CUyfK!zaV}uL<+{ +zQ(1sa@gHXx~Nd*ai-2cmHPcZL$l6p#*BK)Z(rFf7iWiw!W4Zf$g2JNcRE +zX+tHo1YT;?n{PG);boaNh=#Sxx0MY0pLJ-LOaL?N{}}}Z#d`jK!2Wv=efo7LXej`W +z97W!`>8@Q&V+-Ke5FnUmF7>G_n0P9qBBM&|_X3KogtW><)yqL}sgyoCMPX4{@os;VK<&}% +z9+>GG2=OV<6qtmcq;bqu?FQnC%?K#UfK0M=Vb5W(mZMqG82E)0DV}NxhXRreGE=OM +zz~3+YQOV}BS$&l?wQK9D7cFj(AcBTXn4Ze?(}T(_sH(55tFCRRu2}))D#)Uf$QunT +zx7BhB_0>WbC0T_^Dh>*m2*awXx_T%rk($M*;A)%=5QIi#Me*afhAQy+FeP?8F(ft_^-c*1KH|WZ +zI*B1}Vth`Vr@C9CWtoo{6$LxvS*q&M4Ha<1@DUeVtU*jig2G}b!G{^ikRSdj(`4%A?`;piU{i4a1mlp7nL +z;^77g0Pg|OPJcKQl=7jjeBzqYZ4;0SJtDKfZqK+aBr=O`LhLxz#EGKVNQUMx6%X~~ +z%pmCEKqRX}SR52LT=W4*SXPYyiT$4I)(Jz({$(m2YEkwa(Z8e+9~KZB74}yOf;HeB +z+VAxUk#0~$K3WX~w!p5Tw8R0W?zZ06G51#ZftOG<&6&9Sx(+A4ozz7ZFKSK{=v+9o +zkp&ylv;<)2#^8Row7(%tG4^SKmhm(j4}UYWfY2_1wvl5-ByLu^9VkZXVs|lM)9eJX +zBrx1kx#{zUT_mkWoCMb4;H#Wfk9Q-5r}rgtQ%FmNVABBz@mGzz&s}(#B4Qg+(-VfF +zPyK1v_dvgA@fWQ)NEcD3-27r>7aQd;LBss9*)=ooCeGEgX~b0a(2+vqZ6Al$;j9B{joLrVYpXx)4jQl#B*4N!N5f|& +z<+xol9>V*2|4sw(2F)7m;E%S$ +zN0M~XWJOL=&|nBp9|c1Th5`TFchG^)&-XEr|13uwEhtI#TOAqXKP81Tbo!s(lETt~ +z_uoD8nM}kJY|csO%o6H8sl?-*Ar%&t6_l107fECUs9eHYS+inc^`dggO{FYWYbY8B +zr-A@(K#{+)G{sKx99Cf!L78!=OrLj@+aS)?HGsuRl_6zCoq* +ziX&2QI^}%S$gB5Tqj{wQLVHA!T~#S}KfZJ}0c_3}lm36VBZGgwQr1QFDVmKOM`MC%wLw@$Ic +zI(3wx?LpQvy8MBZ$p!MW!?qB*pt{b1lWZbz^?Xxc +zlx_+yjm0S?(p-s-1`Laa1kmvz-#L_SpjZjW +zG^rGq(bP)OLABc2ths^qNGvE#?>1&xgXr#2Cc$4Ha7wvwPPhUaTLEQ7oo`|FvMOle +zg6jGPJV(}CaIoM?Y(R*kozqA0_|=}O>JN752o(@}#AlXYsywxTMcL4P@ +zd9K+dkY{Qyfu{F7lQC28c}?OyugP%FYf33i+It?P=uRrS6f$w{yGp3U{lINF*kT5w&zbnW%C_2k}7C>+ZAViUSpnm +zCCqEiYtDBzmNzyEm%`@e=JIA#y2+ZGn-&ARCmJx&n_^#(h!dy5qhXf%*c`Y~5+wPJ +zjlpoZxjDa&)uVM`T01Z>+R7yx)u?dn;>B~9XHaD2OdF3Y%GCPw7g*tPP`yxEQPUt* +ztwA>kkx3;Sp~&v1f#lTDP^3w?560p>W>*Un&~(+{t!J!*T@gtI=2sO4ln!+_(>>E8 +z=XZvMHFZ*6NUB~T*>zVQhqRzZ!nLD(6P#N9*yK7x*UZ2??B;pU*D72id4<~BC+SLW +z_fI2Mt!PZ&A=BKx;b<~mJ9Q0Aa~oBw>Ba>-Rd65~Zh&dpfMs#uwq4%^mci#F6oom# +z*F@c17;vSnjnG@#FVlOide;leVUwF4NgcT7?cR^c{f}^B{a8oF_+K-;`u9Ij2_Lxs +z?ST)y|B*Q-?ox`lYO=RP^3E(PC@L!{G*L~qPL}F>l%yQVSEO*LCE*7z6@nIoy$c8Y +zXbDCA*uw>b@Z%63m}`-P4y($GmP?+LlJH=~77v2=pv!=##O>AAl=2(v0G-@kE6`&H +zSKG2Fez{u?q_9R(`o6>x67h+tf!0;49xj@iTi}j7S*nbIN0TIVc9D$XE(Btc2q>1| +z09zr5K@v|On1ofwgz6DOM*u0;L?OCoLi<5)3~SvZqMgFQN%(DSan1574MHyNoy-)b +z;cguQRXw7T4cArc(yH2JRdw{1ZY*tlixqFv=WFzve_rOaJ># +z`q!8Ej|Tc*GGoC0Z;yO5^q))r1OH!1OrC@pNTuCs#jn&ZZWIwqgxaL$*-TA5(y7UyN`LS)EeG0T +zlC2@pgX0axBtk-aVkwnM0_k(R-8NiFS9>VX4n&>fM&Es?73GKWtV7jQ(2OZRl=%#v +zLQ@a5QoAZ+*%EIbN<+ip2e=(G=0mAN>4;2WVA3S)l1?2G(s7{b;N~%^LfUv{WxF4& +zQ`vYy2G(T?kx?W%O)B?%I7e}~jSVqFwIbFfB~no-A1u!Du>v~&%0@Zg#)d>~7pVHT +zLSSAei-gFY^&!^|IO3@!kGEJ`(XiNI!(;PvugihYp81&2e^4vw*E%xLfB5L=e{oT1 +zsYNR3*H)zY{EyTBH1iM2to>HU&d+~|7yQ2r%>VBH^fLeK)q9ug$PoX#sAPtI{!2@X +zyaW8-p7{Lu%8zeaMlD%bz0i`Cm1S9s{%85|?GbCLD=U4qbv1BLLKzmzh{el7(OC8< +zizO0GCh8W=m)5LZCk=hZl5NSg46%4E7JopAFRx$N09dQ5DkTL0Y3usxB}*3k`+{q6 +zEgJEi`-~366G@9Ds}_AP3d%|VeLog`4|gTwkp3z9KCYz$zGn}D?+MgE^nE;hZzJEG +z7>0a52)+j+;FK&I+8hr?g7Ezz^!+!TDH(mwS%$tJ-x-p-(D&`=JL1kFA@uzlC>ufi +zl*KY=1f(Ys%Z0wff*p})sH;TZ=U6PmMzjgvTZHcrHVHbV^&{e)HEX7{SndkT$)u|m +zymBOhSc>3}_E;>W&-gP2##TauTtq^SN?L_h8Qc>pW6@xUI6jG{ +zo5Y`3O!pz{8hyrI_HWBLpW8C(*>RSfzddCcGQ_2EO(U!cHZg(-zV!H +zf3l2NvrmCP3cB0CugbaxDUeEZl04X!mcbUQWpB$k%LK~-mdO^o#bqh9%&^S19Av4o +zEV0yB8Z2uqhgbrZc1y&Puyk1tw;W|T-g2VlRLfbG^DP%yF0*X4TyMGAa+~FD%LA52 +zEKgegWO>oD!}6x(UCYOoPc2_rzDI;?Xx7NAu~`$c4$R8Snx0jdH8X2&R#n!rth%hV +zS%+q|Wks`6S%+sGlXYU&=~?GzU7WQw>!z$bvL48KJnOlvKWDv_^I*nWRJ)m +zm%V@X)ND`o%y>@RaH +zIm2`I&6$+r%9)u{nNyRqE~hmok#j`O=A5&0F3Gt*=gyo*b6&`KGv||>ZwCz-GCk^@CkQ;{FKjgU~ +z?+p2J=+L1PhE5+^KD1`2e`s>(@k7rWdhO8rhCV;^-J#zM8$Rs7VTHpM4qG=YI_&6S +zXAir2*uBG^ANKyR?{i1x=H-^<*5n3rdvZ_7y)5_6+-Gy&&Hdgw+L~`Iw>DVUTaU7y +zYrWq3u=O?T7sH1Sw+){){NUlC;YSWXcleFN9~=JG@NY+q88K}{<%p&csSziSxN^k( +zBmO+%i;*KoP91sB$aN!=BTpW=b>tsMzA^Hfy~gh4-m7}A;9kGl>w>+u?e+X#f8RTI +z@4US$_C93qjeDQH_aF9tcJEI{<&K&}mq&d$dhBTL=$g@y(I<_* +zdi3L?KNvG~%+xVeV}fIj9dqfJKaP24Y|hxpV=Ko7#vU{Fvat`3eRtfDarxt_$E_cC +z;<)R^Ju~jpea7rlyw9qAy7#$YpL_OsbKjhOr|w(5Z+PER_Pu%Em-hYc7yJLB;urES +zPWZ+3zj*!^UyuLg_=CpF<2R4LVf>5ZzndUUsG86*;j{_2O?Z93LHkYH@8JEq_S>@G +z!~1>m%W=P){mZ~FH~;eHU%omqd*ZZ-brTPpc2aY{(?t!5L&phzH13!}Xkt(FHbguM}^y#FDlNL`(O}co}Gn2lz +z<=a-;j<(%kdwsHX^32Jtlh2&|;N(xI95`k9l*6Z7Gv(F1+`O52?Rn?qJ(~CR)cmQd +zr~Z2CZBswUAD>^HzcK%s{MYOw?epv#?3dWLJBB!BIyxM`bNp#q_Oy~|?b9xp_U!cR +z>7~;{(|!x({+vOE%(0eW$vThx4HlBnc`XJInDE^=idb- +z1>u6r3U+wMc$avO_TK6Jyl`4!pzwmi?L{Mt78d=g==P$|il-OL#aoJBDH&U`yyVv< +z50?C^bVg~S^!m~dXH1!K=!^?zygYN<%-WeJ&3tUu;92u${c6_Tv%W1WElZZ&T=tLI +zuGt;4ub%zEocuZRoXh6CQ*JBwmtS1|=3Hs+p>uyf_sw~e=K1GcGVkq!CLa_$=!%2h +zuW(eXuei42@AC`hC+6Qe|Le-K%1xE`FUVQ2Xu;+M&s2@6T3K~|)f)?K3)>c6v+&bJ +zC5sMQbpPVPijhb%)nIT0gelSATW=R}J$U +zPHEV&(!Mga^1)SmuWDMgb=B9a7py*g^_y!vYc{QUa_xR=Lu+qeH+0>qbyuwWvazc1 +ztj2enN}7&udZ{_Txx4xCL-so)e8@e%y?uV)9}XRS=;}kSKJ*8FjsFt=mo3#T7q)yF +zs0^GF_&9h_@XX+ca=CoE{C;bB>*=i@w3WA=(e`2cy!Nx(KM7Ta&JTUIe)0N?)_>hm +z({W|TkKxtf8zRFZheqy*j)`_eABr6i>yAAapB_Ix{^o|V4QFlmG_f>sg_5N-E4L@d +zA!h2Sls$D^>aEVXofmX|)3vJW58b1?quo#SOzSzJ=lzWfH(q|&pu+-(J$U$}!;d=r +ztxXl1ENx7@qYI8c{pf!lv-+4jkKO;+BaeOO +zxJAcZbNpV%Cysyl*Ry|p(QgL*CiI(UPAEFzyc7PtIk@?W6AMl}`@|nk3Y_%BZ@s@g +z_qRWu+)!=`_xzTFwp@SF{uiBi +z(RaTO{r;7U7hSyVlBt)Red&-(J1>3jvQ?Kodil)Dw_dT|6(?TtuPdWhzIj#MRS#{Q +zv32X!6R$qyn(S***L-+w)3txPZozf8U+=p9;v4q8;lvv)H>Pg<=%zz&dg)H0{ZSA+cdHdSipSxqp9S`0)`_5bMa^H33-IMOV;GTW% +zIptpKy~p1B<9!?N`||$y{hvJ0_P{$2`X1cz$2EW4{?Ne>J@fF=haY=n;Uj;1wBphG +z9xH$B?#Ig>zvGFSPu%uo>66=@DtYSGr%Rr`^_kLVwmm!J+1vj#>rZz+H|M!~pP%>q +z11~Ii;gRjt+n;=K#f#6qwDP4_UT%8%%~yi2eDLS+pFexG^VRQn9QoSd*EYXC>h-hV +znE1vee{uZfhBr&!yyvY2Z$0&P{o6a<3B2?1UzNZ9@b0nijePIy_YZu3>j#A&-2LIg +z5C8O0<45m)9RK+HPmcfF=)Ya~cl+OO`Nu*3cfX`>!{DGvS-7zMc8)qu;Im?)~q(ei-`0x&Lzf>&|~K{r77>Mt=P9#~qeR +z%djCsh7K7#44q85xx=g@#*G{?eE5h7W5(`1ZvXubJYfI*CQg*5xbr2ObMnNA_8AUm +zfw#E0_`v*Gi!^J^S4#lEJ4xx8FbCKL5;ZzPkAMN0yxYEAKM}_T?wm +ze}4Ir+crr@EPmqj&y_oW_1CPcXB91d!g2i>$9{atUki?Wb@Q`}4|;SHqLlAF-1WtK +zQzQ3mpD=92#KXg5@BQnqHlOoW>q*m(nfkuFXz3T@2FZ7y{QJ6jwFi8A>FwX0{$lL* +zdEpP%ocp`&8xu{BZrZx~#zziVd;0o^?zm#@8CSO4^27yu4L$RwyN;W3;oylQ-ro92 +z*?Cv(ZLi*Z+|6r0`0$YN$lrOKn~?fXhuI;HksKK~hC?X#ukrc0)8 +zd-&q!mX_?(kGvEMT*G+q((6a8fdHx-5 +zZ`uCp{Y{q^J~?_vgpswwK@7l|Q>}^C!n$aeLnNe|l-Ed4&VKo&VV_+jx!hUD +zZMi@DR}Xt*FPzZ)_VgKBttXCt?c1oO=DbtB`Qd<~FPiWA)7{_X-txjP%A3BJF=5%| +zOOL;y;hb{EqqDbsGxx>Ht(RZ%S;=ocxqQWI4?fX+_{@FBUHj?jvo86tY~9$>BW}Ow +zkTb{sI}!NBlJn~B{LSNE&wS)B#ruzOUe(oIzvc5K!!NtoF=yQOzrAtZM|U}0g)h{6 +zuy(IEuKViayXE2oQc=&Q?XT8f^!bK`-)(;O&=*#H^TEn{XMHho_SWBDy86}iC2t(Q +z-RBuude&VNCmp|I{D@0u&3fkjnFl^RqvwUMhoAZKYP;8QKhD4UmQeLq&Fi*Cs>fV+^O##_y?^2DPduA7?}ZyLwVeO) +ziIpSInYen%*gHz{3wJCybKCQE#~yp}oV>~YudY4iq3O%oV!qX1e&m0<@YrKcdS}a! +z_5XP2$xEMJ_vfZrPqZJG=XXs!>&nR+zF)PnRDS8>)XBfTXk-1b+8-Xzs+jfozi$8c +z^xK9z-8s2W-gHODN&k9q{Ysa2d+jUMTxsIi``(lGnz#AxTfRAL$Y+5uKUyXXIcUkb +zYgdgsGjPTyH8=jP`IzX6>wojh=9{M9eCy;9cV1MzA?L#Etf6zZ{BZEo4>pw_c=?GR +zoV=j>x+Bkie&!DUlK1wR`1$a4chA0U?b|clilgbFt<&r7Jn<;&(CF{3iq*bxUELdJ +zZ(s97;j6wSC;s;HYyW!Ifm?RGea5{7_rwpMI%mW9oA14L`u20`_C9dPG1tG`e&@-D +zMqhjI?Iq`aQ2$o`q(#3y^0f^Y9{%#w`(Ispyl!62>&}-NTbh?z55M91B`;lj>d_baXa3{3z87b{^RLOn +zz93Qa$t8V&X!nqGU@|?TwqR4B5?|kCBrH5VkNyRfS-a6%ltrve?7`^@dOKw>H +z%E4DgE;?xY9fjlP-#2V-h3m?j7g}Duvgxhc%3l4UYuy)hw~RXYA9csg96b4!Lrxm} +zx4lc>=^o|UR<+~&*j0`%Jzs=7KN|o3flrV7aBu6Yx0UbvR{7EARXa9Rf03yDea(ia +z*T0@K>;9+XoBwggG1F(=|MKFR1HS#e%YWU}SKfDz9d-K62XFuNxQoBuG5fjg_y1^l +z{*HgXKDV=c|EAU>|9)rrqpwxH@$sBl?pYs&^KQEBksrRkLub#2ubJX!Pl +zt2T!Y;m_K3mSz}+>u(I*|$BM>%I{xFx +zA%8vgp?%Le^X#*04$es|3M;G6x4!Ykr>i&JepdO^Lvw?7-LZ7?DLeA>zhBw#%SC_M +z(QwG{U#wg@ddwGFb3e3B-nu;h#s^kkbH?U*n}74!+a(8h7RzTI|NI!`$RU>NJEt6d +z$&SZAKPR;Pj+OQ^&$870e$nm4-%Z(j;}@^}`JV0TE>3>8a^-Iy+sAd=QCpvQYQp=C +z3;tRE_&)nzeoWnIbzKwkA9&;ZZ*9N3;kerGPq<>$v*))2kDr)Kp0#nviWkrO%jAz< +zum9`ik5wPHPuq`{{a%`X`oa}UerKWLs6b-&6XH^?Qk +zE`90MXKxs){O*I{OTDT6jw-C(aY|wH4~OUHK0frquMYgzbqgOKw(jC@JCy5Q9MiCH +z!!xg)v2t6r>#C1B&V1v&o`08az2~9%wGThDWYig_o_fz!XI-?<4Ue_wRiAw8;GFFT +zKlbRj!ArJ1an;gWdg9v~54h~U8~~mQ(M3V_kvs9XwhO_Y898dyteYq+?#|1t3Lbu+yD1{j>O#DJLjC4GiT<` +znYs7;Mh@a6noiwT6uV@}hW53WuHUXM+?{)gpC7)KCtxhD{blT_(UI3>e{MW(HmBdj +z@lEDZr22lKq6@L^c(y;p+Hb)6+N0I$3dU`FdDoBIIQ~J&g5I{LOZ=>xJXiOQjj->u +z`1+oAd+11y+Z+G&4Np?Hgr{Oj?b96!2k4$#dj{nogZ3Mc`5OaQ5H4Hi^-3Ya~O**heYHTY>Jrdb!V2_;2ZIo +z=f_A|znOdgdX;^|;mHNP92Z!J#(mpzt=z2(kz2L3Z8_W4EBuMe&&2CP9R_zHocfW+ +zrcSTu_@V#)J~v1aS8N)7k3D{SGJ65j1ofGpty{2Xn)SVF6O2bTGwYTiPNo?@y9K +z!h*d#ISNF9ynsJJ1*am&Ohdz2B9SONJA1~A89F)&6O$qfi`iCIW&Qilqfiz&I8-`1 +zE_Qcc>fy26$7fYwV0BPX?dZ{Uv9TNC<2NNIZ{={d^LX__;hrf|_Q~Z3rcXaqR8%y7 +z{`^IY7Oh;lQla>!tnAymy1K1fx9-}t>(HS?#l?+t=N?_SuzB&~ldD#pt*JRzSJ%3A +z>!teo?|1LMdgxHw(W6ICpFZ8t@Z-gc7jN9S(bUv_=FIJumOB?O-fL@n*wN9^-u~#p +zg9jZQPaZt@?HNq3UcY|*PwV!B6V>5m4sepY4F7F`xQu<769+yOggOMQ5{2>QNUq-IkFEzhGhWB7hH$~bTIAcvOt#JPMEO~@aR$|VFXK= +z*Aj_S^6>}1GYCM&)%_>!!EcmbRDz&Ku}!8FW*MEYhoi=fS>PvYh()ez9|buAU%{Z@d$p+?iIF0fxvx2 +z1ojDk!!Bfw;egN`HH}4vmX66McGMmzB@Z6GDztv>v3X`;i>Y>3{t8x5rMuzl{pOanW!t?o7yhC;=)#&Z8dTMwj{&So0M>5pGq8nCUu +z#jMu{_dgd_6L=|G{hum+M*7-3M;XzfgoUJ$Gj5;xW5mR7d^`ui$bbVneqt&U|jzP$Uc~`G`|7itP%`FD3lF$}oi)%*_)9}ktI*X!$=Mk5ZL+!e5xA_ktORNHh6sHs#4Gn!>U|@UbSR2_XssWi};F3ZxA%?AR1VWHsqXTnO +zn*5o$3c(hGKPwt!{jM#qnd4L$vVQWx3S;6!Bb$`2V9(V-hpKw}8=LIe^5kpMG4j*tIj>hHW-$elXfnxv0J3Y% +z@xGKZoFA4W@dMbMYv;NT`&TW}PrjVNL*IeO4MxtHkeVd +zb{4Ipt1SUBmY_Ohnh~McWFS?sI?IDmBMx9%A?_>#XLntlTPw=eeycnF%EUtBQ&+AM +zba*ooh$g&t)~-MMO}Id0M(Pe_g%XF@Ck#e*{Pgh9(;qJA>UgZmXrq~2L`56S8;?ww +z^L#OK%5P_B|L>}U%O?kZUr+n-dA#^h{^371%I>vJBB>d)GD%S=c+QB#M%3cecxl +z@8)^ZsDwzk*ej!9N$JZJJet+=#F>n+wK>6O+Y`SWrcgY@2%E*hn~2{*IlijBj&C`Y#N5kW}12q3Hn-(__gta||>0TKB!Xg&9pxGDnG3qB+^idm&Di#8YKE9?USj +zTJZh--j~1aI#=qO7DP`n%JZE`vNyCjUps5a?|y_1G6(DTC&Z1sa~(9<7O={71gU;14RvuW?N6k4!a;-Klg4-VFr2J +ziz8z_Ms>0n2VZram6Y#Vbtn9e_w`rjw)Cs&wR6rLgPlVCS9S#kdV#4$9ruq4mYg<9 +ztGE&1kZ2INEybPbKRkOiG7nuAu*B#|ZPs#yuICl^fN?vxS9x0rPg&@kbbnUCssb}LLD2OOe|u)Q&UZ;S)lkh3v&jpH?Bob5|R%&*+SeI4;S%dInzE5FdZ +z^3WmM%fB!p2N!3p8-1})Z9!n|b?$Nd?J-w-mpSV--QTac9=k_YUQLuF55C&q;dZym +zDCO76zJE06o0zt4H{UsEVxL_@x9o{L_-LJr;7_#C$f(KKi|l&g&py${%MgQ;)?EF{pX+0#s +z%;j!H?<;yf&xjl1bB-#k(c)n(BXUnnVP(x*RfFsq+y2ecHhP_Z|9b;%GZzRptuxs@ +zZ-?!BwjYA8(0%D@}y&j#r?CAWu$&+NO!^@*x7<*56hdm)Iw12EC9TfQd +ztB0vm&YvxxbKw3X+tMPV8?8ffDwpa_m6&Jt>$p@bk_FiGj{iD%VN-{BgYMXhqNkKZ +z{Q((>V#-s+&|glUuv_u-H)%EZigO*d94TJIwk%e>V#*BB<}rE$&g--$6c-Pz@YrhD +z{zrjfR@3}+MyZ~QVw#WrlGA;8T`XN@<)9ggqeEJL{$^mIO*Qx1QM>ITbscZD>(+;6 +zIczIS+D6ws(>CzY=DNh*=HihB(OacDO|!|q{*$JiPvp9L6WZl{qDOEFkX0}IU+F4L +zL)~szA|+GIJH{6H<&Z0nWc%M7VYgJi;YBK;eTa^MtpVS237>eQx4Ao#X-tr2-T?ldzFLQf};eG>oEty1(wr=Rb}kaV!$3=JV3~-w4&s*f1w@ +zV-i2$%iMZojJa;V9mqEYh$&jYZckXUpYfuU+^latNK$NIH#X10v%@QvZ~ocTQ>e|t0g6E(9ozNl2;Tlu{}lW +zxb0qg%!5Vs-u;+rUPEvs>wKL+ZoS|!dwqnygl|=^voF;4T*kCW>X)mZT?4%(4o{cPbM;KlX!YKEA=1d) +z(bAmwDr8PmN7dZ|hTPpZ^6v2KOOezIN%?`g#sZ&F^-H3IY=4TS6*ZF|$53?abow?B +z;u*{18wpgeaxXOGpe0w4H)~R}54l}7YNxEoJb=|cVg$>n7eQ*)89uBAnXLCEsZz(Z +zAx~hQ-O-9H`7M33bl}0eqX_a4i=B+kLy1nEM8^uksKUI}8*SYK2;)n*i2lk +zOK>~?lVZ4j+0=b=nE?w-*E^Z*F6~#AGw5=$Fk6&!j8?TX!K|LRZGXwG*4dVhYc7l( +z_2XTOgwi!SjXG{ObH8jZS$Wa2b`w8vN3DK=j@_vOR(6u@5F67JPA>xSk#2f2B_zRP +z#aAWy2DKe{ZTG +zr4tB<&qw!!Kc`QW-m?D3O_H9(cO69*+RKMBFv-a($PFxH{fV4>WJp45xMbTdhpd?Dy{oBKNrJfqEb{$ +zD0DSHJSwg-2p^6X#1#toBDoqgNQM8R6o^Z5@biTs`}|105Es>tWaKLs$c22rF*sWR +zU+U|Op8=Qfcemk@gQ`ff3~|n+$-vO@YgC#K$;iP^tHwO>Bvm0NaZ{<&Xy|lMZPjbl +z5Z5M1$cKl4d0{*%Wg3O%G?gRFhR9OW0Jr?NF{9#)oSjj?0s|0A6AO8KDGJ{_1Q(_P +zGlWV8JOBqH2x9(Lp}8udFmv9!a^`8~%$=mwob(=brQyZ*byh2mx}CJs0g#jf4V3Cz4W&IA7$Xpk0RrJ7D{M&`tm^I*5p8o!mpcLHC?6=(6`+vCa*7k27#Tr~u##vorVABN2U +z2ZF407(x~T0QTIlq@d1F2IH?egY%@YH0%|17|a7k^2FX<&wyaFoOC`N^#x@Xi_-mk +z9hfK{>sJXh2S#ZD30{`fV$m;@PrH!IHB4F>V8j21*YqP +z4)129VF&nlBEb=Mp-E8uv{82vJ&SSngKQ{yfGT924jg|5EdE<#zg|z!6*u8=x89X +zeCvN(dQ1OT-WooRjQ8O`jCeEtrzhjH|NlwS8~xt_RW1iml=B|0Sez-~%P1rjVkW7um +zSI)y(=b|$qFC3}|uPSgYsYyv_YC3%LSIVSF`8>*m2{feuKc!*?+Y7&f@X1Yg?v%EJOjAuE-JSf9Ql!=I5Js|Sjy``CIP1@N@rT4%g?{vPr+q7voV>tcq$v75=Dj%zK8nh(f=7y$% +zg7Sg+FeoUOFBD2RJm`xsDIOG+B?2S#>)~u*wgb<@vdP6b?f~^abyRRq1yVcXhTcO; +zM8KH8B>~dCgL_CoTu?$lA|B;1IDqwGGTxwme?6jNBI6=ik>P)*E-KppKuTmx+~1M_ +z=-$CSCMY^SC^l}=n4q}ONcIN_&?bF{3>fbVC^R_ogV?L7-p4sECLkg<9JJeq6~71V +zyIO!16BZTsH|({W?j78L5@Ql4#m2>iMTC41driW3w(yupEYM}_huMz?-TS!*u-P$x +zhdZQuKlcx|eGR&Ia1V%w7LXYAVXdmBdVjg&K_C1(<%V?c=N`rmiuhYIO%-l +zj1ZD3m;aa)t!P!0HwoDSsWMb>p0+?3CK85SMB!9Hm?m?=T~#^6$Dk^2>m*cj!bb^{ +z^Q9a)TrCvCJ3Gb6iRa`*!8uak)E4@+7*MM~gs}v?s5~0POE4BOyR(ep)91yV7#)&q%H;w*T`=K)rHArFtkFP1=Za0iE>jDe4zoz)#2A6rI{ +zk+ch?5(HSog&7Rn61!*fIou3XCIDHa*&-3V!RH9%87ewhax@5L(ICWj=5U5s!IfB- +zI6s+$&lRKzxLCy@+<=@fl7X_yoV0X=PdJ2ms5mVRl5(*8p*SbJRw%v}rab3FdY6{5 +zy+XL7i5CmoXM{yl=>(gZfSFu2SDp=V4)Wkt$PQ-8mH~yPp%94x`e1Za#^CQ=0$nJ}aZS2a$p%Seb*>&EbAc%pb`RpL~9WD8e6Ev4FS)mA@F{H$KNZe*@#!dbkjVkc1W{7UFi9LW?eymElM;viESASMzYSfCWD4ESm?Wy7GD96E~m +zdQNcb4-jKz0crz(G#Zov+!`85T?J^+xCP=aCDb)GxPlf34UP!`$6hX8E=rAK|0xHw +zP&_Bjz({4$8us0-?SJ}C`@b{wnE$D8z(1;t_dWl`@Nj=4{=4Vr`QIl=J@DVLd#ac6 +zp6UkvP**o^hO4(nk9#U9j)~%?g8>4ONDwSYKFK}~M`sUbqRPX-un1Qc69Ou^a&auz +z*!bY!uyHgTHya{+hC^sjEFT8T41Qy$AqFUhm4RVoBqt?zqhTjcNS=V5(LjfVrzo14 +zRlwIhGAm)P-^j1Tvx87Y8Wb95|55}5vsP!9iQmYgar4#Sss*EpllbCQ#u2K+F-71i +z@y2!M#D!qgEEd!iD>ytLB$kE_7poPg&ZNeJ?x|TL9QJiMXgyV}Vj?4MMXMDzg{WQth +zk>sczJRISq6U@QnN~cvW1|A}q^8t?yPEny-%gL6D!ITjAwL&rW)GQzh&lXHWL-``9 +zU`jUh713bekn({$z!RfXVMdz2oX<^{a?+e6+1%k$f!HY(%z_<3u3Rv@D{=8WoET2P +zL6nO{0x=p3++qPrmBFvK5Qp$Za3LOB4S+?>5eR|LBbH{O9HC5%6%}Xe0y4XJ0gs9c +z?`j?-M`sdgut3BWW`lzIa^ZsqP8oh0r(|*-kka#%P>>4GK?rzQ`Ke+759MWNNvIGZ +z!4XZPLoh#7L?gkeC^m;qqf(Ta;Y?nRW&`&>9lGS)3}A494!ooZ%<0J@3SC6=QSKX1 +zMNEc|k7(F1I8Daqw2&*8na-DUscAGHeC`V$b>T9ZL6N~=+?Vn>nLgb!cOcclEt^iE +zb7?;6%pxY!)rAIJ9Z9wvN~aD@77Yd5L`)YS6#7K@8ih_4<@+RyK*0cmeC-OSVKv69 +z1Nne@i?k}PR0b2&M#2|S!BvVh6)-X~a&|r1CdES0JY{uph8?N@%R!IC4Tjgu38=G#|`*z(1_)`S9K^2M()1 +zM1=<&X*!p#EEPDOnlwSXNY1dg1MRDOGzUJRp04g!sd@Og0R3ZjBo6Y<4vWLpg=s^@ +zX}anJtRxic>)PFfm^xvf646~$O#_uiVPYpK%Cm2@5v+p1r)P7i`s7gc^ZKg2HV(=H +z8O30z$bxWeaG7N)N5}_Uzz75D1}IeJRQ5Ij=xwOL7nT@&gI?F&T-xmgWdOy$zd=yg +zBABuT6KL9n?^fGerQ_X8Nlq8MJ2R$4?Yx@3IA0}A`P!0;&tJR1J?{VVNgA{IkF@;% +z-uu6sYtQ&^BV0XQKHvX8MFO2$d7p$x=olg_-ld?~;mfefh21DAU&4_p*XSXntxSEF +zg^Rl^IF@7UFWEA@b4vMqd?^m%+seEl5BQ*{Sd<38hyTU?fDEOo7WCoB#phki&NO8Xw#J5p +zYVkaWpV|X)7s`y{q{D~bMHt8>n7UvKvLuZa>o@uo=46lThFJE5PPVIuH^ZfeldWzX +z23}a@@-0-H2LslSi6&_}t`jCGb11a}GQk{bzq$K5t{K&Jm8%S{V>0n)CA#-4@TEuP +zx+MO_5=!L>K_h{w7MPmQy4eC66;J3JD>?SWE!NVc76dRxta0Kk420rzEwtkB$PjH( +zZ~`Y)Cai(QX&MHJYOU%kYoK02<>yL3lSTopQ=z8ln9^zL2SzYRXD0r5hyaI7#Y_M@ +zn2F(ps-KQl=7nEQa8WeP$tfwxc@(q+A5ccsqtIH}piHf7nx~vqhJ;Zo2Y5(Ff}H-k +zCM0PNm&C8)v4`} +zt~6SjMs}`Ne!PHc!=$OfOtEPlB`yQQSXGTqaHcPV`%roK`nbAGc4Fce{g#h|Mzj9 +zRq5UHe};=I;|=^*@Ztw{O4&1l5b!z)5vI+SS+40Wy;j4Q>RUvHfz=_ +z0zsjxTVQBdWNch)YFcP!R$^*8+uXdQckfbj^D=AexqbW2?bmPqz=87y4*b&2uH3<4 +z0fkcG;801UEu_;Id3Y>kFseK}mNOX3yuDX=d#@TbYIR`X8aBH+Ft7#-BE2p&v@Se+ +z-Iy`!qoOv%#eEeWy)hwSOJd^Y@#D89CvTZJ@#~b7?ObksdV0M;uxs+X$< +zDf^~QJt&tS$jdu8efr^9v%Z}<^KfBdVM$3zSy@?md3i-eMO9VR%9SfuuU@TCd|O*v +zyMF!pO`A4-{q@(ocJ11?Z{L9f2M!-TTvXIpTG}*c&XIZZj+K`muc&BVxbQ?()v4vn +zPcL77X3d)KYHPn+yS8=x`T-Oq>)Z32HeJ}X>EhR4U*5j``}%tDcV*9>YX=Xu9Xix@ +zURB?Q`dTZfUu5 +z;ljO3m+oJ=^2@br58B!u-n@D9_U+s4?T_x?zyI*z!&|pHfByOD-Mdfk-Fx=%;q%9j +zA9r@X`0cmfo<4o`;>GW;UcLJL_dl_?&!5wOo78ci5yRKWP@}iSeYSC%eB(s@y5>J=?HfzoXQc(P2LQ`wa{Y +zDTvjLH4F}jsyk5`U~9hIPRi0Z9X7e25qrh%n!(<&3(-XHIpzZbN=)jrevgf?4%QjS +zSRRw^bd>3e8XEd9+o2%&5UV^+=muEOWKP}-3y;#O$||Os7`mhoioRRZM<|l4-#Qo= +zzLa-S-;~WBOw6@yS-$t~Ig=6JD%{;HRt*l13(i{u|O6x*y +zrMA6oZWas~xwd#fpL=yJV|ZiOp*p+AP=6>TW>jz!S*G?U2bT@7IAK@j8`Ck){5MYj +z0>7DF{(1|@VHNf>E9{C*>?KhJI=yE6?5{VV0xcqQUotut8NOn0s%%sH##nC)Tl|w< +z$_a7`hiKUHQ%!;C@kD)B#gr47z7a;YtBItR#?|^{&sIuGT?@k5TcTe*uf1f1qSmCY +zvxE}tc#$xV82Il^$m^DT_A!FHAA89lpD41Trh4knw^p6XA2AuRxZB?R<)SMtKjv3l +z4xT8GjAu6!DuX&oO>`yCGZtKT9mXkMARWRQM5=AvoG*6@K@QjkrM9u=c2xX|n9R6F +z-!Hp0;yyAGT^MC}XD=1ab2-Gm+{Z#PcKf<}#9!{Gk>v!3fHcF30Y`{^8l1ie9k{lz +z$z~LNN9j4ylET!Hl&T{$Or1ljdk?IieJdbzd1Yr4<<5;;`PD{fK;OaTdzx}?{M%cC +z_~h!A5P$KoFRpoBzExHg)Mt2unSL0hsA<7kpCn{lj&3s{+pEr_)$WV0_bRFj#%|B= +zIM$F9Fv0%Drj12>$?Vr5C8#8kwP2P1vuni{?qrH)6TSOqbu356Zk{`?wJ}ZMiU#&c +zoW?G-bnElX(1_m0X_~BPWK^IjJNa>u$pB%Rdme=zC>zA(O)2S}Mji2Zbj7kA5ALp= +z*W2IV|Fm}=P*G(2y07Zo&_E}k$vFqf&;)665@=e2ASgKrNDd0xL=jOk3Mv^1A_58m +z3IZYs3KA6o8N`67qX?o1j$CloJ7>%8;cS+{?z#rjt5+7n@Bin# +zzCTm+$cqumiB>p8|5eTOr)=i?mvmGI%5a%RgBp04DU)Fi=b=X$#z*lq9n7(~;frWj +zkpHHS+z4BfB0rr~mW%dT-!vY#v5`a=f}Qc|l(S4gt%aTGWm?aYAR&;p@e$`V@wu+6F0;Qy7Dg@Mi#GljtHeS089D`>dCi25L25<`qIf1>sKI9nT@M^JfeL5DkoH|*A_ao5^?Ci- +zE|qjtnIGD*yG@d0xQXgwWq&gN0agM@(I`WSV@|f+>NA#6ybQ@WkD|3>+u_NQxY7Piyn%(7HlIHAY5}`FYY~EY$Ic=!V>T8H%k{uXOYdIXt +zj;;*s5&;OQhFDZIr~aprTKkPrN_P5l(RU?1j!Y%`%rOQjqWW-tY0)_5w@w1Ljf$Bm +zS5v=ly5Ym9<_W}ShjBKLSmFu_LmED-tN$3tbi{eROfl!kyr^GM0z0Vz0h_;@n{vy3 +zz3W%B8e#rUeEtEs`*VStP^hGcVQeDj(iK^9tf53TA`^@;hDjZyWAEGxgT}YO!SLl& +zQEloTKlhNh-AojMc44MTKuJZXk|&a+aUvzu&>T~aS55S(RA~AXoim~b*&@?*c)jqh +z`^wEes%q*Y{A`@H**IMXWmlq~Rq^VjQJZVVkFR`kNSOr$7m&6hv^?@m?;8V5d=f8r +zFRV_b@YxY^bNzw|#C?kP6;YPTrLt0yA_^L4MqxEYyDlN)4H52xY6b^D-0=}8EbX)1 +zTX+e~yIM#OqL-BP^io1uBi);20VSF=Ar!0tabp{mG=a+iuGsJQge6BF_B@Hm$DnfI +z?v$imbT?)lNib&LlnCOrypU0YtwHVl1DDXZ4lhprEb4vVxM6V8HyI>$JTlgd6o#Sg +zqD^@c$}?3Zo5`bja)Fgns$FBMwn0Z{)-W|G$=cqf5*G})QVNZxYNI;kF3UM>nikzE +zWMi7I8x`dzTHdLQYJbb(Y8a!Y$9dPG(_iEv=R_JV-TvzBvC8^D1GV|O`vE6{evc`wXJUd(s};sgS_c=fG|N(`wS@+b}~k?9~LmGu5Kmy6(a{aAdJKqlgq +zaY!SxAqMCgsyd?^_AQAn)LDFwC;dCUPQ*B8S-Gfl{UH0|c)2>Dtie`~w&K|R`~juy +zgGTmRK&L6On}raPw4Ws*_0$dXzD9LPh_BJ88bUVAY$KldR$U5GYOL^zw;+jVA51S^ +z1CkoBiLS83&$#_!4oZEXs<(%*MgkE4ufGVFpVWf_fLl3zRR}bkfCCg@1`qJh`=MR{ +z2P;DOyi7z!k#@E!OUcAj)Fk8RBqI_!GSl#t8}XPRWRnKoMxfiF;gC$k;zy{qup}oI +zwvt3dkQ}b-1;{;1Am#6GjPPy}1*u}#V-1L?OtJ$72I-E5bVZqFp(48wM>EM$fNu^K +zX}_#Cj{{Vx`0vRj&ghTG)4~znudsFbhYdZkO4UA>AMaMf%6TXNk`0d9EdWb{qOc+o +z*$}@%fLVVArGp_-BWd;PY4z0*YN`N7CY;{IlTAnYmp~H6K{>iHAKmwAv+Ro;-GXZv8YSk(X;8%iurw-+>m%aCT`YOgX_O=lkvi7*#p?BxT-hg)OlTkGFUCo)C +zR4QImqAuYq=*Pb)qa76TdLxY9PfAHA+et~upc{@;RO3mX6~-rwOYuPXJtIPawLlik +zVgzei3a1h%aW4+A6u|wPVWtZBxSX7?b_kfOq5}F*-plMZBfz7?-Y(NZR1Zl%d+L2y`=6(IUqtCPvZgSA=RPYIaHL%03KDIP}HWs)_nxq;KnVC +z_3>28p`(m;~Vw+||%-R8=y5F9lxHTg@s2 +zH=9RTOXHHM@MlIfBt4|HD-0bBbKbyaVQZPTv%IMxDWZ;QViW1GJy`f&`lTEy(vAYR +zX@K#+IYJvj6b#misKBXRFq2Hz6KQ9yuysAtb;BEVBivWU-ryJ!r2pUX$M66C&t&R< +z&OZL+{hzX``tRTWsWak#{!7@J+L{Nj=Ei2mz>Y<=>GmJ6wSd`YW?--r17&AG7qDYp +zjWONh7jzhc1%SYy@KBnGzTiGbCqd*e00Gbd0#Mw(i+h9xTkbX9@%aMGj0^JmE002_AwX&yIn8&tG+SUP4;lVr0m$x<1{m_nv?6`Ol +zL$?obTa$LQ&#zkc$2z}i%8vF74D#I8JI5UC8R)sAd$)CJWQ5nYhVI$cDUp6&QQLZA +zTZ;xn1p003^_{$dUT$Fk0K@Do5BKu$-PSt|787bqGuYPJ0D!{y{6@R~M(@Nh-Z`ni +zo&TmtCTj?qdPN0zg@?;gcfOK_dhSen40a2O0f1l6`3Lx&vK8DeWHm*ynwp%Fyy9;P +z>c33 +zTg$`WoDauNd-+WeQ9mya`JDp&3xB%8e}mubPkv`}e<_}wu^vAL73`GTPB5>Xu&lvu +z9y__bYc +zL#X%;5D&@&*oQ;_`tt(-Mqmb@&PCfP;9u%(5858sx$+zY7JqH`KLCHfRY=Cpzc4?a +zANdSuwmVZ?BY#c%VXg-Um;g3_2yg-XfCwN7$N@@#`u6>w0vG}2+s{_EfFp1K@Bn;) +zKp+%|0%C!9AO$!DWCD3WAy5od05w28&;;B7ZUNmuA8;QS0VaVNU>pu45$QZfV)8>a1TfW9YI&n2Mhuuz*sO5JOyThgM7;h%Uq^;yGdsi9~WCWso{ZYor@8 +z9GQYFK-M8|Bgc?0k?SaClmJQzWsGt{1)&m9`KVe{Cu$6}h}uMB(PC&#v^Clj9fQt5 +zSD@R`5795tn@l(+2__vTTPA;|c&2kq^-On}W|>x*nVE%|$;>v)e#~^{bIc9Q_n4nC +zf5qT2(ij7bGbRFa22+LU!aTvOvaqm-vrt%^Si)J(u+*^JVVPrDXC<)8vzoDbvL0tW +z&)UK|#`>NO%_hdC$99122wOheHMWOr@33gBIMx8`hCPNok8Q&~#;)NAI7OT_E)bWF +ztHllAUgME?al8@U6Q6`H$KSy}CqM}z1OtKxA(2o)xJ!6RL=Yv2W<-DDDdH94Fmah3 +z&#uC5&mPTwp1p&8o&(Au&SAz8z>&ex#PNt@gOiU_kJF3uBxgP680Qxf4~atZBBhb8 +zk|s$TT!LIiT!*-_xNdMg<%V%fbK7u7aTjsl<$lLQGRSLWgs$YGJY}_WkzM;vSisH*)rM3au_*1xk$Ooa?j*BH^_ +zJ)zp8`iq*nTBusR+LF4cx~uvH^~V}S4XQ@E#yv8etWQ2pzD543siqmO*`)bFOHS*M +zR;|`+Z3%5J?F#MZI>I_`I;A@Ey9IZnrGo>No3uG0-%KGw3pe8k!iU84erajqHpHjpmGnjeU$S8!wxvnjAIhGKHI3m}Z$i +zHsdq%Fsm_JHdi-~Gw-#)SnRbZv{=|9y(e@}yCuZZ+%m^<)=JDO$m)hQU~OidWBrsW +zK@Fkav_aTVZO+@gqAAj1Y5jW%dk^ld-TT>A-!{W`#!k{M!mh`j&EDC*#{P?gp+mOA +z{JvfL;`ZHliXvUzVkEiEA;#5Z|Yy{|K*VNp{he$0S*CI15tslfo(zfphH2uhxrdjA07>s2~G)~ +z577+C3t0}e2)z^rhPi~bh7-3RrXEB{MkGf(i`*S~K5{+EKI&RDE;=asL5y_F$(Y3> +z#z!iT!j5_z?THnNjgNg6rx#ax3_Rw3tmnAM@ucG~=_d5*c&7M6@k0p;3E2ss5*-rT +zllYS8Nzao_k}s#Qri7+EKB0A@I2D%ampXh>`DDS#?`fWCgQpZu<)8YN?vXxtTJiL` +z(_3e}&kSd%WfWy1GJ`T7W$9*BXXCPuWIxZb%xTFL%uUPvly@+1AYUcF_$<@eh_mzO +z_MB@i5G}|o_*Up!IC)B0RPjcMU&&OdNoh-&cv*fq +zqCB$vRfT;;f2Brc%_Z(jr!M_c6;w4}O{?y$QLm|~<*m)Q47nU}d8y91ZsdyLmDYN> +z`qHZ$S5Gwn4G|4*8eJP7HCZ(ET+_H#e_ibQg=Ru?S_{|`)3SWS_r`pyW9w*}d0S7r +zR(tbJ`I}X@gl?VhVDHH2Wa>=n+`4___F7kP*Sl_??&m!RduHzJyED;i(>r|E;_kgZ +zD;?DpgGVss4;lszS{kk2dWR6hg64}ht-B#9;!cV9U+gjk7|#0j_Hnd +zj~kBnO_)vGpR}4BePs7&>ap|V`6j0B^Igi% +zxSub)mwbQy1Lebm<$cR9KZbtXT1j8!TCMt|@~LNyx;FPY@bl)Ev~{la>aQAK`!^gm +z7B{25A-|pbMe3LK?-t)@w*t4ewq^hW0EIvx5pdM@oe7ObF=2=-7-nV+7oNaI`15EPab;pLT7my+EH2c#k(LDtbw(w0|NQQFxEh(@C^%oq|23rT6avsC(r +z+3EstD1Zh8K|x^vf&-yAaH|*K-F~Kl@B9w>3kU!TgCju{WII(A3xH546at69p)lx= +z2OtO(2EcI$Aw|3%k|1p3MvNCx(hn(h&uV1npp7brc5i3n1_3DeHyiym8)7?61P4GM +zAPfS5{x%T@!wV_u*}w@(A*EZ>00s(fA0iY7=mMq3Rxe$3PGD{n%+o +zzn%oF6>9O~*V?LgfzF;!C%HrSVIQyiM|e!=G(<^g`J}x|zSJsKKk^_>ZMa%LpHpqxCIT+{_Q +zepm7E_(_)q8TA^bQ@Gi$L4b8Z#`-sYrV~N!SZnctT+;VY4^Hy}T6^li7mdE3 +zRQT|+)lt!Vi&o5;D@vubiJPYzbl=>Rl~WqGe(lIQcjfcjTV5*s5kb4+CZ_imuY?$H +zq&;*Uw_ks4*GXRG)v75ecbN89or|3~xQj(C?&HNQR +z?+UZiEv*}l3+nP=QqH|KGPL$n@l42|i`9pzb603{`4jsFm8K7xpE|u#_aaZAXl5a& +zQ=ua`R$M!T)YMrgGjW#2CV)t+f9%_S#x-cRXTkj3>%Gq;giKD;XG1Q;J{IqqwxFLG +z3fKZ-=8BTJ*2D>xU$5@YRABRz2yFXF#jNJ~_5F9>khg$6nfN+ +zI?Z=NRHDZ6dM5g(!&4uJ0-SWMpUOVk@9tv36nnMa{83$I!UZ>t4_%jL#b@uyzeZb| +zlAvi`eF>XcE7Il-|7l2FN1|Me(xe$#o6 +z?i;u_-CDag{FkLKA{uY9@a#!@`OK?N&;8(}#`9l9P^)SIMKQya>c($e=X(1_4IPeW +zItc}4QXyumq0|!VkRku4P;%E$aN38qL>Y3|V^eGXuO)JBSH!0lDCkb@-gU>F?Wh`e%*i-fENO$!`M08gKM{`%-qr@kNEbsgsY{`TN#S +zn`Q0VpVu<`H50nXu#BIZNqrsr^Voat)7ARRD@8)iOx2|B@(5EQcKZwODHE4TZvzj!Nb2P{o133+Z37K8 +z2?%p2WSU!Dc8F`u(-C(?d){ob5XqR4kl3`dXn-^h7Y47fci+$gtD1|m9u^mZFZ8mc>t}%q*Y}@l7-91xy +z!^88AAgm?}eiC`}bnlDGduGY(K3f3yBmHb+EAtb;^RHLzCPAubYjR74OoD>nvtuj~ +zD~*Xjo9|M_+!H@5vRK9K(Fqd@ZQxt^g^+>rSF&nP`Nt7b<`SJm&0E)!cL7;hU7s%} +z28P^Bk5PP~HY3}XvFrZ8Qa2K*ogG(w$j0ARKhon`L3sO&7j8^>th0QU|=C?+UlMw-B@A`*Qd%mnXE@wd~e@5Kk+rhOO;&yX!_w*WZ1>m%od6f +z-0@1(nG7YDZ?O{S0px|x0>4}_9zZ#jemxX+WfE^|95OtcW7lFPSN-Nt?%b=G?`kz2 +zz53LAJykhpN_k6|7&NRcJ6E^qyiE#6l!D@@^F~Jl2`74Hm_;)=W%kMrZ +zAVj%hu)B0N*6wDJYBe!Vr-~$U`9Ty}z|E00vOaNdety+_+2qX2qJ-1@C{q=5-Zl`z2 +z865oglXtWCs9)sRYbCmjzp|t`Z%S5uS>4|08C=n@G2IiKo#(->#+K$VWdROIXU>Jv +zmWGdgOY8ciZjm1DTU2!JR$uI~49fk&+{H=TF^R;iNyl%x_!8$_><8y4#hgbbR&nt) +zR{k1`$CX89?GBAu29I{8y_v}qwd(MXXOYfeH?_SzGJQsQ3kWAZeR_H5Da)P}g;$Un +z2{Dl^z^##dH}Yuai#eWF&RHg_DN@(w-oBUqh8a2-L9O%%SbXyl_N8eTW^%ty#o13v +zfqf#%FO_mjb=fDazt^%IsK|I<>*jPieWkW+%wlA0a-!Ya&OA^0QEXQYtkk`lf>o1b2IfIy_u~;+IEprz}L?j+AJ_Te%D01(6)Az +zs~Bz)H>6T25N4idgZJ5b@}Iw#``7aO??3-k>(3wjS^S^h`+uq_Dl*1@|4U%_e=__( +z8UCLP|Igoi|Nm!NfBxW4y8|C8bW$?*SV_u>WMhfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM82oSMKL9I ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include "axhttp.h" ++ ++#define HTTP_VERSION "HTTP/1.1" ++ ++static const char * index_file = "index.html"; ++ ++static int special_read(struct connstruct *cn, void *buf, size_t count); ++static int special_write(struct connstruct *cn, ++ const char *buf, size_t count); ++static void send_error(struct connstruct *cn, int err); ++static int hexit(char c); ++static void urldecode(char *buf); ++static void buildactualfile(struct connstruct *cn); ++static int sanitizefile(const char *buf); ++static int sanitizehost(char *buf); ++static int htaccess_check(struct connstruct *cn); ++static const char *getmimetype(const char *name); ++ ++#if defined(CONFIG_HTTP_DIRECTORIES) ++static void urlencode(const uint8_t *s, char *t); ++static void procdirlisting(struct connstruct *cn); ++#endif ++#if defined(CONFIG_HTTP_HAS_CGI) ++static void proccgi(struct connstruct *cn); ++static void decode_path_info(struct connstruct *cn, char *path_info); ++static int init_read_post_data(char *buf, char *data, struct connstruct *cn, int old_rv); ++#endif ++#ifdef CONFIG_HTTP_HAS_AUTHORIZATION ++static int auth_check(struct connstruct *cn); ++#endif ++ ++#if AXDEBUG ++#define AXDEBUGSTART \ ++ { \ ++ FILE *axdout; \ ++ axdout = fopen("/var/log/axdebug", "a"); \ ++ ++#define AXDEBUGEND \ ++ fclose(axdout); \ ++ } ++#else /* AXDEBUG */ ++#define AXDEBUGSTART ++#define AXDEBUGEND ++#endif /* AXDEBUG */ ++ ++/* Returns 1 if elems should continue being read, 0 otherwise */ ++static int procheadelem(struct connstruct *cn, char *buf) ++{ ++ char *delim, *value; ++ ++ if ((delim = strchr(buf, ' ')) == NULL) ++ return 0; ++ ++ *delim = 0; ++ value = delim+1; ++ ++ if (strcmp(buf, "GET") == 0 || strcmp(buf, "HEAD") == 0 || ++ strcmp(buf, "POST") == 0) ++ { ++ if (buf[0] == 'H') ++ cn->reqtype = TYPE_HEAD; ++ else if (buf[0] == 'P') ++ cn->reqtype = TYPE_POST; ++ ++ if ((delim = strchr(value, ' ')) == NULL) /* expect HTTP type */ ++ return 0; ++ ++ *delim = 0; ++ urldecode(value); ++ ++ if (sanitizefile(value) == 0) ++ { ++ send_error(cn, 403); ++ return 0; ++ } ++ ++#if defined(CONFIG_HTTP_HAS_CGI) ++ decode_path_info(cn, value); ++#else ++ my_strncpy(cn->filereq, value, MAXREQUESTLENGTH); ++#endif ++ cn->if_modified_since = -1; ++ } ++ else if (strcmp(buf, "Host:") == 0) ++ { ++ if (sanitizehost(value) == 0) ++ { ++ removeconnection(cn); ++ return 0; ++ } ++ ++ my_strncpy(cn->server_name, value, MAXREQUESTLENGTH); ++ } ++ else if (strcmp(buf, "Connection:") == 0 && strcmp(value, "close") == 0) ++ { ++ cn->close_when_done = 1; ++ } ++ else if (strcmp(buf, "If-Modified-Since:") == 0) ++ { ++ cn->if_modified_since = tdate_parse(value); ++ } ++ else if (strcmp(buf, "Expect:") == 0) ++ { ++ send_error(cn, 417); /* expectation failed */ ++ return 0; ++ } ++#ifdef CONFIG_HTTP_HAS_AUTHORIZATION ++ else if (strcmp(buf, "Authorization:") == 0 && ++ strncmp(value, "Basic ", 6) == 0) ++ { ++ int size; ++ if (base64_decode(&value[6], strlen(&value[6]), ++ (uint8_t *)cn->authorization, &size)) ++ cn->authorization[0] = 0; /* error */ ++ else ++ cn->authorization[size] = 0; ++ } ++#endif ++#if defined(CONFIG_HTTP_HAS_CGI) ++ else if (strcmp(buf, "Content-Length:") == 0) ++ { ++ sscanf(value, "%d", &cn->content_length); ++ } ++ else if (strcmp(buf, "Cookie:") == 0) ++ { ++ my_strncpy(cn->cookie, value, MAXREQUESTLENGTH); ++ } ++#endif ++ ++ return 1; ++} ++ ++#if defined(CONFIG_HTTP_DIRECTORIES) ++static void procdirlisting(struct connstruct *cn) ++{ ++ char buf[MAXREQUESTLENGTH]; ++ char actualfile[1024]; ++ ++ if (cn->reqtype == TYPE_HEAD) ++ { ++ snprintf(buf, sizeof(buf), HTTP_VERSION ++ " 200 OK\nContent-Type: text/html\n\n"); ++ write(cn->networkdesc, buf, strlen(buf)); ++ removeconnection(cn); ++ return; ++ } ++ ++ strcpy(actualfile, cn->actualfile); ++ ++#ifdef WIN32 ++ strcat(actualfile, "*"); ++ cn->dirp = FindFirstFile(actualfile, &cn->file_data); ++ ++ if (cn->dirp == INVALID_HANDLE_VALUE) ++ { ++ send_error(cn, 404); ++ return; ++ } ++#else ++ if ((cn->dirp = opendir(actualfile)) == NULL) ++ { ++ send_error(cn, 404); ++ return; ++ } ++#endif ++ ++ snprintf(buf, sizeof(buf), HTTP_VERSION ++ " 200 OK\nContent-Type: text/html\n\n" ++ "\nDirectory Listing\n" ++ "

    Directory listing of %s://%s%s


    \n", ++ cn->is_ssl ? "https" : "http", cn->server_name, cn->filereq); ++ special_write(cn, buf, strlen(buf)); ++ cn->state = STATE_DOING_DIR; ++} ++ ++void procdodir(struct connstruct *cn) ++{ ++#ifndef WIN32 ++ struct dirent *dp; ++#endif ++ char buf[MAXREQUESTLENGTH]; ++ char encbuf[1024]; ++ char *file; ++ ++ do ++ { ++ buf[0] = 0; ++ ++#ifdef WIN32 ++ if (!FindNextFile(cn->dirp, &cn->file_data)) ++#else ++ if ((dp = readdir(cn->dirp)) == NULL) ++#endif ++ { ++ snprintf(buf, sizeof(buf), "\n"); ++ special_write(cn, buf, strlen(buf)); ++ removeconnection(cn); ++#ifndef WIN32 ++ closedir(cn->dirp); ++#endif ++ return; ++ } ++ ++#ifdef WIN32 ++ file = cn->file_data.cFileName; ++#else ++ file = dp->d_name; ++#endif ++ ++ /* if no index file, don't display the ".." directory */ ++ if (cn->filereq[0] == '/' && cn->filereq[1] == '\0' && ++ strcmp(file, "..") == 0) ++ continue; ++ ++ /* don't display files beginning with "." */ ++ if (file[0] == '.' && file[1] != '.') ++ continue; ++ ++ /* make sure a '/' is at the end of a directory */ ++ if (cn->filereq[strlen(cn->filereq)-1] != '/') ++ strcat(cn->filereq, "/"); ++ ++ /* see if the dir + file is another directory */ ++ snprintf(buf, sizeof(buf), "%s%s", cn->actualfile, file); ++ if (isdir(buf)) ++ strcat(file, "/"); ++ ++ urlencode((uint8_t *)file, encbuf); ++ snprintf(buf, sizeof(buf), "
    %s
    \n", ++ cn->filereq, encbuf, file); ++ } while (special_write(cn, buf, strlen(buf))); ++} ++ ++/* Encode funny chars -> %xx in newly allocated storage */ ++/* (preserves '/' !) */ ++static void urlencode(const uint8_t *s, char *t) ++{ ++ const uint8_t *p = s; ++ char *tp = t; ++ ++ for (; *p; p++) ++ { ++ if ((*p > 0x00 && *p < ',') || ++ (*p > '9' && *p < 'A') || ++ (*p > 'Z' && *p < '_') || ++ (*p > '_' && *p < 'a') || ++ (*p > 'z' && *p < 0xA1)) ++ { ++ sprintf((char *)tp, "%%%02X", *p); ++ tp += 3; ++ } ++ else ++ { ++ *tp = *p; ++ tp++; ++ } ++ } ++ ++ *tp='\0'; ++} ++ ++#endif ++ ++void procreadhead(struct connstruct *cn) ++{ ++ char buf[MAXREQUESTLENGTH*4], *tp, *next; ++ int rv; ++ ++ memset(buf, 0, MAXREQUESTLENGTH*4); ++ rv = special_read(cn, buf, sizeof(buf)-1); ++ if (rv <= 0) ++ { ++ if (rv < 0) /* really dead? */ ++ removeconnection(cn); ++ return; ++ } ++ ++ buf[rv] = '\0'; ++ next = tp = buf; ++ ++#ifdef CONFIG_HTTP_HAS_AUTHORIZATION ++ cn->authorization[0] = 0; ++#endif ++ ++ /* Split up lines and send to procheadelem() */ ++ while (*next != '\0') ++ { ++ /* If we have a blank line, advance to next stage */ ++ if (*next == '\r' || *next == '\n') ++ { ++#if defined(CONFIG_HTTP_HAS_CGI) ++ if (cn->reqtype == TYPE_POST && cn->content_length > 0) ++ { ++ if (init_read_post_data(buf,next,cn,rv) == 0) ++ return; ++ } ++#endif ++ ++ buildactualfile(cn); ++ cn->state = STATE_WANT_TO_SEND_HEAD; ++ return; ++ } ++ ++ while (*next != '\r' && *next != '\n' && *next != '\0') ++ next++; ++ ++ if (*next == '\r') ++ { ++ *next = '\0'; ++ next += 2; ++ } ++ else if (*next == '\n') ++ *next++ = '\0'; ++ ++ if (procheadelem(cn, tp) == 0) ++ return; ++ ++ tp = next; ++ } ++} ++ ++/* In this function we assume that the file has been checked for ++ * maliciousness (".."s, etc) and has been decoded ++ */ ++void procsendhead(struct connstruct *cn) ++{ ++ char buf[MAXREQUESTLENGTH]; ++ struct stat stbuf; ++ time_t now = cn->timeout - CONFIG_HTTP_TIMEOUT; ++ char date[32]; ++ int file_exists; ++ ++ /* are we trying to access a file over the HTTP connection instead of a ++ * HTTPS connection? Or is this directory disabled? */ ++ if (htaccess_check(cn)) ++ { ++ send_error(cn, 403); ++ return; ++ } ++ ++#ifdef CONFIG_HTTP_HAS_AUTHORIZATION ++ if (auth_check(cn)) /* see if there is a '.htpasswd' file */ ++ { ++#ifdef CONFIG_HTTP_VERBOSE ++ printf("axhttpd: access to %s denied\n", cn->filereq); TTY_FLUSH(); ++#endif ++ removeconnection(cn); ++ return; ++ } ++#endif ++ ++ file_exists = stat(cn->actualfile, &stbuf); ++ ++#if defined(CONFIG_HTTP_HAS_CGI) ++ ++ if (file_exists != -1 && cn->is_cgi) ++ { ++ if ((stbuf.st_mode & S_IEXEC) == 0 || isdir(cn->actualfile)) ++ { ++ /* A non-executable file, or directory? */ ++ send_error(cn, 403); ++ } ++ else ++ proccgi(cn); ++ ++ return; ++ } ++#endif ++ ++ /* look for "index.html"? */ ++ if (isdir(cn->actualfile)) ++ { ++ char tbuf[MAXREQUESTLENGTH]; ++ snprintf(tbuf, MAXREQUESTLENGTH, "%s%s", cn->actualfile, index_file); ++ ++ if ((file_exists = stat(tbuf, &stbuf)) != -1) ++ my_strncpy(cn->actualfile, tbuf, MAXREQUESTLENGTH); ++ else ++ { ++#if defined(CONFIG_HTTP_DIRECTORIES) ++ /* If not, we do a directory listing of it */ ++ procdirlisting(cn); ++#else ++ send_error(cn, 404); ++#endif ++ return; ++ } ++ } ++ ++ if (file_exists == -1) ++ { ++ send_error(cn, 404); ++ return; ++ } ++ ++ strcpy(date, ctime(&now)); ++ ++ /* has the file been read before? */ ++ if (cn->if_modified_since != -1 && (cn->if_modified_since == 0 || ++ cn->if_modified_since >= stbuf.st_mtime)) ++ { ++ snprintf(buf, sizeof(buf), HTTP_VERSION" 304 Not Modified\nServer: " ++ "%s\nDate: %s\n", server_version, date); ++ special_write(cn, buf, strlen(buf)); ++ cn->state = STATE_WANT_TO_READ_HEAD; ++ return; ++ } ++ ++ if (cn->reqtype == TYPE_HEAD) ++ { ++ removeconnection(cn); ++ return; ++ } ++ else ++ { ++ int flags = O_RDONLY; ++#if defined(WIN32) || defined(CONFIG_PLATFORM_CYGWIN) ++ flags |= O_BINARY; ++#endif ++ cn->filedesc = open(cn->actualfile, flags); ++ ++ if (cn->filedesc < 0) ++ { ++ send_error(cn, 404); ++ return; ++ } ++ ++ snprintf(buf, sizeof(buf), HTTP_VERSION" 200 OK\nServer: %s\n" ++ "Content-Type: %s\nContent-Length: %ld\n" ++ "Date: %sLast-Modified: %s\n", server_version, ++ getmimetype(cn->actualfile), (long) stbuf.st_size, ++ date, ctime(&stbuf.st_mtime)); /* ctime() has a \n on the end */ ++ ++ special_write(cn, buf, strlen(buf)); ++ ++#ifdef CONFIG_HTTP_VERBOSE ++ printf("axhttpd: %s:/%s\n", cn->is_ssl ? "https" : "http", cn->filereq); ++ TTY_FLUSH(); ++#endif ++ ++#ifdef WIN32 ++ for (;;) ++ { ++ procreadfile(cn); ++ if (cn->filedesc == -1) ++ break; ++ ++ do ++ { ++ procsendfile(cn); ++ } while (cn->state != STATE_WANT_TO_READ_FILE); ++ } ++#else ++ cn->state = STATE_WANT_TO_READ_FILE; ++#endif ++ } ++} ++ ++void procreadfile(struct connstruct *cn) ++{ ++ int rv = read(cn->filedesc, cn->databuf, BLOCKSIZE); ++ ++ if (rv <= 0) ++ { ++ close(cn->filedesc); ++ cn->filedesc = -1; ++ ++ if (cn->close_when_done) /* close immediately */ ++ removeconnection(cn); ++ else ++ { /* keep socket open - HTTP 1.1 */ ++ cn->state = STATE_WANT_TO_READ_HEAD; ++ cn->numbytes = 0; ++ } ++ ++ return; ++ } ++ ++ cn->numbytes = rv; ++ cn->state = STATE_WANT_TO_SEND_FILE; ++} ++ ++void procsendfile(struct connstruct *cn) ++{ ++ int rv = special_write(cn, cn->databuf, cn->numbytes); ++ ++ if (rv < 0) ++ removeconnection(cn); ++ else if (rv == cn->numbytes) ++ { ++ cn->state = STATE_WANT_TO_READ_FILE; ++ } ++ else if (rv == 0) ++ { ++ /* Do nothing */ ++ } ++ else ++ { ++ memmove(cn->databuf, cn->databuf + rv, cn->numbytes - rv); ++ cn->numbytes -= rv; ++ } ++} ++ ++#if defined(CONFIG_HTTP_HAS_CGI) ++/* Should this be a bit more dynamic? It would mean more calls to malloc etc */ ++#define CGI_ARG_SIZE 17 ++ ++static void proccgi(struct connstruct *cn) ++{ ++ int tpipe[2], spipe[2]; ++ char *myargs[2]; ++ char cgienv[CGI_ARG_SIZE][MAXREQUESTLENGTH]; ++ char * cgiptr[CGI_ARG_SIZE+4]; ++ const char *type = "HEAD"; ++ int cgi_index = 0, i; ++ pid_t pid; ++#ifdef WIN32 ++ int tmp_stdout; ++#endif ++ ++ snprintf(cgienv[0], MAXREQUESTLENGTH, ++ HTTP_VERSION" 200 OK\nServer: %s\n%s", ++ server_version, (cn->reqtype == TYPE_HEAD) ? "\n" : ""); ++ special_write(cn, cgienv[0], strlen(cgienv[0])); ++ ++ if (cn->reqtype == TYPE_HEAD) ++ { ++ removeconnection(cn); ++ return; ++ } ++ ++#ifdef CONFIG_HTTP_VERBOSE ++ printf("[CGI]: %s:/%s\n", cn->is_ssl ? "https" : "http", cn->filereq); ++ TTY_FLUSH(); ++#endif ++ ++ /* win32 cgi is a bit too painful */ ++#ifndef WIN32 ++ /* set up pipe that is used for sending POST query data to CGI script*/ ++ if (cn->reqtype == TYPE_POST) ++ { ++ if (pipe(spipe) == -1) ++ { ++ printf("[CGI]: could not create pipe"); ++ TTY_FLUSH(); ++ return; ++ } ++ } ++ ++ if (pipe(tpipe) == -1) ++ { ++ printf("[CGI]: could not create pipe"); ++ TTY_FLUSH(); ++ return; ++ } ++ ++ /* ++ * use vfork() instead of fork() for performance ++ */ ++ if ((pid = vfork()) > 0) /* parent */ ++ { ++ /* Send POST query data to CGI script */ ++ if ((cn->reqtype == TYPE_POST) && (cn->content_length > 0)) ++ { ++ write(spipe[1], cn->post_data, cn->content_length); ++ close(spipe[0]); ++ close(spipe[1]); ++ ++ /* free the memory that is allocated in read_post_data() */ ++ free(cn->post_data); ++ cn->post_data = NULL; ++ } ++ ++ /* Close the write descriptor */ ++ close(tpipe[1]); ++ cn->filedesc = tpipe[0]; ++ cn->state = STATE_WANT_TO_READ_FILE; ++ cn->close_when_done = 1; ++ return; ++ } ++ ++ if (pid < 0) /* vfork failed */ ++ exit(1); ++ ++ /* The problem child... */ ++ ++ /* Our stdout/stderr goes to the socket */ ++ dup2(tpipe[1], 1); ++ dup2(tpipe[1], 2); ++ ++ /* If it was a POST request, send the socket data to our stdin */ ++ if (cn->reqtype == TYPE_POST) ++ dup2(spipe[0], 0); ++ else /* Otherwise we can shutdown the read side of the sock */ ++ shutdown(cn->networkdesc, 0); ++ ++ myargs[0] = cn->actualfile; ++ myargs[1] = NULL; ++ ++ /* ++ * set the cgi args. A url is defined by: ++ * http://$SERVER_NAME:$SERVER_PORT$SCRIPT_NAME$PATH_INFO?$QUERY_STRING ++ * TODO: other CGI parameters? ++ */ ++ sprintf(cgienv[cgi_index++], "SERVER_SOFTWARE=%s", server_version); ++ strcpy(cgienv[cgi_index++], "DOCUMENT_ROOT=" CONFIG_HTTP_WEBROOT); ++ snprintf(cgienv[cgi_index++], MAXREQUESTLENGTH, ++ "SERVER_NAME=%s", cn->server_name); ++ sprintf(cgienv[cgi_index++], "SERVER_PORT=%d", ++ cn->is_ssl ? CONFIG_HTTP_HTTPS_PORT : CONFIG_HTTP_PORT); ++ snprintf(cgienv[cgi_index++], MAXREQUESTLENGTH, ++ "REQUEST_URI=%s", cn->uri_request); ++ snprintf(cgienv[cgi_index++], MAXREQUESTLENGTH, ++ "SCRIPT_NAME=%s", cn->filereq); ++ snprintf(cgienv[cgi_index++], MAXREQUESTLENGTH, ++ "PATH_INFO=%s", cn->uri_path_info); ++ snprintf(cgienv[cgi_index++], MAXREQUESTLENGTH, ++ "QUERY_STRING=%s", cn->uri_query); ++ snprintf(cgienv[cgi_index++], MAXREQUESTLENGTH, ++ "REMOTE_ADDR=%s", cn->remote_addr); ++ snprintf(cgienv[cgi_index++], MAXREQUESTLENGTH, ++ "HTTP_COOKIE=%s", cn->cookie); /* note: small size */ ++#if defined(CONFIG_HTTP_HAS_AUTHORIZATION) ++ snprintf(cgienv[cgi_index++], MAXREQUESTLENGTH, ++ "REMOTE_USER=%s", cn->authorization); ++#endif ++ ++ switch (cn->reqtype) ++ { ++ case TYPE_GET: ++ type = "GET"; ++ break; ++ ++ case TYPE_POST: ++ type = "POST"; ++ sprintf(cgienv[cgi_index++], ++ "CONTENT_LENGTH=%d", cn->content_length); ++ strcpy(cgienv[cgi_index++], /* hard-code? */ ++ "CONTENT_TYPE=application/x-www-form-urlencoded"); ++ break; ++ } ++ ++ sprintf(cgienv[cgi_index++], "REQUEST_METHOD=%s", type); ++ ++ if (cn->is_ssl) ++ strcpy(cgienv[cgi_index++], "HTTPS=on"); ++ ++#ifdef CONFIG_PLATFORM_CYGWIN ++ /* TODO: find out why Lua needs this */ ++ strcpy(cgienv[cgi_index++], "PATH=/usr/bin"); ++#endif ++ ++ if (cgi_index >= CGI_ARG_SIZE) ++ { ++ printf("Content-type: text/plain\n\nToo many CGI args (%d, %d)\n", ++ cgi_index, CGI_ARG_SIZE); ++ _exit(1); ++ } ++ ++ /* copy across the pointer indexes */ ++ for (i = 0; i < cgi_index; i++) ++ cgiptr[i] = cgienv[i]; ++ ++ cgiptr[i++] = "AUTH_TYPE=Basic"; ++ cgiptr[i++] = "GATEWAY_INTERFACE=CGI/1.1"; ++ cgiptr[i++] = "SERVER_PROTOCOL="HTTP_VERSION; ++ cgiptr[i] = NULL; ++ ++ execve(myargs[0], myargs, cgiptr); ++ printf("Content-type: text/plain\n\nshouldn't get here\n"); ++ _exit(1); ++#endif ++} ++ ++static char * cgi_filetype_match(struct connstruct *cn, const char *fn) ++{ ++ struct cgiextstruct *tp = cgiexts; ++ ++ while (tp != NULL) ++ { ++ char *t; ++ ++ if ((t = strstr(fn, tp->ext)) != NULL) ++ { ++ t += strlen(tp->ext); ++ ++ if (*t == '/' || *t == '\0') ++ { ++#ifdef CONFIG_HTTP_ENABLE_LUA ++ if (strcmp(tp->ext, ".lua") == 0 || strcmp(tp->ext, ".lp") == 0) ++ cn->is_lua = 1; ++#endif ++ ++ return t; ++ } ++ else ++ return NULL; ++ ++ } ++ ++ tp = tp->next; ++ } ++ ++ return NULL; ++} ++ ++static void decode_path_info(struct connstruct *cn, char *path_info) ++{ ++ char *cgi_delim; ++ ++ cn->is_cgi = 0; ++#ifdef CONFIG_HTTP_ENABLE_LUA ++ cn->is_lua = 0; ++#endif ++ *cn->uri_request = '\0'; ++ *cn->uri_path_info = '\0'; ++ *cn->uri_query = '\0'; ++ ++ my_strncpy(cn->uri_request, path_info, MAXREQUESTLENGTH); ++ ++ /* query info? */ ++ if ((cgi_delim = strchr(path_info, '?'))) ++ { ++ *cgi_delim = '\0'; ++ my_strncpy(cn->uri_query, cgi_delim+1, MAXREQUESTLENGTH); ++ } ++ ++ if ((cgi_delim = cgi_filetype_match(cn, path_info)) != NULL) ++ { ++ cn->is_cgi = 1; /* definitely a CGI script */ ++ ++ /* path info? */ ++ if (*cgi_delim != '\0') ++ { ++ my_strncpy(cn->uri_path_info, cgi_delim, MAXREQUESTLENGTH); ++ *cgi_delim = '\0'; ++ } ++ } ++ ++ /* the bit at the start must be the script name */ ++ my_strncpy(cn->filereq, path_info, MAXREQUESTLENGTH); ++} ++ ++static int init_read_post_data(char *buf, char *data, ++ struct connstruct *cn, int old_rv) ++{ ++ char *next = data; ++ int rv = old_rv; ++ char *post_data; ++ ++ /* Too much Post data to send. MAXPOSTDATASIZE should be ++ configured (now it can be chaged in the header file) */ ++ if (cn->content_length > MAXPOSTDATASIZE) ++ { ++ send_error(cn, 418); ++ return 0; ++ } ++ ++ /* remove CRLF */ ++ while ((*next == '\r' || *next == '\n') && (next < &buf[rv])) ++ next++; ++ ++ if (cn->post_data == NULL) ++ { ++ cn->post_data = (char *) calloc(1, (cn->content_length + 1)); ++ /* Allocate buffer for the POST data that will be used by proccgi ++ to send POST data to the CGI script */ ++ ++ if (cn->post_data == NULL) ++ { ++ printf("axhttpd: could not allocate memory for POST data\n"); ++ TTY_FLUSH(); ++ send_error(cn, 599); ++ return 0; ++ } ++ } ++ ++ cn->post_state = 0; ++ cn->post_read = 0; ++ post_data = cn->post_data; ++ ++ while (next < &buf[rv]) ++ { ++ /*copy POST data to buffer*/ ++ *post_data = *next; ++ post_data++; ++ next++; ++ cn->post_read++; ++ if (cn->post_read == cn->content_length) ++ { ++ /* No more POST data to be copied */ ++ *post_data = '\0'; ++ return 1; ++ } ++ } ++ ++ /* More POST data has to be read. read_post_data will continue with that */ ++ cn->post_state = 1; ++ return 0; ++} ++ ++void read_post_data(struct connstruct *cn) ++{ ++ char buf[MAXREQUESTLENGTH*4], *next; ++ char *post_data; ++ int rv; ++ ++ bzero(buf,MAXREQUESTLENGTH*4); ++ rv = special_read(cn, buf, sizeof(buf)-1); ++ if (rv <= 0) ++ { ++ if (rv < 0) /* really dead? */ ++ removeconnection(cn); ++ return; ++ } ++ ++ buf[rv] = '\0'; ++ next = buf; ++ ++ post_data = &cn->post_data[cn->post_read]; ++ ++ while (next < &buf[rv]) ++ { ++ *post_data = *next; ++ post_data++; ++ next++; ++ cn->post_read++; ++ if (cn->post_read == cn->content_length) ++ { ++ /* No more POST data to be copied */ ++ *post_data='\0'; ++ cn->post_state = 0; ++ buildactualfile(cn); ++ cn->state = STATE_WANT_TO_SEND_HEAD; ++ return; ++ } ++ } ++ ++ /* More POST data to read */ ++} ++ ++#endif /* CONFIG_HTTP_HAS_CGI */ ++ ++/* Decode string %xx -> char (in place) */ ++static void urldecode(char *buf) ++{ ++ int v; ++ char *p, *s, *w; ++ ++ w = p = buf; ++ ++ while (*p) ++ { ++ v = 0; ++ ++ if (*p == '%') ++ { ++ s = p; ++ s++; ++ ++ if (isxdigit((int) s[0]) && isxdigit((int) s[1])) ++ { ++ v = hexit(s[0])*16 + hexit(s[1]); ++ ++ if (v) ++ { ++ /* do not decode %00 to null char */ ++ *w = (char)v; ++ p = &s[1]; ++ } ++ } ++ ++ } ++ ++ if (!v) *w=*p; ++ p++; ++ w++; ++ } ++ ++ *w='\0'; ++} ++ ++static int hexit(char c) ++{ ++ if (c >= '0' && c <= '9') ++ return c - '0'; ++ else if (c >= 'a' && c <= 'f') ++ return c - 'a' + 10; ++ else if (c >= 'A' && c <= 'F') ++ return c - 'A' + 10; ++ else ++ return 0; ++} ++ ++static void buildactualfile(struct connstruct *cn) ++{ ++ char *cp; ++ snprintf(cn->actualfile, MAXREQUESTLENGTH, ".%s", cn->filereq); ++ ++#ifndef WIN32 ++ /* Add directory slash if not there */ ++ if (isdir(cn->actualfile) && ++ cn->actualfile[strlen(cn->actualfile)-1] != '/') ++ strcat(cn->actualfile, "/"); ++ ++ /* work out the directory name */ ++ strncpy(cn->dirname, cn->actualfile, MAXREQUESTLENGTH); ++ if ((cp = strrchr(cn->dirname, '/')) == NULL) ++ cn->dirname[0] = 0; ++ else ++ *cp = 0; ++#else ++ { ++ char curr_dir[MAXREQUESTLENGTH]; ++ char path[MAXREQUESTLENGTH]; ++ char *t = cn->actualfile; ++ ++ GetCurrentDirectory(MAXREQUESTLENGTH, curr_dir); ++ ++ /* convert all the forward slashes to back slashes */ ++ while ((t = strchr(t, '/'))) ++ *t++ = '\\'; ++ ++ snprintf(path, MAXREQUESTLENGTH, "%s%s", curr_dir, cn->actualfile); ++ memcpy(cn->actualfile, path, MAXREQUESTLENGTH); ++ ++ /* Add directory slash if not there */ ++ if (isdir(cn->actualfile) && ++ cn->actualfile[strlen(cn->actualfile)-1] != '\\') ++ strcat(cn->actualfile, "\\"); ++ ++ /* work out the directory name */ ++ strncpy(cn->dirname, cn->actualfile, MAXREQUESTLENGTH); ++ if ((cp = strrchr(cn->dirname, '\\')) == NULL) ++ cn->dirname[0] = 0; ++ else ++ *cp = 0; ++ } ++#endif ++ ++#if defined(CONFIG_HTTP_ENABLE_LUA) ++ /* ++ * Use the lua launcher if this file has a lua extension. Put this at the ++ * end as we need the directory name. ++ */ ++ if (cn->is_lua) ++ sprintf(cn->actualfile, "%s%s", CONFIG_HTTP_LUA_PREFIX, ++ CONFIG_HTTP_LUA_CGI_LAUNCHER); ++#endif ++} ++ ++static int sanitizefile(const char *buf) ++{ ++ int len, i; ++ ++ /* Don't accept anything not starting with a / */ ++ if (*buf != '/') ++ return 0; ++ ++ len = strlen(buf); ++ for (i = 0; i < len; i++) ++ { ++ /* Check for "/." i.e. don't send files starting with a . */ ++ if (buf[i] == '/' && buf[i+1] == '.') ++ return 0; ++ } ++ ++ return 1; ++} ++ ++static int sanitizehost(char *buf) ++{ ++ while (*buf != '\0') ++ { ++ /* Handle the port */ ++ if (*buf == ':') ++ { ++ *buf = '\0'; ++ return 1; ++ } ++ ++ /* Enforce some basic URL rules... */ ++ if ((isalnum(*buf) == 0 && *buf != '-' && *buf != '.') || ++ (*buf == '.' && *(buf+1) == '.') || ++ (*buf == '.' && *(buf+1) == '-') || ++ (*buf == '-' && *(buf+1) == '.')) ++ return 0; ++ ++ buf++; ++ } ++ ++ return 1; ++} ++ ++static FILE * exist_check(struct connstruct *cn, const char *check_file) ++{ ++ char pathname[MAXREQUESTLENGTH]; ++ snprintf(pathname, MAXREQUESTLENGTH, "%s/%s", cn->dirname, check_file); ++ return fopen(pathname, "r"); ++} ++ ++#ifdef CONFIG_HTTP_HAS_AUTHORIZATION ++static void send_authenticate(struct connstruct *cn, const char *realm) ++{ ++ char buf[1024]; ++ ++ snprintf(buf, sizeof(buf), HTTP_VERSION" 401 Unauthorized\n" ++ "WWW-Authenticate: Basic\n" ++ "realm=\"%s\"\n", realm); ++ special_write(cn, buf, strlen(buf)); ++} ++ ++static int check_digest(char *salt, const char *msg_passwd) ++{ ++ uint8_t b256_salt[MAXREQUESTLENGTH]; ++ uint8_t real_passwd[MD5_SIZE]; ++ int salt_size; ++ char *b64_passwd; ++ uint8_t md5_result[MD5_SIZE]; ++ MD5_CTX ctx; ++ ++ /* retrieve the salt */ ++ if ((b64_passwd = strchr(salt, '$')) == NULL) ++ return -1; ++ ++ *b64_passwd++ = 0; ++ if (base64_decode(salt, strlen(salt), b256_salt, &salt_size)) ++ return -1; ++ ++ if (base64_decode(b64_passwd, strlen(b64_passwd), real_passwd, NULL)) ++ return -1; ++ ++ /* very simple MD5 crypt algorithm, but then the salt we use is large */ ++ MD5_Init(&ctx); ++ MD5_Update(&ctx, b256_salt, salt_size); /* process the salt */ ++ MD5_Update(&ctx, (uint8_t *)msg_passwd, strlen(msg_passwd)); ++ MD5_Final(md5_result, &ctx); ++ return memcmp(md5_result, real_passwd, MD5_SIZE);/* 0 = ok */ ++} ++ ++static int auth_check(struct connstruct *cn) ++{ ++ char line[MAXREQUESTLENGTH]; ++ FILE *fp; ++ char *cp; ++ ++ if ((fp = exist_check(cn, ".htpasswd")) == NULL) ++ return 0; /* no .htpasswd file, so let though */ ++ ++ if (cn->authorization[0] == 0) ++ goto error; ++ ++ /* cn->authorization is in form "username:password" */ ++ if ((cp = strchr(cn->authorization, ':')) == NULL) ++ goto error; ++ else ++ *cp++ = 0; /* cp becomes the password */ ++ ++ while (fgets(line, sizeof(line), fp) != NULL) ++ { ++ char *b64_file_passwd; ++ int l = strlen(line); ++ ++ /* nuke newline */ ++ if (line[l-1] == '\n') ++ line[l-1] = 0; ++ ++ /* line is form "username:salt(b64)$password(b64)" */ ++ if ((b64_file_passwd = strchr(line, ':')) == NULL) ++ continue; ++ ++ *b64_file_passwd++ = 0; ++ ++ if (strcmp(line, cn->authorization)) /* our user? */ ++ continue; ++ ++ if (check_digest(b64_file_passwd, cp) == 0) ++ { ++ fclose(fp); ++ return 0; ++ } ++ } ++ ++error: ++ fclose(fp); ++ send_authenticate(cn, cn->server_name); ++ return -1; ++} ++#endif ++ ++static int htaccess_check(struct connstruct *cn) ++{ ++ char line[MAXREQUESTLENGTH]; ++ FILE *fp; ++ int ret = 0; ++ ++ if ((fp = exist_check(cn, ".htaccess")) == NULL) ++ return 0; /* no .htaccess file, so let though */ ++ ++ while (fgets(line, sizeof(line), fp) != NULL) ++ { ++ if (strstr(line, "Deny all") || /* access to this dir denied */ ++ /* Access will be denied unless SSL is active */ ++ (!cn->is_ssl && strstr(line, "SSLRequireSSL")) || ++ /* Access will be denied if SSL is active */ ++ (cn->is_ssl && strstr(line, "SSLDenySSL"))) ++ { ++ ret = -1; ++ break; ++ } ++ } ++ ++ fclose(fp); ++ return ret; ++} ++ ++static void send_error(struct connstruct *cn, int err) ++{ ++ char buf[MAXREQUESTLENGTH]; ++ char *title; ++ char *text; ++ ++ switch (err) ++ { ++ case 403: ++ title = "Forbidden"; ++ text = "File is protected"; ++#ifdef CONFIG_HTTP_VERBOSE ++ printf("axhttpd: access to %s denied\n", cn->filereq); TTY_FLUSH(); ++#endif ++ break; ++ ++ case 404: ++ title = "Not Found"; ++ text = title; ++ break; ++ ++ case 418: ++ title = "POST data size is to large"; ++ text = title; ++ break; ++ ++ default: ++ title = "Unknown"; ++ text = "Unknown"; ++ break; ++ } ++ ++ snprintf(buf, MAXREQUESTLENGTH, "HTTP/1.1 %d %s\n" ++ "Content-Type: text/html\n" ++ "Cache-Control: no-cache,no-store\n" ++ "Connection: close\n\n" ++ "\n\n%d %s\n" ++ "

    %d %s

    \n\n", ++ err, title, err, title, err, text); ++ special_write(cn, buf, strlen(buf)); ++ removeconnection(cn); ++} ++ ++static const char *getmimetype(const char *name) ++{ ++ /* only bother with a few mime types - let the browser figure the rest out */ ++ if (strstr(name, ".htm")) ++ return "text/html"; ++ else if (strstr(name, ".css")) ++ return "text/css"; ++ else ++ return "application/octet-stream"; ++} ++ ++static int special_write(struct connstruct *cn, ++ const char *buf, size_t count) ++{ ++ if (cn->is_ssl) ++ { ++ SSL *ssl = cn->ssl; ++ return ssl ? ssl_write(ssl, (uint8_t *)buf, count) : -1; ++ } ++ else ++ return SOCKET_WRITE(cn->networkdesc, buf, count); ++} ++ ++static int special_read(struct connstruct *cn, void *buf, size_t count) ++{ ++ int res; ++ ++ if (cn->is_ssl) ++ { ++ uint8_t *read_buf; ++ if ((res = ssl_read(cn->ssl, &read_buf)) > SSL_OK) ++ { ++ memcpy(buf, read_buf, res > (int)count ? count : res); ++ } ++ } ++ else ++ res = SOCKET_READ(cn->networkdesc, buf, count); ++ ++ return res; ++} ++ +diff --git a/feeds/luci/libs/luci-lib-nixio/axTLS/httpd/tdate_parse.c b/feeds/luci/libs/luci-lib-nixio/axTLS/httpd/tdate_parse.c +new file mode 100644 +index 0000000..813bdc5 +--- /dev/null ++++ b/feeds/luci/libs/luci-lib-nixio/axTLS/httpd/tdate_parse.c +@@ -0,0 +1,119 @@ ++/* ++ * Copyright (c) 2007, Cameron Rich ++ * ++ * All rights reserved. ++ * ++ * Redistribution and use in source and binary forms, with or without ++ * modification, are permitted provided that the following conditions are met: ++ * ++ * * Redistributions of source code must retain the above copyright notice, ++ * this list of conditions and the following disclaimer. ++ * * 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. ++ * * Neither the name of the axTLS project nor the names of its contributors ++ * may be used to endorse or promote products derived from this software ++ * without specific prior written permission. ++ * ++ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ++ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT ++ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR ++ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR ++ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, ++ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, ++ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR ++ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF ++ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING ++ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS ++ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ++ */ ++ ++#include ++#include ++#include ++#include ++#include ++#include ++#include "axhttp.h" ++ ++struct day_mon_map ++{ ++ const char* s; ++ uint8_t l; ++}; ++ ++static struct day_mon_map wday_tab[] = ++{ ++ { "Sun", 0 }, { "Mon", 1 }, { "Tue", 2 }, { "Wed", 3 }, ++ { "Thu", 4 }, { "Fri", 5 }, { "Sat", 6 }, ++}; ++ ++static struct day_mon_map mon_tab[] = ++{ ++ { "Jan", 0 }, { "Feb", 1 }, { "Mar", 2 }, { "Apr", 3 }, ++ { "May", 4 }, { "Jun", 5 }, { "Jul", 6 }, { "Aug", 7 }, ++ { "Sep", 8 }, { "Oct", 9 }, { "Nov", 10 }, { "Dec", 11 }, ++}; ++ ++static int day_mon_map_compare(const char *v1, const char *v2) ++{ ++ return strcmp(((struct day_mon_map*)v1)->s, ((struct day_mon_map*)v2)->s); ++} ++ ++void tdate_init(void) ++{ ++ qsort(wday_tab, sizeof(wday_tab)/sizeof(struct day_mon_map), ++ sizeof(struct day_mon_map), ++ (int (*)(const void *, const void *))day_mon_map_compare); ++ qsort(mon_tab, sizeof(mon_tab)/sizeof(struct day_mon_map), ++ sizeof(struct day_mon_map), ++ (int (*)(const void *, const void *))day_mon_map_compare); ++} ++ ++static int8_t day_mon_map_search(const char* str, ++ const struct day_mon_map* tab, int n) ++{ ++ struct day_mon_map *search = bsearch(&str, tab, n, ++ sizeof(struct day_mon_map), ++ (int (*)(const void *, const void *))day_mon_map_compare); ++ return search ? search->l : -1; ++} ++ ++time_t tdate_parse(const char* str) ++{ ++ struct tm tm; ++ char str_mon[4], str_wday[4]; ++ int tm_sec, tm_min, tm_hour, tm_mday, tm_year; ++ ++ /* Initialize. */ ++ memset(&tm, 0, sizeof(struct tm)); ++ ++ /* wdy, DD mth YY HH:MM:SS GMT */ ++ if ((sscanf(str, "%3[a-zA-Z], %d %3[a-zA-Z] %d %d:%d:%d GMT", ++ str_wday, &tm_mday, str_mon, &tm_year, &tm_hour, &tm_min, ++ &tm_sec) == 7) || ++ /* wdy mth DD HH:MM:SS YY */ ++ (sscanf(str, "%3[a-zA-Z] %3[a-zA-Z] %d %d:%d:%d %d", ++ str_wday, str_mon, &tm_mday, &tm_hour, &tm_min, &tm_sec, ++ &tm_year) == 7)) ++ { ++ int8_t tm_wday = day_mon_map_search(str_wday, wday_tab, ++ sizeof(wday_tab)/sizeof(struct day_mon_map)); ++ int8_t tm_mon = day_mon_map_search(str_mon, mon_tab, ++ sizeof(mon_tab)/sizeof(struct day_mon_map)); ++ ++ if (tm_wday < 0 || tm_mon < 0) ++ return -1; ++ ++ tm.tm_wday = tm_wday; ++ tm.tm_mon = tm_mon; ++ tm.tm_mday = tm_mday; ++ tm.tm_hour = tm_hour; ++ tm.tm_min = tm_min; ++ tm.tm_sec = tm_sec; ++ tm.tm_year = tm_year - 1900; ++ return mktime(&tm); ++ } ++ ++ return -1; /* error */ ++} +diff --git a/feeds/luci/libs/luci-lib-nixio/axTLS/samples/Config.in b/feeds/luci/libs/luci-lib-nixio/axTLS/samples/Config.in +new file mode 100644 +index 0000000..ecad25e +--- /dev/null ++++ b/feeds/luci/libs/luci-lib-nixio/axTLS/samples/Config.in +@@ -0,0 +1,63 @@ ++# ++# For a description of the syntax of this configuration file, ++# see scripts/config/Kconfig-language.txt ++# ++menu "Samples" ++ ++config CONFIG_SAMPLES ++ bool "Create Samples" ++ default y ++ help ++ axTLS contains various sample code. ++ ++ Select Y here if you want to build the various samples. ++ ++config CONFIG_C_SAMPLES ++ bool "axssl - C version" ++ default y ++ depends on CONFIG_SAMPLES ++ help ++ Build the "C" version of axssl. The features enabled are very ++ dependent on the build mode ('full' mode will give all features). ++ ++config CONFIG_CSHARP_SAMPLES ++ bool "axssl - C# version" ++ default y ++ depends on CONFIG_SAMPLES && CONFIG_CSHARP_BINDINGS ++ help ++ Build the "C#" version of axssl. The features enabled are very ++ dependent on the build mode ('full' mode will give all features). ++ ++config CONFIG_VBNET_SAMPLES ++ bool "axssl - VB.NET version" ++ default y ++ depends on CONFIG_SAMPLES && CONFIG_VBNET_BINDINGS ++ help ++ Build the "VB.NET" version of axssl. The features enabled are very ++ dependent on the build mode ('full' mode will give all features). ++ ++config CONFIG_JAVA_SAMPLES ++ bool "axssl - Java version" ++ default y ++ depends on CONFIG_SAMPLES && CONFIG_JAVA_BINDINGS ++ help ++ Build the "Java" version of axssl. The features enabled are very ++ dependent on the build mode ('full' mode will give all features). ++ ++config CONFIG_PERL_SAMPLES ++ bool "axssl - Perl version" ++ default y ++ depends on CONFIG_SAMPLES && CONFIG_PERL_BINDINGS ++ help ++ Build the "Perl" version of axssl. The features enabled are very ++ dependent on the build mode ('full' mode will give all features). ++ ++config CONFIG_LUA_SAMPLES ++ bool "axssl - Lua version" ++ default y ++ depends on CONFIG_SAMPLES && CONFIG_LUA_BINDINGS ++ help ++ Build the "Lua" version of axssl. The features enabled are very ++ dependent on the build mode ('full' mode will give all features). ++endmenu ++ +diff --git a/feeds/luci/libs/luci-lib-nixio/axTLS/samples/Makefile b/feeds/luci/libs/luci-lib-nixio/axTLS/samples/Makefile +new file mode 100644 +index 0000000..afbdd43 +--- /dev/null ++++ b/feeds/luci/libs/luci-lib-nixio/axTLS/samples/Makefile +@@ -0,0 +1,62 @@ ++# ++# Copyright (c) 2007, Cameron Rich ++# ++# All rights reserved. ++# ++# Redistribution and use in source and binary forms, with or without ++# modification, are permitted provided that the following conditions are met: ++# ++# * Redistributions of source code must retain the above copyright notice, ++# this list of conditions and the following disclaimer. ++# * 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. ++# * Neither the name of the axTLS project nor the names of its ++# contributors may be used to endorse or promote products derived ++# from this software without specific prior written permission. ++# ++# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ++# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT ++# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR ++# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR ++# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, ++# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED ++# TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, ++# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY ++# OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING ++# NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF ++# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ++# ++ ++all: ++ ++include ../config/.config ++include ../config/makefile.conf ++ ++all: ++ifdef CONFIG_C_SAMPLES ++ $(MAKE) -C c ++endif ++ifdef CONFIG_CSHARP_SAMPLES ++ $(MAKE) -C csharp ++endif ++ifdef CONFIG_VBNET_SAMPLES ++ $(MAKE) -C vbnet ++endif ++ifdef CONFIG_JAVA_SAMPLES ++ $(MAKE) -C java ++endif ++ifdef CONFIG_PERL_SAMPLES ++ $(MAKE) -C perl ++endif ++ifdef CONFIG_LUA_SAMPLES ++ $(MAKE) -C lua ++endif ++ ++clean:: ++ $(MAKE) -C c clean ++ $(MAKE) -C csharp clean ++ $(MAKE) -C vbnet clean ++ $(MAKE) -C java clean ++ $(MAKE) -C perl clean ++ $(MAKE) -C lua clean +diff --git a/feeds/luci/libs/luci-lib-nixio/axTLS/samples/c/Makefile b/feeds/luci/libs/luci-lib-nixio/axTLS/samples/c/Makefile +new file mode 100644 +index 0000000..17cf9e7 +--- /dev/null ++++ b/feeds/luci/libs/luci-lib-nixio/axTLS/samples/c/Makefile +@@ -0,0 +1,76 @@ ++# ++# Copyright (c) 2007, Cameron Rich ++# ++# All rights reserved. ++# ++# Redistribution and use in source and binary forms, with or without ++# modification, are permitted provided that the following conditions are met: ++# ++# * Redistributions of source code must retain the above copyright notice, ++# this list of conditions and the following disclaimer. ++# * 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. ++# * Neither the name of the axTLS project nor the names of its ++# contributors may be used to endorse or promote products derived ++# from this software without specific prior written permission. ++# ++# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ++# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT ++# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR ++# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR ++# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, ++# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED ++# TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, ++# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY ++# OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING ++# NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF ++# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ++# ++ ++all : sample ++ ++AXTLS_HOME=../.. ++ ++include $(AXTLS_HOME)/config/.config ++include $(AXTLS_HOME)/config/makefile.conf ++ ++ifndef CONFIG_PLATFORM_WIN32 ++ ++ifdef CONFIG_PLATFORM_CYGWIN ++TARGET=$(AXTLS_HOME)/$(STAGE)/axssl.exe ++else ++TARGET=$(AXTLS_HOME)/$(STAGE)/axssl ++endif # cygwin ++ ++LIBS=$(AXTLS_HOME)/$(STAGE) ++else ++TARGET=$(AXTLS_HOME)/$(STAGE)/axssl.exe ++endif ++ ++ifndef CONFIG_C_SAMPLES ++sample: ++ ++else ++sample : $(TARGET) ++OBJ= axssl.o ++include $(AXTLS_HOME)/config/makefile.post ++ ++ifndef CONFIG_PLATFORM_WIN32 ++ ++$(TARGET): $(OBJ) $(LIBS)/libaxtls.a ++ $(LD) $(LDFLAGS) -o $@ $(OBJ) -L$(LIBS) -laxtls ++ifdef CONFIG_STRIP_UNWANTED_SECTIONS ++ $(STRIP) --remove-section=.comment $(TARGET) ++endif # use strip ++else # Win32 ++ ++$(TARGET): $(OBJ) ++ $(LD) $(LDFLAGS) $(AXTLS_HOME)/config/axtls.res /out:$@ $^ /libpath:"$(AXTLS_HOME)/$(STAGE)" axtls.lib ++endif ++ ++endif # CONFIG_C_SAMPLES ++ ++clean:: ++ -@rm -f $(AXTLS_HOME)/$(STAGE)/axssl* ++ +diff --git a/feeds/luci/libs/luci-lib-nixio/axTLS/samples/c/axssl.c b/feeds/luci/libs/luci-lib-nixio/axTLS/samples/c/axssl.c +new file mode 100644 +index 0000000..6892ee4 +--- /dev/null ++++ b/feeds/luci/libs/luci-lib-nixio/axTLS/samples/c/axssl.c +@@ -0,0 +1,883 @@ ++/* ++ * Copyright (c) 2007, Cameron Rich ++ * ++ * All rights reserved. ++ * ++ * Redistribution and use in source and binary forms, with or without ++ * modification, are permitted provided that the following conditions are met: ++ * ++ * * Redistributions of source code must retain the above copyright notice, ++ * this list of conditions and the following disclaimer. ++ * * 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. ++ * * Neither the name of the axTLS project nor the names of its contributors ++ * may be used to endorse or promote products derived from this software ++ * without specific prior written permission. ++ * ++ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ++ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT ++ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR ++ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR ++ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, ++ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, ++ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR ++ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF ++ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING ++ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS ++ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ++ */ ++ ++/** ++ * Demonstrate the use of the axTLS library in C with a set of ++ * command-line parameters similar to openssl. In fact, openssl clients ++ * should be able to communicate with axTLS servers and visa-versa. ++ * ++ * This code has various bits enabled depending on the configuration. To enable ++ * the most interesting version, compile with the 'full mode' enabled. ++ * ++ * To see what options you have, run the following: ++ * > axssl s_server -? ++ * > axssl s_client -? ++ * ++ * The axtls shared library must be in the same directory or be found ++ * by the OS. ++ */ ++#include ++#include ++#include ++#include "ssl.h" ++ ++/* define standard input */ ++#ifndef STDIN_FILENO ++#define STDIN_FILENO 0 ++#endif ++ ++static void do_server(int argc, char *argv[]); ++static void print_options(char *option); ++static void print_server_options(char *option); ++static void do_client(int argc, char *argv[]); ++static void print_client_options(char *option); ++static void display_cipher(SSL *ssl); ++static void display_session_id(SSL *ssl); ++ ++/** ++ * Main entry point. Doesn't do much except works out whether we are a client ++ * or a server. ++ */ ++int main(int argc, char *argv[]) ++{ ++#ifdef WIN32 ++ WSADATA wsaData; ++ WORD wVersionRequested = MAKEWORD(2, 2); ++ WSAStartup(wVersionRequested, &wsaData); ++#elif !defined(CONFIG_PLATFORM_SOLARIS) ++ signal(SIGPIPE, SIG_IGN); /* ignore pipe errors */ ++#endif ++ ++ if (argc == 2 && strcmp(argv[1], "version") == 0) ++ { ++ printf("axssl %s %s\n", ssl_version(), __DATE__); ++ exit(0); ++ } ++ ++ if (argc < 2 || ( ++ strcmp(argv[1], "s_server") && strcmp(argv[1], "s_client"))) ++ print_options(argc > 1 ? argv[1] : ""); ++ ++ strcmp(argv[1], "s_server") ? ++ do_client(argc, argv) : do_server(argc, argv); ++ return 0; ++} ++ ++/** ++ * Implement the SSL server logic. ++ */ ++static void do_server(int argc, char *argv[]) ++{ ++ int i = 2; ++ uint16_t port = 4433; ++ uint32_t options = SSL_DISPLAY_CERTS; ++ int client_fd; ++ SSL_CTX *ssl_ctx; ++ int server_fd, res = 0; ++ socklen_t client_len; ++#ifndef CONFIG_SSL_SKELETON_MODE ++ char *private_key_file = NULL; ++ const char *password = NULL; ++ char **cert; ++ int cert_index = 0; ++ int cert_size = ssl_get_config(SSL_MAX_CERT_CFG_OFFSET); ++#endif ++#ifdef WIN32 ++ char yes = 1; ++#else ++ int yes = 1; ++#endif ++ struct sockaddr_in serv_addr; ++ struct sockaddr_in client_addr; ++ int quiet = 0; ++#ifdef CONFIG_SSL_CERT_VERIFICATION ++ int ca_cert_index = 0; ++ int ca_cert_size = ssl_get_config(SSL_MAX_CA_CERT_CFG_OFFSET); ++ char **ca_cert = (char **)calloc(1, sizeof(char *)*ca_cert_size); ++#endif ++ fd_set read_set; ++ ++#ifndef CONFIG_SSL_SKELETON_MODE ++ cert = (char **)calloc(1, sizeof(char *)*cert_size); ++#endif ++ ++ while (i < argc) ++ { ++ if (strcmp(argv[i], "-accept") == 0) ++ { ++ if (i >= argc-1) ++ { ++ print_server_options(argv[i]); ++ } ++ ++ port = atoi(argv[++i]); ++ } ++#ifndef CONFIG_SSL_SKELETON_MODE ++ else if (strcmp(argv[i], "-cert") == 0) ++ { ++ if (i >= argc-1 || cert_index >= cert_size) ++ { ++ print_server_options(argv[i]); ++ } ++ ++ cert[cert_index++] = argv[++i]; ++ } ++ else if (strcmp(argv[i], "-key") == 0) ++ { ++ if (i >= argc-1) ++ { ++ print_server_options(argv[i]); ++ } ++ ++ private_key_file = argv[++i]; ++ options |= SSL_NO_DEFAULT_KEY; ++ } ++ else if (strcmp(argv[i], "-pass") == 0) ++ { ++ if (i >= argc-1) ++ { ++ print_server_options(argv[i]); ++ } ++ ++ password = argv[++i]; ++ } ++#endif ++ else if (strcmp(argv[i], "-quiet") == 0) ++ { ++ quiet = 1; ++ options &= ~SSL_DISPLAY_CERTS; ++ } ++#ifdef CONFIG_SSL_CERT_VERIFICATION ++ else if (strcmp(argv[i], "-verify") == 0) ++ { ++ options |= SSL_CLIENT_AUTHENTICATION; ++ } ++ else if (strcmp(argv[i], "-CAfile") == 0) ++ { ++ if (i >= argc-1 || ca_cert_index >= ca_cert_size) ++ { ++ print_server_options(argv[i]); ++ } ++ ++ ca_cert[ca_cert_index++] = argv[++i]; ++ } ++#endif ++#ifdef CONFIG_SSL_FULL_MODE ++ else if (strcmp(argv[i], "-debug") == 0) ++ { ++ options |= SSL_DISPLAY_BYTES; ++ } ++ else if (strcmp(argv[i], "-state") == 0) ++ { ++ options |= SSL_DISPLAY_STATES; ++ } ++ else if (strcmp(argv[i], "-show-rsa") == 0) ++ { ++ options |= SSL_DISPLAY_RSA; ++ } ++#endif ++ else /* don't know what this is */ ++ { ++ print_server_options(argv[i]); ++ } ++ ++ i++; ++ } ++ ++ if ((ssl_ctx = ssl_ctx_new(options, SSL_DEFAULT_SVR_SESS)) == NULL) ++ { ++ fprintf(stderr, "Error: Server context is invalid\n"); ++ exit(1); ++ } ++ ++#ifndef CONFIG_SSL_SKELETON_MODE ++ if (private_key_file) ++ { ++ int obj_type = SSL_OBJ_RSA_KEY; ++ ++ /* auto-detect the key type from the file extension */ ++ if (strstr(private_key_file, ".p8")) ++ obj_type = SSL_OBJ_PKCS8; ++ else if (strstr(private_key_file, ".p12")) ++ obj_type = SSL_OBJ_PKCS12; ++ ++ if (ssl_obj_load(ssl_ctx, obj_type, private_key_file, password)) ++ { ++ fprintf(stderr, "Error: Private key '%s' is undefined.\n", ++ private_key_file); ++ exit(1); ++ } ++ } ++ ++ for (i = 0; i < cert_index; i++) ++ { ++ if (ssl_obj_load(ssl_ctx, SSL_OBJ_X509_CERT, cert[i], NULL)) ++ { ++ printf("Certificate '%s' is undefined.\n", cert[i]); ++ exit(1); ++ } ++ } ++#endif ++ ++#ifdef CONFIG_SSL_CERT_VERIFICATION ++ for (i = 0; i < ca_cert_index; i++) ++ { ++ if (ssl_obj_load(ssl_ctx, SSL_OBJ_X509_CACERT, ca_cert[i], NULL)) ++ { ++ printf("Certificate '%s' is undefined.\n", ca_cert[i]); ++ exit(1); ++ } ++ } ++ ++ free(ca_cert); ++#endif ++#ifndef CONFIG_SSL_SKELETON_MODE ++ free(cert); ++#endif ++ ++ /* Create socket for incoming connections */ ++ if ((server_fd = socket(AF_INET, SOCK_STREAM, 0)) < 0) ++ { ++ perror("socket"); ++ return; ++ } ++ ++ setsockopt(server_fd, SOL_SOCKET, SO_REUSEADDR, &yes, sizeof(yes)); ++ ++ /* Construct local address structure */ ++ memset(&serv_addr, 0, sizeof(serv_addr)); /* Zero out structure */ ++ serv_addr.sin_family = AF_INET; /* Internet address family */ ++ serv_addr.sin_addr.s_addr = htonl(INADDR_ANY); /* Any incoming interface */ ++ serv_addr.sin_port = htons(port); /* Local port */ ++ ++ /* Bind to the local address */ ++ if (bind(server_fd, (struct sockaddr *) &serv_addr, sizeof(serv_addr)) < 0) ++ { ++ perror("bind"); ++ exit(1); ++ } ++ ++ if (listen(server_fd, 5) < 0) ++ { ++ perror("listen"); ++ exit(1); ++ } ++ ++ client_len = sizeof(client_addr); ++ ++ /************************************************************************* ++ * This is where the interesting stuff happens. Up until now we've ++ * just been setting up sockets etc. Now we do the SSL handshake. ++ *************************************************************************/ ++ for (;;) ++ { ++ SSL *ssl; ++ int reconnected = 0; ++ ++ if (!quiet) ++ { ++ printf("ACCEPT\n"); ++ TTY_FLUSH(); ++ } ++ ++ if ((client_fd = accept(server_fd, ++ (struct sockaddr *)&client_addr, &client_len)) < 0) ++ { ++ res = 1; ++ break; ++ } ++ ++ ssl = ssl_server_new(ssl_ctx, client_fd); ++ ++ /* now read (and display) whatever the client sends us */ ++ for (;;) ++ { ++ /* allow parallel reading of client and standard input */ ++ FD_ZERO(&read_set); ++ FD_SET(client_fd, &read_set); ++ ++#ifndef WIN32 ++ /* win32 doesn't like mixing up stdin and sockets */ ++ if (isatty(STDIN_FILENO))/* but only if we are in an active shell */ ++ { ++ FD_SET(STDIN_FILENO, &read_set); ++ } ++ ++ if ((res = select(client_fd+1, &read_set, NULL, NULL, NULL)) > 0) ++ { ++ uint8_t buf[1024]; ++ ++ /* read standard input? */ ++ if (FD_ISSET(STDIN_FILENO, &read_set)) ++ { ++ if (fgets((char *)buf, sizeof(buf), stdin) == NULL) ++ { ++ res = SSL_ERROR_CONN_LOST; ++ } ++ else ++ { ++ /* small hack to check renegotiation */ ++ if (buf[0] == 'r' && (buf[1] == '\n' || buf[1] == '\r')) ++ { ++ res = ssl_renegotiate(ssl); ++ } ++ else /* write our ramblings to the client */ ++ { ++ res = ssl_write(ssl, buf, strlen((char *)buf)+1); ++ } ++ } ++ } ++ else /* a socket read */ ++#endif ++ { ++ /* keep reading until we get something interesting */ ++ uint8_t *read_buf; ++ ++ if ((res = ssl_read(ssl, &read_buf)) == SSL_OK) ++ { ++ /* are we in the middle of doing a handshake? */ ++ if (ssl_handshake_status(ssl) != SSL_OK) ++ { ++ reconnected = 0; ++ } ++ else if (!reconnected) ++ { ++ /* we are connected/reconnected */ ++ if (!quiet) ++ { ++ display_session_id(ssl); ++ display_cipher(ssl); ++ } ++ ++ reconnected = 1; ++ } ++ } ++ ++ if (res > SSL_OK) /* display our interesting output */ ++ { ++ printf("%s", read_buf); ++ TTY_FLUSH(); ++ } ++ else if (res < SSL_OK && !quiet) ++ { ++ ssl_display_error(res); ++ } ++ } ++#ifndef WIN32 ++ } ++#endif ++ ++ if (res < SSL_OK) ++ { ++ if (!quiet) ++ { ++ printf("CONNECTION CLOSED\n"); ++ TTY_FLUSH(); ++ } ++ ++ break; ++ } ++ } ++ ++ /* client was disconnected or the handshake failed. */ ++ ssl_free(ssl); ++ SOCKET_CLOSE(client_fd); ++ } ++ ++ ssl_ctx_free(ssl_ctx); ++} ++ ++/** ++ * Implement the SSL client logic. ++ */ ++static void do_client(int argc, char *argv[]) ++{ ++#ifdef CONFIG_SSL_ENABLE_CLIENT ++ int res, i = 2; ++ uint16_t port = 4433; ++ uint32_t options = SSL_SERVER_VERIFY_LATER|SSL_DISPLAY_CERTS; ++ int client_fd; ++ char *private_key_file = NULL; ++ struct sockaddr_in client_addr; ++ struct hostent *hostent; ++ int reconnect = 0; ++ uint32_t sin_addr; ++ SSL_CTX *ssl_ctx; ++ SSL *ssl = NULL; ++ int quiet = 0; ++ int cert_index = 0, ca_cert_index = 0; ++ int cert_size, ca_cert_size; ++ char **ca_cert, **cert; ++ uint8_t session_id[SSL_SESSION_ID_SIZE]; ++ fd_set read_set; ++ const char *password = NULL; ++ ++ FD_ZERO(&read_set); ++ sin_addr = inet_addr("127.0.0.1"); ++ cert_size = ssl_get_config(SSL_MAX_CERT_CFG_OFFSET); ++ ca_cert_size = ssl_get_config(SSL_MAX_CA_CERT_CFG_OFFSET); ++ ca_cert = (char **)calloc(1, sizeof(char *)*ca_cert_size); ++ cert = (char **)calloc(1, sizeof(char *)*cert_size); ++ ++ while (i < argc) ++ { ++ if (strcmp(argv[i], "-connect") == 0) ++ { ++ char *host, *ptr; ++ ++ if (i >= argc-1) ++ { ++ print_client_options(argv[i]); ++ } ++ ++ host = argv[++i]; ++ if ((ptr = strchr(host, ':')) == NULL) ++ { ++ print_client_options(argv[i]); ++ } ++ ++ *ptr++ = 0; ++ port = atoi(ptr); ++ hostent = gethostbyname(host); ++ ++ if (hostent == NULL) ++ { ++ print_client_options(argv[i]); ++ } ++ ++ sin_addr = *((uint32_t **)hostent->h_addr_list)[0]; ++ } ++ else if (strcmp(argv[i], "-cert") == 0) ++ { ++ if (i >= argc-1 || cert_index >= cert_size) ++ { ++ print_client_options(argv[i]); ++ } ++ ++ cert[cert_index++] = argv[++i]; ++ } ++ else if (strcmp(argv[i], "-key") == 0) ++ { ++ if (i >= argc-1) ++ { ++ print_client_options(argv[i]); ++ } ++ ++ private_key_file = argv[++i]; ++ options |= SSL_NO_DEFAULT_KEY; ++ } ++ else if (strcmp(argv[i], "-CAfile") == 0) ++ { ++ if (i >= argc-1 || ca_cert_index >= ca_cert_size) ++ { ++ print_client_options(argv[i]); ++ } ++ ++ ca_cert[ca_cert_index++] = argv[++i]; ++ } ++ else if (strcmp(argv[i], "-verify") == 0) ++ { ++ options &= ~SSL_SERVER_VERIFY_LATER; ++ } ++ else if (strcmp(argv[i], "-reconnect") == 0) ++ { ++ reconnect = 4; ++ } ++ else if (strcmp(argv[i], "-quiet") == 0) ++ { ++ quiet = 1; ++ options &= ~SSL_DISPLAY_CERTS; ++ } ++ else if (strcmp(argv[i], "-pass") == 0) ++ { ++ if (i >= argc-1) ++ { ++ print_client_options(argv[i]); ++ } ++ ++ password = argv[++i]; ++ } ++#ifdef CONFIG_SSL_FULL_MODE ++ else if (strcmp(argv[i], "-debug") == 0) ++ { ++ options |= SSL_DISPLAY_BYTES; ++ } ++ else if (strcmp(argv[i], "-state") == 0) ++ { ++ options |= SSL_DISPLAY_STATES; ++ } ++ else if (strcmp(argv[i], "-show-rsa") == 0) ++ { ++ options |= SSL_DISPLAY_RSA; ++ } ++#endif ++ else /* don't know what this is */ ++ { ++ print_client_options(argv[i]); ++ } ++ ++ i++; ++ } ++ ++ if ((ssl_ctx = ssl_ctx_new(options, SSL_DEFAULT_CLNT_SESS)) == NULL) ++ { ++ fprintf(stderr, "Error: Client context is invalid\n"); ++ exit(1); ++ } ++ ++ if (private_key_file) ++ { ++ int obj_type = SSL_OBJ_RSA_KEY; ++ ++ /* auto-detect the key type from the file extension */ ++ if (strstr(private_key_file, ".p8")) ++ obj_type = SSL_OBJ_PKCS8; ++ else if (strstr(private_key_file, ".p12")) ++ obj_type = SSL_OBJ_PKCS12; ++ ++ if (ssl_obj_load(ssl_ctx, obj_type, private_key_file, password)) ++ { ++ fprintf(stderr, "Error: Private key '%s' is undefined.\n", ++ private_key_file); ++ exit(1); ++ } ++ } ++ ++ for (i = 0; i < cert_index; i++) ++ { ++ if (ssl_obj_load(ssl_ctx, SSL_OBJ_X509_CERT, cert[i], NULL)) ++ { ++ printf("Certificate '%s' is undefined.\n", cert[i]); ++ exit(1); ++ } ++ } ++ ++ for (i = 0; i < ca_cert_index; i++) ++ { ++ if (ssl_obj_load(ssl_ctx, SSL_OBJ_X509_CACERT, ca_cert[i], NULL)) ++ { ++ printf("Certificate '%s' is undefined.\n", ca_cert[i]); ++ exit(1); ++ } ++ } ++ ++ free(cert); ++ free(ca_cert); ++ ++ /************************************************************************* ++ * This is where the interesting stuff happens. Up until now we've ++ * just been setting up sockets etc. Now we do the SSL handshake. ++ *************************************************************************/ ++ client_fd = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); ++ memset(&client_addr, 0, sizeof(client_addr)); ++ client_addr.sin_family = AF_INET; ++ client_addr.sin_port = htons(port); ++ client_addr.sin_addr.s_addr = sin_addr; ++ ++ if (connect(client_fd, (struct sockaddr *)&client_addr, ++ sizeof(client_addr)) < 0) ++ { ++ perror("connect"); ++ exit(1); ++ } ++ ++ if (!quiet) ++ { ++ printf("CONNECTED\n"); ++ TTY_FLUSH(); ++ } ++ ++ /* Try session resumption? */ ++ if (reconnect) ++ { ++ while (reconnect--) ++ { ++ ssl = ssl_client_new(ssl_ctx, client_fd, session_id, ++ sizeof(session_id)); ++ if ((res = ssl_handshake_status(ssl)) != SSL_OK) ++ { ++ if (!quiet) ++ { ++ ssl_display_error(res); ++ } ++ ++ ssl_free(ssl); ++ exit(1); ++ } ++ ++ display_session_id(ssl); ++ memcpy(session_id, ssl_get_session_id(ssl), SSL_SESSION_ID_SIZE); ++ ++ if (reconnect) ++ { ++ ssl_free(ssl); ++ SOCKET_CLOSE(client_fd); ++ ++ client_fd = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); ++ connect(client_fd, (struct sockaddr *)&client_addr, ++ sizeof(client_addr)); ++ } ++ } ++ } ++ else ++ { ++ ssl = ssl_client_new(ssl_ctx, client_fd, NULL, 0); ++ } ++ ++ /* check the return status */ ++ if ((res = ssl_handshake_status(ssl)) != SSL_OK) ++ { ++ if (!quiet) ++ { ++ ssl_display_error(res); ++ } ++ ++ exit(1); ++ } ++ ++ if (!quiet) ++ { ++ const char *common_name = ssl_get_cert_dn(ssl, ++ SSL_X509_CERT_COMMON_NAME); ++ if (common_name) ++ { ++ printf("Common Name:\t\t\t%s\n", common_name); ++ } ++ ++ display_session_id(ssl); ++ display_cipher(ssl); ++ } ++ ++ for (;;) ++ { ++ uint8_t buf[1024]; ++ res = SSL_OK; ++ ++ /* allow parallel reading of server and standard input */ ++ FD_SET(client_fd, &read_set); ++#ifndef WIN32 ++ /* win32 doesn't like mixing up stdin and sockets */ ++ FD_SET(STDIN_FILENO, &read_set); ++ ++ if ((res = select(client_fd+1, &read_set, NULL, NULL, NULL)) > 0) ++ { ++ /* read standard input? */ ++ if (FD_ISSET(STDIN_FILENO, &read_set)) ++#endif ++ { ++ if (fgets((char *)buf, sizeof(buf), stdin) == NULL) ++ { ++ /* bomb out of here */ ++ ssl_free(ssl); ++ break; ++ } ++ else ++ { ++ /* small hack to check renegotiation */ ++ if (buf[0] == 'R' && (buf[1] == '\n' || buf[1] == '\r')) ++ { ++ res = ssl_renegotiate(ssl); ++ } ++ else ++ { ++ res = ssl_write(ssl, buf, strlen((char *)buf)+1); ++ } ++ } ++ } ++#ifndef WIN32 ++ else /* a socket read */ ++ { ++ uint8_t *read_buf; ++ ++ res = ssl_read(ssl, &read_buf); ++ ++ if (res > 0) /* display our interesting output */ ++ { ++ printf("%s", read_buf); ++ TTY_FLUSH(); ++ } ++ } ++ } ++#endif ++ ++ if (res < 0) ++ { ++ if (!quiet) ++ { ++ ssl_display_error(res); ++ } ++ ++ break; /* get outta here */ ++ } ++ } ++ ++ ssl_ctx_free(ssl_ctx); ++ SOCKET_CLOSE(client_fd); ++#else ++ print_client_options(argv[1]); ++#endif ++} ++ ++/** ++ * We've had some sort of command-line error. Print out the basic options. ++ */ ++static void print_options(char *option) ++{ ++ printf("axssl: Error: '%s' is an invalid command.\n", option); ++ printf("usage: axssl [s_server|s_client|version] [args ...]\n"); ++ exit(1); ++} ++ ++/** ++ * We've had some sort of command-line error. Print out the server options. ++ */ ++static void print_server_options(char *option) ++{ ++#ifndef CONFIG_SSL_SKELETON_MODE ++ int cert_size = ssl_get_config(SSL_MAX_CERT_CFG_OFFSET); ++#endif ++#ifdef CONFIG_SSL_CERT_VERIFICATION ++ int ca_cert_size = ssl_get_config(SSL_MAX_CA_CERT_CFG_OFFSET); ++#endif ++ ++ printf("unknown option %s\n", option); ++ printf("usage: s_server [args ...]\n"); ++ printf(" -accept arg\t- port to accept on (default is 4433)\n"); ++#ifndef CONFIG_SSL_SKELETON_MODE ++ printf(" -cert arg\t- certificate file to add (in addition to default)" ++ " to chain -\n" ++ "\t\t Can repeat up to %d times\n", cert_size); ++ printf(" -key arg\t- Private key file to use\n"); ++ printf(" -pass\t\t- private key file pass phrase source\n"); ++#endif ++ printf(" -quiet\t\t- No server output\n"); ++#ifdef CONFIG_SSL_CERT_VERIFICATION ++ printf(" -verify\t- turn on peer certificate verification\n"); ++ printf(" -CAfile arg\t- Certificate authority\n"); ++ printf("\t\t Can repeat up to %d times\n", ca_cert_size); ++#endif ++#ifdef CONFIG_SSL_FULL_MODE ++ printf(" -debug\t\t- Print more output\n"); ++ printf(" -state\t\t- Show state messages\n"); ++ printf(" -show-rsa\t- Show RSA state\n"); ++#endif ++ exit(1); ++} ++ ++/** ++ * We've had some sort of command-line error. Print out the client options. ++ */ ++static void print_client_options(char *option) ++{ ++#ifdef CONFIG_SSL_ENABLE_CLIENT ++ int cert_size = ssl_get_config(SSL_MAX_CERT_CFG_OFFSET); ++ int ca_cert_size = ssl_get_config(SSL_MAX_CA_CERT_CFG_OFFSET); ++#endif ++ ++ printf("unknown option %s\n", option); ++#ifdef CONFIG_SSL_ENABLE_CLIENT ++ printf("usage: s_client [args ...]\n"); ++ printf(" -connect host:port - who to connect to (default " ++ "is localhost:4433)\n"); ++ printf(" -verify\t- turn on peer certificate verification\n"); ++ printf(" -cert arg\t- certificate file to use\n"); ++ printf("\t\t Can repeat up to %d times\n", cert_size); ++ printf(" -key arg\t- Private key file to use\n"); ++ printf(" -CAfile arg\t- Certificate authority\n"); ++ printf("\t\t Can repeat up to %d times\n", ca_cert_size); ++ printf(" -quiet\t\t- No client output\n"); ++ printf(" -reconnect\t- Drop and re-make the connection " ++ "with the same Session-ID\n"); ++ printf(" -pass\t\t- private key file pass phrase source\n"); ++#ifdef CONFIG_SSL_FULL_MODE ++ printf(" -debug\t\t- Print more output\n"); ++ printf(" -state\t\t- Show state messages\n"); ++ printf(" -show-rsa\t- Show RSA state\n"); ++#endif ++#else ++ printf("Change configuration to allow this feature\n"); ++#endif ++ exit(1); ++} ++ ++/** ++ * Display what cipher we are using ++ */ ++static void display_cipher(SSL *ssl) ++{ ++ printf("CIPHER is "); ++ switch (ssl_get_cipher_id(ssl)) ++ { ++ case SSL_AES128_SHA: ++ printf("AES128-SHA"); ++ break; ++ ++ case SSL_AES256_SHA: ++ printf("AES256-SHA"); ++ break; ++ ++ case SSL_RC4_128_SHA: ++ printf("RC4-SHA"); ++ break; ++ ++ case SSL_RC4_128_MD5: ++ printf("RC4-MD5"); ++ break; ++ ++ default: ++ printf("Unknown - %d", ssl_get_cipher_id(ssl)); ++ break; ++ } ++ ++ printf("\n"); ++ TTY_FLUSH(); ++} ++ ++/** ++ * Display what session id we have. ++ */ ++static void display_session_id(SSL *ssl) ++{ ++ int i; ++ const uint8_t *session_id = ssl_get_session_id(ssl); ++ int sess_id_size = ssl_get_session_id_size(ssl); ++ ++ if (sess_id_size > 0) ++ { ++ printf("-----BEGIN SSL SESSION PARAMETERS-----\n"); ++ for (i = 0; i < sess_id_size; i++) ++ { ++ printf("%02x", session_id[i]); ++ } ++ ++ printf("\n-----END SSL SESSION PARAMETERS-----\n"); ++ TTY_FLUSH(); ++ } ++} +diff --git a/feeds/luci/libs/luci-lib-nixio/axTLS/samples/csharp/Makefile b/feeds/luci/libs/luci-lib-nixio/axTLS/samples/csharp/Makefile +new file mode 100644 +index 0000000..46c2421 +--- /dev/null ++++ b/feeds/luci/libs/luci-lib-nixio/axTLS/samples/csharp/Makefile +@@ -0,0 +1,48 @@ ++# ++# Copyright (c) 2007, Cameron Rich ++# ++# All rights reserved. ++# ++# Redistribution and use in source and binary forms, with or without ++# modification, are permitted provided that the following conditions are met: ++# ++# * Redistributions of source code must retain the above copyright notice, ++# this list of conditions and the following disclaimer. ++# * 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. ++# * Neither the name of the axTLS project nor the names of its ++# contributors may be used to endorse or promote products derived ++# from this software without specific prior written permission. ++# ++# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ++# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT ++# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR ++# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR ++# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, ++# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED ++# TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, ++# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY ++# OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING ++# NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF ++# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ++# ++ ++include ../../config/.config ++include ../../config/makefile.conf ++include ../../config/makefile.dotnet.conf ++ ++all : sample ++TARGET=../../$(STAGE)/axssl.csharp.exe ++sample : $(TARGET) ++ ++$(TARGET): ../../bindings/csharp/axTLS.cs ../../bindings/csharp/axInterface.cs axssl.cs ++ifdef GO_DOT_NET ++ csc.exe /nologo /t:exe /out:"`cygpath -w $@`" $(foreach file, $^, "`cygpath -w $(file)`") ++else # use mono to build ++ mcs -out:$@ $^ ++ ++endif # ARCH ++ ++clean:: ++ -@rm -f $(TARGET) +diff --git a/feeds/luci/libs/luci-lib-nixio/axTLS/samples/csharp/axssl.cs b/feeds/luci/libs/luci-lib-nixio/axTLS/samples/csharp/axssl.cs +new file mode 100644 +index 0000000..dae2b8a +--- /dev/null ++++ b/feeds/luci/libs/luci-lib-nixio/axTLS/samples/csharp/axssl.cs +@@ -0,0 +1,758 @@ ++/* ++ * Copyright (c) 2007, Cameron Rich ++ * ++ * All rights reserved. ++ * ++ * Redistribution and use in source and binary forms, with or without ++ * modification, are permitted provided that the following conditions are met: ++ * ++ * * Redistributions of source code must retain the above copyright notice, ++ * this list of conditions and the following disclaimer. ++ * * 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. ++ * * Neither the name of the axTLS project nor the names of its contributors ++ * may be used to endorse or promote products derived from this software ++ * without specific prior written permission. ++ * ++ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ++ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT ++ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR ++ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR ++ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, ++ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, ++ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR ++ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF ++ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING ++ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS ++ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ++ */ ++ ++/** ++ * Demonstrate the use of the axTLS library in C# with a set of ++ * command-line parameters similar to openssl. In fact, openssl clients ++ * should be able to communicate with axTLS servers and visa-versa. ++ * ++ * This code has various bits enabled depending on the configuration. To enable ++ * the most interesting version, compile with the 'full mode' enabled. ++ * ++ * To see what options you have, run the following: ++ * > axssl.csharp.exe s_server -? ++ * > axssl.csharp.exe s_client -? ++ * ++ * The axtls shared library must be in the same directory or be found ++ * by the OS. ++ */ ++ ++using System; ++using System.Net; ++using System.Net.Sockets; ++using axTLS; ++ ++public class axssl ++{ ++ /* ++ * Main() ++ */ ++ public static void Main(string[] args) ++ { ++ if (args.Length == 1 && args[0] == "version") ++ { ++ Console.WriteLine("axssl.csharp " + SSLUtil.Version()); ++ Environment.Exit(0); ++ } ++ ++ axssl runner = new axssl(); ++ ++ if (args.Length < 1 || (args[0] != "s_server" && args[0] != "s_client")) ++ runner.print_options(args.Length > 0 ? args[0] : ""); ++ ++ int build_mode = SSLUtil.BuildMode(); ++ ++ if (args[0] == "s_server") ++ runner.do_server(build_mode, args); ++ else ++ runner.do_client(build_mode, args); ++ } ++ ++ /* ++ * do_server() ++ */ ++ private void do_server(int build_mode, string[] args) ++ { ++ int i = 1; ++ int port = 4433; ++ uint options = axtls.SSL_DISPLAY_CERTS; ++ bool quiet = false; ++ string password = null; ++ string private_key_file = null; ++ ++ /* organise the cert/ca_cert lists */ ++ int cert_size = SSLUtil.MaxCerts(); ++ int ca_cert_size = SSLUtil.MaxCACerts(); ++ string[] cert = new string[cert_size]; ++ string[] ca_cert = new string[ca_cert_size]; ++ int cert_index = 0; ++ int ca_cert_index = 0; ++ ++ while (i < args.Length) ++ { ++ if (args[i] == "-accept") ++ { ++ if (i >= args.Length-1) ++ { ++ print_server_options(build_mode, args[i]); ++ } ++ ++ port = Int32.Parse(args[++i]); ++ } ++ else if (args[i] == "-quiet") ++ { ++ quiet = true; ++ options &= ~(uint)axtls.SSL_DISPLAY_CERTS; ++ } ++ else if (build_mode >= axtls.SSL_BUILD_SERVER_ONLY) ++ { ++ if (args[i] == "-cert") ++ { ++ if (i >= args.Length-1 || cert_index >= cert_size) ++ { ++ print_server_options(build_mode, args[i]); ++ } ++ ++ cert[cert_index++] = args[++i]; ++ } ++ else if (args[i] == "-key") ++ { ++ if (i >= args.Length-1) ++ { ++ print_server_options(build_mode, args[i]); ++ } ++ ++ private_key_file = args[++i]; ++ options |= axtls.SSL_NO_DEFAULT_KEY; ++ } ++ else if (args[i] == "-pass") ++ { ++ if (i >= args.Length-1) ++ { ++ print_server_options(build_mode, args[i]); ++ } ++ ++ password = args[++i]; ++ } ++ else if (build_mode >= axtls.SSL_BUILD_ENABLE_VERIFICATION) ++ { ++ if (args[i] == "-verify") ++ { ++ options |= axtls.SSL_CLIENT_AUTHENTICATION; ++ } ++ else if (args[i] == "-CAfile") ++ { ++ if (i >= args.Length-1 || ca_cert_index >= ca_cert_size) ++ { ++ print_server_options(build_mode, args[i]); ++ } ++ ++ ca_cert[ca_cert_index++] = args[++i]; ++ } ++ else if (build_mode == axtls.SSL_BUILD_FULL_MODE) ++ { ++ if (args[i] == "-debug") ++ { ++ options |= axtls.SSL_DISPLAY_BYTES; ++ } ++ else if (args[i] == "-state") ++ { ++ options |= axtls.SSL_DISPLAY_STATES; ++ } ++ else if (args[i] == "-show-rsa") ++ { ++ options |= axtls.SSL_DISPLAY_RSA; ++ } ++ else ++ print_server_options(build_mode, args[i]); ++ } ++ else ++ print_server_options(build_mode, args[i]); ++ } ++ else ++ print_server_options(build_mode, args[i]); ++ } ++ else ++ print_server_options(build_mode, args[i]); ++ ++ i++; ++ } ++ ++ /* Create socket for incoming connections */ ++ IPEndPoint ep = new IPEndPoint(IPAddress.Any, port); ++ TcpListener server_sock = new TcpListener(ep); ++ server_sock.Start(); ++ ++ /********************************************************************** ++ * This is where the interesting stuff happens. Up until now we've ++ * just been setting up sockets etc. Now we do the SSL handshake. ++ **********************************************************************/ ++ SSLServer ssl_ctx = new SSLServer( ++ options, axtls.SSL_DEFAULT_SVR_SESS); ++ ++ if (ssl_ctx == null) ++ { ++ Console.Error.WriteLine("Error: Server context is invalid"); ++ Environment.Exit(1); ++ } ++ ++ if (private_key_file != null) ++ { ++ int obj_type = axtls.SSL_OBJ_RSA_KEY; ++ ++ if (private_key_file.EndsWith(".p8")) ++ obj_type = axtls.SSL_OBJ_PKCS8; ++ else if (private_key_file.EndsWith(".p12")) ++ obj_type = axtls.SSL_OBJ_PKCS12; ++ ++ if (ssl_ctx.ObjLoad(obj_type, ++ private_key_file, password) != axtls.SSL_OK) ++ { ++ Console.Error.WriteLine("Private key '" + private_key_file + ++ "' is undefined."); ++ Environment.Exit(1); ++ } ++ } ++ ++ for (i = 0; i < cert_index; i++) ++ { ++ if (ssl_ctx.ObjLoad(axtls.SSL_OBJ_X509_CERT, ++ cert[i], null) != axtls.SSL_OK) ++ { ++ Console.WriteLine("Certificate '" + cert[i] + ++ "' is undefined."); ++ Environment.Exit(1); ++ } ++ } ++ ++ for (i = 0; i < ca_cert_index; i++) ++ { ++ if (ssl_ctx.ObjLoad(axtls.SSL_OBJ_X509_CACERT, ++ ca_cert[i], null) != axtls.SSL_OK) ++ { ++ Console.WriteLine("Certificate '" + cert[i] + ++ "' is undefined."); ++ Environment.Exit(1); ++ } ++ } ++ ++ byte[] buf = null; ++ int res; ++ ++ for (;;) ++ { ++ if (!quiet) ++ { ++ Console.WriteLine("ACCEPT"); ++ } ++ ++ Socket client_sock = server_sock.AcceptSocket(); ++ ++ SSL ssl = ssl_ctx.Connect(client_sock); ++ ++ /* do the actual SSL handshake */ ++ while ((res = ssl_ctx.Read(ssl, out buf)) == axtls.SSL_OK) ++ { ++ /* check when the connection has been established */ ++ if (ssl.HandshakeStatus() == axtls.SSL_OK) ++ break; ++ ++ /* could do something else here */ ++ } ++ ++ if (res == axtls.SSL_OK) /* connection established and ok */ ++ { ++ if (!quiet) ++ { ++ display_session_id(ssl); ++ display_cipher(ssl); ++ } ++ ++ /* now read (and display) whatever the client sends us */ ++ for (;;) ++ { ++ /* keep reading until we get something interesting */ ++ while ((res = ssl_ctx.Read(ssl, out buf)) == axtls.SSL_OK) ++ { ++ /* could do something else here */ ++ } ++ ++ if (res < axtls.SSL_OK) ++ { ++ if (!quiet) ++ { ++ Console.WriteLine("CONNECTION CLOSED"); ++ } ++ ++ break; ++ } ++ ++ /* convert to string */ ++ char[] str = new char[res]; ++ for (i = 0; i < res; i++) ++ { ++ str[i] = (char)buf[i]; ++ } ++ ++ Console.Write(str); ++ } ++ } ++ else if (!quiet) ++ { ++ SSLUtil.DisplayError(res); ++ } ++ ++ /* client was disconnected or the handshake failed. */ ++ ssl.Dispose(); ++ client_sock.Close(); ++ } ++ ++ /* ssl_ctx.Dispose(); */ ++ } ++ ++ /* ++ * do_client() ++ */ ++ private void do_client(int build_mode, string[] args) ++ { ++ if (build_mode < axtls.SSL_BUILD_ENABLE_CLIENT) ++ { ++ print_client_options(build_mode, args[1]); ++ } ++ ++ int i = 1, res; ++ int port = 4433; ++ bool quiet = false; ++ string password = null; ++ int reconnect = 0; ++ string private_key_file = null; ++ string hostname = "127.0.0.1"; ++ ++ /* organise the cert/ca_cert lists */ ++ int cert_index = 0; ++ int ca_cert_index = 0; ++ int cert_size = SSLUtil.MaxCerts(); ++ int ca_cert_size = SSLUtil.MaxCACerts(); ++ string[] cert = new string[cert_size]; ++ string[] ca_cert = new string[ca_cert_size]; ++ ++ uint options = axtls.SSL_SERVER_VERIFY_LATER|axtls.SSL_DISPLAY_CERTS; ++ byte[] session_id = null; ++ ++ while (i < args.Length) ++ { ++ if (args[i] == "-connect") ++ { ++ string host_port; ++ ++ if (i >= args.Length-1) ++ { ++ print_client_options(build_mode, args[i]); ++ } ++ ++ host_port = args[++i]; ++ int index_colon; ++ ++ if ((index_colon = host_port.IndexOf(':')) < 0) ++ print_client_options(build_mode, args[i]); ++ ++ hostname = new string(host_port.ToCharArray(), ++ 0, index_colon); ++ port = Int32.Parse(new String(host_port.ToCharArray(), ++ index_colon+1, host_port.Length-index_colon-1)); ++ } ++ else if (args[i] == "-cert") ++ { ++ if (i >= args.Length-1 || cert_index >= cert_size) ++ { ++ print_client_options(build_mode, args[i]); ++ } ++ ++ cert[cert_index++] = args[++i]; ++ } ++ else if (args[i] == "-key") ++ { ++ if (i >= args.Length-1) ++ { ++ print_client_options(build_mode, args[i]); ++ } ++ ++ private_key_file = args[++i]; ++ options |= axtls.SSL_NO_DEFAULT_KEY; ++ } ++ else if (args[i] == "-CAfile") ++ { ++ if (i >= args.Length-1 || ca_cert_index >= ca_cert_size) ++ { ++ print_client_options(build_mode, args[i]); ++ } ++ ++ ca_cert[ca_cert_index++] = args[++i]; ++ } ++ else if (args[i] == "-verify") ++ { ++ options &= ~(uint)axtls.SSL_SERVER_VERIFY_LATER; ++ } ++ else if (args[i] == "-reconnect") ++ { ++ reconnect = 4; ++ } ++ else if (args[i] == "-quiet") ++ { ++ quiet = true; ++ options &= ~(uint)axtls.SSL_DISPLAY_CERTS; ++ } ++ else if (args[i] == "-pass") ++ { ++ if (i >= args.Length-1) ++ { ++ print_client_options(build_mode, args[i]); ++ } ++ ++ password = args[++i]; ++ } ++ else if (build_mode == axtls.SSL_BUILD_FULL_MODE) ++ { ++ if (args[i] == "-debug") ++ { ++ options |= axtls.SSL_DISPLAY_BYTES; ++ } ++ else if (args[i] == "-state") ++ { ++ options |= axtls.SSL_DISPLAY_STATES; ++ } ++ else if (args[i] == "-show-rsa") ++ { ++ options |= axtls.SSL_DISPLAY_RSA; ++ } ++ else ++ print_client_options(build_mode, args[i]); ++ } ++ else /* don't know what this is */ ++ print_client_options(build_mode, args[i]); ++ ++ i++; ++ } ++ ++ // IPHostEntry hostInfo = Dns.Resolve(hostname); ++ IPHostEntry hostInfo = Dns.GetHostEntry(hostname); ++ IPAddress[] addresses = hostInfo.AddressList; ++ IPEndPoint ep = new IPEndPoint(addresses[0], port); ++ Socket client_sock = new Socket(AddressFamily.InterNetwork, ++ SocketType.Stream, ProtocolType.Tcp); ++ client_sock.Connect(ep); ++ ++ if (!client_sock.Connected) ++ { ++ Console.WriteLine("could not connect"); ++ Environment.Exit(1); ++ } ++ ++ if (!quiet) ++ { ++ Console.WriteLine("CONNECTED"); ++ } ++ ++ /********************************************************************** ++ * This is where the interesting stuff happens. Up until now we've ++ * just been setting up sockets etc. Now we do the SSL handshake. ++ **********************************************************************/ ++ SSLClient ssl_ctx = new SSLClient(options, ++ axtls.SSL_DEFAULT_CLNT_SESS); ++ ++ if (ssl_ctx == null) ++ { ++ Console.Error.WriteLine("Error: Client context is invalid"); ++ Environment.Exit(1); ++ } ++ ++ if (private_key_file != null) ++ { ++ int obj_type = axtls.SSL_OBJ_RSA_KEY; ++ ++ if (private_key_file.EndsWith(".p8")) ++ obj_type = axtls.SSL_OBJ_PKCS8; ++ else if (private_key_file.EndsWith(".p12")) ++ obj_type = axtls.SSL_OBJ_PKCS12; ++ ++ if (ssl_ctx.ObjLoad(obj_type, ++ private_key_file, password) != axtls.SSL_OK) ++ { ++ Console.Error.WriteLine("Private key '" + private_key_file + ++ "' is undefined."); ++ Environment.Exit(1); ++ } ++ } ++ ++ for (i = 0; i < cert_index; i++) ++ { ++ if (ssl_ctx.ObjLoad(axtls.SSL_OBJ_X509_CERT, ++ cert[i], null) != axtls.SSL_OK) ++ { ++ Console.WriteLine("Certificate '" + cert[i] + ++ "' is undefined."); ++ Environment.Exit(1); ++ } ++ } ++ ++ for (i = 0; i < ca_cert_index; i++) ++ { ++ if (ssl_ctx.ObjLoad(axtls.SSL_OBJ_X509_CACERT, ++ ca_cert[i], null) != axtls.SSL_OK) ++ { ++ Console.WriteLine("Certificate '" + cert[i] + ++ "' is undefined."); ++ Environment.Exit(1); ++ } ++ } ++ ++ SSL ssl = new SSL(new IntPtr(0)); /* keep compiler happy */ ++ ++ /* Try session resumption? */ ++ if (reconnect > 0) ++ { ++ while (reconnect-- > 0) ++ { ++ ssl = ssl_ctx.Connect(client_sock, session_id); ++ ++ if ((res = ssl.HandshakeStatus()) != axtls.SSL_OK) ++ { ++ if (!quiet) ++ { ++ SSLUtil.DisplayError(res); ++ } ++ ++ ssl.Dispose(); ++ Environment.Exit(1); ++ } ++ ++ display_session_id(ssl); ++ session_id = ssl.GetSessionId(); ++ ++ if (reconnect > 0) ++ { ++ ssl.Dispose(); ++ client_sock.Close(); ++ ++ /* and reconnect */ ++ client_sock = new Socket(AddressFamily.InterNetwork, ++ SocketType.Stream, ProtocolType.Tcp); ++ client_sock.Connect(ep); ++ } ++ } ++ } ++ else ++ { ++ ssl = ssl_ctx.Connect(client_sock, null); ++ } ++ ++ /* check the return status */ ++ if ((res = ssl.HandshakeStatus()) != axtls.SSL_OK) ++ { ++ if (!quiet) ++ { ++ SSLUtil.DisplayError(res); ++ } ++ ++ Environment.Exit(1); ++ } ++ ++ if (!quiet) ++ { ++ string common_name = ++ ssl.GetCertificateDN(axtls.SSL_X509_CERT_COMMON_NAME); ++ ++ if (common_name != null) ++ { ++ Console.WriteLine("Common Name:\t\t\t" + common_name); ++ } ++ ++ display_session_id(ssl); ++ display_cipher(ssl); ++ } ++ ++ for (;;) ++ { ++ string user_input = Console.ReadLine(); ++ ++ if (user_input == null) ++ break; ++ ++ byte[] buf = new byte[user_input.Length+2]; ++ buf[buf.Length-2] = (byte)'\n'; /* add the carriage return */ ++ buf[buf.Length-1] = 0; /* null terminate */ ++ ++ for (i = 0; i < buf.Length-2; i++) ++ { ++ buf[i] = (byte)user_input[i]; ++ } ++ ++ if ((res = ssl_ctx.Write(ssl, buf, buf.Length)) < axtls.SSL_OK) ++ { ++ if (!quiet) ++ { ++ SSLUtil.DisplayError(res); ++ } ++ ++ break; ++ } ++ } ++ ++ ssl_ctx.Dispose(); ++ } ++ ++ /** ++ * We've had some sort of command-line error. Print out the basic options. ++ */ ++ private void print_options(string option) ++ { ++ Console.WriteLine("axssl: Error: '" + option + ++ "' is an invalid command."); ++ Console.WriteLine("usage: axssl.csharp [s_server|" + ++ "s_client|version] [args ...]"); ++ Environment.Exit(1); ++ } ++ ++ /** ++ * We've had some sort of command-line error. Print out the server options. ++ */ ++ private void print_server_options(int build_mode, string option) ++ { ++ int cert_size = SSLUtil.MaxCerts(); ++ int ca_cert_size = SSLUtil.MaxCACerts(); ++ ++ Console.WriteLine("unknown option " + option); ++ Console.WriteLine("usage: s_server [args ...]"); ++ Console.WriteLine(" -accept arg\t- port to accept on (default " + ++ "is 4433)"); ++ Console.WriteLine(" -quiet\t\t- No server output"); ++ ++ if (build_mode >= axtls.SSL_BUILD_SERVER_ONLY) ++ { ++ Console.WriteLine(" -cert arg\t- certificate file to add (in " + ++ "addition to default) to chain -"); ++ Console.WriteLine("\t\t Can repeat up to " + cert_size + " times"); ++ Console.WriteLine(" -key arg\t- Private key file to use"); ++ Console.WriteLine(" -pass\t\t- private key file pass phrase source"); ++ } ++ ++ if (build_mode >= axtls.SSL_BUILD_ENABLE_VERIFICATION) ++ { ++ Console.WriteLine(" -verify\t- turn on peer certificate " + ++ "verification"); ++ Console.WriteLine(" -CAfile arg\t- Certificate authority."); ++ Console.WriteLine("\t\t Can repeat up to " + ++ ca_cert_size + "times"); ++ } ++ ++ if (build_mode == axtls.SSL_BUILD_FULL_MODE) ++ { ++ Console.WriteLine(" -debug\t\t- Print more output"); ++ Console.WriteLine(" -state\t\t- Show state messages"); ++ Console.WriteLine(" -show-rsa\t- Show RSA state"); ++ } ++ ++ Environment.Exit(1); ++ } ++ ++ /** ++ * We've had some sort of command-line error. Print out the client options. ++ */ ++ private void print_client_options(int build_mode, string option) ++ { ++ int cert_size = SSLUtil.MaxCerts(); ++ int ca_cert_size = SSLUtil.MaxCACerts(); ++ ++ Console.WriteLine("unknown option " + option); ++ ++ if (build_mode >= axtls.SSL_BUILD_ENABLE_CLIENT) ++ { ++ Console.WriteLine("usage: s_client [args ...]"); ++ Console.WriteLine(" -connect host:port - who to connect to " + ++ "(default is localhost:4433)"); ++ Console.WriteLine(" -verify\t- turn on peer certificate " + ++ "verification"); ++ Console.WriteLine(" -cert arg\t- certificate file to use"); ++ Console.WriteLine("\t\t Can repeat up to %d times", cert_size); ++ Console.WriteLine(" -key arg\t- Private key file to use"); ++ Console.WriteLine(" -CAfile arg\t- Certificate authority."); ++ Console.WriteLine("\t\t Can repeat up to " + ca_cert_size + ++ " times"); ++ Console.WriteLine(" -quiet\t\t- No client output"); ++ Console.WriteLine(" -pass\t\t- private key file pass " + ++ "phrase source"); ++ Console.WriteLine(" -reconnect\t- Drop and re-make the " + ++ "connection with the same Session-ID"); ++ ++ if (build_mode == axtls.SSL_BUILD_FULL_MODE) ++ { ++ Console.WriteLine(" -debug\t\t- Print more output"); ++ Console.WriteLine(" -state\t\t- Show state messages"); ++ Console.WriteLine(" -show-rsa\t- Show RSA state"); ++ } ++ } ++ else ++ { ++ Console.WriteLine("Change configuration to allow this feature"); ++ } ++ ++ Environment.Exit(1); ++ } ++ ++ /** ++ * Display what cipher we are using ++ */ ++ private void display_cipher(SSL ssl) ++ { ++ Console.Write("CIPHER is "); ++ ++ switch (ssl.GetCipherId()) ++ { ++ case axtls.SSL_AES128_SHA: ++ Console.WriteLine("AES128-SHA"); ++ break; ++ ++ case axtls.SSL_AES256_SHA: ++ Console.WriteLine("AES256-SHA"); ++ break; ++ ++ case axtls.SSL_RC4_128_SHA: ++ Console.WriteLine("RC4-SHA"); ++ break; ++ ++ case axtls.SSL_RC4_128_MD5: ++ Console.WriteLine("RC4-MD5"); ++ break; ++ ++ default: ++ Console.WriteLine("Unknown - " + ssl.GetCipherId()); ++ break; ++ } ++ } ++ ++ /** ++ * Display what session id we have. ++ */ ++ private void display_session_id(SSL ssl) ++ { ++ byte[] session_id = ssl.GetSessionId(); ++ ++ if (session_id.Length > 0) ++ { ++ Console.WriteLine("-----BEGIN SSL SESSION PARAMETERS-----"); ++ foreach (byte b in session_id) ++ { ++ Console.Write("{0:x02}", b); ++ } ++ ++ Console.WriteLine("\n-----END SSL SESSION PARAMETERS-----"); ++ } ++ } ++} +diff --git a/feeds/luci/libs/luci-lib-nixio/axTLS/samples/java/Makefile b/feeds/luci/libs/luci-lib-nixio/axTLS/samples/java/Makefile +new file mode 100644 +index 0000000..b10a79f +--- /dev/null ++++ b/feeds/luci/libs/luci-lib-nixio/axTLS/samples/java/Makefile +@@ -0,0 +1,51 @@ ++# ++# Copyright (c) 2007, Cameron Rich ++# ++# All rights reserved. ++# ++# Redistribution and use in source and binary forms, with or without ++# modification, are permitted provided that the following conditions are met: ++# ++# * Redistributions of source code must retain the above copyright notice, ++# this list of conditions and the following disclaimer. ++# * 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. ++# * Neither the name of the axTLS project nor the names of its ++# contributors may be used to endorse or promote products derived ++# from this software without specific prior written permission. ++# ++# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ++# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT ++# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR ++# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR ++# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, ++# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED ++# TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, ++# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY ++# OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING ++# NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF ++# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ++# ++ ++include ../../config/.config ++include ../../config/makefile.conf ++include ../../config/makefile.java.conf ++ ++all : sample ++JAR=../../$(STAGE)/axtls.jar ++CLASSES=../../bindings/java/classes ++sample : $(JAR) ++ ++$(JAR) : $(CLASSES)/axssl.class $(wildcard $(CLASSES)/axTLSj/*.class) ++ jar mcvf manifest.mf $@ -C $(CLASSES) axTLSj -C $(CLASSES) axssl.class ++ ++JAVA_FILES=axssl.java ++JAVA_CLASSES:=$(JAVA_FILES:%.java=$(CLASSES)/axTLSj/%.class) ++ ++$(CLASSES)/%.class : %.java ++ javac -d $(CLASSES) -classpath $(CLASSES) $^ ++ ++clean:: ++ -@rm -f $(TARGET) ++ +diff --git a/feeds/luci/libs/luci-lib-nixio/axTLS/samples/java/axssl.java b/feeds/luci/libs/luci-lib-nixio/axTLS/samples/java/axssl.java +new file mode 100644 +index 0000000..2057f29 +--- /dev/null ++++ b/feeds/luci/libs/luci-lib-nixio/axTLS/samples/java/axssl.java +@@ -0,0 +1,760 @@ ++/* ++ * Copyright (c) 2007, Cameron Rich ++ * ++ * All rights reserved. ++ * ++ * Redistribution and use in source and binary forms, with or without ++ * modification, are permitted provided that the following conditions are met: ++ * ++ * * Redistributions of source code must retain the above copyright notice, ++ * this list of conditions and the following disclaimer. ++ * * 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. ++ * * Neither the name of the axTLS project nor the names of its contributors ++ * may be used to endorse or promote products derived from this software ++ * without specific prior written permission. ++ * ++ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ++ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT ++ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR ++ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR ++ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, ++ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, ++ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR ++ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF ++ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING ++ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS ++ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ++ */ ++ ++/* ++ * Demonstrate the use of the axTLS library in Java with a set of ++ * command-line parameters similar to openssl. In fact, openssl clients ++ * should be able to communicate with axTLS servers and visa-versa. * ++ * This code has various bits enabled depending on the configuration. To enable ++ * the most interesting version, compile with the 'full mode' enabled. ++ * ++ * To see what options you have, run the following: ++ * > java -jar axtls.jar s_server -? ++ * > java -jar axtls.jar s_client -? ++ * ++ * The axtls/axtlsj shared libraries must be in the same directory or be found ++ * by the OS. ++ */ ++ ++import java.io.*; ++import java.util.*; ++import java.net.*; ++import axTLSj.*; ++ ++public class axssl ++{ ++ /* ++ * Main() ++ */ ++ public static void main(String[] args) ++ { ++ if (args.length == 1 && args[0].equals("version")) ++ { ++ System.out.println("axtls.jar " + SSLUtil.version()); ++ System.exit(0); ++ } ++ ++ axssl runner = new axssl(); ++ ++ try ++ { ++ if (args.length < 1 || ++ (!args[0].equals("s_server") && ++ !args[0].equals("s_client"))) ++ { ++ runner.print_options(args.length > 0 ? args[0] : ""); ++ } ++ ++ int build_mode = SSLUtil.buildMode(); ++ ++ if (args[0].equals("s_server")) ++ runner.do_server(build_mode, args); ++ else ++ runner.do_client(build_mode, args); ++ } ++ catch (Exception e) ++ { ++ System.out.println(e); ++ } ++ } ++ ++ /* ++ * do_server() ++ */ ++ private void do_server(int build_mode, String[] args) ++ throws Exception ++ { ++ int i = 1; ++ int port = 4433; ++ int options = axtlsj.SSL_DISPLAY_CERTS; ++ boolean quiet = false; ++ String password = null; ++ String private_key_file = null; ++ ++ /* organise the cert/ca_cert lists */ ++ int cert_size = SSLUtil.maxCerts(); ++ int ca_cert_size = SSLUtil.maxCACerts(); ++ String[] cert = new String[cert_size]; ++ String[] ca_cert = new String[ca_cert_size]; ++ int cert_index = 0; ++ int ca_cert_index = 0; ++ ++ while (i < args.length) ++ { ++ if (args[i].equals("-accept")) ++ { ++ if (i >= args.length-1) ++ { ++ print_server_options(build_mode, args[i]); ++ } ++ ++ port = Integer.parseInt(args[++i]); ++ } ++ else if (args[i].equals("-quiet")) ++ { ++ quiet = true; ++ options &= ~(int)axtlsj.SSL_DISPLAY_CERTS; ++ } ++ else if (build_mode >= axtlsj.SSL_BUILD_SERVER_ONLY) ++ { ++ if (args[i].equals("-cert")) ++ { ++ if (i >= args.length-1 || cert_index >= cert_size) ++ { ++ print_server_options(build_mode, args[i]); ++ } ++ ++ cert[cert_index++] = args[++i]; ++ } ++ else if (args[i].equals("-key")) ++ { ++ if (i >= args.length-1) ++ { ++ print_server_options(build_mode, args[i]); ++ } ++ ++ private_key_file = args[++i]; ++ options |= axtlsj.SSL_NO_DEFAULT_KEY; ++ } ++ else if (args[i].equals("-pass")) ++ { ++ if (i >= args.length-1) ++ { ++ print_server_options(build_mode, args[i]); ++ } ++ ++ password = args[++i]; ++ } ++ else if (build_mode >= axtlsj.SSL_BUILD_ENABLE_VERIFICATION) ++ { ++ if (args[i].equals("-verify")) ++ { ++ options |= axtlsj.SSL_CLIENT_AUTHENTICATION; ++ } ++ else if (args[i].equals("-CAfile")) ++ { ++ if (i >= args.length-1 || ca_cert_index >= ca_cert_size) ++ { ++ print_server_options(build_mode, args[i]); ++ } ++ ++ ca_cert[ca_cert_index++] = args[++i]; ++ } ++ else if (build_mode == axtlsj.SSL_BUILD_FULL_MODE) ++ { ++ if (args[i].equals("-debug")) ++ { ++ options |= axtlsj.SSL_DISPLAY_BYTES; ++ } ++ else if (args[i].equals("-state")) ++ { ++ options |= axtlsj.SSL_DISPLAY_STATES; ++ } ++ else if (args[i].equals("-show-rsa")) ++ { ++ options |= axtlsj.SSL_DISPLAY_RSA; ++ } ++ else ++ print_server_options(build_mode, args[i]); ++ } ++ else ++ print_server_options(build_mode, args[i]); ++ } ++ else ++ print_server_options(build_mode, args[i]); ++ } ++ else ++ print_server_options(build_mode, args[i]); ++ ++ i++; ++ } ++ ++ /* Create socket for incoming connections */ ++ ServerSocket server_sock = new ServerSocket(port); ++ ++ /********************************************************************** ++ * This is where the interesting stuff happens. Up until now we've ++ * just been setting up sockets etc. Now we do the SSL handshake. ++ **********************************************************************/ ++ SSLServer ssl_ctx = new SSLServer(options, ++ axtlsj.SSL_DEFAULT_SVR_SESS); ++ ++ if (ssl_ctx == null) ++ throw new Exception("Error: Server context is invalid"); ++ ++ if (private_key_file != null) ++ { ++ int obj_type = axtlsj.SSL_OBJ_RSA_KEY; ++ ++ if (private_key_file.endsWith(".p8")) ++ obj_type = axtlsj.SSL_OBJ_PKCS8; ++ else if (private_key_file.endsWith(".p12")) ++ obj_type = axtlsj.SSL_OBJ_PKCS12; ++ ++ if (ssl_ctx.objLoad(obj_type, ++ private_key_file, password) != axtlsj.SSL_OK) ++ { ++ throw new Exception("Error: Private key '" + private_key_file + ++ "' is undefined."); ++ } ++ } ++ ++ for (i = 0; i < cert_index; i++) ++ { ++ if (ssl_ctx.objLoad(axtlsj.SSL_OBJ_X509_CERT, ++ cert[i], null) != axtlsj.SSL_OK) ++ { ++ throw new Exception("Certificate '" + cert[i] + ++ "' is undefined."); ++ } ++ } ++ ++ for (i = 0; i < ca_cert_index; i++) ++ { ++ if (ssl_ctx.objLoad(axtlsj.SSL_OBJ_X509_CACERT, ++ ca_cert[i], null) != axtlsj.SSL_OK) ++ { ++ throw new Exception("Certificate '" + ca_cert[i] + ++ "' is undefined."); ++ } ++ } ++ ++ int res; ++ SSLReadHolder rh = new SSLReadHolder(); ++ ++ for (;;) ++ { ++ if (!quiet) ++ { ++ System.out.println("ACCEPT"); ++ } ++ ++ Socket client_sock = server_sock.accept(); ++ ++ SSL ssl = ssl_ctx.connect(client_sock); ++ ++ while ((res = ssl_ctx.read(ssl, rh)) == axtlsj.SSL_OK) ++ { ++ /* check when the connection has been established */ ++ if (ssl.handshakeStatus() == axtlsj.SSL_OK) ++ break; ++ ++ /* could do something else here */ ++ } ++ ++ if (res == axtlsj.SSL_OK) /* connection established and ok */ ++ { ++ if (!quiet) ++ { ++ display_session_id(ssl); ++ display_cipher(ssl); ++ } ++ ++ /* now read (and display) whatever the client sends us */ ++ for (;;) ++ { ++ /* keep reading until we get something interesting */ ++ while ((res = ssl_ctx.read(ssl, rh)) == axtlsj.SSL_OK) ++ { ++ /* could do something else here */ ++ } ++ ++ if (res < axtlsj.SSL_OK) ++ { ++ if (!quiet) ++ { ++ System.out.println("CONNECTION CLOSED"); ++ } ++ ++ break; ++ } ++ ++ /* convert to String */ ++ byte[] buf = rh.getData(); ++ char[] str = new char[res]; ++ ++ for (i = 0; i < res; i++) ++ { ++ str[i] = (char)buf[i]; ++ } ++ ++ System.out.print(str); ++ } ++ } ++ else if (!quiet) ++ { ++ SSLUtil.displayError(res); ++ } ++ ++ /* client was disconnected or the handshake failed. */ ++ ssl.dispose(); ++ client_sock.close(); ++ } ++ ++ /* ssl_ctx.dispose(); */ ++ } ++ ++ /* ++ * do_client() ++ */ ++ private void do_client(int build_mode, String[] args) ++ throws Exception ++ { ++ if (build_mode < axtlsj.SSL_BUILD_ENABLE_CLIENT) ++ print_client_options(build_mode, args[1]); ++ ++ int i = 1, res; ++ int port = 4433; ++ boolean quiet = false; ++ String password = null; ++ int reconnect = 0; ++ String private_key_file = null; ++ String hostname = "127.0.0.1"; ++ ++ /* organise the cert/ca_cert lists */ ++ int cert_index = 0; ++ int ca_cert_index = 0; ++ int cert_size = SSLUtil.maxCerts(); ++ int ca_cert_size = SSLUtil.maxCACerts(); ++ String[] cert = new String[cert_size]; ++ String[] ca_cert = new String[ca_cert_size]; ++ ++ int options = axtlsj.SSL_SERVER_VERIFY_LATER|axtlsj.SSL_DISPLAY_CERTS; ++ byte[] session_id = null; ++ ++ while (i < args.length) ++ { ++ if (args[i].equals("-connect")) ++ { ++ String host_port; ++ ++ if (i >= args.length-1) ++ { ++ print_client_options(build_mode, args[i]); ++ } ++ ++ host_port = args[++i]; ++ int index_colon; ++ ++ if ((index_colon = host_port.indexOf(':')) < 0) ++ print_client_options(build_mode, args[i]); ++ ++ hostname = new String(host_port.toCharArray(), ++ 0, index_colon); ++ port = Integer.parseInt(new String(host_port.toCharArray(), ++ index_colon+1, host_port.length()-index_colon-1)); ++ } ++ else if (args[i].equals("-cert")) ++ { ++ if (i >= args.length-1 || cert_index >= cert_size) ++ { ++ print_client_options(build_mode, args[i]); ++ } ++ ++ cert[cert_index++] = args[++i]; ++ } ++ else if (args[i].equals("-CAfile")) ++ { ++ if (i >= args.length-1 || ca_cert_index >= ca_cert_size) ++ { ++ print_client_options(build_mode, args[i]); ++ } ++ ++ ca_cert[ca_cert_index++] = args[++i]; ++ } ++ else if (args[i].equals("-key")) ++ { ++ if (i >= args.length-1) ++ { ++ print_client_options(build_mode, args[i]); ++ } ++ ++ private_key_file = args[++i]; ++ options |= axtlsj.SSL_NO_DEFAULT_KEY; ++ } ++ else if (args[i].equals("-verify")) ++ { ++ options &= ~(int)axtlsj.SSL_SERVER_VERIFY_LATER; ++ } ++ else if (args[i].equals("-reconnect")) ++ { ++ reconnect = 4; ++ } ++ else if (args[i].equals("-quiet")) ++ { ++ quiet = true; ++ options &= ~(int)axtlsj.SSL_DISPLAY_CERTS; ++ } ++ else if (args[i].equals("-pass")) ++ { ++ if (i >= args.length-1) ++ { ++ print_server_options(build_mode, args[i]); ++ } ++ ++ password = args[++i]; ++ } ++ else if (build_mode == axtlsj.SSL_BUILD_FULL_MODE) ++ { ++ if (args[i].equals("-debug")) ++ { ++ options |= axtlsj.SSL_DISPLAY_BYTES; ++ } ++ else if (args[i].equals("-state")) ++ { ++ options |= axtlsj.SSL_DISPLAY_STATES; ++ } ++ else if (args[i].equals("-show-rsa")) ++ { ++ options |= axtlsj.SSL_DISPLAY_RSA; ++ } ++ else ++ print_client_options(build_mode, args[i]); ++ } ++ else /* don't know what this is */ ++ print_client_options(build_mode, args[i]); ++ ++ i++; ++ } ++ ++ Socket client_sock = new Socket(hostname, port); ++ ++ if (!client_sock.isConnected()) ++ { ++ System.out.println("could not connect"); ++ throw new Exception(); ++ } ++ ++ if (!quiet) ++ { ++ System.out.println("CONNECTED"); ++ } ++ ++ /********************************************************************** ++ * This is where the interesting stuff happens. Up until now we've ++ * just been setting up sockets etc. Now we do the SSL handshake. ++ **********************************************************************/ ++ SSLClient ssl_ctx = new SSLClient(options, ++ axtlsj.SSL_DEFAULT_CLNT_SESS); ++ ++ if (ssl_ctx == null) ++ { ++ throw new Exception("Error: Client context is invalid"); ++ } ++ ++ if (private_key_file != null) ++ { ++ int obj_type = axtlsj.SSL_OBJ_RSA_KEY; ++ ++ if (private_key_file.endsWith(".p8")) ++ obj_type = axtlsj.SSL_OBJ_PKCS8; ++ else if (private_key_file.endsWith(".p12")) ++ obj_type = axtlsj.SSL_OBJ_PKCS12; ++ ++ if (ssl_ctx.objLoad(obj_type, ++ private_key_file, password) != axtlsj.SSL_OK) ++ { ++ throw new Exception("Error: Private key '" + private_key_file + ++ "' is undefined."); ++ } ++ } ++ ++ for (i = 0; i < cert_index; i++) ++ { ++ if (ssl_ctx.objLoad(axtlsj.SSL_OBJ_X509_CERT, ++ cert[i], null) != axtlsj.SSL_OK) ++ { ++ throw new Exception("Certificate '" + cert[i] + ++ "' is undefined."); ++ } ++ } ++ ++ for (i = 0; i < ca_cert_index; i++) ++ { ++ if (ssl_ctx.objLoad(axtlsj.SSL_OBJ_X509_CACERT, ++ ca_cert[i], null) != axtlsj.SSL_OK) ++ { ++ throw new Exception("Certificate '" + ca_cert[i] + ++ "' is undefined."); ++ } ++ } ++ ++ SSL ssl = null; ++ ++ /* Try session resumption? */ ++ if (reconnect > 0) ++ { ++ while (reconnect-- > 0) ++ { ++ ssl = ssl_ctx.connect(client_sock, session_id); ++ ++ if ((res = ssl.handshakeStatus()) != axtlsj.SSL_OK) ++ { ++ if (!quiet) ++ { ++ SSLUtil.displayError(res); ++ } ++ ++ ssl.dispose(); ++ throw new Exception(); ++ } ++ ++ display_session_id(ssl); ++ session_id = ssl.getSessionId(); ++ ++ if (reconnect > 0) ++ { ++ ssl.dispose(); ++ client_sock.close(); ++ ++ /* and reconnect */ ++ client_sock = new Socket(hostname, port); ++ } ++ } ++ } ++ else ++ { ++ ssl = ssl_ctx.connect(client_sock, null); ++ } ++ ++ /* check the return status */ ++ if ((res = ssl.handshakeStatus()) != axtlsj.SSL_OK) ++ { ++ if (!quiet) ++ { ++ SSLUtil.displayError(res); ++ } ++ ++ throw new Exception(); ++ } ++ ++ if (!quiet) ++ { ++ String common_name = ++ ssl.getCertificateDN(axtlsj.SSL_X509_CERT_COMMON_NAME); ++ ++ if (common_name != null) ++ { ++ System.out.println("Common Name:\t\t\t" + common_name); ++ } ++ ++ display_session_id(ssl); ++ display_cipher(ssl); ++ } ++ ++ BufferedReader in = new BufferedReader( ++ new InputStreamReader(System.in)); ++ ++ for (;;) ++ { ++ String user_input = in.readLine(); ++ ++ if (user_input == null) ++ break; ++ ++ byte[] buf = new byte[user_input.length()+2]; ++ buf[buf.length-2] = (byte)'\n'; /* add the carriage return */ ++ buf[buf.length-1] = 0; /* null terminate */ ++ ++ for (i = 0; i < buf.length-2; i++) ++ { ++ buf[i] = (byte)user_input.charAt(i); ++ } ++ ++ if ((res = ssl_ctx.write(ssl, buf)) < axtlsj.SSL_OK) ++ { ++ if (!quiet) ++ { ++ SSLUtil.displayError(res); ++ } ++ ++ break; ++ } ++ } ++ ++ ssl_ctx.dispose(); ++ } ++ ++ /** ++ * We've had some sort of command-line error. Print out the basic options. ++ */ ++ private void print_options(String option) ++ { ++ System.out.println("axssl: Error: '" + option + ++ "' is an invalid command."); ++ System.out.println("usage: axtlsj.jar [s_server|s_client|version] " + ++ "[args ...]"); ++ System.exit(1); ++ } ++ ++ /** ++ * We've had some sort of command-line error. Print out the server options. ++ */ ++ private void print_server_options(int build_mode, String option) ++ { ++ int cert_size = SSLUtil.maxCerts(); ++ int ca_cert_size = SSLUtil.maxCACerts(); ++ ++ System.out.println("unknown option " + option); ++ System.out.println("usage: s_server [args ...]"); ++ System.out.println(" -accept arg\t- port to accept on (default " + ++ "is 4433)"); ++ System.out.println(" -quiet\t\t- No server output"); ++ ++ if (build_mode >= axtlsj.SSL_BUILD_SERVER_ONLY) ++ { ++ System.out.println(" -cert arg\t- certificate file to add (in " + ++ "addition to default) to chain -"); ++ System.out.println("\t\t Can repeat up to " + cert_size + " times"); ++ System.out.println(" -key arg\t- Private key file to use"); ++ System.out.println(" -pass\t\t- private key file pass phrase source"); ++ } ++ ++ if (build_mode >= axtlsj.SSL_BUILD_ENABLE_VERIFICATION) ++ { ++ System.out.println(" -verify\t- turn on peer certificate " + ++ "verification"); ++ System.out.println(" -CAfile arg\t- Certificate authority. "); ++ System.out.println("\t\t Can repeat up to " + ++ ca_cert_size + " times"); ++ } ++ ++ if (build_mode == axtlsj.SSL_BUILD_FULL_MODE) ++ { ++ System.out.println(" -debug\t\t- Print more output"); ++ System.out.println(" -state\t\t- Show state messages"); ++ System.out.println(" -show-rsa\t- Show RSA state"); ++ } ++ ++ System.exit(1); ++ } ++ ++ /** ++ * We've had some sort of command-line error. Print out the client options. ++ */ ++ private void print_client_options(int build_mode, String option) ++ { ++ int cert_size = SSLUtil.maxCerts(); ++ int ca_cert_size = SSLUtil.maxCACerts(); ++ ++ System.out.println("unknown option " + option); ++ ++ if (build_mode >= axtlsj.SSL_BUILD_ENABLE_CLIENT) ++ { ++ System.out.println("usage: s_client [args ...]"); ++ System.out.println(" -connect host:port - who to connect to " + ++ "(default is localhost:4433)"); ++ System.out.println(" -verify\t- turn on peer certificate " + ++ "verification"); ++ System.out.println(" -cert arg\t- certificate file to use"); ++ System.out.println(" -key arg\t- Private key file to use"); ++ System.out.println("\t\t Can repeat up to " + cert_size + ++ " times"); ++ System.out.println(" -CAfile arg\t- Certificate authority."); ++ System.out.println("\t\t Can repeat up to " + ca_cert_size + ++ " times"); ++ System.out.println(" -quiet\t\t- No client output"); ++ System.out.println(" -pass\t\t- private key file pass " + ++ "phrase source"); ++ System.out.println(" -reconnect\t- Drop and re-make the " + ++ "connection with the same Session-ID"); ++ ++ if (build_mode == axtlsj.SSL_BUILD_FULL_MODE) ++ { ++ System.out.println(" -debug\t\t- Print more output"); ++ System.out.println(" -state\t\t- Show state messages"); ++ System.out.println(" -show-rsa\t- Show RSA state"); ++ } ++ } ++ else ++ { ++ System.out.println("Change configuration to allow this feature"); ++ } ++ ++ System.exit(1); ++ } ++ ++ /** ++ * Display what cipher we are using ++ */ ++ private void display_cipher(SSL ssl) ++ { ++ System.out.print("CIPHER is "); ++ ++ byte ciph_id = ssl.getCipherId(); ++ ++ if (ciph_id == axtlsj.SSL_AES128_SHA) ++ System.out.println("AES128-SHA"); ++ else if (ciph_id == axtlsj.SSL_AES256_SHA) ++ System.out.println("AES256-SHA"); ++ else if (ciph_id == axtlsj.SSL_RC4_128_SHA) ++ System.out.println("RC4-SHA"); ++ else if (ciph_id == axtlsj.SSL_RC4_128_MD5) ++ System.out.println("RC4-MD5"); ++ else ++ System.out.println("Unknown - " + ssl.getCipherId()); ++ } ++ ++ public char toHexChar(int i) ++ { ++ if ((0 <= i) && (i <= 9 )) ++ return (char)('0' + i); ++ else ++ return (char)('a' + (i-10)); ++ } ++ ++ public void bytesToHex(byte[] data) ++ { ++ StringBuffer buf = new StringBuffer(); ++ for (int i = 0; i < data.length; i++ ) ++ { ++ buf.append(toHexChar((data[i]>>>4)&0x0F)); ++ buf.append(toHexChar(data[i]&0x0F)); ++ } ++ ++ System.out.println(buf); ++ } ++ ++ ++ /** ++ * Display what session id we have. ++ */ ++ private void display_session_id(SSL ssl) ++ { ++ byte[] session_id = ssl.getSessionId(); ++ ++ if (session_id.length > 0) ++ { ++ System.out.println("-----BEGIN SSL SESSION PARAMETERS-----"); ++ bytesToHex(session_id); ++ System.out.println("-----END SSL SESSION PARAMETERS-----"); ++ } ++ } ++} +diff --git a/feeds/luci/libs/luci-lib-nixio/axTLS/samples/java/manifest.mf b/feeds/luci/libs/luci-lib-nixio/axTLS/samples/java/manifest.mf +new file mode 100644 +index 0000000..b906ed2 +--- /dev/null ++++ b/feeds/luci/libs/luci-lib-nixio/axTLS/samples/java/manifest.mf +@@ -0,0 +1 @@ ++Main-Class: axssl +diff --git a/feeds/luci/libs/luci-lib-nixio/axTLS/samples/lua/Makefile b/feeds/luci/libs/luci-lib-nixio/axTLS/samples/lua/Makefile +new file mode 100644 +index 0000000..a460da3 +--- /dev/null ++++ b/feeds/luci/libs/luci-lib-nixio/axTLS/samples/lua/Makefile +@@ -0,0 +1,43 @@ ++# ++# Copyright (c) 2007, Cameron Rich ++# ++# All rights reserved. ++# ++# Redistribution and use in source and binary forms, with or without ++# modification, are permitted provided that the following conditions are met: ++# ++# * Redistributions of source code must retain the above copyright notice, ++# this list of conditions and the following disclaimer. ++# * 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. ++# * Neither the name of the axTLS project nor the names of its ++# contributors may be used to endorse or promote products derived ++# from this software without specific prior written permission. ++# ++# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ++# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT ++# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR ++# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR ++# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, ++# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED ++# TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, ++# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY ++# OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING ++# NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF ++# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ++# ++ ++include ../../config/.config ++include ../../config/makefile.conf ++ ++all: samples ++TARGET=../../$(STAGE)/axssl.lua ++samples: $(TARGET) ++ ++$(TARGET): axssl.lua ++ install $< $@ ++ ++clean:: ++ -@rm -f $(TARGET) ++ +diff --git a/feeds/luci/libs/luci-lib-nixio/axTLS/samples/lua/axssl.lua b/feeds/luci/libs/luci-lib-nixio/axTLS/samples/lua/axssl.lua +new file mode 100755 +index 0000000..6ea26b6 +--- /dev/null ++++ b/feeds/luci/libs/luci-lib-nixio/axTLS/samples/lua/axssl.lua +@@ -0,0 +1,562 @@ ++#!/usr/local/bin/lua ++ ++-- ++-- Copyright (c) 2007, Cameron Rich ++-- ++-- All rights reserved. ++-- ++-- Redistribution and use in source and binary forms, with or without ++-- modification, are permitted provided that the following conditions are met: ++-- ++-- * Redistributions of source code must retain the above copyright notice, ++-- this list of conditions and the following disclaimer. ++-- * 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. ++-- * Neither the name of the axTLS project nor the names of its ++-- contributors may be used to endorse or promote products derived ++-- from this software without specific prior written permission. ++-- ++-- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ++-- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT ++-- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR ++-- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR ++-- CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, ++-- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED ++-- TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, ++-- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY ++-- OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING ++-- NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF ++-- THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ++-- ++ ++-- ++-- Demonstrate the use of the axTLS library in Lua with a set of ++-- command-line parameters similar to openssl. In fact, openssl clients ++-- should be able to communicate with axTLS servers and visa-versa. ++-- ++-- This code has various bits enabled depending on the configuration. To enable ++-- the most interesting version, compile with the 'full mode' enabled. ++-- ++-- To see what options you have, run the following: ++-- > [lua] axssl s_server -? ++-- > [lua] axssl s_client -? ++-- ++-- The axtls/axtlsl shared libraries must be in the same directory or be found ++-- by the OS. ++-- ++-- ++require "bit" ++require("axtlsl") ++local socket = require("socket") ++ ++-- print version? ++if #arg == 1 and arg[1] == "version" then ++ print("axssl.lua "..axtlsl.ssl_version()) ++ os.exit(1) ++end ++ ++-- ++-- We've had some sort of command-line error. Print out the basic options. ++-- ++function print_options(option) ++ print("axssl: Error: '"..option.."' is an invalid command.") ++ print("usage: axssl [s_server|s_client|version] [args ...]") ++ os.exit(1) ++end ++ ++-- ++-- We've had some sort of command-line error. Print out the server options. ++-- ++function print_server_options(build_mode, option) ++ local cert_size = axtlsl.ssl_get_config(axtlsl.SSL_MAX_CERT_CFG_OFFSET) ++ local ca_cert_size = axtlsl.ssl_get_config( ++ axtlsl.SSL_MAX_CA_CERT_CFG_OFFSET) ++ ++ print("unknown option "..option) ++ print("usage: s_server [args ...]") ++ print(" -accept\t- port to accept on (default is 4433)") ++ print(" -quiet\t\t- No server output") ++ ++ if build_mode >= axtlsl.SSL_BUILD_SERVER_ONLY then ++ print(" -cert arg\t- certificate file to add (in addition to ".. ++ "default) to chain -") ++ print("\t\t Can repeat up to "..cert_size.." times") ++ print(" -key arg\t- Private key file to use - default DER format") ++ print(" -pass\t\t- private key file pass phrase source") ++ end ++ ++ if build_mode >= axtlsl.SSL_BUILD_ENABLE_VERIFICATION then ++ print(" -verify\t- turn on peer certificate verification") ++ print(" -CAfile arg\t- Certificate authority - default DER format") ++ print("\t\t Can repeat up to "..ca_cert_size.." times") ++ end ++ ++ if build_mode == axtlsl.SSL_BUILD_FULL_MODE then ++ print(" -debug\t\t- Print more output") ++ print(" -state\t\t- Show state messages") ++ print(" -show-rsa\t- Show RSA state") ++ end ++ ++ os.exit(1) ++end ++ ++-- ++-- We've had some sort of command-line error. Print out the client options. ++-- ++function print_client_options(build_mode, option) ++ local cert_size = axtlsl.ssl_get_config(axtlsl.SSL_MAX_CERT_CFG_OFFSET) ++ local ca_cert_size = axtlsl.ssl_get_config( ++ axtlsl.SSL_MAX_CA_CERT_CFG_OFFSET) ++ ++ print("unknown option "..option) ++ ++ if build_mode >= axtlsl.SSL_BUILD_ENABLE_CLIENT then ++ print("usage: s_client [args ...]") ++ print(" -connect host:port - who to connect to (default ".. ++ "is localhost:4433)") ++ print(" -verify\t- turn on peer certificate verification") ++ print(" -cert arg\t- certificate file to use - default DER format") ++ print(" -key arg\t- Private key file to use - default DER format") ++ print("\t\t Can repeat up to "..cert_size.." times") ++ print(" -CAfile arg\t- Certificate authority - default DER format") ++ print("\t\t Can repeat up to "..ca_cert_size.."times") ++ print(" -quiet\t\t- No client output") ++ print(" -pass\t\t- private key file pass phrase source") ++ print(" -reconnect\t- Drop and re-make the connection ".. ++ "with the same Session-ID") ++ ++ if build_mode == axtlsl.SSL_BUILD_FULL_MODE then ++ print(" -debug\t\t- Print more output") ++ print(" -state\t\t- Show state messages") ++ print(" -show-rsa\t- Show RSA state") ++ end ++ else ++ print("Change configuration to allow this feature") ++ end ++ ++ os.exit(1) ++end ++ ++-- Implement the SSL server logic. ++function do_server(build_mode) ++ local i = 2 ++ local v ++ local port = 4433 ++ local options = axtlsl.SSL_DISPLAY_CERTS ++ local quiet = false ++ local password = "" ++ local private_key_file = nil ++ local cert_size = axtlsl.ssl_get_config(axtlsl.SSL_MAX_CERT_CFG_OFFSET) ++ local ca_cert_size = axtlsl. ++ ssl_get_config(axtlsl.SSL_MAX_CA_CERT_CFG_OFFSET) ++ local cert = {} ++ local ca_cert = {} ++ ++ while i <= #arg do ++ if arg[i] == "-accept" then ++ if i >= #arg then ++ print_server_options(build_mode, arg[i]) ++ end ++ ++ i = i + 1 ++ port = arg[i] ++ elseif arg[i] == "-quiet" then ++ quiet = true ++ options = bit.band(options, bit.bnot(axtlsl.SSL_DISPLAY_CERTS)) ++ elseif build_mode >= axtlsl.SSL_BUILD_SERVER_ONLY then ++ if arg[i] == "-cert" then ++ if i >= #arg or #cert >= cert_size then ++ print_server_options(build_mode, arg[i]) ++ end ++ ++ i = i + 1 ++ table.insert(cert, arg[i]) ++ elseif arg[i] == "-key" then ++ if i >= #arg then ++ print_server_options(build_mode, arg[i]) ++ end ++ ++ i = i + 1 ++ private_key_file = arg[i] ++ options = bit.bor(options, axtlsl.SSL_NO_DEFAULT_KEY) ++ elseif arg[i] == "-pass" then ++ if i >= #arg then ++ print_server_options(build_mode, arg[i]) ++ end ++ ++ i = i + 1 ++ password = arg[i] ++ elseif build_mode >= axtlsl.SSL_BUILD_ENABLE_VERIFICATION then ++ if arg[i] == "-verify" then ++ options = bit.bor(options, axtlsl.SSL_CLIENT_AUTHENTICATION) ++ elseif arg[i] == "-CAfile" then ++ if i >= #arg or #ca_cert >= ca_cert_size then ++ print_server_options(build_mode, arg[i]) ++ end ++ ++ i = i + 1 ++ table.insert(ca_cert, arg[i]) ++ elseif build_mode == axtlsl.SSL_BUILD_FULL_MODE then ++ if arg[i] == "-debug" then ++ options = bit.bor(options, axtlsl.SSL_DISPLAY_BYTES) ++ elseif arg[i] == "-state" then ++ options = bit.bor(options, axtlsl.SSL_DISPLAY_STATES) ++ elseif arg[i] == "-show-rsa" then ++ options = bit.bor(options, axtlsl.SSL_DISPLAY_RSA) ++ else ++ print_server_options(build_mode, arg[i]) ++ end ++ else ++ print_server_options(build_mode, arg[i]) ++ end ++ else ++ print_server_options(build_mode, arg[i]) ++ end ++ else ++ print_server_options(build_mode, arg[i]) ++ end ++ ++ i = i + 1 ++ end ++ ++ -- Create socket for incoming connections ++ local server_sock = socket.try(socket.bind("*", port)) ++ ++ --------------------------------------------------------------------------- ++ -- This is where the interesting stuff happens. Up until now we've ++ -- just been setting up sockets etc. Now we do the SSL handshake. ++ --------------------------------------------------------------------------- ++ local ssl_ctx = axtlsl.ssl_ctx_new(options, axtlsl.SSL_DEFAULT_SVR_SESS) ++ if ssl_ctx == nil then error("Error: Server context is invalid") end ++ ++ if private_key_file ~= nil then ++ local obj_type = axtlsl.SSL_OBJ_RSA_KEY ++ ++ if string.find(private_key_file, ".p8") then ++ obj_type = axtlsl.SSL_OBJ_PKCS8 ++ end ++ ++ if string.find(private_key_file, ".p12") then ++ obj_type = axtlsl.SSL_OBJ_PKCS12 ++ end ++ ++ if axtlsl.ssl_obj_load(ssl_ctx, obj_type, private_key_file, ++ password) ~= axtlsl.SSL_OK then ++ error("Private key '" .. private_key_file .. "' is undefined.") ++ end ++ end ++ ++ for _, v in ipairs(cert) do ++ if axtlsl.ssl_obj_load(ssl_ctx, axtlsl.SSL_OBJ_X509_CERT, v, "") ~= ++ axtlsl.SSL_OK then ++ error("Certificate '"..v .. "' is undefined.") ++ end ++ end ++ ++ for _, v in ipairs(ca_cert) do ++ if axtlsl.ssl_obj_load(ssl_ctx, axtlsl.SSL_OBJ_X509_CACERT, v, "") ~= ++ axtlsl.SSL_OK then ++ error("Certificate '"..v .."' is undefined.") ++ end ++ end ++ ++ while true do ++ if not quiet then print("ACCEPT") end ++ local client_sock = server_sock:accept(); ++ local ssl = axtlsl.ssl_server_new(ssl_ctx, client_sock:getfd()) ++ ++ -- do the actual SSL handshake ++ local connected = false ++ local res ++ local buf ++ ++ while true do ++ socket.select({client_sock}, nil) ++ res, buf = axtlsl.ssl_read(ssl) ++ ++ if res == axtlsl.SSL_OK then -- connection established and ok ++ if axtlsl.ssl_handshake_status(ssl) == axtlsl.SSL_OK then ++ if not quiet and not connected then ++ display_session_id(ssl) ++ display_cipher(ssl) ++ end ++ connected = true ++ end ++ end ++ ++ if res > axtlsl.SSL_OK then ++ for _, v in ipairs(buf) do ++ io.write(string.format("%c", v)) ++ end ++ elseif res < axtlsl.SSL_OK then ++ if not quiet then ++ axtlsl.ssl_display_error(res) ++ end ++ break ++ end ++ end ++ ++ -- client was disconnected or the handshake failed. ++ print("CONNECTION CLOSED") ++ axtlsl.ssl_free(ssl) ++ client_sock:close() ++ end ++ ++ axtlsl.ssl_ctx_free(ssl_ctx) ++end ++ ++-- ++-- Implement the SSL client logic. ++-- ++function do_client(build_mode) ++ local i = 2 ++ local v ++ local port = 4433 ++ local options = ++ bit.bor(axtlsl.SSL_SERVER_VERIFY_LATER, axtlsl.SSL_DISPLAY_CERTS) ++ local private_key_file = nil ++ local reconnect = 0 ++ local quiet = false ++ local password = "" ++ local session_id = {} ++ local host = "127.0.0.1" ++ local cert_size = axtlsl.ssl_get_config(axtlsl.SSL_MAX_CERT_CFG_OFFSET) ++ local ca_cert_size = axtlsl. ++ ssl_get_config(axtlsl.SSL_MAX_CA_CERT_CFG_OFFSET) ++ local cert = {} ++ local ca_cert = {} ++ ++ while i <= #arg do ++ if arg[i] == "-connect" then ++ if i >= #arg then ++ print_client_options(build_mode, arg[i]) ++ end ++ ++ i = i + 1 ++ local t = string.find(arg[i], ":") ++ host = string.sub(arg[i], 1, t-1) ++ port = string.sub(arg[i], t+1) ++ elseif arg[i] == "-cert" then ++ if i >= #arg or #cert >= cert_size then ++ print_client_options(build_mode, arg[i]) ++ end ++ ++ i = i + 1 ++ table.insert(cert, arg[i]) ++ elseif arg[i] == "-key" then ++ if i >= #arg then ++ print_client_options(build_mode, arg[i]) ++ end ++ ++ i = i + 1 ++ private_key_file = arg[i] ++ options = bit.bor(options, axtlsl.SSL_NO_DEFAULT_KEY) ++ elseif arg[i] == "-CAfile" then ++ if i >= #arg or #ca_cert >= ca_cert_size then ++ print_client_options(build_mode, arg[i]) ++ end ++ ++ i = i + 1 ++ table.insert(ca_cert, arg[i]) ++ elseif arg[i] == "-verify" then ++ options = bit.band(options, ++ bit.bnot(axtlsl.SSL_SERVER_VERIFY_LATER)) ++ elseif arg[i] == "-reconnect" then ++ reconnect = 4 ++ elseif arg[i] == "-quiet" then ++ quiet = true ++ options = bit.band(options, bnot(axtlsl.SSL_DISPLAY_CERTS)) ++ elseif arg[i] == "-pass" then ++ if i >= #arg then ++ print_server_options(build_mode, arg[i]) ++ end ++ ++ i = i + 1 ++ password = arg[i] ++ elseif build_mode == axtlsl.SSL_BUILD_FULL_MODE then ++ if arg[i] == "-debug" then ++ options = bit.bor(options, axtlsl.SSL_DISPLAY_BYTES) ++ elseif arg[i] == "-state" then ++ options = bit.bor(axtlsl.SSL_DISPLAY_STATES) ++ elseif arg[i] == "-show-rsa" then ++ options = bit.bor(axtlsl.SSL_DISPLAY_RSA) ++ else -- don't know what this is ++ print_client_options(build_mode, arg[i]) ++ end ++ else -- don't know what this is ++ print_client_options(build_mode, arg[i]) ++ end ++ ++ i = i + 1 ++ end ++ ++ local client_sock = socket.try(socket.connect(host, port)) ++ local ssl ++ local res ++ ++ if not quiet then print("CONNECTED") end ++ ++ --------------------------------------------------------------------------- ++ -- This is where the interesting stuff happens. Up until now we've ++ -- just been setting up sockets etc. Now we do the SSL handshake. ++ --------------------------------------------------------------------------- ++ local ssl_ctx = axtlsl.ssl_ctx_new(options, axtlsl.SSL_DEFAULT_CLNT_SESS) ++ ++ if ssl_ctx == nil then ++ error("Error: Client context is invalid") ++ end ++ ++ if private_key_file ~= nil then ++ local obj_type = axtlsl.SSL_OBJ_RSA_KEY ++ ++ if string.find(private_key_file, ".p8") then ++ obj_type = axtlsl.SSL_OBJ_PKCS8 ++ end ++ ++ if string.find(private_key_file, ".p12") then ++ obj_type = axtlsl.SSL_OBJ_PKCS12 ++ end ++ ++ if axtlsl.ssl_obj_load(ssl_ctx, obj_type, private_key_file, ++ password) ~= axtlsl.SSL_OK then ++ error("Private key '"..private_key_file.."' is undefined.") ++ end ++ end ++ ++ for _, v in ipairs(cert) do ++ if axtlsl.ssl_obj_load(ssl_ctx, axtlsl.SSL_OBJ_X509_CERT, v, "") ~= ++ axtlsl.SSL_OK then ++ error("Certificate '"..v .. "' is undefined.") ++ end ++ end ++ ++ for _, v in ipairs(ca_cert) do ++ if axtlsl.ssl_obj_load(ssl_ctx, axtlsl.SSL_OBJ_X509_CACERT, v, "") ~= ++ axtlsl.SSL_OK then ++ error("Certificate '"..v .."' is undefined.") ++ end ++ end ++ ++ -- Try session resumption? ++ if reconnect ~= 0 then ++ local session_id = nil ++ local sess_id_size = 0 ++ ++ while reconnect > 0 do ++ reconnect = reconnect - 1 ++ ssl = axtlsl.ssl_client_new(ssl_ctx, ++ client_sock:getfd(), session_id, sess_id_size) ++ ++ res = axtlsl.ssl_handshake_status(ssl) ++ if res ~= axtlsl.SSL_OK then ++ if not quiet then axtlsl.ssl_display_error(res) end ++ axtlsl.ssl_free(ssl) ++ os.exit(1) ++ end ++ ++ display_session_id(ssl) ++ session_id = axtlsl.ssl_get_session_id(ssl) ++ sess_id_size = axtlsl.ssl_get_session_id_size(ssl) ++ ++ if reconnect > 0 then ++ axtlsl.ssl_free(ssl) ++ client_sock:close() ++ client_sock = socket.try(socket.connect(host, port)) ++ end ++ ++ end ++ else ++ ssl = axtlsl.ssl_client_new(ssl_ctx, client_sock:getfd(), nil, 0) ++ end ++ ++ -- check the return status ++ res = axtlsl.ssl_handshake_status(ssl) ++ if res ~= axtlsl.SSL_OK then ++ if not quiet then axtlsl.ssl_display_error(res) end ++ os.exit(1) ++ end ++ ++ if not quiet then ++ local common_name = axtlsl.ssl_get_cert_dn(ssl, ++ axtlsl.SSL_X509_CERT_COMMON_NAME) ++ ++ if common_name ~= nil then ++ print("Common Name:\t\t\t"..common_name) ++ end ++ ++ display_session_id(ssl) ++ display_cipher(ssl) ++ end ++ ++ while true do ++ local line = io.read() ++ if line == nil then break end ++ local bytes = {} ++ ++ for i = 1, #line do ++ bytes[i] = line.byte(line, i) ++ end ++ ++ bytes[#line+1] = 10 -- add carriage return, null ++ bytes[#line+2] = 0 ++ ++ res = axtlsl.ssl_write(ssl, bytes, #bytes) ++ if res < axtlsl.SSL_OK then ++ if not quiet then axtlsl.ssl_display_error(res) end ++ break ++ end ++ end ++ ++ axtlsl.ssl_ctx_free(ssl_ctx) ++ client_sock:close() ++end ++ ++-- ++-- Display what cipher we are using ++-- ++function display_cipher(ssl) ++ io.write("CIPHER is ") ++ local cipher_id = axtlsl.ssl_get_cipher_id(ssl) ++ ++ if cipher_id == axtlsl.SSL_AES128_SHA then ++ print("AES128-SHA") ++ elseif cipher_id == axtlsl.SSL_AES256_SHA then ++ print("AES256-SHA") ++ elseif axtlsl.SSL_RC4_128_SHA then ++ print("RC4-SHA") ++ elseif axtlsl.SSL_RC4_128_MD5 then ++ print("RC4-MD5") ++ else ++ print("Unknown - "..cipher_id) ++ end ++end ++ ++-- ++-- Display what session id we have. ++-- ++function display_session_id(ssl) ++ local session_id = axtlsl.ssl_get_session_id(ssl) ++ local v ++ ++ if #session_id > 0 then ++ print("-----BEGIN SSL SESSION PARAMETERS-----") ++ for _, v in ipairs(session_id) do ++ io.write(string.format("%02x", v)) ++ end ++ print("\n-----END SSL SESSION PARAMETERS-----") ++ end ++end ++ ++-- ++-- Main entry point. Doesn't do much except works out whether we are a client ++-- or a server. ++-- ++if #arg == 0 or (arg[1] ~= "s_server" and arg[1] ~= "s_client") then ++ print_options(#arg > 0 and arg[1] or "") ++end ++ ++local build_mode = axtlsl.ssl_get_config(axtlsl.SSL_BUILD_MODE) ++_ = arg[1] == "s_server" and do_server(build_mode) or do_client(build_mode) ++os.exit(0) ++ +diff --git a/feeds/luci/libs/luci-lib-nixio/axTLS/samples/perl/Makefile b/feeds/luci/libs/luci-lib-nixio/axTLS/samples/perl/Makefile +new file mode 100644 +index 0000000..5200c43 +--- /dev/null ++++ b/feeds/luci/libs/luci-lib-nixio/axTLS/samples/perl/Makefile +@@ -0,0 +1,43 @@ ++# ++# Copyright (c) 2007, Cameron Rich ++# ++# All rights reserved. ++# ++# Redistribution and use in source and binary forms, with or without ++# modification, are permitted provided that the following conditions are met: ++# ++# * Redistributions of source code must retain the above copyright notice, ++# this list of conditions and the following disclaimer. ++# * 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. ++# * Neither the name of the axTLS project nor the names of its ++# contributors may be used to endorse or promote products derived ++# from this software without specific prior written permission. ++# ++# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ++# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT ++# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR ++# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR ++# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, ++# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED ++# TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, ++# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY ++# OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING ++# NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF ++# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ++# ++ ++include ../../config/.config ++include ../../config/makefile.conf ++ ++all: samples ++TARGET=../../$(STAGE)/axssl.pl ++samples: $(TARGET) ++ ++$(TARGET): axssl.pl ++ install $< $@ ++ ++clean:: ++ -@rm -f $(TARGET) ++ +diff --git a/feeds/luci/libs/luci-lib-nixio/axTLS/samples/perl/axssl.pl b/feeds/luci/libs/luci-lib-nixio/axTLS/samples/perl/axssl.pl +new file mode 100755 +index 0000000..e49d522 +--- /dev/null ++++ b/feeds/luci/libs/luci-lib-nixio/axTLS/samples/perl/axssl.pl +@@ -0,0 +1,634 @@ ++#!/usr/bin/perl -w ++# ++# Copyright (c) 2007, Cameron Rich ++# ++# All rights reserved. ++# ++# Redistribution and use in source and binary forms, with or without ++# modification, are permitted provided that the following conditions are met: ++# ++# * Redistributions of source code must retain the above copyright notice, ++# this list of conditions and the following disclaimer. ++# * 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. ++# * Neither the name of the axTLS project nor the names of its ++# contributors may be used to endorse or promote products derived ++# from this software without specific prior written permission. ++# ++# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ++# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT ++# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR ++# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR ++# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, ++# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED ++# TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, ++# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY ++# OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING ++# NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF ++# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ++# ++ ++# ++# Demonstrate the use of the axTLS library in Perl with a set of ++# command-line parameters similar to openssl. In fact, openssl clients ++# should be able to communicate with axTLS servers and visa-versa. ++# ++# This code has various bits enabled depending on the configuration. To enable ++# the most interesting version, compile with the 'full mode' enabled. ++# ++# To see what options you have, run the following: ++# > [perl] axssl s_server -? ++# > [perl] axssl s_client -? ++# ++# The axtls/axtlsp shared libraries must be in the same directory or be found ++# by the OS. axtlsp.pm must be in this directory or be in @INC. ++# ++# Under Win32, ActivePerl was used (see ++# http://www.activestate.com/Products/ActivePerl/?mp=1) ++# ++use axtlsp; ++use IO::Socket; ++ ++# To get access to Win32 file descriptor stuff ++my $is_win32 = 0; ++ ++if ($^O eq "MSWin32") ++{ ++ eval("use Win32API::File 0.08 qw( :ALL )"); ++ $is_win32 = 1; ++} ++ ++use strict; ++ ++# ++# Win32 has some problems with socket handles ++# ++sub get_native_sock ++{ ++ my ($sock) = @_; ++ return $is_win32 ? FdGetOsFHandle($sock) : $sock; ++} ++ ++# print version? ++if ($#ARGV == 0 && $ARGV[0] eq "version") ++{ ++ printf("axssl.pl ".axtlsp::ssl_version()."\n"); ++ exit 0; ++} ++ ++# ++# Main entry point. Doesn't do much except works out whether we are a client ++# or a server. ++# ++print_options($#ARGV > -1 ? $ARGV[0] : "") ++ if ($#ARGV < 0 || ($ARGV[0] ne "s_server" && $ARGV[0] ne "s_client")); ++ ++ ++# Cygwin/Win32 issue - flush our output continuously ++select STDOUT; ++local $|=1; ++ ++my $build_mode = axtlsp::ssl_get_config($axtlsp::SSL_BUILD_MODE); ++$ARGV[0] eq "s_server" ? do_server($build_mode) : do_client($build_mode); ++ ++# ++# Implement the SSL server logic. ++# ++sub do_server ++{ ++ my ($build_mode) = @_; ++ my $i = 1; ++ my $port = 4433; ++ my $options = $axtlsp::SSL_DISPLAY_CERTS; ++ my $quiet = 0; ++ my $password = undef; ++ my $private_key_file = undef; ++ my $cert_size = axtlsp::ssl_get_config($axtlsp::SSL_MAX_CERT_CFG_OFFSET); ++ my $ca_cert_size = axtlsp::ssl_get_config( ++ $axtlsp::SSL_MAX_CA_CERT_CFG_OFFSET); ++ my @cert; ++ my @ca_cert; ++ ++ while ($i <= $#ARGV) ++ { ++ if ($ARGV[$i] eq "-accept") ++ { ++ print_server_options($build_mode, $ARGV[$i]) if $i >= $#ARGV; ++ $port = $ARGV[++$i]; ++ } ++ elsif ($ARGV[$i] eq "-quiet") ++ { ++ $quiet = 1; ++ $options &= ~$axtlsp::SSL_DISPLAY_CERTS; ++ } ++ elsif ($build_mode >= $axtlsp::SSL_BUILD_SERVER_ONLY) ++ { ++ if ($ARGV[$i] eq "-cert") ++ { ++ print_server_options($build_mode, $ARGV[$i]) ++ if $i >= $#ARGV || $#cert >= $cert_size-1; ++ ++ push @cert, $ARGV[++$i]; ++ } ++ elsif ($ARGV[$i] eq "-key") ++ { ++ print_server_options($build_mode, $ARGV[$i]) if $i >= $#ARGV; ++ $private_key_file = $ARGV[++$i]; ++ $options |= $axtlsp::SSL_NO_DEFAULT_KEY; ++ } ++ elsif ($ARGV[$i] eq "-pass") ++ { ++ print_server_options($build_mode, $ARGV[$i]) if $i >= $#ARGV; ++ $password = $ARGV[++$i]; ++ } ++ elsif ($build_mode >= $axtlsp::SSL_BUILD_ENABLE_VERIFICATION) ++ { ++ if ($ARGV[$i] eq "-verify") ++ { ++ $options |= $axtlsp::SSL_CLIENT_AUTHENTICATION; ++ } ++ elsif ($ARGV[$i] eq "-CAfile") ++ { ++ print_server_options($build_mode, $ARGV[$i]) ++ if $i >= $#ARGV || $#ca_cert >= $ca_cert_size-1; ++ push @ca_cert, $ARGV[++$i]; ++ } ++ elsif ($build_mode == $axtlsp::SSL_BUILD_FULL_MODE) ++ { ++ if ($ARGV[$i] eq "-debug") ++ { ++ $options |= $axtlsp::SSL_DISPLAY_BYTES; ++ } ++ elsif ($ARGV[$i] eq "-state") ++ { ++ $options |= $axtlsp::SSL_DISPLAY_STATES; ++ } ++ elsif ($ARGV[$i] eq "-show-rsa") ++ { ++ $options |= $axtlsp::SSL_DISPLAY_RSA; ++ } ++ else ++ { ++ print_server_options($build_mode, $ARGV[$i]); ++ } ++ } ++ else ++ { ++ print_server_options($build_mode, $ARGV[$i]); ++ } ++ } ++ else ++ { ++ print_server_options($build_mode, $ARGV[$i]); ++ } ++ } ++ else ++ { ++ print_server_options($build_mode, $ARGV[$i]); ++ } ++ ++ $i++; ++ } ++ ++ # Create socket for incoming connections ++ my $server_sock = IO::Socket::INET->new(Proto => 'tcp', ++ LocalPort => $port, ++ Listen => 1, ++ Reuse => 1) or die $!; ++ ++ ########################################################################### ++ # This is where the interesting stuff happens. Up until now we've ++ # just been setting up sockets etc. Now we do the SSL handshake. ++ ########################################################################### ++ my $ssl_ctx = axtlsp::ssl_ctx_new($options, $axtlsp::SSL_DEFAULT_SVR_SESS); ++ die "Error: Server context is invalid" if not defined $ssl_ctx; ++ ++ if (defined $private_key_file) ++ { ++ my $obj_type = $axtlsp::SSL_OBJ_RSA_KEY; ++ ++ $obj_type = $axtlsp::SSL_OBJ_PKCS8 if $private_key_file =~ /.p8$/; ++ $obj_type = $axtlsp::SSL_OBJ_PKCS12 if $private_key_file =~ /.p12$/; ++ ++ die "Private key '$private_key_file' is undefined." if ++ axtlsp::ssl_obj_load($ssl_ctx, $obj_type, ++ $private_key_file, $password); ++ } ++ ++ foreach (@cert) ++ { ++ die "Certificate '$_' is undefined." ++ if axtlsp::ssl_obj_load($ssl_ctx, $axtlsp::SSL_OBJ_X509_CERT, ++ $_, undef) != $axtlsp::SSL_OK; ++ } ++ ++ foreach (@ca_cert) ++ { ++ die "Certificate '$_' is undefined." ++ if axtlsp::ssl_obj_load($ssl_ctx, $axtlsp::SSL_OBJ_X509_CACERT, ++ $_, undef) != $axtlsp::SSL_OK; ++ } ++ ++ for (;;) ++ { ++ printf("ACCEPT\n") if not $quiet; ++ my $client_sock = $server_sock->accept; ++ my $native_sock = get_native_sock($client_sock->fileno); ++ ++ # This doesn't work in Win32 - need to get file descriptor from socket. ++ my $ssl = axtlsp::ssl_server_new($ssl_ctx, $native_sock); ++ ++ # do the actual SSL handshake ++ my $res; ++ my $buf; ++ my $connected = 0; ++ ++ while (1) ++ { ++ ($res, $buf) = axtlsp::ssl_read($ssl, undef); ++ last if $res < $axtlsp::SSL_OK; ++ ++ if ($res == $axtlsp::SSL_OK) # connection established and ok ++ { ++ if (axtlsp::ssl_handshake_status($ssl) == $axtlsp::SSL_OK) ++ { ++ if (!$quiet && !$connected) ++ { ++ display_session_id($ssl); ++ display_cipher($ssl); ++ } ++ ++ $connected = 1; ++ } ++ } ++ ++ if ($res > $axtlsp::SSL_OK) ++ { ++ printf($$buf); ++ } ++ elsif ($res < $axtlsp::SSL_OK) ++ { ++ axtlsp::ssl_display_error($res) if not $quiet; ++ last; ++ } ++ } ++ ++ # client was disconnected or the handshake failed. ++ printf("CONNECTION CLOSED\n") if not $quiet; ++ axtlsp::ssl_free($ssl); ++ $client_sock->close; ++ } ++ ++ axtlsp::ssl_ctx_free($ssl_ctx); ++} ++ ++# ++# Implement the SSL client logic. ++# ++sub do_client ++{ ++ my ($build_mode) = @_; ++ my $i = 1; ++ my $port = 4433; ++ my $options = $axtlsp::SSL_SERVER_VERIFY_LATER|$axtlsp::SSL_DISPLAY_CERTS; ++ my $private_key_file = undef; ++ my $reconnect = 0; ++ my $quiet = 0; ++ my $password = undef; ++ my @session_id; ++ my $host = "127.0.0.1"; ++ my @cert; ++ my @ca_cert; ++ my $cert_size = axtlsp::ssl_get_config( ++ $axtlsp::SSL_MAX_CERT_CFG_OFFSET); ++ my $ca_cert_size = axtlsp::ssl_get_config( ++ $axtlsp::SSL_MAX_CA_CERT_CFG_OFFSET); ++ ++ while ($i <= $#ARGV) ++ { ++ if ($ARGV[$i] eq "-connect") ++ { ++ print_client_options($build_mode, $ARGV[$i]) if $i >= $#ARGV; ++ ($host, $port) = split(':', $ARGV[++$i]); ++ } ++ elsif ($ARGV[$i] eq "-cert") ++ { ++ print_client_options($build_mode, $ARGV[$i]) ++ if $i >= $#ARGV || $#cert >= $cert_size-1; ++ ++ push @cert, $ARGV[++$i]; ++ } ++ elsif ($ARGV[$i] eq "-key") ++ { ++ print_client_options($build_mode, $ARGV[$i]) if $i >= $#ARGV; ++ $private_key_file = $ARGV[++$i]; ++ $options |= $axtlsp::SSL_NO_DEFAULT_KEY; ++ } ++ elsif ($ARGV[$i] eq "-CAfile") ++ { ++ print_client_options($build_mode, $ARGV[$i]) ++ if $i >= $#ARGV || $#ca_cert >= $ca_cert_size-1; ++ ++ push @ca_cert, $ARGV[++$i]; ++ } ++ elsif ($ARGV[$i] eq "-verify") ++ { ++ $options &= ~$axtlsp::SSL_SERVER_VERIFY_LATER; ++ } ++ elsif ($ARGV[$i] eq "-reconnect") ++ { ++ $reconnect = 4; ++ } ++ elsif ($ARGV[$i] eq "-quiet") ++ { ++ $quiet = 1; ++ $options &= ~$axtlsp::SSL_DISPLAY_CERTS; ++ } ++ elsif ($ARGV[$i] eq "-pass") ++ { ++ print_server_options($build_mode, $ARGV[$i]) if $i >= $#ARGV; ++ $password = $ARGV[++$i]; ++ } ++ elsif ($build_mode == $axtlsp::SSL_BUILD_FULL_MODE) ++ { ++ if ($ARGV[$i] eq "-debug") ++ { ++ $options |= $axtlsp::SSL_DISPLAY_BYTES; ++ } ++ elsif ($ARGV[$i] eq "-state") ++ { ++ $options |= $axtlsp::SSL_DISPLAY_STATES; ++ } ++ elsif ($ARGV[$i] eq "-show-rsa") ++ { ++ $options |= $axtlsp::SSL_DISPLAY_RSA; ++ } ++ else # don't know what this is ++ { ++ print_client_options($build_mode, $ARGV[$i]); ++ } ++ } ++ else # don't know what this is ++ { ++ print_client_options($build_mode, $ARGV[$i]); ++ } ++ ++ $i++; ++ } ++ ++ my $client_sock = new IO::Socket::INET ( ++ PeerAddr => $host, PeerPort => $port, Proto => 'tcp') ++ || die ("no socket: $!"); ++ my $ssl; ++ my $res; ++ my $native_sock = get_native_sock($client_sock->fileno); ++ ++ printf("CONNECTED\n") if not $quiet; ++ ++ ########################################################################### ++ # This is where the interesting stuff happens. Up until now we've ++ # just been setting up sockets etc. Now we do the SSL handshake. ++ ########################################################################### ++ my $ssl_ctx = axtlsp::ssl_ctx_new($options, $axtlsp::SSL_DEFAULT_CLNT_SESS); ++ die "Error: Client context is invalid" if not defined $ssl_ctx; ++ ++ if (defined $private_key_file) ++ { ++ my $obj_type = $axtlsp::SSL_OBJ_RSA_KEY; ++ ++ $obj_type = $axtlsp::SSL_OBJ_PKCS8 if $private_key_file =~ /.p8$/; ++ $obj_type = $axtlsp::SSL_OBJ_PKCS12 if $private_key_file =~ /.p12$/; ++ ++ die "Private key '$private_key_file' is undefined." if ++ axtlsp::ssl_obj_load($ssl_ctx, $obj_type, ++ $private_key_file, $password); ++ } ++ ++ foreach (@cert) ++ { ++ die "Certificate '$_' is undefined." ++ if axtlsp::ssl_obj_load($ssl_ctx, $axtlsp::SSL_OBJ_X509_CERT, ++ $_, undef) != $axtlsp::SSL_OK; ++ } ++ ++ foreach (@ca_cert) ++ { ++ die "Certificate '$_' is undefined." ++ if axtlsp::ssl_obj_load($ssl_ctx, $axtlsp::SSL_OBJ_X509_CACERT, ++ $_, undef) != $axtlsp::SSL_OK; ++ } ++ ++ # Try session resumption? ++ if ($reconnect) ++ { ++ my $session_id = undef; ++ my $sess_id_size = 0; ++ ++ while ($reconnect--) ++ { ++ $ssl = axtlsp::ssl_client_new($ssl_ctx, $native_sock, ++ $session_id, $sess_id_size); ++ ++ $res = axtlsp::ssl_handshake_status($ssl); ++ if ($res != $axtlsp::SSL_OK) ++ { ++ axtlsp::ssl_display_error($res) if !$quiet; ++ axtlsp::ssl_free($ssl); ++ exit 1; ++ } ++ ++ display_session_id($ssl); ++ $session_id = axtlsp::ssl_get_session_id($ssl); ++ ++ if ($reconnect) ++ { ++ axtlsp::ssl_free($ssl); ++ $client_sock->close; ++ $client_sock = new IO::Socket::INET ( ++ PeerAddr => $host, PeerPort => $port, Proto => 'tcp') ++ || die ("no socket: $!"); ++ ++ } ++ } ++ } ++ else ++ { ++ $ssl = axtlsp::ssl_client_new($ssl_ctx, $native_sock, undef, 0); ++ } ++ ++ # check the return status ++ $res = axtlsp::ssl_handshake_status($ssl); ++ if ($res != $axtlsp::SSL_OK) ++ { ++ axtlsp::ssl_display_error($res) if not $quiet; ++ exit 1; ++ } ++ ++ if (!$quiet) ++ { ++ my $common_name = axtlsp::ssl_get_cert_dn($ssl, ++ $axtlsp::SSL_X509_CERT_COMMON_NAME); ++ ++ printf("Common Name:\t\t\t%s\n", $common_name) if defined $common_name; ++ display_session_id($ssl); ++ display_cipher($ssl); ++ } ++ ++ while () ++ { ++ my $cstring = pack("a*x", $_); # add null terminator ++ $res = axtlsp::ssl_write($ssl, \$cstring, length($cstring)); ++ if ($res < $axtlsp::SSL_OK) ++ { ++ axtlsp::ssl_display_error($res) if not $quiet; ++ last; ++ } ++ } ++ ++ axtlsp::ssl_ctx_free($ssl_ctx); ++ $client_sock->close; ++} ++ ++# ++# We've had some sort of command-line error. Print out the basic options. ++# ++sub print_options ++{ ++ my ($option) = @_; ++ printf("axssl: Error: '%s' is an invalid command.\n", $option); ++ printf("usage: axssl [s_server|s_client|version] [args ...]\n"); ++ exit 1; ++} ++ ++# ++# We've had some sort of command-line error. Print out the server options. ++# ++sub print_server_options ++{ ++ my ($build_mode, $option) = @_; ++ my $cert_size = axtlsp::ssl_get_config($axtlsp::SSL_MAX_CERT_CFG_OFFSET); ++ my $ca_cert_size = axtlsp::ssl_get_config( ++ $axtlsp::SSL_MAX_CA_CERT_CFG_OFFSET); ++ ++ printf("unknown option %s\n", $option); ++ printf("usage: s_server [args ...]\n"); ++ printf(" -accept arg\t- port to accept on (default is 4433)\n"); ++ printf(" -quiet\t\t- No server output\n"); ++ ++ if ($build_mode >= $axtlsp::SSL_BUILD_SERVER_ONLY) ++ { ++ printf(" -cert arg\t- certificate file to add (in addition to default)". ++ " to chain -\n". ++ "\t\t Can repeat up to %d times\n", $cert_size); ++ printf(" -key arg\t- Private key file to use - default DER format\n"); ++ printf(" -pass\t\t- private key file pass phrase source\n"); ++ } ++ ++ if ($build_mode >= $axtlsp::SSL_BUILD_ENABLE_VERIFICATION) ++ { ++ printf(" -verify\t- turn on peer certificate verification\n"); ++ printf(" -CAfile arg\t- Certificate authority - default DER format\n"); ++ printf("\t\t Can repeat up to %d times\n", $ca_cert_size); ++ } ++ ++ if ($build_mode == $axtlsp::SSL_BUILD_FULL_MODE) ++ { ++ printf(" -debug\t\t- Print more output\n"); ++ printf(" -state\t\t- Show state messages\n"); ++ printf(" -show-rsa\t- Show RSA state\n"); ++ } ++ ++ exit 1; ++} ++ ++# ++# We've had some sort of command-line error. Print out the client options. ++# ++sub print_client_options ++{ ++ my ($build_mode, $option) = @_; ++ my $cert_size = axtlsp::ssl_get_config($axtlsp::SSL_MAX_CERT_CFG_OFFSET); ++ my $ca_cert_size = axtlsp::ssl_get_config( ++ $axtlsp::SSL_MAX_CA_CERT_CFG_OFFSET); ++ ++ printf("unknown option %s\n", $option); ++ ++ if ($build_mode >= $axtlsp::SSL_BUILD_ENABLE_CLIENT) ++ { ++ printf("usage: s_client [args ...]\n"); ++ printf(" -connect host:port - who to connect to (default ". ++ "is localhost:4433)\n"); ++ printf(" -verify\t- turn on peer certificate verification\n"); ++ printf(" -cert arg\t- certificate file to use - default DER format\n"); ++ printf(" -key arg\t- Private key file to use - default DER format\n"); ++ printf("\t\t Can repeat up to %d times\n", $cert_size); ++ printf(" -CAfile arg\t- Certificate authority - default DER format\n"); ++ printf("\t\t Can repeat up to %d times\n", $ca_cert_size); ++ printf(" -quiet\t\t- No client output\n"); ++ printf(" -pass\t\t- private key file pass phrase source\n"); ++ printf(" -reconnect\t- Drop and re-make the connection ". ++ "with the same Session-ID\n"); ++ ++ if ($build_mode == $axtlsp::SSL_BUILD_FULL_MODE) ++ { ++ printf(" -debug\t\t- Print more output\n"); ++ printf(" -state\t\t- Show state messages\n"); ++ printf(" -show-rsa\t- Show RSA state\n"); ++ } ++ } ++ else ++ { ++ printf("Change configuration to allow this feature\n"); ++ } ++ ++ exit 1; ++} ++ ++# ++# Display what cipher we are using ++# ++sub display_cipher ++{ ++ my ($ssl) = @_; ++ printf("CIPHER is "); ++ my $cipher_id = axtlsp::ssl_get_cipher_id($ssl); ++ ++ if ($cipher_id == $axtlsp::SSL_AES128_SHA) ++ { ++ printf("AES128-SHA"); ++ } ++ elsif ($cipher_id == $axtlsp::SSL_AES256_SHA) ++ { ++ printf("AES256-SHA"); ++ } ++ elsif ($axtlsp::SSL_RC4_128_SHA) ++ { ++ printf("RC4-SHA"); ++ } ++ elsif ($axtlsp::SSL_RC4_128_MD5) ++ { ++ printf("RC4-MD5"); ++ } ++ else ++ { ++ printf("Unknown - %d", $cipher_id); ++ } ++ ++ printf("\n"); ++} ++ ++# ++# Display what session id we have. ++# ++sub display_session_id ++{ ++ my ($ssl) = @_; ++ my $session_id = axtlsp::ssl_get_session_id($ssl); ++ if (length($$session_id) > 0) ++ { ++ printf("-----BEGIN SSL SESSION PARAMETERS-----\n"); ++ printf(unpack("H*", $$session_id)); ++ printf("\n-----END SSL SESSION PARAMETERS-----\n"); ++ } ++} +diff --git a/feeds/luci/libs/luci-lib-nixio/axTLS/samples/vbnet/Makefile b/feeds/luci/libs/luci-lib-nixio/axTLS/samples/vbnet/Makefile +new file mode 100644 +index 0000000..0984d4e +--- /dev/null ++++ b/feeds/luci/libs/luci-lib-nixio/axTLS/samples/vbnet/Makefile +@@ -0,0 +1,48 @@ ++# ++# Copyright (c) 2007, Cameron Rich ++# ++# All rights reserved. ++# ++# Redistribution and use in source and binary forms, with or without ++# modification, are permitted provided that the following conditions are met: ++# ++# * Redistributions of source code must retain the above copyright notice, ++# this list of conditions and the following disclaimer. ++# * 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. ++# * Neither the name of the axTLS project nor the names of its ++# contributors may be used to endorse or promote products derived ++# from this software without specific prior written permission. ++# ++# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ++# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT ++# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR ++# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR ++# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, ++# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED ++# TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, ++# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY ++# OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING ++# NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF ++# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ++# ++ ++include ../../config/.config ++include ../../config/makefile.conf ++include ../../config/makefile.dotnet.conf ++ ++# only build on Win32 platforms ++ifdef GO_DOT_NET ++all : sample ++TARGET=../../$(STAGE)/axssl.vbnet.exe ++sample : $(TARGET) ++ ++$(TARGET): ../../bindings/vbnet/axTLSvb.vb ../../bindings/vbnet/axInterface.vb axssl.vb ++ vbc.exe /r:"`cygpath -w "$(CONFIG_DOT_NET_FRAMEWORK_BASE)/System.dll"`" /nologo /t:exe /out:"`cygpath -w $@`" $(foreach file, $^, "`cygpath -w $(file)`") ++ ++endif # ARCH ++ ++clean:: ++ -@rm -f $(TARGET) ++ +diff --git a/feeds/luci/libs/luci-lib-nixio/axTLS/samples/vbnet/axssl.vb b/feeds/luci/libs/luci-lib-nixio/axTLS/samples/vbnet/axssl.vb +new file mode 100644 +index 0000000..1b423c8 +--- /dev/null ++++ b/feeds/luci/libs/luci-lib-nixio/axTLS/samples/vbnet/axssl.vb +@@ -0,0 +1,702 @@ ++' ++' Copyright (c) 2007, Cameron Rich ++' ++' All rights reserved. ++' ++' Redistribution and use in source and binary forms, with or without ++' modification, are permitted provided that the following conditions are met: ++' ++' * Redistributions of source code must retain the above copyright notice, ++' this list of conditions and the following disclaimer. ++' * 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. ++' * Neither the name of the axTLS project nor the names of its ++' contributors may be used to endorse or promote products derived ++' from this software without specific prior written permission. ++' ++' THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ++' "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT ++' LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR ++' A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR ++' CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, ++' SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED ++' TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, ++' DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY ++' OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING ++' NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF ++' THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ++' ++ ++' ++' Demonstrate the use of the axTLS library in VB.NET with a set of ++' command-line parameters similar to openssl. In fact, openssl clients ++' should be able to communicate with axTLS servers and visa-versa. ++' ++' This code has various bits enabled depending on the configuration. To enable ++' the most interesting version, compile with the 'full mode' enabled. ++' ++' To see what options you have, run the following: ++' > axssl.vbnet.exe s_server -? ++' > axssl.vbnet.exe s_client -? ++' ++' The axtls shared library must be in the same directory or be found ++' by the OS. ++' ++ ++Imports System ++Imports System.Net ++Imports System.Net.Sockets ++Imports Microsoft.VisualBasic ++Imports axTLSvb ++ ++Public Class axssl ++ ' ++ ' do_server() ++ ' ++ Public Sub do_server(ByVal build_mode As Integer, _ ++ ByVal args() As String) ++ Dim i As Integer = 1 ++ Dim port As Integer = 4433 ++ Dim options As Integer = axtls.SSL_DISPLAY_CERTS ++ Dim quiet As Boolean = False ++ Dim password As String = Nothing ++ Dim private_key_file As String = Nothing ++ ++ ' organise the cert/ca_cert lists ++ Dim cert_size As Integer = SSLUtil.MaxCerts() ++ Dim ca_cert_size As Integer = SSLUtil.MaxCACerts() ++ Dim cert(cert_size) As String ++ Dim ca_cert(ca_cert_size) As String ++ Dim cert_index As Integer = 0 ++ Dim ca_cert_index As Integer = 0 ++ ++ While i < args.Length ++ If args(i) = "-accept" Then ++ If i >= args.Length-1 ++ print_server_options(build_mode, args(i)) ++ End If ++ ++ i += 1 ++ port = Int32.Parse(args(i)) ++ ElseIf args(i) = "-quiet" ++ quiet = True ++ options = options And Not axtls.SSL_DISPLAY_CERTS ++ ElseIf build_mode >= axtls.SSL_BUILD_SERVER_ONLY ++ If args(i) = "-cert" ++ If i >= args.Length-1 Or cert_index >= cert_size ++ print_server_options(build_mode, args(i)) ++ End If ++ ++ i += 1 ++ cert(cert_index) = args(i) ++ cert_index += 1 ++ ElseIf args(i) = "-key" ++ If i >= args.Length-1 ++ print_server_options(build_mode, args(i)) ++ End If ++ ++ i += 1 ++ private_key_file = args(i) ++ options = options Or axtls.SSL_NO_DEFAULT_KEY ++ ElseIf args(i) = "-pass" ++ If i >= args.Length-1 ++ print_server_options(build_mode, args(i)) ++ End If ++ ++ i += 1 ++ password = args(i) ++ ElseIf build_mode >= axtls.SSL_BUILD_ENABLE_VERIFICATION ++ If args(i) = "-verify" Then ++ options = options Or axtls.SSL_CLIENT_AUTHENTICATION ++ ElseIf args(i) = "-CAfile" ++ If i >= args.Length-1 Or _ ++ ca_cert_index >= ca_cert_size Then ++ print_server_options(build_mode, args(i)) ++ End If ++ ++ i += 1 ++ ca_cert(ca_cert_index) = args(i) ++ ca_cert_index += 1 ++ ElseIf build_mode = axtls.SSL_BUILD_FULL_MODE ++ If args(i) = "-debug" Then ++ options = options Or axtls.SSL_DISPLAY_BYTES ++ ElseIf args(i) = "-state" ++ options = options Or axtls.SSL_DISPLAY_STATES ++ ElseIf args(i) = "-show-rsa" ++ options = options Or axtls.SSL_DISPLAY_RSA ++ Else ++ print_server_options(build_mode, args(i)) ++ End If ++ Else ++ print_server_options(build_mode, args(i)) ++ End If ++ Else ++ print_server_options(build_mode, args(i)) ++ End If ++ End If ++ ++ i += 1 ++ End While ++ ++ ' Create socket for incoming connections ++ Dim ep As IPEndPoint = New IPEndPoint(IPAddress.Any, port) ++ Dim server_sock As TcpListener = New TcpListener(ep) ++ server_sock.Start() ++ ++ '********************************************************************* ++ ' This is where the interesting stuff happens. Up until now we've ++ ' just been setting up sockets etc. Now we do the SSL handshake. ++ '*********************************************************************/ ++ Dim ssl_ctx As SSLServer = New SSLServer(options, _ ++ axtls.SSL_DEFAULT_SVR_SESS) ++ ++ If ssl_ctx Is Nothing Then ++ Console.Error.WriteLine("Error: Server context is invalid") ++ Environment.Exit(1) ++ End If ++ ++ If private_key_file <> Nothing Then ++ Dim obj_type As Integer = axtls.SSL_OBJ_RSA_KEY ++ ++ If private_key_file.EndsWith(".p8") Then ++ obj_type = axtls.SSL_OBJ_PKCS8 ++ Else If (private_key_file.EndsWith(".p12")) ++ obj_type = axtls.SSL_OBJ_PKCS12 ++ End If ++ ++ If ssl_ctx.ObjLoad(obj_type, private_key_file, _ ++ password) <> axtls.SSL_OK Then ++ Console.Error.WriteLine("Error: Private key '" & _ ++ private_key_file & "' is undefined.") ++ Environment.Exit(1) ++ End If ++ End If ++ ++ For i = 0 To cert_index-1 ++ If ssl_ctx.ObjLoad(axtls.SSL_OBJ_X509_CERT, _ ++ cert(i), Nothing) <> axtls.SSL_OK Then ++ Console.WriteLine("Certificate '" & cert(i) & _ ++ "' is undefined.") ++ Environment.Exit(1) ++ End If ++ Next ++ ++ For i = 0 To ca_cert_index-1 ++ If ssl_ctx.ObjLoad(axtls.SSL_OBJ_X509_CACERT, _ ++ ca_cert(i), Nothing) <> axtls.SSL_OK Then ++ Console.WriteLine("Certificate '" & ca_cert(i) & _ ++ "' is undefined.") ++ Environment.Exit(1) ++ End If ++ Next ++ ++ Dim buf As Byte() = Nothing ++ Dim res As Integer ++ Dim ssl As SSL ++ ++ While 1 ++ If Not quiet Then ++ Console.WriteLine("ACCEPT") ++ End If ++ ++ Dim client_sock As Socket = server_sock.AcceptSocket() ++ ++ ssl = ssl_ctx.Connect(client_sock) ++ ++ ' do the actual SSL handshake ++ While 1 ++ res = ssl_ctx.Read(ssl, buf) ++ If res <> axtls.SSL_OK Then ++ Exit While ++ End If ++ ++ ' check when the connection has been established ++ If ssl.HandshakeStatus() = axtls.SSL_OK ++ Exit While ++ End If ++ ++ ' could do something else here ++ End While ++ ++ If res = axtls.SSL_OK Then ' connection established and ok ++ If Not quiet ++ display_session_id(ssl) ++ display_cipher(ssl) ++ End If ++ ++ ' now read (and display) whatever the client sends us ++ While 1 ++ ' keep reading until we get something interesting ++ While 1 ++ res = ssl_ctx.Read(ssl, buf) ++ If res <> axtls.SSL_OK Then ++ Exit While ++ End If ++ ++ ' could do something else here ++ End While ++ ++ If res < axtls.SSL_OK ++ If Not quiet ++ Console.WriteLine("CONNECTION CLOSED") ++ End If ++ ++ Exit While ++ End If ++ ++ ' convert to String ++ Dim str(res) As Char ++ For i = 0 To res-1 ++ str(i) = Chr(buf(i)) ++ Next ++ ++ Console.Write(str) ++ End While ++ ElseIf Not quiet ++ SSLUtil.DisplayError(res) ++ End If ++ ++ ' client was disconnected or the handshake failed. */ ++ ssl.Dispose() ++ client_sock.Close() ++ End While ++ ++ ssl_ctx.Dispose() ++ End Sub ++ ++ ' ++ ' do_client() ++ ' ++ Public Sub do_client(ByVal build_mode As Integer, _ ++ ByVal args() As String) ++ ++ If build_mode < axtls.SSL_BUILD_ENABLE_CLIENT Then ++ print_client_options(build_mode, args(1)) ++ End If ++ ++ Dim i As Integer = 1 ++ Dim res As Integer ++ Dim port As Integer = 4433 ++ Dim quiet As Boolean = False ++ Dim password As String = Nothing ++ Dim reconnect As Integer = 0 ++ Dim private_key_file As String = Nothing ++ Dim hostname As String = "127.0.0.1" ++ ++ ' organise the cert/ca_cert lists ++ Dim ssl As SSL = Nothing ++ Dim cert_size As Integer = SSLUtil.MaxCerts() ++ Dim ca_cert_size As Integer = SSLUtil.MaxCACerts() ++ Dim cert(cert_size) As String ++ Dim ca_cert(ca_cert_size) As String ++ Dim cert_index As Integer = 0 ++ Dim ca_cert_index As Integer = 0 ++ ++ Dim options As Integer = _ ++ axtls.SSL_SERVER_VERIFY_LATER Or axtls.SSL_DISPLAY_CERTS ++ Dim session_id As Byte() = Nothing ++ ++ While i < args.Length ++ If args(i) = "-connect" Then ++ Dim host_port As String ++ ++ If i >= args.Length-1 ++ print_client_options(build_mode, args(i)) ++ End If ++ ++ i += 1 ++ host_port = args(i) ++ ++ Dim index_colon As Integer = host_port.IndexOf(":"C) ++ If index_colon < 0 Then ++ print_client_options(build_mode, args(i)) ++ End If ++ ++ hostname = New String(host_port.ToCharArray(), _ ++ 0, index_colon) ++ port = Int32.Parse(New String(host_port.ToCharArray(), _ ++ index_colon+1, host_port.Length-index_colon-1)) ++ ElseIf args(i) = "-cert" ++ If i >= args.Length-1 Or cert_index >= cert_size Then ++ print_client_options(build_mode, args(i)) ++ End If ++ ++ i += 1 ++ cert(cert_index) = args(i) ++ cert_index += 1 ++ ElseIf args(i) = "-key" ++ If i >= args.Length-1 ++ print_client_options(build_mode, args(i)) ++ End If ++ ++ i += 1 ++ private_key_file = args(i) ++ options = options Or axtls.SSL_NO_DEFAULT_KEY ++ ElseIf args(i) = "-CAfile" ++ If i >= args.Length-1 Or ca_cert_index >= ca_cert_size ++ print_client_options(build_mode, args(i)) ++ End If ++ ++ i += 1 ++ ca_cert(ca_cert_index) = args(i) ++ ca_cert_index += 1 ++ ElseIf args(i) = "-verify" ++ options = options And Not axtls.SSL_SERVER_VERIFY_LATER ++ ElseIf args(i) = "-reconnect" ++ reconnect = 4 ++ ElseIf args(i) = "-quiet" ++ quiet = True ++ options = options And Not axtls.SSL_DISPLAY_CERTS ++ ElseIf args(i) = "-pass" ++ If i >= args.Length-1 ++ print_client_options(build_mode, args(i)) ++ End If ++ ++ i += 1 ++ password = args(i) ++ ElseIf build_mode = axtls.SSL_BUILD_FULL_MODE ++ If args(i) = "-debug" Then ++ options = options Or axtls.SSL_DISPLAY_BYTES ++ ElseIf args(i) = "-state" ++ options = options Or axtls.SSL_DISPLAY_STATES ++ ElseIf args(i) = "-show-rsa" ++ options = options Or axtls.SSL_DISPLAY_RSA ++ Else ++ print_client_options(build_mode, args(i)) ++ End If ++ Else ' don't know what this is ++ print_client_options(build_mode, args(i)) ++ End If ++ ++ i += 1 ++ End While ++ ++ 'Dim hostInfo As IPHostEntry = Dns.Resolve(hostname) ++ Dim hostInfo As IPHostEntry = Dns.GetHostEntry(hostname) ++ Dim addresses As IPAddress() = hostInfo.AddressList ++ Dim ep As IPEndPoint = New IPEndPoint(addresses(0), port) ++ Dim client_sock As Socket = New Socket(AddressFamily.InterNetwork, _ ++ SocketType.Stream, ProtocolType.Tcp) ++ client_sock.Connect(ep) ++ ++ If Not client_sock.Connected Then ++ Console.WriteLine("could not connect") ++ Environment.Exit(1) ++ End If ++ ++ If Not quiet Then ++ Console.WriteLine("CONNECTED") ++ End If ++ ++ '********************************************************************* ++ ' This is where the interesting stuff happens. Up until now we've ++ ' just been setting up sockets etc. Now we do the SSL handshake. ++ '*********************************************************************/ ++ Dim ssl_ctx As SSLClient = New SSLClient(options, _ ++ axtls.SSL_DEFAULT_CLNT_SESS) ++ ++ If ssl_ctx Is Nothing Then ++ Console.Error.WriteLine("Error: Client context is invalid") ++ Environment.Exit(1) ++ End If ++ ++ If private_key_file <> Nothing Then ++ Dim obj_type As Integer = axtls.SSL_OBJ_RSA_KEY ++ ++ If private_key_file.EndsWith(".p8") Then ++ obj_type = axtls.SSL_OBJ_PKCS8 ++ Else If (private_key_file.EndsWith(".p12")) ++ obj_type = axtls.SSL_OBJ_PKCS12 ++ End If ++ ++ If ssl_ctx.ObjLoad(obj_type, private_key_file, _ ++ password) <> axtls.SSL_OK Then ++ Console.Error.WriteLine("Error: Private key '" & _ ++ private_key_file & "' is undefined.") ++ Environment.Exit(1) ++ End If ++ End If ++ ++ For i = 0 To cert_index-1 ++ If ssl_ctx.ObjLoad(axtls.SSL_OBJ_X509_CERT, _ ++ cert(i), Nothing) <> axtls.SSL_OK Then ++ Console.WriteLine("Certificate '" & cert(i) & _ ++ "' is undefined.") ++ Environment.Exit(1) ++ End If ++ Next ++ ++ For i = 0 To ca_cert_index-1 ++ If ssl_ctx.ObjLoad(axtls.SSL_OBJ_X509_CACERT, _ ++ ca_cert(i), Nothing) <> axtls.SSL_OK Then ++ Console.WriteLine("Certificate '" & ca_cert(i) & _ ++ "' is undefined.") ++ Environment.Exit(1) ++ End If ++ Next ++ ++ ' Try session resumption? ++ If reconnect > 0 Then ++ While reconnect > 0 ++ reconnect -= 1 ++ ssl = ssl_ctx.Connect(client_sock, session_id) ++ ++ res = ssl.HandshakeStatus() ++ If res <> axtls.SSL_OK Then ++ If Not quiet Then ++ SSLUtil.DisplayError(res) ++ End If ++ ++ ssl.Dispose() ++ Environment.Exit(1) ++ End If ++ ++ display_session_id(ssl) ++ session_id = ssl.GetSessionId() ++ ++ If reconnect > 0 Then ++ ssl.Dispose() ++ client_sock.Close() ++ ++ ' and reconnect ++ client_sock = New Socket(AddressFamily.InterNetwork, _ ++ SocketType.Stream, ProtocolType.Tcp) ++ client_sock.Connect(ep) ++ End If ++ End While ++ Else ++ ssl = ssl_ctx.Connect(client_sock, Nothing) ++ End If ++ ++ ' check the return status ++ res = ssl.HandshakeStatus() ++ If res <> axtls.SSL_OK Then ++ If Not quiet Then ++ SSLUtil.DisplayError(res) ++ End If ++ ++ Environment.Exit(1) ++ End If ++ ++ If Not quiet Then ++ Dim common_name As String = _ ++ ssl.GetCertificateDN(axtls.SSL_X509_CERT_COMMON_NAME) ++ ++ If common_name <> Nothing ++ Console.WriteLine("Common Name:" & _ ++ ControlChars.Tab & ControlChars.Tab & _ ++ ControlChars.Tab & common_name) ++ End If ++ ++ display_session_id(ssl) ++ display_cipher(ssl) ++ End If ++ ++ While (1) ++ Dim user_input As String = Console.ReadLine() ++ ++ If user_input = Nothing Then ++ Exit While ++ End If ++ ++ Dim buf(user_input.Length+1) As Byte ++ buf(buf.Length-2) = Asc(ControlChars.Lf) ' add the carriage return ++ buf(buf.Length-1) = 0 ' null terminate ++ ++ For i = 0 To user_input.Length-1 ++ buf(i) = Asc(user_input.Chars(i)) ++ Next ++ ++ res = ssl_ctx.Write(ssl, buf, buf.Length) ++ If res < axtls.SSL_OK Then ++ If Not quiet Then ++ SSLUtil.DisplayError(res) ++ End If ++ ++ Exit While ++ End If ++ End While ++ ++ ssl_ctx.Dispose() ++ End Sub ++ ++ ' ++ ' Display what cipher we are using ++ ' ++ Private Sub display_cipher(ByVal ssl As SSL) ++ Console.Write("CIPHER is ") ++ ++ Select ssl.GetCipherId() ++ Case axtls.SSL_AES128_SHA ++ Console.WriteLine("AES128-SHA") ++ ++ Case axtls.SSL_AES256_SHA ++ Console.WriteLine("AES256-SHA") ++ ++ Case axtls.SSL_RC4_128_SHA ++ Console.WriteLine("RC4-SHA") ++ ++ Case axtls.SSL_RC4_128_MD5 ++ Console.WriteLine("RC4-MD5") ++ ++ Case Else ++ Console.WriteLine("Unknown - " & ssl.GetCipherId()) ++ End Select ++ End Sub ++ ++ ' ++ ' Display what session id we have. ++ ' ++ Private Sub display_session_id(ByVal ssl As SSL) ++ Dim session_id As Byte() = ssl.GetSessionId() ++ ++ If session_id.Length > 0 Then ++ Console.WriteLine("-----BEGIN SSL SESSION PARAMETERS-----") ++ Dim b As Byte ++ For Each b In session_id ++ Console.Write("{0:x02}", b) ++ Next ++ ++ Console.WriteLine() ++ Console.WriteLine("-----END SSL SESSION PARAMETERS-----") ++ End If ++ End Sub ++ ++ ' ++ ' We've had some sort of command-line error. Print out the basic options. ++ ' ++ Public Sub print_options(ByVal options As String) ++ Console.WriteLine("axssl: Error: '" & options & _ ++ "' is an invalid command.") ++ Console.WriteLine("usage: axssl.vbnet [s_server|s_client|" & _ ++ "version] [args ...]") ++ Environment.Exit(1) ++ End Sub ++ ++ ' ++ ' We've had some sort of command-line error. Print out the server options. ++ ' ++ Private Sub print_server_options(ByVal build_mode As Integer, _ ++ ByVal options As String) ++ Dim cert_size As Integer = SSLUtil.MaxCerts() ++ Dim ca_cert_size As Integer = SSLUtil.MaxCACerts() ++ ++ Console.WriteLine("unknown option " & options) ++ Console.WriteLine("usage: s_server [args ...]") ++ Console.WriteLine(" -accept arg" & ControlChars.Tab & _ ++ "- port to accept on (default is 4433)") ++ Console.WriteLine(" -quiet" & ControlChars.Tab & ControlChars.Tab & _ ++ "- No server output") ++ If build_mode >= axtls.SSL_BUILD_SERVER_ONLY ++ Console.WriteLine(" -cert arg" & ControlChars.Tab & _ ++ "- certificate file to add (in addition to default) to chain -") ++ Console.WriteLine(ControlChars.Tab & ControlChars.Tab & _ ++ " Can repeat up to " & cert_size & " times") ++ Console.WriteLine(" -key arg" & ControlChars.Tab & _ ++ "- Private key file to use") ++ Console.WriteLine(" -pass" & ControlChars.Tab & ControlChars.Tab & _ ++ "- private key file pass phrase source") ++ End If ++ ++ If build_mode >= axtls.SSL_BUILD_ENABLE_VERIFICATION ++ Console.WriteLine(" -verify" & ControlChars.Tab & _ ++ "- turn on peer certificate verification") ++ Console.WriteLine(" -CAfile arg" & ControlChars.Tab & _ ++ "- Certificate authority") ++ Console.WriteLine(ControlChars.Tab & ControlChars.Tab & _ ++ " Can repeat up to " & ca_cert_size & " times") ++ End If ++ ++ If build_mode = axtls.SSL_BUILD_FULL_MODE ++ Console.WriteLine(" -debug" & _ ++ ControlChars.Tab & ControlChars.Tab & _ ++ "- Print more output") ++ Console.WriteLine(" -state" & _ ++ ControlChars.Tab & ControlChars.Tab & _ ++ "- Show state messages") ++ Console.WriteLine(" -show-rsa" & _ ++ ControlChars.Tab & "- Show RSA state") ++ End If ++ ++ Environment.Exit(1) ++ End Sub ++ ++ ' ++ ' We've had some sort of command-line error. Print out the client options. ++ ' ++ Private Sub print_client_options(ByVal build_mode As Integer, _ ++ ByVal options As String) ++ Dim cert_size As Integer = SSLUtil.MaxCerts() ++ Dim ca_cert_size As Integer = SSLUtil.MaxCACerts() ++ ++ Console.WriteLine("unknown option " & options) ++ ++ If build_mode >= axtls.SSL_BUILD_ENABLE_CLIENT Then ++ Console.WriteLine("usage: s_client [args ...]") ++ Console.WriteLine(" -connect host:port - who to connect to " & _ ++ "(default is localhost:4433)") ++ Console.WriteLine(" -verify" & ControlChars.Tab & _ ++ "- turn on peer certificate verification") ++ Console.WriteLine(" -cert arg" & ControlChars.Tab & _ ++ "- certificate file to use") ++ Console.WriteLine(ControlChars.Tab & ControlChars.Tab & _ ++ " Can repeat up to " & cert_size & " times") ++ Console.WriteLine(" -key arg" & ControlChars.Tab & _ ++ "- Private key file to use") ++ Console.WriteLine(" -CAfile arg" & ControlChars.Tab & _ ++ "- Certificate authority") ++ Console.WriteLine(ControlChars.Tab & ControlChars.Tab & _ ++ " Can repeat up to " & ca_cert_size & " times") ++ Console.WriteLine(" -quiet" & _ ++ ControlChars.Tab & ControlChars.Tab & "- No client output") ++ Console.WriteLine(" -pass" & ControlChars.Tab & _ ++ ControlChars.Tab & _ ++ "- private key file pass phrase source") ++ Console.WriteLine(" -reconnect" & ControlChars.Tab & _ ++ "- Drop and re-make the " & _ ++ "connection with the same Session-ID") ++ ++ If build_mode = axtls.SSL_BUILD_FULL_MODE Then ++ Console.WriteLine(" -debug" & _ ++ ControlChars.Tab & ControlChars.Tab & _ ++ "- Print more output") ++ Console.WriteLine(" -state" & _ ++ ControlChars.Tab & ControlChars.Tab & _ ++ "- Show state messages") ++ Console.WriteLine(" -show-rsa" & ControlChars.Tab & _ ++ "- Show RSA state") ++ End If ++ Else ++ Console.WriteLine("Change configuration to allow this feature") ++ End If ++ ++ Environment.Exit(1) ++ End Sub ++ ++End Class ++ ++Public Module MyMain ++ Function Main(ByVal args() As String) As Integer ++ Dim runner As axssl = New axssl() ++ ++ If args.Length = 1 And args(0) = "version" Then ++ Console.WriteLine("axssl.vbnet " & SSLUtil.Version()) ++ Environment.Exit(0) ++ End If ++ ++ If args.Length < 1 ++ runner.print_options("") ++ ElseIf args(0) <> "s_server" And args(0) <> "s_client" ++ runner.print_options(args(0)) ++ End If ++ ++ Dim build_mode As Integer = SSLUtil.BuildMode() ++ ++ If args(0) = "s_server" Then ++ runner.do_server(build_mode, args) ++ Else ++ runner.do_client(build_mode, args) ++ End If ++ End Function ++End Module +diff --git a/feeds/luci/libs/luci-lib-nixio/axTLS/ssl/BigIntConfig.in b/feeds/luci/libs/luci-lib-nixio/axTLS/ssl/BigIntConfig.in +new file mode 100644 +index 0000000..04c7438 +--- /dev/null ++++ b/feeds/luci/libs/luci-lib-nixio/axTLS/ssl/BigIntConfig.in +@@ -0,0 +1,132 @@ ++# ++# For a description of the syntax of this configuration file, ++# see scripts/config/Kconfig-language.txt ++# ++ ++menu "BigInt Options" ++ depends on !CONFIG_SSL_SKELETON_MODE ++ ++choice ++ prompt "Reduction Algorithm" ++ default CONFIG_BIGINT_BARRETT ++ ++config CONFIG_BIGINT_CLASSICAL ++ bool "Classical" ++ help ++ Classical uses standard division. It has no limitations and is ++ theoretically the slowest due to the divisions used. For this particular ++ implementation it is surprisingly quite fast. ++ ++config CONFIG_BIGINT_MONTGOMERY ++ bool "Montgomery" ++ help ++ Montgomery uses simple addition and multiplication to achieve its ++ performance. In this implementation it is slower than classical, ++ and it has the limitation that 0 <= x, y < m, and so is not used ++ when CRT is active. ++ ++ This option will not be normally selected. ++ ++config CONFIG_BIGINT_BARRETT ++ bool "Barrett" ++ help ++ Barrett performs expensive precomputation before reduction and partial ++ multiplies for computational speed. It can't be used with some of the ++ calculations when CRT is used, and so defaults to classical when this ++ occurs. ++ ++ It is about 40% faster than Classical/Montgomery with the expense of ++ about 2kB, and so this option is normally selected. ++ ++endchoice ++ ++config CONFIG_BIGINT_CRT ++ bool "Chinese Remainder Theorem (CRT)" ++ default y ++ help ++ Allow the Chinese Remainder Theorem (CRT) to be used. ++ ++ Uses a number of extra coefficients from the private key to improve the ++ performance of a decryption. This feature is one of the most ++ significant performance improvements (it reduces a decryption time by ++ over 3 times). ++ ++ This option should be selected. ++ ++config CONFIG_BIGINT_KARATSUBA ++ bool "Karatsuba Multiplication" ++ default n ++ help ++ Allow Karasuba multiplication to be used. ++ ++ Uses 3 multiplications (plus a number of additions/subtractions) ++ instead of 4. Multiplications are O(N^2) but addition/subtraction ++ is O(N) hence for large numbers is beneficial. For this project, the ++ effect was only useful for 4096 bit keys. As these aren't likely to ++ be used, the feature is disabled by default. ++ ++ It costs about 2kB to enable it. ++ ++config MUL_KARATSUBA_THRESH ++ int "Karatsuba Multiplication Theshold" ++ default 20 ++ depends on CONFIG_BIGINT_KARATSUBA ++ help ++ The minimum number of components needed before Karasuba muliplication ++ is used. ++ ++ This is very dependent on the speed/implementation of bi_add()/ ++ bi_subtract(). There is a bit of trial and error here and will be ++ at a different point for different architectures. ++ ++config SQU_KARATSUBA_THRESH ++ int "Karatsuba Square Threshold" ++ default 40 ++ depends on CONFIG_BIGINT_KARATSUBA && CONFIG_BIGINT_SQUARE ++ help ++ The minimum number of components needed before Karatsuba squaring ++ is used. ++ ++ This is very dependent on the speed/implementation of bi_add()/ ++ bi_subtract(). There is a bit of trial and error here and will be ++ at a different point for different architectures. ++ ++config CONFIG_BIGINT_SLIDING_WINDOW ++ bool "Sliding Window Exponentiation" ++ default y ++ help ++ Allow Sliding-Window Exponentiation to be used. ++ ++ Potentially processes more than 1 bit at a time when doing ++ exponentiation. The sliding-window technique reduces the number of ++ precomputations compared to other precomputed techniques. ++ ++ It results in a considerable performance improvement with it enabled ++ (it halves the decryption time) and so should be selected. ++ ++config CONFIG_BIGINT_SQUARE ++ bool "Square Algorithm" ++ default y ++ help ++ Allow squaring to be used instead of a multiplication. ++ ++ Squaring is theoretically 50% faster than a standard multiply ++ (but is actually about 25% faster). ++ ++ It gives a 20% speed improvement and so should be selected. ++ ++config CONFIG_BIGINT_CHECK_ON ++ bool "BigInt Integrity Checking" ++ default n if !CONFIG_DEBUG ++ default y if CONFIG_DEBUG ++ help ++ This is used when developing bigint algorithms. It performs a sanity ++ check on all operations at the expense of speed. ++ ++ This option is only selected when developing and should normally be ++ turned off. ++ ++endmenu ++ ++ ++ +diff --git a/feeds/luci/libs/luci-lib-nixio/axTLS/ssl/Config.in b/feeds/luci/libs/luci-lib-nixio/axTLS/ssl/Config.in +new file mode 100644 +index 0000000..d047d42 +--- /dev/null ++++ b/feeds/luci/libs/luci-lib-nixio/axTLS/ssl/Config.in +@@ -0,0 +1,336 @@ ++# ++# For a description of the syntax of this configuration file, ++# see scripts/config/Kconfig-language.txt ++# ++ ++menu "SSL Library" ++ ++choice ++ prompt "Mode" ++ default CONFIG_SSL_FULL_MODE ++ ++config CONFIG_SSL_SERVER_ONLY ++ bool "Server only - no verification" ++ help ++ Enable server functionality (no client functionality). ++ This mode still supports sessions and chaining (which can be turned ++ off in configuration). ++ ++ The axssl sample runs with the minimum of features. ++ ++ This is the most space efficient of the modes with the library ++ about 45kB in size. Use this mode if you are doing standard SSL server ++ work. ++ ++config CONFIG_SSL_CERT_VERIFICATION ++ bool "Server only - with verification" ++ help ++ Enable server functionality with client authentication (no client ++ functionality). ++ ++ The axssl sample runs with the "-verify" and "-CAfile" options. ++ ++ This mode produces a library about 49kB in size. Use this mode if you ++ have an SSL server which requires client authentication (which is ++ uncommon in browser applications). ++ ++config CONFIG_SSL_ENABLE_CLIENT ++ bool "Client/Server enabled" ++ help ++ Enable client/server functionality (including peer authentication). ++ ++ The axssl sample runs with the "s_client" option enabled. ++ ++ This mode produces a library about 51kB in size. Use this mode if you ++ require axTLS to use SSL client functionality (the SSL server code ++ is always enabled). ++ ++config CONFIG_SSL_FULL_MODE ++ bool "Client/Server enabled with diagnostics" ++ help ++ Enable client/server functionality including diagnostics. Most of the ++ extra size in this mode is due to the storage of various strings that ++ are used. ++ ++ The axssl sample has 3 more options, "-debug", "-state" and "-show-rsa" ++ ++ This mode produces a library about 58kB in size. It is suggested that ++ this mode is used only during development, or systems that have more ++ generous memory limits. ++ ++ It is the default to demonstrate the features of axTLS. ++ ++config CONFIG_SSL_SKELETON_MODE ++ bool "Skeleton mode - the smallest server mode" ++ help ++ This is an experiment to build the smallest library at the expense of ++ features and speed. ++ ++ * Server mode only. ++ * The AES cipher is disabled. ++ * No session resumption. ++ * No external keys/certificates are supported. ++ * The bigint library has most of the performance features disabled. ++ * Some other features/API calls may not work. ++ ++ This mode produces a library about 37kB in size. The main ++ disadvantage of this mode is speed - it will be much slower than the ++ other build modes. ++ ++endchoice ++ ++choice ++ prompt "Protocol Preference" ++ depends on !CONFIG_SSL_SKELETON_MODE ++ default CONFIG_SSL_PROT_MEDIUM ++ ++config CONFIG_SSL_PROT_LOW ++ bool "Low" ++ help ++ Chooses the cipher in the order of RC4-SHA, AES128-SHA, AES256-SHA. ++ ++ This will use the fastest cipher(s) but at the expense of security. ++ ++config CONFIG_SSL_PROT_MEDIUM ++ bool "Medium" ++ help ++ Chooses the cipher in the order of AES128-SHA, AES256-SHA, RC4-SHA. ++ ++ This mode is a balance between speed and security and is the default. ++ ++config CONFIG_SSL_PROT_HIGH ++ bool "High" ++ help ++ Chooses the cipher in the order of AES256-SHA, AES128-SHA, RC4-SHA. ++ ++ This will use the strongest cipher(s) at the cost of speed. ++ ++endchoice ++ ++config CONFIG_SSL_USE_DEFAULT_KEY ++ bool "Enable default key" ++ depends on !CONFIG_SSL_SKELETON_MODE ++ default y ++ help ++ Some applications will not require the default private key/certificate ++ that is built in. This is one way to save on a couple of kB's if an ++ external private key/certificate is used. ++ ++ The private key is in ssl/private_key.h and the certificate is in ++ ssl/cert.h. ++ ++ The advantage of a built-in private key/certificate is that no file ++ system is required for access. Both the certificate and the private ++ key will be automatically loaded on a ssl_ctx_new(). ++ ++ However this private key/certificate can never be changed (without a ++ code update). ++ ++ This mode is enabled by default. Disable this mode if the ++ built-in key/certificate is not used. ++ ++config CONFIG_SSL_PRIVATE_KEY_LOCATION ++ string "Private key file location" ++ depends on !CONFIG_SSL_USE_DEFAULT_KEY && !CONFIG_SSL_SKELETON_MODE ++ help ++ The file location of the private key which will be automatically ++ loaded on a ssl_ctx_new(). ++ ++config CONFIG_SSL_PRIVATE_KEY_PASSWORD ++ string "Private key password" ++ depends on !CONFIG_SSL_USE_DEFAULT_KEY && CONFIG_SSL_HAS_PEM ++ help ++ The password required to decrypt a PEM-encoded password file. ++ ++config CONFIG_SSL_X509_CERT_LOCATION ++ string "X.509 certificate file location" ++ depends on !CONFIG_SSL_GENERATE_X509_CERT && !CONFIG_SSL_USE_DEFAULT_KEY && !CONFIG_SSL_SKELETON_MODE ++ help ++ The file location of the X.509 certificate which will be automatically ++ loaded on a ssl_ctx_new(). ++ ++config CONFIG_SSL_GENERATE_X509_CERT ++ bool "Generate X.509 Certificate" ++ default n ++ help ++ An X.509 certificate can be automatically generated on a ++ ssl_ctx_new(). A private key still needs to be provided (the private ++ key in ss/private_key.h will be used unless ++ CONFIG_SSL_PRIVATE_KEY_LOCATION is set). ++ ++ The certificate is generated on the fly, and so a minor start-up time ++ penalty is to be expected. This feature adds around 5kB to the ++ library. ++ ++ This feature is disabled by default. ++ ++config CONFIG_SSL_X509_COMMON_NAME ++ string "X.509 Common Name" ++ depends on CONFIG_SSL_GENERATE_X509_CERT ++ help ++ The common name for the X.509 certificate. This should be the fully ++ qualified domain name (FQDN), e.g. www.foo.com. ++ ++ If this is blank, then this will be value from gethostname() and ++ getdomainname(). ++ ++config CONFIG_SSL_X509_ORGANIZATION_NAME ++ string "X.509 Organization Name" ++ depends on CONFIG_SSL_GENERATE_X509_CERT ++ help ++ The organization name for the generated X.509 certificate. ++ ++ This field is optional. ++ ++config CONFIG_SSL_X509_ORGANIZATION_UNIT_NAME ++ string "X.509 Organization Unit Name" ++ depends on CONFIG_SSL_GENERATE_X509_CERT ++ help ++ The organization unit name for the generated X.509 certificate. ++ ++ This field is optional. ++ ++config CONFIG_SSL_ENABLE_V23_HANDSHAKE ++ bool "Enable v23 Handshake" ++ default y ++ help ++ Some browsers use the v23 handshake client hello message ++ (an SSL2 format message which all SSL servers can understand). ++ It may be used if SSL2 is enabled in the browser. ++ ++ Since this feature takes a kB or so, this feature may be disabled - at ++ the risk of making it incompatible with some browsers (IE6 is ok, ++ Firefox 1.5 and below use it). ++ ++ Disable if backwards compatibility is not an issue (i.e. the client is ++ always using TLS1.0) ++ ++config CONFIG_SSL_HAS_PEM ++ bool "Enable PEM" ++ default n if !CONFIG_SSL_FULL_MODE ++ default y if CONFIG_SSL_FULL_MODE ++ depends on !CONFIG_SSL_SKELETON_MODE ++ help ++ Enable the use of PEM format for certificates and private keys. ++ ++ PEM is not normally needed - PEM files can be converted into DER files ++ quite easily. However they have the convenience of allowing multiple ++ certificates/keys in the same file. ++ ++ This feature will add a couple of kB to the library. ++ ++ Disable if PEM is not used (which will be in most cases). ++ ++config CONFIG_SSL_USE_PKCS12 ++ bool "Use PKCS8/PKCS12" ++ default n if !CONFIG_SSL_FULL_MODE ++ default y if CONFIG_SSL_FULL_MODE ++ depends on !CONFIG_SSL_SERVER_ONLY && !CONFIG_SSL_SKELETON_MODE ++ help ++ PKCS#12 certificates combine private keys and certificates together in ++ one file. ++ ++ PKCS#8 private keys are also suppported (as it is a subset of PKCS#12). ++ ++ The decryption of these certificates uses RC4-128 (and these ++ certificates must be encrypted using this cipher). The actual ++ algorithm is "PBE-SHA1-RC4-128". ++ ++ Disable if PKCS#12 is not used (which will be in most cases). ++ ++config CONFIG_SSL_EXPIRY_TIME ++ int "Session expiry time (in hours)" ++ depends on !CONFIG_SSL_SKELETON_MODE ++ default 24 ++ help ++ The time (in hours) before a session expires. ++ ++ A longer time means that the expensive parts of a handshake don't ++ need to be run when a client reconnects later. ++ ++ The default is 1 day. ++ ++config CONFIG_X509_MAX_CA_CERTS ++ int "Maximum number of certificate authorites" ++ default 4 ++ depends on !CONFIG_SSL_SERVER_ONLY && !CONFIG_SSL_SKELETON_MODE ++ help ++ Determines the number of CA's allowed. ++ ++ Increase this figure if more trusted sites are allowed. Each ++ certificate adds about 300 bytes (when added). ++ ++ The default is to allow four certification authorities. ++ ++config CONFIG_SSL_MAX_CERTS ++ int "Maximum number of chained certificates" ++ default 2 ++ help ++ Determines the number of certificates used in a certificate ++ chain. The chain length must be at least 1. ++ ++ Increase this figure if more certificates are to be added to the ++ chain. Each certificate adds about 300 bytes (when added). ++ ++ The default is to allow one certificate + 1 certificate in the chain ++ (which may be the certificate authority certificate). ++ ++config CONFIG_SSL_CTX_MUTEXING ++ bool "Enable SSL_CTX mutexing" ++ default n ++ help ++ Normally mutexing is not required - each SSL_CTX object can deal with ++ many SSL objects (as long as each SSL_CTX object is using a single ++ thread). ++ ++ If the SSL_CTX object is not thread safe e.g. the case where a ++ new thread is created for each SSL object, then mutexing is required. ++ ++ Select y when a mutex on the SSL_CTX object is required. ++ ++config CONFIG_USE_DEV_URANDOM ++ bool "Use /dev/urandom" ++ default y ++ depends on !CONFIG_PLATFORM_WIN32 ++ help ++ Use /dev/urandom. Otherwise a custom RNG is used. ++ ++ This will be the default on most Linux systems. ++ ++config CONFIG_WIN32_USE_CRYPTO_LIB ++ bool "Use Win32 Crypto Library" ++ depends on CONFIG_PLATFORM_WIN32 ++ help ++ Microsoft produce a Crypto API which requires the Platform SDK to be ++ installed. It's used for the RNG. ++ ++ This will be the default on most Win32 systems. ++ ++config CONFIG_OPENSSL_COMPATIBLE ++ bool "Enable openssl API compatibility" ++ default n ++ help ++ To ease the porting of openssl applications, a subset of the openssl ++ API is wrapped around the axTLS API. ++ ++ Note: not all the API is implemented, so parts may still break. And ++ it's definitely not 100% compatible. ++ ++config CONFIG_PERFORMANCE_TESTING ++ bool "Build the bigint performance test tool" ++ default n ++ help ++ Used for performance testing of bigint. ++ ++ This is a testing tool and is normally disabled. ++ ++config CONFIG_SSL_TEST ++ bool "Build the SSL testing tool" ++ default n ++ depends on CONFIG_SSL_FULL_MODE && !CONFIG_SSL_GENERATE_X509_CERT ++ help ++ Used for sanity checking the SSL handshaking. ++ ++ This is a testing tool and is normally disabled. ++ ++endmenu +diff --git a/feeds/luci/libs/luci-lib-nixio/axTLS/ssl/Makefile b/feeds/luci/libs/luci-lib-nixio/axTLS/ssl/Makefile +new file mode 100644 +index 0000000..704d90a +--- /dev/null ++++ b/feeds/luci/libs/luci-lib-nixio/axTLS/ssl/Makefile +@@ -0,0 +1,123 @@ ++# ++# Copyright (c) 2007, Cameron Rich ++# ++# All rights reserved. ++# ++# Redistribution and use in source and binary forms, with or without ++# modification, are permitted provided that the following conditions are met: ++# ++# * Redistributions of source code must retain the above copyright notice, ++# this list of conditions and the following disclaimer. ++# * 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. ++# * Neither the name of the axTLS project nor the names of its ++# contributors may be used to endorse or promote products derived ++# from this software without specific prior written permission. ++# ++# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ++# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT ++# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR ++# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR ++# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, ++# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED ++# TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, ++# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY ++# OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING ++# NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF ++# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ++# ++ ++AXTLS_HOME=.. ++ ++include $(AXTLS_HOME)/config/.config ++include $(AXTLS_HOME)/config/makefile.conf ++ ++all: libs ++ifdef CONFIG_PERFORMANCE_TESTING ++ $(MAKE) -C test ++else ++ifdef CONFIG_SSL_TEST ++ $(MAKE) -C test ++endif ++endif ++ ++ifndef CONFIG_PLATFORM_WIN32 ++TARGET1=$(AXTLS_HOME)/$(STAGE)/libaxtls.a ++BASETARGET=libaxtls.so ++CRYPTO_PATH=$(AXTLS_HOME)/crypto/ ++ifdef CONFIG_PLATFORM_CYGWIN ++TARGET2=$(AXTLS_HOME)/$(STAGE)/libaxtls.dll.a ++else ++TARGET2=$(AXTLS_HOME)/$(STAGE)/$(LIBMINOR) ++endif ++ ++# shared library major/minor numbers ++LIBMAJOR=$(BASETARGET).1 ++LIBMINOR=$(BASETARGET).1.2 ++else ++TARGET1=$(AXTLS_HOME)/$(STAGE)/axtls.lib ++TARGET2=$(AXTLS_HOME)/$(STAGE)/axtls.dll ++STATIC_LIB=$(AXTLS_HOME)/$(STAGE)/axtls.static.lib ++CRYPTO_PATH=$(AXTLS_HOME)\\crypto\\ ++endif ++ ++libs: $(TARGET1) $(TARGET2) ++ ++CRYPTO_OBJ=\ ++ $(CRYPTO_PATH)aes.o \ ++ $(CRYPTO_PATH)bigint.o \ ++ $(CRYPTO_PATH)crypto_misc.o \ ++ $(CRYPTO_PATH)hmac.o \ ++ $(CRYPTO_PATH)md2.o \ ++ $(CRYPTO_PATH)md5.o \ ++ $(CRYPTO_PATH)rc4.o \ ++ $(CRYPTO_PATH)rsa.o \ ++ $(CRYPTO_PATH)sha1.o ++ ++OBJ=\ ++ asn1.o \ ++ gen_cert.o \ ++ loader.o \ ++ openssl.o \ ++ os_port.o \ ++ p12.o \ ++ tls1.o \ ++ tls1_svr.o \ ++ tls1_clnt.o \ ++ x509.o ++ ++include $(AXTLS_HOME)/config/makefile.post ++ ++ifndef CONFIG_PLATFORM_WIN32 # Linux/Unix/Cygwin ++ ++$(TARGET1) : $(OBJ) ++ $(AR) -r $@ $(CRYPTO_OBJ) $(OBJ) ++ ++$(TARGET2) : $(OBJ) ++ifndef CONFIG_PLATFORM_CYGWIN ++ $(LD) $(LDFLAGS) $(LDSHARED) -o $(AXTLS_HOME)/$(STAGE)/$(LIBMINOR) $(CRYPTO_OBJ) $(OBJ) ++ cd $(AXTLS_HOME)/$(STAGE); ln -sf $(LIBMINOR) $(LIBMAJOR); ln -sf $(LIBMAJOR) $(BASETARGET); cd - ++else ++ $(LD) $(LDFLAGS) $(LDSHARED) -o $(AXTLS_HOME)/$(STAGE)/cygaxtls.dll \ ++ -Wl,--out-implib=$(AXTLS_HOME)/$(STAGE)/libaxtls.dll.a \ ++ -Wl,--export-all-symbols \ ++ -Wl,--enable-auto-import $(CRYPTO_OBJ) $(OBJ) ++endif ++ ++else # Win32 ++CRYPTO_OBJ:=$(CRYPTO_OBJ:.o=.obj) ++ ++$(TARGET1) : $(OBJ) ++ $(AR) /out:$@ $(CRYPTO_OBJ) $(OBJ) ++ ++$(TARGET2) : $(OBJ) ++ cp $(TARGET1) $(STATIC_LIB) ++ $(LD) $(LDFLAGS) $(LDSHARED) /out:$@ $(CRYPTO_OBJ) $(OBJ) ++ ++endif ++ ++clean:: ++ $(MAKE) -C test clean ++ -@rm -f $(AXTLS_HOME)/$(STAGE)/* *.a $(TARGET1) $(TARGET2) ++ +diff --git a/feeds/luci/libs/luci-lib-nixio/axTLS/ssl/asn1.c b/feeds/luci/libs/luci-lib-nixio/axTLS/ssl/asn1.c +new file mode 100644 +index 0000000..4f2e6db +--- /dev/null ++++ b/feeds/luci/libs/luci-lib-nixio/axTLS/ssl/asn1.c +@@ -0,0 +1,510 @@ ++/* ++ * Copyright (c) 2007, Cameron Rich ++ * ++ * All rights reserved. ++ * ++ * Redistribution and use in source and binary forms, with or without ++ * modification, are permitted provided that the following conditions are met: ++ * ++ * * Redistributions of source code must retain the above copyright notice, ++ * this list of conditions and the following disclaimer. ++ * * 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. ++ * * Neither the name of the axTLS project nor the names of its contributors ++ * may be used to endorse or promote products derived from this software ++ * without specific prior written permission. ++ * ++ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ++ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT ++ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR ++ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR ++ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, ++ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, ++ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR ++ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF ++ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING ++ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS ++ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ++ */ ++ ++/** ++ * Some primitive asn methods for extraction ASN.1 data. ++ */ ++ ++#include ++#include ++#include ++#include ++#include "os_port.h" ++#include "crypto.h" ++#include "crypto_misc.h" ++ ++#define SIG_OID_PREFIX_SIZE 8 ++#define SIG_IIS6_OID_SIZE 5 ++ ++/* Must be an RSA algorithm with either SHA1 or MD5 for verifying to work */ ++static const uint8_t sig_oid_prefix[SIG_OID_PREFIX_SIZE] = ++{ ++ 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01 ++}; ++ ++static const uint8_t sig_iis6_oid[SIG_IIS6_OID_SIZE] = ++{ ++ 0x2b, 0x0e, 0x03, 0x02, 0x1d ++}; ++ ++/* CN, O, OU */ ++static const uint8_t g_dn_types[] = { 3, 10, 11 }; ++ ++int get_asn1_length(const uint8_t *buf, int *offset) ++{ ++ int len, i; ++ ++ if (!(buf[*offset] & 0x80)) /* short form */ ++ { ++ len = buf[(*offset)++]; ++ } ++ else /* long form */ ++ { ++ int length_bytes = buf[(*offset)++]&0x7f; ++ len = 0; ++ for (i = 0; i < length_bytes; i++) ++ { ++ len <<= 8; ++ len += buf[(*offset)++]; ++ } ++ } ++ ++ return len; ++} ++ ++/** ++ * Skip the ASN1.1 object type and its length. Get ready to read the object's ++ * data. ++ */ ++int asn1_next_obj(const uint8_t *buf, int *offset, int obj_type) ++{ ++ if (buf[*offset] != obj_type) ++ return X509_NOT_OK; ++ (*offset)++; ++ return get_asn1_length(buf, offset); ++} ++ ++/** ++ * Skip over an ASN.1 object type completely. Get ready to read the next ++ * object. ++ */ ++int asn1_skip_obj(const uint8_t *buf, int *offset, int obj_type) ++{ ++ int len; ++ ++ if (buf[*offset] != obj_type) ++ return X509_NOT_OK; ++ (*offset)++; ++ len = get_asn1_length(buf, offset); ++ *offset += len; ++ return 0; ++} ++ ++/** ++ * Read an integer value for ASN.1 data ++ * Note: This function allocates memory which must be freed by the user. ++ */ ++int asn1_get_int(const uint8_t *buf, int *offset, uint8_t **object) ++{ ++ int len; ++ ++ if ((len = asn1_next_obj(buf, offset, ASN1_INTEGER)) < 0) ++ goto end_int_array; ++ ++ if (len > 1 && buf[*offset] == 0x00) /* ignore the negative byte */ ++ { ++ len--; ++ (*offset)++; ++ } ++ ++ *object = (uint8_t *)malloc(len); ++ memcpy(*object, &buf[*offset], len); ++ *offset += len; ++ ++end_int_array: ++ return len; ++} ++ ++/** ++ * Get all the RSA private key specifics from an ASN.1 encoded file ++ */ ++int asn1_get_private_key(const uint8_t *buf, int len, RSA_CTX **rsa_ctx) ++{ ++ int offset = 7; ++ uint8_t *modulus = NULL, *priv_exp = NULL, *pub_exp = NULL; ++ int mod_len, priv_len, pub_len; ++#ifdef CONFIG_BIGINT_CRT ++ uint8_t *p = NULL, *q = NULL, *dP = NULL, *dQ = NULL, *qInv = NULL; ++ int p_len, q_len, dP_len, dQ_len, qInv_len; ++#endif ++ ++ /* not in der format */ ++ if (buf[0] != ASN1_SEQUENCE) /* basic sanity check */ ++ { ++#ifdef CONFIG_SSL_FULL_MODE ++ printf("Error: This is not a valid ASN.1 file\n"); ++#endif ++ return X509_INVALID_PRIV_KEY; ++ } ++ ++ /* initialise the RNG */ ++ RNG_initialize(buf, len); ++ ++ mod_len = asn1_get_int(buf, &offset, &modulus); ++ pub_len = asn1_get_int(buf, &offset, &pub_exp); ++ priv_len = asn1_get_int(buf, &offset, &priv_exp); ++ ++ if (mod_len <= 0 || pub_len <= 0 || priv_len <= 0) ++ return X509_INVALID_PRIV_KEY; ++ ++#ifdef CONFIG_BIGINT_CRT ++ p_len = asn1_get_int(buf, &offset, &p); ++ q_len = asn1_get_int(buf, &offset, &q); ++ dP_len = asn1_get_int(buf, &offset, &dP); ++ dQ_len = asn1_get_int(buf, &offset, &dQ); ++ qInv_len = asn1_get_int(buf, &offset, &qInv); ++ ++ if (p_len <= 0 || q_len <= 0 || dP_len <= 0 || dQ_len <= 0 || qInv_len <= 0) ++ return X509_INVALID_PRIV_KEY; ++ ++ RSA_priv_key_new(rsa_ctx, ++ modulus, mod_len, pub_exp, pub_len, priv_exp, priv_len, ++ p, p_len, q, p_len, dP, dP_len, dQ, dQ_len, qInv, qInv_len); ++ ++ free(p); ++ free(q); ++ free(dP); ++ free(dQ); ++ free(qInv); ++#else ++ RSA_priv_key_new(rsa_ctx, ++ modulus, mod_len, pub_exp, pub_len, priv_exp, priv_len); ++#endif ++ ++ free(modulus); ++ free(priv_exp); ++ free(pub_exp); ++ return X509_OK; ++} ++ ++/** ++ * Get the time of a certificate. Ignore hours/minutes/seconds. ++ */ ++static int asn1_get_utc_time(const uint8_t *buf, int *offset, time_t *t) ++{ ++ int ret = X509_NOT_OK, len, t_offset; ++ struct tm tm; ++ ++ if (buf[(*offset)++] != ASN1_UTC_TIME) ++ goto end_utc_time; ++ len = get_asn1_length(buf, offset); ++ t_offset = *offset; ++ ++ memset(&tm, 0, sizeof(struct tm)); ++ tm.tm_year = (buf[t_offset] - '0')*10 + (buf[t_offset+1] - '0'); ++ ++ if (tm.tm_year <= 50) /* 1951-2050 thing */ ++ { ++ tm.tm_year += 100; ++ } ++ ++ tm.tm_mon = (buf[t_offset+2] - '0')*10 + (buf[t_offset+3] - '0') - 1; ++ tm.tm_mday = (buf[t_offset+4] - '0')*10 + (buf[t_offset+5] - '0'); ++ *t = mktime(&tm); ++ *offset += len; ++ ret = X509_OK; ++ ++end_utc_time: ++ return ret; ++} ++ ++/** ++ * Get the version type of a certificate (which we don't actually care about) ++ */ ++int asn1_version(const uint8_t *cert, int *offset, X509_CTX *x509_ctx) ++{ ++ int ret = X509_NOT_OK; ++ ++ (*offset) += 2; /* get past explicit tag */ ++ if (asn1_skip_obj(cert, offset, ASN1_INTEGER)) ++ goto end_version; ++ ++ ret = X509_OK; ++end_version: ++ return ret; ++} ++ ++/** ++ * Retrieve the notbefore and notafter certificate times. ++ */ ++int asn1_validity(const uint8_t *cert, int *offset, X509_CTX *x509_ctx) ++{ ++ return (asn1_next_obj(cert, offset, ASN1_SEQUENCE) < 0 || ++ asn1_get_utc_time(cert, offset, &x509_ctx->not_before) || ++ asn1_get_utc_time(cert, offset, &x509_ctx->not_after)); ++} ++ ++/** ++ * Get the components of a distinguished name ++ */ ++static int asn1_get_oid_x520(const uint8_t *buf, int *offset) ++{ ++ int dn_type = 0; ++ int len; ++ ++ if ((len = asn1_next_obj(buf, offset, ASN1_OID)) < 0) ++ goto end_oid; ++ ++ /* expect a sequence of 2.5.4.[x] where x is a one of distinguished name ++ components we are interested in. */ ++ if (len == 3 && buf[(*offset)++] == 0x55 && buf[(*offset)++] == 0x04) ++ dn_type = buf[(*offset)++]; ++ else ++ { ++ *offset += len; /* skip over it */ ++ } ++ ++end_oid: ++ return dn_type; ++} ++ ++/** ++ * Obtain an ASN.1 printable string type. ++ */ ++static int asn1_get_printable_str(const uint8_t *buf, int *offset, char **str) ++{ ++ int len = X509_NOT_OK; ++ ++ /* some certs have this awful crud in them for some reason */ ++ if (buf[*offset] != ASN1_PRINTABLE_STR && ++ buf[*offset] != ASN1_TELETEX_STR && ++ buf[*offset] != ASN1_IA5_STR && ++ buf[*offset] != ASN1_UNICODE_STR) ++ goto end_pnt_str; ++ ++ (*offset)++; ++ len = get_asn1_length(buf, offset); ++ ++ if (buf[*offset - 1] == ASN1_UNICODE_STR) ++ { ++ int i; ++ *str = (char *)malloc(len/2+1); /* allow for null */ ++ ++ for (i = 0; i < len; i += 2) ++ (*str)[i/2] = buf[*offset + i + 1]; ++ ++ (*str)[len/2] = 0; /* null terminate */ ++ } ++ else ++ { ++ *str = (char *)malloc(len+1); /* allow for null */ ++ memcpy(*str, &buf[*offset], len); ++ (*str)[len] = 0; /* null terminate */ ++ } ++ ++ *offset += len; ++ ++end_pnt_str: ++ return len; ++} ++ ++/** ++ * Get the subject name (or the issuer) of a certificate. ++ */ ++int asn1_name(const uint8_t *cert, int *offset, char *dn[]) ++{ ++ int ret = X509_NOT_OK; ++ int dn_type; ++ char *tmp = NULL; ++ ++ if (asn1_next_obj(cert, offset, ASN1_SEQUENCE) < 0) ++ goto end_name; ++ ++ while (asn1_next_obj(cert, offset, ASN1_SET) >= 0) ++ { ++ int i, found = 0; ++ ++ if (asn1_next_obj(cert, offset, ASN1_SEQUENCE) < 0 || ++ (dn_type = asn1_get_oid_x520(cert, offset)) < 0) ++ goto end_name; ++ ++ if (asn1_get_printable_str(cert, offset, &tmp) < 0) ++ { ++ free(tmp); ++ goto end_name; ++ } ++ ++ /* find the distinguished named type */ ++ for (i = 0; i < X509_NUM_DN_TYPES; i++) ++ { ++ if (dn_type == g_dn_types[i]) ++ { ++ if (dn[i] == NULL) ++ { ++ dn[i] = tmp; ++ found = 1; ++ break; ++ } ++ } ++ } ++ ++ if (found == 0) /* not found so get rid of it */ ++ { ++ free(tmp); ++ } ++ } ++ ++ ret = X509_OK; ++end_name: ++ return ret; ++} ++ ++/** ++ * Read the modulus and public exponent of a certificate. ++ */ ++int asn1_public_key(const uint8_t *cert, int *offset, X509_CTX *x509_ctx) ++{ ++ int ret = X509_NOT_OK, mod_len, pub_len; ++ uint8_t *modulus = NULL, *pub_exp = NULL; ++ ++ if (asn1_next_obj(cert, offset, ASN1_SEQUENCE) < 0 || ++ asn1_skip_obj(cert, offset, ASN1_SEQUENCE) || ++ asn1_next_obj(cert, offset, ASN1_BIT_STRING) < 0) ++ goto end_pub_key; ++ ++ (*offset)++; /* ignore the padding bit field */ ++ ++ if (asn1_next_obj(cert, offset, ASN1_SEQUENCE) < 0) ++ goto end_pub_key; ++ ++ mod_len = asn1_get_int(cert, offset, &modulus); ++ pub_len = asn1_get_int(cert, offset, &pub_exp); ++ ++ RSA_pub_key_new(&x509_ctx->rsa_ctx, modulus, mod_len, pub_exp, pub_len); ++ ++ free(modulus); ++ free(pub_exp); ++ ret = X509_OK; ++ ++end_pub_key: ++ return ret; ++} ++ ++#ifdef CONFIG_SSL_CERT_VERIFICATION ++/** ++ * Read the signature of the certificate. ++ */ ++int asn1_signature(const uint8_t *cert, int *offset, X509_CTX *x509_ctx) ++{ ++ int ret = X509_NOT_OK; ++ ++ if (cert[(*offset)++] != ASN1_BIT_STRING) ++ goto end_sig; ++ ++ x509_ctx->sig_len = get_asn1_length(cert, offset)-1; ++ (*offset)++; /* ignore bit string padding bits */ ++ x509_ctx->signature = (uint8_t *)malloc(x509_ctx->sig_len); ++ memcpy(x509_ctx->signature, &cert[*offset], x509_ctx->sig_len); ++ *offset += x509_ctx->sig_len; ++ ret = X509_OK; ++ ++end_sig: ++ return ret; ++} ++ ++/* ++ * Compare 2 distinguished name components for equality ++ * @return 0 if a match ++ */ ++static int asn1_compare_dn_comp(const char *dn1, const char *dn2) ++{ ++ int ret = 1; ++ ++ if ((dn1 && dn2 == NULL) || (dn1 == NULL && dn2)) goto err_no_match; ++ ++ ret = (dn1 && dn2) ? strcmp(dn1, dn2) : 0; ++ ++err_no_match: ++ return ret; ++} ++ ++/** ++ * Clean up all of the CA certificates. ++ */ ++void remove_ca_certs(CA_CERT_CTX *ca_cert_ctx) ++{ ++ int i = 0; ++ ++ if (ca_cert_ctx == NULL) ++ return; ++ ++ while (i < CONFIG_X509_MAX_CA_CERTS && ca_cert_ctx->cert[i]) ++ { ++ x509_free(ca_cert_ctx->cert[i]); ++ ca_cert_ctx->cert[i++] = NULL; ++ } ++ ++ free(ca_cert_ctx); ++} ++ ++/* ++ * Compare 2 distinguished names for equality ++ * @return 0 if a match ++ */ ++int asn1_compare_dn(char * const dn1[], char * const dn2[]) ++{ ++ int i; ++ ++ for (i = 0; i < X509_NUM_DN_TYPES; i++) ++ { ++ if (asn1_compare_dn_comp(dn1[i], dn2[i])) ++ return 1; ++ } ++ ++ return 0; /* all good */ ++} ++ ++#endif ++ ++/** ++ * Read the signature type of the certificate. We only support RSA-MD5 and ++ * RSA-SHA1 signature types. ++ */ ++int asn1_signature_type(const uint8_t *cert, ++ int *offset, X509_CTX *x509_ctx) ++{ ++ int ret = X509_NOT_OK, len; ++ ++ if (cert[(*offset)++] != ASN1_OID) ++ goto end_check_sig; ++ ++ len = get_asn1_length(cert, offset); ++ ++ if (len == 5 && memcmp(sig_iis6_oid, &cert[*offset], ++ SIG_IIS6_OID_SIZE) == 0) ++ { ++ x509_ctx->sig_type = SIG_TYPE_SHA1; ++ } ++ else ++ { ++ if (memcmp(sig_oid_prefix, &cert[*offset], SIG_OID_PREFIX_SIZE)) ++ goto end_check_sig; /* unrecognised cert type */ ++ ++ x509_ctx->sig_type = cert[*offset + SIG_OID_PREFIX_SIZE]; ++ } ++ ++ *offset += len; ++ asn1_skip_obj(cert, offset, ASN1_NULL); /* if it's there */ ++ ret = X509_OK; ++ ++end_check_sig: ++ return ret; ++} ++ +diff --git a/feeds/luci/libs/luci-lib-nixio/axTLS/ssl/cert.h b/feeds/luci/libs/luci-lib-nixio/axTLS/ssl/cert.h +new file mode 100644 +index 0000000..7a85d2d +--- /dev/null ++++ b/feeds/luci/libs/luci-lib-nixio/axTLS/ssl/cert.h +@@ -0,0 +1,43 @@ ++unsigned char default_certificate[] = { ++ 0x30, 0x82, 0x01, 0xd7, 0x30, 0x82, 0x01, 0x40, 0x02, 0x09, 0x00, 0xf1, ++ 0xc3, 0x87, 0xc0, 0xd4, 0xf4, 0x57, 0xc3, 0x30, 0x0d, 0x06, 0x09, 0x2a, ++ 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x05, 0x05, 0x00, 0x30, 0x34, ++ 0x31, 0x32, 0x30, 0x30, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x29, 0x61, ++ 0x78, 0x54, 0x4c, 0x53, 0x20, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, ++ 0x20, 0x44, 0x6f, 0x64, 0x67, 0x79, 0x20, 0x43, 0x65, 0x72, 0x74, 0x69, ++ 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x20, 0x41, 0x75, 0x74, 0x68, 0x6f, ++ 0x72, 0x69, 0x74, 0x79, 0x30, 0x1e, 0x17, 0x0d, 0x30, 0x36, 0x30, 0x36, ++ 0x30, 0x37, 0x31, 0x31, 0x34, 0x34, 0x33, 0x32, 0x5a, 0x17, 0x0d, 0x33, ++ 0x33, 0x31, 0x30, 0x32, 0x33, 0x31, 0x31, 0x34, 0x34, 0x33, 0x32, 0x5a, ++ 0x30, 0x2c, 0x31, 0x16, 0x30, 0x14, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, ++ 0x0d, 0x61, 0x78, 0x54, 0x4c, 0x53, 0x20, 0x50, 0x72, 0x6f, 0x6a, 0x65, ++ 0x63, 0x74, 0x31, 0x12, 0x30, 0x10, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, ++ 0x09, 0x31, 0x32, 0x37, 0x2e, 0x30, 0x2e, 0x30, 0x2e, 0x31, 0x30, 0x81, ++ 0x9f, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, ++ 0x01, 0x01, 0x05, 0x00, 0x03, 0x81, 0x8d, 0x00, 0x30, 0x81, 0x89, 0x02, ++ 0x81, 0x81, 0x00, 0xd8, 0xe0, 0xbf, 0x15, 0xde, 0xea, 0xaf, 0xe8, 0xd5, ++ 0xfd, 0x0b, 0xa8, 0xa8, 0xb3, 0xd7, 0x46, 0x5d, 0xa7, 0x26, 0x6c, 0x0c, ++ 0xb5, 0xd9, 0xbc, 0xc6, 0xf8, 0xc0, 0x78, 0xd0, 0xf6, 0x56, 0x65, 0xf8, ++ 0x29, 0x48, 0x0e, 0x7b, 0x0b, 0xa6, 0x25, 0x7e, 0xe8, 0x7b, 0x79, 0x6f, ++ 0x38, 0xe5, 0xb5, 0xb7, 0xf4, 0xe0, 0x9c, 0x91, 0x60, 0xf4, 0x06, 0xf3, ++ 0x40, 0x1e, 0xf9, 0x91, 0x19, 0xa9, 0x2f, 0x47, 0x43, 0xb5, 0x9b, 0x1e, ++ 0xdc, 0xf6, 0xaa, 0x1c, 0x49, 0x79, 0x21, 0x28, 0xcb, 0xaa, 0x49, 0x73, ++ 0xd9, 0x09, 0x05, 0x4c, 0x02, 0xf2, 0x4c, 0x4d, 0x6c, 0x1c, 0x80, 0xa7, ++ 0x14, 0x91, 0x44, 0xfc, 0x12, 0xb3, 0xe1, 0xe7, 0xe3, 0x4f, 0x44, 0xba, ++ 0x8c, 0xc3, 0x74, 0x39, 0xe8, 0x4c, 0xd0, 0xd4, 0x4c, 0x24, 0x61, 0xb4, ++ 0x40, 0x95, 0x8c, 0xc0, 0x0a, 0xb7, 0x02, 0x39, 0x31, 0x85, 0x93, 0x02, ++ 0x03, 0x01, 0x00, 0x01, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, ++ 0xf7, 0x0d, 0x01, 0x01, 0x05, 0x05, 0x00, 0x03, 0x81, 0x81, 0x00, 0x0b, ++ 0x47, 0x24, 0x52, 0x7d, 0xb6, 0x63, 0x78, 0xbc, 0x80, 0xdd, 0x87, 0x6c, ++ 0x90, 0x4c, 0x33, 0xc3, 0x5c, 0xa7, 0x97, 0x09, 0x1c, 0x09, 0x4f, 0x9b, ++ 0x6e, 0xb3, 0x5a, 0x3e, 0x46, 0x92, 0x1a, 0xc7, 0x87, 0x15, 0x59, 0xe1, ++ 0x88, 0x5c, 0xce, 0x6a, 0xe2, 0x96, 0xaa, 0x32, 0xec, 0xc2, 0xed, 0x78, ++ 0x8b, 0xe0, 0x90, 0x66, 0x93, 0x14, 0xc3, 0x98, 0xab, 0x33, 0x35, 0xd3, ++ 0x7d, 0x5d, 0x51, 0x0a, 0x9c, 0xb9, 0x10, 0x58, 0x47, 0x7a, 0x98, 0x95, ++ 0x64, 0xff, 0x4c, 0x5d, 0x82, 0x19, 0xf9, 0xea, 0x0f, 0x5e, 0x9a, 0xcb, ++ 0x32, 0x27, 0x64, 0xca, 0x6f, 0x58, 0x8a, 0xd0, 0xc0, 0x36, 0xf4, 0xb9, ++ 0x63, 0x34, 0xa5, 0xda, 0x36, 0x50, 0x36, 0x49, 0xd2, 0xb7, 0x3a, 0x21, ++ 0x33, 0x5b, 0x3e, 0xd6, 0x5f, 0x0c, 0x99, 0x83, 0xb7, 0xb2, 0xf7, 0x8b, ++ 0x44, 0xc4, 0x5e, 0x73, 0x41, 0xa9, 0x02 ++}; ++unsigned int default_certificate_len = 475; +diff --git a/feeds/luci/libs/luci-lib-nixio/axTLS/ssl/crypto_misc.h b/feeds/luci/libs/luci-lib-nixio/axTLS/ssl/crypto_misc.h +new file mode 100644 +index 0000000..97cb0f2 +--- /dev/null ++++ b/feeds/luci/libs/luci-lib-nixio/axTLS/ssl/crypto_misc.h +@@ -0,0 +1,164 @@ ++/* ++ * Copyright (c) 2007, Cameron Rich ++ * ++ * All rights reserved. ++ * ++ * Redistribution and use in source and binary forms, with or without ++ * modification, are permitted provided that the following conditions are met: ++ * ++ * * Redistributions of source code must retain the above copyright notice, ++ * this list of conditions and the following disclaimer. ++ * * 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. ++ * * Neither the name of the axTLS project nor the names of its contributors ++ * may be used to endorse or promote products derived from this software ++ * without specific prior written permission. ++ * ++ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ++ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT ++ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR ++ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR ++ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, ++ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, ++ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR ++ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF ++ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING ++ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS ++ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ++*/ ++ ++/** ++ * @file crypto_misc.h ++ */ ++ ++#ifndef HEADER_CRYPTO_MISC_H ++#define HEADER_CRYPTO_MISC_H ++ ++#ifdef __cplusplus ++extern "C" { ++#endif ++ ++#include "crypto.h" ++#include "bigint.h" ++ ++/************************************************************************** ++ * X509 declarations ++ **************************************************************************/ ++#define X509_OK 0 ++#define X509_NOT_OK -1 ++#define X509_VFY_ERROR_NO_TRUSTED_CERT -2 ++#define X509_VFY_ERROR_BAD_SIGNATURE -3 ++#define X509_VFY_ERROR_NOT_YET_VALID -4 ++#define X509_VFY_ERROR_EXPIRED -5 ++#define X509_VFY_ERROR_SELF_SIGNED -6 ++#define X509_VFY_ERROR_INVALID_CHAIN -7 ++#define X509_VFY_ERROR_UNSUPPORTED_DIGEST -8 ++#define X509_INVALID_PRIV_KEY -9 ++ ++/* ++ * The Distinguished Name ++ */ ++#define X509_NUM_DN_TYPES 3 ++#define X509_COMMON_NAME 0 ++#define X509_ORGANIZATION 1 ++#define X509_ORGANIZATIONAL_UNIT 2 ++ ++struct _x509_ctx ++{ ++ char *ca_cert_dn[X509_NUM_DN_TYPES]; ++ char *cert_dn[X509_NUM_DN_TYPES]; ++ time_t not_before; ++ time_t not_after; ++ uint8_t *signature; ++ uint16_t sig_len; ++ uint8_t sig_type; ++ RSA_CTX *rsa_ctx; ++ bigint *digest; ++ struct _x509_ctx *next; ++}; ++ ++typedef struct _x509_ctx X509_CTX; ++ ++#ifdef CONFIG_SSL_CERT_VERIFICATION ++typedef struct ++{ ++ X509_CTX *cert[CONFIG_X509_MAX_CA_CERTS]; ++} CA_CERT_CTX; ++#endif ++ ++int x509_new(const uint8_t *cert, int *len, X509_CTX **ctx); ++void x509_free(X509_CTX *x509_ctx); ++#ifdef CONFIG_SSL_CERT_VERIFICATION ++int x509_verify(const CA_CERT_CTX *ca_cert_ctx, const X509_CTX *cert); ++#endif ++#ifdef CONFIG_SSL_FULL_MODE ++void x509_print(const X509_CTX *cert, CA_CERT_CTX *ca_cert_ctx); ++const char * x509_display_error(int error); ++#endif ++ ++/************************************************************************** ++ * ASN1 declarations ++ **************************************************************************/ ++#define ASN1_INTEGER 0x02 ++#define ASN1_BIT_STRING 0x03 ++#define ASN1_OCTET_STRING 0x04 ++#define ASN1_NULL 0x05 ++#define ASN1_OID 0x06 ++#define ASN1_PRINTABLE_STR 0x13 ++#define ASN1_TELETEX_STR 0x14 ++#define ASN1_IA5_STR 0x16 ++#define ASN1_UTC_TIME 0x17 ++#define ASN1_UNICODE_STR 0x1e ++#define ASN1_SEQUENCE 0x30 ++#define ASN1_SET 0x31 ++#define ASN1_IMPLICIT_TAG 0x80 ++#define ASN1_EXPLICIT_TAG 0xa0 ++ ++#define SIG_TYPE_MD2 0x02 ++#define SIG_TYPE_MD5 0x04 ++#define SIG_TYPE_SHA1 0x05 ++ ++int get_asn1_length(const uint8_t *buf, int *offset); ++int asn1_get_private_key(const uint8_t *buf, int len, RSA_CTX **rsa_ctx); ++int asn1_next_obj(const uint8_t *buf, int *offset, int obj_type); ++int asn1_skip_obj(const uint8_t *buf, int *offset, int obj_type); ++int asn1_get_int(const uint8_t *buf, int *offset, uint8_t **object); ++int asn1_version(const uint8_t *cert, int *offset, X509_CTX *x509_ctx); ++int asn1_validity(const uint8_t *cert, int *offset, X509_CTX *x509_ctx); ++int asn1_name(const uint8_t *cert, int *offset, char *dn[]); ++int asn1_public_key(const uint8_t *cert, int *offset, X509_CTX *x509_ctx); ++#ifdef CONFIG_SSL_CERT_VERIFICATION ++int asn1_signature(const uint8_t *cert, int *offset, X509_CTX *x509_ctx); ++int asn1_compare_dn(char * const dn1[], char * const dn2[]); ++#endif ++int asn1_signature_type(const uint8_t *cert, ++ int *offset, X509_CTX *x509_ctx); ++ ++/************************************************************************** ++ * MISC declarations ++ **************************************************************************/ ++#define SALT_SIZE 8 ++ ++extern const char * const unsupported_str; ++ ++typedef void (*crypt_func)(void *, const uint8_t *, uint8_t *, int); ++typedef void (*hmac_func)(const uint8_t *msg, int length, const uint8_t *key, ++ int key_len, uint8_t *digest); ++ ++int get_file(const char *filename, uint8_t **buf); ++ ++#if defined(CONFIG_SSL_FULL_MODE) || defined(WIN32) || defined(CONFIG_DEBUG) ++EXP_FUNC void STDCALL print_blob(const char *format, const uint8_t *data, int size, ...); ++#else ++ #define print_blob(...) ++#endif ++ ++EXP_FUNC int STDCALL base64_decode(const char *in, int len, ++ uint8_t *out, int *outlen); ++ ++#ifdef __cplusplus ++} ++#endif ++ ++#endif +diff --git a/feeds/luci/libs/luci-lib-nixio/axTLS/ssl/gen_cert.c b/feeds/luci/libs/luci-lib-nixio/axTLS/ssl/gen_cert.c +new file mode 100644 +index 0000000..94b7490 +--- /dev/null ++++ b/feeds/luci/libs/luci-lib-nixio/axTLS/ssl/gen_cert.c +@@ -0,0 +1,363 @@ ++/* ++ * Copyright (c) 2007, Cameron Rich ++ * ++ * All rights reserved. ++ * ++ * Redistribution and use in source and binary forms, with or without ++ * modification, are permitted provided that the following conditions are met: ++ * ++ * * Redistributions of source code must retain the above copyright notice, ++ * this list of conditions and the following disclaimer. ++ * * 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. ++ * * Neither the name of the axTLS project nor the names of its contributors ++ * may be used to endorse or promote products derived from this software ++ * without specific prior written permission. ++ * ++ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ++ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT ++ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR ++ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR ++ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, ++ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, ++ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR ++ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF ++ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING ++ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS ++ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ++ */ ++ ++#include "config.h" ++ ++#ifdef CONFIG_SSL_GENERATE_X509_CERT ++#include ++#include ++#include "ssl.h" ++ ++/** ++ * Generate a basic X.509 certificate ++ */ ++ ++static uint8_t set_gen_length(int len, uint8_t *buf, int *offset) ++{ ++ if (len < 0x80) /* short form */ ++ { ++ buf[(*offset)++] = len; ++ return 1; ++ } ++ else /* long form */ ++ { ++ int i, length_bytes = 0; ++ ++ if (len & 0x00FF0000) ++ length_bytes = 3; ++ else if (len & 0x0000FF00) ++ length_bytes = 2; ++ else if (len & 0x000000FF) ++ length_bytes = 1; ++ ++ buf[(*offset)++] = 0x80 + length_bytes; ++ ++ for (i = length_bytes-1; i >= 0; i--) ++ { ++ buf[*offset+i] = len & 0xFF; ++ len >>= 8; ++ } ++ ++ *offset += length_bytes; ++ return length_bytes+1; ++ } ++} ++ ++static int pre_adjust_with_size(uint8_t type, ++ int *seq_offset, uint8_t *buf, int *offset) ++{ ++ buf[(*offset)++] = type; ++ *seq_offset = *offset; ++ *offset += 4; /* fill in later */ ++ return *offset; ++} ++ ++static void adjust_with_size(int seq_size, int seq_start, ++ uint8_t *buf, int *offset) ++{ ++ uint8_t seq_byte_size; ++ int orig_seq_size = seq_size; ++ int orig_seq_start = seq_start; ++ ++ seq_size = *offset-seq_size; ++ seq_byte_size = set_gen_length(seq_size, buf, &seq_start); ++ ++ if (seq_byte_size != 4) ++ { ++ memmove(&buf[orig_seq_start+seq_byte_size], ++ &buf[orig_seq_size], seq_size); ++ *offset -= 4-seq_byte_size; ++ } ++} ++ ++static void gen_serial_number(uint8_t *buf, int *offset) ++{ ++ static const uint8_t ser_oid[] = { ASN1_INTEGER, 1, 0x7F }; ++ memcpy(&buf[*offset], ser_oid , sizeof(ser_oid)); ++ *offset += sizeof(ser_oid); ++} ++ ++static void gen_signature_alg(uint8_t *buf, int *offset) ++{ ++ /* OBJECT IDENTIFIER sha1withRSAEncryption (1 2 840 113549 1 1 5) */ ++ static const uint8_t sig_oid[] = ++ { ++ ASN1_SEQUENCE, 0x0d, ASN1_OID, 0x09, ++ 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x05, ++ ASN1_NULL, 0x00 ++ }; ++ ++ memcpy(&buf[*offset], sig_oid, sizeof(sig_oid)); ++ *offset += sizeof(sig_oid); ++} ++ ++static int gen_dn(const char *name, uint8_t dn_type, ++ uint8_t *buf, int *offset) ++{ ++ int ret = X509_OK; ++ int name_size = strlen(name); ++ ++ if (name_size > 0x70) /* just too big */ ++ { ++ ret = X509_NOT_OK; ++ goto error; ++ } ++ ++ buf[(*offset)++] = ASN1_SET; ++ set_gen_length(9+name_size, buf, offset); ++ buf[(*offset)++] = ASN1_SEQUENCE; ++ set_gen_length(7+name_size, buf, offset); ++ buf[(*offset)++] = ASN1_OID; ++ buf[(*offset)++] = 3; ++ buf[(*offset)++] = 0x55; ++ buf[(*offset)++] = 0x04; ++ buf[(*offset)++] = dn_type; ++ buf[(*offset)++] = ASN1_PRINTABLE_STR; ++ buf[(*offset)++] = name_size; ++ strcpy(&buf[*offset], name); ++ *offset += name_size; ++ ++error: ++ return ret; ++} ++ ++static int gen_issuer(const char * dn[], uint8_t *buf, int *offset) ++{ ++ int ret = X509_OK; ++ int seq_offset; ++ int seq_size = pre_adjust_with_size( ++ ASN1_SEQUENCE, &seq_offset, buf, offset); ++ char fqdn[128]; ++ ++ /* we need the common name, so if not configured, work out the fully ++ * qualified domain name */ ++ if (dn[X509_COMMON_NAME] == NULL || strlen(dn[X509_COMMON_NAME]) == 0) ++ { ++ int fqdn_len; ++ gethostname(fqdn, sizeof(fqdn)); ++ fqdn_len = strlen(fqdn); ++ fqdn[fqdn_len++] = '.'; ++ getdomainname(&fqdn[fqdn_len], sizeof(fqdn)-fqdn_len); ++ fqdn_len = strlen(fqdn); ++ ++ if (fqdn[fqdn_len-1] == '.') /* ensure '.' is not last char */ ++ fqdn[fqdn_len-1] = 0; ++ ++ dn[X509_COMMON_NAME] = fqdn; ++ } ++ ++ if ((ret = gen_dn(dn[X509_COMMON_NAME], 3, buf, offset))) ++ goto error; ++ ++ if (dn[X509_ORGANIZATION] != NULL && strlen(dn[X509_ORGANIZATION]) > 0) ++ { ++ if ((ret = gen_dn(dn[X509_ORGANIZATION], 10, buf, offset))) ++ goto error; ++ } ++ ++ if (dn[X509_ORGANIZATIONAL_UNIT] != NULL && ++ strlen(dn[X509_ORGANIZATIONAL_UNIT]) > 0) ++ { ++ if ((ret = gen_dn(dn[X509_ORGANIZATIONAL_UNIT], 11, buf, offset))) ++ goto error; ++ } ++ ++ adjust_with_size(seq_size, seq_offset, buf, offset); ++ ++error: ++ return ret; ++} ++ ++static void gen_utc_time(uint8_t *buf, int *offset) ++{ ++ static const uint8_t time_seq[] = ++ { ++ ASN1_SEQUENCE, 30, ++ ASN1_UTC_TIME, 13, ++ '0', '7', '0', '1', '0', '1', '0', '0', '0', '0', '0', '0', 'Z', ++ ASN1_UTC_TIME, 13, /* make it good for 30 or so years */ ++ '3', '8', '0', '1', '0', '1', '0', '0', '0', '0', '0', '0', 'Z' ++ }; ++ ++ /* fixed time */ ++ memcpy(&buf[*offset], time_seq, sizeof(time_seq)); ++ *offset += sizeof(time_seq); ++} ++ ++static void gen_pub_key2(const RSA_CTX *rsa_ctx, uint8_t *buf, int *offset) ++{ ++ static const uint8_t pub_key_seq[] = ++ { ++ ASN1_INTEGER, 0x03, 0x01, 0x00, 0x01 /* INTEGER 65537 */ ++ }; ++ ++ int seq_offset; ++ int pub_key_size = rsa_ctx->num_octets; ++ uint8_t *block = (uint8_t *)alloca(pub_key_size); ++ int seq_size = pre_adjust_with_size( ++ ASN1_SEQUENCE, &seq_offset, buf, offset); ++ buf[(*offset)++] = ASN1_INTEGER; ++ bi_export(rsa_ctx->bi_ctx, rsa_ctx->m, block, pub_key_size); ++ ++ if (*block & 0x80) /* make integer positive */ ++ { ++ set_gen_length(pub_key_size+1, buf, offset); ++ buf[(*offset)++] = 0; ++ } ++ else ++ set_gen_length(pub_key_size, buf, offset); ++ ++ memcpy(&buf[*offset], block, pub_key_size); ++ *offset += pub_key_size; ++ memcpy(&buf[*offset], pub_key_seq, sizeof(pub_key_seq)); ++ *offset += sizeof(pub_key_seq); ++ adjust_with_size(seq_size, seq_offset, buf, offset); ++} ++ ++static void gen_pub_key1(const RSA_CTX *rsa_ctx, uint8_t *buf, int *offset) ++{ ++ int seq_offset; ++ int seq_size = pre_adjust_with_size( ++ ASN1_BIT_STRING, &seq_offset, buf, offset); ++ buf[(*offset)++] = 0; /* bit string is multiple of 8 */ ++ gen_pub_key2(rsa_ctx, buf, offset); ++ adjust_with_size(seq_size, seq_offset, buf, offset); ++} ++ ++static void gen_pub_key(const RSA_CTX *rsa_ctx, uint8_t *buf, int *offset) ++{ ++ /* OBJECT IDENTIFIER rsaEncryption (1 2 840 113549 1 1 1) */ ++ static const uint8_t rsa_enc_oid[] = ++ { ++ ASN1_SEQUENCE, 0x0d, ASN1_OID, 0x09, ++ 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x01, ++ ASN1_NULL, 0x00 ++ }; ++ ++ int seq_offset; ++ int seq_size = pre_adjust_with_size( ++ ASN1_SEQUENCE, &seq_offset, buf, offset); ++ ++ memcpy(&buf[*offset], rsa_enc_oid, sizeof(rsa_enc_oid)); ++ *offset += sizeof(rsa_enc_oid); ++ gen_pub_key1(rsa_ctx, buf, offset); ++ adjust_with_size(seq_size, seq_offset, buf, offset); ++} ++ ++static void gen_signature(const RSA_CTX *rsa_ctx, const uint8_t *sha_dgst, ++ uint8_t *buf, int *offset) ++{ ++ static const uint8_t asn1_sig[] = ++ { ++ ASN1_SEQUENCE, 0x21, ASN1_SEQUENCE, 0x09, ASN1_OID, 0x05, ++ 0x2b, 0x0e, 0x03, 0x02, 0x1a, /* sha1 (1 3 14 3 2 26) */ ++ ASN1_NULL, 0x00, ASN1_OCTET_STRING, 0x14 ++ }; ++ ++ uint8_t *enc_block = (uint8_t *)alloca(rsa_ctx->num_octets); ++ uint8_t *block = (uint8_t *)alloca(sizeof(asn1_sig) + SHA1_SIZE); ++ int sig_size; ++ ++ /* add the digest as an embedded asn.1 sequence */ ++ memcpy(block, asn1_sig, sizeof(asn1_sig)); ++ memcpy(&block[sizeof(asn1_sig)], sha_dgst, SHA1_SIZE); ++ ++ sig_size = RSA_encrypt(rsa_ctx, block, ++ sizeof(asn1_sig) + SHA1_SIZE, enc_block, 1); ++ ++ buf[(*offset)++] = ASN1_BIT_STRING; ++ set_gen_length(sig_size+1, buf, offset); ++ buf[(*offset)++] = 0; /* bit string is multiple of 8 */ ++ memcpy(&buf[*offset], enc_block, sig_size); ++ *offset += sig_size; ++} ++ ++static int gen_tbs_cert(const char * dn[], ++ const RSA_CTX *rsa_ctx, uint8_t *buf, int *offset, ++ uint8_t *sha_dgst) ++{ ++ int ret = X509_OK; ++ SHA1_CTX sha_ctx; ++ int seq_offset; ++ int begin_tbs = *offset; ++ int seq_size = pre_adjust_with_size( ++ ASN1_SEQUENCE, &seq_offset, buf, offset); ++ ++ gen_serial_number(buf, offset); ++ gen_signature_alg(buf, offset); ++ ++ /* CA certicate issuer */ ++ if ((ret = gen_issuer(dn, buf, offset))) ++ goto error; ++ ++ gen_utc_time(buf, offset); ++ ++ /* certificate issuer */ ++ if ((ret = gen_issuer(dn, buf, offset))) ++ goto error; ++ ++ gen_pub_key(rsa_ctx, buf, offset); ++ adjust_with_size(seq_size, seq_offset, buf, offset); ++ ++ SHA1_Init(&sha_ctx); ++ SHA1_Update(&sha_ctx, &buf[begin_tbs], *offset-begin_tbs); ++ SHA1_Final(sha_dgst, &sha_ctx); ++ ++error: ++ return ret; ++} ++ ++/** ++ * Create a new certificate. ++ */ ++EXP_FUNC int STDCALL ssl_x509_create(SSL_CTX *ssl_ctx, uint32_t options, const char * dn[], uint8_t **cert_data) ++{ ++ int ret = X509_OK, offset = 0, seq_offset; ++ /* allocate enough space to load a new certificate */ ++ uint8_t *buf = (uint8_t *)alloca(ssl_ctx->rsa_ctx->num_octets*2 + 512); ++ uint8_t sha_dgst[SHA1_SIZE]; ++ int seq_size = pre_adjust_with_size(ASN1_SEQUENCE, ++ &seq_offset, buf, &offset); ++ ++ if ((ret = gen_tbs_cert(dn, ssl_ctx->rsa_ctx, buf, &offset, sha_dgst)) < 0) ++ goto error; ++ ++ gen_signature_alg(buf, &offset); ++ gen_signature(ssl_ctx->rsa_ctx, sha_dgst, buf, &offset); ++ adjust_with_size(seq_size, seq_offset, buf, &offset); ++ *cert_data = (uint8_t *)malloc(offset); /* create the exact memory for it */ ++ memcpy(*cert_data, buf, offset); ++ ++error: ++ return ret < 0 ? ret : offset; ++} ++ ++#endif ++ +diff --git a/feeds/luci/libs/luci-lib-nixio/axTLS/ssl/loader.c b/feeds/luci/libs/luci-lib-nixio/axTLS/ssl/loader.c +new file mode 100644 +index 0000000..4232f7e +--- /dev/null ++++ b/feeds/luci/libs/luci-lib-nixio/axTLS/ssl/loader.c +@@ -0,0 +1,465 @@ ++/* ++ * Copyright (c) 2007, Cameron Rich ++ * ++ * All rights reserved. ++ * ++ * Redistribution and use in source and binary forms, with or without ++ * modification, are permitted provided that the following conditions are met: ++ * ++ * * Redistributions of source code must retain the above copyright notice, ++ * this list of conditions and the following disclaimer. ++ * * 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. ++ * * Neither the name of the axTLS project nor the names of its contributors ++ * may be used to endorse or promote products derived from this software ++ * without specific prior written permission. ++ * ++ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ++ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT ++ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR ++ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR ++ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, ++ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, ++ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR ++ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF ++ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING ++ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS ++ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ++ */ ++ ++/** ++ * Load certificates/keys into memory. These can be in many different formats. ++ * PEM support and other formats can be processed here. ++ * ++ * The PEM private keys may be optionally encrypted with AES128 or AES256. ++ * The encrypted PEM keys were generated with something like: ++ * ++ * openssl genrsa -aes128 -passout pass:abcd -out axTLS.key_aes128.pem 512 ++ */ ++ ++#include ++#include ++#include ++ ++#include "ssl.h" ++ ++static int do_obj(SSL_CTX *ssl_ctx, int obj_type, ++ SSLObjLoader *ssl_obj, const char *password); ++#ifdef CONFIG_SSL_HAS_PEM ++static int ssl_obj_PEM_load(SSL_CTX *ssl_ctx, int obj_type, ++ SSLObjLoader *ssl_obj, const char *password); ++#endif ++ ++/* ++ * Load a file into memory that is in binary DER (or ascii PEM) format. ++ */ ++EXP_FUNC int STDCALL ssl_obj_load(SSL_CTX *ssl_ctx, int obj_type, ++ const char *filename, const char *password) ++{ ++#ifndef CONFIG_SSL_SKELETON_MODE ++ static const char * const begin = "-----BEGIN"; ++ int ret = SSL_OK; ++ SSLObjLoader *ssl_obj = NULL; ++ ++ if (filename == NULL) ++ { ++ ret = SSL_ERROR_INVALID_KEY; ++ goto error; ++ } ++ ++ ssl_obj = (SSLObjLoader *)calloc(1, sizeof(SSLObjLoader)); ++ ssl_obj->len = get_file(filename, &ssl_obj->buf); ++ if (ssl_obj->len <= 0) ++ { ++ ret = SSL_ERROR_INVALID_KEY; ++ goto error; ++ } ++ ++ /* is the file a PEM file? */ ++ if (strncmp((char *)ssl_obj->buf, begin, strlen(begin)) == 0) ++ { ++#ifdef CONFIG_SSL_HAS_PEM ++ ret = ssl_obj_PEM_load(ssl_ctx, obj_type, ssl_obj, password); ++#else ++ printf(unsupported_str); ++ ret = SSL_ERROR_NOT_SUPPORTED; ++#endif ++ } ++ else ++ ret = do_obj(ssl_ctx, obj_type, ssl_obj, password); ++ ++error: ++ ssl_obj_free(ssl_obj); ++ return ret; ++#else ++ printf(unsupported_str); ++ return SSL_ERROR_NOT_SUPPORTED; ++#endif /* CONFIG_SSL_SKELETON_MODE */ ++} ++ ++/* ++ * Transfer binary data into the object loader. ++ */ ++EXP_FUNC int STDCALL ssl_obj_memory_load(SSL_CTX *ssl_ctx, int mem_type, ++ const uint8_t *data, int len, const char *password) ++{ ++ int ret; ++ SSLObjLoader *ssl_obj; ++ ++ ssl_obj = (SSLObjLoader *)calloc(1, sizeof(SSLObjLoader)); ++ ssl_obj->buf = (uint8_t *)malloc(len); ++ memcpy(ssl_obj->buf, data, len); ++ ssl_obj->len = len; ++ ret = do_obj(ssl_ctx, mem_type, ssl_obj, password); ++ ssl_obj_free(ssl_obj); ++ return ret; ++} ++ ++/* ++ * Actually work out what we are doing ++ */ ++static int do_obj(SSL_CTX *ssl_ctx, int obj_type, ++ SSLObjLoader *ssl_obj, const char *password) ++{ ++ int ret = SSL_OK; ++ ++ switch (obj_type) ++ { ++ case SSL_OBJ_RSA_KEY: ++ ret = add_private_key(ssl_ctx, ssl_obj); ++ break; ++ ++ case SSL_OBJ_X509_CERT: ++ ret = add_cert(ssl_ctx, ssl_obj->buf, ssl_obj->len); ++ break; ++ ++#ifdef CONFIG_SSL_CERT_VERIFICATION ++ case SSL_OBJ_X509_CACERT: ++ ret = add_cert_auth(ssl_ctx, ssl_obj->buf, ssl_obj->len); ++ break; ++#endif ++ ++#ifdef CONFIG_SSL_USE_PKCS12 ++ case SSL_OBJ_PKCS8: ++ ret = pkcs8_decode(ssl_ctx, ssl_obj, password); ++ break; ++ ++ case SSL_OBJ_PKCS12: ++ ret = pkcs12_decode(ssl_ctx, ssl_obj, password); ++ break; ++#endif ++ default: ++ printf(unsupported_str); ++ ret = SSL_ERROR_NOT_SUPPORTED; ++ break; ++ } ++ ++ return ret; ++} ++ ++/* ++ * Clean up our mess. ++ */ ++void ssl_obj_free(SSLObjLoader *ssl_obj) ++{ ++ if (ssl_obj) ++ { ++ free(ssl_obj->buf); ++ free(ssl_obj); ++ } ++} ++ ++/* ++ * Support for PEM encoded keys/certificates. ++ */ ++#ifdef CONFIG_SSL_HAS_PEM ++ ++#define NUM_PEM_TYPES 3 ++#define IV_SIZE 16 ++#define IS_RSA_PRIVATE_KEY 0 ++#define IS_ENCRYPTED_PRIVATE_KEY 1 ++#define IS_CERTIFICATE 2 ++ ++static const char * const begins[NUM_PEM_TYPES] = ++{ ++ "-----BEGIN RSA PRIVATE KEY-----", ++ "-----BEGIN ENCRYPTED PRIVATE KEY-----", ++ "-----BEGIN CERTIFICATE-----", ++}; ++ ++static const char * const ends[NUM_PEM_TYPES] = ++{ ++ "-----END RSA PRIVATE KEY-----", ++ "-----END ENCRYPTED PRIVATE KEY-----", ++ "-----END CERTIFICATE-----", ++}; ++ ++static const char * const aes_str[2] = ++{ ++ "DEK-Info: AES-128-CBC,", ++ "DEK-Info: AES-256-CBC," ++}; ++ ++/** ++ * Take a base64 blob of data and decrypt it (using AES) into its ++ * proper ASN.1 form. ++ */ ++static int pem_decrypt(const char *where, const char *end, ++ const char *password, SSLObjLoader *ssl_obj) ++{ ++ int ret = -1; ++ int is_aes_256 = 0; ++ char *start = NULL; ++ uint8_t iv[IV_SIZE]; ++ int i, pem_size; ++ MD5_CTX md5_ctx; ++ AES_CTX aes_ctx; ++ uint8_t key[32]; /* AES256 size */ ++ ++ if (password == NULL || strlen(password) == 0) ++ { ++#ifdef CONFIG_SSL_FULL_MODE ++ printf("Error: Need a password for this PEM file\n"); TTY_FLUSH(); ++#endif ++ goto error; ++ } ++ ++ if ((start = strstr((const char *)where, aes_str[0]))) /* AES128? */ ++ { ++ start += strlen(aes_str[0]); ++ } ++ else if ((start = strstr((const char *)where, aes_str[1]))) /* AES256? */ ++ { ++ is_aes_256 = 1; ++ start += strlen(aes_str[1]); ++ } ++ else ++ { ++#ifdef CONFIG_SSL_FULL_MODE ++ printf("Error: Unsupported password cipher\n"); TTY_FLUSH(); ++#endif ++ goto error; ++ } ++ ++ /* convert from hex to binary - assumes uppercase hex */ ++ for (i = 0; i < IV_SIZE; i++) ++ { ++ char c = *start++ - '0'; ++ iv[i] = (c > 9 ? c + '0' - 'A' + 10 : c) << 4; ++ c = *start++ - '0'; ++ iv[i] += (c > 9 ? c + '0' - 'A' + 10 : c); ++ } ++ ++ while (*start == '\r' || *start == '\n') ++ start++; ++ ++ /* turn base64 into binary */ ++ pem_size = (int)(end-start); ++ if (base64_decode(start, pem_size, ssl_obj->buf, &ssl_obj->len) != 0) ++ goto error; ++ ++ /* work out the key */ ++ MD5_Init(&md5_ctx); ++ MD5_Update(&md5_ctx, (const uint8_t *)password, strlen(password)); ++ MD5_Update(&md5_ctx, iv, SALT_SIZE); ++ MD5_Final(key, &md5_ctx); ++ ++ if (is_aes_256) ++ { ++ MD5_Init(&md5_ctx); ++ MD5_Update(&md5_ctx, key, MD5_SIZE); ++ MD5_Update(&md5_ctx, (const uint8_t *)password, strlen(password)); ++ MD5_Update(&md5_ctx, iv, SALT_SIZE); ++ MD5_Final(&key[MD5_SIZE], &md5_ctx); ++ } ++ ++ /* decrypt using the key/iv */ ++ AES_set_key(&aes_ctx, key, iv, is_aes_256 ? AES_MODE_256 : AES_MODE_128); ++ AES_convert_key(&aes_ctx); ++ AES_cbc_decrypt(&aes_ctx, ssl_obj->buf, ssl_obj->buf, ssl_obj->len); ++ ret = 0; ++ ++error: ++ return ret; ++} ++ ++/** ++ * Take a base64 blob of data and turn it into its proper ASN.1 form. ++ */ ++static int new_pem_obj(SSL_CTX *ssl_ctx, int is_cacert, char *where, ++ int remain, const char *password) ++{ ++ int ret = SSL_OK; ++ SSLObjLoader *ssl_obj = NULL; ++ int i, pem_size, obj_type; ++ char *start = NULL, *end = NULL; ++ ++ for (i = 0; i < NUM_PEM_TYPES; i++) ++ { ++ if ((start = strstr(where, begins[i])) && ++ (end = strstr(where, ends[i]))) ++ { ++ remain -= (int)(end-start); ++ start += strlen(begins[i]); ++ pem_size = (int)(end-start); ++ ++ ssl_obj = (SSLObjLoader *)calloc(1, sizeof(SSLObjLoader)); ++ ++ /* 4/3 bigger than what we need but so what */ ++ ssl_obj->buf = (uint8_t *)calloc(1, pem_size); ++ ++ if (i == IS_RSA_PRIVATE_KEY && ++ strstr(start, "Proc-Type:") && ++ strstr(start, "4,ENCRYPTED")) ++ { ++ /* check for encrypted PEM file */ ++ if (pem_decrypt(start, end, password, ssl_obj) < 0) ++ goto error; ++ } ++ else if (base64_decode(start, pem_size, ++ ssl_obj->buf, &ssl_obj->len) != 0) ++ goto error; ++ ++ switch (i) ++ { ++ case IS_RSA_PRIVATE_KEY: ++ obj_type = SSL_OBJ_RSA_KEY; ++ break; ++ ++ case IS_ENCRYPTED_PRIVATE_KEY: ++ obj_type = SSL_OBJ_PKCS8; ++ break; ++ ++ case IS_CERTIFICATE: ++ obj_type = is_cacert ? ++ SSL_OBJ_X509_CACERT : SSL_OBJ_X509_CERT; ++ break; ++ ++ default: ++ goto error; ++ } ++ ++ /* In a format we can now understand - so process it */ ++ if ((ret = do_obj(ssl_ctx, obj_type, ssl_obj, password))) ++ goto error; ++ ++ end += strlen(ends[i]); ++ remain -= strlen(ends[i]); ++ while (remain > 0 && (*end == '\r' || *end == '\n')) ++ { ++ end++; ++ remain--; ++ } ++ ++ break; ++ } ++ } ++ ++ if (i == NUM_PEM_TYPES) ++ goto error; ++ ++ /* more PEM stuff to process? */ ++ if (remain) ++ ret = new_pem_obj(ssl_ctx, is_cacert, end, remain, password); ++ ++error: ++ ssl_obj_free(ssl_obj); ++ return ret; ++} ++ ++/* ++ * Load a file into memory that is in ASCII PEM format. ++ */ ++static int ssl_obj_PEM_load(SSL_CTX *ssl_ctx, int obj_type, ++ SSLObjLoader *ssl_obj, const char *password) ++{ ++ char *start; ++ ++ /* add a null terminator */ ++ ssl_obj->len++; ++ ssl_obj->buf = (uint8_t *)realloc(ssl_obj->buf, ssl_obj->len); ++ ssl_obj->buf[ssl_obj->len-1] = 0; ++ start = (char *)ssl_obj->buf; ++ return new_pem_obj(ssl_ctx, obj_type == SSL_OBJ_X509_CACERT, ++ start, ssl_obj->len, password); ++} ++#endif /* CONFIG_SSL_HAS_PEM */ ++ ++/** ++ * Load the key/certificates in memory depending on compile-time and user ++ * options. ++ */ ++int load_key_certs(SSL_CTX *ssl_ctx) ++{ ++ int ret = SSL_OK; ++ uint32_t options = ssl_ctx->options; ++#ifdef CONFIG_SSL_GENERATE_X509_CERT ++ uint8_t *cert_data = NULL; ++ int cert_size; ++ static const char *dn[] = ++ { ++ CONFIG_SSL_X509_COMMON_NAME, ++ CONFIG_SSL_X509_ORGANIZATION_NAME, ++ CONFIG_SSL_X509_ORGANIZATION_UNIT_NAME ++ }; ++#endif ++ ++ /* do the private key first */ ++ if (strlen(CONFIG_SSL_PRIVATE_KEY_LOCATION) > 0) ++ { ++ if ((ret = ssl_obj_load(ssl_ctx, SSL_OBJ_RSA_KEY, ++ CONFIG_SSL_PRIVATE_KEY_LOCATION, ++ CONFIG_SSL_PRIVATE_KEY_PASSWORD)) < 0) ++ goto error; ++ } ++ else if (!(options & SSL_NO_DEFAULT_KEY)) ++ { ++#if defined(CONFIG_SSL_USE_DEFAULT_KEY) || defined(CONFIG_SSL_SKELETON_MODE) ++ static const /* saves a few more bytes */ ++#include "private_key.h" ++ ++ ssl_obj_memory_load(ssl_ctx, SSL_OBJ_RSA_KEY, default_private_key, ++ default_private_key_len, NULL); ++#endif ++ } ++ ++ /* now load the certificate */ ++#ifdef CONFIG_SSL_GENERATE_X509_CERT ++ if ((cert_size = ssl_x509_create(ssl_ctx, 0, dn, &cert_data)) < 0) ++ { ++ ret = cert_size; ++ goto error; ++ } ++ ++ ssl_obj_memory_load(ssl_ctx, SSL_OBJ_X509_CERT, cert_data, cert_size, NULL); ++ free(cert_data); ++#else ++ if (strlen(CONFIG_SSL_X509_CERT_LOCATION)) ++ { ++ if ((ret = ssl_obj_load(ssl_ctx, SSL_OBJ_X509_CERT, ++ CONFIG_SSL_X509_CERT_LOCATION, NULL)) < 0) ++ goto error; ++ } ++ else if (!(options & SSL_NO_DEFAULT_KEY)) ++ { ++#if defined(CONFIG_SSL_USE_DEFAULT_KEY) || defined(CONFIG_SSL_SKELETON_MODE) ++ static const /* saves a few bytes and RAM */ ++#include "cert.h" ++ ssl_obj_memory_load(ssl_ctx, SSL_OBJ_X509_CERT, ++ default_certificate, default_certificate_len, NULL); ++#endif ++ } ++#endif ++ ++error: ++#ifdef CONFIG_SSL_FULL_MODE ++ if (ret) ++ { ++ printf("Error: Certificate or key not loaded\n"); TTY_FLUSH(); ++ } ++#endif ++ ++ return ret; ++ ++} +diff --git a/feeds/luci/libs/luci-lib-nixio/axTLS/ssl/openssl.c b/feeds/luci/libs/luci-lib-nixio/axTLS/ssl/openssl.c +new file mode 100644 +index 0000000..b6b9550 +--- /dev/null ++++ b/feeds/luci/libs/luci-lib-nixio/axTLS/ssl/openssl.c +@@ -0,0 +1,322 @@ ++/* ++ * Copyright (c) 2007, Cameron Rich ++ * ++ * All rights reserved. ++ * ++ * Redistribution and use in source and binary forms, with or without ++ * modification, are permitted provided that the following conditions are met: ++ * ++ * * Redistributions of source code must retain the above copyright notice, ++ * this list of conditions and the following disclaimer. ++ * * 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. ++ * * Neither the name of the axTLS project nor the names of its contributors ++ * may be used to endorse or promote products derived from this software ++ * without specific prior written permission. ++ * ++ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ++ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT ++ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR ++ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR ++ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, ++ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, ++ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR ++ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF ++ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING ++ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS ++ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ++ */ ++ ++/* ++ * Enable a subset of openssl compatible functions. We don't aim to be 100% ++ * compatible - just to be able to do basic ports etc. ++ * ++ * Only really tested on mini_httpd, so I'm not too sure how extensive this ++ * port is. ++ */ ++ ++#include "config.h" ++ ++#ifdef CONFIG_OPENSSL_COMPATIBLE ++#include ++#include ++#include ++#include "ssl.h" ++ ++#define OPENSSL_CTX_ATTR ((OPENSSL_CTX *)ssl_ctx->bonus_attr) ++ ++static char *key_password = NULL; ++ ++void *SSLv23_server_method(void) { return NULL; } ++void *SSLv3_server_method(void) { return NULL; } ++void *TLSv1_server_method(void) { return NULL; } ++void *SSLv23_client_method(void) { return NULL; } ++void *SSLv3_client_method(void) { return NULL; } ++void *TLSv1_client_method(void) { return NULL; } ++ ++typedef void * (*ssl_func_type_t)(void); ++typedef void * (*bio_func_type_t)(void); ++ ++typedef struct ++{ ++ ssl_func_type_t ssl_func_type; ++} OPENSSL_CTX; ++ ++SSL_CTX * SSL_CTX_new(ssl_func_type_t meth) ++{ ++ SSL_CTX *ssl_ctx = ssl_ctx_new(0, 5); ++ ssl_ctx->bonus_attr = malloc(sizeof(OPENSSL_CTX)); ++ OPENSSL_CTX_ATTR->ssl_func_type = meth; ++ return ssl_ctx; ++} ++ ++void SSL_CTX_free(SSL_CTX * ssl_ctx) ++{ ++ free(ssl_ctx->bonus_attr); ++ ssl_ctx_free(ssl_ctx); ++} ++ ++SSL * SSL_new(SSL_CTX *ssl_ctx) ++{ ++ SSL *ssl; ++ ssl_func_type_t ssl_func_type; ++ ++ ssl = ssl_new(ssl_ctx, -1); /* fd is set later */ ++ ssl_func_type = OPENSSL_CTX_ATTR->ssl_func_type; ++ ++#ifdef CONFIG_SSL_ENABLE_CLIENT ++ if (ssl_func_type == SSLv23_client_method || ++ ssl_func_type == SSLv3_client_method || ++ ssl_func_type == TLSv1_client_method) ++ { ++ SET_SSL_FLAG(SSL_IS_CLIENT); ++ } ++ else ++#endif ++ { ++ ssl->next_state = HS_CLIENT_HELLO; ++ } ++ ++ return ssl; ++} ++ ++int SSL_set_fd(SSL *s, int fd) ++{ ++ s->client_fd = fd; ++ return 1; /* always succeeds */ ++} ++ ++int SSL_accept(SSL *ssl) ++{ ++ while (ssl_read(ssl, NULL) == SSL_OK) ++ { ++ if (ssl->next_state == HS_CLIENT_HELLO) ++ return 1; /* we're done */ ++ } ++ ++ return -1; ++} ++ ++#ifdef CONFIG_SSL_ENABLE_CLIENT ++int SSL_connect(SSL *ssl) ++{ ++ return do_client_connect(ssl) == SSL_OK ? 1 : -1; ++} ++#endif ++ ++void SSL_free(SSL *ssl) ++{ ++ ssl_free(ssl); ++} ++ ++int SSL_read(SSL *ssl, void *buf, int num) ++{ ++ uint8_t *read_buf; ++ int ret; ++ ++ while ((ret = ssl_read(ssl, &read_buf)) == SSL_OK); ++ ++ if (ret > SSL_OK) ++ { ++ memcpy(buf, read_buf, ret > num ? num : ret); ++ } ++ ++ return ret; ++} ++ ++int SSL_write(SSL *ssl, const void *buf, int num) ++{ ++ return ssl_write(ssl, buf, num); ++} ++ ++int SSL_CTX_use_certificate_file(SSL_CTX *ssl_ctx, const char *file, int type) ++{ ++ return (ssl_obj_load(ssl_ctx, SSL_OBJ_X509_CERT, file, NULL) == SSL_OK); ++} ++ ++int SSL_CTX_use_PrivateKey_file(SSL_CTX *ssl_ctx, const char *file, int type) ++{ ++ return (ssl_obj_load(ssl_ctx, SSL_OBJ_RSA_KEY, file, key_password) == SSL_OK); ++} ++ ++int SSL_CTX_use_certificate_ASN1(SSL_CTX *ssl_ctx, int len, const uint8_t *d) ++{ ++ return (ssl_obj_memory_load(ssl_ctx, ++ SSL_OBJ_X509_CERT, d, len, NULL) == SSL_OK); ++} ++ ++int SSL_CTX_set_session_id_context(SSL_CTX *ctx, const unsigned char *sid_ctx, ++ unsigned int sid_ctx_len) ++{ ++ return 1; ++} ++ ++int SSL_CTX_set_default_verify_paths(SSL_CTX *ctx) ++{ ++ return 1; ++} ++ ++int SSL_CTX_use_certificate_chain_file(SSL_CTX *ssl_ctx, const char *file) ++{ ++ return (ssl_obj_load(ssl_ctx, ++ SSL_OBJ_X509_CERT, file, NULL) == SSL_OK); ++} ++ ++int SSL_shutdown(SSL *ssl) ++{ ++ return 1; ++} ++ ++/*** get/set session ***/ ++SSL_SESSION *SSL_get1_session(SSL *ssl) ++{ ++ return (SSL_SESSION *)ssl_get_session_id(ssl); /* note: wrong cast */ ++} ++ ++int SSL_set_session(SSL *ssl, SSL_SESSION *session) ++{ ++ memcpy(ssl->session_id, (uint8_t *)session, SSL_SESSION_ID_SIZE); ++ return 1; ++} ++ ++void SSL_SESSION_free(SSL_SESSION *session) { } ++/*** end get/set session ***/ ++ ++long SSL_CTX_ctrl(SSL_CTX *ctx, int cmd, long larg, void *parg) ++{ ++ return 0; ++} ++ ++void SSL_CTX_set_verify(SSL_CTX *ctx, int mode, ++ int (*verify_callback)(int, void *)) { } ++ ++void SSL_CTX_set_verify_depth(SSL_CTX *ctx,int depth) { } ++ ++int SSL_CTX_load_verify_locations(SSL_CTX *ctx, const char *CAfile, ++ const char *CApath) ++{ ++ return 1; ++} ++ ++void *SSL_load_client_CA_file(const char *file) ++{ ++ return (void *)file; ++} ++ ++void SSL_CTX_set_client_CA_list(SSL_CTX *ssl_ctx, void *file) ++{ ++ ++ ssl_obj_load(ssl_ctx, SSL_OBJ_X509_CERT, (const char *)file, NULL); ++} ++ ++void SSLv23_method(void) { } ++ ++void SSL_CTX_set_default_passwd_cb(SSL_CTX *ctx, void *cb) { } ++ ++void SSL_CTX_set_default_passwd_cb_userdata(SSL_CTX *ctx, void *u) ++{ ++ key_password = (char *)u; ++} ++ ++int SSL_peek(SSL *ssl, void *buf, int num) ++{ ++ memcpy(buf, ssl->bm_data, num); ++ return num; ++} ++ ++void SSL_set_bio(SSL *ssl, void *rbio, void *wbio) { } ++ ++long SSL_get_verify_result(const SSL *ssl) ++{ ++ return ssl_handshake_status(ssl); ++} ++ ++int SSL_state(SSL *ssl) ++{ ++ return 0x03; // ok state ++} ++ ++/** end of could do better list */ ++ ++void *SSL_get_peer_certificate(const SSL *ssl) ++{ ++ return &ssl->ssl_ctx->certs[0]; ++} ++ ++int SSL_clear(SSL *ssl) ++{ ++ return 1; ++} ++ ++ ++int SSL_CTX_check_private_key(const SSL_CTX *ctx) ++{ ++ return 1; ++} ++ ++int SSL_CTX_set_cipher_list(SSL *s, const char *str) ++{ ++ return 1; ++} ++ ++int SSL_get_error(const SSL *ssl, int ret) ++{ ++ ssl_display_error(ret); ++ return 0; /* TODO: return proper return code */ ++} ++ ++void SSL_CTX_set_options(SSL_CTX *ssl_ctx, int option) {} ++int SSL_library_init(void ) { return 1; } ++void SSL_load_error_strings(void ) {} ++void ERR_print_errors_fp(FILE *fp) {} ++ ++#ifndef CONFIG_SSL_SKELETON_MODE ++long SSL_CTX_get_timeout(const SSL_CTX *ssl_ctx) { ++ return CONFIG_SSL_EXPIRY_TIME*3600; } ++long SSL_CTX_set_timeout(SSL_CTX *ssl_ctx, long t) { ++ return SSL_CTX_get_timeout(ssl_ctx); } ++#endif ++void BIO_printf(FILE *f, const char *format, ...) ++{ ++ va_list(ap); ++ va_start(ap, format); ++ vfprintf(f, format, ap); ++ va_end(ap); ++} ++ ++void* BIO_s_null(void) { return NULL; } ++FILE *BIO_new(bio_func_type_t func) ++{ ++ if (func == BIO_s_null) ++ return fopen("/dev/null", "r"); ++ else ++ return NULL; ++} ++ ++FILE *BIO_new_fp(FILE *stream, int close_flag) { return stream; } ++int BIO_free(FILE *a) { if (a != stdout && a != stderr) fclose(a); return 1; } ++ ++ ++ ++#endif +diff --git a/feeds/luci/libs/luci-lib-nixio/axTLS/ssl/os_port.c b/feeds/luci/libs/luci-lib-nixio/axTLS/ssl/os_port.c +new file mode 100644 +index 0000000..6a71000 +--- /dev/null ++++ b/feeds/luci/libs/luci-lib-nixio/axTLS/ssl/os_port.c +@@ -0,0 +1,158 @@ ++/* ++ * Copyright (c) 2007, Cameron Rich ++ * ++ * All rights reserved. ++ * ++ * Redistribution and use in source and binary forms, with or without ++ * modification, are permitted provided that the following conditions are met: ++ * ++ * * Redistributions of source code must retain the above copyright notice, ++ * this list of conditions and the following disclaimer. ++ * * 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. ++ * * Neither the name of the axTLS project nor the names of its contributors ++ * may be used to endorse or promote products derived from this software ++ * without specific prior written permission. ++ * ++ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ++ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT ++ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR ++ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR ++ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, ++ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, ++ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR ++ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF ++ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING ++ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS ++ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ++ */ ++ ++/** ++ * @file os_port.c ++ * ++ * OS specific functions. ++ */ ++#include ++#include ++#include ++#include ++#include "os_port.h" ++ ++#ifdef WIN32 ++/** ++ * gettimeofday() not in Win32 ++ */ ++EXP_FUNC void STDCALL gettimeofday(struct timeval* t, void* timezone) ++{ ++#if defined(_WIN32_WCE) ++ t->tv_sec = time(NULL); ++ t->tv_usec = 0; /* 1sec precision only */ ++#else ++ struct _timeb timebuffer; ++ _ftime(&timebuffer); ++ t->tv_sec = (long)timebuffer.time; ++ t->tv_usec = 1000 * timebuffer.millitm; /* 1ms precision */ ++#endif ++} ++ ++/** ++ * strcasecmp() not in Win32 ++ */ ++EXP_FUNC int STDCALL strcasecmp(const char *s1, const char *s2) ++{ ++ while (tolower(*s1) == tolower(*s2++)) ++ { ++ if (*s1++ == '\0') ++ { ++ return 0; ++ } ++ } ++ ++ return *(unsigned char *)s1 - *(unsigned char *)(s2 - 1); ++} ++ ++ ++EXP_FUNC int STDCALL getdomainname(char *buf, int buf_size) ++{ ++ HKEY hKey; ++ unsigned long datatype; ++ unsigned long bufferlength = buf_size; ++ ++ if (RegOpenKeyEx(HKEY_LOCAL_MACHINE, ++ TEXT("SYSTEM\\CurrentControlSet\\Services\\Tcpip\\Parameters"), ++ 0, KEY_QUERY_VALUE, &hKey) != ERROR_SUCCESS) ++ return -1; ++ ++ RegQueryValueEx(hKey, "Domain", NULL, &datatype, buf, &bufferlength); ++ RegCloseKey(hKey); ++ return 0; ++} ++#endif ++ ++#undef malloc ++#undef realloc ++#undef calloc ++ ++static const char * out_of_mem_str = "out of memory"; ++static const char * file_open_str = "Could not open file \"%s\""; ++ ++/* ++ * Some functions that call display some error trace and then call abort(). ++ * This just makes life much easier on embedded systems, since we're ++ * suffering major trauma... ++ */ ++EXP_FUNC void * STDCALL ax_malloc(size_t s) ++{ ++ void *x; ++ ++ if ((x = malloc(s)) == NULL) ++ exit_now(out_of_mem_str); ++ ++ return x; ++} ++ ++EXP_FUNC void * STDCALL ax_realloc(void *y, size_t s) ++{ ++ void *x; ++ ++ if ((x = realloc(y, s)) == NULL) ++ exit_now(out_of_mem_str); ++ ++ return x; ++} ++ ++EXP_FUNC void * STDCALL ax_calloc(size_t n, size_t s) ++{ ++ void *x; ++ ++ if ((x = calloc(n, s)) == NULL) ++ exit_now(out_of_mem_str); ++ ++ return x; ++} ++ ++EXP_FUNC int STDCALL ax_open(const char *pathname, int flags) ++{ ++ int x; ++ ++ if ((x = open(pathname, flags)) < 0) ++ exit_now(file_open_str, pathname); ++ ++ return x; ++} ++ ++/** ++ * This is a call which will deliberately exit an application, but will ++ * display some information before dying. ++ */ ++void exit_now(const char *format, ...) ++{ ++ va_list argp; ++ ++ va_start(argp, format); ++ vfprintf(stderr, format, argp); ++ va_end(argp); ++ abort(); ++} ++ +diff --git a/feeds/luci/libs/luci-lib-nixio/axTLS/ssl/os_port.h b/feeds/luci/libs/luci-lib-nixio/axTLS/ssl/os_port.h +new file mode 100644 +index 0000000..262c4dd +--- /dev/null ++++ b/feeds/luci/libs/luci-lib-nixio/axTLS/ssl/os_port.h +@@ -0,0 +1,207 @@ ++/* ++ * Copyright (c) 2007, Cameron Rich ++ * ++ * All rights reserved. ++ * ++ * Redistribution and use in source and binary forms, with or without ++ * modification, are permitted provided that the following conditions are met: ++ * ++ * * Redistributions of source code must retain the above copyright notice, ++ * this list of conditions and the following disclaimer. ++ * * 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. ++ * * Neither the name of the axTLS project nor the names of its contributors ++ * may be used to endorse or promote products derived from this software ++ * without specific prior written permission. ++ * ++ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ++ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT ++ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR ++ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR ++ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, ++ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, ++ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR ++ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF ++ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING ++ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS ++ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ++ */ ++ ++/** ++ * @file os_port.h ++ * ++ * Some stuff to minimise the differences between windows and linux/unix ++ */ ++ ++#ifndef HEADER_OS_PORT_H ++#define HEADER_OS_PORT_H ++ ++#ifdef __cplusplus ++extern "C" { ++#endif ++ ++#include ++ ++#if defined(WIN32) ++#define STDCALL __stdcall ++#define EXP_FUNC __declspec(dllexport) ++#else ++#define STDCALL ++#define EXP_FUNC ++#endif ++ ++#if defined(_WIN32_WCE) ++#undef WIN32 ++#define WIN32 ++#endif ++ ++#ifdef WIN32 ++ ++/* Windows CE stuff */ ++#if defined(_WIN32_WCE) ++#include ++#define abort() exit(1) ++#else ++#include ++#include ++#include ++#include ++#endif /* _WIN32_WCE */ ++ ++#include ++#include ++#undef getpid ++#undef open ++#undef close ++#undef sleep ++#undef gettimeofday ++#undef dup2 ++#undef unlink ++ ++#define SOCKET_READ(A,B,C) recv(A,B,C,0) ++#define SOCKET_WRITE(A,B,C) send(A,B,C,0) ++#define SOCKET_CLOSE(A) closesocket(A) ++#define SOCKET_BLOCK(A) u_long argp = 0; \ ++ ioctlsocket(A, FIONBIO, &argp) ++#define srandom(A) srand(A) ++#define random() rand() ++#define getpid() _getpid() ++#define snprintf _snprintf ++#define open(A,B) _open(A,B) ++#define dup2(A,B) _dup2(A,B) ++#define unlink(A) _unlink(A) ++#define close(A) _close(A) ++#define read(A,B,C) _read(A,B,C) ++#define write(A,B,C) _write(A,B,C) ++#define sleep(A) Sleep(A*1000) ++#define usleep(A) Sleep(A/1000) ++#define strdup(A) _strdup(A) ++#define chroot(A) _chdir(A) ++#define chdir(A) _chdir(A) ++#define alloca(A) _alloca(A) ++#ifndef lseek ++#define lseek(A,B,C) _lseek(A,B,C) ++#endif ++ ++/* This fix gets around a problem where a win32 application on a cygwin xterm ++ doesn't display regular output (until a certain buffer limit) - but it works ++ fine under a normal DOS window. This is a hack to get around the issue - ++ see http://www.khngai.com/emacs/tty.php */ ++#define TTY_FLUSH() if (!_isatty(_fileno(stdout))) fflush(stdout); ++ ++/* ++ * automatically build some library dependencies. ++ */ ++#pragma comment(lib, "WS2_32.lib") ++#pragma comment(lib, "AdvAPI32.lib") ++ ++typedef UINT8 uint8_t; ++typedef INT8 int8_t; ++typedef UINT16 uint16_t; ++typedef INT16 int16_t; ++typedef UINT32 uint32_t; ++typedef INT32 int32_t; ++typedef UINT64 uint64_t; ++typedef INT64 int64_t; ++typedef int socklen_t; ++ ++EXP_FUNC void STDCALL gettimeofday(struct timeval* t,void* timezone); ++EXP_FUNC int STDCALL strcasecmp(const char *s1, const char *s2); ++EXP_FUNC int STDCALL getdomainname(char *buf, int buf_size); ++ ++#else /* Not Win32 */ ++ ++#ifdef CONFIG_PLATFORM_SOLARIS ++#include ++#else ++#include ++#endif /* Not Solaris */ ++ ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++ ++#define SOCKET_READ(A,B,C) read(A,B,C) ++#define SOCKET_WRITE(A,B,C) write(A,B,C) ++#define SOCKET_CLOSE(A) close(A) ++#define SOCKET_BLOCK(A) int fd = fcntl(A, F_GETFL, NULL); \ ++ fcntl(A, F_SETFL, fd & ~O_NONBLOCK) ++#define TTY_FLUSH() ++ ++#endif /* Not Win32 */ ++ ++/* some functions to mutate the way these work */ ++#define malloc(A) ax_malloc(A) ++#ifndef realloc ++#define realloc(A,B) ax_realloc(A,B) ++#endif ++#define calloc(A,B) ax_calloc(A,B) ++ ++EXP_FUNC void * STDCALL ax_malloc(size_t s); ++EXP_FUNC void * STDCALL ax_realloc(void *y, size_t s); ++EXP_FUNC void * STDCALL ax_calloc(size_t n, size_t s); ++EXP_FUNC int STDCALL ax_open(const char *pathname, int flags); ++ ++#ifdef CONFIG_PLATFORM_LINUX ++void exit_now(const char *format, ...) __attribute((noreturn)); ++#else ++void exit_now(const char *format, ...); ++#endif ++ ++/* Mutexing definitions */ ++#if defined(CONFIG_SSL_CTX_MUTEXING) ++#if defined(WIN32) ++#define SSL_CTX_MUTEX_TYPE HANDLE ++#define SSL_CTX_MUTEX_INIT(A) A=CreateMutex(0, FALSE, 0) ++#define SSL_CTX_MUTEX_DESTROY(A) CloseHandle(A) ++#define SSL_CTX_LOCK(A) WaitForSingleObject(A, INFINITE) ++#define SSL_CTX_UNLOCK(A) ReleaseMutex(A) ++#else ++#include ++#define SSL_CTX_MUTEX_TYPE pthread_mutex_t ++#define SSL_CTX_MUTEX_INIT(A) pthread_mutex_init(&A, NULL) ++#define SSL_CTX_MUTEX_DESTROY(A) pthread_mutex_destroy(&A) ++#define SSL_CTX_LOCK(A) pthread_mutex_lock(&A) ++#define SSL_CTX_UNLOCK(A) pthread_mutex_unlock(&A) ++#endif ++#else /* no mutexing */ ++#define SSL_CTX_MUTEX_INIT(A) ++#define SSL_CTX_MUTEX_DESTROY(A) ++#define SSL_CTX_LOCK(A) ++#define SSL_CTX_UNLOCK(A) ++#endif ++ ++#ifdef __cplusplus ++} ++#endif ++ ++#endif +diff --git a/feeds/luci/libs/luci-lib-nixio/axTLS/ssl/p12.c b/feeds/luci/libs/luci-lib-nixio/axTLS/ssl/p12.c +new file mode 100644 +index 0000000..6ed92e4 +--- /dev/null ++++ b/feeds/luci/libs/luci-lib-nixio/axTLS/ssl/p12.c +@@ -0,0 +1,486 @@ ++/* ++ * Copyright (c) 2007, Cameron Rich ++ * ++ * All rights reserved. ++ * ++ * Redistribution and use in source and binary forms, with or without ++ * modification, are permitted provided that the following conditions are met: ++ * ++ * * Redistributions of source code must retain the above copyright notice, ++ * this list of conditions and the following disclaimer. ++ * * 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. ++ * * Neither the name of the axTLS project nor the names of its contributors ++ * may be used to endorse or promote products derived from this software ++ * without specific prior written permission. ++ * ++ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ++ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT ++ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR ++ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR ++ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, ++ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, ++ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR ++ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF ++ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING ++ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS ++ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ++ */ ++ ++/** ++ * Process PKCS#8/PKCS#12 keys. ++ * ++ * The decoding of a PKCS#12 key is fairly specific - this code was tested on a ++ * key generated with: ++ * ++ * openssl pkcs12 -export -in axTLS.x509_1024.pem -inkey axTLS.key_1024.pem ++ * -keypbe PBE-SHA1-RC4-128 -certpbe PBE-SHA1-RC4-128 ++ * -name "p12_withoutCA" -out axTLS.withoutCA.p12 -password pass:abcd ++ * ++ * or with a certificate chain: ++ * ++ * openssl pkcs12 -export -in axTLS.x509_1024.pem -inkey axTLS.key_1024.pem ++ * -certfile axTLS.ca_x509.pem -keypbe PBE-SHA1-RC4-128 -certpbe ++ * PBE-SHA1-RC4-128 -name "p12_withCA" -out axTLS.withCA.p12 -password pass:abcd ++ * ++ * Note that the PBE has to be specified with PBE-SHA1-RC4-128. The ++ * private/public keys/certs have to use RSA encryption. Both the integrity ++ * and privacy passwords are the same. ++ * ++ * The PKCS#8 files were generated with something like: ++ * ++ * PEM format: ++ * openssl pkcs8 -in axTLS.key_512.pem -passout pass:abcd -topk8 -v1 ++ * PBE-SHA1-RC4-128 -out axTLS.encrypted_pem.p8 ++ * ++ * DER format: ++ * openssl pkcs8 -in axTLS.key_512.pem -passout pass:abcd -topk8 -outform DER ++ * -v1 PBE-SHA1-RC4-128 -out axTLS.encrypted.p8 ++ */ ++ ++#include ++#include ++#include ++ ++#include "ssl.h" ++ ++/* all commented out if not used */ ++#ifdef CONFIG_SSL_USE_PKCS12 ++ ++#define BLOCK_SIZE 64 ++#define PKCS12_KEY_ID 1 ++#define PKCS12_IV_ID 2 ++#define PKCS12_MAC_ID 3 ++ ++static char *make_uni_pass(const char *password, int *uni_pass_len); ++static int p8_decrypt(const char *uni_pass, int uni_pass_len, ++ const uint8_t *salt, int iter, ++ uint8_t *priv_key, int priv_key_len, int id); ++static int p8_add_key(SSL_CTX *ssl_ctx, uint8_t *priv_key); ++static int get_pbe_params(uint8_t *buf, int *offset, ++ const uint8_t **salt, int *iterations); ++ ++/* ++ * Take a raw pkcs8 block and then decrypt it and turn it into a normal key. ++ */ ++int pkcs8_decode(SSL_CTX *ssl_ctx, SSLObjLoader *ssl_obj, const char *password) ++{ ++ uint8_t *buf = ssl_obj->buf; ++ int len, offset = 0; ++ int iterations; ++ int ret = SSL_NOT_OK; ++ uint8_t *version = NULL; ++ const uint8_t *salt; ++ uint8_t *priv_key; ++ int uni_pass_len; ++ char *uni_pass = make_uni_pass(password, &uni_pass_len); ++ ++ if (asn1_next_obj(buf, &offset, ASN1_SEQUENCE) < 0) ++ { ++#ifdef CONFIG_SSL_FULL_MODE ++ printf("Error: Invalid p8 ASN.1 file\n"); ++#endif ++ goto error; ++ } ++ ++ /* unencrypted key? */ ++ if (asn1_get_int(buf, &offset, &version) > 0 && *version == 0) ++ { ++ ret = p8_add_key(ssl_ctx, buf); ++ goto error; ++ } ++ ++ if (get_pbe_params(buf, &offset, &salt, &iterations) < 0) ++ goto error; ++ ++ if ((len = asn1_next_obj(buf, &offset, ASN1_OCTET_STRING)) < 0) ++ goto error; ++ ++ priv_key = &buf[offset]; ++ ++ p8_decrypt(uni_pass, uni_pass_len, salt, ++ iterations, priv_key, len, PKCS12_KEY_ID); ++ ret = p8_add_key(ssl_ctx, priv_key); ++ ++error: ++ free(version); ++ free(uni_pass); ++ return ret; ++} ++ ++/* ++ * Take the unencrypted pkcs8 and turn it into a private key ++ */ ++static int p8_add_key(SSL_CTX *ssl_ctx, uint8_t *priv_key) ++{ ++ uint8_t *buf = priv_key; ++ int len, offset = 0; ++ int ret = SSL_NOT_OK; ++ ++ /* Skip the preamble and go straight to the private key. ++ We only support rsaEncryption (1.2.840.113549.1.1.1) */ ++ if (asn1_next_obj(buf, &offset, ASN1_SEQUENCE) < 0 || ++ asn1_skip_obj(buf, &offset, ASN1_INTEGER) < 0 || ++ asn1_skip_obj(buf, &offset, ASN1_SEQUENCE) < 0 || ++ (len = asn1_next_obj(buf, &offset, ASN1_OCTET_STRING)) < 0) ++ goto error; ++ ++ ret = asn1_get_private_key(&buf[offset], len, &ssl_ctx->rsa_ctx); ++ ++error: ++ return ret; ++} ++ ++/* ++ * Create the unicode password ++ */ ++static char *make_uni_pass(const char *password, int *uni_pass_len) ++{ ++ int pass_len = 0, i; ++ char *uni_pass; ++ ++ if (password == NULL) ++ { ++ password = ""; ++ } ++ ++ uni_pass = (char *)malloc((strlen(password)+1)*2); ++ ++ /* modify the password into a unicode version */ ++ for (i = 0; i < (int)strlen(password); i++) ++ { ++ uni_pass[pass_len++] = 0; ++ uni_pass[pass_len++] = password[i]; ++ } ++ ++ uni_pass[pass_len++] = 0; /* null terminate */ ++ uni_pass[pass_len++] = 0; ++ *uni_pass_len = pass_len; ++ return uni_pass; ++} ++ ++/* ++ * Decrypt a pkcs8 block. ++ */ ++static int p8_decrypt(const char *uni_pass, int uni_pass_len, ++ const uint8_t *salt, int iter, ++ uint8_t *priv_key, int priv_key_len, int id) ++{ ++ uint8_t p[BLOCK_SIZE*2]; ++ uint8_t d[BLOCK_SIZE]; ++ uint8_t Ai[SHA1_SIZE]; ++ SHA1_CTX sha_ctx; ++ RC4_CTX rc4_ctx; ++ int i; ++ ++ for (i = 0; i < BLOCK_SIZE; i++) ++ { ++ p[i] = salt[i % SALT_SIZE]; ++ p[BLOCK_SIZE+i] = uni_pass[i % uni_pass_len]; ++ d[i] = id; ++ } ++ ++ /* get the key - no IV since we are using RC4 */ ++ SHA1_Init(&sha_ctx); ++ SHA1_Update(&sha_ctx, d, sizeof(d)); ++ SHA1_Update(&sha_ctx, p, sizeof(p)); ++ SHA1_Final(Ai, &sha_ctx); ++ ++ for (i = 1; i < iter; i++) ++ { ++ SHA1_Init(&sha_ctx); ++ SHA1_Update(&sha_ctx, Ai, SHA1_SIZE); ++ SHA1_Final(Ai, &sha_ctx); ++ } ++ ++ /* do the decryption */ ++ if (id == PKCS12_KEY_ID) ++ { ++ RC4_setup(&rc4_ctx, Ai, 16); ++ RC4_crypt(&rc4_ctx, priv_key, priv_key, priv_key_len); ++ } ++ else /* MAC */ ++ memcpy(priv_key, Ai, SHA1_SIZE); ++ ++ return 0; ++} ++ ++/* ++ * Take a raw pkcs12 block and the decrypt it and turn it into a certificate(s) ++ * and keys. ++ */ ++int pkcs12_decode(SSL_CTX *ssl_ctx, SSLObjLoader *ssl_obj, const char *password) ++{ ++ uint8_t *buf = ssl_obj->buf; ++ int all_ok = 0, len, iterations, auth_safes_start, ++ auth_safes_end, auth_safes_len, key_offset, offset = 0; ++ int all_certs = 0; ++ uint8_t *version = NULL, *auth_safes = NULL, *cert, *orig_mac; ++ uint8_t key[SHA1_SIZE]; ++ uint8_t mac[SHA1_SIZE]; ++ const uint8_t *salt; ++ int uni_pass_len, ret; ++ int error_code = SSL_ERROR_NOT_SUPPORTED; ++ char *uni_pass = make_uni_pass(password, &uni_pass_len); ++ static const uint8_t pkcs_data[] = /* pkc7 data */ ++ { 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x07, 0x01 }; ++ static const uint8_t pkcs_encrypted[] = /* pkc7 encrypted */ ++ { 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x07, 0x06 }; ++ static const uint8_t pkcs8_key_bag[] = /* 1.2.840.113549.1.12.10.1.2 */ ++ { 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x0c, 0x0a, 0x01, 0x02 }; ++ ++ if (asn1_next_obj(buf, &offset, ASN1_SEQUENCE) < 0) ++ { ++#ifdef CONFIG_SSL_FULL_MODE ++ printf("Error: Invalid p12 ASN.1 file\n"); ++#endif ++ goto error; ++ } ++ ++ if (asn1_get_int(buf, &offset, &version) < 0 || *version != 3) ++ { ++ error_code = SSL_ERROR_INVALID_VERSION; ++ goto error; ++ } ++ ++ /* remove all the boring pcks7 bits */ ++ if (asn1_next_obj(buf, &offset, ASN1_SEQUENCE) < 0 || ++ (len = asn1_next_obj(buf, &offset, ASN1_OID)) < 0 || ++ len != sizeof(pkcs_data) || ++ memcmp(&buf[offset], pkcs_data, sizeof(pkcs_data))) ++ goto error; ++ ++ offset += len; ++ ++ if (asn1_next_obj(buf, &offset, ASN1_EXPLICIT_TAG) < 0 || ++ asn1_next_obj(buf, &offset, ASN1_OCTET_STRING) < 0) ++ goto error; ++ ++ /* work out the MAC start/end points (done on AuthSafes) */ ++ auth_safes_start = offset; ++ auth_safes_end = offset; ++ if (asn1_skip_obj(buf, &auth_safes_end, ASN1_SEQUENCE) < 0) ++ goto error; ++ ++ auth_safes_len = auth_safes_end - auth_safes_start; ++ auth_safes = malloc(auth_safes_len); ++ ++ memcpy(auth_safes, &buf[auth_safes_start], auth_safes_len); ++ ++ if (asn1_next_obj(buf, &offset, ASN1_SEQUENCE) < 0 || ++ asn1_next_obj(buf, &offset, ASN1_SEQUENCE) < 0 || ++ (len = asn1_next_obj(buf, &offset, ASN1_OID)) < 0 || ++ (len != sizeof(pkcs_encrypted) || ++ memcmp(&buf[offset], pkcs_encrypted, sizeof(pkcs_encrypted)))) ++ goto error; ++ ++ offset += len; ++ ++ if (asn1_next_obj(buf, &offset, ASN1_EXPLICIT_TAG) < 0 || ++ asn1_next_obj(buf, &offset, ASN1_SEQUENCE) < 0 || ++ asn1_skip_obj(buf, &offset, ASN1_INTEGER) < 0 || ++ asn1_next_obj(buf, &offset, ASN1_SEQUENCE) < 0 || ++ (len = asn1_next_obj(buf, &offset, ASN1_OID)) < 0 || ++ len != sizeof(pkcs_data) || ++ memcmp(&buf[offset], pkcs_data, sizeof(pkcs_data))) ++ goto error; ++ ++ offset += len; ++ ++ /* work out the salt for the certificate */ ++ if (get_pbe_params(buf, &offset, &salt, &iterations) < 0 || ++ (len = asn1_next_obj(buf, &offset, ASN1_IMPLICIT_TAG)) < 0) ++ goto error; ++ ++ /* decrypt the certificate */ ++ cert = &buf[offset]; ++ if ((ret = p8_decrypt(uni_pass, uni_pass_len, salt, iterations, cert, ++ len, PKCS12_KEY_ID)) < 0) ++ goto error; ++ ++ offset += len; ++ ++ /* load the certificate */ ++ key_offset = 0; ++ all_certs = asn1_next_obj(cert, &key_offset, ASN1_SEQUENCE); ++ ++ /* keep going until all certs are loaded */ ++ while (key_offset < all_certs) ++ { ++ int cert_offset = key_offset; ++ ++ if (asn1_skip_obj(cert, &cert_offset, ASN1_SEQUENCE) < 0 || ++ asn1_next_obj(cert, &key_offset, ASN1_SEQUENCE) < 0 || ++ asn1_skip_obj(cert, &key_offset, ASN1_OID) < 0 || ++ asn1_next_obj(cert, &key_offset, ASN1_EXPLICIT_TAG) < 0 || ++ asn1_next_obj(cert, &key_offset, ASN1_SEQUENCE) < 0 || ++ asn1_skip_obj(cert, &key_offset, ASN1_OID) < 0 || ++ asn1_next_obj(cert, &key_offset, ASN1_EXPLICIT_TAG) < 0 || ++ (len = asn1_next_obj(cert, &key_offset, ASN1_OCTET_STRING)) < 0) ++ goto error; ++ ++ if ((ret = add_cert(ssl_ctx, &cert[key_offset], len)) < 0) ++ goto error; ++ ++ key_offset = cert_offset; ++ } ++ ++ if (asn1_next_obj(buf, &offset, ASN1_SEQUENCE) < 0 || ++ (len = asn1_next_obj(buf, &offset, ASN1_OID)) < 0 || ++ len != sizeof(pkcs_data) || ++ memcmp(&buf[offset], pkcs_data, sizeof(pkcs_data))) ++ goto error; ++ ++ offset += len; ++ ++ if (asn1_next_obj(buf, &offset, ASN1_EXPLICIT_TAG) < 0 || ++ asn1_next_obj(buf, &offset, ASN1_OCTET_STRING) < 0 || ++ asn1_next_obj(buf, &offset, ASN1_SEQUENCE) < 0 || ++ asn1_next_obj(buf, &offset, ASN1_SEQUENCE) < 0 || ++ (len = asn1_next_obj(buf, &offset, ASN1_OID)) < 0 || ++ (len != sizeof(pkcs8_key_bag)) || ++ memcmp(&buf[offset], pkcs8_key_bag, sizeof(pkcs8_key_bag))) ++ goto error; ++ ++ offset += len; ++ ++ /* work out the salt for the private key */ ++ if (asn1_next_obj(buf, &offset, ASN1_EXPLICIT_TAG) < 0 || ++ asn1_next_obj(buf, &offset, ASN1_SEQUENCE) < 0 || ++ get_pbe_params(buf, &offset, &salt, &iterations) < 0 || ++ (len = asn1_next_obj(buf, &offset, ASN1_OCTET_STRING)) < 0) ++ goto error; ++ ++ /* decrypt the private key */ ++ cert = &buf[offset]; ++ if ((ret = p8_decrypt(uni_pass, uni_pass_len, salt, iterations, cert, ++ len, PKCS12_KEY_ID)) < 0) ++ goto error; ++ ++ offset += len; ++ ++ /* load the private key */ ++ if ((ret = p8_add_key(ssl_ctx, cert)) < 0) ++ goto error; ++ ++ /* miss out on friendly name, local key id etc */ ++ if (asn1_skip_obj(buf, &offset, ASN1_SET) < 0) ++ goto error; ++ ++ /* work out the MAC */ ++ if (asn1_next_obj(buf, &offset, ASN1_SEQUENCE) < 0 || ++ asn1_next_obj(buf, &offset, ASN1_SEQUENCE) < 0 || ++ asn1_skip_obj(buf, &offset, ASN1_SEQUENCE) < 0 || ++ (len = asn1_next_obj(buf, &offset, ASN1_OCTET_STRING)) < 0 || ++ len != SHA1_SIZE) ++ goto error; ++ ++ orig_mac = &buf[offset]; ++ offset += len; ++ ++ /* get the salt */ ++ if ((len = asn1_next_obj(buf, &offset, ASN1_OCTET_STRING)) < 0 || len != 8) ++ goto error; ++ ++ salt = &buf[offset]; ++ ++ /* work out what the mac should be */ ++ if ((ret = p8_decrypt(uni_pass, uni_pass_len, salt, iterations, ++ key, SHA1_SIZE, PKCS12_MAC_ID)) < 0) ++ goto error; ++ ++ hmac_sha1(auth_safes, auth_safes_len, key, SHA1_SIZE, mac); ++ ++ if (memcmp(mac, orig_mac, SHA1_SIZE)) ++ { ++ error_code = SSL_ERROR_INVALID_HMAC; ++ goto error; ++ } ++ ++ all_ok = 1; ++ ++error: ++ free(version); ++ free(uni_pass); ++ free(auth_safes); ++ return all_ok ? SSL_OK : error_code; ++} ++ ++/* ++ * Retrieve the salt/iteration details from a PBE block. ++ */ ++static int get_pbe_params(uint8_t *buf, int *offset, ++ const uint8_t **salt, int *iterations) ++{ ++ static const uint8_t pbeSH1RC4[] = /* pbeWithSHAAnd128BitRC4 */ ++ { 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x0c, 0x01, 0x01 }; ++ ++ int i, len; ++ uint8_t *iter = NULL; ++ int error_code = SSL_ERROR_NOT_SUPPORTED; ++ ++ /* Get the PBE type */ ++ if (asn1_next_obj(buf, offset, ASN1_SEQUENCE) < 0 || ++ (len = asn1_next_obj(buf, offset, ASN1_OID)) < 0) ++ goto error; ++ ++ /* we expect pbeWithSHAAnd128BitRC4 (1.2.840.113549.1.12.1.1) ++ which is the only algorithm we support */ ++ if (len != sizeof(pbeSH1RC4) || ++ memcmp(&buf[*offset], pbeSH1RC4, sizeof(pbeSH1RC4))) ++ { ++#ifdef CONFIG_SSL_FULL_MODE ++ printf("Error: pkcs8/pkcs12 must use \"PBE-SHA1-RC4-128\"\n"); ++#endif ++ goto error; ++ } ++ ++ *offset += len; ++ ++ if (asn1_next_obj(buf, offset, ASN1_SEQUENCE) < 0 || ++ (len = asn1_next_obj(buf, offset, ASN1_OCTET_STRING)) < 0 || ++ len != 8) ++ goto error; ++ ++ *salt = &buf[*offset]; ++ *offset += len; ++ ++ if ((len = asn1_get_int(buf, offset, &iter)) < 0) ++ goto error; ++ ++ *iterations = 0; ++ for (i = 0; i < len; i++) ++ { ++ (*iterations) <<= 8; ++ (*iterations) += iter[i]; ++ } ++ ++ free(iter); ++ error_code = SSL_OK; /* got here - we are ok */ ++ ++error: ++ return error_code; ++} ++ ++#endif +diff --git a/feeds/luci/libs/luci-lib-nixio/axTLS/ssl/private_key.h b/feeds/luci/libs/luci-lib-nixio/axTLS/ssl/private_key.h +new file mode 100644 +index 0000000..96a5253 +--- /dev/null ++++ b/feeds/luci/libs/luci-lib-nixio/axTLS/ssl/private_key.h +@@ -0,0 +1,54 @@ ++unsigned char default_private_key[] = { ++ 0x30, 0x82, 0x02, 0x5d, 0x02, 0x01, 0x00, 0x02, 0x81, 0x81, 0x00, 0xd8, ++ 0xe0, 0xbf, 0x15, 0xde, 0xea, 0xaf, 0xe8, 0xd5, 0xfd, 0x0b, 0xa8, 0xa8, ++ 0xb3, 0xd7, 0x46, 0x5d, 0xa7, 0x26, 0x6c, 0x0c, 0xb5, 0xd9, 0xbc, 0xc6, ++ 0xf8, 0xc0, 0x78, 0xd0, 0xf6, 0x56, 0x65, 0xf8, 0x29, 0x48, 0x0e, 0x7b, ++ 0x0b, 0xa6, 0x25, 0x7e, 0xe8, 0x7b, 0x79, 0x6f, 0x38, 0xe5, 0xb5, 0xb7, ++ 0xf4, 0xe0, 0x9c, 0x91, 0x60, 0xf4, 0x06, 0xf3, 0x40, 0x1e, 0xf9, 0x91, ++ 0x19, 0xa9, 0x2f, 0x47, 0x43, 0xb5, 0x9b, 0x1e, 0xdc, 0xf6, 0xaa, 0x1c, ++ 0x49, 0x79, 0x21, 0x28, 0xcb, 0xaa, 0x49, 0x73, 0xd9, 0x09, 0x05, 0x4c, ++ 0x02, 0xf2, 0x4c, 0x4d, 0x6c, 0x1c, 0x80, 0xa7, 0x14, 0x91, 0x44, 0xfc, ++ 0x12, 0xb3, 0xe1, 0xe7, 0xe3, 0x4f, 0x44, 0xba, 0x8c, 0xc3, 0x74, 0x39, ++ 0xe8, 0x4c, 0xd0, 0xd4, 0x4c, 0x24, 0x61, 0xb4, 0x40, 0x95, 0x8c, 0xc0, ++ 0x0a, 0xb7, 0x02, 0x39, 0x31, 0x85, 0x93, 0x02, 0x03, 0x01, 0x00, 0x01, ++ 0x02, 0x81, 0x81, 0x00, 0x94, 0x07, 0x72, 0xe5, 0xbe, 0xad, 0x79, 0x3b, ++ 0xf7, 0x33, 0x2c, 0x8e, 0x05, 0xf8, 0x1a, 0x6b, 0xd0, 0xe8, 0x91, 0xf5, ++ 0x16, 0x07, 0xd9, 0x82, 0x5c, 0x5c, 0xd5, 0x22, 0xa1, 0x9e, 0x42, 0x02, ++ 0x7f, 0x8b, 0xcd, 0xbe, 0xf4, 0x85, 0x52, 0xf6, 0x2c, 0xd5, 0x09, 0xd2, ++ 0x2c, 0xf4, 0x2c, 0xf6, 0x07, 0x85, 0x80, 0xf9, 0xdc, 0xd0, 0xcc, 0x3f, ++ 0x22, 0x31, 0x15, 0xf3, 0x49, 0xf2, 0xb5, 0xe2, 0x69, 0x99, 0x04, 0x04, ++ 0x49, 0x21, 0xdb, 0x9f, 0xa1, 0x54, 0x5a, 0xfa, 0xe4, 0xd9, 0xf9, 0x07, ++ 0x05, 0xff, 0x9a, 0x65, 0xa4, 0xeb, 0xf2, 0x47, 0xce, 0x56, 0xc7, 0x72, ++ 0x49, 0x48, 0x5c, 0xe8, 0x14, 0xd7, 0x8f, 0x25, 0xcc, 0x49, 0x29, 0x06, ++ 0x6a, 0x54, 0x7b, 0x17, 0xdc, 0x9e, 0xd4, 0x53, 0xf0, 0xf5, 0x9e, 0x85, ++ 0x25, 0xa1, 0xeb, 0x3d, 0xe9, 0x2f, 0xb9, 0x9c, 0xf6, 0xe1, 0x80, 0x81, ++ 0x02, 0x41, 0x00, 0xee, 0x02, 0x78, 0xc7, 0x78, 0x85, 0x04, 0x97, 0xcc, ++ 0x36, 0xbd, 0xd6, 0x11, 0xe2, 0xc7, 0x39, 0xd9, 0x34, 0x51, 0x72, 0x6f, ++ 0x8a, 0x0f, 0xcd, 0x88, 0x32, 0x33, 0x9b, 0xc7, 0xa7, 0x03, 0x77, 0xd9, ++ 0x82, 0x35, 0xb6, 0xdd, 0x1f, 0xc2, 0xc1, 0x13, 0x40, 0x83, 0x55, 0xeb, ++ 0x60, 0xeb, 0x81, 0x8e, 0x0c, 0x16, 0x62, 0xb4, 0xb4, 0x3c, 0xeb, 0x08, ++ 0x80, 0x9c, 0x79, 0xd3, 0x38, 0xca, 0xf1, 0x02, 0x41, 0x00, 0xe9, 0x45, ++ 0x5f, 0x2e, 0x16, 0xcc, 0x93, 0x50, 0x40, 0xb6, 0x79, 0xbc, 0x38, 0xe0, ++ 0x56, 0x68, 0x50, 0xd3, 0x2f, 0x73, 0x8c, 0x8c, 0x2a, 0x0e, 0x81, 0x4a, ++ 0x8a, 0xbb, 0xcc, 0xf0, 0x64, 0x34, 0x46, 0x9f, 0x07, 0x7d, 0x22, 0xb6, ++ 0xf9, 0x46, 0xac, 0x57, 0x23, 0x8c, 0x1e, 0xeb, 0xd3, 0x05, 0x4d, 0xa8, ++ 0x83, 0x6a, 0x67, 0xf6, 0xa6, 0xb1, 0xab, 0x8e, 0xc1, 0xef, 0xef, 0x7d, ++ 0xf0, 0xc3, 0x02, 0x40, 0x2f, 0xc6, 0x59, 0x3e, 0x18, 0xe8, 0x02, 0x73, ++ 0x01, 0xef, 0xdf, 0x0d, 0x30, 0x4b, 0xe8, 0x17, 0xa9, 0x8c, 0xc1, 0xe8, ++ 0x89, 0x91, 0x19, 0xf8, 0xf4, 0xa4, 0xb7, 0x0d, 0x46, 0xf7, 0x34, 0x50, ++ 0x03, 0x5e, 0x0a, 0xb0, 0x29, 0x14, 0xae, 0x00, 0x19, 0x80, 0x32, 0x9c, ++ 0xb5, 0x81, 0x9f, 0xe4, 0x42, 0x82, 0x14, 0xa0, 0x3d, 0x8b, 0x8c, 0x4a, ++ 0xd5, 0x4b, 0x13, 0x9d, 0xb4, 0x93, 0x4a, 0xd1, 0x02, 0x40, 0x64, 0x8c, ++ 0x83, 0x77, 0x61, 0x5a, 0x73, 0x11, 0x3f, 0xa3, 0xa8, 0x1b, 0x8a, 0xc4, ++ 0xa0, 0x5a, 0x3c, 0xa4, 0x9b, 0x2a, 0x8a, 0x65, 0x8c, 0x67, 0x4e, 0x31, ++ 0xac, 0x55, 0x41, 0x04, 0x49, 0x9d, 0x02, 0xe7, 0xdf, 0x99, 0x7f, 0xd2, ++ 0x30, 0xe6, 0xd6, 0xb8, 0x84, 0xd9, 0x0c, 0x27, 0x08, 0x81, 0x9b, 0xb4, ++ 0xcc, 0x58, 0x9c, 0x51, 0x84, 0x0e, 0xc7, 0x6d, 0x34, 0x89, 0x50, 0xc9, ++ 0x0f, 0x73, 0x02, 0x41, 0x00, 0xda, 0xde, 0x5e, 0x1a, 0xac, 0x1d, 0x1d, ++ 0xd7, 0xb9, 0x65, 0x26, 0x00, 0xf5, 0xd4, 0xe4, 0x28, 0x84, 0x86, 0x2f, ++ 0x00, 0x9c, 0x41, 0x00, 0x52, 0xe1, 0x47, 0x91, 0xc0, 0x52, 0x05, 0x4e, ++ 0x0f, 0x2f, 0x0d, 0xca, 0x9b, 0x3d, 0x89, 0x41, 0xbf, 0xee, 0x9f, 0xa1, ++ 0xe6, 0x9d, 0xa4, 0xeb, 0x45, 0x7f, 0xe3, 0xcb, 0xa4, 0x6b, 0x0a, 0xe2, ++ 0x7e, 0xb0, 0x87, 0x5c, 0x40, 0xb1, 0x51, 0x11, 0x1d ++}; ++unsigned int default_private_key_len = 609; +diff --git a/feeds/luci/libs/luci-lib-nixio/axTLS/ssl/ssl.h b/feeds/luci/libs/luci-lib-nixio/axTLS/ssl/ssl.h +new file mode 100644 +index 0000000..539d0a3 +--- /dev/null ++++ b/feeds/luci/libs/luci-lib-nixio/axTLS/ssl/ssl.h +@@ -0,0 +1,474 @@ ++/* ++ * Copyright (c) 2007, Cameron Rich ++ * ++ * All rights reserved. ++ * ++ * Redistribution and use in source and binary forms, with or without ++ * modification, are permitted provided that the following conditions are met: ++ * ++ * * Redistributions of source code must retain the above copyright notice, ++ * this list of conditions and the following disclaimer. ++ * * 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. ++ * * Neither the name of the axTLS project nor the names of its contributors ++ * may be used to endorse or promote products derived from this software ++ * without specific prior written permission. ++ * ++ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ++ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT ++ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR ++ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR ++ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, ++ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, ++ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR ++ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF ++ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING ++ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS ++ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ++ */ ++ ++/** ++ * @mainpage axTLS API ++ * ++ * @image html axolotl.jpg ++ * ++ * The axTLS library has features such as: ++ * - The TLSv1 SSL client/server protocol ++ * - No requirement to use any openssl libraries. ++ * - A choice between AES block (128/256 bit) and RC4 (128 bit) stream ciphers. ++ * - RSA encryption/decryption with variable sized keys (up to 4096 bits). ++ * - Certificate chaining and peer authentication. ++ * - Session resumption, session renegotiation. ++ * - ASN.1, X.509, PKCS#8, PKCS#12 keys/certificates with DER/PEM encoding. ++ * - Highly configurable compile time options. ++ * - Portable across many platforms (written in ANSI C), and has language ++ * bindings in C, C#, VB.NET, Java, Perl and Lua. ++ * - Partial openssl API compatibility (via a wrapper). ++ * - A very small footprint (around 50-60kB for the library in 'server-only' ++ * mode). ++ * - No dependencies on sockets - can use serial connections for example. ++ * - A very simple API - ~ 20 functions/methods. ++ * ++ * A list of these functions/methods are described below. ++ * ++ * @ref c_api ++ * ++ * @ref bigint_api ++ * ++ * @ref csharp_api ++ * ++ * @ref java_api ++ */ ++#ifndef HEADER_SSL_H ++#define HEADER_SSL_H ++ ++#ifdef __cplusplus ++extern "C" { ++#endif ++ ++#include ++//#include "crypto.h" ++ ++/* need to predefine before ssl_lib.h gets to it */ ++#define SSL_SESSION_ID_SIZE 32 ++ ++#include "tls1.h" ++ ++/* The optional parameters that can be given to the client/server SSL engine */ ++#define SSL_CLIENT_AUTHENTICATION 0x00010000 ++#define SSL_SERVER_VERIFY_LATER 0x00020000 ++#define SSL_NO_DEFAULT_KEY 0x00040000 ++#define SSL_DISPLAY_STATES 0x00080000 ++#define SSL_DISPLAY_BYTES 0x00100000 ++#define SSL_DISPLAY_CERTS 0x00200000 ++#define SSL_DISPLAY_RSA 0x00400000 ++ ++/* errors that can be generated */ ++#define SSL_OK 0 ++#define SSL_NOT_OK -1 ++#define SSL_ERROR_DEAD -2 ++#define SSL_ERROR_CONN_LOST -256 ++#define SSL_ERROR_SOCK_SETUP_FAILURE -258 ++#define SSL_ERROR_INVALID_HANDSHAKE -260 ++#define SSL_ERROR_INVALID_PROT_MSG -261 ++#define SSL_ERROR_INVALID_HMAC -262 ++#define SSL_ERROR_INVALID_VERSION -263 ++#define SSL_ERROR_INVALID_SESSION -265 ++#define SSL_ERROR_NO_CIPHER -266 ++#define SSL_ERROR_BAD_CERTIFICATE -268 ++#define SSL_ERROR_INVALID_KEY -269 ++#define SSL_ERROR_FINISHED_INVALID -271 ++#define SSL_ERROR_NO_CERT_DEFINED -272 ++#define SSL_ERROR_NOT_SUPPORTED -274 ++#define SSL_X509_OFFSET -512 ++#define SSL_X509_ERROR(A) (SSL_X509_OFFSET+A) ++ ++/* these are all the alerts that are recognized */ ++#define SSL_ALERT_CLOSE_NOTIFY 0 ++#define SSL_ALERT_UNEXPECTED_MESSAGE 10 ++#define SSL_ALERT_BAD_RECORD_MAC 20 ++#define SSL_ALERT_HANDSHAKE_FAILURE 40 ++#define SSL_ALERT_BAD_CERTIFICATE 42 ++#define SSL_ALERT_ILLEGAL_PARAMETER 47 ++#define SSL_ALERT_DECODE_ERROR 50 ++#define SSL_ALERT_DECRYPT_ERROR 51 ++#define SSL_ALERT_INVALID_VERSION 70 ++ ++/* The ciphers that are supported */ ++#define SSL_AES128_SHA 0x2f ++#define SSL_AES256_SHA 0x35 ++#define SSL_RC4_128_SHA 0x05 ++#define SSL_RC4_128_MD5 0x04 ++ ++/* build mode ids' */ ++#define SSL_BUILD_SKELETON_MODE 0x01 ++#define SSL_BUILD_SERVER_ONLY 0x02 ++#define SSL_BUILD_ENABLE_VERIFICATION 0x03 ++#define SSL_BUILD_ENABLE_CLIENT 0x04 ++#define SSL_BUILD_FULL_MODE 0x05 ++ ++/* offsets to retrieve configuration information */ ++#define SSL_BUILD_MODE 0 ++#define SSL_MAX_CERT_CFG_OFFSET 1 ++#define SSL_MAX_CA_CERT_CFG_OFFSET 2 ++#define SSL_HAS_PEM 3 ++ ++/* default session sizes */ ++#define SSL_DEFAULT_SVR_SESS 5 ++#define SSL_DEFAULT_CLNT_SESS 1 ++ ++/* X.509/X.520 distinguished name types */ ++#define SSL_X509_CERT_COMMON_NAME 0 ++#define SSL_X509_CERT_ORGANIZATION 1 ++#define SSL_X509_CERT_ORGANIZATIONAL_NAME 2 ++#define SSL_X509_CA_CERT_COMMON_NAME 3 ++#define SSL_X509_CA_CERT_ORGANIZATION 4 ++#define SSL_X509_CA_CERT_ORGANIZATIONAL_NAME 5 ++ ++/* SSL object loader types */ ++#define SSL_OBJ_X509_CERT 1 ++#define SSL_OBJ_X509_CACERT 2 ++#define SSL_OBJ_RSA_KEY 3 ++#define SSL_OBJ_PKCS8 4 ++#define SSL_OBJ_PKCS12 5 ++ ++/** ++ * @defgroup c_api Standard C API ++ * @brief The standard interface in C. ++ * @{ ++ */ ++ ++/** ++ * @brief Establish a new client/server context. ++ * ++ * This function is called before any client/server SSL connections are made. ++ * ++ * Each new connection will use the this context's private key and ++ * certificate chain. If a different certificate chain is required, then a ++ * different context needs to be be used. ++ * ++ * There are two threading models supported - a single thread with one ++ * SSL_CTX can support any number of SSL connections - and multiple threads can ++ * support one SSL_CTX object each (the default). But if a single SSL_CTX ++ * object uses many SSL objects in individual threads, then the ++ * CONFIG_SSL_CTX_MUTEXING option needs to be configured. ++ * ++ * @param options [in] Any particular options. At present the options ++ * supported are: ++ * - SSL_SERVER_VERIFY_LATER (client only): Don't stop a handshake if the server ++ * authentication fails. The certificate can be authenticated later with a ++ * call to ssl_verify_cert(). ++ * - SSL_CLIENT_AUTHENTICATION (server only): Enforce client authentication ++ * i.e. each handshake will include a "certificate request" message from the ++ * server. Only available if verification has been enabled. ++ * - SSL_DISPLAY_BYTES (full mode build only): Display the byte sequences ++ * during the handshake. ++ * - SSL_DISPLAY_STATES (full mode build only): Display the state changes ++ * during the handshake. ++ * - SSL_DISPLAY_CERTS (full mode build only): Display the certificates that ++ * are passed during a handshake. ++ * - SSL_DISPLAY_RSA (full mode build only): Display the RSA key details that ++ * are passed during a handshake. ++ * ++ * @param num_sessions [in] The number of sessions to be used for session ++ * caching. If this value is 0, then there is no session caching. This option ++ * is not used in skeleton mode. ++ * @return A client/server context. ++ */ ++EXP_FUNC SSL_CTX * STDCALL ssl_ctx_new(uint32_t options, int num_sessions); ++ ++/** ++ * @brief Remove a client/server context. ++ * ++ * Frees any used resources used by this context. Each connection will be ++ * sent a "Close Notify" alert (if possible). ++ * @param ssl_ctx [in] The client/server context. ++ */ ++EXP_FUNC void STDCALL ssl_ctx_free(SSL_CTX *ssl_ctx); ++ ++/** ++ * @brief (server only) Establish a new SSL connection to an SSL client. ++ * ++ * It is up to the application to establish the logical connection (whether it ++ * is a socket, serial connection etc). ++ * @param ssl_ctx [in] The server context. ++ * @param client_fd [in] The client's file descriptor. ++ * @return An SSL object reference. ++ */ ++EXP_FUNC SSL * STDCALL ssl_server_new(SSL_CTX *ssl_ctx, int client_fd); ++ ++/** ++ * @brief (client only) Establish a new SSL connection to an SSL server. ++ * ++ * It is up to the application to establish the initial logical connection ++ * (whether it is a socket, serial connection etc). ++ * ++ * This is a blocking call - it will finish when the handshake is complete (or ++ * has failed). ++ * @param ssl_ctx [in] The client context. ++ * @param client_fd [in] The client's file descriptor. ++ * @param session_id [in] A 32 byte session id for session resumption. This ++ * can be null if no session resumption is being used or required. This option ++ * is not used in skeleton mode. ++ * @param sess_id_size The size of the session id (max 32) ++ * @return An SSL object reference. Use ssl_handshake_status() to check ++ * if a handshake succeeded. ++ */ ++EXP_FUNC SSL * STDCALL ssl_client_new(SSL_CTX *ssl_ctx, int client_fd, const uint8_t *session_id, uint8_t sess_id_size); ++ ++/** ++ * @brief Free any used resources on this connection. ++ ++ * A "Close Notify" message is sent on this connection (if possible). It is up ++ * to the application to close the socket or file descriptor. ++ * @param ssl [in] The ssl object reference. ++ */ ++EXP_FUNC void STDCALL ssl_free(SSL *ssl); ++ ++/** ++ * @brief Read the SSL data stream. ++ * The socket must be in blocking mode. ++ * @param ssl [in] An SSL object reference. ++ * @param in_data [out] If the read was successful, a pointer to the read ++ * buffer will be here. Do NOT ever free this memory as this buffer is used in ++ * sucessive calls. If the call was unsuccessful, this value will be null. ++ * @return The number of decrypted bytes: ++ * - if > 0, then the handshaking is complete and we are returning the number ++ * of decrypted bytes. ++ * - SSL_OK if the handshaking stage is successful (but not yet complete). ++ * - < 0 if an error. ++ * @see ssl.h for the error code list. ++ * @note Use in_data before doing any successive ssl calls. ++ */ ++EXP_FUNC int STDCALL ssl_read(SSL *ssl, uint8_t **in_data); ++ ++/** ++ * @brief Write to the SSL data stream. ++ * The socket must be in blocking mode. ++ * @param ssl [in] An SSL obect reference. ++ * @param out_data [in] The data to be written ++ * @param out_len [in] The number of bytes to be written. ++ * @return The number of bytes sent, or if < 0 if an error. ++ * @see ssl.h for the error code list. ++ */ ++EXP_FUNC int STDCALL ssl_write(SSL *ssl, const uint8_t *out_data, int out_len); ++ ++/** ++ * @brief Find an ssl object based on a file descriptor. ++ * ++ * Goes through the list of SSL objects maintained in a client/server context ++ * to look for a file descriptor match. ++ * @param ssl_ctx [in] The client/server context. ++ * @param client_fd [in] The file descriptor. ++ * @return A reference to the SSL object. Returns null if the object could not ++ * be found. ++ */ ++EXP_FUNC SSL * STDCALL ssl_find(SSL_CTX *ssl_ctx, int client_fd); ++ ++/** ++ * @brief Get the session id for a handshake. ++ * ++ * This will be a 32 byte sequence and is available after the first ++ * handshaking messages are sent. ++ * @param ssl [in] An SSL object reference. ++ * @return The session id as a 32 byte sequence. ++ * @note A SSLv23 handshake may have only 16 valid bytes. ++ */ ++EXP_FUNC const uint8_t * STDCALL ssl_get_session_id(const SSL *ssl); ++ ++/** ++ * @brief Get the session id size for a handshake. ++ * ++ * This will normally be 32 but could be 0 (no session id) or something else. ++ * @param ssl [in] An SSL object reference. ++ * @return The size of the session id. ++ */ ++EXP_FUNC uint8_t STDCALL ssl_get_session_id_size(const SSL *ssl); ++ ++/** ++ * @brief Return the cipher id (in the SSL form). ++ * @param ssl [in] An SSL object reference. ++ * @return The cipher id. This will be one of the following: ++ * - SSL_AES128_SHA (0x2f) ++ * - SSL_AES256_SHA (0x35) ++ * - SSL_RC4_128_SHA (0x05) ++ * - SSL_RC4_128_MD5 (0x04) ++ */ ++EXP_FUNC uint8_t STDCALL ssl_get_cipher_id(const SSL *ssl); ++ ++/** ++ * @brief Return the status of the handshake. ++ * @param ssl [in] An SSL object reference. ++ * @return SSL_OK if the handshake is complete and ok. ++ * @see ssl.h for the error code list. ++ */ ++EXP_FUNC int STDCALL ssl_handshake_status(const SSL *ssl); ++ ++/** ++ * @brief Retrieve various parameters about the axTLS engine. ++ * @param offset [in] The configuration offset. It will be one of the following: ++ * - SSL_BUILD_MODE The build mode. This will be one of the following: ++ * - SSL_BUILD_SERVER_ONLY (basic server mode) ++ * - SSL_BUILD_ENABLE_VERIFICATION (server can do client authentication) ++ * - SSL_BUILD_ENABLE_CLIENT (client/server capabilties) ++ * - SSL_BUILD_FULL_MODE (client/server with diagnostics) ++ * - SSL_BUILD_SKELETON_MODE (skeleton mode) ++ * - SSL_MAX_CERT_CFG_OFFSET The maximum number of certificates allowed. ++ * - SSL_MAX_CA_CERT_CFG_OFFSET The maximum number of CA certificates allowed. ++ * - SSL_HAS_PEM 1 if supported ++ * @return The value of the requested parameter. ++ */ ++EXP_FUNC int STDCALL ssl_get_config(int offset); ++ ++/** ++ * @brief Display why the handshake failed. ++ * ++ * This call is only useful in a 'full mode' build. The output is to stdout. ++ * @param error_code [in] An error code. ++ * @see ssl.h for the error code list. ++ */ ++EXP_FUNC void STDCALL ssl_display_error(int error_code); ++ ++/** ++ * @brief Authenticate a received certificate. ++ * ++ * This call is usually made by a client after a handshake is complete and the ++ * context is in SSL_SERVER_VERIFY_LATER mode. ++ * @param ssl [in] An SSL object reference. ++ * @return SSL_OK if the certificate is verified. ++ */ ++EXP_FUNC int STDCALL ssl_verify_cert(const SSL *ssl); ++ ++/** ++ * @brief Retrieve an X.509 distinguished name component. ++ * ++ * When a handshake is complete and a certificate has been exchanged, then the ++ * details of the remote certificate can be retrieved. ++ * ++ * This will usually be used by a client to check that the server's common ++ * name matches the URL. ++ * ++ * A full handshake needs to occur for this call to work properly. ++ * ++ * @param ssl [in] An SSL object reference. ++ * @param component [in] one of: ++ * - SSL_X509_CERT_COMMON_NAME ++ * - SSL_X509_CERT_ORGANIZATION ++ * - SSL_X509_CERT_ORGANIZATIONAL_NAME ++ * - SSL_X509_CA_CERT_COMMON_NAME ++ * - SSL_X509_CA_CERT_ORGANIZATION ++ * - SSL_X509_CA_CERT_ORGANIZATIONAL_NAME ++ * @return The appropriate string (or null if not defined) ++ * @note Verification build mode must be enabled. ++ */ ++EXP_FUNC const char * STDCALL ssl_get_cert_dn(const SSL *ssl, int component); ++ ++/** ++ * @brief Force the client to perform its handshake again. ++ * ++ * For a client this involves sending another "client hello" message. ++ * For the server is means sending a "hello request" message. ++ * ++ * This is a blocking call on the client (until the handshake completes). ++ * ++ * @param ssl [in] An SSL object reference. ++ * @return SSL_OK if renegotiation instantiation was ok ++ */ ++EXP_FUNC int STDCALL ssl_renegotiate(SSL *ssl); ++ ++/** ++ * @brief Process a file that is in binary DER or ASCII PEM format. ++ * ++ * These are temporary objects that are used to load private keys, ++ * certificates etc into memory. ++ * @param ssl_ctx [in] The client/server context. ++ * @param obj_type [in] The format of the file. Can be one of: ++ * - SSL_OBJ_X509_CERT (no password required) ++ * - SSL_OBJ_X509_CACERT (no password required) ++ * - SSL_OBJ_RSA_KEY (AES128/AES256 PEM encryption supported) ++ * - SSL_OBJ_PKCS8 (RC4-128 encrypted data supported) ++ * - SSL_OBJ_PKCS12 (RC4-128 encrypted data supported) ++ * ++ * PEM files are automatically detected (if supported). The object type is ++ * also detected, and so is not relevant for these types of files. ++ * @param filename [in] The location of a file in DER/PEM format. ++ * @param password [in] The password used. Can be null if not required. ++ * @return SSL_OK if all ok ++ * @note Not available in skeleton build mode. ++ */ ++EXP_FUNC int STDCALL ssl_obj_load(SSL_CTX *ssl_ctx, int obj_type, const char *filename, const char *password); ++ ++/** ++ * @brief Process binary data. ++ * ++ * These are temporary objects that are used to load private keys, ++ * certificates etc into memory. ++ * @param ssl_ctx [in] The client/server context. ++ * @param obj_type [in] The format of the memory data. ++ * @param data [in] The binary data to be loaded. ++ * @param len [in] The amount of data to be loaded. ++ * @param password [in] The password used. Can be null if not required. ++ * @return SSL_OK if all ok ++ * @see ssl_obj_load for more details on obj_type. ++ */ ++EXP_FUNC int STDCALL ssl_obj_memory_load(SSL_CTX *ssl_ctx, int obj_type, const uint8_t *data, int len, const char *password); ++ ++#ifdef CONFIG_SSL_GENERATE_X509_CERT ++/** ++ * @brief Create an X.509 certificate. ++ * ++ * This certificate is a self-signed v1 cert with a fixed start/stop validity ++ * times. It is signed with an internal private key in ssl_ctx. ++ * ++ * @param ssl_ctx [in] The client/server context. ++ * @param options [in] Not used yet. ++ * @param dn [in] An array of distinguished name strings. The array is defined ++ * by: ++ * - SSL_X509_CERT_COMMON_NAME (0) ++ * - If SSL_X509_CERT_COMMON_NAME is empty or not defined, then the ++ * hostname will be used. ++ * - SSL_X509_CERT_ORGANIZATION (1) ++ * - If SSL_X509_CERT_ORGANIZATION is empty or not defined, then $USERNAME ++ * will be used. ++ * - SSL_X509_CERT_ORGANIZATIONAL_NAME (2) ++ * - SSL_X509_CERT_ORGANIZATIONAL_NAME is optional. ++ * @param cert_data [out] The certificate as a sequence of bytes. ++ * @return < 0 if an error, or the size of the certificate in bytes. ++ * @note cert_data must be freed when there is no more need for it. ++ */ ++EXP_FUNC int STDCALL ssl_x509_create(SSL_CTX *ssl_ctx, uint32_t options, const char * dn[], uint8_t **cert_data); ++#endif ++ ++/** ++ * @brief Return the axTLS library version as a string. ++ */ ++EXP_FUNC const char * STDCALL ssl_version(void); ++ ++/** @} */ ++ ++#ifdef __cplusplus ++} ++#endif ++ ++#endif +diff --git a/feeds/luci/libs/luci-lib-nixio/axTLS/ssl/test/Makefile b/feeds/luci/libs/luci-lib-nixio/axTLS/ssl/test/Makefile +new file mode 100644 +index 0000000..56c711f +--- /dev/null ++++ b/feeds/luci/libs/luci-lib-nixio/axTLS/ssl/test/Makefile +@@ -0,0 +1,97 @@ ++# ++# Copyright (c) 2007, Cameron Rich ++# ++# All rights reserved. ++# ++# Redistribution and use in source and binary forms, with or without ++# modification, are permitted provided that the following conditions are met: ++# ++# * Redistributions of source code must retain the above copyright notice, ++# this list of conditions and the following disclaimer. ++# * 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. ++# * Neither the name of the axTLS project nor the names of its ++# contributors may be used to endorse or promote products derived ++# from this software without specific prior written permission. ++# ++# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ++# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT ++# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR ++# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR ++# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, ++# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED ++# TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, ++# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY ++# OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING ++# NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF ++# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ++# ++ ++all: ++ ++AXTLS_HOME=../.. ++ ++include $(AXTLS_HOME)/config/.config ++include $(AXTLS_HOME)/config/makefile.conf ++ ++ifdef CONFIG_PERFORMANCE_TESTING ++all: performance ++endif ++ ++ifdef CONFIG_SSL_TEST ++all: ssltesting ++endif ++ ++include $(AXTLS_HOME)/config/makefile.post ++ ++ifndef CONFIG_PLATFORM_WIN32 ++performance: $(AXTLS_HOME)/$(STAGE)/perf_bigint ++ssltesting: $(AXTLS_HOME)/$(STAGE)/ssltest ++LIBS=$(AXTLS_HOME)/$(STAGE) ++ ++$(AXTLS_HOME)/$(STAGE)/perf_bigint: perf_bigint.o $(LIBS)/libaxtls.a ++ $(CC) $(LDFLAGS) -o $@ $^ -L $(LIBS) -laxtls ++ ++$(AXTLS_HOME)/$(STAGE)/ssltest: ssltest.o $(LIBS)/libaxtls.a ++ $(CC) $(LDFLAGS) -o $@ $^ -lpthread -L $(LIBS) -laxtls ++else ++performance: $(AXTLS_HOME)/$(STAGE)/perf_bigint.exe ++ssltesting: $(AXTLS_HOME)/$(STAGE)/ssltest.exe ++ ++CRYPTO_PATH="$(AXTLS_INCLUDE)crypto\\" ++AXTLS_SSL_PATH="$(AXTLS_INCLUDE)ssl\\" ++ ++CRYPTO_OBJ=\ ++ $(CRYPTO_PATH)aes.obj \ ++ $(CRYPTO_PATH)bigint.obj \ ++ $(CRYPTO_PATH)crypto_misc.obj \ ++ $(CRYPTO_PATH)hmac.obj \ ++ $(CRYPTO_PATH)md2.obj \ ++ $(CRYPTO_PATH)md5.obj \ ++ $(CRYPTO_PATH)rc4.obj \ ++ $(CRYPTO_PATH)rsa.obj \ ++ $(CRYPTO_PATH)sha1.obj ++ ++OBJ=\ ++ $(AXTLS_SSL_PATH)asn1.obj \ ++ $(AXTLS_SSL_PATH)gen_cert.obj \ ++ $(AXTLS_SSL_PATH)loader.obj \ ++ $(AXTLS_SSL_PATH)openssl.obj \ ++ $(AXTLS_SSL_PATH)os_port.obj \ ++ $(AXTLS_SSL_PATH)p12.obj \ ++ $(AXTLS_SSL_PATH)x509.obj \ ++ $(AXTLS_SSL_PATH)tls1.obj \ ++ $(AXTLS_SSL_PATH)tls1_svr.obj \ ++ $(AXTLS_SSL_PATH)tls1_clnt.obj ++ ++$(AXTLS_HOME)/$(STAGE)/perf_bigint.exe: perf_bigint.obj ++ $(LD) $(LDFLAGS) /out:$@ $? $(CRYPTO_OBJ) $(OBJ) ++ ++$(AXTLS_HOME)/$(STAGE)/ssltest.exe: ssltest.obj ++ $(LD) $(LDFLAGS) /out:$@ $? $(CRYPTO_OBJ) $(OBJ) ++endif ++ ++clean:: ++ -@rm -f $(AXTLS_HOME)/$(STAGE)/perf_bigint* $(AXTLS_HOME)/$(STAGE)/ssltest* ++ +diff --git a/feeds/luci/libs/luci-lib-nixio/axTLS/ssl/test/axTLS.ca_key.pem b/feeds/luci/libs/luci-lib-nixio/axTLS/ssl/test/axTLS.ca_key.pem +new file mode 100644 +index 0000000..7c8ac8a +--- /dev/null ++++ b/feeds/luci/libs/luci-lib-nixio/axTLS/ssl/test/axTLS.ca_key.pem +@@ -0,0 +1,15 @@ ++-----BEGIN RSA PRIVATE KEY----- ++MIICWwIBAAKBgQCnZdk20fYWh8O6kDTt0AuJWyp0YIrb7W1UNNMPXI5wA4J59IVj ++Nmk5wocm9+Hqzbg7rORAN/mHPBhzLAjhnm1HODs36hW15DtbDkkH4wCM/Tsyv79m ++n0xq1V6peK3t9vi2D4p/IRjHkYR2jm+BeknopijhY0kHHfpGTHa2DnVirwIDAQAB ++AoGAd4Ia5SxYiBU9A0BYyT8yPUm8sYELIaAL4YYk+F6Xwhh/Whnb8MyzquzaGFP4 ++Ee30jYYNHlvX5VheDDtvy8OTN5FgKNNdzvW15iA4Hxje04ZI7W87G7OIxm7aYRid ++sG4XqZBtsOdj33IRd9hgozywGJ2qRqS6nn2KxRv1w07RniECQQDZAlKxijdn+vQ7 ++8/8mXzC+FwQtzeTUCuLrBJcos9I/591ABoxYkWcYLxpFqgCEVwb1qfPBJkL07JPt ++Fu6CTnBFAkEAxXmUBs47x5QM99qyBO5UwW0Ksrm/WD4guaaxzQShMt/HzgJl613z ++/x4FtxiQJHAr6r2K0t5xTJx89LVKuouYYwJAImue6DAvJ5wDfzrtXo28snn+HLHK ++uONdKL/apgcXszE4w74GJsoxWwGlniUf3d3b6b1iP2GtPyIDOJjpjduZLQJAE4jS ++VtYB3d1MZxxQLeKxqayyuTlcr0r+C79sqT5C//hZGIzuLhlOMLd0k0cvwxsBjSgQ ++2ok8pfp49fAVI1z5xwJAVmJgLc/mSti5A2q3c8HW8qvMJEDPWbpb7p8pg4ePtpa8 ++EE3TO4O4J2H+k40C397km4yZXdkNQsiT1zVljJZpiw== ++-----END RSA PRIVATE KEY----- +diff --git a/feeds/luci/libs/luci-lib-nixio/axTLS/ssl/test/axTLS.ca_x509.cer b/feeds/luci/libs/luci-lib-nixio/axTLS/ssl/test/axTLS.ca_x509.cer +new file mode 100644 +index 0000000000000000000000000000000000000000..9c9936b8e98d0b7475e522377e64ee5cb7d9858c +GIT binary patch +literal 483 +zcmXqLV!UtA#OT4q$uKvs*kYO0(kKI7HcqWJkGAi;jEtmp +zDoN&tJf@_eyO<6*KV +zyX-GFpR#RyrAh0Vm>C%uk(~z&JZ7M~WVst|nJiE@P*UHyEW+SG%xvc~wa?bgyU%&o +z__O9cjynut$9A5`TwES67IMd>m+OQ}^u4t{;lgJg9l!sr3OSV*OvR3NHYY8-f#GI +I<)^zO0PSqO5dZ)H + +literal 0 +HcmV?d00001 + +diff --git a/feeds/luci/libs/luci-lib-nixio/axTLS/ssl/test/axTLS.ca_x509.pem b/feeds/luci/libs/luci-lib-nixio/axTLS/ssl/test/axTLS.ca_x509.pem +new file mode 100644 +index 0000000..86f6597 +--- /dev/null ++++ b/feeds/luci/libs/luci-lib-nixio/axTLS/ssl/test/axTLS.ca_x509.pem +@@ -0,0 +1,13 @@ ++-----BEGIN CERTIFICATE----- ++MIIB3zCCAUgCCQCdbnM4pjqlWjANBgkqhkiG9w0BAQUFADA0MTIwMAYDVQQKEylh ++eFRMUyBQcm9qZWN0IERvZGd5IENlcnRpZmljYXRlIEF1dGhvcml0eTAeFw0wNjA2 ++MDcxMTQ0MzJaFw0zMzEwMjMxMTQ0MzJaMDQxMjAwBgNVBAoTKWF4VExTIFByb2pl ++Y3QgRG9kZ3kgQ2VydGlmaWNhdGUgQXV0aG9yaXR5MIGfMA0GCSqGSIb3DQEBAQUA ++A4GNADCBiQKBgQCnZdk20fYWh8O6kDTt0AuJWyp0YIrb7W1UNNMPXI5wA4J59IVj ++Nmk5wocm9+Hqzbg7rORAN/mHPBhzLAjhnm1HODs36hW15DtbDkkH4wCM/Tsyv79m ++n0xq1V6peK3t9vi2D4p/IRjHkYR2jm+BeknopijhY0kHHfpGTHa2DnVirwIDAQAB ++MA0GCSqGSIb3DQEBBQUAA4GBAB0LgNo0oCcwIie5plgwwFybQ8x95q6e3wndM/Mp ++3gjcAFbGuchpo3dfFlTcRI0KyERb3q1MVxPM4sff9nT7EdHVyK9s8/ITkP2dcTKc ++flbcTEfJVIeM8L2P5F41Hvn9GuGcMW8EmsC06gdbp1LLnqsdrXdMNBsAUBXfgPrU +++UcZ ++-----END CERTIFICATE----- +diff --git a/feeds/luci/libs/luci-lib-nixio/axTLS/ssl/test/axTLS.device_key b/feeds/luci/libs/luci-lib-nixio/axTLS/ssl/test/axTLS.device_key +new file mode 100644 +index 0000000000000000000000000000000000000000..4e981d143e1383828b8a76e18c57e0b0f59b202f +GIT binary patch +literal 609 +zcmV-n0-pUaf&yIv0RRGlfdJGZ4h<43zjh$NmAe*gFd;CkIEWYaUz#Bpms2~d;TZ=+ +zk`Pe_4BeOCv@NwmC65?N)gXrn?#|TyB9lU`OINiLyb68LKj!YuC$?l`)u2L1ZuNgc +z=Sux+ln*4$Nfhl{gttWP`YNkiPpo0p0h3)_$nwg2s|lRS$t9_kyc+@o0RRC4fq?*^ +zL=H=j!{3Frp6Ni0WB0Agp#h-CLCM~qOnu)|K)UjF%r+-Ic-(fn!L=2LAE_OnV2@ezYPqfv?7EVw +ztnGa>p_(hpRr+n(N$Ooc;-Ug;rmFgzfA1^_2-*k;^0%11vl#+G0M`^95MJ-`(OR-i +zBA|9yFh78sA*+l|0wMujX*I%@o4%O>ok-BGDtQP3_l0oh2@5c16ixpA!QhEf#zLZF +zQvyK%tS>_pbrT+q^2G&mI(6scS|AxC&V>TLsLms2K>j$f{xgTlW2bz`iWbV^SZp~M +zSQa|OOK(li0kpVqV}#k^0zZ3z5inI#a)-o>oxVh6us#Gh)Z2ij5G5&LpFzr;@!ous +zU+nPW;~#)v8B_>M%wA;5u?2*padHnE!MbMQTY+(0Wgg|0 +v3cKQF;e2bA5N6M*E~R!7Tl|5&J97n<934}R7|5Rx8jwm@UwAr_9k^bwbVnG3 + +literal 0 +HcmV?d00001 + +diff --git a/feeds/luci/libs/luci-lib-nixio/axTLS/ssl/test/axTLS.device_key.pem b/feeds/luci/libs/luci-lib-nixio/axTLS/ssl/test/axTLS.device_key.pem +new file mode 100644 +index 0000000..2bcf5e3 +--- /dev/null ++++ b/feeds/luci/libs/luci-lib-nixio/axTLS/ssl/test/axTLS.device_key.pem +@@ -0,0 +1,15 @@ ++-----BEGIN RSA PRIVATE KEY----- ++MIICXQIBAAKBgQDUIg4NEiu/diDAlbsWbTAhMKw4iBf2X5ohGJdTO6vhGQdEkhBR ++Bgzdl9+0LbVDJY8YStUghwnuztT+IpNCrUtXtRK8Cn3QP+buzSe2ZGPVoEJIbvV/ ++QudK/WuUDyTNSRTtW4S3RO36KqtbT6xh1QGTXV3I8sp7qwmcysklqZW8GwIDAQAB ++AoGBAKBEDkuPw9+Ftp7pQIxj963LoQGgyEHJ3p9Mfd9TQLrydsw2cf9Uy9mKiWcN ++9VkCgkZ/Gt/VRgrW1pIduxXv6O+8S14An+2mTayy3Ga1N6MulD7OHQP9kqR4j8TT ++xaYPR/1skjhQ+Y0Uw4NEa3OkQp6lAUEp1aVX/mTfIZBguaUxAkEA/H543Ha6wbUV ++iB+pHaBgj1nzarmuEey6kqqs7X0zoZory1X6bdpJ6l0/4qICa6aq+pt/7ywJCNoI ++CPK3mL2zGQJBANcUHRBe7/HRWrJNIqB2WDA/gJshq4xOAiIBXWk1wpabvpkCnUjQ ++rip5CAL3hXDnCQswZxRN/v7B4IlSxkKiY1MCQQCsL0MUdRMejfLFBXI6defjWiAZ ++I86FAr6oziNnQP44sf4zh8pjp3zIihbK4lhsORhYFjrES29NzgG0uHBjhNnhAj97 ++gBEwVVNyh8SMnb5EZbA+BDjU24CmECUpYZ9Bypzx3nyTX+zw4uMfgGAZVAhLzF5l ++DmYiQqcpoipMsDsoCBcCQQCxBYSicXIPG8G6ZuFbgXFcZR7llgq74mbhfGuVEGbP ++qS6ldhJb/IG9O3MFlRwdU44YyJ8QGpBKWF94OpIduF6w ++-----END RSA PRIVATE KEY----- +diff --git a/feeds/luci/libs/luci-lib-nixio/axTLS/ssl/test/axTLS.encrypted.p8 b/feeds/luci/libs/luci-lib-nixio/axTLS/ssl/test/axTLS.encrypted.p8 +new file mode 100644 +index 0000000000000000000000000000000000000000..8b0a7eb4117de421cfb917de7f03055fdfe2c28f +GIT binary patch +literal 385 +zcmV-{0e=24f&qOn90m$1hDe6@4FL=R0Wb~(2zv&jLbrq;i2?!$00e>oTecB0S5Ch{ +zHl7H=qA4HIOB;)ah$8h!;8it(u3j>D`liQs0*+k*%XW@PAMoO|ZVtaORrZR~IdUoh +zNf*1NZ0jCJOsIuor2OuhY5SBS)gmT$Plt&Ub|ujkSvY}HF3T6ZV$+;=Cj1_ +zqiV0Xy#~l}wq>xTcs~vcY@+sZ^yo(jDeDIm8}2%S8s3H&bnWkZz@9kPK8*&28D$i9 +z3|2M?_7i99)`(fX3rvXr@m91pnk>4N^QQR5XPP=(qj)V!5qKV+KU4NR01UFqcL=0O +z)N0{uLA$ +f>0oNt1g(0Zzb?&!uhc`Lu&kDME*dK^i&ZfFoN%%v + +literal 0 +HcmV?d00001 + +diff --git a/feeds/luci/libs/luci-lib-nixio/axTLS/ssl/test/axTLS.encrypted_pem.p8 b/feeds/luci/libs/luci-lib-nixio/axTLS/ssl/test/axTLS.encrypted_pem.p8 +new file mode 100644 +index 0000000..19ca3c5 +--- /dev/null ++++ b/feeds/luci/libs/luci-lib-nixio/axTLS/ssl/test/axTLS.encrypted_pem.p8 +@@ -0,0 +1,11 @@ ++-----BEGIN ENCRYPTED PRIVATE KEY----- ++MIIBfTAcBgoqhkiG9w0BDAEBMA4ECN+YmhCv0ILdAgIIAASCAVu0QEfMkp0xUsNq ++0Ek4Nsa/uxcs8N/2P7Ae7qCakkvsdRvvPPH0y+wuj5NgrG6WpPeeEx9fI2oNNTfC ++pwncH0Xm99ofVrgMX6XC45LDZtzXNSZd4TdBP6xvlYXbuGegp5GPJ8emzscHCFhC ++JfPHemRAcB7DhiWukPosuSUr5R8OluEMJrQLHuQtlDAvMjLEI98lSchPxF8LKCk3 ++SS2uCcmc+4WiR0nHG9BOaGi38+PytHAnbfo1mfVSQzLfgLicMAVGysfQ9QOgpQOO ++ygYfM/s7Duwbl0rshyXVJP+7BpYJnPtHvO4BTiizU7ZEr4WBiEnnANDrupSdsxeH +++cxZo70YJVdoPdgMd2ke6EIkUhp7HughFg+okldlEtJA4muKeEzwAxZu0TqxOtZ8 ++UYRS4Ygk+rN7Y0qTKSYwSkrFBwUDkpctYjRUOeAZ/mYMKWmMn1ejAb5Is7bjEIxl ++tw== ++-----END ENCRYPTED PRIVATE KEY----- +diff --git a/feeds/luci/libs/luci-lib-nixio/axTLS/ssl/test/axTLS.key_1024 b/feeds/luci/libs/luci-lib-nixio/axTLS/ssl/test/axTLS.key_1024 +new file mode 100644 +index 0000000000000000000000000000000000000000..5b6ba1d037b002b0d62c9903a3582daac05f77e2 +GIT binary patch +literal 609 +zcmV-n0-pUaf&yIv0RRGlfdJUxzZKro+(m=R>yKlNL=U?*N-L4NhtAFS(rd;edexK>+Roc*l5!1eeSb!19#biHMZR!!od?jgH`Kb>w%687GkutJnIO6oO#nY%JBk00O>_vE*8v_P(ZeM +zyg1-iXi(EHbBv5C4uMLFyUg%pG)A8XeImB`MyyvOj2`RL1x=`fYG?MQv8#^3@9%x^ +z!va7r##ufX=mK*A@81nDOXwG=jKS!Mks0{(q_+)5_cTxgUJ9@&6s`anfHIu5fuH0; +zf)t=Vi;POuOB0>6lS0gAIAV!eeFdnK&`0|5X50)hbn0KrYIAk0gtB;cu1_*7~DLp$s41j1L{dy$8u +z>Q{6SrHuFJ5=4!AZ6f&-rB0VNk}EF%GnIau0>!zBGX8BCm(}Gomw{5otF4q+j_!p^p1sm3^l)5OV-`8fG^47KzM3=dOYqWQN}Mx08R?P +zYG(QI^V0Ya2D(mOHZ6n3J@*&>6Q$zUudW;ASZ +zQzH5(Vi)P&Q`Izs^HP*fY*{R7YiqEtv!@=|O8tlwC^M*Cwj0|J48 +z0LvBOMMw2v^dO~mza7xFv4n50Qe?_on9muo``SJVw9twDxz;$tm3C(+A5JQ?3KbZA +zjJgHmx*IBX4Ilw`JwQ-@w86>Eta4z4TXD9^xK10mFm*b9*FGd6pGoDEYM0?EA=1$? +zAh{7-VIk);QUektIB7B1=h0D7V+h(3j{<>!Ay@B-IXxJRi!d!JY9)Q_y>BYaL$g&; +zytn>PR~(ZYzYOl@OGA*<38Cgn$53>6_^#wDST1{Xw-R%AJ5f%kWK&JFV-I!P2AUax +z?0^i4+Xou6@fpn6>Md +z0)c=X@A}4A#y*Q%XsE;Fq)6I8SgLZZ^7^m458-?+{^(mFM#e>F-0j)c{*7c|js3Dusa$NJOJF%*s<_@CX`P5&9Zxl{ +zJ26krm{pSK35pUk>#y4J{_H2XK9P;o*ErV#fq*qDV<*E0RC9D5w-*D^YaVVcH?W@L +z7s;4%??z;ZXmnf~khf-nE#R3RkTMy4Ep0;5M@#wpmeJ?wh-{#-F%}3)vYB3 +ztJJUoqYbWSsq{2`FhC1&(maox?BB8At*_qHegN_Cm(UerlhGFqSp+Cz&}#6X`{ +z2H3(|N2wGExlD97fXsOeCn^W`4Pn++s+M#D>;O(~wfl~y;qgj?b^u`WqW``cC|ig? +z96y!M7XS2>*B=ru_+Qy_9la*KLK^5a-5uR~wh=@#U7Tn=6AH}gihl`NTe>q(s6__@ +z%!kaMhJ)^ct&_f>W0CD_-U+Y4I0SM3pkvJ2 +zC5#@2b&4ibCx^XoK}a?;7P^WLB95^r%-L{Z^TI${%`T)LB-5txgX;UR9*9tfG +zp0JoMr}gZ3&ElIoiQP({zW|?|Q29=N}D%WseeY63jXE#yASA&jVGam|+W!jT0{up!{AH7z;XMwF|1&oLlT +zIf-10|5X50)heo0Ic&e?J7A6sOJ1oEf|dfVdPFl7nV#Utbk!IcE+x| +zwzL2mzN#?8R)=NF$soY8eCHCB3H|LyF9zTm1EmhU@HP^xA!jo7)<0XT9bP4MXZ}Tg +z9vpLn130B*c(tPYd~`tvpU+SK#>$+(${mFip2Fs^tL+p5xrw4e0R9cryNig*Qm99AT2>K`J_ZtV`sYF+WVfz|JC5a< +z32|_d#wA0pmA>Jqt>Mq+?{md{55I*UK^tnI4QyYb3M%J`W?RySWV>v6a0W~ptFc#8 +z2+k-`_?PuZljI(Z0ycu)f%7=#+3so6_4~q}&izudsVk7dFnzrcH(x^A=H{OU7it9{ +zgYY)1WTAuDc>i}P!P>*jVZ-o?Z5mw5N5SWmc^m+(>O|VI_8zn(F&6&QuB}9w1$fl; +zoTz0hq;ReN$wnV{J0^Im88if^GkC^Y=)-Cng#lZ*eux-L-x(rbUK01LbXkwx0H)&siZdBsGY +zPMq(uI&?)?UC^J;$pV4_0RaDqB(do1D>>Gq+(e`t>wW2jmbau)pXl!~H>zdxJy}70 +zFQJ@~IHF5WD^efq<~`Y-ZapdE=Lvf^%`bxIV>8_ +zpi17`dW!em{S$qPsQ +zzinB>N&dd23n`lgx*LKC_VcD7mz0m(-cw6)yAq_15GEpUr!x{xm4s%+;_{m6IW3%P +zUSyYXejLf2KjE=QU6-!scDoFt6`f&l+0&(85wU;4{*%q6qPV8GmC(8`8*ZrUuiq8z;aBT#Uur +zDKGrMBOFWEVn`AV4MGdUv>t%IN_x}+7WbM=`KGAls{0t4O86`nN}ZmdaAZh%0M=q= +z(+Zh=EN$fYA?`prE2p~xf&l+H9=lOdxG5_)MY;GlVN!q)iERlQWT;`HHkO%rFj6$8Eo2%|Sb +z{rF3nAU+bOCGW7&gx08o=COjKnG9OXBv*(*XA_7DIoHpF9f_YHl +z6Rf__Wk*KocnrQNJq$tmKXqr5#tV-L-)jzV4sP&t6|KgmadNx7o=1RY_L`XR=my%F +zxJ*{_68OcU5|vB!271W?f&l>lq7j)r+-H%^f<*}JSZVtPV&|7V_uzNj4B0wPZU%(I +z!-#xJMnItAM}A*#OO?#rh~@QEQ+PsjlRKVqeTyM#dxk0l02_r9_ +zBsL~(g-PWYbR%PVYD*$Dua&VxhCu}x`T7lBNtJ2|fQF1p@+xlc!^9lFEq)(oD{-AG +zMv3>^$8)&&Cqm9W>bB2ITLy^6lMzc_-U;tIQITU0U)4vV +zu^PNP`(&Igf`#YYx+c>R;XC3`YZg5g(tGs#J^3oGTnXfccDQZ1E2^{1-{SxQU()Tj +Tbx&XXcZMQG44N=;lHrQ{Y;S%h + +literal 0 +HcmV?d00001 + +diff --git a/feeds/luci/libs/luci-lib-nixio/axTLS/ssl/test/axTLS.key_4096.pem b/feeds/luci/libs/luci-lib-nixio/axTLS/ssl/test/axTLS.key_4096.pem +new file mode 100644 +index 0000000..9929467 +--- /dev/null ++++ b/feeds/luci/libs/luci-lib-nixio/axTLS/ssl/test/axTLS.key_4096.pem +@@ -0,0 +1,51 @@ ++-----BEGIN RSA PRIVATE KEY----- ++MIIJKQIBAAKCAgEA/Ce0mV0qytAwDPrjXRBlUh2gdKs2thDw3N18owXVrSUFq9Sw ++AaMNrmep9DR9MEALcdMm3GCEJ7sOOiEQcqTz25di36WJDe+jo1z5nD2XZsPIsp9+ ++k51Vz+W3B4vsXJAgzV+XZbmv9L0598VEwkpeI3Uc9et8ZhGvDPoHZyBQG1KAj6h3 ++AKZ1+NthrhajxlrndQZ5Du/R5DSUQOBcCHHdzZgihdfF97Yn/kp1mele1ElZMlqg ++BtpDi1TEQJ9XBtjCW0epFAm5THQ3gMx5DCcqB/cNYdZWqpZ0AuwATm61+46m4fFK ++g3YAYPOi/74aKFuIQBw/lc8W//SV1x8SL/hf2XIdvSa9QhroNN0d3Xu2EUQzXZxo ++PRMKzOqKfwlZW7ozT6hFBwPMh8yfhoPugq2TvqBjke1s3gmvwTgEcf+gY97qXiZC ++X5bh/ehmnZ7vIblYFUD2yMlsKaXGJYweh3WKJlQnh71wQUg2Mxa6ig8ijrEozNlw ++YfPCQFrNLqQfJOwdx90dy7hpUyUn1wo39p6wmC6n9ex4zeKbO4ndSp+/AJ+d5Qp8 ++zoMzwneYV9LBQG8ry4uwzDkSWKb/WghsEbQ9O3sGIuI13SlT/B64v3bLb5AHagI8 ++zS3kPsshjKhkcc2W9MKRBU2wIeCsNS052kaUq3rPMSBROrALmLk3en/Dq48CAwEA ++AQKCAgEArPMy7So5Cqjm/FAtGI0BYeRORReWTCSsgGEudsauu7a0ABq+qjDDVodl ++y8kgwLJ85xKUCf3tRy8G4BoDpQ688DYSrCFnMvbWP1urHV4ldWf+RX4eHHODAzil ++ZHi1ovt8dEEHn89P/8a2dtqIgdbuYNWYCpj9Vyjz7yujXjmMmGDrKx26meiS7CDV ++C8odhRSewuawq+0UArmJokIA/g3Tu4uIylKoR3JaVhGOPgYSc/rnQiFkt66HO47l ++mQlxcJHGJUOulb7hqK3hz+bvc8V9D7+FH0EbaqANbF+hCirniWZb0odku2x5cAZM ++G6uxV1MIzihR+Jf1R5PkHowCNoLegfM45tnuadP1+8Kezv1SsqkrkMEwfb0QN19C ++2+bmnwYXagUgg/A2q2Shg9h4/3cpwdrDzGHD8IttGlzLR8HnlHkcAK3qRNqy9h60 ++JDEW/tOurUSZBXjU9ZyoZSukcK3+yUjCDWS92wMOBlUQGh4/HCOOizahe6lhn2nT +++jkBvl38c+7GBKR0VyCisFi++FukMBbyU/hNNFByZxOj0b/+YVYI0qwM5oDzLhJH ++69/VhxMx0xVt9/kOOO3yhdGjKCZztPZZm5mg2OzzXmf4im+hPSg0/OrdXrVNk4v/ ++w7ouUQHSa3+rAAu8BJFF2rTWA7rjecVEnk6c77I6dEVYXdCfz8kCggEBAP+IJLHo ++7Cs51qPcRKQc633phJa3pFGf6O8xN6pl8z1ZQX0voZyROKJLTytSH+zmPdmggUeg ++7CRoV8BKY49YiOxO2Kx8BPfftItS9yvA3O9ztcdzQa72nYusMWwvj0yFU8DbYfnx ++yYw59F/1pdPKFN83Sj4MJAOb4nAxBP1GiZvsPAgcTpf/197NLNHwUDdk/TXDtTLa ++lx4uTn/SJDQuvsCCLBKyx7FdN5NPRN2kIKUWZLd7HRu2EhcSlATwf4TUPZz7atKN ++2FD0svErpPOAspNPtnNj3RgeunGVqS2oi/XueuveNNCYLkcV8/UaZm85LBrPoEre ++23qK9/ZN0SD534sCggEBAPyd+nD71pScrM0TI4Lc3jMNUKeZj3sT5rlhlkWlARhQ ++WPEWYYg5vs3zDiRpG4Xy3n9ey+M6Tuw+/XpcJZxhrLYFOqparxXPP4qc+3EvtzpF ++OskLR/2/bVnESf6+pQspmwW6G4IJ9vOmIJeUj9zeU0txuxKkjhAmInCnMxJOlYRm ++xeLymuo5LZxrXmSXcX4cyZ0/4bF2L3IE5vH7ffdWXWYzW9wP7M4sFp+0iKjHuhC1 ++gB6Qg0Mp0TVNUt0ZEelFLEJdA2lbbZ5yHhNXuhOxW/l3ASSe9tjTpy7yBSwBOpFG ++l7QGISfJVEFfjyn7yWBYj5LDGnitlP4TtN8zyy6cJI0CggEAPRwY8ncqq7e8Thmq ++TLkh1E3ZSJYIdQDSGwnhLx4MirpiwAZ5FtFgAugRueF9AxGY7wfEgxXIA3j0q2be ++4nQg4qqEhNNv+LuGGN+xfsQz0gwRB+7XYXlW+gUnGKFTGtCz0+ZjSvv44FEn0R8V ++Fk44qZ02YxpSLo7EG2KNt+h7lk9rl+D1JsKnpH/a3SYkeOrs50OzfMLr6urWGRlv ++UQ9wzOcUlTAuM4uAc/k8FelfaTuuwHZv4qWrM9tcjMXbKS/8wCMcS9hiSBINDUIL ++w7QegL5KetQCFveaTPmmqOWq+xiaSvgsF0qdnqBwZEh5ANZiZtMKmX0sbeT4Ie5A ++OiunuwKCAQBlSlrvDqu9rwzCtdfZUwJtaftbGIGlkhdDYdPFXSIRQ7ZGBPlai/zr ++y3dyNgrpLLb2T2ZlWC3pIGC2vVf/WlLMMVCSmgX2MsGBrOxNOBq57KRjlHhrUGRi ++SAh7cqnuzeHw6+y3uZMhow0Semks4KB5ccLW+NBVvVS14vThdE0TZ7oVA74GCKM3 ++Qv34S5kgPh7BRKoUZBUmHL0VbgfWMvUEU7eTh3cmPBteMh9RvbPnmz8iAkP/nDbc ++roJ5UOITrL7QZUdG6XgMvik9DEH6P3Vnk8YLjwnfaw5wDm7wdBWtxqZxcru8nkeA ++ZvaamPDoBtqauExW8xL4xaISlUv1BnrJAoIBAQCiEZk93GeRzYJFCO1YafsGYueX ++Pffgd9wM2TpObgaEw8OIfEpGQKDiR35fb0uVzNyI5fVU5D5tP0b3LfvtQXV12ryQ ++sVTA5YJcb8mRuUGy/AkjL54kNiZthUnlGHQjY3lqSyI1r5WxRIZBBRn5+g1eSZVq ++CYCGjEryKm7vw8Qcvy1+H2crcZ0rRyLTcfFCr1ZXlyEZu48ScOtxcIDHc7j4J0LO ++Peq2z0tbBojGkxFLX94J7zpRkWMPX9VHorEavDv7ZJwtgoXn3Lom0xHhO+JQaxY9 ++FtJ79Ps9+SquXAnkhna4bbkrqrPM3+MAAV/S7bd1T1/8d4YiRQyaMHGS4Yr8 ++-----END RSA PRIVATE KEY----- +diff --git a/feeds/luci/libs/luci-lib-nixio/axTLS/ssl/test/axTLS.key_512 b/feeds/luci/libs/luci-lib-nixio/axTLS/ssl/test/axTLS.key_512 +new file mode 100644 +index 0000000000000000000000000000000000000000..7ae50f23bdc90e48f165aff330220508a99699f5 +GIT binary patch +literal 321 +zcmV-H0lxk)f&o1O0RRF)0MR=zU#S5?J%(*^zCdnK!AXBtb)hXb<-t7_Lcx{!|rfVZ|0=xRXKgPd)!Gy#fOP009C)0Fimb?T$65*W6;Z_#YNk +zQ@#a*O7BqLt*OZgemVyg$o&?(z~q?GMVVlAY-DAL#~wAJ%@hSVITaeX4+WM10RkZa +z=2Ex*d>@xxG0k=x#?fIqh)t}0wDn9_HXM@#5)1QLVZv(dI{VJ +z<#zME>JR1d(>*U^;{HF#AygqJ2JGkYa5*N@$(u= +Tmj7@iAR3)zxTTMr$9H6O@syE# + +literal 0 +HcmV?d00001 + +diff --git a/feeds/luci/libs/luci-lib-nixio/axTLS/ssl/test/axTLS.key_512.pem b/feeds/luci/libs/luci-lib-nixio/axTLS/ssl/test/axTLS.key_512.pem +new file mode 100644 +index 0000000..1e2fb41 +--- /dev/null ++++ b/feeds/luci/libs/luci-lib-nixio/axTLS/ssl/test/axTLS.key_512.pem +@@ -0,0 +1,9 @@ ++-----BEGIN RSA PRIVATE KEY----- ++MIIBPQIBAAJBANE7MF+pAUI9hm1yvkBuUcFJf1d1oS025cE9DyAa0SNt+nTSPiOw ++cPygat7sQYiE/lQVa2HFFmK4k0HxTz3/Lr0CAwEAAQJBAJF5xO2ONajX3GK2+B8W ++VVO+BYNK71DfranJCX46BxXI/Ra7wOSY0UWZYHVsZGWJxx41os0UBTg5FRq4DwWW ++AQECIQDo69eo39iQqjwhpAQxatMh2CWYT7gokyu56V+5o2V3fQIhAOX2b+tQxDsB ++w0J9UDN6CdwI5XbzveoP5fHTPS9j4rhBAiEA3c+y6Zx6dZHYf8TdRV5QwDtB2iGY ++4/L7Qimvwm6Lc1UCIQDDXWrVsocTTjsReJ6zLOHFcjVnqklU2W7T1E8tvKE3QQIh ++AMRpCFM7MrS2axuc8/HzGkqW/3AlIBqdZbilj5zHd2R0 ++-----END RSA PRIVATE KEY----- +diff --git a/feeds/luci/libs/luci-lib-nixio/axTLS/ssl/test/axTLS.key_aes128.pem b/feeds/luci/libs/luci-lib-nixio/axTLS/ssl/test/axTLS.key_aes128.pem +new file mode 100644 +index 0000000..8961bd9 +--- /dev/null ++++ b/feeds/luci/libs/luci-lib-nixio/axTLS/ssl/test/axTLS.key_aes128.pem +@@ -0,0 +1,12 @@ ++-----BEGIN RSA PRIVATE KEY----- ++Proc-Type: 4,ENCRYPTED ++DEK-Info: AES-128-CBC,B3A0D2BCEF4DE916D0BBA30A6885251B ++ ++v8y74AGReaPLmDt6O8wir6hX1Ze8K4fVNkrLqfDMdW5E7jBXKO8riCMNmSjQ9fyh ++eTicej93+8krcIvSXKW18TdO+EWezQevgnLrAZQWaNPH2j4B+K5gm701uiiKFKVa ++1zngAOByePYlN6z4JLbiCyJRhxSo5zCaUYkKC2eGh8mlE64QmokPSCAj0wcCDzGh ++hdhBg1vm0GmaQwIDVn+8zMfahscXVMtBmyQf5YP4PQW2nqOt7aZHjBNdg9qnBpGw ++b6YuY7eZ4FgQvYcsNCi34NroJb9pkTrrF2F9Meb6+3So7jtMFG/YaJdCuXtf01g/ ++Qm+XA5pJUtIUr/hLQjhkaOVUtXv/k0o/MR4k5CbAmboLt6YHf5V8+01vk0bvv5dI ++70pVdXMmx26xDZOGmjYzd93PWc+75jak3GN2fbWryQs= ++-----END RSA PRIVATE KEY----- +diff --git a/feeds/luci/libs/luci-lib-nixio/axTLS/ssl/test/axTLS.key_aes256.pem b/feeds/luci/libs/luci-lib-nixio/axTLS/ssl/test/axTLS.key_aes256.pem +new file mode 100644 +index 0000000..7671a30 +--- /dev/null ++++ b/feeds/luci/libs/luci-lib-nixio/axTLS/ssl/test/axTLS.key_aes256.pem +@@ -0,0 +1,12 @@ ++-----BEGIN RSA PRIVATE KEY----- ++Proc-Type: 4,ENCRYPTED ++DEK-Info: AES-256-CBC,F076229CDC2BCB3B8722E3865855B45C ++ ++WFV9QWzr4tNmD+1OeQ7BceQg5LVQHp20Jo1Ax29lq8JTPzeObhtaU2MUHlcPKHUS ++vK4FyQxJ25CyMubbnaZqCCz9pNbseFuJ1tob9UqRmXkZ8HV3snRjJRbcctD+V9x+ ++Ymi1GreXoDQtMp0FtMiFjPvIYciBQnaRv2ChMAnGXNbZXCxWWA9E5S3a+yWzo+gd ++wEcowL+SUac1PEDGHokhKn7nctvI9cC4hE6JmKM1sD68/U3rRPXMGqmC7umqyT5P ++gjWBb1uu0iRjFC9eQUsaKPxey5Be710GFlyf/Ff/tep7RhkryIWEPvIzYCBf6rhk ++3pysFgTjfiUuBYUNumjXr/q5hgdtb75788XUDxKwAoUx+m8gi0nJg35CN2nmQ054 ++VJxcZlNv0wqnJ+GTTZeN6fiAhTpVtHsqHQomRSfaBiw= ++-----END RSA PRIVATE KEY----- +diff --git a/feeds/luci/libs/luci-lib-nixio/axTLS/ssl/test/axTLS.noname.p12 b/feeds/luci/libs/luci-lib-nixio/axTLS/ssl/test/axTLS.noname.p12 +new file mode 100644 +index 0000000000000000000000000000000000000000..9d27999fa053e524fa4ca893c2d13ce9ed49bb7c +GIT binary patch +literal 1483 +zcmXqLVm;2p$ZXKW+RMhN)#lOmotKfFaX}Mn9ZM5y6;Qa$poyspA;q?!i76W>l+MJ+ +z0HhKSGK>Z?Y+O(ico-QC_*gicZ@+tPGI5?Z6B7qRLlcv+>xsu7BXuG}7WFyS3yN1O +zJiB%z_haDaFJk>AMt=^4KDj&FlSO0x2df3KgsbB{=vL6^R#b?e&OS-QcS +zGCN$J5|-cmTV%e54S!)2?UI +zWu*`8Kl-TagceQVV7aLOe%rD0rav=xK9;Py<7Mxpy7}0RueYwx?_+3MS>c%f$vi$Y +z>qPY0e-jNE!}i!EIz_nZJDZx%Fa4AynB5}RZoGR%m9)iXor?9S-~7oa}kp +z&%|qA>g?W->CVE3V>Q*gZY|2(~y2WNWEVzf?I +z<(U-KKKn^n)b)LfN?Z=|E{NH6jr(|qli}4W=1uv^j~B=u=E~*SW5W}$okLAO`S{IP +zm&N{b_Df#*e&uoyfd~wEuSU-w(_`~mv6zJ +zXND(%Y3vJ98Uv=jrz}lO4}rpWf%qmHH!Q_*F){%q7Xk(6VkShcPs!1(#%Z>ogb37L +z{j#quvpMaUTGqUyQ-7E)zkJ$hUr<88Ndd{X+aJDG=s(t#T=rr1MYoSPrQV;Yy}z+m +zy?`~c?A~9^kPHi*)!q-?Fa37Dv_6naZgJ(Ox~e3WYP$wqCBy$MnR+L9v^ugY2xd#-gtrp&?V +z%1b_dxY9+VRUwb~ASsUAx +z{&$<{bAPTu(cML_!?$=aJkI&ra-Px8)p5DT#2>Fzt$sAlbPs*aYTIDLJE^z&&fe?l +z^Sk%Vzox!;X90tFQ`-xh6V7XQZrpS%wK>%Iy6xiU|AVYWX5_w_yT7M+A7@N?Xa9pO +zC+yntHF^4$pPv6HK!{B^ccmIv%Zd0HP5-EE{lWK-zxlMywZ@@flle{ob(fXKCWfJZ +z_vby)@(Da^SW$QG_ddtyKiO82(qFgbfBiarGH +zyBpJ1of*Za&nY)6zS(c*82^(q&7^aotL?qtXSb}Jpn6Gv1;=%GfA;Bu!uO$&LNQUoK`?>=Jpus$0zm-LJ1}3V0YW{7 +zZF0UqZc)KWe^+&(EjH!BJr5un(Iaj8bkaT}uyFjKYToQYh=l%B6>DL|7Gk)QLGe#L +z|1P}(0|5X50zm+gdBp9GHK^CzVz&4n7FAQe1%pcOP~WYo$q9Zs2NlTu7Q4XYn9)U< +zV0CO{Wr@cgHKNTF1vohs8n_PymH`0*Apq#>*Qnpvkg7Z(qy#Z)(;?U;m`}JUlPkID +zU%8`YcYOjO0Oj^?>rliy0mDLlP&0Z7+z91%^S$a1{HF-OsY=oO*SU +z*nh;`MP5+AJ3-nZnB(&MLMgApZi{nO0wDmyU24^`hZ9aa5qO@nEaAm+HD{_xRM~FR +t)K4wEp*KMSAppc_2va*Uw6<#-ob&PX8cLS`a3vrbon^SCkDSMMWONLcmL~uJ + +literal 0 +HcmV?d00001 + +diff --git a/feeds/luci/libs/luci-lib-nixio/axTLS/ssl/test/axTLS.unencrypted_pem.p8 b/feeds/luci/libs/luci-lib-nixio/axTLS/ssl/test/axTLS.unencrypted_pem.p8 +new file mode 100644 +index 0000000..e07375a +--- /dev/null ++++ b/feeds/luci/libs/luci-lib-nixio/axTLS/ssl/test/axTLS.unencrypted_pem.p8 +@@ -0,0 +1,10 @@ ++-----BEGIN PRIVATE KEY----- ++MIIBVwIBADANBgkqhkiG9w0BAQEFAASCAUEwggE9AgEAAkEA0TswX6kBQj2GbXK+ ++QG5RwUl/V3WhLTblwT0PIBrRI236dNI+I7Bw/KBq3uxBiIT+VBVrYcUWYriTQfFP ++Pf8uvQIDAQABAkEAkXnE7Y41qNfcYrb4HxZVU74Fg0rvUN+tqckJfjoHFcj9FrvA ++5JjRRZlgdWxkZYnHHjWizRQFODkVGrgPBZYBAQIhAOjr16jf2JCqPCGkBDFq0yHY ++JZhPuCiTK7npX7mjZXd9AiEA5fZv61DEOwHDQn1QM3oJ3AjldvO96g/l8dM9L2Pi ++uEECIQDdz7LpnHp1kdh/xN1FXlDAO0HaIZjj8vtCKa/CbotzVQIhAMNdatWyhxNO ++OxF4nrMs4cVyNWeqSVTZbtPUTy28oTdBAiEAxGkIUzsytLZrG5zz8fMaSpb/cCUg ++Gp1luKWPnMd3ZHQ= ++-----END PRIVATE KEY----- +diff --git a/feeds/luci/libs/luci-lib-nixio/axTLS/ssl/test/axTLS.withCA.p12 b/feeds/luci/libs/luci-lib-nixio/axTLS/ssl/test/axTLS.withCA.p12 +new file mode 100644 +index 0000000000000000000000000000000000000000..ae029dee0fd45e90460d0eacd15f9be1882756ea +GIT binary patch +literal 2089 +zcmZXUc{J3G8pmh(F~%Ok8&kYBg)D;*2FVg;ghXY@z7*Bimm!Rd?1M5&G+}5ak!8F_ +zUL~QSNLh=qC5Eh7vS05x_ulR~_mAg%pY#1b=lSbaa*^%q)Nk&KD<${~X$Bs$!?=aX(DX0b)` +z2=?1scbxjAy)u@r^s~g4M|A&HpVVc(WGVgvy{ikEfZFkPEVjjJr^EF8KrD`+uRA1g +zxA*y2re}A&5n``vH!1gLMon>80@oAn!BCe`J5Om7!JOHvY0haYo0>t2ZHWFv)gCwC +zcHV-}4cAM&Biz&hD-yA&@oQG74hLy%SFU#=+jVtu(uIS_TQ#f3c@C?6i}42hDFampl%liFBWzzf&J5c(=<%^P?;lZI3p1Tu!DplU +zM4rNsQuFrc3#-z1@qd+dl9MV4j%g2~-kl!f*tk(>xkQmBR(tPOebymRY#7>NILs^G +zFd-|{;yzg(q7!s)AB_98U&M**RwaoN8`WRQk2%$o_`8gBYUQ +z>bS?Db1c-A-gmLeY}Ob?-;`}5!ofJtZS#IT860`^oOnbUrpyHd)iXTzc}Xntnd_EA +zzU5U9JWN7Dz-4^pns>eM`I0*SCMnzRuH}%O#6|~pMIl&Wfp@gn^DiZ-!c)6CxQYd) +zJzRNAA*1aW$MR0a5w!1vE6WIu=xKqx@7iUvpuMMs?kTPnQE%qQsw%behcY@}vw**a +z`foo$)*9kjLz9hUoP?ua1DZUDNPw}ee-$X+4*&5eOHBzATjgjS_UgHl-aJqGr={t~ +zYP=pu70=og;9j?fi#@8a{zI!-#dZ+&97Xd$&R6z4v+AAQY_#P33i_0F5*2yVfg%t) +z)_nArmLs4ZQR5YVHQ7*}S#SyVn-<_%!7>aQ8Hs*0VQ%t)J|~ +zYM9nX7;4R-{w|0$=MJHW5-(c4O~%Dbulq%Bh;Hx)GamO2{@G~$sth9yaULz2oIPXT +z*t$vbEzQ*7lpg)IE#F_XlK&DPd@_c%yi{D8JaGDnF6iLnVfoM?n#C;?0V?%BXrd6H +z`~U&Uvu^|Y1LEfU52$#-5DEeE1Vw=4|3AO()}EQTmcLW}55E8c1n=|Zf<}W~uH4Uo +z9{nEovqoI>)r^n1_hv@)AJ%vEGgA*~_PT3j&lA-c@fq-U_6%f2mPey71uU%KCBI%+J9&Aro_ +z4B*w4n26|vcZcX8WE&_U0XIty?`^rvdtAi@Fvsm3>>P4m&}3uLbn;s5sM`=7JqPui +zS-mGzw#%6jhKm(xmU1~$5cQrmU6oQZ#>yC1FgAuU7n|qQG0mBRX7WF+kR-PoWkF*G +zVix7BqulQN2=t*;OR02T=~bpiO{+|*TjoSY-+EVCvq$Ws9yukLrI|yP?b$NA9TaX( +zmbgo4-r8v49N~hEIpNWB_$2(I=#r?vK^#tNN~s`2UnH##Vi#= +z28)5ZrRXj+K7Q=MqC{}ba_eQ8>4@qxCdKNYjPd0UVU7lN5u5{4j0>Enr6=OGdfOFV +z>N9e~d`$HD0NLT=7J8*SA!dGDkUWFi#F{?9Y8wC8TceHzQzwxlwzkp*b1v>aNi7NU +zm2IUX6$AY*UB|5NmMy1GMaFk9OR +z2C*z%H2Xs#Oysq(Q-;Fo{qQzK5D)pTIX)d&`0O7%Z@aDrz)WltjghNu3G$S60F?&5 +zkQBF9=)*zbx2k7asM)2?BaI8GmP?=+iOW@e;q>b=$=Su$@b>}_0*>HTII*M%RV?c0 +ze+vyis45PKsn({9F;DsLUM9rLJHdV3VQKW!DCF-WF;&UK;vgJI6{H4o0fm9Cfr3H4 +z`k0G5y$e$Zjfb?Mzm60 +zsjiZwDdM^^5@TPYX|cPNopg21y|;VL{o_5)InVQ)_pjdr!DvMgfrMb8PiU-q%HfnH +zF@!Lp3>NA`!9x5^y90v3@}Cj93iD+9nZxp(!m{a{!^3zqnH?H3?JvYK&a%YB09 +zJ2xN64qd9L{rE_p$ONMps@`pG@6EKNnLn~iR>6LRDy*IxtM>K<((D-bE7=NFnBwZm +zVDTkVmMC}syBOh=Jkx0xrI)=3*Ky}{1WKVFJzh8-1K9d~&$_HC({W0Pt@N_i9?)3x-Cqr3T +zePAM(ichfVdaPV7n;Cu0cwFN=i_M+Czg!NZ=B0Lz{jy3Y3K9F+L*^p +zHpP`Lof=}%FOqs{X_La@CG5ckFU13_MfOQ*`js^lXj{zgSo8 +zpvvyhZz0}5*o2+_@ZA>_+oOj88U4s=;$?^F*ci`49CnGbkk*(B?PcZZ=S>SPk@3ok +zHW3DNLRD|`myKc0^uUeAjmqung+^{+3d{tGYU^W{TUf3p?UXw03Irn+{{v(hjFd#d +zNc^Ua+dMQ{XehcPNg=u$tZMZsW9R|};@aWS!k*BfVEX;Lt; +zHwbaQChOXxWnQcvd&tJ}o4rk5=geN#4DcKsZ(P$Uf9(}#!!S$J_s?VzH-9;@1v}xc +zUqgD9c3ha#A1AHv?NVY#m96HANF?^*G&yWD{q2GmcMsfa{LNbS^SV5igD{Z&Dx$B& +z?{%8u%3LI7ASp-pTao)4cVMLNg%y+2csd-s?%}d4`+cXH&-CM4bxkl%+;P(h+vu6r +z{vMBIBfcqkqD@*{Zdrmeo#r1MQq`(-v;A?#&AeL7!TDihKUhUbdC^4Ug3s4ohYm*6 +zy6b@c=5^0()bcf`szv4@9yKC +zxN5m4Qj4KC&t`J`pr#;YGsh~~RY{EiFS$GKk*s2u`sy`QPFeMd5AuLp>V=#eYf|a! +zMt>T)w&M~9LewX345k?d$7SS;>X02`zQ1_yaA;27pcoS{8KQa?2@dfFVp=DbyxP$Z +zy@ShpXm-Z>TlR?dt0i{L`d<&*&dZT?TKZ%|ZsxQQxEgWP_tr8b4IRflERA)mm&3ZA +zqw}F{Ls$bchIiGF()LDiRUGD;5|77bcQ;p!2twN}XQGY1@j!dS6xXL#YfY1tITuQ7 +zT?4)x-`W{_OS-hKMK@rylf^LPET?D**hk-8FA{YOZQJ*C$2##>vAjy(joiHwm*>m* +z^mewy#f3g$JhJN>vzJZ@4z@L3lCV1#cs^7{gOAia>glIaaGf-=M%rY981iUt!j5GNkddL?9_B$N^yh3D5?-046{KB7q=)0Yq)8 +z7hnz?fJl%cghdN!;E|xL5P%|3Be^CIZ5L9{tv0y}@`==V{HJadhB5C~zBA{V$Bz~K +E1>TCewg3PC + +literal 0 +HcmV?d00001 + +diff --git a/feeds/luci/libs/luci-lib-nixio/axTLS/ssl/test/axTLS.x509_1024.cer b/feeds/luci/libs/luci-lib-nixio/axTLS/ssl/test/axTLS.x509_1024.cer +new file mode 100644 +index 0000000000000000000000000000000000000000..fc92d056429c92b14fdc609505a5528a38ddd3da +GIT binary patch +literal 475 +zcmXqLV!Uq9#OT1p$?)-T`++N8!VeqpvT6)$}FigkQ3)MFatt!Lqii2 +zW1}c>USnfJ10!Q7*FeWm%s>QUDldwuhC&7cAaQ14PD3MeJp&*#G-#ZU>?%f92Ij_I +z27|^t7JSY6*W$;@+`i|$?C)O$;UTG +zreV3rM3+B8n;$-Z?C-Lx=WvPT3!e*Dd{h#*I85z1z_p#p(y(l}<|sS2Nm9q#MI#?}#GK1|G;Nj9n?r9a +zx*tqPn=Ep8#%g2J%eAqATyu5`M7USYn40q6C$>rQ=PUlWS*MNEQ%>babX_=L_GM?X +j$6)$}FigkQ3)MFatt!Lqii2 +zW1}c>USnfJ10!Q7*FeWm%s>QUDldwuhC&7cAaQ14PD3MeJp&*#1iDZO*;$ON49rc8 +z{0u;GE~X|%MutNR_TT<>zJSeT^Za|gwm0>UnA?6&&rWT6+_6ixVL4aXImM&>R`J}R!t +z+jA&U_kPRFCBl9a^}ihQSF@EY+r99L$0v8O9WpZ)@!zhFOWnlzWtp*8&m^W2_0?9l +zw)n8tFa2|oB|f!S?S*U#tJV9Eu!NU)c8mVMWhyc4la_L1xyOI0f}@sf*H3S3R=#}F +zSLVfo6y=MD+>iH`Cet +R9GogVhX2<0z0YoW4gkCo^O*nu + +literal 0 +HcmV?d00001 + +diff --git a/feeds/luci/libs/luci-lib-nixio/axTLS/ssl/test/axTLS.x509_2048.pem b/feeds/luci/libs/luci-lib-nixio/axTLS/ssl/test/axTLS.x509_2048.pem +new file mode 100644 +index 0000000..1ed0141 +--- /dev/null ++++ b/feeds/luci/libs/luci-lib-nixio/axTLS/ssl/test/axTLS.x509_2048.pem +@@ -0,0 +1,15 @@ ++-----BEGIN CERTIFICATE----- ++MIICWzCCAcQCCQDxw4fA1PRXxDANBgkqhkiG9w0BAQQFADA0MTIwMAYDVQQKEylh ++eFRMUyBQcm9qZWN0IERvZGd5IENlcnRpZmljYXRlIEF1dGhvcml0eTAeFw0wNjA2 ++MDcxMTQ0MzJaFw0zMzEwMjMxMTQ0MzJaMCwxFjAUBgNVBAoTDWF4VExTIFByb2pl ++Y3QxEjAQBgNVBAMTCTEyNy4wLjAuMTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCC ++AQoCggEBAMKgv9v6z3AGRLOf3o092S/ENz33Z2tlguOIuh2Apwp2ziHFvul7m9iF ++xsEcEARcvpkRPVo6ifJLjhJErenvvMAIS3WoO1lyenMaGoNddLeRRB0snRn7xRcl ++DYzCYS3fhJmkE06RL/TCTyY9GXa7odRI8kcWuByZog/be15lsgn0pjNKjJICdCer ++Otq0TAV/pfzRBF9lcyboHWQFOu9UVmDp3LsV/9o1GJbyKiNZd0j/GnDFOQbXy7GD ++I9PJTRzo4GQj0cJHY7JelORKiIsymcoMNRTboFRAx5y9jAGF8Ks196Rq/+9gYsvi ++eE0h+pbdLLbM0uZvAYqzIGK9hRR7Ja0CAwEAATANBgkqhkiG9w0BAQQFAAOBgQA8 ++L1Zz9K6M/PQCYWrfnTjbPKY2rTB1OvSV0Uwy5KKPQRS1+oK9dx4K0miX+1ZvI1bo ++f7/1aFXOsW3dpTwYUSjJvTMjSwNUPKiB/q/xwA1mzsbIZsbnhIITU95mOJ3xFhgc ++YFdJ4saL7pppTzfOxZ+h9jWbDwgJJAwx/q+O72uE5w== ++-----END CERTIFICATE----- +diff --git a/feeds/luci/libs/luci-lib-nixio/axTLS/ssl/test/axTLS.x509_4096.cer b/feeds/luci/libs/luci-lib-nixio/axTLS/ssl/test/axTLS.x509_4096.cer +new file mode 100644 +index 0000000000000000000000000000000000000000..40bbe94fdd8d5fc57dd7463e4e9530b9d661e7c6 +GIT binary patch +literal 863 +zcmXqLVvaUwVmiXa$?)-T`++N8!jBs8vT6)$}FigkQ3)MFatt!Lqii2 +zW1}c>USnfJ10!Q7*FeWm%s>QUDldwuhC&7cAaQ14PD3MeJp&*#1iDZO*;$ON49rbT +z{0u;GE~X|XMutD?TV}>;ow{Ja^XqY}Kx&Zef|Au{+XOz`xm&ZC_3Bzx*40-wFfQg@ +zm%j3gNv(kccj0BVI|(i7yZNjX1&Wq@zCAtZ{?bm~_lpMDeGtww(0oyI-?vNu6 +z^TXM09Ex^dDZ;tar^LMBOeK%H7W;SJ#A{)zrj;HmnoStPqxZLgEm3zNIDcdNGvx){gK$*>jXI`gWlo-;Cf +zm$Cl}S9azz?Puni3$k++BCg +c{uLH|{+cssT4etA3m$>ump}GawD^_-0G~{BVE_OC + +literal 0 +HcmV?d00001 + +diff --git a/feeds/luci/libs/luci-lib-nixio/axTLS/ssl/test/axTLS.x509_4096.pem b/feeds/luci/libs/luci-lib-nixio/axTLS/ssl/test/axTLS.x509_4096.pem +new file mode 100644 +index 0000000..b7aed1c +--- /dev/null ++++ b/feeds/luci/libs/luci-lib-nixio/axTLS/ssl/test/axTLS.x509_4096.pem +@@ -0,0 +1,20 @@ ++-----BEGIN CERTIFICATE----- ++MIIDWzCCAsQCCQDxw4fA1PRXxTANBgkqhkiG9w0BAQQFADA0MTIwMAYDVQQKEylh ++eFRMUyBQcm9qZWN0IERvZGd5IENlcnRpZmljYXRlIEF1dGhvcml0eTAeFw0wNjA2 ++MDcxMTQ0MzJaFw0zMzEwMjMxMTQ0MzJaMCwxFjAUBgNVBAoTDWF4VExTIFByb2pl ++Y3QxEjAQBgNVBAMTCTEyNy4wLjAuMTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCC ++AgoCggIBAPwntJldKsrQMAz6410QZVIdoHSrNrYQ8NzdfKMF1a0lBavUsAGjDa5n ++qfQ0fTBAC3HTJtxghCe7DjohEHKk89uXYt+liQ3vo6Nc+Zw9l2bDyLKffpOdVc/l ++tweL7FyQIM1fl2W5r/S9OffFRMJKXiN1HPXrfGYRrwz6B2cgUBtSgI+odwCmdfjb ++Ya4Wo8Za53UGeQ7v0eQ0lEDgXAhx3c2YIoXXxfe2J/5KdZnpXtRJWTJaoAbaQ4tU ++xECfVwbYwltHqRQJuUx0N4DMeQwnKgf3DWHWVqqWdALsAE5utfuOpuHxSoN2AGDz ++ov++GihbiEAcP5XPFv/0ldcfEi/4X9lyHb0mvUIa6DTdHd17thFEM12caD0TCszq ++in8JWVu6M0+oRQcDzIfMn4aD7oKtk76gY5HtbN4Jr8E4BHH/oGPe6l4mQl+W4f3o ++Zp2e7yG5WBVA9sjJbCmlxiWMHod1iiZUJ4e9cEFINjMWuooPIo6xKMzZcGHzwkBa ++zS6kHyTsHcfdHcu4aVMlJ9cKN/aesJgup/XseM3imzuJ3UqfvwCfneUKfM6DM8J3 ++mFfSwUBvK8uLsMw5Elim/1oIbBG0PTt7BiLiNd0pU/weuL92y2+QB2oCPM0t5D7L ++IYyoZHHNlvTCkQVNsCHgrDUtOdpGlKt6zzEgUTqwC5i5N3p/w6uPAgMBAAEwDQYJ ++KoZIhvcNAQEEBQADgYEAcrCtPXmZyPX01uNMh2X1VkgmUn/zLemierou7WD/h7xL ++dOl4eeKjFBqIiC19382m1DK4h1F8MceqaMgTueCJpLM7A2cwN3ta8/pGP2yEVhdp ++h10PkdRPF/AU8JmxnFaADsc6+6xWbbrdNv5xcvP1bJKWWW+30EhRF9PxjXiETXc= ++-----END CERTIFICATE----- +diff --git a/feeds/luci/libs/luci-lib-nixio/axTLS/ssl/test/axTLS.x509_512.cer b/feeds/luci/libs/luci-lib-nixio/axTLS/ssl/test/axTLS.x509_512.cer +new file mode 100644 +index 0000000000000000000000000000000000000000..48c6e13aa0af5678668c7d4a3245a3304030f01e +GIT binary patch +literal 406 +zcmXqLVw_~q_=ky;;p5@<16RI;A2Q%&R#QM#fOCfsUb=fe6G@UKCReg$x8h;>^OFhDPRk20&Zk9;ChBUA +P9b0QY{GW6AgzOst>~fQg + +literal 0 +HcmV?d00001 + +diff --git a/feeds/luci/libs/luci-lib-nixio/axTLS/ssl/test/axTLS.x509_512.pem b/feeds/luci/libs/luci-lib-nixio/axTLS/ssl/test/axTLS.x509_512.pem +new file mode 100644 +index 0000000..8191e48 +--- /dev/null ++++ b/feeds/luci/libs/luci-lib-nixio/axTLS/ssl/test/axTLS.x509_512.pem +@@ -0,0 +1,11 @@ ++-----BEGIN CERTIFICATE----- ++MIIBkjCB/AIJAPHDh8DU9FfCMA0GCSqGSIb3DQEBBQUAMDQxMjAwBgNVBAoTKWF4 ++VExTIFByb2plY3QgRG9kZ3kgQ2VydGlmaWNhdGUgQXV0aG9yaXR5MB4XDTA2MDYw ++NzExNDQzMloXDTMzMTAyMzExNDQzMlowLDEWMBQGA1UEChMNYXhUTFMgUHJvamVj ++dDESMBAGA1UEAxMJMTI3LjAuMC4xMFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBANE7 ++MF+pAUI9hm1yvkBuUcFJf1d1oS025cE9DyAa0SNt+nTSPiOwcPygat7sQYiE/lQV ++a2HFFmK4k0HxTz3/Lr0CAwEAATANBgkqhkiG9w0BAQUFAAOBgQAKRT6LwFr1xedJ ++b4qrvjB+EwV/0p4TNNXUS9S30rMSFvRar7VxvLP1lpYj9PR1JGSZMG/B6hR4yumF ++Rjwel9FPgNcWCW4DXAWqz3UQF7oZtJL6K+XJpQ0gwC+Nxc+RRGNLMlK7dLiqFh/V ++qZLej5Xy93M0JyZBiLV88P+c08gd7A== ++-----END CERTIFICATE----- +diff --git a/feeds/luci/libs/luci-lib-nixio/axTLS/ssl/test/axTLS.x509_aes128.pem b/feeds/luci/libs/luci-lib-nixio/axTLS/ssl/test/axTLS.x509_aes128.pem +new file mode 100644 +index 0000000..9a75fe9 +--- /dev/null ++++ b/feeds/luci/libs/luci-lib-nixio/axTLS/ssl/test/axTLS.x509_aes128.pem +@@ -0,0 +1,11 @@ ++-----BEGIN CERTIFICATE----- ++MIIBkjCB/AIJAPHDh8DU9FfHMA0GCSqGSIb3DQEBBQUAMDQxMjAwBgNVBAoTKWF4 ++VExTIFByb2plY3QgRG9kZ3kgQ2VydGlmaWNhdGUgQXV0aG9yaXR5MB4XDTA2MDYw ++NzExNDQzMloXDTMzMTAyMzExNDQzMlowLDEWMBQGA1UEChMNYXhUTFMgUHJvamVj ++dDESMBAGA1UEAxMJMTI3LjAuMC4xMFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAMDo ++g6K2iXFftW+Qk+rrzkMGWrtfY6YSxPstPRrI7akluUEoyWGITXbK6L3QfERrf2eu ++CnWyciQiHVRoHC0EgZUCAwEAATANBgkqhkiG9w0BAQUFAAOBgQBT6YhR8x/bBteK ++lr8E0l4mATOnYlsmge+z/SFYs4bDBofqlwQCVJXNSBA4ZsEjgP9qIWTu/85QrVGq ++LrkewSM6Oeh95LGnE+uhJVtIX++O+Hsex3H1UL067dCG99XmDhqbEU9AI6YSZu2p ++cjoSowFELtOoG667+id9QObfV3EQoQ== ++-----END CERTIFICATE----- +diff --git a/feeds/luci/libs/luci-lib-nixio/axTLS/ssl/test/axTLS.x509_aes256.pem b/feeds/luci/libs/luci-lib-nixio/axTLS/ssl/test/axTLS.x509_aes256.pem +new file mode 100644 +index 0000000..4f3074e +--- /dev/null ++++ b/feeds/luci/libs/luci-lib-nixio/axTLS/ssl/test/axTLS.x509_aes256.pem +@@ -0,0 +1,11 @@ ++-----BEGIN CERTIFICATE----- ++MIIBkjCB/AIJAPHDh8DU9FfIMA0GCSqGSIb3DQEBBQUAMDQxMjAwBgNVBAoTKWF4 ++VExTIFByb2plY3QgRG9kZ3kgQ2VydGlmaWNhdGUgQXV0aG9yaXR5MB4XDTA2MDYw ++NzExNDQzMloXDTMzMTAyMzExNDQzMlowLDEWMBQGA1UEChMNYXhUTFMgUHJvamVj ++dDESMBAGA1UEAxMJMTI3LjAuMC4xMFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBANAW ++9PdXa5u4gWi5VB5p/eQmOtteRq9/54JkiEs8cVNrTQgZsjjU1LGedE3JwBqZ1EIW ++HGPjcGg5dVxFjkn7RekCAwEAATANBgkqhkiG9w0BAQUFAAOBgQBmJMt0Crdd/BPn ++EdmzsVXou0zTizTC8wyUPMVpg/KzzP7fhZux/ZIrH9/RVcJd9y+B2/mXc3C+K99+ ++TXQoYKsLGArfDPzmpy1wPrdEcB1A9gkWDl1Uq6xRyvrVm3gX8NTITRuGKL9njgWx ++2SrApIBtOOUOinYtfH3745cVVl5HOA== ++-----END CERTIFICATE----- +diff --git a/feeds/luci/libs/luci-lib-nixio/axTLS/ssl/test/axTLS.x509_bad_after.pem b/feeds/luci/libs/luci-lib-nixio/axTLS/ssl/test/axTLS.x509_bad_after.pem +new file mode 100644 +index 0000000..79eb9cc +--- /dev/null ++++ b/feeds/luci/libs/luci-lib-nixio/axTLS/ssl/test/axTLS.x509_bad_after.pem +@@ -0,0 +1,11 @@ ++-----BEGIN CERTIFICATE----- ++MIIBkjCB/AIJAPHDh8DU9FfKMA0GCSqGSIb3DQEBBQUAMDQxMjAwBgNVBAoTKWF4 ++VExTIFByb2plY3QgRG9kZ3kgQ2VydGlmaWNhdGUgQXV0aG9yaXR5MB4XDTA2MDYw ++NzExNDQzMloXDTA1MDYwNzExNDQzMlowLDEWMBQGA1UEChMNYXhUTFMgUHJvamVj ++dDESMBAGA1UEAxMJMTI3LjAuMC4xMFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBANE7 ++MF+pAUI9hm1yvkBuUcFJf1d1oS025cE9DyAa0SNt+nTSPiOwcPygat7sQYiE/lQV ++a2HFFmK4k0HxTz3/Lr0CAwEAATANBgkqhkiG9w0BAQUFAAOBgQCmPSs9EceViMZD ++ZTXDZpQWJFcXaeInrXWgYWyVgnHBY/eSuqNCxkV/ehv/Wc5pWBGnrX+4cSvQ+TpQ ++FdZegeOjvgipjtJb/0TJCcvgcdHTntEM0h7VXjfbsJXAHwJPFzWIKxV4jeFXnaaw ++W+YHrj9GQ8PnFmapPuh4h/y6LyHAcg== ++-----END CERTIFICATE----- +diff --git a/feeds/luci/libs/luci-lib-nixio/axTLS/ssl/test/axTLS.x509_bad_before.pem b/feeds/luci/libs/luci-lib-nixio/axTLS/ssl/test/axTLS.x509_bad_before.pem +new file mode 100644 +index 0000000..fe72b54 +--- /dev/null ++++ b/feeds/luci/libs/luci-lib-nixio/axTLS/ssl/test/axTLS.x509_bad_before.pem +@@ -0,0 +1,11 @@ ++-----BEGIN CERTIFICATE----- ++MIIBkjCB/AIJAPHDh8DU9FfJMA0GCSqGSIb3DQEBBQUAMDQxMjAwBgNVBAoTKWF4 ++VExTIFByb2plY3QgRG9kZ3kgQ2VydGlmaWNhdGUgQXV0aG9yaXR5MB4XDTI0MTIz ++MTE0MDAwMFoXDTI1MTIzMTE0MDAwMFowLDEWMBQGA1UEChMNYXhUTFMgUHJvamVj ++dDESMBAGA1UEAxMJMTI3LjAuMC4xMFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBANE7 ++MF+pAUI9hm1yvkBuUcFJf1d1oS025cE9DyAa0SNt+nTSPiOwcPygat7sQYiE/lQV ++a2HFFmK4k0HxTz3/Lr0CAwEAATANBgkqhkiG9w0BAQUFAAOBgQApbldYefE8A0ez ++SYvAuCtYxx/2KHwBRD/cR0q7widl9WGjVC/dsnbFo109vHEr3FP1HVYSI0aweiaK ++XZmpUyJ9DprbbWQqaLuDnqIH8X7kfiMuO7/LGQc812iDJI2Akxp9cIlPBFBD8GVx +++0EphzSodDDlLD8bPqLaWTE+8Ydtjw== ++-----END CERTIFICATE----- +diff --git a/feeds/luci/libs/luci-lib-nixio/axTLS/ssl/test/axTLS.x509_device.cer b/feeds/luci/libs/luci-lib-nixio/axTLS/ssl/test/axTLS.x509_device.cer +new file mode 100644 +index 0000000000000000000000000000000000000000..c966743c9ca724ecb81928d0f6ad7e62b29eab92 +GIT binary patch +literal 401 +zcmXqLV(c|&Vl-#sWcYZv{lJwk;l~Vk**LY@JlekVGBUEVG8pI>iW!KoF^95n3G*ga +zg!lw21Qg|Gr6!jc3KRT4UNq841mzkKu(<3zzhh@4Gm39jE$nid5w(?4UCMT +zTmx-GO#^j^X$mN&DY>WhSR8IHwksWTs^%CzhldG|oqM3?nN8b7L=qL1QOVVA +zB|csu?fqp62d3^8%Qa9mSYy#4{w;o%qQvxI>(vh>*4W)IqNC%Ho9fI +z%iCXCtE2tbBwl5l92 ++#include ++#include "ssl.h" ++ ++int main(int argc, char *argv[]) ++{ ++ bigint *m1, *m2, *d; ++ BI_CTX *ctx = bi_initialize(); ++ char cmp1[1024], cmp2[1024]; ++ ++ const char *plaintext = /* 128 byte number */ ++ "01aaaaaaaaaabbbbbbbbbbbbbbbccccccccccccccdddddddddddddeeeeeeeeee" ++ "01aaaaaaaaaabbbbbbbbbbbbbbbccccccccccccccdddddddddddddeeeeeeeeee"; ++ d = bi_import(ctx, (uint8_t *)plaintext, strlen(plaintext)); ++ memset(cmp1, 0, sizeof(cmp1)); ++ ++ while (1) ++ { ++ bi_set_mod(ctx, bi_clone(ctx, d), 0); ++ m1 = bi_square(ctx, bi_copy(d)); ++ m2 = bi_residue(ctx, m1); ++ bi_free_mod(ctx, 0); ++ ++ //bi_export(ctx, bi_copy(d), cmp1, sizeof(cmp1)); ++ bi_export(ctx, m2, cmp2, sizeof(cmp2)); ++ ++ if (memcmp(cmp1, cmp2, sizeof(cmp1)) != 0) ++ { ++ printf("Error!\n"); TTY_FLUSH(); ++ break; ++ } ++ ++ d = bi_add(ctx, d, int_to_bi(ctx, 1)); ++ } ++ ++ bi_free(ctx, d); ++ bi_terminate(ctx); ++ printf("all good\n"); TTY_FLUSH(); ++ return 0; ++ ++} ++ +diff --git a/feeds/luci/libs/luci-lib-nixio/axTLS/ssl/test/datatest.c.old b/feeds/luci/libs/luci-lib-nixio/axTLS/ssl/test/datatest.c.old +new file mode 100644 +index 0000000..a5703fb +--- /dev/null ++++ b/feeds/luci/libs/luci-lib-nixio/axTLS/ssl/test/datatest.c.old +@@ -0,0 +1,280 @@ ++#include "crypto.h" ++ ++#include ++#include ++//#define DEBUG_TEST ++ ++typedef enum { ++ encrypt, decrypt ++} CryptoMode; ++ ++void hex_dump(const char* header, const unsigned char* data, const unsigned int data_length) ++{ ++ unsigned int byte_count; ++ printf("%s (%d bytes):\n", header, data_length); ++ for(byte_count = 0; byte_count < data_length; ++byte_count) ++ { ++ printf("%02X", data[byte_count]); ++ } ++ printf("\n"); ++} ++ ++void do_rsa(const CryptoMode crypto_mode, ++ const unsigned char* data, const unsigned int data_length, ++ const unsigned char* modulus, const unsigned int modulus_length, ++ const unsigned char* exponent, const unsigned int exponent_length, ++ unsigned char* result, const unsigned int result_length) ++{ ++ RSA_CTX* rsa_context = NULL; ++ BI_CTX *bi_ctx; ++ bigint *plaintext_bi; ++ bigint *enc_data_bi, *dec_data_bi; ++ ++#ifdef DEBUG_TEST ++ printf("do_rsa:\n"); ++ hex_dump("data", data, data_length); ++ hex_dump("modulus", modulus, modulus_length); ++ hex_dump("exponent", exponent, exponent_length); ++#endif ++ ++ RSA_priv_key_new(&rsa_context, modulus, modulus_length, exponent, exponent_length, exponent, exponent_length); ++ memset(result, 0, result_length); ++ bi_ctx = rsa_context->bi_ctx; ++ ++ switch(crypto_mode) ++ { ++ case encrypt: ++#ifdef DEBUG_TEST ++ printf("encrypt\n"); ++#endif ++ plaintext_bi = bi_import(bi_ctx, data, data_length); ++ enc_data_bi = RSA_public(rsa_context, plaintext_bi); ++ bi_export(bi_ctx, enc_data_bi, result, result_length); ++ break; ++ ++ case decrypt: ++ ++#ifdef DEBUG_TEST ++ printf("decrypt\n"); ++#endif ++ plaintext_bi = bi_import(bi_ctx, data, data_length); ++ dec_data_bi = RSA_private(rsa_context, plaintext_bi); ++ bi_export(bi_ctx, dec_data_bi, result, result_length); ++ break; ++ } ++#ifdef DEBUG_TEST ++ hex_dump("result", result, result_length); ++#endif ++ ++ RSA_free(rsa_context); ++} ++ ++void test_matching(char* test_description, ++ const unsigned char* expected, const unsigned int expected_length, ++ const unsigned char* result, const unsigned int result_length) ++{ ++ int test_result = memcmp(expected, result, expected_length); ++ printf("Testing %s ... ", test_description); ++ if(test_result == 0) ++ { ++ printf("ok.\n"); ++ } ++ else ++ { ++ printf("failed!\n"); ++ hex_dump("should be", expected, expected_length); ++ hex_dump("but is", result, result_length); ++ } ++} ++ ++void encrypt_decrypt_should_yield_original(char* test_description, ++ const unsigned char* data, const unsigned int data_length, ++ const unsigned char* modulus, const unsigned int modulus_length, ++ const unsigned char* private_exponent, const unsigned int private_exponent_length, ++ const unsigned char* public_exponent, const unsigned int public_exponent_length, ++ const unsigned char* cryptogram, const unsigned int cryptogram_length) ++{ ++ const unsigned int calculated_cryptogram_length = modulus_length; ++ unsigned char* calculated_cryptogram = malloc(calculated_cryptogram_length); ++ const unsigned int decrypted_data_length = modulus_length; ++ unsigned char* decrypted_data = malloc(decrypted_data_length); ++ ++ printf("\nRunning \"%s\" ...\n", test_description); ++ ++#ifdef DEBUG_TEST ++ printf("encrypt_decrypt_should_yield_original:\n"); ++ hex_dump("data", data, data_length); ++ hex_dump("modulus", modulus, modulus_length); ++ hex_dump("private_exponent", private_exponent, private_exponent_length); ++ hex_dump("public_exponent", public_exponent, public_exponent_length); ++ hex_dump("cryptogram", cryptogram, cryptogram_length); ++#endif ++ ++ do_rsa(encrypt, data, data_length, ++ modulus, modulus_length, ++ private_exponent, private_exponent_length, ++ calculated_cryptogram, calculated_cryptogram_length); ++ ++#ifdef DEBUG_TEST ++ hex_dump("calculated_cryptogram", calculated_cryptogram, calculated_cryptogram_length); ++#endif ++ ++ if(cryptogram != NULL) ++ { ++ test_matching("cryptogram", cryptogram, cryptogram_length, ++ calculated_cryptogram, calculated_cryptogram_length); ++ } ++ ++ do_rsa(decrypt, calculated_cryptogram, calculated_cryptogram_length, ++ modulus, modulus_length, ++ public_exponent, public_exponent_length, ++ decrypted_data, decrypted_data_length); ++ ++ test_matching("decrypted plaintext", data, data_length, ++ decrypted_data, decrypted_data_length); ++ ++ free(calculated_cryptogram); ++ free(decrypted_data); ++} ++ ++/* configure without CRT! ++ ++ prepare data with: ++ > echo "" | ++ ruby -ne '$_.gsub!(/ /, "").scan(/../).each_with_index \ ++ { |b, i| print "\"\n\"" if i % 16 == 0; print "\\x" + b;}' */ ++int main(int argc, char *argv[]) ++{ ++#if 0 ++ unsigned char stuff[] = { ++ 0x22, 0x33, 0x44, 0x81, ++ 0xF1, 0xFF, 0xAA, 0xBB, ++ 0xCC, 0xDD, 0xEE , 0x01, ++ 0x45, 0x44, 0xfa, 0x8d, ++ 0xfa, 0x20, 0x99, 0xFF, ++ 0xab, 0xda, 0xac, 0x40 }; ++ unsigned char resA[sizeof(stuff)*2], resB[sizeof(stuff)*2]; ++ ++ BI_CTX *bi_ctx = bi_initialize(); ++ bigint *bi_data1, *bi_data2, *res1, *res2; ++ bi_data1 = bi_import(bi_ctx, stuff, sizeof(stuff)); ++ bi_data2 = bi_import(bi_ctx, stuff, sizeof(stuff)); ++ ++ res1 = bi_multiply(bi_ctx, bi_copy(bi_data1), bi_copy(bi_data2)); ++ res2 = bi_multiply(bi_ctx, bi_data1, bi_data2); ++ bi_print("MULTIPLY", res1); ++ bi_print("SQUARE", res2); ++ bi_export(bi_ctx, res1, resA, sizeof(resA)); ++ bi_export(bi_ctx, res2, resB, sizeof(resB)); ++ if (memcmp(resA, resB, sizeof(resA))) ++ printf("OUCH - difference!\n"); ++ bi_terminate(bi_ctx); ++ ++ exit(0); ++#endif ++ encrypt_decrypt_should_yield_original("Works only with Montgomery", ++ (const unsigned char*) /* data */ ++ "\xBC\xD3\x12\x6C\x93\x13\x14\x4C\x00\x5D\xFD\xBF\xDE\xE4\xD3\x60" ++ "\x29\xB8\xAE\x47\xBE\x0B\xB6\x0A\x39\x88\xB7\x93\x19\x14\xE8\x88" ++ "\x4A\xDE\x00\x46\x89\x5A\x11\x1A\xC4\x8F\xE8\xF7\x27\xAC\x59\x80" ++ "\x03\xC1\x93\x14\x01\x00\x93\x15\x07\x00\x00\x00\x01\x01\x05\x20" ++ "\x93\x16\x0F\x42\x34\x33\x3A\x58\x30\x30\x30\x31\x30\x31\x30\x30" ++ "\x30\x31\x92\x6B\x10\x6C\x69\x62\x65\x6C\x6D\x65\x74\x72\x65\x65" ++ "\x2E\x73\x6F\x2E\x30\x93\x18\x02\xA5\x92\x92\x6C\x03\x96\xE3\x0C" ++ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xB7\xBE", 128, ++ (const unsigned char*) /* modulus */ ++ "\xc4\x5a\xcb\x35\x95\xad\x32\x4a\xcf\x9c\x82\x45\x13\xb7\x42\x35" ++ "\x22\x32\x6d\x2e\x6d\x26\x2e\x6d\x00\x9b\xae\x2d\x9e\x78\x1e\xdd" ++ "\x40\x23\x17\xa8\xbb\xa1\x07\x86\xb4\x3c\xbc\xe8\xd5\xfc\xd9\xeb" ++ "\x3c\xad\x63\x11\xf3\x1d\x64\x81\x96\xf2\xf5\xfe\xca\x5a\xf7\x8a" ++ "\x15\xcb\x90\x81\x68\xae\x59\xb4\xe1\xa4\x41\x99\xcd\xf3\x98\xbd" ++ "\x3c\x48\x37\xdb\xa1\xc3\x1c\x6f\x43\xd1\x89\x23\xe5\x3d\xa3\xa5" ++ "\x92\x7b\x19\x14\x1e\x7a\xf3\x88\x8a\x36\x21\x3e\x16\x40\x3c\xd7" ++ "\xd3\xdb\x13\xaf\xc9\x68\x45\x84\xb3\x39\x8f\x02\xed\x28\x02\x5f", 128, ++ (const unsigned char*) /* private exponent */ ++ "\x5d\x19\xb7\xb4\x66\x8d\xc2\x84\xda\x3f\x99\x3c\xeb\x86\x3e\xec" ++ "\x36\x94\xb6\x54\x07\x08\xcd\x86\x7d\x7d\x53\x6e\xe9\xee\x86\xa3" ++ "\xdd\x5f\x46\x3e\x89\x08\x67\x2b\x25\x96\x8e\xf3\xcf\x52\x9e\x78" ++ "\xfd\x42\x30\xf1\x37\xd6\xbd\xea\xfc\x09\xa3\x3d\xf5\xf0\x7f\xe1" ++ "\xb1\xe0\x69\x13\x44\xf9\x8b\x95\x58\x2a\x81\xb3\xa8\x15\xce\x7e" ++ "\xd3\xea\x97\x0a\xa2\x14\xd4\xae\xc7\x75\xbb\x9f\x68\xa5\x53\x0e" ++ "\x85\x29\x88\x48\x6c\xc9\xcc\xde\x72\x40\x3a\x4c\x82\xde\x3c\xfb" ++ "\x08\xf8\x2c\x26\xb5\xd4\xea\xc4\xca\x98\x6e\x43\x3e\x67\x54\xc1", 128, ++ (const unsigned char*) /* public exponent */ ++ "\x01\x00\x01", 3, ++ (const unsigned char*) /* precalculated encrypted data */ ++ "\x93\xE8\x1F\xF9\x70\xFA\xAA\xED\x54\xFD\x48\x37\xC9\x71\x9A\x11" ++ "\x69\x80\xB4\x22\x0C\xAD\x5A\x95\x65\xCA\x7C\xF7\x70\x56\x92\xCB" ++ "\x45\x6D\x58\x84\x21\x80\x23\x76\x21\x4A\x61\x99\xC1\x11\x9C\x0F" ++ "\x40\xED\x80\x9C\x8F\x3A\x4F\x01\xB5\x72\xC3\x24\xAE\xF3\x6B\x98" ++ "\xA8\x60\xAC\xAF\x95\x98\x9A\xAA\xA4\x28\xF2\x02\x05\xFC\xF3\xDD" ++ "\xB0\x5A\x4E\xDE\x3C\x41\x4B\x1C\x5B\x1F\xF6\x3D\xAF\x93\x43\xCB" ++ "\xD8\xC7\x24\x97\x8F\x49\xE5\x5B\x10\x51\x3B\x1E\xA6\x39\xEA\x4E" ++ "\xA5\xE0\x71\x8C\xCA\x34\x8C\x2F\x6C\x5C\x78\x34\x86\x7C\x54\x6A", 128); ++ ++ encrypt_decrypt_should_yield_original("Works only with Barrett", ++ (const unsigned char*) /* data */ ++ "\x36\x42\x32\xe4\x1e\x78\x02\x8e\xfb\x64\x5f\x0c\xfc\x5a\xd7\x5c" ++ "\xe4\xb5\x91\x5c\x4b\x00\x87\x28\x87\x9b\xa0\x4b\x09\xc2\x6b\x64" ++ "\xac\x4b\xcf\xa5\xee\x8a\xb7\xc9\xc9\x90\x02\xc1\xa3\x47\x5c\x6b" ++ "\x71\x5d\x5d\x49\x27\xe1\x15\xc6\xcf\x37\x9e\xa7\x0f\xa1\xad\x96" ++ "\x83\xef\x4b\x53\x68\xcd\x77\xfc\x14\x5f\xf5\xb7\x78\xb0\x10\xeb" ++ "\x0d\x61\x94\x01\xf6\xaa\x1b\x19\x23\x39\xa7\xcc\x6c\x42\x4a\x87" ++ "\x79\x27\x04\xc6\xec\x8e\x50\xba\xb9\x26\x89\xd4\x00\x01\x25\xe5" ++ "\xf3\x9e\x98\x0c\x8d\x2e\x43\x1e\xe9\x29\x90\xd2\x75\x61\x85\xe7", 128, ++ (const unsigned char*) /* modulus */ ++ "\x37\x0c\x32\xe4\x1e\x78\x02\x8e\xfb\x64\x5f\x0c\xfc\x5a\xd7\x5c" ++ "\xe4\xb5\x91\x5c\x4b\x00\x87\x28\x87\x9b\xa0\x4b\x09\xc2\x6b\x64" ++ "\xac\x4b\xcf\xa5\xee\x8a\xb7\xc9\xc9\x90\x02\xc1\xa3\x47\x5c\x6b" ++ "\x71\x5d\x5d\x49\x27\xe1\x15\xc6\xcf\x37\x9e\xa7\x0f\xa1\xad\x96" ++ "\x83\xef\x4b\x53\x68\xcd\x77\xfc\x14\x5f\xf5\xb7\x78\xb0\x10\xeb" ++ "\x0d\x61\x94\x01\xf6\xaa\x1b\x19\x23\x39\xa7\xcc\x6c\x42\x4a\x87" ++ "\x79\x27\x04\xc6\xec\x8e\x50\xba\xb9\x26\x89\xd4\x00\x01\x25\xe5" ++ "\xf3\x9e\x98\x0c\x8d\x2e\x43\x1e\xe9\x29\x90\xd2\x75\x61\x85\xe7", 128, ++ (const unsigned char*) /* private exponent */ ++ "\x16\x3a\x76\xd2\x66\xfb\x4f\x0d\x2d\xb6\x7a\x2b\x64\x3b\xca\x7b" ++ "\x58\x5f\x79\x33\x2b\x96\x2a\xfd\xd2\xc4\xa5\x15\xa7\xfb\x3a\x22" ++ "\x8c\xf0\x90\x09\x11\x2a\x32\xcc\xe8\xf7\x9e\x25\x53\x29\x9d\xc8" ++ "\x45\x1e\xce\x6c\x9c\x0d\xe8\x1d\x3f\xcf\xd5\xe0\xe0\x0f\x09\x69" ++ "\x2d\xe7\xd5\xe6\xe5\x10\xd9\x4e\x20\xdb\xbd\xa1\x04\x6b\xe6\x1d" ++ "\x4c\x79\x28\x47\x30\x11\xde\x14\xb4\x6e\x35\x98\x38\x50\x44\x82" ++ "\xbd\xc4\xfb\x03\xb3\xf6\x5e\x5a\x29\xfa\x29\xaa\xde\xe4\xfd\x15" ++ "\xbe\xed\x4f\x93\x9d\x0d\x29\xe8\xd7\xa3\xf4\x18\xc8\x98\xb1\x01", 128, ++ (const unsigned char*) /* public exponent */ ++ "\x01\x00\x01", 3, ++ NULL, 0); ++ ++ encrypt_decrypt_should_yield_original("Works always", ++ (const unsigned char*) /* data */ ++ "\xB9\x42\x32\xe4\x1e\x78\x02\x8e\xfb\x64\x5f\x0c\xfc\x5a\xd7\x5c" ++ "\xe4\xb5\x91\x5c\x4b\x00\x87\x28\x87\x9b\xa0\x4b\x09\xc2\x6b\x64" ++ "\xac\x4b\xcf\xa5\xee\x8a\xb7\xc9\xc9\x90\x02\xc1\xa3\x47\x5c\x6b" ++ "\x71\x5d\x5d\x49\x27\xe1\x15\xc6\xcf\x37\x9e\xa7\x0f\xa1\xad\x96" ++ "\x83\xef\x4b\x53\x68\xcd\x77\xfc\x14\x5f\xf5\xb7\x78\xb0\x10\xeb" ++ "\x0d\x61\x94\x01\xf6\xaa\x1b\x19\x23\x39\xa7\xcc\x6c\x42\x4a\x87" ++ "\x79\x27\x04\xc6\xec\x8e\x50\xba\xb9\x26\x89\xd4\x00\x01\x25\xe5" ++ "\xf3\x9e\x98\x0c\x8d\x2e\x43\x1e\xe9\x29\x90\xd2\x75\x61\x85\xe7", 128, ++ (const unsigned char*) /* modulus */ ++ "\xB9\x77\xEC\x83\x95\xAF\xB1\xF8\x21\x21\xFF\x05\x5E\x0C\x91\x0C" ++ "\x2E\xD5\xD2\x94\x1C\x38\x5E\xED\x5A\xCF\x84\xD0\x12\x8B\xAA\x4B" ++ "\x3A\x63\x65\x78\x13\xED\x24\x4E\x83\xF2\xF5\x02\x66\x5D\xFC\xC1" ++ "\x80\x5B\x78\x78\xB4\x0B\x45\xE5\x22\xC6\xCD\xEB\xCC\x74\x0B\x0B" ++ "\xD8\x8B\x91\x99\x48\x8E\x74\xA9\xD0\x1A\x39\x94\xC2\xD4\x2E\x9A" ++ "\x8C\x0C\x35\x0D\x97\x8F\xC4\x62\x20\xE9\x78\x40\x97\x05\x98\xE6" ++ "\x22\x48\x3D\x3D\xCA\x6A\x3F\xEF\xB0\x23\x14\x30\xDA\x35\x46\x65" ++ "\x55\xEF\xEB\xA1\xA9\xCF\x83\xE7\xEF\xF2\x83\x6D\x38\xEA\x88\xED", 128, ++ (const unsigned char*) /* private exponent */ ++ "\x52\x2A\x68\xE3\x9A\xAA\xED\xA3\x49\xBA\x6F\xEA\x86\xD1\xF6\x68" ++ "\x79\x4F\x4D\x2D\x44\x9B\x4C\xA2\xC6\xBA\x6C\xD2\x69\x84\xEA\x7A" ++ "\xCD\x71\x3F\x80\xC5\x03\x28\x34\x88\x8C\x58\x33\x29\xFA\xB5\x81" ++ "\x5C\x46\x29\xC6\xFF\xAC\x86\xD8\x8E\x61\x98\xD4\xC0\x0D\x20\xDE" ++ "\xEB\x61\x1C\x0C\x3C\x19\xA3\x75\x10\x7D\xDA\xA9\x55\xA7\x64\x5F" ++ "\xE0\xB6\x35\x62\x00\xD9\xD2\xF7\xA4\xDF\x85\xFF\xDF\x86\x75\x29" ++ "\x66\x16\x03\x8C\xC0\xB0\x3F\xAB\xBA\x41\xB3\x3C\x76\x58\xB6\xE2" ++ "\x1F\x36\x47\x5F\x1F\x0E\x4C\xB5\x29\x90\xDC\xA1\xF8\xFA\x58\x19", 128, ++ (const unsigned char*) /* public exponent */ ++ "\x01\x00\x01", 3, ++ NULL, 0); ++ ++ return 0; ++} +diff --git a/feeds/luci/libs/luci-lib-nixio/axTLS/ssl/test/deutsche_telecom.x509_ca b/feeds/luci/libs/luci-lib-nixio/axTLS/ssl/test/deutsche_telecom.x509_ca +new file mode 100644 +index 0000000000000000000000000000000000000000..0f4b96a0d5b66ac34b258e34a8943630d55feacc +GIT binary patch +literal 670 +zcmXqLVwz>p#KgRSnTe5!iBZLXmyJ`a&7xk*W}qnv{YLwX`%aH?TA`G&V6Xh!W>D1apmyO)Y`kfpAje +zeB^LpWMyD(>}4=$>||7N?y$<5%!OzF +zERzTg``9Ao-X*XBQfdA{s)V1MQHyO +zWy#)aHLqswC)*oOrXGIdcj#m4Y98-5?oH8;9tM=&_?EauBId2}0<I-~KIoDw&uW +z85kEk890CgUzU$Wj73Dm@KODoQ$kaJe=JbA?W-YN=#+TOfFBt2vcfDJ25gLs|CtzB +z4fsF;{6G#13o!QCki7_udS;;C=E@5EntVbwMZq<0PCjey;-LEFE80^xr_VBLt0)o^ +z{eRuHSc9>xWA4OP_pWJj^Vlt(S>nKR=8eFEls^UAc3BFke~M!W*vfs)>;B68FPk|v +z8vb08JMyN$t<~qA>juWD7Hh=jyLr9SJ-zpI>PD-l%e+~<`HcU|RG(;Raeo+<;^qYa +DuXy4z + +literal 0 +HcmV?d00001 + +diff --git a/feeds/luci/libs/luci-lib-nixio/axTLS/ssl/test/equifax.x509_ca b/feeds/luci/libs/luci-lib-nixio/axTLS/ssl/test/equifax.x509_ca +new file mode 100644 +index 0000000000000000000000000000000000000000..79b0a3f98764a07fdf6cae1a80eebf704d1f8796 +GIT binary patch +literal 646 +zcmXqLVrnvIVtl=TnTe5!iIK&CmyJ`a&7A-4f18*?ZNn=n&ou%V2B +z6o|tmEbLlXnwgeZp%9#!Tw0W>;F*`KXQ*bN0+MAGmPM0Ibt)~+%u6jUR&aLIH8hYD +z=e4vnFf%eVFfjmvC~;mR10*hOENz^R>^DYM2Ij_I27|^_GV!Yaq78vdHv|ahSG);D}~qW +z>v(UKw>nj0}v6(+pA!1lc$f+B_KBemDWcpM{x;f!%-~7^bqq +zjEw(TSPhtglz}`*K$%6tK&(N;tHLNq@OGq_S={}DB4!R*?lnFO4P-$I_*lePuuG#x +zF*DHrrO_*9GYdX@8Rm2L=SrUgyt6)^NzHtwT6QLK`?Zk6vS(+mk-WR5_38uLKS>J9 +zTf8GuKR)_7Rnh+ImAVKy_x2FGh=p6X{?K|~_^nW3?Pk)dG}kZXa&H83}nHjo5q@oeRF+y~C}AK5 +zF_#}?pk8`jX-Q78UVc%!LE{``H!w0c_AnSUb}%(IT;CP5elgDny_M==tAhJhysmF7 +z^~s*G&+FB8xgXw#vyR;2W!Uk`M_ArWZ1TOL_s5pRZOYqrimM~Ebi%Z^%fk2YSeNlm +zm)raDP5tGSZ+^F?EXZEqajv|sc#fg)f7=u5mL}xg+}0B{D}UR*`B{6He^_9w{&lI0t~bUk(V|yzt>L6d&agTOlQ%<1HtMiK21dqF;?crMuy~AZ)cCC +zcar#4F@K*Wyr$(`=edOf)X_qG#W2@k=EugP0m@R{;Q^*WZi) + +literal 0 +HcmV?d00001 + +diff --git a/feeds/luci/libs/luci-lib-nixio/axTLS/ssl/test/header_issue.dat b/feeds/luci/libs/luci-lib-nixio/axTLS/ssl/test/header_issue.dat +new file mode 100755 +index 0000000000000000000000000000000000000000..a48d23d2b937820a533bc1394d6c155fd28c1959 +GIT binary patch +literal 1159 +zcmWe*W@Kq%Vqj2XW^_B{aBjXp>E)wm*3`MA7YKbx?VUNb&ow+D@R^CtrU!`(45kd+ +z3@iZ*EWQj(j0R1Ne}Q;86SDvVivceir&gOs+jm|@Mpjk^gU02C@&>YO%%Ln?!eYS% +znMJ92B?`{@xw)lznaPPInfZCehI|G*AO+mQtO1U?;Q@xK2Fh?lI2pynic1R$@{39w +ziXqyQ^K_r&^DUdsvg@wz@%k`ix +z(#=UO2Kme&200WNSs9qU84Ns_92wpo`5|5!qql9!X6NU%!l&1>n0uS&D5^(1N_N=q +zT3#1Xo$~t3DZM?rcUCRjoTpWPC&fDJUdopHOj#EUEFSSFWs-_7#%qy;W$R;IY>2#oGL(LO(Mop($Bszg1H5j-<7 +zYyB}vW~D>tw?BFLXek4en?Vzk6EF?DVd7-C`OWT+eQSgcnmt1@C72qS8d)Mz0)#t+ +ze1a<>?d5STc=(BH&V_n5t}ZuuwkKi#Kd5eDJK@OGejq5*ct+H>r89oKDBiP7sKoTQ +zuBR~j#nTEypxQCB{fdK$z?p#a& + +literal 0 +HcmV?d00001 + +diff --git a/feeds/luci/libs/luci-lib-nixio/axTLS/ssl/test/killopenssl.sh b/feeds/luci/libs/luci-lib-nixio/axTLS/ssl/test/killopenssl.sh +new file mode 100755 +index 0000000..17950fb +--- /dev/null ++++ b/feeds/luci/libs/luci-lib-nixio/axTLS/ssl/test/killopenssl.sh +@@ -0,0 +1,2 @@ ++#!/bin/sh ++ps -ef|grep openssl | /usr/bin/awk '{print $2}' |xargs kill -9 +diff --git a/feeds/luci/libs/luci-lib-nixio/axTLS/ssl/test/make_certs.sh b/feeds/luci/libs/luci-lib-nixio/axTLS/ssl/test/make_certs.sh +new file mode 100755 +index 0000000..dfc39d4 +--- /dev/null ++++ b/feeds/luci/libs/luci-lib-nixio/axTLS/ssl/test/make_certs.sh +@@ -0,0 +1,174 @@ ++#!/bin/sh ++ ++# ++# Copyright (c) 2007, Cameron Rich ++# ++# All rights reserved. ++# ++# Redistribution and use in source and binary forms, with or without ++# modification, are permitted provided that the following conditions are met: ++# ++# * Redistributions of source code must retain the above copyright notice, ++# this list of conditions and the following disclaimer. ++# * 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. ++# * Neither the name of the axTLS project nor the names of its ++# contributors may be used to endorse or promote products derived ++# from this software without specific prior written permission. ++# ++# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ++# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT ++# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR ++# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR ++# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, ++# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED ++# TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, ++# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY ++# OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING ++# NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF ++# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ++# ++ ++# ++# Generate the certificates and keys for testing. ++# ++ ++PROJECT_NAME="axTLS Project" ++ ++# Generate the openssl configuration files. ++cat > ca_cert.conf << EOF ++[ req ] ++distinguished_name = req_distinguished_name ++prompt = no ++ ++[ req_distinguished_name ] ++ O = $PROJECT_NAME Dodgy Certificate Authority ++EOF ++ ++cat > certs.conf << EOF ++[ req ] ++distinguished_name = req_distinguished_name ++prompt = no ++ ++[ req_distinguished_name ] ++ O = $PROJECT_NAME ++ CN = 127.0.0.1 ++EOF ++ ++cat > device_cert.conf << EOF ++[ req ] ++distinguished_name = req_distinguished_name ++prompt = no ++ ++[ req_distinguished_name ] ++ O = $PROJECT_NAME Device Certificate ++EOF ++ ++# private key generation ++openssl genrsa -out axTLS.ca_key.pem 1024 ++openssl genrsa -out axTLS.key_512.pem 512 ++openssl genrsa -out axTLS.key_1024.pem 1024 ++openssl genrsa -out axTLS.key_2048.pem 2048 ++openssl genrsa -out axTLS.key_4096.pem 4096 ++openssl genrsa -out axTLS.device_key.pem 1024 ++openssl genrsa -aes128 -passout pass:abcd -out axTLS.key_aes128.pem 512 ++openssl genrsa -aes256 -passout pass:abcd -out axTLS.key_aes256.pem 512 ++ ++# convert private keys into DER format ++openssl rsa -in axTLS.key_512.pem -out axTLS.key_512 -outform DER ++openssl rsa -in axTLS.key_1024.pem -out axTLS.key_1024 -outform DER ++openssl rsa -in axTLS.key_2048.pem -out axTLS.key_2048 -outform DER ++openssl rsa -in axTLS.key_4096.pem -out axTLS.key_4096 -outform DER ++openssl rsa -in axTLS.device_key.pem -out axTLS.device_key -outform DER ++ ++# cert requests ++openssl req -out axTLS.ca_x509.req -key axTLS.ca_key.pem -new \ ++ -config ./ca_cert.conf ++openssl req -out axTLS.x509_512.req -key axTLS.key_512.pem -new \ ++ -config ./certs.conf ++openssl req -out axTLS.x509_1024.req -key axTLS.key_1024.pem -new \ ++ -config ./certs.conf ++openssl req -out axTLS.x509_2048.req -key axTLS.key_2048.pem -new \ ++ -config ./certs.conf ++openssl req -out axTLS.x509_4096.req -key axTLS.key_4096.pem -new \ ++ -config ./certs.conf ++openssl req -out axTLS.x509_device.req -key axTLS.device_key.pem -new \ ++ -config ./device_cert.conf ++openssl req -out axTLS.x509_aes128.req -key axTLS.key_aes128.pem \ ++ -new -config ./certs.conf -passin pass:abcd ++openssl req -out axTLS.x509_aes256.req -key axTLS.key_aes256.pem \ ++ -new -config ./certs.conf -passin pass:abcd ++ ++# generate the actual certs. ++openssl x509 -req -in axTLS.ca_x509.req -out axTLS.ca_x509.pem \ ++ -sha1 -days 10000 -signkey axTLS.ca_key.pem ++openssl x509 -req -in axTLS.x509_512.req -out axTLS.x509_512.pem \ ++ -sha1 -CAcreateserial -days 10000 \ ++ -CA axTLS.ca_x509.pem -CAkey axTLS.ca_key.pem ++openssl x509 -req -in axTLS.x509_1024.req -out axTLS.x509_1024.pem \ ++ -sha1 -CAcreateserial -days 10000 \ ++ -CA axTLS.ca_x509.pem -CAkey axTLS.ca_key.pem ++openssl x509 -req -in axTLS.x509_2048.req -out axTLS.x509_2048.pem \ ++ -md5 -CAcreateserial -days 10000 \ ++ -CA axTLS.ca_x509.pem -CAkey axTLS.ca_key.pem ++openssl x509 -req -in axTLS.x509_4096.req -out axTLS.x509_4096.pem \ ++ -md5 -CAcreateserial -days 10000 \ ++ -CA axTLS.ca_x509.pem -CAkey axTLS.ca_key.pem ++openssl x509 -req -in axTLS.x509_device.req -out axTLS.x509_device.pem \ ++ -sha1 -CAcreateserial -days 10000 \ ++ -CA axTLS.x509_512.pem -CAkey axTLS.key_512.pem ++openssl x509 -req -in axTLS.x509_aes128.req \ ++ -out axTLS.x509_aes128.pem \ ++ -sha1 -CAcreateserial -days 10000 \ ++ -CA axTLS.ca_x509.pem -CAkey axTLS.ca_key.pem ++openssl x509 -req -in axTLS.x509_aes256.req \ ++ -out axTLS.x509_aes256.pem \ ++ -sha1 -CAcreateserial -days 10000 \ ++ -CA axTLS.ca_x509.pem -CAkey axTLS.ca_key.pem ++ ++# note: must be root to do this ++DATE_NOW=`date` ++if date -s "Jan 1 2025"; then ++openssl x509 -req -in axTLS.x509_512.req -out axTLS.x509_bad_before.pem \ ++ -sha1 -CAcreateserial -days 365 \ ++ -CA axTLS.ca_x509.pem -CAkey axTLS.ca_key.pem ++date -s "$DATE_NOW" ++touch axTLS.x509_bad_before.pem ++fi ++openssl x509 -req -in axTLS.x509_512.req -out axTLS.x509_bad_after.pem \ ++ -sha1 -CAcreateserial -days -365 \ ++ -CA axTLS.ca_x509.pem -CAkey axTLS.ca_key.pem ++ ++# some cleanup ++rm axTLS*.req ++rm axTLS.srl ++rm *.conf ++ ++# need this for the client tests ++openssl x509 -in axTLS.ca_x509.pem -outform DER -out axTLS.ca_x509.cer ++openssl x509 -in axTLS.x509_512.pem -outform DER -out axTLS.x509_512.cer ++openssl x509 -in axTLS.x509_1024.pem -outform DER -out axTLS.x509_1024.cer ++openssl x509 -in axTLS.x509_2048.pem -outform DER -out axTLS.x509_2048.cer ++openssl x509 -in axTLS.x509_4096.pem -outform DER -out axTLS.x509_4096.cer ++openssl x509 -in axTLS.x509_device.pem -outform DER -out axTLS.x509_device.cer ++ ++# generate pkcs8 files (use RC4-128 for encryption) ++openssl pkcs8 -in axTLS.key_512.pem -passout pass:abcd -topk8 -v1 PBE-SHA1-RC4-128 -out axTLS.encrypted_pem.p8 ++openssl pkcs8 -in axTLS.key_512.pem -passout pass:abcd -topk8 -outform DER -v1 PBE-SHA1-RC4-128 -out axTLS.encrypted.p8 ++openssl pkcs8 -in axTLS.key_512.pem -nocrypt -topk8 -out axTLS.unencrypted_pem.p8 ++openssl pkcs8 -in axTLS.key_512.pem -nocrypt -topk8 -outform DER -out axTLS.unencrypted.p8 ++ ++# generate pkcs12 files (use RC4-128 for encryption) ++openssl pkcs12 -export -in axTLS.x509_1024.pem -inkey axTLS.key_1024.pem -certfile axTLS.ca_x509.pem -keypbe PBE-SHA1-RC4-128 -certpbe PBE-SHA1-RC4-128 -name "p12_with_CA" -out axTLS.withCA.p12 -password pass:abcd ++openssl pkcs12 -export -in axTLS.x509_1024.pem -inkey axTLS.key_1024.pem -keypbe PBE-SHA1-RC4-128 -certpbe PBE-SHA1-RC4-128 -name "p12_without_CA" -out axTLS.withoutCA.p12 -password pass:abcd ++openssl pkcs12 -export -in axTLS.x509_1024.pem -inkey axTLS.key_1024.pem -keypbe PBE-SHA1-RC4-128 -certpbe PBE-SHA1-RC4-128 -out axTLS.noname.p12 -password pass:abcd ++ ++# PEM certificate chain ++cat axTLS.ca_x509.pem >> axTLS.x509_device.pem ++ ++# set default key/cert for use in the server ++xxd -i axTLS.x509_1024.cer | sed -e \ ++ "s/axTLS_x509_1024_cer/default_certificate/" > ../../ssl/cert.h ++xxd -i axTLS.key_1024 | sed -e \ ++ "s/axTLS_key_1024/default_private_key/" > ../../ssl/private_key.h +diff --git a/feeds/luci/libs/luci-lib-nixio/axTLS/ssl/test/microsoft.x509_ca b/feeds/luci/libs/luci-lib-nixio/axTLS/ssl/test/microsoft.x509_ca +new file mode 100644 +index 0000000000000000000000000000000000000000..b90803452b6cd92749d3e34c60420fd20e5b1c4f +GIT binary patch +literal 1046 +zcmXqLVi7WEV*0g!nTe5!iJ##hL${4hhu}rKZ^>`&I~ee?acZ@Bw0-AgWMpAwFeot8 +zHqc~a4rSpMR&vfSs4U7%&nQvQNY+#^w6ru=@Xbsv$}i4OD^YOHFDlS8lrxZlC>BMP +z$uCMQ$;{6)R5XwW$ukQ}AmoGc^Gg&QOG`5Hi!w_p4dldmEzJ!K4Gj#;4S*m@oY%;} +z(8$;j${hd~H8Cn72MZ%B19KB2KZ8LNBNtN>BO}8~ro9IXo>_nLlh&9&y&}%w)uNTX +zs_{SmP4!v4{omY03U)Pti)JtCPcX{9=#*0VZcW+AkXxT#&uNqCpWl+U`Dk`klJYfK +zn|u6>lU__avR^lC)~pP*nHQ{d_Va9wP&?@MoXgH)n$AiM%N1`to1GrF@b8|L6PmcD +zsb*n!o!TfGUH;@z+EkjRPZ-kzwi!?gPD_ +zr%RZ=-NC4Gqg?QFOoGw;dEBS%SSNP$pR{_W_~}FVWSy-G+)pIE|8xC}wRO}=vyjYx +zD!KM2&#bz~T65R1*LJ=@LDuenLjDq&2mV}eek>TJ;QuPAdi^TN6WZpgy8BWW3U#US +zColdUBJ)%6pZD?vZDNP*#d?OS@s7n +znRPvI6k1`LC7pHK^x+j5mM1G*Sx!V5Tjcr5@Fs2NTGVs-YKXntS((sf1-FH)+9#LJ +IUw&x;05YnPSO5S3 + +literal 0 +HcmV?d00001 + +diff --git a/feeds/luci/libs/luci-lib-nixio/axTLS/ssl/test/microsoft.x509_ca.pem b/feeds/luci/libs/luci-lib-nixio/axTLS/ssl/test/microsoft.x509_ca.pem +new file mode 100644 +index 0000000..478e60b +--- /dev/null ++++ b/feeds/luci/libs/luci-lib-nixio/axTLS/ssl/test/microsoft.x509_ca.pem +@@ -0,0 +1,24 @@ ++-----BEGIN CERTIFICATE----- ++MIIEEjCCAvqgAwIBAgIPAMEAizw8iBHRPvZj7N9AMA0GCSqGSIb3DQEBBAUAMHAx ++KzApBgNVBAsTIkNvcHlyaWdodCAoYykgMTk5NyBNaWNyb3NvZnQgQ29ycC4xHjAc ++BgNVBAsTFU1pY3Jvc29mdCBDb3Jwb3JhdGlvbjEhMB8GA1UEAxMYTWljcm9zb2Z0 ++IFJvb3QgQXV0aG9yaXR5MB4XDTk3MDExMDA3MDAwMFoXDTIwMTIzMTA3MDAwMFow ++cDErMCkGA1UECxMiQ29weXJpZ2h0IChjKSAxOTk3IE1pY3Jvc29mdCBDb3JwLjEe ++MBwGA1UECxMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMSEwHwYDVQQDExhNaWNyb3Nv ++ZnQgUm9vdCBBdXRob3JpdHkwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIB ++AQCpAr3BcOY78k4bKJ+XeF4w6qKpjSVf+P6VTKO3/p2iID58UaKboo9gMmvRQmR5 ++7qx2yVTa8uuchhyPn4Rms8VremIj1h083g8BkuiWxL8tZpqaaCaZ0Dosvwy1WCbB ++RucKPjiWLKkoOajsSYNC44QPu5psVWGsgnyhYC13TOmZtGQ7mlAcMQgkFJ+p55Er ++GOY9mGMUYFgFZZ8dN1KH96fvlALGG9O/VUWziYC/OuxUlE6u/ad6bXROrxjMlgko ++IQBXkGBpN7tLEgc8Vv9b+6RmCgim0oFWV++2O14WgXcE2va+roCV/rDNf9anGnJc ++PMq88AijIjCzBoXJsyB3E4XfAgMBAAGjgagwgaUwgaIGA1UdAQSBmjCBl4AQW9Bw ++72lyniNRfhSyTY7/y6FyMHAxKzApBgNVBAsTIkNvcHlyaWdodCAoYykgMTk5NyBN ++aWNyb3NvZnQgQ29ycC4xHjAcBgNVBAsTFU1pY3Jvc29mdCBDb3Jwb3JhdGlvbjEh ++MB8GA1UEAxMYTWljcm9zb2Z0IFJvb3QgQXV0aG9yaXR5gg8AwQCLPDyIEdE+9mPs ++30AwDQYJKoZIhvcNAQEEBQADggEBAJXoC8CN85cYNe24ASTYdxHzXGAyn54Lyz4F ++kYiPyTrmIfLwV5MstaBHyGLv/NfMOztaqTZUaf4kbT/JzKreBXzdMY09nxBwarv+ ++Ek8YacD80EPjEVogT+pie6+qGcgrNyUtvmWhEoolD2Oj91Qc+SHJ1hXzUqxuQzIH ++/YIX+OVnbA1R9r3xUse958Qw/CAxCYgdlSkaTdUdAqXxgOADtFv0sd3IV+5lScdS ++VLa0AygS/5DW8AiPfriXxas3LOR65Kh343agANBqP8HSNorgQRKoNWobats14dQc ++BOSoRQTIWjM4bk0cDWK3CqKM09VUP0bNHFWmcNsSOoeTdZ+n0qA= ++-----END CERTIFICATE----- +diff --git a/feeds/luci/libs/luci-lib-nixio/axTLS/ssl/test/ms_iis.cer b/feeds/luci/libs/luci-lib-nixio/axTLS/ssl/test/ms_iis.cer +new file mode 100755 +index 0000000..250b926 +--- /dev/null ++++ b/feeds/luci/libs/luci-lib-nixio/axTLS/ssl/test/ms_iis.cer +@@ -0,0 +1,13 @@ ++-----BEGIN CERTIFICATE----- ++MIIB5jCCAVOgAwIBAgIQWPe7KyA+U7lLUohulwW2HDAJBgUrDgMCHQUAMCExHzAd ++BgNVBAMTFmF4dGxzLmNlcm9jY2x1Yi5jb20uYXUwHhcNMDgwMzE3MTAyMTA2WhcN ++MDkwMzE3MTAyMTA2WjAhMR8wHQYDVQQDExZheHRscy5jZXJvY2NsdWIuY29tLmF1 ++MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC9JqHlQjrQMt3JW8yxcGhFagDa ++D4QiIY8+KItTt13fIBt5g1AG4VXniaylSqKKYNPwVzqSWl7WhxMmoFU73veF8o4M ++G0Zc5qbVB6ukrSV4WaTgHrIO6pWkyiaQ4L/eYfCo/2pByhl0IUKkf/TMN346/rFg ++JgrElx01l6QHNQrzVQIDAQABoycwJTATBgNVHSUEDDAKBggrBgEFBQcDATAOBgNV ++HQ8EBwMFALAAAAAwCQYFKw4DAh0FAAOBgQAbH94H1fryngROJ//Oa0D3vvTO8CJ3 ++8VW+3gQEwrPBOWmN6RV8OM0dE6pf8wD3s7PTCcM5+/HI1Qk53nUGrNiOmKM1s0JB ++bvsO9RT+UF8mtdbo/n30M0MHMWPCC76baW3R+ANBp/V/z4l1ytpUTt+MHvz0VlUs ++J4uJA3s3uh23Tg== ++-----END CERTIFICATE----- +diff --git a/feeds/luci/libs/luci-lib-nixio/axTLS/ssl/test/perf_bigint.c b/feeds/luci/libs/luci-lib-nixio/axTLS/ssl/test/perf_bigint.c +new file mode 100644 +index 0000000..a4ffab6 +--- /dev/null ++++ b/feeds/luci/libs/luci-lib-nixio/axTLS/ssl/test/perf_bigint.c +@@ -0,0 +1,228 @@ ++/* ++ * Copyright (c) 2007, Cameron Rich ++ * ++ * All rights reserved. ++ * ++ * Redistribution and use in source and binary forms, with or without ++ * modification, are permitted provided that the following conditions are met: ++ * ++ * * Redistributions of source code must retain the above copyright notice, ++ * this list of conditions and the following disclaimer. ++ * * 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. ++ * * Neither the name of the axTLS project nor the names of its contributors ++ * may be used to endorse or promote products derived from this software ++ * without specific prior written permission. ++ * ++ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ++ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT ++ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR ++ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR ++ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, ++ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, ++ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR ++ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF ++ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING ++ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS ++ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ++ */ ++ ++/** ++ * Some performance testing of bigint. ++ */ ++ ++#include ++#include ++#include ++#include "ssl.h" ++ ++/************************************************************************** ++ * BIGINT tests ++ * ++ **************************************************************************/ ++ ++int main(int argc, char *argv[]) ++{ ++#ifdef CONFIG_SSL_CERT_VERIFICATION ++ RSA_CTX *rsa_ctx; ++ BI_CTX *ctx; ++ bigint *bi_data, *bi_res; ++ int diff, res = 1; ++ struct timeval tv_old, tv_new; ++ const char *plaintext; ++ uint8_t compare[MAX_KEY_BYTE_SIZE]; ++ int i, max_biggie = 10; /* really crank performance */ ++ int len; ++ uint8_t *buf; ++ ++ /** ++ * 512 bit key ++ */ ++ plaintext = /* 64 byte number */ ++ "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ*^"; ++ ++ len = get_file("../ssl/test/axTLS.key_512", &buf); ++ asn1_get_private_key(buf, len, &rsa_ctx); ++ ctx = rsa_ctx->bi_ctx; ++ bi_data = bi_import(ctx, (uint8_t *)plaintext, strlen(plaintext)); ++ bi_res = RSA_public(rsa_ctx, bi_data); ++ bi_data = bi_res; /* reuse again */ ++ ++ gettimeofday(&tv_old, NULL); ++ for (i = 0; i < max_biggie; i++) ++ { ++ bi_res = RSA_private(rsa_ctx, bi_copy(bi_data)); ++ if (i < max_biggie-1) ++ { ++ bi_free(ctx, bi_res); ++ } ++ } ++ ++ gettimeofday(&tv_new, NULL); ++ bi_free(ctx, bi_data); ++ ++ diff = (tv_new.tv_sec-tv_old.tv_sec)*1000 + ++ (tv_new.tv_usec-tv_old.tv_usec)/1000; ++ printf("512 bit decrypt time: %dms\n", diff/max_biggie); ++ TTY_FLUSH(); ++ bi_export(ctx, bi_res, compare, 64); ++ RSA_free(rsa_ctx); ++ free(buf); ++ if (memcmp(plaintext, compare, 64) != 0) ++ goto end; ++ ++ /** ++ * 1024 bit key ++ */ ++ plaintext = /* 128 byte number */ ++ "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ*^" ++ "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ*^"; ++ ++ len = get_file("../ssl/test/axTLS.key_1024", &buf); ++ asn1_get_private_key(buf, len, &rsa_ctx); ++ ctx = rsa_ctx->bi_ctx; ++ bi_data = bi_import(ctx, (uint8_t *)plaintext, strlen(plaintext)); ++ bi_res = RSA_public(rsa_ctx, bi_data); ++ bi_data = bi_res; /* reuse again */ ++ ++ gettimeofday(&tv_old, NULL); ++ for (i = 0; i < max_biggie; i++) ++ { ++ bi_res = RSA_private(rsa_ctx, bi_copy(bi_data)); ++ if (i < max_biggie-1) ++ { ++ bi_free(ctx, bi_res); ++ } ++ } ++ ++ gettimeofday(&tv_new, NULL); ++ bi_free(ctx, bi_data); ++ ++ diff = (tv_new.tv_sec-tv_old.tv_sec)*1000 + ++ (tv_new.tv_usec-tv_old.tv_usec)/1000; ++ printf("1024 bit decrypt time: %dms\n", diff/max_biggie); ++ TTY_FLUSH(); ++ bi_export(ctx, bi_res, compare, 128); ++ RSA_free(rsa_ctx); ++ free(buf); ++ if (memcmp(plaintext, compare, 128) != 0) ++ goto end; ++ ++ /** ++ * 2048 bit key ++ */ ++ plaintext = /* 256 byte number */ ++ "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ*^" ++ "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ*^" ++ "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ*^" ++ "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ*^"; ++ ++ len = get_file("../ssl/test/axTLS.key_2048", &buf); ++ asn1_get_private_key(buf, len, &rsa_ctx); ++ ctx = rsa_ctx->bi_ctx; ++ bi_data = bi_import(ctx, (uint8_t *)plaintext, strlen(plaintext)); ++ bi_res = RSA_public(rsa_ctx, bi_data); ++ bi_data = bi_res; /* reuse again */ ++ ++ gettimeofday(&tv_old, NULL); ++ for (i = 0; i < max_biggie; i++) ++ { ++ bi_res = RSA_private(rsa_ctx, bi_copy(bi_data)); ++ if (i < max_biggie-1) ++ { ++ bi_free(ctx, bi_res); ++ } ++ } ++ gettimeofday(&tv_new, NULL); ++ bi_free(ctx, bi_data); ++ ++ diff = (tv_new.tv_sec-tv_old.tv_sec)*1000 + ++ (tv_new.tv_usec-tv_old.tv_usec)/1000; ++ printf("2048 bit decrypt time: %dms\n", diff/max_biggie); ++ TTY_FLUSH(); ++ bi_export(ctx, bi_res, compare, 256); ++ RSA_free(rsa_ctx); ++ free(buf); ++ if (memcmp(plaintext, compare, 256) != 0) ++ goto end; ++ ++ /** ++ * 4096 bit key ++ */ ++ plaintext = /* 512 byte number */ ++ "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ*^" ++ "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ*^" ++ "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ*^" ++ "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ*^" ++ "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ*^" ++ "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ*^" ++ "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ*^" ++ "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ*^"; ++ ++ len = get_file("../ssl/test/axTLS.key_4096", &buf); ++ asn1_get_private_key(buf, len, &rsa_ctx); ++ ctx = rsa_ctx->bi_ctx; ++ bi_data = bi_import(ctx, (uint8_t *)plaintext, strlen(plaintext)); ++ gettimeofday(&tv_old, NULL); ++ bi_res = RSA_public(rsa_ctx, bi_data); ++ gettimeofday(&tv_new, NULL); ++ diff = (tv_new.tv_sec-tv_old.tv_sec)*1000 + ++ (tv_new.tv_usec-tv_old.tv_usec)/1000; ++ printf("4096 bit encrypt time: %dms\n", diff); ++ TTY_FLUSH(); ++ bi_data = bi_res; /* reuse again */ ++ ++ gettimeofday(&tv_old, NULL); ++ for (i = 0; i < max_biggie; i++) ++ { ++ bi_res = RSA_private(rsa_ctx, bi_copy(bi_data)); ++ if (i < max_biggie-1) ++ { ++ bi_free(ctx, bi_res); ++ } ++ } ++ ++ gettimeofday(&tv_new, NULL); ++ bi_free(ctx, bi_data); ++ ++ diff = (tv_new.tv_sec-tv_old.tv_sec)*1000 + ++ (tv_new.tv_usec-tv_old.tv_usec)/1000; ++ printf("4096 bit decrypt time: %dms\n", diff/max_biggie); ++ TTY_FLUSH(); ++ bi_export(ctx, bi_res, compare, 512); ++ RSA_free(rsa_ctx); ++ free(buf); ++ if (memcmp(plaintext, compare, 512) != 0) ++ goto end; ++ ++ /* done */ ++ printf("Bigint performance testing complete\n"); ++ res = 0; ++ ++end: ++ return res; ++#else ++ return 0; ++#endif ++} +diff --git a/feeds/luci/libs/luci-lib-nixio/axTLS/ssl/test/socgen.cer b/feeds/luci/libs/luci-lib-nixio/axTLS/ssl/test/socgen.cer +new file mode 100755 +index 0000000000000000000000000000000000000000..a4278705b77b573b2d248ed305c22b2d09adcacd +GIT binary patch +literal 980 +zcmXqLV!mL|#B95OnTe5!NkD_`!T +z;QZvw)RI&M_td=9qQsn3Lm2}pu`Kb +zlb2eeSDc@mo|>nZoS$pZI3GE97+D#Z8+#dmE@WzKWVoD|Jf%l(uZI1`=4qA=*RJJA +z?chpsFj>bp<>2Cnn~pKH_~~}+WSdv5Vp-g~=R*{W@9c}qf6Ug-cl@VZLQQ_OCeH@^h`oXZ!fnJj3XJKJxVqIWh1LDZD +zm>L)x7%tFXpxdUMQBqQ1rLUh{l%ofXrp)5Zbg*Cbf$tUR59|fBpSpoj9n0I5NQx@ +z5Gux*nVXoNs-K>jW}s*wZ@|vRs?EpDB*h}q|Map{+nV0K?8E09vaWbY=u}JU8K{aW +zL+t=2fqWD@^vjCDVjz=Ha|v@D1BdA4&`;!%a +z`ZjicJXrPWUp61x_6yT?-1OPGnCp)Bskw&pd3$HgaIL> ++#include ++#include ++#include ++#include ++#include ++#include ++ ++#ifndef WIN32 ++#include ++#endif ++ ++#include "ssl.h" ++ ++#define DEFAULT_CERT "../ssl/test/axTLS.x509_512.cer" ++#define DEFAULT_KEY "../ssl/test/axTLS.key_512" ++//#define DEFAULT_SVR_OPTION SSL_DISPLAY_BYTES|SSL_DISPLAY_STATES ++#define DEFAULT_SVR_OPTION 0 ++#define DEFAULT_CLNT_OPTION 0 ++//#define DEFAULT_CLNT_OPTION SSL_DISPLAY_BYTES|SSL_DISPLAY_STATES ++ ++static int g_port = 19001; ++ ++/************************************************************************** ++ * AES tests ++ * ++ * Run through a couple of the RFC3602 tests to verify that AES is correct. ++ **************************************************************************/ ++#define TEST1_SIZE 16 ++#define TEST2_SIZE 32 ++ ++static int AES_test(BI_CTX *bi_ctx) ++{ ++ AES_CTX aes_key; ++ int res = 1; ++ uint8_t key[TEST1_SIZE]; ++ uint8_t iv[TEST1_SIZE]; ++ ++ { ++ /* ++ Case #1: Encrypting 16 bytes (1 block) using AES-CBC ++ Key : 0x06a9214036b8a15b512e03d534120006 ++ IV : 0x3dafba429d9eb430b422da802c9fac41 ++ Plaintext : "Single block msg" ++ Ciphertext: 0xe353779c1079aeb82708942dbe77181a ++ ++ */ ++ char *in_str = "Single block msg"; ++ uint8_t ct[TEST1_SIZE]; ++ uint8_t enc_data[TEST1_SIZE]; ++ uint8_t dec_data[TEST1_SIZE]; ++ ++ bigint *key_bi = bi_str_import( ++ bi_ctx, "06A9214036B8A15B512E03D534120006"); ++ bigint *iv_bi = bi_str_import( ++ bi_ctx, "3DAFBA429D9EB430B422DA802C9FAC41"); ++ bigint *ct_bi = bi_str_import( ++ bi_ctx, "E353779C1079AEB82708942DBE77181A"); ++ bi_export(bi_ctx, key_bi, key, TEST1_SIZE); ++ bi_export(bi_ctx, iv_bi, iv, TEST1_SIZE); ++ bi_export(bi_ctx, ct_bi, ct, TEST1_SIZE); ++ ++ AES_set_key(&aes_key, key, iv, AES_MODE_128); ++ AES_cbc_encrypt(&aes_key, (const uint8_t *)in_str, ++ enc_data, sizeof(enc_data)); ++ if (memcmp(enc_data, ct, sizeof(ct))) ++ { ++ printf("Error: AES ENCRYPT #1 failed\n"); ++ goto end; ++ } ++ ++ AES_set_key(&aes_key, key, iv, AES_MODE_128); ++ AES_convert_key(&aes_key); ++ AES_cbc_decrypt(&aes_key, enc_data, dec_data, sizeof(enc_data)); ++ ++ if (memcmp(dec_data, in_str, sizeof(dec_data))) ++ { ++ printf("Error: AES DECRYPT #1 failed\n"); ++ goto end; ++ } ++ } ++ ++ { ++ /* ++ Case #2: Encrypting 32 bytes (2 blocks) using AES-CBC ++ Key : 0xc286696d887c9aa0611bbb3e2025a45a ++ IV : 0x562e17996d093d28ddb3ba695a2e6f58 ++ Plaintext : 0x000102030405060708090a0b0c0d0e0f ++ 101112131415161718191a1b1c1d1e1f ++ Ciphertext: 0xd296cd94c2cccf8a3a863028b5e1dc0a ++ 7586602d253cfff91b8266bea6d61ab1 ++ */ ++ uint8_t in_data[TEST2_SIZE]; ++ uint8_t ct[TEST2_SIZE]; ++ uint8_t enc_data[TEST2_SIZE]; ++ uint8_t dec_data[TEST2_SIZE]; ++ ++ bigint *in_bi = bi_str_import(bi_ctx, ++ "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F"); ++ bigint *key_bi = bi_str_import( ++ bi_ctx, "C286696D887C9AA0611BBB3E2025A45A"); ++ bigint *iv_bi = bi_str_import( ++ bi_ctx, "562E17996D093D28DDB3BA695A2E6F58"); ++ bigint *ct_bi = bi_str_import(bi_ctx, ++ "D296CD94C2CCCF8A3A863028B5E1DC0A7586602D253CFFF91B8266BEA6D61AB1"); ++ bi_export(bi_ctx, in_bi, in_data, TEST2_SIZE); ++ bi_export(bi_ctx, key_bi, key, TEST1_SIZE); ++ bi_export(bi_ctx, iv_bi, iv, TEST1_SIZE); ++ bi_export(bi_ctx, ct_bi, ct, TEST2_SIZE); ++ ++ AES_set_key(&aes_key, key, iv, AES_MODE_128); ++ AES_cbc_encrypt(&aes_key, (const uint8_t *)in_data, ++ enc_data, sizeof(enc_data)); ++ ++ if (memcmp(enc_data, ct, sizeof(ct))) ++ { ++ printf("Error: ENCRYPT #2 failed\n"); ++ goto end; ++ } ++ ++ AES_set_key(&aes_key, key, iv, AES_MODE_128); ++ AES_convert_key(&aes_key); ++ AES_cbc_decrypt(&aes_key, enc_data, dec_data, sizeof(enc_data)); ++ if (memcmp(dec_data, in_data, sizeof(dec_data))) ++ { ++ printf("Error: DECRYPT #2 failed\n"); ++ goto end; ++ } ++ } ++ ++ res = 0; ++ printf("All AES tests passed\n"); ++ ++end: ++ return res; ++} ++ ++/************************************************************************** ++ * RC4 tests ++ * ++ * ARC4 tests vectors from OpenSSL (crypto/rc4/rc4test.c) ++ **************************************************************************/ ++static const uint8_t keys[7][30]= ++{ ++ {8,0x01,0x23,0x45,0x67,0x89,0xab,0xcd,0xef}, ++ {8,0x01,0x23,0x45,0x67,0x89,0xab,0xcd,0xef}, ++ {8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}, ++ {4,0xef,0x01,0x23,0x45}, ++ {8,0x01,0x23,0x45,0x67,0x89,0xab,0xcd,0xef}, ++ {4,0xef,0x01,0x23,0x45}, ++}; ++ ++static const uint8_t data_len[7]={8,8,8,20,28,10}; ++static uint8_t data[7][30]= ++{ ++ {0x01,0x23,0x45,0x67,0x89,0xab,0xcd,0xef,0xff}, ++ {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff}, ++ {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff}, ++ {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, ++ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, ++ 0x00,0x00,0x00,0x00,0xff}, ++ {0x12,0x34,0x56,0x78,0x9A,0xBC,0xDE,0xF0, ++ 0x12,0x34,0x56,0x78,0x9A,0xBC,0xDE,0xF0, ++ 0x12,0x34,0x56,0x78,0x9A,0xBC,0xDE,0xF0, ++ 0x12,0x34,0x56,0x78,0xff}, ++ {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff}, ++ {0}, ++}; ++ ++static const uint8_t output[7][30]= ++{ ++ {0x75,0xb7,0x87,0x80,0x99,0xe0,0xc5,0x96,0x00}, ++ {0x74,0x94,0xc2,0xe7,0x10,0x4b,0x08,0x79,0x00}, ++ {0xde,0x18,0x89,0x41,0xa3,0x37,0x5d,0x3a,0x00}, ++ {0xd6,0xa1,0x41,0xa7,0xec,0x3c,0x38,0xdf, ++ 0xbd,0x61,0x5a,0x11,0x62,0xe1,0xc7,0xba, ++ 0x36,0xb6,0x78,0x58,0x00}, ++ {0x66,0xa0,0x94,0x9f,0x8a,0xf7,0xd6,0x89, ++ 0x1f,0x7f,0x83,0x2b,0xa8,0x33,0xc0,0x0c, ++ 0x89,0x2e,0xbe,0x30,0x14,0x3c,0xe2,0x87, ++ 0x40,0x01,0x1e,0xcf,0x00}, ++ {0xd6,0xa1,0x41,0xa7,0xec,0x3c,0x38,0xdf,0xbd,0x61,0x00}, ++ {0}, ++}; ++ ++static int RC4_test(BI_CTX *bi_ctx) ++{ ++ int i, res = 1; ++ RC4_CTX s; ++ ++ for (i = 0; i < 6; i++) ++ { ++ RC4_setup(&s, &keys[i][1], keys[i][0]); ++ RC4_crypt(&s, data[i], data[i], data_len[i]); ++ ++ if (memcmp(data[i], output[i], data_len[i])) ++ { ++ printf("Error: RC4 CRYPT #%d failed\n", i); ++ goto end; ++ } ++ } ++ ++ res = 0; ++ printf("All RC4 tests passed\n"); ++ ++end: ++ return res; ++} ++ ++/************************************************************************** ++ * SHA1 tests ++ * ++ * Run through a couple of the RFC3174 tests to verify that SHA1 is correct. ++ **************************************************************************/ ++static int SHA1_test(BI_CTX *bi_ctx) ++{ ++ SHA1_CTX ctx; ++ uint8_t ct[SHA1_SIZE]; ++ uint8_t digest[SHA1_SIZE]; ++ int res = 1; ++ ++ { ++ const char *in_str = "abc"; ++ bigint *ct_bi = bi_str_import(bi_ctx, ++ "A9993E364706816ABA3E25717850C26C9CD0D89D"); ++ bi_export(bi_ctx, ct_bi, ct, SHA1_SIZE); ++ ++ SHA1_Init(&ctx); ++ SHA1_Update(&ctx, (const uint8_t *)in_str, strlen(in_str)); ++ SHA1_Final(digest, &ctx); ++ ++ if (memcmp(digest, ct, sizeof(ct))) ++ { ++ printf("Error: SHA1 #1 failed\n"); ++ goto end; ++ } ++ } ++ ++ { ++ const char *in_str = ++ "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq"; ++ bigint *ct_bi = bi_str_import(bi_ctx, ++ "84983E441C3BD26EBAAE4AA1F95129E5E54670F1"); ++ bi_export(bi_ctx, ct_bi, ct, SHA1_SIZE); ++ ++ SHA1_Init(&ctx); ++ SHA1_Update(&ctx, (const uint8_t *)in_str, strlen(in_str)); ++ SHA1_Final(digest, &ctx); ++ ++ if (memcmp(digest, ct, sizeof(ct))) ++ { ++ printf("Error: SHA1 #2 failed\n"); ++ goto end; ++ } ++ } ++ ++ res = 0; ++ printf("All SHA1 tests passed\n"); ++ ++end: ++ return res; ++} ++ ++/************************************************************************** ++ * MD5 tests ++ * ++ * Run through a couple of the RFC1321 tests to verify that MD5 is correct. ++ **************************************************************************/ ++static int MD5_test(BI_CTX *bi_ctx) ++{ ++ MD5_CTX ctx; ++ uint8_t ct[MD5_SIZE]; ++ uint8_t digest[MD5_SIZE]; ++ int res = 1; ++ ++ { ++ const char *in_str = "abc"; ++ bigint *ct_bi = bi_str_import(bi_ctx, ++ "900150983CD24FB0D6963F7D28E17F72"); ++ bi_export(bi_ctx, ct_bi, ct, MD5_SIZE); ++ ++ MD5_Init(&ctx); ++ MD5_Update(&ctx, (const uint8_t *)in_str, strlen(in_str)); ++ MD5_Final(digest, &ctx); ++ ++ if (memcmp(digest, ct, sizeof(ct))) ++ { ++ printf("Error: MD5 #1 failed\n"); ++ goto end; ++ } ++ } ++ ++ { ++ const char *in_str = ++ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"; ++ bigint *ct_bi = bi_str_import( ++ bi_ctx, "D174AB98D277D9F5A5611C2C9F419D9F"); ++ bi_export(bi_ctx, ct_bi, ct, MD5_SIZE); ++ ++ MD5_Init(&ctx); ++ MD5_Update(&ctx, (const uint8_t *)in_str, strlen(in_str)); ++ MD5_Final(digest, &ctx); ++ ++ if (memcmp(digest, ct, sizeof(ct))) ++ { ++ printf("Error: MD5 #2 failed\n"); ++ goto end; ++ } ++ } ++ res = 0; ++ printf("All MD5 tests passed\n"); ++ ++end: ++ return res; ++} ++ ++/************************************************************************** ++ * HMAC tests ++ * ++ * Run through a couple of the RFC2202 tests to verify that HMAC is correct. ++ **************************************************************************/ ++static int HMAC_test(BI_CTX *bi_ctx) ++{ ++ uint8_t key[SHA1_SIZE]; ++ uint8_t ct[SHA1_SIZE]; ++ uint8_t dgst[SHA1_SIZE]; ++ int res = 1; ++ const char *key_str; ++ ++ const char *data_str = "Hi There"; ++ bigint *key_bi = bi_str_import(bi_ctx, "0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B"); ++ bigint *ct_bi = bi_str_import(bi_ctx, "9294727A3638BB1C13F48EF8158BFC9D"); ++ bi_export(bi_ctx, key_bi, key, MD5_SIZE); ++ bi_export(bi_ctx, ct_bi, ct, MD5_SIZE); ++ hmac_md5((const uint8_t *)data_str, 8, key, MD5_SIZE, dgst); ++ if (memcmp(dgst, ct, MD5_SIZE)) ++ { ++ printf("HMAC MD5 #1 failed\n"); ++ goto end; ++ } ++ ++ data_str = "what do ya want for nothing?"; ++ key_str = "Jefe"; ++ ct_bi = bi_str_import(bi_ctx, "750C783E6AB0B503EAA86E310A5DB738"); ++ bi_export(bi_ctx, ct_bi, ct, MD5_SIZE); ++ hmac_md5((const uint8_t *)data_str, 28, (const uint8_t *)key_str, 4, dgst); ++ if (memcmp(dgst, ct, MD5_SIZE)) ++ { ++ printf("HMAC MD5 #2 failed\n"); ++ goto end; ++ } ++ ++ data_str = "Hi There"; ++ key_bi = bi_str_import(bi_ctx, "0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B"); ++ bi_export(bi_ctx, key_bi, key, SHA1_SIZE); ++ ct_bi = bi_str_import(bi_ctx, "B617318655057264E28BC0B6FB378C8EF146BE00"); ++ bi_export(bi_ctx, ct_bi, ct, SHA1_SIZE); ++ ++ hmac_sha1((const uint8_t *)data_str, 8, ++ (const uint8_t *)key, SHA1_SIZE, dgst); ++ if (memcmp(dgst, ct, SHA1_SIZE)) ++ { ++ printf("HMAC SHA1 #1 failed\n"); ++ goto end; ++ } ++ ++ data_str = "what do ya want for nothing?"; ++ key_str = "Jefe"; ++ ct_bi = bi_str_import(bi_ctx, "EFFCDF6AE5EB2FA2D27416D5F184DF9C259A7C79"); ++ bi_export(bi_ctx, ct_bi, ct, SHA1_SIZE); ++ ++ hmac_sha1((const uint8_t *)data_str, 28, (const uint8_t *)key_str, 5, dgst); ++ if (memcmp(dgst, ct, SHA1_SIZE)) ++ { ++ printf("HMAC SHA1 failed\n"); ++ exit(1); ++ } ++ ++ res = 0; ++ printf("All HMAC tests passed\n"); ++ ++end: ++ return res; ++} ++ ++/************************************************************************** ++ * BIGINT tests ++ * ++ **************************************************************************/ ++static int BIGINT_test(BI_CTX *ctx) ++{ ++ int res = 1; ++ bigint *bi_data, *bi_exp, *bi_res; ++ const char *expnt, *plaintext, *mod; ++ uint8_t compare[MAX_KEY_BYTE_SIZE]; ++ ++ /** ++ * 512 bit key ++ */ ++ plaintext = /* 64 byte number */ ++ "01aaaaaaaaaabbbbbbbbbbbbbbbccccccccccccccdddddddddddddeeeeeeeeee"; ++ ++ mod = "C30773C8ABE09FCC279EE0E5343370DE" ++ "8B2FFDB6059271E3005A7CEEF0D35E0A" ++ "1F9915D95E63560836CC2EB2C289270D" ++ "BCAE8CAF6F5E907FC2759EE220071E1B"; ++ ++ expnt = "A1E556CD1738E10DF539E35101334E97" ++ "BE8D391C57A5C89A7AD9A2EA2ACA1B3D" ++ "F3140F5091CC535CBAA47CEC4159EE1F" ++ "B6A3661AFF1AB758426EAB158452A9B9"; ++ ++ bi_data = bi_import(ctx, (uint8_t *)plaintext, strlen(plaintext)); ++ bi_exp = int_to_bi(ctx, 0x10001); ++ bi_set_mod(ctx, bi_str_import(ctx, mod), 0); ++ bi_res = bi_mod_power(ctx, bi_data, bi_exp); ++ ++ bi_data = bi_res; /* resuse again - see if we get the original */ ++ ++ bi_exp = bi_str_import(ctx, expnt); ++ bi_res = bi_mod_power(ctx, bi_data, bi_exp); ++ bi_free_mod(ctx, 0); ++ ++ bi_export(ctx, bi_res, compare, 64); ++ if (memcmp(plaintext, compare, 64) != 0) ++ goto end; ++ ++ printf("All BIGINT tests passed\n"); ++ res = 0; ++ ++end: ++ return res; ++} ++ ++/************************************************************************** ++ * RSA tests ++ * ++ * Use the results from openssl to verify PKCS1 etc ++ **************************************************************************/ ++static int RSA_test(void) ++{ ++ int res = 1; ++ const char *plaintext = /* 128 byte hex number */ ++ "1aaaaaaaaaabbbbbbbbbbbbbbbccccccccccccccdddddddddddddeeeeeeeeee2" ++ "1aaaaaaaaaabbbbbbbbbbbbbbbccccccccccccccdddddddddddddeeeeeeeee2\012"; ++ uint8_t enc_data[128], dec_data[128]; ++ RSA_CTX *rsa_ctx = NULL; ++ BI_CTX *bi_ctx; ++ bigint *plaintext_bi; ++ bigint *enc_data_bi, *dec_data_bi; ++ uint8_t enc_data2[128], dec_data2[128]; ++ int size; ++ int len; ++ uint8_t *buf; ++ ++ /* extract the private key elements */ ++ len = get_file("../ssl/test/axTLS.key_1024", &buf); ++ if (asn1_get_private_key(buf, len, &rsa_ctx) < 0) ++ { ++ goto end; ++ } ++ ++ free(buf); ++ bi_ctx = rsa_ctx->bi_ctx; ++ plaintext_bi = bi_import(bi_ctx, ++ (const uint8_t *)plaintext, strlen(plaintext)); ++ ++ /* basic rsa encrypt */ ++ enc_data_bi = RSA_public(rsa_ctx, plaintext_bi); ++ bi_export(bi_ctx, bi_copy(enc_data_bi), enc_data, sizeof(enc_data)); ++ ++ /* basic rsa decrypt */ ++ dec_data_bi = RSA_private(rsa_ctx, enc_data_bi); ++ bi_export(bi_ctx, dec_data_bi, dec_data, sizeof(dec_data)); ++ ++ if (memcmp(dec_data, plaintext, strlen(plaintext))) ++ { ++ printf("Error: DECRYPT #1 failed\n"); ++ goto end; ++ } ++ ++ RSA_encrypt(rsa_ctx, (const uint8_t *)"abc", 3, enc_data2, 0); ++ size = RSA_decrypt(rsa_ctx, enc_data2, dec_data2, 1); ++ if (memcmp("abc", dec_data2, 3)) ++ { ++ printf("Error: ENCRYPT/DECRYPT #2 failed\n"); ++ goto end; ++ } ++ ++ RSA_free(rsa_ctx); ++ res = 0; ++ printf("All RSA tests passed\n"); ++ ++end: ++ return res; ++} ++ ++/************************************************************************** ++ * Cert Testing ++ * ++ **************************************************************************/ ++static int cert_tests(void) ++{ ++ int res = -1, len; ++ X509_CTX *x509_ctx; ++ SSL_CTX *ssl_ctx; ++ uint8_t *buf; ++ ++ /* check a bunch of 3rd party certificates */ ++ ssl_ctx = ssl_ctx_new(0, 0); ++ len = get_file("../ssl/test/microsoft.x509_ca", &buf); ++ if ((res = add_cert_auth(ssl_ctx, buf, len)) < 0) ++ { ++ printf("Cert #1\n"); ++ ssl_display_error(res); ++ goto bad_cert; ++ } ++ ++ ssl_ctx_free(ssl_ctx); ++ free(buf); ++ ++ ssl_ctx = ssl_ctx_new(0, 0); ++ len = get_file("../ssl/test/thawte.x509_ca", &buf); ++ if ((res = add_cert_auth(ssl_ctx, buf, len)) < 0) ++ { ++ printf("Cert #2\n"); ++ ssl_display_error(res); ++ goto bad_cert; ++ } ++ ++ ssl_ctx_free(ssl_ctx); ++ free(buf); ++ ++ ssl_ctx = ssl_ctx_new(0, 0); ++ len = get_file("../ssl/test/deutsche_telecom.x509_ca", &buf); ++ if ((res = add_cert_auth(ssl_ctx, buf, len)) < 0) ++ { ++ printf("Cert #3\n"); ++ ssl_display_error(res); ++ goto bad_cert; ++ } ++ ++ ssl_ctx_free(ssl_ctx); ++ free(buf); ++ ++ ssl_ctx = ssl_ctx_new(0, 0); ++ len = get_file("../ssl/test/equifax.x509_ca", &buf); ++ if ((res = add_cert_auth(ssl_ctx, buf, len)) < 0) ++ { ++ printf("Cert #4\n"); ++ ssl_display_error(res); ++ goto bad_cert; ++ } ++ ++ ssl_ctx_free(ssl_ctx); ++ free(buf); ++ ++ ssl_ctx = ssl_ctx_new(0, 0); ++ len = get_file("../ssl/test/gnutls.cer", &buf); ++ if ((res = add_cert(ssl_ctx, buf, len)) < 0) ++ { ++ printf("Cert #5\n"); ++ ssl_display_error(res); ++ goto bad_cert; ++ } ++ ++ ssl_ctx_free(ssl_ctx); ++ free(buf); ++ ++ ssl_ctx = ssl_ctx_new(0, 0); ++ len = get_file("../ssl/test/socgen.cer", &buf); ++ if ((res = add_cert(ssl_ctx, buf, len)) < 0) ++ { ++ printf("Cert #6\n"); ++ ssl_display_error(res); ++ goto bad_cert; ++ } ++ ++ ssl_ctx_free(ssl_ctx); ++ free(buf); ++ ++ ssl_ctx = ssl_ctx_new(0, 0); ++ len = get_file("../ssl/test/verisign.x509_ca", &buf); ++ if ((res = add_cert_auth(ssl_ctx, buf, len)) <0) ++ { ++ printf("Cert #7\n"); ++ ssl_display_error(res); ++ goto bad_cert; ++ } ++ ++ ssl_ctx_free(ssl_ctx); ++ free(buf); ++ ++ if (get_file("../ssl/test/verisign.x509_my_cert", &buf) < 0 || ++ x509_new(buf, &len, &x509_ctx)) ++ { ++ printf("Cert #8\n"); ++ ssl_display_error(res); ++ goto bad_cert; ++ } ++ ++ x509_free(x509_ctx); ++ free(buf); ++ ++ ssl_ctx = ssl_ctx_new(0, 0); ++ if ((res = ssl_obj_load(ssl_ctx, ++ SSL_OBJ_X509_CERT, "../ssl/test/ms_iis.cer", NULL)) != SSL_OK) ++ { ++ ssl_display_error(res); ++ goto bad_cert; ++ } ++ ++ ssl_ctx_free(ssl_ctx); ++ res = 0; /* all ok */ ++ printf("All Certificate tests passed\n"); ++ ++bad_cert: ++ if (res) ++ printf("Error: A certificate test failed\n"); ++ return res; ++} ++ ++/** ++ * init a server socket. ++ */ ++static int server_socket_init(int *port) ++{ ++ struct sockaddr_in serv_addr; ++ int server_fd; ++ char yes = 1; ++ ++ /* Create socket for incoming connections */ ++ if ((server_fd = socket(AF_INET, SOCK_STREAM, 0)) < 0) ++ { ++ return -1; ++ } ++ ++ setsockopt(server_fd, SOL_SOCKET, SO_REUSEADDR, &yes, sizeof(yes)); ++ ++go_again: ++ /* Construct local address structure */ ++ memset(&serv_addr, 0, sizeof(serv_addr)); /* Zero out structure */ ++ serv_addr.sin_family = AF_INET; /* Internet address family */ ++ serv_addr.sin_addr.s_addr = htonl(INADDR_ANY); /* Any incoming interface */ ++ serv_addr.sin_port = htons(*port); /* Local port */ ++ ++ /* Bind to the local address */ ++ if (bind(server_fd, (struct sockaddr *) &serv_addr, sizeof(serv_addr)) < 0) ++ { ++ (*port)++; ++ goto go_again; ++ } ++ /* Mark the socket so it will listen for incoming connections */ ++ if (listen(server_fd, 3000) < 0) ++ { ++ return -1; ++ } ++ ++ return server_fd; ++} ++ ++/** ++ * init a client socket. ++ */ ++static int client_socket_init(uint16_t port) ++{ ++ struct sockaddr_in address; ++ int client_fd; ++ ++ address.sin_family = AF_INET; ++ address.sin_port = htons(port); ++ address.sin_addr.s_addr = inet_addr("127.0.0.1"); ++ client_fd = socket(AF_INET, SOCK_STREAM, 0); ++ if (connect(client_fd, (struct sockaddr *)&address, sizeof(address)) < 0) ++ { ++ perror("socket"); ++ SOCKET_CLOSE(client_fd); ++ client_fd = -1; ++ } ++ ++ return client_fd; ++} ++ ++/************************************************************************** ++ * SSL Server Testing ++ * ++ **************************************************************************/ ++typedef struct ++{ ++ /* not used as yet */ ++ int dummy; ++} SVR_CTX; ++ ++typedef struct ++{ ++ const char *testname; ++ const char *openssl_option; ++} client_t; ++ ++static void do_client(client_t *clnt) ++{ ++ char openssl_buf[2048]; ++ ++ /* make sure the main thread goes first */ ++ sleep(0); ++ ++ /* show the session ids in the reconnect test */ ++ if (strcmp(clnt->testname, "Session Reuse") == 0) ++ { ++ sprintf(openssl_buf, "echo \"hello client\" | openssl s_client " ++ "-connect localhost:%d %s 2>&1 | grep \"Session-ID:\"", ++ g_port, clnt->openssl_option); ++ } ++ else ++ { ++ sprintf(openssl_buf, "echo \"hello client\" | openssl s_client " ++#ifdef WIN32 ++ "-connect localhost:%d -quiet %s", ++#else ++ "-connect localhost:%d -quiet %s > /dev/null 2>&1", ++#endif ++ g_port, clnt->openssl_option); ++ } ++ ++ system(openssl_buf); ++} ++ ++static int SSL_server_test( ++ const char *testname, ++ const char *openssl_option, ++ const char *device_cert, ++ const char *product_cert, ++ const char *private_key, ++ const char *ca_cert, ++ const char *password, ++ int axtls_option) ++{ ++ int server_fd, ret = 0; ++ SSL_CTX *ssl_ctx = NULL; ++ struct sockaddr_in client_addr; ++ uint8_t *read_buf; ++ socklen_t clnt_len = sizeof(client_addr); ++ client_t client_data; ++#ifndef WIN32 ++ pthread_t thread; ++#endif ++ g_port++; ++ ++ client_data.testname = testname; ++ client_data.openssl_option = openssl_option; ++ ++ if ((server_fd = server_socket_init(&g_port)) < 0) ++ goto error; ++ ++ if (private_key) ++ { ++ axtls_option |= SSL_NO_DEFAULT_KEY; ++ } ++ ++ if ((ssl_ctx = ssl_ctx_new(axtls_option, SSL_DEFAULT_SVR_SESS)) == NULL) ++ { ++ ret = SSL_ERROR_INVALID_KEY; ++ goto error; ++ } ++ ++ if (private_key) ++ { ++ int obj_type = SSL_OBJ_RSA_KEY; ++ ++ if (strstr(private_key, ".p8")) ++ obj_type = SSL_OBJ_PKCS8; ++ else if (strstr(private_key, ".p12")) ++ obj_type = SSL_OBJ_PKCS12; ++ ++ if (ssl_obj_load(ssl_ctx, obj_type, private_key, password)) ++ { ++ ret = SSL_ERROR_INVALID_KEY; ++ goto error; ++ } ++ } ++ ++ if (device_cert) /* test chaining */ ++ { ++ if ((ret = ssl_obj_load(ssl_ctx, ++ SSL_OBJ_X509_CERT, device_cert, NULL)) != SSL_OK) ++ goto error; ++ } ++ ++ if (product_cert) /* test chaining */ ++ { ++ if ((ret = ssl_obj_load(ssl_ctx, ++ SSL_OBJ_X509_CERT, product_cert, NULL)) != SSL_OK) ++ goto error; ++ } ++ ++ if (ca_cert) /* test adding certificate authorities */ ++ { ++ if ((ret = ssl_obj_load(ssl_ctx, ++ SSL_OBJ_X509_CACERT, ca_cert, NULL)) != SSL_OK) ++ goto error; ++ } ++ ++#ifndef WIN32 ++ pthread_create(&thread, NULL, ++ (void *(*)(void *))do_client, (void *)&client_data); ++ pthread_detach(thread); ++#else ++ CreateThread(NULL, 1024, (LPTHREAD_START_ROUTINE)do_client, ++ (LPVOID)&client_data, 0, NULL); ++#endif ++ ++ for (;;) ++ { ++ int client_fd, size = 0; ++ SSL *ssl; ++ ++ /* Wait for a client to connect */ ++ if ((client_fd = accept(server_fd, ++ (struct sockaddr *)&client_addr, &clnt_len)) < 0) ++ { ++ ret = SSL_ERROR_SOCK_SETUP_FAILURE; ++ goto error; ++ } ++ ++ /* we are ready to go */ ++ ssl = ssl_server_new(ssl_ctx, client_fd); ++ while ((size = ssl_read(ssl, &read_buf)) == SSL_OK); ++ SOCKET_CLOSE(client_fd); ++ ++ if (size < SSL_OK) /* got some alert or something nasty */ ++ { ++ ret = size; ++ ++ if (ret == SSL_ERROR_CONN_LOST) ++ { ++ ret = SSL_OK; ++ continue; ++ } ++ ++ break; /* we've got a problem */ ++ } ++ else /* looks more promising */ ++ { ++ if (strstr("hello client", (char *)read_buf) == NULL) ++ { ++ printf("SSL server test \"%s\" passed\n", testname); ++ TTY_FLUSH(); ++ ret = 0; ++ break; ++ } ++ } ++ ++ ssl_free(ssl); ++ } ++ ++ SOCKET_CLOSE(server_fd); ++ ++error: ++ ssl_ctx_free(ssl_ctx); ++ return ret; ++} ++ ++int SSL_server_tests(void) ++{ ++ int ret = -1; ++ struct stat stat_buf; ++ SVR_CTX svr_test_ctx; ++ memset(&svr_test_ctx, 0, sizeof(SVR_CTX)); ++ ++ printf("### starting server tests\n"); TTY_FLUSH(); ++ ++ /* Go through the algorithms */ ++ ++ /* ++ * TLS1 client hello ++ */ ++ if ((ret = SSL_server_test("TLSv1", "-cipher RC4-SHA -tls1", ++ NULL, NULL, NULL, NULL, NULL, DEFAULT_SVR_OPTION))) ++ goto cleanup; ++ ++ /* ++ * AES128-SHA ++ */ ++ if ((ret = SSL_server_test("AES256-SHA", "-cipher AES128-SHA", ++ DEFAULT_CERT, NULL, DEFAULT_KEY, NULL, NULL, ++ DEFAULT_SVR_OPTION))) ++ goto cleanup; ++ ++ /* ++ * AES256-SHA ++ */ ++ if ((ret = SSL_server_test("AES256-SHA", "-cipher AES128-SHA", ++ DEFAULT_CERT, NULL, DEFAULT_KEY, NULL, NULL, ++ DEFAULT_SVR_OPTION))) ++ goto cleanup; ++ ++ /* ++ * RC4-SHA ++ */ ++ if ((ret = SSL_server_test("RC4-SHA", "-cipher RC4-SHA", ++ DEFAULT_CERT, NULL, DEFAULT_KEY, NULL, NULL, ++ DEFAULT_SVR_OPTION))) ++ goto cleanup; ++ ++ /* ++ * RC4-MD5 ++ */ ++ if ((ret = SSL_server_test("RC4-MD5", "-cipher RC4-MD5", ++ DEFAULT_CERT, NULL, DEFAULT_KEY, NULL, NULL, ++ DEFAULT_SVR_OPTION))) ++ goto cleanup; ++ ++ /* ++ * Session Reuse ++ * all the session id's should match for session resumption. ++ */ ++ if ((ret = SSL_server_test("Session Reuse", ++ "-cipher RC4-SHA -reconnect", ++ DEFAULT_CERT, NULL, DEFAULT_KEY, NULL, NULL, ++ DEFAULT_SVR_OPTION))) ++ goto cleanup; ++ ++ /* ++ * 512 bit RSA key ++ */ ++ if ((ret = SSL_server_test("512 bit key", "-cipher RC4-SHA", ++ "../ssl/test/axTLS.x509_512.cer", NULL, ++ "../ssl/test/axTLS.key_512", ++ NULL, NULL, DEFAULT_SVR_OPTION))) ++ goto cleanup; ++ ++ /* ++ * 1024 bit RSA key (check certificate chaining) ++ */ ++ if ((ret = SSL_server_test("1024 bit key", ++ "-cipher RC4-SHA", ++ "../ssl/test/axTLS.x509_device.cer", ++ "../ssl/test/axTLS.x509_512.cer", ++ "../ssl/test/axTLS.device_key", ++ NULL, NULL, DEFAULT_SVR_OPTION))) ++ goto cleanup; ++ ++ /* ++ * 2048 bit RSA key ++ */ ++ if ((ret = SSL_server_test("2048 bit key", ++ "-cipher RC4-SHA", ++ "../ssl/test/axTLS.x509_2048.cer", NULL, ++ "../ssl/test/axTLS.key_2048", ++ NULL, NULL, DEFAULT_SVR_OPTION))) ++ goto cleanup; ++ ++ /* ++ * 4096 bit RSA key ++ */ ++ if ((ret = SSL_server_test("4096 bit key", ++ "-cipher RC4-SHA", ++ "../ssl/test/axTLS.x509_4096.cer", NULL, ++ "../ssl/test/axTLS.key_4096", ++ NULL, NULL, DEFAULT_SVR_OPTION))) ++ goto cleanup; ++ ++ /* ++ * Client Verification ++ */ ++ if ((ret = SSL_server_test("Client Verification", ++ "-cipher RC4-SHA -tls1 " ++ "-cert ../ssl/test/axTLS.x509_2048.pem " ++ "-key ../ssl/test/axTLS.key_2048.pem ", ++ NULL, NULL, NULL, ++ "../ssl/test/axTLS.ca_x509.cer", NULL, ++ DEFAULT_SVR_OPTION|SSL_CLIENT_AUTHENTICATION))) ++ goto cleanup; ++ ++ /* this test should fail */ ++ if (stat("../ssl/test/axTLS.x509_bad_before.pem", &stat_buf) >= 0) ++ { ++ if ((ret = SSL_server_test("Error: Bad Before Cert", ++ "-cipher RC4-SHA -tls1 " ++ "-cert ../ssl/test/axTLS.x509_bad_before.pem " ++ "-key ../ssl/test/axTLS.key_512.pem ", ++ NULL, NULL, NULL, ++ "../ssl/test/axTLS.ca_x509.cer", NULL, ++ DEFAULT_SVR_OPTION|SSL_CLIENT_AUTHENTICATION)) != ++ SSL_X509_ERROR(X509_VFY_ERROR_NOT_YET_VALID)) ++ goto cleanup; ++ ++ printf("SSL server test \"%s\" passed\n", "Bad Before Cert"); ++ TTY_FLUSH(); ++ ret = 0; /* is ok */ ++ } ++ ++ /* this test should fail */ ++ if ((ret = SSL_server_test("Error: Bad After Cert", ++ "-cipher RC4-SHA -tls1 " ++ "-cert ../ssl/test/axTLS.x509_bad_after.pem " ++ "-key ../ssl/test/axTLS.key_512.pem ", ++ NULL, NULL, NULL, ++ "../ssl/test/axTLS.ca_x509.cer", NULL, ++ DEFAULT_SVR_OPTION|SSL_CLIENT_AUTHENTICATION)) != ++ SSL_X509_ERROR(X509_VFY_ERROR_EXPIRED)) ++ goto cleanup; ++ ++ printf("SSL server test \"%s\" passed\n", "Bad After Cert"); ++ TTY_FLUSH(); ++ ++ /* ++ * No trusted cert ++ */ ++ if ((ret = SSL_server_test("Error: No trusted certificate", ++ "-cipher RC4-SHA -tls1 " ++ "-cert ../ssl/test/axTLS.x509_512.pem " ++ "-key ../ssl/test/axTLS.key_512.pem ", ++ NULL, NULL, NULL, ++ NULL, NULL, ++ DEFAULT_SVR_OPTION|SSL_CLIENT_AUTHENTICATION)) != ++ SSL_X509_ERROR(X509_VFY_ERROR_NO_TRUSTED_CERT)) ++ goto cleanup; ++ ++ printf("SSL server test \"%s\" passed\n", "No trusted certificate"); ++ TTY_FLUSH(); ++ ++ /* ++ * Self-signed (from the server) ++ */ ++ if ((ret = SSL_server_test("Error: Self-signed certificate (from server)", ++ "-cipher RC4-SHA -tls1 " ++ "-cert ../ssl/test/axTLS.x509_512.pem " ++ "-key ../ssl/test/axTLS.key_512.pem " ++ "-CAfile ../ssl/test/axTLS.ca_x509.pem ", ++ NULL, NULL, NULL, ++ NULL, NULL, ++ DEFAULT_SVR_OPTION|SSL_CLIENT_AUTHENTICATION)) != ++ SSL_X509_ERROR(X509_VFY_ERROR_SELF_SIGNED)) ++ goto cleanup; ++ ++ printf("SSL server test \"%s\" passed\n", ++ "Self-signed certificate (from server)"); ++ TTY_FLUSH(); ++ ++ /* ++ * Self-signed (from the client) ++ */ ++ if ((ret = SSL_server_test("Self-signed certificate (from client)", ++ "-cipher RC4-SHA -tls1 " ++ "-cert ../ssl/test/axTLS.x509_512.pem " ++ "-key ../ssl/test/axTLS.key_512.pem ", ++ NULL, NULL, NULL, ++ "../ssl/test/axTLS.ca_x509.cer", ++ NULL, ++ DEFAULT_SVR_OPTION|SSL_CLIENT_AUTHENTICATION))) ++ goto cleanup; ++ ++ /* ++ * Key in PEM format ++ */ ++ if ((ret = SSL_server_test("Key in PEM format", ++ "-cipher RC4-SHA", ++ "../ssl/test/axTLS.x509_512.cer", NULL, ++ "../ssl/test/axTLS.key_512.pem", NULL, ++ NULL, DEFAULT_SVR_OPTION))) ++ goto cleanup; ++ ++ /* ++ * Cert in PEM format ++ */ ++ if ((ret = SSL_server_test("Cert in PEM format", ++ "-cipher RC4-SHA", ++ "../ssl/test/axTLS.x509_512.pem", NULL, ++ "../ssl/test/axTLS.key_512.pem", NULL, ++ NULL, DEFAULT_SVR_OPTION))) ++ goto cleanup; ++ ++ /* ++ * Cert chain in PEM format ++ */ ++ if ((ret = SSL_server_test("Cert chain in PEM format", ++ "-cipher RC4-SHA", ++ "../ssl/test/axTLS.x509_device.pem", ++ NULL, "../ssl/test/axTLS.device_key.pem", ++ "../ssl/test/axTLS.ca_x509.pem", NULL, DEFAULT_SVR_OPTION))) ++ goto cleanup; ++ ++ /* ++ * AES128 Encrypted key ++ */ ++ if ((ret = SSL_server_test("AES128 encrypted key", ++ "-cipher RC4-SHA", ++ "../ssl/test/axTLS.x509_aes128.pem", NULL, ++ "../ssl/test/axTLS.key_aes128.pem", ++ NULL, "abcd", DEFAULT_SVR_OPTION))) ++ goto cleanup; ++ ++ /* ++ * AES256 Encrypted key ++ */ ++ if ((ret = SSL_server_test("AES256 encrypted key", ++ "-cipher RC4-SHA", ++ "../ssl/test/axTLS.x509_aes256.pem", NULL, ++ "../ssl/test/axTLS.key_aes256.pem", ++ NULL, "abcd", DEFAULT_SVR_OPTION))) ++ goto cleanup; ++ ++ /* ++ * AES128 Encrypted invalid key ++ */ ++ if ((ret = SSL_server_test("AES128 encrypted invalid key", ++ "-cipher RC4-SHA", ++ "../ssl/test/axTLS.x509_aes128.pem", NULL, ++ "../ssl/test/axTLS.key_aes128.pem", ++ NULL, "xyz", DEFAULT_SVR_OPTION)) != SSL_ERROR_INVALID_KEY) ++ goto cleanup; ++ ++ printf("SSL server test \"%s\" passed\n", "AES128 encrypted invalid key"); ++ TTY_FLUSH(); ++ ++ /* ++ * PKCS#8 key (encrypted) ++ */ ++ if ((ret = SSL_server_test("pkcs#8 encrypted", "-cipher RC4-SHA", ++ DEFAULT_CERT, NULL, "../ssl/test/axTLS.encrypted.p8", ++ NULL, "abcd", DEFAULT_SVR_OPTION))) ++ goto cleanup; ++ ++ /* ++ * PKCS#8 key (unencrypted) ++ */ ++ if ((ret = SSL_server_test("pkcs#8 unencrypted", "-cipher RC4-SHA", ++ DEFAULT_CERT, NULL, "../ssl/test/axTLS.unencrypted.p8", ++ NULL, NULL, DEFAULT_SVR_OPTION))) ++ goto cleanup; ++ ++ /* ++ * PKCS#12 key/certificate ++ */ ++ if ((ret = SSL_server_test("pkcs#12 with CA", "-cipher RC4-SHA", ++ NULL, NULL, "../ssl/test/axTLS.withCA.p12", ++ NULL, "abcd", DEFAULT_SVR_OPTION))) ++ goto cleanup; ++ ++ if ((ret = SSL_server_test("pkcs#12 no CA", "-cipher RC4-SHA", ++ DEFAULT_CERT, NULL, "../ssl/test/axTLS.withoutCA.p12", ++ NULL, "abcd", DEFAULT_SVR_OPTION))) ++ goto cleanup; ++ ++ ret = 0; ++ ++cleanup: ++ if (ret) ++ { ++ printf("Error: A server test failed\n"); ++ ssl_display_error(ret); ++ exit(1); ++ } ++ else ++ { ++ printf("All server tests passed\n"); TTY_FLUSH(); ++ } ++ ++ return ret; ++} ++ ++/************************************************************************** ++ * SSL Client Testing ++ * ++ **************************************************************************/ ++typedef struct ++{ ++ uint8_t session_id[SSL_SESSION_ID_SIZE]; ++#ifndef WIN32 ++ pthread_t server_thread; ++#endif ++ int start_server; ++ int stop_server; ++ int do_reneg; ++} CLNT_SESSION_RESUME_CTX; ++ ++typedef struct ++{ ++ const char *testname; ++ const char *openssl_option; ++} server_t; ++ ++static void do_server(server_t *svr) ++{ ++ char openssl_buf[2048]; ++#ifndef WIN32 ++ pthread_setcanceltype(PTHREAD_CANCEL_ASYNCHRONOUS, NULL); ++#endif ++ sprintf(openssl_buf, "openssl s_server -tls1 " ++ "-accept %d -quiet %s ", g_port, svr->openssl_option); ++ system(openssl_buf); ++} ++ ++static int SSL_client_test( ++ const char *test, ++ SSL_CTX **ssl_ctx, ++ const char *openssl_option, ++ CLNT_SESSION_RESUME_CTX *sess_resume, ++ uint32_t client_options, ++ const char *private_key, ++ const char *password, ++ const char *cert) ++{ ++ server_t server_data; ++ SSL *ssl = NULL; ++ int client_fd = -1; ++ uint8_t *session_id = NULL; ++ int ret = 1; ++#ifndef WIN32 ++ pthread_t thread; ++#endif ++ ++ if (sess_resume == NULL || sess_resume->start_server) ++ { ++ g_port++; ++ server_data.openssl_option = openssl_option; ++ ++#ifndef WIN32 ++ pthread_create(&thread, NULL, ++ (void *(*)(void *))do_server, (void *)&server_data); ++ pthread_detach(thread); ++#else ++ CreateThread(NULL, 1024, (LPTHREAD_START_ROUTINE)do_server, ++ (LPVOID)&server_data, 0, NULL); ++#endif ++ } ++ ++ usleep(200000); /* allow server to start */ ++ ++ if (*ssl_ctx == NULL) ++ { ++ if (private_key) ++ { ++ client_options |= SSL_NO_DEFAULT_KEY; ++ } ++ ++ if ((*ssl_ctx = ssl_ctx_new( ++ client_options, SSL_DEFAULT_CLNT_SESS)) == NULL) ++ { ++ ret = SSL_ERROR_INVALID_KEY; ++ goto client_test_exit; ++ } ++ ++ if (private_key) ++ { ++ int obj_type = SSL_OBJ_RSA_KEY; ++ ++ if (strstr(private_key, ".p8")) ++ obj_type = SSL_OBJ_PKCS8; ++ else if (strstr(private_key, ".p12")) ++ obj_type = SSL_OBJ_PKCS12; ++ ++ if (ssl_obj_load(*ssl_ctx, obj_type, private_key, password)) ++ { ++ ret = SSL_ERROR_INVALID_KEY; ++ goto client_test_exit; ++ } ++ } ++ ++ if (cert) ++ { ++ if ((ret = ssl_obj_load(*ssl_ctx, ++ SSL_OBJ_X509_CERT, cert, NULL)) != SSL_OK) ++ { ++ printf("could not add cert %s (%d)\n", cert, ret); ++ TTY_FLUSH(); ++ goto client_test_exit; ++ } ++ } ++ ++ if (ssl_obj_load(*ssl_ctx, SSL_OBJ_X509_CACERT, ++ "../ssl/test/axTLS.ca_x509.cer", NULL)) ++ { ++ printf("could not add cert auth\n"); TTY_FLUSH(); ++ goto client_test_exit; ++ } ++ } ++ ++ if (sess_resume && !sess_resume->start_server) ++ { ++ session_id = sess_resume->session_id; ++ } ++ ++ if ((client_fd = client_socket_init(g_port)) < 0) ++ { ++ printf("could not start socket on %d\n", g_port); TTY_FLUSH(); ++ goto client_test_exit; ++ } ++ ++ ssl = ssl_client_new(*ssl_ctx, client_fd, session_id, sizeof(session_id)); ++ ++ /* check the return status */ ++ if ((ret = ssl_handshake_status(ssl))) ++ goto client_test_exit; ++ ++ /* renegotiate client */ ++ if (sess_resume && sess_resume->do_reneg) ++ { ++ if (ssl_renegotiate(ssl) < 0) ++ goto client_test_exit; ++ } ++ ++ if (sess_resume) ++ { ++ memcpy(sess_resume->session_id, ++ ssl_get_session_id(ssl), SSL_SESSION_ID_SIZE); ++ } ++ ++ if (IS_SET_SSL_FLAG(SSL_SERVER_VERIFY_LATER) && ++ (ret = ssl_verify_cert(ssl))) ++ { ++ goto client_test_exit; ++ } ++ ++ ssl_write(ssl, (uint8_t *)"hello world\n", 13); ++ if (sess_resume) ++ { ++ const uint8_t *sess_id = ssl_get_session_id(ssl); ++ int i; ++ ++ printf(" Session-ID: "); ++ for (i = 0; i < SSL_SESSION_ID_SIZE; i++) ++ { ++ printf("%02X", sess_id[i]); ++ } ++ printf("\n"); ++ TTY_FLUSH(); ++ } ++ ++ ret = 0; ++ ++client_test_exit: ++ ssl_free(ssl); ++ SOCKET_CLOSE(client_fd); ++ usleep(200000); /* allow openssl to say something */ ++ ++ if (sess_resume) ++ { ++ if (sess_resume->stop_server) ++ { ++ ssl_ctx_free(*ssl_ctx); ++ *ssl_ctx = NULL; ++#ifndef WIN32 ++ pthread_cancel(sess_resume->server_thread); ++#endif ++ } ++ else if (sess_resume->start_server) ++ { ++#ifndef WIN32 ++ sess_resume->server_thread = thread; ++#endif ++ } ++ } ++ else ++ { ++ ssl_ctx_free(*ssl_ctx); ++ *ssl_ctx = NULL; ++#ifndef WIN32 ++ pthread_cancel(thread); ++#endif ++ } ++ ++ if (ret == 0) ++ { ++ printf("SSL client test \"%s\" passed\n", test); ++ TTY_FLUSH(); ++ } ++ ++ return ret; ++} ++ ++int SSL_client_tests(void) ++{ ++ int ret = -1; ++ SSL_CTX *ssl_ctx = NULL; ++ CLNT_SESSION_RESUME_CTX sess_resume; ++ memset(&sess_resume, 0, sizeof(CLNT_SESSION_RESUME_CTX)); ++ ++ sess_resume.start_server = 1; ++ printf("### starting client tests\n"); ++ ++ if ((ret = SSL_client_test("512 bit key", ++ &ssl_ctx, ++ "-cert ../ssl/test/axTLS.x509_512.pem " ++ "-key ../ssl/test/axTLS.key_512.pem", &sess_resume, ++ DEFAULT_CLNT_OPTION, NULL, NULL, NULL))) ++ goto cleanup; ++ ++ /* all the session id's should match for session resumption */ ++ sess_resume.start_server = 0; ++ if ((ret = SSL_client_test("Client session resumption #1", ++ &ssl_ctx, NULL, &sess_resume, ++ DEFAULT_CLNT_OPTION, NULL, NULL, NULL))) ++ goto cleanup; ++ ++ sess_resume.do_reneg = 1; ++ if ((ret = SSL_client_test("Client renegotiation", ++ &ssl_ctx, NULL, &sess_resume, ++ DEFAULT_CLNT_OPTION, NULL, NULL, NULL))) ++ goto cleanup; ++ sess_resume.do_reneg = 0; ++ ++ sess_resume.stop_server = 1; ++ if ((ret = SSL_client_test("Client session resumption #2", ++ &ssl_ctx, NULL, &sess_resume, ++ DEFAULT_CLNT_OPTION, NULL, NULL, NULL))) ++ goto cleanup; ++ ++ if ((ret = SSL_client_test("1024 bit key", ++ &ssl_ctx, ++ "-cert ../ssl/test/axTLS.x509_1024.pem " ++ "-key ../ssl/test/axTLS.key_1024.pem", NULL, ++ DEFAULT_CLNT_OPTION, NULL, NULL, NULL))) ++ goto cleanup; ++ ++ if ((ret = SSL_client_test("2048 bit key", ++ &ssl_ctx, ++ "-cert ../ssl/test/axTLS.x509_2048.pem " ++ "-key ../ssl/test/axTLS.key_2048.pem", NULL, ++ DEFAULT_CLNT_OPTION, NULL, NULL, NULL))) ++ goto cleanup; ++ ++ if ((ret = SSL_client_test("4096 bit key", ++ &ssl_ctx, ++ "-cert ../ssl/test/axTLS.x509_4096.pem " ++ "-key ../ssl/test/axTLS.key_4096.pem", NULL, ++ DEFAULT_CLNT_OPTION, NULL, NULL, NULL))) ++ goto cleanup; ++ ++ if ((ret = SSL_client_test("Server cert chaining", ++ &ssl_ctx, ++ "-cert ../ssl/test/axTLS.x509_device.pem " ++ "-key ../ssl/test/axTLS.device_key.pem " ++ "-CAfile ../ssl/test/axTLS.x509_512.pem ", NULL, ++ DEFAULT_CLNT_OPTION, NULL, NULL, NULL))) ++ goto cleanup; ++ ++ /* Check the server can verify the client */ ++ if ((ret = SSL_client_test("Client peer authentication", ++ &ssl_ctx, ++ "-cert ../ssl/test/axTLS.x509_2048.pem " ++ "-key ../ssl/test/axTLS.key_2048.pem " ++ "-CAfile ../ssl/test/axTLS.ca_x509.pem " ++ "-verify 1 ", NULL, DEFAULT_CLNT_OPTION, ++ "../ssl/test/axTLS.key_1024", NULL, ++ "../ssl/test/axTLS.x509_1024.cer"))) ++ goto cleanup; ++ ++ /* Should get an "ERROR" from openssl (as the handshake fails as soon as ++ * the certificate verification fails) */ ++ if ((ret = SSL_client_test("Error: Expired cert (verify now)", ++ &ssl_ctx, ++ "-cert ../ssl/test/axTLS.x509_bad_after.pem " ++ "-key ../ssl/test/axTLS.key_512.pem", NULL, ++ DEFAULT_CLNT_OPTION, NULL, NULL, NULL)) != ++ SSL_X509_ERROR(X509_VFY_ERROR_EXPIRED)) ++ { ++ printf("*** Error: %d\n", ret); ++ goto cleanup; ++ } ++ ++ printf("SSL client test \"Expired cert (verify now)\" passed\n"); ++ ++ /* There is no "ERROR" from openssl */ ++ if ((ret = SSL_client_test("Error: Expired cert (verify later)", ++ &ssl_ctx, ++ "-cert ../ssl/test/axTLS.x509_bad_after.pem " ++ "-key ../ssl/test/axTLS.key_512.pem", NULL, ++ DEFAULT_CLNT_OPTION|SSL_SERVER_VERIFY_LATER, NULL, ++ NULL, NULL)) != SSL_X509_ERROR(X509_VFY_ERROR_EXPIRED)) ++ { ++ printf("*** Error: %d\n", ret); ++ goto cleanup; ++ } ++ ++ printf("SSL client test \"Expired cert (verify later)\" passed\n"); ++ ret = 0; ++ ++cleanup: ++ if (ret) ++ { ++ ssl_display_error(ret); ++ printf("Error: A client test failed\n"); ++ exit(1); ++ } ++ else ++ { ++ printf("All client tests passed\n"); TTY_FLUSH(); ++ } ++ ++ return ret; ++} ++ ++/************************************************************************** ++ * SSL Basic Testing (test a big packet handshake) ++ * ++ **************************************************************************/ ++static uint8_t basic_buf[256*1024]; ++ ++static void do_basic(void) ++{ ++ int client_fd; ++ SSL *ssl_clnt; ++ SSL_CTX *ssl_clnt_ctx = ssl_ctx_new( ++ DEFAULT_CLNT_OPTION, SSL_DEFAULT_CLNT_SESS); ++ usleep(200000); /* allow server to start */ ++ ++ if ((client_fd = client_socket_init(g_port)) < 0) ++ goto error; ++ ++ if (ssl_obj_load(ssl_clnt_ctx, SSL_OBJ_X509_CACERT, ++ "../ssl/test/axTLS.ca_x509.cer", NULL)) ++ goto error; ++ ++ ssl_clnt = ssl_client_new(ssl_clnt_ctx, client_fd, NULL, 0); ++ ++ /* check the return status */ ++ if (ssl_handshake_status(ssl_clnt) < 0) ++ { ++ printf("YA YA\n"); ++ ssl_display_error(ssl_handshake_status(ssl_clnt)); ++ goto error; ++ } ++ ++ ssl_write(ssl_clnt, basic_buf, sizeof(basic_buf)); ++ ssl_free(ssl_clnt); ++ ++error: ++ ssl_ctx_free(ssl_clnt_ctx); ++ SOCKET_CLOSE(client_fd); ++ ++ /* exit this thread */ ++} ++ ++static int SSL_basic_test(void) ++{ ++ int server_fd, client_fd, ret = 0, size = 0, offset = 0; ++ SSL_CTX *ssl_svr_ctx = NULL; ++ struct sockaddr_in client_addr; ++ uint8_t *read_buf; ++ socklen_t clnt_len = sizeof(client_addr); ++ SSL *ssl_svr; ++#ifndef WIN32 ++ pthread_t thread; ++#endif ++ memset(basic_buf, 0xA5, sizeof(basic_buf)/2); ++ memset(&basic_buf[sizeof(basic_buf)/2], 0x5A, sizeof(basic_buf)/2); ++ ++ if ((server_fd = server_socket_init(&g_port)) < 0) ++ goto error; ++ ++ ssl_svr_ctx = ssl_ctx_new(DEFAULT_SVR_OPTION, SSL_DEFAULT_SVR_SESS); ++ ++#ifndef WIN32 ++ pthread_create(&thread, NULL, ++ (void *(*)(void *))do_basic, NULL); ++ pthread_detach(thread); ++#else ++ CreateThread(NULL, 1024, (LPTHREAD_START_ROUTINE)do_basic, NULL, 0, NULL); ++#endif ++ ++ /* Wait for a client to connect */ ++ if ((client_fd = accept(server_fd, ++ (struct sockaddr *) &client_addr, &clnt_len)) < 0) ++ { ++ ret = SSL_ERROR_SOCK_SETUP_FAILURE; ++ goto error; ++ } ++ ++ /* we are ready to go */ ++ ssl_svr = ssl_server_new(ssl_svr_ctx, client_fd); ++ ++ do ++ { ++ while ((size = ssl_read(ssl_svr, &read_buf)) == SSL_OK); ++ ++ if (size < SSL_OK) /* got some alert or something nasty */ ++ { ++ printf("Server "); ++ ssl_display_error(size); ++ ret = size; ++ break; ++ } ++ else /* looks more promising */ ++ { ++ if (memcmp(read_buf, &basic_buf[offset], size) != 0) ++ { ++ ret = SSL_NOT_OK; ++ break; ++ } ++ } ++ ++ offset += size; ++ } while (offset < sizeof(basic_buf)); ++ ++ printf(ret == SSL_OK && offset == sizeof(basic_buf) ? ++ "SSL basic test passed\n" : ++ "SSL basic test failed\n"); ++ TTY_FLUSH(); ++ ++ ssl_free(ssl_svr); ++ SOCKET_CLOSE(server_fd); ++ SOCKET_CLOSE(client_fd); ++ ++error: ++ ssl_ctx_free(ssl_svr_ctx); ++ return ret; ++} ++ ++#if !defined(WIN32) && defined(CONFIG_SSL_CTX_MUTEXING) ++/************************************************************************** ++ * Multi-Threading Tests ++ * ++ **************************************************************************/ ++#define NUM_THREADS 100 ++ ++typedef struct ++{ ++ SSL_CTX *ssl_clnt_ctx; ++ int port; ++ int thread_id; ++} multi_t; ++ ++void do_multi_clnt(multi_t *multi_data) ++{ ++ int res = 1, client_fd, i; ++ SSL *ssl = NULL; ++ char tmp[5]; ++ ++ if ((client_fd = client_socket_init(multi_data->port)) < 0) ++ goto client_test_exit; ++ ++ sleep(1); ++ ssl = ssl_client_new(multi_data->ssl_clnt_ctx, client_fd, NULL, 0); ++ ++ if ((res = ssl_handshake_status(ssl))) ++ { ++ printf("Client "); ++ ssl_display_error(res); ++ goto client_test_exit; ++ } ++ ++ sprintf(tmp, "%d\n", multi_data->thread_id); ++ for (i = 0; i < 10; i++) ++ ssl_write(ssl, (uint8_t *)tmp, strlen(tmp)+1); ++ ++client_test_exit: ++ ssl_free(ssl); ++ SOCKET_CLOSE(client_fd); ++ free(multi_data); ++} ++ ++void do_multi_svr(SSL *ssl) ++{ ++ uint8_t *read_buf; ++ int *res_ptr = malloc(sizeof(int)); ++ int res; ++ ++ for (;;) ++ { ++ res = ssl_read(ssl, &read_buf); ++ ++ /* kill the client */ ++ if (res != SSL_OK) ++ { ++ if (res == SSL_ERROR_CONN_LOST) ++ { ++ SOCKET_CLOSE(ssl->client_fd); ++ ssl_free(ssl); ++ break; ++ } ++ else if (res > 0) ++ { ++ /* do nothing */ ++ } ++ else /* some problem */ ++ { ++ printf("Server "); ++ ssl_display_error(res); ++ goto error; ++ } ++ } ++ } ++ ++ res = SSL_OK; ++error: ++ *res_ptr = res; ++ pthread_exit(res_ptr); ++} ++ ++int multi_thread_test(void) ++{ ++ int server_fd = -1; ++ SSL_CTX *ssl_server_ctx; ++ SSL_CTX *ssl_clnt_ctx; ++ pthread_t clnt_threads[NUM_THREADS]; ++ pthread_t svr_threads[NUM_THREADS]; ++ int i, res = 0; ++ struct sockaddr_in client_addr; ++ socklen_t clnt_len = sizeof(client_addr); ++ ++ printf("Do multi-threading test (takes a minute)\n"); ++ ++ ssl_server_ctx = ssl_ctx_new(DEFAULT_SVR_OPTION, SSL_DEFAULT_SVR_SESS); ++ ssl_clnt_ctx = ssl_ctx_new(DEFAULT_CLNT_OPTION, SSL_DEFAULT_CLNT_SESS); ++ ++ if (ssl_obj_load(ssl_clnt_ctx, SSL_OBJ_X509_CACERT, ++ "../ssl/test/axTLS.ca_x509.cer", NULL)) ++ goto error; ++ ++ if ((server_fd = server_socket_init(&g_port)) < 0) ++ goto error; ++ ++ for (i = 0; i < NUM_THREADS; i++) ++ { ++ multi_t *multi_data = (multi_t *)malloc(sizeof(multi_t)); ++ multi_data->ssl_clnt_ctx = ssl_clnt_ctx; ++ multi_data->port = g_port; ++ multi_data->thread_id = i+1; ++ pthread_create(&clnt_threads[i], NULL, ++ (void *(*)(void *))do_multi_clnt, (void *)multi_data); ++ pthread_detach(clnt_threads[i]); ++ } ++ ++ for (i = 0; i < NUM_THREADS; i++) ++ { ++ SSL *ssl_svr; ++ int client_fd = accept(server_fd, ++ (struct sockaddr *)&client_addr, &clnt_len); ++ ++ if (client_fd < 0) ++ goto error; ++ ++ ssl_svr = ssl_server_new(ssl_server_ctx, client_fd); ++ ++ pthread_create(&svr_threads[i], NULL, ++ (void *(*)(void *))do_multi_svr, (void *)ssl_svr); ++ } ++ ++ /* make sure we've run all of the threads */ ++ for (i = 0; i < NUM_THREADS; i++) ++ { ++ void *thread_res; ++ pthread_join(svr_threads[i], &thread_res); ++ ++ if (*((int *)thread_res) != 0) ++ res = 1; ++ ++ free(thread_res); ++ } ++ ++ if (res) ++ goto error; ++ ++ printf("Multi-thread test passed (%d)\n", NUM_THREADS); ++error: ++ ssl_ctx_free(ssl_server_ctx); ++ ssl_ctx_free(ssl_clnt_ctx); ++ SOCKET_CLOSE(server_fd); ++ return res; ++} ++#endif /* !defined(WIN32) && defined(CONFIG_SSL_CTX_MUTEXING) */ ++ ++/************************************************************************** ++ * Header issue ++ * ++ **************************************************************************/ ++static void do_header_issue(void) ++{ ++ char axtls_buf[2048]; ++#ifndef WIN32 ++ pthread_setcanceltype(PTHREAD_CANCEL_ASYNCHRONOUS, NULL); ++#endif ++ sprintf(axtls_buf, "./axssl s_client -connect localhost:%d", g_port); ++ system(axtls_buf); ++} ++ ++static int header_issue(void) ++{ ++ FILE *f = fopen("../ssl/test/header_issue.dat", "r"); ++ int server_fd = -1, client_fd = -1, ret = 1; ++ uint8_t buf[2048]; ++ int size = 0; ++ struct sockaddr_in client_addr; ++ socklen_t clnt_len = sizeof(client_addr); ++#ifndef WIN32 ++ pthread_t thread; ++#endif ++ ++ if (f == NULL || (server_fd = server_socket_init(&g_port)) < 0) ++ goto error; ++ ++#ifndef WIN32 ++ pthread_create(&thread, NULL, ++ (void *(*)(void *))do_header_issue, NULL); ++ pthread_detach(thread); ++#else ++ CreateThread(NULL, 1024, (LPTHREAD_START_ROUTINE)do_header_issue, ++ NULL, 0, NULL); ++#endif ++ if ((client_fd = accept(server_fd, ++ (struct sockaddr *) &client_addr, &clnt_len)) < 0) ++ { ++ ret = SSL_ERROR_SOCK_SETUP_FAILURE; ++ goto error; ++ } ++ ++ size = fread(buf, 1, sizeof(buf), f); ++ SOCKET_WRITE(client_fd, buf, size); ++ usleep(200000); ++ ++ ret = 0; ++error: ++ fclose(f); ++ SOCKET_CLOSE(client_fd); ++ SOCKET_CLOSE(server_fd); ++ TTY_FLUSH(); ++ system("killall axssl"); ++ return ret; ++} ++ ++/************************************************************************** ++ * main() ++ * ++ **************************************************************************/ ++int main(int argc, char *argv[]) ++{ ++ int ret = 1; ++ BI_CTX *bi_ctx; ++ int fd; ++ ++#ifdef WIN32 ++ WSADATA wsaData; ++ WORD wVersionRequested = MAKEWORD(2, 2); ++ WSAStartup(wVersionRequested, &wsaData); ++ fd = _open("test_result.txt", O_WRONLY|O_TEMPORARY|O_CREAT, _S_IWRITE); ++ dup2(fd, 2); /* write stderr to this file */ ++#else ++ fd = open("/dev/null", O_WRONLY); /* write stderr to /dev/null */ ++ signal(SIGPIPE, SIG_IGN); /* ignore pipe errors */ ++ dup2(fd, 2); ++#endif ++ ++ /* can't do testing in this mode */ ++#if defined CONFIG_SSL_GENERATE_X509_CERT ++ printf("Error: Must compile with default key/certificates\n"); ++ exit(1); ++#endif ++ ++ bi_ctx = bi_initialize(); ++ ++ if (AES_test(bi_ctx)) ++ { ++ printf("AES tests failed\n"); ++ goto cleanup; ++ } ++ TTY_FLUSH(); ++ ++ if (RC4_test(bi_ctx)) ++ { ++ printf("RC4 tests failed\n"); ++ goto cleanup; ++ } ++ TTY_FLUSH(); ++ ++ if (MD5_test(bi_ctx)) ++ { ++ printf("MD5 tests failed\n"); ++ goto cleanup; ++ } ++ TTY_FLUSH(); ++ ++ if (SHA1_test(bi_ctx)) ++ { ++ printf("SHA1 tests failed\n"); ++ goto cleanup; ++ } ++ TTY_FLUSH(); ++ ++ if (HMAC_test(bi_ctx)) ++ { ++ printf("HMAC tests failed\n"); ++ goto cleanup; ++ } ++ TTY_FLUSH(); ++ ++ if (BIGINT_test(bi_ctx)) ++ { ++ printf("BigInt tests failed!\n"); ++ goto cleanup; ++ } ++ TTY_FLUSH(); ++ ++ bi_terminate(bi_ctx); ++ ++ if (RSA_test()) ++ { ++ printf("RSA tests failed\n"); ++ goto cleanup; ++ } ++ TTY_FLUSH(); ++ ++ if (cert_tests()) ++ { ++ printf("CERT tests failed\n"); ++ goto cleanup; ++ } ++ TTY_FLUSH(); ++ ++#if !defined(WIN32) && defined(CONFIG_SSL_CTX_MUTEXING) ++ if (multi_thread_test()) ++ goto cleanup; ++#endif ++ ++ if (SSL_basic_test()) ++ goto cleanup; ++ ++ system("sh ../ssl/test/killopenssl.sh"); ++ ++ if (SSL_client_tests()) ++ goto cleanup; ++ ++ system("sh ../ssl/test/killopenssl.sh"); ++ ++ if (SSL_server_tests()) ++ goto cleanup; ++ ++ system("sh ../ssl/test/killopenssl.sh"); ++ ++ if (header_issue()) ++ { ++ printf("Header tests failed\n"); TTY_FLUSH(); ++ goto cleanup; ++ } ++ ++ ret = 0; /* all ok */ ++ printf("**** ALL TESTS PASSED ****\n"); TTY_FLUSH(); ++cleanup: ++ ++ if (ret) ++ printf("Error: Some tests failed!\n"); ++ ++ close(fd); ++ return ret; ++} +diff --git a/feeds/luci/libs/luci-lib-nixio/axTLS/ssl/test/ssltest.c.bak b/feeds/luci/libs/luci-lib-nixio/axTLS/ssl/test/ssltest.c.bak +new file mode 100644 +index 0000000..ca9637f +--- /dev/null ++++ b/feeds/luci/libs/luci-lib-nixio/axTLS/ssl/test/ssltest.c.bak +@@ -0,0 +1,1940 @@ ++/* ++ * Copyright (c) 2007, Cameron Rich ++ * ++ * All rights reserved. ++ * ++ * Redistribution and use in source and binary forms, with or without ++ * modification, are permitted provided that the following conditions are met: ++ * ++ * * Redistributions of source code must retain the above copyright notice, ++ * this list of conditions and the following disclaimer. ++ * * 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. ++ * * Neither the name of the axTLS project nor the names of its contributors ++ * may be used to endorse or promote products derived from this software ++ * without specific prior written permission. ++ * ++ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ++ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT ++ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR ++ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR ++ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, ++ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, ++ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR ++ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF ++ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING ++ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS ++ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ++ */ ++ ++/* ++ * The testing of the crypto and ssl stuff goes here. Keeps the individual code ++ * modules from being uncluttered with test code. ++ * ++ * This is test code - I make no apologies for the quality! ++ */ ++ ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++ ++#ifndef WIN32 ++#include ++#endif ++ ++#include "ssl.h" ++ ++#define DEFAULT_CERT "../ssl/test/axTLS.x509_512.cer" ++#define DEFAULT_KEY "../ssl/test/axTLS.key_512" ++//#define DEFAULT_SVR_OPTION SSL_DISPLAY_BYTES|SSL_DISPLAY_STATES ++#define DEFAULT_SVR_OPTION 0 ++#define DEFAULT_CLNT_OPTION 0 ++//#define DEFAULT_CLNT_OPTION SSL_DISPLAY_BYTES|SSL_DISPLAY_STATES ++ ++static int g_port = 19001; ++ ++/************************************************************************** ++ * AES tests ++ * ++ * Run through a couple of the RFC3602 tests to verify that AES is correct. ++ **************************************************************************/ ++#define TEST1_SIZE 16 ++#define TEST2_SIZE 32 ++ ++static int AES_test(BI_CTX *bi_ctx) ++{ ++ AES_CTX aes_key; ++ int res = 1; ++ uint8_t key[TEST1_SIZE]; ++ uint8_t iv[TEST1_SIZE]; ++ ++ { ++ /* ++ Case #1: Encrypting 16 bytes (1 block) using AES-CBC ++ Key : 0x06a9214036b8a15b512e03d534120006 ++ IV : 0x3dafba429d9eb430b422da802c9fac41 ++ Plaintext : "Single block msg" ++ Ciphertext: 0xe353779c1079aeb82708942dbe77181a ++ ++ */ ++ char *in_str = "Single block msg"; ++ uint8_t ct[TEST1_SIZE]; ++ uint8_t enc_data[TEST1_SIZE]; ++ uint8_t dec_data[TEST1_SIZE]; ++ ++ bigint *key_bi = bi_str_import( ++ bi_ctx, "06A9214036B8A15B512E03D534120006"); ++ bigint *iv_bi = bi_str_import( ++ bi_ctx, "3DAFBA429D9EB430B422DA802C9FAC41"); ++ bigint *ct_bi = bi_str_import( ++ bi_ctx, "E353779C1079AEB82708942DBE77181A"); ++ bi_export(bi_ctx, key_bi, key, TEST1_SIZE); ++ bi_export(bi_ctx, iv_bi, iv, TEST1_SIZE); ++ bi_export(bi_ctx, ct_bi, ct, TEST1_SIZE); ++ ++ AES_set_key(&aes_key, key, iv, AES_MODE_128); ++ AES_cbc_encrypt(&aes_key, (const uint8_t *)in_str, ++ enc_data, sizeof(enc_data)); ++ if (memcmp(enc_data, ct, sizeof(ct))) ++ { ++ printf("Error: AES ENCRYPT #1 failed\n"); ++ goto end; ++ } ++ ++ AES_set_key(&aes_key, key, iv, AES_MODE_128); ++ AES_convert_key(&aes_key); ++ AES_cbc_decrypt(&aes_key, enc_data, dec_data, sizeof(enc_data)); ++ ++ if (memcmp(dec_data, in_str, sizeof(dec_data))) ++ { ++ printf("Error: AES DECRYPT #1 failed\n"); ++ goto end; ++ } ++ } ++ ++ { ++ /* ++ Case #2: Encrypting 32 bytes (2 blocks) using AES-CBC ++ Key : 0xc286696d887c9aa0611bbb3e2025a45a ++ IV : 0x562e17996d093d28ddb3ba695a2e6f58 ++ Plaintext : 0x000102030405060708090a0b0c0d0e0f ++ 101112131415161718191a1b1c1d1e1f ++ Ciphertext: 0xd296cd94c2cccf8a3a863028b5e1dc0a ++ 7586602d253cfff91b8266bea6d61ab1 ++ */ ++ uint8_t in_data[TEST2_SIZE]; ++ uint8_t ct[TEST2_SIZE]; ++ uint8_t enc_data[TEST2_SIZE]; ++ uint8_t dec_data[TEST2_SIZE]; ++ ++ bigint *in_bi = bi_str_import(bi_ctx, ++ "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F"); ++ bigint *key_bi = bi_str_import( ++ bi_ctx, "C286696D887C9AA0611BBB3E2025A45A"); ++ bigint *iv_bi = bi_str_import( ++ bi_ctx, "562E17996D093D28DDB3BA695A2E6F58"); ++ bigint *ct_bi = bi_str_import(bi_ctx, ++ "D296CD94C2CCCF8A3A863028B5E1DC0A7586602D253CFFF91B8266BEA6D61AB1"); ++ bi_export(bi_ctx, in_bi, in_data, TEST2_SIZE); ++ bi_export(bi_ctx, key_bi, key, TEST1_SIZE); ++ bi_export(bi_ctx, iv_bi, iv, TEST1_SIZE); ++ bi_export(bi_ctx, ct_bi, ct, TEST2_SIZE); ++ ++ AES_set_key(&aes_key, key, iv, AES_MODE_128); ++ AES_cbc_encrypt(&aes_key, (const uint8_t *)in_data, ++ enc_data, sizeof(enc_data)); ++ ++ if (memcmp(enc_data, ct, sizeof(ct))) ++ { ++ printf("Error: ENCRYPT #2 failed\n"); ++ goto end; ++ } ++ ++ AES_set_key(&aes_key, key, iv, AES_MODE_128); ++ AES_convert_key(&aes_key); ++ AES_cbc_decrypt(&aes_key, enc_data, dec_data, sizeof(enc_data)); ++ if (memcmp(dec_data, in_data, sizeof(dec_data))) ++ { ++ printf("Error: DECRYPT #2 failed\n"); ++ goto end; ++ } ++ } ++ ++ res = 0; ++ printf("All AES tests passed\n"); ++ ++end: ++ return res; ++} ++ ++/************************************************************************** ++ * RC4 tests ++ * ++ * ARC4 tests vectors from OpenSSL (crypto/rc4/rc4test.c) ++ **************************************************************************/ ++static const uint8_t keys[7][30]= ++{ ++ {8,0x01,0x23,0x45,0x67,0x89,0xab,0xcd,0xef}, ++ {8,0x01,0x23,0x45,0x67,0x89,0xab,0xcd,0xef}, ++ {8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}, ++ {4,0xef,0x01,0x23,0x45}, ++ {8,0x01,0x23,0x45,0x67,0x89,0xab,0xcd,0xef}, ++ {4,0xef,0x01,0x23,0x45}, ++}; ++ ++static const uint8_t data_len[7]={8,8,8,20,28,10}; ++static uint8_t data[7][30]= ++{ ++ {0x01,0x23,0x45,0x67,0x89,0xab,0xcd,0xef,0xff}, ++ {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff}, ++ {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff}, ++ {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, ++ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, ++ 0x00,0x00,0x00,0x00,0xff}, ++ {0x12,0x34,0x56,0x78,0x9A,0xBC,0xDE,0xF0, ++ 0x12,0x34,0x56,0x78,0x9A,0xBC,0xDE,0xF0, ++ 0x12,0x34,0x56,0x78,0x9A,0xBC,0xDE,0xF0, ++ 0x12,0x34,0x56,0x78,0xff}, ++ {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff}, ++ {0}, ++}; ++ ++static const uint8_t output[7][30]= ++{ ++ {0x75,0xb7,0x87,0x80,0x99,0xe0,0xc5,0x96,0x00}, ++ {0x74,0x94,0xc2,0xe7,0x10,0x4b,0x08,0x79,0x00}, ++ {0xde,0x18,0x89,0x41,0xa3,0x37,0x5d,0x3a,0x00}, ++ {0xd6,0xa1,0x41,0xa7,0xec,0x3c,0x38,0xdf, ++ 0xbd,0x61,0x5a,0x11,0x62,0xe1,0xc7,0xba, ++ 0x36,0xb6,0x78,0x58,0x00}, ++ {0x66,0xa0,0x94,0x9f,0x8a,0xf7,0xd6,0x89, ++ 0x1f,0x7f,0x83,0x2b,0xa8,0x33,0xc0,0x0c, ++ 0x89,0x2e,0xbe,0x30,0x14,0x3c,0xe2,0x87, ++ 0x40,0x01,0x1e,0xcf,0x00}, ++ {0xd6,0xa1,0x41,0xa7,0xec,0x3c,0x38,0xdf,0xbd,0x61,0x00}, ++ {0}, ++}; ++ ++static int RC4_test(BI_CTX *bi_ctx) ++{ ++ int i, res = 1; ++ RC4_CTX s; ++ ++ for (i = 0; i < 6; i++) ++ { ++ RC4_setup(&s, &keys[i][1], keys[i][0]); ++ RC4_crypt(&s, data[i], data[i], data_len[i]); ++ ++ if (memcmp(data[i], output[i], data_len[i])) ++ { ++ printf("Error: RC4 CRYPT #%d failed\n", i); ++ goto end; ++ } ++ } ++ ++ res = 0; ++ printf("All RC4 tests passed\n"); ++ ++end: ++ return res; ++} ++ ++/************************************************************************** ++ * SHA1 tests ++ * ++ * Run through a couple of the RFC3174 tests to verify that SHA1 is correct. ++ **************************************************************************/ ++static int SHA1_test(BI_CTX *bi_ctx) ++{ ++ SHA1_CTX ctx; ++ uint8_t ct[SHA1_SIZE]; ++ uint8_t digest[SHA1_SIZE]; ++ int res = 1; ++ ++ { ++ const char *in_str = "abc"; ++ bigint *ct_bi = bi_str_import(bi_ctx, ++ "A9993E364706816ABA3E25717850C26C9CD0D89D"); ++ bi_export(bi_ctx, ct_bi, ct, SHA1_SIZE); ++ ++ SHA1_Init(&ctx); ++ SHA1_Update(&ctx, (const uint8_t *)in_str, strlen(in_str)); ++ SHA1_Final(digest, &ctx); ++ ++ if (memcmp(digest, ct, sizeof(ct))) ++ { ++ printf("Error: SHA1 #1 failed\n"); ++ goto end; ++ } ++ } ++ ++ { ++ const char *in_str = ++ "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq"; ++ bigint *ct_bi = bi_str_import(bi_ctx, ++ "84983E441C3BD26EBAAE4AA1F95129E5E54670F1"); ++ bi_export(bi_ctx, ct_bi, ct, SHA1_SIZE); ++ ++ SHA1_Init(&ctx); ++ SHA1_Update(&ctx, (const uint8_t *)in_str, strlen(in_str)); ++ SHA1_Final(digest, &ctx); ++ ++ if (memcmp(digest, ct, sizeof(ct))) ++ { ++ printf("Error: SHA1 #2 failed\n"); ++ goto end; ++ } ++ } ++ ++ res = 0; ++ printf("All SHA1 tests passed\n"); ++ ++end: ++ return res; ++} ++ ++/************************************************************************** ++ * MD5 tests ++ * ++ * Run through a couple of the RFC1321 tests to verify that MD5 is correct. ++ **************************************************************************/ ++static int MD5_test(BI_CTX *bi_ctx) ++{ ++ MD5_CTX ctx; ++ uint8_t ct[MD5_SIZE]; ++ uint8_t digest[MD5_SIZE]; ++ int res = 1; ++ ++ { ++ const char *in_str = "abc"; ++ bigint *ct_bi = bi_str_import(bi_ctx, ++ "900150983CD24FB0D6963F7D28E17F72"); ++ bi_export(bi_ctx, ct_bi, ct, MD5_SIZE); ++ ++ MD5_Init(&ctx); ++ MD5_Update(&ctx, (const uint8_t *)in_str, strlen(in_str)); ++ MD5_Final(digest, &ctx); ++ ++ if (memcmp(digest, ct, sizeof(ct))) ++ { ++ printf("Error: MD5 #1 failed\n"); ++ goto end; ++ } ++ } ++ ++ { ++ const char *in_str = ++ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"; ++ bigint *ct_bi = bi_str_import( ++ bi_ctx, "D174AB98D277D9F5A5611C2C9F419D9F"); ++ bi_export(bi_ctx, ct_bi, ct, MD5_SIZE); ++ ++ MD5_Init(&ctx); ++ MD5_Update(&ctx, (const uint8_t *)in_str, strlen(in_str)); ++ MD5_Final(digest, &ctx); ++ ++ if (memcmp(digest, ct, sizeof(ct))) ++ { ++ printf("Error: MD5 #2 failed\n"); ++ goto end; ++ } ++ } ++ res = 0; ++ printf("All MD5 tests passed\n"); ++ ++end: ++ return res; ++} ++ ++/************************************************************************** ++ * HMAC tests ++ * ++ * Run through a couple of the RFC2202 tests to verify that HMAC is correct. ++ **************************************************************************/ ++static int HMAC_test(BI_CTX *bi_ctx) ++{ ++ uint8_t key[SHA1_SIZE]; ++ uint8_t ct[SHA1_SIZE]; ++ uint8_t dgst[SHA1_SIZE]; ++ int res = 1; ++ const char *key_str; ++ ++ const char *data_str = "Hi There"; ++ bigint *key_bi = bi_str_import(bi_ctx, "0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B"); ++ bigint *ct_bi = bi_str_import(bi_ctx, "9294727A3638BB1C13F48EF8158BFC9D"); ++ bi_export(bi_ctx, key_bi, key, MD5_SIZE); ++ bi_export(bi_ctx, ct_bi, ct, MD5_SIZE); ++ hmac_md5((const uint8_t *)data_str, 8, key, MD5_SIZE, dgst); ++ if (memcmp(dgst, ct, MD5_SIZE)) ++ { ++ printf("HMAC MD5 #1 failed\n"); ++ goto end; ++ } ++ ++ data_str = "what do ya want for nothing?"; ++ key_str = "Jefe"; ++ ct_bi = bi_str_import(bi_ctx, "750C783E6AB0B503EAA86E310A5DB738"); ++ bi_export(bi_ctx, ct_bi, ct, MD5_SIZE); ++ hmac_md5((const uint8_t *)data_str, 28, (const uint8_t *)key_str, 4, dgst); ++ if (memcmp(dgst, ct, MD5_SIZE)) ++ { ++ printf("HMAC MD5 #2 failed\n"); ++ goto end; ++ } ++ ++ data_str = "Hi There"; ++ key_bi = bi_str_import(bi_ctx, "0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B"); ++ bi_export(bi_ctx, key_bi, key, SHA1_SIZE); ++ ct_bi = bi_str_import(bi_ctx, "B617318655057264E28BC0B6FB378C8EF146BE00"); ++ bi_export(bi_ctx, ct_bi, ct, SHA1_SIZE); ++ ++ hmac_sha1((const uint8_t *)data_str, 8, ++ (const uint8_t *)key, SHA1_SIZE, dgst); ++ if (memcmp(dgst, ct, SHA1_SIZE)) ++ { ++ printf("HMAC SHA1 #1 failed\n"); ++ goto end; ++ } ++ ++ data_str = "what do ya want for nothing?"; ++ key_str = "Jefe"; ++ ct_bi = bi_str_import(bi_ctx, "EFFCDF6AE5EB2FA2D27416D5F184DF9C259A7C79"); ++ bi_export(bi_ctx, ct_bi, ct, SHA1_SIZE); ++ ++ hmac_sha1((const uint8_t *)data_str, 28, (const uint8_t *)key_str, 5, dgst); ++ if (memcmp(dgst, ct, SHA1_SIZE)) ++ { ++ printf("HMAC SHA1 failed\n"); ++ exit(1); ++ } ++ ++ res = 0; ++ printf("All HMAC tests passed\n"); ++ ++end: ++ return res; ++} ++ ++/************************************************************************** ++ * BIGINT tests ++ * ++ **************************************************************************/ ++static int BIGINT_test(BI_CTX *ctx) ++{ ++ int res = 1; ++ bigint *bi_data, *bi_exp, *bi_res; ++ const char *expnt, *plaintext, *mod; ++ uint8_t compare[MAX_KEY_BYTE_SIZE]; ++ ++ /** ++ * 512 bit key ++ */ ++ plaintext = /* 64 byte number */ ++ "01aaaaaaaaaabbbbbbbbbbbbbbbccccccccccccccdddddddddddddeeeeeeeeee"; ++ ++ mod = "C30773C8ABE09FCC279EE0E5343370DE" ++ "8B2FFDB6059271E3005A7CEEF0D35E0A" ++ "1F9915D95E63560836CC2EB2C289270D" ++ "BCAE8CAF6F5E907FC2759EE220071E1B"; ++ ++ expnt = "A1E556CD1738E10DF539E35101334E97" ++ "BE8D391C57A5C89A7AD9A2EA2ACA1B3D" ++ "F3140F5091CC535CBAA47CEC4159EE1F" ++ "B6A3661AFF1AB758426EAB158452A9B9"; ++ ++ bi_data = bi_import(ctx, (uint8_t *)plaintext, strlen(plaintext)); ++ bi_exp = int_to_bi(ctx, 0x10001); ++ bi_set_mod(ctx, bi_str_import(ctx, mod), 0); ++ bi_res = bi_mod_power(ctx, bi_data, bi_exp); ++ ++ bi_data = bi_res; /* resuse again - see if we get the original */ ++ ++ bi_exp = bi_str_import(ctx, expnt); ++ bi_res = bi_mod_power(ctx, bi_data, bi_exp); ++ bi_free_mod(ctx, 0); ++ ++ bi_export(ctx, bi_res, compare, 64); ++ if (memcmp(plaintext, compare, 64) != 0) ++ goto end; ++ ++ printf("All BIGINT tests passed\n"); ++ res = 0; ++ ++end: ++ return res; ++} ++ ++/************************************************************************** ++ * RSA tests ++ * ++ * Use the results from openssl to verify PKCS1 etc ++ **************************************************************************/ ++static int RSA_test(void) ++{ ++ int res = 1; ++ const char *plaintext = /* 128 byte hex number */ ++ "1aaaaaaaaaabbbbbbbbbbbbbbbccccccccccccccdddddddddddddeeeeeeeeee2" ++ "1aaaaaaaaaabbbbbbbbbbbbbbbccccccccccccccdddddddddddddeeeeeeeee2\012"; ++ uint8_t enc_data[128], dec_data[128]; ++ RSA_CTX *rsa_ctx = NULL; ++ BI_CTX *bi_ctx; ++ bigint *plaintext_bi; ++ bigint *enc_data_bi, *dec_data_bi; ++ uint8_t enc_data2[128], dec_data2[128]; ++ int size; ++ int len; ++ uint8_t *buf; ++ ++ /* extract the private key elements */ ++ len = get_file("../ssl/test/axTLS.key_1024", &buf); ++ if (asn1_get_private_key(buf, len, &rsa_ctx) < 0) ++ { ++ goto end; ++ } ++ ++ free(buf); ++ bi_ctx = rsa_ctx->bi_ctx; ++ plaintext_bi = bi_import(bi_ctx, ++ (const uint8_t *)plaintext, strlen(plaintext)); ++ ++ /* basic rsa encrypt */ ++ enc_data_bi = RSA_public(rsa_ctx, plaintext_bi); ++ bi_export(bi_ctx, bi_copy(enc_data_bi), enc_data, sizeof(enc_data)); ++ ++ /* basic rsa decrypt */ ++ dec_data_bi = RSA_private(rsa_ctx, enc_data_bi); ++ bi_export(bi_ctx, dec_data_bi, dec_data, sizeof(dec_data)); ++ ++ if (memcmp(dec_data, plaintext, strlen(plaintext))) ++ { ++ printf("Error: DECRYPT #1 failed\n"); ++ goto end; ++ } ++ ++ RSA_encrypt(rsa_ctx, (const uint8_t *)"abc", 3, enc_data2, 0); ++ size = RSA_decrypt(rsa_ctx, enc_data2, dec_data2, 1); ++ if (memcmp("abc", dec_data2, 3)) ++ { ++ printf("Error: ENCRYPT/DECRYPT #2 failed\n"); ++ goto end; ++ } ++ ++ RSA_free(rsa_ctx); ++ res = 0; ++ printf("All RSA tests passed\n"); ++ ++end: ++ return res; ++} ++ ++/************************************************************************** ++ * Cert Testing ++ * ++ **************************************************************************/ ++static int cert_tests(void) ++{ ++ int res = -1, len; ++ X509_CTX *x509_ctx; ++ SSL_CTX *ssl_ctx; ++ uint8_t *buf; ++ ++ /* check a bunch of 3rd party certificates */ ++ ssl_ctx = ssl_ctx_new(0, 0); ++ len = get_file("../ssl/test/microsoft.x509_ca", &buf); ++ if ((res = add_cert_auth(ssl_ctx, buf, len)) < 0) ++ { ++ printf("Cert #1\n"); ++ ssl_display_error(res); ++ goto bad_cert; ++ } ++ ++ ssl_ctx_free(ssl_ctx); ++ free(buf); ++ ++ ssl_ctx = ssl_ctx_new(0, 0); ++ len = get_file("../ssl/test/thawte.x509_ca", &buf); ++ if ((res = add_cert_auth(ssl_ctx, buf, len)) < 0) ++ { ++ printf("Cert #2\n"); ++ ssl_display_error(res); ++ goto bad_cert; ++ } ++ ++ ssl_ctx_free(ssl_ctx); ++ free(buf); ++ ++ ssl_ctx = ssl_ctx_new(0, 0); ++ len = get_file("../ssl/test/deutsche_telecom.x509_ca", &buf); ++ if ((res = add_cert_auth(ssl_ctx, buf, len)) < 0) ++ { ++ printf("Cert #3\n"); ++ ssl_display_error(res); ++ goto bad_cert; ++ } ++ ++ ssl_ctx_free(ssl_ctx); ++ free(buf); ++ ++ ssl_ctx = ssl_ctx_new(0, 0); ++ len = get_file("../ssl/test/equifax.x509_ca", &buf); ++ if ((res = add_cert_auth(ssl_ctx, buf, len)) < 0) ++ { ++ printf("Cert #4\n"); ++ ssl_display_error(res); ++ goto bad_cert; ++ } ++ ++ ssl_ctx_free(ssl_ctx); ++ free(buf); ++ ++ ssl_ctx = ssl_ctx_new(0, 0); ++ len = get_file("../ssl/test/gnutls.cer", &buf); ++ if ((res = add_cert(ssl_ctx, buf, len)) < 0) ++ { ++ printf("Cert #5\n"); ++ ssl_display_error(res); ++ goto bad_cert; ++ } ++ ++ ssl_ctx_free(ssl_ctx); ++ free(buf); ++ ++ ssl_ctx = ssl_ctx_new(0, 0); ++ len = get_file("../ssl/test/socgen.cer", &buf); ++ if ((res = add_cert(ssl_ctx, buf, len)) < 0) ++ { ++ printf("Cert #6\n"); ++ ssl_display_error(res); ++ goto bad_cert; ++ } ++ ++ ssl_ctx_free(ssl_ctx); ++ free(buf); ++ ++ ssl_ctx = ssl_ctx_new(0, 0); ++ len = get_file("../ssl/test/verisign.x509_ca", &buf); ++ if ((res = add_cert_auth(ssl_ctx, buf, len)) <0) ++ { ++ printf("Cert #7\n"); ++ ssl_display_error(res); ++ goto bad_cert; ++ } ++ ++ ssl_ctx_free(ssl_ctx); ++ free(buf); ++ ++ if (get_file("../ssl/test/verisign.x509_my_cert", &buf) < 0 || ++ x509_new(buf, &len, &x509_ctx)) ++ { ++ printf("Cert #8\n"); ++ ssl_display_error(res); ++ goto bad_cert; ++ } ++ ++ x509_free(x509_ctx); ++ free(buf); ++ ++ ssl_ctx = ssl_ctx_new(0, 0); ++ if ((res = ssl_obj_load(ssl_ctx, ++ SSL_OBJ_X509_CERT, "../ssl/test/ms_iis.cer", NULL)) != SSL_OK) ++ { ++ ssl_display_error(res); ++ goto bad_cert; ++ } ++ ++ ssl_ctx_free(ssl_ctx); ++ res = 0; /* all ok */ ++ printf("All Certificate tests passed\n"); ++ ++bad_cert: ++ if (res) ++ printf("Error: A certificate test failed\n"); ++ return res; ++} ++ ++/** ++ * init a server socket. ++ */ ++static int server_socket_init(int *port) ++{ ++ struct sockaddr_in serv_addr; ++ int server_fd; ++ char yes = 1; ++ ++ /* Create socket for incoming connections */ ++ if ((server_fd = socket(AF_INET, SOCK_STREAM, 0)) < 0) ++ { ++ return -1; ++ } ++ ++ setsockopt(server_fd, SOL_SOCKET, SO_REUSEADDR, &yes, sizeof(yes)); ++ ++go_again: ++ /* Construct local address structure */ ++ memset(&serv_addr, 0, sizeof(serv_addr)); /* Zero out structure */ ++ serv_addr.sin_family = AF_INET; /* Internet address family */ ++ serv_addr.sin_addr.s_addr = htonl(INADDR_ANY); /* Any incoming interface */ ++ serv_addr.sin_port = htons(*port); /* Local port */ ++ ++ /* Bind to the local address */ ++ if (bind(server_fd, (struct sockaddr *) &serv_addr, sizeof(serv_addr)) < 0) ++ { ++ (*port)++; ++ goto go_again; ++ } ++ /* Mark the socket so it will listen for incoming connections */ ++ if (listen(server_fd, 3000) < 0) ++ { ++ return -1; ++ } ++ ++ return server_fd; ++} ++ ++/** ++ * init a client socket. ++ */ ++static int client_socket_init(uint16_t port) ++{ ++ struct sockaddr_in address; ++ int client_fd; ++ ++ address.sin_family = AF_INET; ++ address.sin_port = htons(port); ++ address.sin_addr.s_addr = inet_addr("127.0.0.1"); ++ client_fd = socket(AF_INET, SOCK_STREAM, 0); ++ if (connect(client_fd, (struct sockaddr *)&address, sizeof(address)) < 0) ++ { ++ perror("socket"); ++ SOCKET_CLOSE(client_fd); ++ client_fd = -1; ++ } ++ ++ return client_fd; ++} ++ ++/************************************************************************** ++ * SSL Server Testing ++ * ++ **************************************************************************/ ++typedef struct ++{ ++ /* not used as yet */ ++ int dummy; ++} SVR_CTX; ++ ++typedef struct ++{ ++ const char *testname; ++ const char *openssl_option; ++} client_t; ++ ++static void do_client(client_t *clnt) ++{ ++ char openssl_buf[2048]; ++ ++ /* make sure the main thread goes first */ ++ sleep(0); ++ ++ /* show the session ids in the reconnect test */ ++ if (strcmp(clnt->testname, "Session Reuse") == 0) ++ { ++ sprintf(openssl_buf, "echo \"hello client\" | openssl s_client " ++ "-connect localhost:%d %s 2>&1 | grep \"Session-ID:\"", ++ g_port, clnt->openssl_option); ++ } ++ else ++ { ++ sprintf(openssl_buf, "echo \"hello client\" | openssl s_client " ++#ifdef WIN32 ++ "-connect localhost:%d -quiet %s", ++#else ++ "-connect localhost:%d -quiet %s > /dev/null 2>&1", ++#endif ++ g_port, clnt->openssl_option); ++ } ++ ++ system(openssl_buf); ++} ++ ++static int SSL_server_test( ++ const char *testname, ++ const char *openssl_option, ++ const char *device_cert, ++ const char *product_cert, ++ const char *private_key, ++ const char *ca_cert, ++ const char *password, ++ int axolotls_option) ++{ ++ int server_fd, ret = 0; ++ SSL_CTX *ssl_ctx = NULL; ++ struct sockaddr_in client_addr; ++ uint8_t *read_buf; ++ socklen_t clnt_len = sizeof(client_addr); ++ client_t client_data; ++#ifndef WIN32 ++ pthread_t thread; ++#endif ++ g_port++; ++ ++ client_data.testname = testname; ++ client_data.openssl_option = openssl_option; ++ ++ if ((server_fd = server_socket_init(&g_port)) < 0) ++ goto error; ++ ++ if (private_key) ++ { ++ axolotls_option |= SSL_NO_DEFAULT_KEY; ++ } ++ ++ if ((ssl_ctx = ssl_ctx_new(axolotls_option, SSL_DEFAULT_SVR_SESS)) == NULL) ++ { ++ ret = SSL_ERROR_INVALID_KEY; ++ goto error; ++ } ++ ++ if (private_key) ++ { ++ int obj_type = SSL_OBJ_RSA_KEY; ++ ++ if (strstr(private_key, ".p8")) ++ obj_type = SSL_OBJ_PKCS8; ++ else if (strstr(private_key, ".p12")) ++ obj_type = SSL_OBJ_PKCS12; ++ ++ if (ssl_obj_load(ssl_ctx, obj_type, private_key, password)) ++ { ++ ret = SSL_ERROR_INVALID_KEY; ++ goto error; ++ } ++ } ++ ++ if (device_cert) /* test chaining */ ++ { ++ if ((ret = ssl_obj_load(ssl_ctx, ++ SSL_OBJ_X509_CERT, device_cert, NULL)) != SSL_OK) ++ goto error; ++ } ++ ++ if (product_cert) /* test chaining */ ++ { ++ if ((ret = ssl_obj_load(ssl_ctx, ++ SSL_OBJ_X509_CERT, product_cert, NULL)) != SSL_OK) ++ goto error; ++ } ++ ++ if (ca_cert) /* test adding certificate authorities */ ++ { ++ if ((ret = ssl_obj_load(ssl_ctx, ++ SSL_OBJ_X509_CACERT, ca_cert, NULL)) != SSL_OK) ++ goto error; ++ } ++ ++#ifndef WIN32 ++ pthread_create(&thread, NULL, ++ (void *(*)(void *))do_client, (void *)&client_data); ++ pthread_detach(thread); ++#else ++ CreateThread(NULL, 1024, (LPTHREAD_START_ROUTINE)do_client, ++ (LPVOID)&client_data, 0, NULL); ++#endif ++ ++ for (;;) ++ { ++ int client_fd, size = 0; ++ SSL *ssl; ++ ++ /* Wait for a client to connect */ ++ if ((client_fd = accept(server_fd, ++ (struct sockaddr *)&client_addr, &clnt_len)) < 0) ++ { ++ ret = SSL_ERROR_SOCK_SETUP_FAILURE; ++ goto error; ++ } ++ ++ /* we are ready to go */ ++ ssl = ssl_server_new(ssl_ctx, client_fd); ++ while ((size = ssl_read(ssl, &read_buf)) == SSL_OK); ++ SOCKET_CLOSE(client_fd); ++ ++ if (size < SSL_OK) /* got some alert or something nasty */ ++ { ++ ret = size; ++ ++ if (ret == SSL_ERROR_CONN_LOST) ++ { ++ ret = SSL_OK; ++ continue; ++ } ++ ++ break; /* we've got a problem */ ++ } ++ else /* looks more promising */ ++ { ++ if (strstr("hello client", (char *)read_buf) == NULL) ++ { ++ printf("SSL server test \"%s\" passed\n", testname); ++ TTY_FLUSH(); ++ ret = 0; ++ break; ++ } ++ } ++ ++ ssl_free(ssl); ++ } ++ ++ SOCKET_CLOSE(server_fd); ++ ++error: ++ ssl_ctx_free(ssl_ctx); ++ return ret; ++} ++ ++int SSL_server_tests(void) ++{ ++ int ret = -1; ++ struct stat stat_buf; ++ SVR_CTX svr_test_ctx; ++ memset(&svr_test_ctx, 0, sizeof(SVR_CTX)); ++ ++ printf("### starting server tests\n"); TTY_FLUSH(); ++ ++ /* Go through the algorithms */ ++ ++ /* ++ * TLS1 client hello ++ */ ++ if ((ret = SSL_server_test("TLSv1", "-cipher RC4-SHA -tls1", ++ NULL, NULL, NULL, NULL, NULL, DEFAULT_SVR_OPTION))) ++ goto cleanup; ++ ++ /* ++ * AES128-SHA ++ */ ++ if ((ret = SSL_server_test("AES256-SHA", "-cipher AES128-SHA", ++ DEFAULT_CERT, NULL, DEFAULT_KEY, NULL, NULL, ++ DEFAULT_SVR_OPTION))) ++ goto cleanup; ++ ++ /* ++ * AES256-SHA ++ */ ++ if ((ret = SSL_server_test("AES256-SHA", "-cipher AES128-SHA", ++ DEFAULT_CERT, NULL, DEFAULT_KEY, NULL, NULL, ++ DEFAULT_SVR_OPTION))) ++ goto cleanup; ++ ++ /* ++ * RC4-SHA ++ */ ++ if ((ret = SSL_server_test("RC4-SHA", "-cipher RC4-SHA", ++ DEFAULT_CERT, NULL, DEFAULT_KEY, NULL, NULL, ++ DEFAULT_SVR_OPTION))) ++ goto cleanup; ++ ++ /* ++ * RC4-MD5 ++ */ ++ if ((ret = SSL_server_test("RC4-MD5", "-cipher RC4-MD5", ++ DEFAULT_CERT, NULL, DEFAULT_KEY, NULL, NULL, ++ DEFAULT_SVR_OPTION))) ++ goto cleanup; ++ ++ /* ++ * Session Reuse ++ * all the session id's should match for session resumption. ++ */ ++ if ((ret = SSL_server_test("Session Reuse", ++ "-cipher RC4-SHA -reconnect", ++ DEFAULT_CERT, NULL, DEFAULT_KEY, NULL, NULL, ++ DEFAULT_SVR_OPTION))) ++ goto cleanup; ++ ++ /* ++ * 512 bit RSA key ++ */ ++ if ((ret = SSL_server_test("512 bit key", "-cipher RC4-SHA", ++ "../ssl/test/axTLS.x509_512.cer", NULL, ++ "../ssl/test/axTLS.key_512", ++ NULL, NULL, DEFAULT_SVR_OPTION))) ++ goto cleanup; ++ ++ /* ++ * 1024 bit RSA key (check certificate chaining) ++ */ ++ if ((ret = SSL_server_test("1024 bit key", ++ "-cipher RC4-SHA", ++ "../ssl/test/axTLS.x509_device.cer", ++ "../ssl/test/axTLS.x509_512.cer", ++ "../ssl/test/axTLS.device_key", ++ NULL, NULL, DEFAULT_SVR_OPTION))) ++ goto cleanup; ++ ++ /* ++ * 2048 bit RSA key ++ */ ++ if ((ret = SSL_server_test("2048 bit key", ++ "-cipher RC4-SHA", ++ "../ssl/test/axTLS.x509_2048.cer", NULL, ++ "../ssl/test/axTLS.key_2048", ++ NULL, NULL, DEFAULT_SVR_OPTION))) ++ goto cleanup; ++ ++ /* ++ * 4096 bit RSA key ++ */ ++ if ((ret = SSL_server_test("4096 bit key", ++ "-cipher RC4-SHA", ++ "../ssl/test/axTLS.x509_4096.cer", NULL, ++ "../ssl/test/axTLS.key_4096", ++ NULL, NULL, DEFAULT_SVR_OPTION))) ++ goto cleanup; ++ ++ /* ++ * Client Verification ++ */ ++ if ((ret = SSL_server_test("Client Verification", ++ "-cipher RC4-SHA -tls1 " ++ "-cert ../ssl/test/axTLS.x509_2048.pem " ++ "-key ../ssl/test/axTLS.key_2048.pem ", ++ NULL, NULL, NULL, ++ "../ssl/test/axTLS.ca_x509.cer", NULL, ++ DEFAULT_SVR_OPTION|SSL_CLIENT_AUTHENTICATION))) ++ goto cleanup; ++ ++ /* this test should fail */ ++ if (stat("../ssl/test/axTLS.x509_bad_before.pem", &stat_buf) >= 0) ++ { ++ if ((ret = SSL_server_test("Bad Before Cert", ++ "-cipher RC4-SHA -tls1 " ++ "-cert ../ssl/test/axTLS.x509_bad_before.pem " ++ "-key ../ssl/test/axTLS.key_512.pem ", ++ NULL, NULL, NULL, ++ "../ssl/test/axTLS.ca_x509.cer", NULL, ++ DEFAULT_SVR_OPTION|SSL_CLIENT_AUTHENTICATION)) != ++ SSL_X509_ERROR(X509_VFY_ERROR_NOT_YET_VALID)) ++ goto cleanup; ++ ++ printf("SSL server test \"%s\" passed\n", "Bad Before Cert"); ++ TTY_FLUSH(); ++ ret = 0; /* is ok */ ++ } ++ ++ /* this test should fail */ ++ if ((ret = SSL_server_test("Bad After Cert", ++ "-cipher RC4-SHA -tls1 " ++ "-cert ../ssl/test/axTLS.x509_bad_after.pem " ++ "-key ../ssl/test/axTLS.key_512.pem ", ++ NULL, NULL, NULL, ++ "../ssl/test/axTLS.ca_x509.cer", NULL, ++ DEFAULT_SVR_OPTION|SSL_CLIENT_AUTHENTICATION)) != ++ SSL_X509_ERROR(X509_VFY_ERROR_EXPIRED)) ++ goto cleanup; ++ ++ printf("SSL server test \"%s\" passed\n", "Bad After Cert"); ++ TTY_FLUSH(); ++ ++ /* ++ * Key in PEM format ++ */ ++ if ((ret = SSL_server_test("Key in PEM format", ++ "-cipher RC4-SHA", ++ "../ssl/test/axTLS.x509_512.cer", NULL, ++ "../ssl/test/axTLS.key_512.pem", NULL, ++ NULL, DEFAULT_SVR_OPTION))) ++ goto cleanup; ++ ++ /* ++ * Cert in PEM format ++ */ ++ if ((ret = SSL_server_test("Cert in PEM format", ++ "-cipher RC4-SHA", ++ "../ssl/test/axTLS.x509_512.pem", NULL, ++ "../ssl/test/axTLS.key_512.pem", NULL, ++ NULL, DEFAULT_SVR_OPTION))) ++ goto cleanup; ++ ++ /* ++ * Cert chain in PEM format ++ */ ++ if ((ret = SSL_server_test("Cert chain in PEM format", ++ "-cipher RC4-SHA", ++ "../ssl/test/axTLS.x509_device.pem", ++ NULL, "../ssl/test/axTLS.device_key.pem", ++ "../ssl/test/axTLS.ca_x509.pem", NULL, DEFAULT_SVR_OPTION))) ++ goto cleanup; ++ ++ /* ++ * AES128 Encrypted key ++ */ ++ if ((ret = SSL_server_test("AES128 encrypted key", ++ "-cipher RC4-SHA", ++ "../ssl/test/axTLS.x509_aes128.pem", NULL, ++ "../ssl/test/axTLS.key_aes128.pem", ++ NULL, "abcd", DEFAULT_SVR_OPTION))) ++ goto cleanup; ++ ++ /* ++ * AES256 Encrypted key ++ */ ++ if ((ret = SSL_server_test("AES256 encrypted key", ++ "-cipher RC4-SHA", ++ "../ssl/test/axTLS.x509_aes256.pem", NULL, ++ "../ssl/test/axTLS.key_aes256.pem", ++ NULL, "abcd", DEFAULT_SVR_OPTION))) ++ goto cleanup; ++ ++ /* ++ * AES128 Encrypted invalid key ++ */ ++ if ((ret = SSL_server_test("AES128 encrypted invalid key", ++ "-cipher RC4-SHA", ++ "../ssl/test/axTLS.x509_aes128.pem", NULL, ++ "../ssl/test/axTLS.key_aes128.pem", ++ NULL, "xyz", DEFAULT_SVR_OPTION)) != SSL_ERROR_INVALID_KEY) ++ goto cleanup; ++ ++ printf("SSL server test \"%s\" passed\n", "AES128 encrypted invalid key"); ++ TTY_FLUSH(); ++ ++ /* ++ * PKCS#8 key (encrypted) ++ */ ++ if ((ret = SSL_server_test("pkcs#8 encrypted", "-cipher RC4-SHA", ++ DEFAULT_CERT, NULL, "../ssl/test/axTLS.encrypted.p8", ++ NULL, "abcd", DEFAULT_SVR_OPTION))) ++ goto cleanup; ++ ++ /* ++ * PKCS#8 key (unencrypted) ++ */ ++ if ((ret = SSL_server_test("pkcs#8 unencrypted", "-cipher RC4-SHA", ++ DEFAULT_CERT, NULL, "../ssl/test/axTLS.unencrypted.p8", ++ NULL, NULL, DEFAULT_SVR_OPTION))) ++ goto cleanup; ++ ++ /* ++ * PKCS#12 key/certificate ++ */ ++ if ((ret = SSL_server_test("pkcs#12 with CA", "-cipher RC4-SHA", ++ NULL, NULL, "../ssl/test/axTLS.withCA.p12", ++ NULL, "abcd", DEFAULT_SVR_OPTION))) ++ goto cleanup; ++ ++ if ((ret = SSL_server_test("pkcs#12 no CA", "-cipher RC4-SHA", ++ DEFAULT_CERT, NULL, "../ssl/test/axTLS.withoutCA.p12", ++ NULL, "abcd", DEFAULT_SVR_OPTION))) ++ goto cleanup; ++ ++ /* ++ * ++ */ ++ ++ ret = 0; ++ ++cleanup: ++ if (ret) ++ { ++ printf("Error: A server test failed\n"); ++ ssl_display_error(ret); ++ exit(1); ++ } ++ else ++ { ++ printf("All server tests passed\n"); TTY_FLUSH(); ++ } ++ ++ return ret; ++} ++ ++/************************************************************************** ++ * SSL Client Testing ++ * ++ **************************************************************************/ ++typedef struct ++{ ++ uint8_t session_id[SSL_SESSION_ID_SIZE]; ++#ifndef WIN32 ++ pthread_t server_thread; ++#endif ++ int start_server; ++ int stop_server; ++ int do_reneg; ++} CLNT_SESSION_RESUME_CTX; ++ ++typedef struct ++{ ++ const char *testname; ++ const char *openssl_option; ++} server_t; ++ ++static void do_server(server_t *svr) ++{ ++ char openssl_buf[2048]; ++#ifndef WIN32 ++ pthread_setcanceltype(PTHREAD_CANCEL_ASYNCHRONOUS, NULL); ++#endif ++ sprintf(openssl_buf, "openssl s_server -tls1 " ++ "-accept %d -quiet %s ", g_port, svr->openssl_option); ++ system(openssl_buf); ++} ++ ++static int SSL_client_test( ++ const char *test, ++ SSL_CTX **ssl_ctx, ++ const char *openssl_option, ++ CLNT_SESSION_RESUME_CTX *sess_resume, ++ uint32_t client_options, ++ const char *private_key, ++ const char *password, ++ const char *cert) ++{ ++ server_t server_data; ++ SSL *ssl = NULL; ++ int client_fd = -1; ++ uint8_t *session_id = NULL; ++ int ret = 1; ++#ifndef WIN32 ++ pthread_t thread; ++#endif ++ ++ if (sess_resume == NULL || sess_resume->start_server) ++ { ++ g_port++; ++ server_data.openssl_option = openssl_option; ++ ++#ifndef WIN32 ++ pthread_create(&thread, NULL, ++ (void *(*)(void *))do_server, (void *)&server_data); ++ pthread_detach(thread); ++#else ++ CreateThread(NULL, 1024, (LPTHREAD_START_ROUTINE)do_server, ++ (LPVOID)&server_data, 0, NULL); ++#endif ++ } ++ ++ usleep(200000); /* allow server to start */ ++ ++ if (*ssl_ctx == NULL) ++ { ++ if (private_key) ++ { ++ client_options |= SSL_NO_DEFAULT_KEY; ++ } ++ ++ if ((*ssl_ctx = ssl_ctx_new( ++ client_options, SSL_DEFAULT_CLNT_SESS)) == NULL) ++ { ++ ret = SSL_ERROR_INVALID_KEY; ++ goto client_test_exit; ++ } ++ ++ if (private_key) ++ { ++ int obj_type = SSL_OBJ_RSA_KEY; ++ ++ if (strstr(private_key, ".p8")) ++ obj_type = SSL_OBJ_PKCS8; ++ else if (strstr(private_key, ".p12")) ++ obj_type = SSL_OBJ_PKCS12; ++ ++ if (ssl_obj_load(*ssl_ctx, obj_type, private_key, password)) ++ { ++ ret = SSL_ERROR_INVALID_KEY; ++ goto client_test_exit; ++ } ++ } ++ ++ if (cert) ++ { ++ if ((ret = ssl_obj_load(*ssl_ctx, ++ SSL_OBJ_X509_CERT, cert, NULL)) != SSL_OK) ++ { ++ printf("could not add cert %s (%d)\n", cert, ret); ++ TTY_FLUSH(); ++ goto client_test_exit; ++ } ++ } ++ ++ if (ssl_obj_load(*ssl_ctx, SSL_OBJ_X509_CACERT, ++ "../ssl/test/axTLS.ca_x509.cer", NULL)) ++ { ++ printf("could not add cert auth\n"); TTY_FLUSH(); ++ goto client_test_exit; ++ } ++ } ++ ++ if (sess_resume && !sess_resume->start_server) ++ { ++ session_id = sess_resume->session_id; ++ } ++ ++ if ((client_fd = client_socket_init(g_port)) < 0) ++ { ++ printf("could not start socket on %d\n", g_port); TTY_FLUSH(); ++ goto client_test_exit; ++ } ++ ++ ssl = ssl_client_new(*ssl_ctx, client_fd, session_id, sizeof(session_id)); ++ ++ /* check the return status */ ++ if ((ret = ssl_handshake_status(ssl))) ++ goto client_test_exit; ++ ++ /* renegotiate client */ ++ if (sess_resume && sess_resume->do_reneg) ++ { ++ if (ssl_renegotiate(ssl) < 0) ++ goto client_test_exit; ++ } ++ ++ if (sess_resume) ++ { ++ memcpy(sess_resume->session_id, ++ ssl_get_session_id(ssl), SSL_SESSION_ID_SIZE); ++ } ++ ++ if (IS_SET_SSL_FLAG(SSL_SERVER_VERIFY_LATER) && ++ (ret = ssl_verify_cert(ssl))) ++ { ++ goto client_test_exit; ++ } ++ ++ ssl_write(ssl, (uint8_t *)"hello world\n", 13); ++ if (sess_resume) ++ { ++ const uint8_t *sess_id = ssl_get_session_id(ssl); ++ int i; ++ ++ printf(" Session-ID: "); ++ for (i = 0; i < SSL_SESSION_ID_SIZE; i++) ++ { ++ printf("%02X", sess_id[i]); ++ } ++ printf("\n"); ++ TTY_FLUSH(); ++ } ++ ++ ret = 0; ++ ++client_test_exit: ++ ssl_free(ssl); ++ SOCKET_CLOSE(client_fd); ++ usleep(200000); /* allow openssl to say something */ ++ ++ if (sess_resume) ++ { ++ if (sess_resume->stop_server) ++ { ++ ssl_ctx_free(*ssl_ctx); ++ *ssl_ctx = NULL; ++#ifndef WIN32 ++ pthread_cancel(sess_resume->server_thread); ++#endif ++ } ++ else if (sess_resume->start_server) ++ { ++#ifndef WIN32 ++ sess_resume->server_thread = thread; ++#endif ++ } ++ } ++ else ++ { ++ ssl_ctx_free(*ssl_ctx); ++ *ssl_ctx = NULL; ++#ifndef WIN32 ++ pthread_cancel(thread); ++#endif ++ } ++ ++ if (ret == 0) ++ { ++ printf("SSL client test \"%s\" passed\n", test); ++ TTY_FLUSH(); ++ } ++ ++ return ret; ++} ++ ++int SSL_client_tests(void) ++{ ++ int ret = -1; ++ SSL_CTX *ssl_ctx = NULL; ++ CLNT_SESSION_RESUME_CTX sess_resume; ++ memset(&sess_resume, 0, sizeof(CLNT_SESSION_RESUME_CTX)); ++ ++ sess_resume.start_server = 1; ++ printf("### starting client tests\n"); ++ ++ if ((ret = SSL_client_test("512 bit key", ++ &ssl_ctx, ++ "-cert ../ssl/test/axTLS.x509_512.pem " ++ "-key ../ssl/test/axTLS.key_512.pem", &sess_resume, ++ DEFAULT_CLNT_OPTION, NULL, NULL, NULL))) ++ goto cleanup; ++ ++ /* all the session id's should match for session resumption */ ++ sess_resume.start_server = 0; ++ if ((ret = SSL_client_test("Client session resumption #1", ++ &ssl_ctx, NULL, &sess_resume, ++ DEFAULT_CLNT_OPTION, NULL, NULL, NULL))) ++ goto cleanup; ++ ++ sess_resume.do_reneg = 1; ++ if ((ret = SSL_client_test("Client renegotiation", ++ &ssl_ctx, NULL, &sess_resume, ++ DEFAULT_CLNT_OPTION, NULL, NULL, NULL))) ++ goto cleanup; ++ sess_resume.do_reneg = 0; ++ ++ sess_resume.stop_server = 1; ++ if ((ret = SSL_client_test("Client session resumption #2", ++ &ssl_ctx, NULL, &sess_resume, ++ DEFAULT_CLNT_OPTION, NULL, NULL, NULL))) ++ goto cleanup; ++ ++ if ((ret = SSL_client_test("1024 bit key", ++ &ssl_ctx, ++ "-cert ../ssl/test/axTLS.x509_1024.pem " ++ "-key ../ssl/test/axTLS.key_1024.pem", NULL, ++ DEFAULT_CLNT_OPTION, NULL, NULL, NULL))) ++ goto cleanup; ++ ++ if ((ret = SSL_client_test("2048 bit key", ++ &ssl_ctx, ++ "-cert ../ssl/test/axTLS.x509_2048.pem " ++ "-key ../ssl/test/axTLS.key_2048.pem", NULL, ++ DEFAULT_CLNT_OPTION, NULL, NULL, NULL))) ++ goto cleanup; ++ ++ if ((ret = SSL_client_test("4096 bit key", ++ &ssl_ctx, ++ "-cert ../ssl/test/axTLS.x509_4096.pem " ++ "-key ../ssl/test/axTLS.key_4096.pem", NULL, ++ DEFAULT_CLNT_OPTION, NULL, NULL, NULL))) ++ goto cleanup; ++ ++ if ((ret = SSL_client_test("Server cert chaining", ++ &ssl_ctx, ++ "-cert ../ssl/test/axTLS.x509_device.pem " ++ "-key ../ssl/test/axTLS.device_key.pem " ++ "-CAfile ../ssl/test/axTLS.x509_512.pem ", NULL, ++ DEFAULT_CLNT_OPTION, NULL, NULL, NULL))) ++ goto cleanup; ++ ++ /* Check the server can verify the client */ ++ if ((ret = SSL_client_test("Client peer authentication", ++ &ssl_ctx, ++ "-cert ../ssl/test/axTLS.x509_2048.pem " ++ "-key ../ssl/test/axTLS.key_2048.pem " ++ "-CAfile ../ssl/test/axTLS.ca_x509.pem " ++ "-verify 1 ", NULL, DEFAULT_CLNT_OPTION, ++ "../ssl/test/axTLS.key_1024", NULL, ++ "../ssl/test/axTLS.x509_1024.cer"))) ++ goto cleanup; ++ ++ /* Should get an "ERROR" from openssl (as the handshake fails as soon as ++ * the certificate verification fails) */ ++ if ((ret = SSL_client_test("Error: Expired cert (verify now)", ++ &ssl_ctx, ++ "-cert ../ssl/test/axTLS.x509_bad_after.pem " ++ "-key ../ssl/test/axTLS.key_512.pem", NULL, ++ DEFAULT_CLNT_OPTION, NULL, NULL, NULL)) != ++ SSL_X509_ERROR(X509_VFY_ERROR_EXPIRED)) ++ { ++ printf("*** Error: %d\n", ret); ++ goto cleanup; ++ } ++ ++ printf("SSL client test \"Expired cert (verify now)\" passed\n"); ++ ++ /* There is no "ERROR" from openssl */ ++ if ((ret = SSL_client_test("Error: Expired cert (verify later)", ++ &ssl_ctx, ++ "-cert ../ssl/test/axTLS.x509_bad_after.pem " ++ "-key ../ssl/test/axTLS.key_512.pem", NULL, ++ DEFAULT_CLNT_OPTION|SSL_SERVER_VERIFY_LATER, NULL, ++ NULL, NULL)) != SSL_X509_ERROR(X509_VFY_ERROR_EXPIRED)) ++ { ++ printf("*** Error: %d\n", ret); ++ goto cleanup; ++ } ++ ++ printf("SSL client test \"Expired cert (verify later)\" passed\n"); ++ ret = 0; ++ ++cleanup: ++ if (ret) ++ { ++ ssl_display_error(ret); ++ printf("Error: A client test failed\n"); ++ exit(1); ++ } ++ else ++ { ++ printf("All client tests passed\n"); TTY_FLUSH(); ++ } ++ ++ return ret; ++} ++ ++/************************************************************************** ++ * SSL Basic Testing (test a big packet handshake) ++ * ++ **************************************************************************/ ++static uint8_t basic_buf[256*1024]; ++ ++static void do_basic(void) ++{ ++ int client_fd; ++ SSL *ssl_clnt; ++ SSL_CTX *ssl_clnt_ctx = ssl_ctx_new( ++ DEFAULT_CLNT_OPTION, SSL_DEFAULT_CLNT_SESS); ++ usleep(200000); /* allow server to start */ ++ ++ if ((client_fd = client_socket_init(g_port)) < 0) ++ goto error; ++ ++ if (ssl_obj_load(ssl_clnt_ctx, SSL_OBJ_X509_CACERT, ++ "../ssl/test/axTLS.ca_x509.cer", NULL)) ++ goto error; ++ ++ ssl_clnt = ssl_client_new(ssl_clnt_ctx, client_fd, NULL, 0); ++ ++ /* check the return status */ ++ if (ssl_handshake_status(ssl_clnt) < 0) ++ { ++ printf("YA YA\n"); ++ ssl_display_error(ssl_handshake_status(ssl_clnt)); ++ goto error; ++ } ++ ++ ssl_write(ssl_clnt, basic_buf, sizeof(basic_buf)); ++ ssl_free(ssl_clnt); ++ ++error: ++ ssl_ctx_free(ssl_clnt_ctx); ++ SOCKET_CLOSE(client_fd); ++ ++ /* exit this thread */ ++} ++ ++static int SSL_basic_test(void) ++{ ++ int server_fd, client_fd, ret = 0, size = 0, offset = 0; ++ SSL_CTX *ssl_svr_ctx = NULL; ++ struct sockaddr_in client_addr; ++ uint8_t *read_buf; ++ socklen_t clnt_len = sizeof(client_addr); ++ SSL *ssl_svr; ++#ifndef WIN32 ++ pthread_t thread; ++#endif ++ memset(basic_buf, 0xA5, sizeof(basic_buf)/2); ++ memset(&basic_buf[sizeof(basic_buf)/2], 0x5A, sizeof(basic_buf)/2); ++ ++ if ((server_fd = server_socket_init(&g_port)) < 0) ++ goto error; ++ ++ ssl_svr_ctx = ssl_ctx_new(DEFAULT_SVR_OPTION, SSL_DEFAULT_SVR_SESS); ++ ++#ifndef WIN32 ++ pthread_create(&thread, NULL, ++ (void *(*)(void *))do_basic, NULL); ++ pthread_detach(thread); ++#else ++ CreateThread(NULL, 1024, (LPTHREAD_START_ROUTINE)do_basic, NULL, 0, NULL); ++#endif ++ ++ /* Wait for a client to connect */ ++ if ((client_fd = accept(server_fd, ++ (struct sockaddr *) &client_addr, &clnt_len)) < 0) ++ { ++ ret = SSL_ERROR_SOCK_SETUP_FAILURE; ++ goto error; ++ } ++ ++ /* we are ready to go */ ++ ssl_svr = ssl_server_new(ssl_svr_ctx, client_fd); ++ ++ do ++ { ++ while ((size = ssl_read(ssl_svr, &read_buf)) == SSL_OK); ++ ++ if (size < SSL_OK) /* got some alert or something nasty */ ++ { ++ printf("Server "); ++ ssl_display_error(size); ++ ret = size; ++ break; ++ } ++ else /* looks more promising */ ++ { ++ if (memcmp(read_buf, &basic_buf[offset], size) != 0) ++ { ++ ret = SSL_NOT_OK; ++ break; ++ } ++ } ++ ++ offset += size; ++ } while (offset < sizeof(basic_buf)); ++ ++ printf(ret == SSL_OK && offset == sizeof(basic_buf) ? ++ "SSL basic test passed\n" : ++ "SSL basic test failed\n"); ++ TTY_FLUSH(); ++ ++ ssl_free(ssl_svr); ++ SOCKET_CLOSE(server_fd); ++ SOCKET_CLOSE(client_fd); ++ ++error: ++ ssl_ctx_free(ssl_svr_ctx); ++ return ret; ++} ++ ++#if !defined(WIN32) && defined(CONFIG_SSL_CTX_MUTEXING) ++/************************************************************************** ++ * Multi-Threading Tests ++ * ++ **************************************************************************/ ++#define NUM_THREADS 100 ++ ++typedef struct ++{ ++ SSL_CTX *ssl_clnt_ctx; ++ int port; ++ int thread_id; ++} multi_t; ++ ++void do_multi_clnt(multi_t *multi_data) ++{ ++ int res = 1, client_fd, i; ++ SSL *ssl = NULL; ++ char tmp[5]; ++ ++ if ((client_fd = client_socket_init(multi_data->port)) < 0) ++ goto client_test_exit; ++ ++ sleep(1); ++ ssl = ssl_client_new(multi_data->ssl_clnt_ctx, client_fd, NULL, 0); ++ ++ if ((res = ssl_handshake_status(ssl))) ++ { ++ printf("Client "); ++ ssl_display_error(res); ++ goto client_test_exit; ++ } ++ ++ sprintf(tmp, "%d\n", multi_data->thread_id); ++ for (i = 0; i < 10; i++) ++ ssl_write(ssl, (uint8_t *)tmp, strlen(tmp)+1); ++ ++client_test_exit: ++ ssl_free(ssl); ++ SOCKET_CLOSE(client_fd); ++ free(multi_data); ++} ++ ++void do_multi_svr(SSL *ssl) ++{ ++ uint8_t *read_buf; ++ int *res_ptr = malloc(sizeof(int)); ++ int res; ++ ++ for (;;) ++ { ++ res = ssl_read(ssl, &read_buf); ++ ++ /* kill the client */ ++ if (res != SSL_OK) ++ { ++ if (res == SSL_ERROR_CONN_LOST) ++ { ++ SOCKET_CLOSE(ssl->client_fd); ++ ssl_free(ssl); ++ break; ++ } ++ else if (res > 0) ++ { ++ /* do nothing */ ++ } ++ else /* some problem */ ++ { ++ printf("Server "); ++ ssl_display_error(res); ++ goto error; ++ } ++ } ++ } ++ ++ res = SSL_OK; ++error: ++ *res_ptr = res; ++ pthread_exit(res_ptr); ++} ++ ++int multi_thread_test(void) ++{ ++ int server_fd = -1; ++ SSL_CTX *ssl_server_ctx; ++ SSL_CTX *ssl_clnt_ctx; ++ pthread_t clnt_threads[NUM_THREADS]; ++ pthread_t svr_threads[NUM_THREADS]; ++ int i, res = 0; ++ struct sockaddr_in client_addr; ++ socklen_t clnt_len = sizeof(client_addr); ++ ++ printf("Do multi-threading test (takes a minute)\n"); ++ ++ ssl_server_ctx = ssl_ctx_new(DEFAULT_SVR_OPTION, SSL_DEFAULT_SVR_SESS); ++ ssl_clnt_ctx = ssl_ctx_new(DEFAULT_CLNT_OPTION, SSL_DEFAULT_CLNT_SESS); ++ ++ if (ssl_obj_load(ssl_clnt_ctx, SSL_OBJ_X509_CACERT, ++ "../ssl/test/axTLS.ca_x509.cer", NULL)) ++ goto error; ++ ++ if ((server_fd = server_socket_init(&g_port)) < 0) ++ goto error; ++ ++ for (i = 0; i < NUM_THREADS; i++) ++ { ++ multi_t *multi_data = (multi_t *)malloc(sizeof(multi_t)); ++ multi_data->ssl_clnt_ctx = ssl_clnt_ctx; ++ multi_data->port = g_port; ++ multi_data->thread_id = i+1; ++ pthread_create(&clnt_threads[i], NULL, ++ (void *(*)(void *))do_multi_clnt, (void *)multi_data); ++ pthread_detach(clnt_threads[i]); ++ } ++ ++ for (i = 0; i < NUM_THREADS; i++) ++ { ++ SSL *ssl_svr; ++ int client_fd = accept(server_fd, ++ (struct sockaddr *)&client_addr, &clnt_len); ++ ++ if (client_fd < 0) ++ goto error; ++ ++ ssl_svr = ssl_server_new(ssl_server_ctx, client_fd); ++ ++ pthread_create(&svr_threads[i], NULL, ++ (void *(*)(void *))do_multi_svr, (void *)ssl_svr); ++ } ++ ++ /* make sure we've run all of the threads */ ++ for (i = 0; i < NUM_THREADS; i++) ++ { ++ void *thread_res; ++ pthread_join(svr_threads[i], &thread_res); ++ ++ if (*((int *)thread_res) != 0) ++ res = 1; ++ ++ free(thread_res); ++ } ++ ++ if (res) ++ goto error; ++ ++ printf("Multi-thread test passed (%d)\n", NUM_THREADS); ++error: ++ ssl_ctx_free(ssl_server_ctx); ++ ssl_ctx_free(ssl_clnt_ctx); ++ SOCKET_CLOSE(server_fd); ++ return res; ++} ++#endif /* !defined(WIN32) && defined(CONFIG_SSL_CTX_MUTEXING) */ ++ ++/************************************************************************** ++ * Header issue ++ * ++ **************************************************************************/ ++static void do_header_issue(void) ++{ ++ char axtls_buf[2048]; ++#ifndef WIN32 ++ pthread_setcanceltype(PTHREAD_CANCEL_ASYNCHRONOUS, NULL); ++#endif ++ sprintf(axtls_buf, "./axssl s_client -connect localhost:%d", g_port); ++ system(axtls_buf); ++} ++ ++static int header_issue(void) ++{ ++ FILE *f = fopen("../ssl/test/header_issue.dat", "r"); ++ int server_fd = -1, client_fd = -1, ret = 1; ++ uint8_t buf[2048]; ++ int size = 0; ++ struct sockaddr_in client_addr; ++ socklen_t clnt_len = sizeof(client_addr); ++#ifndef WIN32 ++ pthread_t thread; ++#endif ++ ++ if (f == NULL || (server_fd = server_socket_init(&g_port)) < 0) ++ goto error; ++ ++#ifndef WIN32 ++ pthread_create(&thread, NULL, ++ (void *(*)(void *))do_header_issue, NULL); ++ pthread_detach(thread); ++#else ++ CreateThread(NULL, 1024, (LPTHREAD_START_ROUTINE)do_header_issue, ++ NULL, 0, NULL); ++#endif ++ if ((client_fd = accept(server_fd, ++ (struct sockaddr *) &client_addr, &clnt_len)) < 0) ++ { ++ ret = SSL_ERROR_SOCK_SETUP_FAILURE; ++ goto error; ++ } ++ ++ size = fread(buf, 1, sizeof(buf), f); ++ SOCKET_WRITE(client_fd, buf, size); ++ usleep(200000); ++ ++ ret = 0; ++error: ++ fclose(f); ++ SOCKET_CLOSE(client_fd); ++ SOCKET_CLOSE(server_fd); ++ TTY_FLUSH(); ++ system("killall axssl"); ++ return ret; ++} ++ ++/************************************************************************** ++ * main() ++ * ++ **************************************************************************/ ++int main(int argc, char *argv[]) ++{ ++ int ret = 1; ++ BI_CTX *bi_ctx; ++ int fd; ++ ++#ifdef WIN32 ++ WSADATA wsaData; ++ WORD wVersionRequested = MAKEWORD(2, 2); ++ WSAStartup(wVersionRequested, &wsaData); ++ fd = _open("test_result.txt", O_WRONLY|O_TEMPORARY|O_CREAT, _S_IWRITE); ++ dup2(fd, 2); /* write stderr to this file */ ++#else ++ fd = open("/dev/null", O_WRONLY); /* write stderr to /dev/null */ ++ signal(SIGPIPE, SIG_IGN); /* ignore pipe errors */ ++ dup2(fd, 2); ++#endif ++ ++ /* can't do testing in this mode */ ++#if defined CONFIG_SSL_GENERATE_X509_CERT ++ printf("Error: Must compile with default key/certificates\n"); ++ exit(1); ++#endif ++ ++ bi_ctx = bi_initialize(); ++ ++ if (AES_test(bi_ctx)) ++ { ++ printf("AES tests failed\n"); ++ goto cleanup; ++ } ++ TTY_FLUSH(); ++ ++ if (RC4_test(bi_ctx)) ++ { ++ printf("RC4 tests failed\n"); ++ goto cleanup; ++ } ++ TTY_FLUSH(); ++ ++ if (MD5_test(bi_ctx)) ++ { ++ printf("MD5 tests failed\n"); ++ goto cleanup; ++ } ++ TTY_FLUSH(); ++ ++ if (SHA1_test(bi_ctx)) ++ { ++ printf("SHA1 tests failed\n"); ++ goto cleanup; ++ } ++ TTY_FLUSH(); ++ ++ if (HMAC_test(bi_ctx)) ++ { ++ printf("HMAC tests failed\n"); ++ goto cleanup; ++ } ++ TTY_FLUSH(); ++ ++ if (BIGINT_test(bi_ctx)) ++ { ++ printf("BigInt tests failed!\n"); ++ goto cleanup; ++ } ++ TTY_FLUSH(); ++ ++ bi_terminate(bi_ctx); ++ ++ if (RSA_test()) ++ { ++ printf("RSA tests failed\n"); ++ goto cleanup; ++ } ++ TTY_FLUSH(); ++ ++ if (cert_tests()) ++ { ++ printf("CERT tests failed\n"); ++ goto cleanup; ++ } ++ TTY_FLUSH(); ++ ++#if !defined(WIN32) && defined(CONFIG_SSL_CTX_MUTEXING) ++ if (multi_thread_test()) ++ goto cleanup; ++#endif ++ ++ if (SSL_basic_test()) ++ goto cleanup; ++ ++ system("sh ../ssl/test/killopenssl.sh"); ++ ++ if (SSL_client_tests()) ++ goto cleanup; ++ ++ system("sh ../ssl/test/killopenssl.sh"); ++ ++ if (SSL_server_tests()) ++ goto cleanup; ++ ++ system("sh ../ssl/test/killopenssl.sh"); ++ ++ if (header_issue()) ++ { ++ printf("Header tests failed\n"); TTY_FLUSH(); ++ goto cleanup; ++ } ++ ++ ret = 0; /* all ok */ ++ printf("**** ALL TESTS PASSED ****\n"); TTY_FLUSH(); ++cleanup: ++ ++ if (ret) ++ printf("Error: Some tests failed!\n"); ++ ++ close(fd); ++ return ret; ++} +diff --git a/feeds/luci/libs/luci-lib-nixio/axTLS/ssl/test/test_axssl.sh b/feeds/luci/libs/luci-lib-nixio/axTLS/ssl/test/test_axssl.sh +new file mode 100755 +index 0000000..acf11a6 +--- /dev/null ++++ b/feeds/luci/libs/luci-lib-nixio/axTLS/ssl/test/test_axssl.sh +@@ -0,0 +1,163 @@ ++#!/bin/sh ++ ++# ++# Copyright (c) 2007, Cameron Rich ++# ++# All rights reserved. ++# ++# Redistribution and use in source and binary forms, with or without ++# modification, are permitted provided that the following conditions are met: ++# ++# * Redistributions of source code must retain the above copyright notice, ++# this list of conditions and the following disclaimer. ++# * 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. ++# * Neither the name of the axTLS project nor the names of its ++# contributors may be used to endorse or promote products derived ++# from this software without specific prior written permission. ++# ++# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ++# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT ++# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR ++# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR ++# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, ++# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED ++# TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, ++# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY ++# OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING ++# NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF ++# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ++# ++ ++# ++# Test the various axssl bindings. To run it, got to the _install directory ++# and run this script from there. ++# ++ ++if grep "CONFIG_PLATFORM_WIN32=y" "../config/.config" > /dev/null; then ++ JAVA_EXE="$JAVA_HOME/bin/java.exe" ++ PERL_BIN="/cygdrive/c/Perl/bin/perl" ++ KILL_AXSSL="kill %1" ++ KILL_CSHARP="kill %1" ++ KILL_PERL="kill %1" ++ KILL_JAVA="kill %1" ++ KILL_LUA="kill %1" ++else ++ if grep "CONFIG_PLATFORM_CYGWIN=y" "../config/.config" > /dev/null; then ++ # no .net or java on cygwin ++ PERL_BIN=/usr/bin/perl ++ KILL_AXSSL="killall axssl" ++ KILL_PERL="killall /usr/bin/perl" ++ KILL_LUA="killall /usr/local/bin/lua" ++ else # Linux ++ JAVA_EXE=/usr/java/default/bin/java ++ PERL_BIN=/usr/bin/perl ++ KILL_AXSSL="killall axssl" ++ KILL_CSHARP="killall mono" ++ KILL_PERL="killall /usr/bin/perl" ++ RUN_CSHARP="mono" ++ KILL_JAVA="killall $JAVA_EXE" ++ KILL_LUA="killall /usr/local/bin/lua" ++ fi ++fi ++ ++BASE=.. ++SERVER_ARGS="s_server -accept 15001 -verify -CAfile $BASE/ssl/test/axTLS.ca_x509.cer" ++CLIENT_ARGS="s_client -reconnect -connect localhost:15001 -verify -CAfile $BASE/ssl/test/axTLS.ca_x509.cer -key $BASE/ssl/test/axTLS.key_1024 -cert $BASE/ssl/test/axTLS.x509_1024.cer" ++ ++# check pem arguments ++SERVER_PEM_ARGS="s_server -accept 15001 -pass abcd -key $BASE/ssl/test/axTLS.key_aes128.pem -cert $BASE/ssl/test/axTLS.x509_aes128.pem" ++CLIENT_PEM_ARGS="s_client -connect localhost:15001 -CAfile $BASE/ssl/test/axTLS.ca_x509.pem -key $BASE/ssl/test/axTLS.key_1024.pem -cert $BASE/ssl/test/axTLS.x509_1024.pem" ++ ++export LD_LIBRARY_PATH=.:`perl -e 'use Config; print $Config{archlib};'`/CORE ++ ++if [ -x ./axssl ]; then ++echo "############################# C SAMPLE ###########################" ++./axssl $SERVER_ARGS & ++echo "C Test passed" | ./axssl $CLIENT_ARGS ++$KILL_AXSSL ++sleep 1 ++ ++./axssl $SERVER_PEM_ARGS & ++echo "C Test passed" | ./axssl $CLIENT_PEM_ARGS ++$KILL_AXSSL ++sleep 1 ++echo "### C tests complete" ++fi ++ ++if [ -f ./axtls.jar ]; then ++echo "########################## JAVA SAMPLE ###########################" ++"$JAVA_EXE" -jar ./axtls.jar $SERVER_ARGS & ++echo "Java Test passed" | "$JAVA_EXE" -jar ./axtls.jar $CLIENT_ARGS ++$KILL_JAVA ++sleep 1 ++ ++"$JAVA_EXE" -jar ./axtls.jar $SERVER_PEM_ARGS & ++echo "Java Test passed" | "$JAVA_EXE" -jar ./axtls.jar $CLIENT_PEM_ARGS ++$KILL_JAVA ++sleep 1 ++ ++echo "### Java tests complete" ++fi ++ ++if [ -x ./axssl.csharp.exe ]; then ++echo "############################ C# SAMPLE ###########################" ++$RUN_CSHARP ./axssl.csharp.exe $SERVER_ARGS & ++echo "C# Test passed" | $RUN_CSHARP ./axssl.csharp.exe $CLIENT_ARGS ++$KILL_CSHARP ++sleep 1 ++ ++$RUN_CSHARP ./axssl.csharp.exe $SERVER_PEM_ARGS & ++echo "C# Test passed" | $RUN_CSHARP ./axssl.csharp.exe $CLIENT_PEM_ARGS ++$KILL_CSHARP ++sleep 1 ++ ++echo "### C# tests complete" ++fi ++ ++if [ -x ./axssl.vbnet.exe ]; then ++echo "######################## VB.NET SAMPLE ###########################" ++echo $SERVER_ARGS ++echo $CLIENT_ARGS ++./axssl.vbnet $SERVER_ARGS & ++echo "VB.NET Test passed" | ./axssl.vbnet.exe $CLIENT_ARGS ++kill %1 ++sleep 1 ++ ++./axssl.vbnet $SERVER_PEM_ARGS & ++echo "VB.NET Test passed" | ./axssl.vbnet.exe $CLIENT_PEM_ARGS ++kill %1 ++sleep 1 ++echo "### VB.NET tests complete" ++fi ++ ++if [ -f ./axssl.pl ]; then ++echo "########################## PERL SAMPLE ###########################" ++"$PERL_BIN" ./axssl.pl $SERVER_ARGS & ++echo "Perl Test passed" | "$PERL_BIN" ./axssl.pl $CLIENT_ARGS ++$KILL_PERL ++sleep 1 ++ ++"$PERL_BIN" ./axssl.pl $SERVER_PEM_ARGS & ++echo "Perl Test passed" | "$PERL_BIN" ./axssl.pl $CLIENT_PEM_ARGS ++$KILL_PERL ++sleep 1 ++echo "### Perl tests complete" ++fi ++ ++if [ -f ./axssl.lua ]; then ++echo "########################## LUA SAMPLE ###########################" ++./axssl.lua $SERVER_ARGS & ++echo "Lua Test passed" | ./axssl.lua $CLIENT_ARGS ++$KILL_LUA ++sleep 1 ++ ++./axssl.lua $SERVER_PEM_ARGS & ++echo "Lua Test passed" | ./axssl.lua $CLIENT_PEM_ARGS ++$KILL_LUA ++sleep 1 ++echo "### Lua tests complete" ++fi ++ ++echo "########################## ALL TESTS COMPLETE ###########################" +diff --git a/feeds/luci/libs/luci-lib-nixio/axTLS/ssl/test/thawte.x509_ca b/feeds/luci/libs/luci-lib-nixio/axTLS/ssl/test/thawte.x509_ca +new file mode 100644 +index 0000000000000000000000000000000000000000..59b1059f84086fa580dc1001303c4db4e070e572 +GIT binary patch +literal 811 +zcmXqLVpcb3Vw$jknTe5!iILHOmyJ`a&71aK>;=YaCsSi1!zDAbtnTZF +zqUYUebWG~Ec<0FydhNn{8R@BF?(Zc$Os#^xXlJqYTkF3Hd%V7_cb@q7d0SFTnS9@$ +z=3Jy0cw_d3^b5OqC$WhXUzvP*x)#Hn7(bppzeI!nd~(UVCFqsMF<)Qz@y}IOZN=N% +zf+J3JvhHmb+)-@5ioN%XlkanfxiaQV%!~|-i-ipY4fugEEGx{&_@9N=wue#B(wSB};{CmAjN`|kTB +z=H&c*ca+=jgU1BrKYDG@a65VUh*RyJU#lbYu5J(P5PZC(RWiHDX9`CKd5-@#z5p&(TMr~SNx>{S1)iXw~p883_fotvm7>@WOHLUXNt;H*b_ +z|IQe^xO{Hv`^QNljGg@tW>o80?|dhoUHjsH8z1xKWBTV_tO(!D#LURRi0nLIbTb3p +zWwp-Y-R7SHR;@y@?^|{x`0o6ab&@xk`Ta5fEloQwoG`H15dW%Sy}DTBd%Xlc@q%Y{ +zucp0BS^d~*aFB_*;n@8JsUPeY%RtAH{ +z9z$*ePB!LH7B*p~&|pJx15pr%OPDV#wJ0+>?aaMVZA(iFv7pk_O@+AubVt#ESf!{1BgDg@B^`tkmQZ +zLs0`^kQBEFkD-B)i9%9li9&X2rJZKq+vngJKw%B24vwDh#|p1}Oj&s-uBD8&^V`2V>h0S4MVG149FSHV$nz +zVA5n~ViZ#b8D9)EA5X{|$b!sLWf3zFf$3ysgtM3oOkiwAMivbNH3JnG-+-}A0_yzy +zjW}s*wZ@|vRs?EpDB*h}q +z|Map{+nV0K?8E09vaWbY=u}JU8K^@10Q5pmetJHN9r|U(U@?$MsF{)(m>{%MIgMNe +zF3gcp;g*^HXwj|JH%sakW^XY%?K}Ip+slNyvt8M1?Uz`5cz$g&-`l2-@0b62`(fXd +z*3a*ARU9g<^p4fEd ++#include ++#include ++#include ++#include "ssl.h" ++ ++/* The session expiry time */ ++#define SSL_EXPIRY_TIME (CONFIG_SSL_EXPIRY_TIME*3600) ++ ++static const uint8_t g_hello_request[] = { HS_HELLO_REQUEST, 0, 0, 0 }; ++static const uint8_t g_chg_cipher_spec_pkt[] = { 1 }; ++static const char * server_finished = "server finished"; ++static const char * client_finished = "client finished"; ++ ++static int do_handshake(SSL *ssl, uint8_t *buf, int read_len); ++static void set_key_block(SSL *ssl, int is_write); ++static int verify_digest(SSL *ssl, int mode, const uint8_t *buf, int read_len); ++static void *crypt_new(SSL *ssl, uint8_t *key, uint8_t *iv, int is_decrypt); ++static int send_raw_packet(SSL *ssl, uint8_t protocol); ++ ++/** ++ * The server will pick the cipher based on the order that the order that the ++ * ciphers are listed. This order is defined at compile time. ++ */ ++#ifdef CONFIG_SSL_SKELETON_MODE ++const uint8_t ssl_prot_prefs[NUM_PROTOCOLS] = ++{ SSL_RC4_128_SHA }; ++#else ++static void session_free(SSL_SESSION *ssl_sessions[], int sess_index); ++ ++const uint8_t ssl_prot_prefs[NUM_PROTOCOLS] = ++#ifdef CONFIG_SSL_PROT_LOW /* low security, fast speed */ ++{ SSL_RC4_128_SHA, SSL_AES128_SHA, SSL_AES256_SHA, SSL_RC4_128_MD5 }; ++#elif CONFIG_SSL_PROT_MEDIUM /* medium security, medium speed */ ++{ SSL_AES128_SHA, SSL_AES256_SHA, SSL_RC4_128_SHA, SSL_RC4_128_MD5 }; ++#else /* CONFIG_SSL_PROT_HIGH */ /* high security, low speed */ ++{ SSL_AES256_SHA, SSL_AES128_SHA, SSL_RC4_128_SHA, SSL_RC4_128_MD5 }; ++#endif ++#endif /* CONFIG_SSL_SKELETON_MODE */ ++ ++/** ++ * The cipher map containing all the essentials for each cipher. ++ */ ++#ifdef CONFIG_SSL_SKELETON_MODE ++static const cipher_info_t cipher_info[NUM_PROTOCOLS] = ++{ ++ { /* RC4-SHA */ ++ SSL_RC4_128_SHA, /* RC4-SHA */ ++ 16, /* key size */ ++ 0, /* iv size */ ++ 2*(SHA1_SIZE+16), /* key block size */ ++ 0, /* no padding */ ++ SHA1_SIZE, /* digest size */ ++ hmac_sha1, /* hmac algorithm */ ++ (crypt_func)RC4_crypt, /* encrypt */ ++ (crypt_func)RC4_crypt /* decrypt */ ++ }, ++}; ++#else ++static const cipher_info_t cipher_info[NUM_PROTOCOLS] = ++{ ++ { /* AES128-SHA */ ++ SSL_AES128_SHA, /* AES128-SHA */ ++ 16, /* key size */ ++ 16, /* iv size */ ++ 2*(SHA1_SIZE+16+16), /* key block size */ ++ 16, /* block padding size */ ++ SHA1_SIZE, /* digest size */ ++ hmac_sha1, /* hmac algorithm */ ++ (crypt_func)AES_cbc_encrypt, /* encrypt */ ++ (crypt_func)AES_cbc_decrypt /* decrypt */ ++ }, ++ { /* AES256-SHA */ ++ SSL_AES256_SHA, /* AES256-SHA */ ++ 32, /* key size */ ++ 16, /* iv size */ ++ 2*(SHA1_SIZE+32+16), /* key block size */ ++ 16, /* block padding size */ ++ SHA1_SIZE, /* digest size */ ++ hmac_sha1, /* hmac algorithm */ ++ (crypt_func)AES_cbc_encrypt, /* encrypt */ ++ (crypt_func)AES_cbc_decrypt /* decrypt */ ++ }, ++ { /* RC4-SHA */ ++ SSL_RC4_128_SHA, /* RC4-SHA */ ++ 16, /* key size */ ++ 0, /* iv size */ ++ 2*(SHA1_SIZE+16), /* key block size */ ++ 0, /* no padding */ ++ SHA1_SIZE, /* digest size */ ++ hmac_sha1, /* hmac algorithm */ ++ (crypt_func)RC4_crypt, /* encrypt */ ++ (crypt_func)RC4_crypt /* decrypt */ ++ }, ++ /* ++ * This protocol is from SSLv2 days and is unlikely to be used - but was ++ * useful for testing different possible digest algorithms. ++ */ ++ { /* RC4-MD5 */ ++ SSL_RC4_128_MD5, /* RC4-MD5 */ ++ 16, /* key size */ ++ 0, /* iv size */ ++ 2*(MD5_SIZE+16), /* key block size */ ++ 0, /* no padding */ ++ MD5_SIZE, /* digest size */ ++ hmac_md5, /* hmac algorithm */ ++ (crypt_func)RC4_crypt, /* encrypt */ ++ (crypt_func)RC4_crypt /* decrypt */ ++ }, ++}; ++#endif ++ ++static void prf(const uint8_t *sec, int sec_len, uint8_t *seed, int seed_len, ++ uint8_t *out, int olen); ++static const cipher_info_t *get_cipher_info(uint8_t cipher); ++static void increment_read_sequence(SSL *ssl); ++static void increment_write_sequence(SSL *ssl); ++static void add_hmac_digest(SSL *ssl, int snd, uint8_t *hmac_header, ++ const uint8_t *buf, int buf_len, uint8_t *hmac_buf); ++ ++/* win32 VC6.0 doesn't have variadic macros */ ++#if defined(WIN32) && !defined(CONFIG_SSL_FULL_MODE) ++void DISPLAY_BYTES(SSL *ssl, const char *format, ++ const uint8_t *data, int size, ...) {} ++#endif ++ ++/** ++ * Establish a new client/server context. ++ */ ++EXP_FUNC SSL_CTX *STDCALL ssl_ctx_new(uint32_t options, int num_sessions) ++{ ++ SSL_CTX *ssl_ctx = (SSL_CTX *)calloc(1, sizeof (SSL_CTX)); ++ ssl_ctx->options = options; ++ ++ if (load_key_certs(ssl_ctx) < 0) ++ { ++ free(ssl_ctx); /* can't load our key/certificate pair, so die */ ++ return NULL; ++ } ++ ++#ifndef CONFIG_SSL_SKELETON_MODE ++ ssl_ctx->num_sessions = num_sessions; ++#endif ++ ++ SSL_CTX_MUTEX_INIT(ssl_ctx->mutex); ++ ++#ifndef CONFIG_SSL_SKELETON_MODE ++ if (num_sessions) ++ { ++ ssl_ctx->ssl_sessions = (SSL_SESSION **) ++ calloc(1, num_sessions*sizeof(SSL_SESSION *)); ++ } ++#endif ++ ++ return ssl_ctx; ++} ++ ++/* ++ * Remove a client/server context. ++ */ ++EXP_FUNC void STDCALL ssl_ctx_free(SSL_CTX *ssl_ctx) ++{ ++ SSL *ssl; ++ int i; ++ ++ if (ssl_ctx == NULL) ++ return; ++ ++ ssl = ssl_ctx->head; ++ ++ /* clear out all the ssl entries */ ++ while (ssl) ++ { ++ SSL *next = ssl->next; ++ ssl_free(ssl); ++ ssl = next; ++ } ++ ++#ifndef CONFIG_SSL_SKELETON_MODE ++ /* clear out all the sessions */ ++ for (i = 0; i < ssl_ctx->num_sessions; i++) ++ session_free(ssl_ctx->ssl_sessions, i); ++ ++ free(ssl_ctx->ssl_sessions); ++#endif ++ ++ i = 0; ++ while (i < CONFIG_SSL_MAX_CERTS && ssl_ctx->certs[i].buf) ++ { ++ free(ssl_ctx->certs[i].buf); ++ ssl_ctx->certs[i++].buf = NULL; ++ } ++ ++#ifdef CONFIG_SSL_CERT_VERIFICATION ++ remove_ca_certs(ssl_ctx->ca_cert_ctx); ++#endif ++ ssl_ctx->chain_length = 0; ++ SSL_CTX_MUTEX_DESTROY(ssl_ctx->mutex); ++ RSA_free(ssl_ctx->rsa_ctx); ++ RNG_terminate(); ++ free(ssl_ctx); ++} ++ ++/* ++ * Free any used resources used by this connection. ++ */ ++EXP_FUNC void STDCALL ssl_free(SSL *ssl) ++{ ++ SSL_CTX *ssl_ctx; ++ ++ if (ssl == NULL) /* just ignore null pointers */ ++ return; ++ ++ /* spec says we must notify when we are dying */ ++ send_alert(ssl, SSL_ALERT_CLOSE_NOTIFY); ++ ++ ssl_ctx = ssl->ssl_ctx; ++ ++ SSL_CTX_LOCK(ssl_ctx->mutex); ++ ++ /* adjust the server SSL list */ ++ if (ssl->prev) ++ ssl->prev->next = ssl->next; ++ else ++ ssl_ctx->head = ssl->next; ++ ++ if (ssl->next) ++ ssl->next->prev = ssl->prev; ++ else ++ ssl_ctx->tail = ssl->prev; ++ ++ SSL_CTX_UNLOCK(ssl_ctx->mutex); ++ ++ /* may already be free - but be sure */ ++ free(ssl->encrypt_ctx); ++ free(ssl->decrypt_ctx); ++ disposable_free(ssl); ++#ifdef CONFIG_SSL_CERT_VERIFICATION ++ x509_free(ssl->x509_ctx); ++#endif ++ ++ free(ssl); ++} ++ ++/* ++ * Read the SSL connection and send any alerts for various errors. ++ */ ++EXP_FUNC int STDCALL ssl_read(SSL *ssl, uint8_t **in_data) ++{ ++ int ret = basic_read(ssl, in_data); ++ ++ /* check for return code so we can send an alert */ ++ if (ret < SSL_OK) ++ { ++ if (ret != SSL_ERROR_CONN_LOST) ++ { ++ send_alert(ssl, ret); ++#ifndef CONFIG_SSL_SKELETON_MODE ++ /* something nasty happened, so get rid of this session */ ++ kill_ssl_session(ssl->ssl_ctx->ssl_sessions, ssl); ++#endif ++ } ++ } ++ ++ return ret; ++} ++ ++/* ++ * Write application data to the client ++ */ ++EXP_FUNC int STDCALL ssl_write(SSL *ssl, const uint8_t *out_data, int out_len) ++{ ++ int n = out_len, nw, i, tot = 0; ++ ++ /* maximum size of a TLS packet is around 16kB, so fragment */ ++ do ++ { ++ nw = n; ++ ++ if (nw > RT_MAX_PLAIN_LENGTH) /* fragment if necessary */ ++ nw = RT_MAX_PLAIN_LENGTH; ++ ++ if ((i = send_packet(ssl, PT_APP_PROTOCOL_DATA, ++ &out_data[tot], nw)) <= 0) ++ { ++ out_len = i; /* an error */ ++ break; ++ } ++ ++ tot += i; ++ n -= i; ++ } while (n > 0); ++ ++ return out_len; ++} ++ ++/** ++ * Add a certificate to the certificate chain. ++ */ ++int add_cert(SSL_CTX *ssl_ctx, const uint8_t *buf, int len) ++{ ++ int ret = SSL_ERROR_NO_CERT_DEFINED, i = 0; ++ SSL_CERT *ssl_cert; ++ X509_CTX *cert = NULL; ++ int offset; ++ ++ while (ssl_ctx->certs[i].buf && i < CONFIG_SSL_MAX_CERTS) ++ i++; ++ ++ if (i == CONFIG_SSL_MAX_CERTS) /* too many certs */ ++ { ++#ifdef CONFIG_SSL_FULL_MODE ++ printf("Error: maximum number of certs added - change of " ++ "compile-time configuration required\n"); ++#endif ++ goto error; ++ } ++ ++ if ((ret = x509_new(buf, &offset, &cert))) ++ goto error; ++ ++#if defined (CONFIG_SSL_FULL_MODE) ++ if (ssl_ctx->options & SSL_DISPLAY_CERTS) ++ x509_print(cert, NULL); ++#endif ++ ++ ssl_cert = &ssl_ctx->certs[i]; ++ ssl_cert->size = len; ++ ssl_cert->buf = (uint8_t *)malloc(len); ++ memcpy(ssl_cert->buf, buf, len); ++ ssl_ctx->chain_length++; ++ len -= offset; ++ ret = SSL_OK; /* ok so far */ ++ ++ /* recurse? */ ++ if (len > 0) ++ { ++ ret = add_cert(ssl_ctx, &buf[offset], len); ++ } ++ ++error: ++ x509_free(cert); /* don't need anymore */ ++ return ret; ++} ++ ++#ifdef CONFIG_SSL_CERT_VERIFICATION ++/** ++ * Add a certificate authority. ++ */ ++int add_cert_auth(SSL_CTX *ssl_ctx, const uint8_t *buf, int len) ++{ ++ int ret = SSL_ERROR_NO_CERT_DEFINED; ++ int i = 0; ++ int offset; ++ CA_CERT_CTX *ca_cert_ctx; ++ ++ if (ssl_ctx->ca_cert_ctx == NULL) ++ ssl_ctx->ca_cert_ctx = (CA_CERT_CTX *)calloc(1, sizeof(CA_CERT_CTX)); ++ ++ ca_cert_ctx = ssl_ctx->ca_cert_ctx; ++ ++ while (i < CONFIG_X509_MAX_CA_CERTS && ca_cert_ctx->cert[i]) ++ i++; ++ ++ if (i > CONFIG_X509_MAX_CA_CERTS) ++ { ++#ifdef CONFIG_SSL_FULL_MODE ++ printf("Error: maximum number of CA certs added - change of " ++ "compile-time configuration required\n"); ++#endif ++ goto error; ++ } ++ ++ if ((ret = x509_new(buf, &offset, &ca_cert_ctx->cert[i]))) ++ goto error; ++ ++ len -= offset; ++ ret = SSL_OK; /* ok so far */ ++ ++ /* recurse? */ ++ if (len > 0) ++ ret = add_cert_auth(ssl_ctx, &buf[offset], len); ++ ++error: ++ return ret; ++} ++ ++/* ++ * Retrieve an X.509 distinguished name component ++ */ ++EXP_FUNC const char * STDCALL ssl_get_cert_dn(const SSL *ssl, int component) ++{ ++ if (ssl->x509_ctx == NULL) ++ return NULL; ++ ++ switch (component) ++ { ++ case SSL_X509_CERT_COMMON_NAME: ++ return ssl->x509_ctx->cert_dn[X509_COMMON_NAME]; ++ ++ case SSL_X509_CERT_ORGANIZATION: ++ return ssl->x509_ctx->cert_dn[X509_ORGANIZATION]; ++ ++ case SSL_X509_CERT_ORGANIZATIONAL_NAME: ++ return ssl->x509_ctx->cert_dn[X509_ORGANIZATIONAL_UNIT]; ++ ++ case SSL_X509_CA_CERT_COMMON_NAME: ++ return ssl->x509_ctx->ca_cert_dn[X509_COMMON_NAME]; ++ ++ case SSL_X509_CA_CERT_ORGANIZATION: ++ return ssl->x509_ctx->ca_cert_dn[X509_ORGANIZATION]; ++ ++ case SSL_X509_CA_CERT_ORGANIZATIONAL_NAME: ++ return ssl->x509_ctx->ca_cert_dn[X509_ORGANIZATIONAL_UNIT]; ++ ++ default: ++ return NULL; ++ } ++} ++ ++#endif ++ ++/* ++ * Find an ssl object based on the client's file descriptor. ++ */ ++EXP_FUNC SSL * STDCALL ssl_find(SSL_CTX *ssl_ctx, int client_fd) ++{ ++ SSL *ssl; ++ ++ SSL_CTX_LOCK(ssl_ctx->mutex); ++ ssl = ssl_ctx->head; ++ ++ /* search through all the ssl entries */ ++ while (ssl) ++ { ++ if (ssl->client_fd == client_fd) ++ { ++ SSL_CTX_UNLOCK(ssl_ctx->mutex); ++ return ssl; ++ } ++ ++ ssl = ssl->next; ++ } ++ ++ SSL_CTX_UNLOCK(ssl_ctx->mutex); ++ return NULL; ++} ++ ++/* ++ * Force the client to perform its handshake again. ++ */ ++EXP_FUNC int STDCALL ssl_renegotiate(SSL *ssl) ++{ ++ int ret = SSL_OK; ++ ++ disposable_new(ssl); ++#ifdef CONFIG_SSL_ENABLE_CLIENT ++ if (IS_SET_SSL_FLAG(SSL_IS_CLIENT)) ++ { ++ ret = do_client_connect(ssl); ++ } ++ else ++#endif ++ { ++ send_packet(ssl, PT_HANDSHAKE_PROTOCOL, ++ g_hello_request, sizeof(g_hello_request)); ++ SET_SSL_FLAG(SSL_NEED_RECORD); ++ } ++ ++ return ret; ++} ++ ++/** ++ * @brief Get what we need for key info. ++ * @param cipher [in] The cipher information we are after ++ * @param key_size [out] The key size for the cipher ++ * @param iv_size [out] The iv size for the cipher ++ * @return The amount of key information we need. ++ */ ++static const cipher_info_t *get_cipher_info(uint8_t cipher) ++{ ++ int i; ++ ++ for (i = 0; i < NUM_PROTOCOLS; i++) ++ { ++ if (cipher_info[i].cipher == cipher) ++ { ++ return &cipher_info[i]; ++ } ++ } ++ ++ return NULL; /* error */ ++} ++ ++/* ++ * Get a new ssl context for a new connection. ++ */ ++SSL *ssl_new(SSL_CTX *ssl_ctx, int client_fd) ++{ ++ SSL *ssl = (SSL *)calloc(1, sizeof(SSL)); ++ ssl->ssl_ctx = ssl_ctx; ++ ssl->need_bytes = SSL_RECORD_SIZE; /* need a record */ ++ ssl->client_fd = client_fd; ++ ssl->flag = SSL_NEED_RECORD; ++ ssl->bm_data = ssl->bm_all_data+BM_RECORD_OFFSET; /* space at the start */ ++ ssl->hs_status = SSL_NOT_OK; /* not connected */ ++#ifdef CONFIG_ENABLE_VERIFICATION ++ ssl->ca_cert_ctx = ssl_ctx->ca_cert_ctx; ++#endif ++ disposable_new(ssl); ++ ++ /* a bit hacky but saves a few bytes of memory */ ++ ssl->flag |= ssl_ctx->options; ++ SSL_CTX_LOCK(ssl_ctx->mutex); ++ ++ if (ssl_ctx->head == NULL) ++ { ++ ssl_ctx->head = ssl; ++ ssl_ctx->tail = ssl; ++ } ++ else ++ { ++ ssl->prev = ssl_ctx->tail; ++ ssl_ctx->tail->next = ssl; ++ ssl_ctx->tail = ssl; ++ } ++ ++ SSL_CTX_UNLOCK(ssl_ctx->mutex); ++ return ssl; ++} ++ ++/* ++ * Add a private key to a context. ++ */ ++int add_private_key(SSL_CTX *ssl_ctx, SSLObjLoader *ssl_obj) ++{ ++ int ret = SSL_OK; ++ ++ /* get the private key details */ ++ if (asn1_get_private_key(ssl_obj->buf, ssl_obj->len, &ssl_ctx->rsa_ctx)) ++ { ++ ret = SSL_ERROR_INVALID_KEY; ++ goto error; ++ } ++ ++error: ++ return ret; ++} ++ ++/** ++ * Increment the read sequence number (as a 64 bit endian indepenent #) ++ */ ++static void increment_read_sequence(SSL *ssl) ++{ ++ int i; ++ ++ for (i = 7; i >= 0; i--) ++ { ++ if (++ssl->read_sequence[i]) ++ break; ++ } ++} ++ ++/** ++ * Increment the read sequence number (as a 64 bit endian indepenent #) ++ */ ++static void increment_write_sequence(SSL *ssl) ++{ ++ int i; ++ ++ for (i = 7; i >= 0; i--) ++ { ++ if (++ssl->write_sequence[i]) ++ break; ++ } ++} ++ ++/** ++ * Work out the HMAC digest in a packet. ++ */ ++static void add_hmac_digest(SSL *ssl, int mode, uint8_t *hmac_header, ++ const uint8_t *buf, int buf_len, uint8_t *hmac_buf) ++{ ++ int hmac_len = buf_len + 8 + SSL_RECORD_SIZE; ++ uint8_t *t_buf = (uint8_t *)alloca(hmac_len+10); ++ ++ memcpy(t_buf, (mode == SSL_SERVER_WRITE || mode == SSL_CLIENT_WRITE) ? ++ ssl->write_sequence : ssl->read_sequence, 8); ++ memcpy(&t_buf[8], hmac_header, SSL_RECORD_SIZE); ++ memcpy(&t_buf[8+SSL_RECORD_SIZE], buf, buf_len); ++ ++ ssl->cipher_info->hmac(t_buf, hmac_len, ++ (mode == SSL_SERVER_WRITE || mode == SSL_CLIENT_READ) ? ++ ssl->server_mac : ssl->client_mac, ++ ssl->cipher_info->digest_size, hmac_buf); ++ ++#if 0 ++ print_blob("record", ssl->hmac_tx, SSL_RECORD_SIZE); ++ print_blob("buf", buf, buf_len); ++ if (mode == SSL_SERVER_WRITE || mode == SSL_CLIENT_WRITE) ++ { ++ print_blob("write seq", ssl->write_sequence, 8); ++ } ++ else ++ { ++ print_blob("read seq", ssl->read_sequence, 8); ++ } ++ ++ if (mode == SSL_SERVER_WRITE || mode == SSL_CLIENT_READ) ++ { ++ print_blob("server mac", ++ ssl->server_mac, ssl->cipher_info->digest_size); ++ } ++ else ++ { ++ print_blob("client mac", ++ ssl->client_mac, ssl->cipher_info->digest_size); ++ } ++ print_blob("hmac", hmac_buf, SHA1_SIZE); ++#endif ++} ++ ++/** ++ * Verify that the digest of a packet is correct. ++ */ ++static int verify_digest(SSL *ssl, int mode, const uint8_t *buf, int read_len) ++{ ++ uint8_t hmac_buf[SHA1_SIZE]; ++ int hmac_offset; ++ ++ if (ssl->cipher_info->padding_size) ++ { ++ hmac_offset = read_len-buf[read_len-1]-ssl->cipher_info->digest_size-1; ++ } ++ else ++ { ++ hmac_offset = read_len - ssl->cipher_info->digest_size; ++ } ++ ++ /* sanity check the offset */ ++ if (hmac_offset < 0) ++ { ++ return SSL_ERROR_INVALID_HMAC; ++ } ++ ++ ssl->hmac_header[3] = hmac_offset >> 8; /* insert size */ ++ ssl->hmac_header[4] = hmac_offset & 0xff; ++ add_hmac_digest(ssl, mode, ssl->hmac_header, buf, hmac_offset, hmac_buf); ++ ++ if (memcmp(hmac_buf, &buf[hmac_offset], ssl->cipher_info->digest_size)) ++ { ++ return SSL_ERROR_INVALID_HMAC; ++ } ++ ++ return hmac_offset; ++} ++ ++/** ++ * Add a packet to the end of our sent and received packets, so that we may use ++ * it to calculate the hash at the end. ++ */ ++void add_packet(SSL *ssl, const uint8_t *pkt, int len) ++{ ++ MD5_Update(&ssl->dc->md5_ctx, pkt, len); ++ SHA1_Update(&ssl->dc->sha1_ctx, pkt, len); ++} ++ ++/** ++ * Work out the MD5 PRF. ++ */ ++static void p_hash_md5(const uint8_t *sec, int sec_len, ++ uint8_t *seed, int seed_len, uint8_t *out, int olen) ++{ ++ uint8_t a1[128]; ++ ++ /* A(1) */ ++ hmac_md5(seed, seed_len, sec, sec_len, a1); ++ memcpy(&a1[MD5_SIZE], seed, seed_len); ++ hmac_md5(a1, MD5_SIZE+seed_len, sec, sec_len, out); ++ ++ while (olen > MD5_SIZE) ++ { ++ uint8_t a2[MD5_SIZE]; ++ out += MD5_SIZE; ++ olen -= MD5_SIZE; ++ ++ /* A(N) */ ++ hmac_md5(a1, MD5_SIZE, sec, sec_len, a2); ++ memcpy(a1, a2, MD5_SIZE); ++ ++ /* work out the actual hash */ ++ hmac_md5(a1, MD5_SIZE+seed_len, sec, sec_len, out); ++ } ++} ++ ++/** ++ * Work out the SHA1 PRF. ++ */ ++static void p_hash_sha1(const uint8_t *sec, int sec_len, ++ uint8_t *seed, int seed_len, uint8_t *out, int olen) ++{ ++ uint8_t a1[128]; ++ ++ /* A(1) */ ++ hmac_sha1(seed, seed_len, sec, sec_len, a1); ++ memcpy(&a1[SHA1_SIZE], seed, seed_len); ++ hmac_sha1(a1, SHA1_SIZE+seed_len, sec, sec_len, out); ++ ++ while (olen > SHA1_SIZE) ++ { ++ uint8_t a2[SHA1_SIZE]; ++ out += SHA1_SIZE; ++ olen -= SHA1_SIZE; ++ ++ /* A(N) */ ++ hmac_sha1(a1, SHA1_SIZE, sec, sec_len, a2); ++ memcpy(a1, a2, SHA1_SIZE); ++ ++ /* work out the actual hash */ ++ hmac_sha1(a1, SHA1_SIZE+seed_len, sec, sec_len, out); ++ } ++} ++ ++/** ++ * Work out the PRF. ++ */ ++static void prf(const uint8_t *sec, int sec_len, uint8_t *seed, int seed_len, ++ uint8_t *out, int olen) ++{ ++ int len, i; ++ const uint8_t *S1, *S2; ++ uint8_t xbuf[256]; /* needs to be > the amount of key data */ ++ uint8_t ybuf[256]; /* needs to be > the amount of key data */ ++ ++ len = sec_len/2; ++ S1 = sec; ++ S2 = &sec[len]; ++ len += (sec_len & 1); /* add for odd, make longer */ ++ ++ p_hash_md5(S1, len, seed, seed_len, xbuf, olen); ++ p_hash_sha1(S2, len, seed, seed_len, ybuf, olen); ++ ++ for (i = 0; i < olen; i++) ++ out[i] = xbuf[i] ^ ybuf[i]; ++} ++ ++/** ++ * Generate a master secret based on the client/server random data and the ++ * premaster secret. ++ */ ++void generate_master_secret(SSL *ssl, const uint8_t *premaster_secret) ++{ ++ uint8_t buf[128]; /* needs to be > 13+32+32 in size */ ++ strcpy((char *)buf, "master secret"); ++ memcpy(&buf[13], ssl->dc->client_random, SSL_RANDOM_SIZE); ++ memcpy(&buf[45], ssl->dc->server_random, SSL_RANDOM_SIZE); ++ prf(premaster_secret, SSL_SECRET_SIZE, buf, 77, ssl->dc->master_secret, ++ SSL_SECRET_SIZE); ++} ++ ++/** ++ * Generate a 'random' blob of data used for the generation of keys. ++ */ ++static void generate_key_block(uint8_t *client_random, uint8_t *server_random, ++ uint8_t *master_secret, uint8_t *key_block, int key_block_size) ++{ ++ uint8_t buf[128]; ++ strcpy((char *)buf, "key expansion"); ++ memcpy(&buf[13], server_random, SSL_RANDOM_SIZE); ++ memcpy(&buf[45], client_random, SSL_RANDOM_SIZE); ++ prf(master_secret, SSL_SECRET_SIZE, buf, 77, key_block, key_block_size); ++} ++ ++/** ++ * Calculate the digest used in the finished message. This function also ++ * doubles up as a certificate verify function. ++ */ ++void finished_digest(SSL *ssl, const char *label, uint8_t *digest) ++{ ++ uint8_t mac_buf[128]; ++ uint8_t *q = mac_buf; ++ MD5_CTX md5_ctx = ssl->dc->md5_ctx; ++ SHA1_CTX sha1_ctx = ssl->dc->sha1_ctx; ++ ++ if (label) ++ { ++ strcpy((char *)q, label); ++ q += strlen(label); ++ } ++ ++ MD5_Final(q, &md5_ctx); ++ q += MD5_SIZE; ++ ++ SHA1_Final(q, &sha1_ctx); ++ q += SHA1_SIZE; ++ ++ if (label) ++ { ++ prf(ssl->dc->master_secret, SSL_SECRET_SIZE, mac_buf, (int)(q-mac_buf), ++ digest, SSL_FINISHED_HASH_SIZE); ++ } ++ else /* for use in a certificate verify */ ++ { ++ memcpy(digest, mac_buf, MD5_SIZE + SHA1_SIZE); ++ } ++ ++#if 0 ++ printf("label: %s\n", label); ++ print_blob("master secret", ssl->dc->master_secret, 48); ++ print_blob("mac_buf", mac_buf, q-mac_buf); ++ print_blob("finished digest", digest, SSL_FINISHED_HASH_SIZE); ++#endif ++} ++ ++/** ++ * Retrieve (and initialise) the context of a cipher. ++ */ ++static void *crypt_new(SSL *ssl, uint8_t *key, uint8_t *iv, int is_decrypt) ++{ ++ switch (ssl->cipher) ++ { ++#ifndef CONFIG_SSL_SKELETON_MODE ++ case SSL_AES128_SHA: ++ { ++ AES_CTX *aes_ctx = (AES_CTX *)malloc(sizeof(AES_CTX)); ++ AES_set_key(aes_ctx, key, iv, AES_MODE_128); ++ ++ if (is_decrypt) ++ { ++ AES_convert_key(aes_ctx); ++ } ++ ++ return (void *)aes_ctx; ++ } ++ ++ case SSL_AES256_SHA: ++ { ++ AES_CTX *aes_ctx = (AES_CTX *)malloc(sizeof(AES_CTX)); ++ AES_set_key(aes_ctx, key, iv, AES_MODE_256); ++ ++ if (is_decrypt) ++ { ++ AES_convert_key(aes_ctx); ++ } ++ ++ return (void *)aes_ctx; ++ } ++ break; ++ ++ case SSL_RC4_128_MD5: ++#endif ++ case SSL_RC4_128_SHA: ++ { ++ RC4_CTX *rc4_ctx = (RC4_CTX *)malloc(sizeof(RC4_CTX)); ++ RC4_setup(rc4_ctx, key, 16); ++ return (void *)rc4_ctx; ++ } ++ break; ++ } ++ ++ return NULL; /* its all gone wrong */ ++} ++ ++/** ++ * Send a packet over the socket. ++ */ ++static int send_raw_packet(SSL *ssl, uint8_t protocol) ++{ ++ uint8_t *rec_buf = ssl->bm_all_data; ++ int pkt_size = SSL_RECORD_SIZE+ssl->bm_index; ++ int sent = 0; ++ int ret = SSL_OK; ++ ++ rec_buf[0] = protocol; ++ rec_buf[1] = 0x03; /* version = 3.1 (TLS) */ ++ rec_buf[2] = 0x01; ++ rec_buf[3] = ssl->bm_index >> 8; ++ rec_buf[4] = ssl->bm_index & 0xff; ++ ++ DISPLAY_BYTES(ssl, "sending %d bytes", ssl->bm_all_data, ++ pkt_size, pkt_size); ++ ++ while (sent < pkt_size) ++ { ++ if ((ret = SOCKET_WRITE(ssl->client_fd, ++ &ssl->bm_all_data[sent], pkt_size)) < 0) ++ { ++ ret = SSL_ERROR_CONN_LOST; ++ break; ++ } ++ ++ sent += ret; ++ ++ /* keep going until the write buffer has some space */ ++ if (sent != pkt_size) ++ { ++ fd_set wfds; ++ FD_ZERO(&wfds); ++ FD_SET(ssl->client_fd, &wfds); ++ ++ if (select(ssl->client_fd + 1, NULL, &wfds, NULL, NULL) < 0) ++ { ++ ret = SSL_ERROR_CONN_LOST; ++ break; ++ } ++ } ++ } ++ ++ SET_SSL_FLAG(SSL_NEED_RECORD); /* reset for next time */ ++ ssl->bm_index = 0; ++ ++ if (protocol != PT_APP_PROTOCOL_DATA) ++ { ++ /* always return SSL_OK during handshake */ ++ ret = SSL_OK; ++ } ++ ++ return ret; ++} ++ ++/** ++ * Send an encrypted packet with padding bytes if necessary. ++ */ ++int send_packet(SSL *ssl, uint8_t protocol, const uint8_t *in, int length) ++{ ++ int msg_length = length; ++ int ret, pad_bytes = 0; ++ ssl->bm_index = msg_length; ++ ++ /* if our state is bad, don't bother */ ++ if (ssl->hs_status == SSL_ERROR_DEAD) ++ return SSL_ERROR_CONN_LOST; ++ ++ if (in) /* has the buffer already been initialised? */ ++ { ++ memcpy(ssl->bm_data, in, length); ++ } ++ ++ if (IS_SET_SSL_FLAG(SSL_TX_ENCRYPTED)) ++ { ++ int mode = IS_SET_SSL_FLAG(SSL_IS_CLIENT) ? ++ SSL_CLIENT_WRITE : SSL_SERVER_WRITE; ++ uint8_t hmac_header[SSL_RECORD_SIZE]; ++ ++ hmac_header[0] = protocol; ++ hmac_header[1] = 0x03; ++ hmac_header[2] = 0x01; ++ hmac_header[3] = length >> 8; ++ hmac_header[4] = length & 0xff; ++ ++ if (protocol == PT_HANDSHAKE_PROTOCOL) ++ { ++ DISPLAY_STATE(ssl, 1, ssl->bm_data[0], 0); ++ ++ if (ssl->bm_data[0] != HS_HELLO_REQUEST) ++ { ++ add_packet(ssl, ssl->bm_data, ssl->bm_index); ++ } ++ } ++ ++ /* add the packet digest */ ++ msg_length += ssl->cipher_info->digest_size; ++ ssl->bm_index = msg_length; ++ add_hmac_digest(ssl, mode, hmac_header, ssl->bm_data, length, ++ &ssl->bm_data[length]); ++ ++ /* add padding? */ ++ if (ssl->cipher_info->padding_size) ++ { ++ int last_blk_size = msg_length%ssl->cipher_info->padding_size; ++ pad_bytes = ssl->cipher_info->padding_size - last_blk_size; ++ ++ /* ensure we always have at least 1 padding byte */ ++ if (pad_bytes == 0) ++ pad_bytes += ssl->cipher_info->padding_size; ++ ++ memset(&ssl->bm_data[msg_length], pad_bytes-1, pad_bytes); ++ msg_length += pad_bytes; ++ ssl->bm_index = msg_length; ++ } ++ ++ DISPLAY_BYTES(ssl, "unencrypted write", ssl->bm_data, msg_length); ++ increment_write_sequence(ssl); ++ ++ /* now encrypt the packet */ ++ ssl->cipher_info->encrypt(ssl->encrypt_ctx, ssl->bm_data, ++ ssl->bm_data, msg_length); ++ } ++ else if (protocol == PT_HANDSHAKE_PROTOCOL) ++ { ++ DISPLAY_STATE(ssl, 1, ssl->bm_data[0], 0); ++ ++ if (ssl->bm_data[0] != HS_HELLO_REQUEST) ++ { ++ add_packet(ssl, ssl->bm_data, ssl->bm_index); ++ } ++ } ++ ++ if ((ret = send_raw_packet(ssl, protocol)) <= 0) ++ return ret; ++ ++ return length; /* just return what we wanted to send */ ++} ++ ++/** ++ * Work out the cipher keys we are going to use for this session based on the ++ * master secret. ++ */ ++static void set_key_block(SSL *ssl, int is_write) ++{ ++ const cipher_info_t *ciph_info = get_cipher_info(ssl->cipher); ++ uint8_t *q; ++ uint8_t client_key[32], server_key[32]; /* big enough for AES256 */ ++ uint8_t client_iv[16], server_iv[16]; /* big enough for AES128/256 */ ++ int is_client = IS_SET_SSL_FLAG(SSL_IS_CLIENT); ++ ++ /* only do once in a handshake */ ++ if (ssl->dc->key_block == NULL) ++ { ++ ssl->dc->key_block = (uint8_t *)malloc(ciph_info->key_block_size); ++ ++#if 0 ++ print_blob("client", ssl->dc->client_random, 32); ++ print_blob("server", ssl->dc->server_random, 32); ++ print_blob("master", ssl->dc->master_secret, SSL_SECRET_SIZE); ++#endif ++ generate_key_block(ssl->dc->client_random, ssl->dc->server_random, ++ ssl->dc->master_secret, ssl->dc->key_block, ++ ciph_info->key_block_size); ++#if 0 ++ print_blob("keyblock", ssl->key_block, ciph_info->key_block_size); ++#endif ++ } ++ ++ q = ssl->dc->key_block; ++ ++ if ((is_client && is_write) || (!is_client && !is_write)) ++ { ++ memcpy(ssl->client_mac, q, ciph_info->digest_size); ++ } ++ ++ q += ciph_info->digest_size; ++ ++ if ((!is_client && is_write) || (is_client && !is_write)) ++ { ++ memcpy(ssl->server_mac, q, ciph_info->digest_size); ++ } ++ ++ q += ciph_info->digest_size; ++ memcpy(client_key, q, ciph_info->key_size); ++ q += ciph_info->key_size; ++ memcpy(server_key, q, ciph_info->key_size); ++ q += ciph_info->key_size; ++ ++#ifndef CONFIG_SSL_SKELETON_MODE ++ if (ciph_info->iv_size) /* RC4 has no IV, AES does */ ++ { ++ memcpy(client_iv, q, ciph_info->iv_size); ++ q += ciph_info->iv_size; ++ memcpy(server_iv, q, ciph_info->iv_size); ++ q += ciph_info->iv_size; ++ } ++#endif ++ ++ free(is_write ? ssl->encrypt_ctx : ssl->decrypt_ctx); ++ ++ /* now initialise the ciphers */ ++ if (is_client) ++ { ++ finished_digest(ssl, server_finished, ssl->dc->final_finish_mac); ++ ++ if (is_write) ++ ssl->encrypt_ctx = crypt_new(ssl, client_key, client_iv, 0); ++ else ++ ssl->decrypt_ctx = crypt_new(ssl, server_key, server_iv, 1); ++ } ++ else ++ { ++ finished_digest(ssl, client_finished, ssl->dc->final_finish_mac); ++ ++ if (is_write) ++ ssl->encrypt_ctx = crypt_new(ssl, server_key, server_iv, 0); ++ else ++ ssl->decrypt_ctx = crypt_new(ssl, client_key, client_iv, 1); ++ } ++ ++ ssl->cipher_info = ciph_info; ++} ++ ++/** ++ * Read the SSL connection. ++ */ ++int basic_read(SSL *ssl, uint8_t **in_data) ++{ ++ int ret = SSL_OK; ++ int read_len, is_client = IS_SET_SSL_FLAG(SSL_IS_CLIENT); ++ uint8_t *buf = ssl->bm_data; ++ ++ read_len = SOCKET_READ(ssl->client_fd, &buf[ssl->bm_read_index], ++ ssl->need_bytes-ssl->got_bytes); ++ ++ /* connection has gone, so die */ ++ if (read_len <= 0) ++ { ++ ret = SSL_ERROR_CONN_LOST; ++ ssl->hs_status = SSL_ERROR_DEAD; /* make sure it stays dead */ ++ goto error; ++ } ++ ++ DISPLAY_BYTES(ssl, "received %d bytes", ++ &ssl->bm_data[ssl->bm_read_index], read_len, read_len); ++ ++ ssl->got_bytes += read_len; ++ ssl->bm_read_index += read_len; ++ ++ /* haven't quite got what we want, so try again later */ ++ if (ssl->got_bytes < ssl->need_bytes) ++ return SSL_OK; ++ ++ read_len = ssl->got_bytes; ++ ssl->got_bytes = 0; ++ ++ if (IS_SET_SSL_FLAG(SSL_NEED_RECORD)) ++ { ++ /* check for sslv2 "client hello" */ ++ if (buf[0] & 0x80 && buf[2] == 1 && buf[3] == 0x03) ++ { ++#ifdef CONFIG_SSL_ENABLE_V23_HANDSHAKE ++ DISPLAY_BYTES(ssl, "ssl2 record", buf, 5); ++ add_packet(ssl, &buf[2], 3); ++ ret = process_sslv23_client_hello(ssl); ++#else ++ printf("Error: no SSLv23 handshaking allowed\n"); TTY_FLUSH(); ++ ret = SSL_ERROR_NOT_SUPPORTED; ++#endif ++ goto error; /* not an error - just get out of here */ ++ } ++ ++ ssl->need_bytes = (buf[3] << 8) + buf[4]; ++ ++ /* do we violate the spec with the message size? */ ++ if (ssl->need_bytes > RT_MAX_PLAIN_LENGTH+RT_EXTRA-BM_RECORD_OFFSET) ++ { ++ ret = SSL_ERROR_INVALID_PROT_MSG; ++ goto error; ++ } ++ ++ CLR_SSL_FLAG(SSL_NEED_RECORD); ++ memcpy(ssl->hmac_header, buf, 3); /* store for hmac */ ++ ssl->record_type = buf[0]; ++ goto error; /* no error, we're done */ ++ } ++ ++ /* for next time - just do it now in case of an error */ ++ SET_SSL_FLAG(SSL_NEED_RECORD); ++ ssl->need_bytes = SSL_RECORD_SIZE; ++ ++ /* decrypt if we need to */ ++ if (IS_SET_SSL_FLAG(SSL_RX_ENCRYPTED)) ++ { ++ ssl->cipher_info->decrypt(ssl->decrypt_ctx, buf, buf, read_len); ++ read_len = verify_digest(ssl, ++ is_client ? SSL_CLIENT_READ : SSL_SERVER_READ, buf, read_len); ++ ++ /* does the hmac work? */ ++ if (read_len < 0) ++ { ++ ret = read_len; ++ goto error; ++ } ++ ++ DISPLAY_BYTES(ssl, "decrypted", buf, read_len); ++ increment_read_sequence(ssl); ++ } ++ ++ /* The main part of the SSL packet */ ++ switch (ssl->record_type) ++ { ++ case PT_HANDSHAKE_PROTOCOL: ++ ssl->dc->bm_proc_index = 0; ++ ret = do_handshake(ssl, buf, read_len); ++ break; ++ ++ case PT_CHANGE_CIPHER_SPEC: ++ if (ssl->next_state != HS_FINISHED) ++ { ++ ret = SSL_ERROR_INVALID_HANDSHAKE; ++ goto error; ++ } ++ ++ /* all encrypted from now on */ ++ SET_SSL_FLAG(SSL_RX_ENCRYPTED); ++ set_key_block(ssl, 0); ++ memset(ssl->read_sequence, 0, 8); ++ break; ++ ++ case PT_APP_PROTOCOL_DATA: ++ if (in_data) ++ { ++ *in_data = ssl->bm_data; /* point to the work buffer */ ++ (*in_data)[read_len] = 0; /* null terminate just in case */ ++ } ++ ++ ret = read_len; ++ break; ++ ++ case PT_ALERT_PROTOCOL: ++ /* return the alert # with alert bit set */ ++ ret = -buf[1]; ++ DISPLAY_ALERT(ssl, buf[1]); ++ break; ++ ++ default: ++ ret = SSL_ERROR_INVALID_PROT_MSG; ++ break; ++ } ++ ++error: ++ ssl->bm_read_index = 0; /* reset to go again */ ++ ++ if (ret < SSL_OK && in_data)/* if all wrong, then clear this buffer ptr */ ++ *in_data = NULL; ++ ++ return ret; ++} ++ ++/** ++ * Do some basic checking of data and then perform the appropriate handshaking. ++ */ ++static int do_handshake(SSL *ssl, uint8_t *buf, int read_len) ++{ ++ int hs_len = (buf[2]<<8) + buf[3]; ++ uint8_t handshake_type = buf[0]; ++ int ret = SSL_OK; ++ int is_client = IS_SET_SSL_FLAG(SSL_IS_CLIENT); ++ ++ /* some integrity checking on the handshake */ ++ PARANOIA_CHECK(read_len-SSL_HS_HDR_SIZE, hs_len); ++ ++ if (handshake_type != ssl->next_state) ++ { ++ /* handle a special case on the client */ ++ if (!is_client || handshake_type != HS_CERT_REQ || ++ ssl->next_state != HS_SERVER_HELLO_DONE) ++ { ++ ret = SSL_ERROR_INVALID_HANDSHAKE; ++ goto error; ++ } ++ } ++ ++ hs_len += SSL_HS_HDR_SIZE; /* adjust for when adding packets */ ++ ssl->bm_index = hs_len; /* store the size and check later */ ++ DISPLAY_STATE(ssl, 0, handshake_type, 0); ++ ++ if (handshake_type != HS_CERT_VERIFY && handshake_type != HS_HELLO_REQUEST) ++ add_packet(ssl, buf, hs_len); ++ ++#if defined(CONFIG_SSL_ENABLE_CLIENT) ++ ret = is_client ? ++ do_clnt_handshake(ssl, handshake_type, buf, hs_len) : ++ do_svr_handshake(ssl, handshake_type, buf, hs_len); ++#else ++ ret = do_svr_handshake(ssl, handshake_type, buf, hs_len); ++#endif ++ ++ /* just use recursion to get the rest */ ++ if (hs_len < read_len && ret == SSL_OK) ++ ret = do_handshake(ssl, &buf[hs_len], read_len-hs_len); ++ ++error: ++ return ret; ++} ++ ++/** ++ * Sends the change cipher spec message. We have just read a finished message ++ * from the client. ++ */ ++int send_change_cipher_spec(SSL *ssl) ++{ ++ int ret = send_packet(ssl, PT_CHANGE_CIPHER_SPEC, ++ g_chg_cipher_spec_pkt, sizeof(g_chg_cipher_spec_pkt)); ++ SET_SSL_FLAG(SSL_TX_ENCRYPTED); ++ set_key_block(ssl, 1); ++ memset(ssl->write_sequence, 0, 8); ++ return ret; ++} ++ ++/** ++ * Send a "finished" message ++ */ ++int send_finished(SSL *ssl) ++{ ++ uint8_t *buf = ssl->bm_data; ++ ++ buf[0] = HS_FINISHED; ++ buf[1] = 0; ++ buf[2] = 0; ++ buf[3] = SSL_FINISHED_HASH_SIZE; ++ ++ /* now add the finished digest mac (12 bytes) */ ++ finished_digest(ssl, ++ IS_SET_SSL_FLAG(SSL_IS_CLIENT) ? ++ client_finished : server_finished, &buf[4]); ++ ++#ifndef CONFIG_SSL_SKELETON_MODE ++ /* store in the session cache */ ++ if (!IS_SET_SSL_FLAG(SSL_SESSION_RESUME) && ssl->ssl_ctx->num_sessions) ++ { ++ memcpy(ssl->session->master_secret, ++ ssl->dc->master_secret, SSL_SECRET_SIZE); ++ } ++#endif ++ ++ return send_packet(ssl, PT_HANDSHAKE_PROTOCOL, ++ NULL, SSL_FINISHED_HASH_SIZE+4); ++} ++ ++/** ++ * Send an alert message. ++ * Return 1 if the alert was an "error". ++ */ ++int send_alert(SSL *ssl, int error_code) ++{ ++ int alert_num = 0; ++ int is_warning = 0; ++ uint8_t buf[2]; ++ ++ /* Don't bother we're already dead */ ++ if (ssl->hs_status == SSL_ERROR_DEAD) ++ { ++ return SSL_ERROR_CONN_LOST; ++ } ++ ++#ifdef CONFIG_SSL_FULL_MODE ++ if (IS_SET_SSL_FLAG(SSL_DISPLAY_STATES)) ++ ssl_display_error(error_code); ++#endif ++ ++ switch (error_code) ++ { ++ case SSL_ALERT_CLOSE_NOTIFY: ++ is_warning = 1; ++ alert_num = SSL_ALERT_CLOSE_NOTIFY; ++ break; ++ ++ case SSL_ERROR_CONN_LOST: /* don't send alert just yet */ ++ is_warning = 1; ++ break; ++ ++ case SSL_ERROR_INVALID_HANDSHAKE: ++ case SSL_ERROR_INVALID_PROT_MSG: ++ alert_num = SSL_ALERT_HANDSHAKE_FAILURE; ++ break; ++ ++ case SSL_ERROR_INVALID_HMAC: ++ case SSL_ERROR_FINISHED_INVALID: ++ alert_num = SSL_ALERT_BAD_RECORD_MAC; ++ break; ++ ++ case SSL_ERROR_INVALID_VERSION: ++ alert_num = SSL_ALERT_INVALID_VERSION; ++ break; ++ ++ case SSL_ERROR_INVALID_SESSION: ++ case SSL_ERROR_NO_CIPHER: ++ case SSL_ERROR_INVALID_KEY: ++ alert_num = SSL_ALERT_ILLEGAL_PARAMETER; ++ break; ++ ++ case SSL_ERROR_BAD_CERTIFICATE: ++ alert_num = SSL_ALERT_BAD_CERTIFICATE; ++ break; ++ ++ default: ++ /* a catch-all for any badly verified certificates */ ++ alert_num = (error_code <= SSL_X509_OFFSET) ? ++ SSL_ALERT_BAD_CERTIFICATE : SSL_ALERT_UNEXPECTED_MESSAGE; ++ break; ++ } ++ ++ buf[0] = is_warning ? 1 : 2; ++ buf[1] = alert_num; ++ send_packet(ssl, PT_ALERT_PROTOCOL, buf, sizeof(buf)); ++ DISPLAY_ALERT(ssl, alert_num); ++ return is_warning ? 0 : 1; ++} ++ ++/** ++ * Process a client finished message. ++ */ ++int process_finished(SSL *ssl, int hs_len) ++{ ++ uint8_t *buf = ssl->bm_data; ++ int ret = SSL_OK; ++ int is_client = IS_SET_SSL_FLAG(SSL_IS_CLIENT); ++ int resume = IS_SET_SSL_FLAG(SSL_SESSION_RESUME); ++ ++ PARANOIA_CHECK(ssl->bm_index, SSL_FINISHED_HASH_SIZE+4); ++ ++ /* check that we all work before we continue */ ++ if (memcmp(ssl->dc->final_finish_mac, &buf[4], SSL_FINISHED_HASH_SIZE)) ++ return SSL_ERROR_FINISHED_INVALID; ++ ++ if ((!is_client && !resume) || (is_client && resume)) ++ { ++ if ((ret = send_change_cipher_spec(ssl)) == SSL_OK) ++ ret = send_finished(ssl); ++ } ++ ++ /* if we ever renegotiate */ ++ ssl->next_state = is_client ? HS_HELLO_REQUEST : HS_CLIENT_HELLO; ++ ssl->hs_status = ret; /* set the final handshake status */ ++ ++error: ++ return ret; ++} ++ ++/** ++ * Send a certificate. ++ */ ++int send_certificate(SSL *ssl) ++{ ++ int i = 0; ++ uint8_t *buf = ssl->bm_data; ++ int offset = 7; ++ int chain_length; ++ ++ buf[0] = HS_CERTIFICATE; ++ buf[1] = 0; ++ buf[4] = 0; ++ ++ while (i < ssl->ssl_ctx->chain_length) ++ { ++ SSL_CERT *cert = &ssl->ssl_ctx->certs[i]; ++ buf[offset++] = 0; ++ buf[offset++] = cert->size >> 8; /* cert 1 length */ ++ buf[offset++] = cert->size & 0xff; ++ memcpy(&buf[offset], cert->buf, cert->size); ++ offset += cert->size; ++ i++; ++ } ++ ++ chain_length = offset - 7; ++ buf[5] = chain_length >> 8; /* cert chain length */ ++ buf[6] = chain_length & 0xff; ++ chain_length += 3; ++ buf[2] = chain_length >> 8; /* handshake length */ ++ buf[3] = chain_length & 0xff; ++ ssl->bm_index = offset; ++ return send_packet(ssl, PT_HANDSHAKE_PROTOCOL, NULL, offset); ++} ++ ++/** ++ * Create a blob of memory that we'll get rid of once the handshake is ++ * complete. ++ */ ++void disposable_new(SSL *ssl) ++{ ++ if (ssl->dc == NULL) ++ { ++ ssl->dc = (DISPOSABLE_CTX *)calloc(1, sizeof(DISPOSABLE_CTX)); ++ MD5_Init(&ssl->dc->md5_ctx); ++ SHA1_Init(&ssl->dc->sha1_ctx); ++ } ++} ++ ++/** ++ * Remove the temporary blob of memory. ++ */ ++void disposable_free(SSL *ssl) ++{ ++ if (ssl->dc) ++ { ++ free(ssl->dc->key_block); ++ memset(ssl->dc, 0, sizeof(DISPOSABLE_CTX)); ++ free(ssl->dc); ++ ssl->dc = NULL; ++ } ++ ++} ++ ++#ifndef CONFIG_SSL_SKELETON_MODE /* no session resumption in this mode */ ++/** ++ * Find if an existing session has the same session id. If so, use the ++ * master secret from this session for session resumption. ++ */ ++SSL_SESSION *ssl_session_update(int max_sessions, SSL_SESSION *ssl_sessions[], ++ SSL *ssl, const uint8_t *session_id) ++{ ++ time_t tm = time(NULL); ++ time_t oldest_sess_time = tm; ++ SSL_SESSION *oldest_sess = NULL; ++ int i; ++ ++ /* no sessions? Then bail */ ++ if (max_sessions == 0) ++ return NULL; ++ ++ SSL_CTX_LOCK(ssl->ssl_ctx->mutex); ++ if (session_id) ++ { ++ for (i = 0; i < max_sessions; i++) ++ { ++ if (ssl_sessions[i]) ++ { ++ /* kill off any expired sessions */ ++ if (tm > ssl_sessions[i]->conn_time + SSL_EXPIRY_TIME) ++ { ++ session_free(ssl_sessions, i); ++ continue; ++ } ++ ++ /* if the session id matches, it must still be less than ++ the expiry time */ ++ if (memcmp(ssl_sessions[i]->session_id, session_id, ++ SSL_SESSION_ID_SIZE) == 0) ++ { ++ ssl->session_index = i; ++ memcpy(ssl->dc->master_secret, ++ ssl_sessions[i]->master_secret, SSL_SECRET_SIZE); ++ SET_SSL_FLAG(SSL_SESSION_RESUME); ++ SSL_CTX_UNLOCK(ssl->ssl_ctx->mutex); ++ return ssl_sessions[i]; /* a session was found */ ++ } ++ } ++ } ++ } ++ ++ /* If we've got here, no matching session was found - so create one */ ++ for (i = 0; i < max_sessions; i++) ++ { ++ if (ssl_sessions[i] == NULL) ++ { ++ /* perfect, this will do */ ++ ssl_sessions[i] = (SSL_SESSION *)calloc(1, sizeof(SSL_SESSION)); ++ ssl_sessions[i]->conn_time = tm; ++ ssl->session_index = i; ++ SSL_CTX_UNLOCK(ssl->ssl_ctx->mutex); ++ return ssl_sessions[i]; /* return the session object */ ++ } ++ else if (ssl_sessions[i]->conn_time <= oldest_sess_time) ++ { ++ /* find the oldest session */ ++ oldest_sess_time = ssl_sessions[i]->conn_time; ++ oldest_sess = ssl_sessions[i]; ++ ssl->session_index = i; ++ } ++ } ++ ++ /* ok, we've used up all of our sessions. So blow the oldest session away */ ++ oldest_sess->conn_time = tm; ++ memset(oldest_sess->session_id, 0, sizeof(SSL_SESSION_ID_SIZE)); ++ memset(oldest_sess->master_secret, 0, sizeof(SSL_SECRET_SIZE)); ++ SSL_CTX_UNLOCK(ssl->ssl_ctx->mutex); ++ return oldest_sess; ++} ++ ++/** ++ * Free an existing session. ++ */ ++static void session_free(SSL_SESSION *ssl_sessions[], int sess_index) ++{ ++ if (ssl_sessions[sess_index]) ++ { ++ free(ssl_sessions[sess_index]); ++ ssl_sessions[sess_index] = NULL; ++ } ++} ++ ++/** ++ * This ssl object doesn't want this session anymore. ++ */ ++void kill_ssl_session(SSL_SESSION **ssl_sessions, SSL *ssl) ++{ ++ SSL_CTX_LOCK(ssl->ssl_ctx->mutex); ++ ++ if (ssl->ssl_ctx->num_sessions) ++ { ++ session_free(ssl_sessions, ssl->session_index); ++ ssl->session = NULL; ++ } ++ ++ SSL_CTX_UNLOCK(ssl->ssl_ctx->mutex); ++} ++#endif /* CONFIG_SSL_SKELETON_MODE */ ++ ++/* ++ * Get the session id for a handshake. This will be a 32 byte sequence. ++ */ ++EXP_FUNC const uint8_t * STDCALL ssl_get_session_id(const SSL *ssl) ++{ ++ return ssl->session_id; ++} ++ ++/* ++ * Get the session id size for a handshake. ++ */ ++EXP_FUNC uint8_t STDCALL ssl_get_session_id_size(const SSL *ssl) ++{ ++ return ssl->sess_id_size; ++} ++ ++/* ++ * Return the cipher id (in the SSL form). ++ */ ++EXP_FUNC uint8_t STDCALL ssl_get_cipher_id(const SSL *ssl) ++{ ++ return ssl->cipher; ++} ++ ++/* ++ * Return the status of the handshake. ++ */ ++EXP_FUNC int STDCALL ssl_handshake_status(const SSL *ssl) ++{ ++ return ssl->hs_status; ++} ++ ++/* ++ * Retrieve various parameters about the SSL engine. ++ */ ++EXP_FUNC int STDCALL ssl_get_config(int offset) ++{ ++ switch (offset) ++ { ++ /* return the appropriate build mode */ ++ case SSL_BUILD_MODE: ++#if defined(CONFIG_SSL_FULL_MODE) ++ return SSL_BUILD_FULL_MODE; ++#elif defined(CONFIG_SSL_ENABLE_CLIENT) ++ return SSL_BUILD_ENABLE_CLIENT; ++#elif defined(CONFIG_ENABLE_VERIFICATION) ++ return SSL_BUILD_ENABLE_VERIFICATION; ++#elif defined(CONFIG_SSL_SERVER_ONLY ) ++ return SSL_BUILD_SERVER_ONLY; ++#else ++ return SSL_BUILD_SKELETON_MODE; ++#endif ++ ++ case SSL_MAX_CERT_CFG_OFFSET: ++ return CONFIG_SSL_MAX_CERTS; ++ ++#ifdef CONFIG_SSL_CERT_VERIFICATION ++ case SSL_MAX_CA_CERT_CFG_OFFSET: ++ return CONFIG_X509_MAX_CA_CERTS; ++#endif ++#ifdef CONFIG_SSL_HAS_PEM ++ case SSL_HAS_PEM: ++ return 1; ++#endif ++ default: ++ return 0; ++ } ++} ++ ++#ifdef CONFIG_SSL_CERT_VERIFICATION ++/** ++ * Authenticate a received certificate. ++ */ ++EXP_FUNC int STDCALL ssl_verify_cert(const SSL *ssl) ++{ ++ int ret; ++ SSL_CTX_LOCK(ssl->ssl_ctx->mutex); ++ ret = x509_verify(ssl->ssl_ctx->ca_cert_ctx, ssl->x509_ctx); ++ SSL_CTX_UNLOCK(ssl->ssl_ctx->mutex); ++ ++ if (ret) /* modify into an SSL error type */ ++ { ++ ret = SSL_X509_ERROR(ret); ++ } ++ ++ return ret; ++} ++ ++/** ++ * Process a certificate message. ++ */ ++int process_certificate(SSL *ssl, X509_CTX **x509_ctx) ++{ ++ int ret = SSL_OK; ++ uint8_t *buf = &ssl->bm_data[ssl->dc->bm_proc_index]; ++ int pkt_size = ssl->bm_index; ++ int cert_size, offset = 5; ++ int total_cert_size = (buf[offset]<<8) + buf[offset+1]; ++ int is_client = IS_SET_SSL_FLAG(SSL_IS_CLIENT); ++ X509_CTX **chain = x509_ctx; ++ offset += 2; ++ ++ PARANOIA_CHECK(total_cert_size, offset); ++ ++ while (offset < total_cert_size) ++ { ++ offset++; /* skip empty char */ ++ cert_size = (buf[offset]<<8) + buf[offset+1]; ++ offset += 2; ++ ++ if (x509_new(&buf[offset], NULL, chain)) ++ { ++ ret = SSL_ERROR_BAD_CERTIFICATE; ++ goto error; ++ } ++ ++ /* DISPLAY_CERT(ssl, *chain); */ ++ chain = &((*chain)->next); ++ offset += cert_size; ++ } ++ ++ PARANOIA_CHECK(pkt_size, offset); ++ ++ /* if we are client we can do the verify now or later */ ++ if (is_client && !IS_SET_SSL_FLAG(SSL_SERVER_VERIFY_LATER)) ++ { ++ ret = ssl_verify_cert(ssl); ++ } ++ ++ ssl->next_state = is_client ? HS_SERVER_HELLO_DONE : HS_CLIENT_KEY_XCHG; ++ ssl->dc->bm_proc_index += offset; ++error: ++ return ret; ++} ++ ++#endif /* CONFIG_SSL_CERT_VERIFICATION */ ++ ++/** ++ * Debugging routine to display SSL handshaking stuff. ++ */ ++#ifdef CONFIG_SSL_FULL_MODE ++/** ++ * Debugging routine to display SSL states. ++ */ ++void DISPLAY_STATE(SSL *ssl, int is_send, uint8_t state, int not_ok) ++{ ++ const char *str; ++ ++ if (!IS_SET_SSL_FLAG(SSL_DISPLAY_STATES)) ++ return; ++ ++ printf(not_ok ? "Error - invalid State:\t" : "State:\t"); ++ printf(is_send ? "sending " : "receiving "); ++ ++ switch (state) ++ { ++ case HS_HELLO_REQUEST: ++ str = "Hello Request (0)"; ++ break; ++ ++ case HS_CLIENT_HELLO: ++ str = "Client Hello (1)"; ++ break; ++ ++ case HS_SERVER_HELLO: ++ str = "Server Hello (2)"; ++ break; ++ ++ case HS_CERTIFICATE: ++ str = "Certificate (11)"; ++ break; ++ ++ case HS_SERVER_KEY_XCHG: ++ str = "Certificate Request (12)"; ++ break; ++ ++ case HS_CERT_REQ: ++ str = "Certificate Request (13)"; ++ break; ++ ++ case HS_SERVER_HELLO_DONE: ++ str = "Server Hello Done (14)"; ++ break; ++ ++ case HS_CERT_VERIFY: ++ str = "Certificate Verify (15)"; ++ break; ++ ++ case HS_CLIENT_KEY_XCHG: ++ str = "Client Key Exchange (16)"; ++ break; ++ ++ case HS_FINISHED: ++ str = "Finished (16)"; ++ break; ++ ++ default: ++ str = "Error (Unknown)"; ++ ++ break; ++ } ++ ++ printf("%s\n", str); ++ TTY_FLUSH(); ++} ++ ++/** ++ * Debugging routine to display X509 certificates. ++ */ ++void DISPLAY_CERT(SSL *ssl, const X509_CTX *x509_ctx) ++{ ++ if (!IS_SET_SSL_FLAG(SSL_DISPLAY_CERTS)) ++ return; ++ ++ x509_print(x509_ctx, ssl->ssl_ctx->ca_cert_ctx); ++ TTY_FLUSH(); ++} ++ ++/** ++ * Debugging routine to display RSA objects ++ */ ++void DISPLAY_RSA(SSL *ssl, const RSA_CTX *rsa_ctx) ++{ ++ if (!IS_SET_SSL_FLAG(SSL_DISPLAY_RSA)) ++ return; ++ ++ RSA_print(rsa_ctx); ++ TTY_FLUSH(); ++} ++ ++/** ++ * Debugging routine to display SSL handshaking bytes. ++ */ ++void DISPLAY_BYTES(SSL *ssl, const char *format, ++ const uint8_t *data, int size, ...) ++{ ++ va_list(ap); ++ ++ if (!IS_SET_SSL_FLAG(SSL_DISPLAY_BYTES)) ++ return; ++ ++ va_start(ap, size); ++ print_blob(format, data, size, va_arg(ap, char *)); ++ va_end(ap); ++ TTY_FLUSH(); ++} ++ ++/** ++ * Debugging routine to display SSL handshaking errors. ++ */ ++EXP_FUNC void STDCALL ssl_display_error(int error_code) ++{ ++ if (error_code == SSL_OK) ++ return; ++ ++ printf("Error: "); ++ ++ /* X509 error? */ ++ if (error_code < SSL_X509_OFFSET) ++ { ++ printf("%s\n", x509_display_error(error_code - SSL_X509_OFFSET)); ++ return; ++ } ++ ++ /* SSL alert error code */ ++ if (error_code > SSL_ERROR_CONN_LOST) ++ { ++ printf("SSL error %d\n", -error_code); ++ return; ++ } ++ ++ switch (error_code) ++ { ++ case SSL_ERROR_DEAD: ++ printf("connection dead"); ++ break; ++ ++ case SSL_ERROR_INVALID_HANDSHAKE: ++ printf("invalid handshake"); ++ break; ++ ++ case SSL_ERROR_INVALID_PROT_MSG: ++ printf("invalid protocol message"); ++ break; ++ ++ case SSL_ERROR_INVALID_HMAC: ++ printf("invalid mac"); ++ break; ++ ++ case SSL_ERROR_INVALID_VERSION: ++ printf("invalid version"); ++ break; ++ ++ case SSL_ERROR_INVALID_SESSION: ++ printf("invalid session"); ++ break; ++ ++ case SSL_ERROR_NO_CIPHER: ++ printf("no cipher"); ++ break; ++ ++ case SSL_ERROR_CONN_LOST: ++ printf("connection lost"); ++ break; ++ ++ case SSL_ERROR_BAD_CERTIFICATE: ++ printf("bad certificate"); ++ break; ++ ++ case SSL_ERROR_INVALID_KEY: ++ printf("invalid key"); ++ break; ++ ++ case SSL_ERROR_FINISHED_INVALID: ++ printf("finished invalid"); ++ break; ++ ++ case SSL_ERROR_NO_CERT_DEFINED: ++ printf("no certificate defined"); ++ break; ++ ++ case SSL_ERROR_NOT_SUPPORTED: ++ printf("Option not supported"); ++ break; ++ ++ default: ++ printf("undefined as yet - %d", error_code); ++ break; ++ } ++ ++ printf("\n"); ++ TTY_FLUSH(); ++} ++ ++/** ++ * Debugging routine to display alerts. ++ */ ++void DISPLAY_ALERT(SSL *ssl, int alert) ++{ ++ if (!IS_SET_SSL_FLAG(SSL_DISPLAY_STATES)) ++ return; ++ ++ printf("Alert: "); ++ ++ switch (alert) ++ { ++ case SSL_ALERT_CLOSE_NOTIFY: ++ printf("close notify"); ++ break; ++ ++ case SSL_ALERT_INVALID_VERSION: ++ printf("invalid version"); ++ break; ++ ++ case SSL_ALERT_BAD_CERTIFICATE: ++ printf("bad certificate"); ++ break; ++ ++ case SSL_ALERT_UNEXPECTED_MESSAGE: ++ printf("unexpected message"); ++ break; ++ ++ case SSL_ALERT_BAD_RECORD_MAC: ++ printf("bad record mac"); ++ break; ++ ++ case SSL_ALERT_HANDSHAKE_FAILURE: ++ printf("handshake failure"); ++ break; ++ ++ case SSL_ALERT_ILLEGAL_PARAMETER: ++ printf("illegal parameter"); ++ break; ++ ++ case SSL_ALERT_DECODE_ERROR: ++ printf("decode error"); ++ break; ++ ++ case SSL_ALERT_DECRYPT_ERROR: ++ printf("decrypt error"); ++ break; ++ ++ default: ++ printf("alert - (unknown %d)", alert); ++ break; ++ } ++ ++ printf("\n"); ++ TTY_FLUSH(); ++} ++ ++#endif /* CONFIG_SSL_FULL_MODE */ ++ ++/** ++ * Return the version of this library. ++ */ ++EXP_FUNC const char * STDCALL ssl_version() ++{ ++ static const char * axtls_version = AXTLS_VERSION; ++ return axtls_version; ++} ++ ++/** ++ * Enable the various language bindings to work regardless of the ++ * configuration - they just return an error statement and a bad return code. ++ */ ++#if !defined(CONFIG_SSL_FULL_MODE) ++EXP_FUNC void STDCALL ssl_display_error(int error_code) {} ++#endif ++ ++#ifdef CONFIG_BINDINGS ++#if !defined(CONFIG_SSL_ENABLE_CLIENT) ++EXP_FUNC SSL * STDCALL ssl_client_new(SSL_CTX *ssl_ctx, int client_fd, const ++ uint8_t *session_id, uint8_t sess_id_size) ++{ ++ printf(unsupported_str); ++ return NULL; ++} ++#endif ++ ++#if !defined(CONFIG_SSL_CERT_VERIFICATION) ++EXP_FUNC int STDCALL ssl_verify_cert(const SSL *ssl) ++{ ++ printf(unsupported_str); ++ return -1; ++} ++ ++EXP_FUNC const char * STDCALL ssl_get_cert_dn(const SSL *ssl, int component) ++{ ++ printf(unsupported_str); ++ return NULL; ++} ++ ++#endif /* CONFIG_SSL_CERT_VERIFICATION */ ++ ++#endif /* CONFIG_BINDINGS */ ++ +diff --git a/feeds/luci/libs/luci-lib-nixio/axTLS/ssl/tls1.h b/feeds/luci/libs/luci-lib-nixio/axTLS/ssl/tls1.h +new file mode 100755 +index 0000000..b64b4fd +--- /dev/null ++++ b/feeds/luci/libs/luci-lib-nixio/axTLS/ssl/tls1.h +@@ -0,0 +1,289 @@ ++/* ++ * Copyright (c) 2007, Cameron Rich ++ * ++ * All rights reserved. ++ * ++ * Redistribution and use in source and binary forms, with or without ++ * modification, are permitted provided that the following conditions are met: ++ * ++ * * Redistributions of source code must retain the above copyright notice, ++ * this list of conditions and the following disclaimer. ++ * * 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. ++ * * Neither the name of the axTLS project nor the names of its contributors ++ * may be used to endorse or promote products derived from this software ++ * without specific prior written permission. ++ * ++ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ++ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT ++ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR ++ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR ++ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, ++ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, ++ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR ++ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF ++ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING ++ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS ++ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ++ */ ++ ++/** ++ * @file tls1.h ++ * ++ * @brief The definitions for the TLS library. ++ */ ++#ifndef HEADER_SSL_LIB_H ++#define HEADER_SSL_LIB_H ++ ++#ifdef __cplusplus ++extern "C" { ++#endif ++ ++#include "version.h" ++#include "crypto.h" ++#include "os_port.h" ++#include "crypto_misc.h" ++ ++#define SSL_RANDOM_SIZE 32 ++#define SSL_SECRET_SIZE 48 ++#define SSL_FINISHED_HASH_SIZE 12 ++#define SSL_RECORD_SIZE 5 ++#define SSL_SERVER_READ 0 ++#define SSL_SERVER_WRITE 1 ++#define SSL_CLIENT_READ 2 ++#define SSL_CLIENT_WRITE 3 ++#define SSL_HS_HDR_SIZE 4 ++ ++/* the flags we use while establishing a connection */ ++#define SSL_NEED_RECORD 0x0001 ++#define SSL_TX_ENCRYPTED 0x0002 ++#define SSL_RX_ENCRYPTED 0x0004 ++#define SSL_SESSION_RESUME 0x0008 ++#define SSL_IS_CLIENT 0x0010 ++#define SSL_HAS_CERT_REQ 0x0020 ++ ++/* some macros to muck around with flag bits */ ++#define SET_SSL_FLAG(A) (ssl->flag |= A) ++#define CLR_SSL_FLAG(A) (ssl->flag &= ~A) ++#define IS_SET_SSL_FLAG(A) (ssl->flag & A) ++ ++#define MAX_KEY_BYTE_SIZE 512 /* for a 4096 bit key */ ++#define RT_MAX_PLAIN_LENGTH 16384 ++#define RT_EXTRA 1024 ++#define BM_RECORD_OFFSET 5 ++ ++#ifdef CONFIG_SSL_SKELETON_MODE ++#define NUM_PROTOCOLS 1 ++#else ++#define NUM_PROTOCOLS 4 ++#endif ++ ++#define PARANOIA_CHECK(A, B) if (A < B) { \ ++ ret = SSL_ERROR_INVALID_HANDSHAKE; goto error; } ++ ++/* protocol types */ ++enum ++{ ++ PT_CHANGE_CIPHER_SPEC = 20, ++ PT_ALERT_PROTOCOL, ++ PT_HANDSHAKE_PROTOCOL, ++ PT_APP_PROTOCOL_DATA ++}; ++ ++/* handshaking types */ ++enum ++{ ++ HS_HELLO_REQUEST, ++ HS_CLIENT_HELLO, ++ HS_SERVER_HELLO, ++ HS_CERTIFICATE = 11, ++ HS_SERVER_KEY_XCHG, ++ HS_CERT_REQ, ++ HS_SERVER_HELLO_DONE, ++ HS_CERT_VERIFY, ++ HS_CLIENT_KEY_XCHG, ++ HS_FINISHED = 20 ++}; ++ ++typedef struct ++{ ++ uint8_t cipher; ++ uint8_t key_size; ++ uint8_t iv_size; ++ uint8_t key_block_size; ++ uint8_t padding_size; ++ uint8_t digest_size; ++ hmac_func hmac; ++ crypt_func encrypt; ++ crypt_func decrypt; ++} cipher_info_t; ++ ++struct _SSLObjLoader ++{ ++ uint8_t *buf; ++ int len; ++}; ++ ++typedef struct _SSLObjLoader SSLObjLoader; ++ ++typedef struct ++{ ++ time_t conn_time; ++ uint8_t session_id[SSL_SESSION_ID_SIZE]; ++ uint8_t master_secret[SSL_SECRET_SIZE]; ++} SSL_SESSION; ++ ++typedef struct ++{ ++ uint8_t *buf; ++ int size; ++} SSL_CERT; ++ ++typedef struct ++{ ++ MD5_CTX md5_ctx; ++ SHA1_CTX sha1_ctx; ++ uint8_t final_finish_mac[SSL_FINISHED_HASH_SIZE]; ++ uint8_t *key_block; ++ uint8_t master_secret[SSL_SECRET_SIZE]; ++ uint8_t client_random[SSL_RANDOM_SIZE]; /* client's random sequence */ ++ uint8_t server_random[SSL_RANDOM_SIZE]; /* server's random sequence */ ++ uint16_t bm_proc_index; ++} DISPOSABLE_CTX; ++ ++struct _SSL ++{ ++ uint32_t flag; ++ uint16_t need_bytes; ++ uint16_t got_bytes; ++ uint8_t record_type; ++ uint8_t cipher; ++ uint8_t sess_id_size; ++ int16_t next_state; ++ int16_t hs_status; ++ DISPOSABLE_CTX *dc; /* temporary data which we'll get rid of soon */ ++ int client_fd; ++ const cipher_info_t *cipher_info; ++ void *encrypt_ctx; ++ void *decrypt_ctx; ++ uint8_t bm_all_data[RT_MAX_PLAIN_LENGTH+RT_EXTRA]; ++ uint8_t *bm_data; ++ uint16_t bm_index; ++ uint16_t bm_read_index; ++ struct _SSL *next; /* doubly linked list */ ++ struct _SSL *prev; ++ struct _SSL_CTX *ssl_ctx; /* back reference to a clnt/svr ctx */ ++#ifndef CONFIG_SSL_SKELETON_MODE ++ uint16_t session_index; ++ SSL_SESSION *session; ++#endif ++#ifdef CONFIG_SSL_CERT_VERIFICATION ++ X509_CTX *x509_ctx; ++#endif ++ ++ uint8_t session_id[SSL_SESSION_ID_SIZE]; ++ uint8_t client_mac[SHA1_SIZE]; /* for HMAC verification */ ++ uint8_t server_mac[SHA1_SIZE]; /* for HMAC verification */ ++ uint8_t read_sequence[8]; /* 64 bit sequence number */ ++ uint8_t write_sequence[8]; /* 64 bit sequence number */ ++ uint8_t hmac_header[SSL_RECORD_SIZE]; /* rx hmac */ ++}; ++ ++typedef struct _SSL SSL; ++ ++struct _SSL_CTX ++{ ++ uint32_t options; ++ uint8_t chain_length; ++ RSA_CTX *rsa_ctx; ++#ifdef CONFIG_SSL_CERT_VERIFICATION ++ CA_CERT_CTX *ca_cert_ctx; ++#endif ++ SSL *head; ++ SSL *tail; ++ SSL_CERT certs[CONFIG_SSL_MAX_CERTS]; ++#ifndef CONFIG_SSL_SKELETON_MODE ++ uint16_t num_sessions; ++ SSL_SESSION **ssl_sessions; ++#endif ++#ifdef CONFIG_SSL_CTX_MUTEXING ++ SSL_CTX_MUTEX_TYPE mutex; ++#endif ++#ifdef CONFIG_OPENSSL_COMPATIBLE ++ void *bonus_attr; ++#endif ++}; ++ ++typedef struct _SSL_CTX SSL_CTX; ++ ++/* backwards compatibility */ ++typedef struct _SSL_CTX SSLCTX; ++ ++extern const uint8_t ssl_prot_prefs[NUM_PROTOCOLS]; ++ ++SSL *ssl_new(SSL_CTX *ssl_ctx, int client_fd); ++void disposable_new(SSL *ssl); ++void disposable_free(SSL *ssl); ++int send_packet(SSL *ssl, uint8_t protocol, ++ const uint8_t *in, int length); ++int do_svr_handshake(SSL *ssl, int handshake_type, uint8_t *buf, int hs_len); ++int do_clnt_handshake(SSL *ssl, int handshake_type, uint8_t *buf, int hs_len); ++int process_finished(SSL *ssl, int hs_len); ++int process_sslv23_client_hello(SSL *ssl); ++int send_alert(SSL *ssl, int error_code); ++int send_finished(SSL *ssl); ++int send_certificate(SSL *ssl); ++int basic_read(SSL *ssl, uint8_t **in_data); ++int send_change_cipher_spec(SSL *ssl); ++void finished_digest(SSL *ssl, const char *label, uint8_t *digest); ++void generate_master_secret(SSL *ssl, const uint8_t *premaster_secret); ++void add_packet(SSL *ssl, const uint8_t *pkt, int len); ++int add_cert(SSL_CTX *ssl_ctx, const uint8_t *buf, int len); ++int add_private_key(SSL_CTX *ssl_ctx, SSLObjLoader *ssl_obj); ++void ssl_obj_free(SSLObjLoader *ssl_obj); ++int pkcs8_decode(SSL_CTX *ssl_ctx, SSLObjLoader *ssl_obj, const char *password); ++int pkcs12_decode(SSL_CTX *ssl_ctx, SSLObjLoader *ssl_obj, const char *password); ++int load_key_certs(SSL_CTX *ssl_ctx); ++#ifdef CONFIG_SSL_CERT_VERIFICATION ++int add_cert_auth(SSL_CTX *ssl_ctx, const uint8_t *buf, int len); ++void remove_ca_certs(CA_CERT_CTX *ca_cert_ctx); ++#endif ++#ifdef CONFIG_SSL_ENABLE_CLIENT ++int do_client_connect(SSL *ssl); ++#endif ++ ++#ifdef CONFIG_SSL_FULL_MODE ++void DISPLAY_STATE(SSL *ssl, int is_send, uint8_t state, int not_ok); ++void DISPLAY_BYTES(SSL *ssl, const char *format, ++ const uint8_t *data, int size, ...); ++void DISPLAY_CERT(SSL *ssl, const X509_CTX *x509_ctx); ++void DISPLAY_RSA(SSL *ssl, const RSA_CTX *rsa_ctx); ++void DISPLAY_ALERT(SSL *ssl, int alert); ++#else ++#define DISPLAY_STATE(A,B,C,D) ++#define DISPLAY_CERT(A,B) ++#define DISPLAY_RSA(A,B) ++#define DISPLAY_ALERT(A, B) ++#ifdef WIN32 ++void DISPLAY_BYTES(SSL *ssl, const char *format,/* win32 has no variadic macros */ ++ const uint8_t *data, int size, ...); ++#else ++#define DISPLAY_BYTES(A,B,C,D,...) ++#endif ++#endif ++ ++#ifdef CONFIG_SSL_CERT_VERIFICATION ++int process_certificate(SSL *ssl, X509_CTX **x509_ctx); ++#endif ++ ++SSL_SESSION *ssl_session_update(int max_sessions, ++ SSL_SESSION *ssl_sessions[], SSL *ssl, ++ const uint8_t *session_id); ++void kill_ssl_session(SSL_SESSION **ssl_sessions, SSL *ssl); ++ ++#ifdef __cplusplus ++} ++#endif ++ ++#endif +diff --git a/feeds/luci/libs/luci-lib-nixio/axTLS/ssl/tls1_clnt.c b/feeds/luci/libs/luci-lib-nixio/axTLS/ssl/tls1_clnt.c +new file mode 100644 +index 0000000..9131433 +--- /dev/null ++++ b/feeds/luci/libs/luci-lib-nixio/axTLS/ssl/tls1_clnt.c +@@ -0,0 +1,386 @@ ++/* ++ * Copyright (c) 2007, Cameron Rich ++ * ++ * All rights reserved. ++ * ++ * Redistribution and use in source and binary forms, with or without ++ * modification, are permitted provided that the following conditions are met: ++ * ++ * * Redistributions of source code must retain the above copyright notice, ++ * this list of conditions and the following disclaimer. ++ * * 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. ++ * * Neither the name of the axTLS project nor the names of its contributors ++ * may be used to endorse or promote products derived from this software ++ * without specific prior written permission. ++ * ++ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ++ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT ++ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR ++ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR ++ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, ++ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, ++ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR ++ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF ++ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING ++ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS ++ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ++ */ ++ ++#include ++#include ++#include ++#include ++ ++#include "ssl.h" ++ ++#ifdef CONFIG_SSL_ENABLE_CLIENT /* all commented out if no client */ ++ ++static int send_client_hello(SSL *ssl); ++static int process_server_hello(SSL *ssl); ++static int process_server_hello_done(SSL *ssl); ++static int send_client_key_xchg(SSL *ssl); ++static int process_cert_req(SSL *ssl); ++static int send_cert_verify(SSL *ssl); ++ ++/* ++ * Establish a new SSL connection to an SSL server. ++ */ ++EXP_FUNC SSL * STDCALL ssl_client_new(SSL_CTX *ssl_ctx, int client_fd, const ++ uint8_t *session_id, uint8_t sess_id_size) ++{ ++ SSL *ssl; ++ int ret; ++ ++ SOCKET_BLOCK(client_fd); /* ensure blocking mode */ ++ ssl = ssl_new(ssl_ctx, client_fd); ++ ++ if (session_id && ssl_ctx->num_sessions) ++ { ++ if (sess_id_size > SSL_SESSION_ID_SIZE) /* validity check */ ++ { ++ ssl_free(ssl); ++ return NULL; ++ } ++ ++ memcpy(ssl->session_id, session_id, sess_id_size); ++ ssl->sess_id_size = sess_id_size; ++ SET_SSL_FLAG(SSL_SESSION_RESUME); /* just flag for later */ ++ } ++ ++ SET_SSL_FLAG(SSL_IS_CLIENT); ++ ret = do_client_connect(ssl); ++ return ssl; ++} ++ ++/* ++ * Process the handshake record. ++ */ ++int do_clnt_handshake(SSL *ssl, int handshake_type, uint8_t *buf, int hs_len) ++{ ++ int ret = SSL_OK; ++ ++ /* To get here the state must be valid */ ++ switch (handshake_type) ++ { ++ case HS_SERVER_HELLO: ++ ret = process_server_hello(ssl); ++ break; ++ ++ case HS_CERTIFICATE: ++ ret = process_certificate(ssl, &ssl->x509_ctx); ++ break; ++ ++ case HS_SERVER_HELLO_DONE: ++ if ((ret = process_server_hello_done(ssl)) == SSL_OK) ++ { ++ if (IS_SET_SSL_FLAG(SSL_HAS_CERT_REQ)) ++ { ++ if ((ret = send_certificate(ssl)) == SSL_OK && ++ (ret = send_client_key_xchg(ssl)) == SSL_OK) ++ { ++ send_cert_verify(ssl); ++ } ++ } ++ else ++ { ++ ret = send_client_key_xchg(ssl); ++ } ++ ++ if (ret == SSL_OK && ++ (ret = send_change_cipher_spec(ssl)) == SSL_OK) ++ { ++ ret = send_finished(ssl); ++ } ++ } ++ break; ++ ++ case HS_CERT_REQ: ++ ret = process_cert_req(ssl); ++ break; ++ ++ case HS_FINISHED: ++ ret = process_finished(ssl, hs_len); ++ disposable_free(ssl); /* free up some memory */ ++ break; ++ ++ case HS_HELLO_REQUEST: ++ disposable_new(ssl); ++ ret = do_client_connect(ssl); ++ break; ++ } ++ ++ return ret; ++} ++ ++/* ++ * Do the handshaking from the beginning. ++ */ ++int do_client_connect(SSL *ssl) ++{ ++ int ret = SSL_OK; ++ ++ send_client_hello(ssl); /* send the client hello */ ++ ssl->bm_read_index = 0; ++ ssl->next_state = HS_SERVER_HELLO; ++ ssl->hs_status = SSL_NOT_OK; /* not connected */ ++ x509_free(ssl->x509_ctx); ++ ++ /* sit in a loop until it all looks good */ ++ while (ssl->hs_status != SSL_OK) ++ { ++ ret = basic_read(ssl, NULL); ++ ++ if (ret < SSL_OK) ++ { ++ if (ret != SSL_ERROR_CONN_LOST) ++ { ++ /* let the server know we are dying and why */ ++ if (send_alert(ssl, ret)) ++ { ++ /* something nasty happened, so get rid of it */ ++ kill_ssl_session(ssl->ssl_ctx->ssl_sessions, ssl); ++ } ++ } ++ ++ break; ++ } ++ } ++ ++ ssl->hs_status = ret; /* connected? */ ++ return ret; ++} ++ ++/* ++ * Send the initial client hello. ++ */ ++static int send_client_hello(SSL *ssl) ++{ ++ uint8_t *buf = ssl->bm_data; ++ time_t tm = time(NULL); ++ uint8_t *tm_ptr = &buf[6]; /* time will go here */ ++ int i, offset; ++ ++ buf[0] = HS_CLIENT_HELLO; ++ buf[1] = 0; ++ buf[2] = 0; ++ /* byte 3 is calculated later */ ++ buf[4] = 0x03; ++ buf[5] = 0x01; ++ ++ /* client random value - spec says that 1st 4 bytes are big endian time */ ++ *tm_ptr++ = (uint8_t)(((long)tm & 0xff000000) >> 24); ++ *tm_ptr++ = (uint8_t)(((long)tm & 0x00ff0000) >> 16); ++ *tm_ptr++ = (uint8_t)(((long)tm & 0x0000ff00) >> 8); ++ *tm_ptr++ = (uint8_t)(((long)tm & 0x000000ff)); ++ get_random(SSL_RANDOM_SIZE-4, &buf[10]); ++ memcpy(ssl->dc->client_random, &buf[6], SSL_RANDOM_SIZE); ++ offset = 6 + SSL_RANDOM_SIZE; ++ ++ /* give session resumption a go */ ++ if (IS_SET_SSL_FLAG(SSL_SESSION_RESUME)) /* set initially by user */ ++ { ++ buf[offset++] = ssl->sess_id_size; ++ memcpy(&buf[offset], ssl->session_id, ssl->sess_id_size); ++ offset += ssl->sess_id_size; ++ CLR_SSL_FLAG(SSL_SESSION_RESUME); /* clear so we can set later */ ++ } ++ else ++ { ++ /* no session id - because no session resumption just yet */ ++ buf[offset++] = 0; ++ } ++ ++ buf[offset++] = 0; /* number of ciphers */ ++ buf[offset++] = NUM_PROTOCOLS*2;/* number of ciphers */ ++ ++ /* put all our supported protocols in our request */ ++ for (i = 0; i < NUM_PROTOCOLS; i++) ++ { ++ buf[offset++] = 0; /* cipher we are using */ ++ buf[offset++] = ssl_prot_prefs[i]; ++ } ++ ++ buf[offset++] = 1; /* no compression */ ++ buf[offset++] = 0; ++ buf[3] = offset - 4; /* handshake size */ ++ ++ return send_packet(ssl, PT_HANDSHAKE_PROTOCOL, NULL, offset); ++} ++ ++/* ++ * Process the server hello. ++ */ ++static int process_server_hello(SSL *ssl) ++{ ++ uint8_t *buf = ssl->bm_data; ++ int pkt_size = ssl->bm_index; ++ int version = (buf[4] << 4) + buf[5]; ++ int num_sessions = ssl->ssl_ctx->num_sessions; ++ uint8_t sess_id_size; ++ int offset, ret = SSL_OK; ++ ++ /* check that we are talking to a TLSv1 server */ ++ if (version != 0x31) ++ return SSL_ERROR_INVALID_VERSION; ++ ++ /* get the server random value */ ++ memcpy(ssl->dc->server_random, &buf[6], SSL_RANDOM_SIZE); ++ offset = 6 + SSL_RANDOM_SIZE; /* skip of session id size */ ++ sess_id_size = buf[offset++]; ++ ++ if (num_sessions) ++ { ++ ssl->session = ssl_session_update(num_sessions, ++ ssl->ssl_ctx->ssl_sessions, ssl, &buf[offset]); ++ memcpy(ssl->session->session_id, &buf[offset], sess_id_size); ++ ++ /* pad the rest with 0's */ ++ if (sess_id_size < SSL_SESSION_ID_SIZE) ++ { ++ memset(&ssl->session->session_id[sess_id_size], 0, ++ SSL_SESSION_ID_SIZE-sess_id_size); ++ } ++ } ++ ++ memcpy(ssl->session_id, &buf[offset], sess_id_size); ++ ssl->sess_id_size = sess_id_size; ++ offset += sess_id_size; ++ ++ /* get the real cipher we are using */ ++ ssl->cipher = buf[++offset]; ++ ssl->next_state = IS_SET_SSL_FLAG(SSL_SESSION_RESUME) ? ++ HS_FINISHED : HS_CERTIFICATE; ++ ++ offset++; // skip the compr ++ PARANOIA_CHECK(pkt_size, offset); ++ ssl->dc->bm_proc_index = offset+1; ++ ++error: ++ return ret; ++} ++ ++/** ++ * Process the server hello done message. ++ */ ++static int process_server_hello_done(SSL *ssl) ++{ ++ ssl->next_state = HS_FINISHED; ++ return SSL_OK; ++} ++ ++/* ++ * Send a client key exchange message. ++ */ ++static int send_client_key_xchg(SSL *ssl) ++{ ++ uint8_t *buf = ssl->bm_data; ++ uint8_t premaster_secret[SSL_SECRET_SIZE]; ++ int enc_secret_size = -1; ++ ++ buf[0] = HS_CLIENT_KEY_XCHG; ++ buf[1] = 0; ++ ++ premaster_secret[0] = 0x03; /* encode the version number */ ++ premaster_secret[1] = 0x01; ++ get_random(SSL_SECRET_SIZE-2, &premaster_secret[2]); ++ DISPLAY_RSA(ssl, ssl->x509_ctx->rsa_ctx); ++ ++ /* rsa_ctx->bi_ctx is not thread-safe */ ++ SSL_CTX_LOCK(ssl->ssl_ctx->mutex); ++ enc_secret_size = RSA_encrypt(ssl->x509_ctx->rsa_ctx, premaster_secret, ++ SSL_SECRET_SIZE, &buf[6], 0); ++ SSL_CTX_UNLOCK(ssl->ssl_ctx->mutex); ++ ++ buf[2] = (enc_secret_size + 2) >> 8; ++ buf[3] = (enc_secret_size + 2) & 0xff; ++ buf[4] = enc_secret_size >> 8; ++ buf[5] = enc_secret_size & 0xff; ++ ++ generate_master_secret(ssl, premaster_secret); ++ return send_packet(ssl, PT_HANDSHAKE_PROTOCOL, NULL, enc_secret_size+6); ++} ++ ++/* ++ * Process the certificate request. ++ */ ++static int process_cert_req(SSL *ssl) ++{ ++ uint8_t *buf = &ssl->bm_data[ssl->dc->bm_proc_index]; ++ int ret = SSL_OK; ++ int offset = (buf[2] << 4) + buf[3]; ++ int pkt_size = ssl->bm_index; ++ ++ /* don't do any processing - we will send back an RSA certificate anyway */ ++ ssl->next_state = HS_SERVER_HELLO_DONE; ++ SET_SSL_FLAG(SSL_HAS_CERT_REQ); ++ ssl->dc->bm_proc_index += offset; ++ PARANOIA_CHECK(pkt_size, offset); ++error: ++ return ret; ++} ++ ++/* ++ * Send a certificate verify message. ++ */ ++static int send_cert_verify(SSL *ssl) ++{ ++ uint8_t *buf = ssl->bm_data; ++ uint8_t dgst[MD5_SIZE+SHA1_SIZE]; ++ RSA_CTX *rsa_ctx = ssl->ssl_ctx->rsa_ctx; ++ int n = 0, ret; ++ ++ DISPLAY_RSA(ssl, rsa_ctx); ++ ++ buf[0] = HS_CERT_VERIFY; ++ buf[1] = 0; ++ ++ finished_digest(ssl, NULL, dgst); /* calculate the digest */ ++ ++ /* rsa_ctx->bi_ctx is not thread-safe */ ++ if (rsa_ctx) ++ { ++ SSL_CTX_LOCK(ssl->ssl_ctx->mutex); ++ n = RSA_encrypt(rsa_ctx, dgst, sizeof(dgst), &buf[6], 1); ++ SSL_CTX_UNLOCK(ssl->ssl_ctx->mutex); ++ ++ if (n == 0) ++ { ++ ret = SSL_ERROR_INVALID_KEY; ++ goto error; ++ } ++ } ++ ++ buf[4] = n >> 8; /* add the RSA size (not officially documented) */ ++ buf[5] = n & 0xff; ++ n += 2; ++ buf[2] = n >> 8; ++ buf[3] = n & 0xff; ++ ret = send_packet(ssl, PT_HANDSHAKE_PROTOCOL, NULL, n+4); ++ ++error: ++ return ret; ++} ++ ++#endif /* CONFIG_SSL_ENABLE_CLIENT */ +diff --git a/feeds/luci/libs/luci-lib-nixio/axTLS/ssl/tls1_svr.c b/feeds/luci/libs/luci-lib-nixio/axTLS/ssl/tls1_svr.c +new file mode 100644 +index 0000000..45b9bec +--- /dev/null ++++ b/feeds/luci/libs/luci-lib-nixio/axTLS/ssl/tls1_svr.c +@@ -0,0 +1,476 @@ ++/* ++ * Copyright (c) 2007, Cameron Rich ++ * ++ * All rights reserved. ++ * ++ * Redistribution and use in source and binary forms, with or without ++ * modification, are permitted provided that the following conditions are met: ++ * ++ * * Redistributions of source code must retain the above copyright notice, ++ * this list of conditions and the following disclaimer. ++ * * 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. ++ * * Neither the name of the axTLS project nor the names of its contributors ++ * may be used to endorse or promote products derived from this software ++ * without specific prior written permission. ++ * ++ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ++ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT ++ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR ++ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR ++ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, ++ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, ++ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR ++ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF ++ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING ++ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS ++ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ++ */ ++ ++#include ++#include ++#include ++ ++#include "ssl.h" ++ ++static const uint8_t g_hello_done[] = { HS_SERVER_HELLO_DONE, 0, 0, 0 }; ++ ++static int process_client_hello(SSL *ssl); ++static int send_server_hello_sequence(SSL *ssl); ++static int send_server_hello(SSL *ssl); ++static int send_server_hello_done(SSL *ssl); ++static int process_client_key_xchg(SSL *ssl); ++#ifdef CONFIG_SSL_CERT_VERIFICATION ++static int send_certificate_request(SSL *ssl); ++static int process_cert_verify(SSL *ssl); ++#endif ++ ++/* ++ * Establish a new SSL connection to an SSL client. ++ */ ++EXP_FUNC SSL * STDCALL ssl_server_new(SSL_CTX *ssl_ctx, int client_fd) ++{ ++ SSL *ssl; ++ ++ ssl = ssl_new(ssl_ctx, client_fd); ++ ssl->next_state = HS_CLIENT_HELLO; ++ ++#ifdef CONFIG_SSL_FULL_MODE ++ if (ssl_ctx->chain_length == 0) ++ printf("Warning - no server certificate defined\n"); TTY_FLUSH(); ++#endif ++ ++ return ssl; ++} ++ ++/* ++ * Process the handshake record. ++ */ ++int do_svr_handshake(SSL *ssl, int handshake_type, uint8_t *buf, int hs_len) ++{ ++ int ret = SSL_OK; ++ ssl->hs_status = SSL_NOT_OK; /* not connected */ ++ ++ /* To get here the state must be valid */ ++ switch (handshake_type) ++ { ++ case HS_CLIENT_HELLO: ++ if ((ret = process_client_hello(ssl)) == SSL_OK) ++ ret = send_server_hello_sequence(ssl); ++ break; ++ ++#ifdef CONFIG_SSL_CERT_VERIFICATION ++ case HS_CERTIFICATE:/* the client sends its cert */ ++ ret = process_certificate(ssl, &ssl->x509_ctx); ++ ++ if (ret == SSL_OK) /* verify the cert */ ++ { ++ int cert_res; ++ cert_res = x509_verify( ++ ssl->ssl_ctx->ca_cert_ctx, ssl->x509_ctx); ++ ret = (cert_res == 0) ? SSL_OK : SSL_X509_ERROR(cert_res); ++ } ++ break; ++ ++ case HS_CERT_VERIFY: ++ ret = process_cert_verify(ssl); ++ add_packet(ssl, buf, hs_len); /* needs to be done after */ ++ break; ++#endif ++ case HS_CLIENT_KEY_XCHG: ++ ret = process_client_key_xchg(ssl); ++ break; ++ ++ case HS_FINISHED: ++ ret = process_finished(ssl, hs_len); ++ disposable_free(ssl); /* free up some memory */ ++ break; ++ } ++ ++ return ret; ++} ++ ++/* ++ * Process a client hello message. ++ */ ++static int process_client_hello(SSL *ssl) ++{ ++ uint8_t *buf = ssl->bm_data; ++ uint8_t *record_buf = ssl->hmac_header; ++ int pkt_size = ssl->bm_index; ++ int i, j, cs_len, id_len, offset = 6 + SSL_RANDOM_SIZE; ++ int version = (record_buf[1] << 4) + record_buf[2]; ++ int ret = SSL_OK; ++ ++ /* should be v3.1 (TLSv1) or better - we'll send in v3.1 mode anyway */ ++ if (version < 0x31) ++ { ++ ret = SSL_ERROR_INVALID_VERSION; ++ ssl_display_error(ret); ++ goto error; ++ } ++ ++ memcpy(ssl->dc->client_random, &buf[6], SSL_RANDOM_SIZE); ++ ++ /* process the session id */ ++ id_len = buf[offset++]; ++ if (id_len > SSL_SESSION_ID_SIZE) ++ { ++ return SSL_ERROR_INVALID_SESSION; ++ } ++ ++#ifndef CONFIG_SSL_SKELETON_MODE ++ ssl->session = ssl_session_update(ssl->ssl_ctx->num_sessions, ++ ssl->ssl_ctx->ssl_sessions, ssl, id_len ? &buf[offset] : NULL); ++#endif ++ ++ offset += id_len; ++ cs_len = (buf[offset]<<8) + buf[offset+1]; ++ offset += 3; /* add 1 due to all cipher suites being 8 bit */ ++ ++ PARANOIA_CHECK(pkt_size, offset); ++ ++ /* work out what cipher suite we are going to use */ ++ for (j = 0; j < NUM_PROTOCOLS; j++) ++ { ++ for (i = 0; i < cs_len; i += 2) ++ { ++ if (ssl_prot_prefs[j] == buf[offset+i]) /* got a match? */ ++ { ++ ssl->cipher = ssl_prot_prefs[j]; ++ goto do_state; ++ } ++ } ++ } ++ ++ /* ouch! protocol is not supported */ ++ ret = SSL_ERROR_NO_CIPHER; ++ ++do_state: ++error: ++ return ret; ++} ++ ++#ifdef CONFIG_SSL_ENABLE_V23_HANDSHAKE ++/* ++ * Some browsers use a hybrid SSLv2 "client hello" ++ */ ++int process_sslv23_client_hello(SSL *ssl) ++{ ++ uint8_t *buf = ssl->bm_data; ++ int bytes_needed = ((buf[0] & 0x7f) << 8) + buf[1]; ++ int version = (buf[3] << 4) + buf[4]; ++ int ret = SSL_OK; ++ ++ /* we have already read 3 extra bytes so far */ ++ int read_len = SOCKET_READ(ssl->client_fd, buf, bytes_needed-3); ++ int cs_len = buf[1]; ++ int id_len = buf[3]; ++ int ch_len = buf[5]; ++ int i, j, offset = 8; /* start at first cipher */ ++ int random_offset = 0; ++ ++ DISPLAY_BYTES(ssl, "received %d bytes", buf, read_len, read_len); ++ ++ /* should be v3.1 (TLSv1) or better - we'll send in v3.1 mode anyway */ ++ if (version < 0x31) ++ { ++ return SSL_ERROR_INVALID_VERSION; ++ } ++ ++ add_packet(ssl, buf, read_len); ++ ++ /* connection has gone, so die */ ++ if (bytes_needed < 0) ++ { ++ return SSL_ERROR_CONN_LOST; ++ } ++ ++ /* now work out what cipher suite we are going to use */ ++ for (j = 0; j < NUM_PROTOCOLS; j++) ++ { ++ for (i = 0; i < cs_len; i += 3) ++ { ++ if (ssl_prot_prefs[j] == buf[offset+i]) ++ { ++ ssl->cipher = ssl_prot_prefs[j]; ++ goto server_hello; ++ } ++ } ++ } ++ ++ /* ouch! protocol is not supported */ ++ ret = SSL_ERROR_NO_CIPHER; ++ goto error; ++ ++server_hello: ++ /* get the session id */ ++ offset += cs_len - 2; /* we've gone 2 bytes past the end */ ++#ifndef CONFIG_SSL_SKELETON_MODE ++ ssl->session = ssl_session_update(ssl->ssl_ctx->num_sessions, ++ ssl->ssl_ctx->ssl_sessions, ssl, id_len ? &buf[offset] : NULL); ++#endif ++ ++ /* get the client random data */ ++ offset += id_len; ++ ++ /* random can be anywhere between 16 and 32 bytes long - so it is padded ++ * with 0's to the left */ ++ if (ch_len == 0x10) ++ { ++ random_offset += 0x10; ++ } ++ ++ memcpy(&ssl->dc->client_random[random_offset], &buf[offset], ch_len); ++ ret = send_server_hello_sequence(ssl); ++ ++error: ++ return ret; ++} ++#endif ++ ++/* ++ * Send the entire server hello sequence ++ */ ++static int send_server_hello_sequence(SSL *ssl) ++{ ++ int ret; ++ ++ if ((ret = send_server_hello(ssl)) == SSL_OK) ++ { ++#ifndef CONFIG_SSL_SKELETON_MODE ++ /* resume handshake? */ ++ if (IS_SET_SSL_FLAG(SSL_SESSION_RESUME)) ++ { ++ if ((ret = send_change_cipher_spec(ssl)) == SSL_OK) ++ { ++ ret = send_finished(ssl); ++ ssl->next_state = HS_FINISHED; ++ } ++ } ++ else ++#endif ++ if ((ret = send_certificate(ssl)) == SSL_OK) ++ { ++#ifdef CONFIG_SSL_CERT_VERIFICATION ++ /* ask the client for its certificate */ ++ if (IS_SET_SSL_FLAG(SSL_CLIENT_AUTHENTICATION)) ++ { ++ if ((ret = send_certificate_request(ssl)) == SSL_OK) ++ { ++ ret = send_server_hello_done(ssl); ++ ssl->next_state = HS_CERTIFICATE; ++ } ++ } ++ else ++#endif ++ { ++ ret = send_server_hello_done(ssl); ++ ssl->next_state = HS_CLIENT_KEY_XCHG; ++ } ++ } ++ } ++ ++ return ret; ++} ++ ++/* ++ * Send a server hello message. ++ */ ++static int send_server_hello(SSL *ssl) ++{ ++ uint8_t *buf = ssl->bm_data; ++ int offset = 0; ++ ++ buf[0] = HS_SERVER_HELLO; ++ buf[1] = 0; ++ buf[2] = 0; ++ /* byte 3 is calculated later */ ++ buf[4] = 0x03; ++ buf[5] = 0x01; ++ ++ /* server random value */ ++ get_random(SSL_RANDOM_SIZE, &buf[6]); ++ memcpy(ssl->dc->server_random, &buf[6], SSL_RANDOM_SIZE); ++ offset = 6 + SSL_RANDOM_SIZE; ++ ++#ifndef CONFIG_SSL_SKELETON_MODE ++ if (IS_SET_SSL_FLAG(SSL_SESSION_RESUME)) ++ { ++ /* retrieve id from session cache */ ++ buf[offset++] = SSL_SESSION_ID_SIZE; ++ memcpy(&buf[offset], ssl->session->session_id, SSL_SESSION_ID_SIZE); ++ memcpy(ssl->session_id, ssl->session->session_id, SSL_SESSION_ID_SIZE); ++ ssl->sess_id_size = SSL_SESSION_ID_SIZE; ++ offset += SSL_SESSION_ID_SIZE; ++ } ++ else /* generate our own session id */ ++#endif ++ { ++#ifndef CONFIG_SSL_SKELETON_MODE ++ buf[offset++] = SSL_SESSION_ID_SIZE; ++ get_random(SSL_SESSION_ID_SIZE, &buf[offset]); ++ memcpy(ssl->session_id, &buf[offset], SSL_SESSION_ID_SIZE); ++ ssl->sess_id_size = SSL_SESSION_ID_SIZE; ++ ++ /* store id in session cache */ ++ if (ssl->ssl_ctx->num_sessions) ++ { ++ memcpy(ssl->session->session_id, ++ ssl->session_id, SSL_SESSION_ID_SIZE); ++ } ++ ++ offset += SSL_SESSION_ID_SIZE; ++#else ++ buf[offset++] = 0; /* don't bother with session id in skelton mode */ ++#endif ++ } ++ ++ buf[offset++] = 0; /* cipher we are using */ ++ buf[offset++] = ssl->cipher; ++ buf[offset++] = 0; /* no compression */ ++ buf[3] = offset - 4; /* handshake size */ ++ return send_packet(ssl, PT_HANDSHAKE_PROTOCOL, NULL, offset); ++} ++ ++/* ++ * Send the server hello done message. ++ */ ++static int send_server_hello_done(SSL *ssl) ++{ ++ return send_packet(ssl, PT_HANDSHAKE_PROTOCOL, ++ g_hello_done, sizeof(g_hello_done)); ++} ++ ++/* ++ * Pull apart a client key exchange message. Decrypt the pre-master key (using ++ * our RSA private key) and then work out the master key. Initialise the ++ * ciphers. ++ */ ++static int process_client_key_xchg(SSL *ssl) ++{ ++ uint8_t *buf = &ssl->bm_data[ssl->dc->bm_proc_index]; ++ int pkt_size = ssl->bm_index; ++ int premaster_size, secret_length = (buf[2] << 8) + buf[3]; ++ uint8_t premaster_secret[MAX_KEY_BYTE_SIZE]; ++ RSA_CTX *rsa_ctx = ssl->ssl_ctx->rsa_ctx; ++ int offset = 4; ++ int ret = SSL_OK; ++ ++ if (rsa_ctx == NULL) ++ { ++ ret = SSL_ERROR_NO_CERT_DEFINED; ++ goto error; ++ } ++ ++ /* is there an extra size field? */ ++ if ((secret_length - 2) == rsa_ctx->num_octets) ++ offset += 2; ++ ++ PARANOIA_CHECK(pkt_size, rsa_ctx->num_octets+offset); ++ ++ /* rsa_ctx->bi_ctx is not thread-safe */ ++ SSL_CTX_LOCK(ssl->ssl_ctx->mutex); ++ premaster_size = RSA_decrypt(rsa_ctx, &buf[offset], premaster_secret, 1); ++ SSL_CTX_UNLOCK(ssl->ssl_ctx->mutex); ++ ++ if (premaster_size != SSL_SECRET_SIZE || ++ premaster_secret[0] != 0x03 || /* check version is 3.1 (TLS) */ ++ premaster_secret[1] != 0x01) ++ { ++ /* guard against a Bleichenbacher attack */ ++ memset(premaster_secret, 0, SSL_SECRET_SIZE); ++ /* and continue - will die eventually when checking the mac */ ++ } ++ ++#if 0 ++ print_blob("pre-master", premaster_secret, SSL_SECRET_SIZE); ++#endif ++ ++ generate_master_secret(ssl, premaster_secret); ++ ++#ifdef CONFIG_SSL_CERT_VERIFICATION ++ ssl->next_state = IS_SET_SSL_FLAG(SSL_CLIENT_AUTHENTICATION) ? ++ HS_CERT_VERIFY : HS_FINISHED; ++#else ++ ssl->next_state = HS_FINISHED; ++#endif ++error: ++ ssl->dc->bm_proc_index += rsa_ctx->num_octets+offset; ++ return ret; ++} ++ ++#ifdef CONFIG_SSL_CERT_VERIFICATION ++static const uint8_t g_cert_request[] = { HS_CERT_REQ, 0, 0, 4, 1, 0, 0, 0 }; ++ ++/* ++ * Send the certificate request message. ++ */ ++static int send_certificate_request(SSL *ssl) ++{ ++ return send_packet(ssl, PT_HANDSHAKE_PROTOCOL, ++ g_cert_request, sizeof(g_cert_request)); ++} ++ ++/* ++ * Ensure the client has the private key by first decrypting the packet and ++ * then checking the packet digests. ++ */ ++static int process_cert_verify(SSL *ssl) ++{ ++ uint8_t *buf = &ssl->bm_data[ssl->dc->bm_proc_index]; ++ int pkt_size = ssl->bm_index; ++ uint8_t dgst_buf[MAX_KEY_BYTE_SIZE]; ++ uint8_t dgst[MD5_SIZE+SHA1_SIZE]; ++ X509_CTX *x509_ctx = ssl->x509_ctx; ++ int ret = SSL_OK; ++ int n; ++ ++ PARANOIA_CHECK(pkt_size, x509_ctx->rsa_ctx->num_octets+6); ++ DISPLAY_RSA(ssl, x509_ctx->rsa_ctx); ++ ++ /* rsa_ctx->bi_ctx is not thread-safe */ ++ SSL_CTX_LOCK(ssl->ssl_ctx->mutex); ++ n = RSA_decrypt(x509_ctx->rsa_ctx, &buf[6], dgst_buf, 0); ++ SSL_CTX_UNLOCK(ssl->ssl_ctx->mutex); ++ ++ if (n != SHA1_SIZE + MD5_SIZE) ++ { ++ ret = SSL_ERROR_INVALID_KEY; ++ goto end_cert_vfy; ++ } ++ ++ finished_digest(ssl, NULL, dgst); /* calculate the digest */ ++ if (memcmp(dgst_buf, dgst, MD5_SIZE + SHA1_SIZE)) ++ { ++ ret = SSL_ERROR_INVALID_KEY; ++ } ++ ++end_cert_vfy: ++ ssl->next_state = HS_FINISHED; ++error: ++ return ret; ++} ++ ++#endif +diff --git a/feeds/luci/libs/luci-lib-nixio/axTLS/ssl/version.h b/feeds/luci/libs/luci-lib-nixio/axTLS/ssl/version.h +new file mode 100644 +index 0000000..72260bf +--- /dev/null ++++ b/feeds/luci/libs/luci-lib-nixio/axTLS/ssl/version.h +@@ -0,0 +1 @@ ++#define AXTLS_VERSION "1.2.1" +diff --git a/feeds/luci/libs/luci-lib-nixio/axTLS/ssl/x509.c b/feeds/luci/libs/luci-lib-nixio/axTLS/ssl/x509.c +new file mode 100644 +index 0000000..37db7f4 +--- /dev/null ++++ b/feeds/luci/libs/luci-lib-nixio/axTLS/ssl/x509.c +@@ -0,0 +1,502 @@ ++/* ++ * Copyright (c) 2007, Cameron Rich ++ * ++ * All rights reserved. ++ * ++ * Redistribution and use in source and binary forms, with or without ++ * modification, are permitted provided that the following conditions are met: ++ * ++ * * Redistributions of source code must retain the above copyright notice, ++ * this list of conditions and the following disclaimer. ++ * * 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. ++ * * Neither the name of the axTLS project nor the names of its contributors ++ * may be used to endorse or promote products derived from this software ++ * without specific prior written permission. ++ * ++ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ++ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT ++ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR ++ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR ++ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, ++ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, ++ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR ++ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF ++ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING ++ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS ++ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ++ */ ++ ++/** ++ * @file x509.c ++ * ++ * Certificate processing. ++ */ ++ ++#include ++#include ++#include ++#include ++#include "os_port.h" ++#include "crypto_misc.h" ++ ++#ifdef CONFIG_SSL_CERT_VERIFICATION ++/** ++ * Retrieve the signature from a certificate. ++ */ ++static const uint8_t *get_signature(const uint8_t *asn1_sig, int *len) ++{ ++ int offset = 0; ++ const uint8_t *ptr = NULL; ++ ++ if (asn1_next_obj(asn1_sig, &offset, ASN1_SEQUENCE) < 0 || ++ asn1_skip_obj(asn1_sig, &offset, ASN1_SEQUENCE)) ++ goto end_get_sig; ++ ++ if (asn1_sig[offset++] != ASN1_OCTET_STRING) ++ goto end_get_sig; ++ *len = get_asn1_length(asn1_sig, &offset); ++ ptr = &asn1_sig[offset]; /* all ok */ ++ ++end_get_sig: ++ return ptr; ++} ++ ++#endif ++ ++/** ++ * Construct a new x509 object. ++ * @return 0 if ok. < 0 if there was a problem. ++ */ ++int x509_new(const uint8_t *cert, int *len, X509_CTX **ctx) ++{ ++ int begin_tbs, end_tbs; ++ int ret = X509_NOT_OK, offset = 0, cert_size = 0; ++ X509_CTX *x509_ctx; ++ BI_CTX *bi_ctx; ++ ++ *ctx = (X509_CTX *)calloc(1, sizeof(X509_CTX)); ++ x509_ctx = *ctx; ++ ++ /* get the certificate size */ ++ asn1_skip_obj(cert, &cert_size, ASN1_SEQUENCE); ++ ++ if (asn1_next_obj(cert, &offset, ASN1_SEQUENCE) < 0) ++ goto end_cert; ++ ++ begin_tbs = offset; /* start of the tbs */ ++ end_tbs = begin_tbs; /* work out the end of the tbs */ ++ asn1_skip_obj(cert, &end_tbs, ASN1_SEQUENCE); ++ ++ if (asn1_next_obj(cert, &offset, ASN1_SEQUENCE) < 0) ++ goto end_cert; ++ ++ if (cert[offset] == ASN1_EXPLICIT_TAG) /* optional version */ ++ { ++ if (asn1_version(cert, &offset, x509_ctx)) ++ goto end_cert; ++ } ++ ++ if (asn1_skip_obj(cert, &offset, ASN1_INTEGER) || /* serial number */ ++ asn1_next_obj(cert, &offset, ASN1_SEQUENCE) < 0) ++ goto end_cert; ++ ++ /* make sure the signature is ok */ ++ if (asn1_signature_type(cert, &offset, x509_ctx)) ++ { ++ ret = X509_VFY_ERROR_UNSUPPORTED_DIGEST; ++ goto end_cert; ++ } ++ ++ if (asn1_name(cert, &offset, x509_ctx->ca_cert_dn) || ++ asn1_validity(cert, &offset, x509_ctx) || ++ asn1_name(cert, &offset, x509_ctx->cert_dn) || ++ asn1_public_key(cert, &offset, x509_ctx)) ++ goto end_cert; ++ ++ bi_ctx = x509_ctx->rsa_ctx->bi_ctx; ++ ++#ifdef CONFIG_SSL_CERT_VERIFICATION /* only care if doing verification */ ++ /* use the appropriate signature algorithm (SHA1/MD5/MD2) */ ++ if (x509_ctx->sig_type == SIG_TYPE_MD5) ++ { ++ MD5_CTX md5_ctx; ++ uint8_t md5_dgst[MD5_SIZE]; ++ MD5_Init(&md5_ctx); ++ MD5_Update(&md5_ctx, &cert[begin_tbs], end_tbs-begin_tbs); ++ MD5_Final(md5_dgst, &md5_ctx); ++ x509_ctx->digest = bi_import(bi_ctx, md5_dgst, MD5_SIZE); ++ } ++ else if (x509_ctx->sig_type == SIG_TYPE_SHA1) ++ { ++ SHA1_CTX sha_ctx; ++ uint8_t sha_dgst[SHA1_SIZE]; ++ SHA1_Init(&sha_ctx); ++ SHA1_Update(&sha_ctx, &cert[begin_tbs], end_tbs-begin_tbs); ++ SHA1_Final(sha_dgst, &sha_ctx); ++ x509_ctx->digest = bi_import(bi_ctx, sha_dgst, SHA1_SIZE); ++ } ++ else if (x509_ctx->sig_type == SIG_TYPE_MD2) ++ { ++ MD2_CTX md2_ctx; ++ uint8_t md2_dgst[MD2_SIZE]; ++ MD2_Init(&md2_ctx); ++ MD2_Update(&md2_ctx, &cert[begin_tbs], end_tbs-begin_tbs); ++ MD2_Final(md2_dgst, &md2_ctx); ++ x509_ctx->digest = bi_import(bi_ctx, md2_dgst, MD2_SIZE); ++ } ++ ++ offset = end_tbs; /* skip the v3 data */ ++ if (asn1_skip_obj(cert, &offset, ASN1_SEQUENCE) || ++ asn1_signature(cert, &offset, x509_ctx)) ++ goto end_cert; ++#endif ++ ++ if (len) ++ { ++ *len = cert_size; ++ } ++ ++ ret = X509_OK; ++end_cert: ++ ++#ifdef CONFIG_SSL_FULL_MODE ++ if (ret) ++ { ++ printf("Error: Invalid X509 ASN.1 file\n"); ++ } ++#endif ++ ++ return ret; ++} ++ ++/** ++ * Free an X.509 object's resources. ++ */ ++void x509_free(X509_CTX *x509_ctx) ++{ ++ X509_CTX *next; ++ int i; ++ ++ if (x509_ctx == NULL) /* if already null, then don't bother */ ++ return; ++ ++ for (i = 0; i < X509_NUM_DN_TYPES; i++) ++ { ++ free(x509_ctx->ca_cert_dn[i]); ++ free(x509_ctx->cert_dn[i]); ++ } ++ ++ free(x509_ctx->signature); ++ ++#ifdef CONFIG_SSL_CERT_VERIFICATION ++ if (x509_ctx->digest) ++ { ++ bi_free(x509_ctx->rsa_ctx->bi_ctx, x509_ctx->digest); ++ } ++#endif ++ ++ RSA_free(x509_ctx->rsa_ctx); ++ ++ next = x509_ctx->next; ++ free(x509_ctx); ++ x509_free(next); /* clear the chain */ ++} ++ ++#ifdef CONFIG_SSL_CERT_VERIFICATION ++/** ++ * Take a signature and decrypt it. ++ */ ++static bigint *sig_verify(BI_CTX *ctx, const uint8_t *sig, int sig_len, ++ bigint *modulus, bigint *pub_exp) ++{ ++ int i, size; ++ bigint *decrypted_bi, *dat_bi; ++ bigint *bir = NULL; ++ uint8_t *block = (uint8_t *)alloca(sig_len); ++ ++ /* decrypt */ ++ dat_bi = bi_import(ctx, sig, sig_len); ++ ctx->mod_offset = BIGINT_M_OFFSET; ++ ++ /* convert to a normal block */ ++ decrypted_bi = bi_mod_power2(ctx, dat_bi, modulus, pub_exp); ++ ++ bi_export(ctx, decrypted_bi, block, sig_len); ++ ctx->mod_offset = BIGINT_M_OFFSET; ++ ++ i = 10; /* start at the first possible non-padded byte */ ++ while (block[i++] && i < sig_len); ++ size = sig_len - i; ++ ++ /* get only the bit we want */ ++ if (size > 0) ++ { ++ int len; ++ const uint8_t *sig_ptr = get_signature(&block[i], &len); ++ ++ if (sig_ptr) ++ { ++ bir = bi_import(ctx, sig_ptr, len); ++ } ++ } ++ ++ /* save a few bytes of memory */ ++ bi_clear_cache(ctx); ++ return bir; ++} ++ ++/** ++ * Do some basic checks on the certificate chain. ++ * ++ * Certificate verification consists of a number of checks: ++ * - The date of the certificate is after the start date. ++ * - The date of the certificate is before the finish date. ++ * - A root certificate exists in the certificate store. ++ * - That the certificate(s) are not self-signed. ++ * - The certificate chain is valid. ++ * - The signature of the certificate is valid. ++ */ ++int x509_verify(const CA_CERT_CTX *ca_cert_ctx, const X509_CTX *cert) ++{ ++ int ret = X509_OK, i = 0; ++ bigint *cert_sig; ++ X509_CTX *next_cert = NULL; ++ BI_CTX *ctx = NULL; ++ bigint *mod = NULL, *expn = NULL; ++ int match_ca_cert = 0; ++ struct timeval tv; ++ uint8_t is_self_signed = 0; ++ ++ if (cert == NULL) ++ { ++ ret = X509_VFY_ERROR_NO_TRUSTED_CERT; ++ goto end_verify; ++ } ++ ++ /* a self-signed certificate that is not in the CA store - use this ++ to check the signature */ ++ if (asn1_compare_dn(cert->ca_cert_dn, cert->cert_dn) == 0) ++ { ++ is_self_signed = 1; ++ ctx = cert->rsa_ctx->bi_ctx; ++ mod = cert->rsa_ctx->m; ++ expn = cert->rsa_ctx->e; ++ } ++ ++ gettimeofday(&tv, NULL); ++ ++ /* check the not before date */ ++ if (tv.tv_sec < cert->not_before) ++ { ++ ret = X509_VFY_ERROR_NOT_YET_VALID; ++ goto end_verify; ++ } ++ ++ /* check the not after date */ ++ if (tv.tv_sec > cert->not_after) ++ { ++ ret = X509_VFY_ERROR_EXPIRED; ++ goto end_verify; ++ } ++ ++ next_cert = cert->next; ++ ++ /* last cert in the chain - look for a trusted cert */ ++ if (next_cert == NULL) ++ { ++ if (ca_cert_ctx != NULL) ++ { ++ /* go thu the CA store */ ++ while (i < CONFIG_X509_MAX_CA_CERTS && ca_cert_ctx->cert[i]) ++ { ++ if (asn1_compare_dn(cert->ca_cert_dn, ++ ca_cert_ctx->cert[i]->cert_dn) == 0) ++ { ++ /* use this CA certificate for signature verification */ ++ match_ca_cert = 1; ++ ctx = ca_cert_ctx->cert[i]->rsa_ctx->bi_ctx; ++ mod = ca_cert_ctx->cert[i]->rsa_ctx->m; ++ expn = ca_cert_ctx->cert[i]->rsa_ctx->e; ++ break; ++ } ++ ++ i++; ++ } ++ } ++ ++ /* couldn't find a trusted cert (& let self-signed errors be returned) */ ++ if (!match_ca_cert && !is_self_signed) ++ { ++ ret = X509_VFY_ERROR_NO_TRUSTED_CERT; ++ goto end_verify; ++ } ++ } ++ else if (asn1_compare_dn(cert->ca_cert_dn, next_cert->cert_dn) != 0) ++ { ++ /* check the chain */ ++ ret = X509_VFY_ERROR_INVALID_CHAIN; ++ goto end_verify; ++ } ++ else /* use the next certificate in the chain for signature verify */ ++ { ++ ctx = next_cert->rsa_ctx->bi_ctx; ++ mod = next_cert->rsa_ctx->m; ++ expn = next_cert->rsa_ctx->e; ++ } ++ ++ /* cert is self signed */ ++ if (!match_ca_cert && is_self_signed) ++ { ++ ret = X509_VFY_ERROR_SELF_SIGNED; ++ goto end_verify; ++ } ++ ++ /* check the signature */ ++ cert_sig = sig_verify(ctx, cert->signature, cert->sig_len, ++ bi_clone(ctx, mod), bi_clone(ctx, expn)); ++ ++ if (cert_sig && cert->digest) ++ { ++ if (bi_compare(cert_sig, cert->digest) != 0) ++ ret = X509_VFY_ERROR_BAD_SIGNATURE; ++ ++ ++ bi_free(ctx, cert_sig); ++ } ++ else ++ { ++ ret = X509_VFY_ERROR_BAD_SIGNATURE; ++ } ++ ++ if (ret) ++ goto end_verify; ++ ++ /* go down the certificate chain using recursion. */ ++ if (next_cert != NULL) ++ { ++ ret = x509_verify(ca_cert_ctx, next_cert); ++ } ++ ++end_verify: ++ return ret; ++} ++#endif ++ ++#if defined (CONFIG_SSL_FULL_MODE) ++/** ++ * Used for diagnostics. ++ */ ++static const char *not_part_of_cert = ""; ++void x509_print(const X509_CTX *cert, CA_CERT_CTX *ca_cert_ctx) ++{ ++ if (cert == NULL) ++ return; ++ ++ printf("=== CERTIFICATE ISSUED TO ===\n"); ++ printf("Common Name (CN):\t\t"); ++ printf("%s\n", cert->cert_dn[X509_COMMON_NAME] ? ++ cert->cert_dn[X509_COMMON_NAME] : not_part_of_cert); ++ ++ printf("Organization (O):\t\t"); ++ printf("%s\n", cert->cert_dn[X509_ORGANIZATION] ? ++ cert->cert_dn[X509_ORGANIZATION] : not_part_of_cert); ++ ++ printf("Organizational Unit (OU):\t"); ++ printf("%s\n", cert->cert_dn[X509_ORGANIZATIONAL_UNIT] ? ++ cert->cert_dn[X509_ORGANIZATIONAL_UNIT] : not_part_of_cert); ++ ++ printf("=== CERTIFICATE ISSUED BY ===\n"); ++ printf("Common Name (CN):\t\t"); ++ printf("%s\n", cert->ca_cert_dn[X509_COMMON_NAME] ? ++ cert->ca_cert_dn[X509_COMMON_NAME] : not_part_of_cert); ++ ++ printf("Organization (O):\t\t"); ++ printf("%s\n", cert->ca_cert_dn[X509_ORGANIZATION] ? ++ cert->ca_cert_dn[X509_ORGANIZATION] : not_part_of_cert); ++ ++ printf("Organizational Unit (OU):\t"); ++ printf("%s\n", cert->ca_cert_dn[X509_ORGANIZATIONAL_UNIT] ? ++ cert->ca_cert_dn[X509_ORGANIZATIONAL_UNIT] : not_part_of_cert); ++ ++ printf("Not Before:\t\t\t%s", ctime(&cert->not_before)); ++ printf("Not After:\t\t\t%s", ctime(&cert->not_after)); ++ printf("RSA bitsize:\t\t\t%d\n", cert->rsa_ctx->num_octets*8); ++ printf("Sig Type:\t\t\t"); ++ switch (cert->sig_type) ++ { ++ case SIG_TYPE_MD5: ++ printf("MD5\n"); ++ break; ++ case SIG_TYPE_SHA1: ++ printf("SHA1\n"); ++ break; ++ case SIG_TYPE_MD2: ++ printf("MD2\n"); ++ break; ++ default: ++ printf("Unrecognized: %d\n", cert->sig_type); ++ break; ++ } ++ ++ if (ca_cert_ctx) ++ { ++ printf("Verify:\t\t\t\t%s\n", ++ x509_display_error(x509_verify(ca_cert_ctx, cert))); ++ } ++ ++#if 0 ++ print_blob("Signature", cert->signature, cert->sig_len); ++ bi_print("Modulus", cert->rsa_ctx->m); ++ bi_print("Pub Exp", cert->rsa_ctx->e); ++#endif ++ ++ if (ca_cert_ctx) ++ { ++ x509_print(cert->next, ca_cert_ctx); ++ } ++ ++ TTY_FLUSH(); ++} ++ ++const char * x509_display_error(int error) ++{ ++ switch (error) ++ { ++ case X509_OK: ++ return "Certificate verify successful"; ++ ++ case X509_NOT_OK: ++ return "X509 not ok"; ++ ++ case X509_VFY_ERROR_NO_TRUSTED_CERT: ++ return "No trusted cert is available"; ++ ++ case X509_VFY_ERROR_BAD_SIGNATURE: ++ return "Bad signature"; ++ ++ case X509_VFY_ERROR_NOT_YET_VALID: ++ return "Cert is not yet valid"; ++ ++ case X509_VFY_ERROR_EXPIRED: ++ return "Cert has expired"; ++ ++ case X509_VFY_ERROR_SELF_SIGNED: ++ return "Cert is self-signed"; ++ ++ case X509_VFY_ERROR_INVALID_CHAIN: ++ return "Chain is invalid (check order of certs)"; ++ ++ case X509_VFY_ERROR_UNSUPPORTED_DIGEST: ++ return "Unsupported digest"; ++ ++ case X509_INVALID_PRIV_KEY: ++ return "Invalid private key"; ++ ++ default: ++ return "Unknown"; ++ } ++} ++#endif /* CONFIG_SSL_FULL_MODE */ ++ +diff --git a/feeds/luci/libs/luci-lib-nixio/axTLS/www/bin/.htaccess b/feeds/luci/libs/luci-lib-nixio/axTLS/www/bin/.htaccess +new file mode 100644 +index 0000000..4496fa9 +--- /dev/null ++++ b/feeds/luci/libs/luci-lib-nixio/axTLS/www/bin/.htaccess +@@ -0,0 +1,2 @@ ++Deny all ++ +diff --git a/feeds/luci/libs/luci-lib-nixio/axTLS/www/favicon.ico b/feeds/luci/libs/luci-lib-nixio/axTLS/www/favicon.ico +new file mode 100644 +index 0000000000000000000000000000000000000000..9f6f30e4c6de09f2e93be5e3cbde8a97850b1989 +GIT binary patch +literal 22486 +zcmeHu30zf2nr~sceZHA_-90^TmN&28Jk8Qcr;~KLlTO^lBt}i5G10h0RE&xU3Kv;K +z5JYwq1!TJ*!ezg*URf{uWl>gTQ2|8(#Rd0WP}KkX*TEZUC+SY+b-$VSn-qMv>YP)j +z>Z`BnRMo$}?-RmAj23UcDHx9t+MftvA%qw^_Q~}aA%5~xA%6C=;cLqu3sLZo;z|Co +zLi>^s|MI_#`FYKJ2j4U1A1f?>B!ta;AzopbtU{QRWIZx?{FM?7|Cl^Y0}vh_9=zef +zSosyby}jgVtk7sQ!ra_kco=wX&a{Vyl{4#DbD=R9gsG-in3Lqq-d3gZD`0B%u*xK$x0q$fJh5YsfF_A+H*ep|@8I4h{-uXJ_H>?=SlM`$b({o#^cB +z6k4rT==FM`R;$Gz+pkhN3tjJ^Xt^;cH2ON0rxhBlPSmw@l9zs=>l|dhK><>5u%2c2 +z3q${)P&unuzDjto{9v^|%h9qftqAtl@tWmpTZG=wA`G3qthZO_T4Y%_gueHNs3U1v +zuAb!>SZ^oES;ewE{Dpt8KV!8}S!!4g+c!%qoXL~QQY$>1wL-0t{4vdX{8^7irx*Tg +zd$88Pb{T{^xK5~bEkaw@!ZwpyT7=HfDRgz6LNAH!GLTv*3x9nt^Yscn`Ku$T4gI2p +z?dznxdP#cnTh~vXTgWSAR7Za6$ZIc2rLrVH&Xj|PaQ5&Jv&Q=iOUq!UgDHn#VYyf> +zELCdCOii8`Q{EblTFiP=BP`ixmTaHOSwk6W*cT)X+iI#6mTa&2Vz!rLDcenQmTmW^ +zeARq5OUL)vcD7$FNkh`=gjS~$ix=zpo}Tj33lEZ|C1pdhR5A9@vu_x)57m-nA8GVL +zOHykoN0OGLraX0$^z3VrzrTUc3@o29<*PSP)|xuXo20AbI3{sysr4;3JxEpO`7 +zytXM9CC{T>rjD6*c-qv7t5;7PGiHy>{N6kn6lvP@18nw;+hGgX8HwrxB0mwu37!r +zy!Upmed`O|oH>T7DnsI$;Lj#Z9K(jYOqnue^u_VrWBB%j;CY`P4qCNp>wEVn+#h;t +zPV?f$i#KgL>FT=0&D(S^Ji2z)@maInyl4B5A3tU4gn7FUga!xS%~=(+bkvag!Gd4> +zV$;d4cY4gsmM!aBabb$uYEIJ<*S636CV5Grp)=bv*G5K!yIuLxGVE4Z^Dj2N +z^Nx?tj*rfrI~O?D%vYP$v%7#f +z+y2&P$GLOn<{zE$@hvV}(zq`2a~sFQM?A)lUovxJr~8-fUo0#w*6X#&v0?VD+nD`t +zFMV|G{Xp}}@A&w(RZX}b9K3qM#ON{8rd;ee)al;g>^fu797AJS>4r2-OY636+k7r9 +zJNN#lfggReWBI!k>fO;15uZPvFk#f5+U{dB+Gljk=-9Y1*Df<-{elJMGrCUr_?-L5 +z{QXZqUHQ@b0q3_qNC{7f3y&CMI)CEC=sf2|b}E&f!=mb3)q(}7v0)9ao@SKH`|r#A +z@4vr%dt+E^vQ!*&%TeKl{n0#T7igbpH}}_qhSfmVf%y2iJFfu=D&} +zzh1|tw--Cgn04T5oM_t+g(;E}hd*`r+a)y_PRuzEbAjwS2B`Vs!2C +z%{5ClH#wCS?0YM6_Nh~zo+ppmXQ=FE9Gc;$GDqI`7%$R>w&{}o&)~2C}A##xK4xc(& +znGNR8x0oMeS+FqoV2izdc2R0+d-LL+xhpPQ@SDBvix1nEY=|BcZECtVA@yy3z~etL +z0W2&m5(+oO$4C9Hq`)fu?egYRbLXz`_4b%vXQL@~b&Aido7^_7G;87TByscRz`Rir +zsg!VXY^+sr*`k({US3~%&%VkTp(*~uhQ-AnsxqQ1vy$H)&Tm16a8I35tSu-^U-(5v +z&QG14J7)EdpFW+>{VRW0=+sbHP*9M(e)e#F{(gLR^2~5`>06d>g-66B+2lE%zWT|> +z%ztD2C#Qd^Td=-i!+Lf2tgo}n#KlQVXWA^CsoMg_r +zoy~Q`LBym_Fp|VQ8e$%edKfe6h-nOU65G@fC)N=I5xWq>NbDlb +zl-s;l)MDN&%1vTXb2al*jwBC>MOpy1S~5*i@TrRU)cFZc_2)T2@GxEtCT3NWG^AiH%NWo8kp1GUBag(fq+l6) +z@E-B3g6o5MPtAMmGX>i+*2%QQxTboxNiS5A=8+cb6};=OV%nK$4?X2a+)4^2Ir}qB +zlGxXo<5W2_;27}N5bKg8{*|~_o+IcD%wx&38fOFfG7u*-<~Wh(3;x8w5(le^gC!Q$ +z5(oRMiF--@5)YGfBsFodMiQ~Ho}}ft(v!3tTM{R?kTmKRzC+?z3noeItRrc8UZUZc +zlV=x349ySw-!=R>*6(r8z53#dFOC~$Vlr+V6H4l7xxDw%3k+-t2W@ +zVC5RC*KKWo{hHZ93yTL>!RIFoOD+3~8{T|#hSvw?<^z9YWo!Gom6gS@H=dt7>g5+! +zkGruHk01YbK}Tz$_Ne)qHP)}c{rlHnf9-cWO-=ngpC9$|OJ6QJ+J5%8pOtCyWZ@=;Puf27>sJk|A +z_isLa?zxp$3T7wG{3u2Lt3#J8Uwchu|IRxb-&$O`eA%+g&2PS+wffSQs@4Pei(YmS6|9HtO>X%nMD4QP{nfrO^s+IQ_HGbM`c8||(rhj0uYt-|j +z+`Qvnr0}-~?3g|;yW&X8r?VFhTD|qwx(&KivxVXDb3U2XV=`g9iG#!Bt#7^=96Yza +zZPCiLmg`h5|51DeQ_N3vR~hM*JRwp36q{?95>Nq +z0yF$M!oTas$I6HI3r~Ol()>KFX*ebKDLiUd_A17Gis^{Gi5QXQ8{*NUN8-VQhvMPT +zBQZ4ePz*g}n)e<*ek>k80`EOyp2y-5uko1cJ|2q8SFVT)m(Gcb@@A2|r&<)`)ryL` +zdePp~qnu+u#v@VJcv5KM>xCxfptx}UD(e^$TYMeF7H=0}`&FD+yH+b!EYu3mZ8<_y +z)+U;IFNsUnuZj4?GU2gBFMNH|h0WSHu_v@v?9DF_Q8^_dD6T@pmeh;wdn<*_szQ;H +z+aU~RZ;R%O*F?;|8ljHL5J4e+B0hDmh}EQtj`nk+@o_-Bf;%4!jlRw3fJHtfwh +zAa;i33yY;G!o@X5#2)AtF$XV;obCZp&^sXXr*4RCj;UhVyzRo(B|yZ)M2bT49vPP) +z;AyM9SN5n +z-Me>%E;~zjdHD!;4^L58T_eis8-$gGov>ATiS1!oB6M$wh)b_#yZ4KYR$E1iHdmC_ +z91?BqC&V4T-`(9U4jecr_U%g(Zd=^M{{7h^DM=&T-L?pO)ka}wV=J7UoJ2xmoXFv` +zl;lKVs3;e=Z{HT}?d{^^$&=#Nty|*i)vKcGWS6pcyl~+H#|Xqjju+>NKUc`WvGx8$ +zGx6#BUx*oV7l^Ub=ZdlOXNU!}=Zg7e)5RPaFZf(6`1Et}hSf^3lH>HoyFXV*j@eI0 +z(?~MBLHb^0nQ`13ej<(@|A~0`J>DJ9ypu@svyk78tkZUtqgZ3(AjYn=A^&TH!#W#b +zPyRQ^*kPk^u-zzB%=>@CtLe{vE+ozS9(78YO=f8MAxTm@y_M0o!*3n(W*a6dYn=GG>em&m7&idTjIb^7ird^S82Izrn^< +zWw+7Z!O>}x^X7k8%EPf0<}1HiwR(*Oml>;%KbbT4(|MnLK7YX%3l}Y3^5vw-Q>IQc +zo&MhYAI$i0=B(Kt{ra`n-}ud&zx~}?Z~y+CcgIhd_`m+;e~%sa{0lF>^vjoD`PHi? +zCO`ez-~RmX{`=qmgULVs)BpJA|2gUx#rT^K3BQGse$8fA-p#PsYadH{~%t|4YZRZX+Kf>oVSd +z_TI?*+;1!I%6MpK2>0*bSBU$lKe#_K-^jEqTV5OQjjZdN?mhe5n8z58d_FQQd6vO= +zZ)AR%mV9$Rh@PGvoH}(1JZHq6J9of6BQ9OKgv*yNE9rap?kRcYJH{Z}D&MEg3%IYu +z_3PJh?b%aNU( +zjUv4s_4W0rud72vMFnaO9KeYaCqQjAxCd9>k?+a0yeHp1a^whVYinUJ7*JYTs!&Nu +zi4xb;)S$V!1zlZTN`7NoWEms*k!d4OvYkf$zbTe7lXAIo<%%NXUh+`Mx|5QV5w2E) +z=er0E4Mj*u2+~uvXliIc&*{^+c;&LvAF{6w9XbS_0V5?P1yNB^2o4TLU|=A4K8%2X +z0QmWleEqO%*G@!6Mj$aUQIV09#rgB+m9`lBNAf}CFix`$o^_+IuTSAi@+kXuWP4;A +z<=Bw<8pu~eV7}&o!v&*JJ|ENBeuA1QQDZEp02dJxVRXVm6eeF +zQ&d!h%*;%rrKMrtzJ18b%0g9D6^R0Agcfk(iKxh|n;~)er9O?%3?SnLIlwygHCadwcS2uY$_X +zma(0}yUI?b+_QJEQ}S)1OuW3jzV4%)J9n~wb}84}wt0fO26%aUVJGiN8P(R-Dg4TB +zNA@{w$&jC)kKDXGXvzD|;2`GrM?wn62*+qbQWAW9{Gd|VBcADy-MiuF;)-qF-q`9! +zIXgN)MfuuE{>YP!Y6EO+Z5eNbjg15BRj$}*YZ!9AtL&@*w +zza3jWec-Uk0bATWk(io^<7Y3R@9sU+A3uqb$_BKb?MKbw7DPlQz{@j`JgMO1sNxv0 +zB`+J{=;Q&9tx@pwjEAp(8UnWOM_5P+c_=_+coCBJ79b_I7;!QA2#-!;`+Z?=vmTD@ +zE6KaBuQxRDdpTd^qptQKT3Zg2nsM~#F?4peqpRmQ&YbO4#*gH`t*uS@hUA#`*t!k= +zK7nxFL^*Aw4B78)e*Vx^RHOIC0J^T+LD%&=sA@S1m8~6A8*Jh1v>7TZ6>P0G!NW5a +zp}UI7S1tCWG((-*ggxoa*qhmcJ-TKjlyo4crVH5y(t#7mZ|Fip%X!4aM8Rq$$ED?V +z>(calyB08 +zJ$E0WXnaB}y9o$UtLZPVc?Hequc7@! +z7c4&w#EO|2*d0=g?EGrz%R7-eW*U%kK)=6)U|e_x%DLHpldv;8eSvPbvcNR +zi-)tjheEMh9kR*}!7nTwp6-$G_6&yGmLS;L>_&cFCr%9BLsiFd*jvS6`mg=*&!g61 +z<^+EP#y7$xtOlXF79>@i!rrQrP?uf6p7OKMAGw3`G3j}T*A;^{hA3<~hSH;bNH1)LAHTmK?_BJ5D#8v+J-oikhu5+K +z*nF0WMbne<*_(SX>s@aI#u>0Py9EK6UD%y}0{(fuu-tVV8~sjUf6F~&9UDY!=OFf< +z89?!=0i?7KprC62Nd*@XQF;Z3&iA7%zmfAxE}UI9aqi+cwzuNkumO&o$F?{*A%OGe +zZmxxKoUe9s^RFm1NK{Yz@2NR +zhnoxMCKt|e&e+B|CYyh$V&d +zo7fSZ1Mko*xcjHW#yW%RP6kvq``{m1h}ir(?BTZ>T-gnE^*O}W^ds@`HDnyWhvd#X +z$m||K<%NeRzjz<|vjc3?Aad9b1zp!*;9OF6r~{u*+k!Qp#>2)k2rkZvur?>H4T0;n +zK*Yy$Y{#e(ygLZneSNTo43wYH}4mea#>9-_T<5q!^gZ+5?N( +z=~(k|BG$1zDXB#$GgP3io_j~`|5CXZh>eTozA_6zQF(B4p-fk5;jlr6)n930wk!=R +zmZidBa~{^Nr<^zCz;SCfR;);NrNcrA41vX2dKaF5C=(hmj_UObqGc0ZlS8@I;wjwqP(;gYVT}#+v*TtSB|ag +z3^02;3tzmH4YN-)*kBU|JEvf{dxaw*IU6TW_M)Tnm_p(4Rq*o5g7dl*s21+S>W|3V +z)Kn~=oC32C7=N@6%P0pcKC}Hi4K@q*VavKq1iR%!y(0(us#X-Vb)x79_u8i}BLCPG +z>_2`Dg?+bCe&s$4*N1TE_G28o{s?uq9-(!B?O+=!`^bAwKRT{n#u3hs`8hS%pI(Ld +z=n8(vt%%y$2=CQZSW9`WSr(6F3*xbG?ryky#38?k>*<;ExOwLmw1>_kt?@L%v+J;B +zdk*Z@rNZf}bhxfagNs=j92Y0SZIu>2RvB<#oru7#xd;i;W7p0~t_!7DWtk3j@)1+E~6Il;mrtitcKm<61HU@+&q)8%_jsseHRd4cO0pQ +zPC(mmlGKBk18oQ^Y=w{3fQ>$B*t#nZ+xHY>udW_@a;p$qa1g<%6|i6*EM8QMY47fX +zwM9Ovj-AGltAiX5*HL=<25K(eL+gzp9J@6{{vV+6+FcyE`v47Buc5sAJWk#kKzdd! +zKAU3!FAsMF2ZbOjSI7NgGg{l)aj>=tc?JCTBEk@@-iw05QWTdSLZE*MY}O~i$t?o0 +z$r;#_U4*@P<%lghh`5r&(AFPAe03XkCRIaS(h7CyG594^WB2}QXb&`VFVKXLcmvj$ +z=W_2*jCBi(;OCTw(u$Kv%0G%7+D2qH_M`UvZ5+OS7j3s5;Lwdb=(ux_^1g({U%A0I +zG7o32-Nf#IY^++b1+JSN;p*rLAMR&EcZY&TxCjdk#ug86*g13G9JHMn#DHtJuHY)M +z=lSzDP~UKbW2g@yd&03RI)XBe!uGv;5t5>TXGjV*tkxj0unzl=b|Q;oJ1F}wLMSi4 +zm=ZX8k#DZV@gq}0RSlJnsXVh0x&xNLTTo0~iLzHV@F-Nd=h7wguCAz7P=p6*i^ +z9Jv1kVm~%QZS0KVdJ*Z59bo|ojM#zTm{9J`V`2AMK5;-cB6Mkp$SuU~v_|;Fm%}fy +z5>}3xSj#bE&To19mI7pEH6b*y0ekoLAeDQc%ClEc!|~tTe+x&i-bDMkOT?KMuroXX +z-rgx#WxfxoS?#DU?tqt53VcGNph?y!d;PGm-H41(BPLD_7ni+Q`gsz+=Q0co-2EEs +z4-HAoFZV!?INxu<)<8FS1$n|J*c1LC0dP{qzAixAGna9I@gdGHP2D{>a`GhiT#t~cFGlDd +z&T$qAaNEXjRDTBQT{TcSXy6-_iri8?4sedIuBu02aS1$J3$WzFBJAYaBlnwM_DApmMdrR}P2#F%zjNFcZV1KyzI#bqbVX-s{HgmGzYt8ZgWd@wS$b+kSKDMpT#7-|A{C%~= +znEMctl!w&%YV14Mh|~jzkW<@+8seKvSFYjV1D?gm^AGYa`Imu`L+`oE*ppO(FU=yb +zd3_n8gX^5zL=f`o7L$!!|&dBCiIv}YvWmvj7Nt198>*Q +zFXBK`17ef1uxiy#tX&$zF`h##kN^i&G<>%uz{-9noV?iP*eFCMCn7o_1 +z{nSa^;#hsiJ^B#KyHEZfkRFpB4L!sF_r1Un+D~^Qy}S}W+q1FWCKc8*AodG&^2&1#GbLQPc>@0L*#!rnFRG*5&nf*jG<1LXU5*`D#>ikS*BCz<(bw#3Svheg +zzx5}tJ$N+0+rwjFWH~Y|%aG&5SeA@=@dw$AZISJJ$o_c1{C9|DFWtUQS@od*;$^m7 +z&XdFEk#e4S^!Ndbk@AqmJw2y1)=Aq3h0lkKmA+;y`&-IMVtnQN?!kQw@XTw7ZF#_Z +z4|v`sN%osDpVF5sU&h9=N4CY7HulZX!w0xKIKa8_0n1`N6J7W|*xYYI2c3H78G1_0q +zShhj(C(DraNxmemlq78wq|UaMdaR?2OUp_XdkQ-{J8Y+oL`6jf&pvCR%hu7}B1+NA +zZ`$NU-HSbSy3{K%A05kK?`X&Kt<8$PLeBmi#eSizv`n!#NT5wcGTT*FR)#ZY&L}dJ +zwi7KaEs8x!iZ&HNLAz02S*6&fczRH8>>mIR+5qeb+)16KC-vC0b6|Zow(F_awxzz< +zp871_vtdl4O*huBx1!$Kfi@MJv1N-Je0;nSKsy9!XAv9}gf!YbbaZqmGLSYI5fKs8 +zZ~MbV+E&o!V86Z;$If4XfqLQ=>M-}lr&7O2U6aEGY*g7&kK@PlKI+l8)21LOkNTTJ +zMDNk_Jg=Dg;5^E04;(kz!O`B4^#xJ}`KYa{Rr>63%Mlzu)kQu31qDMlvafg1u7Nhh +z2-q18=Pg@dZM_ZwyTWkn+%;Sp0-|H$uy&Ob&kVOvcOC_Qbq)4rAHiNd&(w=fA*1Fj +zGMg_Vr}Yxbk6ywto=?W9_rd(*P-qegP*vA~%En$CY&i?Vp)PcEo#z-BVE;cvT6Qk$ +z3WbO7c4U{-VOIq8C0oO=-pU`IemO97^uyaL53l{5Gp4-Gv&fhR1f(89Z21Z7qE0uV +z@*;H9hefyDM8c8VDC)S05}q-pQ%A4*xR83$^VC(JL{{-(6gC{gftC&&@9Dt+&n9F@ +z$krn|Rfqi*wJ1N*jrg=01bFd$&8`6UUu404X&#o$NXPI0-W%4o@z|Z$fnB;zY)d~0 +zRbVgD>Te;wV*qITbhPn% +z8sJ$%a#1ZZ4UNzrZbx?A5oA}lAWB<|uqGLP>&QHQ2fCg?&{ve_l+^!Gw^?%L7IY?D=FNfF}!*b!HXh>S8s?&G<1Y7RF0Wx$sD$VGEfv20;H;<6g3N8nlX +zp$m%5Ko)iHX+6|?QEz9sa348+tiSgTbz(Q*?V5@?uZCmId<|BAoQgGHhI1Tip)V;! +zc4j*3k5<0L9icgJuujH$vs9RUmVy=Ysjpw1g>}@USbmj;Wglf=&0LAHk9D_pRdb7QO~9_6&< +zD&l+`#WU3i+LhJT9m4+XRs`AAo +zm9TLx!m`hE5$aWhlznZ~wXjX?v=O;}k8Qt?lUHtIi+dETRq?1f*aLTm-SFJz4j0x16Bn$p^oE*tJy)*wE8m?woRVu;Km_N;P+#iv{jqghB%I805D=M!9mzRx2`YqB +zKna$A$+O$9vaokgHA0gPLsxqiRcEiEf%?7{+993lJCD%lR9IQ3B0Zx6d&A1GZC4bM +z(h_J}mX5S6o&!_=8yRBY8qTxH2Xf6BQr7d;b}OkTSPeVZ^{{txhwYLK*euGz=O6FE +zXH(;0_E8obsPhQ+q3%1m8k*{M6jL8iLA_*0?|EG2`YX@uj`yCTO#sJ_Di;Y6ZE&+I +zg(r39fwUj+a?8bnDV(Ee$0EZ+p7R;k7|(fi?m1oKc=d8utZHGKRR@(KXeGkaTRqj^?Xjfz`!`SD;bw51|mQ^U{vr?Aa +zi#%XEqz+7;Da&@zKTpw>7hC#^0e> +z*#=qtH?`$Y-IL5J?>~wERQ{*WpT0K&3jC1#Pbh(B2mD`J1kcv@hkm> +zsX9MFdw^x+15xIrIo(1)8?l6G%v<3Jy7W4D987JFduAW|V6#{l{r%O&i6SgWNA%RmKo~$iFV<+Y)m9e7cN1)gv3{ +wd^r{+DSI!jjm9Q)Ue*Z7#&-;ea|MdHoYJBhi0G)?VF8}}l + +literal 0 +HcmV?d00001 + +diff --git a/feeds/luci/libs/luci-lib-nixio/axTLS/www/index.html b/feeds/luci/libs/luci-lib-nixio/axTLS/www/index.html +new file mode 100755 +index 0000000..25cd2e6 +--- /dev/null ++++ b/feeds/luci/libs/luci-lib-nixio/axTLS/www/index.html +@@ -0,0 +1,7106 @@ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ axTLS Embedded SSL - changes, notes and errata ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
    ++
    ++
    ++
    ++
    changes, notes and errata
    ++
    Type the text for 'YourName'
    ++
    @@bgcolor(#ff0000):color(#ffffff):Changes for 1.2.1@@\n\n!!__SSL Library__\n* Certificate verification now works for Firefox.\n* Extended the openssl API.\n\n@@bgcolor(#ff0000):color(#ffffff):Changes for 1.2.0@@\n\n!!__SSL Library__\n* A self-signed certificate will be verified as ok provided that that it is on the certificate authority list.\n* Certificates are not verified when added as certificate authorities (since self-signed and expired certificates can be added to browsers etc)\n\n@@bgcolor(#ff0000):color(#ffffff):Changes for 1.1.9@@\n\n!!__SSL Library__\n* Now support MS IIS resource kit certificates (thanks to Carsten Sørensen).\n* Fixed a memory leak when freeing more than one CA certificate.\n* The bigint library had a problem with squaring which affected classical reduction (thanks to Manuel Klimek).\n\n!!__axhttpd__\n* Brought back setuid()/setgid() as an option.\n\n!@@bgcolor(#ff0000):color(#ffffff):Changes for 1.1.8@@\n\n!!__SSL Library__\n* Now using a BSD style license.\n* Self-signed certificates can now be automatically generated (the keys still need to be provided).\n* A new API call //ssl_x509_create()// can be used to programatically create the certificate.\n* Certificate/keys can be loaded automatically given a file location.\n\n!@@bgcolor(#ff0000):color(#ffffff):Changes for 1.1.7@@\n\n!!__SSL Library__\n\n* Variable sized session id's is now better handled for session caching. It has meant a new API call //ssl_get_session_id_size()// and a change to //ssl_client_new()// to define the session id size.\n* Muliple records with a single header are now better supported (thanks to Hervé Sibert).\n* ~MD2 added for Verisign root cert verification (thanks to Byron Rakitzis).\n* The ~MD5/~SHA1 digests are calculated incrementally to reduce memory (thanks to Byron Rakitzis).\n* The bigint cache is now cleared regularly to reduce memory.\n\n!!__axhttpd__\n\n* Improved the POST handling (thanks to Christian Melki).\n* CSS files now work properly.\n* Lua's CGI launcher location is configurable.\n* //vfork()// is now used for CGI for performance reasons.\n\n!@@bgcolor(#ff0000):color(#ffffff):Changes for 1.1.6@@\n\n!!__SSL Library__\n\n* ~RC4 speed improvements\n* Lua samples/bindings now work properly\n\n!@@bgcolor(#ff0000):color(#ffffff):Changes for 1.1.5@@\n\n!!__SSL Library__\n\n* Session id's can now be variable lengths in server hello messages.\n* 0 length client certificates are now supported.\n* ssl_version() now returns just the version and not the date.\n* ssl_write() was not sending complete packets under load.\n\n!!__axhttpd__\n\n* Completely updated the CGI code.\n* Lua now integrated - Lua scripts and Lua Pages now run.\n\n!@@bgcolor(#ff0000):color(#ffffff):Changes for 1.1.4@@\n\n!!__SSL Library__\n\n* Fixed a Win32 crypto library issue with non-Administrator users\n* Removed compiler warnings that showed up in ~FC6.\n* GNU TLS certificates are now accepted.\n* Separated the send/receive headers for HMAC calculations.\n* Fixed a compilation problem with swig/perl/~FC6.\n* Fixed an issue with loading PEM CA certificates.\n\n!!__axhttpd__\n\n* Made //setuid()/setgid()// call an mconf option.\n* Made //chroot()// an mconf option. Default to //chdir()// instead.\n* Removed optional permissions checking.\n\n!@@bgcolor(#ff0000):color(#ffffff):Changes for 1.1.1@@\n\n!!__SSL Library__\n\n* AES should now work on 16bit processors (there was an alignment problem).\n* Various freed objects are cleared before freeing.\n* Header files now installed in ///usr/local/include/axTLS//.\n* -DCYGWIN replaced with -~DCONFIG_PLATFORM_CYGWIN (and the same for Solaris).\n* removed "-noextern" option in Swig. Fixed some other warnings in Win32.\n* SSLCTX changed to ~SSL_CTX (to be consistent with openssl). SSLCTX still exists for backwards compatibility.\n* malloc() and friends call abort() on failure.\n* Fixed a memory leak in directory listings.\n* Added openssl() compatibility functions.\n* Fixed Cygwin 'make install' issue.\n\n!!__axhttpd__\n\n* main.c now becomes axhttpd.c.\n* Header file issue fixed (in mime_types.c).\n* //chroot()// now used for better security.\n* Basic authentication implemented (via .htpasswd).\n* SSL access/denial protection implemented (via .htaccess).\n* Directory access protection implemented (via .htaccess).\n* Can now have more than one CGI file extension in mconf.\n* "~If-Modified-Since" request now handled properly.\n* Performance tweaks to remove //ssl_find()//.
    ++
    [[Read Me]]
    ++
    axTLS uses a BSD style license:\n\nCopyright (c) 2008, Cameron Rich All rights reserved.\n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are met:\n\nRedistributions of source code must retain the above copyright notice, this\nlist of conditions and the following disclaimer. Redistributions in binary\nform must reproduce the above copyright notice, this list of conditions and\nthe following disclaimer in the documentation and/or other materials\nprovided with the distribution. Neither the name of the axTLS Project nor\nthe names of its contributors may be used to endorse or promote products\nderived from this software without specific prior written permission. \n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"\nAND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\nIMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\nARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR\nANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\nDAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\nSERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\nCAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT\nLIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY\nOUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH\nDAMAGE.
    ++
    [[Read Me]] \n[[Changelog]]\n[[axhttpd]]\n[[License]]
    ++
    <div class='header' macro='gradient vert #390108 #900'>\n<div class='headerShadow'>\n<span class='siteTitle' refresh='content' tiddler='SiteTitle'></span>&nbsp;\n<span class='siteSubtitle' refresh='content' tiddler='SiteSubtitle'></span>\n</div>\n<div class='headerForeground'>\n<span class='siteTitle' refresh='content' tiddler='SiteTitle'></span>&nbsp;\n<span class='siteSubtitle' refresh='content' tiddler='SiteSubtitle'></span>\n</div>\n</div>\n<div id='mainMenu'>\n<div refresh='content' tiddler='MainMenu'></div>\n</div>\n<div id='sidebar'>\n<div id='sidebarOptions' refresh='content' tiddler='SideBarOptions'></div>\n<div id='sidebarTabs' refresh='content' force='true' tiddler='SideBarTabs'></div>\n</div>\n<div id='displayArea'>\n<div id='messageArea'></div>\n<div id='tiddlerDisplay'></div>\n</div>
    ++
    !@@bgcolor(#ff0000):color(#ffffff):axTLS Quick Start Guide@@\n\nThis is a guide to get a small SSL web-server up and running quickly.\n\n!!__Introduction__\n\nThe axTLS project is an SSL client/server library using the ~TLSv1 protocol. It is designed to be small and fast, and is suited to embedded projects. A web server is included.\n\nThe basic web server + SSL library is around 60-70kB and is configurable for features or size.\n\n!!__Compilation__\n\nAll platforms require GNU make. This means on Win32 that Cygwin needs to be installed with "make" and various developer options selected.\n\nConfiguration now uses a tool called "mconf" which gives a nice way to configure options (similar to what is used in ~BusyBox and the Linux kernel).\n\nYou should be able to compile axTLS simply by extracting it, change into the extracted directory and typing:\n\n{{indent{{{{> make}}}\n\nSelect your platform type, save the configuration, exit, and then type "make" again.\n\nIf all goes well, you should end up with an executable called "axhttpd" (or axhttpd.exe) in the //_stage// directory.\n\nTo play with all the various axTLS options, type:\n\n{{indent{{{{> make menuconfig}}}\n\nSave the new configuration and rebuild.\n\n!!__Running it__\n\nTo run it, go to the //_stage// directory, and type (as superuser):\n\n{{indent{{{{> axhttpd}}}\n\nNote: you may have to set your ~LD_LIBRARY_PATH - e.g. go to //_stage// and type //export ~LD_LIBRARY_PATH=`pwd`//\n\nAnd then point your browser at https://127.0.0.1 And you should see a this html page with a padlock appearing on your browser. or type http://127.0.0.1 to see the same page unencrypted.\n\n!!__The axssl utilities__\n\nThe axssl suite of tools are the SSL test tools in the various language bindings. They are:\n\n* axssl - C sample\n* axssl.csharp - C# sample\n* axssl.vbnet - VB.NET sample\n* axtls.jar - Java sample\n* axssl.pl - Perl sample\n* axssl.lua - Lua sample\n\nAll the tools have identical command-line parameters. e.g. to run something interesting:\n\n{{indent{{{{> axssl s_server -verify -CAfile ../ssl/test/axTLS.ca_x509}}}\n\nand\n\n{{indent{{{{> axssl s_client -cert ../ssl/test/axTLS.x509_1024 -key ../ssl/test/axTLS.key_1024 -reconnect}}}\n\n!!!!C#\n\nIf building under Linux or other non-Win32 platforms, Mono must be installed and the executable is run as:\n\n{{indent{{{{> mono axssl.csharp.exe ...}}}\n\n!!!!Java\n\nThe java version is run as:\n\n{{indent{{{{> java -jar axtls.jar <options>}}}\n\n!!!!Perl\n\n{{indent{{{{> [perl] ./axssl.pl <options>}}}\n\nIf running under Win32, be sure to use the correct version of Perl (i.e. ~ActiveState's version works ok).\n\n!!!!Lua\n\n{{indent{{{{> [lua] ./axssl.lua <options>}}}\n\n!__Known Issues__\n\n* Firefox doesn't handle legacy ~SSLv2 at all well. Disabling ~SSLv2 still initiates a ~SSLv23 handshake (v1.5). And continuous pressing of the "Reload" page instigates a change to ~SSLv3 for some reason (even though the TLS 1.0 option is selected). This will cause a "Firefox and <server> cannot communicate securely because they have no common encryption algorithms" (v1.5), or "Firefox can't connect to <server> because the site uses a security protocol which isn't enabled" (v2.0). See bugzilla issues 343543 and 359484 (Comment #7). It's all broken (hopefully fixed soon).\n* Perl/Java bindings don't work on 64 bit Linux machines. I can't even compile the latest version of Perl on an ~AMD64 box (using ~FC3).\n* Java 1.4 or better is required for the Java interfaces.\n* Processes that fork can't use session resumption unless some form of IPC is used.\n* Ensure libperl.so and libaxtls.so are in the shared library path when running with the perl bindings. A way to do this is with:\n\n{{indent{{{{> export LD_LIBRARY_PATH=`perl -e 'use Config; print $Config{archlib};'`/CORE:.}}}\n* The lua sample requires the luabit library from http://luaforge.net/projects/bit.\n\n!!!!Win32 issues\n\n* Be careful about doing .NET executions on network drives - .NET complains with security exceptions on the binary. //TODO: Add a manifest file to prevent this.//\n* CGI has been removed from Win32 - it needs a lot more work to get it right.\n* The default Microsoft .NET SDK is v2.0.50727. Download from: http://msdn.microsoft.com/netframework/downloads/updates/default.aspx.\n\n!!!!Solaris issues\n\n* mconf doesn't work well - some manual tweaking is required for string values.\n* GNU make is required and needs to be in $PATH.\n* To get swig's library dependencies to work (and for the C library to be found), I needed to type:\n\n{{indent{{{{> export LD_LIBRARY_PATH=/usr/local/gcc-3.3.1/lib:.}}}\n\n!!!!Cygwin issues\n\n* The bindings all compile but don't run under Cygwin with the exception of Perl. This is due to win32 executables being incompatible with Cygwin libraries.\n\n
    ++
    changes, notes and errata
    ++
    axTLS Embedded SSL
    ++
    http://axtls.cerocclub.com.au
    ++
    /***\nhttp://tiddlystyles.com/#theme:DevFire\nAuthor: Clint Checketts\n***/\n\n/*{{{*/\nbody {\nbackground: #000;\n}\n/*}}}*/\n/***\n!Link styles /% ============================================================= %/\n***/\n/*{{{*/\na,\na.button,\n#mainMenu a.button,\n#sidebarOptions .sliderPanel a{\n color: #ffbf00;\n border: 0;\n background: transparent;\n}\n\na:hover,\na.button:hover,\n#mainMenu a.button:hover,\n#sidebarOptions .sliderPanel a:hover\n#sidebarOptions .sliderPanel a:active{\n color: #ff7f00;\n border: 0;\n border-bottom: #ff7f00 1px dashed;\n background: transparent;\n text-decoration: none;\n}\n\n#displayArea .button.highlight{\n color: #ffbf00;\n background: #4c4c4c;\n}\n/*}}}*/\n/***\n!Header styles /% ============================================================= %/\n***/\n/*{{{*/\n.header{\n border-bottom: 2px solid #ffbf00;\n color: #fff;\n}\n\n.headerForeground a {\n color: #fff;\n}\n\n.header a:hover {\n border-bottom: 1px dashed #fff;\n}\n/*}}}*/\n/***\n!Main menu styles /% ============================================================= %/\n***/\n/*{{{*/\n#mainMenu {color: #fff;}\n#mainMenu h1{\n font-size: 1.1em;\n}\n#mainMenu li,#mainMenu ul{\n list-style: none;\n margin: 0;\n padding: 0;\n}\n/*}}}*/\n/***\n!Sidebar styles /% ============================================================= %/\n***/\n/*{{{*/\n#sidebar {\n right: 0;\n color: #fff;\n border: 2px solid #ffbf00;\n border-width: 0 0 2px 2px;\n}\n#sidebarOptions {\n background-color: #4c4c4c;\n padding: 0;\n}\n\n#sidebarOptions a{\n margin: 0;\n color: #ffbf00;\n border: 0;\n}\n#sidebarOptions a:hover {\n color: #4c4c4c;\n background-color: #ffbf00;\n\n}\n\n#sidebarOptions a:active {\n color: #ffbf00;\n background-color: transparent;\n}\n\n#sidebarOptions .sliderPanel {\n background-color: #333;\n margin: 0;\n}\n\n#sidebarTabs {background-color: #4c4c4c;}\n#sidebarTabs .tabSelected {\n padding: 3px 3px;\n cursor: default;\n color: #ffbf00;\n background-color: #666;\n}\n#sidebarTabs .tabUnselected {\n color: #ffbf00;\n background-color: #5f5f5f;\n padding: 0 4px;\n}\n\n#sidebarTabs .tabUnselected:hover,\n#sidebarTabs .tabContents {\n background-color: #666;\n}\n\n.listTitle{color: #FFF;}\n#sidebarTabs .tabContents a{\n color: #ffbf00;\n}\n\n#sidebarTabs .tabContents a:hover{\n color: #ff7f00;\n background: transparent;\n}\n\n#sidebarTabs .txtMoreTab .tabSelected,\n#sidebarTabs .txtMoreTab .tab:hover,\n#sidebarTabs .txtMoreTab .tabContents{\n color: #ffbf00;\n background: #4c4c4c;\n}\n\n#sidebarTabs .txtMoreTab .tabUnselected {\n color: #ffbf00;\n background: #5f5f5f;\n}\n\n.tab.tabSelected, .tab.tabSelected:hover{color: #ffbf00; border: 0; background-color: #4c4c4c;cursor:default;}\n.tab.tabUnselected {background-color: #666;}\n.tab.tabUnselected:hover{color:#ffbf00; border: 0;background-color: #4c4c4c;}\n.tabContents {\n background-color: #4c4c4c;\n border: 0;\n}\n.tabContents .tabContents{background: #666;}\n.tabContents .tabSelected{background: #666;}\n.tabContents .tabUnselected{background: #5f5f5f;}\n.tabContents .tab:hover{background: #666;}\n/*}}}*/\n/***\n!Message area styles /% ============================================================= %/\n***/\n/*{{{*/\n#messageArea {background-color: #666; color: #fff; border: 2px solid #ffbf00;}\n#messageArea a:link, #messageArea a:visited {color: #ffbf00; text-decoration:none;}\n#messageArea a:hover {color: #ff7f00;}\n#messageArea a:active {color: #ff7f00;}\n#messageArea .messageToolbar a{\n border: 1px solid #ffbf00;\n background: #4c4c4c;\n}\n/*}}}*/\n/***\n!Popup styles /% ============================================================= %/\n***/\n/*{{{*/\n.popup {color: #fff; background-color: #4c4c4c; border: 1px solid #ffbf00;}\n.popup li.disabled{color: #fff;}\n.popup a {color: #ffbf00; }\n.popup a:hover { background: transparent; color: #ff7f00; border: 0;}\n.popup hr {color: #ffbf00; background: #ffbf00;}\n/*}}}*/\n/***\n!Tiddler Display styles /% ============================================================= %/\n***/\n/*{{{*/\n.title{color: #fff;}\nh1, h2, h3, h4, h5 {\n color: #fff;\n background-color: transparent;\n border-bottom: 1px solid #333;\n}\n\n.subtitle{\n color: #666;\n}\n\n.viewer {color: #fff; }\n\n.viewer table{background: #666; color: #fff;}\n\n.viewer th {background-color: #996; color: #fff;}\n\n.viewer pre, .viewer code {color: #ddd; background-color: #4c4c4c; border: 1px solid #ffbf00;}\n\n.viewer hr {color: #666;}\n\n.tiddler .button {color: #4c4c4c;}\n.tiddler .button:hover { color: #ffbf00; background-color: #4c4c4c;}\n.tiddler .button:active {color: #ffbf00; background-color: #4c4c4c;}\n\n.toolbar {\n color: #4c4c4c;\n}\n\n.toolbar a.button,\n.toolbar a.button:hover,\n.toolbar a.button:active,\n.editorFooter a{\n border: 0;\n}\n\n.footer {\n color: #ddd;\n}\n\n.selected .footer {\n color: #888;\n}\n\n.highlight, .marked {\n color: #000;\n background-color: #ffe72f;\n}\n.editorFooter {\n color: #aaa;\n}\n\n.tab{\n-moz-border-radius-topleft: 3px;\n-moz-border-radius-topright: 3px;\n}\n\n.tagging,\n.tagged{\n background: #4c4c4c;\n border: 1px solid #4c4c4c; \n}\n\n.selected .tagging,\n.selected .tagged{\n background-color: #333;\n border: 1px solid #ffbf00;\n}\n\n.tagging .listTitle,\n.tagged .listTitle{\n color: #fff;\n}\n\n.tagging .button,\n.tagged .button{\n color: #ffbf00;\n border: 0;\n padding: 0;\n}\n\n.tagging .button:hover,\n.tagged .button:hover{\nbackground: transparent;\n}\n\n.selected .isTag .tagging.simple,\n.selected .tagged.simple,\n.isTag .tagging.simple,\n.tagged.simple {\n float: none;\n display: inline;\n border: 0;\n background: transparent;\n color: #fff;\n margin: 0;\n}\n\n.cascade {\n background: #4c4c4c;\n color: #ddd;\n border: 1px solid #ffbf00;\n}\n/*}}}*/
    ++
    axhttpd is a small embedded web server using the axTLS library. It is based originally on the web server written by Doug Currie which is at http://www.hcsw.org/awhttpd.\n\n!@@bgcolor(#ff0000):color(#ffffff):axhttpd Features@@ \n\n!!__Basic Authentication__\n\nBasic Authentication uses a password file called ".htpasswd", in the directory to be protected. This file is formatted as the familiar colon-separated username/encrypted-password pair, records delimited by newlines. The protection does not carry over to subdirectories. The utility program htpasswd is included to help manually edit .htpasswd files.\n\nThe encryption of this password uses a proprietary algorithm due to the dependency of many crypt libraries on DES. An example is in [[/test_dir/no_http|https://127.0.0.1/test_dir/no_http]] (username 'abcd', password is '1234').\n\n//Note: This is an mconf enabled configuration option.//\n\n!!__SSL Protection__\n\nDirectories/files can be accessed using the 'http' or 'https' uri prefix. If normal http access for a directory needs to be disabled, then put "~SSLRequireSSL" into a '.htaccess' file in the directory to be protected. \n\nConversely, use "~SSLDenySSL" to deny access to directories via SSL.\n\nAn example is in [[/test_dir/no_http|http://127.0.0.1/test_dir/no_http]] and [[/test_dir/no_ssl|https://127.0.0.1/test_dir/no_ssl]].\n\nEntire directories can be denied access with a "Deny all" directive (regardless of SSL or authentication). An example is in [[/test_dir/bin|http://127.0.0.1/test_dir/bin]]\n\n!!__CGI__\n\nMost of the CGI 1.1 variables are now placed into the script environment and should work as normal.\n\n!!__Lua and Lua Pages__\n\nThis is a small scripting language gaining popularity in embedded applications due to its small footprint and fast speed.\n\nLua has been incorporated into the build, so simply select it and it will automatically install. Try pointing your browser at [[test_main.html]|http://127.0.0.1/lua/test_main.html]] to see an example of Lua Pages.\n\n//Note: This is an mconf enabled configuration option.//\n\n!!__Directory Listing__\n\nAn mconf option. Allow the files in directories to be displayed. An example is in [[/test_dir|http://127.0.0.1/test_dir]]\n\n!!__Other Features__\n\n* Timeout - HTTP 1.1 allows for persistent connections. This is the time allowed for this connection in seconds.\n* Daemon - Puts the process in daemon mode. \n* SSL session cache size - The size of the session cache (a heavily loaded server should maintain many sessions). A session will save on expensive SSL handshaking.\n\n
    ++
    ++ ++ ++ ++ ++ +diff --git a/feeds/luci/libs/luci-lib-nixio/axTLS/www/lua/download.lua b/feeds/luci/libs/luci-lib-nixio/axTLS/www/lua/download.lua +new file mode 100644 +index 0000000..2ee1a71 +--- /dev/null ++++ b/feeds/luci/libs/luci-lib-nixio/axTLS/www/lua/download.lua +@@ -0,0 +1,75 @@ ++#!/usr/local/bin/lua ++ ++require"luasocket" ++ ++function receive (connection) ++ connection:settimeout(0) ++ local s, status = connection:receive (2^10) ++ if status == "timeout" then ++ coroutine.yield (connection) ++ end ++ return s, status ++end ++ ++function download (host, file, outfile) ++ --local f = assert (io.open (outfile, "w")) ++ local c = assert (socket.connect (host, 80)) ++ c:send ("GET "..file.." HTTP/1.0\r\n\r\n") ++ while true do ++ local s, status = receive (c) ++ --f:write (s) ++ if status == "closed" then ++ break ++ end ++ end ++ c:close() ++ --f:close() ++end ++ ++local threads = {} ++function get (host, file, outfile) ++ print (string.format ("Downloading %s from %s to %s", file, host, outfile)) ++ local co = coroutine.create (function () ++ return download (host, file, outfile) ++ end) ++ table.insert (threads, co) ++end ++ ++function dispatcher () ++ while true do ++ local n = table.getn (threads) ++ if n == 0 then ++ break ++ end ++ local connections = {} ++ for i = 1, n do ++ local status, res = coroutine.resume (threads[i]) ++ if not res then ++ table.remove (threads, i) ++ break ++ else ++ table.insert (connections, res) ++ end ++ end ++ if table.getn (connections) == n then ++ socket.select (connections) ++ end ++ end ++end ++ ++local url = arg[1] ++if not url then ++ print (string.format ("usage: %s url [times]", arg[0])) ++ os.exit() ++end ++local times = arg[2] or 5 ++ ++url = string.gsub (url, "^http.?://", "") ++local _, _, host, file = string.find (url, "^([^/]+)(/.*)") ++local _, _, fn = string.find (file, "([^/]+)$") ++ ++for i = 1, times do ++ get (host, file, fn..i) ++end ++ ++dispatcher () +diff --git a/feeds/luci/libs/luci-lib-nixio/axTLS/www/lua/env.lua b/feeds/luci/libs/luci-lib-nixio/axTLS/www/lua/env.lua +new file mode 100644 +index 0000000..c429847 +--- /dev/null ++++ b/feeds/luci/libs/luci-lib-nixio/axTLS/www/lua/env.lua +@@ -0,0 +1,26 @@ ++-- This file should be executed before any script in this directory ++-- according to the configuration (cgilua/conf.lua). ++ ++pcall (cgilua.enablesession) ++ ++local put, mkurlpath = cgilua.put, cgilua.mkurlpath ++ ++cgilua.addclosefunction (function () ++ put [[ ++

    CGILua installation overview

    ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
    Version ++ Copyright ++ Description ++
    <%= tostring(_G[l[2]]) %> ++ ++ ++
    <%= idx(p,"VERSION") %> ++ <%= idx(p,"COPYRIGHT") %> ++ <%= idx(p,"DESCRIPTION") %> ++
    ++ ++ ++ +diff --git a/feeds/luci/libs/luci-lib-nixio/axTLS/www/lua/prepara_sql2.lua b/feeds/luci/libs/luci-lib-nixio/axTLS/www/lua/prepara_sql2.lua +new file mode 100644 +index 0000000..6a37c2f +--- /dev/null ++++ b/feeds/luci/libs/luci-lib-nixio/axTLS/www/lua/prepara_sql2.lua +@@ -0,0 +1,31 @@ ++#!/usr/local/bin/lua ++ ++MAX_ROWS = arg[1] or 10 ++ ++require"postgres" ++ ++local env = assert (luasql.postgres ()) ++local conn = assert (env:connect ("luasql-test", "tomas")) ++ ++-- Apaga restos de outros testes. ++conn:execute "drop table t2" ++conn:execute "drop table t1" ++ ++-- Criando as tabelas. ++assert (conn:execute [[create table t1 ( ++ a int, ++ b int ++)]]) ++assert (conn:execute [[create table t2 ( ++ c int, ++ d int ++)]]) ++ ++-- Preenchedo as tabelas. ++for i = 1, MAX_ROWS do ++ local ii = 2*i ++ assert (conn:execute (string.format ([[ ++insert into t1 values (%d, %d); ++insert into t2 values (%d, %d);]], ++ ii, i, ii, i))) ++end +diff --git a/feeds/luci/libs/luci-lib-nixio/axTLS/www/lua/test_conc.lua b/feeds/luci/libs/luci-lib-nixio/axTLS/www/lua/test_conc.lua +new file mode 100644 +index 0000000..bbb9be7 +--- /dev/null ++++ b/feeds/luci/libs/luci-lib-nixio/axTLS/www/lua/test_conc.lua +@@ -0,0 +1,38 @@ ++cgilua.htmlheader() ++if ap then ++ local pid, ppid = ap.pid () ++ if not ppid then ++ ppid = "no parent pid" ++ end ++ cgilua.put ("pid = "..pid.." ("..ppid..")".."\n") ++end ++ ++assert(type(stable.get) == "function") ++assert(type(stable.set) == "function") ++ ++cgilua.put"stable.pairs = {
    \n" ++for i, v in stable.pairs () do ++ cgilua.put (i.." = "..tostring(v).."
    \n") ++end ++cgilua.put"}
    \n" ++ ++local counter = stable.get"counter" or 0 ++stable.set ("counter", counter + 1) ++ ++local f = stable.get"f" ++if not f then ++ local d = os.date() ++ stable.set ("f", function () return d end) ++else ++ cgilua.put ("f() = "..tostring (f ())) ++end ++ ++cgilua.put"
    \n" ++for i = 1,800 do ++ cgilua.put (i) ++ for ii = 1,1000 do ++ cgilua.put ("") ++ end ++ cgilua.put ("\n") ++end ++cgilua.put ("End") +diff --git a/feeds/luci/libs/luci-lib-nixio/axTLS/www/lua/test_cookies.lp b/feeds/luci/libs/luci-lib-nixio/axTLS/www/lua/test_cookies.lp +new file mode 100644 +index 0000000..932b9c5 +--- /dev/null ++++ b/feeds/luci/libs/luci-lib-nixio/axTLS/www/lua/test_cookies.lp +@@ -0,0 +1,13 @@ ++ ++ ++

    Testing Cookies library

    ++ ++<%= CL_COOKIE%> = <%= tostring(test)%>
    ++Assigning current date to cookie!
    ++Reload this script to check cookie's value! +diff --git a/feeds/luci/libs/luci-lib-nixio/axTLS/www/lua/test_cookies.lua b/feeds/luci/libs/luci-lib-nixio/axTLS/www/lua/test_cookies.lua +new file mode 100644 +index 0000000..6af935e +--- /dev/null ++++ b/feeds/luci/libs/luci-lib-nixio/axTLS/www/lua/test_cookies.lua +@@ -0,0 +1,14 @@ ++local cookies = require"cgilua.cookies" ++CL_COOKIE = "cgilua_cookie" ++ ++local test = cookies.get (CL_COOKIE) ++cookies.set (CL_COOKIE, os.date()) ++ ++cgilua.htmlheader () ++cgilua.put ([[ ++

    Testing Cookies library

    ++ ++]]..CL_COOKIE..' = '..tostring(test)..[[
    ++Assigning current date to cookie!
    ++Reload this script to check cookie's value! ++]]) +diff --git a/feeds/luci/libs/luci-lib-nixio/axTLS/www/lua/test_err.lua b/feeds/luci/libs/luci-lib-nixio/axTLS/www/lua/test_err.lua +new file mode 100644 +index 0000000..4d6ffc9 +--- /dev/null ++++ b/feeds/luci/libs/luci-lib-nixio/axTLS/www/lua/test_err.lua +@@ -0,0 +1,4 @@ ++cgilua.htmlheader() ++cgilua.put"Oi!" ++--io.write"something\n" ++cgilua.errorlog ("eca", "emerg") +diff --git a/feeds/luci/libs/luci-lib-nixio/axTLS/www/lua/test_fs.lua b/feeds/luci/libs/luci-lib-nixio/axTLS/www/lua/test_fs.lua +new file mode 100644 +index 0000000..566ed8b +--- /dev/null ++++ b/feeds/luci/libs/luci-lib-nixio/axTLS/www/lua/test_fs.lua +@@ -0,0 +1,23 @@ ++function link_dir (dir, base) ++ local path = base.."/"..dir ++ local mode = lfs.attributes (path).mode ++ if mode == "directory" then ++ return string.format ('%s', ++ cgilua.mkurlpath ("test_fs.lua", { dir = path }), ++ dir) ++ else ++ return dir ++ end ++end ++ ++cgilua.htmlheader () ++cgilua.put ("

    Testing Filesystem library

    \n") ++cgilua.put ("\n") ++cgilua.put ("\n") ++local i = 0 ++local dir = cgi.dir or "." ++for file in lfs.dir (dir) do ++ i = i+1 ++ cgilua.put ("\n") ++end ++cgilua.put ("
    Testing dir
    "..i..""..link_dir(file, dir).."
    \n") +diff --git a/feeds/luci/libs/luci-lib-nixio/axTLS/www/lua/test_htk.lua b/feeds/luci/libs/luci-lib-nixio/axTLS/www/lua/test_htk.lua +new file mode 100644 +index 0000000..ac1de6c +--- /dev/null ++++ b/feeds/luci/libs/luci-lib-nixio/axTLS/www/lua/test_htk.lua +@@ -0,0 +1,22 @@ ++require"htk" ++ ++local a_table = {} ++for i = 1, 20 do ++ local l = {} ++ for j = 1, 20 do ++ table.insert (l, HTK.TD { "cell "..i..","..j }) ++ end ++ table.insert (a_table, HTK.TR (l)) ++end ++ ++cgilua.htmlheader() ++cgilua.put (HTK.HTML { ++ HTK.HEAD { HTK.TITLE { "Titulo da Pagina" } }, ++ HTK.BODY { ++ bgcolor = "#FFFFFF", ++ HTK.H1 { "Titulo da Pagina" }, ++ HTK.P {}, ++ "Uma página qualquer", ++ HTK.TABLE (a_table), ++ } ++}) +diff --git a/feeds/luci/libs/luci-lib-nixio/axTLS/www/lua/test_lib.lua b/feeds/luci/libs/luci-lib-nixio/axTLS/www/lua/test_lib.lua +new file mode 100644 +index 0000000..5041253 +--- /dev/null ++++ b/feeds/luci/libs/luci-lib-nixio/axTLS/www/lua/test_lib.lua +@@ -0,0 +1,31 @@ ++local function getfield (t, f) ++ for w in string.gfind(f, "[%w_]+") do ++ if not t then return nil end ++ t = t[w] ++ end ++ return t ++end ++ ++function test_lib (libname) ++ local ok, err = pcall (require, libname) ++ if not ok then ++ cgilua.put ("Library "..libname.." not found
    \n".. ++ err) ++ else ++ cgilua.put ("Library "..libname.."
    \n") ++ local t = getfield (_G, libname) ++ if type(t) ~= "table" then ++ cgilua.put (tostring(t)) ++ else ++ for i, v in pairs (t) do ++ cgilua.put ("  "..tostring(i).." = "..tostring(v).."
    \n") ++ end ++ end ++ end ++ cgilua.put ("\n

    \n") ++end ++ ++cgilua.htmlheader () ++for _, lib in ipairs { "lfs", "socket", "luasql.postgres", "luasql", "lxp", "lxp.lom", "lualdap", "htk", "xmlrpc", "xmlrpc.http" } do ++ test_lib (lib) ++end +diff --git a/feeds/luci/libs/luci-lib-nixio/axTLS/www/lua/test_main.html b/feeds/luci/libs/luci-lib-nixio/axTLS/www/lua/test_main.html +new file mode 100644 +index 0000000..a50dd63 +--- /dev/null ++++ b/feeds/luci/libs/luci-lib-nixio/axTLS/www/lua/test_main.html +@@ -0,0 +1,127 @@ ++ ++Test Page ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
    GET: ++
    Lua scriptmodule
    HTML templatemodule
    POST: ++
    ++
    ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
    ++ field 1:
    ++ field 2:
    ++ field 3: ++ op 1 ++ op 2 ++ op 3 ++
    Lua script ++ module ++
    HTML template ++ module ++
    ++
    ++
    POST (with upload): ++
    ++
    ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
    ++ field 1:
    ++ file (binary!):
    ++
    Lua script ++ module ++
    HTML template ++ module ++
    ++
    ++
    Cookies: ++
    Lua scriptmodule
    HTML templatemodule
    Filesystem: ++
    Lua scriptmodule
    Session: ++
    Lua scriptmodule
    CGI Variables: ++
    HTML templatemodule
    Library Overview: ++
    HTML templatemodule
    Concurrency ++
    Lua scriptmodule
    ++ +diff --git a/feeds/luci/libs/luci-lib-nixio/axTLS/www/lua/test_main.lp b/feeds/luci/libs/luci-lib-nixio/axTLS/www/lua/test_main.lp +new file mode 100644 +index 0000000..917ee1e +--- /dev/null ++++ b/feeds/luci/libs/luci-lib-nixio/axTLS/www/lua/test_main.lp +@@ -0,0 +1,31 @@ ++ ++Embeded Lua Test ++ ++ ++cgi = { ++\n", vv, a, tostring(b)) ++ end ++ v = vv.."}" ++ end ++?> ++<%= i %> = <%= tostring(v) %>
    ++<% ++end ++%> ++} ++
    ++Remote address: <%= cgilua.servervariable"REMOTE_ADDR" %> ++
    ++Is persistent = <%= tostring (SAPI.Info.ispersistent) %> ++
    ++ap =
    ++lfcgi = <% = tostring(lfcgi) %>
    ++<%= (ap and ap.handler()) or "" %>
    ++ ++ ++ +diff --git a/feeds/luci/libs/luci-lib-nixio/axTLS/www/lua/test_main.lua b/feeds/luci/libs/luci-lib-nixio/axTLS/www/lua/test_main.lua +new file mode 100644 +index 0000000..0e997a2 +--- /dev/null ++++ b/feeds/luci/libs/luci-lib-nixio/axTLS/www/lua/test_main.lua +@@ -0,0 +1,46 @@ ++cgilua.htmlheader() ++cgilua.put[[ ++ ++Script Lua Test ++ ++ ++cgi = { ++]] ++ ++for i,v in pairs (cgi) do ++ if type(v) == "table" then ++ local vv = "{" ++ for a,b in pairs(v) do ++ vv = string.format ("%s%s = %s
    \n", vv, a, tostring(b)) ++ end ++ v = vv.."}" ++ end ++ cgilua.put (string.format ("%s = %s
    \n", i, tostring(v))) ++end ++cgilua.put "}
    \n" ++cgilua.put ("Remote address: "..cgilua.servervariable"REMOTE_ADDR") ++cgilua.put "
    \n" ++cgilua.put ("Is persistent = "..tostring (SAPI.Info.ispersistent).."
    \n") ++cgilua.put ("ap="..tostring(ap).."
    \n") ++cgilua.put ("lfcgi="..tostring(lfcgi).."
    \n") ++ ++-- Checking Virtual Environment ++local my_output = cgilua.put ++cgilua.put = nil ++local status, err = pcall (function () ++ assert (cgilua.put == nil, "cannot change cgilua.put value") ++end) ++cgilua.put = my_output ++assert (status == true, err) ++ ++-- Checking require ++local status, err = pcall (function () require"unknown_module" end) ++assert (status == false, "unknown_module loaded!") ++-- assert (package == nil, "Access to package table allowed!") ++ ++cgilua.put[[ ++

    ++ ++ ++]] ++cgilua = nil +diff --git a/feeds/luci/libs/luci-lib-nixio/axTLS/www/lua/test_session.lua b/feeds/luci/libs/luci-lib-nixio/axTLS/www/lua/test_session.lua +new file mode 100644 +index 0000000..d97cc45 +--- /dev/null ++++ b/feeds/luci/libs/luci-lib-nixio/axTLS/www/lua/test_session.lua +@@ -0,0 +1,43 @@ ++cgilua.enablesession () ++ ++function pt (tab) ++ for i, v in pairs (tab) do ++ local vv = v ++ if type(v) == "table" then ++ vv = "" ++ for _i, _v in pairs (v) do ++ vv = vv..string.format ("%s = %q, ", _i, _v) ++ end ++ vv = '{'..vv..'}' ++ end ++ cgilua.put (string.format ("%s = %s
    \n", tostring (i), tostring (vv))) ++ end ++end ++ ++ ++if cgi.field then ++ if not cgilua.session.data.field then ++ cgilua.session.data.field = {} ++ end ++ table.insert (cgilua.session.data.field, cgi.field) ++end ++cgilua.htmlheader() ++if cgilua.session then ++ cgilua.put "cgi = {
    \n" ++ pt (cgi) ++ cgilua.put "}
    \n" ++ cgilua.put "cgilua.session.data = {
    \n" ++ pt (cgilua.session.data) ++ cgilua.put "}
    \n" ++ ++ cgilua.put [[

    ++ field:
    ++
    ++
    ]] ++else ++ cgilua.put "Sessions library is not available or not well configured" ++end +diff --git a/feeds/luci/libs/luci-lib-nixio/axTLS/www/lua/test_sql.lua b/feeds/luci/libs/luci-lib-nixio/axTLS/www/lua/test_sql.lua +new file mode 100644 +index 0000000..085ce97 +--- /dev/null ++++ b/feeds/luci/libs/luci-lib-nixio/axTLS/www/lua/test_sql.lua +@@ -0,0 +1,13 @@ ++local s = require"luasql.postgres" ++ ++local env = assert (luasql.postgres ()) ++local conn = assert (env:connect ("luasql-test", "tomas")) ++local cur = assert (conn:execute ("select count(*) from fetch_test")) ++ ++cgilua.htmlheader() ++cgilua.put ("Total lines at table fetch_test is "..cur:fetch()) ++cgilua.put (string.format ("
    \n%s == %s
    \n", tostring(s), tostring(luasql))) ++ ++cur:close() ++conn:close() ++env:close() +diff --git a/feeds/luci/libs/luci-lib-nixio/axTLS/www/lua/test_sql2.lua b/feeds/luci/libs/luci-lib-nixio/axTLS/www/lua/test_sql2.lua +new file mode 100644 +index 0000000..a2f6ee1 +--- /dev/null ++++ b/feeds/luci/libs/luci-lib-nixio/axTLS/www/lua/test_sql2.lua +@@ -0,0 +1,24 @@ ++require"postgres" ++ ++local env = assert (luasql.postgres ()) ++local conn = assert (env:connect ("luasql-test", "tomas")) ++local cur = assert (conn:execute ("select count(*) from t1")) ++local total = tonumber (cur:fetch()) ++cur:close() ++local aleatorio = math.random(total) ++local cur = assert (conn:execute ("select * from t1, t2 where b = d and a != "..2*aleatorio)) ++ ++cgilua.htmlheader() ++cgilua.put ("Aleatorio = "..aleatorio.."
    \n") ++ ++local a,b,c,d = cur:fetch() ++cgilua.put ("\n") ++while a do ++-- cgilua.put ("") ++ a,b,c,d = cur:fetch() ++end ++cgilua.put ("
    ",a,"",b,"",c,"",d,"
    \n") ++ ++cur:close() ++conn:close() ++env:close() +diff --git a/feeds/luci/libs/luci-lib-nixio/axTLS/www/lua/test_variables.lp b/feeds/luci/libs/luci-lib-nixio/axTLS/www/lua/test_variables.lp +new file mode 100644 +index 0000000..c1ac332 +--- /dev/null ++++ b/feeds/luci/libs/luci-lib-nixio/axTLS/www/lua/test_variables.lp +@@ -0,0 +1,14 @@ ++ ++<% for _, var in pairs { "SERVER_SOFTWARE", "SERVER_NAME", "GATEWAY_INTERFACE", "SERVER_PROTOCOL", "SERVER_PORT", "REQUEST_METHOD", "PATH_INFO", "PATH_TRANSLATED", "SCRIPT_NAME", "QUERY_STRING", "REMOTE_HOST", "REMOTE_ADDR", "AUTH_TYPE", "REMOTE_USER", "REMOTE_IDENT", "CONTENT_TYPE", "CONTENT_LENGTH", "HTTP_REFERER", "HTTP_COOKIE", "SCRIPT_FILENAME", "DOCUMENT_ROOT", } do %> ++ ++<% end %> ++
    <%= var %>="<%= cgilua.servervariable(var) or "not defined"%>"
    ++ ++

    ++ ++<% for _, var in ipairs { "script_file", "script_path", "script_pdir", "script_vdir", "script_vpath", "urlpath", } do %> ++ ++<% end %> ++
    <%= var %>="<%= cgilua[var] %>"
    ++ ++

    +diff --git a/feeds/luci/libs/luci-lib-nixio/axTLS/www/test_dir/bin/.htaccess b/feeds/luci/libs/luci-lib-nixio/axTLS/www/test_dir/bin/.htaccess +new file mode 100644 +index 0000000..8fd8c46 +--- /dev/null ++++ b/feeds/luci/libs/luci-lib-nixio/axTLS/www/test_dir/bin/.htaccess +@@ -0,0 +1 @@ ++Deny all +diff --git a/feeds/luci/libs/luci-lib-nixio/axTLS/www/test_dir/no_http/.htaccess b/feeds/luci/libs/luci-lib-nixio/axTLS/www/test_dir/no_http/.htaccess +new file mode 100644 +index 0000000..3e20076 +--- /dev/null ++++ b/feeds/luci/libs/luci-lib-nixio/axTLS/www/test_dir/no_http/.htaccess +@@ -0,0 +1 @@ ++SSLRequireSSL +diff --git a/feeds/luci/libs/luci-lib-nixio/axTLS/www/test_dir/no_http/.htpasswd b/feeds/luci/libs/luci-lib-nixio/axTLS/www/test_dir/no_http/.htpasswd +new file mode 100644 +index 0000000..0471b01 +--- /dev/null ++++ b/feeds/luci/libs/luci-lib-nixio/axTLS/www/test_dir/no_http/.htpasswd +@@ -0,0 +1,2 @@ ++abcd:CQhgDPyy0rvEU8OMxnQIvg==$YdJfIKZimFLYxPf/rbnhtQ== ++yaya:Syuss5jE2FNGVdr0kKGoHg==$WLw/SgHZFuAoOuml3GTJVw== +diff --git a/feeds/luci/libs/luci-lib-nixio/axTLS/www/test_dir/no_http/index.html b/feeds/luci/libs/luci-lib-nixio/axTLS/www/test_dir/no_http/index.html +new file mode 100644 +index 0000000..8b86eba +--- /dev/null ++++ b/feeds/luci/libs/luci-lib-nixio/axTLS/www/test_dir/no_http/index.html +@@ -0,0 +1,6 @@ ++ ++axhttpd is running ++ ++Looks like you got to this directory. ++ ++ +diff --git a/feeds/luci/libs/luci-lib-nixio/axTLS/www/test_dir/no_ssl/.htaccess b/feeds/luci/libs/luci-lib-nixio/axTLS/www/test_dir/no_ssl/.htaccess +new file mode 100644 +index 0000000..d980d26 +--- /dev/null ++++ b/feeds/luci/libs/luci-lib-nixio/axTLS/www/test_dir/no_ssl/.htaccess +@@ -0,0 +1 @@ ++SSLDenySSL +diff --git a/feeds/luci/libs/luci-lib-nixio/axTLS/www/test_dir/no_ssl/index.html b/feeds/luci/libs/luci-lib-nixio/axTLS/www/test_dir/no_ssl/index.html +new file mode 100644 +index 0000000..8b86eba +--- /dev/null ++++ b/feeds/luci/libs/luci-lib-nixio/axTLS/www/test_dir/no_ssl/index.html +@@ -0,0 +1,6 @@ ++ ++axhttpd is running ++ ++Looks like you got to this directory. ++ ++ +diff --git a/feeds/luci/libs/luci-lib-nixio/axtls-config/.config b/feeds/luci/libs/luci-lib-nixio/axtls-config/.config +new file mode 100644 +index 0000000..46cd061 +--- /dev/null ++++ b/feeds/luci/libs/luci-lib-nixio/axtls-config/.config +@@ -0,0 +1,112 @@ ++# ++# Automatically generated make config: don't edit ++# ++HAVE_DOT_CONFIG=y ++CONFIG_PLATFORM_LINUX=y ++# CONFIG_PLATFORM_CYGWIN is not set ++# CONFIG_PLATFORM_WIN32 is not set ++ ++# ++# General Configuration ++# ++PREFIX="/usr" ++# CONFIG_DEBUG is not set ++CONFIG_STRIP_UNWANTED_SECTIONS=y ++# CONFIG_VISUAL_STUDIO_7_0 is not set ++# CONFIG_VISUAL_STUDIO_8_0 is not set ++CONFIG_VISUAL_STUDIO_7_0_BASE="" ++CONFIG_VISUAL_STUDIO_8_0_BASE="" ++CONFIG_EXTRA_CFLAGS_OPTIONS="-fpic" ++CONFIG_EXTRA_LDFLAGS_OPTIONS="" ++ ++# ++# SSL Library ++# ++# CONFIG_SSL_SERVER_ONLY is not set ++# CONFIG_SSL_CERT_VERIFICATION is not set ++# CONFIG_SSL_ENABLE_CLIENT is not set ++CONFIG_SSL_FULL_MODE=y ++# CONFIG_SSL_SKELETON_MODE is not set ++# CONFIG_SSL_PROT_LOW is not set ++CONFIG_SSL_PROT_MEDIUM=y ++# CONFIG_SSL_PROT_HIGH is not set ++# CONFIG_SSL_USE_DEFAULT_KEY is not set ++CONFIG_SSL_PRIVATE_KEY_LOCATION="/etc/nixio/rsa_main.der" ++CONFIG_SSL_PRIVATE_KEY_PASSWORD="" ++CONFIG_SSL_X509_CERT_LOCATION="" ++# CONFIG_SSL_GENERATE_X509_CERT is not set ++CONFIG_SSL_X509_COMMON_NAME="" ++CONFIG_SSL_X509_ORGANIZATION_NAME="" ++CONFIG_SSL_X509_ORGANIZATION_UNIT_NAME="" ++# CONFIG_SSL_ENABLE_V23_HANDSHAKE is not set ++# CONFIG_SSL_HAS_PEM is not set ++# CONFIG_SSL_USE_PKCS12 is not set ++CONFIG_SSL_EXPIRY_TIME=24 ++CONFIG_X509_MAX_CA_CERTS=4 ++CONFIG_SSL_MAX_CERTS=2 ++CONFIG_SSL_CTX_MUTEXING=y ++CONFIG_USE_DEV_URANDOM=y ++# CONFIG_WIN32_USE_CRYPTO_LIB is not set ++# CONFIG_OPENSSL_COMPATIBLE is not set ++# CONFIG_PERFORMANCE_TESTING is not set ++# CONFIG_SSL_TEST is not set ++# CONFIG_AXHTTPD is not set ++# CONFIG_HTTP_STATIC_BUILD is not set ++CONFIG_HTTP_PORT=0 ++CONFIG_HTTP_HTTPS_PORT=0 ++CONFIG_HTTP_SESSION_CACHE_SIZE=0 ++CONFIG_HTTP_WEBROOT="" ++CONFIG_HTTP_TIMEOUT=0 ++# CONFIG_HTTP_HAS_CGI is not set ++CONFIG_HTTP_CGI_EXTENSIONS="" ++# CONFIG_HTTP_ENABLE_LUA is not set ++CONFIG_HTTP_LUA_PREFIX="" ++CONFIG_HTTP_LUA_CGI_LAUNCHER="" ++# CONFIG_HTTP_BUILD_LUA is not set ++# CONFIG_HTTP_DIRECTORIES is not set ++# CONFIG_HTTP_HAS_AUTHORIZATION is not set ++# CONFIG_HTTP_HAS_IPV6 is not set ++# CONFIG_HTTP_ENABLE_DIFFERENT_USER is not set ++CONFIG_HTTP_USER="" ++# CONFIG_HTTP_VERBOSE is not set ++# CONFIG_HTTP_IS_DAEMON is not set ++ ++# ++# Language Bindings ++# ++# CONFIG_BINDINGS is not set ++# CONFIG_CSHARP_BINDINGS is not set ++# CONFIG_VBNET_BINDINGS is not set ++CONFIG_DOT_NET_FRAMEWORK_BASE="" ++# CONFIG_JAVA_BINDINGS is not set ++CONFIG_JAVA_HOME="" ++# CONFIG_PERL_BINDINGS is not set ++CONFIG_PERL_CORE="" ++CONFIG_PERL_LIB="" ++# CONFIG_LUA_BINDINGS is not set ++CONFIG_LUA_CORE="" ++ ++# ++# Samples ++# ++# CONFIG_SAMPLES is not set ++# CONFIG_C_SAMPLES is not set ++# CONFIG_CSHARP_SAMPLES is not set ++# CONFIG_VBNET_SAMPLES is not set ++# CONFIG_JAVA_SAMPLES is not set ++# CONFIG_PERL_SAMPLES is not set ++# CONFIG_LUA_SAMPLES is not set ++ ++# ++# BigInt Options ++# ++# CONFIG_BIGINT_CLASSICAL is not set ++# CONFIG_BIGINT_MONTGOMERY is not set ++CONFIG_BIGINT_BARRETT=y ++CONFIG_BIGINT_CRT=y ++# CONFIG_BIGINT_KARATSUBA is not set ++MUL_KARATSUBA_THRESH=0 ++SQU_KARATSUBA_THRESH=0 ++CONFIG_BIGINT_SLIDING_WINDOW=y ++CONFIG_BIGINT_SQUARE=y ++# CONFIG_BIGINT_CHECK_ON is not set +diff --git a/feeds/luci/libs/luci-lib-nixio/axtls-config/config.h b/feeds/luci/libs/luci-lib-nixio/axtls-config/config.h +new file mode 100644 +index 0000000..0f861f3 +--- /dev/null ++++ b/feeds/luci/libs/luci-lib-nixio/axtls-config/config.h +@@ -0,0 +1,113 @@ ++/* ++ * Automatically generated header file: don't edit ++ */ ++ ++#define HAVE_DOT_CONFIG 1 ++#define CONFIG_PLATFORM_LINUX 1 ++#undef CONFIG_PLATFORM_CYGWIN ++#undef CONFIG_PLATFORM_WIN32 ++ ++/* ++ * General Configuration ++ */ ++#define PREFIX "/usr" ++#undef CONFIG_DEBUG ++#define CONFIG_STRIP_UNWANTED_SECTIONS 1 ++#undef CONFIG_VISUAL_STUDIO_7_0 ++#undef CONFIG_VISUAL_STUDIO_8_0 ++#define CONFIG_VISUAL_STUDIO_7_0_BASE "" ++#define CONFIG_VISUAL_STUDIO_8_0_BASE "" ++#define CONFIG_EXTRA_CFLAGS_OPTIONS "-fpic" ++#define CONFIG_EXTRA_LDFLAGS_OPTIONS "" ++ ++/* ++ * SSL Library ++ */ ++#undef CONFIG_SSL_SERVER_ONLY ++#undef CONFIG_SSL_CERT_VERIFICATION ++#undef CONFIG_SSL_ENABLE_CLIENT ++#define CONFIG_SSL_FULL_MODE 1 ++#undef CONFIG_SSL_SKELETON_MODE ++#undef CONFIG_SSL_PROT_LOW ++#define CONFIG_SSL_PROT_MEDIUM 1 ++#undef CONFIG_SSL_PROT_HIGH ++#undef CONFIG_SSL_USE_DEFAULT_KEY ++#define CONFIG_SSL_PRIVATE_KEY_LOCATION "/etc/nixio/rsa_main.der" ++#define CONFIG_SSL_PRIVATE_KEY_PASSWORD "" ++#define CONFIG_SSL_X509_CERT_LOCATION "" ++#undef CONFIG_SSL_GENERATE_X509_CERT ++#define CONFIG_SSL_X509_COMMON_NAME "" ++#define CONFIG_SSL_X509_ORGANIZATION_NAME "" ++#define CONFIG_SSL_X509_ORGANIZATION_UNIT_NAME "" ++#undef CONFIG_SSL_ENABLE_V23_HANDSHAKE ++#undef CONFIG_SSL_HAS_PEM ++#undef CONFIG_SSL_USE_PKCS12 ++#define CONFIG_SSL_EXPIRY_TIME 24 ++#define CONFIG_X509_MAX_CA_CERTS 4 ++#define CONFIG_SSL_MAX_CERTS 2 ++#define CONFIG_SSL_CTX_MUTEXING 1 ++#define CONFIG_USE_DEV_URANDOM 1 ++#undef CONFIG_WIN32_USE_CRYPTO_LIB ++#undef CONFIG_OPENSSL_COMPATIBLE ++#undef CONFIG_PERFORMANCE_TESTING ++#undef CONFIG_SSL_TEST ++#undef CONFIG_AXHTTPD ++#undef CONFIG_HTTP_STATIC_BUILD ++#define CONFIG_HTTP_PORT ++#define CONFIG_HTTP_HTTPS_PORT ++#define CONFIG_HTTP_SESSION_CACHE_SIZE ++#define CONFIG_HTTP_WEBROOT "" ++#define CONFIG_HTTP_TIMEOUT ++#undef CONFIG_HTTP_HAS_CGI ++#define CONFIG_HTTP_CGI_EXTENSIONS "" ++#undef CONFIG_HTTP_ENABLE_LUA ++#define CONFIG_HTTP_LUA_PREFIX "" ++#define CONFIG_HTTP_LUA_CGI_LAUNCHER "" ++#undef CONFIG_HTTP_BUILD_LUA ++#undef CONFIG_HTTP_DIRECTORIES ++#undef CONFIG_HTTP_HAS_AUTHORIZATION ++#undef CONFIG_HTTP_HAS_IPV6 ++#undef CONFIG_HTTP_ENABLE_DIFFERENT_USER ++#define CONFIG_HTTP_USER "" ++#undef CONFIG_HTTP_VERBOSE ++#undef CONFIG_HTTP_IS_DAEMON ++ ++/* ++ * Language Bindings ++ */ ++#undef CONFIG_BINDINGS ++#undef CONFIG_CSHARP_BINDINGS ++#undef CONFIG_VBNET_BINDINGS ++#define CONFIG_DOT_NET_FRAMEWORK_BASE "" ++#undef CONFIG_JAVA_BINDINGS ++#define CONFIG_JAVA_HOME "" ++#undef CONFIG_PERL_BINDINGS ++#define CONFIG_PERL_CORE "" ++#define CONFIG_PERL_LIB "" ++#undef CONFIG_LUA_BINDINGS ++#define CONFIG_LUA_CORE "" ++ ++/* ++ * Samples ++ */ ++#undef CONFIG_SAMPLES ++#undef CONFIG_C_SAMPLES ++#undef CONFIG_CSHARP_SAMPLES ++#undef CONFIG_VBNET_SAMPLES ++#undef CONFIG_JAVA_SAMPLES ++#undef CONFIG_PERL_SAMPLES ++#undef CONFIG_LUA_SAMPLES ++ ++/* ++ * BigInt Options ++ */ ++#undef CONFIG_BIGINT_CLASSICAL ++#undef CONFIG_BIGINT_MONTGOMERY ++#define CONFIG_BIGINT_BARRETT 1 ++#define CONFIG_BIGINT_CRT 1 ++#undef CONFIG_BIGINT_KARATSUBA ++#define MUL_KARATSUBA_THRESH ++#define SQU_KARATSUBA_THRESH ++#define CONFIG_BIGINT_SLIDING_WINDOW 1 ++#define CONFIG_BIGINT_SQUARE 1 ++#undef CONFIG_BIGINT_CHECK_ON +diff --git a/feeds/luci/libs/luci-lib-nixio/axtls-root/etc/nixio/rsa_main.der b/feeds/luci/libs/luci-lib-nixio/axtls-root/etc/nixio/rsa_main.der +new file mode 100644 +index 0000000000000000000000000000000000000000..e17fdc0a0c70ea2783896858d75539f404048eb5 +GIT binary patch +literal 609 +zcmV-n0-pUaf&yIv0RRGlfdJOj{f-NB6s=ZkK6xsdxjSkca%)`@KJMk(U>WOiS|#Eb +zoAWdEN;`Dk9cL|zgXLJx;E>AL(m2eAPKsA&nS6t2IO9Qqj~%MAO&FPJUne3v)6C7X8x$f3Ls#j((1AIKfm6r=>2r<0Rlk)+8ds;3PW2BHX@!+ +z+hK(B+-P4Vyf!w#%h*Q09HYMjiPTw>^`#K{_${>*UNAhjLe-QzEC>oUjDg(3zP*dP*_& +zi#Mt6_9p@(1-mBPhHL=>Km>PKQkFe7+8AfC5;cv}sUoyUZh$#O63X*%B~P~IB8~c# +zVPqw*4(qG<0Z7UDPfU{PVAo~A%Nw}+xVzm)(E>pL>Dj&i5m%8UI~~REC*EW9J5XLU*A84D;RtmF~=XW + +literal 0 +HcmV?d00001 + +diff --git a/feeds/luci/libs/luci-lib-nixio/docsrc/CHANGELOG.lua b/feeds/luci/libs/luci-lib-nixio/docsrc/CHANGELOG.lua +new file mode 100644 +index 0000000..aa31841 +--- /dev/null ++++ b/feeds/luci/libs/luci-lib-nixio/docsrc/CHANGELOG.lua +@@ -0,0 +1,29 @@ ++--- Changes and improvements. ++module "nixio.CHANGELOG" ++ ++--- Service Release. ++--

      ++--
    • Added getifaddrs() function.
    • ++--
    • Added getsockopt(), setsockopt(), getsockname() and getpeername() ++-- directly to TLS-socket objects unifying the socket interface.
    • ++--
    • Added support for CyaSSL as cryptographical backend.
    • ++--
    • Added support for x509 certificates in DER format.
    • ++--
    • Added support for splice() in UnifiedIO.copyz().
    • ++--
    • Added interface to inject chunks into UnifiedIO.linesource() buffer.
    • ++--
    • Changed TLS behaviour to explicitely separate servers and clients.
    • ++--
    • Fixed usage of signed datatype breaking Base64 decoding.
    • ++--
    • Fixed namespace clashes for nixio.fs.
    • ++--
    • Fixed splice() support for some exotic C libraries.
    • ++--
    • Reconfigure axTLS cryptographical provider and mark it as obsolete.
    • ++--
    ++-- @class table ++-- @name 0.3 ++-- @return ! ++ ++--- Initial Release. ++--
      ++--
    • Initial Release
    • ++--
    ++-- @class table ++-- @name 0.2 ++-- @return ! +diff --git a/feeds/luci/libs/luci-lib-nixio/docsrc/README.lua b/feeds/luci/libs/luci-lib-nixio/docsrc/README.lua +new file mode 100644 +index 0000000..ee3e3a2 +--- /dev/null ++++ b/feeds/luci/libs/luci-lib-nixio/docsrc/README.lua +@@ -0,0 +1,95 @@ ++--- General Information. ++module "nixio.README" ++ ++--- General error handling information. ++--
      ++--
    • Most of the functions available in this library may fail. If any error ++-- occurs the function returns nil or false, an error code ++-- (usually errno) and an additional error message text (if avaialable).
    • ++--
    • At the moment false is only returned when a non-blocking I/O function ++-- fails with EAGAIN, EWOULDBLOCK or WSAEWOULDBLOCK for any others nil is ++-- returned as first parameter. Therefore you can use false to write portable ++-- non-blocking I/O applications.
    • ++--
    • Note that the function documentation does only mention the return values ++-- in case of a successful operation.
    • ++--
    • You can find a table of common error numbers and other useful constants ++-- like signal numbers in nixio.const e.g. nixio.const.EINVAL, ++-- nixio.const.SIGTERM, etc. For portability there is a second error constant ++-- table nixio.const_sock for socket error codes. This might ++-- be important if you are dealing with Windows applications, on POSIX however ++-- const_sock is just an alias for const.
    • ++--
    • With some exceptions - which are explicitely stated in the function ++-- documentation - all blocking functions are signal-protected and will not fail ++-- with EINTR.
    • ++--
    • On POSIX the SIGPIPE signal will be set to ignore upon initialization. ++-- You should restore the default behaviour or set a custom signal handler ++-- in your program after loading nixio if you need this behaviour.
    • ++--
    ++-- @class table ++-- @name Errorhandling ++-- @return ! ++ ++--- Function conventions. ++--
    In general all functions are namend and behave like their POSIX API ++-- counterparts - where applicable - applying the following rules: ++--
      ++--
    • Functions should be named like the underlying POSIX API function ommiting ++-- prefixes or suffixes - especially when placed in an object-context ( ++-- lockf -> File:lock, fsync -> File:sync, dup2 -> dup, ...)
    • ++--
    • If you are unclear about the behaviour of a function you should consult ++-- your OS API documentation (e.g. the manpages).
    • ++--
    • If the name is significantly different from the POSIX-function, the ++-- underlying function(s) are stated in the documentation.
    • ++--
    • Parameters should reflect those of the C-API, buffer length arguments and ++-- by-reference parameters should be ommitted for pratical purposes.
    • ++--
    • If a C function accepts a bitfield as parameter, it should be translated ++-- into lower case string flags representing the flags if the bitfield is the ++-- last parameter and also ommiting prefixes or suffixes. (e.g. waitpid ++-- (pid, &s, WNOHANG | WUNTRACED) -> waitpid(pid, "nohang", "untraced"), ++-- getsockopt(fd, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt)) -> ++-- Socket:getopt("socket", "reuseaddr"), etc.)
    • ++--
    • If it is not applicable to provide a string representation of the ++-- bitfield a bitfield generator helper is provided. It is named FUNCTION_flags. ++-- (open("/tmp/test", O_RDONLY | O_NONBLOCK) -> open("/tmp/test", open_flags( ++-- "rdonly", "nonblock")))
    • ++--
    ++-- @class table ++-- @name Functions ++-- @return ! ++ ++--- Platform information. ++--
      ++--
    • The minimum platform requirements are a decent POSIX 2001 support. ++-- Builds are more or less tested on Linux, Solaris and FreeBSD. Builds for ++-- Windows XP SP1 and later can be compiled with MinGW either from Windows ++-- itself or using the MinGW cross-compiler. Earlier versions of Windows are not ++-- supported.
    • ++--
    • In general all functions which don't have any remarks ++-- in their documentation are available on all platforms.
    • ++--
    • Functions with a (POSIX), (Linux) or similar prefix are only available ++-- on these specific platforms. Same appplies to parameters of functions ++-- with a similar suffix.
    • ++--
    • Some functions might have limitations on some platforms. This should ++-- be stated in the documentation. Please also consult your OS API ++-- documentation.
    • ++--
    ++-- @usage Tes ++-- @class table ++-- @name Platforms ++-- @return ! ++ ++--- Cryptography and TLS libraries. ++--
      ++--
    • Currently 3 underlying cryptography libraries are supported: openssl, ++-- cyassl and axTLS. The name of the library in use is written to ++-- nixio.tls_provider
    • ++--
    • You should whenever possible use openssl or cyassl as axTLS has only ++-- limited support. It does not provide support for non-blocking sockets and ++-- is probably less audited than the other ones.
    • ++--
    • As the supported Windows versions are not suitable for embedded devices ++-- axTLS is at the moment not supported on Windows.
    • ++--
    ++-- @usage Tes ++-- @class table ++-- @name TLS-Crypto ++-- @return ! +diff --git a/feeds/luci/libs/luci-lib-nixio/docsrc/nixio.CryptoHash.lua b/feeds/luci/libs/luci-lib-nixio/docsrc/nixio.CryptoHash.lua +new file mode 100644 +index 0000000..a08b48d +--- /dev/null ++++ b/feeds/luci/libs/luci-lib-nixio/docsrc/nixio.CryptoHash.lua +@@ -0,0 +1,17 @@ ++--- Cryptographical Hash and HMAC object. ++-- @cstyle instance ++module "nixio.CryptoHash" ++ ++--- Add another chunk of data to be hashed. ++-- @class function ++-- @name CryptoHash.update ++-- @param chunk Chunk of data ++-- @return CryptoHash object (self) ++ ++--- Finalize the hash and return the digest. ++-- @class function ++-- @name CryptoHash.final ++-- @usage You cannot call update on a hash object that was already finalized ++-- you can however call final multiple times to get the digest. ++-- @return hexdigest ++-- @return buffer containing binary digest +\ No newline at end of file +diff --git a/feeds/luci/libs/luci-lib-nixio/docsrc/nixio.File.lua b/feeds/luci/libs/luci-lib-nixio/docsrc/nixio.File.lua +new file mode 100644 +index 0000000..368562a +--- /dev/null ++++ b/feeds/luci/libs/luci-lib-nixio/docsrc/nixio.File.lua +@@ -0,0 +1,109 @@ ++--- Large File Object. ++-- Large file operations are supported up to 52 bits if the Lua number type is ++-- double (default). ++-- @cstyle instance ++module "nixio.File" ++ ++--- Write to the file descriptor. ++-- @class function ++-- @name File.write ++-- @usage Warning: It is not guaranteed that all data ++-- in the buffer is written at once especially when dealing with pipes. ++-- You have to check the return value - the number of bytes actually written - ++-- or use the safe IO functions in the high-level IO utility module. ++-- @usage Unlike standard Lua indexing the lowest offset and default is 0. ++-- @param buffer Buffer holding the data to be written. ++-- @param offset Offset to start reading the buffer from. (optional) ++-- @param length Length of chunk to read from the buffer. (optional) ++-- @return number of bytes written ++ ++--- Read from a file descriptor. ++-- @class function ++-- @name File.read ++-- @usage Warning: It is not guaranteed that all requested data ++-- is read at once especially when dealing with pipes. ++-- You have to check the return value - the length of the buffer actually read - ++-- or use the safe IO functions in the high-level IO utility module. ++-- @usage The length of the return buffer is limited by the (compile time) ++-- nixio buffersize which is nixio.const.buffersize (8192 by default). ++-- Any read request greater than that will be safely truncated to this value. ++-- @param length Amount of data to read (in Bytes). ++-- @return buffer containing data successfully read ++ ++--- Reposition read / write offset of the file descriptor. ++-- The seek will be done either from the beginning of the file or relative ++-- to the current position or relative to the end. ++-- @class function ++-- @name File.seek ++-- @usage This function calls lseek(). ++-- @param offset File Offset ++-- @param whence Starting point ["set", "cur", "end"] ++-- @return new (absolute) offset position ++ ++--- Return the current read / write offset of the file descriptor. ++-- @class function ++-- @name File.tell ++-- @usage This function calls lseek() with offset 0 from the current position. ++-- @return offset position ++ ++--- Synchronizes the file with the storage device. ++-- Returns when the file is successfully written to the disk. ++-- @class function ++-- @name File.sync ++-- @usage This function calls fsync() when data_only equals false ++-- otherwise fdatasync(), on Windows _commit() is used instead. ++-- @usage fdatasync() is only supported by Linux and Solaris. For other systems ++-- the data_only parameter is ignored and fsync() is always called. ++-- @param data_only Do not synchronize the metadata. (optional, boolean) ++-- @return true ++ ++--- Apply or test a lock on the file. ++-- @class function ++-- @name File.lock ++-- @usage This function calls lockf() on POSIX and _locking() on Windows. ++-- @usage The "lock" command is blocking, "tlock" is non-blocking, ++-- "ulock" unlocks and "test" only tests for the lock. ++-- @usage The "test" command is not available on Windows. ++-- @usage Locks are by default advisory on POSIX, but mandatory on Windows. ++-- @param command Locking Command ["lock", "tlock", "ulock", "test"] ++-- @param length Amount of Bytes to lock from current offset (optional) ++-- @return true ++ ++--- Get file status and attributes. ++-- @class function ++-- @name File.stat ++-- @param field Only return a specific field, not the whole table (optional) ++-- @usage This function calls fstat(). ++-- @return Table containing:
      ++--
    • atime = Last access timestamp
    • ++--
    • blksize = Blocksize (POSIX only)
    • ++--
    • blocks = Blocks used (POSIX only)
    • ++--
    • ctime = Creation timestamp
    • ++--
    • dev = Device ID
    • ++--
    • gid = Group ID
    • ++--
    • ino = Inode
    • ++--
    • modedec = Mode converted into a decimal number
    • ++--
    • modestr = Mode as string as returned by `ls -l`
    • ++--
    • mtime = Last modification timestamp
    • ++--
    • nlink = Number of links
    • ++--
    • rdev = Device ID (if special file)
    • ++--
    • size = Size in bytes
    • ++--
    • type = ["reg", "dir", "chr", "blk", "fifo", "lnk", "sock"]
    • ++--
    • uid = User ID
    • ++--
    ++ ++--- Close the file descriptor. ++-- @class function ++-- @name File.close ++-- @return true ++ ++--- Get the number of the filedescriptor. ++-- @class function ++-- @name File.fileno ++-- @return file descriptor number ++ ++--- (POSIX) Set the blocking mode of the file descriptor. ++-- @class function ++-- @name File.setblocking ++-- @param blocking (boolean) ++-- @return true +\ No newline at end of file +diff --git a/feeds/luci/libs/luci-lib-nixio/docsrc/nixio.Socket.lua b/feeds/luci/libs/luci-lib-nixio/docsrc/nixio.Socket.lua +new file mode 100644 +index 0000000..7123393 +--- /dev/null ++++ b/feeds/luci/libs/luci-lib-nixio/docsrc/nixio.Socket.lua +@@ -0,0 +1,170 @@ ++--- Socket Object. ++-- Supports IPv4, IPv6 and UNIX (POSIX only) families. ++-- @cstyle instance ++module "nixio.Socket" ++ ++--- Get the local address of a socket. ++-- @class function ++-- @name Socket.getsockname ++-- @return IP-Address ++-- @return Port ++ ++--- Get the peer address of a socket. ++-- @class function ++-- @name Socket.getpeername ++-- @return IP-Address ++-- @return Port ++ ++--- Bind the socket to a network address. ++-- @class function ++-- @name Socket.bind ++-- @usage This function calls getaddrinfo() and bind() but NOT listen(). ++-- @usage If host is a domain name it will be looked up and bind() ++-- tries the IP-Addresses in the order returned by the DNS resolver ++-- until the bind succeeds. ++-- @usage UNIX sockets ignore the port, ++-- and interpret host as a socket path. ++-- @param host Host (optional, default: all addresses) ++-- @param port Port or service description ++-- @return true ++ ++--- Connect the socket to a network address. ++-- @class function ++-- @name Socket.connect ++-- @usage This function calls getaddrinfo() and connect(). ++-- @usage If host is a domain name it will be looked up and connect() ++-- tries the IP-Addresses in the order returned by the DNS resolver ++-- until the connect succeeds. ++-- @usage UNIX sockets ignore the port, ++-- and interpret host as a socket path. ++-- @param host Hostname or IP-Address (optional, default: localhost) ++-- @param port Port or service description ++-- @return true ++ ++--- Listen for connections on the socket. ++-- @class function ++-- @name Socket.listen ++-- @param backlog Length of queue for pending connections ++-- @return true ++ ++--- Accept a connection on the socket. ++-- @class function ++-- @name Socket.accept ++-- @return Socket Object ++-- @return Peer IP-Address ++-- @return Peer Port ++ ++--- Send a message on the socket specifying the destination. ++-- @class function ++-- @name Socket.sendto ++-- @usage Warning: It is not guaranteed that all data ++-- in the buffer is written at once. ++-- You have to check the return value - the number of bytes actually written - ++-- or use the safe IO functions in the high-level IO utility module. ++-- @usage Unlike standard Lua indexing the lowest offset and default is 0. ++-- @param buffer Buffer holding the data to be written. ++-- @param host Target IP-Address ++-- @param port Target Port ++-- @param offset Offset to start reading the buffer from. (optional) ++-- @param length Length of chunk to read from the buffer. (optional) ++-- @return number of bytes written ++ ++--- Send a message on the socket. ++-- This function is identical to sendto except for the missing destination ++-- paramters. See the sendto description for a detailed description. ++-- @class function ++-- @name Socket.send ++-- @param buffer Buffer holding the data to be written. ++-- @param offset Offset to start reading the buffer from. (optional) ++-- @param length Length of chunk to read from the buffer. (optional) ++-- @see Socket.sendto ++-- @return number of bytes written ++ ++--- Send a message on the socket (This is an alias for send). ++-- See the sendto description for a detailed description. ++-- @class function ++-- @name Socket.write ++-- @param buffer Buffer holding the data to be written. ++-- @param offset Offset to start reading the buffer from. (optional) ++-- @param length Length of chunk to read from the buffer. (optional) ++-- @see Socket.sendto ++-- @return number of bytes written ++ ++--- Receive a message on the socket including the senders source address. ++-- @class function ++-- @name Socket.recvfrom ++-- @usage Warning: It is not guaranteed that all requested data ++-- is read at once. ++-- You have to check the return value - the length of the buffer actually read - ++-- or use the safe IO functions in the high-level IO utility module. ++-- @usage The length of the return buffer is limited by the (compile time) ++-- nixio buffersize which is nixio.const.buffersize (8192 by default). ++-- Any read request greater than that will be safely truncated to this value. ++-- @param length Amount of data to read (in Bytes). ++-- @return buffer containing data successfully read ++-- @return host IP-Address of the sender ++-- @return port Port of the sender ++ ++--- Receive a message on the socket. ++-- This function is identical to recvfrom except that it does not return ++-- the sender's source address. See the recvfrom description for more details. ++-- @class function ++-- @name Socket.recv ++-- @param length Amount of data to read (in Bytes). ++-- @see Socket.recvfrom ++-- @return buffer containing data successfully read ++ ++--- Receive a message on the socket (This is an alias for recv). ++-- See the recvfrom description for more details. ++-- @class function ++-- @name Socket.read ++-- @param length Amount of data to read (in Bytes). ++-- @see Socket.recvfrom ++-- @return buffer containing data successfully read ++ ++--- Close the socket. ++-- @class function ++-- @name Socket.close ++-- @return true ++ ++--- Shut down part of a full-duplex connection. ++-- @class function ++-- @name Socket.shutdown ++-- @param how (optional, default: rdwr) ["rdwr", "rd", "wr"] ++-- @return true ++ ++--- Get the number of the filedescriptor. ++-- @class function ++-- @name Socket.fileno ++-- @return file descriptor number ++ ++--- Set the blocking mode of the socket. ++-- @class function ++-- @name Socket.setblocking ++-- @param blocking (boolean) ++-- @return true ++ ++--- Set a socket option. ++-- @class function ++-- @name Socket.setopt ++-- @param level Level ["socket", "tcp", "ip", "ipv6"] ++-- @param option Option ["keepalive", "reuseaddr", "sndbuf", "rcvbuf", ++-- "priority", "broadcast", "linger", "sndtimeo", "rcvtimeo", "dontroute", ++-- "bindtodevice", "error", "oobinline", "cork" (TCP), "nodelay" (TCP), ++-- "mtu" (IP, IPv6), "hdrincl" (IP), "multicast_ttl" (IP), "multicast_loop" ++-- (IP, IPv6), "multicast_if" (IP, IPv6), "v6only" (IPv6), "multicast_hops" ++-- (IPv6), "add_membership" (IP, IPv6), "drop_membership" (IP, IPv6)] ++-- @param value Value ++-- @return true ++ ++--- Get a socket option. ++-- @class function ++-- @name Socket.getopt ++-- @param level Level ["socket", "tcp", "ip", "ipv6"] ++-- @param option Option ["keepalive", "reuseaddr", "sndbuf", "rcvbuf", ++-- "priority", "broadcast", "linger", "sndtimeo", "rcvtimeo", "dontroute", ++-- "bindtodevice", "error", "oobinline", "cork" (TCP), "nodelay" (TCP), ++-- "mtu" (IP, IPv6), "hdrincl" (IP), "multicast_ttl" (IP), "multicast_loop" ++-- (IP, IPv6), "multicast_if" (IP, IPv6), "v6only" (IPv6), "multicast_hops" ++-- (IPv6), "add_membership" (IP, IPv6), "drop_membership" (IP, IPv6)] ++-- @return Value +\ No newline at end of file +diff --git a/feeds/luci/libs/luci-lib-nixio/docsrc/nixio.TLSContext.lua b/feeds/luci/libs/luci-lib-nixio/docsrc/nixio.TLSContext.lua +new file mode 100644 +index 0000000..7cc0711 +--- /dev/null ++++ b/feeds/luci/libs/luci-lib-nixio/docsrc/nixio.TLSContext.lua +@@ -0,0 +1,46 @@ ++--- Transport Layer Security Context Object. ++-- @cstyle instance ++module "nixio.TLSContext" ++ ++--- Create a TLS Socket from a socket descriptor. ++-- @class function ++-- @name TLSContext.create ++-- @param socket Socket Object ++-- @return TLSSocket Object ++ ++--- Assign a PEM certificate to this context. ++-- @class function ++-- @name TLSContext.set_cert ++-- @usage This function calls SSL_CTX_use_certificate_chain_file(). ++-- @param path Certificate File path ++-- @return true ++ ++--- Assign a PEM private key to this context. ++-- @class function ++-- @name TLSContext.set_key ++-- @usage This function calls SSL_CTX_use_PrivateKey_file(). ++-- @param path Private Key File path ++-- @return true ++ ++--- Set the available ciphers for this context. ++-- @class function ++-- @name TLSContext.set_ciphers ++-- @usage This function calls SSL_CTX_set_cipher_list(). ++-- @param cipherlist String containing a list of ciphers ++-- @return true ++ ++--- Set the verification depth of this context. ++-- @class function ++-- @name TLSContext.set_verify_depth ++-- @usage This function calls SSL_CTX_set_verify_depth(). ++-- @param depth Depth ++-- @return true ++ ++--- Set the verification flags of this context. ++-- @class function ++-- @name TLSContext.set_verify ++-- @usage This function calls SSL_CTX_set_verify(). ++-- @param flag1 First Flag ["none", "peer", "verify_fail_if_no_peer_cert", ++-- "client_once"] ++-- @param ... More Flags [-"-] ++-- @return true +\ No newline at end of file +diff --git a/feeds/luci/libs/luci-lib-nixio/docsrc/nixio.TLSSocket.lua b/feeds/luci/libs/luci-lib-nixio/docsrc/nixio.TLSSocket.lua +new file mode 100644 +index 0000000..b932cde +--- /dev/null ++++ b/feeds/luci/libs/luci-lib-nixio/docsrc/nixio.TLSSocket.lua +@@ -0,0 +1,73 @@ ++--- TLS Socket Object. ++-- TLS Sockets contain the underlying socket and context in the fields ++-- "socket" and "context". ++-- @cstyle instance ++module "nixio.TLSSocket" ++ ++--- Initiate the TLS handshake as client with the server. ++-- @class function ++-- @name TLSSocket.connect ++-- @usage This function calls SSL_connect(). ++-- @usage You have to call either connect or accept before transmitting data. ++-- @see TLSSocket.accept ++-- @return true ++ ++--- Wait for a TLS handshake from a client. ++-- @class function ++-- @name TLSSocket.accept ++-- @usage This function calls SSL_accept(). ++-- @usage You have to call either connect or accept before transmitting data. ++-- @see TLSSocket.connect ++-- @return true ++ ++--- Send a message to the socket. ++-- @class function ++-- @name TLSSocket.send ++-- @usage This function calls SSL_write(). ++-- @usage Warning: It is not guaranteed that all data ++-- in the buffer is written at once. ++-- You have to check the return value - the number of bytes actually written - ++-- or use the safe IO functions in the high-level IO utility module. ++-- @usage Unlike standard Lua indexing the lowest offset and default is 0. ++-- @param buffer Buffer holding the data to be written. ++-- @param offset Offset to start reading the buffer from. (optional) ++-- @param length Length of chunk to read from the buffer. (optional) ++-- @return number of bytes written ++ ++--- Send a message on the socket (This is an alias for send). ++-- See the send description for a detailed description. ++-- @class function ++-- @name TLSSocket.write ++-- @param buffer Buffer holding the data to be written. ++-- @param offset Offset to start reading the buffer from. (optional) ++-- @param length Length of chunk to read from the buffer. (optional) ++-- @see TLSSocket.send ++-- @return number of bytes written ++ ++--- Receive a message on the socket. ++-- @class function ++-- @name TLSSocket.recv ++-- @usage This function calls SSL_read(). ++-- @usage Warning: It is not guaranteed that all requested data ++-- is read at once. ++-- You have to check the return value - the length of the buffer actually read - ++-- or use the safe IO functions in the high-level IO utility module. ++-- @usage The length of the return buffer is limited by the (compile time) ++-- nixio buffersize which is nixio.const.buffersize (8192 by default). ++-- Any read request greater than that will be safely truncated to this value. ++-- @param length Amount of data to read (in Bytes). ++-- @return buffer containing data successfully read ++ ++--- Receive a message on the socket (This is an alias for recv). ++-- See the recv description for more details. ++-- @class function ++-- @name TLSSocket.read ++-- @param length Amount of data to read (in Bytes). ++-- @see TLSSocket.recv ++-- @return buffer containing data successfully read ++ ++--- Shut down the TLS connection. ++-- @class function ++-- @name TLSSocket.shutdown ++-- @usage This function calls SSL_shutdown(). ++-- @return true +\ No newline at end of file +diff --git a/feeds/luci/libs/luci-lib-nixio/docsrc/nixio.UnifiedIO.lua b/feeds/luci/libs/luci-lib-nixio/docsrc/nixio.UnifiedIO.lua +new file mode 100644 +index 0000000..6e407ff +--- /dev/null ++++ b/feeds/luci/libs/luci-lib-nixio/docsrc/nixio.UnifiedIO.lua +@@ -0,0 +1,129 @@ ++--- Unified high-level I/O utility API for Files, Sockets and TLS-Sockets. ++-- These functions are added to the object function tables by doing ++-- require "nixio.util", can be used on all nixio IO Descriptors and ++-- are based on the shared low-level read() and write() functions. ++-- @cstyle instance ++module "nixio.UnifiedIO" ++ ++--- Test whether the I/O-Descriptor is a socket. ++-- @class function ++-- @name UnifiedIO.is_socket ++-- @return boolean ++ ++--- Test whether the I/O-Descriptor is a TLS socket. ++-- @class function ++-- @name UnifiedIO.is_tls_socket ++-- @return boolean ++ ++--- Test whether the I/O-Descriptor is a file. ++-- @class function ++-- @name UnifiedIO.is_file ++-- @return boolean ++ ++--- Read a block of data and wait until all data is available. ++-- @class function ++-- @name UnifiedIO.readall ++-- @usage This function uses the low-level read function of the descriptor. ++-- @usage If the length parameter is ommited, this function returns all data ++-- that can be read before an end-of-file, end-of-stream, connection shutdown ++-- or similar happens. ++-- @usage If the descriptor is non-blocking this function may fail with EAGAIN. ++-- @param length Bytes to read (optional) ++-- @return data that was successfully read if no error occured ++-- @return - reserved for error code - ++-- @return - reserved for error message - ++-- @return data that was successfully read even if an error occured ++ ++--- Write a block of data and wait until all data is written. ++-- @class function ++-- @name UnifiedIO.writeall ++-- @usage This function uses the low-level write function of the descriptor. ++-- @usage If the descriptor is non-blocking this function may fail with EAGAIN. ++-- @param block Bytes to write ++-- @return bytes that were successfully written if no error occured ++-- @return - reserved for error code - ++-- @return - reserved for error message - ++-- @return bytes that were successfully written even if an error occured ++ ++--- Create a line-based iterator. ++-- Lines may end with either \n or \r\n, these control chars are not included ++-- in the return value. ++-- @class function ++-- @name UnifiedIO.linesource ++-- @usage This function uses the low-level read function of the descriptor. ++-- @usage Note: This function uses an internal buffer to read ++-- ahead. Do NOT mix calls to read(all) and the returned iterator. If you want ++-- to stop reading line-based and want to use the read(all) functions instead ++-- you can pass "true" to the iterator which will flush the buffer ++-- and return the bufferd data. ++-- @usage If the limit parameter is ommited, this function uses the nixio ++-- buffersize (8192B by default). ++-- @usage If the descriptor is non-blocking the iterator may fail with EAGAIN. ++-- @usage The iterator can be used as an LTN12 source. ++-- @param limit Line limit ++-- @return Line-based Iterator ++ ++--- Create a block-based iterator. ++-- @class function ++-- @name UnifiedIO.blocksource ++-- @usage This function uses the low-level read function of the descriptor. ++-- @usage The blocksize given is only advisory and to be seen as an upper limit, ++-- if an underlying read returns less bytes the chunk is nevertheless returned. ++-- @usage If the limit parameter is ommited, the iterator returns data ++-- until an end-of-file, end-of-stream, connection shutdown or similar happens. ++-- @usage The iterator will not buffer so it is safe to mix with calls to read. ++-- @usage If the descriptor is non-blocking the iterator may fail with EAGAIN. ++-- @usage The iterator can be used as an LTN12 source. ++-- @param blocksize Advisory blocksize (optional) ++-- @param limit Amount of data to consume (optional) ++-- @return Block-based Iterator ++ ++--- Create a sink. ++-- This sink will simply write all data that it receives and optionally ++-- close the descriptor afterwards. ++-- @class function ++-- @name UnifiedIO.sink ++-- @usage This function uses the writeall function of the descriptor. ++-- @usage If the descriptor is non-blocking the sink may fail with EAGAIN. ++-- @usage The iterator can be used as an LTN12 sink. ++-- @param close_when_done (optional, boolean) ++-- @return Sink ++ ++--- Copy data from the current descriptor to another one. ++-- @class function ++-- @name UnifiedIO.copy ++-- @usage This function uses the blocksource function of the source descriptor ++-- and the sink function of the target descriptor. ++-- @usage If the limit parameter is ommited, data is copied ++-- until an end-of-file, end-of-stream, connection shutdown or similar happens. ++-- @usage If the descriptor is non-blocking the function may fail with EAGAIN. ++-- @param fdout Target Descriptor ++-- @param size Bytes to copy (optional) ++-- @return bytes that were successfully written if no error occured ++-- @return - reserved for error code - ++-- @return - reserved for error message - ++-- @return bytes that were successfully written even if an error occured ++ ++--- Copy data from the current descriptor to another one using kernel-space ++-- copying if possible. ++-- @class function ++-- @name UnifiedIO.copyz ++-- @usage This function uses the sendfile() syscall to copy the data or the ++-- blocksource function of the source descriptor and the sink function ++-- of the target descriptor as a fallback mechanism. ++-- @usage If the limit parameter is ommited, data is copied ++-- until an end-of-file, end-of-stream, connection shutdown or similar happens. ++-- @usage If the descriptor is non-blocking the function may fail with EAGAIN. ++-- @param fdout Target Descriptor ++-- @param size Bytes to copy (optional) ++-- @return bytes that were successfully written if no error occured ++-- @return - reserved for error code - ++-- @return - reserved for error message - ++-- @return bytes that were successfully written even if an error occured ++ ++--- Close the descriptor. ++-- @class function ++-- @name UnifiedIO.close ++-- @usage If the descriptor is a TLS-socket the underlying descriptor is ++-- closed without touching the TLS connection. ++-- @return true +\ No newline at end of file +diff --git a/feeds/luci/libs/luci-lib-nixio/docsrc/nixio.bin.lua b/feeds/luci/libs/luci-lib-nixio/docsrc/nixio.bin.lua +new file mode 100644 +index 0000000..13e125d +--- /dev/null ++++ b/feeds/luci/libs/luci-lib-nixio/docsrc/nixio.bin.lua +@@ -0,0 +1,33 @@ ++--- Binary operations and conversion. ++module "nixio.bin" ++ ++--- Return a hexadecimal ASCII represantation of the content of a buffer. ++-- @class function ++-- @name hexlify ++-- @param buffer Buffer ++-- @return representation using characters [0-9a-f] ++ ++--- Return a binary buffer from a hexadecimal ASCII representation. ++-- @class function ++-- @name unhexlify ++-- @param hexvalue representation using characters [0-9a-f] ++-- @return binary data ++ ++--- Calculate the CRC32 value of a buffer. ++-- @class function ++-- @name crc32 ++-- @param buffer Buffer ++-- @param initial Initial CRC32 value (optional) ++-- @return crc32 value ++ ++--- Base64 encode a given buffer. ++-- @class function ++-- @name b64encode ++-- @param buffer Buffer ++-- @return base64 encoded buffer ++ ++--- Base64 decode a given buffer. ++-- @class function ++-- @name b64decode ++-- @param buffer Base 64 Encoded data ++-- @return binary data +\ No newline at end of file +diff --git a/feeds/luci/libs/luci-lib-nixio/docsrc/nixio.bit.lua b/feeds/luci/libs/luci-lib-nixio/docsrc/nixio.bit.lua +new file mode 100644 +index 0000000..6951dd5 +--- /dev/null ++++ b/feeds/luci/libs/luci-lib-nixio/docsrc/nixio.bit.lua +@@ -0,0 +1,92 @@ ++--- Bitfield operators and mainpulation functions. ++-- Can be used as a drop-in replacement for bitlib. ++module "nixio.bit" ++ ++--- Bitwise OR several numbers. ++-- @class function ++-- @name bor ++-- @param oper1 First Operand ++-- @param oper2 Second Operand ++-- @param ... More Operands ++-- @return number ++ ++--- Invert given number. ++-- @class function ++-- @name bnot ++-- @param oper Operand ++-- @return number ++ ++--- Bitwise AND several numbers. ++-- @class function ++-- @name band ++-- @param oper1 First Operand ++-- @param oper2 Second Operand ++-- @param ... More Operands ++-- @return number ++ ++--- Bitwise XOR several numbers. ++-- @class function ++-- @name bxor ++-- @param oper1 First Operand ++-- @param oper2 Second Operand ++-- @param ... More Operands ++-- @return number ++ ++--- Left shift a number. ++-- @class function ++-- @name lshift ++-- @param oper number ++-- @param shift bits to shift ++-- @return number ++ ++--- Right shift a number. ++-- @class function ++-- @name rshift ++-- @param oper number ++-- @param shift bits to shift ++-- @return number ++ ++--- Arithmetically right shift a number. ++-- @class function ++-- @name arshift ++-- @param oper number ++-- @param shift bits to shift ++-- @return number ++ ++--- Integer division of 2 or more numbers. ++-- @class function ++-- @name div ++-- @param oper1 Operand 1 ++-- @param oper2 Operand 2 ++-- @param ... More Operands ++-- @return number ++ ++--- Cast a number to the bit-operating range. ++-- @class function ++-- @name cast ++-- @param oper number ++-- @return number ++ ++--- Sets one or more flags of a bitfield. ++-- @class function ++-- @name set ++-- @param bitfield Bitfield ++-- @param flag1 First Flag ++-- @param ... More Flags ++-- @return altered bitfield ++ ++--- Unsets one or more flags of a bitfield. ++-- @class function ++-- @name unset ++-- @param bitfield Bitfield ++-- @param flag1 First Flag ++-- @param ... More Flags ++-- @return altered bitfield ++ ++--- Checks whether given flags are set in a bitfield. ++-- @class function ++-- @name check ++-- @param bitfield Bitfield ++-- @param flag1 First Flag ++-- @param ... More Flags ++-- @return true when all flags are set, otherwise false +\ No newline at end of file +diff --git a/feeds/luci/libs/luci-lib-nixio/docsrc/nixio.crypto.lua b/feeds/luci/libs/luci-lib-nixio/docsrc/nixio.crypto.lua +new file mode 100644 +index 0000000..158d0fc +--- /dev/null ++++ b/feeds/luci/libs/luci-lib-nixio/docsrc/nixio.crypto.lua +@@ -0,0 +1,15 @@ ++--- Cryptographical library. ++module "nixio.crypto" ++ ++--- Create a hash object. ++-- @class function ++-- @name nixio.crypto.hash ++-- @param algo Algorithm ["sha1", "md5"] ++-- @return CryptoHash Object ++ ++--- Create a HMAC object. ++-- @class function ++-- @name nixio.crypto.hmac ++-- @param algo Algorithm ["sha1", "md5"] ++-- @param key HMAC-Key ++-- @return CryptoHash Object +\ No newline at end of file +diff --git a/feeds/luci/libs/luci-lib-nixio/docsrc/nixio.fs.lua b/feeds/luci/libs/luci-lib-nixio/docsrc/nixio.fs.lua +new file mode 100644 +index 0000000..5d08719 +--- /dev/null ++++ b/feeds/luci/libs/luci-lib-nixio/docsrc/nixio.fs.lua +@@ -0,0 +1,265 @@ ++--- Low-level and high-level filesystem manipulation library. ++module "nixio.fs" ++ ++ ++--- Check user's permission on a file. ++-- @class function ++-- @name nixio.fs.access ++-- @param path Path ++-- @param mode1 First Mode to check ["f", "r", "w", "x"] ++-- @param ... More Modes to check [-"-] ++-- @return true ++ ++--- Strip the directory part from a path. ++-- @class function ++-- @name nixio.fs.basename ++-- @usage This function cannot fail and will never return nil. ++-- @param path Path ++-- @return basename ++ ++--- Strip the base from a path. ++-- @class function ++-- @name nixio.fs.dirname ++-- @usage This function cannot fail and will never return nil. ++-- @param path Path ++-- @return dirname ++ ++--- Return the cannonicalized absolute pathname. ++-- @class function ++-- @name nixio.fs.realpath ++-- @param path Path ++-- @return absolute path ++ ++--- Remove a file or directory. ++-- @class function ++-- @name nixio.fs.remove ++-- @param path Path ++-- @return true ++ ++--- Delete a name and - if no links are left - the associated file. ++-- @class function ++-- @name nixio.fs.unlink ++-- @param path Path ++-- @return true ++ ++--- Renames a file or directory. ++-- @class function ++-- @name nixio.fs.rename ++-- @param src Source path ++-- @param dest Destination path ++-- @usage It is normally not possible to rename files accross fileystems. ++-- @return true ++ ++--- Remove an empty directory. ++-- @class function ++-- @name nixio.fs.rmdir ++-- @param path Path ++-- @return true ++ ++--- Create a new directory. ++-- @class function ++-- @name nixio.fs.mkdir ++-- @param path Path ++-- @param mode File mode (optional, see chmod and umask) ++-- @see nixio.fs.chmod ++-- @see nixio.umask ++-- @return true ++ ++--- Change the file mode. ++-- @class function ++-- @name nixio.fs.chmod ++-- @usage Windows only supports setting the write-protection through the ++-- "Writable to others" bit. ++-- @usage Notice: The mode-flag for the functions ++-- open, mkdir, mkfifo are affected by the umask. ++-- @param path Path ++-- @param mode File mode ++-- [decimal mode number, "[-r][-w][-xsS][-r][-w][-xsS][-r][-w][-xtT]"] ++-- @see nixio.umask ++-- @return true ++ ++--- Iterate over the entries of a directory. ++-- @class function ++-- @name nixio.fs.dir ++-- @usage The special entries "." and ".." are omitted. ++-- @param path Path ++-- @return directory iterator returning one entry per call ++ ++--- Create a hard link. ++-- @class function ++-- @name nixio.fs.link ++-- @usage This function calls link() on POSIX and CreateHardLink() on Windows. ++-- @param oldpath Path ++-- @param newpath Path ++-- @return true ++ ++--- Change file last access and last modification time. ++-- @class function ++-- @name nixio.fs.utimes ++-- @param path Path ++-- @param actime Last access timestamp (optional, default: current time) ++-- @param mtime Last modification timestamp (optional, default: actime) ++-- @return true ++ ++--- Get file status and attributes. ++-- @class function ++-- @name nixio.fs.stat ++-- @param path Path ++-- @param field Only return a specific field, not the whole table (optional) ++-- @return Table containing:
      ++--
    • atime = Last access timestamp
    • ++--
    • blksize = Blocksize (POSIX only)
    • ++--
    • blocks = Blocks used (POSIX only)
    • ++--
    • ctime = Creation timestamp
    • ++--
    • dev = Device ID
    • ++--
    • gid = Group ID
    • ++--
    • ino = Inode
    • ++--
    • modedec = Mode converted into a decimal number
    • ++--
    • modestr = Mode as string as returned by `ls -l`
    • ++--
    • mtime = Last modification timestamp
    • ++--
    • nlink = Number of links
    • ++--
    • rdev = Device ID (if special file)
    • ++--
    • size = Size in bytes
    • ++--
    • type = ["reg", "dir", "chr", "blk", "fifo", "lnk", "sock"]
    • ++--
    • uid = User ID
    • ++--
    ++ ++--- Get file status and attributes and do not resolve if target is a symlink. ++-- @class function ++-- @name nixio.fs.lstat ++-- @param path Path ++-- @param field Only return a specific field, not the whole table (optional) ++-- @see nixio.fs.stat ++-- @return Table containing attributes (see stat for a detailed description) ++ ++--- (POSIX) Change owner and group of a file. ++-- @class function ++-- @name nixio.fs.chown ++-- @param path Path ++-- @param user User ID or Username (optional) ++-- @param group Group ID or Groupname (optional) ++-- @return true ++ ++--- (POSIX) Change owner and group of a file and do not resolve ++-- if target is a symlink. ++-- @class function ++-- @name nixio.fs.lchown ++-- @param path Path ++-- @param user User ID or Username (optional) ++-- @param group Group ID or Groupname (optional) ++-- @return true ++ ++--- (POSIX) Create a FIFO (named pipe). ++-- @class function ++-- @name nixio.fs.mkfifo ++-- @param path Path ++-- @param mode File mode (optional, see chmod and umask) ++-- @see nixio.fs.chmod ++-- @see nixio.umask ++-- @return true ++ ++--- (POSIX) Create a symbolic link. ++-- @class function ++-- @name nixio.fs.symlink ++-- @param oldpath Path ++-- @param newpath Path ++-- @return true ++ ++--- (POSIX) Read the target of a symbolic link. ++-- @class function ++-- @name nixio.fs.readlink ++-- @param path Path ++-- @return target path ++ ++--- (POSIX) Find pathnames matching a pattern. ++-- @class function ++-- @name nixio.fs.glob ++-- @param pattern Pattern ++-- @return path iterator ++-- @return number of matches ++ ++--- (POSIX) Get filesystem statistics. ++-- @class function ++-- @name nixio.fs.statvfs ++-- @param path Path to any file within the filesystem. ++-- @return Table containing:
      ++--
    • bavail = available blocks
    • ++--
    • bfree = free blocks
    • ++--
    • blocks = number of fragments
    • ++--
    • frsize = fragment size
    • ++--
    • favail = available inodes
    • ++--
    • ffree = free inodes
    • ++--
    • files = inodes
    • ++--
    • flag = flags
    • ++--
    • fsid = filesystem ID
    • ++--
    • namemax = maximum filename length
    • ++--
    ++ ++--- Read the contents of a file into a buffer. ++-- @class function ++-- @name nixio.fs.readfile ++-- @param path Path ++-- @param limit Maximum bytes to read (optional) ++-- @return file contents ++ ++--- Write a buffer into a file truncating the file first. ++-- @class function ++-- @name nixio.fs.writefile ++-- @param path Path ++-- @param data Data to write ++-- @return true ++ ++--- Copy data between files. ++-- @class function ++-- @name nixio.fs.datacopy ++-- @param src Source file path ++-- @param dest Destination file path ++-- @param limit Maximum bytes to copy (optional) ++-- @return true ++ ++--- Copy a file, directory or symlink non-recursively preserving file mode, ++-- timestamps, owner and group. ++-- @class function ++-- @name nixio.fs.copy ++-- @usage The destination must always be a full destination path e.g. do not ++-- omit the basename even if source and destination basename are equal. ++-- @param src Source path ++-- @param dest Destination path ++-- @return true ++ ++--- Rename a file, directory or symlink non-recursively across filesystems. ++-- @class function ++-- @name nixio.fs.move ++-- @usage The destination must always be a full destination path e.g. do not ++-- omit the basename even if source and destination basename are equal. ++-- @param src Source path ++-- @param dest Destination path ++-- @return true ++ ++--- Create a directory and all needed parent directories recursively. ++-- @class function ++-- @name nixio.fs.mkdirr ++-- @param dest Destination path ++-- @param mode File mode (optional, see chmod and umask) ++-- @see nixio.fs.chmod ++-- @see nixio.umask ++-- @return true ++ ++--- Rename a file, directory or symlink recursively across filesystems. ++-- @class function ++-- @name nixio.fs.mover ++-- @usage The destination must always be a full destination path e.g. do not ++-- omit the basename even if source and destination basename are equal. ++-- @param src Source path ++-- @param dest Destination path ++-- @return true ++ ++--- Copy a file, directory or symlink recursively preserving file mode, ++-- timestamps, owner and group. ++-- @class function ++-- @name nixio.fs.copyr ++-- @usage The destination must always be a full destination path e.g. do not ++-- omit the basename even if source and destination basename are equal. ++-- @param src Source path ++-- @param dest Destination path ++-- @return true +\ No newline at end of file +diff --git a/feeds/luci/libs/luci-lib-nixio/docsrc/nixio.lua b/feeds/luci/libs/luci-lib-nixio/docsrc/nixio.lua +new file mode 100644 +index 0000000..1b434d7 +--- /dev/null ++++ b/feeds/luci/libs/luci-lib-nixio/docsrc/nixio.lua +@@ -0,0 +1,467 @@ ++--- General POSIX IO library. ++module "nixio" ++ ++--- Look up a hostname and service via DNS. ++-- @class function ++-- @name nixio.getaddrinfo ++-- @param host hostname to lookup (optional) ++-- @param family address family ["any", "inet", "inet6"] ++-- @param service service name or port (optional) ++-- @return Table containing one or more tables containing:
      ++--
    • family = ["inet", "inet6"]
    • ++--
    • socktype = ["stream", "dgram", "raw"]
    • ++--
    • address = Resolved IP-Address
    • ++--
    • port = Resolved Port (if service was given)
    • ++--
    ++ ++--- Reverse look up an IP-Address via DNS. ++-- @class function ++-- @name nixio.getnameinfo ++-- @param ipaddr IPv4 or IPv6-Address ++-- @return FQDN ++ ++--- (Linux, BSD) Get a list of available network interfaces and their addresses. ++-- @class function ++-- @name nixio.getifaddrs ++-- @return Table containing one or more tables containing:
      ++--
    • name = Interface Name
    • ++--
    • family = ["inet", "inet6", "packet"]
    • ++--
    • addr = Interface Address (IPv4, IPv6, MAC, ...)
    • ++--
    • broadaddr = Broadcast Address
    • ++--
    • dstaddr = Destination Address (Point-to-Point)
    • ++--
    • netmask = Netmask (if available)
    • ++--
    • prefix = Prefix (if available)
    • ++--
    • flags = Table of interface flags (up, multicast, loopback, ...)
    • ++--
    • data = Statistics (Linux, "packet"-family)
    • ++--
    • hatype = Hardware Type Identifier (Linix, "packet"-family)
    • ++--
    • ifindex = Interface Index (Linux, "packet"-family)
    • ++--
    ++ ++--- Get protocol entry by name. ++-- @usage This function returns nil if the given protocol is unknown. ++-- @class function ++-- @name nixio.getprotobyname ++-- @param name protocol name to lookup ++-- @return Table containing the following fields:
      ++--
    • name = Protocol Name
    • ++--
    • proto = Protocol Number
    • ++--
    • aliases = Table of alias names
    • ++--
    ++ ++--- Get protocol entry by number. ++-- @usage This function returns nil if the given protocol is unknown. ++-- @class function ++-- @name nixio.getprotobynumber ++-- @param proto protocol number to lookup ++-- @return Table containing the following fields:
      ++--
    • name = Protocol Name
    • ++--
    • proto = Protocol Number
    • ++--
    • aliases = Table of alias names
    • ++--
    ++ ++--- Get all or a specifc proto entry. ++-- @class function ++-- @name nixio.getproto ++-- @param proto protocol number or name to lookup (optional) ++-- @return Table (or if no parameter is given, a table of tables) ++-- containing the following fields:
      ++--
    • name = Protocol Name
    • ++--
    • proto = Protocol Number
    • ++--
    • aliases = Table of alias names
    • ++--
    ++ ++--- Create a new socket and bind it to a network address. ++-- This function is a shortcut for calling nixio.socket and then bind() ++-- on the socket object. ++-- @usage This functions calls getaddrinfo(), socket(), ++-- setsockopt() and bind() but NOT listen(). ++-- @usage The reuseaddr-option is automatically set before binding. ++-- @class function ++-- @name nixio.bind ++-- @param host Hostname or IP-Address (optional, default: all addresses) ++-- @param port Port or service description ++-- @param family Address family ["any", "inet", "inet6"] ++-- @param socktype Socket Type ["stream", "dgram"] ++-- @return Socket Object ++ ++--- Create a new socket and connect to a network address. ++-- This function is a shortcut for calling nixio.socket and then connect() ++-- on the socket object. ++-- @usage This functions calls getaddrinfo(), socket() and connect(). ++-- @class function ++-- @name nixio.connect ++-- @param host Hostname or IP-Address (optional, default: localhost) ++-- @param port Port or service description ++-- @param family Address family ["any", "inet", "inet6"] ++-- @param socktype Socket Type ["stream", "dgram"] ++-- @return Socket Object ++ ++--- Open a file. ++-- @class function ++-- @name nixio.open ++-- @usage Although this function also supports the traditional fopen() ++-- file flags it does not create a file stream but uses the open() syscall. ++-- @param path Filesystem path to open ++-- @param flags Flag string or number (see open_flags). ++-- ["r", "r+", "w", "w+", "a", "a+"] ++-- @param mode File mode for newly created files (see chmod, umask). ++-- @see nixio.umask ++-- @see nixio.open_flags ++-- @return File Object ++ ++--- Generate flags for a call to open(). ++-- @class function ++-- @name nixio.open_flags ++-- @usage This function cannot fail and will never return nil. ++-- @usage The "nonblock" and "ndelay" flags are aliases. ++-- @usage The "nonblock", "ndelay" and "sync" flags are no-ops on Windows. ++-- @param flag1 First Flag ["append", "creat", "excl", "nonblock", "ndelay", ++-- "sync", "trunc", "rdonly", "wronly", "rdwr"] ++-- @param ... More Flags [-"-] ++-- @return flag to be used as second paramter to open ++ ++--- Duplicate a file descriptor. ++-- @class function ++-- @name nixio.dup ++-- @usage This funcation calls dup2() if newfd is set, otherwise dup(). ++-- @param oldfd Old descriptor [File Object, Socket Object (POSIX only)] ++-- @param newfd New descriptor to serve as copy (optional) ++-- @return File Object of new descriptor ++ ++--- Create a pipe. ++-- @class function ++-- @name nixio.pipe ++-- @return File Object of the read end ++-- @return File Object of the write end ++ ++--- Get the last system error code. ++-- @class function ++-- @name nixio.errno ++-- @return Error code ++ ++--- Get the error message for the corresponding error code. ++-- @class function ++-- @name nixio.strerror ++-- @param errno System error code ++-- @return Error message ++ ++--- Sleep for a specified amount of time. ++-- @class function ++-- @usage Not all systems support nanosecond precision but you can expect ++-- to have at least maillisecond precision. ++-- @usage This function is not signal-protected and may fail with EINTR. ++-- @param seconds Seconds to wait (optional) ++-- @param nanoseconds Nanoseconds to wait (optional) ++-- @name nixio.nanosleep ++-- @return true ++ ++--- Generate events-bitfield or parse revents-bitfield for poll. ++-- @class function ++-- @name nixio.poll_flags ++-- @param mode1 revents-Flag bitfield returned from poll to parse OR ++-- ["in", "out", "err", "pri" (POSIX), "hup" (POSIX), "nval" (POSIX)] ++-- @param ... More mode strings for generating the flag [-"-] ++-- @see nixio.poll ++-- @return table with boolean fields reflecting the mode parameter ++-- OR bitfield to use for the events-Flag field ++ ++--- Wait for some event on a file descriptor. ++-- poll() sets the revents-field of the tables provided by fds to a bitfield ++-- indicating the events that occured. ++-- @class function ++-- @usage This function works in-place on the provided table and only ++-- writes the revents field, you can use other fields on your demand. ++-- @usage All metamethods on the tables provided as fds are ignored. ++-- @usage The revents-fields are not reset when the call times out. ++-- You have to check the first return value to be 0 to handle this case. ++-- @usage If you want to wait on a TLS-Socket you have to use the underlying ++-- socket instead. ++-- @usage On Windows poll is emulated through select(), can only be used ++-- on socket descriptors and cannot take more than 64 descriptors per call. ++-- @usage This function is not signal-protected and may fail with EINTR. ++-- @param fds Table containing one or more tables containing
      ++--
    • fd = I/O Descriptor [Socket Object, File Object (POSIX)]
    • ++--
    • events = events to wait for (bitfield generated with poll_flags)
    • ++--
    ++-- @param timeout Timeout in milliseconds ++-- @name nixio.poll ++-- @see nixio.poll_flags ++-- @return number of ready IO descriptors ++-- @return the fds-table with revents-fields set ++ ++--- (POSIX) Clone the current process. ++-- @class function ++-- @name nixio.fork ++-- @return the child process id for the parent process, 0 for the child process ++ ++--- (POSIX) Send a signal to one or more processes. ++-- @class function ++-- @name nixio.kill ++-- @param target Target process of process group. ++-- @param signal Signal to send ++-- @return true ++ ++--- (POSIX) Get the parent process id of the current process. ++-- @class function ++-- @name nixio.getppid ++-- @return parent process id ++ ++--- (POSIX) Get the user id of the current process. ++-- @class function ++-- @name nixio.getuid ++-- @return process user id ++ ++--- (POSIX) Get the group id of the current process. ++-- @class function ++-- @name nixio.getgid ++-- @return process group id ++ ++--- (POSIX) Set the group id of the current process. ++-- @class function ++-- @name nixio.setgid ++-- @param gid New Group ID ++-- @return true ++ ++--- (POSIX) Set the user id of the current process. ++-- @class function ++-- @name nixio.setuid ++-- @param gid New User ID ++-- @return true ++ ++--- (POSIX) Change priority of current process. ++-- @class function ++-- @name nixio.nice ++-- @param nice Nice Value ++-- @return true ++ ++--- (POSIX) Create a new session and set the process group ID. ++-- @class function ++-- @name nixio.setsid ++-- @return session id ++ ++--- (POSIX) Wait for a process to change state. ++-- @class function ++-- @name nixio.waitpid ++-- @usage If the "nohang" is given this function becomes non-blocking. ++-- @param pid Process ID (optional, default: any childprocess) ++-- @param flag1 Flag (optional) ["nohang", "untraced", "continued"] ++-- @param ... More Flags [-"-] ++-- @return process id of child or 0 if no child has changed state ++-- @return ["exited", "signaled", "stopped"] ++-- @return [exit code, terminate signal, stop signal] ++ ++--- (POSIX) Get process times. ++-- @class function ++-- @name nixio.times ++-- @return Table containing:
      ++--
    • utime = user time
    • ++--
    • utime = system time
    • ++--
    • cutime = children user time
    • ++--
    • cstime = children system time
    • ++--
    ++ ++--- (POSIX) Get information about current system and kernel. ++-- @class function ++-- @name nixio.uname ++-- @return Table containing:
      ++--
    • sysname = operating system
    • ++--
    • nodename = network name (usually hostname)
    • ++--
    • release = OS release
    • ++--
    • version = OS version
    • ++--
    • machine = hardware identifier
    • ++--
    ++ ++--- Change the working directory. ++-- @class function ++-- @name nixio.chdir ++-- @param path New working directory ++-- @return true ++ ++--- Ignore or use set the default handler for a signal. ++-- @class function ++-- @name nixio.signal ++-- @param signal Signal ++-- @param handler ["ign", "dfl"] ++-- @return true ++ ++--- Get the ID of the current process. ++-- @class function ++-- @name nixio.getpid ++-- @return process id ++ ++--- Get the current working directory. ++-- @class function ++-- @name nixio.getcwd ++-- @return workign directory ++ ++--- Get the current environment table or a specific environment variable. ++-- @class function ++-- @name nixio.getenv ++-- @param variable Variable (optional) ++-- @return environment table or single environment variable ++ ++--- Set or unset a environment variable. ++-- @class function ++-- @name nixio.setenv ++-- @usage The environment variable will be unset if value is ommited. ++-- @param variable Variable ++-- @param value Value (optional) ++-- @return true ++ ++--- Execute a file to replace the current process. ++-- @class function ++-- @name nixio.exec ++-- @usage The name of the executable is automatically passed as argv[0] ++-- @usage This function does not return on success. ++-- @param executable Executable ++-- @param ... Parameters ++ ++--- Invoke the shell and execute a file to replace the current process. ++-- @class function ++-- @name nixio.execp ++-- @usage The name of the executable is automatically passed as argv[0] ++-- @usage This function does not return on success. ++-- @param executable Executable ++-- @param ... Parameters ++ ++--- Execute a file with a custom environment to replace the current process. ++-- @class function ++-- @name nixio.exece ++-- @usage The name of the executable is automatically passed as argv[0] ++-- @usage This function does not return on success. ++-- @param executable Executable ++-- @param arguments Argument Table ++-- @param environment Environment Table (optional) ++ ++--- Sets the file mode creation mask. ++-- @class function ++-- @name nixio.umask ++-- @param mask New creation mask (see chmod for format specifications) ++-- @return the old umask as decimal mode number ++-- @return the old umask as mode string ++ ++--- (Linux) Get overall system statistics. ++-- @class function ++-- @name nixio.sysinfo ++-- @return Table containing:
      ++--
    • uptime = system uptime in seconds
    • ++--
    • loads = {loadavg1, loadavg5, loadavg15}
    • ++--
    • totalram = total RAM
    • ++--
    • freeram = free RAM
    • ++--
    • sharedram = shared RAM
    • ++--
    • bufferram = buffered RAM
    • ++--
    • totalswap = total SWAP
    • ++--
    • freeswap = free SWAP
    • ++--
    • procs = number of running processes
    • ++--
    ++ ++--- Create a new socket. ++-- @class function ++-- @name nixio.socket ++-- @param domain Domain ["inet", "inet6", "unix"] ++-- @param type Type ["stream", "dgram", "raw"] ++-- @return Socket Object ++ ++--- (POSIX) Send data from a file to a socket in kernel-space. ++-- @class function ++-- @name nixio.sendfile ++-- @param socket Socket Object ++-- @param file File Object ++-- @param length Amount of data to send (in Bytes). ++-- @return bytes sent ++ ++--- (Linux) Send data from / to a pipe in kernel-space. ++-- @class function ++-- @name nixio.splice ++-- @param fdin Input I/O descriptor ++-- @param fdout Output I/O descriptor ++-- @param length Amount of data to send (in Bytes). ++-- @param flags (optional, bitfield generated by splice_flags) ++-- @see nixio.splice_flags ++-- @return bytes sent ++ ++--- (Linux) Generate a flag bitfield for a call to splice. ++-- @class function ++-- @name nixio.splice_flags ++-- @param flag1 First Flag ["move", "nonblock", "more"] ++-- @param ... More flags [-"-] ++-- @see nixio.splice ++-- @return Flag bitfield ++ ++--- (POSIX) Open a connection to the system logger. ++-- @class function ++-- @name nixio.openlog ++-- @param ident Identifier ++-- @param flag1 Flag 1 ["cons", "nowait", "pid", "perror", "ndelay", "odelay"] ++-- @param ... More flags [-"-] ++ ++--- (POSIX) Close the connection to the system logger. ++-- @class function ++-- @name nixio.closelog ++ ++--- (POSIX) Write a message to the system logger. ++-- @class function ++-- @name nixio.syslog ++-- @param priority Priority ["emerg", "alert", "crit", "err", "warning", ++-- "notice", "info", "debug"] ++-- @param message ++ ++--- (POSIX) Set the logmask of the system logger for current process. ++-- @class function ++-- @name nixio.setlogmask ++-- @param priority Priority ["emerg", "alert", "crit", "err", "warning", ++-- "notice", "info", "debug"] ++ ++--- (POSIX) Encrypt a user password. ++-- @class function ++-- @name nixio.crypt ++-- @param key Key ++-- @param salt Salt ++-- @return password hash ++ ++--- (POSIX) Get all or a specific user group. ++-- @class function ++-- @name nixio.getgr ++-- @param group Group ID or groupname (optional) ++-- @return Table containing:
      ++--
    • name = Group Name
    • ++--
    • gid = Group ID
    • ++--
    • passwd = Password
    • ++--
    • mem = {Member #1, Member #2, ...}
    • ++--
    ++ ++--- (POSIX) Get all or a specific user account. ++-- @class function ++-- @name nixio.getpw ++-- @param user User ID or username (optional) ++-- @return Table containing:
      ++--
    • name = Name
    • ++--
    • uid = ID
    • ++--
    • gid = Group ID
    • ++--
    • passwd = Password
    • ++--
    • dir = Home directory
    • ++--
    • gecos = Information
    • ++--
    • shell = Shell
    • ++--
    ++ ++--- (Linux, Solaris) Get all or a specific shadow password entry. ++-- @class function ++-- @name nixio.getsp ++-- @param user username (optional) ++-- @return Table containing:
      ++--
    • namp = Name
    • ++--
    • expire = Expiration Date
    • ++--
    • flag = Flags
    • ++--
    • inact = Inactivity Date
    • ++--
    • lstchg = Last change
    • ++--
    • max = Maximum
    • ++--
    • min = Minimum
    • ++--
    • warn = Warning
    • ++--
    • pwdp = Password Hash
    • ++--
    ++ ++--- Create a new TLS context. ++-- @class function ++-- @name nixio.tls ++-- @param mode TLS-Mode ["client", "server"] ++-- @return TLSContext Object +diff --git a/feeds/luci/libs/luci-lib-nixio/nixio-0.3-1.rockspec b/feeds/luci/libs/luci-lib-nixio/nixio-0.3-1.rockspec +new file mode 100644 +index 0000000..755cf81 +--- /dev/null ++++ b/feeds/luci/libs/luci-lib-nixio/nixio-0.3-1.rockspec +@@ -0,0 +1,37 @@ ++package = "nixio" ++version = "0.3-1" ++source = { ++ url = "http://dev.luci.freifunk-halle.net/nixio/nixio-0.3.tar.bz2" ++} ++description = { ++ summary = "System, Networking and I/O library for Lua", ++ detailed = [[ ++ Nixio is a multi-platform library offering a wide variety ++ of features such as IPv4, IPv6 and UNIX networking, large file I/O, file ++ system operations, system and process control, POSIX user/group management, ++ basic cryptographical hashing, hmac and TLS support, bit operations and ++ binary conversion. ++ ]], ++ homepage = "http://luci.subsignal.org", ++ license = "Apache 2.0", ++ maintainer = "Steven Barth", ++} ++dependencies = { ++ "lua >= 5.1" ++} ++external_dependencies = { ++ OPENSSL = { ++ header = "openssl/ssl.h", ++ } ++} ++build = { ++ type = "make", ++ build_variables = { ++ NIXIO_LDFLAGS = "-lcrypt -L$(OPENSSL_LIBDIR) -I$(OPENSSL_INCDIR)", ++ LUA_CFLAGS = "$(CFLAGS) -I$(LUA_INCDIR)", ++ }, ++ install_variables = { ++ LUA_MODULEDIR = "$(LUADIR)", ++ LUA_LIBRARYDIR = "$(LIBDIR)", ++ }, ++} +diff --git a/feeds/luci/libs/luci-lib-nixio/root/lib/upgrade/luci-add-conffiles.sh b/feeds/luci/libs/luci-lib-nixio/root/lib/upgrade/luci-add-conffiles.sh +new file mode 100644 +index 0000000..77399b9 +--- /dev/null ++++ b/feeds/luci/libs/luci-lib-nixio/root/lib/upgrade/luci-add-conffiles.sh +@@ -0,0 +1,16 @@ ++add_luci_conffiles() ++{ ++ local filelist="$1" ++ ++ # save ssl certs ++ if [ -d /etc/nixio ]; then ++ find /etc/nixio -type f >> $filelist ++ fi ++ ++ # save uhttpd certs ++ [ -f "/etc/uhttpd.key" ] && echo /etc/uhttpd.key >> $filelist ++ [ -f "/etc/uhttpd.crt" ] && echo /etc/uhttpd.crt >> $filelist ++} ++ ++sysupgrade_init_conffiles="$sysupgrade_init_conffiles add_luci_conffiles" ++ +diff --git a/feeds/luci/libs/luci-lib-nixio/root/usr/lib/lua/nixio/fs.lua b/feeds/luci/libs/luci-lib-nixio/root/usr/lib/lua/nixio/fs.lua +new file mode 100644 +index 0000000..8883835 +--- /dev/null ++++ b/feeds/luci/libs/luci-lib-nixio/root/usr/lib/lua/nixio/fs.lua +@@ -0,0 +1,175 @@ ++--[[ ++nixio - Linux I/O library for lua ++ ++Copyright 2009 Steven Barth ++ ++Licensed under the Apache License, Version 2.0 (the "License"); ++you may not use this file except in compliance with the License. ++You may obtain a copy of the License at ++ ++http://www.apache.org/licenses/LICENSE-2.0 ++ ++$Id$ ++]]-- ++ ++local table = require "table" ++local nixio = require "nixio" ++local type, ipairs, setmetatable = type, ipairs, setmetatable ++require "nixio.util" ++ ++ ++module ("nixio.fs", function(m) setmetatable(m, {__index = nixio.fs}) end) ++ ++ ++function readfile(path, limit) ++ local fd, code, msg = nixio.open(path, "r") ++ local data ++ if not fd then ++ return nil, code, msg ++ end ++ ++ data, code, msg = fd:readall(limit) ++ ++ fd:close() ++ return data, code, msg ++end ++ ++ ++function writefile(path, data) ++ local fd, code, msg, stat = nixio.open(path, "w") ++ if not fd then ++ return nil, code, msg ++ end ++ ++ stat, code, msg = fd:writeall(data) ++ ++ fd:close() ++ return stat, code, msg ++end ++ ++function datacopy(src, dest, size) ++ local fdin, code, msg = nixio.open(src, "r") ++ if not fdin then ++ return nil, code, msg ++ end ++ ++ local fdout, code, msg = nixio.open(dest, "w") ++ if not fdout then ++ return nil, code, msg ++ end ++ ++ local stat, code, msg, sent = fdin:copy(fdout, size) ++ fdin:close() ++ fdout:close() ++ ++ return stat, code, msg, sent ++end ++ ++function copy(src, dest) ++ local stat, code, msg, res = nixio.fs.lstat(src) ++ if not stat then ++ return nil, code, msg ++ end ++ ++ if stat.type == "dir" then ++ if nixio.fs.stat(dest, type) ~= "dir" then ++ res, code, msg = nixio.fs.mkdir(dest) ++ else ++ stat = true ++ end ++ elseif stat.type == "lnk" then ++ res, code, msg = nixio.fs.symlink(nixio.fs.readlink(src), dest) ++ elseif stat.type == "reg" then ++ res, code, msg = datacopy(src, dest) ++ end ++ ++ if not res then ++ return nil, code, msg ++ end ++ ++ nixio.fs.utimes(dest, stat.atime, stat.mtime) ++ ++ if nixio.fs.lchown then ++ nixio.fs.lchown(dest, stat.uid, stat.gid) ++ end ++ ++ if stat.type ~= "lnk" then ++ nixio.fs.chmod(dest, stat.modedec) ++ end ++ ++ return true ++end ++ ++function move(src, dest) ++ local stat, code, msg = nixio.fs.rename(src, dest) ++ if not stat and code == nixio.const.EXDEV then ++ stat, code, msg = copy(src, dest) ++ if stat then ++ stat, code, msg = nixio.fs.unlink(src) ++ end ++ end ++ return stat, code, msg ++end ++ ++function mkdirr(dest, mode) ++ if nixio.fs.stat(dest, "type") == "dir" then ++ return true ++ else ++ local stat, code, msg = nixio.fs.mkdir(dest, mode) ++ if not stat and code == nixio.const.ENOENT then ++ stat, code, msg = mkdirr(nixio.fs.dirname(dest), mode) ++ if stat then ++ stat, code, msg = nixio.fs.mkdir(dest, mode) ++ end ++ end ++ return stat, code, msg ++ end ++end ++ ++local function _recurse(cb, src, dest) ++ local type = nixio.fs.lstat(src, "type") ++ if type ~= "dir" then ++ return cb(src, dest) ++ else ++ local stat, se, code, msg, s, c, m = true, nixio.const.sep ++ if dest then ++ s, c, m = cb(src, dest) ++ stat, code, msg = stat and s, c or code, m or msg ++ end ++ ++ for e in nixio.fs.dir(src) do ++ if dest then ++ s, c, m = _recurse(cb, src .. se .. e, dest .. se .. e) ++ else ++ s, c, m = _recurse(cb, src .. se .. e) ++ end ++ stat, code, msg = stat and s, c or code, m or msg ++ end ++ ++ if not dest then -- Postfix ++ s, c, m = cb(src) ++ stat, code, msg = stat and s, c or code, m or msg ++ end ++ ++ return stat, code, msg ++ end ++end ++ ++function copyr(src, dest) ++ return _recurse(copy, src, dest) ++end ++ ++function mover(src, dest) ++ local stat, code, msg = nixio.fs.rename(src, dest) ++ if not stat and code == nixio.const.EXDEV then ++ stat, code, msg = _recurse(copy, src, dest) ++ if stat then ++ stat, code, msg = _recurse(nixio.fs.remove, src) ++ end ++ end ++ return stat, code, msg ++end ++ ++function remover(src) ++ return _recurse(nixio.fs.remove, src) ++end +\ No newline at end of file +diff --git a/feeds/luci/libs/luci-lib-nixio/root/usr/lib/lua/nixio/util.lua b/feeds/luci/libs/luci-lib-nixio/root/usr/lib/lua/nixio/util.lua +new file mode 100644 +index 0000000..63d2f62 +--- /dev/null ++++ b/feeds/luci/libs/luci-lib-nixio/root/usr/lib/lua/nixio/util.lua +@@ -0,0 +1,270 @@ ++--[[ ++nixio - Linux I/O library for lua ++ ++Copyright 2009 Steven Barth ++ ++Licensed under the Apache License, Version 2.0 (the "License"); ++you may not use this file except in compliance with the License. ++You may obtain a copy of the License at ++ ++http://www.apache.org/licenses/LICENSE-2.0 ++ ++$Id$ ++]]-- ++ ++local table = require "table" ++local nixio = require "nixio" ++local getmetatable, assert, pairs, type = getmetatable, assert, pairs, type ++local tostring = tostring ++ ++module "nixio.util" ++ ++local BUFFERSIZE = nixio.const.buffersize ++local ZIOBLKSIZE = 65536 ++local socket = nixio.meta_socket ++local tls_socket = nixio.meta_tls_socket ++local file = nixio.meta_file ++local uname = nixio.uname() ++local ZBUG = uname.sysname == "Linux" and uname.release:sub(1, 3) == "2.4" ++ ++function consume(iter, append) ++ local tbl = append or {} ++ if iter then ++ for obj in iter do ++ tbl[#tbl+1] = obj ++ end ++ end ++ return tbl ++end ++ ++local meta = {} ++ ++function meta.is_socket(self) ++ return (getmetatable(self) == socket) ++end ++ ++function meta.is_tls_socket(self) ++ return (getmetatable(self) == tls_socket) ++end ++ ++function meta.is_file(self) ++ return (getmetatable(self) == file) ++end ++ ++function meta.readall(self, len) ++ local block, code, msg = self:read(len or BUFFERSIZE) ++ ++ if not block then ++ return nil, code, msg, "" ++ elseif #block == 0 then ++ return "", nil, nil, "" ++ end ++ ++ local data, total = {block}, #block ++ ++ while not len or len > total do ++ block, code, msg = self:read(len and (len - total) or BUFFERSIZE) ++ ++ if not block then ++ return nil, code, msg, table.concat(data) ++ elseif #block == 0 then ++ break ++ end ++ ++ data[#data+1], total = block, total + #block ++ end ++ ++ local data = #data > 1 and table.concat(data) or data[1] ++ return data, nil, nil, data ++end ++meta.recvall = meta.readall ++ ++function meta.writeall(self, data) ++ data = tostring(data) ++ local sent, code, msg = self:write(data) ++ ++ if not sent then ++ return nil, code, msg, 0 ++ end ++ ++ local total = sent ++ ++ while total < #data do ++ sent, code, msg = self:write(data, total) ++ ++ if not sent then ++ return nil, code, msg, total ++ end ++ ++ total = total + sent ++ end ++ ++ return total, nil, nil, total ++end ++meta.sendall = meta.writeall ++ ++function meta.linesource(self, limit) ++ limit = limit or BUFFERSIZE ++ local buffer = "" ++ local bpos = 0 ++ return function(flush) ++ local line, endp, _ ++ ++ if flush then ++ line = buffer:sub(bpos + 1) ++ buffer = type(flush) == "string" and flush or "" ++ bpos = 0 ++ return line ++ end ++ ++ while not line do ++ _, endp, line = buffer:find("(.-)\r?\n", bpos + 1) ++ if line then ++ bpos = endp ++ return line ++ elseif #buffer < limit + bpos then ++ local newblock, code, msg = self:read(limit + bpos - #buffer) ++ if not newblock then ++ return nil, code, msg ++ elseif #newblock == 0 then ++ return nil ++ end ++ buffer = buffer:sub(bpos + 1) .. newblock ++ bpos = 0 ++ else ++ return nil, 0 ++ end ++ end ++ end ++end ++ ++function meta.blocksource(self, bs, limit) ++ bs = bs or BUFFERSIZE ++ return function() ++ local toread = bs ++ if limit then ++ if limit < 1 then ++ return nil ++ elseif limit < toread then ++ toread = limit ++ end ++ end ++ ++ local block, code, msg = self:read(toread) ++ ++ if not block then ++ return nil, code, msg ++ elseif #block == 0 then ++ return nil ++ else ++ if limit then ++ limit = limit - #block ++ end ++ ++ return block ++ end ++ end ++end ++ ++function meta.sink(self, close) ++ return function(chunk, src_err) ++ if not chunk and not src_err and close then ++ if self.shutdown then ++ self:shutdown() ++ end ++ self:close() ++ elseif chunk and #chunk > 0 then ++ return self:writeall(chunk) ++ end ++ return true ++ end ++end ++ ++function meta.copy(self, fdout, size) ++ local source = self:blocksource(nil, size) ++ local sink = fdout:sink() ++ local sent, chunk, code, msg = 0 ++ ++ repeat ++ chunk, code, msg = source() ++ sink(chunk, code, msg) ++ sent = chunk and (sent + #chunk) or sent ++ until not chunk ++ return not code and sent or nil, code, msg, sent ++end ++ ++function meta.copyz(self, fd, size) ++ local sent, lsent, code, msg = 0 ++ local splicable ++ ++ if not ZBUG and self:is_file() then ++ local ftype = self:stat("type") ++ if nixio.sendfile and fd:is_socket() and ftype == "reg" then ++ repeat ++ lsent, code, msg = nixio.sendfile(fd, self, size or ZIOBLKSIZE) ++ if lsent then ++ sent = sent + lsent ++ size = size and (size - lsent) ++ end ++ until (not lsent or lsent == 0 or (size and size == 0)) ++ if lsent or (not lsent and sent == 0 and ++ code ~= nixio.const.ENOSYS and code ~= nixio.const.EINVAL) then ++ return lsent and sent, code, msg, sent ++ end ++ elseif nixio.splice and not fd:is_tls_socket() and ftype == "fifo" then ++ splicable = true ++ end ++ end ++ ++ if nixio.splice and fd:is_file() and not splicable then ++ splicable = not self:is_tls_socket() and fd:stat("type") == "fifo" ++ end ++ ++ if splicable then ++ repeat ++ lsent, code, msg = nixio.splice(self, fd, size or ZIOBLKSIZE) ++ if lsent then ++ sent = sent + lsent ++ size = size and (size - lsent) ++ end ++ until (not lsent or lsent == 0 or (size and size == 0)) ++ if lsent or (not lsent and sent == 0 and ++ code ~= nixio.const.ENOSYS and code ~= nixio.const.EINVAL) then ++ return lsent and sent, code, msg, sent ++ end ++ end ++ ++ return self:copy(fd, size) ++end ++ ++if tls_socket then ++ function tls_socket.close(self) ++ return self.socket:close() ++ end ++ ++ function tls_socket.getsockname(self) ++ return self.socket:getsockname() ++ end ++ ++ function tls_socket.getpeername(self) ++ return self.socket:getpeername() ++ end ++ ++ function tls_socket.getsockopt(self, ...) ++ return self.socket:getsockopt(...) ++ end ++ tls_socket.getopt = tls_socket.getsockopt ++ ++ function tls_socket.setsockopt(self, ...) ++ return self.socket:setsockopt(...) ++ end ++ tls_socket.setopt = tls_socket.setsockopt ++end ++ ++for k, v in pairs(meta) do ++ file[k] = v ++ socket[k] = v ++ if tls_socket then ++ tls_socket[k] = v ++ end ++end +diff --git a/feeds/luci/libs/luci-lib-nixio/src/Makefile b/feeds/luci/libs/luci-lib-nixio/src/Makefile +new file mode 100644 +index 0000000..a7e9a77 +--- /dev/null ++++ b/feeds/luci/libs/luci-lib-nixio/src/Makefile +@@ -0,0 +1,120 @@ ++OS = Linux ++AXTLS_VERSION = 1.2.1 ++AXTLS_DIR = axTLS ++AXTLS_FILE = $(AXTLS_DIR)-$(AXTLS_VERSION).tar.gz ++#NIXIO_TLS ?= openssl ++NIXIO_SHADOW ?= $(shell echo 'int main(void){ return !getspnam("root"); }' | $(CC) $(CFLAGS) -include shadow.h -xc -o/dev/null - 2>/dev/null && echo yes) ++NIXIO_SO = nixio.so ++NIXIO_LDFLAGS = -llua -lm -ldl ++CFLAGS += -std=gnu99 ++ ++ifeq (,$(findstring Darwin,$(OS))) ++ NIXIO_LDFLAGS += -lcrypt -shared ++else ++ NIXIO_LDFLAGS += -bundle -undefined dynamic_lookup ++ EXTRA_CFLAGS += -D__DARWIN__ ++endif ++ ++NIXIO_OBJ = nixio.o socket.o sockopt.o bind.o address.o \ ++ protoent.o poll.o io.o file.o splice.o process.o \ ++ syslog.o bit.o binary.o fs.o user.o \ ++ $(if $(NIXIO_TLS),tls-crypto.o tls-context.o tls-socket.o,) ++ ++ifeq ($(NIXIO_TLS),axtls) ++ TLS_CFLAGS = -IaxTLS/ssl -IaxTLS/crypto -IaxTLS/config -include axtls-compat.h ++ TLS_DEPENDS = axtls-compat.o ++ NIXIO_OBJ += axtls-compat.o libaxtls.a ++endif ++ ++ifeq ($(NIXIO_TLS),openssl) ++ NIXIO_LDFLAGS += -lssl -lcrypto ++endif ++ ++ifeq ($(NIXIO_TLS),cyassl) ++ NIXIO_LDFLAGS += -lcyassl ++ TLS_DEPENDS = cyassl-compat.o ++ TLS_CFLAGS = -include cyassl-compat.h ++ NIXIO_OBJ += cyassl-compat.o ++endif ++ ++ifeq ($(NIXIO_TLS),) ++ NIXIO_CFLAGS += -DNO_TLS ++endif ++ ++ifneq ($(NIXIO_SHADOW),yes) ++ NIXIO_CFLAGS += -DNO_SHADOW ++endif ++ ++ ++ifeq ($(OS),SunOS) ++ NIXIO_LDFLAGS += -lsocket -lnsl -lsendfile ++endif ++ ++ifneq (,$(findstring MINGW,$(OS))$(findstring mingw,$(OS))$(findstring Windows,$(OS))) ++ NIXIO_CROSS_CC:=$(shell which i586-mingw32msvc-cc) ++ifneq (,$(NIXIO_CROSS_CC)) ++ CC:=$(NIXIO_CROSS_CC) ++endif ++ NIXIO_OBJ += mingw-compat.o ++ NIXIO_LDFLAGS_POST:=-llua -lssl -lcrypto -lws2_32 -lgdi32 ++ FPIC:= ++ EXTRA_CFLAGS += -D_WIN32_WINNT=0x0501 ++ LUA_CFLAGS:= ++ NIXIO_SO:=nixio.dll ++ NIXIO_LDFLAGS:= ++endif ++ ++ ++%.o: %.c ++ $(CC) $(CPPFLAGS) $(CFLAGS) $(NIXIO_CFLAGS) $(LUA_CFLAGS) $(FPIC) -c -o $@ $< ++ ++ifneq ($(NIXIO_TLS),) ++tls-crypto.o: $(TLS_DEPENDS) tls-crypto.c ++ $(CC) $(CPPFLAGS) $(CFLAGS) $(NIXIO_CFLAGS) $(LUA_CFLAGS) $(FPIC) $(TLS_CFLAGS) -c -o $@ tls-crypto.c ++ ++tls-context.o: $(TLS_DEPENDS) tls-context.c ++ $(CC) $(CPPFLAGS) $(CFLAGS) $(NIXIO_CFLAGS) $(LUA_CFLAGS) $(FPIC) $(TLS_CFLAGS) -c -o $@ tls-context.c ++ ++tls-socket.o: $(TLS_DEPENDS) tls-socket.c ++ $(CC) $(CPPFLAGS) $(CFLAGS) $(NIXIO_CFLAGS) $(LUA_CFLAGS) $(FPIC) $(TLS_CFLAGS) -c -o $@ tls-socket.c ++ ++axtls-compat.o: libaxtls.a axtls-compat.c ++ $(CC) $(CPPFLAGS) $(CFLAGS) $(NIXIO_CFLAGS) $(LUA_CFLAGS) $(FPIC) $(TLS_CFLAGS) -c -o $@ axtls-compat.c ++ mkdir -p dist ++ cp -pR axtls-root/* dist/ ++endif ++ ++compile: $(NIXIO_OBJ) ++ $(CC) $(LDFLAGS) $(SHLIB_FLAGS) -o $(NIXIO_SO) $(NIXIO_OBJ) $(NIXIO_LDFLAGS) $(NIXIO_LDFLAGS_POST) ++ mkdir -p dist/usr/lib/lua ++ cp $(NIXIO_SO) dist/usr/lib/lua/$(NIXIO_SO) ++ ++$(AXTLS_DIR)/.prepared: ++ #rm -rf $(AXTLS_DIR) ++ #tar xvfz $(AXTLS_FILE) ++ cp axtls-config/.config axtls-config/config.h $(AXTLS_DIR)/config ++ touch $@ ++ ++libaxtls.a: $(AXTLS_DIR)/.prepared ++ $(MAKE) -C $(AXTLS_DIR) CC="$(CC)" CFLAGS="$(CFLAGS) $(EXTRA_CFLAGS) $(FPIC) -Wall -pedantic -I../config -I../ssl -I../crypto" LDFLAGS="$(LDFLAGS)" OS="$(OS)" clean all ++ cp -p $(AXTLS_DIR)/_stage/libaxtls.a src ++ # ************************************************************************* ++ # ++ # ++ # ++ # *** WARNING *** ++ # The use of the axTLS cryptographical provider is discouraged! ++ # Please switch to either CyaSSL or OpenSSL. ++ # Support for axTLS might be removed in the near future. ++ # ++ # ++ # ++ #************************************************************************** ++ ++clean: ++ rm -f *.o *.so *.a *.dll ++ rm -f $(AXTLS_DIR)/.prepared ++ ++install: compile ++ mkdir -p $(DESTDIR) ++ cp -pR dist/* $(DESTDIR)/ +diff --git a/feeds/luci/libs/luci-lib-nixio/src/address.c b/feeds/luci/libs/luci-lib-nixio/src/address.c +new file mode 100644 +index 0000000..8ab4fa8 +--- /dev/null ++++ b/feeds/luci/libs/luci-lib-nixio/src/address.c +@@ -0,0 +1,567 @@ ++/* ++ * nixio - Linux I/O library for lua ++ * ++ * Copyright (C) 2009 Steven Barth ++ * ++ * Licensed under the Apache License, Version 2.0 (the "License"); ++ * you may not use this file except in compliance with the License. ++ * You may obtain a copy of the License at ++ * ++ * http://www.apache.org/licenses/LICENSE-2.0 ++ * ++ * Unless required by applicable law or agreed to in writing, software ++ * distributed under the License is distributed on an "AS IS" BASIS, ++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. ++ * See the License for the specific language governing permissions and ++ * limitations under the License. ++ */ ++ ++#include "nixio.h" ++#include ++#include ++#include ++#include ++ ++#ifdef __linux__ ++ ++#include ++#include ++#include ++ ++/* setjmp() / longjmp() stuff */ ++static jmp_buf nixio__jump_alarm; ++static void nixio__handle_alarm(int sig) { longjmp(nixio__jump_alarm, 1); } ++ ++#include ++ ++/* struct net_device_stats is buggy on amd64, redefine it */ ++struct nixio__nds { ++ uint32_t rx_packets; ++ uint32_t tx_packets; ++ uint32_t rx_bytes; ++ uint32_t tx_bytes; ++ uint32_t rx_errors; ++ uint32_t tx_errors; ++ uint32_t rx_dropped; ++ uint32_t tx_dropped; ++ uint32_t multicast; ++ uint32_t collisions; ++ ++ uint32_t rx_length_errors; ++ uint32_t rx_over_errors; ++ uint32_t rx_crc_errors; ++ uint32_t rx_frame_errors; ++ uint32_t rx_fifo_errors; ++ uint32_t rx_missed_errors; ++ ++ uint32_t tx_aborted_errors; ++ uint32_t tx_carrier_errors; ++ uint32_t tx_fifo_errors; ++ uint32_t tx_heartbeat_errors; ++ uint32_t tx_window_errors; ++ ++ uint32_t rx_compressed; ++ uint32_t tx_compressed; ++}; ++#endif ++ ++#ifndef NI_MAXHOST ++#define NI_MAXHOST 1025 ++#endif ++ ++/** ++ * address pushing helper ++ */ ++int nixio__addr_parse(nixio_addr *addr, struct sockaddr *saddr) { ++ void *baddr; ++ ++ addr->family = saddr->sa_family; ++ if (saddr->sa_family == AF_INET) { ++ struct sockaddr_in *inetaddr = (struct sockaddr_in*)saddr; ++ addr->port = ntohs(inetaddr->sin_port); ++ baddr = &inetaddr->sin_addr; ++ } else if (saddr->sa_family == AF_INET6) { ++ struct sockaddr_in6 *inet6addr = (struct sockaddr_in6*)saddr; ++ addr->port = ntohs(inet6addr->sin6_port); ++ baddr = &inet6addr->sin6_addr; ++#ifdef AF_PACKET ++ } else if (saddr->sa_family == AF_PACKET) { ++ struct sockaddr_ll *etheradddr = (struct sockaddr_ll*)saddr; ++ addr->prefix = etheradddr->sll_hatype; ++ addr->port = etheradddr->sll_ifindex; ++ char *c = addr->host; ++ for (size_t i = 0; i < etheradddr->sll_halen; i++) { ++ *c++ = nixio__bin2hex[(etheradddr->sll_addr[i] & 0xf0) >> 4]; ++ *c++ = nixio__bin2hex[(etheradddr->sll_addr[i] & 0x0f)]; ++ *c++ = ':'; ++ } ++ *(c-1) = 0; ++ return 0; ++#endif ++ } else { ++ errno = EAFNOSUPPORT; ++ return -1; ++ } ++ ++ if (!inet_ntop(saddr->sa_family, baddr, addr->host, sizeof(addr->host))) { ++ return -1; ++ } ++ ++ return 0; ++} ++ ++/** ++ * address pulling helper ++ */ ++int nixio__addr_write(nixio_addr *addr, struct sockaddr *saddr) { ++ if (addr->family == AF_UNSPEC) { ++ if (strchr(addr->host, ':')) { ++ addr->family = AF_INET6; ++ } else { ++ addr->family = AF_INET; ++ } ++ } ++ if (addr->family == AF_INET) { ++ struct sockaddr_in *inetaddr = (struct sockaddr_in *)saddr; ++ memset(inetaddr, 0, sizeof(struct sockaddr_in)); ++ ++ if (inet_pton(AF_INET, addr->host, &inetaddr->sin_addr) < 1) { ++ return -1; ++ } ++ ++ inetaddr->sin_family = AF_INET; ++ inetaddr->sin_port = htons((uint16_t)addr->port); ++ return 0; ++ } else if (addr->family == AF_INET6) { ++ struct sockaddr_in6 *inet6addr = (struct sockaddr_in6 *)saddr; ++ memset(inet6addr, 0, sizeof(struct sockaddr_in6)); ++ ++ if (inet_pton(AF_INET6, addr->host, &inet6addr->sin6_addr) < 1) { ++ return -1; ++ } ++ ++ inet6addr->sin6_family = AF_INET6; ++ inet6addr->sin6_port = htons((uint16_t)addr->port); ++ return 0; ++ } else { ++ errno = EAFNOSUPPORT; ++ return -1; ++ } ++} ++ ++/** ++ * netmask to prefix helper ++ */ ++int nixio__addr_prefix(struct sockaddr *saddr) { ++ int prefix = 0; ++ size_t len; ++ uint8_t *addr; ++ ++ if (saddr->sa_family == AF_INET) { ++ addr = (uint8_t*)(&((struct sockaddr_in*)saddr)->sin_addr); ++ len = 4; ++ } else if (saddr->sa_family == AF_INET6) { ++ addr = (uint8_t*)(&((struct sockaddr_in6*)saddr)->sin6_addr); ++ len = 16; ++ } else { ++ errno = EAFNOSUPPORT; ++ return -1; ++ } ++ ++ for (size_t i = 0; i < len; i++) { ++ if (addr[i] == 0xff) { ++ prefix += 8; ++ } else if (addr[i] == 0x00) { ++ break; ++ } else { ++ for (uint8_t c = addr[i]; c; c <<= 1) { ++ prefix++; ++ } ++ } ++ } ++ ++ return prefix; ++} ++ ++/** ++ * getaddrinfo(host, family, port) ++ */ ++static int nixio_getaddrinfo(lua_State *L) { ++ const char *host = NULL; ++ if (!lua_isnoneornil(L, 1)) { ++ host = luaL_checklstring(L, 1, NULL); ++ } ++ const char *family = luaL_optlstring(L, 2, "any", NULL); ++ const char *port = lua_tolstring(L, 3, NULL); ++ ++ struct addrinfo hints, *result, *rp; ++ memset(&hints, 0, sizeof(hints)); ++ ++ if (!strcmp(family, "any")) { ++ hints.ai_family = AF_UNSPEC; ++ } else if (!strcmp(family, "inet")) { ++ hints.ai_family = AF_INET; ++ } else if (!strcmp(family, "inet6")) { ++ hints.ai_family = AF_INET6; ++ } else { ++ return luaL_argerror(L, 2, "supported values: any, inet, inet6"); ++ } ++ ++ hints.ai_socktype = 0; ++ hints.ai_protocol = 0; ++ ++ int aistat = getaddrinfo(host, port, &hints, &result); ++ if (aistat) { ++ lua_pushnil(L); ++ lua_pushinteger(L, aistat); ++ lua_pushstring(L, gai_strerror(aistat)); ++ return 3; ++ } ++ ++ /* create socket object */ ++ lua_newtable(L); ++ int i = 1; ++ ++ for (rp = result; rp != NULL; rp = rp->ai_next) { ++ /* avoid duplicate results */ ++#ifndef __WINNT__ ++ if (!port && rp->ai_socktype != SOCK_STREAM) { ++ continue; ++ } ++#endif ++ ++ if (rp->ai_family == AF_INET || rp->ai_family == AF_INET6) { ++ lua_createtable(L, 0, port ? 4 : 2); ++ if (rp->ai_family == AF_INET) { ++ lua_pushliteral(L, "inet"); ++ } else if (rp->ai_family == AF_INET6) { ++ lua_pushliteral(L, "inet6"); ++ } ++ lua_setfield(L, -2, "family"); ++ ++ if (port) { ++ switch (rp->ai_socktype) { ++ case SOCK_STREAM: ++ lua_pushliteral(L, "stream"); ++ break; ++ case SOCK_DGRAM: ++ lua_pushliteral(L, "dgram"); ++ break; ++ case SOCK_RAW: ++ lua_pushliteral(L, "raw"); ++ break; ++ default: ++ lua_pushnil(L); ++ break; ++ } ++ lua_setfield(L, -2, "socktype"); ++ } ++ ++ nixio_addr addr; ++ if (nixio__addr_parse(&addr, rp->ai_addr)) { ++ freeaddrinfo(result); ++ return nixio__perror_s(L); ++ } ++ ++ if (port) { ++ lua_pushinteger(L, addr.port); ++ lua_setfield(L, -2, "port"); ++ } ++ ++ lua_pushstring(L, addr.host); ++ lua_setfield(L, -2, "address"); ++ lua_rawseti(L, -2, i++); ++ } ++ } ++ ++ freeaddrinfo(result); ++ ++ return 1; ++} ++ ++/** ++ * getnameinfo(address, family[, timeout]) ++ */ ++static int nixio_getnameinfo(lua_State *L) { ++ const char *ip = luaL_checkstring(L, 1); ++ const char *family = luaL_optstring(L, 2, NULL); ++ ++#ifdef __linux__ ++ struct sigaction sa_new, sa_old; ++ int timeout = luaL_optnumber(L, 3, 0); ++ if (timeout > 0 && timeout < 1000) ++ { ++ sa_new.sa_handler = nixio__handle_alarm; ++ sa_new.sa_flags = 0; ++ sigemptyset(&sa_new.sa_mask); ++ sigaction(SIGALRM, &sa_new, &sa_old); ++ ++ /* user timeout exceeded */ ++ if (setjmp(nixio__jump_alarm)) ++ { ++ sigaction(SIGALRM, &sa_old, NULL); ++ ++ lua_pushnil(L); ++ lua_pushinteger(L, EAI_AGAIN); ++ lua_pushstring(L, gai_strerror(EAI_AGAIN)); ++ ++ return 3; ++ } ++ ++ ualarm(timeout * 1000, 0); ++ } ++#endif ++ ++ char host[NI_MAXHOST]; ++ ++ struct sockaddr_storage saddr; ++ nixio_addr addr; ++ memset(&addr, 0, sizeof(addr)); ++ strncpy(addr.host, ip, sizeof(addr.host) - 1); ++ ++ if (!family) { ++ addr.family = AF_UNSPEC; ++ } else if (!strcmp(family, "inet")) { ++ addr.family = AF_INET; ++ } else if (!strcmp(family, "inet6")) { ++ addr.family = AF_INET6; ++ } else { ++ return luaL_argerror(L, 2, "supported values: inet, inet6"); ++ } ++ ++ nixio__addr_write(&addr, (struct sockaddr *)&saddr); ++ ++ int res = getnameinfo((struct sockaddr *)&saddr, ++ (saddr.ss_family == AF_INET) ++ ? sizeof(struct sockaddr_in) : sizeof(struct sockaddr_in6), ++ host, sizeof(host), NULL, 0, NI_NAMEREQD); ++ ++#ifdef __linux__ ++ if (timeout > 0 && timeout < 1000) ++ { ++ ualarm(0, 0); ++ sigaction(SIGALRM, &sa_old, NULL); ++ } ++#endif ++ ++ if (res) { ++ lua_pushnil(L); ++ lua_pushinteger(L, res); ++ lua_pushstring(L, gai_strerror(res)); ++ return 3; ++ } else { ++ lua_pushstring(L, host); ++ return 1; ++ } ++} ++ ++/** ++ * getsockname() ++ */ ++static int nixio_sock_getsockname(lua_State *L) { ++ int sockfd = nixio__checksockfd(L); ++ struct sockaddr_storage saddr; ++ socklen_t addrlen = sizeof(saddr); ++ nixio_addr addr; ++ ++ if (getsockname(sockfd, (struct sockaddr*)&saddr, &addrlen) || ++ nixio__addr_parse(&addr, (struct sockaddr*)&saddr)) { ++ return nixio__perror_s(L); ++ } ++ ++ lua_pushstring(L, addr.host); ++ lua_pushinteger(L, addr.port); ++ return 2; ++} ++ ++/** ++ * getpeername() ++ */ ++static int nixio_sock_getpeername(lua_State *L) { ++ int sockfd = nixio__checksockfd(L); ++ struct sockaddr_storage saddr; ++ socklen_t addrlen = sizeof(saddr); ++ nixio_addr addr; ++ ++ if (getpeername(sockfd, (struct sockaddr*)&saddr, &addrlen) || ++ nixio__addr_parse(&addr, (struct sockaddr*)&saddr)) { ++ return nixio__perror_s(L); ++ } ++ ++ lua_pushstring(L, addr.host); ++ lua_pushinteger(L, addr.port); ++ return 2; ++} ++ ++#if defined(__linux__) || defined(BSD) ++#ifdef BSD ++#include ++#endif ++#include ++ ++static int nixio_getifaddrs(lua_State *L) { ++ nixio_addr addr; ++ struct ifaddrs *ifaddr, *c; ++ if (getifaddrs(&ifaddr) == -1) { ++ return nixio__perror(L); ++ } ++ ++ lua_newtable(L); ++ unsigned int i = 1; ++ ++ for (c = ifaddr; c; c = c->ifa_next) { ++ lua_newtable(L); ++ ++ lua_pushstring(L, c->ifa_name); ++ lua_setfield(L, -2, "name"); ++ ++ lua_createtable(L, 0, 7); ++ lua_pushboolean(L, c->ifa_flags & IFF_UP); ++ lua_setfield(L, -2, "up"); ++ ++ lua_pushboolean(L, c->ifa_flags & IFF_BROADCAST); ++ lua_setfield(L, -2, "broadcast"); ++ ++ lua_pushboolean(L, c->ifa_flags & IFF_LOOPBACK); ++ lua_setfield(L, -2, "loopback"); ++ ++ lua_pushboolean(L, c->ifa_flags & IFF_POINTOPOINT); ++ lua_setfield(L, -2, "pointtopoint"); ++ ++ lua_pushboolean(L, c->ifa_flags & IFF_NOARP); ++ lua_setfield(L, -2, "noarp"); ++ ++ lua_pushboolean(L, c->ifa_flags & IFF_PROMISC); ++ lua_setfield(L, -2, "promisc"); ++ ++ lua_pushboolean(L, c->ifa_flags & IFF_MULTICAST); ++ lua_setfield(L, -2, "multicast"); ++ lua_setfield(L, -2, "flags"); ++ ++ if (c->ifa_addr) { ++ if (!nixio__addr_parse(&addr, c->ifa_addr)) { ++ lua_pushstring(L, addr.host); ++ lua_setfield(L, -2, "addr"); ++ } ++ ++ if (c->ifa_addr->sa_family == AF_INET) { ++ lua_pushliteral(L, "inet"); ++ } else if (c->ifa_addr->sa_family == AF_INET6) { ++ lua_pushliteral(L, "inet6"); ++#ifdef AF_PACKET ++ } else if (c->ifa_addr->sa_family == AF_PACKET) { ++ lua_pushliteral(L, "packet"); ++#endif ++ } else { ++ lua_pushliteral(L, "unknown"); ++ } ++ lua_setfield(L, -2, "family"); ++ ++#ifdef __linux__ ++ if (c->ifa_addr->sa_family == AF_PACKET) { ++ lua_pushinteger(L, addr.port); ++ lua_setfield(L, -2, "ifindex"); ++ ++ lua_pushinteger(L, addr.prefix); ++ lua_setfield(L, -2, "hatype"); ++ } ++#endif ++ } ++ ++#ifdef __linux__ ++ if (c->ifa_data && (!c->ifa_addr ++ || c->ifa_addr->sa_family == AF_PACKET)) { ++ if (!c->ifa_addr) { ++ lua_pushliteral(L, "packet"); ++ lua_setfield(L, -2, "family"); ++ } ++ ++ lua_createtable(L, 0, 10); ++ struct nixio__nds *stats = c->ifa_data; ++ ++ lua_pushnumber(L, stats->rx_packets); ++ lua_setfield(L, -2, "rx_packets"); ++ ++ lua_pushnumber(L, stats->tx_packets); ++ lua_setfield(L, -2, "tx_packets"); ++ ++ lua_pushnumber(L, stats->rx_bytes); ++ lua_setfield(L, -2, "rx_bytes"); ++ ++ lua_pushnumber(L, stats->tx_bytes); ++ lua_setfield(L, -2, "tx_bytes"); ++ ++ lua_pushnumber(L, stats->rx_errors); ++ lua_setfield(L, -2, "rx_errors"); ++ ++ lua_pushnumber(L, stats->tx_errors); ++ lua_setfield(L, -2, "tx_errors"); ++ ++ lua_pushnumber(L, stats->rx_dropped); ++ lua_setfield(L, -2, "rx_dropped"); ++ ++ lua_pushnumber(L, stats->tx_dropped); ++ lua_setfield(L, -2, "tx_dropped"); ++ ++ lua_pushnumber(L, stats->multicast); ++ lua_setfield(L, -2, "multicast"); ++ ++ lua_pushnumber(L, stats->collisions); ++ lua_setfield(L, -2, "collisions"); ++ } else { ++ lua_newtable(L); ++ } ++ lua_setfield(L, -2, "data"); ++#endif ++ ++ if (c->ifa_netmask && !nixio__addr_parse(&addr, c->ifa_netmask)) { ++ lua_pushstring(L, addr.host); ++ lua_setfield(L, -2, "netmask"); ++ ++ lua_pushinteger(L, nixio__addr_prefix(c->ifa_netmask)); ++ lua_setfield(L, -2, "prefix"); ++ } ++ ++ if (c->ifa_broadaddr && !nixio__addr_parse(&addr, c->ifa_broadaddr)) { ++ lua_pushstring(L, addr.host); ++ lua_setfield(L, -2, "broadaddr"); ++ } ++ ++ if (c->ifa_dstaddr && !nixio__addr_parse(&addr, c->ifa_dstaddr)) { ++ lua_pushstring(L, addr.host); ++ lua_setfield(L, -2, "dstaddr"); ++ } ++ ++ lua_rawseti(L, -2, i++); ++ } ++ ++ freeifaddrs(ifaddr); ++ return 1; ++} ++#endif ++ ++ ++/* module table */ ++static const luaL_reg R[] = { ++#if defined(__linux__) || defined(BSD) ++ {"getifaddrs", nixio_getifaddrs}, ++#endif ++ {"getaddrinfo", nixio_getaddrinfo}, ++ {"getnameinfo", nixio_getnameinfo}, ++ {NULL, NULL} ++}; ++ ++/* object table */ ++static const luaL_reg M[] = { ++ {"getsockname", nixio_sock_getsockname}, ++ {"getpeername", nixio_sock_getpeername}, ++ {NULL, NULL} ++}; ++ ++void nixio_open_address(lua_State *L) { ++ luaL_register(L, NULL, R); ++ ++ lua_pushvalue(L, -2); ++ luaL_register(L, NULL, M); ++ lua_pop(L, 1); ++} +diff --git a/feeds/luci/libs/luci-lib-nixio/src/axtls-compat.c b/feeds/luci/libs/luci-lib-nixio/src/axtls-compat.c +new file mode 100644 +index 0000000..2c5b746 +--- /dev/null ++++ b/feeds/luci/libs/luci-lib-nixio/src/axtls-compat.c +@@ -0,0 +1,297 @@ ++/* ++ * Copyright (c) 2007, Cameron Rich ++ * ++ * All rights reserved. ++ * ++ * Redistribution and use in source and binary forms, with or without ++ * modification, are permitted provided that the following conditions are met: ++ * ++ * * Redistributions of source code must retain the above copyright notice, ++ * this list of conditions and the following disclaimer. ++ * * 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. ++ * * Neither the name of the axTLS project nor the names of its contributors ++ * may be used to endorse or promote products derived from this software ++ * without specific prior written permission. ++ * ++ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ++ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT ++ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR ++ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR ++ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, ++ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, ++ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR ++ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF ++ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING ++ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS ++ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ++ */ ++ ++/* ++ * Enable a subset of openssl compatible functions. We don't aim to be 100% ++ * compatible - just to be able to do basic ports etc. ++ * ++ * Only really tested on mini_httpd, so I'm not too sure how extensive this ++ * port is. ++ */ ++ ++#include "config.h" ++ ++#include ++#include ++#include ++#include "ssl.h" ++ ++static char *key_password = NULL; ++ ++void *SSLv23_server_method(void) { return NULL; } ++void *SSLv3_server_method(void) { return NULL; } ++void *TLSv1_server_method(void) { return NULL; } ++void *SSLv23_client_method(void) { return NULL; } ++void *SSLv3_client_method(void) { return NULL; } ++void *TLSv1_client_method(void) { return NULL; } ++void *SSLv23_method(void) { return NULL; } ++void *TLSv1_method(void) { return NULL; } ++ ++SSL_CTX * SSL_CTX_new(void *meth) ++{ ++ SSL_CTX *ssl_ctx = ssl_ctx_new(SSL_SERVER_VERIFY_LATER, 5); ++ return ssl_ctx; ++} ++ ++void SSL_CTX_free(SSL_CTX * ssl_ctx) ++{ ++ ssl_ctx_free(ssl_ctx); ++} ++ ++SSL * SSL_new(SSL_CTX *ssl_ctx) ++{ ++ SSL *ssl; ++ ++ ssl = ssl_new(ssl_ctx, -1); /* fd is set later */ ++ ++ return ssl; ++} ++ ++int SSL_set_fd(SSL *s, int fd) ++{ ++ s->client_fd = fd; ++ return 1; /* always succeeds */ ++} ++ ++int SSL_accept(SSL *ssl) ++{ ++ ssl->next_state = HS_CLIENT_HELLO; ++ while (ssl_read(ssl, NULL) == SSL_OK) ++ { ++ if (ssl->next_state == HS_CLIENT_HELLO) ++ return 1; /* we're done */ ++ } ++ ++ return -1; ++} ++ ++int SSL_connect(SSL *ssl) ++{ ++ SET_SSL_FLAG(SSL_IS_CLIENT); ++ int stat = do_client_connect(ssl); ++ ssl_display_error(stat); ++ return (stat == SSL_OK) ? 1 : -1; ++} ++ ++void SSL_free(SSL *ssl) ++{ ++ ssl_free(ssl); ++} ++ ++int SSL_read(SSL *ssl, void *buf, int num) ++{ ++ uint8_t *read_buf; ++ int ret; ++ ++ while ((ret = ssl_read(ssl, &read_buf)) == SSL_OK); ++ ++ if (ret > SSL_OK) ++ { ++ memcpy(buf, read_buf, ret > num ? num : ret); ++ } ++ ++ return ret; ++} ++ ++int SSL_write(SSL *ssl, const void *buf, int num) ++{ ++ return ssl_write(ssl, buf, num); ++} ++ ++int SSL_CTX_use_certificate_file(SSL_CTX *ssl_ctx, const char *file, int type) ++{ ++ return (ssl_obj_load(ssl_ctx, SSL_OBJ_X509_CERT, file, NULL) == SSL_OK); ++} ++ ++int SSL_CTX_use_PrivateKey_file(SSL_CTX *ssl_ctx, const char *file, int type) ++{ ++ return (ssl_obj_load(ssl_ctx, SSL_OBJ_RSA_KEY, file, key_password) == SSL_OK); ++} ++ ++int SSL_CTX_use_certificate_ASN1(SSL_CTX *ssl_ctx, int len, const uint8_t *d) ++{ ++ return (ssl_obj_memory_load(ssl_ctx, ++ SSL_OBJ_X509_CERT, d, len, NULL) == SSL_OK); ++} ++ ++int SSL_CTX_set_session_id_context(SSL_CTX *ctx, const unsigned char *sid_ctx, ++ unsigned int sid_ctx_len) ++{ ++ return 1; ++} ++ ++int SSL_CTX_set_default_verify_paths(SSL_CTX *ctx) ++{ ++ return 1; ++} ++ ++int SSL_CTX_use_certificate_chain_file(SSL_CTX *ssl_ctx, const char *file) ++{ ++ return (ssl_obj_load(ssl_ctx, ++ SSL_OBJ_X509_CERT, file, NULL) == SSL_OK); ++} ++ ++int SSL_shutdown(SSL *ssl) ++{ ++ return 1; ++} ++ ++/*** get/set session ***/ ++SSL_SESSION *SSL_get1_session(SSL *ssl) ++{ ++ return (SSL_SESSION *)ssl_get_session_id(ssl); /* note: wrong cast */ ++} ++ ++int SSL_set_session(SSL *ssl, SSL_SESSION *session) ++{ ++ memcpy(ssl->session_id, (uint8_t *)session, SSL_SESSION_ID_SIZE); ++ return 1; ++} ++ ++void SSL_SESSION_free(SSL_SESSION *session) { } ++/*** end get/set session ***/ ++ ++long SSL_CTX_ctrl(SSL_CTX *ctx, int cmd, long larg, void *parg) ++{ ++ return 0; ++} ++ ++void SSL_CTX_set_verify(SSL_CTX *ctx, int mode, ++ int (*verify_callback)(int, void *)) { ++ if (mode & SSL_VERIFY_PEER) { ++ ctx->options &= ~SSL_SERVER_VERIFY_LATER; ++ ctx->options |= SSL_CLIENT_AUTHENTICATION; ++ } else { ++ ctx->options |= SSL_SERVER_VERIFY_LATER; ++ ctx->options &= ~SSL_CLIENT_AUTHENTICATION; ++ } ++} ++ ++void SSL_CTX_set_verify_depth(SSL_CTX *ctx,int depth) { } ++ ++int SSL_CTX_load_verify_locations(SSL_CTX *ctx, const char *CAfile, ++ const char *CApath) ++{ ++ return 1; ++} ++ ++void *SSL_load_client_CA_file(const char *file) ++{ ++ return (void *)file; ++} ++ ++void SSL_CTX_set_client_CA_list(SSL_CTX *ssl_ctx, void *file) ++{ ++ ++ ssl_obj_load(ssl_ctx, SSL_OBJ_X509_CERT, (const char *)file, NULL); ++} ++ ++void SSL_CTX_set_default_passwd_cb(SSL_CTX *ctx, void *cb) { } ++ ++void SSL_CTX_set_default_passwd_cb_userdata(SSL_CTX *ctx, void *u) ++{ ++ key_password = (char *)u; ++} ++ ++int SSL_peek(SSL *ssl, void *buf, int num) ++{ ++ memcpy(buf, ssl->bm_data, num); ++ return num; ++} ++ ++void SSL_set_bio(SSL *ssl, void *rbio, void *wbio) { } ++ ++long SSL_get_verify_result(const SSL *ssl) ++{ ++ return ssl_handshake_status(ssl); ++} ++ ++int SSL_state(SSL *ssl) ++{ ++ return 0x03; // ok state ++} ++ ++/** end of could do better list */ ++ ++void *SSL_get_peer_certificate(const SSL *ssl) ++{ ++ return &ssl->ssl_ctx->certs[0]; ++} ++ ++int SSL_clear(SSL *ssl) ++{ ++ return 1; ++} ++ ++ ++int SSL_CTX_check_private_key(const SSL_CTX *ctx) ++{ ++ return 1; ++} ++ ++int SSL_CTX_set_cipher_list(SSL_CTX *s, const char *str) ++{ ++ return 1; ++} ++ ++int SSL_get_error(const SSL *ssl, int ret) ++{ ++ ssl_display_error(ret); ++ return ret; /* TODO: return proper return code */ ++} ++ ++void SSL_CTX_set_options(SSL_CTX *ssl_ctx, int option) {} ++int SSL_library_init(void ) { return 1; } ++void SSL_load_error_strings(void ) {} ++void ERR_print_errors_fp(FILE *fp) {} ++ ++long SSL_CTX_get_timeout(const SSL_CTX *ssl_ctx) { ++ return CONFIG_SSL_EXPIRY_TIME*3600; } ++long SSL_CTX_set_timeout(SSL_CTX *ssl_ctx, long t) { ++ return SSL_CTX_get_timeout(ssl_ctx); } ++void BIO_printf(FILE *f, const char *format, ...) ++{ ++ va_list(ap); ++ va_start(ap, format); ++ vfprintf(f, format, ap); ++ va_end(ap); ++} ++ ++void* BIO_s_null(void) { return NULL; } ++FILE *BIO_new(bio_func_type_t func) ++{ ++ if (func == BIO_s_null) ++ return fopen("/dev/null", "r"); ++ else ++ return NULL; ++} ++ ++FILE *BIO_new_fp(FILE *stream, int close_flag) { return stream; } ++int BIO_free(FILE *a) { if (a != stdout && a != stderr) fclose(a); return 1; } +diff --git a/feeds/luci/libs/luci-lib-nixio/src/axtls-compat.h b/feeds/luci/libs/luci-lib-nixio/src/axtls-compat.h +new file mode 100644 +index 0000000..aee24f5 +--- /dev/null ++++ b/feeds/luci/libs/luci-lib-nixio/src/axtls-compat.h +@@ -0,0 +1,150 @@ ++/* ++ * Copyright (c) 2007, Cameron Rich ++ * ++ * All rights reserved. ++ * ++ * Redistribution and use in source and binary forms, with or without ++ * modification, are permitted provided that the following conditions are met: ++ * ++ * * Redistributions of source code must retain the above copyright notice, ++ * this list of conditions and the following disclaimer. ++ * * 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. ++ * * Neither the name of the axTLS project nor the names of its contributors ++ * may be used to endorse or promote products derived from this software ++ * without specific prior written permission. ++ * ++ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ++ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT ++ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR ++ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR ++ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, ++ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, ++ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR ++ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF ++ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING ++ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS ++ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ++ */ ++ ++/* ++ * Enable a subset of openssl compatible functions. We don't aim to be 100% ++ * compatible - just to be able to do basic ports etc. ++ * ++ * Only really tested on mini_httpd, so I'm not too sure how extensive this ++ * port is. ++ */ ++ ++#include "nixio.h" ++#include "config.h" ++ ++#define WITH_AXTLS 1 ++#define WITHOUT_OPENSSL 1 ++#define SSL_OP_NO_SSLv3 0x02000000L ++#define SSL_OP_NO_SSLv2 0x01000000L ++#define SSL_FILETYPE_PEM 1 ++#define SSL_FILETYPE_ASN1 2 ++#define SSL_VERIFY_NONE 0x00 ++#define SSL_VERIFY_PEER 0x01 ++#define SSL_VERIFY_FAIL_IF_NO_PEER_CERT 0x02 ++#define SSL_VERIFY_CLIENT_ONCE 0x03 ++#define MD5_DIGEST_LENGTH 16 ++#define SHA_DIGEST_LENGTH 20 ++ ++#include ++#include ++#include ++#include "ssl.h" ++ ++typedef SHA1_CTX SHA_CTX; ++ ++void *SSLv23_server_method(void); ++void *SSLv3_server_method(void); ++void *TLSv1_server_method(void); ++void *SSLv23_client_method(void); ++void *SSLv3_client_method(void); ++void *TLSv1_client_method(void); ++void *SSLv23_method(void); ++void *TLSv1_method(void); ++ ++ ++typedef void * (*ssl_func_type_t)(void); ++typedef void * (*bio_func_type_t)(void); ++ ++SSL_CTX * SSL_CTX_new(void *meth); ++void SSL_CTX_free(SSL_CTX * ssl_ctx); ++SSL * SSL_new(SSL_CTX *ssl_ctx); ++int SSL_set_fd(SSL *s, int fd); ++int SSL_accept(SSL *ssl); ++int SSL_connect(SSL *ssl); ++void SSL_free(SSL *ssl); ++int SSL_read(SSL *ssl, void *buf, int num); ++int SSL_write(SSL *ssl, const void *buf, int num); ++int SSL_CTX_use_certificate_file(SSL_CTX *ssl_ctx, const char *file, int type); ++int SSL_CTX_use_PrivateKey_file(SSL_CTX *ssl_ctx, const char *file, int type); ++int SSL_CTX_use_certificate_ASN1(SSL_CTX *ssl_ctx, int len, const uint8_t *d); ++int SSL_CTX_set_session_id_context(SSL_CTX *ctx, const unsigned char *sid_ctx, ++ unsigned int sid_ctx_len); ++int SSL_CTX_set_default_verify_paths(SSL_CTX *ctx); ++int SSL_CTX_use_certificate_chain_file(SSL_CTX *ssl_ctx, const char *file); ++int SSL_shutdown(SSL *ssl); ++ ++/*** get/set session ***/ ++SSL_SESSION *SSL_get1_session(SSL *ssl); ++int SSL_set_session(SSL *ssl, SSL_SESSION *session); ++void SSL_SESSION_free(SSL_SESSION *session); ++/*** end get/set session ***/ ++ ++long SSL_CTX_ctrl(SSL_CTX *ctx, int cmd, long larg, void *parg); ++void SSL_CTX_set_verify(SSL_CTX *ctx, int mode, ++ int (*verify_callback)(int, void *)); ++ ++void SSL_CTX_set_verify_depth(SSL_CTX *ctx,int depth); ++ ++int SSL_CTX_load_verify_locations(SSL_CTX *ctx, const char *CAfile, ++ const char *CApath); ++ ++void *SSL_load_client_CA_file(const char *file); ++ ++void SSL_CTX_set_client_CA_list(SSL_CTX *ssl_ctx, void *file); ++ ++void SSL_CTX_set_default_passwd_cb(SSL_CTX *ctx, void *cb); ++ ++void SSL_CTX_set_default_passwd_cb_userdata(SSL_CTX *ctx, void *u); ++ ++int SSL_peek(SSL *ssl, void *buf, int num); ++ ++void SSL_set_bio(SSL *ssl, void *rbio, void *wbio); ++ ++long SSL_get_verify_result(const SSL *ssl); ++ ++int SSL_state(SSL *ssl); ++ ++/** end of could do better list */ ++ ++void *SSL_get_peer_certificate(const SSL *ssl); ++ ++int SSL_clear(SSL *ssl); ++ ++ ++int SSL_CTX_check_private_key(const SSL_CTX *ctx); ++ ++int SSL_CTX_set_cipher_list(SSL_CTX *s, const char *str); ++ ++int SSL_get_error(const SSL *ssl, int ret); ++ ++void SSL_CTX_set_options(SSL_CTX *ssl_ctx, int option); ++int SSL_library_init(void ); ++void SSL_load_error_strings(void ); ++void ERR_print_errors_fp(FILE *fp); ++ ++long SSL_CTX_get_timeout(const SSL_CTX *ssl_ctx); ++long SSL_CTX_set_timeout(SSL_CTX *ssl_ctx, long t); ++void BIO_printf(FILE *f, const char *format, ...); ++ ++void* BIO_s_null(void); ++FILE *BIO_new(bio_func_type_t func); ++ ++FILE *BIO_new_fp(FILE *stream, int close_flag); ++int BIO_free(FILE *a); +diff --git a/feeds/luci/libs/luci-lib-nixio/src/binary.c b/feeds/luci/libs/luci-lib-nixio/src/binary.c +new file mode 100644 +index 0000000..2c41622 +--- /dev/null ++++ b/feeds/luci/libs/luci-lib-nixio/src/binary.c +@@ -0,0 +1,313 @@ ++/* ++ * nixio - Linux I/O library for lua ++ * ++ * Copyright (C) 2009 Steven Barth ++ * ++ * Licensed under the Apache License, Version 2.0 (the "License"); ++ * you may not use this file except in compliance with the License. ++ * You may obtain a copy of the License at ++ * ++ * http://www.apache.org/licenses/LICENSE-2.0 ++ * ++ * Unless required by applicable law or agreed to in writing, software ++ * distributed under the License is distributed on an "AS IS" BASIS, ++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. ++ * See the License for the specific language governing permissions and ++ * limitations under the License. ++ */ ++ ++#include "nixio.h" ++#include ++ ++const char nixio__bin2hex[16] = { ++'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f' ++}; ++ ++static unsigned char nixio__b64encode_tbl[] = ++ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; ++ ++static unsigned char nixio__b64decode_tbl[] = { ++ 0x3e, 0xff, 0xff, 0xff, 0x3f, 0x34, 0x35, 0x36, ++ 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0xff, ++ 0xff, 0xff, 0x00, 0xff, 0xff, 0xff, 0x00, 0x01, ++ 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, ++ 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, ++ 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, ++ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x1a, 0x1b, ++ 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23, ++ 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, ++ 0x2c, 0x2d, 0x2e, 0x2f, 0x30, 0x31, 0x32, 0x33 ++}; ++ ++static const uint32_t nixio__crc32_tbl[] = { ++ 0x00000000U, 0x77073096U, 0xee0e612cU, 0x990951baU, 0x076dc419U, ++ 0x706af48fU, 0xe963a535U, 0x9e6495a3U, 0x0edb8832U, 0x79dcb8a4U, ++ 0xe0d5e91eU, 0x97d2d988U, 0x09b64c2bU, 0x7eb17cbdU, 0xe7b82d07U, ++ 0x90bf1d91U, 0x1db71064U, 0x6ab020f2U, 0xf3b97148U, 0x84be41deU, ++ 0x1adad47dU, 0x6ddde4ebU, 0xf4d4b551U, 0x83d385c7U, 0x136c9856U, ++ 0x646ba8c0U, 0xfd62f97aU, 0x8a65c9ecU, 0x14015c4fU, 0x63066cd9U, ++ 0xfa0f3d63U, 0x8d080df5U, 0x3b6e20c8U, 0x4c69105eU, 0xd56041e4U, ++ 0xa2677172U, 0x3c03e4d1U, 0x4b04d447U, 0xd20d85fdU, 0xa50ab56bU, ++ 0x35b5a8faU, 0x42b2986cU, 0xdbbbc9d6U, 0xacbcf940U, 0x32d86ce3U, ++ 0x45df5c75U, 0xdcd60dcfU, 0xabd13d59U, 0x26d930acU, 0x51de003aU, ++ 0xc8d75180U, 0xbfd06116U, 0x21b4f4b5U, 0x56b3c423U, 0xcfba9599U, ++ 0xb8bda50fU, 0x2802b89eU, 0x5f058808U, 0xc60cd9b2U, 0xb10be924U, ++ 0x2f6f7c87U, 0x58684c11U, 0xc1611dabU, 0xb6662d3dU, 0x76dc4190U, ++ 0x01db7106U, 0x98d220bcU, 0xefd5102aU, 0x71b18589U, 0x06b6b51fU, ++ 0x9fbfe4a5U, 0xe8b8d433U, 0x7807c9a2U, 0x0f00f934U, 0x9609a88eU, ++ 0xe10e9818U, 0x7f6a0dbbU, 0x086d3d2dU, 0x91646c97U, 0xe6635c01U, ++ 0x6b6b51f4U, 0x1c6c6162U, 0x856530d8U, 0xf262004eU, 0x6c0695edU, ++ 0x1b01a57bU, 0x8208f4c1U, 0xf50fc457U, 0x65b0d9c6U, 0x12b7e950U, ++ 0x8bbeb8eaU, 0xfcb9887cU, 0x62dd1ddfU, 0x15da2d49U, 0x8cd37cf3U, ++ 0xfbd44c65U, 0x4db26158U, 0x3ab551ceU, 0xa3bc0074U, 0xd4bb30e2U, ++ 0x4adfa541U, 0x3dd895d7U, 0xa4d1c46dU, 0xd3d6f4fbU, 0x4369e96aU, ++ 0x346ed9fcU, 0xad678846U, 0xda60b8d0U, 0x44042d73U, 0x33031de5U, ++ 0xaa0a4c5fU, 0xdd0d7cc9U, 0x5005713cU, 0x270241aaU, 0xbe0b1010U, ++ 0xc90c2086U, 0x5768b525U, 0x206f85b3U, 0xb966d409U, 0xce61e49fU, ++ 0x5edef90eU, 0x29d9c998U, 0xb0d09822U, 0xc7d7a8b4U, 0x59b33d17U, ++ 0x2eb40d81U, 0xb7bd5c3bU, 0xc0ba6cadU, 0xedb88320U, 0x9abfb3b6U, ++ 0x03b6e20cU, 0x74b1d29aU, 0xead54739U, 0x9dd277afU, 0x04db2615U, ++ 0x73dc1683U, 0xe3630b12U, 0x94643b84U, 0x0d6d6a3eU, 0x7a6a5aa8U, ++ 0xe40ecf0bU, 0x9309ff9dU, 0x0a00ae27U, 0x7d079eb1U, 0xf00f9344U, ++ 0x8708a3d2U, 0x1e01f268U, 0x6906c2feU, 0xf762575dU, 0x806567cbU, ++ 0x196c3671U, 0x6e6b06e7U, 0xfed41b76U, 0x89d32be0U, 0x10da7a5aU, ++ 0x67dd4accU, 0xf9b9df6fU, 0x8ebeeff9U, 0x17b7be43U, 0x60b08ed5U, ++ 0xd6d6a3e8U, 0xa1d1937eU, 0x38d8c2c4U, 0x4fdff252U, 0xd1bb67f1U, ++ 0xa6bc5767U, 0x3fb506ddU, 0x48b2364bU, 0xd80d2bdaU, 0xaf0a1b4cU, ++ 0x36034af6U, 0x41047a60U, 0xdf60efc3U, 0xa867df55U, 0x316e8eefU, ++ 0x4669be79U, 0xcb61b38cU, 0xbc66831aU, 0x256fd2a0U, 0x5268e236U, ++ 0xcc0c7795U, 0xbb0b4703U, 0x220216b9U, 0x5505262fU, 0xc5ba3bbeU, ++ 0xb2bd0b28U, 0x2bb45a92U, 0x5cb36a04U, 0xc2d7ffa7U, 0xb5d0cf31U, ++ 0x2cd99e8bU, 0x5bdeae1dU, 0x9b64c2b0U, 0xec63f226U, 0x756aa39cU, ++ 0x026d930aU, 0x9c0906a9U, 0xeb0e363fU, 0x72076785U, 0x05005713U, ++ 0x95bf4a82U, 0xe2b87a14U, 0x7bb12baeU, 0x0cb61b38U, 0x92d28e9bU, ++ 0xe5d5be0dU, 0x7cdcefb7U, 0x0bdbdf21U, 0x86d3d2d4U, 0xf1d4e242U, ++ 0x68ddb3f8U, 0x1fda836eU, 0x81be16cdU, 0xf6b9265bU, 0x6fb077e1U, ++ 0x18b74777U, 0x88085ae6U, 0xff0f6a70U, 0x66063bcaU, 0x11010b5cU, ++ 0x8f659effU, 0xf862ae69U, 0x616bffd3U, 0x166ccf45U, 0xa00ae278U, ++ 0xd70dd2eeU, 0x4e048354U, 0x3903b3c2U, 0xa7672661U, 0xd06016f7U, ++ 0x4969474dU, 0x3e6e77dbU, 0xaed16a4aU, 0xd9d65adcU, 0x40df0b66U, ++ 0x37d83bf0U, 0xa9bcae53U, 0xdebb9ec5U, 0x47b2cf7fU, 0x30b5ffe9U, ++ 0xbdbdf21cU, 0xcabac28aU, 0x53b39330U, 0x24b4a3a6U, 0xbad03605U, ++ 0xcdd70693U, 0x54de5729U, 0x23d967bfU, 0xb3667a2eU, 0xc4614ab8U, ++ 0x5d681b02U, 0x2a6f2b94U, 0xb40bbe37U, 0xc30c8ea1U, 0x5a05df1bU, ++ 0x2d02ef8dU ++}; ++ ++static int nixio_bin_crc32(lua_State *L) { ++ size_t len; ++ const char *buffer = luaL_checklstring(L, 1, &len); ++ uint32_t value = luaL_optinteger(L, 2, 0); ++ ++ value = ~value; ++ for (size_t i=0; i> 8); ++ } ++ ++ lua_pushinteger(L, (int)(value ^ 0xffffffffU)); ++ return 1; ++} ++ ++static int nixio_bin_hexlify(lua_State *L) { ++ size_t len, lenout; ++ luaL_checktype(L, 1, LUA_TSTRING); ++ const unsigned char *data = (unsigned char*)lua_tolstring(L, 1, &len); ++ ++ if (len == 0) { ++ lua_pushvalue(L, 1); ++ return 1; ++ } ++ ++ lenout = len * 2; ++ luaL_argcheck(L, lenout > len, 1, "size overflow"); ++ ++ char *out = malloc(lenout); ++ if (!out) { ++ return luaL_error(L, NIXIO_OOM); ++ } ++ ++ for (size_t i=0; i < len; i++) { ++ out[2*i] = nixio__bin2hex[(data[i] & 0xf0) >> 4]; ++ out[2*i+1] = nixio__bin2hex[(data[i] & 0x0f)]; ++ } ++ ++ lua_pushlstring(L, out, lenout); ++ free(out); ++ ++ return 1; ++} ++ ++ ++static int nixio_bin_unhexlify(lua_State *L) { ++ size_t len, lenout; ++ const char *data = luaL_checklstring(L, 1, &len); ++ ++ if (len == 0) { ++ lua_pushvalue(L, 1); ++ return 1; ++ } else if (len % 2) { ++ errno = EINVAL; ++ return nixio__perror(L); ++ } ++ ++ lenout = len / 2; ++ char *out = malloc(lenout); ++ if (!out) { ++ return luaL_error(L, NIXIO_OOM); ++ } ++ ++ for (size_t i=0; i < lenout; i++) { ++ char c = data[2*i]; ++ if (c >= '0' && c <= '9') { ++ out[i] = (c - '0') << 4; ++ } else if (c >= 'a' && c <= 'f') { ++ out[i] = (c - 'a' + 10) << 4; ++ } else if (data[2*i] >= 'A' && c <= 'F') { ++ out[i] = (c - 'A' + 10) << 4; ++ } else { ++ free(out); ++ errno = EINVAL; ++ return nixio__perror(L); ++ } ++ ++ c = data[2*i+1]; ++ if (c >= '0' && c <= '9') { ++ out[i] += c - '0'; ++ } else if (c >= 'a' && c <= 'f') { ++ out[i] += c - 'a' + 10; ++ } else if (c >= 'A' && c <= 'F') { ++ out[i] += c - 'A' + 10; ++ } else { ++ free(out); ++ errno = EINVAL; ++ return nixio__perror(L); ++ } ++ } ++ ++ lua_pushlstring(L, out, lenout); ++ free(out); ++ ++ return 1; ++} ++ ++static int nixio_bin_b64encode(lua_State *L) { ++ size_t len, lenout, pad, i; ++ const uint8_t *data = (const uint8_t*)luaL_checklstring(L, 1, &len); ++ ++ lenout = len / 3; ++ lenout *= 4; ++ ++ pad = len % 3; ++ ++ if (len == 0) { ++ lua_pushvalue(L, 1); ++ return 1; ++ } else if (pad) { ++ lenout += 4; ++ } ++ ++ luaL_argcheck(L, lenout > len, 1, "size overflow"); ++ ++ char *out = malloc(lenout); ++ if (!out) { ++ return luaL_error(L, NIXIO_OOM); ++ } ++ ++ uint8_t *o = (uint8_t*)out; ++ for (i = 0; i < len; i += 3) { ++ uint32_t cv = (data[i] << 16) | (data[i+1] << 8) | data[i+2]; ++ *(o+3) = nixio__b64encode_tbl[ cv & 0x3f]; ++ *(o+2) = nixio__b64encode_tbl[(cv >> 6) & 0x3f]; ++ *(o+1) = nixio__b64encode_tbl[(cv >> 12) & 0x3f]; ++ *o = nixio__b64encode_tbl[(cv >> 18) & 0x3f]; ++ o += 4; ++ } ++ ++ if (pad) { ++ uint32_t cv = data[len-pad] << 16; ++ *(o-1) = '='; ++ *(o-2) = '='; ++ if (pad == 2) { ++ cv |= data[len-pad+1] << 8; ++ *(o-2) = nixio__b64encode_tbl[(cv >> 6) & 0x3f]; ++ } ++ *(o-3) = nixio__b64encode_tbl[(cv >> 12) & 0x3f]; ++ *(o-4) = nixio__b64encode_tbl[(cv >> 18) & 0x3f]; ++ } ++ ++ lua_pushlstring(L, out, lenout); ++ free(out); ++ return 1; ++} ++ ++static int nixio_bin_b64decode(lua_State *L) { ++ size_t len, lenout, i; ++ const char *dt = luaL_checklstring(L, 1, &len); ++ ++ if (len == 0) { ++ lua_pushvalue(L, 1); ++ return 1; ++ } else if (len % 4) { ++ errno = EINVAL; ++ return nixio__perror(L); ++ } ++ ++ lenout = len / 4 * 3; ++ ++ unsigned char *out = malloc(lenout); ++ if (!out) { ++ return luaL_error(L, NIXIO_OOM); ++ } ++ ++ unsigned char *o = out; ++ for (i = 0; i < len; i += 4) { ++ uint32_t cv = 0; ++ for (int j = 0; j < 4; j++) { ++ unsigned char c = dt[i + j] - 43; ++ if (c > 79 || (c = nixio__b64decode_tbl[c]) == 0xff) { ++ free(out); ++ errno = EINVAL; ++ return nixio__perror(L); ++ } ++ ++ cv |= c; ++ if (j != 3) { ++ cv <<= 6; ++ } ++ } ++ ++ *(o+2) = (unsigned char)(cv & 0xff); ++ *(o+1) = (unsigned char)((cv >> 8) & 0xff); ++ *o = (unsigned char)((cv >> 16) & 0xff); ++ o += 3; ++ } ++ ++ if (dt[len-1] == '=') { ++ lenout--; ++ } ++ ++ if (dt[len-2] == '=') { ++ lenout--; ++ } ++ ++ lua_pushlstring(L, (char*)out, lenout); ++ free(out); ++ return 1; ++} ++ ++/* module table */ ++static const luaL_reg R[] = { ++ {"hexlify", nixio_bin_hexlify}, ++ {"unhexlify", nixio_bin_unhexlify}, ++ {"crc32", nixio_bin_crc32}, ++ {"b64encode", nixio_bin_b64encode}, ++ {"b64decode", nixio_bin_b64decode}, ++ {NULL, NULL} ++}; ++ ++ ++void nixio_open_bin(lua_State *L) { ++ lua_newtable(L); ++ luaL_register(L, NULL, R); ++ lua_setfield(L, -2, "bin"); ++} +diff --git a/feeds/luci/libs/luci-lib-nixio/src/bind.c b/feeds/luci/libs/luci-lib-nixio/src/bind.c +new file mode 100644 +index 0000000..68e1df8 +--- /dev/null ++++ b/feeds/luci/libs/luci-lib-nixio/src/bind.c +@@ -0,0 +1,293 @@ ++/* ++ * nixio - Linux I/O library for lua ++ * ++ * Copyright (C) 2009 Steven Barth ++ * ++ * Licensed under the Apache License, Version 2.0 (the "License"); ++ * you may not use this file except in compliance with the License. ++ * You may obtain a copy of the License at ++ * ++ * http://www.apache.org/licenses/LICENSE-2.0 ++ * ++ * Unless required by applicable law or agreed to in writing, software ++ * distributed under the License is distributed on an "AS IS" BASIS, ++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. ++ * See the License for the specific language governing permissions and ++ * limitations under the License. ++ */ ++ ++#include "nixio.h" ++#include ++#include ++#include ++#include ++ ++ ++/** ++ * connect()/bind() shortcut ++ */ ++static int nixio__bind_connect(lua_State *L, int do_bind) { ++ const char *host = NULL; ++ if (!lua_isnoneornil(L, 1)) { ++ host = luaL_checklstring(L, 1, NULL); ++ } ++ const char *port = luaL_checklstring(L, 2, NULL); ++ const char *family = luaL_optlstring(L, 3, "any", NULL); ++ const char *socktype = luaL_optlstring(L, 4, "stream", NULL); ++ ++ struct addrinfo hints, *result, *rp; ++ memset(&hints, 0, sizeof(hints)); ++ ++ if (!strcmp(family, "any")) { ++ hints.ai_family = AF_UNSPEC; ++ } else if (!strcmp(family, "inet")) { ++ hints.ai_family = AF_INET; ++ } else if (!strcmp(family, "inet6")) { ++ hints.ai_family = AF_INET6; ++ } else { ++ return luaL_argerror(L, 3, "supported values: any, inet, inet6"); ++ } ++ ++ if (!strcmp(socktype, "any")) { ++ hints.ai_socktype = 0; ++ } else if (!strcmp(socktype, "stream")) { ++ hints.ai_socktype = SOCK_STREAM; ++ } else if (!strcmp(socktype, "dgram")) { ++ hints.ai_socktype = SOCK_DGRAM; ++ } else { ++ return luaL_argerror(L, 4, "supported values: any, stream, dgram"); ++ } ++ ++ if (do_bind) { ++ hints.ai_flags |= AI_PASSIVE; ++ } ++ ++ hints.ai_protocol = 0; ++ ++ int aistat = getaddrinfo(host, port, &hints, &result); ++ if (aistat) { ++ lua_pushnil(L); ++ lua_pushinteger(L, aistat); ++ lua_pushstring(L, gai_strerror(aistat)); ++ return 3; ++ } ++ ++ /* create socket object */ ++ nixio_sock *sock = lua_newuserdata(L, sizeof(nixio_sock)); ++ int status = -1, clstat; ++ ++ for (rp = result; rp != NULL; rp = rp->ai_next) { ++ sock->fd = socket(rp->ai_family, rp->ai_socktype, rp->ai_protocol); ++ if (sock->fd == -1) { ++ continue; ++ } ++ ++ if (do_bind) { ++ int one = 1; ++ setsockopt(sock->fd, SOL_SOCKET, SO_REUSEADDR, ++ (char*)&one, sizeof(one)); ++ status = bind(sock->fd, rp->ai_addr, rp->ai_addrlen); ++ } else { ++ do { ++ status = connect(sock->fd, rp->ai_addr, rp->ai_addrlen); ++ } while (status == -1 && errno == EINTR); ++ } ++ ++ /* on success */ ++ if (!status) { ++ sock->domain = rp->ai_family; ++ sock->type = rp->ai_socktype; ++ sock->protocol = rp->ai_protocol; ++ break; ++ } ++ ++ do { ++#ifndef __WINNT__ ++ clstat = close(sock->fd); ++#else ++ clstat = closesocket(sock->fd); ++#endif ++ } while (clstat == -1 && errno == EINTR); ++ } ++ ++ freeaddrinfo(result); ++ ++ /* on failure */ ++ if (status) { ++ return nixio__perror_s(L); ++ } ++ ++ luaL_getmetatable(L, NIXIO_META); ++ lua_setmetatable(L, -2); ++ ++ return 1; ++} ++ ++/** ++ * bind(host, port, [family=any], [type=any]) shortcut ++ */ ++static int nixio_bind(lua_State *L) { ++ return nixio__bind_connect(L, 1); ++} ++ ++/** ++ * connect(host, port, [family=any], [type=any]) shortcut ++ */ ++static int nixio_connect(lua_State *L) { ++ return nixio__bind_connect(L, 0); ++} ++ ++/** ++ * bind()/connect() helper ++ */ ++static int nixio_sock__bind_connect(lua_State *L, int do_bind) { ++ nixio_sock *sock = nixio__checksock(L); ++ int status = -1; ++ ++ if (sock->domain == AF_INET || sock->domain == AF_INET6) { ++ const char *host = NULL; ++ if (!lua_isnoneornil(L, 2)) { ++ host = luaL_checklstring(L, 2, NULL); ++ } ++ const char *port = luaL_checklstring(L, 3, NULL); ++ ++ struct addrinfo hints, *result, *rp; ++ ++ memset(&hints, 0, sizeof(hints)); ++ hints.ai_family = sock->domain; ++ hints.ai_socktype = sock->type; ++ hints.ai_protocol = sock->protocol; ++ ++ if (do_bind) { ++ hints.ai_flags |= AI_PASSIVE; ++ } ++ ++ int aistat = getaddrinfo(host, port, &hints, &result); ++ if (aistat) { ++ lua_pushnil(L); ++ lua_pushinteger(L, aistat); ++ lua_pushstring(L, gai_strerror(aistat)); ++ return 3; ++ } ++ ++ for (rp = result; rp != NULL; rp = rp->ai_next) { ++ if (do_bind) { ++ status = bind(sock->fd, rp->ai_addr, rp->ai_addrlen); ++ } else { ++ do { ++ status = connect(sock->fd, rp->ai_addr, rp->ai_addrlen); ++ } while (status == -1 && errno == EINTR); ++ } ++ ++ /* on success */ ++ if (!status || errno == EINPROGRESS) { ++ break; ++ } ++ } ++ ++ freeaddrinfo(result); ++#ifndef __WINNT__ ++ } else if (sock->domain == AF_UNIX) { ++ size_t pathlen; ++ const char *path = luaL_checklstring(L, 2, &pathlen); ++ ++ struct sockaddr_un addr; ++ addr.sun_family = AF_UNIX; ++ luaL_argcheck(L, pathlen <= sizeof(addr.sun_path), 2, "out of range"); ++ memcpy(addr.sun_path, path, pathlen); ++ socklen_t alen = sizeof(sa_family_t) + pathlen; ++ ++ if (do_bind) { ++ status = bind(sock->fd, (struct sockaddr*)&addr, alen); ++ } else { ++ do { ++ status = connect(sock->fd, (struct sockaddr*)&addr, alen); ++ } while (status == -1 && errno == EINTR); ++ } ++#endif ++ } else { ++ return luaL_error(L, "not supported"); ++ } ++ return nixio__pstatus_s(L, !status); ++} ++ ++/** ++ * bind() ++ */ ++static int nixio_sock_bind(lua_State *L) { ++ return nixio_sock__bind_connect(L, 1); ++} ++ ++/** ++ * connect() ++ */ ++static int nixio_sock_connect(lua_State *L) { ++ return nixio_sock__bind_connect(L, 0); ++} ++ ++/** ++ * listen() ++ */ ++static int nixio_sock_listen(lua_State *L) { ++ int sockfd = nixio__checksockfd(L); ++ int backlog = luaL_checkinteger(L, 2); ++ return nixio__pstatus_s(L, !listen(sockfd, backlog)); ++} ++ ++/** ++ * accept() ++ */ ++static int nixio_sock_accept(lua_State *L) { ++ nixio_sock *sock = nixio__checksock(L); ++ struct sockaddr_storage saddr; ++ nixio_addr addr; ++ socklen_t saddrlen = sizeof(saddr); ++ int newfd; ++ ++ do { ++ newfd = accept(sock->fd, (struct sockaddr *)&saddr, &saddrlen); ++ } while (newfd == -1 && errno == EINTR); ++ if (newfd < 0) { ++ return nixio__perror_s(L); ++ } ++ ++ /* create userdata */ ++ nixio_sock *clsock = lua_newuserdata(L, sizeof(nixio_sock)); ++ luaL_getmetatable(L, NIXIO_META); ++ lua_setmetatable(L, -2); ++ ++ memcpy(clsock, sock, sizeof(clsock)); ++ clsock->fd = newfd; ++ ++ if (!nixio__addr_parse(&addr, (struct sockaddr *)&saddr)) { ++ lua_pushstring(L, addr.host); ++ lua_pushinteger(L, addr.port); ++ return 3; ++ } else { ++ return 1; ++ } ++} ++ ++/* module table */ ++static const luaL_reg R[] = { ++ {"bind", nixio_bind}, ++ {"connect", nixio_connect}, ++ {NULL, NULL} ++}; ++ ++/* object table */ ++static const luaL_reg M[] = { ++ {"bind", nixio_sock_bind}, ++ {"connect", nixio_sock_connect}, ++ {"listen", nixio_sock_listen}, ++ {"accept", nixio_sock_accept}, ++ {NULL, NULL} ++}; ++ ++void nixio_open_bind(lua_State *L) { ++ luaL_register(L, NULL, R); ++ ++ lua_pushvalue(L, -2); ++ luaL_register(L, NULL, M); ++ lua_pop(L, 1); ++} +diff --git a/feeds/luci/libs/luci-lib-nixio/src/bit.c b/feeds/luci/libs/luci-lib-nixio/src/bit.c +new file mode 100644 +index 0000000..1b352c5 +--- /dev/null ++++ b/feeds/luci/libs/luci-lib-nixio/src/bit.c +@@ -0,0 +1,149 @@ ++/* ++ * nixio - Linux I/O library for lua ++ * ++ * Copyright (C) 2009 Steven Barth ++ * ++ * Licensed under the Apache License, Version 2.0 (the "License"); ++ * you may not use this file except in compliance with the License. ++ * You may obtain a copy of the License at ++ * ++ * http://www.apache.org/licenses/LICENSE-2.0 ++ * ++ * Unless required by applicable law or agreed to in writing, software ++ * distributed under the License is distributed on an "AS IS" BASIS, ++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. ++ * See the License for the specific language governing permissions and ++ * limitations under the License. ++ */ ++ ++#include "nixio.h" ++#include ++#include ++ ++/* 52 bit maximum precision */ ++#ifdef NIXIO_DOUBLE ++#define NIXIO_BIT_BMAX 52 ++#define NIXIO_BIT_NMAX 0xfffffffffffff ++#else ++#define NIXIO_BIT_BMAX 32 ++#define NIXIO_BIT_NMAX 0xffffffff ++#endif ++ ++#define NIXIO_BIT_XOP(BIT_XOP) \ ++ uint64_t oper = nixio__checknumber(L, 1); \ ++ const int args = lua_gettop(L); \ ++ \ ++ for (int i = 2; i <= args; i++) { \ ++ uint64_t oper2 = nixio__checknumber(L, i); \ ++ oper BIT_XOP oper2; \ ++ } \ ++ \ ++ nixio__pushnumber(L, oper); \ ++ return 1; \ ++ ++ ++static int nixio_bit_or(lua_State *L) { ++ NIXIO_BIT_XOP(|=); ++} ++ ++static int nixio_bit_and(lua_State *L) { ++ NIXIO_BIT_XOP(&=); ++} ++ ++static int nixio_bit_xor(lua_State *L) { ++ NIXIO_BIT_XOP(^=); ++} ++ ++static int nixio_bit_unset(lua_State *L) { ++ NIXIO_BIT_XOP(&= ~); ++} ++ ++static int nixio_bit_not(lua_State *L) { ++ nixio__pushnumber(L, ++ (~((uint64_t)nixio__checknumber(L, 1))) & NIXIO_BIT_NMAX); ++ return 1; ++} ++ ++static int nixio_bit_shl(lua_State *L) { ++ uint64_t oper = nixio__checknumber(L, 1); ++ oper <<= luaL_checkinteger(L, 2); ++ if (oper > NIXIO_BIT_NMAX) { ++ return luaL_error(L, "arithmetic overflow"); ++ } else { ++ nixio__pushnumber(L, oper); ++ return 1; ++ } ++} ++ ++static int nixio_bit_ashr(lua_State *L) { ++ int64_t oper = nixio__checknumber(L, 1); ++ nixio__pushnumber(L, oper >> luaL_checkinteger(L, 2)); ++ return 1; ++} ++ ++static int nixio_bit_shr(lua_State *L) { ++ uint64_t oper = nixio__checknumber(L, 1); ++ nixio__pushnumber(L, oper >> luaL_checkinteger(L, 2)); ++ return 1; ++} ++ ++static int nixio_bit_div(lua_State *L) { ++ uint64_t oper = luaL_checknumber(L, 1); ++ const int args = lua_gettop(L); ++ ++ for (int i = 2; i <= args; i++) { ++ uint64_t oper2 = nixio__checknumber(L, i); ++ oper /= oper2; ++ } ++ ++ nixio__pushnumber(L, oper); ++ return 1; ++} ++ ++static int nixio_bit_check(lua_State *L) { ++ uint64_t oper = nixio__checknumber(L, 1); ++ uint64_t oper2 = nixio__checknumber(L, 2); ++ lua_pushboolean(L, (oper & oper2) == oper2); ++ return 1; ++} ++ ++static int nixio_bit_cast(lua_State *L) { ++ nixio__pushnumber(L, ((uint64_t)nixio__checknumber(L, 1)) & NIXIO_BIT_NMAX); ++ return 1; ++} ++ ++static int nixio_bit_swap(lua_State *L) { ++ uint64_t op = nixio__checknumber(L, 1); ++ op = (op >> 24) | ((op >> 8) & 0xff00) | ((op & 0xff00) << 8) | (op << 24); ++ nixio__pushnumber(L, op); ++ return 1; ++} ++ ++/* module table */ ++static const luaL_reg R[] = { ++ {"bor", nixio_bit_or}, ++ {"set", nixio_bit_or}, ++ {"band", nixio_bit_and}, ++ {"bxor", nixio_bit_xor}, ++ {"unset", nixio_bit_unset}, ++ {"bnot", nixio_bit_not}, ++ {"rshift", nixio_bit_shr}, ++ {"arshift", nixio_bit_ashr}, ++ {"lshift", nixio_bit_shl}, ++ {"div", nixio_bit_div}, ++ {"check", nixio_bit_check}, ++ {"cast", nixio_bit_cast}, ++ {"tobit", nixio_bit_cast}, ++ {"bswap", nixio_bit_swap}, ++ {NULL, NULL} ++}; ++ ++void nixio_open_bit(lua_State *L) { ++ lua_newtable(L); ++ luaL_register(L, NULL, R); ++ nixio__pushnumber(L, NIXIO_BIT_BMAX); ++ lua_setfield(L, -2, "bits"); ++ nixio__pushnumber(L, NIXIO_BIT_NMAX); ++ lua_setfield(L, -2, "max"); ++ lua_setfield(L, -2, "bit"); ++} +diff --git a/feeds/luci/libs/luci-lib-nixio/src/cyassl-compat.c b/feeds/luci/libs/luci-lib-nixio/src/cyassl-compat.c +new file mode 100644 +index 0000000..a483119 +--- /dev/null ++++ b/feeds/luci/libs/luci-lib-nixio/src/cyassl-compat.c +@@ -0,0 +1,31 @@ ++#include "cyassl-compat.h" ++ ++int MD5_Init(MD5_CTX *md5) { ++ InitMd5(md5); ++ return 1; ++} ++ ++int MD5_Update(MD5_CTX *md5, void *input, unsigned long sz) { ++ Md5Update(md5, input, (word32)sz); ++ return 1; ++} ++ ++int MD5_Final(void *input, MD5_CTX *md5) { ++ Md5Final(md5, input); ++ return 1; ++} ++ ++int SHA1_Init(SHA_CTX *sha) { ++ InitSha(sha); ++ return 1; ++} ++ ++int SHA1_Update(SHA_CTX *sha, void *input, unsigned long sz) { ++ ShaUpdate(sha, input, (word32)sz); ++ return 1; ++} ++ ++int SHA1_Final(void *input, SHA_CTX *sha) { ++ ShaFinal(sha, input); ++ return 1; ++} +diff --git a/feeds/luci/libs/luci-lib-nixio/src/cyassl-compat.h b/feeds/luci/libs/luci-lib-nixio/src/cyassl-compat.h +new file mode 100644 +index 0000000..b2cdc92 +--- /dev/null ++++ b/feeds/luci/libs/luci-lib-nixio/src/cyassl-compat.h +@@ -0,0 +1,32 @@ ++#define WITH_CYASSL ++#define WITHOUT_OPENSSL ++#include ++ ++typedef unsigned int word32; ++ ++ ++#define MD5_DIGEST_LENGTH 16 ++typedef struct MD5_CTX { ++ int dummy[24]; ++} MD5_CTX; ++ ++void InitMd5(MD5_CTX*); ++void Md5Update(MD5_CTX*, void*, word32); ++void Md5Final(MD5_CTX*, void*); ++ ++ ++#define SHA_DIGEST_LENGTH 20 ++typedef struct SHA_CTX { ++ int dummy[24]; ++} SHA_CTX; ++ ++void InitSha(SHA_CTX*); ++void ShaUpdate(SHA_CTX*, void*, word32); ++void ShaFinal(SHA_CTX*, void*); ++ ++int MD5_Init(MD5_CTX *md5); ++int MD5_Update(MD5_CTX *md5, void *input, unsigned long sz); ++int MD5_Final(void *input, MD5_CTX *md5); ++int SHA1_Init(SHA_CTX *md5); ++int SHA1_Update(SHA_CTX *sha, void *input, unsigned long sz); ++int SHA1_Final(void *input, SHA_CTX *sha); +diff --git a/feeds/luci/libs/luci-lib-nixio/src/file.c b/feeds/luci/libs/luci-lib-nixio/src/file.c +new file mode 100644 +index 0000000..b86e040 +--- /dev/null ++++ b/feeds/luci/libs/luci-lib-nixio/src/file.c +@@ -0,0 +1,402 @@ ++/* ++ * nixio - Linux I/O library for lua ++ * ++ * Copyright (C) 2009 Steven Barth ++ * ++ * Licensed under the Apache License, Version 2.0 (the "License"); ++ * you may not use this file except in compliance with the License. ++ * You may obtain a copy of the License at ++ * ++ * http://www.apache.org/licenses/LICENSE-2.0 ++ * ++ * Unless required by applicable law or agreed to in writing, software ++ * distributed under the License is distributed on an "AS IS" BASIS, ++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. ++ * See the License for the specific language governing permissions and ++ * limitations under the License. ++ */ ++ ++#include "nixio.h" ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++ ++ ++static int nixio_open(lua_State *L) { ++ const char *filename = luaL_checklstring(L, 1, NULL); ++ int flags; ++ ++ if (lua_isnoneornil(L, 2)) { ++ flags = O_RDONLY; ++ } else if (lua_isnumber(L, 2)) { ++ flags = lua_tointeger(L, 2); ++ } else if (lua_isstring(L, 2)) { ++ const char *str = lua_tostring(L, 2); ++ if (!strcmp(str, "r")) { ++ flags = O_RDONLY; ++ } else if (!strcmp(str, "r+")) { ++ flags = O_RDWR; ++ } else if (!strcmp(str, "w")) { ++ flags = O_WRONLY | O_CREAT | O_TRUNC; ++ } else if (!strcmp(str, "w+")) { ++ flags = O_RDWR | O_CREAT | O_TRUNC; ++ } else if (!strcmp(str, "a")) { ++ flags = O_WRONLY | O_CREAT | O_APPEND; ++ } else if (!strcmp(str, "a+")) { ++ flags = O_RDWR | O_CREAT | O_APPEND; ++ } else { ++ return luaL_argerror(L, 2, "supported values: r, r+, w, w+, a, a+"); ++ } ++ } else { ++ return luaL_argerror(L, 2, "open flags or string expected"); ++ } ++ ++ int fd; ++ ++ do { ++ fd = open(filename, flags, nixio__check_mode(L, 3, 0666)); ++ } while (fd == -1 && errno == EINTR); ++ if (fd == -1) { ++ return nixio__perror(L); ++ } ++ ++ int *udata = lua_newuserdata(L, sizeof(int)); ++ if (!udata) { ++ return luaL_error(L, "out of memory"); ++ } ++ ++ *udata = fd; ++ ++ luaL_getmetatable(L, NIXIO_FILE_META); ++ lua_setmetatable(L, -2); ++ ++ return 1; ++} ++ ++static int nixio_open_flags(lua_State *L) { ++ int mode = 0; ++ const int j = lua_gettop(L); ++ for (int i=1; i<=j; i++) { ++ const char *flag = luaL_checkstring(L, i); ++ if (!strcmp(flag, "append")) { ++ mode |= O_APPEND; ++ } else if (!strcmp(flag, "creat")) { ++ mode |= O_CREAT; ++ } else if (!strcmp(flag, "excl")) { ++ mode |= O_EXCL; ++ } else if (!strcmp(flag, "nonblock") || !strcmp(flag, "ndelay")) { ++#ifndef __WINNT__ ++ mode |= O_NONBLOCK; ++#endif ++ } else if (!strcmp(flag, "sync")) { ++#ifndef __WINNT__ ++ mode |= O_SYNC; ++#endif ++ } else if (!strcmp(flag, "trunc")) { ++ mode |= O_TRUNC; ++ } else if (!strcmp(flag, "rdonly")) { ++ mode |= O_RDONLY; ++ } else if (!strcmp(flag, "wronly")) { ++ mode |= O_WRONLY; ++ } else if (!strcmp(flag, "rdwr")) { ++ mode |= O_RDWR; ++ } else { ++ return luaL_argerror(L, i, "supported values: append, creat, " ++ "excl, nonblock, ndelay, sync, trunc"); ++ } ++ } ++ lua_pushinteger(L, mode); ++ return 1; ++} ++ ++static int nixio_dup(lua_State *L) { ++ int oldfd = nixio__checkfd(L, 1); ++ int newfd = (lua_gettop(L) > 1) ? nixio__checkfd(L, 2) : -1; ++ int stat = (newfd == -1) ? dup(oldfd) : dup2(oldfd, newfd); ++ ++ if (stat == -1) { ++ return nixio__perror(L); ++ } else { ++ if (newfd == -1) { ++ int *udata = lua_newuserdata(L, sizeof(int)); ++ if (!udata) { ++ return luaL_error(L, "out of memory"); ++ } ++ ++ *udata = stat; ++ luaL_getmetatable(L, NIXIO_FILE_META); ++ lua_setmetatable(L, -2); ++ } else { ++ lua_pushvalue(L, 2); ++ } ++ return 1; ++ } ++} ++ ++static int nixio_pipe(lua_State *L) { ++ int pipefd[2], *udata; ++ if (pipe(pipefd)) { ++ return nixio__perror(L); ++ } ++ ++ luaL_getmetatable(L, NIXIO_FILE_META); ++ udata = lua_newuserdata(L, sizeof(int)); ++ if (!udata) { ++ return luaL_error(L, "out of memory"); ++ } ++ ++ *udata = pipefd[0]; ++ lua_pushvalue(L, -2); ++ lua_setmetatable(L, -2); ++ ++ ++ udata = lua_newuserdata(L, sizeof(int)); ++ if (!udata) { ++ return luaL_error(L, "out of memory"); ++ } ++ ++ *udata = pipefd[1]; ++ lua_pushvalue(L, -3); ++ lua_setmetatable(L, -2); ++ ++ return 2; ++} ++ ++static int nixio_file_write(lua_State *L) { ++ int fd = nixio__checkfd(L, 1); ++ size_t len; ++ ssize_t sent; ++ const char *data = luaL_checklstring(L, 2, &len); ++ ++ if (lua_gettop(L) > 2) { ++ int offset = luaL_optint(L, 3, 0); ++ if (offset) { ++ if (offset < len) { ++ data += offset; ++ len -= offset; ++ } else { ++ len = 0; ++ } ++ } ++ ++ unsigned int wlen = luaL_optint(L, 4, len); ++ if (wlen < len) { ++ len = wlen; ++ } ++ } ++ ++ do { ++ sent = write(fd, data, len); ++ } while(sent == -1 && errno == EINTR); ++ if (sent >= 0) { ++ lua_pushinteger(L, sent); ++ return 1; ++ } else { ++ return nixio__perror(L); ++ } ++} ++ ++static int nixio_file_read(lua_State *L) { ++ int fd = nixio__checkfd(L, 1); ++ char buffer[NIXIO_BUFFERSIZE]; ++ uint req = luaL_checkinteger(L, 2); ++ int readc; ++ ++ /* We limit the readsize to NIXIO_BUFFERSIZE */ ++ req = (req > NIXIO_BUFFERSIZE) ? NIXIO_BUFFERSIZE : req; ++ ++ do { ++ readc = read(fd, buffer, req); ++ } while (readc == -1 && errno == EINTR); ++ ++ if (readc < 0) { ++ return nixio__perror(L); ++ } else { ++ lua_pushlstring(L, buffer, readc); ++ return 1; ++ } ++} ++ ++ ++static int nixio_file_seek(lua_State *L) { ++ int fd = nixio__checkfd(L, 1); ++ off_t len = (off_t)nixio__checknumber(L, 2); ++ int whence; ++ const char *whstr = luaL_optlstring(L, 3, "set", NULL); ++ if (!strcmp(whstr, "set")) { ++ whence = SEEK_SET; ++ } else if (!strcmp(whstr, "cur")) { ++ whence = SEEK_CUR; ++ } else if (!strcmp(whstr, "end")) { ++ whence = SEEK_END; ++ } else { ++ return luaL_argerror(L, 3, "supported values: set, cur, end"); ++ } ++ len = lseek(fd, len, whence); ++ if (len == -1) { ++ return nixio__perror(L); ++ } else { ++ nixio__pushnumber(L, len); ++ return 1; ++ } ++} ++ ++static int nixio_file_tell(lua_State *L) { ++ int fd = nixio__checkfd(L, 1); ++ off_t pos = lseek(fd, 0, SEEK_CUR); ++ if (pos < 0) { ++ return nixio__perror(L); ++ } else { ++ nixio__pushnumber(L, pos); ++ return 1; ++ } ++} ++ ++static int nixio_file_stat(lua_State *L) { ++ nixio_stat_t buf; ++ if (fstat(nixio__checkfd(L, 1), &buf)) { ++ return nixio__perror(L); ++ } else { ++ nixio__push_stat(L, &buf); ++ if (lua_isstring(L, 2)) { ++ lua_getfield(L, -1, lua_tostring(L, 2)); ++ } ++ return 1; ++ } ++} ++ ++static int nixio_file_sync(lua_State *L) { ++ int fd = nixio__checkfd(L, 1); ++ int stat; ++#if (!defined BSD && !defined __WINNT__) ++ int dataonly = lua_toboolean(L, 2); ++ do { ++ stat = (dataonly) ? fdatasync(fd) : fsync(fd); ++ } while (stat == -1 && errno == EINTR); ++ return nixio__pstatus(L, !stat); ++#else ++ do { ++ stat = fsync(fd); ++ } while (stat == -1 && errno == EINTR); ++ return nixio__pstatus(L, !stat); ++#endif ++} ++ ++static int nixio_file_lock(lua_State *L) { ++ int fd = nixio__checkfd(L, 1); ++ const char *flag = luaL_checkstring(L, 2); ++ off_t len = (off_t)nixio__optnumber(L, 3, 0); ++ int stat; ++ ++ int cmd = 0; ++ if (!strcmp(flag, "lock")) { ++ cmd = F_LOCK; ++ } else if (!strcmp(flag, "tlock")) { ++ cmd = F_TLOCK; ++ } else if (!strcmp(flag, "ulock")) { ++ cmd = F_ULOCK; ++ } else if (!strcmp(flag, "test")) { ++ cmd = F_TEST; ++ } else { ++ return luaL_argerror(L, 2, ++ "supported values: lock, tlock, ulock, test"); ++ } ++ ++ do { ++ stat = lockf(fd, cmd, len); ++ } while (stat == -1 && errno == EINTR); ++ ++ return nixio__pstatus(L, !stat); ++} ++ ++static int nixio_file_close(lua_State *L) { ++ int *fdp = luaL_checkudata(L, 1, NIXIO_FILE_META); ++ luaL_argcheck(L, *fdp != -1, 1, "invalid file object"); ++ int res; ++ do { ++ res = close(*fdp); ++ } while (res == -1 && errno == EINTR); ++ *fdp = -1; ++ return nixio__pstatus(L, !res); ++} ++ ++static int nixio_file__gc(lua_State *L) { ++ int *fdp = luaL_checkudata(L, 1, NIXIO_FILE_META); ++ int res; ++ if (*fdp > 2) { ++ do { ++ res = close(*fdp); ++ } while (res == -1 && errno == EINTR); ++ *fdp = -1; ++ } ++ return 0; ++} ++ ++/** ++ * string representation ++ */ ++static int nixio_file__tostring(lua_State *L) { ++ lua_pushfstring(L, "nixio file %d", nixio__tofd(L, 1)); ++ return 1; ++} ++ ++/* method table */ ++static const luaL_reg M[] = { ++ {"write", nixio_file_write}, ++ {"read", nixio_file_read}, ++ {"tell", nixio_file_tell}, ++ {"seek", nixio_file_seek}, ++ {"stat", nixio_file_stat}, ++ {"sync", nixio_file_sync}, ++ {"lock", nixio_file_lock}, ++ {"close", nixio_file_close}, ++ {"__gc", nixio_file__gc}, ++ {"__tostring", nixio_file__tostring}, ++ {NULL, NULL} ++}; ++ ++/* module table */ ++static const luaL_reg R[] = { ++ {"dup", nixio_dup}, ++ {"open", nixio_open}, ++ {"open_flags", nixio_open_flags}, ++ {"pipe", nixio_pipe}, ++ {NULL, NULL} ++}; ++ ++void nixio_open_file(lua_State *L) { ++ luaL_register(L, NULL, R); ++ ++ luaL_newmetatable(L, NIXIO_FILE_META); ++ luaL_register(L, NULL, M); ++ lua_pushvalue(L, -1); ++ lua_setfield(L, -2, "__index"); ++ ++ int *uin = lua_newuserdata(L, sizeof(int)); ++ int *uout = lua_newuserdata(L, sizeof(int)); ++ int *uerr = lua_newuserdata(L, sizeof(int)); ++ ++ if (!uin || !uout || !uerr) { ++ luaL_error(L, "out of memory"); ++ } ++ ++ *uin = STDIN_FILENO; ++ *uout = STDOUT_FILENO; ++ *uerr = STDERR_FILENO; ++ ++ for (int i = -4; i < -1; i++) { ++ lua_pushvalue(L, -4); ++ lua_setmetatable(L, i); ++ } ++ ++ lua_setfield(L, -5, "stderr"); ++ lua_setfield(L, -4, "stdout"); ++ lua_setfield(L, -3, "stdin"); ++ lua_setfield(L, -2, "meta_file"); ++} +diff --git a/feeds/luci/libs/luci-lib-nixio/src/fs.c b/feeds/luci/libs/luci-lib-nixio/src/fs.c +new file mode 100644 +index 0000000..12ca111 +--- /dev/null ++++ b/feeds/luci/libs/luci-lib-nixio/src/fs.c +@@ -0,0 +1,566 @@ ++/* ++ * nixio - Linux I/O library for lua ++ * ++ * Copyright (C) 2009 Steven Barth ++ * ++ * Licensed under the Apache License, Version 2.0 (the "License"); ++ * you may not use this file except in compliance with the License. ++ * You may obtain a copy of the License at ++ * ++ * http://www.apache.org/licenses/LICENSE-2.0 ++ * ++ * Unless required by applicable law or agreed to in writing, software ++ * distributed under the License is distributed on an "AS IS" BASIS, ++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. ++ * See the License for the specific language governing permissions and ++ * limitations under the License. ++ */ ++ ++#include "nixio.h" ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++ ++/* Reads argument from given index and transforms it into a mode bitfield */ ++int nixio__check_mode(lua_State *L, int idx, int def) { ++ if (lua_isnoneornil(L, idx) && def > 0) { ++ return def; ++ } else if (lua_isstring(L, idx) && lua_objlen(L, idx) == 9) { ++ int mode = 0; ++ const char *modestr = lua_tostring(L, idx); ++ int i; ++ for (i=0; i<9; i++) { ++ if (i % 3 == 0) { /* read flags */ ++ if (modestr[i] == 'r') { ++ mode |= 1 << (8 - i); ++ } else if (modestr[i] != '-') { ++ break; ++ } ++ } else if (i % 3 == 1) { /* write flags */ ++ if (modestr[i] == 'w') { ++ mode |= 1 << (8 - i); ++ } else if (modestr[i] != '-') { ++ break; ++ } ++ } else if (i == 2) { ++ if (modestr[i] == 'x') { ++ mode |= 00100; ++ } else if (modestr[i] == 's') { ++ mode |= 04100; ++ } else if (modestr[i] == 'S') { ++ mode |= 04000; ++ } else if (modestr[i] != '-') { ++ break; ++ } ++ } else if (i == 5) { ++ if (modestr[i] == 'x') { ++ mode |= 00010; ++ } else if (modestr[i] == 's') { ++ mode |= 02010; ++ } else if (modestr[i] == 'S') { ++ mode |= 02000; ++ } else if (modestr[i] != '-') { ++ break; ++ } ++ } else if (i == 8) { ++ if (modestr[i] == 'x') { ++ mode |= 00001; ++ } else if (modestr[i] == 't') { ++ mode |= 01001; ++ } else if (modestr[i] == 'T') { ++ mode |= 01000; ++ } else if (modestr[i] != '-') { ++ break; ++ } ++ } ++ } ++ if (i == 9) { /* successfully parsed */ ++ return mode; ++ } ++ } else if (lua_isnumber(L, idx)) { ++ int decmode = lua_tointeger(L, idx); ++ int s = (decmode % 10000) / 1000; ++ int u = (decmode % 1000) / 100; ++ int g = (decmode % 100) / 10; ++ int o = (decmode % 10); ++ ++ if (s>=0 && s<=7 && u>=0 && u<=7 && g>=0 && g<=7 && o>=0 && o<=7) { ++ return (s << 9) + (u << 6) + (g << 3) + o; ++ } ++ } ++ ++ return luaL_argerror(L, idx, "supported values: [0-7]?[0-7][0-7][0-7], " ++ "[-r][-w][-xsS][-r][-w][-xsS][-r][-w][-xtT]"); ++} ++ ++/* Transforms a mode into the modestring */ ++int nixio__mode_write(int mode, char *modestr) { ++ if (modestr) { ++ modestr[0] = (mode & 00400) ? 'r' : '-'; ++ modestr[1] = (mode & 00200) ? 'w' : '-'; ++ modestr[2] = ((mode & 04100) == 04100) ? 's' : ++ (mode & 04000) ? 'S' : (mode & 00100) ? 'x' : '-'; ++ modestr[3] = (mode & 00040) ? 'r' : '-'; ++ modestr[4] = (mode & 00020) ? 'w' : '-'; ++ modestr[5] = ((mode & 02010) == 02010) ? 's' : ++ (mode & 02000) ? 'S' : (mode & 00010) ? 'x' : '-'; ++ modestr[6] = (mode & 00004) ? 'r' : '-'; ++ modestr[7] = (mode & 00002) ? 'w' : '-'; ++ modestr[8] = ((mode & 01001) == 01001) ? 't' : ++ (mode & 01000) ? 'T' : (mode & 00001) ? 'x' : '-'; ++ } ++ ++ return (mode & 00007) + ((mode & 00070) >> 3) * 10 + ++ ((mode & 00700) >> 6) * 100 + ((mode & 07000) >> 9) * 1000; ++} ++ ++static int nixio_access(lua_State *L) { ++ const char *path = luaL_checkstring(L, 1); ++ int mode = F_OK; ++ ++ for (const char *s = luaL_optstring(L, 2, "f"); *s; s++) { ++ if (*s == 'r') { ++ mode |= R_OK; ++ } else if (*s == 'w') { ++ mode |= W_OK; ++ } else if (*s == 'x') { ++ mode |= X_OK; ++ } else if (*s != 'f') { ++ return luaL_argerror(L, 2, "supported values: [frwx]"); ++ } ++ } ++ ++ return nixio__pstatus(L, !access(path, mode)); ++} ++ ++static int nixio_basename(lua_State *L) { ++ const char *path = luaL_checkstring(L, 1); ++ char base[PATH_MAX]; ++ base[PATH_MAX-1] = 0; ++ ++ strncpy(base, path, PATH_MAX-1); ++ lua_pushstring(L, basename(base)); ++ return 1; ++} ++ ++static int nixio_dirname(lua_State *L) { ++ const char *path = luaL_checkstring(L, 1); ++ char base[PATH_MAX]; ++ base[PATH_MAX-1] = 0; ++ ++ strncpy(base, path, PATH_MAX-1); ++ lua_pushstring(L, dirname(base)); ++ return 1; ++} ++ ++static int nixio_realpath(lua_State *L) { ++ const char *path = luaL_checkstring(L, 1); ++ char real[PATH_MAX]; ++ ++ if (!realpath(path, real)) { ++ return nixio__perror(L); ++ } else { ++ lua_pushstring(L, real); ++ return 1; ++ } ++} ++ ++static int nixio_remove(lua_State *L) { ++ return nixio__pstatus(L, !remove(luaL_checkstring(L, 1))); ++} ++ ++static int nixio_unlink(lua_State *L) { ++ return nixio__pstatus(L, !unlink(luaL_checkstring(L, 1))); ++} ++ ++static int nixio_rename(lua_State *L) { ++ return nixio__pstatus(L, ++ !rename(luaL_checkstring(L, 1), luaL_checkstring(L, 2))); ++} ++ ++static int nixio_rmdir(lua_State *L) { ++ return nixio__pstatus(L, !rmdir(luaL_checkstring(L, 1))); ++} ++ ++static int nixio_mkdir(lua_State *L) { ++ return nixio__pstatus(L, ++ !mkdir(luaL_checkstring(L, 1), nixio__check_mode(L, 2, 0777))); ++} ++ ++static int nixio_chmod(lua_State *L) { ++ return nixio__pstatus(L, ++ !chmod(luaL_checkstring(L, 1), nixio__check_mode(L, 2, -1))); ++} ++ ++static int nixio_dir__gc(lua_State *L) { ++ DIR **dirp = lua_touserdata(L, 1); ++ if (dirp && *dirp) { ++ closedir(*dirp); ++ *dirp = NULL; ++ } ++ return 0; ++} ++ ++static int nixio_dir__iter(lua_State *L) { ++ DIR **dirp = lua_touserdata(L, lua_upvalueindex(1)); ++ struct dirent *entry; ++ const char *n = NULL; ++ ++ if (*dirp) { ++ do { ++ entry = readdir(*dirp); ++ n = (entry) ? entry->d_name : NULL; ++ } while(n && n[0] == '.' && (n[1] == 0 || (n[1] == '.' && n[2] == 0))); ++ } ++ ++ if (n) { ++ lua_pushstring(L, n); ++ } else { ++ if (*dirp) { ++ closedir(*dirp); ++ *dirp = NULL; ++ } ++ lua_pushnil(L); ++ } ++ ++ return 1; ++} ++ ++static int nixio_dir(lua_State *L) { ++ const char *path = luaL_optstring(L, 1, "."); ++ DIR **dirp = lua_newuserdata(L, sizeof(DIR *)); ++ ++ *dirp = opendir(path); ++ if (!*dirp) { ++ return nixio__perror(L); ++ } else { ++ luaL_getmetatable(L, NIXIO_DIR_META); ++ lua_setmetatable(L, -2); ++ lua_pushcclosure(L, nixio_dir__iter, 1); ++ return 1; ++ } ++} ++ ++static int nixio_link(lua_State *L) { ++ return nixio__pstatus(L, ++ !link(luaL_checkstring(L, 1), luaL_checkstring(L, 2))); ++} ++ ++static int nixio_utimes(lua_State *L) { ++ const char *path = luaL_checkstring(L, 1); ++ if (lua_gettop(L) < 2 || (lua_isnoneornil(L, 2) && lua_isnoneornil(L, 3))) { ++ return nixio__pstatus(L, !utimes(path, NULL)); ++ } else { ++ double atime = nixio__checknumber(L, 2); ++ double mtime = nixio__optnumber(L, 3, atime); ++ struct timeval times[2]; ++ ++ times[0].tv_sec = atime; ++ times[0].tv_usec = 0; ++ times[1].tv_sec = mtime; ++ times[1].tv_usec = 0; ++ ++ return nixio__pstatus(L, !utimes(path, times)); ++ } ++} ++ ++int nixio__push_stat(lua_State *L, nixio_stat_t *buf) { ++ lua_createtable(L, 0, 15); ++ ++ lua_pushinteger(L, buf->st_dev); ++ lua_setfield(L, -2, "dev"); ++ ++ lua_pushinteger(L, buf->st_ino); ++ lua_setfield(L, -2, "ino"); ++ ++ if (S_ISREG(buf->st_mode)) { ++ lua_pushliteral(L, "reg"); ++ } else if (S_ISDIR(buf->st_mode)) { ++ lua_pushliteral(L, "dir"); ++ } else if (S_ISCHR(buf->st_mode)) { ++ lua_pushliteral(L, "chr"); ++ } else if (S_ISBLK(buf->st_mode)) { ++ lua_pushliteral(L, "blk"); ++ } else if (S_ISFIFO(buf->st_mode)) { ++ lua_pushliteral(L, "fifo"); ++ } else if (S_ISLNK(buf->st_mode)) { ++ lua_pushliteral(L, "lnk"); ++ } else if (S_ISSOCK(buf->st_mode)) { ++ lua_pushliteral(L, "sock"); ++ } else { ++ lua_pushliteral(L, "unknown"); ++ } ++ lua_setfield(L, -2, "type"); ++ ++ char modestr[9]; ++ lua_pushinteger(L, nixio__mode_write(buf->st_mode, modestr)); ++ lua_setfield(L, -2, "modedec"); ++ ++ lua_pushlstring(L, modestr, 9); ++ lua_setfield(L, -2, "modestr"); ++ ++ lua_pushinteger(L, buf->st_nlink); ++ lua_setfield(L, -2, "nlink"); ++ ++ lua_pushinteger(L, buf->st_uid); ++ lua_setfield(L, -2, "uid"); ++ ++ lua_pushinteger(L, buf->st_gid); ++ lua_setfield(L, -2, "gid"); ++ ++ lua_pushinteger(L, buf->st_rdev); ++ lua_setfield(L, -2, "rdev"); ++ ++ nixio__pushnumber(L, buf->st_size); ++ lua_setfield(L, -2, "size"); ++ ++ lua_pushinteger(L, buf->st_atime); ++ lua_setfield(L, -2, "atime"); ++ ++ lua_pushinteger(L, buf->st_mtime); ++ lua_setfield(L, -2, "mtime"); ++ ++ lua_pushinteger(L, buf->st_ctime); ++ lua_setfield(L, -2, "ctime"); ++ ++#ifndef __WINNT__ ++ lua_pushinteger(L, buf->st_blksize); ++ lua_setfield(L, -2, "blksize"); ++ ++ lua_pushinteger(L, buf->st_blocks); ++ lua_setfield(L, -2, "blocks"); ++#endif ++ ++ return 1; ++} ++ ++static int nixio_stat(lua_State *L) { ++ nixio_stat_t buf; ++ if (stat(luaL_checkstring(L, 1), &buf)) { ++ return nixio__perror(L); ++ } else { ++ nixio__push_stat(L, &buf); ++ if (lua_isstring(L, 2)) { ++ lua_getfield(L, -1, lua_tostring(L, 2)); ++ } ++ return 1; ++ } ++} ++ ++static int nixio_lstat(lua_State *L) { ++ nixio_stat_t buf; ++ if (stat(luaL_checkstring(L, 1), &buf)) { ++ return nixio__perror(L); ++ } else { ++ nixio__push_stat(L, &buf); ++ if (lua_isstring(L, 2)) { ++ lua_getfield(L, -1, lua_tostring(L, 2)); ++ } ++ return 1; ++ } ++} ++ ++#ifndef __WINNT__ ++ ++static int nixio_chown(lua_State *L) { ++ return nixio__pstatus(L, ++ !chown( ++ luaL_checkstring(L, 1), ++ lua_isnoneornil(L, 2) ? -1 : nixio__check_user(L, 2), ++ lua_isnoneornil(L, 3) ? -1 : nixio__check_group(L, 3) ++ ) ++ ); ++} ++ ++static int nixio_lchown(lua_State *L) { ++ return nixio__pstatus(L, ++ !lchown( ++ luaL_checkstring(L, 1), ++ lua_isnoneornil(L, 2) ? -1 : nixio__check_user(L, 2), ++ lua_isnoneornil(L, 3) ? -1 : nixio__check_group(L, 3) ++ ) ++ ); ++} ++ ++static int nixio_mkfifo(lua_State *L) { ++ return nixio__pstatus(L, ++ !mkfifo(luaL_checkstring(L, 1), nixio__check_mode(L, 2, -1))); ++} ++ ++static int nixio_symlink(lua_State *L) { ++ return nixio__pstatus(L, ++ !symlink(luaL_checkstring(L, 1), luaL_checkstring(L, 2))); ++} ++ ++static int nixio_readlink(lua_State *L) { ++ char dest[PATH_MAX]; ++ ssize_t res = readlink(luaL_checkstring(L, 1), dest, sizeof(dest)); ++ if (res < 0) { ++ return nixio__perror(L); ++ } else { ++ lua_pushlstring(L, dest, res); ++ return 1; ++ } ++} ++ ++#include ++ ++typedef struct { ++ glob_t gl; ++ size_t pos; ++ int freed; ++} nixio_glob_t; ++ ++static int nixio_glob__iter(lua_State *L) { ++ nixio_glob_t *globres = lua_touserdata(L, lua_upvalueindex(1)); ++ if (!globres->freed && globres->pos < globres->gl.gl_pathc) { ++ lua_pushstring(L, globres->gl.gl_pathv[(globres->pos)++]); ++ } else { ++ if (!globres->freed) { ++ globfree(&globres->gl); ++ globres->freed = 1; ++ } ++ lua_pushnil(L); ++ } ++ return 1; ++} ++ ++static int nixio_glob__gc(lua_State *L) { ++ nixio_glob_t *globres = lua_touserdata(L, 1); ++ if (globres && !globres->freed) { ++ globres->freed = 1; ++ globfree(&globres->gl); ++ } ++ return 0; ++} ++ ++static int nixio_glob(lua_State *L) { ++ const char *pattern = luaL_optstring(L, 1, "*"); ++ nixio_glob_t *globres = lua_newuserdata(L, sizeof(nixio_glob_t)); ++ if (!globres) { ++ return luaL_error(L, NIXIO_OOM); ++ } ++ globres->pos = 0; ++ globres->freed = 0; ++ ++ int globstat = glob(pattern, 0, NULL, &globres->gl); ++ if (globstat == GLOB_NOMATCH) { ++ lua_pushcfunction(L, nixio__nulliter); ++ lua_pushinteger(L, 0); ++ } else if (globstat) { ++ return nixio__perror(L); ++ } else { ++ luaL_getmetatable(L, NIXIO_GLOB_META); ++ lua_setmetatable(L, -2); ++ lua_pushcclosure(L, nixio_glob__iter, 1); ++ lua_pushinteger(L, globres->gl.gl_pathc); ++ } ++ return 2; ++} ++ ++#include ++ ++static int nixio__push_statvfs(lua_State *L, struct statvfs *buf) { ++ lua_createtable(L, 0, 12); ++ ++ nixio__pushnumber(L, buf->f_bavail); ++ lua_setfield(L, -2, "bavail"); ++ ++ nixio__pushnumber(L, buf->f_bfree); ++ lua_setfield(L, -2, "bfree"); ++ ++ nixio__pushnumber(L, buf->f_blocks); ++ lua_setfield(L, -2, "blocks"); ++ ++ nixio__pushnumber(L, buf->f_bsize); ++ lua_setfield(L, -2, "bsize"); ++ ++ nixio__pushnumber(L, buf->f_frsize); ++ lua_setfield(L, -2, "frsize"); ++ ++ nixio__pushnumber(L, buf->f_favail); ++ lua_setfield(L, -2, "favail"); ++ ++ nixio__pushnumber(L, buf->f_ffree); ++ lua_setfield(L, -2, "ffree"); ++ ++ nixio__pushnumber(L, buf->f_files); ++ lua_setfield(L, -2, "files"); ++ ++ nixio__pushnumber(L, buf->f_flag); ++ lua_setfield(L, -2, "flag"); ++ ++ nixio__pushnumber(L, buf->f_fsid); ++ lua_setfield(L, -2, "fsid"); ++ ++ nixio__pushnumber(L, buf->f_namemax); ++ lua_setfield(L, -2, "namemax"); ++ ++ return 1; ++} ++ ++static int nixio_statvfs(lua_State *L) { ++ struct statvfs buf; ++ if (statvfs(luaL_optstring(L, 1, "."), &buf)) { ++ return nixio__perror(L); ++ } else { ++ return nixio__push_statvfs(L, &buf); ++ } ++} ++ ++#endif /* !__WINNT__ */ ++ ++ ++ ++/* module table */ ++static const luaL_reg R[] = { ++#ifndef __WINNT__ ++ {"glob", nixio_glob}, ++ {"mkfifo", nixio_mkfifo}, ++ {"symlink", nixio_symlink}, ++ {"readlink", nixio_readlink}, ++ {"chown", nixio_chown}, ++ {"lchown", nixio_lchown}, ++ {"statvfs", nixio_statvfs}, ++#endif ++ {"chmod", nixio_chmod}, ++ {"access", nixio_access}, ++ {"basename", nixio_basename}, ++ {"dir", nixio_dir}, ++ {"dirname", nixio_dirname}, ++ {"realpath", nixio_realpath}, ++ {"mkdir", nixio_mkdir}, ++ {"rmdir", nixio_rmdir}, ++ {"link", nixio_link}, ++ {"unlink", nixio_unlink}, ++ {"utimes", nixio_utimes}, ++ {"rename", nixio_rename}, ++ {"remove", nixio_remove}, ++ {"stat", nixio_stat}, ++ {"lstat", nixio_lstat}, ++ {NULL, NULL} ++}; ++ ++void nixio_open_fs(lua_State *L) { ++ lua_newtable(L); ++ luaL_register(L, NULL, R); ++ lua_setfield(L, -2, "fs"); ++ ++ luaL_newmetatable(L, NIXIO_DIR_META); ++ lua_pushcfunction(L, nixio_dir__gc); ++ lua_setfield(L, -2, "__gc"); ++ lua_pop(L, 1); ++ ++#ifndef __WINNT__ ++ luaL_newmetatable(L, NIXIO_GLOB_META); ++ lua_pushcfunction(L, nixio_glob__gc); ++ lua_setfield(L, -2, "__gc"); ++ lua_pop(L, 1); ++#endif ++} +diff --git a/feeds/luci/libs/luci-lib-nixio/src/io.c b/feeds/luci/libs/luci-lib-nixio/src/io.c +new file mode 100644 +index 0000000..12d5c7d +--- /dev/null ++++ b/feeds/luci/libs/luci-lib-nixio/src/io.c +@@ -0,0 +1,225 @@ ++/* ++ * nixio - Linux I/O library for lua ++ * ++ * Copyright (C) 2009 Steven Barth ++ * ++ * Licensed under the Apache License, Version 2.0 (the "License"); ++ * you may not use this file except in compliance with the License. ++ * You may obtain a copy of the License at ++ * ++ * http://www.apache.org/licenses/LICENSE-2.0 ++ * ++ * Unless required by applicable law or agreed to in writing, software ++ * distributed under the License is distributed on an "AS IS" BASIS, ++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. ++ * See the License for the specific language governing permissions and ++ * limitations under the License. ++ */ ++ ++#include "nixio.h" ++#include ++#include ++#include ++#include ++#include ++ ++ ++/** ++ * send() / sendto() helper ++ */ ++static int nixio_sock__sendto(lua_State *L, int to) { ++ nixio_sock *sock = nixio__checksock(L); ++ struct sockaddr_storage addr_in; ++#ifndef __WINNT__ ++ struct sockaddr_un addr_un; ++#endif ++ struct sockaddr *addr = NULL; ++ socklen_t alen = 0; ++ int argoff = 2; ++ ++ if (to) { ++ argoff += 2; ++ if (sock->domain == AF_INET || sock->domain == AF_INET6) { ++ const char *address = luaL_checkstring(L, 3); ++ addr = (struct sockaddr*)&addr_in; ++ alen = sizeof(addr_in); ++ ++ nixio_addr naddr; ++ memset(&naddr, 0, sizeof(naddr)); ++ strncpy(naddr.host, address, sizeof(naddr.host) - 1); ++ naddr.port = (uint16_t)luaL_checkinteger(L, 4); ++ naddr.family = sock->domain; ++ ++ if (nixio__addr_write(&naddr, addr)) { ++ return nixio__perror_s(L); ++ } ++ } ++ ++#ifndef __WINNT__ ++ else if (sock->domain == AF_UNIX) { ++ size_t pathlen; ++ const char *path = luaL_checklstring(L, 3, &pathlen); ++ ++ addr_un.sun_family = AF_UNIX; ++ luaL_argcheck(L, pathlen <= sizeof(addr_un.sun_path), 3, "out of range"); ++ memcpy(addr_un.sun_path, path, pathlen); ++ ++ addr = (struct sockaddr*)&addr_un; ++ alen = sizeof(sa_family_t) + pathlen; ++ } ++#endif ++ } ++ ++ size_t len; ++ ssize_t sent; ++ const char *data = luaL_checklstring(L, 2, &len); ++ ++ if (lua_gettop(L) > argoff) { ++ int offset = luaL_optint(L, argoff + 1, 0); ++ if (offset) { ++ if (offset < len) { ++ data += offset; ++ len -= offset; ++ } else { ++ len = 0; ++ } ++ } ++ ++ unsigned int wlen = luaL_optint(L, argoff + 2, len); ++ if (wlen < len) { ++ len = wlen; ++ } ++ } ++ ++ do { ++ sent = sendto(sock->fd, data, len, 0, addr, alen); ++ } while(sent == -1 && errno == EINTR); ++ if (sent >= 0) { ++ lua_pushinteger(L, sent); ++ return 1; ++ } else { ++ return nixio__perror_s(L); ++ } ++} ++ ++/** ++ * send(data) ++ */ ++static int nixio_sock_send(lua_State *L) { ++ return nixio_sock__sendto(L, 0); ++} ++ ++/** ++ * sendto(data, address, port) ++ */ ++static int nixio_sock_sendto(lua_State *L) { ++ return nixio_sock__sendto(L, 1); ++} ++ ++ ++/** ++ * recv() / recvfrom() helper ++ */ ++static int nixio_sock__recvfrom(lua_State *L, int from) { ++ nixio_sock *sock = nixio__checksock(L); ++ char buffer[NIXIO_BUFFERSIZE]; ++ struct sockaddr_storage addr_in; ++#ifndef __WINNT__ ++ struct sockaddr_un addr_un; ++#endif ++ struct sockaddr *addr = NULL; ++ socklen_t alen = 0; ++ uint req = luaL_checkinteger(L, 2); ++ int readc; ++ ++ if (sock->domain == AF_INET || sock->domain == AF_INET6) { ++ addr = (from) ? (struct sockaddr*)&addr_in : NULL; ++ alen = (from) ? sizeof(addr_in) : 0; ++ } ++#ifndef __WINNT__ ++ else if (sock->domain == AF_UNIX) { ++ addr = (from) ? (struct sockaddr*)&addr_un : NULL; ++ alen = (from) ? sizeof(addr_un) : 0; ++ } ++#endif ++ ++ /* We limit the readsize to NIXIO_BUFFERSIZE */ ++ req = (req > NIXIO_BUFFERSIZE) ? NIXIO_BUFFERSIZE : req; ++ ++ do { ++ readc = recvfrom(sock->fd, buffer, req, 0, addr, &alen); ++ } while (readc == -1 && errno == EINTR); ++ ++#ifdef __WINNT__ ++ if (readc < 0) { ++ int e = WSAGetLastError(); ++ if (e == WSAECONNRESET || e == WSAECONNABORTED || e == WSAESHUTDOWN) { ++ readc = 0; ++ } ++ } ++#endif ++ ++ if (readc < 0) { ++ return nixio__perror_s(L); ++ } else { ++ lua_pushlstring(L, buffer, readc); ++ ++ if (!from) { ++ return 1; ++ } ++ /* push address. */ ++ if (sock->domain == AF_INET || sock->domain == AF_INET6) { ++ nixio_addr naddr; ++ if (!nixio__addr_parse(&naddr, (struct sockaddr *)&addr_in)) { ++ lua_pushstring(L, naddr.host); ++ lua_pushinteger(L, naddr.port); ++ return 3; ++ } else { ++ return 1; ++ } ++ } ++#ifndef __WINNT__ ++ else if (sock->domain == AF_UNIX && alen > sizeof(sa_family_t)) { ++ /* if first char is non-null then the path is not in the ++ abstract namespace and alen includes the trailing null */ ++ if (addr_un.sun_path[0]) ++ --alen; ++ lua_pushlstring(L, addr_un.sun_path, alen - sizeof(sa_family_t)); ++ return 2; ++ } ++#endif ++ } ++ return 1; ++} ++ ++/** ++ * recv(count) ++ */ ++static int nixio_sock_recv(lua_State *L) { ++ return nixio_sock__recvfrom(L, 0); ++} ++ ++/** ++ * recvfrom(count) ++ */ ++static int nixio_sock_recvfrom(lua_State *L) { ++ return nixio_sock__recvfrom(L, 1); ++} ++ ++ ++/* module table */ ++static const luaL_reg M[] = { ++ {"send", nixio_sock_send}, ++ {"sendto", nixio_sock_sendto}, ++ {"recv", nixio_sock_recv}, ++ {"recvfrom",nixio_sock_recvfrom}, ++ {"write", nixio_sock_send}, ++ {"read", nixio_sock_recv}, ++ {NULL, NULL} ++}; ++ ++void nixio_open_io(lua_State *L) { ++ lua_pushvalue(L, -2); ++ luaL_register(L, NULL, M); ++ lua_pop(L, 1); ++} +diff --git a/feeds/luci/libs/luci-lib-nixio/src/mingw-compat.c b/feeds/luci/libs/luci-lib-nixio/src/mingw-compat.c +new file mode 100644 +index 0000000..02be504 +--- /dev/null ++++ b/feeds/luci/libs/luci-lib-nixio/src/mingw-compat.c +@@ -0,0 +1,220 @@ ++/* ++ * nixio - Linux I/O library for lua ++ * ++ * Copyright (C) 2009 Steven Barth ++ * ++ * Licensed under the Apache License, Version 2.0 (the "License"); ++ * you may not use this file except in compliance with the License. ++ * You may obtain a copy of the License at ++ * ++ * http://www.apache.org/licenses/LICENSE-2.0 ++ * ++ * Unless required by applicable law or agreed to in writing, software ++ * distributed under the License is distributed on an "AS IS" BASIS, ++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. ++ * See the License for the specific language governing permissions and ++ * limitations under the License. ++ */ ++ ++#include "nixio.h" ++#include ++#include ++#include ++#include ++#include ++#include ++ ++void nixio_open__mingw(lua_State *L) { ++ _fmode = _O_BINARY; ++ ++ WSADATA wsa; ++ ++ if (WSAStartup(MAKEWORD(2, 2), &wsa)) { ++ luaL_error(L, "Unable to initialize Winsock"); ++ } ++ ++ lua_newtable(L); ++ ++ NIXIO_WSA_CONSTANT(WSAEACCES); ++ NIXIO_WSA_CONSTANT(WSAEINTR); ++ NIXIO_WSA_CONSTANT(WSAEINVAL); ++ NIXIO_WSA_CONSTANT(WSAEBADF); ++ NIXIO_WSA_CONSTANT(WSAEFAULT); ++ NIXIO_WSA_CONSTANT(WSAEMFILE); ++ NIXIO_WSA_CONSTANT(WSAENAMETOOLONG); ++ NIXIO_WSA_CONSTANT(WSAELOOP); ++ NIXIO_WSA_CONSTANT(WSAEAFNOSUPPORT); ++ NIXIO_WSA_CONSTANT(WSAENOBUFS); ++ NIXIO_WSA_CONSTANT(WSAEPROTONOSUPPORT); ++ NIXIO_WSA_CONSTANT(WSAENOPROTOOPT); ++ NIXIO_WSA_CONSTANT(WSAEADDRINUSE); ++ NIXIO_WSA_CONSTANT(WSAENETDOWN); ++ NIXIO_WSA_CONSTANT(WSAENETUNREACH); ++ NIXIO_WSA_CONSTANT(WSAECONNABORTED); ++ NIXIO_WSA_CONSTANT(WSAECONNRESET); ++ ++ lua_setfield(L, -2, "const_sock"); ++} ++ ++const char* nixio__mgw_inet_ntop ++(int af, const void *src, char *dst, socklen_t size) { ++ struct sockaddr_storage saddr; ++ memset(&saddr, 0, sizeof(saddr)); ++ ++ DWORD hostlen = size, sl; ++ if (af == AF_INET) { ++ struct sockaddr_in *saddr4 = (struct sockaddr_in *)&saddr; ++ memcpy(&saddr4->sin_addr, src, sizeof(saddr4->sin_addr)); ++ saddr4->sin_family = AF_INET; ++ saddr4->sin_port = 0; ++ sl = sizeof(struct sockaddr_in); ++ } else if (af == AF_INET6) { ++ struct sockaddr_in6 *saddr6 = (struct sockaddr_in6 *)&saddr; ++ memcpy(&saddr6->sin6_addr, src, sizeof(saddr6->sin6_addr)); ++ saddr6->sin6_family = AF_INET6; ++ saddr6->sin6_port = 0; ++ sl = sizeof(struct sockaddr_in6); ++ } else { ++ return NULL; ++ } ++ if (WSAAddressToString((struct sockaddr*)&saddr, sl, NULL, dst, &hostlen)) { ++ return NULL; ++ } ++ return dst; ++} ++ ++int nixio__mgw_inet_pton (int af, const char *src, void *dst) { ++ struct sockaddr_storage sa; ++ int sl = sizeof(sa); ++ ++ if (!WSAStringToAddress((char*)src, af, NULL, (struct sockaddr*)&sa, &sl)) { ++ if (af == AF_INET) { ++ struct in_addr ina = ((struct sockaddr_in *)&sa)->sin_addr; ++ memcpy(dst, &ina, sizeof(ina)); ++ return 1; ++ } else if (af == AF_INET6) { ++ struct in_addr6 ina6 = ((struct sockaddr_in6 *)&sa)->sin6_addr; ++ memcpy(dst, &ina6, sizeof(ina6)); ++ return 1; ++ } else { ++ WSASetLastError(WSAEAFNOSUPPORT); ++ return -1; ++ } ++ } else { ++ return -1; ++ } ++} ++ ++int nixio__mgw_nanosleep(const struct timespec *req, struct timespec *rem) { ++ if (rem) { ++ rem->tv_sec = 0; ++ rem->tv_nsec = 0; ++ } ++ Sleep(req->tv_sec * 1000 + req->tv_nsec * 1000000); ++ return 0; ++} ++ ++int nixio__mgw_poll(struct pollfd *fds, int nfds, int timeout) { ++ if (!fds || !nfds) { ++ Sleep(timeout); ++ return 0; ++ } ++ ++ struct timeval tv; ++ int high = 0, rf = 0, wf = 0, ef = 0; ++ fd_set rfds, wfds, efds; ++ FD_ZERO(&rfds); ++ FD_ZERO(&wfds); ++ FD_ZERO(&efds); ++ ++ tv.tv_sec = timeout / 1000; ++ tv.tv_usec = (timeout % 1000) * 1000; ++ ++ for (int i = 0; i < nfds; i++) { ++ if (fds->events & POLLIN) { ++ FD_SET(fds->fd, &rfds); ++ rf++; ++ } ++ if (fds->events & POLLOUT) { ++ FD_SET(fds->fd, &wfds); ++ wf++; ++ } ++ if (fds->events & POLLERR) { ++ FD_SET(fds->fd, &efds); ++ ef++; ++ } ++ if (fds->fd > high) { ++ high = fds->fd; ++ } ++ } ++ ++ int stat = select(high + 1, (rf) ? &rfds : NULL, ++ (wf) ? &wfds : NULL, (ef) ? &efds : NULL, &tv); ++ if (stat < 1) { ++ errno = WSAGetLastError(); ++ return stat; ++ } ++ ++ high = 0; ++ ++ for (int i = 0; i < nfds; i++) { ++ fds->revents = 0; ++ if ((fds->events & POLLIN) && FD_ISSET(fds->fd, &rfds)) { ++ fds->revents |= POLLIN; ++ } ++ if ((fds->events & POLLOUT) && FD_ISSET(fds->fd, &wfds)) { ++ fds->revents |= POLLOUT; ++ } ++ if ((fds->events & POLLERR) && FD_ISSET(fds->fd, &efds)) { ++ fds->revents |= POLLERR; ++ } ++ if (fds->revents) { ++ high++; ++ } ++ } ++ ++ return high; ++} ++ ++int nixio__mgw_lockf(int fd, int cmd, off_t len) { ++ int stat; ++ if (cmd == F_LOCK) { ++ do { ++ stat = _locking(fd, _LK_LOCK, len); ++ } while (stat == -1 && errno == EDEADLOCK); ++ } else if (cmd == F_TLOCK) { ++ stat = _locking(fd, _LK_NBLCK, len); ++ } else if (cmd == F_ULOCK) { ++ stat = _locking(fd, _LK_UNLCK, len); ++ } else { ++ stat = -1; ++ errno = EINVAL; ++ } ++ return stat; ++} ++ ++char* nixio__mgw_realpath(const char *path, char *resolved) { ++ if (GetFullPathName(path, PATH_MAX, resolved, NULL)) { ++ return resolved; ++ } else { ++ errno = GetLastError(); ++ return NULL; ++ } ++} ++ ++int nixio__mgw_link(const char *oldpath, const char *newpath) { ++ if (!CreateHardLink(newpath, oldpath, NULL)) { ++ errno = GetLastError(); ++ return -1; ++ } else { ++ return 0; ++ } ++} ++ ++int nixio__mgw_utimes(const char *filename, const struct timeval times[2]) { ++ struct _utimbuf timebuffer; ++ timebuffer.actime = times[0].tv_sec; ++ timebuffer.modtime = times[1].tv_sec; ++ ++ return _utime(filename, &timebuffer); ++} +diff --git a/feeds/luci/libs/luci-lib-nixio/src/mingw-compat.h b/feeds/luci/libs/luci-lib-nixio/src/mingw-compat.h +new file mode 100644 +index 0000000..a26a4be +--- /dev/null ++++ b/feeds/luci/libs/luci-lib-nixio/src/mingw-compat.h +@@ -0,0 +1,112 @@ ++#ifndef NIXIO_MINGW_COMPAT_H_ ++#define NIXIO_MINGW_COMPAT_H_ ++ ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++ ++typedef unsigned int uint; ++typedef unsigned long ulong; ++ ++#define S_ISLNK(m) 0 ++#define S_ISSOCK(m) 0 ++ ++#define EWOULDBLOCK WSAEWOULDBLOCK ++#define EAFNOSUPPORT WSAEAFNOSUPPORT ++#define ENOPROTOOPT WSAENOPROTOOPT ++ ++#define SHUT_RD SD_RECEIVE ++#define SHUT_WR SD_SEND ++#define SHUT_RDWR SD_BOTH ++ ++#define pipe(fds) _pipe(fds, 65536, 0) ++#define fsync _commit ++#define lseek lseek64 ++#define stat _stati64 ++#define lstat _stati64 ++#define fstat _fstati64 ++ ++ ++#define F_LOCK 1 ++#define F_ULOCK 0 ++#define F_TLOCK 2 ++#define F_TEST 3 ++int nixio__mgw_lockf(int fd, int cmd, off_t len); ++#define lockf nixio__mgw_lockf ++ ++const char* nixio__mgw_inet_ntop ++(int af, const void *src, char *dst, socklen_t size); ++#define inet_ntop nixio__mgw_inet_ntop ++ ++int nixio__mgw_inet_pton (int af, const char *src, void *dst); ++#define inet_pton nixio__mgw_inet_pton ++ ++ ++#ifndef POLLIN ++#define POLLIN 0x001 ++#define POLLOUT 0x004 ++#define POLLERR 0x008 ++struct pollfd { ++ int fd; ++ short events; ++ short revents; ++}; ++#endif ++ ++typedef int nfds_t; ++int nixio__mgw_poll(struct pollfd *fds, nfds_t nfds, int timeout); ++#define poll nixio__mgw_poll ++ ++ ++struct timespec { ++ time_t tv_sec; ++ long tv_nsec; ++}; ++ ++int nixio__mgw_nanosleep(const struct timespec *req, struct timespec *rem); ++#define nanosleep nixio__mgw_nanosleep ++ ++ ++char* nixio__mgw_realpath(const char *path, char *resolved); ++#define realpath nixio__mgw_realpath ++ ++ ++int nixio__mgw_link(const char *oldpath, const char *newpath); ++#define link nixio__mgw_link ++ ++ ++int nixio__mgw_utimes(const char *filename, const struct timeval times[2]); ++#define utimes nixio__mgw_utimes ++ ++ ++#define setenv(k, v, o) !SetEnvironmentVariable(k, v) ++#define unsetenv(k) !SetEnvironmentVariable(k, NULL) ++ ++#define execv(p, a) execv(p, (const char* const*)a) ++#define execvp(p, a) execvp(p, (const char* const*)a) ++#define execve(p, a, e) execve(p, (const char* const*)a, (const char* const*)e) ++ ++#define mkdir(p, m) mkdir(p) ++ ++ ++#define nixio__perror_s(L) \ ++ errno = WSAGetLastError(); \ ++ return nixio__perror(L); ++ ++#define nixio__pstatus_s(L, c) \ ++ errno = WSAGetLastError(); \ ++ return nixio__pstatus(L, c); ++ ++ ++ ++#define NIXIO_WSA_CONSTANT(x) \ ++ lua_pushinteger(L, x); \ ++ lua_setfield(L, -2, #x+3); ++ ++void nixio_open__mingw(lua_State *L); ++ ++#endif /* NIXIO_MINGW_COMPAT_H_ */ +diff --git a/feeds/luci/libs/luci-lib-nixio/src/nixio-tls.h b/feeds/luci/libs/luci-lib-nixio/src/nixio-tls.h +new file mode 100644 +index 0000000..0fac5a9 +--- /dev/null ++++ b/feeds/luci/libs/luci-lib-nixio/src/nixio-tls.h +@@ -0,0 +1,53 @@ ++#ifndef NIXIO_TLS_H_ ++#define NIXIO_TLS_H_ ++ ++#include "nixio.h" ++#include ++ ++#ifndef WITHOUT_OPENSSL ++#include ++#include ++#include ++#endif ++ ++#define NIXIO_TLS_CTX_META "nixio.tls.ctx" ++#define NIXIO_TLS_SOCK_META "nixio.tls.sock" ++ ++typedef struct nixio_tls_socket { ++ SSL *socket; ++#ifdef WITH_AXTLS ++ char connected; ++ size_t pbufsiz; ++ char *pbufpos; ++ char *pbuffer; ++#endif ++} nixio_tls_sock; ++ ++#define NIXIO_CRYPTO_HASH_META "nixio.crypto.hash" ++#define NIXIO_DIGEST_SIZE 64 ++#define NIXIO_CRYPTO_BLOCK_SIZE 64 ++ ++#define NIXIO_HASH_NONE 0 ++#define NIXIO_HASH_MD5 0x01 ++#define NIXIO_HASH_SHA1 0x02 ++ ++#define NIXIO_HMAC_BIT 0x40 ++ ++typedef int(*nixio_hash_initcb)(void *); ++typedef int(*nixio_hash_updatecb)(void *, const void *, unsigned long); ++typedef int(*nixio_hash_finalcb)(unsigned char *, void *); ++ ++typedef struct nixio_hash_obj { ++ uint type; ++ unsigned char digest[NIXIO_DIGEST_SIZE]; ++ size_t digest_size; ++ unsigned char key[NIXIO_CRYPTO_BLOCK_SIZE]; ++ size_t key_size; ++ size_t block_size; ++ void *ctx; ++ nixio_hash_initcb init; ++ nixio_hash_updatecb update; ++ nixio_hash_finalcb final; ++} nixio_hash; ++ ++#endif /* NIXIO_TLS_H_ */ +diff --git a/feeds/luci/libs/luci-lib-nixio/src/nixio.c b/feeds/luci/libs/luci-lib-nixio/src/nixio.c +new file mode 100644 +index 0000000..ae81c6f +--- /dev/null ++++ b/feeds/luci/libs/luci-lib-nixio/src/nixio.c +@@ -0,0 +1,240 @@ ++/* ++ * nixio - Linux I/O library for lua ++ * ++ * Copyright (C) 2009 Steven Barth ++ * ++ * Licensed under the Apache License, Version 2.0 (the "License"); ++ * you may not use this file except in compliance with the License. ++ * You may obtain a copy of the License at ++ * ++ * http://www.apache.org/licenses/LICENSE-2.0 ++ * ++ * Unless required by applicable law or agreed to in writing, software ++ * distributed under the License is distributed on an "AS IS" BASIS, ++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. ++ * See the License for the specific language governing permissions and ++ * limitations under the License. ++ */ ++ ++#include "nixio.h" ++#include ++#include ++#include ++#include ++ ++#define VERSION 0.4 ++ ++ ++/* pushes nil, error number and errstring on the stack */ ++int nixio__perror(lua_State *L) { ++ if (errno == EAGAIN || errno == EWOULDBLOCK) { ++ lua_pushboolean(L, 0); ++ } else { ++ lua_pushnil(L); ++ } ++ lua_pushinteger(L, errno); ++ lua_pushstring(L, strerror(errno)); ++ return 3; ++} ++ ++/* pushes true, if operation succeeded, otherwise call nixio__perror */ ++int nixio__pstatus(lua_State *L, int condition) { ++ if (condition) { ++ lua_pushboolean(L, 1); ++ return 1; ++ } else { ++ return nixio__perror(L); ++ } ++} ++ ++/* checks whether the first argument is a socket and returns it */ ++nixio_sock* nixio__checksock(lua_State *L) { ++ nixio_sock *sock = (nixio_sock*)luaL_checkudata(L, 1, NIXIO_META); ++ luaL_argcheck(L, sock->fd != -1, 1, "invalid socket object"); ++ return sock; ++} ++ ++/* read fd from nixio_sock object */ ++int nixio__checksockfd(lua_State *L) { ++ return nixio__checksock(L)->fd; ++} ++ ++/* return any possible fd, otherwise error out */ ++int nixio__checkfd(lua_State *L, int ud) { ++ int fd = nixio__tofd(L, ud); ++ return (fd != -1) ? fd : luaL_argerror(L, ud, "invalid file descriptor"); ++} ++ ++/* return any possible fd */ ++int nixio__tofd(lua_State *L, int ud) { ++ void *udata = lua_touserdata(L, ud); ++ int fd = -1; ++ if (lua_getmetatable(L, ud)) { ++ luaL_getmetatable(L, NIXIO_META); ++ luaL_getmetatable(L, NIXIO_FILE_META); ++ luaL_getmetatable(L, LUA_FILEHANDLE); ++ if (lua_rawequal(L, -3, -4)) { ++ fd = ((nixio_sock*)udata)->fd; ++ } else if (lua_rawequal(L, -2, -4)) { ++ fd = *((int*)udata); ++ } else if (lua_rawequal(L, -1, -4)) { ++ fd = (*((FILE **)udata)) ? fileno(*((FILE **)udata)) : -1; ++ } ++ lua_pop(L, 4); ++ } ++ return fd; ++} ++ ++/* An empty iterator */ ++int nixio__nulliter(lua_State *L) { ++ lua_pushnil(L); ++ return 1; ++} ++ ++static int nixio_errno(lua_State *L) { ++ lua_pushinteger(L, errno); ++ return 1; ++} ++ ++static int nixio_strerror(lua_State *L) { ++ lua_pushstring(L, strerror(luaL_checkinteger(L, 1))); ++ return 1; ++} ++ ++/* object table */ ++static const luaL_reg R[] = { ++ {"errno", nixio_errno}, ++ {"strerror", nixio_strerror}, ++ {NULL, NULL} ++}; ++ ++/* entry point */ ++NIXIO_API int luaopen_nixio(lua_State *L) { ++ /* create metatable */ ++ luaL_newmetatable(L, NIXIO_META); ++ ++ /* metatable.__index = metatable */ ++ lua_pushvalue(L, -1); ++ lua_setfield(L, -2, "__index"); ++ ++ /* register module */ ++ luaL_register(L, "nixio", R); ++ ++ /* register metatable as socket_meta */ ++ lua_pushvalue(L, -2); ++ lua_setfield(L, -2, "meta_socket"); ++ ++ /* register methods */ ++#ifdef __WINNT__ ++ nixio_open__mingw(L); ++#endif ++ nixio_open_file(L); ++ nixio_open_socket(L); ++ nixio_open_sockopt(L); ++ nixio_open_bind(L); ++ nixio_open_address(L); ++ nixio_open_protoent(L); ++ nixio_open_poll(L); ++ nixio_open_io(L); ++ nixio_open_splice(L); ++ nixio_open_process(L); ++ nixio_open_syslog(L); ++ nixio_open_bit(L); ++ nixio_open_bin(L); ++ nixio_open_fs(L); ++ nixio_open_user(L); ++ ++#ifndef NO_TLS ++ nixio_open_tls_crypto(L); ++ nixio_open_tls_context(L); ++ nixio_open_tls_socket(L); ++#endif ++ ++ /* module version */ ++ lua_pushinteger(L, VERSION); ++ lua_setfield(L, -2, "version"); ++ ++ /* some constants */ ++ lua_newtable(L); ++ ++ lua_pushliteral(L, NIXIO_SEP); ++ lua_setfield(L, -2, "sep"); ++ ++ lua_pushliteral(L, NIXIO_PATHSEP); ++ lua_setfield(L, -2, "pathsep"); ++ ++ lua_pushinteger(L, NIXIO_BUFFERSIZE); ++ lua_setfield(L, -2, "buffersize"); ++ ++ NIXIO_PUSH_CONSTANT(EACCES); ++ NIXIO_PUSH_CONSTANT(EINTR); ++ NIXIO_PUSH_CONSTANT(ENOSYS); ++ NIXIO_PUSH_CONSTANT(EINVAL); ++ NIXIO_PUSH_CONSTANT(EAGAIN); ++ NIXIO_PUSH_CONSTANT(ENOMEM); ++ NIXIO_PUSH_CONSTANT(ENOENT); ++ NIXIO_PUSH_CONSTANT(ECHILD); ++ NIXIO_PUSH_CONSTANT(EIO); ++ NIXIO_PUSH_CONSTANT(EBADF); ++ NIXIO_PUSH_CONSTANT(EFAULT); ++ NIXIO_PUSH_CONSTANT(EFBIG); ++ NIXIO_PUSH_CONSTANT(ENOSPC); ++ NIXIO_PUSH_CONSTANT(EPIPE); ++ NIXIO_PUSH_CONSTANT(ESPIPE); ++ NIXIO_PUSH_CONSTANT(EISDIR); ++ NIXIO_PUSH_CONSTANT(EPERM); ++ NIXIO_PUSH_CONSTANT(EEXIST); ++ NIXIO_PUSH_CONSTANT(EMFILE); ++ NIXIO_PUSH_CONSTANT(ENAMETOOLONG); ++ NIXIO_PUSH_CONSTANT(ENFILE); ++ NIXIO_PUSH_CONSTANT(ENODEV); ++ NIXIO_PUSH_CONSTANT(EXDEV); ++ NIXIO_PUSH_CONSTANT(ENOTDIR); ++ NIXIO_PUSH_CONSTANT(ENXIO); ++ NIXIO_PUSH_CONSTANT(EROFS); ++ NIXIO_PUSH_CONSTANT(EBUSY); ++ NIXIO_PUSH_CONSTANT(ESRCH); ++ NIXIO_PUSH_CONSTANT(SIGINT); ++ NIXIO_PUSH_CONSTANT(SIGTERM); ++ NIXIO_PUSH_CONSTANT(SIGSEGV); ++ ++#ifndef __WINNT__ ++ NIXIO_PUSH_CONSTANT(EALREADY); ++ NIXIO_PUSH_CONSTANT(EINPROGRESS); ++ NIXIO_PUSH_CONSTANT(EWOULDBLOCK); ++ NIXIO_PUSH_CONSTANT(ELOOP); ++ NIXIO_PUSH_CONSTANT(EOVERFLOW); ++ NIXIO_PUSH_CONSTANT(ETXTBSY); ++ NIXIO_PUSH_CONSTANT(EAFNOSUPPORT); ++ NIXIO_PUSH_CONSTANT(ENOBUFS); ++ NIXIO_PUSH_CONSTANT(EPROTONOSUPPORT); ++ NIXIO_PUSH_CONSTANT(ENOPROTOOPT); ++ NIXIO_PUSH_CONSTANT(EADDRINUSE); ++ NIXIO_PUSH_CONSTANT(ENETDOWN); ++ NIXIO_PUSH_CONSTANT(ENETUNREACH); ++ ++ NIXIO_PUSH_CONSTANT(SIGALRM); ++ NIXIO_PUSH_CONSTANT(SIGKILL); ++ NIXIO_PUSH_CONSTANT(SIGHUP); ++ NIXIO_PUSH_CONSTANT(SIGSTOP); ++ NIXIO_PUSH_CONSTANT(SIGCONT); ++ NIXIO_PUSH_CONSTANT(SIGCHLD); ++ NIXIO_PUSH_CONSTANT(SIGQUIT); ++ NIXIO_PUSH_CONSTANT(SIGUSR1); ++ NIXIO_PUSH_CONSTANT(SIGUSR2); ++ NIXIO_PUSH_CONSTANT(SIGIO); ++ NIXIO_PUSH_CONSTANT(SIGURG); ++ NIXIO_PUSH_CONSTANT(SIGPIPE); ++ ++ lua_pushvalue(L, -1); ++ lua_setfield(L, -3, "const_sock"); ++ ++ signal(SIGPIPE, SIG_IGN); ++#endif /* !__WINNT__ */ ++ lua_setfield(L, -2, "const"); ++ ++ /* remove meta table */ ++ lua_remove(L, -2); ++ ++ return 1; ++} +diff --git a/feeds/luci/libs/luci-lib-nixio/src/nixio.h b/feeds/luci/libs/luci-lib-nixio/src/nixio.h +new file mode 100644 +index 0000000..8802e92 +--- /dev/null ++++ b/feeds/luci/libs/luci-lib-nixio/src/nixio.h +@@ -0,0 +1,133 @@ ++#ifndef NIXIO_H_ ++#define NIXIO_H_ ++ ++#define NIXIO_OOM "out of memory" ++ ++#define NIXIO_META "nixio.socket" ++#define NIXIO_FILE_META "nixio.file" ++#define NIXIO_GLOB_META "nixio.glob" ++#define NIXIO_DIR_META "nixio.dir" ++#define _FILE_OFFSET_BITS 64 ++ ++#define NIXIO_PUSH_CONSTANT(x) \ ++ lua_pushinteger(L, x); \ ++ lua_setfield(L, -2, #x); ++ ++/* uClibc: broken as always */ ++#define _LARGEFILE_SOURCE ++ ++#include ++#include ++#include ++#include ++ ++#define NIXIO_BUFFERSIZE 8192 ++ ++typedef struct nixio_socket { ++ int fd; ++ int domain; ++ int type; ++ int protocol; ++} nixio_sock; ++ ++typedef struct nixio_address { ++ int family; ++ char host[128]; ++ int port; ++ int prefix; ++} nixio_addr; ++ ++int nixio__perror(lua_State *L); ++int nixio__pstatus(lua_State *L, int condition); ++ ++#if defined(LUA_NUMBER_DOUBLE) || defined(LNUM_DOUBLE) || defined(LNUM_LDOUBLE) ++#define NIXIO_DOUBLE 1 ++#define nixio__checknumber luaL_checknumber ++#define nixio__pushnumber lua_pushnumber ++#define nixio__optnumber luaL_optnumber ++#else ++#define nixio__checknumber luaL_checkinteger ++#define nixio__pushnumber lua_pushinteger ++#define nixio__optnumber luaL_optinteger ++#endif ++ ++ ++#ifndef __WINNT__ ++ ++#define NIXIO_API extern ++ ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++ ++#define NIXIO_SEP "/" ++#define NIXIO_PATHSEP ":" ++ ++#define nixio__perror_s nixio__perror ++#define nixio__pstatus_s nixio__pstatus ++ ++int nixio__check_group(lua_State *L, int idx); ++int nixio__check_user(lua_State *L, int idx); ++ ++typedef struct stat nixio_stat_t; ++ ++#else /* __WINNT__ */ ++ ++#define NIXIO_API extern __declspec(dllexport) ++#define NIXIO_SEP "\\" ++#define NIXIO_PATHSEP ";" ++#include "mingw-compat.h" ++ ++typedef struct _stati64 nixio_stat_t; ++ ++#endif ++ ++nixio_sock* nixio__checksock(lua_State *L); ++int nixio__checksockfd(lua_State *L); ++int nixio__checkfd(lua_State *L, int ud); ++int nixio__tofd(lua_State *L, int ud); ++int nixio__nulliter(lua_State *L); ++ ++int nixio__addr_parse(nixio_addr *addr, struct sockaddr *saddr); ++int nixio__addr_write(nixio_addr *addr, struct sockaddr *saddr); ++ ++int nixio__check_mode(lua_State *L, int idx, int def); ++int nixio__mode_write(int mode, char *modestr); ++ ++int nixio__push_stat(lua_State *L, nixio_stat_t *buf); ++ ++const char nixio__bin2hex[16]; ++ ++/* Module functions */ ++void nixio_open_file(lua_State *L); ++void nixio_open_socket(lua_State *L); ++void nixio_open_sockopt(lua_State *L); ++void nixio_open_bind(lua_State *L); ++void nixio_open_address(lua_State *L); ++void nixio_open_protoent(lua_State *L); ++void nixio_open_poll(lua_State *L); ++void nixio_open_io(lua_State *L); ++void nixio_open_splice(lua_State *L); ++void nixio_open_process(lua_State *L); ++void nixio_open_syslog(lua_State *L); ++void nixio_open_bit(lua_State *L); ++void nixio_open_bin(lua_State *L); ++void nixio_open_fs(lua_State *L); ++void nixio_open_user(lua_State *L); ++ ++#ifndef NO_TLS ++void nixio_open_tls_crypto(lua_State *L); ++void nixio_open_tls_context(lua_State *L); ++void nixio_open_tls_socket(lua_State *L); ++#endif ++ ++/* Method functions */ ++ ++#endif /* NIXIO_H_ */ +diff --git a/feeds/luci/libs/luci-lib-nixio/src/poll.c b/feeds/luci/libs/luci-lib-nixio/src/poll.c +new file mode 100644 +index 0000000..1211bc7 +--- /dev/null ++++ b/feeds/luci/libs/luci-lib-nixio/src/poll.c +@@ -0,0 +1,210 @@ ++/* ++ * nixio - Linux I/O library for lua ++ * ++ * Copyright (C) 2009 Steven Barth ++ * ++ * Licensed under the Apache License, Version 2.0 (the "License"); ++ * you may not use this file except in compliance with the License. ++ * You may obtain a copy of the License at ++ * ++ * http://www.apache.org/licenses/LICENSE-2.0 ++ * ++ * Unless required by applicable law or agreed to in writing, software ++ * distributed under the License is distributed on an "AS IS" BASIS, ++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. ++ * See the License for the specific language governing permissions and ++ * limitations under the License. ++ */ ++ ++#include "nixio.h" ++#include ++#include ++#include ++#include ++#include ++ ++ ++static int nixio_gettimeofday(lua_State *L) { ++ struct timeval tv; ++ gettimeofday(&tv, NULL); ++ nixio__pushnumber(L, tv.tv_sec); ++ nixio__pushnumber(L, tv.tv_usec); ++ return 2; ++} ++ ++ ++/** ++ * nanosleep() ++ */ ++static int nixio_nanosleep(lua_State *L) { ++ struct timespec req, rem; ++ req.tv_sec = luaL_optint(L, 1, 0); ++ req.tv_nsec = luaL_optint(L, 2, 0); ++ ++ int status = nanosleep(&req, &rem); ++ if (!status) { ++ lua_pushboolean(L, 1); ++ return 1; ++ } else { ++ if (errno == EINTR) { ++ lua_pushboolean(L, 0); ++ lua_pushinteger(L, rem.tv_sec); ++ lua_pushinteger(L, rem.tv_nsec); ++ return 3; ++ } else { ++ return nixio__perror(L); ++ } ++ } ++} ++ ++/** ++ * Checks whether a flag is set in the bitmap and sets the matching table value ++ */ ++static void nixio_poll_flags__r(lua_State *L, int *map, int f, const char *t) { ++ lua_pushstring(L, t); ++ if (*map & f) { ++ lua_pushboolean(L, 1); ++ } else { ++ lua_pushnil(L); ++ } ++ lua_rawset(L, -3); ++} ++ ++/** ++ * Translate integer to poll flags and vice versa ++ */ ++static int nixio_poll_flags(lua_State *L) { ++ int flags; ++ if (lua_isnumber(L, 1)) { ++ flags = luaL_checkinteger(L, 1); ++ lua_newtable(L); ++ nixio_poll_flags__r(L, &flags, POLLIN, "in"); ++ nixio_poll_flags__r(L, &flags, POLLOUT, "out"); ++ nixio_poll_flags__r(L, &flags, POLLERR, "err"); ++#ifndef __WINNT__ ++ nixio_poll_flags__r(L, &flags, POLLPRI, "pri"); ++ nixio_poll_flags__r(L, &flags, POLLHUP, "hup"); ++ nixio_poll_flags__r(L, &flags, POLLNVAL, "nval"); ++#endif ++ } else { ++ flags = 0; ++ const int j = lua_gettop(L); ++ for (int i=1; i<=j; i++) { ++ const char *flag = luaL_checkstring(L, i); ++ if (!strcmp(flag, "in")) { ++ flags |= POLLIN; ++ } else if (!strcmp(flag, "out")) { ++ flags |= POLLOUT; ++ } else if (!strcmp(flag, "err")) { ++ flags |= POLLERR; ++ } else if (!strcmp(flag, "pri")) { ++#ifndef __WINNT__ ++ flags |= POLLPRI; ++#endif ++ } else if (!strcmp(flag, "hup")) { ++#ifndef __WINNT__ ++ flags |= POLLHUP; ++#endif ++ } else if (!strcmp(flag, "nval")) { ++#ifndef __WINNT__ ++ flags |= POLLNVAL; ++#endif ++ } else { ++ return luaL_argerror(L, i, ++ "supported values: in, pri, out, err, hup, nval"); ++ } ++ } ++ lua_pushinteger(L, flags); ++ } ++ return 1; ++} ++ ++/** ++ * poll({{fd = socket, events = FLAGS}, ...}, timeout) ++ */ ++static int nixio_poll(lua_State *L) { ++ int len = lua_objlen(L, 1); ++ int i, fd; ++ int timeout = luaL_optint(L, 2, 0); ++ int status = -1; ++ ++ /* we are being abused as sleep() replacement... */ ++ if (lua_isnoneornil(L, 1) || len < 1) { ++ if (!poll(NULL, 0, timeout)) { ++ lua_pushinteger(L, 0); ++ return 1; ++ } else { ++ return nixio__perror(L); ++ } ++ } ++ ++ luaL_checktype(L, 1, LUA_TTABLE); ++ struct pollfd *fds = calloc(len, sizeof(struct pollfd)); ++ if (!fds) { ++ return luaL_error(L, NIXIO_OOM); ++ } ++ ++ for (i = 0; i < len; i++) { ++ lua_rawgeti(L, 1, i+1); ++ if (!lua_istable(L, -1)) { ++ free(fds); ++ return luaL_argerror(L, 1, "invalid datastructure"); ++ } ++ ++ lua_pushliteral(L, "fd"); ++ lua_rawget(L, -2); ++ fd = nixio__tofd(L, -1); ++ if (fd == -1) { ++ free(fds); ++ return luaL_argerror(L, 1, "invalid fd in datastructure"); ++ } ++ fds[i].fd = fd; ++ ++ lua_pushliteral(L, "events"); ++ lua_rawget(L, -3); ++ fds[i].events = (short)lua_tointeger(L, -1); ++ ++ lua_pop(L, 3); ++ } ++ ++ status = poll(fds, (nfds_t)len, timeout); ++ ++ if (status == 0) { ++ free(fds); ++ lua_pushboolean(L, 0); ++ return 1; ++ } else if (status < 0) { ++ free(fds); ++ return nixio__perror(L); ++ } ++ ++ for (i = 0; i < len; i++) { ++ lua_rawgeti(L, 1, i+1); ++ ++ lua_pushliteral(L, "revents"); ++ lua_pushinteger(L, fds[i].revents); ++ lua_rawset(L, -3); ++ ++ lua_pop(L, 1); ++ } ++ ++ free(fds); ++ ++ lua_pushinteger(L, status); ++ lua_pushvalue(L, 1); ++ ++ return 2; ++} ++ ++/* module table */ ++static const luaL_reg R[] = { ++ {"gettimeofday", nixio_gettimeofday}, ++ {"nanosleep", nixio_nanosleep}, ++ {"poll", nixio_poll}, ++ {"poll_flags", nixio_poll_flags}, ++ {NULL, NULL} ++}; ++ ++void nixio_open_poll(lua_State *L) { ++ luaL_register(L, NULL, R); ++} +diff --git a/feeds/luci/libs/luci-lib-nixio/src/process.c b/feeds/luci/libs/luci-lib-nixio/src/process.c +new file mode 100644 +index 0000000..5ae9b82 +--- /dev/null ++++ b/feeds/luci/libs/luci-lib-nixio/src/process.c +@@ -0,0 +1,450 @@ ++/* ++ * nixio - Linux I/O library for lua ++ * ++ * Copyright (C) 2009 Steven Barth ++ * ++ * Licensed under the Apache License, Version 2.0 (the "License"); ++ * you may not use this file except in compliance with the License. ++ * You may obtain a copy of the License at ++ * ++ * http://www.apache.org/licenses/LICENSE-2.0 ++ * ++ * Unless required by applicable law or agreed to in writing, software ++ * distributed under the License is distributed on an "AS IS" BASIS, ++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. ++ * See the License for the specific language governing permissions and ++ * limitations under the License. ++ */ ++ ++#include "nixio.h" ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++ ++#define NIXIO_EXECVE 0x01 ++#define NIXIO_EXECV 0x02 ++#define NIXIO_EXECVP 0x03 ++ ++int nixio__exec(lua_State *L, int m) { ++ const char *path = luaL_checkstring(L, 1); ++ const char *arg; ++ int argn, i; ++ ++ if (m == NIXIO_EXECVE) { ++ luaL_checktype(L, 2, LUA_TTABLE); ++ argn = lua_objlen(L, 2) + 1; ++ } else { ++ argn = lua_gettop(L); ++ } ++ ++ char **args = lua_newuserdata(L, sizeof(char*) * (argn + 1)); ++ args[argn] = NULL; ++ args[0] = (char *)path; ++ ++ if (m == NIXIO_EXECVE) { ++ for (i = 1; i < argn; i++) { ++ lua_rawgeti(L, 2, i); ++ arg = lua_tostring(L, -1); ++ luaL_argcheck(L, arg, 2, "invalid argument"); ++ args[i] = (char *)arg; ++ } ++ ++ if (lua_isnoneornil(L, 3)) { ++ execv(path, args); ++ } else { ++ luaL_checktype(L, 3, LUA_TTABLE); ++ argn = 0; ++ lua_pushnil(L); ++ while (lua_next(L, 3)) { ++ if (!lua_checkstack(L, 1)) { ++ lua_settop(L, 0); ++ return luaL_error(L, "stack overflow"); ++ } ++ ++ if (lua_type(L, -2) != LUA_TSTRING || !lua_isstring(L, -1)) { ++ return luaL_argerror(L, 3, "invalid environment"); ++ } ++ ++ lua_pushfstring(L, "%s=%s", ++ lua_tostring(L, -2), lua_tostring(L, -1)); ++ ++ lua_insert(L, 5); ++ lua_pop(L, 1); ++ argn++; ++ } ++ ++ char **env = lua_newuserdata(L, sizeof(char*) * (argn + 1)); ++ env[argn] = NULL; ++ ++ for (i = 1; i <= argn; i++) { ++ env[i-1] = (char *)lua_tostring(L, -(i+1)); ++ } ++ ++ execve(path, args, env); ++ } ++ } else { ++ for (i = 2; i <= argn; i++) { ++ arg = luaL_checkstring(L, i); ++ args[i-1] = (char *)arg; ++ } ++ ++ if (m == NIXIO_EXECV) { ++ execv(path, args); ++ } else { ++ execvp(path, args); ++ } ++ } ++ ++ return nixio__perror(L); ++} ++ ++#ifndef __WINNT__ ++#include ++#include ++#include ++#include ++#include ++ ++static int nixio_fork(lua_State *L) { ++ pid_t pid = fork(); ++ if (pid == -1) { ++ return nixio__perror(L); ++ } else { ++ lua_pushinteger(L, pid); ++ return 1; ++ } ++} ++ ++static int nixio_kill(lua_State *L) { ++ return nixio__pstatus(L, !kill(luaL_checkint(L, 1), luaL_checkint(L, 2))); ++} ++ ++static int nixio_getppid(lua_State *L) { ++ lua_pushinteger(L, getppid()); ++ return 1; ++} ++ ++static int nixio_getuid(lua_State *L) { ++ lua_pushinteger(L, getuid()); ++ return 1; ++} ++ ++static int nixio_getgid(lua_State *L) { ++ lua_pushinteger(L, getgid()); ++ return 1; ++} ++ ++static int nixio_setgid(lua_State *L) { ++ return nixio__pstatus(L, !setgid(nixio__check_group(L, 1))); ++} ++ ++static int nixio_setuid(lua_State *L) { ++ return nixio__pstatus(L, !setuid(nixio__check_user(L, 1))); ++} ++ ++static int nixio_nice(lua_State *L) { ++ int nval = luaL_checkint(L, 1); ++ ++ errno = 0; ++ nval = nice(nval); ++ ++ if (nval == -1 && errno) { ++ return nixio__perror(L); ++ } else { ++ lua_pushinteger(L, nval); ++ return 1; ++ } ++} ++ ++static int nixio_setsid(lua_State *L) { ++ pid_t pid = setsid(); ++ ++ if (pid == -1) { ++ return nixio__perror(L); ++ } else { ++ lua_pushinteger(L, pid); ++ return 1; ++ } ++} ++ ++static int nixio_wait(lua_State *L) { ++ pid_t pidin = luaL_optinteger(L, 1, -1), pidout; ++ int options = 0, status; ++ ++ const int j = lua_gettop(L); ++ for (int i=2; i<=j; i++) { ++ const char *flag = luaL_checkstring(L, i); ++ if (!strcmp(flag, "nohang")) { ++ options |= WNOHANG; ++ } else if (!strcmp(flag, "untraced")) { ++ options |= WUNTRACED; ++ } else if (!strcmp(flag, "continued")) { ++ options |= WCONTINUED; ++ } else { ++ return luaL_argerror(L, i, ++ "supported values: nohang, untraced, continued"); ++ } ++ } ++ ++ do { ++ pidout = waitpid(pidin, &status, options); ++ } while (pidout == -1 && errno == EINTR); ++ ++ if (pidout == 0) { ++ lua_pushboolean(L, 0); ++ return 1; ++ } else if (pidout == -1) { ++ return nixio__perror(L); ++ } else { ++ lua_pushinteger(L, pidout); ++ } ++ ++ if (WIFEXITED(status)) { ++ lua_pushliteral(L, "exited"); ++ lua_pushinteger(L, WEXITSTATUS(status)); ++ } else if (WIFSIGNALED(status)) { ++ lua_pushliteral(L, "signaled"); ++ lua_pushinteger(L, WTERMSIG(status)); ++ } else if (WIFSTOPPED(status)) { ++ lua_pushliteral(L, "stopped"); ++ lua_pushinteger(L, WSTOPSIG(status)); ++ } else { ++ return 1; ++ } ++ ++ return 3; ++} ++ ++static int nixio_times(lua_State *L) { ++ struct tms buf; ++ if (times(&buf) == -1) { ++ return nixio__perror(L); ++ } else { ++ lua_createtable(L, 0, 4); ++ nixio__pushnumber(L, buf.tms_cstime); ++ lua_setfield(L, -2, "cstime"); ++ ++ nixio__pushnumber(L, buf.tms_cutime); ++ lua_setfield(L, -2, "cutime"); ++ ++ nixio__pushnumber(L, buf.tms_stime); ++ lua_setfield(L, -2, "stime"); ++ ++ nixio__pushnumber(L, buf.tms_utime); ++ lua_setfield(L, -2, "utime"); ++ ++ return 1; ++ } ++} ++ ++static int nixio_uname(lua_State *L) { ++ struct utsname buf; ++ if (uname(&buf)) { ++ return nixio__perror(L); ++ } ++ ++ lua_createtable(L, 0, 5); ++ ++ lua_pushstring(L, buf.machine); ++ lua_setfield(L, -2, "machine"); ++ ++ lua_pushstring(L, buf.version); ++ lua_setfield(L, -2, "version"); ++ ++ lua_pushstring(L, buf.release); ++ lua_setfield(L, -2, "release"); ++ ++ lua_pushstring(L, buf.nodename); ++ lua_setfield(L, -2, "nodename"); ++ ++ lua_pushstring(L, buf.sysname); ++ lua_setfield(L, -2, "sysname"); ++ ++ return 1; ++} ++ ++#endif /* !__WINNT__ */ ++ ++static int nixio_chdir(lua_State *L) { ++ return nixio__pstatus(L, !chdir(luaL_checkstring(L, 1))); ++} ++ ++static int nixio_signal(lua_State *L) { ++ int sig = luaL_checkinteger(L, 1); ++ const char *val = luaL_checkstring(L, 2); ++ ++ if (!strcmp(val, "ign") || !strcmp(val, "ignore")) { ++ return nixio__pstatus(L, signal(sig, SIG_IGN) != SIG_ERR); ++ } else if (!strcmp(val, "dfl") || !strcmp(val, "default")) { ++ return nixio__pstatus(L, signal(sig, SIG_DFL) != SIG_ERR); ++ } else { ++ return luaL_argerror(L, 2, "supported values: ign, dfl"); ++ } ++} ++ ++static int nixio_getpid(lua_State *L) { ++ lua_pushinteger(L, getpid()); ++ return 1; ++} ++ ++static int nixio_getenv(lua_State *L) { ++ const char *key = luaL_optstring(L, 1, NULL); ++ if (key) { ++ const char *val = getenv(key); ++ if (val) { ++ lua_pushstring(L, val); ++ } else { ++ lua_pushnil(L); ++ } ++ } else { ++ lua_newtable(L); ++ extern char **environ; ++ for (char **c = environ; *c; c++) { ++ const char *delim = strchr(*c, '='); ++ if (!delim) { ++ return luaL_error(L, "invalid environment"); ++ } ++ lua_pushlstring(L, *c, delim-*c); ++ lua_pushstring(L, delim + 1); ++ lua_rawset(L, -3); ++ } ++ } ++ return 1; ++} ++ ++static int nixio_setenv(lua_State *L) { ++ const char *key = luaL_checkstring(L, 1); ++ const char *val = luaL_optstring(L, 2, NULL); ++ return nixio__pstatus(L, (val) ? !setenv(key, val, 1) : !unsetenv(key)); ++} ++ ++static int nixio_exec(lua_State *L) { ++ return nixio__exec(L, NIXIO_EXECV); ++} ++ ++static int nixio_execp(lua_State *L) { ++ return nixio__exec(L, NIXIO_EXECVP); ++} ++ ++static int nixio_exece(lua_State *L) { ++ return nixio__exec(L, NIXIO_EXECVE); ++} ++ ++static int nixio_getcwd(lua_State *L) { ++ char path[PATH_MAX]; ++ ++ if (getcwd(path, sizeof(path))) { ++ lua_pushstring(L, path); ++ return 1; ++ } else { ++ return nixio__perror(L); ++ } ++} ++ ++static int nixio_umask(lua_State *L) { ++ char mask[9]; ++ lua_pushinteger(L, ++ nixio__mode_write(umask(nixio__check_mode(L, 1, -1)), mask)); ++ lua_pushlstring(L, mask, 9); ++ return 2; ++} ++ ++#ifdef __linux__ ++ ++#include ++ ++static int nixio_sysinfo(lua_State *L) { ++ struct sysinfo info; ++ if (sysinfo(&info)) { ++ return nixio__perror(L); ++ } ++ ++ lua_createtable(L, 0, 12); ++ ++ nixio__pushnumber(L, info.bufferram); ++ lua_setfield(L, -2, "bufferram"); ++ ++ nixio__pushnumber(L, info.freehigh); ++ lua_setfield(L, -2, "freehigh"); ++ ++ nixio__pushnumber(L, info.freeram); ++ lua_setfield(L, -2, "freeram"); ++ ++ nixio__pushnumber(L, info.freeswap); ++ lua_setfield(L, -2, "freeswap"); ++ ++ lua_createtable(L, 0, 3); ++ for (int i=0; i<3; i++) { ++ lua_pushnumber(L, info.loads[i] / 65536.); ++ lua_rawseti(L, -2, i+1); ++ } ++ lua_setfield(L, -2, "loads"); ++ ++ lua_pushinteger(L, info.mem_unit); ++ lua_setfield(L, -2, "mem_unit"); ++ ++ lua_pushinteger(L, info.procs); ++ lua_setfield(L, -2, "procs"); ++ ++ nixio__pushnumber(L, info.sharedram); ++ lua_setfield(L, -2, "sharedram"); ++ ++ nixio__pushnumber(L, info.totalhigh); ++ lua_setfield(L, -2, "totalhigh"); ++ ++ nixio__pushnumber(L, info.totalram); ++ lua_setfield(L, -2, "totalram"); ++ ++ nixio__pushnumber(L, info.totalswap); ++ lua_setfield(L, -2, "totalswap"); ++ ++ lua_pushinteger(L, info.uptime); ++ lua_setfield(L, -2, "uptime"); ++ ++ return 1; ++} ++ ++#endif ++ ++ ++/* module table */ ++static const luaL_reg R[] = { ++#ifdef __linux__ ++ {"sysinfo", nixio_sysinfo}, ++#endif ++#ifndef __WINNT__ ++ {"fork", nixio_fork}, ++ {"kill", nixio_kill}, ++ {"nice", nixio_nice}, ++ {"getppid", nixio_getppid}, ++ {"getuid", nixio_getuid}, ++ {"getgid", nixio_getgid}, ++ {"setuid", nixio_setuid}, ++ {"setgid", nixio_setgid}, ++ {"setsid", nixio_setsid}, ++ {"wait", nixio_wait}, ++ {"waitpid", nixio_wait}, ++ {"times", nixio_times}, ++ {"uname", nixio_uname}, ++#endif ++ {"chdir", nixio_chdir}, ++ {"signal", nixio_signal}, ++ {"getpid", nixio_getpid}, ++ {"getenv", nixio_getenv}, ++ {"setenv", nixio_setenv}, ++ {"putenv", nixio_setenv}, ++ {"exec", nixio_exec}, ++ {"execp", nixio_execp}, ++ {"exece", nixio_exece}, ++ {"getcwd", nixio_getcwd}, ++ {"umask", nixio_umask}, ++ {NULL, NULL} ++}; ++ ++void nixio_open_process(lua_State *L) { ++ luaL_register(L, NULL, R); ++} +diff --git a/feeds/luci/libs/luci-lib-nixio/src/protoent.c b/feeds/luci/libs/luci-lib-nixio/src/protoent.c +new file mode 100644 +index 0000000..bda68a5 +--- /dev/null ++++ b/feeds/luci/libs/luci-lib-nixio/src/protoent.c +@@ -0,0 +1,103 @@ ++/* ++ * nixio - Linux I/O library for lua ++ * ++ * Copyright (C) 2011 Jo-Philipp Wich ++ * ++ * Licensed under the Apache License, Version 2.0 (the "License"); ++ * you may not use this file except in compliance with the License. ++ * You may obtain a copy of the License at ++ * ++ * http://www.apache.org/licenses/LICENSE-2.0 ++ * ++ * Unless required by applicable law or agreed to in writing, software ++ * distributed under the License is distributed on an "AS IS" BASIS, ++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. ++ * See the License for the specific language governing permissions and ++ * limitations under the License. ++ */ ++ ++#include "nixio.h" ++ ++#ifndef __WINNT__ ++#include ++#endif ++ ++/** ++ * protoent conversion helper ++ */ ++static int nixio__pushprotoent(lua_State *L, struct protoent *e) { ++ int i; ++ if (e) { ++ lua_newtable(L); ++ ++ lua_pushstring(L, e->p_name); ++ lua_setfield(L, -2, "name"); ++ ++ lua_pushnumber(L, e->p_proto); ++ lua_setfield(L, -2, "proto"); ++ ++ lua_newtable(L); ++ for (i = 0; e->p_aliases[i]; i++) { ++ lua_pushstring(L, e->p_aliases[i]); ++ lua_rawseti(L, -2, i+1); ++ } ++ lua_setfield(L, -2, "aliases"); ++ return 1; ++ } else { ++ return 0; ++ } ++} ++ ++/** ++ * getprotobyname(name) ++ */ ++static int nixio_getprotobyname(lua_State *L) { ++ const char *name = luaL_checkstring(L, 1); ++ struct protoent *res = getprotobyname(name); ++ return nixio__pushprotoent(L, res); ++} ++ ++/** ++ * getprotobynumber(proto) ++ */ ++static int nixio_getprotobynumber(lua_State *L) { ++ int proto = luaL_checkinteger(L, 1); ++ struct protoent *res = getprotobynumber(proto); ++ return nixio__pushprotoent(L, res); ++} ++ ++/** ++ * getproto(name_or_proto) ++ */ ++static int nixio_getproto(lua_State *L) { ++ int i = 1; ++ struct protoent *res; ++ if (lua_isnumber(L, 1)) { ++ return nixio_getprotobynumber(L); ++ } else if (lua_isstring(L, 1)) { ++ return nixio_getprotobyname(L); ++ } else if (lua_isnoneornil(L, 1)) { ++ setprotoent(1); ++ lua_newtable(L); ++ while ((res = getprotoent()) != NULL) { ++ nixio__pushprotoent(L, res); ++ lua_rawseti(L, -2, i++); ++ } ++ endprotoent(); ++ return 1; ++ } else { ++ return luaL_argerror(L, 1, "supported values: , "); ++ } ++} ++ ++/* module table */ ++static const luaL_reg R[] = { ++ {"getprotobyname", nixio_getprotobyname}, ++ {"getprotobynumber", nixio_getprotobynumber}, ++ {"getproto", nixio_getproto}, ++ {NULL, NULL} ++}; ++ ++void nixio_open_protoent(lua_State *L) { ++ luaL_register(L, NULL, R); ++} +diff --git a/feeds/luci/libs/luci-lib-nixio/src/socket.c b/feeds/luci/libs/luci-lib-nixio/src/socket.c +new file mode 100644 +index 0000000..17c6afc +--- /dev/null ++++ b/feeds/luci/libs/luci-lib-nixio/src/socket.c +@@ -0,0 +1,173 @@ ++/* ++ * nixio - Linux I/O library for lua ++ * ++ * Copyright (C) 2009 Steven Barth ++ * ++ * Licensed under the Apache License, Version 2.0 (the "License"); ++ * you may not use this file except in compliance with the License. ++ * You may obtain a copy of the License at ++ * ++ * http://www.apache.org/licenses/LICENSE-2.0 ++ * ++ * Unless required by applicable law or agreed to in writing, software ++ * distributed under the License is distributed on an "AS IS" BASIS, ++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. ++ * See the License for the specific language governing permissions and ++ * limitations under the License. ++ */ ++ ++#include "nixio.h" ++#include ++#include ++#include ++ ++ ++/** ++ * create new socket ++ */ ++static int nixio_socket(lua_State *L) { ++ const char *domain = luaL_optlstring(L, 1, "", NULL); ++ const char *type = luaL_optlstring(L, 2, "", NULL); ++ const char *proto = lua_tolstring(L, 3, NULL); ++ ++ nixio_sock *sock = lua_newuserdata(L, sizeof(nixio_sock)); ++ if (!sock) { ++ return luaL_error(L, "out of memory"); ++ } ++ ++ if (!strcmp(domain, "inet")) { ++ sock->domain = AF_INET; ++ } else if (!strcmp(domain, "inet6")) { ++ sock->domain = AF_INET6; ++ } else if (!strcmp(domain, "unix")) { ++ sock->domain = AF_UNIX; ++ /*} else if (!strcmp(domain, "packet")) { ++ sock->domain = AF_PACKET;*/ ++ } else { ++ return luaL_argerror(L, 1, ++ "supported values: inet, inet6, unix, packet" ++ ); ++ } ++ ++ if (!strcmp(type, "stream")) { ++ sock->type = SOCK_STREAM; ++ } else if (!strcmp(type, "dgram")) { ++ sock->type = SOCK_DGRAM; ++ } else if (!strcmp(type, "raw")) { ++ sock->type = SOCK_RAW; ++ } else { ++ return luaL_argerror(L, 2, "supported values: stream, dgram, raw"); ++ } ++ ++ if (!proto) { ++ sock->protocol = 0; ++ } else if (!strcmp(proto, "icmp")) { ++ sock->protocol = IPPROTO_ICMP; ++ } else if (!strcmp(proto, "icmpv6")) { ++ sock->protocol = IPPROTO_ICMPV6; ++ } else { ++ return luaL_argerror(L, 3, "supported values: [empty], icmp, icmpv6"); ++ } ++ ++ /* create userdata */ ++ luaL_getmetatable(L, NIXIO_META); ++ lua_setmetatable(L, -2); ++ ++ sock->fd = socket(sock->domain, sock->type, sock->protocol); ++ ++ if (sock->fd < 0) { ++ return nixio__perror_s(L); ++ } ++ ++ return 1; ++} ++ ++/** ++ * close a socket ++ */ ++static int nixio_sock_close(lua_State *L) { ++ nixio_sock *sock = nixio__checksock(L); ++ int sockfd = sock->fd; ++ int res; ++ sock->fd = -1; ++ ++ do { ++#ifndef __WINNT__ ++ res = close(sockfd); ++#else ++ res = closesocket(sockfd); ++#endif ++ } while (res == -1 && errno == EINTR); ++ ++ return nixio__pstatus_s(L, !res); ++} ++ ++/** ++ * garbage collector ++ */ ++static int nixio_sock__gc(lua_State *L) { ++ nixio_sock *sock = (nixio_sock*)luaL_checkudata(L, 1, NIXIO_META); ++ int res; ++ if (sock && sock->fd != -1) { ++ do { ++#ifndef __WINNT__ ++ res = close(sock->fd); ++#else ++ res = closesocket(sock->fd); ++#endif ++ } while (res == -1 && errno == EINTR); ++ } ++ return 0; ++} ++ ++/** ++ * string representation ++ */ ++static int nixio_sock__tostring(lua_State *L) { ++ lua_pushfstring(L, "nixio socket %d", nixio__checksockfd(L)); ++ return 1; ++} ++ ++/** ++ * shutdown a socket ++ */ ++static int nixio_sock_shutdown(lua_State *L) { ++ int sockfd = nixio__checksockfd(L); ++ const char *what = luaL_optlstring(L, 2, "rdwr", NULL); ++ int how; ++ ++ if (!strcmp(what, "rdwr") || !strcmp(what, "both")) { ++ how = SHUT_RDWR; ++ } else if (!strcmp(what, "rd") || !strcmp(what, "read")) { ++ how = SHUT_RD; ++ } else if (!strcmp(what, "wr") || !strcmp(what, "write")) { ++ how = SHUT_WR; ++ } else { ++ return luaL_argerror(L, 2, "supported values: both, read, write"); ++ } ++ ++ return nixio__pstatus_s(L, !shutdown(sockfd, how)); ++} ++ ++/* module table */ ++static const luaL_reg R[] = { ++ {"socket", nixio_socket}, ++ {NULL, NULL} ++}; ++ ++/* object table */ ++static const luaL_reg M[] = { ++ {"close", nixio_sock_close}, ++ {"shutdown", nixio_sock_shutdown}, ++ {"__gc", nixio_sock__gc}, ++ {"__tostring", nixio_sock__tostring}, ++ {NULL, NULL} ++}; ++ ++void nixio_open_socket(lua_State *L) { ++ luaL_register(L, NULL, R); ++ ++ lua_pushvalue(L, -2); ++ luaL_register(L, NULL, M); ++ lua_pop(L, 1); ++} +diff --git a/feeds/luci/libs/luci-lib-nixio/src/sockopt.c b/feeds/luci/libs/luci-lib-nixio/src/sockopt.c +new file mode 100644 +index 0000000..cede884 +--- /dev/null ++++ b/feeds/luci/libs/luci-lib-nixio/src/sockopt.c +@@ -0,0 +1,390 @@ ++/* ++ * nixio - Linux I/O library for lua ++ * ++ * Copyright (C) 2009 Steven Barth ++ * ++ * Licensed under the Apache License, Version 2.0 (the "License"); ++ * you may not use this file except in compliance with the License. ++ * You may obtain a copy of the License at ++ * ++ * http://www.apache.org/licenses/LICENSE-2.0 ++ * ++ * Unless required by applicable law or agreed to in writing, software ++ * distributed under the License is distributed on an "AS IS" BASIS, ++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. ++ * See the License for the specific language governing permissions and ++ * limitations under the License. ++ */ ++ ++#include "nixio.h" ++ ++#ifndef __WINNT__ ++#include ++#endif ++ ++#include ++#include ++#include ++#include ++#include ++ ++#ifndef IPV6_ADD_MEMBERSHIP ++#define IPV6_ADD_MEMBERSHIP IPV6_JOIN_GROUP ++#endif ++ ++#ifndef IPV6_DROP_MEMBERSHIP ++#define IPV6_DROP_MEMBERSHIP IPV6_LEAVE_GROUP ++#endif ++ ++static int nixio_sock_fileno(lua_State *L) { ++ lua_pushinteger(L, nixio__checkfd(L, 1)); ++ return 1; ++} ++ ++/** ++ * setblocking() ++ */ ++static int nixio_sock_setblocking(lua_State *L) { ++ int fd = nixio__checkfd(L, 1); ++ luaL_checkany(L, 2); ++ int set = lua_toboolean(L, 2); ++ ++#ifndef __WINNT__ ++ ++ int flags = fcntl(fd, F_GETFL); ++ ++ if (flags == -1) { ++ return nixio__perror(L); ++ } ++ ++ if (!set) { ++ flags |= O_NONBLOCK; ++ } else { ++ flags &= ~O_NONBLOCK; ++ } ++ ++ return nixio__pstatus(L, !fcntl(fd, F_SETFL, flags)); ++ ++#else /* __WINNT__ */ ++ ++ lua_getmetatable(L, 1); ++ luaL_getmetatable(L, NIXIO_META); ++ if (lua_equal(L, -1, -2)) { /* Socket */ ++ unsigned long val = !set; ++ return nixio__pstatus_s(L, !ioctlsocket(fd, FIONBIO, &val)); ++ } else { /* File */ ++ WSASetLastError(WSAENOTSOCK); ++ return nixio__perror_s(L); ++ } ++ ++#endif /* __WINNT__ */ ++} ++ ++static int nixio__gso_int(lua_State *L, int fd, int level, int opt, int set) { ++ int value; ++ socklen_t optlen = sizeof(value); ++ if (!set) { ++ if (!getsockopt(fd, level, opt, (char *)&value, &optlen)) { ++ lua_pushinteger(L, value); ++ return 1; ++ } ++ } else { ++ value = luaL_checkinteger(L, set); ++ if (!setsockopt(fd, level, opt, (char *)&value, optlen)) { ++ lua_pushboolean(L, 1); ++ return 1; ++ } ++ } ++ return nixio__perror_s(L); ++} ++ ++static int nixio__gso_ling(lua_State *L, int fd, int level, int opt, int set) { ++ struct linger value; ++ socklen_t optlen = sizeof(value); ++ if (!set) { ++ if (!getsockopt(fd, level, opt, (char *)&value, &optlen)) { ++ lua_pushinteger(L, value.l_onoff ? value.l_linger : 0); ++ return 1; ++ } ++ } else { ++ value.l_linger = luaL_checkinteger(L, set); ++ value.l_onoff = value.l_linger ? 1 : 0; ++ if (!setsockopt(fd, level, opt, (char *)&value, optlen)) { ++ lua_pushboolean(L, 1); ++ return 1; ++ } ++ } ++ return nixio__perror_s(L); ++} ++ ++static int nixio__gso_timev(lua_State *L, int fd, int level, int opt, int set) { ++ struct timeval value; ++ socklen_t optlen = sizeof(value); ++ if (!set) { ++ if (!getsockopt(fd, level, opt, (char *)&value, &optlen)) { ++ lua_pushinteger(L, value.tv_sec); ++ lua_pushinteger(L, value.tv_usec); ++ return 2; ++ } ++ } else { ++ value.tv_sec = luaL_checkinteger(L, set); ++ value.tv_usec = luaL_optinteger(L, set + 1, 0); ++ if (!setsockopt(fd, level, opt, (char *)&value, optlen)) { ++ lua_pushboolean(L, 1); ++ return 1; ++ } ++ } ++ return nixio__perror_s(L); ++} ++ ++#ifdef SO_BINDTODEVICE ++ ++static int nixio__gso_b(lua_State *L, int fd, int level, int opt, int set) { ++ if (!set) { ++ socklen_t optlen = IFNAMSIZ; ++ char ifname[IFNAMSIZ]; ++ if (!getsockopt(fd, level, opt, (char *)ifname, &optlen)) { ++ lua_pushlstring(L, ifname, optlen); ++ return 1; ++ } ++ } else { ++ size_t valuelen; ++ const char *value = luaL_checklstring(L, set, &valuelen); ++ luaL_argcheck(L, valuelen <= IFNAMSIZ, set, "invalid interface name"); ++ if (!setsockopt(fd, level, opt, (char *)value, valuelen)) { ++ lua_pushboolean(L, 1); ++ return 1; ++ } ++ } ++ return nixio__perror_s(L); ++} ++ ++#endif /* SO_BINDTODEVICE */ ++ ++static int nixio__gso_mreq4(lua_State *L, int fd, int level, int opt, int set) { ++ struct ip_mreq value; ++ socklen_t optlen = sizeof(value); ++ if (!set) { ++ char buf[INET_ADDRSTRLEN]; ++ if (!getsockopt(fd, level, opt, (char *)&value, &optlen)) { ++ if (!inet_ntop(AF_INET, &value.imr_multiaddr, buf, sizeof(buf))) { ++ return nixio__perror_s(L); ++ } ++ lua_pushstring(L, buf); ++ if (!inet_ntop(AF_INET, &value.imr_interface, buf, sizeof(buf))) { ++ return nixio__perror_s(L); ++ } ++ lua_pushstring(L, buf); ++ return 2; ++ } ++ } else { ++ const char *maddr = luaL_checkstring(L, set); ++ const char *iface = luaL_optstring(L, set + 1, "0.0.0.0"); ++ if (inet_pton(AF_INET, maddr, &value.imr_multiaddr) < 1) { ++ return nixio__perror_s(L); ++ } ++ if (inet_pton(AF_INET, iface, &value.imr_interface) < 1) { ++ return nixio__perror_s(L); ++ } ++ if (!setsockopt(fd, level, opt, (char *)&value, optlen)) { ++ lua_pushboolean(L, 1); ++ return 1; ++ } ++ } ++ return nixio__perror_s(L); ++} ++ ++static int nixio__gso_mreq6(lua_State *L, int fd, int level, int opt, int set) { ++ struct ipv6_mreq val; ++ socklen_t optlen = sizeof(val); ++ if (!set) { ++ char buf[INET_ADDRSTRLEN]; ++ if (!getsockopt(fd, level, opt, (char *)&val, &optlen)) { ++ if (!inet_ntop(AF_INET6, &val.ipv6mr_multiaddr, buf, sizeof(buf))) { ++ return nixio__perror_s(L); ++ } ++ lua_pushstring(L, buf); ++ lua_pushinteger(L, val.ipv6mr_interface); ++ return 2; ++ } ++ } else { ++ const char *maddr = luaL_checkstring(L, set); ++ if (inet_pton(AF_INET6, maddr, &val.ipv6mr_multiaddr) < 1) { ++ return nixio__perror_s(L); ++ } ++ val.ipv6mr_interface = luaL_optlong(L, set + 1, 0); ++ if (!setsockopt(fd, level, opt, (char *)&val, optlen)) { ++ lua_pushboolean(L, 1); ++ return 1; ++ } ++ } ++ return nixio__perror_s(L); ++} ++ ++/** ++ * get/setsockopt() helper ++ */ ++static int nixio__getsetsockopt(lua_State *L, int set) { ++ nixio_sock *sock = nixio__checksock(L); ++ const char *level = luaL_optlstring(L, 2, "", NULL); ++ const char *option = luaL_optlstring(L, 3, "", NULL); ++ set = (set) ? 4 : 0; ++ ++ if (!strcmp(level, "socket")) { ++ if (!strcmp(option, "keepalive")) { ++ return nixio__gso_int(L, sock->fd, SOL_SOCKET, SO_KEEPALIVE, set); ++ } else if (!strcmp(option, "reuseaddr")) { ++ return nixio__gso_int(L, sock->fd, SOL_SOCKET, SO_REUSEADDR, set); ++ } else if (!strcmp(option, "rcvbuf")) { ++ return nixio__gso_int(L, sock->fd, SOL_SOCKET, SO_RCVBUF, set); ++ } else if (!strcmp(option, "sndbuf")) { ++ return nixio__gso_int(L, sock->fd, SOL_SOCKET, SO_SNDBUF, set); ++ } else if (!strcmp(option, "priority")) { ++#ifdef SO_PRIORITY ++ return nixio__gso_int(L, sock->fd, SOL_SOCKET, SO_PRIORITY, set); ++#else ++ return nixio__pstatus(L, !(errno = ENOPROTOOPT)); ++#endif ++ } else if (!strcmp(option, "broadcast")) { ++ return nixio__gso_int(L, sock->fd, SOL_SOCKET, SO_BROADCAST, set); ++ } else if (!strcmp(option, "dontroute")) { ++ return nixio__gso_int(L, sock->fd, SOL_SOCKET, SO_DONTROUTE, set); ++ } else if (!strcmp(option, "error")) { ++ return nixio__gso_int(L, sock->fd, SOL_SOCKET, SO_ERROR, set); ++ } else if (!strcmp(option, "oobinline")) { ++ return nixio__gso_int(L, sock->fd, SOL_SOCKET, SO_OOBINLINE, set); ++ } else if (!strcmp(option, "linger")) { ++ return nixio__gso_ling(L, sock->fd, SOL_SOCKET, SO_LINGER, set); ++ } else if (!strcmp(option, "sndtimeo")) { ++ return nixio__gso_timev(L, sock->fd, SOL_SOCKET, SO_SNDTIMEO, set); ++ } else if (!strcmp(option, "rcvtimeo")) { ++ return nixio__gso_timev(L, sock->fd, SOL_SOCKET, SO_RCVTIMEO, set); ++ } else if (!strcmp(option, "bindtodevice")) { ++#ifdef SO_BINDTODEVICE ++ return nixio__gso_b(L, sock->fd, SOL_SOCKET, SO_BINDTODEVICE, set); ++#else ++ return nixio__pstatus(L, !(errno = ENOPROTOOPT)); ++#endif ++ } else { ++ return luaL_argerror(L, 3, "supported values: keepalive, reuseaddr," ++ " sndbuf, rcvbuf, priority, broadcast, linger, sndtimeo, rcvtimeo," ++ " dontroute, bindtodevice, error, oobinline" ++ ); ++ } ++ } else if (!strcmp(level, "tcp")) { ++ if (!strcmp(option, "cork")) { ++#ifdef TCP_CORK ++ return nixio__gso_int(L, sock->fd, IPPROTO_TCP, TCP_CORK, set); ++#else ++ return nixio__pstatus(L, !(errno = ENOPROTOOPT)); ++#endif ++ } else if (!strcmp(option, "nodelay")) { ++ return nixio__gso_int(L, sock->fd, IPPROTO_TCP, TCP_NODELAY, set); ++ } else { ++ return luaL_argerror(L, 3, "supported values: cork, nodelay"); ++ } ++ } else if (!strcmp(level, "ip")) { ++ if (!strcmp(option, "mtu")) { ++#ifdef IP_MTU ++ return nixio__gso_int(L, sock->fd, IPPROTO_IP, IP_MTU, set); ++#else ++ return nixio__pstatus(L, !(errno = ENOPROTOOPT)); ++#endif ++ } else if (!strcmp(option, "hdrincl")) { ++ return nixio__gso_int(L, sock->fd, IPPROTO_IP, IP_HDRINCL, ++ set); ++ } else if (!strcmp(option, "multicast_loop")) { ++ return nixio__gso_int(L, sock->fd, IPPROTO_IP, IP_MULTICAST_LOOP, ++ set); ++ } else if (!strcmp(option, "multicast_ttl")) { ++ return nixio__gso_int(L, sock->fd, IPPROTO_IP, IP_MULTICAST_TTL, ++ set); ++ } else if (!strcmp(option, "multicast_if")) { ++ return nixio__gso_mreq4(L, sock->fd, IPPROTO_IP, IP_MULTICAST_IF, ++ set); ++ } else if (!strcmp(option, "add_membership")) { ++ return nixio__gso_mreq4(L, sock->fd, IPPROTO_IP, IP_ADD_MEMBERSHIP, ++ set); ++ } else if (!strcmp(option, "drop_membership")) { ++ return nixio__gso_mreq4(L, sock->fd, IPPROTO_IP, IP_DROP_MEMBERSHIP, ++ set); ++ } else { ++ return luaL_argerror(L, 3, ++ "supported values: hdrincl, mtu, multicast_loop, " ++ "multicast_ttl, multicast_if, add_membership, drop_membership"); ++ } ++ } else if (!strcmp(level, "ipv6")) { ++ if (!strcmp(option, "mtu")) { ++#ifdef IPV6_MTU ++ return nixio__gso_int(L, sock->fd, IPPROTO_IPV6, IPV6_MTU, set); ++#else ++ return nixio__pstatus(L, !(errno = ENOPROTOOPT)); ++#endif ++ } else if (!strcmp(option, "v6only")) { ++#ifdef IPV6_V6ONLY ++ return nixio__gso_int(L, sock->fd, IPPROTO_IPV6, IPV6_V6ONLY, set); ++#else ++ return nixio__pstatus(L, !(errno = ENOPROTOOPT)); ++#endif ++ } else if (!strcmp(option, "multicast_loop")) { ++ return nixio__gso_int(L, sock->fd, IPPROTO_IPV6, ++ IPV6_MULTICAST_LOOP, set); ++ } else if (!strcmp(option, "multicast_hops")) { ++ return nixio__gso_int(L, sock->fd, IPPROTO_IPV6, ++ IPV6_MULTICAST_HOPS, set); ++ } else if (!strcmp(option, "multicast_if")) { ++ return nixio__gso_mreq6(L, sock->fd, IPPROTO_IPV6, ++ IPV6_MULTICAST_IF, set); ++ } else if (!strcmp(option, "add_membership")) { ++ return nixio__gso_mreq6(L, sock->fd, IPPROTO_IPV6, ++ IPV6_ADD_MEMBERSHIP, set); ++ } else if (!strcmp(option, "drop_membership")) { ++ return nixio__gso_mreq6(L, sock->fd, IPPROTO_IPV6, ++ IPV6_DROP_MEMBERSHIP, set); ++ } else { ++ return luaL_argerror(L, 3, ++ "supported values: v6only, mtu, multicast_loop, multicast_hops," ++ " multicast_if, add_membership, drop_membership"); ++ } ++ } else { ++ return luaL_argerror(L, 2, "supported values: socket, tcp, ip, ipv6"); ++ } ++} ++ ++/** ++ * getsockopt() ++ */ ++static int nixio_sock_getsockopt(lua_State *L) { ++ return nixio__getsetsockopt(L, 0); ++} ++ ++/** ++ * setsockopt() ++ */ ++static int nixio_sock_setsockopt(lua_State *L) { ++ return nixio__getsetsockopt(L, 1); ++} ++ ++/* module table */ ++static const luaL_reg M[] = { ++ {"setblocking", nixio_sock_setblocking}, ++ {"getsockopt", nixio_sock_getsockopt}, ++ {"setsockopt", nixio_sock_setsockopt}, ++ {"getopt", nixio_sock_getsockopt}, ++ {"setopt", nixio_sock_setsockopt}, ++ {"fileno", nixio_sock_fileno}, ++ {NULL, NULL} ++}; ++ ++void nixio_open_sockopt(lua_State *L) { ++ lua_pushvalue(L, -2); ++ luaL_register(L, NULL, M); ++ lua_pop(L, 1); ++ ++ luaL_getmetatable(L, NIXIO_FILE_META); ++ lua_pushcfunction(L, nixio_sock_setblocking); ++ lua_setfield(L, -2, "setblocking"); ++ lua_pushcfunction(L, nixio_sock_fileno); ++ lua_setfield(L, -2, "fileno"); ++ lua_pop(L, 1); ++} +diff --git a/feeds/luci/libs/luci-lib-nixio/src/splice.c b/feeds/luci/libs/luci-lib-nixio/src/splice.c +new file mode 100644 +index 0000000..db63ea9 +--- /dev/null ++++ b/feeds/luci/libs/luci-lib-nixio/src/splice.c +@@ -0,0 +1,185 @@ ++/* ++ * nixio - Linux I/O library for lua ++ * ++ * Copyright (C) 2009 Steven Barth ++ * ++ * Licensed under the Apache License, Version 2.0 (the "License"); ++ * you may not use this file except in compliance with the License. ++ * You may obtain a copy of the License at ++ * ++ * http://www.apache.org/licenses/LICENSE-2.0 ++ * ++ * Unless required by applicable law or agreed to in writing, software ++ * distributed under the License is distributed on an "AS IS" BASIS, ++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. ++ * See the License for the specific language governing permissions and ++ * limitations under the License. ++ */ ++ ++#ifdef __linux__ ++#define _GNU_SOURCE ++#endif ++ ++#include "nixio.h" ++#include ++#include ++#include ++#include ++#include ++ ++ ++#ifndef __WINNT__ ++ ++#ifndef BSD ++#include ++#else ++#include ++#include ++#include ++#endif ++ ++#ifdef _GNU_SOURCE ++#ifdef SPLICE_F_MOVE ++ ++/* guess what sucks... */ ++#ifdef __UCLIBC__ ++#include ++#include ++ ++ssize_t splice(int __fdin, __off64_t *__offin, int __fdout, ++ __off64_t *__offout, size_t __len, unsigned int __flags) { ++#ifdef __NR_splice ++ return syscall(__NR_splice, __fdin, __offin, __fdout, __offout, __len, __flags); ++#else ++ (void)__fdin; ++ (void)__offin; ++ (void)__fdout; ++ (void)__offout; ++ (void)__len; ++ (void)__flags; ++ errno = ENOSYS; ++ return -1; ++#endif ++} ++ ++#undef SPLICE_F_MOVE ++#undef SPLICE_F_NONBLOCK ++#undef SPLICE_F_MORE ++ ++#define SPLICE_F_MOVE 1 ++#define SPLICE_F_NONBLOCK 2 ++#define SPLICE_F_MORE 4 ++ ++#endif /* __UCLIBC__ */ ++ ++/** ++ * splice(fd_in, fd_out, length, flags) ++ */ ++static int nixio_splice(lua_State *L) { ++ int fd_in = nixio__checkfd(L, 1); ++ int fd_out = nixio__checkfd(L, 2); ++ size_t len = luaL_checkinteger(L, 3); ++ int flags = luaL_optinteger(L, 4, 0); ++ long spliced; ++ ++ do { ++ spliced = splice(fd_in, NULL, fd_out, NULL, len, flags); ++ } while (spliced == -1 && errno == EINTR); ++ ++ if (spliced < 0) { ++ return nixio__perror(L); ++ } ++ ++ lua_pushinteger(L, spliced); ++ return 1; ++} ++ ++/** ++ * Translate splice flags to integer ++ */ ++static int nixio_splice_flags(lua_State *L) { ++ const int j = lua_gettop(L); ++ int flags = 0; ++ for (int i=1; i<=j; i++) { ++ const char *flag = luaL_checkstring(L, i); ++ if (!strcmp(flag, "move")) { ++ flags |= SPLICE_F_MOVE; ++ } else if (!strcmp(flag, "nonblock")) { ++ flags |= SPLICE_F_NONBLOCK; ++ } else if (!strcmp(flag, "more")) { ++ flags |= SPLICE_F_MORE; ++ } else { ++ return luaL_argerror(L, i, "supported values: " ++ "move, nonblock, more"); ++ } ++ } ++ lua_pushinteger(L, flags); ++ ++ return 1; ++} ++ ++#endif /* SPLICE_F_MOVE */ ++#endif /* _GNU_SOURCE */ ++ ++/** ++ * sendfile(outfd, infd, length) ++ */ ++static int nixio_sendfile(lua_State *L) { ++ int sock = nixio__checksockfd(L); ++ int infd = nixio__checkfd(L, 2); ++ size_t len = luaL_checkinteger(L, 3); ++ off_t spliced; ++ ++#ifndef BSD ++ do { ++ spliced = sendfile(sock, infd, NULL, len); ++ } while (spliced == -1 && errno == EINTR); ++ ++ if (spliced == -1) { ++ return nixio__perror(L); ++ } ++#else ++ int r; ++ const off_t offset = lseek(infd, 0, SEEK_CUR); ++ ++ do { ++#ifdef __DARWIN__ ++ r = sendfile(infd, sock, offset, (off_t *)&len, NULL, 0); ++ spliced = r; ++#else ++ r = sendfile(infd, sock, offset, len, NULL, &spliced, 0); ++#endif ++ } while (r == -1 && errno == EINTR); ++ ++ if (r == -1) { ++ return nixio__perror(L); ++ } ++#endif ++ ++ lua_pushinteger(L, spliced); ++ return 1; ++} ++ ++/* module table */ ++static const luaL_reg R[] = { ++#ifdef _GNU_SOURCE ++#ifdef SPLICE_F_MOVE ++ {"splice", nixio_splice}, ++ {"splice_flags", nixio_splice_flags}, ++#endif ++#endif ++ {"sendfile", nixio_sendfile}, ++ {NULL, NULL} ++}; ++ ++ ++void nixio_open_splice(lua_State *L) { ++ luaL_register(L, NULL, R); ++} ++ ++#else /* __WINNT__ */ ++ ++void nixio_open_splice(lua_State *L) { ++} ++ ++#endif /* !__WINNT__ */ +diff --git a/feeds/luci/libs/luci-lib-nixio/src/syslog.c b/feeds/luci/libs/luci-lib-nixio/src/syslog.c +new file mode 100644 +index 0000000..89f1b1d +--- /dev/null ++++ b/feeds/luci/libs/luci-lib-nixio/src/syslog.c +@@ -0,0 +1,122 @@ ++/* ++ * nixio - Linux I/O library for lua ++ * ++ * Copyright (C) 2009 Steven Barth ++ * ++ * Licensed under the Apache License, Version 2.0 (the "License"); ++ * you may not use this file except in compliance with the License. ++ * You may obtain a copy of the License at ++ * ++ * http://www.apache.org/licenses/LICENSE-2.0 ++ * ++ * Unless required by applicable law or agreed to in writing, software ++ * distributed under the License is distributed on an "AS IS" BASIS, ++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. ++ * See the License for the specific language governing permissions and ++ * limitations under the License. ++ */ ++ ++#include "nixio.h" ++#include ++ ++#ifndef __WINNT__ ++#include ++ ++ ++static int nixio_openlog(lua_State *L) { ++ int option = 0, facility = LOG_USER; ++ ++ const char *ident = luaL_optstring(L, 1, "nixio"); ++ const int j = lua_gettop(L); ++ for (int i=2; i<=j; i++) { ++ const char *flag = luaL_checkstring(L, i); ++ if (!strcmp(flag, "cons")) { ++ option |= LOG_CONS; ++ } else if (!strcmp(flag, "nowait")) { ++ option |= LOG_NOWAIT; ++ } else if (!strcmp(flag, "pid")) { ++ option |= LOG_PID; ++ } else if (!strcmp(flag, "perror")) { ++#ifdef LOG_PERROR ++ option |= LOG_PERROR; ++#endif ++ } else if (!strcmp(flag, "ndelay")) { ++ option |= LOG_NDELAY; ++ } else if (!strcmp(flag, "odelay")) { ++ option |= LOG_ODELAY; ++ } else { ++ return luaL_argerror(L, i, ++ "supported values: cons, nowait, pid, perror, ndelay, odelay"); ++ } ++ } ++ ++ openlog(ident, option, facility); ++ return 0; ++} ++ ++static int nixio_closelog(lua_State *L) { ++ closelog(); ++ return 0; ++} ++ ++static int nixio__syslogmask(lua_State *L, int dolog) { ++ int priority; ++ ++ const char *flag = luaL_checkstring(L, 1); ++ if (!strcmp(flag, "emerg")) { ++ priority = LOG_EMERG; ++ } else if (!strcmp(flag, "alert")) { ++ priority = LOG_ALERT; ++ } else if (!strcmp(flag, "crit")) { ++ priority = LOG_CRIT; ++ } else if (!strcmp(flag, "err")) { ++ priority = LOG_ERR; ++ } else if (!strcmp(flag, "warning")) { ++ priority = LOG_WARNING; ++ } else if (!strcmp(flag, "notice")) { ++ priority = LOG_NOTICE; ++ } else if (!strcmp(flag, "info")) { ++ priority = LOG_INFO; ++ } else if (!strcmp(flag, "debug")) { ++ priority = LOG_DEBUG; ++ } else { ++ return luaL_argerror(L, 1, "supported values: emerg, alert, crit, err, " ++ "warning, notice, info, debug"); ++ } ++ ++ if (dolog) { ++ const char *msg = luaL_checkstring(L, 2); ++ syslog(priority, "%s", msg); ++ } else { ++ setlogmask(LOG_UPTO(priority)); ++ } ++ return 0; ++} ++ ++static int nixio_setlogmask(lua_State *L) { ++ return nixio__syslogmask(L, 0); ++} ++ ++static int nixio_syslog(lua_State *L) { ++ return nixio__syslogmask(L, 1); ++} ++ ++/* module table */ ++static const luaL_reg R[] = { ++ {"openlog", nixio_openlog}, ++ {"syslog", nixio_syslog}, ++ {"setlogmask", nixio_setlogmask}, ++ {"closelog", nixio_closelog}, ++ {NULL, NULL} ++}; ++ ++void nixio_open_syslog(lua_State *L) { ++ luaL_register(L, NULL, R); ++} ++ ++#else /* __WINNT__ */ ++ ++void nixio_open_syslog(lua_State *L) { ++} ++ ++#endif /* __WINNT__ */ +diff --git a/feeds/luci/libs/luci-lib-nixio/src/tls-context.c b/feeds/luci/libs/luci-lib-nixio/src/tls-context.c +new file mode 100644 +index 0000000..e9a833f +--- /dev/null ++++ b/feeds/luci/libs/luci-lib-nixio/src/tls-context.c +@@ -0,0 +1,248 @@ ++/* ++ * nixio - Linux I/O library for lua ++ * ++ * Copyright (C) 2009 Steven Barth ++ * ++ * Licensed under the Apache License, Version 2.0 (the "License"); ++ * you may not use this file except in compliance with the License. ++ * You may obtain a copy of the License at ++ * ++ * http://www.apache.org/licenses/LICENSE-2.0 ++ * ++ * Unless required by applicable law or agreed to in writing, software ++ * distributed under the License is distributed on an "AS IS" BASIS, ++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. ++ * See the License for the specific language governing permissions and ++ * limitations under the License. ++ */ ++ ++#include "nixio-tls.h" ++#include ++ ++static SSL_CTX* nixio__checktlsctx(lua_State *L) { ++ SSL_CTX **ctx = (SSL_CTX **)luaL_checkudata(L, 1, NIXIO_TLS_CTX_META); ++ luaL_argcheck(L, *ctx, 1, "invalid context"); ++ return *ctx; ++} ++ ++static int nixio__tls_perror(lua_State *L, int code) { ++ lua_pushnil(L); ++ lua_pushinteger(L, code); ++ return 2; ++} ++ ++static int nixio__tls_pstatus(lua_State *L, int code) { ++ if (code == 1) { ++ lua_pushboolean(L, 1); ++ return 1; ++ } else { ++ return nixio__tls_perror(L, code); ++ } ++} ++ ++static int nixio_tls_ctx(lua_State * L) { ++ const char *method = luaL_optlstring(L, 1, "client", NULL); ++ ++ luaL_getmetatable(L, NIXIO_TLS_CTX_META); ++ SSL_CTX **ctx = lua_newuserdata(L, sizeof(SSL_CTX *)); ++ if (!ctx) { ++ return luaL_error(L, "out of memory"); ++ } ++ ++ /* create userdata */ ++ lua_pushvalue(L, -2); ++ lua_setmetatable(L, -2); ++ ++ if (!strcmp(method, "client")) { ++ *ctx = SSL_CTX_new(TLSv1_client_method()); ++ } else if (!strcmp(method, "server")) { ++ *ctx = SSL_CTX_new(TLSv1_server_method()); ++ } else { ++ return luaL_argerror(L, 1, "supported values: client, server"); ++ } ++ ++ if (!(*ctx)) { ++ return luaL_error(L, "unable to create TLS context"); ++ } ++ ++#ifdef WITH_CYASSL ++ SSL_CTX_set_verify(*ctx, SSL_VERIFY_NONE, NULL); ++#endif ++ ++ return 1; ++} ++ ++static int nixio_tls_ctx_create(lua_State *L) { ++ SSL_CTX *ctx = nixio__checktlsctx(L); ++ int fd = nixio__checkfd(L, 2); ++ ++ lua_createtable(L, 0, 3); ++ nixio_tls_sock *sock = lua_newuserdata(L, sizeof(nixio_tls_sock)); ++ if (!sock) { ++ return luaL_error(L, "out of memory"); ++ } ++ memset(sock, 0, sizeof(nixio_tls_sock)); ++ ++ /* create userdata */ ++ luaL_getmetatable(L, NIXIO_TLS_SOCK_META); ++ lua_pushvalue(L, -1); ++ lua_setmetatable(L, -3); ++ ++ sock->socket = SSL_new(ctx); ++ if (!sock->socket) { ++ return nixio__tls_perror(L, 0); ++ } ++ ++ if (SSL_set_fd(sock->socket, fd) != 1) { ++ return nixio__tls_perror(L, 0); ++ } ++ ++ /* save context and socket to prevent GC from collecting them */ ++ lua_setmetatable(L, -3); ++ lua_setfield(L, -2, "connection"); ++ ++ lua_pushvalue(L, 1); ++ lua_setfield(L, -2, "context"); ++ ++ lua_pushvalue(L, 2); ++ lua_setfield(L, -2, "socket"); ++ ++ return 1; ++} ++ ++static int nixio_tls_ctx_set_cert(lua_State *L) { ++ SSL_CTX *ctx = nixio__checktlsctx(L); ++ const char *cert = luaL_checkstring(L, 2); ++ const char *type = luaL_optstring(L, 3, "chain"); ++ int ktype; ++ ++ if (!strcmp(type, "chain")) { ++ return nixio__tls_pstatus(L, ++ SSL_CTX_use_certificate_chain_file(ctx, cert)); ++ } else if (!strcmp(type, "pem")) { ++ ktype = SSL_FILETYPE_PEM; ++ } else if (!strcmp(type, "asn1")) { ++ ktype = SSL_FILETYPE_ASN1; ++ } else { ++ return luaL_argerror(L, 3, "supported values: chain, pem, asn1"); ++ } ++ ++ return nixio__tls_pstatus(L, ++ SSL_CTX_use_certificate_file(ctx, cert, ktype)); ++} ++ ++static int nixio_tls_ctx_set_verify_locations(lua_State *L) { ++ SSL_CTX *ctx = nixio__checktlsctx(L); ++ const char *CAfile = luaL_optstring(L, 2, NULL); ++ const char *CApath = luaL_optstring(L, 3, NULL); ++ return nixio__tls_pstatus(L, SSL_CTX_load_verify_locations(ctx, ++ CAfile, CApath)); ++} ++ ++static int nixio_tls_ctx_set_key(lua_State *L) { ++ SSL_CTX *ctx = nixio__checktlsctx(L); ++ const char *cert = luaL_checkstring(L, 2); ++ const char *type = luaL_optstring(L, 3, "pem"); ++ int ktype; ++ ++ if (!strcmp(type, "pem")) { ++ ktype = SSL_FILETYPE_PEM; ++ } else if (!strcmp(type, "asn1")) { ++ ktype = SSL_FILETYPE_ASN1; ++ } else { ++ return luaL_argerror(L, 3, "supported values: pem, asn1"); ++ } ++ ++ return nixio__tls_pstatus(L, SSL_CTX_use_PrivateKey_file(ctx, cert, ktype)); ++} ++ ++static int nixio_tls_ctx_set_ciphers(lua_State *L) { ++ SSL_CTX *ctx = nixio__checktlsctx(L); ++ size_t len; ++ const char *ciphers = luaL_checklstring(L, 2, &len); ++ luaL_argcheck(L, len < 255, 2, "cipher string too long"); ++ return nixio__tls_pstatus(L, SSL_CTX_set_cipher_list(ctx, ciphers)); ++} ++ ++static int nixio_tls_ctx_set_verify(lua_State *L) { ++ SSL_CTX *ctx = nixio__checktlsctx(L); ++ const int j = lua_gettop(L); ++ int flags = 0; ++ for (int i=2; i<=j; i++) { ++ const char *flag = luaL_checkstring(L, i); ++ if (!strcmp(flag, "none")) { ++ flags |= SSL_VERIFY_NONE; ++ } else if (!strcmp(flag, "peer")) { ++ flags |= SSL_VERIFY_PEER; ++ } else if (!strcmp(flag, "verify_fail_if_no_peer_cert")) { ++ flags |= SSL_VERIFY_FAIL_IF_NO_PEER_CERT; ++ } else if (!strcmp(flag, "client_once")) { ++ flags |= SSL_VERIFY_CLIENT_ONCE; ++ } else { ++ return luaL_argerror(L, i, "supported values: none, peer, " ++ "verify_fail_if_no_peer_cert, client_once"); ++ } ++ } ++ SSL_CTX_set_verify(ctx, flags, NULL); ++ return 0; ++} ++ ++static int nixio_tls_ctx__gc(lua_State *L) { ++ SSL_CTX **ctx = (SSL_CTX **)luaL_checkudata(L, 1, NIXIO_TLS_CTX_META); ++ if (*ctx) { ++ SSL_CTX_free(*ctx); ++ *ctx = NULL; ++ } ++ return 0; ++} ++ ++static int nixio_tls_ctx__tostring(lua_State *L) { ++ SSL_CTX *ctx = nixio__checktlsctx(L); ++ lua_pushfstring(L, "nixio TLS context: %p", ctx); ++ return 1; ++} ++ ++/* module table */ ++static const luaL_reg R[] = { ++ {"tls", nixio_tls_ctx}, ++ {NULL, NULL} ++}; ++ ++/* ctx function table */ ++static const luaL_reg CTX_M[] = { ++ {"set_cert", nixio_tls_ctx_set_cert}, ++ {"set_verify_locations", nixio_tls_ctx_set_verify_locations}, ++ {"set_key", nixio_tls_ctx_set_key}, ++ {"set_ciphers", nixio_tls_ctx_set_ciphers}, ++ {"set_verify", nixio_tls_ctx_set_verify}, ++ {"create", nixio_tls_ctx_create}, ++ {"__gc", nixio_tls_ctx__gc}, ++ {"__tostring", nixio_tls_ctx__tostring}, ++ {NULL, NULL} ++}; ++ ++ ++void nixio_open_tls_context(lua_State *L) { ++ /* initialize tls library */ ++ SSL_load_error_strings(); ++ SSL_library_init(); ++ ++ /* register module functions */ ++ luaL_register(L, NULL, R); ++ ++#if defined (WITH_AXTLS) ++ lua_pushliteral(L, "axtls"); ++#elif defined (WITH_CYASSL) ++ lua_pushliteral(L, "cyassl"); ++#else ++ lua_pushliteral(L, "openssl"); ++#endif ++ lua_setfield(L, -2, "tls_provider"); ++ ++ /* create context metatable */ ++ luaL_newmetatable(L, NIXIO_TLS_CTX_META); ++ lua_pushvalue(L, -1); ++ lua_setfield(L, -2, "__index"); ++ luaL_register(L, NULL, CTX_M); ++ lua_setfield(L, -2, "meta_tls_context"); ++} +diff --git a/feeds/luci/libs/luci-lib-nixio/src/tls-crypto.c b/feeds/luci/libs/luci-lib-nixio/src/tls-crypto.c +new file mode 100644 +index 0000000..714ec4e +--- /dev/null ++++ b/feeds/luci/libs/luci-lib-nixio/src/tls-crypto.c +@@ -0,0 +1,185 @@ ++/* ++ * nixio - Linux I/O library for lua ++ * ++ * Copyright (C) 2009 Steven Barth ++ * ++ * Licensed under the Apache License, Version 2.0 (the "License"); ++ * you may not use this file except in compliance with the License. ++ * You may obtain a copy of the License at ++ * ++ * http://www.apache.org/licenses/LICENSE-2.0 ++ * ++ * Unless required by applicable law or agreed to in writing, software ++ * distributed under the License is distributed on an "AS IS" BASIS, ++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. ++ * See the License for the specific language governing permissions and ++ * limitations under the License. ++ */ ++ ++#include "nixio-tls.h" ++#include ++#include ++#include ++#include ++#include ++ ++static int nixio_crypto_hash__init(lua_State *L, int hmac) { ++ const char *type = luaL_checkstring(L, 1); ++ nixio_hash *hash = lua_newuserdata(L, sizeof(nixio_hash)); ++ ++ if (!strcmp(type, "md5")) { ++ hash->type = NIXIO_HASH_MD5; ++ hash->digest_size = MD5_DIGEST_LENGTH; ++ hash->block_size = 64; ++ hash->ctx = malloc(sizeof(MD5_CTX)); ++ if (!hash->ctx) { ++ return luaL_error(L, NIXIO_OOM); ++ } ++ MD5_Init((MD5_CTX*)hash->ctx); ++ hash->init = (nixio_hash_initcb)MD5_Init; ++ hash->update = (nixio_hash_updatecb)MD5_Update; ++ hash->final = (nixio_hash_finalcb)MD5_Final; ++ } else if (!strcmp(type, "sha1")) { ++ hash->type = NIXIO_HASH_SHA1; ++ hash->digest_size = SHA_DIGEST_LENGTH; ++ hash->block_size = 64; ++ hash->ctx = malloc(sizeof(SHA_CTX)); ++ if (!hash->ctx) { ++ return luaL_error(L, NIXIO_OOM); ++ } ++ SHA1_Init((SHA_CTX*)hash->ctx); ++ hash->init = (nixio_hash_initcb)SHA1_Init; ++ hash->update = (nixio_hash_updatecb)SHA1_Update; ++ hash->final = (nixio_hash_finalcb)SHA1_Final; ++ } else { ++ luaL_argerror(L, 1, "supported values: md5, sha1"); ++ } ++ ++ luaL_getmetatable(L, NIXIO_CRYPTO_HASH_META); ++ lua_setmetatable(L, -2); ++ ++ if (hmac) { ++ const char *key = luaL_checklstring(L, 2, &hash->key_size); ++ if (hash->key_size > hash->block_size) { ++ hash->update(hash->ctx, key, hash->key_size); ++ hash->final(hash->digest, hash->ctx); ++ hash->init(hash->ctx); ++ hash->key_size = hash->digest_size; ++ memcpy(hash->key, hash->digest, hash->key_size); ++ } else { ++ memcpy(hash->key, key, hash->key_size); ++ } ++ ++ unsigned char pad[NIXIO_CRYPTO_BLOCK_SIZE]; ++ for (uint i = 0; i < hash->block_size; i++) { ++ pad[i] = (i < hash->key_size) ? (0x36 ^ hash->key[i]) : 0x36; ++ } ++ hash->update(hash->ctx, pad, hash->block_size); ++ hash->type |= NIXIO_HMAC_BIT; ++ } ++ ++ return 1; ++} ++ ++static int nixio_crypto_hash(lua_State *L) { ++ return nixio_crypto_hash__init(L, 0); ++} ++ ++static int nixio_crypto_hmac(lua_State *L) { ++ return nixio_crypto_hash__init(L, 1); ++} ++ ++static int nixio_crypto_hash_update(lua_State *L) { ++ nixio_hash *hash = luaL_checkudata(L, 1, NIXIO_CRYPTO_HASH_META); ++ if (hash->type) { ++ size_t len; ++ const char *chunk = luaL_checklstring(L, 2, &len); ++ hash->update(hash->ctx, chunk, len); ++ lua_pushvalue(L, 1); ++ return 1; ++ } else { ++ return luaL_error(L, "Tried to update finalized hash object."); ++ } ++} ++ ++static int nixio_crypto_hash_final(lua_State *L) { ++ nixio_hash *hash = luaL_checkudata(L, 1, NIXIO_CRYPTO_HASH_META); ++ if (hash->type & NIXIO_HMAC_BIT) { ++ hash->final(hash->digest, hash->ctx); ++ hash->init(hash->ctx); ++ ++ unsigned char pad[NIXIO_CRYPTO_BLOCK_SIZE]; ++ for (uint i = 0; i < hash->block_size; i++) { ++ pad[i] = (i < hash->key_size) ? (0x5c ^ hash->key[i]) : 0x5c; ++ } ++ ++ hash->update(hash->ctx, pad, hash->block_size); ++ hash->update(hash->ctx, hash->digest, hash->digest_size); ++ } ++ ++ if (hash->type) { ++ hash->type = NIXIO_HASH_NONE; ++ hash->final(hash->digest, hash->ctx); ++ free(hash->ctx); ++ } ++ ++ char hashdigest[NIXIO_DIGEST_SIZE*2]; ++ for (uint i=0; i < hash->digest_size; i++) { ++ hashdigest[2*i] = nixio__bin2hex[(hash->digest[i] & 0xf0) >> 4]; ++ hashdigest[2*i+1] = nixio__bin2hex[(hash->digest[i] & 0x0f)]; ++ } ++ ++ lua_pushlstring(L, hashdigest, hash->digest_size * 2); ++ memcpy(hashdigest, hash->digest, hash->digest_size); ++ lua_pushlstring(L, hashdigest, hash->digest_size); ++ ++ return 2; ++} ++ ++static int nixio_crypto_hash__gc(lua_State *L) { ++ nixio_hash *hash = luaL_checkudata(L, 1, NIXIO_CRYPTO_HASH_META); ++ if (hash->type) { ++ hash->final(hash->digest, hash->ctx); ++ free(hash->ctx); ++ hash->type = NIXIO_HASH_NONE; ++ } ++ return 0; ++} ++ ++static int nixio_crypto_hash__tostring(lua_State *L) { ++ nixio_hash *hash = luaL_checkudata(L, 1, NIXIO_CRYPTO_HASH_META); ++ lua_pushfstring(L, "nixio hash object: %p", hash); ++ return 1; ++} ++ ++ ++/* module table */ ++static const luaL_reg R[] = { ++ {"hash", nixio_crypto_hash}, ++ {"hmac", nixio_crypto_hmac}, ++ {NULL, NULL} ++}; ++ ++/* hash table */ ++static const luaL_reg M[] = { ++ {"update", nixio_crypto_hash_update}, ++ {"final", nixio_crypto_hash_final}, ++ {"__gc", nixio_crypto_hash__gc}, ++ {"__tostring", nixio_crypto_hash__tostring}, ++ {NULL, NULL} ++}; ++ ++ ++ ++void nixio_open_tls_crypto(lua_State *L) { ++ luaL_newmetatable(L, NIXIO_CRYPTO_HASH_META); ++ luaL_register(L, NULL, M); ++ lua_pushvalue(L, -1); ++ lua_setfield(L, -2, "__index"); ++ lua_pop(L, 1); ++ ++ lua_newtable(L); ++ luaL_register(L, NULL, R); ++ ++ lua_setfield(L, -2, "crypto"); ++} +diff --git a/feeds/luci/libs/luci-lib-nixio/src/tls-socket.c b/feeds/luci/libs/luci-lib-nixio/src/tls-socket.c +new file mode 100644 +index 0000000..fe4cb60 +--- /dev/null ++++ b/feeds/luci/libs/luci-lib-nixio/src/tls-socket.c +@@ -0,0 +1,263 @@ ++ /* ++ * nixio - Linux I/O library for lua ++ * ++ * Copyright (C) 2009 Steven Barth ++ * ++ * Licensed under the Apache License, Version 2.0 (the "License"); ++ * you may not use this file except in compliance with the License. ++ * You may obtain a copy of the License at ++ * ++ * http://www.apache.org/licenses/LICENSE-2.0 ++ * ++ * Unless required by applicable law or agreed to in writing, software ++ * distributed under the License is distributed on an "AS IS" BASIS, ++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. ++ * See the License for the specific language governing permissions and ++ * limitations under the License. ++ */ ++ ++#include "nixio-tls.h" ++#include ++#include ++ ++static int nixio__tls_sock_perror(lua_State *L, SSL *sock, int code) { ++ lua_pushnil(L); ++ lua_pushinteger(L, SSL_get_error(sock, code)); ++ return 2; ++} ++ ++static int nixio__tls_sock_pstatus(lua_State *L, SSL *sock, int code) { ++ if (code > 0) { ++ lua_pushboolean(L, 1); ++ return 1; ++ } else { ++ return nixio__tls_sock_perror(L, sock, code); ++ } ++} ++ ++static SSL* nixio__checktlssock(lua_State *L) { ++ if (lua_istable(L, 1)) { ++ lua_getfield(L, 1, "connection"); ++ lua_replace(L, 1); ++ } ++ nixio_tls_sock *sock = luaL_checkudata(L, 1, NIXIO_TLS_SOCK_META); ++ luaL_argcheck(L, sock->socket, 1, "invalid context"); ++ return sock->socket; ++} ++ ++#ifndef WITH_AXTLS ++#define nixio_tls__check_connected(L) ; ++ ++#define nixio_tls__set_connected(L, val) ; ++#else ++#define nixio_tls__check_connected(L) \ ++ nixio_tls_sock *ctsock = luaL_checkudata(L, 1, NIXIO_TLS_SOCK_META); \ ++ if (!ctsock->connected) { \ ++ lua_pushnil(L); \ ++ lua_pushinteger(L, 1); \ ++ return 2; \ ++ } ++ ++#define nixio_tls__set_connected(L, val) \ ++((nixio_tls_sock*)luaL_checkudata(L, 1, NIXIO_TLS_SOCK_META))->connected = val; ++#endif /* WITH_AXTLS */ ++ ++static int nixio_tls_sock_recv(lua_State *L) { ++ SSL *sock = nixio__checktlssock(L); ++ nixio_tls__check_connected(L); ++ uint req = luaL_checkinteger(L, 2); ++ ++ luaL_argcheck(L, req >= 0, 2, "out of range"); ++ ++ /* We limit the readsize to NIXIO_BUFFERSIZE */ ++ req = (req > NIXIO_BUFFERSIZE) ? NIXIO_BUFFERSIZE : req; ++ ++#ifndef WITH_AXTLS ++ ++ char buffer[NIXIO_BUFFERSIZE]; ++ int readc = SSL_read(sock, buffer, req); ++ ++ if (readc < 0) { ++ return nixio__tls_sock_pstatus(L, sock, readc); ++ } else { ++ lua_pushlstring(L, buffer, readc); ++ return 1; ++ } ++ ++#else ++ ++ if (!req) { ++ lua_pushliteral(L, ""); ++ return 1; ++ } ++ ++ nixio_tls_sock *t = lua_touserdata(L, 1); ++ ++ /* AXTLS doesn't handle buffering for us, so we have to hack around*/ ++ if (req < t->pbufsiz) { ++ lua_pushlstring(L, t->pbufpos, req); ++ t->pbufpos += req; ++ t->pbufsiz -= req; ++ return 1; ++ } else { ++ uint8_t *axbuf; ++ int axread; ++ ++ /* while handshake pending */ ++ while ((axread = ssl_read(sock, &axbuf)) == SSL_OK); ++ ++ if (t->pbufsiz) { ++ lua_pushlstring(L, t->pbufpos, t->pbufsiz); ++ } ++ ++ if (axread < 0) { ++ /* There is an error */ ++ free(t->pbuffer); ++ t->pbuffer = t->pbufpos = NULL; ++ ++ if (axread != SSL_ERROR_CONN_LOST) { ++ t->pbufsiz = 0; ++ return nixio__tls_sock_perror(L, sock, axread); ++ } else { ++ if (!t->pbufsiz) { ++ lua_pushliteral(L, ""); ++ } else { ++ t->pbufsiz = 0; ++ } ++ } ++ } else { ++ int stillwant = req - t->pbufsiz; ++ if (stillwant < axread) { ++ /* we got more data than we need */ ++ lua_pushlstring(L, (char *)axbuf, stillwant); ++ if(t->pbufsiz) { ++ lua_concat(L, 2); ++ } ++ ++ /* remaining data goes into the buffer */ ++ t->pbufpos = t->pbuffer; ++ t->pbufsiz = axread - stillwant; ++ t->pbuffer = realloc(t->pbuffer, t->pbufsiz); ++ if (!t->pbuffer) { ++ free(t->pbufpos); ++ t->pbufpos = NULL; ++ t->pbufsiz = 0; ++ return luaL_error(L, "out of memory"); ++ } ++ ++ t->pbufpos = t->pbuffer; ++ memcpy(t->pbufpos, axbuf + stillwant, t->pbufsiz); ++ } else { ++ lua_pushlstring(L, (char *)axbuf, axread); ++ if(t->pbufsiz) { ++ lua_concat(L, 2); ++ } ++ ++ /* free buffer */ ++ free(t->pbuffer); ++ t->pbuffer = t->pbufpos = NULL; ++ t->pbufsiz = 0; ++ } ++ } ++ return 1; ++ } ++ ++#endif /* WITH_AXTLS */ ++ ++} ++ ++static int nixio_tls_sock_send(lua_State *L) { ++ SSL *sock = nixio__checktlssock(L); ++ nixio_tls__check_connected(L); ++ size_t len; ++ ssize_t sent; ++ const char *data = luaL_checklstring(L, 2, &len); ++ ++ if (lua_gettop(L) > 2) { ++ int offset = luaL_optint(L, 3, 0); ++ if (offset) { ++ if (offset < len) { ++ data += offset; ++ len -= offset; ++ } else { ++ len = 0; ++ } ++ } ++ ++ unsigned int wlen = luaL_optint(L, 4, len); ++ if (wlen < len) { ++ len = wlen; ++ } ++ } ++ ++ sent = SSL_write(sock, data, len); ++ if (sent > 0) { ++ lua_pushinteger(L, sent); ++ return 1; ++ } else { ++ return nixio__tls_sock_pstatus(L, sock, sent); ++ } ++} ++ ++static int nixio_tls_sock_accept(lua_State *L) { ++ SSL *sock = nixio__checktlssock(L); ++ const int stat = SSL_accept(sock); ++ nixio_tls__set_connected(L, stat == 1); ++ return nixio__tls_sock_pstatus(L, sock, stat); ++} ++ ++static int nixio_tls_sock_connect(lua_State *L) { ++ SSL *sock = nixio__checktlssock(L); ++ const int stat = SSL_connect(sock); ++ nixio_tls__set_connected(L, stat == 1); ++ return nixio__tls_sock_pstatus(L, sock, stat); ++} ++ ++static int nixio_tls_sock_shutdown(lua_State *L) { ++ SSL *sock = nixio__checktlssock(L); ++ nixio_tls__set_connected(L, 0); ++ return nixio__tls_sock_pstatus(L, sock, SSL_shutdown(sock)); ++} ++ ++static int nixio_tls_sock__gc(lua_State *L) { ++ nixio_tls_sock *sock = luaL_checkudata(L, 1, NIXIO_TLS_SOCK_META); ++ if (sock->socket) { ++ SSL_free(sock->socket); ++ sock->socket = NULL; ++#ifdef WITH_AXTLS ++ free(sock->pbuffer); ++#endif ++ } ++ return 0; ++} ++ ++static int nixio_tls_sock__tostring(lua_State *L) { ++ SSL *sock = nixio__checktlssock(L); ++ lua_pushfstring(L, "nixio TLS connection: %p", sock); ++ return 1; ++} ++ ++ ++/* ctx function table */ ++static const luaL_reg M[] = { ++ {"recv", nixio_tls_sock_recv}, ++ {"send", nixio_tls_sock_send}, ++ {"read", nixio_tls_sock_recv}, ++ {"write", nixio_tls_sock_send}, ++ {"accept", nixio_tls_sock_accept}, ++ {"connect", nixio_tls_sock_connect}, ++ {"shutdown", nixio_tls_sock_shutdown}, ++ {"__gc", nixio_tls_sock__gc}, ++ {"__tostring", nixio_tls_sock__tostring}, ++ {NULL, NULL} ++}; ++ ++ ++void nixio_open_tls_socket(lua_State *L) { ++ /* create socket metatable */ ++ luaL_newmetatable(L, NIXIO_TLS_SOCK_META); ++ luaL_register(L, NULL, M); ++ lua_pushvalue(L, -1); ++ lua_setfield(L, -2, "__index"); ++ lua_setfield(L, -2, "meta_tls_socket"); ++} +diff --git a/feeds/luci/libs/luci-lib-nixio/src/user.c b/feeds/luci/libs/luci-lib-nixio/src/user.c +new file mode 100644 +index 0000000..b701bac +--- /dev/null ++++ b/feeds/luci/libs/luci-lib-nixio/src/user.c +@@ -0,0 +1,263 @@ ++/* ++ * nixio - Linux I/O library for lua ++ * ++ * Copyright (C) 2009 Steven Barth ++ * ++ * Licensed under the Apache License, Version 2.0 (the "License"); ++ * you may not use this file except in compliance with the License. ++ * You may obtain a copy of the License at ++ * ++ * http://www.apache.org/licenses/LICENSE-2.0 ++ * ++ * Unless required by applicable law or agreed to in writing, software ++ * distributed under the License is distributed on an "AS IS" BASIS, ++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. ++ * See the License for the specific language governing permissions and ++ * limitations under the License. ++ */ ++ ++#include "nixio.h" ++#include ++#include ++#include ++#include ++ ++#ifndef __WINNT__ ++ ++#include ++#include ++ ++#ifndef BSD ++#ifndef NO_SHADOW ++#include ++#endif ++#include ++#endif ++ ++int nixio__check_group(lua_State *L, int idx) { ++ if (lua_isnumber(L, idx)) { ++ return lua_tointeger(L, idx); ++ } else if (lua_isstring(L, idx)) { ++ struct group *g = getgrnam(lua_tostring(L, idx)); ++ return (!g) ? -1 : g->gr_gid; ++ } else { ++ return luaL_argerror(L, idx, "supported values: , "); ++ } ++} ++ ++int nixio__check_user(lua_State *L, int idx) { ++ if (lua_isnumber(L, idx)) { ++ return lua_tointeger(L, idx); ++ } else if (lua_isstring(L, idx)) { ++ struct passwd *p = getpwnam(lua_tostring(L, idx)); ++ return (!p) ? -1 : p->pw_uid; ++ } else { ++ return luaL_argerror(L, idx, "supported values: , "); ++ } ++} ++ ++ ++static int nixio__push_group(lua_State *L, struct group *gr) { ++ lua_createtable(L, 0, 4); ++ lua_pushstring(L, gr->gr_name); ++ lua_setfield(L, -2, "name"); ++ lua_pushstring(L, gr->gr_passwd); ++ lua_setfield(L, -2, "passwd"); ++ lua_pushinteger(L, gr->gr_gid); ++ lua_setfield(L, -2, "gid"); ++ lua_newtable(L); ++ ++ for (int i=0; gr->gr_mem[i]; i++) { ++ lua_pushstring(L, gr->gr_mem[i]); ++ lua_rawseti(L, -2, i+1); ++ } ++ ++ lua_setfield(L, -2, "mem"); ++ return 1; ++} ++ ++static int nixio_getgr(lua_State *L) { ++ struct group *gr; ++ errno = 0; ++ if (lua_isnumber(L, 1)) { ++ gr = getgrgid(lua_tointeger(L, 1)); ++ } else if (lua_isstring(L, 1)) { ++ gr = getgrnam(lua_tostring(L, 1)); ++ } else if (lua_isnoneornil(L, 1)) { ++ lua_newtable(L); ++ int i = 0; ++ ++ setgrent(); ++ while ((gr = getgrent())) { ++ nixio__push_group(L, gr); ++ lua_rawseti(L, -2, ++i); ++ } ++ ++ if (errno) { ++ return nixio__perror(L); ++ } ++ ++ endgrent(); ++ return 1; ++ } else { ++ return luaL_argerror(L, 1, "supported values: , "); ++ } ++ ++ if (!gr) { ++ return nixio__perror(L); ++ } else { ++ return nixio__push_group(L, gr); ++ } ++} ++ ++static int nixio__push_passwd(lua_State *L, struct passwd *pw) { ++ lua_createtable(L, 0, 7); ++ lua_pushstring(L, pw->pw_name); ++ lua_setfield(L, -2, "name"); ++ lua_pushstring(L, pw->pw_passwd); ++ lua_setfield(L, -2, "passwd"); ++ lua_pushinteger(L, pw->pw_gid); ++ lua_setfield(L, -2, "gid"); ++ lua_pushinteger(L, pw->pw_uid); ++ lua_setfield(L, -2, "uid"); ++ lua_pushstring(L, pw->pw_dir); ++ lua_setfield(L, -2, "dir"); ++ lua_pushstring(L, pw->pw_gecos); ++ lua_setfield(L, -2, "gecos"); ++ lua_pushstring(L, pw->pw_shell); ++ lua_setfield(L, -2, "shell"); ++ return 1; ++} ++ ++static int nixio_getpw(lua_State *L) { ++ struct passwd *pw; ++ errno = 0; ++ if (lua_isnumber(L, 1)) { ++ pw = getpwuid(lua_tointeger(L, 1)); ++ } else if (lua_isstring(L, 1)) { ++ pw = getpwnam(lua_tostring(L, 1)); ++ } else if (lua_isnoneornil(L, 1)) { ++ lua_newtable(L); ++ int i = 0; ++ ++ setpwent(); ++ while ((pw = getpwent())) { ++ nixio__push_passwd(L, pw); ++ lua_rawseti(L, -2, ++i); ++ } ++ ++ if (errno) { ++ return nixio__perror(L); ++ } ++ ++ endpwent(); ++ return 1; ++ } else { ++ return luaL_argerror(L, 1, "supported values: , "); ++ } ++ ++ if (!pw) { ++ return nixio__perror(L); ++ } else { ++ return nixio__push_passwd(L, pw); ++ } ++} ++ ++#ifndef BSD ++#ifndef NO_SHADOW ++static int nixio__push_spwd(lua_State *L, struct spwd *sp) { ++ lua_createtable(L, 0, 9); ++ lua_pushstring(L, sp->sp_namp); ++ lua_setfield(L, -2, "namp"); ++ lua_pushinteger(L, sp->sp_expire); ++ lua_setfield(L, -2, "expire"); ++ lua_pushinteger(L, sp->sp_flag); ++ lua_setfield(L, -2, "flag"); ++ lua_pushinteger(L, sp->sp_inact); ++ lua_setfield(L, -2, "inact"); ++ lua_pushinteger(L, sp->sp_lstchg); ++ lua_setfield(L, -2, "lstchg"); ++ lua_pushinteger(L, sp->sp_max); ++ lua_setfield(L, -2, "max"); ++ lua_pushinteger(L, sp->sp_min); ++ lua_setfield(L, -2, "min"); ++ lua_pushinteger(L, sp->sp_warn); ++ lua_setfield(L, -2, "warn"); ++ lua_pushstring(L, sp->sp_pwdp); ++ lua_setfield(L, -2, "pwdp"); ++ return 1; ++} ++ ++static int nixio_getsp(lua_State *L) { ++ struct spwd *sp; ++ errno = 0; ++ if (lua_isstring(L, 1)) { ++ sp = getspnam(lua_tostring(L, 1)); ++ } else if (lua_isnoneornil(L, 1)) { ++ lua_newtable(L); ++ int i = 0; ++ ++ setspent(); ++ while ((sp = getspent())) { ++ nixio__push_spwd(L, sp); ++ lua_rawseti(L, -2, ++i); ++ } ++ ++ if (errno) { ++ return nixio__perror(L); ++ } ++ ++ endspent(); ++ return 1; ++ } else { ++ return luaL_argerror(L, 1, "supported values: "); ++ } ++ ++ if (!sp) { ++ return nixio__perror(L); ++ } else { ++ return nixio__push_spwd(L, sp); ++ } ++} ++#endif /* !NO_SHADOW */ ++#endif /* !BSD */ ++ ++static int nixio_crypt(lua_State *L) { ++ const char *key = luaL_checkstring(L, 1); ++ const char *salt = luaL_checkstring(L, 2); ++ const char *hash = crypt(key, salt); ++ ++ if (hash) { ++ lua_pushstring(L, hash); ++ } else { ++ lua_pushnil(L); ++ } ++ ++ return 1; ++} ++ ++ ++/* module table */ ++static const luaL_reg R[] = { ++ {"crypt", nixio_crypt}, ++ {"getgr", nixio_getgr}, ++ {"getpw", nixio_getpw}, ++#ifndef BSD ++#ifndef NO_SHADOW ++ {"getsp", nixio_getsp}, ++#endif ++#endif ++ {NULL, NULL} ++}; ++ ++#else /* __WINNT__ */ ++ ++static const luaL_reg R[] = { ++ {NULL, NULL} ++}; ++ ++#endif ++ ++void nixio_open_user(lua_State *L) { ++ luaL_register(L, NULL, R); ++} +diff --git a/feeds/luci/libs/luci-lib-px5g/Makefile b/feeds/luci/libs/luci-lib-px5g/Makefile +new file mode 100644 +index 0000000..70b95e8 +--- /dev/null ++++ b/feeds/luci/libs/luci-lib-px5g/Makefile +@@ -0,0 +1,16 @@ ++# ++# Copyright (C) 2008-2014 The LuCI Team ++# ++# This is free software, licensed under the Apache License, Version 2.0 . ++# ++ ++include $(TOPDIR)/rules.mk ++ ++LUCI_TITLE:=RSA/X.509 Key Generator (required for LuCId SSL support) ++LUCI_DEPENDS:=+liblua ++ ++PKG_USE_MIPS16:=0 ++ ++include ../../luci.mk ++ ++# call BuildPackage - OpenWrt buildroot signature +diff --git a/feeds/luci/libs/luci-lib-px5g/lua/px5g/util.lua b/feeds/luci/libs/luci-lib-px5g/lua/px5g/util.lua +new file mode 100644 +index 0000000..0f07c81 +--- /dev/null ++++ b/feeds/luci/libs/luci-lib-px5g/lua/px5g/util.lua +@@ -0,0 +1,44 @@ ++--[[ ++ * px5g - Embedded x509 key and certificate generator based on PolarSSL ++ * ++ * Copyright (C) 2009 Steven Barth ++ * ++ * This library is free software; you can redistribute it and/or ++ * modify it under the terms of the GNU Lesser General Public ++ * License, version 2.1 as published by the Free Software Foundation. ++]]-- ++ ++local nixio = require "nixio" ++local table = require "table" ++ ++module "px5g.util" ++ ++local preamble = { ++ key = "-----BEGIN RSA PRIVATE KEY-----", ++ cert = "-----BEGIN CERTIFICATE-----", ++ request = "-----BEGIN CERTIFICATE REQUEST-----" ++} ++ ++local postamble = { ++ key = "-----END RSA PRIVATE KEY-----", ++ cert = "-----END CERTIFICATE-----", ++ request = "-----END CERTIFICATE REQUEST-----" ++} ++ ++function der2pem(data, type) ++ local b64 = nixio.bin.b64encode(data) ++ ++ local outdata = {preamble[type]} ++ for i = 1, #b64, 64 do ++ outdata[#outdata + 1] = b64:sub(i, i + 63) ++ end ++ outdata[#outdata + 1] = postamble[type] ++ outdata[#outdata + 1] = "" ++ ++ return table.concat(outdata, "\n") ++end ++ ++function pem2der(data) ++ local b64 = data:gsub({["\n"] = "", ["%-%-%-%-%-.-%-%-%-%-%-"] = ""}) ++ return nixio.bin.b64decode(b64) ++end +\ No newline at end of file +diff --git a/feeds/luci/libs/luci-lib-px5g/root/usr/sbin/px5g-genkeys b/feeds/luci/libs/luci-lib-px5g/root/usr/sbin/px5g-genkeys +new file mode 100755 +index 0000000..87a66bf +--- /dev/null ++++ b/feeds/luci/libs/luci-lib-px5g/root/usr/sbin/px5g-genkeys +@@ -0,0 +1,19 @@ ++#!/usr/bin/lua ++local keyfile = "/etc/nixio/rsa_main.der" ++local certfile = "/etc/nixio/cert_main.der" ++ ++local px5g = require "px5g" ++local nixio = require "nixio" ++local fs = require "nixio.fs" ++local os = require "os" ++nixio.umask(77) ++ ++if not fs.access(certfile) then ++ local key = px5g.genkey(2048) ++ fs.writefile(keyfile, key:asn1()) ++ ++ local cert = key:create_selfsigned( ++ {CN=nixio.uname().nodename, O="LuCI Keymaster"}, ++ os.time(), os.time() + 3600 * 24 * 366 * 15) ++ fs.writefile(certfile, cert) ++end +diff --git a/feeds/luci/libs/luci-lib-px5g/src/Makefile b/feeds/luci/libs/luci-lib-px5g/src/Makefile +new file mode 100644 +index 0000000..755565e +--- /dev/null ++++ b/feeds/luci/libs/luci-lib-px5g/src/Makefile +@@ -0,0 +1,17 @@ ++PX5G_CFLAGS = -I. -include polarssl/rsa.h -include polarssl/x509.h -std=gnu99 ++PX5G_LDFLAGS = -llua -lm ++PX5G_OBJ = px5g.o library/bignum.o library/havege.o library/rsa.o library/sha1.o library/timing.o library/x509write.o ++PX5G_LIB = px5g.so ++ ++%.o: %.c ++ $(CC) $(CPPFLAGS) $(CFLAGS) $(LUA_CFLAGS) $(PX5G_CFLAGS) $(FPIC) -c -o $@ $< ++ ++compile: $(PX5G_OBJ) ++ $(CC) $(LDFLAGS) -shared -o $(PX5G_LIB) $(PX5G_OBJ) $(PX5G_LDFLAGS) ++ ++install: compile ++ mkdir -p $(DESTDIR)/usr/lib/lua ++ cp $(PX5G_LIB) $(DESTDIR)/usr/lib/lua/$(PX5G_LIB) ++ ++clean: ++ rm -f *.o *.so +diff --git a/feeds/luci/libs/luci-lib-px5g/src/library/bignum.c b/feeds/luci/libs/luci-lib-px5g/src/library/bignum.c +new file mode 100644 +index 0000000..8b7c12f +--- /dev/null ++++ b/feeds/luci/libs/luci-lib-px5g/src/library/bignum.c +@@ -0,0 +1,2010 @@ ++/* ++ * Multi-precision integer library ++ * ++ * Based on XySSL: Copyright (C) 2006-2008 Christophe Devine ++ * ++ * Copyright (C) 2009 Paul Bakker ++ * ++ * All rights reserved. ++ * ++ * Redistribution and use in source and binary forms, with or without ++ * modification, are permitted provided that the following conditions ++ * are met: ++ * ++ * * Redistributions of source code must retain the above copyright ++ * notice, this list of conditions and the following disclaimer. ++ * * 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. ++ * * Neither the names of PolarSSL or XySSL nor the names of its contributors ++ * may be used to endorse or promote products derived from this software ++ * without specific prior written permission. ++ * ++ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ++ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT ++ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS ++ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT ++ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, ++ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED ++ * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR ++ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF ++ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING ++ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS ++ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ++ */ ++/* ++ * This MPI implementation is based on: ++ * ++ * http://www.cacr.math.uwaterloo.ca/hac/about/chap14.pdf ++ * http://www.stillhq.com/extracted/gnupg-api/mpi/ ++ * http://math.libtomcrypt.com/files/tommath.pdf ++ */ ++ ++#include "polarssl/config.h" ++ ++#if defined(POLARSSL_BIGNUM_C) ++ ++#include "polarssl/bignum.h" ++#include "polarssl/bn_mul.h" ++ ++#include ++#include ++#include ++ ++#define ciL ((int) sizeof(t_int)) /* chars in limb */ ++#define biL (ciL << 3) /* bits in limb */ ++#define biH (ciL << 2) /* half limb size */ ++ ++/* ++ * Convert between bits/chars and number of limbs ++ */ ++#define BITS_TO_LIMBS(i) (((i) + biL - 1) / biL) ++#define CHARS_TO_LIMBS(i) (((i) + ciL - 1) / ciL) ++ ++/* ++ * Initialize one or more mpi ++ */ ++void mpi_init( mpi *X, ... ) ++{ ++ va_list args; ++ ++ va_start( args, X ); ++ ++ while( X != NULL ) ++ { ++ X->s = 1; ++ X->n = 0; ++ X->p = NULL; ++ ++ X = va_arg( args, mpi* ); ++ } ++ ++ va_end( args ); ++} ++ ++/* ++ * Unallocate one or more mpi ++ */ ++void mpi_free( mpi *X, ... ) ++{ ++ va_list args; ++ ++ va_start( args, X ); ++ ++ while( X != NULL ) ++ { ++ if( X->p != NULL ) ++ { ++ memset( X->p, 0, X->n * ciL ); ++ free( X->p ); ++ } ++ ++ X->s = 1; ++ X->n = 0; ++ X->p = NULL; ++ ++ X = va_arg( args, mpi* ); ++ } ++ ++ va_end( args ); ++} ++ ++/* ++ * Enlarge to the specified number of limbs ++ */ ++int mpi_grow( mpi *X, int nblimbs ) ++{ ++ t_int *p; ++ ++ if( X->n < nblimbs ) ++ { ++ if( ( p = (t_int *) malloc( nblimbs * ciL ) ) == NULL ) ++ return( 1 ); ++ ++ memset( p, 0, nblimbs * ciL ); ++ ++ if( X->p != NULL ) ++ { ++ memcpy( p, X->p, X->n * ciL ); ++ memset( X->p, 0, X->n * ciL ); ++ free( X->p ); ++ } ++ ++ X->n = nblimbs; ++ X->p = p; ++ } ++ ++ return( 0 ); ++} ++ ++/* ++ * Copy the contents of Y into X ++ */ ++int mpi_copy( mpi *X, mpi *Y ) ++{ ++ int ret, i; ++ ++ if( X == Y ) ++ return( 0 ); ++ ++ for( i = Y->n - 1; i > 0; i-- ) ++ if( Y->p[i] != 0 ) ++ break; ++ i++; ++ ++ X->s = Y->s; ++ ++ MPI_CHK( mpi_grow( X, i ) ); ++ ++ memset( X->p, 0, X->n * ciL ); ++ memcpy( X->p, Y->p, i * ciL ); ++ ++cleanup: ++ ++ return( ret ); ++} ++ ++/* ++ * Swap the contents of X and Y ++ */ ++void mpi_swap( mpi *X, mpi *Y ) ++{ ++ mpi T; ++ ++ memcpy( &T, X, sizeof( mpi ) ); ++ memcpy( X, Y, sizeof( mpi ) ); ++ memcpy( Y, &T, sizeof( mpi ) ); ++} ++ ++/* ++ * Set value from integer ++ */ ++int mpi_lset( mpi *X, int z ) ++{ ++ int ret; ++ ++ MPI_CHK( mpi_grow( X, 1 ) ); ++ memset( X->p, 0, X->n * ciL ); ++ ++ X->p[0] = ( z < 0 ) ? -z : z; ++ X->s = ( z < 0 ) ? -1 : 1; ++ ++cleanup: ++ ++ return( ret ); ++} ++ ++/* ++ * Return the number of least significant bits ++ */ ++int mpi_lsb( mpi *X ) ++{ ++ int i, j, count = 0; ++ ++ for( i = 0; i < X->n; i++ ) ++ for( j = 0; j < (int) biL; j++, count++ ) ++ if( ( ( X->p[i] >> j ) & 1 ) != 0 ) ++ return( count ); ++ ++ return( 0 ); ++} ++ ++/* ++ * Return the number of most significant bits ++ */ ++int mpi_msb( mpi *X ) ++{ ++ int i, j; ++ ++ for( i = X->n - 1; i > 0; i-- ) ++ if( X->p[i] != 0 ) ++ break; ++ ++ for( j = biL - 1; j >= 0; j-- ) ++ if( ( ( X->p[i] >> j ) & 1 ) != 0 ) ++ break; ++ ++ return( ( i * biL ) + j + 1 ); ++} ++ ++/* ++ * Return the total size in bytes ++ */ ++int mpi_size( mpi *X ) ++{ ++ return( ( mpi_msb( X ) + 7 ) >> 3 ); ++} ++ ++/* ++ * Convert an ASCII character to digit value ++ */ ++static int mpi_get_digit( t_int *d, int radix, char c ) ++{ ++ *d = 255; ++ ++ if( c >= 0x30 && c <= 0x39 ) *d = c - 0x30; ++ if( c >= 0x41 && c <= 0x46 ) *d = c - 0x37; ++ if( c >= 0x61 && c <= 0x66 ) *d = c - 0x57; ++ ++ if( *d >= (t_int) radix ) ++ return( POLARSSL_ERR_MPI_INVALID_CHARACTER ); ++ ++ return( 0 ); ++} ++ ++/* ++ * Import from an ASCII string ++ */ ++int mpi_read_string( mpi *X, int radix, char *s ) ++{ ++ int ret, i, j, n; ++ t_int d; ++ mpi T; ++ ++ if( radix < 2 || radix > 16 ) ++ return( POLARSSL_ERR_MPI_BAD_INPUT_DATA ); ++ ++ mpi_init( &T, NULL ); ++ ++ if( radix == 16 ) ++ { ++ n = BITS_TO_LIMBS( strlen( s ) << 2 ); ++ ++ MPI_CHK( mpi_grow( X, n ) ); ++ MPI_CHK( mpi_lset( X, 0 ) ); ++ ++ for( i = strlen( s ) - 1, j = 0; i >= 0; i--, j++ ) ++ { ++ if( i == 0 && s[i] == '-' ) ++ { ++ X->s = -1; ++ break; ++ } ++ ++ MPI_CHK( mpi_get_digit( &d, radix, s[i] ) ); ++ X->p[j / (2 * ciL)] |= d << ( (j % (2 * ciL)) << 2 ); ++ } ++ } ++ else ++ { ++ MPI_CHK( mpi_lset( X, 0 ) ); ++ ++ for( i = 0; i < (int) strlen( s ); i++ ) ++ { ++ if( i == 0 && s[i] == '-' ) ++ { ++ X->s = -1; ++ continue; ++ } ++ ++ MPI_CHK( mpi_get_digit( &d, radix, s[i] ) ); ++ MPI_CHK( mpi_mul_int( &T, X, radix ) ); ++ MPI_CHK( mpi_add_int( X, &T, d ) ); ++ } ++ } ++ ++cleanup: ++ ++ mpi_free( &T, NULL ); ++ ++ return( ret ); ++} ++ ++/* ++ * Helper to write the digits high-order first ++ */ ++static int mpi_write_hlp( mpi *X, int radix, char **p ) ++{ ++ int ret; ++ t_int r; ++ ++ if( radix < 2 || radix > 16 ) ++ return( POLARSSL_ERR_MPI_BAD_INPUT_DATA ); ++ ++ MPI_CHK( mpi_mod_int( &r, X, radix ) ); ++ MPI_CHK( mpi_div_int( X, NULL, X, radix ) ); ++ ++ if( mpi_cmp_int( X, 0 ) != 0 ) ++ MPI_CHK( mpi_write_hlp( X, radix, p ) ); ++ ++ if( r < 10 ) ++ *(*p)++ = (char)( r + 0x30 ); ++ else ++ *(*p)++ = (char)( r + 0x37 ); ++ ++cleanup: ++ ++ return( ret ); ++} ++ ++/* ++ * Export into an ASCII string ++ */ ++int mpi_write_string( mpi *X, int radix, char *s, int *slen ) ++{ ++ int ret = 0, n; ++ char *p; ++ mpi T; ++ ++ if( radix < 2 || radix > 16 ) ++ return( POLARSSL_ERR_MPI_BAD_INPUT_DATA ); ++ ++ n = mpi_msb( X ); ++ if( radix >= 4 ) n >>= 1; ++ if( radix >= 16 ) n >>= 1; ++ n += 3; ++ ++ if( *slen < n ) ++ { ++ *slen = n; ++ return( POLARSSL_ERR_MPI_BUFFER_TOO_SMALL ); ++ } ++ ++ p = s; ++ mpi_init( &T, NULL ); ++ ++ if( X->s == -1 ) ++ *p++ = '-'; ++ ++ if( radix == 16 ) ++ { ++ int c, i, j, k; ++ ++ for( i = X->n - 1, k = 0; i >= 0; i-- ) ++ { ++ for( j = ciL - 1; j >= 0; j-- ) ++ { ++ c = ( X->p[i] >> (j << 3) ) & 0xFF; ++ ++ if( c == 0 && k == 0 && (i + j) != 0 ) ++ continue; ++ ++ p += sprintf( p, "%02X", c ); ++ k = 1; ++ } ++ } ++ } ++ else ++ { ++ MPI_CHK( mpi_copy( &T, X ) ); ++ MPI_CHK( mpi_write_hlp( &T, radix, &p ) ); ++ } ++ ++ *p++ = '\0'; ++ *slen = p - s; ++ ++cleanup: ++ ++ mpi_free( &T, NULL ); ++ ++ return( ret ); ++} ++ ++/* ++ * Read X from an opened file ++ */ ++int mpi_read_file( mpi *X, int radix, FILE *fin ) ++{ ++ t_int d; ++ int slen; ++ char *p; ++ char s[1024]; ++ ++ memset( s, 0, sizeof( s ) ); ++ if( fgets( s, sizeof( s ) - 1, fin ) == NULL ) ++ return( POLARSSL_ERR_MPI_FILE_IO_ERROR ); ++ ++ slen = strlen( s ); ++ if( s[slen - 1] == '\n' ) { slen--; s[slen] = '\0'; } ++ if( s[slen - 1] == '\r' ) { slen--; s[slen] = '\0'; } ++ ++ p = s + slen; ++ while( --p >= s ) ++ if( mpi_get_digit( &d, radix, *p ) != 0 ) ++ break; ++ ++ return( mpi_read_string( X, radix, p + 1 ) ); ++} ++ ++/* ++ * Write X into an opened file (or stdout if fout == NULL) ++ */ ++int mpi_write_file( char *p, mpi *X, int radix, FILE *fout ) ++{ ++ int n, ret; ++ size_t slen; ++ size_t plen; ++ char s[1024]; ++ ++ n = sizeof( s ); ++ memset( s, 0, n ); ++ n -= 2; ++ ++ MPI_CHK( mpi_write_string( X, radix, s, (int *) &n ) ); ++ ++ if( p == NULL ) p = ""; ++ ++ plen = strlen( p ); ++ slen = strlen( s ); ++ s[slen++] = '\r'; ++ s[slen++] = '\n'; ++ ++ if( fout != NULL ) ++ { ++ if( fwrite( p, 1, plen, fout ) != plen || ++ fwrite( s, 1, slen, fout ) != slen ) ++ return( POLARSSL_ERR_MPI_FILE_IO_ERROR ); ++ } ++ else ++ printf( "%s%s", p, s ); ++ ++cleanup: ++ ++ return( ret ); ++} ++ ++/* ++ * Import X from unsigned binary data, big endian ++ */ ++int mpi_read_binary( mpi *X, unsigned char *buf, int buflen ) ++{ ++ int ret, i, j, n; ++ ++ for( n = 0; n < buflen; n++ ) ++ if( buf[n] != 0 ) ++ break; ++ ++ MPI_CHK( mpi_grow( X, CHARS_TO_LIMBS( buflen - n ) ) ); ++ MPI_CHK( mpi_lset( X, 0 ) ); ++ ++ for( i = buflen - 1, j = 0; i >= n; i--, j++ ) ++ X->p[j / ciL] |= ((t_int) buf[i]) << ((j % ciL) << 3); ++ ++cleanup: ++ ++ return( ret ); ++} ++ ++/* ++ * Export X into unsigned binary data, big endian ++ */ ++int mpi_write_binary( mpi *X, unsigned char *buf, int buflen ) ++{ ++ int i, j, n; ++ ++ n = mpi_size( X ); ++ ++ if( buflen < n ) ++ return( POLARSSL_ERR_MPI_BUFFER_TOO_SMALL ); ++ ++ memset( buf, 0, buflen ); ++ ++ for( i = buflen - 1, j = 0; n > 0; i--, j++, n-- ) ++ buf[i] = (unsigned char)( X->p[j / ciL] >> ((j % ciL) << 3) ); ++ ++ return( 0 ); ++} ++ ++/* ++ * Left-shift: X <<= count ++ */ ++int mpi_shift_l( mpi *X, int count ) ++{ ++ int ret, i, v0, t1; ++ t_int r0 = 0, r1; ++ ++ v0 = count / (biL ); ++ t1 = count & (biL - 1); ++ ++ i = mpi_msb( X ) + count; ++ ++ if( X->n * (int) biL < i ) ++ MPI_CHK( mpi_grow( X, BITS_TO_LIMBS( i ) ) ); ++ ++ ret = 0; ++ ++ /* ++ * shift by count / limb_size ++ */ ++ if( v0 > 0 ) ++ { ++ for( i = X->n - 1; i >= v0; i-- ) ++ X->p[i] = X->p[i - v0]; ++ ++ for( ; i >= 0; i-- ) ++ X->p[i] = 0; ++ } ++ ++ /* ++ * shift by count % limb_size ++ */ ++ if( t1 > 0 ) ++ { ++ for( i = v0; i < X->n; i++ ) ++ { ++ r1 = X->p[i] >> (biL - t1); ++ X->p[i] <<= t1; ++ X->p[i] |= r0; ++ r0 = r1; ++ } ++ } ++ ++cleanup: ++ ++ return( ret ); ++} ++ ++/* ++ * Right-shift: X >>= count ++ */ ++int mpi_shift_r( mpi *X, int count ) ++{ ++ int i, v0, v1; ++ t_int r0 = 0, r1; ++ ++ v0 = count / biL; ++ v1 = count & (biL - 1); ++ ++ /* ++ * shift by count / limb_size ++ */ ++ if( v0 > 0 ) ++ { ++ for( i = 0; i < X->n - v0; i++ ) ++ X->p[i] = X->p[i + v0]; ++ ++ for( ; i < X->n; i++ ) ++ X->p[i] = 0; ++ } ++ ++ /* ++ * shift by count % limb_size ++ */ ++ if( v1 > 0 ) ++ { ++ for( i = X->n - 1; i >= 0; i-- ) ++ { ++ r1 = X->p[i] << (biL - v1); ++ X->p[i] >>= v1; ++ X->p[i] |= r0; ++ r0 = r1; ++ } ++ } ++ ++ return( 0 ); ++} ++ ++/* ++ * Compare unsigned values ++ */ ++int mpi_cmp_abs( mpi *X, mpi *Y ) ++{ ++ int i, j; ++ ++ for( i = X->n - 1; i >= 0; i-- ) ++ if( X->p[i] != 0 ) ++ break; ++ ++ for( j = Y->n - 1; j >= 0; j-- ) ++ if( Y->p[j] != 0 ) ++ break; ++ ++ if( i < 0 && j < 0 ) ++ return( 0 ); ++ ++ if( i > j ) return( 1 ); ++ if( j > i ) return( -1 ); ++ ++ for( ; i >= 0; i-- ) ++ { ++ if( X->p[i] > Y->p[i] ) return( 1 ); ++ if( X->p[i] < Y->p[i] ) return( -1 ); ++ } ++ ++ return( 0 ); ++} ++ ++/* ++ * Compare signed values ++ */ ++int mpi_cmp_mpi( mpi *X, mpi *Y ) ++{ ++ int i, j; ++ ++ for( i = X->n - 1; i >= 0; i-- ) ++ if( X->p[i] != 0 ) ++ break; ++ ++ for( j = Y->n - 1; j >= 0; j-- ) ++ if( Y->p[j] != 0 ) ++ break; ++ ++ if( i < 0 && j < 0 ) ++ return( 0 ); ++ ++ if( i > j ) return( X->s ); ++ if( j > i ) return( -X->s ); ++ ++ if( X->s > 0 && Y->s < 0 ) return( 1 ); ++ if( Y->s > 0 && X->s < 0 ) return( -1 ); ++ ++ for( ; i >= 0; i-- ) ++ { ++ if( X->p[i] > Y->p[i] ) return( X->s ); ++ if( X->p[i] < Y->p[i] ) return( -X->s ); ++ } ++ ++ return( 0 ); ++} ++ ++/* ++ * Compare signed values ++ */ ++int mpi_cmp_int( mpi *X, int z ) ++{ ++ mpi Y; ++ t_int p[1]; ++ ++ *p = ( z < 0 ) ? -z : z; ++ Y.s = ( z < 0 ) ? -1 : 1; ++ Y.n = 1; ++ Y.p = p; ++ ++ return( mpi_cmp_mpi( X, &Y ) ); ++} ++ ++/* ++ * Unsigned addition: X = |A| + |B| (HAC 14.7) ++ */ ++int mpi_add_abs( mpi *X, mpi *A, mpi *B ) ++{ ++ int ret, i, j; ++ t_int *o, *p, c; ++ ++ if( X == B ) ++ { ++ mpi *T = A; A = X; B = T; ++ } ++ ++ if( X != A ) ++ MPI_CHK( mpi_copy( X, A ) ); ++ ++ for( j = B->n - 1; j >= 0; j-- ) ++ if( B->p[j] != 0 ) ++ break; ++ ++ MPI_CHK( mpi_grow( X, j + 1 ) ); ++ ++ o = B->p; p = X->p; c = 0; ++ ++ for( i = 0; i <= j; i++, o++, p++ ) ++ { ++ *p += c; c = ( *p < c ); ++ *p += *o; c += ( *p < *o ); ++ } ++ ++ while( c != 0 ) ++ { ++ if( i >= X->n ) ++ { ++ MPI_CHK( mpi_grow( X, i + 1 ) ); ++ p = X->p + i; ++ } ++ ++ *p += c; c = ( *p < c ); i++; ++ } ++ ++cleanup: ++ ++ return( ret ); ++} ++ ++/* ++ * Helper for mpi substraction ++ */ ++static void mpi_sub_hlp( int n, t_int *s, t_int *d ) ++{ ++ int i; ++ t_int c, z; ++ ++ for( i = c = 0; i < n; i++, s++, d++ ) ++ { ++ z = ( *d < c ); *d -= c; ++ c = ( *d < *s ) + z; *d -= *s; ++ } ++ ++ while( c != 0 ) ++ { ++ z = ( *d < c ); *d -= c; ++ c = z; i++; d++; ++ } ++} ++ ++/* ++ * Unsigned substraction: X = |A| - |B| (HAC 14.9) ++ */ ++int mpi_sub_abs( mpi *X, mpi *A, mpi *B ) ++{ ++ mpi TB; ++ int ret, n; ++ ++ if( mpi_cmp_abs( A, B ) < 0 ) ++ return( POLARSSL_ERR_MPI_NEGATIVE_VALUE ); ++ ++ mpi_init( &TB, NULL ); ++ ++ if( X == B ) ++ { ++ MPI_CHK( mpi_copy( &TB, B ) ); ++ B = &TB; ++ } ++ ++ if( X != A ) ++ MPI_CHK( mpi_copy( X, A ) ); ++ ++ ret = 0; ++ ++ for( n = B->n - 1; n >= 0; n-- ) ++ if( B->p[n] != 0 ) ++ break; ++ ++ mpi_sub_hlp( n + 1, B->p, X->p ); ++ ++cleanup: ++ ++ mpi_free( &TB, NULL ); ++ ++ return( ret ); ++} ++ ++/* ++ * Signed addition: X = A + B ++ */ ++int mpi_add_mpi( mpi *X, mpi *A, mpi *B ) ++{ ++ int ret, s = A->s; ++ ++ if( A->s * B->s < 0 ) ++ { ++ if( mpi_cmp_abs( A, B ) >= 0 ) ++ { ++ MPI_CHK( mpi_sub_abs( X, A, B ) ); ++ X->s = s; ++ } ++ else ++ { ++ MPI_CHK( mpi_sub_abs( X, B, A ) ); ++ X->s = -s; ++ } ++ } ++ else ++ { ++ MPI_CHK( mpi_add_abs( X, A, B ) ); ++ X->s = s; ++ } ++ ++cleanup: ++ ++ return( ret ); ++} ++ ++/* ++ * Signed substraction: X = A - B ++ */ ++int mpi_sub_mpi( mpi *X, mpi *A, mpi *B ) ++{ ++ int ret, s = A->s; ++ ++ if( A->s * B->s > 0 ) ++ { ++ if( mpi_cmp_abs( A, B ) >= 0 ) ++ { ++ MPI_CHK( mpi_sub_abs( X, A, B ) ); ++ X->s = s; ++ } ++ else ++ { ++ MPI_CHK( mpi_sub_abs( X, B, A ) ); ++ X->s = -s; ++ } ++ } ++ else ++ { ++ MPI_CHK( mpi_add_abs( X, A, B ) ); ++ X->s = s; ++ } ++ ++cleanup: ++ ++ return( ret ); ++} ++ ++/* ++ * Signed addition: X = A + b ++ */ ++int mpi_add_int( mpi *X, mpi *A, int b ) ++{ ++ mpi _B; ++ t_int p[1]; ++ ++ p[0] = ( b < 0 ) ? -b : b; ++ _B.s = ( b < 0 ) ? -1 : 1; ++ _B.n = 1; ++ _B.p = p; ++ ++ return( mpi_add_mpi( X, A, &_B ) ); ++} ++ ++/* ++ * Signed substraction: X = A - b ++ */ ++int mpi_sub_int( mpi *X, mpi *A, int b ) ++{ ++ mpi _B; ++ t_int p[1]; ++ ++ p[0] = ( b < 0 ) ? -b : b; ++ _B.s = ( b < 0 ) ? -1 : 1; ++ _B.n = 1; ++ _B.p = p; ++ ++ return( mpi_sub_mpi( X, A, &_B ) ); ++} ++ ++/* ++ * Helper for mpi multiplication ++ */ ++static void mpi_mul_hlp( int i, t_int *s, t_int *d, t_int b ) ++{ ++ t_int c = 0, t = 0; ++ ++#if defined(MULADDC_HUIT) ++ for( ; i >= 8; i -= 8 ) ++ { ++ MULADDC_INIT ++ MULADDC_HUIT ++ MULADDC_STOP ++ } ++ ++ for( ; i > 0; i-- ) ++ { ++ MULADDC_INIT ++ MULADDC_CORE ++ MULADDC_STOP ++ } ++#else ++ for( ; i >= 16; i -= 16 ) ++ { ++ MULADDC_INIT ++ MULADDC_CORE MULADDC_CORE ++ MULADDC_CORE MULADDC_CORE ++ MULADDC_CORE MULADDC_CORE ++ MULADDC_CORE MULADDC_CORE ++ ++ MULADDC_CORE MULADDC_CORE ++ MULADDC_CORE MULADDC_CORE ++ MULADDC_CORE MULADDC_CORE ++ MULADDC_CORE MULADDC_CORE ++ MULADDC_STOP ++ } ++ ++ for( ; i >= 8; i -= 8 ) ++ { ++ MULADDC_INIT ++ MULADDC_CORE MULADDC_CORE ++ MULADDC_CORE MULADDC_CORE ++ ++ MULADDC_CORE MULADDC_CORE ++ MULADDC_CORE MULADDC_CORE ++ MULADDC_STOP ++ } ++ ++ for( ; i > 0; i-- ) ++ { ++ MULADDC_INIT ++ MULADDC_CORE ++ MULADDC_STOP ++ } ++#endif ++ ++ t++; ++ ++ do { ++ *d += c; c = ( *d < c ); d++; ++ } ++ while( c != 0 ); ++} ++ ++/* ++ * Baseline multiplication: X = A * B (HAC 14.12) ++ */ ++int mpi_mul_mpi( mpi *X, mpi *A, mpi *B ) ++{ ++ int ret, i, j; ++ mpi TA, TB; ++ ++ mpi_init( &TA, &TB, NULL ); ++ ++ if( X == A ) { MPI_CHK( mpi_copy( &TA, A ) ); A = &TA; } ++ if( X == B ) { MPI_CHK( mpi_copy( &TB, B ) ); B = &TB; } ++ ++ for( i = A->n - 1; i >= 0; i-- ) ++ if( A->p[i] != 0 ) ++ break; ++ ++ for( j = B->n - 1; j >= 0; j-- ) ++ if( B->p[j] != 0 ) ++ break; ++ ++ MPI_CHK( mpi_grow( X, i + j + 2 ) ); ++ MPI_CHK( mpi_lset( X, 0 ) ); ++ ++ for( i++; j >= 0; j-- ) ++ mpi_mul_hlp( i, A->p, X->p + j, B->p[j] ); ++ ++ X->s = A->s * B->s; ++ ++cleanup: ++ ++ mpi_free( &TB, &TA, NULL ); ++ ++ return( ret ); ++} ++ ++/* ++ * Baseline multiplication: X = A * b ++ */ ++int mpi_mul_int( mpi *X, mpi *A, t_int b ) ++{ ++ mpi _B; ++ t_int p[1]; ++ ++ _B.s = 1; ++ _B.n = 1; ++ _B.p = p; ++ p[0] = b; ++ ++ return( mpi_mul_mpi( X, A, &_B ) ); ++} ++ ++/* ++ * Division by mpi: A = Q * B + R (HAC 14.20) ++ */ ++int mpi_div_mpi( mpi *Q, mpi *R, mpi *A, mpi *B ) ++{ ++ int ret, i, n, t, k; ++ mpi X, Y, Z, T1, T2; ++ ++ if( mpi_cmp_int( B, 0 ) == 0 ) ++ return( POLARSSL_ERR_MPI_DIVISION_BY_ZERO ); ++ ++ mpi_init( &X, &Y, &Z, &T1, &T2, NULL ); ++ ++ if( mpi_cmp_abs( A, B ) < 0 ) ++ { ++ if( Q != NULL ) MPI_CHK( mpi_lset( Q, 0 ) ); ++ if( R != NULL ) MPI_CHK( mpi_copy( R, A ) ); ++ return( 0 ); ++ } ++ ++ MPI_CHK( mpi_copy( &X, A ) ); ++ MPI_CHK( mpi_copy( &Y, B ) ); ++ X.s = Y.s = 1; ++ ++ MPI_CHK( mpi_grow( &Z, A->n + 2 ) ); ++ MPI_CHK( mpi_lset( &Z, 0 ) ); ++ MPI_CHK( mpi_grow( &T1, 2 ) ); ++ MPI_CHK( mpi_grow( &T2, 3 ) ); ++ ++ k = mpi_msb( &Y ) % biL; ++ if( k < (int) biL - 1 ) ++ { ++ k = biL - 1 - k; ++ MPI_CHK( mpi_shift_l( &X, k ) ); ++ MPI_CHK( mpi_shift_l( &Y, k ) ); ++ } ++ else k = 0; ++ ++ n = X.n - 1; ++ t = Y.n - 1; ++ mpi_shift_l( &Y, biL * (n - t) ); ++ ++ while( mpi_cmp_mpi( &X, &Y ) >= 0 ) ++ { ++ Z.p[n - t]++; ++ mpi_sub_mpi( &X, &X, &Y ); ++ } ++ mpi_shift_r( &Y, biL * (n - t) ); ++ ++ for( i = n; i > t ; i-- ) ++ { ++ if( X.p[i] >= Y.p[t] ) ++ Z.p[i - t - 1] = ~0; ++ else ++ { ++#if defined(POLARSSL_HAVE_LONGLONG) ++ t_dbl r; ++ ++ r = (t_dbl) X.p[i] << biL; ++ r |= (t_dbl) X.p[i - 1]; ++ r /= Y.p[t]; ++ if( r > ((t_dbl) 1 << biL) - 1) ++ r = ((t_dbl) 1 << biL) - 1; ++ ++ Z.p[i - t - 1] = (t_int) r; ++#else ++ /* ++ * __udiv_qrnnd_c, from gmp/longlong.h ++ */ ++ t_int q0, q1, r0, r1; ++ t_int d0, d1, d, m; ++ ++ d = Y.p[t]; ++ d0 = ( d << biH ) >> biH; ++ d1 = ( d >> biH ); ++ ++ q1 = X.p[i] / d1; ++ r1 = X.p[i] - d1 * q1; ++ r1 <<= biH; ++ r1 |= ( X.p[i - 1] >> biH ); ++ ++ m = q1 * d0; ++ if( r1 < m ) ++ { ++ q1--, r1 += d; ++ while( r1 >= d && r1 < m ) ++ q1--, r1 += d; ++ } ++ r1 -= m; ++ ++ q0 = r1 / d1; ++ r0 = r1 - d1 * q0; ++ r0 <<= biH; ++ r0 |= ( X.p[i - 1] << biH ) >> biH; ++ ++ m = q0 * d0; ++ if( r0 < m ) ++ { ++ q0--, r0 += d; ++ while( r0 >= d && r0 < m ) ++ q0--, r0 += d; ++ } ++ r0 -= m; ++ ++ Z.p[i - t - 1] = ( q1 << biH ) | q0; ++#endif ++ } ++ ++ Z.p[i - t - 1]++; ++ do ++ { ++ Z.p[i - t - 1]--; ++ ++ MPI_CHK( mpi_lset( &T1, 0 ) ); ++ T1.p[0] = (t < 1) ? 0 : Y.p[t - 1]; ++ T1.p[1] = Y.p[t]; ++ MPI_CHK( mpi_mul_int( &T1, &T1, Z.p[i - t - 1] ) ); ++ ++ MPI_CHK( mpi_lset( &T2, 0 ) ); ++ T2.p[0] = (i < 2) ? 0 : X.p[i - 2]; ++ T2.p[1] = (i < 1) ? 0 : X.p[i - 1]; ++ T2.p[2] = X.p[i]; ++ } ++ while( mpi_cmp_mpi( &T1, &T2 ) > 0 ); ++ ++ MPI_CHK( mpi_mul_int( &T1, &Y, Z.p[i - t - 1] ) ); ++ MPI_CHK( mpi_shift_l( &T1, biL * (i - t - 1) ) ); ++ MPI_CHK( mpi_sub_mpi( &X, &X, &T1 ) ); ++ ++ if( mpi_cmp_int( &X, 0 ) < 0 ) ++ { ++ MPI_CHK( mpi_copy( &T1, &Y ) ); ++ MPI_CHK( mpi_shift_l( &T1, biL * (i - t - 1) ) ); ++ MPI_CHK( mpi_add_mpi( &X, &X, &T1 ) ); ++ Z.p[i - t - 1]--; ++ } ++ } ++ ++ if( Q != NULL ) ++ { ++ mpi_copy( Q, &Z ); ++ Q->s = A->s * B->s; ++ } ++ ++ if( R != NULL ) ++ { ++ mpi_shift_r( &X, k ); ++ mpi_copy( R, &X ); ++ ++ R->s = A->s; ++ if( mpi_cmp_int( R, 0 ) == 0 ) ++ R->s = 1; ++ } ++ ++cleanup: ++ ++ mpi_free( &X, &Y, &Z, &T1, &T2, NULL ); ++ ++ return( ret ); ++} ++ ++/* ++ * Division by int: A = Q * b + R ++ * ++ * Returns 0 if successful ++ * 1 if memory allocation failed ++ * POLARSSL_ERR_MPI_DIVISION_BY_ZERO if b == 0 ++ */ ++int mpi_div_int( mpi *Q, mpi *R, mpi *A, int b ) ++{ ++ mpi _B; ++ t_int p[1]; ++ ++ p[0] = ( b < 0 ) ? -b : b; ++ _B.s = ( b < 0 ) ? -1 : 1; ++ _B.n = 1; ++ _B.p = p; ++ ++ return( mpi_div_mpi( Q, R, A, &_B ) ); ++} ++ ++/* ++ * Modulo: R = A mod B ++ */ ++int mpi_mod_mpi( mpi *R, mpi *A, mpi *B ) ++{ ++ int ret; ++ ++ MPI_CHK( mpi_div_mpi( NULL, R, A, B ) ); ++ ++ while( mpi_cmp_int( R, 0 ) < 0 ) ++ MPI_CHK( mpi_add_mpi( R, R, B ) ); ++ ++ while( mpi_cmp_mpi( R, B ) >= 0 ) ++ MPI_CHK( mpi_sub_mpi( R, R, B ) ); ++ ++cleanup: ++ ++ return( ret ); ++} ++ ++/* ++ * Modulo: r = A mod b ++ */ ++int mpi_mod_int( t_int *r, mpi *A, int b ) ++{ ++ int i; ++ t_int x, y, z; ++ ++ if( b == 0 ) ++ return( POLARSSL_ERR_MPI_DIVISION_BY_ZERO ); ++ ++ if( b < 0 ) ++ b = -b; ++ ++ /* ++ * handle trivial cases ++ */ ++ if( b == 1 ) ++ { ++ *r = 0; ++ return( 0 ); ++ } ++ ++ if( b == 2 ) ++ { ++ *r = A->p[0] & 1; ++ return( 0 ); ++ } ++ ++ /* ++ * general case ++ */ ++ for( i = A->n - 1, y = 0; i >= 0; i-- ) ++ { ++ x = A->p[i]; ++ y = ( y << biH ) | ( x >> biH ); ++ z = y / b; ++ y -= z * b; ++ ++ x <<= biH; ++ y = ( y << biH ) | ( x >> biH ); ++ z = y / b; ++ y -= z * b; ++ } ++ ++ *r = y; ++ ++ return( 0 ); ++} ++ ++/* ++ * Fast Montgomery initialization (thanks to Tom St Denis) ++ */ ++static void mpi_montg_init( t_int *mm, mpi *N ) ++{ ++ t_int x, m0 = N->p[0]; ++ ++ x = m0; ++ x += ( ( m0 + 2 ) & 4 ) << 1; ++ x *= ( 2 - ( m0 * x ) ); ++ ++ if( biL >= 16 ) x *= ( 2 - ( m0 * x ) ); ++ if( biL >= 32 ) x *= ( 2 - ( m0 * x ) ); ++ if( biL >= 64 ) x *= ( 2 - ( m0 * x ) ); ++ ++ *mm = ~x + 1; ++} ++ ++/* ++ * Montgomery multiplication: A = A * B * R^-1 mod N (HAC 14.36) ++ */ ++static void mpi_montmul( mpi *A, mpi *B, mpi *N, t_int mm, mpi *T ) ++{ ++ int i, n, m; ++ t_int u0, u1, *d; ++ ++ memset( T->p, 0, T->n * ciL ); ++ ++ d = T->p; ++ n = N->n; ++ m = ( B->n < n ) ? B->n : n; ++ ++ for( i = 0; i < n; i++ ) ++ { ++ /* ++ * T = (T + u0*B + u1*N) / 2^biL ++ */ ++ u0 = A->p[i]; ++ u1 = ( d[0] + u0 * B->p[0] ) * mm; ++ ++ mpi_mul_hlp( m, B->p, d, u0 ); ++ mpi_mul_hlp( n, N->p, d, u1 ); ++ ++ *d++ = u0; d[n + 1] = 0; ++ } ++ ++ memcpy( A->p, d, (n + 1) * ciL ); ++ ++ if( mpi_cmp_abs( A, N ) >= 0 ) ++ mpi_sub_hlp( n, N->p, A->p ); ++ else ++ /* prevent timing attacks */ ++ mpi_sub_hlp( n, A->p, T->p ); ++} ++ ++/* ++ * Montgomery reduction: A = A * R^-1 mod N ++ */ ++static void mpi_montred( mpi *A, mpi *N, t_int mm, mpi *T ) ++{ ++ t_int z = 1; ++ mpi U; ++ ++ U.n = U.s = z; ++ U.p = &z; ++ ++ mpi_montmul( A, &U, N, mm, T ); ++} ++ ++/* ++ * Sliding-window exponentiation: X = A^E mod N (HAC 14.85) ++ */ ++int mpi_exp_mod( mpi *X, mpi *A, mpi *E, mpi *N, mpi *_RR ) ++{ ++ int ret, i, j, wsize, wbits; ++ int bufsize, nblimbs, nbits; ++ t_int ei, mm, state; ++ mpi RR, T, W[64]; ++ ++ if( mpi_cmp_int( N, 0 ) < 0 || ( N->p[0] & 1 ) == 0 ) ++ return( POLARSSL_ERR_MPI_BAD_INPUT_DATA ); ++ ++ /* ++ * Init temps and window size ++ */ ++ mpi_montg_init( &mm, N ); ++ mpi_init( &RR, &T, NULL ); ++ memset( W, 0, sizeof( W ) ); ++ ++ i = mpi_msb( E ); ++ ++ wsize = ( i > 671 ) ? 6 : ( i > 239 ) ? 5 : ++ ( i > 79 ) ? 4 : ( i > 23 ) ? 3 : 1; ++ ++ j = N->n + 1; ++ MPI_CHK( mpi_grow( X, j ) ); ++ MPI_CHK( mpi_grow( &W[1], j ) ); ++ MPI_CHK( mpi_grow( &T, j * 2 ) ); ++ ++ /* ++ * If 1st call, pre-compute R^2 mod N ++ */ ++ if( _RR == NULL || _RR->p == NULL ) ++ { ++ MPI_CHK( mpi_lset( &RR, 1 ) ); ++ MPI_CHK( mpi_shift_l( &RR, N->n * 2 * biL ) ); ++ MPI_CHK( mpi_mod_mpi( &RR, &RR, N ) ); ++ ++ if( _RR != NULL ) ++ memcpy( _RR, &RR, sizeof( mpi ) ); ++ } ++ else ++ memcpy( &RR, _RR, sizeof( mpi ) ); ++ ++ /* ++ * W[1] = A * R^2 * R^-1 mod N = A * R mod N ++ */ ++ if( mpi_cmp_mpi( A, N ) >= 0 ) ++ mpi_mod_mpi( &W[1], A, N ); ++ else mpi_copy( &W[1], A ); ++ ++ mpi_montmul( &W[1], &RR, N, mm, &T ); ++ ++ /* ++ * X = R^2 * R^-1 mod N = R mod N ++ */ ++ MPI_CHK( mpi_copy( X, &RR ) ); ++ mpi_montred( X, N, mm, &T ); ++ ++ if( wsize > 1 ) ++ { ++ /* ++ * W[1 << (wsize - 1)] = W[1] ^ (wsize - 1) ++ */ ++ j = 1 << (wsize - 1); ++ ++ MPI_CHK( mpi_grow( &W[j], N->n + 1 ) ); ++ MPI_CHK( mpi_copy( &W[j], &W[1] ) ); ++ ++ for( i = 0; i < wsize - 1; i++ ) ++ mpi_montmul( &W[j], &W[j], N, mm, &T ); ++ ++ /* ++ * W[i] = W[i - 1] * W[1] ++ */ ++ for( i = j + 1; i < (1 << wsize); i++ ) ++ { ++ MPI_CHK( mpi_grow( &W[i], N->n + 1 ) ); ++ MPI_CHK( mpi_copy( &W[i], &W[i - 1] ) ); ++ ++ mpi_montmul( &W[i], &W[1], N, mm, &T ); ++ } ++ } ++ ++ nblimbs = E->n; ++ bufsize = 0; ++ nbits = 0; ++ wbits = 0; ++ state = 0; ++ ++ while( 1 ) ++ { ++ if( bufsize == 0 ) ++ { ++ if( nblimbs-- == 0 ) ++ break; ++ ++ bufsize = sizeof( t_int ) << 3; ++ } ++ ++ bufsize--; ++ ++ ei = (E->p[nblimbs] >> bufsize) & 1; ++ ++ /* ++ * skip leading 0s ++ */ ++ if( ei == 0 && state == 0 ) ++ continue; ++ ++ if( ei == 0 && state == 1 ) ++ { ++ /* ++ * out of window, square X ++ */ ++ mpi_montmul( X, X, N, mm, &T ); ++ continue; ++ } ++ ++ /* ++ * add ei to current window ++ */ ++ state = 2; ++ ++ nbits++; ++ wbits |= (ei << (wsize - nbits)); ++ ++ if( nbits == wsize ) ++ { ++ /* ++ * X = X^wsize R^-1 mod N ++ */ ++ for( i = 0; i < wsize; i++ ) ++ mpi_montmul( X, X, N, mm, &T ); ++ ++ /* ++ * X = X * W[wbits] R^-1 mod N ++ */ ++ mpi_montmul( X, &W[wbits], N, mm, &T ); ++ ++ state--; ++ nbits = 0; ++ wbits = 0; ++ } ++ } ++ ++ /* ++ * process the remaining bits ++ */ ++ for( i = 0; i < nbits; i++ ) ++ { ++ mpi_montmul( X, X, N, mm, &T ); ++ ++ wbits <<= 1; ++ ++ if( (wbits & (1 << wsize)) != 0 ) ++ mpi_montmul( X, &W[1], N, mm, &T ); ++ } ++ ++ /* ++ * X = A^E * R * R^-1 mod N = A^E mod N ++ */ ++ mpi_montred( X, N, mm, &T ); ++ ++cleanup: ++ ++ for( i = (1 << (wsize - 1)); i < (1 << wsize); i++ ) ++ mpi_free( &W[i], NULL ); ++ ++ if( _RR != NULL ) ++ mpi_free( &W[1], &T, NULL ); ++ else mpi_free( &W[1], &T, &RR, NULL ); ++ ++ return( ret ); ++} ++ ++/* ++ * Greatest common divisor: G = gcd(A, B) (HAC 14.54) ++ */ ++int mpi_gcd( mpi *G, mpi *A, mpi *B ) ++{ ++ int ret, lz, lzt; ++ mpi TG, TA, TB; ++ ++ mpi_init( &TG, &TA, &TB, NULL ); ++ ++ MPI_CHK( mpi_copy( &TA, A ) ); ++ MPI_CHK( mpi_copy( &TB, B ) ); ++ ++ lz = mpi_lsb( &TA ); ++ lzt = mpi_lsb( &TB ); ++ ++ if ( lzt < lz ) ++ lz = lzt; ++ ++ MPI_CHK( mpi_shift_r( &TA, lz ) ); ++ MPI_CHK( mpi_shift_r( &TB, lz ) ); ++ ++ TA.s = TB.s = 1; ++ ++ while( mpi_cmp_int( &TA, 0 ) != 0 ) ++ { ++ MPI_CHK( mpi_shift_r( &TA, mpi_lsb( &TA ) ) ); ++ MPI_CHK( mpi_shift_r( &TB, mpi_lsb( &TB ) ) ); ++ ++ if( mpi_cmp_mpi( &TA, &TB ) >= 0 ) ++ { ++ MPI_CHK( mpi_sub_abs( &TA, &TA, &TB ) ); ++ MPI_CHK( mpi_shift_r( &TA, 1 ) ); ++ } ++ else ++ { ++ MPI_CHK( mpi_sub_abs( &TB, &TB, &TA ) ); ++ MPI_CHK( mpi_shift_r( &TB, 1 ) ); ++ } ++ } ++ ++ MPI_CHK( mpi_shift_l( &TB, lz ) ); ++ MPI_CHK( mpi_copy( G, &TB ) ); ++ ++cleanup: ++ ++ mpi_free( &TB, &TA, &TG, NULL ); ++ ++ return( ret ); ++} ++ ++#if defined(POLARSSL_GENPRIME) ++ ++/* ++ * Modular inverse: X = A^-1 mod N (HAC 14.61 / 14.64) ++ */ ++int mpi_inv_mod( mpi *X, mpi *A, mpi *N ) ++{ ++ int ret; ++ mpi G, TA, TU, U1, U2, TB, TV, V1, V2; ++ ++ if( mpi_cmp_int( N, 0 ) <= 0 ) ++ return( POLARSSL_ERR_MPI_BAD_INPUT_DATA ); ++ ++ mpi_init( &TA, &TU, &U1, &U2, &G, ++ &TB, &TV, &V1, &V2, NULL ); ++ ++ MPI_CHK( mpi_gcd( &G, A, N ) ); ++ ++ if( mpi_cmp_int( &G, 1 ) != 0 ) ++ { ++ ret = POLARSSL_ERR_MPI_NOT_ACCEPTABLE; ++ goto cleanup; ++ } ++ ++ MPI_CHK( mpi_mod_mpi( &TA, A, N ) ); ++ MPI_CHK( mpi_copy( &TU, &TA ) ); ++ MPI_CHK( mpi_copy( &TB, N ) ); ++ MPI_CHK( mpi_copy( &TV, N ) ); ++ ++ MPI_CHK( mpi_lset( &U1, 1 ) ); ++ MPI_CHK( mpi_lset( &U2, 0 ) ); ++ MPI_CHK( mpi_lset( &V1, 0 ) ); ++ MPI_CHK( mpi_lset( &V2, 1 ) ); ++ ++ do ++ { ++ while( ( TU.p[0] & 1 ) == 0 ) ++ { ++ MPI_CHK( mpi_shift_r( &TU, 1 ) ); ++ ++ if( ( U1.p[0] & 1 ) != 0 || ( U2.p[0] & 1 ) != 0 ) ++ { ++ MPI_CHK( mpi_add_mpi( &U1, &U1, &TB ) ); ++ MPI_CHK( mpi_sub_mpi( &U2, &U2, &TA ) ); ++ } ++ ++ MPI_CHK( mpi_shift_r( &U1, 1 ) ); ++ MPI_CHK( mpi_shift_r( &U2, 1 ) ); ++ } ++ ++ while( ( TV.p[0] & 1 ) == 0 ) ++ { ++ MPI_CHK( mpi_shift_r( &TV, 1 ) ); ++ ++ if( ( V1.p[0] & 1 ) != 0 || ( V2.p[0] & 1 ) != 0 ) ++ { ++ MPI_CHK( mpi_add_mpi( &V1, &V1, &TB ) ); ++ MPI_CHK( mpi_sub_mpi( &V2, &V2, &TA ) ); ++ } ++ ++ MPI_CHK( mpi_shift_r( &V1, 1 ) ); ++ MPI_CHK( mpi_shift_r( &V2, 1 ) ); ++ } ++ ++ if( mpi_cmp_mpi( &TU, &TV ) >= 0 ) ++ { ++ MPI_CHK( mpi_sub_mpi( &TU, &TU, &TV ) ); ++ MPI_CHK( mpi_sub_mpi( &U1, &U1, &V1 ) ); ++ MPI_CHK( mpi_sub_mpi( &U2, &U2, &V2 ) ); ++ } ++ else ++ { ++ MPI_CHK( mpi_sub_mpi( &TV, &TV, &TU ) ); ++ MPI_CHK( mpi_sub_mpi( &V1, &V1, &U1 ) ); ++ MPI_CHK( mpi_sub_mpi( &V2, &V2, &U2 ) ); ++ } ++ } ++ while( mpi_cmp_int( &TU, 0 ) != 0 ); ++ ++ while( mpi_cmp_int( &V1, 0 ) < 0 ) ++ MPI_CHK( mpi_add_mpi( &V1, &V1, N ) ); ++ ++ while( mpi_cmp_mpi( &V1, N ) >= 0 ) ++ MPI_CHK( mpi_sub_mpi( &V1, &V1, N ) ); ++ ++ MPI_CHK( mpi_copy( X, &V1 ) ); ++ ++cleanup: ++ ++ mpi_free( &V2, &V1, &TV, &TB, &G, ++ &U2, &U1, &TU, &TA, NULL ); ++ ++ return( ret ); ++} ++ ++static const int small_prime[] = ++{ ++ 3, 5, 7, 11, 13, 17, 19, 23, ++ 29, 31, 37, 41, 43, 47, 53, 59, ++ 61, 67, 71, 73, 79, 83, 89, 97, ++ 101, 103, 107, 109, 113, 127, 131, 137, ++ 139, 149, 151, 157, 163, 167, 173, 179, ++ 181, 191, 193, 197, 199, 211, 223, 227, ++ 229, 233, 239, 241, 251, 257, 263, 269, ++ 271, 277, 281, 283, 293, 307, 311, 313, ++ 317, 331, 337, 347, 349, 353, 359, 367, ++ 373, 379, 383, 389, 397, 401, 409, 419, ++ 421, 431, 433, 439, 443, 449, 457, 461, ++ 463, 467, 479, 487, 491, 499, 503, 509, ++ 521, 523, 541, 547, 557, 563, 569, 571, ++ 577, 587, 593, 599, 601, 607, 613, 617, ++ 619, 631, 641, 643, 647, 653, 659, 661, ++ 673, 677, 683, 691, 701, 709, 719, 727, ++ 733, 739, 743, 751, 757, 761, 769, 773, ++ 787, 797, 809, 811, 821, 823, 827, 829, ++ 839, 853, 857, 859, 863, 877, 881, 883, ++ 887, 907, 911, 919, 929, 937, 941, 947, ++ 953, 967, 971, 977, 983, 991, 997, -103 ++}; ++ ++/* ++ * Miller-Rabin primality test (HAC 4.24) ++ */ ++int mpi_is_prime( mpi *X, int (*f_rng)(void *), void *p_rng ) ++{ ++ int ret, i, j, n, s, xs; ++ mpi W, R, T, A, RR; ++ unsigned char *p; ++ ++ if( mpi_cmp_int( X, 0 ) == 0 ) ++ return( 0 ); ++ ++ mpi_init( &W, &R, &T, &A, &RR, NULL ); ++ ++ xs = X->s; X->s = 1; ++ ++ /* ++ * test trivial factors first ++ */ ++ if( ( X->p[0] & 1 ) == 0 ) ++ return( POLARSSL_ERR_MPI_NOT_ACCEPTABLE ); ++ ++ for( i = 0; small_prime[i] > 0; i++ ) ++ { ++ t_int r; ++ ++ if( mpi_cmp_int( X, small_prime[i] ) <= 0 ) ++ return( 0 ); ++ ++ MPI_CHK( mpi_mod_int( &r, X, small_prime[i] ) ); ++ ++ if( r == 0 ) ++ return( POLARSSL_ERR_MPI_NOT_ACCEPTABLE ); ++ } ++ ++ /* ++ * W = |X| - 1 ++ * R = W >> lsb( W ) ++ */ ++ s = mpi_lsb( &W ); ++ MPI_CHK( mpi_sub_int( &W, X, 1 ) ); ++ MPI_CHK( mpi_copy( &R, &W ) ); ++ MPI_CHK( mpi_shift_r( &R, s ) ); ++ ++ i = mpi_msb( X ); ++ /* ++ * HAC, table 4.4 ++ */ ++ n = ( ( i >= 1300 ) ? 2 : ( i >= 850 ) ? 3 : ++ ( i >= 650 ) ? 4 : ( i >= 350 ) ? 8 : ++ ( i >= 250 ) ? 12 : ( i >= 150 ) ? 18 : 27 ); ++ ++ for( i = 0; i < n; i++ ) ++ { ++ /* ++ * pick a random A, 1 < A < |X| - 1 ++ */ ++ MPI_CHK( mpi_grow( &A, X->n ) ); ++ ++ p = (unsigned char *) A.p; ++ for( j = 0; j < A.n * ciL; j++ ) ++ *p++ = (unsigned char) f_rng( p_rng ); ++ ++ j = mpi_msb( &A ) - mpi_msb( &W ); ++ MPI_CHK( mpi_shift_r( &A, j + 1 ) ); ++ A.p[0] |= 3; ++ ++ /* ++ * A = A^R mod |X| ++ */ ++ MPI_CHK( mpi_exp_mod( &A, &A, &R, X, &RR ) ); ++ ++ if( mpi_cmp_mpi( &A, &W ) == 0 || ++ mpi_cmp_int( &A, 1 ) == 0 ) ++ continue; ++ ++ j = 1; ++ while( j < s && mpi_cmp_mpi( &A, &W ) != 0 ) ++ { ++ /* ++ * A = A * A mod |X| ++ */ ++ MPI_CHK( mpi_mul_mpi( &T, &A, &A ) ); ++ MPI_CHK( mpi_mod_mpi( &A, &T, X ) ); ++ ++ if( mpi_cmp_int( &A, 1 ) == 0 ) ++ break; ++ ++ j++; ++ } ++ ++ /* ++ * not prime if A != |X| - 1 or A == 1 ++ */ ++ if( mpi_cmp_mpi( &A, &W ) != 0 || ++ mpi_cmp_int( &A, 1 ) == 0 ) ++ { ++ ret = POLARSSL_ERR_MPI_NOT_ACCEPTABLE; ++ break; ++ } ++ } ++ ++cleanup: ++ ++ X->s = xs; ++ ++ mpi_free( &RR, &A, &T, &R, &W, NULL ); ++ ++ return( ret ); ++} ++ ++/* ++ * Prime number generation ++ */ ++int mpi_gen_prime( mpi *X, int nbits, int dh_flag, ++ int (*f_rng)(void *), void *p_rng ) ++{ ++ int ret, k, n; ++ unsigned char *p; ++ mpi Y; ++ ++ if( nbits < 3 ) ++ return( POLARSSL_ERR_MPI_BAD_INPUT_DATA ); ++ ++ mpi_init( &Y, NULL ); ++ ++ n = BITS_TO_LIMBS( nbits ); ++ ++ MPI_CHK( mpi_grow( X, n ) ); ++ MPI_CHK( mpi_lset( X, 0 ) ); ++ ++ p = (unsigned char *) X->p; ++ for( k = 0; k < X->n * ciL; k++ ) ++ *p++ = (unsigned char) f_rng( p_rng ); ++ ++ k = mpi_msb( X ); ++ if( k < nbits ) MPI_CHK( mpi_shift_l( X, nbits - k ) ); ++ if( k > nbits ) MPI_CHK( mpi_shift_r( X, k - nbits ) ); ++ ++ X->p[0] |= 3; ++ ++ if( dh_flag == 0 ) ++ { ++ while( ( ret = mpi_is_prime( X, f_rng, p_rng ) ) != 0 ) ++ { ++ if( ret != POLARSSL_ERR_MPI_NOT_ACCEPTABLE ) ++ goto cleanup; ++ ++ MPI_CHK( mpi_add_int( X, X, 2 ) ); ++ } ++ } ++ else ++ { ++ MPI_CHK( mpi_sub_int( &Y, X, 1 ) ); ++ MPI_CHK( mpi_shift_r( &Y, 1 ) ); ++ ++ while( 1 ) ++ { ++ if( ( ret = mpi_is_prime( X, f_rng, p_rng ) ) == 0 ) ++ { ++ if( ( ret = mpi_is_prime( &Y, f_rng, p_rng ) ) == 0 ) ++ break; ++ ++ if( ret != POLARSSL_ERR_MPI_NOT_ACCEPTABLE ) ++ goto cleanup; ++ } ++ ++ if( ret != POLARSSL_ERR_MPI_NOT_ACCEPTABLE ) ++ goto cleanup; ++ ++ MPI_CHK( mpi_add_int( &Y, X, 1 ) ); ++ MPI_CHK( mpi_add_int( X, X, 2 ) ); ++ MPI_CHK( mpi_shift_r( &Y, 1 ) ); ++ } ++ } ++ ++cleanup: ++ ++ mpi_free( &Y, NULL ); ++ ++ return( ret ); ++} ++ ++#endif ++ ++#if defined(POLARSSL_SELF_TEST) ++ ++#define GCD_PAIR_COUNT 3 ++ ++static const int gcd_pairs[GCD_PAIR_COUNT][3] = ++{ ++ { 693, 609, 21 }, ++ { 1764, 868, 28 }, ++ { 768454923, 542167814, 1 } ++}; ++ ++/* ++ * Checkup routine ++ */ ++int mpi_self_test( int verbose ) ++{ ++ int ret, i; ++ mpi A, E, N, X, Y, U, V; ++ ++ mpi_init( &A, &E, &N, &X, &Y, &U, &V, NULL ); ++ ++ MPI_CHK( mpi_read_string( &A, 16, ++ "EFE021C2645FD1DC586E69184AF4A31E" \ ++ "D5F53E93B5F123FA41680867BA110131" \ ++ "944FE7952E2517337780CB0DB80E61AA" \ ++ "E7C8DDC6C5C6AADEB34EB38A2F40D5E6" ) ); ++ ++ MPI_CHK( mpi_read_string( &E, 16, ++ "B2E7EFD37075B9F03FF989C7C5051C20" \ ++ "34D2A323810251127E7BF8625A4F49A5" \ ++ "F3E27F4DA8BD59C47D6DAABA4C8127BD" \ ++ "5B5C25763222FEFCCFC38B832366C29E" ) ); ++ ++ MPI_CHK( mpi_read_string( &N, 16, ++ "0066A198186C18C10B2F5ED9B522752A" \ ++ "9830B69916E535C8F047518A889A43A5" \ ++ "94B6BED27A168D31D4A52F88925AA8F5" ) ); ++ ++ MPI_CHK( mpi_mul_mpi( &X, &A, &N ) ); ++ ++ MPI_CHK( mpi_read_string( &U, 16, ++ "602AB7ECA597A3D6B56FF9829A5E8B85" \ ++ "9E857EA95A03512E2BAE7391688D264A" \ ++ "A5663B0341DB9CCFD2C4C5F421FEC814" \ ++ "8001B72E848A38CAE1C65F78E56ABDEF" \ ++ "E12D3C039B8A02D6BE593F0BBBDA56F1" \ ++ "ECF677152EF804370C1A305CAF3B5BF1" \ ++ "30879B56C61DE584A0F53A2447A51E" ) ); ++ ++ if( verbose != 0 ) ++ printf( " MPI test #1 (mul_mpi): " ); ++ ++ if( mpi_cmp_mpi( &X, &U ) != 0 ) ++ { ++ if( verbose != 0 ) ++ printf( "failed\n" ); ++ ++ return( 1 ); ++ } ++ ++ if( verbose != 0 ) ++ printf( "passed\n" ); ++ ++ MPI_CHK( mpi_div_mpi( &X, &Y, &A, &N ) ); ++ ++ MPI_CHK( mpi_read_string( &U, 16, ++ "256567336059E52CAE22925474705F39A94" ) ); ++ ++ MPI_CHK( mpi_read_string( &V, 16, ++ "6613F26162223DF488E9CD48CC132C7A" \ ++ "0AC93C701B001B092E4E5B9F73BCD27B" \ ++ "9EE50D0657C77F374E903CDFA4C642" ) ); ++ ++ if( verbose != 0 ) ++ printf( " MPI test #2 (div_mpi): " ); ++ ++ if( mpi_cmp_mpi( &X, &U ) != 0 || ++ mpi_cmp_mpi( &Y, &V ) != 0 ) ++ { ++ if( verbose != 0 ) ++ printf( "failed\n" ); ++ ++ return( 1 ); ++ } ++ ++ if( verbose != 0 ) ++ printf( "passed\n" ); ++ ++ MPI_CHK( mpi_exp_mod( &X, &A, &E, &N, NULL ) ); ++ ++ MPI_CHK( mpi_read_string( &U, 16, ++ "36E139AEA55215609D2816998ED020BB" \ ++ "BD96C37890F65171D948E9BC7CBAA4D9" \ ++ "325D24D6A3C12710F10A09FA08AB87" ) ); ++ ++ if( verbose != 0 ) ++ printf( " MPI test #3 (exp_mod): " ); ++ ++ if( mpi_cmp_mpi( &X, &U ) != 0 ) ++ { ++ if( verbose != 0 ) ++ printf( "failed\n" ); ++ ++ return( 1 ); ++ } ++ ++ if( verbose != 0 ) ++ printf( "passed\n" ); ++ ++ MPI_CHK( mpi_inv_mod( &X, &A, &N ) ); ++ ++ MPI_CHK( mpi_read_string( &U, 16, ++ "003A0AAEDD7E784FC07D8F9EC6E3BFD5" \ ++ "C3DBA76456363A10869622EAC2DD84EC" \ ++ "C5B8A74DAC4D09E03B5E0BE779F2DF61" ) ); ++ ++ if( verbose != 0 ) ++ printf( " MPI test #4 (inv_mod): " ); ++ ++ if( mpi_cmp_mpi( &X, &U ) != 0 ) ++ { ++ if( verbose != 0 ) ++ printf( "failed\n" ); ++ ++ return( 1 ); ++ } ++ ++ if( verbose != 0 ) ++ printf( "passed\n" ); ++ ++ if( verbose != 0 ) ++ printf( " MPI test #5 (simple gcd): " ); ++ ++ for ( i = 0; i < GCD_PAIR_COUNT; i++) ++ { ++ MPI_CHK( mpi_lset( &X, gcd_pairs[i][0] ) ); ++ MPI_CHK( mpi_lset( &Y, gcd_pairs[i][1] ) ); ++ ++ MPI_CHK( mpi_gcd( &A, &X, &Y ) ); ++ ++ if( mpi_cmp_int( &A, gcd_pairs[i][2] ) != 0 ) ++ { ++ if( verbose != 0 ) ++ printf( "failed at %d\n", i ); ++ ++ return( 1 ); ++ } ++ } ++ ++ if( verbose != 0 ) ++ printf( "passed\n" ); ++ ++cleanup: ++ ++ if( ret != 0 && verbose != 0 ) ++ printf( "Unexpected error, return code = %08X\n", ret ); ++ ++ mpi_free( &V, &U, &Y, &X, &N, &E, &A, NULL ); ++ ++ if( verbose != 0 ) ++ printf( "\n" ); ++ ++ return( ret ); ++} ++ ++#endif ++ ++#endif +diff --git a/feeds/luci/libs/luci-lib-px5g/src/library/havege.c b/feeds/luci/libs/luci-lib-px5g/src/library/havege.c +new file mode 100644 +index 0000000..266299d +--- /dev/null ++++ b/feeds/luci/libs/luci-lib-px5g/src/library/havege.c +@@ -0,0 +1,276 @@ ++/* ++ * HAVEGE: HArdware Volatile Entropy Gathering and Expansion ++ * ++ * Based on XySSL: Copyright (C) 2006-2008 Christophe Devine ++ * ++ * Copyright (C) 2009 Paul Bakker ++ * ++ * All rights reserved. ++ * ++ * Redistribution and use in source and binary forms, with or without ++ * modification, are permitted provided that the following conditions ++ * are met: ++ * ++ * * Redistributions of source code must retain the above copyright ++ * notice, this list of conditions and the following disclaimer. ++ * * 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. ++ * * Neither the names of PolarSSL or XySSL nor the names of its contributors ++ * may be used to endorse or promote products derived from this software ++ * without specific prior written permission. ++ * ++ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ++ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT ++ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS ++ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT ++ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, ++ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED ++ * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR ++ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF ++ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING ++ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS ++ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ++ */ ++/* ++ * The HAVEGE RNG was designed by Andre Seznec in 2002. ++ * ++ * http://www.irisa.fr/caps/projects/hipsor/publi.php ++ * ++ * Contact: seznec(at)irisa_dot_fr - orocheco(at)irisa_dot_fr ++ */ ++ ++#include ++#include ++ ++#include "polarssl/config.h" ++ ++#if defined(POLARSSL_HAVEGE_C) ++ ++#include "polarssl/havege.h" ++#include "polarssl/timing.h" ++ ++/* ------------------------------------------------------------------------ ++ * On average, one iteration accesses two 8-word blocks in the havege WALK ++ * table, and generates 16 words in the RES array. ++ * ++ * The data read in the WALK table is updated and permuted after each use. ++ * The result of the hardware clock counter read is used for this update. ++ * ++ * 25 conditional tests are present. The conditional tests are grouped in ++ * two nested groups of 12 conditional tests and 1 test that controls the ++ * permutation; on average, there should be 6 tests executed and 3 of them ++ * should be mispredicted. ++ * ------------------------------------------------------------------------ ++ */ ++ ++#define SWAP(X,Y) { int *T = X; X = Y; Y = T; } ++ ++#define TST1_ENTER if( PTEST & 1 ) { PTEST ^= 3; PTEST >>= 1; ++#define TST2_ENTER if( PTEST & 1 ) { PTEST ^= 3; PTEST >>= 1; ++ ++#define TST1_LEAVE U1++; } ++#define TST2_LEAVE U2++; } ++ ++#define ONE_ITERATION \ ++ \ ++ PTEST = PT1 >> 20; \ ++ \ ++ TST1_ENTER TST1_ENTER TST1_ENTER TST1_ENTER \ ++ TST1_ENTER TST1_ENTER TST1_ENTER TST1_ENTER \ ++ TST1_ENTER TST1_ENTER TST1_ENTER TST1_ENTER \ ++ \ ++ TST1_LEAVE TST1_LEAVE TST1_LEAVE TST1_LEAVE \ ++ TST1_LEAVE TST1_LEAVE TST1_LEAVE TST1_LEAVE \ ++ TST1_LEAVE TST1_LEAVE TST1_LEAVE TST1_LEAVE \ ++ \ ++ PTX = (PT1 >> 18) & 7; \ ++ PT1 &= 0x1FFF; \ ++ PT2 &= 0x1FFF; \ ++ CLK = (int) hardclock(); \ ++ \ ++ i = 0; \ ++ A = &WALK[PT1 ]; RES[i++] ^= *A; \ ++ B = &WALK[PT2 ]; RES[i++] ^= *B; \ ++ C = &WALK[PT1 ^ 1]; RES[i++] ^= *C; \ ++ D = &WALK[PT2 ^ 4]; RES[i++] ^= *D; \ ++ \ ++ IN = (*A >> (1)) ^ (*A << (31)) ^ CLK; \ ++ *A = (*B >> (2)) ^ (*B << (30)) ^ CLK; \ ++ *B = IN ^ U1; \ ++ *C = (*C >> (3)) ^ (*C << (29)) ^ CLK; \ ++ *D = (*D >> (4)) ^ (*D << (28)) ^ CLK; \ ++ \ ++ A = &WALK[PT1 ^ 2]; RES[i++] ^= *A; \ ++ B = &WALK[PT2 ^ 2]; RES[i++] ^= *B; \ ++ C = &WALK[PT1 ^ 3]; RES[i++] ^= *C; \ ++ D = &WALK[PT2 ^ 6]; RES[i++] ^= *D; \ ++ \ ++ if( PTEST & 1 ) SWAP( A, C ); \ ++ \ ++ IN = (*A >> (5)) ^ (*A << (27)) ^ CLK; \ ++ *A = (*B >> (6)) ^ (*B << (26)) ^ CLK; \ ++ *B = IN; CLK = (int) hardclock(); \ ++ *C = (*C >> (7)) ^ (*C << (25)) ^ CLK; \ ++ *D = (*D >> (8)) ^ (*D << (24)) ^ CLK; \ ++ \ ++ A = &WALK[PT1 ^ 4]; \ ++ B = &WALK[PT2 ^ 1]; \ ++ \ ++ PTEST = PT2 >> 1; \ ++ \ ++ PT2 = (RES[(i - 8) ^ PTY] ^ WALK[PT2 ^ PTY ^ 7]); \ ++ PT2 = ((PT2 & 0x1FFF) & (~8)) ^ ((PT1 ^ 8) & 0x8); \ ++ PTY = (PT2 >> 10) & 7; \ ++ \ ++ TST2_ENTER TST2_ENTER TST2_ENTER TST2_ENTER \ ++ TST2_ENTER TST2_ENTER TST2_ENTER TST2_ENTER \ ++ TST2_ENTER TST2_ENTER TST2_ENTER TST2_ENTER \ ++ \ ++ TST2_LEAVE TST2_LEAVE TST2_LEAVE TST2_LEAVE \ ++ TST2_LEAVE TST2_LEAVE TST2_LEAVE TST2_LEAVE \ ++ TST2_LEAVE TST2_LEAVE TST2_LEAVE TST2_LEAVE \ ++ \ ++ C = &WALK[PT1 ^ 5]; \ ++ D = &WALK[PT2 ^ 5]; \ ++ \ ++ RES[i++] ^= *A; \ ++ RES[i++] ^= *B; \ ++ RES[i++] ^= *C; \ ++ RES[i++] ^= *D; \ ++ \ ++ IN = (*A >> ( 9)) ^ (*A << (23)) ^ CLK; \ ++ *A = (*B >> (10)) ^ (*B << (22)) ^ CLK; \ ++ *B = IN ^ U2; \ ++ *C = (*C >> (11)) ^ (*C << (21)) ^ CLK; \ ++ *D = (*D >> (12)) ^ (*D << (20)) ^ CLK; \ ++ \ ++ A = &WALK[PT1 ^ 6]; RES[i++] ^= *A; \ ++ B = &WALK[PT2 ^ 3]; RES[i++] ^= *B; \ ++ C = &WALK[PT1 ^ 7]; RES[i++] ^= *C; \ ++ D = &WALK[PT2 ^ 7]; RES[i++] ^= *D; \ ++ \ ++ IN = (*A >> (13)) ^ (*A << (19)) ^ CLK; \ ++ *A = (*B >> (14)) ^ (*B << (18)) ^ CLK; \ ++ *B = IN; \ ++ *C = (*C >> (15)) ^ (*C << (17)) ^ CLK; \ ++ *D = (*D >> (16)) ^ (*D << (16)) ^ CLK; \ ++ \ ++ PT1 = ( RES[(i - 8) ^ PTX] ^ \ ++ WALK[PT1 ^ PTX ^ 7] ) & (~1); \ ++ PT1 ^= (PT2 ^ 0x10) & 0x10; \ ++ \ ++ for( n++, i = 0; i < 16; i++ ) \ ++ hs->pool[n % COLLECT_SIZE] ^= RES[i]; ++ ++/* ++ * Entropy gathering function ++ */ ++static void havege_fill( havege_state *hs ) ++{ ++ int i, n = 0; ++ int U1, U2, *A, *B, *C, *D; ++ int PT1, PT2, *WALK, RES[16]; ++ int PTX, PTY, CLK, PTEST, IN; ++ ++ WALK = hs->WALK; ++ PT1 = hs->PT1; ++ PT2 = hs->PT2; ++ ++ PTX = U1 = 0; ++ PTY = U2 = 0; ++ ++ memset( RES, 0, sizeof( RES ) ); ++ ++ while( n < COLLECT_SIZE * 4 ) ++ { ++ ONE_ITERATION ++ ONE_ITERATION ++ ONE_ITERATION ++ ONE_ITERATION ++ } ++ ++ hs->PT1 = PT1; ++ hs->PT2 = PT2; ++ ++ hs->offset[0] = 0; ++ hs->offset[1] = COLLECT_SIZE / 2; ++} ++ ++/* ++ * HAVEGE initialization ++ */ ++void havege_init( havege_state *hs ) ++{ ++ memset( hs, 0, sizeof( havege_state ) ); ++ ++ havege_fill( hs ); ++} ++ ++/* ++ * HAVEGE rand function ++ */ ++int havege_rand( void *p_rng ) ++{ ++ int ret; ++ havege_state *hs = (havege_state *) p_rng; ++ ++ if( hs->offset[1] >= COLLECT_SIZE ) ++ havege_fill( hs ); ++ ++ ret = hs->pool[hs->offset[0]++]; ++ ret ^= hs->pool[hs->offset[1]++]; ++ ++ return( ret ); ++} ++ ++#if defined(POLARSSL_RAND_TEST) ++ ++#include ++ ++int main( int argc, char *argv[] ) ++{ ++ FILE *f; ++ time_t t; ++ int i, j, k; ++ havege_state hs; ++ unsigned char buf[1024]; ++ ++ if( argc < 2 ) ++ { ++ fprintf( stderr, "usage: %s \n", argv[0] ); ++ return( 1 ); ++ } ++ ++ if( ( f = fopen( argv[1], "wb+" ) ) == NULL ) ++ { ++ printf( "failed to open '%s' for writing.\n", argv[0] ); ++ return( 1 ); ++ } ++ ++ havege_init( &hs ); ++ ++ t = time( NULL ); ++ ++ for( i = 0, k = 32768; i < k; i++ ) ++ { ++ for( j = 0; j < sizeof( buf ); j++ ) ++ buf[j] = havege_rand( &hs ); ++ ++ fwrite( buf, sizeof( buf ), 1, f ); ++ ++ printf( "Generating 32Mb of data in file '%s'... %04.1f" \ ++ "%% done\r", argv[1], (100 * (float) (i + 1)) / k ); ++ fflush( stdout ); ++ } ++ ++ if( t == time( NULL ) ) ++ t--; ++ ++ fclose( f ); ++ return( 0 ); ++} ++ ++#endif ++ ++#endif +diff --git a/feeds/luci/libs/luci-lib-px5g/src/library/rsa.c b/feeds/luci/libs/luci-lib-px5g/src/library/rsa.c +new file mode 100644 +index 0000000..131b6c6 +--- /dev/null ++++ b/feeds/luci/libs/luci-lib-px5g/src/library/rsa.c +@@ -0,0 +1,750 @@ ++/* ++ * The RSA public-key cryptosystem ++ * ++ * Based on XySSL: Copyright (C) 2006-2008 Christophe Devine ++ * ++ * Copyright (C) 2009 Paul Bakker ++ * ++ * All rights reserved. ++ * ++ * Redistribution and use in source and binary forms, with or without ++ * modification, are permitted provided that the following conditions ++ * are met: ++ * ++ * * Redistributions of source code must retain the above copyright ++ * notice, this list of conditions and the following disclaimer. ++ * * 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. ++ * * Neither the names of PolarSSL or XySSL nor the names of its contributors ++ * may be used to endorse or promote products derived from this software ++ * without specific prior written permission. ++ * ++ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ++ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT ++ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS ++ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT ++ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, ++ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED ++ * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR ++ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF ++ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING ++ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS ++ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ++ */ ++/* ++ * RSA was designed by Ron Rivest, Adi Shamir and Len Adleman. ++ * ++ * http://theory.lcs.mit.edu/~rivest/rsapaper.pdf ++ * http://www.cacr.math.uwaterloo.ca/hac/about/chap8.pdf ++ */ ++ ++#include "polarssl/config.h" ++ ++#if defined(POLARSSL_RSA_C) ++ ++#include "polarssl/rsa.h" ++ ++#include ++#include ++#include ++ ++/* ++ * Initialize an RSA context ++ */ ++void rsa_init( rsa_context *ctx, ++ int padding, ++ int hash_id, ++ int (*f_rng)(void *), ++ void *p_rng ) ++{ ++ memset( ctx, 0, sizeof( rsa_context ) ); ++ ++ ctx->padding = padding; ++ ctx->hash_id = hash_id; ++ ++ ctx->f_rng = f_rng; ++ ctx->p_rng = p_rng; ++} ++ ++#if defined(POLARSSL_GENPRIME) ++ ++/* ++ * Generate an RSA keypair ++ */ ++int rsa_gen_key( rsa_context *ctx, int nbits, int exponent ) ++{ ++ int ret; ++ mpi P1, Q1, H, G; ++ ++ if( ctx->f_rng == NULL || nbits < 128 || exponent < 3 ) ++ return( POLARSSL_ERR_RSA_BAD_INPUT_DATA ); ++ ++ mpi_init( &P1, &Q1, &H, &G, NULL ); ++ ++ /* ++ * find primes P and Q with Q < P so that: ++ * GCD( E, (P-1)*(Q-1) ) == 1 ++ */ ++ MPI_CHK( mpi_lset( &ctx->E, exponent ) ); ++ ++ do ++ { ++ MPI_CHK( mpi_gen_prime( &ctx->P, ( nbits + 1 ) >> 1, 0, ++ ctx->f_rng, ctx->p_rng ) ); ++ ++ MPI_CHK( mpi_gen_prime( &ctx->Q, ( nbits + 1 ) >> 1, 0, ++ ctx->f_rng, ctx->p_rng ) ); ++ ++ if( mpi_cmp_mpi( &ctx->P, &ctx->Q ) < 0 ) ++ mpi_swap( &ctx->P, &ctx->Q ); ++ ++ if( mpi_cmp_mpi( &ctx->P, &ctx->Q ) == 0 ) ++ continue; ++ ++ MPI_CHK( mpi_mul_mpi( &ctx->N, &ctx->P, &ctx->Q ) ); ++ if( mpi_msb( &ctx->N ) != nbits ) ++ continue; ++ ++ MPI_CHK( mpi_sub_int( &P1, &ctx->P, 1 ) ); ++ MPI_CHK( mpi_sub_int( &Q1, &ctx->Q, 1 ) ); ++ MPI_CHK( mpi_mul_mpi( &H, &P1, &Q1 ) ); ++ MPI_CHK( mpi_gcd( &G, &ctx->E, &H ) ); ++ } ++ while( mpi_cmp_int( &G, 1 ) != 0 ); ++ ++ /* ++ * D = E^-1 mod ((P-1)*(Q-1)) ++ * DP = D mod (P - 1) ++ * DQ = D mod (Q - 1) ++ * QP = Q^-1 mod P ++ */ ++ MPI_CHK( mpi_inv_mod( &ctx->D , &ctx->E, &H ) ); ++ MPI_CHK( mpi_mod_mpi( &ctx->DP, &ctx->D, &P1 ) ); ++ MPI_CHK( mpi_mod_mpi( &ctx->DQ, &ctx->D, &Q1 ) ); ++ MPI_CHK( mpi_inv_mod( &ctx->QP, &ctx->Q, &ctx->P ) ); ++ ++ ctx->len = ( mpi_msb( &ctx->N ) + 7 ) >> 3; ++ ++cleanup: ++ ++ mpi_free( &G, &H, &Q1, &P1, NULL ); ++ ++ if( ret != 0 ) ++ { ++ rsa_free( ctx ); ++ return( POLARSSL_ERR_RSA_KEY_GEN_FAILED | ret ); ++ } ++ ++ return( 0 ); ++} ++ ++#endif ++ ++/* ++ * Check a public RSA key ++ */ ++int rsa_check_pubkey( rsa_context *ctx ) ++{ ++ if( ( ctx->N.p[0] & 1 ) == 0 || ++ ( ctx->E.p[0] & 1 ) == 0 ) ++ return( POLARSSL_ERR_RSA_KEY_CHECK_FAILED ); ++ ++ if( mpi_msb( &ctx->N ) < 128 || ++ mpi_msb( &ctx->N ) > 4096 ) ++ return( POLARSSL_ERR_RSA_KEY_CHECK_FAILED ); ++ ++ if( mpi_msb( &ctx->E ) < 2 || ++ mpi_msb( &ctx->E ) > 64 ) ++ return( POLARSSL_ERR_RSA_KEY_CHECK_FAILED ); ++ ++ return( 0 ); ++} ++ ++/* ++ * Check a private RSA key ++ */ ++int rsa_check_privkey( rsa_context *ctx ) ++{ ++ int ret; ++ mpi PQ, DE, P1, Q1, H, I, G; ++ ++ if( ( ret = rsa_check_pubkey( ctx ) ) != 0 ) ++ return( ret ); ++ ++ mpi_init( &PQ, &DE, &P1, &Q1, &H, &I, &G, NULL ); ++ ++ MPI_CHK( mpi_mul_mpi( &PQ, &ctx->P, &ctx->Q ) ); ++ MPI_CHK( mpi_mul_mpi( &DE, &ctx->D, &ctx->E ) ); ++ MPI_CHK( mpi_sub_int( &P1, &ctx->P, 1 ) ); ++ MPI_CHK( mpi_sub_int( &Q1, &ctx->Q, 1 ) ); ++ MPI_CHK( mpi_mul_mpi( &H, &P1, &Q1 ) ); ++ MPI_CHK( mpi_mod_mpi( &I, &DE, &H ) ); ++ MPI_CHK( mpi_gcd( &G, &ctx->E, &H ) ); ++ ++ if( mpi_cmp_mpi( &PQ, &ctx->N ) == 0 && ++ mpi_cmp_int( &I, 1 ) == 0 && ++ mpi_cmp_int( &G, 1 ) == 0 ) ++ { ++ mpi_free( &G, &I, &H, &Q1, &P1, &DE, &PQ, NULL ); ++ return( 0 ); ++ } ++ ++cleanup: ++ ++ mpi_free( &G, &I, &H, &Q1, &P1, &DE, &PQ, NULL ); ++ return( POLARSSL_ERR_RSA_KEY_CHECK_FAILED | ret ); ++} ++ ++/* ++ * Do an RSA public key operation ++ */ ++int rsa_public( rsa_context *ctx, ++ unsigned char *input, ++ unsigned char *output ) ++{ ++ int ret, olen; ++ mpi T; ++ ++ mpi_init( &T, NULL ); ++ ++ MPI_CHK( mpi_read_binary( &T, input, ctx->len ) ); ++ ++ if( mpi_cmp_mpi( &T, &ctx->N ) >= 0 ) ++ { ++ mpi_free( &T, NULL ); ++ return( POLARSSL_ERR_RSA_BAD_INPUT_DATA ); ++ } ++ ++ olen = ctx->len; ++ MPI_CHK( mpi_exp_mod( &T, &T, &ctx->E, &ctx->N, &ctx->RN ) ); ++ MPI_CHK( mpi_write_binary( &T, output, olen ) ); ++ ++cleanup: ++ ++ mpi_free( &T, NULL ); ++ ++ if( ret != 0 ) ++ return( POLARSSL_ERR_RSA_PUBLIC_FAILED | ret ); ++ ++ return( 0 ); ++} ++ ++/* ++ * Do an RSA private key operation ++ */ ++int rsa_private( rsa_context *ctx, ++ unsigned char *input, ++ unsigned char *output ) ++{ ++ int ret, olen; ++ mpi T, T1, T2; ++ ++ mpi_init( &T, &T1, &T2, NULL ); ++ ++ MPI_CHK( mpi_read_binary( &T, input, ctx->len ) ); ++ ++ if( mpi_cmp_mpi( &T, &ctx->N ) >= 0 ) ++ { ++ mpi_free( &T, NULL ); ++ return( POLARSSL_ERR_RSA_BAD_INPUT_DATA ); ++ } ++ ++#if 0 ++ MPI_CHK( mpi_exp_mod( &T, &T, &ctx->D, &ctx->N, &ctx->RN ) ); ++#else ++ /* ++ * faster decryption using the CRT ++ * ++ * T1 = input ^ dP mod P ++ * T2 = input ^ dQ mod Q ++ */ ++ MPI_CHK( mpi_exp_mod( &T1, &T, &ctx->DP, &ctx->P, &ctx->RP ) ); ++ MPI_CHK( mpi_exp_mod( &T2, &T, &ctx->DQ, &ctx->Q, &ctx->RQ ) ); ++ ++ /* ++ * T = (T1 - T2) * (Q^-1 mod P) mod P ++ */ ++ MPI_CHK( mpi_sub_mpi( &T, &T1, &T2 ) ); ++ MPI_CHK( mpi_mul_mpi( &T1, &T, &ctx->QP ) ); ++ MPI_CHK( mpi_mod_mpi( &T, &T1, &ctx->P ) ); ++ ++ /* ++ * output = T2 + T * Q ++ */ ++ MPI_CHK( mpi_mul_mpi( &T1, &T, &ctx->Q ) ); ++ MPI_CHK( mpi_add_mpi( &T, &T2, &T1 ) ); ++#endif ++ ++ olen = ctx->len; ++ MPI_CHK( mpi_write_binary( &T, output, olen ) ); ++ ++cleanup: ++ ++ mpi_free( &T, &T1, &T2, NULL ); ++ ++ if( ret != 0 ) ++ return( POLARSSL_ERR_RSA_PRIVATE_FAILED | ret ); ++ ++ return( 0 ); ++} ++ ++/* ++ * Add the message padding, then do an RSA operation ++ */ ++int rsa_pkcs1_encrypt( rsa_context *ctx, ++ int mode, int ilen, ++ unsigned char *input, ++ unsigned char *output ) ++{ ++ int nb_pad, olen; ++ unsigned char *p = output; ++ ++ olen = ctx->len; ++ ++ switch( ctx->padding ) ++ { ++ case RSA_PKCS_V15: ++ ++ if( ilen < 0 || olen < ilen + 11 ) ++ return( POLARSSL_ERR_RSA_BAD_INPUT_DATA ); ++ ++ nb_pad = olen - 3 - ilen; ++ ++ *p++ = 0; ++ *p++ = RSA_CRYPT; ++ ++ while( nb_pad-- > 0 ) ++ { ++ do { ++ *p = (unsigned char) rand(); ++ } while( *p == 0 ); ++ p++; ++ } ++ *p++ = 0; ++ memcpy( p, input, ilen ); ++ break; ++ ++ default: ++ ++ return( POLARSSL_ERR_RSA_INVALID_PADDING ); ++ } ++ ++ return( ( mode == RSA_PUBLIC ) ++ ? rsa_public( ctx, output, output ) ++ : rsa_private( ctx, output, output ) ); ++} ++ ++/* ++ * Do an RSA operation, then remove the message padding ++ */ ++int rsa_pkcs1_decrypt( rsa_context *ctx, ++ int mode, int *olen, ++ unsigned char *input, ++ unsigned char *output, ++ int output_max_len) ++{ ++ int ret, ilen; ++ unsigned char *p; ++ unsigned char buf[512]; ++ ++ ilen = ctx->len; ++ ++ if( ilen < 16 || ilen > (int) sizeof( buf ) ) ++ return( POLARSSL_ERR_RSA_BAD_INPUT_DATA ); ++ ++ ret = ( mode == RSA_PUBLIC ) ++ ? rsa_public( ctx, input, buf ) ++ : rsa_private( ctx, input, buf ); ++ ++ if( ret != 0 ) ++ return( ret ); ++ ++ p = buf; ++ ++ switch( ctx->padding ) ++ { ++ case RSA_PKCS_V15: ++ ++ if( *p++ != 0 || *p++ != RSA_CRYPT ) ++ return( POLARSSL_ERR_RSA_INVALID_PADDING ); ++ ++ while( *p != 0 ) ++ { ++ if( p >= buf + ilen - 1 ) ++ return( POLARSSL_ERR_RSA_INVALID_PADDING ); ++ p++; ++ } ++ p++; ++ break; ++ ++ default: ++ ++ return( POLARSSL_ERR_RSA_INVALID_PADDING ); ++ } ++ ++ if (ilen - (int)(p - buf) > output_max_len) ++ return( POLARSSL_ERR_RSA_OUTPUT_TO_LARGE ); ++ ++ *olen = ilen - (int)(p - buf); ++ memcpy( output, p, *olen ); ++ ++ return( 0 ); ++} ++ ++/* ++ * Do an RSA operation to sign the message digest ++ */ ++int rsa_pkcs1_sign( rsa_context *ctx, ++ int mode, ++ int hash_id, ++ int hashlen, ++ unsigned char *hash, ++ unsigned char *sig ) ++{ ++ int nb_pad, olen; ++ unsigned char *p = sig; ++ ++ olen = ctx->len; ++ ++ switch( ctx->padding ) ++ { ++ case RSA_PKCS_V15: ++ ++ switch( hash_id ) ++ { ++ case RSA_RAW: ++ nb_pad = olen - 3 - hashlen; ++ break; ++ ++ case RSA_MD2: ++ case RSA_MD4: ++ case RSA_MD5: ++ nb_pad = olen - 3 - 34; ++ break; ++ ++ case RSA_SHA1: ++ nb_pad = olen - 3 - 35; ++ break; ++ ++ default: ++ return( POLARSSL_ERR_RSA_BAD_INPUT_DATA ); ++ } ++ ++ if( nb_pad < 8 ) ++ return( POLARSSL_ERR_RSA_BAD_INPUT_DATA ); ++ ++ *p++ = 0; ++ *p++ = RSA_SIGN; ++ memset( p, 0xFF, nb_pad ); ++ p += nb_pad; ++ *p++ = 0; ++ break; ++ ++ default: ++ ++ return( POLARSSL_ERR_RSA_INVALID_PADDING ); ++ } ++ ++ switch( hash_id ) ++ { ++ case RSA_RAW: ++ memcpy( p, hash, hashlen ); ++ break; ++ ++ case RSA_MD2: ++ memcpy( p, ASN1_HASH_MDX, 18 ); ++ memcpy( p + 18, hash, 16 ); ++ p[13] = 2; break; ++ ++ case RSA_MD4: ++ memcpy( p, ASN1_HASH_MDX, 18 ); ++ memcpy( p + 18, hash, 16 ); ++ p[13] = 4; break; ++ ++ case RSA_MD5: ++ memcpy( p, ASN1_HASH_MDX, 18 ); ++ memcpy( p + 18, hash, 16 ); ++ p[13] = 5; break; ++ ++ case RSA_SHA1: ++ memcpy( p, ASN1_HASH_SHA1, 15 ); ++ memcpy( p + 15, hash, 20 ); ++ break; ++ ++ default: ++ return( POLARSSL_ERR_RSA_BAD_INPUT_DATA ); ++ } ++ ++ return( ( mode == RSA_PUBLIC ) ++ ? rsa_public( ctx, sig, sig ) ++ : rsa_private( ctx, sig, sig ) ); ++} ++ ++/* ++ * Do an RSA operation and check the message digest ++ */ ++int rsa_pkcs1_verify( rsa_context *ctx, ++ int mode, ++ int hash_id, ++ int hashlen, ++ unsigned char *hash, ++ unsigned char *sig ) ++{ ++ int ret, len, siglen; ++ unsigned char *p, c; ++ unsigned char buf[512]; ++ ++ siglen = ctx->len; ++ ++ if( siglen < 16 || siglen > (int) sizeof( buf ) ) ++ return( POLARSSL_ERR_RSA_BAD_INPUT_DATA ); ++ ++ ret = ( mode == RSA_PUBLIC ) ++ ? rsa_public( ctx, sig, buf ) ++ : rsa_private( ctx, sig, buf ); ++ ++ if( ret != 0 ) ++ return( ret ); ++ ++ p = buf; ++ ++ switch( ctx->padding ) ++ { ++ case RSA_PKCS_V15: ++ ++ if( *p++ != 0 || *p++ != RSA_SIGN ) ++ return( POLARSSL_ERR_RSA_INVALID_PADDING ); ++ ++ while( *p != 0 ) ++ { ++ if( p >= buf + siglen - 1 || *p != 0xFF ) ++ return( POLARSSL_ERR_RSA_INVALID_PADDING ); ++ p++; ++ } ++ p++; ++ break; ++ ++ default: ++ ++ return( POLARSSL_ERR_RSA_INVALID_PADDING ); ++ } ++ ++ len = siglen - (int)( p - buf ); ++ ++ if( len == 34 ) ++ { ++ c = p[13]; ++ p[13] = 0; ++ ++ if( memcmp( p, ASN1_HASH_MDX, 18 ) != 0 ) ++ return( POLARSSL_ERR_RSA_VERIFY_FAILED ); ++ ++ if( ( c == 2 && hash_id == RSA_MD2 ) || ++ ( c == 4 && hash_id == RSA_MD4 ) || ++ ( c == 5 && hash_id == RSA_MD5 ) ) ++ { ++ if( memcmp( p + 18, hash, 16 ) == 0 ) ++ return( 0 ); ++ else ++ return( POLARSSL_ERR_RSA_VERIFY_FAILED ); ++ } ++ } ++ ++ if( len == 35 && hash_id == RSA_SHA1 ) ++ { ++ if( memcmp( p, ASN1_HASH_SHA1, 15 ) == 0 && ++ memcmp( p + 15, hash, 20 ) == 0 ) ++ return( 0 ); ++ else ++ return( POLARSSL_ERR_RSA_VERIFY_FAILED ); ++ } ++ ++ if( len == hashlen && hash_id == RSA_RAW ) ++ { ++ if( memcmp( p, hash, hashlen ) == 0 ) ++ return( 0 ); ++ else ++ return( POLARSSL_ERR_RSA_VERIFY_FAILED ); ++ } ++ ++ return( POLARSSL_ERR_RSA_INVALID_PADDING ); ++} ++ ++/* ++ * Free the components of an RSA key ++ */ ++void rsa_free( rsa_context *ctx ) ++{ ++ mpi_free( &ctx->RQ, &ctx->RP, &ctx->RN, ++ &ctx->QP, &ctx->DQ, &ctx->DP, ++ &ctx->Q, &ctx->P, &ctx->D, ++ &ctx->E, &ctx->N, NULL ); ++} ++ ++#if defined(POLARSSL_SELF_TEST) ++ ++#include "polarssl/sha1.h" ++ ++/* ++ * Example RSA-1024 keypair, for test purposes ++ */ ++#define KEY_LEN 128 ++ ++#define RSA_N "9292758453063D803DD603D5E777D788" \ ++ "8ED1D5BF35786190FA2F23EBC0848AEA" \ ++ "DDA92CA6C3D80B32C4D109BE0F36D6AE" \ ++ "7130B9CED7ACDF54CFC7555AC14EEBAB" \ ++ "93A89813FBF3C4F8066D2D800F7C38A8" \ ++ "1AE31942917403FF4946B0A83D3D3E05" \ ++ "EE57C6F5F5606FB5D4BC6CD34EE0801A" \ ++ "5E94BB77B07507233A0BC7BAC8F90F79" ++ ++#define RSA_E "10001" ++ ++#define RSA_D "24BF6185468786FDD303083D25E64EFC" \ ++ "66CA472BC44D253102F8B4A9D3BFA750" \ ++ "91386C0077937FE33FA3252D28855837" \ ++ "AE1B484A8A9A45F7EE8C0C634F99E8CD" \ ++ "DF79C5CE07EE72C7F123142198164234" \ ++ "CABB724CF78B8173B9F880FC86322407" \ ++ "AF1FEDFDDE2BEB674CA15F3E81A1521E" \ ++ "071513A1E85B5DFA031F21ECAE91A34D" ++ ++#define RSA_P "C36D0EB7FCD285223CFB5AABA5BDA3D8" \ ++ "2C01CAD19EA484A87EA4377637E75500" \ ++ "FCB2005C5C7DD6EC4AC023CDA285D796" \ ++ "C3D9E75E1EFC42488BB4F1D13AC30A57" ++ ++#define RSA_Q "C000DF51A7C77AE8D7C7370C1FF55B69" \ ++ "E211C2B9E5DB1ED0BF61D0D9899620F4" \ ++ "910E4168387E3C30AA1E00C339A79508" \ ++ "8452DD96A9A5EA5D9DCA68DA636032AF" ++ ++#define RSA_DP "C1ACF567564274FB07A0BBAD5D26E298" \ ++ "3C94D22288ACD763FD8E5600ED4A702D" \ ++ "F84198A5F06C2E72236AE490C93F07F8" \ ++ "3CC559CD27BC2D1CA488811730BB5725" ++ ++#define RSA_DQ "4959CBF6F8FEF750AEE6977C155579C7" \ ++ "D8AAEA56749EA28623272E4F7D0592AF" \ ++ "7C1F1313CAC9471B5C523BFE592F517B" \ ++ "407A1BD76C164B93DA2D32A383E58357" ++ ++#define RSA_QP "9AE7FBC99546432DF71896FC239EADAE" \ ++ "F38D18D2B2F0E2DD275AA977E2BF4411" \ ++ "F5A3B2A5D33605AEBBCCBA7FEB9F2D2F" \ ++ "A74206CEC169D74BF5A8C50D6F48EA08" ++ ++#define PT_LEN 24 ++#define RSA_PT "\xAA\xBB\xCC\x03\x02\x01\x00\xFF\xFF\xFF\xFF\xFF" \ ++ "\x11\x22\x33\x0A\x0B\x0C\xCC\xDD\xDD\xDD\xDD\xDD" ++ ++/* ++ * Checkup routine ++ */ ++int rsa_self_test( int verbose ) ++{ ++ int len; ++ rsa_context rsa; ++ unsigned char sha1sum[20]; ++ unsigned char rsa_plaintext[PT_LEN]; ++ unsigned char rsa_decrypted[PT_LEN]; ++ unsigned char rsa_ciphertext[KEY_LEN]; ++ ++ memset( &rsa, 0, sizeof( rsa_context ) ); ++ ++ rsa.len = KEY_LEN; ++ mpi_read_string( &rsa.N , 16, RSA_N ); ++ mpi_read_string( &rsa.E , 16, RSA_E ); ++ mpi_read_string( &rsa.D , 16, RSA_D ); ++ mpi_read_string( &rsa.P , 16, RSA_P ); ++ mpi_read_string( &rsa.Q , 16, RSA_Q ); ++ mpi_read_string( &rsa.DP, 16, RSA_DP ); ++ mpi_read_string( &rsa.DQ, 16, RSA_DQ ); ++ mpi_read_string( &rsa.QP, 16, RSA_QP ); ++ ++ if( verbose != 0 ) ++ printf( " RSA key validation: " ); ++ ++ if( rsa_check_pubkey( &rsa ) != 0 || ++ rsa_check_privkey( &rsa ) != 0 ) ++ { ++ if( verbose != 0 ) ++ printf( "failed\n" ); ++ ++ return( 1 ); ++ } ++ ++ if( verbose != 0 ) ++ printf( "passed\n PKCS#1 encryption : " ); ++ ++ memcpy( rsa_plaintext, RSA_PT, PT_LEN ); ++ ++ if( rsa_pkcs1_encrypt( &rsa, RSA_PUBLIC, PT_LEN, ++ rsa_plaintext, rsa_ciphertext ) != 0 ) ++ { ++ if( verbose != 0 ) ++ printf( "failed\n" ); ++ ++ return( 1 ); ++ } ++ ++ if( verbose != 0 ) ++ printf( "passed\n PKCS#1 decryption : " ); ++ ++ if( rsa_pkcs1_decrypt( &rsa, RSA_PRIVATE, &len, ++ rsa_ciphertext, rsa_decrypted, ++ sizeof(rsa_decrypted) ) != 0 ) ++ { ++ if( verbose != 0 ) ++ printf( "failed\n" ); ++ ++ return( 1 ); ++ } ++ ++ if( memcmp( rsa_decrypted, rsa_plaintext, len ) != 0 ) ++ { ++ if( verbose != 0 ) ++ printf( "failed\n" ); ++ ++ return( 1 ); ++ } ++ ++ if( verbose != 0 ) ++ printf( "passed\n PKCS#1 data sign : " ); ++ ++ sha1( rsa_plaintext, PT_LEN, sha1sum ); ++ ++ if( rsa_pkcs1_sign( &rsa, RSA_PRIVATE, RSA_SHA1, 20, ++ sha1sum, rsa_ciphertext ) != 0 ) ++ { ++ if( verbose != 0 ) ++ printf( "failed\n" ); ++ ++ return( 1 ); ++ } ++ ++ if( verbose != 0 ) ++ printf( "passed\n PKCS#1 sig. verify: " ); ++ ++ if( rsa_pkcs1_verify( &rsa, RSA_PUBLIC, RSA_SHA1, 20, ++ sha1sum, rsa_ciphertext ) != 0 ) ++ { ++ if( verbose != 0 ) ++ printf( "failed\n" ); ++ ++ return( 1 ); ++ } ++ ++ if( verbose != 0 ) ++ printf( "passed\n\n" ); ++ ++ rsa_free( &rsa ); ++ ++ return( 0 ); ++} ++ ++#endif ++ ++#endif +diff --git a/feeds/luci/libs/luci-lib-px5g/src/library/sha1.c b/feeds/luci/libs/luci-lib-px5g/src/library/sha1.c +new file mode 100644 +index 0000000..54a4416 +--- /dev/null ++++ b/feeds/luci/libs/luci-lib-px5g/src/library/sha1.c +@@ -0,0 +1,622 @@ ++/* ++ * FIPS-180-1 compliant SHA-1 implementation ++ * ++ * Based on XySSL: Copyright (C) 2006-2008 Christophe Devine ++ * ++ * Copyright (C) 2009 Paul Bakker ++ * ++ * All rights reserved. ++ * ++ * Redistribution and use in source and binary forms, with or without ++ * modification, are permitted provided that the following conditions ++ * are met: ++ * ++ * * Redistributions of source code must retain the above copyright ++ * notice, this list of conditions and the following disclaimer. ++ * * 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. ++ * * Neither the names of PolarSSL or XySSL nor the names of its contributors ++ * may be used to endorse or promote products derived from this software ++ * without specific prior written permission. ++ * ++ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ++ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT ++ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS ++ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT ++ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, ++ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED ++ * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR ++ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF ++ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING ++ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS ++ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ++ */ ++/* ++ * The SHA-1 standard was published by NIST in 1993. ++ * ++ * http://www.itl.nist.gov/fipspubs/fip180-1.htm ++ */ ++ ++#include "polarssl/config.h" ++ ++#if defined(POLARSSL_SHA1_C) ++ ++#include "polarssl/sha1.h" ++ ++#include ++#include ++ ++/* ++ * 32-bit integer manipulation macros (big endian) ++ */ ++#ifndef GET_ULONG_BE ++#define GET_ULONG_BE(n,b,i) \ ++{ \ ++ (n) = ( (unsigned long) (b)[(i) ] << 24 ) \ ++ | ( (unsigned long) (b)[(i) + 1] << 16 ) \ ++ | ( (unsigned long) (b)[(i) + 2] << 8 ) \ ++ | ( (unsigned long) (b)[(i) + 3] ); \ ++} ++#endif ++ ++#ifndef PUT_ULONG_BE ++#define PUT_ULONG_BE(n,b,i) \ ++{ \ ++ (b)[(i) ] = (unsigned char) ( (n) >> 24 ); \ ++ (b)[(i) + 1] = (unsigned char) ( (n) >> 16 ); \ ++ (b)[(i) + 2] = (unsigned char) ( (n) >> 8 ); \ ++ (b)[(i) + 3] = (unsigned char) ( (n) ); \ ++} ++#endif ++ ++/* ++ * SHA-1 context setup ++ */ ++void sha1_starts( sha1_context *ctx ) ++{ ++ ctx->total[0] = 0; ++ ctx->total[1] = 0; ++ ++ ctx->state[0] = 0x67452301; ++ ctx->state[1] = 0xEFCDAB89; ++ ctx->state[2] = 0x98BADCFE; ++ ctx->state[3] = 0x10325476; ++ ctx->state[4] = 0xC3D2E1F0; ++} ++ ++static void sha1_process( sha1_context *ctx, unsigned char data[64] ) ++{ ++ unsigned long temp, W[16], A, B, C, D, E; ++ ++ GET_ULONG_BE( W[ 0], data, 0 ); ++ GET_ULONG_BE( W[ 1], data, 4 ); ++ GET_ULONG_BE( W[ 2], data, 8 ); ++ GET_ULONG_BE( W[ 3], data, 12 ); ++ GET_ULONG_BE( W[ 4], data, 16 ); ++ GET_ULONG_BE( W[ 5], data, 20 ); ++ GET_ULONG_BE( W[ 6], data, 24 ); ++ GET_ULONG_BE( W[ 7], data, 28 ); ++ GET_ULONG_BE( W[ 8], data, 32 ); ++ GET_ULONG_BE( W[ 9], data, 36 ); ++ GET_ULONG_BE( W[10], data, 40 ); ++ GET_ULONG_BE( W[11], data, 44 ); ++ GET_ULONG_BE( W[12], data, 48 ); ++ GET_ULONG_BE( W[13], data, 52 ); ++ GET_ULONG_BE( W[14], data, 56 ); ++ GET_ULONG_BE( W[15], data, 60 ); ++ ++#define S(x,n) ((x << n) | ((x & 0xFFFFFFFF) >> (32 - n))) ++ ++#define R(t) \ ++( \ ++ temp = W[(t - 3) & 0x0F] ^ W[(t - 8) & 0x0F] ^ \ ++ W[(t - 14) & 0x0F] ^ W[ t & 0x0F], \ ++ ( W[t & 0x0F] = S(temp,1) ) \ ++) ++ ++#define P(a,b,c,d,e,x) \ ++{ \ ++ e += S(a,5) + F(b,c,d) + K + x; b = S(b,30); \ ++} ++ ++ A = ctx->state[0]; ++ B = ctx->state[1]; ++ C = ctx->state[2]; ++ D = ctx->state[3]; ++ E = ctx->state[4]; ++ ++#define F(x,y,z) (z ^ (x & (y ^ z))) ++#define K 0x5A827999 ++ ++ P( A, B, C, D, E, W[0] ); ++ P( E, A, B, C, D, W[1] ); ++ P( D, E, A, B, C, W[2] ); ++ P( C, D, E, A, B, W[3] ); ++ P( B, C, D, E, A, W[4] ); ++ P( A, B, C, D, E, W[5] ); ++ P( E, A, B, C, D, W[6] ); ++ P( D, E, A, B, C, W[7] ); ++ P( C, D, E, A, B, W[8] ); ++ P( B, C, D, E, A, W[9] ); ++ P( A, B, C, D, E, W[10] ); ++ P( E, A, B, C, D, W[11] ); ++ P( D, E, A, B, C, W[12] ); ++ P( C, D, E, A, B, W[13] ); ++ P( B, C, D, E, A, W[14] ); ++ P( A, B, C, D, E, W[15] ); ++ P( E, A, B, C, D, R(16) ); ++ P( D, E, A, B, C, R(17) ); ++ P( C, D, E, A, B, R(18) ); ++ P( B, C, D, E, A, R(19) ); ++ ++#undef K ++#undef F ++ ++#define F(x,y,z) (x ^ y ^ z) ++#define K 0x6ED9EBA1 ++ ++ P( A, B, C, D, E, R(20) ); ++ P( E, A, B, C, D, R(21) ); ++ P( D, E, A, B, C, R(22) ); ++ P( C, D, E, A, B, R(23) ); ++ P( B, C, D, E, A, R(24) ); ++ P( A, B, C, D, E, R(25) ); ++ P( E, A, B, C, D, R(26) ); ++ P( D, E, A, B, C, R(27) ); ++ P( C, D, E, A, B, R(28) ); ++ P( B, C, D, E, A, R(29) ); ++ P( A, B, C, D, E, R(30) ); ++ P( E, A, B, C, D, R(31) ); ++ P( D, E, A, B, C, R(32) ); ++ P( C, D, E, A, B, R(33) ); ++ P( B, C, D, E, A, R(34) ); ++ P( A, B, C, D, E, R(35) ); ++ P( E, A, B, C, D, R(36) ); ++ P( D, E, A, B, C, R(37) ); ++ P( C, D, E, A, B, R(38) ); ++ P( B, C, D, E, A, R(39) ); ++ ++#undef K ++#undef F ++ ++#define F(x,y,z) ((x & y) | (z & (x | y))) ++#define K 0x8F1BBCDC ++ ++ P( A, B, C, D, E, R(40) ); ++ P( E, A, B, C, D, R(41) ); ++ P( D, E, A, B, C, R(42) ); ++ P( C, D, E, A, B, R(43) ); ++ P( B, C, D, E, A, R(44) ); ++ P( A, B, C, D, E, R(45) ); ++ P( E, A, B, C, D, R(46) ); ++ P( D, E, A, B, C, R(47) ); ++ P( C, D, E, A, B, R(48) ); ++ P( B, C, D, E, A, R(49) ); ++ P( A, B, C, D, E, R(50) ); ++ P( E, A, B, C, D, R(51) ); ++ P( D, E, A, B, C, R(52) ); ++ P( C, D, E, A, B, R(53) ); ++ P( B, C, D, E, A, R(54) ); ++ P( A, B, C, D, E, R(55) ); ++ P( E, A, B, C, D, R(56) ); ++ P( D, E, A, B, C, R(57) ); ++ P( C, D, E, A, B, R(58) ); ++ P( B, C, D, E, A, R(59) ); ++ ++#undef K ++#undef F ++ ++#define F(x,y,z) (x ^ y ^ z) ++#define K 0xCA62C1D6 ++ ++ P( A, B, C, D, E, R(60) ); ++ P( E, A, B, C, D, R(61) ); ++ P( D, E, A, B, C, R(62) ); ++ P( C, D, E, A, B, R(63) ); ++ P( B, C, D, E, A, R(64) ); ++ P( A, B, C, D, E, R(65) ); ++ P( E, A, B, C, D, R(66) ); ++ P( D, E, A, B, C, R(67) ); ++ P( C, D, E, A, B, R(68) ); ++ P( B, C, D, E, A, R(69) ); ++ P( A, B, C, D, E, R(70) ); ++ P( E, A, B, C, D, R(71) ); ++ P( D, E, A, B, C, R(72) ); ++ P( C, D, E, A, B, R(73) ); ++ P( B, C, D, E, A, R(74) ); ++ P( A, B, C, D, E, R(75) ); ++ P( E, A, B, C, D, R(76) ); ++ P( D, E, A, B, C, R(77) ); ++ P( C, D, E, A, B, R(78) ); ++ P( B, C, D, E, A, R(79) ); ++ ++#undef K ++#undef F ++ ++ ctx->state[0] += A; ++ ctx->state[1] += B; ++ ctx->state[2] += C; ++ ctx->state[3] += D; ++ ctx->state[4] += E; ++} ++ ++/* ++ * SHA-1 process buffer ++ */ ++void sha1_update( sha1_context *ctx, unsigned char *input, int ilen ) ++{ ++ int fill; ++ unsigned long left; ++ ++ if( ilen <= 0 ) ++ return; ++ ++ left = ctx->total[0] & 0x3F; ++ fill = 64 - left; ++ ++ ctx->total[0] += ilen; ++ ctx->total[0] &= 0xFFFFFFFF; ++ ++ if( ctx->total[0] < (unsigned long) ilen ) ++ ctx->total[1]++; ++ ++ if( left && ilen >= fill ) ++ { ++ memcpy( (void *) (ctx->buffer + left), ++ (void *) input, fill ); ++ sha1_process( ctx, ctx->buffer ); ++ input += fill; ++ ilen -= fill; ++ left = 0; ++ } ++ ++ while( ilen >= 64 ) ++ { ++ sha1_process( ctx, input ); ++ input += 64; ++ ilen -= 64; ++ } ++ ++ if( ilen > 0 ) ++ { ++ memcpy( (void *) (ctx->buffer + left), ++ (void *) input, ilen ); ++ } ++} ++ ++static const unsigned char sha1_padding[64] = ++{ ++ 0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ++}; ++ ++/* ++ * SHA-1 final digest ++ */ ++void sha1_finish( sha1_context *ctx, unsigned char output[20] ) ++{ ++ unsigned long last, padn; ++ unsigned long high, low; ++ unsigned char msglen[8]; ++ ++ high = ( ctx->total[0] >> 29 ) ++ | ( ctx->total[1] << 3 ); ++ low = ( ctx->total[0] << 3 ); ++ ++ PUT_ULONG_BE( high, msglen, 0 ); ++ PUT_ULONG_BE( low, msglen, 4 ); ++ ++ last = ctx->total[0] & 0x3F; ++ padn = ( last < 56 ) ? ( 56 - last ) : ( 120 - last ); ++ ++ sha1_update( ctx, (unsigned char *) sha1_padding, padn ); ++ sha1_update( ctx, msglen, 8 ); ++ ++ PUT_ULONG_BE( ctx->state[0], output, 0 ); ++ PUT_ULONG_BE( ctx->state[1], output, 4 ); ++ PUT_ULONG_BE( ctx->state[2], output, 8 ); ++ PUT_ULONG_BE( ctx->state[3], output, 12 ); ++ PUT_ULONG_BE( ctx->state[4], output, 16 ); ++} ++ ++/* ++ * output = SHA-1( input buffer ) ++ */ ++void sha1( unsigned char *input, int ilen, unsigned char output[20] ) ++{ ++ sha1_context ctx; ++ ++ sha1_starts( &ctx ); ++ sha1_update( &ctx, input, ilen ); ++ sha1_finish( &ctx, output ); ++ ++ memset( &ctx, 0, sizeof( sha1_context ) ); ++} ++ ++/* ++ * output = SHA-1( file contents ) ++ */ ++int sha1_file( char *path, unsigned char output[20] ) ++{ ++ FILE *f; ++ size_t n; ++ sha1_context ctx; ++ unsigned char buf[1024]; ++ ++ if( ( f = fopen( path, "rb" ) ) == NULL ) ++ return( 1 ); ++ ++ sha1_starts( &ctx ); ++ ++ while( ( n = fread( buf, 1, sizeof( buf ), f ) ) > 0 ) ++ sha1_update( &ctx, buf, (int) n ); ++ ++ sha1_finish( &ctx, output ); ++ ++ memset( &ctx, 0, sizeof( sha1_context ) ); ++ ++ if( ferror( f ) != 0 ) ++ { ++ fclose( f ); ++ return( 2 ); ++ } ++ ++ fclose( f ); ++ return( 0 ); ++} ++ ++/* ++ * SHA-1 HMAC context setup ++ */ ++void sha1_hmac_starts( sha1_context *ctx, unsigned char *key, int keylen ) ++{ ++ int i; ++ unsigned char sum[20]; ++ ++ if( keylen > 64 ) ++ { ++ sha1( key, keylen, sum ); ++ keylen = 20; ++ key = sum; ++ } ++ ++ memset( ctx->ipad, 0x36, 64 ); ++ memset( ctx->opad, 0x5C, 64 ); ++ ++ for( i = 0; i < keylen; i++ ) ++ { ++ ctx->ipad[i] = (unsigned char)( ctx->ipad[i] ^ key[i] ); ++ ctx->opad[i] = (unsigned char)( ctx->opad[i] ^ key[i] ); ++ } ++ ++ sha1_starts( ctx ); ++ sha1_update( ctx, ctx->ipad, 64 ); ++ ++ memset( sum, 0, sizeof( sum ) ); ++} ++ ++/* ++ * SHA-1 HMAC process buffer ++ */ ++void sha1_hmac_update( sha1_context *ctx, unsigned char *input, int ilen ) ++{ ++ sha1_update( ctx, input, ilen ); ++} ++ ++/* ++ * SHA-1 HMAC final digest ++ */ ++void sha1_hmac_finish( sha1_context *ctx, unsigned char output[20] ) ++{ ++ unsigned char tmpbuf[20]; ++ ++ sha1_finish( ctx, tmpbuf ); ++ sha1_starts( ctx ); ++ sha1_update( ctx, ctx->opad, 64 ); ++ sha1_update( ctx, tmpbuf, 20 ); ++ sha1_finish( ctx, output ); ++ ++ memset( tmpbuf, 0, sizeof( tmpbuf ) ); ++} ++ ++/* ++ * output = HMAC-SHA-1( hmac key, input buffer ) ++ */ ++void sha1_hmac( unsigned char *key, int keylen, ++ unsigned char *input, int ilen, ++ unsigned char output[20] ) ++{ ++ sha1_context ctx; ++ ++ sha1_hmac_starts( &ctx, key, keylen ); ++ sha1_hmac_update( &ctx, input, ilen ); ++ sha1_hmac_finish( &ctx, output ); ++ ++ memset( &ctx, 0, sizeof( sha1_context ) ); ++} ++ ++#if defined(POLARSSL_SELF_TEST) ++/* ++ * FIPS-180-1 test vectors ++ */ ++static unsigned char sha1_test_buf[3][57] = ++{ ++ { "abc" }, ++ { "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq" }, ++ { "" } ++}; ++ ++static const int sha1_test_buflen[3] = ++{ ++ 3, 56, 1000 ++}; ++ ++static const unsigned char sha1_test_sum[3][20] = ++{ ++ { 0xA9, 0x99, 0x3E, 0x36, 0x47, 0x06, 0x81, 0x6A, 0xBA, 0x3E, ++ 0x25, 0x71, 0x78, 0x50, 0xC2, 0x6C, 0x9C, 0xD0, 0xD8, 0x9D }, ++ { 0x84, 0x98, 0x3E, 0x44, 0x1C, 0x3B, 0xD2, 0x6E, 0xBA, 0xAE, ++ 0x4A, 0xA1, 0xF9, 0x51, 0x29, 0xE5, 0xE5, 0x46, 0x70, 0xF1 }, ++ { 0x34, 0xAA, 0x97, 0x3C, 0xD4, 0xC4, 0xDA, 0xA4, 0xF6, 0x1E, ++ 0xEB, 0x2B, 0xDB, 0xAD, 0x27, 0x31, 0x65, 0x34, 0x01, 0x6F } ++}; ++ ++/* ++ * RFC 2202 test vectors ++ */ ++static unsigned char sha1_hmac_test_key[7][26] = ++{ ++ { "\x0B\x0B\x0B\x0B\x0B\x0B\x0B\x0B\x0B\x0B\x0B\x0B\x0B\x0B\x0B\x0B" ++ "\x0B\x0B\x0B\x0B" }, ++ { "Jefe" }, ++ { "\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA" ++ "\xAA\xAA\xAA\xAA" }, ++ { "\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0A\x0B\x0C\x0D\x0E\x0F\x10" ++ "\x11\x12\x13\x14\x15\x16\x17\x18\x19" }, ++ { "\x0C\x0C\x0C\x0C\x0C\x0C\x0C\x0C\x0C\x0C\x0C\x0C\x0C\x0C\x0C\x0C" ++ "\x0C\x0C\x0C\x0C" }, ++ { "" }, /* 0xAA 80 times */ ++ { "" } ++}; ++ ++static const int sha1_hmac_test_keylen[7] = ++{ ++ 20, 4, 20, 25, 20, 80, 80 ++}; ++ ++static unsigned char sha1_hmac_test_buf[7][74] = ++{ ++ { "Hi There" }, ++ { "what do ya want for nothing?" }, ++ { "\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD" ++ "\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD" ++ "\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD" ++ "\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD" ++ "\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD\xDD" }, ++ { "\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD" ++ "\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD" ++ "\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD" ++ "\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD" ++ "\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD" }, ++ { "Test With Truncation" }, ++ { "Test Using Larger Than Block-Size Key - Hash Key First" }, ++ { "Test Using Larger Than Block-Size Key and Larger" ++ " Than One Block-Size Data" } ++}; ++ ++static const int sha1_hmac_test_buflen[7] = ++{ ++ 8, 28, 50, 50, 20, 54, 73 ++}; ++ ++static const unsigned char sha1_hmac_test_sum[7][20] = ++{ ++ { 0xB6, 0x17, 0x31, 0x86, 0x55, 0x05, 0x72, 0x64, 0xE2, 0x8B, ++ 0xC0, 0xB6, 0xFB, 0x37, 0x8C, 0x8E, 0xF1, 0x46, 0xBE, 0x00 }, ++ { 0xEF, 0xFC, 0xDF, 0x6A, 0xE5, 0xEB, 0x2F, 0xA2, 0xD2, 0x74, ++ 0x16, 0xD5, 0xF1, 0x84, 0xDF, 0x9C, 0x25, 0x9A, 0x7C, 0x79 }, ++ { 0x12, 0x5D, 0x73, 0x42, 0xB9, 0xAC, 0x11, 0xCD, 0x91, 0xA3, ++ 0x9A, 0xF4, 0x8A, 0xA1, 0x7B, 0x4F, 0x63, 0xF1, 0x75, 0xD3 }, ++ { 0x4C, 0x90, 0x07, 0xF4, 0x02, 0x62, 0x50, 0xC6, 0xBC, 0x84, ++ 0x14, 0xF9, 0xBF, 0x50, 0xC8, 0x6C, 0x2D, 0x72, 0x35, 0xDA }, ++ { 0x4C, 0x1A, 0x03, 0x42, 0x4B, 0x55, 0xE0, 0x7F, 0xE7, 0xF2, ++ 0x7B, 0xE1 }, ++ { 0xAA, 0x4A, 0xE5, 0xE1, 0x52, 0x72, 0xD0, 0x0E, 0x95, 0x70, ++ 0x56, 0x37, 0xCE, 0x8A, 0x3B, 0x55, 0xED, 0x40, 0x21, 0x12 }, ++ { 0xE8, 0xE9, 0x9D, 0x0F, 0x45, 0x23, 0x7D, 0x78, 0x6D, 0x6B, ++ 0xBA, 0xA7, 0x96, 0x5C, 0x78, 0x08, 0xBB, 0xFF, 0x1A, 0x91 } ++}; ++ ++/* ++ * Checkup routine ++ */ ++int sha1_self_test( int verbose ) ++{ ++ int i, j, buflen; ++ unsigned char buf[1024]; ++ unsigned char sha1sum[20]; ++ sha1_context ctx; ++ ++ /* ++ * SHA-1 ++ */ ++ for( i = 0; i < 3; i++ ) ++ { ++ if( verbose != 0 ) ++ printf( " SHA-1 test #%d: ", i + 1 ); ++ ++ sha1_starts( &ctx ); ++ ++ if( i == 2 ) ++ { ++ memset( buf, 'a', buflen = 1000 ); ++ ++ for( j = 0; j < 1000; j++ ) ++ sha1_update( &ctx, buf, buflen ); ++ } ++ else ++ sha1_update( &ctx, sha1_test_buf[i], ++ sha1_test_buflen[i] ); ++ ++ sha1_finish( &ctx, sha1sum ); ++ ++ if( memcmp( sha1sum, sha1_test_sum[i], 20 ) != 0 ) ++ { ++ if( verbose != 0 ) ++ printf( "failed\n" ); ++ ++ return( 1 ); ++ } ++ ++ if( verbose != 0 ) ++ printf( "passed\n" ); ++ } ++ ++ if( verbose != 0 ) ++ printf( "\n" ); ++ ++ for( i = 0; i < 7; i++ ) ++ { ++ if( verbose != 0 ) ++ printf( " HMAC-SHA-1 test #%d: ", i + 1 ); ++ ++ if( i == 5 || i == 6 ) ++ { ++ memset( buf, '\xAA', buflen = 80 ); ++ sha1_hmac_starts( &ctx, buf, buflen ); ++ } ++ else ++ sha1_hmac_starts( &ctx, sha1_hmac_test_key[i], ++ sha1_hmac_test_keylen[i] ); ++ ++ sha1_hmac_update( &ctx, sha1_hmac_test_buf[i], ++ sha1_hmac_test_buflen[i] ); ++ ++ sha1_hmac_finish( &ctx, sha1sum ); ++ ++ buflen = ( i == 4 ) ? 12 : 20; ++ ++ if( memcmp( sha1sum, sha1_hmac_test_sum[i], buflen ) != 0 ) ++ { ++ if( verbose != 0 ) ++ printf( "failed\n" ); ++ ++ return( 1 ); ++ } ++ ++ if( verbose != 0 ) ++ printf( "passed\n" ); ++ } ++ ++ if( verbose != 0 ) ++ printf( "\n" ); ++ ++ return( 0 ); ++} ++ ++#endif ++ ++#endif +diff --git a/feeds/luci/libs/luci-lib-px5g/src/library/timing.c b/feeds/luci/libs/luci-lib-px5g/src/library/timing.c +new file mode 100644 +index 0000000..6b7ab74 +--- /dev/null ++++ b/feeds/luci/libs/luci-lib-px5g/src/library/timing.c +@@ -0,0 +1,265 @@ ++/* ++ * Portable interface to the CPU cycle counter ++ * ++ * Based on XySSL: Copyright (C) 2006-2008 Christophe Devine ++ * ++ * Copyright (C) 2009 Paul Bakker ++ * ++ * All rights reserved. ++ * ++ * Redistribution and use in source and binary forms, with or without ++ * modification, are permitted provided that the following conditions ++ * are met: ++ * ++ * * Redistributions of source code must retain the above copyright ++ * notice, this list of conditions and the following disclaimer. ++ * * 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. ++ * * Neither the names of PolarSSL or XySSL nor the names of its contributors ++ * may be used to endorse or promote products derived from this software ++ * without specific prior written permission. ++ * ++ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ++ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT ++ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS ++ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT ++ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, ++ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED ++ * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR ++ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF ++ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING ++ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS ++ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ++ */ ++ ++#include "polarssl/config.h" ++ ++#if defined(POLARSSL_TIMING_C) ++ ++#include "polarssl/timing.h" ++ ++#if defined(WIN32) ++ ++#include ++#include ++ ++struct _hr_time ++{ ++ LARGE_INTEGER start; ++}; ++ ++#else ++ ++#include ++#include ++#include ++#include ++#include ++ ++struct _hr_time ++{ ++ struct timeval start; ++}; ++ ++#endif ++ ++#if (defined(_MSC_VER) && defined(_M_IX86)) || defined(__WATCOMC__) ++ ++unsigned long hardclock( void ) ++{ ++ unsigned long tsc; ++ __asm rdtsc ++ __asm mov [tsc], eax ++ return( tsc ); ++} ++ ++#else ++#if defined(__GNUC__) && defined(__i386__) ++ ++unsigned long hardclock( void ) ++{ ++ unsigned long tsc; ++ asm( "rdtsc" : "=a" (tsc) ); ++ return( tsc ); ++} ++ ++#else ++#if defined(__GNUC__) && (defined(__amd64__) || defined(__x86_64__)) ++ ++unsigned long hardclock( void ) ++{ ++ unsigned long lo, hi; ++ asm( "rdtsc" : "=a" (lo), "=d" (hi) ); ++ return( lo | (hi << 32) ); ++} ++ ++#else ++#if defined(__GNUC__) && (defined(__powerpc__) || defined(__ppc__)) ++ ++unsigned long hardclock( void ) ++{ ++ unsigned long tbl, tbu0, tbu1; ++ ++ do ++ { ++ asm( "mftbu %0" : "=r" (tbu0) ); ++ asm( "mftb %0" : "=r" (tbl ) ); ++ asm( "mftbu %0" : "=r" (tbu1) ); ++ } ++ while( tbu0 != tbu1 ); ++ ++ return( tbl ); ++} ++ ++#else ++#if defined(__GNUC__) && defined(__sparc__) ++ ++unsigned long hardclock( void ) ++{ ++ unsigned long tick; ++ asm( ".byte 0x83, 0x41, 0x00, 0x00" ); ++ asm( "mov %%g1, %0" : "=r" (tick) ); ++ return( tick ); ++} ++ ++#else ++#if defined(__GNUC__) && defined(__alpha__) ++ ++unsigned long hardclock( void ) ++{ ++ unsigned long cc; ++ asm( "rpcc %0" : "=r" (cc) ); ++ return( cc & 0xFFFFFFFF ); ++} ++ ++#else ++#if defined(__GNUC__) && defined(__ia64__) ++ ++unsigned long hardclock( void ) ++{ ++ unsigned long itc; ++ asm( "mov %0 = ar.itc" : "=r" (itc) ); ++ return( itc ); ++} ++ ++#else ++ ++static int hardclock_init = 0; ++static struct timeval tv_init; ++ ++unsigned long hardclock( void ) ++{ ++ struct timeval tv_cur; ++ ++ if( hardclock_init == 0 ) ++ { ++ gettimeofday( &tv_init, NULL ); ++ hardclock_init = 1; ++ } ++ ++ gettimeofday( &tv_cur, NULL ); ++ return( ( tv_cur.tv_sec - tv_init.tv_sec ) * 1000000 ++ + ( tv_cur.tv_usec - tv_init.tv_usec ) ); ++} ++ ++#endif /* generic */ ++#endif /* IA-64 */ ++#endif /* Alpha */ ++#endif /* SPARC8 */ ++#endif /* PowerPC */ ++#endif /* AMD64 */ ++#endif /* i586+ */ ++ ++int alarmed = 0; ++ ++#if defined(WIN32) ++ ++unsigned long get_timer( struct hr_time *val, int reset ) ++{ ++ unsigned long delta; ++ LARGE_INTEGER offset, hfreq; ++ struct _hr_time *t = (struct _hr_time *) val; ++ ++ QueryPerformanceCounter( &offset ); ++ QueryPerformanceFrequency( &hfreq ); ++ ++ delta = (unsigned long)( ( 1000 * ++ ( offset.QuadPart - t->start.QuadPart ) ) / ++ hfreq.QuadPart ); ++ ++ if( reset ) ++ QueryPerformanceCounter( &t->start ); ++ ++ return( delta ); ++} ++ ++DWORD WINAPI TimerProc( LPVOID uElapse ) ++{ ++ Sleep( (DWORD) uElapse ); ++ alarmed = 1; ++ return( TRUE ); ++} ++ ++void set_alarm( int seconds ) ++{ ++ DWORD ThreadId; ++ ++ alarmed = 0; ++ CloseHandle( CreateThread( NULL, 0, TimerProc, ++ (LPVOID) ( seconds * 1000 ), 0, &ThreadId ) ); ++} ++ ++void m_sleep( int milliseconds ) ++{ ++ Sleep( milliseconds ); ++} ++ ++#else ++ ++unsigned long get_timer( struct hr_time *val, int reset ) ++{ ++ unsigned long delta; ++ struct timeval offset; ++ struct _hr_time *t = (struct _hr_time *) val; ++ ++ gettimeofday( &offset, NULL ); ++ ++ delta = ( offset.tv_sec - t->start.tv_sec ) * 1000 ++ + ( offset.tv_usec - t->start.tv_usec ) / 1000; ++ ++ if( reset ) ++ { ++ t->start.tv_sec = offset.tv_sec; ++ t->start.tv_usec = offset.tv_usec; ++ } ++ ++ return( delta ); ++} ++ ++static void sighandler( int signum ) ++{ ++ alarmed = 1; ++ signal( signum, sighandler ); ++} ++ ++void set_alarm( int seconds ) ++{ ++ alarmed = 0; ++ signal( SIGALRM, sighandler ); ++ alarm( seconds ); ++} ++ ++void m_sleep( int milliseconds ) ++{ ++ struct timeval tv; ++ ++ tv.tv_sec = milliseconds / 1000; ++ tv.tv_usec = milliseconds * 1000; ++ ++ select( 0, NULL, NULL, NULL, &tv ); ++} ++ ++#endif ++ ++#endif +diff --git a/feeds/luci/libs/luci-lib-px5g/src/library/x509write.c b/feeds/luci/libs/luci-lib-px5g/src/library/x509write.c +new file mode 100644 +index 0000000..173610c +--- /dev/null ++++ b/feeds/luci/libs/luci-lib-px5g/src/library/x509write.c +@@ -0,0 +1,1137 @@ ++/* ++ * X.509 certificate and private key writing ++ * ++ * Copyright (C) 2006-2007 Pascal Vizeli ++ * Modifications (C) 2009 Steven Barth ++ * ++ * This library is free software; you can redistribute it and/or ++ * modify it under the terms of the GNU Lesser General Public ++ * License, version 2.1 as published by the Free Software Foundation. ++ * ++ * This library 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 ++ * Lesser General Public License for more details. ++ * ++ * You should have received a copy of the GNU Lesser General Public ++ * License along with this library; if not, write to the Free Software ++ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, ++ * MA 02110-1301 USA ++ */ ++/* ++ * The ITU-T X.509 standard defines a certificat format for PKI. ++ * ++ * http://www.ietf.org/rfc/rfc2459.txt ++ * http://www.ietf.org/rfc/rfc3279.txt ++ * ++ * ftp://ftp.rsasecurity.com/pub/pkcs/ascii/pkcs-1v2.asc ++ * ++ * http://www.itu.int/ITU-T/studygroups/com17/languages/X.680-0207.pdf ++ * http://www.itu.int/ITU-T/studygroups/com17/languages/X.690-0207.pdf ++ * ++ * For CRS: ++ * http://www.faqs.org/rfcs/rfc2314.html ++ */ ++#include "polarssl/config.h" ++#include "polarssl/x509.h" ++/* #include "polarssl/base64.h" */ ++#include "polarssl/sha1.h" ++ ++#include ++#include ++#include ++#include ++#include ++ ++#define and && ++#define or || ++ ++#if defined _MSC_VER && !defined snprintf ++#define snprintf _snprintf ++#endif ++ ++static int x509write_realloc_node(x509_node *node, size_t larger); ++static int x509write_file(x509_node *node, char *path, int format, const char* pem_prolog, const char* pem_epilog); ++ ++/* ++ * evaluate how mani octet have this integer ++ */ ++static int asn1_eval_octet(unsigned int digit) ++{ ++ int i, byte; ++ ++ for (byte = 4, i = 24; i >= 0; i -= 8, --byte) ++ if (((digit >> i) & 0xFF) != 0) ++ return byte; ++ ++ return 0; ++} ++ ++/* ++ * write the asn.1 lenght form into p ++ */ ++static int asn1_add_len(unsigned int size, x509_node *node) ++{ ++ if (size > 127) { ++ ++ /* long size */ ++ int byte = asn1_eval_octet(size); ++ int i = 0; ++ ++ *(node->p) = (0x80 | byte) & 0xFF; ++ ++node->p; ++ ++ for (i = byte; i > 0; --i) { ++ ++ *(node->p) = (size >> ((i - 1) * 8)) & 0xFF; ++ ++node->p; ++ } ++ ++ } else { ++ ++ /* short size */ ++ *(node->p) = size & 0xFF; ++ if (size != 0) ++ ++node->p; ++ } ++ ++ return 0; ++} ++ ++/* ++ * write a ans.1 object into p ++ */ ++static int asn1_add_obj(unsigned char *value, unsigned int size, int tag, ++ x509_node *node) ++{ ++ int tl = 2; ++ ++ if (tag == ASN1_BIT_STRING) ++ ++tl; ++ ++ if (size > 127) ++ x509write_realloc_node(node, (size_t) size + tl + ++ asn1_eval_octet(size)); ++ else ++ x509write_realloc_node(node, (size_t) size + tl); ++ ++ if (node->data == NULL) ++ return 1; ++ ++ /* tag */ ++ *(node->p) = tag & 0xFF; ++ ++node->p; ++ ++ /* len */ ++ if (tag == ASN1_BIT_STRING) { ++ asn1_add_len((unsigned int) size + 1, node); ++ *(node->p) = 0x00; ++ ++node->p; ++ } else { ++ asn1_add_len((unsigned int) size, node); ++ } ++ ++ /* value */ ++ if (size > 0) { ++ ++ memcpy(node->p, value, (size_t) size); ++ if ((node->p += size -1) != node->end) ++ return POLARSSL_ERR_X509_POINT_ERROR; ++ } else { ++ /* make nothing -> NULL */ ++ } ++ ++ return 0; ++} ++ ++/* ++ * write a asn.1 conform integer object ++ */ ++static int asn1_add_int(signed int value, x509_node *node) ++{ ++ signed int i = 0, neg = 1; ++ unsigned int byte, u_val = 0, tmp_val = 0; ++ ++ /* if negate? */ ++ if (value < 0) { ++ neg = -1; ++ u_val = ~value; ++ } else { ++ u_val = value; ++ } ++ ++ byte = asn1_eval_octet(u_val); ++ /* 0 isn't NULL */ ++ if (byte == 0) ++ byte = 1; ++ ++ /* ASN.1 integer is signed! */ ++ if (byte < 4 and ((u_val >> ((byte -1) * 8)) & 0xFF) == 0x80) ++ byte += 1; ++ ++ if (x509write_realloc_node(node, (size_t) byte + 2) != 0) ++ return 1; ++ ++ /* tag */ ++ *(node->p) = ASN1_INTEGER; ++ ++node->p; ++ ++ /* len */ ++ asn1_add_len(byte, node); ++ ++ /* value */ ++ for (i = byte; i > 0; --i) { ++ ++ tmp_val = (u_val >> ((i - 1) * 8)) & 0xFF; ++ if (neg == 1) ++ *(node->p) = tmp_val; ++ else ++ *(node->p) = ~tmp_val; ++ ++ if (i > 1) ++ ++node->p; ++ } ++ ++ if (node->p != node->end) ++ return POLARSSL_ERR_X509_POINT_ERROR; ++ ++ return 0; ++} ++ ++/* ++ * write a asn.1 conform mpi object ++ */ ++static int asn1_add_mpi(mpi *value, int tag, x509_node *node) ++{ ++ size_t size = (mpi_msb(value) / 8) + 1; ++ unsigned char *buf; ++ int buf_len = (int) size, tl = 2; ++ ++ if (tag == ASN1_BIT_STRING) ++ ++tl; ++ ++ if (size > 127) ++ x509write_realloc_node(node, size + (size_t) tl + ++ asn1_eval_octet((unsigned int)size)); ++ else ++ x509write_realloc_node(node, size + (size_t) tl); ++ ++ if (node->data == NULL) ++ return 1; ++ ++ buf = (unsigned char*) malloc(size); ++ if (mpi_write_binary(value, buf, buf_len) != 0) ++ return POLARSSL_ERR_MPI_BUFFER_TOO_SMALL; ++ ++ /* tag */ ++ *(node->p) = tag & 0xFF; ++ ++node->p; ++ ++ /* len */ ++ if (tag == ASN1_BIT_STRING) { ++ asn1_add_len((unsigned int) size + 1, node); ++ *(node->p) = 0x00; ++ ++node->p; ++ } else { ++ asn1_add_len((unsigned int) size, node); ++ } ++ ++ /* value */ ++ memcpy(node->p, buf, size); ++ free(buf); ++ ++ if ((node->p += (int) size -1) != node->end) ++ return POLARSSL_ERR_X509_POINT_ERROR; ++ ++ return 0; ++} ++ ++/* ++ * write a node into asn.1 conform object ++ */ ++static int asn1_append_tag(x509_node *node, int tag) ++{ ++ int tl = 2; ++ ++ x509_node tmp; ++ x509write_init_node(&tmp); ++ ++ if (tag == ASN1_BIT_STRING) ++ ++tl; ++ ++ if (node->len > 127) ++ x509write_realloc_node(&tmp, node->len + (size_t) tl + ++ asn1_eval_octet((unsigned int)node->len)); ++ else ++ x509write_realloc_node(&tmp, node->len + (size_t) tl); ++ ++ if (tmp.data == NULL) { ++ x509write_free_node(&tmp); ++ return 1; ++ } ++ ++ /* tag */ ++ *(tmp.p) = tag & 0xFF; ++ ++tmp.p; ++ ++ /* len */ ++ if (tag == ASN1_BIT_STRING) { ++ asn1_add_len((unsigned int) node->len + 1, &tmp); ++ *(tmp.p) = 0x00; ++ ++tmp.p; ++ } else { ++ asn1_add_len((unsigned int) node->len, &tmp); ++ } ++ ++ /* value */ ++ memcpy(tmp.p, node->data, node->len); ++ ++ /* good? */ ++ if ((tmp.p += (int) node->len -1) != tmp.end) { ++ x509write_free_node(&tmp); ++ return POLARSSL_ERR_X509_POINT_ERROR; ++ } ++ ++ free(node->data); ++ node->data = tmp.data; ++ node->p = tmp.p; ++ node->end = tmp.end; ++ node->len = tmp.len; ++ ++ return 0; ++} ++ ++/* ++ * write nodes into a asn.1 object ++ */ ++static int asn1_append_nodes(x509_node *node, int tag, int anz, ...) ++{ ++ va_list ap; ++ size_t size = 0; ++ x509_node *tmp; ++ int count; ++ ++ va_start(ap, anz); ++ count = anz; ++ ++ while (count--) { ++ ++ tmp = va_arg(ap, x509_node*); ++ if (tmp->data != NULL) ++ size += tmp->len; ++ } ++ ++ if ( size > 127) { ++ if (x509write_realloc_node(node, size + (size_t) 2 + ++ asn1_eval_octet(size)) != 0) ++ return 1; ++ } else { ++ if (x509write_realloc_node(node, size + (size_t) 2) != 0) ++ return 1; ++ } ++ ++ /* tag */ ++ *(node->p) = tag & 0xFF; ++ ++node->p; ++ ++ /* len */ ++ asn1_add_len(size, node); ++ ++ /* value */ ++ va_start(ap, anz); ++ count = anz; ++ ++ while (count--) { ++ ++ tmp = va_arg(ap, x509_node*); ++ if (tmp->data != NULL) { ++ ++ memcpy(node->p, tmp->data, tmp->len); ++ if ((node->p += (int) tmp->len -1) != node->end) ++ ++node->p; ++ } ++ } ++ ++ va_end(ap); ++ return 0; ++} ++ ++/* ++ * write a ASN.1 conform object identifiere include a "tag" ++ */ ++static int asn1_add_oid(x509_node *node, unsigned char *oid, size_t len, ++ int tag, int tag_val, unsigned char *value, size_t val_len) ++{ ++ int ret; ++ x509_node tmp; ++ ++ x509write_init_node(&tmp); ++ ++ /* OBJECT IDENTIFIER */ ++ if ((ret = asn1_add_obj(oid, len, ASN1_OID, &tmp)) != 0) { ++ x509write_free_node(&tmp); ++ return ret; ++ } ++ ++ /* value */ ++ if ((ret = asn1_add_obj(value, val_len, tag_val, &tmp)) != 0) { ++ x509write_free_node(&tmp); ++ return ret; ++ } ++ ++ /* SET/SEQUENCE */ ++ if ((ret = asn1_append_nodes(node, tag, 1, &tmp)) != 0) { ++ x509write_free_node(&tmp); ++ return ret; ++ } ++ ++ x509write_free_node(&tmp); ++ return 0; ++} ++ ++/* ++ * utcTime UTCTime ++ */ ++static int asn1_add_date_utc(unsigned char *time, x509_node *node) ++{ ++ unsigned char date[13], *sp; ++ x509_time xtime; ++ int ret; ++ ++ sscanf((char*)time, "%d-%d-%d %d:%d:%d", &xtime.year, &xtime.mon, ++ &xtime.day, &xtime.hour, &xtime.min, &xtime.sec); ++ ++ /* convert to YY */ ++ if (xtime.year > 2000) ++ xtime.year -= 2000; ++ else ++ xtime.year -= 1900; ++ ++ snprintf((char*)date, 13, "%2d%2d%2d%2d%2d%2d", xtime.year, xtime.mon, xtime.day, ++ xtime.hour, xtime.min, xtime.sec); ++ ++ /* replace ' ' to '0' */ ++ for (sp = date; *sp != '\0'; ++sp) ++ if (*sp == '\x20') ++ *sp = '\x30'; ++ ++ date[12] = 'Z'; ++ ++ if ((ret = asn1_add_obj(date, 13, ASN1_UTC_TIME, node)) != 0) ++ return ret; ++ ++ return 0; ++} ++ ++/* ++ * serialize an rsa key into DER ++ */ ++ ++int x509write_serialize_key(rsa_context *rsa, x509_node *node) ++{ ++ int ret = 0; ++ x509write_init_node(node); ++ ++ /* vers, n, e, d, p, q, dp, dq, pq */ ++ if ((ret = asn1_add_int(rsa->ver, node)) != 0) ++ return ret; ++ if ((ret = asn1_add_mpi(&rsa->N, ASN1_INTEGER, node)) != 0) ++ return ret; ++ if ((ret = asn1_add_mpi(&rsa->E, ASN1_INTEGER, node)) != 0) ++ return ret; ++ if ((ret = asn1_add_mpi(&rsa->D, ASN1_INTEGER, node)) != 0) ++ return ret; ++ if ((ret = asn1_add_mpi(&rsa->P, ASN1_INTEGER, node)) != 0) ++ return ret; ++ if ((ret = asn1_add_mpi(&rsa->Q, ASN1_INTEGER, node)) != 0) ++ return ret; ++ if ((ret = asn1_add_mpi(&rsa->DP, ASN1_INTEGER, node)) != 0) ++ return ret; ++ if ((ret = asn1_add_mpi(&rsa->DQ, ASN1_INTEGER, node)) != 0) ++ return ret; ++ if ((ret = asn1_add_mpi(&rsa->QP, ASN1_INTEGER, node)) != 0) ++ return ret; ++ if ((ret = asn1_append_tag(node, ASN1_CONSTRUCTED | ASN1_SEQUENCE)) != 0) ++ return ret; ++ ++ return 0; ++} ++ ++/* ++ * write a der/pem encoded rsa private key into a file ++ */ ++int x509write_keyfile(rsa_context *rsa, char *path, int out_flag) ++{ ++ int ret = 0; ++ const char key_beg[] = "-----BEGIN RSA PRIVATE KEY-----\n", ++ key_end[] = "-----END RSA PRIVATE KEY-----\n"; ++ x509_node node; ++ ++ x509write_init_node(&node); ++ if ((ret = x509write_serialize_key(rsa,&node)) != 0) { ++ x509write_free_node(&node); ++ return ret; ++ } ++ ++ ret = x509write_file(&node,path,out_flag,key_beg,key_end); ++ x509write_free_node(&node); ++ ++ return ret; ++} ++ ++ ++/* ++ * reasize the memory for node ++ */ ++static int x509write_realloc_node(x509_node *node, size_t larger) ++{ ++ /* init len */ ++ if (node->data == NULL) { ++ node->len = 0; ++ node->data = malloc(larger); ++ if(node->data == NULL) ++ return 1; ++ } else { ++ /* realloc memory */ ++ if ((node->data = realloc(node->data, node->len + larger)) == NULL) ++ return 1; ++ } ++ ++ /* init pointer */ ++ node->p = &node->data[node->len]; ++ node->len += larger; ++ node->end = &node->data[node->len -1]; ++ ++ return 0; ++} ++ ++/* ++ * init node ++ */ ++void x509write_init_node(x509_node *node) ++{ ++ memset(node, 0, sizeof(x509_node)); ++} ++ ++/* ++ * clean memory ++ */ ++void x509write_free_node(x509_node *node) ++{ ++ if (node->data != NULL) ++ free(node->data); ++ node->p = NULL; ++ node->end = NULL; ++ node->len = 0; ++} ++ ++/* ++ * write a x509 certificate into file ++ */ ++int x509write_crtfile(x509_raw *chain, unsigned char *path, int out_flag) ++{ ++ const char cer_beg[] = "-----BEGIN CERTIFICATE-----\n", ++ cer_end[] = "-----END CERTIFICATE-----\n"; ++ ++ return x509write_file(&chain->raw, (char*)path, out_flag, cer_beg, cer_end); ++} ++ ++/* ++ * write a x509 certificate into file ++ */ ++int x509write_csrfile(x509_raw *chain, unsigned char *path, int out_flag) ++{ ++ const char cer_beg[] = "-----BEGIN CERTIFICATE REQUEST-----\n", ++ cer_end[] = "-----END CERTIFICATE REQUEST-----\n"; ++ ++ return x509write_file(&chain->raw, (char*)path, out_flag, cer_beg, cer_end); ++} ++ ++/* ++ * write an x509 file ++ */ ++static int x509write_file(x509_node *node, char *path, int format, ++ const char* pem_prolog, const char* pem_epilog) ++{ ++ FILE *ofstream; ++ int is_err = 1/*, buf_len, i, n*/; ++ /* char* base_buf; */ ++ ++ if ((ofstream = fopen(path, "wb")) == NULL) ++ return 1; ++ ++ switch (format) { ++ case X509_OUTPUT_DER: ++ if (fwrite(node->data, 1, node->len, ofstream) ++ != node->len) ++ is_err = -1; ++ break; ++/* ++ case X509_OUTPUT_PEM: ++ if (fprintf(ofstream,pem_prolog)<0) { ++ is_err = -1; ++ break; ++ } ++ ++ buf_len = node->len << 1; ++ base_buf = (char*) malloc((size_t)buf_len); ++ memset(base_buf,0,buf_len); ++ if (base64_encode(base_buf, &buf_len, node->data, ++ (int) node->len) != 0) { ++ is_err = -1; ++ break; ++ } ++ ++ n=strlen(base_buf); ++ for(i=0;isubpubkey; ++ ++ x509write_init_node(&n_tmp); ++ x509write_init_node(&n_tmp2); ++ ++ /* ++ * RSAPublicKey ::= SEQUENCE { ++ * modulus INTEGER, -- n ++ * publicExponent INTEGER -- e ++ * } ++ */ ++ if ((ret = asn1_add_mpi(&pubkey->N, ASN1_INTEGER, &n_tmp)) != 0) { ++ x509write_free_node(&n_tmp); ++ x509write_free_node(&n_tmp2); ++ return ret; ++ } ++ if ((ret = asn1_add_mpi(&pubkey->E, ASN1_INTEGER, &n_tmp)) != 0) { ++ x509write_free_node(&n_tmp); ++ x509write_free_node(&n_tmp2); ++ return ret; ++ } ++ if ((ret = asn1_append_tag(&n_tmp, ASN1_CONSTRUCTED | ASN1_SEQUENCE)) ++ != 0) { ++ x509write_free_node(&n_tmp); ++ x509write_free_node(&n_tmp2); ++ return ret; ++ } ++ ++ /* ++ * SubjectPublicKeyInfo ::= SEQUENCE { ++ * algorithm AlgorithmIdentifier, ++ * subjectPublicKey BIT STRING } ++ */ ++ if ((ret = asn1_append_tag(&n_tmp, ASN1_BIT_STRING)) != 0) { ++ x509write_free_node(&n_tmp); ++ x509write_free_node(&n_tmp2); ++ return ret; ++ } ++ if ((ret = asn1_add_oid(&n_tmp2, (unsigned char*)OID_PKCS1_RSA, 9, ++ ASN1_CONSTRUCTED | ASN1_SEQUENCE, ASN1_NULL, ++ (unsigned char *)"", 0)) != 0) { ++ x509write_free_node(&n_tmp); ++ x509write_free_node(&n_tmp2); ++ return ret; ++ } ++ ++ if ((ret = asn1_append_nodes(node, ASN1_CONSTRUCTED | ASN1_SEQUENCE, 2, ++ &n_tmp2, &n_tmp))) { ++ x509write_free_node(&n_tmp); ++ x509write_free_node(&n_tmp2); ++ return ret; ++ } ++ ++ x509write_free_node(&n_tmp); ++ x509write_free_node(&n_tmp2); ++ return 0; ++} ++ ++/* ++ * RelativeDistinguishedName ::= ++ * SET OF AttributeTypeAndValue ++ * ++ * AttributeTypeAndValue ::= SEQUENCE { ++ * type AttributeType, ++ * value AttributeValue } ++ */ ++static int x509write_add_name(x509_node *node, unsigned char *oid, ++ unsigned int oid_len, unsigned char *value, int len, int value_tag) ++{ ++ int ret; ++ x509_node n_tmp; ++ ++ x509write_init_node(&n_tmp); ++ ++ if ((ret = asn1_add_oid(&n_tmp, oid, oid_len, ++ ASN1_CONSTRUCTED | ASN1_SEQUENCE, value_tag, ++ value, len))) { ++ x509write_free_node(&n_tmp); ++ return ret; ++ } ++ ++ if ((asn1_append_nodes(node, ASN1_CONSTRUCTED | ASN1_SET, 1, &n_tmp)) ++ != 0) { ++ x509write_free_node(&n_tmp); ++ return ret; ++ } ++ ++ x509write_free_node(&n_tmp); ++ return 0; ++} ++ ++/* ++ * Parse the name string and add to node ++ */ ++static int x509write_parse_names(x509_node *node, unsigned char *names) ++{ ++ unsigned char *sp, *begin = NULL; ++ unsigned char oid[3] = OID_X520, tag[4], *tag_sp = tag; ++ unsigned char *C = NULL, *CN = NULL, *O = NULL, *OU = NULL, ++ *ST = NULL, *L = NULL, *R = NULL; ++ int C_len = 0, CN_len = 0, O_len = 0, OU_len = 0, ST_len = 0, ++ L_len = 0, R_len = 0; ++ int ret = 0, is_tag = 1, is_begin = -1, len = 0; ++ ++ ++ for (sp = names; ; ++sp) { ++ ++ /* filter tag */ ++ if (is_tag == 1) { ++ ++ if (tag_sp == &tag[3]) ++ return POLARSSL_ERR_X509_VALUE_TO_LENGTH; ++ ++ /* is tag end? */ ++ if (*sp == '=') { ++ is_tag = -1; ++ *tag_sp = '\0'; ++ is_begin = 1; ++ /* set len 0 (reset) */ ++ len = 0; ++ } else { ++ /* tag hasn't ' '! */ ++ if (*sp != ' ') { ++ *tag_sp = *sp; ++ ++tag_sp; ++ } ++ } ++ /* filter value */ ++ } else { ++ ++ /* set pointer of value begin */ ++ if (is_begin == 1) { ++ begin = sp; ++ is_begin = -1; ++ } ++ ++ /* is value at end? */ ++ if (*sp == ';' or *sp == '\0') { ++ is_tag = 1; ++ ++ /* common name */ ++ if (tag[0] == 'C' and tag[1] == 'N') { ++ CN = begin; ++ CN_len = len; ++ ++ /* organization */ ++ } else if (tag[0] == 'O' and tag[1] == '\0') { ++ O = begin; ++ O_len = len; ++ ++ /* country */ ++ } else if (tag[0] == 'C' and tag[1] == '\0') { ++ C = begin; ++ C_len = len; ++ ++ /* organisation unit */ ++ } else if (tag[0] == 'O' and tag[1] == 'U') { ++ OU = begin; ++ OU_len = len; ++ ++ /* state */ ++ } else if (tag[0] == 'S' and tag[1] == 'T') { ++ ST = begin; ++ ST_len = len; ++ ++ /* locality */ ++ } else if (tag[0] == 'L' and tag[1] == '\0') { ++ L = begin; ++ L_len = len; ++ ++ /* email */ ++ } else if (tag[0] == 'R' and tag[1] == '\0') { ++ R = begin; ++ R_len = len; ++ } ++ ++ /* set tag poiner to begin */ ++ tag_sp = tag; ++ ++ /* is at end? */ ++ if (*sp == '\0' or *(sp +1) == '\0') ++ break; ++ } else { ++ ++len; ++ } ++ } ++ ++ /* make saver */ ++ if (*sp == '\0') ++ break; ++ } /* end for */ ++ ++ /* country */ ++ if (C != NULL) { ++ oid[2] = X520_COUNTRY; ++ if ((ret = x509write_add_name(node, oid, 3, C, C_len, ++ ASN1_PRINTABLE_STRING)) != 0) ++ return ret; ++ } ++ ++ /* state */ ++ if (ST != NULL) { ++ oid[2] = X520_STATE; ++ if ((ret = x509write_add_name(node, oid, 3, ST, ST_len, ++ ASN1_PRINTABLE_STRING)) != 0) ++ return ret; ++ } ++ ++ /* locality */ ++ if (L != NULL) { ++ oid[2] = X520_LOCALITY; ++ if ((ret = x509write_add_name(node, oid, 3, L, L_len, ++ ASN1_PRINTABLE_STRING)) != 0) ++ return ret; ++ } ++ ++ /* organization */ ++ if (O != NULL) { ++ oid[2] = X520_ORGANIZATION; ++ if ((ret = x509write_add_name(node, oid, 3, O, O_len, ++ ASN1_PRINTABLE_STRING)) != 0) ++ return ret; ++ } ++ ++ /* organisation unit */ ++ if (OU != NULL) { ++ oid[2] = X520_ORG_UNIT; ++ if ((ret = x509write_add_name(node, oid, 3, OU, OU_len, ++ ASN1_PRINTABLE_STRING)) != 0) ++ return ret; ++ } ++ ++ /* common name */ ++ if (CN != NULL) { ++ oid[2] = X520_COMMON_NAME; ++ if ((ret = x509write_add_name(node, oid, 3, CN, CN_len, ++ ASN1_PRINTABLE_STRING)) != 0) ++ return ret; ++ } ++ ++ /* email */ ++ if (R != NULL) { ++ if ((ret = x509write_add_name(node, (unsigned char*)OID_PKCS9_EMAIL, ++ 9, R, R_len, ASN1_IA5_STRING)) != 0) ++ return ret; ++ } ++ ++ if ((asn1_append_tag(node, ASN1_CONSTRUCTED | ASN1_SEQUENCE)) != 0) ++ return ret; ++ ++ return 0; ++} ++ ++/* ++ * Copy raw data from orginal ca to node ++ */ ++static int x509write_copy_from_raw(x509_node *node, x509_buf *raw) ++{ ++ if (x509write_realloc_node(node, raw->len) != 0) ++ return 1; ++ ++ memcpy(node->p, raw->p, (size_t)raw->len); ++ if ((node->p += raw->len -1) != node->end) ++ return POLARSSL_ERR_X509_POINT_ERROR; ++ ++ return 0; ++} ++ ++/* ++ * Add the issuer ++ */ ++ ++int x509write_add_issuer(x509_raw *crt, unsigned char *issuer) ++{ ++ return x509write_parse_names(&crt->issuer, issuer); ++} ++ ++/* ++ * Add the subject ++ */ ++int x509write_add_subject(x509_raw *crt, unsigned char *subject) ++{ ++ return x509write_parse_names(&crt->subject, subject); ++} ++ ++/* ++ * Copy issuer line from another cert to issuer ++ */ ++int x509write_copy_issuer(x509_raw *crt, x509_cert *from_crt) ++{ ++ return x509write_copy_from_raw(&crt->issuer, &from_crt->issuer_raw); ++} ++ ++/* ++ * Copy subject line from another cert ++ */ ++int x509write_copy_subject(x509_raw *crt, x509_cert *from_crt) ++{ ++ return x509write_copy_from_raw(&crt->subject, &from_crt->subject_raw); ++} ++ ++/* ++ * Copy subject line form antoher cert into issuer ++ */ ++int x509write_copy_issuer_form_subject(x509_raw *crt, ++ x509_cert *from_crt) ++{ ++ return x509write_copy_from_raw(&crt->issuer, &from_crt->subject_raw); ++} ++ ++/* ++ * Copy issuer line from another cert into subject ++ */ ++int x509write_copy_subject_from_issuer(x509_raw *crt, ++ x509_cert * from_crt) ++{ ++ return x509write_copy_from_raw(&crt->subject, &from_crt->issuer_raw); ++} ++ ++/* ++ * Validity ::= SEQUENCE { ++ * notBefore Time, ++ * notAfter Time } ++ * ++ * Time ::= CHOICE { ++ * utcTime UTCTime, ++ * generalTime GeneralizedTime } ++ */ ++/* TODO: No handle GeneralizedTime! */ ++int x509write_add_validity(x509_raw *chain, unsigned char *befor, ++ unsigned char *after) ++{ ++ int ret; ++ ++ x509_node *node = &chain->validity; ++ ++ /* notBefore */ ++ if ((ret = asn1_add_date_utc(befor, node)) != 0) ++ return ret; ++ ++ /* notAfter */ ++ if ((ret = asn1_add_date_utc(after, node)) != 0) ++ return ret; ++ ++ if ((ret = asn1_append_tag(node, ASN1_CONSTRUCTED | ASN1_SEQUENCE)) != 0) ++ return ret; ++ ++ return 0; ++} ++ ++/* ++ * make hash from tbs and sign that with private key ++ */ ++static int x509write_make_sign(x509_raw *chain, rsa_context *privkey) ++{ ++ int ret; ++ unsigned char hash[20], *sign; ++ size_t sign_len = (size_t) mpi_size(&privkey->N); ++ ++ /* make hash */ ++ sha1(chain->tbs.data, chain->tbs.len, hash); ++ ++ /* create sign */ ++ sign = (unsigned char *) malloc(sign_len); ++ if (sign == NULL) ++ return 1; ++ ++ if ((ret = rsa_pkcs1_sign(privkey, RSA_PRIVATE, RSA_SHA1, 20, hash, ++ sign)) != 0) ++ return ret; ++ ++ if ((ret = asn1_add_obj(sign, sign_len, ASN1_BIT_STRING, ++ &chain->sign)) != 0) ++ return ret; ++ ++ /* ++ * AlgorithmIdentifier ::= SEQUENCE { ++ * algorithm OBJECT IDENTIFIER, ++ * parameters ANY DEFINED BY algorithm OPTIONAL } ++ */ ++ return asn1_add_oid(&chain->signalg, (unsigned char*)OID_PKCS1_RSA_SHA, 9, ++ ASN1_CONSTRUCTED | ASN1_SEQUENCE, ASN1_NULL, ++ (unsigned char*)"", 0); ++} ++ ++/* ++ * Create a self signed certificate ++ */ ++int x509write_create_sign(x509_raw *chain, rsa_context *privkey) ++{ ++ int ret, serial; ++ ++ /* ++ * Version ::= INTEGER { v1(0), v2(1), v3(2) } ++ */ ++ if ((ret = asn1_add_int(2, &chain->version)) != 0) ++ return ret; ++ ++ if ((ret = asn1_append_tag(&chain->version, ASN1_CONTEXT_SPECIFIC | ++ ASN1_CONSTRUCTED)) != 0) ++ return ret; ++ ++ ++ /* ++ * CertificateSerialNumber ::= INTEGER ++ */ ++ srand((unsigned int) time(NULL)); ++ serial = rand(); ++ if ((ret = asn1_add_int(serial, &chain->serial)) != 0) ++ return ret; ++ ++ /* ++ * AlgorithmIdentifier ::= SEQUENCE { ++ * algorithm OBJECT IDENTIFIER, ++ * parameters ANY DEFINED BY algorithm OPTIONAL } ++ */ ++ if ((ret = asn1_add_oid(&chain->tbs_signalg, ++ (unsigned char*)OID_PKCS1_RSA_SHA, 9, ASN1_CONSTRUCTED | ++ ASN1_SEQUENCE, ASN1_NULL, (unsigned char*)"", 0)) != 0) ++ return ret; ++ ++ /* ++ * Create the tbs ++ */ ++ if ((ret = asn1_append_nodes(&chain->tbs, ASN1_CONSTRUCTED | ++ ASN1_SEQUENCE, 7, &chain->version, &chain->serial, ++ &chain->tbs_signalg, &chain->issuer, &chain->validity, ++ &chain->subject, &chain->subpubkey)) != 0) ++ return ret; ++ ++ /* make signing */ ++ if ((ret = x509write_make_sign(chain, privkey)) != 0) ++ return ret; ++ ++ /* finishing */ ++ if ((ret = asn1_append_nodes(&chain->raw, ASN1_CONSTRUCTED | ++ ASN1_SEQUENCE, 3, &chain->tbs, &chain->signalg, ++ &chain->sign)) != 0) ++ return ret; ++ ++ return 0; ++} ++ ++int x509write_create_selfsign(x509_raw *chain, rsa_context *privkey) ++{ ++ /* ++ * On self signed certificate are subject and issuer the same ++ */ ++ x509write_free_node(&chain->issuer); ++ chain->issuer = chain->subject; ++ return x509write_create_sign(chain, privkey); ++} ++ ++/* ++ * CertificationRequestInfo ::= SEQUENCE { ++ * version Version, ++ * subject Name, ++ * subjectPublicKeyInfo SubjectPublicKeyInfo, ++ * attributes [0] IMPLICIT Attributes } ++ * ++ * CertificationRequest ::= SEQUENCE { ++ * certificationRequestInfo CertificationRequestInfo, ++ * signatureAlgorithm SignatureAlgorithmIdentifier, ++ * signature Signature } ++ * ++ * It use chain.serail for attributes! ++ * ++ */ ++int x509write_create_csr(x509_raw *chain, rsa_context *privkey) ++{ ++ int ret; ++ ++ /* version ::= INTEGER */ ++ if ((ret = asn1_add_int(0, &chain->version)) != 0) ++ return ret; ++ ++ /* write attributes */ ++ if ((ret = asn1_add_obj((unsigned char*)"", 0, ASN1_CONTEXT_SPECIFIC | ++ ASN1_CONSTRUCTED, &chain->serial)) != 0) ++ return ret; ++ ++ /* create CertificationRequestInfo */ ++ if ((ret = asn1_append_nodes(&chain->tbs, ASN1_CONSTRUCTED | ++ ASN1_SEQUENCE, 4, &chain->version, &chain->subject, ++ &chain->subpubkey, &chain->serial)) != 0) ++ return ret; ++ ++ /* make signing */ ++ if ((ret = x509write_make_sign(chain, privkey)) != 0) ++ return ret; ++ ++ /* finish */ ++ if ((ret = asn1_append_nodes(&chain->raw, ASN1_CONSTRUCTED | ASN1_SEQUENCE, ++ 3, &chain->tbs, &chain->signalg, &chain->sign)) != 0) ++ return ret; ++ ++ return ret; ++} ++ ++/* ++ * Free memory ++ */ ++void x509write_free_raw(x509_raw *chain) ++{ ++ x509write_free_node(&chain->raw); ++ x509write_free_node(&chain->tbs); ++ x509write_free_node(&chain->version); ++ x509write_free_node(&chain->serial); ++ x509write_free_node(&chain->tbs_signalg); ++ x509write_free_node(&chain->issuer); ++ x509write_free_node(&chain->validity); ++ if (chain->subject.data != chain->issuer.data) ++ x509write_free_node(&chain->subject); ++ x509write_free_node(&chain->subpubkey); ++ x509write_free_node(&chain->signalg); ++ x509write_free_node(&chain->sign); ++} ++ ++void x509write_init_raw(x509_raw *chain) ++{ ++ memset((void *) chain, 0, sizeof(x509_raw)); ++} ++ +diff --git a/feeds/luci/libs/luci-lib-px5g/src/polarssl/bignum.h b/feeds/luci/libs/luci-lib-px5g/src/polarssl/bignum.h +new file mode 100644 +index 0000000..c667303 +--- /dev/null ++++ b/feeds/luci/libs/luci-lib-px5g/src/polarssl/bignum.h +@@ -0,0 +1,437 @@ ++/** ++ * \file bignum.h ++ * ++ * Based on XySSL: Copyright (C) 2006-2008 Christophe Devine ++ * ++ * Copyright (C) 2009 Paul Bakker ++ * ++ * All rights reserved. ++ * ++ * Redistribution and use in source and binary forms, with or without ++ * modification, are permitted provided that the following conditions ++ * are met: ++ * ++ * * Redistributions of source code must retain the above copyright ++ * notice, this list of conditions and the following disclaimer. ++ * * 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. ++ * * Neither the names of PolarSSL or XySSL nor the names of its contributors ++ * may be used to endorse or promote products derived from this software ++ * without specific prior written permission. ++ * ++ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ++ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT ++ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS ++ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT ++ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, ++ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED ++ * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR ++ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF ++ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING ++ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS ++ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ++ */ ++#ifndef POLARSSL_BIGNUM_H ++#define POLARSSL_BIGNUM_H ++ ++#include ++ ++#define POLARSSL_ERR_MPI_FILE_IO_ERROR -0x0002 ++#define POLARSSL_ERR_MPI_BAD_INPUT_DATA -0x0004 ++#define POLARSSL_ERR_MPI_INVALID_CHARACTER -0x0006 ++#define POLARSSL_ERR_MPI_BUFFER_TOO_SMALL -0x0008 ++#define POLARSSL_ERR_MPI_NEGATIVE_VALUE -0x000A ++#define POLARSSL_ERR_MPI_DIVISION_BY_ZERO -0x000C ++#define POLARSSL_ERR_MPI_NOT_ACCEPTABLE -0x000E ++ ++#define MPI_CHK(f) if( ( ret = f ) != 0 ) goto cleanup ++ ++/* ++ * Define the base integer type, architecture-wise ++ */ ++#if defined(POLARSSL_HAVE_INT8) ++typedef unsigned char t_int; ++typedef unsigned short t_dbl; ++#else ++#if defined(POLARSSL_HAVE_INT16) ++typedef unsigned short t_int; ++typedef unsigned long t_dbl; ++#else ++ typedef unsigned long t_int; ++ #if defined(_MSC_VER) && defined(_M_IX86) ++ typedef unsigned __int64 t_dbl; ++ #else ++ #if defined(__amd64__) || defined(__x86_64__) || \ ++ defined(__ppc64__) || defined(__powerpc64__) || \ ++ defined(__ia64__) || defined(__alpha__) ++ typedef unsigned int t_dbl __attribute__((mode(TI))); ++ #else ++ typedef unsigned long long t_dbl; ++ #endif ++ #endif ++#endif ++#endif ++ ++/** ++ * \brief MPI structure ++ */ ++typedef struct ++{ ++ int s; /*!< integer sign */ ++ int n; /*!< total # of limbs */ ++ t_int *p; /*!< pointer to limbs */ ++} ++mpi; ++ ++#ifdef __cplusplus ++extern "C" { ++#endif ++ ++/** ++ * \brief Initialize one or more mpi ++ */ ++void mpi_init( mpi *X, ... ); ++ ++/** ++ * \brief Unallocate one or more mpi ++ */ ++void mpi_free( mpi *X, ... ); ++ ++/** ++ * \brief Enlarge to the specified number of limbs ++ * ++ * \return 0 if successful, ++ * 1 if memory allocation failed ++ */ ++int mpi_grow( mpi *X, int nblimbs ); ++ ++/** ++ * \brief Copy the contents of Y into X ++ * ++ * \return 0 if successful, ++ * 1 if memory allocation failed ++ */ ++int mpi_copy( mpi *X, mpi *Y ); ++ ++/** ++ * \brief Swap the contents of X and Y ++ */ ++void mpi_swap( mpi *X, mpi *Y ); ++ ++/** ++ * \brief Set value from integer ++ * ++ * \return 0 if successful, ++ * 1 if memory allocation failed ++ */ ++int mpi_lset( mpi *X, int z ); ++ ++/** ++ * \brief Return the number of least significant bits ++ */ ++int mpi_lsb( mpi *X ); ++ ++/** ++ * \brief Return the number of most significant bits ++ */ ++int mpi_msb( mpi *X ); ++ ++/** ++ * \brief Return the total size in bytes ++ */ ++int mpi_size( mpi *X ); ++ ++/** ++ * \brief Import from an ASCII string ++ * ++ * \param X destination mpi ++ * \param radix input numeric base ++ * \param s null-terminated string buffer ++ * ++ * \return 0 if successful, or an POLARSSL_ERR_MPI_XXX error code ++ */ ++int mpi_read_string( mpi *X, int radix, char *s ); ++ ++/** ++ * \brief Export into an ASCII string ++ * ++ * \param X source mpi ++ * \param radix output numeric base ++ * \param s string buffer ++ * \param slen string buffer size ++ * ++ * \return 0 if successful, or an POLARSSL_ERR_MPI_XXX error code ++ * ++ * \note Call this function with *slen = 0 to obtain the ++ * minimum required buffer size in *slen. ++ */ ++int mpi_write_string( mpi *X, int radix, char *s, int *slen ); ++ ++/** ++ * \brief Read X from an opened file ++ * ++ * \param X destination mpi ++ * \param radix input numeric base ++ * \param fin input file handle ++ * ++ * \return 0 if successful, or an POLARSSL_ERR_MPI_XXX error code ++ */ ++int mpi_read_file( mpi *X, int radix, FILE *fin ); ++ ++/** ++ * \brief Write X into an opened file, or stdout ++ * ++ * \param p prefix, can be NULL ++ * \param X source mpi ++ * \param radix output numeric base ++ * \param fout output file handle ++ * ++ * \return 0 if successful, or an POLARSSL_ERR_MPI_XXX error code ++ * ++ * \note Set fout == NULL to print X on the console. ++ */ ++int mpi_write_file( char *p, mpi *X, int radix, FILE *fout ); ++ ++/** ++ * \brief Import X from unsigned binary data, big endian ++ * ++ * \param X destination mpi ++ * \param buf input buffer ++ * \param buflen input buffer size ++ * ++ * \return 0 if successful, ++ * 1 if memory allocation failed ++ */ ++int mpi_read_binary( mpi *X, unsigned char *buf, int buflen ); ++ ++/** ++ * \brief Export X into unsigned binary data, big endian ++ * ++ * \param X source mpi ++ * \param buf output buffer ++ * \param buflen output buffer size ++ * ++ * \return 0 if successful, ++ * POLARSSL_ERR_MPI_BUFFER_TOO_SMALL if buf isn't large enough ++ * ++ * \note Call this function with *buflen = 0 to obtain the ++ * minimum required buffer size in *buflen. ++ */ ++int mpi_write_binary( mpi *X, unsigned char *buf, int buflen ); ++ ++/** ++ * \brief Left-shift: X <<= count ++ * ++ * \return 0 if successful, ++ * 1 if memory allocation failed ++ */ ++int mpi_shift_l( mpi *X, int count ); ++ ++/** ++ * \brief Right-shift: X >>= count ++ * ++ * \return 0 if successful, ++ * 1 if memory allocation failed ++ */ ++int mpi_shift_r( mpi *X, int count ); ++ ++/** ++ * \brief Compare unsigned values ++ * ++ * \return 1 if |X| is greater than |Y|, ++ * -1 if |X| is lesser than |Y| or ++ * 0 if |X| is equal to |Y| ++ */ ++int mpi_cmp_abs( mpi *X, mpi *Y ); ++ ++/** ++ * \brief Compare signed values ++ * ++ * \return 1 if X is greater than Y, ++ * -1 if X is lesser than Y or ++ * 0 if X is equal to Y ++ */ ++int mpi_cmp_mpi( mpi *X, mpi *Y ); ++ ++/** ++ * \brief Compare signed values ++ * ++ * \return 1 if X is greater than z, ++ * -1 if X is lesser than z or ++ * 0 if X is equal to z ++ */ ++int mpi_cmp_int( mpi *X, int z ); ++ ++/** ++ * \brief Unsigned addition: X = |A| + |B| ++ * ++ * \return 0 if successful, ++ * 1 if memory allocation failed ++ */ ++int mpi_add_abs( mpi *X, mpi *A, mpi *B ); ++ ++/** ++ * \brief Unsigned substraction: X = |A| - |B| ++ * ++ * \return 0 if successful, ++ * POLARSSL_ERR_MPI_NEGATIVE_VALUE if B is greater than A ++ */ ++int mpi_sub_abs( mpi *X, mpi *A, mpi *B ); ++ ++/** ++ * \brief Signed addition: X = A + B ++ * ++ * \return 0 if successful, ++ * 1 if memory allocation failed ++ */ ++int mpi_add_mpi( mpi *X, mpi *A, mpi *B ); ++ ++/** ++ * \brief Signed substraction: X = A - B ++ * ++ * \return 0 if successful, ++ * 1 if memory allocation failed ++ */ ++int mpi_sub_mpi( mpi *X, mpi *A, mpi *B ); ++ ++/** ++ * \brief Signed addition: X = A + b ++ * ++ * \return 0 if successful, ++ * 1 if memory allocation failed ++ */ ++int mpi_add_int( mpi *X, mpi *A, int b ); ++ ++/** ++ * \brief Signed substraction: X = A - b ++ * ++ * \return 0 if successful, ++ * 1 if memory allocation failed ++ */ ++int mpi_sub_int( mpi *X, mpi *A, int b ); ++ ++/** ++ * \brief Baseline multiplication: X = A * B ++ * ++ * \return 0 if successful, ++ * 1 if memory allocation failed ++ */ ++int mpi_mul_mpi( mpi *X, mpi *A, mpi *B ); ++ ++/** ++ * \brief Baseline multiplication: X = A * b ++ * ++ * \return 0 if successful, ++ * 1 if memory allocation failed ++ */ ++int mpi_mul_int( mpi *X, mpi *A, t_int b ); ++ ++/** ++ * \brief Division by mpi: A = Q * B + R ++ * ++ * \return 0 if successful, ++ * 1 if memory allocation failed, ++ * POLARSSL_ERR_MPI_DIVISION_BY_ZERO if B == 0 ++ * ++ * \note Either Q or R can be NULL. ++ */ ++int mpi_div_mpi( mpi *Q, mpi *R, mpi *A, mpi *B ); ++ ++/** ++ * \brief Division by int: A = Q * b + R ++ * ++ * \return 0 if successful, ++ * 1 if memory allocation failed, ++ * POLARSSL_ERR_MPI_DIVISION_BY_ZERO if b == 0 ++ * ++ * \note Either Q or R can be NULL. ++ */ ++int mpi_div_int( mpi *Q, mpi *R, mpi *A, int b ); ++ ++/** ++ * \brief Modulo: R = A mod B ++ * ++ * \return 0 if successful, ++ * 1 if memory allocation failed, ++ * POLARSSL_ERR_MPI_DIVISION_BY_ZERO if B == 0 ++ */ ++int mpi_mod_mpi( mpi *R, mpi *A, mpi *B ); ++ ++/** ++ * \brief Modulo: r = A mod b ++ * ++ * \return 0 if successful, ++ * 1 if memory allocation failed, ++ * POLARSSL_ERR_MPI_DIVISION_BY_ZERO if b == 0 ++ */ ++int mpi_mod_int( t_int *r, mpi *A, int b ); ++ ++/** ++ * \brief Sliding-window exponentiation: X = A^E mod N ++ * ++ * \return 0 if successful, ++ * 1 if memory allocation failed, ++ * POLARSSL_ERR_MPI_BAD_INPUT_DATA if N is negative or even ++ * ++ * \note _RR is used to avoid re-computing R*R mod N across ++ * multiple calls, which speeds up things a bit. It can ++ * be set to NULL if the extra performance is unneeded. ++ */ ++int mpi_exp_mod( mpi *X, mpi *A, mpi *E, mpi *N, mpi *_RR ); ++ ++/** ++ * \brief Greatest common divisor: G = gcd(A, B) ++ * ++ * \return 0 if successful, ++ * 1 if memory allocation failed ++ */ ++int mpi_gcd( mpi *G, mpi *A, mpi *B ); ++ ++/** ++ * \brief Modular inverse: X = A^-1 mod N ++ * ++ * \return 0 if successful, ++ * 1 if memory allocation failed, ++ * POLARSSL_ERR_MPI_BAD_INPUT_DATA if N is negative or nil ++ * POLARSSL_ERR_MPI_NOT_ACCEPTABLE if A has no inverse mod N ++ */ ++int mpi_inv_mod( mpi *X, mpi *A, mpi *N ); ++ ++/** ++ * \brief Miller-Rabin primality test ++ * ++ * \return 0 if successful (probably prime), ++ * 1 if memory allocation failed, ++ * POLARSSL_ERR_MPI_NOT_ACCEPTABLE if X is not prime ++ */ ++int mpi_is_prime( mpi *X, int (*f_rng)(void *), void *p_rng ); ++ ++/** ++ * \brief Prime number generation ++ * ++ * \param X destination mpi ++ * \param nbits required size of X in bits ++ * \param dh_flag if 1, then (X-1)/2 will be prime too ++ * \param f_rng RNG function ++ * \param p_rng RNG parameter ++ * ++ * \return 0 if successful (probably prime), ++ * 1 if memory allocation failed, ++ * POLARSSL_ERR_MPI_BAD_INPUT_DATA if nbits is < 3 ++ */ ++int mpi_gen_prime( mpi *X, int nbits, int dh_flag, ++ int (*f_rng)(void *), void *p_rng ); ++ ++/** ++ * \brief Checkup routine ++ * ++ * \return 0 if successful, or 1 if the test failed ++ */ ++int mpi_self_test( int verbose ); ++ ++#ifdef __cplusplus ++} ++#endif ++ ++#endif /* bignum.h */ +diff --git a/feeds/luci/libs/luci-lib-px5g/src/polarssl/bn_mul.h b/feeds/luci/libs/luci-lib-px5g/src/polarssl/bn_mul.h +new file mode 100644 +index 0000000..f6d34da +--- /dev/null ++++ b/feeds/luci/libs/luci-lib-px5g/src/polarssl/bn_mul.h +@@ -0,0 +1,731 @@ ++/** ++ * \file bn_mul.h ++ * ++ * Based on XySSL: Copyright (C) 2006-2008 Christophe Devine ++ * ++ * Copyright (C) 2009 Paul Bakker ++ * ++ * All rights reserved. ++ * ++ * Redistribution and use in source and binary forms, with or without ++ * modification, are permitted provided that the following conditions ++ * are met: ++ * ++ * * Redistributions of source code must retain the above copyright ++ * notice, this list of conditions and the following disclaimer. ++ * * 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. ++ * * Neither the names of PolarSSL or XySSL nor the names of its contributors ++ * may be used to endorse or promote products derived from this software ++ * without specific prior written permission. ++ * ++ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ++ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT ++ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS ++ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT ++ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, ++ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED ++ * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR ++ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF ++ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING ++ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS ++ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ++ */ ++/* ++ * Multiply source vector [s] with b, add result ++ * to destination vector [d] and set carry c. ++ * ++ * Currently supports: ++ * ++ * . IA-32 (386+) . AMD64 / EM64T ++ * . IA-32 (SSE2) . Motorola 68000 ++ * . PowerPC, 32-bit . MicroBlaze ++ * . PowerPC, 64-bit . TriCore ++ * . SPARC v8 . ARM v3+ ++ * . Alpha . MIPS32 ++ * . C, longlong . C, generic ++ */ ++#ifndef POLARSSL_BN_MUL_H ++#define POLARSSL_BN_MUL_H ++ ++#include "polarssl/config.h" ++ ++#if defined(POLARSSL_HAVE_ASM) ++ ++#if defined(__GNUC__) ++#if defined(__i386__) ++ ++#define MULADDC_INIT \ ++ asm( "movl %%ebx, %0 " : "=m" (t)); \ ++ asm( "movl %0, %%esi " :: "m" (s)); \ ++ asm( "movl %0, %%edi " :: "m" (d)); \ ++ asm( "movl %0, %%ecx " :: "m" (c)); \ ++ asm( "movl %0, %%ebx " :: "m" (b)); ++ ++#define MULADDC_CORE \ ++ asm( "lodsl " ); \ ++ asm( "mull %ebx " ); \ ++ asm( "addl %ecx, %eax " ); \ ++ asm( "adcl $0, %edx " ); \ ++ asm( "addl (%edi), %eax " ); \ ++ asm( "adcl $0, %edx " ); \ ++ asm( "movl %edx, %ecx " ); \ ++ asm( "stosl " ); ++ ++#if defined(POLARSSL_HAVE_SSE2) ++ ++#define MULADDC_HUIT \ ++ asm( "movd %ecx, %mm1 " ); \ ++ asm( "movd %ebx, %mm0 " ); \ ++ asm( "movd (%edi), %mm3 " ); \ ++ asm( "paddq %mm3, %mm1 " ); \ ++ asm( "movd (%esi), %mm2 " ); \ ++ asm( "pmuludq %mm0, %mm2 " ); \ ++ asm( "movd 4(%esi), %mm4 " ); \ ++ asm( "pmuludq %mm0, %mm4 " ); \ ++ asm( "movd 8(%esi), %mm6 " ); \ ++ asm( "pmuludq %mm0, %mm6 " ); \ ++ asm( "movd 12(%esi), %mm7 " ); \ ++ asm( "pmuludq %mm0, %mm7 " ); \ ++ asm( "paddq %mm2, %mm1 " ); \ ++ asm( "movd 4(%edi), %mm3 " ); \ ++ asm( "paddq %mm4, %mm3 " ); \ ++ asm( "movd 8(%edi), %mm5 " ); \ ++ asm( "paddq %mm6, %mm5 " ); \ ++ asm( "movd 12(%edi), %mm4 " ); \ ++ asm( "paddq %mm4, %mm7 " ); \ ++ asm( "movd %mm1, (%edi) " ); \ ++ asm( "movd 16(%esi), %mm2 " ); \ ++ asm( "pmuludq %mm0, %mm2 " ); \ ++ asm( "psrlq $32, %mm1 " ); \ ++ asm( "movd 20(%esi), %mm4 " ); \ ++ asm( "pmuludq %mm0, %mm4 " ); \ ++ asm( "paddq %mm3, %mm1 " ); \ ++ asm( "movd 24(%esi), %mm6 " ); \ ++ asm( "pmuludq %mm0, %mm6 " ); \ ++ asm( "movd %mm1, 4(%edi) " ); \ ++ asm( "psrlq $32, %mm1 " ); \ ++ asm( "movd 28(%esi), %mm3 " ); \ ++ asm( "pmuludq %mm0, %mm3 " ); \ ++ asm( "paddq %mm5, %mm1 " ); \ ++ asm( "movd 16(%edi), %mm5 " ); \ ++ asm( "paddq %mm5, %mm2 " ); \ ++ asm( "movd %mm1, 8(%edi) " ); \ ++ asm( "psrlq $32, %mm1 " ); \ ++ asm( "paddq %mm7, %mm1 " ); \ ++ asm( "movd 20(%edi), %mm5 " ); \ ++ asm( "paddq %mm5, %mm4 " ); \ ++ asm( "movd %mm1, 12(%edi) " ); \ ++ asm( "psrlq $32, %mm1 " ); \ ++ asm( "paddq %mm2, %mm1 " ); \ ++ asm( "movd 24(%edi), %mm5 " ); \ ++ asm( "paddq %mm5, %mm6 " ); \ ++ asm( "movd %mm1, 16(%edi) " ); \ ++ asm( "psrlq $32, %mm1 " ); \ ++ asm( "paddq %mm4, %mm1 " ); \ ++ asm( "movd 28(%edi), %mm5 " ); \ ++ asm( "paddq %mm5, %mm3 " ); \ ++ asm( "movd %mm1, 20(%edi) " ); \ ++ asm( "psrlq $32, %mm1 " ); \ ++ asm( "paddq %mm6, %mm1 " ); \ ++ asm( "movd %mm1, 24(%edi) " ); \ ++ asm( "psrlq $32, %mm1 " ); \ ++ asm( "paddq %mm3, %mm1 " ); \ ++ asm( "movd %mm1, 28(%edi) " ); \ ++ asm( "addl $32, %edi " ); \ ++ asm( "addl $32, %esi " ); \ ++ asm( "psrlq $32, %mm1 " ); \ ++ asm( "movd %mm1, %ecx " ); ++ ++#define MULADDC_STOP \ ++ asm( "emms " ); \ ++ asm( "movl %0, %%ebx " :: "m" (t)); \ ++ asm( "movl %%ecx, %0 " : "=m" (c)); \ ++ asm( "movl %%edi, %0 " : "=m" (d)); \ ++ asm( "movl %%esi, %0 " : "=m" (s) :: \ ++ "eax", "ecx", "edx", "esi", "edi" ); ++ ++#else ++ ++#define MULADDC_STOP \ ++ asm( "movl %0, %%ebx " :: "m" (t)); \ ++ asm( "movl %%ecx, %0 " : "=m" (c)); \ ++ asm( "movl %%edi, %0 " : "=m" (d)); \ ++ asm( "movl %%esi, %0 " : "=m" (s) :: \ ++ "eax", "ecx", "edx", "esi", "edi" ); ++ ++#endif /* SSE2 */ ++#endif /* i386 */ ++ ++#if defined(__amd64__) || defined (__x86_64__) ++ ++#define MULADDC_INIT \ ++ asm( "movq %0, %%rsi " :: "m" (s)); \ ++ asm( "movq %0, %%rdi " :: "m" (d)); \ ++ asm( "movq %0, %%rcx " :: "m" (c)); \ ++ asm( "movq %0, %%rbx " :: "m" (b)); \ ++ asm( "xorq %r8, %r8 " ); ++ ++#define MULADDC_CORE \ ++ asm( "movq (%rsi),%rax " ); \ ++ asm( "mulq %rbx " ); \ ++ asm( "addq $8, %rsi " ); \ ++ asm( "addq %rcx, %rax " ); \ ++ asm( "movq %r8, %rcx " ); \ ++ asm( "adcq $0, %rdx " ); \ ++ asm( "nop " ); \ ++ asm( "addq %rax, (%rdi) " ); \ ++ asm( "adcq %rdx, %rcx " ); \ ++ asm( "addq $8, %rdi " ); ++ ++#define MULADDC_STOP \ ++ asm( "movq %%rcx, %0 " : "=m" (c)); \ ++ asm( "movq %%rdi, %0 " : "=m" (d)); \ ++ asm( "movq %%rsi, %0 " : "=m" (s) :: \ ++ "rax", "rcx", "rdx", "rbx", "rsi", "rdi", "r8" ); ++ ++#endif /* AMD64 */ ++ ++#if defined(__mc68020__) || defined(__mcpu32__) ++ ++#define MULADDC_INIT \ ++ asm( "movl %0, %%a2 " :: "m" (s)); \ ++ asm( "movl %0, %%a3 " :: "m" (d)); \ ++ asm( "movl %0, %%d3 " :: "m" (c)); \ ++ asm( "movl %0, %%d2 " :: "m" (b)); \ ++ asm( "moveq #0, %d0 " ); ++ ++#define MULADDC_CORE \ ++ asm( "movel %a2@+, %d1 " ); \ ++ asm( "mulul %d2, %d4:%d1 " ); \ ++ asm( "addl %d3, %d1 " ); \ ++ asm( "addxl %d0, %d4 " ); \ ++ asm( "moveq #0, %d3 " ); \ ++ asm( "addl %d1, %a3@+ " ); \ ++ asm( "addxl %d4, %d3 " ); ++ ++#define MULADDC_STOP \ ++ asm( "movl %%d3, %0 " : "=m" (c)); \ ++ asm( "movl %%a3, %0 " : "=m" (d)); \ ++ asm( "movl %%a2, %0 " : "=m" (s) :: \ ++ "d0", "d1", "d2", "d3", "d4", "a2", "a3" ); ++ ++#define MULADDC_HUIT \ ++ asm( "movel %a2@+, %d1 " ); \ ++ asm( "mulul %d2, %d4:%d1 " ); \ ++ asm( "addxl %d3, %d1 " ); \ ++ asm( "addxl %d0, %d4 " ); \ ++ asm( "addl %d1, %a3@+ " ); \ ++ asm( "movel %a2@+, %d1 " ); \ ++ asm( "mulul %d2, %d3:%d1 " ); \ ++ asm( "addxl %d4, %d1 " ); \ ++ asm( "addxl %d0, %d3 " ); \ ++ asm( "addl %d1, %a3@+ " ); \ ++ asm( "movel %a2@+, %d1 " ); \ ++ asm( "mulul %d2, %d4:%d1 " ); \ ++ asm( "addxl %d3, %d1 " ); \ ++ asm( "addxl %d0, %d4 " ); \ ++ asm( "addl %d1, %a3@+ " ); \ ++ asm( "movel %a2@+, %d1 " ); \ ++ asm( "mulul %d2, %d3:%d1 " ); \ ++ asm( "addxl %d4, %d1 " ); \ ++ asm( "addxl %d0, %d3 " ); \ ++ asm( "addl %d1, %a3@+ " ); \ ++ asm( "movel %a2@+, %d1 " ); \ ++ asm( "mulul %d2, %d4:%d1 " ); \ ++ asm( "addxl %d3, %d1 " ); \ ++ asm( "addxl %d0, %d4 " ); \ ++ asm( "addl %d1, %a3@+ " ); \ ++ asm( "movel %a2@+, %d1 " ); \ ++ asm( "mulul %d2, %d3:%d1 " ); \ ++ asm( "addxl %d4, %d1 " ); \ ++ asm( "addxl %d0, %d3 " ); \ ++ asm( "addl %d1, %a3@+ " ); \ ++ asm( "movel %a2@+, %d1 " ); \ ++ asm( "mulul %d2, %d4:%d1 " ); \ ++ asm( "addxl %d3, %d1 " ); \ ++ asm( "addxl %d0, %d4 " ); \ ++ asm( "addl %d1, %a3@+ " ); \ ++ asm( "movel %a2@+, %d1 " ); \ ++ asm( "mulul %d2, %d3:%d1 " ); \ ++ asm( "addxl %d4, %d1 " ); \ ++ asm( "addxl %d0, %d3 " ); \ ++ asm( "addl %d1, %a3@+ " ); \ ++ asm( "addxl %d0, %d3 " ); ++ ++#endif /* MC68000 */ ++ ++#if defined(__powerpc__) || defined(__ppc__) ++#if defined(__powerpc64__) || defined(__ppc64__) ++ ++#if defined(__MACH__) && defined(__APPLE__) ++ ++#define MULADDC_INIT \ ++ asm( "ld r3, %0 " :: "m" (s)); \ ++ asm( "ld r4, %0 " :: "m" (d)); \ ++ asm( "ld r5, %0 " :: "m" (c)); \ ++ asm( "ld r6, %0 " :: "m" (b)); \ ++ asm( "addi r3, r3, -8 " ); \ ++ asm( "addi r4, r4, -8 " ); \ ++ asm( "addic r5, r5, 0 " ); ++ ++#define MULADDC_CORE \ ++ asm( "ldu r7, 8(r3) " ); \ ++ asm( "mulld r8, r7, r6 " ); \ ++ asm( "mulhdu r9, r7, r6 " ); \ ++ asm( "adde r8, r8, r5 " ); \ ++ asm( "ld r7, 8(r4) " ); \ ++ asm( "addze r5, r9 " ); \ ++ asm( "addc r8, r8, r7 " ); \ ++ asm( "stdu r8, 8(r4) " ); ++ ++#define MULADDC_STOP \ ++ asm( "addze r5, r5 " ); \ ++ asm( "addi r4, r4, 8 " ); \ ++ asm( "addi r3, r3, 8 " ); \ ++ asm( "std r5, %0 " : "=m" (c)); \ ++ asm( "std r4, %0 " : "=m" (d)); \ ++ asm( "std r3, %0 " : "=m" (s) :: \ ++ "r3", "r4", "r5", "r6", "r7", "r8", "r9" ); ++ ++#else ++ ++#define MULADDC_INIT \ ++ asm( "ld %%r3, %0 " :: "m" (s)); \ ++ asm( "ld %%r4, %0 " :: "m" (d)); \ ++ asm( "ld %%r5, %0 " :: "m" (c)); \ ++ asm( "ld %%r6, %0 " :: "m" (b)); \ ++ asm( "addi %r3, %r3, -8 " ); \ ++ asm( "addi %r4, %r4, -8 " ); \ ++ asm( "addic %r5, %r5, 0 " ); ++ ++#define MULADDC_CORE \ ++ asm( "ldu %r7, 8(%r3) " ); \ ++ asm( "mulld %r8, %r7, %r6 " ); \ ++ asm( "mulhdu %r9, %r7, %r6 " ); \ ++ asm( "adde %r8, %r8, %r5 " ); \ ++ asm( "ld %r7, 8(%r4) " ); \ ++ asm( "addze %r5, %r9 " ); \ ++ asm( "addc %r8, %r8, %r7 " ); \ ++ asm( "stdu %r8, 8(%r4) " ); ++ ++#define MULADDC_STOP \ ++ asm( "addze %r5, %r5 " ); \ ++ asm( "addi %r4, %r4, 8 " ); \ ++ asm( "addi %r3, %r3, 8 " ); \ ++ asm( "std %%r5, %0 " : "=m" (c)); \ ++ asm( "std %%r4, %0 " : "=m" (d)); \ ++ asm( "std %%r3, %0 " : "=m" (s) :: \ ++ "r3", "r4", "r5", "r6", "r7", "r8", "r9" ); ++ ++#endif ++ ++#else /* PPC32 */ ++ ++#if defined(__MACH__) && defined(__APPLE__) ++ ++#define MULADDC_INIT \ ++ asm( "lwz r3, %0 " :: "m" (s)); \ ++ asm( "lwz r4, %0 " :: "m" (d)); \ ++ asm( "lwz r5, %0 " :: "m" (c)); \ ++ asm( "lwz r6, %0 " :: "m" (b)); \ ++ asm( "addi r3, r3, -4 " ); \ ++ asm( "addi r4, r4, -4 " ); \ ++ asm( "addic r5, r5, 0 " ); ++ ++#define MULADDC_CORE \ ++ asm( "lwzu r7, 4(r3) " ); \ ++ asm( "mullw r8, r7, r6 " ); \ ++ asm( "mulhwu r9, r7, r6 " ); \ ++ asm( "adde r8, r8, r5 " ); \ ++ asm( "lwz r7, 4(r4) " ); \ ++ asm( "addze r5, r9 " ); \ ++ asm( "addc r8, r8, r7 " ); \ ++ asm( "stwu r8, 4(r4) " ); ++ ++#define MULADDC_STOP \ ++ asm( "addze r5, r5 " ); \ ++ asm( "addi r4, r4, 4 " ); \ ++ asm( "addi r3, r3, 4 " ); \ ++ asm( "stw r5, %0 " : "=m" (c)); \ ++ asm( "stw r4, %0 " : "=m" (d)); \ ++ asm( "stw r3, %0 " : "=m" (s) :: \ ++ "r3", "r4", "r5", "r6", "r7", "r8", "r9" ); ++ ++#else ++ ++#define MULADDC_INIT \ ++ asm( "lwz %%r3, %0 " :: "m" (s)); \ ++ asm( "lwz %%r4, %0 " :: "m" (d)); \ ++ asm( "lwz %%r5, %0 " :: "m" (c)); \ ++ asm( "lwz %%r6, %0 " :: "m" (b)); \ ++ asm( "addi %r3, %r3, -4 " ); \ ++ asm( "addi %r4, %r4, -4 " ); \ ++ asm( "addic %r5, %r5, 0 " ); ++ ++#define MULADDC_CORE \ ++ asm( "lwzu %r7, 4(%r3) " ); \ ++ asm( "mullw %r8, %r7, %r6 " ); \ ++ asm( "mulhwu %r9, %r7, %r6 " ); \ ++ asm( "adde %r8, %r8, %r5 " ); \ ++ asm( "lwz %r7, 4(%r4) " ); \ ++ asm( "addze %r5, %r9 " ); \ ++ asm( "addc %r8, %r8, %r7 " ); \ ++ asm( "stwu %r8, 4(%r4) " ); ++ ++#define MULADDC_STOP \ ++ asm( "addze %r5, %r5 " ); \ ++ asm( "addi %r4, %r4, 4 " ); \ ++ asm( "addi %r3, %r3, 4 " ); \ ++ asm( "stw %%r5, %0 " : "=m" (c)); \ ++ asm( "stw %%r4, %0 " : "=m" (d)); \ ++ asm( "stw %%r3, %0 " : "=m" (s) :: \ ++ "r3", "r4", "r5", "r6", "r7", "r8", "r9" ); ++ ++#endif ++ ++#endif /* PPC32 */ ++#endif /* PPC64 */ ++ ++#if defined(__sparc__) ++ ++#define MULADDC_INIT \ ++ asm( "ld %0, %%o0 " :: "m" (s)); \ ++ asm( "ld %0, %%o1 " :: "m" (d)); \ ++ asm( "ld %0, %%o2 " :: "m" (c)); \ ++ asm( "ld %0, %%o3 " :: "m" (b)); ++ ++#define MULADDC_CORE \ ++ asm( "ld [%o0], %o4 " ); \ ++ asm( "inc 4, %o0 " ); \ ++ asm( "ld [%o1], %o5 " ); \ ++ asm( "umul %o3, %o4, %o4 " ); \ ++ asm( "addcc %o4, %o2, %o4 " ); \ ++ asm( "rd %y, %g1 " ); \ ++ asm( "addx %g1, 0, %g1 " ); \ ++ asm( "addcc %o4, %o5, %o4 " ); \ ++ asm( "st %o4, [%o1] " ); \ ++ asm( "addx %g1, 0, %o2 " ); \ ++ asm( "inc 4, %o1 " ); ++ ++#define MULADDC_STOP \ ++ asm( "st %%o2, %0 " : "=m" (c)); \ ++ asm( "st %%o1, %0 " : "=m" (d)); \ ++ asm( "st %%o0, %0 " : "=m" (s) :: \ ++ "g1", "o0", "o1", "o2", "o3", "o4", "o5" ); ++ ++#endif /* SPARCv8 */ ++ ++#if defined(__microblaze__) || defined(microblaze) ++ ++#define MULADDC_INIT \ ++ asm( "lwi r3, %0 " :: "m" (s)); \ ++ asm( "lwi r4, %0 " :: "m" (d)); \ ++ asm( "lwi r5, %0 " :: "m" (c)); \ ++ asm( "lwi r6, %0 " :: "m" (b)); \ ++ asm( "andi r7, r6, 0xffff" ); \ ++ asm( "bsrli r6, r6, 16 " ); ++ ++#define MULADDC_CORE \ ++ asm( "lhui r8, r3, 0 " ); \ ++ asm( "addi r3, r3, 2 " ); \ ++ asm( "lhui r9, r3, 0 " ); \ ++ asm( "addi r3, r3, 2 " ); \ ++ asm( "mul r10, r9, r6 " ); \ ++ asm( "mul r11, r8, r7 " ); \ ++ asm( "mul r12, r9, r7 " ); \ ++ asm( "mul r13, r8, r6 " ); \ ++ asm( "bsrli r8, r10, 16 " ); \ ++ asm( "bsrli r9, r11, 16 " ); \ ++ asm( "add r13, r13, r8 " ); \ ++ asm( "add r13, r13, r9 " ); \ ++ asm( "bslli r10, r10, 16 " ); \ ++ asm( "bslli r11, r11, 16 " ); \ ++ asm( "add r12, r12, r10 " ); \ ++ asm( "addc r13, r13, r0 " ); \ ++ asm( "add r12, r12, r11 " ); \ ++ asm( "addc r13, r13, r0 " ); \ ++ asm( "lwi r10, r4, 0 " ); \ ++ asm( "add r12, r12, r10 " ); \ ++ asm( "addc r13, r13, r0 " ); \ ++ asm( "add r12, r12, r5 " ); \ ++ asm( "addc r5, r13, r0 " ); \ ++ asm( "swi r12, r4, 0 " ); \ ++ asm( "addi r4, r4, 4 " ); ++ ++#define MULADDC_STOP \ ++ asm( "swi r5, %0 " : "=m" (c)); \ ++ asm( "swi r4, %0 " : "=m" (d)); \ ++ asm( "swi r3, %0 " : "=m" (s) :: \ ++ "r3", "r4" , "r5" , "r6" , "r7" , "r8" , \ ++ "r9", "r10", "r11", "r12", "r13" ); ++ ++#endif /* MicroBlaze */ ++ ++#if defined(__tricore__) ++ ++#define MULADDC_INIT \ ++ asm( "ld.a %%a2, %0 " :: "m" (s)); \ ++ asm( "ld.a %%a3, %0 " :: "m" (d)); \ ++ asm( "ld.w %%d4, %0 " :: "m" (c)); \ ++ asm( "ld.w %%d1, %0 " :: "m" (b)); \ ++ asm( "xor %d5, %d5 " ); ++ ++#define MULADDC_CORE \ ++ asm( "ld.w %d0, [%a2+] " ); \ ++ asm( "madd.u %e2, %e4, %d0, %d1 " ); \ ++ asm( "ld.w %d0, [%a3] " ); \ ++ asm( "addx %d2, %d2, %d0 " ); \ ++ asm( "addc %d3, %d3, 0 " ); \ ++ asm( "mov %d4, %d3 " ); \ ++ asm( "st.w [%a3+], %d2 " ); ++ ++#define MULADDC_STOP \ ++ asm( "st.w %0, %%d4 " : "=m" (c)); \ ++ asm( "st.a %0, %%a3 " : "=m" (d)); \ ++ asm( "st.a %0, %%a2 " : "=m" (s) :: \ ++ "d0", "d1", "e2", "d4", "a2", "a3" ); ++ ++#endif /* TriCore */ ++ ++#if defined(__arm__) ++ ++#define MULADDC_INIT \ ++ asm( "ldr r0, %0 " :: "m" (s)); \ ++ asm( "ldr r1, %0 " :: "m" (d)); \ ++ asm( "ldr r2, %0 " :: "m" (c)); \ ++ asm( "ldr r3, %0 " :: "m" (b)); ++ ++#define MULADDC_CORE \ ++ asm( "ldr r4, [r0], #4 " ); \ ++ asm( "mov r5, #0 " ); \ ++ asm( "ldr r6, [r1] " ); \ ++ asm( "umlal r2, r5, r3, r4 " ); \ ++ asm( "adds r7, r6, r2 " ); \ ++ asm( "adc r2, r5, #0 " ); \ ++ asm( "str r7, [r1], #4 " ); ++ ++#define MULADDC_STOP \ ++ asm( "str r2, %0 " : "=m" (c)); \ ++ asm( "str r1, %0 " : "=m" (d)); \ ++ asm( "str r0, %0 " : "=m" (s) :: \ ++ "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7" ); ++ ++#endif /* ARMv3 */ ++ ++#if defined(__alpha__) ++ ++#define MULADDC_INIT \ ++ asm( "ldq $1, %0 " :: "m" (s)); \ ++ asm( "ldq $2, %0 " :: "m" (d)); \ ++ asm( "ldq $3, %0 " :: "m" (c)); \ ++ asm( "ldq $4, %0 " :: "m" (b)); ++ ++#define MULADDC_CORE \ ++ asm( "ldq $6, 0($1) " ); \ ++ asm( "addq $1, 8, $1 " ); \ ++ asm( "mulq $6, $4, $7 " ); \ ++ asm( "umulh $6, $4, $6 " ); \ ++ asm( "addq $7, $3, $7 " ); \ ++ asm( "cmpult $7, $3, $3 " ); \ ++ asm( "ldq $5, 0($2) " ); \ ++ asm( "addq $7, $5, $7 " ); \ ++ asm( "cmpult $7, $5, $5 " ); \ ++ asm( "stq $7, 0($2) " ); \ ++ asm( "addq $2, 8, $2 " ); \ ++ asm( "addq $6, $3, $3 " ); \ ++ asm( "addq $5, $3, $3 " ); ++ ++#define MULADDC_STOP \ ++ asm( "stq $3, %0 " : "=m" (c)); \ ++ asm( "stq $2, %0 " : "=m" (d)); \ ++ asm( "stq $1, %0 " : "=m" (s) :: \ ++ "$1", "$2", "$3", "$4", "$5", "$6", "$7" ); ++ ++#endif /* Alpha */ ++ ++#if defined(__mips__) ++ ++#define MULADDC_INIT \ ++ asm( "lw $10, %0 " :: "m" (s)); \ ++ asm( "lw $11, %0 " :: "m" (d)); \ ++ asm( "lw $12, %0 " :: "m" (c)); \ ++ asm( "lw $13, %0 " :: "m" (b)); ++ ++#define MULADDC_CORE \ ++ asm( "lw $14, 0($10) " ); \ ++ asm( "multu $13, $14 " ); \ ++ asm( "addi $10, $10, 4 " ); \ ++ asm( "mflo $14 " ); \ ++ asm( "mfhi $9 " ); \ ++ asm( "addu $14, $12, $14 " ); \ ++ asm( "lw $15, 0($11) " ); \ ++ asm( "sltu $12, $14, $12 " ); \ ++ asm( "addu $15, $14, $15 " ); \ ++ asm( "sltu $14, $15, $14 " ); \ ++ asm( "addu $12, $12, $9 " ); \ ++ asm( "sw $15, 0($11) " ); \ ++ asm( "addu $12, $12, $14 " ); \ ++ asm( "addi $11, $11, 4 " ); ++ ++#define MULADDC_STOP \ ++ asm( "sw $12, %0 " : "=m" (c)); \ ++ asm( "sw $11, %0 " : "=m" (d)); \ ++ asm( "sw $10, %0 " : "=m" (s) :: \ ++ "$9", "$10", "$11", "$12", "$13", "$14", "$15" ); ++ ++#endif /* MIPS */ ++#endif /* GNUC */ ++ ++#if (defined(_MSC_VER) && defined(_M_IX86)) || defined(__WATCOMC__) ++ ++#define MULADDC_INIT \ ++ __asm mov esi, s \ ++ __asm mov edi, d \ ++ __asm mov ecx, c \ ++ __asm mov ebx, b ++ ++#define MULADDC_CORE \ ++ __asm lodsd \ ++ __asm mul ebx \ ++ __asm add eax, ecx \ ++ __asm adc edx, 0 \ ++ __asm add eax, [edi] \ ++ __asm adc edx, 0 \ ++ __asm mov ecx, edx \ ++ __asm stosd ++ ++#if defined(POLARSSL_HAVE_SSE2) ++ ++#define EMIT __asm _emit ++ ++#define MULADDC_HUIT \ ++ EMIT 0x0F EMIT 0x6E EMIT 0xC9 \ ++ EMIT 0x0F EMIT 0x6E EMIT 0xC3 \ ++ EMIT 0x0F EMIT 0x6E EMIT 0x1F \ ++ EMIT 0x0F EMIT 0xD4 EMIT 0xCB \ ++ EMIT 0x0F EMIT 0x6E EMIT 0x16 \ ++ EMIT 0x0F EMIT 0xF4 EMIT 0xD0 \ ++ EMIT 0x0F EMIT 0x6E EMIT 0x66 EMIT 0x04 \ ++ EMIT 0x0F EMIT 0xF4 EMIT 0xE0 \ ++ EMIT 0x0F EMIT 0x6E EMIT 0x76 EMIT 0x08 \ ++ EMIT 0x0F EMIT 0xF4 EMIT 0xF0 \ ++ EMIT 0x0F EMIT 0x6E EMIT 0x7E EMIT 0x0C \ ++ EMIT 0x0F EMIT 0xF4 EMIT 0xF8 \ ++ EMIT 0x0F EMIT 0xD4 EMIT 0xCA \ ++ EMIT 0x0F EMIT 0x6E EMIT 0x5F EMIT 0x04 \ ++ EMIT 0x0F EMIT 0xD4 EMIT 0xDC \ ++ EMIT 0x0F EMIT 0x6E EMIT 0x6F EMIT 0x08 \ ++ EMIT 0x0F EMIT 0xD4 EMIT 0xEE \ ++ EMIT 0x0F EMIT 0x6E EMIT 0x67 EMIT 0x0C \ ++ EMIT 0x0F EMIT 0xD4 EMIT 0xFC \ ++ EMIT 0x0F EMIT 0x7E EMIT 0x0F \ ++ EMIT 0x0F EMIT 0x6E EMIT 0x56 EMIT 0x10 \ ++ EMIT 0x0F EMIT 0xF4 EMIT 0xD0 \ ++ EMIT 0x0F EMIT 0x73 EMIT 0xD1 EMIT 0x20 \ ++ EMIT 0x0F EMIT 0x6E EMIT 0x66 EMIT 0x14 \ ++ EMIT 0x0F EMIT 0xF4 EMIT 0xE0 \ ++ EMIT 0x0F EMIT 0xD4 EMIT 0xCB \ ++ EMIT 0x0F EMIT 0x6E EMIT 0x76 EMIT 0x18 \ ++ EMIT 0x0F EMIT 0xF4 EMIT 0xF0 \ ++ EMIT 0x0F EMIT 0x7E EMIT 0x4F EMIT 0x04 \ ++ EMIT 0x0F EMIT 0x73 EMIT 0xD1 EMIT 0x20 \ ++ EMIT 0x0F EMIT 0x6E EMIT 0x5E EMIT 0x1C \ ++ EMIT 0x0F EMIT 0xF4 EMIT 0xD8 \ ++ EMIT 0x0F EMIT 0xD4 EMIT 0xCD \ ++ EMIT 0x0F EMIT 0x6E EMIT 0x6F EMIT 0x10 \ ++ EMIT 0x0F EMIT 0xD4 EMIT 0xD5 \ ++ EMIT 0x0F EMIT 0x7E EMIT 0x4F EMIT 0x08 \ ++ EMIT 0x0F EMIT 0x73 EMIT 0xD1 EMIT 0x20 \ ++ EMIT 0x0F EMIT 0xD4 EMIT 0xCF \ ++ EMIT 0x0F EMIT 0x6E EMIT 0x6F EMIT 0x14 \ ++ EMIT 0x0F EMIT 0xD4 EMIT 0xE5 \ ++ EMIT 0x0F EMIT 0x7E EMIT 0x4F EMIT 0x0C \ ++ EMIT 0x0F EMIT 0x73 EMIT 0xD1 EMIT 0x20 \ ++ EMIT 0x0F EMIT 0xD4 EMIT 0xCA \ ++ EMIT 0x0F EMIT 0x6E EMIT 0x6F EMIT 0x18 \ ++ EMIT 0x0F EMIT 0xD4 EMIT 0xF5 \ ++ EMIT 0x0F EMIT 0x7E EMIT 0x4F EMIT 0x10 \ ++ EMIT 0x0F EMIT 0x73 EMIT 0xD1 EMIT 0x20 \ ++ EMIT 0x0F EMIT 0xD4 EMIT 0xCC \ ++ EMIT 0x0F EMIT 0x6E EMIT 0x6F EMIT 0x1C \ ++ EMIT 0x0F EMIT 0xD4 EMIT 0xDD \ ++ EMIT 0x0F EMIT 0x7E EMIT 0x4F EMIT 0x14 \ ++ EMIT 0x0F EMIT 0x73 EMIT 0xD1 EMIT 0x20 \ ++ EMIT 0x0F EMIT 0xD4 EMIT 0xCE \ ++ EMIT 0x0F EMIT 0x7E EMIT 0x4F EMIT 0x18 \ ++ EMIT 0x0F EMIT 0x73 EMIT 0xD1 EMIT 0x20 \ ++ EMIT 0x0F EMIT 0xD4 EMIT 0xCB \ ++ EMIT 0x0F EMIT 0x7E EMIT 0x4F EMIT 0x1C \ ++ EMIT 0x83 EMIT 0xC7 EMIT 0x20 \ ++ EMIT 0x83 EMIT 0xC6 EMIT 0x20 \ ++ EMIT 0x0F EMIT 0x73 EMIT 0xD1 EMIT 0x20 \ ++ EMIT 0x0F EMIT 0x7E EMIT 0xC9 ++ ++#define MULADDC_STOP \ ++ EMIT 0x0F EMIT 0x77 \ ++ __asm mov c, ecx \ ++ __asm mov d, edi \ ++ __asm mov s, esi \ ++ ++#else ++ ++#define MULADDC_STOP \ ++ __asm mov c, ecx \ ++ __asm mov d, edi \ ++ __asm mov s, esi \ ++ ++#endif /* SSE2 */ ++#endif /* MSVC */ ++ ++#endif /* POLARSSL_HAVE_ASM */ ++ ++#if !defined(MULADDC_CORE) ++#if defined(POLARSSL_HAVE_LONGLONG) ++ ++#define MULADDC_INIT \ ++{ \ ++ t_dbl r; \ ++ t_int r0, r1; ++ ++#define MULADDC_CORE \ ++ r = *(s++) * (t_dbl) b; \ ++ r0 = r; \ ++ r1 = r >> biL; \ ++ r0 += c; r1 += (r0 < c); \ ++ r0 += *d; r1 += (r0 < *d); \ ++ c = r1; *(d++) = r0; ++ ++#define MULADDC_STOP \ ++} ++ ++#else ++#define MULADDC_INIT \ ++{ \ ++ t_int s0, s1, b0, b1; \ ++ t_int r0, r1, rx, ry; \ ++ b0 = ( b << biH ) >> biH; \ ++ b1 = ( b >> biH ); ++ ++#define MULADDC_CORE \ ++ s0 = ( *s << biH ) >> biH; \ ++ s1 = ( *s >> biH ); s++; \ ++ rx = s0 * b1; r0 = s0 * b0; \ ++ ry = s1 * b0; r1 = s1 * b1; \ ++ r1 += ( rx >> biH ); \ ++ r1 += ( ry >> biH ); \ ++ rx <<= biH; ry <<= biH; \ ++ r0 += rx; r1 += (r0 < rx); \ ++ r0 += ry; r1 += (r0 < ry); \ ++ r0 += c; r1 += (r0 < c); \ ++ r0 += *d; r1 += (r0 < *d); \ ++ c = r1; *(d++) = r0; ++ ++#define MULADDC_STOP \ ++} ++ ++#endif /* C (generic) */ ++#endif /* C (longlong) */ ++ ++#endif /* bn_mul.h */ +diff --git a/feeds/luci/libs/luci-lib-px5g/src/polarssl/config.h b/feeds/luci/libs/luci-lib-px5g/src/polarssl/config.h +new file mode 100644 +index 0000000..6463e52 +--- /dev/null ++++ b/feeds/luci/libs/luci-lib-px5g/src/polarssl/config.h +@@ -0,0 +1,329 @@ ++/** ++ * \file config.h ++ * ++ * Based on XySSL: Copyright (C) 2006-2008 Christophe Devine ++ * ++ * Copyright (C) 2009 Paul Bakker ++ * ++ * All rights reserved. ++ * ++ * Redistribution and use in source and binary forms, with or without ++ * modification, are permitted provided that the following conditions ++ * are met: ++ * ++ * * Redistributions of source code must retain the above copyright ++ * notice, this list of conditions and the following disclaimer. ++ * * 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. ++ * * Neither the names of PolarSSL or XySSL nor the names of its contributors ++ * may be used to endorse or promote products derived from this software ++ * without specific prior written permission. ++ * ++ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ++ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT ++ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS ++ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT ++ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, ++ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED ++ * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR ++ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF ++ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING ++ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS ++ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ++ * ++ * This set of compile-time options may be used to enable ++ * or disable features selectively, and reduce the global ++ * memory footprint. ++ */ ++#ifndef POLARSSL_CONFIG_H ++#define POLARSSL_CONFIG_H ++ ++#ifndef _CRT_SECURE_NO_DEPRECATE ++#define _CRT_SECURE_NO_DEPRECATE 1 ++#endif ++ ++/* ++ * Uncomment if native integers are 8-bit wide. ++ * ++#define POLARSSL_HAVE_INT8 ++ */ ++ ++/* ++ * Uncomment if native integers are 16-bit wide. ++ * ++#define POLARSSL_HAVE_INT16 ++ */ ++ ++/* ++ * Uncomment if the compiler supports long long. ++ */ ++#define POLARSSL_HAVE_LONGLONG ++ ++ ++/* ++ * Uncomment to enable the use of assembly code. ++ */ ++#define POLARSSL_HAVE_ASM ++ ++/* ++ * Uncomment if the CPU supports SSE2 (IA-32 specific). ++ * ++#define POLARSSL_HAVE_SSE2 ++ */ ++ ++/* ++ * Enable all SSL/TLS debugging messages. ++ */ ++#define POLARSSL_DEBUG_MSG ++ ++/* ++ * Enable the checkup functions (*_self_test). ++ */ ++#define POLARSSL_SELF_TEST ++ ++/* ++ * Enable the prime-number generation code. ++ */ ++#define POLARSSL_GENPRIME ++ ++/* ++ * Uncomment this macro to store the AES tables in ROM. ++ * ++#define POLARSSL_AES_ROM_TABLES ++ */ ++ ++/* ++ * Module: library/aes.c ++ * Caller: library/ssl_tls.c ++ * ++ * This module enables the following ciphersuites: ++ * SSL_RSA_AES_128_SHA ++ * SSL_RSA_AES_256_SHA ++ * SSL_EDH_RSA_AES_256_SHA ++ */ ++#define POLARSSL_AES_C ++ ++/* ++ * Module: library/arc4.c ++ * Caller: library/ssl_tls.c ++ * ++ * This module enables the following ciphersuites: ++ * SSL_RSA_RC4_128_MD5 ++ * SSL_RSA_RC4_128_SHA ++ */ ++#define POLARSSL_ARC4_C ++ ++/* ++ * Module: library/base64.c ++ * Caller: library/x509parse.c ++ * ++ * This module is required for X.509 support. ++ */ ++#define POLARSSL_BASE64_C ++ ++/* ++ * Module: library/bignum.c ++ * Caller: library/dhm.c ++ * library/rsa.c ++ * library/ssl_tls.c ++ * library/x509parse.c ++ * ++ * This module is required for RSA and DHM support. ++ */ ++#define POLARSSL_BIGNUM_C ++ ++/* ++ * Module: library/camellia.c ++ * Caller: ++ * ++ * This module enabled the following cipher suites: ++ */ ++#define POLARSSL_CAMELLIA_C ++ ++/* ++ * Module: library/certs.c ++ * Caller: ++ * ++ * This module is used for testing (ssl_client/server). ++ */ ++#define POLARSSL_CERTS_C ++ ++/* ++ * Module: library/debug.c ++ * Caller: library/ssl_cli.c ++ * library/ssl_srv.c ++ * library/ssl_tls.c ++ * ++ * This module provides debugging functions. ++ */ ++#define POLARSSL_DEBUG_C ++ ++/* ++ * Module: library/des.c ++ * Caller: library/ssl_tls.c ++ * ++ * This module enables the following ciphersuites: ++ * SSL_RSA_DES_168_SHA ++ * SSL_EDH_RSA_DES_168_SHA ++ */ ++#define POLARSSL_DES_C ++ ++/* ++ * Module: library/dhm.c ++ * Caller: library/ssl_cli.c ++ * library/ssl_srv.c ++ * ++ * This module enables the following ciphersuites: ++ * SSL_EDH_RSA_DES_168_SHA ++ * SSL_EDH_RSA_AES_256_SHA ++ */ ++#define POLARSSL_DHM_C ++ ++/* ++ * Module: library/havege.c ++ * Caller: ++ * ++ * This module enables the HAVEGE random number generator. ++ */ ++#define POLARSSL_HAVEGE_C ++ ++/* ++ * Module: library/md2.c ++ * Caller: library/x509parse.c ++ * ++ * Uncomment to enable support for (rare) MD2-signed X.509 certs. ++ * ++#define POLARSSL_MD2_C ++ */ ++ ++/* ++ * Module: library/md4.c ++ * Caller: library/x509parse.c ++ * ++ * Uncomment to enable support for (rare) MD4-signed X.509 certs. ++ * ++#define POLARSSL_MD4_C ++ */ ++ ++/* ++ * Module: library/md5.c ++ * Caller: library/ssl_tls.c ++ * library/x509parse.c ++ * ++ * This module is required for SSL/TLS and X.509. ++ */ ++#define POLARSSL_MD5_C ++ ++/* ++ * Module: library/net.c ++ * Caller: ++ * ++ * This module provides TCP/IP networking routines. ++ */ ++#define POLARSSL_NET_C ++ ++/* ++ * Module: library/padlock.c ++ * Caller: library/aes.c ++ * ++ * This modules adds support for the VIA PadLock on x86. ++ */ ++#define POLARSSL_PADLOCK_C ++ ++/* ++ * Module: library/rsa.c ++ * Caller: library/ssl_cli.c ++ * library/ssl_srv.c ++ * library/ssl_tls.c ++ * library/x509.c ++ * ++ * This module is required for SSL/TLS and MD5-signed certificates. ++ */ ++#define POLARSSL_RSA_C ++ ++/* ++ * Module: library/sha1.c ++ * Caller: library/ssl_cli.c ++ * library/ssl_srv.c ++ * library/ssl_tls.c ++ * library/x509parse.c ++ * ++ * This module is required for SSL/TLS and SHA1-signed certificates. ++ */ ++#define POLARSSL_SHA1_C ++ ++/* ++ * Module: library/sha2.c ++ * Caller: ++ * ++ * This module adds support for SHA-224 and SHA-256. ++ */ ++#define POLARSSL_SHA2_C ++ ++/* ++ * Module: library/sha4.c ++ * Caller: ++ * ++ * This module adds support for SHA-384 and SHA-512. ++ */ ++#define POLARSSL_SHA4_C ++ ++/* ++ * Module: library/ssl_cli.c ++ * Caller: ++ * ++ * This module is required for SSL/TLS client support. ++ */ ++#define POLARSSL_SSL_CLI_C ++ ++/* ++ * Module: library/ssl_srv.c ++ * Caller: ++ * ++ * This module is required for SSL/TLS server support. ++ */ ++#define POLARSSL_SSL_SRV_C ++ ++/* ++ * Module: library/ssl_tls.c ++ * Caller: library/ssl_cli.c ++ * library/ssl_srv.c ++ * ++ * This module is required for SSL/TLS. ++ */ ++#define POLARSSL_SSL_TLS_C ++ ++/* ++ * Module: library/timing.c ++ * Caller: library/havege.c ++ * ++ * This module is used by the HAVEGE random number generator. ++ */ ++#define POLARSSL_TIMING_C ++ ++/* ++ * Module: library/x509parse.c ++ * Caller: library/ssl_cli.c ++ * library/ssl_srv.c ++ * library/ssl_tls.c ++ * ++ * This module is required for X.509 certificate parsing. ++ */ ++#define POLARSSL_X509_PARSE_C ++ ++/* ++ * Module: library/x509_write.c ++ * Caller: ++ * ++ * This module is required for X.509 certificate writing. ++ */ ++#define POLARSSL_X509_WRITE_C ++ ++/* ++ * Module: library/xtea.c ++ * Caller: ++ */ ++#define POLARSSL_XTEA_C ++ ++#endif /* config.h */ +diff --git a/feeds/luci/libs/luci-lib-px5g/src/polarssl/havege.h b/feeds/luci/libs/luci-lib-px5g/src/polarssl/havege.h +new file mode 100644 +index 0000000..c27ceca +--- /dev/null ++++ b/feeds/luci/libs/luci-lib-px5g/src/polarssl/havege.h +@@ -0,0 +1,75 @@ ++/** ++ * \file havege.h ++ * ++ * Based on XySSL: Copyright (C) 2006-2008 Christophe Devine ++ * ++ * Copyright (C) 2009 Paul Bakker ++ * ++ * All rights reserved. ++ * ++ * Redistribution and use in source and binary forms, with or without ++ * modification, are permitted provided that the following conditions ++ * are met: ++ * ++ * * Redistributions of source code must retain the above copyright ++ * notice, this list of conditions and the following disclaimer. ++ * * 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. ++ * * Neither the names of PolarSSL or XySSL nor the names of its contributors ++ * may be used to endorse or promote products derived from this software ++ * without specific prior written permission. ++ * ++ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ++ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT ++ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS ++ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT ++ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, ++ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED ++ * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR ++ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF ++ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING ++ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS ++ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ++ */ ++#ifndef POLARSSL_HAVEGE_H ++#define POLARSSL_HAVEGE_H ++ ++#define COLLECT_SIZE 1024 ++ ++/** ++ * \brief HAVEGE state structure ++ */ ++typedef struct ++{ ++ int PT1, PT2, offset[2]; ++ int pool[COLLECT_SIZE]; ++ int WALK[8192]; ++} ++havege_state; ++ ++#ifdef __cplusplus ++extern "C" { ++#endif ++ ++/** ++ * \brief HAVEGE initialization ++ * ++ * \param hs HAVEGE state to be initialized ++ */ ++void havege_init( havege_state *hs ); ++ ++/** ++ * \brief HAVEGE rand function ++ * ++ * \param rng_st points to an HAVEGE state ++ * ++ * \return A random int ++ */ ++int havege_rand( void *p_rng ); ++ ++#ifdef __cplusplus ++} ++#endif ++ ++#endif /* havege.h */ +diff --git a/feeds/luci/libs/luci-lib-px5g/src/polarssl/rsa.h b/feeds/luci/libs/luci-lib-px5g/src/polarssl/rsa.h +new file mode 100644 +index 0000000..b31dc2f +--- /dev/null ++++ b/feeds/luci/libs/luci-lib-px5g/src/polarssl/rsa.h +@@ -0,0 +1,309 @@ ++/** ++ * \file rsa.h ++ * ++ * Based on XySSL: Copyright (C) 2006-2008 Christophe Devine ++ * ++ * Copyright (C) 2009 Paul Bakker ++ * ++ * All rights reserved. ++ * ++ * Redistribution and use in source and binary forms, with or without ++ * modification, are permitted provided that the following conditions ++ * are met: ++ * ++ * * Redistributions of source code must retain the above copyright ++ * notice, this list of conditions and the following disclaimer. ++ * * 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. ++ * * Neither the names of PolarSSL or XySSL nor the names of its contributors ++ * may be used to endorse or promote products derived from this software ++ * without specific prior written permission. ++ * ++ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ++ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT ++ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS ++ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT ++ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, ++ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED ++ * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR ++ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF ++ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING ++ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS ++ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ++ */ ++#ifndef POLARSSL_RSA_H ++#define POLARSSL_RSA_H ++ ++#include "polarssl/bignum.h" ++ ++#define POLARSSL_ERR_RSA_BAD_INPUT_DATA -0x0400 ++#define POLARSSL_ERR_RSA_INVALID_PADDING -0x0410 ++#define POLARSSL_ERR_RSA_KEY_GEN_FAILED -0x0420 ++#define POLARSSL_ERR_RSA_KEY_CHECK_FAILED -0x0430 ++#define POLARSSL_ERR_RSA_PUBLIC_FAILED -0x0440 ++#define POLARSSL_ERR_RSA_PRIVATE_FAILED -0x0450 ++#define POLARSSL_ERR_RSA_VERIFY_FAILED -0x0460 ++#define POLARSSL_ERR_RSA_OUTPUT_TO_LARGE -0x0470 ++ ++/* ++ * PKCS#1 constants ++ */ ++#define RSA_RAW 0 ++#define RSA_MD2 2 ++#define RSA_MD4 3 ++#define RSA_MD5 4 ++#define RSA_SHA1 5 ++#define RSA_SHA256 6 ++ ++#define RSA_PUBLIC 0 ++#define RSA_PRIVATE 1 ++ ++#define RSA_PKCS_V15 0 ++#define RSA_PKCS_V21 1 ++ ++#define RSA_SIGN 1 ++#define RSA_CRYPT 2 ++ ++/* ++ * DigestInfo ::= SEQUENCE { ++ * digestAlgorithm DigestAlgorithmIdentifier, ++ * digest Digest } ++ * ++ * DigestAlgorithmIdentifier ::= AlgorithmIdentifier ++ * ++ * Digest ::= OCTET STRING ++ */ ++#define ASN1_HASH_MDX \ ++ "\x30\x20\x30\x0C\x06\x08\x2A\x86\x48" \ ++ "\x86\xF7\x0D\x02\x00\x05\x00\x04\x10" ++ ++#define ASN1_HASH_SHA1 \ ++ "\x30\x21\x30\x09\x06\x05\x2B\x0E\x03" \ ++ "\x02\x1A\x05\x00\x04\x14" ++ ++/** ++ * \brief RSA context structure ++ */ ++typedef struct ++{ ++ int ver; /*!< always 0 */ ++ int len; /*!< size(N) in chars */ ++ ++ mpi N; /*!< public modulus */ ++ mpi E; /*!< public exponent */ ++ ++ mpi D; /*!< private exponent */ ++ mpi P; /*!< 1st prime factor */ ++ mpi Q; /*!< 2nd prime factor */ ++ mpi DP; /*!< D % (P - 1) */ ++ mpi DQ; /*!< D % (Q - 1) */ ++ mpi QP; /*!< 1 / (Q % P) */ ++ ++ mpi RN; /*!< cached R^2 mod N */ ++ mpi RP; /*!< cached R^2 mod P */ ++ mpi RQ; /*!< cached R^2 mod Q */ ++ ++ int padding; /*!< 1.5 or OAEP/PSS */ ++ int hash_id; /*!< hash identifier */ ++ int (*f_rng)(void *); /*!< RNG function */ ++ void *p_rng; /*!< RNG parameter */ ++} ++rsa_context; ++ ++#ifdef __cplusplus ++extern "C" { ++#endif ++ ++/** ++ * \brief Initialize an RSA context ++ * ++ * \param ctx RSA context to be initialized ++ * \param padding RSA_PKCS_V15 or RSA_PKCS_V21 ++ * \param hash_id RSA_PKCS_V21 hash identifier ++ * \param f_rng RNG function ++ * \param p_rng RNG parameter ++ * ++ * \note The hash_id parameter is actually ignored ++ * when using RSA_PKCS_V15 padding. ++ * ++ * \note Currently (xyssl-0.8), RSA_PKCS_V21 padding ++ * is not supported. ++ */ ++void rsa_init( rsa_context *ctx, ++ int padding, ++ int hash_id, ++ int (*f_rng)(void *), ++ void *p_rng ); ++ ++/** ++ * \brief Generate an RSA keypair ++ * ++ * \param ctx RSA context that will hold the key ++ * \param nbits size of the public key in bits ++ * \param exponent public exponent (e.g., 65537) ++ * ++ * \note rsa_init() must be called beforehand to setup ++ * the RSA context (especially f_rng and p_rng). ++ * ++ * \return 0 if successful, or an POLARSSL_ERR_RSA_XXX error code ++ */ ++int rsa_gen_key( rsa_context *ctx, int nbits, int exponent ); ++ ++/** ++ * \brief Check a public RSA key ++ * ++ * \param ctx RSA context to be checked ++ * ++ * \return 0 if successful, or an POLARSSL_ERR_RSA_XXX error code ++ */ ++int rsa_check_pubkey( rsa_context *ctx ); ++ ++/** ++ * \brief Check a private RSA key ++ * ++ * \param ctx RSA context to be checked ++ * ++ * \return 0 if successful, or an POLARSSL_ERR_RSA_XXX error code ++ */ ++int rsa_check_privkey( rsa_context *ctx ); ++ ++/** ++ * \brief Do an RSA public key operation ++ * ++ * \param ctx RSA context ++ * \param input input buffer ++ * \param output output buffer ++ * ++ * \return 0 if successful, or an POLARSSL_ERR_RSA_XXX error code ++ * ++ * \note This function does NOT take care of message ++ * padding. Also, be sure to set input[0] = 0. ++ * ++ * \note The input and output buffers must be large ++ * enough (eg. 128 bytes if RSA-1024 is used). ++ */ ++int rsa_public( rsa_context *ctx, ++ unsigned char *input, ++ unsigned char *output ); ++ ++/** ++ * \brief Do an RSA private key operation ++ * ++ * \param ctx RSA context ++ * \param input input buffer ++ * \param output output buffer ++ * ++ * \return 0 if successful, or an POLARSSL_ERR_RSA_XXX error code ++ * ++ * \note The input and output buffers must be large ++ * enough (eg. 128 bytes if RSA-1024 is used). ++ */ ++int rsa_private( rsa_context *ctx, ++ unsigned char *input, ++ unsigned char *output ); ++ ++/** ++ * \brief Add the message padding, then do an RSA operation ++ * ++ * \param ctx RSA context ++ * \param mode RSA_PUBLIC or RSA_PRIVATE ++ * \param ilen contains the the plaintext length ++ * \param input buffer holding the data to be encrypted ++ * \param output buffer that will hold the ciphertext ++ * ++ * \return 0 if successful, or an POLARSSL_ERR_RSA_XXX error code ++ * ++ * \note The output buffer must be as large as the size ++ * of ctx->N (eg. 128 bytes if RSA-1024 is used). ++ */ ++int rsa_pkcs1_encrypt( rsa_context *ctx, ++ int mode, int ilen, ++ unsigned char *input, ++ unsigned char *output ); ++ ++/** ++ * \brief Do an RSA operation, then remove the message padding ++ * ++ * \param ctx RSA context ++ * \param mode RSA_PUBLIC or RSA_PRIVATE ++ * \param input buffer holding the encrypted data ++ * \param output buffer that will hold the plaintext ++ * \param olen will contain the plaintext length ++ * \param output_max_len maximum length of the output buffer ++ * ++ * \return 0 if successful, or an POLARSSL_ERR_RSA_XXX error code ++ * ++ * \note The output buffer must be as large as the size ++ * of ctx->N (eg. 128 bytes if RSA-1024 is used) otherwise ++ * an error is thrown. ++ */ ++int rsa_pkcs1_decrypt( rsa_context *ctx, ++ int mode, int *olen, ++ unsigned char *input, ++ unsigned char *output, ++ int output_max_len); ++ ++/** ++ * \brief Do a private RSA to sign a message digest ++ * ++ * \param ctx RSA context ++ * \param mode RSA_PUBLIC or RSA_PRIVATE ++ * \param hash_id RSA_RAW, RSA_MD{2,4,5} or RSA_SHA{1,256} ++ * \param hashlen message digest length (for RSA_RAW only) ++ * \param hash buffer holding the message digest ++ * \param sig buffer that will hold the ciphertext ++ * ++ * \return 0 if the signing operation was successful, ++ * or an POLARSSL_ERR_RSA_XXX error code ++ * ++ * \note The "sig" buffer must be as large as the size ++ * of ctx->N (eg. 128 bytes if RSA-1024 is used). ++ */ ++int rsa_pkcs1_sign( rsa_context *ctx, ++ int mode, ++ int hash_id, ++ int hashlen, ++ unsigned char *hash, ++ unsigned char *sig ); ++ ++/** ++ * \brief Do a public RSA and check the message digest ++ * ++ * \param ctx points to an RSA public key ++ * \param mode RSA_PUBLIC or RSA_PRIVATE ++ * \param hash_id RSA_RAW, RSA_MD{2,4,5} or RSA_SHA{1,256} ++ * \param hashlen message digest length (for RSA_RAW only) ++ * \param hash buffer holding the message digest ++ * \param sig buffer holding the ciphertext ++ * ++ * \return 0 if the verify operation was successful, ++ * or an POLARSSL_ERR_RSA_XXX error code ++ * ++ * \note The "sig" buffer must be as large as the size ++ * of ctx->N (eg. 128 bytes if RSA-1024 is used). ++ */ ++int rsa_pkcs1_verify( rsa_context *ctx, ++ int mode, ++ int hash_id, ++ int hashlen, ++ unsigned char *hash, ++ unsigned char *sig ); ++ ++/** ++ * \brief Free the components of an RSA key ++ */ ++void rsa_free( rsa_context *ctx ); ++ ++/** ++ * \brief Checkup routine ++ * ++ * \return 0 if successful, or 1 if the test failed ++ */ ++int rsa_self_test( int verbose ); ++ ++#ifdef __cplusplus ++} ++#endif ++ ++#endif /* rsa.h */ +diff --git a/feeds/luci/libs/luci-lib-px5g/src/polarssl/sha1.h b/feeds/luci/libs/luci-lib-px5g/src/polarssl/sha1.h +new file mode 100644 +index 0000000..3ca7dc3 +--- /dev/null ++++ b/feeds/luci/libs/luci-lib-px5g/src/polarssl/sha1.h +@@ -0,0 +1,150 @@ ++/** ++ * \file sha1.h ++ * ++ * Based on XySSL: Copyright (C) 2006-2008 Christophe Devine ++ * ++ * Copyright (C) 2009 Paul Bakker ++ * ++ * All rights reserved. ++ * ++ * Redistribution and use in source and binary forms, with or without ++ * modification, are permitted provided that the following conditions ++ * are met: ++ * ++ * * Redistributions of source code must retain the above copyright ++ * notice, this list of conditions and the following disclaimer. ++ * * 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. ++ * * Neither the names of PolarSSL or XySSL nor the names of its contributors ++ * may be used to endorse or promote products derived from this software ++ * without specific prior written permission. ++ * ++ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ++ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT ++ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS ++ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT ++ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, ++ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED ++ * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR ++ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF ++ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING ++ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS ++ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ++ */ ++#ifndef POLARSSL_SHA1_H ++#define POLARSSL_SHA1_H ++ ++/** ++ * \brief SHA-1 context structure ++ */ ++typedef struct ++{ ++ unsigned long total[2]; /*!< number of bytes processed */ ++ unsigned long state[5]; /*!< intermediate digest state */ ++ unsigned char buffer[64]; /*!< data block being processed */ ++ ++ unsigned char ipad[64]; /*!< HMAC: inner padding */ ++ unsigned char opad[64]; /*!< HMAC: outer padding */ ++} ++sha1_context; ++ ++#ifdef __cplusplus ++extern "C" { ++#endif ++ ++/** ++ * \brief SHA-1 context setup ++ * ++ * \param ctx context to be initialized ++ */ ++void sha1_starts( sha1_context *ctx ); ++ ++/** ++ * \brief SHA-1 process buffer ++ * ++ * \param ctx SHA-1 context ++ * \param input buffer holding the data ++ * \param ilen length of the input data ++ */ ++void sha1_update( sha1_context *ctx, unsigned char *input, int ilen ); ++ ++/** ++ * \brief SHA-1 final digest ++ * ++ * \param ctx SHA-1 context ++ * \param output SHA-1 checksum result ++ */ ++void sha1_finish( sha1_context *ctx, unsigned char output[20] ); ++ ++/** ++ * \brief Output = SHA-1( input buffer ) ++ * ++ * \param input buffer holding the data ++ * \param ilen length of the input data ++ * \param output SHA-1 checksum result ++ */ ++void sha1( unsigned char *input, int ilen, unsigned char output[20] ); ++ ++/** ++ * \brief Output = SHA-1( file contents ) ++ * ++ * \param path input file name ++ * \param output SHA-1 checksum result ++ * ++ * \return 0 if successful, 1 if fopen failed, ++ * or 2 if fread failed ++ */ ++int sha1_file( char *path, unsigned char output[20] ); ++ ++/** ++ * \brief SHA-1 HMAC context setup ++ * ++ * \param ctx HMAC context to be initialized ++ * \param key HMAC secret key ++ * \param keylen length of the HMAC key ++ */ ++void sha1_hmac_starts( sha1_context *ctx, unsigned char *key, int keylen ); ++ ++/** ++ * \brief SHA-1 HMAC process buffer ++ * ++ * \param ctx HMAC context ++ * \param input buffer holding the data ++ * \param ilen length of the input data ++ */ ++void sha1_hmac_update( sha1_context *ctx, unsigned char *input, int ilen ); ++ ++/** ++ * \brief SHA-1 HMAC final digest ++ * ++ * \param ctx HMAC context ++ * \param output SHA-1 HMAC checksum result ++ */ ++void sha1_hmac_finish( sha1_context *ctx, unsigned char output[20] ); ++ ++/** ++ * \brief Output = HMAC-SHA-1( hmac key, input buffer ) ++ * ++ * \param key HMAC secret key ++ * \param keylen length of the HMAC key ++ * \param input buffer holding the data ++ * \param ilen length of the input data ++ * \param output HMAC-SHA-1 result ++ */ ++void sha1_hmac( unsigned char *key, int keylen, ++ unsigned char *input, int ilen, ++ unsigned char output[20] ); ++ ++/** ++ * \brief Checkup routine ++ * ++ * \return 0 if successful, or 1 if the test failed ++ */ ++int sha1_self_test( int verbose ); ++ ++#ifdef __cplusplus ++} ++#endif ++ ++#endif /* sha1.h */ +diff --git a/feeds/luci/libs/luci-lib-px5g/src/polarssl/timing.h b/feeds/luci/libs/luci-lib-px5g/src/polarssl/timing.h +new file mode 100644 +index 0000000..62d627f +--- /dev/null ++++ b/feeds/luci/libs/luci-lib-px5g/src/polarssl/timing.h +@@ -0,0 +1,81 @@ ++/** ++ * \file timing.h ++ * ++ * Based on XySSL: Copyright (C) 2006-2008 Christophe Devine ++ * ++ * Copyright (C) 2009 Paul Bakker ++ * ++ * All rights reserved. ++ * ++ * Redistribution and use in source and binary forms, with or without ++ * modification, are permitted provided that the following conditions ++ * are met: ++ * ++ * * Redistributions of source code must retain the above copyright ++ * notice, this list of conditions and the following disclaimer. ++ * * 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. ++ * * Neither the names of PolarSSL or XySSL nor the names of its contributors ++ * may be used to endorse or promote products derived from this software ++ * without specific prior written permission. ++ * ++ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ++ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT ++ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS ++ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT ++ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, ++ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED ++ * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR ++ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF ++ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING ++ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS ++ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ++ */ ++#ifndef POLARSSL_TIMING_H ++#define POLARSSL_TIMING_H ++ ++/** ++ * \brief timer structure ++ */ ++struct hr_time ++{ ++ unsigned char opaque[32]; ++}; ++ ++#ifdef __cplusplus ++extern "C" { ++#endif ++ ++extern int alarmed; ++ ++/** ++ * \brief Return the CPU cycle counter value ++ */ ++unsigned long hardclock( void ); ++ ++/** ++ * \brief Return the elapsed time in milliseconds ++ * ++ * \param val points to a timer structure ++ * \param reset if set to 1, the timer is restarted ++ */ ++unsigned long get_timer( struct hr_time *val, int reset ); ++ ++/** ++ * \brief Setup an alarm clock ++ * ++ * \param seconds delay before the "alarmed" flag is set ++ */ ++void set_alarm( int seconds ); ++ ++/** ++ * \brief Sleep for a certain amount of time ++ */ ++void m_sleep( int milliseconds ); ++ ++#ifdef __cplusplus ++} ++#endif ++ ++#endif /* timing.h */ +diff --git a/feeds/luci/libs/luci-lib-px5g/src/polarssl/x509.h b/feeds/luci/libs/luci-lib-px5g/src/polarssl/x509.h +new file mode 100644 +index 0000000..908a1db +--- /dev/null ++++ b/feeds/luci/libs/luci-lib-px5g/src/polarssl/x509.h +@@ -0,0 +1,549 @@ ++/** ++ * \file x509.h ++ * ++ * Based on XySSL: Copyright (C) 2006-2008 Christophe Devine ++ * ++ * Copyright (C) 2009 Paul Bakker ++ * ++ * All rights reserved. ++ * ++ * Redistribution and use in source and binary forms, with or without ++ * modification, are permitted provided that the following conditions ++ * are met: ++ * ++ * * Redistributions of source code must retain the above copyright ++ * notice, this list of conditions and the following disclaimer. ++ * * 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. ++ * * Neither the names of PolarSSL or XySSL nor the names of its contributors ++ * may be used to endorse or promote products derived from this software ++ * without specific prior written permission. ++ * ++ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ++ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT ++ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS ++ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT ++ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, ++ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED ++ * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR ++ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF ++ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING ++ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS ++ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ++ */ ++#ifndef POLARSSL_X509_H ++#define POLARSSL_X509_H ++ ++#include "polarssl/rsa.h" ++ ++#define POLARSSL_ERR_ASN1_OUT_OF_DATA -0x0014 ++#define POLARSSL_ERR_ASN1_UNEXPECTED_TAG -0x0016 ++#define POLARSSL_ERR_ASN1_INVALID_LENGTH -0x0018 ++#define POLARSSL_ERR_ASN1_LENGTH_MISMATCH -0x001A ++#define POLARSSL_ERR_ASN1_INVALID_DATA -0x001C ++ ++#define POLARSSL_ERR_X509_FEATURE_UNAVAILABLE -0x0020 ++#define POLARSSL_ERR_X509_CERT_INVALID_PEM -0x0040 ++#define POLARSSL_ERR_X509_CERT_INVALID_FORMAT -0x0060 ++#define POLARSSL_ERR_X509_CERT_INVALID_VERSION -0x0080 ++#define POLARSSL_ERR_X509_CERT_INVALID_SERIAL -0x00A0 ++#define POLARSSL_ERR_X509_CERT_INVALID_ALG -0x00C0 ++#define POLARSSL_ERR_X509_CERT_INVALID_NAME -0x00E0 ++#define POLARSSL_ERR_X509_CERT_INVALID_DATE -0x0100 ++#define POLARSSL_ERR_X509_CERT_INVALID_PUBKEY -0x0120 ++#define POLARSSL_ERR_X509_CERT_INVALID_SIGNATURE -0x0140 ++#define POLARSSL_ERR_X509_CERT_INVALID_EXTENSIONS -0x0160 ++#define POLARSSL_ERR_X509_CERT_UNKNOWN_VERSION -0x0180 ++#define POLARSSL_ERR_X509_CERT_UNKNOWN_SIG_ALG -0x01A0 ++#define POLARSSL_ERR_X509_CERT_UNKNOWN_PK_ALG -0x01C0 ++#define POLARSSL_ERR_X509_CERT_SIG_MISMATCH -0x01E0 ++#define POLARSSL_ERR_X509_CERT_VERIFY_FAILED -0x0200 ++#define POLARSSL_ERR_X509_KEY_INVALID_PEM -0x0220 ++#define POLARSSL_ERR_X509_KEY_INVALID_VERSION -0x0240 ++#define POLARSSL_ERR_X509_KEY_INVALID_FORMAT -0x0260 ++#define POLARSSL_ERR_X509_KEY_INVALID_ENC_IV -0x0280 ++#define POLARSSL_ERR_X509_KEY_UNKNOWN_ENC_ALG -0x02A0 ++#define POLARSSL_ERR_X509_KEY_PASSWORD_REQUIRED -0x02C0 ++#define POLARSSL_ERR_X509_KEY_PASSWORD_MISMATCH -0x02E0 ++#define POLARSSL_ERR_X509_POINT_ERROR -0x0300 ++#define POLARSSL_ERR_X509_VALUE_TO_LENGTH -0x0320 ++ ++#define BADCERT_EXPIRED 1 ++#define BADCERT_REVOKED 2 ++#define BADCERT_CN_MISMATCH 4 ++#define BADCERT_NOT_TRUSTED 8 ++ ++/* ++ * DER constants ++ */ ++#define ASN1_BOOLEAN 0x01 ++#define ASN1_INTEGER 0x02 ++#define ASN1_BIT_STRING 0x03 ++#define ASN1_OCTET_STRING 0x04 ++#define ASN1_NULL 0x05 ++#define ASN1_OID 0x06 ++#define ASN1_UTF8_STRING 0x0C ++#define ASN1_SEQUENCE 0x10 ++#define ASN1_SET 0x11 ++#define ASN1_PRINTABLE_STRING 0x13 ++#define ASN1_T61_STRING 0x14 ++#define ASN1_IA5_STRING 0x16 ++#define ASN1_UTC_TIME 0x17 ++#define ASN1_UNIVERSAL_STRING 0x1C ++#define ASN1_BMP_STRING 0x1E ++#define ASN1_PRIMITIVE 0x00 ++#define ASN1_CONSTRUCTED 0x20 ++#define ASN1_CONTEXT_SPECIFIC 0x80 ++ ++/* ++ * various object identifiers ++ */ ++#define X520_COMMON_NAME 3 ++#define X520_COUNTRY 6 ++#define X520_LOCALITY 7 ++#define X520_STATE 8 ++#define X520_ORGANIZATION 10 ++#define X520_ORG_UNIT 11 ++#define PKCS9_EMAIL 1 ++ ++#define X509_OUTPUT_DER 0x01 ++#define X509_OUTPUT_PEM 0x02 ++#define PEM_LINE_LENGTH 72 ++#define X509_ISSUER 0x01 ++#define X509_SUBJECT 0x02 ++ ++#define OID_X520 "\x55\x04" ++#define OID_CN "\x55\x04\x03" ++#define OID_PKCS1 "\x2A\x86\x48\x86\xF7\x0D\x01\x01" ++#define OID_PKCS1_RSA "\x2A\x86\x48\x86\xF7\x0D\x01\x01\x01" ++#define OID_PKCS1_RSA_SHA "\x2A\x86\x48\x86\xF7\x0D\x01\x01\x05" ++#define OID_PKCS9 "\x2A\x86\x48\x86\xF7\x0D\x01\x09" ++#define OID_PKCS9_EMAIL "\x2A\x86\x48\x86\xF7\x0D\x01\x09\x01" ++ ++/* ++ * Structures for parsing X.509 certificates ++ */ ++typedef struct _x509_buf ++{ ++ int tag; ++ int len; ++ unsigned char *p; ++} ++x509_buf; ++ ++typedef struct _x509_name ++{ ++ x509_buf oid; ++ x509_buf val; ++ struct _x509_name *next; ++} ++x509_name; ++ ++typedef struct _x509_time ++{ ++ int year, mon, day; ++ int hour, min, sec; ++} ++x509_time; ++ ++typedef struct _x509_cert ++{ ++ x509_buf raw; ++ x509_buf tbs; ++ ++ int version; ++ x509_buf serial; ++ x509_buf sig_oid1; ++ ++ x509_buf issuer_raw; ++ x509_buf subject_raw; ++ ++ x509_name issuer; ++ x509_name subject; ++ ++ x509_time valid_from; ++ x509_time valid_to; ++ ++ x509_buf pk_oid; ++ rsa_context rsa; ++ ++ x509_buf issuer_id; ++ x509_buf subject_id; ++ x509_buf v3_ext; ++ ++ int ca_istrue; ++ int max_pathlen; ++ ++ x509_buf sig_oid2; ++ x509_buf sig; ++ ++ struct _x509_cert *next; ++} ++x509_cert; ++ ++/* ++ * Structures for writing X.509 certificates ++ */ ++typedef struct _x509_node ++{ ++ unsigned char *data; ++ unsigned char *p; ++ unsigned char *end; ++ ++ size_t len; ++} ++x509_node; ++ ++typedef struct _x509_raw ++{ ++ x509_node raw; ++ x509_node tbs; ++ ++ x509_node version; ++ x509_node serial; ++ x509_node tbs_signalg; ++ x509_node issuer; ++ x509_node validity; ++ x509_node subject; ++ x509_node subpubkey; ++ ++ x509_node signalg; ++ x509_node sign; ++} ++x509_raw; ++ ++#ifdef __cplusplus ++extern "C" { ++#endif ++ ++/** ++ * \brief Parse one or more certificates and add them ++ * to the chained list ++ * ++ * \param chain points to the start of the chain ++ * \param buf buffer holding the certificate data ++ * \param buflen size of the buffer ++ * ++ * \return 0 if successful, or a specific X509 error code ++ */ ++int x509parse_crt( x509_cert *crt, unsigned char *buf, int buflen ); ++ ++/** ++ * \brief Load one or more certificates and add them ++ * to the chained list ++ * ++ * \param chain points to the start of the chain ++ * \param path filename to read the certificates from ++ * ++ * \return 0 if successful, or a specific X509 error code ++ */ ++int x509parse_crtfile( x509_cert *crt, char *path ); ++ ++/** ++ * \brief Parse a private RSA key ++ * ++ * \param rsa RSA context to be initialized ++ * \param buf input buffer ++ * \param buflen size of the buffer ++ * \param pwd password for decryption (optional) ++ * \param pwdlen size of the password ++ * ++ * \return 0 if successful, or a specific X509 error code ++ */ ++int x509parse_key( rsa_context *rsa, ++ unsigned char *buf, int buflen, ++ unsigned char *pwd, int pwdlen ); ++ ++/** ++ * \brief Load and parse a private RSA key ++ * ++ * \param rsa RSA context to be initialized ++ * \param path filename to read the private key from ++ * \param pwd password to decrypt the file (can be NULL) ++ * ++ * \return 0 if successful, or a specific X509 error code ++ */ ++int x509parse_keyfile( rsa_context *rsa, char *path, char *password ); ++ ++/** ++ * \brief Store the certificate DN in printable form into buf; ++ * no more than (end - buf) characters will be written. ++ */ ++int x509parse_dn_gets( char *buf, char *end, x509_name *dn ); ++ ++/** ++ * \brief Returns an informational string about the ++ * certificate. ++ */ ++char *x509parse_cert_info( char *prefix, x509_cert *crt ); ++ ++/** ++ * \brief Return 0 if the certificate is still valid, ++ * or BADCERT_EXPIRED ++ */ ++int x509parse_expired( x509_cert *crt ); ++ ++/** ++ * \brief Verify the certificate signature ++ * ++ * \param crt a certificate to be verified ++ * \param trust_ca the trusted CA chain ++ * \param cn expected Common Name (can be set to ++ * NULL if the CN must not be verified) ++ * \param flags result of the verification ++ * ++ * \return 0 if successful or POLARSSL_ERR_X509_SIG_VERIFY_FAILED, ++ * in which case *flags will have one or more of ++ * the following values set: ++ * BADCERT_EXPIRED -- ++ * BADCERT_REVOKED -- ++ * BADCERT_CN_MISMATCH -- ++ * BADCERT_NOT_TRUSTED ++ * ++ * \note TODO: add two arguments, depth and crl ++ */ ++int x509parse_verify( x509_cert *crt, ++ x509_cert *trust_ca, ++ char *cn, int *flags ); ++ ++/** ++ * \brief Unallocate all certificate data ++ */ ++void x509_free( x509_cert *crt ); ++ ++/** ++ * \brief Checkup routine ++ * ++ * \return 0 if successful, or 1 if the test failed ++ */ ++int x509_self_test( int verbose ); ++ ++/** ++ * \brief Write a certificate info file ++ * ++ * \param chain points to the raw certificate data ++ * \param path filename to write the certificate to ++ * \param format X509_OUTPUT_DER or X509_OUTPUT_PEM ++ * ++ * \return 0 if successful, or a specific X509 error code ++ */ ++int x509write_crtfile( x509_raw *chain, ++ unsigned char *path, ++ int format ); ++ ++/** ++ * \brief Write a certificate signing request message format file ++ * ++ * \param chain points to the raw certificate (with x509write_create_csr) data ++ * \param path filename to write the certificate to ++ * \param format X509_OUTPUT_DER or X509_OUTPUT_PEM ++ * ++ * \return 0 if successful, or a specific X509 error code ++ */ ++int x509write_csrfile( x509_raw *chain, ++ unsigned char *path, ++ int format ); ++ ++/* ++ * \brief Write a private RSA key into a file ++ * ++ * \param rsa points to an RSA key ++ * \param path filename to write the key to ++ * \param format X509_OUTPUT_DER or X509_OUTPUT_PEM ++ * ++ * \return 0 if successful, or a specific X509 error code ++ */ ++int x509write_keyfile( rsa_context *rsa, ++ char *path, ++ int format ); ++ ++/** ++ * \brief Add a public key to certificate ++ * ++ * \param chain points to the raw certificate data ++ * \param pubkey points to an RSA key ++ * ++ * \return 0 if successful, or a specific X509 error code ++ */ ++int x509write_add_pubkey( x509_raw *chain, rsa_context *pubkey ); ++ ++/** ++ * \brief Create x509 subject/issuer field to raw certificate ++ * from string or CA cert. Make string NULL if you will ++ * use the CA copy function or make CA NULL then used ++ * the string parse. ++ * ++ * \param chain points to the raw certificate data ++ * \param names a string that can hold (separete with ";"): ++ * CN=CommonName ++ * -- O=Organization ++ * -- OU=OrgUnit ++ * -- ST=State ++ * -- L=Locality ++ * -- R=Email ++ * -- C=Country ++ * . Make that NULL if you didn't need that. ++ * \param flag flag is X509_ISSUER or X509_SUBJECT that defined ++ * where change ++ * \param ca the certificate for copy data. Make that NULL if you ++ * didn't need that. ++ * \param ca_flag set the ca field from copy to crt ++ * ++ * \return 0 if successful, or a specific X509 error code ++ */ ++int x509write_add_customize ( x509_raw *crt, ++ unsigned char *names, ++ int flag, ++ x509_cert *ca, ++ int ca_flag ); ++ ++/** ++* \brief Add x509 issuer field ++* ++* \param chain points to the raw certificate data ++* \param issuer a string holding (separete with ";"): ++* CN=CommonName ++* -- O=Organization ++* -- OU=OrgUnit ++* -- ST=State ++* -- L=Locality ++* -- R=Email ++* -- C=Country ++* . Set this to NULL if not needed. ++* \return 0 if successful, or a specific X509 error code ++*/ ++int x509write_add_issuer( x509_raw *crt, unsigned char *issuer); ++ ++/** ++ * \brief Add x509 subject field ++ * ++ * \param chain points to the raw certificate data ++ * \param subject a string holding (separete with ";"): ++ * CN=CommonName ++ * -- O=Organization ++ * -- OU=OrgUnit ++ * -- ST=State ++ * -- L=Locality ++ * -- R=Email ++ * -- C=Country ++ * . Set this to NULL if not needed. ++ * \return 0 if successful, or a specific X509 error code ++ */ ++int x509write_add_subject( x509_raw *crt, unsigned char *subject); ++ ++/** ++* \brief Copy x509 issuer field from another certificate ++* ++* \param chain points to the raw certificate data ++* \param from_crt the certificate whose issuer is to be copied. ++* \return 0 if successful, or a specific X509 error code ++*/ ++int x509write_copy_issuer(x509_raw *crt, x509_cert *from_crt); ++ ++/** ++* \brief Copy x509 subject field from another certificate ++* ++* \param chain points to the raw certificate data ++* \param from_crt the certificate whose subject is to be copied. ++* \return 0 if successful, or a specific X509 error code ++*/ ++int x509write_copy_subject(x509_raw *crt, x509_cert *from_crt); ++ ++/** ++* \brief Copy x509 issuer field from the subject of another certificate ++* ++* \param chain points to the raw certificate data ++* \param from_crt the certificate whose subject is to be copied. ++* \return 0 if successful, or a specific X509 error code ++*/ ++int x509write_copy_issuer_from_subject(x509_raw *crt, x509_cert *from_crt); ++ ++/** ++* \brief Copy x509 subject field from the issuer of another certificate ++* ++* \param chain points to the raw certificate data ++* \param from_crt the certificate whose issuer is to be copied. ++* \return 0 if successful, or a specific X509 error code ++*/ ++int x509write_copy_subject_from_issuer(x509_raw *crt, x509_cert *from_crt); ++ ++/** ++ * \brief Create x509 validity time in UTC ++ * ++ * \param chain points to the raw certificate data ++ * \param before valid not before in format YYYY-MM-DD hh:mm:ss ++ * \param after valid not after in format YYYY-MM-DD hh:mm:ss ++ * ++ * \return 0 if successful, or a specific X509 error code ++ */ ++int x509write_add_validity( x509_raw *crt, ++ unsigned char *before, ++ unsigned char *after ); ++ ++/** ++ * \brief Create a self-signed certificate ++ * ++ * \param chain points to the raw certificate data ++ * \param rsa a private key to sign the certificate ++ * ++ * \return 0 if successful, or a specific X509 error code ++ */ ++int x509write_create_selfsign( x509_raw *crt, rsa_context *raw ); ++ ++/** ++ * \brief Create a certificate ++ * ++ * \param chain points to the raw certificate data ++ * \param rsa a private key to sign the certificate ++ * ++ * \return 0 if successful, or a specific X509 error code ++ */ ++int x509write_create_sign( x509_raw *crt, rsa_context *raw ); ++ ++/** ++ * \brief Create a certificate signing request ++ * ++ * \param chain points to the raw certificate data. Didn't use the ++ * same chain that u have use for certificate. ++ * \param privkey a rsa private key ++ * ++ * \return 0 if successful, or a specific X509 error code ++ */ ++int x509write_create_csr( x509_raw *chain, rsa_context *privkey ); ++ ++/** ++ * \brief Serialize an rsa key into DER ++ * ++ * \param rsa a rsa key for output ++ * \param node a x509 node for write into ++ * ++ * \return 0 if successful, or a specific X509 error code ++ */ ++int x509write_serialize_key( rsa_context *rsa, x509_node *node ); ++ ++/** ++ * \brief Unallocate all raw certificate data ++ */ ++void x509write_free_raw( x509_raw *crt ); ++ ++/** ++ * \brief Allocate all raw certificate data ++ */ ++void x509write_init_raw( x509_raw *crt ); ++ ++/** ++ * \brief Unallocate all node certificate data ++ */ ++void x509write_free_node( x509_node *crt_node ); ++ ++/** ++ * \brief Allocate all node certificate data ++ */ ++void x509write_init_node( x509_node *crt_node ); ++ ++#ifdef __cplusplus ++} ++#endif ++ ++#endif /* x509.h */ +diff --git a/feeds/luci/libs/luci-lib-px5g/src/px5g.c b/feeds/luci/libs/luci-lib-px5g/src/px5g.c +new file mode 100644 +index 0000000..feecd01 +--- /dev/null ++++ b/feeds/luci/libs/luci-lib-px5g/src/px5g.c +@@ -0,0 +1,159 @@ ++/* ++ * px5g - Embedded x509 key and certificate generator based on PolarSSL ++ * ++ * Copyright (C) 2009 Steven Barth ++ * ++ * This library is free software; you can redistribute it and/or ++ * modify it under the terms of the GNU Lesser General Public ++ * License, version 2.1 as published by the Free Software Foundation. ++ * ++ * This library 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 ++ * Lesser General Public License for more details. ++ * ++ * You should have received a copy of the GNU Lesser General Public ++ * License along with this library; if not, write to the Free Software ++ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, ++ * MA 02110-1301 USA ++ */ ++ ++#include "px5g.h" ++#include ++#include ++#define VERSION 0.1 ++ ++static char *xfields[] = {"CN", "O", "C", "OU", "ST", "L", "R"}; ++ ++static int px5g_genkey(lua_State *L) { ++ int keysize = luaL_checkint(L, 1), pexp = luaL_optint(L, 2, 65537), ret; ++ px5g_rsa *px5g = lua_newuserdata(L, sizeof(px5g_rsa)); ++ if (!px5g) { ++ return luaL_error(L, "out of memory"); ++ } ++ ++ px5g->stat = 1; ++ havege_init(&px5g->hs); ++ rsa_init(&px5g->rsa, RSA_PKCS_V15, 0, havege_rand, &px5g->hs); ++ ++ if ((ret = rsa_gen_key(&px5g->rsa, keysize, pexp))) { ++ lua_pushnil(L); ++ lua_pushinteger(L, ret); ++ return 2; ++ } ++ ++ luaL_getmetatable(L, PX5G_KEY_META); ++ lua_setmetatable(L, -2); ++ return 1; ++} ++ ++static int px5g_rsa_asn1(lua_State *L) { ++ int ret; ++ px5g_rsa *px5g = luaL_checkudata(L, 1, PX5G_KEY_META); ++ x509_node node; ++ ++ x509write_init_node(&node); ++ if ((ret = x509write_serialize_key(&px5g->rsa, &node))) { ++ x509write_free_node(&node); ++ lua_pushnil(L); ++ lua_pushinteger(L, ret); ++ return 2; ++ } ++ ++ lua_pushlstring(L, (char*)node.data, node.len); ++ x509write_free_node(&node); ++ return 1; ++} ++ ++static int px5g_rsa_create_selfsigned(lua_State *L) { ++ px5g_rsa *px5g = luaL_checkudata(L, 1, PX5G_KEY_META); ++ luaL_checktype(L, 2, LUA_TTABLE); ++ time_t from = (time_t)luaL_checknumber(L, 3); ++ time_t to = (time_t)luaL_checknumber(L, 4); ++ char fstr[20], tstr[20]; ++ ++ lua_pushliteral(L, "CN"); ++ lua_rawget(L, 2); ++ luaL_argcheck(L, lua_isstring(L, -1), 2, "CN missing"); ++ lua_pop(L, 1); ++ ++ luaL_argcheck(L, ++ strftime(fstr, sizeof(fstr), "%F %H:%M:%S", gmtime(&from)), ++ 3, "Invalid Time"); ++ ++ luaL_argcheck(L, ++ strftime(tstr, sizeof(tstr), "%F %H:%M:%S", gmtime(&to)), ++ 4, "Invalid Time"); ++ ++ size_t join = 1; ++ lua_pushliteral(L, ""); ++ for (int i = 0; i < (sizeof(xfields) / sizeof(*xfields)); i++) { ++ lua_pushstring(L, xfields[i]); ++ lua_rawget(L, 2); ++ if (lua_isstring(L, -1)) { ++ const char *val = lua_tostring(L, -1); ++ luaL_argcheck(L, !strchr(val, ';'), 2, "Invalid Value"); ++ lua_pushfstring(L, "%s=%s;", xfields[i], val); ++ lua_remove(L, -2); ++ join++; ++ } else { ++ lua_pop(L, 1); ++ } ++ } ++ lua_concat(L, join); ++ ++ x509_raw cert; ++ x509write_init_raw(&cert); ++ x509write_add_pubkey(&cert, &px5g->rsa); ++ x509write_add_subject(&cert, (unsigned char*)lua_tostring(L, -1)); ++ x509write_add_validity(&cert, (unsigned char*)fstr, (unsigned char*)tstr); ++ x509write_create_selfsign(&cert, &px5g->rsa); ++ ++ lua_pushlstring(L, (char*)cert.raw.data, cert.raw.len); ++ x509write_free_raw(&cert); ++ return 1; ++} ++ ++static int px5g_rsa__gc(lua_State *L) { ++ px5g_rsa *px5g = luaL_checkudata(L, 1, PX5G_KEY_META); ++ if (px5g->stat) { ++ rsa_free(&px5g->rsa); ++ px5g->stat = 0; ++ } ++ return 0; ++} ++ ++static int px5g_rsa__tostring(lua_State *L) { ++ px5g_rsa *px5g = luaL_checkudata(L, 1, PX5G_KEY_META); ++ lua_pushfstring(L, "px5g context %p", px5g); ++ return 1; ++} ++ ++/* method table */ ++static const luaL_reg M[] = { ++ {"asn1", px5g_rsa_asn1}, ++ {"create_selfsigned", px5g_rsa_create_selfsigned}, ++ {"__gc", px5g_rsa__gc}, ++ {"__tostring", px5g_rsa__tostring}, ++ {NULL, NULL} ++}; ++ ++/* module table */ ++static const luaL_reg R[] = { ++ {"genkey", px5g_genkey}, ++ {NULL, NULL} ++}; ++ ++int luaopen_px5g(lua_State *L) { ++ /* register module */ ++ luaL_register(L, "px5g", R); ++ ++ /* Meta Table */ ++ luaL_newmetatable(L, PX5G_KEY_META); ++ luaL_register(L, NULL, M); ++ lua_pushvalue(L, -1); ++ lua_setfield(L, -2, "__index"); ++ ++ lua_setfield(L, -2, "meta_key"); ++ return 1; ++} +diff --git a/feeds/luci/libs/luci-lib-px5g/src/px5g.h b/feeds/luci/libs/luci-lib-px5g/src/px5g.h +new file mode 100644 +index 0000000..47542b5 +--- /dev/null ++++ b/feeds/luci/libs/luci-lib-px5g/src/px5g.h +@@ -0,0 +1,16 @@ ++#include ++#include ++#include ++ ++#include "polarssl/havege.h" ++#include "polarssl/bignum.h" ++#include "polarssl/x509.h" ++#include "polarssl/rsa.h" ++ ++#define PX5G_KEY_META "px5g.key" ++ ++typedef struct px5g_rsa { ++ int stat; ++ havege_state hs; ++ rsa_context rsa; ++} px5g_rsa; +diff --git a/feeds/luci/libs/luci-lib-rpcc/Makefile b/feeds/luci/libs/luci-lib-rpcc/Makefile +new file mode 100644 +index 0000000..e0fea28 +--- /dev/null ++++ b/feeds/luci/libs/luci-lib-rpcc/Makefile +@@ -0,0 +1,14 @@ ++# ++# Copyright (C) 2008-2014 The LuCI Team ++# ++# This is free software, licensed under the Apache License, Version 2.0 . ++# ++ ++include $(TOPDIR)/rules.mk ++ ++LUCI_TITLE:=LuCI Support for AHCPd ++LUCI_DEPENDS:=@BROKEN ++ ++include ../../luci.mk ++ ++# call BuildPackage - OpenWrt buildroot signature +diff --git a/feeds/luci/libs/luci-lib-rpcc/luasrc/rpcc.lua b/feeds/luci/libs/luci-lib-rpcc/luasrc/rpcc.lua +new file mode 100644 +index 0000000..5558910 +--- /dev/null ++++ b/feeds/luci/libs/luci-lib-rpcc/luasrc/rpcc.lua +@@ -0,0 +1,59 @@ ++-- Copyright 2009 Steven Barth ++-- Licensed to the public under the Apache License 2.0. ++ ++local util = require "luci.util" ++local json = require "luci.json" ++local ltn12 = require "luci.ltn12" ++local nixio = require "nixio", require "nixio.util" ++ ++local tostring, assert, setmetatable = tostring, assert, setmetatable ++local error = error ++ ++module "luci.rpcc" ++ ++RQLIMIT = 32 * nixio.const.buffersize ++ ++Client = util.class() ++ ++function Client.__init__(self, fd, v1) ++ self.fd = fd ++ self.uniqueid = tostring(self):match("0x([a-f0-9]+)") ++ self.msgid = 1 ++ self.v1 = v1 ++end ++ ++function Client.request(self, method, params, notification) ++ local oldchunk = self.decoder and self.decoder.chunk ++ self.decoder = json.ActiveDecoder(self.fd:blocksource(nil, RQLIMIT)) ++ self.decoder.chunk = oldchunk ++ ++ local reqid = self.msgid .. self.uniqueid ++ local reqdata = json.Encoder({ ++ id = (not notification) and (self.msgid .. self.uniqueid) or nil, ++ jsonrpc = (not self.v1) and "2.0" or nil, ++ method = method, ++ params = params ++ }) ++ ltn12.pump.all(reqdata:source(), self.fd:sink()) ++ if not notification then ++ self.msgid = self.msgid + 1 ++ local response = self.decoder:get() ++ assert(response.id == reqid, "Invalid response id") ++ if response.error then ++ error(response.error.message or response.error) ++ end ++ return response.result ++ end ++end ++ ++function Client.proxy(self, prefix) ++ prefix = prefix or "" ++ return setmetatable({}, { ++ __call = function(proxy, ...) ++ return self:request(prefix, {...}) ++ end, ++ __index = function(proxy, name) ++ return self:proxy(prefix .. name .. ".") ++ end ++ }) ++end +\ No newline at end of file +diff --git a/feeds/luci/libs/luci-lib-rpcc/luasrc/rpcc.luadoc b/feeds/luci/libs/luci-lib-rpcc/luasrc/rpcc.luadoc +new file mode 100644 +index 0000000..5609bfd +--- /dev/null ++++ b/feeds/luci/libs/luci-lib-rpcc/luasrc/rpcc.luadoc +@@ -0,0 +1,36 @@ ++---[[ ++LuCI RPC Client. ++ ++@cstyle instance ++]] ++module "luci.rpcc" ++ ++---[[ ++Create a new JSON-RPC stream client. ++ ++@class function ++@param fd File descriptor ++@param v1 Use protocol version 1.0 ++@return RPC Client ++]] ++ ++---[[ ++Request an RP call and get the response. ++ ++@class function ++@name Client.request ++@param method Remote method ++@param params Parameters ++@param notification Notification only? ++@return response ++]] ++ ++---[[ ++Create a transparent RPC proxy. ++ ++@class function ++@name Client.proxy ++@param prefix Method prefix ++@return RPC Proxy object ++]] ++ +diff --git a/feeds/luci/libs/luci-lib-rpcc/luasrc/rpcc/ruci.lua b/feeds/luci/libs/luci-lib-rpcc/luasrc/rpcc/ruci.lua +new file mode 100644 +index 0000000..275c396 +--- /dev/null ++++ b/feeds/luci/libs/luci-lib-rpcc/luasrc/rpcc/ruci.lua +@@ -0,0 +1,48 @@ ++-- Copyright 2009 Steven Barth ++-- Licensed to the public under the Apache License 2.0. ++ ++local util = require "luci.util" ++local rawget, setmetatable = rawget, setmetatable ++local ipairs = ipairs ++ ++module "luci.rpcc.ruci" ++ ++ ++local Proxy = util.class() ++ ++function factory(rpccl) ++ return { ++ cursor = function(...) ++ return Proxy(rpccl, rpccl:request("ruci.cursor", {...})) ++ end, ++ cursor_state = function(...) ++ return Proxy(rpccl, rpccl:request("ruci.cursor_state", {...})) ++ end ++ } ++end ++ ++function Proxy.__init__(self, rpccl, objid) ++ self.__rpccl = rpccl ++ self.__objid = objid ++ ++ setmetatable(self, { ++ __index = function(self, key) ++ return rawget(self, key) or Proxy[key] or function(self, ...) ++ local argv = {self.__objid, ...} ++ return self.__rpccl:request("ruci."..key, argv) ++ end ++ end ++ }) ++end ++ ++function Proxy.foreach(self, config, section, callback) ++ local sections = self.__rpccl:request("ruci.foreach", {self.__objid, config, section}) ++ if sections then ++ for _, s in ipairs(sections) do ++ callback(s) ++ end ++ return true ++ else ++ return false ++ end ++end +diff --git a/feeds/luci/libs/luci-lib-rpcc/luasrc/rpcc/ruci.luadoc b/feeds/luci/libs/luci-lib-rpcc/luasrc/rpcc/ruci.luadoc +new file mode 100644 +index 0000000..9c842c5 +--- /dev/null ++++ b/feeds/luci/libs/luci-lib-rpcc/luasrc/rpcc/ruci.luadoc +@@ -0,0 +1,16 @@ ++---[[ ++Transparent UCI over RPC client. ++ ++@cstyle instance ++]] ++module "luci.rpcc.ruci" ++ ++---[[ ++Create a new UCI over RPC proxy. ++ ++@class function ++@name factory ++@param rpccl RPC client ++@return Network transparent UCI module ++]] ++ +diff --git a/feeds/luci/luci.mk b/feeds/luci/luci.mk +new file mode 100644 +index 0000000..d77c09e +--- /dev/null ++++ b/feeds/luci/luci.mk +@@ -0,0 +1,216 @@ ++# ++# Copyright (C) 2008-2015 The LuCI Team ++# ++# This is free software, licensed under the Apache License, Version 2.0 . ++# ++ ++LUCI_NAME?=$(notdir ${CURDIR}) ++LUCI_TYPE?=$(word 2,$(subst -, ,$(LUCI_NAME))) ++LUCI_BASENAME?=$(patsubst luci-$(LUCI_TYPE)-%,%,$(LUCI_NAME)) ++LUCI_LANGUAGES:=$(filter-out templates,$(notdir $(wildcard ${CURDIR}/po/*))) ++LUCI_DEFAULTS:=$(notdir $(wildcard ${CURDIR}/root/etc/uci-defaults/*)) ++LUCI_PKGARCH?=$(if $(realpath src/Makefile),,all) ++ ++# Language code titles ++LUCI_LANG.ca=Català (Catalan) ++LUCI_LANG.cs=ÄŒeÅ¡tina (Czech) ++LUCI_LANG.de=Deutsch (German) ++LUCI_LANG.el=Ελληνικά (Greek) ++LUCI_LANG.en=English ++LUCI_LANG.es=Español (Spanish) ++LUCI_LANG.fr=Français (French) ++LUCI_LANG.he=עִבְרִית (Hebrew) ++LUCI_LANG.hu=Magyar (Hungarian) ++LUCI_LANG.it=Italiano (Italian) ++LUCI_LANG.ja=日本語 (Japanese) ++LUCI_LANG.ms=Bahasa Melayu (Malay) ++LUCI_LANG.no=Norsk (Norwegian) ++LUCI_LANG.pl=Polski (Polish) ++LUCI_LANG.pt-br=Português do Brasil (Brazialian Portuguese) ++LUCI_LANG.pt=Português (Portuguese) ++LUCI_LANG.ro=Română (Romanian) ++LUCI_LANG.ru=РуÑÑкий (Russian) ++LUCI_LANG.sk=SlovenÄina (Slovene) ++LUCI_LANG.sv=Svenska (Swedish) ++LUCI_LANG.tr=Türkçe (Turkish) ++LUCI_LANG.uk=україÌнÑька (Ukrainian) ++LUCI_LANG.vi=Tiếng Việt (Vietnamese) ++LUCI_LANG.zh-cn=æ™®é€šè¯ (Chinese) ++LUCI_LANG.zh-tw=臺ç£è¯èªž (Taiwanese) ++ ++# Submenu titles ++LUCI_MENU.col=1. Collections ++LUCI_MENU.mod=2. Modules ++LUCI_MENU.app=3. Applications ++LUCI_MENU.theme=4. Themes ++LUCI_MENU.proto=5. Protocols ++LUCI_MENU.lib=6. Libraries ++ ++ ++PKG_NAME?=$(LUCI_NAME) ++ ++PKG_VERSION?=$(if $(DUMP),x,$(strip $(shell \ ++ if svn info >/dev/null 2>/dev/null; then \ ++ revision="svn-r$$(LC_ALL=C svn info | sed -ne 's/^Revision: //p')"; \ ++ elif git log -1 >/dev/null 2>/dev/null; then \ ++ revision="svn-r$$(LC_ALL=C git log -1 | sed -ne 's/.*git-svn-id: .*@\([0-9]\+\) .*/\1/p')"; \ ++ if [ "$$revision" = "svn-r" ]; then \ ++ set -- $$(git log -1 --format="%ct %h"); \ ++ secs="$$(($$1 % 86400))"; \ ++ yday="$$(date --utc --date="@$$1" "+%y.%j")"; \ ++ revision="$$(printf 'git-%s.%05d-%s' "$$yday" "$$secs" "$$2")"; \ ++ fi; \ ++ else \ ++ revision="unknown"; \ ++ fi; \ ++ echo "$$revision" \ ++))) ++ ++PKG_RELEASE?=1 ++PKG_INSTALL:=$(if $(realpath src/Makefile),1) ++PKG_BUILD_DEPENDS += lua/host luci-base/host $(LUCI_BUILD_DEPENDS) ++PKG_CONFIG_DEPENDS += CONFIG_LUCI_SRCDIET ++ ++PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME) ++ ++include $(INCLUDE_DIR)/package.mk ++ ++define Package/$(PKG_NAME) ++ SECTION:=luci ++ CATEGORY:=LuCI ++ SUBMENU:=$(if $(LUCI_MENU.$(LUCI_TYPE)),$(LUCI_MENU.$(LUCI_TYPE)),$(LUCI_MENU.app)) ++ TITLE:=$(if $(LUCI_TITLE),$(LUCI_TITLE),LuCI $(LUCI_NAME) $(LUCI_TYPE)) ++ DEPENDS:=$(LUCI_DEPENDS) ++ $(if $(LUCI_PKGARCH),PKGARCH:=$(LUCI_PKGARCH)) ++endef ++ ++ifneq ($(LUCI_DESCRIPTION),) ++ define Package/$(PKG_NAME)/description ++ $(strip $(LUCI_DESCRIPTION)) ++ endef ++endif ++ ++# Language selection for luci-base ++ifeq ($(PKG_NAME),luci-base) ++ define Package/luci-base/config ++ config LUCI_SRCDIET ++ bool "Minify Lua sources" ++ default n ++ ++ menu "Translations"$(foreach lang,$(LUCI_LANGUAGES), ++ ++ config LUCI_LANG_$(lang) ++ tristate "$(shell echo '$(LUCI_LANG.$(lang))' | sed -e 's/^.* (\(.*\))$$/\1/') ($(lang))") ++ ++ endmenu ++ endef ++endif ++ ++define Build/Prepare ++ for d in luasrc htdocs root src; do \ ++ if [ -d ./$$$$d ]; then \ ++ mkdir -p $(PKG_BUILD_DIR)/$$$$d; \ ++ $(CP) ./$$$$d/* $(PKG_BUILD_DIR)/$$$$d/; \ ++ fi; \ ++ done ++ $(call Build/Prepare/Default) ++endef ++ ++define Build/Configure ++endef ++ ++ifneq ($(wildcard ${CURDIR}/src/Makefile),) ++ MAKE_PATH := src/ ++ MAKE_VARS += FPIC="$(FPIC)" LUCI_VERSION="$(PKG_VERSION)" ++ ++ define Build/Compile ++ $(call Build/Compile/Default,clean compile) ++ endef ++else ++ define Build/Compile ++ endef ++endif ++ ++HTDOCS = /www ++LUA_LIBRARYDIR = /usr/lib/lua ++LUCI_LIBRARYDIR = $(LUA_LIBRARYDIR)/luci ++ ++define SrcDiet ++ $(FIND) $(1) -type f -name '*.lua' | while read src; do \ ++ if $(STAGING_DIR_HOST)/bin/lua $(STAGING_DIR_HOST)/bin/LuaSrcDiet \ ++ --noopt-binequiv -o "$$$$src.o" "$$$$src"; \ ++ then mv "$$$$src.o" "$$$$src"; fi; \ ++ done ++endef ++ ++define Package/$(PKG_NAME)/install ++ if [ -d $(PKG_BUILD_DIR)/luasrc ]; then \ ++ $(INSTALL_DIR) $(1)$(LUCI_LIBRARYDIR); \ ++ cp -pR $(PKG_BUILD_DIR)/luasrc/* $(1)$(LUCI_LIBRARYDIR)/; \ ++ $(FIND) $(1)$(LUCI_LIBRARYDIR)/ -type f -name '*.luadoc' | $(XARGS) rm; \ ++ $(if $(CONFIG_LUCI_SRCDIET),$(call SrcDiet,$(1)$(LUCI_LIBRARYDIR)/),true); \ ++ else true; fi ++ if [ -d $(PKG_BUILD_DIR)/htdocs ]; then \ ++ $(INSTALL_DIR) $(1)$(HTDOCS); \ ++ cp -pR $(PKG_BUILD_DIR)/htdocs/* $(1)$(HTDOCS)/; \ ++ else true; fi ++ if [ -d $(PKG_BUILD_DIR)/root ]; then \ ++ $(INSTALL_DIR) $(1)/; \ ++ cp -pR $(PKG_BUILD_DIR)/root/* $(1)/; \ ++ else true; fi ++ if [ -d $(PKG_BUILD_DIR)/src ]; then \ ++ $(call Build/Install/Default) \ ++ $(CP) $(PKG_INSTALL_DIR)/* $(1)/; \ ++ else true; fi ++endef ++ ++ifneq ($(LUCI_DEFAULTS),) ++define Package/$(PKG_NAME)/postinst ++[ -n "$${IPKG_INSTROOT}" ] || {$(foreach script,$(LUCI_DEFAULTS), ++ (. /etc/uci-defaults/$(script)) && rm -f /etc/uci-defaults/$(script)) ++ exit 0 ++} ++endef ++endif ++ ++ ++LUCI_BUILD_PACKAGES := $(PKG_NAME) ++ ++define LuciTranslation ++ define Package/luci-i18n-$(LUCI_BASENAME)-$(1) ++ SECTION:=luci ++ CATEGORY:=LuCI ++ TITLE:=$(PKG_NAME) - $(1) translation ++ HIDDEN:=1 ++ DEFAULT:=LUCI_LANG_$(1)||(ALL&&m) ++ DEPENDS:=$(PKG_NAME) ++ PKGARCH:=all ++ endef ++ ++ define Package/luci-i18n-$(LUCI_BASENAME)-$(1)/description ++ Translation for $(PKG_NAME) - $(LUCI_LANG.$(1)) ++ endef ++ ++ define Package/luci-i18n-$(LUCI_BASENAME)-$(1)/install ++ $$(INSTALL_DIR) $$(1)/etc/uci-defaults ++ echo "uci set luci.languages.$(subst -,_,$(1))='$(LUCI_LANG.$(1))'; uci commit luci" \ ++ > $$(1)/etc/uci-defaults/luci-i18n-$(LUCI_BASENAME)-$(1) ++ $$(INSTALL_DIR) $$(1)$(LUCI_LIBRARYDIR)/i18n ++ $(foreach po,$(wildcard ${CURDIR}/po/$(1)/*.po), \ ++ po2lmo $(po) \ ++ $$(1)$(LUCI_LIBRARYDIR)/i18n/$(basename $(notdir $(po))).$(1).lmo;) ++ endef ++ ++ define Package/luci-i18n-$(LUCI_BASENAME)-$(1)/postinst ++ [ -n "$$$${IPKG_INSTROOT}" ] || { ++ (. /etc/uci-defaults/luci-i18n-$(LUCI_BASENAME)-$(1)) && rm -f /etc/uci-defaults/luci-i18n-$(LUCI_BASENAME)-$(1) ++ exit 0 ++ } ++ endef ++ ++ LUCI_BUILD_PACKAGES += luci-i18n-$(LUCI_BASENAME)-$(1) ++ ++endef ++ ++$(foreach lang,$(LUCI_LANGUAGES),$(eval $(call LuciTranslation,$(lang)))) ++$(foreach pkg,$(LUCI_BUILD_PACKAGES),$(eval $(call BuildPackage,$(pkg)))) +diff --git a/feeds/luci/modules/luci-base/Makefile b/feeds/luci/modules/luci-base/Makefile +new file mode 100644 +index 0000000..80bbda1 +--- /dev/null ++++ b/feeds/luci/modules/luci-base/Makefile +@@ -0,0 +1,43 @@ ++# ++# Copyright (C) 2008-2015 The LuCI Team ++# ++# This is free software, licensed under the Apache License, Version 2.0 . ++# ++ ++include $(TOPDIR)/rules.mk ++ ++PKG_NAME:=luci-base ++ ++LUCI_TYPE:=mod ++LUCI_BASENAME:=base ++ ++LUCI_TITLE:=LuCI core libraries ++LUCI_DEPENDS:=+lua +libuci-lua +luci-lib-nixio +luci-lib-ip +rpcd ++ ++PKG_SOURCE:=LuaSrcDiet-0.12.1.tar.bz2 ++PKG_SOURCE_URL:=https://luasrcdiet.googlecode.com/files ++PKG_MD5SUM:=8a0812701e29b6715e4d76f2f118264a ++ ++HOST_BUILD_DIR:=$(BUILD_DIR_HOST)/LuaSrcDiet-0.12.1 ++ ++include $(INCLUDE_DIR)/host-build.mk ++ ++include ../../luci.mk ++ ++define Host/Configure ++endef ++ ++define Host/Compile ++ $(MAKE) -C src/ clean po2lmo ++ $(MAKE) -C $(HOST_BUILD_DIR) bin/LuaSrcDiet.lua ++endef ++ ++define Host/Install ++ $(INSTALL_DIR) $(STAGING_DIR_HOST)/bin ++ $(INSTALL_BIN) src/po2lmo $(STAGING_DIR_HOST)/bin/po2lmo ++ $(INSTALL_BIN) $(HOST_BUILD_DIR)/bin/LuaSrcDiet.lua $(STAGING_DIR_HOST)/bin/LuaSrcDiet ++endef ++ ++$(eval $(call HostBuild)) ++ ++# call BuildPackage - OpenWrt buildroot signature +diff --git a/feeds/luci/modules/luci-base/htdocs/cgi-bin/luci b/feeds/luci/modules/luci-base/htdocs/cgi-bin/luci +new file mode 100755 +index 0000000..529d1d0 +--- /dev/null ++++ b/feeds/luci/modules/luci-base/htdocs/cgi-bin/luci +@@ -0,0 +1,5 @@ ++#!/usr/bin/lua ++require "luci.cacheloader" ++require "luci.sgi.cgi" ++luci.dispatcher.indexcache = "/tmp/luci-indexcache" ++luci.sgi.cgi.run() +\ No newline at end of file +diff --git a/feeds/luci/modules/luci-base/htdocs/luci-static/resources/cbi.js b/feeds/luci/modules/luci-base/htdocs/luci-static/resources/cbi.js +new file mode 100644 +index 0000000..5e31bf2 +--- /dev/null ++++ b/feeds/luci/modules/luci-base/htdocs/luci-static/resources/cbi.js +@@ -0,0 +1,1339 @@ ++/* ++ LuCI - Lua Configuration Interface ++ ++ Copyright 2008 Steven Barth ++ Copyright 2008-2012 Jo-Philipp Wich ++ ++ Licensed under the Apache License, Version 2.0 (the "License"); ++ you may not use this file except in compliance with the License. ++ You may obtain a copy of the License at ++ ++ http://www.apache.org/licenses/LICENSE-2.0 ++*/ ++ ++var cbi_d = []; ++var cbi_t = []; ++var cbi_c = []; ++ ++var cbi_validators = { ++ ++ 'integer': function() ++ { ++ return (this.match(/^-?[0-9]+$/) != null); ++ }, ++ ++ 'uinteger': function() ++ { ++ return (cbi_validators.integer.apply(this) && (this >= 0)); ++ }, ++ ++ 'float': function() ++ { ++ return !isNaN(parseFloat(this)); ++ }, ++ ++ 'ufloat': function() ++ { ++ return (cbi_validators['float'].apply(this) && (this >= 0)); ++ }, ++ ++ 'ipaddr': function() ++ { ++ return cbi_validators.ip4addr.apply(this) || ++ cbi_validators.ip6addr.apply(this); ++ }, ++ ++ 'ip4addr': function() ++ { ++ if (this.match(/^(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})(\/(\S+))?$/)) ++ { ++ return (RegExp.$1 >= 0) && (RegExp.$1 <= 255) && ++ (RegExp.$2 >= 0) && (RegExp.$2 <= 255) && ++ (RegExp.$3 >= 0) && (RegExp.$3 <= 255) && ++ (RegExp.$4 >= 0) && (RegExp.$4 <= 255) && ++ ((RegExp.$6.indexOf('.') < 0) ++ ? ((RegExp.$6 >= 0) && (RegExp.$6 <= 32)) ++ : (cbi_validators.ip4addr.apply(RegExp.$6))) ++ ; ++ } ++ ++ return false; ++ }, ++ ++ 'ip6addr': function() ++ { ++ if( this.match(/^([a-fA-F0-9:.]+)(\/(\d+))?$/) ) ++ { ++ if( !RegExp.$2 || ((RegExp.$3 >= 0) && (RegExp.$3 <= 128)) ) ++ { ++ var addr = RegExp.$1; ++ ++ if( addr == '::' ) ++ { ++ return true; ++ } ++ ++ if( addr.indexOf('.') > 0 ) ++ { ++ var off = addr.lastIndexOf(':'); ++ ++ if( !(off && cbi_validators.ip4addr.apply(addr.substr(off+1))) ) ++ return false; ++ ++ addr = addr.substr(0, off) + ':0:0'; ++ } ++ ++ if( addr.indexOf('::') >= 0 ) ++ { ++ var colons = 0; ++ var fill = '0'; ++ ++ for( var i = 1; i < (addr.length-1); i++ ) ++ if( addr.charAt(i) == ':' ) ++ colons++; ++ ++ if( colons > 7 ) ++ return false; ++ ++ for( var i = 0; i < (7 - colons); i++ ) ++ fill += ':0'; ++ ++ if (addr.match(/^(.*?)::(.*?)$/)) ++ addr = (RegExp.$1 ? RegExp.$1 + ':' : '') + fill + ++ (RegExp.$2 ? ':' + RegExp.$2 : ''); ++ } ++ ++ return (addr.match(/^(?:[a-fA-F0-9]{1,4}:){7}[a-fA-F0-9]{1,4}$/) != null); ++ } ++ } ++ ++ return false; ++ }, ++ ++ 'port': function() ++ { ++ return cbi_validators.integer.apply(this) && ++ (this >= 0) && (this <= 65535); ++ }, ++ ++ 'portrange': function() ++ { ++ if (this.match(/^(\d+)-(\d+)$/)) ++ { ++ var p1 = RegExp.$1; ++ var p2 = RegExp.$2; ++ ++ return cbi_validators.port.apply(p1) && ++ cbi_validators.port.apply(p2) && ++ (parseInt(p1) <= parseInt(p2)) ++ ; ++ } ++ else ++ { ++ return cbi_validators.port.apply(this); ++ } ++ }, ++ ++ 'macaddr': function() ++ { ++ return (this.match(/^([a-fA-F0-9]{2}:){5}[a-fA-F0-9]{2}$/) != null); ++ }, ++ ++ 'host': function() ++ { ++ return cbi_validators.hostname.apply(this) || ++ cbi_validators.ipaddr.apply(this); ++ }, ++ ++ 'hostname': function() ++ { ++ if (this.length <= 253) ++ return (this.match(/^[a-zA-Z0-9]+$/) != null || ++ (this.match(/^[a-zA-Z0-9_][a-zA-Z0-9_\-.]*[a-zA-Z0-9]$/) && ++ this.match(/[^0-9.]/))); ++ ++ return false; ++ }, ++ ++ 'network': function() ++ { ++ return cbi_validators.uciname.apply(this) || ++ cbi_validators.host.apply(this); ++ }, ++ ++ 'wpakey': function() ++ { ++ var v = this; ++ ++ if( v.length == 64 ) ++ return (v.match(/^[a-fA-F0-9]{64}$/) != null); ++ else ++ return (v.length >= 8) && (v.length <= 63); ++ }, ++ ++ 'wepkey': function() ++ { ++ var v = this; ++ ++ if ( v.substr(0,2) == 's:' ) ++ v = v.substr(2); ++ ++ if( (v.length == 10) || (v.length == 26) ) ++ return (v.match(/^[a-fA-F0-9]{10,26}$/) != null); ++ else ++ return (v.length == 5) || (v.length == 13); ++ }, ++ ++ 'uciname': function() ++ { ++ return (this.match(/^[a-zA-Z0-9_]+$/) != null); ++ }, ++ ++ 'range': function(min, max) ++ { ++ var val = parseFloat(this); ++ if (!isNaN(min) && !isNaN(max) && !isNaN(val)) ++ return ((val >= min) && (val <= max)); ++ ++ return false; ++ }, ++ ++ 'min': function(min) ++ { ++ var val = parseFloat(this); ++ if (!isNaN(min) && !isNaN(val)) ++ return (val >= min); ++ ++ return false; ++ }, ++ ++ 'max': function(max) ++ { ++ var val = parseFloat(this); ++ if (!isNaN(max) && !isNaN(val)) ++ return (val <= max); ++ ++ return false; ++ }, ++ ++ 'rangelength': function(min, max) ++ { ++ var val = '' + this; ++ if (!isNaN(min) && !isNaN(max)) ++ return ((val.length >= min) && (val.length <= max)); ++ ++ return false; ++ }, ++ ++ 'minlength': function(min) ++ { ++ var val = '' + this; ++ if (!isNaN(min)) ++ return (val.length >= min); ++ ++ return false; ++ }, ++ ++ 'maxlength': function(max) ++ { ++ var val = '' + this; ++ if (!isNaN(max)) ++ return (val.length <= max); ++ ++ return false; ++ }, ++ ++ 'or': function() ++ { ++ for (var i = 0; i < arguments.length; i += 2) ++ { ++ if (typeof arguments[i] != 'function') ++ { ++ if (arguments[i] == this) ++ return true; ++ i--; ++ } ++ else if (arguments[i].apply(this, arguments[i+1])) ++ { ++ return true; ++ } ++ } ++ return false; ++ }, ++ ++ 'and': function() ++ { ++ for (var i = 0; i < arguments.length; i += 2) ++ { ++ if (typeof arguments[i] != 'function') ++ { ++ if (arguments[i] != this) ++ return false; ++ i--; ++ } ++ else if (!arguments[i].apply(this, arguments[i+1])) ++ { ++ return false; ++ } ++ } ++ return true; ++ }, ++ ++ 'neg': function() ++ { ++ return cbi_validators.or.apply( ++ this.replace(/^[ \t]*![ \t]*/, ''), arguments); ++ }, ++ ++ 'list': function(subvalidator, subargs) ++ { ++ if (typeof subvalidator != 'function') ++ return false; ++ ++ var tokens = this.match(/[^ \t]+/g); ++ for (var i = 0; i < tokens.length; i++) ++ if (!subvalidator.apply(tokens[i], subargs)) ++ return false; ++ ++ return true; ++ }, ++ 'phonedigit': function() ++ { ++ return (this.match(/^[0-9\*#!\.]+$/) != null); ++ } ++}; ++ ++ ++function cbi_d_add(field, dep, next) { ++ var obj = document.getElementById(field); ++ if (obj) { ++ var entry ++ for (var i=0; i 0 && (tl[0].type == 'radio' || tl[0].type == 'checkbox')) ++ for( var i = 0; i < tl.length; i++ ) ++ if( tl[i].checked ) { ++ value = tl[i].value; ++ break; ++ } ++ ++ value = value ? value : ""; ++ } else if (!t.value) { ++ value = ""; ++ } else { ++ value = t.value; ++ ++ if (t.type == "checkbox") { ++ value = t.checked ? value : ""; ++ } ++ } ++ ++ return (value == ref) ++} ++ ++function cbi_d_check(deps) { ++ var reverse; ++ var def = false; ++ for (var i=0; i= 0) ++ { ++ focus = add+1; ++ values.splice(focus, 0, ''); ++ } ++ else if (values.length == 0) ++ { ++ focus = 0; ++ values.push(''); ++ } ++ ++ for (var i = 0; i < values.length; i++) ++ { ++ var t = document.createElement('input'); ++ t.id = prefix + '.' + (i+1); ++ t.name = prefix; ++ t.value = values[i]; ++ t.type = 'text'; ++ t.index = i; ++ t.className = 'cbi-input-text'; ++ ++ if (i == 0 && holder) ++ { ++ t.placeholder = holder; ++ } ++ ++ var b = document.createElement('img'); ++ b.src = respath + ((i+1) < values.length ? '/cbi/remove.gif' : '/cbi/add.gif'); ++ b.className = 'cbi-image-button'; ++ ++ parent.appendChild(t); ++ parent.appendChild(b); ++ parent.appendChild(document.createElement('br')); ++ ++ if (datatype) ++ { ++ cbi_validate_field(t.id, ((i+1) == values.length) || optional, datatype); ++ } ++ ++ if (choices) ++ { ++ cbi_combobox_init(t.id, choices[0], '', choices[1]); ++ t.nextSibling.index = i; ++ ++ cbi_bind(t.nextSibling, 'keydown', cbi_dynlist_keydown); ++ cbi_bind(t.nextSibling, 'keypress', cbi_dynlist_keypress); ++ ++ if (i == focus || -i == focus) ++ t.nextSibling.focus(); ++ } ++ else ++ { ++ cbi_bind(t, 'keydown', cbi_dynlist_keydown); ++ cbi_bind(t, 'keypress', cbi_dynlist_keypress); ++ ++ if (i == focus) ++ { ++ t.focus(); ++ } ++ else if (-i == focus) ++ { ++ t.focus(); ++ ++ /* force cursor to end */ ++ var v = t.value; ++ t.value = ' ' ++ t.value = v; ++ } ++ } ++ ++ cbi_bind(b, 'click', cbi_dynlist_btnclick); ++ } ++ } ++ ++ function cbi_dynlist_keypress(ev) ++ { ++ ev = ev ? ev : window.event; ++ ++ var se = ev.target ? ev.target : ev.srcElement; ++ ++ if (se.nodeType == 3) ++ se = se.parentNode; ++ ++ switch (ev.keyCode) ++ { ++ /* backspace, delete */ ++ case 8: ++ case 46: ++ if (se.value.length == 0) ++ { ++ if (ev.preventDefault) ++ ev.preventDefault(); ++ ++ return false; ++ } ++ ++ return true; ++ ++ /* enter, arrow up, arrow down */ ++ case 13: ++ case 38: ++ case 40: ++ if (ev.preventDefault) ++ ev.preventDefault(); ++ ++ return false; ++ } ++ ++ return true; ++ } ++ ++ function cbi_dynlist_keydown(ev) ++ { ++ ev = ev ? ev : window.event; ++ ++ var se = ev.target ? ev.target : ev.srcElement; ++ ++ if (se.nodeType == 3) ++ se = se.parentNode; ++ ++ var prev = se.previousSibling; ++ while (prev && prev.name != name) ++ prev = prev.previousSibling; ++ ++ var next = se.nextSibling; ++ while (next && next.name != name) ++ next = next.nextSibling; ++ ++ /* advance one further in combobox case */ ++ if (next && next.nextSibling.name == name) ++ next = next.nextSibling; ++ ++ switch (ev.keyCode) ++ { ++ /* backspace, delete */ ++ case 8: ++ case 46: ++ var del = (se.nodeName.toLowerCase() == 'select') ++ ? true : (se.value.length == 0); ++ ++ if (del) ++ { ++ if (ev.preventDefault) ++ ev.preventDefault(); ++ ++ var focus = se.index; ++ if (ev.keyCode == 8) ++ focus = -focus+1; ++ ++ cbi_dynlist_redraw(focus, -1, se.index); ++ ++ return false; ++ } ++ ++ break; ++ ++ /* enter */ ++ case 13: ++ cbi_dynlist_redraw(-1, se.index, -1); ++ break; ++ ++ /* arrow up */ ++ case 38: ++ if (prev) ++ prev.focus(); ++ ++ break; ++ ++ /* arrow down */ ++ case 40: ++ if (next) ++ next.focus(); ++ ++ break; ++ } ++ ++ return true; ++ } ++ ++ function cbi_dynlist_btnclick(ev) ++ { ++ ev = ev ? ev : window.event; ++ ++ var se = ev.target ? ev.target : ev.srcElement; ++ ++ if (se.src.indexOf('remove') > -1) ++ { ++ se.previousSibling.value = ''; ++ ++ cbi_dynlist_keydown({ ++ target: se.previousSibling, ++ keyCode: 8 ++ }); ++ } ++ else ++ { ++ cbi_dynlist_keydown({ ++ target: se.previousSibling, ++ keyCode: 13 ++ }); ++ } ++ ++ return false; ++ } ++ ++ cbi_dynlist_redraw(NaN, -1, -1); ++} ++ ++//Hijacks the CBI form to send via XHR (requires Prototype) ++function cbi_hijack_forms(layer, win, fail, load) { ++ var forms = layer.getElementsByTagName('form'); ++ for (var i=0; i 0 ) ++ window.setTimeout(function() { ++ for( var i = 0; i < hl_tabs.length; i++ ) ++ hl_tabs[i].className = hl_tabs[i].className.replace(/ cbi-tab-highlighted/g, ''); ++ }, 750); ++ ++ return updated; ++} ++ ++ ++function cbi_validate_form(form, errmsg) ++{ ++ /* if triggered by a section removal or addition, don't validate */ ++ if( form.cbi_state == 'add-section' || form.cbi_state == 'del-section' ) ++ return true; ++ ++ if( form.cbi_validators ) ++ { ++ for( var i = 0; i < form.cbi_validators.length; i++ ) ++ { ++ var validator = form.cbi_validators[i]; ++ if( !validator() && errmsg ) ++ { ++ alert(errmsg); ++ return false; ++ } ++ } ++ } ++ ++ return true; ++} ++ ++function cbi_validate_reset(form) ++{ ++ window.setTimeout( ++ function() { cbi_validate_form(form, null) }, 100 ++ ); ++ ++ return true; ++} ++ ++function cbi_validate_compile(code) ++{ ++ var pos = 0; ++ var esc = false; ++ var depth = 0; ++ var stack = [ ]; ++ ++ code += ','; ++ ++ for (var i = 0; i < code.length; i++) ++ { ++ if (esc) ++ { ++ esc = false; ++ continue; ++ } ++ ++ switch (code.charCodeAt(i)) ++ { ++ case 92: ++ esc = true; ++ break; ++ ++ case 40: ++ case 44: ++ if (depth <= 0) ++ { ++ if (pos < i) ++ { ++ var label = code.substring(pos, i); ++ label = label.replace(/\\(.)/g, '$1'); ++ label = label.replace(/^[ \t]+/g, ''); ++ label = label.replace(/[ \t]+$/g, ''); ++ ++ if (label && !isNaN(label)) ++ { ++ stack.push(parseFloat(label)); ++ } ++ else if (label.match(/^(['"]).*\1$/)) ++ { ++ stack.push(label.replace(/^(['"])(.*)\1$/, '$2')); ++ } ++ else if (typeof cbi_validators[label] == 'function') ++ { ++ stack.push(cbi_validators[label]); ++ stack.push(null); ++ } ++ else ++ { ++ throw "Syntax error, unhandled token '"+label+"'"; ++ } ++ } ++ pos = i+1; ++ } ++ depth += (code.charCodeAt(i) == 40); ++ break; ++ ++ case 41: ++ if (--depth <= 0) ++ { ++ if (typeof stack[stack.length-2] != 'function') ++ throw "Syntax error, argument list follows non-function"; ++ ++ stack[stack.length-1] = ++ arguments.callee(code.substring(pos, i)); ++ ++ pos = i+1; ++ } ++ break; ++ } ++ } ++ ++ return stack; ++} ++ ++function cbi_validate_field(cbid, optional, type) ++{ ++ var field = (typeof cbid == "string") ? document.getElementById(cbid) : cbid; ++ var vstack; try { vstack = cbi_validate_compile(type); } catch(e) { }; ++ ++ if (field && vstack && typeof vstack[0] == "function") ++ { ++ var validator = function() ++ { ++ // is not detached ++ if( field.form ) ++ { ++ field.className = field.className.replace(/ cbi-input-invalid/g, ''); ++ ++ // validate value ++ var value = (field.options && field.options.selectedIndex > -1) ++ ? field.options[field.options.selectedIndex].value : field.value; ++ ++ if (!(((value.length == 0) && optional) || vstack[0].apply(value, vstack[1]))) ++ { ++ // invalid ++ field.className += ' cbi-input-invalid'; ++ return false; ++ } ++ } ++ ++ return true; ++ }; ++ ++ if( ! field.form.cbi_validators ) ++ field.form.cbi_validators = [ ]; ++ ++ field.form.cbi_validators.push(validator); ++ ++ cbi_bind(field, "blur", validator); ++ cbi_bind(field, "keyup", validator); ++ ++ if (field.nodeName == 'SELECT') ++ { ++ cbi_bind(field, "change", validator); ++ cbi_bind(field, "click", validator); ++ } ++ ++ field.setAttribute("cbi_validate", validator); ++ field.setAttribute("cbi_datatype", type); ++ field.setAttribute("cbi_optional", (!!optional).toString()); ++ ++ validator(); ++ ++ var fcbox = document.getElementById('cbi.combobox.' + field.id); ++ if (fcbox) ++ cbi_validate_field(fcbox, optional, type); ++ } ++} ++ ++function cbi_row_swap(elem, up, store) ++{ ++ var tr = elem.parentNode; ++ while (tr && tr.nodeName.toLowerCase() != 'tr') ++ tr = tr.parentNode; ++ ++ if (!tr) ++ return false; ++ ++ var table = tr.parentNode; ++ while (table && table.nodeName.toLowerCase() != 'table') ++ table = table.parentNode; ++ ++ if (!table) ++ return false; ++ ++ var s = up ? 3 : 2; ++ var e = up ? table.rows.length : table.rows.length - 1; ++ ++ for (var idx = s; idx < e; idx++) ++ { ++ if (table.rows[idx] == tr) ++ { ++ if (up) ++ tr.parentNode.insertBefore(table.rows[idx], table.rows[idx-1]); ++ else ++ tr.parentNode.insertBefore(table.rows[idx+1], table.rows[idx]); ++ ++ break; ++ } ++ } ++ ++ var ids = [ ]; ++ for (idx = 2; idx < table.rows.length; idx++) ++ { ++ table.rows[idx].className = table.rows[idx].className.replace( ++ /cbi-rowstyle-[12]/, 'cbi-rowstyle-' + (1 + (idx % 2)) ++ ); ++ ++ if (table.rows[idx].id && table.rows[idx].id.match(/-([^\-]+)$/) ) ++ ids.push(RegExp.$1); ++ } ++ ++ var input = document.getElementById(store); ++ if (input) ++ input.value = ids.join(' '); ++ ++ return false; ++} ++ ++function cbi_tag_last(container) ++{ ++ var last; ++ ++ for (var i = 0; i < container.childNodes.length; i++) ++ { ++ var c = container.childNodes[i]; ++ if (c.nodeType == 1 && c.nodeName.toLowerCase() == 'div') ++ { ++ c.className = c.className.replace(/ cbi-value-last$/, ''); ++ last = c; ++ } ++ } ++ ++ if (last) ++ { ++ last.className += ' cbi-value-last'; ++ } ++} ++ ++String.prototype.serialize = function() ++{ ++ var o = this; ++ switch(typeof(o)) ++ { ++ case 'object': ++ // null ++ if( o == null ) ++ { ++ return 'null'; ++ } ++ ++ // array ++ else if( o.length ) ++ { ++ var i, s = ''; ++ ++ for( var i = 0; i < o.length; i++ ) ++ s += (s ? ', ' : '') + String.serialize(o[i]); ++ ++ return '[ ' + s + ' ]'; ++ } ++ ++ // object ++ else ++ { ++ var k, s = ''; ++ ++ for( k in o ) ++ s += (s ? ', ' : '') + k + ': ' + String.serialize(o[k]); ++ ++ return '{ ' + s + ' }'; ++ } ++ ++ break; ++ ++ case 'string': ++ // complex string ++ if( o.match(/[^a-zA-Z0-9_,.: -]/) ) ++ return 'decodeURIComponent("' + encodeURIComponent(o) + '")'; ++ ++ // simple string ++ else ++ return '"' + o + '"'; ++ ++ break; ++ ++ default: ++ return o.toString(); ++ } ++} ++ ++String.prototype.format = function() ++{ ++ if (!RegExp) ++ return; ++ ++ var html_esc = [/&/g, '&', /"/g, '"', /'/g, ''', //g, '>']; ++ var quot_esc = [/"/g, '"', /'/g, ''']; ++ ++ function esc(s, r) { ++ for( var i = 0; i < r.length; i += 2 ) ++ s = s.replace(r[i], r[i+1]); ++ return s; ++ } ++ ++ var str = this; ++ var out = ''; ++ var re = /^(([^%]*)%('.|0|\x20)?(-)?(\d+)?(\.\d+)?(%|b|c|d|u|f|o|s|x|X|q|h|j|t|m))/; ++ var a = b = [], numSubstitutions = 0, numMatches = 0; ++ ++ while( a = re.exec(str) ) ++ { ++ var m = a[1]; ++ var leftpart = a[2], pPad = a[3], pJustify = a[4], pMinLength = a[5]; ++ var pPrecision = a[6], pType = a[7]; ++ ++ numMatches++; ++ ++ if (pType == '%') ++ { ++ subst = '%'; ++ } ++ else ++ { ++ if (numSubstitutions < arguments.length) ++ { ++ var param = arguments[numSubstitutions++]; ++ ++ var pad = ''; ++ if (pPad && pPad.substr(0,1) == "'") ++ pad = leftpart.substr(1,1); ++ else if (pPad) ++ pad = pPad; ++ ++ var justifyRight = true; ++ if (pJustify && pJustify === "-") ++ justifyRight = false; ++ ++ var minLength = -1; ++ if (pMinLength) ++ minLength = parseInt(pMinLength); ++ ++ var precision = -1; ++ if (pPrecision && pType == 'f') ++ precision = parseInt(pPrecision.substring(1)); ++ ++ var subst = param; ++ ++ switch(pType) ++ { ++ case 'b': ++ subst = (parseInt(param) || 0).toString(2); ++ break; ++ ++ case 'c': ++ subst = String.fromCharCode(parseInt(param) || 0); ++ break; ++ ++ case 'd': ++ subst = (parseInt(param) || 0); ++ break; ++ ++ case 'u': ++ subst = Math.abs(parseInt(param) || 0); ++ break; ++ ++ case 'f': ++ subst = (precision > -1) ++ ? ((parseFloat(param) || 0.0)).toFixed(precision) ++ : (parseFloat(param) || 0.0); ++ break; ++ ++ case 'o': ++ subst = (parseInt(param) || 0).toString(8); ++ break; ++ ++ case 's': ++ subst = param; ++ break; ++ ++ case 'x': ++ subst = ('' + (parseInt(param) || 0).toString(16)).toLowerCase(); ++ break; ++ ++ case 'X': ++ subst = ('' + (parseInt(param) || 0).toString(16)).toUpperCase(); ++ break; ++ ++ case 'h': ++ subst = esc(param, html_esc); ++ break; ++ ++ case 'q': ++ subst = esc(param, quot_esc); ++ break; ++ ++ case 'j': ++ subst = String.serialize(param); ++ break; ++ ++ case 't': ++ var td = 0; ++ var th = 0; ++ var tm = 0; ++ var ts = (param || 0); ++ ++ if (ts > 60) { ++ tm = Math.floor(ts / 60); ++ ts = (ts % 60); ++ } ++ ++ if (tm > 60) { ++ th = Math.floor(tm / 60); ++ tm = (tm % 60); ++ } ++ ++ if (th > 24) { ++ td = Math.floor(th / 24); ++ th = (th % 24); ++ } ++ ++ subst = (td > 0) ++ ? String.format('%dd %dh %dm %ds', td, th, tm, ts) ++ : String.format('%dh %dm %ds', th, tm, ts); ++ ++ break; ++ ++ case 'm': ++ var mf = pMinLength ? parseInt(pMinLength) : 1000; ++ var pr = pPrecision ? Math.floor(10*parseFloat('0'+pPrecision)) : 2; ++ ++ var i = 0; ++ var val = parseFloat(param || 0); ++ var units = [ '', 'K', 'M', 'G', 'T', 'P', 'E' ]; ++ ++ for (i = 0; (i < units.length) && (val > mf); i++) ++ val /= mf; ++ ++ subst = val.toFixed(pr) + ' ' + units[i]; ++ break; ++ } ++ } ++ } ++ ++ out += leftpart + subst; ++ str = str.substr(m.length); ++ } ++ ++ return out + str; ++} ++ ++String.prototype.nobr = function() ++{ ++ return this.replace(/[\s\n]+/g, ' '); ++} ++ ++String.serialize = function() ++{ ++ var a = [ ]; ++ for (var i = 1; i < arguments.length; i++) ++ a.push(arguments[i]); ++ return ''.serialize.apply(arguments[0], a); ++} ++ ++String.format = function() ++{ ++ var a = [ ]; ++ for (var i = 1; i < arguments.length; i++) ++ a.push(arguments[i]); ++ return ''.format.apply(arguments[0], a); ++} ++ ++String.nobr = function() ++{ ++ var a = [ ]; ++ for (var i = 1; i < arguments.length; i++) ++ a.push(arguments[i]); ++ return ''.nobr.apply(arguments[0], a); ++} +diff --git a/feeds/luci/modules/luci-base/htdocs/luci-static/resources/cbi/add.gif b/feeds/luci/modules/luci-base/htdocs/luci-static/resources/cbi/add.gif +new file mode 100644 +index 0000000000000000000000000000000000000000..0888abf85ed10d3bdadb25b30b49e8c35b8233d9 +GIT binary patch +literal 378 +zcmZ?wbhEHb6krfwxT?YM=;a5`&}?V#n2z-)rk?s^=Nj6%`^~-Q?==mbXC1h9`pm_a +zJ=P67ET*3H=saLQ{j_)8HuL@?E|ZSCPdMs&_4bo#r@XE{|4_Brxch*^ymP;U605@t +zCcgRjt!Rzz)3;yCrf*qt@%P5-e?EQtb>RNr-FN=3zVdt9tv~<4fPor7@h1x-1A_*G +z4#+T&pBUJtADCR=A+xAY{q)Mqma1&c{a=cmxa4~mroT4KS#`QgUof=)~+&T;I{j*sYXaTd%6BpddF%U0!DD^qC5h +za!gM1`zFkilw?>wPi9)j8Wt9I))h*%tJiLm*{Loqq9hZ|aDstdhKpl`^aUv?Mn)zk +OR#uKC*E=qb4Aua>fQ#$^ + +literal 0 +HcmV?d00001 + +diff --git a/feeds/luci/modules/luci-base/htdocs/luci-static/resources/cbi/apply.gif b/feeds/luci/modules/luci-base/htdocs/luci-static/resources/cbi/apply.gif +new file mode 100644 +index 0000000000000000000000000000000000000000..82ae7ed821f7524c0356e40f79a0379fc634d535 +GIT binary patch +literal 268 +zcmV+n0rUPxNk%w1VGsZi0K^{vM3g9B!ajxBR(;h{C|4L|#z9W1FZTQNam`88@5?V| +z96pC8chOCN)>Mw(T#DRUiQ8Fv(@#mEENRI^ZOca`PZo5~OEz>Nz2>iuw1BeWp~dOA +zBTNzi%BC{z2#%%nWDQ(& +zkP#APQYdIRbsbb52orn(e?S)g~J1 +z%8r<(-QeVRgO&gP{{R30A^8LW000gEEC2ui01E&M06+vZ(8)=q0AK`A2tAn4V1q?& +p9d!Z1mQ}E{1V<7C3PltEGGGP@1A|xv9lPESaCFRSx11yb06WwgHGu#C + +literal 0 +HcmV?d00001 + +diff --git a/feeds/luci/modules/luci-base/htdocs/luci-static/resources/cbi/down.gif b/feeds/luci/modules/luci-base/htdocs/luci-static/resources/cbi/down.gif +new file mode 100644 +index 0000000000000000000000000000000000000000..f0bb6a4ea640d9b2beda344c7485d260f5761779 +GIT binary patch +literal 131 +zcmZ?wbhEHb6krfw*v!o^>1^DDBbk%W#`m8Mo^~Z-=JluvXG6M=M%Jv0O73_44+acK +zK=CIFBLf3BgAPaxWCjC^LBUDS)q5?HkM0ihoS_kK#PIl-D%-2j1P>Oa%ti-AnU~WT +VI^xvQF6&qvTT*m#iwgsTH2{W9F7W^W + +literal 0 +HcmV?d00001 + +diff --git a/feeds/luci/modules/luci-base/htdocs/luci-static/resources/cbi/download.gif b/feeds/luci/modules/luci-base/htdocs/luci-static/resources/cbi/download.gif +new file mode 100644 +index 0000000000000000000000000000000000000000..f99a5383b23fc4270a45048cea54b7d84e4c632b +GIT binary patch +literal 189 +zcmZ?wbhEHb6krfw*v!umwaLqI!OQM5F>k&+Z^fq|bvhXDvcW-zd1eeis_YHo#<8bh&USm7b|HfiTo^1C<- +zB2&*9?YY;WqkfgAr7?@)##fnMrp5vd5e9?B>jf-W))_Q3ne(cwV{E9XUS-Jmz%6-U +ohKzU%--1K~l{<@Algzi@uNL9X;o>Z>(Bsa^YtS>66lAal0Is`BfB*mh + +literal 0 +HcmV?d00001 + +diff --git a/feeds/luci/modules/luci-base/htdocs/luci-static/resources/cbi/edit.gif b/feeds/luci/modules/luci-base/htdocs/luci-static/resources/cbi/edit.gif +new file mode 100644 +index 0000000000000000000000000000000000000000..7b02b6e72a8d3b7f8add18f94fdd25e6d705ddac +GIT binary patch +literal 280 +zcmV+z0q6clNk%w1VGsZi0K@>ugJjP{dk$Tr~sLS5q=$-yaxZ#SE11S +zRIB!<(fT-LmH+?$A^8LV00000EC2ui01yBW000G*;3tk`DMpS%Nm39Du;)pl6A@EB +z5xm!Np4!AfBnlcnph84J6a~km2eJG}oCYZJ=Ydc~*KCvvDSSTxgcd_Cm=B`#5u?d; +z3!M!C{uwM9bQu_Bd3p~bei3zpcpDoG6^DHb2?~}900Ru06&HvI2?=-w0|2G~3!WbU +e5ePdx1QoIi4i<=*mj?$A4;L2}RVKnBApko)oOWvf + +literal 0 +HcmV?d00001 + +diff --git a/feeds/luci/modules/luci-base/htdocs/luci-static/resources/cbi/fieldadd.gif b/feeds/luci/modules/luci-base/htdocs/luci-static/resources/cbi/fieldadd.gif +new file mode 100644 +index 0000000000000000000000000000000000000000..431ff64d1f07ea8368ff38ac49941794a3fdd849 +GIT binary patch +literal 379 +zcmZ?wbhEHb6krfwxXQrr|GeMpEk^&ppZIqp{q-#2*GpypKk@m0DeV7?)PKK@zCNA$ +z`dro2lOEGfdA01Zo^;&3Zkzdpqptt|eeXPA|NqbH{v$3`n~kTR_U=C5@c+lT*LU_b +z?6CO%>(2l8{r~^I{r|G{^@*_mA7}snwCwdU*P=DL|Gypj|E%Km1>^spH~#;&>;M1% +z43q)IpDbVlbU-A?PYi4`9Htg{=x~{833+Y}XmD73G1F_0L0j|T!~?dRp1tm=n^ZC5We%>aw-FvmvIpt(dOEPIJ +XU%@iXKOm5ik(HI@w%c77M+R#EbrzH@ + +literal 0 +HcmV?d00001 + +diff --git a/feeds/luci/modules/luci-base/htdocs/luci-static/resources/cbi/file.gif b/feeds/luci/modules/luci-base/htdocs/luci-static/resources/cbi/file.gif +new file mode 100644 +index 0000000000000000000000000000000000000000..3b1217dd654c6959b4dd97fad83ef626186aac32 +GIT binary patch +literal 371 +zcmZ?wbhEHb6krfwSgOwO=;a5`&}?V#n2z-)rk?s^=Nj6%`^~-Q?==mbXC1h9`pm_a +zJ=P67ET*3H=saLQ{j_)8HuL@?E|ZSCPdMs&_4bo#r@XE{|4_Brxch*^ymP;U605@t +zCcgRjt!Rzz)3;yCrf*qt@%P5-e?EQtb>RNr-FN=3zVdt9tv~;%2NZv@FfuUMGw3h? +z0mx4bY!ePlF7S}~*Qf5ia!Ljt+x!>LTXZ6AWOA+@HqBYFd{VlL+GG#qi3hcPI!-;^ +zoUtx*|HG8YnkuX2->FckQdF&VVlG!suWo5&Z0~ILR#1@ZSC>~xZ|a>QDaYg_FVj6& +zK~j=o;fy7d=CQD_vo4xdJ$c0jna%3bB1+K=2N~F9xHuL`pOlhfWMpDuW#y=Iz3Sq~ +GU=08%rO(X( + +literal 0 +HcmV?d00001 + +diff --git a/feeds/luci/modules/luci-base/htdocs/luci-static/resources/cbi/find.gif b/feeds/luci/modules/luci-base/htdocs/luci-static/resources/cbi/find.gif +new file mode 100644 +index 0000000000000000000000000000000000000000..9ae5e3489bb888d198eb923bb095b48b04403705 +GIT binary patch +literal 273 +zcmV+s0q*`sNk%w1VGsZi0K^{vc9*og-TcMk{nhCBh_A@i+vHYljktnV?e+bOcW6yp +zbLH*z_4)kq_4;Q^Gl{$GpO1s<@%ZNQ{aZUCuG8g1OkMl^{;_vPn!whm%ie)&TXr4L_o{y)q5EzYtB;xTCWf;e!643y9FwiJ6z-cH%*eE2C&?LHF520~{Ks*+N*(+Kf +z6ATMOGH`g(00>C|cno`e9u*=05rZ2M2z-c&9*lzt8600y!Ov2kE{g|XOkwd;Ab>T|a1bhhkywd#Ad>UFp6cDL<(x9okm?0&fIc)IU+y6}9u?s>cL +zfV%E`yz-8@;ex#Gf4%XLy5fSp@qxbce!umEzVU^>^M=3jgu(QP!1I*9=ZV7fhQs%Y +z!}W;8`Hsf-i^%(t$N7xO{E^A|kjnj(%lw$n{+-VKn$iE9(f_H_`l{6Xr`i9>)!(q% +z|FPQtvD^Q);Q!Lxt%1@HYPm;<{lFCn#%1@HYA^uK7a%Ew3Wn>^? +zc_2$=c4=-POmAarWh@{vFflPLFf%PMG$3Ygav)4~LrE?mAW~&)Wnpt=WFTp7bZ;PZ +zXk{Q!bz*F3V<1FtZDDC{E&w6<1OW;Fe*i210000G01yBG2gQJYf`f#Ge|UL`iiU%E +z4Fdv^0C9|ec>{8Eb8>YId5n1ib8n<>Ks|P;sdtD5UQ)1C8wn8(4i5?li3bZ45)%*> +zXk1rRPHh5-0dQtyVqi@~J~=fnVacIvSW!$zKRPxsEGSyo0%}i4K|41xEh!};Rs@Lx +zX+u0XGcGD7A|D)}m^+h$#)}mvMu6y$;erx+p~k=%M?p4qk8 +z_sQn}X|3gLf|Hfa{4HFBMq+vzJXv+X|6!-#{r&xKvgu!?-l)&;*zNvYc8feuU~I4F +zQ<~I5R%ieJ|NsC0A^8LW0018VEC2ui01yBW000Gt;3s}wX?kNyLPFa#5UP3^wk(CC +zKe9+;gdm|(VMuts4zO}DT@VOK1m)={2pi9Zf$&VC9jdjm*+RV&K$v9RFu0|I!2+1F +z6;Q;%BcIpB1z!^u289U*e{2p3gL?-F2^@(e8U&FXn3w5$p!k!8k%2*+K?fuc +zvXg-|`GIQRqSUCAs4#&;3tm~By~MCQ%rwwORo7gy-yy?BWny%m`4$Z=kEQF}JtY=+ +zUfLA?(#?Ar^XBeQKBmcC4v)^p`DK_cQ206RTqffIk;3UrB1Hyj7R*hC%3_Rs)g7Jc +Jeaeaq)&Qp@T0Z~) + +literal 0 +HcmV?d00001 + +diff --git a/feeds/luci/modules/luci-base/htdocs/luci-static/resources/cbi/link.gif b/feeds/luci/modules/luci-base/htdocs/luci-static/resources/cbi/link.gif +new file mode 100644 +index 0000000000000000000000000000000000000000..f0bb78da6b1e2cb17aa1a0e21c80e02979f6321a +GIT binary patch +literal 279 +zcmV+y0qFimNk%w1VGsZi0K^{vm&^Qekgn|U_T}yMiLlDm+vLaN{=MG)S8$O@RcrG0 +z`m5CYWS!x)+5Dr>`-!{kQek_q(&TBN;zLVZ)#vbFn&Fzj)~L(g-skTrF+)B@RpROJ +ze4)L|%+de<|NsC0A^8LW0018VEC2ui01yBW000G)peK&x_?;dVMVDm}1jhw|hep&O +z==8z~GHrORSgnM6@HQ4;4*@!6xGR+fIw4vg +zByI*g?ikQL90EyhXA2I80}~>FNeyv^hX5Oj9sz=0a*zN37#bo03T1_nn*yF52n7l~ +d8?74{0v#Ej2(=Ip2?-Mu8X6f_CBY>j06X7qcdP&a + +literal 0 +HcmV?d00001 + +diff --git a/feeds/luci/modules/luci-base/htdocs/luci-static/resources/cbi/reload.gif b/feeds/luci/modules/luci-base/htdocs/luci-static/resources/cbi/reload.gif +new file mode 100644 +index 0000000000000000000000000000000000000000..8268958a19e016741fffb8309b1174e548f5ce19 +GIT binary patch +literal 248 +zcmV51h?dP)!|<#Vc>gJ1)O +z9Y&Xm98YHe08|T}nE5Daq{Qc(Rx3cM5 +zjz9kQ*3j_j+pnL#{d)WH+j&{p|6ssC8=&};g^__li9rWsJjhQBZ1WCGDDaT!>RZ^( +zEEK83!O|Nd>|`Z3*C*`uOEs;l0!ub)PUp?=f27@0VfU<`vGKzV%|l1oS?<>Z^@_<= +zC~_&t)O6G|iMKeh$aQzhi;0Q%F-^$to;pK9LUxv-l;q?Z@dd)N%uel7=1K?)Gp=1y +z$56M4m6eCxNh-frev|MX$^D9=LUJ*T=NWksPtC-3SYNk)IzaCG{5wQd4hOTmQRpBi`QrZFzZjOw5(w +z;B+Ua|6ri_lZBCiL7qW}0SG{LGO*S^P_K*2tV;HB^Xpa+Tva9QCeXgnd6P%76fc9p +zOamsHcy;@YDln|Vuw<0nl$s8=rCxw48uw_56lMa6}$ +zEFa1XibC1A+uFH>WUA~WrMhG$PUPgWRp}FBoy96PRn(YYfNQZp@O&*5b=4JX)+#bs +F0{{l~XioqD + +literal 0 +HcmV?d00001 + +diff --git a/feeds/luci/modules/luci-base/htdocs/luci-static/resources/cbi/save.gif b/feeds/luci/modules/luci-base/htdocs/luci-static/resources/cbi/save.gif +new file mode 100644 +index 0000000000000000000000000000000000000000..35e949963e4b7a5f04fd1c8932a980901e3d4385 +GIT binary patch +literal 263 +zcmV+i0r>t$Nk%w1VGsZi0K^{vcEd+Ya4xgmmXXkDk(iA6{P)e~xr@?RgUwTMzeLpS +z#Wqhu{H$s5p4O4v<)^3=A2^0_EulhRp%QGjIf`R%Ru$RUj;1k~O1%3=|$g0$`b{ +z1p`T8E1%cF0ssJ7eF+Hu(2Z{06R}5X@39! + +literal 0 +HcmV?d00001 + +diff --git a/feeds/luci/modules/luci-base/htdocs/luci-static/resources/cbi/up.gif b/feeds/luci/modules/luci-base/htdocs/luci-static/resources/cbi/up.gif +new file mode 100644 +index 0000000000000000000000000000000000000000..e8234178efaea626368f6bb5fffaa716e862b596 +GIT binary patch +literal 130 +zcmZ?wbhEHb6krfw*v!o^>1^DDBbk%W#`m8Mo^~Z-=JluvXG6M=M%Jv0O73_44+acK +zK=CIFBLf3BgAPaxWCjC^e!)r4)q5>o$4-6JJxOK08WYFNxvd2&rdbFb5VArX{>gpqy}ZQ3xBIb +z?{>Ooo8TtXQxO=NV3P1sT@;64^wK0*F2cPx#24YJ`L;(K){{a7>y{D4^000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2igk~ +z10N#j&C1UJ00PEIL_t(I%bk;JNYh~y#((d-F*niX1tLszR(8W|B?YCk((V>f1Q|y3 +zp$i02mPJJ$qUfew?1}~@LD3yCltolT>eT3_E$!mUnvQN%+su`^|J#SI1SRzQbl^E~ +zIOjYM{DZxP1@wgIsiEY=v1q5WVKvbCha^p=(8eAoh3~HiQD}WM@{uIP&76*Qm}U)H!CaIlfR3}lP4-oQ$qUu{!g~FbZqHq +zg!eL2cl!?G$7L|wYQcmZic3WFGLbbam-co)ZEbC61OY|=g#P-Lmo21> +zO2%k3aP`_{r3Jf%(GV(x6v&492P7o)BQ-S*t91yO8R>+D8S(l)C?OY>=DasmWBGLR_Y~H&4;f-rIl1Mx- +zeD#`?`_J6(eBQgq4|MuHLI{0HRb`DUDLDyegA+1yFI?SFa$8MXx>J>vo>kLlPPGF> +zPcMvHd8A5BSaIqDp!?liSu>{n`a*0UbEdC7aMAwAl50OY&kYber)cDuF;PrmQ<#G>nlq`Qbdf6#% +z73cgjOfoKOTUOtgKG`1wIKTK_KYDg)V;P{$$U9B>?)iTYizR*We`!DX3M}L-Bi}*( +Qv;Y7A07*qoM6N<$g7Ut8z5oCK + +literal 0 +HcmV?d00001 + +diff --git a/feeds/luci/modules/luci-base/htdocs/luci-static/resources/icons/bridge_disabled.png b/feeds/luci/modules/luci-base/htdocs/luci-static/resources/icons/bridge_disabled.png +new file mode 100644 +index 0000000000000000000000000000000000000000..0f367c5369f83e65b1f95bfa86e2ce3e4254984a +GIT binary patch +literal 517 +zcmV+g0{Z=lP)Px#0%A)?L;(MXkIcUS000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2igk~1Pc#_ +z^H*vB00D_fL_t(2&wY_WNRwe4#((eY=eEyqwL%1uF*mw-SW%a9A=$c2LcMq@nS@9L +z)geZQ4kKcRA+k=AP#r1|4~r1I%pDr)!h=|f?69bPH7_CG+Qv58d^;?I?a*`kKmXt5 +zc^+udJna(g#;fk#aq7okJ*Tw;dlS){{{TKpEj)d7rcswjej_ouH$&9->vN=t;#WsP +z7OO+1&$OFc=CFCrbR9MXY>?$F5p)3>z#E=%l4aIWNZ=Pebl?R30tyc{%7EYptK4Fe +zGb~V3LTFvAU}uaHc@zqF$2WBW8wu6G+9`zG!Odm7jBtX2lCqM<>L;mAi|<{J7UL1k +zr>9khab;kU8OK+Bq3~GV)`pq4Ej`F@gMj<%&O;Xt%ad&KPX9pYtzmq6UlcNtIv8XZ +z?mm5UFWod3@ataDmXlZjGX>DO= +zWgvH9b0A}KWnpw>WFU2OX>MmAM`>+vE+9u~ZEzrIb0B7NWo009Z)S9NVRB_43Sn~~ +zWMyV)Ze?U3VtF8RXk{Qqa%E*8Q*UN;cVTj6AVzO>Ze(F}X>V>IVQyp~X>%Z9c4293 +zVPb4$3TAI|AY^ZMZftL1WFTR5AZT=Sa5^t9cXxL#XK8J4E^l&YMp_mN000ArNklpSPi@Ecd+)yc=P>xSAYoHSOkC-1SKoKO?>pxn_`e_3 +z=erMq4}fbx4rl>w;7i~q!2XvazL=bx++SK+lKuUCIXF0w_4RdGUS4+PaybF+0>xg% +zhA#nMoS&b+yRx!!X>xLsdc95@$COGX#>U3f^z?M@%aDtgWpjzya_n@HTKA7y@ojOiUc@ +z?(WLc(voEAZUO^;$I0~~7#;O-IDqw)`_V)Hnp-^CSWCY++W>N63 +zZF==$aBp<{l{>MvynE|5PDgC~@Q{<*8Dm#VL`h1L8j6KHuT5NI{PmkO>J6T3Z=j>IfDopfgovw +zHEmkeL&OWk!J%y4UPj<8-Xxf`P5tPUIEhK)2xkpSg^*JyFL;yUbwn=oc<%@c#eOpg +zkT6dWT;R(1t62sb?`>yL6(EAsZJdc|9zLZ|EMm-sJ~MC*!6D8NHJYS4?)1F1FWMEr +z8;#WwDwn4?P@;KS?`t0n&fFMyXF#=S9ao6YYDCRvB+X|eQ3DeUFWod3@ataDmXlZjGX>DO= +zWgvH9b0A}KWnpw>WFU2OX>MmAM`>+vE+9u~ZEzrIb0B7NWo009Z)S9NVRB_43Sn~~ +zWMyV)Ze?U3VtF8RXk{Qqa%E*8Q*UN;cVTj6AVzO>Ze(F}X>V>IVQyp~X>%Z9c4293 +zVPb4$3TAI|AY^ZMZftL1WFTR5AZT=Sa5^t9cXxL#XK8J4E^l&YMp_mN000AQNkl!ZKtB7EN|qDvZQpV`4{)C6yJ~#s*?xWA9(Eg`uz*iQOg= +zBaMlLyGA6V8xw*J>=rKL06Pn_4D)gCoO?cAi?QI^?Q`6MSf=M>L#@;vW(U-&=b +zLtq`K1K$JR0CWEp`Dgij{-97O$l>9k6pKY!TU&G4Y&HgNzY1Y^VgLEk($XjE>+7R8 +zZ{DO-|-uH9`KZmSDoqre#8fC^wvAKk-yg|!~< +z4Bn?CwWm05q3fRj-dViSIGy0y2@k&el8?SR0C+39AW-kFb0~qN`j~pfKEor=DRR+e{(0{ZXS)Xw)p<1vf*=4Dpv0q;0u_K#C>0WL +zZcG?m9+4m-AVSitW78%&)mUpg)e!`UfYUKXC-j95XAI8Eiy{9TR1gvb0V+_8<#MEH +zg4Hd&Nf81h0KCVWVVrJJuN-yEQCv*`@378d)0DI0BaCUI+X>#;jy*~t0ya(XI-xJ> +zkVhAci7q!t5vq_d$}m3l1}1G_w8lAu2wed|(im%6G%HUKFANNi1Enhnc#Ah}OxmLM +zv`W%WNRt?64N8R&DU=tyN%1-+3O(LC!oGp4W)L7@h9KzY+Ko568ECw>ohG0F5u9$} +zOhV(y0eu4l7}I~n44gx7h%>}z4N{$SYTnxOas}{4V|9#*G7Jp8PNQ1;$9eE~4A19> +zZVjmx&EpbD{gk-zjCSK0?f49nG_X3xTaBa|FA5aHylfJ^1ANi# +z2EDF(z^B05>Lt_e8ZZsyfJ_ff)B(ppSzTeIW`MpIzt2k{fC0>3SPSRhXB&uF00000 +LNkvXXu0mjf2f71E + +literal 0 +HcmV?d00001 + +diff --git a/feeds/luci/modules/luci-base/htdocs/luci-static/resources/icons/ethernet.png b/feeds/luci/modules/luci-base/htdocs/luci-static/resources/icons/ethernet.png +new file mode 100644 +index 0000000000000000000000000000000000000000..a02538124c6a030579f90bc1c358947234593a63 +GIT binary patch +literal 814 +zcmV+}1JV46P)Px#24YJ`L;(K){{a7>y{D4^000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2igk~ +z10Wyhd#vIB00OQ_L_t(I%Y{>0NK{c2UFXh_V>XKA12Hr)wL(K`)UwouBFd}~F*S(n +zVIk$8KN@Cz2|@%xhA2{~P>B@1FeyTk=s~FoR$9KUrj28x&CDHj?m4@U8BI-V{T=o` +zYp=cb-VBRSQd*R?e_z^dAq18KV+=#XvNZgnpw(!g_wt6yXJE70KrRJLxS6G;BoYY-!J%8>fu^QrghfUo|6Bn~ +zV`dN$gy3NA++_#|oC|pBR^sC2GDNJ8LT{gpw{KnpAk6pY?-m&5ssO;zR2g3S830bG +z+!LI05D8b}e1go(3^X(}LSl?d8Vw{#f?cs9%1{l?Rd6nl5Wg9!ssfA_Dma^;hsqmO +z0D#Y5x{Wn8)v!!ha3C!e$tebqaD5PhLkJFH3k17xp`_?pX2y}-p`jtLDK_%;@nx0O +zmB`M?23OU&36k3-d0?3B+>ylQS{Rh&5f7aPs+b~&!-0W;KAKXdSZ`0C+YdH>k=Vds +zzw2Shs{;V+*|p_T@s(QIXgn@txrdsXA5%j1Dey&_WYr8^Yl?;RK9 +zr%%v%Xaj#vItIVV=7S$^=5}k73+_CMiw+IHdae4rVw$NJ#==A*XF|Gh^}9enZ-Z8n +zz!+dt9HvpT^~sNMWmRhOhW5elmIwgd>{wYd1qb-R=5T^YKqE;I1ei?b(T>hfEz`=c +z*8ZpEcL8pS&8-ax3HFIMTkMmsDso<)Dt`gCCgyOWcc|fnR-$p@&T-2~f7kej+7Px#0%A)?L;(MXkIcUS000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2igk~10OML +zbBhrG00DqWL_t(2&sC2>NEC4x#ed(-*p6To6 +z&?!Vj#G4S&Nw5w=1l|N8H3*Cd?9f3KVT>mgCbpACBZF9D5RY5gehR7{f+v|L++pe6&8R6 +zQ;baXb+#ROK~$z0JPk*Sgg<2V?Bi14v!ng`%}B*-NZJJ}#SH2Eyv*}f4$jR^4u7Z} +z{u6T*=oxTg9mZwz*{82FoY6i4Pp8}CbBjk?Uh&I&c+k>t^FqAIv7>GwGyX1TJs!P& +z>D6R@`L5IGJb%%2!&K;E_RqI%yL&quBPZhv%_T3Q>kLE7@15^I{PmBYag)(lV!!x$ +y{UvhEX}xFuSO4;v)in;w3sa2}@!eS;Qk(#xxRU1SoOx3K0000&iJhvXcHF*h)T1OnEW1i^?zgDfop1p?usL*#PMGT;HQkSO{q6FlJyb$PWkPf|h*eTST}7h8z$}MF(XD(aQ)ZLZ +zM?v0rT<1C4XHn<6PbNA{XL@>1^)apdD_@tcYDrW#m`k#MmslI7p^P;Az74wGs`!SI +zLs$GEZHsafXsu1i-WleMzAL(yw$-LK{0hv;6hrx8kx!!4$``dAyBnY9Jz&DqJo2$A +z!(L$H=KqBeY~CF_viHPz^tTglc?D97CqEBjzUwH}7GI +zapg8YZM~>2Wk%E$d&r@9ly9b4Q +zJpM7T@}r63I(OExUlG%Xcjz3MU+9U^r!SkpjNThDtaP)7>j6L5z%o5|^hlVOyI*uY +zt^UU6NTuY?(Lb4ZIU2Zb5Vz}Pb7KF%ivf&j^CL>$cDz?rMNTQQ|NqDVD7mhghUp%h +zhIA{gi{S8y9YhIIbSv$`B!JiPi!0#4#Jge0)p&YVPHchWcyAn +zQhvb8ggXGXs9;k`u9Uq*YB>O+Q3Rq=2hlLFcG{Q3ORH_}JnY8C+r%@}6|%ySP%bWG +zV~mA;?P`Q2L_Ss})nrJ{$TmeA9Tt*4=}X5x%RioM@_?ZsKSEST-f+GBv~Ya)xX3O{ +z8!d=YthI-13OI;RN~`>|6u5L{z20oBp%9MIj)n$!Aw{Wpq&Rtr4~*_74Gjo@3el>B +zz(Rk;;>2lp73<2;d=r*8z%WkdsG=vRuG_fvxO#uN^El|+5Qoz^X!2MfxJ3m}vyi?> +zMLLDi8+${Z6YbUg?8GNR>-+SwHKdFyr%HqWcs|X_l*-DAC^bG&KCqWg7-_`UlwQ`EdOp_LJkr`L$mHHs75uP?fSgVfsDjuE#ft2b8HDt0yFt!+;C +zEgL=)G9ZFt4wa+N3Xg7FGc0~`&EEt6_%7tyzmnb9B_h1~7~GD4V-Bhx7~QKRkF>&aT>(-!Us@aJxAY@8E?HW$G8g +zSz@7Jcp>iCp;lU1ieF6n7!oAa-1E!rS0 +zF1lBFVS%G#ZO}b@*+bIk+7@Q|iG60vIDVpV%4tW8rKyzwRo_<25;8*Ky@n +z-sX>W*b;M){5lB_Edc@m1`VHy0@dg$PTR9uE$O2&a?KAe?xRlCj&Z$iZYwPx#24YJ`L;(K){{a7>y{D4^000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2iyq@ +z4g)HQF(jJ+00UM@L_t(Y$HkUmZyQArhM$?;bL?0mkdlZmq)1d1p;bxM3L$~`2IM~= +zBz|B1L5nIxnj#`Ziz^6xC{m#kO(Mr>9H+ML&bxfr^ZA@RC#jIY(rUf8bMxLi^Umzb +z#>R%{fB0E|&%gL=#7Ojtw& +zV-zm{TCtzanQfB9=LRGI&j3|57}em}dme1vr}emn_htK9ZI1QzbynWKOcd4d-jj~f +zg6;G>;q$#O4Pz|U7(@gC;w0h8A5SVl0pfVbpHH6#ry>|t=As%Z5<*{aUtoNiX$bA0 +z-{;QVJ3N2>H))yz&^vj_y>GYh-XS8W2+PY$e0Y0}*5ejCzwOXy)LFZ6lMmKz5=Ave +z!+wc$iE&`02*RVEAM)(kU!-YD94G9z57^%R2@x>HV2q+h>2x~$vhzEG!H^_L=ys3U +z+}fml&_+ZN(cr#-U72IalpDth0NX!4Vs~#pXJ}MI3bLUJySsbr?d@Z&<;L|@78e)k +zc8^(lb14&_pJHvtiz#Ry96IN6wHj4KB?p(OLH>*^p8&=P!Z^piqMS;M2`^;8MipZw +zET@3Az+A}x16Z|_TJtmOxVS4IF!C-Fn_`R!A5;wSDdsurab0Kcc;`#xY}Mz45-NmR +zi+LqyS`PX6S?1iB5V?Z?ama0PF+mRTcB2VnHOgC;`ZVT7c!HonFe2GnXuoI@r%@hi +zqoEIYHzUWTjwRFL8Y}tQl@807`V8ZU`drFzXlc|(4C07JE#*P$9omOAvfhfZq3bzZ +z30TLBiz7&DA}%$dp+pw0UOvQ)l&dQpoHJZm>EN95?#cl#`%xA#pQ$>^8K3UhcCwt# +zgNQKSYy$B9>U#hT`H0P(VDsI0{&h01UYm|w6xqC-W}Hsb8%Yw=sL%7s$Dh*a9B_Ep +zDW5VP;<)-0vet6z)@@#2cq302oK?r!G#C!3*M}^;w!l|kem&!?%&VrL$nvk-JDSb7 +z>gMp`=#b`olUl7lDX~ngDv~3s=%ndn`_4I%B<8qxL|izV&pwX}&7^nIgOlEQ7oH1V +zg{sP_A{77jUUi;@EsEt;oL$&z#>K$`e1HFk|NMIU5B8^)T!cwsE&u=k07*qoM6N<$ +Ef)7g4YybcN + +literal 0 +HcmV?d00001 + +diff --git a/feeds/luci/modules/luci-base/htdocs/luci-static/resources/icons/port_up.png b/feeds/luci/modules/luci-base/htdocs/luci-static/resources/icons/port_up.png +new file mode 100644 +index 0000000000000000000000000000000000000000..e06303791092800beef5f08cd3dd9ba70cf68fa7 +GIT binary patch +literal 1401 +zcmV-<1%~>GP)Px#24YJ`L;(K){{a7>y{D4^000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2iyq@ +z4;&z+e5ot|00j9-L_t(Y$HkV*Z&Xzr$3N$Br!##>U(?PE^f4_3Q6gvzMmK5{s5|3E +zV>Fn!FuE|tm7&pvYySmFOkCkw5;O`?Bmp0ENGJrUZ7FSs&J5|y)Xse$7k4@gbc&jo +zcs4iZp5Og_@AvzA9dYvHNyGoJG{BLghqpO4|Ke?{gVvVce)C-fylLBhSY0)43nXUCv?5 +zR{L12jmgPLhKEM5tQf`^{J?LrHCq|e!jaNe1X^FN=W%292JgP}9#Sf#lqjVz#!#tN +zDBUSCKR3tl&1nc`DT^wo}8lZ9LBhAQ4Zn|Iq`y`1~Y`w-(6fm-+t88Fmg0(chOu2uXM!>y|MN +z0-s{B$n5Ma^CRg(S5 +zdh(fjSnJJAGjz35=E}?!f*@eEmd5C>JEicQ6+|EOE~Z8TtN^JghBL?jA9tG+Q>~`rc^57dI3voh9DH|pV-NvgAtFt#av)IR;M+WHWP;_-Fex1IKt$kwc4-s!m +zG!m!3FUdf1pdqzVR)g{V9b4bs8nmTRUL;#!1fPC!k+aiF3?&~TJCdZcvz@aSu2WM< +z`ZFCIej%2G;%z`Rvpx +zYkvl0)7?yrrKxNJU?LnXb&I1d4R5VtKKLCu~-`d$ma{}fA}$;Ja~vqCKGk9 +z_44+NH*t$)o2e6**l-LJLw)QXOR;pj%*EV1p)pK8HOeQ)p2pJm&SU}H&KDRR877hF +zKx>WbI#k!oxJ|RUPx$sYygZR5;6(lh0}sQ51*2JDCtlap7OO5YdJr)|KGSK7oQz-@rv5K)3G2cQ7jp +zF1k_N_zpgS1shj}78R42w3C_pJIBSHNh%gg?&{vl%y)j@nKOYU*52NmtxEo&IiF0c +z*ZDGl_3rKG-Sv%afGo>+|KS}=0iw)etN>`WS^)nC^m@HZE356D<~*5>E}IE}5I7&u +z?zDCuJ$(Gi%m6s(e>pTy```i4`3i~=DOEMe8(1JHuyZbZ?b`8MX@5_Yh*wMsk +z0Coo8?&h7BH*efp1L%J}_-zu6x68dzzyo0a0?Kk`Wi?Cts`Aqb%;P)(fPj4a#mB7} +zG#`%1u`(%AOS{bGFPXbFX~2`hz0E7n)~;TB0d$yQ +zlfI8raB3fAkvLIYW +z(*t=@NDqT~T+Bf|iuvKuPa96lZ{Q)%Lb%@f)!yHq4FHD2QM)LLK?4|#N1>cmgY+{6 +lkES2>L~{WMEVm4p`~i^dDOX9Zg=7E#002ovPDHLkV1kKx;|%}+ + +literal 0 +HcmV?d00001 + +diff --git a/feeds/luci/modules/luci-base/htdocs/luci-static/resources/icons/signal-0.png b/feeds/luci/modules/luci-base/htdocs/luci-static/resources/icons/signal-0.png +new file mode 100644 +index 0000000000000000000000000000000000000000..114583a67611fb0320e55d309201fb0172b4aa6d +GIT binary patch +literal 478 +zcmV<40U`d0P)Px$m`OxIR5;6(lD%$IK@f$%-D?X)hz2A?g%X<|0WBRo0Z5UOH=xJ^goi-91Fnda +zA`OT)0Pzw*Bve=~D14nC?%my)q1d~&ArXkXpQ;GmoRR!>Wz-TnOxpuw3Q~J}h`j)By;2c*2`q!$R +zmoGNoswx0S$KNMvxpw9Nx!QuHgh-yMB357yhhC;&Z-4KVcX}H@&7O)1(#cLLECbL> +z08bu2db56a;|{>_kE0V6q4+j2D;6*Z=tV#Xt%lg0kB#17iiX;{mx^IjzNYkFr!=bvgbrtds +z3PAs|0MH9DXow*Lq(TiV3PdD7>ZWS;kOi3KCAJ~X0p5F5g|Y*&Y$0C;wY11V7scLW +zGS;>||7nJE-nr?l?jIh08v{(Ib-!tvaRJn`+J!cb^Dt*gPx$uSrBfR5;6(lg(-qQ5462cQPTABGhOl8#gT?bSDTd>|F +zTy|q|(>HMKx_*F&p|M(c9DWdFZQ1V(i;FD`e%0^n4*!YZar0$ob)^IF39tVY|HoK%tJ>tgEUp +zvrs+b`9$@2IEmet6mdt*XG2q+1K3{{0Mbz*))K4a8*1*gg;FdQRb4H5hyvW>5XWP& +zq5>pAF$1X;h@mD`GMLM352{s6kNUstG%vn`hcpQx&+_KiZ~Y#CjLw^fho`+7Fc=O( +rF)4fTGX)pZpVdZl1qdv549NZfO0X$Bi?J_D00000NkvXXu0mjf(<$K< + +literal 0 +HcmV?d00001 + +diff --git a/feeds/luci/modules/luci-base/htdocs/luci-static/resources/icons/signal-50-75.png b/feeds/luci/modules/luci-base/htdocs/luci-static/resources/icons/signal-50-75.png +new file mode 100644 +index 0000000000000000000000000000000000000000..26bcbf715d6ff22f3fb95f1efa3fcedc6b0abba9 +GIT binary patch +literal 500 +zcmVPx$u1Q2eR5;6(le=ycK@^6+S#PkA6)6~k+#p0Egp>v$AyJSX3Yt*TQRD$a3pL^$ +z=qS?=(S#@9C0rqdi4};<#_P-Oxlruv+K7nAQ_X1ReCPkqITKi69UgwzE!7{_=V@NP +zPgenKZQpyfy>)jFAW0IAK7C{*fT)>B2|%mW0{B1R$-(FDm5%J!=l;p``kmVfKnPq8 +zNZQ5zi>LSB0+{JTQAf?I +zOBI#@*ad(`JGb8UHaB_zKZc`oQELG1cx?d>fc*;?Pu0%G1pw#s(mP8Eth7b}fCA~> +z>*HMs+6>36C=yYNip@n0t1W<;Y212c;la+0gWl$~=K!5{%JG+e*6nTpP{iy_4MbU3 +zh;5wARZp{dmHnzBz6elrN^>+mcJ;q30Ho7GtSuJh8*1*gg|ZYxy|G~CO&i_4D&lM= +zRzyG&6f=+*Am%K0K}{EP5JxdR8UC_SUVH}+X%a#{&ey(v8x8>Se7-g>%0aDQo!_C~ +q&j!_J3NEHU<3zI#1Xf!HjQ;?>WFH){?)wP<0000Px$pGibPR5;6(lDlpbQ4of|vut7_6Ui82nSvJx1wtTEKo12?DCsEj0HK8%@eWkH +z0R>Wc0(xpHgfKBTN4D4A%UmdYcGu$Wsm@4ezM21@32YDtkB@Il&|7t0X6f^E6TtN= +zgGZMJy#s*m*_0Qr-m(!uRBbXZ0Z?;*zXR?Zz3y*!<*?2tv*N76Z2JP_5YXvV7jQ7E-C=3%KXfB1gK&58^FCMFCPZd0f3p_5cNi{m=m9< +z|3Sjd{mV~>d%YpRr}61b)EYpg=4R~#V7~(9OSSLO=~+>EcYOj?8V}4dApQ9`^0G`M +zTC8F&YSdlbgRRQ}NU!Z*JR0tuzYoyuq#VC_H|_U(t4oXB8wp~q2Q^?(sD7CitL{6B +zcw3<6ROXFgqDt#Q1T0Ijj#wPuP;;*(RFxp=ZIR%$2V$!~X`YLf5s(DMtkoyxtZzX~ +z+bzUvOi#w&>@+Jsf`>E-A)9Ag?>~%309jUS6=gN5ip00000NkvXXu0mjfH3-v* + +literal 0 +HcmV?d00001 + +diff --git a/feeds/luci/modules/luci-base/htdocs/luci-static/resources/icons/signal-none.png b/feeds/luci/modules/luci-base/htdocs/luci-static/resources/icons/signal-none.png +new file mode 100644 +index 0000000000000000000000000000000000000000..b77585c0f053fb7c2ebd618370a466b7ccb675dc +GIT binary patch +literal 681 +zcmV;a0#^NrP)Px%V@X6oR5;6(lDkh-Q4oi}bMIboT@l2$5QPP$FltOpR8WE%8%;#f#L`e;qZV5E +zC)ik7N~1&z8VrpZpBOap5j8#v3=qKOp=ji>tekW1nPWlLLXCu}W}0t)Gx-z?sP^{j +zd#v+y`T6IJy_#4EAYD~+p(?%c7(fsN-0JLLL4eqa#IXe+3`2nb16o^KOOvUnB|m3p +zCYOsi0F+{WKvWpE96og9l86A%*WWuPey&$u0dD>iTpZ)v+*WbU=V1zk{3}7*&9>%1 +z$tnQxeuops^xy#5cOS@(e@V^kYam%xhC+dW`V;W_?W@s>^_6P?`g%W2tJ`;rRAv~G +zi?G^ALR=u_WvppF#e+xpFaDLl7%j$X0DfF+D_mv_;htJb8|oSSJT#WOc4J+1`!2&; +z<7(0*{*=Sa+Q7M(TqeWffx##`d4iILdOYy+&b?GBGeT}tHQ}Q!RH#Z46_uOLSEZ|) +z@^U=s?wX2S%#Rl@iIrmM-ddbEzISwzdiAC#*k4cO@uLi#K1<^L$LfT&#?9*7Z#hKf +zzAhq&*4~5qeybB6b}_wm^K`nYu{gGtsIU+eJ}}mZu?Axe#u&uoV;7U$zKu|8_4(3e +zqNmSsduve#4@`*&+3sfqT4T3t?hUlDzX956L>$h=6s%rJuBO_Q^z}1Ql%lxtFwV~U +znJ3+ZkGo;VcBtGinHU=z5v_B>-lJ5Y)WpLU^U=`Px#24YJ`L;(K){{a7>y{D4^000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2igk~ +z10Vv6eZV^a00NpxL_t(I%cYWANK|VWhM#|}m1TQo>>RT@BiZ=?j=D26#OT7#5QIpO +z)l?UCS3yA-K?D{A!46`#sYxv=Bq``=9&`FmdgPEaxA?R=LNza@=E_dBcVp<2!p2ZExG7D_@-17&Z!b +zUZ~HRJ0agmD@4C6b8P=$eKt5Q#)Po;QZ>_M2b)tv4z!f)!b~v1;7p2^qQ3u6R%2 +zMCrZFm3L61=dI3nP4Sc)n#9CP#=1VXHpQM+-38)5+VX6zaVtoVoBf}gsyFolc)Zno +Y1IgoY&vcijs{jB107*qoM6N<$f_BAd4gdfE + +literal 0 +HcmV?d00001 + +diff --git a/feeds/luci/modules/luci-base/htdocs/luci-static/resources/icons/switch_disabled.png b/feeds/luci/modules/luci-base/htdocs/luci-static/resources/icons/switch_disabled.png +new file mode 100644 +index 0000000000000000000000000000000000000000..b8c84c8dc46e68abe3ea5d4de8832b530ae2a3a1 +GIT binary patch +literal 505 +zcmVPx#0%A)?L;(MXkIcUS000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2igk~10WR$ +zu0{L+00DhTL_t(2&xMcAOOtUN$6w#?^E^4-B&K+YWr5Qm`~eD%pfwv3bqa*)s1u<> +z|ATn*lz8aiMHHihFfWY>UfRhykRT892RdS7Y^$`DKlZEd^E@3)Q4jV$zTO``ykGF2 +zh;e`EHug0K@s$VGbsr?Poj+shp8BY46;|!)wc1nL>WnNXk%%N&z{yY6=)!}^C>7@a +zk#2O5JVN6HctRtfE|37ag`YZGw;d)trXp)vKcJ%_fdC>AX|>bNgJ$J9LCS`-FQcSD +zVq;^Wqwn4{t?wNVjk4+B*oxLQxi3ozfS0o)ee31`+?be(&0Wz90mbNUu8{TRmiJN- +z7`{*sBVh3Uv+3W4%cvc_4HXLjL3fK+YZKo-#6W-A^?W9|^X?6081iZ_Je{}vqH391 +zp*}0c`%hvrTy&(O9#>OO;~gx-Q9c>3Zf4i}f_L{fzAPS!k%^w5s#HopGFz$A*6L>t +v07AXauX%gvR|o(D?bPOcnj2n;)46{E7nhZCw2s0500000NkvXXu0mjfc1YRY + +literal 0 +HcmV?d00001 + +diff --git a/feeds/luci/modules/luci-base/htdocs/luci-static/resources/icons/tunnel.png b/feeds/luci/modules/luci-base/htdocs/luci-static/resources/icons/tunnel.png +new file mode 100644 +index 0000000000000000000000000000000000000000..c5a09dd6857f7a1f0cf2577827ec021ce5054bdf +GIT binary patch +literal 533 +zcmV+w0_y#VP)Px$&q+i2|U0=rh{?fhcvl{Kw@wZX;A%p+%d +z`XPbQ1eY(3U@C=A|3FsP>BdXj5B_Y`@p=sgs_S&?r48_D@iPEpXS?^JnzUvCV0Jdz +zwHIYsRwfdOg*&}eYk*T1=;{uCw`x@FTKgU}*v_6if99fp@RX-mD$ws6;QhOWeO{E= +zLvOEvl(HQl1SzlgFvU^xa;}zJy||qNxXvk=OnuN=hY#KZE2AE~ +z{=OW)aXOm*SUhq4!eAQsnRp!E=cQcPq~CX(a%F>nKgi0;vc0tQEi1R{jUeFvlK&k8 +z#%|pnU;FRH)9OV^Nx8CtsZ0v1dHRm@d4wRP4k?)jR)>Q}CxP^f=P#qlx%iHo7q|Qa +X$qd1O*F?;t00000NkvXXu0mjfYK{DI + +literal 0 +HcmV?d00001 + +diff --git a/feeds/luci/modules/luci-base/htdocs/luci-static/resources/icons/tunnel_disabled.png b/feeds/luci/modules/luci-base/htdocs/luci-static/resources/icons/tunnel_disabled.png +new file mode 100644 +index 0000000000000000000000000000000000000000..ad9856cfecac80bc025b48feca437b7c524f86f9 +GIT binary patch +literal 546 +zcmV+-0^R+IP)Px#24YJ`L;(K){{a7>y{D4^000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2ipl4 +z03s?-nbf-g00E*&L_t(I%Z-zOeSeWj%u-?)eN +zrKX>fbn?zQ7I*T +z-~SD~797=TwXiG;DJ1||ma$kYPWf;+d(lq5pE_Y`I>-G9H^;Ry{vF&I8rz_vW#ZpS?FbutGla5@H +zBq2!>(lkBGt)eKNT-W{LIF21f5w%*4`FwuCrBbO-tyV9%SVD*gr4&&VA*CdaW6HQ( +zlLfF^tx74s6R>yJJ +z?RGDl&E`qwdHxyrwB2sM17Am@(epnp_FFDO2;w+KO38k|$F^--2=QP^Dc8WSMx*f! +kcPx#24YJ`L;(K){{a7>y{D4^000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2igk~ +z10Vv6eZV^a00NpxL_t(I%cYWANK|VWhM#|}m1TQo>>RT@BiZ=?j=D26#OT7#5QIpO +z)l?UCS3yA-K?D{A!46`#sYxv=Bq``=9&`FmdgPEaxA?R=LNza@=E_dBcVp<2!p2ZExG7D_@-17&Z!b +zUZ~HRJ0agmD@4C6b8P=$eKt5Q#)Po;QZ>_M2b)tv4z!f)!b~v1;7p2^qQ3u6R%2 +zMCrZFm3L61=dI3nP4Sc)n#9CP#=1VXHpQM+-38)5+VX6zaVtoVoBf}gsyFolc)Zno +Y1IgoY&vcijs{jB107*qoM6N<$f_BAd4gdfE + +literal 0 +HcmV?d00001 + +diff --git a/feeds/luci/modules/luci-base/htdocs/luci-static/resources/icons/vlan_disabled.png b/feeds/luci/modules/luci-base/htdocs/luci-static/resources/icons/vlan_disabled.png +new file mode 100644 +index 0000000000000000000000000000000000000000..b8c84c8dc46e68abe3ea5d4de8832b530ae2a3a1 +GIT binary patch +literal 505 +zcmVPx#0%A)?L;(MXkIcUS000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2igk~10WR$ +zu0{L+00DhTL_t(2&xMcAOOtUN$6w#?^E^4-B&K+YWr5Qm`~eD%pfwv3bqa*)s1u<> +z|ATn*lz8aiMHHihFfWY>UfRhykRT892RdS7Y^$`DKlZEd^E@3)Q4jV$zTO``ykGF2 +zh;e`EHug0K@s$VGbsr?Poj+shp8BY46;|!)wc1nL>WnNXk%%N&z{yY6=)!}^C>7@a +zk#2O5JVN6HctRtfE|37ag`YZGw;d)trXp)vKcJ%_fdC>AX|>bNgJ$J9LCS`-FQcSD +zVq;^Wqwn4{t?wNVjk4+B*oxLQxi3ozfS0o)ee31`+?be(&0Wz90mbNUu8{TRmiJN- +z7`{*sBVh3Uv+3W4%cvc_4HXLjL3fK+YZKo-#6W-A^?W9|^X?6081iZ_Je{}vqH391 +zp*}0c`%hvrTy&(O9#>OO;~gx-Q9c>3Zf4i}f_L{fzAPS!k%^w5s#HopGFz$A*6L>t +v07AXauX%gvR|o(D?bPOcnj2n;)46{E7nhZCw2s0500000NkvXXu0mjfc1YRY + +literal 0 +HcmV?d00001 + +diff --git a/feeds/luci/modules/luci-base/htdocs/luci-static/resources/icons/wifi.png b/feeds/luci/modules/luci-base/htdocs/luci-static/resources/icons/wifi.png +new file mode 100644 +index 0000000000000000000000000000000000000000..528ce2b4e91e3ebb9b9473ec196e10f0a608e4f6 +GIT binary patch +literal 1037 +zcmV+o1oHcdP)Px#24YJ`L;(K){{a7>y{D4^000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2igk~ +z10W0Xp?IGF00WIlL_t(I%Vm;nOjBnR$N$g0<aSF6~2JT(gGYkV$%iHm2BuaFgdORFWK9r@*g9nk&Z|VeN +zWfVyEV}0(dn8~)8ExZtkCt3}9o(oL;T=v7cPc&!yIy5WOBV`6X&qd;iRsb;RpboOmhXfoZ3!VRV*;M +zY6c4}TkhOz)v~OEFw`Pb*=gXlg~64WW^;{^jNhA}kA15!TIs4Iz%RUqeN@I_jAc`OL=?mT>d?DB!v0Dy6RI0OI?vy5x__Vm8?>TJo3Zw~M7u%q8yN9LEJxHRHh +z2(7K4-I^&GzCFE9%rY(j$h&Ah_zeKy&90BO`evU{@AQ4;+=Z{{!7sjDdFSl-=-v~a +zvEI+VQUd;2`d0U$tpM=ip+P*0a-PAV?sYz?K +zSgIsRg3I-iv+KYI+m9SRItt*Q0rhpY=WqQwf(5_7cg{CIHs_lc0B8X)04M|>J6#k8i6kK={00000NkvXX +Hu0mjfFP-V* + +literal 0 +HcmV?d00001 + +diff --git a/feeds/luci/modules/luci-base/htdocs/luci-static/resources/icons/wifi_big.png b/feeds/luci/modules/luci-base/htdocs/luci-static/resources/icons/wifi_big.png +new file mode 100644 +index 0000000000000000000000000000000000000000..d73a5e7401ae9ec36bada05af157e39fe5b81a1c +GIT binary patch +literal 2865 +zcmV-13(oY3P)Px<>q$gGR9M5+mRXQg*LlbP=iGC*?%Uh+bocBtLcqWPV_`rt2$)4ykSJ_{6xs3; +zV=F0KkyA?Yq^SImR+UnY@{pudWjUb2vJ?}`;1R~g4knU~A}<9Rgl%99h^2>_?peBf +zdb@r5_Fc}&gMlCnieK|p-MUrxEdO8qzwbNe65JBQ>7PY2$b>WLFXjN^-8v2-So%3I +z09vm7Bm;nsnKd2&JN@_YKyI@Jg7u}p)zOE(>ap}l`Q{Pw0rBBjDFDbG=R#7Of@zK{nvHtVvSt^`p?q0w9{bnf6W5(wvuk&&E*S$q|HkM3`wsxt +z?ApCl@nfC8+WV=W{oZN89{TD}9*sq))E+lxxd=s6D(g-_M1^I>g{%Y>;mH8t5atrs +zsgr2Vgw7UhSSZ +zb=~qU&mDbO5$>|CaL|Mt=u~7Z@?foFPIbNTUs~> +zIz`4J$brtTaL`nQyKKvIM;}h7g$4j>_rxj2gX^#BN&v9p@%?SO%2&SgFHip>ola}H +z_E1l8ru?O@uH7Iej=NnIABr$kTiQ;gEyxD0KGet +zrK#K&MS>a$C>k{};0m$aw7fMzLkSSZS_o(>5j5rt9`^;06G3AHw3RT{5;T;6X?bg0 +zA(m4U1CfBDDH7DuRBj7;cP0U#!JAW(X0HPP1^}9-tn^82Y}fdBYw?$J$(kVd2aRyv +z6JiMg?zRe*K}u+VN{mrJ;Z9Ajp83AvRcGP4F0@!DB7={bR1P*EF^2+*Rj3TIXdFTa +z1dK?v)~w!Ntj+yu*Z8<~a?i{~nbjWy@Iwj!p0ImD9mafkLQe8XB+46&{#aOTYO32s +z6faq+H&ce8f&l?S5H!ynF`j?+Z}I9YuVMGU?Z%45?J&gmMDdcE +z>UPD#YLhn_{X7zhh9~4?sKc1|gxzza2&rI^#6VJ$G&dCBwJ7IuEYzYHo{$ofPol2p +zsj8|d99-qxRjvFbq>?EB03{TU?${11e+itsDhF3pRZ(2eQzf57Js~AREsDXp91HMT +zRMOl~Vj!te!6G+OAS6E!D>cHV77PVFC+HHPdma+9&_ke3(B*>qLdc9#S#Uvx5GWMq +zp(qOMW&;hY4j}{}C?%B29_Mhmpn~wA@br*JoPD&}%=5qM%fiVQzSAa?c +zlz=*xBU4I<08v1^pznwTQzYUr9?*%SJ65fg5{cb#fC_5bb!VB^>Y6fvt`IaUwOXf= +zjQWfVX6OnpE>xJVw{QYVT08DWy`II_zV=VQZ=C**BHqynPY~h@AH{Nw8M?wL1oI>! +zS8BCRg`g=DUw4VG+jVCd71X=|;1K)$VzG8_PkZm%Hf_kNrcEzY%z;#Es35>-DiL)i +zE@bs+#GnRh80_ysAhH%-q#poq-$(mlRpv2%DGw7Nx=^l@fu)^}fJ7A?$n8b6n~9$?3ua +zm3l4ggEn=ImHL-=uCbC2+N{)T;mPU31CA>_55W5a2LNF9)YzHMdmdd_6VDDc$<_mVNJyAGNP}{Gplo@=!1!6%3iVi}abn +z2S!FQcJO;BnjQw?CV6D@Dr|l5LHOLm*c)Sb``t4r*^(&EWyt8rD6X78r4+ryM4?g% +z{PtXKlnZkD#GcPQajPD|9b(O{*Ir?S?by^?(RMvPs%n~s!$0}~Hf6<+s-T>5d(690z+2{IvPbWW@G_cktw%FMR2CI?|m0W=)1N=g6T225JlHH(-|%#hFXW +z(57KzGiTZPdGXa>eq-m~-ARYxL*h?*a$gzQ{3#TR1=QaZ`zDP{=ip$3jFh(H13#!7him_GZG6=Kk@0$ +zV0!v0QmJ-ms)lCM#zLutxw$#a&CjAxSio$)jAG3ejfQVIe*HvGi#m`@B~xGc+)li{ +z|2wFZYF$r1{dD$^b$|h2^?K#qN49?wQ&U&*y|MjJ6a|J6LPtjj+L9^6TH@&I?S-mp +z&~+WQ-5{k>DVQ(hM`mVn$mi#AC36`=n}_k;*Y~{(py%fH`%r)!wdZzxez4X#c=Wd0#Z4LA@$awh+ndd1%K%Q@T)2i| +zkm2Et_jPyoE{(QaZ3!7cO_mwqLV!sUG(CV#n>Jy1XcSY^)5id`{htn`)9ICfh%2g! +zpNt(rxm>Dev)ON6J30f`9vy&gnx=C2@R73slxwG|1VBk75`hhyH$1TVBZD7*>#aA* +zj_r>@mRbCT7hYKT%rnpY`a=N%0r`uL>pHvleBBcQn7oqR3Sjoy+{!hP+c|gLT0fu9 +zHxG>++8qnU1{N=s{_ETOUIjpy!q{H`_^Usv3qGW6*&X1$o8BJ&zr_ClauFTo#)9&8 +P00000NkvXXu0mjf5lV=2 + +literal 0 +HcmV?d00001 + +diff --git a/feeds/luci/modules/luci-base/htdocs/luci-static/resources/icons/wifi_big_disabled.png b/feeds/luci/modules/luci-base/htdocs/luci-static/resources/icons/wifi_big_disabled.png +new file mode 100644 +index 0000000000000000000000000000000000000000..af93b37b7a7a12f136c055362ed91a7eddfc2c2c +GIT binary patch +literal 2853 +zcmWlbc|4TcAIA@&A@WdHxX5U(B}?`tvOEn!Zeya{u|%V+H~hxFS3}5>wO{rnWRF6~ +zQbLSIvXy;_k!=!Y$o6}F=XIWQ{yN{!Ip=wQKi?CB``eg@OPC7)z+-X+i$`Yh|9>bB +zWF!RzZ6Om232zL8Dyqm20Jx@2um+aa9m6-wJ^nOK53?E`4);*cbdtswIJur1c=Elb +zz>r^CJL+&%`q6iODQ*3e9IQ*~k0)&z;)3slseg%yay)dp@1YaT@()g#Q%?2~3pd+4 +zC!Me65L$b~wEmn;`s-9f(_*Z;jK!qWtL8Gs%i4VJFu$t3h)3&PE6em1`fxcD(z!c7 +zKaa1xky2bza%sH2bAF?-QOoDxw=Wy89#mxmxbk5(@N;(7(R+VqgI*cad3&kvnM!Q2 +z>$?vhuwIIiq9KB!qG=xEBZEJ-rVM_@#BhczeMa{%Lu>2nqkQb7TIuH~wGhyU*dE}| +zkBp3b9U4l_ORe2w(vKs;BA~tgU%tnk!n+|;NE~0iqy0@|%tr%OscSiLJFWEAO{(@P +zdb6fR=>+<@QrF7@>00_87aE(6FhIqJV8@|sZewTta!-HGrA!cUMOBywWAa71h=ZmxyBDTHtT03k^l5o6W@(&2 +zX9yAHTj?4k>Zw%xdDEN +zB%CyMc{|7wmE>jD(5=XAm;78BmSzE*XzVMfKnU=o^2rzziw;GfQQu%P6cf}U#uEu+ +zlQFe5HAx;w7^X(0ETwk)1(&5&9RxSJk5&z6`>%gAfS&Vocxlr3$hZny1!vHXA>+X3 +zKjV#7soC1$w<>RFhfE)*)FOYgMI{xV3C*!a+#UDps;vlyQHtCh<-=}2va_?l)VYs- +zO_RMTg2u`M4@Ur~fp1DnOKWOs(2rpBa-jW~s(G<=tc(f%gLhU(l%qI!3Bf%J3k$d2 +z?k;AAt7vJ(T(Ex|t@7+@_pe{SEJBT0v58m~%z^pZ%(ks26qWTOP~5M=G_>;%D(v5Y>dr;cDgmt~ek;skNxC>Vtn +zMLT&>iCLtF5I-Ul3B9m9e_xJ*s~&ylYX`yNXsig)_D)<(sQyEe{VABtpcfG;B?EJ$ +z(B$vNTn=$HD^1F1vN#!ID)TFJnho#(%Q&SCoeNRW7f!UB@-v?cc1>)%A!1ySthSB+ +zVNdRPZicepgM(V^6CLAv4sW@&(lb->WGESh{@`mTM2zDV>&#hcaztYzlq3a-4TQ>K +z{us7XuyjW8+F1Q$zU$aYa7A8TK6$0dYxX@m0Gc5?imzY4MpDuQm7hvkkTf6c1$ho} +z3vP88?**F$i4tV-s+A~~_F!xT>E3vK_SKTXKVeiwnOhaURA=+UscRK1zy!m;TU1ok +z7LS#X6`aTU`!{%GNRm5d0hswwlAG@5@4pbtT#wYG85QAwAc{ZbfjEr9ms*ZlSsh%X +zY8j!>`V*o_RhG}Kgb71<9qR?LtmDc-P%@~M7tA2 +zFE`wqGh71`eh!|`HWGTqYU$VY+ +zD{*~&oiI5$`Bb_{f!H@aF%gF_@Evj7qb-Q(pmEv&3Q3|YBp`Mq1EY$|$})SL!fdKX +z8;f20nGD8UzwVw~G*;q>F9xf-8G2--n>#Ign#*hM11DK2YHG^9!gXwOJ1E;(`Pp(o?EG7^v7;3qqXJ}YuXKtP}@G&J-bl}ha|99W9NnB+-w@kYWUrPoV1v}j96 +z31IXt{3l&WVAQw8*}*|Se53OWADT_~VC(volEEjYMP8+rzeA-@H+5)v4!NnlK{z8J +zo7PfOtMh?UbadMgv-e~$nKnoZFIoAWE=TE8jEhN1O8UIIT5+@T23=iEO;l7!$TfU6 +z@{CiLU`BTK9TJITQ%6|qkA(9Bot(&1Ex`>X11=#5u-`j7J5RyUHYq77M~9kIOcVeU +zZ@h^`)z$qC|Lz4^StYh?eKC_--o9vWYny6hY<#M)u&|64=(W8(JhS*IQ$ve(B+L~V +zhU{c?*lpX=-MxHZY^*F~^OMFlVt8z{{mq`99=!u-gqQ#8O^KrkQhz0K(TC$RGkJtk +zO9vMh6obL|+}C&23!%nSlh&4gXO~HSA_2eHXuCsC)6me!6%r9i9UU1764MFzNiln> +zFuAWJ!Ws5HC*)U8%H_+K-AXN4yS--~^6Eyo)y3-c?>&U(`ce58iG41r!ls1-PY}KL +zt@Od1oSd%Tznd;6yzGk#@F2Ur!)_IqClgrB>`MW6b@A!qbON%ABzU5wt*@ +z!qdQf+)N~VKh^XvPvl%Lo12?0t4EJyQ4dx&0^UkJyPBg%T8!K1k;=6^pJuuouQB!W +zkiZTB@ow+K*@dUKPF7b}cl7mff2>^>`>>i}D26%YL`795W?w41$3Lh>NCQcw! +z94t1|Tla_;v)9$lRfrjj*Hgc6({xN^w%^Yxnib*mu@VMz8=6=NKAhDb^$iXAMMdmY +z_AP{iUl0VwW_GAbDRy^ +zK_iLN7Pz<8Fg@n{w-_m;eV}z7D}mtfF$v0QxWT92?HH +z)F0hem}XwEdmG?wjJjX@ZFPLF;}~ni4EQ|Hz!7R%T0S{DJ0Fd!ermibxp@IGCII+M +uT{%GOL3!DXR2j#?M}qgv`I)1~2fUPfgo&B&>OIK27nm6Sjje(m9{dkU4|-Do + +literal 0 +HcmV?d00001 + +diff --git a/feeds/luci/modules/luci-base/htdocs/luci-static/resources/icons/wifi_disabled.png b/feeds/luci/modules/luci-base/htdocs/luci-static/resources/icons/wifi_disabled.png +new file mode 100644 +index 0000000000000000000000000000000000000000..338a34f78c8da317fb342515ec5ba8d2931a0876 +GIT binary patch +literal 980 +zcmV;_11tQAP)Px#24YJ`L;(K){{a7>y{D4^000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2igk~ +z10X0+#tH2J00UG>L_t(I%axK(NF!$$#-GeLnf!C@BqKW|iy9?6$)+?5o23?4F&>u% +z#fujWtG(2NC#Bc52%?9^gGg^_Y@!GjVK3E-Ve3i>f|n-H5{>Mt!RUqzVkVQ#OunQC +zQ`q*_A3V4B_wXEE1DZ@vPn%a)S3d&4*47rIC<;+kl>mU%YNahLEp&8rwEo{)0{~1; +zPTq?~qovu|Sz@tR9PRDxHI`*9lu{D_5JIZ8TCH+%aluw96*(LZ(|;TW0P6KR*Bl~A +zlEhXj6>qg#eatY7pAh1&R;!OIm5NuABo=`5sbd%)ALluaQ=LxdeWTIHI~-x>*<>d!W)2s{tJ`#!46h(2nTrQI=%g^j~ +zyY1lM;AJ!#eLgog_x$ki@TJ{ux5={n%;j>K6h(1IB9R&Zo@E$@+uPeSF$}{~N==l~ +zb^yB7Y85k?49ev)j7Fmf-~px7NGWY&7{=0cIO6yFExNAT36@$Ky`+h{Z{3WdVQLZP5D@pwF!%jF&h0)cn=d|u*t +zzNG6q2q8{Fh{AE)4I#v->pFOzFXi)jDG&&}%jI$p- +z2A}Tk?*3)B+kfxt>w_Q&==l38315nVghSxYj*{WMgskL%Cdrq9~a{q41j^2;UZq#puY$$T!Q&%b1y&xhrU5J3Bj5R#sMi +z35Ubq4-XIbilX?1!{K<~^ZC9OMX{X_0+-7Lx7%$4pyE^J=jX$lo15nY0|TD}U;$VF +zSer2dz|hc8V10f4{ldb+5C4)E7Z>q=Sz1~G0Q?R1{D9(R-kiMv0000 ++-- Copyright 2008 Jo-Philipp Wich ++-- Licensed to the public under the Apache License 2.0. ++ ++local config = require "luci.config" ++local ccache = require "luci.ccache" ++ ++module "luci.cacheloader" ++ ++if config.ccache and config.ccache.enable == "1" then ++ ccache.cache_ondemand() ++end +\ No newline at end of file +diff --git a/feeds/luci/modules/luci-base/luasrc/cbi.lua b/feeds/luci/modules/luci-base/luasrc/cbi.lua +new file mode 100644 +index 0000000..f3d4618 +--- /dev/null ++++ b/feeds/luci/modules/luci-base/luasrc/cbi.lua +@@ -0,0 +1,1853 @@ ++-- Copyright 2008 Steven Barth ++-- Licensed to the public under the Apache License 2.0. ++ ++module("luci.cbi", package.seeall) ++ ++require("luci.template") ++local util = require("luci.util") ++require("luci.http") ++ ++ ++--local event = require "luci.sys.event" ++local fs = require("nixio.fs") ++local uci = require("luci.model.uci") ++local datatypes = require("luci.cbi.datatypes") ++local dispatcher = require("luci.dispatcher") ++local class = util.class ++local instanceof = util.instanceof ++ ++FORM_NODATA = 0 ++FORM_PROCEED = 0 ++FORM_VALID = 1 ++FORM_DONE = 1 ++FORM_INVALID = -1 ++FORM_CHANGED = 2 ++FORM_SKIP = 4 ++ ++AUTO = true ++ ++CREATE_PREFIX = "cbi.cts." ++REMOVE_PREFIX = "cbi.rts." ++RESORT_PREFIX = "cbi.sts." ++FEXIST_PREFIX = "cbi.cbe." ++ ++-- Loads a CBI map from given file, creating an environment and returns it ++function load(cbimap, ...) ++ local fs = require "nixio.fs" ++ local i18n = require "luci.i18n" ++ require("luci.config") ++ require("luci.util") ++ ++ local upldir = "/lib/uci/upload/" ++ local cbidir = luci.util.libpath() .. "/model/cbi/" ++ local func, err ++ ++ if fs.access(cbidir..cbimap..".lua") then ++ func, err = loadfile(cbidir..cbimap..".lua") ++ elseif fs.access(cbimap) then ++ func, err = loadfile(cbimap) ++ else ++ func, err = nil, "Model '" .. cbimap .. "' not found!" ++ end ++ ++ assert(func, err) ++ ++ local env = { ++ translate=i18n.translate, ++ translatef=i18n.translatef, ++ arg={...} ++ } ++ ++ setfenv(func, setmetatable(env, {__index = ++ function(tbl, key) ++ return rawget(tbl, key) or _M[key] or _G[key] ++ end})) ++ ++ local maps = { func() } ++ local uploads = { } ++ local has_upload = false ++ ++ for i, map in ipairs(maps) do ++ if not instanceof(map, Node) then ++ error("CBI map returns no valid map object!") ++ return nil ++ else ++ map:prepare() ++ if map.upload_fields then ++ has_upload = true ++ for _, field in ipairs(map.upload_fields) do ++ uploads[ ++ field.config .. '.' .. ++ (field.section.sectiontype or '1') .. '.' .. ++ field.option ++ ] = true ++ end ++ end ++ end ++ end ++ ++ if has_upload then ++ local uci = luci.model.uci.cursor() ++ local prm = luci.http.context.request.message.params ++ local fd, cbid ++ ++ luci.http.setfilehandler( ++ function( field, chunk, eof ) ++ if not field then return end ++ if field.name and not cbid then ++ local c, s, o = field.name:gmatch( ++ "cbid%.([^%.]+)%.([^%.]+)%.([^%.]+)" ++ )() ++ ++ if c and s and o then ++ local t = uci:get( c, s ) or s ++ if uploads[c.."."..t.."."..o] then ++ local path = upldir .. field.name ++ fd = io.open(path, "w") ++ if fd then ++ cbid = field.name ++ prm[cbid] = path ++ end ++ end ++ end ++ end ++ ++ if field.name == cbid and fd then ++ fd:write(chunk) ++ end ++ ++ if eof and fd then ++ fd:close() ++ fd = nil ++ cbid = nil ++ end ++ end ++ ) ++ end ++ ++ return maps ++end ++ ++-- ++-- Compile a datatype specification into a parse tree for evaluation later on ++-- ++local cdt_cache = { } ++ ++function compile_datatype(code) ++ local i ++ local pos = 0 ++ local esc = false ++ local depth = 0 ++ local stack = { } ++ ++ for i = 1, #code+1 do ++ local byte = code:byte(i) or 44 ++ if esc then ++ esc = false ++ elseif byte == 92 then ++ esc = true ++ elseif byte == 40 or byte == 44 then ++ if depth <= 0 then ++ if pos < i then ++ local label = code:sub(pos, i-1) ++ :gsub("\\(.)", "%1") ++ :gsub("^%s+", "") ++ :gsub("%s+$", "") ++ ++ if #label > 0 and tonumber(label) then ++ stack[#stack+1] = tonumber(label) ++ elseif label:match("^'.*'$") or label:match('^".*"$') then ++ stack[#stack+1] = label:gsub("[\"'](.*)[\"']", "%1") ++ elseif type(datatypes[label]) == "function" then ++ stack[#stack+1] = datatypes[label] ++ stack[#stack+1] = { } ++ else ++ error("Datatype error, bad token %q" % label) ++ end ++ end ++ pos = i + 1 ++ end ++ depth = depth + (byte == 40 and 1 or 0) ++ elseif byte == 41 then ++ depth = depth - 1 ++ if depth <= 0 then ++ if type(stack[#stack-1]) ~= "function" then ++ error("Datatype error, argument list follows non-function") ++ end ++ stack[#stack] = compile_datatype(code:sub(pos, i-1)) ++ pos = i + 1 ++ end ++ end ++ end ++ ++ return stack ++end ++ ++function verify_datatype(dt, value) ++ if dt and #dt > 0 then ++ if not cdt_cache[dt] then ++ local c = compile_datatype(dt) ++ if c and type(c[1]) == "function" then ++ cdt_cache[dt] = c ++ else ++ error("Datatype error, not a function expression") ++ end ++ end ++ if cdt_cache[dt] then ++ return cdt_cache[dt][1](value, unpack(cdt_cache[dt][2])) ++ end ++ end ++ return true ++end ++ ++ ++-- Node pseudo abstract class ++Node = class() ++ ++function Node.__init__(self, title, description) ++ self.children = {} ++ self.title = title or "" ++ self.description = description or "" ++ self.template = "cbi/node" ++end ++ ++-- hook helper ++function Node._run_hook(self, hook) ++ if type(self[hook]) == "function" then ++ return self[hook](self) ++ end ++end ++ ++function Node._run_hooks(self, ...) ++ local f ++ local r = false ++ for _, f in ipairs(arg) do ++ if type(self[f]) == "function" then ++ self[f](self) ++ r = true ++ end ++ end ++ return r ++end ++ ++-- Prepare nodes ++function Node.prepare(self, ...) ++ for k, child in ipairs(self.children) do ++ child:prepare(...) ++ end ++end ++ ++-- Append child nodes ++function Node.append(self, obj) ++ table.insert(self.children, obj) ++end ++ ++-- Parse this node and its children ++function Node.parse(self, ...) ++ for k, child in ipairs(self.children) do ++ child:parse(...) ++ end ++end ++ ++-- Render this node ++function Node.render(self, scope) ++ scope = scope or {} ++ scope.self = self ++ ++ luci.template.render(self.template, scope) ++end ++ ++-- Render the children ++function Node.render_children(self, ...) ++ local k, node ++ for k, node in ipairs(self.children) do ++ node.last_child = (k == #self.children) ++ node:render(...) ++ end ++end ++ ++ ++--[[ ++A simple template element ++]]-- ++Template = class(Node) ++ ++function Template.__init__(self, template) ++ Node.__init__(self) ++ self.template = template ++end ++ ++function Template.render(self) ++ luci.template.render(self.template, {self=self}) ++end ++ ++function Template.parse(self, readinput) ++ self.readinput = (readinput ~= false) ++ return Map.formvalue(self, "cbi.submit") and FORM_DONE or FORM_NODATA ++end ++ ++ ++--[[ ++Map - A map describing a configuration file ++]]-- ++Map = class(Node) ++ ++function Map.__init__(self, config, ...) ++ Node.__init__(self, ...) ++ ++ self.config = config ++ self.parsechain = {self.config} ++ self.template = "cbi/map" ++ self.apply_on_parse = nil ++ self.readinput = true ++ self.proceed = false ++ self.flow = {} ++ ++ self.uci = uci.cursor() ++ self.save = true ++ ++ self.changed = false ++ ++ local path = "%s/%s" %{ self.uci:get_confdir(), self.config } ++ if fs.stat(path, "type") ~= "reg" then ++ fs.writefile(path, "") ++ end ++ ++ local ok, err = self.uci:load(self.config) ++ if not ok then ++ local url = dispatcher.build_url(unpack(dispatcher.context.request)) ++ local source = self:formvalue("cbi.source") ++ if type(source) == "string" then ++ fs.writefile(path, source:gsub("\r\n", "\n")) ++ ok, err = self.uci:load(self.config) ++ if ok then ++ luci.http.redirect(url) ++ end ++ end ++ self.save = false ++ end ++ ++ if not ok then ++ self.template = "cbi/error" ++ self.error = err ++ self.source = fs.readfile(path) or "" ++ self.pageaction = false ++ end ++end ++ ++function Map.formvalue(self, key) ++ return self.readinput and luci.http.formvalue(key) ++end ++ ++function Map.formvaluetable(self, key) ++ return self.readinput and luci.http.formvaluetable(key) or {} ++end ++ ++function Map.get_scheme(self, sectiontype, option) ++ if not option then ++ return self.scheme and self.scheme.sections[sectiontype] ++ else ++ return self.scheme and self.scheme.variables[sectiontype] ++ and self.scheme.variables[sectiontype][option] ++ end ++end ++ ++function Map.submitstate(self) ++ return self:formvalue("cbi.submit") ++end ++ ++-- Chain foreign config ++function Map.chain(self, config) ++ table.insert(self.parsechain, config) ++end ++ ++function Map.state_handler(self, state) ++ return state ++end ++ ++-- Use optimized UCI writing ++function Map.parse(self, readinput, ...) ++ self.readinput = (readinput ~= false) ++ self:_run_hooks("on_parse") ++ ++ if self:formvalue("cbi.skip") then ++ self.state = FORM_SKIP ++ return self:state_handler(self.state) ++ end ++ ++ Node.parse(self, ...) ++ ++ if self.save then ++ self:_run_hooks("on_save", "on_before_save") ++ for i, config in ipairs(self.parsechain) do ++ self.uci:save(config) ++ end ++ self:_run_hooks("on_after_save") ++ if self:submitstate() and ((not self.proceed and self.flow.autoapply) or luci.http.formvalue("cbi.apply")) then ++ self:_run_hooks("on_before_commit") ++ for i, config in ipairs(self.parsechain) do ++ self.uci:commit(config) ++ ++ -- Refresh data because commit changes section names ++ self.uci:load(config) ++ end ++ self:_run_hooks("on_commit", "on_after_commit", "on_before_apply") ++ if self.apply_on_parse then ++ self.uci:apply(self.parsechain) ++ self:_run_hooks("on_apply", "on_after_apply") ++ else ++ -- This is evaluated by the dispatcher and delegated to the ++ -- template which in turn fires XHR to perform the actual ++ -- apply actions. ++ self.apply_needed = true ++ end ++ ++ -- Reparse sections ++ Node.parse(self, true) ++ ++ end ++ for i, config in ipairs(self.parsechain) do ++ self.uci:unload(config) ++ end ++ if type(self.commit_handler) == "function" then ++ self:commit_handler(self:submitstate()) ++ end ++ end ++ ++ if self:submitstate() then ++ if not self.save then ++ self.state = FORM_INVALID ++ elseif self.proceed then ++ self.state = FORM_PROCEED ++ else ++ self.state = self.changed and FORM_CHANGED or FORM_VALID ++ end ++ else ++ self.state = FORM_NODATA ++ end ++ ++ return self:state_handler(self.state) ++end ++ ++function Map.render(self, ...) ++ self:_run_hooks("on_init") ++ Node.render(self, ...) ++end ++ ++-- Creates a child section ++function Map.section(self, class, ...) ++ if instanceof(class, AbstractSection) then ++ local obj = class(self, ...) ++ self:append(obj) ++ return obj ++ else ++ error("class must be a descendent of AbstractSection") ++ end ++end ++ ++-- UCI add ++function Map.add(self, sectiontype) ++ return self.uci:add(self.config, sectiontype) ++end ++ ++-- UCI set ++function Map.set(self, section, option, value) ++ if type(value) ~= "table" or #value > 0 then ++ if option then ++ return self.uci:set(self.config, section, option, value) ++ else ++ return self.uci:set(self.config, section, value) ++ end ++ else ++ return Map.del(self, section, option) ++ end ++end ++ ++-- UCI del ++function Map.del(self, section, option) ++ if option then ++ return self.uci:delete(self.config, section, option) ++ else ++ return self.uci:delete(self.config, section) ++ end ++end ++ ++-- UCI get ++function Map.get(self, section, option) ++ if not section then ++ return self.uci:get_all(self.config) ++ elseif option then ++ return self.uci:get(self.config, section, option) ++ else ++ return self.uci:get_all(self.config, section) ++ end ++end ++ ++--[[ ++Compound - Container ++]]-- ++Compound = class(Node) ++ ++function Compound.__init__(self, ...) ++ Node.__init__(self) ++ self.template = "cbi/compound" ++ self.children = {...} ++end ++ ++function Compound.populate_delegator(self, delegator) ++ for _, v in ipairs(self.children) do ++ v.delegator = delegator ++ end ++end ++ ++function Compound.parse(self, ...) ++ local cstate, state = 0 ++ ++ for k, child in ipairs(self.children) do ++ cstate = child:parse(...) ++ state = (not state or cstate < state) and cstate or state ++ end ++ ++ return state ++end ++ ++ ++--[[ ++Delegator - Node controller ++]]-- ++Delegator = class(Node) ++function Delegator.__init__(self, ...) ++ Node.__init__(self, ...) ++ self.nodes = {} ++ self.defaultpath = {} ++ self.pageaction = false ++ self.readinput = true ++ self.allow_reset = false ++ self.allow_cancel = false ++ self.allow_back = false ++ self.allow_finish = false ++ self.template = "cbi/delegator" ++end ++ ++function Delegator.set(self, name, node) ++ assert(not self.nodes[name], "Duplicate entry") ++ ++ self.nodes[name] = node ++end ++ ++function Delegator.add(self, name, node) ++ node = self:set(name, node) ++ self.defaultpath[#self.defaultpath+1] = name ++end ++ ++function Delegator.insert_after(self, name, after) ++ local n = #self.chain + 1 ++ for k, v in ipairs(self.chain) do ++ if v == after then ++ n = k + 1 ++ break ++ end ++ end ++ table.insert(self.chain, n, name) ++end ++ ++function Delegator.set_route(self, ...) ++ local n, chain, route = 0, self.chain, {...} ++ for i = 1, #chain do ++ if chain[i] == self.current then ++ n = i ++ break ++ end ++ end ++ for i = 1, #route do ++ n = n + 1 ++ chain[n] = route[i] ++ end ++ for i = n + 1, #chain do ++ chain[i] = nil ++ end ++end ++ ++function Delegator.get(self, name) ++ local node = self.nodes[name] ++ ++ if type(node) == "string" then ++ node = load(node, name) ++ end ++ ++ if type(node) == "table" and getmetatable(node) == nil then ++ node = Compound(unpack(node)) ++ end ++ ++ return node ++end ++ ++function Delegator.parse(self, ...) ++ if self.allow_cancel and Map.formvalue(self, "cbi.cancel") then ++ if self:_run_hooks("on_cancel") then ++ return FORM_DONE ++ end ++ end ++ ++ if not Map.formvalue(self, "cbi.delg.current") then ++ self:_run_hooks("on_init") ++ end ++ ++ local newcurrent ++ self.chain = self.chain or self:get_chain() ++ self.current = self.current or self:get_active() ++ self.active = self.active or self:get(self.current) ++ assert(self.active, "Invalid state") ++ ++ local stat = FORM_DONE ++ if type(self.active) ~= "function" then ++ self.active:populate_delegator(self) ++ stat = self.active:parse() ++ else ++ self:active() ++ end ++ ++ if stat > FORM_PROCEED then ++ if Map.formvalue(self, "cbi.delg.back") then ++ newcurrent = self:get_prev(self.current) ++ else ++ newcurrent = self:get_next(self.current) ++ end ++ elseif stat < FORM_PROCEED then ++ return stat ++ end ++ ++ ++ if not Map.formvalue(self, "cbi.submit") then ++ return FORM_NODATA ++ elseif stat > FORM_PROCEED ++ and (not newcurrent or not self:get(newcurrent)) then ++ return self:_run_hook("on_done") or FORM_DONE ++ else ++ self.current = newcurrent or self.current ++ self.active = self:get(self.current) ++ if type(self.active) ~= "function" then ++ self.active:populate_delegator(self) ++ local stat = self.active:parse(false) ++ if stat == FORM_SKIP then ++ return self:parse(...) ++ else ++ return FORM_PROCEED ++ end ++ else ++ return self:parse(...) ++ end ++ end ++end ++ ++function Delegator.get_next(self, state) ++ for k, v in ipairs(self.chain) do ++ if v == state then ++ return self.chain[k+1] ++ end ++ end ++end ++ ++function Delegator.get_prev(self, state) ++ for k, v in ipairs(self.chain) do ++ if v == state then ++ return self.chain[k-1] ++ end ++ end ++end ++ ++function Delegator.get_chain(self) ++ local x = Map.formvalue(self, "cbi.delg.path") or self.defaultpath ++ return type(x) == "table" and x or {x} ++end ++ ++function Delegator.get_active(self) ++ return Map.formvalue(self, "cbi.delg.current") or self.chain[1] ++end ++ ++--[[ ++Page - A simple node ++]]-- ++ ++Page = class(Node) ++Page.__init__ = Node.__init__ ++Page.parse = function() end ++ ++ ++--[[ ++SimpleForm - A Simple non-UCI form ++]]-- ++SimpleForm = class(Node) ++ ++function SimpleForm.__init__(self, config, title, description, data) ++ Node.__init__(self, title, description) ++ self.config = config ++ self.data = data or {} ++ self.template = "cbi/simpleform" ++ self.dorender = true ++ self.pageaction = false ++ self.readinput = true ++end ++ ++SimpleForm.formvalue = Map.formvalue ++SimpleForm.formvaluetable = Map.formvaluetable ++ ++function SimpleForm.parse(self, readinput, ...) ++ self.readinput = (readinput ~= false) ++ ++ if self:formvalue("cbi.skip") then ++ return FORM_SKIP ++ end ++ ++ if self:formvalue("cbi.cancel") and self:_run_hooks("on_cancel") then ++ return FORM_DONE ++ end ++ ++ if self:submitstate() then ++ Node.parse(self, 1, ...) ++ end ++ ++ local valid = true ++ for k, j in ipairs(self.children) do ++ for i, v in ipairs(j.children) do ++ valid = valid ++ and (not v.tag_missing or not v.tag_missing[1]) ++ and (not v.tag_invalid or not v.tag_invalid[1]) ++ and (not v.error) ++ end ++ end ++ ++ local state = ++ not self:submitstate() and FORM_NODATA ++ or valid and FORM_VALID ++ or FORM_INVALID ++ ++ self.dorender = not self.handle ++ if self.handle then ++ local nrender, nstate = self:handle(state, self.data) ++ self.dorender = self.dorender or (nrender ~= false) ++ state = nstate or state ++ end ++ return state ++end ++ ++function SimpleForm.render(self, ...) ++ if self.dorender then ++ Node.render(self, ...) ++ end ++end ++ ++function SimpleForm.submitstate(self) ++ return self:formvalue("cbi.submit") ++end ++ ++function SimpleForm.section(self, class, ...) ++ if instanceof(class, AbstractSection) then ++ local obj = class(self, ...) ++ self:append(obj) ++ return obj ++ else ++ error("class must be a descendent of AbstractSection") ++ end ++end ++ ++-- Creates a child field ++function SimpleForm.field(self, class, ...) ++ local section ++ for k, v in ipairs(self.children) do ++ if instanceof(v, SimpleSection) then ++ section = v ++ break ++ end ++ end ++ if not section then ++ section = self:section(SimpleSection) ++ end ++ ++ if instanceof(class, AbstractValue) then ++ local obj = class(self, section, ...) ++ obj.track_missing = true ++ section:append(obj) ++ return obj ++ else ++ error("class must be a descendent of AbstractValue") ++ end ++end ++ ++function SimpleForm.set(self, section, option, value) ++ self.data[option] = value ++end ++ ++ ++function SimpleForm.del(self, section, option) ++ self.data[option] = nil ++end ++ ++ ++function SimpleForm.get(self, section, option) ++ return self.data[option] ++end ++ ++ ++function SimpleForm.get_scheme() ++ return nil ++end ++ ++ ++Form = class(SimpleForm) ++ ++function Form.__init__(self, ...) ++ SimpleForm.__init__(self, ...) ++ self.embedded = true ++end ++ ++ ++--[[ ++AbstractSection ++]]-- ++AbstractSection = class(Node) ++ ++function AbstractSection.__init__(self, map, sectiontype, ...) ++ Node.__init__(self, ...) ++ self.sectiontype = sectiontype ++ self.map = map ++ self.config = map.config ++ self.optionals = {} ++ self.defaults = {} ++ self.fields = {} ++ self.tag_error = {} ++ self.tag_invalid = {} ++ self.tag_deperror = {} ++ self.changed = false ++ ++ self.optional = true ++ self.addremove = false ++ self.dynamic = false ++end ++ ++-- Define a tab for the section ++function AbstractSection.tab(self, tab, title, desc) ++ self.tabs = self.tabs or { } ++ self.tab_names = self.tab_names or { } ++ ++ self.tab_names[#self.tab_names+1] = tab ++ self.tabs[tab] = { ++ title = title, ++ description = desc, ++ childs = { } ++ } ++end ++ ++-- Check whether the section has tabs ++function AbstractSection.has_tabs(self) ++ return (self.tabs ~= nil) and (next(self.tabs) ~= nil) ++end ++ ++-- Appends a new option ++function AbstractSection.option(self, class, option, ...) ++ if instanceof(class, AbstractValue) then ++ local obj = class(self.map, self, option, ...) ++ self:append(obj) ++ self.fields[option] = obj ++ return obj ++ elseif class == true then ++ error("No valid class was given and autodetection failed.") ++ else ++ error("class must be a descendant of AbstractValue") ++ end ++end ++ ++-- Appends a new tabbed option ++function AbstractSection.taboption(self, tab, ...) ++ ++ assert(tab and self.tabs and self.tabs[tab], ++ "Cannot assign option to not existing tab %q" % tostring(tab)) ++ ++ local l = self.tabs[tab].childs ++ local o = AbstractSection.option(self, ...) ++ ++ if o then l[#l+1] = o end ++ ++ return o ++end ++ ++-- Render a single tab ++function AbstractSection.render_tab(self, tab, ...) ++ ++ assert(tab and self.tabs and self.tabs[tab], ++ "Cannot render not existing tab %q" % tostring(tab)) ++ ++ local k, node ++ for k, node in ipairs(self.tabs[tab].childs) do ++ node.last_child = (k == #self.tabs[tab].childs) ++ node:render(...) ++ end ++end ++ ++-- Parse optional options ++function AbstractSection.parse_optionals(self, section) ++ if not self.optional then ++ return ++ end ++ ++ self.optionals[section] = {} ++ ++ local field = self.map:formvalue("cbi.opt."..self.config.."."..section) ++ for k,v in ipairs(self.children) do ++ if v.optional and not v:cfgvalue(section) and not self:has_tabs() then ++ if field == v.option then ++ field = nil ++ self.map.proceed = true ++ else ++ table.insert(self.optionals[section], v) ++ end ++ end ++ end ++ ++ if field and #field > 0 and self.dynamic then ++ self:add_dynamic(field) ++ end ++end ++ ++-- Add a dynamic option ++function AbstractSection.add_dynamic(self, field, optional) ++ local o = self:option(Value, field, field) ++ o.optional = optional ++end ++ ++-- Parse all dynamic options ++function AbstractSection.parse_dynamic(self, section) ++ if not self.dynamic then ++ return ++ end ++ ++ local arr = luci.util.clone(self:cfgvalue(section)) ++ local form = self.map:formvaluetable("cbid."..self.config.."."..section) ++ for k, v in pairs(form) do ++ arr[k] = v ++ end ++ ++ for key,val in pairs(arr) do ++ local create = true ++ ++ for i,c in ipairs(self.children) do ++ if c.option == key then ++ create = false ++ end ++ end ++ ++ if create and key:sub(1, 1) ~= "." then ++ self.map.proceed = true ++ self:add_dynamic(key, true) ++ end ++ end ++end ++ ++-- Returns the section's UCI table ++function AbstractSection.cfgvalue(self, section) ++ return self.map:get(section) ++end ++ ++-- Push events ++function AbstractSection.push_events(self) ++ --luci.util.append(self.map.events, self.events) ++ self.map.changed = true ++end ++ ++-- Removes the section ++function AbstractSection.remove(self, section) ++ self.map.proceed = true ++ return self.map:del(section) ++end ++ ++-- Creates the section ++function AbstractSection.create(self, section) ++ local stat ++ ++ if section then ++ stat = section:match("^[%w_]+$") and self.map:set(section, nil, self.sectiontype) ++ else ++ section = self.map:add(self.sectiontype) ++ stat = section ++ end ++ ++ if stat then ++ for k,v in pairs(self.children) do ++ if v.default then ++ self.map:set(section, v.option, v.default) ++ end ++ end ++ ++ for k,v in pairs(self.defaults) do ++ self.map:set(section, k, v) ++ end ++ end ++ ++ self.map.proceed = true ++ ++ return stat ++end ++ ++ ++SimpleSection = class(AbstractSection) ++ ++function SimpleSection.__init__(self, form, ...) ++ AbstractSection.__init__(self, form, nil, ...) ++ self.template = "cbi/nullsection" ++end ++ ++ ++Table = class(AbstractSection) ++ ++function Table.__init__(self, form, data, ...) ++ local datasource = {} ++ local tself = self ++ datasource.config = "table" ++ self.data = data or {} ++ ++ datasource.formvalue = Map.formvalue ++ datasource.formvaluetable = Map.formvaluetable ++ datasource.readinput = true ++ ++ function datasource.get(self, section, option) ++ return tself.data[section] and tself.data[section][option] ++ end ++ ++ function datasource.submitstate(self) ++ return Map.formvalue(self, "cbi.submit") ++ end ++ ++ function datasource.del(...) ++ return true ++ end ++ ++ function datasource.get_scheme() ++ return nil ++ end ++ ++ AbstractSection.__init__(self, datasource, "table", ...) ++ self.template = "cbi/tblsection" ++ self.rowcolors = true ++ self.anonymous = true ++end ++ ++function Table.parse(self, readinput) ++ self.map.readinput = (readinput ~= false) ++ for i, k in ipairs(self:cfgsections()) do ++ if self.map:submitstate() then ++ Node.parse(self, k) ++ end ++ end ++end ++ ++function Table.cfgsections(self) ++ local sections = {} ++ ++ for i, v in luci.util.kspairs(self.data) do ++ table.insert(sections, i) ++ end ++ ++ return sections ++end ++ ++function Table.update(self, data) ++ self.data = data ++end ++ ++ ++ ++--[[ ++NamedSection - A fixed configuration section defined by its name ++]]-- ++NamedSection = class(AbstractSection) ++ ++function NamedSection.__init__(self, map, section, stype, ...) ++ AbstractSection.__init__(self, map, stype, ...) ++ ++ -- Defaults ++ self.addremove = false ++ self.template = "cbi/nsection" ++ self.section = section ++end ++ ++function NamedSection.parse(self, novld) ++ local s = self.section ++ local active = self:cfgvalue(s) ++ ++ if self.addremove then ++ local path = self.config.."."..s ++ if active then -- Remove the section ++ if self.map:formvalue("cbi.rns."..path) and self:remove(s) then ++ self:push_events() ++ return ++ end ++ else -- Create and apply default values ++ if self.map:formvalue("cbi.cns."..path) then ++ self:create(s) ++ return ++ end ++ end ++ end ++ ++ if active then ++ AbstractSection.parse_dynamic(self, s) ++ if self.map:submitstate() then ++ Node.parse(self, s) ++ end ++ AbstractSection.parse_optionals(self, s) ++ ++ if self.changed then ++ self:push_events() ++ end ++ end ++end ++ ++ ++--[[ ++TypedSection - A (set of) configuration section(s) defined by the type ++ addremove: Defines whether the user can add/remove sections of this type ++ anonymous: Allow creating anonymous sections ++ validate: a validation function returning nil if the section is invalid ++]]-- ++TypedSection = class(AbstractSection) ++ ++function TypedSection.__init__(self, map, type, ...) ++ AbstractSection.__init__(self, map, type, ...) ++ ++ self.template = "cbi/tsection" ++ self.deps = {} ++ self.anonymous = false ++end ++ ++-- Return all matching UCI sections for this TypedSection ++function TypedSection.cfgsections(self) ++ local sections = {} ++ self.map.uci:foreach(self.map.config, self.sectiontype, ++ function (section) ++ if self:checkscope(section[".name"]) then ++ table.insert(sections, section[".name"]) ++ end ++ end) ++ ++ return sections ++end ++ ++-- Limits scope to sections that have certain option => value pairs ++function TypedSection.depends(self, option, value) ++ table.insert(self.deps, {option=option, value=value}) ++end ++ ++function TypedSection.parse(self, novld) ++ if self.addremove then ++ -- Remove ++ local crval = REMOVE_PREFIX .. self.config ++ local name = self.map:formvaluetable(crval) ++ for k,v in pairs(name) do ++ if k:sub(-2) == ".x" then ++ k = k:sub(1, #k - 2) ++ end ++ if self:cfgvalue(k) and self:checkscope(k) then ++ self:remove(k) ++ end ++ end ++ end ++ ++ local co ++ for i, k in ipairs(self:cfgsections()) do ++ AbstractSection.parse_dynamic(self, k) ++ if self.map:submitstate() then ++ Node.parse(self, k, novld) ++ end ++ AbstractSection.parse_optionals(self, k) ++ end ++ ++ if self.addremove then ++ -- Create ++ local created ++ local crval = CREATE_PREFIX .. self.config .. "." .. self.sectiontype ++ local origin, name = next(self.map:formvaluetable(crval)) ++ if self.anonymous then ++ if name then ++ created = self:create(nil, origin) ++ end ++ else ++ if name then ++ -- Ignore if it already exists ++ if self:cfgvalue(name) then ++ name = nil; ++ end ++ ++ name = self:checkscope(name) ++ ++ if not name then ++ self.err_invalid = true ++ end ++ ++ if name and #name > 0 then ++ created = self:create(name, origin) and name ++ if not created then ++ self.invalid_cts = true ++ end ++ end ++ end ++ end ++ ++ if created then ++ AbstractSection.parse_optionals(self, created) ++ end ++ end ++ ++ if self.sortable then ++ local stval = RESORT_PREFIX .. self.config .. "." .. self.sectiontype ++ local order = self.map:formvalue(stval) ++ if order and #order > 0 then ++ local sid ++ local num = 0 ++ for sid in util.imatch(order) do ++ self.map.uci:reorder(self.config, sid, num) ++ num = num + 1 ++ end ++ self.changed = (num > 0) ++ end ++ end ++ ++ if created or self.changed then ++ self:push_events() ++ end ++end ++ ++-- Verifies scope of sections ++function TypedSection.checkscope(self, section) ++ -- Check if we are not excluded ++ if self.filter and not self:filter(section) then ++ return nil ++ end ++ ++ -- Check if at least one dependency is met ++ if #self.deps > 0 and self:cfgvalue(section) then ++ local stat = false ++ ++ for k, v in ipairs(self.deps) do ++ if self:cfgvalue(section)[v.option] == v.value then ++ stat = true ++ end ++ end ++ ++ if not stat then ++ return nil ++ end ++ end ++ ++ return self:validate(section) ++end ++ ++ ++-- Dummy validate function ++function TypedSection.validate(self, section) ++ return section ++end ++ ++ ++--[[ ++AbstractValue - An abstract Value Type ++ null: Value can be empty ++ valid: A function returning the value if it is valid otherwise nil ++ depends: A table of option => value pairs of which one must be true ++ default: The default value ++ size: The size of the input fields ++ rmempty: Unset value if empty ++ optional: This value is optional (see AbstractSection.optionals) ++]]-- ++AbstractValue = class(Node) ++ ++function AbstractValue.__init__(self, map, section, option, ...) ++ Node.__init__(self, ...) ++ self.section = section ++ self.option = option ++ self.map = map ++ self.config = map.config ++ self.tag_invalid = {} ++ self.tag_missing = {} ++ self.tag_reqerror = {} ++ self.tag_error = {} ++ self.deps = {} ++ self.subdeps = {} ++ --self.cast = "string" ++ ++ self.track_missing = false ++ self.rmempty = true ++ self.default = nil ++ self.size = nil ++ self.optional = false ++end ++ ++function AbstractValue.prepare(self) ++ self.cast = self.cast or "string" ++end ++ ++-- Add a dependencie to another section field ++function AbstractValue.depends(self, field, value) ++ local deps ++ if type(field) == "string" then ++ deps = {} ++ deps[field] = value ++ else ++ deps = field ++ end ++ ++ table.insert(self.deps, {deps=deps, add=""}) ++end ++ ++-- Generates the unique CBID ++function AbstractValue.cbid(self, section) ++ return "cbid."..self.map.config.."."..section.."."..self.option ++end ++ ++-- Return whether this object should be created ++function AbstractValue.formcreated(self, section) ++ local key = "cbi.opt."..self.config.."."..section ++ return (self.map:formvalue(key) == self.option) ++end ++ ++-- Returns the formvalue for this object ++function AbstractValue.formvalue(self, section) ++ return self.map:formvalue(self:cbid(section)) ++end ++ ++function AbstractValue.additional(self, value) ++ self.optional = value ++end ++ ++function AbstractValue.mandatory(self, value) ++ self.rmempty = not value ++end ++ ++function AbstractValue.add_error(self, section, type, msg) ++ self.error = self.error or { } ++ self.error[section] = msg or type ++ ++ self.section.error = self.section.error or { } ++ self.section.error[section] = self.section.error[section] or { } ++ table.insert(self.section.error[section], msg or type) ++ ++ if type == "invalid" then ++ self.tag_invalid[section] = true ++ elseif type == "missing" then ++ self.tag_missing[section] = true ++ end ++ ++ self.tag_error[section] = true ++ self.map.save = false ++end ++ ++function AbstractValue.parse(self, section, novld) ++ local fvalue = self:formvalue(section) ++ local cvalue = self:cfgvalue(section) ++ ++ -- If favlue and cvalue are both tables and have the same content ++ -- make them identical ++ if type(fvalue) == "table" and type(cvalue) == "table" then ++ local equal = #fvalue == #cvalue ++ if equal then ++ for i=1, #fvalue do ++ if cvalue[i] ~= fvalue[i] then ++ equal = false ++ end ++ end ++ end ++ if equal then ++ fvalue = cvalue ++ end ++ end ++ ++ if fvalue and #fvalue > 0 then -- If we have a form value, write it to UCI ++ local val_err ++ fvalue, val_err = self:validate(fvalue, section) ++ fvalue = self:transform(fvalue) ++ ++ if not fvalue and not novld then ++ self:add_error(section, "invalid", val_err) ++ end ++ ++ if fvalue and (self.forcewrite or not (fvalue == cvalue)) then ++ if self:write(section, fvalue) then ++ -- Push events ++ self.section.changed = true ++ --luci.util.append(self.map.events, self.events) ++ end ++ end ++ else -- Unset the UCI or error ++ if self.rmempty or self.optional then ++ if self:remove(section) then ++ -- Push events ++ self.section.changed = true ++ --luci.util.append(self.map.events, self.events) ++ end ++ elseif cvalue ~= fvalue and not novld then ++ -- trigger validator with nil value to get custom user error msg. ++ local _, val_err = self:validate(nil, section) ++ self:add_error(section, "missing", val_err) ++ end ++ end ++end ++ ++-- Render if this value exists or if it is mandatory ++function AbstractValue.render(self, s, scope) ++ if not self.optional or self.section:has_tabs() or self:cfgvalue(s) or self:formcreated(s) then ++ scope = scope or {} ++ scope.section = s ++ scope.cbid = self:cbid(s) ++ Node.render(self, scope) ++ end ++end ++ ++-- Return the UCI value of this object ++function AbstractValue.cfgvalue(self, section) ++ local value ++ if self.tag_error[section] then ++ value = self:formvalue(section) ++ else ++ value = self.map:get(section, self.option) ++ end ++ ++ if not value then ++ return nil ++ elseif not self.cast or self.cast == type(value) then ++ return value ++ elseif self.cast == "string" then ++ if type(value) == "table" then ++ return value[1] ++ end ++ elseif self.cast == "table" then ++ return { value } ++ end ++end ++ ++-- Validate the form value ++function AbstractValue.validate(self, value) ++ if self.datatype and value then ++ if type(value) == "table" then ++ local v ++ for _, v in ipairs(value) do ++ if v and #v > 0 and not verify_datatype(self.datatype, v) then ++ return nil ++ end ++ end ++ else ++ if not verify_datatype(self.datatype, value) then ++ return nil ++ end ++ end ++ end ++ ++ return value ++end ++ ++AbstractValue.transform = AbstractValue.validate ++ ++ ++-- Write to UCI ++function AbstractValue.write(self, section, value) ++ return self.map:set(section, self.option, value) ++end ++ ++-- Remove from UCI ++function AbstractValue.remove(self, section) ++ return self.map:del(section, self.option) ++end ++ ++ ++ ++ ++--[[ ++Value - A one-line value ++ maxlength: The maximum length ++]]-- ++Value = class(AbstractValue) ++ ++function Value.__init__(self, ...) ++ AbstractValue.__init__(self, ...) ++ self.template = "cbi/value" ++ self.keylist = {} ++ self.vallist = {} ++end ++ ++function Value.reset_values(self) ++ self.keylist = {} ++ self.vallist = {} ++end ++ ++function Value.value(self, key, val) ++ val = val or key ++ table.insert(self.keylist, tostring(key)) ++ table.insert(self.vallist, tostring(val)) ++end ++ ++ ++-- DummyValue - This does nothing except being there ++DummyValue = class(AbstractValue) ++ ++function DummyValue.__init__(self, ...) ++ AbstractValue.__init__(self, ...) ++ self.template = "cbi/dvalue" ++ self.value = nil ++end ++ ++function DummyValue.cfgvalue(self, section) ++ local value ++ if self.value then ++ if type(self.value) == "function" then ++ value = self:value(section) ++ else ++ value = self.value ++ end ++ else ++ value = AbstractValue.cfgvalue(self, section) ++ end ++ return value ++end ++ ++function DummyValue.parse(self) ++ ++end ++ ++ ++--[[ ++Flag - A flag being enabled or disabled ++]]-- ++Flag = class(AbstractValue) ++ ++function Flag.__init__(self, ...) ++ AbstractValue.__init__(self, ...) ++ self.template = "cbi/fvalue" ++ ++ self.enabled = "1" ++ self.disabled = "0" ++ self.default = self.disabled ++end ++ ++-- A flag can only have two states: set or unset ++function Flag.parse(self, section) ++ local fexists = self.map:formvalue( ++ FEXIST_PREFIX .. self.config .. "." .. section .. "." .. self.option) ++ ++ if fexists then ++ local fvalue = self:formvalue(section) and self.enabled or self.disabled ++ local cvalue = self:cfgvalue(section) ++ if fvalue ~= self.default or (not self.optional and not self.rmempty) then ++ self:write(section, fvalue) ++ else ++ self:remove(section) ++ end ++ if (fvalue ~= cvalue) then self.section.changed = true end ++ else ++ self:remove(section) ++ self.section.changed = true ++ end ++end ++ ++function Flag.cfgvalue(self, section) ++ return AbstractValue.cfgvalue(self, section) or self.default ++end ++ ++ ++--[[ ++ListValue - A one-line value predefined in a list ++ widget: The widget that will be used (select, radio) ++]]-- ++ListValue = class(AbstractValue) ++ ++function ListValue.__init__(self, ...) ++ AbstractValue.__init__(self, ...) ++ self.template = "cbi/lvalue" ++ ++ self.keylist = {} ++ self.vallist = {} ++ self.size = 1 ++ self.widget = "select" ++end ++ ++function ListValue.reset_values(self) ++ self.keylist = {} ++ self.vallist = {} ++end ++ ++function ListValue.value(self, key, val, ...) ++ if luci.util.contains(self.keylist, key) then ++ return ++ end ++ ++ val = val or key ++ table.insert(self.keylist, tostring(key)) ++ table.insert(self.vallist, tostring(val)) ++ ++ for i, deps in ipairs({...}) do ++ self.subdeps[#self.subdeps + 1] = {add = "-"..key, deps=deps} ++ end ++end ++ ++function ListValue.validate(self, val) ++ if luci.util.contains(self.keylist, val) then ++ return val ++ else ++ return nil ++ end ++end ++ ++ ++ ++--[[ ++MultiValue - Multiple delimited values ++ widget: The widget that will be used (select, checkbox) ++ delimiter: The delimiter that will separate the values (default: " ") ++]]-- ++MultiValue = class(AbstractValue) ++ ++function MultiValue.__init__(self, ...) ++ AbstractValue.__init__(self, ...) ++ self.template = "cbi/mvalue" ++ ++ self.keylist = {} ++ self.vallist = {} ++ ++ self.widget = "checkbox" ++ self.delimiter = " " ++end ++ ++function MultiValue.render(self, ...) ++ if self.widget == "select" and not self.size then ++ self.size = #self.vallist ++ end ++ ++ AbstractValue.render(self, ...) ++end ++ ++function MultiValue.reset_values(self) ++ self.keylist = {} ++ self.vallist = {} ++end ++ ++function MultiValue.value(self, key, val) ++ if luci.util.contains(self.keylist, key) then ++ return ++ end ++ ++ val = val or key ++ table.insert(self.keylist, tostring(key)) ++ table.insert(self.vallist, tostring(val)) ++end ++ ++function MultiValue.valuelist(self, section) ++ local val = self:cfgvalue(section) ++ ++ if not(type(val) == "string") then ++ return {} ++ end ++ ++ return luci.util.split(val, self.delimiter) ++end ++ ++function MultiValue.validate(self, val) ++ val = (type(val) == "table") and val or {val} ++ ++ local result ++ ++ for i, value in ipairs(val) do ++ if luci.util.contains(self.keylist, value) then ++ result = result and (result .. self.delimiter .. value) or value ++ end ++ end ++ ++ return result ++end ++ ++ ++StaticList = class(MultiValue) ++ ++function StaticList.__init__(self, ...) ++ MultiValue.__init__(self, ...) ++ self.cast = "table" ++ self.valuelist = self.cfgvalue ++ ++ if not self.override_scheme ++ and self.map:get_scheme(self.section.sectiontype, self.option) then ++ local vs = self.map:get_scheme(self.section.sectiontype, self.option) ++ if self.value and vs.values and not self.override_values then ++ for k, v in pairs(vs.values) do ++ self:value(k, v) ++ end ++ end ++ end ++end ++ ++function StaticList.validate(self, value) ++ value = (type(value) == "table") and value or {value} ++ ++ local valid = {} ++ for i, v in ipairs(value) do ++ if luci.util.contains(self.keylist, v) then ++ table.insert(valid, v) ++ end ++ end ++ return valid ++end ++ ++ ++DynamicList = class(AbstractValue) ++ ++function DynamicList.__init__(self, ...) ++ AbstractValue.__init__(self, ...) ++ self.template = "cbi/dynlist" ++ self.cast = "table" ++ self.keylist = {} ++ self.vallist = {} ++end ++ ++function DynamicList.reset_values(self) ++ self.keylist = {} ++ self.vallist = {} ++end ++ ++function DynamicList.value(self, key, val) ++ val = val or key ++ table.insert(self.keylist, tostring(key)) ++ table.insert(self.vallist, tostring(val)) ++end ++ ++function DynamicList.write(self, section, value) ++ local t = { } ++ ++ if type(value) == "table" then ++ local x ++ for _, x in ipairs(value) do ++ if x and #x > 0 then ++ t[#t+1] = x ++ end ++ end ++ else ++ t = { value } ++ end ++ ++ if self.cast == "string" then ++ value = table.concat(t, " ") ++ else ++ value = t ++ end ++ ++ return AbstractValue.write(self, section, value) ++end ++ ++function DynamicList.cfgvalue(self, section) ++ local value = AbstractValue.cfgvalue(self, section) ++ ++ if type(value) == "string" then ++ local x ++ local t = { } ++ for x in value:gmatch("%S+") do ++ if #x > 0 then ++ t[#t+1] = x ++ end ++ end ++ value = t ++ end ++ ++ return value ++end ++ ++function DynamicList.formvalue(self, section) ++ local value = AbstractValue.formvalue(self, section) ++ ++ if type(value) == "string" then ++ if self.cast == "string" then ++ local x ++ local t = { } ++ for x in value:gmatch("%S+") do ++ t[#t+1] = x ++ end ++ value = t ++ else ++ value = { value } ++ end ++ end ++ ++ return value ++end ++ ++ ++--[[ ++TextValue - A multi-line value ++ rows: Rows ++]]-- ++TextValue = class(AbstractValue) ++ ++function TextValue.__init__(self, ...) ++ AbstractValue.__init__(self, ...) ++ self.template = "cbi/tvalue" ++end ++ ++--[[ ++Button ++]]-- ++Button = class(AbstractValue) ++ ++function Button.__init__(self, ...) ++ AbstractValue.__init__(self, ...) ++ self.template = "cbi/button" ++ self.inputstyle = nil ++ self.rmempty = true ++end ++ ++ ++FileUpload = class(AbstractValue) ++ ++function FileUpload.__init__(self, ...) ++ AbstractValue.__init__(self, ...) ++ self.template = "cbi/upload" ++ if not self.map.upload_fields then ++ self.map.upload_fields = { self } ++ else ++ self.map.upload_fields[#self.map.upload_fields+1] = self ++ end ++end ++ ++function FileUpload.formcreated(self, section) ++ return AbstractValue.formcreated(self, section) or ++ self.map:formvalue("cbi.rlf."..section.."."..self.option) or ++ self.map:formvalue("cbi.rlf."..section.."."..self.option..".x") ++end ++ ++function FileUpload.cfgvalue(self, section) ++ local val = AbstractValue.cfgvalue(self, section) ++ if val and fs.access(val) then ++ return val ++ end ++ return nil ++end ++ ++function FileUpload.formvalue(self, section) ++ local val = AbstractValue.formvalue(self, section) ++ if val then ++ if not self.map:formvalue("cbi.rlf."..section.."."..self.option) and ++ not self.map:formvalue("cbi.rlf."..section.."."..self.option..".x") ++ then ++ return val ++ end ++ fs.unlink(val) ++ self.value = nil ++ end ++ return nil ++end ++ ++function FileUpload.remove(self, section) ++ local val = AbstractValue.formvalue(self, section) ++ if val and fs.access(val) then fs.unlink(val) end ++ return AbstractValue.remove(self, section) ++end ++ ++ ++FileBrowser = class(AbstractValue) ++ ++function FileBrowser.__init__(self, ...) ++ AbstractValue.__init__(self, ...) ++ self.template = "cbi/browser" ++end +diff --git a/feeds/luci/modules/luci-base/luasrc/cbi/datatypes.lua b/feeds/luci/modules/luci-base/luasrc/cbi/datatypes.lua +new file mode 100644 +index 0000000..ebd7e59 +--- /dev/null ++++ b/feeds/luci/modules/luci-base/luasrc/cbi/datatypes.lua +@@ -0,0 +1,333 @@ ++-- Copyright 2010 Jo-Philipp Wich ++-- Licensed to the public under the Apache License 2.0. ++ ++local fs = require "nixio.fs" ++local ip = require "luci.ip" ++local math = require "math" ++local util = require "luci.util" ++local tonumber, tostring, type, unpack, select = tonumber, tostring, type, unpack, select ++ ++ ++module "luci.cbi.datatypes" ++ ++ ++_M['or'] = function(v, ...) ++ local i ++ for i = 1, select('#', ...), 2 do ++ local f = select(i, ...) ++ local a = select(i+1, ...) ++ if type(f) ~= "function" then ++ if f == v then ++ return true ++ end ++ i = i - 1 ++ elseif f(v, unpack(a)) then ++ return true ++ end ++ end ++ return false ++end ++ ++_M['and'] = function(v, ...) ++ local i ++ for i = 1, select('#', ...), 2 do ++ local f = select(i, ...) ++ local a = select(i+1, ...) ++ if type(f) ~= "function" then ++ if f ~= v then ++ return false ++ end ++ i = i - 1 ++ elseif not f(v, unpack(a)) then ++ return false ++ end ++ end ++ return true ++end ++ ++function neg(v, ...) ++ return _M['or'](v:gsub("^%s*!%s*", ""), ...) ++end ++ ++function list(v, subvalidator, subargs) ++ if type(subvalidator) ~= "function" then ++ return false ++ end ++ local token ++ for token in v:gmatch("%S+") do ++ if not subvalidator(token, unpack(subargs)) then ++ return false ++ end ++ end ++ return true ++end ++ ++function bool(val) ++ if val == "1" or val == "yes" or val == "on" or val == "true" then ++ return true ++ elseif val == "0" or val == "no" or val == "off" or val == "false" then ++ return true ++ elseif val == "" or val == nil then ++ return true ++ end ++ ++ return false ++end ++ ++function uinteger(val) ++ local n = tonumber(val) ++ if n ~= nil and math.floor(n) == n and n >= 0 then ++ return true ++ end ++ ++ return false ++end ++ ++function integer(val) ++ local n = tonumber(val) ++ if n ~= nil and math.floor(n) == n then ++ return true ++ end ++ ++ return false ++end ++ ++function ufloat(val) ++ local n = tonumber(val) ++ return ( n ~= nil and n >= 0 ) ++end ++ ++function float(val) ++ return ( tonumber(val) ~= nil ) ++end ++ ++function ipaddr(val) ++ return ip4addr(val) or ip6addr(val) ++end ++ ++function ip4addr(val) ++ if val then ++ return ip.IPv4(val) and true or false ++ end ++ ++ return false ++end ++ ++function ip4prefix(val) ++ val = tonumber(val) ++ return ( val and val >= 0 and val <= 32 ) ++end ++ ++function ip6addr(val) ++ if val then ++ return ip.IPv6(val) and true or false ++ end ++ ++ return false ++end ++ ++function ip6prefix(val) ++ val = tonumber(val) ++ return ( val and val >= 0 and val <= 128 ) ++end ++ ++function port(val) ++ val = tonumber(val) ++ return ( val and val >= 0 and val <= 65535 ) ++end ++ ++function portrange(val) ++ local p1, p2 = val:match("^(%d+)%-(%d+)$") ++ if p1 and p2 and port(p1) and port(p2) then ++ return true ++ else ++ return port(val) ++ end ++end ++ ++function macaddr(val) ++ if val and val:match( ++ "^[a-fA-F0-9]+:[a-fA-F0-9]+:[a-fA-F0-9]+:" .. ++ "[a-fA-F0-9]+:[a-fA-F0-9]+:[a-fA-F0-9]+$" ++ ) then ++ local parts = util.split( val, ":" ) ++ ++ for i = 1,6 do ++ parts[i] = tonumber( parts[i], 16 ) ++ if parts[i] < 0 or parts[i] > 255 then ++ return false ++ end ++ end ++ ++ return true ++ end ++ ++ return false ++end ++ ++function hostname(val) ++ if val and (#val < 254) and ( ++ val:match("^[a-zA-Z_]+$") or ++ (val:match("^[a-zA-Z0-9_][a-zA-Z0-9_%-%.]*[a-zA-Z0-9]$") and ++ val:match("[^0-9%.]")) ++ ) then ++ return true ++ end ++ return false ++end ++ ++function host(val) ++ return hostname(val) or ipaddr(val) ++end ++ ++function network(val) ++ return uciname(val) or host(val) ++end ++ ++function wpakey(val) ++ if #val == 64 then ++ return (val:match("^[a-fA-F0-9]+$") ~= nil) ++ else ++ return (#val >= 8) and (#val <= 63) ++ end ++end ++ ++function wepkey(val) ++ if val:sub(1, 2) == "s:" then ++ val = val:sub(3) ++ end ++ ++ if (#val == 10) or (#val == 26) then ++ return (val:match("^[a-fA-F0-9]+$") ~= nil) ++ else ++ return (#val == 5) or (#val == 13) ++ end ++end ++ ++function string(val) ++ return true -- Everything qualifies as valid string ++end ++ ++function directory( val, seen ) ++ local s = fs.stat(val) ++ seen = seen or { } ++ ++ if s and not seen[s.ino] then ++ seen[s.ino] = true ++ if s.type == "dir" then ++ return true ++ elseif s.type == "lnk" then ++ return directory( fs.readlink(val), seen ) ++ end ++ end ++ ++ return false ++end ++ ++function file( val, seen ) ++ local s = fs.stat(val) ++ seen = seen or { } ++ ++ if s and not seen[s.ino] then ++ seen[s.ino] = true ++ if s.type == "reg" then ++ return true ++ elseif s.type == "lnk" then ++ return file( fs.readlink(val), seen ) ++ end ++ end ++ ++ return false ++end ++ ++function device( val, seen ) ++ local s = fs.stat(val) ++ seen = seen or { } ++ ++ if s and not seen[s.ino] then ++ seen[s.ino] = true ++ if s.type == "chr" or s.type == "blk" then ++ return true ++ elseif s.type == "lnk" then ++ return device( fs.readlink(val), seen ) ++ end ++ end ++ ++ return false ++end ++ ++function uciname(val) ++ return (val:match("^[a-zA-Z0-9_]+$") ~= nil) ++end ++ ++function range(val, min, max) ++ val = tonumber(val) ++ min = tonumber(min) ++ max = tonumber(max) ++ ++ if val ~= nil and min ~= nil and max ~= nil then ++ return ((val >= min) and (val <= max)) ++ end ++ ++ return false ++end ++ ++function min(val, min) ++ val = tonumber(val) ++ min = tonumber(min) ++ ++ if val ~= nil and min ~= nil then ++ return (val >= min) ++ end ++ ++ return false ++end ++ ++function max(val, max) ++ val = tonumber(val) ++ max = tonumber(max) ++ ++ if val ~= nil and max ~= nil then ++ return (val <= max) ++ end ++ ++ return false ++end ++ ++function rangelength(val, min, max) ++ val = tostring(val) ++ min = tonumber(min) ++ max = tonumber(max) ++ ++ if val ~= nil and min ~= nil and max ~= nil then ++ return ((#val >= min) and (#val <= max)) ++ end ++ ++ return false ++end ++ ++function minlength(val, min) ++ val = tostring(val) ++ min = tonumber(min) ++ ++ if val ~= nil and min ~= nil then ++ return (#val >= min) ++ end ++ ++ return false ++end ++ ++function maxlength(val, max) ++ val = tostring(val) ++ max = tonumber(max) ++ ++ if val ~= nil and max ~= nil then ++ return (#val <= max) ++ end ++ ++ return false ++end ++ ++function phonedigit(val) ++ return (val:match("^[0-9\*#!%.]+$") ~= nil) ++end +diff --git a/feeds/luci/modules/luci-base/luasrc/ccache.lua b/feeds/luci/modules/luci-base/luasrc/ccache.lua +new file mode 100644 +index 0000000..bcc76e6 +--- /dev/null ++++ b/feeds/luci/modules/luci-base/luasrc/ccache.lua +@@ -0,0 +1,76 @@ ++-- Copyright 2008 Steven Barth ++-- Copyright 2008 Jo-Philipp Wich ++-- Licensed to the public under the Apache License 2.0. ++ ++local io = require "io" ++local fs = require "nixio.fs" ++local util = require "luci.util" ++local nixio = require "nixio" ++local debug = require "debug" ++local string = require "string" ++local package = require "package" ++ ++local type, loadfile = type, loadfile ++ ++ ++module "luci.ccache" ++ ++function cache_ondemand(...) ++ if debug.getinfo(1, 'S').source ~= "=?" then ++ cache_enable(...) ++ end ++end ++ ++function cache_enable(cachepath, mode) ++ cachepath = cachepath or "/tmp/luci-modulecache" ++ mode = mode or "r--r--r--" ++ ++ local loader = package.loaders[2] ++ local uid = nixio.getuid() ++ ++ if not fs.stat(cachepath) then ++ fs.mkdir(cachepath) ++ end ++ ++ local function _encode_filename(name) ++ local encoded = "" ++ for i=1, #name do ++ encoded = encoded .. ("%2X" % string.byte(name, i)) ++ end ++ return encoded ++ end ++ ++ local function _load_sane(file) ++ local stat = fs.stat(file) ++ if stat and stat.uid == uid and stat.modestr == mode then ++ return loadfile(file) ++ end ++ end ++ ++ local function _write_sane(file, func) ++ if nixio.getuid() == uid then ++ local fp = io.open(file, "w") ++ if fp then ++ fp:write(util.get_bytecode(func)) ++ fp:close() ++ fs.chmod(file, mode) ++ end ++ end ++ end ++ ++ package.loaders[2] = function(mod) ++ local encoded = cachepath .. "/" .. _encode_filename(mod) ++ local modcons = _load_sane(encoded) ++ ++ if modcons then ++ return modcons ++ end ++ ++ -- No cachefile ++ modcons = loader(mod) ++ if type(modcons) == "function" then ++ _write_sane(encoded, modcons) ++ end ++ return modcons ++ end ++end +diff --git a/feeds/luci/modules/luci-base/luasrc/config.lua b/feeds/luci/modules/luci-base/luasrc/config.lua +new file mode 100644 +index 0000000..d01153f +--- /dev/null ++++ b/feeds/luci/modules/luci-base/luasrc/config.lua +@@ -0,0 +1,18 @@ ++-- Copyright 2008 Steven Barth ++-- Licensed to the public under the Apache License 2.0. ++ ++local util = require "luci.util" ++module("luci.config", ++ function(m) ++ if pcall(require, "luci.model.uci") then ++ local config = util.threadlocal() ++ setmetatable(m, { ++ __index = function(tbl, key) ++ if not config[key] then ++ config[key] = luci.model.uci.cursor():get_all("luci", key) ++ end ++ return config[key] ++ end ++ }) ++ end ++ end) +diff --git a/feeds/luci/modules/luci-base/luasrc/controller/admin/servicectl.lua b/feeds/luci/modules/luci-base/luasrc/controller/admin/servicectl.lua +new file mode 100644 +index 0000000..5b855cb +--- /dev/null ++++ b/feeds/luci/modules/luci-base/luasrc/controller/admin/servicectl.lua +@@ -0,0 +1,49 @@ ++-- Copyright 2010 Jo-Philipp Wich ++-- Licensed to the public under the Apache License 2.0. ++ ++module("luci.controller.admin.servicectl", package.seeall) ++ ++function index() ++ entry({"servicectl"}, alias("servicectl", "status")).sysauth = "root" ++ entry({"servicectl", "status"}, call("action_status")).leaf = true ++ entry({"servicectl", "restart"}, call("action_restart")).leaf = true ++end ++ ++function action_status() ++ local data = nixio.fs.readfile("/var/run/luci-reload-status") ++ if data then ++ luci.http.write("/etc/config/") ++ luci.http.write(data) ++ else ++ luci.http.write("finish") ++ end ++end ++ ++function action_restart(args) ++ local uci = require "luci.model.uci".cursor() ++ if args then ++ local service ++ local services = { } ++ ++ for service in args:gmatch("[%w_-]+") do ++ services[#services+1] = service ++ end ++ ++ local command = uci:apply(services, true) ++ if nixio.fork() == 0 then ++ local i = nixio.open("/dev/null", "r") ++ local o = nixio.open("/dev/null", "w") ++ ++ nixio.dup(i, nixio.stdin) ++ nixio.dup(o, nixio.stdout) ++ ++ i:close() ++ o:close() ++ ++ nixio.exec("/bin/sh", unpack(command)) ++ else ++ luci.http.write("OK") ++ os.exit(0) ++ end ++ end ++end +diff --git a/feeds/luci/modules/luci-base/luasrc/debug.lua b/feeds/luci/modules/luci-base/luasrc/debug.lua +new file mode 100644 +index 0000000..8ff1bb6 +--- /dev/null ++++ b/feeds/luci/modules/luci-base/luasrc/debug.lua +@@ -0,0 +1,37 @@ ++local debug = require "debug" ++local io = require "io" ++local collectgarbage, floor = collectgarbage, math.floor ++ ++module "luci.debug" ++__file__ = debug.getinfo(1, 'S').source:sub(2) ++ ++-- Enables the memory tracer with given flags and returns a function to disable the tracer again ++function trap_memtrace(flags, dest) ++ flags = flags or "clr" ++ local tracefile = io.open(dest or "/tmp/memtrace", "w") ++ local peak = 0 ++ ++ local function trap(what, line) ++ local info = debug.getinfo(2, "Sn") ++ local size = floor(collectgarbage("count")) ++ if size > peak then ++ peak = size ++ end ++ if tracefile then ++ tracefile:write( ++ "[", what, "] ", info.source, ":", (line or "?"), "\t", ++ (info.namewhat or ""), "\t", ++ (info.name or ""), "\t", ++ size, " (", peak, ")\n" ++ ) ++ end ++ end ++ ++ debug.sethook(trap, flags) ++ ++ return function() ++ debug.sethook() ++ tracefile:close() ++ end ++end ++ +diff --git a/feeds/luci/modules/luci-base/luasrc/dispatcher.lua b/feeds/luci/modules/luci-base/luasrc/dispatcher.lua +new file mode 100644 +index 0000000..8b8d1fa +--- /dev/null ++++ b/feeds/luci/modules/luci-base/luasrc/dispatcher.lua +@@ -0,0 +1,866 @@ ++-- Copyright 2008 Steven Barth ++-- Licensed to the public under the Apache License 2.0. ++ ++local fs = require "nixio.fs" ++local sys = require "luci.sys" ++local util = require "luci.util" ++local http = require "luci.http" ++local nixio = require "nixio", require "nixio.util" ++ ++module("luci.dispatcher", package.seeall) ++context = util.threadlocal() ++uci = require "luci.model.uci" ++i18n = require "luci.i18n" ++_M.fs = fs ++ ++authenticator = {} ++ ++-- Index table ++local index = nil ++ ++-- Fastindex ++local fi ++ ++ ++function build_url(...) ++ local path = {...} ++ local url = { http.getenv("SCRIPT_NAME") or "" } ++ ++ local k, v ++ for k, v in pairs(context.urltoken) do ++ url[#url+1] = "/;" ++ url[#url+1] = http.urlencode(k) ++ url[#url+1] = "=" ++ url[#url+1] = http.urlencode(v) ++ end ++ ++ local p ++ for _, p in ipairs(path) do ++ if p:match("^[a-zA-Z0-9_%-%.%%/,;]+$") then ++ url[#url+1] = "/" ++ url[#url+1] = p ++ end ++ end ++ ++ return table.concat(url, "") ++end ++ ++function node_visible(node) ++ if node then ++ return not ( ++ (not node.title or #node.title == 0) or ++ (not node.target or node.hidden == true) or ++ (type(node.target) == "table" and node.target.type == "firstchild" and ++ (type(node.nodes) ~= "table" or not next(node.nodes))) ++ ) ++ end ++ return false ++end ++ ++function node_childs(node) ++ local rv = { } ++ if node then ++ local k, v ++ for k, v in util.spairs(node.nodes, ++ function(a, b) ++ return (node.nodes[a].order or 100) ++ < (node.nodes[b].order or 100) ++ end) ++ do ++ if node_visible(v) then ++ rv[#rv+1] = k ++ end ++ end ++ end ++ return rv ++end ++ ++ ++function error404(message) ++ http.status(404, "Not Found") ++ message = message or "Not Found" ++ ++ require("luci.template") ++ if not util.copcall(luci.template.render, "error404") then ++ http.prepare_content("text/plain") ++ http.write(message) ++ end ++ return false ++end ++ ++function error500(message) ++ util.perror(message) ++ if not context.template_header_sent then ++ http.status(500, "Internal Server Error") ++ http.prepare_content("text/plain") ++ http.write(message) ++ else ++ require("luci.template") ++ if not util.copcall(luci.template.render, "error500", {message=message}) then ++ http.prepare_content("text/plain") ++ http.write(message) ++ end ++ end ++ return false ++end ++ ++function authenticator.htmlauth(validator, accs, default) ++ local user = http.formvalue("luci_username") ++ local pass = http.formvalue("luci_password") ++ ++ if user and validator(user, pass) then ++ return user ++ end ++ ++ if context.urltoken.stok then ++ context.urltoken.stok = nil ++ ++ local cookie = 'sysauth=%s; expires=%s; path=%s/' %{ ++ http.getcookie('sysauth') or 'x', ++ 'Thu, 01 Jan 1970 01:00:00 GMT', ++ build_url() ++ } ++ ++ http.header("Set-Cookie", cookie) ++ http.redirect(build_url()) ++ else ++ require("luci.i18n") ++ require("luci.template") ++ context.path = {} ++ http.status(403, "Forbidden") ++ luci.template.render("sysauth", {duser=default, fuser=user}) ++ end ++ ++ return false ++ ++end ++ ++function httpdispatch(request, prefix) ++ http.context.request = request ++ ++ local r = {} ++ context.request = r ++ context.urltoken = {} ++ ++ local pathinfo = http.urldecode(request:getenv("PATH_INFO") or "", true) ++ ++ if prefix then ++ for _, node in ipairs(prefix) do ++ r[#r+1] = node ++ end ++ end ++ ++ local tokensok = true ++ for node in pathinfo:gmatch("[^/]+") do ++ local tkey, tval ++ if tokensok then ++ tkey, tval = node:match(";(%w+)=([a-fA-F0-9]*)") ++ end ++ if tkey then ++ context.urltoken[tkey] = tval ++ else ++ tokensok = false ++ r[#r+1] = node ++ end ++ end ++ ++ local stat, err = util.coxpcall(function() ++ dispatch(context.request) ++ end, error500) ++ ++ http.close() ++ ++ --context._disable_memtrace() ++end ++ ++function dispatch(request) ++ --context._disable_memtrace = require "luci.debug".trap_memtrace("l") ++ local ctx = context ++ ctx.path = request ++ ++ local conf = require "luci.config" ++ assert(conf.main, ++ "/etc/config/luci seems to be corrupt, unable to find section 'main'") ++ ++ local lang = conf.main.lang or "auto" ++ if lang == "auto" then ++ local aclang = http.getenv("HTTP_ACCEPT_LANGUAGE") or "" ++ for lpat in aclang:gmatch("[%w-]+") do ++ lpat = lpat and lpat:gsub("-", "_") ++ if conf.languages[lpat] then ++ lang = lpat ++ break ++ end ++ end ++ end ++ require "luci.i18n".setlanguage(lang) ++ ++ local c = ctx.tree ++ local stat ++ if not c then ++ c = createtree() ++ end ++ ++ local track = {} ++ local args = {} ++ ctx.args = args ++ ctx.requestargs = ctx.requestargs or args ++ local n ++ local token = ctx.urltoken ++ local preq = {} ++ local freq = {} ++ ++ for i, s in ipairs(request) do ++ preq[#preq+1] = s ++ freq[#freq+1] = s ++ c = c.nodes[s] ++ n = i ++ if not c then ++ break ++ end ++ ++ util.update(track, c) ++ ++ if c.leaf then ++ break ++ end ++ end ++ ++ if c and c.leaf then ++ for j=n+1, #request do ++ args[#args+1] = request[j] ++ freq[#freq+1] = request[j] ++ end ++ end ++ ++ ctx.requestpath = ctx.requestpath or freq ++ ctx.path = preq ++ ++ if track.i18n then ++ i18n.loadc(track.i18n) ++ end ++ ++ -- Init template engine ++ if (c and c.index) or not track.notemplate then ++ local tpl = require("luci.template") ++ local media = track.mediaurlbase or luci.config.main.mediaurlbase ++ if not pcall(tpl.Template, "themes/%s/header" % fs.basename(media)) then ++ media = nil ++ for name, theme in pairs(luci.config.themes) do ++ if name:sub(1,1) ~= "." and pcall(tpl.Template, ++ "themes/%s/header" % fs.basename(theme)) then ++ media = theme ++ end ++ end ++ assert(media, "No valid theme found") ++ end ++ ++ local function _ifattr(cond, key, val) ++ if cond then ++ local env = getfenv(3) ++ local scope = (type(env.self) == "table") and env.self ++ return string.format( ++ ' %s="%s"', tostring(key), ++ util.pcdata(tostring( val ++ or (type(env[key]) ~= "function" and env[key]) ++ or (scope and type(scope[key]) ~= "function" and scope[key]) ++ or "" )) ++ ) ++ else ++ return '' ++ end ++ end ++ ++ tpl.context.viewns = setmetatable({ ++ write = http.write; ++ include = function(name) tpl.Template(name):render(getfenv(2)) end; ++ translate = i18n.translate; ++ translatef = i18n.translatef; ++ export = function(k, v) if tpl.context.viewns[k] == nil then tpl.context.viewns[k] = v end end; ++ striptags = util.striptags; ++ pcdata = util.pcdata; ++ media = media; ++ theme = fs.basename(media); ++ resource = luci.config.main.resourcebase; ++ ifattr = function(...) return _ifattr(...) end; ++ attr = function(...) return _ifattr(true, ...) end; ++ }, {__index=function(table, key) ++ if key == "controller" then ++ return build_url() ++ elseif key == "REQUEST_URI" then ++ return build_url(unpack(ctx.requestpath)) ++ else ++ return rawget(table, key) or _G[key] ++ end ++ end}) ++ end ++ ++ track.dependent = (track.dependent ~= false) ++ assert(not track.dependent or not track.auto, ++ "Access Violation\nThe page at '" .. table.concat(request, "/") .. "/' " .. ++ "has no parent node so the access to this location has been denied.\n" .. ++ "This is a software bug, please report this message at " .. ++ "http://luci.subsignal.org/trac/newticket" ++ ) ++ ++ if track.sysauth then ++ local authen = type(track.sysauth_authenticator) == "function" ++ and track.sysauth_authenticator ++ or authenticator[track.sysauth_authenticator] ++ ++ local def = (type(track.sysauth) == "string") and track.sysauth ++ local accs = def and {track.sysauth} or track.sysauth ++ local sess = ctx.authsession ++ local verifytoken = false ++ if not sess then ++ sess = http.getcookie("sysauth") ++ sess = sess and sess:match("^[a-f0-9]*$") ++ verifytoken = true ++ end ++ ++ local sdat = (util.ubus("session", "get", { ubus_rpc_session = sess }) or { }).values ++ local user ++ ++ if sdat then ++ if not verifytoken or ctx.urltoken.stok == sdat.token then ++ user = sdat.user ++ end ++ else ++ local eu = http.getenv("HTTP_AUTH_USER") ++ local ep = http.getenv("HTTP_AUTH_PASS") ++ if eu and ep and sys.user.checkpasswd(eu, ep) then ++ authen = function() return eu end ++ end ++ end ++ ++ if not util.contains(accs, user) then ++ if authen then ++ local user, sess = authen(sys.user.checkpasswd, accs, def) ++ local token ++ if not user or not util.contains(accs, user) then ++ return ++ else ++ if not sess then ++ local sdat = util.ubus("session", "create", { timeout = tonumber(luci.config.sauth.sessiontime) }) ++ if sdat then ++ token = sys.uniqueid(16) ++ util.ubus("session", "set", { ++ ubus_rpc_session = sdat.ubus_rpc_session, ++ values = { ++ user = user, ++ token = token, ++ section = sys.uniqueid(16) ++ } ++ }) ++ sess = sdat.ubus_rpc_session ++ end ++ end ++ ++ if sess and token then ++ http.header("Set-Cookie", 'sysauth=%s; path=%s/' %{ ++ sess, build_url() ++ }) ++ ++ ctx.urltoken.stok = token ++ ctx.authsession = sess ++ ctx.authuser = user ++ ++ http.redirect(build_url(unpack(ctx.requestpath))) ++ end ++ end ++ else ++ http.status(403, "Forbidden") ++ return ++ end ++ else ++ ctx.authsession = sess ++ ctx.authuser = user ++ end ++ end ++ ++ if track.setgroup then ++ sys.process.setgroup(track.setgroup) ++ end ++ ++ if track.setuser then ++ -- trigger ubus connection before dropping root privs ++ util.ubus() ++ ++ sys.process.setuser(track.setuser) ++ end ++ ++ local target = nil ++ if c then ++ if type(c.target) == "function" then ++ target = c.target ++ elseif type(c.target) == "table" then ++ target = c.target.target ++ end ++ end ++ ++ if c and (c.index or type(target) == "function") then ++ ctx.dispatched = c ++ ctx.requested = ctx.requested or ctx.dispatched ++ end ++ ++ if c and c.index then ++ local tpl = require "luci.template" ++ ++ if util.copcall(tpl.render, "indexer", {}) then ++ return true ++ end ++ end ++ ++ if type(target) == "function" then ++ util.copcall(function() ++ local oldenv = getfenv(target) ++ local module = require(c.module) ++ local env = setmetatable({}, {__index= ++ ++ function(tbl, key) ++ return rawget(tbl, key) or module[key] or oldenv[key] ++ end}) ++ ++ setfenv(target, env) ++ end) ++ ++ local ok, err ++ if type(c.target) == "table" then ++ ok, err = util.copcall(target, c.target, unpack(args)) ++ else ++ ok, err = util.copcall(target, unpack(args)) ++ end ++ assert(ok, ++ "Failed to execute " .. (type(c.target) == "function" and "function" or c.target.type or "unknown") .. ++ " dispatcher target for entry '/" .. table.concat(request, "/") .. "'.\n" .. ++ "The called action terminated with an exception:\n" .. tostring(err or "(unknown)")) ++ else ++ local root = node() ++ if not root or not root.target then ++ error404("No root node was registered, this usually happens if no module was installed.\n" .. ++ "Install luci-mod-admin-full and retry. " .. ++ "If the module is already installed, try removing the /tmp/luci-indexcache file.") ++ else ++ error404("No page is registered at '/" .. table.concat(request, "/") .. "'.\n" .. ++ "If this url belongs to an extension, make sure it is properly installed.\n" .. ++ "If the extension was recently installed, try removing the /tmp/luci-indexcache file.") ++ end ++ end ++end ++ ++function createindex() ++ local controllers = { } ++ local base = "%s/controller/" % util.libpath() ++ local _, path ++ ++ for path in (fs.glob("%s*.lua" % base) or function() end) do ++ controllers[#controllers+1] = path ++ end ++ ++ for path in (fs.glob("%s*/*.lua" % base) or function() end) do ++ controllers[#controllers+1] = path ++ end ++ ++ if indexcache then ++ local cachedate = fs.stat(indexcache, "mtime") ++ if cachedate then ++ local realdate = 0 ++ for _, obj in ipairs(controllers) do ++ local omtime = fs.stat(obj, "mtime") ++ realdate = (omtime and omtime > realdate) and omtime or realdate ++ end ++ ++ if cachedate > realdate and sys.process.info("uid") == 0 then ++ assert( ++ sys.process.info("uid") == fs.stat(indexcache, "uid") ++ and fs.stat(indexcache, "modestr") == "rw-------", ++ "Fatal: Indexcache is not sane!" ++ ) ++ ++ index = loadfile(indexcache)() ++ return index ++ end ++ end ++ end ++ ++ index = {} ++ ++ for _, path in ipairs(controllers) do ++ local modname = "luci.controller." .. path:sub(#base+1, #path-4):gsub("/", ".") ++ local mod = require(modname) ++ assert(mod ~= true, ++ "Invalid controller file found\n" .. ++ "The file '" .. path .. "' contains an invalid module line.\n" .. ++ "Please verify whether the module name is set to '" .. modname .. ++ "' - It must correspond to the file path!") ++ ++ local idx = mod.index ++ assert(type(idx) == "function", ++ "Invalid controller file found\n" .. ++ "The file '" .. path .. "' contains no index() function.\n" .. ++ "Please make sure that the controller contains a valid " .. ++ "index function and verify the spelling!") ++ ++ index[modname] = idx ++ end ++ ++ if indexcache then ++ local f = nixio.open(indexcache, "w", 600) ++ f:writeall(util.get_bytecode(index)) ++ f:close() ++ end ++end ++ ++-- Build the index before if it does not exist yet. ++function createtree() ++ if not index then ++ createindex() ++ end ++ ++ local ctx = context ++ local tree = {nodes={}, inreq=true} ++ local modi = {} ++ ++ ctx.treecache = setmetatable({}, {__mode="v"}) ++ ctx.tree = tree ++ ctx.modifiers = modi ++ ++ -- Load default translation ++ require "luci.i18n".loadc("base") ++ ++ local scope = setmetatable({}, {__index = luci.dispatcher}) ++ ++ for k, v in pairs(index) do ++ scope._NAME = k ++ setfenv(v, scope) ++ v() ++ end ++ ++ local function modisort(a,b) ++ return modi[a].order < modi[b].order ++ end ++ ++ for _, v in util.spairs(modi, modisort) do ++ scope._NAME = v.module ++ setfenv(v.func, scope) ++ v.func() ++ end ++ ++ return tree ++end ++ ++function modifier(func, order) ++ context.modifiers[#context.modifiers+1] = { ++ func = func, ++ order = order or 0, ++ module ++ = getfenv(2)._NAME ++ } ++end ++ ++function assign(path, clone, title, order) ++ local obj = node(unpack(path)) ++ obj.nodes = nil ++ obj.module = nil ++ ++ obj.title = title ++ obj.order = order ++ ++ setmetatable(obj, {__index = _create_node(clone)}) ++ ++ return obj ++end ++ ++function entry(path, target, title, order) ++ local c = node(unpack(path)) ++ ++ c.target = target ++ c.title = title ++ c.order = order ++ c.module = getfenv(2)._NAME ++ ++ return c ++end ++ ++-- enabling the node. ++function get(...) ++ return _create_node({...}) ++end ++ ++function node(...) ++ local c = _create_node({...}) ++ ++ c.module = getfenv(2)._NAME ++ c.auto = nil ++ ++ return c ++end ++ ++function _create_node(path) ++ if #path == 0 then ++ return context.tree ++ end ++ ++ local name = table.concat(path, ".") ++ local c = context.treecache[name] ++ ++ if not c then ++ local last = table.remove(path) ++ local parent = _create_node(path) ++ ++ c = {nodes={}, auto=true} ++ -- the node is "in request" if the request path matches ++ -- at least up to the length of the node path ++ if parent.inreq and context.path[#path+1] == last then ++ c.inreq = true ++ end ++ parent.nodes[last] = c ++ context.treecache[name] = c ++ end ++ return c ++end ++ ++-- Subdispatchers -- ++ ++function _firstchild() ++ local path = { unpack(context.path) } ++ local name = table.concat(path, ".") ++ local node = context.treecache[name] ++ ++ local lowest ++ if node and node.nodes and next(node.nodes) then ++ local k, v ++ for k, v in pairs(node.nodes) do ++ if not lowest or ++ (v.order or 100) < (node.nodes[lowest].order or 100) ++ then ++ lowest = k ++ end ++ end ++ end ++ ++ assert(lowest ~= nil, ++ "The requested node contains no childs, unable to redispatch") ++ ++ path[#path+1] = lowest ++ dispatch(path) ++end ++ ++function firstchild() ++ return { type = "firstchild", target = _firstchild } ++end ++ ++function alias(...) ++ local req = {...} ++ return function(...) ++ for _, r in ipairs({...}) do ++ req[#req+1] = r ++ end ++ ++ dispatch(req) ++ end ++end ++ ++function rewrite(n, ...) ++ local req = {...} ++ return function(...) ++ local dispatched = util.clone(context.dispatched) ++ ++ for i=1,n do ++ table.remove(dispatched, 1) ++ end ++ ++ for i, r in ipairs(req) do ++ table.insert(dispatched, i, r) ++ end ++ ++ for _, r in ipairs({...}) do ++ dispatched[#dispatched+1] = r ++ end ++ ++ dispatch(dispatched) ++ end ++end ++ ++ ++local function _call(self, ...) ++ local func = getfenv()[self.name] ++ assert(func ~= nil, ++ 'Cannot resolve function "' .. self.name .. '". Is it misspelled or local?') ++ ++ assert(type(func) == "function", ++ 'The symbol "' .. self.name .. '" does not refer to a function but data ' .. ++ 'of type "' .. type(func) .. '".') ++ ++ if #self.argv > 0 then ++ return func(unpack(self.argv), ...) ++ else ++ return func(...) ++ end ++end ++ ++function call(name, ...) ++ return {type = "call", argv = {...}, name = name, target = _call} ++end ++ ++ ++local _template = function(self, ...) ++ require "luci.template".render(self.view) ++end ++ ++function template(name) ++ return {type = "template", view = name, target = _template} ++end ++ ++ ++local function _cbi(self, ...) ++ local cbi = require "luci.cbi" ++ local tpl = require "luci.template" ++ local http = require "luci.http" ++ ++ local config = self.config or {} ++ local maps = cbi.load(self.model, ...) ++ ++ local state = nil ++ ++ for i, res in ipairs(maps) do ++ res.flow = config ++ local cstate = res:parse() ++ if cstate and (not state or cstate < state) then ++ state = cstate ++ end ++ end ++ ++ local function _resolve_path(path) ++ return type(path) == "table" and build_url(unpack(path)) or path ++ end ++ ++ if config.on_valid_to and state and state > 0 and state < 2 then ++ http.redirect(_resolve_path(config.on_valid_to)) ++ return ++ end ++ ++ if config.on_changed_to and state and state > 1 then ++ http.redirect(_resolve_path(config.on_changed_to)) ++ return ++ end ++ ++ if config.on_success_to and state and state > 0 then ++ http.redirect(_resolve_path(config.on_success_to)) ++ return ++ end ++ ++ if config.state_handler then ++ if not config.state_handler(state, maps) then ++ return ++ end ++ end ++ ++ http.header("X-CBI-State", state or 0) ++ ++ if not config.noheader then ++ tpl.render("cbi/header", {state = state}) ++ end ++ ++ local redirect ++ local messages ++ local applymap = false ++ local pageaction = true ++ local parsechain = { } ++ ++ for i, res in ipairs(maps) do ++ if res.apply_needed and res.parsechain then ++ local c ++ for _, c in ipairs(res.parsechain) do ++ parsechain[#parsechain+1] = c ++ end ++ applymap = true ++ end ++ ++ if res.redirect then ++ redirect = redirect or res.redirect ++ end ++ ++ if res.pageaction == false then ++ pageaction = false ++ end ++ ++ if res.message then ++ messages = messages or { } ++ messages[#messages+1] = res.message ++ end ++ end ++ ++ for i, res in ipairs(maps) do ++ res:render({ ++ firstmap = (i == 1), ++ applymap = applymap, ++ redirect = redirect, ++ messages = messages, ++ pageaction = pageaction, ++ parsechain = parsechain ++ }) ++ end ++ ++ if not config.nofooter then ++ tpl.render("cbi/footer", { ++ flow = config, ++ pageaction = pageaction, ++ redirect = redirect, ++ state = state, ++ autoapply = config.autoapply ++ }) ++ end ++end ++ ++function cbi(model, config) ++ return {type = "cbi", config = config, model = model, target = _cbi} ++end ++ ++ ++local function _arcombine(self, ...) ++ local argv = {...} ++ local target = #argv > 0 and self.targets[2] or self.targets[1] ++ setfenv(target.target, self.env) ++ target:target(unpack(argv)) ++end ++ ++function arcombine(trg1, trg2) ++ return {type = "arcombine", env = getfenv(), target = _arcombine, targets = {trg1, trg2}} ++end ++ ++ ++local function _form(self, ...) ++ local cbi = require "luci.cbi" ++ local tpl = require "luci.template" ++ local http = require "luci.http" ++ ++ local maps = luci.cbi.load(self.model, ...) ++ local state = nil ++ ++ for i, res in ipairs(maps) do ++ local cstate = res:parse() ++ if cstate and (not state or cstate < state) then ++ state = cstate ++ end ++ end ++ ++ http.header("X-CBI-State", state or 0) ++ tpl.render("header") ++ for i, res in ipairs(maps) do ++ res:render() ++ end ++ tpl.render("footer") ++end ++ ++function form(model) ++ return {type = "cbi", model = model, target = _form} ++end ++ ++translate = i18n.translate ++ ++-- This function does not actually translate the given argument but ++-- is used by build/i18n-scan.pl to find translatable entries. ++function _(text) ++ return text ++end +diff --git a/feeds/luci/modules/luci-base/luasrc/dispatcher.luadoc b/feeds/luci/modules/luci-base/luasrc/dispatcher.luadoc +new file mode 100644 +index 0000000..743463c +--- /dev/null ++++ b/feeds/luci/modules/luci-base/luasrc/dispatcher.luadoc +@@ -0,0 +1,220 @@ ++---[[ ++LuCI web dispatcher. ++]] ++module "luci.dispatcher" ++ ++---[[ ++Build the URL relative to the server webroot from given virtual path. ++ ++@class function ++@name build_url ++@param ... Virtual path ++@return Relative URL ++]] ++ ++---[[ ++Check whether a dispatch node shall be visible ++ ++@class function ++@name node_visible ++@param node Dispatch node ++@return Boolean indicating whether the node should be visible ++]] ++ ++---[[ ++Return a sorted table of visible childs within a given node ++ ++@class function ++@name node_childs ++@param node Dispatch node ++@return Ordered table of child node names ++]] ++ ++---[[ ++Send a 404 error code and render the "error404" template if available. ++ ++@class function ++@name error404 ++@param message Custom error message (optional) ++@return false ++]] ++ ++---[[ ++Send a 500 error code and render the "error500" template if available. ++ ++@class function ++@name error500 ++@param message Custom error message (optional)# ++@return false ++]] ++ ++---[[ ++Dispatch an HTTP request. ++ ++@class function ++@name httpdispatch ++@param request LuCI HTTP Request object ++]] ++ ++---[[ ++Dispatches a LuCI virtual path. ++ ++@class function ++@name dispatch ++@param request Virtual path ++]] ++ ++---[[ ++Generate the dispatching index using the native file-cache based strategy. ++ ++ ++@class function ++@name createindex ++]] ++ ++---[[ ++Create the dispatching tree from the index. ++ ++Build the index before if it does not exist yet. ++ ++@class function ++@name createtree ++]] ++ ++---[[ ++Register a tree modifier. ++ ++@class function ++@name modifier ++@param func Modifier function ++@param order Modifier order value (optional) ++]] ++ ++---[[ ++Clone a node of the dispatching tree to another position. ++ ++@class function ++@name assign ++@param path Virtual path destination ++@param clone Virtual path source ++@param title Destination node title (optional) ++@param order Destination node order value (optional) ++@return Dispatching tree node ++]] ++ ++---[[ ++Create a new dispatching node and define common parameters. ++ ++@class function ++@name entry ++@param path Virtual path ++@param target Target function to call when dispatched. ++@param title Destination node title ++@param order Destination node order value (optional) ++@return Dispatching tree node ++]] ++ ++---[[ ++Fetch or create a dispatching node without setting the target module or ++ ++enabling the node. ++@class function ++@name get ++@param ... Virtual path ++@return Dispatching tree node ++]] ++ ++---[[ ++Fetch or create a new dispatching node. ++ ++@class function ++@name node ++@param ... Virtual path ++@return Dispatching tree node ++]] ++ ++---[[ ++Alias the first (lowest order) page automatically ++ ++ ++@class function ++@name firstchild ++]] ++ ++---[[ ++Create a redirect to another dispatching node. ++ ++@class function ++@name alias ++@param ... Virtual path destination ++]] ++ ++---[[ ++Rewrite the first x path values of the request. ++ ++@class function ++@name rewrite ++@param n Number of path values to replace ++@param ... Virtual path to replace removed path values with ++]] ++ ++---[[ ++Create a function-call dispatching target. ++ ++@class function ++@name call ++@param name Target function of local controller ++@param ... Additional parameters passed to the function ++]] ++ ++---[[ ++Create a template render dispatching target. ++ ++@class function ++@name template ++@param name Template to be rendered ++]] ++ ++---[[ ++Create a CBI model dispatching target. ++ ++@class function ++@name cbi ++@param model CBI model to be rendered ++]] ++ ++---[[ ++Create a combined dispatching target for non argv and argv requests. ++ ++@class function ++@name arcombine ++@param trg1 Overview Target ++@param trg2 Detail Target ++]] ++ ++---[[ ++Create a CBI form model dispatching target. ++ ++@class function ++@name form ++@param model CBI form model tpo be rendered ++]] ++ ++---[[ ++Access the luci.i18n translate() api. ++ ++@class function ++@name translate ++@param text Text to translate ++]] ++ ++---[[ ++No-op function used to mark translation entries for menu labels. ++ ++This function does not actually translate the given argument but ++is used by build/i18n-scan.pl to find translatable entries. ++ ++@class function ++@name _ ++]] ++ +diff --git a/feeds/luci/modules/luci-base/luasrc/http.lua b/feeds/luci/modules/luci-base/luasrc/http.lua +new file mode 100644 +index 0000000..a92d8af +--- /dev/null ++++ b/feeds/luci/modules/luci-base/luasrc/http.lua +@@ -0,0 +1,236 @@ ++-- Copyright 2008 Steven Barth ++-- Licensed to the public under the Apache License 2.0. ++ ++local ltn12 = require "luci.ltn12" ++local protocol = require "luci.http.protocol" ++local util = require "luci.util" ++local string = require "string" ++local coroutine = require "coroutine" ++local table = require "table" ++ ++local ipairs, pairs, next, type, tostring, error = ++ ipairs, pairs, next, type, tostring, error ++ ++module "luci.http" ++ ++context = util.threadlocal() ++ ++Request = util.class() ++function Request.__init__(self, env, sourcein, sinkerr) ++ self.input = sourcein ++ self.error = sinkerr ++ ++ ++ -- File handler nil by default to let .content() work ++ self.filehandler = nil ++ ++ -- HTTP-Message table ++ self.message = { ++ env = env, ++ headers = {}, ++ params = protocol.urldecode_params(env.QUERY_STRING or ""), ++ } ++ ++ self.parsed_input = false ++end ++ ++function Request.formvalue(self, name, noparse) ++ if not noparse and not self.parsed_input then ++ self:_parse_input() ++ end ++ ++ if name then ++ return self.message.params[name] ++ else ++ return self.message.params ++ end ++end ++ ++function Request.formvaluetable(self, prefix) ++ local vals = {} ++ prefix = prefix and prefix .. "." or "." ++ ++ if not self.parsed_input then ++ self:_parse_input() ++ end ++ ++ local void = self.message.params[nil] ++ for k, v in pairs(self.message.params) do ++ if k:find(prefix, 1, true) == 1 then ++ vals[k:sub(#prefix + 1)] = tostring(v) ++ end ++ end ++ ++ return vals ++end ++ ++function Request.content(self) ++ if not self.parsed_input then ++ self:_parse_input() ++ end ++ ++ return self.message.content, self.message.content_length ++end ++ ++function Request.getcookie(self, name) ++ local c = string.gsub(";" .. (self:getenv("HTTP_COOKIE") or "") .. ";", "%s*;%s*", ";") ++ local p = ";" .. name .. "=(.-);" ++ local i, j, value = c:find(p) ++ return value and urldecode(value) ++end ++ ++function Request.getenv(self, name) ++ if name then ++ return self.message.env[name] ++ else ++ return self.message.env ++ end ++end ++ ++function Request.setfilehandler(self, callback) ++ self.filehandler = callback ++end ++ ++function Request._parse_input(self) ++ protocol.parse_message_body( ++ self.input, ++ self.message, ++ self.filehandler ++ ) ++ self.parsed_input = true ++end ++ ++function close() ++ if not context.eoh then ++ context.eoh = true ++ coroutine.yield(3) ++ end ++ ++ if not context.closed then ++ context.closed = true ++ coroutine.yield(5) ++ end ++end ++ ++function content() ++ return context.request:content() ++end ++ ++function formvalue(name, noparse) ++ return context.request:formvalue(name, noparse) ++end ++ ++function formvaluetable(prefix) ++ return context.request:formvaluetable(prefix) ++end ++ ++function getcookie(name) ++ return context.request:getcookie(name) ++end ++ ++-- or the environment table itself. ++function getenv(name) ++ return context.request:getenv(name) ++end ++ ++function setfilehandler(callback) ++ return context.request:setfilehandler(callback) ++end ++ ++function header(key, value) ++ if not context.headers then ++ context.headers = {} ++ end ++ context.headers[key:lower()] = value ++ coroutine.yield(2, key, value) ++end ++ ++function prepare_content(mime) ++ if not context.headers or not context.headers["content-type"] then ++ if mime == "application/xhtml+xml" then ++ if not getenv("HTTP_ACCEPT") or ++ not getenv("HTTP_ACCEPT"):find("application/xhtml+xml", nil, true) then ++ mime = "text/html; charset=UTF-8" ++ end ++ header("Vary", "Accept") ++ end ++ header("Content-Type", mime) ++ end ++end ++ ++function source() ++ return context.request.input ++end ++ ++function status(code, message) ++ code = code or 200 ++ message = message or "OK" ++ context.status = code ++ coroutine.yield(1, code, message) ++end ++ ++-- This function is as a valid LTN12 sink. ++-- If the content chunk is nil this function will automatically invoke close. ++function write(content, src_err) ++ if not content then ++ if src_err then ++ error(src_err) ++ else ++ close() ++ end ++ return true ++ elseif #content == 0 then ++ return true ++ else ++ if not context.eoh then ++ if not context.status then ++ status() ++ end ++ if not context.headers or not context.headers["content-type"] then ++ header("Content-Type", "text/html; charset=utf-8") ++ end ++ if not context.headers["cache-control"] then ++ header("Cache-Control", "no-cache") ++ header("Expires", "0") ++ end ++ ++ ++ context.eoh = true ++ coroutine.yield(3) ++ end ++ coroutine.yield(4, content) ++ return true ++ end ++end ++ ++function splice(fd, size) ++ coroutine.yield(6, fd, size) ++end ++ ++function redirect(url) ++ status(302, "Found") ++ header("Location", url) ++ close() ++end ++ ++function build_querystring(q) ++ local s = { "?" } ++ ++ for k, v in pairs(q) do ++ if #s > 1 then s[#s+1] = "&" end ++ ++ s[#s+1] = urldecode(k) ++ s[#s+1] = "=" ++ s[#s+1] = urldecode(v) ++ end ++ ++ return table.concat(s, "") ++end ++ ++urldecode = protocol.urldecode ++ ++urlencode = protocol.urlencode ++ ++function write_json(x) ++ util.serialize_json(x, write) ++end +diff --git a/feeds/luci/modules/luci-base/luasrc/http.luadoc b/feeds/luci/modules/luci-base/luasrc/http.luadoc +new file mode 100644 +index 0000000..8a325db +--- /dev/null ++++ b/feeds/luci/modules/luci-base/luasrc/http.luadoc +@@ -0,0 +1,165 @@ ++---[[ ++LuCI Web Framework high-level HTTP functions. ++]] ++module "luci.http" ++ ++---[[ ++Close the HTTP-Connection. ++ ++ ++@class function ++@name close ++]] ++ ++---[[ ++Return the request content if the request was of unknown type. ++ ++@class function ++@name content ++@return HTTP request body ++@return HTTP request body length ++]] ++ ++---[[ ++Get a certain HTTP input value or a table of all input values. ++ ++@class function ++@name formvalue ++@param name Name of the GET or POST variable to fetch ++@param noparse Don't parse POST data before getting the value ++@return HTTP input value or table of all input value ++]] ++ ++---[[ ++Get a table of all HTTP input values with a certain prefix. ++ ++@class function ++@name formvaluetable ++@param prefix Prefix ++@return Table of all HTTP input values with given prefix ++]] ++ ++---[[ ++Get the value of a certain HTTP-Cookie. ++ ++@class function ++@name getcookie ++@param name Cookie Name ++@return String containing cookie data ++]] ++ ++---[[ ++Get the value of a certain HTTP environment variable ++ ++or the environment table itself. ++@class function ++@name getenv ++@param name Environment variable ++@return HTTP environment value or environment table ++]] ++ ++---[[ ++Set a handler function for incoming user file uploads. ++ ++@class function ++@name setfilehandler ++@param callback Handler function ++]] ++ ++---[[ ++Send a HTTP-Header. ++ ++@class function ++@name header ++@param key Header key ++@param value Header value ++]] ++ ++---[[ ++Set the mime type of following content data. ++ ++@class function ++@name prepare_content ++@param mime Mimetype of following content ++]] ++ ++---[[ ++Get the RAW HTTP input source ++ ++@class function ++@name source ++@return HTTP LTN12 source ++]] ++ ++---[[ ++Set the HTTP status code and status message. ++ ++@class function ++@name status ++@param code Status code ++@param message Status message ++]] ++ ++---[[ ++Send a chunk of content data to the client. ++ ++This function is as a valid LTN12 sink. ++If the content chunk is nil this function will automatically invoke close. ++@class function ++@name write ++@param content Content chunk ++@param src_err Error object from source (optional) ++@see close ++]] ++ ++---[[ ++Splice data from a filedescriptor to the client. ++ ++@class function ++@name splice ++@param fp File descriptor ++@param size Bytes to splice (optional) ++]] ++ ++---[[ ++Redirects the client to a new URL and closes the connection. ++ ++@class function ++@name redirect ++@param url Target URL ++]] ++ ++---[[ ++Create a querystring out of a table of key - value pairs. ++ ++@class function ++@name build_querystring ++@param table Query string source table ++@return Encoded HTTP query string ++]] ++ ++---[[ ++Return the URL-decoded equivalent of a string. ++ ++@param str URL-encoded string ++@param no_plus Don't decode + to " " ++@return URL-decoded string ++@see urlencode ++]] ++ ++---[[ ++Return the URL-encoded equivalent of a string. ++ ++@param str Source string ++@return URL-encoded string ++@see urldecode ++]] ++ ++---[[ ++Send the given data as JSON encoded string. ++ ++@class function ++@name write_json ++@param data Data to send ++]] ++ +diff --git a/feeds/luci/modules/luci-base/luasrc/http/protocol.lua b/feeds/luci/modules/luci-base/luasrc/http/protocol.lua +new file mode 100644 +index 0000000..8592726 +--- /dev/null ++++ b/feeds/luci/modules/luci-base/luasrc/http/protocol.lua +@@ -0,0 +1,623 @@ ++-- Copyright 2008 Freifunk Leipzig / Jo-Philipp Wich ++-- Licensed to the public under the Apache License 2.0. ++ ++-- This class contains several functions useful for http message- and content ++-- decoding and to retrive form data from raw http messages. ++module("luci.http.protocol", package.seeall) ++ ++local ltn12 = require("luci.ltn12") ++ ++HTTP_MAX_CONTENT = 1024*8 -- 8 kB maximum content size ++ ++-- the "+" sign to " " - and return the decoded string. ++function urldecode( str, no_plus ) ++ ++ local function __chrdec( hex ) ++ return string.char( tonumber( hex, 16 ) ) ++ end ++ ++ if type(str) == "string" then ++ if not no_plus then ++ str = str:gsub( "+", " " ) ++ end ++ ++ str = str:gsub( "%%([a-fA-F0-9][a-fA-F0-9])", __chrdec ) ++ end ++ ++ return str ++end ++ ++-- from given url or string. Returns a table with urldecoded values. ++-- Simple parameters are stored as string values associated with the parameter ++-- name within the table. Parameters with multiple values are stored as array ++-- containing the corresponding values. ++function urldecode_params( url, tbl ) ++ ++ local params = tbl or { } ++ ++ if url:find("?") then ++ url = url:gsub( "^.+%?([^?]+)", "%1" ) ++ end ++ ++ for pair in url:gmatch( "[^&;]+" ) do ++ ++ -- find key and value ++ local key = urldecode( pair:match("^([^=]+)") ) ++ local val = urldecode( pair:match("^[^=]+=(.+)$") ) ++ ++ -- store ++ if type(key) == "string" and key:len() > 0 then ++ if type(val) ~= "string" then val = "" end ++ ++ if not params[key] then ++ params[key] = val ++ elseif type(params[key]) ~= "table" then ++ params[key] = { params[key], val } ++ else ++ table.insert( params[key], val ) ++ end ++ end ++ end ++ ++ return params ++end ++ ++function urlencode( str ) ++ ++ local function __chrenc( chr ) ++ return string.format( ++ "%%%02x", string.byte( chr ) ++ ) ++ end ++ ++ if type(str) == "string" then ++ str = str:gsub( ++ "([^a-zA-Z0-9$_%-%.!*'(),])", ++ __chrenc ++ ) ++ end ++ ++ return str ++end ++ ++-- separated by "&". Tables are encoded as parameters with multiple values by ++-- repeating the parameter name with each value. ++function urlencode_params( tbl ) ++ local enc = "" ++ ++ for k, v in pairs(tbl) do ++ if type(v) == "table" then ++ for i, v2 in ipairs(v) do ++ enc = enc .. ( #enc > 0 and "&" or "" ) .. ++ urlencode(k) .. "=" .. urlencode(v2) ++ end ++ else ++ enc = enc .. ( #enc > 0 and "&" or "" ) .. ++ urlencode(k) .. "=" .. urlencode(v) ++ end ++ end ++ ++ return enc ++end ++ ++-- (Internal function) ++-- Initialize given parameter and coerce string into table when the parameter ++-- already exists. ++local function __initval( tbl, key ) ++ if tbl[key] == nil then ++ tbl[key] = "" ++ elseif type(tbl[key]) == "string" then ++ tbl[key] = { tbl[key], "" } ++ else ++ table.insert( tbl[key], "" ) ++ end ++end ++ ++-- (Internal function) ++-- Append given data to given parameter, either by extending the string value ++-- or by appending it to the last string in the parameter's value table. ++local function __appendval( tbl, key, chunk ) ++ if type(tbl[key]) == "table" then ++ tbl[key][#tbl[key]] = tbl[key][#tbl[key]] .. chunk ++ else ++ tbl[key] = tbl[key] .. chunk ++ end ++end ++ ++-- (Internal function) ++-- Finish the value of given parameter, either by transforming the string value ++-- or - in the case of multi value parameters - the last element in the ++-- associated values table. ++local function __finishval( tbl, key, handler ) ++ if handler then ++ if type(tbl[key]) == "table" then ++ tbl[key][#tbl[key]] = handler( tbl[key][#tbl[key]] ) ++ else ++ tbl[key] = handler( tbl[key] ) ++ end ++ end ++end ++ ++ ++-- Table of our process states ++local process_states = { } ++ ++-- Extract "magic", the first line of a http message. ++-- Extracts the message type ("get", "post" or "response"), the requested uri ++-- or the status code if the line descripes a http response. ++process_states['magic'] = function( msg, chunk, err ) ++ ++ if chunk ~= nil then ++ -- ignore empty lines before request ++ if #chunk == 0 then ++ return true, nil ++ end ++ ++ -- Is it a request? ++ local method, uri, http_ver = chunk:match("^([A-Z]+) ([^ ]+) HTTP/([01]%.[019])$") ++ ++ -- Yup, it is ++ if method then ++ ++ msg.type = "request" ++ msg.request_method = method:lower() ++ msg.request_uri = uri ++ msg.http_version = tonumber( http_ver ) ++ msg.headers = { } ++ ++ -- We're done, next state is header parsing ++ return true, function( chunk ) ++ return process_states['headers']( msg, chunk ) ++ end ++ ++ -- Is it a response? ++ else ++ ++ local http_ver, code, message = chunk:match("^HTTP/([01]%.[019]) ([0-9]+) ([^\r\n]+)$") ++ ++ -- Is a response ++ if code then ++ ++ msg.type = "response" ++ msg.status_code = code ++ msg.status_message = message ++ msg.http_version = tonumber( http_ver ) ++ msg.headers = { } ++ ++ -- We're done, next state is header parsing ++ return true, function( chunk ) ++ return process_states['headers']( msg, chunk ) ++ end ++ end ++ end ++ end ++ ++ -- Can't handle it ++ return nil, "Invalid HTTP message magic" ++end ++ ++ ++-- Extract headers from given string. ++process_states['headers'] = function( msg, chunk ) ++ ++ if chunk ~= nil then ++ ++ -- Look for a valid header format ++ local hdr, val = chunk:match( "^([A-Za-z][A-Za-z0-9%-_]+): +(.+)$" ) ++ ++ if type(hdr) == "string" and hdr:len() > 0 and ++ type(val) == "string" and val:len() > 0 ++ then ++ msg.headers[hdr] = val ++ ++ -- Valid header line, proceed ++ return true, nil ++ ++ elseif #chunk == 0 then ++ -- Empty line, we won't accept data anymore ++ return false, nil ++ else ++ -- Junk data ++ return nil, "Invalid HTTP header received" ++ end ++ else ++ return nil, "Unexpected EOF" ++ end ++end ++ ++ ++-- data line by line with the trailing \r\n stripped of. ++function header_source( sock ) ++ return ltn12.source.simplify( function() ++ ++ local chunk, err, part = sock:receive("*l") ++ ++ -- Line too long ++ if chunk == nil then ++ if err ~= "timeout" then ++ return nil, part ++ and "Line exceeds maximum allowed length" ++ or "Unexpected EOF" ++ else ++ return nil, err ++ end ++ ++ -- Line ok ++ elseif chunk ~= nil then ++ ++ -- Strip trailing CR ++ chunk = chunk:gsub("\r$","") ++ ++ return chunk, nil ++ end ++ end ) ++end ++ ++-- Content-Type. Stores all extracted data associated with its parameter name ++-- in the params table withing the given message object. Multiple parameter ++-- values are stored as tables, ordinary ones as strings. ++-- If an optional file callback function is given then it is feeded with the ++-- file contents chunk by chunk and only the extracted file name is stored ++-- within the params table. The callback function will be called subsequently ++-- with three arguments: ++-- o Table containing decoded (name, file) and raw (headers) mime header data ++-- o String value containing a chunk of the file data ++-- o Boolean which indicates wheather the current chunk is the last one (eof) ++function mimedecode_message_body( src, msg, filecb ) ++ ++ if msg and msg.env.CONTENT_TYPE then ++ msg.mime_boundary = msg.env.CONTENT_TYPE:match("^multipart/form%-data; boundary=(.+)$") ++ end ++ ++ if not msg.mime_boundary then ++ return nil, "Invalid Content-Type found" ++ end ++ ++ ++ local tlen = 0 ++ local inhdr = false ++ local field = nil ++ local store = nil ++ local lchunk = nil ++ ++ local function parse_headers( chunk, field ) ++ ++ local stat ++ repeat ++ chunk, stat = chunk:gsub( ++ "^([A-Z][A-Za-z0-9%-_]+): +([^\r\n]+)\r\n", ++ function(k,v) ++ field.headers[k] = v ++ return "" ++ end ++ ) ++ until stat == 0 ++ ++ chunk, stat = chunk:gsub("^\r\n","") ++ ++ -- End of headers ++ if stat > 0 then ++ if field.headers["Content-Disposition"] then ++ if field.headers["Content-Disposition"]:match("^form%-data; ") then ++ field.name = field.headers["Content-Disposition"]:match('name="(.-)"') ++ field.file = field.headers["Content-Disposition"]:match('filename="(.+)"$') ++ end ++ end ++ ++ if not field.headers["Content-Type"] then ++ field.headers["Content-Type"] = "text/plain" ++ end ++ ++ if field.name and field.file and filecb then ++ __initval( msg.params, field.name ) ++ __appendval( msg.params, field.name, field.file ) ++ ++ store = filecb ++ elseif field.name then ++ __initval( msg.params, field.name ) ++ ++ store = function( hdr, buf, eof ) ++ __appendval( msg.params, field.name, buf ) ++ end ++ else ++ store = nil ++ end ++ ++ return chunk, true ++ end ++ ++ return chunk, false ++ end ++ ++ local function snk( chunk ) ++ ++ tlen = tlen + ( chunk and #chunk or 0 ) ++ ++ if msg.env.CONTENT_LENGTH and tlen > tonumber(msg.env.CONTENT_LENGTH) + 2 then ++ return nil, "Message body size exceeds Content-Length" ++ end ++ ++ if chunk and not lchunk then ++ lchunk = "\r\n" .. chunk ++ ++ elseif lchunk then ++ local data = lchunk .. ( chunk or "" ) ++ local spos, epos, found ++ ++ repeat ++ spos, epos = data:find( "\r\n--" .. msg.mime_boundary .. "\r\n", 1, true ) ++ ++ if not spos then ++ spos, epos = data:find( "\r\n--" .. msg.mime_boundary .. "--\r\n", 1, true ) ++ end ++ ++ ++ if spos then ++ local predata = data:sub( 1, spos - 1 ) ++ ++ if inhdr then ++ predata, eof = parse_headers( predata, field ) ++ ++ if not eof then ++ return nil, "Invalid MIME section header" ++ elseif not field.name then ++ return nil, "Invalid Content-Disposition header" ++ end ++ end ++ ++ if store then ++ store( field, predata, true ) ++ end ++ ++ ++ field = { headers = { } } ++ found = found or true ++ ++ data, eof = parse_headers( data:sub( epos + 1, #data ), field ) ++ inhdr = not eof ++ end ++ until not spos ++ ++ if found then ++ -- We found at least some boundary. Save ++ -- the unparsed remaining data for the ++ -- next chunk. ++ lchunk, data = data, nil ++ else ++ -- There was a complete chunk without a boundary. Parse it as headers or ++ -- append it as data, depending on our current state. ++ if inhdr then ++ lchunk, eof = parse_headers( data, field ) ++ inhdr = not eof ++ else ++ -- We're inside data, so append the data. Note that we only append ++ -- lchunk, not all of data, since there is a chance that chunk ++ -- contains half a boundary. Assuming that each chunk is at least the ++ -- boundary in size, this should prevent problems ++ store( field, lchunk, false ) ++ lchunk, chunk = chunk, nil ++ end ++ end ++ end ++ ++ return true ++ end ++ ++ return ltn12.pump.all( src, snk ) ++end ++ ++-- Content-Type. Stores all extracted data associated with its parameter name ++-- in the params table withing the given message object. Multiple parameter ++-- values are stored as tables, ordinary ones as strings. ++function urldecode_message_body( src, msg ) ++ ++ local tlen = 0 ++ local lchunk = nil ++ ++ local function snk( chunk ) ++ ++ tlen = tlen + ( chunk and #chunk or 0 ) ++ ++ if msg.env.CONTENT_LENGTH and tlen > tonumber(msg.env.CONTENT_LENGTH) + 2 then ++ return nil, "Message body size exceeds Content-Length" ++ elseif tlen > HTTP_MAX_CONTENT then ++ return nil, "Message body size exceeds maximum allowed length" ++ end ++ ++ if not lchunk and chunk then ++ lchunk = chunk ++ ++ elseif lchunk then ++ local data = lchunk .. ( chunk or "&" ) ++ local spos, epos ++ ++ repeat ++ spos, epos = data:find("^.-[;&]") ++ ++ if spos then ++ local pair = data:sub( spos, epos - 1 ) ++ local key = pair:match("^(.-)=") ++ local val = pair:match("=([^%s]*)%s*$") ++ ++ if key and #key > 0 then ++ __initval( msg.params, key ) ++ __appendval( msg.params, key, val ) ++ __finishval( msg.params, key, urldecode ) ++ end ++ ++ data = data:sub( epos + 1, #data ) ++ end ++ until not spos ++ ++ lchunk = data ++ end ++ ++ return true ++ end ++ ++ return ltn12.pump.all( src, snk ) ++end ++ ++-- version, message headers and resulting CGI environment variables from the ++-- given ltn12 source. ++function parse_message_header( src ) ++ ++ local ok = true ++ local msg = { } ++ ++ local sink = ltn12.sink.simplify( ++ function( chunk ) ++ return process_states['magic']( msg, chunk ) ++ end ++ ) ++ ++ -- Pump input data... ++ while ok do ++ ++ -- get data ++ ok, err = ltn12.pump.step( src, sink ) ++ ++ -- error ++ if not ok and err then ++ return nil, err ++ ++ -- eof ++ elseif not ok then ++ ++ -- Process get parameters ++ if ( msg.request_method == "get" or msg.request_method == "post" ) and ++ msg.request_uri:match("?") ++ then ++ msg.params = urldecode_params( msg.request_uri ) ++ else ++ msg.params = { } ++ end ++ ++ -- Populate common environment variables ++ msg.env = { ++ CONTENT_LENGTH = msg.headers['Content-Length']; ++ CONTENT_TYPE = msg.headers['Content-Type'] or msg.headers['Content-type']; ++ REQUEST_METHOD = msg.request_method:upper(); ++ REQUEST_URI = msg.request_uri; ++ SCRIPT_NAME = msg.request_uri:gsub("?.+$",""); ++ SCRIPT_FILENAME = ""; -- XXX implement me ++ SERVER_PROTOCOL = "HTTP/" .. string.format("%.1f", msg.http_version); ++ QUERY_STRING = msg.request_uri:match("?") ++ and msg.request_uri:gsub("^.+?","") or "" ++ } ++ ++ -- Populate HTTP_* environment variables ++ for i, hdr in ipairs( { ++ 'Accept', ++ 'Accept-Charset', ++ 'Accept-Encoding', ++ 'Accept-Language', ++ 'Connection', ++ 'Cookie', ++ 'Host', ++ 'Referer', ++ 'User-Agent', ++ } ) do ++ local var = 'HTTP_' .. hdr:upper():gsub("%-","_") ++ local val = msg.headers[hdr] ++ ++ msg.env[var] = val ++ end ++ end ++ end ++ ++ return msg ++end ++ ++-- This function will examine the Content-Type within the given message object ++-- to select the appropriate content decoder. ++-- Currently the application/x-www-urlencoded and application/form-data ++-- mime types are supported. If the encountered content encoding can't be ++-- handled then the whole message body will be stored unaltered as "content" ++-- property within the given message object. ++function parse_message_body( src, msg, filecb ) ++ -- Is it multipart/mime ? ++ if msg.env.REQUEST_METHOD == "POST" and msg.env.CONTENT_TYPE and ++ msg.env.CONTENT_TYPE:match("^multipart/form%-data") ++ then ++ ++ return mimedecode_message_body( src, msg, filecb ) ++ ++ -- Is it application/x-www-form-urlencoded ? ++ elseif msg.env.REQUEST_METHOD == "POST" and msg.env.CONTENT_TYPE and ++ msg.env.CONTENT_TYPE:match("^application/x%-www%-form%-urlencoded") ++ then ++ return urldecode_message_body( src, msg, filecb ) ++ ++ ++ -- Unhandled encoding ++ -- If a file callback is given then feed it chunk by chunk, else ++ -- store whole buffer in message.content ++ else ++ ++ local sink ++ ++ -- If we have a file callback then feed it ++ if type(filecb) == "function" then ++ local meta = { ++ name = "raw", ++ encoding = msg.env.CONTENT_TYPE ++ } ++ sink = function( chunk ) ++ if chunk then ++ return filecb(meta, chunk, false) ++ else ++ return filecb(meta, nil, true) ++ end ++ end ++ -- ... else append to .content ++ else ++ msg.content = "" ++ msg.content_length = 0 ++ ++ sink = function( chunk ) ++ if chunk then ++ if ( msg.content_length + #chunk ) <= HTTP_MAX_CONTENT then ++ msg.content = msg.content .. chunk ++ msg.content_length = msg.content_length + #chunk ++ return true ++ else ++ return nil, "POST data exceeds maximum allowed length" ++ end ++ end ++ return true ++ end ++ end ++ ++ -- Pump data... ++ while true do ++ local ok, err = ltn12.pump.step( src, sink ) ++ ++ if not ok and err then ++ return nil, err ++ elseif not ok then -- eof ++ return true ++ end ++ end ++ ++ return true ++ end ++end ++ ++statusmsg = { ++ [200] = "OK", ++ [206] = "Partial Content", ++ [301] = "Moved Permanently", ++ [302] = "Found", ++ [304] = "Not Modified", ++ [400] = "Bad Request", ++ [403] = "Forbidden", ++ [404] = "Not Found", ++ [405] = "Method Not Allowed", ++ [408] = "Request Time-out", ++ [411] = "Length Required", ++ [412] = "Precondition Failed", ++ [416] = "Requested range not satisfiable", ++ [500] = "Internal Server Error", ++ [503] = "Server Unavailable", ++} +diff --git a/feeds/luci/modules/luci-base/luasrc/http/protocol.luadoc b/feeds/luci/modules/luci-base/luasrc/http/protocol.luadoc +new file mode 100644 +index 0000000..67a60d9 +--- /dev/null ++++ b/feeds/luci/modules/luci-base/luasrc/http/protocol.luadoc +@@ -0,0 +1,142 @@ ++---[[ ++LuCI http protocol class. ++ ++This class contains several functions useful for http message- and content ++decoding and to retrive form data from raw http messages. ++]] ++module "luci.http.protocol" ++ ++---[[ ++Decode an urlencoded string - optionally without decoding ++ ++the "+" sign to " " - and return the decoded string. ++@class function ++@name urldecode ++@param str Input string in x-www-urlencoded format ++@param no_plus Don't decode "+" signs to spaces ++@return The decoded string ++@see urlencode ++]] ++ ++---[[ ++Extract and split urlencoded data pairs, separated bei either "&" or ";" ++ ++from given url or string. Returns a table with urldecoded values. ++Simple parameters are stored as string values associated with the parameter ++name within the table. Parameters with multiple values are stored as array ++containing the corresponding values. ++@class function ++@name urldecode_params ++@param url The url or string which contains x-www-urlencoded form data ++@param tbl Use the given table for storing values (optional) ++@return Table containing the urldecoded parameters ++@see urlencode_params ++]] ++ ++---[[ ++Encode given string to x-www-urlencoded format. ++ ++@class function ++@name urlencode ++@param str String to encode ++@return String containing the encoded data ++@see urldecode ++]] ++ ++---[[ ++Encode each key-value-pair in given table to x-www-urlencoded format, ++ ++separated by "&". Tables are encoded as parameters with multiple values by ++repeating the parameter name with each value. ++@class function ++@name urlencode_params ++@param tbl Table with the values ++@return String containing encoded values ++@see urldecode_params ++]] ++ ++---[[ ++Creates a ltn12 source from the given socket. The source will return it's ++ ++data line by line with the trailing \r\n stripped of. ++@class function ++@name header_source ++@param sock Readable network socket ++@return Ltn12 source function ++]] ++ ++---[[ ++Decode a mime encoded http message body with multipart/form-data ++ ++Content-Type. Stores all extracted data associated with its parameter name ++in the params table withing the given message object. Multiple parameter ++values are stored as tables, ordinary ones as strings. ++If an optional file callback function is given then it is feeded with the ++file contents chunk by chunk and only the extracted file name is stored ++within the params table. The callback function will be called subsequently ++with three arguments: ++ o Table containing decoded (name, file) and raw (headers) mime header data ++ o String value containing a chunk of the file data ++ o Boolean which indicates wheather the current chunk is the last one (eof) ++@class function ++@name mimedecode_message_body ++@param src Ltn12 source function ++@param msg HTTP message object ++@param filecb File callback function (optional) ++@return Value indicating successful operation (not nil means "ok") ++@return String containing the error if unsuccessful ++@see parse_message_header ++]] ++ ++---[[ ++Decode an urlencoded http message body with application/x-www-urlencoded ++ ++Content-Type. Stores all extracted data associated with its parameter name ++in the params table withing the given message object. Multiple parameter ++values are stored as tables, ordinary ones as strings. ++@class function ++@name urldecode_message_body ++@param src Ltn12 source function ++@param msg HTTP message object ++@return Value indicating successful operation (not nil means "ok") ++@return String containing the error if unsuccessful ++@see parse_message_header ++]] ++ ++---[[ ++Try to extract an http message header including information like protocol ++ ++version, message headers and resulting CGI environment variables from the ++given ltn12 source. ++@class function ++@name parse_message_header ++@param src Ltn12 source function ++@return HTTP message object ++@see parse_message_body ++]] ++ ++---[[ ++Try to extract and decode a http message body from the given ltn12 source. ++ ++This function will examine the Content-Type within the given message object ++to select the appropriate content decoder. ++Currently the application/x-www-urlencoded and application/form-data ++mime types are supported. If the encountered content encoding can't be ++handled then the whole message body will be stored unaltered as "content" ++property within the given message object. ++@class function ++@name parse_message_body ++@param src Ltn12 source function ++@param msg HTTP message object ++@param filecb File data callback (optional, see mimedecode_message_body()) ++@return Value indicating successful operation (not nil means "ok") ++@return String containing the error if unsuccessful ++@see parse_message_header ++]] ++ ++---[[ ++Table containing human readable messages for several http status codes. ++ ++@class table ++]] ++ +diff --git a/feeds/luci/modules/luci-base/luasrc/http/protocol/conditionals.lua b/feeds/luci/modules/luci-base/luasrc/http/protocol/conditionals.lua +new file mode 100644 +index 0000000..d31a4e3 +--- /dev/null ++++ b/feeds/luci/modules/luci-base/luasrc/http/protocol/conditionals.lua +@@ -0,0 +1,110 @@ ++-- Copyright 2008 Freifunk Leipzig / Jo-Philipp Wich ++-- Licensed to the public under the Apache License 2.0. ++ ++-- This class provides basic ETag handling and implements most of the ++-- conditional HTTP/1.1 headers specified in RFC2616 Sct. 14.24 - 14.28 . ++module("luci.http.protocol.conditionals", package.seeall) ++ ++local date = require("luci.http.protocol.date") ++ ++ ++function mk_etag( stat ) ++ if stat ~= nil then ++ return string.format( '"%x-%x-%x"', stat.ino, stat.size, stat.mtime ) ++ end ++end ++ ++-- Test whether the given message object contains an "If-Match" header and ++-- compare it against the given stat object. ++function if_match( req, stat ) ++ local h = req.headers ++ local etag = mk_etag( stat ) ++ ++ -- Check for matching resource ++ if type(h['If-Match']) == "string" then ++ for ent in h['If-Match']:gmatch("([^, ]+)") do ++ if ( ent == '*' or ent == etag ) and stat ~= nil then ++ return true ++ end ++ end ++ ++ return false, 412 ++ end ++ ++ return true ++end ++ ++-- Test whether the given message object contains an "If-Modified-Since" header ++-- and compare it against the given stat object. ++function if_modified_since( req, stat ) ++ local h = req.headers ++ ++ -- Compare mtimes ++ if type(h['If-Modified-Since']) == "string" then ++ local since = date.to_unix( h['If-Modified-Since'] ) ++ ++ if stat == nil or since < stat.mtime then ++ return true ++ end ++ ++ return false, 304, { ++ ["ETag"] = mk_etag( stat ); ++ ["Date"] = date.to_http( os.time() ); ++ ["Last-Modified"] = date.to_http( stat.mtime ) ++ } ++ end ++ ++ return true ++end ++ ++-- Test whether the given message object contains an "If-None-Match" header and ++-- compare it against the given stat object. ++function if_none_match( req, stat ) ++ local h = req.headers ++ local etag = mk_etag( stat ) ++ local method = req.env and req.env.REQUEST_METHOD or "GET" ++ ++ -- Check for matching resource ++ if type(h['If-None-Match']) == "string" then ++ for ent in h['If-None-Match']:gmatch("([^, ]+)") do ++ if ( ent == '*' or ent == etag ) and stat ~= nil then ++ if method == "GET" or method == "HEAD" then ++ return false, 304, { ++ ["ETag"] = etag; ++ ["Date"] = date.to_http( os.time() ); ++ ["Last-Modified"] = date.to_http( stat.mtime ) ++ } ++ else ++ return false, 412 ++ end ++ end ++ end ++ end ++ ++ return true ++end ++ ++-- The If-Range header is currently not implemented due to the lack of general ++-- byte range stuff in luci.http.protocol . This function will always return ++-- false, 412 to indicate a failed precondition. ++function if_range( req, stat ) ++ -- Sorry, no subranges (yet) ++ return false, 412 ++end ++ ++-- Test whether the given message object contains an "If-Unmodified-Since" ++-- header and compare it against the given stat object. ++function if_unmodified_since( req, stat ) ++ local h = req.headers ++ ++ -- Compare mtimes ++ if type(h['If-Unmodified-Since']) == "string" then ++ local since = date.to_unix( h['If-Unmodified-Since'] ) ++ ++ if stat ~= nil and since <= stat.mtime then ++ return false, 412 ++ end ++ end ++ ++ return true ++end +diff --git a/feeds/luci/modules/luci-base/luasrc/http/protocol/conditionals.luadoc b/feeds/luci/modules/luci-base/luasrc/http/protocol/conditionals.luadoc +new file mode 100644 +index 0000000..9cfe02d +--- /dev/null ++++ b/feeds/luci/modules/luci-base/luasrc/http/protocol/conditionals.luadoc +@@ -0,0 +1,85 @@ ++---[[ ++LuCI http protocol implementation - HTTP/1.1 bits. ++ ++This class provides basic ETag handling and implements most of the ++conditional HTTP/1.1 headers specified in RFC2616 Sct. 14.24 - 14.28 . ++]] ++module "luci.http.protocol.conditionals" ++ ++---[[ ++Implement 14.19 / ETag. ++ ++@class function ++@name mk_etag ++@param stat A file.stat structure ++@return String containing the generated tag suitable for ETag headers ++]] ++ ++---[[ ++14.24 / If-Match ++ ++Test whether the given message object contains an "If-Match" header and ++compare it against the given stat object. ++@class function ++@name if_match ++@param req HTTP request message object ++@param stat A file.stat object ++@return Boolean indicating whether the precondition is ok ++@return Alternative status code if the precondition failed ++]] ++ ++---[[ ++14.25 / If-Modified-Since ++ ++Test whether the given message object contains an "If-Modified-Since" header ++and compare it against the given stat object. ++@class function ++@name if_modified_since ++@param req HTTP request message object ++@param stat A file.stat object ++@return Boolean indicating whether the precondition is ok ++@return Alternative status code if the precondition failed ++@return Table containing extra HTTP headers if the precondition failed ++]] ++ ++---[[ ++14.26 / If-None-Match ++ ++Test whether the given message object contains an "If-None-Match" header and ++compare it against the given stat object. ++@class function ++@name if_none_match ++@param req HTTP request message object ++@param stat A file.stat object ++@return Boolean indicating whether the precondition is ok ++@return Alternative status code if the precondition failed ++@return Table containing extra HTTP headers if the precondition failed ++]] ++ ++---[[ ++14.27 / If-Range ++ ++The If-Range header is currently not implemented due to the lack of general ++byte range stuff in luci.http.protocol . This function will always return ++false, 412 to indicate a failed precondition. ++@class function ++@name if_range ++@param req HTTP request message object ++@param stat A file.stat object ++@return Boolean indicating whether the precondition is ok ++@return Alternative status code if the precondition failed ++]] ++ ++---[[ ++14.28 / If-Unmodified-Since ++ ++Test whether the given message object contains an "If-Unmodified-Since" ++header and compare it against the given stat object. ++@class function ++@name if_unmodified_since ++@param req HTTP request message object ++@param stat A file.stat object ++@return Boolean indicating whether the precondition is ok ++@return Alternative status code if the precondition failed ++]] ++ +diff --git a/feeds/luci/modules/luci-base/luasrc/http/protocol/date.lua b/feeds/luci/modules/luci-base/luasrc/http/protocol/date.lua +new file mode 100644 +index 0000000..e440219 +--- /dev/null ++++ b/feeds/luci/modules/luci-base/luasrc/http/protocol/date.lua +@@ -0,0 +1,87 @@ ++-- Copyright 2008 Freifunk Leipzig / Jo-Philipp Wich ++-- Licensed to the public under the Apache License 2.0. ++ ++-- This class contains functions to parse, compare and format http dates. ++module("luci.http.protocol.date", package.seeall) ++ ++require("luci.sys.zoneinfo") ++ ++ ++MONTHS = { ++ "Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", ++ "Sep", "Oct", "Nov", "Dec" ++} ++ ++function tz_offset(tz) ++ ++ if type(tz) == "string" then ++ ++ -- check for a numeric identifier ++ local s, v = tz:match("([%+%-])([0-9]+)") ++ if s == '+' then s = 1 else s = -1 end ++ if v then v = tonumber(v) end ++ ++ if s and v then ++ return s * 60 * ( math.floor( v / 100 ) * 60 + ( v % 100 ) ) ++ ++ -- lookup symbolic tz ++ elseif luci.sys.zoneinfo.OFFSET[tz:lower()] then ++ return luci.sys.zoneinfo.OFFSET[tz:lower()] ++ end ++ ++ end ++ ++ -- bad luck ++ return 0 ++end ++ ++function to_unix(date) ++ ++ local wd, day, mon, yr, hr, min, sec, tz = date:match( ++ "([A-Z][a-z][a-z]), ([0-9]+) " .. ++ "([A-Z][a-z][a-z]) ([0-9]+) " .. ++ "([0-9]+):([0-9]+):([0-9]+) " .. ++ "([A-Z0-9%+%-]+)" ++ ) ++ ++ if day and mon and yr and hr and min and sec then ++ -- find month ++ local month = 1 ++ for i = 1, 12 do ++ if MONTHS[i] == mon then ++ month = i ++ break ++ end ++ end ++ ++ -- convert to epoch time ++ return tz_offset(tz) + os.time( { ++ year = yr, ++ month = month, ++ day = day, ++ hour = hr, ++ min = min, ++ sec = sec ++ } ) ++ end ++ ++ return 0 ++end ++ ++function to_http(time) ++ return os.date( "%a, %d %b %Y %H:%M:%S GMT", time ) ++end ++ ++function compare(d1, d2) ++ ++ if d1:match("[^0-9]") then d1 = to_unix(d1) end ++ if d2:match("[^0-9]") then d2 = to_unix(d2) end ++ ++ if d1 == d2 then ++ return 0 ++ elseif d1 < d2 then ++ return -1 ++ else ++ return 1 ++ end ++end +diff --git a/feeds/luci/modules/luci-base/luasrc/http/protocol/date.luadoc b/feeds/luci/modules/luci-base/luasrc/http/protocol/date.luadoc +new file mode 100644 +index 0000000..d6f1c8d +--- /dev/null ++++ b/feeds/luci/modules/luci-base/luasrc/http/protocol/date.luadoc +@@ -0,0 +1,46 @@ ++---[[ ++LuCI http protocol implementation - date helper class. ++ ++This class contains functions to parse, compare and format http dates. ++]] ++module "luci.http.protocol.date" ++ ++---[[ ++Return the time offset in seconds between the UTC and given time zone. ++ ++@class function ++@name tz_offset ++@param tz Symbolic or numeric timezone specifier ++@return Time offset to UTC in seconds ++]] ++ ++---[[ ++Parse given HTTP date string and convert it to unix epoch time. ++ ++@class function ++@name to_unix ++@param data String containing the date ++@return Unix epoch time ++]] ++ ++---[[ ++Convert the given unix epoch time to valid HTTP date string. ++ ++@class function ++@name to_http ++@param time Unix epoch time ++@return String containing the formatted date ++]] ++ ++---[[ ++Compare two dates which can either be unix epoch times or HTTP date strings. ++ ++@class function ++@name compare ++@param d1 The first date or epoch time to compare ++@param d2 The first date or epoch time to compare ++@return -1 - if d1 is lower then d2 ++@return 0 - if both dates are equal ++@return 1 - if d1 is higher then d2 ++]] ++ +diff --git a/feeds/luci/modules/luci-base/luasrc/http/protocol/mime.lua b/feeds/luci/modules/luci-base/luasrc/http/protocol/mime.lua +new file mode 100644 +index 0000000..2b99d8e +--- /dev/null ++++ b/feeds/luci/modules/luci-base/luasrc/http/protocol/mime.lua +@@ -0,0 +1,78 @@ ++-- Copyright 2008 Freifunk Leipzig / Jo-Philipp Wich ++-- Licensed to the public under the Apache License 2.0. ++ ++-- This class provides functions to guess mime types from file extensions and ++-- vice versa. ++module("luci.http.protocol.mime", package.seeall) ++ ++require("luci.util") ++ ++MIME_TYPES = { ++ ["txt"] = "text/plain"; ++ ["js"] = "text/javascript"; ++ ["css"] = "text/css"; ++ ["htm"] = "text/html"; ++ ["html"] = "text/html"; ++ ["patch"] = "text/x-patch"; ++ ["c"] = "text/x-csrc"; ++ ["h"] = "text/x-chdr"; ++ ["o"] = "text/x-object"; ++ ["ko"] = "text/x-object"; ++ ++ ["bmp"] = "image/bmp"; ++ ["gif"] = "image/gif"; ++ ["png"] = "image/png"; ++ ["jpg"] = "image/jpeg"; ++ ["jpeg"] = "image/jpeg"; ++ ["svg"] = "image/svg+xml"; ++ ++ ["zip"] = "application/zip"; ++ ["pdf"] = "application/pdf"; ++ ["xml"] = "application/xml"; ++ ["xsl"] = "application/xml"; ++ ["doc"] = "application/msword"; ++ ["ppt"] = "application/vnd.ms-powerpoint"; ++ ["xls"] = "application/vnd.ms-excel"; ++ ["odt"] = "application/vnd.oasis.opendocument.text"; ++ ["odp"] = "application/vnd.oasis.opendocument.presentation"; ++ ["pl"] = "application/x-perl"; ++ ["sh"] = "application/x-shellscript"; ++ ["php"] = "application/x-php"; ++ ["deb"] = "application/x-deb"; ++ ["iso"] = "application/x-cd-image"; ++ ["tgz"] = "application/x-compressed-tar"; ++ ++ ["mp3"] = "audio/mpeg"; ++ ["ogg"] = "audio/x-vorbis+ogg"; ++ ["wav"] = "audio/x-wav"; ++ ++ ["mpg"] = "video/mpeg"; ++ ["mpeg"] = "video/mpeg"; ++ ["avi"] = "video/x-msvideo"; ++} ++ ++-- "application/octet-stream" if the extension is unknown. ++function to_mime(filename) ++ if type(filename) == "string" then ++ local ext = filename:match("[^%.]+$") ++ ++ if ext and MIME_TYPES[ext:lower()] then ++ return MIME_TYPES[ext:lower()] ++ end ++ end ++ ++ return "application/octet-stream" ++end ++ ++-- given mime-type is unknown. ++function to_ext(mimetype) ++ if type(mimetype) == "string" then ++ for ext, type in luci.util.kspairs( MIME_TYPES ) do ++ if type == mimetype then ++ return ext ++ end ++ end ++ end ++ ++ return nil ++end +diff --git a/feeds/luci/modules/luci-base/luasrc/http/protocol/mime.luadoc b/feeds/luci/modules/luci-base/luasrc/http/protocol/mime.luadoc +new file mode 100644 +index 0000000..195b5fc +--- /dev/null ++++ b/feeds/luci/modules/luci-base/luasrc/http/protocol/mime.luadoc +@@ -0,0 +1,34 @@ ++---[[ ++LuCI http protocol implementation - mime helper class. ++ ++This class provides functions to guess mime types from file extensions and ++vice versa. ++]] ++module "luci.http.protocol.mime" ++ ++---[[ ++MIME mapping table containg extension - mimetype relations. ++ ++@class table ++]] ++ ++---[[ ++Extract extension from a filename and return corresponding mime-type or ++ ++"application/octet-stream" if the extension is unknown. ++@class function ++@name to_mime ++@param filename The filename for which the mime type is guessed ++@return String containign the determined mime type ++]] ++ ++---[[ ++Return corresponding extension for a given mime type or nil if the ++ ++given mime-type is unknown. ++@class function ++@name to_ext ++@param mimetype The mimetype to retrieve the extension from ++@return String with the extension or nil for unknown type ++]] ++ +diff --git a/feeds/luci/modules/luci-base/luasrc/i18n.lua b/feeds/luci/modules/luci-base/luasrc/i18n.lua +new file mode 100644 +index 0000000..bcb16d5 +--- /dev/null ++++ b/feeds/luci/modules/luci-base/luasrc/i18n.lua +@@ -0,0 +1,55 @@ ++-- Copyright 2008 Steven Barth ++-- Licensed to the public under the Apache License 2.0. ++ ++module("luci.i18n", package.seeall) ++require("luci.util") ++ ++local tparser = require "luci.template.parser" ++ ++table = {} ++i18ndir = luci.util.libpath() .. "/i18n/" ++loaded = {} ++context = luci.util.threadlocal() ++default = "en" ++ ++function clear() ++end ++ ++function load(file, lang, force) ++end ++ ++-- Alternatively load the translation of the fallback language. ++function loadc(file, force) ++end ++ ++function setlanguage(lang) ++ context.lang = lang:gsub("_", "-") ++ context.parent = (context.lang:match("^([a-z][a-z])_")) ++ if not tparser.load_catalog(context.lang, i18ndir) then ++ if context.parent then ++ tparser.load_catalog(context.parent, i18ndir) ++ return context.parent ++ end ++ end ++ return context.lang ++end ++ ++function translate(key) ++ return tparser.translate(key) or key ++end ++ ++function translatef(key, ...) ++ return tostring(translate(key)):format(...) ++end ++ ++-- and ensure that the returned value is a Lua string value. ++-- This is the same as calling tostring(translate(...)) ++function string(key) ++ return tostring(translate(key)) ++end ++ ++-- Ensure that the returned value is a Lua string value. ++-- This is the same as calling tostring(translatef(...)) ++function stringf(key, ...) ++ return tostring(translate(key)):format(...) ++end +diff --git a/feeds/luci/modules/luci-base/luasrc/i18n.luadoc b/feeds/luci/modules/luci-base/luasrc/i18n.luadoc +new file mode 100644 +index 0000000..aa38841 +--- /dev/null ++++ b/feeds/luci/modules/luci-base/luasrc/i18n.luadoc +@@ -0,0 +1,84 @@ ++---[[ ++LuCI translation library. ++]] ++module "luci.i18n" ++ ++---[[ ++Clear the translation table. ++ ++ ++@class function ++@name clear ++]] ++ ++---[[ ++Load a translation and copy its data into the translation table. ++ ++@class function ++@name load ++@param file Language file ++@param lang Two-letter language code ++@param force Force reload even if already loaded (optional) ++@return Success status ++]] ++ ++---[[ ++Load a translation file using the default translation language. ++ ++Alternatively load the translation of the fallback language. ++@class function ++@name loadc ++@param file Language file ++@param force Force reload even if already loaded (optional) ++]] ++ ++---[[ ++Set the context default translation language. ++ ++@class function ++@name setlanguage ++@param lang Two-letter language code ++]] ++ ++---[[ ++Return the translated value for a specific translation key. ++ ++@class function ++@name translate ++@param key Default translation text ++@return Translated string ++]] ++ ++---[[ ++Return the translated value for a specific translation key and use it as sprintf pattern. ++ ++@class function ++@name translatef ++@param key Default translation text ++@param ... Format parameters ++@return Translated and formatted string ++]] ++ ++---[[ ++Return the translated value for a specific translation key ++ ++and ensure that the returned value is a Lua string value. ++This is the same as calling tostring(translate(...)) ++@class function ++@name string ++@param key Default translation text ++@return Translated string ++]] ++ ++---[[ ++Return the translated value for a specific translation key and use it as sprintf pattern. ++ ++Ensure that the returned value is a Lua string value. ++This is the same as calling tostring(translatef(...)) ++@class function ++@name stringf ++@param key Default translation text ++@param ... Format parameters ++@return Translated and formatted string ++]] ++ +diff --git a/feeds/luci/modules/luci-base/luasrc/ltn12.lua b/feeds/luci/modules/luci-base/luasrc/ltn12.lua +new file mode 100644 +index 0000000..3a7268c +--- /dev/null ++++ b/feeds/luci/modules/luci-base/luasrc/ltn12.lua +@@ -0,0 +1,316 @@ ++--[[ ++LuaSocket 2.0.2 license ++Copyright � 2004-2007 Diego Nehab ++ ++Permission is hereby granted, free of charge, to any person obtaining a ++copy of this software and associated documentation files (the "Software"), ++to deal in the Software without restriction, including without limitation ++the rights to use, copy, modify, merge, publish, distribute, sublicense, ++and/or sell copies of the Software, and to permit persons to whom the ++Software is furnished to do so, subject to the following conditions: ++ ++The above copyright notice and this permission notice shall be included in ++all copies or substantial portions of the Software. ++ ++THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR ++IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, ++FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE ++AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER ++LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING ++FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER ++DEALINGS IN THE SOFTWARE. ++]]-- ++--[[ ++ Changes made by LuCI project: ++ * Renamed to luci.ltn12 to avoid collisions with luasocket ++ * Added inline documentation ++]]-- ++----------------------------------------------------------------------------- ++-- LTN12 - Filters, sources, sinks and pumps. ++-- LuaSocket toolkit. ++-- Author: Diego Nehab ++-- RCS ID: $Id$ ++----------------------------------------------------------------------------- ++ ++----------------------------------------------------------------------------- ++-- Declare module ++----------------------------------------------------------------------------- ++local string = require("string") ++local table = require("table") ++local base = _G ++ ++-- See http://lua-users.org/wiki/FiltersSourcesAndSinks for design concepts ++module("luci.ltn12") ++ ++filter = {} ++source = {} ++sink = {} ++pump = {} ++ ++-- 2048 seems to be better in windows... ++BLOCKSIZE = 2048 ++_VERSION = "LTN12 1.0.1" ++ ++----------------------------------------------------------------------------- ++-- Filter stuff ++----------------------------------------------------------------------------- ++ ++ ++-- by passing it each chunk and updating a context between calls. ++function filter.cycle(low, ctx, extra) ++ base.assert(low) ++ return function(chunk) ++ local ret ++ ret, ctx = low(ctx, chunk, extra) ++ return ret ++ end ++end ++ ++-- (thanks to Wim Couwenberg) ++function filter.chain(...) ++ local n = table.getn(arg) ++ local top, index = 1, 1 ++ local retry = "" ++ return function(chunk) ++ retry = chunk and retry ++ while true do ++ if index == top then ++ chunk = arg[index](chunk) ++ if chunk == "" or top == n then return chunk ++ elseif chunk then index = index + 1 ++ else ++ top = top+1 ++ index = top ++ end ++ else ++ chunk = arg[index](chunk or "") ++ if chunk == "" then ++ index = index - 1 ++ chunk = retry ++ elseif chunk then ++ if index == n then return chunk ++ else index = index + 1 end ++ else base.error("filter returned inappropriate nil") end ++ end ++ end ++ end ++end ++ ++----------------------------------------------------------------------------- ++-- Source stuff ++----------------------------------------------------------------------------- ++ ++ ++-- create an empty source ++local function empty() ++ return nil ++end ++ ++function source.empty() ++ return empty ++end ++ ++function source.error(err) ++ return function() ++ return nil, err ++ end ++end ++ ++function source.file(handle, io_err) ++ if handle then ++ return function() ++ local chunk = handle:read(BLOCKSIZE) ++ if chunk and chunk:len() == 0 then chunk = nil end ++ if not chunk then handle:close() end ++ return chunk ++ end ++ else return source.error(io_err or "unable to open file") end ++end ++ ++function source.simplify(src) ++ base.assert(src) ++ return function() ++ local chunk, err_or_new = src() ++ src = err_or_new or src ++ if not chunk then return nil, err_or_new ++ else return chunk end ++ end ++end ++ ++function source.string(s) ++ if s then ++ local i = 1 ++ return function() ++ local chunk = string.sub(s, i, i+BLOCKSIZE-1) ++ i = i + BLOCKSIZE ++ if chunk ~= "" then return chunk ++ else return nil end ++ end ++ else return source.empty() end ++end ++ ++function source.rewind(src) ++ base.assert(src) ++ local t = {} ++ return function(chunk) ++ if not chunk then ++ chunk = table.remove(t) ++ if not chunk then return src() ++ else return chunk end ++ else ++ t[#t+1] = chunk ++ end ++ end ++end ++ ++function source.chain(src, f) ++ base.assert(src and f) ++ local last_in, last_out = "", "" ++ local state = "feeding" ++ local err ++ return function() ++ if not last_out then ++ base.error('source is empty!', 2) ++ end ++ while true do ++ if state == "feeding" then ++ last_in, err = src() ++ if err then return nil, err end ++ last_out = f(last_in) ++ if not last_out then ++ if last_in then ++ base.error('filter returned inappropriate nil') ++ else ++ return nil ++ end ++ elseif last_out ~= "" then ++ state = "eating" ++ if last_in then last_in = "" end ++ return last_out ++ end ++ else ++ last_out = f(last_in) ++ if last_out == "" then ++ if last_in == "" then ++ state = "feeding" ++ else ++ base.error('filter returned ""') ++ end ++ elseif not last_out then ++ if last_in then ++ base.error('filter returned inappropriate nil') ++ else ++ return nil ++ end ++ else ++ return last_out ++ end ++ end ++ end ++ end ++end ++ ++-- Sources will be used one after the other, as if they were concatenated ++-- (thanks to Wim Couwenberg) ++function source.cat(...) ++ local src = table.remove(arg, 1) ++ return function() ++ while src do ++ local chunk, err = src() ++ if chunk then return chunk end ++ if err then return nil, err end ++ src = table.remove(arg, 1) ++ end ++ end ++end ++ ++----------------------------------------------------------------------------- ++-- Sink stuff ++----------------------------------------------------------------------------- ++ ++ ++function sink.table(t) ++ t = t or {} ++ local f = function(chunk, err) ++ if chunk then t[#t+1] = chunk end ++ return 1 ++ end ++ return f, t ++end ++ ++function sink.simplify(snk) ++ base.assert(snk) ++ return function(chunk, err) ++ local ret, err_or_new = snk(chunk, err) ++ if not ret then return nil, err_or_new end ++ snk = err_or_new or snk ++ return 1 ++ end ++end ++ ++function sink.file(handle, io_err) ++ if handle then ++ return function(chunk, err) ++ if not chunk then ++ handle:close() ++ return 1 ++ else return handle:write(chunk) end ++ end ++ else return sink.error(io_err or "unable to open file") end ++end ++ ++-- creates a sink that discards data ++local function null() ++ return 1 ++end ++ ++function sink.null() ++ return null ++end ++ ++function sink.error(err) ++ return function() ++ return nil, err ++ end ++end ++ ++function sink.chain(f, snk) ++ base.assert(f and snk) ++ return function(chunk, err) ++ if chunk ~= "" then ++ local filtered = f(chunk) ++ local done = chunk and "" ++ while true do ++ local ret, snkerr = snk(filtered, err) ++ if not ret then return nil, snkerr end ++ if filtered == done then return 1 end ++ filtered = f(done) ++ end ++ else return 1 end ++ end ++end ++ ++----------------------------------------------------------------------------- ++-- Pump stuff ++----------------------------------------------------------------------------- ++ ++ ++function pump.step(src, snk) ++ local chunk, src_err = src() ++ local ret, snk_err = snk(chunk, src_err) ++ if chunk and ret then return 1 ++ else return nil, src_err or snk_err end ++end ++ ++function pump.all(src, snk, step) ++ base.assert(src and snk) ++ step = step or pump.step ++ while true do ++ local ret, err = step(src, snk) ++ if not ret then ++ if err then return nil, err ++ else return 1 end ++ end ++ end ++end ++ +diff --git a/feeds/luci/modules/luci-base/luasrc/model/cbi/admin_network/proto_dhcp.lua b/feeds/luci/modules/luci-base/luasrc/model/cbi/admin_network/proto_dhcp.lua +new file mode 100644 +index 0000000..dc702e4 +--- /dev/null ++++ b/feeds/luci/modules/luci-base/luasrc/model/cbi/admin_network/proto_dhcp.lua +@@ -0,0 +1,67 @@ ++-- Copyright 2011-2012 Jo-Philipp Wich ++-- Licensed to the public under the Apache License 2.0. ++ ++local map, section, net = ... ++local ifc = net:get_interface() ++ ++local hostname, accept_ra, send_rs ++local bcast, defaultroute, peerdns, dns, metric, clientid, vendorclass ++ ++ ++hostname = section:taboption("general", Value, "hostname", ++ translate("Hostname to send when requesting DHCP")) ++ ++hostname.placeholder = luci.sys.hostname() ++hostname.datatype = "hostname" ++ ++ ++bcast = section:taboption("advanced", Flag, "broadcast", ++ translate("Use broadcast flag"), ++ translate("Required for certain ISPs, e.g. Charter with DOCSIS 3")) ++ ++bcast.default = bcast.disabled ++ ++ ++defaultroute = section:taboption("advanced", Flag, "defaultroute", ++ translate("Use default gateway"), ++ translate("If unchecked, no default route is configured")) ++ ++defaultroute.default = defaultroute.enabled ++ ++ ++peerdns = section:taboption("advanced", Flag, "peerdns", ++ translate("Use DNS servers advertised by peer"), ++ translate("If unchecked, the advertised DNS server addresses are ignored")) ++ ++peerdns.default = peerdns.enabled ++ ++ ++dns = section:taboption("advanced", DynamicList, "dns", ++ translate("Use custom DNS servers")) ++ ++dns:depends("peerdns", "") ++dns.datatype = "ipaddr" ++dns.cast = "string" ++ ++ ++metric = section:taboption("advanced", Value, "metric", ++ translate("Use gateway metric")) ++ ++metric.placeholder = "0" ++metric.datatype = "uinteger" ++ ++ ++clientid = section:taboption("advanced", Value, "clientid", ++ translate("Client ID to send when requesting DHCP")) ++ ++ ++vendorclass = section:taboption("advanced", Value, "vendorid", ++ translate("Vendor Class to send when requesting DHCP")) ++ ++ ++luci.tools.proto.opt_macaddr(section, ifc, translate("Override MAC address")) ++ ++ ++mtu = section:taboption("advanced", Value, "mtu", translate("Override MTU")) ++mtu.placeholder = "1500" ++mtu.datatype = "max(9200)" +diff --git a/feeds/luci/modules/luci-base/luasrc/model/cbi/admin_network/proto_none.lua b/feeds/luci/modules/luci-base/luasrc/model/cbi/admin_network/proto_none.lua +new file mode 100644 +index 0000000..6fdded9 +--- /dev/null ++++ b/feeds/luci/modules/luci-base/luasrc/model/cbi/admin_network/proto_none.lua +@@ -0,0 +1,4 @@ ++-- Copyright 2011 Jo-Philipp Wich ++-- Licensed to the public under the Apache License 2.0. ++ ++local map, section, net = ... +diff --git a/feeds/luci/modules/luci-base/luasrc/model/cbi/admin_network/proto_static.lua b/feeds/luci/modules/luci-base/luasrc/model/cbi/admin_network/proto_static.lua +new file mode 100644 +index 0000000..f49fed4 +--- /dev/null ++++ b/feeds/luci/modules/luci-base/luasrc/model/cbi/admin_network/proto_static.lua +@@ -0,0 +1,81 @@ ++-- Copyright 2011 Jo-Philipp Wich ++-- Licensed to the public under the Apache License 2.0. ++ ++local map, section, net = ... ++local ifc = net:get_interface() ++ ++local ipaddr, netmask, gateway, broadcast, dns, accept_ra, send_rs, ip6addr, ip6gw ++local mtu, metric ++ ++ ++ipaddr = section:taboption("general", Value, "ipaddr", translate("IPv4 address")) ++ipaddr.datatype = "ip4addr" ++ ++ ++netmask = section:taboption("general", Value, "netmask", ++ translate("IPv4 netmask")) ++ ++netmask.datatype = "ip4addr" ++netmask:value("255.255.255.0") ++netmask:value("255.255.0.0") ++netmask:value("255.0.0.0") ++ ++ ++gateway = section:taboption("general", Value, "gateway", translate("IPv4 gateway")) ++gateway.datatype = "ip4addr" ++ ++ ++broadcast = section:taboption("general", Value, "broadcast", translate("IPv4 broadcast")) ++broadcast.datatype = "ip4addr" ++ ++ ++dns = section:taboption("general", DynamicList, "dns", ++ translate("Use custom DNS servers")) ++ ++dns.datatype = "ipaddr" ++dns.cast = "string" ++ ++ ++if luci.model.network:has_ipv6() then ++ ++ local ip6assign = section:taboption("general", Value, "ip6assign", translate("IPv6 assignment length"), ++ translate("Assign a part of given length of every public IPv6-prefix to this interface")) ++ ip6assign:value("", translate("disabled")) ++ ip6assign:value("64") ++ ip6assign.datatype = "max(64)" ++ ++ local ip6hint = section:taboption("general", Value, "ip6hint", translate("IPv6 assignment hint"), ++ translate("Assign prefix parts using this hexadecimal subprefix ID for this interface.")) ++ for i=33,64 do ip6hint:depends("ip6assign", i) end ++ ++ ip6addr = section:taboption("general", Value, "ip6addr", translate("IPv6 address")) ++ ip6addr.datatype = "ip6addr" ++ ip6addr:depends("ip6assign", "") ++ ++ ++ ip6gw = section:taboption("general", Value, "ip6gw", translate("IPv6 gateway")) ++ ip6gw.datatype = "ip6addr" ++ ip6gw:depends("ip6assign", "") ++ ++ ++ local ip6prefix = s:taboption("general", Value, "ip6prefix", translate("IPv6 routed prefix"), ++ translate("Public prefix routed to this device for distribution to clients.")) ++ ip6prefix.datatype = "ip6addr" ++ ip6prefix:depends("ip6assign", "") ++ ++end ++ ++ ++luci.tools.proto.opt_macaddr(section, ifc, translate("Override MAC address")) ++ ++ ++mtu = section:taboption("advanced", Value, "mtu", translate("Override MTU")) ++mtu.placeholder = "1500" ++mtu.datatype = "max(9200)" ++ ++ ++metric = section:taboption("advanced", Value, "metric", ++ translate("Use gateway metric")) ++ ++metric.placeholder = "0" ++metric.datatype = "uinteger" +diff --git a/feeds/luci/modules/luci-base/luasrc/model/firewall.lua b/feeds/luci/modules/luci-base/luasrc/model/firewall.lua +new file mode 100644 +index 0000000..5573a9b +--- /dev/null ++++ b/feeds/luci/modules/luci-base/luasrc/model/firewall.lua +@@ -0,0 +1,566 @@ ++-- Copyright 2009 Jo-Philipp Wich ++-- Licensed to the public under the Apache License 2.0. ++ ++local type, pairs, ipairs, table, luci, math ++ = type, pairs, ipairs, table, luci, math ++ ++local tpl = require "luci.template.parser" ++local utl = require "luci.util" ++local uci = require "luci.model.uci" ++ ++module "luci.model.firewall" ++ ++ ++local uci_r, uci_s ++ ++function _valid_id(x) ++ return (x and #x > 0 and x:match("^[a-zA-Z0-9_]+$")) ++end ++ ++function _get(c, s, o) ++ return uci_r:get(c, s, o) ++end ++ ++function _set(c, s, o, v) ++ if v ~= nil then ++ if type(v) == "boolean" then v = v and "1" or "0" end ++ return uci_r:set(c, s, o, v) ++ else ++ return uci_r:delete(c, s, o) ++ end ++end ++ ++ ++function init(cursor) ++ uci_r = cursor or uci_r or uci.cursor() ++ uci_s = uci_r:substate() ++ ++ return _M ++end ++ ++function save(self, ...) ++ uci_r:save(...) ++ uci_r:load(...) ++end ++ ++function commit(self, ...) ++ uci_r:commit(...) ++ uci_r:load(...) ++end ++ ++function get_defaults() ++ return defaults() ++end ++ ++function new_zone(self) ++ local name = "newzone" ++ local count = 1 ++ ++ while self:get_zone(name) do ++ count = count + 1 ++ name = "newzone%d" % count ++ end ++ ++ return self:add_zone(name) ++end ++ ++function add_zone(self, n) ++ if _valid_id(n) and not self:get_zone(n) then ++ local d = defaults() ++ local z = uci_r:section("firewall", "zone", nil, { ++ name = n, ++ network = " ", ++ input = d:input() or "DROP", ++ forward = d:forward() or "DROP", ++ output = d:output() or "DROP" ++ }) ++ ++ return z and zone(z) ++ end ++end ++ ++function get_zone(self, n) ++ if uci_r:get("firewall", n) == "zone" then ++ return zone(n) ++ else ++ local z ++ uci_r:foreach("firewall", "zone", ++ function(s) ++ if n and s.name == n then ++ z = s['.name'] ++ return false ++ end ++ end) ++ return z and zone(z) ++ end ++end ++ ++function get_zones(self) ++ local zones = { } ++ local znl = { } ++ ++ uci_r:foreach("firewall", "zone", ++ function(s) ++ if s.name then ++ znl[s.name] = zone(s['.name']) ++ end ++ end) ++ ++ local z ++ for z in utl.kspairs(znl) do ++ zones[#zones+1] = znl[z] ++ end ++ ++ return zones ++end ++ ++function get_zone_by_network(self, net) ++ local z ++ ++ uci_r:foreach("firewall", "zone", ++ function(s) ++ if s.name and net then ++ local n ++ for n in utl.imatch(s.network or s.name) do ++ if n == net then ++ z = s['.name'] ++ return false ++ end ++ end ++ end ++ end) ++ ++ return z and zone(z) ++end ++ ++function del_zone(self, n) ++ local r = false ++ ++ if uci_r:get("firewall", n) == "zone" then ++ local z = uci_r:get("firewall", n, "name") ++ r = uci_r:delete("firewall", n) ++ n = z ++ else ++ uci_r:foreach("firewall", "zone", ++ function(s) ++ if n and s.name == n then ++ r = uci_r:delete("firewall", s['.name']) ++ return false ++ end ++ end) ++ end ++ ++ if r then ++ uci_r:foreach("firewall", "rule", ++ function(s) ++ if s.src == n or s.dest == n then ++ uci_r:delete("firewall", s['.name']) ++ end ++ end) ++ ++ uci_r:foreach("firewall", "redirect", ++ function(s) ++ if s.src == n or s.dest == n then ++ uci_r:delete("firewall", s['.name']) ++ end ++ end) ++ ++ uci_r:foreach("firewall", "forwarding", ++ function(s) ++ if s.src == n or s.dest == n then ++ uci_r:delete("firewall", s['.name']) ++ end ++ end) ++ end ++ ++ return r ++end ++ ++function rename_zone(self, old, new) ++ local r = false ++ ++ if _valid_id(new) and not self:get_zone(new) then ++ uci_r:foreach("firewall", "zone", ++ function(s) ++ if old and s.name == old then ++ if not s.network then ++ uci_r:set("firewall", s['.name'], "network", old) ++ end ++ uci_r:set("firewall", s['.name'], "name", new) ++ r = true ++ return false ++ end ++ end) ++ ++ if r then ++ uci_r:foreach("firewall", "rule", ++ function(s) ++ if s.src == old then ++ uci_r:set("firewall", s['.name'], "src", new) ++ end ++ if s.dest == old then ++ uci_r:set("firewall", s['.name'], "dest", new) ++ end ++ end) ++ ++ uci_r:foreach("firewall", "redirect", ++ function(s) ++ if s.src == old then ++ uci_r:set("firewall", s['.name'], "src", new) ++ end ++ if s.dest == old then ++ uci_r:set("firewall", s['.name'], "dest", new) ++ end ++ end) ++ ++ uci_r:foreach("firewall", "forwarding", ++ function(s) ++ if s.src == old then ++ uci_r:set("firewall", s['.name'], "src", new) ++ end ++ if s.dest == old then ++ uci_r:set("firewall", s['.name'], "dest", new) ++ end ++ end) ++ end ++ end ++ ++ return r ++end ++ ++function del_network(self, net) ++ local z ++ if net then ++ for _, z in ipairs(self:get_zones()) do ++ z:del_network(net) ++ end ++ end ++end ++ ++ ++defaults = utl.class() ++function defaults.__init__(self) ++ uci_r:foreach("firewall", "defaults", ++ function(s) ++ self.sid = s['.name'] ++ return false ++ end) ++ ++ self.sid = self.sid or uci_r:section("firewall", "defaults", nil, { }) ++end ++ ++function defaults.get(self, opt) ++ return _get("firewall", self.sid, opt) ++end ++ ++function defaults.set(self, opt, val) ++ return _set("firewall", self.sid, opt, val) ++end ++ ++function defaults.syn_flood(self) ++ return (self:get("syn_flood") == "1") ++end ++ ++function defaults.drop_invalid(self) ++ return (self:get("drop_invalid") == "1") ++end ++ ++function defaults.input(self) ++ return self:get("input") or "DROP" ++end ++ ++function defaults.forward(self) ++ return self:get("forward") or "DROP" ++end ++ ++function defaults.output(self) ++ return self:get("output") or "DROP" ++end ++ ++ ++zone = utl.class() ++function zone.__init__(self, z) ++ if uci_r:get("firewall", z) == "zone" then ++ self.sid = z ++ self.data = uci_r:get_all("firewall", z) ++ else ++ uci_r:foreach("firewall", "zone", ++ function(s) ++ if s.name == z then ++ self.sid = s['.name'] ++ self.data = s ++ return false ++ end ++ end) ++ end ++end ++ ++function zone.get(self, opt) ++ return _get("firewall", self.sid, opt) ++end ++ ++function zone.set(self, opt, val) ++ return _set("firewall", self.sid, opt, val) ++end ++ ++function zone.masq(self) ++ return (self:get("masq") == "1") ++end ++ ++function zone.name(self) ++ return self:get("name") ++end ++ ++function zone.network(self) ++ return self:get("network") ++end ++ ++function zone.input(self) ++ return self:get("input") or defaults():input() or "DROP" ++end ++ ++function zone.forward(self) ++ return self:get("forward") or defaults():forward() or "DROP" ++end ++ ++function zone.output(self) ++ return self:get("output") or defaults():output() or "DROP" ++end ++ ++function zone.add_network(self, net) ++ if uci_r:get("network", net) == "interface" then ++ local nets = { } ++ ++ local n ++ for n in utl.imatch(self:get("network") or self:get("name")) do ++ if n ~= net then ++ nets[#nets+1] = n ++ end ++ end ++ ++ nets[#nets+1] = net ++ ++ _M:del_network(net) ++ self:set("network", table.concat(nets, " ")) ++ end ++end ++ ++function zone.del_network(self, net) ++ local nets = { } ++ ++ local n ++ for n in utl.imatch(self:get("network") or self:get("name")) do ++ if n ~= net then ++ nets[#nets+1] = n ++ end ++ end ++ ++ if #nets > 0 then ++ self:set("network", table.concat(nets, " ")) ++ else ++ self:set("network", " ") ++ end ++end ++ ++function zone.get_networks(self) ++ local nets = { } ++ ++ local n ++ for n in utl.imatch(self:get("network") or self:get("name")) do ++ nets[#nets+1] = n ++ end ++ ++ return nets ++end ++ ++function zone.clear_networks(self) ++ self:set("network", " ") ++end ++ ++function zone.get_forwardings_by(self, what) ++ local name = self:name() ++ local forwards = { } ++ ++ uci_r:foreach("firewall", "forwarding", ++ function(s) ++ if s.src and s.dest and s[what] == name then ++ forwards[#forwards+1] = forwarding(s['.name']) ++ end ++ end) ++ ++ return forwards ++end ++ ++function zone.add_forwarding_to(self, dest) ++ local exist, forward ++ ++ for _, forward in ipairs(self:get_forwardings_by('src')) do ++ if forward:dest() == dest then ++ exist = true ++ break ++ end ++ end ++ ++ if not exist and dest ~= self:name() and _valid_id(dest) then ++ local s = uci_r:section("firewall", "forwarding", nil, { ++ src = self:name(), ++ dest = dest ++ }) ++ ++ return s and forwarding(s) ++ end ++end ++ ++function zone.add_forwarding_from(self, src) ++ local exist, forward ++ ++ for _, forward in ipairs(self:get_forwardings_by('dest')) do ++ if forward:src() == src then ++ exist = true ++ break ++ end ++ end ++ ++ if not exist and src ~= self:name() and _valid_id(src) then ++ local s = uci_r:section("firewall", "forwarding", nil, { ++ src = src, ++ dest = self:name() ++ }) ++ ++ return s and forwarding(s) ++ end ++end ++ ++function zone.del_forwardings_by(self, what) ++ local name = self:name() ++ ++ uci_r:delete_all("firewall", "forwarding", ++ function(s) ++ return (s.src and s.dest and s[what] == name) ++ end) ++end ++ ++function zone.add_redirect(self, options) ++ options = options or { } ++ options.src = self:name() ++ ++ local s = uci_r:section("firewall", "redirect", nil, options) ++ return s and redirect(s) ++end ++ ++function zone.add_rule(self, options) ++ options = options or { } ++ options.src = self:name() ++ ++ local s = uci_r:section("firewall", "rule", nil, options) ++ return s and rule(s) ++end ++ ++function zone.get_color(self) ++ if self and self:name() == "lan" then ++ return "#90f090" ++ elseif self and self:name() == "wan" then ++ return "#f09090" ++ elseif self then ++ math.randomseed(tpl.hash(self:name())) ++ ++ local r = math.random(128) ++ local g = math.random(128) ++ local min = 0 ++ local max = 128 ++ ++ if ( r + g ) < 128 then ++ min = 128 - r - g ++ else ++ max = 255 - r - g ++ end ++ ++ local b = min + math.floor( math.random() * ( max - min ) ) ++ ++ return "#%02x%02x%02x" % { 0xFF - r, 0xFF - g, 0xFF - b } ++ else ++ return "#eeeeee" ++ end ++end ++ ++ ++forwarding = utl.class() ++function forwarding.__init__(self, f) ++ self.sid = f ++end ++ ++function forwarding.src(self) ++ return uci_r:get("firewall", self.sid, "src") ++end ++ ++function forwarding.dest(self) ++ return uci_r:get("firewall", self.sid, "dest") ++end ++ ++function forwarding.src_zone(self) ++ return zone(self:src()) ++end ++ ++function forwarding.dest_zone(self) ++ return zone(self:dest()) ++end ++ ++ ++rule = utl.class() ++function rule.__init__(self, f) ++ self.sid = f ++end ++ ++function rule.get(self, opt) ++ return _get("firewall", self.sid, opt) ++end ++ ++function rule.set(self, opt, val) ++ return _set("firewall", self.sid, opt, val) ++end ++ ++function rule.src(self) ++ return uci_r:get("firewall", self.sid, "src") ++end ++ ++function rule.dest(self) ++ return uci_r:get("firewall", self.sid, "dest") ++end ++ ++function rule.src_zone(self) ++ return zone(self:src()) ++end ++ ++function rule.dest_zone(self) ++ return zone(self:dest()) ++end ++ ++ ++redirect = utl.class() ++function redirect.__init__(self, f) ++ self.sid = f ++end ++ ++function redirect.get(self, opt) ++ return _get("firewall", self.sid, opt) ++end ++ ++function redirect.set(self, opt, val) ++ return _set("firewall", self.sid, opt, val) ++end ++ ++function redirect.src(self) ++ return uci_r:get("firewall", self.sid, "src") ++end ++ ++function redirect.dest(self) ++ return uci_r:get("firewall", self.sid, "dest") ++end ++ ++function redirect.src_zone(self) ++ return zone(self:src()) ++end ++ ++function redirect.dest_zone(self) ++ return zone(self:dest()) ++end +diff --git a/feeds/luci/modules/luci-base/luasrc/model/ipkg.lua b/feeds/luci/modules/luci-base/luasrc/model/ipkg.lua +new file mode 100644 +index 0000000..2ed92ca +--- /dev/null ++++ b/feeds/luci/modules/luci-base/luasrc/model/ipkg.lua +@@ -0,0 +1,241 @@ ++-- Copyright 2008-2011 Jo-Philipp Wich ++-- Copyright 2008 Steven Barth ++-- Licensed to the public under the Apache License 2.0. ++ ++local os = require "os" ++local io = require "io" ++local fs = require "nixio.fs" ++local util = require "luci.util" ++ ++local type = type ++local pairs = pairs ++local error = error ++local table = table ++ ++local ipkg = "opkg --force-removal-of-dependent-packages --force-overwrite --nocase" ++local icfg = "/etc/opkg.conf" ++ ++module "luci.model.ipkg" ++ ++ ++-- Internal action function ++local function _action(cmd, ...) ++ local pkg = "" ++ for k, v in pairs({...}) do ++ pkg = pkg .. " '" .. v:gsub("'", "") .. "'" ++ end ++ ++ local c = "%s %s %s >/tmp/opkg.stdout 2>/tmp/opkg.stderr" %{ ipkg, cmd, pkg } ++ local r = os.execute(c) ++ local e = fs.readfile("/tmp/opkg.stderr") ++ local o = fs.readfile("/tmp/opkg.stdout") ++ ++ fs.unlink("/tmp/opkg.stderr") ++ fs.unlink("/tmp/opkg.stdout") ++ ++ return r, o or "", e or "" ++end ++ ++-- Internal parser function ++local function _parselist(rawdata) ++ if type(rawdata) ~= "function" then ++ error("OPKG: Invalid rawdata given") ++ end ++ ++ local data = {} ++ local c = {} ++ local l = nil ++ ++ for line in rawdata do ++ if line:sub(1, 1) ~= " " then ++ local key, val = line:match("(.-): ?(.*)%s*") ++ ++ if key and val then ++ if key == "Package" then ++ c = {Package = val} ++ data[val] = c ++ elseif key == "Status" then ++ c.Status = {} ++ for j in val:gmatch("([^ ]+)") do ++ c.Status[j] = true ++ end ++ else ++ c[key] = val ++ end ++ l = key ++ end ++ else ++ -- Multi-line field ++ c[l] = c[l] .. "\n" .. line ++ end ++ end ++ ++ return data ++end ++ ++-- Internal lookup function ++local function _lookup(act, pkg) ++ local cmd = ipkg .. " " .. act ++ if pkg then ++ cmd = cmd .. " '" .. pkg:gsub("'", "") .. "'" ++ end ++ ++ -- OPKG sometimes kills the whole machine because it sucks ++ -- Therefore we have to use a sucky approach too and use ++ -- tmpfiles instead of directly reading the output ++ local tmpfile = os.tmpname() ++ os.execute(cmd .. (" >%s 2>/dev/null" % tmpfile)) ++ ++ local data = _parselist(io.lines(tmpfile)) ++ os.remove(tmpfile) ++ return data ++end ++ ++ ++function info(pkg) ++ return _lookup("info", pkg) ++end ++ ++function status(pkg) ++ return _lookup("status", pkg) ++end ++ ++function install(...) ++ return _action("install", ...) ++end ++ ++function installed(pkg) ++ local p = status(pkg)[pkg] ++ return (p and p.Status and p.Status.installed) ++end ++ ++function remove(...) ++ return _action("remove", ...) ++end ++ ++function update() ++ return _action("update") ++end ++ ++function upgrade() ++ return _action("upgrade") ++end ++ ++-- List helper ++local function _list(action, pat, cb) ++ local fd = io.popen(ipkg .. " " .. action .. ++ (pat and (" '%s'" % pat:gsub("'", "")) or "")) ++ ++ if fd then ++ local name, version, sz, desc ++ while true do ++ local line = fd:read("*l") ++ if not line then break end ++ ++ name, version, sz, desc = line:match("^(.-) %- (.-) %- (.-) %- (.+)") ++ ++ if not name then ++ name, version, sz = line:match("^(.-) %- (.-) %- (.+)") ++ desc = "" ++ end ++ ++ if #version > 26 then ++ version = version:sub(1,21) .. ".." .. version:sub(-3,-1) ++ end ++ ++ cb(name, version, sz, desc) ++ ++ name = nil ++ version = nil ++ sz = nil ++ desc = nil ++ end ++ ++ fd:close() ++ end ++end ++ ++function list_all(pat, cb) ++ _list("list --size", pat, cb) ++end ++ ++function list_installed(pat, cb) ++ _list("list_installed --size", pat, cb) ++end ++ ++function find(pat, cb) ++ _list("find --size", pat, cb) ++end ++ ++ ++function overlay_root() ++ local od = "/" ++ local fd = io.open(icfg, "r") ++ ++ if fd then ++ local ln ++ ++ repeat ++ ln = fd:read("*l") ++ if ln and ln:match("^%s*option%s+overlay_root%s+") then ++ od = ln:match("^%s*option%s+overlay_root%s+(%S+)") ++ ++ local s = fs.stat(od) ++ if not s or s.type ~= "dir" then ++ od = "/" ++ end ++ ++ break ++ end ++ until not ln ++ ++ fd:close() ++ end ++ ++ return od ++end ++ ++function compare_versions(ver1, comp, ver2) ++ if not ver1 or not ver2 ++ or not comp or not (#comp > 0) then ++ error("Invalid parameters") ++ return nil ++ end ++ -- correct compare string ++ if comp == "<>" or comp == "><" or comp == "!=" or comp == "~=" then comp = "~=" ++ elseif comp == "<=" or comp == "<" or comp == "=<" then comp = "<=" ++ elseif comp == ">=" or comp == ">" or comp == "=>" then comp = ">=" ++ elseif comp == "=" or comp == "==" then comp = "==" ++ elseif comp == "<<" then comp = "<" ++ elseif comp == ">>" then comp = ">" ++ else ++ error("Invalid compare string") ++ return nil ++ end ++ ++ local av1 = util.split(ver1, "[%.%-]", nil, true) ++ local av2 = util.split(ver2, "[%.%-]", nil, true) ++ ++ local max = table.getn(av1) ++ if (table.getn(av1) < table.getn(av2)) then ++ max = table.getn(av2) ++ end ++ ++ for i = 1, max, 1 do ++ local s1 = av1[i] or "" ++ local s2 = av2[i] or "" ++ ++ -- first "not equal" found return true ++ if comp == "~=" and (s1 ~= s2) then return true end ++ -- first "lower" found return true ++ if (comp == "<" or comp == "<=") and (s1 < s2) then return true end ++ -- first "greater" found return true ++ if (comp == ">" or comp == ">=") and (s1 > s2) then return true end ++ -- not equal then return false ++ if (s1 ~= s2) then return false end ++ end ++ ++ -- all equal and not compare greater or lower then true ++ return not (comp == "<" or comp == ">") ++end ++ +diff --git a/feeds/luci/modules/luci-base/luasrc/model/ipkg.luadoc b/feeds/luci/modules/luci-base/luasrc/model/ipkg.luadoc +new file mode 100644 +index 0000000..4e1548d +--- /dev/null ++++ b/feeds/luci/modules/luci-base/luasrc/model/ipkg.luadoc +@@ -0,0 +1,125 @@ ++---[[ ++LuCI OPKG call abstraction library ++]] ++module "luci.model.ipkg" ++ ++---[[ ++Return information about installed and available packages. ++ ++@class function ++@name info ++@param pkg Limit output to a (set of) packages ++@return Table containing package information ++]] ++ ++---[[ ++Return the package status of one or more packages. ++ ++@class function ++@name status ++@param pkg Limit output to a (set of) packages ++@return Table containing package status information ++]] ++ ++---[[ ++Install one or more packages. ++ ++@class function ++@name install ++@param ... List of packages to install ++@return Boolean indicating the status of the action ++@return OPKG return code, STDOUT and STDERR ++]] ++ ++---[[ ++Determine whether a given package is installed. ++ ++@class function ++@name installed ++@param pkg Package ++@return Boolean ++]] ++ ++---[[ ++Remove one or more packages. ++ ++@class function ++@name remove ++@param ... List of packages to install ++@return Boolean indicating the status of the action ++@return OPKG return code, STDOUT and STDERR ++]] ++ ++---[[ ++Update package lists. ++ ++@class function ++@name update ++@return Boolean indicating the status of the action ++@return OPKG return code, STDOUT and STDERR ++]] ++ ++---[[ ++Upgrades all installed packages. ++ ++@class function ++@name upgrade ++@return Boolean indicating the status of the action ++@return OPKG return code, STDOUT and STDERR ++]] ++ ++---[[ ++List all packages known to opkg. ++ ++@class function ++@name list_all ++@param pat Only find packages matching this pattern, nil lists all packages ++@param cb Callback function invoked for each package, receives name, version and description as arguments ++@return nothing ++]] ++ ++---[[ ++List installed packages. ++ ++@class function ++@name list_installed ++@param pat Only find packages matching this pattern, nil lists all packages ++@param cb Callback function invoked for each package, receives name, version and description as arguments ++@return nothing ++]] ++ ++---[[ ++Find packages that match the given pattern. ++ ++@class function ++@name find ++@param pat Find packages whose names or descriptions match this pattern, nil results in zero results ++@param cb Callback function invoked for each patckage, receives name, version and description as arguments ++@return nothing ++]] ++ ++---[[ ++Determines the overlay root used by opkg. ++ ++@class function ++@name overlay_root ++@return String containing the directory path of the overlay root. ++]] ++ ++---[[ ++lua version of opkg compare-versions ++ ++@class function ++@name compare_versions ++@param ver1 string version 1 ++@param ver2 string version 2 ++@param comp string compare versions using ++ "<=" or "<" lower-equal ++ ">" or ">=" greater-equal ++ "=" equal ++ "<<" lower ++ ">>" greater ++ "~=" not equal ++@return Boolean indicating the status of the compare ++]] ++ +diff --git a/feeds/luci/modules/luci-base/luasrc/model/network.lua b/feeds/luci/modules/luci-base/luasrc/model/network.lua +new file mode 100644 +index 0000000..20e1032 +--- /dev/null ++++ b/feeds/luci/modules/luci-base/luasrc/model/network.lua +@@ -0,0 +1,1579 @@ ++-- Copyright 2009-2015 Jo-Philipp Wich ++-- Licensed to the public under the Apache License 2.0. ++ ++local type, next, pairs, ipairs, loadfile, table ++ = type, next, pairs, ipairs, loadfile, table ++ ++local tonumber, tostring, math = tonumber, tostring, math ++ ++local require = require ++ ++local nxo = require "nixio" ++local nfs = require "nixio.fs" ++local ipc = require "luci.ip" ++local sys = require "luci.sys" ++local utl = require "luci.util" ++local dsp = require "luci.dispatcher" ++local uci = require "luci.model.uci" ++local lng = require "luci.i18n" ++ ++module "luci.model.network" ++ ++ ++IFACE_PATTERNS_VIRTUAL = { } ++IFACE_PATTERNS_IGNORE = { "^wmaster%d", "^wifi%d", "^hwsim%d", "^imq%d", "^ifb%d", "^mon%.wlan%d", "^sit%d", "^gre%d", "^lo$" } ++IFACE_PATTERNS_WIRELESS = { "^wlan%d", "^wl%d", "^ath%d", "^%w+%.network%d" } ++ ++ ++protocol = utl.class() ++ ++local _protocols = { } ++ ++local _interfaces, _bridge, _switch, _tunnel ++local _ubusnetcache, _ubusdevcache, _ubuswificache ++local _uci_real, _uci_state ++ ++function _filter(c, s, o, r) ++ local val = _uci_real:get(c, s, o) ++ if val then ++ local l = { } ++ if type(val) == "string" then ++ for val in val:gmatch("%S+") do ++ if val ~= r then ++ l[#l+1] = val ++ end ++ end ++ if #l > 0 then ++ _uci_real:set(c, s, o, table.concat(l, " ")) ++ else ++ _uci_real:delete(c, s, o) ++ end ++ elseif type(val) == "table" then ++ for _, val in ipairs(val) do ++ if val ~= r then ++ l[#l+1] = val ++ end ++ end ++ if #l > 0 then ++ _uci_real:set(c, s, o, l) ++ else ++ _uci_real:delete(c, s, o) ++ end ++ end ++ end ++end ++ ++function _append(c, s, o, a) ++ local val = _uci_real:get(c, s, o) or "" ++ if type(val) == "string" then ++ local l = { } ++ for val in val:gmatch("%S+") do ++ if val ~= a then ++ l[#l+1] = val ++ end ++ end ++ l[#l+1] = a ++ _uci_real:set(c, s, o, table.concat(l, " ")) ++ elseif type(val) == "table" then ++ local l = { } ++ for _, val in ipairs(val) do ++ if val ~= a then ++ l[#l+1] = val ++ end ++ end ++ l[#l+1] = a ++ _uci_real:set(c, s, o, l) ++ end ++end ++ ++function _stror(s1, s2) ++ if not s1 or #s1 == 0 then ++ return s2 and #s2 > 0 and s2 ++ else ++ return s1 ++ end ++end ++ ++function _get(c, s, o) ++ return _uci_real:get(c, s, o) ++end ++ ++function _set(c, s, o, v) ++ if v ~= nil then ++ if type(v) == "boolean" then v = v and "1" or "0" end ++ return _uci_real:set(c, s, o, v) ++ else ++ return _uci_real:delete(c, s, o) ++ end ++end ++ ++function _wifi_iface(x) ++ local _, p ++ for _, p in ipairs(IFACE_PATTERNS_WIRELESS) do ++ if x:match(p) then ++ return true ++ end ++ end ++ return false ++end ++ ++function _wifi_state(key, val, field) ++ local radio, radiostate, ifc, ifcstate ++ ++ if not next(_ubuswificache) then ++ _ubuswificache = utl.ubus("network.wireless", "status", {}) or {} ++ ++ -- workaround extended section format ++ for radio, radiostate in pairs(_ubuswificache) do ++ for ifc, ifcstate in pairs(radiostate.interfaces) do ++ if ifcstate.section and ifcstate.section:sub(1, 1) == '@' then ++ local s = _uci_real:get_all('wireless.%s' % ifcstate.section) ++ if s then ++ ifcstate.section = s['.name'] ++ end ++ end ++ end ++ end ++ end ++ ++ for radio, radiostate in pairs(_ubuswificache) do ++ for ifc, ifcstate in pairs(radiostate.interfaces) do ++ if ifcstate[key] == val then ++ return ifcstate[field] ++ end ++ end ++ end ++end ++ ++function _wifi_lookup(ifn) ++ -- got a radio#.network# pseudo iface, locate the corresponding section ++ local radio, ifnidx = ifn:match("^(%w+)%.network(%d+)$") ++ if radio and ifnidx then ++ local sid = nil ++ local num = 0 ++ ++ ifnidx = tonumber(ifnidx) ++ _uci_real:foreach("wireless", "wifi-iface", ++ function(s) ++ if s.device == radio then ++ num = num + 1 ++ if num == ifnidx then ++ sid = s['.name'] ++ return false ++ end ++ end ++ end) ++ ++ return sid ++ ++ -- looks like wifi, try to locate the section via state vars ++ elseif _wifi_iface(ifn) then ++ local sid = _wifi_state("ifname", ifn, "section") ++ if not sid then ++ _uci_state:foreach("wireless", "wifi-iface", ++ function(s) ++ if s.ifname == ifn then ++ sid = s['.name'] ++ return false ++ end ++ end) ++ end ++ ++ return sid ++ end ++end ++ ++function _iface_virtual(x) ++ local _, p ++ for _, p in ipairs(IFACE_PATTERNS_VIRTUAL) do ++ if x:match(p) then ++ return true ++ end ++ end ++ return false ++end ++ ++function _iface_ignore(x) ++ local _, p ++ for _, p in ipairs(IFACE_PATTERNS_IGNORE) do ++ if x:match(p) then ++ return true ++ end ++ end ++ return _iface_virtual(x) ++end ++ ++ ++function init(cursor) ++ _uci_real = cursor or _uci_real or uci.cursor() ++ _uci_state = _uci_real:substate() ++ ++ _interfaces = { } ++ _bridge = { } ++ _switch = { } ++ _tunnel = { } ++ ++ _ubusnetcache = { } ++ _ubusdevcache = { } ++ _ubuswificache = { } ++ ++ -- read interface information ++ local n, i ++ for n, i in ipairs(nxo.getifaddrs()) do ++ local name = i.name:match("[^:]+") ++ local prnt = name:match("^([^%.]+)%.") ++ ++ if _iface_virtual(name) then ++ _tunnel[name] = true ++ end ++ ++ if _tunnel[name] or not _iface_ignore(name) then ++ _interfaces[name] = _interfaces[name] or { ++ idx = i.ifindex or n, ++ name = name, ++ rawname = i.name, ++ flags = { }, ++ ipaddrs = { }, ++ ip6addrs = { } ++ } ++ ++ if prnt then ++ _switch[name] = true ++ _switch[prnt] = true ++ end ++ ++ if i.family == "packet" then ++ _interfaces[name].flags = i.flags ++ _interfaces[name].stats = i.data ++ _interfaces[name].macaddr = i.addr ++ elseif i.family == "inet" then ++ _interfaces[name].ipaddrs[#_interfaces[name].ipaddrs+1] = ipc.IPv4(i.addr, i.netmask) ++ elseif i.family == "inet6" then ++ _interfaces[name].ip6addrs[#_interfaces[name].ip6addrs+1] = ipc.IPv6(i.addr, i.netmask) ++ end ++ end ++ end ++ ++ -- read bridge informaton ++ local b, l ++ for l in utl.execi("brctl show") do ++ if not l:match("STP") then ++ local r = utl.split(l, "%s+", nil, true) ++ if #r == 4 then ++ b = { ++ name = r[1], ++ id = r[2], ++ stp = r[3] == "yes", ++ ifnames = { _interfaces[r[4]] } ++ } ++ if b.ifnames[1] then ++ b.ifnames[1].bridge = b ++ end ++ _bridge[r[1]] = b ++ elseif b then ++ b.ifnames[#b.ifnames+1] = _interfaces[r[2]] ++ b.ifnames[#b.ifnames].bridge = b ++ end ++ end ++ end ++ ++ return _M ++end ++ ++function save(self, ...) ++ _uci_real:save(...) ++ _uci_real:load(...) ++end ++ ++function commit(self, ...) ++ _uci_real:commit(...) ++ _uci_real:load(...) ++end ++ ++function ifnameof(self, x) ++ if utl.instanceof(x, interface) then ++ return x:name() ++ elseif utl.instanceof(x, protocol) then ++ return x:ifname() ++ elseif type(x) == "string" then ++ return x:match("^[^:]+") ++ end ++end ++ ++function get_protocol(self, protoname, netname) ++ local v = _protocols[protoname] ++ if v then ++ return v(netname or "__dummy__") ++ end ++end ++ ++function get_protocols(self) ++ local p = { } ++ local _, v ++ for _, v in ipairs(_protocols) do ++ p[#p+1] = v("__dummy__") ++ end ++ return p ++end ++ ++function register_protocol(self, protoname) ++ local proto = utl.class(protocol) ++ ++ function proto.__init__(self, name) ++ self.sid = name ++ end ++ ++ function proto.proto(self) ++ return protoname ++ end ++ ++ _protocols[#_protocols+1] = proto ++ _protocols[protoname] = proto ++ ++ return proto ++end ++ ++function register_pattern_virtual(self, pat) ++ IFACE_PATTERNS_VIRTUAL[#IFACE_PATTERNS_VIRTUAL+1] = pat ++end ++ ++ ++function has_ipv6(self) ++ return nfs.access("/proc/net/ipv6_route") ++end ++ ++function add_network(self, n, options) ++ local oldnet = self:get_network(n) ++ if n and #n > 0 and n:match("^[a-zA-Z0-9_]+$") and not oldnet then ++ if _uci_real:section("network", "interface", n, options) then ++ return network(n) ++ end ++ elseif oldnet and oldnet:is_empty() then ++ if options then ++ local k, v ++ for k, v in pairs(options) do ++ oldnet:set(k, v) ++ end ++ end ++ return oldnet ++ end ++end ++ ++function get_network(self, n) ++ if n and _uci_real:get("network", n) == "interface" then ++ return network(n) ++ end ++end ++ ++function get_networks(self) ++ local nets = { } ++ local nls = { } ++ ++ _uci_real:foreach("network", "interface", ++ function(s) ++ nls[s['.name']] = network(s['.name']) ++ end) ++ ++ local n ++ for n in utl.kspairs(nls) do ++ nets[#nets+1] = nls[n] ++ end ++ ++ return nets ++end ++ ++function del_network(self, n) ++ local r = _uci_real:delete("network", n) ++ if r then ++ _uci_real:delete_all("network", "alias", ++ function(s) return (s.interface == n) end) ++ ++ _uci_real:delete_all("network", "route", ++ function(s) return (s.interface == n) end) ++ ++ _uci_real:delete_all("network", "route6", ++ function(s) return (s.interface == n) end) ++ ++ _uci_real:foreach("wireless", "wifi-iface", ++ function(s) ++ local net ++ local rest = { } ++ for net in utl.imatch(s.network) do ++ if net ~= n then ++ rest[#rest+1] = net ++ end ++ end ++ if #rest > 0 then ++ _uci_real:set("wireless", s['.name'], "network", ++ table.concat(rest, " ")) ++ else ++ _uci_real:delete("wireless", s['.name'], "network") ++ end ++ end) ++ end ++ return r ++end ++ ++function rename_network(self, old, new) ++ local r ++ if new and #new > 0 and new:match("^[a-zA-Z0-9_]+$") and not self:get_network(new) then ++ r = _uci_real:section("network", "interface", new, _uci_real:get_all("network", old)) ++ ++ if r then ++ _uci_real:foreach("network", "alias", ++ function(s) ++ if s.interface == old then ++ _uci_real:set("network", s['.name'], "interface", new) ++ end ++ end) ++ ++ _uci_real:foreach("network", "route", ++ function(s) ++ if s.interface == old then ++ _uci_real:set("network", s['.name'], "interface", new) ++ end ++ end) ++ ++ _uci_real:foreach("network", "route6", ++ function(s) ++ if s.interface == old then ++ _uci_real:set("network", s['.name'], "interface", new) ++ end ++ end) ++ ++ _uci_real:foreach("wireless", "wifi-iface", ++ function(s) ++ local net ++ local list = { } ++ for net in utl.imatch(s.network) do ++ if net == old then ++ list[#list+1] = new ++ else ++ list[#list+1] = net ++ end ++ end ++ if #list > 0 then ++ _uci_real:set("wireless", s['.name'], "network", ++ table.concat(list, " ")) ++ end ++ end) ++ ++ _uci_real:delete("network", old) ++ end ++ end ++ return r or false ++end ++ ++function get_interface(self, i) ++ if _interfaces[i] or _wifi_iface(i) then ++ return interface(i) ++ else ++ local ifc ++ local num = { } ++ _uci_real:foreach("wireless", "wifi-iface", ++ function(s) ++ if s.device then ++ num[s.device] = num[s.device] and num[s.device] + 1 or 1 ++ if s['.name'] == i then ++ ifc = interface( ++ "%s.network%d" %{s.device, num[s.device] }) ++ return false ++ end ++ end ++ end) ++ return ifc ++ end ++end ++ ++function get_interfaces(self) ++ local iface ++ local ifaces = { } ++ local seen = { } ++ local nfs = { } ++ local baseof = { } ++ ++ -- find normal interfaces ++ _uci_real:foreach("network", "interface", ++ function(s) ++ for iface in utl.imatch(s.ifname) do ++ if not _iface_ignore(iface) and not _wifi_iface(iface) then ++ seen[iface] = true ++ nfs[iface] = interface(iface) ++ end ++ end ++ end) ++ ++ for iface in utl.kspairs(_interfaces) do ++ if not (seen[iface] or _iface_ignore(iface) or _wifi_iface(iface)) then ++ nfs[iface] = interface(iface) ++ end ++ end ++ ++ -- find vlan interfaces ++ _uci_real:foreach("network", "switch_vlan", ++ function(s) ++ if not s.device then ++ return ++ end ++ ++ local base = baseof[s.device] ++ if not base then ++ if not s.device:match("^eth%d") then ++ local l ++ for l in utl.execi("swconfig dev %q help 2>/dev/null" % s.device) do ++ if not base then ++ base = l:match("^%w+: (%w+)") ++ end ++ end ++ if not base or not base:match("^eth%d") then ++ base = "eth0" ++ end ++ else ++ base = s.device ++ end ++ baseof[s.device] = base ++ end ++ ++ local vid = tonumber(s.vid or s.vlan) ++ if vid ~= nil and vid >= 0 and vid <= 4095 then ++ local iface = "%s.%d" %{ base, vid } ++ if not seen[iface] then ++ seen[iface] = true ++ nfs[iface] = interface(iface) ++ end ++ end ++ end) ++ ++ for iface in utl.kspairs(nfs) do ++ ifaces[#ifaces+1] = nfs[iface] ++ end ++ ++ -- find wifi interfaces ++ local num = { } ++ local wfs = { } ++ _uci_real:foreach("wireless", "wifi-iface", ++ function(s) ++ if s.device then ++ num[s.device] = num[s.device] and num[s.device] + 1 or 1 ++ local i = "%s.network%d" %{ s.device, num[s.device] } ++ wfs[i] = interface(i) ++ end ++ end) ++ ++ for iface in utl.kspairs(wfs) do ++ ifaces[#ifaces+1] = wfs[iface] ++ end ++ ++ return ifaces ++end ++ ++function ignore_interface(self, x) ++ return _iface_ignore(x) ++end ++ ++function get_wifidev(self, dev) ++ if _uci_real:get("wireless", dev) == "wifi-device" then ++ return wifidev(dev) ++ end ++end ++ ++function get_wifidevs(self) ++ local devs = { } ++ local wfd = { } ++ ++ _uci_real:foreach("wireless", "wifi-device", ++ function(s) wfd[#wfd+1] = s['.name'] end) ++ ++ local dev ++ for _, dev in utl.vspairs(wfd) do ++ devs[#devs+1] = wifidev(dev) ++ end ++ ++ return devs ++end ++ ++function get_wifinet(self, net) ++ local wnet = _wifi_lookup(net) ++ if wnet then ++ return wifinet(wnet) ++ end ++end ++ ++function add_wifinet(self, net, options) ++ if type(options) == "table" and options.device and ++ _uci_real:get("wireless", options.device) == "wifi-device" ++ then ++ local wnet = _uci_real:section("wireless", "wifi-iface", nil, options) ++ return wifinet(wnet) ++ end ++end ++ ++function del_wifinet(self, net) ++ local wnet = _wifi_lookup(net) ++ if wnet then ++ _uci_real:delete("wireless", wnet) ++ return true ++ end ++ return false ++end ++ ++function get_status_by_route(self, addr, mask) ++ local _, object ++ for _, object in ipairs(utl.ubus()) do ++ local net = object:match("^network%.interface%.(.+)") ++ if net then ++ local s = utl.ubus(object, "status", {}) ++ if s and s.route then ++ local rt ++ for _, rt in ipairs(s.route) do ++ if not rt.table and rt.target == addr and rt.mask == mask then ++ return net, s ++ end ++ end ++ end ++ end ++ end ++end ++ ++function get_status_by_address(self, addr) ++ local _, object ++ for _, object in ipairs(utl.ubus()) do ++ local net = object:match("^network%.interface%.(.+)") ++ if net then ++ local s = utl.ubus(object, "status", {}) ++ if s and s['ipv4-address'] then ++ local a ++ for _, a in ipairs(s['ipv4-address']) do ++ if a.address == addr then ++ return net, s ++ end ++ end ++ end ++ if s and s['ipv6-address'] then ++ local a ++ for _, a in ipairs(s['ipv6-address']) do ++ if a.address == addr then ++ return net, s ++ end ++ end ++ end ++ end ++ end ++end ++ ++function get_wannet(self) ++ local net = self:get_status_by_route("0.0.0.0", 0) ++ return net and network(net) ++end ++ ++function get_wandev(self) ++ local _, stat = self:get_status_by_route("0.0.0.0", 0) ++ return stat and interface(stat.l3_device or stat.device) ++end ++ ++function get_wan6net(self) ++ local net = self:get_status_by_route("::", 0) ++ return net and network(net) ++end ++ ++function get_wan6dev(self) ++ local _, stat = self:get_status_by_route("::", 0) ++ return stat and interface(stat.l3_device or stat.device) ++end ++ ++ ++function network(name, proto) ++ if name then ++ local p = proto or _uci_real:get("network", name, "proto") ++ local c = p and _protocols[p] or protocol ++ return c(name) ++ end ++end ++ ++function protocol.__init__(self, name) ++ self.sid = name ++end ++ ++function protocol._get(self, opt) ++ local v = _uci_real:get("network", self.sid, opt) ++ if type(v) == "table" then ++ return table.concat(v, " ") ++ end ++ return v or "" ++end ++ ++function protocol._ubus(self, field) ++ if not _ubusnetcache[self.sid] then ++ _ubusnetcache[self.sid] = utl.ubus("network.interface.%s" % self.sid, ++ "status", { }) ++ end ++ if _ubusnetcache[self.sid] and field then ++ return _ubusnetcache[self.sid][field] ++ end ++ return _ubusnetcache[self.sid] ++end ++ ++function protocol.get(self, opt) ++ return _get("network", self.sid, opt) ++end ++ ++function protocol.set(self, opt, val) ++ return _set("network", self.sid, opt, val) ++end ++ ++function protocol.ifname(self) ++ local ifname ++ if self:is_floating() then ++ ifname = self:_ubus("l3_device") ++ else ++ ifname = self:_ubus("device") ++ end ++ if not ifname then ++ local num = { } ++ _uci_real:foreach("wireless", "wifi-iface", ++ function(s) ++ if s.device then ++ num[s.device] = num[s.device] ++ and num[s.device] + 1 or 1 ++ ++ local net ++ for net in utl.imatch(s.network) do ++ if net == self.sid then ++ ifname = "%s.network%d" %{ s.device, num[s.device] } ++ return false ++ end ++ end ++ end ++ end) ++ end ++ return ifname ++end ++ ++function protocol.proto(self) ++ return "none" ++end ++ ++function protocol.get_i18n(self) ++ local p = self:proto() ++ if p == "none" then ++ return lng.translate("Unmanaged") ++ elseif p == "static" then ++ return lng.translate("Static address") ++ elseif p == "dhcp" then ++ return lng.translate("DHCP client") ++ else ++ return lng.translate("Unknown") ++ end ++end ++ ++function protocol.type(self) ++ return self:_get("type") ++end ++ ++function protocol.name(self) ++ return self.sid ++end ++ ++function protocol.uptime(self) ++ return self:_ubus("uptime") or 0 ++end ++ ++function protocol.expires(self) ++ local a = tonumber(_uci_state:get("network", self.sid, "lease_acquired")) ++ local l = tonumber(_uci_state:get("network", self.sid, "lease_lifetime")) ++ if a and l then ++ l = l - (nxo.sysinfo().uptime - a) ++ return l > 0 and l or 0 ++ end ++ return -1 ++end ++ ++function protocol.metric(self) ++ return tonumber(_uci_state:get("network", self.sid, "metric")) or 0 ++end ++ ++function protocol.ipaddr(self) ++ local addrs = self:_ubus("ipv4-address") ++ return addrs and #addrs > 0 and addrs[1].address ++end ++ ++function protocol.netmask(self) ++ local addrs = self:_ubus("ipv4-address") ++ return addrs and #addrs > 0 and ++ ipc.IPv4("0.0.0.0/%d" % addrs[1].mask):mask():string() ++end ++ ++function protocol.gwaddr(self) ++ local _, route ++ for _, route in ipairs(self:_ubus("route") or { }) do ++ if route.target == "0.0.0.0" and route.mask == 0 then ++ return route.nexthop ++ end ++ end ++end ++ ++function protocol.dnsaddrs(self) ++ local dns = { } ++ local _, addr ++ for _, addr in ipairs(self:_ubus("dns-server") or { }) do ++ if not addr:match(":") then ++ dns[#dns+1] = addr ++ end ++ end ++ return dns ++end ++ ++function protocol.ip6addr(self) ++ local addrs = self:_ubus("ipv6-address") ++ if addrs and #addrs > 0 then ++ return "%s/%d" %{ addrs[1].address, addrs[1].mask } ++ else ++ addrs = self:_ubus("ipv6-prefix-assignment") ++ if addrs and #addrs > 0 then ++ return "%s/%d" %{ addrs[1].address, addrs[1].mask } ++ end ++ end ++end ++ ++function protocol.gw6addr(self) ++ local _, route ++ for _, route in ipairs(self:_ubus("route") or { }) do ++ if route.target == "::" and route.mask == 0 then ++ return ipc.IPv6(route.nexthop):string() ++ end ++ end ++end ++ ++function protocol.dns6addrs(self) ++ local dns = { } ++ local _, addr ++ for _, addr in ipairs(self:_ubus("dns-server") or { }) do ++ if addr:match(":") then ++ dns[#dns+1] = addr ++ end ++ end ++ return dns ++end ++ ++function protocol.is_bridge(self) ++ return (not self:is_virtual() and self:type() == "bridge") ++end ++ ++function protocol.opkg_package(self) ++ return nil ++end ++ ++function protocol.is_installed(self) ++ return true ++end ++ ++function protocol.is_virtual(self) ++ return false ++end ++ ++function protocol.is_floating(self) ++ return false ++end ++ ++function protocol.is_empty(self) ++ if self:is_floating() then ++ return false ++ else ++ local rv = true ++ ++ if (self:_get("ifname") or ""):match("%S+") then ++ rv = false ++ end ++ ++ _uci_real:foreach("wireless", "wifi-iface", ++ function(s) ++ local n ++ for n in utl.imatch(s.network) do ++ if n == self.sid then ++ rv = false ++ return false ++ end ++ end ++ end) ++ ++ return rv ++ end ++end ++ ++function protocol.add_interface(self, ifname) ++ ifname = _M:ifnameof(ifname) ++ if ifname and not self:is_floating() then ++ -- if its a wifi interface, change its network option ++ local wif = _wifi_lookup(ifname) ++ if wif then ++ _append("wireless", wif, "network", self.sid) ++ ++ -- add iface to our iface list ++ else ++ _append("network", self.sid, "ifname", ifname) ++ end ++ end ++end ++ ++function protocol.del_interface(self, ifname) ++ ifname = _M:ifnameof(ifname) ++ if ifname and not self:is_floating() then ++ -- if its a wireless interface, clear its network option ++ local wif = _wifi_lookup(ifname) ++ if wif then _filter("wireless", wif, "network", self.sid) end ++ ++ -- remove the interface ++ _filter("network", self.sid, "ifname", ifname) ++ end ++end ++ ++function protocol.get_interface(self) ++ if self:is_virtual() then ++ _tunnel[self:proto() .. "-" .. self.sid] = true ++ return interface(self:proto() .. "-" .. self.sid, self) ++ elseif self:is_bridge() then ++ _bridge["br-" .. self.sid] = true ++ return interface("br-" .. self.sid, self) ++ else ++ local ifn = nil ++ local num = { } ++ for ifn in utl.imatch(_uci_real:get("network", self.sid, "ifname")) do ++ ifn = ifn:match("^[^:/]+") ++ return ifn and interface(ifn, self) ++ end ++ ifn = nil ++ _uci_real:foreach("wireless", "wifi-iface", ++ function(s) ++ if s.device then ++ num[s.device] = num[s.device] and num[s.device] + 1 or 1 ++ ++ local net ++ for net in utl.imatch(s.network) do ++ if net == self.sid then ++ ifn = "%s.network%d" %{ s.device, num[s.device] } ++ return false ++ end ++ end ++ end ++ end) ++ return ifn and interface(ifn, self) ++ end ++end ++ ++function protocol.get_interfaces(self) ++ if self:is_bridge() or (self:is_virtual() and not self:is_floating()) then ++ local ifaces = { } ++ ++ local ifn ++ local nfs = { } ++ for ifn in utl.imatch(self:get("ifname")) do ++ ifn = ifn:match("^[^:/]+") ++ nfs[ifn] = interface(ifn, self) ++ end ++ ++ for ifn in utl.kspairs(nfs) do ++ ifaces[#ifaces+1] = nfs[ifn] ++ end ++ ++ local num = { } ++ local wfs = { } ++ _uci_real:foreach("wireless", "wifi-iface", ++ function(s) ++ if s.device then ++ num[s.device] = num[s.device] and num[s.device] + 1 or 1 ++ ++ local net ++ for net in utl.imatch(s.network) do ++ if net == self.sid then ++ ifn = "%s.network%d" %{ s.device, num[s.device] } ++ wfs[ifn] = interface(ifn, self) ++ end ++ end ++ end ++ end) ++ ++ for ifn in utl.kspairs(wfs) do ++ ifaces[#ifaces+1] = wfs[ifn] ++ end ++ ++ return ifaces ++ end ++end ++ ++function protocol.contains_interface(self, ifname) ++ ifname = _M:ifnameof(ifname) ++ if not ifname then ++ return false ++ elseif self:is_virtual() and self:proto() .. "-" .. self.sid == ifname then ++ return true ++ elseif self:is_bridge() and "br-" .. self.sid == ifname then ++ return true ++ else ++ local ifn ++ for ifn in utl.imatch(self:get("ifname")) do ++ ifn = ifn:match("[^:]+") ++ if ifn == ifname then ++ return true ++ end ++ end ++ ++ local wif = _wifi_lookup(ifname) ++ if wif then ++ local n ++ for n in utl.imatch(_uci_real:get("wireless", wif, "network")) do ++ if n == self.sid then ++ return true ++ end ++ end ++ end ++ end ++ ++ return false ++end ++ ++function protocol.adminlink(self) ++ return dsp.build_url("admin", "network", "network", self.sid) ++end ++ ++ ++interface = utl.class() ++ ++function interface.__init__(self, ifname, network) ++ local wif = _wifi_lookup(ifname) ++ if wif then ++ self.wif = wifinet(wif) ++ self.ifname = _wifi_state("section", wif, "ifname") ++ end ++ ++ self.ifname = self.ifname or ifname ++ self.dev = _interfaces[self.ifname] ++ self.network = network ++end ++ ++function interface._ubus(self, field) ++ if not _ubusdevcache[self.ifname] then ++ _ubusdevcache[self.ifname] = utl.ubus("network.device", "status", ++ { name = self.ifname }) ++ end ++ if _ubusdevcache[self.ifname] and field then ++ return _ubusdevcache[self.ifname][field] ++ end ++ return _ubusdevcache[self.ifname] ++end ++ ++function interface.name(self) ++ return self.wif and self.wif:ifname() or self.ifname ++end ++ ++function interface.mac(self) ++ return (self:_ubus("macaddr") or "00:00:00:00:00:00"):upper() ++end ++ ++function interface.ipaddrs(self) ++ return self.dev and self.dev.ipaddrs or { } ++end ++ ++function interface.ip6addrs(self) ++ return self.dev and self.dev.ip6addrs or { } ++end ++ ++function interface.type(self) ++ if self.wif or _wifi_iface(self.ifname) then ++ return "wifi" ++ elseif _bridge[self.ifname] then ++ return "bridge" ++ elseif _tunnel[self.ifname] then ++ return "tunnel" ++ elseif self.ifname:match("%.") then ++ return "vlan" ++ elseif _switch[self.ifname] then ++ return "switch" ++ else ++ return "ethernet" ++ end ++end ++ ++function interface.shortname(self) ++ if self.wif then ++ return "%s %q" %{ ++ self.wif:active_mode(), ++ self.wif:active_ssid() or self.wif:active_bssid() ++ } ++ else ++ return self.ifname ++ end ++end ++ ++function interface.get_i18n(self) ++ if self.wif then ++ return "%s: %s %q" %{ ++ lng.translate("Wireless Network"), ++ self.wif:active_mode(), ++ self.wif:active_ssid() or self.wif:active_bssid() ++ } ++ else ++ return "%s: %q" %{ self:get_type_i18n(), self:name() } ++ end ++end ++ ++function interface.get_type_i18n(self) ++ local x = self:type() ++ if x == "wifi" then ++ return lng.translate("Wireless Adapter") ++ elseif x == "bridge" then ++ return lng.translate("Bridge") ++ elseif x == "switch" then ++ return lng.translate("Ethernet Switch") ++ elseif x == "vlan" then ++ return lng.translate("VLAN Interface") ++ elseif x == "tunnel" then ++ return lng.translate("Tunnel Interface") ++ else ++ return lng.translate("Ethernet Adapter") ++ end ++end ++ ++function interface.adminlink(self) ++ if self.wif then ++ return self.wif:adminlink() ++ end ++end ++ ++function interface.ports(self) ++ local members = self:_ubus("bridge-members") ++ if members then ++ local _, iface ++ local ifaces = { } ++ for _, iface in ipairs(members) do ++ ifaces[#ifaces+1] = interface(iface) ++ end ++ end ++end ++ ++function interface.bridge_id(self) ++ if self.br then ++ return self.br.id ++ else ++ return nil ++ end ++end ++ ++function interface.bridge_stp(self) ++ if self.br then ++ return self.br.stp ++ else ++ return false ++ end ++end ++ ++function interface.is_up(self) ++ return self:_ubus("up") or false ++end ++ ++function interface.is_bridge(self) ++ return (self:type() == "bridge") ++end ++ ++function interface.is_bridgeport(self) ++ return self.dev and self.dev.bridge and true or false ++end ++ ++function interface.tx_bytes(self) ++ local stat = self:_ubus("statistics") ++ return stat and stat.tx_bytes or 0 ++end ++ ++function interface.rx_bytes(self) ++ local stat = self:_ubus("statistics") ++ return stat and stat.rx_bytes or 0 ++end ++ ++function interface.tx_packets(self) ++ local stat = self:_ubus("statistics") ++ return stat and stat.tx_packets or 0 ++end ++ ++function interface.rx_packets(self) ++ local stat = self:_ubus("statistics") ++ return stat and stat.rx_packets or 0 ++end ++ ++function interface.get_network(self) ++ return self:get_networks()[1] ++end ++ ++function interface.get_networks(self) ++ if not self.networks then ++ local nets = { } ++ local _, net ++ for _, net in ipairs(_M:get_networks()) do ++ if net:contains_interface(self.ifname) or ++ net:ifname() == self.ifname ++ then ++ nets[#nets+1] = net ++ end ++ end ++ table.sort(nets, function(a, b) return a.sid < b.sid end) ++ self.networks = nets ++ return nets ++ else ++ return self.networks ++ end ++end ++ ++function interface.get_wifinet(self) ++ return self.wif ++end ++ ++ ++wifidev = utl.class() ++ ++function wifidev.__init__(self, dev) ++ self.sid = dev ++ self.iwinfo = dev and sys.wifi.getiwinfo(dev) or { } ++end ++ ++function wifidev.get(self, opt) ++ return _get("wireless", self.sid, opt) ++end ++ ++function wifidev.set(self, opt, val) ++ return _set("wireless", self.sid, opt, val) ++end ++ ++function wifidev.name(self) ++ return self.sid ++end ++ ++function wifidev.hwmodes(self) ++ local l = self.iwinfo.hwmodelist ++ if l and next(l) then ++ return l ++ else ++ return { b = true, g = true } ++ end ++end ++ ++function wifidev.get_i18n(self) ++ local t = "Generic" ++ if self.iwinfo.type == "wl" then ++ t = "Broadcom" ++ elseif self.iwinfo.type == "madwifi" then ++ t = "Atheros" ++ end ++ ++ local m = "" ++ local l = self:hwmodes() ++ if l.a then m = m .. "a" end ++ if l.b then m = m .. "b" end ++ if l.g then m = m .. "g" end ++ if l.n then m = m .. "n" end ++ if l.ac then m = "ac" end ++ ++ return "%s 802.11%s Wireless Controller (%s)" %{ t, m, self:name() } ++end ++ ++function wifidev.is_up(self) ++ if _ubuswificache[self.sid] then ++ return (_ubuswificache[self.sid].up == true) ++ end ++ ++ local up = false ++ _uci_state:foreach("wireless", "wifi-iface", ++ function(s) ++ if s.device == self.sid then ++ if s.up == "1" then ++ up = true ++ return false ++ end ++ end ++ end) ++ ++ return up ++end ++ ++function wifidev.get_wifinet(self, net) ++ if _uci_real:get("wireless", net) == "wifi-iface" then ++ return wifinet(net) ++ else ++ local wnet = _wifi_lookup(net) ++ if wnet then ++ return wifinet(wnet) ++ end ++ end ++end ++ ++function wifidev.get_wifinets(self) ++ local nets = { } ++ ++ _uci_real:foreach("wireless", "wifi-iface", ++ function(s) ++ if s.device == self.sid then ++ nets[#nets+1] = wifinet(s['.name']) ++ end ++ end) ++ ++ return nets ++end ++ ++function wifidev.add_wifinet(self, options) ++ options = options or { } ++ options.device = self.sid ++ ++ local wnet = _uci_real:section("wireless", "wifi-iface", nil, options) ++ if wnet then ++ return wifinet(wnet, options) ++ end ++end ++ ++function wifidev.del_wifinet(self, net) ++ if utl.instanceof(net, wifinet) then ++ net = net.sid ++ elseif _uci_real:get("wireless", net) ~= "wifi-iface" then ++ net = _wifi_lookup(net) ++ end ++ ++ if net and _uci_real:get("wireless", net, "device") == self.sid then ++ _uci_real:delete("wireless", net) ++ return true ++ end ++ ++ return false ++end ++ ++ ++wifinet = utl.class() ++ ++function wifinet.__init__(self, net, data) ++ self.sid = net ++ ++ local num = { } ++ local netid ++ _uci_real:foreach("wireless", "wifi-iface", ++ function(s) ++ if s.device then ++ num[s.device] = num[s.device] and num[s.device] + 1 or 1 ++ if s['.name'] == self.sid then ++ netid = "%s.network%d" %{ s.device, num[s.device] } ++ return false ++ end ++ end ++ end) ++ ++ local dev = _wifi_state("section", self.sid, "ifname") or netid ++ ++ self.netid = netid ++ self.wdev = dev ++ self.iwinfo = dev and sys.wifi.getiwinfo(dev) or { } ++ self.iwdata = data or _uci_state:get_all("wireless", self.sid) or ++ _uci_real:get_all("wireless", self.sid) or { } ++end ++ ++function wifinet.get(self, opt) ++ return _get("wireless", self.sid, opt) ++end ++ ++function wifinet.set(self, opt, val) ++ return _set("wireless", self.sid, opt, val) ++end ++ ++function wifinet.mode(self) ++ return _uci_state:get("wireless", self.sid, "mode") or "ap" ++end ++ ++function wifinet.ssid(self) ++ return _uci_state:get("wireless", self.sid, "ssid") ++end ++ ++function wifinet.bssid(self) ++ return _uci_state:get("wireless", self.sid, "bssid") ++end ++ ++function wifinet.network(self) ++ return _uci_state:get("wifinet", self.sid, "network") ++end ++ ++function wifinet.id(self) ++ return self.netid ++end ++ ++function wifinet.name(self) ++ return self.sid ++end ++ ++function wifinet.ifname(self) ++ local ifname = self.iwinfo.ifname ++ if not ifname or ifname:match("^wifi%d") or ifname:match("^radio%d") then ++ ifname = self.wdev ++ end ++ return ifname ++end ++ ++function wifinet.get_device(self) ++ if self.iwdata.device then ++ return wifidev(self.iwdata.device) ++ end ++end ++ ++function wifinet.is_up(self) ++ local ifc = self:get_interface() ++ return (ifc and ifc:is_up() or false) ++end ++ ++function wifinet.active_mode(self) ++ local m = _stror(self.iwdata.mode, self.iwinfo.mode) or "ap" ++ ++ if m == "ap" then m = "Master" ++ elseif m == "sta" then m = "Client" ++ elseif m == "adhoc" then m = "Ad-Hoc" ++ elseif m == "mesh" then m = "Mesh" ++ elseif m == "monitor" then m = "Monitor" ++ end ++ ++ return m ++end ++ ++function wifinet.active_mode_i18n(self) ++ return lng.translate(self:active_mode()) ++end ++ ++function wifinet.active_ssid(self) ++ return _stror(self.iwdata.ssid, self.iwinfo.ssid) ++end ++ ++function wifinet.active_bssid(self) ++ return _stror(self.iwdata.bssid, self.iwinfo.bssid) or "00:00:00:00:00:00" ++end ++ ++function wifinet.active_encryption(self) ++ local enc = self.iwinfo and self.iwinfo.encryption ++ return enc and enc.description or "-" ++end ++ ++function wifinet.assoclist(self) ++ return self.iwinfo.assoclist or { } ++end ++ ++function wifinet.frequency(self) ++ local freq = self.iwinfo.frequency ++ if freq and freq > 0 then ++ return "%.03f" % (freq / 1000) ++ end ++end ++ ++function wifinet.bitrate(self) ++ local rate = self.iwinfo.bitrate ++ if rate and rate > 0 then ++ return (rate / 1000) ++ end ++end ++ ++function wifinet.channel(self) ++ return self.iwinfo.channel or ++ tonumber(_uci_state:get("wireless", self.iwdata.device, "channel")) ++end ++ ++function wifinet.signal(self) ++ return self.iwinfo.signal or 0 ++end ++ ++function wifinet.noise(self) ++ return self.iwinfo.noise or 0 ++end ++ ++function wifinet.country(self) ++ return self.iwinfo.country or "00" ++end ++ ++function wifinet.txpower(self) ++ local pwr = (self.iwinfo.txpower or 0) ++ return pwr + self:txpower_offset() ++end ++ ++function wifinet.txpower_offset(self) ++ return self.iwinfo.txpower_offset or 0 ++end ++ ++function wifinet.signal_level(self, s, n) ++ if self:active_bssid() ~= "00:00:00:00:00:00" then ++ local signal = s or self:signal() ++ local noise = n or self:noise() ++ ++ if signal < 0 and noise < 0 then ++ local snr = -1 * (noise - signal) ++ return math.floor(snr / 5) ++ else ++ return 0 ++ end ++ else ++ return -1 ++ end ++end ++ ++function wifinet.signal_percent(self) ++ local qc = self.iwinfo.quality or 0 ++ local qm = self.iwinfo.quality_max or 0 ++ ++ if qc > 0 and qm > 0 then ++ return math.floor((100 / qm) * qc) ++ else ++ return 0 ++ end ++end ++ ++function wifinet.shortname(self) ++ return "%s %q" %{ ++ lng.translate(self:active_mode()), ++ self:active_ssid() or self:active_bssid() ++ } ++end ++ ++function wifinet.get_i18n(self) ++ return "%s: %s %q (%s)" %{ ++ lng.translate("Wireless Network"), ++ lng.translate(self:active_mode()), ++ self:active_ssid() or self:active_bssid(), ++ self:ifname() ++ } ++end ++ ++function wifinet.adminlink(self) ++ return dsp.build_url("admin", "network", "wireless", self.netid) ++end ++ ++function wifinet.get_network(self) ++ return self:get_networks()[1] ++end ++ ++function wifinet.get_networks(self) ++ local nets = { } ++ local net ++ for net in utl.imatch(tostring(self.iwdata.network)) do ++ if _uci_real:get("network", net) == "interface" then ++ nets[#nets+1] = network(net) ++ end ++ end ++ table.sort(nets, function(a, b) return a.sid < b.sid end) ++ return nets ++end ++ ++function wifinet.get_interface(self) ++ return interface(self:ifname()) ++end ++ ++ ++-- setup base protocols ++_M:register_protocol("static") ++_M:register_protocol("dhcp") ++_M:register_protocol("none") ++ ++-- load protocol extensions ++local exts = nfs.dir(utl.libpath() .. "/model/network") ++if exts then ++ local ext ++ for ext in exts do ++ if ext:match("%.lua$") then ++ require("luci.model.network." .. ext:gsub("%.lua$", "")) ++ end ++ end ++end +diff --git a/feeds/luci/modules/luci-base/luasrc/model/uci.lua b/feeds/luci/modules/luci-base/luasrc/model/uci.lua +new file mode 100644 +index 0000000..1659137 +--- /dev/null ++++ b/feeds/luci/modules/luci-base/luasrc/model/uci.lua +@@ -0,0 +1,233 @@ ++-- Copyright 2008 Steven Barth ++-- Licensed to the public under the Apache License 2.0. ++ ++local os = require "os" ++local uci = require "uci" ++local util = require "luci.util" ++local table = require "table" ++ ++ ++local setmetatable, rawget, rawset = setmetatable, rawget, rawset ++local require, getmetatable = require, getmetatable ++local error, pairs, ipairs = error, pairs, ipairs ++local type, tostring, tonumber, unpack = type, tostring, tonumber, unpack ++ ++-- The typical workflow for UCI is: Get a cursor instance from the ++-- cursor factory, modify data (via Cursor.add, Cursor.delete, etc.), ++-- save the changes to the staging area via Cursor.save and finally ++-- Cursor.commit the data to the actual config files. ++-- LuCI then needs to Cursor.apply the changes so deamons etc. are ++-- reloaded. ++module "luci.model.uci" ++ ++cursor = uci.cursor ++ ++APIVERSION = uci.APIVERSION ++ ++function cursor_state() ++ return cursor(nil, "/var/state") ++end ++ ++ ++inst = cursor() ++inst_state = cursor_state() ++ ++local Cursor = getmetatable(inst) ++ ++function Cursor.apply(self, configlist, command) ++ configlist = self:_affected(configlist) ++ if command then ++ return { "/sbin/luci-reload", unpack(configlist) } ++ else ++ return os.execute("/sbin/luci-reload %s >/dev/null 2>&1" ++ % table.concat(configlist, " ")) ++ end ++end ++ ++ ++-- returns a boolean whether to delete the current section (optional) ++function Cursor.delete_all(self, config, stype, comparator) ++ local del = {} ++ ++ if type(comparator) == "table" then ++ local tbl = comparator ++ comparator = function(section) ++ for k, v in pairs(tbl) do ++ if section[k] ~= v then ++ return false ++ end ++ end ++ return true ++ end ++ end ++ ++ local function helper (section) ++ ++ if not comparator or comparator(section) then ++ del[#del+1] = section[".name"] ++ end ++ end ++ ++ self:foreach(config, stype, helper) ++ ++ for i, j in ipairs(del) do ++ self:delete(config, j) ++ end ++end ++ ++function Cursor.section(self, config, type, name, values) ++ local stat = true ++ if name then ++ stat = self:set(config, name, type) ++ else ++ name = self:add(config, type) ++ stat = name and true ++ end ++ ++ if stat and values then ++ stat = self:tset(config, name, values) ++ end ++ ++ return stat and name ++end ++ ++function Cursor.tset(self, config, section, values) ++ local stat = true ++ for k, v in pairs(values) do ++ if k:sub(1, 1) ~= "." then ++ stat = stat and self:set(config, section, k, v) ++ end ++ end ++ return stat ++end ++ ++function Cursor.get_bool(self, ...) ++ local val = self:get(...) ++ return ( val == "1" or val == "true" or val == "yes" or val == "on" ) ++end ++ ++function Cursor.get_list(self, config, section, option) ++ if config and section and option then ++ local val = self:get(config, section, option) ++ return ( type(val) == "table" and val or { val } ) ++ end ++ return nil ++end ++ ++function Cursor.get_first(self, conf, stype, opt, def) ++ local rv = def ++ ++ self:foreach(conf, stype, ++ function(s) ++ local val = not opt and s['.name'] or s[opt] ++ ++ if type(def) == "number" then ++ val = tonumber(val) ++ elseif type(def) == "boolean" then ++ val = (val == "1" or val == "true" or ++ val == "yes" or val == "on") ++ end ++ ++ if val ~= nil then ++ rv = val ++ return false ++ end ++ end) ++ ++ return rv ++end ++ ++function Cursor.set_list(self, config, section, option, value) ++ if config and section and option then ++ return self:set( ++ config, section, option, ++ ( type(value) == "table" and value or { value } ) ++ ) ++ end ++ return false ++end ++ ++-- Return a list of initscripts affected by configuration changes. ++function Cursor._affected(self, configlist) ++ configlist = type(configlist) == "table" and configlist or {configlist} ++ ++ local c = cursor() ++ c:load("ucitrack") ++ ++ -- Resolve dependencies ++ local reloadlist = {} ++ ++ local function _resolve_deps(name) ++ local reload = {name} ++ local deps = {} ++ ++ c:foreach("ucitrack", name, ++ function(section) ++ if section.affects then ++ for i, aff in ipairs(section.affects) do ++ deps[#deps+1] = aff ++ end ++ end ++ end) ++ ++ for i, dep in ipairs(deps) do ++ for j, add in ipairs(_resolve_deps(dep)) do ++ reload[#reload+1] = add ++ end ++ end ++ ++ return reload ++ end ++ ++ -- Collect initscripts ++ for j, config in ipairs(configlist) do ++ for i, e in ipairs(_resolve_deps(config)) do ++ if not util.contains(reloadlist, e) then ++ reloadlist[#reloadlist+1] = e ++ end ++ end ++ end ++ ++ return reloadlist ++end ++ ++-- curser, means it the parent unloads or loads configs, the sub state will ++-- do so as well. ++function Cursor.substate(self) ++ Cursor._substates = Cursor._substates or { } ++ Cursor._substates[self] = Cursor._substates[self] or cursor_state() ++ return Cursor._substates[self] ++end ++ ++local _load = Cursor.load ++function Cursor.load(self, ...) ++ if Cursor._substates and Cursor._substates[self] then ++ _load(Cursor._substates[self], ...) ++ end ++ return _load(self, ...) ++end ++ ++local _unload = Cursor.unload ++function Cursor.unload(self, ...) ++ if Cursor._substates and Cursor._substates[self] then ++ _unload(Cursor._substates[self], ...) ++ end ++ return _unload(self, ...) ++end ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ +diff --git a/feeds/luci/modules/luci-base/luasrc/model/uci.luadoc b/feeds/luci/modules/luci-base/luasrc/model/uci.luadoc +new file mode 100644 +index 0000000..80464f7 +--- /dev/null ++++ b/feeds/luci/modules/luci-base/luasrc/model/uci.luadoc +@@ -0,0 +1,291 @@ ++---[[ ++LuCI UCI model library. ++ ++The typical workflow for UCI is: Get a cursor instance from the ++cursor factory, modify data (via Cursor.add, Cursor.delete, etc.), ++save the changes to the staging area via Cursor.save and finally ++Cursor.commit the data to the actual config files. ++LuCI then needs to Cursor.apply the changes so deamons etc. are ++reloaded. ++@cstyle instance ++]] ++module "luci.model.uci" ++ ++---[[ ++Create a new UCI-Cursor. ++ ++@class function ++@name cursor ++@return UCI-Cursor ++]] ++ ++---[[ ++Create a new Cursor initialized to the state directory. ++ ++@class function ++@name cursor_state ++@return UCI cursor ++]] ++ ++---[[ ++Applies UCI configuration changes ++ ++@class function ++@name Cursor.apply ++@param configlist List of UCI configurations ++@param command Don't apply only return the command ++]] ++ ++---[[ ++Delete all sections of a given type that match certain criteria. ++ ++@class function ++@name Cursor.delete_all ++@param config UCI config ++@param type UCI section type ++@param comparator Function that will be called for each section and ++returns a boolean whether to delete the current section (optional) ++]] ++ ++---[[ ++Create a new section and initialize it with data. ++ ++@class function ++@name Cursor.section ++@param config UCI config ++@param type UCI section type ++@param name UCI section name (optional) ++@param values Table of key - value pairs to initialize the section with ++@return Name of created section ++]] ++ ++---[[ ++Updated the data of a section using data from a table. ++ ++@class function ++@name Cursor.tset ++@param config UCI config ++@param section UCI section name (optional) ++@param values Table of key - value pairs to update the section with ++]] ++ ++---[[ ++Get a boolean option and return it's value as true or false. ++ ++@class function ++@name Cursor.get_bool ++@param config UCI config ++@param section UCI section name ++@param option UCI option ++@return Boolean ++]] ++ ++---[[ ++Get an option or list and return values as table. ++ ++@class function ++@name Cursor.get_list ++@param config UCI config ++@param section UCI section name ++@param option UCI option ++@return UCI value ++]] ++ ++---[[ ++Get the given option from the first section with the given type. ++ ++@class function ++@name Cursor.get_first ++@param config UCI config ++@param type UCI section type ++@param option UCI option (optional) ++@param default Default value (optional) ++@return UCI value ++]] ++ ++---[[ ++Set given values as list. ++ ++@class function ++@name Cursor.set_list ++@param config UCI config ++@param section UCI section name ++@param option UCI option ++@param value UCI value ++@return Boolean whether operation succeeded ++]] ++ ++---[[ ++Create a sub-state of this cursor. The sub-state is tied to the parent ++ ++curser, means it the parent unloads or loads configs, the sub state will ++do so as well. ++@class function ++@name Cursor.substate ++@return UCI state cursor tied to the parent cursor ++]] ++ ++---[[ ++Add an anonymous section. ++ ++@class function ++@name Cursor.add ++@param config UCI config ++@param type UCI section type ++@return Name of created section ++]] ++ ++---[[ ++Get a table of saved but uncommitted changes. ++ ++@class function ++@name Cursor.changes ++@param config UCI config ++@return Table of changes ++@see Cursor.save ++]] ++ ++---[[ ++Commit saved changes. ++ ++@class function ++@name Cursor.commit ++@param config UCI config ++@return Boolean whether operation succeeded ++@see Cursor.revert ++@see Cursor.save ++]] ++ ++---[[ ++Deletes a section or an option. ++ ++@class function ++@name Cursor.delete ++@param config UCI config ++@param section UCI section name ++@param option UCI option (optional) ++@return Boolean whether operation succeeded ++]] ++ ++---[[ ++Call a function for every section of a certain type. ++ ++@class function ++@name Cursor.foreach ++@param config UCI config ++@param type UCI section type ++@param callback Function to be called ++@return Boolean whether operation succeeded ++]] ++ ++---[[ ++Get a section type or an option ++ ++@class function ++@name Cursor.get ++@param config UCI config ++@param section UCI section name ++@param option UCI option (optional) ++@return UCI value ++]] ++ ++---[[ ++Get all sections of a config or all values of a section. ++ ++@class function ++@name Cursor.get_all ++@param config UCI config ++@param section UCI section name (optional) ++@return Table of UCI sections or table of UCI values ++]] ++ ++---[[ ++Manually load a config. ++ ++@class function ++@name Cursor.load ++@param config UCI config ++@return Boolean whether operation succeeded ++@see Cursor.save ++@see Cursor.unload ++]] ++ ++---[[ ++Revert saved but uncommitted changes. ++ ++@class function ++@name Cursor.revert ++@param config UCI config ++@return Boolean whether operation succeeded ++@see Cursor.commit ++@see Cursor.save ++]] ++ ++---[[ ++Saves changes made to a config to make them committable. ++ ++@class function ++@name Cursor.save ++@param config UCI config ++@return Boolean whether operation succeeded ++@see Cursor.load ++@see Cursor.unload ++]] ++ ++---[[ ++Set a value or create a named section. ++ ++@class function ++@name Cursor.set ++@param config UCI config ++@param section UCI section name ++@param option UCI option or UCI section type ++@param value UCI value or nil if you want to create a section ++@return Boolean whether operation succeeded ++]] ++ ++---[[ ++Get the configuration directory. ++ ++@class function ++@name Cursor.get_confdir ++@return Configuration directory ++]] ++ ++---[[ ++Get the directory for uncomitted changes. ++ ++@class function ++@name Cursor.get_savedir ++@return Save directory ++]] ++ ++---[[ ++Set the configuration directory. ++ ++@class function ++@name Cursor.set_confdir ++@param directory UCI configuration directory ++@return Boolean whether operation succeeded ++]] ++ ++---[[ ++Set the directory for uncommited changes. ++ ++@class function ++@name Cursor.set_savedir ++@param directory UCI changes directory ++@return Boolean whether operation succeeded ++]] ++ ++---[[ ++Discard changes made to a config. ++ ++@class function ++@name Cursor.unload ++@param config UCI config ++@return Boolean whether operation succeeded ++@see Cursor.load ++@see Cursor.save ++]] ++ +diff --git a/feeds/luci/modules/luci-base/luasrc/sgi/cgi.lua b/feeds/luci/modules/luci-base/luasrc/sgi/cgi.lua +new file mode 100644 +index 0000000..68ae17a +--- /dev/null ++++ b/feeds/luci/modules/luci-base/luasrc/sgi/cgi.lua +@@ -0,0 +1,73 @@ ++-- Copyright 2008 Steven Barth ++-- Licensed to the public under the Apache License 2.0. ++ ++exectime = os.clock() ++module("luci.sgi.cgi", package.seeall) ++local ltn12 = require("luci.ltn12") ++require("nixio.util") ++require("luci.http") ++require("luci.sys") ++require("luci.dispatcher") ++ ++-- Limited source to avoid endless blocking ++local function limitsource(handle, limit) ++ limit = limit or 0 ++ local BLOCKSIZE = ltn12.BLOCKSIZE ++ ++ return function() ++ if limit < 1 then ++ handle:close() ++ return nil ++ else ++ local read = (limit > BLOCKSIZE) and BLOCKSIZE or limit ++ limit = limit - read ++ ++ local chunk = handle:read(read) ++ if not chunk then handle:close() end ++ return chunk ++ end ++ end ++end ++ ++function run() ++ local r = luci.http.Request( ++ luci.sys.getenv(), ++ limitsource(io.stdin, tonumber(luci.sys.getenv("CONTENT_LENGTH"))), ++ ltn12.sink.file(io.stderr) ++ ) ++ ++ local x = coroutine.create(luci.dispatcher.httpdispatch) ++ local hcache = "" ++ local active = true ++ ++ while coroutine.status(x) ~= "dead" do ++ local res, id, data1, data2 = coroutine.resume(x, r) ++ ++ if not res then ++ print("Status: 500 Internal Server Error") ++ print("Content-Type: text/plain\n") ++ print(id) ++ break; ++ end ++ ++ if active then ++ if id == 1 then ++ io.write("Status: " .. tostring(data1) .. " " .. data2 .. "\r\n") ++ elseif id == 2 then ++ hcache = hcache .. data1 .. ": " .. data2 .. "\r\n" ++ elseif id == 3 then ++ io.write(hcache) ++ io.write("\r\n") ++ elseif id == 4 then ++ io.write(tostring(data1 or "")) ++ elseif id == 5 then ++ io.flush() ++ io.close() ++ active = false ++ elseif id == 6 then ++ data1:copyz(nixio.stdout, data2) ++ data1:close() ++ end ++ end ++ end ++end +diff --git a/feeds/luci/modules/luci-base/luasrc/sgi/uhttpd.lua b/feeds/luci/modules/luci-base/luasrc/sgi/uhttpd.lua +new file mode 100644 +index 0000000..2836bf0 +--- /dev/null ++++ b/feeds/luci/modules/luci-base/luasrc/sgi/uhttpd.lua +@@ -0,0 +1,89 @@ ++-- Copyright 2010 Jo-Philipp Wich ++-- Licensed to the public under the Apache License 2.0. ++ ++require "nixio.util" ++require "luci.http" ++require "luci.sys" ++require "luci.dispatcher" ++require "luci.ltn12" ++ ++function handle_request(env) ++ exectime = os.clock() ++ local renv = { ++ CONTENT_LENGTH = env.CONTENT_LENGTH, ++ CONTENT_TYPE = env.CONTENT_TYPE, ++ REQUEST_METHOD = env.REQUEST_METHOD, ++ REQUEST_URI = env.REQUEST_URI, ++ PATH_INFO = env.PATH_INFO, ++ SCRIPT_NAME = env.SCRIPT_NAME:gsub("/+$", ""), ++ SCRIPT_FILENAME = env.SCRIPT_NAME, ++ SERVER_PROTOCOL = env.SERVER_PROTOCOL, ++ QUERY_STRING = env.QUERY_STRING ++ } ++ ++ local k, v ++ for k, v in pairs(env.headers) do ++ k = k:upper():gsub("%-", "_") ++ renv["HTTP_" .. k] = v ++ end ++ ++ local len = tonumber(env.CONTENT_LENGTH) or 0 ++ local function recv() ++ if len > 0 then ++ local rlen, rbuf = uhttpd.recv(4096) ++ if rlen >= 0 then ++ len = len - rlen ++ return rbuf ++ end ++ end ++ return nil ++ end ++ ++ local send = uhttpd.send ++ ++ local req = luci.http.Request( ++ renv, recv, luci.ltn12.sink.file(io.stderr) ++ ) ++ ++ ++ local x = coroutine.create(luci.dispatcher.httpdispatch) ++ local hcache = { } ++ local active = true ++ ++ while coroutine.status(x) ~= "dead" do ++ local res, id, data1, data2 = coroutine.resume(x, req) ++ ++ if not res then ++ send("Status: 500 Internal Server Error\r\n") ++ send("Content-Type: text/plain\r\n\r\n") ++ send(tostring(id)) ++ break ++ end ++ ++ if active then ++ if id == 1 then ++ send("Status: ") ++ send(tostring(data1)) ++ send(" ") ++ send(tostring(data2)) ++ send("\r\n") ++ elseif id == 2 then ++ hcache[data1] = data2 ++ elseif id == 3 then ++ for k, v in pairs(hcache) do ++ send(tostring(k)) ++ send(": ") ++ send(tostring(v)) ++ send("\r\n") ++ end ++ send("\r\n") ++ elseif id == 4 then ++ send(tostring(data1 or "")) ++ elseif id == 5 then ++ active = false ++ elseif id == 6 then ++ data1:copyz(nixio.stdout, data2) ++ end ++ end ++ end ++end +diff --git a/feeds/luci/modules/luci-base/luasrc/store.lua b/feeds/luci/modules/luci-base/luasrc/store.lua +new file mode 100644 +index 0000000..34eb296 +--- /dev/null ++++ b/feeds/luci/modules/luci-base/luasrc/store.lua +@@ -0,0 +1,6 @@ ++-- Copyright 2009 Steven Barth ++-- Copyright 2009 Jo-Philipp Wich ++-- Licensed to the public under the Apache License 2.0. ++ ++local util = require "luci.util" ++module("luci.store", util.threadlocal) +\ No newline at end of file +diff --git a/feeds/luci/modules/luci-base/luasrc/sys.lua b/feeds/luci/modules/luci-base/luasrc/sys.lua +new file mode 100644 +index 0000000..3977da3 +--- /dev/null ++++ b/feeds/luci/modules/luci-base/luasrc/sys.lua +@@ -0,0 +1,692 @@ ++-- Copyright 2008 Steven Barth ++-- Licensed to the public under the Apache License 2.0. ++ ++local io = require "io" ++local os = require "os" ++local table = require "table" ++local nixio = require "nixio" ++local fs = require "nixio.fs" ++local uci = require "luci.model.uci" ++ ++local luci = {} ++luci.util = require "luci.util" ++luci.ip = require "luci.ip" ++ ++local tonumber, ipairs, pairs, pcall, type, next, setmetatable, require, select = ++ tonumber, ipairs, pairs, pcall, type, next, setmetatable, require, select ++ ++ ++module "luci.sys" ++ ++function call(...) ++ return os.execute(...) / 256 ++end ++ ++exec = luci.util.exec ++ ++function mounts() ++ local data = {} ++ local k = {"fs", "blocks", "used", "available", "percent", "mountpoint"} ++ local ps = luci.util.execi("df") ++ ++ if not ps then ++ return ++ else ++ ps() ++ end ++ ++ for line in ps do ++ local row = {} ++ ++ local j = 1 ++ for value in line:gmatch("[^%s]+") do ++ row[k[j]] = value ++ j = j + 1 ++ end ++ ++ if row[k[1]] then ++ ++ -- this is a rather ugly workaround to cope with wrapped lines in ++ -- the df output: ++ -- ++ -- /dev/scsi/host0/bus0/target0/lun0/part3 ++ -- 114382024 93566472 15005244 86% /mnt/usb ++ -- ++ ++ if not row[k[2]] then ++ j = 2 ++ line = ps() ++ for value in line:gmatch("[^%s]+") do ++ row[k[j]] = value ++ j = j + 1 ++ end ++ end ++ ++ table.insert(data, row) ++ end ++ end ++ ++ return data ++end ++ ++-- containing the whole environment is returned otherwise this function returns ++-- the corresponding string value for the given name or nil if no such variable ++-- exists. ++getenv = nixio.getenv ++ ++function hostname(newname) ++ if type(newname) == "string" and #newname > 0 then ++ fs.writefile( "/proc/sys/kernel/hostname", newname ) ++ return newname ++ else ++ return nixio.uname().nodename ++ end ++end ++ ++function httpget(url, stream, target) ++ if not target then ++ local source = stream and io.popen or luci.util.exec ++ return source("wget -qO- '"..url:gsub("'", "").."'") ++ else ++ return os.execute("wget -qO '%s' '%s'" % ++ {target:gsub("'", ""), url:gsub("'", "")}) ++ end ++end ++ ++function reboot() ++ return os.execute("reboot >/dev/null 2>&1") ++end ++ ++function syslog() ++ return luci.util.exec("logread") ++end ++ ++function dmesg() ++ return luci.util.exec("dmesg") ++end ++ ++function uniqueid(bytes) ++ local rand = fs.readfile("/dev/urandom", bytes) ++ return rand and nixio.bin.hexlify(rand) ++end ++ ++function uptime() ++ return nixio.sysinfo().uptime ++end ++ ++ ++net = {} ++ ++-- The following fields are defined for arp entry objects: ++-- { "IP address", "HW address", "HW type", "Flags", "Mask", "Device" } ++function net.arptable(callback) ++ local arp = (not callback) and {} or nil ++ local e, r, v ++ if fs.access("/proc/net/arp") then ++ for e in io.lines("/proc/net/arp") do ++ local r = { }, v ++ for v in e:gmatch("%S+") do ++ r[#r+1] = v ++ end ++ ++ if r[1] ~= "IP" then ++ local x = { ++ ["IP address"] = r[1], ++ ["HW type"] = r[2], ++ ["Flags"] = r[3], ++ ["HW address"] = r[4], ++ ["Mask"] = r[5], ++ ["Device"] = r[6] ++ } ++ ++ if callback then ++ callback(x) ++ else ++ arp = arp or { } ++ arp[#arp+1] = x ++ end ++ end ++ end ++ end ++ return arp ++end ++ ++local function _nethints(what, callback) ++ local _, k, e, mac, ip, name ++ local cur = uci.cursor() ++ local ifn = { } ++ local hosts = { } ++ ++ local function _add(i, ...) ++ local k = select(i, ...) ++ if k then ++ if not hosts[k] then hosts[k] = { } end ++ hosts[k][1] = select(1, ...) or hosts[k][1] ++ hosts[k][2] = select(2, ...) or hosts[k][2] ++ hosts[k][3] = select(3, ...) or hosts[k][3] ++ hosts[k][4] = select(4, ...) or hosts[k][4] ++ end ++ end ++ ++ if fs.access("/proc/net/arp") then ++ for e in io.lines("/proc/net/arp") do ++ ip, mac = e:match("^([%d%.]+)%s+%S+%s+%S+%s+([a-fA-F0-9:]+)%s+") ++ if ip and mac then ++ _add(what, mac:upper(), ip, nil, nil) ++ end ++ end ++ end ++ ++ if fs.access("/etc/ethers") then ++ for e in io.lines("/etc/ethers") do ++ mac, ip = e:match("^([a-f0-9]%S+) (%S+)") ++ if mac and ip then ++ _add(what, mac:upper(), ip, nil, nil) ++ end ++ end ++ end ++ ++ if fs.access("/var/dhcp.leases") then ++ for e in io.lines("/var/dhcp.leases") do ++ mac, ip, name = e:match("^%d+ (%S+) (%S+) (%S+)") ++ if mac and ip then ++ _add(what, mac:upper(), ip, nil, name ~= "*" and name) ++ end ++ end ++ end ++ ++ cur:foreach("dhcp", "host", ++ function(s) ++ for mac in luci.util.imatch(s.mac) do ++ _add(what, mac:upper(), s.ip, nil, s.name) ++ end ++ end) ++ ++ for _, e in ipairs(nixio.getifaddrs()) do ++ if e.name ~= "lo" then ++ ifn[e.name] = ifn[e.name] or { } ++ if e.family == "packet" and e.addr and #e.addr == 17 then ++ ifn[e.name][1] = e.addr:upper() ++ elseif e.family == "inet" then ++ ifn[e.name][2] = e.addr ++ elseif e.family == "inet6" then ++ ifn[e.name][3] = e.addr ++ end ++ end ++ end ++ ++ for _, e in pairs(ifn) do ++ if e[what] and (e[2] or e[3]) then ++ _add(what, e[1], e[2], e[3], e[4]) ++ end ++ end ++ ++ for _, e in luci.util.kspairs(hosts) do ++ callback(e[1], e[2], e[3], e[4]) ++ end ++end ++ ++-- Each entry contains the values in the following order: ++-- [ "mac", "name" ] ++function net.mac_hints(callback) ++ if callback then ++ _nethints(1, function(mac, v4, v6, name) ++ name = name or nixio.getnameinfo(v4 or v6, nil, 100) or v4 ++ if name and name ~= mac then ++ callback(mac, name or nixio.getnameinfo(v4 or v6, nil, 100) or v4) ++ end ++ end) ++ else ++ local rv = { } ++ _nethints(1, function(mac, v4, v6, name) ++ name = name or nixio.getnameinfo(v4 or v6, nil, 100) or v4 ++ if name and name ~= mac then ++ rv[#rv+1] = { mac, name or nixio.getnameinfo(v4 or v6, nil, 100) or v4 } ++ end ++ end) ++ return rv ++ end ++end ++ ++-- Each entry contains the values in the following order: ++-- [ "ip", "name" ] ++function net.ipv4_hints(callback) ++ if callback then ++ _nethints(2, function(mac, v4, v6, name) ++ name = name or nixio.getnameinfo(v4, nil, 100) or mac ++ if name and name ~= v4 then ++ callback(v4, name) ++ end ++ end) ++ else ++ local rv = { } ++ _nethints(2, function(mac, v4, v6, name) ++ name = name or nixio.getnameinfo(v4, nil, 100) or mac ++ if name and name ~= v4 then ++ rv[#rv+1] = { v4, name } ++ end ++ end) ++ return rv ++ end ++end ++ ++-- Each entry contains the values in the following order: ++-- [ "ip", "name" ] ++function net.ipv6_hints(callback) ++ if callback then ++ _nethints(3, function(mac, v4, v6, name) ++ name = name or nixio.getnameinfo(v6, nil, 100) or mac ++ if name and name ~= v6 then ++ callback(v6, name) ++ end ++ end) ++ else ++ local rv = { } ++ _nethints(3, function(mac, v4, v6, name) ++ name = name or nixio.getnameinfo(v6, nil, 100) or mac ++ if name and name ~= v6 then ++ rv[#rv+1] = { v6, name } ++ end ++ end) ++ return rv ++ end ++end ++ ++function net.conntrack(callback) ++ local connt = {} ++ if fs.access("/proc/net/nf_conntrack", "r") then ++ for line in io.lines("/proc/net/nf_conntrack") do ++ line = line:match "^(.-( [^ =]+=).-)%2" ++ local entry, flags = _parse_mixed_record(line, " +") ++ if flags[6] ~= "TIME_WAIT" then ++ entry.layer3 = flags[1] ++ entry.layer4 = flags[3] ++ for i=1, #entry do ++ entry[i] = nil ++ end ++ ++ if callback then ++ callback(entry) ++ else ++ connt[#connt+1] = entry ++ end ++ end ++ end ++ elseif fs.access("/proc/net/ip_conntrack", "r") then ++ for line in io.lines("/proc/net/ip_conntrack") do ++ line = line:match "^(.-( [^ =]+=).-)%2" ++ local entry, flags = _parse_mixed_record(line, " +") ++ if flags[4] ~= "TIME_WAIT" then ++ entry.layer3 = "ipv4" ++ entry.layer4 = flags[1] ++ for i=1, #entry do ++ entry[i] = nil ++ end ++ ++ if callback then ++ callback(entry) ++ else ++ connt[#connt+1] = entry ++ end ++ end ++ end ++ else ++ return nil ++ end ++ return connt ++end ++ ++function net.devices() ++ local devs = {} ++ for k, v in ipairs(nixio.getifaddrs()) do ++ if v.family == "packet" then ++ devs[#devs+1] = v.name ++ end ++ end ++ return devs ++end ++ ++ ++function net.deviceinfo() ++ local devs = {} ++ for k, v in ipairs(nixio.getifaddrs()) do ++ if v.family == "packet" then ++ local d = v.data ++ d[1] = d.rx_bytes ++ d[2] = d.rx_packets ++ d[3] = d.rx_errors ++ d[4] = d.rx_dropped ++ d[5] = 0 ++ d[6] = 0 ++ d[7] = 0 ++ d[8] = d.multicast ++ d[9] = d.tx_bytes ++ d[10] = d.tx_packets ++ d[11] = d.tx_errors ++ d[12] = d.tx_dropped ++ d[13] = 0 ++ d[14] = d.collisions ++ d[15] = 0 ++ d[16] = 0 ++ devs[v.name] = d ++ end ++ end ++ return devs ++end ++ ++ ++-- The following fields are defined for route entry tables: ++-- { "dest", "gateway", "metric", "refcount", "usecount", "irtt", ++-- "flags", "device" } ++function net.routes(callback) ++ local routes = { } ++ ++ for line in io.lines("/proc/net/route") do ++ ++ local dev, dst_ip, gateway, flags, refcnt, usecnt, metric, ++ dst_mask, mtu, win, irtt = line:match( ++ "([^%s]+)\t([A-F0-9]+)\t([A-F0-9]+)\t([A-F0-9]+)\t" .. ++ "(%d+)\t(%d+)\t(%d+)\t([A-F0-9]+)\t(%d+)\t(%d+)\t(%d+)" ++ ) ++ ++ if dev then ++ gateway = luci.ip.Hex( gateway, 32, luci.ip.FAMILY_INET4 ) ++ dst_mask = luci.ip.Hex( dst_mask, 32, luci.ip.FAMILY_INET4 ) ++ dst_ip = luci.ip.Hex( ++ dst_ip, dst_mask:prefix(dst_mask), luci.ip.FAMILY_INET4 ++ ) ++ ++ local rt = { ++ dest = dst_ip, ++ gateway = gateway, ++ metric = tonumber(metric), ++ refcount = tonumber(refcnt), ++ usecount = tonumber(usecnt), ++ mtu = tonumber(mtu), ++ window = tonumber(window), ++ irtt = tonumber(irtt), ++ flags = tonumber(flags, 16), ++ device = dev ++ } ++ ++ if callback then ++ callback(rt) ++ else ++ routes[#routes+1] = rt ++ end ++ end ++ end ++ ++ return routes ++end ++ ++-- The following fields are defined for route entry tables: ++-- { "source", "dest", "nexthop", "metric", "refcount", "usecount", ++-- "flags", "device" } ++function net.routes6(callback) ++ if fs.access("/proc/net/ipv6_route", "r") then ++ local routes = { } ++ ++ for line in io.lines("/proc/net/ipv6_route") do ++ ++ local dst_ip, dst_prefix, src_ip, src_prefix, nexthop, ++ metric, refcnt, usecnt, flags, dev = line:match( ++ "([a-f0-9]+) ([a-f0-9]+) " .. ++ "([a-f0-9]+) ([a-f0-9]+) " .. ++ "([a-f0-9]+) ([a-f0-9]+) " .. ++ "([a-f0-9]+) ([a-f0-9]+) " .. ++ "([a-f0-9]+) +([^%s]+)" ++ ) ++ ++ if dst_ip and dst_prefix and ++ src_ip and src_prefix and ++ nexthop and metric and ++ refcnt and usecnt and ++ flags and dev ++ then ++ src_ip = luci.ip.Hex( ++ src_ip, tonumber(src_prefix, 16), luci.ip.FAMILY_INET6, false ++ ) ++ ++ dst_ip = luci.ip.Hex( ++ dst_ip, tonumber(dst_prefix, 16), luci.ip.FAMILY_INET6, false ++ ) ++ ++ nexthop = luci.ip.Hex( nexthop, 128, luci.ip.FAMILY_INET6, false ) ++ ++ local rt = { ++ source = src_ip, ++ dest = dst_ip, ++ nexthop = nexthop, ++ metric = tonumber(metric, 16), ++ refcount = tonumber(refcnt, 16), ++ usecount = tonumber(usecnt, 16), ++ flags = tonumber(flags, 16), ++ device = dev, ++ ++ -- lua number is too small for storing the metric ++ -- add a metric_raw field with the original content ++ metric_raw = metric ++ } ++ ++ if callback then ++ callback(rt) ++ else ++ routes[#routes+1] = rt ++ end ++ end ++ end ++ ++ return routes ++ end ++end ++ ++function net.pingtest(host) ++ return os.execute("ping -c1 '"..host:gsub("'", '').."' >/dev/null 2>&1") ++end ++ ++ ++process = {} ++ ++function process.info(key) ++ local s = {uid = nixio.getuid(), gid = nixio.getgid()} ++ return not key and s or s[key] ++end ++ ++function process.list() ++ local data = {} ++ local k ++ local ps = luci.util.execi("/bin/busybox top -bn1") ++ ++ if not ps then ++ return ++ end ++ ++ for line in ps do ++ local pid, ppid, user, stat, vsz, mem, cpu, cmd = line:match( ++ "^ *(%d+) +(%d+) +(%S.-%S) +([RSDZTW][W ][/dev/null 2>&1" ++ ) ++end ++ ++ ++wifi = {} ++ ++function wifi.getiwinfo(ifname) ++ local stat, iwinfo = pcall(require, "iwinfo") ++ ++ if ifname then ++ local c = 0 ++ local u = uci.cursor_state() ++ local d, n = ifname:match("^(%w+)%.network(%d+)") ++ if d and n then ++ ifname = d ++ n = tonumber(n) ++ u:foreach("wireless", "wifi-iface", ++ function(s) ++ if s.device == d then ++ c = c + 1 ++ if c == n then ++ ifname = s.ifname or s.device ++ return false ++ end ++ end ++ end) ++ elseif u:get("wireless", ifname) == "wifi-device" then ++ u:foreach("wireless", "wifi-iface", ++ function(s) ++ if s.device == ifname and s.ifname then ++ ifname = s.ifname ++ return false ++ end ++ end) ++ end ++ ++ local t = stat and iwinfo.type(ifname) ++ local x = t and iwinfo[t] or { } ++ return setmetatable({}, { ++ __index = function(t, k) ++ if k == "ifname" then ++ return ifname ++ elseif x[k] then ++ return x[k](ifname) ++ end ++ end ++ }) ++ end ++end ++ ++ ++init = {} ++init.dir = "/etc/init.d/" ++ ++function init.names() ++ local names = { } ++ for name in fs.glob(init.dir.."*") do ++ names[#names+1] = fs.basename(name) ++ end ++ return names ++end ++ ++function init.index(name) ++ if fs.access(init.dir..name) then ++ return call("env -i sh -c 'source %s%s enabled; exit ${START:-255}' >/dev/null" ++ %{ init.dir, name }) ++ end ++end ++ ++local function init_action(action, name) ++ if fs.access(init.dir..name) then ++ return call("env -i %s%s %s >/dev/null" %{ init.dir, name, action }) ++ end ++end ++ ++function init.enabled(name) ++ return (init_action("enabled", name) == 0) ++end ++ ++function init.enable(name) ++ return (init_action("enable", name) == 1) ++end ++ ++function init.disable(name) ++ return (init_action("disable", name) == 0) ++end ++ ++function init.start(name) ++ return (init_action("start", name) == 0) ++end ++ ++function init.stop(name) ++ return (init_action("stop", name) == 0) ++end ++ ++ ++-- Internal functions ++ ++function _parse_mixed_record(cnt, delimiter) ++ delimiter = delimiter or " " ++ local data = {} ++ local flags = {} ++ ++ for i, l in pairs(luci.util.split(luci.util.trim(cnt), "\n")) do ++ for j, f in pairs(luci.util.split(luci.util.trim(l), delimiter, nil, true)) do ++ local k, x, v = f:match('([^%s][^:=]*) *([:=]*) *"*([^\n"]*)"*') ++ ++ if k then ++ if x == "" then ++ table.insert(flags, k) ++ else ++ data[k] = v ++ end ++ end ++ end ++ end ++ ++ return data, flags ++end +diff --git a/feeds/luci/modules/luci-base/luasrc/sys.luadoc b/feeds/luci/modules/luci-base/luasrc/sys.luadoc +new file mode 100644 +index 0000000..54be349 +--- /dev/null ++++ b/feeds/luci/modules/luci-base/luasrc/sys.luadoc +@@ -0,0 +1,395 @@ ++---[[ ++LuCI Linux and POSIX system utilities. ++]] ++module "luci.sys" ++ ++---[[ ++Execute a given shell command and return the error code ++ ++@class function ++@name call ++@param ... Command to call ++@return Error code of the command ++]] ++ ++---[[ ++Execute a given shell command and capture its standard output ++ ++@class function ++@name exec ++@param command Command to call ++@return String containg the return the output of the command ++]] ++ ++---[[ ++Retrieve information about currently mounted file systems. ++ ++@class function ++@name mounts ++@return Table containing mount information ++]] ++ ++---[[ ++Retrieve environment variables. If no variable is given then a table ++ ++containing the whole environment is returned otherwise this function returns ++the corresponding string value for the given name or nil if no such variable ++exists. ++@class function ++@name getenv ++@param var Name of the environment variable to retrieve (optional) ++@return String containg the value of the specified variable ++@return Table containing all variables if no variable name is given ++]] ++ ++---[[ ++Get or set the current hostname. ++ ++@class function ++@name hostname ++@param String containing a new hostname to set (optional) ++@return String containing the system hostname ++]] ++ ++---[[ ++Returns the contents of a documented referred by an URL. ++ ++@class function ++@name httpget ++@param url The URL to retrieve ++@param stream Return a stream instead of a buffer ++@param target Directly write to target file name ++@return String containing the contents of given the URL ++]] ++ ++---[[ ++Initiate a system reboot. ++ ++@class function ++@name reboot ++@return Return value of os.execute() ++]] ++ ++---[[ ++Retrieves the output of the "logread" command. ++ ++@class function ++@name syslog ++@return String containing the current log buffer ++]] ++ ++---[[ ++Retrieves the output of the "dmesg" command. ++ ++@class function ++@name dmesg ++@return String containing the current log buffer ++]] ++ ++---[[ ++Generates a random id with specified length. ++ ++@class function ++@name uniqueid ++@param bytes Number of bytes for the unique id ++@return String containing hex encoded id ++]] ++ ++---[[ ++Returns the current system uptime stats. ++ ++@class function ++@name uptime ++@return String containing total uptime in seconds ++]] ++ ++---[[ ++LuCI system utilities / network related functions. ++ ++@class module ++@name luci.sys.net ++]] ++ ++---[[ ++Returns the current arp-table entries as two-dimensional table. ++ ++@class function ++@name net.arptable ++@return Table of table containing the current arp entries. ++-- The following fields are defined for arp entry objects: ++-- { "IP address", "HW address", "HW type", "Flags", "Mask", "Device" } ++]] ++ ++---[[ ++Returns a two-dimensional table of mac address hints. ++ ++@class function ++@name net.mac_hints ++@return Table of table containing known hosts from various sources. ++ Each entry contains the values in the following order: ++ [ "mac", "name" ] ++]] ++ ++---[[ ++Returns a two-dimensional table of IPv4 address hints. ++ ++@class function ++@name net.ipv4_hints ++@return Table of table containing known hosts from various sources. ++ Each entry contains the values in the following order: ++ [ "ip", "name" ] ++]] ++ ++---[[ ++Returns a two-dimensional table of IPv6 address hints. ++ ++@class function ++@name net.ipv6_hints ++@return Table of table containing known hosts from various sources. ++ Each entry contains the values in the following order: ++ [ "ip", "name" ] ++]] ++ ++---[[ ++Returns conntrack information ++ ++@class function ++@name net.conntrack ++@return Table with the currently tracked IP connections ++]] ++ ++---[[ ++Determine the names of available network interfaces. ++ ++@class function ++@name net.devices ++@return Table containing all current interface names ++]] ++ ++---[[ ++Return information about available network interfaces. ++ ++@class function ++@name net.deviceinfo ++@return Table containing all current interface names and their information ++]] ++ ++---[[ ++Returns the current kernel routing table entries. ++ ++@class function ++@name net.routes ++@return Table of tables with properties of the corresponding routes. ++-- The following fields are defined for route entry tables: ++-- { "dest", "gateway", "metric", "refcount", "usecount", "irtt", ++-- "flags", "device" } ++]] ++ ++---[[ ++Returns the current ipv6 kernel routing table entries. ++ ++@class function ++@name net.routes6 ++@return Table of tables with properties of the corresponding routes. ++-- The following fields are defined for route entry tables: ++-- { "source", "dest", "nexthop", "metric", "refcount", "usecount", ++-- "flags", "device" } ++]] ++ ++---[[ ++Tests whether the given host responds to ping probes. ++ ++@class function ++@name net.pingtest ++@param host String containing a hostname or IPv4 address ++@return Number containing 0 on success and >= 1 on error ++]] ++ ++---[[ ++LuCI system utilities / process related functions. ++ ++@class module ++@name luci.sys.process ++]] ++ ++---[[ ++Get the current process id. ++ ++@class function ++@name process.info ++@return Number containing the current pid ++]] ++ ++---[[ ++Retrieve information about currently running processes. ++ ++@class function ++@name process.list ++@return Table containing process information ++]] ++ ++---[[ ++Set the gid of a process identified by given pid. ++ ++@class function ++@name process.setgroup ++@param gid Number containing the Unix group id ++@return Boolean indicating successful operation ++@return String containing the error message if failed ++@return Number containing the error code if failed ++]] ++ ++---[[ ++Set the uid of a process identified by given pid. ++ ++@class function ++@name process.setuser ++@param uid Number containing the Unix user id ++@return Boolean indicating successful operation ++@return String containing the error message if failed ++@return Number containing the error code if failed ++]] ++ ++---[[ ++Send a signal to a process identified by given pid. ++ ++@class function ++@name process.signal ++@param pid Number containing the process id ++@param sig Signal to send (default: 15 [SIGTERM]) ++@return Boolean indicating successful operation ++@return Number containing the error code if failed ++]] ++ ++---[[ ++LuCI system utilities / user related functions. ++ ++@class module ++@name luci.sys.user ++]] ++ ++---[[ ++Retrieve user informations for given uid. ++ ++@class function ++@name getuser ++@param uid Number containing the Unix user id ++@return Table containing the following fields: ++-- { "uid", "gid", "name", "passwd", "dir", "shell", "gecos" } ++]] ++ ++---[[ ++Retrieve the current user password hash. ++ ++@class function ++@name user.getpasswd ++@param username String containing the username to retrieve the password for ++@return String containing the hash or nil if no password is set. ++@return Password database entry ++]] ++ ++---[[ ++Test whether given string matches the password of a given system user. ++ ++@class function ++@name user.checkpasswd ++@param username String containing the Unix user name ++@param pass String containing the password to compare ++@return Boolean indicating wheather the passwords are equal ++]] ++ ++---[[ ++Change the password of given user. ++ ++@class function ++@name user.setpasswd ++@param username String containing the Unix user name ++@param password String containing the password to compare ++@return Number containing 0 on success and >= 1 on error ++]] ++ ++---[[ ++LuCI system utilities / wifi related functions. ++ ++@class module ++@name luci.sys.wifi ++]] ++ ++---[[ ++Get wireless information for given interface. ++ ++@class function ++@name wifi.getiwinfo ++@param ifname String containing the interface name ++@return A wrapped iwinfo object instance ++]] ++ ++---[[ ++LuCI system utilities / init related functions. ++ ++@class module ++@name luci.sys.init ++]] ++ ++---[[ ++Get the names of all installed init scripts ++ ++@class function ++@name init.names ++@return Table containing the names of all inistalled init scripts ++]] ++ ++---[[ ++Get the index of he given init script ++ ++@class function ++@name init.index ++@param name Name of the init script ++@return Numeric index value ++]] ++ ++---[[ ++Test whether the given init script is enabled ++ ++@class function ++@name init.enabled ++@param name Name of the init script ++@return Boolean indicating whether init is enabled ++]] ++ ++---[[ ++Enable the given init script ++ ++@class function ++@name init.enable ++@param name Name of the init script ++@return Boolean indicating success ++]] ++ ++---[[ ++Disable the given init script ++ ++@class function ++@name init.disable ++@param name Name of the init script ++@return Boolean indicating success ++]] ++ ++---[[ ++Start the given init script ++ ++@class function ++@name init.start ++@param name Name of the init script ++@return Boolean indicating success ++]] ++ ++---[[ ++Stop the given init script ++ ++@class function ++@name init.stop ++@param name Name of the init script ++@return Boolean indicating success ++]] ++ +diff --git a/feeds/luci/modules/luci-base/luasrc/sys/iptparser.lua b/feeds/luci/modules/luci-base/luasrc/sys/iptparser.lua +new file mode 100644 +index 0000000..2b81e0e +--- /dev/null ++++ b/feeds/luci/modules/luci-base/luasrc/sys/iptparser.lua +@@ -0,0 +1,349 @@ ++--[[ ++ ++Iptables parser and query library ++(c) 2008-2009 Jo-Philipp Wich ++(c) 2008-2009 Steven Barth ++ ++Licensed under the Apache License, Version 2.0 (the "License"); ++you may not use this file except in compliance with the License. ++You may obtain a copy of the License at ++ ++ http://www.apache.org/licenses/LICENSE-2.0 ++ ++$Id$ ++ ++]]-- ++ ++local luci = {} ++luci.util = require "luci.util" ++luci.sys = require "luci.sys" ++luci.ip = require "luci.ip" ++ ++local tonumber, ipairs, table = tonumber, ipairs, table ++ ++module("luci.sys.iptparser") ++ ++IptParser = luci.util.class() ++ ++function IptParser.__init__( self, family ) ++ self._family = (tonumber(family) == 6) and 6 or 4 ++ self._rules = { } ++ self._chains = { } ++ ++ if self._family == 4 then ++ self._nulladdr = "0.0.0.0/0" ++ self._tables = { "filter", "nat", "mangle", "raw" } ++ self._command = "iptables -t %s --line-numbers -nxvL" ++ else ++ self._nulladdr = "::/0" ++ self._tables = { "filter", "mangle", "raw" } ++ self._command = "ip6tables -t %s --line-numbers -nxvL" ++ end ++ ++ self:_parse_rules() ++end ++ ++-- search criteria as only argument. If args is nil or an empty table then all ++-- rules will be returned. ++-- ++-- The following keys in the args table are recognized: ++--
      ++--
    • table - Match rules that are located within the given table ++--
    • chain - Match rules that are located within the given chain ++--
    • target - Match rules with the given target ++--
    • protocol - Match rules that match the given protocol, rules with ++-- protocol "all" are always matched ++--
    • source - Match rules with the given source, rules with source ++-- "0.0.0.0/0" (::/0) are always matched ++--
    • destination - Match rules with the given destination, rules with ++-- destination "0.0.0.0/0" (::/0) are always matched ++--
    • inputif - Match rules with the given input interface, rules ++-- with input interface "*" (=all) are always matched ++--
    • outputif - Match rules with the given output interface, rules ++-- with output interface "*" (=all) are always matched ++--
    • flags - Match rules that match the given flags, current ++-- supported values are "-f" (--fragment) ++-- and "!f" (! --fragment) ++--
    • options - Match rules containing all given options ++--
    ++-- The return value is a list of tables representing the matched rules. ++-- Each rule table contains the following fields: ++--
      ++--
    • index - The index number of the rule ++--
    • table - The table where the rule is located, can be one ++-- of "filter", "nat" or "mangle" ++--
    • chain - The chain where the rule is located, e.g. "INPUT" ++-- or "postrouting_wan" ++--
    • target - The rule target, e.g. "REJECT" or "DROP" ++--
    • protocol The matching protocols, e.g. "all" or "tcp" ++--
    • flags - Special rule options ("--", "-f" or "!f") ++--
    • inputif - Input interface of the rule, e.g. "eth0.0" ++-- or "*" for all interfaces ++--
    • outputif - Output interface of the rule,e.g. "eth0.0" ++-- or "*" for all interfaces ++--
    • source - The source ip range, e.g. "0.0.0.0/0" (::/0) ++--
    • destination - The destination ip range, e.g. "0.0.0.0/0" (::/0) ++--
    • options - A list of specific options of the rule, ++-- e.g. { "reject-with", "tcp-reset" } ++--
    • packets - The number of packets matched by the rule ++--
    • bytes - The number of total bytes matched by the rule ++--
    ++-- Example: ++--
    ++-- ip = luci.sys.iptparser.IptParser()
    ++-- result = ip.find( {
    ++-- 	target="REJECT",
    ++-- 	protocol="tcp",
    ++-- 	options={ "reject-with", "tcp-reset" }
    ++-- } )
    ++-- 
    ++-- This will match all rules with target "-j REJECT", ++-- protocol "-p tcp" (or "-p all") ++-- and the option "--reject-with tcp-reset". ++function IptParser.find( self, args ) ++ ++ local args = args or { } ++ local rv = { } ++ ++ args.source = args.source and self:_parse_addr(args.source) ++ args.destination = args.destination and self:_parse_addr(args.destination) ++ ++ for i, rule in ipairs(self._rules) do ++ local match = true ++ ++ -- match table ++ if not ( not args.table or args.table:lower() == rule.table ) then ++ match = false ++ end ++ ++ -- match chain ++ if not ( match == true and ( ++ not args.chain or args.chain == rule.chain ++ ) ) then ++ match = false ++ end ++ ++ -- match target ++ if not ( match == true and ( ++ not args.target or args.target == rule.target ++ ) ) then ++ match = false ++ end ++ ++ -- match protocol ++ if not ( match == true and ( ++ not args.protocol or rule.protocol == "all" or ++ args.protocol:lower() == rule.protocol ++ ) ) then ++ match = false ++ end ++ ++ -- match source ++ if not ( match == true and ( ++ not args.source or rule.source == self._nulladdr or ++ self:_parse_addr(rule.source):contains(args.source) ++ ) ) then ++ match = false ++ end ++ ++ -- match destination ++ if not ( match == true and ( ++ not args.destination or rule.destination == self._nulladdr or ++ self:_parse_addr(rule.destination):contains(args.destination) ++ ) ) then ++ match = false ++ end ++ ++ -- match input interface ++ if not ( match == true and ( ++ not args.inputif or rule.inputif == "*" or ++ args.inputif == rule.inputif ++ ) ) then ++ match = false ++ end ++ ++ -- match output interface ++ if not ( match == true and ( ++ not args.outputif or rule.outputif == "*" or ++ args.outputif == rule.outputif ++ ) ) then ++ match = false ++ end ++ ++ -- match flags (the "opt" column) ++ if not ( match == true and ( ++ not args.flags or rule.flags == args.flags ++ ) ) then ++ match = false ++ end ++ ++ -- match specific options ++ if not ( match == true and ( ++ not args.options or ++ self:_match_options( rule.options, args.options ) ++ ) ) then ++ match = false ++ end ++ ++ -- insert match ++ if match == true then ++ rv[#rv+1] = rule ++ end ++ end ++ ++ return rv ++end ++ ++ ++-- through external commands. ++function IptParser.resync( self ) ++ self._rules = { } ++ self._chain = nil ++ self:_parse_rules() ++end ++ ++ ++function IptParser.tables( self ) ++ return self._tables ++end ++ ++ ++function IptParser.chains( self, table ) ++ local lookup = { } ++ local chains = { } ++ for _, r in ipairs(self:find({table=table})) do ++ if not lookup[r.chain] then ++ lookup[r.chain] = true ++ chains[#chains+1] = r.chain ++ end ++ end ++ return chains ++end ++ ++ ++-- and "rules". The "rules" field is a table of rule tables. ++function IptParser.chain( self, table, chain ) ++ return self._chains[table:lower()] and self._chains[table:lower()][chain] ++end ++ ++ ++function IptParser.is_custom_target( self, target ) ++ for _, r in ipairs(self._rules) do ++ if r.chain == target then ++ return true ++ end ++ end ++ return false ++end ++ ++ ++-- [internal] Parse address according to family. ++function IptParser._parse_addr( self, addr ) ++ if self._family == 4 then ++ return luci.ip.IPv4(addr) ++ else ++ return luci.ip.IPv6(addr) ++ end ++end ++ ++-- [internal] Parse iptables output from all tables. ++function IptParser._parse_rules( self ) ++ ++ for i, tbl in ipairs(self._tables) do ++ ++ self._chains[tbl] = { } ++ ++ for i, rule in ipairs(luci.util.execl(self._command % tbl)) do ++ ++ if rule:find( "^Chain " ) == 1 then ++ ++ local crefs ++ local cname, cpol, cpkt, cbytes = rule:match( ++ "^Chain ([^%s]*) %(policy (%w+) " .. ++ "(%d+) packets, (%d+) bytes%)" ++ ) ++ ++ if not cname then ++ cname, crefs = rule:match( ++ "^Chain ([^%s]*) %((%d+) references%)" ++ ) ++ end ++ ++ self._chain = cname ++ self._chains[tbl][cname] = { ++ policy = cpol, ++ packets = tonumber(cpkt or 0), ++ bytes = tonumber(cbytes or 0), ++ references = tonumber(crefs or 0), ++ rules = { } ++ } ++ ++ else ++ if rule:find("%d") == 1 then ++ ++ local rule_parts = luci.util.split( rule, "%s+", nil, true ) ++ local rule_details = { } ++ ++ -- cope with rules that have no target assigned ++ if rule:match("^%d+%s+%d+%s+%d+%s%s") then ++ table.insert(rule_parts, 4, nil) ++ end ++ ++ -- ip6tables opt column is usually zero-width ++ if self._family == 6 then ++ table.insert(rule_parts, 6, "--") ++ end ++ ++ rule_details["table"] = tbl ++ rule_details["chain"] = self._chain ++ rule_details["index"] = tonumber(rule_parts[1]) ++ rule_details["packets"] = tonumber(rule_parts[2]) ++ rule_details["bytes"] = tonumber(rule_parts[3]) ++ rule_details["target"] = rule_parts[4] ++ rule_details["protocol"] = rule_parts[5] ++ rule_details["flags"] = rule_parts[6] ++ rule_details["inputif"] = rule_parts[7] ++ rule_details["outputif"] = rule_parts[8] ++ rule_details["source"] = rule_parts[9] ++ rule_details["destination"] = rule_parts[10] ++ rule_details["options"] = { } ++ ++ for i = 11, #rule_parts do ++ if #rule_parts[i] > 0 then ++ rule_details["options"][i-10] = rule_parts[i] ++ end ++ end ++ ++ self._rules[#self._rules+1] = rule_details ++ ++ self._chains[tbl][self._chain].rules[ ++ #self._chains[tbl][self._chain].rules + 1 ++ ] = rule_details ++ end ++ end ++ end ++ end ++ ++ self._chain = nil ++end ++ ++ ++-- [internal] Return true if optlist1 contains all elements of optlist 2. ++-- Return false in all other cases. ++function IptParser._match_options( self, o1, o2 ) ++ ++ -- construct a hashtable of first options list to speed up lookups ++ local oh = { } ++ for i, opt in ipairs( o1 ) do oh[opt] = true end ++ ++ -- iterate over second options list ++ -- each string in o2 must be also present in o1 ++ -- if o2 contains a string which is not found in o1 then return false ++ for i, opt in ipairs( o2 ) do ++ if not oh[opt] then ++ return false ++ end ++ end ++ ++ return true ++end +diff --git a/feeds/luci/modules/luci-base/luasrc/sys/iptparser.luadoc b/feeds/luci/modules/luci-base/luasrc/sys/iptparser.luadoc +new file mode 100644 +index 0000000..071e7d5 +--- /dev/null ++++ b/feeds/luci/modules/luci-base/luasrc/sys/iptparser.luadoc +@@ -0,0 +1,69 @@ ++---[[ ++LuCI iptables parser and query library ++ ++@cstyle instance ++]] ++module "luci.sys.iptparser" ++ ++---[[ ++Create a new iptables parser object. ++ ++@class function ++@name IptParser ++@param family Number specifying the address family. 4 for IPv4, 6 for IPv6 ++@return IptParser instance ++]] ++ ++---[[ ++Find all firewall rules that match the given criteria. Expects a table with ++ ++search criteria as only argument. If args is nil or an empty table then all ++rules will be returned. ++]] ++ ++---[[ ++Rebuild the internal lookup table, for example when rules have changed ++ ++through external commands. ++@class function ++@name IptParser.resync ++@return nothing ++]] ++ ++---[[ ++Find the names of all tables. ++ ++@class function ++@name IptParser.tables ++@return Table of table names. ++]] ++ ++---[[ ++Find the names of all chains within the given table name. ++ ++@class function ++@name IptParser.chains ++@param table String containing the table name ++@return Table of chain names in the order they occur. ++]] ++ ++---[[ ++Return the given firewall chain within the given table name. ++ ++@class function ++@name IptParser.chain ++@param table String containing the table name ++@param chain String containing the chain name ++@return Table containing the fields "policy", "packets", "bytes" ++-- and "rules". The "rules" field is a table of rule tables. ++]] ++ ++---[[ ++Test whether the given target points to a custom chain. ++ ++@class function ++@name IptParser.is_custom_target ++@param target String containing the target action ++@return Boolean indicating whether target is a custom chain. ++]] ++ +diff --git a/feeds/luci/modules/luci-base/luasrc/sys/zoneinfo.lua b/feeds/luci/modules/luci-base/luasrc/sys/zoneinfo.lua +new file mode 100644 +index 0000000..aa054a2 +--- /dev/null ++++ b/feeds/luci/modules/luci-base/luasrc/sys/zoneinfo.lua +@@ -0,0 +1,19 @@ ++-- Licensed to the public under the Apache License 2.0. ++ ++local setmetatable, require, rawget, rawset = setmetatable, require, rawget, rawset ++ ++module "luci.sys.zoneinfo" ++ ++setmetatable(_M, { ++ __index = function(t, k) ++ if k == "TZ" and not rawget(t, k) then ++ local m = require "luci.sys.zoneinfo.tzdata" ++ rawset(t, k, rawget(m, k)) ++ elseif k == "OFFSET" and not rawget(t, k) then ++ local m = require "luci.sys.zoneinfo.tzoffset" ++ rawset(t, k, rawget(m, k)) ++ end ++ ++ return rawget(t, k) ++ end ++}) +diff --git a/feeds/luci/modules/luci-base/luasrc/sys/zoneinfo/tzdata.lua b/feeds/luci/modules/luci-base/luasrc/sys/zoneinfo/tzdata.lua +new file mode 100644 +index 0000000..b109c71 +--- /dev/null ++++ b/feeds/luci/modules/luci-base/luasrc/sys/zoneinfo/tzdata.lua +@@ -0,0 +1,421 @@ ++-- Licensed to the public under the Apache License 2.0. ++ ++module "luci.sys.zoneinfo.tzdata" ++ ++TZ = { ++ { 'Africa/Abidjan', 'GMT0' }, ++ { 'Africa/Accra', 'GMT0' }, ++ { 'Africa/Addis Ababa', 'EAT-3' }, ++ { 'Africa/Algiers', 'CET-1' }, ++ { 'Africa/Asmara', 'EAT-3' }, ++ { 'Africa/Bamako', 'GMT0' }, ++ { 'Africa/Bangui', 'WAT-1' }, ++ { 'Africa/Banjul', 'GMT0' }, ++ { 'Africa/Bissau', 'GMT0' }, ++ { 'Africa/Blantyre', 'CAT-2' }, ++ { 'Africa/Brazzaville', 'WAT-1' }, ++ { 'Africa/Bujumbura', 'CAT-2' }, ++ { 'Africa/Cairo', 'EET-2' }, ++ { 'Africa/Casablanca', 'WET0WEST,M3.5.0,M10.5.0/3' }, ++ { 'Africa/Ceuta', 'CET-1CEST,M3.5.0,M10.5.0/3' }, ++ { 'Africa/Conakry', 'GMT0' }, ++ { 'Africa/Dakar', 'GMT0' }, ++ { 'Africa/Dar es Salaam', 'EAT-3' }, ++ { 'Africa/Djibouti', 'EAT-3' }, ++ { 'Africa/Douala', 'WAT-1' }, ++ { 'Africa/El Aaiun', 'WET0WEST,M3.5.0,M10.5.0/3' }, ++ { 'Africa/Freetown', 'GMT0' }, ++ { 'Africa/Gaborone', 'CAT-2' }, ++ { 'Africa/Harare', 'CAT-2' }, ++ { 'Africa/Johannesburg', 'SAST-2' }, ++ { 'Africa/Juba', 'EAT-3' }, ++ { 'Africa/Kampala', 'EAT-3' }, ++ { 'Africa/Khartoum', 'EAT-3' }, ++ { 'Africa/Kigali', 'CAT-2' }, ++ { 'Africa/Kinshasa', 'WAT-1' }, ++ { 'Africa/Lagos', 'WAT-1' }, ++ { 'Africa/Libreville', 'WAT-1' }, ++ { 'Africa/Lome', 'GMT0' }, ++ { 'Africa/Luanda', 'WAT-1' }, ++ { 'Africa/Lubumbashi', 'CAT-2' }, ++ { 'Africa/Lusaka', 'CAT-2' }, ++ { 'Africa/Malabo', 'WAT-1' }, ++ { 'Africa/Maputo', 'CAT-2' }, ++ { 'Africa/Maseru', 'SAST-2' }, ++ { 'Africa/Mbabane', 'SAST-2' }, ++ { 'Africa/Mogadishu', 'EAT-3' }, ++ { 'Africa/Monrovia', 'GMT0' }, ++ { 'Africa/Nairobi', 'EAT-3' }, ++ { 'Africa/Ndjamena', 'WAT-1' }, ++ { 'Africa/Niamey', 'WAT-1' }, ++ { 'Africa/Nouakchott', 'GMT0' }, ++ { 'Africa/Ouagadougou', 'GMT0' }, ++ { 'Africa/Porto-Novo', 'WAT-1' }, ++ { 'Africa/Sao Tome', 'GMT0' }, ++ { 'Africa/Tripoli', 'EET-2' }, ++ { 'Africa/Tunis', 'CET-1' }, ++ { 'Africa/Windhoek', 'WAT-1WAST,M9.1.0,M4.1.0' }, ++ { 'America/Adak', 'HST10HDT,M3.2.0,M11.1.0' }, ++ { 'America/Anchorage', 'AKST9AKDT,M3.2.0,M11.1.0' }, ++ { 'America/Anguilla', 'AST4' }, ++ { 'America/Antigua', 'AST4' }, ++ { 'America/Araguaina', 'BRT3' }, ++ { 'America/Argentina/Buenos Aires', 'ART3' }, ++ { 'America/Argentina/Catamarca', 'ART3' }, ++ { 'America/Argentina/Cordoba', 'ART3' }, ++ { 'America/Argentina/Jujuy', 'ART3' }, ++ { 'America/Argentina/La Rioja', 'ART3' }, ++ { 'America/Argentina/Mendoza', 'ART3' }, ++ { 'America/Argentina/Rio Gallegos', 'ART3' }, ++ { 'America/Argentina/Salta', 'ART3' }, ++ { 'America/Argentina/San Juan', 'ART3' }, ++ { 'America/Argentina/San Luis', 'ART3' }, ++ { 'America/Argentina/Tucuman', 'ART3' }, ++ { 'America/Argentina/Ushuaia', 'ART3' }, ++ { 'America/Aruba', 'AST4' }, ++ { 'America/Asuncion', 'PYT4PYST,M10.1.0/0,M3.4.0/0' }, ++ { 'America/Atikokan', 'EST5' }, ++ { 'America/Bahia', 'BRT3' }, ++ { 'America/Bahia Banderas', 'CST6CDT,M4.1.0,M10.5.0' }, ++ { 'America/Barbados', 'AST4' }, ++ { 'America/Belem', 'BRT3' }, ++ { 'America/Belize', 'CST6' }, ++ { 'America/Blanc-Sablon', 'AST4' }, ++ { 'America/Boa Vista', 'AMT4' }, ++ { 'America/Bogota', 'COT5' }, ++ { 'America/Boise', 'MST7MDT,M3.2.0,M11.1.0' }, ++ { 'America/Cambridge Bay', 'MST7MDT,M3.2.0,M11.1.0' }, ++ { 'America/Campo Grande', 'AMT4AMST,M10.3.0/0,M2.3.0/0' }, ++ { 'America/Cancun', 'EST5' }, ++ { 'America/Caracas', 'VET4:30' }, ++ { 'America/Cayenne', 'GFT3' }, ++ { 'America/Cayman', 'EST5EDT,M3.2.0,M11.1.0' }, ++ { 'America/Chicago', 'CST6CDT,M3.2.0,M11.1.0' }, ++ { 'America/Chihuahua', 'MST7MDT,M4.1.0,M10.5.0' }, ++ { 'America/Costa Rica', 'CST6' }, ++ { 'America/Creston', 'MST7' }, ++ { 'America/Cuiaba', 'AMT4AMST,M10.3.0/0,M2.3.0/0' }, ++ { 'America/Curacao', 'AST4' }, ++ { 'America/Danmarkshavn', 'GMT0' }, ++ { 'America/Dawson', 'PST8PDT,M3.2.0,M11.1.0' }, ++ { 'America/Dawson Creek', 'MST7' }, ++ { 'America/Denver', 'MST7MDT,M3.2.0,M11.1.0' }, ++ { 'America/Detroit', 'EST5EDT,M3.2.0,M11.1.0' }, ++ { 'America/Dominica', 'AST4' }, ++ { 'America/Edmonton', 'MST7MDT,M3.2.0,M11.1.0' }, ++ { 'America/Eirunepe', 'ACT5' }, ++ { 'America/El Salvador', 'CST6' }, ++ { 'America/Fortaleza', 'BRT3' }, ++ { 'America/Glace Bay', 'AST4ADT,M3.2.0,M11.1.0' }, ++ { 'America/Godthab', 'WGT3WGST,M3.5.0/-2,M10.5.0/-1' }, ++ { 'America/Goose Bay', 'AST4ADT,M3.2.0,M11.1.0' }, ++ { 'America/Grand Turk', 'AST4' }, ++ { 'America/Grenada', 'AST4' }, ++ { 'America/Guadeloupe', 'AST4' }, ++ { 'America/Guatemala', 'CST6' }, ++ { 'America/Guayaquil', 'ECT5' }, ++ { 'America/Guyana', 'GYT4' }, ++ { 'America/Halifax', 'AST4ADT,M3.2.0,M11.1.0' }, ++ { 'America/Havana', 'CST5CDT,M3.2.0/0,M11.1.0/1' }, ++ { 'America/Hermosillo', 'MST7' }, ++ { 'America/Indiana/Indianapolis', 'EST5EDT,M3.2.0,M11.1.0' }, ++ { 'America/Indiana/Knox', 'CST6CDT,M3.2.0,M11.1.0' }, ++ { 'America/Indiana/Marengo', 'EST5EDT,M3.2.0,M11.1.0' }, ++ { 'America/Indiana/Petersburg', 'EST5EDT,M3.2.0,M11.1.0' }, ++ { 'America/Indiana/Tell City', 'CST6CDT,M3.2.0,M11.1.0' }, ++ { 'America/Indiana/Vevay', 'EST5EDT,M3.2.0,M11.1.0' }, ++ { 'America/Indiana/Vincennes', 'EST5EDT,M3.2.0,M11.1.0' }, ++ { 'America/Indiana/Winamac', 'EST5EDT,M3.2.0,M11.1.0' }, ++ { 'America/Inuvik', 'MST7MDT,M3.2.0,M11.1.0' }, ++ { 'America/Iqaluit', 'EST5EDT,M3.2.0,M11.1.0' }, ++ { 'America/Jamaica', 'EST5' }, ++ { 'America/Juneau', 'AKST9AKDT,M3.2.0,M11.1.0' }, ++ { 'America/Kentucky/Louisville', 'EST5EDT,M3.2.0,M11.1.0' }, ++ { 'America/Kentucky/Monticello', 'EST5EDT,M3.2.0,M11.1.0' }, ++ { 'America/Kralendijk', 'AST4' }, ++ { 'America/La Paz', 'BOT4' }, ++ { 'America/Lima', 'PET5' }, ++ { 'America/Los Angeles', 'PST8PDT,M3.2.0,M11.1.0' }, ++ { 'America/Lower Princes', 'AST4' }, ++ { 'America/Maceio', 'BRT3' }, ++ { 'America/Managua', 'CST6' }, ++ { 'America/Manaus', 'AMT4' }, ++ { 'America/Marigot', 'AST4' }, ++ { 'America/Martinique', 'AST4' }, ++ { 'America/Matamoros', 'CST6CDT,M3.2.0,M11.1.0' }, ++ { 'America/Mazatlan', 'MST7MDT,M4.1.0,M10.5.0' }, ++ { 'America/Menominee', 'CST6CDT,M3.2.0,M11.1.0' }, ++ { 'America/Merida', 'CST6CDT,M4.1.0,M10.5.0' }, ++ { 'America/Metlakatla', 'PST8' }, ++ { 'America/Mexico City', 'CST6CDT,M4.1.0,M10.5.0' }, ++ { 'America/Miquelon', 'PMST3PMDT,M3.2.0,M11.1.0' }, ++ { 'America/Moncton', 'AST4ADT,M3.2.0,M11.1.0' }, ++ { 'America/Monterrey', 'CST6CDT,M4.1.0,M10.5.0' }, ++ { 'America/Montevideo', 'UYT3' }, ++ { 'America/Montserrat', 'AST4' }, ++ { 'America/Nassau', 'EST5EDT,M3.2.0,M11.1.0' }, ++ { 'America/New York', 'EST5EDT,M3.2.0,M11.1.0' }, ++ { 'America/Nipigon', 'EST5EDT,M3.2.0,M11.1.0' }, ++ { 'America/Nome', 'AKST9AKDT,M3.2.0,M11.1.0' }, ++ { 'America/Noronha', 'FNT2' }, ++ { 'America/North Dakota/Beulah', 'CST6CDT,M3.2.0,M11.1.0' }, ++ { 'America/North Dakota/Center', 'CST6CDT,M3.2.0,M11.1.0' }, ++ { 'America/North Dakota/New Salem', 'CST6CDT,M3.2.0,M11.1.0' }, ++ { 'America/Ojinaga', 'MST7MDT,M3.2.0,M11.1.0' }, ++ { 'America/Panama', 'EST5' }, ++ { 'America/Pangnirtung', 'EST5EDT,M3.2.0,M11.1.0' }, ++ { 'America/Paramaribo', 'SRT3' }, ++ { 'America/Phoenix', 'MST7' }, ++ { 'America/Port of Spain', 'AST4' }, ++ { 'America/Port-au-Prince', 'EST5EDT,M3.2.0,M11.1.0' }, ++ { 'America/Porto Velho', 'AMT4' }, ++ { 'America/Puerto Rico', 'AST4' }, ++ { 'America/Rainy River', 'CST6CDT,M3.2.0,M11.1.0' }, ++ { 'America/Rankin Inlet', 'CST6CDT,M3.2.0,M11.1.0' }, ++ { 'America/Recife', 'BRT3' }, ++ { 'America/Regina', 'CST6' }, ++ { 'America/Resolute', 'CST6CDT,M3.2.0,M11.1.0' }, ++ { 'America/Rio Branco', 'ACT5' }, ++ { 'America/Santa Isabel', 'PST8PDT,M4.1.0,M10.5.0' }, ++ { 'America/Santarem', 'BRT3' }, ++ { 'America/Santiago', 'CLT3' }, ++ { 'America/Santo Domingo', 'AST4' }, ++ { 'America/Sao Paulo', 'BRT3BRST,M10.3.0/0,M2.3.0/0' }, ++ { 'America/Scoresbysund', 'EGT1EGST,M3.5.0/0,M10.5.0/1' }, ++ { 'America/Sitka', 'AKST9AKDT,M3.2.0,M11.1.0' }, ++ { 'America/St Barthelemy', 'AST4' }, ++ { 'America/St Johns', 'NST3:30NDT,M3.2.0,M11.1.0' }, ++ { 'America/St Kitts', 'AST4' }, ++ { 'America/St Lucia', 'AST4' }, ++ { 'America/St Thomas', 'AST4' }, ++ { 'America/St Vincent', 'AST4' }, ++ { 'America/Swift Current', 'CST6' }, ++ { 'America/Tegucigalpa', 'CST6' }, ++ { 'America/Thule', 'AST4ADT,M3.2.0,M11.1.0' }, ++ { 'America/Thunder Bay', 'EST5EDT,M3.2.0,M11.1.0' }, ++ { 'America/Tijuana', 'PST8PDT,M3.2.0,M11.1.0' }, ++ { 'America/Toronto', 'EST5EDT,M3.2.0,M11.1.0' }, ++ { 'America/Tortola', 'AST4' }, ++ { 'America/Vancouver', 'PST8PDT,M3.2.0,M11.1.0' }, ++ { 'America/Whitehorse', 'PST8PDT,M3.2.0,M11.1.0' }, ++ { 'America/Winnipeg', 'CST6CDT,M3.2.0,M11.1.0' }, ++ { 'America/Yakutat', 'AKST9AKDT,M3.2.0,M11.1.0' }, ++ { 'America/Yellowknife', 'MST7MDT,M3.2.0,M11.1.0' }, ++ { 'Antarctica/Casey', 'AWST-8' }, ++ { 'Antarctica/Davis', 'DAVT-7' }, ++ { 'Antarctica/DumontDUrville', 'DDUT-10' }, ++ { 'Antarctica/Macquarie', 'MIST-11' }, ++ { 'Antarctica/Mawson', 'MAWT-5' }, ++ { 'Antarctica/McMurdo', 'NZST-12NZDT,M9.5.0,M4.1.0/3' }, ++ { 'Antarctica/Palmer', 'CLT3' }, ++ { 'Antarctica/Rothera', 'ROTT3' }, ++ { 'Antarctica/Syowa', 'SYOT-3' }, ++ { 'Antarctica/Troll', 'UTC0CEST-2,M3.5.0/1,M10.5.0/3' }, ++ { 'Antarctica/Vostok', 'VOST-6' }, ++ { 'Arctic/Longyearbyen', 'CET-1CEST,M3.5.0,M10.5.0/3' }, ++ { 'Asia/Aden', 'AST-3' }, ++ { 'Asia/Almaty', 'ALMT-6' }, ++ { 'Asia/Amman', 'EET-2EEST,M3.5.4/24,M10.5.5/1' }, ++ { 'Asia/Anadyr', 'ANAT-12' }, ++ { 'Asia/Aqtau', 'AQTT-5' }, ++ { 'Asia/Aqtobe', 'AQTT-5' }, ++ { 'Asia/Ashgabat', 'TMT-5' }, ++ { 'Asia/Baghdad', 'AST-3' }, ++ { 'Asia/Bahrain', 'AST-3' }, ++ { 'Asia/Baku', 'AZT-4AZST,M3.5.0/4,M10.5.0/5' }, ++ { 'Asia/Bangkok', 'ICT-7' }, ++ { 'Asia/Beirut', 'EET-2EEST,M3.5.0/0,M10.5.0/0' }, ++ { 'Asia/Bishkek', 'KGT-6' }, ++ { 'Asia/Brunei', 'BNT-8' }, ++ { 'Asia/Chita', 'IRKT-8' }, ++ { 'Asia/Choibalsan', 'CHOT-8CHOST,M3.5.6,M9.5.6/0' }, ++ { 'Asia/Colombo', 'IST-5:30' }, ++ { 'Asia/Damascus', 'EET-2EEST,M3.5.5/0,M10.5.5/0' }, ++ { 'Asia/Dhaka', 'BDT-6' }, ++ { 'Asia/Dili', 'TLT-9' }, ++ { 'Asia/Dubai', 'GST-4' }, ++ { 'Asia/Dushanbe', 'TJT-5' }, ++ { 'Asia/Gaza', 'EET-2EEST,M3.5.5/24,M10.3.6/144' }, ++ { 'Asia/Hebron', 'EET-2EEST,M3.5.5/24,M10.3.6/144' }, ++ { 'Asia/Ho Chi Minh', 'ICT-7' }, ++ { 'Asia/Hong Kong', 'HKT-8' }, ++ { 'Asia/Hovd', 'HOVT-7HOVST,M3.5.6,M9.5.6/0' }, ++ { 'Asia/Irkutsk', 'IRKT-8' }, ++ { 'Asia/Jakarta', 'WIB-7' }, ++ { 'Asia/Jayapura', 'WIT-9' }, ++ { 'Asia/Jerusalem', 'IST-2IDT,M3.4.4/26,M10.5.0' }, ++ { 'Asia/Kabul', 'AFT-4:30' }, ++ { 'Asia/Kamchatka', 'PETT-12' }, ++ { 'Asia/Karachi', 'PKT-5' }, ++ { 'Asia/Kathmandu', 'NPT-5:45' }, ++ { 'Asia/Khandyga', 'YAKT-9' }, ++ { 'Asia/Kolkata', 'IST-5:30' }, ++ { 'Asia/Krasnoyarsk', 'KRAT-7' }, ++ { 'Asia/Kuala Lumpur', 'MYT-8' }, ++ { 'Asia/Kuching', 'MYT-8' }, ++ { 'Asia/Kuwait', 'AST-3' }, ++ { 'Asia/Macau', 'CST-8' }, ++ { 'Asia/Magadan', 'MAGT-10' }, ++ { 'Asia/Makassar', 'WITA-8' }, ++ { 'Asia/Manila', 'PHT-8' }, ++ { 'Asia/Muscat', 'GST-4' }, ++ { 'Asia/Nicosia', 'EET-2EEST,M3.5.0/3,M10.5.0/4' }, ++ { 'Asia/Novokuznetsk', 'KRAT-7' }, ++ { 'Asia/Novosibirsk', 'NOVT-6' }, ++ { 'Asia/Omsk', 'OMST-6' }, ++ { 'Asia/Oral', 'ORAT-5' }, ++ { 'Asia/Phnom Penh', 'ICT-7' }, ++ { 'Asia/Pontianak', 'WIB-7' }, ++ { 'Asia/Pyongyang', 'KST-8:30' }, ++ { 'Asia/Qatar', 'AST-3' }, ++ { 'Asia/Qyzylorda', 'QYZT-6' }, ++ { 'Asia/Rangoon', 'MMT-6:30' }, ++ { 'Asia/Riyadh', 'AST-3' }, ++ { 'Asia/Sakhalin', 'SAKT-10' }, ++ { 'Asia/Samarkand', 'UZT-5' }, ++ { 'Asia/Seoul', 'KST-9' }, ++ { 'Asia/Shanghai', 'CST-8' }, ++ { 'Asia/Singapore', 'SGT-8' }, ++ { 'Asia/Srednekolymsk', 'SRET-11' }, ++ { 'Asia/Taipei', 'CST-8' }, ++ { 'Asia/Tashkent', 'UZT-5' }, ++ { 'Asia/Tbilisi', 'GET-4' }, ++ { 'Asia/Thimphu', 'BTT-6' }, ++ { 'Asia/Tokyo', 'JST-9' }, ++ { 'Asia/Ulaanbaatar', 'ULAT-8ULAST,M3.5.6,M9.5.6/0' }, ++ { 'Asia/Urumqi', 'XJT-6' }, ++ { 'Asia/Ust-Nera', 'VLAT-10' }, ++ { 'Asia/Vientiane', 'ICT-7' }, ++ { 'Asia/Vladivostok', 'VLAT-10' }, ++ { 'Asia/Yakutsk', 'YAKT-9' }, ++ { 'Asia/Yekaterinburg', 'YEKT-5' }, ++ { 'Asia/Yerevan', 'AMT-4' }, ++ { 'Atlantic/Azores', 'AZOT1AZOST,M3.5.0/0,M10.5.0/1' }, ++ { 'Atlantic/Bermuda', 'AST4ADT,M3.2.0,M11.1.0' }, ++ { 'Atlantic/Canary', 'WET0WEST,M3.5.0/1,M10.5.0' }, ++ { 'Atlantic/Cape Verde', 'CVT1' }, ++ { 'Atlantic/Faroe', 'WET0WEST,M3.5.0/1,M10.5.0' }, ++ { 'Atlantic/Madeira', 'WET0WEST,M3.5.0/1,M10.5.0' }, ++ { 'Atlantic/Reykjavik', 'GMT0' }, ++ { 'Atlantic/South Georgia', 'GST2' }, ++ { 'Atlantic/St Helena', 'GMT0' }, ++ { 'Atlantic/Stanley', 'FKST3' }, ++ { 'Australia/Adelaide', 'ACST-9:30ACDT,M10.1.0,M4.1.0/3' }, ++ { 'Australia/Brisbane', 'AEST-10' }, ++ { 'Australia/Broken Hill', 'ACST-9:30ACDT,M10.1.0,M4.1.0/3' }, ++ { 'Australia/Currie', 'AEST-10AEDT,M10.1.0,M4.1.0/3' }, ++ { 'Australia/Darwin', 'ACST-9:30' }, ++ { 'Australia/Eucla', 'ACWST-8:45' }, ++ { 'Australia/Hobart', 'AEST-10AEDT,M10.1.0,M4.1.0/3' }, ++ { 'Australia/Lindeman', 'AEST-10' }, ++ { 'Australia/Lord Howe', 'LHST-10:30LHDT-11,M10.1.0,M4.1.0' }, ++ { 'Australia/Melbourne', 'AEST-10AEDT,M10.1.0,M4.1.0/3' }, ++ { 'Australia/Perth', 'AWST-8' }, ++ { 'Australia/Sydney', 'AEST-10AEDT,M10.1.0,M4.1.0/3' }, ++ { 'Europe/Amsterdam', 'CET-1CEST,M3.5.0,M10.5.0/3' }, ++ { 'Europe/Andorra', 'CET-1CEST,M3.5.0,M10.5.0/3' }, ++ { 'Europe/Athens', 'EET-2EEST,M3.5.0/3,M10.5.0/4' }, ++ { 'Europe/Belgrade', 'CET-1CEST,M3.5.0,M10.5.0/3' }, ++ { 'Europe/Berlin', 'CET-1CEST,M3.5.0,M10.5.0/3' }, ++ { 'Europe/Bratislava', 'CET-1CEST,M3.5.0,M10.5.0/3' }, ++ { 'Europe/Brussels', 'CET-1CEST,M3.5.0,M10.5.0/3' }, ++ { 'Europe/Bucharest', 'EET-2EEST,M3.5.0/3,M10.5.0/4' }, ++ { 'Europe/Budapest', 'CET-1CEST,M3.5.0,M10.5.0/3' }, ++ { 'Europe/Busingen', 'CET-1CEST,M3.5.0,M10.5.0/3' }, ++ { 'Europe/Chisinau', 'EET-2EEST,M3.5.0,M10.5.0/3' }, ++ { 'Europe/Copenhagen', 'CET-1CEST,M3.5.0,M10.5.0/3' }, ++ { 'Europe/Dublin', 'GMT0IST,M3.5.0/1,M10.5.0' }, ++ { 'Europe/Gibraltar', 'CET-1CEST,M3.5.0,M10.5.0/3' }, ++ { 'Europe/Guernsey', 'GMT0BST,M3.5.0/1,M10.5.0' }, ++ { 'Europe/Helsinki', 'EET-2EEST,M3.5.0/3,M10.5.0/4' }, ++ { 'Europe/Isle of Man', 'GMT0BST,M3.5.0/1,M10.5.0' }, ++ { 'Europe/Istanbul', 'EET-2EEST,M3.5.0/3,M10.5.0/4' }, ++ { 'Europe/Jersey', 'GMT0BST,M3.5.0/1,M10.5.0' }, ++ { 'Europe/Kaliningrad', 'EET-2' }, ++ { 'Europe/Kiev', 'EET-2EEST,M3.5.0/3,M10.5.0/4' }, ++ { 'Europe/Lisbon', 'WET0WEST,M3.5.0/1,M10.5.0' }, ++ { 'Europe/Ljubljana', 'CET-1CEST,M3.5.0,M10.5.0/3' }, ++ { 'Europe/London', 'GMT0BST,M3.5.0/1,M10.5.0' }, ++ { 'Europe/Luxembourg', 'CET-1CEST,M3.5.0,M10.5.0/3' }, ++ { 'Europe/Madrid', 'CET-1CEST,M3.5.0,M10.5.0/3' }, ++ { 'Europe/Malta', 'CET-1CEST,M3.5.0,M10.5.0/3' }, ++ { 'Europe/Mariehamn', 'EET-2EEST,M3.5.0/3,M10.5.0/4' }, ++ { 'Europe/Minsk', 'MSK-3' }, ++ { 'Europe/Monaco', 'CET-1CEST,M3.5.0,M10.5.0/3' }, ++ { 'Europe/Moscow', 'MSK-3' }, ++ { 'Europe/Oslo', 'CET-1CEST,M3.5.0,M10.5.0/3' }, ++ { 'Europe/Paris', 'CET-1CEST,M3.5.0,M10.5.0/3' }, ++ { 'Europe/Podgorica', 'CET-1CEST,M3.5.0,M10.5.0/3' }, ++ { 'Europe/Prague', 'CET-1CEST,M3.5.0,M10.5.0/3' }, ++ { 'Europe/Riga', 'EET-2EEST,M3.5.0/3,M10.5.0/4' }, ++ { 'Europe/Rome', 'CET-1CEST,M3.5.0,M10.5.0/3' }, ++ { 'Europe/Samara', 'SAMT-4' }, ++ { 'Europe/San Marino', 'CET-1CEST,M3.5.0,M10.5.0/3' }, ++ { 'Europe/Sarajevo', 'CET-1CEST,M3.5.0,M10.5.0/3' }, ++ { 'Europe/Simferopol', 'MSK-3' }, ++ { 'Europe/Skopje', 'CET-1CEST,M3.5.0,M10.5.0/3' }, ++ { 'Europe/Sofia', 'EET-2EEST,M3.5.0/3,M10.5.0/4' }, ++ { 'Europe/Stockholm', 'CET-1CEST,M3.5.0,M10.5.0/3' }, ++ { 'Europe/Tallinn', 'EET-2EEST,M3.5.0/3,M10.5.0/4' }, ++ { 'Europe/Tirane', 'CET-1CEST,M3.5.0,M10.5.0/3' }, ++ { 'Europe/Uzhgorod', 'EET-2EEST,M3.5.0/3,M10.5.0/4' }, ++ { 'Europe/Vaduz', 'CET-1CEST,M3.5.0,M10.5.0/3' }, ++ { 'Europe/Vatican', 'CET-1CEST,M3.5.0,M10.5.0/3' }, ++ { 'Europe/Vienna', 'CET-1CEST,M3.5.0,M10.5.0/3' }, ++ { 'Europe/Vilnius', 'EET-2EEST,M3.5.0/3,M10.5.0/4' }, ++ { 'Europe/Volgograd', 'MSK-3' }, ++ { 'Europe/Warsaw', 'CET-1CEST,M3.5.0,M10.5.0/3' }, ++ { 'Europe/Zagreb', 'CET-1CEST,M3.5.0,M10.5.0/3' }, ++ { 'Europe/Zaporozhye', 'EET-2EEST,M3.5.0/3,M10.5.0/4' }, ++ { 'Europe/Zurich', 'CET-1CEST,M3.5.0,M10.5.0/3' }, ++ { 'Indian/Antananarivo', 'EAT-3' }, ++ { 'Indian/Chagos', 'IOT-6' }, ++ { 'Indian/Christmas', 'CXT-7' }, ++ { 'Indian/Cocos', 'CCT-6:30' }, ++ { 'Indian/Comoro', 'EAT-3' }, ++ { 'Indian/Kerguelen', 'TFT-5' }, ++ { 'Indian/Mahe', 'SCT-4' }, ++ { 'Indian/Maldives', 'MVT-5' }, ++ { 'Indian/Mauritius', 'MUT-4' }, ++ { 'Indian/Mayotte', 'EAT-3' }, ++ { 'Indian/Reunion', 'RET-4' }, ++ { 'Pacific/Apia', 'WSST-13WSDT,M9.5.0/3,M4.1.0/4' }, ++ { 'Pacific/Auckland', 'NZST-12NZDT,M9.5.0,M4.1.0/3' }, ++ { 'Pacific/Bougainville', 'BST-11' }, ++ { 'Pacific/Chatham', 'CHAST-12:45CHADT,M9.5.0/2:45,M4.1.0/3:45' }, ++ { 'Pacific/Chuuk', 'CHUT-10' }, ++ { 'Pacific/Easter', 'EAST5' }, ++ { 'Pacific/Efate', 'VUT-11' }, ++ { 'Pacific/Enderbury', 'PHOT-13' }, ++ { 'Pacific/Fakaofo', 'TKT-13' }, ++ { 'Pacific/Fiji', 'FJT-12FJST,M11.1.0,M1.3.4/75' }, ++ { 'Pacific/Funafuti', 'TVT-12' }, ++ { 'Pacific/Galapagos', 'GALT6' }, ++ { 'Pacific/Gambier', 'GAMT9' }, ++ { 'Pacific/Guadalcanal', 'SBT-11' }, ++ { 'Pacific/Guam', 'ChST-10' }, ++ { 'Pacific/Honolulu', 'HST10' }, ++ { 'Pacific/Johnston', 'HST10' }, ++ { 'Pacific/Kiritimati', 'LINT-14' }, ++ { 'Pacific/Kosrae', 'KOST-11' }, ++ { 'Pacific/Kwajalein', 'MHT-12' }, ++ { 'Pacific/Majuro', 'MHT-12' }, ++ { 'Pacific/Marquesas', 'MART9:30' }, ++ { 'Pacific/Midway', 'SST11' }, ++ { 'Pacific/Nauru', 'NRT-12' }, ++ { 'Pacific/Niue', 'NUT11' }, ++ { 'Pacific/Norfolk', 'NFT-11:30' }, ++ { 'Pacific/Noumea', 'NCT-11' }, ++ { 'Pacific/Pago Pago', 'SST11' }, ++ { 'Pacific/Palau', 'PWT-9' }, ++ { 'Pacific/Pitcairn', 'PST8' }, ++ { 'Pacific/Pohnpei', 'PONT-11' }, ++ { 'Pacific/Port Moresby', 'PGT-10' }, ++ { 'Pacific/Rarotonga', 'CKT10' }, ++ { 'Pacific/Saipan', 'ChST-10' }, ++ { 'Pacific/Tahiti', 'TAHT10' }, ++ { 'Pacific/Tarawa', 'GILT-12' }, ++ { 'Pacific/Tongatapu', 'TOT-13' }, ++ { 'Pacific/Wake', 'WAKT-12' }, ++ { 'Pacific/Wallis', 'WFT-12' }, ++} +diff --git a/feeds/luci/modules/luci-base/luasrc/sys/zoneinfo/tzoffset.lua b/feeds/luci/modules/luci-base/luasrc/sys/zoneinfo/tzoffset.lua +new file mode 100644 +index 0000000..f156f36 +--- /dev/null ++++ b/feeds/luci/modules/luci-base/luasrc/sys/zoneinfo/tzoffset.lua +@@ -0,0 +1,166 @@ ++-- Licensed to the public under the Apache License 2.0. ++ ++module "luci.sys.zoneinfo.tzoffset" ++ ++OFFSET = { ++ gmt = 0, -- GMT ++ eat = 10800, -- EAT ++ cet = 3600, -- CET ++ wat = 3600, -- WAT ++ cat = 7200, -- CAT ++ eet = 7200, -- EET ++ wet = 0, -- WET ++ sast = 7200, -- SAST ++ hst = -36000, -- HST ++ hdt = -32400, -- HDT ++ akst = -32400, -- AKST ++ akdt = -28800, -- AKDT ++ ast = -14400, -- AST ++ brt = -10800, -- BRT ++ art = -10800, -- ART ++ pyt = -14400, -- PYT ++ pyst = -10800, -- PYST ++ est = -18000, -- EST ++ cst = -21600, -- CST ++ cdt = -18000, -- CDT ++ amt = -14400, -- AMT ++ cot = -18000, -- COT ++ mst = -25200, -- MST ++ mdt = -21600, -- MDT ++ vet = -16200, -- VET ++ gft = -10800, -- GFT ++ pst = -28800, -- PST ++ pdt = -25200, -- PDT ++ act = -18000, -- ACT ++ wgt = -10800, -- WGT ++ wgst = -7200, -- WGST ++ ect = -18000, -- ECT ++ gyt = -14400, -- GYT ++ bot = -14400, -- BOT ++ pet = -18000, -- PET ++ pmst = -10800, -- PMST ++ pmdt = -7200, -- PMDT ++ uyt = -10800, -- UYT ++ fnt = -7200, -- FNT ++ srt = -10800, -- SRT ++ clt = -10800, -- CLT ++ egt = -3600, -- EGT ++ egst = 0, -- EGST ++ nst = -12600, -- NST ++ ndt = -9000, -- NDT ++ awst = 28800, -- AWST ++ davt = 25200, -- DAVT ++ ddut = 36000, -- DDUT ++ mist = 39600, -- MIST ++ mawt = 18000, -- MAWT ++ nzst = 43200, -- NZST ++ nzdt = 46800, -- NZDT ++ rott = -10800, -- ROTT ++ syot = 10800, -- SYOT ++ utc = 0, -- UTC ++ vost = 21600, -- VOST ++ almt = 21600, -- ALMT ++ anat = 43200, -- ANAT ++ aqtt = 18000, -- AQTT ++ tmt = 18000, -- TMT ++ azt = 14400, -- AZT ++ azst = 18000, -- AZST ++ ict = 25200, -- ICT ++ kgt = 21600, -- KGT ++ bnt = 28800, -- BNT ++ irkt = 28800, -- IRKT ++ chot = 28800, -- CHOT ++ chost = 32400, -- CHOST ++ ist = 19800, -- IST ++ bdt = 21600, -- BDT ++ tlt = 32400, -- TLT ++ gst = 14400, -- GST ++ tjt = 18000, -- TJT ++ hkt = 28800, -- HKT ++ hovt = 25200, -- HOVT ++ hovst = 28800, -- HOVST ++ wib = 25200, -- WIB ++ wit = 32400, -- WIT ++ aft = 16200, -- AFT ++ pett = 43200, -- PETT ++ pkt = 18000, -- PKT ++ npt = 20700, -- NPT ++ yakt = 32400, -- YAKT ++ krat = 25200, -- KRAT ++ myt = 28800, -- MYT ++ magt = 36000, -- MAGT ++ wita = 28800, -- WITA ++ pht = 28800, -- PHT ++ novt = 21600, -- NOVT ++ omst = 21600, -- OMST ++ orat = 18000, -- ORAT ++ kst = 30600, -- KST ++ qyzt = 21600, -- QYZT ++ mmt = 23400, -- MMT ++ sakt = 36000, -- SAKT ++ uzt = 18000, -- UZT ++ sgt = 28800, -- SGT ++ sret = 39600, -- SRET ++ get = 14400, -- GET ++ btt = 21600, -- BTT ++ jst = 32400, -- JST ++ ulat = 28800, -- ULAT ++ ulast = 32400, -- ULAST ++ xjt = 21600, -- XJT ++ vlat = 36000, -- VLAT ++ yekt = 18000, -- YEKT ++ azot = -3600, -- AZOT ++ azost = 0, -- AZOST ++ cvt = -3600, -- CVT ++ fkst = -10800, -- FKST ++ acst = 34200, -- ACST ++ acdt = 37800, -- ACDT ++ aest = 36000, -- AEST ++ acwst = 31500, -- ACWST ++ lhst = 37800, -- LHST ++ lhdt = 39600, -- LHDT ++ msk = 10800, -- MSK ++ samt = 14400, -- SAMT ++ iot = 21600, -- IOT ++ cxt = 25200, -- CXT ++ cct = 23400, -- CCT ++ tft = 18000, -- TFT ++ sct = 14400, -- SCT ++ mvt = 18000, -- MVT ++ mut = 14400, -- MUT ++ ret = 14400, -- RET ++ wsst = 46800, -- WSST ++ wsdt = 50400, -- WSDT ++ bst = 39600, -- BST ++ chast = 45900, -- CHAST ++ chadt = 49500, -- CHADT ++ chut = 36000, -- CHUT ++ east = -18000, -- EAST ++ vut = 39600, -- VUT ++ phot = 46800, -- PHOT ++ tkt = 46800, -- TKT ++ fjt = 43200, -- FJT ++ fjst = 46800, -- FJST ++ tvt = 43200, -- TVT ++ galt = -21600, -- GALT ++ gamt = -32400, -- GAMT ++ sbt = 39600, -- SBT ++ lint = 50400, -- LINT ++ kost = 39600, -- KOST ++ mht = 43200, -- MHT ++ mart = -34200, -- MART ++ sst = -39600, -- SST ++ nrt = 43200, -- NRT ++ nut = -39600, -- NUT ++ nft = 41400, -- NFT ++ nct = 39600, -- NCT ++ pwt = 32400, -- PWT ++ pont = 39600, -- PONT ++ pgt = 36000, -- PGT ++ ckt = -36000, -- CKT ++ taht = -36000, -- TAHT ++ gilt = 43200, -- GILT ++ tot = 46800, -- TOT ++ wakt = 43200, -- WAKT ++ wft = 43200, -- WFT ++} +diff --git a/feeds/luci/modules/luci-base/luasrc/template.lua b/feeds/luci/modules/luci-base/luasrc/template.lua +new file mode 100644 +index 0000000..588028c +--- /dev/null ++++ b/feeds/luci/modules/luci-base/luasrc/template.lua +@@ -0,0 +1,100 @@ ++-- Copyright 2008 Steven Barth ++-- Licensed to the public under the Apache License 2.0. ++ ++local util = require "luci.util" ++local config = require "luci.config" ++local tparser = require "luci.template.parser" ++ ++local tostring, pairs, loadstring = tostring, pairs, loadstring ++local setmetatable, loadfile = setmetatable, loadfile ++local getfenv, setfenv, rawget = getfenv, setfenv, rawget ++local assert, type, error = assert, type, error ++ ++--- LuCI template library. ++module "luci.template" ++ ++config.template = config.template or {} ++viewdir = config.template.viewdir or util.libpath() .. "/view" ++ ++ ++-- Define the namespace for template modules ++context = util.threadlocal() ++ ++--- Render a certain template. ++-- @param name Template name ++-- @param scope Scope to assign to template (optional) ++function render(name, scope) ++ return Template(name):render(scope or getfenv(2)) ++end ++ ++--- Render a template from a string. ++-- @param template Template string ++-- @param scope Scope to assign to template (optional) ++function render_string(template, scope) ++ return Template(nil, template):render(scope or getfenv(2)) ++end ++ ++ ++-- Template class ++Template = util.class() ++ ++-- Shared template cache to store templates in to avoid unnecessary reloading ++Template.cache = setmetatable({}, {__mode = "v"}) ++ ++ ++-- Constructor - Reads and compiles the template on-demand ++function Template.__init__(self, name, template) ++ if name then ++ self.template = self.cache[name] ++ self.name = name ++ else ++ self.name = "[string]" ++ end ++ ++ -- Create a new namespace for this template ++ self.viewns = context.viewns ++ ++ -- If we have a cached template, skip compiling and loading ++ if not self.template then ++ ++ -- Compile template ++ local err ++ local sourcefile ++ ++ if name then ++ sourcefile = viewdir .. "/" .. name .. ".htm" ++ self.template, _, err = tparser.parse(sourcefile) ++ else ++ sourcefile = "[string]" ++ self.template, _, err = tparser.parse_string(template) ++ end ++ ++ -- If we have no valid template throw error, otherwise cache the template ++ if not self.template then ++ error("Failed to load template '" .. name .. "'.\n" .. ++ "Error while parsing template '" .. sourcefile .. "':\n" .. ++ (err or "Unknown syntax error")) ++ elseif name then ++ self.cache[name] = self.template ++ end ++ end ++end ++ ++ ++-- Renders a template ++function Template.render(self, scope) ++ scope = scope or getfenv(2) ++ ++ -- Put our predefined objects in the scope of the template ++ setfenv(self.template, setmetatable({}, {__index = ++ function(tbl, key) ++ return rawget(tbl, key) or self.viewns[key] or scope[key] ++ end})) ++ ++ -- Now finally render the thing ++ local stat, err = util.copcall(self.template) ++ if not stat then ++ error("Failed to execute template '" .. self.name .. "'.\n" .. ++ "A runtime error occured: " .. tostring(err or "(nil)")) ++ end ++end +diff --git a/feeds/luci/modules/luci-base/luasrc/tools/proto.lua b/feeds/luci/modules/luci-base/luasrc/tools/proto.lua +new file mode 100644 +index 0000000..147688d +--- /dev/null ++++ b/feeds/luci/modules/luci-base/luasrc/tools/proto.lua +@@ -0,0 +1,36 @@ ++-- Copyright 2012 Jo-Philipp Wich ++-- Licensed to the public under the Apache License 2.0. ++ ++module("luci.tools.proto", package.seeall) ++ ++function opt_macaddr(s, ifc, ...) ++ local v = luci.cbi.Value ++ local o = s:taboption("advanced", v, "macaddr", ...) ++ ++ o.placeholder = ifc and ifc:mac() ++ o.datatype = "macaddr" ++ ++ function o.cfgvalue(self, section) ++ local w = ifc and ifc:get_wifinet() ++ if w then ++ return w:get("macaddr") ++ else ++ return v.cfgvalue(self, section) ++ end ++ end ++ ++ function o.write(self, section, value) ++ local w = ifc and ifc:get_wifinet() ++ if w then ++ w:set("macaddr", value) ++ elseif value then ++ v.write(self, section, value) ++ else ++ v.remove(self, section) ++ end ++ end ++ ++ function o.remove(self, section) ++ self:write(section, nil) ++ end ++end +diff --git a/feeds/luci/modules/luci-base/luasrc/tools/status.lua b/feeds/luci/modules/luci-base/luasrc/tools/status.lua +new file mode 100644 +index 0000000..0dd092c +--- /dev/null ++++ b/feeds/luci/modules/luci-base/luasrc/tools/status.lua +@@ -0,0 +1,210 @@ ++-- Copyright 2011 Jo-Philipp Wich ++-- Licensed to the public under the Apache License 2.0. ++ ++module("luci.tools.status", package.seeall) ++ ++local uci = require "luci.model.uci".cursor() ++ ++local function dhcp_leases_common(family) ++ local rv = { } ++ local nfs = require "nixio.fs" ++ local leasefile = "/var/dhcp.leases" ++ ++ uci:foreach("dhcp", "dnsmasq", ++ function(s) ++ if s.leasefile and nfs.access(s.leasefile) then ++ leasefile = s.leasefile ++ return false ++ end ++ end) ++ ++ local fd = io.open(leasefile, "r") ++ if fd then ++ while true do ++ local ln = fd:read("*l") ++ if not ln then ++ break ++ else ++ local ts, mac, ip, name, duid = ln:match("^(%d+) (%S+) (%S+) (%S+) (%S+)") ++ if ts and mac and ip and name and duid then ++ if family == 4 and not ip:match(":") then ++ rv[#rv+1] = { ++ expires = os.difftime(tonumber(ts) or 0, os.time()), ++ macaddr = mac, ++ ipaddr = ip, ++ hostname = (name ~= "*") and name ++ } ++ elseif family == 6 and ip:match(":") then ++ rv[#rv+1] = { ++ expires = os.difftime(tonumber(ts) or 0, os.time()), ++ ip6addr = ip, ++ duid = (duid ~= "*") and duid, ++ hostname = (name ~= "*") and name ++ } ++ end ++ end ++ end ++ end ++ fd:close() ++ end ++ ++ local fd = io.open("/tmp/hosts/odhcpd", "r") ++ if fd then ++ while true do ++ local ln = fd:read("*l") ++ if not ln then ++ break ++ else ++ local iface, duid, iaid, name, ts, id, length, ip = ln:match("^# (%S+) (%S+) (%S+) (%S+) (%d+) (%S+) (%S+) (.*)") ++ if ip and iaid ~= "ipv4" and family == 6 then ++ rv[#rv+1] = { ++ expires = os.difftime(tonumber(ts) or 0, os.time()), ++ duid = duid, ++ ip6addr = ip, ++ hostname = (name ~= "-") and name ++ } ++ elseif ip and iaid == "ipv4" and family == 4 then ++ rv[#rv+1] = { ++ expires = os.difftime(tonumber(ts) or 0, os.time()), ++ macaddr = duid, ++ ipaddr = ip, ++ hostname = (name ~= "-") and name ++ } ++ end ++ end ++ end ++ fd:close() ++ end ++ ++ return rv ++end ++ ++function dhcp_leases() ++ return dhcp_leases_common(4) ++end ++ ++function dhcp6_leases() ++ return dhcp_leases_common(6) ++end ++ ++function wifi_networks() ++ local rv = { } ++ local ntm = require "luci.model.network".init() ++ ++ local dev ++ for _, dev in ipairs(ntm:get_wifidevs()) do ++ local rd = { ++ up = dev:is_up(), ++ device = dev:name(), ++ name = dev:get_i18n(), ++ networks = { } ++ } ++ ++ local net ++ for _, net in ipairs(dev:get_wifinets()) do ++ rd.networks[#rd.networks+1] = { ++ name = net:shortname(), ++ link = net:adminlink(), ++ up = net:is_up(), ++ mode = net:active_mode(), ++ ssid = net:active_ssid(), ++ bssid = net:active_bssid(), ++ encryption = net:active_encryption(), ++ frequency = net:frequency(), ++ channel = net:channel(), ++ signal = net:signal(), ++ quality = net:signal_percent(), ++ noise = net:noise(), ++ bitrate = net:bitrate(), ++ ifname = net:ifname(), ++ assoclist = net:assoclist(), ++ country = net:country(), ++ txpower = net:txpower(), ++ txpoweroff = net:txpower_offset(), ++ disabled = (dev:get("disabled") == "1" or ++ net:get("disabled") == "1") ++ } ++ end ++ ++ rv[#rv+1] = rd ++ end ++ ++ return rv ++end ++ ++function wifi_network(id) ++ local ntm = require "luci.model.network".init() ++ local net = ntm:get_wifinet(id) ++ if net then ++ local dev = net:get_device() ++ if dev then ++ return { ++ id = id, ++ name = net:shortname(), ++ link = net:adminlink(), ++ up = net:is_up(), ++ mode = net:active_mode(), ++ ssid = net:active_ssid(), ++ bssid = net:active_bssid(), ++ encryption = net:active_encryption(), ++ frequency = net:frequency(), ++ channel = net:channel(), ++ signal = net:signal(), ++ quality = net:signal_percent(), ++ noise = net:noise(), ++ bitrate = net:bitrate(), ++ ifname = net:ifname(), ++ assoclist = net:assoclist(), ++ country = net:country(), ++ txpower = net:txpower(), ++ txpoweroff = net:txpower_offset(), ++ disabled = (dev:get("disabled") == "1" or ++ net:get("disabled") == "1"), ++ device = { ++ up = dev:is_up(), ++ device = dev:name(), ++ name = dev:get_i18n() ++ } ++ } ++ end ++ end ++ return { } ++end ++ ++function switch_status(devs) ++ local dev ++ local switches = { } ++ for dev in devs:gmatch("[^%s,]+") do ++ local ports = { } ++ local swc = io.popen("swconfig dev %q show" % dev, "r") ++ if swc then ++ local l ++ repeat ++ l = swc:read("*l") ++ if l then ++ local port, up = l:match("port:(%d+) link:(%w+)") ++ if port then ++ local speed = l:match(" speed:(%d+)") ++ local duplex = l:match(" (%w+)-duplex") ++ local txflow = l:match(" (txflow)") ++ local rxflow = l:match(" (rxflow)") ++ local auto = l:match(" (auto)") ++ ++ ports[#ports+1] = { ++ port = tonumber(port) or 0, ++ speed = tonumber(speed) or 0, ++ link = (up == "up"), ++ duplex = (duplex == "full"), ++ rxflow = (not not rxflow), ++ txflow = (not not txflow), ++ auto = (not not auto) ++ } ++ end ++ end ++ until not l ++ swc:close() ++ end ++ switches[dev] = ports ++ end ++ return switches ++end +diff --git a/feeds/luci/modules/luci-base/luasrc/tools/webadmin.lua b/feeds/luci/modules/luci-base/luasrc/tools/webadmin.lua +new file mode 100644 +index 0000000..8273175 +--- /dev/null ++++ b/feeds/luci/modules/luci-base/luasrc/tools/webadmin.lua +@@ -0,0 +1,105 @@ ++-- Copyright 2008 Steven Barth ++-- Copyright 2008-2015 Jo-Philipp Wich ++-- Licensed to the public under the Apache License 2.0. ++ ++module("luci.tools.webadmin", package.seeall) ++ ++local util = require "luci.util" ++local uci = require "luci.model.uci" ++local ip = require "luci.ip" ++ ++function byte_format(byte) ++ local suff = {"B", "KB", "MB", "GB", "TB"} ++ for i=1, 5 do ++ if byte > 1024 and i < 5 then ++ byte = byte / 1024 ++ else ++ return string.format("%.2f %s", byte, suff[i]) ++ end ++ end ++end ++ ++function date_format(secs) ++ local suff = {"min", "h", "d"} ++ local mins = 0 ++ local hour = 0 ++ local days = 0 ++ ++ secs = math.floor(secs) ++ if secs > 60 then ++ mins = math.floor(secs / 60) ++ secs = secs % 60 ++ end ++ ++ if mins > 60 then ++ hour = math.floor(mins / 60) ++ mins = mins % 60 ++ end ++ ++ if hour > 24 then ++ days = math.floor(hour / 24) ++ hour = hour % 24 ++ end ++ ++ if days > 0 then ++ return string.format("%.0fd %02.0fh %02.0fmin %02.0fs", days, hour, mins, secs) ++ else ++ return string.format("%02.0fh %02.0fmin %02.0fs", hour, mins, secs) ++ end ++end ++ ++function cbi_add_networks(field) ++ uci.cursor():foreach("network", "interface", ++ function (section) ++ if section[".name"] ~= "loopback" then ++ field:value(section[".name"]) ++ end ++ end ++ ) ++ field.titleref = luci.dispatcher.build_url("admin", "network", "network") ++end ++ ++function cbi_add_knownips(field) ++ local _, n ++ for _, n in ipairs(ip.neighbors({ family = 4 })) do ++ if n.dest then ++ field:value(n.dest:string()) ++ end ++ end ++end ++ ++function firewall_find_zone(name) ++ local find ++ ++ luci.model.uci.cursor():foreach("firewall", "zone", ++ function (section) ++ if section.name == name then ++ find = section[".name"] ++ end ++ end ++ ) ++ ++ return find ++end ++ ++function iface_get_network(iface) ++ local link = ip.link(tostring(iface)) ++ if link.master then ++ iface = link.master ++ end ++ ++ local cur = uci.cursor() ++ local dump = util.ubus("network.interface", "dump", { }) ++ if dump then ++ local _, net ++ for _, net in ipairs(dump.interface) do ++ if net.l3_device == iface or net.device == iface then ++ -- cross check with uci to filter out @name style aliases ++ local uciname = cur:get("network", net.interface, "ifname") ++ if not uciname or uciname:sub(1, 1) ~= "@" then ++ return net.interface ++ end ++ end ++ end ++ end ++end +diff --git a/feeds/luci/modules/luci-base/luasrc/util.lua b/feeds/luci/modules/luci-base/luasrc/util.lua +new file mode 100644 +index 0000000..dcf8230 +--- /dev/null ++++ b/feeds/luci/modules/luci-base/luasrc/util.lua +@@ -0,0 +1,730 @@ ++-- Copyright 2008 Steven Barth ++-- Licensed to the public under the Apache License 2.0. ++ ++local io = require "io" ++local math = require "math" ++local table = require "table" ++local debug = require "debug" ++local ldebug = require "luci.debug" ++local string = require "string" ++local coroutine = require "coroutine" ++local tparser = require "luci.template.parser" ++ ++local _ubus = require "ubus" ++local _ubus_connection = nil ++ ++local getmetatable, setmetatable = getmetatable, setmetatable ++local rawget, rawset, unpack = rawget, rawset, unpack ++local tostring, type, assert = tostring, type, assert ++local ipairs, pairs, next, loadstring = ipairs, pairs, next, loadstring ++local require, pcall, xpcall = require, pcall, xpcall ++local collectgarbage, get_memory_limit = collectgarbage, get_memory_limit ++ ++module "luci.util" ++ ++-- ++-- Pythonic string formatting extension ++-- ++getmetatable("").__mod = function(a, b) ++ if not b then ++ return a ++ elseif type(b) == "table" then ++ for k, _ in pairs(b) do if type(b[k]) == "userdata" then b[k] = tostring(b[k]) end end ++ return a:format(unpack(b)) ++ else ++ if type(b) == "userdata" then b = tostring(b) end ++ return a:format(b) ++ end ++end ++ ++ ++-- ++-- Class helper routines ++-- ++ ++-- Instantiates a class ++local function _instantiate(class, ...) ++ local inst = setmetatable({}, {__index = class}) ++ ++ if inst.__init__ then ++ inst:__init__(...) ++ end ++ ++ return inst ++end ++ ++-- The class object can be instantiated by calling itself. ++-- Any class functions or shared parameters can be attached to this object. ++-- Attaching a table to the class object makes this table shared between ++-- all instances of this class. For object parameters use the __init__ function. ++-- Classes can inherit member functions and values from a base class. ++-- Class can be instantiated by calling them. All parameters will be passed ++-- to the __init__ function of this class - if such a function exists. ++-- The __init__ function must be used to set any object parameters that are not shared ++-- with other objects of this class. Any return values will be ignored. ++function class(base) ++ return setmetatable({}, { ++ __call = _instantiate, ++ __index = base ++ }) ++end ++ ++function instanceof(object, class) ++ local meta = getmetatable(object) ++ while meta and meta.__index do ++ if meta.__index == class then ++ return true ++ end ++ meta = getmetatable(meta.__index) ++ end ++ return false ++end ++ ++ ++-- ++-- Scope manipulation routines ++-- ++ ++local tl_meta = { ++ __mode = "k", ++ ++ __index = function(self, key) ++ local t = rawget(self, coxpt[coroutine.running()] ++ or coroutine.running() or 0) ++ return t and t[key] ++ end, ++ ++ __newindex = function(self, key, value) ++ local c = coxpt[coroutine.running()] or coroutine.running() or 0 ++ local r = rawget(self, c) ++ if not r then ++ rawset(self, c, { [key] = value }) ++ else ++ r[key] = value ++ end ++ end ++} ++ ++-- the current active coroutine. A thread local store is private a table object ++-- whose values can't be accessed from outside of the running coroutine. ++function threadlocal(tbl) ++ return setmetatable(tbl or {}, tl_meta) ++end ++ ++ ++-- ++-- Debugging routines ++-- ++ ++function perror(obj) ++ return io.stderr:write(tostring(obj) .. "\n") ++end ++ ++function dumptable(t, maxdepth, i, seen) ++ i = i or 0 ++ seen = seen or setmetatable({}, {__mode="k"}) ++ ++ for k,v in pairs(t) do ++ perror(string.rep("\t", i) .. tostring(k) .. "\t" .. tostring(v)) ++ if type(v) == "table" and (not maxdepth or i < maxdepth) then ++ if not seen[v] then ++ seen[v] = true ++ dumptable(v, maxdepth, i+1, seen) ++ else ++ perror(string.rep("\t", i) .. "*** RECURSION ***") ++ end ++ end ++ end ++end ++ ++ ++-- ++-- String and data manipulation routines ++-- ++ ++function pcdata(value) ++ return value and tparser.pcdata(tostring(value)) ++end ++ ++function striptags(value) ++ return value and tparser.striptags(tostring(value)) ++end ++ ++-- containing the resulting substrings. The optional max parameter specifies ++-- the number of bytes to process, regardless of the actual length of the given ++-- string. The optional last parameter, regex, specifies whether the separator ++-- sequence is interpreted as regular expression. ++-- pattern as regular expression (optional, default is false) ++function split(str, pat, max, regex) ++ pat = pat or "\n" ++ max = max or #str ++ ++ local t = {} ++ local c = 1 ++ ++ if #str == 0 then ++ return {""} ++ end ++ ++ if #pat == 0 then ++ return nil ++ end ++ ++ if max == 0 then ++ return str ++ end ++ ++ repeat ++ local s, e = str:find(pat, c, not regex) ++ max = max - 1 ++ if s and max < 0 then ++ t[#t+1] = str:sub(c) ++ else ++ t[#t+1] = str:sub(c, s and s - 1) ++ end ++ c = e and e + 1 or #str + 1 ++ until not s or max < 0 ++ ++ return t ++end ++ ++function trim(str) ++ return (str:gsub("^%s*(.-)%s*$", "%1")) ++end ++ ++function cmatch(str, pat) ++ local count = 0 ++ for _ in str:gmatch(pat) do count = count + 1 end ++ return count ++end ++ ++-- one token per invocation, the tokens are separated by whitespace. If the ++-- input value is a table, it is transformed into a string first. A nil value ++-- will result in a valid interator which aborts with the first invocation. ++function imatch(v) ++ if type(v) == "table" then ++ local k = nil ++ return function() ++ k = next(v, k) ++ return v[k] ++ end ++ ++ elseif type(v) == "number" or type(v) == "boolean" then ++ local x = true ++ return function() ++ if x then ++ x = false ++ return tostring(v) ++ end ++ end ++ ++ elseif type(v) == "userdata" or type(v) == "string" then ++ return tostring(v):gmatch("%S+") ++ end ++ ++ return function() end ++end ++ ++-- value or 0 if the unit is unknown. Upper- or lower case is irrelevant. ++-- Recognized units are: ++-- o "y" - one year (60*60*24*366) ++-- o "m" - one month (60*60*24*31) ++-- o "w" - one week (60*60*24*7) ++-- o "d" - one day (60*60*24) ++-- o "h" - one hour (60*60) ++-- o "min" - one minute (60) ++-- o "kb" - one kilobyte (1024) ++-- o "mb" - one megabyte (1024*1024) ++-- o "gb" - one gigabyte (1024*1024*1024) ++-- o "kib" - one si kilobyte (1000) ++-- o "mib" - one si megabyte (1000*1000) ++-- o "gib" - one si gigabyte (1000*1000*1000) ++function parse_units(ustr) ++ ++ local val = 0 ++ ++ -- unit map ++ local map = { ++ -- date stuff ++ y = 60 * 60 * 24 * 366, ++ m = 60 * 60 * 24 * 31, ++ w = 60 * 60 * 24 * 7, ++ d = 60 * 60 * 24, ++ h = 60 * 60, ++ min = 60, ++ ++ -- storage sizes ++ kb = 1024, ++ mb = 1024 * 1024, ++ gb = 1024 * 1024 * 1024, ++ ++ -- storage sizes (si) ++ kib = 1000, ++ mib = 1000 * 1000, ++ gib = 1000 * 1000 * 1000 ++ } ++ ++ -- parse input string ++ for spec in ustr:lower():gmatch("[0-9%.]+[a-zA-Z]*") do ++ ++ local num = spec:gsub("[^0-9%.]+$","") ++ local spn = spec:gsub("^[0-9%.]+", "") ++ ++ if map[spn] or map[spn:sub(1,1)] then ++ val = val + num * ( map[spn] or map[spn:sub(1,1)] ) ++ else ++ val = val + num ++ end ++ end ++ ++ ++ return val ++end ++ ++-- also register functions above in the central string class for convenience ++string.pcdata = pcdata ++string.striptags = striptags ++string.split = split ++string.trim = trim ++string.cmatch = cmatch ++string.parse_units = parse_units ++ ++ ++function append(src, ...) ++ for i, a in ipairs({...}) do ++ if type(a) == "table" then ++ for j, v in ipairs(a) do ++ src[#src+1] = v ++ end ++ else ++ src[#src+1] = a ++ end ++ end ++ return src ++end ++ ++function combine(...) ++ return append({}, ...) ++end ++ ++function contains(table, value) ++ for k, v in pairs(table) do ++ if value == v then ++ return k ++ end ++ end ++ return false ++end ++ ++-- Both table are - in fact - merged together. ++function update(t, updates) ++ for k, v in pairs(updates) do ++ t[k] = v ++ end ++end ++ ++function keys(t) ++ local keys = { } ++ if t then ++ for k, _ in kspairs(t) do ++ keys[#keys+1] = k ++ end ++ end ++ return keys ++end ++ ++function clone(object, deep) ++ local copy = {} ++ ++ for k, v in pairs(object) do ++ if deep and type(v) == "table" then ++ v = clone(v, deep) ++ end ++ copy[k] = v ++ end ++ ++ return setmetatable(copy, getmetatable(object)) ++end ++ ++ ++function dtable() ++ return setmetatable({}, { __index = ++ function(tbl, key) ++ return rawget(tbl, key) ++ or rawget(rawset(tbl, key, dtable()), key) ++ end ++ }) ++end ++ ++ ++-- Serialize the contents of a table value. ++function _serialize_table(t, seen) ++ assert(not seen[t], "Recursion detected.") ++ seen[t] = true ++ ++ local data = "" ++ local idata = "" ++ local ilen = 0 ++ ++ for k, v in pairs(t) do ++ if type(k) ~= "number" or k < 1 or math.floor(k) ~= k or ( k - #t ) > 3 then ++ k = serialize_data(k, seen) ++ v = serialize_data(v, seen) ++ data = data .. ( #data > 0 and ", " or "" ) .. ++ '[' .. k .. '] = ' .. v ++ elseif k > ilen then ++ ilen = k ++ end ++ end ++ ++ for i = 1, ilen do ++ local v = serialize_data(t[i], seen) ++ idata = idata .. ( #idata > 0 and ", " or "" ) .. v ++ end ++ ++ return idata .. ( #data > 0 and #idata > 0 and ", " or "" ) .. data ++end ++ ++-- with loadstring(). ++function serialize_data(val, seen) ++ seen = seen or setmetatable({}, {__mode="k"}) ++ ++ if val == nil then ++ return "nil" ++ elseif type(val) == "number" then ++ return val ++ elseif type(val) == "string" then ++ return "%q" % val ++ elseif type(val) == "boolean" then ++ return val and "true" or "false" ++ elseif type(val) == "function" then ++ return "loadstring(%q)" % get_bytecode(val) ++ elseif type(val) == "table" then ++ return "{ " .. _serialize_table(val, seen) .. " }" ++ else ++ return '"[unhandled data type:' .. type(val) .. ']"' ++ end ++end ++ ++function restore_data(str) ++ return loadstring("return " .. str)() ++end ++ ++ ++-- ++-- Byte code manipulation routines ++-- ++ ++-- will be stripped before it is returned. ++function get_bytecode(val) ++ local code ++ ++ if type(val) == "function" then ++ code = string.dump(val) ++ else ++ code = string.dump( loadstring( "return " .. serialize_data(val) ) ) ++ end ++ ++ return code -- and strip_bytecode(code) ++end ++ ++-- numbers and debugging numbers will be discarded. Original version by ++-- Peter Cawley (http://lua-users.org/lists/lua-l/2008-02/msg01158.html) ++function strip_bytecode(code) ++ local version, format, endian, int, size, ins, num, lnum = code:byte(5, 12) ++ local subint ++ if endian == 1 then ++ subint = function(code, i, l) ++ local val = 0 ++ for n = l, 1, -1 do ++ val = val * 256 + code:byte(i + n - 1) ++ end ++ return val, i + l ++ end ++ else ++ subint = function(code, i, l) ++ local val = 0 ++ for n = 1, l, 1 do ++ val = val * 256 + code:byte(i + n - 1) ++ end ++ return val, i + l ++ end ++ end ++ ++ local function strip_function(code) ++ local count, offset = subint(code, 1, size) ++ local stripped = { string.rep("\0", size) } ++ local dirty = offset + count ++ offset = offset + count + int * 2 + 4 ++ offset = offset + int + subint(code, offset, int) * ins ++ count, offset = subint(code, offset, int) ++ for n = 1, count do ++ local t ++ t, offset = subint(code, offset, 1) ++ if t == 1 then ++ offset = offset + 1 ++ elseif t == 4 then ++ offset = offset + size + subint(code, offset, size) ++ elseif t == 3 then ++ offset = offset + num ++ elseif t == 254 or t == 9 then ++ offset = offset + lnum ++ end ++ end ++ count, offset = subint(code, offset, int) ++ stripped[#stripped+1] = code:sub(dirty, offset - 1) ++ for n = 1, count do ++ local proto, off = strip_function(code:sub(offset, -1)) ++ stripped[#stripped+1] = proto ++ offset = offset + off - 1 ++ end ++ offset = offset + subint(code, offset, int) * int + int ++ count, offset = subint(code, offset, int) ++ for n = 1, count do ++ offset = offset + subint(code, offset, size) + size + int * 2 ++ end ++ count, offset = subint(code, offset, int) ++ for n = 1, count do ++ offset = offset + subint(code, offset, size) + size ++ end ++ stripped[#stripped+1] = string.rep("\0", int * 3) ++ return table.concat(stripped), offset ++ end ++ ++ return code:sub(1,12) .. strip_function(code:sub(13,-1)) ++end ++ ++ ++-- ++-- Sorting iterator functions ++-- ++ ++function _sortiter( t, f ) ++ local keys = { } ++ ++ local k, v ++ for k, v in pairs(t) do ++ keys[#keys+1] = k ++ end ++ ++ local _pos = 0 ++ ++ table.sort( keys, f ) ++ ++ return function() ++ _pos = _pos + 1 ++ if _pos <= #keys then ++ return keys[_pos], t[keys[_pos]], _pos ++ end ++ end ++end ++ ++-- the provided callback function. ++function spairs(t,f) ++ return _sortiter( t, f ) ++end ++ ++-- The table pairs are sorted by key. ++function kspairs(t) ++ return _sortiter( t ) ++end ++ ++-- The table pairs are sorted by value. ++function vspairs(t) ++ return _sortiter( t, function (a,b) return t[a] < t[b] end ) ++end ++ ++ ++-- ++-- System utility functions ++-- ++ ++function bigendian() ++ return string.byte(string.dump(function() end), 7) == 0 ++end ++ ++function exec(command) ++ local pp = io.popen(command) ++ local data = pp:read("*a") ++ pp:close() ++ ++ return data ++end ++ ++function execi(command) ++ local pp = io.popen(command) ++ ++ return pp and function() ++ local line = pp:read() ++ ++ if not line then ++ pp:close() ++ end ++ ++ return line ++ end ++end ++ ++-- Deprecated ++function execl(command) ++ local pp = io.popen(command) ++ local line = "" ++ local data = {} ++ ++ while true do ++ line = pp:read() ++ if (line == nil) then break end ++ data[#data+1] = line ++ end ++ pp:close() ++ ++ return data ++end ++ ++function ubus(object, method, data) ++ if not _ubus_connection then ++ _ubus_connection = _ubus.connect() ++ assert(_ubus_connection, "Unable to establish ubus connection") ++ end ++ ++ if object and method then ++ if type(data) ~= "table" then ++ data = { } ++ end ++ return _ubus_connection:call(object, method, data) ++ elseif object then ++ return _ubus_connection:signatures(object) ++ else ++ return _ubus_connection:objects() ++ end ++end ++ ++function serialize_json(x, cb) ++ local rv, push = nil, cb ++ if not push then ++ rv = { } ++ push = function(tok) rv[#rv+1] = tok end ++ end ++ ++ if x == nil then ++ push("null") ++ elseif type(x) == "table" then ++ -- test if table is array like ++ local k, v ++ local n1, n2 = 0, 0 ++ for k in pairs(x) do n1 = n1 + 1 end ++ for k in ipairs(x) do n2 = n2 + 1 end ++ ++ if n1 == n2 and n1 > 0 then ++ push("[") ++ for k = 1, n2 do ++ if k > 1 then ++ push(",") ++ end ++ serialize_json(x[k], push) ++ end ++ push("]") ++ else ++ push("{") ++ for k, v in pairs(x) do ++ push("%q:" % tostring(k)) ++ serialize_json(v, push) ++ if next(x, k) then ++ push(",") ++ end ++ end ++ push("}") ++ end ++ elseif type(x) == "number" or type(x) == "boolean" then ++ if (x ~= x) then ++ -- NaN is the only value that doesn't equal to itself. ++ push("Number.NaN") ++ else ++ push(tostring(x)) ++ end ++ else ++ push('"%s"' % tostring(x):gsub('["%z\1-\31\\]', ++ function(c) return '\\u%04x' % c:byte(1) end)) ++ end ++ ++ if not cb then ++ return table.concat(rv, "") ++ end ++end ++ ++ ++function libpath() ++ return require "nixio.fs".dirname(ldebug.__file__) ++end ++ ++ ++-- ++-- Coroutine safe xpcall and pcall versions modified for Luci ++-- original version: ++-- coxpcall 1.13 - Copyright 2005 - Kepler Project (www.keplerproject.org) ++-- ++-- Copyright © 2005 Kepler Project. ++-- Permission is hereby granted, free of charge, to any person obtaining a ++-- copy of this software and associated documentation files (the "Software"), ++-- to deal in the Software without restriction, including without limitation ++-- the rights to use, copy, modify, merge, publish, distribute, sublicense, ++-- and/or sell copies of the Software, and to permit persons to whom the ++-- Software is furnished to do so, subject to the following conditions: ++-- ++-- The above copyright notice and this permission notice shall be ++-- included in all copies or substantial portions of the Software. ++-- ++-- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, ++-- EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES ++-- OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. ++-- IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, ++-- DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, ++-- TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE ++-- OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ++ ++local performResume, handleReturnValue ++local oldpcall, oldxpcall = pcall, xpcall ++coxpt = {} ++setmetatable(coxpt, {__mode = "kv"}) ++ ++-- Identity function for copcall ++local function copcall_id(trace, ...) ++ return ... ++end ++ ++-- values of either the function or the error handler ++function coxpcall(f, err, ...) ++ local res, co = oldpcall(coroutine.create, f) ++ if not res then ++ local params = {...} ++ local newf = function() return f(unpack(params)) end ++ co = coroutine.create(newf) ++ end ++ local c = coroutine.running() ++ coxpt[co] = coxpt[c] or c or 0 ++ ++ return performResume(err, co, ...) ++end ++ ++-- values of the function or the error object ++function copcall(f, ...) ++ return coxpcall(f, copcall_id, ...) ++end ++ ++-- Handle return value of protected call ++function handleReturnValue(err, co, status, ...) ++ if not status then ++ return false, err(debug.traceback(co, (...)), ...) ++ end ++ ++ if coroutine.status(co) ~= 'suspended' then ++ return true, ... ++ end ++ ++ return performResume(err, co, coroutine.yield(...)) ++end ++ ++-- Resume execution of protected function call ++function performResume(err, co, ...) ++ return handleReturnValue(err, co, coroutine.resume(co, ...)) ++end +diff --git a/feeds/luci/modules/luci-base/luasrc/util.luadoc b/feeds/luci/modules/luci-base/luasrc/util.luadoc +new file mode 100644 +index 0000000..805eeb7 +--- /dev/null ++++ b/feeds/luci/modules/luci-base/luasrc/util.luadoc +@@ -0,0 +1,378 @@ ++---[[ ++LuCI utility functions. ++]] ++module "luci.util" ++ ++---[[ ++Create a Class object (Python-style object model). ++ ++The class object can be instantiated by calling itself. ++Any class functions or shared parameters can be attached to this object. ++Attaching a table to the class object makes this table shared between ++all instances of this class. For object parameters use the __init__ function. ++Classes can inherit member functions and values from a base class. ++Class can be instantiated by calling them. All parameters will be passed ++to the __init__ function of this class - if such a function exists. ++The __init__ function must be used to set any object parameters that are not shared ++with other objects of this class. Any return values will be ignored. ++@class function ++@name class ++@param base The base class to inherit from (optional) ++@return A class object ++@see instanceof ++@see clone ++]] ++ ++---[[ ++Test whether the given object is an instance of the given class. ++ ++@class function ++@name instanceof ++@param object Object instance ++@param class Class object to test against ++@return Boolean indicating whether the object is an instance ++@see class ++@see clone ++]] ++ ++---[[ ++Create a new or get an already existing thread local store associated with ++ ++the current active coroutine. A thread local store is private a table object ++whose values can't be accessed from outside of the running coroutine. ++@class function ++@name threadlocal ++@return Table value representing the corresponding thread local store ++]] ++ ++---[[ ++Write given object to stderr. ++ ++@class function ++@name perror ++@param obj Value to write to stderr ++@return Boolean indicating whether the write operation was successful ++]] ++ ++---[[ ++Recursively dumps a table to stdout, useful for testing and debugging. ++ ++@class function ++@name dumptable ++@param t Table value to dump ++@param maxdepth Maximum depth ++@return Always nil ++]] ++ ++---[[ ++Create valid XML PCDATA from given string. ++ ++@class function ++@name pcdata ++@param value String value containing the data to escape ++@return String value containing the escaped data ++]] ++ ++---[[ ++Strip HTML tags from given string. ++ ++@class function ++@name striptags ++@param value String containing the HTML text ++@return String with HTML tags stripped of ++]] ++ ++---[[ ++Splits given string on a defined separator sequence and return a table ++ ++containing the resulting substrings. The optional max parameter specifies ++the number of bytes to process, regardless of the actual length of the given ++string. The optional last parameter, regex, specifies whether the separator ++sequence is interpreted as regular expression. ++@class function ++@name split ++@param str String value containing the data to split up ++@param pat String with separator pattern (optional, defaults to "\n") ++@param max Maximum times to split (optional) ++@param regex Boolean indicating whether to interpret the separator ++-- pattern as regular expression (optional, default is false) ++@return Table containing the resulting substrings ++]] ++ ++---[[ ++Remove leading and trailing whitespace from given string value. ++ ++@class function ++@name trim ++@param str String value containing whitespace padded data ++@return String value with leading and trailing space removed ++]] ++ ++---[[ ++Count the occurences of given substring in given string. ++ ++@class function ++@name cmatch ++@param str String to search in ++@param pattern String containing pattern to find ++@return Number of found occurences ++]] ++ ++---[[ ++Return a matching iterator for the given value. The iterator will return ++ ++one token per invocation, the tokens are separated by whitespace. If the ++input value is a table, it is transformed into a string first. A nil value ++will result in a valid interator which aborts with the first invocation. ++@class function ++@name imatch ++@param val The value to scan (table, string or nil) ++@return Iterator which returns one token per call ++]] ++ ++---[[ ++Parse certain units from the given string and return the canonical integer ++ ++value or 0 if the unit is unknown. Upper- or lower case is irrelevant. ++Recognized units are: ++-- o "y" - one year (60*60*24*366) ++ o "m" - one month (60*60*24*31) ++ o "w" - one week (60*60*24*7) ++ o "d" - one day (60*60*24) ++ o "h" - one hour (60*60) ++ o "min" - one minute (60) ++ o "kb" - one kilobyte (1024) ++ o "mb" - one megabyte (1024*1024) ++ o "gb" - one gigabyte (1024*1024*1024) ++ o "kib" - one si kilobyte (1000) ++ o "mib" - one si megabyte (1000*1000) ++ o "gib" - one si gigabyte (1000*1000*1000) ++@class function ++@name parse_units ++@param ustr String containing a numerical value with trailing unit ++@return Number containing the canonical value ++]] ++ ++---[[ ++Appends numerically indexed tables or single objects to a given table. ++ ++@class function ++@name append ++@param src Target table ++@param ... Objects to insert ++@return Target table ++]] ++ ++---[[ ++Combines two or more numerically indexed tables and single objects into one table. ++ ++@class function ++@name combine ++@param tbl1 Table value to combine ++@param tbl2 Table value to combine ++@param ... More tables to combine ++@return Table value containing all values of given tables ++]] ++ ++---[[ ++Checks whether the given table contains the given value. ++ ++@class function ++@name contains ++@param table Table value ++@param value Value to search within the given table ++@return number indicating the first index at which the given value occurs ++-- within table or false. ++]] ++ ++---[[ ++Update values in given table with the values from the second given table. ++ ++Both table are - in fact - merged together. ++@class function ++@name update ++@param t Table which should be updated ++@param updates Table containing the values to update ++@return Always nil ++]] ++ ++---[[ ++Retrieve all keys of given associative table. ++ ++@class function ++@name keys ++@param t Table to extract keys from ++@return Sorted table containing the keys ++]] ++ ++---[[ ++Clones the given object and return it's copy. ++ ++@class function ++@name clone ++@param object Table value to clone ++@param deep Boolean indicating whether to do recursive cloning ++@return Cloned table value ++]] ++ ++---[[ ++Create a dynamic table which automatically creates subtables. ++ ++@class function ++@name dtable ++@return Dynamic Table ++]] ++ ++---[[ ++Recursively serialize given data to lua code, suitable for restoring ++ ++with loadstring(). ++@class function ++@name serialize_data ++@param val Value containing the data to serialize ++@return String value containing the serialized code ++@see restore_data ++@see get_bytecode ++]] ++ ++---[[ ++Restore data previously serialized with serialize_data(). ++ ++@class function ++@name restore_data ++@param str String containing the data to restore ++@return Value containing the restored data structure ++@see serialize_data ++@see get_bytecode ++]] ++ ++---[[ ++Return the current runtime bytecode of the given data. The byte code ++ ++will be stripped before it is returned. ++@class function ++@name get_bytecode ++@param val Value to return as bytecode ++@return String value containing the bytecode of the given data ++]] ++ ++---[[ ++Strips unnescessary lua bytecode from given string. Information like line ++ ++numbers and debugging numbers will be discarded. Original version by ++Peter Cawley (http://lua-users.org/lists/lua-l/2008-02/msg01158.html) ++@class function ++@name strip_bytecode ++@param code String value containing the original lua byte code ++@return String value containing the stripped lua byte code ++]] ++ ++---[[ ++Return a key, value iterator which returns the values sorted according to ++ ++the provided callback function. ++@class function ++@name spairs ++@param t The table to iterate ++@param f A callback function to decide the order of elements ++@return Function value containing the corresponding iterator ++]] ++ ++---[[ ++Return a key, value iterator for the given table. ++ ++The table pairs are sorted by key. ++@class function ++@name kspairs ++@param t The table to iterate ++@return Function value containing the corresponding iterator ++]] ++ ++---[[ ++Return a key, value iterator for the given table. ++ ++The table pairs are sorted by value. ++@class function ++@name vspairs ++@param t The table to iterate ++@return Function value containing the corresponding iterator ++]] ++ ++---[[ ++Test whether the current system is operating in big endian mode. ++ ++@class function ++@name bigendian ++@return Boolean value indicating whether system is big endian ++]] ++ ++---[[ ++Execute given commandline and gather stdout. ++ ++@class function ++@name exec ++@param command String containing command to execute ++@return String containing the command's stdout ++]] ++ ++---[[ ++Return a line-buffered iterator over the output of given command. ++ ++@class function ++@name execi ++@param command String containing the command to execute ++@return Iterator ++]] ++ ++---[[ ++Issue an ubus call. ++ ++@class function ++@name ubus ++@param object String containing the ubus object to call ++@param method String containing the ubus method to call ++@param values Table containing the values to pass ++@return Table containin the ubus result ++]] ++ ++---[[ ++Convert data structure to JSON ++ ++@class function ++@name serialize_json ++@param data The data to serialize ++@param writer A function to write a chunk of JSON data (optional) ++@return String containing the JSON if called without write callback ++]] ++ ++---[[ ++Returns the absolute path to LuCI base directory. ++ ++@class function ++@name libpath ++@return String containing the directory path ++]] ++ ++---[[ ++This is a coroutine-safe drop-in replacement for Lua's "xpcall"-function ++ ++@class function ++@name coxpcall ++@param f Lua function to be called protected ++@param err Custom error handler ++@param ... Parameters passed to the function ++@return A boolean whether the function call succeeded and the return ++-- values of either the function or the error handler ++]] ++ ++---[[ ++This is a coroutine-safe drop-in replacement for Lua's "pcall"-function ++ ++@class function ++@name copcall ++@param f Lua function to be called protected ++@param ... Parameters passed to the function ++@return A boolean whether the function call succeeded and the returns ++-- values of the function or the error object ++]] ++ +diff --git a/feeds/luci/modules/luci-base/luasrc/version.lua b/feeds/luci/modules/luci-base/luasrc/version.lua +new file mode 100644 +index 0000000..8af2e80 +--- /dev/null ++++ b/feeds/luci/modules/luci-base/luasrc/version.lua +@@ -0,0 +1,9 @@ ++-- Licensed to the public under the Apache License 2.0. ++ ++module "luci.version" ++ ++distname = "Host System" ++distversion = "SDK" ++ ++luciname = "LuCI" ++luciversion = "SVN" +diff --git a/feeds/luci/modules/luci-base/luasrc/view/cbi/apply_xhr.htm b/feeds/luci/modules/luci-base/luasrc/view/cbi/apply_xhr.htm +new file mode 100644 +index 0000000..1814c93 +--- /dev/null ++++ b/feeds/luci/modules/luci-base/luasrc/view/cbi/apply_xhr.htm +@@ -0,0 +1,43 @@ ++<% export("cbi_apply_xhr", function(id, configs, redirect) -%> ++
    ++ <%:Applying changes%> ++ ++ ++ <%:Loading%> ++ <%:Waiting for changes to be applied...%> ++
    ++<%- end) %> +diff --git a/feeds/luci/modules/luci-base/luasrc/view/cbi/browser.htm b/feeds/luci/modules/luci-base/luasrc/view/cbi/browser.htm +new file mode 100644 +index 0000000..e4a4077 +--- /dev/null ++++ b/feeds/luci/modules/luci-base/luasrc/view/cbi/browser.htm +@@ -0,0 +1,7 @@ ++<% local v = self:cfgvalue(section) -%> ++<%+cbi/valueheader%> ++ /> ++ ++<%+cbi/valuefooter%> +diff --git a/feeds/luci/modules/luci-base/luasrc/view/cbi/button.htm b/feeds/luci/modules/luci-base/luasrc/view/cbi/button.htm +new file mode 100644 +index 0000000..30f8ddf +--- /dev/null ++++ b/feeds/luci/modules/luci-base/luasrc/view/cbi/button.htm +@@ -0,0 +1,7 @@ ++<%+cbi/valueheader%> ++ <% if self:cfgvalue(section) ~= false then %> ++ " type="submit"<%= attr("name", cbid) .. attr("id", cbid) .. attr("value", self.inputtitle or self.title)%> /> ++ <% else %> ++ - ++ <% end %> ++<%+cbi/valuefooter%> +diff --git a/feeds/luci/modules/luci-base/luasrc/view/cbi/cell_valuefooter.htm b/feeds/luci/modules/luci-base/luasrc/view/cbi/cell_valuefooter.htm +new file mode 100644 +index 0000000..220ebd4 +--- /dev/null ++++ b/feeds/luci/modules/luci-base/luasrc/view/cbi/cell_valuefooter.htm +@@ -0,0 +1,20 @@ ++ ++
    ">
    ++ ++ ++<% if #self.deps > 0 then -%> ++ ++<%- end %> +diff --git a/feeds/luci/modules/luci-base/luasrc/view/cbi/cell_valueheader.htm b/feeds/luci/modules/luci-base/luasrc/view/cbi/cell_valueheader.htm +new file mode 100644 +index 0000000..9e2e145 +--- /dev/null ++++ b/feeds/luci/modules/luci-base/luasrc/view/cbi/cell_valueheader.htm +@@ -0,0 +1,2 @@ ++ ++
    "> +diff --git a/feeds/luci/modules/luci-base/luasrc/view/cbi/compound.htm b/feeds/luci/modules/luci-base/luasrc/view/cbi/compound.htm +new file mode 100644 +index 0000000..12d02bb +--- /dev/null ++++ b/feeds/luci/modules/luci-base/luasrc/view/cbi/compound.htm +@@ -0,0 +1 @@ ++<%- self:render_children() %> +diff --git a/feeds/luci/modules/luci-base/luasrc/view/cbi/delegator.htm b/feeds/luci/modules/luci-base/luasrc/view/cbi/delegator.htm +new file mode 100644 +index 0000000..4fd1926 +--- /dev/null ++++ b/feeds/luci/modules/luci-base/luasrc/view/cbi/delegator.htm +@@ -0,0 +1,24 @@ ++<%- self.active:render() %> ++
    ++ ++<% for _, x in ipairs(self.chain) do %> ++ ++<% end %> ++<% if not self.disallow_pageactions then %> ++<% if self.allow_finish and not self:get_next(self.current) then %> ++ ++<% elseif self:get_next(self.current) then %> ++ ++<% end %> ++<% if self.allow_cancel then %> ++ ++<% end %> ++<% if self.allow_reset then %> ++ ++<% end %> ++<% if self.allow_back and self:get_prev(self.current) then %> ++ ++<% end %> ++<% end %> ++ ++
    +diff --git a/feeds/luci/modules/luci-base/luasrc/view/cbi/dvalue.htm b/feeds/luci/modules/luci-base/luasrc/view/cbi/dvalue.htm +new file mode 100644 +index 0000000..78e6f32 +--- /dev/null ++++ b/feeds/luci/modules/luci-base/luasrc/view/cbi/dvalue.htm +@@ -0,0 +1,13 @@ ++<%+cbi/valueheader%> ++<% if self.href then %><% end -%> ++ <% ++ local val = self:cfgvalue(section) or self.default or "" ++ if not self.rawhtml then ++ write(pcdata(val)) ++ else ++ write(val) ++ end ++ %> ++<%- if self.href then %><%end%> ++" /> ++<%+cbi/valuefooter%> +diff --git a/feeds/luci/modules/luci-base/luasrc/view/cbi/dynlist.htm b/feeds/luci/modules/luci-base/luasrc/view/cbi/dynlist.htm +new file mode 100644 +index 0000000..fd626a4 +--- /dev/null ++++ b/feeds/luci/modules/luci-base/luasrc/view/cbi/dynlist.htm +@@ -0,0 +1,26 @@ ++<%+cbi/valueheader%> ++
    ++<% ++ local vals = self:cfgvalue(section) or {} ++ for i=1, #vals + 1 do ++ local val = vals[i] ++ if (val and #val > 0) or (i == 1) then ++%> ++ />
    ++<% end end %> ++
    ++ ++<%+cbi/valuefooter%> +diff --git a/feeds/luci/modules/luci-base/luasrc/view/cbi/error.htm b/feeds/luci/modules/luci-base/luasrc/view/cbi/error.htm +new file mode 100644 +index 0000000..2acb969 +--- /dev/null ++++ b/feeds/luci/modules/luci-base/luasrc/view/cbi/error.htm +@@ -0,0 +1,19 @@ ++
    ++ <% if self.title and #self.title > 0 then %>

    <%=self.title%>

    <% end %> ++ <% if self.description and #self.description > 0 then %>
    <%=self.description%>
    <% end %> ++ ++

    ++ <%: The configuration file could not be loaded due to the following error: %>
    ++ <%=pcdata(self.error)%> ++

    ++ ++ ++ ++

    ++ <%: Edit the raw configuration data above to fix any error and hit "Save" to reload the page. %> ++

    ++ ++
    ++ ++
    ++
    +diff --git a/feeds/luci/modules/luci-base/luasrc/view/cbi/filebrowser.htm b/feeds/luci/modules/luci-base/luasrc/view/cbi/filebrowser.htm +new file mode 100644 +index 0000000..a79beeb +--- /dev/null ++++ b/feeds/luci/modules/luci-base/luasrc/view/cbi/filebrowser.htm +@@ -0,0 +1,108 @@ ++ ++ ++ ++ ++ Filebrowser - LuCI ++ ++ ++ ++ ++ ++ <% ++ require("nixio.fs") ++ require("nixio.util") ++ require("luci.http") ++ require("luci.dispatcher") ++ ++ local field = luci.http.formvalue('field') ++ local request = luci.dispatcher.context.args ++ local path = { '' } ++ ++ for i = 1, #request do ++ if request[i] ~= '..' and #request[i] > 0 then ++ path[#path+1] = request[i] ++ end ++ end ++ ++ local filepath = table.concat( path, '/' ) ++ local filestat = nixio.fs.stat( filepath ) ++ local baseurl = luci.dispatcher.build_url('admin', 'filebrowser') ++ ++ if filestat and filestat.type == "reg" then ++ table.remove( path, #path ) ++ filepath = table.concat( path, '/' ) .. '/' ++ elseif not ( filestat and filestat.type == "dir" ) then ++ path = { '' } ++ filepath = '/' ++ else ++ filepath = filepath .. '/' ++ end ++ ++ local entries = nixio.util.consume((nixio.fs.dir(filepath))) ++ -%> ++
    ++ Location: ++ <% for i, dir in ipairs(path) do %> ++ <% if i == 1 then %> ++ (root) ++ <% elseif next(path, i) then %> ++ <% baseurl = baseurl .. '/' .. dir %> ++ / <%=dir%> ++ <% else %> ++ <% baseurl = baseurl .. '/' .. dir %> ++ / <%=dir%> ++ <% end %> ++ <% end %> ++
    ++ ++
    ++ ++
    ++
      ++ <% for _, e in luci.util.vspairs(entries) do ++ local stat = nixio.fs.stat(filepath..e) ++ if stat and stat.type == 'dir' then ++ -%> ++
    • ++ <%:Directory%> ++ <%=e%>/ ++
    • ++ <% end end -%> ++ ++ <% for _, e in luci.util.vspairs(entries) do ++ local stat = nixio.fs.stat(filepath..e) ++ if stat and stat.type ~= 'dir' then ++ -%> ++
    • ++ <%:File%> ++ <%=e%> ++
    • ++ <% end end -%> ++
    ++
    ++ ++ +diff --git a/feeds/luci/modules/luci-base/luasrc/view/cbi/firewall_zoneforwards.htm b/feeds/luci/modules/luci-base/luasrc/view/cbi/firewall_zoneforwards.htm +new file mode 100644 +index 0000000..2a433b5 +--- /dev/null ++++ b/feeds/luci/modules/luci-base/luasrc/view/cbi/firewall_zoneforwards.htm +@@ -0,0 +1,59 @@ ++<%+cbi/valueheader%> ++ ++<%- ++ local utl = require "luci.util" ++ local fwm = require "luci.model.firewall".init() ++ local nwm = require "luci.model.network".init() ++ ++ local zone, fwd, fz ++ local value = self:formvalue(section) ++ if not value or value == "-" then ++ value = self:cfgvalue(section) or self.default ++ end ++ ++ local def = fwm:get_defaults() ++ local zone = fwm:get_zone(value) ++ local empty = true ++-%> ++ ++<% if zone then %> ++
    ++ ++  ⇒  ++ <% for _, fwd in ipairs(zone:get_forwardings_by("src")) do ++ fz = fwd:dest_zone() ++ empty = false %> ++   ++ <% end %> ++ <% if empty then %> ++ ++ <% end %> ++
    ++<% end %> ++ ++<%+cbi/valuefooter%> +diff --git a/feeds/luci/modules/luci-base/luasrc/view/cbi/firewall_zonelist.htm b/feeds/luci/modules/luci-base/luasrc/view/cbi/firewall_zonelist.htm +new file mode 100644 +index 0000000..7973437 +--- /dev/null ++++ b/feeds/luci/modules/luci-base/luasrc/view/cbi/firewall_zonelist.htm +@@ -0,0 +1,89 @@ ++<%+cbi/valueheader%> ++ ++<%- ++ local utl = require "luci.util" ++ local fwm = require "luci.model.firewall".init() ++ local nwm = require "luci.model.network".init() ++ ++ local zone, net, iface ++ local zones = fwm:get_zones() ++ local value = self:formvalue(section) ++ if not value or value == "-" then ++ value = self:cfgvalue(section) or self.default ++ end ++ ++ local selected = false ++ local checked = { } ++ ++ for value in utl.imatch(value) do ++ checked[value] = true ++ end ++ ++ if not next(checked) then ++ checked[""] = true ++ end ++-%> ++ ++
      ++ <% if self.allowlocal then %> ++
    • ++ />   ++ style="background-color:<%=fwm.zone.get_color()%>" class="zonebadge"> ++ <%:Device%> ++ <% if self.allowany and self.allowlocal then %>(<%:input%>)<% end %> ++ ++
    • ++ <% end %> ++ <% if self.allowany then %> ++
    • ++ />   ++ style="background-color:<%=fwm.zone.get_color()%>" class="zonebadge"> ++ <%:Any zone%> ++ <% if self.allowany and self.allowlocal then %>(<%:forward%>)<% end %> ++ ++
    • ++ <% end %> ++ <% ++ for _, zone in utl.spairs(zones, function(a,b) return (zones[a]:name() < zones[b]:name()) end) do ++ if zone:name() ~= self.exclude then ++ selected = selected or (value == zone:name()) ++ %> ++
    • ++ />   ++ style="background-color:<%=zone:get_color()%>" class="zonebadge"> ++ <%=zone:name()%>: ++ <% ++ local zempty = true ++ for _, net in ipairs(zone:get_networks()) do ++ net = nwm:get_network(net) ++ if net then ++ zempty = false ++ %> ++ <%=net:name()%>: ++ <% ++ local nempty = true ++ for _, iface in ipairs(net:is_bridge() and net:get_interfaces() or { net:get_interface() }) do ++ nempty = false ++ %> ++ style="width:16px; height:16px; vertical-align:middle" src="<%=resource%>/icons/<%=iface:type()%><%=iface:is_up() and "" or "_disabled"%>.png" /> ++ <% end %> ++ <% if nempty then %><%:(empty)%><% end %> ++ ++ <% end end %> ++ <% if zempty then %><%:(empty)%><% end %> ++ ++
    • ++ <% end end %> ++ ++ <% if self.widget ~= "checkbox" and not self.nocreate then %> ++
    • ++ />   ++
      ++ <%:unspecified -or- create:%>  ++ onfocus="document.getElementById('<%=cbid%>_new').checked=true" /> ++
      ++
    • ++ <% end %> ++
    ++ ++<%+cbi/valuefooter%> +diff --git a/feeds/luci/modules/luci-base/luasrc/view/cbi/footer.htm b/feeds/luci/modules/luci-base/luasrc/view/cbi/footer.htm +new file mode 100644 +index 0000000..115250a +--- /dev/null ++++ b/feeds/luci/modules/luci-base/luasrc/view/cbi/footer.htm +@@ -0,0 +1,26 @@ ++ <%- if pageaction then -%> ++
    ++ <% if redirect then %> ++
    ++ ++
    ++ <% end %> ++ ++ <% if flow.skip then %> ++ ++ <% end %> ++ <% if not autoapply and not flow.hideapplybtn then %> ++ ++ <% end %> ++ <% if not flow.hidesavebtn then %> ++ ++ <% end %> ++ <% if not flow.hideresetbtn then %> ++ ++ <% end %> ++ ++ ++
    ++ <%- end -%> ++ ++<%+footer%> +diff --git a/feeds/luci/modules/luci-base/luasrc/view/cbi/full_valuefooter.htm b/feeds/luci/modules/luci-base/luasrc/view/cbi/full_valuefooter.htm +new file mode 100644 +index 0000000..4876fbc +--- /dev/null ++++ b/feeds/luci/modules/luci-base/luasrc/view/cbi/full_valuefooter.htm +@@ -0,0 +1,59 @@ ++ <% if self.description and #self.description > 0 then -%> ++ <% if not luci.util.instanceof(self, luci.cbi.DynamicList) and (not luci.util.instanceof(self, luci.cbi.Flag) or self.orientation == "horizontal") then -%> ++
    ++ <%- end %> ++
    ++ <%:help%> ++ <%=self.description%> ++
    ++ <%- end %> ++ <%- if self.title and #self.title > 0 then -%> ++
    ++ <%- end -%> ++ ++ ++ ++<% if #self.deps > 0 or #self.subdeps > 0 then -%> ++ ++<%- end %> +diff --git a/feeds/luci/modules/luci-base/luasrc/view/cbi/full_valueheader.htm b/feeds/luci/modules/luci-base/luasrc/view/cbi/full_valueheader.htm +new file mode 100644 +index 0000000..aaf0854 +--- /dev/null ++++ b/feeds/luci/modules/luci-base/luasrc/view/cbi/full_valueheader.htm +@@ -0,0 +1,9 @@ ++
    "> ++ <%- if self.title and #self.title > 0 then -%> ++ ++
    ++ <%- end -%> +diff --git a/feeds/luci/modules/luci-base/luasrc/view/cbi/fvalue.htm b/feeds/luci/modules/luci-base/luasrc/view/cbi/fvalue.htm +new file mode 100644 +index 0000000..a1e0808 +--- /dev/null ++++ b/feeds/luci/modules/luci-base/luasrc/view/cbi/fvalue.htm +@@ -0,0 +1,9 @@ ++<%+cbi/valueheader%> ++ /> ++ /> ++<%+cbi/valuefooter%> +diff --git a/feeds/luci/modules/luci-base/luasrc/view/cbi/header.htm b/feeds/luci/modules/luci-base/luasrc/view/cbi/header.htm +new file mode 100644 +index 0000000..2bddaba +--- /dev/null ++++ b/feeds/luci/modules/luci-base/luasrc/view/cbi/header.htm +@@ -0,0 +1,7 @@ ++<%+header%> ++
    ++
    ++ ++ ++ ++
    +diff --git a/feeds/luci/modules/luci-base/luasrc/view/cbi/lvalue.htm b/feeds/luci/modules/luci-base/luasrc/view/cbi/lvalue.htm +new file mode 100644 +index 0000000..8cc086d +--- /dev/null ++++ b/feeds/luci/modules/luci-base/luasrc/view/cbi/lvalue.htm +@@ -0,0 +1,18 @@ ++<%+cbi/valueheader%> ++<% if self.widget == "select" then %> ++ ++<% elseif self.widget == "radio" then ++ local c = 0 ++ for i, key in pairs(self.keylist) do ++ c = c + 1 ++%> ++ /> ++ ><%=self.vallist[i]%> ++<% if c == self.size then c = 0 %><% if self.orientation == "horizontal" then %> <% else %>
    <% end %> ++<% end end %> ++<% end %> ++<%+cbi/valuefooter%> +diff --git a/feeds/luci/modules/luci-base/luasrc/view/cbi/map.htm b/feeds/luci/modules/luci-base/luasrc/view/cbi/map.htm +new file mode 100644 +index 0000000..053220d +--- /dev/null ++++ b/feeds/luci/modules/luci-base/luasrc/view/cbi/map.htm +@@ -0,0 +1,13 @@ ++<%- if firstmap and messages then local msg; for _, msg in ipairs(messages) do -%> ++
    <%=pcdata(msg)%>
    ++<%- end end -%> ++ ++<%-+cbi/apply_xhr-%> ++ ++
    ++ <% if self.title and #self.title > 0 then %>

    <%=self.title%>

    <% end %> ++ <% if self.description and #self.description > 0 then %>
    <%=self.description%>
    <% end %> ++ <%- if firstmap and applymap then cbi_apply_xhr(self.config, parsechain, redirect) end -%> ++ <%- self:render_children() %> ++
    ++
    +diff --git a/feeds/luci/modules/luci-base/luasrc/view/cbi/mvalue.htm b/feeds/luci/modules/luci-base/luasrc/view/cbi/mvalue.htm +new file mode 100644 +index 0000000..6a0b388 +--- /dev/null ++++ b/feeds/luci/modules/luci-base/luasrc/view/cbi/mvalue.htm +@@ -0,0 +1,19 @@ ++<% local v = self:valuelist(section) or {} -%> ++<%+cbi/valueheader%> ++<% if self.widget == "select" then %> ++ ++<% elseif self.widget == "checkbox" then ++ local c = 0; ++ for i, key in pairs(self.keylist) do ++ c = c + 1 ++%> ++ /> ++ ><%=self.vallist[i]%>
    ++<% if c == self.size then c = 0 %>
    ++<% end end %> ++<% end %> ++<%+cbi/valuefooter%> +diff --git a/feeds/luci/modules/luci-base/luasrc/view/cbi/network_ifacelist.htm b/feeds/luci/modules/luci-base/luasrc/view/cbi/network_ifacelist.htm +new file mode 100644 +index 0000000..643d849 +--- /dev/null ++++ b/feeds/luci/modules/luci-base/luasrc/view/cbi/network_ifacelist.htm +@@ -0,0 +1,81 @@ ++<%+cbi/valueheader%> ++ ++<%- ++ local utl = require "luci.util" ++ local net = require "luci.model.network".init() ++ local cbeid = luci.cbi.FEXIST_PREFIX .. self.config .. "." .. section .. "." .. self.option ++ ++ local iface ++ local ifaces = net:get_interfaces() ++ local value ++ ++ if self.map:formvalue(cbeid) == "1" then ++ value = self:formvalue(section) or self.default or "" ++ else ++ value = self:cfgvalue(section) or self.default ++ end ++ ++ local checked = { } ++ ++ if value then ++ for value in utl.imatch(value) do ++ checked[value] = true ++ end ++ else ++ local n = self.network and net:get_network(self.network) ++ if n then ++ local i ++ for _, i in ipairs(n:get_interfaces() or { n:get_interface() }) do ++ checked[i:name()] = true ++ end ++ end ++ end ++-%> ++ ++ ++
      ++ <% for _, iface in ipairs(ifaces) do ++ local link = iface:adminlink() ++ if (not self.nobridges or not iface:is_bridge()) and ++ (not self.noinactive or iface:is_up()) and ++ iface:name() ~= self.exclude ++ then %> ++
    • ++ " onclick="cbi_d_update(this.id)" onchange="cbi_d_update(this.id)"<%= ++ attr("type", self.widget or "radio") .. ++ attr("id", cbid .. "." .. iface:name()) .. ++ attr("name", cbid) .. attr("value", iface:name()) .. ++ ifattr(checked[iface:name()], "checked", "checked") ++ %> />   ++ > ++ <% if link then -%><% end -%> ++ style="width:16px; height:16px; vertical-align:middle" src="<%=resource%>/icons/<%=iface:type()%><%=iface:is_up() and "" or "_disabled"%>.png" /> ++ <% if link then -%><% end -%> ++ <%=pcdata(iface:get_i18n())%> ++ <% local ns = iface:get_networks(); if #ns > 0 then %>( ++ <%- local i, n; for i, n in ipairs(ns) do -%> ++ <%-= (i>1) and ', ' -%> ++ <%=n:name()%> ++ <%- end -%> ++ )<% end %> ++ ++
    • ++ <% end end %> ++ <% if not self.nocreate then %> ++
    • ++ " onclick="cbi_d_update(this.id)" onchange="cbi_d_update(this.id)"<%= ++ attr("type", self.widget or "radio") .. ++ attr("id", cbid .. "_custom") .. ++ attr("name", cbid) .. ++ attr("value", " ") ++ %> />   ++ > ++ ++ <%:Custom Interface%>: ++ ++ ++
    • ++ <% end %> ++
    ++ ++<%+cbi/valuefooter%> +diff --git a/feeds/luci/modules/luci-base/luasrc/view/cbi/network_netinfo.htm b/feeds/luci/modules/luci-base/luasrc/view/cbi/network_netinfo.htm +new file mode 100644 +index 0000000..4fd8411 +--- /dev/null ++++ b/feeds/luci/modules/luci-base/luasrc/view/cbi/network_netinfo.htm +@@ -0,0 +1,27 @@ ++<%+cbi/valueheader%> ++ ++<%- ++ local value = self:formvalue(section) ++ if not value or value == "-" then ++ value = self:cfgvalue(section) or self.default ++ end ++ ++ local nwm = require "luci.model.network".init() ++ local net = nwm:get_network(value) ++-%> ++ ++<% if net then %> ++<%=net:name()%>: ++ <% ++ local empty = true ++ for _, iface in ipairs(net:get_interfaces() or { net:get_interface() }) do ++ if not iface:is_bridge() then ++ empty = false ++ %> ++ style="width:16px; height:16px; vertical-align:middle" src="<%=resource%>/icons/<%=iface:type()%><%=iface:is_up() and "" or "_disabled"%>.png" /> ++ <% end end %> ++ <% if empty then %><%:(no interfaces attached)%><% end %> ++ ++<% end %> ++ ++<%+cbi/valuefooter%> +diff --git a/feeds/luci/modules/luci-base/luasrc/view/cbi/network_netlist.htm b/feeds/luci/modules/luci-base/luasrc/view/cbi/network_netlist.htm +new file mode 100644 +index 0000000..4f186ca +--- /dev/null ++++ b/feeds/luci/modules/luci-base/luasrc/view/cbi/network_netlist.htm +@@ -0,0 +1,82 @@ ++<%+cbi/valueheader%> ++ ++<%- ++ local utl = require "luci.util" ++ local nwm = require "luci.model.network".init() ++ ++ local net, iface ++ local networks = nwm:get_networks() ++ local value = self:formvalue(section) ++ ++ self.cast = nil ++ ++ if not value or value == "-" then ++ value = self:cfgvalue(section) or self.default ++ end ++ ++ local checked = { } ++ for value in utl.imatch(value) do ++ checked[value] = true ++ end ++-%> ++ ++
      ++ <% for _, net in ipairs(networks) do ++ if (net:name() ~= "loopback") and ++ (net:name() ~= self.exclude) and ++ (not self.novirtual or not net:is_virtual()) ++ then %> ++
    • ++ " onclick="cbi_d_update(this.id)" onchange="cbi_d_update(this.id)"<%= ++ attr("type", self.widget or "radio") .. ++ attr("id", cbid .. "." .. net:name()) .. ++ attr("name", cbid) .. attr("value", net:name()) .. ++ ifattr(checked[net:name()], "checked", "checked") ++ %> />   ++ > ++ <%=net:name()%>: ++ <% ++ local empty = true ++ for _, iface in ipairs(net:is_bridge() and net:get_interfaces() or { net:get_interface() }) do ++ if not iface:is_bridge() then ++ empty = false ++ %> ++ style="width:16px; height:16px; vertical-align:middle" src="<%=resource%>/icons/<%=iface:type()%><%=iface:is_up() and "" or "_disabled"%>.png" /> ++ <% end end %> ++ <% if empty then %><%:(no interfaces attached)%><% end %> ++ ++ ++
    • ++ <% end end %> ++ ++ <% if not self.nocreate then %> ++
    • ++ " onclick="cbi_d_update(this.id)" onchange="cbi_d_update(this.id)"<%=attr("type", self.widget or "radio") .. attr("id", cbid .. "_new") .. attr("name", cbid) .. attr("value", "-") .. ifattr(not value and self.widget ~= "checkbox", "checked", "checked")%> />   ++
      ++ > ++ <%- if self.widget == "checkbox" then -%> ++ <%:create:%> ++ <%- else -%> ++ <%:unspecified -or- create:%> ++ <%- end -%>  ++ ++ onfocus="document.getElementById('<%=cbid%>_new').checked=true" /> ++
      ++
    • ++ <% elseif self.widget ~= "checkbox" and self.unspecified then %> ++
    • ++ " onclick="cbi_d_update(this.id)" onchange="cbi_d_update(this.id)"<%= ++ attr("type", self.widget or "radio") .. ++ attr("id", cbid .. "_uns") .. ++ attr("name", cbid) .. ++ attr("value", "") .. ++ ifattr(not value or #value == 0, "checked", "checked") ++ %> />   ++
      ++ ><%:unspecified%> ++
      ++
    • ++ <% end %> ++
    ++ ++<%+cbi/valuefooter%> +diff --git a/feeds/luci/modules/luci-base/luasrc/view/cbi/nsection.htm b/feeds/luci/modules/luci-base/luasrc/view/cbi/nsection.htm +new file mode 100644 +index 0000000..32e73e7 +--- /dev/null ++++ b/feeds/luci/modules/luci-base/luasrc/view/cbi/nsection.htm +@@ -0,0 +1,31 @@ ++<% if self:cfgvalue(self.section) then section = self.section %> ++
    ++ <% if self.title and #self.title > 0 then -%> ++ <%=self.title%> ++ <%- end %> ++ <% if self.description and #self.description > 0 then -%> ++
    <%=self.description%>
    ++ <%- end %> ++ <% if self.addremove then -%> ++
    ++ ++
    ++ <%- end %> ++ <%+cbi/tabmenu%> ++
    ++ <%+cbi/ucisection%> ++
    ++
    ++
    ++<% elseif self.addremove then %> ++ <% if self.template_addremove then include(self.template_addremove) else -%> ++
    ++ <% if self.title and #self.title > 0 then -%> ++ <%=self.title%> ++ <%- end %> ++
    <%=self.description%>
    ++ ++
    ++ <%- end %> ++<% end %> ++ +diff --git a/feeds/luci/modules/luci-base/luasrc/view/cbi/nullsection.htm b/feeds/luci/modules/luci-base/luasrc/view/cbi/nullsection.htm +new file mode 100644 +index 0000000..bd48950 +--- /dev/null ++++ b/feeds/luci/modules/luci-base/luasrc/view/cbi/nullsection.htm +@@ -0,0 +1,38 @@ ++
    ++ <% if self.title and #self.title > 0 then -%> ++ <%=self.title%> ++ <%- end %> ++ <% if self.description and #self.description > 0 then -%> ++
    <%=self.description%>
    ++ <%- end %> ++
    ++
    ++ <% self:render_children(1, scope or {}) %> ++
    ++ <% if self.error and self.error[1] then -%> ++
    ++
      <% for _, e in ipairs(self.error[1]) do -%> ++
    • ++ <%- if e == "invalid" then -%> ++ <%:One or more fields contain invalid values!%> ++ <%- elseif e == "missing" then -%> ++ <%:One or more required fields have no value!%> ++ <%- else -%> ++ <%=pcdata(e)%> ++ <%- end -%> ++
    • ++ <%- end %>
    ++
    ++ <%- end %> ++
    ++
    ++
    ++<%- ++ if type(self.hidden) == "table" then ++ for k, v in pairs(self.hidden) do ++-%> ++ ++<%- ++ end ++ end ++%> +diff --git a/feeds/luci/modules/luci-base/luasrc/view/cbi/simpleform.htm b/feeds/luci/modules/luci-base/luasrc/view/cbi/simpleform.htm +new file mode 100644 +index 0000000..5216cd5 +--- /dev/null ++++ b/feeds/luci/modules/luci-base/luasrc/view/cbi/simpleform.htm +@@ -0,0 +1,57 @@ ++<% if not self.embedded then %> ++ ++
    ++ ++ ++
    ++<% end %> ++
    ++ <% if self.title and #self.title > 0 then %>

    <%=self.title%>

    <% end %> ++ <% if self.description and #self.description > 0 then %>
    <%=self.description%>
    <% end %> ++ <% self:render_children() %> ++
    ++
    ++<%- if self.message then %> ++
    <%=self.message%>
    ++<%- end %> ++<%- if self.errmessage then %> ++
    <%=self.errmessage%>
    ++<%- end %> ++<% if not self.embedded then %> ++
    ++<%- ++ if type(self.hidden) == "table" then ++ for k, v in pairs(self.hidden) do ++-%> ++ ++<%- ++ end ++ end ++%> ++<% if redirect then %> ++
    ++ ++
    ++<% end %> ++<%- if self.flow and self.flow.skip then %> ++ ++<% end %> ++<%- if self.submit ~= false then %> ++ ++<% end %> ++<%- if self.reset ~= false then %> ++ ++<% end %> ++<%- if self.cancel ~= false and self.on_cancel then %> ++ ++<% end %> ++ ++
    ++ ++<% end %> +diff --git a/feeds/luci/modules/luci-base/luasrc/view/cbi/tabcontainer.htm b/feeds/luci/modules/luci-base/luasrc/view/cbi/tabcontainer.htm +new file mode 100644 +index 0000000..38c435d +--- /dev/null ++++ b/feeds/luci/modules/luci-base/luasrc/view/cbi/tabcontainer.htm +@@ -0,0 +1,7 @@ ++<% for tab, data in pairs(self.tabs) do %> ++
    style="display:none"<% end %>> ++ <% if data.description then %>
    <%=data.description%>
    <% end %> ++ <% self:render_tab(tab, section, scope or {}) %> ++
    ++ ++<% end %> +diff --git a/feeds/luci/modules/luci-base/luasrc/view/cbi/tabmenu.htm b/feeds/luci/modules/luci-base/luasrc/view/cbi/tabmenu.htm +new file mode 100644 +index 0000000..b96ac9c +--- /dev/null ++++ b/feeds/luci/modules/luci-base/luasrc/view/cbi/tabmenu.htm +@@ -0,0 +1,13 @@ ++<%- if self.tabs then %> ++
      ++ <%- self.selected_tab = luci.http.formvalue("tab." .. self.config .. "." .. section) %> ++ <%- for _, tab in ipairs(self.tab_names) do if #self.tabs[tab].childs > 0 then %> ++ ++ <%- if not self.selected_tab then self.selected_tab = tab end %> ++
    • ++ <%=self.tabs[tab].title%> ++ <% if tab == self.selected_tab then %><% end %> ++
    • ++ <% end end -%> ++
    ++<% end -%> +diff --git a/feeds/luci/modules/luci-base/luasrc/view/cbi/tblsection.htm b/feeds/luci/modules/luci-base/luasrc/view/cbi/tblsection.htm +new file mode 100644 +index 0000000..d928791 +--- /dev/null ++++ b/feeds/luci/modules/luci-base/luasrc/view/cbi/tblsection.htm +@@ -0,0 +1,146 @@ ++<%- ++local rowcnt = 1 ++function rowstyle() ++ rowcnt = rowcnt + 1 ++ return (rowcnt % 2) + 1 ++end ++ ++function width(o) ++ if o.width then ++ if type(o.width) == 'number' then ++ return ' style="width:%dpx"' % o.width ++ end ++ return ' style="width:%s"' % o.width ++ end ++ return '' ++end ++-%> ++ ++ ++
    ++ <% if self.title and #self.title > 0 then -%> ++ <%=self.title%> ++ <%- end %> ++ <%- if self.sortable then -%> ++ ++ <%- end -%> ++
    <%=self.description%>
    ++
    ++ <%- local count = 0 -%> ++ ++ ++ <%- if not self.anonymous then -%> ++ <%- if self.sectionhead then -%> ++ ++ <%- else -%> ++ ++ <%- end -%> ++ <%- end -%> ++ <%- for i, k in pairs(self.children) do if not k.optional then -%> ++ ++ <%- count = count + 1; end; end; if self.sortable then -%> ++ ++ <%- end; if self.extedit or self.addremove then -%> ++ ++ <%- count = count + 1; end -%> ++ ++ ++ <%- if not self.anonymous then -%> ++ <%- if self.sectiondesc then -%> ++ ++ <%- else -%> ++ ++ <%- end -%> ++ <%- end -%> ++ <%- for i, k in pairs(self.children) do if not k.optional then -%> ++ ++ <%- end; end; if self.sortable then -%> ++ ++ <%- end; if self.extedit or self.addremove then -%> ++ ++ <%- end -%> ++ ++ <%- local isempty = true ++ for i, k in ipairs(self:cfgsections()) do ++ section = k ++ isempty = false ++ scope = { valueheader = "cbi/cell_valueheader", valuefooter = "cbi/cell_valuefooter" } ++ -%> ++ ++ <% if not self.anonymous then -%> ++ ++ <%- end %> ++ ++ ++ <%- ++ for k, node in ipairs(self.children) do ++ if not node.optional then ++ node:render(section, scope or {}) ++ end ++ end ++ -%> ++ ++ <%- if self.sortable then -%> ++ ++ <%- end -%> ++ ++ <%- if self.extedit or self.addremove then -%> ++ ++ <%- end -%> ++ ++ <%- end -%> ++ ++ <%- if isempty then -%> ++ ++ ++ ++ <%- end -%> ++
    <%=self.sectionhead%> > ++ <%- if k.titleref then -%><%- end -%> ++ <%-=k.title-%> ++ <%- if k.titleref then -%><%- end -%> ++ <%:Sort%> 
    <%=self.sectiondesc%>><%=k.description%>

    <%=(type(self.sectiontitle) == "function") and self:sectiontitle(section) or k%>

    ++ ++ ++ ++ <%- if self.extedit then -%> ++ onclick="location.href='<%=self.extedit:format(section)%>'" ++ <%- elseif type(self.extedit) == "function" then ++ %> onclick="location.href='<%=self:extedit(section)%>'" ++ <%- end ++ %> alt="<%:Edit%>" title="<%:Edit%>" /> ++ <%- end; if self.addremove then %> ++ ++ <%- end -%> ++

    <%:This section contains no values yet%>
    ++ ++ <% if self.error then %> ++
    ++
      <% for _, c in pairs(self.error) do for _, e in ipairs(c) do -%> ++
    • <%=pcdata(e):gsub("\n","
      ")%>
    • ++ <%- end end %>
    ++
    ++ <% end %> ++ ++ <%- if self.addremove then -%> ++ <% if self.template_addremove then include(self.template_addremove) else -%> ++
    ++ <% if self.anonymous then %> ++ ++ <% else %> ++ <% if self.invalid_cts then -%>
    <% end %> ++ ++ ++ ++ <% if self.invalid_cts then -%> ++
    <%:Invalid%>
    ++ <%- end %> ++ <% end %> ++
    ++ <%- end %> ++ <%- end -%> ++
    ++
    ++ +diff --git a/feeds/luci/modules/luci-base/luasrc/view/cbi/tsection.htm b/feeds/luci/modules/luci-base/luasrc/view/cbi/tsection.htm +new file mode 100644 +index 0000000..087548b +--- /dev/null ++++ b/feeds/luci/modules/luci-base/luasrc/view/cbi/tsection.htm +@@ -0,0 +1,48 @@ ++
    ++ <% if self.title and #self.title > 0 then -%> ++ <%=self.title%> ++ <%- end %> ++
    <%=self.description%>
    ++ <% local isempty = true for i, k in ipairs(self:cfgsections()) do -%> ++ <% if self.addremove then -%> ++
    ++ ++
    ++ <%- end %> ++ ++ <%- section = k; isempty = false -%> ++ ++ <% if not self.anonymous then -%> ++

    <%=section:upper()%>

    ++ <%- end %> ++ ++ <%+cbi/tabmenu%> ++ ++
    ++ <%+cbi/ucisection%> ++
    ++
    ++ <%- end %> ++ ++ <% if isempty then -%> ++ <%:This section contains no values yet%>

    ++ <%- end %> ++ ++ <% if self.addremove then -%> ++ <% if self.template_addremove then include(self.template_addremove) else -%> ++
    ++ <% if self.anonymous then -%> ++ ++ <%- else -%> ++ <% if self.invalid_cts then -%>
    <% end %> ++ ++ ++ ++ <% if self.invalid_cts then -%> ++
    <%:Invalid%>
    ++ <%- end %> ++ <%- end %> ++
    ++ <%- end %> ++ <%- end %> ++
    +diff --git a/feeds/luci/modules/luci-base/luasrc/view/cbi/tvalue.htm b/feeds/luci/modules/luci-base/luasrc/view/cbi/tvalue.htm +new file mode 100644 +index 0000000..4841c37 +--- /dev/null ++++ b/feeds/luci/modules/luci-base/luasrc/view/cbi/tvalue.htm +@@ -0,0 +1,5 @@ ++<%+cbi/valueheader%> ++ ++<%+cbi/valuefooter%> +diff --git a/feeds/luci/modules/luci-base/luasrc/view/cbi/ucisection.htm b/feeds/luci/modules/luci-base/luasrc/view/cbi/ucisection.htm +new file mode 100644 +index 0000000..3b69f12 +--- /dev/null ++++ b/feeds/luci/modules/luci-base/luasrc/view/cbi/ucisection.htm +@@ -0,0 +1,75 @@ ++<%- ++ if type(self.hidden) == "table" then ++ for k, v in pairs(self.hidden) do ++-%> ++ ++<%- ++ end ++ end ++%> ++ ++<% if self.tabs then %> ++ <%+cbi/tabcontainer%> ++<% else %> ++ <% self:render_children(section, scope or {}) %> ++<% end %> ++ ++<% if self.error and self.error[section] then -%> ++
    ++
      <% for _, e in ipairs(self.error[section]) do -%> ++
    • ++ <%- if e == "invalid" then -%> ++ <%:One or more fields contain invalid values!%> ++ <%- elseif e == "missing" then -%> ++ <%:One or more required fields have no value!%> ++ <%- else -%> ++ <%=pcdata(e)%> ++ <%- end -%> ++
    • ++ <%- end %>
    ++
    ++<%- end %> ++ ++<% if self.optionals[section] and #self.optionals[section] > 0 or self.dynamic then %> ++
    ++ <% if self.dynamic then %> ++ ++ <% if self.optionals[section] and #self.optionals[section] > 0 then %> ++ ++ <% end %> ++ <% else %> ++ ++ ++ <% end %> ++ ++
    ++<% end %> +diff --git a/feeds/luci/modules/luci-base/luasrc/view/cbi/upload.htm b/feeds/luci/modules/luci-base/luasrc/view/cbi/upload.htm +new file mode 100644 +index 0000000..7770934 +--- /dev/null ++++ b/feeds/luci/modules/luci-base/luasrc/view/cbi/upload.htm +@@ -0,0 +1,14 @@ ++<% ++ local t = require("luci.tools.webadmin") ++ local v = self:cfgvalue(section) ++ local s = v and nixio.fs.stat(v) ++-%> ++<%+cbi/valueheader%> ++ <% if s then %> ++ <%:Uploaded File%> (<%=t.byte_format(s.size)%>) ++ /> ++ " alt="<%:Replace entry%>" title="<%:Replace entry%>" src="<%=resource%>/cbi/reload.gif" /> ++ <% else %> ++ /> ++ <% end %> ++<%+cbi/valuefooter%> +diff --git a/feeds/luci/modules/luci-base/luasrc/view/cbi/value.htm b/feeds/luci/modules/luci-base/luasrc/view/cbi/value.htm +new file mode 100644 +index 0000000..d1a7bea +--- /dev/null ++++ b/feeds/luci/modules/luci-base/luasrc/view/cbi/value.htm +@@ -0,0 +1,35 @@ ++<%+cbi/valueheader%> ++ /> ++ <% if self.password then %><% end %> ++ <% if #self.keylist > 0 or self.datatype then -%> ++ ++ <% end -%> ++<%+cbi/valuefooter%> +diff --git a/feeds/luci/modules/luci-base/luasrc/view/cbi/valuefooter.htm b/feeds/luci/modules/luci-base/luasrc/view/cbi/valuefooter.htm +new file mode 100644 +index 0000000..805312e +--- /dev/null ++++ b/feeds/luci/modules/luci-base/luasrc/view/cbi/valuefooter.htm +@@ -0,0 +1 @@ ++<% include( valuefooter or "cbi/full_valuefooter" ) %> +diff --git a/feeds/luci/modules/luci-base/luasrc/view/cbi/valueheader.htm b/feeds/luci/modules/luci-base/luasrc/view/cbi/valueheader.htm +new file mode 100644 +index 0000000..761a54a +--- /dev/null ++++ b/feeds/luci/modules/luci-base/luasrc/view/cbi/valueheader.htm +@@ -0,0 +1 @@ ++<% include( valueheader or "cbi/full_valueheader" ) %> +diff --git a/feeds/luci/modules/luci-base/luasrc/view/error404.htm b/feeds/luci/modules/luci-base/luasrc/view/error404.htm +new file mode 100644 +index 0000000..c2be29e +--- /dev/null ++++ b/feeds/luci/modules/luci-base/luasrc/view/error404.htm +@@ -0,0 +1,11 @@ ++<%# ++ Copyright 2008 Steven Barth ++ Copyright 2008 Jo-Philipp Wich ++ Licensed to the public under the Apache License 2.0. ++-%> ++ ++<%+header%> ++

    404 <%:Not Found%>

    ++

    <%:Sorry, the object you requested was not found.%>

    ++<%:Unable to dispatch%>: <%=luci.http.request.env.PATH_INFO%> ++<%+footer%> +diff --git a/feeds/luci/modules/luci-base/luasrc/view/error500.htm b/feeds/luci/modules/luci-base/luasrc/view/error500.htm +new file mode 100644 +index 0000000..8fb18ed +--- /dev/null ++++ b/feeds/luci/modules/luci-base/luasrc/view/error500.htm +@@ -0,0 +1,11 @@ ++<%# ++ Copyright 2008 Steven Barth ++ Copyright 2008 Jo-Philipp Wich ++ Licensed to the public under the Apache License 2.0. ++-%> ++ ++<%+header%> ++

    500 <%:Internal Server Error%>

    ++

    <%:Sorry, the server encountered an unexpected error.%>

    ++
    <%=message%>
    ++<%+footer%> +diff --git a/feeds/luci/modules/luci-base/luasrc/view/footer.htm b/feeds/luci/modules/luci-base/luasrc/view/footer.htm +new file mode 100644 +index 0000000..f3574b6 +--- /dev/null ++++ b/feeds/luci/modules/luci-base/luasrc/view/footer.htm +@@ -0,0 +1,7 @@ ++<%# ++ Copyright 2008 Steven Barth ++ Copyright 2008 Jo-Philipp Wich ++ Licensed to the public under the Apache License 2.0. ++-%> ++ ++<% include("themes/" .. theme .. "/footer") %> +\ No newline at end of file +diff --git a/feeds/luci/modules/luci-base/luasrc/view/header.htm b/feeds/luci/modules/luci-base/luasrc/view/header.htm +new file mode 100644 +index 0000000..f6e20c9 +--- /dev/null ++++ b/feeds/luci/modules/luci-base/luasrc/view/header.htm +@@ -0,0 +1,12 @@ ++<%# ++ Copyright 2008 Steven Barth ++ Copyright 2008 Jo-Philipp Wich ++ Licensed to the public under the Apache License 2.0. ++-%> ++ ++<% ++ if not luci.dispatcher.context.template_header_sent then ++ include("themes/" .. theme .. "/header") ++ luci.dispatcher.context.template_header_sent = true ++ end ++%> +diff --git a/feeds/luci/modules/luci-base/luasrc/view/indexer.htm b/feeds/luci/modules/luci-base/luasrc/view/indexer.htm +new file mode 100644 +index 0000000..28fc3de +--- /dev/null ++++ b/feeds/luci/modules/luci-base/luasrc/view/indexer.htm +@@ -0,0 +1,7 @@ ++<%# ++ Copyright 2008 Steven Barth ++ Copyright 2008 Jo-Philipp Wich ++ Licensed to the public under the Apache License 2.0. ++-%> ++ ++<% include("themes/" .. theme .. "/indexer") %> +\ No newline at end of file +diff --git a/feeds/luci/modules/luci-base/luasrc/view/sysauth.htm b/feeds/luci/modules/luci-base/luasrc/view/sysauth.htm +new file mode 100644 +index 0000000..7f0f0a6 +--- /dev/null ++++ b/feeds/luci/modules/luci-base/luasrc/view/sysauth.htm +@@ -0,0 +1,73 @@ ++<%# ++ Copyright 2008 Steven Barth ++ Copyright 2008-2012 Jo-Philipp Wich ++ Licensed to the public under the Apache License 2.0. ++-%> ++ ++<%+header%> ++ ++
    "> ++
    ++

    <%:Authorization Required%>

    ++
    ++ <%:Please enter your username and password.%> ++ <%- if fuser then %> ++
    <%:Invalid username and/or password! Please try again.%>
    ++
    ++ <% end -%> ++
    ++
    ++
    ++ ++
    ++ ++
    ++
    ++
    ++ ++
    ++ ++
    ++
    ++
    ++
    ++ ++
    ++ ++ ++
    ++
    ++ ++ ++<% ++local uci = require "luci.model.uci".cursor() ++local fs = require "nixio.fs" ++local https_key = uci:get("uhttpd", "main", "key") ++local https_port = uci:get("uhttpd", "main", "listen_https") ++if type(https_port) == "table" then ++ https_port = https_port[1] ++end ++ ++if https_port and fs.access(https_key) then ++ https_port = https_port:match("(%d+)$") ++%> ++ ++ ++ ++<% end %> ++ ++<%+footer%> +diff --git a/feeds/luci/modules/luci-base/po/ca/base.po b/feeds/luci/modules/luci-base/po/ca/base.po +new file mode 100644 +index 0000000..2252e7c +--- /dev/null ++++ b/feeds/luci/modules/luci-base/po/ca/base.po +@@ -0,0 +1,3997 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Report-Msgid-Bugs-To: \n" ++"POT-Creation-Date: 2009-06-10 03:40+0200\n" ++"PO-Revision-Date: 2014-06-06 11:17+0200\n" ++"Last-Translator: Alex \n" ++"Language-Team: LANGUAGE \n" ++"Language: ca\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n != 1);\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "(%d minute window, %d second interval)" ++msgstr "(finestra de %d minuts, interval de %d segons)" ++ ++msgid "(%s available)" ++msgstr "(%s disponibles)" ++ ++msgid "(empty)" ++msgstr "(buit)" ++ ++msgid "(no interfaces attached)" ++msgstr "(sense interfícies adjuntes)" ++ ++msgid "-- Additional Field --" ++msgstr "-- Camp addicional --" ++ ++msgid "-- Please choose --" ++msgstr "-- Escolliu, si us plau --" ++ ++msgid "-- custom --" ++msgstr "-- personalitzat --" ++ ++msgid "-- match by device --" ++msgstr "" ++ ++msgid "-- match by label --" ++msgstr "" ++ ++msgid "1 Minute Load:" ++msgstr "Càrrega d'1 minut:" ++ ++msgid "15 Minute Load:" ++msgstr "Càrrega de 15 minuts:" ++ ++msgid "5 Minute Load:" ++msgstr "Càrrega de 5 minuts:" ++ ++msgid "BSSID" ++msgstr "BSSID" ++ ++msgid "DNS query port" ++msgstr "Port de consulta DNS " ++ ++msgid "DNS server port" ++msgstr "Port del servidor DNS" ++ ++msgid "" ++"DNS servers will be queried in the " ++"order of the resolvfile" ++msgstr "" ++"Es consultaran els servidors DNS " ++"segons l'ordre del fitxer de resolució" ++ ++msgid "ESSID" ++msgstr "ESSID" ++ ++msgid "IPv4-Address" ++msgstr "Adreça IPv4" ++ ++msgid "IPv4-Gateway" ++msgstr "Passarel·la IPv4" ++ ++msgid "IPv4-Netmask" ++msgstr "" ++"Màscara de xarxa IPv4" ++ ++msgid "" ++"IPv6-Address or Network " ++"(CIDR)" ++msgstr "" ++"Adreça IPv6 o Xarxa (CIDR)" ++ ++msgid "IPv6-Gateway" ++msgstr "Passarel·la IPv6" ++ ++msgid "IPv6-Suffix (hex)" ++msgstr "" ++ ++msgid "LED Configuration" ++msgstr "Configuració LED" ++ ++msgid "LED Name" ++msgstr "Nom LED" ++ ++msgid "MAC-Address" ++msgstr "Adreça MAC" ++ ++msgid "" ++"Max. DHCP leases" ++msgstr "" ++"Arrendaments de DHCP max." ++ ++msgid "" ++"Max. EDNS0 packet size" ++msgstr "" ++"Mida màx. de paquet EDNS0" ++ ++msgid "Max. concurrent queries" ++msgstr "Consultes concurrents max." ++ ++msgid "%s - %s" ++msgstr "%s - %s" ++ ++msgid "ADSL" ++msgstr "" ++ ++msgid "ADSL Status" ++msgstr "" ++ ++msgid "AICCU (SIXXS)" ++msgstr "" ++ ++msgid "APN" ++msgstr "APN" ++ ++msgid "AR Support" ++msgstr "Suport AR" ++ ++msgid "ARP retry threshold" ++msgstr "Llindar de reintent ARP" ++ ++msgid "ATM Bridges" ++msgstr "Ponts ATM" ++ ++msgid "ATM Virtual Channel Identifier (VCI)" ++msgstr "Identificador de canal virtual (VCI) ATM" ++ ++msgid "ATM Virtual Path Identifier (VPI)" ++msgstr "Identificador de camí virtual (VPI) ATM" ++ ++msgid "" ++"ATM bridges expose encapsulated ethernet in AAL5 connections as virtual " ++"Linux network interfaces which can be used in conjunction with DHCP or PPP " ++"to dial into the provider network." ++msgstr "" ++"Els ponts ATM mostren ethernet encapsulat en connexions AAL5 com interfícies " ++"de xarxa virtual de Linux que es poden utilitzar conjuntament amb DHCP o PPP " ++"per trucar a la xarxa del proveïdor." ++ ++msgid "ATM device number" ++msgstr "Número de dispositiu ATM" ++ ++msgid "AYIYA" ++msgstr "" ++ ++msgid "Access Concentrator" ++msgstr "Concentrador d'accés" ++ ++msgid "Access Point" ++msgstr "Punt d'accés" ++ ++msgid "Action" ++msgstr "Acció" ++ ++msgid "Actions" ++msgstr "Accions" ++ ++msgid "Activate this network" ++msgstr "Activa aquesta xarxa" ++ ++msgid "Active IPv4-Routes" ++msgstr "Rutes IPv4 actives" ++ ++msgid "Active IPv6-Routes" ++msgstr "Rutes IPv6 actives" ++ ++msgid "Active Connections" ++msgstr "Connexions actives" ++ ++msgid "Active DHCP Leases" ++msgstr "Arrendaments DHCP actius" ++ ++msgid "Active DHCPv6 Leases" ++msgstr "Arrendaments DHCPv6 actius" ++ ++msgid "Ad-Hoc" ++msgstr "Ad-Hoc" ++ ++msgid "Add" ++msgstr "Afegeix" ++ ++msgid "Add local domain suffix to names served from hosts files" ++msgstr "" ++"Afegeix el sufix de domini local als noms servits des dels fitxers de hosts" ++ ++msgid "Add new interface..." ++msgstr "Afegeix una interfície nova..." ++ ++msgid "Additional Hosts files" ++msgstr "Fitxers de Hosts addicionals" ++ ++msgid "Address" ++msgstr "Adreça" ++ ++msgid "Address to access local relay bridge" ++msgstr "Adreça per accedir al relay bridge local" ++ ++msgid "Administration" ++msgstr "Administració" ++ ++msgid "Advanced Settings" ++msgstr "Paràmetres avançats" ++ ++msgid "Alert" ++msgstr "Alerta" ++ ++msgid "Allow SSH password authentication" ++msgstr "" ++"Permet autenticació SSH per contrasenya" ++ ++msgid "Allow all except listed" ++msgstr "Permet-les totes menys les llistades" ++ ++msgid "Allow listed only" ++msgstr "Permet només les llistades" ++ ++msgid "Allow localhost" ++msgstr "Permetre el localhost" ++ ++msgid "Allow remote hosts to connect to local SSH forwarded ports" ++msgstr "" ++"Permetre a màquines remotes de connectar als ports reenviats de l'SSH local" ++ ++msgid "Allow root logins with password" ++msgstr "Permetre l'accés del l'administrador amb paraula clau" ++ ++msgid "Allow the root user to login with password" ++msgstr "Permetre l'accés de l'usurari root amb paraula clau" ++ ++msgid "" ++"Allow upstream responses in the 127.0.0.0/8 range, e.g. for RBL services" ++msgstr "Permet respostes del rang 127.0.0.0/8, p.e. per serveis RBL" ++ ++msgid "" ++"Also see Tunneling Comparison on SIXXS" ++msgstr "" ++ ++msgid "Always announce default router" ++msgstr "" ++ ++msgid "An additional network will be created if you leave this unchecked." ++msgstr "Es crearà una xarxa addicional si deixes això sense marcar." ++ ++msgid "Announce as default router even if no public prefix is available." ++msgstr "" ++ ++msgid "Announced DNS domains" ++msgstr "" ++ ++msgid "Announced DNS servers" ++msgstr "" ++ ++msgid "Antenna 1" ++msgstr "Antena 1" ++ ++msgid "Antenna 2" ++msgstr "Antena 2" ++ ++msgid "Antenna Configuration" ++msgstr "Configuració d'antena" ++ ++msgid "Any zone" ++msgstr "Qualsevol zona" ++ ++msgid "Apply" ++msgstr "Aplica" ++ ++msgid "Applying changes" ++msgstr "Aplicant els canvis" ++ ++msgid "" ++"Assign a part of given length of every public IPv6-prefix to this interface" ++msgstr "" ++ ++msgid "Assign interfaces..." ++msgstr "Assigna interfícies..." ++ ++msgid "" ++"Assign prefix parts using this hexadecimal subprefix ID for this interface." ++msgstr "" ++ ++msgid "Associated Stations" ++msgstr "Estacions associades" ++ ++msgid "Atheros 802.11%s Wireless Controller" ++msgstr "Controlador sense fils d'Atheros 802.11%s" ++ ++msgid "AuthGroup" ++msgstr "" ++ ++msgid "Authentication" ++msgstr "Autenticació" ++ ++msgid "Authoritative" ++msgstr "Autoritzada" ++ ++msgid "Authorization Required" ++msgstr "Es requereix autenticació" ++ ++msgid "Auto Refresh" ++msgstr "Refresc automàtic" ++ ++msgid "Automatic" ++msgstr "" ++ ++msgid "Automatic Homenet (HNCP)" ++msgstr "" ++ ++msgid "Available" ++msgstr "Disponible" ++ ++msgid "Available packages" ++msgstr "Paquets disponibles" ++ ++msgid "Average:" ++msgstr "Mitjana:" ++ ++msgid "BSSID" ++msgstr "BSSID" ++ ++msgid "Back" ++msgstr "Enrere" ++ ++msgid "Back to Overview" ++msgstr "Enrere al Resum" ++ ++msgid "Back to configuration" ++msgstr "Enrere a la configuració" ++ ++msgid "Back to overview" ++msgstr "Enrere al resum" ++ ++# Endarrere cap a resultats d'escaneig ++msgid "Back to scan results" ++msgstr "Enrere als resultats de l'escaneig" ++ ++msgid "Background Scan" ++msgstr "Escaneig de fons" ++ ++msgid "Backup / Flash Firmware" ++msgstr "Còpia de seguretat / Recàrrega de programari" ++ ++msgid "Backup / Restore" ++msgstr "Còpia de seguretat / Restauració" ++ ++msgid "Backup file list" ++msgstr "Llista de còpies de seguretat" ++ ++msgid "Bad address specified!" ++msgstr "Adreça mal especificada!" ++ ++msgid "Band" ++msgstr "" ++ ++msgid "Behind NAT" ++msgstr "" ++ ++msgid "" ++"Below is the determined list of files to backup. It consists of changed " ++"configuration files marked by opkg, essential base files and the user " ++"defined backup patterns." ++msgstr "" ++"A sota hi ha la llista determinada de fitxers per fer-ne còpia. Consisteix " ++"en els fitxers de configuració canviats i marcats per l'opkg, fitxers base " ++"essencials i els patrons de còpia de seguretat definits per l'usuari." ++ ++msgid "Bitrate" ++msgstr "Velocitat de bits" ++ ++msgid "Bogus NX Domain Override" ++msgstr "Substitució dels dominis NX falsos" ++ ++msgid "Bridge" ++msgstr "Pont" ++ ++msgid "Bridge interfaces" ++msgstr "Pont d'interfícies" ++ ++msgid "Bridge unit number" ++msgstr "Número d'unitat de pont" ++ ++msgid "Bring up on boot" ++msgstr "Aixecar a l'engegada" ++ ++msgid "Broadcom 802.11%s Wireless Controller" ++msgstr "Controlador sense fil Broadcom 802.11%s" ++ ++msgid "Broadcom BCM%04x 802.11 Wireless Controller" ++msgstr "Controlador sense fil Broadcom BCM%04x 802.11" ++ ++msgid "Buffered" ++msgstr "En memòria intermèdia" ++ ++msgid "Buttons" ++msgstr "Botons" ++ ++msgid "CA certificate; if empty it will be saved after the first connection." ++msgstr "" ++ ++msgid "CPU" ++msgstr "CPU" ++ ++msgid "CPU usage (%)" ++msgstr "Ús de CPU (%)" ++ ++msgid "Cancel" ++msgstr "Cancel·la" ++ ++msgid "Category" ++msgstr "" ++ ++msgid "Chain" ++msgstr "Cadena" ++ ++msgid "Changes" ++msgstr "Canvis" ++ ++msgid "Changes applied." ++msgstr "Canvis aplicats." ++ ++msgid "Changes the administrator password for accessing the device" ++msgstr "Canvia la paraula clau de l'administrador per accedir al dispositiu" ++ ++msgid "Channel" ++msgstr "Canal" ++ ++msgid "Check" ++msgstr "Comprovació" ++ ++msgid "Checksum" ++msgstr "Suma de verificació" ++ ++msgid "" ++"Choose the firewall zone you want to assign to this interface. Select " ++"unspecified to remove the interface from the associated zone or " ++"fill out the create field to define a new zone and attach the " ++"interface to it." ++msgstr "" ++"Escolliu la zona de tallafocs que voleu assignar a aquesta interfície. Trieu " ++"sense especificar per esborrar la interfície de la zona associada o " ++"ompliu el camp crea per definir una nova zona i adjuntar-hi la " ++"interfície." ++ ++msgid "" ++"Choose the network(s) you want to attach to this wireless interface or fill " ++"out the create field to define a new network." ++msgstr "" ++"Trieu les xarxes que voleu adjuntar a la interfície sense fil o ompliu el " ++"camp crea per definir una xarxa nova." ++ ++msgid "Cipher" ++msgstr "Xifra" ++ ++msgid "" ++"Click \"Generate archive\" to download a tar archive of the current " ++"configuration files. To reset the firmware to its initial state, click " ++"\"Perform reset\" (only possible with squashfs images)." ++msgstr "" ++ ++msgid "Client" ++msgstr "Client" ++ ++msgid "Client ID to send when requesting DHCP" ++msgstr "ID de client a enviar en les sol·licituds DHCP" ++ ++msgid "" ++"Close inactive connection after the given amount of seconds, use 0 to " ++"persist connection" ++msgstr "" ++ ++msgid "Close list..." ++msgstr "Tanca la llista..." ++ ++msgid "Collecting data..." ++msgstr "Aplegant dades..." ++ ++msgid "Command" ++msgstr "Ordre" ++ ++msgid "Common Configuration" ++msgstr "Configuració comuna" ++ ++msgid "Compression" ++msgstr "Compressió" ++ ++msgid "Configuration" ++msgstr "Configuració" ++ ++msgid "Configuration applied." ++msgstr "S'ha aplicat la configuració." ++ ++msgid "Configuration files will be kept." ++msgstr "Es mantindran els fitxers de configuració." ++ ++msgid "Confirmation" ++msgstr "Confirmació" ++ ++msgid "Connect" ++msgstr "Connecta" ++ ++msgid "Connected" ++msgstr "Connectat" ++ ++msgid "Connection Limit" ++msgstr "Límit de connexió" ++ ++msgid "Connection to server fails when TLS cannot be used" ++msgstr "" ++ ++msgid "Connections" ++msgstr "Connexions" ++ ++msgid "Country" ++msgstr "País" ++ ++msgid "Country Code" ++msgstr "Codi de País" ++ ++msgid "Cover the following interface" ++msgstr "Cobreix la interfície següent" ++ ++msgid "Cover the following interfaces" ++msgstr "Cobreix les interfícies següents" ++ ++msgid "Create / Assign firewall-zone" ++msgstr "Crea / Assigna zona de tallafocs" ++ ++msgid "Create Interface" ++msgstr "Crea interfície" ++ ++msgid "Create a bridge over multiple interfaces" ++msgstr "Crea un pont entre múltiples interfícies" ++ ++msgid "Critical" ++msgstr "Crític" ++ ++msgid "Cron Log Level" ++msgstr "Nivell de registre del Cron" ++ ++msgid "Custom Interface" ++msgstr "Interfície personalitzada" ++ ++msgid "Custom delegated IPv6-prefix" ++msgstr "" ++ ++msgid "" ++"Customizes the behaviour of the device LEDs if possible." ++msgstr "" ++"Personalitza el comportament dels LEDs del dispositiu si és possible." ++ ++msgid "DHCP Leases" ++msgstr "Arrendaments DHCP" ++ ++msgid "DHCP Server" ++msgstr "Servidor DHCP" ++ ++msgid "DHCP and DNS" ++msgstr "DHCP i DNS" ++ ++msgid "DHCP client" ++msgstr "Client DHCP" ++ ++msgid "DHCP-Options" ++msgstr "Opcions DHCP" ++ ++msgid "DHCPv6 Leases" ++msgstr "Arrendaments DHCPv6" ++ ++msgid "DHCPv6 client" ++msgstr "" ++ ++msgid "DHCPv6-Mode" ++msgstr "" ++ ++msgid "DHCPv6-Service" ++msgstr "" ++ ++msgid "DNS" ++msgstr "DNS" ++ ++msgid "DNS forwardings" ++msgstr "Reenviaments DNS" ++ ++msgid "DNS-Label / FQDN" ++msgstr "" ++ ++msgid "DS-Lite AFTR address" ++msgstr "" ++ ++msgid "DUID" ++msgstr "DUID" ++ ++msgid "Debug" ++msgstr "Depuració" ++ ++msgid "Default %d" ++msgstr "%d per defecte" ++ ++msgid "Default gateway" ++msgstr "Passarel·la per defecte" ++ ++msgid "Default route" ++msgstr "" ++ ++msgid "Default state" ++msgstr "Estat per defecte" ++ ++msgid "Define a name for this network." ++msgstr "Definiu el nom d'aquesta xarxa" ++ ++msgid "" ++"Define additional DHCP options, for example " ++"\"6,192.168.2.1,192.168.2.2\" which advertises different DNS " ++"servers to clients." ++msgstr "" ++ ++msgid "Delete" ++msgstr "Suprimeix" ++ ++msgid "Delete this interface" ++msgstr "Suprimeix aquesta interfície" ++ ++msgid "Delete this network" ++msgstr "Suprimeix aquesta xarxa" ++ ++msgid "Description" ++msgstr "Descripció" ++ ++msgid "Design" ++msgstr "Disseny" ++ ++msgid "Destination" ++msgstr "Destí" ++ ++msgid "Device" ++msgstr "Dispositiu" ++ ++msgid "Device Configuration" ++msgstr "Configuració de dispositiu" ++ ++msgid "Diagnostics" ++msgstr "Diagnòstics" ++ ++msgid "Dial number" ++msgstr "" ++ ++msgid "Directory" ++msgstr "Directori" ++ ++msgid "Disable" ++msgstr "Inhabilita" ++ ++msgid "" ++"Disable DHCP for " ++"this interface." ++msgstr "" ++"Inhabilita el DHCP en aquesta interfície." ++ ++msgid "Disable DNS setup" ++msgstr "" ++ ++msgid "Disable HW-Beacon timer" ++msgstr "Inhabilita el temporitzador HW-Beacon" ++ ++msgid "Disabled" ++msgstr "Inhabilitat" ++ ++msgid "Discard upstream RFC1918 responses" ++msgstr "Descarta les respostes RFC1918 des de dalt" ++ ++msgid "Displaying only packages containing" ++msgstr "Mostrant només els paquets que contenen" ++ ++msgid "Distance Optimization" ++msgstr "Optimització de distància" ++ ++msgid "Distance to farthest network member in meters." ++msgstr "Distància al membre de la xarxa més allunyat en metres." ++ ++msgid "Diversity" ++msgstr "Diversitat" ++ ++msgid "" ++"Dnsmasq is a combined DHCP-Server and DNS-" ++"Forwarder for NAT " ++"firewalls" ++msgstr "" ++"El Dnsmasq és un servidor DHCP combinat i un reenviador de DNS per tallafocs NAT" ++ ++msgid "Do not cache negative replies, e.g. for not existing domains" ++msgstr "" ++ ++msgid "Do not forward requests that cannot be answered by public name servers" ++msgstr "" ++ ++msgid "Do not forward reverse lookups for local networks" ++msgstr "" ++ ++msgid "Do not send probe responses" ++msgstr "No enviïs les respostes de prova" ++ ++msgid "Domain required" ++msgstr "Es requereix un domini" ++ ++msgid "Domain whitelist" ++msgstr "" ++ ++msgid "" ++"Don't forward DNS-Requests without " ++"DNS-Name" ++msgstr "" ++"No reenviïs les peticions DNS " ++"sense el nom DNS" ++ ++msgid "Download and install package" ++msgstr "Descarrega i instal·la el paquet" ++ ++msgid "Download backup" ++msgstr "Descarrega còpia de seguritat" ++ ++msgid "Dropbear Instance" ++msgstr "Instància de Dropbear" ++ ++msgid "" ++"Dropbear offers SSH network shell access " ++"and an integrated SCP server" ++msgstr "" ++"El Dropbear ofereix accés per la xarxa a consola SSHi un servidor SCP integrat" ++ ++msgid "Dual-Stack Lite (RFC6333)" ++msgstr "" ++ ++msgid "Dynamic DHCP" ++msgstr "" ++"DHCP dinàmic" ++ ++msgid "Dynamic tunnel" ++msgstr "Túnel dinàmic" ++ ++msgid "" ++"Dynamically allocate DHCP addresses for clients. If disabled, only clients " ++"having static leases will be served." ++msgstr "" ++ ++msgid "EAP-Method" ++msgstr "Mètode EAP" ++ ++msgid "Edit" ++msgstr "Edita" ++ ++msgid "" ++"Edit the raw configuration data above to fix any error and hit \"Save\" to " ++"reload the page." ++msgstr "" ++ ++msgid "Edit this interface" ++msgstr "Edita aquesta interfície" ++ ++msgid "Edit this network" ++msgstr "Edita aquesta xarxa" ++ ++msgid "Emergency" ++msgstr "Emergència" ++ ++msgid "Enable" ++msgstr "Habilita" ++ ++msgid "Enable STP" ++msgstr "Habilita l'STP" ++ ++msgid "Enable HE.net dynamic endpoint update" ++msgstr "" ++ ++msgid "Enable IPv6 negotiation on the PPP link" ++msgstr "Habilita negociació IPv6 en la enllaç PPP" ++ ++msgid "Enable Jumbo Frame passthrough" ++msgstr "Habilita el passatge de trames enormes" ++ ++msgid "Enable NTP client" ++msgstr "Habilita el client NTP" ++ ++msgid "Enable TFTP server" ++msgstr "Habilita el servidor TFTP" ++ ++msgid "Enable VLAN functionality" ++msgstr "Habilita la funcionalitat VLAN" ++ ++msgid "Enable WPS pushbutton, requires WPA(2)-PSK" ++msgstr "" ++ ++msgid "Enable learning and aging" ++msgstr "Habilita l'aprenentatge i l'envelliment" ++ ++msgid "Enable mirroring of incoming packets" ++msgstr "" ++ ++msgid "Enable mirroring of outgoing packets" ++msgstr "" ++ ++msgid "Enable this mount" ++msgstr "" ++ ++msgid "Enable this swap" ++msgstr "" ++ ++msgid "Enable/Disable" ++msgstr "Activa/Desactiva" ++ ++msgid "Enabled" ++msgstr "Habilitat" ++ ++msgid "Enables the Spanning Tree Protocol on this bridge" ++msgstr "Habilita l'Spanning Tree Protocol a aquest pont" ++ ++msgid "Encapsulation mode" ++msgstr "Mode d'encapsulació" ++ ++msgid "Encryption" ++msgstr "Encriptació" ++ ++msgid "Erasing..." ++msgstr "Esborrant..." ++ ++msgid "Error" ++msgstr "Error" ++ ++msgid "Ethernet Adapter" ++msgstr "Adaptador Ethernet" ++ ++msgid "Ethernet Switch" ++msgstr "Switch Ethernet" ++ ++msgid "Expand hosts" ++msgstr "" ++ ++msgid "Expires" ++msgstr "Caduca" ++ ++msgid "" ++"Expiry time of leased addresses, minimum is 2 minutes (2m)." ++msgstr "" ++ ++msgid "External" ++msgstr "" ++ ++msgid "External system log server" ++msgstr "" ++ ++msgid "External system log server port" ++msgstr "" ++ ++msgid "Fast Frames" ++msgstr "Fast Frames" ++ ++msgid "File" ++msgstr "Fitxer" ++ ++msgid "Filename of the boot image advertised to clients" ++msgstr "Nom de fitxer de la imatge d'inici que es publica als clients" ++ ++msgid "Filesystem" ++msgstr "Sistema de fitxers" ++ ++msgid "Filter" ++msgstr "Filtre" ++ ++msgid "Filter private" ++msgstr "Filtra privat" ++ ++msgid "Filter useless" ++msgstr "Filtra els no útils" ++ ++msgid "Find and join network" ++msgstr "Troba i uneix-te a la xarxa" ++ ++msgid "Find package" ++msgstr "Cerca paquet" ++ ++msgid "Finish" ++msgstr "Acaba" ++ ++msgid "Firewall" ++msgstr "Tallafocs" ++ ++msgid "Firewall Settings" ++msgstr "Ajusts de tallafocs" ++ ++msgid "Firewall Status" ++msgstr "Estat de tallafocs" ++ ++msgid "Firmware Version" ++msgstr "Versió de microprogramari" ++ ++msgid "Fixed source port for outbound DNS queries" ++msgstr "" ++ ++msgid "Flags" ++msgstr "Flags" ++ ++msgid "Flash Firmware" ++msgstr "Reescriu el microprogramari" ++ ++msgid "Flash image..." ++msgstr "Escriu una imatge..." ++ ++msgid "Flash new firmware image" ++msgstr "Escriu una imatge nova" ++ ++msgid "Flash operations" ++msgstr "Operacions d'escriptura" ++ ++msgid "Flashing..." ++msgstr "Escrivent..." ++ ++msgid "Force" ++msgstr "Força" ++ ++msgid "Force CCMP (AES)" ++msgstr "Força el CCMP (AES)" ++ ++msgid "Force DHCP on this network even if another server is detected." ++msgstr "Força el DHCP en aquesta xarxa encara que es detecti altre servidor." ++ ++msgid "Force TKIP" ++msgstr "Força el TKIP" ++ ++msgid "Force TKIP and CCMP (AES)" ++msgstr "Força el TKIP i el CCMP (AES)" ++ ++msgid "Forward DHCP traffic" ++msgstr "Reenvia el tràfic DHCP" ++ ++msgid "Forward broadcast traffic" ++msgstr "Reenvia el tràfic difós" ++ ++msgid "Forwarding mode" ++msgstr "Mode de reenviament" ++ ++msgid "Fragmentation Threshold" ++msgstr "Llindar de fragmentació" ++ ++msgid "Frame Bursting" ++msgstr "" ++ ++msgid "Free" ++msgstr "Lliures" ++ ++msgid "Free space" ++msgstr "Espai lliure" ++ ++msgid "GHz" ++msgstr "GHz" ++ ++msgid "GPRS only" ++msgstr "Només GPRS" ++ ++msgid "Gateway" ++msgstr "Passarel·la" ++ ++msgid "Gateway ports" ++msgstr "Ports de passarel·la" ++ ++msgid "General Settings" ++msgstr "Ajusts generals" ++ ++msgid "General Setup" ++msgstr "" ++ ++msgid "Generate archive" ++msgstr "" ++ ++msgid "Generic 802.11%s Wireless Controller" ++msgstr "Controlador sense fil 802.11%s genèric" ++ ++msgid "Given password confirmation did not match, password not changed!" ++msgstr "" ++"La contrasenya i la confirmació de contrasenya no es coincideixen. La " ++"contrasenya no s'ha canviat!" ++ ++msgid "Global network options" ++msgstr "" ++ ++msgid "Go to password configuration..." ++msgstr "Vés a la configuració de contrasenya" ++ ++msgid "Go to relevant configuration page" ++msgstr "Vés a la pàgina de configuració" ++ ++msgid "Guest" ++msgstr "" ++ ++msgid "HE.net password" ++msgstr "Contrasenya de HE.net" ++ ++msgid "HE.net username" ++msgstr "" ++ ++msgid "Handler" ++msgstr "" ++ ++msgid "Hang Up" ++msgstr "Penja" ++ ++msgid "Heartbeat" ++msgstr "" ++ ++msgid "" ++"Here you can configure the basic aspects of your device like its hostname or " ++"the timezone." ++msgstr "" ++"Ací pots configurar els aspectes bàsics del teu dispositiu, com el nom de la " ++"màquina o el fus horari." ++ ++msgid "" ++"Here you can paste public SSH-Keys (one per line) for SSH public-key " ++"authentication." ++msgstr "" ++ ++msgid "Hermes 802.11b Wireless Controller" ++msgstr "Controlador sense fil Hermes 802.11b" ++ ++msgid "Hide ESSID" ++msgstr "" ++"No mostris l'ESSID" ++ ++msgid "Host entries" ++msgstr "Entrades de noms de màquina" ++ ++msgid "Host expiry timeout" ++msgstr "" ++ ++msgid "Host-IP or Network" ++msgstr "Xarxa o adreça IP" ++ ++msgid "Hostname" ++msgstr "Nom de màquina" ++ ++msgid "Hostname to send when requesting DHCP" ++msgstr "" ++ ++msgid "Hostnames" ++msgstr "Noms de màquina" ++ ++msgid "Hybrid" ++msgstr "" ++ ++msgid "IP address" ++msgstr "Adreça IP" ++ ++msgid "IPv4" ++msgstr "IPv4" ++ ++msgid "IPv4 Firewall" ++msgstr "Tallafocs IPv4" ++ ++msgid "IPv4 WAN Status" ++msgstr "Estat WAN IPv4" ++ ++msgid "IPv4 address" ++msgstr "Adreça IPv4" ++ ++msgid "IPv4 and IPv6" ++msgstr "IPv4 i IPv6" ++ ++msgid "IPv4 assignment length" ++msgstr "" ++ ++msgid "IPv4 broadcast" ++msgstr "Difusió IPv4" ++ ++msgid "IPv4 gateway" ++msgstr "Passarel·la IPv4" ++ ++msgid "IPv4 netmask" ++msgstr "Màscara de xarxa IPv4" ++ ++msgid "IPv4 only" ++msgstr "Només IPv4" ++ ++msgid "IPv4 prefix length" ++msgstr "Longitud de prefix IPv4" ++ ++msgid "IPv4-Address" ++msgstr "Adreça IPv6" ++ ++msgid "IPv6" ++msgstr "IPv6" ++ ++msgid "IPv6 Firewall" ++msgstr "Tallafocs IPv6" ++ ++msgid "IPv6 Neighbours" ++msgstr "" ++ ++msgid "IPv6 Settings" ++msgstr "" ++ ++msgid "IPv6 ULA-Prefix" ++msgstr "" ++ ++msgid "IPv6 WAN Status" ++msgstr "Estado WAN IPv6" ++ ++msgid "IPv6 address" ++msgstr "Adreça IPv6" ++ ++msgid "IPv6 address delegated to the local tunnel endpoint (optional)" ++msgstr "" ++ ++msgid "IPv6 assignment hint" ++msgstr "" ++ ++msgid "IPv6 assignment length" ++msgstr "" ++ ++msgid "IPv6 gateway" ++msgstr "Passarel·la IPv6" ++ ++msgid "IPv6 only" ++msgstr "Només IPv6" ++ ++msgid "IPv6 prefix" ++msgstr "Prefix IPv6" ++ ++msgid "IPv6 prefix length" ++msgstr "Longitud de prefix IPv6" ++ ++msgid "IPv6 routed prefix" ++msgstr "" ++ ++msgid "IPv6-Address" ++msgstr "Adreça IPv6" ++ ++msgid "IPv6-in-IPv4 (RFC4213)" ++msgstr "IPv6-en-IPv4 (RFC4213)" ++ ++msgid "IPv6-over-IPv4 (6rd)" ++msgstr "IPv6-sobre-IPv4 (6rd)" ++ ++msgid "IPv6-over-IPv4 (6to4)" ++msgstr "IPv6-sobre-IPv4 (6to4)" ++ ++msgid "Identity" ++msgstr "Identitat" ++ ++msgid "" ++"If specified, mount the device by its UUID instead of a fixed device node" ++msgstr "" ++ ++msgid "" ++"If specified, mount the device by the partition label instead of a fixed " ++"device node" ++msgstr "" ++ ++msgid "If unchecked, no default route is configured" ++msgstr "" ++ ++msgid "If unchecked, the advertised DNS server addresses are ignored" ++msgstr "" ++ ++msgid "" ++"If your physical memory is insufficient unused data can be temporarily " ++"swapped to a swap-device resulting in a higher amount of usable RAM. Be aware that swapping data is a very " ++"slow process as the swap-device cannot be accessed with the high datarates " ++"of the RAM." ++msgstr "" ++"Si la teva memòria física és insuficient, les dades no usades es poden " ++"intercanviar a un dispositiu d'intercanvi, pel qual hi haurà una quantitat " ++"més gran de memòria RAM usable. " ++"Tingues en compte que intercanviar dades és un procés molt lent, ja que no " ++"es pot accedir al dispositiu d'intercanvi amb unes taxes tan altes com les " ++"de la RAM." ++ ++msgid "Ignore Hosts files" ++msgstr "" ++ ++msgid "Ignore interface" ++msgstr "Ignora la interfície" ++ ++msgid "Ignore resolve file" ++msgstr "Ignora el fitxer de resolució" ++ ++msgid "Image" ++msgstr "Imatge" ++ ++msgid "In" ++msgstr "En" ++ ++msgid "Inactivity timeout" ++msgstr "Temps d'espera d'inactivitat" ++ ++msgid "Inbound:" ++msgstr "Entrant:" ++ ++msgid "Info" ++msgstr "Informació" ++ ++msgid "Initscript" ++msgstr "Script d'inici" ++ ++msgid "Initscripts" ++msgstr "Scripts d'inici" ++ ++msgid "Install" ++msgstr "Instal·la" ++ ++msgid "Install iputils-traceroute6 for IPv6 traceroute" ++msgstr "" ++ ++msgid "Install package %q" ++msgstr "Instal·la el paquet %q" ++ ++msgid "Install protocol extensions..." ++msgstr "Instal·la extensions de protocol" ++ ++msgid "Installed packages" ++msgstr "Paquets instal·lats" ++ ++msgid "Interface" ++msgstr "Interfície" ++ ++msgid "Interface Configuration" ++msgstr "Configuració d'interfície" ++ ++msgid "Interface Overview" ++msgstr "Visió de conjunt de la interfície" ++ ++msgid "Interface is reconnecting..." ++msgstr "La interfície s'està reconnectant..." ++ ++msgid "Interface is shutting down..." ++msgstr "La interfície s'està aturant..." ++ ++msgid "Interface not present or not connected yet." ++msgstr "" ++ ++msgid "Interface reconnected" ++msgstr "" ++ ++msgid "Interface shut down" ++msgstr "" ++ ++msgid "Interfaces" ++msgstr "Interfícies" ++ ++msgid "Internal" ++msgstr "" ++ ++msgid "Internal Server Error" ++msgstr "Error de servidor intern" ++ ++msgid "Invalid" ++msgstr "Invàlid" ++ ++msgid "Invalid VLAN ID given! Only IDs between %d and %d are allowed." ++msgstr "" ++ ++msgid "Invalid VLAN ID given! Only unique IDs are allowed" ++msgstr "" ++ ++msgid "Invalid username and/or password! Please try again." ++msgstr "Usuari i/o contrasenya invàlids! Si us plau prova-ho de nou." ++ ++#, fuzzy ++msgid "" ++"It appears that you are trying to flash an image that does not fit into the " ++"flash memory, please verify the image file!" ++msgstr "" ++"Sembla que intentes actualitzar una imatge que no hi cap a la memòria flaix, " ++"si us plau verifica el fitxer d'imatge!" ++ ++msgid "Java Script required!" ++msgstr "Es requereix JavaScript!" ++ ++msgid "Join Network" ++msgstr "Uneix-te a la xarxa" ++ ++msgid "Join Network: Settings" ++msgstr "Unir-se a la xarxa: Ajusts" ++ ++msgid "Join Network: Wireless Scan" ++msgstr "" ++ ++msgid "Keep settings" ++msgstr "" ++ ++msgid "Kernel Log" ++msgstr "Registre del nucli" ++ ++msgid "Kernel Version" ++msgstr "Versió del nucli" ++ ++msgid "Key" ++msgstr "Clau" ++ ++msgid "Key #%d" ++msgstr "Clau #%d" ++ ++msgid "Kill" ++msgstr "Mata" ++ ++msgid "L2TP" ++msgstr "L2TP" ++ ++msgid "L2TP Server" ++msgstr "Servidor L2TP" ++ ++msgid "LCP echo failure threshold" ++msgstr "Llindar de fracàs d'eco LCP" ++ ++msgid "LCP echo interval" ++msgstr "Interval d'eco LCP" ++ ++msgid "LLC" ++msgstr "LLC" ++ ++msgid "Label" ++msgstr "Etiqueta" ++ ++msgid "Language" ++msgstr "Llengua" ++ ++msgid "Language and Style" ++msgstr "Llengua i estil" ++ ++msgid "Leaf" ++msgstr "" ++ ++msgid "Lease validity time" ++msgstr "Duració de validitat d'arrendament" ++ ++msgid "Leasefile" ++msgstr "Fitxer d'arrendament" ++ ++msgid "Leasetime" ++msgstr "Duració d'arrendament" ++ ++msgid "Leasetime remaining" ++msgstr "Duració d'arrendament restant" ++ ++msgid "Leave empty to autodetect" ++msgstr "Deixeu-ho en blanc per autodetectar" ++ ++msgid "Leave empty to use the current WAN address" ++msgstr "Deixeu-ho en blanc per utilitzar l'adreça WAN actual" ++ ++msgid "Legend:" ++msgstr "Llegenda:" ++ ++msgid "Limit" ++msgstr "Límit" ++ ++msgid "Line Attenuation" ++msgstr "" ++ ++msgid "Line Speed" ++msgstr "" ++ ++msgid "Line State" ++msgstr "" ++ ++msgid "Link On" ++msgstr "Enllaç activa" ++ ++msgid "" ++"List of DNS servers to forward " ++"requests to" ++msgstr "" ++ ++msgid "List of domains to allow RFC1918 responses for" ++msgstr "" ++ ++msgid "List of hosts that supply bogus NX domain results" ++msgstr "" ++ ++msgid "Listen only on the given interface or, if unspecified, on all" ++msgstr "" ++ ++msgid "Listening port for inbound DNS queries" ++msgstr "" ++ ++msgid "Load" ++msgstr "Carrega" ++ ++msgid "Load Average" ++msgstr "Carrega mitjana" ++ ++msgid "Loading" ++msgstr "Carregant" ++ ++msgid "Local IPv4 address" ++msgstr "Adreça IPv4 local" ++ ++msgid "Local IPv6 address" ++msgstr "Adreça IPv6 local" ++ ++msgid "Local Startup" ++msgstr "Inici local" ++ ++msgid "Local Time" ++msgstr "Hora local" ++ ++msgid "Local domain" ++msgstr "Domini local" ++ ++msgid "" ++"Local domain specification. Names matching this domain are never forwarded " ++"and are resolved from DHCP or hosts files only" ++msgstr "" ++ ++msgid "Local domain suffix appended to DHCP names and hosts file entries" ++msgstr "" ++ ++msgid "Local server" ++msgstr "Servidor local" ++ ++msgid "" ++"Localise hostname depending on the requesting subnet if multiple IPs are " ++"available" ++msgstr "" ++ ++msgid "Localise queries" ++msgstr "Localitza les peticions" ++ ++msgid "Locked to channel %d used by: %s" ++msgstr "" ++ ++msgid "Log output level" ++msgstr "Nivell de sortida de registre" ++ ++msgid "Log queries" ++msgstr "Registra les peticions" ++ ++msgid "Logging" ++msgstr "Registre" ++ ++msgid "Login" ++msgstr "Entra" ++ ++msgid "Logout" ++msgstr "Surt" ++ ++msgid "Lowest leased address as offset from the network address." ++msgstr "" ++ ++msgid "MAC-Address" ++msgstr "Adreça MAC" ++ ++msgid "MAC-Address Filter" ++msgstr "Filtre d'adreces MAC" ++ ++msgid "MAC-Filter" ++msgstr "Filtre MAC" ++ ++msgid "MAC-List" ++msgstr "Llista MAC" ++ ++msgid "MB/s" ++msgstr "MB/s" ++ ++msgid "MHz" ++msgstr "MHz" ++ ++msgid "MTU" ++msgstr "MTU" ++ ++msgid "" ++"Make sure to clone the root filesystem using something like the commands " ++"below:" ++msgstr "" ++ ++msgid "Maximum Rate" ++msgstr "Velocitat màxima" ++ ++msgid "Maximum allowed number of active DHCP leases" ++msgstr "" ++ ++msgid "Maximum allowed number of concurrent DNS queries" ++msgstr "" ++ ++msgid "Maximum allowed size of EDNS.0 UDP packets" ++msgstr "" ++ ++msgid "Maximum amount of seconds to wait for the modem to become ready" ++msgstr "" ++ ++msgid "Maximum hold time" ++msgstr "" ++ ++msgid "Maximum number of leased addresses." ++msgstr "" ++ ++msgid "Mbit/s" ++msgstr "Mbit/s" ++ ++msgid "Memory" ++msgstr "Memòria" ++ ++msgid "Memory usage (%)" ++msgstr "Ús de Memòria (%)" ++ ++msgid "Metric" ++msgstr "Mètric" ++ ++msgid "Minimum Rate" ++msgstr "Velocitat mínima" ++ ++msgid "Minimum hold time" ++msgstr "" ++ ++msgid "Mirror monitor port" ++msgstr "" ++ ++msgid "Mirror source port" ++msgstr "" ++ ++msgid "Missing protocol extension for proto %q" ++msgstr "Manca l'extensió de protocol del protocol %q" ++ ++msgid "Mode" ++msgstr "Mode" ++ ++msgid "Model" ++msgstr "" ++ ++msgid "Modem device" ++msgstr "Dispositiu mòdem" ++ ++msgid "Modem init timeout" ++msgstr "Temps d'espera d'inici de mòdem" ++ ++msgid "Monitor" ++msgstr "Monitor" ++ ++msgid "Mount Entry" ++msgstr "" ++ ++msgid "Mount Point" ++msgstr "Punt de muntatge" ++ ++msgid "Mount Points" ++msgstr "Punts de muntatge" ++ ++msgid "Mount Points - Mount Entry" ++msgstr "" ++ ++msgid "Mount Points - Swap Entry" ++msgstr "" ++ ++msgid "" ++"Mount Points define at which point a memory device will be attached to the " ++"filesystem" ++msgstr "" ++"Els punts de muntatge defineixen en quin punt un dispositiu de memòria " ++"s'adjuntarà amb el sistema de fitxers" ++ ++msgid "Mount options" ++msgstr "Opcions de muntatge" ++ ++msgid "Mount point" ++msgstr "" ++ ++msgid "Mounted file systems" ++msgstr "Sistemes de fitxers muntats" ++ ++msgid "Move down" ++msgstr "Baixa" ++ ++msgid "Move up" ++msgstr "Puja" ++ ++msgid "Multicast Rate" ++msgstr "Velocitat de difusió selectiva" ++ ++msgid "Multicast address" ++msgstr "Adreça de difusió selectiva" ++ ++msgid "NAS ID" ++msgstr "NAS ID" ++ ++msgid "NDP-Proxy" ++msgstr "" ++ ++msgid "NTP server candidates" ++msgstr "Candidats de servidor NTP" ++ ++msgid "NTP sync time-out" ++msgstr "" ++ ++msgid "Name" ++msgstr "Nom" ++ ++msgid "Name of the new interface" ++msgstr "Nom de la nova interfície" ++ ++msgid "Name of the new network" ++msgstr "Nom de la nova xarxa" ++ ++msgid "Navigation" ++msgstr "Navegació" ++ ++msgid "Netmask" ++msgstr "Màscara de xarxa" ++ ++msgid "Network" ++msgstr "Xarxa" ++ ++msgid "Network Utilities" ++msgstr "Utilitats de xarxa" ++ ++msgid "Network boot image" ++msgstr "Imatge d'inici de xarxa" ++ ++msgid "Network without interfaces." ++msgstr "Xarxa sense interfícies." ++ ++msgid "Next »" ++msgstr "Següent" ++ ++msgid "No DHCP Server configured for this interface" ++msgstr "Cap servidor DHCP configurat en aquesta interfície" ++ ++msgid "No chains in this table" ++msgstr "No hi ha cadenes a aquesta taula" ++ ++msgid "No files found" ++msgstr "Cap fitxer trobat" ++ ++msgid "No information available" ++msgstr "Cap informació disponible" ++ ++msgid "No negative cache" ++msgstr "Sense memòria cau negativa" ++ ++msgid "No network configured on this device" ++msgstr "Cap xarxa configurada en aquest dispositiu" ++ ++msgid "No network name specified" ++msgstr "Cap nom de xarxa especificat" ++ ++msgid "No package lists available" ++msgstr "No hi ha llistes de paquets disponibles" ++ ++msgid "No password set!" ++msgstr "Cap contrasenya establerta!" ++ ++msgid "No rules in this chain" ++msgstr "No hi ha regles en aquesta cadena" ++ ++msgid "No zone assigned" ++msgstr "Cap zona assignada" ++ ++msgid "Noise" ++msgstr "Soroll" ++ ++msgid "Noise Margin" ++msgstr "" ++ ++msgid "Noise:" ++msgstr "Soroll:" ++ ++msgid "None" ++msgstr "Cap" ++ ++msgid "Normal" ++msgstr "Normal" ++ ++msgid "Not Found" ++msgstr "No trobat" ++ ++msgid "Not associated" ++msgstr "No associat" ++ ++msgid "Not connected" ++msgstr "No connectat" ++ ++msgid "Note: Configuration files will be erased." ++msgstr "Nota: Els fitxers de configuració s'esborraran." ++ ++msgid "Notice" ++msgstr "Avís" ++ ++msgid "Nslookup" ++msgstr "Nslookup" ++ ++msgid "OK" ++msgstr "D'acord" ++ ++msgid "OPKG-Configuration" ++msgstr "Configuració d'OPKG" ++ ++msgid "Off-State Delay" ++msgstr "" ++ ++msgid "" ++"On this page you can configure the network interfaces. You can bridge " ++"several interfaces by ticking the \"bridge interfaces\" field and enter the " ++"names of several network interfaces separated by spaces. You can also use " ++"VLAN notation " ++"INTERFACE.VLANNR (e.g.: " ++"eth0.1)." ++msgstr "" ++"En aquesta pàgina pots configurar les interfícies de xarxa. Pots fer un pont " ++"entre diverses interfícies clicant sobre el camp \"interfície pont\" i " ++"introduint els noms de les diverses interfícies de xarxa separats per " ++"espais. També pots fer servir la notació VLAN INTERFACE.VLANNR (p.e.: eth0.1)." ++ ++msgid "On-State Delay" ++msgstr "" ++ ++msgid "One of hostname or mac address must be specified!" ++msgstr "Cal especificar o el nom de host o l'adreça MAC!" ++ ++msgid "One or more fields contain invalid values!" ++msgstr "Un o més dels camps requerits conté un valor invàlid!" ++ ++msgid "One or more required fields have no value!" ++msgstr "Un o més dels camps requerits no té valor!" ++ ++msgid "Open list..." ++msgstr "Obre una llista..." ++ ++msgid "OpenConnect (CISCO AnyConnect)" ++msgstr "" ++ ++msgid "Operating frequency" ++msgstr "" ++ ++msgid "Option changed" ++msgstr "Opció canviada" ++ ++msgid "Option removed" ++msgstr "Opció treta" ++ ++msgid "Optional, specify to override default server (tic.sixxs.net)" ++msgstr "" ++ ++msgid "Optional, use when the SIXXS account has more than one tunnel" ++msgstr "" ++ ++msgid "Options" ++msgstr "Opcions" ++ ++msgid "Other:" ++msgstr "Altres:" ++ ++msgid "Out" ++msgstr "" ++ ++msgid "Outbound:" ++msgstr "Sortint:" ++ ++msgid "Outdoor Channels" ++msgstr "Canals d'exteriors" ++ ++msgid "Output Interface" ++msgstr "" ++ ++msgid "Override MAC address" ++msgstr "" ++ ++msgid "Override MTU" ++msgstr "" ++ ++msgid "Override the gateway in DHCP responses" ++msgstr "" ++ ++msgid "" ++"Override the netmask sent to clients. Normally it is calculated from the " ++"subnet that is served." ++msgstr "" ++ ++msgid "Override the table used for internal routes" ++msgstr "" ++ ++msgid "Overview" ++msgstr "Visió de conjunt" ++ ++msgid "Owner" ++msgstr "Propietari" ++ ++msgid "PAP/CHAP password" ++msgstr "Contrasenya PAP/CHAP" ++ ++msgid "PAP/CHAP username" ++msgstr "Nom d'usuari PAP/CHAP" ++ ++msgid "PID" ++msgstr "PID" ++ ++msgid "PIN" ++msgstr "PIN" ++ ++msgid "PPP" ++msgstr "PPP" ++ ++msgid "PPPoA Encapsulation" ++msgstr "Encapsulació PPPoA" ++ ++msgid "PPPoATM" ++msgstr "PPPoATM" ++ ++msgid "PPPoE" ++msgstr "PPPoE" ++ ++msgid "PPtP" ++msgstr "PPtP" ++ ++msgid "Package libiwinfo required!" ++msgstr "Es requereix el paquet libiwinfo!" ++ ++msgid "Package lists are older than 24 hours" ++msgstr "Les llistes de paquets tenen més de 24 hores" ++ ++msgid "Package name" ++msgstr "Nom del paquet" ++ ++msgid "Packets" ++msgstr "Paquets" ++ ++msgid "Part of zone %q" ++msgstr "Part de la zona %q" ++ ++msgid "Password" ++msgstr "Contrasenya" ++ ++msgid "Password authentication" ++msgstr "Autenticació per contrasenya" ++ ++msgid "Password of Private Key" ++msgstr "Contrasenya de la clau privada" ++ ++msgid "Password successfully changed!" ++msgstr "La contrasenya s'ha canviat amb èxit!" ++ ++msgid "Path" ++msgstr "Ruta" ++ ++msgid "Path to CA-Certificate" ++msgstr "Ruta als Certificats CA" ++ ++msgid "Path to Client-Certificate" ++msgstr "" ++ ++msgid "Path to Private Key" ++msgstr "Ruta a la clau privada" ++ ++msgid "Path to executable which handles the button event" ++msgstr "" ++ ++msgid "Peak:" ++msgstr "Màxim:" ++ ++msgid "Perform reboot" ++msgstr "Executa un reinici" ++ ++msgid "Perform reset" ++msgstr "Executa un reinici" ++ ++msgid "Phy Rate:" ++msgstr "Velocitat física:" ++ ++msgid "Physical Settings" ++msgstr "Ajusts físics" ++ ++msgid "Ping" ++msgstr "" ++ ++msgid "Pkts." ++msgstr "Paquets" ++ ++msgid "Please enter your username and password." ++msgstr "Si us plau entra el teu nom d'usuari i contrasenya." ++ ++msgid "Please wait: Device rebooting..." ++msgstr "Si us plau espera: Dispositiu arrancant-se de nou" ++ ++msgid "Policy" ++msgstr "Política" ++ ++msgid "Port" ++msgstr "Port" ++ ++msgid "Port %d" ++msgstr "Port %d" ++ ++msgid "Port %d is untagged in multiple VLANs!" ++msgstr "" ++ ++msgid "Port status:" ++msgstr "Estatus de port" ++ ++msgid "" ++"Presume peer to be dead after given amount of LCP echo failures, use 0 to " ++"ignore failures" ++msgstr "" ++ ++msgid "Prevents client-to-client communication" ++msgstr "Evita la comunicació client a client" ++ ++msgid "Prism2/2.5/3 802.11b Wireless Controller" ++msgstr "" ++ ++msgid "Proceed" ++msgstr "continua" ++ ++msgid "Processes" ++msgstr "Processos" ++ ++msgid "Prot." ++msgstr "Prot." ++ ++msgid "Protocol" ++msgstr "Protocol" ++ ++msgid "Protocol family" ++msgstr "" ++ ++msgid "Protocol of the new interface" ++msgstr "" ++ ++msgid "Protocol support is not installed" ++msgstr "" ++ ++msgid "Provide NTP server" ++msgstr "" ++ ++msgid "Provide new network" ++msgstr "" ++ ++msgid "Pseudo Ad-Hoc (ahdemo)" ++msgstr "Pseudo Ad-Hoc (ahdemo)" ++ ++msgid "Public prefix routed to this device for distribution to clients." ++msgstr "" ++ ++msgid "Quality" ++msgstr "Calidad" ++ ++msgid "RTS/CTS Threshold" ++msgstr "Llindar RTS/CTS" ++ ++msgid "RX" ++msgstr "RX" ++ ++msgid "RX Rate" ++msgstr "Velocitat RX" ++ ++msgid "RaLink 802.11%s Wireless Controller" ++msgstr "Controlador sense fil RaLink 802.11%s" ++ ++msgid "Radius-Accounting-Port" ++msgstr "" ++ ++msgid "Radius-Accounting-Secret" ++msgstr "" ++ ++msgid "Radius-Accounting-Server" ++msgstr "" ++ ++msgid "Radius-Authentication-Port" ++msgstr "" ++ ++msgid "Radius-Authentication-Secret" ++msgstr "" ++ ++msgid "Radius-Authentication-Server" ++msgstr "" ++ ++msgid "" ++"Read /etc/ethers to configure the DHCP-Server" ++msgstr "" ++"Llegeix /etc/ethers per configurar el servidor DHCP" ++ ++msgid "" ++"Really delete this interface? The deletion cannot be undone!\\nYou might " ++"lose access to this device if you are connected via this interface." ++msgstr "" ++ ++msgid "" ++"Really delete this wireless network? The deletion cannot be undone!\\nYou " ++"might lose access to this device if you are connected via this network." ++msgstr "" ++ ++msgid "Really reset all changes?" ++msgstr "" ++ ++msgid "" ++"Really shut down network?\\nYou might lose access to this device if you are " ++"connected via this interface." ++msgstr "" ++ ++msgid "" ++"Really shutdown interface \"%s\" ?\\nYou might lose access to this device if " ++"you are connected via this interface." ++msgstr "" ++ ++msgid "Really switch protocol?" ++msgstr "" ++ ++msgid "Realtime Connections" ++msgstr "" ++ ++msgid "Realtime Graphs" ++msgstr "" ++ ++msgid "Realtime Load" ++msgstr "" ++ ++msgid "Realtime Traffic" ++msgstr "" ++ ++msgid "Realtime Wireless" ++msgstr "" ++ ++msgid "Rebind protection" ++msgstr "" ++ ++msgid "Reboot" ++msgstr "Reinicia" ++ ++msgid "Rebooting..." ++msgstr "Reiniciant..." ++ ++msgid "Reboots the operating system of your device" ++msgstr "Arranca de nou el sistema operatiu del teu dispositiu" ++ ++msgid "Receive" ++msgstr "Rep" ++ ++msgid "Receiver Antenna" ++msgstr "Antena receptora" ++ ++msgid "Reconnect this interface" ++msgstr "Reconnex aquesta interfície" ++ ++msgid "Reconnecting interface" ++msgstr "Reconnectant la interfície" ++ ++msgid "References" ++msgstr "Referències" ++ ++msgid "Regulatory Domain" ++msgstr "Domini regulatori" ++ ++msgid "Relay" ++msgstr "Relé" ++ ++msgid "Relay Bridge" ++msgstr "Pont de relé" ++ ++msgid "Relay between networks" ++msgstr "Relé entre xarxes" ++ ++msgid "Relay bridge" ++msgstr "Pont de relé" ++ ++msgid "Remote IPv4 address" ++msgstr "Adreça IPv6 remota" ++ ++msgid "Remove" ++msgstr "Treu" ++ ++msgid "Repeat scan" ++msgstr "" ++ ++msgid "Replace entry" ++msgstr "Reemplaça l'entrada" ++ ++msgid "Replace wireless configuration" ++msgstr "Reemplaça la configuració sense fil" ++ ++msgid "Request IPv6-address" ++msgstr "" ++ ++msgid "Request IPv6-prefix of length" ++msgstr "" ++ ++msgid "Require TLS" ++msgstr "" ++ ++msgid "Required for certain ISPs, e.g. Charter with DOCSIS 3" ++msgstr "Alguns ISP ho requereixen, per exemple el Charter amb DOCSIS 3" ++ ++msgid "Reset" ++msgstr "Reinicia" ++ ++msgid "Reset Counters" ++msgstr "Reinicia els comptadors" ++ ++msgid "Reset to defaults" ++msgstr "Reestableix els valors per defecte" ++ ++msgid "Resolv and Hosts Files" ++msgstr "" ++ ++msgid "Resolve file" ++msgstr "" ++ ++msgid "Restart" ++msgstr "Reinicia" ++ ++msgid "Restart Firewall" ++msgstr "Reinicia Tallafocs" ++ ++msgid "Restore backup" ++msgstr "Restaura còpia de seguretat" ++ ++msgid "Reveal/hide password" ++msgstr "Mostra/amaga la contrasenya" ++ ++msgid "Revert" ++msgstr "Reverteix" ++ ++msgid "Root" ++msgstr "Arrel" ++ ++msgid "Root directory for files served via TFTP" ++msgstr "Directori arrel dels fitxers servits per TFTP" ++ ++msgid "Root preparation" ++msgstr "" ++ ++msgid "Routed IPv6 prefix for downstream interfaces" ++msgstr "" ++ ++msgid "Router Advertisement-Service" ++msgstr "" ++ ++msgid "Router Password" ++msgstr "Contrasenya de l'encaminador" ++ ++msgid "Routes" ++msgstr "Rutes" ++ ++msgid "" ++"Routes specify over which interface and gateway a certain host or network " ++"can be reached." ++msgstr "" ++"Les rutes especifiquen per quina interfície i passarel·la es pot arribar a " ++"un cert ordinador o xarxa." ++ ++msgid "Rule #" ++msgstr "" ++ ++msgid "Run a filesystem check before mounting the device" ++msgstr "" ++ ++msgid "Run filesystem check" ++msgstr "" ++ ++msgid "" ++"SIXXS supports TIC only, for static tunnels using IP protocol 41 (RFC4213) " ++"use 6in4 instead" ++msgstr "" ++ ++msgid "SIXXS-handle[/Tunnel-ID]" ++msgstr "" ++ ++msgid "SSH Access" ++msgstr "Accés SSH" ++ ++msgid "SSH-Keys" ++msgstr "Claus SSH" ++ ++msgid "SSID" ++msgstr "SSID" ++ ++msgid "Save" ++msgstr "Desa" ++ ++msgid "Save & Apply" ++msgstr "Desa y aplica" ++ ++msgid "Save & Apply" ++msgstr "Desa y aplica" ++ ++msgid "Scan" ++msgstr "Escaneja" ++ ++msgid "Scheduled Tasks" ++msgstr "Tasques programades" ++ ++msgid "Section added" ++msgstr "Secció afegida" ++ ++msgid "Section removed" ++msgstr "Secció treta" ++ ++msgid "See \"mount\" manpage for details" ++msgstr "" ++ ++msgid "" ++"Send LCP echo requests at the given interval in seconds, only effective in " ++"conjunction with failure threshold" ++msgstr "" ++ ++msgid "Separate Clients" ++msgstr "Clients separats" ++ ++msgid "Separate WDS" ++msgstr "WDS separat" ++ ++msgid "Server Settings" ++msgstr "Ajusts de servidor" ++ ++msgid "Server password" ++msgstr "" ++ ++msgid "" ++"Server password, enter the specific password of the tunnel when the username " ++"contains the tunnel ID" ++msgstr "" ++ ++msgid "Server username" ++msgstr "" ++ ++msgid "Service Name" ++msgstr "Nom de servei" ++ ++msgid "Service Type" ++msgstr "Tipus de servei" ++ ++msgid "Services" ++msgstr "Serveis" ++ ++#, fuzzy ++msgid "Set up Time Synchronization" ++msgstr "Sincronització de hora" ++ ++msgid "Setup DHCP Server" ++msgstr "" ++ ++msgid "Show current backup file list" ++msgstr "" ++ ++msgid "Shutdown this interface" ++msgstr "Atura aquesta interfície" ++ ++msgid "Shutdown this network" ++msgstr "Atura aquesta xarxa" ++ ++msgid "Signal" ++msgstr "Senyal" ++ ++msgid "Signal:" ++msgstr "Senyal:" ++ ++msgid "Size" ++msgstr "Mida" ++ ++msgid "Skip" ++msgstr "Salta" ++ ++msgid "Skip to content" ++msgstr "Salta al contingut" ++ ++msgid "Skip to navigation" ++msgstr "Salta a la navegació" ++ ++msgid "Slot time" ++msgstr "" ++ ++msgid "Software" ++msgstr "Programari" ++ ++msgid "Some fields are invalid, cannot save values!" ++msgstr "No es pot desar els valors perquè alguns camps estan invàlids!" ++ ++msgid "Sorry, the object you requested was not found." ++msgstr "Tristament, l'object que heu sol·licitat no s'ha trobat." ++ ++msgid "Sorry, the server encountered an unexpected error." ++msgstr "Tristament, el servidor ha encontrat un error inesperat." ++ ++msgid "" ++"Sorry, there is no sysupgrade support present; a new firmware image must be " ++"flashed manually. Please refer to the OpenWrt wiki for device specific " ++"install instructions." ++msgstr "" ++ ++msgid "Sort" ++msgstr "Ordena" ++ ++msgid "Source" ++msgstr "Origen" ++ ++msgid "Source routing" ++msgstr "" ++ ++msgid "Specifies the button state to handle" ++msgstr "" ++ ++msgid "Specifies the directory the device is attached to" ++msgstr "Especifica el directori a que el dispositiu està adjuntat" ++ ++msgid "Specifies the listening port of this Dropbear instance" ++msgstr "Especifica el port d'escolta d'aquesta instància del Dropbear" ++ ++msgid "" ++"Specifies the maximum amount of failed ARP requests until hosts are presumed " ++"to be dead" ++msgstr "" ++ ++msgid "" ++"Specifies the maximum amount of seconds after which hosts are presumed to be " ++"dead" ++msgstr "" ++ ++msgid "Specify the secret encryption key here." ++msgstr "Especifiqueu el clau de xifració secret aquí." ++ ++msgid "Start" ++msgstr "Inici" ++ ++msgid "Start priority" ++msgstr "Prioritat d'inici" ++ ++msgid "Startup" ++msgstr "Arranca" ++ ++msgid "Static IPv4 Routes" ++msgstr "Rutes IPv4 estàtiques" ++ ++msgid "Static IPv6 Routes" ++msgstr "Rutes IPv6 estàtiques" ++ ++msgid "Static Leases" ++msgstr "Leases estàtics" ++ ++msgid "Static Routes" ++msgstr "Rutes estàtiques" ++ ++msgid "Static WDS" ++msgstr "WDS estàtic" ++ ++msgid "Static address" ++msgstr "Adreça estàtica" ++ ++msgid "" ++"Static leases are used to assign fixed IP addresses and symbolic hostnames " ++"to DHCP clients. They are also required for non-dynamic interface " ++"configurations where only hosts with a corresponding lease are served." ++msgstr "" ++ ++msgid "Status" ++msgstr "Estat" ++ ++msgid "Stop" ++msgstr "Atura" ++ ++msgid "Strict order" ++msgstr "Ordre estricte" ++ ++msgid "Submit" ++msgstr "Envia" ++ ++msgid "Swap" ++msgstr "" ++ ++msgid "Swap Entry" ++msgstr "Entrada d'intercanvi" ++ ++msgid "Switch" ++msgstr "Commutador" ++ ++msgid "Switch %q" ++msgstr "Commutador %q" ++ ++msgid "Switch %q (%s)" ++msgstr "Commutador %q (%s)" ++ ++msgid "Switch protocol" ++msgstr "Protocol de commutador" ++ ++msgid "Sync with browser" ++msgstr "Sincronitza amb navegador" ++ ++msgid "Synchronizing..." ++msgstr "Sincronitzant..." ++ ++msgid "System" ++msgstr "Sistema" ++ ++msgid "System Log" ++msgstr "Registre de sistema" ++ ++msgid "System Properties" ++msgstr "Propietats de sistema" ++ ++msgid "System log buffer size" ++msgstr "Mida de la memòria intermèdia del registre de sistema" ++ ++msgid "TCP:" ++msgstr "TCP:" ++ ++msgid "TFTP Settings" ++msgstr "Ajusts TFTP" ++ ++msgid "TFTP server root" ++msgstr "Arrel del servidor TFTP" ++ ++msgid "TX" ++msgstr "TX" ++ ++msgid "TX Rate" ++msgstr "Velocitat TX" ++ ++msgid "Table" ++msgstr "Taula" ++ ++msgid "Target" ++msgstr "Destí" ++ ++msgid "Terminate" ++msgstr "Acaba" ++ ++msgid "" ++"The Device Configuration section covers physical settings of the " ++"radio hardware such as channel, transmit power or antenna selection which " ++"are shared among all defined wireless networks (if the radio hardware is " ++"multi-SSID capable). Per network settings like encryption or operation mode " ++"are grouped in the Interface Configuration." ++msgstr "" ++ ++msgid "" ++"The libiwinfo-lua package is not installed. You must install this " ++"component for working wireless configuration!" ++msgstr "" ++"El paquet libiwinfo-lua no està instal·lat. Heu de instal·lar " ++"aquest component per tenir una configuració sense fil funcionant!" ++ ++msgid "" ++"The HE.net endpoint update configuration changed, you must now use the plain " ++"username instead of the user ID!" ++msgstr "" ++ ++msgid "" ++"The IPv6 prefix assigned to the provider, usually ends with ::" ++msgstr "" ++ ++msgid "" ++"The allowed characters are: A-Z, a-z, 0-9 and _" ++msgstr "" ++"Els caràcters permets són: A-Z, a-z, 0-9 i _" ++ ++msgid "The configuration file could not be loaded due to the following error:" ++msgstr "" ++ ++msgid "" ++"The device file of the memory or partition (e.g." ++" /dev/sda1)" ++msgstr "" ++"El fitxer de dispositiu de la memòria o partició (p.e. /dev/sda1)" ++ ++msgid "" ++"The filesystem that was used to format the memory (e.g. ext3)" ++msgstr "" ++"El sistema the fitxers que es va fer servir per formatar la memòria (p.e. ext3)" ++ ++msgid "" ++"The flash image was uploaded. Below is the checksum and file size listed, " ++"compare them with the original file to ensure data integrity.
    Click " ++"\"Proceed\" below to start the flash procedure." ++msgstr "" ++ ++msgid "The following changes have been committed" ++msgstr "S'han comès els següents canvis" ++ ++msgid "The following changes have been reverted" ++msgstr "S'han desfet els següents canvis" ++ ++msgid "The following rules are currently active on this system." ++msgstr "Els següents regles estan actualment actives en aquest sistema." ++ ++msgid "The given network name is not unique" ++msgstr "El nom de xarxa donat no és únic" ++ ++#, fuzzy ++msgid "" ++"The hardware is not multi-SSID capable and the existing configuration will " ++"be replaced if you proceed." ++msgstr "" ++"El maquinari no es capaç de múltiples SSID i la configuració existent es " ++"reemplaçara si procediu." ++ ++msgid "" ++"The length of the IPv4 prefix in bits, the remainder is used in the IPv6 " ++"addresses." ++msgstr "" ++"La longitud del prefix IPv4 en bits, el reste s'utilitza en les adreces IPv6." ++ ++msgid "The length of the IPv6 prefix in bits" ++msgstr "La longitud del prefix IPv6 en bits" ++ ++msgid "" ++"The network ports on this device can be combined to several VLANs in which computers can " ++"communicate directly with each other. VLANs are often used to separate different network " ++"segments. Often there is by default one Uplink port for a connection to the " ++"next greater network like the internet and other ports for a local network." ++msgstr "" ++ ++msgid "The selected protocol needs a device assigned" ++msgstr "El protocol seleccionat necessita un dispositiu assignat" ++ ++msgid "" ++"The system is erasing the configuration partition now and will reboot itself " ++"when finished." ++msgstr "" ++"El sistema està esborrant la partició de configuració i es reiniciarà quan " ++"termini." ++ ++#, fuzzy ++msgid "" ++"The system is flashing now.
    DO NOT POWER OFF THE DEVICE!
    Wait a " ++"few minutes before you try to reconnect. It might be necessary to renew the " ++"address of your computer to reach the device again, depending on your " ++"settings." ++msgstr "" ++"El sistema s'està escrivent ara.
    NO APAGUEU EL DISPOSITIU!
    Espereu " ++"uns minuts abans d'intentar connectar-vos de nou. Pot ser necessari que " ++"renoveu l'adreça del vostre ordinador per a connectar al dispositiu de nou, " ++"depenent dels vostres ajusts." ++ ++msgid "" ++"The tunnel end-point is behind NAT, defaults to disabled and only applies to " ++"AYIYA" ++msgstr "" ++ ++msgid "" ++"The uploaded image file does not contain a supported format. Make sure that " ++"you choose the generic image format for your platform." ++msgstr "" ++"La imatge pujada no conté un format suportat. Assegura't de triar el format " ++"d'imatge genèric per la teva plataforma." ++ ++msgid "There are no active leases." ++msgstr "No hi ha arrendaments actius." ++ ++msgid "There are no pending changes to apply!" ++msgstr "No hi ha canvis pendents per aplicar!" ++ ++msgid "There are no pending changes to revert!" ++msgstr "No hi ha canvis pendents per revertir!" ++ ++msgid "There are no pending changes!" ++msgstr "No hi ha canvis pendents!" ++ ++msgid "" ++"There is no device assigned yet, please attach a network device in the " ++"\"Physical Settings\" tab" ++msgstr "" ++ ++msgid "" ++"There is no password set on this router. Please configure a root password to " ++"protect the web interface and enable SSH." ++msgstr "" ++ ++msgid "This IPv4 address of the relay" ++msgstr "" ++ ++msgid "" ++"This is a list of shell glob patterns for matching files and directories to " ++"include during sysupgrade. Modified files in /etc/config/ and certain other " ++"configurations are automatically preserved." ++msgstr "" ++ ++msgid "" ++"This is either the \"Update Key\" configured for the tunnel or the account " ++"password if no update key has been configured" ++msgstr "" ++ ++msgid "" ++"This is the content of /etc/rc.local. Insert your own commands here (in " ++"front of 'exit 0') to execute them at the end of the boot process." ++msgstr "" ++ ++msgid "" ++"This is the local endpoint address assigned by the tunnel broker, it usually " ++"ends with :2" ++msgstr "" ++ ++msgid "" ++"This is the only DHCP in the local network" ++msgstr "" ++"Aquest és l'únic DHCP a la teva xarxa local" ++ ++msgid "This is the plain username for logging into the account" ++msgstr "" ++ ++msgid "" ++"This is the prefix routed to you by the tunnel broker for use by clients" ++msgstr "" ++ ++msgid "This is the system crontab in which scheduled tasks can be defined." ++msgstr "" ++"Aquest és el crontab del sistema en el qual es poden definir tasques " ++"programades." ++ ++msgid "" ++"This is usually the address of the nearest PoP operated by the tunnel broker" ++msgstr "" ++ ++msgid "" ++"This list gives an overview over currently running system processes and " ++"their status." ++msgstr "" ++"Aquesta llista mostra una vista general sobre els processos corrent al " ++"sistema actualment i el seu estat." ++ ++msgid "This page allows the configuration of custom button actions" ++msgstr "" ++ ++msgid "This page gives an overview over currently active network connections." ++msgstr "" ++"Aquesta pàgina ofereix una vista general de les connexions de xarxa actives " ++"actualment." ++ ++msgid "This section contains no values yet" ++msgstr "Aquesta secció no conté cap valor encara" ++ ++msgid "Time Synchronization" ++msgstr "Sincronització de hora" ++ ++msgid "Time Synchronization is not configured yet." ++msgstr "La sincronització de hora encara no s'ha configurat." ++ ++msgid "Timezone" ++msgstr "Zona horària" ++ ++msgid "" ++"To restore configuration files, you can upload a previously generated backup " ++"archive here." ++msgstr "" ++ ++msgid "Total Available" ++msgstr "Total disponible" ++ ++msgid "Traceroute" ++msgstr "Rastre de ruta" ++ ++msgid "Traffic" ++msgstr "Tràfic" ++ ++msgid "Transfer" ++msgstr "Transferència" ++ ++msgid "Transmission Rate" ++msgstr "Taxa de transmissió" ++ ++msgid "Transmit" ++msgstr "Transmet" ++ ++msgid "Transmit Power" ++msgstr "Potència de transmissió" ++ ++msgid "Transmitter Antenna" ++msgstr "Antena transmissora" ++ ++msgid "Trigger" ++msgstr "" ++ ++msgid "Trigger Mode" ++msgstr "" ++ ++msgid "Tunnel ID" ++msgstr "ID del túnel" ++ ++msgid "Tunnel Interface" ++msgstr "Interfície del túnel" ++ ++msgid "Tunnel Link" ++msgstr "" ++ ++msgid "Tunnel broker protocol" ++msgstr "" ++ ++msgid "Tunnel setup server" ++msgstr "" ++ ++msgid "Tunnel type" ++msgstr "" ++ ++msgid "Turbo Mode" ++msgstr "Mode Turbo" ++ ++msgid "Tx-Power" ++msgstr "Potència Tx" ++ ++msgid "Type" ++msgstr "Tipus" ++ ++msgid "UDP:" ++msgstr "UDP:" ++ ++msgid "UMTS only" ++msgstr "Només UMTS" ++ ++msgid "UMTS/GPRS/EV-DO" ++msgstr "UMTS/GPRS/EV-DO" ++ ++msgid "USB Device" ++msgstr "Dispositiu USB" ++ ++msgid "UUID" ++msgstr "UUID" ++ ++msgid "Unable to dispatch" ++msgstr "" ++ ++msgid "Unknown" ++msgstr "Desconegut" ++ ++msgid "Unknown Error, password not changed!" ++msgstr "La contrasenya no s'ha canviat a causa d'un error desconegut!" ++ ++msgid "Unmanaged" ++msgstr "Sense gestionar" ++ ++msgid "Unsaved Changes" ++msgstr "Canvis sense desar" ++ ++msgid "Unsupported protocol type." ++msgstr "Tipus de protocol no suportat." ++ ++msgid "Update lists" ++msgstr "Actualitza les llistes" ++ ++msgid "" ++"Upload a sysupgrade-compatible image here to replace the running firmware. " ++"Check \"Keep settings\" to retain the current configuration (requires an " ++"OpenWrt compatible firmware image)." ++msgstr "" ++ ++msgid "Upload archive..." ++msgstr "Puja un arxiu..." ++ ++msgid "Uploaded File" ++msgstr "Fitxer pujat" ++ ++msgid "Uptime" ++msgstr "Temps d'alta" ++ ++msgid "Use /etc/ethers" ++msgstr "Fes servir /etc/ethers" ++ ++msgid "Use DHCP gateway" ++msgstr "" ++ ++msgid "Use DNS servers advertised by peer" ++msgstr "" ++ ++msgid "Use ISO/IEC 3166 alpha2 country codes." ++msgstr "" ++ ++msgid "Use MTU on tunnel interface" ++msgstr "" ++ ++msgid "Use TTL on tunnel interface" ++msgstr "" ++ ++msgid "Use as external overlay (/overlay)" ++msgstr "" ++ ++msgid "Use as root filesystem (/)" ++msgstr "" ++ ++msgid "Use broadcast flag" ++msgstr "Utilitza la bandera de difusió" ++ ++msgid "Use builtin IPv6-management" ++msgstr "" ++ ++msgid "Use custom DNS servers" ++msgstr "" ++ ++msgid "Use default gateway" ++msgstr "" ++ ++msgid "Use gateway metric" ++msgstr "" ++ ++msgid "Use routing table" ++msgstr "" ++ ++msgid "" ++"Use the Add Button to add a new lease entry. The MAC-Address indentifies the host, the IPv4-Address specifies to the fixed " ++"address to use and the Hostname is assigned as symbolic name to the " ++"requesting host." ++msgstr "" ++ ++msgid "Used" ++msgstr "Usat" ++ ++msgid "Used Key Slot" ++msgstr "" ++ ++msgid "User certificate (PEM encoded)" ++msgstr "" ++ ++msgid "User key (PEM encoded)" ++msgstr "" ++ ++msgid "Username" ++msgstr "Nom d'usuari" ++ ++msgid "VC-Mux" ++msgstr "VC-Mux" ++ ++msgid "VLAN Interface" ++msgstr "Interfície VLAN" ++ ++msgid "VLANs on %q" ++msgstr "VLANs en %q" ++ ++msgid "VLANs on %q (%s)" ++msgstr "VLANs en %q (%s)" ++ ++msgid "VPN Server" ++msgstr "Servidor VPN" ++ ++msgid "VPN Server port" ++msgstr "" ++ ++msgid "VPN Server's certificate SHA1 hash" ++msgstr "" ++ ++msgid "Vendor Class to send when requesting DHCP" ++msgstr "Classe de venidor per enviar al sol·licitar DHCP" ++ ++msgid "Verbose" ++msgstr "" ++ ++msgid "Verbose logging by aiccu daemon" ++msgstr "" ++ ++msgid "Verify" ++msgstr "Verifica" ++ ++msgid "Version" ++msgstr "Versió" ++ ++msgid "WDS" ++msgstr "WDS" ++ ++msgid "WEP Open System" ++msgstr "Sistema obert WEP" ++ ++msgid "WEP Shared Key" ++msgstr "Clau compartit WEP" ++ ++msgid "WEP passphrase" ++msgstr "Contrasenya WEP" ++ ++msgid "WMM Mode" ++msgstr "Mode WMM" ++ ++msgid "WPA passphrase" ++msgstr "Contrasenya WPA" ++ ++msgid "" ++"WPA-Encryption requires wpa_supplicant (for client mode) or hostapd (for AP " ++"and ad-hoc mode) to be installed." ++msgstr "" ++"La xifratge WPA requereix que sigui instal·lat el wpa_supplicant (pel mode " ++"client) o el hostapd (pels modes AP i ad hoc)." ++ ++msgid "" ++"Wait for NTP sync that many seconds, seting to 0 disables waiting (optional)" ++msgstr "" ++ ++msgid "Waiting for changes to be applied..." ++msgstr "Esperant que s'apliquin els canvis..." ++ ++msgid "Waiting for command to complete..." ++msgstr "Esperant que s'acabi l'ordre..." ++ ++msgid "Warning" ++msgstr "Advertència" ++ ++msgid "Warning: There are unsaved changes that will be lost while rebooting!" ++msgstr "" ++"Advertència: Hi ha canvis que no s'han desat i que es perdran mentre " ++"s'arranca de nou!" ++ ++msgid "Whether to create an IPv6 default route over the tunnel" ++msgstr "" ++ ++msgid "Whether to route only packets from delegated prefixes" ++msgstr "" ++ ++msgid "Width" ++msgstr "" ++ ++msgid "Wifi" ++msgstr "Wifi" ++ ++msgid "Wireless" ++msgstr "Sense fils" ++ ++msgid "Wireless Adapter" ++msgstr "Adaptador sense fils" ++ ++msgid "Wireless Network" ++msgstr "Xarxa sense fils" ++ ++msgid "Wireless Overview" ++msgstr "Resum sense fils" ++ ++msgid "Wireless Security" ++msgstr "Seguretat sense fils" ++ ++msgid "Wireless is disabled or not associated" ++msgstr "El sense fil està inhabilitat o sense associar" ++ ++msgid "Wireless is restarting..." ++msgstr "Sense fils està reiniciant..." ++ ++msgid "Wireless network is disabled" ++msgstr "La xarxa sense fil està inhabilitada" ++ ++msgid "Wireless network is enabled" ++msgstr "La xarxa sense fils està habilitada" ++ ++msgid "Wireless restarted" ++msgstr "Sense fils reinciat" ++ ++msgid "Wireless shut down" ++msgstr "Sense fils aturat" ++ ++msgid "Write received DNS requests to syslog" ++msgstr "Escriure les peticions DNS rebudes al syslog" ++ ++msgid "XR Support" ++msgstr "Suport XR" ++ ++msgid "" ++"You can enable or disable installed init scripts here. Changes will applied " ++"after a device reboot.
    Warning: If you disable essential init " ++"scripts like \"network\", your device might become inaccessible!" ++msgstr "" ++"Pots activar o desactivar els scripts d'inici instal·lats ací. Els canvis " ++"s'aplicaran després d'arrancar de nou el dispositiu.
    Atenció: " ++"Si desactives scripts d'inici necessaris com el \"network\", el teu " ++"dispositiu pot resultar inaccessible!" ++ ++msgid "" ++"You must enable Java Script in your browser or LuCI will not work properly." ++msgstr "" ++"Has d'activar el Java Script al teu navegador o LuCI no funcionarà " ++"correctament." ++ ++msgid "" ++"Your Internet Explorer is too old to display this page correctly. Please " ++"upgrade it to at least version 7 or use another browser like Firefox, Opera " ++"or Safari." ++msgstr "" ++ ++msgid "any" ++msgstr "qualsevol" ++ ++msgid "auto" ++msgstr "auto" ++ ++#, fuzzy ++msgid "automatic" ++msgstr "estàtic" ++ ++msgid "baseT" ++msgstr "" ++ ++msgid "bridged" ++msgstr "pontejat" ++ ++msgid "create:" ++msgstr "crea:" ++ ++msgid "creates a bridge over specified interface(s)" ++msgstr "crea un pont entre les interfícies especificades" ++ ++msgid "dB" ++msgstr "dB" ++ ++msgid "dBm" ++msgstr "dBm" ++ ++msgid "disable" ++msgstr "inhabilita" ++ ++msgid "disabled" ++msgstr "" ++ ++msgid "expired" ++msgstr "caducat" ++ ++msgid "" ++"file where given DHCP-leases will be stored" ++msgstr "" ++"fitxer on els leases de DHCP s'emmagatzemaran" ++ ++msgid "forward" ++msgstr "transemès" ++ ++msgid "full-duplex" ++msgstr "" ++ ++msgid "half-duplex" ++msgstr "" ++ ++msgid "help" ++msgstr "ajuda" ++ ++msgid "hidden" ++msgstr "amagat" ++ ++msgid "hybrid mode" ++msgstr "" ++ ++msgid "if target is a network" ++msgstr "si el destí és una xarxa" ++ ++msgid "input" ++msgstr "entrada" ++ ++msgid "kB" ++msgstr "kB" ++ ++msgid "kB/s" ++msgstr "kB/s" ++ ++msgid "kbit/s" ++msgstr "kbit/s" ++ ++msgid "local DNS file" ++msgstr "fitxer DNS local" ++ ++msgid "minimum 1280, maximum 1480" ++msgstr "" ++ ++msgid "navigation Navigation" ++msgstr "" ++ ++msgid "no" ++msgstr "no" ++ ++msgid "no link" ++msgstr "cap enllaç" ++ ++msgid "none" ++msgstr "cap" ++ ++msgid "not present" ++msgstr "" ++ ++msgid "off" ++msgstr "parat" ++ ++msgid "on" ++msgstr "engegat" ++ ++msgid "open" ++msgstr "obert" ++ ++msgid "overlay" ++msgstr "" ++ ++msgid "relay mode" ++msgstr "" ++ ++msgid "routed" ++msgstr "encaminat" ++ ++msgid "server mode" ++msgstr "" ++ ++msgid "skiplink1 Skip to navigation" ++msgstr "" ++ ++msgid "skiplink2 Skip to content" ++msgstr "" ++ ++msgid "stateful-only" ++msgstr "" ++ ++msgid "stateless" ++msgstr "" ++ ++msgid "stateless + stateful" ++msgstr "" ++ ++msgid "tagged" ++msgstr "etiquetat" ++ ++msgid "unknown" ++msgstr "desconegut" ++ ++msgid "unlimited" ++msgstr "il·limitat" ++ ++msgid "unspecified" ++msgstr "sense espeficicar" ++ ++msgid "unspecified -or- create:" ++msgstr "sense espeficicar -o- crear:" ++ ++msgid "untagged" ++msgstr "sense etiquetar" ++ ++msgid "yes" ++msgstr "sí" ++ ++msgid "« Back" ++msgstr "« Enrere" ++ ++#~ msgid "" ++#~ "Always use 40MHz channels even if the secondary channel overlaps. Using " ++#~ "this option does not comply with IEEE 802.11n-2009!" ++#~ msgstr "" ++#~ "Utilitza sempre canals de 40 MHz fins i tot si el canal secundari se " ++#~ "solapa. L'ús d'aquesta opció no compleix amb l'IEEE 802.11n-2009." ++ ++#~ msgid "Cached" ++#~ msgstr "En memòria cau" ++ ++#~ msgid "Force 40MHz mode" ++#~ msgstr "Força el mode 40MHz" ++ ++#~ msgid "Frequency Hopping" ++#~ msgstr "Salts de freqüència" ++ ++#~ msgid "HE.net user ID" ++#~ msgstr "ID d'usuari de HE.net" ++ ++#~ msgid "This is the 32 byte hex encoded user ID, not the login name" ++#~ msgstr "" ++#~ "Això és la ID d'usuari de 32 bytes codificat en hex, no el nom d'inici" ++ ++#~ msgid "40MHz 2nd channel above" ++#~ msgstr "40MHz, 2n canal per sobre" ++ ++#~ msgid "40MHz 2nd channel below" ++#~ msgstr "40MHz, 2n canal per sota" ++ ++#~ msgid "Accept router advertisements" ++#~ msgstr "Accepta les publicitats d'encaminador" ++ ++#~ msgid "Advertise IPv6 on network" ++#~ msgstr "Anuncia IPv6 a la xarxa" ++ ++#~ msgid "Advertised network ID" ++#~ msgstr "ID de xarxa anunciat" ++ ++#~ msgid "Allowed range is 1 to 65535" ++#~ msgstr "El rang permès és entre 1 i 65535" ++ ++#~ msgid "HT capabilities" ++#~ msgstr "Capacitats HT" ++ ++#~ msgid "HT mode" ++#~ msgstr "Mode HT" ++ ++#~ msgid "Router Model" ++#~ msgstr "Model de l'encaminador" ++ ++#~ msgid "Router Name" ++#~ msgstr "Nom de l'encaminador" ++ ++#~ msgid "Waiting for router..." ++#~ msgstr "Esperant un encaminador..." ++ ++#~ msgid "Active Leases" ++#~ msgstr "Leases Actius" ++ ++#~ msgid "MAC" ++#~ msgstr "MAC" ++ ++#~ msgid "Encr." ++#~ msgstr "Encr." ++ ++#~ msgid "WLAN-Scan" ++#~ msgstr "" ++#~ "Escaneig WLAN" ++ ++#~ msgid "Create Network" ++#~ msgstr "Crea Xarxa" ++ ++#~ msgid "Networks" ++#~ msgstr "Xarxes" ++ ++#~ msgid "Power" ++#~ msgstr "Potència" ++ ++#~ msgid "Wifi networks in your local environment" ++#~ msgstr "Xarxes sense fils del teu entorn local" ++ ++#~ msgid "" ++#~ "CIDR-Notation: " ++#~ "address/prefix" ++#~ msgstr "" ++#~ "Notació CIDR: " ++#~ "adreça/prefix" ++ ++#~ msgid "DNS-Server" ++#~ msgstr "Servidor DNS" ++ ++#~ msgid "IPv4-Broadcast" ++#~ msgstr "Broadcast IPv4" ++ ++#~ msgid "IPv6-Address" ++#~ msgstr "Adreça IPv6" ++ ++#~ msgid "" ++#~ "The network ports on your router can be combined to several VLANs in which computers can " ++#~ "communicate directly with each other. VLANs are often used to separate different network " ++#~ "segments. Often there is by default one Uplink port for a connection to " ++#~ "the next greater network like the internet and other ports for a local " ++#~ "network." ++#~ msgstr "" ++#~ "Els ports de xarxa del teu router es poden combinar amb diverses VLANs en les que els " ++#~ "ordinador es poden comunicar directament entre ells. Les VLANs es fan servir normalment per " ++#~ "separar segments de xarxa diferents. Normalment, hi ha un port de Pujada " ++#~ "per defecte per la següent xarxa major, com Internet, i altres ports per " ++#~ "una xarxa local." ++ ++#~ msgid "Files to be kept when flashing a new firmware" ++#~ msgstr "Fitxers a guardar quan s'actualitzi un nou firmware" ++ ++#~ msgid "General" ++#~ msgstr "General" ++ ++#~ msgid "" ++#~ "Here you can customize the settings and the functionality of LuCI." ++#~ msgstr "" ++#~ "Aquí pots personalitzar la configuració i funcionalitats de LuCI" ++ ++#~ msgid "Post-commit actions" ++#~ msgstr "Accions Post-commit" ++ ++#~ msgid "" ++#~ "These commands will be executed automatically when a given UCI configuration is committed " ++#~ "allowing changes to be applied instantly." ++#~ msgstr "" ++#~ "Aquestes comandes s'executaran automàticament quan es publiqui una " ++#~ "configuració UCI determinada, permetent que els canvis s'apliquin a l'" ++#~ "instant." ++ ++#~ msgid "Web UI" ++#~ msgstr "Web UI" ++ ++#~ msgid "PPTP-Server" ++#~ msgstr "" ++#~ "Servidor PPTP" ++ ++#~ msgid "Access point (APN)" ++#~ msgstr "Punt d'accés (APN)" ++ ++#~ msgid "Additional pppd options" ++#~ msgstr "Opcions pppd addicionals" ++ ++#~ msgid "Automatic Disconnect" ++#~ msgstr "Desconnexió Automàtica" ++ ++#~ msgid "Backup Archive" ++#~ msgstr "Arxiu de seguretat" ++ ++#~ msgid "" ++#~ "Configure the local DNS server to use the name servers adverticed by the " ++#~ "PPP peer" ++#~ msgstr "" ++#~ "Configura el servidor DNS local per fer servir els servidors anunciats " ++#~ "pel peer PPP" ++ ++#~ msgid "Connect script" ++#~ msgstr "Script de connexió" ++ ++#~ msgid "Create backup" ++#~ msgstr "Crea còpia de seguretat" ++ ++#~ msgid "Disconnect script" ++#~ msgstr "Script de desconnexió" ++ ++#~ msgid "Edit package lists and installation targets" ++#~ msgstr "Edita llistes de paquets i destins d'instal·lació" ++ ++#~ msgid "Enable IPv6 on PPP link" ++#~ msgstr "Habilita IPv6 a l'enllaç PPP" ++ ++#~ msgid "Firmware image" ++#~ msgstr "Imatge de firmware" ++ ++#~ msgid "" ++#~ "Here you can backup and restore your router configuration and - if " ++#~ "possible - reset the router to the default settings." ++#~ msgstr "" ++#~ "Ací pots crear una còpia de seguretat i restaurar la teva configuració " ++#~ "del router i - si és possible - reiniciar el router als paràmetres per " ++#~ "defecte." ++ ++#~ msgid "Installation targets" ++#~ msgstr "Objectius d'instal·lació" ++ ++#~ msgid "Keep configuration files" ++#~ msgstr "Mantingues els fitxers de configuració" ++ ++#~ msgid "Keep-Alive" ++#~ msgstr "Keep-Alive" ++ ++#~ msgid "" ++#~ "Let pppd replace the current default route to use the PPP interface after " ++#~ "successful connect" ++#~ msgstr "" ++#~ "Permet que el pppd reemplaci la ruta per defecte actual per fer servir " ++#~ "les interfícies PPP després de connectar-se amb èxit" ++ ++#~ msgid "Let pppd run this script after establishing the PPP link" ++#~ msgstr "" ++#~ "Permet que el pppd executi aquest script abans d'establir l'enllaç PPP" ++ ++#~ msgid "Let pppd run this script before tearing down the PPP link" ++#~ msgstr "" ++#~ "Permet que el pppd executi aquest script abans de desconnectar l'enllaç " ++#~ "PPP" ++ ++#~ msgid "" ++#~ "Make sure that you provide the correct pin code here or you might lock " ++#~ "your sim card!" ++#~ msgstr "" ++#~ "Assegura't d'introduir el codi pin correcte o pots bloquejar la teva " ++#~ "targeta SIM!" ++ ++#~ msgid "" ++#~ "Most of them are network servers, that offer a certain service for your " ++#~ "device or network like shell access, serving webpages like LuCI, doing mesh routing, sending " ++#~ "e-mails, ..." ++#~ msgstr "" ++#~ "La majoria d'ells són servidors de xarxa, que ofereixen un cert servei " ++#~ "pel teu dispositiu o xarxa, com l'accés a consola, servir pàgines web com " ++#~ "el LuCI, fer " ++#~ "enrutament mesh, enviar e-mails, ..." ++ ++#~ msgid "Number of failed connection tests to initiate automatic reconnect" ++#~ msgstr "" ++#~ "Número de connexions de test fallades per iniciar reconnexió automàtica" ++ ++#~ msgid "PIN code" ++#~ msgstr "Codi PIN" ++ ++#~ msgid "Package lists" ++#~ msgstr "Llistes de paquets" ++ ++#~ msgid "Proceed reverting all settings and resetting to firmware defaults?" ++#~ msgstr "" ++#~ "Continua desfent tots els paràmetres i reiniciant els valors per defecte " ++#~ "del firmware?" ++ ++#~ msgid "Processor" ++#~ msgstr "Processador" ++ ++#~ msgid "Radius-Port" ++#~ msgstr "Port Radius" ++ ++#, fuzzy ++#~ msgid "Radius-Server" ++#~ msgstr "Servidor Radius" ++ ++#~ msgid "Replace default route" ++#~ msgstr "Reemplaça la ruta per defecte" ++ ++#~ msgid "Reset router to defaults" ++#~ msgstr "Reinicia els valors per defecte del router" ++ ++#~ msgid "" ++#~ "Seconds to wait for the modem to become ready before attempting to connect" ++#~ msgstr "" ++#~ "Segons a esperar per tal que el modem estigui apunt abans de provar de " ++#~ "connectar-se" ++ ++#~ msgid "Service type" ++#~ msgstr "Tipus de servei" ++ ++#~ msgid "Services and daemons perform certain tasks on your device." ++#~ msgstr "Els serveis i dimonis realitzen certes tasques al teu dispositiu." ++ ++#~ msgid "Settings" ++#~ msgstr "Configuració" ++ ++#~ msgid "Setup wait time" ++#~ msgstr "Temps d'espera de configuració" ++ ++#~ msgid "" ++#~ "Sorry. OpenWrt does not support a system upgrade on this platform.
    " ++#~ "You need to manually flash your device." ++#~ msgstr "" ++#~ "Ho sento, l'OpenWRT no suporta una actualització del sistema en aquesdta " ++#~ "plataforma.
    Has actualitzar manualment el teu dispositiu." ++ ++#~ msgid "Specify additional command line arguments for pppd here" ++#~ msgstr "Especifica arguments de línia de comanda addicionals pel pppd" ++ ++#~ msgid "The device node of your modem, e.g. /dev/ttyUSB0" ++#~ msgstr "El node de dispositiu del teu modem, p.e. /dev/ttyUSB0" ++ ++#~ msgid "Time (in seconds) after which an unused connection will be closed" ++#~ msgstr "" ++#~ "Temps (en segons) després del qual les connexions sense fer servir es " ++#~ "tancaran" ++ ++#~ msgid "Update package lists" ++#~ msgstr "Actualitza llistes de paquets" ++ ++#~ msgid "Upload an OpenWrt image file to reflash the device." ++#~ msgstr "" ++#~ "Penja una imatge d'OpenWRT per actualitzar el firmware del dispositiu." ++ ++#~ msgid "Upload image" ++#~ msgstr "Penja imatge" ++ ++#~ msgid "Use peer DNS" ++#~ msgstr "Fes servir peer DNS" ++ ++#~ msgid "" ++#~ "You need to install \"comgt\" for UMTS/GPRS, \"ppp-mod-pppoe\" for PPPoE, " ++#~ "\"ppp-mod-pppoa\" for PPPoA or \"pptp\" for PPtP support" ++#~ msgstr "" ++#~ "Necessites instal·lar \"comgt\" per suport UMTS/GPRS, \"ppp-mod-pppoe\" " ++#~ "per suport PPPoE, \"ppp-mod-pppoa\" per suport PPPoA o \"pptp\" per " ++#~ "suport PPtP" ++ ++#~ msgid "back" ++#~ msgstr "enrere" ++ ++#~ msgid "buffered" ++#~ msgstr "emmagatzemat en memòria intermèdia" ++ ++#~ msgid "cached" ++#~ msgstr "emmagatzemat en memòria cau" ++ ++#~ msgid "free" ++#~ msgstr "lliure" ++ ++#~ msgid "static" ++#~ msgstr "estàtic" ++ ++#~ msgid "" ++#~ "LuCI is a collection " ++#~ "of free Lua software including an MVC-Webframework and webinterface for embedded devices. LuCI is licensed under the " ++#~ "Apache-License." ++#~ msgstr "" ++#~ "LuCI és una " ++#~ "col·lecció de programari lliure Lua, incloent un framework web MVC i una interfície web per " ++#~ "dispositius empotrats. LuCI està llicenciada sota la Apache-License." ++ ++#~ msgid "SSH-Keys" ++#~ msgstr "Claus SSH" ++ ++#~ msgid "" ++#~ "A lightweight HTTP/1.1 webserver written in C and Lua designed to serve " ++#~ "LuCI" ++#~ msgstr "" ++#~ "Un servidor web HTTP/1.1 lleuger escrit en C i LUA dissenyat per servir " ++#~ "LuCI" ++ ++#~ msgid "" ++#~ "A small webserver which can be used to serve LuCI." ++#~ msgstr "" ++#~ "Un servidor web petit, que es pot fer servir per servir el LuCI." ++ ++#~ msgid "About" ++#~ msgstr "Sobre" ++ ++#~ msgid "Addresses" ++#~ msgstr "Addreces" ++ ++#~ msgid "Admin Password" ++#~ msgstr "Contrasenya d'administrador" ++ ++#~ msgid "Alias" ++#~ msgstr "Àlies" ++ ++#~ msgid "Authentication Realm" ++#~ msgstr "Reialme d'Autenticació" ++ ++#~ msgid "Bridge Port" ++#~ msgstr "Port de pont" ++ ++#~ msgid "" ++#~ "Change the password of the system administrator (User root)" ++#~ msgstr "" ++#~ "Canvia la contrasenya de l'administrador del sistema (Usuari root)" ++ ++#~ msgid "Client + WDS" ++#~ msgstr "Client + WDS" ++ ++#~ msgid "Configuration file" ++#~ msgstr "Fitxer de configuració" ++ ++#~ msgid "Connection timeout" ++#~ msgstr "Temps d'espera de la connexió excedit" ++ ++#~ msgid "Contributing Developers" ++#~ msgstr "Desenvolupadors Contribuïdors" ++ ++#~ msgid "DHCP assigned" ++#~ msgstr "DHCP assignat" ++ ++#~ msgid "Document root" ++#~ msgstr "Arrel del document" ++ ++#~ msgid "Enable Keep-Alive" ++#~ msgstr "Activa el Keep-Alive" ++ ++#~ msgid "Ethernet Bridge" ++#~ msgstr "Pont Ethernet" ++ ++#~ msgid "" ++#~ "Here you can paste public SSH-Keys " ++#~ "(one per line) for SSH public-key " ++#~ "authentication." ++#~ msgstr "" ++#~ "Ací pots enganxar les claus públiques SSH (una per línia) per l'autenticació SSH per clau pública." ++ ++#~ msgid "ID" ++#~ msgstr "ID" ++ ++#~ msgid "IP Configuration" ++#~ msgstr "Configuració IP" ++ ++#~ msgid "Interface Status" ++#~ msgstr "Estat d'Interfície" ++ ++#~ msgid "Lead Development" ++#~ msgstr "Desenvolupadors principals" ++ ++#~ msgid "Master" ++#~ msgstr "Master" ++ ++#~ msgid "Master + WDS" ++#~ msgstr "Master + WDS" ++ ++#~ msgid "Not configured" ++#~ msgstr "No configurat" ++ ++#~ msgid "Password successfully changed" ++#~ msgstr "Contrasenya canviada amb èxit" ++ ++#~ msgid "Plugin path" ++#~ msgstr "Directori de connectors" ++ ++#~ msgid "Ports" ++#~ msgstr "Ports" ++ ++#~ msgid "Primary" ++#~ msgstr "Primari" ++ ++#~ msgid "Project Homepage" ++#~ msgstr "Pàgina d'inici del projecte" ++ ++#~ msgid "Pseudo Ad-Hoc" ++#~ msgstr "Pseudo Ad-Hoc" ++ ++#~ msgid "STP" ++#~ msgstr "STP" ++ ++#~ msgid "Thanks To" ++#~ msgstr "Gràcies a" ++ ++#~ msgid "" ++#~ "The realm which will be displayed at the authentication prompt for " ++#~ "protected pages." ++#~ msgstr "" ++#~ "El reialme que es mostrarà a la sol·licitiu d'autenticació per pàgines " ++#~ "protegides." ++ ++#~ msgid "Unknown Error" ++#~ msgstr "Error desconegut" ++ ++#~ msgid "VLAN" ++#~ msgstr "VLAN" ++ ++#~ msgid "defaults to /etc/httpd.conf" ++#~ msgstr "per defecte a /etc/httpd.conf" ++ ++#~ msgid "Package lists updated" ++#~ msgstr "Llistes de paquets actualitzades" ++ ++#~ msgid "Upgrade installed packages" ++#~ msgstr "Actualitza paquets instal·lats" ++ ++#~ msgid "" ++#~ "Also kernel or service logfiles can be viewed here to get an overview " ++#~ "over their current state." ++#~ msgstr "" ++#~ "Ací també es poden veure els registres del kernel o dels serveis, per " ++#~ "tenir una vista general del seu estat actual.'iwscan = 'Escaneig WLAN" ++ ++#~ msgid "" ++#~ "Here you can find information about the current system status like CPU clock frequency, memory " ++#~ "usage or network interface data." ++#~ msgstr "" ++#~ "Ací pots trobar informació sobre l'estat actual del sistema, com la " ++#~ "freqüència de rellotge de la CPU, l'ús de memòria o les dades d'interfície de xarxa." ++ ++#~ msgid "Search file..." ++#~ msgstr "Cerca fitxer..." ++ ++#~ msgid "" ++#~ "LuCI is a free, " ++#~ "flexible, and user friendly graphical interface for configuring OpenWrt " ++#~ "Kamikaze." ++#~ msgstr "" ++#~ "LuCI és una " ++#~ "interfície gràfica amigable, lliure i flexible per configurar l'" ++#~ "OpenWRT Kamikaze." ++ ++#~ msgid "And now have fun with your router!" ++#~ msgstr "I ara diverteix-te amb el teu router!" ++ ++#~ msgid "" ++#~ "As we always want to improve this interface we are looking forward to " ++#~ "your feedback and suggestions." ++#~ msgstr "" ++#~ "Com que volem millorar aquesta interfície sempre, volem la teva opinió i " ++#~ "els teus suggeriments." ++ ++#~ msgid "Hello!" ++#~ msgstr "Hola!" ++ ++#~ msgid "" ++#~ "Notice: In LuCI " ++#~ "changes have to be confirmed by clicking Changes - Save & Apply " ++#~ "before being applied." ++#~ msgstr "" ++#~ "Alerta: A LuCI els " ++#~ "canvis s'han de confirmar clicant \"Canvis --> Desa & Aplica\" " ++#~ "abans que s'apliquin." ++ ++#~ msgid "" ++#~ "On the following pages you can adjust all important settings of your " ++#~ "router." ++#~ msgstr "" ++#~ "A les pàgines següents podràs ajustar tots els paràmetres importants del " ++#~ "teu router." ++ ++#~ msgid "The LuCI Team" ++#~ msgstr "" ++#~ "L'equip de LuCI" ++ ++#~ msgid "" ++#~ "This is the administration area of LuCI." ++#~ msgstr "" ++#~ "Aquesta és l'àrea d'administració de LuCI." ++ ++#~ msgid "User Interface" ++#~ msgstr "Interfície d'usuari" ++ ++#~ msgid "enable" ++#~ msgstr "habilita" ++ ++#, fuzzy ++#~ msgid "(optional)" ++#~ msgstr "(opcional)" ++ ++#~ msgid "DNS-Port" ++#~ msgstr "Port DNS" ++ ++#~ msgid "" ++#~ "DNS-Server will be queried in " ++#~ "the order of the resolvfile" ++#~ msgstr "" ++#~ "Es consultarà el servidor DNS " ++#~ "en l'ordre del fitxer de Resolució" ++ ++#~ msgid "" ++#~ "max. DHCP-Leases" ++#~ msgstr "" ++#~ "max. leases DHCP" ++ ++#~ msgid "" ++#~ "max. EDNS0 packet size" ++#~ msgstr "" ++#~ "max. mida de paquet EDNS0" ++ ++#~ msgid "AP-Isolation" ++#~ msgstr "Aïllament d'AP" ++ ++#~ msgid "Add the Wifi network to physical network" ++#~ msgstr "Afegeix la xarxa sense fils a la xarxa física" ++ ++#~ msgid "Aliases" ++#~ msgstr "Aliases" ++ ++#~ msgid "Clamp Segment Size" ++#~ msgstr "Mida de segment Clamp" ++ ++#, fuzzy ++#~ msgid "Create Or Attach Network" ++#~ msgstr "Crea Xarxa" ++ ++#~ msgid "Devices" ++#~ msgstr "Dispositius" ++ ++#~ msgid "Don't forward reverse lookups for local networks" ++#~ msgstr "No reenviïs les cerques inverses per la xarxa local" ++ ++#~ msgid "Enable TFTP-Server" ++#~ msgstr "Habilita el Servidor TFTP" ++ ++#~ msgid "Errors" ++#~ msgstr "Errors" ++ ++#~ msgid "Essentials" ++#~ msgstr "Essencials" ++ ++#~ msgid "Expand Hosts" ++#~ msgstr "Expandeix els Noms de Domini" ++ ++#~ msgid "First leased address" ++#~ msgstr "Primera adreça de lease" ++ ++#~ msgid "" ++#~ "Fixes problems with unreachable websites, submitting forms or other " ++#~ "unexpected behaviour for some ISPs." ++#~ msgstr "" ++#~ "Resol problemes amb llocs web inassolibles, enviant formularis o altres " ++#~ "comportaments inesperats d'alguns ISPs." ++ ++#~ msgid "Hardware Address" ++#~ msgstr "Adreça MAC" ++ ++#~ msgid "Here you can configure installed wifi devices." ++#~ msgstr "Ací pots configurar els dispositius sense fils instal·lats." ++ ++#~ msgid "Ignore /etc/hosts" ++#~ msgstr "Ignora /etc/hosts" ++ ++#~ msgid "Independent (Ad-Hoc)" ++#~ msgstr "Independent (Ad-Hoc)" ++ ++#~ msgid "Internet Connection" ++#~ msgstr "Connexió a Internet" ++ ++#~ msgid "Join (Client)" ++#~ msgstr "Uneix-te (Client)" ++ ++#~ msgid "Leases" ++#~ msgstr "Leases" ++ ++#~ msgid "Local Domain" ++#~ msgstr "Domini Local" ++ ++#~ msgid "Local Network" ++#~ msgstr "Xarxa Local" ++ ++#~ msgid "Local Server" ++#~ msgstr "Servidor Local" ++ ++#~ msgid "Network Boot Image" ++#~ msgstr "Imatge de Càrrega de Xarxa" ++ ++#~ msgid "" ++#~ "Network Name (ESSID)" ++#~ msgstr "" ++#~ "Nom de Xarxa (ESSID)" ++ ++#~ msgid "Number of leased addresses" ++#~ msgstr "Número d'adreces de lease" ++ ++#~ msgid "Perform Actions" ++#~ msgstr "Realitza accions" ++ ++#~ msgid "Prevents Client to Client communication" ++#~ msgstr "Evita la comunicació Client a Client" ++ ++#~ msgid "Provide (Access Point)" ++#~ msgstr "Proveeix (Punt d'Accés)" ++ ++#~ msgid "Resolvfile" ++#~ msgstr "Fitxer de Resolució" ++ ++#~ msgid "TFTP-Server Root" ++#~ msgstr "Arrel del Servidor TFTP" ++ ++#~ msgid "TX / RX" ++#~ msgstr "TX / RX" ++ ++#~ msgid "The following changes have been applied" ++#~ msgstr "S'han aplicat els següents canvis" ++ ++#~ msgid "" ++#~ "When flashing a new firmware with LuCI these files will be added to the new firmware " ++#~ "installation." ++#~ msgstr "" ++#~ "Quan s'actualitza un nou firmware amb un LuCI aquests fitxers s'afegiran a la " ++#~ "instal·lació del nou firmware." ++ ++#, fuzzy ++#~ msgid "Wireless Scan" ++#~ msgstr "Wireless" ++ ++#~ msgid "" ++#~ "With DHCP " ++#~ "network members can automatically receive their network settings (IP-address, netmask, DNS-server, ...)." ++#~ msgstr "" ++#~ "Amb el DHCP " ++#~ "els membres d'una xarxa poden rebre automàticament els seus paràmetres de " ++#~ "xarxa (adreça IP, màscara de " ++#~ "xarxa, servidor DNS, ...)." ++ ++#~ msgid "" ++#~ "You can run several wifi networks with one device. Be aware that there " ++#~ "are certain hardware and driverspecific restrictions. Normally you can " ++#~ "operate 1 Ad-Hoc or up to 3 Master-Mode and 1 Client-Mode network " ++#~ "simultaneously." ++#~ msgstr "" ++#~ "Pots fer servir diverses xarxes sense fils amb un sol dispositiu. Tingues " ++#~ "en compte que hi ha certes restriccions específiques del maquinari i dels " ++#~ "controlados. Normalment, pots operar 1 xarxa Ad-Hoc o fins a 3 xarxes en " ++#~ "mode Master i 1 xarxa en mode Client simultàniament.\"a_w_netid = \"Nom " ++#~ "de la xarxa (ESSID)" ++ ++#~ msgid "" ++#~ "You need to install \"ppp-mod-pppoe\" for PPPoE or \"pptp\" for PPtP " ++#~ "support" ++#~ msgstr "" ++#~ "Necessites instal·lar \"ppp-mod-pppoe\" per suport PPPoE o \"pptp\" per " ++#~ "suport PPtP" ++ ++#~ msgid "Zone" ++#~ msgstr "Zona" ++ ++#~ msgid "additional hostfile" ++#~ msgstr "fitxer de noms addicional" ++ ++#~ msgid "adds domain names to hostentries in the resolv file" ++#~ msgstr "afegeix Noms de Domini a les entrades de noms al fitxer resolv" ++ ++#~ msgid "automatically reconnect" ++#~ msgstr "reconnecta automàticament" ++ ++#~ msgid "concurrent queries" ++#~ msgstr "consultes concurrents" ++ ++#~ msgid "" ++#~ "disable DHCP " ++#~ "for this interface" ++#~ msgstr "" ++#~ "deshabilita el DHCP per aquesta interfície" ++ ++#~ msgid "disconnect when idle for" ++#~ msgstr "desconnecta per inactivitat durant" ++ ++#~ msgid "don't cache unknown" ++#~ msgstr "no emmagatzemis en memòria cau els desconeguts" ++ ++#~ msgid "" ++#~ "filter useless DNS-queries of " ++#~ "Windows-systems" ++#~ msgstr "" ++#~ "filtra les consultes DNS no " ++#~ "útils de sistemes Windows" ++ ++#~ msgid "installed" ++#~ msgstr "instal·lat" ++ ++#~ msgid "localises the hostname depending on its subnet" ++#~ msgstr "localitza el nom de màquina depenent de la seva subxarxa" ++ ++#~ msgid "not installed" ++#~ msgstr "no instal·lat" ++ ++#~ msgid "" ++#~ "prevents caching of negative DNS-replies" ++#~ msgstr "" ++#~ "evita emmagatzemar en memòria cau les respostes DNS negatives" ++ ++#~ msgid "query port" ++#~ msgstr "port de consulta" ++ ++#~ msgid "transmitted / received" ++#~ msgstr "transmès / rebut" ++ ++#, fuzzy ++#~ msgid "Join network" ++#~ msgstr "Xarxes contingudes" ++ ++#~ msgid "all" ++#~ msgstr "tots" ++ ++#~ msgid "Code" ++#~ msgstr "Codi" ++ ++#~ msgid "Distance" ++#~ msgstr "Distància" ++ ++#~ msgid "Legend" ++#~ msgstr "Llegenda" ++ ++#~ msgid "Library" ++#~ msgstr "Llibreria" ++ ++#~ msgid "see '%s' manpage" ++#~ msgstr "pàgina de manual de '%s'" ++ ++#~ msgid "Package Manager" ++#~ msgstr "Gestor de paquets" ++ ++#~ msgid "Service" ++#~ msgstr "Servei" ++ ++#~ msgid "Statistics" ++#~ msgstr "Estadístiques" ++ ++#~ msgid "zone" ++#~ msgstr "Zona" +diff --git a/feeds/luci/modules/luci-base/po/cs/base.po b/feeds/luci/modules/luci-base/po/cs/base.po +new file mode 100644 +index 0000000..3736020 +--- /dev/null ++++ b/feeds/luci/modules/luci-base/po/cs/base.po +@@ -0,0 +1,3412 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"PO-Revision-Date: 2014-05-31 13:59+0200\n" ++"Last-Translator: koli \n" ++"Language-Team: none\n" ++"Language: cs\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "(%d minute window, %d second interval)" ++msgstr "(%d minutové okno, %d sekundový interval)" ++ ++msgid "(%s available)" ++msgstr "(%s k dispozici)" ++ ++msgid "(empty)" ++msgstr "(prázdný)" ++ ++msgid "(no interfaces attached)" ++msgstr "(bez rozhraní pÅ™ipojení)" ++ ++msgid "-- Additional Field --" ++msgstr "-- Doplňující pole --" ++ ++msgid "-- Please choose --" ++msgstr "-- Prosím vyberte --" ++ ++msgid "-- custom --" ++msgstr "-- vlastní --" ++ ++msgid "-- match by device --" ++msgstr "" ++ ++msgid "-- match by label --" ++msgstr "" ++ ++msgid "1 Minute Load:" ++msgstr "Zatížení za 1 minutu:" ++ ++msgid "15 Minute Load:" ++msgstr "Zatížení za 15 minut:" ++ ++msgid "5 Minute Load:" ++msgstr "Zatížení za 5 minut:" ++ ++msgid "BSSID" ++msgstr "BSSID" ++ ++msgid "DNS query port" ++msgstr "port dotazů DNS" ++ ++msgid "DNS server port" ++msgstr "port serveru DNS" ++ ++msgid "" ++"DNS servers will be queried in the " ++"order of the resolvfile" ++msgstr "" ++"DNS servery budou dotazovány podle " ++"poÅ™adí resolvfile" ++ ++msgid "ESSID" ++msgstr "ESSID" ++ ++msgid "IPv4-Address" ++msgstr "IPv4-Adresa" ++ ++msgid "IPv4-Gateway" ++msgstr "IPv4-Brána" ++ ++msgid "IPv4-Netmask" ++msgstr "IPv4-Maska sítÄ›" ++ ++msgid "" ++"IPv6-Address or Network " ++"(CIDR)" ++msgstr "" ++"IPv6-Adresa nebo Síť (CIDR)" ++ ++msgid "IPv6-Gateway" ++msgstr "IPv6-Brána" ++ ++msgid "IPv6-Suffix (hex)" ++msgstr "" ++ ++msgid "LED Configuration" ++msgstr "LED Konfigurace" ++ ++msgid "LED Name" ++msgstr "LED Název" ++ ++msgid "MAC-Address" ++msgstr "MAC-Adresa" ++ ++msgid "" ++"Max. DHCP leases" ++msgstr "" ++"Nejvyšší poÄet DHCP výpůjÄek" ++ ++msgid "" ++"Max. EDNS0 packet size" ++msgstr "" ++"NejvÄ›tší povolená velikost EDNS0 packetů" ++ ++msgid "Max. concurrent queries" ++msgstr "Nejvyšší poÄet souběžných dotazů" ++ ++msgid "%s - %s" ++msgstr "%s - %s" ++ ++msgid "ADSL" ++msgstr "" ++ ++msgid "ADSL Status" ++msgstr "" ++ ++msgid "AICCU (SIXXS)" ++msgstr "" ++ ++msgid "APN" ++msgstr "APN" ++ ++msgid "AR Support" ++msgstr "Podpora AR" ++ ++msgid "ARP retry threshold" ++msgstr "ARP limit opakování" ++ ++msgid "ATM Bridges" ++msgstr "ATM mosty" ++ ++msgid "ATM Virtual Channel Identifier (VCI)" ++msgstr "Identifikátor virtuálního kanálu ATM (VCI)" ++ ++msgid "ATM Virtual Path Identifier (VPI)" ++msgstr "Identifikátor virtuální cesty ATM (VPI)" ++ ++msgid "" ++"ATM bridges expose encapsulated ethernet in AAL5 connections as virtual " ++"Linux network interfaces which can be used in conjunction with DHCP or PPP " ++"to dial into the provider network." ++msgstr "" ++"OtevÅ™e ATM mosty pÅ™es uzavÅ™ené ethernetové rozhraní v AAL5 pÅ™ipojení jako " ++"virtuální síťová rozhraní Linuxu, které mohou být použity ve spojení s DHCP " ++"nebo PPP vytáÄeného pÅ™ipojení od poskytovatele sítÄ›." ++ ++msgid "ATM device number" ++msgstr "Äíslo ATM zařízení" ++ ++msgid "AYIYA" ++msgstr "" ++ ++msgid "Access Concentrator" ++msgstr "Přístupový koncentrátor" ++ ++msgid "Access Point" ++msgstr "Přístupový bod" ++ ++msgid "Action" ++msgstr "Akce" ++ ++msgid "Actions" ++msgstr "Akce" ++ ++msgid "Activate this network" ++msgstr "Aktivovat tuto síť" ++ ++msgid "Active IPv4-Routes" ++msgstr "" ++"Aktivní záznamy ve smÄ›rovací tabulce IPv4" ++ ++msgid "Active IPv6-Routes" ++msgstr "" ++"Aktivní záznamy ve smÄ›rovací tabulce IPv6" ++ ++msgid "Active Connections" ++msgstr "Aktivní spojení" ++ ++msgid "Active DHCP Leases" ++msgstr "Aktivní propůjÄené DHCP adresy (leases)" ++ ++msgid "Active DHCPv6 Leases" ++msgstr "Aktivní propůjÄené DHCPv6 adresy (leases)" ++ ++msgid "Ad-Hoc" ++msgstr "Ad-Hoc" ++ ++msgid "Add" ++msgstr "PÅ™idat" ++ ++msgid "Add local domain suffix to names served from hosts files" ++msgstr "PÅ™idat lokální koncovku k doménovým jménům ze souboru hosts" ++ ++msgid "Add new interface..." ++msgstr "PÅ™idat rozhraní..." ++ ++msgid "Additional Hosts files" ++msgstr "DodateÄné Hosts soubory" ++ ++msgid "Address" ++msgstr "Adresa" ++ ++msgid "Address to access local relay bridge" ++msgstr "Adresa pro přístup k místnímu relay bridge" ++ ++msgid "Administration" ++msgstr "Správa" ++ ++msgid "Advanced Settings" ++msgstr "PokroÄilé nastavení" ++ ++msgid "Alert" ++msgstr "UpozornÄ›ní" ++ ++msgid "Allow SSH password authentication" ++msgstr "Povolit SSH autentizaci heslem" ++ ++msgid "Allow all except listed" ++msgstr "Povolit vÅ¡e mimo uvedené" ++ ++msgid "Allow listed only" ++msgstr "Povolit pouze uvedené" ++ ++msgid "Allow localhost" ++msgstr "Povolit localhost" ++ ++msgid "Allow remote hosts to connect to local SSH forwarded ports" ++msgstr "" ++"Povolit vzdáleným hostitelům pÅ™ipojování k místním portům pÅ™esmÄ›rovaným " ++"pomocí SSH" ++ ++msgid "Allow root logins with password" ++msgstr "Povolit pÅ™ihlaÅ¡ovaní root úÄtu pomocí hesla" ++ ++msgid "Allow the root user to login with password" ++msgstr "Povolit root úÄtu pÅ™ihlášení bez nastaveného hesla" ++ ++msgid "" ++"Allow upstream responses in the 127.0.0.0/8 range, e.g. for RBL services" ++msgstr "Povolit upstream odpovÄ›di na 127.0.0.0/8 rozsah, napÅ™. pro RBL služby" ++ ++msgid "" ++"Also see Tunneling Comparison on SIXXS" ++msgstr "" ++ ++msgid "Always announce default router" ++msgstr "" ++ ++msgid "An additional network will be created if you leave this unchecked." ++msgstr "Pokud není zaÅ¡krtnuto, bude vytvoÅ™ena dodateÄná síť." ++ ++msgid "Announce as default router even if no public prefix is available." ++msgstr "" ++ ++msgid "Announced DNS domains" ++msgstr "" ++ ++msgid "Announced DNS servers" ++msgstr "" ++ ++msgid "Antenna 1" ++msgstr "Anténa 1" ++ ++msgid "Antenna 2" ++msgstr "Anténa 2" ++ ++msgid "Antenna Configuration" ++msgstr "Konfigurace antén" ++ ++msgid "Any zone" ++msgstr "Libovolná zóna" ++ ++msgid "Apply" ++msgstr "Použít" ++ ++msgid "Applying changes" ++msgstr "Probíhá uplatňování nastavení" ++ ++msgid "" ++"Assign a part of given length of every public IPv6-prefix to this interface" ++msgstr "" ++ ++msgid "Assign interfaces..." ++msgstr "PÅ™iÅ™adit rozhraní..." ++ ++msgid "" ++"Assign prefix parts using this hexadecimal subprefix ID for this interface." ++msgstr "" ++ ++msgid "Associated Stations" ++msgstr "PÅ™ipojení klienti" ++ ++msgid "Atheros 802.11%s Wireless Controller" ++msgstr "Atheros 802.11%s bezdrátový ovladaÄ" ++ ++msgid "AuthGroup" ++msgstr "" ++ ++msgid "Authentication" ++msgstr "Autentizace" ++ ++msgid "Authoritative" ++msgstr "Autoritativní" ++ ++msgid "Authorization Required" ++msgstr "Vyžadována autorizace" ++ ++msgid "Auto Refresh" ++msgstr "Automaticky obnovovat" ++ ++msgid "Automatic" ++msgstr "" ++ ++msgid "Automatic Homenet (HNCP)" ++msgstr "" ++ ++msgid "Available" ++msgstr "Dostupné" ++ ++msgid "Available packages" ++msgstr "Dostupné balíÄky" ++ ++msgid "Average:" ++msgstr "PrůmÄ›r:" ++ ++msgid "BSSID" ++msgstr "BSSID" ++ ++msgid "Back" ++msgstr "ZpÄ›t" ++ ++msgid "Back to Overview" ++msgstr "ZpÄ›t k pÅ™ehledu" ++ ++msgid "Back to configuration" ++msgstr "ZpÄ›t ke konfiguraci" ++ ++msgid "Back to overview" ++msgstr "ZpÄ›t k pÅ™ehledu" ++ ++msgid "Back to scan results" ++msgstr "ZpÄ›t k výsledkům vyhledávání" ++ ++msgid "Background Scan" ++msgstr "Vyhledávat na pozadí" ++ ++msgid "Backup / Flash Firmware" ++msgstr "Zálohovat / nahrát firmware" ++ ++msgid "Backup / Restore" ++msgstr "Zálohovat / obnovit" ++ ++msgid "Backup file list" ++msgstr "Seznam souborů k zálohování" ++ ++msgid "Bad address specified!" ++msgstr "Zadána neplatná adresa!" ++ ++msgid "Band" ++msgstr "" ++ ++msgid "Behind NAT" ++msgstr "" ++ ++msgid "" ++"Below is the determined list of files to backup. It consists of changed " ++"configuration files marked by opkg, essential base files and the user " ++"defined backup patterns." ++msgstr "" ++"Seznam souborů k zálohování lze nalézt níže. Sestává se z konfiguraÄních " ++"souborů oznaÄených opkg, nezbyných systémových souborů a souborů " ++"vyhovujících uživatelem urÄeným vzorům." ++ ++msgid "Bitrate" ++msgstr "PÅ™enosová rychlost" ++ ++msgid "Bogus NX Domain Override" ++msgstr "PÅ™epíše faleÅ¡nou hodnotu NX Domény" ++ ++msgid "Bridge" ++msgstr "Síťový most" ++ ++msgid "Bridge interfaces" ++msgstr "Síťové mosty" ++ ++msgid "Bridge unit number" ++msgstr "Číslo síťového mostu" ++ ++msgid "Bring up on boot" ++msgstr "Zapnout po startu" ++ ++msgid "Broadcom 802.11%s Wireless Controller" ++msgstr "Broadcom 802.11%s bezdrátový ovladaÄ" ++ ++msgid "Broadcom BCM%04x 802.11 Wireless Controller" ++msgstr "Broadcom modul BCM%04x 802.11 bezdrátový ovladaÄ" ++ ++msgid "Buffered" ++msgstr "Bufferováno" ++ ++msgid "Buttons" ++msgstr "TlaÄítka" ++ ++msgid "CA certificate; if empty it will be saved after the first connection." ++msgstr "" ++ ++msgid "CPU" ++msgstr "CPU" ++ ++msgid "CPU usage (%)" ++msgstr "Vytížení CPU (%)" ++ ++msgid "Cancel" ++msgstr "Storno" ++ ++msgid "Category" ++msgstr "" ++ ++msgid "Chain" ++msgstr "ŘetÄ›z" ++ ++msgid "Changes" ++msgstr "ZmÄ›ny" ++ ++msgid "Changes applied." ++msgstr "ZmÄ›ny aplikovány." ++ ++msgid "Changes the administrator password for accessing the device" ++msgstr "ZmÄ›ní administrátorské heslo pro přístup k zařízení" ++ ++msgid "Channel" ++msgstr "Kanál" ++ ++msgid "Check" ++msgstr "Kontrola" ++ ++msgid "Checksum" ++msgstr "Kontrolní souÄet" ++ ++msgid "" ++"Choose the firewall zone you want to assign to this interface. Select " ++"unspecified to remove the interface from the associated zone or " ++"fill out the create field to define a new zone and attach the " ++"interface to it." ++msgstr "" ++"Zóna firewallu pÅ™iÅ™azená k tomuto rozhraní. Pro odstranÄ›ní rozhraní z " ++"pÅ™iÅ™azené zóny vyberte volbu nespecifikovaná. Pro vytvoÅ™ení nové " ++"zóny a její následné pÅ™iÅ™azení danému rozhraní vyplňte pole vytvoÅ™it." ++ ++msgid "" ++"Choose the network(s) you want to attach to this wireless interface or fill " ++"out the create field to define a new network." ++msgstr "" ++"Vyberte síť(Ä›), které chcete pÅ™ipojit k tomuto bezdrátovému rozhraní, nebo " ++"vyplňte pole vytvoÅ™it a pojmenujte novou síť." ++ ++msgid "Cipher" ++msgstr "Å ifra" ++ ++msgid "" ++"Click \"Generate archive\" to download a tar archive of the current " ++"configuration files. To reset the firmware to its initial state, click " ++"\"Perform reset\" (only possible with squashfs images)." ++msgstr "" ++"Pro stažení archivu tar s aktuální konfigurací stisknÄ›te \"VytvoÅ™it archiv" ++"\". Pro obnovení továrního nastavení stisknÄ›te \"Obnovit výchozí\" (možné " ++"pouze s obrazy squashfs)." ++ ++msgid "Client" ++msgstr "Klient" ++ ++msgid "Client ID to send when requesting DHCP" ++msgstr "Klientské ID odesílané v DHCP požadavku" ++ ++msgid "" ++"Close inactive connection after the given amount of seconds, use 0 to " ++"persist connection" ++msgstr "" ++"Uzavírat neaktivní spojení po daném poÄtu sekund. Pro vypnutí Äasového " ++"omezení použijte jako hodntu nulu" ++ ++msgid "Close list..." ++msgstr "Zavřít seznam..." ++ ++msgid "Collecting data..." ++msgstr "Probíhá sbÄ›r dat..." ++ ++msgid "Command" ++msgstr "Příkaz" ++ ++msgid "Common Configuration" ++msgstr "SpoleÄná nastavení" ++ ++msgid "Compression" ++msgstr "Komprese" ++ ++msgid "Configuration" ++msgstr "Nastavení" ++ ++msgid "Configuration applied." ++msgstr "Nastavení uplatnÄ›no." ++ ++msgid "Configuration files will be kept." ++msgstr "KonfiguraÄní soubory budou zachovány." ++ ++msgid "Confirmation" ++msgstr "Ověření" ++ ++msgid "Connect" ++msgstr "PÅ™ipojit" ++ ++msgid "Connected" ++msgstr "PÅ™ipojeno" ++ ++msgid "Connection Limit" ++msgstr "Omezení poÄtu pÅ™ipojení" ++ ++msgid "Connection to server fails when TLS cannot be used" ++msgstr "" ++ ++msgid "Connections" ++msgstr "PÅ™ipojení" ++ ++msgid "Country" ++msgstr "ZemÄ›" ++ ++msgid "Country Code" ++msgstr "Kód zemÄ›" ++ ++msgid "Cover the following interface" ++msgstr "Pokrýt následující rozhraní" ++ ++msgid "Cover the following interfaces" ++msgstr "Pokrýt následující rozhraní" ++ ++msgid "Create / Assign firewall-zone" ++msgstr "VytvoÅ™it / pÅ™iÅ™adit zónu firewallu" ++ ++msgid "Create Interface" ++msgstr "VytvoÅ™it rozhraní" ++ ++msgid "Create a bridge over multiple interfaces" ++msgstr "VytvoÅ™it síťový most pÅ™es více rozhraní" ++ ++msgid "Critical" ++msgstr "Kritické" ++ ++msgid "Cron Log Level" ++msgstr "Úroveň protokolování Cronu" ++ ++msgid "Custom Interface" ++msgstr "Vlastní rozhraní" ++ ++msgid "Custom delegated IPv6-prefix" ++msgstr "" ++ ++msgid "" ++"Customizes the behaviour of the device LEDs if possible." ++msgstr "" ++"Upraví chování LED diod zařízení " ++"pokud je to možné." ++ ++msgid "DHCP Leases" ++msgstr "DHCP výpůjÄky" ++ ++msgid "DHCP Server" ++msgstr "DHCP server" ++ ++msgid "DHCP and DNS" ++msgstr "DHCP a DNS" ++ ++msgid "DHCP client" ++msgstr "DHCP klient" ++ ++msgid "DHCP-Options" ++msgstr "Volby DHCP" ++ ++msgid "DHCPv6 Leases" ++msgstr "DHCPv6 pÅ™idÄ›lené IP" ++ ++msgid "DHCPv6 client" ++msgstr "" ++ ++msgid "DHCPv6-Mode" ++msgstr "" ++ ++msgid "DHCPv6-Service" ++msgstr "" ++ ++msgid "DNS" ++msgstr "DNS" ++ ++msgid "DNS forwardings" ++msgstr "PÅ™eposílání DNS" ++ ++msgid "DNS-Label / FQDN" ++msgstr "" ++ ++msgid "DS-Lite AFTR address" ++msgstr "" ++ ++msgid "DUID" ++msgstr "DUID" ++ ++msgid "Debug" ++msgstr "LadÄ›ní" ++ ++msgid "Default %d" ++msgstr "Výchozí %d" ++ ++msgid "Default gateway" ++msgstr "Výchozí brána" ++ ++msgid "Default route" ++msgstr "" ++ ++msgid "Default state" ++msgstr "Výchozí stav" ++ ++msgid "Define a name for this network." ++msgstr "Jméno sítÄ›." ++ ++msgid "" ++"Define additional DHCP options, for example " ++"\"6,192.168.2.1,192.168.2.2\" which advertises different DNS " ++"servers to clients." ++msgstr "" ++"Další možnosti DHCP, například \"6,192.168.2.1,192.168.2.2\", " ++"které odkazuje na různé DNS servery pro klienty." ++ ++msgid "Delete" ++msgstr "Odstranit" ++ ++msgid "Delete this interface" ++msgstr "Odstranit toto rozhraní" ++ ++msgid "Delete this network" ++msgstr "Odstranit tuto síť" ++ ++msgid "Description" ++msgstr "Popis" ++ ++msgid "Design" ++msgstr "Vzhled" ++ ++msgid "Destination" ++msgstr "Cíl" ++ ++msgid "Device" ++msgstr "Zařízení" ++ ++msgid "Device Configuration" ++msgstr "Nastavení zařízení" ++ ++msgid "Diagnostics" ++msgstr "Diagnostika" ++ ++msgid "Dial number" ++msgstr "" ++ ++msgid "Directory" ++msgstr "Adresář" ++ ++msgid "Disable" ++msgstr "Zakázat" ++ ++msgid "" ++"Disable DHCP for " ++"this interface." ++msgstr "" ++"Pro toto rozhraní zakázat DHCP." ++ ++msgid "Disable DNS setup" ++msgstr "Zakázat nastavení DNS" ++ ++msgid "Disable HW-Beacon timer" ++msgstr "Zakázat HW-Beacon ÄasovaÄ" ++ ++msgid "Disabled" ++msgstr "Zakázáno" ++ ++msgid "Discard upstream RFC1918 responses" ++msgstr "VyÅ™adit upstream RFC1918 odpovÄ›di" ++ ++msgid "Displaying only packages containing" ++msgstr "Zobrazeny pouze balíÄky obsahující" ++ ++msgid "Distance Optimization" ++msgstr "Optimalizace na vzdálenost" ++ ++msgid "Distance to farthest network member in meters." ++msgstr "Vzdálenost nejodlehlejšího Älena sítÄ› v metrech." ++ ++msgid "Diversity" ++msgstr "Diverzita" ++ ++msgid "" ++"Dnsmasq is a combined DHCP-Server and DNS-" ++"Forwarder for NAT " ++"firewalls" ++msgstr "" ++"Dnsmasq je kombinace DHCP serveru a DNS " ++"forwarderu pro použití v NAT firewallech" ++ ++msgid "Do not cache negative replies, e.g. for not existing domains" ++msgstr "Necachovat negativní odpovÄ›di (napÅ™. pro neexistující domény)" ++ ++msgid "Do not forward requests that cannot be answered by public name servers" ++msgstr "" ++"NepÅ™eposílat požadavky, které nemohou být zodpovÄ›zeny veÅ™ejnými jmennými " ++"servery" ++ ++msgid "Do not forward reverse lookups for local networks" ++msgstr "NepÅ™eposílat reverzní dotazy na místní sítÄ›" ++ ++msgid "Do not send probe responses" ++msgstr "Neodpovídat na vyhledávání" ++ ++msgid "Domain required" ++msgstr "Vyžadována doména" ++ ++msgid "Domain whitelist" ++msgstr "Whitelist domén" ++ ++msgid "" ++"Don't forward DNS-Requests without " ++"DNS-Name" ++msgstr "" ++"NepÅ™eposílat DNS dotazy bez DNS jména" ++ ++msgid "Download and install package" ++msgstr "Stáhnout a nainstalovat balíÄek" ++ ++msgid "Download backup" ++msgstr "Stáhnout zálohu" ++ ++msgid "Dropbear Instance" ++msgstr "Instance Dropbear" ++ ++msgid "" ++"Dropbear offers SSH network shell access " ++"and an integrated SCP server" ++msgstr "" ++"Dropbear poskytuje SSH přístup a SCP server" ++ ++msgid "Dual-Stack Lite (RFC6333)" ++msgstr "" ++ ++msgid "Dynamic DHCP" ++msgstr "" ++"Dynamický DHCP" ++ ++msgid "Dynamic tunnel" ++msgstr "Dynamický tunel" ++ ++msgid "" ++"Dynamically allocate DHCP addresses for clients. If disabled, only clients " ++"having static leases will be served." ++msgstr "" ++"Pro klienty alokovat DHCP adresy dynamicky. Pokud je volba zakázána, budou " ++"obsloužení pouze klienti se statickými výpůjÄkami." ++ ++msgid "EAP-Method" ++msgstr "Metoda EAP" ++ ++msgid "Edit" ++msgstr "Upravit" ++ ++msgid "" ++"Edit the raw configuration data above to fix any error and hit \"Save\" to " ++"reload the page." ++msgstr "" ++ ++msgid "Edit this interface" ++msgstr "Upravit toto rozhraní" ++ ++msgid "Edit this network" ++msgstr "Upravit tuto síť" ++ ++msgid "Emergency" ++msgstr "Záchrana" ++ ++msgid "Enable" ++msgstr "Povolit" ++ ++msgid "Enable STP" ++msgstr "Povolit STP" ++ ++msgid "Enable HE.net dynamic endpoint update" ++msgstr "Povolit dynamickou aktualizaci koncového bodu HE.net" ++ ++msgid "Enable IPv6 negotiation on the PPP link" ++msgstr "Na PPP spoji povolit vyjednání IPv6" ++ ++msgid "Enable Jumbo Frame passthrough" ++msgstr "Povolit průchod jumbo rámců" ++ ++msgid "Enable NTP client" ++msgstr "Povolit NTP klienta" ++ ++msgid "Enable TFTP server" ++msgstr "Povolit TFTP server" ++ ++msgid "Enable VLAN functionality" ++msgstr "Povolit funkcionalitu VLAN" ++ ++msgid "Enable WPS pushbutton, requires WPA(2)-PSK" ++msgstr "" ++ ++msgid "Enable learning and aging" ++msgstr "Povolit ARP uÄení a stárnutí" ++ ++msgid "Enable mirroring of incoming packets" ++msgstr "" ++ ++msgid "Enable mirroring of outgoing packets" ++msgstr "" ++ ++msgid "Enable this mount" ++msgstr "Povolit tento přípojný bod" ++ ++msgid "Enable this swap" ++msgstr "Povolit tento swapovací oddíl" ++ ++msgid "Enable/Disable" ++msgstr "Povolit/Zakázat" ++ ++msgid "Enabled" ++msgstr "Povoleno" ++ ++msgid "Enables the Spanning Tree Protocol on this bridge" ++msgstr "Na tomto síťovém mostÄ› povolit Spanning Tree Protocol" ++ ++msgid "Encapsulation mode" ++msgstr "Režim zapouzdÅ™ení" ++ ++msgid "Encryption" ++msgstr "Å ifrování" ++ ++msgid "Erasing..." ++msgstr "Odstraňování..." ++ ++msgid "Error" ++msgstr "Chyba" ++ ++msgid "Ethernet Adapter" ++msgstr "Ethernetový adaptér" ++ ++msgid "Ethernet Switch" ++msgstr "Ethernetový switch" ++ ++msgid "Expand hosts" ++msgstr "Rozšířit hostitele" ++ ++msgid "Expires" ++msgstr "Vyprší" ++ ++#, fuzzy ++msgid "" ++"Expiry time of leased addresses, minimum is 2 minutes (2m)." ++msgstr "" ++"ÄŒas vyprÅ¡ení vypůjÄené adresy, minimum jsou 2 minuty (2m)." ++ ++msgid "External" ++msgstr "" ++ ++msgid "External system log server" ++msgstr "Externí protokolovací server" ++ ++msgid "External system log server port" ++msgstr "Port externího protokolovacího serveru" ++ ++msgid "Fast Frames" ++msgstr "Rychlé rámce" ++ ++msgid "File" ++msgstr "Soubor" ++ ++msgid "Filename of the boot image advertised to clients" ++msgstr "Název souboru s bootovacím obrazem oznamovaný klientům" ++ ++msgid "Filesystem" ++msgstr "Souborový systém" ++ ++msgid "Filter" ++msgstr "Filtr" ++ ++msgid "Filter private" ++msgstr "Filtrovat soukromé" ++ ++msgid "Filter useless" ++msgstr "Filtrovat nepotÅ™ebné" ++ ++msgid "Find and join network" ++msgstr "Vyhledat a pÅ™ipojit síť" ++ ++msgid "Find package" ++msgstr "Vyhledat balíÄek" ++ ++msgid "Finish" ++msgstr "DokonÄit" ++ ++msgid "Firewall" ++msgstr "Firewall" ++ ++msgid "Firewall Settings" ++msgstr "Nastavení firewallu" ++ ++msgid "Firewall Status" ++msgstr "Stav firewallu" ++ ++msgid "Firmware Version" ++msgstr "Verze firmwaru" ++ ++msgid "Fixed source port for outbound DNS queries" ++msgstr "Pevný zdrojový port pro odchozí DNS dotazy" ++ ++msgid "Flags" ++msgstr "Příznaky" ++ ++msgid "Flash Firmware" ++msgstr "Nahrát firmware" ++ ++msgid "Flash image..." ++msgstr "Nahrát obraz..." ++ ++msgid "Flash new firmware image" ++msgstr "Nahrát nový obraz s firmwarem" ++ ++msgid "Flash operations" ++msgstr "Operace nad flash pamÄ›tí" ++ ++msgid "Flashing..." ++msgstr "Nahrávám..." ++ ++msgid "Force" ++msgstr "Vynutit" ++ ++msgid "Force CCMP (AES)" ++msgstr "Vynutit CCMP (AES)" ++ ++msgid "Force DHCP on this network even if another server is detected." ++msgstr "Na této síti vynutit DHCP i v případÄ› detekování jiného serveru." ++ ++msgid "Force TKIP" ++msgstr "Vynutit TKIP" ++ ++msgid "Force TKIP and CCMP (AES)" ++msgstr "Vynutit TKIP a CCMP (AES)" ++ ++msgid "Forward DHCP traffic" ++msgstr "PÅ™eposílat DHCP provoz" ++ ++msgid "Forward broadcast traffic" ++msgstr "PÅ™eposílat broadcasty" ++ ++msgid "Forwarding mode" ++msgstr "Režim pÅ™eposílání" ++ ++msgid "Fragmentation Threshold" ++msgstr "Hranice fragmentace" ++ ++msgid "Frame Bursting" ++msgstr "Dávkování rámců" ++ ++msgid "Free" ++msgstr "Volné" ++ ++msgid "Free space" ++msgstr "Volné místo" ++ ++msgid "GHz" ++msgstr "GHz" ++ ++msgid "GPRS only" ++msgstr "Pouze GPRS" ++ ++msgid "Gateway" ++msgstr "Brána" ++ ++msgid "Gateway ports" ++msgstr "Porty brány" ++ ++msgid "General Settings" ++msgstr "Obecná nastavení" ++ ++msgid "General Setup" ++msgstr "Obecné nastavení" ++ ++msgid "Generate archive" ++msgstr "VytvorÇt archív" ++ ++msgid "Generic 802.11%s Wireless Controller" ++msgstr "Generic 802.11%s Wireless Controller" ++ ++msgid "Given password confirmation did not match, password not changed!" ++msgstr "Heslo nezmÄ›nÄ›no z důvodu nesouhlasu nového hesla a ověření hesla!" ++ ++msgid "Global network options" ++msgstr "" ++ ++msgid "Go to password configuration..." ++msgstr "PÅ™ejít na nastavení hesla..." ++ ++msgid "Go to relevant configuration page" ++msgstr "PÅ™ejít na související konfiguraÄní stránku" ++ ++msgid "Guest" ++msgstr "" ++ ++msgid "HE.net password" ++msgstr "Heslo HE.net" ++ ++msgid "HE.net username" ++msgstr "" ++ ++msgid "Handler" ++msgstr "Handler" ++ ++msgid "Hang Up" ++msgstr "ZavÄ›sit" ++ ++msgid "Heartbeat" ++msgstr "" ++ ++msgid "" ++"Here you can configure the basic aspects of your device like its hostname or " ++"the timezone." ++msgstr "" ++"Nastavení základních vlastností zařízení jako je Äasová zóna nebo název " ++"zařízení." ++ ++msgid "" ++"Here you can paste public SSH-Keys (one per line) for SSH public-key " ++"authentication." ++msgstr "" ++"Vložte veÅ™ejné klíÄe (na každý Å™adek jeden) pro ověřovaní SSH přístupu." ++ ++msgid "Hermes 802.11b Wireless Controller" ++msgstr "Hermes 802.11b bezdrátový ovladaÄ" ++ ++msgid "Hide ESSID" ++msgstr "Skrývat ESSID" ++ ++msgid "Host entries" ++msgstr "Záznamy hostitelů" ++ ++msgid "Host expiry timeout" ++msgstr "VyprÅ¡ení Äasového limitu hostitele" ++ ++msgid "Host-IP or Network" ++msgstr "" ++"IP adresa hostitele nebo síť" ++ ++msgid "Hostname" ++msgstr "Jméno hostitele" ++ ++msgid "Hostname to send when requesting DHCP" ++msgstr "Jméno hostitele odesílané s DHCP požadavky" ++ ++msgid "Hostnames" ++msgstr "Jména hostitelů" ++ ++msgid "Hybrid" ++msgstr "" ++ ++msgid "IP address" ++msgstr "IP adresy" ++ ++msgid "IPv4" ++msgstr "IPv4" ++ ++msgid "IPv4 Firewall" ++msgstr "IPv4 firewall" ++ ++msgid "IPv4 WAN Status" ++msgstr "Stav IPv4 WAN" ++ ++msgid "IPv4 address" ++msgstr "IPv4 adresa" ++ ++msgid "IPv4 and IPv6" ++msgstr "IPv4 a IPv6" ++ ++msgid "IPv4 assignment length" ++msgstr "" ++ ++msgid "IPv4 broadcast" ++msgstr "IPv4 broadcast" ++ ++msgid "IPv4 gateway" ++msgstr "IPv4 brána" ++ ++msgid "IPv4 netmask" ++msgstr "IPv4 maska sítÄ›" ++ ++msgid "IPv4 only" ++msgstr "Pouze IPv4" ++ ++msgid "IPv4 prefix length" ++msgstr "Délka IPv4 prefixu" ++ ++msgid "IPv4-Address" ++msgstr "IPv4 adresa" ++ ++msgid "IPv6" ++msgstr "IPv6" ++ ++msgid "IPv6 Firewall" ++msgstr "IPv6 firewall" ++ ++msgid "IPv6 Neighbours" ++msgstr "" ++ ++msgid "IPv6 Settings" ++msgstr "" ++ ++msgid "IPv6 ULA-Prefix" ++msgstr "" ++ ++msgid "IPv6 WAN Status" ++msgstr "Stav IPv6 WAN" ++ ++msgid "IPv6 address" ++msgstr "IPv6 adresa" ++ ++msgid "IPv6 address delegated to the local tunnel endpoint (optional)" ++msgstr "" ++ ++msgid "IPv6 assignment hint" ++msgstr "" ++ ++msgid "IPv6 assignment length" ++msgstr "" ++ ++msgid "IPv6 gateway" ++msgstr "IPv6 brána" ++ ++msgid "IPv6 only" ++msgstr "Pouze IPv6" ++ ++msgid "IPv6 prefix" ++msgstr "IPv6 prefix" ++ ++msgid "IPv6 prefix length" ++msgstr "Délka IPv6 prefixu" ++ ++msgid "IPv6 routed prefix" ++msgstr "" ++ ++msgid "IPv6-Address" ++msgstr "IPv6 adresa" ++ ++msgid "IPv6-in-IPv4 (RFC4213)" ++msgstr "IPv6-in-IPv4 (RFC4213)" ++ ++msgid "IPv6-over-IPv4 (6rd)" ++msgstr "IPv6-over-IPv4 (6rd)" ++ ++msgid "IPv6-over-IPv4 (6to4)" ++msgstr "IPv6-over-IPv4 (6to4)" ++ ++msgid "Identity" ++msgstr "Identita" ++ ++msgid "" ++"If specified, mount the device by its UUID instead of a fixed device node" ++msgstr "Namísto pevného uzlu zařízení pÅ™ipojovat pomocí UUID" ++ ++msgid "" ++"If specified, mount the device by the partition label instead of a fixed " ++"device node" ++msgstr "Namísto pevného uzlu zařízení pÅ™ipojovat pomocí názvu oddílu" ++ ++msgid "If unchecked, no default route is configured" ++msgstr "Pokud není povoleno, není nastaven žádný výchozí smÄ›rovací záznam" ++ ++msgid "If unchecked, the advertised DNS server addresses are ignored" ++msgstr "Pokud není povoleno, oznámené adresy DNS serverů budou ignorovány" ++ ++msgid "" ++"If your physical memory is insufficient unused data can be temporarily " ++"swapped to a swap-device resulting in a higher amount of usable RAM. Be aware that swapping data is a very " ++"slow process as the swap-device cannot be accessed with the high datarates " ++"of the RAM." ++msgstr "" ++"Pokud máte nedostatek fyzické pamÄ›ti, nepoužívaná data mohou být doÄasnÄ› " ++"odložena do odkládacího zařízení, což bude mít za důsledek vÄ›tší množství " ++"použitelné RAM. VezmÄ›te na " ++"vÄ›domí, že odkládání dat je velice pomalý proces, stejnÄ› jako fakt, že " ++"přístup na odkládací zařízení je řádovÄ› pomalejší, než přístup do pamÄ›ti " ++"RAM." ++ ++msgid "Ignore Hosts files" ++msgstr "Ignorovat soubory Hosts" ++ ++msgid "Ignore interface" ++msgstr "Ignorovat rozhraní" ++ ++msgid "Ignore resolve file" ++msgstr "Ignorovat resolv soubor" ++ ++msgid "Image" ++msgstr "Obraz" ++ ++msgid "In" ++msgstr "DovnitÅ™" ++ ++msgid "Inactivity timeout" ++msgstr "ÄŒasový limit neÄinnosti" ++ ++msgid "Inbound:" ++msgstr "Příchozí:" ++ ++msgid "Info" ++msgstr "Info" ++ ++msgid "Initscript" ++msgstr "Initskript" ++ ++msgid "Initscripts" ++msgstr "Initskripty" ++ ++msgid "Install" ++msgstr "Instalovat" ++ ++msgid "Install iputils-traceroute6 for IPv6 traceroute" ++msgstr "" ++ ++msgid "Install package %q" ++msgstr "Instalovat balíÄek %q" ++ ++msgid "Install protocol extensions..." ++msgstr "Instalovat protokolové rozšíření..." ++ ++msgid "Installed packages" ++msgstr "Nainstalované balíÄky" ++ ++msgid "Interface" ++msgstr "Rozhraní" ++ ++msgid "Interface Configuration" ++msgstr "Konfigurace rozhraní" ++ ++msgid "Interface Overview" ++msgstr "PÅ™ehled rozhraní" ++ ++msgid "Interface is reconnecting..." ++msgstr "Rozhraní se znovu pÅ™ipojuje..." ++ ++msgid "Interface is shutting down..." ++msgstr "Rozhraní se vypíná..." ++ ++msgid "Interface not present or not connected yet." ++msgstr "Rozhraní není přítomné nebo je dosud nepÅ™ipojeno." ++ ++msgid "Interface reconnected" ++msgstr "Rozhraní bylo znovu pÅ™ipojeno" ++ ++msgid "Interface shut down" ++msgstr "Rozhraní bylo vypnuto" ++ ++msgid "Interfaces" ++msgstr "Rozhraní" ++ ++msgid "Internal" ++msgstr "" ++ ++# Není co dodat. ++msgid "Internal Server Error" ++msgstr "VnitÅ™ní chyba serveru" ++ ++msgid "Invalid" ++msgstr "Neplatná vstupní hodnota" ++ ++msgid "Invalid VLAN ID given! Only IDs between %d and %d are allowed." ++msgstr "" ++"Uvedené VLAN ID je neplatné! Jsou povolena pouze ID z rozsahu %d až %d." ++ ++msgid "Invalid VLAN ID given! Only unique IDs are allowed" ++msgstr "Uvedené VLAN ID je neplatné! Každé ID musí být jedineÄné" ++ ++msgid "Invalid username and/or password! Please try again." ++msgstr "Å patné uživatelské jméno a/nebo heslo! Prosím zkuste to znovu." ++ ++#, fuzzy ++msgid "" ++"It appears that you are trying to flash an image that does not fit into the " ++"flash memory, please verify the image file!" ++msgstr "" ++"Zdá se, že se pokoušíte zapsat obraz, který se nevejde do flash pamÄ›ti. " ++"Prosím ověřte soubor s obrazem!" ++ ++msgid "Java Script required!" ++msgstr "Vyžadován JavaScript!" ++ ++msgid "Join Network" ++msgstr "PÅ™ipojit k síti" ++ ++msgid "Join Network: Settings" ++msgstr "PÅ™ipojit k síti: nastavení" ++ ++msgid "Join Network: Wireless Scan" ++msgstr "PÅ™ipojit k síti: Vyhledání bezdrátových sítí" ++ ++msgid "Keep settings" ++msgstr "Zachovat nastavení" ++ ++msgid "Kernel Log" ++msgstr "Záznam jádra" ++ ++msgid "Kernel Version" ++msgstr "Verze jádra" ++ ++msgid "Key" ++msgstr "KlíÄ" ++ ++msgid "Key #%d" ++msgstr "KlÃ­Ä #%d" ++ ++msgid "Kill" ++msgstr "Zabít" ++ ++msgid "L2TP" ++msgstr "L2TP" ++ ++msgid "L2TP Server" ++msgstr "L2TP Server" ++ ++msgid "LCP echo failure threshold" ++msgstr "LCP echo prahová hodnota selhání" ++ ++msgid "LCP echo interval" ++msgstr "LCP interval upozornÄ›ní" ++ ++msgid "LLC" ++msgstr "LLC" ++ ++msgid "Label" ++msgstr "Popis" ++ ++msgid "Language" ++msgstr "Jazyk" ++ ++msgid "Language and Style" ++msgstr "Jazyk a styl" ++ ++msgid "Leaf" ++msgstr "" ++ ++msgid "Lease validity time" ++msgstr "Doba platnosti zápůjÄky" ++ ++msgid "Leasefile" ++msgstr "Soubor zájpůjÄek" ++ ++msgid "Leasetime" ++msgstr "Doba trvání zápůjÄky" ++ ++msgid "Leasetime remaining" ++msgstr "Zbývající doba trvání zápůjÄky" ++ ++msgid "Leave empty to autodetect" ++msgstr "Ponechte prázdné pro automatickou detekci" ++ ++msgid "Leave empty to use the current WAN address" ++msgstr "Ponecháte-li prázdné, použije stávající WAN adresu" ++ ++msgid "Legend:" ++msgstr "Legenda:" ++ ++msgid "Limit" ++msgstr "Limit" ++ ++msgid "Line Attenuation" ++msgstr "" ++ ++msgid "Line Speed" ++msgstr "" ++ ++msgid "Line State" ++msgstr "" ++ ++msgid "Link On" ++msgstr "Odkaz na" ++ ++msgid "" ++"List of DNS servers to forward " ++"requests to" ++msgstr "" ++"Seznam DNS serverů, na které " ++"pÅ™eposílat požadavky" ++ ++msgid "List of domains to allow RFC1918 responses for" ++msgstr "Seznam domén, pro které povolit odpovÄ›di podle RFC1918" ++ ++msgid "List of hosts that supply bogus NX domain results" ++msgstr "Seznam hostitelů, kteří udávají faleÅ¡né hodnoty NX domén" ++ ++msgid "Listen only on the given interface or, if unspecified, on all" ++msgstr "" ++"Poslouchat pouze na daném rozhraní, nebo pokud není specifikováno, na vÅ¡ech" ++ ++msgid "Listening port for inbound DNS queries" ++msgstr "Port pro příchozí dotazy DNS" ++ ++msgid "Load" ++msgstr "Zátěž" ++ ++msgid "Load Average" ++msgstr "Zátěž průmÄ›rná" ++ ++msgid "Loading" ++msgstr "NaÄítání" ++ ++msgid "Local IPv4 address" ++msgstr "Místní IPv4 adresa" ++ ++msgid "Local IPv6 address" ++msgstr "Místní IPv6 adresa" ++ ++msgid "Local Startup" ++msgstr "Místní startup" ++ ++msgid "Local Time" ++msgstr "Místní Äas" ++ ++msgid "Local domain" ++msgstr "Místní doména" ++ ++#, fuzzy ++msgid "" ++"Local domain specification. Names matching this domain are never forwarded " ++"and are resolved from DHCP or hosts files only" ++msgstr "" ++"Specifikace místní domény. Jména shodná s touto doménou nikdy nebudou " ++"pÅ™esmÄ›rována ani rozluÅ¡Å¥ována pomocí DHCP nebo souborů hosts" ++ ++msgid "Local domain suffix appended to DHCP names and hosts file entries" ++msgstr "" ++"Přípona místní domény, pÅ™ipojená za názvy DHCP jmen a záznamů v souboru hosts" ++ ++msgid "Local server" ++msgstr "Místní server" ++ ++msgid "" ++"Localise hostname depending on the requesting subnet if multiple IPs are " ++"available" ++msgstr "" ++"Lokalizovat jméno v závislosti na dotazující se podsíti, pokud bylo nalezeno " ++"více IP adres" ++ ++msgid "Localise queries" ++msgstr "LokalizaÄní dotazy" ++ ++msgid "Locked to channel %d used by: %s" ++msgstr "" ++ ++msgid "Log output level" ++msgstr "Úroveň logování" ++ ++msgid "Log queries" ++msgstr "Dotazy pro logování" ++ ++msgid "Logging" ++msgstr "Logování" ++ ++msgid "Login" ++msgstr "PÅ™ihlásit" ++ ++msgid "Logout" ++msgstr "Odhlásit" ++ ++msgid "Lowest leased address as offset from the network address." ++msgstr "Nejnižší zapůjÄenou adresu použít jako offset síťové adresy." ++ ++msgid "MAC-Address" ++msgstr "MAC-Adresa" ++ ++msgid "MAC-Address Filter" ++msgstr "Filtr MAC adres" ++ ++msgid "MAC-Filter" ++msgstr "Filtr MAC" ++ ++msgid "MAC-List" ++msgstr "Seznam Mac" ++ ++msgid "MB/s" ++msgstr "MB/s" ++ ++msgid "MHz" ++msgstr "MHz" ++ ++msgid "MTU" ++msgstr "MTU" ++ ++msgid "" ++"Make sure to clone the root filesystem using something like the commands " ++"below:" ++msgstr "" ++ ++msgid "Maximum Rate" ++msgstr "Nejvyšší míra" ++ ++msgid "Maximum allowed number of active DHCP leases" ++msgstr "Nejvyšší povolené množství aktivních DHCP zápůjÄek" ++ ++msgid "Maximum allowed number of concurrent DNS queries" ++msgstr "Nejvyšší povolené množství souběžných DNS dotazů" ++ ++msgid "Maximum allowed size of EDNS.0 UDP packets" ++msgstr "Nejvyšší povolená velikost EDNS.0 UDP paketů" ++ ++msgid "Maximum amount of seconds to wait for the modem to become ready" ++msgstr "Nejvyšší poÄet sekund Äekání, než bude modem pÅ™ipraven" ++ ++msgid "Maximum hold time" ++msgstr "Maximální doba držení" ++ ++msgid "Maximum number of leased addresses." ++msgstr "Maximální poÄet zapůjÄených adres." ++ ++msgid "Mbit/s" ++msgstr "Mbit/s" ++ ++msgid "Memory" ++msgstr "Paměť" ++ ++msgid "Memory usage (%)" ++msgstr "Využití pamÄ›ti (%)" ++ ++msgid "Metric" ++msgstr "Metrika" ++ ++msgid "Minimum Rate" ++msgstr "Nejnižší hodnota" ++ ++msgid "Minimum hold time" ++msgstr "Minimální Äas zápůjÄky" ++ ++msgid "Mirror monitor port" ++msgstr "" ++ ++msgid "Mirror source port" ++msgstr "" ++ ++msgid "Missing protocol extension for proto %q" ++msgstr "ChybÄ›jící rozšíření protokolu %q" ++ ++msgid "Mode" ++msgstr "Mód" ++ ++msgid "Model" ++msgstr "" ++ ++msgid "Modem device" ++msgstr "Modemové zařízení" ++ ++msgid "Modem init timeout" ++msgstr "ÄŒasový limit inicializace modemu" ++ ++msgid "Monitor" ++msgstr "Sledování" ++ ++msgid "Mount Entry" ++msgstr "PÅ™ipojit vstup" ++ ++msgid "Mount Point" ++msgstr "Přípojný bod" ++ ++msgid "Mount Points" ++msgstr "Přípojné body" ++ ++msgid "Mount Points - Mount Entry" ++msgstr "Přípojné body - vstupy" ++ ++msgid "Mount Points - Swap Entry" ++msgstr "Přípojné body - zmÄ›na vstupu" ++ ++msgid "" ++"Mount Points define at which point a memory device will be attached to the " ++"filesystem" ++msgstr "" ++"Přípojný bod urÄuje místo v souborovém systému, na kterém bude pÅ™ipojeno " ++"paměťové zařízení" ++ ++msgid "Mount options" ++msgstr "Volby pÅ™ipojení" ++ ++msgid "Mount point" ++msgstr "Přípojný bod" ++ ++msgid "Mounted file systems" ++msgstr "PÅ™ipojené souborové systémy" ++ ++msgid "Move down" ++msgstr "PÅ™esunout dolů" ++ ++msgid "Move up" ++msgstr "PÅ™esunout nahoru" ++ ++msgid "Multicast Rate" ++msgstr "Hodnota vícesmÄ›rového vysílání" ++ ++msgid "Multicast address" ++msgstr "Adresa vícesmÄ›rového vysílání" ++ ++msgid "NAS ID" ++msgstr "NAS ID" ++ ++msgid "NDP-Proxy" ++msgstr "" ++ ++msgid "NTP server candidates" ++msgstr "Kandidáti NTP serveru" ++ ++msgid "NTP sync time-out" ++msgstr "" ++ ++msgid "Name" ++msgstr "Název" ++ ++msgid "Name of the new interface" ++msgstr "Název nového rozhraní" ++ ++msgid "Name of the new network" ++msgstr "Název nové sítÄ›" ++ ++msgid "Navigation" ++msgstr "Navigace" ++ ++msgid "Netmask" ++msgstr "Síťová maska" ++ ++msgid "Network" ++msgstr "Síť" ++ ++msgid "Network Utilities" ++msgstr "Síťové nástroje" ++ ++msgid "Network boot image" ++msgstr "Síťový bootovací obraz" ++ ++msgid "Network without interfaces." ++msgstr "Síť bez rozhraní." ++ ++msgid "Next »" ++msgstr "Další »" ++ ++msgid "No DHCP Server configured for this interface" ++msgstr "Pro toto rozhraní není nastaven žádný DHCP server" ++ ++msgid "No chains in this table" ++msgstr "Žádné Å™etÄ›zce v této tabulce" ++ ++msgid "No files found" ++msgstr "Nebyly nalezeny žádné soubory" ++ ++msgid "No information available" ++msgstr "Údaje nejsou k dispozici" ++ ++msgid "No negative cache" ++msgstr "Žádná negativní mezipaměť" ++ ++msgid "No network configured on this device" ++msgstr "Síť není nastavena na tomto zařízení" ++ ++msgid "No network name specified" ++msgstr "Neuvedeno jméno sítÄ›" ++ ++msgid "No package lists available" ++msgstr "Seznam balíÄků není k dispozici" ++ ++msgid "No password set!" ++msgstr "Žádné heslo!" ++ ++msgid "No rules in this chain" ++msgstr "Žádná pravidla v tomto Å™etÄ›zci" ++ ++msgid "No zone assigned" ++msgstr "Žádná zóna nepÅ™iÅ™azena" ++ ++msgid "Noise" ++msgstr "Å um" ++ ++msgid "Noise Margin" ++msgstr "" ++ ++msgid "Noise:" ++msgstr "Å um:" ++ ++msgid "None" ++msgstr "Žádný" ++ ++msgid "Normal" ++msgstr "Normální" ++ ++msgid "Not Found" ++msgstr "Nenalezeno" ++ ++msgid "Not associated" ++msgstr "Neasociováno" ++ ++msgid "Not connected" ++msgstr "NepÅ™ipojeno" ++ ++msgid "Note: Configuration files will be erased." ++msgstr "Pozn: KonfiguraÄní soubory budou vymazány." ++ ++msgid "Notice" ++msgstr "Oznámení" ++ ++msgid "Nslookup" ++msgstr "Nslookup" ++ ++msgid "OK" ++msgstr "OK" ++ ++msgid "OPKG-Configuration" ++msgstr "Konfigurace balíÄků OPKG" ++ ++msgid "Off-State Delay" ++msgstr "Vypnutí prodlevy" ++ ++msgid "" ++"On this page you can configure the network interfaces. You can bridge " ++"several interfaces by ticking the \"bridge interfaces\" field and enter the " ++"names of several network interfaces separated by spaces. You can also use " ++"VLAN notation " ++"INTERFACE.VLANNR (e.g.: " ++"eth0.1)." ++msgstr "" ++"Na této stránce můžete nastavit síťová rozhraní. Můžete pÅ™emostit nÄ›kolik " ++"rozhraní zaÅ¡krtnutím pole \"pÅ™emostit rozhraní\" a zápisem názvů rozhraní, " ++"vzájemnÄ› oddÄ›lených mezerami. Také můžete použít VLAN zápis INTERFACE.VLANNR (napÅ™.: eth0.1)." ++ ++msgid "On-State Delay" ++msgstr "Zapnutí prodlevy" ++ ++msgid "One of hostname or mac address must be specified!" ++msgstr "Jedno jméno nebo mac adresa, musí být zadáno!" ++ ++msgid "One or more fields contain invalid values!" ++msgstr "Jedno nebo více polí obsahuje neplatné hodnoty!" ++ ++msgid "One or more required fields have no value!" ++msgstr "Jedno nebo více požadovaných polí neobsahuje hodnotu!" ++ ++msgid "Open list..." ++msgstr "Otevřít seznam..." ++ ++msgid "OpenConnect (CISCO AnyConnect)" ++msgstr "" ++ ++msgid "Operating frequency" ++msgstr "" ++ ++msgid "Option changed" ++msgstr "Volba zmÄ›nÄ›na" ++ ++msgid "Option removed" ++msgstr "Volba odstranÄ›na" ++ ++msgid "Optional, specify to override default server (tic.sixxs.net)" ++msgstr "" ++ ++msgid "Optional, use when the SIXXS account has more than one tunnel" ++msgstr "" ++ ++msgid "Options" ++msgstr "Možnosti" ++ ++msgid "Other:" ++msgstr "Ostatní:" ++ ++msgid "Out" ++msgstr "Ven" ++ ++msgid "Outbound:" ++msgstr "Odchozí:" ++ ++msgid "Outdoor Channels" ++msgstr "Venkovní kanály" ++ ++msgid "Output Interface" ++msgstr "" ++ ++msgid "Override MAC address" ++msgstr "PÅ™epsat MAC adresu" ++ ++msgid "Override MTU" ++msgstr "PÅ™epsat MTU" ++ ++msgid "Override the gateway in DHCP responses" ++msgstr "PÅ™epsat bránu v DHCP odpovÄ›dích" ++ ++msgid "" ++"Override the netmask sent to clients. Normally it is calculated from the " ++"subnet that is served." ++msgstr "" ++"PÅ™epsat síťovou masku, odesílanou klientům. Obvykle je spoÄítána podle " ++"subsítÄ›, která je obsluhována." ++ ++msgid "Override the table used for internal routes" ++msgstr "PÅ™epsat tabulku, používanou pro vnitÅ™ní cesty" ++ ++msgid "Overview" ++msgstr "PÅ™ehled" ++ ++msgid "Owner" ++msgstr "Vlastník" ++ ++msgid "PAP/CHAP password" ++msgstr "Heslo PAP/CHAP" ++ ++msgid "PAP/CHAP username" ++msgstr "Uživatelské jméno PAP/CHAP" ++ ++msgid "PID" ++msgstr "PID" ++ ++msgid "PIN" ++msgstr "PIN" ++ ++msgid "PPP" ++msgstr "PPP" ++ ++msgid "PPPoA Encapsulation" ++msgstr "ZapouzdÅ™ení PPPoA" ++ ++msgid "PPPoATM" ++msgstr "PPPoATM" ++ ++msgid "PPPoE" ++msgstr "PPPoE" ++ ++msgid "PPtP" ++msgstr "PPtP" ++ ++msgid "Package libiwinfo required!" ++msgstr "Vyžadován balíÄek libiwinfo!" ++ ++msgid "Package lists are older than 24 hours" ++msgstr "Seznamy balíÄků jsou starší než 24 hodin" ++ ++msgid "Package name" ++msgstr "Název balíÄku" ++ ++msgid "Packets" ++msgstr "Pakety" ++ ++msgid "Part of zone %q" ++msgstr "Část zóny %q" ++ ++msgid "Password" ++msgstr "Heslo" ++ ++msgid "Password authentication" ++msgstr "Autentizace heslem" ++ ++msgid "Password of Private Key" ++msgstr "Heslo privátního klíÄe" ++ ++msgid "Password successfully changed!" ++msgstr "Heslo bylo úspěšnÄ› zmÄ›nÄ›no!" ++ ++msgid "Path" ++msgstr "" ++ ++msgid "Path to CA-Certificate" ++msgstr "Cesta k certifikátu CA" ++ ++msgid "Path to Client-Certificate" ++msgstr "Cesta k certifikátu klienta" ++ ++msgid "Path to Private Key" ++msgstr "Cesta k privátnímu klíÄi" ++ ++msgid "Path to executable which handles the button event" ++msgstr "Cesta ke spustitelnému souboru, který obsluhuje událost tlaÄítka" ++ ++msgid "Peak:" ++msgstr "Å piÄka:" ++ ++msgid "Perform reboot" ++msgstr "Provést restart" ++ ++msgid "Perform reset" ++msgstr "Provést reset" ++ ++msgid "Phy Rate:" ++msgstr "Fyzická rychlost:" ++ ++msgid "Physical Settings" ++msgstr "Fyzické nastavení" ++ ++msgid "Ping" ++msgstr "Ping" ++ ++msgid "Pkts." ++msgstr "Paketů" ++ ++msgid "Please enter your username and password." ++msgstr "Prosím vložte vaÅ¡e uživatelské jméno a heslo." ++ ++msgid "Please wait: Device rebooting..." ++msgstr "Prosím poÄkejte: Provádím reboot..." ++ ++msgid "Policy" ++msgstr "Politika" ++ ++msgid "Port" ++msgstr "Port" ++ ++msgid "Port %d" ++msgstr "Port %d" ++ ++msgid "Port %d is untagged in multiple VLANs!" ++msgstr "Port %d je neoznaÄený ve více VLAN!" ++ ++msgid "Port status:" ++msgstr "Stav portu:" ++ ++msgid "" ++"Presume peer to be dead after given amount of LCP echo failures, use 0 to " ++"ignore failures" ++msgstr "" ++"Po takovém množství LCP echo selhání pÅ™edpokládám, že peer je mrtvý. " ++"Použijte 0 pro ignorování chyb" ++ ++msgid "Prevents client-to-client communication" ++msgstr "Zabraňuje komunikaci klient-klient" ++ ++msgid "Prism2/2.5/3 802.11b Wireless Controller" ++msgstr "Prism2/2.5/3 802.11b Wireless Controller" ++ ++msgid "Proceed" ++msgstr "PokraÄovat" ++ ++msgid "Processes" ++msgstr "Procesy" ++ ++msgid "Prot." ++msgstr "Prot." ++ ++msgid "Protocol" ++msgstr "Protokol" ++ ++msgid "Protocol family" ++msgstr "Rodina protokolů" ++ ++msgid "Protocol of the new interface" ++msgstr "Protokol nového rozhraní" ++ ++msgid "Protocol support is not installed" ++msgstr "Podpora pro protokol není nainstalována" ++ ++msgid "Provide NTP server" ++msgstr "Poskytování NTP serveru" ++ ++msgid "Provide new network" ++msgstr "Poskytování nové sítÄ›" ++ ++msgid "Pseudo Ad-Hoc (ahdemo)" ++msgstr "Pseudo Ad-Hoc (ahdemo)" ++ ++msgid "Public prefix routed to this device for distribution to clients." ++msgstr "" ++ ++msgid "Quality" ++msgstr "Kvalita" ++ ++msgid "RTS/CTS Threshold" ++msgstr "Práh RTS/CTS" ++ ++msgid "RX" ++msgstr "RX" ++ ++msgid "RX Rate" ++msgstr "RX Rate" ++ ++msgid "RaLink 802.11%s Wireless Controller" ++msgstr "RaLink 802.11%s Wireless Controller" ++ ++msgid "Radius-Accounting-Port" ++msgstr "Port pro Radius-Accounting" ++ ++msgid "Radius-Accounting-Secret" ++msgstr "Tajný klÃ­Ä pro Radius-Accounting" ++ ++msgid "Radius-Accounting-Server" ++msgstr "Server Radius-Accounting" ++ ++msgid "Radius-Authentication-Port" ++msgstr "VýbÄ›r ověřování portů" ++ ++msgid "Radius-Authentication-Secret" ++msgstr "Tajný klÃ­Ä pro Radius-Authentication" ++ ++msgid "Radius-Authentication-Server" ++msgstr "Server Radius-Authentication" ++ ++msgid "" ++"Read /etc/ethers to configure the DHCP-Server" ++msgstr "" ++"PÅ™eÄtÄ›te si /etc/ethers ke konfiguraci DHCP Serveru" ++ ++msgid "" ++"Really delete this interface? The deletion cannot be undone!\\nYou might " ++"lose access to this device if you are connected via this interface." ++msgstr "" ++"Opravdu odstranit toto rozhraní? OdstranÄ›ní nelze vrátit zpÄ›t!\n" ++"Můžete ztratit přístup k zařízení, pokud jste pÅ™ipojeni prostÅ™ednictvím " ++"tohoto rozhraní." ++ ++msgid "" ++"Really delete this wireless network? The deletion cannot be undone!\\nYou " ++"might lose access to this device if you are connected via this network." ++msgstr "" ++"Opravdu odstranit bezdrátovou síť? OdstranÄ›ní nelze vrátit zpÄ›t!\n" ++"Můžete ztratit přístup k zařízení, pokud jste pÅ™ipojeni prostÅ™ednictvím této " ++"sítÄ›." ++ ++msgid "Really reset all changes?" ++msgstr "Opravdu resetovat vÅ¡echny zmÄ›ny?" ++ ++#, fuzzy ++msgid "" ++"Really shut down network?\\nYou might lose access to this device if you are " ++"connected via this interface." ++msgstr "" ++"Opravdu vypnout síť ?\n" ++"Můžete ztratit přístup k zařízení, pokud jste pÅ™ipojeni prostÅ™ednictvím " ++"tohoto rozhraní." ++ ++msgid "" ++"Really shutdown interface \"%s\" ?\\nYou might lose access to this device if " ++"you are connected via this interface." ++msgstr "" ++"Opravdu vypnout rozhraní \"%s\" ?\n" ++"Můžete ztratit přístup k zařízení, pokud jste pÅ™ipojeni prostÅ™ednictvím " ++"tohoto rozhraní." ++ ++msgid "Really switch protocol?" ++msgstr "Opravdu prohodit protokol?" ++ ++msgid "Realtime Connections" ++msgstr "PÅ™ipojení v reálném Äase" ++ ++msgid "Realtime Graphs" ++msgstr "Grafy v reálném Äase" ++ ++msgid "Realtime Load" ++msgstr "Zátěž v reálném Äase" ++ ++msgid "Realtime Traffic" ++msgstr "Provoz v reálném Äase" ++ ++msgid "Realtime Wireless" ++msgstr "Wireless v reálném Äase" ++ ++msgid "Rebind protection" ++msgstr "OpÄ›tovné nastavení ochrany" ++ ++msgid "Reboot" ++msgstr "Reboot" ++ ++msgid "Rebooting..." ++msgstr "Rebootuji..." ++ ++msgid "Reboots the operating system of your device" ++msgstr "Rebootuje operaÄní systém vaÅ¡eho zařízení" ++ ++msgid "Receive" ++msgstr "PÅ™ijmout" ++ ++msgid "Receiver Antenna" ++msgstr "PÅ™ijímací anténa" ++ ++msgid "Reconnect this interface" ++msgstr "PÅ™epojit toto rozhraní" ++ ++msgid "Reconnecting interface" ++msgstr "PÅ™epojuji rozhraní" ++ ++msgid "References" ++msgstr "Reference" ++ ++msgid "Regulatory Domain" ++msgstr "Doména regulátora" ++ ++msgid "Relay" ++msgstr "PÅ™enos" ++ ++msgid "Relay Bridge" ++msgstr "" ++ ++msgid "Relay between networks" ++msgstr "PÅ™enášet mezi sítÄ›mi" ++ ++msgid "Relay bridge" ++msgstr "" ++ ++msgid "Remote IPv4 address" ++msgstr "Vzdálená IPv4 adresa" ++ ++msgid "Remove" ++msgstr "Odstranit" ++ ++msgid "Repeat scan" ++msgstr "Opakovat skenování" ++ ++msgid "Replace entry" ++msgstr "Nahradit vstup" ++ ++msgid "Replace wireless configuration" ++msgstr "Nahradit bezdrátovou konfiguraci" ++ ++msgid "Request IPv6-address" ++msgstr "" ++ ++msgid "Request IPv6-prefix of length" ++msgstr "" ++ ++msgid "Require TLS" ++msgstr "" ++ ++# Charter je poskytovate ++msgid "Required for certain ISPs, e.g. Charter with DOCSIS 3" ++msgstr "Vyžadováno u nÄ›kterých ISP, napÅ™. Charter s DocSIS 3" ++ ++msgid "Reset" ++msgstr "Reset" ++ ++msgid "Reset Counters" ++msgstr "Resetovat ÄítaÄe" ++ ++msgid "Reset to defaults" ++msgstr "Obnovit na výchozí" ++ ++msgid "Resolv and Hosts Files" ++msgstr "Soubory Resolv a Hosts" ++ ++msgid "Resolve file" ++msgstr "Soubor resolve" ++ ++msgid "Restart" ++msgstr "Restart" ++ ++msgid "Restart Firewall" ++msgstr "Restartovat firewall" ++ ++msgid "Restore backup" ++msgstr "Obnovit zálohu" ++ ++msgid "Reveal/hide password" ++msgstr "Odhalit/skrýt heslo" ++ ++msgid "Revert" ++msgstr "Vrátit zpÄ›t" ++ ++msgid "Root" ++msgstr "Root" ++ ++msgid "Root directory for files served via TFTP" ++msgstr "KoÅ™enový adresář souborů, přístupných pÅ™es TFTP" ++ ++msgid "Root preparation" ++msgstr "" ++ ++msgid "Routed IPv6 prefix for downstream interfaces" ++msgstr "" ++ ++msgid "Router Advertisement-Service" ++msgstr "" ++ ++msgid "Router Password" ++msgstr "Heslo routeru" ++ ++msgid "Routes" ++msgstr "Trasy" ++ ++msgid "" ++"Routes specify over which interface and gateway a certain host or network " ++"can be reached." ++msgstr "" ++"Trasy urÄují, pÅ™es jaké rozhraní a bránu může být konkrétního hosta dosaženo." ++ ++msgid "Rule #" ++msgstr "Pravidlo #" ++ ++msgid "Run a filesystem check before mounting the device" ++msgstr "Spustit kontrolu souborového systému pÅ™ed pÅ™ipojením zařízení" ++ ++msgid "Run filesystem check" ++msgstr "Spustit kontrolu souborového systému" ++ ++msgid "" ++"SIXXS supports TIC only, for static tunnels using IP protocol 41 (RFC4213) " ++"use 6in4 instead" ++msgstr "" ++ ++msgid "SIXXS-handle[/Tunnel-ID]" ++msgstr "" ++ ++msgid "SSH Access" ++msgstr "Přístup pÅ™es SSH" ++ ++msgid "SSH-Keys" ++msgstr "SSH klíÄe" ++ ++msgid "SSID" ++msgstr "SSID" ++ ++msgid "Save" ++msgstr "Uložit" ++ ++msgid "Save & Apply" ++msgstr "Uložit & použít" ++ ++msgid "Save & Apply" ++msgstr "Uložit & použít" ++ ++msgid "Scan" ++msgstr "Skenovat" ++ ++msgid "Scheduled Tasks" ++msgstr "Naplánované úlohy" ++ ++msgid "Section added" ++msgstr "PÅ™idána sekce" ++ ++msgid "Section removed" ++msgstr "Sekce odebrána" ++ ++msgid "See \"mount\" manpage for details" ++msgstr "Podrobnosti viz manuálová stránka příkazu \"mount\"" ++ ++msgid "" ++"Send LCP echo requests at the given interval in seconds, only effective in " ++"conjunction with failure threshold" ++msgstr "" ++"Odesílat LCP echo požadaveky každých x sekund, úÄinné pouze ve spojení s " ++"prahem selhání." ++ ++msgid "Separate Clients" ++msgstr "OddÄ›lovat klienty" ++ ++msgid "Separate WDS" ++msgstr "OddÄ›lovat WDS" ++ ++msgid "Server Settings" ++msgstr "Nastavení serveru" ++ ++msgid "Server password" ++msgstr "" ++ ++msgid "" ++"Server password, enter the specific password of the tunnel when the username " ++"contains the tunnel ID" ++msgstr "" ++ ++msgid "Server username" ++msgstr "" ++ ++msgid "Service Name" ++msgstr "Název služby" ++ ++msgid "Service Type" ++msgstr "Typ služby" ++ ++msgid "Services" ++msgstr "Služby" ++ ++#, fuzzy ++msgid "Set up Time Synchronization" ++msgstr "Nastavit synchronizaci Äasu" ++ ++msgid "Setup DHCP Server" ++msgstr "Nastavit DHCP server" ++ ++msgid "Show current backup file list" ++msgstr "Ukázat aktuální seznam záložních souborů" ++ ++msgid "Shutdown this interface" ++msgstr "Shodit toho rozhraní" ++ ++msgid "Shutdown this network" ++msgstr "Shodit tuto síť" ++ ++msgid "Signal" ++msgstr "Signál" ++ ++msgid "Signal:" ++msgstr "Signál:" ++ ++msgid "Size" ++msgstr "Velikost" ++ ++msgid "Skip" ++msgstr "PÅ™eskoÄit" ++ ++msgid "Skip to content" ++msgstr "SkoÄit na obsah" ++ ++msgid "Skip to navigation" ++msgstr "SkoÄit na navigaci" ++ ++msgid "Slot time" ++msgstr "Time sloty" ++ ++msgid "Software" ++msgstr "Software" ++ ++msgid "Some fields are invalid, cannot save values!" ++msgstr "NÄ›která pole obsahují neplatné hodnoty, nelze uložit!" ++ ++msgid "Sorry, the object you requested was not found." ++msgstr "Omlouváme se, ale požadovaný objekt nebyl nalezen." ++ ++msgid "Sorry, the server encountered an unexpected error." ++msgstr "Omlouváme se, na serveru doÅ¡lo k neoÄekávané vyjímce." ++ ++#, fuzzy ++msgid "" ++"Sorry, there is no sysupgrade support present; a new firmware image must be " ++"flashed manually. Please refer to the OpenWrt wiki for device specific " ++"install instructions." ++msgstr "" ++"Omlouváme se, ale v tomto zařízení není přítomná podpora pro upgrade " ++"systému. Nový obraz firmwaru musí být zapsán ruÄnÄ›. Prosím, obraÅ¥te se na " ++"OpenWRT wiki pro zařízení specifické instalaÄní instrukce." ++ ++msgid "Sort" ++msgstr "SeÅ™adit" ++ ++msgid "Source" ++msgstr "Zdroj" ++ ++msgid "Source routing" ++msgstr "" ++ ++msgid "Specifies the button state to handle" ++msgstr "" ++ ++msgid "Specifies the directory the device is attached to" ++msgstr "" ++ ++msgid "Specifies the listening port of this Dropbear instance" ++msgstr "UrÄuje port na kterém bude tato instance Dropbearu naslouchat" ++ ++msgid "" ++"Specifies the maximum amount of failed ARP requests until hosts are presumed " ++"to be dead" ++msgstr "" ++"UrÄuje množství neúspěšných ARP požadavků, po kterém je hostitel považován " ++"za mrtvého" ++ ++msgid "" ++"Specifies the maximum amount of seconds after which hosts are presumed to be " ++"dead" ++msgstr "UrÄuje poÄet sekund, po kterém je hostitel považovám za mrtvého" ++ ++msgid "Specify the secret encryption key here." ++msgstr "Zde nastavte soukromý Å¡ifrovací klíÄ." ++ ++msgid "Start" ++msgstr "Start" ++ ++msgid "Start priority" ++msgstr "Priorita spouÅ¡tÄ›ní" ++ ++msgid "Startup" ++msgstr "Po spuÅ¡tÄ›ní" ++ ++msgid "Static IPv4 Routes" ++msgstr "Statické IPv4 trasy" ++ ++msgid "Static IPv6 Routes" ++msgstr "Statické IPv6 trasy" ++ ++msgid "Static Leases" ++msgstr "Statické zápůjÄky" ++ ++msgid "Static Routes" ++msgstr "Statické trasy" ++ ++msgid "Static WDS" ++msgstr "Statický WDS" ++ ++msgid "Static address" ++msgstr "Statická adresa" ++ ++msgid "" ++"Static leases are used to assign fixed IP addresses and symbolic hostnames " ++"to DHCP clients. They are also required for non-dynamic interface " ++"configurations where only hosts with a corresponding lease are served." ++msgstr "" ++"Statické zápůjÄky se používají pro pÅ™iÅ™azení fixních IP adres a symbolických " ++"jmen DHCP klientům. Jsou také vyžadvány pro nedynamické konfigurace " ++"rozhraní, kde jsou povoleni pouze hosté s odpovídajícím nastavením." ++ ++msgid "Status" ++msgstr "Stav" ++ ++msgid "Stop" ++msgstr "Stop" ++ ++msgid "Strict order" ++msgstr "Striktní výbÄ›r" ++ ++msgid "Submit" ++msgstr "Odeslat" ++ ++msgid "Swap" ++msgstr "" ++ ++msgid "Swap Entry" ++msgstr "Vstupní bod" ++ ++msgid "Switch" ++msgstr "SmÄ›rovaÄ" ++ ++msgid "Switch %q" ++msgstr "SmÄ›rovaÄ Äíslo %q" ++ ++msgid "Switch %q (%s)" ++msgstr "SmÄ›rovaÄ Äíslo %q (%s)" ++ ++msgid "Switch protocol" ++msgstr "SmÄ›rovací protokol" ++ ++msgid "Sync with browser" ++msgstr "Synchronizovat s prohlížeÄem" ++ ++msgid "Synchronizing..." ++msgstr "Synchronizuji..." ++ ++msgid "System" ++msgstr "Systém" ++ ++msgid "System Log" ++msgstr "Systémový log" ++ ++msgid "System Properties" ++msgstr "Vlastnosti systému" ++ ++msgid "System log buffer size" ++msgstr "Velikost bufferu systémového logu" ++ ++msgid "TCP:" ++msgstr "TCP:" ++ ++msgid "TFTP Settings" ++msgstr "Nastavení TFTP" ++ ++msgid "TFTP server root" ++msgstr "KoÅ™enový adresář TFTP serveru" ++ ++msgid "TX" ++msgstr "TX" ++ ++msgid "TX Rate" ++msgstr "Rychlost TX" ++ ++msgid "Table" ++msgstr "" ++ ++msgid "Target" ++msgstr "Cíl" ++ ++msgid "Terminate" ++msgstr "UkonÄit" ++ ++#, fuzzy ++msgid "" ++"The Device Configuration section covers physical settings of the " ++"radio hardware such as channel, transmit power or antenna selection which " ++"are shared among all defined wireless networks (if the radio hardware is " ++"multi-SSID capable). Per network settings like encryption or operation mode " ++"are grouped in the Interface Configuration." ++msgstr "" ++"Sekce Nastavení zařízení pokrývá fyzické nastavení radiového " ++"hardwaru jako kanál, vysílací výkon nebo výbÄ›r antény, které je sdíleno mezi " ++"vÅ¡emi bezdrátovými sítÄ›mi (pokud hardware podporuje multi-SSID). Nastavení " ++"konkrétní sítÄ› jako Å¡ifrování, operaÄní mód jsou seskupeny v sekci " ++"Nastavení rozhraní." ++ ++msgid "" ++"The libiwinfo-lua package is not installed. You must install this " ++"component for working wireless configuration!" ++msgstr "" ++"BalíÄek libiwinfo-lua není nainstalován. Tato komponenta musí být " ++"nainstalována, aby fungovalo nastavení bezdátové sítÄ›!" ++ ++msgid "" ++"The HE.net endpoint update configuration changed, you must now use the plain " ++"username instead of the user ID!" ++msgstr "" ++ ++msgid "" ++"The IPv6 prefix assigned to the provider, usually ends with ::" ++msgstr "IPv6 prefix pÅ™idÄ›lený poskytovatelm vÄ›tÅ¡inou konÄí ::" ++ ++msgid "" ++"The allowed characters are: A-Z, a-z, 0-9 and _" ++msgstr "" ++"Povolené znaky jsou: A-Z, a-z, 0-9 a " ++"_" ++ ++msgid "The configuration file could not be loaded due to the following error:" ++msgstr "" ++ ++msgid "" ++"The device file of the memory or partition (e.g." ++" /dev/sda1)" ++msgstr "" ++"Soubor zařízení pamÄ›ti nebo oddílu (napÅ™. " ++"/dev/sda1)" ++ ++msgid "" ++"The filesystem that was used to format the memory (e.g. ext3)" ++msgstr "" ++"Souborový systém, který byl použit pro formátování pamÄ›ti (napÅ™i. ext3)" ++ ++msgid "" ++"The flash image was uploaded. Below is the checksum and file size listed, " ++"compare them with the original file to ensure data integrity.
    Click " ++"\"Proceed\" below to start the flash procedure." ++msgstr "" ++"Obraz flash byl nahrán. Prosím porovnejte níže uvedený checksum a velikost " ++"souboru s originálním souborem pro zajištění integrity dat.
    Kliknutím " ++"na \"PokraÄovat\" spustíte proceduru flashování." ++ ++msgid "The following changes have been committed" ++msgstr "Následující zmÄ›ny byly provedeny" ++ ++msgid "The following changes have been reverted" ++msgstr "Následující zmÄ›ny byly vráceny" ++ ++msgid "The following rules are currently active on this system." ++msgstr "Následující pravidla jsou v nyní na tomto systému aktivní." ++ ++msgid "The given network name is not unique" ++msgstr "Zadané jméno sítÄ› není jedineÄné" ++ ++#, fuzzy ++msgid "" ++"The hardware is not multi-SSID capable and the existing configuration will " ++"be replaced if you proceed." ++msgstr "" ++"Tento hardware nepodporuje multi-SSID. Pokud budete pokraÄovat, existující " ++"konfigurace bude nahrazena." ++ ++msgid "" ++"The length of the IPv4 prefix in bits, the remainder is used in the IPv6 " ++"addresses." ++msgstr "Délka IPv4 prefixu v bitech, zbytek se používá v IPv6 adresách" ++ ++msgid "The length of the IPv6 prefix in bits" ++msgstr "Délka IPv6 prefixu v bitech" ++ ++msgid "" ++"The network ports on this device can be combined to several VLANs in which computers can " ++"communicate directly with each other. VLANs are often used to separate different network " ++"segments. Often there is by default one Uplink port for a connection to the " ++"next greater network like the internet and other ports for a local network." ++msgstr "" ++"Síťové porty tohoto zařízení mohou být kombinovány do nÄ›kolika VLANve kterých poÄítaÄe mohou " ++"komunikovat přímo mezi sebou. VLANse Äasto používají na oddÄ›lení různých siÅ¥ových Äástí. VÄ›tÅ¡inou je " ++"jeden port pro pÅ™ipojení k vyšší síti (Uplink) jako tÅ™eba internet a " ++"zbývající porty pro místní síť." ++ ++msgid "The selected protocol needs a device assigned" ++msgstr "Vybraný protokol potÅ™ebuje mít pÅ™iÅ™azeno zařízení" ++ ++msgid "" ++"The system is erasing the configuration partition now and will reboot itself " ++"when finished." ++msgstr "" ++"Systém maže konfiguraÄní oddíl, po skonÄení procesu bude automaticky " ++"restartován." ++ ++#, fuzzy ++msgid "" ++"The system is flashing now.
    DO NOT POWER OFF THE DEVICE!
    Wait a " ++"few minutes before you try to reconnect. It might be necessary to renew the " ++"address of your computer to reach the device again, depending on your " ++"settings." ++msgstr "" ++"Systém nyní nahrává firmware.
    NEVYPÃNEJTE ZAŘÃZENÃ!
    PoÄkejte " ++"nÄ›kolik minut než se pokusíte znovu pÅ™ipojit. V záležitosti na vaÅ¡em " ++"nastavení, bude možná nutné obnovit adresu vaÅ¡eho poÄítaÄe, aby jste se " ++"mohli znovu pÅ™ipojit." ++ ++msgid "" ++"The tunnel end-point is behind NAT, defaults to disabled and only applies to " ++"AYIYA" ++msgstr "" ++ ++msgid "" ++"The uploaded image file does not contain a supported format. Make sure that " ++"you choose the generic image format for your platform." ++msgstr "" ++ ++msgid "There are no active leases." ++msgstr "Nejsou žádné aktivní zápůjÄky." ++ ++msgid "There are no pending changes to apply!" ++msgstr "Nejsou zde žádné nevyřízené zmÄ›ny k aplikaci!" ++ ++msgid "There are no pending changes to revert!" ++msgstr "Nejsou zde žádné nevyřízené zmÄ›ny k navrácení!" ++ ++msgid "There are no pending changes!" ++msgstr "Nejsou zde žádné nevyřízené zmÄ›ny!" ++ ++msgid "" ++"There is no device assigned yet, please attach a network device in the " ++"\"Physical Settings\" tab" ++msgstr "" ++"Zatím zde není pÅ™iÅ™azeno zařízení, prosím pÅ™ipojte nÄ›jaké v záložce " ++"\"Fyzické nastavení\"" ++ ++msgid "" ++"There is no password set on this router. Please configure a root password to " ++"protect the web interface and enable SSH." ++msgstr "" ++"Na tomto routeru není nastaveno heslo. Prosím, nastavte heslo uživatele root " ++"tak, abyste ochránili webové rozhraní a mohli povolit SSH." ++ ++msgid "This IPv4 address of the relay" ++msgstr "" ++ ++msgid "" ++"This is a list of shell glob patterns for matching files and directories to " ++"include during sysupgrade. Modified files in /etc/config/ and certain other " ++"configurations are automatically preserved." ++msgstr "" ++ ++msgid "" ++"This is either the \"Update Key\" configured for the tunnel or the account " ++"password if no update key has been configured" ++msgstr "" ++ ++msgid "" ++"This is the content of /etc/rc.local. Insert your own commands here (in " ++"front of 'exit 0') to execute them at the end of the boot process." ++msgstr "" ++"Zde vidíte obsah souboru /etc/rc.local. Příkazy, které sem vložíte (pÅ™ed " ++"příkaz 'exit 0') budou spuÅ¡tÄ›ny na konci bootovacího procesu." ++ ++msgid "" ++"This is the local endpoint address assigned by the tunnel broker, it usually " ++"ends with :2" ++msgstr "" ++ ++msgid "" ++"This is the only DHCP in the local network" ++msgstr "" ++"Toto je jedný DHCPv mistní síti" ++ ++msgid "This is the plain username for logging into the account" ++msgstr "" ++ ++msgid "" ++"This is the prefix routed to you by the tunnel broker for use by clients" ++msgstr "" ++ ++msgid "This is the system crontab in which scheduled tasks can be defined." ++msgstr "" ++"Toto je systémový crontab, v nÄ›mž můžete nastavit naplánované úlohy. " ++"Podrobnosti naleznete v crontab(5)." ++ ++msgid "" ++"This is usually the address of the nearest PoP operated by the tunnel broker" ++msgstr "" ++ ++msgid "" ++"This list gives an overview over currently running system processes and " ++"their status." ++msgstr "" ++"V tomto seznamu vidíte pÅ™ehled aktuálnÄ› běžících systémových procesů a " ++"jejich stavy." ++ ++msgid "This page allows the configuration of custom button actions" ++msgstr "Na této stránce si můžete nastavit vlastní události tlaÄítek" ++ ++msgid "This page gives an overview over currently active network connections." ++msgstr "Tato stránka zobrazuje pÅ™ehled aktivních síťových spojení." ++ ++msgid "This section contains no values yet" ++msgstr "Tato sekce zatím neobsahuje žádné hodnoty" ++ ++msgid "Time Synchronization" ++msgstr "Synchronizace Äasu" ++ ++msgid "Time Synchronization is not configured yet." ++msgstr "Synchronizace Äasu dosud není nakonfigurována." ++ ++msgid "Timezone" ++msgstr "ÄŒasové pásmo" ++ ++msgid "" ++"To restore configuration files, you can upload a previously generated backup " ++"archive here." ++msgstr "" ++"Zde můžete nahrát dříve vygenerovaný záložní archiv, pokud chcete obnovit " ++"konfiguraÄní soubory." ++ ++msgid "Total Available" ++msgstr "Dostupná celkem" ++ ++msgid "Traceroute" ++msgstr "Traceroute" ++ ++msgid "Traffic" ++msgstr "Provoz" ++ ++msgid "Transfer" ++msgstr "PÅ™enos" ++ ++msgid "Transmission Rate" ++msgstr "Vysílací rychlost" ++ ++msgid "Transmit" ++msgstr "PÅ™enos" ++ ++msgid "Transmit Power" ++msgstr "Vysílací výkon" ++ ++msgid "Transmitter Antenna" ++msgstr "Anténa vysílaÄe" ++ ++msgid "Trigger" ++msgstr "SpouÅ¡tÄ›ní" ++ ++msgid "Trigger Mode" ++msgstr "Trigger mód" ++ ++msgid "Tunnel ID" ++msgstr "ID tunelu" ++ ++msgid "Tunnel Interface" ++msgstr "Rozhraní tunelu" ++ ++msgid "Tunnel Link" ++msgstr "" ++ ++msgid "Tunnel broker protocol" ++msgstr "" ++ ++msgid "Tunnel setup server" ++msgstr "" ++ ++msgid "Tunnel type" ++msgstr "" ++ ++msgid "Turbo Mode" ++msgstr "Turbo mód" ++ ++msgid "Tx-Power" ++msgstr "Tx-Power" ++ ++msgid "Type" ++msgstr "Typ" ++ ++msgid "UDP:" ++msgstr "UDP:" ++ ++msgid "UMTS only" ++msgstr "Pouze UMTS" ++ ++msgid "UMTS/GPRS/EV-DO" ++msgstr "UMTS/GPRS/EV-DO" ++ ++msgid "USB Device" ++msgstr "USB zařízení" ++ ++msgid "UUID" ++msgstr "UUID" ++ ++msgid "Unable to dispatch" ++msgstr "" ++ ++msgid "Unknown" ++msgstr "Neznámý" ++ ++msgid "Unknown Error, password not changed!" ++msgstr "Neznámá chyba, heslo nebylo zmÄ›nÄ›no!" ++ ++msgid "Unmanaged" ++msgstr "Nespravovaný" ++ ++msgid "Unsaved Changes" ++msgstr "Neuložené zmÄ›ny" ++ ++msgid "Unsupported protocol type." ++msgstr "Nepodporovaný typ protokolu." ++ ++msgid "Update lists" ++msgstr "Aktualizovat seznamy" ++ ++msgid "" ++"Upload a sysupgrade-compatible image here to replace the running firmware. " ++"Check \"Keep settings\" to retain the current configuration (requires an " ++"OpenWrt compatible firmware image)." ++msgstr "" ++"Nahrát obraz pro upgrade systému, jímž bude pÅ™epsán běžící firmware. " ++"Zkontrolujte \"Keep settings\" za úÄelem udržení aktuální konfigurace " ++"(vyžaduje obraz OpenWrt kompatabilního firmwaru)." ++ ++msgid "Upload archive..." ++msgstr "Nahrát archiv..." ++ ++msgid "Uploaded File" ++msgstr "Nahrát soubor" ++ ++msgid "Uptime" ++msgstr "Uptime" ++ ++msgid "Use /etc/ethers" ++msgstr "Použít /etc/ethers" ++ ++msgid "Use DHCP gateway" ++msgstr "Použít DHCP bránu" ++ ++msgid "Use DNS servers advertised by peer" ++msgstr "" ++ ++msgid "Use ISO/IEC 3166 alpha2 country codes." ++msgstr "Pomocí ISO/IEC 3166 alpha2 kódů zemí." ++ ++msgid "Use MTU on tunnel interface" ++msgstr "Použít MTU na rozhraní tunelu" ++ ++msgid "Use TTL on tunnel interface" ++msgstr "Použít TTL na rozhraní tunelu" ++ ++msgid "Use as external overlay (/overlay)" ++msgstr "" ++ ++msgid "Use as root filesystem (/)" ++msgstr "" ++ ++msgid "Use broadcast flag" ++msgstr "Použít příznak broadcastu" ++ ++msgid "Use builtin IPv6-management" ++msgstr "" ++ ++msgid "Use custom DNS servers" ++msgstr "Použít vlastní DNS servery" ++ ++msgid "Use default gateway" ++msgstr "Použít výchozí bránu" ++ ++msgid "Use gateway metric" ++msgstr "" ++ ++msgid "Use routing table" ++msgstr "Použít smÄ›rovací tabulku" ++ ++msgid "" ++"Use the Add Button to add a new lease entry. The MAC-Address indentifies the host, the IPv4-Address specifies to the fixed " ++"address to use and the Hostname is assigned as symbolic name to the " ++"requesting host." ++msgstr "" ++"Použitím tlaÄítka PÅ™idat pÅ™idáte novou zápůjÄku (lease). MAC " ++"adresa identifikuje poÄítaÄ, IPv4 adresa urÄuje, jaká pevná " ++"adresa bude použita. Hostname je pÅ™iÅ™azeno jako symbolické jméno." ++ ++msgid "Used" ++msgstr "Použit" ++ ++msgid "Used Key Slot" ++msgstr "" ++ ++msgid "User certificate (PEM encoded)" ++msgstr "" ++ ++msgid "User key (PEM encoded)" ++msgstr "" ++ ++msgid "Username" ++msgstr "Uživatelské jméno" ++ ++msgid "VC-Mux" ++msgstr "VC-Mux" ++ ++msgid "VLAN Interface" ++msgstr "Rozhraní VLAN" ++ ++msgid "VLANs on %q" ++msgstr "VLANy na %q" ++ ++msgid "VLANs on %q (%s)" ++msgstr "VLANy na %q (%s)" ++ ++msgid "VPN Server" ++msgstr "VPN server" ++ ++msgid "VPN Server port" ++msgstr "" ++ ++msgid "VPN Server's certificate SHA1 hash" ++msgstr "" ++ ++msgid "Vendor Class to send when requesting DHCP" ++msgstr "" ++ ++msgid "Verbose" ++msgstr "" ++ ++msgid "Verbose logging by aiccu daemon" ++msgstr "" ++ ++msgid "Verify" ++msgstr "Ověřit" ++ ++msgid "Version" ++msgstr "Verze" ++ ++msgid "WDS" ++msgstr "WDS" ++ ++msgid "WEP Open System" ++msgstr "WEP Open System" ++ ++msgid "WEP Shared Key" ++msgstr "Sdílený klÃ­Ä WEP" ++ ++msgid "WEP passphrase" ++msgstr "WEP heslo" ++ ++msgid "WMM Mode" ++msgstr "WMM mód" ++ ++msgid "WPA passphrase" ++msgstr "WPA heslo" ++ ++msgid "" ++"WPA-Encryption requires wpa_supplicant (for client mode) or hostapd (for AP " ++"and ad-hoc mode) to be installed." ++msgstr "" ++"Å ifrování WPA vyžaduje nainstalovaný wpa_supplicant (pro klientský režim) " ++"nebo hostapd (pro AP a ad-hoc režim)." ++ ++msgid "" ++"Wait for NTP sync that many seconds, seting to 0 disables waiting (optional)" ++msgstr "" ++ ++msgid "Waiting for changes to be applied..." ++msgstr "ÄŒekání na realizaci zmÄ›n..." ++ ++msgid "Waiting for command to complete..." ++msgstr "ÄŒekání na dokonÄení příkazu..." ++ ++msgid "Warning" ++msgstr "Varování" ++ ++msgid "Warning: There are unsaved changes that will be lost while rebooting!" ++msgstr "Varování: Existují neuložené zmÄ›ny, které budou rebootem ztraceny!" ++ ++msgid "Whether to create an IPv6 default route over the tunnel" ++msgstr "" ++ ++msgid "Whether to route only packets from delegated prefixes" ++msgstr "" ++ ++msgid "Width" ++msgstr "" ++ ++msgid "Wifi" ++msgstr "Wifi" ++ ++msgid "Wireless" ++msgstr "Bezdrátová síť" ++ ++msgid "Wireless Adapter" ++msgstr "Bezdrátový adaptér" ++ ++msgid "Wireless Network" ++msgstr "Bezdrátová síť" ++ ++msgid "Wireless Overview" ++msgstr "PÅ™ehled bezdrátových sití" ++ ++msgid "Wireless Security" ++msgstr "ZabezpeÄení bezdrátové sítÄ›" ++ ++msgid "Wireless is disabled or not associated" ++msgstr "Bezdrátová síť je vypnuta nebo nespojena" ++ ++msgid "Wireless is restarting..." ++msgstr "Probíhá restartování bezdrátové sítÄ›..." ++ ++msgid "Wireless network is disabled" ++msgstr "Bezdrátová síť je zakázána" ++ ++msgid "Wireless network is enabled" ++msgstr "Bezdrátová síť je povolena" ++ ++msgid "Wireless restarted" ++msgstr "Bezdrátová síť restartována" ++ ++msgid "Wireless shut down" ++msgstr "Bezdrátová síť vypnuta" ++ ++msgid "Write received DNS requests to syslog" ++msgstr "Zapisovat pÅ™ijaté požadavky DNS do systemového logu" ++ ++msgid "XR Support" ++msgstr "Podpora XR" ++ ++msgid "" ++"You can enable or disable installed init scripts here. Changes will applied " ++"after a device reboot.
    Warning: If you disable essential init " ++"scripts like \"network\", your device might become inaccessible!" ++msgstr "" ++"Zde můžete povolit nebo zakázat init skripty. Změny se projeví po restartu " ++"zařízení.
    Varování: Pokud zakážete základní init skripty jako " ++"\"network\", vaÅ¡e zařízení se může stát nepřístupným!" ++ ++msgid "" ++"You must enable Java Script in your browser or LuCI will not work properly." ++msgstr "" ++"Aby LuCI fungoval správnÄ›, musíte mít v prohlížeÄi povolený Javascript." ++ ++msgid "" ++"Your Internet Explorer is too old to display this page correctly. Please " ++"upgrade it to at least version 7 or use another browser like Firefox, Opera " ++"or Safari." ++msgstr "" ++ ++msgid "any" ++msgstr "libovolný" ++ ++msgid "auto" ++msgstr "auto" ++ ++msgid "automatic" ++msgstr "" ++ ++msgid "baseT" ++msgstr "baseT" ++ ++msgid "bridged" ++msgstr "pÅ™emostÄ›ný" ++ ++msgid "create:" ++msgstr "" ++ ++msgid "creates a bridge over specified interface(s)" ++msgstr "vytvoří most pÅ™es vybraná rozhraní" ++ ++msgid "dB" ++msgstr "dB" ++ ++msgid "dBm" ++msgstr "dBm" ++ ++msgid "disable" ++msgstr "zakázat" ++ ++msgid "disabled" ++msgstr "" ++ ++msgid "expired" ++msgstr "expirované" ++ ++msgid "" ++"file where given DHCP-leases will be stored" ++msgstr "" ++"Soubor, ve kterém budou uloženy zadané DHCP výpůjÄky (leases)" ++ ++msgid "forward" ++msgstr "" ++ ++msgid "full-duplex" ++msgstr "plný-duplex" ++ ++msgid "half-duplex" ++msgstr "poloviÄní-duplex" ++ ++msgid "help" ++msgstr "pomoc" ++ ++msgid "hidden" ++msgstr "skrytý" ++ ++msgid "hybrid mode" ++msgstr "" ++ ++msgid "if target is a network" ++msgstr "pokud cílem je síť" ++ ++msgid "input" ++msgstr "vstup" ++ ++msgid "kB" ++msgstr "kB" ++ ++msgid "kB/s" ++msgstr "kB/s" ++ ++msgid "kbit/s" ++msgstr "kbit/s" ++ ++msgid "local DNS file" ++msgstr "místní DNS soubor" ++ ++msgid "minimum 1280, maximum 1480" ++msgstr "" ++ ++msgid "navigation Navigation" ++msgstr "" ++ ++msgid "no" ++msgstr "ne" ++ ++msgid "no link" ++msgstr "žádné spojení" ++ ++msgid "none" ++msgstr "žádný" ++ ++msgid "not present" ++msgstr "" ++ ++msgid "off" ++msgstr "off" ++ ++msgid "on" ++msgstr "on" ++ ++msgid "open" ++msgstr "" ++ ++msgid "overlay" ++msgstr "" ++ ++msgid "relay mode" ++msgstr "" ++ ++msgid "routed" ++msgstr "smÄ›rované" ++ ++msgid "server mode" ++msgstr "" ++ ++msgid "skiplink1 Skip to navigation" ++msgstr "" ++ ++msgid "skiplink2 Skip to content" ++msgstr "" ++ ++msgid "stateful-only" ++msgstr "" ++ ++msgid "stateless" ++msgstr "" ++ ++msgid "stateless + stateful" ++msgstr "" ++ ++msgid "tagged" ++msgstr "oznaÄený" ++ ++msgid "unknown" ++msgstr "neznámý" ++ ++msgid "unlimited" ++msgstr "neomezený" ++ ++msgid "unspecified" ++msgstr "nespecifikovaný" ++ ++msgid "unspecified -or- create:" ++msgstr "nespecifikovaný -nebo- vytvoÅ™it:" ++ ++msgid "untagged" ++msgstr "neoznaÄený" ++ ++msgid "yes" ++msgstr "ano" ++ ++msgid "« Back" ++msgstr "« ZpÄ›t" ++ ++#~ msgid "" ++#~ "Always use 40MHz channels even if the secondary channel overlaps. Using " ++#~ "this option does not comply with IEEE 802.11n-2009!" ++#~ msgstr "" ++#~ "Vždy použije kanál 40 MHz , i když pÅ™ekrývá sekundární kanál . Tato volba " ++#~ "není v souladu s IEEE 802.11n-2009!" ++ ++#~ msgid "Cached" ++#~ msgstr "V cache" ++ ++#~ msgid "Configures this mount as overlay storage for block-extroot" ++#~ msgstr "Použít tento přípojný bod jako pÅ™ekryvné úložiÅ¡tÄ› pro block-extroot" ++ ++#~ msgid "Force 40MHz mode" ++#~ msgstr "Vynutit 40MHz mód" ++ ++#~ msgid "Frequency Hopping" ++#~ msgstr "KmitoÄtové skákání" ++ ++#~ msgid "Locked to channel %d used by %s" ++#~ msgstr "Uzamknout kanál %d používaný %s" ++ ++#~ msgid "Use as root filesystem" ++#~ msgstr "Použít jako koÅ™enový souborový systém" ++ ++#~ msgid "HE.net user ID" ++#~ msgstr "Uživatelské ID HE.net" ++ ++#~ msgid "This is the 32 byte hex encoded user ID, not the login name" ++#~ msgstr "" ++#~ "Toto je 32 bajtové uživatelské ID, zapsané v hex tvaru, ne pÅ™ihlaÅ¡ovací " ++#~ "jméno" ++ ++#~ msgid "40MHz 2nd channel above" ++#~ msgstr "40MHz druhý kanál nad hlavním" ++ ++#~ msgid "40MHz 2nd channel below" ++#~ msgstr "40MHz druhý kanál pod hlavním" ++ ++#~ msgid "Accept router advertisements" ++#~ msgstr "PÅ™ijímat oznámení smÄ›rovaÄů" ++ ++#~ msgid "Advertise IPv6 on network" ++#~ msgstr "Na síti oznamovat IPv6" ++ ++#~ msgid "Advertised network ID" ++#~ msgstr "Oznamované ID sítÄ›" ++ ++#~ msgid "Allowed range is 1 to 65535" ++#~ msgstr "Hodnota musí ležet v intervalu 1 až 65535" ++ ++#~ msgid "HT capabilities" ++#~ msgstr "Možnosti HT" ++ ++#~ msgid "HT mode" ++#~ msgstr "Režim HT" ++ ++#~ msgid "Router Model" ++#~ msgstr "Model routeru" ++ ++#~ msgid "Router Name" ++#~ msgstr "Název routeru" ++ ++#~ msgid "Send router solicitations" ++#~ msgstr "Posílat žádosti o informace o smÄ›rování" ++ ++#~ msgid "Specifies the advertised preferred prefix lifetime in seconds" ++#~ msgstr "" ++#~ "UrÄuje dobu za kterou interface požádá o prodloužení životnosti prefixu v " ++#~ "sekundách" ++ ++#~ msgid "Specifies the advertised valid prefix lifetime in seconds" ++#~ msgstr "UrÄuje dobu životnosti prefixu v sekundách" ++ ++#~ msgid "Use preferred lifetime" ++#~ msgstr "Použít preferovanou životnost" ++ ++#~ msgid "Use valid lifetime" ++#~ msgstr "Použít platnou životnost" ++ ++#~ msgid "Waiting for router..." ++#~ msgstr "ÄŒekám na router.." ++ ++#~ msgid "Enable builtin NTP server" ++#~ msgstr "Povolit zabudovaný NTP server" ++ ++#~ msgid "Active Leases" ++#~ msgstr "Aktivní výpůjÄky" ++ ++#~ msgid "Open" ++#~ msgstr "Otevřít" ++ ++#~ msgid "Bit Rate" ++#~ msgstr "PÅ™enosová rychlost" ++ ++#~ msgid "Configuration / Apply" ++#~ msgstr "Nastavení / Použít" ++ ++#~ msgid "Configuration / Changes" ++#~ msgstr "Nastavení / ZmÄ›ny" ++ ++#~ msgid "Configuration / Revert" ++#~ msgstr "Nastavení / ZruÅ¡it zmÄ›ny" ++ ++#~ msgid "MAC" ++#~ msgstr "MAC" ++ ++#~ msgid "MAC Address" ++#~ msgstr "MAC adresa" ++ ++#~ msgid "Encr." ++#~ msgstr "Å ifr." ++ ++#~ msgid "WLAN-Scan" ++#~ msgstr "WLAN-Scanování" ++ ++#~ msgid "" ++#~ "Choose the network you want to attach to this wireless interface. Select " ++#~ "unspecified to not attach any network or fill out the " ++#~ "create field to define a new network." ++#~ msgstr "" ++#~ "Síť pÅ™iÅ™azená k tomuto bezdrátovému rozhraní. Pro nepÅ™iÅ™azování rozhraní " ++#~ "k žádné síti vyberte volbu \"nespecifikovaná\". Pro vytvoÅ™ení " ++#~ "nové sítÄ› vyplňte pole \"vytvoÅ™it\"." ++ ++#~ msgid "Create Network" ++#~ msgstr "VytvoÅ™it síť" ++ ++#~ msgid "Networks" ++#~ msgstr "SítÄ›" ++ ++#~ msgid "Power" ++#~ msgstr "Výkon" ++ ++#~ msgid "Wifi networks in your local environment" ++#~ msgstr "Wifi sítÄ› v místním prostÅ™edí" ++ ++#~ msgid "" ++#~ "CIDR-Notation: " ++#~ "address/prefix" ++#~ msgstr "" ++#~ "CIDR-notace : " ++#~ "adresa/prefix" ++ ++#~ msgid "DNS-Server" ++#~ msgstr "DNS-Server" ++ ++#~ msgid "IPv4-Broadcast" ++#~ msgstr "" ++#~ "IPv4-VÅ¡esmÄ›rové vysílání" ++ ++#~ msgid "IPv6-Address" ++#~ msgstr "IPv6-Adresa" ++ ++#~ msgid "IPv6 Setup" ++#~ msgstr "Nastavení IPv6" ++ ++#~ msgid "" ++#~ "Note: If you choose an interface here which is part of another network, " ++#~ "it will be moved into this network." ++#~ msgstr "" ++#~ "Pozn: Pokud zde zvolíte rozhraní, které již je souÄástí jiné sítÄ›, bude " ++#~ "pÅ™esunuto do této sítÄ›." ++ ++#~ msgid "" ++#~ "The network ports on your router can be combined to several VLANs in which computers can " ++#~ "communicate directly with each other. VLANs are often used to separate different network " ++#~ "segments. Often there is by default one Uplink port for a connection to " ++#~ "the next greater network like the internet and other ports for a local " ++#~ "network." ++#~ msgstr "" ++#~ "Síťové porty na vaÅ¡em routeru mohou být kombinovány do nÄ›kolika VLAN, ve kterých mohou " ++#~ "poÄítaÄe navzájem komunikovat přímo. VLAN jsou Äasto používány za úÄelem oddÄ›lení různých " ++#~ "síťových segmentů. ÄŒasto je zde jeden Uplink port, sloužící pro pÅ™ipojení " ++#~ "do vÄ›tší sítÄ› (tÅ™eba Internetu) a ostatní porty jsou využity pro místní " ++#~ "síť." ++ ++#~ msgid "Enable buffering" ++#~ msgstr "Povolit bufferování" +diff --git a/feeds/luci/modules/luci-base/po/de/base.po b/feeds/luci/modules/luci-base/po/de/base.po +new file mode 100644 +index 0000000..361abde +--- /dev/null ++++ b/feeds/luci/modules/luci-base/po/de/base.po +@@ -0,0 +1,4352 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Report-Msgid-Bugs-To: \n" ++"POT-Creation-Date: 2009-05-26 17:57+0200\n" ++"PO-Revision-Date: 2013-03-29 12:13+0200\n" ++"Last-Translator: JoeSemler \n" ++"Language-Team: LANGUAGE \n" ++"Language: de\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n != 1);\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "(%d minute window, %d second interval)" ++msgstr "(%d Minuten Abschnitt, %d Sekunden Intervall)" ++ ++msgid "(%s available)" ++msgstr "(%s verfügbar)" ++ ++msgid "(empty)" ++msgstr "(leer)" ++ ++msgid "(no interfaces attached)" ++msgstr "(keine Schnittstellen)" ++ ++msgid "-- Additional Field --" ++msgstr "-- Zusätzliches Feld --" ++ ++msgid "-- Please choose --" ++msgstr "-- Bitte auswählen --" ++ ++msgid "-- custom --" ++msgstr "-- benutzerdefiniert --" ++ ++msgid "-- match by device --" ++msgstr "" ++ ++msgid "-- match by label --" ++msgstr "" ++ ++msgid "1 Minute Load:" ++msgstr "Systemlast (1 Minute):" ++ ++msgid "15 Minute Load:" ++msgstr "Systemlast (15 Minuten):" ++ ++msgid "5 Minute Load:" ++msgstr "Systemlast (5 Minuten):" ++ ++msgid "BSSID" ++msgstr "BSSID" ++ ++msgid "DNS query port" ++msgstr "DNS Abfrageport" ++ ++msgid "DNS server port" ++msgstr "DNS Serverport" ++ ++msgid "" ++"DNS servers will be queried in the " ++"order of the resolvfile" ++msgstr "" ++"DNS-Server in der Reihenfolge der " ++"Resolv-Datei abfragen" ++ ++msgid "ESSID" ++msgstr "ESSID" ++ ++msgid "IPv4-Address" ++msgstr "IPv4-Adresse" ++ ++msgid "IPv4-Gateway" ++msgstr "IPv4-Gateway" ++ ++msgid "IPv4-Netmask" ++msgstr "IPv4-Netzmaske" ++ ++msgid "" ++"IPv6-Address or Network " ++"(CIDR)" ++msgstr "IPv6 Host- oder Netzwerk-Addresse (CIDR)" ++ ++msgid "IPv6-Gateway" ++msgstr "IPv6-Gateway" ++ ++msgid "IPv6-Suffix (hex)" ++msgstr "" ++ ++msgid "LED Configuration" ++msgstr "LED Konfiguration" ++ ++msgid "LED Name" ++msgstr "LED Name" ++ ++msgid "MAC-Address" ++msgstr "MAC-Adresse" ++ ++msgid "" ++"Max. DHCP leases" ++msgstr "" ++"Max. Anzahl von DHCP-Leases" ++ ++msgid "" ++"Max. EDNS0 packet size" ++msgstr "" ++"Max. Größe von EDNS0-Paketen" ++ ++msgid "Max. concurrent queries" ++msgstr "Max. Anzahl gleichzeitiger Abfragen" ++ ++msgid "%s - %s" ++msgstr "%s - %s" ++ ++msgid "ADSL" ++msgstr "" ++ ++msgid "ADSL Status" ++msgstr "" ++ ++msgid "AICCU (SIXXS)" ++msgstr "" ++ ++msgid "APN" ++msgstr "APN" ++ ++msgid "AR Support" ++msgstr "AR-Unterstützung" ++ ++msgid "ARP retry threshold" ++msgstr "Grenzwert für ARP-Auflösungsversuche" ++ ++msgid "ATM Bridges" ++msgstr "ATM Brücken" ++ ++msgid "ATM Virtual Channel Identifier (VCI)" ++msgstr "ATM Virtual Channel Identifier (VCI)" ++ ++msgid "ATM Virtual Path Identifier (VPI)" ++msgstr "ATM Virtual Path Identifier (VPI)" ++ ++msgid "" ++"ATM bridges expose encapsulated ethernet in AAL5 connections as virtual " ++"Linux network interfaces which can be used in conjunction with DHCP or PPP " ++"to dial into the provider network." ++msgstr "" ++"ATM Brücken exponieren in AAL5 gekapselten Ethernetverkehr als virtuelle " ++"Linux Netzwerkschnittstellen welche z.B. in Verbindung mit DHCP oder PPP " ++"genutzt werden können um sich in das Providernetzwerk einzuwählen." ++ ++msgid "ATM device number" ++msgstr "ATM Geräteindex" ++ ++msgid "AYIYA" ++msgstr "" ++ ++msgid "Access Concentrator" ++msgstr "Access Concentrator" ++ ++msgid "Access Point" ++msgstr "Access Point" ++ ++msgid "Action" ++msgstr "Aktion" ++ ++msgid "Actions" ++msgstr "Aktionen" ++ ++msgid "Activate this network" ++msgstr "Dieses Netzwerk aktivieren" ++ ++msgid "Active IPv4-Routes" ++msgstr "Aktive IPv4-Routen" ++ ++msgid "Active IPv6-Routes" ++msgstr "Aktive IPv6-Routen" ++ ++msgid "Active Connections" ++msgstr "Aktive Verbindungen" ++ ++msgid "Active DHCP Leases" ++msgstr "Aktive DHCP-Leases" ++ ++msgid "Active DHCPv6 Leases" ++msgstr "Aktive DHCPv6-Leases" ++ ++msgid "Ad-Hoc" ++msgstr "Ad-Hoc" ++ ++msgid "Add" ++msgstr "Hinzufügen" ++ ++msgid "Add local domain suffix to names served from hosts files" ++msgstr "Lokalen Domainsuffx an Namen aus der Hosts-Datei anhängen" ++ ++msgid "Add new interface..." ++msgstr "Neue Schnittstelle hinzufügen..." ++ ++msgid "Additional Hosts files" ++msgstr "Zusätzliche Hosts-Dateien" ++ ++msgid "Address" ++msgstr "Adresse" ++ ++msgid "Address to access local relay bridge" ++msgstr "Adresse der lokalen Relay-Brücke" ++ ++msgid "Administration" ++msgstr "Administration" ++ ++msgid "Advanced Settings" ++msgstr "Erweiterte Einstellungen" ++ ++msgid "Alert" ++msgstr "Alarm" ++ ++msgid "Allow SSH password authentication" ++msgstr "Erlaube Anmeldung per Passwort" ++ ++msgid "Allow all except listed" ++msgstr "Alle außer gelistete erlauben" ++ ++msgid "Allow listed only" ++msgstr "Nur gelistete erlauben" ++ ++msgid "Allow localhost" ++msgstr "Erlaube localhost" ++ ++msgid "Allow remote hosts to connect to local SSH forwarded ports" ++msgstr "Entfernten Hosts erlauben zu lokale SSH-Tunnel-Ports zu verbinden" ++ ++msgid "Allow root logins with password" ++msgstr "\"root\" Login mit Passwort aktivieren" ++ ++msgid "Allow the root user to login with password" ++msgstr "" ++"Erlaubt es dem root Benutzer sich mit einem Passwort statt einem " ++"Zertifikat einzuloggen" ++ ++msgid "" ++"Allow upstream responses in the 127.0.0.0/8 range, e.g. for RBL services" ++msgstr "" ++"Dies erlaubt DNS-Antworten im 127.0.0.0/8 Bereich der z.B. für RBL Dienste " ++"genutzt wird" ++ ++msgid "" ++"Also see Tunneling Comparison on SIXXS" ++msgstr "" ++ ++msgid "Always announce default router" ++msgstr "" ++ ++msgid "An additional network will be created if you leave this unchecked." ++msgstr "" ++"Erzeugt ein zusätzliches Netzwerk wenn diese Option nicht ausgewählt ist" ++ ++msgid "Announce as default router even if no public prefix is available." ++msgstr "" ++ ++msgid "Announced DNS domains" ++msgstr "" ++ ++msgid "Announced DNS servers" ++msgstr "" ++ ++msgid "Antenna 1" ++msgstr "Antenne 1" ++ ++msgid "Antenna 2" ++msgstr "Antenne 2" ++ ++msgid "Antenna Configuration" ++msgstr "Antennenkonfiguration" ++ ++msgid "Any zone" ++msgstr "Beliebige Zone" ++ ++msgid "Apply" ++msgstr "Anwenden" ++ ++msgid "Applying changes" ++msgstr "Änderungen werden angewandt" ++ ++msgid "" ++"Assign a part of given length of every public IPv6-prefix to this interface" ++msgstr "" ++ ++msgid "Assign interfaces..." ++msgstr "Schnittstellen zuweisen..." ++ ++msgid "" ++"Assign prefix parts using this hexadecimal subprefix ID for this interface." ++msgstr "" ++ ++msgid "Associated Stations" ++msgstr "Assoziierte Clients" ++ ++msgid "Atheros 802.11%s Wireless Controller" ++msgstr "Atheros 802.11%s W-LAN Adapter" ++ ++msgid "AuthGroup" ++msgstr "" ++ ++msgid "Authentication" ++msgstr "Authentifizierung" ++ ++msgid "Authoritative" ++msgstr "Authoritativ" ++ ++msgid "Authorization Required" ++msgstr "Autorisierung benötigt" ++ ++msgid "Auto Refresh" ++msgstr "Automatisches Neuladen" ++ ++msgid "Automatic" ++msgstr "" ++ ++msgid "Automatic Homenet (HNCP)" ++msgstr "" ++ ++msgid "Available" ++msgstr "Verfügbar" ++ ++msgid "Available packages" ++msgstr "Verfügbare Pakete" ++ ++msgid "Average:" ++msgstr "Durchschnitt:" ++ ++msgid "BSSID" ++msgstr "BSSID" ++ ++msgid "Back" ++msgstr "Zurück" ++ ++msgid "Back to Overview" ++msgstr "Zurück zur Ãœbersicht" ++ ++msgid "Back to configuration" ++msgstr "Zurück zur Konfiguration" ++ ++msgid "Back to overview" ++msgstr "Zurück zur Ãœbersicht" ++ ++msgid "Back to scan results" ++msgstr "Zurück zu den Scan-Ergebnissen" ++ ++msgid "Background Scan" ++msgstr "Hintergrundscan" ++ ++msgid "Backup / Flash Firmware" ++msgstr "Backup / Firmware Update" ++ ++msgid "Backup / Restore" ++msgstr "Sichern / Wiederherstellen" ++ ++msgid "Backup file list" ++msgstr "Liste zu sichernder Dateien" ++ ++msgid "Bad address specified!" ++msgstr "Ungültige Adresse angegeben!" ++ ++msgid "Band" ++msgstr "" ++ ++msgid "Behind NAT" ++msgstr "" ++ ++msgid "" ++"Below is the determined list of files to backup. It consists of changed " ++"configuration files marked by opkg, essential base files and the user " ++"defined backup patterns." ++msgstr "" ++"Nachfolgend wird eine generierte Liste der zu sichernden Dateien angezeigt. " ++"Sie enthält alle notwendigen Systemdateien sowie die von opkg als geändert " ++"markierten Konfigurationsdateien. Des Weiteren sind die durch " ++"benutzerdefinierte Dateiemuster betroffenen Dateien enthalten." ++ ++msgid "Bitrate" ++msgstr "Bitrate" ++ ++msgid "Bogus NX Domain Override" ++msgstr "Ungültige \"NX-Domain\" Antworten ignorieren" ++ ++msgid "Bridge" ++msgstr "Bridge" ++ ++msgid "Bridge interfaces" ++msgstr "Netzwerkbrücke" ++ ++msgid "Bridge unit number" ++msgstr "Geräteindex der Brücke" ++ ++msgid "Bring up on boot" ++msgstr "Während des Bootvorgangs starten" ++ ++msgid "Broadcom 802.11%s Wireless Controller" ++msgstr "Broadcom 802.11%s W-LAN Adapter" ++ ++msgid "Broadcom BCM%04x 802.11 Wireless Controller" ++msgstr "Broadcom BCM%04x 802.11 W-LAN Adapter" ++ ++msgid "Buffered" ++msgstr "Gepuffert" ++ ++msgid "Buttons" ++msgstr "Knöpfe" ++ ++msgid "CA certificate; if empty it will be saved after the first connection." ++msgstr "" ++ ++msgid "CPU" ++msgstr "Prozessor" ++ ++msgid "CPU usage (%)" ++msgstr "CPU-Nutzung (%)" ++ ++msgid "Cancel" ++msgstr "Abbrechen" ++ ++msgid "Category" ++msgstr "" ++ ++msgid "Chain" ++msgstr "Kette" ++ ++msgid "Changes" ++msgstr "Änderungen" ++ ++msgid "Changes applied." ++msgstr "Änderungen angewendet." ++ ++msgid "Changes the administrator password for accessing the device" ++msgstr "Ändert das Administratorpasswort für den Zugriff auf dieses Gerät" ++ ++msgid "Channel" ++msgstr "Kanal" ++ ++msgid "Check" ++msgstr "Prüfen" ++ ++msgid "Checksum" ++msgstr "Prüfsumme" ++ ++msgid "" ++"Choose the firewall zone you want to assign to this interface. Select " ++"unspecified to remove the interface from the associated zone or " ++"fill out the create field to define a new zone and attach the " ++"interface to it." ++msgstr "Diese Schnittstelle gehört bis jetzt zu keiner Firewallzone." ++ ++msgid "" ++"Choose the network(s) you want to attach to this wireless interface or fill " ++"out the create field to define a new network." ++msgstr "" ++"Wählt die Netzwerke die dieser WLAN-Schnittstelle zugeordnet werden. Das " ++"erstelle-Feld ausfüllen um ein neues Netzwerk zu erzeugen." ++ ++msgid "Cipher" ++msgstr "Verschlüsselungsalgorithmus" ++ ++msgid "" ++"Click \"Generate archive\" to download a tar archive of the current " ++"configuration files. To reset the firmware to its initial state, click " ++"\"Perform reset\" (only possible with squashfs images)." ++msgstr "" ++"Zum Herunterladen der aktuellen Konfigurationsdateien als gepacktes Archiv " ++"\"Sicherung erstellen\" drücken. \"Konfiguration zurücksetzen\" stellt den " ++"Auslieferungszustand des Systems wieder her (nur möglich bei squashfs-" ++"Images)." ++ ++msgid "Client" ++msgstr "Client" ++ ++msgid "Client ID to send when requesting DHCP" ++msgstr "Zu sendende Client-ID bei DHCP Anfragen" ++ ++msgid "" ++"Close inactive connection after the given amount of seconds, use 0 to " ++"persist connection" ++msgstr "" ++"Inaktive Verbindungen nach Ablauf dieser Zeit in Sekunden schließen (0 um " ++"die Verbindung immer aufrecht zu erhalten)." ++ ++msgid "Close list..." ++msgstr "Schließe Liste..." ++ ++msgid "Collecting data..." ++msgstr "Sammle Daten..." ++ ++msgid "Command" ++msgstr "Befehl" ++ ++msgid "Common Configuration" ++msgstr "Allgemeine Konfiguration" ++ ++msgid "Compression" ++msgstr "Kompression" ++ ++msgid "Configuration" ++msgstr "Konfiguration" ++ ++msgid "Configuration applied." ++msgstr "Konfiguration angewendet." ++ ++msgid "Configuration files will be kept." ++msgstr "Konfigurationsdateien sichern" ++ ++msgid "Confirmation" ++msgstr "Bestätigung" ++ ++msgid "Connect" ++msgstr "Verbinden" ++ ++msgid "Connected" ++msgstr "Verbunden" ++ ++msgid "Connection Limit" ++msgstr "Verbindungslimit" ++ ++msgid "Connection to server fails when TLS cannot be used" ++msgstr "" ++ ++msgid "Connections" ++msgstr "Verbindungen" ++ ++msgid "Country" ++msgstr "Land" ++ ++msgid "Country Code" ++msgstr "Ländercode" ++ ++msgid "Cover the following interface" ++msgstr "Die folgende Schnittstelle abdecken" ++ ++msgid "Cover the following interfaces" ++msgstr "Die folgende Schnittstellen abdecken" ++ ++msgid "Create / Assign firewall-zone" ++msgstr "Firewallzone anlegen / zuweisen" ++ ++msgid "Create Interface" ++msgstr "Erzeuge Schnittstelle" ++ ++msgid "Create a bridge over multiple interfaces" ++msgstr "Erzeuge Netzwerkbrücke über mehrere Schnittstellen" ++ ++msgid "Critical" ++msgstr "Kritisch" ++ ++msgid "Cron Log Level" ++msgstr "Cron Protokolllevel" ++ ++msgid "Custom Interface" ++msgstr "benutzerdefinierte Schnittstelle" ++ ++msgid "Custom delegated IPv6-prefix" ++msgstr "" ++ ++msgid "" ++"Customizes the behaviour of the device LEDs if possible." ++msgstr "Passt das Verhalten der Geräte-LEDs an - wenn dies möglich ist." ++ ++msgid "DHCP Leases" ++msgstr "DHCP-Leases" ++ ++msgid "DHCP Server" ++msgstr "DHCP-Server" ++ ++msgid "DHCP and DNS" ++msgstr "DHCP und DNS" ++ ++msgid "DHCP client" ++msgstr "DHCP Client" ++ ++msgid "DHCP-Options" ++msgstr "DHCP-Optionen" ++ ++msgid "DHCPv6 Leases" ++msgstr "DHCPv6-Leases" ++ ++msgid "DHCPv6 client" ++msgstr "" ++ ++msgid "DHCPv6-Mode" ++msgstr "" ++ ++msgid "DHCPv6-Service" ++msgstr "" ++ ++msgid "DNS" ++msgstr "DNS" ++ ++msgid "DNS forwardings" ++msgstr "DNS-Weiterleitungen" ++ ++msgid "DNS-Label / FQDN" ++msgstr "" ++ ++msgid "DS-Lite AFTR address" ++msgstr "" ++ ++msgid "DUID" ++msgstr "DUID" ++ ++msgid "Debug" ++msgstr "Debug" ++ ++msgid "Default %d" ++msgstr "Standard %d" ++ ++msgid "Default gateway" ++msgstr "Default Gateway" ++ ++msgid "Default route" ++msgstr "" ++ ++msgid "Default state" ++msgstr "Ausgangszustand" ++ ++msgid "Define a name for this network." ++msgstr "Definiert einen Namen für dieses Netzwerk" ++ ++msgid "" ++"Define additional DHCP options, for example " ++"\"6,192.168.2.1,192.168.2.2\" which advertises different DNS " ++"servers to clients." ++msgstr "" ++"Definiert zusätzliche DHCP-Optionen, z.B. \"6,192.168.2.1,192.168.2.2\" um einen anderen DNS-Server an Clients zu verteilen." ++ ++msgid "Delete" ++msgstr "Löschen" ++ ++msgid "Delete this interface" ++msgstr "Diese Schnittstelle löschen" ++ ++msgid "Delete this network" ++msgstr "Dieses Netzwerk löschen" ++ ++msgid "Description" ++msgstr "Beschreibung" ++ ++msgid "Design" ++msgstr "Design" ++ ++msgid "Destination" ++msgstr "Ziel" ++ ++msgid "Device" ++msgstr "Gerät" ++ ++msgid "Device Configuration" ++msgstr "Gerätekonfiguration" ++ ++msgid "Diagnostics" ++msgstr "Diagnosen" ++ ++msgid "Dial number" ++msgstr "" ++ ++msgid "Directory" ++msgstr "Verzeichnis" ++ ++msgid "Disable" ++msgstr "Deaktivieren" ++ ++msgid "" ++"Disable DHCP for " ++"this interface." ++msgstr "" ++"DHCP-Server auf " ++"dieser Schnittstelle deaktivieren" ++ ++msgid "Disable DNS setup" ++msgstr "DNS-Verarbeitung deaktivieren" ++ ++msgid "Disable HW-Beacon timer" ++msgstr "Deaktiviere Hardware-Beacon Zeitgeber" ++ ++msgid "Disabled" ++msgstr "Deaktiviert" ++ ++msgid "Discard upstream RFC1918 responses" ++msgstr "Eingehende RFC1918-Antworten verwerfen" ++ ++msgid "Displaying only packages containing" ++msgstr "Nur Pakete mit folgendem Inhalt anzeigen" ++ ++msgid "Distance Optimization" ++msgstr "Distanzoptimierung" ++ ++msgid "Distance to farthest network member in meters." ++msgstr "Distanz zum am weitesten entfernten Funkpartner in Metern." ++ ++msgid "Diversity" ++msgstr "Diversität" ++ ++# Nur für NAT-Firewalls? ++msgid "" ++"Dnsmasq is a combined DHCP-Server and DNS-" ++"Forwarder for NAT " ++"firewalls" ++msgstr "" ++"Dnsmasq ist ein kombinierter DHCP-Server und DNS-Forwarder für NAT " ++"Router" ++ ++msgid "Do not cache negative replies, e.g. for not existing domains" ++msgstr "" ++"Negative Antworten nicht zwischenspeichern, z.B. bei nicht existierenden " ++"Domains" ++ ++msgid "Do not forward requests that cannot be answered by public name servers" ++msgstr "" ++"Keine Anfragen weiterleiten welche nicht durch öffentliche Server " ++"beantwortet werden können" ++ ++msgid "Do not forward reverse lookups for local networks" ++msgstr "Keine Rückwärtsauflösungen für lokale Netzwerke weiterleiten" ++ ++msgid "Do not send probe responses" ++msgstr "Scan-Anforderungen nicht beantworten" ++ ++msgid "Domain required" ++msgstr "Anfragen nur mit Domain" ++ ++msgid "Domain whitelist" ++msgstr "Domain-Whitelist" ++ ++msgid "" ++"Don't forward DNS-Requests without " ++"DNS-Name" ++msgstr "Anfragen ohne Domainnamen nicht weiterleiten" ++ ++msgid "Download and install package" ++msgstr "Paket herunterladen und installieren" ++ ++msgid "Download backup" ++msgstr "Backup herunterladen" ++ ++msgid "Dropbear Instance" ++msgstr "Dropbear Instanz" ++ ++msgid "" ++"Dropbear offers SSH network shell access " ++"and an integrated SCP server" ++msgstr "" ++"Der SSH-Server ermöglicht Shell-Zugriff über das Netzwerk und bietet einen " ++"integrierten SCP-Dienst." ++ ++msgid "Dual-Stack Lite (RFC6333)" ++msgstr "" ++ ++msgid "Dynamic DHCP" ++msgstr "Dynamisches DHCP" ++ ++msgid "Dynamic tunnel" ++msgstr "Dynamischer Tunnel" ++ ++msgid "" ++"Dynamically allocate DHCP addresses for clients. If disabled, only clients " ++"having static leases will be served." ++msgstr "" ++"DHCP Adressen dynamisch erzeugen. Wenn dies deaktiviert ist, werden nur " ++"Clients mit konfigurierten statischen Leases bedient" ++ ++msgid "EAP-Method" ++msgstr "EAP-Methode" ++ ++msgid "Edit" ++msgstr "Bearbeiten" ++ ++msgid "" ++"Edit the raw configuration data above to fix any error and hit \"Save\" to " ++"reload the page." ++msgstr "" ++ ++msgid "Edit this interface" ++msgstr "Diese Schnittstelle bearbeiten" ++ ++msgid "Edit this network" ++msgstr "Dieses Netzwerk bearbeiten" ++ ++msgid "Emergency" ++msgstr "Notfall" ++ ++msgid "Enable" ++msgstr "Aktivieren" ++ ++msgid "Enable STP" ++msgstr "STP aktivieren" ++ ++msgid "Enable HE.net dynamic endpoint update" ++msgstr "Dynamisches HE.net IP-Adress-Update aktivieren" ++ ++msgid "Enable IPv6 negotiation on the PPP link" ++msgstr "Aushandeln von IPv6-Adressen auf der PPP-Verbindung aktivieren" ++ ++msgid "Enable Jumbo Frame passthrough" ++msgstr "Aktiviere Jumbo Frame Durchleitung" ++ ++msgid "Enable NTP client" ++msgstr "Aktiviere NTP-Client" ++ ++msgid "Enable TFTP server" ++msgstr "TFTP-Server aktivieren" ++ ++msgid "Enable VLAN functionality" ++msgstr "VLAN-Funktionalität aktivieren" ++ ++msgid "Enable WPS pushbutton, requires WPA(2)-PSK" ++msgstr "" ++ ++msgid "Enable learning and aging" ++msgstr "Learning und Aging aktivieren" ++ ++msgid "Enable mirroring of incoming packets" ++msgstr "" ++ ++msgid "Enable mirroring of outgoing packets" ++msgstr "" ++ ++msgid "Enable this mount" ++msgstr "Diesen Mountpunkt aktivieren" ++ ++msgid "Enable this swap" ++msgstr "Diesen Auslagerungsspeicher aktivieren" ++ ++msgid "Enable/Disable" ++msgstr "Aktivieren/Deaktivieren" ++ ++msgid "Enabled" ++msgstr "Aktiviert" ++ ++msgid "Enables the Spanning Tree Protocol on this bridge" ++msgstr "Aktiviert das Spanning Tree Protokoll auf dieser Netzwerkbrücke" ++ ++msgid "Encapsulation mode" ++msgstr "Kapselung" ++ ++msgid "Encryption" ++msgstr "Verschlüsselung" ++ ++msgid "Erasing..." ++msgstr "Lösche..." ++ ++msgid "Error" ++msgstr "Fehler" ++ ++msgid "Ethernet Adapter" ++msgstr "Netzwerkschnittstelle" ++ ++msgid "Ethernet Switch" ++msgstr "Netzwerk Switch" ++ ++msgid "Expand hosts" ++msgstr "Hosts vervollständigen" ++ ++msgid "Expires" ++msgstr "Verfällt" ++ ++#, fuzzy ++msgid "" ++"Expiry time of leased addresses, minimum is 2 minutes (2m)." ++msgstr "" ++"Gültigkeitsdauer von vergebenen Adressen. Das Minimum sind 2 Minuten " ++"(2m)." ++ ++msgid "External" ++msgstr "" ++ ++msgid "External system log server" ++msgstr "Externer Protokollserver IP" ++ ++msgid "External system log server port" ++msgstr "Externer Protokollserver Port" ++ ++msgid "Fast Frames" ++msgstr "Schnelle Frames" ++ ++msgid "File" ++msgstr "Datei" ++ ++msgid "Filename of the boot image advertised to clients" ++msgstr "Dateiname des Boot-Images welches den Clients mitgeteilt wird." ++ ++msgid "Filesystem" ++msgstr "Dateisystem" ++ ++msgid "Filter" ++msgstr "Filter" ++ ++msgid "Filter private" ++msgstr "Private Anfragen filtern" ++ ++msgid "Filter useless" ++msgstr "Windowsanfragen filtern" ++ ++msgid "Find and join network" ++msgstr "Suchen und Verbinden von Netzwerken" ++ ++msgid "Find package" ++msgstr "Paket suchen" ++ ++msgid "Finish" ++msgstr "Fertigstellen" ++ ++msgid "Firewall" ++msgstr "Firewall" ++ ++msgid "Firewall Settings" ++msgstr "Firewall Einstellungen" ++ ++msgid "Firewall Status" ++msgstr "Firewall-Status" ++ ++msgid "Firmware Version" ++msgstr "Firmware Version" ++ ++msgid "Fixed source port for outbound DNS queries" ++msgstr "Fester Port für ausgehende DNS-Anfragen" ++ ++msgid "Flags" ++msgstr "Parameter" ++ ++msgid "Flash Firmware" ++msgstr "Firmware aktualisieren" ++ ++msgid "Flash image..." ++msgstr "Firmware aktualisieren..." ++ ++msgid "Flash new firmware image" ++msgstr "Neues Firmware Image schreiben" ++ ++msgid "Flash operations" ++msgstr "Flash-Operationen" ++ ++msgid "Flashing..." ++msgstr "Firmware wird installiert..." ++ ++msgid "Force" ++msgstr "Start erzwingen" ++ ++msgid "Force CCMP (AES)" ++msgstr "CCMP (AES) erzwingen" ++ ++msgid "Force DHCP on this network even if another server is detected." ++msgstr "" ++"Aktiviere DHCP-Server für dieses Netzwerk, selbst wenn ein anderer aktiver " ++"Server erkannt wurde." ++ ++msgid "Force TKIP" ++msgstr "Erzwinge TKIP" ++ ++msgid "Force TKIP and CCMP (AES)" ++msgstr "Erzwinge TKIP und CCMP (AES)" ++ ++msgid "Forward DHCP traffic" ++msgstr "DHCP Traffic weiterleiten" ++ ++msgid "Forward broadcast traffic" ++msgstr "Broadcasts weiterleiten" ++ ++msgid "Forwarding mode" ++msgstr "Weiterleitungstyp" ++ ++msgid "Fragmentation Threshold" ++msgstr "Fragmentierungsschwelle" ++ ++msgid "Frame Bursting" ++msgstr "Frame Bursting" ++ ++msgid "Free" ++msgstr "Frei" ++ ++msgid "Free space" ++msgstr "Freier Platz" ++ ++msgid "GHz" ++msgstr "GHz" ++ ++msgid "GPRS only" ++msgstr "Nur GPRS" ++ ++msgid "Gateway" ++msgstr "Gateway" ++ ++msgid "Gateway ports" ++msgstr "Gateway-Ports" ++ ++msgid "General Settings" ++msgstr "Allgemeine Einstellungen" ++ ++msgid "General Setup" ++msgstr "Allgemeine Einstellungen" ++ ++msgid "Generate archive" ++msgstr "Sicherung erstellen" ++ ++msgid "Generic 802.11%s Wireless Controller" ++msgstr "Generischer 802.11%s W-LAN Adapter" ++ ++msgid "Given password confirmation did not match, password not changed!" ++msgstr "" ++"Die angegebenen Passwörter stimmen nicht überein, das Systempasswort wurde " ++"nicht geändert!" ++ ++msgid "Global network options" ++msgstr "" ++ ++msgid "Go to password configuration..." ++msgstr "Zur Passwortkonfiguration..." ++ ++msgid "Go to relevant configuration page" ++msgstr "Gehe zur entsprechenden Konfigurationsseite" ++ ++msgid "Guest" ++msgstr "" ++ ++msgid "HE.net password" ++msgstr "HE.net Passwort" ++ ++msgid "HE.net username" ++msgstr "" ++ ++msgid "Handler" ++msgstr "Handler" ++ ++msgid "Hang Up" ++msgstr "Auflegen" ++ ++msgid "Heartbeat" ++msgstr "" ++ ++msgid "" ++"Here you can configure the basic aspects of your device like its hostname or " ++"the timezone." ++msgstr "" ++"An dieser Stelle können Grundeinstellungen des Systems wie Hostname oder " ++"Zeitzone vorgenommen werden." ++ ++msgid "" ++"Here you can paste public SSH-Keys (one per line) for SSH public-key " ++"authentication." ++msgstr "" ++"Hier können öffentliche SSH-Schlüssel reinkopiert werden (einer pro Zeile)." ++ ++msgid "Hermes 802.11b Wireless Controller" ++msgstr "Hermes 802.11b W-LAN Adapter" ++ ++msgid "Hide ESSID" ++msgstr "ESSID verstecken" ++ ++msgid "Host entries" ++msgstr "Host-Einträge" ++ ++msgid "Host expiry timeout" ++msgstr "Host Verfallsdatum" ++ ++msgid "Host-IP or Network" ++msgstr "Host-IP oder Netzwerk" ++ ++msgid "Hostname" ++msgstr "Hostname" ++ ++msgid "Hostname to send when requesting DHCP" ++msgstr "Zu sendender Hostname bei DHCP Anfragen" ++ ++msgid "Hostnames" ++msgstr "Rechnernamen" ++ ++msgid "Hybrid" ++msgstr "" ++ ++msgid "IP address" ++msgstr "IP-Adresse" ++ ++msgid "IPv4" ++msgstr "IPv4" ++ ++msgid "IPv4 Firewall" ++msgstr "IPv4 Firewall" ++ ++msgid "IPv4 WAN Status" ++msgstr "IPv4 WAN Status" ++ ++msgid "IPv4 address" ++msgstr "IPv4 Adresse" ++ ++msgid "IPv4 and IPv6" ++msgstr "IPv4 und IPv6" ++ ++msgid "IPv4 assignment length" ++msgstr "" ++ ++msgid "IPv4 broadcast" ++msgstr "IPv4 Broadcast" ++ ++msgid "IPv4 gateway" ++msgstr "IPv4 Gateway" ++ ++msgid "IPv4 netmask" ++msgstr "IPv4 Netzmaske" ++ ++msgid "IPv4 only" ++msgstr "nur IPv4" ++ ++msgid "IPv4 prefix length" ++msgstr "Länge des IPv4 Präfix" ++ ++msgid "IPv4-Address" ++msgstr "IPv4-Adresse" ++ ++msgid "IPv6" ++msgstr "IPv6" ++ ++msgid "IPv6 Firewall" ++msgstr "IPv6 Firewall" ++ ++msgid "IPv6 Neighbours" ++msgstr "" ++ ++msgid "IPv6 Settings" ++msgstr "" ++ ++msgid "IPv6 ULA-Prefix" ++msgstr "" ++ ++msgid "IPv6 WAN Status" ++msgstr "IPv6 WAN Status" ++ ++msgid "IPv6 address" ++msgstr "IPv6 Adresse" ++ ++msgid "IPv6 address delegated to the local tunnel endpoint (optional)" ++msgstr "" ++ ++msgid "IPv6 assignment hint" ++msgstr "" ++ ++msgid "IPv6 assignment length" ++msgstr "" ++ ++msgid "IPv6 gateway" ++msgstr "IPv6 Gateway" ++ ++msgid "IPv6 only" ++msgstr "nur IPv6" ++ ++msgid "IPv6 prefix" ++msgstr "IPv6 Präfix" ++ ++msgid "IPv6 prefix length" ++msgstr "Länge des IPv6 Präfix" ++ ++msgid "IPv6 routed prefix" ++msgstr "" ++ ++msgid "IPv6-Address" ++msgstr "IPv6-Adresse" ++ ++msgid "IPv6-in-IPv4 (RFC4213)" ++msgstr "IPv6-in-IPv4 (RFC4213)" ++ ++msgid "IPv6-over-IPv4 (6rd)" ++msgstr "IPv6-über-IPv4 (6rd)" ++ ++msgid "IPv6-over-IPv4 (6to4)" ++msgstr "IPv6-über-IPv4 (6to4)" ++ ++msgid "Identity" ++msgstr "Identität" ++ ++msgid "" ++"If specified, mount the device by its UUID instead of a fixed device node" ++msgstr "" ++"Wenn angegeben, wird das Gerät anhand seiner UUID statt fester Gerätedatei " ++"gemounted" ++ ++msgid "" ++"If specified, mount the device by the partition label instead of a fixed " ++"device node" ++msgstr "" ++"Wenn angegeben, wird das Gerät nach anhhand des Partitionslabels statt " ++"fester Gerätedatei gemounted" ++ ++msgid "If unchecked, no default route is configured" ++msgstr "Wenn deaktiviert, wird keine Default-Route gesetzt" ++ ++msgid "If unchecked, the advertised DNS server addresses are ignored" ++msgstr "Falls deaktiviert werden die zugewiesenen DNS-Server ignoriert" ++ ++msgid "" ++"If your physical memory is insufficient unused data can be temporarily " ++"swapped to a swap-device resulting in a higher amount of usable RAM. Be aware that swapping data is a very " ++"slow process as the swap-device cannot be accessed with the high datarates " ++"of the RAM." ++msgstr "" ++"Falls der Arbeitsspeicher des Routers nicht ausreicht, kann dieser nicht " ++"benutzte Daten zeitweise auf einem SWAP-Laufwerk auslagern um so die " ++"effektive Größe des Arbeitsspeichers zu erhöhen. Die Auslagerung der Daten " ++"ist natürlich bedeutend langsamer als direkte Arbeitsspeicherzugriffe." ++ ++msgid "Ignore Hosts files" ++msgstr "Hosts-Dateien ignorieren" ++ ++msgid "Ignore interface" ++msgstr "Schnittstelle ignorieren" ++ ++msgid "Ignore resolve file" ++msgstr "Resolv-Datei ignorieren" ++ ++msgid "Image" ++msgstr "Image" ++ ++msgid "In" ++msgstr "Ein" ++ ++msgid "Inactivity timeout" ++msgstr "Timeout bei Inaktivität" ++ ++msgid "Inbound:" ++msgstr "Eingehend:" ++ ++msgid "Info" ++msgstr "Info" ++ ++msgid "Initscript" ++msgstr "Startscript" ++ ++msgid "Initscripts" ++msgstr "Startscripte" ++ ++msgid "Install" ++msgstr "Installieren" ++ ++msgid "Install iputils-traceroute6 for IPv6 traceroute" ++msgstr "" ++ ++msgid "Install package %q" ++msgstr "Installiere Paket %q" ++ ++msgid "Install protocol extensions..." ++msgstr "Installiere Protokoll-Erweiterungen" ++ ++msgid "Installed packages" ++msgstr "Installierte Pakete" ++ ++msgid "Interface" ++msgstr "Schnittstelle" ++ ++msgid "Interface Configuration" ++msgstr "Schnittstellenkonfiguration" ++ ++msgid "Interface Overview" ++msgstr "Schnittstellenübersicht" ++ ++msgid "Interface is reconnecting..." ++msgstr "Schnittstelle verbindet neu..." ++ ++msgid "Interface is shutting down..." ++msgstr "Schnittstelle fährt herunter..." ++ ++msgid "Interface not present or not connected yet." ++msgstr "Schnittstelle existiert nicht oder ist nicht verbunden." ++ ++msgid "Interface reconnected" ++msgstr "Schnittstelle neu verbunden" ++ ++msgid "Interface shut down" ++msgstr "Schnittstelle heruntergefahren" ++ ++msgid "Interfaces" ++msgstr "Schnittstellen" ++ ++msgid "Internal" ++msgstr "" ++ ++msgid "Internal Server Error" ++msgstr "Interner Serverfehler" ++ ++msgid "Invalid" ++msgstr "Ungültige Eingabe" ++ ++msgid "Invalid VLAN ID given! Only IDs between %d and %d are allowed." ++msgstr "Ungültige VLAN ID angegeben! Nur IDs zwischen %d und %d sind erlaubt." ++ ++msgid "Invalid VLAN ID given! Only unique IDs are allowed" ++msgstr "Ungültige VLAN ID angegeben! Die ID ist muß eindeutig sein!" ++ ++msgid "Invalid username and/or password! Please try again." ++msgstr "" ++"Ungültiger Benutzername oder ungültiges Passwort! Bitte erneut versuchen. " ++ ++#, fuzzy ++msgid "" ++"It appears that you are trying to flash an image that does not fit into the " ++"flash memory, please verify the image file!" ++msgstr "" ++"Das verwendete Image scheint zu groß für den internen Flash-Speicher zu " ++"sein. Ãœberprüfen Sie die Imagedatei!" ++ ++msgid "Java Script required!" ++msgstr "Java-Script benötigt!" ++ ++msgid "Join Network" ++msgstr "Netzwerk beitreten" ++ ++msgid "Join Network: Settings" ++msgstr "Netzwerk beitreten: Einstellungen" ++ ++msgid "Join Network: Wireless Scan" ++msgstr "Netzwerk beitreten: Suche nach Netzwerken" ++ ++msgid "Keep settings" ++msgstr "Konfiguration behalten" ++ ++msgid "Kernel Log" ++msgstr "Kernelprotokoll" ++ ++msgid "Kernel Version" ++msgstr "Kernel Version" ++ ++msgid "Key" ++msgstr "Schlüssel" ++ ++msgid "Key #%d" ++msgstr "Schlüssel Nr. %d" ++ ++msgid "Kill" ++msgstr "Töten" ++ ++msgid "L2TP" ++msgstr "L2TP" ++ ++msgid "L2TP Server" ++msgstr "L2TP Server" ++ ++msgid "LCP echo failure threshold" ++msgstr "LCP Echo Fehler Schwellenwert" ++ ++msgid "LCP echo interval" ++msgstr "LCP Echo Intervall" ++ ++msgid "LLC" ++msgstr "LLC" ++ ++msgid "Label" ++msgstr "Label" ++ ++msgid "Language" ++msgstr "Sprache" ++ ++msgid "Language and Style" ++msgstr "Sprache und Aussehen" ++ ++msgid "Leaf" ++msgstr "" ++ ++msgid "Lease validity time" ++msgstr "Lease-Gültigkeitsdauer" ++ ++msgid "Leasefile" ++msgstr "Leasedatei" ++ ++msgid "Leasetime" ++msgstr "Laufzeit" ++ ++msgid "Leasetime remaining" ++msgstr "Verbleibende Gültigkeit" ++ ++msgid "Leave empty to autodetect" ++msgstr "Zur automatischen Erkennung leer lassen" ++ ++msgid "Leave empty to use the current WAN address" ++msgstr "Leer lassen um die aktuelle WAN-Adresse zu verwenden" ++ ++msgid "Legend:" ++msgstr "Legende:" ++ ++msgid "Limit" ++msgstr "Limit" ++ ++msgid "Line Attenuation" ++msgstr "" ++ ++msgid "Line Speed" ++msgstr "" ++ ++msgid "Line State" ++msgstr "" ++ ++msgid "Link On" ++msgstr "Verbindung hergestellt" ++ ++msgid "" ++"List of DNS servers to forward " ++"requests to" ++msgstr "" ++"Liste von DNS-Servern an welche " ++"Requests weitergeleitet werden" ++ ++msgid "List of domains to allow RFC1918 responses for" ++msgstr "Liste von Domains für welche RFC1918-Antworten erlaubt sind" ++ ++msgid "List of hosts that supply bogus NX domain results" ++msgstr "Liste von Servern die falsche \"NX Domain\" Antworten liefern" ++ ++msgid "Listen only on the given interface or, if unspecified, on all" ++msgstr "" ++"Nur auf die gegebene Schnittstelle reagieren, nutze alle wenn nicht " ++"spezifiziert" ++ ++msgid "Listening port for inbound DNS queries" ++msgstr "Serverport für eingehende DNS Abfragen" ++ ++msgid "Load" ++msgstr "Last" ++ ++msgid "Load Average" ++msgstr "Durchschnittslast" ++ ++msgid "Loading" ++msgstr "Lade" ++ ++msgid "Local IPv4 address" ++msgstr "Lokale IPv4 Adresse" ++ ++msgid "Local IPv6 address" ++msgstr "Lokale IPv6 Adresse" ++ ++msgid "Local Startup" ++msgstr "Lokales Startskript" ++ ++msgid "Local Time" ++msgstr "Lokale Zeit" ++ ++msgid "Local domain" ++msgstr "Lokale Domain" ++ ++#, fuzzy ++msgid "" ++"Local domain specification. Names matching this domain are never forwarded " ++"and are resolved from DHCP or hosts files only" ++msgstr "" ++"Spezifiziert den lokalen Domainnamen. Anfragen für Hostnamen welche auf " ++"diese Domain zutreffen werden nie weitergeleitet und ausschließlich aus DHCP-" ++"Namen oder Hosts-Dateien aufgelöst" ++ ++msgid "Local domain suffix appended to DHCP names and hosts file entries" ++msgstr "" ++"Lokaler Domain-Suffix welcher an DHCP Namen und Host-Datei Einträge " ++"angehangen wird" ++ ++msgid "Local server" ++msgstr "Lokaler Server" ++ ++msgid "" ++"Localise hostname depending on the requesting subnet if multiple IPs are " ++"available" ++msgstr "" ++"Hostnamen je nach anfragendem Subnetz auflösen wenn mehrere IPs verfügbar " ++"sind" ++ ++msgid "Localise queries" ++msgstr "Lokalisiere Anfragen" ++ ++msgid "Locked to channel %d used by: %s" ++msgstr "" ++ ++msgid "Log output level" ++msgstr "Protokolllevel" ++ ++msgid "Log queries" ++msgstr "Schreibe Abfragelog" ++ ++msgid "Logging" ++msgstr "Protokollierung" ++ ++msgid "Login" ++msgstr "Anmelden" ++ ++msgid "Logout" ++msgstr "Abmelden" ++ ++msgid "Lowest leased address as offset from the network address." ++msgstr "Kleinste vergebene Adresse (Netzwerkadresse + x)" ++ ++msgid "MAC-Address" ++msgstr "MAC-Adresse" ++ ++msgid "MAC-Address Filter" ++msgstr "MAC-Adressfilter" ++ ++msgid "MAC-Filter" ++msgstr "MAC-Filter" ++ ++msgid "MAC-List" ++msgstr "MAC-Adressliste" ++ ++msgid "MB/s" ++msgstr "MB/s" ++ ++msgid "MHz" ++msgstr "MHz" ++ ++msgid "MTU" ++msgstr "MTU" ++ ++msgid "" ++"Make sure to clone the root filesystem using something like the commands " ++"below:" ++msgstr "" ++ ++msgid "Maximum Rate" ++msgstr "Höchstübertragungsrate" ++ ++msgid "Maximum allowed number of active DHCP leases" ++msgstr "Maximal zulässige Anzahl von aktiven DHCP-Leases" ++ ++msgid "Maximum allowed number of concurrent DNS queries" ++msgstr "Maximal zulässige Anzahl an gleichzeitigen DNS-Anfragen" ++ ++msgid "Maximum allowed size of EDNS.0 UDP packets" ++msgstr "Maximal zulässige Größe von EDNS.0 UDP Paketen" ++ ++msgid "Maximum amount of seconds to wait for the modem to become ready" ++msgstr "Maximale Zeit die gewartet wird bis das Modem bereit ist (in Sekunden)" ++ ++msgid "Maximum hold time" ++msgstr "Maximalzeit zum Halten der Verbindung" ++ ++msgid "Maximum number of leased addresses." ++msgstr "Maximal zulässige Anzahl von vergeben DHCP-Adressen" ++ ++msgid "Mbit/s" ++msgstr "Mbit/s" ++ ++msgid "Memory" ++msgstr "Hauptspeicher" ++ ++msgid "Memory usage (%)" ++msgstr "Speichernutzung (%)" ++ ++msgid "Metric" ++msgstr "Metrik" ++ ++msgid "Minimum Rate" ++msgstr "Mindestübertragungsrate" ++ ++msgid "Minimum hold time" ++msgstr "Minimalzeit zum Halten der Verbindung" ++ ++msgid "Mirror monitor port" ++msgstr "" ++ ++msgid "Mirror source port" ++msgstr "" ++ ++msgid "Missing protocol extension for proto %q" ++msgstr "Erweiterung für Protokoll %q fehlt" ++ ++msgid "Mode" ++msgstr "Modus" ++ ++msgid "Model" ++msgstr "" ++ ++msgid "Modem device" ++msgstr "Modemgerät" ++ ++msgid "Modem init timeout" ++msgstr "Wartezeit für Modeminitialisierung" ++ ++msgid "Monitor" ++msgstr "Monitor" ++ ++msgid "Mount Entry" ++msgstr "Mount-Eintrag" ++ ++msgid "Mount Point" ++msgstr "Einhängepunkt" ++ ++msgid "Mount Points" ++msgstr "Einhängepunkte" ++ ++msgid "Mount Points - Mount Entry" ++msgstr "Mountpunkte - Mount-Eintrag" ++ ++msgid "Mount Points - Swap Entry" ++msgstr "Mountpunkte - Auslagerungsdatei" ++ ++msgid "" ++"Mount Points define at which point a memory device will be attached to the " ++"filesystem" ++msgstr "" ++"Einhängepunkte bestimmen, an welcher Stelle des Dateisystems bestimmte " ++"Laufwerke und Speicher zur Verwendung eingebunden werden." ++ ++msgid "Mount options" ++msgstr "Mount-Optionen" ++ ++msgid "Mount point" ++msgstr "Mountpunkt" ++ ++msgid "Mounted file systems" ++msgstr "Eingehängte Dateisysteme" ++ ++msgid "Move down" ++msgstr "Nach unten schieben" ++ ++msgid "Move up" ++msgstr "Nach oben schieben" ++ ++msgid "Multicast Rate" ++msgstr "Multicastrate" ++ ++msgid "Multicast address" ++msgstr "Multicast-Adresse" ++ ++msgid "NAS ID" ++msgstr "NAS ID" ++ ++msgid "NDP-Proxy" ++msgstr "" ++ ++msgid "NTP server candidates" ++msgstr "NTP Server Kandidaten" ++ ++msgid "NTP sync time-out" ++msgstr "" ++ ++msgid "Name" ++msgstr "Name" ++ ++msgid "Name of the new interface" ++msgstr "Name der neuen Schnittstelle" ++ ++msgid "Name of the new network" ++msgstr "Name des neuen Netzwerkes" ++ ++msgid "Navigation" ++msgstr "Navigation" ++ ++msgid "Netmask" ++msgstr "Netzmaske" ++ ++msgid "Network" ++msgstr "Netzwerk" ++ ++msgid "Network Utilities" ++msgstr "Netzwerk-Werkzeuge" ++ ++msgid "Network boot image" ++msgstr "Netzwerk-Boot-Image" ++ ++msgid "Network without interfaces." ++msgstr "Netzwerk ohne Schnittstellen." ++ ++msgid "Next »" ++msgstr "Weiter »" ++ ++msgid "No DHCP Server configured for this interface" ++msgstr "Kein DHCP Server auf dieser Schnittstelle eingerichtet" ++ ++msgid "No chains in this table" ++msgstr "Keine Ketten in dieser Tabelle" ++ ++msgid "No files found" ++msgstr "Keine Dateien gefunden" ++ ++msgid "No information available" ++msgstr "Keine Informationen verfügbar" ++ ++msgid "No negative cache" ++msgstr "Kein Negativ-Cache" ++ ++msgid "No network configured on this device" ++msgstr "Keine Netzwerke auf diesem Gerät konfiguriert" ++ ++msgid "No network name specified" ++msgstr "Netzwerkname nicht angegeben" ++ ++# Ich glab das ist so richtiger ++msgid "No package lists available" ++msgstr "Es sind keine Paketlisten vorhanden" ++ ++msgid "No password set!" ++msgstr "Kein Passwort gesetzt!" ++ ++msgid "No rules in this chain" ++msgstr "Keine Regeln in dieser Kette" ++ ++msgid "No zone assigned" ++msgstr "Keine Zone zugewiesen" ++ ++msgid "Noise" ++msgstr "Rauschen" ++ ++msgid "Noise Margin" ++msgstr "" ++ ++msgid "Noise:" ++msgstr "Noise:" ++ ++msgid "None" ++msgstr "keine" ++ ++msgid "Normal" ++msgstr "Normal" ++ ++msgid "Not Found" ++msgstr "Nicht Gefunden" ++ ++msgid "Not associated" ++msgstr "Nicht assoziiert" ++ ++msgid "Not connected" ++msgstr "Nicht verbunden" ++ ++msgid "Note: Configuration files will be erased." ++msgstr "Warnung: Konfigurationsdateien werden gelöscht." ++ ++msgid "Notice" ++msgstr "Notiz" ++ ++msgid "Nslookup" ++msgstr "DNS-Auflösung" ++ ++msgid "OK" ++msgstr "OK" ++ ++msgid "OPKG-Configuration" ++msgstr "OPKG-Konfiguration" ++ ++msgid "Off-State Delay" ++msgstr "Verzögerung für Ausschalt-Zustand" ++ ++msgid "" ++"On this page you can configure the network interfaces. You can bridge " ++"several interfaces by ticking the \"bridge interfaces\" field and enter the " ++"names of several network interfaces separated by spaces. You can also use " ++"VLAN notation " ++"INTERFACE.VLANNR (e.g.: " ++"eth0.1)." ++msgstr "" ++"An dieser Stelle können die einzelnen Schnittstellen des Netzwerkes " ++"konfiguriert werden. Es können mehrere Schnittstellen zu einer Brücke " ++"zusammengefasst werden, indem diese durch Leerzeichen getrennt aufgezählt " ++"werden und ein entsprechender Haken im Feld Netzwerkbrücke gesetzt wird. Es " ++"können VLANs in der Notation SCHNITTSTELLE.VLANNR (z.B.: eth0.1) verwendet " ++"werden." ++ ++msgid "On-State Delay" ++msgstr "Verzögerung für Anschalt-Zustand" ++ ++msgid "One of hostname or mac address must be specified!" ++msgstr "Es muss entweder ein Hostname oder eine MAC-Adresse angegeben werden!" ++ ++msgid "One or more fields contain invalid values!" ++msgstr "Ein oder mehrere Felder enthalten ungültige Werte!" ++ ++msgid "One or more required fields have no value!" ++msgstr "Ein oder mehr benötigte Felder sind nicht ausgefüllt!" ++ ++msgid "Open list..." ++msgstr "Liste öffnen..." ++ ++msgid "OpenConnect (CISCO AnyConnect)" ++msgstr "" ++ ++msgid "Operating frequency" ++msgstr "" ++ ++msgid "Option changed" ++msgstr "Option geändert" ++ ++msgid "Option removed" ++msgstr "Option entfernt" ++ ++msgid "Optional, specify to override default server (tic.sixxs.net)" ++msgstr "" ++ ++msgid "Optional, use when the SIXXS account has more than one tunnel" ++msgstr "" ++ ++msgid "Options" ++msgstr "Optionen" ++ ++msgid "Other:" ++msgstr "Andere:" ++ ++msgid "Out" ++msgstr "Aus" ++ ++msgid "Outbound:" ++msgstr "Ausgehend:" ++ ++msgid "Outdoor Channels" ++msgstr "Funkkanal für den Ausseneinsatz" ++ ++msgid "Output Interface" ++msgstr "" ++ ++msgid "Override MAC address" ++msgstr "MAC-Adresse überschreiben" ++ ++msgid "Override MTU" ++msgstr "MTU-Wert überschreiben" ++ ++msgid "Override the gateway in DHCP responses" ++msgstr "Gateway-Adresse in DHCP-Antworten überschreiben" ++ ++msgid "" ++"Override the netmask sent to clients. Normally it is calculated from the " ++"subnet that is served." ++msgstr "" ++"Ãœberschreibt die Netzmaske welche an Clients geschickt wird. Normalerweise " ++"wird diese vom bedienten Subnetz abgeleitet." ++ ++msgid "Override the table used for internal routes" ++msgstr "Ãœberschreibt die benutzte Tabelle für interne Routen" ++ ++msgid "Overview" ++msgstr "Ãœbersicht" ++ ++msgid "Owner" ++msgstr "Besitzer" ++ ++msgid "PAP/CHAP password" ++msgstr "PAP/CHAP Passwort" ++ ++msgid "PAP/CHAP username" ++msgstr "PAP/CHAP Benutzername" ++ ++msgid "PID" ++msgstr "PID" ++ ++msgid "PIN" ++msgstr "PIN" ++ ++msgid "PPP" ++msgstr "PPP" ++ ++msgid "PPPoA Encapsulation" ++msgstr "PPPoA Kapselung" ++ ++msgid "PPPoATM" ++msgstr "PPPoATM" ++ ++msgid "PPPoE" ++msgstr "PPPoE" ++ ++msgid "PPtP" ++msgstr "PPtP" ++ ++msgid "Package libiwinfo required!" ++msgstr "Benötige das libiwinfo Paket!" ++ ++msgid "Package lists are older than 24 hours" ++msgstr "Die Paketlisten sind älter als 24 Stunden" ++ ++msgid "Package name" ++msgstr "Paketname" ++ ++msgid "Packets" ++msgstr "Pakete" ++ ++msgid "Part of zone %q" ++msgstr "Teil von Zone %q" ++ ++msgid "Password" ++msgstr "Passwort" ++ ++msgid "Password authentication" ++msgstr "Passwortanmeldung" ++ ++msgid "Password of Private Key" ++msgstr "Passwort des Privaten Schlüssels" ++ ++msgid "Password successfully changed!" ++msgstr "Passwort erfolgreich geändert!" ++ ++msgid "Path" ++msgstr "Pfad" ++ ++msgid "Path to CA-Certificate" ++msgstr "Pfad zum CA-Zertifikat" ++ ++msgid "Path to Client-Certificate" ++msgstr "Pfad zu Client-Zertifikat" ++ ++msgid "Path to Private Key" ++msgstr "Pfad zum Privaten Schlüssel" ++ ++msgid "Path to executable which handles the button event" ++msgstr "Ausführbare Datei welche das Schalter-Ereignis verarbeitet" ++ ++msgid "Peak:" ++msgstr "Spitze:" ++ ++msgid "Perform reboot" ++msgstr "Neustart durchführen" ++ ++msgid "Perform reset" ++msgstr "Reset durchführen" ++ ++msgid "Phy Rate:" ++msgstr "Phy-Rate:" ++ ++msgid "Physical Settings" ++msgstr "Physikalische Einstellungen" ++ ++msgid "Ping" ++msgstr "Ping-Anfrage" ++ ++msgid "Pkts." ++msgstr "Pkte." ++ ++msgid "Please enter your username and password." ++msgstr "Bitte Benutzernamen und Passwort eingeben." ++ ++msgid "Please wait: Device rebooting..." ++msgstr "Bitte warten: Neustart wird durchgeführt..." ++ ++msgid "Policy" ++msgstr "Standardregel" ++ ++msgid "Port" ++msgstr "Port" ++ ++msgid "Port %d" ++msgstr "Port %d" ++ ++msgid "Port %d is untagged in multiple VLANs!" ++msgstr "Port %d ist untagged in mehreren VLANs!" ++ ++msgid "Port status:" ++msgstr "Port-Status:" ++ ++msgid "" ++"Presume peer to be dead after given amount of LCP echo failures, use 0 to " ++"ignore failures" ++msgstr "" ++"Deklariere den Client als tot nach der angegebenen Anzahl von LCP Echo " ++"Fehlschlägen, nutze den Wert 0 um Fehler zu ignorieren" ++ ++msgid "Prevents client-to-client communication" ++msgstr "Unterbindet Client-Client-Verkehr" ++ ++msgid "Prism2/2.5/3 802.11b Wireless Controller" ++msgstr "Prism2/2.5/3 802.11b W-LAN Adapter" ++ ++msgid "Proceed" ++msgstr "Fortfahren" ++ ++msgid "Processes" ++msgstr "Prozesse" ++ ++msgid "Prot." ++msgstr "Prot." ++ ++msgid "Protocol" ++msgstr "Protokoll" ++ ++msgid "Protocol family" ++msgstr "Protokollfamilie" ++ ++msgid "Protocol of the new interface" ++msgstr "Protokoll für die neue Schnittstelle" ++ ++msgid "Protocol support is not installed" ++msgstr "Protokollunterstützung ist nicht installiert" ++ ++msgid "Provide NTP server" ++msgstr "NTP-Server anbieten" ++ ++msgid "Provide new network" ++msgstr "Neues Netzwerk anbieten" ++ ++msgid "Pseudo Ad-Hoc (ahdemo)" ++msgstr "Pseudo Ad-Hoc (ahdemo)" ++ ++msgid "Public prefix routed to this device for distribution to clients." ++msgstr "" ++ ++msgid "Quality" ++msgstr "Qualität" ++ ++msgid "RTS/CTS Threshold" ++msgstr "RTS/CTS-Schwelle" ++ ++# Ein / Aus, eingehend / ausgehend? ++msgid "RX" ++msgstr "RX" ++ ++msgid "RX Rate" ++msgstr "RX-Rate" ++ ++msgid "RaLink 802.11%s Wireless Controller" ++msgstr "RaLink 802.11%s W-LAN Adapter" ++ ++msgid "Radius-Accounting-Port" ++msgstr "Radius-Accounting-Port" ++ ++msgid "Radius-Accounting-Secret" ++msgstr "Radius-Accounting-Secret" ++ ++msgid "Radius-Accounting-Server" ++msgstr "Radius-Accounting-Server" ++ ++msgid "Radius-Authentication-Port" ++msgstr "Radius-Authentication-Port" ++ ++msgid "Radius-Authentication-Secret" ++msgstr "Radius-Authentication-Secret" ++ ++msgid "Radius-Authentication-Server" ++msgstr "Radius-Authentication-Server" ++ ++msgid "" ++"Read /etc/ethers to configure the DHCP-Server" ++msgstr "Lese Informationen aus /etc/ethers um den DHCP-Server zu konfigurieren" ++ ++msgid "" ++"Really delete this interface? The deletion cannot be undone!\\nYou might " ++"lose access to this device if you are connected via this interface." ++msgstr "" ++"Diese Schnittstelle wirklich löschen? Der Schritt kann nicht rückgängig " ++"gemacht werden!\n" ++"Der Zugriff auf das Gerät könnte verlorengehen wenn Sie über diese " ++"Schnittstelle verbunden sind." ++ ++msgid "" ++"Really delete this wireless network? The deletion cannot be undone!\\nYou " ++"might lose access to this device if you are connected via this network." ++msgstr "" ++"Dieses Drahtlosnetzwerk wirklich löschen? Der Schritt kann nicht rückgängig " ++"gemacht werden!\n" ++"Der Zugriff auf das Gerät könnte verlorengehen wenn Sie über dieses Netzwerk " ++"verbunden sind." ++ ++msgid "Really reset all changes?" ++msgstr "Sollen wirklich alle Änderungen verworfen werden?" ++ ++#, fuzzy ++msgid "" ++"Really shut down network?\\nYou might lose access to this device if you are " ++"connected via this interface." ++msgstr "" ++"Das Netzwerk wirklich herunterfahren?\n" ++"Der Zugriff auf das Gerät könnte verlorengehen wenn Sie über diese " ++"Schnittstelle verbunden sind." ++ ++msgid "" ++"Really shutdown interface \"%s\" ?\\nYou might lose access to this device if " ++"you are connected via this interface." ++msgstr "" ++"Die Schnitstelle \"%s\" wirklich herunterfahren?\n" ++"Der Zugriff auf das Gerät könnte verlorengehen wenn Sie über diese " ++"Schnittstelle verbunden sind." ++ ++msgid "Really switch protocol?" ++msgstr "Protokoll wirklich wechseln?" ++ ++msgid "Realtime Connections" ++msgstr "Echtzeitverbindungen" ++ ++msgid "Realtime Graphs" ++msgstr "Echtzeit-Diagramme" ++ ++msgid "Realtime Load" ++msgstr "Echtzeitsystemlast" ++ ++msgid "Realtime Traffic" ++msgstr "Echtzeitverkehr" ++ ++msgid "Realtime Wireless" ++msgstr "Echtzeit-WLAN-Signal" ++ ++msgid "Rebind protection" ++msgstr "DNS-Rebind-Schutz" ++ ++msgid "Reboot" ++msgstr "Neu Starten" ++ ++msgid "Rebooting..." ++msgstr "Das System wird neu gestartet..." ++ ++msgid "Reboots the operating system of your device" ++msgstr "Startet das Betriebssystem des Routers neu." ++ ++msgid "Receive" ++msgstr "Empfangen" ++ ++msgid "Receiver Antenna" ++msgstr "Empfangsantenne" ++ ++msgid "Reconnect this interface" ++msgstr "Diese Schnittstelle neu verbinden" ++ ++msgid "Reconnecting interface" ++msgstr "Verbinde Schnittstelle neu" ++ ++msgid "References" ++msgstr "Verweise" ++ ++msgid "Regulatory Domain" ++msgstr "Geltungsbereich (Regulatory Domain)" ++ ++msgid "Relay" ++msgstr "Relay" ++ ++msgid "Relay Bridge" ++msgstr "Relay-Brücke" ++ ++msgid "Relay between networks" ++msgstr "Zwischen folgenden Netzwerken weiterleiten" ++ ++msgid "Relay bridge" ++msgstr "Relay-Brücke" ++ ++msgid "Remote IPv4 address" ++msgstr "Entfernte IPv4-Adresse" ++ ++msgid "Remove" ++msgstr "Entfernen" ++ ++msgid "Repeat scan" ++msgstr "Scan wiederholen" ++ ++msgid "Replace entry" ++msgstr "Eintrag ersetzen" ++ ++msgid "Replace wireless configuration" ++msgstr "Drahtloskonfiguration ersetzen" ++ ++msgid "Request IPv6-address" ++msgstr "" ++ ++msgid "Request IPv6-prefix of length" ++msgstr "" ++ ++msgid "Require TLS" ++msgstr "" ++ ++msgid "Required for certain ISPs, e.g. Charter with DOCSIS 3" ++msgstr "" ++"Wird von bestimmten Internet-Providern benötigt, z.B. Charter mit DOCSIS 3" ++ ++msgid "Reset" ++msgstr "Zurücksetzen" ++ ++msgid "Reset Counters" ++msgstr "Zähler zurücksetzen" ++ ++msgid "Reset to defaults" ++msgstr "Auslieferungszustand wiederherstellen" ++ ++msgid "Resolv and Hosts Files" ++msgstr "Resolv- und Hosts-Dateien" ++ ++msgid "Resolve file" ++msgstr "Resolv-Datei" ++ ++msgid "Restart" ++msgstr "Neustarten" ++ ++msgid "Restart Firewall" ++msgstr "Firewall neu starten" ++ ++msgid "Restore backup" ++msgstr "Sicherung wiederherstellen" ++ ++msgid "Reveal/hide password" ++msgstr "Passwort zeigen/verstecken" ++ ++msgid "Revert" ++msgstr "Verwerfen" ++ ++msgid "Root" ++msgstr "Root" ++ ++msgid "Root directory for files served via TFTP" ++msgstr "Wurzelverzeichnis für über TFTP ausgelieferte Dateien " ++ ++msgid "Root preparation" ++msgstr "" ++ ++msgid "Routed IPv6 prefix for downstream interfaces" ++msgstr "" ++ ++msgid "Router Advertisement-Service" ++msgstr "" ++ ++msgid "Router Password" ++msgstr "Routerpasswort" ++ ++msgid "Routes" ++msgstr "Routen" ++ ++msgid "" ++"Routes specify over which interface and gateway a certain host or network " ++"can be reached." ++msgstr "" ++"Netzwerkrouten geben an, über welche Schnittstellen bestimmte Rechner oder " ++"Netzwerke erreicht werden können" ++ ++msgid "Rule #" ++msgstr "Regel #" ++ ++msgid "Run a filesystem check before mounting the device" ++msgstr "Vor dem Einhängen Dateisystemprüfung starten " ++ ++msgid "Run filesystem check" ++msgstr "Dateisystemprüfung durchführen" ++ ++msgid "" ++"SIXXS supports TIC only, for static tunnels using IP protocol 41 (RFC4213) " ++"use 6in4 instead" ++msgstr "" ++ ++msgid "SIXXS-handle[/Tunnel-ID]" ++msgstr "" ++ ++msgid "SSH Access" ++msgstr "SSH-Zugriff" ++ ++msgid "SSH-Keys" ++msgstr "SSH-Schlüssel" ++ ++msgid "SSID" ++msgstr "SSID" ++ ++msgid "Save" ++msgstr "Speichern" ++ ++msgid "Save & Apply" ++msgstr "Speichern & Anwenden" ++ ++msgid "Save & Apply" ++msgstr "Speichern & Anwenden" ++ ++msgid "Scan" ++msgstr "Scan" ++ ++msgid "Scheduled Tasks" ++msgstr "Geplante Aufgaben" ++ ++msgid "Section added" ++msgstr "Sektion hinzugefügt" ++ ++msgid "Section removed" ++msgstr "Sektion entfernt" ++ ++msgid "See \"mount\" manpage for details" ++msgstr "Siehe \"mount\" Handbuch für Details" ++ ++msgid "" ++"Send LCP echo requests at the given interval in seconds, only effective in " ++"conjunction with failure threshold" ++msgstr "" ++"Sende LCP Echo Anforderungen im angegebenem Interval in Sekunden, nur " ++"effektiv in Verbindung mit einem Fehler-Schwellwert" ++ ++msgid "Separate Clients" ++msgstr "Clients isolieren" ++ ++msgid "Separate WDS" ++msgstr "Separates WDS" ++ ++msgid "Server Settings" ++msgstr "Servereinstellungen" ++ ++msgid "Server password" ++msgstr "" ++ ++msgid "" ++"Server password, enter the specific password of the tunnel when the username " ++"contains the tunnel ID" ++msgstr "" ++ ++msgid "Server username" ++msgstr "" ++ ++msgid "Service Name" ++msgstr "Service-Name" ++ ++msgid "Service Type" ++msgstr "Service-Typ" ++ ++msgid "Services" ++msgstr "Dienste" ++ ++#, fuzzy ++msgid "Set up Time Synchronization" ++msgstr "Zeitsynchronisierung einrichten" ++ ++msgid "Setup DHCP Server" ++msgstr "DHCP Server einrichten" ++ ++msgid "Show current backup file list" ++msgstr "Zeige aktuelle Liste der gesicherten Dateien" ++ ++msgid "Shutdown this interface" ++msgstr "Diese Schnittstelle herunterfahren" ++ ++msgid "Shutdown this network" ++msgstr "Dieses Netzwerk herunterfahren" ++ ++msgid "Signal" ++msgstr "Signal" ++ ++msgid "Signal:" ++msgstr "Signal:" ++ ++msgid "Size" ++msgstr "Größe" ++ ++msgid "Skip" ++msgstr "Ãœberspringen" ++ ++msgid "Skip to content" ++msgstr "Zum Inhalt springen" ++ ++msgid "Skip to navigation" ++msgstr "Zur Navigation springen" ++ ++msgid "Slot time" ++msgstr "Zeitslot" ++ ++msgid "Software" ++msgstr "Paketverwaltung" ++ ++msgid "Some fields are invalid, cannot save values!" ++msgstr "Einige Felder sind ungültig, kann das Formular nicht speichern!" ++ ++msgid "Sorry, the object you requested was not found." ++msgstr "Entschuldigung, das anfgeforderte Objekt wurde nicht gefunden." ++ ++msgid "Sorry, the server encountered an unexpected error." ++msgstr "" ++"Entschuldigung, auf dem Server ist ein unerwarteter Fehler aufgetreten." ++ ++#, fuzzy ++msgid "" ++"Sorry, there is no sysupgrade support present; a new firmware image must be " ++"flashed manually. Please refer to the OpenWrt wiki for device specific " ++"install instructions." ++msgstr "" ++"Aufgrund des fehlenden sysupgrade-Supports muss die neue Firmware manuell " ++"geflasht werden. Weitere Informationen sowie gerätespezifische " ++"Installationsanleitungen entnehmen Sie bitte dem OpenWrt Wiki." ++ ++msgid "Sort" ++msgstr "Sortieren" ++ ++msgid "Source" ++msgstr "Quelle" ++ ++msgid "Source routing" ++msgstr "" ++ ++msgid "Specifies the button state to handle" ++msgstr "Gibt den zu behandelnden Tastenstatus an" ++ ++msgid "Specifies the directory the device is attached to" ++msgstr "Nennt das Verzeichnis, an welches das Gerät angebunden ist" ++ ++msgid "Specifies the listening port of this Dropbear instance" ++msgstr "Gibt den Server-Port dieser Dropbear-Instanz an" ++ ++msgid "" ++"Specifies the maximum amount of failed ARP requests until hosts are presumed " ++"to be dead" ++msgstr "" ++"Maximale Anzahl fehlgeschlagener ARP-Anfragen bis ein Host als nicht " ++"verfügbar gilt" ++ ++msgid "" ++"Specifies the maximum amount of seconds after which hosts are presumed to be " ++"dead" ++msgstr "" ++"Spezifiziert die maximale Anzahl an Sekunde nach denen Hoss als tot erachtet " ++"werden" ++ ++msgid "Specify the secret encryption key here." ++msgstr "Geben Sie hier den geheimen Netzwerkschlüssel an" ++ ++msgid "Start" ++msgstr "Start" ++ ++msgid "Start priority" ++msgstr "Startpriorität" ++ ++msgid "Startup" ++msgstr "Systemstart" ++ ++msgid "Static IPv4 Routes" ++msgstr "Statische IPv4 Routen" ++ ++msgid "Static IPv6 Routes" ++msgstr "Statische IPv6 Routen" ++ ++msgid "Static Leases" ++msgstr "Statische Einträge" ++ ++msgid "Static Routes" ++msgstr "Statische Routen" ++ ++msgid "Static WDS" ++msgstr "Statisches WDS" ++ ++msgid "Static address" ++msgstr "Statische Adresse" ++ ++msgid "" ++"Static leases are used to assign fixed IP addresses and symbolic hostnames " ++"to DHCP clients. They are also required for non-dynamic interface " ++"configurations where only hosts with a corresponding lease are served." ++msgstr "" ++"Statische Leases werden genutzt um feste IP-Adressen und Hostnames zu DHCP-" ++"Clients zuzuordnen. Sie werden auch für nicht-dynamische Schnittstellen-" ++"Konfigurationen benötigt auf denen lediglich Hosts mit zugehörigem " ++"statischem Lease-Eintrag bedient werden." ++ ++msgid "Status" ++msgstr "Status" ++ ++msgid "Stop" ++msgstr "Stoppen" ++ ++msgid "Strict order" ++msgstr "Strikte Reihenfolge" ++ ++msgid "Submit" ++msgstr "Absenden" ++ ++msgid "Swap" ++msgstr "" ++ ++msgid "Swap Entry" ++msgstr "Auslagerungsdatei" ++ ++msgid "Switch" ++msgstr "Switch" ++ ++msgid "Switch %q" ++msgstr "Switch %q" ++ ++msgid "Switch %q (%s)" ++msgstr "Switch %q (%s)" ++ ++msgid "Switch protocol" ++msgstr "Wechsle Protokoll" ++ ++msgid "Sync with browser" ++msgstr "Mit Browser synchronisieren" ++ ++msgid "Synchronizing..." ++msgstr "Synchronisiere..." ++ ++msgid "System" ++msgstr "System" ++ ++msgid "System Log" ++msgstr "Systemprotokoll" ++ ++msgid "System Properties" ++msgstr "Systemeigenschaften" ++ ++msgid "System log buffer size" ++msgstr "Größe des Systemprotokoll-Puffers" ++ ++msgid "TCP:" ++msgstr "TCP:" ++ ++msgid "TFTP Settings" ++msgstr "TFTP Einstellungen" ++ ++msgid "TFTP server root" ++msgstr "TFTP Wurzelverzeichnis" ++ ++# same as RX ++msgid "TX" ++msgstr "TX" ++ ++msgid "TX Rate" ++msgstr "TX-Rate" ++ ++msgid "Table" ++msgstr "Tabelle" ++ ++msgid "Target" ++msgstr "Ziel" ++ ++msgid "Terminate" ++msgstr "Beenden" ++ ++#, fuzzy ++msgid "" ++"The Device Configuration section covers physical settings of the " ++"radio hardware such as channel, transmit power or antenna selection which " ++"are shared among all defined wireless networks (if the radio hardware is " ++"multi-SSID capable). Per network settings like encryption or operation mode " ++"are grouped in the Interface Configuration." ++msgstr "" ++"Die Gerätekonfiguration deckt physikalische Einstellungen der WLAN-" ++"Hardware wie Kanal, Sendestärke oder Antennenauswahl ab. Diese Einstellungen " ++"werden von allen Netzwerken auf dem Gerät geteilt. Netzwerk-spezifische " ++"Einstellungen wie Verschlüsselung oder Betriebsmodus sind in der " ++"Schnittstellenkonfiguration gruppiert." ++ ++msgid "" ++"The libiwinfo-lua package is not installed. You must install this " ++"component for working wireless configuration!" ++msgstr "" ++"Das libiwinfo-lua Paket ist nicht installiert. Dieses Paket muss " ++"für eine funktionierende WLAN-Konfiguration vorhanden sein!" ++ ++msgid "" ++"The HE.net endpoint update configuration changed, you must now use the plain " ++"username instead of the user ID!" ++msgstr "" ++ ++msgid "" ++"The IPv6 prefix assigned to the provider, usually ends with ::" ++msgstr "" ++"Vom Provider zugewiesener IPv6 Präfix, endet normalerweise mit ::" ++ ++msgid "" ++"The allowed characters are: A-Z, a-z, 0-9 and _" ++msgstr "" ++"Erlaubte Buchstaben sind: A-Z, a-z, 0-9 and _" ++ ++msgid "The configuration file could not be loaded due to the following error:" ++msgstr "" ++ ++msgid "" ++"The device file of the memory or partition (e.g." ++" /dev/sda1)" ++msgstr "Die Gerätedatei des Speichers oder der Partition (z.B.: /dev/sda)" ++ ++msgid "" ++"The filesystem that was used to format the memory (e.g. ext3)" ++msgstr "Das Dateisystem mit dem der Speicher formatiert ist (z.B.: ext3)" ++ ++msgid "" ++"The flash image was uploaded. Below is the checksum and file size listed, " ++"compare them with the original file to ensure data integrity.
    Click " ++"\"Proceed\" below to start the flash procedure." ++msgstr "" ++"Das Firmware-Image wurde hochgeladen. Nachfolgend sind die Prüfsumme und " ++"Dateigröße gelistet. Vergleichen Sie diese mit der Originaldatei um die " ++"Integrität sicherzustellen.
    Klicken Sie \"Fortfahren\" um die Flash-" ++"Prozedur zu starten." ++ ++msgid "The following changes have been committed" ++msgstr "Die folgenden Änderungen wurden angewendet" ++ ++msgid "The following changes have been reverted" ++msgstr "Die folgenden Änderungen wurden verworfen" ++ ++msgid "The following rules are currently active on this system." ++msgstr "Die folgenden Regeln sind zur Zeit auf dem System aktiv." ++ ++msgid "The given network name is not unique" ++msgstr "Der angebene Netzwerk-Name ist nicht eindeutig" ++ ++#, fuzzy ++msgid "" ++"The hardware is not multi-SSID capable and the existing configuration will " ++"be replaced if you proceed." ++msgstr "" ++"Die Hardware ist nicht Multi-SSID fähig und die existierende Konfiguration " ++"wird beim Fortfahren ersetzt." ++ ++msgid "" ++"The length of the IPv4 prefix in bits, the remainder is used in the IPv6 " ++"addresses." ++msgstr "" ++"Länge des IPv4 Präfix in Bits, die übrigen Bits werden in der IPv6 Adresse " ++"verwendet." ++ ++msgid "The length of the IPv6 prefix in bits" ++msgstr "Länge des IPv6 Präfix in Bits" ++ ++msgid "" ++"The network ports on this device can be combined to several VLANs in which computers can " ++"communicate directly with each other. VLANs are often used to separate different network " ++"segments. Often there is by default one Uplink port for a connection to the " ++"next greater network like the internet and other ports for a local network." ++msgstr "" ++"Die Netzwerkschnittstellen dieses Geräts können zu verschienden VLANs zusammengefasst werden, in denen " ++"Geräte miteinander direkt kommunizieren können. VLANs werden auch häufig dazu genutzt, um Netzwerke " ++"voneinander zu trennen. So ist oftmals eine Schnittstelle als Uplink zu " ++"einem größeren Netz, wie dem Internet, vorkonfiguriert und die anderen " ++"Schnittstellen bilden ein VLAN für das lokale Netzwerk." ++ ++msgid "The selected protocol needs a device assigned" ++msgstr "Dem ausgewähltem Protokoll muss ein Gerät zugeordnet werden" ++ ++msgid "" ++"The system is erasing the configuration partition now and will reboot itself " ++"when finished." ++msgstr "" ++"Die Einstellungen werden nun gelöscht! Anschließend wird ein Neustart des " ++"Systems durchgeführt." ++ ++#, fuzzy ++msgid "" ++"The system is flashing now.
    DO NOT POWER OFF THE DEVICE!
    Wait a " ++"few minutes before you try to reconnect. It might be necessary to renew the " ++"address of your computer to reach the device again, depending on your " ++"settings." ++msgstr "" ++"Der Flashvorgang läuft jetzt.
    SCHALTEN SIE NICHT DEN STROM AUS!
    " ++"Warten Sie einige Minuten bis das Gerät wieder erreichbar ist. Je nach " ++"Konfiguration ist es notwendig, dass Sie auf Ihrem Computer eine neue IP-" ++"Adresse beziehen müssen um auf das Gerät zugreifen zu können." ++ ++msgid "" ++"The tunnel end-point is behind NAT, defaults to disabled and only applies to " ++"AYIYA" ++msgstr "" ++ ++msgid "" ++"The uploaded image file does not contain a supported format. Make sure that " ++"you choose the generic image format for your platform." ++msgstr "" ++"Das hochgeladene Firmware-Image hat ein nicht unterstütztes Format. Stellen " ++"Sie sicher dass Sie das generische Format für Ihre Platform gewählt haben." ++ ++msgid "There are no active leases." ++msgstr "Es gibt z.Z. keine aktiven Leases." ++ ++msgid "There are no pending changes to apply!" ++msgstr "Es gibt keine ausstehenen Änderungen anzuwenden!" ++ ++msgid "There are no pending changes to revert!" ++msgstr "Es gibt keine ausstehenen Änderungen zurückzusetzen!" ++ ++msgid "There are no pending changes!" ++msgstr "Es gibt keine ausstehenen Änderungen!" ++ ++msgid "" ++"There is no device assigned yet, please attach a network device in the " ++"\"Physical Settings\" tab" ++msgstr "" ++"Es wurde noch kein Netzwerkgerät zugeordnet, bitte ein Gerät im " ++"\"Physikalische Einstellungen\" Bereich anfügen" ++ ++msgid "" ++"There is no password set on this router. Please configure a root password to " ++"protect the web interface and enable SSH." ++msgstr "" ++"Es ist kein Passwort auf diesem Router gesetzt. Bitte konfigurieren Sie ein " ++"Root-Passwort um das Web-Interface zu schützen und SSH zu aktivieren." ++ ++msgid "This IPv4 address of the relay" ++msgstr "IPv4-Adresse des Relais" ++ ++msgid "" ++"This is a list of shell glob patterns for matching files and directories to " ++"include during sysupgrade. Modified files in /etc/config/ and certain other " ++"configurations are automatically preserved." ++msgstr "" ++"Dies ist eine Liste von Shell-Glob-Mustern um Dateien und Verzeichnisse zu " ++"selektieren welche während eines System-Upgrade gesichert werden sollen. " ++"Modifizierte Dateien in /etc/config/ und bestimmte andere essenzielle " ++"Konfigurationsdateien werden automatisch gesichert." ++ ++msgid "" ++"This is either the \"Update Key\" configured for the tunnel or the account " ++"password if no update key has been configured" ++msgstr "" ++ ++msgid "" ++"This is the content of /etc/rc.local. Insert your own commands here (in " ++"front of 'exit 0') to execute them at the end of the boot process." ++msgstr "" ++"Dies ist der Inhalt von /etc.rc.local. Hier kann man eigene Befehle einfügen " ++"(vor 'exit 0'), die dann am Ende des Bootvorgangs ausgeführt werden." ++ ++msgid "" ++"This is the local endpoint address assigned by the tunnel broker, it usually " ++"ends with :2" ++msgstr "" ++"Dies ist die lokale, vom Broker zugewiesene IPv6-Adresse, sie endet " ++"üblicherweise mit :2" ++ ++msgid "" ++"This is the only DHCP in the local network" ++msgstr "Dies ist der einzige DHCP im lokalen Netz" ++ ++msgid "This is the plain username for logging into the account" ++msgstr "" ++ ++msgid "" ++"This is the prefix routed to you by the tunnel broker for use by clients" ++msgstr "" ++ ++msgid "This is the system crontab in which scheduled tasks can be defined." ++msgstr "" ++"Dies ist die System-Crontab in der geplante Aufgaben definiert werden können." ++ ++msgid "" ++"This is usually the address of the nearest PoP operated by the tunnel broker" ++msgstr "" ++"Dies ist üblicherweise die Adresse des nächstgelegenen PoPs betrieben durch " ++"den Tunnelbroker" ++ ++msgid "" ++"This list gives an overview over currently running system processes and " ++"their status." ++msgstr "" ++"Diese Tabelle gibt eine Übersicht über aktuell laufende Systemprozesse und " ++"deren Status." ++ ++msgid "This page allows the configuration of custom button actions" ++msgstr "" ++"Diese Seite ermöglicht die Konfiguration benutzerdefinierter Tastenaktionen" ++ ++msgid "This page gives an overview over currently active network connections." ++msgstr "Diese Seite gibt eine Übersicht über aktive Netzwerkverbindungen." ++ ++msgid "This section contains no values yet" ++msgstr "Diese Sektion enthält noch keine Einträge" ++ ++msgid "Time Synchronization" ++msgstr "Zeitsynchronisation" ++ ++msgid "Time Synchronization is not configured yet." ++msgstr "Die Zeitsynchronisation wurde noch nicht konfiguriert." ++ ++msgid "Timezone" ++msgstr "Zeitzone" ++ ++msgid "" ++"To restore configuration files, you can upload a previously generated backup " ++"archive here." ++msgstr "" ++"Zum Wiederherstellen der Konfiguration kann hier ein bereits vorhandenes " ++"Backup-Archiv hochgeladen werden." ++ ++msgid "Total Available" ++msgstr "Gesamt verfügbar" ++ ++msgid "Traceroute" ++msgstr "Routenverfolgung" ++ ++# Ich bin der Meinung Traffic versteht jeder! Wenn der Begriff "deutscher" sein soll, würde ich "Datenmenge" angeben. Aber "Verkehrs" passt nicht! ++msgid "Traffic" ++msgstr "Traffic" ++ ++msgid "Transfer" ++msgstr "Transfer" ++ ++msgid "Transmission Rate" ++msgstr "Übertragungsrate" ++ ++msgid "Transmit" ++msgstr "Senden" ++ ++msgid "Transmit Power" ++msgstr "Sendeleistung" ++ ++msgid "Transmitter Antenna" ++msgstr "Sendeantenne" ++ ++msgid "Trigger" ++msgstr "Auslöser" ++ ++msgid "Trigger Mode" ++msgstr "Auslösmechanismus" ++ ++msgid "Tunnel ID" ++msgstr "Tunnel-ID" ++ ++msgid "Tunnel Interface" ++msgstr "Tunnelschnittstelle" ++ ++msgid "Tunnel Link" ++msgstr "" ++ ++msgid "Tunnel broker protocol" ++msgstr "" ++ ++msgid "Tunnel setup server" ++msgstr "" ++ ++msgid "Tunnel type" ++msgstr "" ++ ++msgid "Turbo Mode" ++msgstr "Turbo Modus" ++ ++msgid "Tx-Power" ++msgstr "Sendestärke" ++ ++msgid "Type" ++msgstr "Typ" ++ ++msgid "UDP:" ++msgstr "UDP:" ++ ++msgid "UMTS only" ++msgstr "Nur UMTS" ++ ++msgid "UMTS/GPRS/EV-DO" ++msgstr "UMTS/GPRS/EV-DO" ++ ++msgid "USB Device" ++msgstr "USB-Gerät" ++ ++msgid "UUID" ++msgstr "UUID" ++ ++msgid "Unable to dispatch" ++msgstr "Kann Anfrage nicht zustellen" ++ ++msgid "Unknown" ++msgstr "Unbekannt" ++ ++msgid "Unknown Error, password not changed!" ++msgstr "Unbekannter Fehler, Passwort nicht geändert!" ++ ++msgid "Unmanaged" ++msgstr "Ignoriert" ++ ++msgid "Unsaved Changes" ++msgstr "Ungespeicherte Änderungen" ++ ++msgid "Unsupported protocol type." ++msgstr "Nicht unterstützter Protokolltyp." ++ ++msgid "Update lists" ++msgstr "Listen aktualisieren" ++ ++msgid "" ++"Upload a sysupgrade-compatible image here to replace the running firmware. " ++"Check \"Keep settings\" to retain the current configuration (requires an " ++"OpenWrt compatible firmware image)." ++msgstr "" ++"Zum Ersetzen der aktuellen Firmware kann hier ein sysupgrade-Kompatibles " ++"Image hochgeladen werden. Wenn die vorhandene Konfiguration auch nach dem " ++"Update noch aktiv sein soll, aktivieren Sie \"Konfiguration behalten\"." ++ ++msgid "Upload archive..." ++msgstr "Backup wiederherstellen..." ++ ++msgid "Uploaded File" ++msgstr "hochgeladene Datei" ++ ++msgid "Uptime" ++msgstr "Laufzeit" ++ ++msgid "Use /etc/ethers" ++msgstr "Verwende /etc/ethers" ++ ++msgid "Use DHCP gateway" ++msgstr "Benutze DHCP-Gateway" ++ ++msgid "Use DNS servers advertised by peer" ++msgstr "Benutze die von der Gegenstelle zugewiesenen DNS-Server" ++ ++msgid "Use ISO/IEC 3166 alpha2 country codes." ++msgstr "Muss ein ISO/IEC 3166 Länderkürzel sein." ++ ++msgid "Use MTU on tunnel interface" ++msgstr "Benutze MTU auf der Tunnelschnittstelle" ++ ++msgid "Use TTL on tunnel interface" ++msgstr "Benutze TTL auf der Tunnelschnittstelle" ++ ++msgid "Use as external overlay (/overlay)" ++msgstr "" ++ ++msgid "Use as root filesystem (/)" ++msgstr "" ++ ++msgid "Use broadcast flag" ++msgstr "Benutze Broadcast-Flag" ++ ++msgid "Use builtin IPv6-management" ++msgstr "" ++ ++msgid "Use custom DNS servers" ++msgstr "Benutze eigene DNS-Server" ++ ++msgid "Use default gateway" ++msgstr "Benutze Standard-Gateway" ++ ++msgid "Use gateway metric" ++msgstr "Benutze Gateway-Metrik" ++ ++msgid "Use routing table" ++msgstr "Benutze Routing-Tabelle" ++ ++msgid "" ++"Use the Add Button to add a new lease entry. The MAC-Address indentifies the host, the IPv4-Address specifies to the fixed " ++"address to use and the Hostname is assigned as symbolic name to the " ++"requesting host." ++msgstr "" ++"Die Hinzufügen Schaltfläche fügt einen neuen Lease-Eintrag hinzu. " ++"Die MAC-Adresse identifiziert den Host, die IPv4-Adresse " ++"definiert die zu nutzende statische Adresse und der Hostname ist " ++"der symbolische Name der dem Host zugewisen wird." ++ ++msgid "Used" ++msgstr "Belegt" ++ ++msgid "Used Key Slot" ++msgstr "Benutzer Schlüsselindex" ++ ++msgid "User certificate (PEM encoded)" ++msgstr "" ++ ++msgid "User key (PEM encoded)" ++msgstr "" ++ ++msgid "Username" ++msgstr "Benutzername" ++ ++msgid "VC-Mux" ++msgstr "VC-Mux" ++ ++msgid "VLAN Interface" ++msgstr "VLAN Schnittstelle" ++ ++msgid "VLANs on %q" ++msgstr "VLANs auf %q" ++ ++msgid "VLANs on %q (%s)" ++msgstr "VLANs auf %q (%s)" ++ ++msgid "VPN Server" ++msgstr "VPN-Server" ++ ++msgid "VPN Server port" ++msgstr "" ++ ++msgid "VPN Server's certificate SHA1 hash" ++msgstr "" ++ ++msgid "Vendor Class to send when requesting DHCP" ++msgstr "Bei DHCP-Anfragen gesendete Vendor-Klasse" ++ ++msgid "Verbose" ++msgstr "" ++ ++msgid "Verbose logging by aiccu daemon" ++msgstr "" ++ ++msgid "Verify" ++msgstr "Verifizieren" ++ ++msgid "Version" ++msgstr "Version" ++ ++msgid "WDS" ++msgstr "WDS" ++ ++msgid "WEP Open System" ++msgstr "WEP Open System" ++ ++msgid "WEP Shared Key" ++msgstr "WEP Shared Key" ++ ++msgid "WEP passphrase" ++msgstr "WEP Schlüssel" ++ ++msgid "WMM Mode" ++msgstr "WMM Modus" ++ ++msgid "WPA passphrase" ++msgstr "WPA Schlüssel" ++ ++msgid "" ++"WPA-Encryption requires wpa_supplicant (for client mode) or hostapd (for AP " ++"and ad-hoc mode) to be installed." ++msgstr "" ++"WPA-Verschlüsselung benötigt wpa_supplicant (für Client-Modus) oder hostapd " ++"(für AP oder Ad-Hoc Modus)." ++ ++msgid "" ++"Wait for NTP sync that many seconds, seting to 0 disables waiting (optional)" ++msgstr "" ++ ++msgid "Waiting for changes to be applied..." ++msgstr "Änderungen werden angewandt..." ++ ++msgid "Waiting for command to complete..." ++msgstr "Der Befehl wird ausgeführt..." ++ ++msgid "Warning" ++msgstr "Warnung" ++ ++msgid "Warning: There are unsaved changes that will be lost while rebooting!" ++msgstr "" ++"Warnung: Es gibt ungespeicherte Änderungen, die bei einem Neustart verloren " ++"gehen!" ++ ++msgid "Whether to create an IPv6 default route over the tunnel" ++msgstr "" ++ ++msgid "Whether to route only packets from delegated prefixes" ++msgstr "" ++ ++msgid "Width" ++msgstr "" ++ ++msgid "Wifi" ++msgstr "Drahtlos" ++ ++msgid "Wireless" ++msgstr "WLAN" ++ ++msgid "Wireless Adapter" ++msgstr "WLAN-Gerät" ++ ++msgid "Wireless Network" ++msgstr "Drahtlosnetzwerk" ++ ++msgid "Wireless Overview" ++msgstr "Drahtlosübersicht" ++ ++msgid "Wireless Security" ++msgstr "WLAN-Verschlüsselung" ++ ++msgid "Wireless is disabled or not associated" ++msgstr "WLAN ist deaktiviert oder nicht assoziiert" ++ ++msgid "Wireless is restarting..." ++msgstr "WLAN startet neu..." ++ ++msgid "Wireless network is disabled" ++msgstr "Das WLAN-Netzwerk ist deaktiviert" ++ ++msgid "Wireless network is enabled" ++msgstr "Das WLAN-Netzwerk ist aktiviert" ++ ++msgid "Wireless restarted" ++msgstr "WLAN neu gestartet" ++ ++msgid "Wireless shut down" ++msgstr "WLAN heruntergefahren" ++ ++msgid "Write received DNS requests to syslog" ++msgstr "Empfangene DNS-Anfragen in das Systemprotokoll schreiben" ++ ++msgid "XR Support" ++msgstr "XR-Unterstützung" ++ ++msgid "" ++"You can enable or disable installed init scripts here. Changes will applied " ++"after a device reboot.
    Warning: If you disable essential init " ++"scripts like \"network\", your device might become inaccessible!" ++msgstr "" ++"Hier können installierte Startscripte aktiviert oder deaktiviert werden. " ++"Änderungen werden erst mit einem Geräteneustart angewendet.
    Warnung: Wenn essentialle Startscripte wie \"network\" deaktiviert " ++"werden könnte das Gerät unerreichbar werden!" ++ ++msgid "" ++"You must enable Java Script in your browser or LuCI will not work properly." ++msgstr "" ++"Im Browser muss Java-Script aktiviert sein oder LuCI wird nicht richtig " ++"funktionieren." ++ ++msgid "" ++"Your Internet Explorer is too old to display this page correctly. Please " ++"upgrade it to at least version 7 or use another browser like Firefox, Opera " ++"or Safari." ++msgstr "" ++ ++msgid "any" ++msgstr "beliebig" ++ ++msgid "auto" ++msgstr "auto" ++ ++msgid "automatic" ++msgstr "automatisch" ++ ++msgid "baseT" ++msgstr "baseT" ++ ++msgid "bridged" ++msgstr "bridged" ++ ++msgid "create:" ++msgstr "erstelle:" ++ ++msgid "creates a bridge over specified interface(s)" ++msgstr "überbrückt angegebene Schnittstelle(n)" ++ ++msgid "dB" ++msgstr "dB" ++ ++msgid "dBm" ++msgstr "dBm" ++ ++msgid "disable" ++msgstr "deaktivieren" ++ ++msgid "disabled" ++msgstr "" ++ ++msgid "expired" ++msgstr "abgelaufen" ++ ++msgid "" ++"file where given DHCP-leases will be stored" ++msgstr "Speicherort für vergebenen DHCP-Adressen" ++ ++msgid "forward" ++msgstr "weitergeleitet" ++ ++msgid "full-duplex" ++msgstr "Voll-Duplex" ++ ++msgid "half-duplex" ++msgstr "Halb-Duplex" ++ ++msgid "help" ++msgstr "Hilfe" ++ ++msgid "hidden" ++msgstr "versteckt" ++ ++msgid "hybrid mode" ++msgstr "" ++ ++msgid "if target is a network" ++msgstr "falls Ziel ein Netzwerk ist" ++ ++msgid "input" ++msgstr "eingehend" ++ ++msgid "kB" ++msgstr "kB" ++ ++msgid "kB/s" ++msgstr "kB/s" ++ ++msgid "kbit/s" ++msgstr "kbit/s" ++ ++msgid "local DNS file" ++msgstr "Lokale DNS-Datei" ++ ++msgid "minimum 1280, maximum 1480" ++msgstr "" ++ ++msgid "navigation Navigation" ++msgstr "" ++ ++msgid "no" ++msgstr "nein" ++ ++msgid "no link" ++msgstr "nicht verbunden" ++ ++msgid "none" ++msgstr "keine" ++ ++msgid "not present" ++msgstr "" ++ ++msgid "off" ++msgstr "aus" ++ ++msgid "on" ++msgstr "ein" ++ ++msgid "open" ++msgstr "offen" ++ ++msgid "overlay" ++msgstr "" ++ ++msgid "relay mode" ++msgstr "" ++ ++msgid "routed" ++msgstr "routed" ++ ++msgid "server mode" ++msgstr "" ++ ++msgid "skiplink1 Skip to navigation" ++msgstr "" ++ ++msgid "skiplink2 Skip to content" ++msgstr "" ++ ++msgid "stateful-only" ++msgstr "" ++ ++msgid "stateless" ++msgstr "" ++ ++msgid "stateless + stateful" ++msgstr "" ++ ++msgid "tagged" ++msgstr "tagged" ++ ++msgid "unknown" ++msgstr "unbekannt" ++ ++msgid "unlimited" ++msgstr "unbegrenzt" ++ ++msgid "unspecified" ++msgstr "unspezifiziert" ++ ++msgid "unspecified -or- create:" ++msgstr "nichts auswählen -oder- erstellen:" ++ ++msgid "untagged" ++msgstr "untagged" ++ ++msgid "yes" ++msgstr "ja" ++ ++msgid "« Back" ++msgstr "« Zurück" ++ ++#~ msgid "" ++#~ "Always use 40MHz channels even if the secondary channel overlaps. Using " ++#~ "this option does not comply with IEEE 802.11n-2009!" ++#~ msgstr "" ++#~ "Immer 40MHz Kanalbreite nutzen, auch wenn der sekundäre Kanal andere " ++#~ "Netzwerke überschneidet. Die Benutzung dieser Option verletzt den IEEE " ++#~ "802.11n-2009 Standard!" ++ ++#~ msgid "Cached" ++#~ msgstr "Zwischengespeichert" ++ ++#~ msgid "Configures this mount as overlay storage for block-extroot" ++#~ msgstr "" ++#~ "Konfiguriert diesen Mountpunkt als Overlay-Speicher für block-" ++#~ "extroot" ++ ++#~ msgid "Force 40MHz mode" ++#~ msgstr "40MHz-Modus erzwingen" ++ ++#~ msgid "Frequency Hopping" ++#~ msgstr "Frequenzsprung" ++ ++#~ msgid "Locked to channel %d used by %s" ++#~ msgstr "Festgelegt auf Kanal %d benutzt von %s" ++ ++#~ msgid "Use as root filesystem" ++#~ msgstr "Als Wurzeldateisystem benutzen" ++ ++#~ msgid "HE.net user ID" ++#~ msgstr "HE.net Benutzer-ID" ++ ++#~ msgid "This is the 32 byte hex encoded user ID, not the login name" ++#~ msgstr "" ++#~ "Die ist die 32 Zeichen lange, hexadezimal kodierte Nutzer-ID, nicht der " ++#~ "Benutzername." ++ ++#~ msgid "40MHz 2nd channel above" ++#~ msgstr "40MHz, Sekundärkanal oberhalb" ++ ++#~ msgid "40MHz 2nd channel below" ++#~ msgstr "40MHz, Sekundärkanal unterhalb" ++ ++#~ msgid "Accept router advertisements" ++#~ msgstr "Routerankündigungen (RAs) akzeptieren" ++ ++#~ msgid "Advertise IPv6 on network" ++#~ msgstr "IPv6 auf folgendem Netzwerk ankündigen" ++ ++#~ msgid "Advertised network ID" ++#~ msgstr "Angekündigte Subnetz-ID" ++ ++#~ msgid "Allowed range is 1 to 65535" ++#~ msgstr "Erlaubter Bereich 1 bis 65535" ++ ++#~ msgid "HT capabilities" ++#~ msgstr "HT-Fähigkeiten" ++ ++#~ msgid "HT mode" ++#~ msgstr "HT-Modus" ++ ++#~ msgid "Router Model" ++#~ msgstr "Routermodell" ++ ++#~ msgid "Router Name" ++#~ msgstr "Routername" ++ ++#~ msgid "Send router solicitations" ++#~ msgstr "Sende Router-Solicitations" ++ ++#~ msgid "Specifies the advertised preferred prefix lifetime in seconds" ++#~ msgstr "Bestimmt die bevorzugte angekündigte Prefix-Lebenszeit in Sekunden" ++ ++#~ msgid "Specifies the advertised valid prefix lifetime in seconds" ++#~ msgstr "Bestimmt die gültige angeündigte Prefix-Lebenszeit in Sekunden" ++ ++#~ msgid "Use preferred lifetime" ++#~ msgstr "Benutze bevorzugte Lebenszeit" ++ ++#~ msgid "Use valid lifetime" ++#~ msgstr "Benutze gültige Lebenszeit" ++ ++#~ msgid "Waiting for router..." ++#~ msgstr "Warte auf den Router..." ++ ++#~ msgid "Enable builtin NTP server" ++#~ msgstr "NTP Server aktivieren" ++ ++#~ msgid "Active Leases" ++#~ msgstr "Aktive Zuweisungen" ++ ++#~ msgid "Open" ++#~ msgstr "Offen" ++ ++#~ msgid "KB" ++#~ msgstr "KB" ++ ++#~ msgid "Bit Rate" ++#~ msgstr "Bitrate" ++ ++#~ msgid "Configuration / Apply" ++#~ msgstr "Konfiguration / Anwenden" ++ ++#~ msgid "Configuration / Changes" ++#~ msgstr "Konfiguration / Änderungen" ++ ++#~ msgid "Configuration / Revert" ++#~ msgstr "Konfiguration / Zurücksetzen" ++ ++#~ msgid "MAC" ++#~ msgstr "MAC-Adresse" ++ ++#~ msgid "MAC Address" ++#~ msgstr "MAC-Adresse" ++ ++#~ msgid "Encr." ++#~ msgstr "Vers." ++ ++#~ msgid "WLAN-Scan" ++#~ msgstr "WLAN-Scan" ++ ++#~ msgid "" ++#~ "Choose the network you want to attach to this wireless interface. Select " ++#~ "unspecified to not attach any network or fill out the " ++#~ "create field to define a new network." ++#~ msgstr "Wählt die Schnittstelle die diesem Netzwerk zugeordnet wird." ++ ++#~ msgid "Create Network" ++#~ msgstr "Netzwerk anlegen" ++ ++#~ msgid "Link" ++#~ msgstr "Verbindung" ++ ++#~ msgid "Networks" ++#~ msgstr "Netzwerke" ++ ++#~ msgid "Power" ++#~ msgstr "Leistung" ++ ++#~ msgid "Wifi networks in your local environment" ++#~ msgstr "Drahtlosnetzwerke in der lokalen Umgebung des Routers:" ++ ++#~ msgid "" ++#~ "CIDR-Notation: " ++#~ "address/prefix" ++#~ msgstr "CIDR-Notation: Adresse/Prefix" ++ ++#~ msgid "DNS-Server" ++#~ msgstr "DNS-Server" ++ ++#~ msgid "IPv4-Broadcast" ++#~ msgstr "IPv4-Broadcast" ++ ++#~ msgid "IPv6-Address" ++#~ msgstr "IPv6-Adresse" ++ ++#~ msgid "IP-Aliases" ++#~ msgstr "IP Aliase" ++ ++#~ msgid "IPv6 Setup" ++#~ msgstr "IPv6 Einstellungen" ++ ++#~ msgid "" ++#~ "Note: If you choose an interface here which is part of another network, " ++#~ "it will be moved into this network." ++#~ msgstr "" ++#~ "Hinweis: When eine Schnittstelle gewählt wird, welche Mitglied eines " ++#~ "anderen Netzwerkes ist, wird sie in dieses Netzwerk verschoben" ++ ++#~ msgid "" ++#~ "Really delete this interface? The deletion cannot be undone!\\nYou might " ++#~ "lose access to this router if you are connected via this interface." ++#~ msgstr "" ++#~ "Diese Schnittstelle wirklich löschen? Der Schritt kann nicht rückgängig " ++#~ "gemacht werden!\\nDer Zugriff auf den Router könnte verlorengehen wenn " ++#~ "Sie über diese Schnittstelle verbunden sind." ++ ++#~ msgid "" ++#~ "Really delete this wireless network? The deletion cannot be undone!\\nYou " ++#~ "might lose access to this router if you are connected via this network." ++#~ msgstr "" ++#~ "Dieses Drahtlosnetzwerk wirklich löschen? Der Schritt kann nicht " ++#~ "rückgängig gemacht werden!\\nDer Zugriff auf den Router könnte " ++#~ "verlorengehen wenn Sie über dieses Netzwerk verbunden sind." ++ ++#~ msgid "" ++#~ "Really shutdown interface \"%s\" ?\\nYou might lose access to this router " ++#~ "if you are connected via this interface." ++#~ msgstr "" ++#~ "Die Schnitstelle \"%s\" wirklich herunterfahren?\\nDer Zugriff auf den " ++#~ "Router könnte verlorengehen wenn Sie über diese Schnittstelle verbunden " ++#~ "sind." ++ ++#~ msgid "" ++#~ "Really shutdown network ?\\nYou might lose access to this router if you " ++#~ "are connected via this interface." ++#~ msgstr "" ++#~ "Das Netzwerk wirklich herunterfahren?\\nDer Zugriff auf den Router könnte " ++#~ "verlorengehen wenn Sie über diese Schnittstelle verbunden sind." ++ ++#~ msgid "" ++#~ "The network ports on your router can be combined to several VLANs in which computers can " ++#~ "communicate directly with each other. VLANs are often used to separate different network " ++#~ "segments. Often there is by default one Uplink port for a connection to " ++#~ "the next greater network like the internet and other ports for a local " ++#~ "network." ++#~ msgstr "" ++#~ "Die Netzwerkschnittstellen am Router können zu verschienden VLANs " ++#~ "zusammengefasst werden, in denen Geräte miteinander direkt kommunizieren " ++#~ "können. VLANs werden auch häufig dazu genutzt, um Netzwerke voneinander " ++#~ "zu trennen. So ist oftmals eine Schnittstelle als Uplink zu einem " ++#~ "größeren Netz, wie dem Internet, vorkonfiguriert und die anderen " ++#~ "Schnittstellen bilden ein VLAN für das lokale Netzwerk." ++ ++#~ msgid "Enable buffering" ++#~ msgstr "Pufferung aktivieren" ++ ++#~ msgid "IPv6-over-IPv4" ++#~ msgstr "IPv6-über-IPv4" ++ ++#~ msgid "Custom Files" ++#~ msgstr "Benutzerdefinierte Dateien" ++ ++#~ msgid "Custom files" ++#~ msgstr "Benutzerdefinierte Dateien" ++ ++#~ msgid "Detected Files" ++#~ msgstr "Erkannte Dateien" ++ ++#~ msgid "Detected files" ++#~ msgstr "Erkannte Dateien" ++ ++#~ msgid "Files to be kept when flashing a new firmware" ++#~ msgstr "Zu übernehmende Dateien bei Firmwareupgrade" ++ ++#~ msgid "General" ++#~ msgstr "Allgemeines" ++ ++#~ msgid "" ++#~ "Here you can customize the settings and the functionality of LuCI." ++#~ msgstr "" ++#~ "Hier können Eigenschaften und die Funktionalität der Oberfläche angepasst " ++#~ "werden." ++ ++#~ msgid "Post-commit actions" ++#~ msgstr "UCI-Befehle beim Anwenden" ++ ++#~ msgid "" ++#~ "The following files are detected by the system and will be kept " ++#~ "automatically during sysupgrade" ++#~ msgstr "" ++#~ "Die folgenden Dateien wurden vom System erkannt und werden bei einen " ++#~ "System-Update automatisch beibehalten" ++ ++#~ msgid "" ++#~ "These commands will be executed automatically when a given UCI configuration is committed " ++#~ "allowing changes to be applied instantly." ++#~ msgstr "" ++#~ "Beim Anwenden der Konfiguration aus der Oberflächliche heraus können " ++#~ "automatisch die relevanten Dienste neugestart werden, sodass Änderungen " ++#~ "sofort nach dem Anwenden aktiv werden und der Router nicht erst " ++#~ "neugestartet werden muss." ++ ++#~ msgid "" ++#~ "This is a list of shell glob patterns for matching files and directories " ++#~ "to include during sysupgrade" ++#~ msgstr "" ++#~ "Dies ist eine Liste von Shell-Glob-Mustern um Dateien und Verzeichnisse " ++#~ "zu wählen welche bei einem Systemupgrade beibehalten werden sollen" ++ ++#~ msgid "Web UI" ++#~ msgstr "Weboberfläche" ++ ++#~ msgid "PPTP-Server" ++#~ msgstr "" ++#~ "PPTP-Server" ++ ++#~ msgid "AHCP Settings" ++#~ msgstr "AHCP-Einstellungen" ++ ++#~ msgid "ARP ping retries" ++#~ msgstr "ARP-Ping Versuche" ++ ++#~ msgid "ATM Settings" ++#~ msgstr "ATM Einstellungen" ++ ++#~ msgid "Accept Router Advertisements" ++#~ msgstr "Router Advertisements akzeptieren" ++ ++#~ msgid "Access point (APN)" ++#~ msgstr "Zugriffspunkt (APN)" ++ ++#~ msgid "Additional pppd options" ++#~ msgstr "Weitere pppd Optionen" ++ ++#~ msgid "Allowed range is 1 to FFFF" ++#~ msgstr "Der Erlaubte Bereich liegt zwischen 1 und FFFF" ++ ++#~ msgid "Automatic Disconnect" ++#~ msgstr "Automatische Trennung" ++ ++#~ msgid "Backup Archive" ++#~ msgstr "Sicherungsarchiv" ++ ++#~ msgid "" ++#~ "Configure the local DNS server to use the name servers adverticed by the " ++#~ "PPP peer" ++#~ msgstr "" ++#~ "Konfiguriert den lokalen DNS-Server so, dass er die von der Gegenstelle " ++#~ "angekündigten Nameserver-Adressen nutzt" ++ ++#~ msgid "Connect script" ++#~ msgstr "Verbindungs-Script" ++ ++#~ msgid "Create backup" ++#~ msgstr "Sicherung erstellen" ++ ++#~ msgid "Default" ++#~ msgstr "Standard" ++ ++#~ msgid "Disconnect script" ++#~ msgstr "Trennuns-Script" ++ ++#~ msgid "Edit package lists and installation targets" ++#~ msgstr "Paketlisten und Installationsziele bearbeiten" ++ ++#~ msgid "Enable 4K VLANs" ++#~ msgstr "Aktiviere 4K VLANs" ++ ++#~ msgid "Enable IPv6 on PPP link" ++#~ msgstr "IPv6 für die PPP-Verbindung aktivieren" ++ ++#~ msgid "Firmware image" ++#~ msgstr "Firmware-Image" ++ ++#~ msgid "Forward DHCP" ++#~ msgstr "DHCP weiterleiten" ++ ++#~ msgid "Forward broadcasts" ++#~ msgstr "Broadcasts weiterleiten" ++ ++#~ msgid "HE.net Tunnel ID" ++#~ msgstr "HE.net Tunnel ID" ++ ++#~ msgid "" ++#~ "Here you can backup and restore your router configuration and - if " ++#~ "possible - reset the router to the default settings." ++#~ msgstr "" ++#~ "Auf dieser Seite können Sicherungen der Konfiguration erstellt und " ++#~ "eingespielt werden und - wenn möglich - die Grundeinstellungen " ++#~ "wiederhergestellt werden." ++ ++#~ msgid "Installation targets" ++#~ msgstr "Installationsziele" ++ ++#~ msgid "Keep configuration files" ++#~ msgstr "Konfigurationsdateien erhalten" ++ ++#~ msgid "Keep-Alive" ++#~ msgstr "Keep-Alive" ++ ++#~ msgid "Kernel" ++#~ msgstr "Kernel" ++ ++#~ msgid "" ++#~ "Let pppd replace the current default route to use the PPP interface after " ++#~ "successful connect" ++#~ msgstr "" ++#~ "Lässt pppd die aktuelle Standardroute ersetzen und über die PPP " ++#~ "Schnittstelle leiten" ++ ++#~ msgid "Let pppd run this script after establishing the PPP link" ++#~ msgstr "" ++#~ "Lässt pppd das angegebene Script nach dem Aufbau der PPP Verbindung " ++#~ "abarbeiten" ++ ++#~ msgid "Let pppd run this script before tearing down the PPP link" ++#~ msgstr "" ++#~ "Lässt pppd das angegebene Script vor dem Trennen der PPP Verbindung " ++#~ "abarbeiten" ++ ++#~ msgid "" ++#~ "Make sure that you provide the correct pin code here or you might lock " ++#~ "your sim card!" ++#~ msgstr "" ++#~ "Stellen Sie sicher das die richtige PIN hier eingetragen wird, sonst " ++#~ "könnte die SIM-Karte gesperrt werden!" ++ ++#~ msgid "" ++#~ "Most of them are network servers, that offer a certain service for your " ++#~ "device or network like shell access, serving webpages like LuCI, doing mesh routing, sending " ++#~ "e-mails, ..." ++#~ msgstr "" ++#~ "Es handelt sich hierbei meist um Netzwerkserver, die verschiedene " ++#~ "Aufgaben auf dem Router erfüllen, beispielsweise Shell-Zugang ermöglichen " ++#~ "oder diese Weboberfläche über HTTP zur Verfügung stellen." ++ ++#~ msgid "Number of failed connection tests to initiate automatic reconnect" ++#~ msgstr "" ++#~ "Anzahl fehlgeschlagener Verbindungstests nach der automatisch neu " ++#~ "verbunden wird" ++ ++#~ msgid "Override Gateway" ++#~ msgstr "Gateway erzwingen" ++ ++#~ msgid "PIN code" ++#~ msgstr "PIN-Code" ++ ++#~ msgid "PPP Settings" ++#~ msgstr "PPP Einstellungen" ++ ++#~ msgid "Package lists" ++#~ msgstr "Paketlisten" ++ ++#~ msgid "" ++#~ "Port PVIDs specify the default " ++#~ "VLAN ID added to received untagged frames." ++#~ msgstr "" ++#~ "Port PVIDs definieren die " ++#~ "Standard-VLAN ID welche zu empfangenen, untagged Ethernet-Frames " ++#~ "hinzugefügt wird." ++ ++#~ msgid "Port PVIDs on %q" ++#~ msgstr "Port PVIDs auf %q" ++ ++#~ msgid "Proceed reverting all settings and resetting to firmware defaults?" ++#~ msgstr "" ++#~ "Alle aktuellen Einstellungen verwerfen und Grundeinstellungen " ++#~ "wiederherstellen?" ++ ++#~ msgid "Processor" ++#~ msgstr "Prozessor" ++ ++#~ msgid "Radius-Port" ++#~ msgstr "Radius-Port" ++ ++#~ msgid "Radius-Server" ++#~ msgstr "Radius-Server" ++ ++#~ msgid "Relay Settings" ++#~ msgstr "Relay-Einstellungen" ++ ++#~ msgid "Replace default route" ++#~ msgstr "Standardroute ersetzen" ++ ++#~ msgid "Reset router to defaults" ++#~ msgstr "Grundeinstellungen wiederherstellen" ++ ++#~ msgid "Routing table ID" ++#~ msgstr "Nr. der Routingtabelle" ++ ++#~ msgid "" ++#~ "Seconds to wait for the modem to become ready before attempting to connect" ++#~ msgstr "" ++#~ "Zeit in Sekunden um auf die Initialisierung des Modems zu warten bevor " ++#~ "ein Verbindungsversuch unternommen wird" ++ ++#~ msgid "Send Router Solicitiations" ++#~ msgstr "Router Solicititaions senden" ++ ++#~ msgid "Server IPv4-Address" ++#~ msgstr "Server IPv4-Adresse" ++ ++#~ msgid "Service type" ++#~ msgstr "Dienstart" ++ ++#~ msgid "Services and daemons perform certain tasks on your device." ++#~ msgstr "" ++#~ "Dienste und Hintergrundprozesse stellen den Großteil der Funktionalitäten " ++#~ "auf dem Router zur Verfügung." ++ ++#~ msgid "Settings" ++#~ msgstr "Einstellungen" ++ ++#~ msgid "Setup wait time" ++#~ msgstr "Initialisierungszeit" ++ ++#~ msgid "" ++#~ "Sorry. OpenWrt does not support a system upgrade on this platform.
    " ++#~ "You need to manually flash your device." ++#~ msgstr "" ++#~ "Sorry. OpenWrt unterstützt kein Systemupdate auf dieser Platform.
    " ++#~ "Sie müssen das Gerät manuell neu flashen." ++ ++#~ msgid "Specify additional command line arguments for pppd here" ++#~ msgstr "" ++#~ "Hier können zusätzliche Kommandozeilenargumente für pppd angegeben werden" ++ ++#~ msgid "TTL" ++#~ msgstr "TTL" ++ ++#~ msgid "The device node of your modem, e.g. /dev/ttyUSB0" ++#~ msgstr "Geräteknoten des Modems, z.B. /dev/ttyUSB0" ++ ++#~ msgid "Time (in seconds) after which an unused connection will be closed" ++#~ msgstr "Zeit (in s) nach der die Verbindung bei Inaktivität getrennt wird" ++ ++#~ msgid "Time Server (rdate)" ++#~ msgstr "Zeit-Server (rdate)" ++ ++#~ msgid "Tunnel Settings" ++#~ msgstr "Tunnel-Einstellungen" ++ ++#~ msgid "Update package lists" ++#~ msgstr "Paketlisten aktualisieren" ++ ++#~ msgid "Upload an OpenWrt image file to reflash the device." ++#~ msgstr "Firmware-Image hochladen um das Gerät neu zu flashen." ++ ++#~ msgid "Upload image" ++#~ msgstr "Image hochladen" ++ ++#~ msgid "Use peer DNS" ++#~ msgstr "DNS der Gegenstelle nutzen" ++ ++#~ msgid "VLAN %d" ++#~ msgstr "VLAN %d" ++ ++#~ msgid "" ++#~ "You can specify multiple DNS servers here, press enter to add a new " ++#~ "entry. Servers entered here will override automatically assigned ones." ++#~ msgstr "" ++#~ "Hier können mehrere DNS-Server angegeben werden. Enter fügt ein neues " ++#~ "Eingabefeld hinzu. Hier angegebene Server überschreiben autmatisch " ++#~ "zugewiesene Adressen." ++ ++#~ msgid "" ++#~ "You need to install \"comgt\" for UMTS/GPRS, \"ppp-mod-pppoe\" for PPPoE, " ++#~ "\"ppp-mod-pppoa\" for PPPoA or \"pptp\" for PPtP support" ++#~ msgstr "" ++#~ "Für die Unterstützung von UMTS/GPRS muss \"comgt\", für PPPoE \"ppp-mod-" ++#~ "pppoe\", für PPPoA \"ppp-mod-pppoa\" und für PPtP \"pptp\" installiert " ++#~ "sein" ++ ++#~ msgid "back" ++#~ msgstr "zurück" ++ ++#~ msgid "buffered" ++#~ msgstr "gepuffert" ++ ++#~ msgid "cached" ++#~ msgstr "gecached" ++ ++#~ msgid "free" ++#~ msgstr "frei" ++ ++#~ msgid "static" ++#~ msgstr "statisch" ++ ++#~ msgid "" ++#~ "LuCI is a collection " ++#~ "of free Lua software including an MVC-Webframework and webinterface for embedded devices. LuCI is licensed under the " ++#~ "Apache-License." ++#~ msgstr "" ++#~ "LuCI ist eine Sammlung freier Lua-Software einschließlich eines MVC-" ++#~ "Webframeworks und einer Weboberfläche für eingebettete Geräte. Luci steht " ++#~ "unter der Apache-Lizenz." ++ ++#~ msgid "SSH-Keys" ++#~ msgstr "SSH-Schlüssel" ++ ++#~ msgid "" ++#~ "A lightweight HTTP/1.1 webserver written in C and Lua designed to serve " ++#~ "LuCI" ++#~ msgstr "" ++#~ "Ein schlanker HTTP/1.1 Webserver in C und Lua geschrieben um LuCI zu " ++#~ "betreiben." ++ ++#~ msgid "" ++#~ "A small webserver which can be used to serve LuCI." ++#~ msgstr "" ++#~ "Ein kleiner Webserver, der für die Bereitstellung von LuCI genutzt werden " ++#~ "kann." ++ ++#~ msgid "About" ++#~ msgstr "Über" ++ ++#~ msgid "Active IP Connections" ++#~ msgstr "Aktive IP Verbindungen" ++ ++#~ msgid "Addresses" ++#~ msgstr "Adressen" ++ ++#~ msgid "Admin Password" ++#~ msgstr "Passwort ändern" ++ ++#~ msgid "Alias" ++#~ msgstr "Alias" ++ ++#~ msgid "Authentication Realm" ++#~ msgstr "Anmeldeaufforderung" ++ ++#~ msgid "Bridge Port" ++#~ msgstr "Port" ++ ++#~ msgid "" ++#~ "Change the password of the system administrator (User root)" ++#~ msgstr "Ändert das Passwort des Systemverwalters (Benutzer \"root\")" ++ ++#~ msgid "Client + WDS" ++#~ msgstr "Client mit WDS" ++ ++#~ msgid "Configuration file" ++#~ msgstr "Konfigurationsdatei" ++ ++#~ msgid "Connection timeout" ++#~ msgstr "Verbindungszeitlimit" ++ ++#~ msgid "Contributing Developers" ++#~ msgstr "Mitwirkende Entwickler" ++ ++#~ msgid "DHCP assigned" ++#~ msgstr "durch DHCP zugewiesen" ++ ++#~ msgid "Document root" ++#~ msgstr "Wurzelverzeichnis" ++ ++#~ msgid "Enable Keep-Alive" ++#~ msgstr "Keep-Alive aktivieren" ++ ++#~ msgid "Enable device" ++#~ msgstr "Gerät aktivieren" ++ ++#~ msgid "Ethernet Bridge" ++#~ msgstr "Netzwerkbrücke" ++ ++#~ msgid "" ++#~ "Here you can paste public SSH-Keys " ++#~ "(one per line) for SSH public-key " ++#~ "authentication." ++#~ msgstr "" ++#~ "Hier können öffentliche SSH-Schlüssel (einer pro Zeile) zur " ++#~ "Authentifizierung abgelegt werden." ++ ++#~ msgid "ID" ++#~ msgstr "Bezeichner" ++ ++#~ msgid "IP Configuration" ++#~ msgstr "IP Konfiguration" ++ ++#~ msgid "Interface Status" ++#~ msgstr "Netzwerkschnittstellen-Status" ++ ++#~ msgid "Lead Development" ++#~ msgstr "Leitende Entwicklung" ++ ++#~ msgid "Master" ++#~ msgstr "Master" ++ ++#~ msgid "Master + WDS" ++#~ msgstr "Master mit WDS" ++ ++#~ msgid "No address configured on this interface." ++#~ msgstr "Keine Adresse auf dieser Schnittstelle konfiguriert" ++ ++#~ msgid "Not configured" ++#~ msgstr "nicht konfiguriert" ++ ++#~ msgid "Password successfully changed" ++#~ msgstr "Passwort erfolgreich geändert" ++ ++#~ msgid "Plugin path" ++#~ msgstr "Pluginpfad" ++ ++#~ msgid "Ports" ++#~ msgstr "Ports" ++ ++#~ msgid "Primary" ++#~ msgstr "primär" ++ ++#~ msgid "Project Homepage" ++#~ msgstr "Projekt Homepage" ++ ++#~ msgid "Pseudo Ad-Hoc" ++#~ msgstr "Pseudo-Ad-Hoc (Atheros)" ++ ++#~ msgid "STP" ++#~ msgstr "Spanning-Tree-Protokoll" ++ ++#~ msgid "Thanks To" ++#~ msgstr "Dank an" ++ ++#~ msgid "" ++#~ "The realm which will be displayed at the authentication prompt for " ++#~ "protected pages." ++#~ msgstr "Aufforderungstext zum Anmelden im Administrationsbereich" ++ ++#~ msgid "Unknown Error" ++#~ msgstr "Unbekannter Fehler" ++ ++#~ msgid "VLAN" ++#~ msgstr "VLAN" ++ ++#~ msgid "defaults to /etc/httpd.conf" ++#~ msgstr "nutzt /etc/httpd.conf wenn leer" ++ ++#~ msgid "Enable this switch" ++#~ msgstr "Switch aktivieren" ++ ++#~ msgid "OPKG error code %i" ++#~ msgstr "OPKG Fehlercode %i" ++ ++#~ msgid "Package lists updated" ++#~ msgstr "Paketlisten wurden aktualisiert" ++ ++#~ msgid "Reset switch during setup" ++#~ msgstr "Switch während der Einrichtung zurücksetzen" ++ ++#~ msgid "Upgrade installed packages" ++#~ msgstr "Installierte Pakete aktualisieren" ++ ++#~ msgid "" ++#~ "Also kernel or service logfiles can be viewed here to get an overview " ++#~ "over their current state." ++#~ msgstr "" ++#~ "Zusätzlich können hier Protokolldaten, des Kernels und diverser " ++#~ "Systemdienste eingesehen werden, um deren Zustand zu kontrollieren." ++ ++#~ msgid "" ++#~ "Here you can find information about the current system status like CPU clock frequency, memory " ++#~ "usage or network interface data." ++#~ msgstr "" ++#~ "Hier finden sich Informationen über den aktuellen Status des Systems, " ++#~ "beispielsweise Prozessortakt, Speicherauslastung und " ++#~ "Netzwerkschnittstellen." ++ ++#~ msgid "Search file..." ++#~ msgstr "Datei suchen..." ++ ++#~ msgid "Server" ++#~ msgstr "Server" ++ ++#~ msgid "" ++#~ "LuCI is a free, " ++#~ "flexible, and user friendly graphical interface for configuring OpenWrt " ++#~ "Kamikaze." ++#~ msgstr "" ++#~ "LuCI ist eine freie, flexible und benutzerfreundliche grafische " ++#~ "Oberfläche zur Konfiguration von OpenWrt Kamikaze." ++ ++#~ msgid "And now have fun with your router!" ++#~ msgstr "Und nun wünschen wir viel Spaß mit dem Router!" ++ ++#~ msgid "" ++#~ "As we always want to improve this interface we are looking forward to " ++#~ "your feedback and suggestions." ++#~ msgstr "" ++#~ "Wir sind natürlich stets darum bemüht, diese Oberfläche noch besser und " ++#~ "intuitiver zu Gestalten und freuen uns über jegliche Art von Feedback " ++#~ "oder Verbesserungsvorschlägen." ++ ++#~ msgid "Hello!" ++#~ msgstr "Hallo!" ++ ++#~ msgid "LuCI Components" ++#~ msgstr "LuCI Komponenten" ++ ++#~ msgid "" ++#~ "Notice: In LuCI " ++#~ "changes have to be confirmed by clicking Changes - Save & Apply " ++#~ "before being applied." ++#~ msgstr "" ++#~ "Hinweis: In LuCI werden getätigte Änderungen erst nach einem Klick auf " ++#~ "Änderungen - Speichern & Anwenden angewandt." ++ ++#~ msgid "" ++#~ "On the following pages you can adjust all important settings of your " ++#~ "router." ++#~ msgstr "" ++#~ "Auf den folgenden Seiten können alle wichtigen Einstellungen des Routers " ++#~ "vorgenommen werden." ++ ++#~ msgid "The LuCI Team" ++#~ msgstr "Das LuCI-Team" ++ ++#~ msgid "" ++#~ "This is the administration area of LuCI." ++#~ msgstr "Dies ist der Administrationsbereich von LuCI." ++ ++#~ msgid "User Interface" ++#~ msgstr "Benutzeroberfläche" ++ ++#~ msgid "used" ++#~ msgstr "benutzt" ++ ++#~ msgid "enable" ++#~ msgstr "aktivieren" ++ ++#~ msgid "" ++#~ "Port PVIDs specify the default " ++#~ "VLAN ID added to received untagged frames.
    Leave the ID field empty " ++#~ "to disable auto tagging on the associated port." ++#~ msgstr "" ++#~ "Port PVIDs definieren die " ++#~ "standard VLAN-ID welche zu empfangen, nicht getaggten Ethernet-Frames " ++#~ "hinzugefügt wird.
    Dieses Feld leer lassen um Auto-Tagging auf dem " ++#~ "zugehörigen Port zu deaktivieren." ++ ++#~ msgid "(hidden)" ++#~ msgstr "(versteckt)" ++ ++#~ msgid "(optional)" ++#~ msgstr "(optional)" ++ ++#~ msgid "DNS-Port" ++#~ msgstr "DNS-Port" ++ ++#~ msgid "" ++#~ "DNS-Server will be queried in " ++#~ "the order of the resolvfile" ++#~ msgstr "DNS-Server werden gemäß der Reihenfolge der Resolvdatei abgefragt" ++ ++#~ msgid "" ++#~ "max. DHCP-Leases" ++#~ msgstr "maximale Anzahl von DHCP-Leases" ++ ++#~ msgid "" ++#~ "max. EDNS0 packet size" ++#~ msgstr "" ++#~ "maximale EDNS.0 Paketgröße" ++ ++#~ msgid "AP-Isolation" ++#~ msgstr "AP-Isolation" ++ ++#~ msgid "Add the Wifi network to physical network" ++#~ msgstr "WLAN-Netz zu Netzwerk hinzufügen" ++ ++#~ msgid "Aliases" ++#~ msgstr "Aliasse" ++ ++#~ msgid "Attach to existing network" ++#~ msgstr "Zu bestehendem Netzwerk hinzufügen" ++ ++#~ msgid "Clamp Segment Size" ++#~ msgstr "MSS-Korrektur" ++ ++#, fuzzy ++#~ msgid "Create Or Attach Network" ++#~ msgstr "Netzwerk anlegen" ++ ++#~ msgid "DHCP" ++#~ msgstr "DHCP" ++ ++#~ msgid "Devices" ++#~ msgstr "Geräte" ++ ++#~ msgid "Don't forward reverse lookups for local networks" ++#~ msgstr "Reverse DNS-Anfragen für lokale Netze nicht weiterleiten" ++ ++#~ msgid "Enable TFTP-Server" ++#~ msgstr "TFTP-Server aktivieren" ++ ++#~ msgid "Errors" ++#~ msgstr "Fehler" ++ ++#~ msgid "Essentials" ++#~ msgstr "Vereinfacht" ++ ++#~ msgid "Expand Hosts" ++#~ msgstr "Erweitere Hosts" ++ ++#~ msgid "First leased address" ++#~ msgstr "Erste vergebene Adresse" ++ ++#~ msgid "" ++#~ "Fixes problems with unreachable websites, submitting forms or other " ++#~ "unexpected behaviour for some ISPs." ++#~ msgstr "" ++#~ "Behebt Probleme bei nicht erreichbaren Webseiten, Absenden von Formularen " ++#~ "oder anderes unerwartetes Verhalten für einige ISPs." ++ ++#~ msgid "Hardware Address" ++#~ msgstr "Hardware Adresse" ++ ++#~ msgid "Here you can configure installed wifi devices." ++#~ msgstr "An dieser Stelle können eingebaute WLAN-Geräte konfiguriert werden." ++ ++#~ msgid "Ignore /etc/hosts" ++#~ msgstr "Ignoriere /etc/hosts" ++ ++#~ msgid "Independent (Ad-Hoc)" ++#~ msgstr "Unabhängig (Ad-Hoc)" ++ ++#~ msgid "Internet Connection" ++#~ msgstr "Internetverbindung" ++ ++#~ msgid "Join (Client)" ++#~ msgstr "Einklinken (Client)" ++ ++#~ msgid "Leases" ++#~ msgstr "Zuweisungen" ++ ++#~ msgid "Local Domain" ++#~ msgstr "Lokale Domain" ++ ++#~ msgid "Local Network" ++#~ msgstr "Lokales Netz" ++ ++#~ msgid "Local Server" ++#~ msgstr "Lokale Server" ++ ++#~ msgid "Network Boot Image" ++#~ msgstr "Netzwerk-Boot Abbild" ++ ++#~ msgid "" ++#~ "Network Name (ESSID)" ++#~ msgstr "Netzkennung (ESSID)" ++ ++#~ msgid "Number of leased addresses" ++#~ msgstr "Anzahl vergebener Adressen" ++ ++#~ msgid "Perform Actions" ++#~ msgstr "Aktionen ausführen" ++ ++#~ msgid "Prevents Client to Client communication" ++#~ msgstr "Unterbindet Client-Client-Verkehr" ++ ++#~ msgid "Provide (Access Point)" ++#~ msgstr "Anbieten (Access Point)" ++ ++#~ msgid "Resolvfile" ++#~ msgstr "Resolvdatei" ++ ++#~ msgid "TFTP-Server Root" ++#~ msgstr "TFTP-Server Wurzelverzeichnis" ++ ++#~ msgid "TX / RX" ++#~ msgstr "TX / RX" ++ ++#~ msgid "The following changes have been applied" ++#~ msgstr "Die folgenden Änderungen wurden übernommen" ++ ++#~ msgid "" ++#~ "When flashing a new firmware with LuCI these files will be added to the new firmware " ++#~ "installation." ++#~ msgstr "" ++#~ "Die folgenden Dateien und Verzeichnisse werden beim Aktualisieren der " ++#~ "Firmware über die Oberfläche automatisch in die neue Firmware übernommen." ++ ++#~ msgid "Wireless Scan" ++#~ msgstr "WLAN-Scan" ++ ++#~ msgid "" ++#~ "With DHCP " ++#~ "network members can automatically receive their network settings (IP-address, netmask, DNS-server, ...)." ++#~ msgstr "" ++#~ "Mit DHCP " ++#~ "können Netzwerkteilnehmer automatisch Einstellungen wie IP-Adresse, Präfix, DNS-Server, usw. beziehen." ++ ++#~ msgid "" ++#~ "You are about to join the wireless network %s. " ++#~ "In order to complete the process, you need to provide some additional " ++#~ "details." ++#~ msgstr "" ++#~ "Sie sind dabei dem Drahtlosnetzwerk %s " ++#~ "beizutreten.Um den Prozess zu beenden müssen einige weitere Angaben " ++#~ "gemacht werden." ++ ++#~ msgid "" ++#~ "You can run several wifi networks with one device. Be aware that there " ++#~ "are certain hardware and driverspecific restrictions. Normally you can " ++#~ "operate 1 Ad-Hoc or up to 3 Master-Mode and 1 Client-Mode network " ++#~ "simultaneously." ++#~ msgstr "" ++#~ "Pro WLAN-Gerät können mehrere Netze bereitgestellt werden. Es sollte " ++#~ "beachtet werden, dass es hardware- / treiberspezifische Einschränkungen " ++#~ "gibt. So kann pro WLAN-Gerät in der Regel entweder 1 Ad-Hoc-Zugang ODER " ++#~ "bis zu 3 Access-Point und 1 Client-Zugang gleichzeitig erstellt werden." ++ ++#~ msgid "" ++#~ "You need to install \"ppp-mod-pppoe\" for PPPoE or \"pptp\" for PPtP " ++#~ "support" ++#~ msgstr "" ++#~ "Für die Unterstützung von PPPoE muss \"ppp-mod-pppoe\" und für PPtP \"pptp" ++#~ "\" installiert sein" ++ ++#~ msgid "" ++#~ "You need to install wpa-supplicant to use WPA!" ++#~ msgstr "" ++#~ "Sie müssen wpa-supplicant isntallieren um WPA " ++#~ "nutzen zu können!" ++ ++#~ msgid "" ++#~ "You need to install the Broadcom nas supplicant " ++#~ "to use WPA!" ++#~ msgstr "" ++#~ "Sie müssen den Broadcom nas Supplikaten " ++#~ "installieren um WPA nutzen zu können!" ++ ++#~ msgid "Zone" ++#~ msgstr "Zone" ++ ++#~ msgid "additional hostfile" ++#~ msgstr "Zusätzliche Hostdatei" ++ ++#~ msgid "adds domain names to hostentries in the resolv file" ++#~ msgstr "" ++#~ "Fügt Domainnamen zu einfachen Hosteinträgen in der Resolvdatei hinzu" ++ ++#~ msgid "automatically reconnect" ++#~ msgstr "automatisch neu verbinden" ++ ++#~ msgid "concurrent queries" ++#~ msgstr "gleichzeitige Abfragen" ++ ++#~ msgid "" ++#~ "disable DHCP " ++#~ "for this interface" ++#~ msgstr "DHCP für dieses Netzwerk deaktivieren" ++ ++#~ msgid "disconnect when idle for" ++#~ msgstr "trennen bei Inaktivität nach" ++ ++#~ msgid "don't cache unknown" ++#~ msgstr "Unbekannte nicht cachen" ++ ++#~ msgid "" ++#~ "filter useless DNS-queries of " ++#~ "Windows-systems" ++#~ msgstr "nutzlose DNS-Anfragen aktueller Windowssysteme filtern" ++ ++#~ msgid "installed" ++#~ msgstr "installiert" ++ ++#~ msgid "localises the hostname depending on its subnet" ++#~ msgstr "" ++#~ "Gibt die Adresse eines Hostnamen entsprechend seines Subnetzes zurück" ++ ++#~ msgid "manual" ++#~ msgstr "manuell" ++ ++#~ msgid "not installed" ++#~ msgstr "nicht installiert" ++ ++#~ msgid "" ++#~ "prevents caching of negative DNS-replies" ++#~ msgstr "Negative DNS-Antworten nicht zwischenspeichern" ++ ++#~ msgid "query port" ++#~ msgstr "Abfrageport" ++ ++#~ msgid "transmitted / received" ++#~ msgstr "gesendet / empfangen" ++ ++#, fuzzy ++#~ msgid "Join network" ++#~ msgstr "verbundene Netzwerke" ++ ++#~ msgid "all" ++#~ msgstr "alle" ++ ++#~ msgid "Code" ++#~ msgstr "Code" ++ ++#~ msgid "Distance" ++#~ msgstr "Distanz" ++ ++#~ msgid "Legend" ++#~ msgstr "Legende" ++ ++#~ msgid "Library" ++#~ msgstr "Bibliothek" ++ ++#~ msgid "see '%s' manpage" ++#~ msgstr "siehe '%s' manpage" ++ ++#~ msgid "Package Manager" ++#~ msgstr "Packet-Manager" ++ ++#~ msgid "Service" ++#~ msgstr "Dienst" ++ ++#~ msgid "Statistics" ++#~ msgstr "Statistiken" ++ ++#~ msgid "zone" ++#~ msgstr "Zone" +diff --git a/feeds/luci/modules/luci-base/po/el/base.po b/feeds/luci/modules/luci-base/po/el/base.po +new file mode 100644 +index 0000000..ed3a207 +--- /dev/null ++++ b/feeds/luci/modules/luci-base/po/el/base.po +@@ -0,0 +1,4048 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Report-Msgid-Bugs-To: \n" ++"POT-Creation-Date: 2009-06-10 03:40+0200\n" ++"PO-Revision-Date: 2012-03-31 15:35+0200\n" ++"Last-Translator: Vasilis \n" ++"Language-Team: LANGUAGE \n" ++"Language: el\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n != 1);\n" ++"X-Generator: Pootle 2.0.4\n" ++ ++msgid "(%d minute window, %d second interval)" ++msgstr "(παÏάθυÏο %d λεπτών, διάστημα %d δευτεÏολέπτων)" ++ ++msgid "(%s available)" ++msgstr "(%s διαθέσιμα)" ++ ++msgid "(empty)" ++msgstr "(κενό)" ++ ++msgid "(no interfaces attached)" ++msgstr "(χωÏίς Ï€ÏοσαÏτημένες διεπαφές)" ++ ++msgid "-- Additional Field --" ++msgstr "-- Επιπλέον Πεδίο --" ++ ++msgid "-- Please choose --" ++msgstr "-- ΠαÏακαλώ επιλέξτε --" ++ ++msgid "-- custom --" ++msgstr "-- Ï€ÏοσαÏμοσμένο --" ++ ++msgid "-- match by device --" ++msgstr "" ++ ++msgid "-- match by label --" ++msgstr "" ++ ++msgid "1 Minute Load:" ++msgstr "ΦοÏτίο 1 λεπτοÏ:" ++ ++msgid "15 Minute Load:" ++msgstr "ΦοÏτίο 15 λεπτών:" ++ ++msgid "5 Minute Load:" ++msgstr "ΦοÏτίο 5 λεπτών:" ++ ++msgid "BSSID" ++msgstr "BSSID" ++ ++msgid "DNS query port" ++msgstr "ΘÏÏα εÏωτημάτων DNS" ++ ++msgid "DNS server port" ++msgstr "ΘÏÏα εξυπηÏετητή DNS" ++ ++msgid "" ++"DNS servers will be queried in the " ++"order of the resolvfile" ++msgstr "" ++"Οι DNS εξυπηÏετητές θα " ++"εÏωτηθοÏν με την σειÏά εμφάνισης στο αÏχείο resolvfile" ++ ++msgid "ESSID" ++msgstr "ESSID" ++ ++msgid "IPv4-Address" ++msgstr "ΔιεÏθυνση IPv4" ++ ++msgid "IPv4-Gateway" ++msgstr "ΠÏλη IPv4" ++ ++msgid "IPv4-Netmask" ++msgstr "Μάσκα IPv4" ++ ++msgid "" ++"IPv6-Address or Network " ++"(CIDR)" ++msgstr "" ++"ΔιεÏθυνση IPv6 ή Δίκτυο " ++"(CIDR)" ++ ++msgid "IPv6-Gateway" ++msgstr "ΠÏλη IPv6" ++ ++msgid "IPv6-Suffix (hex)" ++msgstr "" ++ ++msgid "LED Configuration" ++msgstr "ΠαÏαμετÏοποίηση LED" ++ ++msgid "LED Name" ++msgstr "Όνομα LED" ++ ++msgid "MAC-Address" ++msgstr "ΔιεÏθυνση MAC" ++ ++msgid "" ++"Max. DHCP leases" ++msgstr "" ++"Μεγ. πλήθος DHCP leases" ++ ++msgid "" ++"Max. EDNS0 packet size" ++msgstr "" ++"Μεγ. μέγεθος πακέτου EDNS0" ++ ++msgid "Max. concurrent queries" ++msgstr "Μεγ. πλήθος ταυτόχÏονων εÏωτηματων" ++ ++msgid "%s - %s" ++msgstr "" ++ ++msgid "ADSL" ++msgstr "" ++ ++msgid "ADSL Status" ++msgstr "" ++ ++msgid "AICCU (SIXXS)" ++msgstr "" ++ ++msgid "APN" ++msgstr "APN" ++ ++msgid "AR Support" ++msgstr "ΥποστήÏιξη AR" ++ ++msgid "ARP retry threshold" ++msgstr "ÎŒÏιο επαναδοκιμών ARP" ++ ++msgid "ATM Bridges" ++msgstr "ΓέφυÏες ΑΤΜ" ++ ++msgid "ATM Virtual Channel Identifier (VCI)" ++msgstr "ATM Εικονικό Κανάλι ΑναγνωÏιστή (VCI)" ++ ++msgid "ATM Virtual Path Identifier (VPI)" ++msgstr "ATM Εικονικό μονοπάτι ΑναγνωÏιστή (VPI)" ++ ++msgid "" ++"ATM bridges expose encapsulated ethernet in AAL5 connections as virtual " ++"Linux network interfaces which can be used in conjunction with DHCP or PPP " ++"to dial into the provider network." ++msgstr "" ++"Οι γέφυÏες ATM αποκαλÏπτουν ενθυλακωμένες ethernet σε συνδέσεις AAL5 σαν " ++"εικονικές διεπαφές δικτÏου Linux, οι οποίες μποÏοÏν να χÏησιμοποιηθοÏν σε " ++"συνδυασμό με DHCP ή PPP για την κλήση Ï€Ïος τον παÏοχέα δικτÏου." ++ ++msgid "ATM device number" ++msgstr "ΑÏιθμός συσκευής ATM" ++ ++msgid "AYIYA" ++msgstr "" ++ ++msgid "Access Concentrator" ++msgstr "ΣυγκεντÏωτής ΠÏόσβασης " ++ ++msgid "Access Point" ++msgstr "Σημείο ΠÏόσβασης" ++ ++msgid "Action" ++msgstr "ΕνέÏγεια" ++ ++msgid "Actions" ++msgstr "ΕνέÏγειες" ++ ++msgid "Activate this network" ++msgstr "ΕνεÏγοποίηση Î±Ï…Ï„Î¿Ï Ï„Î¿Ï… δικτÏου" ++ ++msgid "Active IPv4-Routes" ++msgstr "" ++"ΕνεÏγές ΔιαδÏομές IPv4" ++ ++msgid "Active IPv6-Routes" ++msgstr "" ++"ΕνεÏγές ΔιαδÏομές IPv6" ++ ++msgid "Active Connections" ++msgstr "ΕνεÏγές Συνδέσεις" ++ ++msgid "Active DHCP Leases" ++msgstr "" ++ ++msgid "Active DHCPv6 Leases" ++msgstr "" ++ ++msgid "Ad-Hoc" ++msgstr "Ad-Hoc" ++ ++msgid "Add" ++msgstr "ΠÏοσθήκη" ++ ++msgid "Add local domain suffix to names served from hosts files" ++msgstr "" ++"ΠÏοσθήκη κατάληξης Ï„Î¿Ï€Î¹ÎºÎ¿Ï Ï„Î¿Î¼Î­Î± για ονόματα εξυπηÏετοÏμενα από αÏχεία hosts " ++ ++msgid "Add new interface..." ++msgstr "ΠÏοσθήκη νέας διεπαφής..." ++ ++msgid "Additional Hosts files" ++msgstr "Επιπλέον αÏχεία Hosts" ++ ++msgid "Address" ++msgstr "ΔιεÏθυνση" ++ ++msgid "Address to access local relay bridge" ++msgstr "ΔιεÏθυνση για Ï€Ïόσβαση σε την τοπική γέφυÏα αναμετάδοσης" ++ ++msgid "Administration" ++msgstr "ΔιαχείÏιση" ++ ++msgid "Advanced Settings" ++msgstr "ΠÏοχωÏημένες Ρυθμίσεις" ++ ++msgid "Alert" ++msgstr "Ειδοποίηση" ++ ++msgid "Allow SSH password authentication" ++msgstr "" ++"ΕπιτÏέπει την εξουσιοδότηση SSH με " ++"κωδικό Ï€Ïόσβασης" ++ ++msgid "Allow all except listed" ++msgstr "Îα επιτÏέπονται όλες, εκτός από αυτές στη λίστα" ++ ++msgid "Allow listed only" ++msgstr "Îα επιτÏέπονται μόνο αυτές στην λίστα" ++ ++msgid "Allow localhost" ++msgstr "Îα επιτÏέπεται το localhost" ++ ++msgid "Allow remote hosts to connect to local SSH forwarded ports" ++msgstr "" ++"Îα επιτÏέπεται σε απομακÏυσμένα συστήματα να συνδέονται σε τοπικά " ++"Ï€Ïοωθημένες SSH θÏÏες" ++ ++msgid "Allow root logins with password" ++msgstr "Îα επιτÏέπονται root συνδέσεις με κωδικό Ï€Ïόσβασης" ++ ++msgid "Allow the root user to login with password" ++msgstr "" ++"Îα επιτÏέπεται στον χÏήστη root να συνδέετε με κωδικό Ï€Ïόσβασης" ++ ++msgid "" ++"Allow upstream responses in the 127.0.0.0/8 range, e.g. for RBL services" ++msgstr "" ++"Îα επιτÏέπονται απαντήσεις από ανώτεÏο επίπεδο εντός του εÏÏους 127.0.0.0/8, " ++"Ï€.χ. για υπηÏεσίες RBL" ++ ++msgid "" ++"Also see Tunneling Comparison on SIXXS" ++msgstr "" ++ ++msgid "Always announce default router" ++msgstr "" ++ ++msgid "An additional network will be created if you leave this unchecked." ++msgstr "Ένα επιπλέον δίκτυο θα δημιουÏγηθεί εάν αυτό αφεθεί κενό" ++ ++msgid "Announce as default router even if no public prefix is available." ++msgstr "" ++ ++msgid "Announced DNS domains" ++msgstr "" ++ ++msgid "Announced DNS servers" ++msgstr "" ++ ++msgid "Antenna 1" ++msgstr "ΚεÏαία 1" ++ ++msgid "Antenna 2" ++msgstr "ΚεÏαία 2" ++ ++msgid "Antenna Configuration" ++msgstr "" ++ ++msgid "Any zone" ++msgstr "Οιαδήποτε ζώνη" ++ ++msgid "Apply" ++msgstr "ΕφαÏμογή" ++ ++msgid "Applying changes" ++msgstr "ΕφαÏμογή αλλαγών" ++ ++msgid "" ++"Assign a part of given length of every public IPv6-prefix to this interface" ++msgstr "" ++ ++msgid "Assign interfaces..." ++msgstr "" ++ ++msgid "" ++"Assign prefix parts using this hexadecimal subprefix ID for this interface." ++msgstr "" ++ ++msgid "Associated Stations" ++msgstr "Συνδεδεμένοι Σταθμοί" ++ ++msgid "Atheros 802.11%s Wireless Controller" ++msgstr "" ++ ++msgid "AuthGroup" ++msgstr "" ++ ++msgid "Authentication" ++msgstr "Εξουσιοδότηση" ++ ++msgid "Authoritative" ++msgstr "ΚÏÏιος" ++ ++msgid "Authorization Required" ++msgstr "Απαιτείται Εξουσιοδότηση" ++ ++msgid "Auto Refresh" ++msgstr "Αυτόματη Ανανέωση" ++ ++msgid "Automatic" ++msgstr "" ++ ++msgid "Automatic Homenet (HNCP)" ++msgstr "" ++ ++msgid "Available" ++msgstr "Διαθέσιμο" ++ ++msgid "Available packages" ++msgstr "Διαθέσιμα πακέτα" ++ ++msgid "Average:" ++msgstr "Μέσος ÎŒÏος:" ++ ++msgid "BSSID" ++msgstr "BSSID" ++ ++msgid "Back" ++msgstr "Πίσω" ++ ++msgid "Back to Overview" ++msgstr "Πίσω Ï€Ïος Επισκόπηση" ++ ++msgid "Back to configuration" ++msgstr "Πίσω Ï€Ïος παÏαμετÏοποίηση" ++ ++msgid "Back to overview" ++msgstr "Πίσω Ï€Ïος επισκόπηση" ++ ++msgid "Back to scan results" ++msgstr "Πίσω στα αποτελέσματα σάÏωσης" ++ ++msgid "Background Scan" ++msgstr "ΣάÏωση ΠαÏασκηνίου" ++ ++msgid "Backup / Flash Firmware" ++msgstr "ΑντίγÏαφο ασφαλείας / ΕγγÏαφή FLASH Υλικολογισμικό" ++ ++msgid "Backup / Restore" ++msgstr "Αποθήκευση / ΕπαναφοÏά ΑντίγÏαφου Ασφαλείας" ++ ++msgid "Backup file list" ++msgstr "Λίστα αÏχείων για αντίγÏαφο ασφαλείας" ++ ++#, fuzzy ++msgid "Bad address specified!" ++msgstr "Μη έγκυÏη διεÏθυνση!" ++ ++msgid "Band" ++msgstr "" ++ ++msgid "Behind NAT" ++msgstr "" ++ ++msgid "" ++"Below is the determined list of files to backup. It consists of changed " ++"configuration files marked by opkg, essential base files and the user " ++"defined backup patterns." ++msgstr "" ++"ΠαÏακάτω είναι η Ï€ÏοκαθοÏισμένη λίστα αÏχείων για αντιγÏαφή ασφαλείας. " ++"Αποτελείτε από αλλαγμένα αÏχεία παÏαμετÏοποίησης σημαδεμένα από το opkg, " ++"ουσιώδη βασικά αÏχεία καθώς και καθοÏισμένα από το χÏήστη μοτίβα αντιγÏάφων " ++"ασφαλείας." ++ ++msgid "Bitrate" ++msgstr "Ρυθμός δεδομένων" ++ ++msgid "Bogus NX Domain Override" ++msgstr "ΠαÏάκαμψη ΨευδοÏÏ‚ Τομέα NX" ++ ++msgid "Bridge" ++msgstr "ΓέφυÏα" ++ ++msgid "Bridge interfaces" ++msgstr "ΓεφÏÏωμα διεπαφών" ++ ++msgid "Bridge unit number" ++msgstr "ΑÏιθμός μονάδας γέφυÏας" ++ ++msgid "Bring up on boot" ++msgstr "Ανέβασμα κατά την εκκίνηση" ++ ++msgid "Broadcom 802.11%s Wireless Controller" ++msgstr "" ++ ++msgid "Broadcom BCM%04x 802.11 Wireless Controller" ++msgstr "" ++ ++msgid "Buffered" ++msgstr "" ++ ++msgid "Buttons" ++msgstr "Κουμπιά" ++ ++msgid "CA certificate; if empty it will be saved after the first connection." ++msgstr "" ++ ++msgid "CPU" ++msgstr "" ++ ++msgid "CPU usage (%)" ++msgstr "ΧÏήση CPU (%)" ++ ++msgid "Cancel" ++msgstr "ΑκÏÏωση" ++ ++msgid "Category" ++msgstr "" ++ ++msgid "Chain" ++msgstr "Αλυσίδα" ++ ++msgid "Changes" ++msgstr "Αλλαγές" ++ ++msgid "Changes applied." ++msgstr "Αλλαγές εφαÏμόστηκαν." ++ ++msgid "Changes the administrator password for accessing the device" ++msgstr "Αλλάζει τον κωδικό διαχειÏιστή για Ï€Ïόσβαση στη συσκευή" ++ ++msgid "Channel" ++msgstr "Κανάλι" ++ ++msgid "Check" ++msgstr "Έλεγχος" ++ ++msgid "Checksum" ++msgstr "ΆθÏοισμα Ελέγχου" ++ ++msgid "" ++"Choose the firewall zone you want to assign to this interface. Select " ++"unspecified to remove the interface from the associated zone or " ++"fill out the create field to define a new zone and attach the " ++"interface to it." ++msgstr "" ++"Επιλέξατε την ζώνη τείχους Ï€Ïοστασίας που επιθυμητέ να αναθέσετε σε αυτήν " ++"την διεπαφή. Επιλέξτε απÏοσδιόÏιστο για να αφαιÏέσετε την διεπαφή " ++"από την συσχετισμένη ζώνη ή συμπληÏώστε το δημιουÏγία πεδίο για να " ++"Ï€ÏοσδιοÏίσετε μία νέα ζώνη και να Ï€ÏοσαÏτήσετε την διεπαφή σε αυτό." ++ ++msgid "" ++"Choose the network(s) you want to attach to this wireless interface or fill " ++"out the create field to define a new network." ++msgstr "" ++ ++msgid "Cipher" ++msgstr "" ++ ++msgid "" ++"Click \"Generate archive\" to download a tar archive of the current " ++"configuration files. To reset the firmware to its initial state, click " ++"\"Perform reset\" (only possible with squashfs images)." ++msgstr "" ++"Κλικ στο \"ΔημιουÏγία αÏχείου\" για να κατεβάσετε ένα tar αÏχείο με τα " ++"Ï„Ïέχοντα αÏχεία παÏαμετÏοποίησης. Για να επαναφέÏετε το υλικολογισμικό στην " ++"αÏχική του κατάσταση, κάντε κλικ στο \"Εκτέλεσε επαναφοÏά\" (δυνατό μόνο σε " ++"squashfs εικόνες)." ++ ++msgid "Client" ++msgstr "Πελάτης" ++ ++msgid "Client ID to send when requesting DHCP" ++msgstr "ΑναγνωÏιστικό πελάτη που αποστέλλετε κατά την αίτηση DHCP" ++ ++msgid "" ++"Close inactive connection after the given amount of seconds, use 0 to " ++"persist connection" ++msgstr "" ++"Κλείσιμο, μη ενεÏγών συνδέσεων μετά το πέÏας του οÏισμένου αÏÎ¹Î¸Î¼Î¿Ï " ++"δευτεÏολέπτων, χÏησιμοποιήστε 0 για να εξακολουθοÏν να υφίστανται επ' " ++"αόÏιστον" ++ ++msgid "Close list..." ++msgstr "Κλείσιμο λίστας..." ++ ++msgid "Collecting data..." ++msgstr "Συλλογή δεδομένων..." ++ ++msgid "Command" ++msgstr "Εντολή" ++ ++msgid "Common Configuration" ++msgstr "Κοινή ΠαÏαμετÏοποίηση" ++ ++msgid "Compression" ++msgstr "Συμπίεση" ++ ++msgid "Configuration" ++msgstr "ΠαÏαμετÏοποίηση" ++ ++msgid "Configuration applied." ++msgstr "Η ΠαÏαμετÏοποίηση εφαÏμόστηκε." ++ ++msgid "Configuration files will be kept." ++msgstr "Τα αÏχεία παÏαμετÏοποίησης θα διατηÏηθοÏν." ++ ++msgid "Confirmation" ++msgstr "Επιβεβαίωση" ++ ++msgid "Connect" ++msgstr "ΣÏνδεση" ++ ++msgid "Connected" ++msgstr "Συνδεδεμένος" ++ ++msgid "Connection Limit" ++msgstr "ÎŒÏιο Συνδέσεων" ++ ++msgid "Connection to server fails when TLS cannot be used" ++msgstr "" ++ ++msgid "Connections" ++msgstr "Συνδέσεις" ++ ++msgid "Country" ++msgstr "ΧώÏα" ++ ++msgid "Country Code" ++msgstr "Κωδικός ΧώÏας" ++ ++msgid "Cover the following interface" ++msgstr "Κάλυψη της ακόλουθης διεπαφής" ++ ++msgid "Cover the following interfaces" ++msgstr "Κάλυψη των ακόλουθων διεπαφών" ++ ++msgid "Create / Assign firewall-zone" ++msgstr "ΔημιουÏγία / Ανάθεση ζώνης τείχους Ï€Ïοστασίας" ++ ++msgid "Create Interface" ++msgstr "ΔημιουÏγία Διεπαφής" ++ ++msgid "Create a bridge over multiple interfaces" ++msgstr "" ++ ++msgid "Critical" ++msgstr "" ++ ++msgid "Cron Log Level" ++msgstr "Επίπεδο ΚαταγÏαφής Cron" ++ ++msgid "Custom Interface" ++msgstr "" ++ ++msgid "Custom delegated IPv6-prefix" ++msgstr "" ++ ++msgid "" ++"Customizes the behaviour of the device LEDs if possible." ++msgstr "" ++"Ρυθμίζει, αν είναι δυνατόν, την συμπεÏιφοÏά των LED της συσκευής." ++ ++msgid "DHCP Leases" ++msgstr "DHCP Leases" ++ ++msgid "DHCP Server" ++msgstr "ΕξυπηÏετητής DHCP" ++ ++msgid "DHCP and DNS" ++msgstr "DHCP και DNS" ++ ++msgid "DHCP client" ++msgstr "Πελάτης DHCP" ++ ++msgid "DHCP-Options" ++msgstr "Επιλογές DHCP" ++ ++msgid "DHCPv6 Leases" ++msgstr "" ++ ++msgid "DHCPv6 client" ++msgstr "" ++ ++msgid "DHCPv6-Mode" ++msgstr "" ++ ++msgid "DHCPv6-Service" ++msgstr "" ++ ++msgid "DNS" ++msgstr "DNS" ++ ++msgid "DNS forwardings" ++msgstr "ΠÏοωθήσεις DNS" ++ ++msgid "DNS-Label / FQDN" ++msgstr "" ++ ++msgid "DS-Lite AFTR address" ++msgstr "" ++ ++msgid "DUID" ++msgstr "" ++ ++msgid "Debug" ++msgstr "Αποσφαλμάτωση" ++ ++msgid "Default %d" ++msgstr "ΠÏοεπιλογή %d" ++ ++msgid "Default gateway" ++msgstr "ΠÏοεπιλεγμένη Ï€Ïλη" ++ ++msgid "Default route" ++msgstr "" ++ ++msgid "Default state" ++msgstr "ΠÏοεπιλεγμένη κατάσταση" ++ ++msgid "Define a name for this network." ++msgstr "ΟÏίστε ένα όνομα για αυτό το δίκτυο." ++ ++msgid "" ++"Define additional DHCP options, for example " ++"\"6,192.168.2.1,192.168.2.2\" which advertises different DNS " ++"servers to clients." ++msgstr "" ++"ΟÏίστε επιπλέον επιλογές DHCP, που διαφημίζουν διαφοÏετικοÏÏ‚ εξυπηÏετητές " ++"DNS στους πελάτες, για παÏάδειγμα \"6,192.168.2.1,192.168.2.2\"." ++ ++msgid "Delete" ++msgstr "ΔιαγÏαφή" ++ ++msgid "Delete this interface" ++msgstr "ΔιαγÏαφή αυτής της διεπαφής" ++ ++msgid "Delete this network" ++msgstr "ΔιαγÏαφή Î±Ï…Ï„Î¿Ï Ï„Î¿Ï… δικτÏου" ++ ++msgid "Description" ++msgstr "ΠεÏιγÏαφή" ++ ++msgid "Design" ++msgstr "Εμφάνιση" ++ ++msgid "Destination" ++msgstr "ΠÏοοÏισμός" ++ ++msgid "Device" ++msgstr "Συσκευή" ++ ++msgid "Device Configuration" ++msgstr "ΠαÏαμετÏοποίηση Συσκευής" ++ ++msgid "Diagnostics" ++msgstr "Διαγνωστικά" ++ ++msgid "Dial number" ++msgstr "" ++ ++msgid "Directory" ++msgstr "Κατάλογος" ++ ++msgid "Disable" ++msgstr "ΑπενεÏγοποίηση" ++ ++msgid "" ++"Disable DHCP for " ++"this interface." ++msgstr "" ++"ΑπενεÏγοποίηση DHCP για αυτή τη διεπαφή." ++ ++msgid "Disable DNS setup" ++msgstr "ΑπενεÏγοποίηση Ïυθμίσεων DNS" ++ ++msgid "Disable HW-Beacon timer" ++msgstr "ΑπενεÏγοποίηση χÏονιστή HW-Beacon" ++ ++msgid "Disabled" ++msgstr "ΑπενεÏγοποιημένο" ++ ++msgid "Discard upstream RFC1918 responses" ++msgstr "Αγνόησε τις απαντήσεις ανοδικής Ïοής RFC1918" ++ ++msgid "Displaying only packages containing" ++msgstr "Εμφάνιση μόνο πακέτων που πεÏιέχουν" ++ ++msgid "Distance Optimization" ++msgstr "Βελτιστοποίηση Απόστασης" ++ ++msgid "Distance to farthest network member in meters." ++msgstr "Απόσταση σε μέτÏα από το πιο απομακÏυσμένο μέλος του δικτÏου." ++ ++msgid "Diversity" ++msgstr "ΔιαφοÏική Λήψη" ++ ++msgid "" ++"Dnsmasq is a combined DHCP-Server and DNS-" ++"Forwarder for NAT " ++"firewalls" ++msgstr "" ++"Ο Dnsmasq είναι ένας συνδυασμός εξυπηÏετητή DHCP και Ï€ÏοωθητήDNS για τείχη Ï€Ïοστασίας NAT" ++ ++msgid "Do not cache negative replies, e.g. for not existing domains" ++msgstr "" ++"Îα μην αποθηκεÏονται στη λανθάνουσα μνήμη οι αÏνητικές απαντήσεις, Ï€.χ. για " ++"μη υπαÏκτοÏÏ‚ τομείς." ++ ++msgid "Do not forward requests that cannot be answered by public name servers" ++msgstr "" ++"Îα μην Ï€ÏοωθοÏνται αιτήματα τα οποία δεν μποÏοÏν να απαντηθοÏν από δημόσιους " ++"εξυπηÏετητές ονομάτων" ++ ++msgid "Do not forward reverse lookups for local networks" ++msgstr "" ++ ++msgid "Do not send probe responses" ++msgstr "Îα μην στέλνονται απαντήσεις σε probes" ++ ++msgid "Domain required" ++msgstr "Απαίτηση για όνομα τομέα" ++ ++msgid "Domain whitelist" ++msgstr "Λευκή λίστα τομέων" ++ ++msgid "" ++"Don't forward DNS-Requests without " ++"DNS-Name" ++msgstr "" ++"Îα μην Ï€ÏοωθοÏνται εÏωτήματα DNS " ++"χωÏίς όνομα τομέα DNS" ++ ++msgid "Download and install package" ++msgstr "Κατέβασμα και εγκατάσταση πακέτου" ++ ++msgid "Download backup" ++msgstr "Κατέβασμα αντιγÏάφου ασφαλείας" ++ ++msgid "Dropbear Instance" ++msgstr "" ++ ++msgid "" ++"Dropbear offers SSH network shell access " ++"and an integrated SCP server" ++msgstr "" ++"Το Dropbear Ï€ÏοσφέÏει Ï€Ïόσβαση σε SSH " ++"κέλυφος μέσω δικτÏου και έναν ενσωματωμένο εξυπηÏετητή SCP" ++ ++msgid "Dual-Stack Lite (RFC6333)" ++msgstr "" ++ ++msgid "Dynamic DHCP" ++msgstr "" ++"Δυναμικό DHCP" ++ ++msgid "Dynamic tunnel" ++msgstr "Δυναμικό τοÏνελ" ++ ++msgid "" ++"Dynamically allocate DHCP addresses for clients. If disabled, only clients " ++"having static leases will be served." ++msgstr "" ++"Δυναμική απόδοση DHCP διευθÏνσεων στους πελάτες. Σε πεÏίπτωση " ++"απενεÏγοποίησης, μόνο πελάτες με στατικα leases θα εξυπηÏετοÏνται." ++ ++msgid "EAP-Method" ++msgstr "Μέθοδος EAP" ++ ++msgid "Edit" ++msgstr "ΕπεξεÏγασία" ++ ++msgid "" ++"Edit the raw configuration data above to fix any error and hit \"Save\" to " ++"reload the page." ++msgstr "" ++ ++msgid "Edit this interface" ++msgstr "ΕπεξεÏγασία αυτής της διεπαφής" ++ ++msgid "Edit this network" ++msgstr "ΕπεξεÏγασία Î±Ï…Ï„Î¿Ï Ï„Î¿Ï… δικτÏου" ++ ++msgid "Emergency" ++msgstr "Έκτακτη ανάγκη" ++ ++msgid "Enable" ++msgstr "ΕνεÏγοποίηση" ++ ++msgid "Enable STP" ++msgstr "ΕνεÏγοποίηση STP" ++ ++msgid "Enable HE.net dynamic endpoint update" ++msgstr "ΕνεÏγοποίηση ενημέÏωσης Î´Ï…Î½Î±Î¼Î¹ÎºÎ¿Ï Ï„ÎµÏÎ¼Î±Ï„Î¹ÎºÎ¿Ï ÏƒÎ·Î¼ÎµÎ¯Î¿Ï… HE.net." ++ ++msgid "Enable IPv6 negotiation on the PPP link" ++msgstr "ΕνεÏγοποίηση διαπÏαγμάτευσης IPv6 πάνω στη PPP ζεÏξη" ++ ++msgid "Enable Jumbo Frame passthrough" ++msgstr "ΕνεÏγοποίηση διέλευσης Jumbo Frame" ++ ++msgid "Enable NTP client" ++msgstr "" ++ ++msgid "Enable TFTP server" ++msgstr "ΕνεÏγοποίηση εξυπηÏετητή TFTP" ++ ++msgid "Enable VLAN functionality" ++msgstr "ΕνεÏγοποίηση λειτουÏγίας VLAN" ++ ++msgid "Enable WPS pushbutton, requires WPA(2)-PSK" ++msgstr "" ++ ++msgid "Enable learning and aging" ++msgstr "ΈνεÏγοποίηση learning and aging" ++ ++msgid "Enable mirroring of incoming packets" ++msgstr "" ++ ++msgid "Enable mirroring of outgoing packets" ++msgstr "" ++ ++msgid "Enable this mount" ++msgstr "ΕνεÏγοποίηση αυτής της Ï€ÏοσάÏτησης" ++ ++msgid "Enable this swap" ++msgstr "ΕνεÏγοποίηση αυτής της swap" ++ ++msgid "Enable/Disable" ++msgstr "ΕνεÏγοποίηση/ΑπενεÏγοποίηση" ++ ++msgid "Enabled" ++msgstr "ΕνεÏγοποιημένο" ++ ++msgid "Enables the Spanning Tree Protocol on this bridge" ++msgstr "" ++ ++msgid "Encapsulation mode" ++msgstr "ΛειτουÏγία ενθυλάκωσης" ++ ++msgid "Encryption" ++msgstr "ΚÏυπτογÏάφηση" ++ ++msgid "Erasing..." ++msgstr "ΔιαγÏάφεται..." ++ ++msgid "Error" ++msgstr "Σφάλμα" ++ ++msgid "Ethernet Adapter" ++msgstr "ΠÏοσαÏμογέας Ethernet" ++ ++msgid "Ethernet Switch" ++msgstr "Ethernet Switch" ++ ++msgid "Expand hosts" ++msgstr "" ++ ++msgid "Expires" ++msgstr "Λήγει" ++ ++#, fuzzy ++msgid "" ++"Expiry time of leased addresses, minimum is 2 minutes (2m)." ++msgstr "" ++"Ο ελάχιστος χÏόνος λήξεως των διευθÏνσεων lease είναι 2 λεπτά (2m)." ++ ++msgid "External" ++msgstr "" ++ ++msgid "External system log server" ++msgstr "ΕξωτεÏικός εξυπηÏετητής καταγÏαφής συστήματος" ++ ++msgid "External system log server port" ++msgstr "" ++ ++msgid "Fast Frames" ++msgstr "ΓÏήγοÏα Πλαίσια" ++ ++msgid "File" ++msgstr "ΑÏχείο" ++ ++msgid "Filename of the boot image advertised to clients" ++msgstr "Όνομα αÏχείου της εικόνας εκκίνησης που διαφημίζετε στους πελάτες" ++ ++msgid "Filesystem" ++msgstr "ΣÏστημα ΑÏχείων" ++ ++msgid "Filter" ++msgstr "ΦίλτÏο" ++ ++msgid "Filter private" ++msgstr "ΦιλτÏάÏισμα ιδιωτικών" ++ ++msgid "Filter useless" ++msgstr "ΦιλτÏάÏισμα άχÏηστων" ++ ++msgid "Find and join network" ++msgstr "ΕÏÏεση και σÏνδεση σε δίκτυο" ++ ++msgid "Find package" ++msgstr "ΕÏÏεση πακέτου" ++ ++msgid "Finish" ++msgstr "Τέλος" ++ ++msgid "Firewall" ++msgstr "Τείχος ΠÏοστασίας" ++ ++msgid "Firewall Settings" ++msgstr "Ρυθμίσεις Τείχους ΠÏοστασίας" ++ ++msgid "Firewall Status" ++msgstr "Κατάσταση Τείχους ΠÏοστασίας" ++ ++msgid "Firmware Version" ++msgstr "Έκδοση ΥλικολογισμικοÏ" ++ ++msgid "Fixed source port for outbound DNS queries" ++msgstr "" ++ ++msgid "Flags" ++msgstr "Σημαίες" ++ ++msgid "Flash Firmware" ++msgstr "ΦλασάÏισμα Firmware" ++ ++msgid "Flash image..." ++msgstr "ΦλασάÏισμα εικόνας..." ++ ++msgid "Flash new firmware image" ++msgstr "ΦλασάÏισμα νέας εικόνας υλικολογισμικοÏ" ++ ++msgid "Flash operations" ++msgstr "ΛειτουÏγίες φλασάÏισματος" ++ ++msgid "Flashing..." ++msgstr "ΦλασάÏεται..." ++ ++msgid "Force" ++msgstr "Επιβολή" ++ ++msgid "Force CCMP (AES)" ++msgstr "Επιβολή CCMP (AES)" ++ ++msgid "Force DHCP on this network even if another server is detected." ++msgstr "" ++"Επιβολή DHCP σε αυτό το δίκτυο ακόμα κι αν έχει εντοπιστεί άλλος εξυπηÏετητής" ++ ++msgid "Force TKIP" ++msgstr "Επιβολή TKIP" ++ ++msgid "Force TKIP and CCMP (AES)" ++msgstr "Επιβολή TKIP και CCMP (AES)" ++ ++msgid "Forward DHCP traffic" ++msgstr "ΠÏοώθηση κίνησης DHCP" ++ ++msgid "Forward broadcast traffic" ++msgstr "ΠÏοώθηση κίνησης broadcast" ++ ++msgid "Forwarding mode" ++msgstr "Μέθοδος Ï€Ïοώθησης" ++ ++msgid "Fragmentation Threshold" ++msgstr "ÎŒÏιο ΚατακεϵατισµοÏ" ++ ++msgid "Frame Bursting" ++msgstr "Bursting Πλαισίων" ++ ++msgid "Free" ++msgstr "" ++ ++msgid "Free space" ++msgstr "ΕλεÏθεÏος χώÏος" ++ ++msgid "GHz" ++msgstr "" ++ ++msgid "GPRS only" ++msgstr "" ++ ++msgid "Gateway" ++msgstr "ΠÏλη" ++ ++msgid "Gateway ports" ++msgstr "ΘÏÏες Ï€Ïλης" ++ ++msgid "General Settings" ++msgstr "Γενικές Ρυθμίσεις" ++ ++msgid "General Setup" ++msgstr "" ++ ++msgid "Generate archive" ++msgstr "" ++ ++msgid "Generic 802.11%s Wireless Controller" ++msgstr "" ++ ++msgid "Given password confirmation did not match, password not changed!" ++msgstr "" ++ ++msgid "Global network options" ++msgstr "" ++ ++msgid "Go to password configuration..." ++msgstr "" ++ ++msgid "Go to relevant configuration page" ++msgstr "Μετάβαση στη σχετική σελίδα Ïυθμίσεων" ++ ++msgid "Guest" ++msgstr "" ++ ++msgid "HE.net password" ++msgstr "" ++ ++msgid "HE.net username" ++msgstr "" ++ ++msgid "Handler" ++msgstr "" ++ ++msgid "Hang Up" ++msgstr "ΚÏέμασμα" ++ ++msgid "Heartbeat" ++msgstr "" ++ ++msgid "" ++"Here you can configure the basic aspects of your device like its hostname or " ++"the timezone." ++msgstr "" ++"Εδώ μποÏείτε να παÏαμετÏοποιήσετε βασικές πλευÏές της συσκευής σας όπως το " ++"όνομα υπολογιστή ή τη ζώνη ÏŽÏας." ++ ++msgid "" ++"Here you can paste public SSH-Keys (one per line) for SSH public-key " ++"authentication." ++msgstr "" ++ ++msgid "Hermes 802.11b Wireless Controller" ++msgstr "" ++ ++msgid "Hide ESSID" ++msgstr "ΚÏυφό ESSID" ++ ++msgid "Host entries" ++msgstr "ΚαταχωÏήσεις Υπολογιστών" ++ ++msgid "Host expiry timeout" ++msgstr "" ++ ++msgid "Host-IP or Network" ++msgstr "" ++"IP Υπολογιστή ή ΔικτÏου" ++ ++msgid "Hostname" ++msgstr "Όνομα Υπολογιστή" ++ ++msgid "Hostname to send when requesting DHCP" ++msgstr "" ++ ++msgid "Hostnames" ++msgstr "Ονόματα Υπολογιστών" ++ ++msgid "Hybrid" ++msgstr "" ++ ++msgid "IP address" ++msgstr "ΔιεÏθυνση IP" ++ ++msgid "IPv4" ++msgstr "IPv4" ++ ++msgid "IPv4 Firewall" ++msgstr "IPv4 Τείχος ΠÏοστασίας" ++ ++msgid "IPv4 WAN Status" ++msgstr "" ++ ++msgid "IPv4 address" ++msgstr "ΔιεÏθυνση IPv4" ++ ++msgid "IPv4 and IPv6" ++msgstr "IPv4 και IPv6" ++ ++msgid "IPv4 assignment length" ++msgstr "" ++ ++msgid "IPv4 broadcast" ++msgstr "" ++ ++msgid "IPv4 gateway" ++msgstr "ΠÏλη IPv4" ++ ++msgid "IPv4 netmask" ++msgstr "Μάσκα IPv4" ++ ++msgid "IPv4 only" ++msgstr "Μόνο IPv4" ++ ++msgid "IPv4 prefix length" ++msgstr "" ++ ++msgid "IPv4-Address" ++msgstr "IPv4-ΔιεÏθυνση" ++ ++msgid "IPv6" ++msgstr "IPv6" ++ ++msgid "IPv6 Firewall" ++msgstr "IPv6 Τείχος ΠÏοστασίας" ++ ++msgid "IPv6 Neighbours" ++msgstr "" ++ ++msgid "IPv6 Settings" ++msgstr "" ++ ++msgid "IPv6 ULA-Prefix" ++msgstr "" ++ ++msgid "IPv6 WAN Status" ++msgstr "Κατάσταση IPv6 WAN" ++ ++msgid "IPv6 address" ++msgstr "ΔιεÏθυνση IPv6" ++ ++msgid "IPv6 address delegated to the local tunnel endpoint (optional)" ++msgstr "" ++ ++msgid "IPv6 assignment hint" ++msgstr "" ++ ++msgid "IPv6 assignment length" ++msgstr "" ++ ++msgid "IPv6 gateway" ++msgstr "ΠÏλη IPv6" ++ ++msgid "IPv6 only" ++msgstr "Μόνο IPv6" ++ ++msgid "IPv6 prefix" ++msgstr "" ++ ++msgid "IPv6 prefix length" ++msgstr "" ++ ++msgid "IPv6 routed prefix" ++msgstr "" ++ ++msgid "IPv6-Address" ++msgstr "" ++ ++msgid "IPv6-in-IPv4 (RFC4213)" ++msgstr "IPv6-in-IPv4 (RFC4213)" ++ ++msgid "IPv6-over-IPv4 (6rd)" ++msgstr "" ++ ++msgid "IPv6-over-IPv4 (6to4)" ++msgstr "" ++ ++msgid "Identity" ++msgstr "Ταυτότητα" ++ ++msgid "" ++"If specified, mount the device by its UUID instead of a fixed device node" ++msgstr "" ++"Αν οÏιστεί, Ï€ÏοσάÏτησε τη συσκευή με βάση το UUID της αντί για το " ++"καθοÏισμένο όνομα της" ++ ++msgid "" ++"If specified, mount the device by the partition label instead of a fixed " ++"device node" ++msgstr "" ++"Αν οÏιστεί, Ï€ÏοσάÏτησε τη συσκευή με βάση την ετικέτα της αντί για το " ++"καθοÏισμένο όνομα της" ++ ++msgid "If unchecked, no default route is configured" ++msgstr "" ++ ++msgid "If unchecked, the advertised DNS server addresses are ignored" ++msgstr "" ++ ++msgid "" ++"If your physical memory is insufficient unused data can be temporarily " ++"swapped to a swap-device resulting in a higher amount of usable RAM. Be aware that swapping data is a very " ++"slow process as the swap-device cannot be accessed with the high datarates " ++"of the RAM." ++msgstr "" ++"Αν η φυσική μνήμη δεν είναι αÏκετή, μη-χÏησιμοποιοÏμενα δεδομένα μποÏοÏν " ++"Ï€ÏοσωÏινά να εναλλάσσονται σε μία συσκευή swap με αποτέλεσμα πεÏισσότεÏη " ++"ενεÏγή RAM. Η εναλλαγή δεδομένων " ++"είναι μία Ï€Î¿Î»Ï Î±Ïγή διαδικασία Î±Ï†Î¿Ï Î· συσκευή swap δεν μποÏεί να " ++"Ï€Ïοσπελαστεί με τους υψηλοÏÏ‚ ÏυθμοÏÏ‚ μεταφοÏάς δεδομένων που διαθέτει η " ++"RAM." ++ ++msgid "Ignore Hosts files" ++msgstr "" ++ ++msgid "Ignore interface" ++msgstr "Αγνόησε διεπαφή" ++ ++msgid "Ignore resolve file" ++msgstr "Αγνόησε αÏχείο resolve" ++ ++msgid "Image" ++msgstr "" ++ ++msgid "In" ++msgstr "Είσοδος" ++ ++msgid "Inactivity timeout" ++msgstr "" ++ ++msgid "Inbound:" ++msgstr "" ++ ++msgid "Info" ++msgstr "ΠληÏοφοÏίες" ++ ++msgid "Initscript" ++msgstr "ΣενάÏιο εκκίνησης" ++ ++msgid "Initscripts" ++msgstr "ΣενάÏια Εκκίνησης" ++ ++msgid "Install" ++msgstr "Εγκατάσταση" ++ ++msgid "Install iputils-traceroute6 for IPv6 traceroute" ++msgstr "" ++ ++msgid "Install package %q" ++msgstr "Εγκατάσταση πακέτου %q" ++ ++msgid "Install protocol extensions..." ++msgstr "Εγκατάσταση επεκτάσεων Ï€Ïωτοκόλλου..." ++ ++msgid "Installed packages" ++msgstr "Εγκατεστημένα πακέτα" ++ ++msgid "Interface" ++msgstr "Διεπαφή" ++ ++msgid "Interface Configuration" ++msgstr "ΠαÏαμετÏοποίηση Διεπαφής" ++ ++msgid "Interface Overview" ++msgstr "Επισκόπηση Διεπαφής" ++ ++msgid "Interface is reconnecting..." ++msgstr "Η διεπαφή επανασυνδέεται..." ++ ++msgid "Interface is shutting down..." ++msgstr "Η διεπαφή απενεÏγοποιείται..." ++ ++msgid "Interface not present or not connected yet." ++msgstr "Η διεπαφή δεν υπάÏχει ή δεν έχει συνδεθεί ακόμη." ++ ++msgid "Interface reconnected" ++msgstr "Η διεπαφή επανασυνδέθηκε" ++ ++msgid "Interface shut down" ++msgstr "Η διεπαφή απενεÏγοποιήθηκε" ++ ++msgid "Interfaces" ++msgstr "Διεπαφές" ++ ++msgid "Internal" ++msgstr "" ++ ++msgid "Internal Server Error" ++msgstr "" ++ ++msgid "Invalid" ++msgstr "ΆκυÏη τιμή εισόδου" ++ ++msgid "Invalid VLAN ID given! Only IDs between %d and %d are allowed." ++msgstr "" ++ ++msgid "Invalid VLAN ID given! Only unique IDs are allowed" ++msgstr "" ++ ++msgid "Invalid username and/or password! Please try again." ++msgstr "ΆκυÏο όνομα χÏήστη και/ή κωδικός Ï€Ïόσβασης! ΠαÏακαλώ Ï€Ïοσπαθήστε ξανά." ++ ++#, fuzzy ++msgid "" ++"It appears that you are trying to flash an image that does not fit into the " ++"flash memory, please verify the image file!" ++msgstr "" ++"Φαίνεται πως Ï€Ïοσπαθείτε να φλασάÏετε μια εικόνα που δεν χωÏάει στην μνήμη " ++"flash, παÏακαλώ επιβεβαιώστε το αÏχείο εικόνας!" ++ ++msgid "Java Script required!" ++msgstr "Απαιτείται Javascript!" ++ ++msgid "Join Network" ++msgstr "" ++ ++msgid "Join Network: Settings" ++msgstr "" ++ ++msgid "Join Network: Wireless Scan" ++msgstr "" ++ ++msgid "Keep settings" ++msgstr "ΔιατήÏηση Ïυθμίσεων" ++ ++msgid "Kernel Log" ++msgstr "ΚαταγÏαφή ΠυÏήνα" ++ ++msgid "Kernel Version" ++msgstr "Έκδοση ΠυÏήνα" ++ ++msgid "Key" ++msgstr "Κλειδί" ++ ++msgid "Key #%d" ++msgstr "Κλειδί #%d" ++ ++msgid "Kill" ++msgstr "Σκότωμα" ++ ++msgid "L2TP" ++msgstr "" ++ ++msgid "L2TP Server" ++msgstr "" ++ ++msgid "LCP echo failure threshold" ++msgstr "" ++ ++msgid "LCP echo interval" ++msgstr "" ++ ++msgid "LLC" ++msgstr "LLC" ++ ++msgid "Label" ++msgstr "Ετικέτα" ++ ++msgid "Language" ++msgstr "Γλώσσα" ++ ++msgid "Language and Style" ++msgstr "" ++ ++msgid "Leaf" ++msgstr "" ++ ++msgid "Lease validity time" ++msgstr "" ++ ++msgid "Leasefile" ++msgstr "ΑÏχείο Leases" ++ ++msgid "Leasetime" ++msgstr "ΧÏόνος Lease" ++ ++msgid "Leasetime remaining" ++msgstr "Υπόλοιπο χÏόνου Lease" ++ ++msgid "Leave empty to autodetect" ++msgstr "Αφήστε το κενό για να γίνει αυτόματη ανίχνευση" ++ ++msgid "Leave empty to use the current WAN address" ++msgstr "Αφήστε το κενό για να γίνει χÏήση της Ï„Ïέχουσας διεÏθυνσης WAN" ++ ++msgid "Legend:" ++msgstr "Υπόμνημα:" ++ ++msgid "Limit" ++msgstr "ÎŒÏιο" ++ ++msgid "Line Attenuation" ++msgstr "" ++ ++msgid "Line Speed" ++msgstr "" ++ ++msgid "Line State" ++msgstr "" ++ ++msgid "Link On" ++msgstr "Αναμμένο με ΖεÏξη" ++ ++msgid "" ++"List of DNS servers to forward " ++"requests to" ++msgstr "" ++ ++msgid "List of domains to allow RFC1918 responses for" ++msgstr "" ++ ++msgid "List of hosts that supply bogus NX domain results" ++msgstr "" ++ ++msgid "Listen only on the given interface or, if unspecified, on all" ++msgstr "" ++ ++msgid "Listening port for inbound DNS queries" ++msgstr "" ++ ++msgid "Load" ++msgstr "ΦόÏτος" ++ ++msgid "Load Average" ++msgstr "Μέσος ÏŒÏος φόÏτου" ++ ++msgid "Loading" ++msgstr "ΦόÏτωση" ++ ++msgid "Local IPv4 address" ++msgstr "Τοπική διεÏθυνση IPv4" ++ ++msgid "Local IPv6 address" ++msgstr "Τοπική διεÏθυνση IPv6" ++ ++msgid "Local Startup" ++msgstr "" ++ ++msgid "Local Time" ++msgstr "Τοπική ÎÏα" ++ ++msgid "Local domain" ++msgstr "" ++ ++msgid "" ++"Local domain specification. Names matching this domain are never forwarded " ++"and are resolved from DHCP or hosts files only" ++msgstr "" ++ ++msgid "Local domain suffix appended to DHCP names and hosts file entries" ++msgstr "" ++ ++msgid "Local server" ++msgstr "Τοπικός εξυπηÏετητής" ++ ++msgid "" ++"Localise hostname depending on the requesting subnet if multiple IPs are " ++"available" ++msgstr "" ++ ++msgid "Localise queries" ++msgstr "Τοπικά εÏωτήματα" ++ ++msgid "Locked to channel %d used by: %s" ++msgstr "" ++ ++msgid "Log output level" ++msgstr "Επίπεδο εξόδου αÏχείων καταγÏαφής" ++ ++msgid "Log queries" ++msgstr "ΚαταγÏαφή εÏωτημάτων" ++ ++msgid "Logging" ++msgstr "ΚαταγÏαφή" ++ ++msgid "Login" ++msgstr "ΣÏνδεση" ++ ++msgid "Logout" ++msgstr "ΑποσÏνδεση" ++ ++msgid "Lowest leased address as offset from the network address." ++msgstr "" ++ ++msgid "MAC-Address" ++msgstr "MAC-ΔιεÏθυνση" ++ ++msgid "MAC-Address Filter" ++msgstr "ΦίλτÏο MAC ΔιευθÏνσεων" ++ ++msgid "MAC-Filter" ++msgstr "MAC-ΦίλτÏο" ++ ++msgid "MAC-List" ++msgstr "Λίστα MAC" ++ ++msgid "MB/s" ++msgstr "" ++ ++msgid "MHz" ++msgstr "" ++ ++msgid "MTU" ++msgstr "MTU" ++ ++msgid "" ++"Make sure to clone the root filesystem using something like the commands " ++"below:" ++msgstr "" ++ ++msgid "Maximum Rate" ++msgstr "Μέγιστος Ρυθμός" ++ ++msgid "Maximum allowed number of active DHCP leases" ++msgstr "Μέγιστος επιτÏεπόμενος αÏιθμός ενεÏγών DHCP leases" ++ ++msgid "Maximum allowed number of concurrent DNS queries" ++msgstr "Μέγιστος επιτÏεπόμενος αÏιθμός ταυτόχÏονων εÏωτημάτων DNS" ++ ++msgid "Maximum allowed size of EDNS.0 UDP packets" ++msgstr "Μέγιστο επιτÏεπόμενο μέγεθος EDNS.0 UDP πακέτων" ++ ++msgid "Maximum amount of seconds to wait for the modem to become ready" ++msgstr "" ++"Μέγιστος αÏιθμός δευτεÏολέπτων αναμονής ώστε το modem να καταστεί έτοιμο" ++ ++msgid "Maximum hold time" ++msgstr "Μέγιστος χÏόνος κÏάτησης" ++ ++msgid "Maximum number of leased addresses." ++msgstr "Μέγιστος αÏιθμός διευθÏνσεων lease" ++ ++msgid "Mbit/s" ++msgstr "" ++ ++msgid "Memory" ++msgstr "Μνήμη" ++ ++msgid "Memory usage (%)" ++msgstr "ΧÏήση Μνήμης (%)" ++ ++msgid "Metric" ++msgstr "ΜέτÏο" ++ ++msgid "Minimum Rate" ++msgstr "Ελάχιστος Ρυθμός" ++ ++msgid "Minimum hold time" ++msgstr "Ελάχιστος χÏόνος κÏάτησης" ++ ++msgid "Mirror monitor port" ++msgstr "" ++ ++msgid "Mirror source port" ++msgstr "" ++ ++msgid "Missing protocol extension for proto %q" ++msgstr "" ++ ++msgid "Mode" ++msgstr "ΛειτουÏγία" ++ ++msgid "Model" ++msgstr "" ++ ++msgid "Modem device" ++msgstr "Συσκευή Modem" ++ ++msgid "Modem init timeout" ++msgstr "" ++ ++msgid "Monitor" ++msgstr "ΠαÏακολοÏθηση" ++ ++#, fuzzy ++msgid "Mount Entry" ++msgstr "ΠÏοσάÏτηση" ++ ++msgid "Mount Point" ++msgstr "Σημείο ΠÏοσάÏτησης" ++ ++msgid "Mount Points" ++msgstr "Σημεία ΠÏοσάÏτησης" ++ ++msgid "Mount Points - Mount Entry" ++msgstr "Σημεία ΠÏοσάÏτησης - Είσοδος ΠÏοσάÏτησης" ++ ++msgid "Mount Points - Swap Entry" ++msgstr "" ++ ++msgid "" ++"Mount Points define at which point a memory device will be attached to the " ++"filesystem" ++msgstr "" ++"Τα σημεία Ï€ÏοσάÏτησης οÏίζουν σε ποιο σημείο στο σÏστημα αÏχείων θα " ++"Ï€ÏοσαÏτηθεί μία συσκευή μνήμης" ++ ++msgid "Mount options" ++msgstr "Επιλογές Ï€ÏοσάÏτησης" ++ ++msgid "Mount point" ++msgstr "Σημείο Ï€ÏοσάÏτησης" ++ ++msgid "Mounted file systems" ++msgstr "ΠÏοσαÏτημένα συστήματα αÏχείων" ++ ++msgid "Move down" ++msgstr "Μετακίνηση κάτω" ++ ++msgid "Move up" ++msgstr "Μετακίνηση πάνω" ++ ++msgid "Multicast Rate" ++msgstr "Ρυθμός Multicast" ++ ++msgid "Multicast address" ++msgstr "ΔιεÏθυνση Multicast" ++ ++msgid "NAS ID" ++msgstr "NAS ID" ++ ++msgid "NDP-Proxy" ++msgstr "" ++ ++msgid "NTP server candidates" ++msgstr "" ++ ++msgid "NTP sync time-out" ++msgstr "" ++ ++msgid "Name" ++msgstr "Όνομα" ++ ++msgid "Name of the new interface" ++msgstr "Όνομα νέας διεπαφής" ++ ++msgid "Name of the new network" ++msgstr "Όνομα νέου δικτÏου" ++ ++msgid "Navigation" ++msgstr "Πλοήγηση" ++ ++msgid "Netmask" ++msgstr "Μάσκα δικτÏου" ++ ++msgid "Network" ++msgstr "Δίκτυο" ++ ++msgid "Network Utilities" ++msgstr "ΕÏγαλεία ΔικτÏου" ++ ++msgid "Network boot image" ++msgstr "" ++ ++msgid "Network without interfaces." ++msgstr "" ++ ++msgid "Next »" ++msgstr "Επόμενο »" ++ ++msgid "No DHCP Server configured for this interface" ++msgstr "Δεν υπάÏχει Ïυθμισμένος DHCP εξυπηÏετητής για αυτή τη διεπαφή" ++ ++msgid "No chains in this table" ++msgstr "Δεν υπάÏχουν αλυσίδες σε αυτόν τον πίνακα" ++ ++msgid "No files found" ++msgstr "Δε βÏέθηκαν αÏχεία" ++ ++msgid "No information available" ++msgstr "Δεν υπάÏχουν πληÏοφοÏίες διαθέσιμες" ++ ++msgid "No negative cache" ++msgstr "" ++ ++msgid "No network configured on this device" ++msgstr "Δεν υπάÏχει παÏαμετÏοποιημένο δίκτυο σε αυτή τη συσκευή" ++ ++msgid "No network name specified" ++msgstr "Δεν έχει οÏιστεί όνομα δικτÏου" ++ ++msgid "No package lists available" ++msgstr "Δεν υπάÏχουν διαθέσιμες λίστες πακέτων" ++ ++msgid "No password set!" ++msgstr "Δεν έχει οÏιστεί κωδικός Ï€Ïόσβασης!" ++ ++msgid "No rules in this chain" ++msgstr "Δεν υπάÏχει κανόνας σε αυτή την αλυσίδα" ++ ++msgid "No zone assigned" ++msgstr "Δεν έχει ανατεθεί ζώνη" ++ ++msgid "Noise" ++msgstr "ΘόÏυβος" ++ ++msgid "Noise Margin" ++msgstr "" ++ ++msgid "Noise:" ++msgstr "ΘόÏυβος:" ++ ++msgid "None" ++msgstr "Κανένα" ++ ++msgid "Normal" ++msgstr "Φυσιολογικό" ++ ++msgid "Not Found" ++msgstr "" ++ ++msgid "Not associated" ++msgstr "" ++ ++msgid "Not connected" ++msgstr "" ++ ++msgid "Note: Configuration files will be erased." ++msgstr "Σημείωση: Τα αÏχεία παÏαμετÏοποίησης θα διαγÏαφοÏν." ++ ++msgid "Notice" ++msgstr "Επισήμανση" ++ ++msgid "Nslookup" ++msgstr "" ++ ++msgid "OK" ++msgstr "Εντάξει" ++ ++msgid "OPKG-Configuration" ++msgstr "ΠαÏαμετÏοποίηση OPKG" ++ ++msgid "Off-State Delay" ++msgstr "" ++ ++msgid "" ++"On this page you can configure the network interfaces. You can bridge " ++"several interfaces by ticking the \"bridge interfaces\" field and enter the " ++"names of several network interfaces separated by spaces. You can also use " ++"VLAN notation " ++"INTERFACE.VLANNR (e.g.: " ++"eth0.1)." ++msgstr "" ++"Σε αυτή τη σελίδα μποÏείτε να Ïυθμίσετε τις διεπαφές δικτÏου. ΜποÏείτε να " ++"γεφυÏώσετε πολλαπλές διεπαφές τικάÏοντας το πεδίο \"γεφÏÏωμα διεπαφών\" και " ++"εισάγοντας τα ονόματα των διεπαφών δικτÏου χωÏισμένα με κενά. ΜποÏείτε " ++"επίσης να χÏησιμοποιήσετε παÏάσταση Ï„Ïπου VLAN INTERFACE.VLANNR (Ï€.χ.: eth0.1)." ++ ++msgid "On-State Delay" ++msgstr "" ++ ++msgid "One of hostname or mac address must be specified!" ++msgstr "" ++ ++msgid "One or more fields contain invalid values!" ++msgstr "Ένα ή πεÏισσότεÏα πεδία πεÏιέχουν μη έγκυÏες τιμές!" ++ ++msgid "One or more required fields have no value!" ++msgstr "Ένα ή πεÏισσότεÏα πεδία δεν πεÏιέχουν τιμές!" ++ ++msgid "Open list..." ++msgstr "" ++ ++msgid "OpenConnect (CISCO AnyConnect)" ++msgstr "" ++ ++msgid "Operating frequency" ++msgstr "" ++ ++msgid "Option changed" ++msgstr "Η επιλογή άλλαξε" ++ ++msgid "Option removed" ++msgstr "Η επιλογή αφαιÏέθηκε" ++ ++msgid "Optional, specify to override default server (tic.sixxs.net)" ++msgstr "" ++ ++msgid "Optional, use when the SIXXS account has more than one tunnel" ++msgstr "" ++ ++msgid "Options" ++msgstr "Επιλογές" ++ ++msgid "Other:" ++msgstr "" ++ ++msgid "Out" ++msgstr "Έξοδος" ++ ++msgid "Outbound:" ++msgstr "" ++ ++msgid "Outdoor Channels" ++msgstr "ΕξωτεÏικά Κανάλια" ++ ++msgid "Output Interface" ++msgstr "" ++ ++msgid "Override MAC address" ++msgstr "" ++ ++msgid "Override MTU" ++msgstr "" ++ ++msgid "Override the gateway in DHCP responses" ++msgstr "" ++ ++msgid "" ++"Override the netmask sent to clients. Normally it is calculated from the " ++"subnet that is served." ++msgstr "" ++ ++msgid "Override the table used for internal routes" ++msgstr "" ++ ++msgid "Overview" ++msgstr "Επισκόπηση" ++ ++msgid "Owner" ++msgstr "Κάτοχος" ++ ++msgid "PAP/CHAP password" ++msgstr "" ++ ++msgid "PAP/CHAP username" ++msgstr "" ++ ++msgid "PID" ++msgstr "PID" ++ ++msgid "PIN" ++msgstr "PIN" ++ ++msgid "PPP" ++msgstr "PPP" ++ ++msgid "PPPoA Encapsulation" ++msgstr "Ενθυλάκωση PPPoA" ++ ++msgid "PPPoATM" ++msgstr "PPPoATM" ++ ++msgid "PPPoE" ++msgstr "PPPoE" ++ ++msgid "PPtP" ++msgstr "PPtP" ++ ++msgid "Package libiwinfo required!" ++msgstr "Απαιτείται το πακέτο libiwinfo!" ++ ++msgid "Package lists are older than 24 hours" ++msgstr "Οι λίστες πακέτων έχουν να ανανεωθοÏν πάνω από 24 ÏŽÏες" ++ ++msgid "Package name" ++msgstr "Όνομα πακέτου" ++ ++msgid "Packets" ++msgstr "Πακέτα" ++ ++msgid "Part of zone %q" ++msgstr "ΜέÏος της ζώνης %q" ++ ++msgid "Password" ++msgstr "Κωδικός ΠÏόσβασης" ++ ++msgid "Password authentication" ++msgstr "Εξουσιοδότηση με κωδικό Ï€Ïόσβασης" ++ ++msgid "Password of Private Key" ++msgstr "Κωδικός ΠÏόσβασης του Î™Î´Î¹Ï‰Ï„Î¹ÎºÎ¿Ï ÎšÎ»ÎµÎ¹Î´Î¹Î¿Ï" ++ ++msgid "Password successfully changed!" ++msgstr "Ο κωδικός Ï€Ïόσβασης άλλαξε επιτυχώς!" ++ ++msgid "Path" ++msgstr "ΔιαδÏομή" ++ ++msgid "Path to CA-Certificate" ++msgstr "ΔιαδÏομή για Πιστοποιητικό CA" ++ ++msgid "Path to Client-Certificate" ++msgstr "ΔιαδÏομή για Πιστοποιητικό-Πελάτη" ++ ++msgid "Path to Private Key" ++msgstr "ΔιαδÏομή για Ιδιωτικό Κλειδί" ++ ++msgid "Path to executable which handles the button event" ++msgstr "ΔιαδÏομή για το εκτελέσιμο που χειÏίζεται το γεγονός του κουμπιοÏ" ++ ++msgid "Peak:" ++msgstr "" ++ ++msgid "Perform reboot" ++msgstr "Εκτέλεση επανεκκίνησης" ++ ++msgid "Perform reset" ++msgstr "ΔιενέÏγεια αÏχικοποίησης" ++ ++msgid "Phy Rate:" ++msgstr "" ++ ++msgid "Physical Settings" ++msgstr "" ++ ++msgid "Ping" ++msgstr "" ++ ++msgid "Pkts." ++msgstr "Πκτ." ++ ++msgid "Please enter your username and password." ++msgstr "ΠαÏακαλώ εισάγετε όνομα χÏήστη και κωδικό Ï€Ïόσβασης." ++ ++msgid "Please wait: Device rebooting..." ++msgstr "ΠαÏακαλώ πεÏιμένετε: Η συσκευή επανεκκινεί..." ++ ++msgid "Policy" ++msgstr "Πολιτική" ++ ++msgid "Port" ++msgstr "ΘÏÏα" ++ ++msgid "Port %d" ++msgstr "ΘÏÏα %d" ++ ++msgid "Port %d is untagged in multiple VLANs!" ++msgstr "" ++ ++msgid "Port status:" ++msgstr "" ++ ++msgid "" ++"Presume peer to be dead after given amount of LCP echo failures, use 0 to " ++"ignore failures" ++msgstr "" ++ ++#, fuzzy ++msgid "Prevents client-to-client communication" ++msgstr "ΑποτÏέπει την επικοινωνία Î¼ÎµÏ„Î±Î¾Ï Ï€ÎµÎ»Î±Ï„ÏŽÎ½" ++ ++msgid "Prism2/2.5/3 802.11b Wireless Controller" ++msgstr "" ++ ++msgid "Proceed" ++msgstr "Συνέχεια" ++ ++msgid "Processes" ++msgstr "ΕÏγασίες" ++ ++msgid "Prot." ++msgstr "ΠÏωτ." ++ ++msgid "Protocol" ++msgstr "ΠÏωτόκολλο" ++ ++msgid "Protocol family" ++msgstr "Οικογένεια Ï€Ïωτοκόλλου" ++ ++msgid "Protocol of the new interface" ++msgstr "ΠÏωτόκολλο νέας διεπαφής" ++ ++msgid "Protocol support is not installed" ++msgstr "Η υποστήÏιξη Ï€Ïωτοκόλλου δεν έχει εκγατασταθεί" ++ ++msgid "Provide NTP server" ++msgstr "" ++ ++msgid "Provide new network" ++msgstr "" ++ ++msgid "Pseudo Ad-Hoc (ahdemo)" ++msgstr "Ψευδό Ad-Hoc (ahdemo)" ++ ++msgid "Public prefix routed to this device for distribution to clients." ++msgstr "" ++ ++msgid "Quality" ++msgstr "" ++ ++msgid "RTS/CTS Threshold" ++msgstr "ÎŒÏιο RTS/CTS" ++ ++msgid "RX" ++msgstr "RX" ++ ++msgid "RX Rate" ++msgstr "" ++ ++msgid "RaLink 802.11%s Wireless Controller" ++msgstr "" ++ ++msgid "Radius-Accounting-Port" ++msgstr "" ++ ++msgid "Radius-Accounting-Secret" ++msgstr "" ++ ++msgid "Radius-Accounting-Server" ++msgstr "" ++ ++msgid "Radius-Authentication-Port" ++msgstr "" ++ ++msgid "Radius-Authentication-Secret" ++msgstr "" ++ ++msgid "Radius-Authentication-Server" ++msgstr "" ++ ++msgid "" ++"Read /etc/ethers to configure the DHCP-Server" ++msgstr "" ++"Διάβασμα του /etc/ethers για την παÏαμετÏοποίηση του " ++"εξυπηÏετητή DHCP" ++ ++msgid "" ++"Really delete this interface? The deletion cannot be undone!\\nYou might " ++"lose access to this device if you are connected via this interface." ++msgstr "" ++ ++msgid "" ++"Really delete this wireless network? The deletion cannot be undone!\\nYou " ++"might lose access to this device if you are connected via this network." ++msgstr "" ++ ++msgid "Really reset all changes?" ++msgstr "ΑÏχικοποίηση όλων των αλλαγών;" ++ ++msgid "" ++"Really shut down network?\\nYou might lose access to this device if you are " ++"connected via this interface." ++msgstr "" ++ ++msgid "" ++"Really shutdown interface \"%s\" ?\\nYou might lose access to this device if " ++"you are connected via this interface." ++msgstr "" ++ ++msgid "Really switch protocol?" ++msgstr "Αλλαγή Ï€Ïωτοκόλλου;" ++ ++msgid "Realtime Connections" ++msgstr "Συνδέσεις Ï€ÏÎ±Î³Î¼Î±Ï„Î¹ÎºÎ¿Ï Ï‡Ïόνου" ++ ++msgid "Realtime Graphs" ++msgstr "ΓÏαφήματα Ï€ÏÎ±Î³Î¼Î±Ï„Î¹ÎºÎ¿Ï Ï‡Ïόνου" ++ ++msgid "Realtime Load" ++msgstr "" ++ ++msgid "Realtime Traffic" ++msgstr "Κίνηση Ï€ÏÎ±Î³Î¼Î±Ï„Î¹ÎºÎ¿Ï Ï‡Ïόνου" ++ ++msgid "Realtime Wireless" ++msgstr "" ++ ++msgid "Rebind protection" ++msgstr "" ++ ++msgid "Reboot" ++msgstr "Επανεκκίνηση" ++ ++msgid "Rebooting..." ++msgstr "Επανεκκίνηση..." ++ ++msgid "Reboots the operating system of your device" ++msgstr "Επανεκκίνηση του λειτουÏÎ³Î¹ÎºÎ¿Ï ÏƒÏ…ÏƒÏ„Î®Î¼Î±Ï„Î¿Ï‚ της συσκευής σας" ++ ++msgid "Receive" ++msgstr "Λήψη" ++ ++msgid "Receiver Antenna" ++msgstr "ΚεÏαία Λήψης" ++ ++msgid "Reconnect this interface" ++msgstr "ΕπανασÏνδεση της διεπαφής" ++ ++msgid "Reconnecting interface" ++msgstr "ΕπανασÏνδεση της διεπαφής" ++ ++msgid "References" ++msgstr "ΑναφοÏές" ++ ++msgid "Regulatory Domain" ++msgstr "Ρυθμιστική ΠεÏιοχή" ++ ++msgid "Relay" ++msgstr "" ++ ++msgid "Relay Bridge" ++msgstr "" ++ ++msgid "Relay between networks" ++msgstr "" ++ ++msgid "Relay bridge" ++msgstr "" ++ ++msgid "Remote IPv4 address" ++msgstr "ΑπομακÏυσμένη διεÏθυνση IPv4" ++ ++msgid "Remove" ++msgstr "ΑφαίÏεση" ++ ++msgid "Repeat scan" ++msgstr "Επανάληψη σάÏωσης" ++ ++msgid "Replace entry" ++msgstr "Αντικατάσταση καταχώÏησης" ++ ++msgid "Replace wireless configuration" ++msgstr "Αντικατάσταση Ïυθμίσεων ασÏÏματης σÏνδεσης" ++ ++msgid "Request IPv6-address" ++msgstr "" ++ ++msgid "Request IPv6-prefix of length" ++msgstr "" ++ ++msgid "Require TLS" ++msgstr "" ++ ++msgid "Required for certain ISPs, e.g. Charter with DOCSIS 3" ++msgstr "" ++ ++msgid "Reset" ++msgstr "ΑÏχικοποίηση" ++ ++msgid "Reset Counters" ++msgstr "ΑÏχικοποίηση ΜετÏητών" ++ ++msgid "Reset to defaults" ++msgstr "ΑÏχικοποίηση στις Ï€Ïοεπιλεγμένες τιμές" ++ ++msgid "Resolv and Hosts Files" ++msgstr "ΑÏχεία Resolv και Hosts" ++ ++msgid "Resolve file" ++msgstr "ΑÏχείο Resolve" ++ ++msgid "Restart" ++msgstr "Επανεκκίνηση" ++ ++msgid "Restart Firewall" ++msgstr "Επανεκκίνηση Τείχους ΠÏοστασίας" ++ ++msgid "Restore backup" ++msgstr "ΕπαναφοÏά αντιγÏάφου ασφαλείας" ++ ++msgid "Reveal/hide password" ++msgstr "" ++ ++msgid "Revert" ++msgstr "ΑναίÏεση" ++ ++msgid "Root" ++msgstr "Root" ++ ++msgid "Root directory for files served via TFTP" ++msgstr "Κατάλογος Root για αÏχεία που σεÏβίÏονται μέσω TFTP" ++ ++msgid "Root preparation" ++msgstr "" ++ ++msgid "Routed IPv6 prefix for downstream interfaces" ++msgstr "" ++ ++msgid "Router Advertisement-Service" ++msgstr "" ++ ++msgid "Router Password" ++msgstr "Κωδικός ΠÏόσβασης ΔÏομολογητή" ++ ++#, fuzzy ++msgid "Routes" ++msgstr "ΔιαδÏομές" ++ ++msgid "" ++"Routes specify over which interface and gateway a certain host or network " ++"can be reached." ++msgstr "" ++"Οι διαδÏομές οÏίζουν τη διεπαφή και Ï€Ïλη από την οποία κάποιος υπολογιστής ή " ++"δίκτυο μποÏεί να είναι Ï€Ïοσβάσιμο/Ï‚." ++ ++msgid "Rule #" ++msgstr "Κανόνας #" ++ ++msgid "Run a filesystem check before mounting the device" ++msgstr "Εκτέλεση ελέγχου του συστήματος αÏχείων Ï€Ïιν Ï€ÏοσαÏτηθεί η συσκευή" ++ ++msgid "Run filesystem check" ++msgstr "Εκτέλεση ελέγχου συστήματος αÏχείων" ++ ++msgid "" ++"SIXXS supports TIC only, for static tunnels using IP protocol 41 (RFC4213) " ++"use 6in4 instead" ++msgstr "" ++ ++msgid "SIXXS-handle[/Tunnel-ID]" ++msgstr "" ++ ++msgid "SSH Access" ++msgstr "ΠÏόσβαση SSH" ++ ++msgid "SSH-Keys" ++msgstr "Κλειδιά SSH" ++ ++msgid "SSID" ++msgstr "SSID" ++ ++msgid "Save" ++msgstr "Αποθήκευση" ++ ++msgid "Save & Apply" ++msgstr "Αποθήκευση & ΕφαÏμογή" ++ ++msgid "Save & Apply" ++msgstr "Αποθήκευση & ΕφαÏμογή" ++ ++msgid "Scan" ++msgstr "ΣάÏωση" ++ ++msgid "Scheduled Tasks" ++msgstr "ΠÏογÏαμματισμένες ΕÏγασίες" ++ ++msgid "Section added" ++msgstr "" ++ ++msgid "Section removed" ++msgstr "" ++ ++msgid "See \"mount\" manpage for details" ++msgstr "Δείτε το manpage του \"mount\" για λεπτομέÏειες" ++ ++msgid "" ++"Send LCP echo requests at the given interval in seconds, only effective in " ++"conjunction with failure threshold" ++msgstr "" ++ ++#, fuzzy ++msgid "Separate Clients" ++msgstr "Απομόνωση Πελατών" ++ ++msgid "Separate WDS" ++msgstr "ΞεχωÏιστά WDS" ++ ++msgid "Server Settings" ++msgstr "Ρυθμίσεις ΕξυπηÏετητή" ++ ++msgid "Server password" ++msgstr "" ++ ++msgid "" ++"Server password, enter the specific password of the tunnel when the username " ++"contains the tunnel ID" ++msgstr "" ++ ++msgid "Server username" ++msgstr "" ++ ++msgid "Service Name" ++msgstr "Όνομα ΥπηÏεσίας" ++ ++msgid "Service Type" ++msgstr "Είδος ΥπηÏεσίας" ++ ++msgid "Services" ++msgstr "ΥπηÏεσίες" ++ ++msgid "Set up Time Synchronization" ++msgstr "" ++ ++msgid "Setup DHCP Server" ++msgstr "ΡÏθμιση ΕξυπηÏετητή DHCP" ++ ++msgid "Show current backup file list" ++msgstr "" ++ ++msgid "Shutdown this interface" ++msgstr "ΑπενεÏγοποίηση αυτής της διεπαφής" ++ ++msgid "Shutdown this network" ++msgstr "ΑπενεÏγοποίηση Î±Ï…Ï„Î¿Ï Ï„Î¿Ï… δικτÏου" ++ ++msgid "Signal" ++msgstr "Σήμα" ++ ++msgid "Signal:" ++msgstr "Σήμα:" ++ ++msgid "Size" ++msgstr "Μέγεθος" ++ ++msgid "Skip" ++msgstr "ΠαÏάκαμψη" ++ ++msgid "Skip to content" ++msgstr "ΠαÏάκαμψη σε πεÏιεχόμενο" ++ ++msgid "Skip to navigation" ++msgstr "ΠαÏάκαμψη σε πλοήγηση" ++ ++msgid "Slot time" ++msgstr "" ++ ++msgid "Software" ++msgstr "Λογισμικό" ++ ++msgid "Some fields are invalid, cannot save values!" ++msgstr "Κάποια πεδία δεν είναι έγκυÏα, δεν μποÏοÏν να αποθηκευτοÏν οι τιμές!" ++ ++msgid "Sorry, the object you requested was not found." ++msgstr "" ++ ++msgid "Sorry, the server encountered an unexpected error." ++msgstr "" ++ ++msgid "" ++"Sorry, there is no sysupgrade support present; a new firmware image must be " ++"flashed manually. Please refer to the OpenWrt wiki for device specific " ++"install instructions." ++msgstr "" ++ ++msgid "Sort" ++msgstr "Ταξινόμηση" ++ ++msgid "Source" ++msgstr "Πηγή" ++ ++msgid "Source routing" ++msgstr "" ++ ++msgid "Specifies the button state to handle" ++msgstr "" ++ ++msgid "Specifies the directory the device is attached to" ++msgstr "" ++ ++#, fuzzy ++msgid "Specifies the listening port of this Dropbear instance" ++msgstr "" ++"ΠÏοσδιοÏίζει την θÏÏα ακÏόασης Î±Ï…Ï„Î¿Ï Ï„Î¿Ï… στιγμιοτÏπου Dropbear" ++ ++msgid "" ++"Specifies the maximum amount of failed ARP requests until hosts are presumed " ++"to be dead" ++msgstr "" ++ ++msgid "" ++"Specifies the maximum amount of seconds after which hosts are presumed to be " ++"dead" ++msgstr "" ++ ++msgid "Specify the secret encryption key here." ++msgstr "ΟÏίστε το κÏυφό κλειδί κÏυπτογÏάφησης." ++ ++msgid "Start" ++msgstr "ΑÏχή" ++ ++msgid "Start priority" ++msgstr "ΠÏοτεÏαιότητα εκκίνησης" ++ ++msgid "Startup" ++msgstr "Εκκίνηση" ++ ++msgid "Static IPv4 Routes" ++msgstr "Στατικές ΔιαδÏομές IPv4" ++ ++msgid "Static IPv6 Routes" ++msgstr "Στατικές ΔιαδÏομές IPv6" ++ ++msgid "Static Leases" ++msgstr "Στατικά Leases" ++ ++msgid "Static Routes" ++msgstr "Στατικές ΔιαδÏομές" ++ ++msgid "Static WDS" ++msgstr "" ++ ++msgid "Static address" ++msgstr "Στατική διεÏθυνση" ++ ++msgid "" ++"Static leases are used to assign fixed IP addresses and symbolic hostnames " ++"to DHCP clients. They are also required for non-dynamic interface " ++"configurations where only hosts with a corresponding lease are served." ++msgstr "" ++ ++msgid "Status" ++msgstr "Κατάσταση" ++ ++msgid "Stop" ++msgstr "" ++ ++msgid "Strict order" ++msgstr "ΑυστηÏή σειÏά" ++ ++msgid "Submit" ++msgstr "Υποβολή" ++ ++msgid "Swap" ++msgstr "" ++ ++msgid "Swap Entry" ++msgstr "" ++ ++msgid "Switch" ++msgstr "Switch" ++ ++msgid "Switch %q" ++msgstr "" ++ ++msgid "Switch %q (%s)" ++msgstr "" ++ ++msgid "Switch protocol" ++msgstr "" ++ ++msgid "Sync with browser" ++msgstr "" ++ ++msgid "Synchronizing..." ++msgstr "ΣυγχÏονισμός..." ++ ++msgid "System" ++msgstr "ΣÏστημα" ++ ++msgid "System Log" ++msgstr "ΚαταγÏαφή Συστήματος" ++ ++msgid "System Properties" ++msgstr "Ιδιότητες Συστήματος" ++ ++msgid "System log buffer size" ++msgstr "" ++ ++msgid "TCP:" ++msgstr "TCP:" ++ ++msgid "TFTP Settings" ++msgstr "Ρυθμίσεις TFTP" ++ ++msgid "TFTP server root" ++msgstr "" ++ ++msgid "TX" ++msgstr "TX" ++ ++msgid "TX Rate" ++msgstr "" ++ ++msgid "Table" ++msgstr "Πίνακας" ++ ++msgid "Target" ++msgstr "Στόχος" ++ ++msgid "Terminate" ++msgstr "ΤεÏματισμός" ++ ++msgid "" ++"The Device Configuration section covers physical settings of the " ++"radio hardware such as channel, transmit power or antenna selection which " ++"are shared among all defined wireless networks (if the radio hardware is " ++"multi-SSID capable). Per network settings like encryption or operation mode " ++"are grouped in the Interface Configuration." ++msgstr "" ++ ++msgid "" ++"The libiwinfo-lua package is not installed. You must install this " ++"component for working wireless configuration!" ++msgstr "" ++ ++msgid "" ++"The HE.net endpoint update configuration changed, you must now use the plain " ++"username instead of the user ID!" ++msgstr "" ++ ++msgid "" ++"The IPv6 prefix assigned to the provider, usually ends with ::" ++msgstr "" ++ ++msgid "" ++"The allowed characters are: A-Z, a-z, 0-9 and _" ++msgstr "" ++"Οι επιτÏεπόμενοι χαÏακτήÏες είναι: A-Z, a-z, " ++"0-9 και _" ++ ++msgid "The configuration file could not be loaded due to the following error:" ++msgstr "" ++ ++msgid "" ++"The device file of the memory or partition (e.g." ++" /dev/sda1)" ++msgstr "" ++"Το αÏχείο συσκευής της μνήμης ή του διαμέÏισματος (Ï€.χ. /dev/sda1)" ++ ++msgid "" ++"The filesystem that was used to format the memory (e.g. ext3)" ++msgstr "" ++"Το σÏστημα αÏχείων που χÏησιμοποιήθηκε για διαμόÏφωση (Ï€.χ. ext3)" ++ ++msgid "" ++"The flash image was uploaded. Below is the checksum and file size listed, " ++"compare them with the original file to ensure data integrity.
    Click " ++"\"Proceed\" below to start the flash procedure." ++msgstr "" ++ ++msgid "The following changes have been committed" ++msgstr "Οι παÏακάτω αλλαγές έχουν υποβληθεί" ++ ++msgid "The following changes have been reverted" ++msgstr "Οι παÏακάτω αλλαγές έχουν αναιÏεθεί" ++ ++msgid "The following rules are currently active on this system." ++msgstr "Οι παÏακάτω κανόνες είναι αυτή τη στιγμή ενεÏγοί σε αυτό το σÏστημα." ++ ++msgid "The given network name is not unique" ++msgstr "Το παÏεχόμενο όνομα δικτÏου δεν είναι μοναδικό" ++ ++msgid "" ++"The hardware is not multi-SSID capable and the existing configuration will " ++"be replaced if you proceed." ++msgstr "" ++ ++msgid "" ++"The length of the IPv4 prefix in bits, the remainder is used in the IPv6 " ++"addresses." ++msgstr "" ++ ++msgid "The length of the IPv6 prefix in bits" ++msgstr "" ++ ++msgid "" ++"The network ports on this device can be combined to several VLANs in which computers can " ++"communicate directly with each other. VLANs are often used to separate different network " ++"segments. Often there is by default one Uplink port for a connection to the " ++"next greater network like the internet and other ports for a local network." ++msgstr "" ++ ++msgid "The selected protocol needs a device assigned" ++msgstr "" ++ ++msgid "" ++"The system is erasing the configuration partition now and will reboot itself " ++"when finished." ++msgstr "" ++ ++#, fuzzy ++msgid "" ++"The system is flashing now.
    DO NOT POWER OFF THE DEVICE!
    Wait a " ++"few minutes before you try to reconnect. It might be necessary to renew the " ++"address of your computer to reach the device again, depending on your " ++"settings." ++msgstr "" ++"Το σÏστημα φλασάÏετε Ï„ÏŽÏα.
    ΜΗ ΣΒΗΣΕΤΕ ΤΗΠΣΥΣΚΕΥΗ!
    ΠεÏιμένετε " ++"λίγα λεπτά για να δοκιμάσετε επανασÏνδεση. Ανάλογα με τις Ïυθμίσεις σας, " ++"είναι πιθανό να χÏειαστεί να ανανεώσετε την διεÏθυνση του υπολογιστή σας για " ++"να αποκτήσετε ξανά Ï€Ïόσβαση στη συσκευή." ++ ++msgid "" ++"The tunnel end-point is behind NAT, defaults to disabled and only applies to " ++"AYIYA" ++msgstr "" ++ ++msgid "" ++"The uploaded image file does not contain a supported format. Make sure that " ++"you choose the generic image format for your platform." ++msgstr "" ++"Η εικόνα που ανεβάσατε δεν πεÏιέχει κάποια υποστηÏιζόμενη μοÏφή. Βεβαιωθείτε " ++"ότι επιλέξατε την γενική μοÏφή εικόνας για την πλατφόÏμα σας." ++ ++msgid "There are no active leases." ++msgstr "Δεν υπάÏχουν ενεÏγά leases." ++ ++msgid "There are no pending changes to apply!" ++msgstr "" ++ ++msgid "There are no pending changes to revert!" ++msgstr "" ++ ++msgid "There are no pending changes!" ++msgstr "" ++ ++msgid "" ++"There is no device assigned yet, please attach a network device in the " ++"\"Physical Settings\" tab" ++msgstr "" ++ ++msgid "" ++"There is no password set on this router. Please configure a root password to " ++"protect the web interface and enable SSH." ++msgstr "" ++ ++msgid "This IPv4 address of the relay" ++msgstr "" ++ ++msgid "" ++"This is a list of shell glob patterns for matching files and directories to " ++"include during sysupgrade. Modified files in /etc/config/ and certain other " ++"configurations are automatically preserved." ++msgstr "" ++ ++msgid "" ++"This is either the \"Update Key\" configured for the tunnel or the account " ++"password if no update key has been configured" ++msgstr "" ++ ++msgid "" ++"This is the content of /etc/rc.local. Insert your own commands here (in " ++"front of 'exit 0') to execute them at the end of the boot process." ++msgstr "" ++ ++msgid "" ++"This is the local endpoint address assigned by the tunnel broker, it usually " ++"ends with :2" ++msgstr "" ++ ++msgid "" ++"This is the only DHCP in the local network" ++msgstr "" ++"Αυτός είναι ο μόνος DHCP στο τοπικό δίκτυο" ++ ++msgid "This is the plain username for logging into the account" ++msgstr "" ++ ++msgid "" ++"This is the prefix routed to you by the tunnel broker for use by clients" ++msgstr "" ++ ++msgid "This is the system crontab in which scheduled tasks can be defined." ++msgstr "" ++"Αυτό είναι το crontab του συστήματος στο οποίο μποÏοÏν να οÏιστοÏν " ++"Ï€ÏογÏαμματισμένες εÏγασίες." ++ ++msgid "" ++"This is usually the address of the nearest PoP operated by the tunnel broker" ++msgstr "" ++ ++msgid "" ++"This list gives an overview over currently running system processes and " ++"their status." ++msgstr "" ++"Αυτή η λίστα δίνει μία εικόνα των Ï„Ïέχοντων εÏγασιών συστήματος και της " ++"κατάστασής τους." ++ ++msgid "This page allows the configuration of custom button actions" ++msgstr "" ++ ++msgid "This page gives an overview over currently active network connections." ++msgstr "" ++"Αυτή η σελίδα δίνει μία εικόνα για τις Ï„Ïέχουσες ενεÏγές συνδέσεις δικτÏου." ++ ++msgid "This section contains no values yet" ++msgstr "Αυτό το τμήμα δεν πεÏιέχει τιμές ακόμη" ++ ++msgid "Time Synchronization" ++msgstr "" ++ ++msgid "Time Synchronization is not configured yet." ++msgstr "" ++ ++msgid "Timezone" ++msgstr "Ζώνη ÏŽÏας" ++ ++msgid "" ++"To restore configuration files, you can upload a previously generated backup " ++"archive here." ++msgstr "" ++ ++msgid "Total Available" ++msgstr "Διαθέσιμο Συνολικά" ++ ++msgid "Traceroute" ++msgstr "" ++ ++msgid "Traffic" ++msgstr "Κίνηση" ++ ++msgid "Transfer" ++msgstr "ΜεταφέÏθηκαν" ++ ++msgid "Transmission Rate" ++msgstr "Ρυθμός Εκπομπής" ++ ++msgid "Transmit" ++msgstr "Εκπομπή" ++ ++msgid "Transmit Power" ++msgstr "ΙσχÏÏ‚ Εκπομπής" ++ ++msgid "Transmitter Antenna" ++msgstr "ΚεÏαία Εκπομπής" ++ ++msgid "Trigger" ++msgstr "" ++ ++msgid "Trigger Mode" ++msgstr "" ++ ++msgid "Tunnel ID" ++msgstr "" ++ ++msgid "Tunnel Interface" ++msgstr "Διεπαφή ΤοÏνελ" ++ ++msgid "Tunnel Link" ++msgstr "" ++ ++msgid "Tunnel broker protocol" ++msgstr "" ++ ++msgid "Tunnel setup server" ++msgstr "" ++ ++msgid "Tunnel type" ++msgstr "" ++ ++msgid "Turbo Mode" ++msgstr "ΛειτουÏγία Turbo" ++ ++msgid "Tx-Power" ++msgstr "ΙσχÏÏ‚ Εκπομπής" ++ ++msgid "Type" ++msgstr "ΤÏπος" ++ ++msgid "UDP:" ++msgstr "UDP:" ++ ++msgid "UMTS only" ++msgstr "" ++ ++msgid "UMTS/GPRS/EV-DO" ++msgstr "UMTS/GPRS/EV-DO" ++ ++msgid "USB Device" ++msgstr "Συσκευή USB" ++ ++msgid "UUID" ++msgstr "UUID" ++ ++msgid "Unable to dispatch" ++msgstr "" ++ ++msgid "Unknown" ++msgstr "Άγνωστο" ++ ++msgid "Unknown Error, password not changed!" ++msgstr "Άγνωστο Λάθος. ο κωδικός Ï€Ïόσβασης δεν άλλαξε!" ++ ++msgid "Unmanaged" ++msgstr "" ++ ++msgid "Unsaved Changes" ++msgstr "Μη-αποθηκευμένες Αλλαγές" ++ ++msgid "Unsupported protocol type." ++msgstr "" ++ ++msgid "Update lists" ++msgstr "" ++ ++msgid "" ++"Upload a sysupgrade-compatible image here to replace the running firmware. " ++"Check \"Keep settings\" to retain the current configuration (requires an " ++"OpenWrt compatible firmware image)." ++msgstr "" ++ ++msgid "Upload archive..." ++msgstr "" ++ ++msgid "Uploaded File" ++msgstr "Το ΑÏχείο Ανέβηκε" ++ ++msgid "Uptime" ++msgstr "ΧÏόνος εν λειτουÏγία" ++ ++msgid "Use /etc/ethers" ++msgstr "ΧÏήση /etc/ethers" ++ ++msgid "Use DHCP gateway" ++msgstr "ΧÏήση Ï€Ïλης DHCP" ++ ++msgid "Use DNS servers advertised by peer" ++msgstr "" ++ ++msgid "Use ISO/IEC 3166 alpha2 country codes." ++msgstr "" ++ ++msgid "Use MTU on tunnel interface" ++msgstr "" ++ ++msgid "Use TTL on tunnel interface" ++msgstr "" ++ ++msgid "Use as external overlay (/overlay)" ++msgstr "" ++ ++msgid "Use as root filesystem (/)" ++msgstr "" ++ ++msgid "Use broadcast flag" ++msgstr "" ++ ++msgid "Use builtin IPv6-management" ++msgstr "" ++ ++msgid "Use custom DNS servers" ++msgstr "" ++ ++msgid "Use default gateway" ++msgstr "ΧÏήση Ï€Ïοεπιλεγμένης Ï€Ïλης" ++ ++msgid "Use gateway metric" ++msgstr "" ++ ++msgid "Use routing table" ++msgstr "" ++ ++msgid "" ++"Use the Add Button to add a new lease entry. The MAC-Address indentifies the host, the IPv4-Address specifies to the fixed " ++"address to use and the Hostname is assigned as symbolic name to the " ++"requesting host." ++msgstr "" ++ ++msgid "Used" ++msgstr "Σε χÏήση" ++ ++msgid "Used Key Slot" ++msgstr "ΧÏησιμοποιοÏμενη Υποδοχή ΚλειδιοÏ" ++ ++msgid "User certificate (PEM encoded)" ++msgstr "" ++ ++msgid "User key (PEM encoded)" ++msgstr "" ++ ++msgid "Username" ++msgstr "Όνομα ΧÏήστη" ++ ++msgid "VC-Mux" ++msgstr "" ++ ++msgid "VLAN Interface" ++msgstr "Διεπαφή VLAN" ++ ++msgid "VLANs on %q" ++msgstr "" ++ ++msgid "VLANs on %q (%s)" ++msgstr "" ++ ++msgid "VPN Server" ++msgstr "ΕξυπηÏετητής VPN" ++ ++msgid "VPN Server port" ++msgstr "" ++ ++msgid "VPN Server's certificate SHA1 hash" ++msgstr "" ++ ++msgid "Vendor Class to send when requesting DHCP" ++msgstr "" ++ ++msgid "Verbose" ++msgstr "" ++ ++msgid "Verbose logging by aiccu daemon" ++msgstr "" ++ ++msgid "Verify" ++msgstr "" ++ ++msgid "Version" ++msgstr "Έκδοση" ++ ++msgid "WDS" ++msgstr "WDS" ++ ++msgid "WEP Open System" ++msgstr "" ++ ++msgid "WEP Shared Key" ++msgstr "ΜοιÏαζόμενο κλειδί WEP" ++ ++msgid "WEP passphrase" ++msgstr "Κωδική φÏάση WEP" ++ ++msgid "WMM Mode" ++msgstr "ΥποστήÏιξη WMM" ++ ++msgid "WPA passphrase" ++msgstr "Κωδική φÏάση WPA" ++ ++msgid "" ++"WPA-Encryption requires wpa_supplicant (for client mode) or hostapd (for AP " ++"and ad-hoc mode) to be installed." ++msgstr "" ++ ++msgid "" ++"Wait for NTP sync that many seconds, seting to 0 disables waiting (optional)" ++msgstr "" ++ ++msgid "Waiting for changes to be applied..." ++msgstr "" ++ ++msgid "Waiting for command to complete..." ++msgstr "" ++ ++msgid "Warning" ++msgstr "ΠÏοειδοποίηση" ++ ++msgid "Warning: There are unsaved changes that will be lost while rebooting!" ++msgstr "" ++"ΠÏοειδοποίηση: ΥπάÏχουν μη-αποθηκευμένες αλλαγές που θα χαθοÏν κατά την " ++"επανεκκίνηση!" ++ ++msgid "Whether to create an IPv6 default route over the tunnel" ++msgstr "" ++ ++msgid "Whether to route only packets from delegated prefixes" ++msgstr "" ++ ++msgid "Width" ++msgstr "" ++ ++msgid "Wifi" ++msgstr "ΑσÏÏματο" ++ ++msgid "Wireless" ++msgstr "ΑσÏÏματο" ++ ++msgid "Wireless Adapter" ++msgstr "ΑσÏÏματος ΠÏοσαÏμογέας" ++ ++msgid "Wireless Network" ++msgstr "ΑσÏÏματο Δίκτυο" ++ ++msgid "Wireless Overview" ++msgstr "Επισκόπηση ΑσÏÏματου ΔικτÏου" ++ ++msgid "Wireless Security" ++msgstr "Ασφάλεια ΑσÏÏματου ΔικτÏου" ++ ++msgid "Wireless is disabled or not associated" ++msgstr "Το ασÏÏματο δίκτυο είναι απενεÏγοποιημένο ή μη συνδεδεμένο" ++ ++msgid "Wireless is restarting..." ++msgstr "Το ασÏÏματο δίκτυο επανεκκινείται..." ++ ++msgid "Wireless network is disabled" ++msgstr "Το ασÏÏματο δίκτυο είναι ανενεÏγό" ++ ++msgid "Wireless network is enabled" ++msgstr "Το ασÏÏματο δίκτυο είναι ενεÏγό" ++ ++msgid "Wireless restarted" ++msgstr "Το ασÏÏματο δίκτυο επανεκκινήθηκε" ++ ++msgid "Wireless shut down" ++msgstr "Το ασÏÏματο δίκτυο τεÏματίστηκε" ++ ++msgid "Write received DNS requests to syslog" ++msgstr "ΚαταγÏαφή των ληφθέντων DNS αιτήσεων στο syslog" ++ ++msgid "XR Support" ++msgstr "ΥποστήÏιξη XR" ++ ++msgid "" ++"You can enable or disable installed init scripts here. Changes will applied " ++"after a device reboot.
    Warning: If you disable essential init " ++"scripts like \"network\", your device might become inaccessible!" ++msgstr "" ++"ΜποÏείτε να ενεÏγοποιήσετε ή να απενεÏγοποιήσετε σενάÏια εκκίνησης εδώ. Οι " ++"αλλαγές θα εφαÏμοστοÏν Î±Ï†Î¿Ï ÎµÏ€Î±Î½ÎµÎºÎºÎ¹Î½Î®ÏƒÎµÏ„Îµ τη συσκευή.
    ΠÏοειδοποίηση: Αν απενεÏγοποιήσετε απαÏαίτητα σενάÏια εκκίνησης " ++"όπως το \"network\", η συσκευή σας μποÏεί να καταστεί μη-Ï€Ïοσβάσιμη!" ++ ++msgid "" ++"You must enable Java Script in your browser or LuCI will not work properly." ++msgstr "" ++ ++msgid "" ++"Your Internet Explorer is too old to display this page correctly. Please " ++"upgrade it to at least version 7 or use another browser like Firefox, Opera " ++"or Safari." ++msgstr "" ++ ++msgid "any" ++msgstr "" ++ ++msgid "auto" ++msgstr "αυτόματα" ++ ++#, fuzzy ++msgid "automatic" ++msgstr "στατικό" ++ ++msgid "baseT" ++msgstr "" ++ ++msgid "bridged" ++msgstr "" ++ ++msgid "create:" ++msgstr "" ++ ++#, fuzzy ++msgid "creates a bridge over specified interface(s)" ++msgstr "δημιουÏγεί μία γέφυÏα Î¼ÎµÏ„Î±Î¾Ï Ï„Ï‰Î½ οÏισμένων διεπαφών" ++ ++msgid "dB" ++msgstr "" ++ ++msgid "dBm" ++msgstr "" ++ ++msgid "disable" ++msgstr "ανενεÏγό" ++ ++msgid "disabled" ++msgstr "" ++ ++msgid "expired" ++msgstr "" ++ ++msgid "" ++"file where given DHCP-leases will be stored" ++msgstr "" ++"αÏχείο όπου θα αποθηκεÏονται τα Leases του DHCP" ++ ++msgid "forward" ++msgstr "Ï€Ïοώθηση" ++ ++msgid "full-duplex" ++msgstr "" ++ ++msgid "half-duplex" ++msgstr "" ++ ++msgid "help" ++msgstr "βοήθεια" ++ ++msgid "hidden" ++msgstr "" ++ ++msgid "hybrid mode" ++msgstr "" ++ ++msgid "if target is a network" ++msgstr "αν ο στόχος είναι ένα δίκτυο" ++ ++msgid "input" ++msgstr "είσοδος" ++ ++msgid "kB" ++msgstr "" ++ ++msgid "kB/s" ++msgstr "" ++ ++msgid "kbit/s" ++msgstr "" ++ ++msgid "local DNS file" ++msgstr "τοπικό αÏχείο DNS" ++ ++msgid "minimum 1280, maximum 1480" ++msgstr "" ++ ++msgid "navigation Navigation" ++msgstr "" ++ ++msgid "no" ++msgstr "όχι" ++ ++msgid "no link" ++msgstr "" ++ ++msgid "none" ++msgstr "κανένα" ++ ++msgid "not present" ++msgstr "" ++ ++msgid "off" ++msgstr "κλειστό" ++ ++msgid "on" ++msgstr "ανοιχτό" ++ ++msgid "open" ++msgstr "" ++ ++msgid "overlay" ++msgstr "" ++ ++msgid "relay mode" ++msgstr "" ++ ++msgid "routed" ++msgstr "" ++ ++msgid "server mode" ++msgstr "" ++ ++msgid "skiplink1 Skip to navigation" ++msgstr "" ++ ++msgid "skiplink2 Skip to content" ++msgstr "" ++ ++msgid "stateful-only" ++msgstr "" ++ ++msgid "stateless" ++msgstr "" ++ ++msgid "stateless + stateful" ++msgstr "" ++ ++msgid "tagged" ++msgstr "" ++ ++msgid "unknown" ++msgstr "" ++ ++msgid "unlimited" ++msgstr "απεÏιόÏιστα" ++ ++msgid "unspecified" ++msgstr "μη-καθοÏισμένο" ++ ++msgid "unspecified -or- create:" ++msgstr "μη-καθοÏισμένο -ή- δημιουÏγείστε:" ++ ++msgid "untagged" ++msgstr "" ++ ++msgid "yes" ++msgstr "ναι" ++ ++msgid "« Back" ++msgstr "« Πίσω" ++ ++#~ msgid "Configures this mount as overlay storage for block-extroot" ++#~ msgstr "" ++#~ "ΟÏίζει το συγκεκÏιμένο σημείο Ï€ÏοσάÏτησης ως επικαλÏπτον αποθηκευτικό " ++#~ "χώÏο για το block-extroot" ++ ++#~ msgid "Frequency Hopping" ++#~ msgstr "Frequency Hopping" ++ ++#~ msgid "Locked to channel %d used by %s" ++#~ msgstr "Κλειδωμένο στο κανάλι %d που χÏησιμοποιείται απ' το %s" ++ ++#~ msgid "40MHz 2nd channel above" ++#~ msgstr "40MHz με δεÏτεÏο κανάλι υψηλότεÏα" ++ ++#~ msgid "40MHz 2nd channel below" ++#~ msgstr "40MHz με δεÏτεÏο κανάλι χαμηλότεÏα" ++ ++#~ msgid "Accept router advertisements" ++#~ msgstr "Αποδοχή διαφημίσεων δÏομολογητή" ++ ++#~ msgid "Advertise IPv6 on network" ++#~ msgstr "Διαφήμιση IPv6 στο δίκτυο" ++ ++#~ msgid "Advertised network ID" ++#~ msgstr "Διαφημιζόμενο αναγνωÏιστικό δικτÏου" ++ ++#~ msgid "Allowed range is 1 to 65535" ++#~ msgstr "Το επιτÏεπόμενο εÏÏος είναι από 1 έως 65535" ++ ++#~ msgid "Router Model" ++#~ msgstr "Μοντέλο ΔÏομολογητή" ++ ++#~ msgid "Router Name" ++#~ msgstr "Όνομα ΔÏομολογητή" ++ ++#~ msgid "Waiting for router..." ++#~ msgstr "Αναμονή για δÏομολογητή..." ++ ++#~ msgid "Enable builtin NTP server" ++#~ msgstr "ΕνεÏγοποίηση ενσωματωμένου εξυπηÏετητή NTP" ++ ++#~ msgid "Active Leases" ++#~ msgstr "ΕνεÏγά Leases" ++ ++#~ msgid "Open" ++#~ msgstr "Άνοιγμα" ++ ++#~ msgid "Bit Rate" ++#~ msgstr "Ρυθμός Δεδομένων" ++ ++#~ msgid "Configuration / Apply" ++#~ msgstr "ΠαÏαμετÏοποίηση / ΕφαÏμογή" ++ ++#~ msgid "Configuration / Changes" ++#~ msgstr "ΠαÏαμετÏοποίηση / Αλλαγές" ++ ++#~ msgid "Configuration / Revert" ++#~ msgstr "ΠαÏαμετÏοποίηση / ΕπαναφοÏά" ++ ++#~ msgid "MAC" ++#~ msgstr "MAC" ++ ++#~ msgid "MAC Address" ++#~ msgstr "ΔιεÏθυνση MAC" ++ ++#~ msgid "Encr." ++#~ msgstr "ΚÏυπτ." ++ ++#~ msgid "WLAN-Scan" ++#~ msgstr "ΣάÏωση WLAN" ++ ++#~ msgid "" ++#~ "Choose the network you want to attach to this wireless interface. Select " ++#~ "unspecified to not attach any network or fill out the " ++#~ "create field to define a new network." ++#~ msgstr "" ++#~ "Επιλέξατε το δίκτυο που επιθυμείτε να Ï€ÏοσαÏτήσετε σε αυτήν την ασÏÏματη " ++#~ "διεπαφή. Επιλέξτε απÏοσδιόÏιστο για να μην Ï€ÏοσαÏτηθεί " ++#~ "οποιοδήποτε ή συμπληÏώστε το πεδίο δημιουÏγία για να " ++#~ "Ï€ÏοσδιοÏίσετε ένα νέο δίκτυο." ++ ++#~ msgid "Create Network" ++#~ msgstr "ΔημιουÏγία ΔικτÏου" ++ ++#~ msgid "Link" ++#~ msgstr "ΖεÏξη" ++ ++#~ msgid "Networks" ++#~ msgstr "Δίκτυα" ++ ++#~ msgid "Power" ++#~ msgstr "ΙσχÏÏ‚" ++ ++#~ msgid "Wifi networks in your local environment" ++#~ msgstr "Τοπικά ΑσÏÏματα δίκτυα" ++ ++#~ msgid "" ++#~ "CIDR-Notation: " ++#~ "address/prefix" ++#~ msgstr "" ++#~ "ΠαÏάσταση CIDR: " ++#~ "διεÏθυνση/Ï€Ïόθεμα" ++ ++#~ msgid "DNS-Server" ++#~ msgstr "ΕξυπηÏετητής DNS" ++ ++#~ msgid "IPv4-Broadcast" ++#~ msgstr "IPv4-Broadcast" ++ ++#~ msgid "IPv6-Address" ++#~ msgstr "ΔιεÏθυνση IPv6" ++ ++#~ msgid "IPv6 Setup" ++#~ msgstr "ΔιαχείÏιση IPv6" ++ ++#~ msgid "" ++#~ "Note: If you choose an interface here which is part of another network, " ++#~ "it will be moved into this network." ++#~ msgstr "" ++#~ "Σημείωση: Εάν επιλέξετε μια διεπαφή εδώ η οποία είναι μέÏος ενός άλλου " ++#~ "δικτÏου, θα μετακινηθεί σε αυτό το δίκτυο." ++ ++#~ msgid "" ++#~ "The network ports on your router can be combined to several VLANs in which computers can " ++#~ "communicate directly with each other. VLANs are often used to separate different network " ++#~ "segments. Often there is by default one Uplink port for a connection to " ++#~ "the next greater network like the internet and other ports for a local " ++#~ "network." ++#~ msgstr "" ++#~ "Οι πόÏτες δικτÏου του δÏομολογητή σας μποÏοÏν να συνδυαστοÏν σε πολλά " ++#~ "VLANs όπου οι " ++#~ "υπολογιστές να επικοινωνοÏν απευθείας Î¼ÎµÏ„Î±Î¾Ï Ï„Î¿Ï…Ï‚. Τα VLANs συχνά χÏησιμοποιοÏνται για να " ++#~ "διαχωÏίσουν διαφοÏετικά τμήματα του δικτÏου. Συχνά υπάÏχει μία " ++#~ "Ï€Ïοεπιλεγμένη πόÏτα Uplink για σÏνδεση με ένα μεγαλÏτεÏο δίκτυο όπως το " ++#~ "internet και άλλες πόÏτες για σÏνδεση με το τοπικό δίκτυο." ++ ++#~ msgid "Enable buffering" ++#~ msgstr "ΕνεÏγοποίηση buffering" ++ ++#~ msgid "IPv6-over-IPv4" ++#~ msgstr "IPv6-over-IPv4" ++ ++#~ msgid "Files to be kept when flashing a new firmware" ++#~ msgstr "ΑÏχεία που θα διατηÏηθοÏν κατά το φλασάÏισμα του firmware" ++ ++#~ msgid "General" ++#~ msgstr "Γενικά" ++ ++#~ msgid "" ++#~ "Here you can customize the settings and the functionality of LuCI." ++#~ msgstr "" ++#~ "Εδώ μποÏείτε να Ï€ÏοσαÏμόσετε τις Ïυθμίσεις και την λειτουÏγία του LuCI." ++ ++#~ msgid "Post-commit actions" ++#~ msgstr "ΕνέÏγειες μετά το commit" ++ ++#~ msgid "" ++#~ "These commands will be executed automatically when a given UCI configuration is committed " ++#~ "allowing changes to be applied instantly." ++#~ msgstr "" ++#~ "Αυτές οι εντολές θα εκτελεστοÏν αυτόματα όταν μία ÏÏθμιση UCI γίνει commit επιτÏέποντας " ++#~ "τις αλλαγές να εφαÏμόζονται ακαÏιαία." ++ ++#~ msgid "Web UI" ++#~ msgstr "Web UI" ++ ++#~ msgid "PPTP-Server" ++#~ msgstr "" ++#~ "ΕξυπηÏετητής PPTP" ++ ++#~ msgid "Access point (APN)" ++#~ msgstr "Σημείο Ï€Ïόσβασης (APN)" ++ ++#~ msgid "Additional pppd options" ++#~ msgstr "Επιπλέον επιλογές pppd" ++ ++#~ msgid "Automatic Disconnect" ++#~ msgstr "Αυτόματη ΑποσÏνδεση" ++ ++#~ msgid "Backup Archive" ++#~ msgstr "ΑÏχείο αντιγÏάφων ασφαλείας" ++ ++#~ msgid "" ++#~ "Configure the local DNS server to use the name servers adverticed by the " ++#~ "PPP peer" ++#~ msgstr "" ++#~ "ΡÏθμιση του Ï„Î¿Ï€Î¹ÎºÎ¿Ï ÎµÎ¾Ï…Ï€Î·Ïετητή DNS να χÏησιμοποιεί τους εξυπηÏετητές " ++#~ "ονόματος που διαφημίζει ο ομότιμος PPP" ++ ++#~ msgid "Connect script" ++#~ msgstr "ΣενάÏιο σÏνδεσης" ++ ++#~ msgid "Create backup" ++#~ msgstr "ΔημιουÏγία αντίγÏαφου ασφαλείας" ++ ++#~ msgid "Disconnect script" ++#~ msgstr "ΣενάÏιο αποσÏνδεσης" ++ ++#~ msgid "Edit package lists and installation targets" ++#~ msgstr "ΕπεξεÏγασία λίστας πακέτων και Ï€ÏοοÏισμών εγκατάστασης" ++ ++#~ msgid "Enable IPv6 on PPP link" ++#~ msgstr "ΕνεÏγοποίηση IPv6 σε ζεÏξη PPP" ++ ++#~ msgid "Firmware image" ++#~ msgstr "Εικόνα firmware" ++ ++#~ msgid "" ++#~ "Here you can backup and restore your router configuration and - if " ++#~ "possible - reset the router to the default settings." ++#~ msgstr "" ++#~ "Εδώ μποÏείτε να κÏατήσετε και να επαναφέÏετε αντίγÏαφα ασφαλείας των " ++#~ "παÏαμέτÏων του δÏομολογητή σας και - αν είναι δυνατόν - να επαναφέÏετε " ++#~ "τον δÏομολογητή στις Ï€Ïοεπιλεγμένες Ïυθμίσεις." ++ ++#~ msgid "Installation targets" ++#~ msgstr "ΠÏοοÏισμοί εγκατάστασης" ++ ++#~ msgid "Keep configuration files" ++#~ msgstr "ΔιατήÏηση αÏχείων παÏαμετÏοποίησης" ++ ++#~ msgid "Keep-Alive" ++#~ msgstr "Keep-Alive" ++ ++#~ msgid "" ++#~ "Let pppd replace the current default route to use the PPP interface after " ++#~ "successful connect" ++#~ msgstr "" ++#~ "Το pppd να αντικαθιστά την Ï„Ïέχουσα Ï€Ïοεπιλεγμένη διαδÏομή για να " ++#~ "χÏησιμοποιείται η διεπαφή PPP μετά από επιτυχημένη σÏνδεση" ++ ++#~ msgid "Let pppd run this script after establishing the PPP link" ++#~ msgstr "Το pppd να Ï„Ïέχει αυτό το σενάÏιο όταν η ζεÏξη PPP εγκαθιδÏÏεται" ++ ++#~ msgid "Let pppd run this script before tearing down the PPP link" ++#~ msgstr "Το pppd να Ï„Ïέχει αυτό το σενάÏιο Ï€Ïιν η ζεÏξη PPP κλείσει" ++ ++#~ msgid "" ++#~ "Make sure that you provide the correct pin code here or you might lock " ++#~ "your sim card!" ++#~ msgstr "" ++#~ "Εξασφαλίστε ότι δηλώνετε το σωστό κωδικό pin εδώ αλλιώς μποÏεί να " ++#~ "κλειδώσετε την κάÏτα sim σας!" ++ ++#~ msgid "" ++#~ "Most of them are network servers, that offer a certain service for your " ++#~ "device or network like shell access, serving webpages like LuCI, doing mesh routing, sending " ++#~ "e-mails, ..." ++#~ msgstr "" ++#~ "Οι πεÏισσότεÏοι είναι εξυπηÏετητές δικτÏου που Ï€ÏοσφέÏουν κάποιες " ++#~ "συγκεκÏιμένες υπηÏεσίες για την συσκευή ή το δίκτυο σας όπως Ï€Ïόσβαση στο " ++#~ "κέλυφος, υπηÏεσίες ιστοσελίδων σαν το LuCI, δÏομολόγηση mesh, αποστολή ηλ. ταχυδÏομείου, ..." ++ ++#~ msgid "Number of failed connection tests to initiate automatic reconnect" ++#~ msgstr "" ++#~ "ΑÏιθμός αποτυχημένων δοκιμών για την εφαÏμογή της αυτόματης επανασÏνδεσης" ++ ++#~ msgid "PIN code" ++#~ msgstr "Κωδικός PIN" ++ ++#~ msgid "Package lists" ++#~ msgstr "Λίστες Πακέτων" ++ ++#~ msgid "Proceed reverting all settings and resetting to firmware defaults?" ++#~ msgstr "" ++#~ "Θέλετε να Ï€ÏοχωÏήσετε στην αναίÏεση όλων των Ïυθμίσεων και την επαναφοÏά " ++#~ "στις Ï€Ïοεπιλεγμένες για το firmware;" ++ ++#~ msgid "Processor" ++#~ msgstr "ΕπεξεÏγαστής" ++ ++#~ msgid "Radius-Port" ++#~ msgstr "ΘÏÏα Radius" ++ ++#~ msgid "Radius-Server" ++#~ msgstr "ΕξυπηÏετητής Radius" ++ ++#~ msgid "Replace default route" ++#~ msgstr "Αντικατάσταση Ï€Ïοεπιλεγμένης διαδÏομής" ++ ++#~ msgid "Reset router to defaults" ++#~ msgstr "ΕπαναφοÏά δÏομολογητή στα Ï€Ïοεπιλεγμένα" ++ ++#~ msgid "" ++#~ "Seconds to wait for the modem to become ready before attempting to connect" ++#~ msgstr "" ++#~ "ΔευτεÏόλεπτα αναμονής ώστε το modem να Ï€Ïοετοιμαστεί Ï€Ïιν την Ï€Ïοσπάθεια " ++#~ "για σÏνδεση" ++ ++#~ msgid "Service type" ++#~ msgstr "ΤÏπος υπηÏεσίες" ++ ++#~ msgid "Services and daemons perform certain tasks on your device." ++#~ msgstr "" ++#~ "Οι υπηÏεσίες και οι δαίμονες εκτελοÏν κάποιες συγκεκÏιμένες εÏγασίες στην " ++#~ "συσκευή σας." ++ ++#~ msgid "Settings" ++#~ msgstr "Ρυθμίσεις" ++ ++#~ msgid "Setup wait time" ++#~ msgstr "ΚαθοÏισμός χÏόνου αναμονής" ++ ++#~ msgid "" ++#~ "Sorry. OpenWrt does not support a system upgrade on this platform.
    " ++#~ "You need to manually flash your device." ++#~ msgstr "" ++#~ "Συγνώμη. Το OpenWrt δεν υποστηÏίζει αναβάθμιση συστήματος σε αυτή την " ++#~ "πλατφόÏμα.
    ΧÏειάζεται να φλασάÏετε την συσκευή σας χειÏοκίνητα." ++ ++#~ msgid "Specify additional command line arguments for pppd here" ++#~ msgstr "ΟÏισμός επιπλέον επιλογών pppd στην γÏαμμή εντολών" ++ ++#~ msgid "The device node of your modem, e.g. /dev/ttyUSB0" ++#~ msgstr "Ο κόμβος συσκευής του modem σας, Ï€.χ. /dev/ttyUSB0" ++ ++#~ msgid "Time (in seconds) after which an unused connection will be closed" ++#~ msgstr "" ++#~ "ΧÏόνος (σε δευτεÏόλεπτα) ÏστεÏα από τον οποίο οι αχÏησιμοποίητες " ++#~ "συνδέσεις θα κλείνουν" ++ ++#~ msgid "Update package lists" ++#~ msgstr "ΕνημέÏωση λίστας πακέτων" ++ ++#~ msgid "Upload an OpenWrt image file to reflash the device." ++#~ msgstr "Ανεβάστε ένα αÏχείο εικόνας OpenWrt για να φλασάÏετε τη συσκευή." ++ ++#~ msgid "Upload image" ++#~ msgstr "Ανέβασμα εικόνας" ++ ++#~ msgid "Use peer DNS" ++#~ msgstr "ΧÏήση DNS ομότιμου" ++ ++#~ msgid "" ++#~ "You need to install \"comgt\" for UMTS/GPRS, \"ppp-mod-pppoe\" for PPPoE, " ++#~ "\"ppp-mod-pppoa\" for PPPoA or \"pptp\" for PPtP support" ++#~ msgstr "" ++#~ "Θα Ï€Ïέπει να εγκαταστήσετε το \"comgt\" για υποστήÏιξη UMTS/GPRS, το " ++#~ "\"ppp-mod-pppoe\" για PPPoE, το \"ppp-mod-pppoa\" για PPPoA ή το \"pptp\" " ++#~ "για PPtP" ++ ++#~ msgid "back" ++#~ msgstr "πίσω" ++ ++#~ msgid "buffered" ++#~ msgstr "ενδιάμεση" ++ ++#~ msgid "cached" ++#~ msgstr "λανθάνουσα" ++ ++#~ msgid "free" ++#~ msgstr "ελεÏθεÏη" ++ ++#~ msgid "static" ++#~ msgstr "στατικό" ++ ++#~ msgid "" ++#~ "LuCI is a collection " ++#~ "of free Lua software including an MVC-Webframework and webinterface for embedded devices. LuCI is licensed under the " ++#~ "Apache-License." ++#~ msgstr "" ++#~ "Το LuCI είναι μία " ++#~ "συλλογή από ελεÏθεÏο λογισμικό Lua που συμπεÏιλαμβάνει ένα MVC-Webframework και ένα πεÏιβάλλον web " ++#~ "για embedded συσκευές. Το LuCI έχει άδεια Î»Î¿Î³Î¹ÏƒÎ¼Î¹ÎºÎ¿Ï Apache." ++ ++#~ msgid "SSH-Keys" ++#~ msgstr "Κλειδιά SSH" ++ ++#~ msgid "" ++#~ "A lightweight HTTP/1.1 webserver written in C and Lua designed to serve " ++#~ "LuCI" ++#~ msgstr "" ++#~ "Ένας ελαφÏÏÏ‚ εξυπηÏετητής web HTTP/1.1 webserver γÏαμμένος σε C και Lua " ++#~ "και σχεδιασμένος να εξυπηÏετεί το LuCI" ++ ++#~ msgid "" ++#~ "A small webserver which can be used to serve LuCI." ++#~ msgstr "" ++#~ "Ένας μικÏός εξυπηÏετητής web που μποÏεί να χÏησιμοποιηθεί για να " ++#~ "εξυπηÏετεί το LuCI." ++ ++#~ msgid "About" ++#~ msgstr "ΠεÏί" ++ ++#~ msgid "Addresses" ++#~ msgstr "ΔιευθÏνσεις" ++ ++#~ msgid "Admin Password" ++#~ msgstr "Κωδικός ΔιαχειÏιστή" ++ ++#~ msgid "Alias" ++#~ msgstr "Ψευδώνυμο" ++ ++#~ msgid "Authentication Realm" ++#~ msgstr "Realm Εξουσιοδότησης" ++ ++#~ msgid "Bridge Port" ++#~ msgstr "ΠόÏτα ΓέφυÏας" ++ ++#~ msgid "" ++#~ "Change the password of the system administrator (User root)" ++#~ msgstr "" ++#~ "Αλλαγή ÎºÏ‰Î´Î¹ÎºÎ¿Ï Ï€Ïόσβασης του διαχειÏιστή του συστήματος (ΧÏήστης " ++#~ "root)" ++ ++#~ msgid "Client + WDS" ++#~ msgstr "Πελάτης + WDS" ++ ++#~ msgid "Configuration file" ++#~ msgstr "ΑÏχείο ΠαÏαμετÏοποίησης" ++ ++#~ msgid "Connection timeout" ++#~ msgstr "ΧÏόνος λήξης σÏνδεσης" ++ ++#~ msgid "Contributing Developers" ++#~ msgstr "ΣυνεισφοÏές στην Ανάπτυξη" ++ ++#~ msgid "DHCP assigned" ++#~ msgstr "Ανάθεση από DHCP" ++ ++#~ msgid "Document root" ++#~ msgstr "Ρίζα εγγÏάφων" ++ ++#~ msgid "Enable Keep-Alive" ++#~ msgstr "ΕνεÏγοποίηση Keep-Alive" ++ ++#~ msgid "Ethernet Bridge" ++#~ msgstr "ΓέφυÏα Ethernet" ++ ++#~ msgid "" ++#~ "Here you can paste public SSH-Keys " ++#~ "(one per line) for SSH public-key " ++#~ "authentication." ++#~ msgstr "" ++#~ "Εδώ μποÏείτε να επικολλήσετε δημόσια SSH-κλειδιά (ένα ανά γÏαμμή) για εξουσιοδότηση δημόσιου-ÎºÎ»ÎµÎ¹Î´Î¹Î¿Ï SSH." ++ ++#~ msgid "ID" ++#~ msgstr "ID" ++ ++#~ msgid "IP Configuration" ++#~ msgstr "Ρυθμίσεις IP" ++ ++#~ msgid "Interface Status" ++#~ msgstr "Κατάσταση Διεπαφής" ++ ++#~ msgid "Lead Development" ++#~ msgstr "Επικεφαλής Ανάπτυξης" ++ ++#~ msgid "Master" ++#~ msgstr "Σημείο ΠÏόσβασης" ++ ++#~ msgid "Master + WDS" ++#~ msgstr "Σημείο ΠÏόσβασης + WDS" ++ ++#~ msgid "Not configured" ++#~ msgstr "Μη-Ïυθμισμένο" ++ ++#~ msgid "Password successfully changed" ++#~ msgstr "Ο κωδικός Ï€Ïόσβασης αλλάχτηκε επιτυχώς" ++ ++#~ msgid "Plugin path" ++#~ msgstr "ΔιαδÏομή Ï€Ïοσθέτων" ++ ++#~ msgid "Ports" ++#~ msgstr "ΘÏÏες" ++ ++#~ msgid "Primary" ++#~ msgstr "ΚÏÏιο" ++ ++#~ msgid "Project Homepage" ++#~ msgstr "Ιστοσελίδα του ΠÏότζεκτ" ++ ++#~ msgid "Pseudo Ad-Hoc" ++#~ msgstr "Ψευδό Ad-Hoc" ++ ++#~ msgid "STP" ++#~ msgstr "STP" ++ ++#~ msgid "Thanks To" ++#~ msgstr "ΕυχαÏιστίες" ++ ++#~ msgid "" ++#~ "The realm which will be displayed at the authentication prompt for " ++#~ "protected pages." ++#~ msgstr "" ++#~ "Το realm που θα εμφανίζεται κατά την Ï€ÏοτÏοπή για εξουσιοδότηση για τις " ++#~ "Ï€Ïοστατευμένες σελίδες." ++ ++#~ msgid "Unknown Error" ++#~ msgstr "Άγνωστο Σφάλμα" ++ ++#~ msgid "VLAN" ++#~ msgstr "VLAN" ++ ++#~ msgid "defaults to /etc/httpd.conf" ++#~ msgstr "Ï€Ïοεπιλεγμένο /etc/httpd.conf" ++ ++#~ msgid "Package lists updated" ++#~ msgstr "Η λίστα πακέτων ενημεÏώθηκε" ++ ++#~ msgid "Upgrade installed packages" ++#~ msgstr "Αναβάθμιση εγκατεστημένων πακέτων" ++ ++#~ msgid "" ++#~ "Also kernel or service logfiles can be viewed here to get an overview " ++#~ "over their current state." ++#~ msgstr "" ++#~ "Επίσης εδώ μποÏείτε να δείτε τα αÏχεία καταγÏαφής του πυÏήνα ή των " ++#~ "υπηÏεσιών ώστε να έχετε μια εικόνα για την Ï„Ïέχουσα κατάσταση." ++ ++#~ msgid "" ++#~ "Here you can find information about the current system status like CPU clock frequency, memory " ++#~ "usage or network interface data." ++#~ msgstr "" ++#~ "Εδώ μποÏείτε να βÏείτε πληÏοφοÏίες για την Ï„Ïέχουσα κατάσταση του " ++#~ "συστήματος όπως την συχνότητα της CPU, τη χÏήση μνήμης ή τον όγκο δεδομένων των διεπαφών δικτÏου." ++ ++#~ msgid "Search file..." ++#~ msgstr "ΕÏÏεση αÏχείου..." ++ ++#~ msgid "" ++#~ "LuCI is a free, " ++#~ "flexible, and user friendly graphical interface for configuring OpenWrt " ++#~ "Kamikaze." ++#~ msgstr "" ++#~ "Το LuCI είναι ένα " ++#~ "ελεÏθεÏο, ευέλικτο, και φιλικό Ï€Ïος το χÏήστη γÏαφικό πεÏιβάλλον για την " ++#~ "παÏαμετÏοποίηση του OpenWrt Kamikaze." ++ ++#~ msgid "And now have fun with your router!" ++#~ msgstr "Και Ï„ÏŽÏα διασκεδάστε με τον δÏομολογητή σας!" ++ ++#~ msgid "" ++#~ "As we always want to improve this interface we are looking forward to " ++#~ "your feedback and suggestions." ++#~ msgstr "" ++#~ "Θέλοντας πάντα να βελτιώνουμε αυτό το πεÏιβάλλον, πεÏιμένουμε την " ++#~ "ανάδÏαση και τις Ï€Ïοτάσεις σας." ++ ++#~ msgid "Hello!" ++#~ msgstr "Γεια σας!" ++ ++#~ msgid "" ++#~ "Notice: In LuCI " ++#~ "changes have to be confirmed by clicking Changes - Save & Apply " ++#~ "before being applied." ++#~ msgstr "" ++#~ "Σημείωση: ΠÏιν εφαÏμοστοÏν οι αλλαγές στο LuCI Ï€Ïέπει να επιβεβαιωθοÏν κλικάÏοντας το Αλλαγές - " ++#~ "Αποθήκευση & ΕφαÏμογή." ++ ++#~ msgid "" ++#~ "On the following pages you can adjust all important settings of your " ++#~ "router." ++#~ msgstr "" ++#~ "Στις επόμενες σελίδες μποÏείτε να Ï€ÏοσαÏμόζετε τις πιο σημαντικές " ++#~ "Ïυθμίσεις του δÏομολογητή σας." ++ ++#~ msgid "The LuCI Team" ++#~ msgstr "Η ομάδα του LuCI" ++ ++#~ msgid "" ++#~ "This is the administration area of LuCI." ++#~ msgstr "" ++#~ "Αυτός είναι ο χώÏος διαχείÏισης του LuCI." ++ ++#~ msgid "User Interface" ++#~ msgstr "ΠεÏιβάλλον ΧÏήστη" ++ ++#~ msgid "enable" ++#~ msgstr "ενεÏγό" ++ ++#, fuzzy ++#~ msgid "(optional)" ++#~ msgstr " (Ï€ÏοαιÏετικό)" ++ ++#~ msgid "DNS-Port" ++#~ msgstr "ΘÏÏα DNS" ++ ++#~ msgid "" ++#~ "DNS-Server will be queried in " ++#~ "the order of the resolvfile" ++#~ msgstr "" ++#~ "Ο εξυπηÏετητής DNS θα εÏωτάται " ++#~ "με την σειÏά που δηλώνεται στο αÏχείο resolv" ++ ++#~ msgid "" ++#~ "max. DHCP-Leases" ++#~ msgstr "" ++#~ "μεγ. DHCP-Leases" ++ ++#~ msgid "" ++#~ "max. EDNS0 packet size" ++#~ msgstr "" ++#~ "μεγ. μέγεθος πακέτου EDNS0" ++ ++#~ msgid "AP-Isolation" ++#~ msgstr "Απομόνωση AP" ++ ++#~ msgid "Add the Wifi network to physical network" ++#~ msgstr "ΠÏοσθήκη ΑσÏÏματου δικτÏου σε φυσικό δίκτυο" ++ ++#~ msgid "Aliases" ++#~ msgstr "Ψευδώνυμα" ++ ++#~ msgid "Clamp Segment Size" ++#~ msgstr "Μέγεθος Τμήματος ΤεμαχισμοÏ" ++ ++#, fuzzy ++#~ msgid "Create Or Attach Network" ++#~ msgstr "ΔημιουÏγία ΔικτÏου" ++ ++#~ msgid "Devices" ++#~ msgstr "Συσκευές" ++ ++#~ msgid "Don't forward reverse lookups for local networks" ++#~ msgstr "Îα μην Ï€ÏοωθοÏνται αντίστÏοφες αναζητήσεις για τοπικά δίκτυα" ++ ++#~ msgid "Enable TFTP-Server" ++#~ msgstr "ΕνεÏγός εξυπηÏετητής TFTP" ++ ++#~ msgid "Errors" ++#~ msgstr "Λάθη" ++ ++#~ msgid "Essentials" ++#~ msgstr "Βασικά" ++ ++#~ msgid "Expand Hosts" ++#~ msgstr "Ανάπτυξη ονομάτων υπολογιστών" ++ ++#~ msgid "First leased address" ++#~ msgstr "ΠÏώτη διεÏθυνση lease" ++ ++#~ msgid "" ++#~ "Fixes problems with unreachable websites, submitting forms or other " ++#~ "unexpected behaviour for some ISPs." ++#~ msgstr "" ++#~ "ΕπιλÏει Ï€Ïοβλήματα με μη-Ï€Ïοσβάσιμους ιστοχώÏους, την υποβολή φοÏμών ή " ++#~ "άλλες απÏοσδόκητες συμπεÏιφοÏές κάποιων ISP." ++ ++#~ msgid "Hardware Address" ++#~ msgstr "ΔιεÏθυνση ΥλικοÏ" ++ ++#~ msgid "Here you can configure installed wifi devices." ++#~ msgstr "Εδώ μποÏείτε να Ïυθμίσετε τις εγκατεστημένες ασÏÏματες συσκευές." ++ ++#~ msgid "Ignore /etc/hosts" ++#~ msgstr "Αγνόησε /etc/hosts" ++ ++#~ msgid "Independent (Ad-Hoc)" ++#~ msgstr "ΑνεξάÏτητο (Ad-Hoc)" ++ ++#~ msgid "Internet Connection" ++#~ msgstr "ΣÏνδεση με Διαδίκτυο" ++ ++#~ msgid "Join (Client)" ++#~ msgstr "Συμμετοχή (Πελάτης)" ++ ++#~ msgid "Leases" ++#~ msgstr "Leases" ++ ++#~ msgid "Local Domain" ++#~ msgstr "Τοπικό Όνομα Τομέα" ++ ++#~ msgid "Local Network" ++#~ msgstr "Τοπικό Δίκτυο" ++ ++#~ msgid "Local Server" ++#~ msgstr "Τοπικός Διακομιστής" ++ ++#~ msgid "Network Boot Image" ++#~ msgstr "Εικόνα Εκκίνησης ΔικτÏου" ++ ++#~ msgid "" ++#~ "Network Name (ESSID)" ++#~ msgstr "" ++#~ "Όνομα ΔικτÏου (ESSID)" ++ ++#~ msgid "Number of leased addresses" ++#~ msgstr "ΑÏιθμός διευθÏνσεων lease" ++ ++#~ msgid "Perform Actions" ++#~ msgstr "Εκτέλεση ΕνεÏγειών" ++ ++#~ msgid "Prevents Client to Client communication" ++#~ msgstr "ΑποτÏέπει την επικοινωνία Î¼ÎµÏ„Î±Î¾Ï Î ÎµÎ»Î±Ï„ÏŽÎ½" ++ ++#~ msgid "Provide (Access Point)" ++#~ msgstr "ΠαÏοχή (Σημείο ΠÏόσβασης)" ++ ++#~ msgid "Resolvfile" ++#~ msgstr "ΑÏχείο Resolv" ++ ++#~ msgid "TFTP-Server Root" ++#~ msgstr "Ρίζα εξυπηÏετητή TFTP" ++ ++#~ msgid "TX / RX" ++#~ msgstr "TX / RX" ++ ++#~ msgid "The following changes have been applied" ++#~ msgstr "Οι παÏακάτω αλλαγές έχουν εφαÏμοστεί" ++ ++#~ msgid "" ++#~ "When flashing a new firmware with LuCI these files will be added to the new firmware " ++#~ "installation." ++#~ msgstr "" ++#~ "Τα παÏακάτω αÏχεία θα διατηÏοÏνται όταν φλασάÏεται το firmware μέσω του " ++#~ "LuCI." ++ ++#, fuzzy ++#~ msgid "Wireless Scan" ++#~ msgstr "ΑσÏÏματο" ++ ++#~ msgid "" ++#~ "With DHCP " ++#~ "network members can automatically receive their network settings (IP-address, netmask, DNS-server, ...)." ++#~ msgstr "" ++#~ "Με τον DHCP τα " ++#~ "μέλη του δικτÏου μποÏοÏν αυτόματα να λάβουν τις Ïυθμίσεις δικτÏου τους " ++#~ "(διεÏθυνση IP, μάσκα δικτÏου, " ++#~ "εξυπηÏετητή DNS, ...)." ++ ++#~ msgid "" ++#~ "You can run several wifi networks with one device. Be aware that there " ++#~ "are certain hardware and driverspecific restrictions. Normally you can " ++#~ "operate 1 Ad-Hoc or up to 3 Master-Mode and 1 Client-Mode network " ++#~ "simultaneously." ++#~ msgstr "" ++#~ "Μια συσκευή μποÏεί να λειτουÏγεί σε πολλά ασÏÏματα δίκτυα. ΠÏοσοχή όμως " ++#~ "γιατί υπάÏχουν κάποιοι πεÏιοÏισμοί από το υλικό και τον οδηγό. Κανονικά, " ++#~ "μποÏοÏν να λειτουÏγοÏν: 1 δίκτυο Ad-Hoc ή μέχÏι 3 δίκτυα AP και 1 πελάτη " ++#~ "ταυτόχÏονα." ++ ++#~ msgid "" ++#~ "You need to install \"ppp-mod-pppoe\" for PPPoE or \"pptp\" for PPtP " ++#~ "support" ++#~ msgstr "" ++#~ "ΧÏειάζεται να εγκαταστήσετε το \"ppp-mod-pppoe\" για υποστήÏιξη PPPoE ή " ++#~ "το \"pptp\" για υποστήÏιξη PPtP" ++ ++#~ msgid "additional hostfile" ++#~ msgstr "επιπλέον αÏχείο ονομάτων υπολογιστών" ++ ++#~ msgid "adds domain names to hostentries in the resolv file" ++#~ msgstr "Ï€Ïοσθέτει τα ονόματα τομέα στις καταχωÏήσεις του αÏχείου resolv" ++ ++#~ msgid "automatically reconnect" ++#~ msgstr "αυτόματη επανασÏνδεση" ++ ++#~ msgid "concurrent queries" ++#~ msgstr "ταυτόχÏονα εÏωτήματα" ++ ++#~ msgid "" ++#~ "disable DHCP " ++#~ "for this interface" ++#~ msgstr "" ++#~ "απενεÏγοποίηση DHCP για αυτή τη διεπαφή" ++ ++#~ msgid "disconnect when idle for" ++#~ msgstr "αποσÏνδεση όταν είναι αδÏανές για" ++ ++#~ msgid "don't cache unknown" ++#~ msgstr "να μην διατηÏοÏνται στην λανθάνουσα μνήμη τα άγνωστα" ++ ++#~ msgid "" ++#~ "filter useless DNS-queries of " ++#~ "Windows-systems" ++#~ msgstr "" ++#~ "φιλτÏάÏισμα άχÏηστων εÏωτημάτων DNS των συστημάτων Windows" ++ ++#~ msgid "installed" ++#~ msgstr "εγκατεστημένο" ++ ++#~ msgid "localises the hostname depending on its subnet" ++#~ msgstr "επιτÏέπει τοπικό όνομα υπολογιστή με βάση το υποδίκτυο του" ++ ++#~ msgid "not installed" ++#~ msgstr "μη-εγκατεστημένο" ++ ++#~ msgid "" ++#~ "prevents caching of negative DNS-replies" ++#~ msgstr "" ++#~ "αποτÏέπει τη διατήÏηση των αÏνητικών απαντήσεων DNS στην λανθάνουσα μνήμη" ++ ++#~ msgid "query port" ++#~ msgstr "θÏÏα εÏωτημάτων" ++ ++#~ msgid "transmitted / received" ++#~ msgstr "απεσταλμένα / ληφθέντα" ++ ++#~ msgid "Console Log Level" ++#~ msgstr "Επίπεδο ΚαταγÏαφής ΤεÏματικοÏ" ++ ++#~ msgid "Log Size" ++#~ msgstr "Μέγεθος ΑÏχείου ΚαταγÏαφής" ++ ++#~ msgid "Remote Syslog IP" ++#~ msgstr "ΔιεÏθυνση ΑπομακÏυσμένου Syslog" ++ ++#, fuzzy ++#~ msgid "Join network" ++#~ msgstr "Δίκτυο" ++ ++#~ msgid "all" ++#~ msgstr "όλα" ++ ++#~ msgid "Code" ++#~ msgstr "Κωδικός" ++ ++#~ msgid "Distance" ++#~ msgstr "Απόσταση" ++ ++#~ msgid "Legend" ++#~ msgstr "Υπόμνημα" ++ ++#~ msgid "Library" ++#~ msgstr "Βιβλιοθήκη" ++ ++#~ msgid "see '%s' manpage" ++#~ msgstr "βλέπε '%s' manpage" ++ ++#~ msgid "Package Manager" ++#~ msgstr "ΔιαχειÏιστής Πακέτων" ++ ++#~ msgid "Service" ++#~ msgstr "ΥπηÏεσία" ++ ++#~ msgid "Statistics" ++#~ msgstr "Στατιστικά" ++ ++#~ msgid "zone" ++#~ msgstr "Ζώνη" +diff --git a/feeds/luci/modules/luci-base/po/en/base.po b/feeds/luci/modules/luci-base/po/en/base.po +new file mode 100644 +index 0000000..3ad4b14 +--- /dev/null ++++ b/feeds/luci/modules/luci-base/po/en/base.po +@@ -0,0 +1,4007 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Report-Msgid-Bugs-To: \n" ++"POT-Creation-Date: 2009-06-10 03:40+0200\n" ++"PO-Revision-Date: 2012-04-03 08:44+0200\n" ++"Last-Translator: juhosg \n" ++"Language-Team: LANGUAGE \n" ++"Language: en\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n != 1);\n" ++"X-Generator: Pootle 2.0.4\n" ++ ++msgid "(%d minute window, %d second interval)" ++msgstr "(%d minute window, %d second interval)" ++ ++msgid "(%s available)" ++msgstr "(%s available)" ++ ++msgid "(empty)" ++msgstr "(empty)" ++ ++msgid "(no interfaces attached)" ++msgstr "(no interfaces attached)" ++ ++msgid "-- Additional Field --" ++msgstr "-- Additional Field --" ++ ++msgid "-- Please choose --" ++msgstr "-- Please choose --" ++ ++msgid "-- custom --" ++msgstr "-- custom --" ++ ++msgid "-- match by device --" ++msgstr "" ++ ++msgid "-- match by label --" ++msgstr "" ++ ++msgid "1 Minute Load:" ++msgstr "1 Minute Load:" ++ ++msgid "15 Minute Load:" ++msgstr "15 Minute Load:" ++ ++msgid "5 Minute Load:" ++msgstr "5 Minute Load:" ++ ++msgid "BSSID" ++msgstr "BSSID" ++ ++msgid "DNS query port" ++msgstr "DNS query port" ++ ++msgid "DNS server port" ++msgstr "DNS server port" ++ ++msgid "" ++"DNS servers will be queried in the " ++"order of the resolvfile" ++msgstr "" ++"DNS servers will be queried in the " ++"order of the resolvfile" ++ ++msgid "ESSID" ++msgstr "ESSID" ++ ++msgid "IPv4-Address" ++msgstr "IPv4-Address" ++ ++msgid "IPv4-Gateway" ++msgstr "IPv4-Gateway" ++ ++msgid "IPv4-Netmask" ++msgstr "IPv4-Netmask" ++ ++msgid "" ++"IPv6-Address or Network " ++"(CIDR)" ++msgstr "" ++"IPv6-Address or Network " ++"(CIDR)" ++ ++msgid "IPv6-Gateway" ++msgstr "IPv6-Gateway" ++ ++msgid "IPv6-Suffix (hex)" ++msgstr "" ++ ++msgid "LED Configuration" ++msgstr "LED Configuration" ++ ++msgid "LED Name" ++msgstr "LED Name" ++ ++msgid "MAC-Address" ++msgstr "MAC-Address" ++ ++msgid "" ++"Max. DHCP leases" ++msgstr "" ++"Max. DHCP leases" ++ ++msgid "" ++"Max. EDNS0 packet size" ++msgstr "" ++"Max. EDNS0 packet size" ++ ++msgid "Max. concurrent queries" ++msgstr "Max. concurrent queries" ++ ++msgid "%s - %s" ++msgstr "" ++ ++msgid "ADSL" ++msgstr "" ++ ++msgid "ADSL Status" ++msgstr "" ++ ++msgid "AICCU (SIXXS)" ++msgstr "" ++ ++msgid "APN" ++msgstr "APN" ++ ++msgid "AR Support" ++msgstr "AR Support" ++ ++msgid "ARP retry threshold" ++msgstr "ARP retry threshold" ++ ++msgid "ATM Bridges" ++msgstr "ATM Bridges" ++ ++msgid "ATM Virtual Channel Identifier (VCI)" ++msgstr "ATM Virtual Channel Identifier (VCI)" ++ ++msgid "ATM Virtual Path Identifier (VPI)" ++msgstr "ATM Virtual Path Identifier (VPI)" ++ ++msgid "" ++"ATM bridges expose encapsulated ethernet in AAL5 connections as virtual " ++"Linux network interfaces which can be used in conjunction with DHCP or PPP " ++"to dial into the provider network." ++msgstr "" ++"ATM bridges expose encapsulated ethernet in AAL5 connections as virtual " ++"Linux network interfaces which can be used in conjunction with DHCP or PPP " ++"to dial into the provider network." ++ ++msgid "ATM device number" ++msgstr "ATM device number" ++ ++msgid "AYIYA" ++msgstr "" ++ ++msgid "Access Concentrator" ++msgstr "Access Concentrator" ++ ++msgid "Access Point" ++msgstr "Access Point" ++ ++msgid "Action" ++msgstr "Action" ++ ++msgid "Actions" ++msgstr "Actions" ++ ++msgid "Activate this network" ++msgstr "Activate this network" ++ ++msgid "Active IPv4-Routes" ++msgstr "Active IPv4-Routes" ++ ++msgid "Active IPv6-Routes" ++msgstr "Active IPv6-Routes" ++ ++msgid "Active Connections" ++msgstr "Active Connections" ++ ++msgid "Active DHCP Leases" ++msgstr "" ++ ++msgid "Active DHCPv6 Leases" ++msgstr "" ++ ++msgid "Ad-Hoc" ++msgstr "Ad-Hoc" ++ ++msgid "Add" ++msgstr "Add" ++ ++msgid "Add local domain suffix to names served from hosts files" ++msgstr "Add local domain suffix to names served from hosts files" ++ ++msgid "Add new interface..." ++msgstr "Add new interface..." ++ ++msgid "Additional Hosts files" ++msgstr "Additional Hosts files" ++ ++msgid "Address" ++msgstr "Address" ++ ++msgid "Address to access local relay bridge" ++msgstr "Address to access local relay bridge" ++ ++msgid "Administration" ++msgstr "Administration" ++ ++msgid "Advanced Settings" ++msgstr "Advanced Settings" ++ ++msgid "Alert" ++msgstr "Alert" ++ ++msgid "Allow SSH password authentication" ++msgstr "Allow SSH password authentication" ++ ++msgid "Allow all except listed" ++msgstr "Allow all except listed" ++ ++msgid "Allow listed only" ++msgstr "Allow listed only" ++ ++msgid "Allow localhost" ++msgstr "Allow localhost" ++ ++msgid "Allow remote hosts to connect to local SSH forwarded ports" ++msgstr "Allow remote hosts to connect to local SSH forwarded ports" ++ ++msgid "Allow root logins with password" ++msgstr "Allow root logins with password" ++ ++msgid "Allow the root user to login with password" ++msgstr "Allow the root user to login with password" ++ ++msgid "" ++"Allow upstream responses in the 127.0.0.0/8 range, e.g. for RBL services" ++msgstr "" ++"Allow upstream responses in the 127.0.0.0/8 range, e.g. for RBL services" ++ ++msgid "" ++"Also see Tunneling Comparison on SIXXS" ++msgstr "" ++ ++msgid "Always announce default router" ++msgstr "" ++ ++msgid "An additional network will be created if you leave this unchecked." ++msgstr "An additional network will be created if you leave this unchecked." ++ ++msgid "Announce as default router even if no public prefix is available." ++msgstr "" ++ ++msgid "Announced DNS domains" ++msgstr "" ++ ++msgid "Announced DNS servers" ++msgstr "" ++ ++msgid "Antenna 1" ++msgstr "Antenna 1" ++ ++msgid "Antenna 2" ++msgstr "Antenna 2" ++ ++msgid "Antenna Configuration" ++msgstr "" ++ ++msgid "Any zone" ++msgstr "Any zone" ++ ++msgid "Apply" ++msgstr "Apply" ++ ++msgid "Applying changes" ++msgstr "Applying changes" ++ ++msgid "" ++"Assign a part of given length of every public IPv6-prefix to this interface" ++msgstr "" ++ ++msgid "Assign interfaces..." ++msgstr "Assign interfaces..." ++ ++msgid "" ++"Assign prefix parts using this hexadecimal subprefix ID for this interface." ++msgstr "" ++ ++msgid "Associated Stations" ++msgstr "Associated Stations" ++ ++msgid "Atheros 802.11%s Wireless Controller" ++msgstr "" ++ ++msgid "AuthGroup" ++msgstr "" ++ ++msgid "Authentication" ++msgstr "Authentication" ++ ++msgid "Authoritative" ++msgstr "Authoritative" ++ ++msgid "Authorization Required" ++msgstr "Authorization Required" ++ ++msgid "Auto Refresh" ++msgstr "Auto Refresh" ++ ++msgid "Automatic" ++msgstr "" ++ ++msgid "Automatic Homenet (HNCP)" ++msgstr "" ++ ++msgid "Available" ++msgstr "Available" ++ ++msgid "Available packages" ++msgstr "Available packages" ++ ++msgid "Average:" ++msgstr "Average:" ++ ++msgid "BSSID" ++msgstr "BSSID" ++ ++msgid "Back" ++msgstr "Back" ++ ++msgid "Back to Overview" ++msgstr "Back to Overview" ++ ++msgid "Back to configuration" ++msgstr "Back to configuration" ++ ++msgid "Back to overview" ++msgstr "Back to overview" ++ ++msgid "Back to scan results" ++msgstr "Back to scan results" ++ ++msgid "Background Scan" ++msgstr "Background Scan" ++ ++msgid "Backup / Flash Firmware" ++msgstr "Backup / Flash Firmware" ++ ++msgid "Backup / Restore" ++msgstr "Backup / Restore" ++ ++msgid "Backup file list" ++msgstr "Backup file list" ++ ++msgid "Bad address specified!" ++msgstr "Bad address specified!" ++ ++msgid "Band" ++msgstr "" ++ ++msgid "Behind NAT" ++msgstr "" ++ ++msgid "" ++"Below is the determined list of files to backup. It consists of changed " ++"configuration files marked by opkg, essential base files and the user " ++"defined backup patterns." ++msgstr "" ++"Below is the determined list of files to backup. It consists of changed " ++"configuration files marked by opkg, essential base files and the user " ++"defined backup patterns." ++ ++msgid "Bitrate" ++msgstr "Bitrate" ++ ++msgid "Bogus NX Domain Override" ++msgstr "Bogus NX Domain Override" ++ ++msgid "Bridge" ++msgstr "Bridge" ++ ++msgid "Bridge interfaces" ++msgstr "Bridge interfaces" ++ ++msgid "Bridge unit number" ++msgstr "Bridge unit number" ++ ++msgid "Bring up on boot" ++msgstr "Bring up on boot" ++ ++msgid "Broadcom 802.11%s Wireless Controller" ++msgstr "" ++ ++msgid "Broadcom BCM%04x 802.11 Wireless Controller" ++msgstr "" ++ ++msgid "Buffered" ++msgstr "Buffered" ++ ++msgid "Buttons" ++msgstr "Buttons" ++ ++msgid "CA certificate; if empty it will be saved after the first connection." ++msgstr "" ++ ++msgid "CPU" ++msgstr "CPU" ++ ++msgid "CPU usage (%)" ++msgstr "CPU usage (%)" ++ ++msgid "Cancel" ++msgstr "Cancel" ++ ++msgid "Category" ++msgstr "" ++ ++msgid "Chain" ++msgstr "Chain" ++ ++msgid "Changes" ++msgstr "Changes" ++ ++msgid "Changes applied." ++msgstr "Changes applied." ++ ++msgid "Changes the administrator password for accessing the device" ++msgstr "Changes the administrator password for accessing the device" ++ ++msgid "Channel" ++msgstr "Channel" ++ ++msgid "Check" ++msgstr "Check" ++ ++msgid "Checksum" ++msgstr "Checksum" ++ ++msgid "" ++"Choose the firewall zone you want to assign to this interface. Select " ++"unspecified to remove the interface from the associated zone or " ++"fill out the create field to define a new zone and attach the " ++"interface to it." ++msgstr "" ++"Choose the firewall zone you want to assign to this interface. Select " ++"unspecified to remove the interface from the associated zone or " ++"fill out the create field to define a new zone and attach the " ++"interface to it." ++ ++msgid "" ++"Choose the network(s) you want to attach to this wireless interface or fill " ++"out the create field to define a new network." ++msgstr "" ++ ++msgid "Cipher" ++msgstr "Cipher" ++ ++msgid "" ++"Click \"Generate archive\" to download a tar archive of the current " ++"configuration files. To reset the firmware to its initial state, click " ++"\"Perform reset\" (only possible with squashfs images)." ++msgstr "" ++"Click \"Generate archive\" to download a tar archive of the current " ++"configuration files. To reset the firmware to its initial state, click " ++"\"Perform reset\" (only possible with squashfs images)." ++ ++msgid "Client" ++msgstr "Client" ++ ++msgid "Client ID to send when requesting DHCP" ++msgstr "Client ID to send when requesting DHCP" ++ ++msgid "" ++"Close inactive connection after the given amount of seconds, use 0 to " ++"persist connection" ++msgstr "" ++"Close inactive connection after the given amount of seconds, use 0 to " ++"persist connection" ++ ++msgid "Close list..." ++msgstr "Close list..." ++ ++msgid "Collecting data..." ++msgstr "Collecting data..." ++ ++msgid "Command" ++msgstr "Command" ++ ++msgid "Common Configuration" ++msgstr "Common Configuration" ++ ++msgid "Compression" ++msgstr "Compression" ++ ++msgid "Configuration" ++msgstr "Configuration" ++ ++msgid "Configuration applied." ++msgstr "Configuration applied." ++ ++msgid "Configuration files will be kept." ++msgstr "Configuration files will be kept." ++ ++msgid "Confirmation" ++msgstr "Confirmation" ++ ++msgid "Connect" ++msgstr "Connect" ++ ++msgid "Connected" ++msgstr "Connected" ++ ++msgid "Connection Limit" ++msgstr "Connection Limit" ++ ++msgid "Connection to server fails when TLS cannot be used" ++msgstr "" ++ ++msgid "Connections" ++msgstr "Connections" ++ ++msgid "Country" ++msgstr "Country" ++ ++msgid "Country Code" ++msgstr "Country Code" ++ ++msgid "Cover the following interface" ++msgstr "Cover the following interface" ++ ++msgid "Cover the following interfaces" ++msgstr "Cover the following interfaces" ++ ++msgid "Create / Assign firewall-zone" ++msgstr "Create / Assign firewall-zone" ++ ++msgid "Create Interface" ++msgstr "Create Interface" ++ ++msgid "Create a bridge over multiple interfaces" ++msgstr "Create a bridge over multiple interfaces" ++ ++msgid "Critical" ++msgstr "Critical" ++ ++msgid "Cron Log Level" ++msgstr "Cron Log Level" ++ ++msgid "Custom Interface" ++msgstr "Custom Interface" ++ ++msgid "Custom delegated IPv6-prefix" ++msgstr "" ++ ++msgid "" ++"Customizes the behaviour of the device LEDs if possible." ++msgstr "" ++"Customizes the behaviour of the device LEDs if possible." ++ ++msgid "DHCP Leases" ++msgstr "DHCP Leases" ++ ++msgid "DHCP Server" ++msgstr "DHCP Server" ++ ++msgid "DHCP and DNS" ++msgstr "DHCP and DNS" ++ ++msgid "DHCP client" ++msgstr "DHCP client" ++ ++msgid "DHCP-Options" ++msgstr "DHCP-Options" ++ ++msgid "DHCPv6 Leases" ++msgstr "" ++ ++msgid "DHCPv6 client" ++msgstr "" ++ ++msgid "DHCPv6-Mode" ++msgstr "" ++ ++msgid "DHCPv6-Service" ++msgstr "" ++ ++msgid "DNS" ++msgstr "DNS" ++ ++msgid "DNS forwardings" ++msgstr "DNS forwardings" ++ ++msgid "DNS-Label / FQDN" ++msgstr "" ++ ++msgid "DS-Lite AFTR address" ++msgstr "" ++ ++msgid "DUID" ++msgstr "" ++ ++msgid "Debug" ++msgstr "Debug" ++ ++msgid "Default %d" ++msgstr "Default %d" ++ ++msgid "Default gateway" ++msgstr "Default gateway" ++ ++msgid "Default route" ++msgstr "" ++ ++msgid "Default state" ++msgstr "Default state" ++ ++msgid "Define a name for this network." ++msgstr "Define a name for this network." ++ ++msgid "" ++"Define additional DHCP options, for example " ++"\"6,192.168.2.1,192.168.2.2\" which advertises different DNS " ++"servers to clients." ++msgstr "" ++"Define additional DHCP options, for example " ++"\"6,192.168.2.1,192.168.2.2\" which advertises different DNS " ++"servers to clients." ++ ++msgid "Delete" ++msgstr "Delete" ++ ++msgid "Delete this interface" ++msgstr "Delete this interface" ++ ++msgid "Delete this network" ++msgstr "Delete this network" ++ ++msgid "Description" ++msgstr "Description" ++ ++msgid "Design" ++msgstr "Design" ++ ++msgid "Destination" ++msgstr "Destination" ++ ++msgid "Device" ++msgstr "Device" ++ ++msgid "Device Configuration" ++msgstr "Device Configuration" ++ ++msgid "Diagnostics" ++msgstr "Diagnostics" ++ ++msgid "Dial number" ++msgstr "" ++ ++msgid "Directory" ++msgstr "Directory" ++ ++msgid "Disable" ++msgstr "" ++ ++msgid "" ++"Disable DHCP for " ++"this interface." ++msgstr "" ++ ++msgid "Disable DNS setup" ++msgstr "" ++ ++msgid "Disable HW-Beacon timer" ++msgstr "Disable HW-Beacon timer" ++ ++msgid "Disabled" ++msgstr "Disabled" ++ ++msgid "Discard upstream RFC1918 responses" ++msgstr "" ++ ++msgid "Displaying only packages containing" ++msgstr "" ++ ++msgid "Distance Optimization" ++msgstr "Distance Optimization" ++ ++msgid "Distance to farthest network member in meters." ++msgstr "Distance to farthest network member in meters." ++ ++msgid "Diversity" ++msgstr "Diversity" ++ ++msgid "" ++"Dnsmasq is a combined DHCP-Server and DNS-" ++"Forwarder for NAT " ++"firewalls" ++msgstr "" ++"Dnsmasq is a combined DHCP-Server and DNS-" ++"Forwarder for NAT " ++"firewalls" ++ ++msgid "Do not cache negative replies, e.g. for not existing domains" ++msgstr "" ++ ++msgid "Do not forward requests that cannot be answered by public name servers" ++msgstr "" ++ ++msgid "Do not forward reverse lookups for local networks" ++msgstr "" ++ ++msgid "Do not send probe responses" ++msgstr "Do not send probe responses" ++ ++msgid "Domain required" ++msgstr "Domain required" ++ ++msgid "Domain whitelist" ++msgstr "" ++ ++msgid "" ++"Don't forward DNS-Requests without " ++"DNS-Name" ++msgstr "" ++"Don't forward DNS-Requests " ++"without DNS-Name" ++ ++msgid "Download and install package" ++msgstr "Download and install package" ++ ++msgid "Download backup" ++msgstr "" ++ ++msgid "Dropbear Instance" ++msgstr "" ++ ++msgid "" ++"Dropbear offers SSH network shell access " ++"and an integrated SCP server" ++msgstr "" ++"Dropbear offers SSH network shell access " ++"and an integrated SCP server" ++ ++msgid "Dual-Stack Lite (RFC6333)" ++msgstr "" ++ ++msgid "Dynamic DHCP" ++msgstr "" ++"Dynamic DHCP" ++ ++msgid "Dynamic tunnel" ++msgstr "" ++ ++msgid "" ++"Dynamically allocate DHCP addresses for clients. If disabled, only clients " ++"having static leases will be served." ++msgstr "" ++ ++msgid "EAP-Method" ++msgstr "EAP-Method" ++ ++msgid "Edit" ++msgstr "Edit" ++ ++msgid "" ++"Edit the raw configuration data above to fix any error and hit \"Save\" to " ++"reload the page." ++msgstr "" ++ ++msgid "Edit this interface" ++msgstr "" ++ ++msgid "Edit this network" ++msgstr "" ++ ++msgid "Emergency" ++msgstr "" ++ ++msgid "Enable" ++msgstr "" ++ ++msgid "Enable STP" ++msgstr "Enable STP" ++ ++msgid "Enable HE.net dynamic endpoint update" ++msgstr "" ++ ++msgid "Enable IPv6 negotiation on the PPP link" ++msgstr "" ++ ++msgid "Enable Jumbo Frame passthrough" ++msgstr "" ++ ++msgid "Enable NTP client" ++msgstr "" ++ ++msgid "Enable TFTP server" ++msgstr "" ++ ++msgid "Enable VLAN functionality" ++msgstr "" ++ ++msgid "Enable WPS pushbutton, requires WPA(2)-PSK" ++msgstr "" ++ ++msgid "Enable learning and aging" ++msgstr "" ++ ++msgid "Enable mirroring of incoming packets" ++msgstr "" ++ ++msgid "Enable mirroring of outgoing packets" ++msgstr "" ++ ++msgid "Enable this mount" ++msgstr "" ++ ++msgid "Enable this swap" ++msgstr "" ++ ++msgid "Enable/Disable" ++msgstr "Enable/Disable" ++ ++msgid "Enabled" ++msgstr "Enabled" ++ ++msgid "Enables the Spanning Tree Protocol on this bridge" ++msgstr "Enables the Spanning Tree Protocol on this bridge" ++ ++msgid "Encapsulation mode" ++msgstr "" ++ ++msgid "Encryption" ++msgstr "Encryption" ++ ++msgid "Erasing..." ++msgstr "" ++ ++msgid "Error" ++msgstr "Error" ++ ++msgid "Ethernet Adapter" ++msgstr "Ethernet Adapter" ++ ++msgid "Ethernet Switch" ++msgstr "Ethernet Switch" ++ ++msgid "Expand hosts" ++msgstr "" ++ ++msgid "Expires" ++msgstr "" ++ ++msgid "" ++"Expiry time of leased addresses, minimum is 2 minutes (2m)." ++msgstr "" ++ ++msgid "External" ++msgstr "" ++ ++msgid "External system log server" ++msgstr "" ++ ++msgid "External system log server port" ++msgstr "" ++ ++msgid "Fast Frames" ++msgstr "Fast Frames" ++ ++msgid "File" ++msgstr "" ++ ++msgid "Filename of the boot image advertised to clients" ++msgstr "" ++ ++msgid "Filesystem" ++msgstr "Filesystem" ++ ++msgid "Filter" ++msgstr "Filter" ++ ++msgid "Filter private" ++msgstr "Filter private" ++ ++msgid "Filter useless" ++msgstr "Filter useless" ++ ++msgid "Find and join network" ++msgstr "" ++ ++msgid "Find package" ++msgstr "Find package" ++ ++msgid "Finish" ++msgstr "" ++ ++msgid "Firewall" ++msgstr "Firewall" ++ ++msgid "Firewall Settings" ++msgstr "Firewall Settings" ++ ++msgid "Firewall Status" ++msgstr "Firewall Status" ++ ++msgid "Firmware Version" ++msgstr "" ++ ++msgid "Fixed source port for outbound DNS queries" ++msgstr "" ++ ++msgid "Flags" ++msgstr "Flags" ++ ++msgid "Flash Firmware" ++msgstr "Flash Firmware" ++ ++msgid "Flash image..." ++msgstr "" ++ ++msgid "Flash new firmware image" ++msgstr "" ++ ++msgid "Flash operations" ++msgstr "" ++ ++msgid "Flashing..." ++msgstr "" ++ ++msgid "Force" ++msgstr "Force" ++ ++msgid "Force CCMP (AES)" ++msgstr "" ++ ++msgid "Force DHCP on this network even if another server is detected." ++msgstr "" ++ ++msgid "Force TKIP" ++msgstr "" ++ ++msgid "Force TKIP and CCMP (AES)" ++msgstr "" ++ ++msgid "Forward DHCP traffic" ++msgstr "" ++ ++msgid "Forward broadcast traffic" ++msgstr "" ++ ++msgid "Forwarding mode" ++msgstr "" ++ ++msgid "Fragmentation Threshold" ++msgstr "Fragmentation Threshold" ++ ++msgid "Frame Bursting" ++msgstr "Frame Bursting" ++ ++msgid "Free" ++msgstr "" ++ ++msgid "Free space" ++msgstr "" ++ ++msgid "GHz" ++msgstr "" ++ ++msgid "GPRS only" ++msgstr "" ++ ++msgid "Gateway" ++msgstr "" ++ ++msgid "Gateway ports" ++msgstr "" ++ ++msgid "General Settings" ++msgstr "" ++ ++msgid "General Setup" ++msgstr "General Setup" ++ ++msgid "Generate archive" ++msgstr "" ++ ++msgid "Generic 802.11%s Wireless Controller" ++msgstr "" ++ ++msgid "Given password confirmation did not match, password not changed!" ++msgstr "" ++ ++msgid "Global network options" ++msgstr "" ++ ++msgid "Go to password configuration..." ++msgstr "" ++ ++msgid "Go to relevant configuration page" ++msgstr "Go to relevant configuration page" ++ ++msgid "Guest" ++msgstr "" ++ ++msgid "HE.net password" ++msgstr "" ++ ++msgid "HE.net username" ++msgstr "" ++ ++msgid "Handler" ++msgstr "Handler" ++ ++msgid "Hang Up" ++msgstr "Hang Up" ++ ++msgid "Heartbeat" ++msgstr "" ++ ++msgid "" ++"Here you can configure the basic aspects of your device like its hostname or " ++"the timezone." ++msgstr "" ++"Here you can configure the basic aspects of your device like its hostname or " ++"the timezone." ++ ++msgid "" ++"Here you can paste public SSH-Keys (one per line) for SSH public-key " ++"authentication." ++msgstr "" ++ ++msgid "Hermes 802.11b Wireless Controller" ++msgstr "" ++ ++msgid "Hide ESSID" ++msgstr "Hide ESSID" ++ ++msgid "Host entries" ++msgstr "Host entries" ++ ++msgid "Host expiry timeout" ++msgstr "" ++ ++msgid "Host-IP or Network" ++msgstr "Host-IP or Network" ++ ++msgid "Hostname" ++msgstr "Hostname" ++ ++msgid "Hostname to send when requesting DHCP" ++msgstr "" ++ ++msgid "Hostnames" ++msgstr "Hostnames" ++ ++msgid "Hybrid" ++msgstr "" ++ ++msgid "IP address" ++msgstr "IP address" ++ ++msgid "IPv4" ++msgstr "" ++ ++msgid "IPv4 Firewall" ++msgstr "" ++ ++msgid "IPv4 WAN Status" ++msgstr "" ++ ++msgid "IPv4 address" ++msgstr "" ++ ++msgid "IPv4 and IPv6" ++msgstr "" ++ ++msgid "IPv4 assignment length" ++msgstr "" ++ ++msgid "IPv4 broadcast" ++msgstr "" ++ ++msgid "IPv4 gateway" ++msgstr "" ++ ++msgid "IPv4 netmask" ++msgstr "" ++ ++msgid "IPv4 only" ++msgstr "" ++ ++msgid "IPv4 prefix length" ++msgstr "" ++ ++msgid "IPv4-Address" ++msgstr "" ++ ++msgid "IPv6" ++msgstr "IPv6" ++ ++msgid "IPv6 Firewall" ++msgstr "" ++ ++msgid "IPv6 Neighbours" ++msgstr "" ++ ++msgid "IPv6 Settings" ++msgstr "" ++ ++msgid "IPv6 ULA-Prefix" ++msgstr "" ++ ++msgid "IPv6 WAN Status" ++msgstr "" ++ ++msgid "IPv6 address" ++msgstr "" ++ ++msgid "IPv6 address delegated to the local tunnel endpoint (optional)" ++msgstr "" ++ ++msgid "IPv6 assignment hint" ++msgstr "" ++ ++msgid "IPv6 assignment length" ++msgstr "" ++ ++msgid "IPv6 gateway" ++msgstr "" ++ ++msgid "IPv6 only" ++msgstr "" ++ ++msgid "IPv6 prefix" ++msgstr "" ++ ++msgid "IPv6 prefix length" ++msgstr "" ++ ++msgid "IPv6 routed prefix" ++msgstr "" ++ ++msgid "IPv6-Address" ++msgstr "" ++ ++msgid "IPv6-in-IPv4 (RFC4213)" ++msgstr "" ++ ++msgid "IPv6-over-IPv4 (6rd)" ++msgstr "" ++ ++msgid "IPv6-over-IPv4 (6to4)" ++msgstr "" ++ ++msgid "Identity" ++msgstr "Identity" ++ ++msgid "" ++"If specified, mount the device by its UUID instead of a fixed device node" ++msgstr "" ++ ++msgid "" ++"If specified, mount the device by the partition label instead of a fixed " ++"device node" ++msgstr "" ++ ++msgid "If unchecked, no default route is configured" ++msgstr "" ++ ++msgid "If unchecked, the advertised DNS server addresses are ignored" ++msgstr "" ++ ++msgid "" ++"If your physical memory is insufficient unused data can be temporarily " ++"swapped to a swap-device resulting in a higher amount of usable RAM. Be aware that swapping data is a very " ++"slow process as the swap-device cannot be accessed with the high datarates " ++"of the RAM." ++msgstr "" ++"If your physical memory is insufficient unused data can be temporarily " ++"swapped to a swap-device resulting in a higher amount of usable RAM. Be aware that swapping data is a very " ++"slow process as the swap-device cannot be accessed with the high datarates " ++"of the RAM." ++ ++msgid "Ignore Hosts files" ++msgstr "" ++ ++msgid "Ignore interface" ++msgstr "Ignore interface" ++ ++msgid "Ignore resolve file" ++msgstr "Ignore resolve file" ++ ++msgid "Image" ++msgstr "" ++ ++msgid "In" ++msgstr "In" ++ ++msgid "Inactivity timeout" ++msgstr "" ++ ++msgid "Inbound:" ++msgstr "" ++ ++msgid "Info" ++msgstr "" ++ ++msgid "Initscript" ++msgstr "Initscript" ++ ++msgid "Initscripts" ++msgstr "Initscripts" ++ ++msgid "Install" ++msgstr "Install" ++ ++msgid "Install iputils-traceroute6 for IPv6 traceroute" ++msgstr "" ++ ++msgid "Install package %q" ++msgstr "" ++ ++msgid "Install protocol extensions..." ++msgstr "" ++ ++msgid "Installed packages" ++msgstr "" ++ ++msgid "Interface" ++msgstr "Interface" ++ ++msgid "Interface Configuration" ++msgstr "" ++ ++msgid "Interface Overview" ++msgstr "" ++ ++msgid "Interface is reconnecting..." ++msgstr "" ++ ++msgid "Interface is shutting down..." ++msgstr "" ++ ++msgid "Interface not present or not connected yet." ++msgstr "" ++ ++msgid "Interface reconnected" ++msgstr "" ++ ++msgid "Interface shut down" ++msgstr "" ++ ++msgid "Interfaces" ++msgstr "Interfaces" ++ ++msgid "Internal" ++msgstr "" ++ ++msgid "Internal Server Error" ++msgstr "" ++ ++msgid "Invalid" ++msgstr "Invalid input value" ++ ++msgid "Invalid VLAN ID given! Only IDs between %d and %d are allowed." ++msgstr "" ++ ++msgid "Invalid VLAN ID given! Only unique IDs are allowed" ++msgstr "" ++ ++msgid "Invalid username and/or password! Please try again." ++msgstr "Invalid username and/or password! Please try again." ++ ++#, fuzzy ++msgid "" ++"It appears that you are trying to flash an image that does not fit into the " ++"flash memory, please verify the image file!" ++msgstr "" ++"It appears that you try to flash an image that does not fit into the flash " ++"memory, please verify the image file!" ++ ++msgid "Java Script required!" ++msgstr "" ++ ++msgid "Join Network" ++msgstr "Join Network" ++ ++msgid "Join Network: Settings" ++msgstr "" ++ ++msgid "Join Network: Wireless Scan" ++msgstr "" ++ ++msgid "Keep settings" ++msgstr "" ++ ++msgid "Kernel Log" ++msgstr "Kernel Log" ++ ++msgid "Kernel Version" ++msgstr "" ++ ++msgid "Key" ++msgstr "Key" ++ ++msgid "Key #%d" ++msgstr "" ++ ++msgid "Kill" ++msgstr "Kill" ++ ++msgid "L2TP" ++msgstr "" ++ ++msgid "L2TP Server" ++msgstr "" ++ ++msgid "LCP echo failure threshold" ++msgstr "" ++ ++msgid "LCP echo interval" ++msgstr "" ++ ++msgid "LLC" ++msgstr "" ++ ++msgid "Label" ++msgstr "" ++ ++msgid "Language" ++msgstr "Language" ++ ++msgid "Language and Style" ++msgstr "" ++ ++msgid "Leaf" ++msgstr "" ++ ++msgid "Lease validity time" ++msgstr "" ++ ++msgid "Leasefile" ++msgstr "Leasefile" ++ ++msgid "Leasetime" ++msgstr "Leasetime" ++ ++msgid "Leasetime remaining" ++msgstr "Leasetime remaining" ++ ++msgid "Leave empty to autodetect" ++msgstr "" ++ ++msgid "Leave empty to use the current WAN address" ++msgstr "" ++ ++msgid "Legend:" ++msgstr "" ++ ++msgid "Limit" ++msgstr "Limit" ++ ++msgid "Line Attenuation" ++msgstr "" ++ ++msgid "Line Speed" ++msgstr "" ++ ++msgid "Line State" ++msgstr "" ++ ++msgid "Link On" ++msgstr "Link On" ++ ++msgid "" ++"List of DNS servers to forward " ++"requests to" ++msgstr "" ++ ++msgid "List of domains to allow RFC1918 responses for" ++msgstr "" ++ ++msgid "List of hosts that supply bogus NX domain results" ++msgstr "" ++ ++msgid "Listen only on the given interface or, if unspecified, on all" ++msgstr "" ++ ++msgid "Listening port for inbound DNS queries" ++msgstr "" ++ ++msgid "Load" ++msgstr "Load" ++ ++msgid "Load Average" ++msgstr "" ++ ++msgid "Loading" ++msgstr "" ++ ++msgid "Local IPv4 address" ++msgstr "" ++ ++msgid "Local IPv6 address" ++msgstr "" ++ ++msgid "Local Startup" ++msgstr "" ++ ++msgid "Local Time" ++msgstr "Local Time" ++ ++msgid "Local domain" ++msgstr "" ++ ++msgid "" ++"Local domain specification. Names matching this domain are never forwarded " ++"and are resolved from DHCP or hosts files only" ++msgstr "" ++ ++msgid "Local domain suffix appended to DHCP names and hosts file entries" ++msgstr "" ++ ++msgid "Local server" ++msgstr "" ++ ++msgid "" ++"Localise hostname depending on the requesting subnet if multiple IPs are " ++"available" ++msgstr "" ++ ++msgid "Localise queries" ++msgstr "Localise queries" ++ ++msgid "Locked to channel %d used by: %s" ++msgstr "" ++ ++msgid "Log output level" ++msgstr "" ++ ++msgid "Log queries" ++msgstr "Log queries" ++ ++msgid "Logging" ++msgstr "" ++ ++msgid "Login" ++msgstr "Login" ++ ++msgid "Logout" ++msgstr "Logout" ++ ++msgid "Lowest leased address as offset from the network address." ++msgstr "" ++ ++msgid "MAC-Address" ++msgstr "" ++ ++msgid "MAC-Address Filter" ++msgstr "MAC-Address Filter" ++ ++msgid "MAC-Filter" ++msgstr "MAC-Filter" ++ ++msgid "MAC-List" ++msgstr "MAC-List" ++ ++msgid "MB/s" ++msgstr "" ++ ++msgid "MHz" ++msgstr "" ++ ++msgid "MTU" ++msgstr "" ++ ++msgid "" ++"Make sure to clone the root filesystem using something like the commands " ++"below:" ++msgstr "" ++ ++msgid "Maximum Rate" ++msgstr "Maximum Rate" ++ ++msgid "Maximum allowed number of active DHCP leases" ++msgstr "" ++ ++msgid "Maximum allowed number of concurrent DNS queries" ++msgstr "" ++ ++msgid "Maximum allowed size of EDNS.0 UDP packets" ++msgstr "" ++ ++msgid "Maximum amount of seconds to wait for the modem to become ready" ++msgstr "" ++ ++msgid "Maximum hold time" ++msgstr "Maximum hold time" ++ ++msgid "Maximum number of leased addresses." ++msgstr "" ++ ++msgid "Mbit/s" ++msgstr "" ++ ++msgid "Memory" ++msgstr "Memory" ++ ++msgid "Memory usage (%)" ++msgstr "Memory usage (%)" ++ ++msgid "Metric" ++msgstr "Metric" ++ ++msgid "Minimum Rate" ++msgstr "Minimum Rate" ++ ++msgid "Minimum hold time" ++msgstr "Minimum hold time" ++ ++msgid "Mirror monitor port" ++msgstr "" ++ ++msgid "Mirror source port" ++msgstr "" ++ ++msgid "Missing protocol extension for proto %q" ++msgstr "" ++ ++msgid "Mode" ++msgstr "Mode" ++ ++msgid "Model" ++msgstr "" ++ ++msgid "Modem device" ++msgstr "Modem device" ++ ++msgid "Modem init timeout" ++msgstr "" ++ ++msgid "Monitor" ++msgstr "Monitor" ++ ++msgid "Mount Entry" ++msgstr "" ++ ++msgid "Mount Point" ++msgstr "Mount Point" ++ ++msgid "Mount Points" ++msgstr "Mount Points" ++ ++msgid "Mount Points - Mount Entry" ++msgstr "" ++ ++msgid "Mount Points - Swap Entry" ++msgstr "" ++ ++msgid "" ++"Mount Points define at which point a memory device will be attached to the " ++"filesystem" ++msgstr "" ++"Mount Points define at which point a memory device will be attached to the " ++"filesystem" ++ ++msgid "Mount options" ++msgstr "" ++ ++msgid "Mount point" ++msgstr "" ++ ++msgid "Mounted file systems" ++msgstr "Mounted file systems" ++ ++msgid "Move down" ++msgstr "" ++ ++msgid "Move up" ++msgstr "" ++ ++msgid "Multicast Rate" ++msgstr "Multicast Rate" ++ ++msgid "Multicast address" ++msgstr "" ++ ++msgid "NAS ID" ++msgstr "NAS ID" ++ ++msgid "NDP-Proxy" ++msgstr "" ++ ++msgid "NTP server candidates" ++msgstr "" ++ ++msgid "NTP sync time-out" ++msgstr "" ++ ++msgid "Name" ++msgstr "Name" ++ ++msgid "Name of the new interface" ++msgstr "" ++ ++msgid "Name of the new network" ++msgstr "Name of the new network" ++ ++msgid "Navigation" ++msgstr "Navigation" ++ ++msgid "Netmask" ++msgstr "" ++ ++msgid "Network" ++msgstr "Network" ++ ++msgid "Network Utilities" ++msgstr "" ++ ++msgid "Network boot image" ++msgstr "" ++ ++msgid "Network without interfaces." ++msgstr "" ++ ++msgid "Next »" ++msgstr "" ++ ++msgid "No DHCP Server configured for this interface" ++msgstr "" ++ ++msgid "No chains in this table" ++msgstr "No chains in this table" ++ ++msgid "No files found" ++msgstr "" ++ ++msgid "No information available" ++msgstr "" ++ ++msgid "No negative cache" ++msgstr "" ++ ++msgid "No network configured on this device" ++msgstr "" ++ ++msgid "No network name specified" ++msgstr "" ++ ++msgid "No package lists available" ++msgstr "" ++ ++msgid "No password set!" ++msgstr "" ++ ++msgid "No rules in this chain" ++msgstr "No rules in this chain" ++ ++msgid "No zone assigned" ++msgstr "" ++ ++msgid "Noise" ++msgstr "Noise" ++ ++msgid "Noise Margin" ++msgstr "" ++ ++msgid "Noise:" ++msgstr "" ++ ++msgid "None" ++msgstr "" ++ ++msgid "Normal" ++msgstr "" ++ ++msgid "Not Found" ++msgstr "" ++ ++msgid "Not associated" ++msgstr "" ++ ++msgid "Not connected" ++msgstr "" ++ ++msgid "Note: Configuration files will be erased." ++msgstr "" ++ ++msgid "Notice" ++msgstr "" ++ ++msgid "Nslookup" ++msgstr "" ++ ++msgid "OK" ++msgstr "OK" ++ ++msgid "OPKG-Configuration" ++msgstr "OPKG-Configuration" ++ ++msgid "Off-State Delay" ++msgstr "" ++ ++msgid "" ++"On this page you can configure the network interfaces. You can bridge " ++"several interfaces by ticking the \"bridge interfaces\" field and enter the " ++"names of several network interfaces separated by spaces. You can also use " ++"VLAN notation " ++"INTERFACE.VLANNR (e.g.: " ++"eth0.1)." ++msgstr "" ++"On this page you can configure the network interfaces. You can bridge " ++"several interfaces by ticking the \"bridge interfaces\" field and enter the " ++"names of several network interfaces separated by spaces. You can also use " ++"VLAN notation " ++"INTERFACE.VLANNR (e.g.: " ++"eth0.1)." ++ ++msgid "On-State Delay" ++msgstr "" ++ ++msgid "One of hostname or mac address must be specified!" ++msgstr "" ++ ++msgid "One or more fields contain invalid values!" ++msgstr "" ++ ++msgid "One or more required fields have no value!" ++msgstr "" ++ ++msgid "Open list..." ++msgstr "" ++ ++msgid "OpenConnect (CISCO AnyConnect)" ++msgstr "" ++ ++msgid "Operating frequency" ++msgstr "" ++ ++msgid "Option changed" ++msgstr "" ++ ++msgid "Option removed" ++msgstr "" ++ ++msgid "Optional, specify to override default server (tic.sixxs.net)" ++msgstr "" ++ ++msgid "Optional, use when the SIXXS account has more than one tunnel" ++msgstr "" ++ ++msgid "Options" ++msgstr "Options" ++ ++msgid "Other:" ++msgstr "" ++ ++msgid "Out" ++msgstr "Out" ++ ++msgid "Outbound:" ++msgstr "" ++ ++msgid "Outdoor Channels" ++msgstr "Outdoor Channels" ++ ++msgid "Output Interface" ++msgstr "" ++ ++msgid "Override MAC address" ++msgstr "" ++ ++msgid "Override MTU" ++msgstr "" ++ ++msgid "Override the gateway in DHCP responses" ++msgstr "" ++ ++msgid "" ++"Override the netmask sent to clients. Normally it is calculated from the " ++"subnet that is served." ++msgstr "" ++ ++msgid "Override the table used for internal routes" ++msgstr "" ++ ++msgid "Overview" ++msgstr "Overview" ++ ++msgid "Owner" ++msgstr "Owner" ++ ++msgid "PAP/CHAP password" ++msgstr "" ++ ++msgid "PAP/CHAP username" ++msgstr "" ++ ++msgid "PID" ++msgstr "PID" ++ ++msgid "PIN" ++msgstr "" ++ ++msgid "PPP" ++msgstr "" ++ ++msgid "PPPoA Encapsulation" ++msgstr "PPPoA Encapsulation" ++ ++msgid "PPPoATM" ++msgstr "" ++ ++msgid "PPPoE" ++msgstr "" ++ ++msgid "PPtP" ++msgstr "" ++ ++msgid "Package libiwinfo required!" ++msgstr "" ++ ++msgid "Package lists are older than 24 hours" ++msgstr "" ++ ++msgid "Package name" ++msgstr "Package name" ++ ++msgid "Packets" ++msgstr "Packets" ++ ++msgid "Part of zone %q" ++msgstr "" ++ ++msgid "Password" ++msgstr "Password" ++ ++msgid "Password authentication" ++msgstr "Password authentication" ++ ++msgid "Password of Private Key" ++msgstr "Password of Private Key" ++ ++msgid "Password successfully changed!" ++msgstr "" ++ ++msgid "Path" ++msgstr "Path" ++ ++msgid "Path to CA-Certificate" ++msgstr "Path to CA-Certificate" ++ ++msgid "Path to Client-Certificate" ++msgstr "" ++ ++msgid "Path to Private Key" ++msgstr "Path to Private Key" ++ ++msgid "Path to executable which handles the button event" ++msgstr "" ++ ++msgid "Peak:" ++msgstr "" ++ ++msgid "Perform reboot" ++msgstr "Perform reboot" ++ ++msgid "Perform reset" ++msgstr "" ++ ++msgid "Phy Rate:" ++msgstr "" ++ ++msgid "Physical Settings" ++msgstr "Physical Settings" ++ ++msgid "Ping" ++msgstr "" ++ ++msgid "Pkts." ++msgstr "Pkts." ++ ++msgid "Please enter your username and password." ++msgstr "Please enter your username and password." ++ ++msgid "Please wait: Device rebooting..." ++msgstr "Please wait: Device rebooting..." ++ ++msgid "Policy" ++msgstr "Policy" ++ ++msgid "Port" ++msgstr "Port" ++ ++msgid "Port %d" ++msgstr "" ++ ++msgid "Port %d is untagged in multiple VLANs!" ++msgstr "" ++ ++msgid "Port status:" ++msgstr "" ++ ++msgid "" ++"Presume peer to be dead after given amount of LCP echo failures, use 0 to " ++"ignore failures" ++msgstr "" ++ ++msgid "Prevents client-to-client communication" ++msgstr "Prevents client-to-client communication" ++ ++msgid "Prism2/2.5/3 802.11b Wireless Controller" ++msgstr "" ++ ++msgid "Proceed" ++msgstr "Proceed" ++ ++msgid "Processes" ++msgstr "Processes" ++ ++msgid "Prot." ++msgstr "Prot." ++ ++msgid "Protocol" ++msgstr "Protocol" ++ ++msgid "Protocol family" ++msgstr "" ++ ++msgid "Protocol of the new interface" ++msgstr "" ++ ++msgid "Protocol support is not installed" ++msgstr "" ++ ++msgid "Provide NTP server" ++msgstr "" ++ ++msgid "Provide new network" ++msgstr "" ++ ++msgid "Pseudo Ad-Hoc (ahdemo)" ++msgstr "Pseudo Ad-Hoc (ahdemo)" ++ ++msgid "Public prefix routed to this device for distribution to clients." ++msgstr "" ++ ++msgid "Quality" ++msgstr "" ++ ++msgid "RTS/CTS Threshold" ++msgstr "RTS/CTS Threshold" ++ ++msgid "RX" ++msgstr "RX" ++ ++msgid "RX Rate" ++msgstr "" ++ ++msgid "RaLink 802.11%s Wireless Controller" ++msgstr "" ++ ++msgid "Radius-Accounting-Port" ++msgstr "" ++ ++msgid "Radius-Accounting-Secret" ++msgstr "" ++ ++msgid "Radius-Accounting-Server" ++msgstr "" ++ ++msgid "Radius-Authentication-Port" ++msgstr "" ++ ++msgid "Radius-Authentication-Secret" ++msgstr "" ++ ++msgid "Radius-Authentication-Server" ++msgstr "" ++ ++msgid "" ++"Read /etc/ethers to configure the DHCP-Server" ++msgstr "" ++"Read /etc/ethers to configure the DHCP-Server" ++ ++msgid "" ++"Really delete this interface? The deletion cannot be undone!\\nYou might " ++"lose access to this device if you are connected via this interface." ++msgstr "" ++ ++msgid "" ++"Really delete this wireless network? The deletion cannot be undone!\\nYou " ++"might lose access to this device if you are connected via this network." ++msgstr "" ++ ++msgid "Really reset all changes?" ++msgstr "" ++ ++msgid "" ++"Really shut down network?\\nYou might lose access to this device if you are " ++"connected via this interface." ++msgstr "" ++ ++msgid "" ++"Really shutdown interface \"%s\" ?\\nYou might lose access to this device if " ++"you are connected via this interface." ++msgstr "" ++ ++msgid "Really switch protocol?" ++msgstr "" ++ ++msgid "Realtime Connections" ++msgstr "" ++ ++msgid "Realtime Graphs" ++msgstr "" ++ ++msgid "Realtime Load" ++msgstr "" ++ ++msgid "Realtime Traffic" ++msgstr "" ++ ++msgid "Realtime Wireless" ++msgstr "" ++ ++msgid "Rebind protection" ++msgstr "" ++ ++msgid "Reboot" ++msgstr "Reboot" ++ ++msgid "Rebooting..." ++msgstr "" ++ ++msgid "Reboots the operating system of your device" ++msgstr "Reboots the operating system of your device" ++ ++msgid "Receive" ++msgstr "Receive" ++ ++msgid "Receiver Antenna" ++msgstr "Receiver Antenna" ++ ++msgid "Reconnect this interface" ++msgstr "" ++ ++msgid "Reconnecting interface" ++msgstr "" ++ ++msgid "References" ++msgstr "References" ++ ++msgid "Regulatory Domain" ++msgstr "Regulatory Domain" ++ ++msgid "Relay" ++msgstr "" ++ ++msgid "Relay Bridge" ++msgstr "" ++ ++msgid "Relay between networks" ++msgstr "" ++ ++msgid "Relay bridge" ++msgstr "" ++ ++msgid "Remote IPv4 address" ++msgstr "" ++ ++msgid "Remove" ++msgstr "Remove" ++ ++msgid "Repeat scan" ++msgstr "Repeat scan" ++ ++msgid "Replace entry" ++msgstr "Replace entry" ++ ++msgid "Replace wireless configuration" ++msgstr "" ++ ++msgid "Request IPv6-address" ++msgstr "" ++ ++msgid "Request IPv6-prefix of length" ++msgstr "" ++ ++msgid "Require TLS" ++msgstr "" ++ ++msgid "Required for certain ISPs, e.g. Charter with DOCSIS 3" ++msgstr "" ++ ++msgid "Reset" ++msgstr "Reset" ++ ++msgid "Reset Counters" ++msgstr "Reset Counters" ++ ++msgid "Reset to defaults" ++msgstr "" ++ ++msgid "Resolv and Hosts Files" ++msgstr "" ++ ++msgid "Resolve file" ++msgstr "" ++ ++msgid "Restart" ++msgstr "Restart" ++ ++msgid "Restart Firewall" ++msgstr "Restart Firewall" ++ ++msgid "Restore backup" ++msgstr "Restore backup" ++ ++msgid "Reveal/hide password" ++msgstr "" ++ ++msgid "Revert" ++msgstr "Revert" ++ ++msgid "Root" ++msgstr "" ++ ++msgid "Root directory for files served via TFTP" ++msgstr "" ++ ++msgid "Root preparation" ++msgstr "" ++ ++msgid "Routed IPv6 prefix for downstream interfaces" ++msgstr "" ++ ++msgid "Router Advertisement-Service" ++msgstr "" ++ ++msgid "Router Password" ++msgstr "" ++ ++msgid "Routes" ++msgstr "Routes" ++ ++msgid "" ++"Routes specify over which interface and gateway a certain host or network " ++"can be reached." ++msgstr "" ++"Routes specify over which interface and gateway a certain host or network " ++"can be reached." ++ ++msgid "Rule #" ++msgstr "Rule #" ++ ++msgid "Run a filesystem check before mounting the device" ++msgstr "" ++ ++msgid "Run filesystem check" ++msgstr "" ++ ++msgid "" ++"SIXXS supports TIC only, for static tunnels using IP protocol 41 (RFC4213) " ++"use 6in4 instead" ++msgstr "" ++ ++msgid "SIXXS-handle[/Tunnel-ID]" ++msgstr "" ++ ++msgid "SSH Access" ++msgstr "" ++ ++msgid "SSH-Keys" ++msgstr "" ++ ++msgid "SSID" ++msgstr "SSID" ++ ++msgid "Save" ++msgstr "Save" ++ ++msgid "Save & Apply" ++msgstr "Save & Apply" ++ ++msgid "Save & Apply" ++msgstr "" ++ ++msgid "Scan" ++msgstr "Scan" ++ ++msgid "Scheduled Tasks" ++msgstr "Scheduled Tasks" ++ ++msgid "Section added" ++msgstr "" ++ ++msgid "Section removed" ++msgstr "" ++ ++msgid "See \"mount\" manpage for details" ++msgstr "" ++ ++msgid "" ++"Send LCP echo requests at the given interval in seconds, only effective in " ++"conjunction with failure threshold" ++msgstr "" ++ ++msgid "Separate Clients" ++msgstr "Separate Clients" ++ ++msgid "Separate WDS" ++msgstr "Separate WDS" ++ ++msgid "Server Settings" ++msgstr "" ++ ++msgid "Server password" ++msgstr "" ++ ++msgid "" ++"Server password, enter the specific password of the tunnel when the username " ++"contains the tunnel ID" ++msgstr "" ++ ++msgid "Server username" ++msgstr "" ++ ++msgid "Service Name" ++msgstr "" ++ ++msgid "Service Type" ++msgstr "" ++ ++msgid "Services" ++msgstr "Services" ++ ++msgid "Set up Time Synchronization" ++msgstr "" ++ ++msgid "Setup DHCP Server" ++msgstr "" ++ ++msgid "Show current backup file list" ++msgstr "" ++ ++msgid "Shutdown this interface" ++msgstr "" ++ ++msgid "Shutdown this network" ++msgstr "" ++ ++msgid "Signal" ++msgstr "Signal" ++ ++msgid "Signal:" ++msgstr "" ++ ++msgid "Size" ++msgstr "Size" ++ ++msgid "Skip" ++msgstr "Skip" ++ ++msgid "Skip to content" ++msgstr "Skip to content" ++ ++msgid "Skip to navigation" ++msgstr "Skip to navigation" ++ ++msgid "Slot time" ++msgstr "Slot time" ++ ++msgid "Software" ++msgstr "Software" ++ ++msgid "Some fields are invalid, cannot save values!" ++msgstr "" ++ ++msgid "Sorry, the object you requested was not found." ++msgstr "" ++ ++msgid "Sorry, the server encountered an unexpected error." ++msgstr "" ++ ++msgid "" ++"Sorry, there is no sysupgrade support present; a new firmware image must be " ++"flashed manually. Please refer to the OpenWrt wiki for device specific " ++"install instructions." ++msgstr "" ++ ++msgid "Sort" ++msgstr "" ++ ++msgid "Source" ++msgstr "Source" ++ ++msgid "Source routing" ++msgstr "" ++ ++msgid "Specifies the button state to handle" ++msgstr "Specifies the button state to handle" ++ ++msgid "Specifies the directory the device is attached to" ++msgstr "" ++ ++msgid "Specifies the listening port of this Dropbear instance" ++msgstr "" ++ ++msgid "" ++"Specifies the maximum amount of failed ARP requests until hosts are presumed " ++"to be dead" ++msgstr "" ++ ++msgid "" ++"Specifies the maximum amount of seconds after which hosts are presumed to be " ++"dead" ++msgstr "" ++ ++msgid "Specify the secret encryption key here." ++msgstr "" ++ ++msgid "Start" ++msgstr "Start" ++ ++msgid "Start priority" ++msgstr "Start priority" ++ ++msgid "Startup" ++msgstr "" ++ ++msgid "Static IPv4 Routes" ++msgstr "Static IPv4 Routes" ++ ++msgid "Static IPv6 Routes" ++msgstr "Static IPv6 Routes" ++ ++msgid "Static Leases" ++msgstr "Static Leases" ++ ++msgid "Static Routes" ++msgstr "Static Routes" ++ ++msgid "Static WDS" ++msgstr "" ++ ++msgid "Static address" ++msgstr "" ++ ++msgid "" ++"Static leases are used to assign fixed IP addresses and symbolic hostnames " ++"to DHCP clients. They are also required for non-dynamic interface " ++"configurations where only hosts with a corresponding lease are served." ++msgstr "" ++ ++msgid "Status" ++msgstr "Status" ++ ++msgid "Stop" ++msgstr "Stop" ++ ++msgid "Strict order" ++msgstr "Strict order" ++ ++msgid "Submit" ++msgstr "Submit" ++ ++msgid "Swap" ++msgstr "" ++ ++msgid "Swap Entry" ++msgstr "" ++ ++msgid "Switch" ++msgstr "Switch" ++ ++msgid "Switch %q" ++msgstr "" ++ ++msgid "Switch %q (%s)" ++msgstr "" ++ ++msgid "Switch protocol" ++msgstr "" ++ ++msgid "Sync with browser" ++msgstr "" ++ ++msgid "Synchronizing..." ++msgstr "" ++ ++msgid "System" ++msgstr "System" ++ ++msgid "System Log" ++msgstr "System Log" ++ ++msgid "System Properties" ++msgstr "" ++ ++msgid "System log buffer size" ++msgstr "" ++ ++msgid "TCP:" ++msgstr "" ++ ++msgid "TFTP Settings" ++msgstr "" ++ ++msgid "TFTP server root" ++msgstr "" ++ ++msgid "TX" ++msgstr "TX" ++ ++msgid "TX Rate" ++msgstr "" ++ ++msgid "Table" ++msgstr "Table" ++ ++msgid "Target" ++msgstr "Target" ++ ++msgid "Terminate" ++msgstr "Terminate" ++ ++msgid "" ++"The Device Configuration section covers physical settings of the " ++"radio hardware such as channel, transmit power or antenna selection which " ++"are shared among all defined wireless networks (if the radio hardware is " ++"multi-SSID capable). Per network settings like encryption or operation mode " ++"are grouped in the Interface Configuration." ++msgstr "" ++ ++msgid "" ++"The libiwinfo-lua package is not installed. You must install this " ++"component for working wireless configuration!" ++msgstr "" ++ ++msgid "" ++"The HE.net endpoint update configuration changed, you must now use the plain " ++"username instead of the user ID!" ++msgstr "" ++ ++msgid "" ++"The IPv6 prefix assigned to the provider, usually ends with ::" ++msgstr "" ++ ++msgid "" ++"The allowed characters are: A-Z, a-z, 0-9 and _" ++msgstr "" ++ ++msgid "The configuration file could not be loaded due to the following error:" ++msgstr "" ++ ++msgid "" ++"The device file of the memory or partition (e.g." ++" /dev/sda1)" ++msgstr "" ++"The device file of the memory or partition (e.g." ++" /dev/sda1)" ++ ++msgid "" ++"The filesystem that was used to format the memory (e.g. ext3)" ++msgstr "" ++"The filesystem that was used to format the memory (e.g. ext3)" ++ ++msgid "" ++"The flash image was uploaded. Below is the checksum and file size listed, " ++"compare them with the original file to ensure data integrity.
    Click " ++"\"Proceed\" below to start the flash procedure." ++msgstr "" ++ ++msgid "The following changes have been committed" ++msgstr "" ++ ++msgid "The following changes have been reverted" ++msgstr "The following changes have been reverted" ++ ++msgid "The following rules are currently active on this system." ++msgstr "The following rules are currently active on this system." ++ ++msgid "The given network name is not unique" ++msgstr "" ++ ++msgid "" ++"The hardware is not multi-SSID capable and the existing configuration will " ++"be replaced if you proceed." ++msgstr "" ++ ++msgid "" ++"The length of the IPv4 prefix in bits, the remainder is used in the IPv6 " ++"addresses." ++msgstr "" ++ ++msgid "The length of the IPv6 prefix in bits" ++msgstr "" ++ ++msgid "" ++"The network ports on this device can be combined to several VLANs in which computers can " ++"communicate directly with each other. VLANs are often used to separate different network " ++"segments. Often there is by default one Uplink port for a connection to the " ++"next greater network like the internet and other ports for a local network." ++msgstr "" ++ ++msgid "The selected protocol needs a device assigned" ++msgstr "" ++ ++msgid "" ++"The system is erasing the configuration partition now and will reboot itself " ++"when finished." ++msgstr "" ++ ++#, fuzzy ++msgid "" ++"The system is flashing now.
    DO NOT POWER OFF THE DEVICE!
    Wait a " ++"few minutes before you try to reconnect. It might be necessary to renew the " ++"address of your computer to reach the device again, depending on your " ++"settings." ++msgstr "" ++"The system is flashing now.
    DO NOT POWER OFF THE DEVICE!
    Wait a " ++"few minutes until you try to reconnect. It might be necessary to renew the " ++"address of your computer to reach the device again, depending on your " ++"settings." ++ ++msgid "" ++"The tunnel end-point is behind NAT, defaults to disabled and only applies to " ++"AYIYA" ++msgstr "" ++ ++msgid "" ++"The uploaded image file does not contain a supported format. Make sure that " ++"you choose the generic image format for your platform." ++msgstr "" ++"The uploaded image file does not contain a supported format. Make sure that " ++"you choose the generic image format for your platform." ++ ++msgid "There are no active leases." ++msgstr "" ++ ++msgid "There are no pending changes to apply!" ++msgstr "" ++ ++msgid "There are no pending changes to revert!" ++msgstr "" ++ ++msgid "There are no pending changes!" ++msgstr "" ++ ++msgid "" ++"There is no device assigned yet, please attach a network device in the " ++"\"Physical Settings\" tab" ++msgstr "" ++ ++msgid "" ++"There is no password set on this router. Please configure a root password to " ++"protect the web interface and enable SSH." ++msgstr "" ++ ++msgid "This IPv4 address of the relay" ++msgstr "" ++ ++msgid "" ++"This is a list of shell glob patterns for matching files and directories to " ++"include during sysupgrade. Modified files in /etc/config/ and certain other " ++"configurations are automatically preserved." ++msgstr "" ++ ++msgid "" ++"This is either the \"Update Key\" configured for the tunnel or the account " ++"password if no update key has been configured" ++msgstr "" ++ ++msgid "" ++"This is the content of /etc/rc.local. Insert your own commands here (in " ++"front of 'exit 0') to execute them at the end of the boot process." ++msgstr "" ++ ++msgid "" ++"This is the local endpoint address assigned by the tunnel broker, it usually " ++"ends with :2" ++msgstr "" ++ ++msgid "" ++"This is the only DHCP in the local network" ++msgstr "" ++"This is the only DHCP in the local network" ++ ++msgid "This is the plain username for logging into the account" ++msgstr "" ++ ++msgid "" ++"This is the prefix routed to you by the tunnel broker for use by clients" ++msgstr "" ++ ++msgid "This is the system crontab in which scheduled tasks can be defined." ++msgstr "This is the system crontab in which scheduled tasks can be defined." ++ ++msgid "" ++"This is usually the address of the nearest PoP operated by the tunnel broker" ++msgstr "" ++ ++msgid "" ++"This list gives an overview over currently running system processes and " ++"their status." ++msgstr "" ++"This list gives an overview over currently running system processes and " ++"their status." ++ ++msgid "This page allows the configuration of custom button actions" ++msgstr "" ++ ++msgid "This page gives an overview over currently active network connections." ++msgstr "This page gives an overview over currently active network connections." ++ ++msgid "This section contains no values yet" ++msgstr "This section contains no values yet" ++ ++msgid "Time Synchronization" ++msgstr "" ++ ++msgid "Time Synchronization is not configured yet." ++msgstr "" ++ ++msgid "Timezone" ++msgstr "Timezone" ++ ++msgid "" ++"To restore configuration files, you can upload a previously generated backup " ++"archive here." ++msgstr "" ++ ++msgid "Total Available" ++msgstr "" ++ ++msgid "Traceroute" ++msgstr "" ++ ++msgid "Traffic" ++msgstr "Traffic" ++ ++msgid "Transfer" ++msgstr "Transfer" ++ ++msgid "Transmission Rate" ++msgstr "Transmission Rate" ++ ++msgid "Transmit" ++msgstr "Transmit" ++ ++msgid "Transmit Power" ++msgstr "Transmit Power" ++ ++msgid "Transmitter Antenna" ++msgstr "Transmitter Antenna" ++ ++msgid "Trigger" ++msgstr "" ++ ++msgid "Trigger Mode" ++msgstr "" ++ ++msgid "Tunnel ID" ++msgstr "" ++ ++msgid "Tunnel Interface" ++msgstr "" ++ ++msgid "Tunnel Link" ++msgstr "" ++ ++msgid "Tunnel broker protocol" ++msgstr "" ++ ++msgid "Tunnel setup server" ++msgstr "" ++ ++msgid "Tunnel type" ++msgstr "" ++ ++msgid "Turbo Mode" ++msgstr "Turbo Mode" ++ ++msgid "Tx-Power" ++msgstr "" ++ ++msgid "Type" ++msgstr "Type" ++ ++msgid "UDP:" ++msgstr "" ++ ++msgid "UMTS only" ++msgstr "" ++ ++msgid "UMTS/GPRS/EV-DO" ++msgstr "" ++ ++msgid "USB Device" ++msgstr "" ++ ++msgid "UUID" ++msgstr "" ++ ++msgid "Unable to dispatch" ++msgstr "" ++ ++msgid "Unknown" ++msgstr "" ++ ++msgid "Unknown Error, password not changed!" ++msgstr "" ++ ++msgid "Unmanaged" ++msgstr "" ++ ++msgid "Unsaved Changes" ++msgstr "Unsaved Changes" ++ ++msgid "Unsupported protocol type." ++msgstr "" ++ ++msgid "Update lists" ++msgstr "" ++ ++msgid "" ++"Upload a sysupgrade-compatible image here to replace the running firmware. " ++"Check \"Keep settings\" to retain the current configuration (requires an " ++"OpenWrt compatible firmware image)." ++msgstr "" ++ ++msgid "Upload archive..." ++msgstr "" ++ ++msgid "Uploaded File" ++msgstr "Uploaded File" ++ ++msgid "Uptime" ++msgstr "Uptime" ++ ++msgid "Use /etc/ethers" ++msgstr "Use /etc/ethers" ++ ++msgid "Use DHCP gateway" ++msgstr "" ++ ++msgid "Use DNS servers advertised by peer" ++msgstr "" ++ ++msgid "Use ISO/IEC 3166 alpha2 country codes." ++msgstr "" ++ ++msgid "Use MTU on tunnel interface" ++msgstr "" ++ ++msgid "Use TTL on tunnel interface" ++msgstr "" ++ ++msgid "Use as external overlay (/overlay)" ++msgstr "" ++ ++msgid "Use as root filesystem (/)" ++msgstr "" ++ ++msgid "Use broadcast flag" ++msgstr "" ++ ++msgid "Use builtin IPv6-management" ++msgstr "" ++ ++msgid "Use custom DNS servers" ++msgstr "" ++ ++msgid "Use default gateway" ++msgstr "" ++ ++msgid "Use gateway metric" ++msgstr "" ++ ++msgid "Use routing table" ++msgstr "" ++ ++msgid "" ++"Use the Add Button to add a new lease entry. The MAC-Address indentifies the host, the IPv4-Address specifies to the fixed " ++"address to use and the Hostname is assigned as symbolic name to the " ++"requesting host." ++msgstr "" ++ ++msgid "Used" ++msgstr "Used" ++ ++msgid "Used Key Slot" ++msgstr "" ++ ++msgid "User certificate (PEM encoded)" ++msgstr "" ++ ++msgid "User key (PEM encoded)" ++msgstr "" ++ ++msgid "Username" ++msgstr "Username" ++ ++msgid "VC-Mux" ++msgstr "" ++ ++msgid "VLAN Interface" ++msgstr "" ++ ++msgid "VLANs on %q" ++msgstr "" ++ ++msgid "VLANs on %q (%s)" ++msgstr "" ++ ++msgid "VPN Server" ++msgstr "" ++ ++msgid "VPN Server port" ++msgstr "" ++ ++msgid "VPN Server's certificate SHA1 hash" ++msgstr "" ++ ++msgid "Vendor Class to send when requesting DHCP" ++msgstr "" ++ ++msgid "Verbose" ++msgstr "" ++ ++msgid "Verbose logging by aiccu daemon" ++msgstr "" ++ ++msgid "Verify" ++msgstr "" ++ ++msgid "Version" ++msgstr "Version" ++ ++msgid "WDS" ++msgstr "WDS" ++ ++msgid "WEP Open System" ++msgstr "" ++ ++msgid "WEP Shared Key" ++msgstr "" ++ ++msgid "WEP passphrase" ++msgstr "" ++ ++msgid "WMM Mode" ++msgstr "WMM Mode" ++ ++msgid "WPA passphrase" ++msgstr "" ++ ++msgid "" ++"WPA-Encryption requires wpa_supplicant (for client mode) or hostapd (for AP " ++"and ad-hoc mode) to be installed." ++msgstr "" ++"WPA-Encryption requires wpa_supplicant (for client mode) or hostapd (for AP " ++"and ad-hoc mode) to be installed." ++ ++msgid "" ++"Wait for NTP sync that many seconds, seting to 0 disables waiting (optional)" ++msgstr "" ++ ++msgid "Waiting for changes to be applied..." ++msgstr "" ++ ++msgid "Waiting for command to complete..." ++msgstr "" ++ ++msgid "Warning" ++msgstr "" ++ ++msgid "Warning: There are unsaved changes that will be lost while rebooting!" ++msgstr "Warning: There are unsaved changes that will be lost while rebooting!" ++ ++msgid "Whether to create an IPv6 default route over the tunnel" ++msgstr "" ++ ++msgid "Whether to route only packets from delegated prefixes" ++msgstr "" ++ ++msgid "Width" ++msgstr "" ++ ++msgid "Wifi" ++msgstr "Wifi" ++ ++msgid "Wireless" ++msgstr "" ++ ++msgid "Wireless Adapter" ++msgstr "Wireless Adapter" ++ ++msgid "Wireless Network" ++msgstr "Wireless Network" ++ ++msgid "Wireless Overview" ++msgstr "Wireless Overview" ++ ++msgid "Wireless Security" ++msgstr "Wireless Security" ++ ++msgid "Wireless is disabled or not associated" ++msgstr "" ++ ++msgid "Wireless is restarting..." ++msgstr "" ++ ++msgid "Wireless network is disabled" ++msgstr "" ++ ++msgid "Wireless network is enabled" ++msgstr "" ++ ++msgid "Wireless restarted" ++msgstr "" ++ ++msgid "Wireless shut down" ++msgstr "" ++ ++msgid "Write received DNS requests to syslog" ++msgstr "" ++ ++msgid "XR Support" ++msgstr "XR Support" ++ ++msgid "" ++"You can enable or disable installed init scripts here. Changes will applied " ++"after a device reboot.
    Warning: If you disable essential init " ++"scripts like \"network\", your device might become inaccessible!" ++msgstr "" ++"You can enable or disable installed init scripts here. Changes will applied " ++"after a device reboot.
    Warning: If you disable essential init " ++"scripts like \"network\", your device might become inaccessible!" ++ ++msgid "" ++"You must enable Java Script in your browser or LuCI will not work properly." ++msgstr "" ++ ++msgid "" ++"Your Internet Explorer is too old to display this page correctly. Please " ++"upgrade it to at least version 7 or use another browser like Firefox, Opera " ++"or Safari." ++msgstr "" ++ ++msgid "any" ++msgstr "" ++ ++msgid "auto" ++msgstr "auto" ++ ++msgid "automatic" ++msgstr "automatic" ++ ++msgid "baseT" ++msgstr "" ++ ++msgid "bridged" ++msgstr "" ++ ++msgid "create:" ++msgstr "" ++ ++msgid "creates a bridge over specified interface(s)" ++msgstr "creates a bridge over specified interface(s)" ++ ++msgid "dB" ++msgstr "" ++ ++msgid "dBm" ++msgstr "" ++ ++msgid "disable" ++msgstr "disable" ++ ++msgid "disabled" ++msgstr "" ++ ++msgid "expired" ++msgstr "" ++ ++msgid "" ++"file where given DHCP-leases will be stored" ++msgstr "" ++"file where given DHCP-leases will be stored" ++ ++msgid "forward" ++msgstr "" ++ ++msgid "full-duplex" ++msgstr "" ++ ++msgid "half-duplex" ++msgstr "" ++ ++msgid "help" ++msgstr "help" ++ ++msgid "hidden" ++msgstr "" ++ ++msgid "hybrid mode" ++msgstr "" ++ ++msgid "if target is a network" ++msgstr "if target is a network" ++ ++msgid "input" ++msgstr "" ++ ++msgid "kB" ++msgstr "" ++ ++msgid "kB/s" ++msgstr "" ++ ++msgid "kbit/s" ++msgstr "" ++ ++msgid "local DNS file" ++msgstr "local DNS file" ++ ++msgid "minimum 1280, maximum 1480" ++msgstr "" ++ ++msgid "navigation Navigation" ++msgstr "" ++ ++msgid "no" ++msgstr "" ++ ++msgid "no link" ++msgstr "" ++ ++msgid "none" ++msgstr "none" ++ ++msgid "not present" ++msgstr "" ++ ++msgid "off" ++msgstr "" ++ ++msgid "on" ++msgstr "" ++ ++msgid "open" ++msgstr "" ++ ++msgid "overlay" ++msgstr "" ++ ++msgid "relay mode" ++msgstr "" ++ ++msgid "routed" ++msgstr "" ++ ++msgid "server mode" ++msgstr "" ++ ++msgid "skiplink1 Skip to navigation" ++msgstr "" ++ ++msgid "skiplink2 Skip to content" ++msgstr "" ++ ++msgid "stateful-only" ++msgstr "" ++ ++msgid "stateless" ++msgstr "" ++ ++msgid "stateless + stateful" ++msgstr "" ++ ++msgid "tagged" ++msgstr "" ++ ++msgid "unknown" ++msgstr "" ++ ++msgid "unlimited" ++msgstr "" ++ ++msgid "unspecified" ++msgstr "" ++ ++msgid "unspecified -or- create:" ++msgstr "unspecified -or- create:" ++ ++msgid "untagged" ++msgstr "" ++ ++msgid "yes" ++msgstr "" ++ ++msgid "« Back" ++msgstr "« Back" ++ ++#~ msgid "Cached" ++#~ msgstr "Cached" ++ ++#~ msgid "Configures this mount as overlay storage for block-extroot" ++#~ msgstr "Configures this mount as overlay storage for block-extroot" ++ ++#~ msgid "Frequency Hopping" ++#~ msgstr "Frequency Hopping" ++ ++#~ msgid "40MHz 2nd channel above" ++#~ msgstr "40MHz 2nd channel above" ++ ++#~ msgid "40MHz 2nd channel below" ++#~ msgstr "40MHz 2nd channel below" ++ ++#~ msgid "Accept router advertisements" ++#~ msgstr "Accept router advertisements" ++ ++#~ msgid "Advertise IPv6 on network" ++#~ msgstr "Advertise IPv6 on network" ++ ++#~ msgid "Advertised network ID" ++#~ msgstr "Advertised network ID" ++ ++#~ msgid "Allowed range is 1 to 65535" ++#~ msgstr "Allowed range is 1 to 65535" ++ ++#~ msgid "Active Leases" ++#~ msgstr "Active Leases" ++ ++#~ msgid "Bit Rate" ++#~ msgstr "Bit Rate" ++ ++#~ msgid "Configuration / Apply" ++#~ msgstr "Configuration / Apply" ++ ++#~ msgid "Configuration / Changes" ++#~ msgstr "Configuration / Changes" ++ ++#~ msgid "Configuration / Revert" ++#~ msgstr "Configuration / Revert" ++ ++#~ msgid "MAC" ++#~ msgstr "MAC" ++ ++#~ msgid "Encr." ++#~ msgstr "Encr." ++ ++#~ msgid "WLAN-Scan" ++#~ msgstr "WLAN-Scan" ++ ++#~ msgid "" ++#~ "Choose the network you want to attach to this wireless interface. Select " ++#~ "unspecified to not attach any network or fill out the " ++#~ "create field to define a new network." ++#~ msgstr "" ++#~ "Choose the network you want to attach to this wireless interface. Select " ++#~ "unspecified to not attach any network or fill out the " ++#~ "create field to define a new network." ++ ++#~ msgid "Create Network" ++#~ msgstr "Create Network" ++ ++#~ msgid "Link" ++#~ msgstr "Link" ++ ++#~ msgid "Networks" ++#~ msgstr "Networks" ++ ++#~ msgid "Power" ++#~ msgstr "Power" ++ ++#~ msgid "Wifi networks in your local environment" ++#~ msgstr "Wifi networks in your local environment" ++ ++#~ msgid "" ++#~ "CIDR-Notation: " ++#~ "address/prefix" ++#~ msgstr "" ++#~ "CIDR-Notation: " ++#~ "address/prefix" ++ ++#~ msgid "DNS-Server" ++#~ msgstr "DNS-Server" ++ ++#~ msgid "IPv4-Broadcast" ++#~ msgstr "IPv4-Broadcast" ++ ++#~ msgid "IPv6-Address" ++#~ msgstr "IPv6-Address" ++ ++#~ msgid "" ++#~ "The network ports on your router can be combined to several VLANs in which computers can " ++#~ "communicate directly with each other. VLANs are often used to separate different network " ++#~ "segments. Often there is by default one Uplink port for a connection to " ++#~ "the next greater network like the internet and other ports for a local " ++#~ "network." ++#~ msgstr "" ++#~ "The network ports on your router can be combined to several VLANs in which computers can " ++#~ "communicate directly with each other. VLANs are often used to separate different network " ++#~ "segments. Often there is by default one Uplink port for a connection to " ++#~ "the next greater network like the internet and other ports for a local " ++#~ "network." ++ ++#~ msgid "Files to be kept when flashing a new firmware" ++#~ msgstr "Files to be kept when flashing a new firmware" ++ ++#~ msgid "General" ++#~ msgstr "General" ++ ++#~ msgid "" ++#~ "Here you can customize the settings and the functionality of LuCI." ++#~ msgstr "" ++#~ "Here you can customize the settings and the functionality of LuCI." ++ ++#~ msgid "Post-commit actions" ++#~ msgstr "Post-commit actions" ++ ++#~ msgid "" ++#~ "These commands will be executed automatically when a given UCI configuration is committed " ++#~ "allowing changes to be applied instantly." ++#~ msgstr "" ++#~ "These commands will be executed automatically when a given UCI configuration is committed " ++#~ "allowing changes to be applied instantly." ++ ++#~ msgid "Web UI" ++#~ msgstr "Web UI" ++ ++#~ msgid "PPTP-Server" ++#~ msgstr "" ++#~ "PPTP-Server" ++ ++#~ msgid "ARP ping retries" ++#~ msgstr "ARP ping retries" ++ ++#~ msgid "ATM Settings" ++#~ msgstr "ATM Settings" ++ ++#~ msgid "Accept Router Advertisements" ++#~ msgstr "Accept Router Advertisements" ++ ++#~ msgid "Access point (APN)" ++#~ msgstr "Access point (APN)" ++ ++#~ msgid "Additional pppd options" ++#~ msgstr "Additional pppd options" ++ ++#~ msgid "Allowed range is 1 to FFFF" ++#~ msgstr "Allowed range is 1 to FFFF" ++ ++#~ msgid "Automatic Disconnect" ++#~ msgstr "Automatic Disconnect" ++ ++#~ msgid "Backup Archive" ++#~ msgstr "Backup Archive" ++ ++#~ msgid "" ++#~ "Configure the local DNS server to use the name servers adverticed by the " ++#~ "PPP peer" ++#~ msgstr "" ++#~ "Configure the local DNS server to use the name servers adverticed by the " ++#~ "PPP peer" ++ ++#~ msgid "Connect script" ++#~ msgstr "Connect script" ++ ++#~ msgid "Create backup" ++#~ msgstr "Create backup" ++ ++#~ msgid "Disconnect script" ++#~ msgstr "Disconnect script" ++ ++#~ msgid "Edit package lists and installation targets" ++#~ msgstr "Edit package lists and installation targets" ++ ++#~ msgid "Enable IPv6 on PPP link" ++#~ msgstr "Enable IPv6 on PPP link" ++ ++#~ msgid "Firmware image" ++#~ msgstr "Firmware image" ++ ++#~ msgid "" ++#~ "Here you can backup and restore your router configuration and - if " ++#~ "possible - reset the router to the default settings." ++#~ msgstr "" ++#~ "Here you can backup and restore your router configuration and - if " ++#~ "possible - reset the router to the default settings." ++ ++#~ msgid "Installation targets" ++#~ msgstr "Installation targets" ++ ++#~ msgid "Keep configuration files" ++#~ msgstr "Keep configuration files" ++ ++#~ msgid "Keep-Alive" ++#~ msgstr "Keep-Alive" ++ ++#~ msgid "" ++#~ "Let pppd replace the current default route to use the PPP interface after " ++#~ "successful connect" ++#~ msgstr "" ++#~ "Let pppd replace the current default route to use the PPP interface after " ++#~ "successful connect" ++ ++#~ msgid "Let pppd run this script after establishing the PPP link" ++#~ msgstr "Let pppd run this script after establishing the PPP link" ++ ++#~ msgid "Let pppd run this script before tearing down the PPP link" ++#~ msgstr "Let pppd run this script before tearing down the PPP link" ++ ++#~ msgid "" ++#~ "Make sure that you provide the correct pin code here or you might lock " ++#~ "your sim card!" ++#~ msgstr "" ++#~ "Make sure that you provide the correct pin code here or you might lock " ++#~ "your sim card!" ++ ++#~ msgid "" ++#~ "Most of them are network servers, that offer a certain service for your " ++#~ "device or network like shell access, serving webpages like LuCI, doing mesh routing, sending " ++#~ "e-mails, ..." ++#~ msgstr "" ++#~ "Most of them are network servers, that offer a certain service for your " ++#~ "device or network like shell access, serving webpages like LuCI, doing mesh routing, sending " ++#~ "e-mails, ..." ++ ++#~ msgid "Number of failed connection tests to initiate automatic reconnect" ++#~ msgstr "Number of failed connection tests to initiate automatic reconnect" ++ ++#~ msgid "PIN code" ++#~ msgstr "PIN code" ++ ++#~ msgid "PPP Settings" ++#~ msgstr "PPP Settings" ++ ++#~ msgid "Package lists" ++#~ msgstr "Package lists" ++ ++#~ msgid "Proceed reverting all settings and resetting to firmware defaults?" ++#~ msgstr "Proceed reverting all settings and resetting to firmware defaults?" ++ ++#~ msgid "Processor" ++#~ msgstr "Processor" ++ ++#~ msgid "Radius-Port" ++#~ msgstr "Radius-Port" ++ ++#~ msgid "Radius-Server" ++#~ msgstr "Radius-Server" ++ ++#~ msgid "Replace default route" ++#~ msgstr "Replace default route" ++ ++#~ msgid "Reset router to defaults" ++#~ msgstr "Reset router to defaults" ++ ++#~ msgid "" ++#~ "Seconds to wait for the modem to become ready before attempting to connect" ++#~ msgstr "" ++#~ "Seconds to wait for the modem to become ready before attempting to connect" ++ ++#~ msgid "Service type" ++#~ msgstr "Service type" ++ ++#~ msgid "Services and daemons perform certain tasks on your device." ++#~ msgstr "Services and daemons perform certain tasks on your device." ++ ++#~ msgid "Settings" ++#~ msgstr "Settings" ++ ++#~ msgid "Setup wait time" ++#~ msgstr "Setup wait time" ++ ++#~ msgid "" ++#~ "Sorry. OpenWrt does not support a system upgrade on this platform.
    " ++#~ "You need to manually flash your device." ++#~ msgstr "" ++#~ "Sorry. OpenWrt does not support a system upgrade on this platform.
    " ++#~ "You need to manually flash your device." ++ ++#~ msgid "Specify additional command line arguments for pppd here" ++#~ msgstr "Specify additional command line arguments for pppd here" ++ ++#~ msgid "The device node of your modem, e.g. /dev/ttyUSB0" ++#~ msgstr "The device node of your modem, e.g. /dev/ttyUSB0" ++ ++#~ msgid "Time (in seconds) after which an unused connection will be closed" ++#~ msgstr "Time (in seconds) after which an unused connection will be closed" ++ ++#~ msgid "Update package lists" ++#~ msgstr "Update package lists" ++ ++#~ msgid "Upload an OpenWrt image file to reflash the device." ++#~ msgstr "Upload an OpenWrt image file to reflash the device." ++ ++#~ msgid "Upload image" ++#~ msgstr "Upload image" ++ ++#~ msgid "Use peer DNS" ++#~ msgstr "Use peer DNS" ++ ++#~ msgid "" ++#~ "You need to install \"comgt\" for UMTS/GPRS, \"ppp-mod-pppoe\" for PPPoE, " ++#~ "\"ppp-mod-pppoa\" for PPPoA or \"pptp\" for PPtP support" ++#~ msgstr "" ++#~ "You need to install \"comgt\" for UMTS/GPRS, \"ppp-mod-pppoe\" for PPPoE, " ++#~ "\"ppp-mod-pppoa\" for PPPoA or \"pptp\" for PPtP support" ++ ++#~ msgid "back" ++#~ msgstr "back" ++ ++#~ msgid "buffered" ++#~ msgstr "buffered" ++ ++#~ msgid "cached" ++#~ msgstr "cached" ++ ++#~ msgid "free" ++#~ msgstr "free" ++ ++#~ msgid "static" ++#~ msgstr "static" ++ ++#~ msgid "" ++#~ "LuCI is a collection " ++#~ "of free Lua software including an MVC-Webframework and webinterface for embedded devices. LuCI is licensed under the " ++#~ "Apache-License." ++#~ msgstr "" ++#~ "LuCI is a collection " ++#~ "of free Lua software including an MVC-Webframework and webinterface for embedded devices. LuCI is licensed under the " ++#~ "Apache-License." ++ ++#~ msgid "SSH-Keys" ++#~ msgstr "SSH-Keys" ++ ++#~ msgid "" ++#~ "A lightweight HTTP/1.1 webserver written in C and Lua designed to serve " ++#~ "LuCI" ++#~ msgstr "" ++#~ "A lightweight HTTP/1.1 webserver written in C and Lua designed to serve " ++#~ "LuCI" ++ ++#~ msgid "" ++#~ "A small webserver which can be used to serve LuCI." ++#~ msgstr "" ++#~ "A small webserver which can be used to serve LuCI." ++ ++#~ msgid "About" ++#~ msgstr "About" ++ ++#~ msgid "Active IP Connections" ++#~ msgstr "Active IP Connections" ++ ++#~ msgid "Addresses" ++#~ msgstr "Addresses" ++ ++#~ msgid "Admin Password" ++#~ msgstr "Admin Password" ++ ++#~ msgid "Alias" ++#~ msgstr "Alias" ++ ++#~ msgid "Authentication Realm" ++#~ msgstr "Authentication Realm" ++ ++#~ msgid "Bridge Port" ++#~ msgstr "Bridge Port" ++ ++#~ msgid "" ++#~ "Change the password of the system administrator (User root)" ++#~ msgstr "" ++#~ "Change the password of the system administrator (User root)" ++ ++#~ msgid "Client + WDS" ++#~ msgstr "Client + WDS" ++ ++#~ msgid "Configuration file" ++#~ msgstr "Configuration file" ++ ++#~ msgid "Connection timeout" ++#~ msgstr "Connection timeout" ++ ++#~ msgid "Contributing Developers" ++#~ msgstr "Contributing Developers" ++ ++#~ msgid "DHCP assigned" ++#~ msgstr "DHCP assigned" ++ ++#~ msgid "Document root" ++#~ msgstr "Document root" ++ ++#~ msgid "Enable Keep-Alive" ++#~ msgstr "Enable Keep-Alive" ++ ++#~ msgid "Ethernet Bridge" ++#~ msgstr "Ethernet Bridge" ++ ++#~ msgid "" ++#~ "Here you can paste public SSH-Keys " ++#~ "(one per line) for SSH public-key " ++#~ "authentication." ++#~ msgstr "" ++#~ "Here you can paste public SSH-Keys " ++#~ "(one per line) for SSH public-key " ++#~ "authentication." ++ ++#~ msgid "ID" ++#~ msgstr "ID" ++ ++#~ msgid "IP Configuration" ++#~ msgstr "IP Configuration" ++ ++#~ msgid "Interface Status" ++#~ msgstr "Interface Status" ++ ++#~ msgid "Lead Development" ++#~ msgstr "Lead Development" ++ ++#~ msgid "Master" ++#~ msgstr "Master" ++ ++#~ msgid "Master + WDS" ++#~ msgstr "Master + WDS" ++ ++#~ msgid "Not configured" ++#~ msgstr "Not configured" ++ ++#~ msgid "Password successfully changed" ++#~ msgstr "Password successfully changed" ++ ++#~ msgid "Plugin path" ++#~ msgstr "Plugin path" ++ ++#~ msgid "Ports" ++#~ msgstr "Ports" ++ ++#~ msgid "Primary" ++#~ msgstr "Primary" ++ ++#~ msgid "Project Homepage" ++#~ msgstr "Project Homepage" ++ ++#~ msgid "Pseudo Ad-Hoc" ++#~ msgstr "Pseudo Ad-Hoc" ++ ++#~ msgid "STP" ++#~ msgstr "STP" ++ ++#~ msgid "Thanks To" ++#~ msgstr "Thanks To" ++ ++#~ msgid "" ++#~ "The realm which will be displayed at the authentication prompt for " ++#~ "protected pages." ++#~ msgstr "" ++#~ "The realm which will be displayed at the authentication prompt for " ++#~ "protected pages." ++ ++#~ msgid "Unknown Error" ++#~ msgstr "Unknown Error" ++ ++#~ msgid "VLAN" ++#~ msgstr "VLAN" ++ ++#~ msgid "defaults to /etc/httpd.conf" ++#~ msgstr "defaults to /etc/httpd.conf" ++ ++#~ msgid "OPKG error code %i" ++#~ msgstr "OPKG error code %i" ++ ++#~ msgid "Package lists updated" ++#~ msgstr "Package lists updated" ++ ++#~ msgid "Upgrade installed packages" ++#~ msgstr "Upgrade installed packages" ++ ++#~ msgid "" ++#~ "Also kernel or service logfiles can be viewed here to get an overview " ++#~ "over their current state." ++#~ msgstr "" ++#~ "Also kernel or service logfiles can be viewed here to get an overview " ++#~ "over their current state." ++ ++#~ msgid "" ++#~ "Here you can find information about the current system status like CPU clock frequency, memory " ++#~ "usage or network interface data." ++#~ msgstr "" ++#~ "Here you can find information about the current system status like CPU clock frequency, memory " ++#~ "usage or network interface data." ++ ++#~ msgid "Search file..." ++#~ msgstr "Search file..." ++ ++#~ msgid "" ++#~ "LuCI is a free, " ++#~ "flexible, and user friendly graphical interface for configuring OpenWrt " ++#~ "Kamikaze." ++#~ msgstr "" ++#~ "LuCI is a free, " ++#~ "flexible, and user friendly graphical interface for configuring OpenWrt " ++#~ "Kamikaze." ++ ++#~ msgid "And now have fun with your router!" ++#~ msgstr "And now have fun with your router!" ++ ++#~ msgid "" ++#~ "As we always want to improve this interface we are looking forward to " ++#~ "your feedback and suggestions." ++#~ msgstr "" ++#~ "As we always want to improve this interface we are looking forward to " ++#~ "your feedback and suggestions." ++ ++#~ msgid "Hello!" ++#~ msgstr "Hello!" ++ ++#~ msgid "" ++#~ "Notice: In LuCI " ++#~ "changes have to be confirmed by clicking Changes - Save & Apply " ++#~ "before being applied." ++#~ msgstr "" ++#~ "Notice: In LuCI " ++#~ "changes have to be confirmed by clicking Changes - Save & Apply " ++#~ "before being applied." ++ ++#~ msgid "" ++#~ "On the following pages you can adjust all important settings of your " ++#~ "router." ++#~ msgstr "" ++#~ "On the following pages you can adjust all important settings of your " ++#~ "router." ++ ++#~ msgid "The LuCI Team" ++#~ msgstr "The LuCI Team" ++ ++#~ msgid "" ++#~ "This is the administration area of LuCI." ++#~ msgstr "" ++#~ "This is the administration area of LuCI." ++ ++#~ msgid "User Interface" ++#~ msgstr "User Interface" ++ ++#~ msgid "enable" ++#~ msgstr "enable" ++ ++#~ msgid "(hidden)" ++#~ msgstr "(hidden)" ++ ++#~ msgid "(optional)" ++#~ msgstr "(optional)" ++ ++#~ msgid "DNS-Port" ++#~ msgstr "DNS-Port" ++ ++#~ msgid "" ++#~ "DNS-Server will be queried in " ++#~ "the order of the resolvfile" ++#~ msgstr "" ++#~ "DNS-Server will be queried in " ++#~ "the order of the resolvfile" ++ ++#~ msgid "" ++#~ "max. DHCP-Leases" ++#~ msgstr "" ++#~ "max. DHCP-Leases" ++ ++#~ msgid "" ++#~ "max. EDNS0 packet size" ++#~ msgstr "" ++#~ "max. EDNS0 packet size" ++ ++#~ msgid "AP-Isolation" ++#~ msgstr "AP-Isolation" ++ ++#~ msgid "Add the Wifi network to physical network" ++#~ msgstr "Add the Wifi network to physical network" ++ ++#~ msgid "Aliases" ++#~ msgstr "Aliases" ++ ++#~ msgid "Attach to existing network" ++#~ msgstr "Attach to existing network" ++ ++#~ msgid "Clamp Segment Size" ++#~ msgstr "Clamp Segment Size" ++ ++#~ msgid "Create Or Attach Network" ++#~ msgstr "Create Or Attach Network" ++ ++#~ msgid "DHCP" ++#~ msgstr "DHCP" ++ ++#~ msgid "Devices" ++#~ msgstr "Devices" ++ ++#~ msgid "Don't forward reverse lookups for local networks" ++#~ msgstr "Don't forward reverse lookups for local networks" ++ ++#~ msgid "Enable TFTP-Server" ++#~ msgstr "Enable TFTP-Server" ++ ++#~ msgid "Errors" ++#~ msgstr "Errors" ++ ++#~ msgid "Essentials" ++#~ msgstr "Essentials" ++ ++#~ msgid "Expand Hosts" ++#~ msgstr "Expand Hosts" ++ ++#~ msgid "First leased address" ++#~ msgstr "First leased address" ++ ++#~ msgid "" ++#~ "Fixes problems with unreachable websites, submitting forms or other " ++#~ "unexpected behaviour for some ISPs." ++#~ msgstr "" ++#~ "Fixes problems with unreachable websites, submitting forms or other " ++#~ "unexpected behaviour for some ISPs." ++ ++#~ msgid "Hardware Address" ++#~ msgstr "Hardware Address" ++ ++#~ msgid "Here you can configure installed wifi devices." ++#~ msgstr "Here you can configure installed wifi devices." ++ ++#~ msgid "" ++#~ "If the interface is attached to an existing network it will be " ++#~ "bridged to the existing interfaces and is covered by the " ++#~ "firewall zone of the choosen network.
    Uncheck the attach option to " ++#~ "define a new standalone network for this interface." ++#~ msgstr "" ++#~ "If the interface is attached to an existing network it will be " ++#~ "bridged to the existing interfaces and is covered by the " ++#~ "firewall zone of the choosen network.
    Uncheck the attach option to " ++#~ "define a new standalone network for this interface." ++ ++#~ msgid "Ignore /etc/hosts" ++#~ msgstr "Ignore /etc/hosts" ++ ++#~ msgid "Independent (Ad-Hoc)" ++#~ msgstr "Independent (Ad-Hoc)" ++ ++#~ msgid "Internet Connection" ++#~ msgstr "Internet Connection" ++ ++#~ msgid "Join (Client)" ++#~ msgstr "Join (Client)" ++ ++#~ msgid "Leases" ++#~ msgstr "Leases" ++ ++#~ msgid "Local Domain" ++#~ msgstr "Local Domain" ++ ++#~ msgid "Local Network" ++#~ msgstr "Local Network" ++ ++#~ msgid "Local Server" ++#~ msgstr "Local Server" ++ ++#~ msgid "Network Boot Image" ++#~ msgstr "Network Boot Image" ++ ++#~ msgid "" ++#~ "Network Name (ESSID)" ++#~ msgstr "" ++#~ "Network Name (ESSID)" ++ ++#~ msgid "Number of leased addresses" ++#~ msgstr "Number of leased addresses" ++ ++#~ msgid "Perform Actions" ++#~ msgstr "Perform Actions" ++ ++#~ msgid "Prevents Client to Client communication" ++#~ msgstr "Prevents Client to Client communication" ++ ++#~ msgid "Provide (Access Point)" ++#~ msgstr "Provide (Access Point)" ++ ++#~ msgid "Resolvfile" ++#~ msgstr "Resolvfile" ++ ++#~ msgid "TFTP-Server Root" ++#~ msgstr "TFTP-Server Root" ++ ++#~ msgid "TX / RX" ++#~ msgstr "TX / RX" ++ ++#~ msgid "The following changes have been applied" ++#~ msgstr "The following changes have been applied" ++ ++#~ msgid "" ++#~ "When flashing a new firmware with LuCI these files will be added to the new firmware " ++#~ "installation." ++#~ msgstr "" ++#~ "When flashing a new firmware with LuCI these files will be added to the new firmware " ++#~ "installation." ++ ++#~ msgid "Wireless Scan" ++#~ msgstr "Wireless Scan" ++ ++#~ msgid "" ++#~ "With DHCP " ++#~ "network members can automatically receive their network settings (IP-address, netmask, DNS-server, ...)." ++#~ msgstr "" ++#~ "With DHCP " ++#~ "network members can automatically receive their network settings (IP-address, netmask, DNS-server, ...)." ++ ++#~ msgid "" ++#~ "You are about to join the wireless network %s. " ++#~ "In order to complete the process, you need to provide some additional " ++#~ "details." ++#~ msgstr "" ++#~ "You are about to join the wireless network %s. " ++#~ "In order to complete the process, you need to provide some additional " ++#~ "details." ++ ++#~ msgid "" ++#~ "You can run several wifi networks with one device. Be aware that there " ++#~ "are certain hardware and driverspecific restrictions. Normally you can " ++#~ "operate 1 Ad-Hoc or up to 3 Master-Mode and 1 Client-Mode network " ++#~ "simultaneously." ++#~ msgstr "" ++#~ "You can run several wifi networks with one device. Be aware that there " ++#~ "are certain hardware and driverspecific restrictions. Normally you can " ++#~ "operate 1 Ad-Hoc or up to 3 Master-Mode and 1 Client-Mode network " ++#~ "simultaneously." ++ ++#~ msgid "" ++#~ "You need to install \"ppp-mod-pppoe\" for PPPoE or \"pptp\" for PPtP " ++#~ "support" ++#~ msgstr "" ++#~ "You need to install \"ppp-mod-pppoe\" for PPPoE or \"pptp\" for PPtP " ++#~ "support" ++ ++#~ msgid "" ++#~ "You need to install wpa-supplicant to use WPA!" ++#~ msgstr "" ++#~ "You need to install wpa-supplicant to use WPA!" ++ ++#~ msgid "" ++#~ "You need to install the Broadcom nas supplicant " ++#~ "to use WPA!" ++#~ msgstr "" ++#~ "You need to install the Broadcom nas supplicant " ++#~ "to use WPA!" ++ ++#~ msgid "Zone" ++#~ msgstr "Zone" ++ ++#~ msgid "additional hostfile" ++#~ msgstr "additional hostfile" ++ ++#~ msgid "adds domain names to hostentries in the resolv file" ++#~ msgstr "adds domain names to hostentries in the resolv file" ++ ++#~ msgid "automatically reconnect" ++#~ msgstr "automatically reconnect" ++ ++#~ msgid "concurrent queries" ++#~ msgstr "concurrent queries" ++ ++#~ msgid "" ++#~ "disable DHCP " ++#~ "for this interface" ++#~ msgstr "" ++#~ "disable DHCP " ++#~ "for this interface" ++ ++#~ msgid "disconnect when idle for" ++#~ msgstr "disconnect when idle for" ++ ++#~ msgid "don't cache unknown" ++#~ msgstr "don't cache unknown" ++ ++#~ msgid "" ++#~ "filter useless DNS-queries of " ++#~ "Windows-systems" ++#~ msgstr "" ++#~ "filter useless DNS-queries of " ++#~ "Windows-systems" ++ ++#~ msgid "installed" ++#~ msgstr "installed" ++ ++#~ msgid "localises the hostname depending on its subnet" ++#~ msgstr "localises the hostname depending on its subnet" ++ ++#~ msgid "manual" ++#~ msgstr "manual" ++ ++#~ msgid "not installed" ++#~ msgstr "not installed" ++ ++#~ msgid "" ++#~ "prevents caching of negative DNS-replies" ++#~ msgstr "" ++#~ "prevents caching of negative DNS-replies" ++ ++#~ msgid "query port" ++#~ msgstr "query port" ++ ++#~ msgid "transmitted / received" ++#~ msgstr "transmitted / received" ++ ++#~ msgid "all" ++#~ msgstr "all" ++ ++#~ msgid "Code" ++#~ msgstr "Code" ++ ++#~ msgid "Distance" ++#~ msgstr "Distance" ++ ++#~ msgid "Legend" ++#~ msgstr "Legend" ++ ++#~ msgid "Library" ++#~ msgstr "Library" ++ ++#~ msgid "see '%s' manpage" ++#~ msgstr "see '%s' manpage" ++ ++#~ msgid "Package Manager" ++#~ msgstr "Package Manager" ++ ++#~ msgid "Service" ++#~ msgstr "Service" ++ ++#~ msgid "Statistics" ++#~ msgstr "Statistics" ++ ++#~ msgid "zone" ++#~ msgstr "Zone" +diff --git a/feeds/luci/modules/luci-base/po/es/base.po b/feeds/luci/modules/luci-base/po/es/base.po +new file mode 100644 +index 0000000..2c3ce94 +--- /dev/null ++++ b/feeds/luci/modules/luci-base/po/es/base.po +@@ -0,0 +1,4148 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Report-Msgid-Bugs-To: \n" ++"POT-Creation-Date: 2009-06-10 03:41+0200\n" ++"PO-Revision-Date: 2014-05-04 11:38+0200\n" ++"Last-Translator: José Vicente \n" ++"Language-Team: LANGUAGE \n" ++"Language: es\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n != 1);\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "(%d minute window, %d second interval)" ++msgstr "(ventana de %d minutos, intervalo de %d segundos)" ++ ++msgid "(%s available)" ++msgstr "(%s está disponible)" ++ ++msgid "(empty)" ++msgstr "(vacío)" ++ ++msgid "(no interfaces attached)" ++msgstr "(sin interfaces conectados)" ++ ++msgid "-- Additional Field --" ++msgstr "-- Campo Adicional --" ++ ++msgid "-- Please choose --" ++msgstr "-- Elija, por favor --" ++ ++msgid "-- custom --" ++msgstr "-- introducir --" ++ ++msgid "-- match by device --" ++msgstr "" ++ ++msgid "-- match by label --" ++msgstr "" ++ ++msgid "1 Minute Load:" ++msgstr "Carga a 1 minuto:" ++ ++msgid "15 Minute Load:" ++msgstr "Carga a 15 minutos:" ++ ++msgid "5 Minute Load:" ++msgstr "Carga a 5 minutos:" ++ ++msgid "BSSID" ++msgstr "" ++"BSSID" ++ ++msgid "DNS query port" ++msgstr "Puerto de consultas al DNS" ++ ++msgid "DNS server port" ++msgstr "Puerto del servidor DNS" ++ ++msgid "" ++"DNS servers will be queried in the " ++"order of the resolvfile" ++msgstr "" ++"Los servidores de DNS se consultan " ++"en el orden en que aparecen en el fichero resolv" ++ ++msgid "ESSID" ++msgstr "" ++"ESSID" ++ ++msgid "IPv4-Address" ++msgstr "Dirección IPv4" ++ ++msgid "IPv4-Gateway" ++msgstr "" ++"Puerta de enlace IPv4" ++ ++msgid "IPv4-Netmask" ++msgstr "Máscara de red IPv4" ++ ++msgid "" ++"IPv6-Address or Network " ++"(CIDR)" ++msgstr "" ++"Dirección o red (CIDR)IPv6" ++ ++msgid "IPv6-Gateway" ++msgstr "" ++"Puerta de enlace IPv6" ++ ++msgid "IPv6-Suffix (hex)" ++msgstr "" ++ ++msgid "LED Configuration" ++msgstr "Configuración de LEDs" ++ ++msgid "LED Name" ++msgstr "Nombre del LED" ++ ++msgid "MAC-Address" ++msgstr "Dirección MAC" ++ ++msgid "" ++"Max. DHCP leases" ++msgstr "" ++"Máximas cesiones DHCP" ++ ++msgid "" ++"Max. EDNS0 packet size" ++msgstr "Tamaño máximo de paquetes EDNS0" ++ ++msgid "Max. concurrent queries" ++msgstr "Máximo número de consultas concurrentes" ++ ++msgid "%s - %s" ++msgstr "%s - %s" ++ ++msgid "ADSL" ++msgstr "" ++ ++msgid "ADSL Status" ++msgstr "" ++ ++msgid "AICCU (SIXXS)" ++msgstr "" ++ ++msgid "APN" ++msgstr "APN" ++ ++msgid "AR Support" ++msgstr "Soporte a AR" ++ ++msgid "ARP retry threshold" ++msgstr "Umbral de reintento ARP" ++ ++msgid "ATM Bridges" ++msgstr "Puente ATM" ++ ++msgid "ATM Virtual Channel Identifier (VCI)" ++msgstr "Identificador de canal virtual ATM (VCI)" ++ ++msgid "ATM Virtual Path Identifier (VPI)" ++msgstr "Identificador de camino virtual ATM (VPI)" ++ ++msgid "" ++"ATM bridges expose encapsulated ethernet in AAL5 connections as virtual " ++"Linux network interfaces which can be used in conjunction with DHCP or PPP " ++"to dial into the provider network." ++msgstr "" ++"Los puentes ATM exponen conexiones AAL5 ethernet encapsuladas como " ++"interfaces de red Linux que se pueden usar junto a DHCP o PPP para conectar " ++"a la red del proveedor." ++ ++msgid "ATM device number" ++msgstr "Número de dispositivo ATM" ++ ++msgid "AYIYA" ++msgstr "" ++ ++msgid "Access Concentrator" ++msgstr "Concentrador de acceso" ++ ++msgid "Access Point" ++msgstr "Punto de Acceso" ++ ++msgid "Action" ++msgstr "Acción" ++ ++msgid "Actions" ++msgstr "Acciones" ++ ++msgid "Activate this network" ++msgstr "Activar esta red" ++ ++msgid "Active IPv4-Routes" ++msgstr "Rutas activas IPv4" ++ ++msgid "Active IPv6-Routes" ++msgstr "Rutas activas IPv6" ++ ++msgid "Active Connections" ++msgstr "Conexiones activas" ++ ++msgid "Active DHCP Leases" ++msgstr "Cesiones DHCP activas" ++ ++msgid "Active DHCPv6 Leases" ++msgstr "Cesiones DHCPv6 activas" ++ ++msgid "Ad-Hoc" ++msgstr "Ad-Hoc" ++ ++msgid "Add" ++msgstr "Añadir" ++ ++msgid "Add local domain suffix to names served from hosts files" ++msgstr "" ++"Añadir el sufijo de dominio local a los nombres servidos desde el fichero de " ++"máquinas" ++ ++msgid "Add new interface..." ++msgstr "Añadir nueva interfaz..." ++ ++msgid "Additional Hosts files" ++msgstr "Ficheros de máquinas adicionales" ++ ++msgid "Address" ++msgstr "Dirección" ++ ++msgid "Address to access local relay bridge" ++msgstr "Dirección del puente relé local" ++ ++msgid "Administration" ++msgstr "Administración" ++ ++msgid "Advanced Settings" ++msgstr "Configuración avanzada" ++ ++msgid "Alert" ++msgstr "Alerta" ++ ++msgid "Allow SSH password authentication" ++msgstr "" ++"Permitir autenticación de contraseña via SSH" ++ ++msgid "Allow all except listed" ++msgstr "Permitir a todos excepto a los de la lista" ++ ++msgid "Allow listed only" ++msgstr "Permitir a los pertenecientes en la lista" ++ ++msgid "Allow localhost" ++msgstr "Permitir a la propia máquina" ++ ++msgid "Allow remote hosts to connect to local SSH forwarded ports" ++msgstr "Permitir a máquinas remotas conectar a puestos SSH locales traspasados" ++ ++msgid "Allow root logins with password" ++msgstr "Permitir conexiones a root con contraseña" ++ ++msgid "Allow the root user to login with password" ++msgstr "Permitir al usuario root conectar con contraseña" ++ ++msgid "" ++"Allow upstream responses in the 127.0.0.0/8 range, e.g. for RBL services" ++msgstr "" ++"Permitir respuestas en el rango 127.0.0.0/8, por ejemplo para servicios RBL" ++ ++msgid "" ++"Also see Tunneling Comparison on SIXXS" ++msgstr "" ++ ++msgid "Always announce default router" ++msgstr "" ++ ++msgid "An additional network will be created if you leave this unchecked." ++msgstr "Se creará una red adicional si deja esto desmarcado." ++ ++msgid "Announce as default router even if no public prefix is available." ++msgstr "" ++ ++msgid "Announced DNS domains" ++msgstr "" ++ ++msgid "Announced DNS servers" ++msgstr "" ++ ++msgid "Antenna 1" ++msgstr "Antena 1" ++ ++msgid "Antenna 2" ++msgstr "Antena 2" ++ ++msgid "Antenna Configuration" ++msgstr "Configuración de la antena" ++ ++msgid "Any zone" ++msgstr "Cualquier zona" ++ ++msgid "Apply" ++msgstr "Aplicar" ++ ++msgid "Applying changes" ++msgstr "Aplicando cambios" ++ ++msgid "" ++"Assign a part of given length of every public IPv6-prefix to this interface" ++msgstr "" ++ ++msgid "Assign interfaces..." ++msgstr "Asigne interfaces..." ++ ++msgid "" ++"Assign prefix parts using this hexadecimal subprefix ID for this interface." ++msgstr "" ++ ++msgid "Associated Stations" ++msgstr "Estaciones asociadas" ++ ++msgid "Atheros 802.11%s Wireless Controller" ++msgstr "Controlador inalámbrico 802.11%s Atheros" ++ ++msgid "AuthGroup" ++msgstr "" ++ ++msgid "Authentication" ++msgstr "Autentificación" ++ ++msgid "Authoritative" ++msgstr "Autorizado" ++ ++msgid "Authorization Required" ++msgstr "Conéctese" ++ ++msgid "Auto Refresh" ++msgstr "Autorefresco" ++ ++msgid "Automatic" ++msgstr "" ++ ++msgid "Automatic Homenet (HNCP)" ++msgstr "" ++ ++msgid "Available" ++msgstr "Disponible" ++ ++msgid "Available packages" ++msgstr "Paquetes disponibles" ++ ++msgid "Average:" ++msgstr "Media:" ++ ++msgid "BSSID" ++msgstr "BSSID" ++ ++msgid "Back" ++msgstr "Volver" ++ ++msgid "Back to Overview" ++msgstr "Volver al resumen" ++ ++msgid "Back to configuration" ++msgstr "Volver a la configuración" ++ ++msgid "Back to overview" ++msgstr "Volver al resumen" ++ ++msgid "Back to scan results" ++msgstr "Volver a resultados de la exploración" ++ ++msgid "Background Scan" ++msgstr "Exploración en segundo plano" ++ ++msgid "Backup / Flash Firmware" ++msgstr "Copia de seguridad / Grabar firmware" ++ ++msgid "Backup / Restore" ++msgstr "Salvar / Restaurar" ++ ++msgid "Backup file list" ++msgstr "Salvar lista de ficheros" ++ ++msgid "Bad address specified!" ++msgstr "¡Dirección no válida!" ++ ++msgid "Band" ++msgstr "" ++ ++msgid "Behind NAT" ++msgstr "" ++ ++msgid "" ++"Below is the determined list of files to backup. It consists of changed " ++"configuration files marked by opkg, essential base files and the user " ++"defined backup patterns." ++msgstr "" ++"Lista de ficheros a los que hacer copia de seguridad. Es una lista de " ++"ficheros de configuración cambiados por ficheros marcados por opkg, ficheros " ++"esenciales base y los patrones de copia de seguridad definidos por el " ++"usuario." ++ ++msgid "Bitrate" ++msgstr "Bitrate" ++ ++msgid "Bogus NX Domain Override" ++msgstr "Ignorar dominio falso NX" ++ ++msgid "Bridge" ++msgstr "Puente" ++ ++msgid "Bridge interfaces" ++msgstr "Puentear interfaces" ++ ++msgid "Bridge unit number" ++msgstr "Número de unidad del puente" ++ ++msgid "Bring up on boot" ++msgstr "Activar en el arranque" ++ ++msgid "Broadcom 802.11%s Wireless Controller" ++msgstr "Controlador inalámbrico 802.11%s Broadcom" ++ ++msgid "Broadcom BCM%04x 802.11 Wireless Controller" ++msgstr "Controlador inalámbrico 802.11 BCM%04x" ++ ++msgid "Buffered" ++msgstr "En búfer" ++ ++msgid "Buttons" ++msgstr "Botones" ++ ++msgid "CA certificate; if empty it will be saved after the first connection." ++msgstr "" ++ ++msgid "CPU" ++msgstr "CPU" ++ ++msgid "CPU usage (%)" ++msgstr "Uso de CPU (%)" ++ ++msgid "Cancel" ++msgstr "Cancelar" ++ ++msgid "Category" ++msgstr "" ++ ++msgid "Chain" ++msgstr "Cadena" ++ ++msgid "Changes" ++msgstr "Cambios" ++ ++msgid "Changes applied." ++msgstr "Cambios aplicados." ++ ++msgid "Changes the administrator password for accessing the device" ++msgstr "Cambie la contraseña del administrador para acceder al dispositivo" ++ ++msgid "Channel" ++msgstr "Canal" ++ ++msgid "Check" ++msgstr "Comprobar" ++ ++msgid "Checksum" ++msgstr "Comprobación" ++ ++msgid "" ++"Choose the firewall zone you want to assign to this interface. Select " ++"unspecified to remove the interface from the associated zone or " ++"fill out the create field to define a new zone and attach the " ++"interface to it." ++msgstr "" ++"Elija la zona del cortafuegos a la que quiere asignar esta interfaz. " ++"Seleccione no especificado para eliminar la interfaz de la zona " ++"asociada o rellene el campo crear para definir una zona nueva a la " ++"que asignarla." ++ ++msgid "" ++"Choose the network(s) you want to attach to this wireless interface or fill " ++"out the create field to define a new network." ++msgstr "" ++"Elija la red o redes a las que quiere unir esta interfaz inalámbrica o vacíe " ++"el campo crear para definir una red nueva." ++ ++msgid "Cipher" ++msgstr "Cifrado" ++ ++msgid "" ++"Click \"Generate archive\" to download a tar archive of the current " ++"configuration files. To reset the firmware to its initial state, click " ++"\"Perform reset\" (only possible with squashfs images)." ++msgstr "" ++"Pulse \"generar archivo\" para descargar un fichero tar con los ficheros de " ++"configuración actuales. Para reiniciar el firmware a su estado inicial pulse " ++"\"Reiniciar\" (sólo posible con imágenes squashfs)." ++ ++msgid "Client" ++msgstr "Cliente" ++ ++msgid "Client ID to send when requesting DHCP" ++msgstr "ID de cliente que se enviará al solicitar DHCP" ++ ++msgid "" ++"Close inactive connection after the given amount of seconds, use 0 to " ++"persist connection" ++msgstr "" ++"Cerrar las conexiones inactivas tras los segundos dados. Use 0 para una " ++"conexión permanente" ++ ++msgid "Close list..." ++msgstr "Cerrar lista..." ++ ++msgid "Collecting data..." ++msgstr "Un momento..." ++ ++msgid "Command" ++msgstr "Comando" ++ ++msgid "Common Configuration" ++msgstr "Configuración común" ++ ++msgid "Compression" ++msgstr "Compresión" ++ ++msgid "Configuration" ++msgstr "Configuración" ++ ++msgid "Configuration applied." ++msgstr "Configuración establecida." ++ ++msgid "Configuration files will be kept." ++msgstr "Se mantendrán los ficheros de configuración." ++ ++msgid "Confirmation" ++msgstr "Confirmación" ++ ++msgid "Connect" ++msgstr "Conectar" ++ ++msgid "Connected" ++msgstr "Conectado" ++ ++msgid "Connection Limit" ++msgstr "Límite de conexión" ++ ++msgid "Connection to server fails when TLS cannot be used" ++msgstr "" ++ ++msgid "Connections" ++msgstr "Conexiones" ++ ++msgid "Country" ++msgstr "País" ++ ++msgid "Country Code" ++msgstr "Código de país" ++ ++msgid "Cover the following interface" ++msgstr "Cubre el interfaz siguiente" ++ ++msgid "Cover the following interfaces" ++msgstr "Cubre los siguientes interfaces" ++ ++msgid "Create / Assign firewall-zone" ++msgstr "Crear / Asignar zona de seguridad" ++ ++msgid "Create Interface" ++msgstr "Crear interfaz" ++ ++msgid "Create a bridge over multiple interfaces" ++msgstr "Crear un puente sobre múltiples interfaces" ++ ++msgid "Critical" ++msgstr "Crítico" ++ ++msgid "Cron Log Level" ++msgstr "Nivel de registro de cron" ++ ++msgid "Custom Interface" ++msgstr "Interfaz propio" ++ ++msgid "Custom delegated IPv6-prefix" ++msgstr "" ++ ++msgid "" ++"Customizes the behaviour of the device LEDs if possible." ++msgstr "" ++"Personaliza el comportamiento de los LEDs del dispositivo, si es posible." ++ ++msgid "DHCP Leases" ++msgstr "Cesiones DHCP" ++ ++msgid "DHCP Server" ++msgstr "Servidor DHCP" ++ ++msgid "DHCP and DNS" ++msgstr "DHCP y DNS" ++ ++msgid "DHCP client" ++msgstr "Cliente DHCP" ++ ++msgid "DHCP-Options" ++msgstr "Opciones de DHCP" ++ ++msgid "DHCPv6 Leases" ++msgstr "Cesiones DHCPv6" ++ ++msgid "DHCPv6 client" ++msgstr "" ++ ++msgid "DHCPv6-Mode" ++msgstr "" ++ ++msgid "DHCPv6-Service" ++msgstr "" ++ ++msgid "DNS" ++msgstr "DNS" ++ ++msgid "DNS forwardings" ++msgstr "Retransmisión DNS" ++ ++msgid "DNS-Label / FQDN" ++msgstr "" ++ ++msgid "DS-Lite AFTR address" ++msgstr "" ++ ++msgid "DUID" ++msgstr "DUID" ++ ++msgid "Debug" ++msgstr "Depuración" ++ ++msgid "Default %d" ++msgstr "%d por defecto" ++ ++msgid "Default gateway" ++msgstr "Gateway por defecto" ++ ++msgid "Default route" ++msgstr "" ++ ++msgid "Default state" ++msgstr "Estado por defecto" ++ ++msgid "Define a name for this network." ++msgstr "Definir un nombre para esta red." ++ ++msgid "" ++"Define additional DHCP options, for example " ++"\"6,192.168.2.1,192.168.2.2\" which advertises different DNS " ++"servers to clients." ++msgstr "" ++"Definir optiones adicionales DHCP, por ejemplo " ++"\"6,192.168.2.1,192.168.2.2\" que publica diferentes servidores " ++"DNS a los clientes." ++ ++msgid "Delete" ++msgstr "Eliminar" ++ ++msgid "Delete this interface" ++msgstr "Borrar esta interfaz" ++ ++msgid "Delete this network" ++msgstr "Borrar esta red" ++ ++msgid "Description" ++msgstr "Descripción" ++ ++msgid "Design" ++msgstr "Diseño" ++ ++msgid "Destination" ++msgstr "Destino" ++ ++msgid "Device" ++msgstr "Dispositivo" ++ ++msgid "Device Configuration" ++msgstr "Configuración del dispositivo" ++ ++msgid "Diagnostics" ++msgstr "Diagnósticos" ++ ++msgid "Dial number" ++msgstr "" ++ ++msgid "Directory" ++msgstr "Directorio" ++ ++msgid "Disable" ++msgstr "Desactivar" ++ ++msgid "" ++"Disable DHCP for " ++"this interface." ++msgstr "" ++"Desactivar DHCP " ++"para esta interfaz." ++ ++msgid "Disable DNS setup" ++msgstr "Desactivar configuración de DNS" ++ ++msgid "Disable HW-Beacon timer" ++msgstr "Desactivar el temporizador de baliza hardware" ++ ++msgid "Disabled" ++msgstr "Desactivar" ++ ++msgid "Discard upstream RFC1918 responses" ++msgstr "Descartar respuestas RFC1918 salientes" ++ ++msgid "Displaying only packages containing" ++msgstr "Mostrar sólo paquete que contienen" ++ ++msgid "Distance Optimization" ++msgstr "Optimización de distancia" ++ ++msgid "Distance to farthest network member in meters." ++msgstr "Distancia al miembro de la red mas lejana en metros." ++ ++msgid "Diversity" ++msgstr "Diversidad" ++ ++msgid "" ++"Dnsmasq is a combined DHCP-Server and DNS-" ++"Forwarder for NAT " ++"firewalls" ++msgstr "" ++"Dnsmasq es un programa que combina un servidor DHCP y un reenviador DNS para cortafuegos NAT" ++ ++msgid "Do not cache negative replies, e.g. for not existing domains" ++msgstr "No guardar respuestas negativas, por ejemplo dominios inexistentes" ++ ++msgid "Do not forward requests that cannot be answered by public name servers" ++msgstr "" ++"No retransmitir peticiones que no se puedan responder por servidores de " ++"nombres públicos" ++ ++msgid "Do not forward reverse lookups for local networks" ++msgstr "No retransmitir búsquedas inversas para redes locales" ++ ++msgid "Do not send probe responses" ++msgstr "No enviar respuestas de prueba" ++ ++msgid "Domain required" ++msgstr "Dominio requerido" ++ ++msgid "Domain whitelist" ++msgstr "Lista blanca de dominios" ++ ++msgid "" ++"Don't forward DNS-Requests without " ++"DNS-Name" ++msgstr "" ++"No reenviar peticiones de DNS sin " ++"un nombre de DNS" ++ ++msgid "Download and install package" ++msgstr "Descargar e instalar paquete" ++ ++msgid "Download backup" ++msgstr "Descargar copia de seguridad" ++ ++msgid "Dropbear Instance" ++msgstr "Instancia Dropbear" ++ ++msgid "" ++"Dropbear offers SSH network shell access " ++"and an integrated SCP server" ++msgstr "" ++"Dropbear ofrece acceso SSH y un servidor " ++"SCP" ++ ++msgid "Dual-Stack Lite (RFC6333)" ++msgstr "" ++ ++msgid "Dynamic DHCP" ++msgstr "" ++"DHCP dinámico" ++ ++msgid "Dynamic tunnel" ++msgstr "Túnel dinámico" ++ ++msgid "" ++"Dynamically allocate DHCP addresses for clients. If disabled, only clients " ++"having static leases will be served." ++msgstr "" ++"Reparte direcciones DHCP dinámicamente a los clientes. Si se desactiva sólo " ++"se servirá a clientes con cesiones estáticas." ++ ++msgid "EAP-Method" ++msgstr "Método EAP" ++ ++msgid "Edit" ++msgstr "Editar" ++ ++msgid "" ++"Edit the raw configuration data above to fix any error and hit \"Save\" to " ++"reload the page." ++msgstr "" ++ ++msgid "Edit this interface" ++msgstr "Editar esta interfaz" ++ ++msgid "Edit this network" ++msgstr "Editar esta red" ++ ++msgid "Emergency" ++msgstr "Emergencia" ++ ++msgid "Enable" ++msgstr "Activar" ++ ++msgid "Enable STP" ++msgstr "Activar STP" ++ ++msgid "Enable HE.net dynamic endpoint update" ++msgstr "Activar actualización dinámica de punto final HE.net" ++ ++msgid "Enable IPv6 negotiation on the PPP link" ++msgstr "Activar negociación IPv6 en el enlace PPP" ++ ++msgid "Enable Jumbo Frame passthrough" ++msgstr "Activar paso de tramas jumbo" ++ ++msgid "Enable NTP client" ++msgstr "Activar cliente NTP" ++ ++msgid "Enable TFTP server" ++msgstr "Activar servidor TFTP" ++ ++msgid "Enable VLAN functionality" ++msgstr "Activar funcionalidad VLAN" ++ ++msgid "Enable WPS pushbutton, requires WPA(2)-PSK" ++msgstr "" ++ ++msgid "Enable learning and aging" ++msgstr "Activar aprendizaje y envejecimiento" ++ ++msgid "Enable mirroring of incoming packets" ++msgstr "" ++ ++msgid "Enable mirroring of outgoing packets" ++msgstr "" ++ ++msgid "Enable this mount" ++msgstr "Active este punto de montaje" ++ ++msgid "Enable this swap" ++msgstr "Activar este swap" ++ ++msgid "Enable/Disable" ++msgstr "Activar/Desactivar" ++ ++msgid "Enabled" ++msgstr "Activado" ++ ++msgid "Enables the Spanning Tree Protocol on this bridge" ++msgstr "Activa el protocol STP en este puente" ++ ++msgid "Encapsulation mode" ++msgstr "Modo de encapsulado" ++ ++msgid "Encryption" ++msgstr "Encriptación" ++ ++msgid "Erasing..." ++msgstr "Borrando..." ++ ++msgid "Error" ++msgstr "Error" ++ ++msgid "Ethernet Adapter" ++msgstr "Adaptador ethernet" ++ ++msgid "Ethernet Switch" ++msgstr "Switch ethernet" ++ ++msgid "Expand hosts" ++msgstr "Expandir nombre de máquina" ++ ++msgid "Expires" ++msgstr "Expira" ++ ++#, fuzzy ++msgid "" ++"Expiry time of leased addresses, minimum is 2 minutes (2m)." ++msgstr "" ++"Tiempo de finalización de direcciones cedidas (mínimo dos minutos: 2m)." ++ ++msgid "External" ++msgstr "" ++ ++msgid "External system log server" ++msgstr "Servidor externo de registro del sistema" ++ ++msgid "External system log server port" ++msgstr "Puerto del servidor externo de registro del sistema" ++ ++msgid "Fast Frames" ++msgstr "Tramas rápidas" ++ ++msgid "File" ++msgstr "Fichero" ++ ++msgid "Filename of the boot image advertised to clients" ++msgstr "Nombre del fichero de imagen de arranque mostrado a los clientes" ++ ++msgid "Filesystem" ++msgstr "Sistema de ficheros" ++ ++msgid "Filter" ++msgstr "Filtro" ++ ++msgid "Filter private" ++msgstr "Filtro privado" ++ ++msgid "Filter useless" ++msgstr "Filtro inútil" ++ ++msgid "Find and join network" ++msgstr "Encontrar y unirse a red" ++ ++msgid "Find package" ++msgstr "Buscar paquete" ++ ++msgid "Finish" ++msgstr "Terminar" ++ ++msgid "Firewall" ++msgstr "Cortafuegos" ++ ++msgid "Firewall Settings" ++msgstr "Configuración del cortafuegos" ++ ++msgid "Firewall Status" ++msgstr "Estado del cortafuegos" ++ ++msgid "Firmware Version" ++msgstr "Versión del firmware" ++ ++msgid "Fixed source port for outbound DNS queries" ++msgstr "Puerto origen fijo para peticiones de DNS salientes" ++ ++msgid "Flags" ++msgstr "Indicadores" ++ ++msgid "Flash Firmware" ++msgstr "Grabar firmware" ++ ++msgid "Flash image..." ++msgstr "Grabar imagen..." ++ ++msgid "Flash new firmware image" ++msgstr "Grabar imágenes del firmware" ++ ++msgid "Flash operations" ++msgstr "Operaciones de grabado" ++ ++msgid "Flashing..." ++msgstr "Grabando..." ++ ++msgid "Force" ++msgstr "Forzar" ++ ++msgid "Force CCMP (AES)" ++msgstr "Forzar CCMP (AES)" ++ ++msgid "Force DHCP on this network even if another server is detected." ++msgstr "Forzar DHCP en esta red aunque se detecte otro servidor." ++ ++msgid "Force TKIP" ++msgstr "Forzar TKIP" ++ ++msgid "Force TKIP and CCMP (AES)" ++msgstr "Forzar TKIP y CCMP (AES)" ++ ++msgid "Forward DHCP traffic" ++msgstr "Retransmitir tráfico DHCP" ++ ++msgid "Forward broadcast traffic" ++msgstr "Retransmitir tráfico de propagación" ++ ++msgid "Forwarding mode" ++msgstr "Modo de retransmisión" ++ ++msgid "Fragmentation Threshold" ++msgstr "Umbral de fragmentación" ++ ++# It should be "Frame Bursting" at once! ++msgid "Frame Bursting" ++msgstr "Frame Bursting" ++ ++msgid "Free" ++msgstr "Libre" ++ ++msgid "Free space" ++msgstr "Espacio libre" ++ ++msgid "GHz" ++msgstr "GHz" ++ ++msgid "GPRS only" ++msgstr "Sólo GPRS" ++ ++msgid "Gateway" ++msgstr "Pasarela" ++ ++msgid "Gateway ports" ++msgstr "Puertos del gateway" ++ ++msgid "General Settings" ++msgstr "Configuración general" ++ ++msgid "General Setup" ++msgstr "Configuración general" ++ ++msgid "Generate archive" ++msgstr "Generar archivo" ++ ++msgid "Generic 802.11%s Wireless Controller" ++msgstr "Controlador inalámbrico 802.11%s genérico" ++ ++msgid "Given password confirmation did not match, password not changed!" ++msgstr "" ++"La confirmación y la contraseña no coinciden. ¡No se ha cambiado la " ++"contraseña!" ++ ++msgid "Global network options" ++msgstr "" ++ ++msgid "Go to password configuration..." ++msgstr "Ir a configuración de contraseña..." ++ ++msgid "Go to relevant configuration page" ++msgstr "Ir a la página principal de configuración" ++ ++msgid "Guest" ++msgstr "" ++ ++msgid "HE.net password" ++msgstr "Contraseña HE.net" ++ ++msgid "HE.net username" ++msgstr "" ++ ++msgid "Handler" ++msgstr "Manejador" ++ ++msgid "Hang Up" ++msgstr "Suspender" ++ ++msgid "Heartbeat" ++msgstr "" ++ ++msgid "" ++"Here you can configure the basic aspects of your device like its hostname or " ++"the timezone." ++msgstr "" ++"Aspectos básicos de su dispositivo como la zona horaria o nombre de máquina." ++ ++msgid "" ++"Here you can paste public SSH-Keys (one per line) for SSH public-key " ++"authentication." ++msgstr "Claves públicas SSH. Ponga una por línea." ++ ++msgid "Hermes 802.11b Wireless Controller" ++msgstr "Controlador inalámbrico 802.11b Hermes" ++ ++msgid "Hide ESSID" ++msgstr "Ocultar ESSID" ++ ++msgid "Host entries" ++msgstr "Entradas de máquina" ++ ++msgid "Host expiry timeout" ++msgstr "Espera para caducidad de máquinas" ++ ++msgid "Host-IP or Network" ++msgstr "" ++"Dirección IP de máquina o " ++"red" ++ ++msgid "Hostname" ++msgstr "Nombre de máquina" ++ ++msgid "Hostname to send when requesting DHCP" ++msgstr "Nombre de máquina a enviar cuando se solicite DHCP" ++ ++msgid "Hostnames" ++msgstr "Nombres de máquina" ++ ++msgid "Hybrid" ++msgstr "" ++ ++msgid "IP address" ++msgstr "Dirección IP" ++ ++msgid "IPv4" ++msgstr "IPv4" ++ ++msgid "IPv4 Firewall" ++msgstr "Cortafuegos IPv4" ++ ++msgid "IPv4 WAN Status" ++msgstr "Estado de la WAN IPv4" ++ ++msgid "IPv4 address" ++msgstr "Dirección IPv4" ++ ++msgid "IPv4 and IPv6" ++msgstr "IPv4 e IPv6" ++ ++msgid "IPv4 assignment length" ++msgstr "" ++ ++msgid "IPv4 broadcast" ++msgstr "Propagación IPv4" ++ ++msgid "IPv4 gateway" ++msgstr "Gateway IPv4" ++ ++msgid "IPv4 netmask" ++msgstr "Máscara de red IPv4" ++ ++msgid "IPv4 only" ++msgstr "Sólo IPv4" ++ ++msgid "IPv4 prefix length" ++msgstr "Longitud de prefijo IPv4" ++ ++msgid "IPv4-Address" ++msgstr "Dirección IPv4" ++ ++msgid "IPv6" ++msgstr "IPv6" ++ ++msgid "IPv6 Firewall" ++msgstr "Cortafuegos IPv6" ++ ++msgid "IPv6 Neighbours" ++msgstr "" ++ ++msgid "IPv6 Settings" ++msgstr "" ++ ++msgid "IPv6 ULA-Prefix" ++msgstr "" ++ ++msgid "IPv6 WAN Status" ++msgstr "Estado de la WAN IPv6" ++ ++msgid "IPv6 address" ++msgstr "Dirección IPv6" ++ ++msgid "IPv6 address delegated to the local tunnel endpoint (optional)" ++msgstr "" ++ ++msgid "IPv6 assignment hint" ++msgstr "" ++ ++msgid "IPv6 assignment length" ++msgstr "" ++ ++msgid "IPv6 gateway" ++msgstr "Gateway IPv6" ++ ++msgid "IPv6 only" ++msgstr "Sólo IPv6" ++ ++msgid "IPv6 prefix" ++msgstr "Prefijo IPv6" ++ ++msgid "IPv6 prefix length" ++msgstr "Longitud de prefijo IPv6" ++ ++msgid "IPv6 routed prefix" ++msgstr "" ++ ++msgid "IPv6-Address" ++msgstr "Dirección IPv6" ++ ++msgid "IPv6-in-IPv4 (RFC4213)" ++msgstr "IPv6-en-IPv4 (RFC4213)" ++ ++msgid "IPv6-over-IPv4 (6rd)" ++msgstr "IPv6-sobre-IPv4 (6rd)" ++ ++msgid "IPv6-over-IPv4 (6to4)" ++msgstr "IPv6-sobre-IPv4 (6to4)" ++ ++msgid "Identity" ++msgstr "Identidad" ++ ++msgid "" ++"If specified, mount the device by its UUID instead of a fixed device node" ++msgstr "" ++"Montar el dispositivo por su UUID en vez de un nodo fijo de dispositivo si " ++"se especifica" ++ ++msgid "" ++"If specified, mount the device by the partition label instead of a fixed " ++"device node" ++msgstr "" ++"Montar el dispositivo por la etiqueta de la partición en vez de por el nodo " ++"fijo de dispositivo si se especifica" ++ ++msgid "If unchecked, no default route is configured" ++msgstr "Si está desmarcado no se configurará una ruta por defecto" ++ ++msgid "If unchecked, the advertised DNS server addresses are ignored" ++msgstr "" ++"Si está desmarcado las direcciones de servidor DNS anunciadas se ignorarán" ++ ++msgid "" ++"If your physical memory is insufficient unused data can be temporarily " ++"swapped to a swap-device resulting in a higher amount of usable RAM. Be aware that swapping data is a very " ++"slow process as the swap-device cannot be accessed with the high datarates " ++"of the RAM." ++msgstr "" ++"Si su dispositivo no tiene memoria RAM suficiente, los datos no utilizados pueden ser guardados temporalmente " ++"en un dispositivo de intercambio (swap-device) liberando el espacio que " ++"ocupan. Tenga en cuenta que el intercambio es un proceso lento porque los " ++"dispositivos de intercambio no pueden transferir volúmenes de información a " ++"alta velocidad tal y como hace la memoria RAM." ++ ++msgid "Ignore Hosts files" ++msgstr "Ignorar fichero de máquinas" ++ ++msgid "Ignore interface" ++msgstr "Ignorar interfaz" ++ ++msgid "Ignore resolve file" ++msgstr "Ignorar el fichero resolv" ++ ++msgid "Image" ++msgstr "Imagen" ++ ++msgid "In" ++msgstr "Entrada" ++ ++msgid "Inactivity timeout" ++msgstr "Espera de inactividad" ++ ++msgid "Inbound:" ++msgstr "Entrantes:" ++ ++msgid "Info" ++msgstr "Información" ++ ++msgid "Initscript" ++msgstr "Nombre del script de inicio" ++ ++msgid "Initscripts" ++msgstr "Scripts de inicio" ++ ++msgid "Install" ++msgstr "Instalar" ++ ++msgid "Install iputils-traceroute6 for IPv6 traceroute" ++msgstr "" ++ ++msgid "Install package %q" ++msgstr "Instalar el paquete %q" ++ ++msgid "Install protocol extensions..." ++msgstr "Instalar extensiones de protocolo..." ++ ++msgid "Installed packages" ++msgstr "Paquetes instalados" ++ ++msgid "Interface" ++msgstr "Interfaz" ++ ++msgid "Interface Configuration" ++msgstr "Configuración del interfaz" ++ ++msgid "Interface Overview" ++msgstr "Resumen de interfaces" ++ ++msgid "Interface is reconnecting..." ++msgstr "Reconectando interfaz..." ++ ++msgid "Interface is shutting down..." ++msgstr "Parando interfaz..." ++ ++msgid "Interface not present or not connected yet." ++msgstr "El interfaz no existe o no está aún conectado." ++ ++msgid "Interface reconnected" ++msgstr "Interfaz reconectado" ++ ++msgid "Interface shut down" ++msgstr "Interfaz detenido" ++ ++msgid "Interfaces" ++msgstr "Interfaces" ++ ++msgid "Internal" ++msgstr "" ++ ++msgid "Internal Server Error" ++msgstr "Error interno del servidor" ++ ++msgid "Invalid" ++msgstr "Valor ingresado inválido" ++ ++msgid "Invalid VLAN ID given! Only IDs between %d and %d are allowed." ++msgstr "¡ID VLAN no válido! Sólo se permiten IDs entre %d y %d." ++ ++msgid "Invalid VLAN ID given! Only unique IDs are allowed" ++msgstr "¡ID VLAN no válido! Sólo se permiten IDs únicos" ++ ++msgid "Invalid username and/or password! Please try again." ++msgstr "" ++"¡Nombre de usuario o contraseña no válidos!. Pruebe de nuevo, por favor." ++ ++#, fuzzy ++msgid "" ++"It appears that you are trying to flash an image that does not fit into the " ++"flash memory, please verify the image file!" ++msgstr "" ++"Parece que está intentando grabar una imagen de firmware mayor que la " ++"memoria flash de su equipo. ¡Por favor, verifique el archivo!" ++ ++msgid "Java Script required!" ++msgstr "¡Se necesita JavaScript!" ++ ++msgid "Join Network" ++msgstr "Unirse a Red" ++ ++msgid "Join Network: Settings" ++msgstr "Unirse a Red: Configuración" ++ ++msgid "Join Network: Wireless Scan" ++msgstr "Unirse a una red: Exploración inalámbrica" ++ ++msgid "Keep settings" ++msgstr "Conservar la configuración del router" ++ ++msgid "Kernel Log" ++msgstr "Registro del Kernel" ++ ++msgid "Kernel Version" ++msgstr "Versión del Kernel" ++ ++msgid "Key" ++msgstr "Clave" ++ ++msgid "Key #%d" ++msgstr "Clave #%d" ++ ++msgid "Kill" ++msgstr "Matar" ++ ++msgid "L2TP" ++msgstr "L2TP" ++ ++msgid "L2TP Server" ++msgstr "Servidor L2TP" ++ ++msgid "LCP echo failure threshold" ++msgstr "Umbral de fracaso en eco LCP" ++ ++msgid "LCP echo interval" ++msgstr "Intervalo de eco LCP" ++ ++msgid "LLC" ++msgstr "LLC" ++ ++msgid "Label" ++msgstr "Etiqueta" ++ ++msgid "Language" ++msgstr "Idioma" ++ ++msgid "Language and Style" ++msgstr "Idioma y Estilo" ++ ++msgid "Leaf" ++msgstr "" ++ ++msgid "Lease validity time" ++msgstr "Tiempo de validación de cesión" ++ ++msgid "Leasefile" ++msgstr "Archivo de cesiones" ++ ++msgid "Leasetime" ++msgstr "Tiempo de cesión" ++ ++msgid "Leasetime remaining" ++msgstr "Tiempo de cesión restante" ++ ++msgid "Leave empty to autodetect" ++msgstr "Dejar vacío para autodetectar" ++ ++msgid "Leave empty to use the current WAN address" ++msgstr "Dejar vacío para usar la dirección WAN actual" ++ ++msgid "Legend:" ++msgstr "Leyenda:" ++ ++msgid "Limit" ++msgstr "Límite" ++ ++msgid "Line Attenuation" ++msgstr "" ++ ++msgid "Line Speed" ++msgstr "" ++ ++msgid "Line State" ++msgstr "" ++ ++msgid "Link On" ++msgstr "Enlace activado" ++ ++msgid "" ++"List of DNS servers to forward " ++"requests to" ++msgstr "" ++"Lista de servidores DNS a los que " ++"enviar solicitudes" ++ ++msgid "List of domains to allow RFC1918 responses for" ++msgstr "Lista de dominios a los que se permiten respuestas RFC1918" ++ ++msgid "List of hosts that supply bogus NX domain results" ++msgstr "Lista de máquinas que proporcionan resultados de dominio NX falsos" ++ ++msgid "Listen only on the given interface or, if unspecified, on all" ++msgstr "Escucha solo en la interfaz dada o, si no se especifica, en todas" ++ ++msgid "Listening port for inbound DNS queries" ++msgstr "Puerto de escucha para consultas DNS entrantes" ++ ++msgid "Load" ++msgstr "Carga" ++ ++msgid "Load Average" ++msgstr "Carga Media" ++ ++msgid "Loading" ++msgstr "Cargando" ++ ++msgid "Local IPv4 address" ++msgstr "Dirección local IPv4" ++ ++msgid "Local IPv6 address" ++msgstr "Dirección local IPv6" ++ ++msgid "Local Startup" ++msgstr "Arranque local" ++ ++msgid "Local Time" ++msgstr "Hora local" ++ ++msgid "Local domain" ++msgstr "Dominio local" ++ ++#, fuzzy ++msgid "" ++"Local domain specification. Names matching this domain are never forwarded " ++"and are resolved from DHCP or hosts files only" ++msgstr "" ++"Especificación de dominio local. Los nombres que coincidan con este dominio " ++"nunca se retransmiten y se resuelven desde DHCP o ficheros de máquina locales" ++ ++msgid "Local domain suffix appended to DHCP names and hosts file entries" ++msgstr "" ++"Sufijo del dominio local que se añade a los nombres DHCP y a las entradas " ++"del fichero de máquinas" ++ ++msgid "Local server" ++msgstr "Servidor local" ++ ++msgid "" ++"Localise hostname depending on the requesting subnet if multiple IPs are " ++"available" ++msgstr "" ++"Localizar nombre de máquina dependiendo de que la subred peticionaria si hay " ++"disponibles múltiples IPs" ++ ++msgid "Localise queries" ++msgstr "Localizar consultas" ++ ++msgid "Locked to channel %d used by: %s" ++msgstr "" ++ ++msgid "Log output level" ++msgstr "Nivel de registro" ++ ++msgid "Log queries" ++msgstr "Registrar consultas" ++ ++msgid "Logging" ++msgstr "Registro" ++ ++msgid "Login" ++msgstr "Iniciar sesión" ++ ++msgid "Logout" ++msgstr "Cerrar sesión" ++ ++msgid "Lowest leased address as offset from the network address." ++msgstr "Dirección cedida más baja como diferencia de la dirección de red." ++ ++msgid "MAC-Address" ++msgstr "Dirección MAC" ++ ++msgid "MAC-Address Filter" ++msgstr "Filtro por dirección MAC" ++ ++msgid "MAC-Filter" ++msgstr "Filtro por dirección MAC" ++ ++msgid "MAC-List" ++msgstr "Lista de direcciones MAC" ++ ++msgid "MB/s" ++msgstr "MB/s" ++ ++msgid "MHz" ++msgstr "MHz" ++ ++msgid "MTU" ++msgstr "MTU" ++ ++msgid "" ++"Make sure to clone the root filesystem using something like the commands " ++"below:" ++msgstr "" ++ ++msgid "Maximum Rate" ++msgstr "Ratio Máximo" ++ ++msgid "Maximum allowed number of active DHCP leases" ++msgstr "Número máximo de cesiones DHCP activas" ++ ++msgid "Maximum allowed number of concurrent DNS queries" ++msgstr "Número máximo de consultas DNS concurrentes" ++ ++msgid "Maximum allowed size of EDNS.0 UDP packets" ++msgstr "Tamaño máximo de paquetes EDNS.0 paquetes UDP" ++ ++msgid "Maximum amount of seconds to wait for the modem to become ready" ++msgstr "Segundos máximos de espera a que el módem esté activo" ++ ++msgid "Maximum hold time" ++msgstr "Pausa máxima de transmisión" ++ ++msgid "Maximum number of leased addresses." ++msgstr "Máximas cesiones activas." ++ ++msgid "Mbit/s" ++msgstr "Mbit/s" ++ ++msgid "Memory" ++msgstr "Memoria" ++ ++msgid "Memory usage (%)" ++msgstr "Uso de memoria (%)" ++ ++msgid "Metric" ++msgstr "Métrica" ++ ++msgid "Minimum Rate" ++msgstr "Ratio mínimo" ++ ++msgid "Minimum hold time" ++msgstr "Pausa mínima de espera" ++ ++msgid "Mirror monitor port" ++msgstr "" ++ ++msgid "Mirror source port" ++msgstr "" ++ ++msgid "Missing protocol extension for proto %q" ++msgstr "Extensión de protocolo faltante para %q" ++ ++msgid "Mode" ++msgstr "Modo" ++ ++msgid "Model" ++msgstr "" ++ ++msgid "Modem device" ++msgstr "Dispositivo de módem" ++ ++msgid "Modem init timeout" ++msgstr "Espera de inicialización del modem" ++ ++msgid "Monitor" ++msgstr "Monitor" ++ ++msgid "Mount Entry" ++msgstr "Entrada de montaje" ++ ++msgid "Mount Point" ++msgstr "Punto de montaje" ++ ++msgid "Mount Points" ++msgstr "Puntos de montaje" ++ ++msgid "Mount Points - Mount Entry" ++msgstr "Puntos de montaje - Entrada de montaje" ++ ++msgid "Mount Points - Swap Entry" ++msgstr "Puntos de montaje - Entrada de intercambio" ++ ++msgid "" ++"Mount Points define at which point a memory device will be attached to the " ++"filesystem" ++msgstr "" ++"Los puntos de montaje definen el directorio en el que un dispositivo de " ++"memoria se unirá al sistema del archivos" ++ ++msgid "Mount options" ++msgstr "Opciones de montaje" ++ ++msgid "Mount point" ++msgstr "Punto de montaje" ++ ++msgid "Mounted file systems" ++msgstr "Sistemas de archivo montados" ++ ++msgid "Move down" ++msgstr "Bajar" ++ ++msgid "Move up" ++msgstr "Subir" ++ ++msgid "Multicast Rate" ++msgstr "Ratio multicast" ++ ++msgid "Multicast address" ++msgstr "Dirección multicast" ++ ++msgid "NAS ID" ++msgstr "NAS ID" ++ ++msgid "NDP-Proxy" ++msgstr "" ++ ++msgid "NTP server candidates" ++msgstr "Servidores NTP a consultar" ++ ++msgid "NTP sync time-out" ++msgstr "" ++ ++msgid "Name" ++msgstr "Nombre" ++ ++msgid "Name of the new interface" ++msgstr "Nombre de la nueva interfaz" ++ ++msgid "Name of the new network" ++msgstr "Nombre de la nueva red" ++ ++msgid "Navigation" ++msgstr "Navegación" ++ ++msgid "Netmask" ++msgstr "Máscara de red" ++ ++msgid "Network" ++msgstr "Red" ++ ++msgid "Network Utilities" ++msgstr "Utilidades de red" ++ ++msgid "Network boot image" ++msgstr "Imagen de arranque en red" ++ ++msgid "Network without interfaces." ++msgstr "Red sin interfaces." ++ ++msgid "Next »" ++msgstr "Siguiente »" ++ ++msgid "No DHCP Server configured for this interface" ++msgstr "No se ha configurado un servidor DHCP para esta interfaz" ++ ++msgid "No chains in this table" ++msgstr "No hay cadenas en esta tabla" ++ ++msgid "No files found" ++msgstr "No se han encontrado ficheros" ++ ++msgid "No information available" ++msgstr "No hay información disponible" ++ ++msgid "No negative cache" ++msgstr "Sin caché negativa" ++ ++msgid "No network configured on this device" ++msgstr "No hay red configurada para este dispositivo" ++ ++msgid "No network name specified" ++msgstr "No se ha especificado un nombre de red" ++ ++msgid "No package lists available" ++msgstr "No hay listas de paquetes disponibles" ++ ++msgid "No password set!" ++msgstr "¡Sin contraseña!" ++ ++msgid "No rules in this chain" ++msgstr "No hay reglas en esta cadena" ++ ++msgid "No zone assigned" ++msgstr "Sin zona asignada" ++ ++msgid "Noise" ++msgstr "Ruido" ++ ++msgid "Noise Margin" ++msgstr "" ++ ++msgid "Noise:" ++msgstr "Ruido:" ++ ++msgid "None" ++msgstr "Ninguno" ++ ++msgid "Normal" ++msgstr "Normal" ++ ++msgid "Not Found" ++msgstr "No encontrado" ++ ++msgid "Not associated" ++msgstr "No asociado" ++ ++msgid "Not connected" ++msgstr "No conectado" ++ ++msgid "Note: Configuration files will be erased." ++msgstr "Nota: se borrarán los ficheros de configuración." ++ ++msgid "Notice" ++msgstr "Aviso" ++ ++msgid "Nslookup" ++msgstr "NSLookup" ++ ++msgid "OK" ++msgstr "Aceptar" ++ ++msgid "OPKG-Configuration" ++msgstr "Configuración de OPKG" ++ ++msgid "Off-State Delay" ++msgstr "Retraso de desconexión" ++ ++msgid "" ++"On this page you can configure the network interfaces. You can bridge " ++"several interfaces by ticking the \"bridge interfaces\" field and enter the " ++"names of several network interfaces separated by spaces. You can also use " ++"VLAN notation " ++"INTERFACE.VLANNR (e.g.: " ++"eth0.1)." ++msgstr "" ++"Configure las interfaces de red. Puede hacer puentes con diferentes " ++"interfaces, marcando el campo \"puentear interfaces\" e introduciendo el " ++"nombre de las mismas separadas por espacios. También puede usar la notación " ++"VLAN, INTERFACE." ++"VLANNR (Ej.: eth0.1)." ++ ++msgid "On-State Delay" ++msgstr "Retraso de activación" ++ ++msgid "One of hostname or mac address must be specified!" ++msgstr "¡Debe especificar al menos un nombre de máquina o dirección mac!" ++ ++msgid "One or more fields contain invalid values!" ++msgstr "¡Valores no válidos!" ++ ++msgid "One or more required fields have no value!" ++msgstr "¡Campos vacíos!" ++ ++msgid "Open list..." ++msgstr "Abrir lista..." ++ ++msgid "OpenConnect (CISCO AnyConnect)" ++msgstr "" ++ ++msgid "Operating frequency" ++msgstr "" ++ ++msgid "Option changed" ++msgstr "Opción cambiada" ++ ++msgid "Option removed" ++msgstr "Opción eliminada" ++ ++msgid "Optional, specify to override default server (tic.sixxs.net)" ++msgstr "" ++ ++msgid "Optional, use when the SIXXS account has more than one tunnel" ++msgstr "" ++ ++msgid "Options" ++msgstr "Opciones" ++ ++msgid "Other:" ++msgstr "Otros:" ++ ++msgid "Out" ++msgstr "Salida" ++ ++msgid "Outbound:" ++msgstr "Saliente:" ++ ++msgid "Outdoor Channels" ++msgstr "Canales al aire libre" ++ ++msgid "Output Interface" ++msgstr "" ++ ++msgid "Override MAC address" ++msgstr "Ignorar dirección MAC" ++ ++msgid "Override MTU" ++msgstr "Ignorar MTU" ++ ++msgid "Override the gateway in DHCP responses" ++msgstr "Ignorar la pasarela en las respuestas DHCP" ++ ++msgid "" ++"Override the netmask sent to clients. Normally it is calculated from the " ++"subnet that is served." ++msgstr "" ++"Ignorar la máscara de red enviada a los clientes. Normalmente se calcula " ++"desde la subred desde la que se sirve." ++ ++msgid "Override the table used for internal routes" ++msgstr "Ignorar la tabla usada para rutas internas" ++ ++msgid "Overview" ++msgstr "Descripción general" ++ ++msgid "Owner" ++msgstr "Propietario" ++ ++msgid "PAP/CHAP password" ++msgstr "Contraseña PAP/CHAP" ++ ++msgid "PAP/CHAP username" ++msgstr "Nombre de usuario PAP/CHAP" ++ ++msgid "PID" ++msgstr "PID" ++ ++msgid "PIN" ++msgstr "PIN" ++ ++msgid "PPP" ++msgstr "PPP" ++ ++msgid "PPPoA Encapsulation" ++msgstr "Encapsulación PPPoA" ++ ++msgid "PPPoATM" ++msgstr "PPPoATM" ++ ++msgid "PPPoE" ++msgstr "PPPoE" ++ ++msgid "PPtP" ++msgstr "PPtP" ++ ++msgid "Package libiwinfo required!" ++msgstr "¡Se necesita el paquete libiwinfo!" ++ ++msgid "Package lists are older than 24 hours" ++msgstr "Las listas de paquetes tienen más de 24 horas" ++ ++msgid "Package name" ++msgstr "Nombre del paquete" ++ ++msgid "Packets" ++msgstr "Paquetes" ++ ++msgid "Part of zone %q" ++msgstr "Parte de zona %q" ++ ++msgid "Password" ++msgstr "Contraseña" ++ ++msgid "Password authentication" ++msgstr "Autentificación de contraseña" ++ ++msgid "Password of Private Key" ++msgstr "Contraseña de la Clave Privada" ++ ++msgid "Password successfully changed!" ++msgstr "¡Contraseña cambiada!" ++ ++msgid "Path" ++msgstr "Ruta (path)" ++ ++msgid "Path to CA-Certificate" ++msgstr "Ruta al Certificado CA" ++ ++msgid "Path to Client-Certificate" ++msgstr "Camino al certificado de cliente" ++ ++msgid "Path to Private Key" ++msgstr "Ruta a la Clave Privada" ++ ++msgid "Path to executable which handles the button event" ++msgstr "Ruta al ejecutable que maneja el evento button" ++ ++msgid "Peak:" ++msgstr "Pico:" ++ ++msgid "Perform reboot" ++msgstr "Rearrancar" ++ ++msgid "Perform reset" ++msgstr "Reiniciar" ++ ++msgid "Phy Rate:" ++msgstr "Ratio Phy:" ++ ++msgid "Physical Settings" ++msgstr "Configuración física" ++ ++msgid "Ping" ++msgstr "Ping" ++ ++msgid "Pkts." ++msgstr "Paq." ++ ++msgid "Please enter your username and password." ++msgstr "Por favor, introduzca su nombre de usuario y contraseña." ++ ++msgid "Please wait: Device rebooting..." ++msgstr "Espere por favor: Rearrancando dispositivo..." ++ ++msgid "Policy" ++msgstr "Política" ++ ++msgid "Port" ++msgstr "Puerto" ++ ++msgid "Port %d" ++msgstr "Puerto %d" ++ ++msgid "Port %d is untagged in multiple VLANs!" ++msgstr "¡El puerto %d está desmarcado en múltiples VLANs!" ++ ++msgid "Port status:" ++msgstr "Estado del puerto:" ++ ++msgid "" ++"Presume peer to be dead after given amount of LCP echo failures, use 0 to " ++"ignore failures" ++msgstr "" ++"Asumir que el otro estará muerto tras estos fallos de echo LCP, use 0 para " ++"ignorar fallos" ++ ++msgid "Prevents client-to-client communication" ++msgstr "Impide la comunicación cliente a cliente" ++ ++msgid "Prism2/2.5/3 802.11b Wireless Controller" ++msgstr "Controlador inalámbrico 802.11n Prism2/2.5/3" ++ ++msgid "Proceed" ++msgstr "Proceder" ++ ++msgid "Processes" ++msgstr "Procesos" ++ ++msgid "Prot." ++msgstr "Prot." ++ ++msgid "Protocol" ++msgstr "Protocolo" ++ ++msgid "Protocol family" ++msgstr "Familia de procolo" ++ ++msgid "Protocol of the new interface" ++msgstr "Protocolo de la nueva interfaz" ++ ++msgid "Protocol support is not installed" ++msgstr "No está instalado el soporte al protocolo" ++ ++msgid "Provide NTP server" ++msgstr "Dar servicio NTP" ++ ++msgid "Provide new network" ++msgstr "Introduzca una nueva red" ++ ++msgid "Pseudo Ad-Hoc (ahdemo)" ++msgstr "Pseudo Ad-Hoc (ahdemo)" ++ ++msgid "Public prefix routed to this device for distribution to clients." ++msgstr "" ++ ++msgid "Quality" ++msgstr "Calidad" ++ ++msgid "RTS/CTS Threshold" ++msgstr "Umbral RTS/CTS" ++ ++msgid "RX" ++msgstr "RX" ++ ++msgid "RX Rate" ++msgstr "Ratio RX" ++ ++msgid "RaLink 802.11%s Wireless Controller" ++msgstr "Controlador inalámbrico 802.11%s RaLink" ++ ++msgid "Radius-Accounting-Port" ++msgstr "Puerto de contabilidad Radius" ++ ++msgid "Radius-Accounting-Secret" ++msgstr "Secreto de contabilidad Radius" ++ ++msgid "Radius-Accounting-Server" ++msgstr "Servidor de contabilidad Radius" ++ ++msgid "Radius-Authentication-Port" ++msgstr "Puerto de autentificación Radius" ++ ++msgid "Radius-Authentication-Secret" ++msgstr "Secreto de autentificación Radius" ++ ++msgid "Radius-Authentication-Server" ++msgstr "Servidor de autentificación Radius" ++ ++msgid "" ++"Read /etc/ethers to configure the DHCP-Server" ++msgstr "" ++"Leer /etc/ethers para configurar el servidor DHCP" ++ ++msgid "" ++"Really delete this interface? The deletion cannot be undone!\\nYou might " ++"lose access to this device if you are connected via this interface." ++msgstr "" ++"¿Está seguro de borrar esta interfaz?. ¡No será posible deshacer el " ++"borrado!\n" ++"Puede perder el acceso a este dispositivo si está conectado por esta " ++"interfaz." ++ ++msgid "" ++"Really delete this wireless network? The deletion cannot be undone!\\nYou " ++"might lose access to this device if you are connected via this network." ++msgstr "" ++"¿Está seguro de borrar esta red inalámbrica?. ¡No será posible deshacer el " ++"borrado!\n" ++"Puede perder el acceso a este dispositivo si está conectado por esta red." ++ ++msgid "Really reset all changes?" ++msgstr "¿Está seguro de querer reiniciar todos los cambios?" ++ ++#, fuzzy ++msgid "" ++"Really shut down network?\\nYou might lose access to this device if you are " ++"connected via this interface." ++msgstr "" ++"¿Está seguro de querer apagar esta red?.\n" ++"Puede perder el acceso a este dispositivo si está conectado por esta red." ++ ++msgid "" ++"Really shutdown interface \"%s\" ?\\nYou might lose access to this device if " ++"you are connected via this interface." ++msgstr "" ++"¿Está seguro de apagar la interfaz \"%s\"?.\n" ++"Puede perder el acceso a este dispositivo si está conectado por interfaz." ++ ++msgid "Really switch protocol?" ++msgstr "¿Está seguro de querer cambiar el protocolo?" ++ ++msgid "Realtime Connections" ++msgstr "Conexiones en tiempo real" ++ ++msgid "Realtime Graphs" ++msgstr "Gráficas en tiempo real" ++ ++msgid "Realtime Load" ++msgstr "Carga en tiempo real" ++ ++msgid "Realtime Traffic" ++msgstr "Tráfico en tiempo real" ++ ++msgid "Realtime Wireless" ++msgstr "Red inalámbrica en tiempo real" ++ ++msgid "Rebind protection" ++msgstr "Protección contra reasociación" ++ ++msgid "Reboot" ++msgstr "Rearrancar" ++ ++msgid "Rebooting..." ++msgstr "Rearrancando..." ++ ++msgid "Reboots the operating system of your device" ++msgstr "Rearranque el sistema operativo de su dispositivo" ++ ++msgid "Receive" ++msgstr "Recibir" ++ ++msgid "Receiver Antenna" ++msgstr "Antena Receptora" ++ ++msgid "Reconnect this interface" ++msgstr "Reconectar esta interfaz" ++ ++msgid "Reconnecting interface" ++msgstr "Reconectando la interfaz" ++ ++msgid "References" ++msgstr "Referencias" ++ ++msgid "Regulatory Domain" ++msgstr "Dominio Regulador" ++ ++msgid "Relay" ++msgstr "Relé" ++ ++msgid "Relay Bridge" ++msgstr "Puente relé" ++ ++msgid "Relay between networks" ++msgstr "Relé entre redes" ++ ++msgid "Relay bridge" ++msgstr "Puente relé" ++ ++msgid "Remote IPv4 address" ++msgstr "Dirección IPv4 remota" ++ ++msgid "Remove" ++msgstr "Desinstalar" ++ ++msgid "Repeat scan" ++msgstr "Repetir exploración" ++ ++msgid "Replace entry" ++msgstr "Reemplazar entrada" ++ ++msgid "Replace wireless configuration" ++msgstr "Cambiar la configuración inalámbrica" ++ ++msgid "Request IPv6-address" ++msgstr "" ++ ++msgid "Request IPv6-prefix of length" ++msgstr "" ++ ++msgid "Require TLS" ++msgstr "" ++ ++msgid "Required for certain ISPs, e.g. Charter with DOCSIS 3" ++msgstr "Necesario para ciertos ISPs, por ejemplo Charter con DOCSIS 3" ++ ++msgid "Reset" ++msgstr "Reiniciar" ++ ++msgid "Reset Counters" ++msgstr "Reiniciar contadores" ++ ++msgid "Reset to defaults" ++msgstr "Reiniciar a valores por defecto" ++ ++msgid "Resolv and Hosts Files" ++msgstr "Ficheros Resolv y Hosts" ++ ++msgid "Resolve file" ++msgstr "Fichero de resolución" ++ ++msgid "Restart" ++msgstr "Rearrancar" ++ ++msgid "Restart Firewall" ++msgstr "Rearrancar cortafuegos" ++ ++msgid "Restore backup" ++msgstr "Restaurar copia de seguridad" ++ ++msgid "Reveal/hide password" ++msgstr "Mostrar/ocultar contraseña" ++ ++msgid "Revert" ++msgstr "Anular" ++ ++msgid "Root" ++msgstr "Raíz" ++ ++msgid "Root directory for files served via TFTP" ++msgstr "Directorio raíz para los ficheros servidos por TFTP" ++ ++msgid "Root preparation" ++msgstr "" ++ ++msgid "Routed IPv6 prefix for downstream interfaces" ++msgstr "" ++ ++msgid "Router Advertisement-Service" ++msgstr "" ++ ++msgid "Router Password" ++msgstr "Contraseña del router" ++ ++msgid "Routes" ++msgstr "Rutas" ++ ++msgid "" ++"Routes specify over which interface and gateway a certain host or network " ++"can be reached." ++msgstr "" ++"Las rutas especifican sobre qué interfaz y pasarela se puede llegar a una " ++"cierta máquina o red." ++ ++msgid "Rule #" ++msgstr "Nº de regla" ++ ++msgid "Run a filesystem check before mounting the device" ++msgstr "Comprobar el sistema de ficheros antes de montar el dispositivo" ++ ++msgid "Run filesystem check" ++msgstr "Comprobar el sistema de ficheros" ++ ++msgid "" ++"SIXXS supports TIC only, for static tunnels using IP protocol 41 (RFC4213) " ++"use 6in4 instead" ++msgstr "" ++ ++msgid "SIXXS-handle[/Tunnel-ID]" ++msgstr "" ++ ++msgid "SSH Access" ++msgstr "Acceso SSH" ++ ++msgid "SSH-Keys" ++msgstr "Claves SSH" ++ ++msgid "SSID" ++msgstr "SSID" ++ ++msgid "Save" ++msgstr "Guardar" ++ ++msgid "Save & Apply" ++msgstr "Guardar y aplicar" ++ ++msgid "Save & Apply" ++msgstr "Guardar y aplicar" ++ ++msgid "Scan" ++msgstr "Explorar" ++ ++msgid "Scheduled Tasks" ++msgstr "Tareas programadas" ++ ++msgid "Section added" ++msgstr "Sección añadida" ++ ++msgid "Section removed" ++msgstr "Sección eliminada" ++ ++msgid "See \"mount\" manpage for details" ++msgstr "Vea la página del manual de \"mount\" para detalles" ++ ++msgid "" ++"Send LCP echo requests at the given interval in seconds, only effective in " ++"conjunction with failure threshold" ++msgstr "" ++"Enviar peticiones de echo LCP cada intervalo de segundos dado, solo efectivo " ++"usado conjuntamente con el umbral de fallo" ++ ++msgid "Separate Clients" ++msgstr "Aislar clientes" ++ ++msgid "Separate WDS" ++msgstr "WDS aislado" ++ ++msgid "Server Settings" ++msgstr "Configuración del servidor" ++ ++msgid "Server password" ++msgstr "" ++ ++msgid "" ++"Server password, enter the specific password of the tunnel when the username " ++"contains the tunnel ID" ++msgstr "" ++ ++msgid "Server username" ++msgstr "" ++ ++msgid "Service Name" ++msgstr "Nombre de servicio" ++ ++msgid "Service Type" ++msgstr "Tipo de servicio" ++ ++msgid "Services" ++msgstr "Servicios" ++ ++#, fuzzy ++msgid "Set up Time Synchronization" ++msgstr "Sincronización horaria" ++ ++msgid "Setup DHCP Server" ++msgstr "Configuración del servidor DHCP" ++ ++msgid "Show current backup file list" ++msgstr "Mostrar lista de ficheros a salvar" ++ ++msgid "Shutdown this interface" ++msgstr "Apagar esta interfaz" ++ ++msgid "Shutdown this network" ++msgstr "Apagar esta red" ++ ++msgid "Signal" ++msgstr "Señal" ++ ++msgid "Signal:" ++msgstr "Señal:" ++ ++msgid "Size" ++msgstr "Tamaño" ++ ++msgid "Skip" ++msgstr "Saltar" ++ ++msgid "Skip to content" ++msgstr "Saltar al contenido" ++ ++msgid "Skip to navigation" ++msgstr "Saltar a navegación" ++ ++msgid "Slot time" ++msgstr "Tiempo asignado" ++ ++msgid "Software" ++msgstr "Instalación de programas" ++ ++msgid "Some fields are invalid, cannot save values!" ++msgstr "Algunos campos no son válidos, ¡no se pueden guardar!" ++ ++msgid "Sorry, the object you requested was not found." ++msgstr "Objeto no encontrado." ++ ++msgid "Sorry, the server encountered an unexpected error." ++msgstr "El servidor encontró un error inesperado." ++ ++#, fuzzy ++msgid "" ++"Sorry, there is no sysupgrade support present; a new firmware image must be " ++"flashed manually. Please refer to the OpenWrt wiki for device specific " ++"install instructions." ++msgstr "" ++"No está instalado el soporte para el sysupgrade, la nueva imagen debe " ++"grabarse manualmente. Por favor, mire el wiki de OpenWrt para instrucciones " ++"de instalación específicas." ++ ++msgid "Sort" ++msgstr "Ordenar" ++ ++msgid "Source" ++msgstr "Origen" ++ ++msgid "Source routing" ++msgstr "" ++ ++msgid "Specifies the button state to handle" ++msgstr "Especifica el estado de botón a manejar" ++ ++msgid "Specifies the directory the device is attached to" ++msgstr "Especifica el directorio al que está enlazado el dispositivo" ++ ++msgid "Specifies the listening port of this Dropbear instance" ++msgstr "" ++"Especifica los puertos de escucha de esta instancia de Dropbear" ++ ++msgid "" ++"Specifies the maximum amount of failed ARP requests until hosts are presumed " ++"to be dead" ++msgstr "" ++"Especifica la cantidad de peticiones ARP fallidas hasta suponer muerta una " ++"máquina" ++ ++msgid "" ++"Specifies the maximum amount of seconds after which hosts are presumed to be " ++"dead" ++msgstr "" ++"Especifica la cantidad de segundos a transcurrir hasta suponer muerta una " ++"máquina" ++ ++msgid "Specify the secret encryption key here." ++msgstr "Especifica la clave secreta de encriptado." ++ ++msgid "Start" ++msgstr "Arrancar" ++ ++msgid "Start priority" ++msgstr "Prioridad de arranque" ++ ++msgid "Startup" ++msgstr "Arranque" ++ ++msgid "Static IPv4 Routes" ++msgstr "Rutas estáticas IPv4" ++ ++msgid "Static IPv6 Routes" ++msgstr "Rutas estáticas IPv6" ++ ++msgid "Static Leases" ++msgstr "Cesiones estáticas" ++ ++msgid "Static Routes" ++msgstr "Rutas estáticas" ++ ++msgid "Static WDS" ++msgstr "WDS estático" ++ ++msgid "Static address" ++msgstr "Dirección estática" ++ ++msgid "" ++"Static leases are used to assign fixed IP addresses and symbolic hostnames " ++"to DHCP clients. They are also required for non-dynamic interface " ++"configurations where only hosts with a corresponding lease are served." ++msgstr "" ++"Las cesiones estáticas se usan para asignar direcciones IP fijas y nombres " ++"simbólicos de máquina a clientes DHCP. También son necesarias para " ++"configuraciones de interfaz no dinámica en las que a cada máquina siempre se " ++"le quiere servir la misma dirección IP." ++ ++msgid "Status" ++msgstr "Estado" ++ ++msgid "Stop" ++msgstr "Parar" ++ ++msgid "Strict order" ++msgstr "Orden estricto" ++ ++msgid "Submit" ++msgstr "Guardar" ++ ++msgid "Swap" ++msgstr "" ++ ++msgid "Swap Entry" ++msgstr "Entrada de intercambio" ++ ++msgid "Switch" ++msgstr "Switch" ++ ++msgid "Switch %q" ++msgstr "Switch %q" ++ ++msgid "Switch %q (%s)" ++msgstr "Switch %q (%s)" ++ ++msgid "Switch protocol" ++msgstr "Intercambiar protocolo" ++ ++msgid "Sync with browser" ++msgstr "Sincronizar con el navegador" ++ ++msgid "Synchronizing..." ++msgstr "Sincronizando..." ++ ++msgid "System" ++msgstr "Sistema" ++ ++msgid "System Log" ++msgstr "Registro del sistema" ++ ++msgid "System Properties" ++msgstr "Propiedades del sistema" ++ ++msgid "System log buffer size" ++msgstr "Tamaño del buffer de registro del sistema" ++ ++msgid "TCP:" ++msgstr "TCP:" ++ ++msgid "TFTP Settings" ++msgstr "Configuración TFTP" ++ ++msgid "TFTP server root" ++msgstr "Raíz del servidor TFTP" ++ ++msgid "TX" ++msgstr "TX" ++ ++msgid "TX Rate" ++msgstr "Ratio TX" ++ ++msgid "Table" ++msgstr "Tabla" ++ ++# Target = Meta --> Objetivo --> Destino? ++msgid "Target" ++msgstr "Objetivo" ++ ++msgid "Terminate" ++msgstr "Terminar" ++ ++#, fuzzy ++msgid "" ++"The Device Configuration section covers physical settings of the " ++"radio hardware such as channel, transmit power or antenna selection which " ++"are shared among all defined wireless networks (if the radio hardware is " ++"multi-SSID capable). Per network settings like encryption or operation mode " ++"are grouped in the Interface Configuration." ++msgstr "" ++"La sección de Configuración del dispositivo ocupa la configuración " ++"física del hardware de radio como el canal, la potencia de transmisión o la " ++"selección de antena que se comparte entre todas las redes inalámbricas " ++"definidas (si el hardware de radio es capaz de ser multi-SSID). " ++"Configuración por red como encriptado o modo de operación se agrupan en " ++"Configuración del interfaz." ++ ++msgid "" ++"The libiwinfo-lua package is not installed. You must install this " ++"component for working wireless configuration!" ++msgstr "" ++"El paquete libiwinfo-lua no está instalado. ¡Debe instalarlo para " ++"poder configurar la conectividad inalambrica!" ++ ++msgid "" ++"The HE.net endpoint update configuration changed, you must now use the plain " ++"username instead of the user ID!" ++msgstr "" ++ ++msgid "" ++"The IPv6 prefix assigned to the provider, usually ends with ::" ++msgstr "" ++"El prefijo IPv6 asignado por el proveedor, suele termina con ::" ++ ++msgid "" ++"The allowed characters are: A-Z, a-z, 0-9 and _" ++msgstr "" ++"Los caracteres permitidos son: A-Z, a-z, " ++"0-9 y _" ++ ++msgid "The configuration file could not be loaded due to the following error:" ++msgstr "" ++ ++msgid "" ++"The device file of the memory or partition (e.g." ++" /dev/sda1)" ++msgstr "" ++"El archivo de dispositivo de memoria o partición (e.j. /dev/sda1)" ++ ++msgid "" ++"The filesystem that was used to format the memory (e.g. ext3)" ++msgstr "" ++"El sistema de archivo que fue utilizado para dar formato a la memoria (Ej. ext3)" ++ ++msgid "" ++"The flash image was uploaded. Below is the checksum and file size listed, " ++"compare them with the original file to ensure data integrity.
    Click " ++"\"Proceed\" below to start the flash procedure." ++msgstr "" ++"Imagen recibida. Verifique que la comprobación y tamaño del fichero recibido " ++"coinciden con los del original.
    Pulse \"Proceder\" para empezar el " ++"grabado." ++ ++msgid "The following changes have been committed" ++msgstr "Se han hecho los siguientes cambios" ++ ++msgid "The following changes have been reverted" ++msgstr "Se han anulado los siguientes cambios" ++ ++msgid "The following rules are currently active on this system." ++msgstr "Rutas activas." ++ ++msgid "The given network name is not unique" ++msgstr "Nombre de red repetido" ++ ++#, fuzzy ++msgid "" ++"The hardware is not multi-SSID capable and the existing configuration will " ++"be replaced if you proceed." ++msgstr "" ++"El hardware no es capaz de multi-SSD y la configuración actual se cambiará " ++"si continúa." ++ ++msgid "" ++"The length of the IPv4 prefix in bits, the remainder is used in the IPv6 " ++"addresses." ++msgstr "" ++"Longitud del prefijo IPv4 en bits, el resto se usará en direcciones IPv6." ++ ++msgid "The length of the IPv6 prefix in bits" ++msgstr "Longitud del prefijo IPv6 en bits" ++ ++msgid "" ++"The network ports on this device can be combined to several VLANs in which computers can " ++"communicate directly with each other. VLANs are often used to separate different network " ++"segments. Often there is by default one Uplink port for a connection to the " ++"next greater network like the internet and other ports for a local network." ++msgstr "" ++"Los puertos de red de este dispositivo se pueden combinar en varias VLANs en las que los ordenadores " ++"se pueden comunicar directamente entre ellos. Las VLANs se usan a menudo para separar diferentes " ++"segmentos de red. Es común que exista un puerto por defecto para subida " ++"hacia una red mayor como internet y el resto se dediquen a la red local." ++ ++msgid "The selected protocol needs a device assigned" ++msgstr "Este protocolo necesita estar asignado a un dispositivo" ++ ++msgid "" ++"The system is erasing the configuration partition now and will reboot itself " ++"when finished." ++msgstr "" ++"El sistema está borrando la partición de configuración y rearrancará cuando " ++"termine." ++ ++#, fuzzy ++msgid "" ++"The system is flashing now.
    DO NOT POWER OFF THE DEVICE!
    Wait a " ++"few minutes before you try to reconnect. It might be necessary to renew the " ++"address of your computer to reach the device again, depending on your " ++"settings." ++msgstr "" ++"Escribiendo en la memoria flash.
    ¡NO APAGUE EL DISPOSITIVO!
    " ++"Espere unos minutos antes de reconectar. Es posible que tenga que renovar la " ++"conexión de su ordenador para poder acceder de nuevo al dispositivo." ++ ++msgid "" ++"The tunnel end-point is behind NAT, defaults to disabled and only applies to " ++"AYIYA" ++msgstr "" ++ ++msgid "" ++"The uploaded image file does not contain a supported format. Make sure that " ++"you choose the generic image format for your platform." ++msgstr "" ++"El archivo con la imagen de firmware subido no tiene un formato adecuado. " ++"Asegúrese de haber elegido la imagen correcta para su plataforma." ++ ++msgid "There are no active leases." ++msgstr "Sin cesiones activas." ++ ++msgid "There are no pending changes to apply!" ++msgstr "¡No hay cambios pendientes!" ++ ++msgid "There are no pending changes to revert!" ++msgstr "¡No hay cambios a anular!" ++ ++msgid "There are no pending changes!" ++msgstr "¡Sin cambios pendientes!" ++ ++msgid "" ++"There is no device assigned yet, please attach a network device in the " ++"\"Physical Settings\" tab" ++msgstr "" ++"No hay dispositivo asignado aún. Por favor, enlace un dispositivo de red en " ++"la pestaña \"Configuración física\"" ++ ++msgid "" ++"There is no password set on this router. Please configure a root password to " ++"protect the web interface and enable SSH." ++msgstr "" ++"No hay contraseñas en este router. Por favor, configure una contraseña para " ++"proteger el interfaz web y activar SSH." ++ ++msgid "This IPv4 address of the relay" ++msgstr "Dirección IPv4 del relé" ++ ++msgid "" ++"This is a list of shell glob patterns for matching files and directories to " ++"include during sysupgrade. Modified files in /etc/config/ and certain other " ++"configurations are automatically preserved." ++msgstr "" ++"Lista de patrones shell con los ficheros y directorios que se deben incluir " ++"en un sysupgrade. Los ficheros modificados en /etc/config/ y ciertas otras " ++"configuraciones se guardarán automáticamente." ++ ++msgid "" ++"This is either the \"Update Key\" configured for the tunnel or the account " ++"password if no update key has been configured" ++msgstr "" ++ ++msgid "" ++"This is the content of /etc/rc.local. Insert your own commands here (in " ++"front of 'exit 0') to execute them at the end of the boot process." ++msgstr "" ++"Contenido de /etc/rc.local. Ponga sus propios comandos aquí (antes de 'exit " ++"0') para ejecutarlos al final del proceso de inicio." ++ ++msgid "" ++"This is the local endpoint address assigned by the tunnel broker, it usually " ++"ends with :2" ++msgstr "" ++"Esta es la dirección de punto final asignada por el broker del túnel, suele " ++"terminar con :2" ++ ++msgid "" ++"This is the only DHCP in the local network" ++msgstr "" ++"Este es el único servidor DHCP en la red de área local" ++ ++msgid "This is the plain username for logging into the account" ++msgstr "" ++ ++msgid "" ++"This is the prefix routed to you by the tunnel broker for use by clients" ++msgstr "" ++ ++msgid "This is the system crontab in which scheduled tasks can be defined." ++msgstr "Definición de tareas programadas para crontab." ++ ++msgid "" ++"This is usually the address of the nearest PoP operated by the tunnel broker" ++msgstr "" ++"Esta es normalmente la dirección del PoP más cercano operada por el broker " ++"del túnel" ++ ++msgid "" ++"This list gives an overview over currently running system processes and " ++"their status." ++msgstr "Procesos de sistema que se están ejecutando actualmente y su estado." ++ ++msgid "This page allows the configuration of custom button actions" ++msgstr "Configuración de acciones personalizadas para los botones" ++ ++msgid "This page gives an overview over currently active network connections." ++msgstr "Conexiones de red activas." ++ ++msgid "This section contains no values yet" ++msgstr "No hay reglas definidas" ++ ++msgid "Time Synchronization" ++msgstr "Sincronización horaria" ++ ++msgid "Time Synchronization is not configured yet." ++msgstr "Sincronización horaria no configurada." ++ ++msgid "Timezone" ++msgstr "Zona horaria" ++ ++msgid "" ++"To restore configuration files, you can upload a previously generated backup " ++"archive here." ++msgstr "" ++"Para restaurar los ficheros de configuración, debe subir primero una copia " ++"de seguridad." ++ ++msgid "Total Available" ++msgstr "Total disponible" ++ ++msgid "Traceroute" ++msgstr "Traceroute" ++ ++msgid "Traffic" ++msgstr "Tráfico" ++ ++msgid "Transfer" ++msgstr "Transferencia" ++ ++msgid "Transmission Rate" ++msgstr "Tasa de Transmisión" ++ ++msgid "Transmit" ++msgstr "Transmitir" ++ ++msgid "Transmit Power" ++msgstr "Potencia de transmisión" ++ ++msgid "Transmitter Antenna" ++msgstr "Antena Transmisora" ++ ++msgid "Trigger" ++msgstr "Disparador" ++ ++msgid "Trigger Mode" ++msgstr "Modo de disparador" ++ ++msgid "Tunnel ID" ++msgstr "ID de túnel" ++ ++msgid "Tunnel Interface" ++msgstr "Interfaz de túnel" ++ ++msgid "Tunnel Link" ++msgstr "" ++ ++msgid "Tunnel broker protocol" ++msgstr "" ++ ++msgid "Tunnel setup server" ++msgstr "" ++ ++msgid "Tunnel type" ++msgstr "" ++ ++msgid "Turbo Mode" ++msgstr "Modo Turbo" ++ ++msgid "Tx-Power" ++msgstr "Potencia-TX" ++ ++msgid "Type" ++msgstr "Tipo" ++ ++msgid "UDP:" ++msgstr "UDP:" ++ ++msgid "UMTS only" ++msgstr "Sólo UMTS" ++ ++msgid "UMTS/GPRS/EV-DO" ++msgstr "UMTS/GPRS/EV-DO" ++ ++msgid "USB Device" ++msgstr "Dispositivo USB" ++ ++msgid "UUID" ++msgstr "UUID" ++ ++msgid "Unable to dispatch" ++msgstr "Imposible repartir" ++ ++msgid "Unknown" ++msgstr "Desconocido" ++ ++msgid "Unknown Error, password not changed!" ++msgstr "Error desconocido, ¡no se ha cambiado la contraseña!" ++ ++msgid "Unmanaged" ++msgstr "No gestionado" ++ ++msgid "Unsaved Changes" ++msgstr "Cambios no guardados" ++ ++msgid "Unsupported protocol type." ++msgstr "Tipo de protocolo no soportado." ++ ++msgid "Update lists" ++msgstr "Actualizar listas" ++ ++msgid "" ++"Upload a sysupgrade-compatible image here to replace the running firmware. " ++"Check \"Keep settings\" to retain the current configuration (requires an " ++"OpenWrt compatible firmware image)." ++msgstr "" ++"Suba una imagen compatible con sysupgrade para reemplazar el firmware " ++"actual. Puede marcar \"Conservar la configuración\" si lo desea (es " ++"necesario que la imagen de OpenWrt sea compatible)." ++ ++msgid "Upload archive..." ++msgstr "Subir archivo..." ++ ++msgid "Uploaded File" ++msgstr "Archivo subido" ++ ++msgid "Uptime" ++msgstr "Tiempo activo" ++ ++msgid "Use /etc/ethers" ++msgstr "Usar /etc/ethers" ++ ++msgid "Use DHCP gateway" ++msgstr "Usar pasarela DHCP" ++ ++msgid "Use DNS servers advertised by peer" ++msgstr "Utiliza servidores DNS anunciados por otros" ++ ++msgid "Use ISO/IEC 3166 alpha2 country codes." ++msgstr "Usa códigos de país ISO/IEC 3166 alpha2." ++ ++msgid "Use MTU on tunnel interface" ++msgstr "MTU a usar en el interfaz de túnel" ++ ++msgid "Use TTL on tunnel interface" ++msgstr "TTL a usar en el interfaz de túnel" ++ ++msgid "Use as external overlay (/overlay)" ++msgstr "" ++ ++msgid "Use as root filesystem (/)" ++msgstr "" ++ ++msgid "Use broadcast flag" ++msgstr "Usar marca de propagación" ++ ++msgid "Use builtin IPv6-management" ++msgstr "" ++ ++msgid "Use custom DNS servers" ++msgstr "Usar servidores DNS personalizados" ++ ++msgid "Use default gateway" ++msgstr "Usar pasarela por defecto" ++ ++msgid "Use gateway metric" ++msgstr "Usar métrica de la pasarela" ++ ++msgid "Use routing table" ++msgstr "Usar tabla de rutas" ++ ++msgid "" ++"Use the Add Button to add a new lease entry. The MAC-Address indentifies the host, the IPv4-Address specifies to the fixed " ++"address to use and the Hostname is assigned as symbolic name to the " ++"requesting host." ++msgstr "" ++"Pulse el botón Añadir para insertar una nueva cesión. Dirección " ++"MAC identificará la máquina, dirección IPv4 especificará la " ++"dirección fija a usar y Nombre de máquina se asignará como nombre " ++"simbólico." ++ ++msgid "Used" ++msgstr "Usado" ++ ++msgid "Used Key Slot" ++msgstr "Espacio de clave usado" ++ ++msgid "User certificate (PEM encoded)" ++msgstr "" ++ ++msgid "User key (PEM encoded)" ++msgstr "" ++ ++msgid "Username" ++msgstr "Nombre de usuario" ++ ++msgid "VC-Mux" ++msgstr "VC-Mux" ++ ++msgid "VLAN Interface" ++msgstr "Interfaz VLAN" ++ ++msgid "VLANs on %q" ++msgstr "VLANs en %q" ++ ++msgid "VLANs on %q (%s)" ++msgstr "VLANs en %q (%s)" ++ ++msgid "VPN Server" ++msgstr "Servidor VPN" ++ ++msgid "VPN Server port" ++msgstr "" ++ ++msgid "VPN Server's certificate SHA1 hash" ++msgstr "" ++ ++msgid "Vendor Class to send when requesting DHCP" ++msgstr "Clase de vendedor a enviar cuando solicite DHCP" ++ ++msgid "Verbose" ++msgstr "" ++ ++msgid "Verbose logging by aiccu daemon" ++msgstr "" ++ ++msgid "Verify" ++msgstr "Verificar" ++ ++msgid "Version" ++msgstr "Versión" ++ ++msgid "WDS" ++msgstr "WDS" ++ ++msgid "WEP Open System" ++msgstr "Sistema abierto WEP" ++ ++msgid "WEP Shared Key" ++msgstr "Clave compartida WEP" ++ ++msgid "WEP passphrase" ++msgstr "Frase de paso WEP" ++ ++msgid "WMM Mode" ++msgstr "Modo WMM" ++ ++msgid "WPA passphrase" ++msgstr "Frase de paso WPA" ++ ++msgid "" ++"WPA-Encryption requires wpa_supplicant (for client mode) or hostapd (for AP " ++"and ad-hoc mode) to be installed." ++msgstr "" ++"WPA-Encryption necesita que estén instalados wpa_supplicant (para el modo " ++"cliente o hostapd (para los modos AP y ad-hoc)." ++ ++msgid "" ++"Wait for NTP sync that many seconds, seting to 0 disables waiting (optional)" ++msgstr "" ++ ++msgid "Waiting for changes to be applied..." ++msgstr "Esperando a que se realicen los cambios..." ++ ++msgid "Waiting for command to complete..." ++msgstr "Esperando a que termine el comando..." ++ ++msgid "Warning" ++msgstr "Aviso" ++ ++msgid "Warning: There are unsaved changes that will be lost while rebooting!" ++msgstr "" ++"Advertencia: Hay cambios realizados que no han sido guardados, los mismos se " ++"perderán mientras se rearranca!" ++ ++msgid "Whether to create an IPv6 default route over the tunnel" ++msgstr "" ++ ++msgid "Whether to route only packets from delegated prefixes" ++msgstr "" ++ ++msgid "Width" ++msgstr "" ++ ++msgid "Wifi" ++msgstr "Wifi" ++ ++msgid "Wireless" ++msgstr "Red inalámbrica" ++ ++msgid "Wireless Adapter" ++msgstr "Adaptador inalámbrico" ++ ++msgid "Wireless Network" ++msgstr "Red inalámbrica" ++ ++msgid "Wireless Overview" ++msgstr "Redes inalámbricas" ++ ++msgid "Wireless Security" ++msgstr "Seguridad inalámbrica" ++ ++msgid "Wireless is disabled or not associated" ++msgstr "Red inalámbrica desconectada o no asociada" ++ ++msgid "Wireless is restarting..." ++msgstr "Rearrancando red inalámbrica..." ++ ++msgid "Wireless network is disabled" ++msgstr "Red inalámbrica desconectada" ++ ++msgid "Wireless network is enabled" ++msgstr "Red inalámbrica conectada" ++ ++msgid "Wireless restarted" ++msgstr "Red inalámbrica rearrancada" ++ ++msgid "Wireless shut down" ++msgstr "Apagando red inalámbrica" ++ ++msgid "Write received DNS requests to syslog" ++msgstr "Escribir las peticiones de DNS recibidas en el registro del sistema" ++ ++msgid "XR Support" ++msgstr "Soporte de XR" ++ ++msgid "" ++"You can enable or disable installed init scripts here. Changes will applied " ++"after a device reboot.
    Warning: If you disable essential init " ++"scripts like \"network\", your device might become inaccessible!" ++msgstr "" ++"Gestione los scripts de inicio. Los cambios serán aplicados tras reiniciar " ++"el equipo.
    ADVERTENCIA: ¡Si desactiva scripts de inicio " ++"esenciales como\"network\", su equipo puede no arrancar o quedar " ++"inaccesible!." ++ ++msgid "" ++"You must enable Java Script in your browser or LuCI will not work properly." ++msgstr "" ++"Debe activar Javascript en su navegador o LuCI no funcionará correctamente." ++ ++msgid "" ++"Your Internet Explorer is too old to display this page correctly. Please " ++"upgrade it to at least version 7 or use another browser like Firefox, Opera " ++"or Safari." ++msgstr "" ++ ++msgid "any" ++msgstr "cualquiera" ++ ++msgid "auto" ++msgstr "auto" ++ ++#, fuzzy ++msgid "automatic" ++msgstr "estático" ++ ++msgid "baseT" ++msgstr "baseT" ++ ++msgid "bridged" ++msgstr "puenteado" ++ ++msgid "create:" ++msgstr "crear:" ++ ++msgid "creates a bridge over specified interface(s)" ++msgstr "crea un puente sobre la interfaz o interfaces asociadas" ++ ++msgid "dB" ++msgstr "dB" ++ ++msgid "dBm" ++msgstr "dBm" ++ ++msgid "disable" ++msgstr "desabilitar" ++ ++msgid "disabled" ++msgstr "" ++ ++msgid "expired" ++msgstr "expirado" ++ ++msgid "" ++"file where given DHCP-leases will be stored" ++msgstr "" ++"archivo en el que se guardarán las direcciones DHCP cedidas" ++ ++msgid "forward" ++msgstr "retransmisión" ++ ++msgid "full-duplex" ++msgstr "full dúplex" ++ ++msgid "half-duplex" ++msgstr "half dúplex" ++ ++msgid "help" ++msgstr "ayuda" ++ ++msgid "hidden" ++msgstr "oculto" ++ ++msgid "hybrid mode" ++msgstr "" ++ ++msgid "if target is a network" ++msgstr "si el destino es una red" ++ ++msgid "input" ++msgstr "entrada" ++ ++msgid "kB" ++msgstr "KB" ++ ++msgid "kB/s" ++msgstr "KB/s" ++ ++msgid "kbit/s" ++msgstr "Kbit/s" ++ ++msgid "local DNS file" ++msgstr "Archvo DNS local" ++ ++msgid "minimum 1280, maximum 1480" ++msgstr "" ++ ++msgid "navigation Navigation" ++msgstr "" ++ ++msgid "no" ++msgstr "no" ++ ++msgid "no link" ++msgstr "sin enlace" ++ ++msgid "none" ++msgstr "ninguno" ++ ++msgid "not present" ++msgstr "" ++ ++msgid "off" ++msgstr "parado" ++ ++msgid "on" ++msgstr "activo" ++ ++msgid "open" ++msgstr "abierto" ++ ++msgid "overlay" ++msgstr "" ++ ++msgid "relay mode" ++msgstr "" ++ ++msgid "routed" ++msgstr "enrutado" ++ ++msgid "server mode" ++msgstr "" ++ ++msgid "skiplink1 Skip to navigation" ++msgstr "" ++ ++msgid "skiplink2 Skip to content" ++msgstr "" ++ ++msgid "stateful-only" ++msgstr "" ++ ++msgid "stateless" ++msgstr "" ++ ++msgid "stateless + stateful" ++msgstr "" ++ ++msgid "tagged" ++msgstr "marcado" ++ ++msgid "unknown" ++msgstr "desconocido" ++ ++msgid "unlimited" ++msgstr "ilimitado" ++ ++msgid "unspecified" ++msgstr "no especificado" ++ ++msgid "unspecified -or- create:" ++msgstr "no especificado -o- crear:" ++ ++msgid "untagged" ++msgstr "desmarcado" ++ ++msgid "yes" ++msgstr "sí" ++ ++msgid "« Back" ++msgstr "« Volver" ++ ++#~ msgid "" ++#~ "Always use 40MHz channels even if the secondary channel overlaps. Using " ++#~ "this option does not comply with IEEE 802.11n-2009!" ++#~ msgstr "" ++#~ "Usar canales de 40MHz aunque el canal secundario solape con otro. ¡El " ++#~ "estándar IEEE 802.11n-2009 indica que no es correcto hacer esto!" ++ ++#~ msgid "Cached" ++#~ msgstr "En caché" ++ ++#~ msgid "Configures this mount as overlay storage for block-extroot" ++#~ msgstr "" ++#~ "Configura este punto de montaje como almacenamiento de overlay para block-" ++#~ "extroot" ++ ++#~ msgid "Force 40MHz mode" ++#~ msgstr "Forzar modo 40MHz" ++ ++#~ msgid "Frequency Hopping" ++#~ msgstr "Saltos de Frecuencia" ++ ++#~ msgid "Locked to channel %d used by %s" ++#~ msgstr "Bloqueado al canal %d usado por %s" ++ ++#~ msgid "Use as root filesystem" ++#~ msgstr "Usar como raíz del sistema de ficheros" ++ ++#~ msgid "HE.net user ID" ++#~ msgstr "ID de usuario de HE.net" ++ ++#~ msgid "This is the 32 byte hex encoded user ID, not the login name" ++#~ msgstr "" ++#~ "Esto es el ID de usuario codificado como hexadecimal de 32 bytes, no el " ++#~ "nombre de conexión" ++ ++#~ msgid "40MHz 2nd channel above" ++#~ msgstr "40MHz 2º canal por encima" ++ ++#~ msgid "40MHz 2nd channel below" ++#~ msgstr "40MHz 2º canal por debajo" ++ ++#~ msgid "Accept router advertisements" ++#~ msgstr "Aceptar anuncios del router" ++ ++#~ msgid "Advertise IPv6 on network" ++#~ msgstr "Anunciar IPv6 en la red" ++ ++#~ msgid "Advertised network ID" ++#~ msgstr "ID de red anunciado" ++ ++#~ msgid "Allowed range is 1 to 65535" ++#~ msgstr "El rango permitido es desde 1 hasta 65535" ++ ++#~ msgid "HT capabilities" ++#~ msgstr "Habilidades HT" ++ ++#~ msgid "HT mode" ++#~ msgstr "Modo HT" ++ ++#~ msgid "Router Model" ++#~ msgstr "Modelo de router" ++ ++#~ msgid "Router Name" ++#~ msgstr "Nombre del router" ++ ++#~ msgid "Send router solicitations" ++#~ msgstr "Enviar solicitudes de router" ++ ++#~ msgid "Specifies the advertised preferred prefix lifetime in seconds" ++#~ msgstr "Especifica el tiempo de prefijo anunciado preferido en segundos" ++ ++#~ msgid "Specifies the advertised valid prefix lifetime in seconds" ++#~ msgstr "Especifica el tiempo de prefijo válido preferido en segundos" ++ ++#~ msgid "Use preferred lifetime" ++#~ msgstr "Usar tiempo de vida preferido" ++ ++#~ msgid "Use valid lifetime" ++#~ msgstr "Usar tiempo de vida válido" ++ ++#~ msgid "Waiting for router..." ++#~ msgstr "Esperando al router..." ++ ++#~ msgid "Enable builtin NTP server" ++#~ msgstr "Activar el servidor integrado NTP" ++ ++#~ msgid "Active Leases" ++#~ msgstr "Cesiones activas" ++ ++#~ msgid "Bit Rate" ++#~ msgstr "Bitrate" ++ ++#~ msgid "Configuration / Apply" ++#~ msgstr "Configuración / Aplicar" ++ ++#~ msgid "Configuration / Changes" ++#~ msgstr "Configuración / Cambios" ++ ++#~ msgid "Configuration / Revert" ++#~ msgstr "Configuración / Anular" ++ ++#~ msgid "MAC" ++#~ msgstr "MAC" ++ ++#~ msgid "Encr." ++#~ msgstr "Encriptado" ++ ++#~ msgid "WLAN-Scan" ++#~ msgstr "Explorar-WLAN" ++ ++#~ msgid "Create Network" ++#~ msgstr "Crear red" ++ ++#~ msgid "Link" ++#~ msgstr "Enlace" ++ ++#~ msgid "Networks" ++#~ msgstr "Redes" ++ ++#~ msgid "Power" ++#~ msgstr "Potencia" ++ ++#~ msgid "Wifi networks in your local environment" ++#~ msgstr "Redes inalámbricas en un entorno local" ++ ++#~ msgid "" ++#~ "CIDR-Notation: " ++#~ "address/prefix" ++#~ msgstr "" ++#~ "Notación-CIDR: " ++#~ "dirección/prefijo" ++ ++#~ msgid "DNS-Server" ++#~ msgstr "Servidor DNS" ++ ++#~ msgid "IPv4-Broadcast" ++#~ msgstr "Difusión-IPv4" ++ ++#~ msgid "IPv6-Address" ++#~ msgstr "Dirección IPv6" ++ ++#~ msgid "IP-Aliases" ++#~ msgstr "Alias IP" ++ ++#~ msgid "IPv6 Setup" ++#~ msgstr "Configuración IPv6" ++ ++#~ msgid "" ++#~ "The network ports on your router can be combined to several VLANs in which computers can " ++#~ "communicate directly with each other. VLANs are often used to separate different network " ++#~ "segments. Often there is by default one Uplink port for a connection to " ++#~ "the next greater network like the internet and other ports for a local " ++#~ "network." ++#~ msgstr "" ++#~ "Los puertos de red de su router pueden ser combinados en diferentes VLANs donde las computadoras " ++#~ "pueden comunicarse directamente con otras. Las VLANs a menu son usadas para separar " ++#~ "diferentes segmentos de red. Además, usualmente hay un puerto de enlace " ++#~ "de subida (Uplink) para conectar a una red mas grande, por ejemplo " ++#~ "Internet y otro(s) puerto(s) para el acceso a la red local." ++ ++#~ msgid "Enable buffering" ++#~ msgstr "Activar buffering" ++ ++#~ msgid "IPv6-over-IPv4" ++#~ msgstr "IPv6-sobre-IPv4" ++ ++#~ msgid "Files to be kept when flashing a new firmware" ++#~ msgstr "Archivos protegidos al instalar un nuevo firmware" ++ ++#~ msgid "General" ++#~ msgstr "General" ++ ++#~ msgid "" ++#~ "Here you can customize the settings and the functionality of LuCI." ++#~ msgstr "" ++#~ "Aquí puede personalizar las configuraciones y funcionalidad de LuCI." ++ ++#~ msgid "Post-commit actions" ++#~ msgstr "Acciones luego de \"Post-commit\"" ++ ++#~ msgid "" ++#~ "These commands will be executed automatically when a given UCI configuration is committed " ++#~ "allowing changes to be applied instantly." ++#~ msgstr "" ++#~ "Estos comandos se ejecutan automáticamente cuando una determinada " ++#~ "configuración de la UCI " ++#~ " es aplicada permitiendo que los cambios sean efectivos " ++#~ "inmediatamente." ++ ++#~ msgid "Web UI" ++#~ msgstr "Interfaz de Usuario Web" ++ ++#~ msgid "PPTP-Server" ++#~ msgstr "" ++#~ "Servidor PPTP" ++ ++#~ msgid "Access point (APN)" ++#~ msgstr "Punto de acceso (APN)" ++ ++#~ msgid "Additional pppd options" ++#~ msgstr "Opciones adicional de pppd" ++ ++#~ msgid "Automatic Disconnect" ++#~ msgstr "Desconectar automáticamente" ++ ++#~ msgid "Backup Archive" ++#~ msgstr "Archivo de copia de seguridad" ++ ++#~ msgid "" ++#~ "Configure the local DNS server to use the name servers adverticed by the " ++#~ "PPP peer" ++#~ msgstr "" ++#~ "Configurar el servidor DNS local para usar servidores de nombre sugeridos " ++#~ "por el par PPP" ++ ++#~ msgid "Connect script" ++#~ msgstr "Script de conexión" ++ ++#~ msgid "Create backup" ++#~ msgstr "Crear copia de respaldo" ++ ++#~ msgid "Disconnect script" ++#~ msgstr "Script de desconexión" ++ ++#~ msgid "Edit package lists and installation targets" ++#~ msgstr "Editar listas de paquetes de instalación y los objetivos " ++ ++#~ msgid "Enable IPv6 on PPP link" ++#~ msgstr "Ativar IPv6 sobre enlace PPP" ++ ++#~ msgid "Firmware image" ++#~ msgstr "Imágen del firmware" ++ ++#~ msgid "" ++#~ "Here you can backup and restore your router configuration and - if " ++#~ "possible - reset the router to the default settings." ++#~ msgstr "" ++#~ "Aquí puede realizar una copia de respaldo o bien restaurar la " ++#~ "configuración de su ruter y, si es posible, reiniciar el ruter a su " ++#~ "configuración de fábrica." ++ ++#~ msgid "Installation targets" ++#~ msgstr "Destinos de instalación" ++ ++#~ msgid "Keep configuration files" ++#~ msgstr "Mantener archivos de configuración" ++ ++#~ msgid "Keep-Alive" ++#~ msgstr "Mantener conectada" ++ ++#~ msgid "" ++#~ "Let pppd replace the current default route to use the PPP interface after " ++#~ "successful connect" ++#~ msgstr "" ++#~ "Permite que pppd reemplace la ruta por defecto actual para usar la " ++#~ "interfaz ppp como ruta por defecto luego de una conexión satisfactoria" ++ ++#~ msgid "Let pppd run this script after establishing the PPP link" ++#~ msgstr "" ++#~ "Permite a pppd ejecutar este script luego de establecer un enlace PPP" ++ ++#~ msgid "Let pppd run this script before tearing down the PPP link" ++#~ msgstr "Permite a pppd ejecutar este script antes de terminar el enlace PPP" ++ ++#~ msgid "" ++#~ "Make sure that you provide the correct pin code here or you might lock " ++#~ "your sim card!" ++#~ msgstr "" ++#~ "Asegurese de escribir correctamente el código pin aquí caso contrario " ++#~ "bloqueará su tarjeta sim!" ++ ++#~ msgid "" ++#~ "Most of them are network servers, that offer a certain service for your " ++#~ "device or network like shell access, serving webpages like LuCI, doing mesh routing, sending " ++#~ "e-mails, ..." ++#~ msgstr "" ++#~ "La mayoría de ellos son servidores de red, que ofrezcen un determinado " ++#~ "servicio para el dispositivo o la red como el acceso shell, servicio de " ++#~ "páginas web como LuCI , haciendo mesh-routing, el envío de mensajes de correo " ++#~ "electrónico, ..." ++ ++#~ msgid "Number of failed connection tests to initiate automatic reconnect" ++#~ msgstr "" ++#~ "Número de tests de conexión fallida para iniciar la reconexión automática" ++ ++#~ msgid "PIN code" ++#~ msgstr "Código PIN" ++ ++#~ msgid "Package lists" ++#~ msgstr "Listas de paquetes" ++ ++#~ msgid "Proceed reverting all settings and resetting to firmware defaults?" ++#~ msgstr "Proceder a configurar su router a los valores de fábrica?" ++ ++#~ msgid "Processor" ++#~ msgstr "Procesador" ++ ++#~ msgid "Radius-Port" ++#~ msgstr "Puerto servidor Radius" ++ ++#, fuzzy ++#~ msgid "Radius-Server" ++#~ msgstr "Servidor Radius" ++ ++#~ msgid "Replace default route" ++#~ msgstr "Reemplazar la ruta por defecto" ++ ++#~ msgid "Reset router to defaults" ++#~ msgstr "Reiniciar router a su configuración de fábrica" ++ ++#~ msgid "" ++#~ "Seconds to wait for the modem to become ready before attempting to connect" ++#~ msgstr "Segundos a esperar al modem antes iniciar el intento de conexión" ++ ++#~ msgid "Service type" ++#~ msgstr "Tipo de servicio" ++ ++#~ msgid "Services and daemons perform certain tasks on your device." ++#~ msgstr "Los servicios y demonios ejecutan ciertas tareas en su dispositivo." ++ ++#~ msgid "Settings" ++#~ msgstr "Configuraciones" ++ ++#~ msgid "Setup wait time" ++#~ msgstr "Configurar tiempo de espera" ++ ++#~ msgid "" ++#~ "Sorry. OpenWrt does not support a system upgrade on this platform.
    " ++#~ "You need to manually flash your device." ++#~ msgstr "" ++#~ "Lo lamento. OpenWrt y derivados no permite la actualización de esta " ++#~ "plataforma.
    Para poder flashear este dispositivo deberá hacerlo en " ++#~ "forma manual." ++ ++#~ msgid "Specify additional command line arguments for pppd here" ++#~ msgstr "" ++#~ "Especifique aquí argumentos adicionales para la línea de comando de pppd" ++ ++#~ msgid "The device node of your modem, e.g. /dev/ttyUSB0" ++#~ msgstr "El nodo de dispositivo de su modem, ej. /dev/ttyUSB0" ++ ++#~ msgid "Time (in seconds) after which an unused connection will be closed" ++#~ msgstr "" ++#~ "Tiempo (en segundos) luego de que una conexión no usada será cerrada" ++ ++#~ msgid "Update package lists" ++#~ msgstr "Acutlizar listas de paquetes" ++ ++#~ msgid "Upload an OpenWrt image file to reflash the device." ++#~ msgstr "" ++#~ "Subir un archivo de imágen de OpenWrt o derivado para re-flashear el " ++#~ "dispositivo." ++ ++#~ msgid "Upload image" ++#~ msgstr "Subir imágen" ++ ++#~ msgid "Use peer DNS" ++#~ msgstr "Uso de pares de DNS " ++ ++#~ msgid "" ++#~ "You need to install \"comgt\" for UMTS/GPRS, \"ppp-mod-pppoe\" for PPPoE, " ++#~ "\"ppp-mod-pppoa\" for PPPoA or \"pptp\" for PPtP support" ++#~ msgstr "" ++#~ "Es necesario instalar &quot;comgt&quot; para UMTS/GPRS, &quot;" ++#~ "ppp-mod-pppoe&quot; para PPPoE, &quot;ppp-mod-pppoa&quot; " ++#~ "para PPPoA o &quot;pptp&quot; para porte PPtP" ++ ++#~ msgid "back" ++#~ msgstr "volver" ++ ++#~ msgid "buffered" ++#~ msgstr "buffered" ++ ++#~ msgid "cached" ++#~ msgstr "en caché " ++ ++#~ msgid "free" ++#~ msgstr "libre" ++ ++#~ msgid "static" ++#~ msgstr "estático" ++ ++#~ msgid "" ++#~ "LuCI is a collection " ++#~ "of free Lua software including an MVC-Webframework and webinterface for embedded devices. LuCI is licensed under the " ++#~ "Apache-License." ++#~ msgstr "" ++#~ "LuCI es una colección " ++#~ "libre de software Lua incluyendo un MVC-Webframework y una interfaz web para dispositivos embebidos." ++#~ "LuCI se encuentra " ++#~ "licenciado bajo la licencia Apache (Apache-License)." ++ ++#~ msgid "SSH-Keys" ++#~ msgstr "SSH-Keys" ++ ++#~ msgid "" ++#~ "A lightweight HTTP/1.1 webserver written in C and Lua designed to serve " ++#~ "LuCI" ++#~ msgstr "" ++#~ "Un servidor web HTTP/1.1 liviano escrito en C y Lua, diseñado para servir " ++#~ "LUCI " ++ ++#~ msgid "" ++#~ "A small webserver which can be used to serve LuCI." ++#~ msgstr "" ++#~ "Un pequeño servidor web que puede ser usado para servir LuCI . " ++ ++#~ msgid "About" ++#~ msgstr "Acerca de" ++ ++#~ msgid "Addresses" ++#~ msgstr "Direcciones" ++ ++#~ msgid "Admin Password" ++#~ msgstr "Contraseña de Admin" ++ ++#~ msgid "Alias" ++#~ msgstr "Alias" ++ ++#~ msgid "Authentication Realm" ++#~ msgstr "Autenticación Realm" ++ ++#~ msgid "Bridge Port" ++#~ msgstr "Puerto del puente" ++ ++#~ msgid "" ++#~ "Change the password of the system administrator (User root)" ++#~ msgstr "" ++#~ "Cambiar la clave del administrador del sistema (Usuario root)" ++ ++#~ msgid "Client + WDS" ++#~ msgstr "Cliente + WDS" ++ ++#~ msgid "Configuration file" ++#~ msgstr "Fichero configuración" ++ ++#~ msgid "Connection timeout" ++#~ msgstr "Tiempo de conexión agotado" ++ ++#~ msgid "Contributing Developers" ++#~ msgstr "Desarrolladores que contribuyen" ++ ++#~ msgid "DHCP assigned" ++#~ msgstr "DHCP asignado" ++ ++#~ msgid "Document root" ++#~ msgstr "Raíz de documentos" ++ ++#~ msgid "Enable Keep-Alive" ++#~ msgstr "Habilitar Keep-Alive" ++ ++#~ msgid "Ethernet Bridge" ++#~ msgstr "Puente ethernet" ++ ++#~ msgid "" ++#~ "Here you can paste public SSH-Keys " ++#~ "(one per line) for SSH public-key " ++#~ "authentication." ++#~ msgstr "" ++#~ "Aquí puede pegar las claves públicas de SSH (una por línea) para la autenticación de claves públicas de SSH." ++ ++#~ msgid "ID" ++#~ msgstr "ID" ++ ++#~ msgid "IP Configuration" ++#~ msgstr "Configuración IP" ++ ++#~ msgid "Interface Status" ++#~ msgstr "Interfaz de Estado " ++ ++#~ msgid "Lead Development" ++#~ msgstr "Lider del desarrollo" ++ ++#~ msgid "Master" ++#~ msgstr "Master" ++ ++#~ msgid "Master + WDS" ++#~ msgstr "Master + WDS" ++ ++#~ msgid "Not configured" ++#~ msgstr "No configurado" ++ ++#~ msgid "Password successfully changed" ++#~ msgstr "Contraseña cambiada satisfactoriamente" ++ ++#~ msgid "Plugin path" ++#~ msgstr "Ruta del plugin" ++ ++#~ msgid "Ports" ++#~ msgstr "Puertos" ++ ++#~ msgid "Primary" ++#~ msgstr "Primario" ++ ++#~ msgid "Project Homepage" ++#~ msgstr "Página del proyecto " ++ ++#~ msgid "Pseudo Ad-Hoc" ++#~ msgstr "Pseudo Ad-Hoc" ++ ++#~ msgid "STP" ++#~ msgstr "STP" ++ ++# Thanks to --> Gracias a -> Agradecemientos --> Agregadecemos a ++#~ msgid "Thanks To" ++#~ msgstr "Agregadecemos a" ++ ++#~ msgid "" ++#~ "The realm which will be displayed at the authentication prompt for " ++#~ "protected pages." ++#~ msgstr "" ++#~ "El nombre Realm el cual será mostrado en el símbolo de autenticación para " ++#~ "páginas protegidas. " ++ ++#~ msgid "Unknown Error" ++#~ msgstr "Error desconocido" ++ ++#~ msgid "VLAN" ++#~ msgstr "VLAN" ++ ++#~ msgid "defaults to /etc/httpd.conf" ++#~ msgstr "por defecto a /etc/httpd.conf" ++ ++#~ msgid "Package lists updated" ++#~ msgstr "Listas de paquetes actualizada" ++ ++#~ msgid "Upgrade installed packages" ++#~ msgstr "Actualizar los paquetes instalados" ++ ++#~ msgid "" ++#~ "Also kernel or service logfiles can be viewed here to get an overview " ++#~ "over their current state." ++#~ msgstr "" ++#~ "También los archivos de registro del núcleo (kernel) o servicio se pueden " ++#~ "ver aquí para obtener una visión general sobre su estado actual." ++ ++#~ msgid "" ++#~ "Here you can find information about the current system status like CPU clock frequency, memory " ++#~ "usage or network interface data." ++#~ msgstr "" ++#~ "Aquí pude encontrar información acerca del estado actual del sistema como " ++#~ "la frecuencia del reloj de la CPU clock frequency, uso de la memoria o datos de la interfaz " ++#~ "de red." ++ ++#~ msgid "Search file..." ++#~ msgstr "Buscar archivo..." ++ ++#~ msgid "" ++#~ "LuCI is a free, " ++#~ "flexible, and user friendly graphical interface for configuring OpenWrt " ++#~ "Kamikaze." ++#~ msgstr "" ++#~ "LuCI interfaz gráfica " ++#~ "libre, flexible y amigable para configurar la distro OpenWrt (Kamikaze) y " ++#~ "derivados." ++ ++#~ msgid "And now have fun with your router!" ++#~ msgstr "Y ahora disfrute su router!" ++ ++#~ msgid "" ++#~ "As we always want to improve this interface we are looking forward to " ++#~ "your feedback and suggestions." ++#~ msgstr "" ++#~ "Como siempre queremos mejorar esta interfaz estamos esperando con interés " ++#~ "sus comentarios y sugerencias. " ++ ++#~ msgid "Hello!" ++#~ msgstr "Hola !" ++ ++#~ msgid "" ++#~ "Notice: In LuCI " ++#~ "changes have to be confirmed by clicking Changes - Save & Apply " ++#~ "before being applied." ++#~ msgstr "" ++#~ "Aviso: En LuCI los " ++#~ "cambios deben ser confirmados haciendo clic en \"Cambios\" y luego en " ++#~ "\"Guardar & aplicar\" para que los cambios sean efectivos." ++ ++#~ msgid "" ++#~ "On the following pages you can adjust all important settings of your " ++#~ "router." ++#~ msgstr "" ++#~ "En las páginas siguientes puede realizar todos los ajustes importantes de " ++#~ "su router." ++ ++#~ msgid "The LuCI Team" ++#~ msgstr "El grupo de LuCI" ++ ++#~ msgid "" ++#~ "This is the administration area of LuCI." ++#~ msgstr "" ++#~ "Éste es el área de administración de LuCI." ++ ++#~ msgid "User Interface" ++#~ msgstr "Interfaz de usuario" ++ ++#~ msgid "enable" ++#~ msgstr "habilitar" ++ ++#, fuzzy ++#~ msgid "(optional)" ++#~ msgstr "" ++#~ " \r\n" ++#~ "(opcional)" ++ ++#~ msgid "DNS-Port" ++#~ msgstr "Puerto DNS" ++ ++#~ msgid "" ++#~ "DNS-Server will be queried in " ++#~ "the order of the resolvfile" ++#~ msgstr "" ++#~ "El Servidor DNS serán " ++#~ "consultados de acuerdo al orden explicitado en el archivo \"resolv\"" ++ ++#~ msgid "" ++#~ "max. DHCP-Leases" ++#~ msgstr "" ++#~ "max. DHCP-Leases" ++ ++#~ msgid "" ++#~ "max. EDNS0 packet size" ++#~ msgstr "" ++#~ "Tamaño máx. de paquete EDNS0" ++ ++#~ msgid "AP-Isolation" ++#~ msgstr "Aislamiento AP" ++ ++#~ msgid "Add the Wifi network to physical network" ++#~ msgstr "Añadir una red WiFi a la red física" ++ ++#~ msgid "Aliases" ++#~ msgstr "Aliases" ++ ++#~ msgid "Clamp Segment Size" ++#~ msgstr "Tamaño del segmento de la abrazadera" ++ ++#, fuzzy ++#~ msgid "Create Or Attach Network" ++#~ msgstr "Crear red" ++ ++#~ msgid "Devices" ++#~ msgstr "Dispositivos" ++ ++#~ msgid "Don't forward reverse lookups for local networks" ++#~ msgstr "Hacer búqueda inversa para redes locales" ++ ++#~ msgid "Enable TFTP-Server" ++#~ msgstr "Activar Servidor TFTP" ++ ++#~ msgid "Errors" ++#~ msgstr "Errores" ++ ++#~ msgid "Essentials" ++#~ msgstr "Esencial" ++ ++#~ msgid "Expand Hosts" ++#~ msgstr "Expandir hosts" ++ ++#~ msgid "First leased address" ++#~ msgstr "Primer dirección otorgada" ++ ++#~ msgid "" ++#~ "Fixes problems with unreachable websites, submitting forms or other " ++#~ "unexpected behaviour for some ISPs." ++#~ msgstr "" ++#~ "Correge problemas con los sitios web inaccesibles, envío de formularios o " ++#~ "una conducta inesperada para algunos proveedores de servicios de Internet." ++ ++#~ msgid "Hardware Address" ++#~ msgstr "Dirección de Hardware" ++ ++#~ msgid "Here you can configure installed wifi devices." ++#~ msgstr "Aquí puede configurar los dispositivos Wi-Fi instalados." ++ ++#~ msgid "Ignore /etc/hosts" ++#~ msgstr "Ignorar /etc/hosts" ++ ++#~ msgid "Independent (Ad-Hoc)" ++#~ msgstr "Independiente (ad hoc) " ++ ++#~ msgid "Internet Connection" ++#~ msgstr "Conexión a Internet " ++ ++#~ msgid "Join (Client)" ++#~ msgstr "Únete (Cliente) " ++ ++#~ msgid "Leases" ++#~ msgstr "Brindadas" ++ ++#~ msgid "Local Domain" ++#~ msgstr "Dominio local" ++ ++#~ msgid "Local Network" ++#~ msgstr "Red local" ++ ++#~ msgid "Local Server" ++#~ msgstr "Servidor local" ++ ++#~ msgid "Network Boot Image" ++#~ msgstr "Imágen de inicio en red" ++ ++#~ msgid "" ++#~ "Network Name (ESSID)" ++#~ msgstr "" ++#~ "Nombre de la red (ESSID)" ++ ++#~ msgid "Number of leased addresses" ++#~ msgstr "Número de direcciones otorogada" ++ ++#~ msgid "Perform Actions" ++#~ msgstr "Ejectuar acciones" ++ ++#~ msgid "Prevents Client to Client communication" ++#~ msgstr "Impide la comunicación de cliente a cliente " ++ ++#~ msgid "Provide (Access Point)" ++#~ msgstr "Proporcionar (Punto de Acceso) " ++ ++#~ msgid "Resolvfile" ++#~ msgstr "Archivo \"resolv\"" ++ ++#~ msgid "TFTP-Server Root" ++#~ msgstr "Raíz del Servidor TFTP" ++ ++#~ msgid "TX / RX" ++#~ msgstr "Tx / Rx" ++ ++#~ msgid "The following changes have been applied" ++#~ msgstr "Los siguientes cambios se han aplicado" ++ ++#~ msgid "" ++#~ "When flashing a new firmware with LuCI these files will be added to the new firmware " ++#~ "installation." ++#~ msgstr "" ++#~ "Cuando un nuevo firmware ha sido instalado con LuCI estos archivos serán agregados a la " ++#~ "nueva instalación automáticamente." ++ ++#, fuzzy ++#~ msgid "Wireless Scan" ++#~ msgstr "Inalámbrico" ++ ++#~ msgid "" ++#~ "With DHCP " ++#~ "network members can automatically receive their network settings (IP-address, netmask, DNS-server, ...)." ++#~ msgstr "" ++#~ "Con DHCP " ++#~ "miembros de la red pueden automáticamente recibir su configuración (IP-address, máscara de red, servidor " ++#~ "DNS, ...)." ++ ++#~ msgid "" ++#~ "You can run several wifi networks with one device. Be aware that there " ++#~ "are certain hardware and driverspecific restrictions. Normally you can " ++#~ "operate 1 Ad-Hoc or up to 3 Master-Mode and 1 Client-Mode network " ++#~ "simultaneously." ++#~ msgstr "" ++#~ "Puede correr varias redes Wi-Fi con un solo dispositivo. Tenga en cuenta " ++#~ "que hay restricciones que se aplican al propio hardware y al driver " ++#~ "específicamente. Normalmente puede operar 1 red Ad-Hoc o hasta 3 modo " ++#~ "Master y un Cliente de forma simultanea." ++ ++#~ msgid "" ++#~ "You need to install \"ppp-mod-pppoe\" for PPPoE or \"pptp\" for PPtP " ++#~ "support" ++#~ msgstr "" ++#~ "Es necesario instalar &quot;ppp-mod-pppoe&quot; para PPPoE o &" ++#~ "quot;pptp&quot; para PPtP support" ++ ++#~ msgid "Zone" ++#~ msgstr "Zona" ++ ++#~ msgid "additional hostfile" ++#~ msgstr "archivo de host adicional" ++ ++#~ msgid "adds domain names to hostentries in the resolv file" ++#~ msgstr "añadir nombre de dominios a entradas de host en el archivo resolv" ++ ++#~ msgid "automatically reconnect" ++#~ msgstr "reconectar automáticamente" ++ ++#~ msgid "concurrent queries" ++#~ msgstr "consultas simultaneas" ++ ++#~ msgid "" ++#~ "disable DHCP " ++#~ "for this interface" ++#~ msgstr "" ++#~ "desactivar DHCP para esta interfaz" ++ ++#~ msgid "disconnect when idle for" ++#~ msgstr "desconecte cuando esté inactivo durante " ++ ++#~ msgid "don't cache unknown" ++#~ msgstr "do cachear desconocido" ++ ++#~ msgid "" ++#~ "filter useless DNS-queries of " ++#~ "Windows-systems" ++#~ msgstr "" ++#~ "filter useless DNS-queries of " ++#~ "Windows-systems" ++ ++#~ msgid "installed" ++#~ msgstr "instalado" ++ ++#~ msgid "localises the hostname depending on its subnet" ++#~ msgstr "Localización de nombre de host dependiendo de su subred" ++ ++#~ msgid "not installed" ++#~ msgstr "no instalado" ++ ++#~ msgid "" ++#~ "prevents caching of negative DNS-replies" ++#~ msgstr "" ++#~ "impedir cacheo de respuestas negativas de DNS" ++ ++#~ msgid "query port" ++#~ msgstr "puerto de consulta" ++ ++#~ msgid "transmitted / received" ++#~ msgstr "transmitido / recibido" ++ ++#, fuzzy ++#~ msgid "Join network" ++#~ msgstr "redes contenidas" ++ ++#~ msgid "all" ++#~ msgstr "todo" ++ ++#~ msgid "Code" ++#~ msgstr "Código" ++ ++#~ msgid "Distance" ++#~ msgstr "Distancia" ++ ++#~ msgid "Legend" ++#~ msgstr "Leyenda" ++ ++#~ msgid "Library" ++#~ msgstr "Biblioteca" ++ ++#~ msgid "see '%s' manpage" ++#~ msgstr "ver las páginas de man de &#39;%s&#39;" ++ ++#~ msgid "Package Manager" ++#~ msgstr "Gestor de Paquetes" ++ ++#~ msgid "Service" ++#~ msgstr "Servicio" ++ ++#~ msgid "Statistics" ++#~ msgstr "Estadísticas" ++ ++#~ msgid "zone" ++#~ msgstr "Zona" +diff --git a/feeds/luci/modules/luci-base/po/fr/base.po b/feeds/luci/modules/luci-base/po/fr/base.po +new file mode 100644 +index 0000000..1d8d224 +--- /dev/null ++++ b/feeds/luci/modules/luci-base/po/fr/base.po +@@ -0,0 +1,4312 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Report-Msgid-Bugs-To: \n" ++"POT-Creation-Date: 2009-06-10 03:40+0200\n" ++"PO-Revision-Date: 2013-12-22 17:11+0200\n" ++"Last-Translator: goofy \n" ++"Language-Team: LANGUAGE \n" ++"Language: fr\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n > 1);\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "(%d minute window, %d second interval)" ++msgstr "(fenêtre de %d minutes, intervalle de %d secondes)" ++ ++msgid "(%s available)" ++msgstr "(%s disponible)" ++ ++msgid "(empty)" ++msgstr "(vide)" ++ ++msgid "(no interfaces attached)" ++msgstr "(pas d'interface connectée)" ++ ++msgid "-- Additional Field --" ++msgstr "-- Champ Supplémentaire --" ++ ++msgid "-- Please choose --" ++msgstr "-- Choisir --" ++ ++msgid "-- custom --" ++msgstr "-- autre --" ++ ++msgid "-- match by device --" ++msgstr "" ++ ++msgid "-- match by label --" ++msgstr "" ++ ++msgid "1 Minute Load:" ++msgstr "Charge sur 1 minute :" ++ ++msgid "15 Minute Load:" ++msgstr "Charge sur 15 minutes :" ++ ++msgid "5 Minute Load:" ++msgstr "Charge sur 5 minutes :" ++ ++msgid "BSSID" ++msgstr "BSSID" ++ ++msgid "DNS query port" ++msgstr "Port des requêtes DNS" ++ ++msgid "DNS server port" ++msgstr "Port du serveur DNS" ++ ++msgid "" ++"DNS servers will be queried in the " ++"order of the resolvfile" ++msgstr "" ++"Les serveurs DNS seront
    interrogés dans l'ordre du fichier de résolution" ++ ++msgid "ESSID" ++msgstr "ESSID" ++ ++msgid "IPv4-Address" ++msgstr "Adresse IPv4" ++ ++msgid "IPv4-Gateway" ++msgstr "Passerelle IPv4" ++ ++msgid "IPv4-Netmask" ++msgstr "Masque réseau IPv4" ++ ++msgid "" ++"IPv6-Address or Network " ++"(CIDR)" ++msgstr "" ++"Adresse ou réseau IPv6 " ++"(notation CIDR)" ++ ++msgid "IPv6-Gateway" ++msgstr "Passerelle IPv6" ++ ++msgid "IPv6-Suffix (hex)" ++msgstr "" ++ ++msgid "LED Configuration" ++msgstr "" ++"Configuration des DELs" ++ ++msgid "LED Name" ++msgstr "Nom de la DEL" ++ ++msgid "MAC-Address" ++msgstr "Adresse MAC" ++ ++msgid "" ++"Max. DHCP leases" ++msgstr "" ++"Nombre de baux DHCP maximum" ++ ++msgid "" ++"Max. EDNS0 packet size" ++msgstr "" ++"taille maximum des paquets EDNS0" ++ ++msgid "Max. concurrent queries" ++msgstr "Maximum de requêtes concurrentes" ++ ++msgid "%s - %s" ++msgstr "%s - %s" ++ ++msgid "ADSL" ++msgstr "" ++ ++msgid "ADSL Status" ++msgstr "" ++ ++msgid "AICCU (SIXXS)" ++msgstr "" ++ ++msgid "APN" ++msgstr "APN" ++ ++msgid "AR Support" ++msgstr "Gestion du mode AR" ++ ++msgid "ARP retry threshold" ++msgstr "Niveau de ré-essai ARP" ++ ++msgid "ATM Bridges" ++msgstr "Ponts ATM" ++ ++msgid "ATM Virtual Channel Identifier (VCI)" ++msgstr "" ++"Identifiant de canal virtuel (VCI) ATM" ++ ++msgid "ATM Virtual Path Identifier (VPI)" ++msgstr "" ++"Identifiant de chemin virtuel (VPI) ATM" ++ ++msgid "" ++"ATM bridges expose encapsulated ethernet in AAL5 connections as virtual " ++"Linux network interfaces which can be used in conjunction with DHCP or PPP " ++"to dial into the provider network." ++msgstr "" ++"Les ponts ATM présentent l'Ethernet encapsulé dans des connexions AAL5 comme " ++"des interfaces réseau virtuelles Linux qui peuvent être utilisées avec DHCP " ++"ou PPP pour se connecter au réseau du fournisseur d'accès." ++ ++msgid "ATM device number" ++msgstr "Numéro de périphérique ATM" ++ ++msgid "AYIYA" ++msgstr "" ++ ++msgid "Access Concentrator" ++msgstr "Concentrateur d'accès" ++ ++msgid "Access Point" ++msgstr "Point d'accès" ++ ++msgid "Action" ++msgstr "Action" ++ ++msgid "Actions" ++msgstr "Actions" ++ ++msgid "Activate this network" ++msgstr "Activer ce réseau" ++ ++msgid "Active IPv4-Routes" ++msgstr "Routes IPv4 actives" ++ ++msgid "Active IPv6-Routes" ++msgstr "Routes IPv6 actives" ++ ++msgid "Active Connections" ++msgstr "Connexions actives" ++ ++msgid "Active DHCP Leases" ++msgstr "Bails DHCP actifs" ++ ++msgid "Active DHCPv6 Leases" ++msgstr "Bails DHCPv6 actifs" ++ ++msgid "Ad-Hoc" ++msgstr "Ad-hoc" ++ ++msgid "Add" ++msgstr "Ajouter" ++ ++msgid "Add local domain suffix to names served from hosts files" ++msgstr "" ++"Ajouter le suffixe du domaine local aux noms résolus d'après le fichier hosts" ++ ++msgid "Add new interface..." ++msgstr "Ajout d'une nouvelle interface..." ++ ++msgid "Additional Hosts files" ++msgstr "Fichiers hosts supplémetaires" ++ ++msgid "Address" ++msgstr "Adresse" ++ ++msgid "Address to access local relay bridge" ++msgstr "Adresse pour accéder au pont-relais local" ++ ++msgid "Administration" ++msgstr "Administration" ++ ++msgid "Advanced Settings" ++msgstr "Paramètres avancés" ++ ++msgid "Alert" ++msgstr "Alerte" ++ ++msgid "Allow SSH password authentication" ++msgstr "" ++"Autoriser l'authentification SSH par mot " ++"de passe" ++ ++msgid "Allow all except listed" ++msgstr "Autoriser tout sauf ce qui est listé" ++ ++msgid "Allow listed only" ++msgstr "Autoriser seulement ce qui est listé" ++ ++msgid "Allow localhost" ++msgstr "Autoriser l'hôte local" ++ ++msgid "Allow remote hosts to connect to local SSH forwarded ports" ++msgstr "" ++"Permettre à des hôtes distants de se conecter à des ports SSH locaux " ++"correspondants (« forwarded »)" ++ ++msgid "Allow root logins with password" ++msgstr "Autoriser les connexions administrateur avec mot de passe" ++ ++msgid "Allow the root user to login with password" ++msgstr "" ++"Autoriser l'utilisateur root à se connecter avec un mot de passe" ++ ++msgid "" ++"Allow upstream responses in the 127.0.0.0/8 range, e.g. for RBL services" ++msgstr "" ++"Autorise les réponses de l'amont dans la plage 127.0.0.0/8, par ex. pour les " ++"services RBL" ++ ++msgid "" ++"Also see Tunneling Comparison on SIXXS" ++msgstr "" ++ ++msgid "Always announce default router" ++msgstr "" ++ ++msgid "An additional network will be created if you leave this unchecked." ++msgstr "Un réseau supplémentaire sera créé si vous laissé ceci décoché." ++ ++msgid "Announce as default router even if no public prefix is available." ++msgstr "" ++ ++msgid "Announced DNS domains" ++msgstr "" ++ ++msgid "Announced DNS servers" ++msgstr "" ++ ++msgid "Antenna 1" ++msgstr "Antenne 1" ++ ++msgid "Antenna 2" ++msgstr "Antenne 2" ++ ++msgid "Antenna Configuration" ++msgstr "Configuration de l'antenne" ++ ++msgid "Any zone" ++msgstr "N'importe quelle zone" ++ ++msgid "Apply" ++msgstr "Appliquer" ++ ++msgid "Applying changes" ++msgstr "Changements en cours" ++ ++msgid "" ++"Assign a part of given length of every public IPv6-prefix to this interface" ++msgstr "" ++ ++msgid "Assign interfaces..." ++msgstr "Affecte les interfaces…" ++ ++msgid "" ++"Assign prefix parts using this hexadecimal subprefix ID for this interface." ++msgstr "" ++ ++msgid "Associated Stations" ++msgstr "Équipements associés" ++ ++msgid "Atheros 802.11%s Wireless Controller" ++msgstr "Contrôleur sans fil Atheros 802.11%s " ++ ++msgid "AuthGroup" ++msgstr "" ++ ++msgid "Authentication" ++msgstr "Authentification" ++ ++msgid "Authoritative" ++msgstr "Autoritaire" ++ ++msgid "Authorization Required" ++msgstr "Autorisation requise" ++ ++msgid "Auto Refresh" ++msgstr "Rafraîchissement automatique" ++ ++msgid "Automatic" ++msgstr "" ++ ++msgid "Automatic Homenet (HNCP)" ++msgstr "" ++ ++msgid "Available" ++msgstr "Disponible" ++ ++msgid "Available packages" ++msgstr "Paquets disponibles" ++ ++msgid "Average:" ++msgstr "Moyenne :" ++ ++msgid "BSSID" ++msgstr "BSSID" ++ ++msgid "Back" ++msgstr "Retour" ++ ++msgid "Back to Overview" ++msgstr "Retour à la vue générale" ++ ++msgid "Back to configuration" ++msgstr "Retour à la configuration" ++ ++msgid "Back to overview" ++msgstr "Retour à la vue générale" ++ ++msgid "Back to scan results" ++msgstr "Retour aux résultats de la recherche" ++ ++msgid "Background Scan" ++msgstr "Recherche en arrière-plan" ++ ++msgid "Backup / Flash Firmware" ++msgstr "Sauvegarde / Mise à jour du micrologiciel" ++ ++msgid "Backup / Restore" ++msgstr "Sauvegarder / Restaurer" ++ ++msgid "Backup file list" ++msgstr "Liste des fichiers de sauvegarde" ++ ++msgid "Bad address specified!" ++msgstr "Adresse spécifiée incorrecte!" ++ ++msgid "Band" ++msgstr "" ++ ++msgid "Behind NAT" ++msgstr "" ++ ++msgid "" ++"Below is the determined list of files to backup. It consists of changed " ++"configuration files marked by opkg, essential base files and the user " ++"defined backup patterns." ++msgstr "" ++"Voici la liste des fichiers à sauvegarder. Elle est constituée des fichiers " ++"de configuration modifiés marqués par opkg, des fichiers de base essentiels, " ++"et des motifs de sauvegarde définis par l'utilisateur." ++ ++msgid "Bitrate" ++msgstr "Débit" ++ ++msgid "Bogus NX Domain Override" ++msgstr "Contourne les «  NX Domain » bogués" ++ ++msgid "Bridge" ++msgstr "Pont" ++ ++msgid "Bridge interfaces" ++msgstr "Interfaces en pont" ++ ++msgid "Bridge unit number" ++msgstr "Numéro d'unité du pont" ++ ++msgid "Bring up on boot" ++msgstr "L'activer au démarrage" ++ ++msgid "Broadcom 802.11%s Wireless Controller" ++msgstr "Contrôleur sans fil Broadcom 802.11%s" ++ ++msgid "Broadcom BCM%04x 802.11 Wireless Controller" ++msgstr "Contrôleur sans fil Broadcom BCM%04x 802.11" ++ ++msgid "Buffered" ++msgstr "Temporisé" ++ ++msgid "Buttons" ++msgstr "Boutons" ++ ++msgid "CA certificate; if empty it will be saved after the first connection." ++msgstr "" ++ ++msgid "CPU" ++msgstr "CPU" ++ ++msgid "CPU usage (%)" ++msgstr "Utilisation CPU (%)" ++ ++msgid "Cancel" ++msgstr "Annuler" ++ ++msgid "Category" ++msgstr "" ++ ++msgid "Chain" ++msgstr "Chaîne" ++ ++msgid "Changes" ++msgstr "Changements" ++ ++msgid "Changes applied." ++msgstr "Changements appliqués." ++ ++msgid "Changes the administrator password for accessing the device" ++msgstr "Change le mot de passe administrateur pour accéder à l'équipement" ++ ++msgid "Channel" ++msgstr "Canal" ++ ++msgid "Check" ++msgstr "Vérification" ++ ++msgid "Checksum" ++msgstr "Somme de contrôle" ++ ++msgid "" ++"Choose the firewall zone you want to assign to this interface. Select " ++"unspecified to remove the interface from the associated zone or " ++"fill out the create field to define a new zone and attach the " ++"interface to it." ++msgstr "" ++"Choisissez la zone de pare-feu à laquelle vous voulez affecter cette " ++"interface. Sélectionnez non précisé pour retirer l'interface de la " ++"zone associée, ou remplissez le champ créer pour définir une " ++"nouvelle zone et y inclure cette interface." ++ ++msgid "" ++"Choose the network(s) you want to attach to this wireless interface or fill " ++"out the create field to define a new network." ++msgstr "" ++"Choisissez le(s) réseau(x) que vous souhaitez attachez a cette interface " ++"sans-fil ou remplissez le créer champ pour définir un nouveau " ++"réseau. " ++ ++msgid "Cipher" ++msgstr "Code de chiffrement" ++ ++msgid "" ++"Click \"Generate archive\" to download a tar archive of the current " ++"configuration files. To reset the firmware to its initial state, click " ++"\"Perform reset\" (only possible with squashfs images)." ++msgstr "" ++"Cliquer sur \"Construire l'archive\" pour télécharger une archive tar des " ++"fichiers de la configuration actuelle. Pour réinitialiser le micrologiciel " ++"dans son état initial, cliquer sur \"Réinitialiser\" (possible seulement " ++"avec les images de type squashfs)." ++ ++msgid "Client" ++msgstr "Client" ++ ++msgid "Client ID to send when requesting DHCP" ++msgstr "Identifiant client à envoyer dans les requêtes DHCP" ++ ++msgid "" ++"Close inactive connection after the given amount of seconds, use 0 to " ++"persist connection" ++msgstr "" ++"Fermer une connexion inactive après le délai donné en secondes, mettre 0 " ++"pour garder les connexions" ++ ++msgid "Close list..." ++msgstr "Fermer la liste…" ++ ++msgid "Collecting data..." ++msgstr "Récupération de données..." ++ ++msgid "Command" ++msgstr "Commande" ++ ++msgid "Common Configuration" ++msgstr "Configuration commune" ++ ++msgid "Compression" ++msgstr "Compression" ++ ++msgid "Configuration" ++msgstr "Configuration" ++ ++msgid "Configuration applied." ++msgstr "Configuration appliquée." ++ ++msgid "Configuration files will be kept." ++msgstr "Les fichiers de configuration seront préservés." ++ ++msgid "Confirmation" ++msgstr "Confirmation" ++ ++msgid "Connect" ++msgstr "Se connecter" ++ ++msgid "Connected" ++msgstr "Connecté" ++ ++msgid "Connection Limit" ++msgstr "Limite de connexion" ++ ++msgid "Connection to server fails when TLS cannot be used" ++msgstr "" ++ ++msgid "Connections" ++msgstr "Connexions" ++ ++msgid "Country" ++msgstr "Pays" ++ ++msgid "Country Code" ++msgstr "Code pays" ++ ++msgid "Cover the following interface" ++msgstr "Couvre l'interface suivante" ++ ++msgid "Cover the following interfaces" ++msgstr "Couvre les interfaces suivantes" ++ ++msgid "Create / Assign firewall-zone" ++msgstr "Créer / Assigner une zone du pare-feu" ++ ++msgid "Create Interface" ++msgstr "Créer une interface" ++ ++msgid "Create a bridge over multiple interfaces" ++msgstr "Créer un pont par dessus plusieurs interfaces" ++ ++msgid "Critical" ++msgstr "Critique" ++ ++msgid "Cron Log Level" ++msgstr "Niveau de journalisation de Cron" ++ ++msgid "Custom Interface" ++msgstr "Interface spécifique" ++ ++msgid "Custom delegated IPv6-prefix" ++msgstr "" ++ ++msgid "" ++"Customizes the behaviour of the device LEDs if possible." ++msgstr "" ++"Personnaliser le comportement des DELs si possible." ++ ++msgid "DHCP Leases" ++msgstr "Baux DHCP" ++ ++msgid "DHCP Server" ++msgstr "Serveur DHCP" ++ ++msgid "DHCP and DNS" ++msgstr "DHCP et DNS" ++ ++msgid "DHCP client" ++msgstr "client DHCP" ++ ++msgid "DHCP-Options" ++msgstr "Options DHCP" ++ ++msgid "DHCPv6 Leases" ++msgstr "Bails DHCPv6" ++ ++msgid "DHCPv6 client" ++msgstr "" ++ ++msgid "DHCPv6-Mode" ++msgstr "" ++ ++msgid "DHCPv6-Service" ++msgstr "" ++ ++msgid "DNS" ++msgstr "DNS" ++ ++msgid "DNS forwardings" ++msgstr "transmissions DNS" ++ ++msgid "DNS-Label / FQDN" ++msgstr "" ++ ++msgid "DS-Lite AFTR address" ++msgstr "" ++ ++msgid "DUID" ++msgstr "DUID" ++ ++msgid "Debug" ++msgstr "Deboguage" ++ ++msgid "Default %d" ++msgstr "%d par défaut" ++ ++msgid "Default gateway" ++msgstr "Passerelle par défaut" ++ ++msgid "Default route" ++msgstr "" ++ ++msgid "Default state" ++msgstr "État par défaut" ++ ++msgid "Define a name for this network." ++msgstr "Donne un nom à ce réseau." ++ ++msgid "" ++"Define additional DHCP options, for example " ++"\"6,192.168.2.1,192.168.2.2\" which advertises different DNS " ++"servers to clients." ++msgstr "" ++"Définir des options DHCP supplémentaires, par exemple " ++"\"6,192.168.2.1,192.168.2.2\" qui publie différents serveurs " ++"DNS à ses clients." ++ ++msgid "Delete" ++msgstr "Effacer" ++ ++msgid "Delete this interface" ++msgstr "Supprimer cette interface" ++ ++msgid "Delete this network" ++msgstr "Supprimer ce réseau" ++ ++msgid "Description" ++msgstr "Description" ++ ++msgid "Design" ++msgstr "Apparence" ++ ++msgid "Destination" ++msgstr "Destination" ++ ++msgid "Device" ++msgstr "Équipement" ++ ++msgid "Device Configuration" ++msgstr "Configuration de l'équipement" ++ ++msgid "Diagnostics" ++msgstr "Diagnostics" ++ ++msgid "Dial number" ++msgstr "" ++ ++msgid "Directory" ++msgstr "Répertoire" ++ ++msgid "Disable" ++msgstr "Désactiver" ++ ++msgid "" ++"Disable DHCP for " ++"this interface." ++msgstr "" ++"Désactiver DHCP " ++"pour cette interface." ++ ++msgid "Disable DNS setup" ++msgstr "Désactiver la configuration DNS" ++ ++msgid "Disable HW-Beacon timer" ++msgstr "Désactiver l'émission périodique de balises wifi (« HW-Beacon »)" ++ ++msgid "Disabled" ++msgstr "Désactivé" ++ ++msgid "Discard upstream RFC1918 responses" ++msgstr "Jeter les réponses en RFC1918 amont" ++ ++msgid "Displaying only packages containing" ++msgstr "N'afficher que les paquets contenant" ++ ++msgid "Distance Optimization" ++msgstr "Optimisation de la distance" ++ ++msgid "Distance to farthest network member in meters." ++msgstr "Distance au membre du réseau le plus éloigné, en mètres." ++ ++msgid "Diversity" ++msgstr "Diversité" ++ ++msgid "" ++"Dnsmasq is a combined DHCP-Server and DNS-" ++"Forwarder for NAT " ++"firewalls" ++msgstr "" ++"Dnsmasq est un serveur DHCP combiné à un relais DNS pour les pare-feu NAT" ++ ++msgid "Do not cache negative replies, e.g. for not existing domains" ++msgstr "" ++"Ne pas mettre en cache les réponses négatives, par ex. pour des domaines " ++"inexistants" ++ ++msgid "Do not forward requests that cannot be answered by public name servers" ++msgstr "" ++"Ne pas transmettre les requêtes qui ne peuvent être résolues par les " ++"serveurs de noms publics" ++ ++msgid "Do not forward reverse lookups for local networks" ++msgstr "" ++"Ne pas transmettre les requêtes de recherche inverse pour les réseaux locaux" ++ ++msgid "Do not send probe responses" ++msgstr "Ne pas envoyer de réponses de test" ++ ++msgid "Domain required" ++msgstr "Domaine nécessaire" ++ ++msgid "Domain whitelist" ++msgstr "Liste blanche de domaines" ++ ++msgid "" ++"Don't forward DNS-Requests without " ++"DNS-Name" ++msgstr "" ++"Ne pas transmettre de requêtes DNS " ++"sans nom DNS" ++ ++msgid "Download and install package" ++msgstr "Télécharge et installe le paquet" ++ ++msgid "Download backup" ++msgstr "Télécharger la sauvegarde" ++ ++msgid "Dropbear Instance" ++msgstr "Session Dropbear" ++ ++msgid "" ++"Dropbear offers SSH network shell access " ++"and an integrated SCP server" ++msgstr "" ++"Dropbear est un serveur SSH et intègre " ++"un serveur SCP" ++ ++msgid "Dual-Stack Lite (RFC6333)" ++msgstr "" ++ ++msgid "Dynamic DHCP" ++msgstr "" ++"DHCP dynamique" ++ ++msgid "Dynamic tunnel" ++msgstr "Tunnel dynamique" ++ ++msgid "" ++"Dynamically allocate DHCP addresses for clients. If disabled, only clients " ++"having static leases will be served." ++msgstr "" ++"Alloue dynamiquement des adresses pour les clients du DHCP. Si désactivé, " ++"seuls les clients ayant des baux statiques seront gérés." ++ ++msgid "EAP-Method" ++msgstr "Méthode EAP" ++ ++msgid "Edit" ++msgstr "Éditer" ++ ++msgid "" ++"Edit the raw configuration data above to fix any error and hit \"Save\" to " ++"reload the page." ++msgstr "" ++ ++msgid "Edit this interface" ++msgstr "Éditer cette interface" ++ ++msgid "Edit this network" ++msgstr "Éditer ce réseau" ++ ++msgid "Emergency" ++msgstr "Urgence" ++ ++msgid "Enable" ++msgstr "Activer" ++ ++msgid "Enable STP" ++msgstr "Activer le protocole STP" ++ ++msgid "Enable HE.net dynamic endpoint update" ++msgstr "Activer la mise à jour dynamique de l'extrémité du tunnel chez HE.net" ++ ++msgid "Enable IPv6 negotiation on the PPP link" ++msgstr "Activer la négociation IPv6 sur le lien PPP" ++ ++msgid "Enable Jumbo Frame passthrough" ++msgstr "Activer la circulation de très grandes trames (Jumbo)" ++ ++msgid "Enable NTP client" ++msgstr "Activer client NTP" ++ ++msgid "Enable TFTP server" ++msgstr "Activer le serveur TFTP" ++ ++msgid "Enable VLAN functionality" ++msgstr "Acviter la gestion des VLANs" ++ ++msgid "Enable WPS pushbutton, requires WPA(2)-PSK" ++msgstr "" ++ ++msgid "Enable learning and aging" ++msgstr "Activer l'apprentissage et la péremption" ++ ++msgid "Enable mirroring of incoming packets" ++msgstr "" ++ ++msgid "Enable mirroring of outgoing packets" ++msgstr "" ++ ++msgid "Enable this mount" ++msgstr "Activer ce montage" ++ ++msgid "Enable this swap" ++msgstr "Activer cette mémoire d'échange (swap)" ++ ++msgid "Enable/Disable" ++msgstr "Activer/Désactiver" ++ ++msgid "Enabled" ++msgstr "Activé" ++ ++msgid "Enables the Spanning Tree Protocol on this bridge" ++msgstr "" ++"Activer le protocole STP sur " ++"ce pont" ++ ++msgid "Encapsulation mode" ++msgstr "Mode encapsulé" ++ ++msgid "Encryption" ++msgstr "Chiffrement" ++ ++msgid "Erasing..." ++msgstr "Effacement…" ++ ++msgid "Error" ++msgstr "Erreur" ++ ++msgid "Ethernet Adapter" ++msgstr "Module Ethernet" ++ ++msgid "Ethernet Switch" ++msgstr "Commutateur Ethernet" ++ ++msgid "Expand hosts" ++msgstr "Étendre le nom d'hôte" ++ ++msgid "Expires" ++msgstr "Expire" ++ ++#, fuzzy ++msgid "" ++"Expiry time of leased addresses, minimum is 2 minutes (2m)." ++msgstr "" ++"Délai d'expiration des adresses allouées, le minimum est de 2 minutes " ++"(2m)." ++ ++msgid "External" ++msgstr "" ++ ++msgid "External system log server" ++msgstr "Serveur distant de journaux système" ++ ++msgid "External system log server port" ++msgstr "Port du serveur distant de journaux système" ++ ++msgid "Fast Frames" ++msgstr "Trames rapides" ++ ++msgid "File" ++msgstr "Fichier" ++ ++msgid "Filename of the boot image advertised to clients" ++msgstr "Nom de fichier d'une image de démarrage publiée aux clients" ++ ++msgid "Filesystem" ++msgstr "Système de fichiers" ++ ++msgid "Filter" ++msgstr "Filtrer" ++ ++msgid "Filter private" ++msgstr "Filtrer les requêtes privées" ++ ++msgid "Filter useless" ++msgstr "Filtrer les requêtes inutiles" ++ ++msgid "Find and join network" ++msgstr "Cherche et rejoint un réseau" ++ ++msgid "Find package" ++msgstr "Trouver un paquet" ++ ++msgid "Finish" ++msgstr "Terminer" ++ ++msgid "Firewall" ++msgstr "Pare-feu" ++ ++msgid "Firewall Settings" ++msgstr "Paramètres du pare-feu" ++ ++msgid "Firewall Status" ++msgstr "État du pare-feu" ++ ++msgid "Firmware Version" ++msgstr "Version du micrologiciel" ++ ++msgid "Fixed source port for outbound DNS queries" ++msgstr "Port source fixe pour les requêtes DNS sortantes" ++ ++msgid "Flags" ++msgstr "Options" ++ ++msgid "Flash Firmware" ++msgstr "Mise à jour du micrologiciel" ++ ++msgid "Flash image..." ++msgstr "Écriture de l'image…" ++ ++msgid "Flash new firmware image" ++msgstr "Écrire l'image du nouveau micrologiciel" ++ ++msgid "Flash operations" ++msgstr "Opérations d'écriture" ++ ++msgid "Flashing..." ++msgstr "Écriture…" ++ ++msgid "Force" ++msgstr "Forcer" ++ ++msgid "Force CCMP (AES)" ++msgstr "Forcer CCMP (AES)" ++ ++msgid "Force DHCP on this network even if another server is detected." ++msgstr "Force le DHCP sur ce réseau même si un autre serveur est détecté." ++ ++msgid "Force TKIP" ++msgstr "Forcer TKIP" ++ ++msgid "Force TKIP and CCMP (AES)" ++msgstr "Forcer TKIP et CCMP (AES)" ++ ++msgid "Forward DHCP traffic" ++msgstr "Transmettre le trafic DHCP" ++ ++msgid "Forward broadcast traffic" ++msgstr "Transmettre le trafic de diffusion" ++ ++msgid "Forwarding mode" ++msgstr "Mode de transmission" ++ ++msgid "Fragmentation Threshold" ++msgstr "Seuil de fragmentation" ++ ++msgid "Frame Bursting" ++msgstr "Rafale de trames" ++ ++msgid "Free" ++msgstr "Libre" ++ ++msgid "Free space" ++msgstr "Espace libre" ++ ++msgid "GHz" ++msgstr "Ghz" ++ ++msgid "GPRS only" ++msgstr "seulement GPRS" ++ ++msgid "Gateway" ++msgstr "Passerelle" ++ ++msgid "Gateway ports" ++msgstr "Ports de la passerelle" ++ ++msgid "General Settings" ++msgstr "Paramètres généraux" ++ ++msgid "General Setup" ++msgstr "Configuration générale" ++ ++msgid "Generate archive" ++msgstr "Construire l'archive" ++ ++msgid "Generic 802.11%s Wireless Controller" ++msgstr "Contrôleur sans fil générique 802.11%s" ++ ++msgid "Given password confirmation did not match, password not changed!" ++msgstr "" ++"La confirmation du nouveau mot de passe ne correspond pas, changement " ++"annulé !" ++ ++msgid "Global network options" ++msgstr "" ++ ++msgid "Go to password configuration..." ++msgstr "Aller à la configuration du mot de passe…" ++ ++msgid "Go to relevant configuration page" ++msgstr "Aller à la page de configuration correspondante" ++ ++msgid "Guest" ++msgstr "" ++ ++msgid "HE.net password" ++msgstr "Mot de passe HE.net" ++ ++msgid "HE.net username" ++msgstr "" ++ ++msgid "Handler" ++msgstr "Gestionnaire" ++ ++msgid "Hang Up" ++msgstr "Signal (HUP)" ++ ++msgid "Heartbeat" ++msgstr "" ++ ++msgid "" ++"Here you can configure the basic aspects of your device like its hostname or " ++"the timezone." ++msgstr "" ++"Ici, vous pouvez configurer les aspects basiques de votre routeur comme son " ++"nom ou son fuseau horaire." ++ ++msgid "" ++"Here you can paste public SSH-Keys (one per line) for SSH public-key " ++"authentication." ++msgstr "" ++"Vous pouvez copier ici des clés SSH publiques (une par ligne) pour une " ++"authentification SSH sur clés publiques." ++ ++msgid "Hermes 802.11b Wireless Controller" ++msgstr "Contrôleur sans fil Hermes 802.11b" ++ ++msgid "Hide ESSID" ++msgstr "Cacher le ESSID" ++ ++msgid "Host entries" ++msgstr "Entrées d'hôtes" ++ ++msgid "Host expiry timeout" ++msgstr "Délai d'expiration pour les hôtes" ++ ++msgid "Host-IP or Network" ++msgstr "adresse IP ou réseau" ++ ++msgid "Hostname" ++msgstr "Nom d'hôte" ++ ++msgid "Hostname to send when requesting DHCP" ++msgstr "Nom d'hôte à envoyer dans une requête DHCP" ++ ++msgid "Hostnames" ++msgstr "Noms d'hôtes" ++ ++msgid "Hybrid" ++msgstr "" ++ ++msgid "IP address" ++msgstr "Adresse IP" ++ ++msgid "IPv4" ++msgstr "IPv4" ++ ++msgid "IPv4 Firewall" ++msgstr "Pare-feu IPv4" ++ ++msgid "IPv4 WAN Status" ++msgstr "État IPv4 du WAN" ++ ++msgid "IPv4 address" ++msgstr "Adresse IPv4" ++ ++msgid "IPv4 and IPv6" ++msgstr "IPv4 et IPv6" ++ ++msgid "IPv4 assignment length" ++msgstr "" ++ ++msgid "IPv4 broadcast" ++msgstr "Diffusion IPv4" ++ ++msgid "IPv4 gateway" ++msgstr "Passerelle IPv4" ++ ++msgid "IPv4 netmask" ++msgstr "Masque-réseau IPv4" ++ ++msgid "IPv4 only" ++msgstr "IPv4 seulement" ++ ++msgid "IPv4 prefix length" ++msgstr "longueur du préfixe IPv4" ++ ++msgid "IPv4-Address" ++msgstr "Adresse IPv4" ++ ++msgid "IPv6" ++msgstr "IPv6" ++ ++msgid "IPv6 Firewall" ++msgstr "Pare-feu IPv6" ++ ++msgid "IPv6 Neighbours" ++msgstr "" ++ ++msgid "IPv6 Settings" ++msgstr "" ++ ++msgid "IPv6 ULA-Prefix" ++msgstr "" ++ ++msgid "IPv6 WAN Status" ++msgstr "État IPv6 du WAN" ++ ++msgid "IPv6 address" ++msgstr "Adresse IPv6" ++ ++msgid "IPv6 address delegated to the local tunnel endpoint (optional)" ++msgstr "" ++ ++msgid "IPv6 assignment hint" ++msgstr "" ++ ++msgid "IPv6 assignment length" ++msgstr "" ++ ++msgid "IPv6 gateway" ++msgstr "Passerelle IPv6" ++ ++msgid "IPv6 only" ++msgstr "IPv6 seulement" ++ ++msgid "IPv6 prefix" ++msgstr "Préfixe IPv6" ++ ++msgid "IPv6 prefix length" ++msgstr "longueur du préfixe IPv6" ++ ++msgid "IPv6 routed prefix" ++msgstr "" ++ ++msgid "IPv6-Address" ++msgstr "Adresse IPv6" ++ ++msgid "IPv6-in-IPv4 (RFC4213)" ++msgstr "IPv6 dans IPv4 (RFC 4213)" ++ ++msgid "IPv6-over-IPv4 (6rd)" ++msgstr "IPv6 sur IPv4 (6ème)" ++ ++msgid "IPv6-over-IPv4 (6to4)" ++msgstr "IPv6 sur IPv4 (6 vers 4)" ++ ++msgid "Identity" ++msgstr "Identité" ++ ++msgid "" ++"If specified, mount the device by its UUID instead of a fixed device node" ++msgstr "" ++"Monte le périphérique identifié par cet UUID au lieu d'un nom de " ++"périphérique fixe" ++ ++msgid "" ++"If specified, mount the device by the partition label instead of a fixed " ++"device node" ++msgstr "" ++"Monte le périphérique identifié par cette étiquette au lieu d'un nom de " ++"périphérique fixe" ++ ++msgid "If unchecked, no default route is configured" ++msgstr "Décoché, aucune route par défaut n'est configurée" ++ ++msgid "If unchecked, the advertised DNS server addresses are ignored" ++msgstr "Décoché, les adresses des serveurs DNS publiés sont ignorées" ++ ++msgid "" ++"If your physical memory is insufficient unused data can be temporarily " ++"swapped to a swap-device resulting in a higher amount of usable RAM. Be aware that swapping data is a very " ++"slow process as the swap-device cannot be accessed with the high datarates " ++"of the RAM." ++msgstr "" ++"Si la mémoire physique n'est pas en quantité suffisante, les données " ++"inutilisées peuvent être temporairement transférée sur une partition " ++"d'échange, relevant la quantité de RAM disponible. Ce processus est lent car " ++"la mémoire d'échange ne peut être accédée aux taux de transfert de la RAM." ++ ++msgid "Ignore Hosts files" ++msgstr "Ignorer le fichiers Hosts" ++ ++msgid "Ignore interface" ++msgstr "Ignorer l'interface" ++ ++msgid "Ignore resolve file" ++msgstr "Ignorer le fichier de résolution" ++ ++msgid "Image" ++msgstr "Image" ++ ++msgid "In" ++msgstr "Entrée" ++ ++msgid "Inactivity timeout" ++msgstr "Délai d'inactivité" ++ ++msgid "Inbound:" ++msgstr "Intérieur :" ++ ++msgid "Info" ++msgstr "Info" ++ ++msgid "Initscript" ++msgstr "Script d'initialisation" ++ ++msgid "Initscripts" ++msgstr "Scripts d'initialisation" ++ ++msgid "Install" ++msgstr "Installer" ++ ++msgid "Install iputils-traceroute6 for IPv6 traceroute" ++msgstr "" ++ ++msgid "Install package %q" ++msgstr "Installer le paquet %q" ++ ++msgid "Install protocol extensions..." ++msgstr "Installation des extensions de protocole…" ++ ++msgid "Installed packages" ++msgstr "Paquets installés" ++ ++msgid "Interface" ++msgstr "Interface" ++ ++msgid "Interface Configuration" ++msgstr "Configuration de l'interface" ++ ++msgid "Interface Overview" ++msgstr "Vue d'ensemble de l'interface" ++ ++msgid "Interface is reconnecting..." ++msgstr "L'interface se reconnecte…" ++ ++msgid "Interface is shutting down..." ++msgstr "L'interface s'arrête…" ++ ++msgid "Interface not present or not connected yet." ++msgstr "L'interface n'est pas présente ou pas encore connectée." ++ ++msgid "Interface reconnected" ++msgstr "Interface reconnectée" ++ ++msgid "Interface shut down" ++msgstr "Interface arrêtée" ++ ++msgid "Interfaces" ++msgstr "Interfaces" ++ ++msgid "Internal" ++msgstr "" ++ ++msgid "Internal Server Error" ++msgstr "Erreur Serveur Interne" ++ ++msgid "Invalid" ++msgstr "Erreur : donnée entrée invalide" ++ ++msgid "Invalid VLAN ID given! Only IDs between %d and %d are allowed." ++msgstr "" ++"Identifiant VLAN invalide !Seuls les IDs entre %d et %d sont autorisés." ++ ++msgid "Invalid VLAN ID given! Only unique IDs are allowed" ++msgstr "" ++"Identifiant VLAN donné invalide ! Seuls les identifiants uniques sont " ++"autorisés" ++ ++msgid "Invalid username and/or password! Please try again." ++msgstr "Nom d'utilisateur et/ou mot de passe invalides ! Réessayez !" ++ ++#, fuzzy ++msgid "" ++"It appears that you are trying to flash an image that does not fit into the " ++"flash memory, please verify the image file!" ++msgstr "" ++"Il semble que vous essayez de programmer votre routeur avec une image qui ne " ++"tient pas dans sa mémoire flash, vérifiez s'il vous plait votre fichier-" ++"image !" ++ ++msgid "Java Script required!" ++msgstr "Nécessite un Script Java !" ++ ++msgid "Join Network" ++msgstr "Rejoindre un réseau" ++ ++msgid "Join Network: Settings" ++msgstr "Rejoindre un réseau : paramètres" ++ ++msgid "Join Network: Wireless Scan" ++msgstr "Rejoindre un réseau : recherche des réseaux sans-fil" ++ ++msgid "Keep settings" ++msgstr "Garder le paramètrage" ++ ++msgid "Kernel Log" ++msgstr "Journal du noyau" ++ ++msgid "Kernel Version" ++msgstr "Version du noyau" ++ ++msgid "Key" ++msgstr "Clé" ++ ++msgid "Key #%d" ++msgstr "Clé n° %d" ++ ++msgid "Kill" ++msgstr "Tuer" ++ ++msgid "L2TP" ++msgstr "L2TP" ++ ++msgid "L2TP Server" ++msgstr "Serveur L2TP" ++ ++msgid "LCP echo failure threshold" ++msgstr "Seuil d'erreur des échos LCP" ++ ++msgid "LCP echo interval" ++msgstr "Intervalle entre échos LCP" ++ ++msgid "LLC" ++msgstr "LLC" ++ ++msgid "Label" ++msgstr "Étiquette" ++ ++msgid "Language" ++msgstr "Langue" ++ ++msgid "Language and Style" ++msgstr "Langue et apparence" ++ ++msgid "Leaf" ++msgstr "" ++ ++msgid "Lease validity time" ++msgstr "Durée de validité d'un bail" ++ ++msgid "Leasefile" ++msgstr "Fichier de baux" ++ ++msgid "Leasetime" ++msgstr "Durée du bail" ++ ++msgid "Leasetime remaining" ++msgstr "Durée de validité" ++ ++msgid "Leave empty to autodetect" ++msgstr "Laisser vide pour l'auto-détection" ++ ++msgid "Leave empty to use the current WAN address" ++msgstr "Laisser vide pour utiliser l'adresse WAN actuelle" ++ ++msgid "Legend:" ++msgstr "Légende :" ++ ++msgid "Limit" ++msgstr "Limite" ++ ++msgid "Line Attenuation" ++msgstr "" ++ ++msgid "Line Speed" ++msgstr "" ++ ++msgid "Line State" ++msgstr "" ++ ++msgid "Link On" ++msgstr "Lien établi" ++ ++msgid "" ++"List of DNS servers to forward " ++"requests to" ++msgstr "" ++"Liste des serveurs auquels sont transmis les requêtes DNS" ++ ++msgid "List of domains to allow RFC1918 responses for" ++msgstr "Liste des domaines où sont permises les réponses de type RFC1918" ++ ++msgid "List of hosts that supply bogus NX domain results" ++msgstr "" ++"Liste des hôtes qui fournissent des résultats avec des « NX domain » bogués" ++ ++msgid "Listen only on the given interface or, if unspecified, on all" ++msgstr "Écouter seulement sur l'interface spécifié, sinon sur toutes" ++ ++msgid "Listening port for inbound DNS queries" ++msgstr "Port d'écoute des requêtes DNS entrantes" ++ ++msgid "Load" ++msgstr "Charger" ++ ++msgid "Load Average" ++msgstr "Charge moyenne" ++ ++msgid "Loading" ++msgstr "Chargement" ++ ++msgid "Local IPv4 address" ++msgstr "Adresse IPv4 locale" ++ ++msgid "Local IPv6 address" ++msgstr "Adresse IPv6 locale" ++ ++msgid "Local Startup" ++msgstr "Démarrage local" ++ ++msgid "Local Time" ++msgstr "Heure Locale" ++ ++msgid "Local domain" ++msgstr "Domaine local" ++ ++#, fuzzy ++msgid "" ++"Local domain specification. Names matching this domain are never forwarded " ++"and are resolved from DHCP or hosts files only" ++msgstr "" ++"Domaine local à préciser. Les noms correspondants à ce domaine ne sont " ++"jamais transmis, mais résolus seulement depuis le serveur DHCP ou le fichier " ++"Hosts" ++ ++msgid "Local domain suffix appended to DHCP names and hosts file entries" ++msgstr "" ++"Suffixe du domaine local ajouté aux noms du serveur DHCP et du fichier Hosts" ++ ++msgid "Local server" ++msgstr "Serveur local" ++ ++msgid "" ++"Localise hostname depending on the requesting subnet if multiple IPs are " ++"available" ++msgstr "" ++"Trouve le nom d'hôte suivant le sous-réseau d'où vient la requête si " ++"plusieurs adresses IPs sont possibles" ++ ++msgid "Localise queries" ++msgstr "Localiser les requêtes" ++ ++msgid "Locked to channel %d used by: %s" ++msgstr "" ++ ++msgid "Log output level" ++msgstr "Niveau de journalisation" ++ ++msgid "Log queries" ++msgstr "Journaliser les requêtes" ++ ++msgid "Logging" ++msgstr "Journalisation" ++ ++msgid "Login" ++msgstr "Connexion" ++ ++msgid "Logout" ++msgstr "Déconnexion" ++ ++msgid "Lowest leased address as offset from the network address." ++msgstr "" ++"Adresse allouée la plus basse, spécifiée par un décalage à partir de " ++"l'adresse réseau." ++ ++msgid "MAC-Address" ++msgstr "Adresse MAC" ++ ++msgid "MAC-Address Filter" ++msgstr "Filtrage par adresses MAC" ++ ++msgid "MAC-Filter" ++msgstr "Filtrage par adresses MAC" ++ ++msgid "MAC-List" ++msgstr "Liste des adresses MAC" ++ ++msgid "MB/s" ++msgstr "MB/s" ++ ++msgid "MHz" ++msgstr "MHz" ++ ++msgid "MTU" ++msgstr "MTU" ++ ++msgid "" ++"Make sure to clone the root filesystem using something like the commands " ++"below:" ++msgstr "" ++ ++msgid "Maximum Rate" ++msgstr "Débit maximum" ++ ++msgid "Maximum allowed number of active DHCP leases" ++msgstr "Nombre maximum de baux DHCP actifs" ++ ++msgid "Maximum allowed number of concurrent DNS queries" ++msgstr "Nombre maximum de requêtes DNS au même moment" ++ ++msgid "Maximum allowed size of EDNS.0 UDP packets" ++msgstr "Taille maximum autorisée des paquets UDP EDNS.0" ++ ++msgid "Maximum amount of seconds to wait for the modem to become ready" ++msgstr "Délai d'attente maximum que le modem soit prêt" ++ ++msgid "Maximum hold time" ++msgstr "Temps de maintien maximum" ++ ++msgid "Maximum number of leased addresses." ++msgstr "Nombre maximum d'adresses allouées." ++ ++msgid "Mbit/s" ++msgstr "Mbit/s" ++ ++msgid "Memory" ++msgstr "Mémoire" ++ ++msgid "Memory usage (%)" ++msgstr "Utilisation Mémoire (%)" ++ ++msgid "Metric" ++msgstr "Metrique" ++ ++msgid "Minimum Rate" ++msgstr "Débit minimum" ++ ++msgid "Minimum hold time" ++msgstr "Temps de maintien mimimum" ++ ++msgid "Mirror monitor port" ++msgstr "" ++ ++msgid "Mirror source port" ++msgstr "" ++ ++msgid "Missing protocol extension for proto %q" ++msgstr "Extention de protocole manquante pour le proto %q" ++ ++msgid "Mode" ++msgstr "Mode" ++ ++msgid "Model" ++msgstr "" ++ ++msgid "Modem device" ++msgstr "Interface Modem" ++ ++msgid "Modem init timeout" ++msgstr "Délai max. d'initialisation du modem" ++ ++msgid "Monitor" ++msgstr "Monitor" ++ ++msgid "Mount Entry" ++msgstr "Montage" ++ ++msgid "Mount Point" ++msgstr "Point de montage" ++ ++msgid "Mount Points" ++msgstr "Point de montage" ++ ++msgid "Mount Points - Mount Entry" ++msgstr "Points de montage - élément à monter" ++ ++msgid "Mount Points - Swap Entry" ++msgstr "Points de montage - partition d'échange" ++ ++msgid "" ++"Mount Points define at which point a memory device will be attached to the " ++"filesystem" ++msgstr "" ++"Les points de montage définissent l'attachement d'un périphérique au système " ++"de fichier" ++ ++msgid "Mount options" ++msgstr "Options de montage" ++ ++msgid "Mount point" ++msgstr "Point de montage" ++ ++msgid "Mounted file systems" ++msgstr "Systèmes de fichiers montés" ++ ++msgid "Move down" ++msgstr "Descendre" ++ ++msgid "Move up" ++msgstr "Monter" ++ ++msgid "Multicast Rate" ++msgstr "Débit multidiffusion" ++ ++msgid "Multicast address" ++msgstr "Adresse multidiffusion" ++ ++msgid "NAS ID" ++msgstr "NAS ID" ++ ++msgid "NDP-Proxy" ++msgstr "" ++ ++msgid "NTP server candidates" ++msgstr "Serveurs NTP candidats" ++ ++msgid "NTP sync time-out" ++msgstr "" ++ ++msgid "Name" ++msgstr "Nom" ++ ++msgid "Name of the new interface" ++msgstr "Nom de la nouvelle interface" ++ ++msgid "Name of the new network" ++msgstr "Nom du nouveau réseau" ++ ++msgid "Navigation" ++msgstr "Navigation" ++ ++msgid "Netmask" ++msgstr "Masque de réseau" ++ ++msgid "Network" ++msgstr "Réseau" ++ ++msgid "Network Utilities" ++msgstr "Utilitaires réseau" ++ ++msgid "Network boot image" ++msgstr "Image de démarrage réseau" ++ ++msgid "Network without interfaces." ++msgstr "Réseau sans interfaces." ++ ++msgid "Next »" ++msgstr "Prochain »" ++ ++msgid "No DHCP Server configured for this interface" ++msgstr "Aucun serveur DHCP configuré sur cette interface" ++ ++msgid "No chains in this table" ++msgstr "Aucune chaîne dans cette table" ++ ++msgid "No files found" ++msgstr "Aucun fichier trouvé" ++ ++msgid "No information available" ++msgstr "Information indisponible" ++ ++msgid "No negative cache" ++msgstr "Pas de cache négatif" ++ ++msgid "No network configured on this device" ++msgstr "Ce périphérique n'a aucune adresse configurée" ++ ++msgid "No network name specified" ++msgstr "Aucun nom de réseau donné" ++ ++msgid "No package lists available" ++msgstr "Aucune liste de paquets disponible" ++ ++msgid "No password set!" ++msgstr "Pas de mot de passe positionné !" ++ ++msgid "No rules in this chain" ++msgstr "Aucune règle dans cette chaîne" ++ ++msgid "No zone assigned" ++msgstr "Aucune zone attribuée" ++ ++msgid "Noise" ++msgstr "Bruit" ++ ++msgid "Noise Margin" ++msgstr "" ++ ++msgid "Noise:" ++msgstr "Bruit :" ++ ++msgid "None" ++msgstr "Vide" ++ ++msgid "Normal" ++msgstr "Normal" ++ ++msgid "Not Found" ++msgstr "Pas trouvé" ++ ++msgid "Not associated" ++msgstr "Pas associé" ++ ++msgid "Not connected" ++msgstr "Non connecté" ++ ++msgid "Note: Configuration files will be erased." ++msgstr "Note : les fichiers de configuration seront effacés." ++ ++msgid "Notice" ++msgstr "Note" ++ ++msgid "Nslookup" ++msgstr "Nslookup" ++ ++msgid "OK" ++msgstr "OK" ++ ++msgid "OPKG-Configuration" ++msgstr "Configuration OPKG" ++ ++msgid "Off-State Delay" ++msgstr "Durée éteinte" ++ ++msgid "" ++"On this page you can configure the network interfaces. You can bridge " ++"several interfaces by ticking the \"bridge interfaces\" field and enter the " ++"names of several network interfaces separated by spaces. You can also use " ++"VLAN notation " ++"INTERFACE.VLANNR (e.g.: " ++"eth0.1)." ++msgstr "" ++"Dans cette page vous pourrez configurer les interfaces réseaux. Vous pouvez " ++"bridger différentes interfaces en cochant le champ \"bridger les interfaces" ++"\" et en saisissant les noms des interfaces réseau séparées par des espaces. " ++"Vous pouvez aussi utiliser la notation VLAN, INTERFACE.VLANNB (ex : eth0.1)." ++ ++msgid "On-State Delay" ++msgstr "Durée allumée" ++ ++msgid "One of hostname or mac address must be specified!" ++msgstr "Il faut indiquer un nom d'hôte ou une adresse MAC !" ++ ++msgid "One or more fields contain invalid values!" ++msgstr "Un ou plusieurs champs contiennent des valeurs incorrectes !" ++ ++msgid "One or more required fields have no value!" ++msgstr "Un ou plusieurs champs n'ont pas de valeur !" ++ ++msgid "Open list..." ++msgstr "Ouvrir la liste…" ++ ++msgid "OpenConnect (CISCO AnyConnect)" ++msgstr "" ++ ++msgid "Operating frequency" ++msgstr "" ++ ++msgid "Option changed" ++msgstr "Option modifiée" ++ ++msgid "Option removed" ++msgstr "Option retirée" ++ ++msgid "Optional, specify to override default server (tic.sixxs.net)" ++msgstr "" ++ ++msgid "Optional, use when the SIXXS account has more than one tunnel" ++msgstr "" ++ ++msgid "Options" ++msgstr "Options" ++ ++msgid "Other:" ++msgstr "Autres :" ++ ++msgid "Out" ++msgstr "Sortie" ++ ++msgid "Outbound:" ++msgstr "Extérieur :" ++ ++msgid "Outdoor Channels" ++msgstr "Canaux en extérieur" ++ ++msgid "Output Interface" ++msgstr "" ++ ++msgid "Override MAC address" ++msgstr "Modifier l'adresse MAC" ++ ++msgid "Override MTU" ++msgstr "Modifier le MTU" ++ ++msgid "Override the gateway in DHCP responses" ++msgstr "Modifier la passerelle dans les réponses DHCP" ++ ++msgid "" ++"Override the netmask sent to clients. Normally it is calculated from the " ++"subnet that is served." ++msgstr "" ++"Remplacer le masque réseau envoyés aux clients. Il est normalement calculé à " ++"partir du sous-réseau géré." ++ ++msgid "Override the table used for internal routes" ++msgstr "Modifier la table utilisée pour les routes internes" ++ ++msgid "Overview" ++msgstr "Vue d'ensemble" ++ ++msgid "Owner" ++msgstr "Propriétaire" ++ ++msgid "PAP/CHAP password" ++msgstr "Mot de passe PAP/CHAP" ++ ++msgid "PAP/CHAP username" ++msgstr "Identifiant PAP/CHAP" ++ ++msgid "PID" ++msgstr "PID" ++ ++msgid "PIN" ++msgstr "code PIN" ++ ++msgid "PPP" ++msgstr "PPP" ++ ++msgid "PPPoA Encapsulation" ++msgstr "PPPoA Encapsulation" ++ ++msgid "PPPoATM" ++msgstr "PPPoATM" ++ ++msgid "PPPoE" ++msgstr "PPPoE" ++ ++msgid "PPtP" ++msgstr "PPtP" ++ ++msgid "Package libiwinfo required!" ++msgstr "Nécessite le paquet libiwinfo !" ++ ++msgid "Package lists are older than 24 hours" ++msgstr "Les listes de paquets ont plus de 24 heures" ++ ++msgid "Package name" ++msgstr "Nom du paquet" ++ ++msgid "Packets" ++msgstr "Paquets" ++ ++msgid "Part of zone %q" ++msgstr "Fait partie de la zone %q" ++ ++msgid "Password" ++msgstr "Mot de passe" ++ ++msgid "Password authentication" ++msgstr "Authentification par mot de passe" ++ ++msgid "Password of Private Key" ++msgstr "Mot de passe de la clé privée" ++ ++msgid "Password successfully changed!" ++msgstr "Mot de passe changé avec succès !" ++ ++msgid "Path" ++msgstr "Chemin" ++ ++msgid "Path to CA-Certificate" ++msgstr "Chemin de la CA" ++ ++msgid "Path to Client-Certificate" ++msgstr "Chemin du certificat-client" ++ ++msgid "Path to Private Key" ++msgstr "Chemin de la clé privée" ++ ++msgid "Path to executable which handles the button event" ++msgstr "Chemin du programme exécutable gérant les évènements liés au bouton" ++ ++msgid "Peak:" ++msgstr "Pic :" ++ ++msgid "Perform reboot" ++msgstr "Redémarrer" ++ ++msgid "Perform reset" ++msgstr "Réinitialiser" ++ ++msgid "Phy Rate:" ++msgstr "Débit de la puce:" ++ ++msgid "Physical Settings" ++msgstr "Paramètres physiques" ++ ++msgid "Ping" ++msgstr "Ping" ++ ++msgid "Pkts." ++msgstr "Pqts." ++ ++msgid "Please enter your username and password." ++msgstr "Saisissez votre nom d'utilisateur et mot de passe." ++ ++msgid "Please wait: Device rebooting..." ++msgstr "Patientez s'il vous plaît: équipement en cours de redémarrage..." ++ ++msgid "Policy" ++msgstr "Politique" ++ ++msgid "Port" ++msgstr "Port" ++ ++msgid "Port %d" ++msgstr "Port %d" ++ ++msgid "Port %d is untagged in multiple VLANs!" ++msgstr "Le port %d n'est pas marqué dans plusieurs VLANs !" ++ ++msgid "Port status:" ++msgstr "Statut du port :" ++ ++msgid "" ++"Presume peer to be dead after given amount of LCP echo failures, use 0 to " ++"ignore failures" ++msgstr "" ++"Suppose que le distant a disparu une fois le nombre donné d'erreurs d'échos " ++"LCP ; utiliser 0 pour ignorer ces erreurs" ++ ++msgid "Prevents client-to-client communication" ++msgstr "Empêche la communication directe entre clients" ++ ++msgid "Prism2/2.5/3 802.11b Wireless Controller" ++msgstr "Contrôleur sans fil Prism2/2.5/3 802.11b" ++ ++msgid "Proceed" ++msgstr "Continuer" ++ ++msgid "Processes" ++msgstr "Processus" ++ ++msgid "Prot." ++msgstr "Prot." ++ ++msgid "Protocol" ++msgstr "Protocole" ++ ++msgid "Protocol family" ++msgstr "Famille du protocole" ++ ++msgid "Protocol of the new interface" ++msgstr "Protocole de la nouvelle interface" ++ ++msgid "Protocol support is not installed" ++msgstr "La gestion du protocole n'est pas installée" ++ ++msgid "Provide NTP server" ++msgstr "Fournir serveur NTP" ++ ++msgid "Provide new network" ++msgstr "Donner un nouveau réseau" ++ ++msgid "Pseudo Ad-Hoc (ahdemo)" ++msgstr "Pseudo Ad-Hoc (ahdemo)" ++ ++msgid "Public prefix routed to this device for distribution to clients." ++msgstr "" ++ ++msgid "Quality" ++msgstr "Qualitée" ++ ++msgid "RTS/CTS Threshold" ++msgstr "Seuil RTS/CTS" ++ ++msgid "RX" ++msgstr "Reçu" ++ ++msgid "RX Rate" ++msgstr "Débit en réception" ++ ++msgid "RaLink 802.11%s Wireless Controller" ++msgstr "Contrôleur sans fil RaLink 802.11%s" ++ ++msgid "Radius-Accounting-Port" ++msgstr "Port de la comptabilisation Radius" ++ ++msgid "Radius-Accounting-Secret" ++msgstr "Secret de la comptabilisation Radius" ++ ++msgid "Radius-Accounting-Server" ++msgstr "Serveur de la comptabilisation Radius" ++ ++msgid "Radius-Authentication-Port" ++msgstr "Port de l'authentification Radius" ++ ++msgid "Radius-Authentication-Secret" ++msgstr "Secret de l'authentification Radius" ++ ++msgid "Radius-Authentication-Server" ++msgstr "Serveur de l'authentification Radius" ++ ++msgid "" ++"Read /etc/ethers to configure the DHCP-Server" ++msgstr "Lire /etc/ethers pour configurer le serveur DHCP" ++ ++msgid "" ++"Really delete this interface? The deletion cannot be undone!\\nYou might " ++"lose access to this device if you are connected via this interface." ++msgstr "" ++"Voulez-vous vraiment supprimer cette interface? L'effacement ne peut être " ++"annulé!\n" ++"Vous pourriez perdre l'accès à l'équipement si vous y êtes connecté par " ++"cette interface." ++ ++msgid "" ++"Really delete this wireless network? The deletion cannot be undone!\\nYou " ++"might lose access to this device if you are connected via this network." ++msgstr "" ++"Voulez-vous vraiment supprimer ce réseau sans-fil? L'effacement ne peut être " ++"annulé!\n" ++"Vous pourriez perdre l'accès à l'équipement si vous y êtes connecté par ce " ++"réseau." ++ ++msgid "Really reset all changes?" ++msgstr "Voulez-vous vraiment ré-initialiser toutes les modifications ?" ++ ++msgid "" ++"Really shut down network?\\nYou might lose access to this device if you are " ++"connected via this interface." ++msgstr "" ++"Voulez-vous vraiment arrêter l'interface %s ?\n" ++"Vous pourriez perdre l'accès à l'équipement si vous y êtes connecté par " ++"cette interface." ++ ++msgid "" ++"Really shutdown interface \"%s\" ?\\nYou might lose access to this device if " ++"you are connected via this interface." ++msgstr "" ++"Voulez-vous vraiment arrêter l'interface %s ?\n" ++"Vous pourriez perdre l'accès à l'équipement si vous y êtes connecté par " ++"cette interface." ++ ++msgid "Really switch protocol?" ++msgstr "Voulez-vous vraiment changer de protocole ?" ++ ++msgid "Realtime Connections" ++msgstr "Connexions temps-réel" ++ ++msgid "Realtime Graphs" ++msgstr "Graphiques temps-réel" ++ ++msgid "Realtime Load" ++msgstr "Charge temps-réel" ++ ++msgid "Realtime Traffic" ++msgstr "Trafic temps-réel" ++ ++msgid "Realtime Wireless" ++msgstr "Qualité de réception actuelle" ++ ++msgid "Rebind protection" ++msgstr "Protection contre l'attaque « rebind »" ++ ++msgid "Reboot" ++msgstr "Redémarrage" ++ ++msgid "Rebooting..." ++msgstr "Redémarre…" ++ ++msgid "Reboots the operating system of your device" ++msgstr "Redémarrage du système d'exploitation de votre équipement" ++ ++msgid "Receive" ++msgstr "Reçoit" ++ ++msgid "Receiver Antenna" ++msgstr "Antenne émettrice" ++ ++msgid "Reconnect this interface" ++msgstr "Reconnecter cet interface" ++ ++msgid "Reconnecting interface" ++msgstr "Reconnecte cet interface" ++ ++msgid "References" ++msgstr "Références" ++ ++msgid "Regulatory Domain" ++msgstr "Domaine de certification" ++ ++msgid "Relay" ++msgstr "Relais" ++ ++msgid "Relay Bridge" ++msgstr "Pont-relais" ++ ++msgid "Relay between networks" ++msgstr "Relais entre réseaux" ++ ++msgid "Relay bridge" ++msgstr "Pont-relais" ++ ++msgid "Remote IPv4 address" ++msgstr "Adresse IPv4 distante" ++ ++msgid "Remove" ++msgstr "Désinstaller" ++ ++msgid "Repeat scan" ++msgstr "Répéter la recherche" ++ ++msgid "Replace entry" ++msgstr "Remplacer l'entrée" ++ ++msgid "Replace wireless configuration" ++msgstr "Remplacer la configuration sans-fil" ++ ++msgid "Request IPv6-address" ++msgstr "" ++ ++msgid "Request IPv6-prefix of length" ++msgstr "" ++ ++msgid "Require TLS" ++msgstr "" ++ ++msgid "Required for certain ISPs, e.g. Charter with DOCSIS 3" ++msgstr "Nécessaire avec certains FAIs, par ex. : Charter avec DOCSIS 3" ++ ++msgid "Reset" ++msgstr "Remise à zéro" ++ ++msgid "Reset Counters" ++msgstr "Remise à zéro des compteurs" ++ ++msgid "Reset to defaults" ++msgstr "Ré-initialisation" ++ ++msgid "Resolv and Hosts Files" ++msgstr "Fichiers Resolv et Hosts" ++ ++msgid "Resolve file" ++msgstr "Fichier de résolution des noms" ++ ++msgid "Restart" ++msgstr "Redémarrer" ++ ++msgid "Restart Firewall" ++msgstr "Redémarrer le pare-feu" ++ ++msgid "Restore backup" ++msgstr "Restaurer une sauvegarde" ++ ++msgid "Reveal/hide password" ++msgstr "Montrer/cacher le mot de passe" ++ ++msgid "Revert" ++msgstr "Revenir" ++ ++msgid "Root" ++msgstr "Racine" ++ ++msgid "Root directory for files served via TFTP" ++msgstr "Répertoire racine des fichiers fournis par TFTP" ++ ++msgid "Root preparation" ++msgstr "" ++ ++msgid "Routed IPv6 prefix for downstream interfaces" ++msgstr "" ++ ++msgid "Router Advertisement-Service" ++msgstr "" ++ ++msgid "Router Password" ++msgstr "Mot de passe du routeur" ++ ++msgid "Routes" ++msgstr "Routes" ++ ++msgid "" ++"Routes specify over which interface and gateway a certain host or network " ++"can be reached." ++msgstr "" ++"Avec les routes statiques vous pouvez spécifier à travers quelle interface " ++"ou passerelle un réseau peut être contacté." ++ ++msgid "Rule #" ++msgstr "N° de règle" ++ ++msgid "Run a filesystem check before mounting the device" ++msgstr "" ++"Faire un vérification du système de fichiers avant de monter le périphérique" ++ ++msgid "Run filesystem check" ++msgstr "Faire une vérification du système de fichiers" ++ ++msgid "" ++"SIXXS supports TIC only, for static tunnels using IP protocol 41 (RFC4213) " ++"use 6in4 instead" ++msgstr "" ++ ++msgid "SIXXS-handle[/Tunnel-ID]" ++msgstr "" ++ ++msgid "SSH Access" ++msgstr "Accès SSH" ++ ++msgid "SSH-Keys" ++msgstr "Clés SSH" ++ ++msgid "SSID" ++msgstr "SSID" ++ ++msgid "Save" ++msgstr "Sauvegarder" ++ ++msgid "Save & Apply" ++msgstr "Sauvegarder et Appliquer" ++ ++msgid "Save & Apply" ++msgstr "Sauvegarder et appliquer" ++ ++msgid "Scan" ++msgstr "Scan" ++ ++msgid "Scheduled Tasks" ++msgstr "Tâches Régulières" ++ ++msgid "Section added" ++msgstr "Section ajoutée" ++ ++msgid "Section removed" ++msgstr "Section retirée" ++ ++msgid "See \"mount\" manpage for details" ++msgstr "Voir le manuel de « mount » pour les détails" ++ ++msgid "" ++"Send LCP echo requests at the given interval in seconds, only effective in " ++"conjunction with failure threshold" ++msgstr "" ++"Envoyer des demandes d'échos LCP à intervalles donnés, en secondes ; utile " ++"uniqument associé à un seuil d'erreurs" ++ ++msgid "Separate Clients" ++msgstr "Isoler les clients" ++ ++msgid "Separate WDS" ++msgstr "WDS séparé" ++ ++msgid "Server Settings" ++msgstr "Paramètres du serveur" ++ ++msgid "Server password" ++msgstr "" ++ ++msgid "" ++"Server password, enter the specific password of the tunnel when the username " ++"contains the tunnel ID" ++msgstr "" ++ ++msgid "Server username" ++msgstr "" ++ ++msgid "Service Name" ++msgstr "Nom du service" ++ ++msgid "Service Type" ++msgstr "Type du service" ++ ++msgid "Services" ++msgstr "Services" ++ ++#, fuzzy ++msgid "Set up Time Synchronization" ++msgstr "Configurer la synchronisation de l'heure" ++ ++msgid "Setup DHCP Server" ++msgstr "Configurer le serveur DHCP" ++ ++msgid "Show current backup file list" ++msgstr "Afficher la liste des fichiers de la sauvegarde actuelle" ++ ++msgid "Shutdown this interface" ++msgstr "Arrêter cet interface" ++ ++msgid "Shutdown this network" ++msgstr "Arrêter ce réseau" ++ ++msgid "Signal" ++msgstr "Signal" ++ ++msgid "Signal:" ++msgstr "Signal :" ++ ++msgid "Size" ++msgstr "Taille" ++ ++msgid "Skip" ++msgstr "Passer au suivant" ++ ++msgid "Skip to content" ++msgstr "Skip to content" ++ ++msgid "Skip to navigation" ++msgstr "Skip to navigation" ++ ++msgid "Slot time" ++msgstr "Tranche de temps" ++ ++msgid "Software" ++msgstr "Logiciels" ++ ++msgid "Some fields are invalid, cannot save values!" ++msgstr "Certains champs sont invalides, ne peut sauvegarder les valeurs !" ++ ++msgid "Sorry, the object you requested was not found." ++msgstr "Désolé, l'objet que vous avez demandé n'as pas été trouvé." ++ ++msgid "Sorry, the server encountered an unexpected error." ++msgstr "Désolé, le serveur à rencontré une erreur inattendue." ++ ++#, fuzzy ++msgid "" ++"Sorry, there is no sysupgrade support present; a new firmware image must be " ++"flashed manually. Please refer to the OpenWrt wiki for device specific " ++"install instructions." ++msgstr "" ++"Désolé, il n'y a pas de gestion de mise à jour disponible, une nouvelle " ++"image du micrologiciel doit être écrite manuellement. Reportez-vous S.V.P. " ++"au wiki OpenWrt pour connaître les instructions d'installation spécifiques à " ++"votre matériel." ++ ++msgid "Sort" ++msgstr "Trier" ++ ++msgid "Source" ++msgstr "Source" ++ ++msgid "Source routing" ++msgstr "" ++ ++msgid "Specifies the button state to handle" ++msgstr "Indique l'état du bouton à gérer" ++ ++msgid "Specifies the directory the device is attached to" ++msgstr "Indique le répertoire auquel le périphérique est rattaché" ++ ++msgid "Specifies the listening port of this Dropbear instance" ++msgstr "Indique le port d'écoute de cette instance Dropbear" ++ ++msgid "" ++"Specifies the maximum amount of failed ARP requests until hosts are presumed " ++"to be dead" ++msgstr "" ++"Indique le nombre de requêtes ARP ratées au delà duquel les hôtes seront " ++"supposés disparus" ++ ++msgid "" ++"Specifies the maximum amount of seconds after which hosts are presumed to be " ++"dead" ++msgstr "Indique le délai après quoi les hôtes seront supposés disparus" ++ ++msgid "Specify the secret encryption key here." ++msgstr "Spécifiez ici la clé secrète de chiffrage." ++ ++msgid "Start" ++msgstr "Démarrer" ++ ++msgid "Start priority" ++msgstr "Priorité de démarrage" ++ ++msgid "Startup" ++msgstr "Démarrage" ++ ++msgid "Static IPv4 Routes" ++msgstr "Routes IPv4 statiques" ++ ++msgid "Static IPv6 Routes" ++msgstr "Routes IPv6 statiques" ++ ++msgid "Static Leases" ++msgstr "Baux Statiques" ++ ++msgid "Static Routes" ++msgstr "Routes statiques" ++ ++msgid "Static WDS" ++msgstr "WDS statique" ++ ++msgid "Static address" ++msgstr "Adresse statique" ++ ++msgid "" ++"Static leases are used to assign fixed IP addresses and symbolic hostnames " ++"to DHCP clients. They are also required for non-dynamic interface " ++"configurations where only hosts with a corresponding lease are served." ++msgstr "" ++"Les baux statiques sont utilisés pour donner des adresses IP fixes et des " ++"noms symboliques à des clients DHCP. Il sont également nécessaires pour les " ++"interfaces sans configuration dynamique où l'on fournit un bail aux seuls " ++"hôtes configurés." ++ ++msgid "Status" ++msgstr "Status" ++ ++msgid "Stop" ++msgstr "Arrêter" ++ ++msgid "Strict order" ++msgstr "Ordre stricte" ++ ++msgid "Submit" ++msgstr "Soumettre" ++ ++msgid "Swap" ++msgstr "" ++ ++msgid "Swap Entry" ++msgstr "Élement de partition d'échange" ++ ++msgid "Switch" ++msgstr "Commutateur" ++ ++msgid "Switch %q" ++msgstr "Commutateur %q" ++ ++msgid "Switch %q (%s)" ++msgstr "Commutateur %q (%s)" ++ ++msgid "Switch protocol" ++msgstr "Protocole du commutateur" ++ ++msgid "Sync with browser" ++msgstr "Synchro avec le navigateur" ++ ++msgid "Synchronizing..." ++msgstr "Synchronisation…" ++ ++msgid "System" ++msgstr "Système" ++ ++msgid "System Log" ++msgstr "Journal système" ++ ++msgid "System Properties" ++msgstr "Propriétés système" ++ ++msgid "System log buffer size" ++msgstr "Taille du tampon du journal système" ++ ++msgid "TCP:" ++msgstr "TCP :" ++ ++msgid "TFTP Settings" ++msgstr "Paramètres TFTP" ++ ++msgid "TFTP server root" ++msgstr "Racine du serveur TFTP" ++ ++msgid "TX" ++msgstr "Transmis" ++ ++msgid "TX Rate" ++msgstr "Débit en émission" ++ ++msgid "Table" ++msgstr "Table" ++ ++msgid "Target" ++msgstr "Cible" ++ ++msgid "Terminate" ++msgstr "Terminer" ++ ++#, fuzzy ++msgid "" ++"The Device Configuration section covers physical settings of the " ++"radio hardware such as channel, transmit power or antenna selection which " ++"are shared among all defined wireless networks (if the radio hardware is " ++"multi-SSID capable). Per network settings like encryption or operation mode " ++"are grouped in the Interface Configuration." ++msgstr "" ++"La section Configuration de l'équipement couvre les paramètres " ++"physiques du matériel radio comme le canal, la puissance d'émission ou la " ++"sélection de l'antenne, qui sont partagés entre tous les réseaux sans-fil " ++"définis (si le matériel radio gère plusieurs réseaux SSID). Les paramètres " ++"dépendant de chaque réseau comme le chiffrage ou le mode de fonctionnement " ++"sont groupés dans Configuration de l'interface." ++ ++msgid "" ++"The libiwinfo-lua package is not installed. You must install this " ++"component for working wireless configuration!" ++msgstr "" ++"Le paquet libiwinfo-lua n'est pas installé. Vous devez l'installer " ++"pour une configuration sans-fil fonctionnelle !" ++ ++msgid "" ++"The HE.net endpoint update configuration changed, you must now use the plain " ++"username instead of the user ID!" ++msgstr "" ++ ++msgid "" ++"The IPv6 prefix assigned to the provider, usually ends with ::" ++msgstr "" ++"Le préfixe IPv6 attribué par le fournisseur, se termine généralement par " ++"::" ++ ++msgid "" ++"The allowed characters are: A-Z, a-z, 0-9 and _" ++msgstr "" ++"Les caractères autorisés sont : A-Z, a-z, " ++"0-9 et _" ++ ++msgid "The configuration file could not be loaded due to the following error:" ++msgstr "" ++ ++msgid "" ++"The device file of the memory or partition (e.g." ++" /dev/sda1)" ++msgstr "Le périphérique de bloc contenant la partition (ex : /dev/sda1)" ++ ++msgid "" ++"The filesystem that was used to format the memory (e.g. ext3)" ++msgstr "" ++"Le système de fichiers utilisé pour formatter le support de stockage (ex : " ++"ext3)" ++ ++msgid "" ++"The flash image was uploaded. Below is the checksum and file size listed, " ++"compare them with the original file to ensure data integrity.
    Click " ++"\"Proceed\" below to start the flash procedure." ++msgstr "" ++"L'image du micrologiciel a été chargée. Ci-dessous la taille et la somme de " ++"contrôle de cette image, comparez-les avec le fichier original pour vous " ++"assurer de son intégrité.
    Cliquez sur \"Continuer\" pour lancer la " ++"procédure d'écriture." ++ ++msgid "The following changes have been committed" ++msgstr "Les changements suivants ont été appliqués" ++ ++msgid "The following changes have been reverted" ++msgstr "Les changements suivants ont été annulés" ++ ++msgid "The following rules are currently active on this system." ++msgstr "Les règles suivantes sont actuellement actives sur ce système." ++ ++msgid "The given network name is not unique" ++msgstr "Le nom de réseau donné n'est pas unique" ++ ++#, fuzzy ++msgid "" ++"The hardware is not multi-SSID capable and the existing configuration will " ++"be replaced if you proceed." ++msgstr "" ++"Le matériel ne sait pas gérer plusieurs SSID et la configuration existante " ++"sera remplacée si vous continuez." ++ ++msgid "" ++"The length of the IPv4 prefix in bits, the remainder is used in the IPv6 " ++"addresses." ++msgstr "" ++"La longueur du préfixe IPv4 en bits, le reste est utilisé dans les adresses " ++"IPv6" ++ ++msgid "The length of the IPv6 prefix in bits" ++msgstr "La longueur du préfixe IPv6 en bits" ++ ++msgid "" ++"The network ports on this device can be combined to several VLANs in which computers can " ++"communicate directly with each other. VLANs are often used to separate different network " ++"segments. Often there is by default one Uplink port for a connection to the " ++"next greater network like the internet and other ports for a local network." ++msgstr "" ++"Les ports de votre équipement peuvent être configurés pour combiner " ++"plusieurs VLANs dans " ++"lesquels les machines connectées peuvent dialoguer directement l'une avec " ++"l'autre. Les VLANs sont " ++"souvent utilisés pour séparer différences sous-réseaux. Bien souvent il y a " ++"un port d'uplink pour une connexion vers un réseau plus vaste, comme " ++"internet et les autres ports sont réservés au réseau local." ++ ++msgid "The selected protocol needs a device assigned" ++msgstr "Le protocole sélectionné nécessite l'attribution d'un périphérique" ++ ++msgid "" ++"The system is erasing the configuration partition now and will reboot itself " ++"when finished." ++msgstr "" ++"Le système est en train d'effacer la partition de configuration et " ++"redémarrera tout seul une fois cela fini." ++ ++#, fuzzy ++msgid "" ++"The system is flashing now.
    DO NOT POWER OFF THE DEVICE!
    Wait a " ++"few minutes before you try to reconnect. It might be necessary to renew the " ++"address of your computer to reach the device again, depending on your " ++"settings." ++msgstr "" ++"The system is flashing now.
    DO NOT POWER OFF THE DEVICE!
    Wait a " ++"few minutes until you try to reconnect. It might be necessary to renew the " ++"address of your computer to reach the device again, depending on your " ++"settings." ++ ++msgid "" ++"The tunnel end-point is behind NAT, defaults to disabled and only applies to " ++"AYIYA" ++msgstr "" ++ ++msgid "" ++"The uploaded image file does not contain a supported format. Make sure that " ++"you choose the generic image format for your platform." ++msgstr "" ++"The uploaded image file does not contain a supported format. Make sure that " ++"you choose the generic image format for your platform." ++ ++msgid "There are no active leases." ++msgstr "Il n'y a aucun bail actif." ++ ++msgid "There are no pending changes to apply!" ++msgstr "Il n'y a aucun changement en attente d'être appliqués !" ++ ++msgid "There are no pending changes to revert!" ++msgstr "Il n'y a aucun changement à annuler !" ++ ++msgid "There are no pending changes!" ++msgstr "Il n'y a aucun changement en attente !" ++ ++msgid "" ++"There is no device assigned yet, please attach a network device in the " ++"\"Physical Settings\" tab" ++msgstr "" ++"Il n'y a aucun périphérique attribué pour l'instant, liez s.v.p. un " ++"périphérique réseau dans l'onglet \"Paramètres du matériel\"" ++ ++msgid "" ++"There is no password set on this router. Please configure a root password to " ++"protect the web interface and enable SSH." ++msgstr "" ++"Ce routeur n'a pas de mot de passe configuré. Veuillez configurer un mot de " ++"passe pour l'utilisateur root pour protéger l'accès de votre interface web " ++"et activer l'accès par SSH." ++ ++msgid "This IPv4 address of the relay" ++msgstr "L'adresse IPv4 du relais" ++ ++msgid "" ++"This is a list of shell glob patterns for matching files and directories to " ++"include during sysupgrade. Modified files in /etc/config/ and certain other " ++"configurations are automatically preserved." ++msgstr "" ++"Voici la liste des motifs de type glob shell utilisés pour sélectionner les " ++"fichiers et répertoires à inclure durant la mise à jour système. Les " ++"fichiers modifiés dans /etc/config/ et certains autres sont automatiquement " ++"conservés." ++ ++msgid "" ++"This is either the \"Update Key\" configured for the tunnel or the account " ++"password if no update key has been configured" ++msgstr "" ++ ++msgid "" ++"This is the content of /etc/rc.local. Insert your own commands here (in " ++"front of 'exit 0') to execute them at the end of the boot process." ++msgstr "" ++"Voici le contenu de /etc/rc.local. Placez-y vos propres commandes (avant le " ++"« exit 0 ») pour qu'ils soient exécutés en fin de démarrage." ++ ++msgid "" ++"This is the local endpoint address assigned by the tunnel broker, it usually " ++"ends with :2" ++msgstr "" ++"Il s'agit de l'adresse de l'extrémité locale attribuée par le fournisseur de " ++"tunnels, elle se termine habituellement avec :2" ++ ++msgid "" ++"This is the only DHCP in the local network" ++msgstr "C'est le seul serveur DHCP sur le réseau local" ++ ++msgid "This is the plain username for logging into the account" ++msgstr "" ++ ++msgid "" ++"This is the prefix routed to you by the tunnel broker for use by clients" ++msgstr "" ++ ++msgid "This is the system crontab in which scheduled tasks can be defined." ++msgstr "" ++"Ceci est le système crontab avec lequel sont définies les tâches récurrentes." ++ ++msgid "" ++"This is usually the address of the nearest PoP operated by the tunnel broker" ++msgstr "" ++"Il s'agit habituellement de l'adresse du plus proche PoP géré par le " ++"fournisseur de tunnels" ++ ++msgid "" ++"This list gives an overview over currently running system processes and " ++"their status." ++msgstr "" ++"Cette liste donne une vue d'ensemble des processus en exécution et leur " ++"statut." ++ ++msgid "This page allows the configuration of custom button actions" ++msgstr "Cette page permet la configuration d'actions spécifiques des boutons" ++ ++msgid "This page gives an overview over currently active network connections." ++msgstr "" ++"Cette page donne une vue d'ensemble des connexions réseaux actuellement " ++"actives." ++ ++msgid "This section contains no values yet" ++msgstr "Cette section ne contient pas encore de valeur" ++ ++msgid "Time Synchronization" ++msgstr "Synchronisation de l'heure" ++ ++msgid "Time Synchronization is not configured yet." ++msgstr "La synchronisation de l'heure n'est pas encore configurée." ++ ++msgid "Timezone" ++msgstr "Fuseau horaire" ++ ++msgid "" ++"To restore configuration files, you can upload a previously generated backup " ++"archive here." ++msgstr "" ++"Pour restaurer les fichiers de configuration, vous pouvez charger ici une " ++"archive de sauvegarde construite précédemment." ++ ++msgid "Total Available" ++msgstr "Total disponible" ++ ++msgid "Traceroute" ++msgstr "Traceroute" ++ ++msgid "Traffic" ++msgstr "Trafic" ++ ++msgid "Transfer" ++msgstr "Transfert" ++ ++msgid "Transmission Rate" ++msgstr "Débit d'émission" ++ ++msgid "Transmit" ++msgstr "Transmet" ++ ++msgid "Transmit Power" ++msgstr "Puissance d'émission" ++ ++msgid "Transmitter Antenna" ++msgstr "Antenne émettrice" ++ ++msgid "Trigger" ++msgstr "Déclenchement" ++ ++msgid "Trigger Mode" ++msgstr "Mode de déclenchement" ++ ++msgid "Tunnel ID" ++msgstr "ID du tunnel" ++ ++msgid "Tunnel Interface" ++msgstr "Interface du tunnel" ++ ++msgid "Tunnel Link" ++msgstr "" ++ ++msgid "Tunnel broker protocol" ++msgstr "" ++ ++msgid "Tunnel setup server" ++msgstr "" ++ ++msgid "Tunnel type" ++msgstr "" ++ ++msgid "Turbo Mode" ++msgstr "Mode Turbo" ++ ++msgid "Tx-Power" ++msgstr "Puissance d'émission" ++ ++msgid "Type" ++msgstr "Type" ++ ++msgid "UDP:" ++msgstr "UDP :" ++ ++msgid "UMTS only" ++msgstr "seulement UMTS" ++ ++msgid "UMTS/GPRS/EV-DO" ++msgstr "UMTS/GPRS/EV-DO" ++ ++msgid "USB Device" ++msgstr "Périphérique USB" ++ ++msgid "UUID" ++msgstr "UUID" ++ ++msgid "Unable to dispatch" ++msgstr "Impossible d'envoyer" ++ ++msgid "Unknown" ++msgstr "Inconnu" ++ ++msgid "Unknown Error, password not changed!" ++msgstr "Erreur inconnue, mot de passe inchangé !" ++ ++msgid "Unmanaged" ++msgstr "non-géré" ++ ++msgid "Unsaved Changes" ++msgstr "Changements non appliqués" ++ ++msgid "Unsupported protocol type." ++msgstr "Type de protocole non pris en charge." ++ ++msgid "Update lists" ++msgstr "Mettre les listes à jour" ++ ++msgid "" ++"Upload a sysupgrade-compatible image here to replace the running firmware. " ++"Check \"Keep settings\" to retain the current configuration (requires an " ++"OpenWrt compatible firmware image)." ++msgstr "" ++"Envoyer ici une image compatible avec le système de mise à jour pour " ++"remplacer le micrologiciel actuel. Cochez \"Garder la configuration\" pour " ++"maintenir la configuration actuelle (nécessite une image de micrologiciel " ++"OpenWRT compatible)." ++ ++msgid "Upload archive..." ++msgstr "Envoi de l'archive…" ++ ++msgid "Uploaded File" ++msgstr "Fichier Uploadé" ++ ++msgid "Uptime" ++msgstr "Uptime" ++ ++msgid "Use /etc/ethers" ++msgstr "Utiliser /etc/ethers" ++ ++msgid "Use DHCP gateway" ++msgstr "Utiliser la passerelle DHCP" ++ ++msgid "Use DNS servers advertised by peer" ++msgstr "Utiliser les serveurs DNS publiés par le distant" ++ ++msgid "Use ISO/IEC 3166 alpha2 country codes." ++msgstr "Utiliser les codes-pays ISO/IEC 3166 alpha2." ++ ++msgid "Use MTU on tunnel interface" ++msgstr "Utiliser le MTU sur l'interface du tunnel" ++ ++msgid "Use TTL on tunnel interface" ++msgstr "Utiliser le TTL sur l'interface du tunnel" ++ ++msgid "Use as external overlay (/overlay)" ++msgstr "" ++ ++msgid "Use as root filesystem (/)" ++msgstr "" ++ ++msgid "Use broadcast flag" ++msgstr "Utiliser une marque de diffusion" ++ ++msgid "Use builtin IPv6-management" ++msgstr "" ++ ++msgid "Use custom DNS servers" ++msgstr "Utiliser des serveurs DNS spécifiques" ++ ++msgid "Use default gateway" ++msgstr "Utiliser la passerelle par défaut" ++ ++msgid "Use gateway metric" ++msgstr "Utiliser la métrique de la passerelle" ++ ++msgid "Use routing table" ++msgstr "Utiliser la table de routage" ++ ++msgid "" ++"Use the Add Button to add a new lease entry. The MAC-Address indentifies the host, the IPv4-Address specifies to the fixed " ++"address to use and the Hostname is assigned as symbolic name to the " ++"requesting host." ++msgstr "" ++"Utiliser le bouton Ajouter pour créer un nouveau bail. " ++"L'adresse MAC identifie l'hôte, l'adresse IPv4 décrit " ++"l'adresse fixe à utiliser et le nom d'hôte sera le nom symbolique " ++"attribué à l'hôte qui fait la demande." ++ ++msgid "Used" ++msgstr "Utilisé" ++ ++msgid "Used Key Slot" ++msgstr "Clé utilisée" ++ ++msgid "User certificate (PEM encoded)" ++msgstr "" ++ ++msgid "User key (PEM encoded)" ++msgstr "" ++ ++msgid "Username" ++msgstr "Nom d'utilisateur" ++ ++msgid "VC-Mux" ++msgstr "VC-Mux" ++ ++msgid "VLAN Interface" ++msgstr "Interface du VLAN" ++ ++msgid "VLANs on %q" ++msgstr "VLANs sur %q" ++ ++msgid "VLANs on %q (%s)" ++msgstr "VLANs sur %q (%s)" ++ ++msgid "VPN Server" ++msgstr "Serveur VPN" ++ ++msgid "VPN Server port" ++msgstr "" ++ ++msgid "VPN Server's certificate SHA1 hash" ++msgstr "" ++ ++msgid "Vendor Class to send when requesting DHCP" ++msgstr "Classe de fournisseur à envoyer dans les requêtes DHCP" ++ ++msgid "Verbose" ++msgstr "" ++ ++msgid "Verbose logging by aiccu daemon" ++msgstr "" ++ ++msgid "Verify" ++msgstr "Vérifier" ++ ++msgid "Version" ++msgstr "Version" ++ ++msgid "WDS" ++msgstr "WDS" ++ ++msgid "WEP Open System" ++msgstr "Système ouvert WEP" ++ ++msgid "WEP Shared Key" ++msgstr "Clé partagée WEP" ++ ++msgid "WEP passphrase" ++msgstr "Mot de passe WEP" ++ ++msgid "WMM Mode" ++msgstr "Mode WMM" ++ ++msgid "WPA passphrase" ++msgstr "Mot de passe WPA" ++ ++msgid "" ++"WPA-Encryption requires wpa_supplicant (for client mode) or hostapd (for AP " ++"and ad-hoc mode) to be installed." ++msgstr "" ++"Le chiffrage WPA nécessite l'installation du paquet wpa_supplicant (en mode " ++"client) ou hostapd (en mode Point d'accès ou Ad-hoc)." ++ ++msgid "" ++"Wait for NTP sync that many seconds, seting to 0 disables waiting (optional)" ++msgstr "" ++ ++msgid "Waiting for changes to be applied..." ++msgstr "En attente de l'application des changements..." ++ ++msgid "Waiting for command to complete..." ++msgstr "En attente de la fin de la commande..." ++ ++msgid "Warning" ++msgstr "Attention" ++ ++msgid "Warning: There are unsaved changes that will be lost while rebooting!" ++msgstr "" ++"Attention : il reste des changements non appliqués qui seront perdus après " ++"redémarrage !" ++ ++msgid "Whether to create an IPv6 default route over the tunnel" ++msgstr "" ++ ++msgid "Whether to route only packets from delegated prefixes" ++msgstr "" ++ ++msgid "Width" ++msgstr "" ++ ++msgid "Wifi" ++msgstr "Wi-Fi" ++ ++msgid "Wireless" ++msgstr "Sans-fil" ++ ++msgid "Wireless Adapter" ++msgstr "Module Wi-Fi" ++ ++msgid "Wireless Network" ++msgstr "Réseau sans-fil" ++ ++msgid "Wireless Overview" ++msgstr "Présentation des réseaux sans-fil" ++ ++msgid "Wireless Security" ++msgstr "Sécurité des réseaux sans-fil" ++ ++msgid "Wireless is disabled or not associated" ++msgstr "Le Wi-Fi est désactivé ou non associé" ++ ++msgid "Wireless is restarting..." ++msgstr "Le Wi-Fi est ré-initialisé…" ++ ++msgid "Wireless network is disabled" ++msgstr "Le réseau Wi-Fi est désactivé" ++ ++msgid "Wireless network is enabled" ++msgstr "Le réseau Wi-Fi est activé" ++ ++msgid "Wireless restarted" ++msgstr "Wi-Fi ré-initialisé" ++ ++msgid "Wireless shut down" ++msgstr "Wi-Fi arrêté" ++ ++msgid "Write received DNS requests to syslog" ++msgstr "Écrire les requêtes DNS reçues dans syslog" ++ ++msgid "XR Support" ++msgstr "Gestion du mode XR" ++ ++msgid "" ++"You can enable or disable installed init scripts here. Changes will applied " ++"after a device reboot.
    Warning: If you disable essential init " ++"scripts like \"network\", your device might become inaccessible!" ++msgstr "" ++"Vous pouvez ici activer ou désactiver les scripts d'initialisation " ++"installés. Les changements seront pris en compte après un redémarrage.
    Attention: Si vous désactivez des scripts essentiels comme \"réseau" ++"\", votre équipement pourrait ne plus être accessible !" ++ ++msgid "" ++"You must enable Java Script in your browser or LuCI will not work properly." ++msgstr "" ++"Vous devez activer Java Script dans votre navigateur pour que LuCI " ++"fonctionne correctement." ++ ++msgid "" ++"Your Internet Explorer is too old to display this page correctly. Please " ++"upgrade it to at least version 7 or use another browser like Firefox, Opera " ++"or Safari." ++msgstr "" ++ ++msgid "any" ++msgstr "n'importe lequel" ++ ++msgid "auto" ++msgstr "auto" ++ ++#, fuzzy ++msgid "automatic" ++msgstr "statique" ++ ++msgid "baseT" ++msgstr "baseT" ++ ++msgid "bridged" ++msgstr "ponté" ++ ++msgid "create:" ++msgstr "créer:" ++ ++msgid "creates a bridge over specified interface(s)" ++msgstr "créer un bridge entre plusieurs interfaces" ++ ++msgid "dB" ++msgstr "dB" ++ ++msgid "dBm" ++msgstr "dBm" ++ ++msgid "disable" ++msgstr "désactiver" ++ ++msgid "disabled" ++msgstr "" ++ ++msgid "expired" ++msgstr "expiré" ++ ++msgid "" ++"file where given DHCP-leases will be stored" ++msgstr "fichier dans lequel les baux DHCP seront stockés" ++ ++msgid "forward" ++msgstr "transfert" ++ ++msgid "full-duplex" ++msgstr "full-duplex" ++ ++msgid "half-duplex" ++msgstr "half-duplex" ++ ++msgid "help" ++msgstr "aide" ++ ++msgid "hidden" ++msgstr "cacher" ++ ++msgid "hybrid mode" ++msgstr "" ++ ++msgid "if target is a network" ++msgstr "si la destination est un réseau" ++ ++msgid "input" ++msgstr "entrée" ++ ++msgid "kB" ++msgstr "kB" ++ ++msgid "kB/s" ++msgstr "kB/s" ++ ++msgid "kbit/s" ++msgstr "kbit/s" ++ ++msgid "local DNS file" ++msgstr "fichier de résolution local" ++ ++msgid "minimum 1280, maximum 1480" ++msgstr "" ++ ++msgid "navigation Navigation" ++msgstr "" ++ ++msgid "no" ++msgstr "non" ++ ++msgid "no link" ++msgstr "pas de lien" ++ ++msgid "none" ++msgstr "aucun" ++ ++msgid "not present" ++msgstr "" ++ ++msgid "off" ++msgstr "Arrêté" ++ ++msgid "on" ++msgstr "Actif" ++ ++msgid "open" ++msgstr "ouvrir" ++ ++msgid "overlay" ++msgstr "" ++ ++msgid "relay mode" ++msgstr "" ++ ++msgid "routed" ++msgstr "routé" ++ ++msgid "server mode" ++msgstr "" ++ ++msgid "skiplink1 Skip to navigation" ++msgstr "" ++ ++msgid "skiplink2 Skip to content" ++msgstr "" ++ ++msgid "stateful-only" ++msgstr "" ++ ++msgid "stateless" ++msgstr "" ++ ++msgid "stateless + stateful" ++msgstr "" ++ ++msgid "tagged" ++msgstr "marqué" ++ ++msgid "unknown" ++msgstr "inconnu" ++ ++msgid "unlimited" ++msgstr "non limité" ++ ++msgid "unspecified" ++msgstr "non précisé" ++ ++msgid "unspecified -or- create:" ++msgstr "non précisé -ou- créer :" ++ ++msgid "untagged" ++msgstr "non marqué" ++ ++msgid "yes" ++msgstr "oui" ++ ++msgid "« Back" ++msgstr "« Retour" ++ ++#~ msgid "" ++#~ "Always use 40MHz channels even if the secondary channel overlaps. Using " ++#~ "this option does not comply with IEEE 802.11n-2009!" ++#~ msgstr "" ++#~ "Toujours utiliser des canaux de 40MHz même si les canaux secondaires " ++#~ "peuvent chevaucher d'autres réseaux. Activer cette option n'est pas " ++#~ "compatible avec l'amendement IEEE 802.11n-2009 !" ++ ++#~ msgid "Cached" ++#~ msgstr "Mis en cache" ++ ++#~ msgid "Configures this mount as overlay storage for block-extroot" ++#~ msgstr "" ++#~ "Configure ce point de montage comme remplacement externe du système de " ++#~ "fichier racine" ++ ++#~ msgid "Force 40MHz mode" ++#~ msgstr "Forcer le mode 40MHz" ++ ++#~ msgid "Frequency Hopping" ++#~ msgstr "Sauts en fréquence" ++ ++#~ msgid "Locked to channel %d used by %s" ++#~ msgstr "Verrouilé sur le canal %d utilisé par %s" ++ ++#~ msgid "Use as root filesystem" ++#~ msgstr "Utiliser comme racine du système de fichiers" ++ ++#~ msgid "HE.net user ID" ++#~ msgstr "Identifiant HE.net" ++ ++#~ msgid "This is the 32 byte hex encoded user ID, not the login name" ++#~ msgstr "" ++#~ "Il s'agit de l'identifiant de 32 octets codés en hexa, pas du nom de " ++#~ "connexion" ++ ++#~ msgid "40MHz 2nd channel above" ++#~ msgstr "2ème canal 40MHz supérieur" ++ ++#~ msgid "40MHz 2nd channel below" ++#~ msgstr "2ème canal 40MHz inférieur" ++ ++#~ msgid "Accept router advertisements" ++#~ msgstr "Accepter les publications du routeur" ++ ++#~ msgid "Advertise IPv6 on network" ++#~ msgstr "Publier l'adressage IPv6 sur le réseau" ++ ++#~ msgid "Advertised network ID" ++#~ msgstr "ID réseau publiée" ++ ++#~ msgid "Allowed range is 1 to 65535" ++#~ msgstr "La gamme autorisée va de 1 à 65535" ++ ++#~ msgid "HT capabilities" ++#~ msgstr "Capacités HT" ++ ++#~ msgid "HT mode" ++#~ msgstr "Mode HT" ++ ++#~ msgid "Router Model" ++#~ msgstr "Modèle de routeur" ++ ++#~ msgid "Router Name" ++#~ msgstr "Nom du routeur" ++ ++#~ msgid "Send router solicitations" ++#~ msgstr "Envoyer des sollicitations au routeur" ++ ++#~ msgid "Specifies the advertised preferred prefix lifetime in seconds" ++#~ msgstr "Indique la durée de préférence du préfixe publiée, en secondes" ++ ++#~ msgid "Specifies the advertised valid prefix lifetime in seconds" ++#~ msgstr "Indique la durée de validité du préfixe publiée, en secondes" ++ ++#~ msgid "Use preferred lifetime" ++#~ msgstr "Utiliser la durée de préférence" ++ ++#~ msgid "Use valid lifetime" ++#~ msgstr "Utiliser la durée de validité" ++ ++#~ msgid "Waiting for router..." ++#~ msgstr "Attente du routeur…" ++ ++#~ msgid "Enable builtin NTP server" ++#~ msgstr "Activer le serveur NTP intégré" ++ ++#~ msgid "Active Leases" ++#~ msgstr "Baux actifs" ++ ++#~ msgid "Open" ++#~ msgstr "Ouvert" ++ ++#~ msgid "KB" ++#~ msgstr "Ko" ++ ++#~ msgid "Bit Rate" ++#~ msgstr "Débit" ++ ++#~ msgid "Configuration / Apply" ++#~ msgstr "Configuration / Appliquer" ++ ++#~ msgid "Configuration / Changes" ++#~ msgstr "Configuration / Changements" ++ ++#~ msgid "Configuration / Revert" ++#~ msgstr "Configuration / Annuler les changements" ++ ++#~ msgid "MAC" ++#~ msgstr "MAC" ++ ++#~ msgid "MAC Address" ++#~ msgstr "Adresse MAC" ++ ++#~ msgid "Encr." ++#~ msgstr "Chiffré" ++ ++#~ msgid "WLAN-Scan" ++#~ msgstr "Recherche WLAN" ++ ++#~ msgid "" ++#~ "Choose the network you want to attach to this wireless interface. Select " ++#~ "unspecified to not attach any network or fill out the " ++#~ "create field to define a new network." ++#~ msgstr "" ++#~ "Choisissez le réseau auquel vous voulez affecter cette interface sans-" ++#~ "fil. Sélectionnez non précisé pour ne pas l'affecter à un réseau " ++#~ "ou remplissez le champ créer pour définir un nouveau réseau." ++ ++#~ msgid "Create Network" ++#~ msgstr "Créer un réseau" ++ ++#~ msgid "Link" ++#~ msgstr "Lien" ++ ++#~ msgid "Networks" ++#~ msgstr "Réseaux" ++ ++#~ msgid "Power" ++#~ msgstr "Puissance" ++ ++#~ msgid "Wifi networks in your local environment" ++#~ msgstr "Réseaux Wi-Fi dans votre environnement" ++ ++#~ msgid "" ++#~ "CIDR-Notation: " ++#~ "address/prefix" ++#~ msgstr "" ++#~ "Adresse/préfixe en notation CIDR" ++ ++#~ msgid "DNS-Server" ++#~ msgstr "Serveur DNS" ++ ++#~ msgid "IPv4-Broadcast" ++#~ msgstr "Diffusion IPv4" ++ ++#~ msgid "IPv6-Address" ++#~ msgstr "Adresse IPv6" ++ ++#~ msgid "IP-Aliases" ++#~ msgstr "Alias IP" ++ ++#~ msgid "IPv6 Setup" ++#~ msgstr "Configuration IPv6" ++ ++#~ msgid "" ++#~ "Note: If you choose an interface here which is part of another network, " ++#~ "it will be moved into this network." ++#~ msgstr "" ++#~ "Note : si vous choisissez ici une interface faisant partie d'un autre " ++#~ "réseau, il sera déplacé dans ce réseau." ++ ++#~ msgid "" ++#~ "Really delete this interface? The deletion cannot be undone!\\nYou might " ++#~ "lose access to this router if you are connected via this interface." ++#~ msgstr "" ++#~ "Vraiment supprimer cet interface ? L'effacement ne peut être annulé !" ++#~ "\\nVous pourriez perdre l'accès à ce routeur si vous y êtes connecté par " ++#~ "cette interface." ++ ++#~ msgid "" ++#~ "Really delete this wireless network? The deletion cannot be undone!\\nYou " ++#~ "might lose access to this router if you are connected via this network." ++#~ msgstr "" ++#~ "Vraiment supprimer ce réseau sans-fil ? effacement ne peut être annulé !" ++#~ "\\nVous pourriez perdre l'accès à ce routeur si vous y êtes connecté par " ++#~ "ce réseau." ++ ++#~ msgid "" ++#~ "Really shutdown interface \"%s\" ?\\nYou might lose access to this router " ++#~ "if you are connected via this interface." ++#~ msgstr "" ++#~ "Vraiment arrêter cet interface « %s » ?\\nVous pourriez perdre l'accès à " ++#~ "ce routeur si vous y êtes connecté par cette interface." ++ ++#~ msgid "" ++#~ "Really shutdown network ?\\nYou might lose access to this router if you " ++#~ "are connected via this interface." ++#~ msgstr "" ++#~ "Vraiment arrêter ce réseau ?\\nVous pourriez perdre l'accès à ce routeur " ++#~ "si vous y êtes connecté par ce réseau." ++ ++#~ msgid "" ++#~ "The network ports on your router can be combined to several VLANs in which computers can " ++#~ "communicate directly with each other. VLANs are often used to separate different network " ++#~ "segments. Often there is by default one Uplink port for a connection to " ++#~ "the next greater network like the internet and other ports for a local " ++#~ "network." ++#~ msgstr "" ++#~ "Les ports de votre routeur peuvent être configurés pour combiner " ++#~ "plusieurs VLANs dans lesquels les machines connectées peuvent dialoguer " ++#~ "directement l'une avec l'autre. Les VLANs sont souvent utilisés pour " ++#~ "séparer différences sous-réseaux. Bien souvent il y a un port d'uplink " ++#~ "pour une connexion vers un réseau plus vaste, comme internet et les " ++#~ "autres ports sont réservés au réseau local." ++ ++#~ msgid "Enable buffering" ++#~ msgstr "Activer l'utilisation de tampons" ++ ++#~ msgid "IPv6-over-IPv4" ++#~ msgstr "IPv6 par dessus IPv4" ++ ++#~ msgid "Custom Files" ++#~ msgstr "Fichiers spécifiques" ++ ++#~ msgid "Custom files" ++#~ msgstr "Fichiers spécifiques" ++ ++#~ msgid "Detected Files" ++#~ msgstr "Fichiers détectés" ++ ++#~ msgid "Detected files" ++#~ msgstr "Fichiers détectés" ++ ++#~ msgid "Files to be kept when flashing a new firmware" ++#~ msgstr "Fichiers à conserver lors d'une mise à jour du micrologiciel" ++ ++#~ msgid "General" ++#~ msgstr "Général" ++ ++#~ msgid "" ++#~ "Here you can customize the settings and the functionality of LuCI." ++#~ msgstr "" ++#~ "Ici, vous pouvez personnaliser les réglages et les fonctionnalités de " ++#~ "LuCI." ++ ++#~ msgid "Post-commit actions" ++#~ msgstr "Actions post-changements" ++ ++#~ msgid "" ++#~ "The following files are detected by the system and will be kept " ++#~ "automatically during sysupgrade" ++#~ msgstr "" ++#~ "Les fichiers suivants ont été détectés par le système et seront " ++#~ "automatiquement préservés pendant la mise à jour" ++ ++#~ msgid "" ++#~ "These commands will be executed automatically when a given UCI configuration is committed " ++#~ "allowing changes to be applied instantly." ++#~ msgstr "" ++#~ "Ces commandes seront executées automatiquement lorsqu'une configuration " ++#~ "UCI est appliquée, les changement prenant effet immédiatement." ++ ++#~ msgid "" ++#~ "This is a list of shell glob patterns for matching files and directories " ++#~ "to include during sysupgrade" ++#~ msgstr "" ++#~ "Voici une liste de motifs de sélection shell pour sélectionner les " ++#~ "fichiers et répertoires à inclure durant une mise à jour" ++ ++#~ msgid "Web UI" ++#~ msgstr "IU Web" ++ ++#~ msgid "PPTP-Server" ++#~ msgstr "" ++#~ "Serveur PPTP" ++ ++#~ msgid "AHCP Settings" ++#~ msgstr "Paramètres AHCP" ++ ++#~ msgid "ARP ping retries" ++#~ msgstr "Essais de ping ARP" ++ ++#~ msgid "ATM Settings" ++#~ msgstr "Paramètres ATM" ++ ++#~ msgid "Accept Router Advertisements" ++#~ msgstr "Accepter les publications du routeur" ++ ++#~ msgid "Access point (APN)" ++#~ msgstr "Point d'accès (APN)" ++ ++#~ msgid "Additional pppd options" ++#~ msgstr "Options pppd supplémentaires" ++ ++#~ msgid "Allowed range is 1 to FFFF" ++#~ msgstr "Plage autorisée de 1 à FFFF" ++ ++#~ msgid "Automatic Disconnect" ++#~ msgstr "Déconnexion automatique" ++ ++#~ msgid "Backup Archive" ++#~ msgstr "Archive à restaurer" ++ ++#~ msgid "" ++#~ "Configure the local DNS server to use the name servers adverticed by the " ++#~ "PPP peer" ++#~ msgstr "" ++#~ "Configurer le serveur DNS local pour utiliser le serveur de nom fourni " ++#~ "par le pair PPP" ++ ++#~ msgid "Connect script" ++#~ msgstr "Script de Connexion" ++ ++#~ msgid "Create backup" ++#~ msgstr "Créer une archive de sauvegarde" ++ ++#~ msgid "Default" ++#~ msgstr "Défaut" ++ ++#~ msgid "Disconnect script" ++#~ msgstr "Script de Déconnexion" ++ ++#~ msgid "Edit package lists and installation targets" ++#~ msgstr "Editer la liste des paquets et le répertoire de destination" ++ ++#~ msgid "Enable 4K VLANs" ++#~ msgstr "Activer les VLANs 4K" ++ ++#~ msgid "Enable IPv6 on PPP link" ++#~ msgstr "Activer l'IPv6 sur le lien PPP" ++ ++#~ msgid "Firmware image" ++#~ msgstr "Firmware image" ++ ++#~ msgid "Forward DHCP" ++#~ msgstr "Transmission du DHCP" ++ ++#~ msgid "Forward broadcasts" ++#~ msgstr "Transmission des diffusions" ++ ++#~ msgid "HE.net Tunnel ID" ++#~ msgstr "Identifiant du tunnel HE.net" ++ ++#~ msgid "" ++#~ "Here you can backup and restore your router configuration and - if " ++#~ "possible - reset the router to the default settings." ++#~ msgstr "" ++#~ "Ici, vous pouvez sauvegarder et restaurer la configuration de votre " ++#~ "routeur et, si possible, restaurer la configuration par défaut du routeur." ++ ++#~ msgid "Installation targets" ++#~ msgstr "Répertoires de destination" ++ ++#~ msgid "Keep configuration files" ++#~ msgstr "Keep configuration files" ++ ++#~ msgid "Keep-Alive" ++#~ msgstr "Maintenir la connexion" ++ ++#~ msgid "Kernel" ++#~ msgstr "Noyau" ++ ++#~ msgid "" ++#~ "Let pppd replace the current default route to use the PPP interface after " ++#~ "successful connect" ++#~ msgstr "" ++#~ "Laisser pppd remplacer la route par défaut courante pour utiliser " ++#~ "l'interface PPP après l'établissement de la connexion" ++ ++#~ msgid "Let pppd run this script after establishing the PPP link" ++#~ msgstr "pppd exécutera ce script après l'établissement du lien PPP" ++ ++#~ msgid "Let pppd run this script before tearing down the PPP link" ++#~ msgstr "pppd exécutera ce script avant de déconnecter le lien PPP" ++ ++#~ msgid "" ++#~ "Make sure that you provide the correct pin code here or you might lock " ++#~ "your sim card!" ++#~ msgstr "" ++#~ "Assurez-vous de fournir le bon code PIN ou vous pourriez bloquer votre " ++#~ "carte SIM !" ++ ++#~ msgid "" ++#~ "Most of them are network servers, that offer a certain service for your " ++#~ "device or network like shell access, serving webpages like LuCI, doing mesh routing, sending " ++#~ "e-mails, ..." ++#~ msgstr "" ++#~ "La plupart d'entre eux sont des serveurs réseaux, qui vous offrent " ++#~ "certains services comme un accès shell, accéder à des pages comme LuCI, " ++#~ "faire du routage mesh, envoyer des e-mails ..." ++ ++#~ msgid "Number of failed connection tests to initiate automatic reconnect" ++#~ msgstr "Reconnexion si la connexion est perdue" ++ ++#~ msgid "Override Gateway" ++#~ msgstr "Remplacer la passerelle" ++ ++#~ msgid "PIN code" ++#~ msgstr "code PIN" ++ ++#~ msgid "PPP Settings" ++#~ msgstr "Paramètres PPP" ++ ++#~ msgid "Package lists" ++#~ msgstr "Listes de paquets" ++ ++#~ msgid "" ++#~ "Port PVIDs specify the default " ++#~ "VLAN ID added to received untagged frames." ++#~ msgstr "" ++#~ "Le numéro de port PVIDs indique " ++#~ "l'identifiant VLAN attribué aux trames non marquées" ++ ++#~ msgid "Port PVIDs on %q" ++#~ msgstr "Port PVIDs sur %q" ++ ++#~ msgid "Proceed reverting all settings and resetting to firmware defaults?" ++#~ msgstr "" ++#~ "Etes-vous sûr de vouloir revenir à la configuration par défaut du " ++#~ "firmware ?" ++ ++#~ msgid "Processor" ++#~ msgstr "Processeur" ++ ++#~ msgid "Radius-Port" ++#~ msgstr "Port Radius" ++ ++#~ msgid "Radius-Server" ++#~ msgstr "Serveur Radius" ++ ++#~ msgid "Relay Settings" ++#~ msgstr "Paramètres du relais" ++ ++#~ msgid "Replace default route" ++#~ msgstr "Remplacer la route par défaut" ++ ++#~ msgid "Reset router to defaults" ++#~ msgstr "Revenir à la configuration par défaut du routeur" ++ ++#~ msgid "Routing table ID" ++#~ msgstr "ID de la table de routage" ++ ++#~ msgid "" ++#~ "Seconds to wait for the modem to become ready before attempting to connect" ++#~ msgstr "" ++#~ "Secondes à attendre pour que le modem soit prêt avant d'essayer de se " ++#~ "connecter" ++ ++#~ msgid "Send Router Solicitiations" ++#~ msgstr "Envoyer des sollicitations de routeur" ++ ++#~ msgid "Server IPv4-Address" ++#~ msgstr "Adresse IPv4 du serveur" ++ ++#~ msgid "Service type" ++#~ msgstr "Type de service" ++ ++#~ msgid "Services and daemons perform certain tasks on your device." ++#~ msgstr "" ++#~ "Les services et démons accomplissent certaines tâches sur votre " ++#~ "équipement." ++ ++#~ msgid "Settings" ++#~ msgstr "Réglages" ++ ++#~ msgid "Setup wait time" ++#~ msgstr "Délai d'initialisation" ++ ++#~ msgid "" ++#~ "Sorry. OpenWrt does not support a system upgrade on this platform.
    " ++#~ "You need to manually flash your device." ++#~ msgstr "" ++#~ "Sorry. OpenWrt does not support a system upgrade on this platform.
    " ++#~ "You need to manually flash your device." ++ ++#~ msgid "Specify additional command line arguments for pppd here" ++#~ msgstr "" ++#~ "Spécifiez ici des arguments de ligne de commande supplémentaire pour pppd" ++ ++#~ msgid "TTL" ++#~ msgstr "TTL" ++ ++#~ msgid "The device node of your modem, e.g. /dev/ttyUSB0" ++#~ msgstr "Le noeud d'interface de votre modem, e.g. /dev/ttyUSB0" ++ ++#~ msgid "Time (in seconds) after which an unused connection will be closed" ++#~ msgstr "Délai d'inactivité à partir duquel la connexion est coupée" ++ ++#~ msgid "Time Server (rdate)" ++#~ msgstr "Serveur de temps (rdate)" ++ ++#~ msgid "Tunnel Settings" ++#~ msgstr "Configurion du tunnel" ++ ++#~ msgid "Update package lists" ++#~ msgstr "Mettre à jour la liste des paquets" ++ ++#~ msgid "Upload an OpenWrt image file to reflash the device." ++#~ msgstr "Upload an OpenWrt image file to reflash the device." ++ ++#~ msgid "Upload image" ++#~ msgstr "Upload image" ++ ++#~ msgid "Use peer DNS" ++#~ msgstr "Utiliser le DNS fourni" ++ ++#~ msgid "VLAN %d" ++#~ msgstr "VLAN %d" ++ ++#~ msgid "" ++#~ "You can specify multiple DNS servers here, press enter to add a new " ++#~ "entry. Servers entered here will override automatically assigned ones." ++#~ msgstr "" ++#~ "Vous pouvez indiquer plusieurs serveurs DNS ici, tapez Entrée pour " ++#~ "ajouter un nouvel élément. Les serveurs ajoutés ici remplaceront ceux " ++#~ "attribués automatiquement." ++ ++#~ msgid "" ++#~ "You need to install \"comgt\" for UMTS/GPRS, \"ppp-mod-pppoe\" for PPPoE, " ++#~ "\"ppp-mod-pppoa\" for PPPoA or \"pptp\" for PPtP support" ++#~ msgstr "" ++#~ "Vous avez besoin d'installer \"comgt\" pour le support UMTS/GPRS, \"ppp-" ++#~ "mod-pppoe\" pour le PPPoE, \"ppp-mod-pppoa\" pour le PPPoA ou \"pptp\" " ++#~ "pour le PPtP" ++ ++#~ msgid "back" ++#~ msgstr "retour" ++ ++#~ msgid "buffered" ++#~ msgstr "bufferisé" ++ ++#~ msgid "cached" ++#~ msgstr "mis en cache" ++ ++#~ msgid "free" ++#~ msgstr "libre" ++ ++#~ msgid "static" ++#~ msgstr "statique" ++ ++#~ msgid "" ++#~ "LuCI is a collection " ++#~ "of free Lua software including an MVC-Webframework and webinterface for embedded devices. LuCI is licensed under the " ++#~ "Apache-License." ++#~ msgstr "" ++#~ "LuCI est une suite " ++#~ "logicielle d'applications Lua incluant un MVC-Webframework et une interface web pour " ++#~ "équipements embarqués. LuCI est sous license Apache." ++ ++#~ msgid "SSH-Keys" ++#~ msgstr "Clés SSH" ++ ++#~ msgid "" ++#~ "A lightweight HTTP/1.1 webserver written in C and Lua designed to serve " ++#~ "LuCI" ++#~ msgstr "Un serveur web HTTP/1.1 léger écrit en C et en Lua, créé pour LuCI" ++ ++#~ msgid "" ++#~ "A small webserver which can be used to serve LuCI." ++#~ msgstr "Un serveur web léger qui peut être utilisé pour LuCI." ++ ++#~ msgid "About" ++#~ msgstr "A propos" ++ ++#~ msgid "Active IP Connections" ++#~ msgstr "Connexions IP actives" ++ ++#~ msgid "Addresses" ++#~ msgstr "Adresses" ++ ++#~ msgid "Admin Password" ++#~ msgstr "Mot de passe administrateur" ++ ++#~ msgid "Alias" ++#~ msgstr "Alias" ++ ++#~ msgid "Authentication Realm" ++#~ msgstr "Domaine d'authentification" ++ ++#~ msgid "Bridge Port" ++#~ msgstr "Port du pont" ++ ++#~ msgid "" ++#~ "Change the password of the system administrator (User root)" ++#~ msgstr "Changer le mot de passe du système (Utilisateur \"root\")" ++ ++#~ msgid "Client + WDS" ++#~ msgstr "Client + WDS" ++ ++#~ msgid "Configuration file" ++#~ msgstr "Fichier de configuration" ++ ++#~ msgid "Connection timeout" ++#~ msgstr "Délai de connexion" ++ ++#~ msgid "Contributing Developers" ++#~ msgstr "Contributeurs" ++ ++#~ msgid "DHCP assigned" ++#~ msgstr "DHCP désigné" ++ ++#~ msgid "Document root" ++#~ msgstr "Page racine" ++ ++#~ msgid "Enable Keep-Alive" ++#~ msgstr "Activer le maintien (Keep-Alive)" ++ ++#~ msgid "Enable device" ++#~ msgstr "Activer ce périphérique" ++ ++#~ msgid "Ethernet Bridge" ++#~ msgstr "Pont Ethernet" ++ ++#~ msgid "" ++#~ "Here you can paste public SSH-Keys " ++#~ "(one per line) for SSH public-key " ++#~ "authentication." ++#~ msgstr "" ++#~ "Vous pouvez copier ici des clés SSH publiques (une par ligne) pour une " ++#~ "authentification SSH sur clés publiques." ++ ++#~ msgid "ID" ++#~ msgstr "ID" ++ ++#~ msgid "IP Configuration" ++#~ msgstr "Configuration IP" ++ ++#~ msgid "Interface Status" ++#~ msgstr "État de l'interface" ++ ++#~ msgid "Lead Development" ++#~ msgstr "Développeurs principaux" ++ ++#~ msgid "Master" ++#~ msgstr "Point d'accès" ++ ++#~ msgid "Master + WDS" ++#~ msgstr "Point d'accès + WDS" ++ ++#~ msgid "No address configured on this interface." ++#~ msgstr "Cette interface n'a Aucune adresse configurée." ++ ++#~ msgid "Not configured" ++#~ msgstr "Pas configuré" ++ ++#~ msgid "Password successfully changed" ++#~ msgstr "Mot de passe changé avec succès" ++ ++#~ msgid "Plugin path" ++#~ msgstr "Chemin du greffon" ++ ++#~ msgid "Ports" ++#~ msgstr "Ports" ++ ++#~ msgid "Primary" ++#~ msgstr "Primaire" ++ ++#~ msgid "Project Homepage" ++#~ msgstr "Page d'accueil du projet" ++ ++#~ msgid "Pseudo Ad-Hoc" ++#~ msgstr "Pseudo Ad-Hoc" ++ ++#~ msgid "STP" ++#~ msgstr "STP" ++ ++#~ msgid "Thanks To" ++#~ msgstr "Merci à" ++ ++#~ msgid "" ++#~ "The realm which will be displayed at the authentication prompt for " ++#~ "protected pages." ++#~ msgstr "Le domaine qui sera affiché lors de la fenêtre d'authentification." ++ ++#~ msgid "Unknown Error" ++#~ msgstr "Erreur inconnue" ++ ++#~ msgid "VLAN" ++#~ msgstr "VLAN" ++ ++#~ msgid "defaults to /etc/httpd.conf" ++#~ msgstr "fichier de configuration par défaut : /etc/httpd.conf" ++ ++#~ msgid "Enable this switch" ++#~ msgstr "Activer ce switch" ++ ++#~ msgid "OPKG error code %i" ++#~ msgstr "Code d'erreur OPKG %i" ++ ++#~ msgid "Package lists updated" ++#~ msgstr "Liste des paquets mise à jour" ++ ++#~ msgid "Reset switch during setup" ++#~ msgstr "Ré-initialiser le switch pendant la configuration" ++ ++#~ msgid "Upgrade installed packages" ++#~ msgstr "Mettre à jour les paquets installés" ++ ++#~ msgid "" ++#~ "Also kernel or service logfiles can be viewed here to get an overview " ++#~ "over their current state." ++#~ msgstr "" ++#~ "Les journaux des services ou du noyau peuvent être vus ici afin d'obtenir " ++#~ "un aperçu de leur état." ++ ++#~ msgid "" ++#~ "Here you can find information about the current system status like CPU clock frequency, memory " ++#~ "usage or network interface data." ++#~ msgstr "" ++#~ "Ici, vous trouverez des informations sur l'état actuel du système comme " ++#~ "la fréquence processeur, utilisation mémoire et trafic réseau." ++ ++#~ msgid "Search file..." ++#~ msgstr "Chercher un fichier..." ++ ++#~ msgid "" ++#~ "LuCI is a free, " ++#~ "flexible, and user friendly graphical interface for configuring OpenWrt " ++#~ "Kamikaze." ++#~ msgstr "" ++#~ "LuCI est une interface " ++#~ "graphique libre, flexible, et orientée utilisateur pour configurer " ++#~ "OpenWrt Kamikaze." ++ ++#~ msgid "And now have fun with your router!" ++#~ msgstr "Et maintenant que la fête commence !" ++ ++#~ msgid "" ++#~ "As we always want to improve this interface we are looking forward to " ++#~ "your feedback and suggestions." ++#~ msgstr "" ++#~ "Nous souhaitons améliorer l'interface de manière permanente, vos retours " ++#~ "et suggestions sont primordiaux." ++ ++#~ msgid "Hello!" ++#~ msgstr "Bonjour !" ++ ++#~ msgid "" ++#~ "Notice: In LuCI " ++#~ "changes have to be confirmed by clicking Changes - Save & Apply " ++#~ "before being applied." ++#~ msgstr "" ++#~ "Vous trouverez une page de navigation sur le côté gauche permettant " ++#~ "d'accèder aux différentes pages de configuration." ++ ++#~ msgid "" ++#~ "On the following pages you can adjust all important settings of your " ++#~ "router." ++#~ msgstr "" ++#~ "Dans les pages suivantes vous pouvez ajuster tous les réglages importants " ++#~ "de votre routeur." ++ ++#~ msgid "The LuCI Team" ++#~ msgstr "L'équipe LuCI" ++ ++#~ msgid "" ++#~ "This is the administration area of LuCI." ++#~ msgstr "Voici la page d'administration de LuCI." ++ ++#~ msgid "User Interface" ++#~ msgstr "Interface utilisateur" ++ ++#~ msgid "enable" ++#~ msgstr "activer" ++ ++#~ msgid "(hidden)" ++#~ msgstr "(caché)" ++ ++#~ msgid "(optional)" ++#~ msgstr "(optionnel)" ++ ++#~ msgid "DNS-Port" ++#~ msgstr "Port DNS" ++ ++#~ msgid "" ++#~ "DNS-Server will be queried in " ++#~ "the order of the resolvfile" ++#~ msgstr "" ++#~ "Les serveurs DNS du fichier de " ++#~ "résolution seront interrogés dans l'ordre" ++ ++#~ msgid "" ++#~ "max. DHCP-Leases" ++#~ msgstr "" ++#~ "Nombre max. d'attributions DHCP" ++ ++#~ msgid "" ++#~ "max. EDNS0 packet size" ++#~ msgstr "taille maximum du paquet. EDNS.0 " ++ ++#~ msgid "AP-Isolation" ++#~ msgstr "Isolation AP" ++ ++#~ msgid "Add the Wifi network to physical network" ++#~ msgstr "Ajouter ce réseau Wi-Fi au réseau physique" ++ ++#~ msgid "Aliases" ++#~ msgstr "Alias" ++ ++#~ msgid "Clamp Segment Size" ++#~ msgstr "Clamp Segment Size" ++ ++#, fuzzy ++#~ msgid "Create Or Attach Network" ++#~ msgstr "Créer un réseau" ++ ++#~ msgid "Devices" ++#~ msgstr "Equipements" ++ ++#~ msgid "Don't forward reverse lookups for local networks" ++#~ msgstr "" ++#~ "Ne pas transmettre les requêtes de recherche inverse pour les réseaux " ++#~ "locaux" ++ ++#~ msgid "Enable TFTP-Server" ++#~ msgstr "Activer le serveur TFTP" ++ ++#~ msgid "Errors" ++#~ msgstr "Erreurs" ++ ++#~ msgid "Essentials" ++#~ msgstr "Essentiel" ++ ++#~ msgid "Expand Hosts" ++#~ msgstr "Etendre le nom d'hôte" ++ ++#~ msgid "First leased address" ++#~ msgstr "Première adresse attribuée" ++ ++#~ msgid "" ++#~ "Fixes problems with unreachable websites, submitting forms or other " ++#~ "unexpected behaviour for some ISPs." ++#~ msgstr "" ++#~ "Fixes problems with unreachable websites, submitting forms or other " ++#~ "unexpected behaviour for some ISPs." ++ ++#~ msgid "Hardware Address" ++#~ msgstr "Addresse matériel" ++ ++#~ msgid "Here you can configure installed wifi devices." ++#~ msgstr "Ici vous pouvez configurer les équipements Wi-Fi installés." ++ ++#~ msgid "Ignore /etc/hosts" ++#~ msgstr "Ignorer /etc/hosts" ++ ++#~ msgid "Independent (Ad-Hoc)" ++#~ msgstr "Ad-Hoc" ++ ++#~ msgid "Internet Connection" ++#~ msgstr "Connexion Internet" ++ ++#~ msgid "Join (Client)" ++#~ msgstr "Client" ++ ++#~ msgid "Leases" ++#~ msgstr "Baux" ++ ++#~ msgid "Local Domain" ++#~ msgstr "Domaine local" ++ ++#~ msgid "Local Network" ++#~ msgstr "Réseau Local" ++ ++#~ msgid "Local Server" ++#~ msgstr "Serveur local" ++ ++#~ msgid "Network Boot Image" ++#~ msgstr "Image de démarrage réseau" ++ ++#~ msgid "" ++#~ "Network Name (ESSID)" ++#~ msgstr "Nom du réseau (ESSID)" ++ ++#~ msgid "Number of leased addresses" ++#~ msgstr "Nombre d'adresses attribuées" ++ ++#~ msgid "Perform Actions" ++#~ msgstr "Accomplir les actions" ++ ++#~ msgid "Prevents Client to Client communication" ++#~ msgstr "Empêche la communication directe Client à Client" ++ ++#~ msgid "Provide (Access Point)" ++#~ msgstr "Point d'accès" ++ ++#~ msgid "Resolvfile" ++#~ msgstr "Fichier de résolution" ++ ++#~ msgid "TFTP-Server Root" ++#~ msgstr "Racine du serveur TFTP" ++ ++#~ msgid "TX / RX" ++#~ msgstr "TX / RX" ++ ++#~ msgid "The following changes have been applied" ++#~ msgstr "Les changements suivants ont été appliqués" ++ ++#~ msgid "" ++#~ "When flashing a new firmware with LuCI these files will be added to the new firmware " ++#~ "installation." ++#~ msgstr "" ++#~ "Lors d'une nouvelle installation, ces fichiers seront ajoutés à la " ++#~ "nouvelle installation." ++ ++#~ msgid "" ++#~ "With DHCP " ++#~ "network members can automatically receive their network settings (IP-address, netmask, DNS-server, ...)." ++#~ msgstr "" ++#~ "Avec DHCP, les machines connectées au réseau peuvent recevoir leurs " ++#~ "réglages réseau directement (adresse IP, masque de réseau, serveur " ++#~ "DNS, ...)" ++ ++#~ msgid "" ++#~ "You can run several wifi networks with one device. Be aware that there " ++#~ "are certain hardware and driverspecific restrictions. Normally you can " ++#~ "operate 1 Ad-Hoc or up to 3 Master-Mode and 1 Client-Mode network " ++#~ "simultaneously." ++#~ msgstr "" ++#~ "Vous pouvez faire fonctionner plusieurs réseaux Wi-Fi sur un seul " ++#~ "équipement. Il existe des limitations matérielles et liées au pilote. En " ++#~ "général vous pouvez faire fonctionner simultanément 1 réseau Ad-Hoc et 3 " ++#~ "points d'accès simultanément." ++ ++#~ msgid "" ++#~ "You need to install \"ppp-mod-pppoe\" for PPPoE or \"pptp\" for PPtP " ++#~ "support" ++#~ msgstr "" ++#~ "Vous avez besoin d'installer \"ppp-mod-pppoe\" pour le support PPPoE ou " ++#~ "\"pptp\" pour le PPtP" ++ ++#~ msgid "Zone" ++#~ msgstr "Zone" ++ ++#~ msgid "additional hostfile" ++#~ msgstr "fichiers de noms d'hôtes supplémentaires" ++ ++#~ msgid "adds domain names to hostentries in the resolv file" ++#~ msgstr "concatène le nom de domaine aux noms d'hôtes" ++ ++#~ msgid "automatically reconnect" ++#~ msgstr "reconnecter automatiquement" ++ ++#~ msgid "concurrent queries" ++#~ msgstr "Requêtes concurrentes maximum" ++ ++#~ msgid "" ++#~ "disable DHCP " ++#~ "for this interface" ++#~ msgstr "désactiver DHCP sur cette interface" ++ ++#~ msgid "disconnect when idle for" ++#~ msgstr "déconnecter après une inactivité de" ++ ++#~ msgid "don't cache unknown" ++#~ msgstr "Ne pas mettre en cache les requêtes négatives" ++ ++#~ msgid "" ++#~ "filter useless DNS-queries of " ++#~ "Windows-systems" ++#~ msgstr "filtre les requêtes inutiles émises par les systèmes Windows" ++ ++#~ msgid "installed" ++#~ msgstr "installé" ++ ++#~ msgid "localises the hostname depending on its subnet" ++#~ msgstr "localiser la réponse suivant l'émetteur de la requête" ++ ++#~ msgid "not installed" ++#~ msgstr "pas installé" ++ ++#~ msgid "" ++#~ "prevents caching of negative DNS-replies" ++#~ msgstr "empêche la mise en cache de requêtes DNS erronnées" ++ ++#~ msgid "query port" ++#~ msgstr "port de requête" ++ ++#~ msgid "transmitted / received" ++#~ msgstr "transmis / reçu" ++ ++#, fuzzy ++#~ msgid "Join network" ++#~ msgstr "réseaux compris" ++ ++#~ msgid "all" ++#~ msgstr "tous" ++ ++#~ msgid "Code" ++#~ msgstr "Code" ++ ++#~ msgid "Distance" ++#~ msgstr "Distance" ++ ++#~ msgid "Legend" ++#~ msgstr "Légende" ++ ++#~ msgid "Library" ++#~ msgstr "Bibliothèque" ++ ++#~ msgid "see '%s' manpage" ++#~ msgstr "voir la page de man de '%s'" ++ ++#~ msgid "Package Manager" ++#~ msgstr "Gestionnaire de paquets" ++ ++#~ msgid "Service" ++#~ msgstr "Service" ++ ++#~ msgid "Statistics" ++#~ msgstr "Statistiques" ++ ++#~ msgid "zone" ++#~ msgstr "Zone" +diff --git a/feeds/luci/modules/luci-base/po/he/base.po b/feeds/luci/modules/luci-base/po/he/base.po +new file mode 100644 +index 0000000..237e868 +--- /dev/null ++++ b/feeds/luci/modules/luci-base/po/he/base.po +@@ -0,0 +1,3121 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"PO-Revision-Date: 2013-02-02 14:32+0200\n" ++"Last-Translator: oranav \n" ++"Language-Team: none\n" ++"Language: he\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n != 1);\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "(%d minute window, %d second interval)" ++msgstr "" ++ ++msgid "(%s available)" ++msgstr "(%s פנוי)" ++ ++msgid "(empty)" ++msgstr "(ריק)" ++ ++msgid "(no interfaces attached)" ++msgstr "(×ין ממשק מצורף)" ++ ++msgid "-- Additional Field --" ++msgstr "-- שדה נוסף --" ++ ++msgid "-- Please choose --" ++msgstr "-- × × ×œ×‘×—×•×¨ --" ++ ++msgid "-- custom --" ++msgstr "-- מות×× ×ישית --" ++ ++msgid "-- match by device --" ++msgstr "" ++ ++msgid "-- match by label --" ++msgstr "" ++ ++msgid "1 Minute Load:" ++msgstr "עומס במשך דקה:" ++ ++msgid "15 Minute Load:" ++msgstr "עומס במשך רבע שעה:" ++ ++msgid "5 Minute Load:" ++msgstr "עומס במשך 5 דקות:" ++ ++msgid "BSSID" ++msgstr "" ++ ++msgid "DNS query port" ++msgstr "DNS יצי×ת ש×ילת×" ++ ++msgid "DNS server port" ++msgstr "DNS יצי×ת שרת" ++ ++msgid "" ++"DNS servers will be queried in the " ++"order of the resolvfile" ++msgstr "" ++ ++msgid "ESSID" ++msgstr "" ++ ++msgid "IPv4-Address" ++msgstr "כתובות IPv4" ++ ++msgid "IPv4-Gateway" ++msgstr "" ++ ++msgid "IPv4-Netmask" ++msgstr "" ++ ++msgid "" ++"IPv6-Address or Network " ++"(CIDR)" ++msgstr "" ++"כתובת ×ו רשת (CIDR) IPv6" ++ ++msgid "IPv6-Gateway" ++msgstr "" ++ ++msgid "IPv6-Suffix (hex)" ++msgstr "" ++ ++msgid "LED Configuration" ++msgstr "הגדרות LED" ++ ++msgid "LED Name" ++msgstr "×©× LED" ++ ++msgid "MAC-Address" ++msgstr "כתובת-MAC" ++ ++msgid "" ++"Max. DHCP leases" ++msgstr "" ++ ++msgid "" ++"Max. EDNS0 packet size" ++msgstr "" ++ ++msgid "Max. concurrent queries" ++msgstr "" ++ ++msgid "%s - %s" ++msgstr "" ++ ++msgid "ADSL" ++msgstr "" ++ ++msgid "ADSL Status" ++msgstr "" ++ ++msgid "AICCU (SIXXS)" ++msgstr "" ++ ++msgid "APN" ++msgstr "" ++ ++msgid "AR Support" ++msgstr "תמיכת AR" ++ ++#, fuzzy ++msgid "ARP retry threshold" ++msgstr "סף נסיונות של ARP" ++ ++#, fuzzy ++msgid "ATM Bridges" ++msgstr "גשרי ATM" ++ ++#, fuzzy ++msgid "ATM Virtual Channel Identifier (VCI)" ++msgstr "מזהה ×¢×¨×•×¦×™× ×•×•×™×¨×˜×•××œ×™×™× ×©×œ ATM" ++ ++#, fuzzy ++msgid "ATM Virtual Path Identifier (VPI)" ++msgstr "מזהה × ×ª×™×‘×™× ×•×•×™×¨×˜×•××œ×™×™× ×©×œ ATM (VPI)" ++ ++msgid "" ++"ATM bridges expose encapsulated ethernet in AAL5 connections as virtual " ++"Linux network interfaces which can be used in conjunction with DHCP or PPP " ++"to dial into the provider network." ++msgstr "" ++ ++msgid "ATM device number" ++msgstr "מס' התקן של ATM" ++ ++msgid "AYIYA" ++msgstr "" ++ ++#, fuzzy ++msgid "Access Concentrator" ++msgstr "מרכז גישות" ++ ++msgid "Access Point" ++msgstr "נקודת גישה" ++ ++msgid "Action" ++msgstr "פעולה" ++ ++msgid "Actions" ++msgstr "פעולות" ++ ++msgid "Activate this network" ++msgstr "הפעל רשת זו" ++ ++msgid "Active IPv4-Routes" ++msgstr "" ++ ++msgid "Active IPv6-Routes" ++msgstr "" ++ ++msgid "Active Connections" ++msgstr "×—×™×‘×•×¨×™× ×¤×¢×™×œ×™×" ++ ++msgid "Active DHCP Leases" ++msgstr "הרש×ות DHCP פעילות" ++ ++msgid "Active DHCPv6 Leases" ++msgstr "הרש×ות DHCPv6 פעילות" ++ ++# צריך ×ימות של מישהו שמבין יותר ×‘×ž×•×©×’×™× ×”×לו ×× ×¦×¨×™×š בכלל ×œ×ª×¨×’× ×ת ×–×” ×ו להש×יר כמו שזה ++#, fuzzy ++msgid "Ad-Hoc" ++msgstr "×ד-הוק" ++ ++msgid "Add" ++msgstr "הוסף" ++ ++#, fuzzy ++msgid "Add local domain suffix to names served from hosts files" ++msgstr "הוסף דומיין מקומי לשמות ×”×ž×•×’×©×™× ×ž×”×§×‘×¦×™× ×©×œ המ×רח" ++ ++msgid "Add new interface..." ++msgstr "הוסף ממשק חדש..." ++ ++msgid "Additional Hosts files" ++msgstr "קבצי מ×רח נוספי×" ++ ++msgid "Address" ++msgstr "כתובת" ++ ++msgid "Address to access local relay bridge" ++msgstr "" ++ ++#, fuzzy ++msgid "Administration" ++msgstr "מנהלה" ++ ++msgid "Advanced Settings" ++msgstr "הגדרות מתקדמות" ++ ++#, fuzzy ++msgid "Alert" ++msgstr "×זעקה" ++ ++msgid "Allow SSH password authentication" ++msgstr "" ++ ++#, fuzzy ++msgid "Allow all except listed" ++msgstr "×פשר הכל חוץ מהרשומי×" ++ ++msgid "Allow listed only" ++msgstr "×פשר ×¨×©×•×ž×™× ×‘×œ×‘×“" ++ ++#, fuzzy ++msgid "Allow localhost" ++msgstr "×פשר localhost" ++ ++msgid "Allow remote hosts to connect to local SSH forwarded ports" ++msgstr "" ++ ++msgid "Allow root logins with password" ++msgstr "" ++ ++msgid "Allow the root user to login with password" ++msgstr "" ++ ++msgid "" ++"Allow upstream responses in the 127.0.0.0/8 range, e.g. for RBL services" ++msgstr "" ++ ++msgid "" ++"Also see Tunneling Comparison on SIXXS" ++msgstr "" ++ ++msgid "Always announce default router" ++msgstr "" ++ ++#, fuzzy ++msgid "An additional network will be created if you leave this unchecked." ++msgstr "רשת נוספת תווצר ×× ×ª×©×יר ×ת ×–×” ×œ× ×ž×¡×•×ž×Ÿ" ++ ++msgid "Announce as default router even if no public prefix is available." ++msgstr "" ++ ++msgid "Announced DNS domains" ++msgstr "" ++ ++msgid "Announced DNS servers" ++msgstr "" ++ ++msgid "Antenna 1" ++msgstr "×נטנה 1" ++ ++msgid "Antenna 2" ++msgstr "×נטנה 2" ++ ++msgid "Antenna Configuration" ++msgstr "הגדרות ×נטנה" ++ ++# ×זור? ++#, fuzzy ++msgid "Any zone" ++msgstr "כל תחו×" ++ ++msgid "Apply" ++msgstr "החל" ++ ++msgid "Applying changes" ++msgstr "מחיל הגדרות" ++ ++msgid "" ++"Assign a part of given length of every public IPv6-prefix to this interface" ++msgstr "" ++ ++msgid "Assign interfaces..." ++msgstr "הקצה ממשקי×" ++ ++msgid "" ++"Assign prefix parts using this hexadecimal subprefix ID for this interface." ++msgstr "" ++ ++msgid "Associated Stations" ++msgstr "תחנות קשורות" ++ ++msgid "Atheros 802.11%s Wireless Controller" ++msgstr "שלט ×לחוטי Atheros 802.11%s" ++ ++msgid "AuthGroup" ++msgstr "" ++ ++msgid "Authentication" ++msgstr "×ימות" ++ ++msgid "Authoritative" ++msgstr "מוסמך" ++ ++msgid "Authorization Required" ++msgstr "דרוש ×ימות" ++ ++msgid "Auto Refresh" ++msgstr "רענון ×וטומטי" ++ ++msgid "Automatic" ++msgstr "" ++ ++msgid "Automatic Homenet (HNCP)" ++msgstr "" ++ ++msgid "Available" ++msgstr "זמין" ++ ++msgid "Available packages" ++msgstr "חבילות זמינות" ++ ++msgid "Average:" ++msgstr "ממוצע:" ++ ++msgid "BSSID" ++msgstr "BSSID" ++ ++msgid "Back" ++msgstr "חזרה" ++ ++msgid "Back to Overview" ++msgstr "חזרה לסקירה" ++ ++msgid "Back to configuration" ++msgstr "חזרה להגדרות" ++ ++msgid "Back to overview" ++msgstr "חזרה לסקירה" ++ ++msgid "Back to scan results" ++msgstr "חזרה לתוצ×ות סריקה" ++ ++msgid "Background Scan" ++msgstr "סריקת רקע" ++ ++msgid "Backup / Flash Firmware" ++msgstr "גיבוי / קושחת פל×ש" ++ ++msgid "Backup / Restore" ++msgstr "גיבוי / שחזור" ++ ++msgid "Backup file list" ++msgstr "גיבוי רשימת קבצי×" ++ ++msgid "Bad address specified!" ++msgstr "פורטה כתובת ×œ× ×ª×§×™× ×”" ++ ++msgid "Band" ++msgstr "" ++ ++msgid "Behind NAT" ++msgstr "" ++ ++msgid "" ++"Below is the determined list of files to backup. It consists of changed " ++"configuration files marked by opkg, essential base files and the user " ++"defined backup patterns." ++msgstr "" ++"למטה יש ×ת הרשימה הסופית של ×§×‘×¦×™× ×œ×’×™×‘×•×™. ×”×™× ×ž×•×¨×›×‘×ª ×¢\"×™ קבצי הגדרות ששונו, " ++"×”×ž×¡×•×ž× ×™× ×‘ opkg ×Open PacKaGe Managementׂ, קבצי בסיס ×—×™×•× ×™×™× ×•×ª×‘× ×™×•×ª הגיבוי " ++"המוגדרות ×¢\"×™ המשתמש." ++ ++msgid "Bitrate" ++msgstr "" ++ ++msgid "Bogus NX Domain Override" ++msgstr "" ++ ++msgid "Bridge" ++msgstr "גשר" ++ ++msgid "Bridge interfaces" ++msgstr "ממשקי גשר" ++ ++msgid "Bridge unit number" ++msgstr "מס' ×™×—' גשר" ++ ++#, fuzzy ++msgid "Bring up on boot" ++msgstr "×”×‘× ×‘×יתחול" ++ ++msgid "Broadcom 802.11%s Wireless Controller" ++msgstr "שלט ×לחוטי Broadcom 802.11%s" ++ ++msgid "Broadcom BCM%04x 802.11 Wireless Controller" ++msgstr "שלט ×לחוטי Broadcom BCM%04x 802.11" ++ ++msgid "Buffered" ++msgstr "" ++ ++msgid "Buttons" ++msgstr "כפתורי×" ++ ++msgid "CA certificate; if empty it will be saved after the first connection." ++msgstr "" ++ ++msgid "CPU" ++msgstr "מעבד" ++ ++msgid "CPU usage (%)" ++msgstr "שימוש מעבד (%)" ++ ++msgid "Cancel" ++msgstr "בטל" ++ ++msgid "Category" ++msgstr "" ++ ++msgid "Chain" ++msgstr "שרשרת" ++ ++msgid "Changes" ++msgstr "שינויי×" ++ ++msgid "Changes applied." ++msgstr "×”×©×™× ×•×™×™× ×”×•×—×œ×•" ++ ++msgid "Changes the administrator password for accessing the device" ++msgstr "משנה ×ת סיסמת המנהל לגישה למכשיר" ++ ++msgid "Channel" ++msgstr "ערוץ" ++ ++msgid "Check" ++msgstr "לבדוק" ++ ++msgid "Checksum" ++msgstr "" ++ ++msgid "" ++"Choose the firewall zone you want to assign to this interface. Select " ++"unspecified to remove the interface from the associated zone or " ++"fill out the create field to define a new zone and attach the " ++"interface to it." ++msgstr "" ++ ++msgid "" ++"Choose the network(s) you want to attach to this wireless interface or fill " ++"out the create field to define a new network." ++msgstr "" ++ ++msgid "Cipher" ++msgstr "" ++ ++msgid "" ++"Click \"Generate archive\" to download a tar archive of the current " ++"configuration files. To reset the firmware to its initial state, click " ++"\"Perform reset\" (only possible with squashfs images)." ++msgstr "" ++ ++msgid "Client" ++msgstr "" ++ ++msgid "Client ID to send when requesting DHCP" ++msgstr "" ++ ++msgid "" ++"Close inactive connection after the given amount of seconds, use 0 to " ++"persist connection" ++msgstr "סגור ×—×™×‘×•×¨×™× ×œ× ×¤×¢×™×œ×™× ×חרי מספר השניות שהוגדר, הזן 0 על-מנת ×œ× ×œ×¡×’×•×¨" ++ ++msgid "Close list..." ++msgstr "סגור רשימה..." ++ ++msgid "Collecting data..." ++msgstr "×וסף מידע..." ++ ++msgid "Command" ++msgstr "פקודה" ++ ++msgid "Common Configuration" ++msgstr "הגדרות נפוצות" ++ ++msgid "Compression" ++msgstr "דחיסה" ++ ++msgid "Configuration" ++msgstr "הגדרות" ++ ++msgid "Configuration applied." ++msgstr "הגדרות הוחלו" ++ ++msgid "Configuration files will be kept." ++msgstr "קבצי ההגדרות ישמרו." ++ ++msgid "Confirmation" ++msgstr "×ישור" ++ ++msgid "Connect" ++msgstr "התחבר" ++ ++msgid "Connected" ++msgstr "מחובר" ++ ++msgid "Connection Limit" ++msgstr "מגבלת חיבורי×" ++ ++msgid "Connection to server fails when TLS cannot be used" ++msgstr "" ++ ++msgid "Connections" ++msgstr "חיבורי×" ++ ++msgid "Country" ++msgstr "מדינה" ++ ++msgid "Country Code" ++msgstr "קוד מדינה" ++ ++msgid "Cover the following interface" ++msgstr "כסה ×ת הממשק הב×" ++ ++msgid "Cover the following interfaces" ++msgstr "כסה ×ת ×”×ž×ž×©×§×™× ×”×‘××™×" ++ ++msgid "Create / Assign firewall-zone" ++msgstr "צור / הקצה תחו×-חומת ×ש" ++ ++msgid "Create Interface" ++msgstr "צור ממשק" ++ ++msgid "Create a bridge over multiple interfaces" ++msgstr "צור גשר בין מספר ממשקי×" ++ ++msgid "Critical" ++msgstr "קריטי" ++ ++msgid "Cron Log Level" ++msgstr "" ++ ++msgid "Custom Interface" ++msgstr "ממשק מות×× ×ישית" ++ ++msgid "Custom delegated IPv6-prefix" ++msgstr "" ++ ++msgid "" ++"Customizes the behaviour of the device LEDs if possible." ++msgstr "" ++"מת××™× ×ת הגדרות ×”-LED-×™× ×‘×ž×›×©×™×¨ " ++"(×× ×פשרי)." ++ ++msgid "DHCP Leases" ++msgstr "הרש×ות DHCP" ++ ++msgid "DHCP Server" ++msgstr "שרת DHCP" ++ ++msgid "DHCP and DNS" ++msgstr "DHCP ו- DNS" ++ ++msgid "DHCP client" ++msgstr "לקוח DHCP" ++ ++msgid "DHCP-Options" ++msgstr "×פשרויות-DHCP" ++ ++msgid "DHCPv6 Leases" ++msgstr "הרש×ות DHCPv6" ++ ++msgid "DHCPv6 client" ++msgstr "" ++ ++msgid "DHCPv6-Mode" ++msgstr "" ++ ++msgid "DHCPv6-Service" ++msgstr "" ++ ++msgid "DNS" ++msgstr "DNS" ++ ++msgid "DNS forwardings" ++msgstr "" ++ ++msgid "DNS-Label / FQDN" ++msgstr "" ++ ++msgid "DS-Lite AFTR address" ++msgstr "" ++ ++msgid "DUID" ++msgstr "" ++ ++msgid "Debug" ++msgstr "" ++ ++msgid "Default %d" ++msgstr "" ++ ++msgid "Default gateway" ++msgstr "" ++ ++msgid "Default route" ++msgstr "" ++ ++msgid "Default state" ++msgstr "" ++ ++msgid "Define a name for this network." ++msgstr "הגדר ×©× ×œ×¨×©×ª זו" ++ ++msgid "" ++"Define additional DHCP options, for example " ++"\"6,192.168.2.1,192.168.2.2\" which advertises different DNS " ++"servers to clients." ++msgstr "" ++"הגדר ×פשרויות DHCP נוספות, למשל \"6,192.168.2.1,192.168.2.2\" " ++"×שר מציגות שרתי DNS ×©×•× ×™× ×œ×œ×§×•×—" ++ ++msgid "Delete" ++msgstr "למחוק" ++ ++msgid "Delete this interface" ++msgstr "מחק ממשק ×–×”" ++ ++msgid "Delete this network" ++msgstr "מחק רשת זו" ++ ++msgid "Description" ++msgstr "תי×ור" ++ ++msgid "Design" ++msgstr "עיצוב" ++ ++msgid "Destination" ++msgstr "יעד" ++ ++msgid "Device" ++msgstr "מכשיר" ++ ++msgid "Device Configuration" ++msgstr "הגדרות מכשיר" ++ ++msgid "Diagnostics" ++msgstr "×בחון" ++ ++msgid "Dial number" ++msgstr "" ++ ++msgid "Directory" ++msgstr "" ++ ++msgid "Disable" ++msgstr "" ++ ++msgid "" ++"Disable DHCP for " ++"this interface." ++msgstr "" ++ ++msgid "Disable DNS setup" ++msgstr "" ++ ++msgid "Disable HW-Beacon timer" ++msgstr "" ++ ++msgid "Disabled" ++msgstr "" ++ ++msgid "Discard upstream RFC1918 responses" ++msgstr "" ++ ++msgid "Displaying only packages containing" ++msgstr "מציג רק חבילות המכילות" ++ ++msgid "Distance Optimization" ++msgstr "" ++ ++msgid "Distance to farthest network member in meters." ++msgstr "מרחק לנק' הרשת הרחוקה ביותר במטרי×" ++ ++msgid "Diversity" ++msgstr "גיוון" ++ ++msgid "" ++"Dnsmasq is a combined DHCP-Server and DNS-" ++"Forwarder for NAT " ++"firewalls" ++msgstr "" ++ ++msgid "Do not cache negative replies, e.g. for not existing domains" ++msgstr "" ++ ++msgid "Do not forward requests that cannot be answered by public name servers" ++msgstr "" ++ ++msgid "Do not forward reverse lookups for local networks" ++msgstr "" ++ ++msgid "Do not send probe responses" ++msgstr "" ++ ++msgid "Domain required" ++msgstr "" ++ ++msgid "Domain whitelist" ++msgstr "" ++ ++msgid "" ++"Don't forward DNS-Requests without " ++"DNS-Name" ++msgstr "" ++ ++msgid "Download and install package" ++msgstr "הורד והתקן חבילות" ++ ++msgid "Download backup" ++msgstr "הורד גיבוי" ++ ++msgid "Dropbear Instance" ++msgstr "" ++ ++msgid "" ++"Dropbear offers SSH network shell access " ++"and an integrated SCP server" ++msgstr "" ++"Dropbear מ×פשר גישת SSH רשתית ושרת SCP מובנה" ++ ++msgid "Dual-Stack Lite (RFC6333)" ++msgstr "" ++ ++msgid "Dynamic DHCP" ++msgstr "DHCP דינ×מי" ++ ++msgid "Dynamic tunnel" ++msgstr "" ++ ++msgid "" ++"Dynamically allocate DHCP addresses for clients. If disabled, only clients " ++"having static leases will be served." ++msgstr "" ++ ++msgid "EAP-Method" ++msgstr "" ++ ++msgid "Edit" ++msgstr "ערוך" ++ ++msgid "" ++"Edit the raw configuration data above to fix any error and hit \"Save\" to " ++"reload the page." ++msgstr "" ++ ++msgid "Edit this interface" ++msgstr "ערוך ממשק ×–×”" ++ ++msgid "Edit this network" ++msgstr "ערוך רשת זו" ++ ++msgid "Emergency" ++msgstr "מצב חרו×" ++ ++msgid "Enable" ++msgstr "×פשר" ++ ++msgid "Enable STP" ++msgstr "×פשר STP" ++ ++msgid "Enable HE.net dynamic endpoint update" ++msgstr "" ++ ++msgid "Enable IPv6 negotiation on the PPP link" ++msgstr "" ++ ++msgid "Enable Jumbo Frame passthrough" ++msgstr "" ++ ++msgid "Enable NTP client" ++msgstr "" ++ ++msgid "Enable TFTP server" ++msgstr "×פשר שרת TFTP" ++ ++msgid "Enable VLAN functionality" ++msgstr "×פשר תפקוד VLAN" ++ ++msgid "Enable WPS pushbutton, requires WPA(2)-PSK" ++msgstr "" ++ ++msgid "Enable learning and aging" ++msgstr "×פשר למידה והזדקנות" ++ ++msgid "Enable mirroring of incoming packets" ++msgstr "" ++ ++msgid "Enable mirroring of outgoing packets" ++msgstr "" ++ ++msgid "Enable this mount" ++msgstr "" ++ ++msgid "Enable this swap" ++msgstr "" ++ ++msgid "Enable/Disable" ++msgstr "" ++ ++msgid "Enabled" ++msgstr "×פשר" ++ ++msgid "Enables the Spanning Tree Protocol on this bridge" ++msgstr "" ++ ++msgid "Encapsulation mode" ++msgstr "" ++ ++msgid "Encryption" ++msgstr "הצפנה" ++ ++msgid "Erasing..." ++msgstr "מוחק..." ++ ++msgid "Error" ++msgstr "שגי××”" ++ ++msgid "Ethernet Adapter" ++msgstr "" ++ ++msgid "Ethernet Switch" ++msgstr "" ++ ++msgid "Expand hosts" ++msgstr "" ++ ++msgid "Expires" ++msgstr "" ++ ++msgid "" ++"Expiry time of leased addresses, minimum is 2 minutes (2m)." ++msgstr "" ++ ++msgid "External" ++msgstr "" ++ ++msgid "External system log server" ++msgstr "" ++ ++msgid "External system log server port" ++msgstr "" ++ ++msgid "Fast Frames" ++msgstr "" ++ ++msgid "File" ++msgstr "" ++ ++msgid "Filename of the boot image advertised to clients" ++msgstr "" ++ ++msgid "Filesystem" ++msgstr "" ++ ++msgid "Filter" ++msgstr "" ++ ++msgid "Filter private" ++msgstr "" ++ ++msgid "Filter useless" ++msgstr "" ++ ++msgid "Find and join network" ++msgstr "" ++ ++msgid "Find package" ++msgstr "" ++ ++msgid "Finish" ++msgstr "" ++ ++msgid "Firewall" ++msgstr "" ++ ++msgid "Firewall Settings" ++msgstr "" ++ ++msgid "Firewall Status" ++msgstr "" ++ ++msgid "Firmware Version" ++msgstr "" ++ ++msgid "Fixed source port for outbound DNS queries" ++msgstr "" ++ ++msgid "Flags" ++msgstr "" ++ ++msgid "Flash Firmware" ++msgstr "" ++ ++msgid "Flash image..." ++msgstr "" ++ ++msgid "Flash new firmware image" ++msgstr "" ++ ++msgid "Flash operations" ++msgstr "" ++ ++msgid "Flashing..." ++msgstr "" ++ ++msgid "Force" ++msgstr "" ++ ++msgid "Force CCMP (AES)" ++msgstr "" ++ ++msgid "Force DHCP on this network even if another server is detected." ++msgstr "" ++ ++msgid "Force TKIP" ++msgstr "" ++ ++msgid "Force TKIP and CCMP (AES)" ++msgstr "" ++ ++msgid "Forward DHCP traffic" ++msgstr "" ++ ++msgid "Forward broadcast traffic" ++msgstr "" ++ ++msgid "Forwarding mode" ++msgstr "" ++ ++msgid "Fragmentation Threshold" ++msgstr "" ++ ++msgid "Frame Bursting" ++msgstr "" ++ ++msgid "Free" ++msgstr "" ++ ++msgid "Free space" ++msgstr "" ++ ++msgid "GHz" ++msgstr "" ++ ++msgid "GPRS only" ++msgstr "" ++ ++msgid "Gateway" ++msgstr "" ++ ++msgid "Gateway ports" ++msgstr "" ++ ++msgid "General Settings" ++msgstr "" ++ ++msgid "General Setup" ++msgstr "" ++ ++msgid "Generate archive" ++msgstr "" ++ ++msgid "Generic 802.11%s Wireless Controller" ++msgstr "" ++ ++msgid "Given password confirmation did not match, password not changed!" ++msgstr "" ++ ++msgid "Global network options" ++msgstr "" ++ ++msgid "Go to password configuration..." ++msgstr "" ++ ++msgid "Go to relevant configuration page" ++msgstr "" ++ ++msgid "Guest" ++msgstr "" ++ ++msgid "HE.net password" ++msgstr "" ++ ++msgid "HE.net username" ++msgstr "" ++ ++msgid "Handler" ++msgstr "" ++ ++msgid "Hang Up" ++msgstr "" ++ ++msgid "Heartbeat" ++msgstr "" ++ ++msgid "" ++"Here you can configure the basic aspects of your device like its hostname or " ++"the timezone." ++msgstr "" ++ ++msgid "" ++"Here you can paste public SSH-Keys (one per line) for SSH public-key " ++"authentication." ++msgstr "" ++ ++msgid "Hermes 802.11b Wireless Controller" ++msgstr "" ++ ++msgid "Hide ESSID" ++msgstr "" ++ ++msgid "Host entries" ++msgstr "" ++ ++msgid "Host expiry timeout" ++msgstr "" ++ ++msgid "Host-IP or Network" ++msgstr "" ++ ++msgid "Hostname" ++msgstr "" ++ ++msgid "Hostname to send when requesting DHCP" ++msgstr "" ++ ++msgid "Hostnames" ++msgstr "" ++ ++msgid "Hybrid" ++msgstr "" ++ ++msgid "IP address" ++msgstr "" ++ ++msgid "IPv4" ++msgstr "" ++ ++msgid "IPv4 Firewall" ++msgstr "" ++ ++msgid "IPv4 WAN Status" ++msgstr "" ++ ++msgid "IPv4 address" ++msgstr "כתבות IPv4" ++ ++msgid "IPv4 and IPv6" ++msgstr "IPv4 ו-IPv6" ++ ++msgid "IPv4 assignment length" ++msgstr "" ++ ++msgid "IPv4 broadcast" ++msgstr "" ++ ++msgid "IPv4 gateway" ++msgstr "" ++ ++msgid "IPv4 netmask" ++msgstr "" ++ ++msgid "IPv4 only" ++msgstr "" ++ ++msgid "IPv4 prefix length" ++msgstr "" ++ ++msgid "IPv4-Address" ++msgstr "" ++ ++msgid "IPv6" ++msgstr "" ++ ++msgid "IPv6 Firewall" ++msgstr "" ++ ++msgid "IPv6 Neighbours" ++msgstr "" ++ ++msgid "IPv6 Settings" ++msgstr "" ++ ++msgid "IPv6 ULA-Prefix" ++msgstr "" ++ ++msgid "IPv6 WAN Status" ++msgstr "" ++ ++msgid "IPv6 address" ++msgstr "" ++ ++msgid "IPv6 address delegated to the local tunnel endpoint (optional)" ++msgstr "" ++ ++msgid "IPv6 assignment hint" ++msgstr "" ++ ++msgid "IPv6 assignment length" ++msgstr "" ++ ++msgid "IPv6 gateway" ++msgstr "" ++ ++msgid "IPv6 only" ++msgstr "" ++ ++msgid "IPv6 prefix" ++msgstr "" ++ ++msgid "IPv6 prefix length" ++msgstr "" ++ ++msgid "IPv6 routed prefix" ++msgstr "" ++ ++msgid "IPv6-Address" ++msgstr "" ++ ++msgid "IPv6-in-IPv4 (RFC4213)" ++msgstr "" ++ ++msgid "IPv6-over-IPv4 (6rd)" ++msgstr "" ++ ++msgid "IPv6-over-IPv4 (6to4)" ++msgstr "" ++ ++msgid "Identity" ++msgstr "" ++ ++msgid "" ++"If specified, mount the device by its UUID instead of a fixed device node" ++msgstr "" ++ ++msgid "" ++"If specified, mount the device by the partition label instead of a fixed " ++"device node" ++msgstr "" ++ ++msgid "If unchecked, no default route is configured" ++msgstr "" ++ ++msgid "If unchecked, the advertised DNS server addresses are ignored" ++msgstr "" ++ ++msgid "" ++"If your physical memory is insufficient unused data can be temporarily " ++"swapped to a swap-device resulting in a higher amount of usable RAM. Be aware that swapping data is a very " ++"slow process as the swap-device cannot be accessed with the high datarates " ++"of the RAM." ++msgstr "" ++ ++msgid "Ignore Hosts files" ++msgstr "" ++ ++msgid "Ignore interface" ++msgstr "" ++ ++msgid "Ignore resolve file" ++msgstr "" ++ ++msgid "Image" ++msgstr "" ++ ++msgid "In" ++msgstr "" ++ ++msgid "Inactivity timeout" ++msgstr "" ++ ++msgid "Inbound:" ++msgstr "" ++ ++msgid "Info" ++msgstr "" ++ ++msgid "Initscript" ++msgstr "" ++ ++msgid "Initscripts" ++msgstr "" ++ ++msgid "Install" ++msgstr "" ++ ++msgid "Install iputils-traceroute6 for IPv6 traceroute" ++msgstr "" ++ ++msgid "Install package %q" ++msgstr "" ++ ++msgid "Install protocol extensions..." ++msgstr "" ++ ++msgid "Installed packages" ++msgstr "" ++ ++msgid "Interface" ++msgstr "" ++ ++msgid "Interface Configuration" ++msgstr "" ++ ++msgid "Interface Overview" ++msgstr "" ++ ++msgid "Interface is reconnecting..." ++msgstr "" ++ ++msgid "Interface is shutting down..." ++msgstr "" ++ ++msgid "Interface not present or not connected yet." ++msgstr "" ++ ++msgid "Interface reconnected" ++msgstr "" ++ ++msgid "Interface shut down" ++msgstr "" ++ ++msgid "Interfaces" ++msgstr "" ++ ++msgid "Internal" ++msgstr "" ++ ++msgid "Internal Server Error" ++msgstr "" ++ ++msgid "Invalid" ++msgstr "" ++ ++msgid "Invalid VLAN ID given! Only IDs between %d and %d are allowed." ++msgstr "מספר VLAN שגוי! רק ×¢×¨×›×™× ×‘×™×Ÿ %d לבין %d ×”× ×—×•×§×™×™×." ++ ++msgid "Invalid VLAN ID given! Only unique IDs are allowed" ++msgstr "" ++ ++msgid "Invalid username and/or password! Please try again." ++msgstr "×©× ×ž×©×ª×ž×© ו/×ו סיסמה שגויי×! ×× × × ×¡×” שנית." ++ ++msgid "" ++"It appears that you are trying to flash an image that does not fit into the " ++"flash memory, please verify the image file!" ++msgstr "" ++ ++msgid "Java Script required!" ++msgstr "" ++ ++msgid "Join Network" ++msgstr "" ++ ++msgid "Join Network: Settings" ++msgstr "" ++ ++msgid "Join Network: Wireless Scan" ++msgstr "" ++ ++msgid "Keep settings" ++msgstr "" ++ ++msgid "Kernel Log" ++msgstr "" ++ ++msgid "Kernel Version" ++msgstr "" ++ ++msgid "Key" ++msgstr "" ++ ++msgid "Key #%d" ++msgstr "" ++ ++msgid "Kill" ++msgstr "" ++ ++msgid "L2TP" ++msgstr "" ++ ++msgid "L2TP Server" ++msgstr "" ++ ++msgid "LCP echo failure threshold" ++msgstr "" ++ ++msgid "LCP echo interval" ++msgstr "" ++ ++msgid "LLC" ++msgstr "" ++ ++msgid "Label" ++msgstr "" ++ ++msgid "Language" ++msgstr "" ++ ++msgid "Language and Style" ++msgstr "" ++ ++msgid "Leaf" ++msgstr "" ++ ++msgid "Lease validity time" ++msgstr "" ++ ++msgid "Leasefile" ++msgstr "" ++ ++msgid "Leasetime" ++msgstr "" ++ ++msgid "Leasetime remaining" ++msgstr "" ++ ++msgid "Leave empty to autodetect" ++msgstr "" ++ ++msgid "Leave empty to use the current WAN address" ++msgstr "" ++ ++msgid "Legend:" ++msgstr "" ++ ++msgid "Limit" ++msgstr "" ++ ++msgid "Line Attenuation" ++msgstr "" ++ ++msgid "Line Speed" ++msgstr "" ++ ++msgid "Line State" ++msgstr "" ++ ++msgid "Link On" ++msgstr "" ++ ++msgid "" ++"List of DNS servers to forward " ++"requests to" ++msgstr "" ++ ++msgid "List of domains to allow RFC1918 responses for" ++msgstr "" ++ ++msgid "List of hosts that supply bogus NX domain results" ++msgstr "" ++ ++msgid "Listen only on the given interface or, if unspecified, on all" ++msgstr "" ++ ++msgid "Listening port for inbound DNS queries" ++msgstr "" ++ ++msgid "Load" ++msgstr "עומס" ++ ++msgid "Load Average" ++msgstr "עומס ממוצע" ++ ++msgid "Loading" ++msgstr "טוען" ++ ++msgid "Local IPv4 address" ++msgstr "כתובת IPv4 מקומית" ++ ++msgid "Local IPv6 address" ++msgstr "כתובת IPv6 מקומית" ++ ++msgid "Local Startup" ++msgstr "" ++ ++msgid "Local Time" ++msgstr "" ++ ++msgid "Local domain" ++msgstr "" ++ ++msgid "" ++"Local domain specification. Names matching this domain are never forwarded " ++"and are resolved from DHCP or hosts files only" ++msgstr "" ++ ++msgid "Local domain suffix appended to DHCP names and hosts file entries" ++msgstr "" ++ ++msgid "Local server" ++msgstr "שרת מקומי" ++ ++msgid "" ++"Localise hostname depending on the requesting subnet if multiple IPs are " ++"available" ++msgstr "" ++ ++msgid "Localise queries" ++msgstr "" ++ ++msgid "Locked to channel %d used by: %s" ++msgstr "" ++ ++msgid "Log output level" ++msgstr "" ++ ++msgid "Log queries" ++msgstr "" ++ ++msgid "Logging" ++msgstr "" ++ ++msgid "Login" ++msgstr "" ++ ++msgid "Logout" ++msgstr "" ++ ++msgid "Lowest leased address as offset from the network address." ++msgstr "" ++ ++msgid "MAC-Address" ++msgstr "" ++ ++msgid "MAC-Address Filter" ++msgstr "" ++ ++msgid "MAC-Filter" ++msgstr "" ++ ++msgid "MAC-List" ++msgstr "" ++ ++msgid "MB/s" ++msgstr "" ++ ++msgid "MHz" ++msgstr "" ++ ++msgid "MTU" ++msgstr "" ++ ++msgid "" ++"Make sure to clone the root filesystem using something like the commands " ++"below:" ++msgstr "" ++ ++msgid "Maximum Rate" ++msgstr "" ++ ++msgid "Maximum allowed number of active DHCP leases" ++msgstr "" ++ ++msgid "Maximum allowed number of concurrent DNS queries" ++msgstr "" ++ ++msgid "Maximum allowed size of EDNS.0 UDP packets" ++msgstr "" ++ ++msgid "Maximum amount of seconds to wait for the modem to become ready" ++msgstr "" ++ ++msgid "Maximum hold time" ++msgstr "" ++ ++msgid "Maximum number of leased addresses." ++msgstr "" ++ ++msgid "Mbit/s" ++msgstr "" ++ ++msgid "Memory" ++msgstr "" ++ ++msgid "Memory usage (%)" ++msgstr "" ++ ++msgid "Metric" ++msgstr "" ++ ++msgid "Minimum Rate" ++msgstr "" ++ ++msgid "Minimum hold time" ++msgstr "" ++ ++msgid "Mirror monitor port" ++msgstr "" ++ ++msgid "Mirror source port" ++msgstr "" ++ ++msgid "Missing protocol extension for proto %q" ++msgstr "" ++ ++msgid "Mode" ++msgstr "" ++ ++msgid "Model" ++msgstr "" ++ ++msgid "Modem device" ++msgstr "" ++ ++msgid "Modem init timeout" ++msgstr "" ++ ++msgid "Monitor" ++msgstr "" ++ ++msgid "Mount Entry" ++msgstr "" ++ ++msgid "Mount Point" ++msgstr "" ++ ++msgid "Mount Points" ++msgstr "" ++ ++msgid "Mount Points - Mount Entry" ++msgstr "" ++ ++msgid "Mount Points - Swap Entry" ++msgstr "" ++ ++msgid "" ++"Mount Points define at which point a memory device will be attached to the " ++"filesystem" ++msgstr "" ++ ++msgid "Mount options" ++msgstr "" ++ ++msgid "Mount point" ++msgstr "" ++ ++msgid "Mounted file systems" ++msgstr "" ++ ++msgid "Move down" ++msgstr "" ++ ++msgid "Move up" ++msgstr "" ++ ++msgid "Multicast Rate" ++msgstr "" ++ ++msgid "Multicast address" ++msgstr "" ++ ++msgid "NAS ID" ++msgstr "" ++ ++msgid "NDP-Proxy" ++msgstr "" ++ ++msgid "NTP server candidates" ++msgstr "" ++ ++msgid "NTP sync time-out" ++msgstr "" ++ ++msgid "Name" ++msgstr "ש×" ++ ++msgid "Name of the new interface" ++msgstr "" ++ ++msgid "Name of the new network" ++msgstr "" ++ ++msgid "Navigation" ++msgstr "" ++ ++msgid "Netmask" ++msgstr "" ++ ++msgid "Network" ++msgstr "" ++ ++msgid "Network Utilities" ++msgstr "" ++ ++msgid "Network boot image" ++msgstr "" ++ ++msgid "Network without interfaces." ++msgstr "" ++ ++msgid "Next »" ++msgstr "" ++ ++msgid "No DHCP Server configured for this interface" ++msgstr "" ++ ++msgid "No chains in this table" ++msgstr "" ++ ++msgid "No files found" ++msgstr "" ++ ++msgid "No information available" ++msgstr "" ++ ++msgid "No negative cache" ++msgstr "" ++ ++msgid "No network configured on this device" ++msgstr "" ++ ++msgid "No network name specified" ++msgstr "" ++ ++msgid "No package lists available" ++msgstr "×ין רשימת חבילות זמינה" ++ ++msgid "No password set!" ++msgstr "×œ× ×”×•×’×“×¨×” סיסמה!" ++ ++msgid "No rules in this chain" ++msgstr "" ++ ++msgid "No zone assigned" ++msgstr "" ++ ++msgid "Noise" ++msgstr "" ++ ++msgid "Noise Margin" ++msgstr "" ++ ++msgid "Noise:" ++msgstr "" ++ ++msgid "None" ++msgstr "" ++ ++msgid "Normal" ++msgstr "" ++ ++msgid "Not Found" ++msgstr "" ++ ++msgid "Not associated" ++msgstr "" ++ ++msgid "Not connected" ++msgstr "×œ× ×ž×—×•×‘×¨" ++ ++msgid "Note: Configuration files will be erased." ++msgstr "" ++ ++msgid "Notice" ++msgstr "" ++ ++msgid "Nslookup" ++msgstr "" ++ ++msgid "OK" ++msgstr "" ++ ++msgid "OPKG-Configuration" ++msgstr "" ++ ++msgid "Off-State Delay" ++msgstr "" ++ ++msgid "" ++"On this page you can configure the network interfaces. You can bridge " ++"several interfaces by ticking the \"bridge interfaces\" field and enter the " ++"names of several network interfaces separated by spaces. You can also use " ++"VLAN notation " ++"INTERFACE.VLANNR (e.g.: " ++"eth0.1)." ++msgstr "" ++ ++msgid "On-State Delay" ++msgstr "" ++ ++msgid "One of hostname or mac address must be specified!" ++msgstr "" ++ ++msgid "One or more fields contain invalid values!" ++msgstr "×™×©× × ×©×“×•×ª ×”×ž×›×™×œ×™× ×¢×¨×›×™× ×‘×œ×ª×™ חוקיי×!" ++ ++msgid "One or more required fields have no value!" ++msgstr "" ++ ++msgid "Open list..." ++msgstr "" ++ ++msgid "OpenConnect (CISCO AnyConnect)" ++msgstr "" ++ ++msgid "Operating frequency" ++msgstr "" ++ ++msgid "Option changed" ++msgstr "" ++ ++msgid "Option removed" ++msgstr "" ++ ++msgid "Optional, specify to override default server (tic.sixxs.net)" ++msgstr "" ++ ++msgid "Optional, use when the SIXXS account has more than one tunnel" ++msgstr "" ++ ++msgid "Options" ++msgstr "" ++ ++msgid "Other:" ++msgstr "" ++ ++msgid "Out" ++msgstr "" ++ ++msgid "Outbound:" ++msgstr "" ++ ++msgid "Outdoor Channels" ++msgstr "" ++ ++msgid "Output Interface" ++msgstr "" ++ ++msgid "Override MAC address" ++msgstr "" ++ ++msgid "Override MTU" ++msgstr "" ++ ++msgid "Override the gateway in DHCP responses" ++msgstr "" ++ ++msgid "" ++"Override the netmask sent to clients. Normally it is calculated from the " ++"subnet that is served." ++msgstr "" ++ ++msgid "Override the table used for internal routes" ++msgstr "" ++ ++msgid "Overview" ++msgstr "" ++ ++msgid "Owner" ++msgstr "" ++ ++msgid "PAP/CHAP password" ++msgstr "" ++ ++msgid "PAP/CHAP username" ++msgstr "" ++ ++msgid "PID" ++msgstr "" ++ ++msgid "PIN" ++msgstr "" ++ ++msgid "PPP" ++msgstr "" ++ ++msgid "PPPoA Encapsulation" ++msgstr "" ++ ++msgid "PPPoATM" ++msgstr "" ++ ++msgid "PPPoE" ++msgstr "" ++ ++msgid "PPtP" ++msgstr "" ++ ++msgid "Package libiwinfo required!" ++msgstr "" ++ ++msgid "Package lists are older than 24 hours" ++msgstr "" ++ ++msgid "Package name" ++msgstr "×©× ×”×—×‘×™×œ×”" ++ ++msgid "Packets" ++msgstr "" ++ ++msgid "Part of zone %q" ++msgstr "" ++ ++msgid "Password" ++msgstr "" ++ ++msgid "Password authentication" ++msgstr "" ++ ++msgid "Password of Private Key" ++msgstr "" ++ ++msgid "Password successfully changed!" ++msgstr "" ++ ++msgid "Path" ++msgstr "" ++ ++msgid "Path to CA-Certificate" ++msgstr "" ++ ++msgid "Path to Client-Certificate" ++msgstr "" ++ ++msgid "Path to Private Key" ++msgstr "נתיב למפתח הפרטי" ++ ++msgid "Path to executable which handles the button event" ++msgstr "" ++ ++msgid "Peak:" ++msgstr "" ++ ++msgid "Perform reboot" ++msgstr "" ++ ++msgid "Perform reset" ++msgstr "" ++ ++msgid "Phy Rate:" ++msgstr "" ++ ++msgid "Physical Settings" ++msgstr "" ++ ++msgid "Ping" ++msgstr "" ++ ++msgid "Pkts." ++msgstr "" ++ ++msgid "Please enter your username and password." ++msgstr "×× × ×”×–×Ÿ ×ת ×©× ×”×ž×©×ª×ž×© והסיסמה שלך:" ++ ++msgid "Please wait: Device rebooting..." ++msgstr "×× × ×”×ž×ª×Ÿ: המכשיר מ×ותחל מחדש..." ++ ++msgid "Policy" ++msgstr "" ++ ++msgid "Port" ++msgstr "" ++ ++msgid "Port %d" ++msgstr "" ++ ++msgid "Port %d is untagged in multiple VLANs!" ++msgstr "" ++ ++msgid "Port status:" ++msgstr "" ++ ++msgid "" ++"Presume peer to be dead after given amount of LCP echo failures, use 0 to " ++"ignore failures" ++msgstr "" ++ ++msgid "Prevents client-to-client communication" ++msgstr "" ++ ++msgid "Prism2/2.5/3 802.11b Wireless Controller" ++msgstr "" ++ ++msgid "Proceed" ++msgstr "" ++ ++msgid "Processes" ++msgstr "" ++ ++msgid "Prot." ++msgstr "" ++ ++msgid "Protocol" ++msgstr "" ++ ++msgid "Protocol family" ++msgstr "" ++ ++msgid "Protocol of the new interface" ++msgstr "" ++ ++msgid "Protocol support is not installed" ++msgstr "" ++ ++msgid "Provide NTP server" ++msgstr "" ++ ++msgid "Provide new network" ++msgstr "" ++ ++msgid "Pseudo Ad-Hoc (ahdemo)" ++msgstr "" ++ ++msgid "Public prefix routed to this device for distribution to clients." ++msgstr "" ++ ++msgid "Quality" ++msgstr "" ++ ++msgid "RTS/CTS Threshold" ++msgstr "" ++ ++msgid "RX" ++msgstr "" ++ ++msgid "RX Rate" ++msgstr "קצב קליטה" ++ ++msgid "RaLink 802.11%s Wireless Controller" ++msgstr "" ++ ++msgid "Radius-Accounting-Port" ++msgstr "" ++ ++msgid "Radius-Accounting-Secret" ++msgstr "" ++ ++msgid "Radius-Accounting-Server" ++msgstr "" ++ ++msgid "Radius-Authentication-Port" ++msgstr "" ++ ++msgid "Radius-Authentication-Secret" ++msgstr "" ++ ++msgid "Radius-Authentication-Server" ++msgstr "" ++ ++msgid "" ++"Read /etc/ethers to configure the DHCP-Server" ++msgstr "" ++ ++msgid "" ++"Really delete this interface? The deletion cannot be undone!\\nYou might " ++"lose access to this device if you are connected via this interface." ++msgstr "" ++ ++msgid "" ++"Really delete this wireless network? The deletion cannot be undone!\\nYou " ++"might lose access to this device if you are connected via this network." ++msgstr "" ++ ++msgid "Really reset all changes?" ++msgstr "" ++ ++#, fuzzy ++msgid "" ++"Really shut down network?\\nYou might lose access to this device if you are " ++"connected via this interface." ++msgstr "" ++"×”×× ×œ×ž×—×•×§ ×ת הרשת ×”×לחוטית הזו? המחיקה ××™× ×” ניתנת לביטול!\n" ++"ייתכן ות×בד גישה לנתב ×”×–×” ×× ×תה מחובר דרך השרת הזו." ++ ++msgid "" ++"Really shutdown interface \"%s\" ?\\nYou might lose access to this device if " ++"you are connected via this interface." ++msgstr "" ++ ++msgid "Really switch protocol?" ++msgstr "" ++ ++msgid "Realtime Connections" ++msgstr "" ++ ++msgid "Realtime Graphs" ++msgstr "" ++ ++msgid "Realtime Load" ++msgstr "" ++ ++msgid "Realtime Traffic" ++msgstr "" ++ ++msgid "Realtime Wireless" ++msgstr "" ++ ++msgid "Rebind protection" ++msgstr "" ++ ++msgid "Reboot" ++msgstr "" ++ ++msgid "Rebooting..." ++msgstr "" ++ ++msgid "Reboots the operating system of your device" ++msgstr "" ++ ++msgid "Receive" ++msgstr "" ++ ++msgid "Receiver Antenna" ++msgstr "" ++ ++msgid "Reconnect this interface" ++msgstr "" ++ ++msgid "Reconnecting interface" ++msgstr "" ++ ++msgid "References" ++msgstr "" ++ ++msgid "Regulatory Domain" ++msgstr "" ++ ++msgid "Relay" ++msgstr "" ++ ++msgid "Relay Bridge" ++msgstr "" ++ ++msgid "Relay between networks" ++msgstr "" ++ ++msgid "Relay bridge" ++msgstr "" ++ ++msgid "Remote IPv4 address" ++msgstr "" ++ ++msgid "Remove" ++msgstr "" ++ ++msgid "Repeat scan" ++msgstr "" ++ ++msgid "Replace entry" ++msgstr "" ++ ++msgid "Replace wireless configuration" ++msgstr "" ++ ++msgid "Request IPv6-address" ++msgstr "" ++ ++msgid "Request IPv6-prefix of length" ++msgstr "" ++ ++msgid "Require TLS" ++msgstr "" ++ ++msgid "Required for certain ISPs, e.g. Charter with DOCSIS 3" ++msgstr "" ++ ++msgid "Reset" ++msgstr "" ++ ++msgid "Reset Counters" ++msgstr "" ++ ++msgid "Reset to defaults" ++msgstr "" ++ ++msgid "Resolv and Hosts Files" ++msgstr "" ++ ++msgid "Resolve file" ++msgstr "" ++ ++msgid "Restart" ++msgstr "" ++ ++msgid "Restart Firewall" ++msgstr "" ++ ++msgid "Restore backup" ++msgstr "" ++ ++msgid "Reveal/hide password" ++msgstr "" ++ ++msgid "Revert" ++msgstr "" ++ ++msgid "Root" ++msgstr "" ++ ++msgid "Root directory for files served via TFTP" ++msgstr "" ++ ++msgid "Root preparation" ++msgstr "" ++ ++msgid "Routed IPv6 prefix for downstream interfaces" ++msgstr "" ++ ++msgid "Router Advertisement-Service" ++msgstr "" ++ ++msgid "Router Password" ++msgstr "" ++ ++msgid "Routes" ++msgstr "" ++ ++msgid "" ++"Routes specify over which interface and gateway a certain host or network " ++"can be reached." ++msgstr "" ++ ++msgid "Rule #" ++msgstr "" ++ ++msgid "Run a filesystem check before mounting the device" ++msgstr "" ++ ++msgid "Run filesystem check" ++msgstr "הרץ בדיקת מערכת קבצי×" ++ ++msgid "" ++"SIXXS supports TIC only, for static tunnels using IP protocol 41 (RFC4213) " ++"use 6in4 instead" ++msgstr "" ++ ++msgid "SIXXS-handle[/Tunnel-ID]" ++msgstr "" ++ ++msgid "SSH Access" ++msgstr "" ++ ++msgid "SSH-Keys" ++msgstr "" ++ ++msgid "SSID" ++msgstr "" ++ ++msgid "Save" ++msgstr "" ++ ++msgid "Save & Apply" ++msgstr "" ++ ++msgid "Save & Apply" ++msgstr "" ++ ++msgid "Scan" ++msgstr "" ++ ++msgid "Scheduled Tasks" ++msgstr "" ++ ++msgid "Section added" ++msgstr "" ++ ++msgid "Section removed" ++msgstr "" ++ ++msgid "See \"mount\" manpage for details" ++msgstr "" ++ ++msgid "" ++"Send LCP echo requests at the given interval in seconds, only effective in " ++"conjunction with failure threshold" ++msgstr "" ++ ++msgid "Separate Clients" ++msgstr "" ++ ++msgid "Separate WDS" ++msgstr "" ++ ++msgid "Server Settings" ++msgstr "" ++ ++msgid "Server password" ++msgstr "" ++ ++msgid "" ++"Server password, enter the specific password of the tunnel when the username " ++"contains the tunnel ID" ++msgstr "" ++ ++msgid "Server username" ++msgstr "" ++ ++msgid "Service Name" ++msgstr "" ++ ++msgid "Service Type" ++msgstr "" ++ ++msgid "Services" ++msgstr "שירותי×" ++ ++#, fuzzy ++msgid "Set up Time Synchronization" ++msgstr "סנכרון זמן" ++ ++msgid "Setup DHCP Server" ++msgstr "" ++ ++msgid "Show current backup file list" ++msgstr "" ++ ++msgid "Shutdown this interface" ++msgstr "" ++ ++msgid "Shutdown this network" ++msgstr "" ++ ++msgid "Signal" ++msgstr "" ++ ++msgid "Signal:" ++msgstr "" ++ ++msgid "Size" ++msgstr "" ++ ++msgid "Skip" ++msgstr "" ++ ++msgid "Skip to content" ++msgstr "דלג ×ל התוכן" ++ ++msgid "Skip to navigation" ++msgstr "דלג ×ל הניווט" ++ ++msgid "Slot time" ++msgstr "" ++ ++msgid "Software" ++msgstr "תוכנה" ++ ++msgid "Some fields are invalid, cannot save values!" ++msgstr "חלק מהשדות ××™× × ×ª×§×™× ×™×, ×ין ×פשרות לשמור ×ת הערכי×!" ++ ++msgid "Sorry, the object you requested was not found." ++msgstr "סליחה, ×ך ×”×ובייקט שביקשת ×ינו נמצ×." ++ ++msgid "Sorry, the server encountered an unexpected error." ++msgstr "סליחה, השרת נתקל בשגי××” ×œ× ×¦×¤×•×™×”." ++ ++#, fuzzy ++msgid "" ++"Sorry, there is no sysupgrade support present; a new firmware image must be " ++"flashed manually. Please refer to the OpenWrt wiki for device specific " ++"install instructions." ++msgstr "" ++"סליחה, ×ין תמיכה בעדכון מערכת, ולכן קושחה חדשה חייבת להיצרב ידנית. ×× × ×¤× ×” " ++"×ל ×”-wiki של OpenWrt עבור הור×ות ספציפיות למכשיר שלך." ++ ++msgid "Sort" ++msgstr "מיין" ++ ++msgid "Source" ++msgstr "מקור" ++ ++msgid "Source routing" ++msgstr "" ++ ++msgid "Specifies the button state to handle" ++msgstr "" ++ ++msgid "Specifies the directory the device is attached to" ++msgstr "" ++ ++msgid "Specifies the listening port of this Dropbear instance" ++msgstr "" ++ ++msgid "" ++"Specifies the maximum amount of failed ARP requests until hosts are presumed " ++"to be dead" ++msgstr "" ++ ++msgid "" ++"Specifies the maximum amount of seconds after which hosts are presumed to be " ++"dead" ++msgstr "" ++ ++msgid "Specify the secret encryption key here." ++msgstr "" ++ ++msgid "Start" ++msgstr "" ++ ++msgid "Start priority" ++msgstr "" ++ ++msgid "Startup" ++msgstr "×תחול" ++ ++msgid "Static IPv4 Routes" ++msgstr "ניתובי IPv4 סטטיי×" ++ ++msgid "Static IPv6 Routes" ++msgstr "ניתובי IPv6 סטטיי×" ++ ++msgid "Static Leases" ++msgstr "הקצ×ות סטטיות" ++ ++msgid "Static Routes" ++msgstr "× ×™×ª×•×‘×™× ×¡×˜×˜×™×™×" ++ ++msgid "Static WDS" ++msgstr "WDS סטטי" ++ ++msgid "Static address" ++msgstr "כתובת סטטית" ++ ++msgid "" ++"Static leases are used to assign fixed IP addresses and symbolic hostnames " ++"to DHCP clients. They are also required for non-dynamic interface " ++"configurations where only hosts with a corresponding lease are served." ++msgstr "" ++"הקצ×ות סטטיות נועדו להקצות כתובות IP קבועות ו×ת ×©× ×”×¨×©×ª שלהן ללקוחות DHCP. " ++"הן נחוצות ×’× ×¢×‘×•×¨ הגדרות ממשק ש×ינן דינ×מיות, בהן מטופלות רק ישויות בעלות " ++"הקצ××” מת×ימה." ++ ++msgid "Status" ++msgstr "מצב" ++ ++msgid "Stop" ++msgstr "עצור" ++ ++msgid "Strict order" ++msgstr "" ++ ++msgid "Submit" ++msgstr "שלח" ++ ++msgid "Swap" ++msgstr "" ++ ++msgid "Swap Entry" ++msgstr "" ++ ++msgid "Switch" ++msgstr "" ++ ++msgid "Switch %q" ++msgstr "" ++ ++msgid "Switch %q (%s)" ++msgstr "" ++ ++msgid "Switch protocol" ++msgstr "" ++ ++msgid "Sync with browser" ++msgstr "" ++ ++msgid "Synchronizing..." ++msgstr "" ++ ++msgid "System" ++msgstr "" ++ ++msgid "System Log" ++msgstr "" ++ ++msgid "System Properties" ++msgstr "" ++ ++msgid "System log buffer size" ++msgstr "" ++ ++msgid "TCP:" ++msgstr "TCP:" ++ ++msgid "TFTP Settings" ++msgstr "הגדרות TFTP" ++ ++msgid "TFTP server root" ++msgstr "" ++ ++msgid "TX" ++msgstr "שידור" ++ ++msgid "TX Rate" ++msgstr "קצב שידור" ++ ++msgid "Table" ++msgstr "טבלה" ++ ++msgid "Target" ++msgstr "יעד" ++ ++msgid "Terminate" ++msgstr "" ++ ++msgid "" ++"The Device Configuration section covers physical settings of the " ++"radio hardware such as channel, transmit power or antenna selection which " ++"are shared among all defined wireless networks (if the radio hardware is " ++"multi-SSID capable). Per network settings like encryption or operation mode " ++"are grouped in the Interface Configuration." ++msgstr "" ++ ++msgid "" ++"The libiwinfo-lua package is not installed. You must install this " ++"component for working wireless configuration!" ++msgstr "" ++ ++msgid "" ++"The HE.net endpoint update configuration changed, you must now use the plain " ++"username instead of the user ID!" ++msgstr "" ++ ++msgid "" ++"The IPv6 prefix assigned to the provider, usually ends with ::" ++msgstr "" ++ ++msgid "" ++"The allowed characters are: A-Z, a-z, 0-9 and _" ++msgstr "" ++ ++msgid "The configuration file could not be loaded due to the following error:" ++msgstr "" ++ ++msgid "" ++"The device file of the memory or partition (e.g." ++" /dev/sda1)" ++msgstr "" ++ ++msgid "" ++"The filesystem that was used to format the memory (e.g. ext3)" ++msgstr "" ++ ++msgid "" ++"The flash image was uploaded. Below is the checksum and file size listed, " ++"compare them with the original file to ensure data integrity.
    Click " ++"\"Proceed\" below to start the flash procedure." ++msgstr "" ++ ++msgid "The following changes have been committed" ++msgstr "" ++ ++msgid "The following changes have been reverted" ++msgstr "" ++ ++msgid "The following rules are currently active on this system." ++msgstr "×”×—×•×§×™× ×”×‘××™× ×ž××•×¤×©×¨×™× ×›×¨×’×¢ במערכת זו." ++ ++msgid "The given network name is not unique" ++msgstr "×”×©× ×©× ×™×ª×Ÿ לרשת ×יננו ייחודי" ++ ++#, fuzzy ++msgid "" ++"The hardware is not multi-SSID capable and the existing configuration will " ++"be replaced if you proceed." ++msgstr "החומרה ××™× ×” תומכת בריבוי SSID ולכן ההגדרות הנוכחיות יוחלפו ×× ×ª×ž×©×™×š." ++ ++msgid "" ++"The length of the IPv4 prefix in bits, the remainder is used in the IPv6 " ++"addresses." ++msgstr "" ++ ++msgid "The length of the IPv6 prefix in bits" ++msgstr "" ++ ++msgid "" ++"The network ports on this device can be combined to several VLANs in which computers can " ++"communicate directly with each other. VLANs are often used to separate different network " ++"segments. Often there is by default one Uplink port for a connection to the " ++"next greater network like the internet and other ports for a local network." ++msgstr "" ++ ++msgid "The selected protocol needs a device assigned" ++msgstr "" ++ ++msgid "" ++"The system is erasing the configuration partition now and will reboot itself " ++"when finished." ++msgstr "" ++ ++msgid "" ++"The system is flashing now.
    DO NOT POWER OFF THE DEVICE!
    Wait a " ++"few minutes before you try to reconnect. It might be necessary to renew the " ++"address of your computer to reach the device again, depending on your " ++"settings." ++msgstr "" ++ ++msgid "" ++"The tunnel end-point is behind NAT, defaults to disabled and only applies to " ++"AYIYA" ++msgstr "" ++ ++msgid "" ++"The uploaded image file does not contain a supported format. Make sure that " ++"you choose the generic image format for your platform." ++msgstr "" ++ ++msgid "There are no active leases." ++msgstr "" ++ ++msgid "There are no pending changes to apply!" ++msgstr "" ++ ++msgid "There are no pending changes to revert!" ++msgstr "" ++ ++msgid "There are no pending changes!" ++msgstr "" ++ ++msgid "" ++"There is no device assigned yet, please attach a network device in the " ++"\"Physical Settings\" tab" ++msgstr "" ++ ++msgid "" ++"There is no password set on this router. Please configure a root password to " ++"protect the web interface and enable SSH." ++msgstr "" ++ ++msgid "This IPv4 address of the relay" ++msgstr "" ++ ++msgid "" ++"This is a list of shell glob patterns for matching files and directories to " ++"include during sysupgrade. Modified files in /etc/config/ and certain other " ++"configurations are automatically preserved." ++msgstr "" ++ ++msgid "" ++"This is either the \"Update Key\" configured for the tunnel or the account " ++"password if no update key has been configured" ++msgstr "" ++ ++msgid "" ++"This is the content of /etc/rc.local. Insert your own commands here (in " ++"front of 'exit 0') to execute them at the end of the boot process." ++msgstr "" ++ ++msgid "" ++"This is the local endpoint address assigned by the tunnel broker, it usually " ++"ends with :2" ++msgstr "" ++ ++msgid "" ++"This is the only DHCP in the local network" ++msgstr "" ++ ++msgid "This is the plain username for logging into the account" ++msgstr "" ++ ++msgid "" ++"This is the prefix routed to you by the tunnel broker for use by clients" ++msgstr "" ++ ++msgid "This is the system crontab in which scheduled tasks can be defined." ++msgstr "" ++ ++msgid "" ++"This is usually the address of the nearest PoP operated by the tunnel broker" ++msgstr "" ++ ++msgid "" ++"This list gives an overview over currently running system processes and " ++"their status." ++msgstr "רשימה זו מציגה סקירה של תהליכי המערכת ×”×¨×¦×™× ×›×¨×’×¢ ו×ת מצב×." ++ ++msgid "This page allows the configuration of custom button actions" ++msgstr "דף ×–×” מ×פשר להגדיר פעולות מיוחדות עבור הלחצני×." ++ ++msgid "This page gives an overview over currently active network connections." ++msgstr "דף ×–×” מציג סקירה של חיבורי הרשת ×”×¤×¢×™×œ×™× ×›×¨×’×¢." ++ ++msgid "This section contains no values yet" ++msgstr "×זור ×–×” עדיין ×œ× ×ž×›×™×œ ערכי×." ++ ++msgid "Time Synchronization" ++msgstr "סנכרון זמן" ++ ++msgid "Time Synchronization is not configured yet." ++msgstr "סנכרון זמן עדיין ×œ× ×”×•×’×“×¨." ++ ++msgid "Timezone" ++msgstr "×זור זמן" ++ ++msgid "" ++"To restore configuration files, you can upload a previously generated backup " ++"archive here." ++msgstr "" ++"על מנת לשחזר ×ת קבצי ההגדרות, ב×פשרותך להעלות ×רכיון גיבוי שנוצר לפני כן." ++ ++msgid "Total Available" ++msgstr "סה\"×› פנוי" ++ ++msgid "Traceroute" ++msgstr "" ++ ++msgid "Traffic" ++msgstr "תעבורה" ++ ++msgid "Transfer" ++msgstr "העברה" ++ ++msgid "Transmission Rate" ++msgstr "קצב שידור" ++ ++msgid "Transmit" ++msgstr "שידור" ++ ++msgid "Transmit Power" ++msgstr "עוצמת שידור" ++ ++msgid "Transmitter Antenna" ++msgstr "×נטנת שידור" ++ ++msgid "Trigger" ++msgstr "" ++ ++msgid "Trigger Mode" ++msgstr "" ++ ++msgid "Tunnel ID" ++msgstr "" ++ ++msgid "Tunnel Interface" ++msgstr "" ++ ++msgid "Tunnel Link" ++msgstr "" ++ ++msgid "Tunnel broker protocol" ++msgstr "" ++ ++msgid "Tunnel setup server" ++msgstr "" ++ ++msgid "Tunnel type" ++msgstr "" ++ ++msgid "Turbo Mode" ++msgstr "" ++ ++msgid "Tx-Power" ++msgstr "עוצמת שידור" ++ ++msgid "Type" ++msgstr "" ++ ++msgid "UDP:" ++msgstr "UDP:" ++ ++msgid "UMTS only" ++msgstr "" ++ ++msgid "UMTS/GPRS/EV-DO" ++msgstr "" ++ ++msgid "USB Device" ++msgstr "" ++ ++msgid "UUID" ++msgstr "" ++ ++msgid "Unable to dispatch" ++msgstr "" ++ ++msgid "Unknown" ++msgstr "" ++ ++msgid "Unknown Error, password not changed!" ++msgstr "" ++ ++msgid "Unmanaged" ++msgstr "" ++ ++msgid "Unsaved Changes" ++msgstr "" ++ ++msgid "Unsupported protocol type." ++msgstr "" ++ ++msgid "Update lists" ++msgstr "" ++ ++msgid "" ++"Upload a sysupgrade-compatible image here to replace the running firmware. " ++"Check \"Keep settings\" to retain the current configuration (requires an " ++"OpenWrt compatible firmware image)." ++msgstr "" ++ ++msgid "Upload archive..." ++msgstr "" ++ ++msgid "Uploaded File" ++msgstr "" ++ ++msgid "Uptime" ++msgstr "" ++ ++msgid "Use /etc/ethers" ++msgstr "" ++ ++msgid "Use DHCP gateway" ++msgstr "" ++ ++msgid "Use DNS servers advertised by peer" ++msgstr "" ++ ++msgid "Use ISO/IEC 3166 alpha2 country codes." ++msgstr "" ++ ++msgid "Use MTU on tunnel interface" ++msgstr "" ++ ++msgid "Use TTL on tunnel interface" ++msgstr "" ++ ++msgid "Use as external overlay (/overlay)" ++msgstr "" ++ ++msgid "Use as root filesystem (/)" ++msgstr "" ++ ++msgid "Use broadcast flag" ++msgstr "השתמש בדגל broadcast" ++ ++msgid "Use builtin IPv6-management" ++msgstr "" ++ ++msgid "Use custom DNS servers" ++msgstr "השתמש בשרתי DNS מות××ž×™× ×ישית" ++ ++msgid "Use default gateway" ++msgstr "" ++ ++msgid "Use gateway metric" ++msgstr "" ++ ++msgid "Use routing table" ++msgstr "השתמש בטבלת ניתוב" ++ ++msgid "" ++"Use the Add Button to add a new lease entry. The MAC-Address indentifies the host, the IPv4-Address specifies to the fixed " ++"address to use and the Hostname is assigned as symbolic name to the " ++"requesting host." ++msgstr "" ++ ++msgid "Used" ++msgstr "" ++ ++msgid "Used Key Slot" ++msgstr "" ++ ++msgid "User certificate (PEM encoded)" ++msgstr "" ++ ++msgid "User key (PEM encoded)" ++msgstr "" ++ ++msgid "Username" ++msgstr "×©× ×ž×©×ª×ž×©" ++ ++msgid "VC-Mux" ++msgstr "" ++ ++msgid "VLAN Interface" ++msgstr "" ++ ++msgid "VLANs on %q" ++msgstr "" ++ ++msgid "VLANs on %q (%s)" ++msgstr "" ++ ++msgid "VPN Server" ++msgstr "שרת VPN" ++ ++msgid "VPN Server port" ++msgstr "" ++ ++msgid "VPN Server's certificate SHA1 hash" ++msgstr "" ++ ++msgid "Vendor Class to send when requesting DHCP" ++msgstr "" ++ ++msgid "Verbose" ++msgstr "" ++ ++msgid "Verbose logging by aiccu daemon" ++msgstr "" ++ ++msgid "Verify" ++msgstr "" ++ ++msgid "Version" ++msgstr "גרסה" ++ ++msgid "WDS" ++msgstr "" ++ ++msgid "WEP Open System" ++msgstr "" ++ ++msgid "WEP Shared Key" ++msgstr "" ++ ++msgid "WEP passphrase" ++msgstr "סיסמת WEP" ++ ++msgid "WMM Mode" ++msgstr "" ++ ++msgid "WPA passphrase" ++msgstr "סיסמת WPA" ++ ++msgid "" ++"WPA-Encryption requires wpa_supplicant (for client mode) or hostapd (for AP " ++"and ad-hoc mode) to be installed." ++msgstr "" ++ ++msgid "" ++"Wait for NTP sync that many seconds, seting to 0 disables waiting (optional)" ++msgstr "" ++ ++msgid "Waiting for changes to be applied..." ++msgstr "" ++ ++msgid "Waiting for command to complete..." ++msgstr "" ++ ++msgid "Warning" ++msgstr "×זהרה" ++ ++msgid "Warning: There are unsaved changes that will be lost while rebooting!" ++msgstr "×זהרה: ×™×©× × ×©×™× ×•×™×™× ×©×œ× × ×©×ž×¨×• וי×בדו בעת הפעלה מחדש!" ++ ++msgid "Whether to create an IPv6 default route over the tunnel" ++msgstr "" ++ ++msgid "Whether to route only packets from delegated prefixes" ++msgstr "" ++ ++msgid "Width" ++msgstr "" ++ ++msgid "Wifi" ++msgstr "Wifi" ++ ++msgid "Wireless" ++msgstr "" ++ ++msgid "Wireless Adapter" ++msgstr "" ++ ++msgid "Wireless Network" ++msgstr "" ++ ++msgid "Wireless Overview" ++msgstr "" ++ ++msgid "Wireless Security" ++msgstr "" ++ ++msgid "Wireless is disabled or not associated" ++msgstr "" ++ ++msgid "Wireless is restarting..." ++msgstr "" ++ ++msgid "Wireless network is disabled" ++msgstr "רשת ×לחוטית מנוטרלת" ++ ++msgid "Wireless network is enabled" ++msgstr "רשת ×לחוטית מ×ופשרת" ++ ++msgid "Wireless restarted" ++msgstr "" ++ ++msgid "Wireless shut down" ++msgstr "" ++ ++msgid "Write received DNS requests to syslog" ++msgstr "" ++ ++msgid "XR Support" ++msgstr "" ++ ++msgid "" ++"You can enable or disable installed init scripts here. Changes will applied " ++"after a device reboot.
    Warning: If you disable essential init " ++"scripts like \"network\", your device might become inaccessible!" ++msgstr "" ++ ++msgid "" ++"You must enable Java Script in your browser or LuCI will not work properly." ++msgstr "×תה חייב להפעיל ×ת Java Script בדפדפן שלך; ×חרת, LuCI ×œ× ×™×¤×¢×œ כר×וי." ++ ++msgid "" ++"Your Internet Explorer is too old to display this page correctly. Please " ++"upgrade it to at least version 7 or use another browser like Firefox, Opera " ++"or Safari." ++msgstr "" ++ ++msgid "any" ++msgstr "כלשהו" ++ ++msgid "auto" ++msgstr "×וטומטי" ++ ++msgid "automatic" ++msgstr "" ++ ++msgid "baseT" ++msgstr "" ++ ++msgid "bridged" ++msgstr "" ++ ++msgid "create:" ++msgstr "" ++ ++msgid "creates a bridge over specified interface(s)" ++msgstr "" ++ ++msgid "dB" ++msgstr "" ++ ++msgid "dBm" ++msgstr "" ++ ++msgid "disable" ++msgstr "בטל" ++ ++msgid "disabled" ++msgstr "" ++ ++msgid "expired" ++msgstr "" ++ ++msgid "" ++"file where given DHCP-leases will be stored" ++msgstr "" ++ ++msgid "forward" ++msgstr "קדימה" ++ ++msgid "full-duplex" ++msgstr "" ++ ++msgid "half-duplex" ++msgstr "" ++ ++msgid "help" ++msgstr "עזרה" ++ ++msgid "hidden" ++msgstr "" ++ ++msgid "hybrid mode" ++msgstr "" ++ ++msgid "if target is a network" ++msgstr "×× ×”×™×¢×“ ×”×•× ×¨×©×ª" ++ ++msgid "input" ++msgstr "קלט" ++ ++msgid "kB" ++msgstr "" ++ ++msgid "kB/s" ++msgstr "" ++ ++msgid "kbit/s" ++msgstr "" ++ ++msgid "local DNS file" ++msgstr "" ++ ++msgid "minimum 1280, maximum 1480" ++msgstr "" ++ ++msgid "navigation Navigation" ++msgstr "" ++ ++msgid "no" ++msgstr "ל×" ++ ++msgid "no link" ++msgstr "" ++ ++msgid "none" ++msgstr "לל×" ++ ++msgid "not present" ++msgstr "" ++ ++msgid "off" ++msgstr "כבוי" ++ ++msgid "on" ++msgstr "פועל" ++ ++msgid "open" ++msgstr "" ++ ++msgid "overlay" ++msgstr "" ++ ++msgid "relay mode" ++msgstr "" ++ ++msgid "routed" ++msgstr "מנותב" ++ ++msgid "server mode" ++msgstr "" ++ ++msgid "skiplink1 Skip to navigation" ++msgstr "" ++ ++msgid "skiplink2 Skip to content" ++msgstr "" ++ ++msgid "stateful-only" ++msgstr "" ++ ++msgid "stateless" ++msgstr "" ++ ++msgid "stateless + stateful" ++msgstr "" ++ ++msgid "tagged" ++msgstr "מתויג" ++ ++msgid "unknown" ++msgstr "" ++ ++msgid "unlimited" ++msgstr "×œ×œ× ×”×’×‘×œ×”" ++ ++msgid "unspecified" ++msgstr "×œ× ×ž×•×’×“×¨" ++ ++msgid "unspecified -or- create:" ++msgstr "×œ× ×ž×•×’×“×¨ -×ו- יצר" ++ ++msgid "untagged" ++msgstr "×œ× ×ž×ª×•×™×’" ++ ++msgid "yes" ++msgstr "כן" ++ ++msgid "« Back" ++msgstr "<< ×חורה" ++ ++#~ msgid "Cached" ++#~ msgstr "שמור במטמון" ++ ++#~ msgid "40MHz 2nd channel above" ++#~ msgstr "40Mhz, הערוץ הנוסף מעל" ++ ++#~ msgid "40MHz 2nd channel below" ++#~ msgstr "40Mhz, הערוץ הנוסף מתחת" ++ ++#~ msgid "Accept router advertisements" ++#~ msgstr "×פשר פרסומות נתב" ++ ++#~ msgid "Advertise IPv6 on network" ++#~ msgstr "×¤×¨×¡× IPv6 ברשת" ++ ++# זהות? ++#, fuzzy ++#~ msgid "Advertised network ID" ++#~ msgstr "×¤×¨×¡× ×¤×¨×˜×™ זהות של הרשת" ++ ++#~ msgid "Allowed range is 1 to 65535" ++#~ msgstr "הטווח המורשה ×”×•× 1 עד 65535" ++ ++#~ msgid "Freifunk" ++#~ msgstr "×ריג" ++ ++#~ msgid "Wifi networks in your local environment" ++#~ msgstr "רשתות Wifi בסביבתך" ++ ++#~ msgid "static" ++#~ msgstr "סטטי" +diff --git a/feeds/luci/modules/luci-base/po/hu/base.po b/feeds/luci/modules/luci-base/po/hu/base.po +new file mode 100644 +index 0000000..975bf2d +--- /dev/null ++++ b/feeds/luci/modules/luci-base/po/hu/base.po +@@ -0,0 +1,3536 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"PO-Revision-Date: 2014-01-31 09:59+0200\n" ++"Last-Translator: Gabor \n" ++"Language-Team: none\n" ++"Language: hu\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n != 1);\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "(%d minute window, %d second interval)" ++msgstr "(%d perces ablak, %d másodperces intervallum)" ++ ++msgid "(%s available)" ++msgstr "(%s elérhetÅ‘)" ++ ++msgid "(empty)" ++msgstr "(üres)" ++ ++msgid "(no interfaces attached)" ++msgstr "(nincs csatalkoztatott interfész)" ++ ++msgid "-- Additional Field --" ++msgstr "-- További mezÅ‘ --" ++ ++msgid "-- Please choose --" ++msgstr "-- Kérem válasszon --" ++ ++msgid "-- custom --" ++msgstr "-- egyéni --" ++ ++msgid "-- match by device --" ++msgstr "" ++ ++msgid "-- match by label --" ++msgstr "" ++ ++msgid "1 Minute Load:" ++msgstr "Terhelés (utolsó 1 perc):" ++ ++msgid "15 Minute Load:" ++msgstr "Terhelés (utolsó 15 perc):" ++ ++msgid "5 Minute Load:" ++msgstr "Terhelés (utolsó 5 perc):" ++ ++msgid "BSSID" ++msgstr "BSSID" ++ ++msgid "DNS query port" ++msgstr "DNS lekérdezési port" ++ ++msgid "DNS server port" ++msgstr "DNS szerver port" ++ ++msgid "" ++"DNS servers will be queried in the " ++"order of the resolvfile" ++msgstr "" ++"DNS szerverek a resolv fájl " ++"sorrendjében" ++ ++msgid "ESSID" ++msgstr "ESSID" ++ ++msgid "IPv4-Address" ++msgstr "IPv4-cím" ++ ++msgid "IPv4-Gateway" ++msgstr "IPv4-útválasztó" ++ ++msgid "IPv4-Netmask" ++msgstr "IPv4-Netmask" ++ ++msgid "" ++"IPv6-Address or Network " ++"(CIDR)" ++msgstr "" ++"IPv6-cím, vagy hálózat " ++"(CIDR)" ++ ++msgid "IPv6-Gateway" ++msgstr "IPv6-útválasztó" ++ ++msgid "IPv6-Suffix (hex)" ++msgstr "" ++ ++msgid "LED Configuration" ++msgstr "LED konfiguráció" ++ ++msgid "LED Name" ++msgstr "LED Név" ++ ++msgid "MAC-Address" ++msgstr "MAC-cím" ++ ++msgid "" ++"Max. DHCP leases" ++msgstr "" ++"Max. DHCP bérlés" ++ ++msgid "" ++"Max. EDNS0 packet size" ++msgstr "" ++"Max. EDNS0 csomagméret" ++ ++msgid "Max. concurrent queries" ++msgstr "Max. párhuzamos lekérdezés" ++ ++msgid "%s - %s" ++msgstr "%s - %s" ++ ++msgid "ADSL" ++msgstr "" ++ ++msgid "ADSL Status" ++msgstr "" ++ ++msgid "AICCU (SIXXS)" ++msgstr "" ++ ++msgid "APN" ++msgstr "APN" ++ ++msgid "AR Support" ++msgstr "AR Támogatás" ++ ++msgid "ARP retry threshold" ++msgstr "ARP újrapróbálkozási küszöbérték" ++ ++msgid "ATM Bridges" ++msgstr "ATM Hidak" ++ ++msgid "ATM Virtual Channel Identifier (VCI)" ++msgstr "ATM Virtuális Csatorna Azonosító (VCI)" ++ ++msgid "ATM Virtual Path Identifier (VPI)" ++msgstr "ATM Virtuális Út Azonosító (VPI)" ++ ++msgid "" ++"ATM bridges expose encapsulated ethernet in AAL5 connections as virtual " ++"Linux network interfaces which can be used in conjunction with DHCP or PPP " ++"to dial into the provider network." ++msgstr "" ++"Az ATM hidak az AAL5-be ágyazott ethernet kapcsolatokat mint virtuális Linux " ++"hálózati interfész mutatják, mely így DHCP-vel vagy PPP-vel összekapcsolva " ++"használható a szolgáltatói hálózatba történÅ‘ betárcsázáshoz." ++ ++msgid "ATM device number" ++msgstr "ATM eszközszám" ++ ++msgid "AYIYA" ++msgstr "" ++ ++msgid "Access Concentrator" ++msgstr "Elérési központ" ++ ++msgid "Access Point" ++msgstr "Hozzáférési pont" ++ ++msgid "Action" ++msgstr "Művelet" ++ ++msgid "Actions" ++msgstr "Műveletek" ++ ++msgid "Activate this network" ++msgstr "Hálózat aktiválása" ++ ++msgid "Active IPv4-Routes" ++msgstr "" ++"Aktív IPv4 útvonalak" ++ ++msgid "Active IPv6-Routes" ++msgstr "" ++"Aktív IPv6 útvonalak" ++ ++msgid "Active Connections" ++msgstr "Aktív kapcsolatok" ++ ++msgid "Active DHCP Leases" ++msgstr "Aktív DHCP bérletek" ++ ++msgid "Active DHCPv6 Leases" ++msgstr "Aktív DHCPv6 bérletek" ++ ++msgid "Ad-Hoc" ++msgstr "Ad-Hoc" ++ ++msgid "Add" ++msgstr "Hozzáadás" ++ ++msgid "Add local domain suffix to names served from hosts files" ++msgstr "" ++"Helyi tartomány utótag hozzáadása a hosts fájlokból kiszolgált nevekhez" ++ ++msgid "Add new interface..." ++msgstr "Új interfész hozzáadása..." ++ ++msgid "Additional Hosts files" ++msgstr "További 'hosts' fájlok" ++ ++msgid "Address" ++msgstr "Cím" ++ ++msgid "Address to access local relay bridge" ++msgstr "Helyi közvetítÅ‘ híd elérési címe" ++ ++msgid "Administration" ++msgstr "Adminisztráció" ++ ++msgid "Advanced Settings" ++msgstr "Haladó beállítások" ++ ++msgid "Alert" ++msgstr "Riasztás" ++ ++msgid "Allow SSH password authentication" ++msgstr "" ++"SSH jelszó hitelesítés engedélyezése" ++ ++msgid "Allow all except listed" ++msgstr "Összes engedélyezése a felsoroltakon kívül" ++ ++msgid "Allow listed only" ++msgstr "Csak a felsoroltak engedélyezése" ++ ++msgid "Allow localhost" ++msgstr "Lolcalhost engedélyezése" ++ ++msgid "Allow remote hosts to connect to local SSH forwarded ports" ++msgstr "" ++"Távoli hostok csatlakozásának engedélyezése a helyi SSH továbbított " ++"portokhoz." ++ ++msgid "Allow root logins with password" ++msgstr "root jelszavas bejelentkezésének engedélyezése" ++ ++msgid "Allow the root user to login with password" ++msgstr "Engedélyezi a root felhasználó jelszavas bejelentkezését" ++ ++msgid "" ++"Allow upstream responses in the 127.0.0.0/8 range, e.g. for RBL services" ++msgstr "" ++"A 127.0.0.0/8-as tartományba esÅ‘ DNS válaszok engedélyezése (pl. RBL " ++"szervizek)" ++ ++msgid "" ++"Also see Tunneling Comparison on SIXXS" ++msgstr "" ++ ++msgid "Always announce default router" ++msgstr "" ++ ++msgid "An additional network will be created if you leave this unchecked." ++msgstr "Amennyiben ezt jelöletlenül hagyja, egy további hálózat jön létre" ++ ++msgid "Announce as default router even if no public prefix is available." ++msgstr "" ++ ++msgid "Announced DNS domains" ++msgstr "" ++ ++msgid "Announced DNS servers" ++msgstr "" ++ ++msgid "Antenna 1" ++msgstr "1-es antenna" ++ ++msgid "Antenna 2" ++msgstr "2-es antenna" ++ ++msgid "Antenna Configuration" ++msgstr "Antenna beállítások" ++ ++msgid "Any zone" ++msgstr "Bármelyik zóna" ++ ++msgid "Apply" ++msgstr "Alkalmaz" ++ ++msgid "Applying changes" ++msgstr "Módosítások alkalmazása" ++ ++msgid "" ++"Assign a part of given length of every public IPv6-prefix to this interface" ++msgstr "" ++ ++msgid "Assign interfaces..." ++msgstr "Interfészek összekapcsolása..." ++ ++msgid "" ++"Assign prefix parts using this hexadecimal subprefix ID for this interface." ++msgstr "" ++ ++msgid "Associated Stations" ++msgstr "Kapcsolódó kliensek" ++ ++msgid "Atheros 802.11%s Wireless Controller" ++msgstr "Atheros 802.11%s vezeték-nélküli vezérlÅ‘" ++ ++msgid "AuthGroup" ++msgstr "" ++ ++msgid "Authentication" ++msgstr "Hitelesítés" ++ ++msgid "Authoritative" ++msgstr "Hiteles" ++ ++msgid "Authorization Required" ++msgstr "Hitelesítés szükséges" ++ ++msgid "Auto Refresh" ++msgstr "Automatikus frissítés" ++ ++msgid "Automatic" ++msgstr "" ++ ++msgid "Automatic Homenet (HNCP)" ++msgstr "" ++ ++msgid "Available" ++msgstr "ElérhetÅ‘" ++ ++msgid "Available packages" ++msgstr "ElérhetÅ‘ csomagok" ++ ++msgid "Average:" ++msgstr "Ãtlag:" ++ ++msgid "BSSID" ++msgstr "BSSID" ++ ++msgid "Back" ++msgstr "Vissza" ++ ++msgid "Back to Overview" ++msgstr "Vissza az áttekintéshez" ++ ++msgid "Back to configuration" ++msgstr "Vissza a beállításokhoz" ++ ++msgid "Back to overview" ++msgstr "Vissza az áttekintéshez" ++ ++msgid "Back to scan results" ++msgstr "Vissza a felderítési eredményekhez" ++ ++msgid "Background Scan" ++msgstr "Felderítés a háttérben" ++ ++msgid "Backup / Flash Firmware" ++msgstr "Mentés / Firmware frissítés" ++ ++msgid "Backup / Restore" ++msgstr "Mentés / Visszaállítás" ++ ++msgid "Backup file list" ++msgstr "Mentési fájl lista" ++ ++msgid "Bad address specified!" ++msgstr "Hibás címet adott meg!" ++ ++msgid "Band" ++msgstr "" ++ ++msgid "Behind NAT" ++msgstr "" ++ ++msgid "" ++"Below is the determined list of files to backup. It consists of changed " ++"configuration files marked by opkg, essential base files and the user " ++"defined backup patterns." ++msgstr "" ++"Alább található a biztonsági mentésbe kerülÅ‘ fájlok listája. A lista az opkg " ++"által megjelölt módosított konfigurációs fájlokból, fontos alapvetÅ‘ " ++"fájlokból valamint a felhasználó által megadott mintáknak megfelelÅ‘ " ++"fájlokból áll." ++ ++msgid "Bitrate" ++msgstr "Bitráta" ++ ++msgid "Bogus NX Domain Override" ++msgstr "Hamis NX tartomány felülbírálása" ++ ++msgid "Bridge" ++msgstr "Híd" ++ ++msgid "Bridge interfaces" ++msgstr "Híd interfészek" ++ ++msgid "Bridge unit number" ++msgstr "Híd eszközszám" ++ ++msgid "Bring up on boot" ++msgstr "Hozza fel a rendszer indításakor" ++ ++msgid "Broadcom 802.11%s Wireless Controller" ++msgstr "Broadcom 802.11%s vezeték-nélküli vezérlÅ‘" ++ ++msgid "Broadcom BCM%04x 802.11 Wireless Controller" ++msgstr "Broadcom BCM%04x 802.11 vezeték-nélküli vezérlÅ‘" ++ ++msgid "Buffered" ++msgstr "Ãtmeneti tárban van" ++ ++msgid "Buttons" ++msgstr "Gombok" ++ ++msgid "CA certificate; if empty it will be saved after the first connection." ++msgstr "" ++ ++msgid "CPU" ++msgstr "Processzor" ++ ++msgid "CPU usage (%)" ++msgstr "Processzor használat (%)" ++ ++msgid "Cancel" ++msgstr "Mégsem" ++ ++msgid "Category" ++msgstr "" ++ ++msgid "Chain" ++msgstr "Lánc" ++ ++msgid "Changes" ++msgstr "Módosítások" ++ ++msgid "Changes applied." ++msgstr "A módosítások alkalmazva." ++ ++msgid "Changes the administrator password for accessing the device" ++msgstr "" ++"Itt módosíthatja az eszköz eléréséhez szükséges adminisztrátori jelszót" ++ ++msgid "Channel" ++msgstr "Csatorna" ++ ++msgid "Check" ++msgstr "EllenÅ‘rzés" ++ ++msgid "Checksum" ++msgstr "EllenÅ‘rzÅ‘ összeg" ++ ++msgid "" ++"Choose the firewall zone you want to assign to this interface. Select " ++"unspecified to remove the interface from the associated zone or " ++"fill out the create field to define a new zone and attach the " ++"interface to it." ++msgstr "" ++"Válassza ki a tűzfal zónát amit hozzá akar rendelni ehhez az interfészhez. " ++"Válassza a nincs megadva elemet az interfésznek a hozzárendelt " ++"zónából történÅ‘ eltávolításához, vagy töltse ki az új mezÅ‘t új zóna " ++"megadásához és csatlakoztassa az interfészt ahhoz." ++ ++msgid "" ++"Choose the network(s) you want to attach to this wireless interface or fill " ++"out the create field to define a new network." ++msgstr "" ++"Válassza ki azokat a hálózatokat, amelyeket csatlakoztatni akar ehhez a " ++"vezetéknélküli interfészhez, vagy töltse ki az új mezÅ‘t egy új " ++"hálózat definiálásához." ++ ++msgid "Cipher" ++msgstr "Titkosító" ++ ++msgid "" ++"Click \"Generate archive\" to download a tar archive of the current " ++"configuration files. To reset the firmware to its initial state, click " ++"\"Perform reset\" (only possible with squashfs images)." ++msgstr "" ++"Kattintson az \"Archívum készítése\" gombra a jelenlegi konfiguráció tar " ++"archívumként történÅ‘ letöltéséhez. A firmware kezdeti állapotának " ++"visszaállításához kattintson a \"Visszaállítás végrehajtása\" gombra (csak " ++"squashfs image-ek esetén lehetséges)." ++ ++msgid "Client" ++msgstr "Ãœgyfél" ++ ++msgid "Client ID to send when requesting DHCP" ++msgstr "DHCP kérés során küldendÅ‘ kliens azonosító" ++ ++msgid "" ++"Close inactive connection after the given amount of seconds, use 0 to " ++"persist connection" ++msgstr "" ++"Inaktív kapcsolatok bezárása a megadott másodpercek után, használjon 0-t " ++"állandó kapcsolathoz" ++ ++msgid "Close list..." ++msgstr "Lista bezárása..." ++ ++msgid "Collecting data..." ++msgstr "Adatok összegyűjtése..." ++ ++msgid "Command" ++msgstr "Parancs" ++ ++msgid "Common Configuration" ++msgstr "Ãlatános beállítás" ++ ++msgid "Compression" ++msgstr "Tömörítés" ++ ++msgid "Configuration" ++msgstr "Beállítás" ++ ++msgid "Configuration applied." ++msgstr "Beállítások alkalmazva." ++ ++msgid "Configuration files will be kept." ++msgstr "A konfigurációs fájlok megmaradnak." ++ ++msgid "Confirmation" ++msgstr "MegerÅ‘sítés" ++ ++msgid "Connect" ++msgstr "Kapcsolódás" ++ ++msgid "Connected" ++msgstr "Kapcsolódva" ++ ++msgid "Connection Limit" ++msgstr "Kapcsolati korlát" ++ ++msgid "Connection to server fails when TLS cannot be used" ++msgstr "" ++ ++msgid "Connections" ++msgstr "Kapcsolatok" ++ ++msgid "Country" ++msgstr "Ország" ++ ++msgid "Country Code" ++msgstr "Országkód" ++ ++msgid "Cover the following interface" ++msgstr "A következÅ‘ interfészt tartalmazza" ++ ++msgid "Cover the following interfaces" ++msgstr "A következÅ‘ interfészeket tartalmazza" ++ ++msgid "Create / Assign firewall-zone" ++msgstr "Tűzfal zóna készítés / hozzárendelés" ++ ++msgid "Create Interface" ++msgstr "Új interfész" ++ ++msgid "Create a bridge over multiple interfaces" ++msgstr "Híd létrehozása több interfész között" ++ ++msgid "Critical" ++msgstr "Kritikus" ++ ++msgid "Cron Log Level" ++msgstr "Cron naplózási szint" ++ ++msgid "Custom Interface" ++msgstr "Egyéni interfész" ++ ++msgid "Custom delegated IPv6-prefix" ++msgstr "" ++ ++msgid "" ++"Customizes the behaviour of the device LEDs if possible." ++msgstr "" ++"Az eszköz LED-jei működésének " ++"testreszabása." ++ ++msgid "DHCP Leases" ++msgstr "DHCP bérletek" ++ ++msgid "DHCP Server" ++msgstr "DHCP kiszolgáló" ++ ++msgid "DHCP and DNS" ++msgstr "DHCP és DNS" ++ ++msgid "DHCP client" ++msgstr "DHCP ügyfél" ++ ++msgid "DHCP-Options" ++msgstr "DHCP beállítások" ++ ++msgid "DHCPv6 Leases" ++msgstr "DHCPv6 bérletek" ++ ++msgid "DHCPv6 client" ++msgstr "" ++ ++msgid "DHCPv6-Mode" ++msgstr "" ++ ++msgid "DHCPv6-Service" ++msgstr "" ++ ++msgid "DNS" ++msgstr "DNS" ++ ++msgid "DNS forwardings" ++msgstr "DNS továbbítások" ++ ++msgid "DNS-Label / FQDN" ++msgstr "" ++ ++msgid "DS-Lite AFTR address" ++msgstr "" ++ ++msgid "DUID" ++msgstr "DUID" ++ ++msgid "Debug" ++msgstr "Hibakeresés" ++ ++msgid "Default %d" ++msgstr "Alapértelmezés %d" ++ ++msgid "Default gateway" ++msgstr "Alapértelmezett átjáró" ++ ++msgid "Default route" ++msgstr "" ++ ++msgid "Default state" ++msgstr "Alapértelmezett állapot" ++ ++msgid "Define a name for this network." ++msgstr "Adja meg a hálózat nevét." ++ ++msgid "" ++"Define additional DHCP options, for example " ++"\"6,192.168.2.1,192.168.2.2\" which advertises different DNS " ++"servers to clients." ++msgstr "" ++"Adjon meg további DHCP opciókat, például \"6,192.168.2.1,192.168.2.2\", mely különbözÅ‘ DNS kiszolgálókat hirdet az ügyfelek részére." ++ ++msgid "Delete" ++msgstr "Törlés" ++ ++msgid "Delete this interface" ++msgstr "Interfész törlése" ++ ++msgid "Delete this network" ++msgstr "Hálózat törlése" ++ ++msgid "Description" ++msgstr "Leírás" ++ ++msgid "Design" ++msgstr "Megjelenés" ++ ++msgid "Destination" ++msgstr "Cél" ++ ++msgid "Device" ++msgstr "Eszköz" ++ ++msgid "Device Configuration" ++msgstr "Eszköz beállítások" ++ ++msgid "Diagnostics" ++msgstr "Diagnosztika" ++ ++msgid "Dial number" ++msgstr "" ++ ++msgid "Directory" ++msgstr "Könyvtár" ++ ++msgid "Disable" ++msgstr "Letiltás" ++ ++msgid "" ++"Disable DHCP for " ++"this interface." ++msgstr "" ++"DHCP tiltása ezen " ++"az interfészen." ++ ++msgid "Disable DNS setup" ++msgstr "DNS beállítás letiltása" ++ ++msgid "Disable HW-Beacon timer" ++msgstr "Hardveres beacon idÅ‘zítÅ‘ letiltása" ++ ++msgid "Disabled" ++msgstr "Letiltva" ++ ++msgid "Discard upstream RFC1918 responses" ++msgstr "BeérkezÅ‘ RFC1918 DHCP válaszok elvetése. " ++ ++msgid "Displaying only packages containing" ++msgstr "Csak azon csomagok megjelenítése, amelyek tartalmazzák" ++ ++msgid "Distance Optimization" ++msgstr "Távolság optimalizáció" ++ ++msgid "Distance to farthest network member in meters." ++msgstr "A hálózat legtávolabbi tagjának távolsága méterben." ++ ++msgid "Diversity" ++msgstr "Diverzitás" ++ ++msgid "" ++"Dnsmasq is a combined DHCP-Server and DNS-" ++"Forwarder for NAT " ++"firewalls" ++msgstr "" ++"A Dnsmasq egy kombinált DHCP-kiszolgáló és DNS-" ++"továbbító NAT tűzfalak " ++"számára" ++ ++msgid "Do not cache negative replies, e.g. for not existing domains" ++msgstr "" ++"Ne gyorsítótárazza a negatív válaszokat, pl. nem létezÅ‘ domain-ok esetén" ++ ++msgid "Do not forward requests that cannot be answered by public name servers" ++msgstr "" ++"Ne továbbítsa a publikus név szerverek által nem megválaszolható kéréseket" ++ ++msgid "Do not forward reverse lookups for local networks" ++msgstr "Ne továbbítson fordított keresési kéréseket a helyi hálózathoz" ++ ++msgid "Do not send probe responses" ++msgstr "Ne válaszoljon a szondázásra" ++ ++msgid "Domain required" ++msgstr "Tartomány szükséges" ++ ++msgid "Domain whitelist" ++msgstr "Tartomány fehérlista" ++ ++msgid "" ++"Don't forward DNS-Requests without " ++"DNS-Name" ++msgstr "" ++"Ne továbbítsa a DNS-név nélküli " ++"DNS-kéréseket " ++ ++msgid "Download and install package" ++msgstr "Csomag letöltése és telepítése" ++ ++msgid "Download backup" ++msgstr "Biztonsági mentés letöltése" ++ ++msgid "Dropbear Instance" ++msgstr "Dropbear példány" ++ ++msgid "" ++"Dropbear offers SSH network shell access " ++"and an integrated SCP server" ++msgstr "" ++"A Dropbear a hálózaton SSH hozzáférést " ++"tesz lehetÅ‘vé, valamint integrált SCP " ++"szolgáltatást nyújt." ++ ++msgid "Dual-Stack Lite (RFC6333)" ++msgstr "" ++ ++msgid "Dynamic DHCP" ++msgstr "" ++"Dinamikus DHCP" ++ ++msgid "Dynamic tunnel" ++msgstr "Dinamikus alagút" ++ ++msgid "" ++"Dynamically allocate DHCP addresses for clients. If disabled, only clients " ++"having static leases will be served." ++msgstr "" ++"Az ügyfelek számára kiosztott DHCP címek dinamikus lefoglalása. Letiltása " ++"esetén csak a statikus DHCP bérlettel rendelkezÅ‘ kliensek lesznek " ++"kiszolgálva." ++ ++msgid "EAP-Method" ++msgstr "EAP metódus" ++ ++msgid "Edit" ++msgstr "Szerkesztés" ++ ++msgid "" ++"Edit the raw configuration data above to fix any error and hit \"Save\" to " ++"reload the page." ++msgstr "" ++ ++msgid "Edit this interface" ++msgstr "Interfész szerkesztése" ++ ++msgid "Edit this network" ++msgstr "Hálózat szerkesztése" ++ ++msgid "Emergency" ++msgstr "Vészhelyzet" ++ ++msgid "Enable" ++msgstr "Engedélyezés" ++ ++msgid "Enable STP" ++msgstr "STP engedélyezése" ++ ++msgid "Enable HE.net dynamic endpoint update" ++msgstr "HE.net dinamikus végpont frissítésének engedélyezése" ++ ++msgid "Enable IPv6 negotiation on the PPP link" ++msgstr "IPv6 egyeztetés engedélyezése a PPP linken" ++ ++msgid "Enable Jumbo Frame passthrough" ++msgstr "Óriás keretek átengedésének engedélyezése" ++ ++msgid "Enable NTP client" ++msgstr "NTP-kliens engedélyezése" ++ ++msgid "Enable TFTP server" ++msgstr "TFTP kiszolgáló engedélyezése" ++ ++msgid "Enable VLAN functionality" ++msgstr "VLAN funkció engedélyezése" ++ ++msgid "Enable WPS pushbutton, requires WPA(2)-PSK" ++msgstr "" ++ ++msgid "Enable learning and aging" ++msgstr "Tanulás és aging engedélyezése" ++ ++msgid "Enable mirroring of incoming packets" ++msgstr "" ++ ++msgid "Enable mirroring of outgoing packets" ++msgstr "" ++ ++msgid "Enable this mount" ++msgstr "A csatolás engedélyezése" ++ ++msgid "Enable this swap" ++msgstr "A lapozó terület engedélyezése" ++ ++msgid "Enable/Disable" ++msgstr "Engedélyezés/Letiltás" ++ ++msgid "Enabled" ++msgstr "Engedélyezve" ++ ++msgid "Enables the Spanning Tree Protocol on this bridge" ++msgstr "A Spanning Tree prokoll engedélyezése erre a hídra" ++ ++msgid "Encapsulation mode" ++msgstr "Beágyazási mód" ++ ++msgid "Encryption" ++msgstr "Titkosítás" ++ ++msgid "Erasing..." ++msgstr "Törlés..." ++ ++msgid "Error" ++msgstr "Hiba" ++ ++msgid "Ethernet Adapter" ++msgstr "Ethernet adapter" ++ ++msgid "Ethernet Switch" ++msgstr "Ethernet switch" ++ ++msgid "Expand hosts" ++msgstr "Gépek kibontása" ++ ++msgid "Expires" ++msgstr "Lejárat" ++ ++#, fuzzy ++msgid "" ++"Expiry time of leased addresses, minimum is 2 minutes (2m)." ++msgstr "A bérelt címek lejárati ideje, a minimális érték 2 perc." ++ ++msgid "External" ++msgstr "" ++ ++msgid "External system log server" ++msgstr "KülsÅ‘ rendszernapló kiszolgáló" ++ ++msgid "External system log server port" ++msgstr "KülsÅ‘ rendszernapló kiszolgáló port" ++ ++msgid "Fast Frames" ++msgstr "Gyors keretek" ++ ++msgid "File" ++msgstr "Fájl" ++ ++msgid "Filename of the boot image advertised to clients" ++msgstr "A kliensek részére közzétett betöltö kép fájlneve" ++ ++msgid "Filesystem" ++msgstr "Fájlrendszer" ++ ++msgid "Filter" ++msgstr "SzűrÅ‘" ++ ++msgid "Filter private" ++msgstr "Privát kérések szűrése" ++ ++msgid "Filter useless" ++msgstr "Használhahatlan kérések szűrése" ++ ++msgid "Find and join network" ++msgstr "Hálózatok keresése és csatlakozás" ++ ++msgid "Find package" ++msgstr "Csomag keresése" ++ ++msgid "Finish" ++msgstr "Befejezés" ++ ++msgid "Firewall" ++msgstr "Tűzfal" ++ ++msgid "Firewall Settings" ++msgstr "Tűzfal Beállítások" ++ ++msgid "Firewall Status" ++msgstr "Tűzfal Ãllapot" ++ ++msgid "Firmware Version" ++msgstr "Tűzfal verzió" ++ ++msgid "Fixed source port for outbound DNS queries" ++msgstr "Rögzített forrás port a kimenÅ‘ DNS kérésekhez" ++ ++msgid "Flags" ++msgstr "Flag-ek" ++ ++msgid "Flash Firmware" ++msgstr "Firmware flash-elés" ++ ++msgid "Flash image..." ++msgstr "Flash image..." ++ ++msgid "Flash new firmware image" ++msgstr "Új firmware image flash-elése" ++ ++msgid "Flash operations" ++msgstr "Flash műveletek" ++ ++msgid "Flashing..." ++msgstr "Flash-elés..." ++ ++msgid "Force" ++msgstr "Kényszerítés" ++ ++msgid "Force CCMP (AES)" ++msgstr "CCMP (AES) kényszerítése" ++ ++msgid "Force DHCP on this network even if another server is detected." ++msgstr "" ++"DHCP kényszerítése ezen a hálózaton még akkor is ha van másik szerver " ++"észlelve." ++ ++msgid "Force TKIP" ++msgstr "TKIP kényszerítése" ++ ++msgid "Force TKIP and CCMP (AES)" ++msgstr "TKIP és CCMP (AES) kényszerítése" ++ ++msgid "Forward DHCP traffic" ++msgstr "DHCP forgalom továbbítás" ++ ++msgid "Forward broadcast traffic" ++msgstr "Broadcast forgalom továbbítás" ++ ++msgid "Forwarding mode" ++msgstr "Továbbítás módja" ++ ++msgid "Fragmentation Threshold" ++msgstr "Töredezettségi küszöb" ++ ++msgid "Frame Bursting" ++msgstr "Keretfűzés" ++ ++msgid "Free" ++msgstr "Szabad" ++ ++msgid "Free space" ++msgstr "Szabad hely" ++ ++msgid "GHz" ++msgstr "GHz" ++ ++msgid "GPRS only" ++msgstr "Csak GPRS" ++ ++msgid "Gateway" ++msgstr "Ãtjáró" ++ ++msgid "Gateway ports" ++msgstr "Ãtjáró portok" ++ ++msgid "General Settings" ++msgstr "Ãltalános beállítások" ++ ++msgid "General Setup" ++msgstr "Ãltalános beállítások" ++ ++msgid "Generate archive" ++msgstr "Archívum készítése" ++ ++msgid "Generic 802.11%s Wireless Controller" ++msgstr "Ãltalános 802.11%s vezeték-nélküli vezérlÅ‘" ++ ++msgid "Given password confirmation did not match, password not changed!" ++msgstr "A megadott jelszavak nem egyeznek, a jelszó nem lett megváltoztatva!" ++ ++msgid "Global network options" ++msgstr "" ++ ++msgid "Go to password configuration..." ++msgstr "Ugrás a jelszó beállításhoz..." ++ ++msgid "Go to relevant configuration page" ++msgstr "Ugrás a tárgyhoz tartozó beállításokhoz" ++ ++msgid "Guest" ++msgstr "" ++ ++msgid "HE.net password" ++msgstr "HE.net jelszó" ++ ++msgid "HE.net username" ++msgstr "" ++ ++msgid "Handler" ++msgstr "KezelÅ‘" ++ ++msgid "Hang Up" ++msgstr "Befejezés" ++ ++msgid "Heartbeat" ++msgstr "" ++ ++msgid "" ++"Here you can configure the basic aspects of your device like its hostname or " ++"the timezone." ++msgstr "" ++"Itt állíthatja be az eszköz alapvetÅ‘ tulajdonságait, mint például a gépnév " ++"vagy az idÅ‘zóna." ++ ++msgid "" ++"Here you can paste public SSH-Keys (one per line) for SSH public-key " ++"authentication." ++msgstr "" ++"Nyilvános kulcs alapú SSH azonosításhoz itt adhat meg nyilvános SSH " ++"kulcsokat (soronként egyet)." ++ ++msgid "Hermes 802.11b Wireless Controller" ++msgstr "Hermes 802.11b vezeték nélküli vezérlÅ‘" ++ ++msgid "Hide ESSID" ++msgstr "ESSID elrejtése" ++ ++msgid "Host entries" ++msgstr "Host bejegyzések" ++ ++msgid "Host expiry timeout" ++msgstr "Host lejárati idÅ‘" ++ ++msgid "Host-IP or Network" ++msgstr "Host-IP vagy hálózat" ++ ++msgid "Hostname" ++msgstr "Gépnév" ++ ++msgid "Hostname to send when requesting DHCP" ++msgstr "DHCP kérés során küldendÅ‘ gépnév" ++ ++msgid "Hostnames" ++msgstr "Gépnevek" ++ ++msgid "Hybrid" ++msgstr "" ++ ++msgid "IP address" ++msgstr "IP cím" ++ ++msgid "IPv4" ++msgstr "IPv4" ++ ++msgid "IPv4 Firewall" ++msgstr "IPv4 tűzfal" ++ ++msgid "IPv4 WAN Status" ++msgstr "IPv4 WAN állapot" ++ ++msgid "IPv4 address" ++msgstr "IPv4 cím" ++ ++msgid "IPv4 and IPv6" ++msgstr "IPv4 és IPv6" ++ ++msgid "IPv4 assignment length" ++msgstr "" ++ ++msgid "IPv4 broadcast" ++msgstr "IPv4 broadcast" ++ ++msgid "IPv4 gateway" ++msgstr "IPv4 átjáró" ++ ++msgid "IPv4 netmask" ++msgstr "IPv4 hálózati maszk" ++ ++msgid "IPv4 only" ++msgstr "csak IPv4" ++ ++msgid "IPv4 prefix length" ++msgstr "IPv4 prefix hossza" ++ ++msgid "IPv4-Address" ++msgstr "IPv4-cím" ++ ++msgid "IPv6" ++msgstr "IPv6" ++ ++msgid "IPv6 Firewall" ++msgstr "IPv6 tűzfal" ++ ++msgid "IPv6 Neighbours" ++msgstr "" ++ ++msgid "IPv6 Settings" ++msgstr "" ++ ++msgid "IPv6 ULA-Prefix" ++msgstr "" ++ ++msgid "IPv6 WAN Status" ++msgstr "IPv6 WAN állapot" ++ ++msgid "IPv6 address" ++msgstr "IPv6 cím" ++ ++msgid "IPv6 address delegated to the local tunnel endpoint (optional)" ++msgstr "" ++ ++msgid "IPv6 assignment hint" ++msgstr "" ++ ++msgid "IPv6 assignment length" ++msgstr "" ++ ++msgid "IPv6 gateway" ++msgstr "IPv6 átjáró" ++ ++msgid "IPv6 only" ++msgstr "csak IPv6" ++ ++msgid "IPv6 prefix" ++msgstr "IPv6 elÅ‘tag" ++ ++msgid "IPv6 prefix length" ++msgstr "IPv6 prefix hossz" ++ ++msgid "IPv6 routed prefix" ++msgstr "" ++ ++msgid "IPv6-Address" ++msgstr "IPv6-cím" ++ ++msgid "IPv6-in-IPv4 (RFC4213)" ++msgstr "IPv6 IPv4-ben (RFC4213)" ++ ++msgid "IPv6-over-IPv4 (6rd)" ++msgstr "IPv6 IPv4 felett (6rd)" ++ ++msgid "IPv6-over-IPv4 (6to4)" ++msgstr "IPv6 IPv4 felett (6to4)" ++ ++msgid "Identity" ++msgstr "Identitás" ++ ++msgid "" ++"If specified, mount the device by its UUID instead of a fixed device node" ++msgstr "" ++"Megadás esetén az eszköz csomópont helyett UUID alapján történÅ‘ csatolása" ++ ++msgid "" ++"If specified, mount the device by the partition label instead of a fixed " ++"device node" ++msgstr "" ++"Megadás esetén az eszköz csomópont helyett címke alapján történÅ‘ csatolása" ++ ++msgid "If unchecked, no default route is configured" ++msgstr "Ha nincs kiválasztva, akkor nincs alapértelmezett útvonal beállítva" ++ ++msgid "If unchecked, the advertised DNS server addresses are ignored" ++msgstr "" ++"Ha nincs kiválasztva, akkor a hirdetett DNS kiszolgáló címeket nem veszi " ++"figyelembe" ++ ++msgid "" ++"If your physical memory is insufficient unused data can be temporarily " ++"swapped to a swap-device resulting in a higher amount of usable RAM. Be aware that swapping data is a very " ++"slow process as the swap-device cannot be accessed with the high datarates " ++"of the RAM." ++msgstr "" ++"Ha a fizikai memória túl kevés a nem használt adatok ideiglenesen áttehetÅ‘k " ++"egy swap-eszközre mely így nagyobb mennyiségű használható RAM-ot eredményez. Az adatok áttétele egy " ++"nagyon lassú folyamat mivel a swap-eszköz nem érhetÅ‘ el akkora sebességgel " ++"mint a RAM." ++ ++msgid "Ignore Hosts files" ++msgstr "A hosts fájlok figyelmen kívül hagyása" ++ ++msgid "Ignore interface" ++msgstr "Interfész figyelmen kívül hagyása" ++ ++msgid "Ignore resolve file" ++msgstr "A resolve fájl figyelmen kívül hagyása" ++ ++msgid "Image" ++msgstr "Image" ++ ++msgid "In" ++msgstr "Be" ++ ++msgid "Inactivity timeout" ++msgstr "Inaktivitási idÅ‘túllépés" ++ ++msgid "Inbound:" ++msgstr "BejövÅ‘" ++ ++msgid "Info" ++msgstr "Információk" ++ ++msgid "Initscript" ++msgstr "Indítási állomány" ++ ++msgid "Initscripts" ++msgstr "Indítási állományok" ++ ++msgid "Install" ++msgstr "Telepítés" ++ ++msgid "Install iputils-traceroute6 for IPv6 traceroute" ++msgstr "" ++ ++msgid "Install package %q" ++msgstr "%q csomag telepítése" ++ ++msgid "Install protocol extensions..." ++msgstr "Protokoll kiterjesztések telepítése..." ++ ++msgid "Installed packages" ++msgstr "Telepített csomagok" ++ ++msgid "Interface" ++msgstr "Interfész" ++ ++msgid "Interface Configuration" ++msgstr "Interfész beállítások" ++ ++msgid "Interface Overview" ++msgstr "Interfész áttekintés" ++ ++msgid "Interface is reconnecting..." ++msgstr "Interfész újracsatlakoztatása..." ++ ++msgid "Interface is shutting down..." ++msgstr "Interfész leállítása..." ++ ++msgid "Interface not present or not connected yet." ++msgstr "Az interfész nincs jelen, vagy még nincs csatlakoztatva." ++ ++msgid "Interface reconnected" ++msgstr "Interfész újracsatlakoztatva" ++ ++msgid "Interface shut down" ++msgstr "Interfész leállítás" ++ ++msgid "Interfaces" ++msgstr "Interfészek" ++ ++msgid "Internal" ++msgstr "" ++ ++msgid "Internal Server Error" ++msgstr "BelsÅ‘ szerverhiba" ++ ++msgid "Invalid" ++msgstr "Érvénytelen" ++ ++msgid "Invalid VLAN ID given! Only IDs between %d and %d are allowed." ++msgstr "" ++"A megadott VLAN azonosító érvénytelen. Az azonosítónak %d és %d közé kell " ++"esnie." ++ ++msgid "Invalid VLAN ID given! Only unique IDs are allowed" ++msgstr "" ++"A megadott VLAN azonosító érvénytelen! Minden VLAN-hoz egyedi azonosító kell." ++ ++msgid "Invalid username and/or password! Please try again." ++msgstr "Érvénytelen felhasználói név és/vagy jelszó! Kérem próbálja újra!" ++ ++#, fuzzy ++msgid "" ++"It appears that you are trying to flash an image that does not fit into the " ++"flash memory, please verify the image file!" ++msgstr "" ++"Úgy tűnik, hogy a flash-elendÅ‘ kép-file nem fér el a Flash-memóriába. Kérem " ++"ellenÅ‘rizze a kép fájlt!" ++ ++msgid "Java Script required!" ++msgstr "Javascript szükséges!" ++ ++msgid "Join Network" ++msgstr "Csatlakozás a hálózathoz" ++ ++msgid "Join Network: Settings" ++msgstr "Csatlakozás a hálózathoz: Beállítások" ++ ++msgid "Join Network: Wireless Scan" ++msgstr "Csatlakozás a hálózathoz: vezetéknélküli hálózatok keresése" ++ ++msgid "Keep settings" ++msgstr "Beállítások megtartása" ++ ++msgid "Kernel Log" ++msgstr "Kernel napló" ++ ++msgid "Kernel Version" ++msgstr "Kernel verzió" ++ ++msgid "Key" ++msgstr "Kulcs" ++ ++msgid "Key #%d" ++msgstr "Kulcs #%d" ++ ++msgid "Kill" ++msgstr "Kilövés" ++ ++msgid "L2TP" ++msgstr "L2TP" ++ ++msgid "L2TP Server" ++msgstr "L2TP szerver" ++ ++msgid "LCP echo failure threshold" ++msgstr "LCP echo hibaküszöb" ++ ++msgid "LCP echo interval" ++msgstr "LCP Echo idÅ‘tartam" ++ ++msgid "LLC" ++msgstr "LLC" ++ ++msgid "Label" ++msgstr "Címke" ++ ++msgid "Language" ++msgstr "Nyelv" ++ ++msgid "Language and Style" ++msgstr "Nyelv és megjelenés" ++ ++msgid "Leaf" ++msgstr "" ++ ++msgid "Lease validity time" ++msgstr "Bérlet érvényességi ideje" ++ ++msgid "Leasefile" ++msgstr "Bérlet fájl" ++ ++msgid "Leasetime" ++msgstr "Bérlet idÅ‘tartama" ++ ++msgid "Leasetime remaining" ++msgstr "A bérletbÅ‘l hátralévÅ‘ idÅ‘" ++ ++msgid "Leave empty to autodetect" ++msgstr "Automatikus észleléshez hagyja üresen" ++ ++msgid "Leave empty to use the current WAN address" ++msgstr "A jelenlegi WAN cím használatához hagyja üresen" ++ ++msgid "Legend:" ++msgstr "Jelmagyarázat:" ++ ++msgid "Limit" ++msgstr "Korlát" ++ ++msgid "Line Attenuation" ++msgstr "" ++ ++msgid "Line Speed" ++msgstr "" ++ ++msgid "Line State" ++msgstr "" ++ ++msgid "Link On" ++msgstr "Kapcsolat létrehozva" ++ ++msgid "" ++"List of DNS servers to forward " ++"requests to" ++msgstr "" ++"DNS szerverek listája, ahová a " ++"kérések továbbításra kerülnek" ++ ++msgid "List of domains to allow RFC1918 responses for" ++msgstr "Domain-ok listája, melyeknél az RFC1918 válaszok megengedettek" ++ ++msgid "List of hosts that supply bogus NX domain results" ++msgstr "A hamis NX tartomány eredményeket szolgáltató gépek listája" ++ ++msgid "Listen only on the given interface or, if unspecified, on all" ++msgstr "" ++"Csak a megadott interfészen hallgat, vagy az összesen, amennyiben nem adja " ++"meg" ++ ++msgid "Listening port for inbound DNS queries" ++msgstr "Szerver port a beérkezÅ‘ DNS kérések számára" ++ ++msgid "Load" ++msgstr "Terhelés" ++ ++msgid "Load Average" ++msgstr "Ãtlagos terhelés" ++ ++msgid "Loading" ++msgstr "Betöltés" ++ ++msgid "Local IPv4 address" ++msgstr "Helyi IPv4 cím" ++ ++msgid "Local IPv6 address" ++msgstr "Helyi IPv6 cím" ++ ++msgid "Local Startup" ++msgstr "Helyi indítóscript" ++ ++msgid "Local Time" ++msgstr "Helyi idÅ‘" ++ ++msgid "Local domain" ++msgstr "Helyi tartomány" ++ ++#, fuzzy ++msgid "" ++"Local domain specification. Names matching this domain are never forwarded " ++"and are resolved from DHCP or hosts files only" ++msgstr "" ++"Helyi tartomány meghatározása. Az ezzel a tartománnyal egyezÅ‘ nevek soha " ++"nincsenek továbbítva és csak DHCP-n vagy host fájlok által kerülnek " ++"feloldásra" ++ ++msgid "Local domain suffix appended to DHCP names and hosts file entries" ++msgstr "" ++"A helyi tartomány utótag csatolása a DHCP nevekhez és hosts fájl " ++"bejegyzésekhez" ++ ++msgid "Local server" ++msgstr "Helyi kiszolgáló" ++ ++msgid "" ++"Localise hostname depending on the requesting subnet if multiple IPs are " ++"available" ++msgstr "" ++"Gépnév lokalizációja a lekérdezÅ‘ alhálózattól függÅ‘en, ha több IP cím is " ++"elérhetÅ‘" ++ ++msgid "Localise queries" ++msgstr "Lekérdezések lokalizációja" ++ ++msgid "Locked to channel %d used by: %s" ++msgstr "" ++ ++msgid "Log output level" ++msgstr "Napló kimeneti szintje" ++ ++msgid "Log queries" ++msgstr "Kérések naplózása" ++ ++msgid "Logging" ++msgstr "Naplózás" ++ ++msgid "Login" ++msgstr "Bejelentkezés" ++ ++msgid "Logout" ++msgstr "Kijelentkezés" ++ ++msgid "Lowest leased address as offset from the network address." ++msgstr "A legalacsonyabb bérleti címnek az interfész címétÅ‘l való távolsága" ++ ++msgid "MAC-Address" ++msgstr "MAC-cím" ++ ++msgid "MAC-Address Filter" ++msgstr "MAC-cím szűrÅ‘" ++ ++msgid "MAC-Filter" ++msgstr "MAC-szűrÅ‘" ++ ++msgid "MAC-List" ++msgstr "MAC-lista" ++ ++msgid "MB/s" ++msgstr "MB/s" ++ ++msgid "MHz" ++msgstr "MHz" ++ ++msgid "MTU" ++msgstr "MTU" ++ ++msgid "" ++"Make sure to clone the root filesystem using something like the commands " ++"below:" ++msgstr "" ++ ++msgid "Maximum Rate" ++msgstr "Maximális sebesség" ++ ++msgid "Maximum allowed number of active DHCP leases" ++msgstr "Aktív DHCP bérletek maximális száma" ++ ++msgid "Maximum allowed number of concurrent DNS queries" ++msgstr "Párhuzamos DNS kérések maximális száma" ++ ++msgid "Maximum allowed size of EDNS.0 UDP packets" ++msgstr "EDNS.0 UDP csomagok maximális mérete" ++ ++msgid "Maximum amount of seconds to wait for the modem to become ready" ++msgstr "Maximális várakozási idÅ‘ a modem kész állapotára (másodpercben)" ++ ++msgid "Maximum hold time" ++msgstr "Maximális tartási idÅ‘" ++ ++msgid "Maximum number of leased addresses." ++msgstr "DHCP címek maximális száma" ++ ++msgid "Mbit/s" ++msgstr "Mbit/s" ++ ++msgid "Memory" ++msgstr "Memória" ++ ++msgid "Memory usage (%)" ++msgstr "Memória használat (%)" ++ ++msgid "Metric" ++msgstr "Metrika" ++ ++msgid "Minimum Rate" ++msgstr "Minimális sebesség" ++ ++msgid "Minimum hold time" ++msgstr "Minimális tartási idÅ‘" ++ ++msgid "Mirror monitor port" ++msgstr "" ++ ++msgid "Mirror source port" ++msgstr "" ++ ++msgid "Missing protocol extension for proto %q" ++msgstr "Hiányzó protokoll kiterjesztés a %q progokoll számára" ++ ++msgid "Mode" ++msgstr "Mód" ++ ++msgid "Model" ++msgstr "" ++ ++msgid "Modem device" ++msgstr "Modemeszköz" ++ ++msgid "Modem init timeout" ++msgstr "Modem inicializálás idÅ‘túllépés" ++ ++msgid "Monitor" ++msgstr "EllenÅ‘rzés" ++ ++msgid "Mount Entry" ++msgstr "Csatolási bejegyzés" ++ ++msgid "Mount Point" ++msgstr "Csatolási pont" ++ ++msgid "Mount Points" ++msgstr "Csatolási pontok" ++ ++msgid "Mount Points - Mount Entry" ++msgstr "Csatolási pontok - Csatolási bejegyzés" ++ ++msgid "Mount Points - Swap Entry" ++msgstr "Csatolási pontok - Lapozóterület bejegyzés" ++ ++msgid "" ++"Mount Points define at which point a memory device will be attached to the " ++"filesystem" ++msgstr "" ++"A csatolási pontok határozzák meg, hogy egy memória eszköz hová lesz " ++"csatlakoztatva a fájlendszeren belül " ++ ++msgid "Mount options" ++msgstr "Csatolási beállítások" ++ ++msgid "Mount point" ++msgstr "Csatolási pont" ++ ++msgid "Mounted file systems" ++msgstr "Csatolt fájlrendszerek" ++ ++msgid "Move down" ++msgstr "Mozgatás lefelé" ++ ++msgid "Move up" ++msgstr "Mozgatás felfelé" ++ ++msgid "Multicast Rate" ++msgstr "Multicast sebesség" ++ ++msgid "Multicast address" ++msgstr "Multicast cím" ++ ++msgid "NAS ID" ++msgstr "NAS azonosító" ++ ++msgid "NDP-Proxy" ++msgstr "" ++ ++msgid "NTP server candidates" ++msgstr "Kijelölt NTP kiszolgálók" ++ ++msgid "NTP sync time-out" ++msgstr "" ++ ++msgid "Name" ++msgstr "Név" ++ ++msgid "Name of the new interface" ++msgstr "Az új interfész neve" ++ ++msgid "Name of the new network" ++msgstr "Az új hálózat neve" ++ ++msgid "Navigation" ++msgstr "Navigáció" ++ ++msgid "Netmask" ++msgstr "Hálózati maszk" ++ ++msgid "Network" ++msgstr "Hálózat" ++ ++msgid "Network Utilities" ++msgstr "Hálózati eszközök" ++ ++msgid "Network boot image" ++msgstr "Hálózati rendszertöltÅ‘ lemezkép" ++ ++msgid "Network without interfaces." ++msgstr "Interfészhez nem rendelt hálózat" ++ ++msgid "Next »" ++msgstr "KövetkezÅ‘ »" ++ ++msgid "No DHCP Server configured for this interface" ++msgstr "Ehhez az interfészhez nincs DHCP kiszolgáló beállítva" ++ ++msgid "No chains in this table" ++msgstr "Ez a tábla nem tartalmaz láncokat." ++ ++msgid "No files found" ++msgstr "Nem találhatók fájlok" ++ ++msgid "No information available" ++msgstr "Nincs elérhetÅ‘ információ" ++ ++msgid "No negative cache" ++msgstr "Nincs negatív gyorsítótár" ++ ++msgid "No network configured on this device" ++msgstr "Ehhez az eszközhöz nincs hálózat beállítva" ++ ++msgid "No network name specified" ++msgstr "Nincs megadva hálózatnév" ++ ++msgid "No package lists available" ++msgstr "Csomaglisták nem állnak rendelkezésre" ++ ++msgid "No password set!" ++msgstr "Nincs jelszó!" ++ ++msgid "No rules in this chain" ++msgstr "Ez a lánc nem tartalmaz szabályokat" ++ ++msgid "No zone assigned" ++msgstr "Nincs hozzárendelt zóna" ++ ++msgid "Noise" ++msgstr "Zaj" ++ ++msgid "Noise Margin" ++msgstr "" ++ ++msgid "Noise:" ++msgstr "Zaj:" ++ ++msgid "None" ++msgstr "Nincs" ++ ++msgid "Normal" ++msgstr "Normál" ++ ++msgid "Not Found" ++msgstr "Nem található" ++ ++msgid "Not associated" ++msgstr "Nincs hozzárendelve" ++ ++msgid "Not connected" ++msgstr "Nincs kapcsolódva" ++ ++msgid "Note: Configuration files will be erased." ++msgstr "Megjegyzés: konfigurációs fájlok törölve lesznek." ++ ++msgid "Notice" ++msgstr "Megjegyzés" ++ ++msgid "Nslookup" ++msgstr "Nslookup" ++ ++msgid "OK" ++msgstr "OK" ++ ++msgid "OPKG-Configuration" ++msgstr "OPKG-Beállítások" ++ ++msgid "Off-State Delay" ++msgstr "Kikapcsolt állapot késleltetés" ++ ++msgid "" ++"On this page you can configure the network interfaces. You can bridge " ++"several interfaces by ticking the \"bridge interfaces\" field and enter the " ++"names of several network interfaces separated by spaces. You can also use " ++"VLAN notation " ++"INTERFACE.VLANNR (e.g.: " ++"eth0.1)." ++msgstr "" ++"Ezen az oldalon a hálózati interfészeket állíthatja be. Több interfész " ++"között híd hozható létre a \"híd interfész\" mezÅ‘ bejelölésével és több " ++"hálózati interfész nevének szóközzel történÅ‘ elválasztásával. LehetÅ‘ség van " ++"VLAN jelölés " ++"INTERFÉSZ.VLANSZÃM használatára is, pl. eth0.1)." ++ ++msgid "On-State Delay" ++msgstr "Bekapcsolt állapot késleltetés" ++ ++msgid "One of hostname or mac address must be specified!" ++msgstr "Legalább gépnevet vagy MAC-címet meg kell adni!" ++ ++msgid "One or more fields contain invalid values!" ++msgstr "Egy vagy több mezÅ‘ érvénytelen adatot tartalmaz!" ++ ++msgid "One or more required fields have no value!" ++msgstr "Egy vagy több kötelezÅ‘en kitöltendÅ‘ mezÅ‘ üres!" ++ ++msgid "Open list..." ++msgstr "Lista megnyitása..." ++ ++msgid "OpenConnect (CISCO AnyConnect)" ++msgstr "" ++ ++msgid "Operating frequency" ++msgstr "" ++ ++msgid "Option changed" ++msgstr "Beállítás módosítva" ++ ++msgid "Option removed" ++msgstr "Beállítás eltávolítva" ++ ++msgid "Optional, specify to override default server (tic.sixxs.net)" ++msgstr "" ++ ++msgid "Optional, use when the SIXXS account has more than one tunnel" ++msgstr "" ++ ++msgid "Options" ++msgstr "LehetÅ‘ségek" ++ ++msgid "Other:" ++msgstr "Egyéb:" ++ ++msgid "Out" ++msgstr "Ki" ++ ++msgid "Outbound:" ++msgstr "KimenÅ‘:" ++ ++msgid "Outdoor Channels" ++msgstr "Kültéri csatornák" ++ ++msgid "Output Interface" ++msgstr "" ++ ++msgid "Override MAC address" ++msgstr "MAC cím felülbírálása" ++ ++msgid "Override MTU" ++msgstr "MTU felülbíráslás" ++ ++msgid "Override the gateway in DHCP responses" ++msgstr "Ãtjáró felülbírálása a DHCP válaszokban" ++ ++msgid "" ++"Override the netmask sent to clients. Normally it is calculated from the " ++"subnet that is served." ++msgstr "" ++"Az ügyfelek részére küldött hálózati masz felülbírálása. Ez alapesetben a " ++"kiszolgált alhálózat alapján kerül meghatározásra." ++ ++msgid "Override the table used for internal routes" ++msgstr "A belsÅ‘ útvonalakhoz használt tábla felülbírálása" ++ ++msgid "Overview" ++msgstr "Ãttekintés" ++ ++msgid "Owner" ++msgstr "Tulajdonos" ++ ++msgid "PAP/CHAP password" ++msgstr "PAP/CHAP jelszó" ++ ++msgid "PAP/CHAP username" ++msgstr "PAP/CHAP felhasználói név" ++ ++msgid "PID" ++msgstr "PID" ++ ++msgid "PIN" ++msgstr "PIN" ++ ++msgid "PPP" ++msgstr "PPP" ++ ++msgid "PPPoA Encapsulation" ++msgstr "PPPoA beágyazás" ++ ++msgid "PPPoATM" ++msgstr "PPPoATM" ++ ++msgid "PPPoE" ++msgstr "PPPoE" ++ ++msgid "PPtP" ++msgstr "PPtP" ++ ++msgid "Package libiwinfo required!" ++msgstr "A libiwinfo csomag szükséges!" ++ ++msgid "Package lists are older than 24 hours" ++msgstr "A csomag listák 24 óránál régebbiek" ++ ++msgid "Package name" ++msgstr "Csomagnév" ++ ++msgid "Packets" ++msgstr "Csomagok" ++ ++msgid "Part of zone %q" ++msgstr "A %q zóna része" ++ ++msgid "Password" ++msgstr "Jelszó" ++ ++msgid "Password authentication" ++msgstr "Jelszó hitelesítés" ++ ++msgid "Password of Private Key" ++msgstr "A privát kulcsh jelszava" ++ ++msgid "Password successfully changed!" ++msgstr "A jelszó megváltoztatása sikeres!" ++ ++msgid "Path" ++msgstr "" ++ ++msgid "Path to CA-Certificate" ++msgstr "CA tanúsítvány elérési útja" ++ ++msgid "Path to Client-Certificate" ++msgstr "Kliens tanúsítvány elérési útja" ++ ++msgid "Path to Private Key" ++msgstr "A privát kulcs elérési útja" ++ ++msgid "Path to executable which handles the button event" ++msgstr "A gomb eseményeit kezelÅ‘ végrehajtható állomány elérési útja" ++ ++msgid "Peak:" ++msgstr "Csúcs:" ++ ++msgid "Perform reboot" ++msgstr "Újraindítás végrehajtása" ++ ++msgid "Perform reset" ++msgstr "Visszaállítás végrehajtása" ++ ++msgid "Phy Rate:" ++msgstr "Phy sebesség:" ++ ++msgid "Physical Settings" ++msgstr "Fizikai beállítások" ++ ++msgid "Ping" ++msgstr "Ping" ++ ++msgid "Pkts." ++msgstr "csom." ++ ++msgid "Please enter your username and password." ++msgstr "Adja meg a felhasználónevét és a jelszavát." ++ ++msgid "Please wait: Device rebooting..." ++msgstr "Kérem várjon: az eszköz újraindul..." ++ ++msgid "Policy" ++msgstr "Szabály" ++ ++msgid "Port" ++msgstr "Port" ++ ++msgid "Port %d" ++msgstr "Port %d" ++ ++msgid "Port %d is untagged in multiple VLANs!" ++msgstr "A %d port egyszerre több VLAN-ban is cimkézetlen!" ++ ++msgid "Port status:" ++msgstr "Port állapot:" ++ ++msgid "" ++"Presume peer to be dead after given amount of LCP echo failures, use 0 to " ++"ignore failures" ++msgstr "" ++"A peer halottnak tekintése a megadott számú LCP echo hibák után. Használjon " ++"0-t a hibák figyelmen kívül hagyásához." ++ ++msgid "Prevents client-to-client communication" ++msgstr "Ãœgyfél-ügyfél közötti kommunikáció megakadályozása" ++ ++msgid "Prism2/2.5/3 802.11b Wireless Controller" ++msgstr "Prism2/2.5/3 802.11b vezeték nélküli vezérlÅ‘" ++ ++msgid "Proceed" ++msgstr "Folytatás" ++ ++msgid "Processes" ++msgstr "Folyamatok" ++ ++msgid "Prot." ++msgstr "Prot." ++ ++msgid "Protocol" ++msgstr "Protokoll" ++ ++msgid "Protocol family" ++msgstr "Protokoll család" ++ ++msgid "Protocol of the new interface" ++msgstr "Az új interfész protokollja" ++ ++msgid "Protocol support is not installed" ++msgstr "Protokoll támogatás nincs telepítve" ++ ++msgid "Provide NTP server" ++msgstr "NTP kiszolgáló" ++ ++msgid "Provide new network" ++msgstr "Új hálózat nyújtása" ++ ++msgid "Pseudo Ad-Hoc (ahdemo)" ++msgstr "Ãl Ad-hoc (ahdemo)" ++ ++msgid "Public prefix routed to this device for distribution to clients." ++msgstr "" ++ ++msgid "Quality" ++msgstr "MinÅ‘ség" ++ ++msgid "RTS/CTS Threshold" ++msgstr "RTS/CTS küszöbérték" ++ ++msgid "RX" ++msgstr "RX" ++ ++msgid "RX Rate" ++msgstr "RX sebesség" ++ ++msgid "RaLink 802.11%s Wireless Controller" ++msgstr "RaLink 802.11%s vezeték nélküli vezérlÅ‘" ++ ++msgid "Radius-Accounting-Port" ++msgstr "Radius-Naplózási-Port" ++ ++msgid "Radius-Accounting-Secret" ++msgstr "Radius-Naplózás-Kulcs" ++ ++msgid "Radius-Accounting-Server" ++msgstr "Radius-Naplózás-Kiszolgáló" ++ ++msgid "Radius-Authentication-Port" ++msgstr "Radius-Hitelesítés-Port" ++ ++msgid "Radius-Authentication-Secret" ++msgstr "Radius-Hitelesítés-Kulcs" ++ ++msgid "Radius-Authentication-Server" ++msgstr "Radius-Hitelesítés-Kiszolgáló" ++ ++msgid "" ++"Read /etc/ethers to configure the DHCP-Server" ++msgstr "" ++"Az /etc/ethers fájl olvasása a DHCP kiszolgáló beállításához" ++ ++msgid "" ++"Really delete this interface? The deletion cannot be undone!\\nYou might " ++"lose access to this device if you are connected via this interface." ++msgstr "" ++"Biztosan törli az interfészt? A törlés nem visszavonható!\n" ++" Lehet, hogy elveszti a hozzáférést az eszközhöz, amennyiben ezen az " ++"interfészen keresztül kapcsolódik." ++ ++msgid "" ++"Really delete this wireless network? The deletion cannot be undone!\\nYou " ++"might lose access to this device if you are connected via this network." ++msgstr "" ++"Biztosan törli ezt a vezetéknélküli hálózatot? A törlés nem visszavonható!\n" ++"Lehet, hogy elveszti a hozzáférést az eszközhöz, amennyiben ezen a hálózaton " ++"keresztül kapcsolódik." ++ ++msgid "Really reset all changes?" ++msgstr "Biztos, hogy visszavonja az összes módosítást?" ++ ++#, fuzzy ++msgid "" ++"Really shut down network?\\nYou might lose access to this device if you are " ++"connected via this interface." ++msgstr "" ++"Biztos, hogy leállítja a hálózatot?!\n" ++" Lehet, hogy elveszti a hozzáférést az eszközhöz, amennyiben ezen a " ++"hálózaton keresztül kapcsolódik." ++ ++msgid "" ++"Really shutdown interface \"%s\" ?\\nYou might lose access to this device if " ++"you are connected via this interface." ++msgstr "" ++"Biztos, hogy leállítja a \"%s\" interfészt?\n" ++" Lehet, hogy elveszti a hozzáférést az eszközhöz, amennyiben ezen az " ++"interfészen keresztül kapcsolódik." ++ ++msgid "Really switch protocol?" ++msgstr "Biztos, hogy cserélni szeretné a protokollt?" ++ ++msgid "Realtime Connections" ++msgstr "Valósidejű kapcsolatok" ++ ++msgid "Realtime Graphs" ++msgstr "Valósidejű grafikonok" ++ ++msgid "Realtime Load" ++msgstr "Valósidejű terhelés" ++ ++msgid "Realtime Traffic" ++msgstr "Valósidejű forgalom" ++ ++msgid "Realtime Wireless" ++msgstr "Valósidejű vezetéknélküli adatok" ++ ++msgid "Rebind protection" ++msgstr "Rebind elleni védelem" ++ ++msgid "Reboot" ++msgstr "Újraindítás" ++ ++msgid "Rebooting..." ++msgstr "Újraindítás..." ++ ++msgid "Reboots the operating system of your device" ++msgstr "Újraindítja az eszköz operációs rendszerét" ++ ++msgid "Receive" ++msgstr "Fogadás" ++ ++msgid "Receiver Antenna" ++msgstr "VevÅ‘ antenna" ++ ++msgid "Reconnect this interface" ++msgstr "Csatlakoztassa újra az interfészt" ++ ++msgid "Reconnecting interface" ++msgstr "Interfész újracsatlakoztatása" ++ ++msgid "References" ++msgstr "Hivatkozások" ++ ++msgid "Regulatory Domain" ++msgstr "Szabályozó tartomány" ++ ++msgid "Relay" ++msgstr "Ãtjátszás" ++ ++msgid "Relay Bridge" ++msgstr "Ãtjátszó híd" ++ ++msgid "Relay between networks" ++msgstr "Ãtjátszás hálózatok között" ++ ++msgid "Relay bridge" ++msgstr "Ãtjátszó híd" ++ ++msgid "Remote IPv4 address" ++msgstr "Távoli IPv4 cím" ++ ++msgid "Remove" ++msgstr "Eltávolítás" ++ ++msgid "Repeat scan" ++msgstr "Felderítés ismétlése" ++ ++msgid "Replace entry" ++msgstr "Bejegyés lecserélése" ++ ++msgid "Replace wireless configuration" ++msgstr "Vezetéknélküli beállítások lecserélése" ++ ++msgid "Request IPv6-address" ++msgstr "" ++ ++msgid "Request IPv6-prefix of length" ++msgstr "" ++ ++msgid "Require TLS" ++msgstr "" ++ ++msgid "Required for certain ISPs, e.g. Charter with DOCSIS 3" ++msgstr "" ++"Szükséges bizonyos internetszolgáltatók esetén, pl. Charter 'DOCSIS 3'-al" ++ ++msgid "Reset" ++msgstr "Visszaállítás" ++ ++msgid "Reset Counters" ++msgstr "Számlálók nullázása" ++ ++msgid "Reset to defaults" ++msgstr "Alapértelmezések visszaállítása" ++ ++msgid "Resolv and Hosts Files" ++msgstr "Resolv és hosts fájlok" ++ ++msgid "Resolve file" ++msgstr "Resolv fájl" ++ ++msgid "Restart" ++msgstr "Újraindítás" ++ ++msgid "Restart Firewall" ++msgstr "Tűzfal újraindítása" ++ ++msgid "Restore backup" ++msgstr "Biztonsági mentés visszaállítása" ++ ++msgid "Reveal/hide password" ++msgstr "Jelszó mutatása/elrejtése" ++ ++msgid "Revert" ++msgstr "Visszavonás" ++ ++msgid "Root" ++msgstr "Gyökérkönyvtár" ++ ++msgid "Root directory for files served via TFTP" ++msgstr "TFTP-n keresztül megosztott fájlok gyökérkönyvtára" ++ ++msgid "Root preparation" ++msgstr "" ++ ++msgid "Routed IPv6 prefix for downstream interfaces" ++msgstr "" ++ ++msgid "Router Advertisement-Service" ++msgstr "" ++ ++msgid "Router Password" ++msgstr "Router jelszó" ++ ++msgid "Routes" ++msgstr "Útvonalak" ++ ++msgid "" ++"Routes specify over which interface and gateway a certain host or network " ++"can be reached." ++msgstr "" ++"Az útvonalak határozzák meg, hogy bizonyos gépek illetve hálózatok melyik " ++"interfészen keresztül érhetÅ‘k el." ++ ++msgid "Rule #" ++msgstr "Szabály #" ++ ++msgid "Run a filesystem check before mounting the device" ++msgstr "Fájlrendszer ellenÅ‘rzés futtatása az eszköz csatolása elÅ‘tt" ++ ++msgid "Run filesystem check" ++msgstr "Fájlrendszer ellenÅ‘rzés futtatása" ++ ++msgid "" ++"SIXXS supports TIC only, for static tunnels using IP protocol 41 (RFC4213) " ++"use 6in4 instead" ++msgstr "" ++ ++msgid "SIXXS-handle[/Tunnel-ID]" ++msgstr "" ++ ++msgid "SSH Access" ++msgstr "SSH hozzáférés" ++ ++msgid "SSH-Keys" ++msgstr "SSH kulcsok" ++ ++msgid "SSID" ++msgstr "SSID" ++ ++msgid "Save" ++msgstr "Mentés" ++ ++msgid "Save & Apply" ++msgstr "Mentés & Alkalmazás" ++ ++msgid "Save & Apply" ++msgstr "Mentés & Alkalmazás" ++ ++msgid "Scan" ++msgstr "Felderítés" ++ ++msgid "Scheduled Tasks" ++msgstr "Ãœtemezett feladatok" ++ ++msgid "Section added" ++msgstr "Szakasz hozzáadva" ++ ++msgid "Section removed" ++msgstr "Szakasz eltávolítva" ++ ++msgid "See \"mount\" manpage for details" ++msgstr "Részletekért lásd a 'mount' man oldalát" ++ ++msgid "" ++"Send LCP echo requests at the given interval in seconds, only effective in " ++"conjunction with failure threshold" ++msgstr "" ++"LCP echo kérések küldése a másodpercben megadott idÅ‘közönként, csak a " ++"hibaküszöbbel együtt van hatása." ++ ++msgid "Separate Clients" ++msgstr "Kliensek szétválasztása" ++ ++msgid "Separate WDS" ++msgstr "WDS szétválasztása" ++ ++msgid "Server Settings" ++msgstr "Kiszolgáló beállításai" ++ ++msgid "Server password" ++msgstr "" ++ ++msgid "" ++"Server password, enter the specific password of the tunnel when the username " ++"contains the tunnel ID" ++msgstr "" ++ ++msgid "Server username" ++msgstr "" ++ ++msgid "Service Name" ++msgstr "Szolgáltatás neve" ++ ++msgid "Service Type" ++msgstr "Szolgáltatás típusa" ++ ++msgid "Services" ++msgstr "Szolgáltatások" ++ ++#, fuzzy ++msgid "Set up Time Synchronization" ++msgstr "IdÅ‘ szinkronizálás beállítása" ++ ++msgid "Setup DHCP Server" ++msgstr "DHCP kiszolgáló beállítása" ++ ++msgid "Show current backup file list" ++msgstr "MentendÅ‘ fájlok aktuális listájának megjelenítése" ++ ++msgid "Shutdown this interface" ++msgstr "Interfész leállítása" ++ ++msgid "Shutdown this network" ++msgstr "Hálózat leállítása" ++ ++msgid "Signal" ++msgstr "Jel" ++ ++msgid "Signal:" ++msgstr "Jel:" ++ ++msgid "Size" ++msgstr "Méret" ++ ++msgid "Skip" ++msgstr "Ugrás" ++ ++msgid "Skip to content" ++msgstr "Ugrás a tartalomhoz" ++ ++msgid "Skip to navigation" ++msgstr "Ugrás a navigációhoz" ++ ++msgid "Slot time" ++msgstr "IdÅ‘rés" ++ ++msgid "Software" ++msgstr "Szoftver" ++ ++msgid "Some fields are invalid, cannot save values!" ++msgstr "Néhán mezÅ‘ érvénytelen, az értékek nem menthetÅ‘k!" ++ ++msgid "Sorry, the object you requested was not found." ++msgstr "Sajnálom, a kért objektum nem található." ++ ++msgid "Sorry, the server encountered an unexpected error." ++msgstr "Sajnálom, a szerver váratlan hibát észlelt." ++ ++#, fuzzy ++msgid "" ++"Sorry, there is no sysupgrade support present; a new firmware image must be " ++"flashed manually. Please refer to the OpenWrt wiki for device specific " ++"install instructions." ++msgstr "" ++"Sajnáljuk, a 'sysupgrade' támogatás nem elérhetÅ‘, az új firmware fájl " ++"telepítését manuálisan kell elvégezni. Az eszközhöz tartozó telepítési " ++"utasításokért keresse fel az OpenWrt wiki-t." ++ ++msgid "Sort" ++msgstr "Sorbarendezés" ++ ++msgid "Source" ++msgstr "Forrás" ++ ++msgid "Source routing" ++msgstr "" ++ ++msgid "Specifies the button state to handle" ++msgstr "Meghatározza a gomb kezelendÅ‘ állapotát" ++ ++msgid "Specifies the directory the device is attached to" ++msgstr "Megadja az eszköz csatlakozási könyvtárát." ++ ++msgid "Specifies the listening port of this Dropbear instance" ++msgstr "Megadja a Dropbear példány portját" ++ ++msgid "" ++"Specifies the maximum amount of failed ARP requests until hosts are presumed " ++"to be dead" ++msgstr "" ++"Megadja a maximális sikertelen ARP kérések számát, amik után a host nem " ++"elérhetÅ‘nek tekinthetÅ‘" ++ ++msgid "" ++"Specifies the maximum amount of seconds after which hosts are presumed to be " ++"dead" ++msgstr "" ++"Megadja a másodpercek számát, amik után a host nem elérhetÅ‘nek tekinthetÅ‘" ++ ++msgid "Specify the secret encryption key here." ++msgstr "Itt adja meg a titkosító kulcsot." ++ ++msgid "Start" ++msgstr "Indítás" ++ ++msgid "Start priority" ++msgstr "Indítás prioritása" ++ ++msgid "Startup" ++msgstr "Rendszerindítás" ++ ++msgid "Static IPv4 Routes" ++msgstr "Statikus IPv4 útvonalak" ++ ++msgid "Static IPv6 Routes" ++msgstr "Statikus IPv6 útvonalak" ++ ++msgid "Static Leases" ++msgstr "Statikus bérletek" ++ ++msgid "Static Routes" ++msgstr "Statikus útvonalak" ++ ++msgid "Static WDS" ++msgstr "Statikus WDS" ++ ++msgid "Static address" ++msgstr "Statikus cím" ++ ++msgid "" ++"Static leases are used to assign fixed IP addresses and symbolic hostnames " ++"to DHCP clients. They are also required for non-dynamic interface " ++"configurations where only hosts with a corresponding lease are served." ++msgstr "" ++"A statikus bérletekkel a DHCP kliensekhez fix IP-címet és hostnevet " ++"rendelhet. Olyan nem dinamikus interfész konfigurációk esetén is " ++"szükségesek, ahol a csak a megfelelÅ‘ bérlettel rendelkezÅ‘ hosztok kerülnek " ++"kiszolgálásra." ++ ++msgid "Status" ++msgstr "Ãllapot" ++ ++msgid "Stop" ++msgstr "Leállítás" ++ ++msgid "Strict order" ++msgstr "Kötött sorrend" ++ ++msgid "Submit" ++msgstr "Elküldés" ++ ++msgid "Swap" ++msgstr "" ++ ++msgid "Swap Entry" ++msgstr "Lapozóterület" ++ ++msgid "Switch" ++msgstr "Kapcsoló" ++ ++msgid "Switch %q" ++msgstr "Kapcsoló %q" ++ ++msgid "Switch %q (%s)" ++msgstr "Kapcsoló %q (%s)" ++ ++msgid "Switch protocol" ++msgstr "Protokoll csere" ++ ++msgid "Sync with browser" ++msgstr "Szinkronizálás a böngészÅ‘vel" ++ ++msgid "Synchronizing..." ++msgstr "Szinkronizálás..." ++ ++msgid "System" ++msgstr "Rendszer" ++ ++msgid "System Log" ++msgstr "Rendszernapló" ++ ++msgid "System Properties" ++msgstr "Rendszer tulajdonságok" ++ ++msgid "System log buffer size" ++msgstr "Rendszer napló puffer méret" ++ ++msgid "TCP:" ++msgstr "TCP:" ++ ++msgid "TFTP Settings" ++msgstr "TFTP beállítások" ++ ++msgid "TFTP server root" ++msgstr "TFTP szerver gyökér könyvtár" ++ ++msgid "TX" ++msgstr "TX" ++ ++msgid "TX Rate" ++msgstr "TX sebesség" ++ ++msgid "Table" ++msgstr "Tábla" ++ ++msgid "Target" ++msgstr "Cél" ++ ++msgid "Terminate" ++msgstr "Megszakítás" ++ ++#, fuzzy ++msgid "" ++"The Device Configuration section covers physical settings of the " ++"radio hardware such as channel, transmit power or antenna selection which " ++"are shared among all defined wireless networks (if the radio hardware is " ++"multi-SSID capable). Per network settings like encryption or operation mode " ++"are grouped in the Interface Configuration." ++msgstr "" ++"Az Eszköz beállítások szakasz a rádió hardver fizikai beállításait, " ++"úgymint csatorna, adóteljesítmény vagy antenna választás teszi lehetÅ‘vé, " ++"amelyen az összes definiált vezeték nélküli hálózat (ha a rádió hardver " ++"multi-SSID képes) osztozik. A hálózatonkénti beállítások, mint az " ++"titkosítás, mód az Interfész beállítások alá vannak csoportosítva." ++ ++msgid "" ++"The libiwinfo-lua package is not installed. You must install this " ++"component for working wireless configuration!" ++msgstr "" ++"A libiwinfo-lua nincs telepítve. A vezetéknélküli beállítás " ++"működéséhez ezt az összetevÅ‘t telepítnei kell." ++ ++msgid "" ++"The HE.net endpoint update configuration changed, you must now use the plain " ++"username instead of the user ID!" ++msgstr "" ++ ++msgid "" ++"The IPv6 prefix assigned to the provider, usually ends with ::" ++msgstr "" ++"A szolgáltatóhoz rendelt IPv6 elÅ‘tag, általában így végzÅ‘dik: ::" ++ ++msgid "" ++"The allowed characters are: A-Z, a-z, 0-9 and _" ++msgstr "" ++"A következÅ‘ karakterek használhatók: A-Z, a-z, " ++"0-9 and _" ++ ++msgid "The configuration file could not be loaded due to the following error:" ++msgstr "" ++ ++msgid "" ++"The device file of the memory or partition (e.g." ++" /dev/sda1)" ++msgstr "" ++"A memória vagy partíció eszköz fájlja (pl. " ++"/dev/sda1)" ++ ++msgid "" ++"The filesystem that was used to format the memory (e.g. ext3)" ++msgstr "" ++"A memória formázásához használt fájlrendszer típusa (pl. ext3)" ++ ++msgid "" ++"The flash image was uploaded. Below is the checksum and file size listed, " ++"compare them with the original file to ensure data integrity.
    Click " ++"\"Proceed\" below to start the flash procedure." ++msgstr "" ++"Az image feltöltve. Alább található a fájl ellenőrző összege és mérete, " ++"hasonlítsa össze az eredeti fájllal a feltöltött adatok sértetlenségének " ++"ellenőrzéséhez.
    Kattintson az alábbi \"Folytatás\" gombra a flash-elési " ++"eljárás elindításához." ++ ++msgid "The following changes have been committed" ++msgstr "A következő módosítások lettek alkalmazva" ++ ++msgid "The following changes have been reverted" ++msgstr "A következő módosítások lettek visszavonva" ++ ++msgid "The following rules are currently active on this system." ++msgstr "Jelenleg a következő szabályok aktívak a rendszeren." ++ ++msgid "The given network name is not unique" ++msgstr "A megadott hálózati név már létezik" ++ ++#, fuzzy ++msgid "" ++"The hardware is not multi-SSID capable and the existing configuration will " ++"be replaced if you proceed." ++msgstr "" ++"A hardver nem képes többszörös SSID kezelésre ezért a meglévő beállítások " ++"elvesznek ha folytatja." ++ ++msgid "" ++"The length of the IPv4 prefix in bits, the remainder is used in the IPv6 " ++"addresses." ++msgstr "" ++"Az IPv4 előtag hossza bitekben, a maradék az IPv6 címekben használatos." ++ ++msgid "The length of the IPv6 prefix in bits" ++msgstr "Az IPv6 előtag hossza bitekben" ++ ++msgid "" ++"The network ports on this device can be combined to several VLANs in which computers can " ++"communicate directly with each other. VLANs are often used to separate different network " ++"segments. Often there is by default one Uplink port for a connection to the " ++"next greater network like the internet and other ports for a local network." ++msgstr "" ++"Az eszközön található hálózati portok kombinálhatók több VLAN-ba, amelyekben a számítógépek " ++"közvetlenül kommunikálhatnak egmással. A VLAN-ok gyakran a hálózati szegmensek elkülönítésére " ++"használják. Gyakran van egy alapértelmezett Uplink port a következő nagyobb " ++"hálózathoz (pl. az internet) való kapcsolódásra és a többi port a helyi " ++"hálózathoz." ++ ++msgid "The selected protocol needs a device assigned" ++msgstr "A kiválasztott protokoll eszköz hozzárendelést igényel" ++ ++msgid "" ++"The system is erasing the configuration partition now and will reboot itself " ++"when finished." ++msgstr "A rendszer most törli a konfigurációs partíciót majd újraindul." ++ ++#, fuzzy ++msgid "" ++"The system is flashing now.
    DO NOT POWER OFF THE DEVICE!
    Wait a " ++"few minutes before you try to reconnect. It might be necessary to renew the " ++"address of your computer to reach the device again, depending on your " ++"settings." ++msgstr "" ++"A rendszer frissítése folyamatban.
    NE KAPCSOLJA KI AZ ESZKÖZT!
    " ++"Várjon néhány percet, amíg az eszköz ismételten elérhetÅ‘. Az eszköz " ++"eléréséhez a beállításaitól függÅ‘en szükséges lehet a számítógépe IP-címének " ++"megújítása." ++ ++msgid "" ++"The tunnel end-point is behind NAT, defaults to disabled and only applies to " ++"AYIYA" ++msgstr "" ++ ++msgid "" ++"The uploaded image file does not contain a supported format. Make sure that " ++"you choose the generic image format for your platform." ++msgstr "" ++"A feltöltött image fájl formátuma nem támogatott. Ãœgyeljen arra, hogy a " ++"platformjának megfelelÅ‘ általános image formátumot válassza ki." ++ ++msgid "There are no active leases." ++msgstr "Nincsenek aktív bérletek." ++ ++msgid "There are no pending changes to apply!" ++msgstr "Nincsenek alkalmazásra váró módosítások!" ++ ++msgid "There are no pending changes to revert!" ++msgstr "Nincsenek visszavonásra váró változtatások!" ++ ++msgid "There are no pending changes!" ++msgstr "Nincsenek el nem mentett változtatások!" ++ ++msgid "" ++"There is no device assigned yet, please attach a network device in the " ++"\"Physical Settings\" tab" ++msgstr "" ++"Nincs hozzárendelt eszköz, kérem csatoljon egy hálózati eszközt a \"Fizikai " ++"beállítások\" fülön." ++ ++msgid "" ++"There is no password set on this router. Please configure a root password to " ++"protect the web interface and enable SSH." ++msgstr "" ++"A routeren jelenleg nincs jelszó beállítva. Ãllítsa be a root felhasználó " ++"jelszavát a felhasználói felület védelme és az SSH elérés engélyezése " ++"érdekében." ++ ++msgid "This IPv4 address of the relay" ++msgstr "Az átjátszó IPV4 címe" ++ ++msgid "" ++"This is a list of shell glob patterns for matching files and directories to " ++"include during sysupgrade. Modified files in /etc/config/ and certain other " ++"configurations are automatically preserved." ++msgstr "" ++"Ez egy shell mintákból álló lista a rendszer frissítés során megÅ‘rzendÅ‘ " ++"fájlok és könytárak meghatározására. Az /etc/config/ könyvtárban található " ++"módosított fájlok és bizonyos további beállítások automatikusan megÅ‘rzÅ‘dnek." ++ ++msgid "" ++"This is either the \"Update Key\" configured for the tunnel or the account " ++"password if no update key has been configured" ++msgstr "" ++ ++msgid "" ++"This is the content of /etc/rc.local. Insert your own commands here (in " ++"front of 'exit 0') to execute them at the end of the boot process." ++msgstr "" ++"Ez a /etc/rc.local fájl tartalma. Ide írhatja be a saját parancsait (az " ++"'exit 0' sor elé) a boot folyamat végén történÅ‘ futtatásukhoz." ++ ++msgid "" ++"This is the local endpoint address assigned by the tunnel broker, it usually " ++"ends with :2" ++msgstr "" ++"Ez az alagút közvetítÅ‘ (tunnel broker) által megadott helyi végpont címe, " ++"általában így végzÅ‘dik: :2" ++ ++msgid "" ++"This is the only DHCP in the local network" ++msgstr "" ++"Ez az egyetlen DHCP a helyi hálózaton" ++ ++msgid "This is the plain username for logging into the account" ++msgstr "" ++ ++msgid "" ++"This is the prefix routed to you by the tunnel broker for use by clients" ++msgstr "" ++ ++msgid "This is the system crontab in which scheduled tasks can be defined." ++msgstr "Ez a rendszer crontab, amiben idÅ‘zített feladatok definiálhatók." ++ ++msgid "" ++"This is usually the address of the nearest PoP operated by the tunnel broker" ++msgstr "" ++"Ez általában a legközelebbi alagút közvetítÅ‘ (tunnel broker) által vezérelt " ++"jelenléti pont (PoP) címe" ++ ++msgid "" ++"This list gives an overview over currently running system processes and " ++"their status." ++msgstr "" ++"Ez a lista a rendszerben jelenleg futó folyamatokról és azok állapotáról ad " ++"áttekintést." ++ ++msgid "This page allows the configuration of custom button actions" ++msgstr "Ez a lap a gombok egyedi működésének beállítását teszi lehetÅ‘vé" ++ ++msgid "This page gives an overview over currently active network connections." ++msgstr "" ++"Ez a lap a rendszerben jelenleg aktív hálózati kapcsolatokról ad áttekintést." ++ ++msgid "This section contains no values yet" ++msgstr "Ez a szakasz még nem tartalmaz értékeket" ++ ++msgid "Time Synchronization" ++msgstr "IdÅ‘ szinkronizálás" ++ ++msgid "Time Synchronization is not configured yet." ++msgstr "IdÅ‘ szinkronizálás még nincs beállítva." ++ ++msgid "Timezone" ++msgstr "IdÅ‘zóna" ++ ++msgid "" ++"To restore configuration files, you can upload a previously generated backup " ++"archive here." ++msgstr "" ++"Itt tölthet fel egy korábban létrehozott biztonsági mentés archívumot a " ++"konfigurációs fájlok visszaállításához." ++ ++msgid "Total Available" ++msgstr "Összes elérhetÅ‘" ++ ++msgid "Traceroute" ++msgstr "Traceroute" ++ ++msgid "Traffic" ++msgstr "Forgalom" ++ ++msgid "Transfer" ++msgstr "Ãtvitel" ++ ++msgid "Transmission Rate" ++msgstr "Ãtviteli sebesség" ++ ++msgid "Transmit" ++msgstr "Küldés" ++ ++msgid "Transmit Power" ++msgstr "Adóteljesítmény" ++ ++msgid "Transmitter Antenna" ++msgstr "Adó antenna" ++ ++msgid "Trigger" ++msgstr "Trigger" ++ ++msgid "Trigger Mode" ++msgstr "Trigger mód" ++ ++msgid "Tunnel ID" ++msgstr "Tunnel azonosító" ++ ++msgid "Tunnel Interface" ++msgstr "Tunnel interfész" ++ ++msgid "Tunnel Link" ++msgstr "" ++ ++msgid "Tunnel broker protocol" ++msgstr "" ++ ++msgid "Tunnel setup server" ++msgstr "" ++ ++msgid "Tunnel type" ++msgstr "" ++ ++msgid "Turbo Mode" ++msgstr "Turbó mód" ++ ++msgid "Tx-Power" ++msgstr "Adóteljesítmény" ++ ++msgid "Type" ++msgstr "Típus" ++ ++msgid "UDP:" ++msgstr "UDP:" ++ ++msgid "UMTS only" ++msgstr "Csak UTMS" ++ ++msgid "UMTS/GPRS/EV-DO" ++msgstr "UMTS/GPRS/EV-DO" ++ ++msgid "USB Device" ++msgstr "USB eszköz" ++ ++msgid "UUID" ++msgstr "UUID" ++ ++msgid "Unable to dispatch" ++msgstr "Nem indiítható" ++ ++msgid "Unknown" ++msgstr "Ismeretlen" ++ ++msgid "Unknown Error, password not changed!" ++msgstr "Ismeretlen hiba, a jelszó nem lett megváltoztatva!" ++ ++msgid "Unmanaged" ++msgstr "Nem kezelt" ++ ++msgid "Unsaved Changes" ++msgstr "El nem mentett módosítások" ++ ++msgid "Unsupported protocol type." ++msgstr "Nem támogatott protokoll típus." ++ ++msgid "Update lists" ++msgstr "Listák frissítése" ++ ++msgid "" ++"Upload a sysupgrade-compatible image here to replace the running firmware. " ++"Check \"Keep settings\" to retain the current configuration (requires an " ++"OpenWrt compatible firmware image)." ++msgstr "" ++"Itt tölthet fel egy új sysupgrade-kompatibilis képet a futó firmware " ++"lecseréléséhez. A jelenlegi beállítások megtartásához jelölje be a " ++"\"Beállítások megtartása\" négyzetet (OpenWrt-vel kompatibilis firmware kép " ++"szükséges)." ++ ++msgid "Upload archive..." ++msgstr "Archívum feltöltése..." ++ ++msgid "Uploaded File" ++msgstr "Feltöltött fájl" ++ ++msgid "Uptime" ++msgstr "Működési idÅ‘" ++ ++msgid "Use /etc/ethers" ++msgstr "/etc/ethers használata" ++ ++msgid "Use DHCP gateway" ++msgstr "DHCP kiszolgáló használata" ++ ++msgid "Use DNS servers advertised by peer" ++msgstr "Másik fél által ajánlott DNS szerverek használata" ++ ++msgid "Use ISO/IEC 3166 alpha2 country codes." ++msgstr "ISO/IEC 3166 alpha2 országkódok használata" ++ ++msgid "Use MTU on tunnel interface" ++msgstr "MTU használata az alagút interfészen" ++ ++msgid "Use TTL on tunnel interface" ++msgstr "TTL használata az alagút interfészen" ++ ++msgid "Use as external overlay (/overlay)" ++msgstr "" ++ ++msgid "Use as root filesystem (/)" ++msgstr "" ++ ++msgid "Use broadcast flag" ++msgstr "Broadcast flag használata" ++ ++msgid "Use builtin IPv6-management" ++msgstr "" ++ ++msgid "Use custom DNS servers" ++msgstr "Egyedi DNS szerverek használata" ++ ++msgid "Use default gateway" ++msgstr "Alapértelmezett átjáró használata" ++ ++msgid "Use gateway metric" ++msgstr "Ãtjáró metrikájának használata" ++ ++msgid "Use routing table" ++msgstr "Útválasztó tábla használata" ++ ++msgid "" ++"Use the Add Button to add a new lease entry. The MAC-Address indentifies the host, the IPv4-Address specifies to the fixed " ++"address to use and the Hostname is assigned as symbolic name to the " ++"requesting host." ++msgstr "" ++"Használja a Hozzáadás gombot új bérleti bejegyzés hozzáadásához. A " ++"MAC-cím azonosítja a gépet. az IPv4-cím adja meg a " ++"használandó rögzített IP címet és a Gépnév lesz szimbolikus névként " ++"hozzárendelve az igénylÅ‘ géphez." ++ ++msgid "Used" ++msgstr "Használt" ++ ++msgid "Used Key Slot" ++msgstr "Használt kulcsindex" ++ ++msgid "User certificate (PEM encoded)" ++msgstr "" ++ ++msgid "User key (PEM encoded)" ++msgstr "" ++ ++msgid "Username" ++msgstr "Felhasználónév" ++ ++msgid "VC-Mux" ++msgstr "VC-Mux" ++ ++msgid "VLAN Interface" ++msgstr "VLAN interfész" ++ ++msgid "VLANs on %q" ++msgstr "VLAN-ok %q-n" ++ ++msgid "VLANs on %q (%s)" ++msgstr "VLAN-ok %q-n (%s)" ++ ++msgid "VPN Server" ++msgstr "VPN kiszolgáló" ++ ++msgid "VPN Server port" ++msgstr "" ++ ++msgid "VPN Server's certificate SHA1 hash" ++msgstr "" ++ ++msgid "Vendor Class to send when requesting DHCP" ++msgstr "DHCP kérés során küldendÅ‘ 'Vendor Class'" ++ ++msgid "Verbose" ++msgstr "" ++ ++msgid "Verbose logging by aiccu daemon" ++msgstr "" ++ ++msgid "Verify" ++msgstr "EllenÅ‘rzés" ++ ++msgid "Version" ++msgstr "Verzió" ++ ++msgid "WDS" ++msgstr "WDS" ++ ++msgid "WEP Open System" ++msgstr "WEP nyílt rendszer" ++ ++msgid "WEP Shared Key" ++msgstr "WEP megosztott kulcs" ++ ++msgid "WEP passphrase" ++msgstr "WEP jelmondat" ++ ++msgid "WMM Mode" ++msgstr "WMM mód" ++ ++msgid "WPA passphrase" ++msgstr "WPA jelmondat" ++ ++msgid "" ++"WPA-Encryption requires wpa_supplicant (for client mode) or hostapd (for AP " ++"and ad-hoc mode) to be installed." ++msgstr "" ++"WPA titkosításhoz kliens módnál 'wpa_supplicant', hozzáférési pont illetve " ++"ad-hoc módnál 'hostapd' telepítése szükséges." ++ ++msgid "" ++"Wait for NTP sync that many seconds, seting to 0 disables waiting (optional)" ++msgstr "" ++ ++msgid "Waiting for changes to be applied..." ++msgstr "Várakozás a változtatások alkalmazására..." ++ ++msgid "Waiting for command to complete..." ++msgstr "Várakozás a parancs befejezésére..." ++ ++msgid "Warning" ++msgstr "Figyelmeztetés" ++ ++msgid "Warning: There are unsaved changes that will be lost while rebooting!" ++msgstr "" ++"Figyelem: vannak el nem mentett változások melyek el fognak veszni az " ++"újraindítás során!" ++ ++msgid "Whether to create an IPv6 default route over the tunnel" ++msgstr "" ++ ++msgid "Whether to route only packets from delegated prefixes" ++msgstr "" ++ ++msgid "Width" ++msgstr "" ++ ++msgid "Wifi" ++msgstr "Wifi" ++ ++msgid "Wireless" ++msgstr "Vezetéknélküli rész" ++ ++msgid "Wireless Adapter" ++msgstr "Vezetéknélküli adapter" ++ ++msgid "Wireless Network" ++msgstr "Vezetéknélküli hálózat" ++ ++msgid "Wireless Overview" ++msgstr "Vezetéknélküli rész áttekintés" ++ ++msgid "Wireless Security" ++msgstr "Vezetéknélküli biztonság" ++ ++msgid "Wireless is disabled or not associated" ++msgstr "Vezetéknélküli hálózat le van tiltva vagy nincs kapcsolódva" ++ ++msgid "Wireless is restarting..." ++msgstr "Vezetéknélküli rész újraindítása folyamatban..." ++ ++msgid "Wireless network is disabled" ++msgstr "Vezetéknélküli hálózat letiltva" ++ ++msgid "Wireless network is enabled" ++msgstr "Vezetéknélküli hálózat engedélyezve" ++ ++msgid "Wireless restarted" ++msgstr "Vezetéknélküli rész újraindítva" ++ ++msgid "Wireless shut down" ++msgstr "Vezetéknélküli rész leállítása" ++ ++msgid "Write received DNS requests to syslog" ++msgstr "A kapott DNS kéréseket írja a rendszernaplóba" ++ ++msgid "XR Support" ++msgstr "XR támogatás" ++ ++msgid "" ++"You can enable or disable installed init scripts here. Changes will applied " ++"after a device reboot.
    Warning: If you disable essential init " ++"scripts like \"network\", your device might become inaccessible!" ++msgstr "" ++"Itt engedélyezheti vagy tilthatja le a telepített indítási állományokat. A " ++"módosítások a rendszer újraindítása után lesznek alakalmazva.
    Figyelem: alapvetÅ‘ indítási állomány pl. \"network\" letiltása " ++"esetén, az eszköz elérhetetlenné válhat!" ++ ++msgid "" ++"You must enable Java Script in your browser or LuCI will not work properly." ++msgstr "" ++"Engélyezze a Java Szkripteket a böngészÅ‘jében, mert anélkül a LuCI nem fog " ++"megfelelÅ‘en működni." ++ ++msgid "" ++"Your Internet Explorer is too old to display this page correctly. Please " ++"upgrade it to at least version 7 or use another browser like Firefox, Opera " ++"or Safari." ++msgstr "" ++ ++msgid "any" ++msgstr "bármelyik" ++ ++msgid "auto" ++msgstr "automatikus" ++ ++msgid "automatic" ++msgstr "" ++ ++msgid "baseT" ++msgstr "baseT" ++ ++msgid "bridged" ++msgstr "áthidalt" ++ ++msgid "create:" ++msgstr "új:" ++ ++msgid "creates a bridge over specified interface(s)" ++msgstr "híd létrehozása a megadott interfész(ek) között" ++ ++msgid "dB" ++msgstr "dB" ++ ++msgid "dBm" ++msgstr "dBm" ++ ++msgid "disable" ++msgstr "letiltás" ++ ++msgid "disabled" ++msgstr "" ++ ++msgid "expired" ++msgstr "lejárt" ++ ++msgid "" ++"file where given DHCP-leases will be stored" ++msgstr "" ++"fájl ahová a DHCP " ++"bérletek tárolásra kerülnek" ++ ++msgid "forward" ++msgstr "továbbítás" ++ ++msgid "full-duplex" ++msgstr "full-duplex" ++ ++msgid "half-duplex" ++msgstr "half-duplex" ++ ++msgid "help" ++msgstr "súgó" ++ ++msgid "hidden" ++msgstr "rejtett" ++ ++msgid "hybrid mode" ++msgstr "" ++ ++msgid "if target is a network" ++msgstr "ha a cél hálózat" ++ ++msgid "input" ++msgstr "bemenet" ++ ++msgid "kB" ++msgstr "kB" ++ ++msgid "kB/s" ++msgstr "kB/s" ++ ++msgid "kbit/s" ++msgstr "kbit/s" ++ ++msgid "local DNS file" ++msgstr "helyi DNS fájl" ++ ++msgid "minimum 1280, maximum 1480" ++msgstr "" ++ ++msgid "navigation Navigation" ++msgstr "" ++ ++msgid "no" ++msgstr "nem" ++ ++msgid "no link" ++msgstr "nincs link" ++ ++msgid "none" ++msgstr "nincs" ++ ++msgid "not present" ++msgstr "" ++ ++msgid "off" ++msgstr "ki" ++ ++msgid "on" ++msgstr "be" ++ ++msgid "open" ++msgstr "nyitás" ++ ++msgid "overlay" ++msgstr "" ++ ++msgid "relay mode" ++msgstr "" ++ ++msgid "routed" ++msgstr "irányított" ++ ++msgid "server mode" ++msgstr "" ++ ++msgid "skiplink1 Skip to navigation" ++msgstr "" ++ ++msgid "skiplink2 Skip to content" ++msgstr "" ++ ++msgid "stateful-only" ++msgstr "" ++ ++msgid "stateless" ++msgstr "" ++ ++msgid "stateless + stateful" ++msgstr "" ++ ++msgid "tagged" ++msgstr "cimkézett" ++ ++msgid "unknown" ++msgstr "ismeretlen" ++ ++msgid "unlimited" ++msgstr "korlátlan" ++ ++msgid "unspecified" ++msgstr "nincs meghatározva" ++ ++msgid "unspecified -or- create:" ++msgstr "nincs magadva -vagy- új:" ++ ++msgid "untagged" ++msgstr "cimkézetlen" ++ ++msgid "yes" ++msgstr "igen" ++ ++msgid "« Back" ++msgstr "« Vissza" ++ ++#~ msgid "" ++#~ "Always use 40MHz channels even if the secondary channel overlaps. Using " ++#~ "this option does not comply with IEEE 802.11n-2009!" ++#~ msgstr "" ++#~ "40 MHz csatornaszélesség használata akkor is, ha a másodlagos csatorna " ++#~ "átfedésben van. Ezen opció használata nem felel meg az IEE 902.11n-2009 " ++#~ "szabványnak!" ++ ++#~ msgid "Cached" ++#~ msgstr "Gyorsítótárban van" ++ ++#~ msgid "Configures this mount as overlay storage for block-extroot" ++#~ msgstr "" ++#~ "Beállítja ezt a csatlakozási pontot block-extroot részére mint overlay " ++#~ "tároló" ++ ++#~ msgid "Force 40MHz mode" ++#~ msgstr "40 MHz mód erÅ‘ltetése" ++ ++#~ msgid "Frequency Hopping" ++#~ msgstr "Frekvencia ugrás" ++ ++#~ msgid "Locked to channel %d used by %s" ++#~ msgstr "Zárolt a %d csatornára az %s által." ++ ++#~ msgid "Use as root filesystem" ++#~ msgstr "Gyökér fájlrenszerként történÅ‘ használat" ++ ++#~ msgid "HE.net user ID" ++#~ msgstr "HE.net felhasználói azonosító" ++ ++#~ msgid "This is the 32 byte hex encoded user ID, not the login name" ++#~ msgstr "" ++#~ "Ez a 32 bájtos hexadecimálan kódolt felhasználói azonosító, nem a " ++#~ "bejelentkezési név" ++ ++#~ msgid "40MHz 2nd channel above" ++#~ msgstr "40 MHz, második csatorna felette" ++ ++#~ msgid "40MHz 2nd channel below" ++#~ msgstr "40 MHz, második csatorna alatta" ++ ++#~ msgid "Accept router advertisements" ++#~ msgstr "Router hirdetések elfogadása" ++ ++#~ msgid "Advertise IPv6 on network" ++#~ msgstr "IPv6 hirdetése a hálózaton" ++ ++#~ msgid "Advertised network ID" ++#~ msgstr "Hirdetett hálózati azonosító" ++ ++#~ msgid "Allowed range is 1 to 65535" ++#~ msgstr "Engedélyezett tartomány 1-tÅ‘l 65535-ig" ++ ++#~ msgid "HT capabilities" ++#~ msgstr "HT képességek" ++ ++#~ msgid "HT mode" ++#~ msgstr "HT mód" ++ ++#~ msgid "Router Model" ++#~ msgstr "Router modell" ++ ++#~ msgid "Router Name" ++#~ msgstr "Router név" ++ ++#~ msgid "Send router solicitations" ++#~ msgstr "Router kérelmezések küldése" ++ ++#~ msgid "Specifies the advertised preferred prefix lifetime in seconds" ++#~ msgstr "" ++#~ "Meghatározza a kihirdetett preferált elÅ‘tag élettartamát másodpercben" ++ ++#~ msgid "Specifies the advertised valid prefix lifetime in seconds" ++#~ msgstr "" ++#~ "Meghatározza a kihirdetett érvényes elÅ‘tag élettartamát másodpercben" ++ ++#~ msgid "Use preferred lifetime" ++#~ msgstr "ElÅ‘nyben részesített élettartam használata" ++ ++#~ msgid "Use valid lifetime" ++#~ msgstr "Érvényességi idÅ‘tartam használata" ++ ++#~ msgid "Waiting for router..." ++#~ msgstr "Várakozás a routerre..." ++ ++#~ msgid "Enable builtin NTP server" ++#~ msgstr "Beépített NTP kiszolgáló engedélyezése" ++ ++#~ msgid "Active Leases" ++#~ msgstr "Aktív bérletek" ++ ++#~ msgid "Open" ++#~ msgstr "Megnyitás" ++ ++#~ msgid "Bit Rate" ++#~ msgstr "Bit ráta" ++ ++#~ msgid "Configuration / Apply" ++#~ msgstr "Beállítások / Alkalmaz" ++ ++#~ msgid "Configuration / Changes" ++#~ msgstr "Beállítások / Módosítások" ++ ++#~ msgid "Configuration / Revert" ++#~ msgstr "Beállítások / Visszavonás" ++ ++#~ msgid "MAC" ++#~ msgstr "MAC" ++ ++#~ msgid "MAC Address" ++#~ msgstr "MAC cím" ++ ++#~ msgid "Encr." ++#~ msgstr "Titkosított" ++ ++#~ msgid "WLAN-Scan" ++#~ msgstr "WLAN-felderítés" ++ ++#~ msgid "" ++#~ "Choose the network you want to attach to this wireless interface. Select " ++#~ "unspecified to not attach any network or fill out the " ++#~ "create field to define a new network." ++#~ msgstr "" ++#~ "Válassza ki azt a hálózatot amihez ezt a vezetéknélküli interfészt " ++#~ "csatlakoztatni akarja. Válassza a nincs megadva elemet ha nem " ++#~ "akarja semmilyen hálózathoz csatlakoztatni vagy töltse ki az új " ++#~ "mezÅ‘t új hálózat létrehozásához." ++ ++#~ msgid "Create Network" ++#~ msgstr "Új hálózat" ++ ++#~ msgid "Link" ++#~ msgstr "Kapcsolat" ++ ++#~ msgid "Networks" ++#~ msgstr "Hálózatok" ++ ++#~ msgid "Power" ++#~ msgstr "Teljesítmény" ++ ++#~ msgid "Wifi networks in your local environment" ++#~ msgstr "Wifi hálózatok az Ön környezetében" ++ ++#~ msgid "" ++#~ "CIDR-Notation: " ++#~ "address/prefix" ++#~ msgstr "" ++#~ "CIDR-jelölés: cím/" ++#~ "elÅ‘tag" ++ ++#~ msgid "DNS-Server" ++#~ msgstr "DNS-Szerver" ++ ++#~ msgid "IPv4-Broadcast" ++#~ msgstr "IPv4-Broadcast" ++ ++#~ msgid "IPv6-Address" ++#~ msgstr "IPv6-cím" ++ ++#~ msgid "IP-Aliases" ++#~ msgstr "Alternatív IP címek" ++ ++#~ msgid "IPv6 Setup" ++#~ msgstr "IPv6 beállítás" ++ ++#~ msgid "" ++#~ "Note: If you choose an interface here which is part of another network, " ++#~ "it will be moved into this network." ++#~ msgstr "" ++#~ "Megjegyzés: ha olyan interfészt választ ami másik hálózat része, akkor az " ++#~ "ebbe a hálózatba lesz áthelyezve." ++ ++#~ msgid "" ++#~ "Really delete this interface? The deletion cannot be undone!\\nYou might " ++#~ "lose access to this router if you are connected via this interface." ++#~ msgstr "" ++#~ "Biztos, hogy törölni akarja ezt az interfészt? A törlés nem " ++#~ "visszavonható! Elvesztheti a hozzáférést ehhez a routerhez, ha ezen az " ++#~ "interfészen keresztül kapcsolódik hozzá." ++ ++#~ msgid "" ++#~ "Really delete this wireless network? The deletion cannot be undone!\\nYou " ++#~ "might lose access to this router if you are connected via this network." ++#~ msgstr "" ++#~ "Biztos, hogy törölni akarja ezt a vezetéknélküli hálózatot? A törlés nem " ++#~ "visszavonható! Elvesztheti a hozzáférést ehhez a routerhez, ha ezen a " ++#~ "vezetéknélküli hálózaton keresztül kapcsolódik hozzá. " ++ ++#~ msgid "" ++#~ "Really shutdown interface \"%s\" ?\\nYou might lose access to this router " ++#~ "if you are connected via this interface." ++#~ msgstr "" ++#~ "Biztos, hogy leállítja a \"%s\" interfészt? Elvesztheti a hozzáféreést " ++#~ "ehhez a routerher ha ezen az interfészen kapcsolódik hozzá." ++ ++#~ msgid "" ++#~ "Really shutdown network ?\\nYou might lose access to this router if you " ++#~ "are connected via this interface." ++#~ msgstr "" ++#~ "Biztos, hogy leállítja a hálózatot? Elvesztheti a hozzáférést ehhez a " ++#~ "routerhez, ha ezen a hálózaton keresztül pacsolódik hozzá." ++ ++#~ msgid "" ++#~ "The network ports on your router can be combined to several VLANs in which computers can " ++#~ "communicate directly with each other. VLANs are often used to separate different network " ++#~ "segments. Often there is by default one Uplink port for a connection to " ++#~ "the next greater network like the internet and other ports for a local " ++#~ "network." ++#~ msgstr "" ++#~ "A hálózati portok a routeren összekapcsolhatók több VLAN-ba, melyeken belül a számítógépek " ++#~ "közvetlenül tudnak kommunikálni egymással. A VLAN-okat gyakran használják különbözÅ‘ " ++#~ "hálózatrészek szétválasztására. Ãltalában van egy felmenÅ‘ port a " ++#~ "következÅ‘ nagyobb hálózathoz mint az internet, és további portok a helyi " ++#~ "hálózathoz." ++ ++#~ msgid "Enable buffering" ++#~ msgstr "Ãtmeneti tárazás engedélyezése" ++ ++#~ msgid "IPv6-over-IPv4" ++#~ msgstr "IPv6 IPv4 felett" ++ ++#~ msgid "Time Synchronisation" ++#~ msgstr "IdÅ‘ szinkronizálás" ++ ++#~ msgid "Client Port" ++#~ msgstr "Ãœgyfél port" ++ ++#~ msgid "Statistics" ++#~ msgstr "Statisztikák" ++ ++#~ msgid "Client Address" ++#~ msgstr "Ãœgyfél cím" ++ ++#~ msgid "Active UPnP Redirects" ++#~ msgstr "Aktív UPnP átirányítások" ++ ++#~ msgid "Age" ++#~ msgstr "Kor" ++ ++#~ msgid "The AHCP Service is not running." ++#~ msgstr "Az AHCP szolgáltatás nem fut." ++ ++#~ msgid "VnStat Traffic Monitor" ++#~ msgstr "VnStat forgalom figyelÅ‘" ++ ++#~ msgid "AHCP Server" ++#~ msgstr "AHCP kiszolgáló" ++ ++#~ msgid "The AHCP Service is running with ID %s." ++#~ msgstr "Az AHCP szolgáltatás fut, azonosítója: %s." ++ ++#~ msgid "SIP devices on Network" ++#~ msgstr "SIP eszközök a hálózaton" ++ ++#~ msgid "Devices on Network" ++#~ msgstr "Eszközök a hálózaton" ++ ++#~ msgid "There are no active redirects." ++#~ msgstr "Nincsenek aktív átirányítások." ++ ++#~ msgid "SIP Devices on Network" ++#~ msgstr "SIP eszközök a hálózaton" ++ ++#~ msgid "Active AHCP Leases" ++#~ msgstr "Aktív AHCP bérletek" +diff --git a/feeds/luci/modules/luci-base/po/it/base.po b/feeds/luci/modules/luci-base/po/it/base.po +new file mode 100644 +index 0000000..ffb1fdf +--- /dev/null ++++ b/feeds/luci/modules/luci-base/po/it/base.po +@@ -0,0 +1,4126 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: LuCI\n" ++"Report-Msgid-Bugs-To: \n" ++"POT-Creation-Date: 2009-06-10 03:40+0200\n" ++"PO-Revision-Date: 2015-04-20 10:33+0100\n" ++"Last-Translator: muxator \n" ++"Language-Team: LANGUAGE \n" ++"Language: it\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n != 1);\n" ++"X-Generator: Poedit 1.6.10\n" ++ ++msgid "(%d minute window, %d second interval)" ++msgstr "(%d finestra in minuti , %d secondi intervallo)" ++ ++msgid "(%s available)" ++msgstr "(%s disponibile)" ++ ++msgid "(empty)" ++msgstr "(vuoto)" ++ ++msgid "(no interfaces attached)" ++msgstr "(nessuna interfaccia collegata)" ++ ++msgid "-- Additional Field --" ++msgstr "-- Campo aggiuntivo --" ++ ++msgid "-- Please choose --" ++msgstr "-- Per favore scegli --" ++ ++msgid "-- custom --" ++msgstr "-- personalizzato --" ++ ++msgid "-- match by device --" ++msgstr "" ++ ++msgid "-- match by label --" ++msgstr "" ++ ++msgid "1 Minute Load:" ++msgstr "Carico in 1 minuto:" ++ ++msgid "15 Minute Load:" ++msgstr "Carico in 15 minut:" ++ ++msgid "5 Minute Load:" ++msgstr "Carico in 5 minuti:" ++ ++msgid "BSSID" ++msgstr "" ++"BSSID" ++ ++msgid "DNS query port" ++msgstr "Richiesta porta DNS" ++ ++msgid "DNS server port" ++msgstr "Porta Server DNS" ++ ++msgid "" ++"DNS servers will be queried in the " ++"order of the resolvfile" ++msgstr "" ++"DNS I server che verranno " ++"interrogati nell'ordine del resolv file" ++ ++msgid "ESSID" ++msgstr "" ++"ESSID" ++ ++msgid "IPv4-Address" ++msgstr "Indirizzo IPv4" ++ ++msgid "IPv4-Gateway" ++msgstr "Gateway IPv4" ++ ++msgid "IPv4-Netmask" ++msgstr "" ++"Maschera di rete IPv4" ++ ++msgid "" ++"IPv6-Address or Network " ++"(CIDR)" ++msgstr "" ++"Indirizzo IPv6 o rete " ++"(CIDR)" ++ ++msgid "IPv6-Gateway" ++msgstr "Gateway IPv6" ++ ++msgid "IPv6-Suffix (hex)" ++msgstr "" ++ ++msgid "LED Configuration" ++msgstr "Configurazione LED" ++ ++msgid "LED Name" ++msgstr "LED Nome" ++ ++msgid "MAC-Address" ++msgstr "Indirizzo MAC" ++ ++msgid "" ++"Max. DHCP leases" ++msgstr "" ++"Max. Contratto DHCP" ++ ++msgid "" ++"Max. EDNS0 packet size" ++msgstr "" ++"Max. dimensione pacchetti EDNS0" ++ ++msgid "Max. concurrent queries" ++msgstr "Max. Richiesta in uso" ++ ++msgid "%s - %s" ++msgstr "%s - %s" ++ ++msgid "ADSL" ++msgstr "" ++ ++msgid "ADSL Status" ++msgstr "" ++ ++msgid "AICCU (SIXXS)" ++msgstr "" ++ ++msgid "APN" ++msgstr "APN" ++ ++msgid "AR Support" ++msgstr "Supporto AR" ++ ++msgid "ARP retry threshold" ++msgstr "riprova soglia ARP" ++ ++msgid "ATM Bridges" ++msgstr "Ponti ATM" ++ ++msgid "ATM Virtual Channel Identifier (VCI)" ++msgstr "Identificatore Canale Virtuale ATM (VCI)" ++ ++msgid "ATM Virtual Path Identifier (VPI)" ++msgstr "Identificatore Percorso Virtuale ATM (VPI)" ++ ++msgid "" ++"ATM bridges expose encapsulated ethernet in AAL5 connections as virtual " ++"Linux network interfaces which can be used in conjunction with DHCP or PPP " ++"to dial into the provider network." ++msgstr "" ++"I ponti ATM incapsulano connessioni in AAL5, in modo che i dispositivi " ++"virtuali si possono interfacciare con le reti virtuali Linux in congiunzione " ++"con la comunicazione DHCP o PPP dell'ISP." ++ ++msgid "ATM device number" ++msgstr "Numero dispositivo ATM " ++ ++msgid "AYIYA" ++msgstr "" ++ ++msgid "Access Concentrator" ++msgstr "Accesso Concentratore" ++ ++msgid "Access Point" ++msgstr "Punto di Accesso" ++ ++msgid "Action" ++msgstr "Azione" ++ ++msgid "Actions" ++msgstr "Azioni" ++ ++msgid "Activate this network" ++msgstr "Attiva questa rete" ++ ++msgid "Active IPv4-Routes" ++msgstr "" ++"Instradamento IPv4 " ++"attivo" ++ ++msgid "Active IPv6-Routes" ++msgstr "" ++"Instradamento IPv6 " ++"attivo" ++ ++msgid "Active Connections" ++msgstr "Connessioni attive" ++ ++msgid "Active DHCP Leases" ++msgstr "Attiva contratti DHCP" ++ ++msgid "Active DHCPv6 Leases" ++msgstr "Attiva contratti DHCPv6" ++ ++msgid "Ad-Hoc" ++msgstr "Ad-Hoc" ++ ++msgid "Add" ++msgstr "Aggiungi" ++ ++msgid "Add local domain suffix to names served from hosts files" ++msgstr "" ++"Aggiungere il suffisso di dominio locale ai nomi serviti dal file hosts" ++ ++msgid "Add new interface..." ++msgstr "Aggiungi nuova interfaccia..." ++ ++msgid "Additional Hosts files" ++msgstr "File Hosts Aggiuntivo" ++ ++msgid "Address" ++msgstr "Indirizzo" ++ ++msgid "Address to access local relay bridge" ++msgstr "Indirizzo per accedere al ponte locale di trasmissione" ++ ++msgid "Administration" ++msgstr "Amministrazione" ++ ++msgid "Advanced Settings" ++msgstr "Opzioni Avanzate" ++ ++msgid "Alert" ++msgstr "Avviso" ++ ++msgid "Allow SSH password authentication" ++msgstr "" ++"Permetti autenticazione SSH tramite " ++"password" ++ ++msgid "Allow all except listed" ++msgstr "Consenti tutti tranne quelli nell'elenco" ++ ++msgid "Allow listed only" ++msgstr "Consenti solo quelli nell'elenco" ++ ++msgid "Allow localhost" ++msgstr "Permetti localhost" ++ ++msgid "Allow remote hosts to connect to local SSH forwarded ports" ++msgstr "" ++"Permetti agli host remoti di connettersi tramite ssh reindirizzando le porte" ++ ++msgid "Allow root logins with password" ++msgstr "Permetti l'accesso a root con password" ++ ++msgid "Allow the root user to login with password" ++msgstr "Abilita l'utente root con l'accesso via password" ++ ++msgid "" ++"Allow upstream responses in the 127.0.0.0/8 range, e.g. for RBL services" ++msgstr "" ++"Permetti le risposte upstream nell'intervallo 127.0.0.0/8, per esempio nei " ++"servizi RBL" ++ ++msgid "" ++"Also see Tunneling Comparison on SIXXS" ++msgstr "" ++ ++msgid "Always announce default router" ++msgstr "" ++ ++msgid "An additional network will be created if you leave this unchecked." ++msgstr "Sarà creata una rete aggiuntiva se lasci questo senza spunta." ++ ++msgid "Announce as default router even if no public prefix is available." ++msgstr "" ++ ++msgid "Announced DNS domains" ++msgstr "" ++ ++msgid "Announced DNS servers" ++msgstr "" ++ ++msgid "Antenna 1" ++msgstr "Antenna 1" ++ ++msgid "Antenna 2" ++msgstr "Antenna 2" ++ ++msgid "Antenna Configuration" ++msgstr "Configurazione dell'Antenna" ++ ++msgid "Any zone" ++msgstr "Qualsiasi Zona" ++ ++msgid "Apply" ++msgstr "Applica" ++ ++msgid "Applying changes" ++msgstr "Applica modifiche" ++ ++msgid "" ++"Assign a part of given length of every public IPv6-prefix to this interface" ++msgstr "" ++ ++msgid "Assign interfaces..." ++msgstr "Assegna Interfacce..." ++ ++msgid "" ++"Assign prefix parts using this hexadecimal subprefix ID for this interface." ++msgstr "" ++ ++msgid "Associated Stations" ++msgstr "Dispositivi Wi-Fi connessi" ++ ++msgid "Atheros 802.11%s Wireless Controller" ++msgstr "Dispositivo Wireless Atheros 802.11%s" ++ ++msgid "AuthGroup" ++msgstr "" ++ ++msgid "Authentication" ++msgstr "Autenticazione PEAP" ++ ++msgid "Authoritative" ++msgstr "Autoritativo" ++ ++msgid "Authorization Required" ++msgstr "Autorizzazione richiesta" ++ ++msgid "Auto Refresh" ++msgstr "Aggiornamento Automatico" ++ ++msgid "Automatic" ++msgstr "" ++ ++msgid "Automatic Homenet (HNCP)" ++msgstr "" ++ ++msgid "Available" ++msgstr "Disponibili" ++ ++msgid "Available packages" ++msgstr "Pacchetti disponibili" ++ ++msgid "Average:" ++msgstr "Media:" ++ ++msgid "BSSID" ++msgstr "BSSID" ++ ++msgid "Back" ++msgstr "Indietro" ++ ++msgid "Back to Overview" ++msgstr "Ritorna alla panoramica" ++ ++msgid "Back to configuration" ++msgstr "Indietro alla configurazione" ++ ++msgid "Back to overview" ++msgstr "Ritorna alla panoramica" ++ ++msgid "Back to scan results" ++msgstr "Ritorno ai risultati della scansione" ++ ++msgid "Background Scan" ++msgstr "Scansione in background" ++ ++msgid "Backup / Flash Firmware" ++msgstr "Copia di Sicurezza / Flash Firmware" ++ ++msgid "Backup / Restore" ++msgstr "Copia di Sicurezza / Ripristina" ++ ++msgid "Backup file list" ++msgstr "Elenco dei file di cui effettuare una copia di sicurezza" ++ ++msgid "Bad address specified!" ++msgstr "E' stato specificato un indirizzo errato!" ++ ++msgid "Band" ++msgstr "" ++ ++msgid "Behind NAT" ++msgstr "" ++ ++msgid "" ++"Below is the determined list of files to backup. It consists of changed " ++"configuration files marked by opkg, essential base files and the user " ++"defined backup patterns." ++msgstr "" ++"Di seguito l'elenco dei file di cui effettuare la copia di sicurezza. Essa è " ++"composta dai file di configurazione modificati installati da opkg, file di " ++"base essenziali e i file di backup definiti dall'utente." ++ ++msgid "Bitrate" ++msgstr "Bitrate" ++ ++msgid "Bogus NX Domain Override" ++msgstr "Ignora Dominio Bogus NX" ++ ++msgid "Bridge" ++msgstr "Ponte" ++ ++msgid "Bridge interfaces" ++msgstr "Interfacce Ponte" ++ ++msgid "Bridge unit number" ++msgstr "Numero Unità Ponte" ++ ++msgid "Bring up on boot" ++msgstr "Attivare all'avvio" ++ ++msgid "Broadcom 802.11%s Wireless Controller" ++msgstr "Dispositivo Wireless Broadcom 802.11%s" ++ ++msgid "Broadcom BCM%04x 802.11 Wireless Controller" ++msgstr "Dispositivo Wireless Broadcom BCM%04x 802.11" ++ ++msgid "Buffered" ++msgstr "Buffered" ++ ++msgid "Buttons" ++msgstr "Pulsanti" ++ ++msgid "CA certificate; if empty it will be saved after the first connection." ++msgstr "" ++ ++msgid "CPU" ++msgstr "CPU" ++ ++msgid "CPU usage (%)" ++msgstr "Uso CPU (%)" ++ ++msgid "Cancel" ++msgstr "Annulla" ++ ++msgid "Category" ++msgstr "" ++ ++msgid "Chain" ++msgstr "Catena" ++ ++msgid "Changes" ++msgstr "Modifiche" ++ ++msgid "Changes applied." ++msgstr "Modifiche applicate." ++ ++msgid "Changes the administrator password for accessing the device" ++msgstr "Cambia la password di amministratore per accedere al dispositivo" ++ ++msgid "Channel" ++msgstr "Canale" ++ ++msgid "Check" ++msgstr "Verifica" ++ ++msgid "Checksum" ++msgstr "Checksum" ++ ++msgid "" ++"Choose the firewall zone you want to assign to this interface. Select " ++"unspecified to remove the interface from the associated zone or " ++"fill out the create field to define a new zone and attach the " ++"interface to it." ++msgstr "" ++"Scegli la zona del firewall che si desidera assegnare a questa interfaccia. " ++"Selezionare non specificato per rimuovere l'interfaccia dalla zona " ++"associata o compilare il campo crea per definire una nuova zona e " ++"collegare l'interfaccia ad esso." ++ ++msgid "" ++"Choose the network(s) you want to attach to this wireless interface or fill " ++"out the create field to define a new network." ++msgstr "" ++"Segliere la/le rete/reti a cui vuoi collegare questa interfaccia wireless o " ++"riempire il campo crea per definire una nuova rete." ++ ++msgid "Cipher" ++msgstr "Cifratura" ++ ++msgid "" ++"Click \"Generate archive\" to download a tar archive of the current " ++"configuration files. To reset the firmware to its initial state, click " ++"\"Perform reset\" (only possible with squashfs images)." ++msgstr "" ++"Premi su \"Genera archivio\" per scaricare un archivio tar di backup dei " ++"file di configurazione attuali. Per ripristinare il firmware al suo stato " ++"iniziale premi \"Esegui RIpristino\" (solo per firmware basati su squashfs)." ++ ++msgid "Client" ++msgstr "Cliente" ++ ++msgid "Client ID to send when requesting DHCP" ++msgstr "ID Cliente da inviare all'interno della richiesta DHCP" ++ ++msgid "" ++"Close inactive connection after the given amount of seconds, use 0 to " ++"persist connection" ++msgstr "" ++"Chiudi le connessioni inattive dopo x secondi, usa 0 per connessioni " ++"persistenti" ++ ++msgid "Close list..." ++msgstr "Scegliere dall'elenco..." ++ ++msgid "Collecting data..." ++msgstr "Raccolgo i dati..." ++ ++msgid "Command" ++msgstr "Comando" ++ ++msgid "Common Configuration" ++msgstr "Configurazioni Comuni" ++ ++msgid "Compression" ++msgstr "Compressione" ++ ++msgid "Configuration" ++msgstr "Configurazione" ++ ++msgid "Configuration applied." ++msgstr "Configurazione salvata." ++ ++msgid "Configuration files will be kept." ++msgstr "I file di configurazione verranno mantenuti." ++ ++msgid "Confirmation" ++msgstr "Conferma" ++ ++msgid "Connect" ++msgstr "Connetti" ++ ++msgid "Connected" ++msgstr "Connesso" ++ ++msgid "Connection Limit" ++msgstr "Limite connessioni" ++ ++msgid "Connection to server fails when TLS cannot be used" ++msgstr "" ++ ++msgid "Connections" ++msgstr "Connessioni" ++ ++msgid "Country" ++msgstr "Nazione" ++ ++msgid "Country Code" ++msgstr "Codice Nazione" ++ ++msgid "Cover the following interface" ++msgstr "Coprire la seguente interfaccia" ++ ++msgid "Cover the following interfaces" ++msgstr "Coprire le seguenti interfacce" ++ ++msgid "Create / Assign firewall-zone" ++msgstr "Crea / Assegna zona firewall" ++ ++msgid "Create Interface" ++msgstr "Crea Interfaccia" ++ ++msgid "Create a bridge over multiple interfaces" ++msgstr "Crea un ponte tra interfaccie multiple" ++ ++msgid "Critical" ++msgstr "Critico" ++ ++msgid "Cron Log Level" ++msgstr "Livello di log del Cron" ++ ++msgid "Custom Interface" ++msgstr "Interfaccia personalizzata" ++ ++msgid "Custom delegated IPv6-prefix" ++msgstr "" ++ ++msgid "" ++"Customizes the behaviour of the device LEDs if possible." ++msgstr "" ++"Personalizza la configurazione dei LED del sistema se possibile." ++ ++msgid "DHCP Leases" ++msgstr "Contratta DHCP" ++ ++msgid "DHCP Server" ++msgstr "Server DHCP" ++ ++msgid "DHCP and DNS" ++msgstr "DHCP e DNS" ++ ++msgid "DHCP client" ++msgstr "Client DHCP" ++ ++msgid "DHCP-Options" ++msgstr "Opzioni DHCP" ++ ++msgid "DHCPv6 Leases" ++msgstr "Locazioni DHCPv6" ++ ++msgid "DHCPv6 client" ++msgstr "" ++ ++msgid "DHCPv6-Mode" ++msgstr "" ++ ++msgid "DHCPv6-Service" ++msgstr "" ++ ++msgid "DNS" ++msgstr "DNS" ++ ++msgid "DNS forwardings" ++msgstr "Inoltri DNS" ++ ++msgid "DNS-Label / FQDN" ++msgstr "" ++ ++msgid "DS-Lite AFTR address" ++msgstr "" ++ ++msgid "DUID" ++msgstr "DUID" ++ ++msgid "Debug" ++msgstr "Debug" ++ ++msgid "Default %d" ++msgstr "Predefinito %d" ++ ++msgid "Default gateway" ++msgstr "Gateway predefinito" ++ ++msgid "Default route" ++msgstr "" ++ ++msgid "Default state" ++msgstr "Stato Predefinito" ++ ++msgid "Define a name for this network." ++msgstr "Definisci un nome per questa rete." ++ ++msgid "" ++"Define additional DHCP options, for example " ++"\"6,192.168.2.1,192.168.2.2\" which advertises different DNS " ++"servers to clients." ++msgstr "" ++"Definisci opzioni DHCP aggiuntive, per esempio " ++"\"6,192.168.2.1,192.168.2.2\" fornisce differenti server DNS ai " ++"client." ++ ++msgid "Delete" ++msgstr "Elimina" ++ ++msgid "Delete this interface" ++msgstr "Rimuovi questa interfaccia" ++ ++msgid "Delete this network" ++msgstr "Rimuovi questa rete" ++ ++msgid "Description" ++msgstr "Descrizione" ++ ++msgid "Design" ++msgstr "Disegno" ++ ++msgid "Destination" ++msgstr "Destinazione" ++ ++msgid "Device" ++msgstr "Dispositivo" ++ ++msgid "Device Configuration" ++msgstr "Configurazione del dispositivo" ++ ++msgid "Diagnostics" ++msgstr "Diagnostica" ++ ++msgid "Dial number" ++msgstr "" ++ ++msgid "Directory" ++msgstr "Cartella" ++ ++msgid "Disable" ++msgstr "Disabilita" ++ ++msgid "" ++"Disable DHCP for " ++"this interface." ++msgstr "" ++"Disabilita DHCP per questa interfaccia." ++ ++msgid "Disable DNS setup" ++msgstr "Disabilita il setup dei DNS" ++ ++msgid "Disable HW-Beacon timer" ++msgstr "Disabilita Timer Beacon HW" ++ ++msgid "Disabled" ++msgstr "Disabilitato" ++ ++msgid "Discard upstream RFC1918 responses" ++msgstr "Ignora risposte RFC1918 upstream" ++ ++msgid "Displaying only packages containing" ++msgstr "Visualizza solo i pacchetti contenenti" ++ ++msgid "Distance Optimization" ++msgstr "Ottimizzazione distanza" ++ ++msgid "Distance to farthest network member in meters." ++msgstr "Distanza del membro più lontano della rete in metri." ++ ++msgid "Diversity" ++msgstr "Diversità" ++ ++msgid "" ++"Dnsmasq is a combined DHCP-Server and DNS-" ++"Forwarder for NAT " ++"firewalls" ++msgstr "" ++"Dnsmasq è un server DHCP e inoltratore DNS " ++"per firewall NAT" ++ ++msgid "Do not cache negative replies, e.g. for not existing domains" ++msgstr "Non memorizzare le repliche negative, es. per domini non esistenti" ++ ++msgid "Do not forward requests that cannot be answered by public name servers" ++msgstr "" ++"Non inoltrare le richieste che non possono essere risolte dai name server " ++"pubblici" ++ ++msgid "Do not forward reverse lookups for local networks" ++msgstr "Non proseguire con le ricerche inverse per le reti locali." ++ ++msgid "Do not send probe responses" ++msgstr "Disabilita Probe-Responses" ++ ++msgid "Domain required" ++msgstr "Dominio richiesto" ++ ++msgid "Domain whitelist" ++msgstr "Elenco Domini consentiti" ++ ++msgid "" ++"Don't forward DNS-Requests without " ++"DNS-Name" ++msgstr "" ++"Non inoltrare le richieste DNS " ++"senza nome DNS" ++ ++msgid "Download and install package" ++msgstr "Scarica e installa pacchetto" ++ ++msgid "Download backup" ++msgstr "Download backup" ++ ++msgid "Dropbear Instance" ++msgstr "Instanza di Dropbear" ++ ++msgid "" ++"Dropbear offers SSH network shell access " ++"and an integrated SCP server" ++msgstr "" ++"Dropbear offre accesso SSH e integra un " ++"server SCP" ++ ++msgid "Dual-Stack Lite (RFC6333)" ++msgstr "" ++ ++msgid "Dynamic DHCP" ++msgstr "" ++"DHCP dinamico" ++ ++msgid "Dynamic tunnel" ++msgstr "Dynamic tunnel" ++ ++msgid "" ++"Dynamically allocate DHCP addresses for clients. If disabled, only clients " ++"having static leases will be served." ++msgstr "" ++"Fornisci dinamicamente gli indirizzi DHCP ai client. Se disabilitato, solo i " ++"client con un indirizzo statico saranno serviti." ++ ++msgid "EAP-Method" ++msgstr "Metodo EAP" ++ ++msgid "Edit" ++msgstr "Modifica" ++ ++msgid "" ++"Edit the raw configuration data above to fix any error and hit \"Save\" to " ++"reload the page." ++msgstr "" ++ ++msgid "Edit this interface" ++msgstr "Modifica questa interfaccia" ++ ++msgid "Edit this network" ++msgstr "Modifica questa rete" ++ ++msgid "Emergency" ++msgstr "Emergenza" ++ ++msgid "Enable" ++msgstr "Abilita" ++ ++msgid "Enable STP" ++msgstr "Abilita STP" ++ ++msgid "Enable HE.net dynamic endpoint update" ++msgstr "Abilitazione aggiornamento endpoint dinamico HE.net" ++ ++msgid "Enable IPv6 negotiation on the PPP link" ++msgstr "Attiva la negoziazione IPv6 sul collegamento PPP" ++ ++msgid "Enable Jumbo Frame passthrough" ++msgstr "Abilita Jumbo Frame passthrough" ++ ++msgid "Enable NTP client" ++msgstr "Attiva il client NTP" ++ ++msgid "Enable TFTP server" ++msgstr "Abilita il server TFTP" ++ ++msgid "Enable VLAN functionality" ++msgstr "Abilita la funzionalità VLAN" ++ ++msgid "Enable WPS pushbutton, requires WPA(2)-PSK" ++msgstr "" ++ ++msgid "Enable learning and aging" ++msgstr "Attivare l'apprendimento e l'invecchiamento" ++ ++msgid "Enable mirroring of incoming packets" ++msgstr "" ++ ++msgid "Enable mirroring of outgoing packets" ++msgstr "" ++ ++msgid "Enable this mount" ++msgstr "Abilita questo mount" ++ ++msgid "Enable this swap" ++msgstr "Abilita questo swap" ++ ++msgid "Enable/Disable" ++msgstr "Abilita/Disabilita" ++ ++msgid "Enabled" ++msgstr "Abilitato" ++ ++msgid "Enables the Spanning Tree Protocol on this bridge" ++msgstr "Abilita il protocollo di Spanning Tree su questo bridge" ++ ++msgid "Encapsulation mode" ++msgstr "Modalità di incapsulamento" ++ ++msgid "Encryption" ++msgstr "Crittografia" ++ ++msgid "Erasing..." ++msgstr "Cancellazione..." ++ ++msgid "Error" ++msgstr "Errore" ++ ++msgid "Ethernet Adapter" ++msgstr "Scheda di Rete" ++ ++msgid "Ethernet Switch" ++msgstr "Switch di Rete" ++ ++msgid "Expand hosts" ++msgstr "Espandi gli hosts" ++ ++msgid "Expires" ++msgstr "Scadenze" ++ ++msgid "" ++"Expiry time of leased addresses, minimum is 2 minutes (2m)." ++msgstr "" ++"Tempo di scadenza di indirizzi localizzati, il minimo è di 2 minuti ( " ++"2m )." ++ ++msgid "External" ++msgstr "" ++ ++msgid "External system log server" ++msgstr "Server Log di Sistema esterno" ++ ++msgid "External system log server port" ++msgstr "Porta Server Log di Sistema esterno" ++ ++msgid "Fast Frames" ++msgstr "Frame veloci" ++ ++msgid "File" ++msgstr "File" ++ ++msgid "Filename of the boot image advertised to clients" ++msgstr "Nome del file dell'immagine di avvio annunciato ai clienti." ++ ++msgid "Filesystem" ++msgstr "Filesystem" ++ ++msgid "Filter" ++msgstr "Filtro" ++ ++msgid "Filter private" ++msgstr "Filtra privati" ++ ++msgid "Filter useless" ++msgstr "Filtra inutili" ++ ++msgid "Find and join network" ++msgstr "Trova e aggiungi una rete" ++ ++msgid "Find package" ++msgstr "Cerca pacchetto" ++ ++msgid "Finish" ++msgstr "Fine" ++ ++msgid "Firewall" ++msgstr "Firewall" ++ ++msgid "Firewall Settings" ++msgstr "Impostazioni Firewall" ++ ++msgid "Firewall Status" ++msgstr "Stato del Firewall" ++ ++msgid "Firmware Version" ++msgstr "Versione del Firmware" ++ ++msgid "Fixed source port for outbound DNS queries" ++msgstr "Porta di origine fissa per le richieste DNS in uscita" ++ ++msgid "Flags" ++msgstr "Flags" ++ ++msgid "Flash Firmware" ++msgstr "Flash Firmware" ++ ++msgid "Flash image..." ++msgstr "Flash immagine..." ++ ++msgid "Flash new firmware image" ++msgstr "Flash immagine nuovo firmware" ++ ++msgid "Flash operations" ++msgstr "Operazioni Flash" ++ ++msgid "Flashing..." ++msgstr "Flashing..." ++ ++msgid "Force" ++msgstr "Forza" ++ ++msgid "Force CCMP (AES)" ++msgstr "Forza CCMP (AES)" ++ ++msgid "Force DHCP on this network even if another server is detected." ++msgstr "Forza DHCP su questa rete, anche se un altro server viene rilevato." ++ ++msgid "Force TKIP" ++msgstr "Forza TKIP" ++ ++msgid "Force TKIP and CCMP (AES)" ++msgstr "Forza TKIP e CCMP (AES)" ++ ++msgid "Forward DHCP traffic" ++msgstr "Inoltra il traffico DHCP" ++ ++msgid "Forward broadcast traffic" ++msgstr "Inoltra il traffico broadcast" ++ ++msgid "Forwarding mode" ++msgstr "Modalità di Inoltro" ++ ++msgid "Fragmentation Threshold" ++msgstr "Soglia di frammentazione" ++ ++msgid "Frame Bursting" ++msgstr "Frame Bursting" ++ ++msgid "Free" ++msgstr "Disponibile" ++ ++msgid "Free space" ++msgstr "Spazio libero" ++ ++msgid "GHz" ++msgstr "GHz" ++ ++msgid "GPRS only" ++msgstr "Solo GPRS" ++ ++msgid "Gateway" ++msgstr "Gateway" ++ ++msgid "Gateway ports" ++msgstr "Porte Gateway" ++ ++msgid "General Settings" ++msgstr "Opzioni Generali" ++ ++msgid "General Setup" ++msgstr "Impostazioni Generali" ++ ++msgid "Generate archive" ++msgstr "Genera Archivio" ++ ++msgid "Generic 802.11%s Wireless Controller" ++msgstr "Dispositivo Wireless 802.11%s Generico" ++ ++msgid "Given password confirmation did not match, password not changed!" ++msgstr "" ++"La conferma della password assegnata non ha prodotto risultati, la password " ++"non è stata cambiata!" ++ ++msgid "Global network options" ++msgstr "" ++ ++msgid "Go to password configuration..." ++msgstr "Vai alla configurazione della password..." ++ ++msgid "Go to relevant configuration page" ++msgstr "Vai alla pagina di configurazione relativa" ++ ++msgid "Guest" ++msgstr "" ++ ++msgid "HE.net password" ++msgstr "Password HE.net" ++ ++msgid "HE.net username" ++msgstr "" ++ ++msgid "Handler" ++msgstr "Gestore" ++ ++msgid "Hang Up" ++msgstr "Hangup" ++ ++msgid "Heartbeat" ++msgstr "" ++ ++msgid "" ++"Here you can configure the basic aspects of your device like its hostname or " ++"the timezone." ++msgstr "" ++"Qui puoi configurare gli aspetti base del tuo dispositivo come l'" ++"hostname o il fuso orario." ++ ++msgid "" ++"Here you can paste public SSH-Keys (one per line) for SSH public-key " ++"authentication." ++msgstr "" ++"Qui è possibile incollare le chiavi pubbliche SSH (uno per riga) per " ++"l'autenticazione con chiave pubblica SSH." ++ ++msgid "Hermes 802.11b Wireless Controller" ++msgstr "Dispositivo Wireless Hermes 802.11b" ++ ++msgid "Hide ESSID" ++msgstr "Nascondi ESSID" ++ ++msgid "Host entries" ++msgstr "Campi host" ++ ++msgid "Host expiry timeout" ++msgstr "Timeout scadenza Host" ++ ++msgid "Host-IP or Network" ++msgstr "" ++"IP dell'host o rete" ++ ++msgid "Hostname" ++msgstr "Hostname" ++ ++msgid "Hostname to send when requesting DHCP" ++msgstr "Nome host da inviare al momento della richiesta DHCP" ++ ++msgid "Hostnames" ++msgstr "Hostname" ++ ++msgid "Hybrid" ++msgstr "" ++ ++msgid "IP address" ++msgstr "Indirizzo IP" ++ ++msgid "IPv4" ++msgstr "IPv4" ++ ++msgid "IPv4 Firewall" ++msgstr "IPv4 Firewall" ++ ++msgid "IPv4 WAN Status" ++msgstr "Stato WAN IPv4" ++ ++msgid "IPv4 address" ++msgstr "Indirizzi IPv4" ++ ++msgid "IPv4 and IPv6" ++msgstr "IPv4 e IPv6" ++ ++msgid "IPv4 assignment length" ++msgstr "" ++ ++msgid "IPv4 broadcast" ++msgstr "trasmissione IPv4" ++ ++msgid "IPv4 gateway" ++msgstr "Gateway IPv4" ++ ++msgid "IPv4 netmask" ++msgstr "Maschera rete IPv4" ++ ++msgid "IPv4 only" ++msgstr "Solo IPv4" ++ ++msgid "IPv4 prefix length" ++msgstr "Lunghezza prefisso IPv4" ++ ++msgid "IPv4-Address" ++msgstr "Indirizzo-IPv4" ++ ++msgid "IPv6" ++msgstr "IPv6" ++ ++msgid "IPv6 Firewall" ++msgstr "IPv6 Firewall" ++ ++msgid "IPv6 Neighbours" ++msgstr "" ++ ++msgid "IPv6 Settings" ++msgstr "" ++ ++msgid "IPv6 ULA-Prefix" ++msgstr "" ++ ++msgid "IPv6 WAN Status" ++msgstr "Stato WAN IPv6" ++ ++msgid "IPv6 address" ++msgstr "Indirizzi IPv6" ++ ++msgid "IPv6 address delegated to the local tunnel endpoint (optional)" ++msgstr "" ++ ++msgid "IPv6 assignment hint" ++msgstr "" ++ ++msgid "IPv6 assignment length" ++msgstr "" ++ ++msgid "IPv6 gateway" ++msgstr "Gateway IPv6" ++ ++msgid "IPv6 only" ++msgstr "Solo IPv6" ++ ++msgid "IPv6 prefix" ++msgstr "Prefisso IPv6" ++ ++msgid "IPv6 prefix length" ++msgstr "Lunghezza prefisso IPv6" ++ ++msgid "IPv6 routed prefix" ++msgstr "" ++ ++msgid "IPv6-Address" ++msgstr "Indirizzo-IPv6" ++ ++msgid "IPv6-in-IPv4 (RFC4213)" ++msgstr "IPv6-in-IPv4 (RFC4213)" ++ ++msgid "IPv6-over-IPv4 (6rd)" ++msgstr "IPv6-su-IPv4 (6rd)" ++ ++msgid "IPv6-over-IPv4 (6to4)" ++msgstr "IPv6-su-IPv4 (6to4)" ++ ++msgid "Identity" ++msgstr "Identità PEAP" ++ ++msgid "" ++"If specified, mount the device by its UUID instead of a fixed device node" ++msgstr "" ++"Se specificato, montare il dispositivo dal suo UUID invece che dal nodo di " ++"dispositivo fisso" ++ ++msgid "" ++"If specified, mount the device by the partition label instead of a fixed " ++"device node" ++msgstr "" ++"Se specificato, montare il dispositivo dall'etichetta della partizione al " ++"posto di un nodo di un dispositivo fisso" ++ ++msgid "If unchecked, no default route is configured" ++msgstr "Se deselezionata, alcun percorso predefinito è configurato" ++ ++msgid "If unchecked, the advertised DNS server addresses are ignored" ++msgstr "" ++"Se deselezionata, gli indirizzi ai Server DNS annunciati saranno ignorati" ++ ++msgid "" ++"If your physical memory is insufficient unused data can be temporarily " ++"swapped to a swap-device resulting in a higher amount of usable RAM. Be aware that swapping data is a very " ++"slow process as the swap-device cannot be accessed with the high datarates " ++"of the RAM." ++msgstr "" ++"Se la tua memoria è insufficiente i dati non usati possono venire " ++"temporaneamente spostati in un'area di swap risultando in un più grande " ++"quantitativo di RAM usabile. " ++"Sappi che spostare dati in swap è un processo molto lento e che il " ++"dispositivo di swap non può essere acceduto alle alte velocità della RAM." ++ ++msgid "Ignore Hosts files" ++msgstr "Ignora i files Hosts" ++ ++msgid "Ignore interface" ++msgstr "Ignora interfaccia" ++ ++msgid "Ignore resolve file" ++msgstr "Ignora file resolv" ++ ++msgid "Image" ++msgstr "Immagine" ++ ++msgid "In" ++msgstr "In" ++ ++msgid "Inactivity timeout" ++msgstr "Tempo di Inattività" ++ ++msgid "Inbound:" ++msgstr "in entrata:" ++ ++msgid "Info" ++msgstr "Informazioni" ++ ++msgid "Initscript" ++msgstr "Script di avvio" ++ ++msgid "Initscripts" ++msgstr "Scripts di avvio" ++ ++msgid "Install" ++msgstr "Installa" ++ ++msgid "Install iputils-traceroute6 for IPv6 traceroute" ++msgstr "" ++ ++msgid "Install package %q" ++msgstr "Installa il pacchetto %q" ++ ++msgid "Install protocol extensions..." ++msgstr "Installa le estensioni del protocollo..." ++ ++msgid "Installed packages" ++msgstr "Pacchetti installati" ++ ++msgid "Interface" ++msgstr "Interfaccia" ++ ++msgid "Interface Configuration" ++msgstr "Configurazione Interfaccia" ++ ++msgid "Interface Overview" ++msgstr "Riassunto Interfaccia" ++ ++msgid "Interface is reconnecting..." ++msgstr "L'interfaccia si sta ricollegando..." ++ ++msgid "Interface is shutting down..." ++msgstr "L'intefaccia si sta spegnendo..." ++ ++msgid "Interface not present or not connected yet." ++msgstr "Interfaccia non presente o non ancora connessa." ++ ++msgid "Interface reconnected" ++msgstr "Interfaccia ricollegata." ++ ++msgid "Interface shut down" ++msgstr "Interfaccia spenta" ++ ++msgid "Interfaces" ++msgstr "Interfacce" ++ ++msgid "Internal" ++msgstr "" ++ ++msgid "Internal Server Error" ++msgstr "Errore del Server Interno" ++ ++msgid "Invalid" ++msgstr "Valore immesso non valido" ++ ++msgid "Invalid VLAN ID given! Only IDs between %d and %d are allowed." ++msgstr "ID VLAN non valido! Solo gli ID compresi tra %d e %d sono consentiti." ++ ++msgid "Invalid VLAN ID given! Only unique IDs are allowed" ++msgstr "ID VLAN non valido! Solo gli ID unici sono consentiti" ++ ++msgid "Invalid username and/or password! Please try again." ++msgstr "Username o password non validi! Per favore riprova." ++ ++#, fuzzy ++msgid "" ++"It appears that you are trying to flash an image that does not fit into the " ++"flash memory, please verify the image file!" ++msgstr "" ++"Sembra tu stia provando a flashare un'immagine più grande delle dimensioni " ++"della memoria flash, per favore controlla il file!" ++ ++msgid "Java Script required!" ++msgstr "Richiesto Java Script!" ++ ++msgid "Join Network" ++msgstr "Aggiungi Rete" ++ ++msgid "Join Network: Settings" ++msgstr "Aggiunta Rete: Impostazioni" ++ ++msgid "Join Network: Wireless Scan" ++msgstr "Aggiunta Rete: Rilevamento Wireless" ++ ++msgid "Keep settings" ++msgstr "Mantieni le Impostazioni" ++ ++msgid "Kernel Log" ++msgstr "Log del kernel" ++ ++msgid "Kernel Version" ++msgstr "Versione del kernel" ++ ++msgid "Key" ++msgstr "Chiave" ++ ++msgid "Key #%d" ++msgstr "Chiave #%d" ++ ++msgid "Kill" ++msgstr "Uccidi" ++ ++msgid "L2TP" ++msgstr "L2TP" ++ ++msgid "L2TP Server" ++msgstr "Server L2TP" ++ ++msgid "LCP echo failure threshold" ++msgstr "fallimento soglia echo LCP" ++ ++msgid "LCP echo interval" ++msgstr "Intervallo echo LCP" ++ ++msgid "LLC" ++msgstr "LLC" ++ ++msgid "Label" ++msgstr "Etichetta" ++ ++msgid "Language" ++msgstr "Lingua" ++ ++msgid "Language and Style" ++msgstr "Lingua e Stile" ++ ++msgid "Leaf" ++msgstr "" ++ ++msgid "Lease validity time" ++msgstr "Periodo di Validità del Lease" ++ ++msgid "Leasefile" ++msgstr "File di lease" ++ ++msgid "Leasetime" ++msgstr "Tempo di lease" ++ ++msgid "Leasetime remaining" ++msgstr "Tempo lease residuo" ++ ++msgid "Leave empty to autodetect" ++msgstr "Lasciare vuoto per l'autorilevamento" ++ ++msgid "Leave empty to use the current WAN address" ++msgstr "Lasciare vuoto per usare l'indirizzo WAN attuale" ++ ++msgid "Legend:" ++msgstr "Legenda:" ++ ++msgid "Limit" ++msgstr "Limite" ++ ++msgid "Line Attenuation" ++msgstr "" ++ ++msgid "Line Speed" ++msgstr "" ++ ++msgid "Line State" ++msgstr "" ++ ++msgid "Link On" ++msgstr "Collegamento on" ++ ++msgid "" ++"List of DNS servers to forward " ++"requests to" ++msgstr "" ++"Elenco di Server DNSa cui " ++"inoltrare le richieste in" ++ ++msgid "List of domains to allow RFC1918 responses for" ++msgstr "Elenco di domini da consentire le risposte RFC1918 per" ++ ++msgid "List of hosts that supply bogus NX domain results" ++msgstr "Elenco degli host che forniscono falsi risultati di dominio NX" ++ ++msgid "Listen only on the given interface or, if unspecified, on all" ++msgstr "Ascolta solo l'interfaccia data o, se non specificato, su tutte" ++ ++msgid "Listening port for inbound DNS queries" ++msgstr "Porta di ascolto per le richieste DNS in entrata" ++ ++msgid "Load" ++msgstr "Carico" ++ ++msgid "Load Average" ++msgstr "Carico Medio" ++ ++msgid "Loading" ++msgstr "Caricamento" ++ ++msgid "Local IPv4 address" ++msgstr "Indirizzo IPv4 locale" ++ ++msgid "Local IPv6 address" ++msgstr "Indirizzo IPv6 locale" ++ ++msgid "Local Startup" ++msgstr "Avvio Locale" ++ ++msgid "Local Time" ++msgstr "Ora locale" ++ ++msgid "Local domain" ++msgstr "Dominio Locale" ++ ++#, fuzzy ++msgid "" ++"Local domain specification. Names matching this domain are never forwarded " ++"and are resolved from DHCP or hosts files only" ++msgstr "" ++"Specifiche dominio locale. I nomi di dominio corrispondenti a questi criteri " ++"non sono mai inoltrate e risolti solo da DHCP o file hosts" ++ ++msgid "Local domain suffix appended to DHCP names and hosts file entries" ++msgstr "" ++"Suffisso di dominio locale aggiunto ai nomi dei DHCP e voci del file hosts" ++ ++msgid "Local server" ++msgstr "Server Locale" ++ ++msgid "" ++"Localise hostname depending on the requesting subnet if multiple IPs are " ++"available" ++msgstr "" ++"Localizzare nome host a seconda della sottorete richiedente se sono " ++"disponibili IP multipli" ++ ++msgid "Localise queries" ++msgstr "Localizza richieste" ++ ++msgid "Locked to channel %d used by: %s" ++msgstr "" ++ ++msgid "Log output level" ++msgstr "Livello di dettaglio registro" ++ ++msgid "Log queries" ++msgstr "Logga richieste" ++ ++msgid "Logging" ++msgstr "Logging" ++ ++msgid "Login" ++msgstr "Login" ++ ++msgid "Logout" ++msgstr "Logout" ++ ++msgid "Lowest leased address as offset from the network address." ++msgstr "" ++ ++msgid "MAC-Address" ++msgstr "" ++ ++msgid "MAC-Address Filter" ++msgstr "Filtro dei MAC-Address" ++ ++msgid "MAC-Filter" ++msgstr "Filtro MAC" ++ ++msgid "MAC-List" ++msgstr "Lista MAC" ++ ++msgid "MB/s" ++msgstr "" ++ ++msgid "MHz" ++msgstr "" ++ ++msgid "MTU" ++msgstr "MTU" ++ ++msgid "" ++"Make sure to clone the root filesystem using something like the commands " ++"below:" ++msgstr "" ++ ++msgid "Maximum Rate" ++msgstr "Velocità massima" ++ ++msgid "Maximum allowed number of active DHCP leases" ++msgstr "" ++ ++msgid "Maximum allowed number of concurrent DNS queries" ++msgstr "" ++ ++msgid "Maximum allowed size of EDNS.0 UDP packets" ++msgstr "" ++ ++msgid "Maximum amount of seconds to wait for the modem to become ready" ++msgstr "" ++ ++msgid "Maximum hold time" ++msgstr "Velocità massima" ++ ++msgid "Maximum number of leased addresses." ++msgstr "" ++ ++msgid "Mbit/s" ++msgstr "" ++ ++msgid "Memory" ++msgstr "Memoria" ++ ++msgid "Memory usage (%)" ++msgstr "Uso Memory (%)" ++ ++msgid "Metric" ++msgstr "Metrica" ++ ++msgid "Minimum Rate" ++msgstr "Velocità minima" ++ ++msgid "Minimum hold time" ++msgstr "Velocità minima" ++ ++msgid "Mirror monitor port" ++msgstr "" ++ ++msgid "Mirror source port" ++msgstr "" ++ ++msgid "Missing protocol extension for proto %q" ++msgstr "" ++ ++msgid "Mode" ++msgstr "Modalità" ++ ++msgid "Model" ++msgstr "" ++ ++msgid "Modem device" ++msgstr "Dispositivo modem" ++ ++msgid "Modem init timeout" ++msgstr "" ++ ++msgid "Monitor" ++msgstr "Monitor" ++ ++msgid "Mount Entry" ++msgstr "" ++ ++msgid "Mount Point" ++msgstr "Punto di mount" ++ ++msgid "Mount Points" ++msgstr "Punto di mount" ++ ++msgid "Mount Points - Mount Entry" ++msgstr "" ++ ++msgid "Mount Points - Swap Entry" ++msgstr "" ++ ++msgid "" ++"Mount Points define at which point a memory device will be attached to the " ++"filesystem" ++msgstr "" ++"I punti di mount definiscono in quale punto un dispositivo di memoria verrà " ++"attaccato al tuo filesystem" ++ ++msgid "Mount options" ++msgstr "Opzioni di mount" ++ ++msgid "Mount point" ++msgstr "Punto di mount" ++ ++msgid "Mounted file systems" ++msgstr "File system montati" ++ ++msgid "Move down" ++msgstr "" ++ ++msgid "Move up" ++msgstr "" ++ ++msgid "Multicast Rate" ++msgstr "Velocità multicast" ++ ++msgid "Multicast address" ++msgstr "" ++ ++msgid "NAS ID" ++msgstr "ID della NAS" ++ ++msgid "NDP-Proxy" ++msgstr "" ++ ++msgid "NTP server candidates" ++msgstr "" ++ ++msgid "NTP sync time-out" ++msgstr "" ++ ++msgid "Name" ++msgstr "Nome" ++ ++msgid "Name of the new interface" ++msgstr "Nome della nuova interfaccia" ++ ++msgid "Name of the new network" ++msgstr "Nome della nuova rete" ++ ++msgid "Navigation" ++msgstr "Navigazione" ++ ++msgid "Netmask" ++msgstr "Maschera di rete" ++ ++msgid "Network" ++msgstr "Rete" ++ ++msgid "Network Utilities" ++msgstr "Utilità di Rete" ++ ++msgid "Network boot image" ++msgstr "" ++ ++msgid "Network without interfaces." ++msgstr "" ++ ++msgid "Next »" ++msgstr "Prossimo »" ++ ++msgid "No DHCP Server configured for this interface" ++msgstr "" ++ ++msgid "No chains in this table" ++msgstr "" ++ ++msgid "No files found" ++msgstr "Nessun file trovato" ++ ++msgid "No information available" ++msgstr "Nessuna informazione disponibile" ++ ++msgid "No negative cache" ++msgstr "" ++ ++msgid "No network configured on this device" ++msgstr "Nessuna rete è configurata su questo dispositivo" ++ ++msgid "No network name specified" ++msgstr "" ++ ++msgid "No package lists available" ++msgstr "" ++ ++msgid "No password set!" ++msgstr "" ++ ++msgid "No rules in this chain" ++msgstr "" ++ ++msgid "No zone assigned" ++msgstr "" ++ ++msgid "Noise" ++msgstr "Rumore" ++ ++msgid "Noise Margin" ++msgstr "" ++ ++msgid "Noise:" ++msgstr "" ++ ++msgid "None" ++msgstr "Nessuno" ++ ++msgid "Normal" ++msgstr "Normale" ++ ++msgid "Not Found" ++msgstr "" ++ ++msgid "Not associated" ++msgstr "Non associato" ++ ++msgid "Not connected" ++msgstr "" ++ ++msgid "Note: Configuration files will be erased." ++msgstr "" ++ ++msgid "Notice" ++msgstr "Avviso" ++ ++msgid "Nslookup" ++msgstr "" ++ ++msgid "OK" ++msgstr "OK" ++ ++msgid "OPKG-Configuration" ++msgstr "Configurazione di OPKG" ++ ++msgid "Off-State Delay" ++msgstr "" ++ ++msgid "" ++"On this page you can configure the network interfaces. You can bridge " ++"several interfaces by ticking the \"bridge interfaces\" field and enter the " ++"names of several network interfaces separated by spaces. You can also use " ++"VLAN notation " ++"INTERFACE.VLANNR (e.g.: " ++"eth0.1)." ++msgstr "" ++"In questa pagina puoi configurare le interfacce di rete.Puoi unire più " ++"interfacce spuntando la voce \"unisci interfacce\" e inserendo i nomi di più " ++"interfacce di rete separate da spazi. Puoi anche usare la notazione VLAN INTERFACCIA.VLANNUM (e.s.: eth0.1)." ++ ++msgid "On-State Delay" ++msgstr "" ++ ++msgid "One of hostname or mac address must be specified!" ++msgstr "" ++ ++msgid "One or more fields contain invalid values!" ++msgstr "Uno o più campi contengono valori non validi!" ++ ++msgid "One or more required fields have no value!" ++msgstr "Uno o più campi obbligatori sono vuoti!" ++ ++msgid "Open list..." ++msgstr "" ++ ++msgid "OpenConnect (CISCO AnyConnect)" ++msgstr "" ++ ++msgid "Operating frequency" ++msgstr "" ++ ++msgid "Option changed" ++msgstr "Opzione cambiata" ++ ++msgid "Option removed" ++msgstr "Opzione cancellata" ++ ++msgid "Optional, specify to override default server (tic.sixxs.net)" ++msgstr "" ++ ++msgid "Optional, use when the SIXXS account has more than one tunnel" ++msgstr "" ++ ++msgid "Options" ++msgstr "Opzioni" ++ ++msgid "Other:" ++msgstr "Altro:" ++ ++msgid "Out" ++msgstr "" ++ ++msgid "Outbound:" ++msgstr "" ++ ++msgid "Outdoor Channels" ++msgstr "" ++ ++msgid "Output Interface" ++msgstr "" ++ ++msgid "Override MAC address" ++msgstr "" ++ ++msgid "Override MTU" ++msgstr "" ++ ++msgid "Override the gateway in DHCP responses" ++msgstr "" ++ ++msgid "" ++"Override the netmask sent to clients. Normally it is calculated from the " ++"subnet that is served." ++msgstr "" ++ ++msgid "Override the table used for internal routes" ++msgstr "" ++ ++msgid "Overview" ++msgstr "Riassunto" ++ ++msgid "Owner" ++msgstr "Proprietario" ++ ++msgid "PAP/CHAP password" ++msgstr "" ++ ++msgid "PAP/CHAP username" ++msgstr "" ++ ++msgid "PID" ++msgstr "PID" ++ ++msgid "PIN" ++msgstr "" ++ ++msgid "PPP" ++msgstr "" ++ ++msgid "PPPoA Encapsulation" ++msgstr "Incapsulamento PPPoA" ++ ++msgid "PPPoATM" ++msgstr "" ++ ++msgid "PPPoE" ++msgstr "" ++ ++msgid "PPtP" ++msgstr "" ++ ++msgid "Package libiwinfo required!" ++msgstr "E' richiesto il pacchetto libiwinfo!" ++ ++msgid "Package lists are older than 24 hours" ++msgstr "" ++ ++msgid "Package name" ++msgstr "Nome pacchetto" ++ ++msgid "Packets" ++msgstr "Pacchetti" ++ ++msgid "Part of zone %q" ++msgstr "" ++ ++msgid "Password" ++msgstr "Password" ++ ++msgid "Password authentication" ++msgstr "Password di authenticazione" ++ ++msgid "Password of Private Key" ++msgstr "Password della chiave privata" ++ ++msgid "Password successfully changed!" ++msgstr "Password cambiata con successo!" ++ ++msgid "Path" ++msgstr "Percorso" ++ ++msgid "Path to CA-Certificate" ++msgstr "Percorso al certificato CA" ++ ++msgid "Path to Client-Certificate" ++msgstr "" ++ ++msgid "Path to Private Key" ++msgstr "Percorso alla chiave privata" ++ ++msgid "Path to executable which handles the button event" ++msgstr "" ++ ++msgid "Peak:" ++msgstr "Picco:" ++ ++msgid "Perform reboot" ++msgstr "Esegui un riavvio" ++ ++msgid "Perform reset" ++msgstr "" ++ ++msgid "Phy Rate:" ++msgstr "" ++ ++msgid "Physical Settings" ++msgstr "" ++ ++msgid "Ping" ++msgstr "" ++ ++msgid "Pkts." ++msgstr "" ++ ++msgid "Please enter your username and password." ++msgstr "Per favore inserisci il tuo username e la password." ++ ++msgid "Please wait: Device rebooting..." ++msgstr "Per favore attendi: Riavvio del dispositivo..." ++ ++msgid "Policy" ++msgstr "" ++ ++msgid "Port" ++msgstr "Porta" ++ ++msgid "Port %d" ++msgstr "Porta %d" ++ ++msgid "Port %d is untagged in multiple VLANs!" ++msgstr "" ++ ++msgid "Port status:" ++msgstr "" ++ ++msgid "" ++"Presume peer to be dead after given amount of LCP echo failures, use 0 to " ++"ignore failures" ++msgstr "" ++ ++msgid "Prevents client-to-client communication" ++msgstr "Impedisci la comunicazione fra Client" ++ ++msgid "Prism2/2.5/3 802.11b Wireless Controller" ++msgstr "" ++ ++msgid "Proceed" ++msgstr "Continuare" ++ ++msgid "Processes" ++msgstr "Processi" ++ ++msgid "Prot." ++msgstr "Prot." ++ ++msgid "Protocol" ++msgstr "Protocollo" ++ ++msgid "Protocol family" ++msgstr "" ++ ++msgid "Protocol of the new interface" ++msgstr "" ++ ++msgid "Protocol support is not installed" ++msgstr "" ++ ++msgid "Provide NTP server" ++msgstr "" ++ ++msgid "Provide new network" ++msgstr "" ++ ++msgid "Pseudo Ad-Hoc (ahdemo)" ++msgstr "Pseudo Ad-Hoc (ahdemo)" ++ ++msgid "Public prefix routed to this device for distribution to clients." ++msgstr "" ++ ++msgid "Quality" ++msgstr "" ++ ++msgid "RTS/CTS Threshold" ++msgstr "Soglia RTS/CTS" ++ ++msgid "RX" ++msgstr "" ++ ++msgid "RX Rate" ++msgstr "" ++ ++msgid "RaLink 802.11%s Wireless Controller" ++msgstr "" ++ ++msgid "Radius-Accounting-Port" ++msgstr "" ++ ++msgid "Radius-Accounting-Secret" ++msgstr "" ++ ++msgid "Radius-Accounting-Server" ++msgstr "" ++ ++msgid "Radius-Authentication-Port" ++msgstr "" ++ ++msgid "Radius-Authentication-Secret" ++msgstr "" ++ ++msgid "Radius-Authentication-Server" ++msgstr "" ++ ++msgid "" ++"Read /etc/ethers to configure the DHCP-Server" ++msgstr "" ++"Leggi /etc/ethers per configurare il server DHCP" ++ ++msgid "" ++"Really delete this interface? The deletion cannot be undone!\\nYou might " ++"lose access to this device if you are connected via this interface." ++msgstr "" ++ ++msgid "" ++"Really delete this wireless network? The deletion cannot be undone!\\nYou " ++"might lose access to this device if you are connected via this network." ++msgstr "" ++ ++msgid "Really reset all changes?" ++msgstr "" ++ ++#, fuzzy ++msgid "" ++"Really shut down network?\\nYou might lose access to this device if you are " ++"connected via this interface." ++msgstr "" ++"Vuoi davvero spegnere questa interfaccia \"%s\" ?\\nPotresti perdere " ++"l'accesso a questo router se stai usando questa interfaccia." ++ ++msgid "" ++"Really shutdown interface \"%s\" ?\\nYou might lose access to this device if " ++"you are connected via this interface." ++msgstr "" ++ ++msgid "Really switch protocol?" ++msgstr "" ++ ++msgid "Realtime Connections" ++msgstr "Connessioni in tempo reale" ++ ++msgid "Realtime Graphs" ++msgstr "" ++ ++msgid "Realtime Load" ++msgstr "Carico in tempo reale" ++ ++msgid "Realtime Traffic" ++msgstr "Traffico in tempo reale" ++ ++msgid "Realtime Wireless" ++msgstr "" ++ ++msgid "Rebind protection" ++msgstr "" ++ ++msgid "Reboot" ++msgstr "Riavvia" ++ ++msgid "Rebooting..." ++msgstr "" ++ ++msgid "Reboots the operating system of your device" ++msgstr "Riavvia il sistema operativo del tuo dispositivo" ++ ++msgid "Receive" ++msgstr "Ricezione" ++ ++msgid "Receiver Antenna" ++msgstr "Antenna ricevente" ++ ++msgid "Reconnect this interface" ++msgstr "Ricollega questa interfaccia" ++ ++msgid "Reconnecting interface" ++msgstr "Sto ricollegando l'interfaccia" ++ ++msgid "References" ++msgstr "" ++ ++msgid "Regulatory Domain" ++msgstr "" ++ ++msgid "Relay" ++msgstr "" ++ ++msgid "Relay Bridge" ++msgstr "" ++ ++msgid "Relay between networks" ++msgstr "" ++ ++msgid "Relay bridge" ++msgstr "" ++ ++msgid "Remote IPv4 address" ++msgstr "" ++ ++msgid "Remove" ++msgstr "Rimuovi" ++ ++msgid "Repeat scan" ++msgstr "" ++ ++msgid "Replace entry" ++msgstr "Sostituisci campo" ++ ++msgid "Replace wireless configuration" ++msgstr "" ++ ++msgid "Request IPv6-address" ++msgstr "" ++ ++msgid "Request IPv6-prefix of length" ++msgstr "" ++ ++msgid "Require TLS" ++msgstr "" ++ ++msgid "Required for certain ISPs, e.g. Charter with DOCSIS 3" ++msgstr "" ++ ++msgid "Reset" ++msgstr "Reset" ++ ++msgid "Reset Counters" ++msgstr "Azzera Contatori" ++ ++msgid "Reset to defaults" ++msgstr "" ++ ++msgid "Resolv and Hosts Files" ++msgstr "" ++ ++msgid "Resolve file" ++msgstr "File Resolve" ++ ++msgid "Restart" ++msgstr "Riavvia" ++ ++msgid "Restart Firewall" ++msgstr "Riavvia Firewall" ++ ++msgid "Restore backup" ++msgstr "Ripristina backup" ++ ++msgid "Reveal/hide password" ++msgstr "" ++ ++msgid "Revert" ++msgstr "Ripristina" ++ ++msgid "Root" ++msgstr "" ++ ++msgid "Root directory for files served via TFTP" ++msgstr "" ++ ++msgid "Root preparation" ++msgstr "" ++ ++msgid "Routed IPv6 prefix for downstream interfaces" ++msgstr "" ++ ++msgid "Router Advertisement-Service" ++msgstr "" ++ ++msgid "Router Password" ++msgstr "" ++ ++msgid "Routes" ++msgstr "Route" ++ ++msgid "" ++"Routes specify over which interface and gateway a certain host or network " ++"can be reached." ++msgstr "" ++"Le route specificano attraverso quale interfaccia e gateway un certo host o " ++"rete può essere raggiunto." ++ ++msgid "Rule #" ++msgstr "" ++ ++msgid "Run a filesystem check before mounting the device" ++msgstr "" ++ ++msgid "Run filesystem check" ++msgstr "" ++ ++msgid "" ++"SIXXS supports TIC only, for static tunnels using IP protocol 41 (RFC4213) " ++"use 6in4 instead" ++msgstr "" ++ ++msgid "SIXXS-handle[/Tunnel-ID]" ++msgstr "" ++ ++msgid "SSH Access" ++msgstr "" ++ ++msgid "SSH-Keys" ++msgstr "" ++ ++msgid "SSID" ++msgstr "" ++ ++msgid "Save" ++msgstr "Salva" ++ ++msgid "Save & Apply" ++msgstr "Salva & applica" ++ ++msgid "Save & Apply" ++msgstr "" ++ ++msgid "Scan" ++msgstr "Scan" ++ ++msgid "Scheduled Tasks" ++msgstr "Operazioni programmate" ++ ++msgid "Section added" ++msgstr "" ++ ++msgid "Section removed" ++msgstr "" ++ ++msgid "See \"mount\" manpage for details" ++msgstr "" ++ ++msgid "" ++"Send LCP echo requests at the given interval in seconds, only effective in " ++"conjunction with failure threshold" ++msgstr "" ++ ++msgid "Separate Clients" ++msgstr "Isola utenti" ++ ++msgid "Separate WDS" ++msgstr "WDS separati" ++ ++msgid "Server Settings" ++msgstr "" ++ ++msgid "Server password" ++msgstr "" ++ ++msgid "" ++"Server password, enter the specific password of the tunnel when the username " ++"contains the tunnel ID" ++msgstr "" ++ ++msgid "Server username" ++msgstr "" ++ ++msgid "Service Name" ++msgstr "" ++ ++msgid "Service Type" ++msgstr "" ++ ++msgid "Services" ++msgstr "Servizi" ++ ++msgid "Set up Time Synchronization" ++msgstr "" ++ ++msgid "Setup DHCP Server" ++msgstr "" ++ ++msgid "Show current backup file list" ++msgstr "" ++ ++msgid "Shutdown this interface" ++msgstr "" ++ ++msgid "Shutdown this network" ++msgstr "" ++ ++msgid "Signal" ++msgstr "Segnale" ++ ++msgid "Signal:" ++msgstr "" ++ ++msgid "Size" ++msgstr "Dimensione" ++ ++msgid "Skip" ++msgstr "Salta" ++ ++msgid "Skip to content" ++msgstr "Salta a contenuto" ++ ++msgid "Skip to navigation" ++msgstr "Salta a navigazione" ++ ++msgid "Slot time" ++msgstr "Slot time" ++ ++msgid "Software" ++msgstr "Software" ++ ++msgid "Some fields are invalid, cannot save values!" ++msgstr "Alcuni campi non sono validi, non è possibile salvare i valori!" ++ ++msgid "Sorry, the object you requested was not found." ++msgstr "Siamo spiacenti, l'oggetto che hai richiesto non è stato trovato." ++ ++msgid "Sorry, the server encountered an unexpected error." ++msgstr "Spiacente, il server ha rilevato un errore imprevisto." ++ ++#, fuzzy ++msgid "" ++"Sorry, there is no sysupgrade support present; a new firmware image must be " ++"flashed manually. Please refer to the OpenWrt wiki for device specific " ++"install instructions." ++msgstr "" ++"Spiacenti, non è presente alcun supporto sysupgrade, una nuova immagine " ++"firmware deve essere memorizzata (Flash) manualmente. Si prega di fare " ++"riferimento al wiki di OpenWrt per le istruzioni di installazione di " ++"dispositivi specifici." ++ ++msgid "Sort" ++msgstr "Elenca" ++ ++msgid "Source" ++msgstr "Origine" ++ ++msgid "Source routing" ++msgstr "" ++ ++msgid "Specifies the button state to handle" ++msgstr "Specifica lo stato del pulsante da gestire" ++ ++msgid "Specifies the directory the device is attached to" ++msgstr "Specifica la cartella a cui è collegato il dispositivo in" ++ ++msgid "Specifies the listening port of this Dropbear instance" ++msgstr "Specifica la porta di ascolto di questa istanza Dropbear" ++ ++msgid "" ++"Specifies the maximum amount of failed ARP requests until hosts are presumed " ++"to be dead" ++msgstr "" ++"Consente di specificare la quantità massima di richieste ARP fallite finché " ++"gli host si presume siano morti." ++ ++msgid "" ++"Specifies the maximum amount of seconds after which hosts are presumed to be " ++"dead" ++msgstr "" ++"Specifica la quantità massima di secondi dopo di che si presume che gli host " ++"siano morti." ++ ++msgid "Specify the secret encryption key here." ++msgstr "Specificare la chiave di cifratura qui." ++ ++msgid "Start" ++msgstr "Inizio" ++ ++msgid "Start priority" ++msgstr "Priorità di avvio" ++ ++msgid "Startup" ++msgstr "Avvio" ++ ++msgid "Static IPv4 Routes" ++msgstr "Instradamento statico IPv4" ++ ++msgid "Static IPv6 Routes" ++msgstr "Instradamento statico IPv6" ++ ++msgid "Static Leases" ++msgstr "Leases statici" ++ ++msgid "Static Routes" ++msgstr "Instradamenti Statici" ++ ++msgid "Static WDS" ++msgstr "WDS statico" ++ ++msgid "Static address" ++msgstr "Indirizzo Statico" ++ ++msgid "" ++"Static leases are used to assign fixed IP addresses and symbolic hostnames " ++"to DHCP clients. They are also required for non-dynamic interface " ++"configurations where only hosts with a corresponding lease are served." ++msgstr "" ++"Leasing statici vengono utilizzati per assegnare indirizzi IP fissi e nomi " ++"host simbolici ai client DHCP. Essi sono necessari anche per interfacce di " ++"configurazione non dinamici, dove solo gli host con lease corrispondente " ++"servito vengono serviti." ++ ++msgid "Status" ++msgstr "Stato" ++ ++msgid "Stop" ++msgstr "Ferma" ++ ++msgid "Strict order" ++msgstr "Ordine severo" ++ ++msgid "Submit" ++msgstr "Invia" ++ ++msgid "Swap" ++msgstr "" ++ ++msgid "Swap Entry" ++msgstr "Scambia ingresso" ++ ++msgid "Switch" ++msgstr "Switch" ++ ++msgid "Switch %q" ++msgstr "Switch %q" ++ ++msgid "Switch %q (%s)" ++msgstr "Switch %q (%s)" ++ ++msgid "Switch protocol" ++msgstr "Cambia protocollo" ++ ++msgid "Sync with browser" ++msgstr "Sincronizza con il browser" ++ ++msgid "Synchronizing..." ++msgstr "Sincronizzazione..." ++ ++msgid "System" ++msgstr "Sistema" ++ ++msgid "System Log" ++msgstr "Log di sistema" ++ ++msgid "System Properties" ++msgstr "Proprietà di Sistema" ++ ++msgid "System log buffer size" ++msgstr "Dimensione Buffer Log di Sistema" ++ ++msgid "TCP:" ++msgstr "TCP:" ++ ++msgid "TFTP Settings" ++msgstr "Impostazioni TFTP" ++ ++msgid "TFTP server root" ++msgstr "Server TFTP principale" ++ ++msgid "TX" ++msgstr "TX" ++ ++msgid "TX Rate" ++msgstr "Velocità di TX" ++ ++msgid "Table" ++msgstr "Tabella" ++ ++msgid "Target" ++msgstr "Destinazione" ++ ++msgid "Terminate" ++msgstr "Termina" ++ ++#, fuzzy ++msgid "" ++"The Device Configuration section covers physical settings of the " ++"radio hardware such as channel, transmit power or antenna selection which " ++"are shared among all defined wireless networks (if the radio hardware is " ++"multi-SSID capable). Per network settings like encryption or operation mode " ++"are grouped in the Interface Configuration." ++msgstr "" ++"La sezione Configurazione del Dispositivo illustra le impostazioni " ++"fisiche del hardware radio come canale, la potenza di trasmissione o la " ++"selezione dell'antenna che viene condiviso tra tutte le reti wireless " ++"definite (se l'hardware radio è multi-SSID compatibilie). Per le " ++"impostazioni di rete come la crittografia o la modalità di funzionamento " ++"sono raggruppati nella configurazione dell'interfaccia." ++ ++msgid "" ++"The libiwinfo-lua package is not installed. You must install this " ++"component for working wireless configuration!" ++msgstr "" ++"Il pacchetto libiwinfo-lua non è installato. È necessario " ++"installare questo componente per il lavoro di configurazione wireless!" ++ ++msgid "" ++"The HE.net endpoint update configuration changed, you must now use the plain " ++"username instead of the user ID!" ++msgstr "" ++ ++msgid "" ++"The IPv6 prefix assigned to the provider, usually ends with ::" ++msgstr "" ++"Il prefisso IPv6 assegnati dal provider, si conclude di solito con ::" ++ ++msgid "" ++"The allowed characters are: A-Z, a-z, 0-9 and _" ++msgstr "" ++ ++msgid "The configuration file could not be loaded due to the following error:" ++msgstr "" ++ ++msgid "" ++"The device file of the memory or partition (e.g." ++" /dev/sda1)" ++msgstr "" ++"Il file del dispositivo di memoria o della partizione (e.s. /dev/sda1)" ++ ++msgid "" ++"The filesystem that was used to format the memory (e.g. ext3)" ++msgstr "" ++"Il filesystem usato per formattare la memoria (e." ++"s. ext3)" ++ ++msgid "" ++"The flash image was uploaded. Below is the checksum and file size listed, " ++"compare them with the original file to ensure data integrity.
    Click " ++"\"Proceed\" below to start the flash procedure." ++msgstr "" ++ ++msgid "The following changes have been committed" ++msgstr "" ++ ++msgid "The following changes have been reverted" ++msgstr "Le seguenti modifiche sono state annullate" ++ ++msgid "The following rules are currently active on this system." ++msgstr "Le seguenti regole sono al momento attive su questo sistema." ++ ++msgid "The given network name is not unique" ++msgstr "" ++ ++msgid "" ++"The hardware is not multi-SSID capable and the existing configuration will " ++"be replaced if you proceed." ++msgstr "" ++ ++msgid "" ++"The length of the IPv4 prefix in bits, the remainder is used in the IPv6 " ++"addresses." ++msgstr "" ++ ++msgid "The length of the IPv6 prefix in bits" ++msgstr "" ++ ++msgid "" ++"The network ports on this device can be combined to several VLANs in which computers can " ++"communicate directly with each other. VLANs are often used to separate different network " ++"segments. Often there is by default one Uplink port for a connection to the " ++"next greater network like the internet and other ports for a local network." ++msgstr "" ++ ++msgid "The selected protocol needs a device assigned" ++msgstr "" ++ ++msgid "" ++"The system is erasing the configuration partition now and will reboot itself " ++"when finished." ++msgstr "" ++ ++#, fuzzy ++msgid "" ++"The system is flashing now.
    DO NOT POWER OFF THE DEVICE!
    Wait a " ++"few minutes before you try to reconnect. It might be necessary to renew the " ++"address of your computer to reach the device again, depending on your " ++"settings." ++msgstr "" ++"The system is flashing now.
    DO NOT POWER OFF THE DEVICE!
    Wait a " ++"few minutes until you try to reconnect. It might be necessary to renew the " ++"address of your computer to reach the device again, depending on your " ++"settings." ++ ++msgid "" ++"The tunnel end-point is behind NAT, defaults to disabled and only applies to " ++"AYIYA" ++msgstr "" ++ ++msgid "" ++"The uploaded image file does not contain a supported format. Make sure that " ++"you choose the generic image format for your platform." ++msgstr "" ++"The uploaded image file does not contain a supported format. Make sure that " ++"you choose the generic image format for your platform." ++ ++msgid "There are no active leases." ++msgstr "" ++ ++msgid "There are no pending changes to apply!" ++msgstr "" ++ ++msgid "There are no pending changes to revert!" ++msgstr "" ++ ++msgid "There are no pending changes!" ++msgstr "" ++ ++msgid "" ++"There is no device assigned yet, please attach a network device in the " ++"\"Physical Settings\" tab" ++msgstr "" ++ ++msgid "" ++"There is no password set on this router. Please configure a root password to " ++"protect the web interface and enable SSH." ++msgstr "" ++ ++msgid "This IPv4 address of the relay" ++msgstr "" ++ ++msgid "" ++"This is a list of shell glob patterns for matching files and directories to " ++"include during sysupgrade. Modified files in /etc/config/ and certain other " ++"configurations are automatically preserved." ++msgstr "" ++ ++msgid "" ++"This is either the \"Update Key\" configured for the tunnel or the account " ++"password if no update key has been configured" ++msgstr "" ++ ++msgid "" ++"This is the content of /etc/rc.local. Insert your own commands here (in " ++"front of 'exit 0') to execute them at the end of the boot process." ++msgstr "" ++ ++msgid "" ++"This is the local endpoint address assigned by the tunnel broker, it usually " ++"ends with :2" ++msgstr "" ++ ++msgid "" ++"This is the only DHCP in the local network" ++msgstr "" ++"Questo è l'unico server DHCP nella tua rete locale" ++ ++msgid "This is the plain username for logging into the account" ++msgstr "" ++ ++msgid "" ++"This is the prefix routed to you by the tunnel broker for use by clients" ++msgstr "" ++ ++msgid "This is the system crontab in which scheduled tasks can be defined." ++msgstr "" ++"Questa è la crontab del sistema nella quale possono essere definiti le " ++"operazioni da programmare." ++ ++msgid "" ++"This is usually the address of the nearest PoP operated by the tunnel broker" ++msgstr "" ++ ++msgid "" ++"This list gives an overview over currently running system processes and " ++"their status." ++msgstr "" ++"Questa lista da un riassunto dei processi correntemente attivi e del loro " ++"stato." ++ ++msgid "This page allows the configuration of custom button actions" ++msgstr "" ++ ++msgid "This page gives an overview over currently active network connections." ++msgstr "Questa pagina ti da una riassunto delle connessioni al momento attive." ++ ++msgid "This section contains no values yet" ++msgstr "Questa sezione non contiene ancora valori" ++ ++msgid "Time Synchronization" ++msgstr "" ++ ++msgid "Time Synchronization is not configured yet." ++msgstr "" ++ ++msgid "Timezone" ++msgstr "Fuso orario" ++ ++msgid "" ++"To restore configuration files, you can upload a previously generated backup " ++"archive here." ++msgstr "" ++ ++msgid "Total Available" ++msgstr "Totale" ++ ++msgid "Traceroute" ++msgstr "" ++ ++msgid "Traffic" ++msgstr "Traffico" ++ ++msgid "Transfer" ++msgstr "" ++ ++msgid "Transmission Rate" ++msgstr "Velocità di transmissione" ++ ++msgid "Transmit" ++msgstr "Trasmissione" ++ ++msgid "Transmit Power" ++msgstr "Potenza di trasmissione" ++ ++msgid "Transmitter Antenna" ++msgstr "Antenna trasmettente" ++ ++msgid "Trigger" ++msgstr "" ++ ++msgid "Trigger Mode" ++msgstr "" ++ ++msgid "Tunnel ID" ++msgstr "" ++ ++msgid "Tunnel Interface" ++msgstr "" ++ ++msgid "Tunnel Link" ++msgstr "" ++ ++msgid "Tunnel broker protocol" ++msgstr "" ++ ++msgid "Tunnel setup server" ++msgstr "" ++ ++msgid "Tunnel type" ++msgstr "" ++ ++msgid "Turbo Mode" ++msgstr "Modalità turbo" ++ ++msgid "Tx-Power" ++msgstr "" ++ ++msgid "Type" ++msgstr "Tipo" ++ ++msgid "UDP:" ++msgstr "" ++ ++msgid "UMTS only" ++msgstr "" ++ ++msgid "UMTS/GPRS/EV-DO" ++msgstr "" ++ ++msgid "USB Device" ++msgstr "" ++ ++msgid "UUID" ++msgstr "" ++ ++msgid "Unable to dispatch" ++msgstr "" ++ ++msgid "Unknown" ++msgstr "" ++ ++msgid "Unknown Error, password not changed!" ++msgstr "" ++ ++msgid "Unmanaged" ++msgstr "" ++ ++msgid "Unsaved Changes" ++msgstr "Modifiche non salvate" ++ ++msgid "Unsupported protocol type." ++msgstr "" ++ ++msgid "Update lists" ++msgstr "" ++ ++msgid "" ++"Upload a sysupgrade-compatible image here to replace the running firmware. " ++"Check \"Keep settings\" to retain the current configuration (requires an " ++"OpenWrt compatible firmware image)." ++msgstr "" ++"Carica un'immagine sysupgrade compatibile quì per sostituire il firmware in " ++"esecuzione. Attivare la spunta \"Mantieni Impostazioni\" per mantenere la " ++"configurazione corrente (richiede un immagine del firmware OpenWrt " ++"compatibile)." ++ ++msgid "Upload archive..." ++msgstr "Carica archivio..." ++ ++msgid "Uploaded File" ++msgstr "Invia file" ++ ++msgid "Uptime" ++msgstr "Tempo di attività" ++ ++msgid "Use /etc/ethers" ++msgstr "Usa /etc/ethers" ++ ++msgid "Use DHCP gateway" ++msgstr "Usa il DHCP del gateway" ++ ++msgid "Use DNS servers advertised by peer" ++msgstr "Usa i server DNS annunciati dal peer" ++ ++msgid "Use ISO/IEC 3166 alpha2 country codes." ++msgstr "Usa i codici delle nazioni ISO/IEC 3166 alpha2." ++ ++msgid "Use MTU on tunnel interface" ++msgstr "Usa MTU nel tunnel dell'interfaccia" ++ ++msgid "Use TTL on tunnel interface" ++msgstr "Usa TTL nel tunnel dell'interfaccia" ++ ++msgid "Use as external overlay (/overlay)" ++msgstr "" ++ ++msgid "Use as root filesystem (/)" ++msgstr "" ++ ++msgid "Use broadcast flag" ++msgstr "Usa flag broadcast" ++ ++msgid "Use builtin IPv6-management" ++msgstr "" ++ ++msgid "Use custom DNS servers" ++msgstr "Usa server DNS personalizzati" ++ ++msgid "Use default gateway" ++msgstr "Usa il gateway predefinito" ++ ++msgid "Use gateway metric" ++msgstr "Usa la metrica del gateway" ++ ++msgid "Use routing table" ++msgstr "Utilizzare tabella di instradamento" ++ ++msgid "" ++"Use the Add Button to add a new lease entry. The MAC-Address indentifies the host, the IPv4-Address specifies to the fixed " ++"address to use and the Hostname is assigned as symbolic name to the " ++"requesting host." ++msgstr "" ++"Utilizzare il pulsante Aggiungi per aggiungere una nuova voce di " ++"locazione. L'Indirizzo-MAC identifica l'host, l'Indirizzo-IPv4 specifica l'indirizzo fisso da utilizzare e il Nome Host è " ++"assegnato come nome simbolico alla richiesta dell'host." ++ ++msgid "Used" ++msgstr "Usato" ++ ++msgid "Used Key Slot" ++msgstr "Slot Chiave Usata" ++ ++msgid "User certificate (PEM encoded)" ++msgstr "" ++ ++msgid "User key (PEM encoded)" ++msgstr "" ++ ++msgid "Username" ++msgstr "Nome Utente" ++ ++msgid "VC-Mux" ++msgstr "VC-Mux" ++ ++msgid "VLAN Interface" ++msgstr "Interfaccia VLAN" ++ ++msgid "VLANs on %q" ++msgstr "VLANs su %q" ++ ++msgid "VLANs on %q (%s)" ++msgstr "VLANs su %q (%s)" ++ ++msgid "VPN Server" ++msgstr "Server VPN" ++ ++msgid "VPN Server port" ++msgstr "" ++ ++msgid "VPN Server's certificate SHA1 hash" ++msgstr "" ++ ++msgid "Vendor Class to send when requesting DHCP" ++msgstr "Classe del Produttore da 'inviare al momento della richiesta DHCP" ++ ++msgid "Verbose" ++msgstr "" ++ ++msgid "Verbose logging by aiccu daemon" ++msgstr "" ++ ++msgid "Verify" ++msgstr "Verifica" ++ ++msgid "Version" ++msgstr "Versione" ++ ++msgid "WDS" ++msgstr "WDS" ++ ++msgid "WEP Open System" ++msgstr "Sistema Aperto WEP" ++ ++msgid "WEP Shared Key" ++msgstr "Chiave Condivisa WEP" ++ ++msgid "WEP passphrase" ++msgstr "frase di accesso WEP" ++ ++msgid "WMM Mode" ++msgstr "Modalità WMM" ++ ++msgid "WPA passphrase" ++msgstr "frase di accesso WPA" ++ ++msgid "" ++"WPA-Encryption requires wpa_supplicant (for client mode) or hostapd (for AP " ++"and ad-hoc mode) to be installed." ++msgstr "" ++"La crittografia WPA richiede wpa_supplicant (per la modalità client) o " ++"hostapd (per AP e modalità ad hoc) per essere installato." ++ ++msgid "" ++"Wait for NTP sync that many seconds, seting to 0 disables waiting (optional)" ++msgstr "" ++ ++msgid "Waiting for changes to be applied..." ++msgstr "In attesa delle modifiche da applicare ..." ++ ++msgid "Waiting for command to complete..." ++msgstr "In attesa del comando da completare..." ++ ++msgid "Warning" ++msgstr "Avviso" ++ ++msgid "Warning: There are unsaved changes that will be lost while rebooting!" ++msgstr "" ++"Attenzione: Ci sono modifiche non salvate che verranno persi riavviando!" ++ ++msgid "Whether to create an IPv6 default route over the tunnel" ++msgstr "" ++ ++msgid "Whether to route only packets from delegated prefixes" ++msgstr "" ++ ++msgid "Width" ++msgstr "" ++ ++msgid "Wifi" ++msgstr "Wifi" ++ ++msgid "Wireless" ++msgstr "Wireless" ++ ++msgid "Wireless Adapter" ++msgstr "Dispositivo Wireless" ++ ++msgid "Wireless Network" ++msgstr "Rete Wireless" ++ ++msgid "Wireless Overview" ++msgstr "Panoramica Wireless" ++ ++msgid "Wireless Security" ++msgstr "Sicurezza Wireless" ++ ++msgid "Wireless is disabled or not associated" ++msgstr "La rete Wireless è disattivata o non associata" ++ ++msgid "Wireless is restarting..." ++msgstr "Riavvio della Wireless..." ++ ++msgid "Wireless network is disabled" ++msgstr "La rete Wireless è disattivata" ++ ++msgid "Wireless network is enabled" ++msgstr "La rete wireless è attivata" ++ ++msgid "Wireless restarted" ++msgstr "Wireless riavviato" ++ ++msgid "Wireless shut down" ++msgstr "Wireless spento" ++ ++msgid "Write received DNS requests to syslog" ++msgstr "Scrittura delle richiesta DNS ricevute nel syslog" ++ ++msgid "XR Support" ++msgstr "Supporto XR" ++ ++msgid "" ++"You can enable or disable installed init scripts here. Changes will applied " ++"after a device reboot.
    Warning: If you disable essential init " ++"scripts like \"network\", your device might become inaccessible!" ++msgstr "" ++"È possibile abilitare o disabilitare gli script di inizializzazione " ++"installati qui. Le modifiche saranno applicate dopo il riavvio del " ++"dispositivo
    Attenzione: Se si disattiva gli script di " ++"inizializzazione essenziali come ad esempio la \"rete\", il dispositivo " ++"potrebbe diventare inaccessibile!" ++ ++msgid "" ++"You must enable Java Script in your browser or LuCI will not work properly." ++msgstr "" ++"È necessario attivare Java Script nel tuo browser o LuCI non funzionerà " ++"correttamente." ++ ++msgid "" ++"Your Internet Explorer is too old to display this page correctly. Please " ++"upgrade it to at least version 7 or use another browser like Firefox, Opera " ++"or Safari." ++msgstr "" ++ ++msgid "any" ++msgstr "qualsiasi" ++ ++msgid "auto" ++msgstr "auto" ++ ++#, fuzzy ++msgid "automatic" ++msgstr "statico" ++ ++msgid "baseT" ++msgstr "baseT" ++ ++msgid "bridged" ++msgstr "ponte" ++ ++msgid "create:" ++msgstr "crea:" ++ ++msgid "creates a bridge over specified interface(s)" ++msgstr "Crea un ponte sulle interfacce selezionate" ++ ++msgid "dB" ++msgstr "dB" ++ ++msgid "dBm" ++msgstr "dBm" ++ ++msgid "disable" ++msgstr "disabilita" ++ ++msgid "disabled" ++msgstr "" ++ ++msgid "expired" ++msgstr "scaduto" ++ ++msgid "" ++"file where given DHCP-leases will be stored" ++msgstr "" ++"file dove vengono salvati le richieste DHCP assegnate" ++ ++msgid "forward" ++msgstr "inoltro" ++ ++msgid "full-duplex" ++msgstr "full-duplex" ++ ++msgid "half-duplex" ++msgstr "half-duplex" ++ ++msgid "help" ++msgstr "aiuto" ++ ++msgid "hidden" ++msgstr "nascosto" ++ ++msgid "hybrid mode" ++msgstr "" ++ ++msgid "if target is a network" ++msgstr "se la destinazione è una rete" ++ ++msgid "input" ++msgstr "ingresso" ++ ++msgid "kB" ++msgstr "kB" ++ ++msgid "kB/s" ++msgstr "kB/s" ++ ++msgid "kbit/s" ++msgstr "kbit/s" ++ ++msgid "local DNS file" ++msgstr "File DNS locale" ++ ++msgid "minimum 1280, maximum 1480" ++msgstr "" ++ ++msgid "navigation Navigation" ++msgstr "" ++ ++msgid "no" ++msgstr "no" ++ ++msgid "no link" ++msgstr "Nessun collegamento" ++ ++msgid "none" ++msgstr "nessuna" ++ ++msgid "not present" ++msgstr "" ++ ++msgid "off" ++msgstr "spento" ++ ++msgid "on" ++msgstr "acceso" ++ ++msgid "open" ++msgstr "apri" ++ ++msgid "overlay" ++msgstr "" ++ ++msgid "relay mode" ++msgstr "" ++ ++msgid "routed" ++msgstr "instradato" ++ ++msgid "server mode" ++msgstr "" ++ ++msgid "skiplink1 Skip to navigation" ++msgstr "" ++ ++msgid "skiplink2 Skip to content" ++msgstr "" ++ ++msgid "stateful-only" ++msgstr "" ++ ++msgid "stateless" ++msgstr "" ++ ++msgid "stateless + stateful" ++msgstr "" ++ ++msgid "tagged" ++msgstr "etichettato" ++ ++msgid "unknown" ++msgstr "sconosciuto" ++ ++msgid "unlimited" ++msgstr "illimitato" ++ ++msgid "unspecified" ++msgstr "non specificato" ++ ++msgid "unspecified -or- create:" ++msgstr "non specificato - o - creato:" ++ ++msgid "untagged" ++msgstr "non etichettato" ++ ++msgid "yes" ++msgstr "Sì" ++ ++msgid "« Back" ++msgstr "« Indietro" ++ ++#~ msgid "" ++#~ "Always use 40MHz channels even if the secondary channel overlaps. Using " ++#~ "this option does not comply with IEEE 802.11n-2009!" ++#~ msgstr "" ++#~ "Usare sempre i canali a 40MHz anche se con le sovrapposizioni dei canali " ++#~ "secondari. Utilizzando questa opzione non è conforme con gli standard " ++#~ "IEEE 802.11n-2009!" ++ ++#~ msgid "Cached" ++#~ msgstr "Nella cache" ++ ++#~ msgid "Configures this mount as overlay storage for block-extroot" ++#~ msgstr "" ++#~ "Configura questo mount come memoria di sovrapposizione per il blocco-" ++#~ "extroot" ++ ++#~ msgid "Force 40MHz mode" ++#~ msgstr "Forza la modalità a 40MHz" ++ ++#~ msgid "Frequency Hopping" ++#~ msgstr "Frequency Hopping" ++ ++#~ msgid "Locked to channel %d used by %s" ++#~ msgstr "Bloccato al canale %d utilizzato da %s" ++ ++#~ msgid "Use as root filesystem" ++#~ msgstr "Utilizzare come filesystem di root" ++ ++#~ msgid "HE.net user ID" ++#~ msgstr "ID Utente HE.net" ++ ++#~ msgid "40MHz 2nd channel above" ++#~ msgstr "secondo canale superiore a 40MHz" ++ ++#~ msgid "40MHz 2nd channel below" ++#~ msgstr "secondo canale inferiore a 40MHz" ++ ++#~ msgid "Accept router advertisements" ++#~ msgstr "Accetta gli annunci di router" ++ ++#~ msgid "Advertise IPv6 on network" ++#~ msgstr "Annuncia IPv6 sulla rete" ++ ++#~ msgid "Advertised network ID" ++#~ msgstr "ID di Rete Annunciato" ++ ++#~ msgid "Allowed range is 1 to 65535" ++#~ msgstr "Intervallo permesso 1-65535" ++ ++#~ msgid "HT capabilities" ++#~ msgstr "capacità HT" ++ ++#~ msgid "HT mode" ++#~ msgstr "Modalità HT" ++ ++#~ msgid "Router Model" ++#~ msgstr "Modello Router" ++ ++#~ msgid "Router Name" ++#~ msgstr "Nome Router" ++ ++#~ msgid "Specifies the advertised preferred prefix lifetime in seconds" ++#~ msgstr "" ++#~ "Specifica la durata dell'annuncio con prefisso preferito della durata in " ++#~ "secondi" ++ ++#~ msgid "Specifies the advertised valid prefix lifetime in seconds" ++#~ msgstr "" ++#~ "Specifica la validità dell'annuncio con prefisso preferito della durata " ++#~ "in secondi" ++ ++#~ msgid "Use preferred lifetime" ++#~ msgstr "Utilizzare durata preferita" ++ ++#~ msgid "Use valid lifetime" ++#~ msgstr "Utilizzare durata valida" ++ ++#~ msgid "Active Leases" ++#~ msgstr "Lease attivi" ++ ++#~ msgid "Open" ++#~ msgstr "Apri" ++ ++#~ msgid "KB" ++#~ msgstr "KB" ++ ++#~ msgid "Bit Rate" ++#~ msgstr "Bit Rate" ++ ++#~ msgid "Configuration / Apply" ++#~ msgstr "Configurazione / Applica" ++ ++#~ msgid "Configuration / Changes" ++#~ msgstr "Configurazioni / cambiamenti" ++ ++#~ msgid "Configuration / Revert" ++#~ msgstr "Configuration / Annullali" ++ ++#~ msgid "Encr." ++#~ msgstr "Encr." ++ ++#~ msgid "WLAN-Scan" ++#~ msgstr "Scansione WLAN" ++ ++#~ msgid "" ++#~ "Choose the network you want to attach to this wireless interface. Select " ++#~ "unspecified to not attach any network or fill out the " ++#~ "create field to define a new network." ++#~ msgstr "" ++#~ "Scegli quale rete vuoi attaccare all'interfaccia wireless. Selezionando " ++#~ "unspecified per non associarne alcuna o create per " ++#~ "definirne una nuova ora." ++ ++#~ msgid "Create Network" ++#~ msgstr "Crea rete" ++ ++#~ msgid "Link" ++#~ msgstr "Collegamento" ++ ++#~ msgid "Networks" ++#~ msgstr "Reti" ++ ++#~ msgid "Power" ++#~ msgstr "Potenza" ++ ++#~ msgid "Wifi networks in your local environment" ++#~ msgstr "Reti Wifi nell'ambiente circostante" ++ ++#~ msgid "" ++#~ "CIDR-Notation: " ++#~ "address/prefix" ++#~ msgstr "" ++#~ "Notazione CIDR: " ++#~ "indirizzo/prefisso" ++ ++#~ msgid "DNS-Server" ++#~ msgstr "DNS-Server" ++ ++#~ msgid "IPv4-Broadcast" ++#~ msgstr "Broadcast IPv4" ++ ++#~ msgid "IPv6-Address" ++#~ msgstr "Indirizzo IPv6" ++ ++#~ msgid "" ++#~ "Note: If you choose an interface here which is part of another network, " ++#~ "it will be moved into this network." ++#~ msgstr "" ++#~ "Nota: Se scegli un interfaccia qui che fa parte di un altro network, sarà " ++#~ "spostata in questo network." ++ ++#~ msgid "" ++#~ "Really delete this interface? The deletion cannot be undone!\\nYou might " ++#~ "lose access to this router if you are connected via this interface." ++#~ msgstr "" ++#~ "Vuoi davvero cancellare questa interfaccia? Non potrai tornare indietro!" ++#~ "\\nPotresti perdere l'accesso a questo router se stai usando questa " ++#~ "interfaccia." ++ ++#~ msgid "" ++#~ "Really delete this wireless network? The deletion cannot be undone!\\nYou " ++#~ "might lose access to this router if you are connected via this network." ++#~ msgstr "" ++#~ "Vuoi davvero cancellare questa rete wireless? Non potrai tornare indietro!" ++#~ "\\nPotresti perdere l'accesso a questo router se stai usando questa rete." ++ ++#~ msgid "" ++#~ "The network ports on your router can be combined to several VLANs in which computers can " ++#~ "communicate directly with each other. VLANs are often used to separate different network " ++#~ "segments. Often there is by default one Uplink port for a connection to " ++#~ "the next greater network like the internet and other ports for a local " ++#~ "network." ++#~ msgstr "" ++#~ "Le porte di rete del tuo router possono essere combinate in molte VLAN nelle quali i computer " ++#~ "possono comunicare direttamente fra di loro. Le VLAN sono spesso usate per separare segmenti " ++#~ "di rete differenti. Spesso c'è come predefinita una porta per la " ++#~ "connessione alla prossiam rete più grande come Internet e altre porte per " ++#~ "le reti locali." ++ ++#~ msgid "Custom Files" ++#~ msgstr "Files personalizzati" ++ ++#~ msgid "Custom files" ++#~ msgstr "Files personalizzati" ++ ++#~ msgid "Files to be kept when flashing a new firmware" ++#~ msgstr "Files da conservare quando si aggiorna un nuovo firmware" ++ ++#~ msgid "General" ++#~ msgstr "Generale" ++ ++#~ msgid "" ++#~ "Here you can customize the settings and the functionality of LuCI." ++#~ msgstr "" ++#~ "Qui puoi personalizzare i settaggi e le funzionalità di LuCI." ++ ++#~ msgid "Post-commit actions" ++#~ msgstr "Azioni post-modifica" ++ ++#~ msgid "" ++#~ "These commands will be executed automatically when a given UCI configuration is committed " ++#~ "allowing changes to be applied instantly." ++#~ msgstr "" ++#~ "Questi comandi verranno eseguiti automaticamente quando un comando di " ++#~ "configurazione UCI " ++#~ "viene applicato permettendo alle modifiche di essere applicate " ++#~ "immediatamente." ++ ++#~ msgid "Web UI" ++#~ msgstr "UI web" ++ ++#~ msgid "PPTP-Server" ++#~ msgstr "" ++#~ "Server PPTP" ++ ++#~ msgid "ARP ping retries" ++#~ msgstr "tentativi ping ARP " ++ ++#~ msgid "ATM Settings" ++#~ msgstr "Impostazioni ATM" ++ ++#~ msgid "Accept Router Advertisements" ++#~ msgstr "Accetta annunciamenti router" ++ ++#~ msgid "Access point (APN)" ++#~ msgstr "Access point (APN)" ++ ++#~ msgid "Additional pppd options" ++#~ msgstr "Opzioni pppd aggiuntive" ++ ++#~ msgid "Allowed range is 1 to FFFF" ++#~ msgstr "Intervallo ammesso è tra 1 e FFFF" ++ ++#~ msgid "Automatic Disconnect" ++#~ msgstr "Disconnetti automaticamente" ++ ++#~ msgid "Backup Archive" ++#~ msgstr "Archivio di backup" ++ ++#~ msgid "" ++#~ "Configure the local DNS server to use the name servers adverticed by the " ++#~ "PPP peer" ++#~ msgstr "" ++#~ "Configura il server DNS locale per usare i server DNS negoziati da PPP" ++ ++#~ msgid "Connect script" ++#~ msgstr "Script connessione" ++ ++#~ msgid "Create backup" ++#~ msgstr "Crea un backup" ++ ++#~ msgid "Default" ++#~ msgstr "Default" ++ ++#~ msgid "Disconnect script" ++#~ msgstr "Script disconnessione" ++ ++#~ msgid "Edit package lists and installation targets" ++#~ msgstr "Modifica lista dei pacchetti e destinazione dell'installazione" ++ ++#~ msgid "Enable 4K VLANs" ++#~ msgstr "Abilita 4K VLANs" ++ ++#~ msgid "Enable IPv6 on PPP link" ++#~ msgstr "Attiva IPv6 sul collegamento PPP" ++ ++#, fuzzy ++#~ msgid "Firmware image" ++#~ msgstr "Firmware image" ++ ++#~ msgid "" ++#~ "Here you can backup and restore your router configuration and - if " ++#~ "possible - reset the router to the default settings." ++#~ msgstr "" ++#~ "Qui puoi salvare e ripristinare la configurazione del tuo router e - se " ++#~ "possibile - resettare il router con le impostazioni predefinite." ++ ++#~ msgid "Installation targets" ++#~ msgstr "Destinazione installazione" ++ ++#~ msgid "Keep configuration files" ++#~ msgstr "Conserva i files di configurazione" ++ ++#~ msgid "Keep-Alive" ++#~ msgstr "Keep-Alive" ++ ++#~ msgid "Kernel" ++#~ msgstr "Kernel" ++ ++#~ msgid "" ++#~ "Let pppd replace the current default route to use the PPP interface after " ++#~ "successful connect" ++#~ msgstr "" ++#~ "Consenti a pppd di sostituire la route di default con la route corrente " ++#~ "per usare l'interfaccia PPP dopo una connessione riuscita" ++ ++#~ msgid "Let pppd run this script after establishing the PPP link" ++#~ msgstr "" ++#~ "Permette a pppd di avviare questo script dopo l'avvenuta connessione " ++#~ "PPP" ++ ++#~ msgid "Let pppd run this script before tearing down the PPP link" ++#~ msgstr "" ++#~ "Permette a pppd di avviare questo script prima della disconnessione PPP" ++ ++#~ msgid "" ++#~ "Make sure that you provide the correct pin code here or you might lock " ++#~ "your sim card!" ++#~ msgstr "" ++#~ "Fai attenzione di inserire il codice PIN corretto qui o potresti bloccare " ++#~ "la tua sim card!" ++ ++#~ msgid "" ++#~ "Most of them are network servers, that offer a certain service for your " ++#~ "device or network like shell access, serving webpages like LuCI, doing mesh routing, sending " ++#~ "e-mails, ..." ++#~ msgstr "" ++#~ "Molti di loro sono servers, che offrono un determinato servizio al tuo " ++#~ "dispositivo o alla tua rete come accesso shell, servire pagine web come " ++#~ "LuCI, fare mesh " ++#~ "routing, inviare e-mails, ..." ++ ++#~ msgid "Number of failed connection tests to initiate automatic reconnect" ++#~ msgstr "Numero di test di connettività falliti prima di una riconnessione" ++ ++#~ msgid "PIN code" ++#~ msgstr "Codice PIN" ++ ++#~ msgid "PPP Settings" ++#~ msgstr "Opzioni PPP" ++ ++#~ msgid "Package lists" ++#~ msgstr "Lista pacchetti" ++ ++#~ msgid "Proceed reverting all settings and resetting to firmware defaults?" ++#~ msgstr "" ++#~ "Procedi annullando tutte le modifiche e resettando ai predefiniti del " ++#~ "firmware?" ++ ++#~ msgid "Processor" ++#~ msgstr "Processore" ++ ++#~ msgid "Radius-Port" ++#~ msgstr "Porta Radius" ++ ++#~ msgid "Radius-Server" ++#~ msgstr "Server Radius" ++ ++#~ msgid "Relay Settings" ++#~ msgstr "Opzioni Relay" ++ ++#~ msgid "Replace default route" ++#~ msgstr "Sostituisci route di default" ++ ++#~ msgid "Reset router to defaults" ++#~ msgstr "Ripristina il router come predefinito" ++ ++#~ msgid "" ++#~ "Seconds to wait for the modem to become ready before attempting to connect" ++#~ msgstr "" ++#~ "Secondi da attendere prima che il modem diventi pronto prima di provare a " ++#~ "connettersi" ++ ++#~ msgid "Service type" ++#~ msgstr "Tipo di servizio" ++ ++#~ msgid "Services and daemons perform certain tasks on your device." ++#~ msgstr "Servizi e demoni svolgono alcune azioni sul tuo dispositivo." ++ ++#~ msgid "Settings" ++#~ msgstr "Impostazioni" ++ ++#~ msgid "Setup wait time" ++#~ msgstr "Tempo di attesa inizializzazione" ++ ++#~ msgid "" ++#~ "Sorry. OpenWrt does not support a system upgrade on this platform.
    " ++#~ "You need to manually flash your device." ++#~ msgstr "" ++#~ "Sorry. OpenWrt does not support a system upgrade on this platform.
    " ++#~ "You need to manually flash your device." ++ ++#~ msgid "Specify additional command line arguments for pppd here" ++#~ msgstr "Specifica opzioni linea di comando aggiuntive per pppd qui" ++ ++#~ msgid "The device node of your modem, e.g. /dev/ttyUSB0" ++#~ msgstr "Il device node del tuo modem, e.s. /dev/ttyUSB0" ++ ++#~ msgid "Time (in seconds) after which an unused connection will be closed" ++#~ msgstr "" ++#~ "Tempo (in secondi) dopo il quale una connessione inattiva verrà chiusa" ++ ++#~ msgid "Update package lists" ++#~ msgstr "Aggiorna lista pacchetti" ++ ++#~ msgid "Upload an OpenWrt image file to reflash the device." ++#~ msgstr "Upload an OpenWrt image file to reflash the device." ++ ++#~ msgid "Upload image" ++#~ msgstr "Upload image" ++ ++#~ msgid "Use peer DNS" ++#~ msgstr "Usa DNS ottenuti" ++ ++#~ msgid "" ++#~ "You need to install \"comgt\" for UMTS/GPRS, \"ppp-mod-pppoe\" for PPPoE, " ++#~ "\"ppp-mod-pppoa\" for PPPoA or \"pptp\" for PPtP support" ++#~ msgstr "" ++#~ "Devi installare \"comgt\" per il supporto UMTS/GPRS, \"ppp-mod-pppoe\" " ++#~ "per PPPoE, \"ppp-mod-pppoa\" per PPPoA e \"pptp\" per PPtP" ++ ++#~ msgid "back" ++#~ msgstr "indietro" ++ ++#~ msgid "buffered" ++#~ msgstr "in buffer" ++ ++#~ msgid "cached" ++#~ msgstr "in cache" ++ ++#~ msgid "free" ++#~ msgstr "libera" ++ ++#~ msgid "static" ++#~ msgstr "statico" ++ ++#~ msgid "" ++#~ "LuCI is a collection " ++#~ "of free Lua software including an MVC-Webframework and webinterface for embedded devices. LuCI is licensed under the " ++#~ "Apache-License." ++#~ msgstr "" ++#~ "LuCI è una collezione " ++#~ "di software libero scritto in Lua comprendente un Webframework e " ++#~ "interfaccia web MVC per " ++#~ "dispositivi integrati. LuCI è rilasciato sotto la Apache-License." ++ ++#~ msgid "SSH-Keys" ++#~ msgstr "Chiavi SSHs" ++ ++#~ msgid "" ++#~ "A lightweight HTTP/1.1 webserver written in C and Lua designed to serve " ++#~ "LuCI" ++#~ msgstr "" ++#~ "Un piccolo e leggero web-server scritto in C è disegnato per integrarsi " ++#~ "con LuCi" ++ ++#~ msgid "" ++#~ "A small webserver which can be used to serve LuCI." ++#~ msgstr "" ++#~ "Un piccolo webserver che può essere usato per servire LuCI." ++ ++#~ msgid "About" ++#~ msgstr "Informazioni su" ++ ++#~ msgid "Active IP Connections" ++#~ msgstr "Connessioni IP attive" ++ ++#~ msgid "Addresses" ++#~ msgstr "Indirizzi" ++ ++#~ msgid "Admin Password" ++#~ msgstr "Password di Amministratore" ++ ++#~ msgid "Alias" ++#~ msgstr "Alias" ++ ++#~ msgid "Authentication Realm" ++#~ msgstr "Authentication Realm" ++ ++#~ msgid "Bridge Port" ++#~ msgstr "Porta Bridge" ++ ++#~ msgid "" ++#~ "Change the password of the system administrator (User root)" ++#~ msgstr "" ++#~ "Cambia la password dell'amministratore di sistema (Utente root)" ++ ++#~ msgid "Client + WDS" ++#~ msgstr "Client + WDS" ++ ++#~ msgid "Configuration file" ++#~ msgstr "File di configurazione" ++ ++#~ msgid "Connection timeout" ++#~ msgstr "Timeout Connessione" ++ ++#~ msgid "Contributing Developers" ++#~ msgstr "Contributing Developers" ++ ++#~ msgid "DHCP assigned" ++#~ msgstr "DHCP assegnato" ++ ++#~ msgid "Document root" ++#~ msgstr "Radice dei documenti" ++ ++#~ msgid "Enable Keep-Alive" ++#~ msgstr "Abilita Keep-Alive" ++ ++#~ msgid "Enable device" ++#~ msgstr "Abilita dispositivo" ++ ++#~ msgid "" ++#~ "Here you can paste public SSH-Keys " ++#~ "(one per line) for SSH public-key " ++#~ "authentication." ++#~ msgstr "" ++#~ "Qui puoi incollare le tue chiavi SSH " ++#~ "(una per linea) per l'autenticazione SSH a chiave pubblica." ++ ++#~ msgid "Interface Status" ++#~ msgstr "Stato Interfaccia" ++ ++#~ msgid "Lead Development" ++#~ msgstr "Lead Development" ++ ++#~ msgid "No address configured on this interface." ++#~ msgstr "Nessun indirizzo è configurato su questa interfaccia." ++ ++#~ msgid "Not configured" ++#~ msgstr "Non configurato" ++ ++#~ msgid "Password successfully changed" ++#~ msgstr "Password cambiata con successo" ++ ++#~ msgid "Plugin path" ++#~ msgstr "Percorso plugin" ++ ++#~ msgid "Ports" ++#~ msgstr "Porte" ++ ++#~ msgid "Project Homepage" ++#~ msgstr "Sito del progetto" ++ ++#~ msgid "Thanks To" ++#~ msgstr "Ringraziamenti" ++ ++#~ msgid "" ++#~ "The realm which will be displayed at the authentication prompt for " ++#~ "protected pages." ++#~ msgstr "" ++#~ "Il realm che verrà visualizzato al prompt di autenticazione per le pagine " ++#~ "protette." ++ ++#~ msgid "Unknown Error" ++#~ msgstr "Errore sconosciuto" ++ ++#~ msgid "defaults to /etc/httpd.conf" ++#~ msgstr "predefinito /etc/httpd.conf" ++ ++#~ msgid "Enable this switch" ++#~ msgstr "Abilita questo switch" ++ ++#~ msgid "OPKG error code %i" ++#~ msgstr "OPKG codice di errore %i" ++ ++#~ msgid "Package lists updated" ++#~ msgstr "Lista pacchetti aggiornata" ++ ++#~ msgid "Upgrade installed packages" ++#~ msgstr "Upgrade installed packages" ++ ++#~ msgid "" ++#~ "Also kernel or service logfiles can be viewed here to get an overview " ++#~ "over their current state." ++#~ msgstr "" ++#~ "Inoltre i log del kernel o dei servizi sono visualizzabili qui per avere " ++#~ "un riassunto dello stato attuale." ++ ++#~ msgid "" ++#~ "Here you can find information about the current system status like CPU clock frequency, memory " ++#~ "usage or network interface data." ++#~ msgstr "" ++#~ "Qui puoi trovare informazione sullo stato del sistema come frequenza di " ++#~ "clock della CPU, uso della " ++#~ "memoria o dati della scheda di rete." ++ ++#~ msgid "Search file..." ++#~ msgstr "Cerca file..." ++ ++#~ msgid "" ++#~ "LuCI is a free, " ++#~ "flexible, and user friendly graphical interface for configuring OpenWrt " ++#~ "Kamikaze." ++#~ msgstr "" ++#~ "LuCI è un'" ++#~ "interfaccia grafica gratuita, flessibile, e amichevole per configurare " ++#~ "OpenWrt Kamikaze." ++ ++#~ msgid "And now have fun with your router!" ++#~ msgstr "Ed ora buon divertimento con il tuo router!" ++ ++#~ msgid "" ++#~ "As we always want to improve this interface we are looking forward to " ++#~ "your feedback and suggestions." ++#~ msgstr "" ++#~ "dal momento che vogliamo migliorare quest'interfaccia accettiamo " ++#~ "suggerimenti." ++ ++#~ msgid "Hello!" ++#~ msgstr "Ciao!" ++ ++#~ msgid "" ++#~ "Notice: In LuCI " ++#~ "changes have to be confirmed by clicking Changes - Save & Apply " ++#~ "before being applied." ++#~ msgstr "" ++#~ "Nota: Le modifiche devono essere confermate in LuCI cliccando Modifiche - Salva e " ++#~ "Applica prima di essere applicate." ++ ++#~ msgid "" ++#~ "On the following pages you can adjust all important settings of your " ++#~ "router." ++#~ msgstr "" ++#~ "Nelle seguenti pagine puoi impostare tutti i settaggi più importanti del " ++#~ "tuo router" ++ ++#~ msgid "The LuCI Team" ++#~ msgstr "Il Team di LuCI" ++ ++#~ msgid "" ++#~ "This is the administration area of LuCI." ++#~ msgstr "" ++#~ "Questa è l'area d'amministrazione di LuCI." ++ ++#~ msgid "User Interface" ++#~ msgstr "Interfaccia utente" ++ ++#~ msgid "enable" ++#~ msgstr "abilita" ++ ++#, fuzzy ++#~ msgid "(optional)" ++#~ msgstr " (opzionale)" ++ ++#~ msgid "DNS-Port" ++#~ msgstr "Porta DNS" ++ ++#~ msgid "" ++#~ "DNS-Server will be queried in " ++#~ "the order of the resolvfile" ++#~ msgstr "" ++#~ "I server DNS verranno " ++#~ "contattati nell'ordine del file resolv" ++ ++#~ msgid "" ++#~ "max. DHCP-Leases" ++#~ msgstr "" ++#~ "Numero massimo di lease DHCP" ++ ++#~ msgid "" ++#~ "max. EDNS0 packet size" ++#~ msgstr "" ++#~ "Dimensione massima pacchetto EDNS0" ++ ++#~ msgid "AP-Isolation" ++#~ msgstr "Isolazione AP" ++ ++#~ msgid "Add the Wifi network to physical network" ++#~ msgstr "Aggiungi la rete Wifi alla rete fisica" ++ ++#~ msgid "Aliases" ++#~ msgstr "Alias" ++ ++#~ msgid "Clamp Segment Size" ++#~ msgstr "Clamp Segment Size" ++ ++#, fuzzy ++#~ msgid "Create Or Attach Network" ++#~ msgstr "Crea rete" ++ ++#~ msgid "Devices" ++#~ msgstr "Dispositivi" ++ ++#~ msgid "Don't forward reverse lookups for local networks" ++#~ msgstr "Non inoltrare richieste per le reti locali" ++ ++#~ msgid "Enable TFTP-Server" ++#~ msgstr "Abilita server TFTP" ++ ++#~ msgid "Errors" ++#~ msgstr "Errori" ++ ++#~ msgid "Essentials" ++#~ msgstr "Essenziali" ++ ++#~ msgid "Expand Hosts" ++#~ msgstr "Espandi host" ++ ++#~ msgid "First leased address" ++#~ msgstr "Primo indirizzo offerto" ++ ++#~ msgid "" ++#~ "Fixes problems with unreachable websites, submitting forms or other " ++#~ "unexpected behaviour for some ISPs." ++#~ msgstr "" ++#~ "Fixes problems with unreachable websites, submitting forms or other " ++#~ "unexpected behaviour for some ISPs." ++ ++#~ msgid "Hardware Address" ++#~ msgstr "Hardware Address" ++ ++#~ msgid "Here you can configure installed wifi devices." ++#~ msgstr "Qui puoi configurare i tuoi dispositivi wireless installati." ++ ++#~ msgid "Ignore /etc/hosts" ++#~ msgstr "Ignora /etc/hosts" ++ ++#~ msgid "Independent (Ad-Hoc)" ++#~ msgstr "Independente (Ad-Hoc)" ++ ++#~ msgid "Internet Connection" ++#~ msgstr "Connessione Internet" ++ ++#~ msgid "Join (Client)" ++#~ msgstr "Partecipa (Client)" ++ ++#~ msgid "Leases" ++#~ msgstr "Lease" ++ ++#~ msgid "Local Domain" ++#~ msgstr "Dominio locale" ++ ++#~ msgid "Local Network" ++#~ msgstr "Rete locale" ++ ++#~ msgid "Local Server" ++#~ msgstr "Server locale" ++ ++#~ msgid "Network Boot Image" ++#~ msgstr "Immagine boot da rete" ++ ++#~ msgid "" ++#~ "Network Name (ESSID)" ++#~ msgstr "" ++#~ "Nome rete (ESSID)" ++ ++#~ msgid "Number of leased addresses" ++#~ msgstr "Numero di indirizzi offerti" ++ ++#~ msgid "Perform Actions" ++#~ msgstr "Esegui azioni" ++ ++#~ msgid "Prevents Client to Client communication" ++#~ msgstr "Impedisci la comunicazione fra Client" ++ ++#~ msgid "Provide (Access Point)" ++#~ msgstr "Offri (Access Point)" ++ ++#~ msgid "Resolvfile" ++#~ msgstr "File resolv" ++ ++#~ msgid "TFTP-Server Root" ++#~ msgstr "Radice del server TFTP" ++ ++#~ msgid "TX / RX" ++#~ msgstr "TX / RX" ++ ++#~ msgid "The following changes have been applied" ++#~ msgstr "Le seguenti modifiche sono state applicate" ++ ++#~ msgid "" ++#~ "When flashing a new firmware with LuCI these files will be added to the new firmware " ++#~ "installation." ++#~ msgstr "" ++#~ "Quando si aggiorna un firmware con LuCI questi files verranno aggiunti al nuovo firmware." ++ ++#~ msgid "" ++#~ "With DHCP " ++#~ "network members can automatically receive their network settings (IP-address, netmask, DNS-server, ...)." ++#~ msgstr "" ++#~ "Con DHCP i " ++#~ "membri della rete possono ricevere automaticamente le loro impostazioni " ++#~ "di rete (indirizzi IP, maschere " ++#~ "di rete, server DNS, ...)." ++ ++#~ msgid "" ++#~ "You can run several wifi networks with one device. Be aware that there " ++#~ "are certain hardware and driverspecific restrictions. Normally you can " ++#~ "operate 1 Ad-Hoc or up to 3 Master-Mode and 1 Client-Mode network " ++#~ "simultaneously." ++#~ msgstr "" ++#~ "Puoi avere più reti wifi con un solo dispositivo. Sappi ceh ci sono " ++#~ "alcune restrizioni relative all'hardware ed al driver.Normalmente " ++#~ "puoi avere 1 rete Ad-Hoc o fino a 3 reti Master e uan rete in modalità " ++#~ "Client contemporaneamente." ++ ++#~ msgid "" ++#~ "You need to install \"ppp-mod-pppoe\" for PPPoE or \"pptp\" for PPtP " ++#~ "support" ++#~ msgstr "" ++#~ "Devi installare \"ppp-mod-pppoe\" per il supporto PPPoE e \"pptp\" per " ++#~ "PPtP" ++ ++#~ msgid "additional hostfile" ++#~ msgstr "file hosts aggiuntivo" ++ ++#~ msgid "adds domain names to hostentries in the resolv file" ++#~ msgstr "aggiungi nomi di dominio nel file resolv" ++ ++#~ msgid "automatically reconnect" ++#~ msgstr "riconnetti automaticamente" ++ ++#~ msgid "concurrent queries" ++#~ msgstr "richieste contemporanee" ++ ++#~ msgid "" ++#~ "disable DHCP " ++#~ "for this interface" ++#~ msgstr "" ++#~ "disabilita DHCP per queste interfacce" ++ ++#~ msgid "disconnect when idle for" ++#~ msgstr "disconnetti quando non usata per" ++ ++#~ msgid "don't cache unknown" ++#~ msgstr "non tenere sconosciuti in cache" ++ ++#~ msgid "" ++#~ "filter useless DNS-queries of " ++#~ "Windows-systems" ++#~ msgstr "" ++#~ "Filtra richieste DNS inutili di " ++#~ "sistemi windows" ++ ++#~ msgid "installed" ++#~ msgstr "installato" ++ ++#~ msgid "localises the hostname depending on its subnet" ++#~ msgstr "localizza l'hostname a seconda delle sue sottoreti" ++ ++#~ msgid "not installed" ++#~ msgstr "non installato" ++ ++#~ msgid "" ++#~ "prevents caching of negative DNS-replies" ++#~ msgstr "" ++#~ "impedisci la cache di risposte DNS negative" ++ ++#~ msgid "query port" ++#~ msgstr "porta per le richieste" ++ ++#~ msgid "transmitted / received" ++#~ msgstr "transmessi / ricevuti" ++ ++#, fuzzy ++#~ msgid "Join network" ++#~ msgstr "Rete" ++ ++#~ msgid "all" ++#~ msgstr "tutti" ++ ++#~ msgid "Code" ++#~ msgstr "Codice" ++ ++#~ msgid "Distance" ++#~ msgstr "Distanza" ++ ++#~ msgid "Legend" ++#~ msgstr "Legenda" ++ ++#~ msgid "Library" ++#~ msgstr "Libreria" ++ ++#~ msgid "see '%s' manpage" ++#~ msgstr "leggi il manuale di '%s'" ++ ++#~ msgid "Package Manager" ++#~ msgstr "Gestore pacchetti" ++ ++#~ msgid "Service" ++#~ msgstr "Servizio" ++ ++#~ msgid "Statistics" ++#~ msgstr "Statistiche" ++ ++#~ msgid "zone" ++#~ msgstr "Zona" +diff --git a/feeds/luci/modules/luci-base/po/ja/base.po b/feeds/luci/modules/luci-base/po/ja/base.po +new file mode 100644 +index 0000000..8bea764 +--- /dev/null ++++ b/feeds/luci/modules/luci-base/po/ja/base.po +@@ -0,0 +1,4266 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Report-Msgid-Bugs-To: \n" ++"POT-Creation-Date: 2009-06-10 03:40+0200\n" ++"PO-Revision-Date: 2013-10-06 02:29+0200\n" ++"Last-Translator: Kentaro \n" ++"Language-Team: LANGUAGE \n" ++"Language: ja\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=1; plural=0;\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "(%d minute window, %d second interval)" ++msgstr "(%d 分幅, %d 秒間隔)" ++ ++msgid "(%s available)" ++msgstr "(%s 使用å¯èƒ½)" ++ ++msgid "(empty)" ++msgstr "(空)" ++ ++msgid "(no interfaces attached)" ++msgstr "(インターフェースãŒæŽ¥ç¶šã•ã‚Œã¦ã„ã¾ã›ã‚“)" ++ ++msgid "-- Additional Field --" ++msgstr "-- 追加項目 --" ++ ++msgid "-- Please choose --" ++msgstr "-- é¸æŠžã—ã¦ãã ã•ã„ --" ++ ++msgid "-- custom --" ++msgstr "-- 手動設定 --" ++ ++msgid "-- match by device --" ++msgstr "" ++ ++msgid "-- match by label --" ++msgstr "" ++ ++msgid "1 Minute Load:" ++msgstr "éŽåŽ»1分ã®è² è·:" ++ ++msgid "15 Minute Load:" ++msgstr "éŽåŽ»15分ã®è² è·:" ++ ++msgid "5 Minute Load:" ++msgstr "éŽåŽ»5分ã®è² è·:" ++ ++msgid "BSSID" ++msgstr "BSSID" ++ ++msgid "DNS query port" ++msgstr "DNS クエリãƒãƒ¼ãƒˆ" ++ ++msgid "DNS server port" ++msgstr "DNS サーãƒãƒ¼ãƒãƒ¼ãƒˆ" ++ ++msgid "" ++"DNS servers will be queried in the " ++"order of the resolvfile" ++msgstr "" ++"リゾルãƒãƒ•ã‚¡ã‚¤ãƒ«ã®é †ç•ªã«ã€DNSサー" ++"ãƒãƒ¼ã«å•ã„åˆã‚ã›ã‚’è¡Œã„ã¾ã™" ++ ++msgid "ESSID" ++msgstr "ESSID" ++ ++msgid "IPv4-Address" ++msgstr "IPv4-アドレス" ++ ++msgid "IPv4-Gateway" ++msgstr "IPv4-ゲートウェイ" ++ ++msgid "IPv4-Netmask" ++msgstr "IPv4-ãƒãƒƒãƒˆãƒžã‚¹ã‚¯" ++ ++msgid "" ++"IPv6-Address or Network " ++"(CIDR)" ++msgstr "" ++"IPv6-アドレスåˆã¯ãƒãƒƒãƒˆ" ++"ワーク (CIDR)" ++ ++msgid "IPv6-Gateway" ++msgstr "IPv6-ゲートウェイ" ++ ++msgid "IPv6-Suffix (hex)" ++msgstr "" ++ ++msgid "LED Configuration" ++msgstr "LED 設定" ++ ++msgid "LED Name" ++msgstr "LED å" ++ ++msgid "MAC-Address" ++msgstr "MAC-アドレス" ++ ++msgid "" ++"Max. DHCP leases" ++msgstr "" ++"最大 DHCP リース" ++ ++msgid "" ++"Max. EDNS0 packet size" ++msgstr "" ++"最大 EDNS0 パケットサイズ" ++ ++msgid "Max. concurrent queries" ++msgstr "最大 並列処ç†ã‚¯ã‚¨ãƒª" ++ ++msgid "%s - %s" ++msgstr "" ++ ++msgid "ADSL" ++msgstr "" ++ ++msgid "ADSL Status" ++msgstr "" ++ ++msgid "AICCU (SIXXS)" ++msgstr "" ++ ++msgid "APN" ++msgstr "APN" ++ ++msgid "AR Support" ++msgstr "ARサãƒãƒ¼ãƒˆ" ++ ++msgid "ARP retry threshold" ++msgstr "ARPå†è©¦è¡Œã—ãã„値" ++ ++msgid "ATM Bridges" ++msgstr "ATMブリッジ" ++ ++msgid "ATM Virtual Channel Identifier (VCI)" ++msgstr "ATM仮想ãƒãƒ£ãƒãƒ«è­˜åˆ¥å­ (VCI)" ++ ++msgid "ATM Virtual Path Identifier (VPI)" ++msgstr "ATMä»®æƒ³ãƒ‘ã‚¹è­˜åˆ¥å­ (VPI)" ++ ++msgid "" ++"ATM bridges expose encapsulated ethernet in AAL5 connections as virtual " ++"Linux network interfaces which can be used in conjunction with DHCP or PPP " ++"to dial into the provider network." ++msgstr "" ++ ++msgid "ATM device number" ++msgstr "ATMデãƒã‚¤ã‚¹ç•ªå·" ++ ++msgid "AYIYA" ++msgstr "" ++ ++msgid "Access Concentrator" ++msgstr "Access Concentrator" ++ ++msgid "Access Point" ++msgstr "アクセスãƒã‚¤ãƒ³ãƒˆ" ++ ++msgid "Action" ++msgstr "動作" ++ ++msgid "Actions" ++msgstr "動作" ++ ++msgid "Activate this network" ++msgstr "ã“ã®ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ã‚’有効ã«ã™ã‚‹" ++ ++msgid "Active IPv4-Routes" ++msgstr "" ++"稼åƒä¸­ã® IPv4-経路情報" ++ ++msgid "Active IPv6-Routes" ++msgstr "" ++"稼åƒä¸­ã® IPv6-経路情報" ++ ++msgid "Active Connections" ++msgstr "アクティブコãƒã‚¯ã‚·ãƒ§ãƒ³" ++ ++msgid "Active DHCP Leases" ++msgstr "アクティブãªDHCPリース" ++ ++msgid "Active DHCPv6 Leases" ++msgstr "アクティブãªDHCPv6リース" ++ ++msgid "Ad-Hoc" ++msgstr "アドホック" ++ ++msgid "Add" ++msgstr "追加" ++ ++msgid "Add local domain suffix to names served from hosts files" ++msgstr "" ++ ++msgid "Add new interface..." ++msgstr "インターフェースã®æ–°è¦ä½œæˆ..." ++ ++msgid "Additional Hosts files" ++msgstr "追加ã®ãƒ›ã‚¹ãƒˆãƒ•ã‚¡ã‚¤ãƒ«" ++ ++msgid "Address" ++msgstr "アドレス" ++ ++msgid "Address to access local relay bridge" ++msgstr "ローカル・リレーブリッジã«ã‚¢ã‚¯ã‚»ã‚¹ã™ã‚‹ãŸã‚ã®IPアドレス" ++ ++msgid "Administration" ++msgstr "管ç†ç”»é¢" ++ ++msgid "Advanced Settings" ++msgstr "詳細設定" ++ ++msgid "Alert" ++msgstr "警告" ++ ++msgid "Allow SSH password authentication" ++msgstr "SSH パスワードèªè¨¼ã‚’許å¯ã—ã¾ã™" ++ ++msgid "Allow all except listed" ++msgstr "リスト内ã®ç«¯æœ«ã‹ã‚‰ã®ã‚¢ã‚¯ã‚»ã‚¹ã‚’ç¦æ­¢" ++ ++msgid "Allow listed only" ++msgstr "リスト内ã®ç«¯æœ«ã‹ã‚‰ã®ã‚¢ã‚¯ã‚»ã‚¹ã‚’許å¯" ++ ++msgid "Allow localhost" ++msgstr "ローカルホストを許å¯ã™ã‚‹" ++ ++msgid "Allow remote hosts to connect to local SSH forwarded ports" ++msgstr "" ++"リモートホストãŒSSH転é€ã•ã‚ŒãŸãƒ­ãƒ¼ã‚«ãƒ«ã®ãƒãƒ¼ãƒˆã«æŽ¥ç¶šã™ã‚‹ã“ã¨ã‚’許å¯ã—ã¾ã™" ++ ++msgid "Allow root logins with password" ++msgstr "パスワードを使用ã—ãŸroot権é™ã§ã®ãƒ­ã‚°ã‚¤ãƒ³ã‚’許å¯ã™ã‚‹" ++ ++msgid "Allow the root user to login with password" ++msgstr "パスワードを使用ã—ãŸroot権é™ã§ã®ãƒ­ã‚°ã‚¤ãƒ³ã‚’許å¯ã™ã‚‹" ++ ++msgid "" ++"Allow upstream responses in the 127.0.0.0/8 range, e.g. for RBL services" ++msgstr "" ++ ++msgid "" ++"Also see Tunneling Comparison on SIXXS" ++msgstr "" ++ ++msgid "Always announce default router" ++msgstr "" ++ ++msgid "An additional network will be created if you leave this unchecked." ++msgstr "ãƒã‚§ãƒƒã‚¯ãƒœãƒƒã‚¯ã‚¹ãŒã‚ªãƒ•ã®å ´åˆã€è¿½åŠ ã®ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ãŒä½œæˆã•ã‚Œã¾ã™ã€‚" ++ ++msgid "Announce as default router even if no public prefix is available." ++msgstr "" ++ ++msgid "Announced DNS domains" ++msgstr "" ++ ++msgid "Announced DNS servers" ++msgstr "" ++ ++msgid "Antenna 1" ++msgstr "アンテナ 1" ++ ++msgid "Antenna 2" ++msgstr "アンテナ 2" ++ ++msgid "Antenna Configuration" ++msgstr "アンテナ設定" ++ ++msgid "Any zone" ++msgstr "å…¨ã¦ã®ã‚¾ãƒ¼ãƒ³" ++ ++msgid "Apply" ++msgstr "é©ç”¨" ++ ++msgid "Applying changes" ++msgstr "変更をé©ç”¨" ++ ++msgid "" ++"Assign a part of given length of every public IPv6-prefix to this interface" ++msgstr "" ++ ++msgid "Assign interfaces..." ++msgstr "" ++ ++msgid "" ++"Assign prefix parts using this hexadecimal subprefix ID for this interface." ++msgstr "" ++ ++msgid "Associated Stations" ++msgstr "èªè¨¼æ¸ˆã¿ç«¯æœ«" ++ ++msgid "Atheros 802.11%s Wireless Controller" ++msgstr "Atheros 802.11%s ç„¡ç·šLANコントローラ" ++ ++msgid "AuthGroup" ++msgstr "" ++ ++msgid "Authentication" ++msgstr "èªè¨¼" ++ ++msgid "Authoritative" ++msgstr "Authoritative" ++ ++msgid "Authorization Required" ++msgstr "ログインèªè¨¼" ++ ++msgid "Auto Refresh" ++msgstr "自動更新" ++ ++msgid "Automatic" ++msgstr "" ++ ++msgid "Automatic Homenet (HNCP)" ++msgstr "" ++ ++msgid "Available" ++msgstr "使用å¯" ++ ++msgid "Available packages" ++msgstr "インストールå¯èƒ½ãªãƒ‘ッケージ" ++ ++msgid "Average:" ++msgstr "å¹³å‡å€¤:" ++ ++msgid "BSSID" ++msgstr "BSSID" ++ ++msgid "Back" ++msgstr "戻る" ++ ++msgid "Back to Overview" ++msgstr "概è¦ã¸æˆ»ã‚‹" ++ ++msgid "Back to configuration" ++msgstr "設定ã¸æˆ»ã‚‹" ++ ++msgid "Back to overview" ++msgstr "概è¦ã¸æˆ»ã‚‹" ++ ++msgid "Back to scan results" ++msgstr "スキャンçµæžœã¸æˆ»ã‚‹" ++ ++msgid "Background Scan" ++msgstr "ãƒãƒƒã‚¯ã‚°ãƒ©ã‚¦ãƒ³ãƒ‰ã‚¹ã‚­ãƒ£ãƒ³" ++ ++msgid "Backup / Flash Firmware" ++msgstr "ãƒãƒƒã‚¯ã‚¢ãƒƒãƒ— / ファームウェア更新" ++ ++msgid "Backup / Restore" ++msgstr "ãƒãƒƒã‚¯ã‚¢ãƒƒãƒ— / 復元" ++ ++msgid "Backup file list" ++msgstr "ãƒãƒƒã‚¯ã‚¢ãƒƒãƒ—・ファイルリスト" ++ ++msgid "Bad address specified!" ++msgstr "無効ãªã‚¢ãƒ‰ãƒ¬ã‚¹ã§ã™!" ++ ++msgid "Band" ++msgstr "" ++ ++msgid "Behind NAT" ++msgstr "" ++ ++msgid "" ++"Below is the determined list of files to backup. It consists of changed " ++"configuration files marked by opkg, essential base files and the user " ++"defined backup patterns." ++msgstr "" ++"以下ã¯ãƒãƒƒã‚¯ã‚¢ãƒƒãƒ—ã®éš›ã«å«ã¾ã‚Œã‚‹ãƒ•ã‚¡ã‚¤ãƒ«ãƒªã‚¹ãƒˆã§ã™ã€‚ã“ã®ãƒªã‚¹ãƒˆã¯ã€opkgã«ã‚ˆã£" ++"ã¦èªè­˜ã•ã‚Œã¦ã„る設定ファイルã€é‡è¦ãªãƒ™ãƒ¼ã‚¹ãƒ•ã‚¡ã‚¤ãƒ«ã€ãƒ¦ãƒ¼ã‚¶ãƒ¼ãŒè¨­å®šã—ãŸæ­£è¦è¡¨" ++"ç¾ã«ä¸€è‡´ã—ãŸãƒ•ã‚¡ã‚¤ãƒ«ã®ä¸€è¦§ã§ã™ã€‚" ++ ++msgid "Bitrate" ++msgstr "ビットレート" ++ ++msgid "Bogus NX Domain Override" ++msgstr "" ++ ++msgid "Bridge" ++msgstr "ブリッジ" ++ ++msgid "Bridge interfaces" ++msgstr "ブリッジインターフェース" ++ ++msgid "Bridge unit number" ++msgstr "ブリッジユニット番å·" ++ ++msgid "Bring up on boot" ++msgstr "デフォルトã§èµ·å‹•ã™ã‚‹" ++ ++msgid "Broadcom 802.11%s Wireless Controller" ++msgstr "Broadcom 802.11%s ç„¡ç·šLANコントローラ" ++ ++msgid "Broadcom BCM%04x 802.11 Wireless Controller" ++msgstr "Broadcom BCM%04x 802.11 ç„¡ç·šLANコントローラ" ++ ++msgid "Buffered" ++msgstr "ãƒãƒƒãƒ•ã‚¡" ++ ++msgid "Buttons" ++msgstr "ボタン" ++ ++msgid "CA certificate; if empty it will be saved after the first connection." ++msgstr "" ++ ++msgid "CPU" ++msgstr "CPU" ++ ++msgid "CPU usage (%)" ++msgstr "CPU使用率 (%)" ++ ++msgid "Cancel" ++msgstr "キャンセル" ++ ++msgid "Category" ++msgstr "" ++ ++msgid "Chain" ++msgstr "ãƒã‚§ã‚¤ãƒ³" ++ ++msgid "Changes" ++msgstr "変更" ++ ++msgid "Changes applied." ++msgstr "変更ãŒé©ç”¨ã•ã‚Œã¾ã—ãŸã€‚" ++ ++msgid "Changes the administrator password for accessing the device" ++msgstr "デãƒã‚¤ã‚¹ã®ç®¡ç†è€…パスワードを変更ã—ã¾ã™" ++ ++msgid "Channel" ++msgstr "ãƒãƒ£ãƒãƒ«" ++ ++msgid "Check" ++msgstr "ãƒã‚§ãƒƒã‚¯" ++ ++msgid "Checksum" ++msgstr "ãƒã‚§ãƒƒã‚¯ã‚µãƒ " ++ ++msgid "" ++"Choose the firewall zone you want to assign to this interface. Select " ++"unspecified to remove the interface from the associated zone or " ++"fill out the create field to define a new zone and attach the " ++"interface to it." ++msgstr "" ++"ã“ã®ã‚¤ãƒ³ã‚¿ãƒ¼ãƒ•ã‚§ãƒ¼ã‚¹ã«è¨­å®šã™ã‚‹ãƒ•ã‚¡ã‚¤ã‚¦ã‚©ãƒ¼ãƒ«ãƒ»ã‚¾ãƒ¼ãƒ³ã‚’é¸æŠžã—ã¦ãã ã•ã„。" ++"設定ã—ãªã„ã‚’é¸æŠžã™ã‚‹ã¨ã€è¨­å®šæ¸ˆã¿ã®ã‚¾ãƒ¼ãƒ³ã‚’削除ã—ã¾ã™ã€‚ã¾ãŸã€ä½œæˆãƒ•ã‚£ãƒ¼ãƒ«ãƒ‰ã«ã‚¾ãƒ¼ãƒ³åを入力ã™ã‚‹ã¨ã€æ–°ã—ãゾーンを作æˆã—ã€ã“ã®ã‚¤ãƒ³ã‚¿ãƒ¼ãƒ•ã‚§ãƒ¼" ++"スã«è¨­å®šã—ã¾ã™ã€‚" ++ ++msgid "" ++"Choose the network(s) you want to attach to this wireless interface or fill " ++"out the create field to define a new network." ++msgstr "" ++"無線インターフェースをアタッãƒã™ã‚‹ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ã‚’é¸æŠžã—ã¦ãã ã•ã„。ã¾ãŸã¯ã€" ++"作æˆæ¬„ã‚’é¸æŠžã™ã‚‹ã¨æ–°ã—ã„ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ã‚’作æˆã—ã¾ã™ã€‚" ++ ++msgid "Cipher" ++msgstr "æš—å·åŒ–æ–¹å¼" ++ ++msgid "" ++"Click \"Generate archive\" to download a tar archive of the current " ++"configuration files. To reset the firmware to its initial state, click " ++"\"Perform reset\" (only possible with squashfs images)." ++msgstr "" ++"\"ãƒãƒƒã‚¯ã‚¢ãƒƒãƒ—アーカイブã®ä½œæˆ\"をクリックã™ã‚‹ã¨ã€ç¾åœ¨ã®è¨­å®šãƒ•ã‚¡ã‚¤ãƒ«ã‚’tarå½¢å¼" ++"ã®ã‚¢ãƒ¼ã‚«ã‚¤ãƒ–ファイルã¨ã—ã¦ãƒ€ã‚¦ãƒ³ãƒ­ãƒ¼ãƒ‰ã—ã¾ã™ã€‚設定ã®ãƒªã‚»ãƒƒãƒˆã‚’è¡Œã†å ´åˆã€\"設" ++"定リセット\"をクリックã—ã¦ãã ã•ã„。(ãŸã ã—ã€squashfsã‚’ãŠä½¿ã„ã®å ´åˆã®ã¿ä½¿ç”¨å¯" ++"能ã§ã™)" ++ ++msgid "Client" ++msgstr "クライアント" ++ ++msgid "Client ID to send when requesting DHCP" ++msgstr "DHCPリクエスト時ã«é€ä¿¡ã™ã‚‹ã‚¯ãƒ©ã‚¤ã‚¢ãƒ³ãƒˆID" ++ ++msgid "" ++"Close inactive connection after the given amount of seconds, use 0 to " ++"persist connection" ++msgstr "" ++"設定ã—ãŸç§’数後ã«ã€ä½¿ç”¨ã—ã¦ã„ãªã„接続を閉ã˜ã¾ã™ã€‚0を設定ã—ãŸå ´åˆã€æŽ¥ç¶šã‚’維æŒã—" ++"ã¾ã™" ++ ++msgid "Close list..." ++msgstr "リストを閉ã˜ã‚‹" ++ ++msgid "Collecting data..." ++msgstr "データåŽé›†ä¸­ã§ã™..." ++ ++msgid "Command" ++msgstr "コマンド" ++ ++msgid "Common Configuration" ++msgstr "一般設定" ++ ++msgid "Compression" ++msgstr "圧縮" ++ ++msgid "Configuration" ++msgstr "設定" ++ ++msgid "Configuration applied." ++msgstr "設定をé©ç”¨ã—ã¾ã—ãŸã€‚" ++ ++msgid "Configuration files will be kept." ++msgstr "設定ファイルã¯ä¿æŒã•ã‚Œã¾ã™ã€‚" ++ ++msgid "Confirmation" ++msgstr "確èª" ++ ++msgid "Connect" ++msgstr "接続" ++ ++msgid "Connected" ++msgstr "接続中" ++ ++msgid "Connection Limit" ++msgstr "接続制é™" ++ ++msgid "Connection to server fails when TLS cannot be used" ++msgstr "" ++ ++msgid "Connections" ++msgstr "ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯æŽ¥ç¶š" ++ ++msgid "Country" ++msgstr "国" ++ ++msgid "Country Code" ++msgstr "国コード" ++ ++msgid "Cover the following interface" ++msgstr "インターフェースã®æŒ‡å®š" ++ ++msgid "Cover the following interfaces" ++msgstr "インターフェースã®æŒ‡å®š" ++ ++msgid "Create / Assign firewall-zone" ++msgstr "ファイアウォールゾーンã®ä½œæˆ / 割り当ã¦" ++ ++msgid "Create Interface" ++msgstr "インターフェースã®ä½œæˆ" ++ ++msgid "Create a bridge over multiple interfaces" ++msgstr "複数ã®ã‚¤ãƒ³ã‚¿ãƒ•ã‚§ãƒ¼ã‚¹ã‚’指定ã—ã¦ãƒ–リッジを作æˆã—ã¾ã™" ++ ++msgid "Critical" ++msgstr "é‡å¤§" ++ ++msgid "Cron Log Level" ++msgstr "Cronã®ãƒ­ã‚°å‡ºåŠ›ãƒ¬ãƒ™ãƒ«" ++ ++msgid "Custom Interface" ++msgstr "æ–°ã—ã„インターフェース" ++ ++msgid "Custom delegated IPv6-prefix" ++msgstr "" ++ ++msgid "" ++"Customizes the behaviour of the device LEDs if possible." ++msgstr "" ++"LED デãƒã‚¤ã‚¹ã®æŒ™å‹•ã‚’カスタマイズ" ++"ã—ã¾ã™ã€‚" ++ ++msgid "DHCP Leases" ++msgstr "DHCPリース" ++ ++msgid "DHCP Server" ++msgstr "DHCPサーãƒãƒ¼" ++ ++msgid "DHCP and DNS" ++msgstr "DHCP åŠã³ DNS" ++ ++msgid "DHCP client" ++msgstr "DHCP クライアント" ++ ++msgid "DHCP-Options" ++msgstr "DHCPオプション" ++ ++msgid "DHCPv6 Leases" ++msgstr "DHCPv6 リース" ++ ++msgid "DHCPv6 client" ++msgstr "" ++ ++msgid "DHCPv6-Mode" ++msgstr "" ++ ++msgid "DHCPv6-Service" ++msgstr "" ++ ++msgid "DNS" ++msgstr "DNS" ++ ++msgid "DNS forwardings" ++msgstr "DNSフォワーディング" ++ ++msgid "DNS-Label / FQDN" ++msgstr "" ++ ++msgid "DS-Lite AFTR address" ++msgstr "" ++ ++msgid "DUID" ++msgstr "DUID" ++ ++msgid "Debug" ++msgstr "デãƒãƒƒã‚°" ++ ++msgid "Default %d" ++msgstr "標準設定 %d" ++ ++msgid "Default gateway" ++msgstr "デフォルトゲートウェイ" ++ ++msgid "Default route" ++msgstr "" ++ ++msgid "Default state" ++msgstr "標準状態" ++ ++msgid "Define a name for this network." ++msgstr "ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯åを設定ã—ã¦ãã ã•ã„。" ++ ++msgid "" ++"Define additional DHCP options, for example " ++"\"6,192.168.2.1,192.168.2.2\" which advertises different DNS " ++"servers to clients." ++msgstr "" ++"追加ã®DHCPオプションを設定ã—ã¾ã™ã€‚(例:\"6,192.168.2.1,192.168.2.2\" ã¨è¨­å®šã™ã‚‹ã“ã¨ã§ã€ã‚¯ãƒ©ã‚¤ã‚¢ãƒ³ãƒˆã«æŒ‡å®šã®DNSサーãƒãƒ¼ã‚’通知ã—ã¾ã™ã€‚)" ++ ++msgid "Delete" ++msgstr "削除" ++ ++msgid "Delete this interface" ++msgstr "インターフェースを削除ã—ã¾ã™" ++ ++msgid "Delete this network" ++msgstr "ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ã‚’削除ã—ã¾ã™" ++ ++msgid "Description" ++msgstr "詳細" ++ ++msgid "Design" ++msgstr "デザイン" ++ ++msgid "Destination" ++msgstr "宛先" ++ ++msgid "Device" ++msgstr "デãƒã‚¤ã‚¹" ++ ++msgid "Device Configuration" ++msgstr "デãƒã‚¤ã‚¹è¨­å®š" ++ ++msgid "Diagnostics" ++msgstr "診断機能" ++ ++msgid "Dial number" ++msgstr "" ++ ++msgid "Directory" ++msgstr "ディレクトリ" ++ ++msgid "Disable" ++msgstr "無効" ++ ++msgid "" ++"Disable DHCP for " ++"this interface." ++msgstr "" ++"ã“ã®ã‚¤ãƒ³ã‚¿ãƒ¼ãƒ•ã‚§ãƒ¼ã‚¹ã§ã¯DHCP機能を使用ã—ã¾ã›ã‚“。" ++ ++msgid "Disable DNS setup" ++msgstr "DNSセットアップを無効ã«ã™ã‚‹" ++ ++msgid "Disable HW-Beacon timer" ++msgstr "HWビーコンタイマーを無効ã«ã™ã‚‹" ++ ++msgid "Disabled" ++msgstr "無効" ++ ++msgid "Discard upstream RFC1918 responses" ++msgstr "RFC1918ã®å¿œç­”を破棄ã—ã¾ã™" ++ ++msgid "Displaying only packages containing" ++msgstr "å³è¨˜ã®è¡¨ç¤ºã‚’å«ã‚“ã ãƒ‘ッケージã®ã¿ã‚’表示中" ++ ++msgid "Distance Optimization" ++msgstr "è·é›¢ã®æœ€é©åŒ–" ++ ++msgid "Distance to farthest network member in meters." ++msgstr "最もé ã„端末ã¨ã®è·é›¢(メートル)を設定ã—ã¦ãã ã•ã„。" ++ ++msgid "Diversity" ++msgstr "ダイãƒã‚·ãƒ†ã‚£" ++ ++msgid "" ++"Dnsmasq is a combined DHCP-Server and DNS-" ++"Forwarder for NAT " ++"firewalls" ++msgstr "" ++"Dnsmasq 㯠DHCP" ++"サーãƒãƒ¼ã¨ NATファイア" ++"ウォールã®ç‚ºã® DNSフォワーダーを複" ++"åˆã—ãŸã‚µãƒ¼ãƒ“スã§ã™ã€‚" ++ ++msgid "Do not cache negative replies, e.g. for not existing domains" ++msgstr "" ++"無効ãªãƒªãƒ—ライをキャッシュã—ã¾ã›ã‚“ (例:存在ã—ãªã„ドメインã‹ã‚‰ã®è¿”ç­”ãªã©)" ++ ++msgid "Do not forward requests that cannot be answered by public name servers" ++msgstr "パブリックDNSサーãƒãƒ¼ãŒè¿”ç­”ã§ããªã‹ã£ãŸãƒªã‚¯ã‚¨ã‚¹ãƒˆã‚’転é€ã—ã¾ã›ã‚“" ++ ++msgid "Do not forward reverse lookups for local networks" ++msgstr "ローカルãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ã¸ã®é€†å¼•ãを転é€ã—ã¾ã›ã‚“" ++ ++msgid "Do not send probe responses" ++msgstr "プローブレスãƒãƒ³ã‚¹ã‚’é€ä¿¡ã—ãªã„" ++ ++msgid "Domain required" ++msgstr "ドメイン必須" ++ ++msgid "Domain whitelist" ++msgstr "ドメイン・ホワイトリスト" ++ ++msgid "" ++"Don't forward DNS-Requests without " ++"DNS-Name" ++msgstr "" ++"DNSåã®ç„¡ã„ DNSリクエストを転é€ã—ã¾ã›ã‚“" ++ ++msgid "Download and install package" ++msgstr "パッケージã®ãƒ€ã‚¦ãƒ³ãƒ­ãƒ¼ãƒ‰ã¨ã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«" ++ ++msgid "Download backup" ++msgstr "ãƒãƒƒã‚¯ã‚¢ãƒƒãƒ—アーカイブã®ãƒ€ã‚¦ãƒ³ãƒ­ãƒ¼ãƒ‰" ++ ++msgid "Dropbear Instance" ++msgstr "Dropbear設定" ++ ++msgid "" ++"Dropbear offers SSH network shell access " ++"and an integrated SCP server" ++msgstr "" ++"Dropbear 㯠SSH ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ã¸ã®ã‚·ã‚§ãƒ«ã‚¢" ++"クセスã¨çµ±åˆã•ã‚ŒãŸ SCP サーãƒãƒ¼ã‚’æä¾›ã—ã¾" ++"ã™ã€‚" ++ ++msgid "Dual-Stack Lite (RFC6333)" ++msgstr "" ++ ++msgid "Dynamic DHCP" ++msgstr "" ++"ダイナミック DHCP" ++ ++msgid "Dynamic tunnel" ++msgstr "動的トンãƒãƒ«æ©Ÿèƒ½" ++ ++msgid "" ++"Dynamically allocate DHCP addresses for clients. If disabled, only clients " ++"having static leases will be served." ++msgstr "" ++"クライアントã«å¯¾ã—ã¦å‹•çš„ã«DHCPアドレスを割り振りã¾ã™ã€‚無効ã«è¨­å®šã—ãŸå ´åˆã€é™" ++"的リースã®ã¿ã‚’è¡Œã„ã¾ã™ã€‚" ++ ++msgid "EAP-Method" ++msgstr "EAPメソッド" ++ ++msgid "Edit" ++msgstr "編集" ++ ++msgid "" ++"Edit the raw configuration data above to fix any error and hit \"Save\" to " ++"reload the page." ++msgstr "" ++ ++msgid "Edit this interface" ++msgstr "インターフェースを編集" ++ ++msgid "Edit this network" ++msgstr "ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ã‚’編集" ++ ++msgid "Emergency" ++msgstr "緊急" ++ ++msgid "Enable" ++msgstr "有効" ++ ++msgid "Enable STP" ++msgstr "STPを有効ã«ã™ã‚‹" ++ ++msgid "Enable HE.net dynamic endpoint update" ++msgstr "HE.netã®å‹•çš„endpoint更新を有効ã«ã—ã¾ã™" ++ ++msgid "Enable IPv6 negotiation on the PPP link" ++msgstr "PPPリンクã®IPv6ãƒã‚´ã‚·ã‚¨ãƒ¼ã‚·ãƒ§ãƒ³ã‚’有効ã«ã™ã‚‹" ++ ++msgid "Enable Jumbo Frame passthrough" ++msgstr "ジャンボフレーム・パススルーを有効ã«ã™ã‚‹" ++ ++msgid "Enable NTP client" ++msgstr "NTPクライアント機能を有効ã«ã™ã‚‹" ++ ++msgid "Enable TFTP server" ++msgstr "TFTPサーãƒãƒ¼ã‚’有効ã«ã™ã‚‹" ++ ++msgid "Enable VLAN functionality" ++msgstr "VLAN機能を有効ã«ã™ã‚‹" ++ ++msgid "Enable WPS pushbutton, requires WPA(2)-PSK" ++msgstr "" ++ ++msgid "Enable learning and aging" ++msgstr "ラーニング・エイジング機能を有効ã«ã™ã‚‹" ++ ++msgid "Enable mirroring of incoming packets" ++msgstr "" ++ ++msgid "Enable mirroring of outgoing packets" ++msgstr "" ++ ++msgid "Enable this mount" ++msgstr "マウント設定を有効ã«ã™ã‚‹" ++ ++msgid "Enable this swap" ++msgstr "スワップ設定を有効ã«ã™ã‚‹" ++ ++msgid "Enable/Disable" ++msgstr "有効/無効" ++ ++msgid "Enabled" ++msgstr "有効" ++ ++msgid "Enables the Spanning Tree Protocol on this bridge" ++msgstr "スパニングツリー・プロトコルを有効ã«ã™ã‚‹" ++ ++msgid "Encapsulation mode" ++msgstr "カプセル化モード" ++ ++msgid "Encryption" ++msgstr "æš—å·åŒ–モード" ++ ++msgid "Erasing..." ++msgstr "消去中..." ++ ++msgid "Error" ++msgstr "エラー" ++ ++msgid "Ethernet Adapter" ++msgstr "イーサãƒãƒƒãƒˆã‚¢ãƒ€ãƒ—ã‚¿" ++ ++msgid "Ethernet Switch" ++msgstr "イーサãƒãƒƒãƒˆã‚¹ã‚¤ãƒƒãƒ" ++ ++msgid "Expand hosts" ++msgstr "拡張ホスト設定" ++ ++msgid "Expires" ++msgstr "期é™åˆ‡ã‚Œ" ++ ++#, fuzzy ++msgid "" ++"Expiry time of leased addresses, minimum is 2 minutes (2m)." ++msgstr "" ++"リースアドレスã®æœ‰åŠ¹æ™‚間を入力ã—ã¾ã™ã€‚最å°è¨­å®šå€¤ã¯2分ã§ã™ã€‚ (2m)." ++ ++msgid "External" ++msgstr "" ++ ++msgid "External system log server" ++msgstr "外部システムログ・サーãƒãƒ¼" ++ ++msgid "External system log server port" ++msgstr "外部システムログ・サーãƒãƒ¼ãƒãƒ¼ãƒˆ" ++ ++msgid "Fast Frames" ++msgstr "ファスト・フレーム" ++ ++msgid "File" ++msgstr "ファイル" ++ ++msgid "Filename of the boot image advertised to clients" ++msgstr "クライアントã«é€šçŸ¥ã™ã‚‹ãƒ–ートイメージã®ãƒ•ã‚¡ã‚¤ãƒ«å" ++ ++msgid "Filesystem" ++msgstr "ファイルシステム" ++ ++msgid "Filter" ++msgstr "フィルタ" ++ ++msgid "Filter private" ++msgstr "プライベートフィルター" ++ ++msgid "Filter useless" ++msgstr "Filter useless" ++ ++msgid "Find and join network" ++msgstr "ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ã‚’検索ã—ã¦å‚加" ++ ++msgid "Find package" ++msgstr "パッケージを検索" ++ ++msgid "Finish" ++msgstr "終了" ++ ++msgid "Firewall" ++msgstr "ファイアウォール" ++ ++msgid "Firewall Settings" ++msgstr "ファイアウォール設定" ++ ++msgid "Firewall Status" ++msgstr "ファイアウォール・ステータス" ++ ++msgid "Firmware Version" ++msgstr "ファームウェア・ãƒãƒ¼ã‚¸ãƒ§ãƒ³" ++ ++msgid "Fixed source port for outbound DNS queries" ++msgstr "DNSクエリをé€ä¿¡ã™ã‚‹é€ä¿¡å…ƒãƒãƒ¼ãƒˆã‚’固定ã—ã¾ã™" ++ ++msgid "Flags" ++msgstr "フラグ" ++ ++msgid "Flash Firmware" ++msgstr "ファームウェアã®æ›´æ–°" ++ ++msgid "Flash image..." ++msgstr "æ›´æ–°" ++ ++msgid "Flash new firmware image" ++msgstr "ファームウェアã®æ›´æ–°" ++ ++msgid "Flash operations" ++msgstr "更新機能" ++ ++msgid "Flashing..." ++msgstr "更新中..." ++ ++msgid "Force" ++msgstr "強制" ++ ++msgid "Force CCMP (AES)" ++msgstr "CCMP (AES) を使用" ++ ++msgid "Force DHCP on this network even if another server is detected." ++msgstr "" ++"別ã®DHCPサーãƒãƒ¼ãŒæ¤œå‡ºã•ã‚ŒãŸå ´åˆã§ã‚‚ã€DHCPサーãƒãƒ¼æ©Ÿèƒ½ã‚’強制的ã«èµ·å‹•ã—ã¾ã™ã€‚" ++ ++msgid "Force TKIP" ++msgstr "TKIP を使用" ++ ++msgid "Force TKIP and CCMP (AES)" ++msgstr "TKIP åŠã³CCMP (AES) を使用" ++ ++msgid "Forward DHCP traffic" ++msgstr "DHCPトラフィックを転é€ã™ã‚‹" ++ ++msgid "Forward broadcast traffic" ++msgstr "ブロードキャスト・トラフィックを転é€ã™ã‚‹" ++ ++msgid "Forwarding mode" ++msgstr "転é€ãƒ¢ãƒ¼ãƒ‰" ++ ++msgid "Fragmentation Threshold" ++msgstr "フラグメンテーション閾値" ++ ++msgid "Frame Bursting" ++msgstr "フレームãƒãƒ¼ã‚¹ãƒˆ" ++ ++msgid "Free" ++msgstr "空ã" ++ ++msgid "Free space" ++msgstr "ディスクã®ç©ºã容é‡" ++ ++msgid "GHz" ++msgstr "GHz" ++ ++msgid "GPRS only" ++msgstr "GPRSã®ã¿" ++ ++msgid "Gateway" ++msgstr "ゲートウェイ" ++ ++msgid "Gateway ports" ++msgstr "ゲートウェイ・ãƒãƒ¼ãƒˆ" ++ ++msgid "General Settings" ++msgstr "一般設定" ++ ++msgid "General Setup" ++msgstr "一般設定" ++ ++msgid "Generate archive" ++msgstr "ãƒãƒƒã‚¯ã‚¢ãƒƒãƒ—アーカイブã®ä½œæˆ" ++ ++msgid "Generic 802.11%s Wireless Controller" ++msgstr "802.11%s ç„¡ç·šLANコントローラ" ++ ++msgid "Given password confirmation did not match, password not changed!" ++msgstr "入力ã•ã‚ŒãŸãƒ‘スワードãŒä¸€è‡´ã—ã¾ã›ã‚“。パスワードã¯å¤‰æ›´ã•ã‚Œã¾ã›ã‚“ã§ã—ãŸ!" ++ ++msgid "Global network options" ++msgstr "" ++ ++msgid "Go to password configuration..." ++msgstr "パスワード設定ã¸ç§»å‹•..." ++ ++msgid "Go to relevant configuration page" ++msgstr "関連ã™ã‚‹è¨­å®šãƒšãƒ¼ã‚¸ã¸ç§»å‹•" ++ ++msgid "Guest" ++msgstr "" ++ ++msgid "HE.net password" ++msgstr "HE.net パスワード" ++ ++msgid "HE.net username" ++msgstr "" ++ ++msgid "Handler" ++msgstr "ãƒãƒ³ãƒ‰ãƒ©" ++ ++msgid "Hang Up" ++msgstr "å†èµ·å‹•" ++ ++msgid "Heartbeat" ++msgstr "" ++ ++msgid "" ++"Here you can configure the basic aspects of your device like its hostname or " ++"the timezone." ++msgstr "" ++"ã“ã®ãƒšãƒ¼ã‚¸ã§ã¯ãƒ›ã‚¹ãƒˆåやタイムゾーンãªã©ã®åŸºæœ¬çš„ãªè¨­å®šã‚’è¡Œã†ã“ã¨ãŒå‡ºæ¥ã¾ã™ã€‚" ++ ++msgid "" ++"Here you can paste public SSH-Keys (one per line) for SSH public-key " ++"authentication." ++msgstr "SSH公開éµèªè¨¼ã§ä½¿ç”¨ã™ã‚‹SSH公開éµã‚’1è¡Œã¥ã¤ãƒšãƒ¼ã‚¹ãƒˆã—ã¦ãã ã•ã„。" ++ ++msgid "Hermes 802.11b Wireless Controller" ++msgstr "Hermes 802.11b ç„¡ç·šLANコントローラ" ++ ++msgid "Hide ESSID" ++msgstr "ESSIDã®éš åŒ¿" ++ ++msgid "Host entries" ++msgstr "ホストエントリー" ++ ++msgid "Host expiry timeout" ++msgstr "" ++ ++msgid "Host-IP or Network" ++msgstr "" ++"ホストIP ã¾ãŸã¯ ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯" ++ ++msgid "Hostname" ++msgstr "ホストå" ++ ++msgid "Hostname to send when requesting DHCP" ++msgstr "DHCPリクエスト時ã«é€ä¿¡ã™ã‚‹ãƒ›ã‚¹ãƒˆå" ++ ++msgid "Hostnames" ++msgstr "ホストå" ++ ++msgid "Hybrid" ++msgstr "" ++ ++msgid "IP address" ++msgstr "IPアドレス" ++ ++msgid "IPv4" ++msgstr "IPv4" ++ ++msgid "IPv4 Firewall" ++msgstr "IPv4 ファイアウォール" ++ ++msgid "IPv4 WAN Status" ++msgstr "IPv4 WAN ステータス" ++ ++msgid "IPv4 address" ++msgstr "IPv4 アドレス" ++ ++msgid "IPv4 and IPv6" ++msgstr "IPv4åŠã³IPv6" ++ ++msgid "IPv4 assignment length" ++msgstr "" ++ ++msgid "IPv4 broadcast" ++msgstr "IPv4 ブロードキャスト" ++ ++msgid "IPv4 gateway" ++msgstr "IPv4 ゲートウェイ" ++ ++msgid "IPv4 netmask" ++msgstr "IPv4 ãƒãƒƒãƒˆãƒžã‚¹ã‚¯" ++ ++msgid "IPv4 only" ++msgstr "IPv4ã®ã¿" ++ ++msgid "IPv4 prefix length" ++msgstr "IPv4 プレフィクス長" ++ ++msgid "IPv4-Address" ++msgstr "IPv4-アドレス" ++ ++msgid "IPv6" ++msgstr "IPv6" ++ ++msgid "IPv6 Firewall" ++msgstr "IPv6 ファイアウォール" ++ ++msgid "IPv6 Neighbours" ++msgstr "" ++ ++msgid "IPv6 Settings" ++msgstr "" ++ ++msgid "IPv6 ULA-Prefix" ++msgstr "" ++ ++msgid "IPv6 WAN Status" ++msgstr "IPv6 WAN ステータス" ++ ++msgid "IPv6 address" ++msgstr "IPv6 アドレス" ++ ++msgid "IPv6 address delegated to the local tunnel endpoint (optional)" ++msgstr "" ++ ++msgid "IPv6 assignment hint" ++msgstr "" ++ ++msgid "IPv6 assignment length" ++msgstr "" ++ ++msgid "IPv6 gateway" ++msgstr "IPv6 ゲートウェイ" ++ ++msgid "IPv6 only" ++msgstr "IPv6ã®ã¿" ++ ++msgid "IPv6 prefix" ++msgstr "IPv6 プレフィクス" ++ ++msgid "IPv6 prefix length" ++msgstr "IPv6 プレフィクス長" ++ ++msgid "IPv6 routed prefix" ++msgstr "" ++ ++msgid "IPv6-Address" ++msgstr "IPv6-アドレス" ++ ++msgid "IPv6-in-IPv4 (RFC4213)" ++msgstr "IPv6-in-IPv4 (RFC4213)" ++ ++msgid "IPv6-over-IPv4 (6rd)" ++msgstr "IPv6-over-IPv4 (6rd)" ++ ++msgid "IPv6-over-IPv4 (6to4)" ++msgstr "IPv6-over-IPv4 (6to4)" ++ ++msgid "Identity" ++msgstr "識別å­" ++ ++msgid "" ++"If specified, mount the device by its UUID instead of a fixed device node" ++msgstr "固定ã®ãƒ‡ãƒã‚¤ã‚¹ãƒŽãƒ¼ãƒ‰åã®ã‹ã‚ã‚Šã«ã€è¨­å®šã—ãŸUUIDを使用ã—ã¦ãƒžã‚¦ãƒ³ãƒˆã—ã¾ã™" ++ ++msgid "" ++"If specified, mount the device by the partition label instead of a fixed " ++"device node" ++msgstr "" ++"固定ã®ãƒ‡ãƒã‚¤ã‚¹ãƒŽãƒ¼ãƒ‰åã®ã‹ã‚ã‚Šã«ã€è¨­å®šã—ãŸãƒ‘ーティションラベルを使用ã—ã¦ãƒžã‚¦" ++"ントã—ã¾ã™ã€‚" ++ ++msgid "If unchecked, no default route is configured" ++msgstr "ãƒã‚§ãƒƒã‚¯ã•ã‚Œã¦ã„ãªã„å ´åˆã€ãƒ‡ãƒ•ã‚©ãƒ«ãƒˆãƒ«ãƒ¼ãƒˆã‚’設定ã—ã¾ã›ã‚“" ++ ++msgid "If unchecked, the advertised DNS server addresses are ignored" ++msgstr "ãƒã‚§ãƒƒã‚¯ã•ã‚Œã¦ã„ãªã„å ´åˆã€é€šçŸ¥ã•ã‚ŒãŸDNSサーãƒãƒ¼ã‚¢ãƒ‰ãƒ¬ã‚¹ã‚’無視ã—ã¾ã™" ++ ++msgid "" ++"If your physical memory is insufficient unused data can be temporarily " ++"swapped to a swap-device resulting in a higher amount of usable RAM. Be aware that swapping data is a very " ++"slow process as the swap-device cannot be accessed with the high datarates " ++"of the RAM." ++msgstr "" ++"物ç†ãƒ¡ãƒ¢ãƒªãŒä¸è¶³ã™ã‚‹å ´åˆã€ä¸€æ™‚çš„ã«ãƒ‡ãƒ¼ã‚¿ã‚’より大容é‡ãªRAMデãƒã‚¤ã‚¹ã«ã‚¹ãƒ¯ãƒƒãƒ—ã™ã‚‹ã“ã¨ãŒå‡ºæ¥ã¾ã™ã€‚ãŸã ã—ã€ãƒ‡ãƒ¼" ++"ã‚¿ã®ã‚¹ãƒ¯ãƒƒãƒ—ã¯éžå¸¸ã«é…ã„処ç†ã§ã‚ã‚‹ãŸã‚ã€ã‚¹ãƒ¯ãƒƒãƒ—ã™ã‚‹ãƒ‡ãƒã‚¤ã‚¹ã«ã¯é«˜é€Ÿã«RAMã«ã‚¢ã‚¯ã‚»ã‚¹ã™ã‚‹ã“ã¨ãŒã§ããªããªã‚‹æã‚Œ" ++"ãŒã‚ã‚Šã¾ã™ã€‚" ++ ++msgid "Ignore Hosts files" ++msgstr "ホストファイルを無視ã™ã‚‹" ++ ++msgid "Ignore interface" ++msgstr "インターフェースを無視ã™ã‚‹" ++ ++msgid "Ignore resolve file" ++msgstr "リゾルãƒãƒ•ã‚¡ã‚¤ãƒ«ã‚’無視ã™ã‚‹" ++ ++msgid "Image" ++msgstr "イメージ" ++ ++msgid "In" ++msgstr "イン" ++ ++msgid "Inactivity timeout" ++msgstr "未使用時タイムアウト" ++ ++msgid "Inbound:" ++msgstr "å—ä¿¡:" ++ ++msgid "Info" ++msgstr "情報" ++ ++msgid "Initscript" ++msgstr "起動スクリプト" ++ ++msgid "Initscripts" ++msgstr "起動スクリプト" ++ ++msgid "Install" ++msgstr "インストール" ++ ++msgid "Install iputils-traceroute6 for IPv6 traceroute" ++msgstr "" ++ ++msgid "Install package %q" ++msgstr "%q パッケージをインストールã—ã¾ã™" ++ ++msgid "Install protocol extensions..." ++msgstr "プロトコル拡張機能をインストールã—ã¾ã™..." ++ ++msgid "Installed packages" ++msgstr "インストール済ã¿ãƒ‘ッケージ" ++ ++msgid "Interface" ++msgstr "インターフェース" ++ ++msgid "Interface Configuration" ++msgstr "インターフェース設定" ++ ++msgid "Interface Overview" ++msgstr "インターフェース一覧" ++ ++msgid "Interface is reconnecting..." ++msgstr "インターフェースå†æŽ¥ç¶šä¸­..." ++ ++msgid "Interface is shutting down..." ++msgstr "インターフェース終了中..." ++ ++msgid "Interface not present or not connected yet." ++msgstr "インターフェースãŒå­˜åœ¨ã—ãªã„ã‹ã€æŽ¥ç¶šã—ã¦ã„ã¾ã›ã‚“" ++ ++msgid "Interface reconnected" ++msgstr "インターフェースã®å†æŽ¥ç¶š" ++ ++msgid "Interface shut down" ++msgstr "インターフェースã®çµ‚了" ++ ++msgid "Interfaces" ++msgstr "インターフェース" ++ ++msgid "Internal" ++msgstr "" ++ ++msgid "Internal Server Error" ++msgstr "内部サーãƒãƒ¼ã‚¨ãƒ©ãƒ¼" ++ ++msgid "Invalid" ++msgstr "入力値ãŒä¸æ­£ã§ã™" ++ ++msgid "Invalid VLAN ID given! Only IDs between %d and %d are allowed." ++msgstr "無効ãªVLAN IDã§ã™! IDã¯%dã‹ã‚‰%dã¾ã§ã®å€¤ã®ã¿å…¥åŠ›å¯èƒ½ã§ã™ã€‚" ++ ++msgid "Invalid VLAN ID given! Only unique IDs are allowed" ++msgstr "無効ãªVLAN IDã§ã™! ユニークãªIDを入力ã—ã¦ãã ã•ã„。" ++ ++msgid "Invalid username and/or password! Please try again." ++msgstr "ユーザーåã¨ãƒ‘スワードãŒä¸æ­£ã§ã™! ã‚‚ã†ä¸€åº¦å…¥åŠ›ã—ã¦ãã ã•ã„。" ++ ++#, fuzzy ++msgid "" ++"It appears that you are trying to flash an image that does not fit into the " ++"flash memory, please verify the image file!" ++msgstr "" ++"æ›´æ–°ã—よã†ã¨ã—ãŸã‚¤ãƒ¡ãƒ¼ã‚¸ãƒ•ã‚¡ã‚¤ãƒ«ã¯ã“ã®ãƒ•ãƒ©ãƒƒã‚·ãƒ¥ãƒ¡ãƒ¢ãƒªã«é©åˆã—ã¾ã›ã‚“。もã†ä¸€" ++"度イメージファイルを確èªã—ã¦ãã ã•ã„!" ++ ++msgid "Java Script required!" ++msgstr "JavaScriptを有効ã«ã—ã¦ãã ã•ã„!" ++ ++msgid "Join Network" ++msgstr "ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ã«æŽ¥ç¶šã™ã‚‹" ++ ++msgid "Join Network: Settings" ++msgstr "ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ã«æŽ¥ç¶šã™ã‚‹: 設定" ++ ++msgid "Join Network: Wireless Scan" ++msgstr "ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ã«æŽ¥ç¶šã™ã‚‹: ç„¡ç·šLANスキャン" ++ ++msgid "Keep settings" ++msgstr "設定をä¿æŒã™ã‚‹" ++ ++msgid "Kernel Log" ++msgstr "カーãƒãƒ«ãƒ­ã‚°" ++ ++msgid "Kernel Version" ++msgstr "カーãƒãƒ«ãƒãƒ¼ã‚¸ãƒ§ãƒ³" ++ ++msgid "Key" ++msgstr "æš—å·ã‚­ãƒ¼" ++ ++msgid "Key #%d" ++msgstr "キー #%d" ++ ++msgid "Kill" ++msgstr "強制終了" ++ ++msgid "L2TP" ++msgstr "L2TP" ++ ++msgid "L2TP Server" ++msgstr "L2TP サーãƒãƒ¼" ++ ++msgid "LCP echo failure threshold" ++msgstr "LCP echo 失敗数ã—ãã„値" ++ ++msgid "LCP echo interval" ++msgstr "LCP echo é€ä¿¡é–“éš”" ++ ++msgid "LLC" ++msgstr "LLC" ++ ++msgid "Label" ++msgstr "ラベル" ++ ++msgid "Language" ++msgstr "言語" ++ ++msgid "Language and Style" ++msgstr "言語ã¨ã‚¹ã‚¿ã‚¤ãƒ«" ++ ++msgid "Leaf" ++msgstr "" ++ ++msgid "Lease validity time" ++msgstr "リース有効時間" ++ ++msgid "Leasefile" ++msgstr "リースファイル" ++ ++msgid "Leasetime" ++msgstr "リース時間" ++ ++msgid "Leasetime remaining" ++msgstr "残りリース時間" ++ ++msgid "Leave empty to autodetect" ++msgstr "空欄ã®å ´åˆã€è‡ªå‹•æ¤œçŸ¥ã‚’è¡Œã„ã¾ã™" ++ ++msgid "Leave empty to use the current WAN address" ++msgstr "空欄ã®å ´åˆã€ç¾åœ¨ã®WANアドレスを使用ã—ã¾ã™" ++ ++msgid "Legend:" ++msgstr "凡例:" ++ ++msgid "Limit" ++msgstr "割り当ã¦æ•°" ++ ++msgid "Line Attenuation" ++msgstr "" ++ ++msgid "Line Speed" ++msgstr "" ++ ++msgid "Line State" ++msgstr "" ++ ++msgid "Link On" ++msgstr "リンクオン" ++ ++msgid "" ++"List of DNS servers to forward " ++"requests to" ++msgstr "" ++"å•ã„åˆã‚ã›ã‚’転é€ã™ã‚‹DNS サーãƒãƒ¼ã®" ++"リストを設定ã—ã¾ã™" ++ ++msgid "List of domains to allow RFC1918 responses for" ++msgstr "RFC1918ã®å¿œç­”を許å¯ã™ã‚‹ãƒªã‚¹ãƒˆ" ++ ++msgid "List of hosts that supply bogus NX domain results" ++msgstr "" ++ ++msgid "Listen only on the given interface or, if unspecified, on all" ++msgstr "" ++"指定ã—ãŸã‚¤ãƒ³ã‚¿ãƒ¼ãƒ•ã‚§ãƒ¼ã‚¹ã§ã®ã¿ã‚¢ã‚¯ã‚»ã‚¹ã‚’有効ã«ã—ã¾ã™ã€‚設定ã—ãªã„å ´åˆã¯ã™ã¹ã¦" ++"ã®ã‚¤ãƒ³ã‚¿ãƒ•ã‚§ãƒ¼ã‚¹ãŒå¯¾è±¡ã§ã™" ++ ++msgid "Listening port for inbound DNS queries" ++msgstr "DNSクエリをå—ä¿¡ã™ã‚‹ãƒãƒ¼ãƒˆ" ++ ++msgid "Load" ++msgstr "è² è·" ++ ++msgid "Load Average" ++msgstr "システム平å‡è² è·" ++ ++msgid "Loading" ++msgstr "ロード中" ++ ++msgid "Local IPv4 address" ++msgstr "ローカル IPv4 アドレス" ++ ++msgid "Local IPv6 address" ++msgstr "ローカル IPv6 アドレス" ++ ++msgid "Local Startup" ++msgstr "ローカル Startup" ++ ++msgid "Local Time" ++msgstr "時刻" ++ ++msgid "Local domain" ++msgstr "ローカルドメイン" ++ ++msgid "" ++"Local domain specification. Names matching this domain are never forwarded " ++"and are resolved from DHCP or hosts files only" ++msgstr "" ++ ++msgid "Local domain suffix appended to DHCP names and hosts file entries" ++msgstr "" ++ ++msgid "Local server" ++msgstr "ローカルサーãƒãƒ¼" ++ ++msgid "" ++"Localise hostname depending on the requesting subnet if multiple IPs are " ++"available" ++msgstr "" ++ ++msgid "Localise queries" ++msgstr "ローカライズクエリ" ++ ++msgid "Locked to channel %d used by: %s" ++msgstr "" ++ ++msgid "Log output level" ++msgstr "ログ出力レベル" ++ ++msgid "Log queries" ++msgstr "ログクエリー" ++ ++msgid "Logging" ++msgstr "ログ" ++ ++msgid "Login" ++msgstr "ログイン" ++ ++msgid "Logout" ++msgstr "ログアウト" ++ ++msgid "Lowest leased address as offset from the network address." ++msgstr "" ++"ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ã‚¢ãƒ‰ãƒ¬ã‚¹ã‚’オフセットã¨ã—ã¦ã€æœ€å°ã®ã‚¢ãƒ‰ãƒ¬ã‚¹ã‚’設定ã—ã¦ãã ã•ã„" ++ ++msgid "MAC-Address" ++msgstr "MAC-アドレス" ++ ++msgid "MAC-Address Filter" ++msgstr "MAC-アドレスフィルタ" ++ ++msgid "MAC-Filter" ++msgstr "MAC-フィルタ" ++ ++msgid "MAC-List" ++msgstr "MAC-リスト" ++ ++msgid "MB/s" ++msgstr "MB/s" ++ ++msgid "MHz" ++msgstr "MHz" ++ ++msgid "MTU" ++msgstr "MTU" ++ ++msgid "" ++"Make sure to clone the root filesystem using something like the commands " ++"below:" ++msgstr "" ++ ++msgid "Maximum Rate" ++msgstr "最大レート" ++ ++msgid "Maximum allowed number of active DHCP leases" ++msgstr "DHCPリースã®è¨±å¯ã•ã‚Œã‚‹æœ€å¤§æ•°" ++ ++msgid "Maximum allowed number of concurrent DNS queries" ++msgstr "並列DNSクエリã®è¨±å¯ã•ã‚Œã‚‹æœ€å¤§æ•°" ++ ++msgid "Maximum allowed size of EDNS.0 UDP packets" ++msgstr "EDNS.0 UDP パケットサイズã®è¨±å¯ã•ã‚Œã‚‹æœ€å¤§æ•°" ++ ++msgid "Maximum amount of seconds to wait for the modem to become ready" ++msgstr "モデムãŒæº–備完了状態ã«ãªã‚‹ã¾ã§ã®æœ€å¤§å¾…ã¡æ™‚é–“" ++ ++msgid "Maximum hold time" ++msgstr "最大ä¿æŒæ™‚é–“" ++ ++msgid "Maximum number of leased addresses." ++msgstr "リースã™ã‚‹ã‚¢ãƒ‰ãƒ¬ã‚¹ã®æœ€å¤§æ•°ã§ã™" ++ ++msgid "Mbit/s" ++msgstr "Mbit/s" ++ ++msgid "Memory" ++msgstr "メモリー" ++ ++msgid "Memory usage (%)" ++msgstr "メモリ使用率 (%)" ++ ++msgid "Metric" ++msgstr "メトリック" ++ ++msgid "Minimum Rate" ++msgstr "最å°ãƒ¬ãƒ¼ãƒˆ" ++ ++msgid "Minimum hold time" ++msgstr "最短ä¿æŒæ™‚é–“" ++ ++msgid "Mirror monitor port" ++msgstr "" ++ ++msgid "Mirror source port" ++msgstr "" ++ ++msgid "Missing protocol extension for proto %q" ++msgstr "プロトコル %qã®ãƒ—ロトコル拡張ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“" ++ ++msgid "Mode" ++msgstr "モード" ++ ++msgid "Model" ++msgstr "" ++ ++msgid "Modem device" ++msgstr "モデムデãƒã‚¤ã‚¹" ++ ++msgid "Modem init timeout" ++msgstr "モデムåˆæœŸåŒ–タイムアウト" ++ ++msgid "Monitor" ++msgstr "モニター" ++ ++msgid "Mount Entry" ++msgstr "マウント機能" ++ ++msgid "Mount Point" ++msgstr "マウントãƒã‚¤ãƒ³ãƒˆ" ++ ++msgid "Mount Points" ++msgstr "マウントãƒã‚¤ãƒ³ãƒˆ" ++ ++msgid "Mount Points - Mount Entry" ++msgstr "マウントãƒã‚¤ãƒ³ãƒˆ - マウント" ++ ++msgid "Mount Points - Swap Entry" ++msgstr "マウントãƒã‚¤ãƒ³ãƒˆ - スワップ" ++ ++msgid "" ++"Mount Points define at which point a memory device will be attached to the " ++"filesystem" ++msgstr "" ++"マウントãƒã‚¤ãƒ³ãƒˆã¯ã€è¨˜æ†¶ãƒ‡ãƒã‚¤ã‚¹ãŒãƒ•ã‚¡ã‚¤ãƒ«ã‚·ã‚¹ãƒ†ãƒ ã®ã©ã“ã«æŽ¥ç¶šã•ã‚Œã¦ã„ã‚‹ã‹ã‚’" ++"表示ã—ã¦ã„ã¾ã™ã€‚" ++ ++msgid "Mount options" ++msgstr "マウントオプション" ++ ++msgid "Mount point" ++msgstr "マウントãƒã‚¤ãƒ³ãƒˆ" ++ ++msgid "Mounted file systems" ++msgstr "マウント中ã®ãƒ•ã‚¡ã‚¤ãƒ«ã‚·ã‚¹ãƒ†ãƒ " ++ ++msgid "Move down" ++msgstr "下ã¸" ++ ++msgid "Move up" ++msgstr "上ã¸" ++ ++msgid "Multicast Rate" ++msgstr "マルãƒã‚­ãƒ£ã‚¹ãƒˆãƒ¬ãƒ¼ãƒˆ" ++ ++msgid "Multicast address" ++msgstr "マルãƒã‚­ãƒ£ã‚¹ãƒˆã‚¢ãƒ‰ãƒ¬ã‚¹" ++ ++msgid "NAS ID" ++msgstr "NAS ID" ++ ++msgid "NDP-Proxy" ++msgstr "" ++ ++msgid "NTP server candidates" ++msgstr "NTPサーãƒãƒ¼å€™è£œ" ++ ++msgid "NTP sync time-out" ++msgstr "" ++ ++msgid "Name" ++msgstr "åå‰" ++ ++msgid "Name of the new interface" ++msgstr "æ–°ã—ã„インターフェースã®åå‰" ++ ++msgid "Name of the new network" ++msgstr "æ–°ã—ã„ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ã®åå‰" ++ ++msgid "Navigation" ++msgstr "ナビゲーション" ++ ++msgid "Netmask" ++msgstr "ãƒãƒƒãƒˆãƒžã‚¹ã‚¯" ++ ++msgid "Network" ++msgstr "ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯" ++ ++msgid "Network Utilities" ++msgstr "ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ãƒ»ãƒ¦ãƒ¼ãƒ†ã‚£ãƒªãƒ†ã‚£" ++ ++msgid "Network boot image" ++msgstr "ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ãƒ»ãƒ–ート用イメージ" ++ ++msgid "Network without interfaces." ++msgstr "" ++ ++msgid "Next »" ++msgstr "次 »" ++ ++msgid "No DHCP Server configured for this interface" ++msgstr "ã“ã®ã‚¤ãƒ³ã‚¿ãƒ¼ãƒ•ã‚§ãƒ¼ã‚¹ã«ã¯DHCPサーãƒãƒ¼ãŒè¨­å®šã•ã‚Œã¦ã„ã¾ã›ã‚“" ++ ++msgid "No chains in this table" ++msgstr "ãƒã‚§ã‚¤ãƒ³å†…ã«ãƒ«ãƒ¼ãƒ«ãŒã‚ã‚Šã¾ã›ã‚“" ++ ++msgid "No files found" ++msgstr "ファイルãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“ã§ã—ãŸ" ++ ++msgid "No information available" ++msgstr "情報ãŒã‚ã‚Šã¾ã›ã‚“" ++ ++msgid "No negative cache" ++msgstr "ãƒã‚¬ãƒ†ã‚£ãƒ–キャッシュを行ãªã‚ãªã„" ++ ++msgid "No network configured on this device" ++msgstr "ã“ã®ãƒ‡ãƒã‚¤ã‚¹ã«è¨­å®šã•ã‚Œã¦ã„ã‚‹ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ãŒã‚ã‚Šã¾ã›ã‚“" ++ ++msgid "No network name specified" ++msgstr "ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯åãŒè¨­å®šã•ã‚Œã¦ã„ã¾ã›ã‚“" ++ ++msgid "No package lists available" ++msgstr "パッケージリストãŒã‚ã‚Šã¾ã›ã‚“" ++ ++msgid "No password set!" ++msgstr "パスワードãŒè¨­å®šã•ã‚Œã¦ã„ã¾ã›ã‚“!" ++ ++msgid "No rules in this chain" ++msgstr "ãƒã‚§ã‚¤ãƒ³å†…ã«ãƒ«ãƒ¼ãƒ«ãŒã‚ã‚Šã¾ã›ã‚“" ++ ++msgid "No zone assigned" ++msgstr "ゾーンãŒè¨­å®šã•ã‚Œã¦ã„ã¾ã›ã‚“" ++ ++msgid "Noise" ++msgstr "ノイズ" ++ ++msgid "Noise Margin" ++msgstr "" ++ ++msgid "Noise:" ++msgstr "ノイズ:" ++ ++msgid "None" ++msgstr "ãªã—" ++ ++msgid "Normal" ++msgstr "標準" ++ ++msgid "Not Found" ++msgstr "" ++ ++msgid "Not associated" ++msgstr "アソシエーションã•ã‚Œã¦ã„ã¾ã›ã‚“" ++ ++msgid "Not connected" ++msgstr "未接続" ++ ++msgid "Note: Configuration files will be erased." ++msgstr "注æ„: 設定ファイルã¯æ¶ˆåŽ»ã•ã‚Œã¾ã™ã€‚" ++ ++msgid "Notice" ++msgstr "注æ„" ++ ++msgid "Nslookup" ++msgstr "Nslookup" ++ ++msgid "OK" ++msgstr "OK" ++ ++msgid "OPKG-Configuration" ++msgstr "OPKG-設定" ++ ++msgid "Off-State Delay" ++msgstr "消ç¯æ™‚é–“" ++ ++msgid "" ++"On this page you can configure the network interfaces. You can bridge " ++"several interfaces by ticking the \"bridge interfaces\" field and enter the " ++"names of several network interfaces separated by spaces. You can also use " ++"VLAN notation " ++"INTERFACE.VLANNR (e.g.: " ++"eth0.1)." ++msgstr "" ++"ã“ã®ãƒšãƒ¼ã‚¸ã§ã¯ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ã‚¤ãƒ³ã‚¿ãƒ¼ãƒ•ã‚§ãƒ¼ã‚¹ã®è¨­å®šã‚’è¡Œã†ã“ã¨ãŒå‡ºæ¥ã¾ã™ã€‚\"ブ" ++"リッジインターフェース\"フィールドをãƒã‚§ãƒƒã‚¯ã—ã€è¤‡æ•°ã®ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ã‚¤ãƒ³ã‚¿ãƒ¼" ++"フェースåをスペースã§åŒºåˆ‡ã‚Šã§å…¥åŠ›ã™ã‚‹ã“ã¨ã§è¤‡æ•°ã®ã‚¤ãƒ³ã‚¿ãƒ¼ãƒ•ã‚§ãƒ¼ã‚¹ã‚’ブリッジ" ++"ã™ã‚‹ã“ã¨ãŒå‡ºæ¥ã¾ã™ã€‚ã¾ãŸã€INTERFACE.VLANNRã¨ã„ã†è¡¨è¨˜ã«ã‚ˆã‚ŠVLANも使用ã™ã‚‹ã“ã¨ãŒå‡ºæ¥ã¾ã™ã€‚" ++"(例: eth0.1)" ++ ++msgid "On-State Delay" ++msgstr "点ç¯æ™‚é–“" ++ ++msgid "One of hostname or mac address must be specified!" ++msgstr "1ã¤ä»¥ä¸Šã®ãƒ›ã‚¹ãƒˆåã¾ãŸã¯macアドレスを設定ã—ã¦ãã ã•ã„!" ++ ++msgid "One or more fields contain invalid values!" ++msgstr "1ã¤ä»¥ä¸Šã®ãƒ•ã‚£ãƒ¼ãƒ«ãƒ‰ã«ç„¡åŠ¹ãªå€¤ãŒè¨­å®šã•ã‚Œã¦ã„ã¾ã™ï¼" ++ ++msgid "One or more required fields have no value!" ++msgstr "1ã¤ä»¥ä¸Šã®ãƒ•ã‚£ãƒ¼ãƒ«ãƒ‰ã«å€¤ãŒè¨­å®šã•ã‚Œã¦ã„ã¾ã›ã‚“ï¼" ++ ++msgid "Open list..." ++msgstr "リストを開ã" ++ ++msgid "OpenConnect (CISCO AnyConnect)" ++msgstr "" ++ ++msgid "Operating frequency" ++msgstr "" ++ ++msgid "Option changed" ++msgstr "変更ã•ã‚Œã‚‹ã‚ªãƒ—ション" ++ ++msgid "Option removed" ++msgstr "削除ã•ã‚Œã‚‹ã‚ªãƒ—ション" ++ ++msgid "Optional, specify to override default server (tic.sixxs.net)" ++msgstr "" ++ ++msgid "Optional, use when the SIXXS account has more than one tunnel" ++msgstr "" ++ ++msgid "Options" ++msgstr "オプション" ++ ++msgid "Other:" ++msgstr "ãã®ä»–:" ++ ++msgid "Out" ++msgstr "アウト" ++ ++msgid "Outbound:" ++msgstr "é€ä¿¡:" ++ ++msgid "Outdoor Channels" ++msgstr "屋外用周波数" ++ ++msgid "Output Interface" ++msgstr "" ++ ++msgid "Override MAC address" ++msgstr "MACアドレスを上書ãã™ã‚‹" ++ ++msgid "Override MTU" ++msgstr "MTUを上書ãã™ã‚‹" ++ ++msgid "Override the gateway in DHCP responses" ++msgstr "DHCPレスãƒãƒ³ã‚¹å†…ã®ã‚²ãƒ¼ãƒˆã‚¦ã‚§ã‚¤ã‚¢ãƒ‰ãƒ¬ã‚¹ã‚’上書ãã™ã‚‹" ++ ++msgid "" ++"Override the netmask sent to clients. Normally it is calculated from the " ++"subnet that is served." ++msgstr "" ++"クライアントã¸é€šçŸ¥ã™ã‚‹ãƒãƒƒãƒˆãƒžã‚¹ã‚¯ã‚’上書ãã—ã¾ã™ã€‚通常ã¯ã€è¨­å®šã•ã‚Œã¦ã„るサブ" ++"ãƒãƒƒãƒˆã‹ã‚‰è¨ˆç®—ã•ã‚Œã¾ã™ã€‚" ++ ++msgid "Override the table used for internal routes" ++msgstr "" ++ ++msgid "Overview" ++msgstr "概è¦" ++ ++msgid "Owner" ++msgstr "所有者" ++ ++msgid "PAP/CHAP password" ++msgstr "PAP/CHAP パスワード" ++ ++msgid "PAP/CHAP username" ++msgstr "PAP/CHAP ユーザーå" ++ ++msgid "PID" ++msgstr "PID" ++ ++msgid "PIN" ++msgstr "PIN" ++ ++msgid "PPP" ++msgstr "PPP" ++ ++msgid "PPPoA Encapsulation" ++msgstr "PPPoAカプセル化" ++ ++msgid "PPPoATM" ++msgstr "PPPoATM" ++ ++msgid "PPPoE" ++msgstr "PPPoE" ++ ++msgid "PPtP" ++msgstr "PPtP" ++ ++msgid "Package libiwinfo required!" ++msgstr "libiwinfo パッケージをインストールã—ã¦ãã ã•ã„ï¼" ++ ++msgid "Package lists are older than 24 hours" ++msgstr "パッケージリストã¯24時間以上å‰ã®ã‚‚ã®ã§ã™" ++ ++msgid "Package name" ++msgstr "パッケージå" ++ ++msgid "Packets" ++msgstr "パケット" ++ ++msgid "Part of zone %q" ++msgstr "ゾーン %qã®ä¸€éƒ¨" ++ ++msgid "Password" ++msgstr "パスワード" ++ ++msgid "Password authentication" ++msgstr "パスワードèªè¨¼" ++ ++msgid "Password of Private Key" ++msgstr "秘密éµã®ãƒ‘スワード" ++ ++msgid "Password successfully changed!" ++msgstr "パスワードを変更ã—ã¾ã—ãŸ" ++ ++msgid "Path" ++msgstr "パス" ++ ++msgid "Path to CA-Certificate" ++msgstr "CA証明書ã®ãƒ‘ス" ++ ++msgid "Path to Client-Certificate" ++msgstr "クライアント証明書ã®ãƒ‘ス" ++ ++msgid "Path to Private Key" ++msgstr "秘密éµã®ãƒ‘ス" ++ ++msgid "Path to executable which handles the button event" ++msgstr "ボタンイベントをãƒãƒ³ãƒ‰ãƒ«ã™ã‚‹å®Ÿè¡Œãƒ•ã‚¡ã‚¤ãƒ«ã®ãƒ‘ス" ++ ++msgid "Peak:" ++msgstr "ピーク:" ++ ++msgid "Perform reboot" ++msgstr "å†èµ·å‹•ã‚’実行" ++ ++msgid "Perform reset" ++msgstr "設定リセットを実行" ++ ++msgid "Phy Rate:" ++msgstr "物ç†ãƒ¬ãƒ¼ãƒˆ:" ++ ++msgid "Physical Settings" ++msgstr "デãƒã‚¤ã‚¹è¨­å®š" ++ ++msgid "Ping" ++msgstr "Ping" ++ ++msgid "Pkts." ++msgstr "パケット" ++ ++msgid "Please enter your username and password." ++msgstr "ユーザーåã¨ãƒ‘スワードを入力ã—ã¦ãã ã•ã„。" ++ ++msgid "Please wait: Device rebooting..." ++msgstr "ã—ã°ã‚‰ããŠå¾…ã¡ãã ã•ã„: å†èµ·å‹•ä¸­ã§ã™..." ++ ++msgid "Policy" ++msgstr "ãƒãƒªã‚·ãƒ¼" ++ ++msgid "Port" ++msgstr "ãƒãƒ¼ãƒˆ" ++ ++msgid "Port %d" ++msgstr "ãƒãƒ¼ãƒˆ %d" ++ ++msgid "Port %d is untagged in multiple VLANs!" ++msgstr "" ++ ++msgid "Port status:" ++msgstr "ãƒãƒ¼ãƒˆ ステータス:" ++ ++msgid "" ++"Presume peer to be dead after given amount of LCP echo failures, use 0 to " ++"ignore failures" ++msgstr "" ++"設定回数ã®LCP echo 確èªå¤±æ•—後ã€ãƒ”アノードãŒãƒ€ã‚¦ãƒ³ã—ã¦ã„ã‚‹ã‚‚ã®ã¨è¦‹ãªã—ã¾ã™ã€‚0" ++"を設定ã—ãŸå ´åˆã€å¤±æ•—ã—ã¦ã‚‚無視ã—ã¾ã™" ++ ++msgid "Prevents client-to-client communication" ++msgstr "クライアントåŒå£«ã®é€šä¿¡ã‚’制é™ã—ã¾ã™" ++ ++msgid "Prism2/2.5/3 802.11b Wireless Controller" ++msgstr "Prism2/2.5/3 802.11b ç„¡ç·šLANコントローラ" ++ ++msgid "Proceed" ++msgstr "続行" ++ ++msgid "Processes" ++msgstr "プロセス" ++ ++msgid "Prot." ++msgstr "プロトコル" ++ ++msgid "Protocol" ++msgstr "プロトコル" ++ ++msgid "Protocol family" ++msgstr "プロトコルファミリ" ++ ++msgid "Protocol of the new interface" ++msgstr "æ–°ã—ã„インターフェースã®ãƒ—ロトコル" ++ ++msgid "Protocol support is not installed" ++msgstr "プロトコルサãƒãƒ¼ãƒˆãŒã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«ã•ã‚Œã¦ã„ã¾ã›ã‚“" ++ ++msgid "Provide NTP server" ++msgstr "NTPサーãƒãƒ¼æ©Ÿèƒ½ã‚’有効ã«ã™ã‚‹" ++ ++msgid "Provide new network" ++msgstr "æ–°ã—ã„ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ã‚’設定ã™ã‚‹" ++ ++msgid "Pseudo Ad-Hoc (ahdemo)" ++msgstr "擬似アドホック (ahdemo)" ++ ++msgid "Public prefix routed to this device for distribution to clients." ++msgstr "" ++ ++msgid "Quality" ++msgstr "クオリティ" ++ ++msgid "RTS/CTS Threshold" ++msgstr "RTS/CTS閾値" ++ ++msgid "RX" ++msgstr "RX" ++ ++msgid "RX Rate" ++msgstr "å—信レート" ++ ++msgid "RaLink 802.11%s Wireless Controller" ++msgstr "RaLink 802.11%s ç„¡ç·šLANコントローラ" ++ ++msgid "Radius-Accounting-Port" ++msgstr "Radiusアカウントサーãƒãƒ¼ãƒ»ãƒãƒ¼ãƒˆç•ªå·" ++ ++msgid "Radius-Accounting-Secret" ++msgstr "Radiusアカウント秘密éµ" ++ ++msgid "Radius-Accounting-Server" ++msgstr "Radiusアカウントサーãƒãƒ¼" ++ ++msgid "Radius-Authentication-Port" ++msgstr "Radiusèªè¨¼ã‚µãƒ¼ãƒãƒ¼ãƒ»ãƒãƒ¼ãƒˆç•ªå·" ++ ++msgid "Radius-Authentication-Secret" ++msgstr "Radiusèªè¨¼ç§˜å¯†éµ" ++ ++msgid "Radius-Authentication-Server" ++msgstr "Radiusèªè¨¼ã‚µãƒ¼ãƒãƒ¼" ++ ++msgid "" ++"Read /etc/ethers to configure the DHCP-Server" ++msgstr "" ++"DHCPサーãƒãƒ¼ã®è¨­å®š" ++"ã¨ã—ã¦/etc/ethers をロードã—ã¾ã™" ++ ++msgid "" ++"Really delete this interface? The deletion cannot be undone!\\nYou might " ++"lose access to this device if you are connected via this interface." ++msgstr "" ++"本当ã«ã“ã®ã‚¤ãƒ³ã‚¿ãƒ¼ãƒ•ã‚§ãƒ¼ã‚¹ã‚’削除ã—ã¾ã™ã‹?一度削除ã™ã‚‹ã¨ã€å…ƒã«æˆ»ã™ã“ã¨ã¯ã§ãã¾" ++"ã›ã‚“!\n" ++"ã“ã®ã‚¤ãƒ³ã‚¿ãƒ¼ãƒ•ã‚§ãƒ¼ã‚¹ã‚’経由ã—ã¦æŽ¥ç¶šã—ã¦ã„ã‚‹å ´åˆã€ãƒ‡ãƒã‚¤ã‚¹ã«ã‚¢ã‚¯ã‚»ã‚¹ã§ããªããª" ++"ã‚‹å ´åˆãŒã‚ã‚Šã¾ã™ã€‚" ++ ++msgid "" ++"Really delete this wireless network? The deletion cannot be undone!\\nYou " ++"might lose access to this device if you are connected via this network." ++msgstr "" ++"本当ã«ã“ã®ç„¡ç·šãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ã‚’削除ã—ã¾ã™ã‹?一度削除ã™ã‚‹ã¨ã€å…ƒã«æˆ»ã™ã“ã¨ã¯ã§ãã¾" ++"ã›ã‚“!\n" ++"ã“ã®ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ã‚’経由ã—ã¦æŽ¥ç¶šã—ã¦ã„ã‚‹å ´åˆã€ãƒ‡ãƒã‚¤ã‚¹ã«ã‚¢ã‚¯ã‚»ã‚¹ã§ããªããªã‚‹å ´" ++"åˆãŒã‚ã‚Šã¾ã™ã€‚" ++ ++msgid "Really reset all changes?" ++msgstr "本当ã«å…¨ã¦ã®å¤‰æ›´ã‚’リセットã—ã¾ã™ã‹?" ++ ++#, fuzzy ++msgid "" ++"Really shut down network?\\nYou might lose access to this device if you are " ++"connected via this interface." ++msgstr "" ++"本当ã«ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ã‚’åœæ­¢ã—ã¾ã™ã‹?\n" ++"ã“ã®ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ã‚’経由ã—ã¦æŽ¥ç¶šã—ã¦ã„ã‚‹å ´åˆã€ãƒ‡ãƒã‚¤ã‚¹ã«ã‚¢ã‚¯ã‚»ã‚¹ã§ããªããªã‚‹å ´" ++"åˆãŒã‚ã‚Šã¾ã™ã€‚" ++ ++msgid "" ++"Really shutdown interface \"%s\" ?\\nYou might lose access to this device if " ++"you are connected via this interface." ++msgstr "" ++"本当ã«ã‚¤ãƒ³ã‚¿ãƒ¼ãƒ•ã‚§ãƒ¼ã‚¹ \"%s\" ã‚’åœæ­¢ã—ã¾ã™ã‹?\n" ++"ã“ã®ã‚¤ãƒ³ã‚¿ãƒ¼ãƒ•ã‚§ãƒ¼ã‚¹ã‚’経由ã—ã¦æŽ¥ç¶šã—ã¦ã„ã‚‹å ´åˆã€ãƒ‡ãƒã‚¤ã‚¹ã«ã‚¢ã‚¯ã‚»ã‚¹ã§ããªããª" ++"ã‚‹å ´åˆãŒã‚ã‚Šã¾ã™ã€‚" ++ ++msgid "Really switch protocol?" ++msgstr "本当ã«ãƒ—ロトコルを切り替ãˆã¾ã™ã‹?" ++ ++msgid "Realtime Connections" ++msgstr "リアルタイム・コãƒã‚¯ã‚·ãƒ§ãƒ³" ++ ++msgid "Realtime Graphs" ++msgstr "リアルタイム・グラフ" ++ ++msgid "Realtime Load" ++msgstr "リアルタイム・ロード" ++ ++msgid "Realtime Traffic" ++msgstr "リアルタイム・トラフィック" ++ ++msgid "Realtime Wireless" ++msgstr "リアルタイム・無線LAN" ++ ++msgid "Rebind protection" ++msgstr "DNSリãƒã‚¤ãƒ³ãƒ‡ã‚£ãƒ³ã‚°ãƒ»ãƒ—ロテクション" ++ ++msgid "Reboot" ++msgstr "å†èµ·å‹•" ++ ++msgid "Rebooting..." ++msgstr "å†èµ·å‹•ä¸­..." ++ ++msgid "Reboots the operating system of your device" ++msgstr "デãƒã‚¤ã‚¹ã®ã‚ªãƒšãƒ¬ãƒ¼ãƒ†ã‚£ãƒ³ã‚°ã‚·ã‚¹ãƒ†ãƒ ã‚’å†èµ·å‹•ã—ã¾ã™ã€‚" ++ ++msgid "Receive" ++msgstr "å—ä¿¡" ++ ++msgid "Receiver Antenna" ++msgstr "å—信アンテナ" ++ ++msgid "Reconnect this interface" ++msgstr "インターフェースã®å†æŽ¥ç¶š" ++ ++msgid "Reconnecting interface" ++msgstr "インターフェースå†æŽ¥ç¶šä¸­" ++ ++msgid "References" ++msgstr "å‚照カウンタ" ++ ++msgid "Regulatory Domain" ++msgstr "è¦åˆ¶ãƒ‰ãƒ¡ã‚¤ãƒ³" ++ ++msgid "Relay" ++msgstr "リレー" ++ ++msgid "Relay Bridge" ++msgstr "リレーブリッジ" ++ ++msgid "Relay between networks" ++msgstr "ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯é–“ã®ãƒªãƒ¬ãƒ¼è¨­å®š" ++ ++msgid "Relay bridge" ++msgstr "リレーブリッジ" ++ ++msgid "Remote IPv4 address" ++msgstr "リモートIPv4アドレス" ++ ++msgid "Remove" ++msgstr "削除" ++ ++msgid "Repeat scan" ++msgstr "å†ã‚¹ã‚­ãƒ£ãƒ³" ++ ++msgid "Replace entry" ++msgstr "エントリーã®ç½®æ›" ++ ++msgid "Replace wireless configuration" ++msgstr "無線設定を置æ›ã™ã‚‹" ++ ++msgid "Request IPv6-address" ++msgstr "" ++ ++msgid "Request IPv6-prefix of length" ++msgstr "" ++ ++msgid "Require TLS" ++msgstr "" ++ ++msgid "Required for certain ISPs, e.g. Charter with DOCSIS 3" ++msgstr "DOCSIS 3.0を使用ã™ã‚‹ã„ãã¤ã‹ã®ISPã§ã¯å¿…è¦ã«ãªã‚Šã¾ã™" ++ ++msgid "Reset" ++msgstr "リセット" ++ ++msgid "Reset Counters" ++msgstr "カウンタã®ãƒªã‚»ãƒƒãƒˆ" ++ ++msgid "Reset to defaults" ++msgstr "標準設定ã«ãƒªã‚»ãƒƒãƒˆ" ++ ++msgid "Resolv and Hosts Files" ++msgstr "åå‰è§£æ±ºãŠã‚ˆã³ãƒ›ã‚¹ãƒˆãƒ•ã‚¡ã‚¤ãƒ«è¨­å®š" ++ ++msgid "Resolve file" ++msgstr "リゾルãƒãƒ•ã‚¡ã‚¤ãƒ«" ++ ++msgid "Restart" ++msgstr "å†èµ·å‹•" ++ ++msgid "Restart Firewall" ++msgstr "ファイアウォールã®å†èµ·å‹•" ++ ++msgid "Restore backup" ++msgstr "ãƒãƒƒã‚¯ã‚¢ãƒƒãƒ—ã‹ã‚‰å¾©å…ƒã™ã‚‹" ++ ++msgid "Reveal/hide password" ++msgstr "パスワードを表示ã™ã‚‹/éš ã™" ++ ++msgid "Revert" ++msgstr "å…ƒã«æˆ»ã™" ++ ++msgid "Root" ++msgstr "ルート" ++ ++msgid "Root directory for files served via TFTP" ++msgstr "TFTP経由ã§ãƒ•ã‚¡ã‚¤ãƒ«ã‚’å–り扱ã†éš›ã®ãƒ«ãƒ¼ãƒˆãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒª" ++ ++msgid "Root preparation" ++msgstr "" ++ ++msgid "Routed IPv6 prefix for downstream interfaces" ++msgstr "" ++ ++msgid "Router Advertisement-Service" ++msgstr "" ++ ++msgid "Router Password" ++msgstr "ルーター・パスワード" ++ ++msgid "Routes" ++msgstr "経路情報" ++ ++msgid "" ++"Routes specify over which interface and gateway a certain host or network " ++"can be reached." ++msgstr "" ++"特定ã®ãƒ›ã‚¹ãƒˆåˆã¯ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ã«ã€ã©ã®ã‚¤ãƒ³ã‚¿ãƒ¼ãƒ•ã‚§ãƒ¼ã‚¹åŠã³ã‚²ãƒ¼ãƒˆã‚¦ã‚§ã‚¤ã‚’通ã—ã¦" ++"通信を行ã†ã‹ã€çµŒè·¯æƒ…報を設定ã—ã¾ã™ã€‚" ++ ++msgid "Rule #" ++msgstr "ルール #" ++ ++msgid "Run a filesystem check before mounting the device" ++msgstr "デãƒã‚¤ã‚¹ã®ãƒžã‚¦ãƒ³ãƒˆã‚’è¡Œã†å‰ã«ãƒ•ã‚¡ã‚¤ãƒ«ã‚·ã‚¹ãƒ†ãƒ ãƒã‚§ãƒƒã‚¯ã‚’è¡Œã†" ++ ++msgid "Run filesystem check" ++msgstr "ファイルシステムãƒã‚§ãƒƒã‚¯ã‚’è¡Œã†" ++ ++msgid "" ++"SIXXS supports TIC only, for static tunnels using IP protocol 41 (RFC4213) " ++"use 6in4 instead" ++msgstr "" ++ ++msgid "SIXXS-handle[/Tunnel-ID]" ++msgstr "" ++ ++msgid "SSH Access" ++msgstr "SSHアクセス" ++ ++msgid "SSH-Keys" ++msgstr "SSHキー" ++ ++msgid "SSID" ++msgstr "SSID" ++ ++msgid "Save" ++msgstr "ä¿å­˜" ++ ++msgid "Save & Apply" ++msgstr "ä¿å­˜ & é©ç”¨" ++ ++msgid "Save & Apply" ++msgstr "ä¿å­˜ & é©ç”¨" ++ ++msgid "Scan" ++msgstr "スキャン" ++ ++msgid "Scheduled Tasks" ++msgstr "スケジュールタスク" ++ ++msgid "Section added" ++msgstr "追加ã•ã‚Œã‚‹ã‚»ã‚¯ã‚·ãƒ§ãƒ³" ++ ++msgid "Section removed" ++msgstr "削除ã•ã‚Œã‚‹ã‚»ã‚¯ã‚·ãƒ§ãƒ³" ++ ++msgid "See \"mount\" manpage for details" ++msgstr "詳細情報㯠\"mount\" ã®manページをå‚ç…§ã—ã¦ãã ã•ã„" ++ ++msgid "" ++"Send LCP echo requests at the given interval in seconds, only effective in " ++"conjunction with failure threshold" ++msgstr "" ++"設定ã•ã‚ŒãŸç§’é–“éš”ã§LCP echoリクエストをé€ä¿¡ã—ã¾ã™ã€‚失敗数ã—ãã„値を設定ã—ãŸå ´" ++"åˆã®ã¿ã€æ©Ÿèƒ½ãŒæœ‰åŠ¹ã«ãªã‚Šã¾ã™ã€‚" ++ ++msgid "Separate Clients" ++msgstr "クライアントã®åˆ†é›¢" ++ ++msgid "Separate WDS" ++msgstr "WDSを分離ã™ã‚‹" ++ ++msgid "Server Settings" ++msgstr "サーãƒãƒ¼è¨­å®š" ++ ++msgid "Server password" ++msgstr "" ++ ++msgid "" ++"Server password, enter the specific password of the tunnel when the username " ++"contains the tunnel ID" ++msgstr "" ++ ++msgid "Server username" ++msgstr "" ++ ++msgid "Service Name" ++msgstr "サービスå" ++ ++msgid "Service Type" ++msgstr "サービスタイプ" ++ ++msgid "Services" ++msgstr "サービス" ++ ++#, fuzzy ++msgid "Set up Time Synchronization" ++msgstr "時刻設定" ++ ++msgid "Setup DHCP Server" ++msgstr "DHCPサーãƒãƒ¼ã‚’設定" ++ ++msgid "Show current backup file list" ++msgstr "ç¾åœ¨ã®ãƒãƒƒã‚¯ã‚¢ãƒƒãƒ—ファイルã®ãƒªã‚¹ãƒˆã‚’表示ã™ã‚‹" ++ ++msgid "Shutdown this interface" ++msgstr "インターフェースを終了" ++ ++msgid "Shutdown this network" ++msgstr "ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ã‚’終了" ++ ++msgid "Signal" ++msgstr "ä¿¡å·å¼·åº¦" ++ ++msgid "Signal:" ++msgstr "ä¿¡å·:" ++ ++msgid "Size" ++msgstr "サイズ" ++ ++msgid "Skip" ++msgstr "スキップ" ++ ++msgid "Skip to content" ++msgstr "コンテンツã¸ç§»å‹•" ++ ++msgid "Skip to navigation" ++msgstr "ナビゲーションã¸ç§»å‹•" ++ ++msgid "Slot time" ++msgstr "スロット時間" ++ ++msgid "Software" ++msgstr "ソフトウェア" ++ ++msgid "Some fields are invalid, cannot save values!" ++msgstr "無効ãªå€¤ãŒè¨­å®šã•ã‚Œã¦ã„るフィールドãŒã‚ã‚‹ãŸã‚ã€ä¿å­˜ã§ãã¾ã›ã‚“。" ++ ++msgid "Sorry, the object you requested was not found." ++msgstr "申ã—訳ã‚ã‚Šã¾ã›ã‚“。リクエストã•ã‚ŒãŸã‚ªãƒ–ジェクトã¯è¦‹ã¤ã‹ã‚Šã¾ã›ã‚“ã§ã—ãŸã€‚" ++ ++msgid "Sorry, the server encountered an unexpected error." ++msgstr "申ã—訳ã‚ã‚Šã¾ã›ã‚“。サーãƒãƒ¼ã«äºˆæœŸã›ã¬ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸã€‚" ++ ++#, fuzzy ++msgid "" ++"Sorry, there is no sysupgrade support present; a new firmware image must be " ++"flashed manually. Please refer to the OpenWrt wiki for device specific " ++"install instructions." ++msgstr "" ++"申ã—訳ã‚ã‚Šã¾ã›ã‚“。ç¾åœ¨ã“ã®ãƒœãƒ¼ãƒ‰ã§ã¯sysupgradeãŒã‚µãƒãƒ¼ãƒˆãŒã•ã‚Œã¦ã„ãªã„ãŸã‚ã€" ++"ファームウェア更新ã¯æ‰‹å‹•ã§è¡Œã£ã¦ã„ãŸã ãå¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚OpenWrt wikiã‚’å‚ç…§ã—" ++"ã¦ã€ã“ã®ãƒ‡ãƒã‚¤ã‚¹ã®ã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«æ‰‹é †ã‚’å‚ç…§ã—ã¦ãã ã•ã„。" ++ ++msgid "Sort" ++msgstr "ソート" ++ ++msgid "Source" ++msgstr "é€ä¿¡å…ƒ" ++ ++msgid "Source routing" ++msgstr "" ++ ++msgid "Specifies the button state to handle" ++msgstr "" ++ ++msgid "Specifies the directory the device is attached to" ++msgstr "デãƒã‚¤ã‚¹ãŒæŽ¥ç¶šã™ã‚‹ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã‚’設定ã—ã¾ã™" ++ ++msgid "Specifies the listening port of this Dropbear instance" ++msgstr "Dropbearã®å—ä¿¡ãƒãƒ¼ãƒˆã‚’設定ã—ã¦ãã ã•ã„" ++ ++msgid "" ++"Specifies the maximum amount of failed ARP requests until hosts are presumed " ++"to be dead" ++msgstr "" ++ ++msgid "" ++"Specifies the maximum amount of seconds after which hosts are presumed to be " ++"dead" ++msgstr "" ++ ++msgid "Specify the secret encryption key here." ++msgstr "æš—å·éµã‚’設定ã—ã¾ã™ã€‚" ++ ++msgid "Start" ++msgstr "開始" ++ ++msgid "Start priority" ++msgstr "優先順ä½" ++ ++msgid "Startup" ++msgstr "Startup" ++ ++msgid "Static IPv4 Routes" ++msgstr "IPv4 é™çš„ルーティング" ++ ++msgid "Static IPv6 Routes" ++msgstr "IPv6 é™çš„ルーティング" ++ ++msgid "Static Leases" ++msgstr "é™çš„リース" ++ ++msgid "Static Routes" ++msgstr "é™çš„ルーティング" ++ ++msgid "Static WDS" ++msgstr "é™çš„WDS" ++ ++msgid "Static address" ++msgstr "é™çš„アドレス" ++ ++msgid "" ++"Static leases are used to assign fixed IP addresses and symbolic hostnames " ++"to DHCP clients. They are also required for non-dynamic interface " ++"configurations where only hosts with a corresponding lease are served." ++msgstr "" ++"é™çš„リース機能ã¯ã€DHCPクライアントã«å¯¾ã—ã¦å›ºå®šã®IPアドレスåŠã³ä¸€æ™‚çš„ãªãƒ›ã‚¹ãƒˆ" ++"åをアサインã—ã¾ã™ã€‚ã¾ãŸã€ã‚¯ãƒ©ã‚¤ã‚¢ãƒ³ãƒˆã¯å¯¾å¿œã™ã‚‹ãƒªãƒ¼ã‚¹ã‚’使用ã™ã‚‹ãƒ›ã‚¹ãƒˆãŒãã®1" ++"å°ã®ã¿ã§ã€ã‹ã¤é™çš„ãªã‚¤ãƒ³ã‚¿ãƒ¼ãƒ•ã‚§ãƒ¼ã‚¹è¨­å®šã«ã™ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚" ++ ++msgid "Status" ++msgstr "ステータス" ++ ++msgid "Stop" ++msgstr "åœæ­¢" ++ ++msgid "Strict order" ++msgstr "å•ã„åˆã‚ã›ã®åˆ¶é™" ++ ++msgid "Submit" ++msgstr "é€ä¿¡" ++ ++msgid "Swap" ++msgstr "" ++ ++msgid "Swap Entry" ++msgstr "スワップ機能" ++ ++msgid "Switch" ++msgstr "スイッãƒ" ++ ++msgid "Switch %q" ++msgstr "スイッム%q" ++ ++msgid "Switch %q (%s)" ++msgstr "スイッム%q (%s)" ++ ++msgid "Switch protocol" ++msgstr "プロトコルã®åˆ‡ã‚Šæ›¿ãˆ" ++ ++msgid "Sync with browser" ++msgstr "ブラウザã®æ™‚刻ã¨åŒæœŸ" ++ ++msgid "Synchronizing..." ++msgstr "åŒæœŸä¸­..." ++ ++msgid "System" ++msgstr "システム" ++ ++msgid "System Log" ++msgstr "システムログ" ++ ++msgid "System Properties" ++msgstr "システム・プロパティ" ++ ++msgid "System log buffer size" ++msgstr "システムログ・ãƒãƒƒãƒ•ã‚¡ã‚µã‚¤ã‚º" ++ ++msgid "TCP:" ++msgstr "TCP:" ++ ++msgid "TFTP Settings" ++msgstr "TFTP設定" ++ ++msgid "TFTP server root" ++msgstr "TFTPサーãƒãƒ¼ãƒ»ãƒ«ãƒ¼ãƒˆ" ++ ++msgid "TX" ++msgstr "TX" ++ ++msgid "TX Rate" ++msgstr "é€ä¿¡ãƒ¬ãƒ¼ãƒˆ" ++ ++msgid "Table" ++msgstr "テーブル" ++ ++msgid "Target" ++msgstr "ターゲット" ++ ++msgid "Terminate" ++msgstr "åœæ­¢" ++ ++#, fuzzy ++msgid "" ++"The Device Configuration section covers physical settings of the " ++"radio hardware such as channel, transmit power or antenna selection which " ++"are shared among all defined wireless networks (if the radio hardware is " ++"multi-SSID capable). Per network settings like encryption or operation mode " ++"are grouped in the Interface Configuration." ++msgstr "" ++"デãƒã‚¤ã‚¹è¨­å®šã‚»ã‚¯ã‚·ãƒ§ãƒ³ã§ã¯ã€ãƒãƒ£ãƒãƒ«ã€é€ä¿¡å‡ºåŠ›ã€ã‚¢ãƒ³ãƒ†ãƒŠè¨­å®šãªã©ã®ç„¡" ++"ç·šãƒãƒ¼ãƒ‰ã‚¦ã‚§ã‚¢ã®è¨­å®šã‚’è¡Œã„ã¾ã™ã€‚ã¾ãŸã€ç„¡ç·šãƒãƒ¼ãƒ‰ã‚¦ã‚§ã‚¢ãŒãƒžãƒ«ãƒSSID機能をサ" ++"ãƒãƒ¼ãƒˆã—ã¦ã„ã‚‹å ´åˆã€ã“れらã®è¨­å®šã¯å…¨ã¦å…±é€šã®è¨­å®šã¨ã—ã¦æ‰±ã‚ã‚Œã¾ã™ã€‚æš—å·åŒ–設定" ++"や無線モードãªã©ã®ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯æ¯Žã®è¨­å®šã¯ã€ã‚¤ãƒ³ã‚¿ãƒ¼ãƒ•ã‚§ãƒ¼ã‚¹è¨­å®šã§è¨­å®š" ++"ã‚’è¡Œã„ã¾ã™ã€‚" ++ ++msgid "" ++"The libiwinfo-lua package is not installed. You must install this " ++"component for working wireless configuration!" ++msgstr "" ++"libiwinfo-lua パッケージãŒã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«ã•ã‚Œã¦ã„ã¾ã›ã‚“。無線設定機能を" ++"æ­£ã—ã動作ã•ã›ã‚‹ãŸã‚ã«ã€ã“ã®ãƒ‘ッケージをインストールã™ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚" ++ ++msgid "" ++"The HE.net endpoint update configuration changed, you must now use the plain " ++"username instead of the user ID!" ++msgstr "" ++ ++msgid "" ++"The IPv6 prefix assigned to the provider, usually ends with ::" ++msgstr "" ++ ++msgid "" ++"The allowed characters are: A-Z, a-z, 0-9 and _" ++msgstr "" ++"使用å¯èƒ½ãªæ–‡å­—ã¯å³è¨˜ã®é€šã‚Šã§ã™: A-Z, a-z, " ++"0-9, _" ++ ++msgid "The configuration file could not be loaded due to the following error:" ++msgstr "" ++ ++msgid "" ++"The device file of the memory or partition (e.g." ++" /dev/sda1)" ++msgstr "" ++"デãƒã‚¤ã‚¹ãƒ•ã‚¡ã‚¤ãƒ«ã¾ãŸã¯ãƒ‘ーティション(例 " ++"/dev/sda1)" ++ ++msgid "" ++"The filesystem that was used to format the memory (e.g. ext3)" ++msgstr "" ++"記憶領域をフォーマットã—ã¦ã„るファイルシステムを指定ã—ã¾ã™ã€‚(例 ext3)" ++ ++msgid "" ++"The flash image was uploaded. Below is the checksum and file size listed, " ++"compare them with the original file to ensure data integrity.
    Click " ++"\"Proceed\" below to start the flash procedure." ++msgstr "" ++"更新用イメージãŒã‚¢ãƒƒãƒ—ロードã•ã‚Œã¾ã—ãŸã€‚以下ã¯ãã®ãƒã‚§ãƒƒã‚¯ã‚µãƒ åŠã³ãƒ•ã‚¡ã‚¤ãƒ«ã‚µ" ++"イズã§ã™ã€‚オリジナルファイルã¨æ¯”較ã—ã€æ•´åˆæ€§ã‚’確èªã—ã¦ãã ã•ã„。
    \"続行" ++"\"ボタンをクリックã™ã‚‹ã¨ã€æ›´æ–°å‡¦ç†ã‚’開始ã—ã¾ã™ã€‚" ++ ++msgid "The following changes have been committed" ++msgstr "以下ã®å¤‰æ›´ãŒé©ç”¨ã•ã‚Œã¾ã—ãŸ" ++ ++msgid "The following changes have been reverted" ++msgstr "以下ã®å¤‰æ›´ãŒå–り消ã•ã‚Œã¾ã—ãŸ" ++ ++msgid "The following rules are currently active on this system." ++msgstr "ã“ã®ã‚·ã‚¹ãƒ†ãƒ ã§ã¯ã€ç¾åœ¨ä»¥ä¸‹ã®ãƒ«ãƒ¼ãƒ«ãŒæœ‰åŠ¹ã«ãªã£ã¦ã„ã¾ã™ã€‚" ++ ++msgid "The given network name is not unique" ++msgstr "設定ã•ã‚ŒãŸãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯åã¯ãƒ¦ãƒ‹ãƒ¼ã‚¯ãªã‚‚ã®ã§ã¯ã‚ã‚Šã¾ã›ã‚“" ++ ++#, fuzzy ++msgid "" ++"The hardware is not multi-SSID capable and the existing configuration will " ++"be replaced if you proceed." ++msgstr "" ++"ã“ã®ãƒãƒ¼ãƒ‰ã‚¦ã‚§ã‚¢ã§ã¯ãƒžãƒ«ãƒESSIDを設定ã™ã‚‹ã“ã¨ãŒã§ããªã„ãŸã‚ã€ç¶šè¡Œã—ãŸå ´åˆã€è¨­" ++"定ã¯æ—¢å­˜ã®è¨­å®šã¨ç½®ãæ›ãˆã‚‰ã‚Œã¾ã™ã€‚" ++ ++msgid "" ++"The length of the IPv4 prefix in bits, the remainder is used in the IPv6 " ++"addresses." ++msgstr "" ++ ++msgid "The length of the IPv6 prefix in bits" ++msgstr "" ++ ++msgid "" ++"The network ports on this device can be combined to several VLANs in which computers can " ++"communicate directly with each other. VLANs are often used to separate different network " ++"segments. Often there is by default one Uplink port for a connection to the " ++"next greater network like the internet and other ports for a local network." ++msgstr "" ++ ++msgid "The selected protocol needs a device assigned" ++msgstr "é¸æŠžä¸­ã®ãƒ—ロトコルを使用ã™ã‚‹å ´åˆã€ãƒ‡ãƒã‚¤ã‚¹ã‚’設定ã™ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™" ++ ++msgid "" ++"The system is erasing the configuration partition now and will reboot itself " ++"when finished." ++msgstr "システムã¯è¨­å®šé ˜åŸŸã‚’消去中ã§ã™ã€‚完了後ã€è‡ªå‹•çš„ã«å†èµ·å‹•ã—ã¾ã™ã€‚" ++ ++#, fuzzy ++msgid "" ++"The system is flashing now.
    DO NOT POWER OFF THE DEVICE!
    Wait a " ++"few minutes before you try to reconnect. It might be necessary to renew the " ++"address of your computer to reach the device again, depending on your " ++"settings." ++msgstr "" ++"システム更新中ã§ã™ã€‚
    絶対ã«é›»æºã‚’切らãªã„ã§ãã ã•ã„ï¼
    ルーターã®å†" ++"接続ã¾ã§æ•°åˆ†ãŠå¾…ã¡ä¸‹ã•ã„。システムãŒæ›´æ–°ã•ã‚Œã‚‹ã“ã¨ã«ã‚ˆã‚Šã€ãƒ«ãƒ¼ã‚¿ãƒ¼ã®è¨­å®šãŒå¤‰" ++"ã‚ã‚‹å¯èƒ½æ€§ãŒã‚ã‚‹ãŸã‚ã€å†æŽ¥ç¶šæ™‚ã«ã‚ãªãŸã®ã‚³ãƒ³ãƒ”ュータã®IPアドレスを変更ã—ãªã‘" ++"ã‚Œã°ãªã‚‰ãªã„å ´åˆãŒã‚ã‚Šã¾ã™ã€‚" ++ ++msgid "" ++"The tunnel end-point is behind NAT, defaults to disabled and only applies to " ++"AYIYA" ++msgstr "" ++ ++msgid "" ++"The uploaded image file does not contain a supported format. Make sure that " ++"you choose the generic image format for your platform." ++msgstr "" ++"アップロードã•ã‚ŒãŸã‚¤ãƒ¡ãƒ¼ã‚¸ãƒ•ã‚¡ã‚¤ãƒ«ã¯ã€ã“ã®ãƒœãƒ¼ãƒ‰ã§ã‚µãƒãƒ¼ãƒˆã•ã‚Œã¦ã„るフォー" ++"マットã§ã¯ã‚ã‚Šã¾ã›ã‚“。ã“ã®ãƒ—ラットフォームã«é©åˆã—ãŸã‚¤ãƒ¡ãƒ¼ã‚¸ãƒ•ã‚¡ã‚¤ãƒ«ã‹ã©ã†" ++"ã‹ã€ç¢ºèªã—ã¦ãã ã•ã„。" ++ ++msgid "There are no active leases." ++msgstr "リース中ã®IPアドレスã¯ã‚ã‚Šã¾ã›ã‚“。" ++ ++msgid "There are no pending changes to apply!" ++msgstr "é©ç”¨ãŒæœªå®Œäº†ã®å¤‰æ›´ã¯ã‚ã‚Šã¾ã›ã‚“ï¼" ++ ++msgid "There are no pending changes to revert!" ++msgstr "復元ãŒæœªå®Œäº†ã®å¤‰æ›´ã¯ã‚ã‚Šã¾ã›ã‚“ï¼" ++ ++msgid "There are no pending changes!" ++msgstr "未完了ã®å¤‰æ›´ã¯ã‚ã‚Šã¾ã›ã‚“ï¼" ++ ++msgid "" ++"There is no device assigned yet, please attach a network device in the " ++"\"Physical Settings\" tab" ++msgstr "" ++"デãƒã‚¤ã‚¹ãŒè¨­å®šã•ã‚Œã¦ã„ã¾ã›ã‚“。\"デãƒã‚¤ã‚¹è¨­å®š\"タブã§ã€ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ãƒ‡ãƒã‚¤ã‚¹ã‚’" ++"é¸æŠžã—ã¦ãã ã•ã„。" ++ ++msgid "" ++"There is no password set on this router. Please configure a root password to " ++"protect the web interface and enable SSH." ++msgstr "" ++"ルーターã«ãƒ‘スワードãŒè¨­å®šã•ã‚Œã¦ã„ã¾ã›ã‚“。Webインターフェースã®ä¿è­·åŠã³SSH" ++"サービスを有効ã«ã™ã‚‹ãŸã‚ã«ã€ç®¡ç†è€…パスワードを設定ã—ã¦ãã ã•ã„。" ++ ++msgid "This IPv4 address of the relay" ++msgstr "" ++ ++msgid "" ++"This is a list of shell glob patterns for matching files and directories to " ++"include during sysupgrade. Modified files in /etc/config/ and certain other " ++"configurations are automatically preserved." ++msgstr "" ++"以下ã¯ã€sysupgrade中ã«ãƒãƒƒã‚¯ã‚¢ãƒƒãƒ—対象ã«å«ã‚るファイルã¨ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã®ãƒ‘ター" ++"ンリストã§ã™ã€‚/etc/config/内ã®è¨­å®šãƒ•ã‚¡ã‚¤ãƒ«åŠã³ãã®ä»–特定ã®è¨­å®šãƒ•ã‚¡ã‚¤ãƒ«ã¯è‡ªå‹•" ++"çš„ã«ä¿æŒã•ã‚Œã¾ã™ã€‚" ++ ++msgid "" ++"This is either the \"Update Key\" configured for the tunnel or the account " ++"password if no update key has been configured" ++msgstr "" ++ ++msgid "" ++"This is the content of /etc/rc.local. Insert your own commands here (in " ++"front of 'exit 0') to execute them at the end of the boot process." ++msgstr "" ++"/etc/rc.localを表示ã—ã¦ã„ã¾ã™ã€‚ã‚ãªãŸã®å®Ÿè¡Œã—ãŸã„コマンドを'exit 0'行より上ã«" ++"入力ã—ã¦ãã ã•ã„。ã“れらã®ã‚³ãƒžãƒ³ãƒ‰ã¯ãƒ–ートプロセスã®æœ€å¾Œã«å®Ÿè¡Œã•ã‚Œã¾ã™ã€‚" ++ ++msgid "" ++"This is the local endpoint address assigned by the tunnel broker, it usually " ++"ends with :2" ++msgstr "" ++"プロãƒã‚¤ãƒ€ã‹ã‚‰ã‚¢ã‚µã‚¤ãƒ³ã•ã‚ŒãŸã€ãƒ­ãƒ¼ã‚«ãƒ«ã®ã‚¨ãƒ³ãƒ‰ãƒã‚¤ãƒ³ãƒˆãƒ»ã‚¢ãƒ‰ãƒ¬ã‚¹ã§ã™ã€‚通常ã€" ++":2ãŒçµ‚端ã«è¨­å®šã•ã‚Œã¾ã™ã€‚" ++ ++msgid "" ++"This is the only DHCP in the local network" ++msgstr "" ++"ローカルãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯å†…ã®ã¿ã® DHCPã¨ã—ã¦ä½¿ç”¨ã™ã‚‹" ++ ++msgid "This is the plain username for logging into the account" ++msgstr "" ++ ++msgid "" ++"This is the prefix routed to you by the tunnel broker for use by clients" ++msgstr "" ++ ++msgid "This is the system crontab in which scheduled tasks can be defined." ++msgstr "" ++"スケジュールタスクシステムを使用ã™ã‚‹ã“ã¨ã§ã€å®šæœŸçš„ã«ç‰¹å®šã®ã‚¿ã‚¹ã‚¯ã®å®Ÿè¡Œã‚’è¡Œã†" ++"ã“ã¨ãŒå¯èƒ½ã§ã™ã€‚" ++ ++msgid "" ++"This is usually the address of the nearest PoP operated by the tunnel broker" ++msgstr "" ++ ++msgid "" ++"This list gives an overview over currently running system processes and " ++"their status." ++msgstr "" ++"ã“ã®ãƒªã‚¹ãƒˆã¯ç¾åœ¨ã‚·ã‚¹ãƒ†ãƒ ã§å‹•ä½œã—ã¦ã„るプロセスã¨ãã®ã‚¹ãƒ†ãƒ¼ã‚¿ã‚¹ã‚’表示ã—ã¦ã„ã¾" ++"ã™ã€‚" ++ ++msgid "This page allows the configuration of custom button actions" ++msgstr "ã“ã®ãƒšãƒ¼ã‚¸ã§ã¯ã€ãƒœã‚¿ãƒ³ã®å‹•ä½œã‚’変更ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚" ++ ++msgid "This page gives an overview over currently active network connections." ++msgstr "ã“ã®ãƒšãƒ¼ã‚¸ã§ã¯ã€ç¾åœ¨ã‚¢ã‚¯ãƒ†ã‚£ãƒ–ãªãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯æŽ¥ç¶šã‚’表示ã—ã¾ã™ã€‚" ++ ++msgid "This section contains no values yet" ++msgstr "ã“ã®ã‚»ã‚¯ã‚·ãƒ§ãƒ³ã¯æœªè¨­å®šã§ã™ã€‚" ++ ++msgid "Time Synchronization" ++msgstr "時刻設定" ++ ++msgid "Time Synchronization is not configured yet." ++msgstr "時刻åŒæœŸæ©Ÿèƒ½ã¯ã¾ã è¨­å®šã•ã‚Œã¦ã„ã¾ã›ã‚“。" ++ ++msgid "Timezone" ++msgstr "タイムゾーン" ++ ++msgid "" ++"To restore configuration files, you can upload a previously generated backup " ++"archive here." ++msgstr "" ++"設定を復元ã™ã‚‹ã«ã¯ã€ä½œæˆã—ã¦ãŠã„ãŸãƒãƒƒã‚¯ã‚¢ãƒƒãƒ—アーカイブをアップロードã—ã¦ã" ++"ã ã•ã„。" ++ ++msgid "Total Available" ++msgstr "åˆè¨ˆ" ++ ++msgid "Traceroute" ++msgstr "Traceroute" ++ ++msgid "Traffic" ++msgstr "トラフィック" ++ ++msgid "Transfer" ++msgstr "転é€" ++ ++msgid "Transmission Rate" ++msgstr "転é€ãƒ¬ãƒ¼ãƒˆ" ++ ++msgid "Transmit" ++msgstr "é€ä¿¡" ++ ++msgid "Transmit Power" ++msgstr "電波出力" ++ ++msgid "Transmitter Antenna" ++msgstr "é€ä¿¡ã‚¢ãƒ³ãƒ†ãƒŠ" ++ ++msgid "Trigger" ++msgstr "トリガー" ++ ++msgid "Trigger Mode" ++msgstr "トリガーモード" ++ ++msgid "Tunnel ID" ++msgstr "トンãƒãƒ« ID" ++ ++msgid "Tunnel Interface" ++msgstr "トンãƒãƒ«ã‚¤ãƒ³ã‚¿ãƒ¼ãƒ•ã‚§ãƒ¼ã‚¹" ++ ++msgid "Tunnel Link" ++msgstr "" ++ ++msgid "Tunnel broker protocol" ++msgstr "" ++ ++msgid "Tunnel setup server" ++msgstr "" ++ ++msgid "Tunnel type" ++msgstr "" ++ ++msgid "Turbo Mode" ++msgstr "ターボモード" ++ ++msgid "Tx-Power" ++msgstr "é€ä¿¡é›»åŠ›" ++ ++msgid "Type" ++msgstr "タイプ" ++ ++msgid "UDP:" ++msgstr "UDP:" ++ ++msgid "UMTS only" ++msgstr "UMTSã®ã¿" ++ ++msgid "UMTS/GPRS/EV-DO" ++msgstr "UMTS/GPRS/EV-DO" ++ ++msgid "USB Device" ++msgstr "USBデãƒã‚¤ã‚¹" ++ ++msgid "UUID" ++msgstr "UUID" ++ ++msgid "Unable to dispatch" ++msgstr "" ++ ++msgid "Unknown" ++msgstr "ä¸æ˜Ž" ++ ++msgid "Unknown Error, password not changed!" ++msgstr "ä¸æ˜Žãªã‚¨ãƒ©ãƒ¼ã§ã™ã€‚パスワードã¯å¤‰æ›´ã•ã‚Œã¦ã„ã¾ã›ã‚“ï¼" ++ ++msgid "Unmanaged" ++msgstr "Unmanaged" ++ ++msgid "Unsaved Changes" ++msgstr "ä¿å­˜ã•ã‚Œã¦ã„ãªã„変更" ++ ++msgid "Unsupported protocol type." ++msgstr "サãƒãƒ¼ãƒˆã•ã‚Œã¦ã„ãªã„プロトコルタイプ" ++ ++msgid "Update lists" ++msgstr "リストã®æ›´æ–°" ++ ++msgid "" ++"Upload a sysupgrade-compatible image here to replace the running firmware. " ++"Check \"Keep settings\" to retain the current configuration (requires an " ++"OpenWrt compatible firmware image)." ++msgstr "" ++"システムをアップデートã™ã‚‹å ´åˆã€sysupgrade機能ã«äº’æ›æ€§ã®ã‚るファームウェアイ" ++"メージをアップロードã—ã¦ãã ã•ã„。\"設定ã®ä¿æŒ\"を有効ã«ã™ã‚‹ã¨ã€ç¾åœ¨ã®è¨­å®šã‚’" ++"維æŒã—ã¦ã‚¢ãƒƒãƒ—デートを行ã„ã¾ã™ã€‚ãŸã ã—ã€OpenWrt互æ›ã®ãƒ•ã‚¡ãƒ¼ãƒ ã‚¦ã‚§ã‚¢ã‚¤ãƒ¡ãƒ¼ã‚¸ãŒ" ++"アップロードã•ã‚ŒãŸå ´åˆã®ã¿ã€è¨­å®šã¯ä¿æŒã•ã‚Œã¾ã™ã€‚" ++ ++msgid "Upload archive..." ++msgstr "アーカイブをアップロード" ++ ++msgid "Uploaded File" ++msgstr "アップロード完了" ++ ++msgid "Uptime" ++msgstr "起動時間" ++ ++msgid "Use /etc/ethers" ++msgstr "/etc/ethers を使用ã™ã‚‹" ++ ++msgid "Use DHCP gateway" ++msgstr "DHCPゲートウェイを使用ã™ã‚‹" ++ ++msgid "Use DNS servers advertised by peer" ++msgstr "ピアã‹ã‚‰é€šçŸ¥ã•ã‚ŒãŸDNSサーãƒãƒ¼ã‚’使用ã™ã‚‹" ++ ++msgid "Use ISO/IEC 3166 alpha2 country codes." ++msgstr "ISO/IEC 3166 alpha2ã®å›½ã‚³ãƒ¼ãƒ‰ã‚’使用ã—ã¾ã™ã€‚" ++ ++msgid "Use MTU on tunnel interface" ++msgstr "トンãƒãƒ«ã‚¤ãƒ³ã‚¿ãƒ¼ãƒ•ã‚§ãƒ¼ã‚¹ã®MTUを設定" ++ ++msgid "Use TTL on tunnel interface" ++msgstr "トンãƒãƒ«ã‚¤ãƒ³ã‚¿ãƒ¼ãƒ•ã‚§ãƒ¼ã‚¹ã®TTLを設定" ++ ++msgid "Use as external overlay (/overlay)" ++msgstr "" ++ ++msgid "Use as root filesystem (/)" ++msgstr "" ++ ++msgid "Use broadcast flag" ++msgstr "ブロードキャスト・フラグを使用ã™ã‚‹" ++ ++msgid "Use builtin IPv6-management" ++msgstr "" ++ ++msgid "Use custom DNS servers" ++msgstr "DNSサーãƒãƒ¼ã‚’手動ã§è¨­å®š" ++ ++msgid "Use default gateway" ++msgstr "デフォルトゲートウェイを使用ã™ã‚‹" ++ ++msgid "Use gateway metric" ++msgstr "ゲートウェイ・メトリックを使用ã™ã‚‹" ++ ++msgid "Use routing table" ++msgstr "" ++ ++msgid "" ++"Use the Add Button to add a new lease entry. The MAC-Address indentifies the host, the IPv4-Address specifies to the fixed " ++"address to use and the Hostname is assigned as symbolic name to the " ++"requesting host." ++msgstr "" ++"追加 ボタンを押ã—ã¦ã€æ–°ã—ãエントリーを作æˆã—ã¦ãã ã•ã„。MAC-ã‚¢" ++"ドレス ã¯ãã®ãƒ›ã‚¹ãƒˆã‚’識別ã—, IPv4-アドレス ã«ã¯æ‰•ã„ã ã™å›ºå®šã®ã‚¢" ++"ドレスを設定ã—ã¾ã™ã€‚ã¾ãŸã€ãƒ›ã‚¹ãƒˆå ã¯ãã®ãƒ›ã‚¹ãƒˆã«å¯¾ã—ã¦ä¸€æ™‚çš„ãªãƒ›ã‚¹" ++"トåをアサインã—ã¾ã™ã€‚" ++ ++msgid "Used" ++msgstr "使用" ++ ++msgid "Used Key Slot" ++msgstr "使用ã™ã‚‹ã‚­ãƒ¼ã‚¹ãƒ­ãƒƒãƒˆ" ++ ++msgid "User certificate (PEM encoded)" ++msgstr "" ++ ++msgid "User key (PEM encoded)" ++msgstr "" ++ ++msgid "Username" ++msgstr "ユーザーå" ++ ++msgid "VC-Mux" ++msgstr "VC-Mux" ++ ++msgid "VLAN Interface" ++msgstr "VLANインターフェース" ++ ++msgid "VLANs on %q" ++msgstr "%q上ã®VLANs" ++ ++msgid "VLANs on %q (%s)" ++msgstr "%q上ã®VLAN (%s)" ++ ++msgid "VPN Server" ++msgstr "VPN サーãƒãƒ¼" ++ ++msgid "VPN Server port" ++msgstr "" ++ ++msgid "VPN Server's certificate SHA1 hash" ++msgstr "" ++ ++msgid "Vendor Class to send when requesting DHCP" ++msgstr "DHCPリクエストé€ä¿¡æ™‚ã®ãƒ™ãƒ³ãƒ€ãƒ¼ã‚¯ãƒ©ã‚¹ã‚’設定" ++ ++msgid "Verbose" ++msgstr "" ++ ++msgid "Verbose logging by aiccu daemon" ++msgstr "" ++ ++msgid "Verify" ++msgstr "確èª" ++ ++msgid "Version" ++msgstr "ãƒãƒ¼ã‚¸ãƒ§ãƒ³" ++ ++msgid "WDS" ++msgstr "WDS" ++ ++msgid "WEP Open System" ++msgstr "WEP オープンシステム" ++ ++msgid "WEP Shared Key" ++msgstr "WEP 共有キー" ++ ++msgid "WEP passphrase" ++msgstr "WEP æš—å·ãƒ•ãƒ¬ãƒ¼ã‚º" ++ ++msgid "WMM Mode" ++msgstr "WMM モード" ++ ++msgid "WPA passphrase" ++msgstr "WPA æš—å·ãƒ•ãƒ¬ãƒ¼ã‚º" ++ ++msgid "" ++"WPA-Encryption requires wpa_supplicant (for client mode) or hostapd (for AP " ++"and ad-hoc mode) to be installed." ++msgstr "" ++"WPAæš—å·åŒ–を使用ã™ã‚‹å ´åˆã€wpa_supplicant (クライアントモードã®å ´åˆ)åˆã¯ " ++"hostapd (アクセスãƒã‚¤ãƒ³ãƒˆåŠã³ã‚¢ãƒ‰ãƒ›ãƒƒã‚¯) ãŒã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«ã•ã‚Œã¦ã„ã‚‹å¿…è¦ãŒã‚ã‚Šã¾" ++"ã™ã€‚" ++ ++msgid "" ++"Wait for NTP sync that many seconds, seting to 0 disables waiting (optional)" ++msgstr "" ++ ++msgid "Waiting for changes to be applied..." ++msgstr "変更をé©ç”¨ä¸­ã§ã™..." ++ ++msgid "Waiting for command to complete..." ++msgstr "コマンド実行中ã§ã™..." ++ ++msgid "Warning" ++msgstr "警告" ++ ++msgid "Warning: There are unsaved changes that will be lost while rebooting!" ++msgstr "警告: ä¿å­˜ã•ã‚Œã¦ã„ãªã„変更ã¯å†èµ·å‹•å¾Œã«å¤±ã‚ã‚Œã¾ã™!" ++ ++msgid "Whether to create an IPv6 default route over the tunnel" ++msgstr "" ++ ++msgid "Whether to route only packets from delegated prefixes" ++msgstr "" ++ ++msgid "Width" ++msgstr "" ++ ++msgid "Wifi" ++msgstr "ç„¡ç·šLAN" ++ ++msgid "Wireless" ++msgstr "ç„¡ç·š" ++ ++msgid "Wireless Adapter" ++msgstr "無線アダプタ" ++ ++msgid "Wireless Network" ++msgstr "ç„¡ç·šãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯" ++ ++msgid "Wireless Overview" ++msgstr "ç„¡ç·šLANデãƒã‚¤ã‚¹ä¸€è¦§" ++ ++msgid "Wireless Security" ++msgstr "ç„¡ç·šLANセキュリティ" ++ ++msgid "Wireless is disabled or not associated" ++msgstr "ç„¡ç·šLAN機能ãŒç„¡åŠ¹ã«ãªã£ã¦ã„ã‚‹ã‹ã€ã‚¢ã‚½ã‚·ã‚¨ãƒ¼ã‚·ãƒ§ãƒ³ã•ã‚Œã¦ã„ã¾ã›ã‚“" ++ ++msgid "Wireless is restarting..." ++msgstr "ç„¡ç·šLAN機能å†èµ·å‹•ä¸­..." ++ ++msgid "Wireless network is disabled" ++msgstr "ç„¡ç·šLAN機能ã¯ç„¡åŠ¹ã«ãªã£ã¦ã„ã¾ã™" ++ ++msgid "Wireless network is enabled" ++msgstr "ç„¡ç·šLAN機能ã¯æœ‰åŠ¹ã«ãªã£ã¦ã„ã¾ã™" ++ ++msgid "Wireless restarted" ++msgstr "ç„¡ç·šLAN機能ã®å†èµ·å‹•" ++ ++msgid "Wireless shut down" ++msgstr "ç„¡ç·šLAN機能åœæ­¢" ++ ++msgid "Write received DNS requests to syslog" ++msgstr "å—ä¿¡ã—ãŸDNSリクエストをsyslogã¸è¨˜éŒ²ã—ã¾ã™" ++ ++msgid "XR Support" ++msgstr "XRサãƒãƒ¼ãƒˆ" ++ ++msgid "" ++"You can enable or disable installed init scripts here. Changes will applied " ++"after a device reboot.
    Warning: If you disable essential init " ++"scripts like \"network\", your device might become inaccessible!" ++msgstr "" ++"ルーターãŒèµ·å‹•ã™ã‚‹éš›ã®ã‚µãƒ¼ãƒ“スã®æœ‰åŠ¹åŒ–/無効化を行ã†ã“ã¨ãŒã§ãã¾ã™ã€‚ã¾ãŸã€å¤‰æ›´" ++"ã¯å†èµ·å‹•å¾Œã«é©ç”¨ã•ã‚Œã¾ã™ã€‚
    警告: \"network\"ã®ã‚ˆã†ãªé‡è¦ãªã‚µãƒ¼ãƒ“" ++"スを無効ã«ã™ã‚‹ã¨, ルーターã«ã‚¢ã‚¯ã‚»ã‚¹ã§ããªããªã‚Šã¾ã™ã®ã§ã€æ³¨æ„ã—ã¦ãã ã•ã„。" ++"" ++ ++msgid "" ++"You must enable Java Script in your browser or LuCI will not work properly." ++msgstr "Java Scriptを有効ã«ã—ãªã„å ´åˆã€LuCIã¯æ­£ã—ã動作ã—ã¾ã›ã‚“。" ++ ++msgid "" ++"Your Internet Explorer is too old to display this page correctly. Please " ++"upgrade it to at least version 7 or use another browser like Firefox, Opera " ++"or Safari." ++msgstr "" ++ ++msgid "any" ++msgstr "å…¨ã¦" ++ ++msgid "auto" ++msgstr "自動" ++ ++#, fuzzy ++msgid "automatic" ++msgstr "static" ++ ++msgid "baseT" ++msgstr "baseT" ++ ++msgid "bridged" ++msgstr "ブリッジ" ++ ++msgid "create:" ++msgstr "作æˆ:" ++ ++msgid "creates a bridge over specified interface(s)" ++msgstr "指定ã—ãŸã‚¤ãƒ³ã‚¿ãƒ¼ãƒ•ã‚§ãƒ¼ã‚¹ã§ãƒ–リッジを作æˆã—ã¾ã™" ++ ++msgid "dB" ++msgstr "dB" ++ ++msgid "dBm" ++msgstr "dBm" ++ ++msgid "disable" ++msgstr "無効" ++ ++msgid "disabled" ++msgstr "" ++ ++msgid "expired" ++msgstr "期é™åˆ‡ã‚Œ" ++ ++msgid "" ++"file where given DHCP-leases will be stored" ++msgstr "" ++"DHCPリース情報を記" ++"録ã™ã‚‹ãƒ•ã‚¡ã‚¤ãƒ«" ++ ++msgid "forward" ++msgstr "" ++ ++msgid "full-duplex" ++msgstr "全二é‡" ++ ++msgid "half-duplex" ++msgstr "åŠäºŒé‡" ++ ++msgid "help" ++msgstr "ヘルプ" ++ ++msgid "hidden" ++msgstr "" ++ ++msgid "hybrid mode" ++msgstr "" ++ ++msgid "if target is a network" ++msgstr "ターゲットãŒãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ã®å ´åˆ" ++ ++msgid "input" ++msgstr "" ++ ++msgid "kB" ++msgstr "kB" ++ ++msgid "kB/s" ++msgstr "kB/s" ++ ++msgid "kbit/s" ++msgstr "kbit/s" ++ ++msgid "local DNS file" ++msgstr "ローカル DNSファイル" ++ ++msgid "minimum 1280, maximum 1480" ++msgstr "" ++ ++msgid "navigation Navigation" ++msgstr "" ++ ++msgid "no" ++msgstr "ã„ã„ãˆ" ++ ++msgid "no link" ++msgstr "リンクãªã—" ++ ++msgid "none" ++msgstr "ãªã—" ++ ++msgid "not present" ++msgstr "" ++ ++msgid "off" ++msgstr "オフ" ++ ++msgid "on" ++msgstr "オン" ++ ++msgid "open" ++msgstr "" ++ ++msgid "overlay" ++msgstr "" ++ ++msgid "relay mode" ++msgstr "" ++ ++msgid "routed" ++msgstr "routed" ++ ++msgid "server mode" ++msgstr "" ++ ++msgid "skiplink1 Skip to navigation" ++msgstr "" ++ ++msgid "skiplink2 Skip to content" ++msgstr "" ++ ++msgid "stateful-only" ++msgstr "" ++ ++msgid "stateless" ++msgstr "" ++ ++msgid "stateless + stateful" ++msgstr "" ++ ++msgid "tagged" ++msgstr "tagged" ++ ++msgid "unknown" ++msgstr "" ++ ++msgid "unlimited" ++msgstr "無期é™" ++ ++msgid "unspecified" ++msgstr "設定ã—ãªã„" ++ ++msgid "unspecified -or- create:" ++msgstr "設定ã—ãªã„ -åˆã¯- 作æˆ:" ++ ++msgid "untagged" ++msgstr "untagged" ++ ++msgid "yes" ++msgstr "ã¯ã„" ++ ++msgid "« Back" ++msgstr "« 戻る" ++ ++#~ msgid "" ++#~ "Always use 40MHz channels even if the secondary channel overlaps. Using " ++#~ "this option does not comply with IEEE 802.11n-2009!" ++#~ msgstr "" ++#~ "第2ãƒãƒ£ãƒãƒ«ãŒé‡è¤‡ã—ã¦ã‚‚ã€å¸¸ã«40MHz帯域幅を使用ã—ã¾ã™ã€‚ãŸã ã—本オプションã¯" ++#~ "IEEE 802.11n-2009を満ãŸã—ã¦ã„ã¾ã›ã‚“!" ++ ++#~ msgid "Cached" ++#~ msgstr "キャッシュ" ++ ++#~ msgid "Configures this mount as overlay storage for block-extroot" ++#~ msgstr "ã“ã®ãƒžã‚¦ãƒ³ãƒˆè¨­å®šã‚’block-extrootã®ã‚ªãƒ¼ãƒãƒ¼ãƒ¬ã‚¤è¨˜æ†¶é ˜åŸŸã¨ã—ã¦è¨­å®šã™ã‚‹" ++ ++#~ msgid "Force 40MHz mode" ++#~ msgstr "強制的ã«40MHzモードã§å‹•ä½œã™ã‚‹" ++ ++#~ msgid "Frequency Hopping" ++#~ msgstr "周波数ホッピング" ++ ++#~ msgid "Locked to channel %d used by %s" ++#~ msgstr "%sãŒä½¿ç”¨ã—ã¦ã„ã‚‹ãŸã‚ãƒãƒ£ãƒãƒ«%dã¯ãƒ­ãƒƒã‚¯ã•ã‚Œã¦ã„ã¾ã™" ++ ++#~ msgid "Use as root filesystem" ++#~ msgstr "ルート・ファイルシステムã¨ã—ã¦ä½¿ç”¨ã™ã‚‹" ++ ++#~ msgid "HE.net user ID" ++#~ msgstr "HE.net ユーザーID" ++ ++#~ msgid "This is the 32 byte hex encoded user ID, not the login name" ++#~ msgstr "" ++#~ "ログインåã§ã¯ãªãã€32ãƒã‚¤ãƒˆã€16進数ã§ã‚¨ãƒ³ã‚³ãƒ¼ãƒ‰ã•ã‚ŒãŸãƒ¦ãƒ¼ã‚¶ãƒ¼IDを設定ã—ã¦" ++#~ "ãã ã•ã„" ++ ++#~ msgid "40MHz 2nd channel above" ++#~ msgstr "40MHz 上å´ç¬¬2ãƒãƒ£ãƒãƒ«" ++ ++#~ msgid "40MHz 2nd channel below" ++#~ msgstr "40MHz 下å´ç¬¬2ãƒãƒ£ãƒãƒ«" ++ ++#~ msgid "Accept router advertisements" ++#~ msgstr "ルーター広告ã®å—信を許å¯ã™ã‚‹" ++ ++#~ msgid "Advertise IPv6 on network" ++#~ msgstr "ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ä¸Šã®ã«IPv6 アドレスを広告ã™ã‚‹" ++ ++#~ msgid "Advertised network ID" ++#~ msgstr "ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯IDを広告ã™ã‚‹" ++ ++#~ msgid "Allowed range is 1 to 65535" ++#~ msgstr "設定å¯èƒ½ãªç¯„囲ã¯1ã‹ã‚‰65535ã§ã™" ++ ++#~ msgid "HT capabilities" ++#~ msgstr "HT機能" ++ ++#~ msgid "HT mode" ++#~ msgstr "HTモード" ++ ++#~ msgid "Router Model" ++#~ msgstr "ルーターモデル" ++ ++#~ msgid "Router Name" ++#~ msgstr "ルーターå" ++ ++#~ msgid "Send router solicitations" ++#~ msgstr "ルータè¦è«‹ã‚’é€ä¿¡ã™ã‚‹" ++ ++#~ msgid "Specifies the advertised preferred prefix lifetime in seconds" ++#~ msgstr "通知ã™ã‚‹æŽ¨å¥¨æœ‰åŠ¹æ™‚間を設定ã—ã¦ãã ã•ã„。(秒å˜ä½)" ++ ++#~ msgid "Specifies the advertised valid prefix lifetime in seconds" ++#~ msgstr "通知ã™ã‚‹æœ€çµ‚有効時間を設定ã—ã¦ãã ã•ã„。(秒å˜ä½)" ++ ++#~ msgid "Use preferred lifetime" ++#~ msgstr "推奨有効時間" ++ ++#~ msgid "Use valid lifetime" ++#~ msgstr "最終有効時間" ++ ++#~ msgid "Waiting for router..." ++#~ msgstr "ルーターã«æŽ¥ç¶šä¸­..." ++ ++#~ msgid "Enable builtin NTP server" ++#~ msgstr "内蔵ã®NTPサーãƒãƒ¼ã‚’有効ã«ã™ã‚‹" ++ ++#~ msgid "Active Leases" ++#~ msgstr "有効ãªãƒªãƒ¼ã‚¹" ++ ++#~ msgid "Open" ++#~ msgstr "é–‹ã" ++ ++#~ msgid "KB" ++#~ msgstr "キロãƒã‚¤ãƒˆ" ++ ++#~ msgid "Bit Rate" ++#~ msgstr "ビットレート" ++ ++#~ msgid "Configuration / Apply" ++#~ msgstr "設定 / é©ç”¨" ++ ++#~ msgid "Configuration / Changes" ++#~ msgstr "設定 / 変更箇所" ++ ++#~ msgid "Configuration / Revert" ++#~ msgstr "設定 / 変更箇所ã®å¾©å…ƒ" ++ ++#~ msgid "MAC" ++#~ msgstr "MAC" ++ ++#~ msgid "MAC Address" ++#~ msgstr "MACアドレス" ++ ++#~ msgid "Encr." ++#~ msgstr "æš—å·åŒ–" ++ ++#~ msgid "WLAN-Scan" ++#~ msgstr "WLAN-スキャン" ++ ++#~ msgid "" ++#~ "Choose the network you want to attach to this wireless interface. Select " ++#~ "unspecified to not attach any network or fill out the " ++#~ "create field to define a new network." ++#~ msgstr "" ++#~ "ã“ã®ç„¡ç·šã‚¤ãƒ³ã‚¿ãƒ¼ãƒ•ã‚§ãƒ¼ã‚¹ã‚’接続ã™ã‚‹ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ã‚’é¸æŠžã—ã¦ãã ã•ã„。設定" ++#~ "ã—ãªã„ã‚’é¸æŠžã™ã‚‹ã¨ã€è¨­å®šæ¸ˆã¿ã®ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ã‚’削除ã—ã¾ã™ã€‚ã¾ãŸã€ä½œ" ++#~ "æˆãƒ•ã‚£ãƒ¼ãƒ«ãƒ‰ã«ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯åを入力ã™ã‚‹ã¨ã€æ–°ã—ããƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ã‚’設定ã—" ++#~ "ã¾ã™ã€‚" ++ ++#~ msgid "Create Network" ++#~ msgstr "ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ã®ä½œæˆ" ++ ++#~ msgid "Link" ++#~ msgstr "リンク" ++ ++#~ msgid "Networks" ++#~ msgstr "ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯" ++ ++#~ msgid "Power" ++#~ msgstr "出力" ++ ++#~ msgid "Wifi networks in your local environment" ++#~ msgstr "ローカル環境内ã®ç„¡ç·šãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯" ++ ++#~ msgid "" ++#~ "CIDR-Notation: " ++#~ "address/prefix" ++#~ msgstr "" ++#~ "CIDR表記: アドレス/" ++#~ "プレフィクス" ++ ++#~ msgid "DNS-Server" ++#~ msgstr "DNS-サーãƒãƒ¼" ++ ++#~ msgid "IPv4-Broadcast" ++#~ msgstr "" ++#~ "IPv4-ブロードキャスト" ++ ++#~ msgid "IPv6-Address" ++#~ msgstr "IPv6-アドレス" ++ ++#~ msgid "IP-Aliases" ++#~ msgstr "IPエイリアス" ++ ++#~ msgid "IPv6 Setup" ++#~ msgstr "IPv6設定" ++ ++#~ msgid "" ++#~ "Note: If you choose an interface here which is part of another network, " ++#~ "it will be moved into this network." ++#~ msgstr "" ++#~ "注æ„: ä»–ã®ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ã«å±žã™ã‚‹ã‚¤ãƒ³ã‚¿ãƒ¼ãƒ•ã‚§ãƒ¼ã‚¹ã‚’指定ã—ãŸå ´åˆ, é¸æŠžã—ãŸãƒãƒƒ" ++#~ "トワークã¸ç§»å‹•ã—ã¾ã™ã€‚" ++ ++#~ msgid "" ++#~ "Really delete this interface? The deletion cannot be undone!\\nYou might " ++#~ "lose access to this router if you are connected via this interface." ++#~ msgstr "" ++#~ "本当ã«ã“ã®ã‚¤ãƒ³ã‚¿ãƒ¼ãƒ•ã‚§ãƒ¼ã‚¹ã‚’削除ã—ã¾ã™ã‹? 削除ã™ã‚‹ã¨å…ƒã«æˆ»ã™ã“ã¨ã¯ã§ãã¾ã›" ++#~ "ã‚“!\\nã“ã®ã‚¤ãƒ³ã‚¿ãƒ¼ãƒ•ã‚§ãƒ¼ã‚¹ã‚’介ã—ã¦ãƒ«ãƒ¼ã‚¿ãƒ¼ã«ã‚¢ã‚¯ã‚»ã‚¹ã—ã¦ã„ã‚‹å ´åˆã€ãƒ«ãƒ¼ã‚¿ãƒ¼" ++#~ "ã«æŽ¥ç¶šã§ããªããªã‚‹å¯èƒ½æ€§ãŒã‚ã‚Šã¾ã™ã€‚" ++ ++#~ msgid "" ++#~ "Really delete this wireless network? The deletion cannot be undone!\\nYou " ++#~ "might lose access to this router if you are connected via this network." ++#~ msgstr "" ++#~ "本当ã«ã“ã®ç„¡ç·šãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ã‚’削除ã—ã¾ã™ã‹ï¼Ÿ 削除ã™ã‚‹ã¨å…ƒã«æˆ»ã™ã“ã¨ã¯ã§ãã¾" ++#~ "ã›ã‚“!\\nã“ã®ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ã‚’介ã—ã¦ãƒ«ãƒ¼ã‚¿ãƒ¼ã«ã‚¢ã‚¯ã‚»ã‚¹ã—ã¦ã„ã‚‹å ´åˆã€ãƒ«ãƒ¼ã‚¿ãƒ¼ã«" ++#~ "接続ã§ããªããªã‚‹å¯èƒ½æ€§ãŒã‚ã‚Šã¾ã™ã€‚" ++ ++#~ msgid "" ++#~ "Really shutdown interface \"%s\" ?\\nYou might lose access to this router " ++#~ "if you are connected via this interface." ++#~ msgstr "" ++#~ "本当ã«ã‚¤ãƒ³ã‚¿ãƒ¼ãƒ•ã‚§ãƒ¼ã‚¹ \"%s\" を削除ã—ã¾ã™ã‹?\\nã“ã®ã‚¤ãƒ³ã‚¿ãƒ¼ãƒ•ã‚§ãƒ¼ã‚¹ã‚’介ã—" ++#~ "ã¦ãƒ«ãƒ¼ã‚¿ãƒ¼ã«ã‚¢ã‚¯ã‚»ã‚¹ã—ã¦ã„ã‚‹å ´åˆã€ãƒ«ãƒ¼ã‚¿ãƒ¼ã«æŽ¥ç¶šã§ããªããªã‚‹å¯èƒ½æ€§ãŒã‚ã‚Šã¾" ++#~ "ã™ã€‚" ++ ++#~ msgid "" ++#~ "Really shutdown network ?\\nYou might lose access to this router if you " ++#~ "are connected via this interface." ++#~ msgstr "" ++#~ "本当ã«ã“ã®ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ã‚’終了ã—ã¾ã™ã‹?\\nã“ã®ã‚¤ãƒ³ã‚¿ãƒ¼ãƒ•ã‚§ãƒ¼ã‚¹ã‚’介ã—ã¦ãƒ«ãƒ¼" ++#~ "ターã«ã‚¢ã‚¯ã‚»ã‚¹ã—ã¦ã„ã‚‹å ´åˆã€æŽ¥ç¶šã§ããªããªã‚‹å¯èƒ½æ€§ãŒã‚ã‚Šã¾ã™ã€‚" ++ ++#~ msgid "" ++#~ "The network ports on your router can be combined to several VLANs in which computers can " ++#~ "communicate directly with each other. VLANs are often used to separate different network " ++#~ "segments. Often there is by default one Uplink port for a connection to " ++#~ "the next greater network like the internet and other ports for a local " ++#~ "network." ++#~ msgstr "" ++#~ "ルーターã®ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ãƒãƒ¼ãƒˆã¯ã‚³ãƒ³ãƒ”ューターãŒãŠäº’ã„ã«ç›´æŽ¥é€šä¿¡ã™ã‚‹ã“ã¨ãŒå‡º" ++#~ "æ¥ã‚‹å¹¾ã¤ã‹ã® VLANs を組" ++#~ "ã¿åˆã‚ã›ã‚‹ã“ã¨ãŒå‡ºæ¥ã¾ã™ã€‚VLAN ã¯ç•°ãªã‚‹ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ã‚»ã‚°ãƒ¡ãƒ³ãƒˆã«åˆ¥ã‘ã‚‹éš›ã«ã‚ˆã使ã‚ã‚Œã¾ã™ã€‚" ++#~ "例ãˆã°ãƒ‡ãƒ•ã‚©ãƒ«ãƒˆã®1ã¤ã‚’インターãƒãƒƒãƒˆã®ç”¨ãªå¤§ããªãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ã®ç‚ºã®ã‚¢ãƒƒãƒ—" ++#~ "リンクãƒãƒ¼ãƒˆæŽ¥ç¶šã«ä½¿ç”¨ã—ã€ãã®ä»–ã®ãƒãƒ¼ãƒˆã‚’ローカルãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ã«ä½¿ç”¨ã—ã¾" ++#~ "ã™ã€‚" ++ ++#~ msgid "Enable buffering" ++#~ msgstr "ãƒãƒƒãƒ•ã‚¡ãƒªãƒ³ã‚°ã‚’有効ã«ã™ã‚‹" ++ ++#~ msgid "IPv6-over-IPv4" ++#~ msgstr "IPv6-over-IPv4" ++ ++#~ msgid "Custom Files" ++#~ msgstr "手動ã§æŒ‡å®šã—ãŸãƒ•ã‚¡ã‚¤ãƒ«" ++ ++#~ msgid "Custom files" ++#~ msgstr "手動指定ファイル" ++ ++#~ msgid "Detected Files" ++#~ msgstr "検出ã•ã‚ŒãŸãƒ•ã‚¡ã‚¤ãƒ«" ++ ++#~ msgid "Detected files" ++#~ msgstr "検出ã•ã‚ŒãŸãƒ•ã‚¡ã‚¤ãƒ«" ++ ++#~ msgid "Files to be kept when flashing a new firmware" ++#~ msgstr "æ–°ã—ã„ファームウェアを書ã込んã æ™‚ã«ç¶­æŒã™ã‚‹ãƒ•ã‚¡ã‚¤ãƒ«" ++ ++#~ msgid "General" ++#~ msgstr "一般" ++ ++#~ msgid "" ++#~ "Here you can customize the settings and the functionality of LuCI." ++#~ msgstr "" ++#~ "ã“ã®ãƒšãƒ¼ã‚¸ã§ã¯LuCI ã®æ©Ÿ" ++#~ "能ã¨è¨­å®šã‚’カスタマイズ出æ¥ã¾ã™ã€‚" ++ ++#~ msgid "Post-commit actions" ++#~ msgstr "Post-commit actions" ++ ++#~ msgid "" ++#~ "The following files are detected by the system and will be kept " ++#~ "automatically during sysupgrade" ++#~ msgstr "" ++#~ "以下ã®ãƒ•ã‚¡ã‚¤ãƒ«ãŒã‚·ã‚¹ãƒ†ãƒ ã«ã‚ˆã£ã¦æ¤œå‡ºã•ã‚Œã¾ã—ãŸã€‚ã“れらã®ãƒ•ã‚¡ã‚¤ãƒ«ã¯ãƒ•ã‚¡ãƒ¼ãƒ " ++#~ "ウェア更新時ã«è‡ªå‹•çš„ã«ä¿å­˜ã•ã‚Œã¾ã™ã€‚" ++ ++#~ msgid "" ++#~ "These commands will be executed automatically when a given UCI configuration is committed " ++#~ "allowing changes to be applied instantly." ++#~ msgstr "" ++#~ "ã“れらã®ã‚³ãƒžãƒ³ãƒ‰ã¯ã‚³ãƒŸãƒƒãƒˆã•ã‚ŒãŸ UCI設定ã®å¤‰æ›´ã‚’å³åº§ã«é©å¿œã™ã‚‹ç‚ºã«ã€è‡ªå‹•çš„ã«å®Ÿè¡Œã•ã‚Œã¾" ++#~ "ã™ã€‚" ++ ++#~ msgid "" ++#~ "This is a list of shell glob patterns for matching files and directories " ++#~ "to include during sysupgrade" ++#~ msgstr "" ++#~ "This is a list of shell glob patterns for matching files and directories " ++#~ "to include during sysupgrade" ++ ++#~ msgid "Web UI" ++#~ msgstr "Web UI" ++ ++#~ msgid "PPTP-Server" ++#~ msgstr "PPTP-サーãƒãƒ¼" ++ ++#~ msgid "AHCP Settings" ++#~ msgstr "AHCP 設定" ++ ++#~ msgid "ARP ping retries" ++#~ msgstr "ARP pingリトライ" ++ ++#~ msgid "ATM Settings" ++#~ msgstr "ATM設定" ++ ++#~ msgid "Accept Router Advertisements" ++#~ msgstr "ルーターアドãƒã‚¿ã‚¤ã‚ºã‚’許å¯ã™ã‚‹" ++ ++#~ msgid "Access point (APN)" ++#~ msgstr "アクセスãƒã‚¤ãƒ³ãƒˆ (APN)" ++ ++#~ msgid "Additional pppd options" ++#~ msgstr "pppd 追加オプション" ++ ++#~ msgid "Allowed range is 1 to FFFF" ++#~ msgstr "1ã‹ã‚‰FFFFã¾ã§ä½¿ç”¨å¯èƒ½ã§ã™ã€‚" ++ ++#~ msgid "Automatic Disconnect" ++#~ msgstr "自動切断" ++ ++#~ msgid "Backup Archive" ++#~ msgstr "ãƒãƒƒã‚¯ã‚¢ãƒƒãƒ—アーカイブ" ++ ++#~ msgid "" ++#~ "Configure the local DNS server to use the name servers adverticed by the " ++#~ "PPP peer" ++#~ msgstr "" ++#~ "ローカルDNSサーãƒãƒ¼ã«PPP接続先ã‹ã‚‰é€šçŸ¥ã•ã‚ŒãŸãƒãƒ¼ãƒ ã‚µãƒ¼ãƒãƒ¼ã‚’使用ã™ã‚‹ã‚ˆã†ã«" ++#~ "設定ã—ã¾ã™" ++ ++#~ msgid "Connect script" ++#~ msgstr "接続スクリプト" ++ ++#~ msgid "Create backup" ++#~ msgstr "ãƒãƒƒã‚¯ã‚¢ãƒƒãƒ—ã®ä½œæˆ" ++ ++#~ msgid "Default" ++#~ msgstr "標準" ++ ++#~ msgid "Disconnect script" ++#~ msgstr "切断スクリプト" ++ ++#~ msgid "Edit package lists and installation targets" ++#~ msgstr "パッケージリストã¨ã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«ã‚¿ãƒ¼ã‚²ãƒƒãƒˆã®ç·¨é›†" ++ ++#~ msgid "Enable 4K VLANs" ++#~ msgstr "4K VLANを有効ã«ã™ã‚‹" ++ ++#~ msgid "Enable IPv6 on PPP link" ++#~ msgstr "IPv6ã®PPPリンクを有効ã«ã™ã‚‹" ++ ++#~ msgid "Firmware image" ++#~ msgstr "ファームウェア・イメージ" ++ ++#~ msgid "Forward DHCP" ++#~ msgstr "DHCPパケットã®è»¢é€" ++ ++#~ msgid "Forward broadcasts" ++#~ msgstr "ブロードキャストã®è»¢é€" ++ ++#~ msgid "HE.net Tunnel ID" ++#~ msgstr "HE.net トンãƒãƒ«ID" ++ ++#~ msgid "" ++#~ "Here you can backup and restore your router configuration and - if " ++#~ "possible - reset the router to the default settings." ++#~ msgstr "" ++#~ "ã“ã®ãƒšãƒ¼ã‚¸ã§ã¯ãƒ«ãƒ¼ã‚¿ãƒ¼ã®è¨­å®šã®ãƒãƒƒã‚¯ã‚¢ãƒƒãƒ—ã¨å¾©å…ƒã¨ã€å¯èƒ½ã§ã‚ã‚Œã°ãƒ«ãƒ¼ã‚¿ãƒ¼ã‚’" ++#~ "åˆæœŸçŠ¶æ…‹ã«ãƒªã‚»ãƒƒãƒˆã—ã¾ã™ã€‚" ++ ++#~ msgid "Installation targets" ++#~ msgstr "インストールターゲット" ++ ++#~ msgid "Keep configuration files" ++#~ msgstr "設定ファイルをä¿æŒã™ã‚‹" ++ ++#~ msgid "Keep-Alive" ++#~ msgstr "キープアライブ" ++ ++#~ msgid "Kernel" ++#~ msgstr "カーãƒãƒ«" ++ ++#~ msgid "" ++#~ "Let pppd replace the current default route to use the PPP interface after " ++#~ "successful connect" ++#~ msgstr "" ++#~ "接続ã«æˆåŠŸã—ãŸå¾Œã€pppdã¯ãƒ‡ãƒ•ã‚©ãƒ«ãƒˆã®çµŒè·¯ã‚’PPPインターフェースを使用ã™ã‚‹æ§˜" ++#~ "ã«å¤‰æ›´ã—ã¾ã™" ++ ++#~ msgid "Let pppd run this script after establishing the PPP link" ++#~ msgstr "PPPリンクã®ç¢ºç«‹å¾Œã€pppd ã¯ã“ã®ã‚¹ã‚¯ãƒªãƒ—トを実行ã—ã¾ã™ã€‚" ++ ++#~ msgid "Let pppd run this script before tearing down the PPP link" ++#~ msgstr "PPPリンクã®åˆ‡æ–­å¾Œã€pppd ã¯ã“ã®ã‚¹ã‚¯ãƒªãƒ—トを実行ã—ã¾ã™ã€‚" ++ ++#~ msgid "" ++#~ "Make sure that you provide the correct pin code here or you might lock " ++#~ "your sim card!" ++#~ msgstr "" ++#~ "PINコードãŒæ­£ã—ã入力ã•ã‚Œã¦ã„ã‚‹ã“ã¨ã¨ã€SIMカードãŒãƒ­ãƒƒã‚¯ã•ã‚Œã¦ã„ãªã„ã“ã¨ã‚’" ++#~ "確èªã—ã¦ãã ã•ã„ï¼" ++ ++#~ msgid "" ++#~ "Most of them are network servers, that offer a certain service for your " ++#~ "device or network like shell access, serving webpages like LuCI, doing mesh routing, sending " ++#~ "e-mails, ..." ++#~ msgstr "" ++#~ "デーモンやサービスã¯ã€ã‚·ã‚§ãƒ«ã‚¢ã‚¯ã‚»ã‚¹ã€LuCIã®ã‚ˆã†ãªWEBアクセス機能ã€ãƒ¡ãƒƒã‚·ãƒ¥ãƒ«ãƒ¼ãƒ†ã‚£ãƒ³ã‚°æ©Ÿèƒ½ã€" ++#~ "メールé€ä¿¡æ©Ÿèƒ½ãªã©ã€ãƒ‡ãƒã‚¤ã‚¹ã‚„ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ã®æ©Ÿèƒ½ã‚’æä¾›ã—ã¾ã™ã€‚" ++ ++#~ msgid "Number of failed connection tests to initiate automatic reconnect" ++#~ msgstr "自動å†æŽ¥ç¶šæ™‚ã«è¡Œã†æŽ¥ç¶šãƒ†ã‚¹ãƒˆã®å¤±æ•—æ•°" ++ ++#~ msgid "Override Gateway" ++#~ msgstr "ゲートウェイアドレスを上書ãã™ã‚‹" ++ ++#~ msgid "PIN code" ++#~ msgstr "PINコード" ++ ++#~ msgid "PPP Settings" ++#~ msgstr "PPP設定" ++ ++#~ msgid "Package lists" ++#~ msgstr "パッケージリスト" ++ ++#~ msgid "Port PVIDs on %q" ++#~ msgstr "ãƒãƒ¼ãƒˆ PVIDs on %q" ++ ++#~ msgid "Proceed reverting all settings and resetting to firmware defaults?" ++#~ msgstr "å…¨ã¦ã®è¨­å®šã‚’å…ƒã«æˆ»ã—ã€ãƒ•ã‚¡ãƒ¼ãƒ ã‚¦ã‚§ã‚¢ã‚’åˆæœŸçŠ¶æ…‹ã«ãƒªã‚»ãƒƒãƒˆã—ã¾ã™ã‹?" ++ ++#~ msgid "Processor" ++#~ msgstr "プロセッサ" ++ ++#~ msgid "Radius-Port" ++#~ msgstr "Radiusãƒãƒ¼ãƒˆ" ++ ++#~ msgid "Radius-Server" ++#~ msgstr "Radiusサーãƒãƒ¼" ++ ++#~ msgid "Relay Settings" ++#~ msgstr "リレー設定" ++ ++#~ msgid "Replace default route" ++#~ msgstr "デフォルトルートを置æ›ã™ã‚‹" ++ ++#~ msgid "Reset router to defaults" ++#~ msgstr "ルーターをåˆæœŸçŠ¶æ…‹ã«ãƒªã‚»ãƒƒãƒˆ" ++ ++#~ msgid "Routing table ID" ++#~ msgstr "経路テーブルID" ++ ++#~ msgid "" ++#~ "Seconds to wait for the modem to become ready before attempting to connect" ++#~ msgstr "接続ã™ã‚‹å‰ã«ã€ãƒ¢ãƒ‡ãƒ ã®æº–å‚™ãŒå®Œäº†ã™ã‚‹ãŸã‚ã®å¾…ã¡æ™‚間を設ã‘ã¾ã™ï¼ˆç§’)" ++ ++#~ msgid "Server IPv4-Address" ++#~ msgstr "IPv4-アドレス サーãƒãƒ¼" ++ ++#~ msgid "Service type" ++#~ msgstr "サービス・タイプ" ++ ++#~ msgid "Services and daemons perform certain tasks on your device." ++#~ msgstr "サービスã¨ãƒ‡ãƒ¼ãƒ¢ãƒ³ã¯ãƒ‡ãƒã‚¤ã‚¹ä¸Šã§ã€æ§˜ã€…ãªå‡¦ç†ã‚’è¡Œãªã„ã¾ã™ã€‚" ++ ++#~ msgid "Settings" ++#~ msgstr "設定" ++ ++#~ msgid "Setup wait time" ++#~ msgstr "å¾…ã¡æ™‚é–“ã®è¨­å®š" ++ ++#~ msgid "" ++#~ "Sorry. OpenWrt does not support a system upgrade on this platform.
    " ++#~ "You need to manually flash your device." ++#~ msgstr "" ++#~ "申ã—訳ã‚ã‚Šã¾ã›ã‚“。OpenWrtã§ã¯ã“ã®ãƒ—ラットフォーム上ã§ã®ã‚·ã‚¹ãƒ†ãƒ ã‚¢ãƒƒãƒ—レー" ++#~ "ドを行ã†ã“ã¨ãŒã§ãã¾ã›ã‚“。
    手動ã§ãƒ‡ãƒã‚¤ã‚¹ã‚’æ›´æ–°ã—ã¦ãã ã•ã„。" ++ ++#~ msgid "Specify additional command line arguments for pppd here" ++#~ msgstr "pppd ã®è¿½åŠ ã®ã‚³ãƒžãƒ³ãƒ‰ãƒ©ã‚¤ãƒ³å¼•æ•°ã‚’指定ã—ã¾ã™ã€‚" ++ ++#~ msgid "TTL" ++#~ msgstr "TTL" ++ ++#~ msgid "The device node of your modem, e.g. /dev/ttyUSB0" ++#~ msgstr "モデムã®ãƒ‡ãƒã‚¤ã‚¹ãƒ•ã‚¡ã‚¤ãƒ«ã‚’設定ã—ã¦ãã ã•ã„。(例: /dev/ttyUSB0)" ++ ++#~ msgid "Time (in seconds) after which an unused connection will be closed" ++#~ msgstr "指定ã—ãŸæœŸé–“(秒)コãƒã‚¯ã‚·ãƒ§ãƒ³ãŒä½¿ç”¨ã•ã‚Œãªã„å ´åˆã«æŽ¥ç¶šã‚’é–‰ã˜ã¾ã™" ++ ++#~ msgid "Time Server (rdate)" ++#~ msgstr "時刻サーãƒãƒ¼ (rdate)" ++ ++#~ msgid "Tunnel Settings" ++#~ msgstr "トンãƒãƒªãƒ³ã‚°è¨­å®š" ++ ++#~ msgid "Update package lists" ++#~ msgstr "パッケージリストã®æ›´æ–°" ++ ++#~ msgid "Upload an OpenWrt image file to reflash the device." ++#~ msgstr "更新用ã®OpenWrtイメージファイルをアップロードã—ã¦ãã ã•ã„。" ++ ++#~ msgid "Upload image" ++#~ msgstr "アップロード" ++ ++#~ msgid "Use peer DNS" ++#~ msgstr "ピアDNSを使用ã™ã‚‹" ++ ++#~ msgid "VLAN %d" ++#~ msgstr "VLAN %d" ++ ++#~ msgid "" ++#~ "You can specify multiple DNS servers here, press enter to add a new " ++#~ "entry. Servers entered here will override automatically assigned ones." ++#~ msgstr "" ++#~ "複数ã®DNSサーãƒãƒ¼ã‚’設定ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚Enterキーを押ã™ã¨ã€ã‚¨ãƒ³ãƒˆãƒªãƒ¼ã‚’" ++#~ "追加ã§ãã¾ã™ã€‚ã¾ãŸã€è‡ªå‹•çš„ã«å‰²ã‚Šå½“ã¦ã‚‰ã‚ŒãŸã‚¢ãƒ‰ãƒ¬ã‚¹ã‚’ã€å…¥åŠ›ã•ã‚ŒãŸã‚µãƒ¼ãƒãƒ¼ã®" ++#~ "アドレスã§ä¸Šæ›¸ãã—ã¾ã™ã€‚" ++ ++#~ msgid "" ++#~ "You need to install \"comgt\" for UMTS/GPRS, \"ppp-mod-pppoe\" for PPPoE, " ++#~ "\"ppp-mod-pppoa\" for PPPoA or \"pptp\" for PPtP support" ++#~ msgstr "" ++#~ "サービスを追加ã—ã¦ä½¿ç”¨ã™ã‚‹å ´åˆã€ãã‚Œãžã‚Œå¯¾å¿œã™ã‚‹ãƒ‘ッケージをインストールã™" ++#~ "ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚(UMTS/GPRS - \"comgt\"ã€PPPoE - \"ppp-mod-pppoe\"ã€" ++#~ "PPPoA - \"ppp-mod-pppoa\"ã€PPTP - \"pptp\")" ++ ++#~ msgid "back" ++#~ msgstr "戻る" ++ ++#~ msgid "buffered" ++#~ msgstr "ãƒãƒƒãƒ•ã‚¡ã‚­ãƒ£ãƒƒã‚·ãƒ¥" ++ ++#~ msgid "cached" ++#~ msgstr "ページキャッシュ" ++ ++#~ msgid "free" ++#~ msgstr "空ã" ++ ++#~ msgid "static" ++#~ msgstr "é™çš„" ++ ++#~ msgid "" ++#~ "LuCI is a collection " ++#~ "of free Lua software including an MVC-Webframework and webinterface for embedded devices. LuCI is licensed under the " ++#~ "Apache-License." ++#~ msgstr "" ++#~ "LuCI 㯠MVC ウェブフレームワークや組ã¿è¾¼ã¿ãƒ‡ãƒã‚¤" ++#~ "スã®ç‚ºã®ã‚¦ã‚§ãƒ–インターフェースをå«ã‚€ã€ãƒ•ãƒªãƒ¼ã® Lua ソフトウェアコレクショ" ++#~ "ンã§ã™ã€‚LuCI 㯠Apache-" ++#~ "License ã®å…ƒã§é…布ã•ã‚Œã¦ã„ã¾ã™ã€‚" ++ ++#~ msgid "SSH-Keys" ++#~ msgstr "SSH-キー" ++ ++#~ msgid "" ++#~ "A lightweight HTTP/1.1 webserver written in C and Lua designed to serve " ++#~ "LuCI" ++#~ msgstr "" ++#~ "軽é‡ãª HTTP/1.1 WEBサーãƒãƒ¼ã¯Cã¨Luaã§æ›¸ã‹ã‚Œ LuCI ã«å½¹ç«‹ã¤æ§˜ã«è¨­è¨ˆã•ã‚Œã¦ã„" ++#~ "ã¾ã™" ++ ++#~ msgid "" ++#~ "A small webserver which can be used to serve LuCI." ++#~ msgstr "" ++#~ "LuCIを動作ã•ã›ã‚‹ã®ã«ä½¿" ++#~ "用ã™ã‚‹ã“ã¨ãŒå‡ºæ¥ã‚‹å°ã•ãª WEBサーãƒãƒ¼ã§ã™ã€‚" ++ ++#~ msgid "About" ++#~ msgstr "情報" ++ ++#~ msgid "Active IP Connections" ++#~ msgstr "有効ãªIP接続" ++ ++#~ msgid "Addresses" ++#~ msgstr "アドレス" ++ ++#~ msgid "Admin Password" ++#~ msgstr "管ç†è€…パスワード" ++ ++#~ msgid "Alias" ++#~ msgstr "エイリアス" ++ ++#~ msgid "Authentication Realm" ++#~ msgstr "èªè¨¼ãƒ¬ãƒ«ãƒ " ++ ++#~ msgid "Bridge Port" ++#~ msgstr "ブリッジãƒãƒ¼ãƒˆ" ++ ++#~ msgid "" ++#~ "Change the password of the system administrator (User root)" ++#~ msgstr "システム管ç†è€…ã®ãƒ‘スワードを変更ã—ã¾ã™(ユーザー root)" ++ ++#~ msgid "Client + WDS" ++#~ msgstr "クライアント + WDS" ++ ++#~ msgid "Configuration file" ++#~ msgstr "設定ファイル" ++ ++#~ msgid "Connection timeout" ++#~ msgstr "接続タイムアウト" ++ ++#~ msgid "Contributing Developers" ++#~ msgstr "貢献者" ++ ++#~ msgid "DHCP assigned" ++#~ msgstr "DHCP アサイン" ++ ++#~ msgid "Document root" ++#~ msgstr "ドキュメントルート" ++ ++#~ msgid "Enable Keep-Alive" ++#~ msgstr "キープアライブ機能を有効ã«ã™ã‚‹" ++ ++#~ msgid "Enable device" ++#~ msgstr "デãƒã‚¤ã‚¹ã‚’有効ã«ã™ã‚‹" ++ ++#~ msgid "Ethernet Bridge" ++#~ msgstr "イーサãƒãƒƒãƒˆãƒ–リッジ" ++ ++#~ msgid "" ++#~ "Here you can paste public SSH-Keys " ++#~ "(one per line) for SSH public-key " ++#~ "authentication." ++#~ msgstr "" ++#~ "SSH公開éµèªè¨¼ã§ä½¿ç”¨ã™ã‚‹ SSH公開éµã‚’1行ã¥ã¤è²¼ã‚Šä»˜ã‘ã¦ãã ã•ã„。" ++ ++#~ msgid "ID" ++#~ msgstr "ID" ++ ++#~ msgid "IP Configuration" ++#~ msgstr "IP 設定" ++ ++#~ msgid "Interface Status" ++#~ msgstr "インターフェース・ステータス" ++ ++#~ msgid "Lead Development" ++#~ msgstr "開発リーダー" ++ ++#~ msgid "Master" ++#~ msgstr "マスター" ++ ++#~ msgid "Master + WDS" ++#~ msgstr "マスター + WDS" ++ ++#~ msgid "No address configured on this interface." ++#~ msgstr "アドレスãŒè¨­å®šã•ã‚Œã¦ã„ã¾ã›ã‚“" ++ ++#~ msgid "Not configured" ++#~ msgstr "未設定" ++ ++#~ msgid "Password successfully changed" ++#~ msgstr "パスワードを変更ã—ã¾ã—ãŸ" ++ ++#~ msgid "Plugin path" ++#~ msgstr "プラグインパス" ++ ++#~ msgid "Ports" ++#~ msgstr "ãƒãƒ¼ãƒˆ" ++ ++#~ msgid "Primary" ++#~ msgstr "プライマリ" ++ ++#~ msgid "Project Homepage" ++#~ msgstr "プロジェクトホームページ" ++ ++#~ msgid "Pseudo Ad-Hoc" ++#~ msgstr "擬似アドホック" ++ ++#~ msgid "STP" ++#~ msgstr "STP" ++ ++#~ msgid "Thanks To" ++#~ msgstr "ã‚ã‚ŠãŒã¨ã†" ++ ++#~ msgid "" ++#~ "The realm which will be displayed at the authentication prompt for " ++#~ "protected pages." ++#~ msgstr "レルムã¯ä¿è­·ã•ã‚ŒãŸãƒšãƒ¼ã‚¸ã§èªè¨¼ãƒ—ロンプトを表示ã—ã¾ã™ã€‚" ++ ++#~ msgid "Unknown Error" ++#~ msgstr "ä¸æ˜Žãªã‚¨ãƒ©ãƒ¼" ++ ++#~ msgid "VLAN" ++#~ msgstr "VLAN" ++ ++#~ msgid "defaults to /etc/httpd.conf" ++#~ msgstr "デフォルト㯠/etc/httpd.conf" ++ ++#~ msgid "Enable this switch" ++#~ msgstr "スイッãƒã‚’有効ã«ã™ã‚‹" ++ ++#~ msgid "OPKG error code %i" ++#~ msgstr "OPKGエラーコード %i" ++ ++#~ msgid "Package lists updated" ++#~ msgstr "パッケージリストを更新ã—ã¾ã—ãŸ" ++ ++#~ msgid "Reset switch during setup" ++#~ msgstr "起動時ã«ã‚¹ã‚¤ãƒƒãƒã‚’リセットã™ã‚‹" ++ ++#~ msgid "Upgrade installed packages" ++#~ msgstr "インストールã•ã‚Œã¦ã„るパッケージã®ã‚¢ãƒƒãƒ—グレード" ++ ++#~ msgid "" ++#~ "Also kernel or service logfiles can be viewed here to get an overview " ++#~ "over their current state." ++#~ msgstr "" ++#~ "ã¾ãŸã€ã‚«ãƒ¼ãƒãƒ«ã‚„サービスã®ãƒ­ã‚°ãƒ•ã‚¡ã‚¤ãƒ«ã‚‚ç¾åœ¨ã®çŠ¶æ…‹ã‚’å¾—ã‚‹ãŸã‚ã«å‚ç…§ã™ã‚‹äº‹ãŒ" ++#~ "出æ¥ã¾ã™ã€‚" ++ ++#~ msgid "" ++#~ "Here you can find information about the current system status like CPU clock frequency, memory " ++#~ "usage or network interface data." ++#~ msgstr "" ++#~ "ã“ã“ã§ã¯ã€CPUクロック周波" ++#~ "æ•°ã€ãƒ¡ãƒ¢ãƒªä½¿ç”¨é‡ã‚„ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ã‚¤ãƒ³ã‚¿ãƒ¼ãƒ•ã‚§ãƒ¼ã‚¹ãƒ‡ãƒ¼ã‚¿ãªã©ã®ç¾åœ¨ã®ã‚·ã‚¹ãƒ†ãƒ ã®" ++#~ "状態ã«é–¢ã™ã‚‹æƒ…報を見ã¤ã‘ã‚‹ã“ã¨ãŒå‡ºæ¥ã¾ã™ã€‚" ++ ++#~ msgid "Search file..." ++#~ msgstr "Search file..." ++ ++#~ msgid "Server" ++#~ msgstr "サーãƒãƒ¼" ++ ++#~ msgid "" ++#~ "LuCI is a free, " ++#~ "flexible, and user friendly graphical interface for configuring OpenWrt " ++#~ "Kamikaze." ++#~ msgstr "" ++#~ "LuCI 㯠OpenWrt " ++#~ "Kamikaze ã®ç‚ºã®è‡ªç”±ã§ã€æŸ”軟ã§ã€ãƒ¦ãƒ¼ã‚¶ãƒ¼ãƒ•ãƒ¬ãƒ³ãƒ‰ãƒªãªã‚°ãƒ©ãƒ•ã‚£ã‚«ãƒ«ã‚¤ãƒ³ã‚¿ãƒ¼" ++#~ "フェースã§ã™ã€‚" ++ ++#~ msgid "And now have fun with your router!" ++#~ msgstr "ãã‚Œã§ã¯ã€ã‚ãªãŸã®ãƒ«ãƒ¼ã‚¿ãƒ¼ã‚’楽ã—ã‚“ã§ãã ã•ã„!" ++ ++#~ msgid "" ++#~ "As we always want to improve this interface we are looking forward to " ++#~ "your feedback and suggestions." ++#~ msgstr "" ++#~ "ç§ãŸã¡ã¨ã—ã¦ã¯ã€ã„ã¤ã§ã‚‚ã“ã®ã‚¤ãƒ³ã‚¿ãƒ¼ãƒ•ã‚§ãƒ¼ã‚¹ã‚’改良ã—ãŸã„ã¨æœ›ã‚“ã§ãŠã‚Šã€ã‚ãª" ++#~ "ãŸã‹ã‚‰ã®ãƒ•ã‚£ãƒ¼ãƒ‰ãƒãƒƒã‚¯ã¨æ案をãŠå¾…ã¡ã—ã¦ã„ã¾ã™ã€‚" ++ ++#~ msgid "Hello!" ++#~ msgstr "ã“ã‚“ã«ã¡ã¯!" ++ ++#~ msgid "LuCI Components" ++#~ msgstr "LuCIコンãƒãƒ¼ãƒãƒ³ãƒˆ" ++ ++#~ msgid "" ++#~ "Notice: In LuCI " ++#~ "changes have to be confirmed by clicking Changes - Save & Apply " ++#~ "before being applied." ++#~ msgstr "" ++#~ "注æ„: LuCI ã§å¤‰æ›´ã‚’è¡Œã†" ++#~ "ã«ã¯é©ç”¨å‰ã«ã€Œä¿å­˜ & é©ç”¨ã€ã‚’クリックã—ã¦ç¢ºèªã™ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚" ++ ++#~ msgid "" ++#~ "On the following pages you can adjust all important settings of your " ++#~ "router." ++#~ msgstr "" ++#~ "以下ã®ãƒšãƒ¼ã‚¸ã‹ã‚‰ãƒ«ãƒ¼ã‚¿ãƒ¼ã®å…¨ã¦ã®é‡è¦ãªè¨­å®šã‚’調整ã™ã‚‹ã“ã¨ãŒå‡ºæ¥ã¾ã™ã€‚" ++ ++#~ msgid "The LuCI Team" ++#~ msgstr "LuCI ãƒãƒ¼ãƒ " ++ ++#~ msgid "" ++#~ "This is the administration area of LuCI." ++#~ msgstr "" ++#~ "LuCI ã®ç®¡ç†ãƒ‘ãƒãƒ«ã§ã™ã€‚" ++ ++#~ msgid "User Interface" ++#~ msgstr "ユーザーインターフェース" ++ ++#~ msgid "enable" ++#~ msgstr "有効" ++ ++#, fuzzy ++#~ msgid "(optional)" ++#~ msgstr " (ä»»æ„)" ++ ++#~ msgid "DNS-Port" ++#~ msgstr "DNS-Port" ++ ++#~ msgid "" ++#~ "DNS-Server will be queried in " ++#~ "the order of the resolvfile" ++#~ msgstr "" ++#~ "DNSサーãƒãƒ¼ã¯ãƒªã‚¾ãƒ«ãƒãƒ•ã‚¡ã‚¤ãƒ«ã®" ++#~ "é †ã«å•ã„åˆã‚ã›ã‚’è¡Œã„ã¾ã™ã€‚" ++ ++#~ msgid "" ++#~ "max. DHCP-Leases" ++#~ msgstr "" ++#~ "max. DHCPリース" ++ ++#~ msgid "" ++#~ "max. EDNS0 packet size" ++#~ msgstr "" ++#~ "max. EDNS0 packet size" ++ ++#~ msgid "AP-Isolation" ++#~ msgstr "APã®åˆ†é›¢" ++ ++#~ msgid "Add the Wifi network to physical network" ++#~ msgstr "物ç†ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ã«ç„¡ç·šãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ã‚’追加ã—ã¾ã™" ++ ++#~ msgid "Aliases" ++#~ msgstr "エイリアス" ++ ++#~ msgid "Clamp Segment Size" ++#~ msgstr "Clamp Segment Size" ++ ++#, fuzzy ++#~ msgid "Create Or Attach Network" ++#~ msgstr "ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ã®ä½œæˆ" ++ ++#~ msgid "Devices" ++#~ msgstr "デãƒã‚¤ã‚¹" ++ ++#~ msgid "Don't forward reverse lookups for local networks" ++#~ msgstr "ローカルãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ã®ç‚ºã®é€†å¼•ãを転é€ã—ã¾ã›ã‚“" ++ ++#~ msgid "Enable TFTP-Server" ++#~ msgstr "TFTPサーãƒãƒ¼ã‚’有効ã«ã™ã‚‹" ++ ++#~ msgid "Errors" ++#~ msgstr "エラー" ++ ++#~ msgid "Essentials" ++#~ msgstr "簡易設定" ++ ++#~ msgid "Expand Hosts" ++#~ msgstr "ホストå展開" ++ ++#~ msgid "First leased address" ++#~ msgstr "先頭リースアドレス" ++ ++#~ msgid "" ++#~ "Fixes problems with unreachable websites, submitting forms or other " ++#~ "unexpected behaviour for some ISPs." ++#~ msgstr "" ++#~ "Fixes problems with unreachable websites, submitting forms or other " ++#~ "unexpected behaviour for some ISPs." ++ ++#~ msgid "Hardware Address" ++#~ msgstr "ãƒãƒ¼ãƒ‰ã‚¦ã‚§ã‚¢ã‚¢ãƒ‰ãƒ¬ã‚¹" ++ ++#~ msgid "Here you can configure installed wifi devices." ++#~ msgstr "ã“ã“ã§ã¯ã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«ã•ã‚ŒãŸç„¡ç·šãƒ‡ãƒã‚¤ã‚¹ã®è¨­å®šã‚’è¡Œã†ã“ã¨ãŒå‡ºæ¥ã¾ã™ã€‚" ++ ++#~ msgid "Ignore /etc/hosts" ++#~ msgstr "/etc/hostsを無視" ++ ++#~ msgid "Independent (Ad-Hoc)" ++#~ msgstr "アドホック" ++ ++#~ msgid "Internet Connection" ++#~ msgstr "インターãƒãƒƒãƒˆæŽ¥ç¶š" ++ ++#~ msgid "Join (Client)" ++#~ msgstr "クライアント" ++ ++#~ msgid "Leases" ++#~ msgstr "リース" ++ ++#~ msgid "Local Domain" ++#~ msgstr "ローカルドメイン" ++ ++#~ msgid "Local Network" ++#~ msgstr "ローカルãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯" ++ ++#~ msgid "Local Server" ++#~ msgstr "ローカルサーãƒãƒ¼" ++ ++#~ msgid "Network Boot Image" ++#~ msgstr "ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ãƒ–ートイメージ" ++ ++#~ msgid "" ++#~ "Network Name (ESSID)" ++#~ msgstr "" ++#~ "ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯å(ESSID)" ++ ++#~ msgid "Number of leased addresses" ++#~ msgstr "リースアドレス数" ++ ++#~ msgid "Perform Actions" ++#~ msgstr "実行" ++ ++#~ msgid "Prevents Client to Client communication" ++#~ msgstr "クライアントåŒå£«ã®é€šä¿¡ã‚’制é™ã—ã¾ã™" ++ ++#~ msgid "Provide (Access Point)" ++#~ msgstr "アクセスãƒã‚¤ãƒ³ãƒˆ" ++ ++#~ msgid "Resolvfile" ++#~ msgstr "リゾルãƒãƒ•ã‚¡ã‚¤ãƒ«" ++ ++#~ msgid "TFTP-Server Root" ++#~ msgstr "TFTPサーãƒãƒ¼ãƒ«ãƒ¼ãƒˆ" ++ ++#~ msgid "TX / RX" ++#~ msgstr "TX / RX" ++ ++#~ msgid "The following changes have been applied" ++#~ msgstr "以下ã®å¤‰æ›´ãŒé©ç”¨ã•ã‚Œã¾ã—ãŸ" ++ ++#~ msgid "" ++#~ "When flashing a new firmware with LuCI these files will be added to the new firmware " ++#~ "installation." ++#~ msgstr "" ++#~ "LuCI ã«ã‚ˆã£ã¦æ–°ã—ã„" ++#~ "ファームウェアを書ã込んã æ™‚ã«ã€ã“れらã®ãƒ•ã‚¡ã‚¤ãƒ«ã¯æ–°ã—ã„ファームウェアイン" ++#~ "ストールã§ã‚‚追加ã•ã‚Œã¾ã™ã€‚" ++ ++#, fuzzy ++#~ msgid "Wireless Scan" ++#~ msgstr "無線アダプタ" ++ ++#~ msgid "" ++#~ "With DHCP " ++#~ "network members can automatically receive their network settings (IP-address, netmask, DNS-server, ...)." ++#~ msgstr "" ++#~ "DHCP ã«ã‚ˆã£ã¦" ++#~ "ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ãƒ¡ãƒ³ãƒã¯è‡ªå‹•çš„ã«ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯è¨­å®š(IPアドレスã€netmask, DNSサーãƒãƒ¼ã€...)ã‚’å—ä¿¡ã—ã¾ã™ã€‚" ++ ++#~ msgid "" ++#~ "You can run several wifi networks with one device. Be aware that there " ++#~ "are certain hardware and driverspecific restrictions. Normally you can " ++#~ "operate 1 Ad-Hoc or up to 3 Master-Mode and 1 Client-Mode network " ++#~ "simultaneously." ++#~ msgstr "" ++#~ "1ã¤ã®ãƒ‡ãƒã‚¤ã‚¹ã§è¤‡æ•°ã®ç„¡ç·šãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ã‚’é‹ç”¨ã™ã‚‹ã“ã¨ãŒå‡ºæ¥ã¾ã™ã€‚特定ã®ãƒãƒ¼" ++#~ "ドウェアã¨ãƒ‰ãƒ©ã‚¤ãƒã®ä»•æ§˜ã®åˆ¶é™ãŒåœ¨ã‚‹ã“ã¨ã«æ³¨æ„ã—ã¦ãã ã•ã„。通常ã§ã¯1ã¤ã®" ++#~ "アドホックモードã€ã‚‚ã—ãã¯3ã¤ã¾ã§ã®ãƒžã‚¹ã‚¿ãƒ¼ãƒ¢ãƒ¼ãƒ‰ã¨1ã¤ã®ã‚¯ãƒ©ã‚¤ã‚¢ãƒ³ãƒˆãƒ¢ãƒ¼ãƒ‰" ++#~ "ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ã‚’åŒæ™‚ã«ç¨¼åƒã§ãã¾ã™ã€‚" ++ ++#~ msgid "" ++#~ "You need to install \"ppp-mod-pppoe\" for PPPoE or \"pptp\" for PPtP " ++#~ "support" ++#~ msgstr "" ++#~ "PPPoE をサãƒãƒ¼ãƒˆã™ã‚‹ç‚ºã«ã¯ \"ppp-mod-pppoe\" ã‚’ã€PPtP をサãƒãƒ¼ãƒˆã™ã‚‹ç‚ºã« " ++#~ "\"pptp\" をインストールã™ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚" ++ ++#~ msgid "additional hostfile" ++#~ msgstr "追加ã®ãƒ›ã‚¹ãƒˆãƒ•ã‚¡ã‚¤ãƒ«" ++ ++#~ msgid "adds domain names to hostentries in the resolv file" ++#~ msgstr "リゾルãƒãƒ•ã‚¡ã‚¤ãƒ«ã®ãƒ›ã‚¹ãƒˆã‚¨ãƒ³ãƒˆãƒªã«ãƒ‰ãƒ¡ã‚¤ãƒ³åを追加ã—ã¾ã™" ++ ++#~ msgid "automatically reconnect" ++#~ msgstr "自動å†æŽ¥ç¶š" ++ ++#~ msgid "concurrent queries" ++#~ msgstr "並列å•ã„åˆã‚ã›" ++ ++#~ msgid "" ++#~ "disable DHCP " ++#~ "for this interface" ++#~ msgstr "" ++#~ "ã“ã®ã‚¤ãƒ³ã‚¿ãƒ¼ãƒ•ã‚§ãƒ¼ã‚¹ã§ DHCP を無効ã«ã—ã¾ã™ã€‚" ++ ++#~ msgid "disconnect when idle for" ++#~ msgstr "disconnect when idle for" ++ ++#~ msgid "don't cache unknown" ++#~ msgstr "ãƒã‚¬ãƒ†ã‚£ãƒ–キャッシュを行ã‚ãªã„" ++ ++#~ msgid "" ++#~ "filter useless DNS-queries of " ++#~ "Windows-systems" ++#~ msgstr "" ++#~ "Windowsシステムã®ç„¡é§„㪠DNSクエ" ++#~ "リをフィルタã—ã¾ã™" ++ ++#~ msgid "installed" ++#~ msgstr "インストール済ã¿" ++ ++#~ msgid "localises the hostname depending on its subnet" ++#~ msgstr "サブãƒãƒƒãƒˆã«ä¾å­˜ã—ãŸãƒ›ã‚¹ãƒˆåをローカライズã—ã¾ã™" ++ ++#~ msgid "not installed" ++#~ msgstr "未インストール" ++ ++#~ msgid "" ++#~ "prevents caching of negative DNS-replies" ++#~ msgstr "" ++#~ "ãƒã‚¬ãƒ†ã‚£ãƒ–キャッシュã®DNS応答を" ++#~ "防ãŽã¾ã™" ++ ++#~ msgid "query port" ++#~ msgstr "å•ã„åˆã‚ã›ãƒãƒ¼ãƒˆ" ++ ++#~ msgid "transmitted / received" ++#~ msgstr "é€ä¿¡ / å—ä¿¡" ++ ++#, fuzzy ++#~ msgid "Join network" ++#~ msgstr "ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯" ++ ++#~ msgid "all" ++#~ msgstr "å…¨ã¦" ++ ++#~ msgid "Code" ++#~ msgstr "コード" ++ ++#~ msgid "Distance" ++#~ msgstr "Distance" ++ ++#~ msgid "Legend" ++#~ msgstr "Legend" ++ ++#~ msgid "Library" ++#~ msgstr "Library" ++ ++#~ msgid "see '%s' manpage" ++#~ msgstr "see '%s' manpage" ++ ++#~ msgid "Package Manager" ++#~ msgstr "パッケージ管ç†" ++ ++#~ msgid "Service" ++#~ msgstr "サービス" ++ ++#~ msgid "Statistics" ++#~ msgstr "統計" ++ ++#~ msgid "zone" ++#~ msgstr "ゾーン" +diff --git a/feeds/luci/modules/luci-base/po/ms/base.po b/feeds/luci/modules/luci-base/po/ms/base.po +new file mode 100644 +index 0000000..d2a34df +--- /dev/null ++++ b/feeds/luci/modules/luci-base/po/ms/base.po +@@ -0,0 +1,3904 @@ ++#, fuzzy ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Report-Msgid-Bugs-To: \n" ++"POT-Creation-Date: 2010-05-07 17:57+1000\n" ++"PO-Revision-Date: 2010-05-07 17:57+1000\n" ++"Last-Translator: Wai Chet Teow \n" ++"Language-Team: LANGUAGE \n" ++"Language: \n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"X-Generator: Translate Toolkit 1.1.1\n" ++ ++msgid "(%d minute window, %d second interval)" ++msgstr "" ++ ++msgid "(%s available)" ++msgstr "(%s sedia)" ++ ++msgid "(empty)" ++msgstr "" ++ ++msgid "(no interfaces attached)" ++msgstr "(tiada interface dipasang)" ++ ++msgid "-- Additional Field --" ++msgstr "-- Gelanggang Tambahan --" ++ ++msgid "-- Please choose --" ++msgstr "-- Sila pilih --" ++ ++msgid "-- custom --" ++msgstr "-- memperibadi --" ++ ++msgid "-- match by device --" ++msgstr "" ++ ++msgid "-- match by label --" ++msgstr "" ++ ++msgid "1 Minute Load:" ++msgstr "" ++ ++msgid "15 Minute Load:" ++msgstr "" ++ ++msgid "5 Minute Load:" ++msgstr "" ++ ++msgid "BSSID" ++msgstr "BSSID" ++ ++msgid "DNS query port" ++msgstr "" ++ ++msgid "DNS server port" ++msgstr "" ++ ++msgid "" ++"DNS servers will be queried in the " ++"order of the resolvfile" ++msgstr "" ++ ++msgid "ESSID" ++msgstr "" ++"ESSID" ++ ++msgid "IPv4-Address" ++msgstr "IPv4-Alamat" ++ ++msgid "IPv4-Gateway" ++msgstr "IPv4-Pintu gerbang" ++ ++msgid "IPv4-Netmask" ++msgstr "IPv4-Netmask" ++ ++msgid "" ++"IPv6-Address or Network " ++"(CIDR)" ++msgstr "IPv6 Host-Alamat atau Rangkaian (CIDR)" ++ ++msgid "IPv6-Gateway" ++msgstr "IPv6-Pintu gerbang" ++ ++msgid "IPv6-Suffix (hex)" ++msgstr "" ++ ++msgid "LED Configuration" ++msgstr "Konfigurasi lampu LED" ++ ++msgid "LED Name" ++msgstr "" ++ ++msgid "MAC-Address" ++msgstr "MAC-Alamat" ++ ++msgid "" ++"Max. DHCP leases" ++msgstr "" ++ ++msgid "" ++"Max. EDNS0 packet size" ++msgstr "" ++ ++msgid "Max. concurrent queries" ++msgstr "" ++ ++msgid "%s - %s" ++msgstr "" ++ ++msgid "ADSL" ++msgstr "" ++ ++msgid "ADSL Status" ++msgstr "" ++ ++msgid "AICCU (SIXXS)" ++msgstr "" ++ ++msgid "APN" ++msgstr "" ++ ++msgid "AR Support" ++msgstr "AR-Penyokong" ++ ++msgid "ARP retry threshold" ++msgstr "" ++ ++msgid "ATM Bridges" ++msgstr "" ++ ++msgid "ATM Virtual Channel Identifier (VCI)" ++msgstr "" ++ ++msgid "ATM Virtual Path Identifier (VPI)" ++msgstr "" ++ ++msgid "" ++"ATM bridges expose encapsulated ethernet in AAL5 connections as virtual " ++"Linux network interfaces which can be used in conjunction with DHCP or PPP " ++"to dial into the provider network." ++msgstr "" ++ ++msgid "ATM device number" ++msgstr "" ++ ++msgid "AYIYA" ++msgstr "" ++ ++msgid "Access Concentrator" ++msgstr "" ++ ++msgid "Access Point" ++msgstr "Pusat akses" ++ ++msgid "Action" ++msgstr "Aksi" ++ ++msgid "Actions" ++msgstr "Aksi" ++ ++msgid "Activate this network" ++msgstr "" ++ ++msgid "Active IPv4-Routes" ++msgstr "Aktive IPv4-Routen" ++ ++msgid "Active IPv6-Routes" ++msgstr "Aktif IPv6-Laluan" ++ ++msgid "Active Connections" ++msgstr "Sambungan Aktif" ++ ++msgid "Active DHCP Leases" ++msgstr "" ++ ++msgid "Active DHCPv6 Leases" ++msgstr "" ++ ++msgid "Ad-Hoc" ++msgstr "Ad-Hoc" ++ ++msgid "Add" ++msgstr "Tambah" ++ ++msgid "Add local domain suffix to names served from hosts files" ++msgstr "" ++ ++msgid "Add new interface..." ++msgstr "" ++ ++msgid "Additional Hosts files" ++msgstr "" ++ ++msgid "Address" ++msgstr "" ++ ++msgid "Address to access local relay bridge" ++msgstr "" ++ ++msgid "Administration" ++msgstr "Pentadbiran" ++ ++msgid "Advanced Settings" ++msgstr "Tetapan Lanjutan" ++ ++msgid "Alert" ++msgstr "" ++ ++msgid "Allow SSH password authentication" ++msgstr "Membenarkan pengesahan kata laluan SSH" ++ ++msgid "Allow all except listed" ++msgstr "Izinkan semua kecualian yang disenaraikan" ++ ++msgid "Allow listed only" ++msgstr "Izinkan senarai saja" ++ ++msgid "Allow localhost" ++msgstr "" ++ ++msgid "Allow remote hosts to connect to local SSH forwarded ports" ++msgstr "" ++ ++msgid "Allow root logins with password" ++msgstr "" ++ ++msgid "Allow the root user to login with password" ++msgstr "" ++ ++msgid "" ++"Allow upstream responses in the 127.0.0.0/8 range, e.g. for RBL services" ++msgstr "" ++ ++msgid "" ++"Also see Tunneling Comparison on SIXXS" ++msgstr "" ++ ++msgid "Always announce default router" ++msgstr "" ++ ++msgid "An additional network will be created if you leave this unchecked." ++msgstr "" ++ ++msgid "Announce as default router even if no public prefix is available." ++msgstr "" ++ ++msgid "Announced DNS domains" ++msgstr "" ++ ++msgid "Announced DNS servers" ++msgstr "" ++ ++msgid "Antenna 1" ++msgstr "Antena 1" ++ ++msgid "Antenna 2" ++msgstr "Antena 2" ++ ++msgid "Antenna Configuration" ++msgstr "" ++ ++msgid "Any zone" ++msgstr "" ++ ++msgid "Apply" ++msgstr "Melaksanakan" ++ ++msgid "Applying changes" ++msgstr "Melaksanakan perubahan" ++ ++msgid "" ++"Assign a part of given length of every public IPv6-prefix to this interface" ++msgstr "" ++ ++msgid "Assign interfaces..." ++msgstr "" ++ ++msgid "" ++"Assign prefix parts using this hexadecimal subprefix ID for this interface." ++msgstr "" ++ ++msgid "Associated Stations" ++msgstr "Associated Stesen" ++ ++msgid "Atheros 802.11%s Wireless Controller" ++msgstr "" ++ ++msgid "AuthGroup" ++msgstr "" ++ ++msgid "Authentication" ++msgstr "Authentifizierung" ++ ++msgid "Authoritative" ++msgstr "Pengesahan" ++ ++msgid "Authorization Required" ++msgstr "Otorisasi Diperlukan" ++ ++msgid "Auto Refresh" ++msgstr "" ++ ++msgid "Automatic" ++msgstr "" ++ ++msgid "Automatic Homenet (HNCP)" ++msgstr "" ++ ++msgid "Available" ++msgstr "Boleh didapati" ++ ++msgid "Available packages" ++msgstr "" ++ ++msgid "Average:" ++msgstr "" ++ ++msgid "BSSID" ++msgstr "" ++ ++msgid "Back" ++msgstr "" ++ ++msgid "Back to Overview" ++msgstr "" ++ ++msgid "Back to configuration" ++msgstr "" ++ ++msgid "Back to overview" ++msgstr "Kembali ke ikhtisar" ++ ++msgid "Back to scan results" ++msgstr "Kembali ke keputusan scan" ++ ++msgid "Background Scan" ++msgstr "Latar Belakang Scan" ++ ++msgid "Backup / Flash Firmware" ++msgstr "" ++ ++msgid "Backup / Restore" ++msgstr "Sandaran / Mengembalikan" ++ ++msgid "Backup file list" ++msgstr "" ++ ++msgid "Bad address specified!" ++msgstr "" ++ ++msgid "Band" ++msgstr "" ++ ++msgid "Behind NAT" ++msgstr "" ++ ++msgid "" ++"Below is the determined list of files to backup. It consists of changed " ++"configuration files marked by opkg, essential base files and the user " ++"defined backup patterns." ++msgstr "" ++ ++msgid "Bitrate" ++msgstr "" ++ ++msgid "Bogus NX Domain Override" ++msgstr "" ++ ++msgid "Bridge" ++msgstr "Bridge" ++ ++msgid "Bridge interfaces" ++msgstr "Antara Muka Bridge" ++ ++msgid "Bridge unit number" ++msgstr "" ++ ++msgid "Bring up on boot" ++msgstr "" ++ ++msgid "Broadcom 802.11%s Wireless Controller" ++msgstr "" ++ ++msgid "Broadcom BCM%04x 802.11 Wireless Controller" ++msgstr "" ++ ++msgid "Buffered" ++msgstr "" ++ ++msgid "Buttons" ++msgstr "Butang" ++ ++msgid "CA certificate; if empty it will be saved after the first connection." ++msgstr "" ++ ++msgid "CPU" ++msgstr "" ++ ++msgid "CPU usage (%)" ++msgstr "Penggunaan CPU (%)" ++ ++msgid "Cancel" ++msgstr "Batal" ++ ++msgid "Category" ++msgstr "" ++ ++msgid "Chain" ++msgstr "Rantai" ++ ++msgid "Changes" ++msgstr "Laman" ++ ++msgid "Changes applied." ++msgstr "Laman diterapkan." ++ ++msgid "Changes the administrator password for accessing the device" ++msgstr "" ++ ++msgid "Channel" ++msgstr "Saluran" ++ ++msgid "Check" ++msgstr "" ++ ++msgid "Checksum" ++msgstr "Jumlah disemak " ++ ++msgid "" ++"Choose the firewall zone you want to assign to this interface. Select " ++"unspecified to remove the interface from the associated zone or " ++"fill out the create field to define a new zone and attach the " ++"interface to it." ++msgstr "Pilih zon firewall yang anda ingin tetapkan untuk antar muka ini." ++ ++msgid "" ++"Choose the network(s) you want to attach to this wireless interface or fill " ++"out the create field to define a new network." ++msgstr "" ++ ++msgid "Cipher" ++msgstr "" ++ ++msgid "" ++"Click \"Generate archive\" to download a tar archive of the current " ++"configuration files. To reset the firmware to its initial state, click " ++"\"Perform reset\" (only possible with squashfs images)." ++msgstr "" ++ ++#, fuzzy ++msgid "Client" ++msgstr "Pelanggan" ++ ++msgid "Client ID to send when requesting DHCP" ++msgstr "" ++ ++msgid "" ++"Close inactive connection after the given amount of seconds, use 0 to " ++"persist connection" ++msgstr "" ++ ++msgid "Close list..." ++msgstr "" ++ ++msgid "Collecting data..." ++msgstr "" ++ ++msgid "Command" ++msgstr "Perintah" ++ ++msgid "Common Configuration" ++msgstr "" ++ ++msgid "Compression" ++msgstr "Mampatan" ++ ++msgid "Configuration" ++msgstr "Konfigurasi" ++ ++msgid "Configuration applied." ++msgstr "" ++ ++msgid "Configuration files will be kept." ++msgstr "" ++ ++msgid "Confirmation" ++msgstr "Pengesahan" ++ ++msgid "Connect" ++msgstr "" ++ ++msgid "Connected" ++msgstr "" ++ ++msgid "Connection Limit" ++msgstr "Sambungan Batas" ++ ++msgid "Connection to server fails when TLS cannot be used" ++msgstr "" ++ ++msgid "Connections" ++msgstr "" ++ ++msgid "Country" ++msgstr "" ++ ++msgid "Country Code" ++msgstr "Kod negara" ++ ++msgid "Cover the following interface" ++msgstr "" ++ ++msgid "Cover the following interfaces" ++msgstr "" ++ ++msgid "Create / Assign firewall-zone" ++msgstr "Buat / Menetapkan dinding api-zon" ++ ++msgid "Create Interface" ++msgstr "" ++ ++msgid "Create a bridge over multiple interfaces" ++msgstr "" ++ ++msgid "Critical" ++msgstr "" ++ ++msgid "Cron Log Level" ++msgstr "" ++ ++msgid "Custom Interface" ++msgstr "" ++ ++msgid "Custom delegated IPv6-prefix" ++msgstr "" ++ ++msgid "" ++"Customizes the behaviour of the device LEDs if possible." ++msgstr "Mengkustomisasi perilaku peranti LED jika mungkin." ++ ++msgid "DHCP Leases" ++msgstr "" ++ ++msgid "DHCP Server" ++msgstr "" ++ ++msgid "DHCP and DNS" ++msgstr "" ++ ++msgid "DHCP client" ++msgstr "" ++ ++msgid "DHCP-Options" ++msgstr "DHCP-Pilihan" ++ ++msgid "DHCPv6 Leases" ++msgstr "" ++ ++msgid "DHCPv6 client" ++msgstr "" ++ ++msgid "DHCPv6-Mode" ++msgstr "" ++ ++msgid "DHCPv6-Service" ++msgstr "" ++ ++msgid "DNS" ++msgstr "" ++ ++msgid "DNS forwardings" ++msgstr "" ++ ++msgid "DNS-Label / FQDN" ++msgstr "" ++ ++msgid "DS-Lite AFTR address" ++msgstr "" ++ ++msgid "DUID" ++msgstr "" ++ ++msgid "Debug" ++msgstr "" ++ ++msgid "Default %d" ++msgstr "" ++ ++msgid "Default gateway" ++msgstr "" ++ ++msgid "Default route" ++msgstr "" ++ ++msgid "Default state" ++msgstr "" ++ ++msgid "Define a name for this network." ++msgstr "" ++ ++msgid "" ++"Define additional DHCP options, for example " ++"\"6,192.168.2.1,192.168.2.2\" which advertises different DNS " ++"servers to clients." ++msgstr "" ++ ++msgid "Delete" ++msgstr "Padam" ++ ++msgid "Delete this interface" ++msgstr "" ++ ++msgid "Delete this network" ++msgstr "" ++ ++msgid "Description" ++msgstr "Keterangan" ++ ++msgid "Design" ++msgstr "Disain" ++ ++msgid "Destination" ++msgstr "Tempat tujuan" ++ ++msgid "Device" ++msgstr "Alat" ++ ++msgid "Device Configuration" ++msgstr "" ++ ++msgid "Diagnostics" ++msgstr "" ++ ++msgid "Dial number" ++msgstr "" ++ ++msgid "Directory" ++msgstr "" ++ ++msgid "Disable" ++msgstr "" ++ ++msgid "" ++"Disable DHCP for " ++"this interface." ++msgstr "" ++ ++msgid "Disable DNS setup" ++msgstr "" ++ ++msgid "Disable HW-Beacon timer" ++msgstr "Mematikan pemasa HW-Beacon" ++ ++msgid "Disabled" ++msgstr "" ++ ++msgid "Discard upstream RFC1918 responses" ++msgstr "" ++ ++msgid "Displaying only packages containing" ++msgstr "" ++ ++msgid "Distance Optimization" ++msgstr "Jarak Optimasi" ++ ++msgid "Distance to farthest network member in meters." ++msgstr "Jarak ke rangkaian terjauh ahli dalam meter." ++ ++msgid "Diversity" ++msgstr "Keanekaragaman" ++ ++# Nur für NAT-Firewalls? ++msgid "" ++"Dnsmasq is a combined DHCP-Server and DNS-" ++"Forwarder for NAT " ++"firewalls" ++msgstr "" ++"Dnsmasq adalah gabungan DHCP-Pelayan danDNS-" ++"Forwarder untuk NAT " ++"firewall" ++ ++msgid "Do not cache negative replies, e.g. for not existing domains" ++msgstr "" ++ ++msgid "Do not forward requests that cannot be answered by public name servers" ++msgstr "" ++ ++msgid "Do not forward reverse lookups for local networks" ++msgstr "" ++ ++msgid "Do not send probe responses" ++msgstr "Jangan menghantar jawapan penyelidikan" ++ ++msgid "Domain required" ++msgstr "Domain diperlukan" ++ ++msgid "Domain whitelist" ++msgstr "" ++ ++msgid "" ++"Don't forward DNS-Requests without " ++"DNS-Name" ++msgstr "Jangan hantar permintaan DNS tanpa nama DNS" ++ ++msgid "Download and install package" ++msgstr "Turun dan memasang pakej" ++ ++msgid "Download backup" ++msgstr "" ++ ++msgid "Dropbear Instance" ++msgstr "" ++ ++msgid "" ++"Dropbear offers SSH network shell access " ++"and an integrated SCP server" ++msgstr "" ++"Dropbear menawarkan SSH kulit rangkaian aksesdan pelayan yang terintegrasi." ++ ++msgid "Dual-Stack Lite (RFC6333)" ++msgstr "" ++ ++msgid "Dynamic DHCP" ++msgstr "Dinamik DHCP" ++ ++msgid "Dynamic tunnel" ++msgstr "" ++ ++msgid "" ++"Dynamically allocate DHCP addresses for clients. If disabled, only clients " ++"having static leases will be served." ++msgstr "" ++ ++msgid "EAP-Method" ++msgstr "EAP-Kaedah" ++ ++msgid "Edit" ++msgstr "Sunting" ++ ++msgid "" ++"Edit the raw configuration data above to fix any error and hit \"Save\" to " ++"reload the page." ++msgstr "" ++ ++msgid "Edit this interface" ++msgstr "" ++ ++msgid "Edit this network" ++msgstr "" ++ ++msgid "Emergency" ++msgstr "" ++ ++msgid "Enable" ++msgstr "" ++ ++msgid "Enable STP" ++msgstr "Mengaktifkan STP" ++ ++msgid "Enable HE.net dynamic endpoint update" ++msgstr "" ++ ++msgid "Enable IPv6 negotiation on the PPP link" ++msgstr "" ++ ++msgid "Enable Jumbo Frame passthrough" ++msgstr "" ++ ++msgid "Enable NTP client" ++msgstr "" ++ ++msgid "Enable TFTP server" ++msgstr "" ++ ++msgid "Enable VLAN functionality" ++msgstr "" ++ ++msgid "Enable WPS pushbutton, requires WPA(2)-PSK" ++msgstr "" ++ ++msgid "Enable learning and aging" ++msgstr "" ++ ++msgid "Enable mirroring of incoming packets" ++msgstr "" ++ ++msgid "Enable mirroring of outgoing packets" ++msgstr "" ++ ++msgid "Enable this mount" ++msgstr "" ++ ++msgid "Enable this swap" ++msgstr "" ++ ++msgid "Enable/Disable" ++msgstr "" ++ ++msgid "Enabled" ++msgstr "" ++ ++msgid "Enables the Spanning Tree Protocol on this bridge" ++msgstr "Aktifkan spanning Tree Protokol di jambatan ini" ++ ++msgid "Encapsulation mode" ++msgstr "" ++ ++msgid "Encryption" ++msgstr "Enkripsi" ++ ++msgid "Erasing..." ++msgstr "" ++ ++msgid "Error" ++msgstr "Kesalahan" ++ ++msgid "Ethernet Adapter" ++msgstr "Ethernet Adapter" ++ ++msgid "Ethernet Switch" ++msgstr "Ethernet Beralih" ++ ++msgid "Expand hosts" ++msgstr "" ++ ++msgid "Expires" ++msgstr "" ++ ++msgid "" ++"Expiry time of leased addresses, minimum is 2 minutes (2m)." ++msgstr "" ++ ++msgid "External" ++msgstr "" ++ ++msgid "External system log server" ++msgstr "" ++ ++msgid "External system log server port" ++msgstr "" ++ ++msgid "Fast Frames" ++msgstr "Frame Cepat" ++ ++msgid "File" ++msgstr "" ++ ++msgid "Filename of the boot image advertised to clients" ++msgstr "" ++ ++msgid "Filesystem" ++msgstr "Fail Sistem" ++ ++msgid "Filter" ++msgstr "Penapis" ++ ++msgid "Filter private" ++msgstr "Penapis swasta" ++ ++msgid "Filter useless" ++msgstr "Penapis tak berguna" ++ ++msgid "Find and join network" ++msgstr "" ++ ++msgid "Find package" ++msgstr "Cari pakej" ++ ++msgid "Finish" ++msgstr "Selesai" ++ ++msgid "Firewall" ++msgstr "Firewall" ++ ++msgid "Firewall Settings" ++msgstr "Tetapan Firewall" ++ ++msgid "Firewall Status" ++msgstr "Status Firewall" ++ ++msgid "Firmware Version" ++msgstr "" ++ ++msgid "Fixed source port for outbound DNS queries" ++msgstr "" ++ ++msgid "Flags" ++msgstr "Parameter" ++ ++msgid "Flash Firmware" ++msgstr "Firmware Flash" ++ ++msgid "Flash image..." ++msgstr "" ++ ++msgid "Flash new firmware image" ++msgstr "" ++ ++msgid "Flash operations" ++msgstr "" ++ ++msgid "Flashing..." ++msgstr "" ++ ++msgid "Force" ++msgstr "Paksa" ++ ++msgid "Force CCMP (AES)" ++msgstr "" ++ ++msgid "Force DHCP on this network even if another server is detected." ++msgstr "" ++ ++msgid "Force TKIP" ++msgstr "" ++ ++msgid "Force TKIP and CCMP (AES)" ++msgstr "" ++ ++msgid "Forward DHCP traffic" ++msgstr "" ++ ++msgid "Forward broadcast traffic" ++msgstr "" ++ ++msgid "Forwarding mode" ++msgstr "" ++ ++msgid "Fragmentation Threshold" ++msgstr "Fragmentasi Ambang" ++ ++msgid "Frame Bursting" ++msgstr "Bingkai Meletup" ++ ++msgid "Free" ++msgstr "" ++ ++msgid "Free space" ++msgstr "" ++ ++msgid "GHz" ++msgstr "" ++ ++msgid "GPRS only" ++msgstr "" ++ ++msgid "Gateway" ++msgstr "" ++ ++msgid "Gateway ports" ++msgstr "" ++ ++msgid "General Settings" ++msgstr "" ++ ++msgid "General Setup" ++msgstr "Setup Umum" ++ ++msgid "Generate archive" ++msgstr "" ++ ++msgid "Generic 802.11%s Wireless Controller" ++msgstr "" ++ ++msgid "Given password confirmation did not match, password not changed!" ++msgstr "" ++ ++msgid "Global network options" ++msgstr "" ++ ++msgid "Go to password configuration..." ++msgstr "" ++ ++msgid "Go to relevant configuration page" ++msgstr "Menuju ke halaman konfigurasi yang relevan" ++ ++msgid "Guest" ++msgstr "" ++ ++msgid "HE.net password" ++msgstr "" ++ ++msgid "HE.net username" ++msgstr "" ++ ++msgid "Handler" ++msgstr "Kawalan" ++ ++msgid "Hang Up" ++msgstr "Menutup" ++ ++msgid "Heartbeat" ++msgstr "" ++ ++msgid "" ++"Here you can configure the basic aspects of your device like its hostname or " ++"the timezone." ++msgstr "" ++"Di sini anda boleh mengkonfigurasi aspek asas peranti anda seperti nama host " ++"atau zon." ++ ++msgid "" ++"Here you can paste public SSH-Keys (one per line) for SSH public-key " ++"authentication." ++msgstr "" ++ ++msgid "Hermes 802.11b Wireless Controller" ++msgstr "" ++ ++msgid "Hide ESSID" ++msgstr "Menyembunyikan ESSID" ++ ++msgid "Host entries" ++msgstr "Entri host" ++ ++msgid "Host expiry timeout" ++msgstr "" ++ ++msgid "Host-IP or Network" ++msgstr "IP host atau rangkaian" ++ ++msgid "Hostname" ++msgstr "Nama Host" ++ ++msgid "Hostname to send when requesting DHCP" ++msgstr "" ++ ++msgid "Hostnames" ++msgstr "Nama Host" ++ ++msgid "Hybrid" ++msgstr "" ++ ++msgid "IP address" ++msgstr "Alamat IP" ++ ++msgid "IPv4" ++msgstr "" ++ ++msgid "IPv4 Firewall" ++msgstr "" ++ ++msgid "IPv4 WAN Status" ++msgstr "" ++ ++msgid "IPv4 address" ++msgstr "" ++ ++msgid "IPv4 and IPv6" ++msgstr "" ++ ++msgid "IPv4 assignment length" ++msgstr "" ++ ++msgid "IPv4 broadcast" ++msgstr "" ++ ++msgid "IPv4 gateway" ++msgstr "" ++ ++msgid "IPv4 netmask" ++msgstr "" ++ ++msgid "IPv4 only" ++msgstr "" ++ ++msgid "IPv4 prefix length" ++msgstr "" ++ ++msgid "IPv4-Address" ++msgstr "" ++ ++msgid "IPv6" ++msgstr "Konfigurasi IPv6" ++ ++msgid "IPv6 Firewall" ++msgstr "" ++ ++msgid "IPv6 Neighbours" ++msgstr "" ++ ++msgid "IPv6 Settings" ++msgstr "" ++ ++msgid "IPv6 ULA-Prefix" ++msgstr "" ++ ++msgid "IPv6 WAN Status" ++msgstr "" ++ ++msgid "IPv6 address" ++msgstr "" ++ ++msgid "IPv6 address delegated to the local tunnel endpoint (optional)" ++msgstr "" ++ ++msgid "IPv6 assignment hint" ++msgstr "" ++ ++msgid "IPv6 assignment length" ++msgstr "" ++ ++msgid "IPv6 gateway" ++msgstr "" ++ ++msgid "IPv6 only" ++msgstr "" ++ ++msgid "IPv6 prefix" ++msgstr "" ++ ++msgid "IPv6 prefix length" ++msgstr "" ++ ++msgid "IPv6 routed prefix" ++msgstr "" ++ ++msgid "IPv6-Address" ++msgstr "" ++ ++msgid "IPv6-in-IPv4 (RFC4213)" ++msgstr "" ++ ++msgid "IPv6-over-IPv4 (6rd)" ++msgstr "" ++ ++msgid "IPv6-over-IPv4 (6to4)" ++msgstr "" ++ ++msgid "Identity" ++msgstr "Identiti" ++ ++msgid "" ++"If specified, mount the device by its UUID instead of a fixed device node" ++msgstr "" ++ ++msgid "" ++"If specified, mount the device by the partition label instead of a fixed " ++"device node" ++msgstr "" ++ ++msgid "If unchecked, no default route is configured" ++msgstr "" ++ ++msgid "If unchecked, the advertised DNS server addresses are ignored" ++msgstr "" ++ ++msgid "" ++"If your physical memory is insufficient unused data can be temporarily " ++"swapped to a swap-device resulting in a higher amount of usable RAM. Be aware that swapping data is a very " ++"slow process as the swap-device cannot be accessed with the high datarates " ++"of the RAM." ++msgstr "" ++"Jika memori fizikal anda tidak cukup data yang boleh digunakan sementara " ++"menukar ke peranti-penukar yang dihasilkan dalam jumlah RAM berguna yang " ++"lebih tinggi. Berhati-hatilah bahawa penukaran data adalah proses yang " ++"sangat lambat kerana peranti-penukar tidak boleh diakses dengan datarates " ++"yang tinggi pada RAM." ++ ++msgid "Ignore Hosts files" ++msgstr "" ++ ++msgid "Ignore interface" ++msgstr "Abaikan antara muka" ++ ++msgid "Ignore resolve file" ++msgstr "Abaikan fail yang selesai" ++ ++msgid "Image" ++msgstr "" ++ ++msgid "In" ++msgstr "Masuk" ++ ++msgid "Inactivity timeout" ++msgstr "" ++ ++msgid "Inbound:" ++msgstr "" ++ ++msgid "Info" ++msgstr "" ++ ++msgid "Initscript" ++msgstr "" ++ ++msgid "Initscripts" ++msgstr "" ++ ++msgid "Install" ++msgstr "Memasang" ++ ++msgid "Install iputils-traceroute6 for IPv6 traceroute" ++msgstr "" ++ ++msgid "Install package %q" ++msgstr "" ++ ++msgid "Install protocol extensions..." ++msgstr "" ++ ++msgid "Installed packages" ++msgstr "" ++ ++msgid "Interface" ++msgstr "Interface" ++ ++msgid "Interface Configuration" ++msgstr "" ++ ++msgid "Interface Overview" ++msgstr "" ++ ++msgid "Interface is reconnecting..." ++msgstr "" ++ ++msgid "Interface is shutting down..." ++msgstr "" ++ ++msgid "Interface not present or not connected yet." ++msgstr "" ++ ++msgid "Interface reconnected" ++msgstr "" ++ ++msgid "Interface shut down" ++msgstr "" ++ ++msgid "Interfaces" ++msgstr "Interface" ++ ++msgid "Internal" ++msgstr "" ++ ++msgid "Internal Server Error" ++msgstr "" ++ ++msgid "Invalid" ++msgstr "Tak Sah" ++ ++msgid "Invalid VLAN ID given! Only IDs between %d and %d are allowed." ++msgstr "" ++ ++msgid "Invalid VLAN ID given! Only unique IDs are allowed" ++msgstr "" ++ ++msgid "Invalid username and/or password! Please try again." ++msgstr "Username dan / atau password tak sah! Sila cuba lagi." ++ ++#, fuzzy ++msgid "" ++"It appears that you are trying to flash an image that does not fit into the " ++"flash memory, please verify the image file!" ++msgstr "" ++"Tampak bahawa anda cuba untuk flash fail gambar yang tidak sesuai dengan " ++"memori flash, sila buat pengesahan pada fail gambar!" ++ ++msgid "Java Script required!" ++msgstr "" ++ ++#, fuzzy ++msgid "Join Network" ++msgstr "Gabung Rangkaian" ++ ++msgid "Join Network: Settings" ++msgstr "" ++ ++msgid "Join Network: Wireless Scan" ++msgstr "" ++ ++msgid "Keep settings" ++msgstr "" ++ ++msgid "Kernel Log" ++msgstr "Log Kernel" ++ ++msgid "Kernel Version" ++msgstr "" ++ ++msgid "Key" ++msgstr "Kunci" ++ ++msgid "Key #%d" ++msgstr "" ++ ++msgid "Kill" ++msgstr "Tamatkan" ++ ++msgid "L2TP" ++msgstr "" ++ ++msgid "L2TP Server" ++msgstr "" ++ ++msgid "LCP echo failure threshold" ++msgstr "" ++ ++msgid "LCP echo interval" ++msgstr "" ++ ++msgid "LLC" ++msgstr "" ++ ++msgid "Label" ++msgstr "" ++ ++msgid "Language" ++msgstr "Bahasa" ++ ++msgid "Language and Style" ++msgstr "" ++ ++msgid "Leaf" ++msgstr "" ++ ++msgid "Lease validity time" ++msgstr "" ++ ++msgid "Leasefile" ++msgstr "Sewa fail" ++ ++msgid "Leasetime" ++msgstr "Masa penyewaan" ++ ++msgid "Leasetime remaining" ++msgstr "Sisa masa penyewaan" ++ ++msgid "Leave empty to autodetect" ++msgstr "" ++ ++msgid "Leave empty to use the current WAN address" ++msgstr "" ++ ++msgid "Legend:" ++msgstr "" ++ ++msgid "Limit" ++msgstr "Batas" ++ ++msgid "Line Attenuation" ++msgstr "" ++ ++msgid "Line Speed" ++msgstr "" ++ ++msgid "Line State" ++msgstr "" ++ ++msgid "Link On" ++msgstr "Link Pada" ++ ++msgid "" ++"List of DNS servers to forward " ++"requests to" ++msgstr "" ++ ++msgid "List of domains to allow RFC1918 responses for" ++msgstr "" ++ ++msgid "List of hosts that supply bogus NX domain results" ++msgstr "" ++ ++msgid "Listen only on the given interface or, if unspecified, on all" ++msgstr "" ++ ++msgid "Listening port for inbound DNS queries" ++msgstr "" ++ ++msgid "Load" ++msgstr "Load" ++ ++msgid "Load Average" ++msgstr "" ++ ++msgid "Loading" ++msgstr "" ++ ++msgid "Local IPv4 address" ++msgstr "" ++ ++msgid "Local IPv6 address" ++msgstr "" ++ ++msgid "Local Startup" ++msgstr "" ++ ++msgid "Local Time" ++msgstr "Masa Tempatan" ++ ++msgid "Local domain" ++msgstr "" ++ ++msgid "" ++"Local domain specification. Names matching this domain are never forwarded " ++"and are resolved from DHCP or hosts files only" ++msgstr "" ++ ++msgid "Local domain suffix appended to DHCP names and hosts file entries" ++msgstr "" ++ ++msgid "Local server" ++msgstr "" ++ ++msgid "" ++"Localise hostname depending on the requesting subnet if multiple IPs are " ++"available" ++msgstr "" ++ ++msgid "Localise queries" ++msgstr "Soalan tempatan" ++ ++msgid "Locked to channel %d used by: %s" ++msgstr "" ++ ++msgid "Log output level" ++msgstr "" ++ ++msgid "Log queries" ++msgstr "Log soalan" ++ ++msgid "Logging" ++msgstr "" ++ ++msgid "Login" ++msgstr "Login" ++ ++msgid "Logout" ++msgstr "Logout" ++ ++msgid "Lowest leased address as offset from the network address." ++msgstr "" ++ ++msgid "MAC-Address" ++msgstr "" ++ ++msgid "MAC-Address Filter" ++msgstr "Penapis alamat MAC" ++ ++msgid "MAC-Filter" ++msgstr "Penapis MAC" ++ ++msgid "MAC-List" ++msgstr "Senarai MAC" ++ ++msgid "MB/s" ++msgstr "" ++ ++msgid "MHz" ++msgstr "" ++ ++msgid "MTU" ++msgstr "" ++ ++msgid "" ++"Make sure to clone the root filesystem using something like the commands " ++"below:" ++msgstr "" ++ ++msgid "Maximum Rate" ++msgstr "Rate Maksimum" ++ ++msgid "Maximum allowed number of active DHCP leases" ++msgstr "" ++ ++msgid "Maximum allowed number of concurrent DNS queries" ++msgstr "" ++ ++msgid "Maximum allowed size of EDNS.0 UDP packets" ++msgstr "" ++ ++msgid "Maximum amount of seconds to wait for the modem to become ready" ++msgstr "" ++ ++#, fuzzy ++msgid "Maximum hold time" ++msgstr "Memegang masa maksimum" ++ ++msgid "Maximum number of leased addresses." ++msgstr "" ++ ++msgid "Mbit/s" ++msgstr "" ++ ++msgid "Memory" ++msgstr "Memori" ++ ++msgid "Memory usage (%)" ++msgstr "Penggunaan Memori (%)" ++ ++msgid "Metric" ++msgstr "Metrik" ++ ++msgid "Minimum Rate" ++msgstr "Rate Minimum" ++ ++#, fuzzy ++msgid "Minimum hold time" ++msgstr "Memegang masa minimum" ++ ++msgid "Mirror monitor port" ++msgstr "" ++ ++msgid "Mirror source port" ++msgstr "" ++ ++msgid "Missing protocol extension for proto %q" ++msgstr "" ++ ++msgid "Mode" ++msgstr "Mode" ++ ++msgid "Model" ++msgstr "" ++ ++msgid "Modem device" ++msgstr "Alat modem" ++ ++msgid "Modem init timeout" ++msgstr "" ++ ++msgid "Monitor" ++msgstr "Monitor" ++ ++msgid "Mount Entry" ++msgstr "" ++ ++msgid "Mount Point" ++msgstr "Mount Point" ++ ++msgid "Mount Points" ++msgstr "Mount Points" ++ ++msgid "Mount Points - Mount Entry" ++msgstr "" ++ ++msgid "Mount Points - Swap Entry" ++msgstr "" ++ ++msgid "" ++"Mount Points define at which point a memory device will be attached to the " ++"filesystem" ++msgstr "" ++"Mount Points menentukan di mana titik peranti memori akan melekat pada fail " ++"sistem" ++ ++msgid "Mount options" ++msgstr "" ++ ++msgid "Mount point" ++msgstr "" ++ ++msgid "Mounted file systems" ++msgstr "Mounted fail sistems" ++ ++msgid "Move down" ++msgstr "" ++ ++msgid "Move up" ++msgstr "" ++ ++msgid "Multicast Rate" ++msgstr "Multicast Rate" ++ ++msgid "Multicast address" ++msgstr "" ++ ++msgid "NAS ID" ++msgstr "NAS ID" ++ ++msgid "NDP-Proxy" ++msgstr "" ++ ++msgid "NTP server candidates" ++msgstr "" ++ ++msgid "NTP sync time-out" ++msgstr "" ++ ++msgid "Name" ++msgstr "Nama" ++ ++msgid "Name of the new interface" ++msgstr "" ++ ++msgid "Name of the new network" ++msgstr "Nama rangkaian baru" ++ ++msgid "Navigation" ++msgstr "Navigation" ++ ++msgid "Netmask" ++msgstr "" ++ ++msgid "Network" ++msgstr "Rangkaian" ++ ++msgid "Network Utilities" ++msgstr "" ++ ++msgid "Network boot image" ++msgstr "" ++ ++msgid "Network without interfaces." ++msgstr "" ++ ++msgid "Next »" ++msgstr "Kemudian »" ++ ++msgid "No DHCP Server configured for this interface" ++msgstr "" ++ ++msgid "No chains in this table" ++msgstr "Tiada rantai dalam jadual ini" ++ ++msgid "No files found" ++msgstr "" ++ ++msgid "No information available" ++msgstr "" ++ ++msgid "No negative cache" ++msgstr "" ++ ++msgid "No network configured on this device" ++msgstr "" ++ ++msgid "No network name specified" ++msgstr "" ++ ++msgid "No package lists available" ++msgstr "" ++ ++msgid "No password set!" ++msgstr "" ++ ++msgid "No rules in this chain" ++msgstr "Tidak ada peraturan dalam rantai ini" ++ ++msgid "No zone assigned" ++msgstr "" ++ ++msgid "Noise" ++msgstr "Kebisingan" ++ ++msgid "Noise Margin" ++msgstr "" ++ ++msgid "Noise:" ++msgstr "" ++ ++msgid "None" ++msgstr "" ++ ++msgid "Normal" ++msgstr "" ++ ++msgid "Not Found" ++msgstr "" ++ ++msgid "Not associated" ++msgstr "" ++ ++msgid "Not connected" ++msgstr "" ++ ++msgid "Note: Configuration files will be erased." ++msgstr "" ++ ++msgid "Notice" ++msgstr "" ++ ++msgid "Nslookup" ++msgstr "" ++ ++msgid "OK" ++msgstr "Baik" ++ ++msgid "OPKG-Configuration" ++msgstr "OPKG-Konfigurasi" ++ ++msgid "Off-State Delay" ++msgstr "" ++ ++msgid "" ++"On this page you can configure the network interfaces. You can bridge " ++"several interfaces by ticking the \"bridge interfaces\" field and enter the " ++"names of several network interfaces separated by spaces. You can also use " ++"VLAN notation " ++"INTERFACE.VLANNR (e.g.: " ++"eth0.1)." ++msgstr "" ++"Pada halaman ini anda boleh mengkonfigurasi antara muka rangkaian. Anda " ++"boleh menjembatani beberapa antara muka dengan menanda jambatan antara muka " ++"gelanggang dan masukkan beberapa nama antara muka rangkaian dipisahkan " ++"dengan ruang. Anda juga boleh menggunakan antara muka VLAN notasi. Seperti " ++"eth0.1." ++ ++msgid "On-State Delay" ++msgstr "" ++ ++msgid "One of hostname or mac address must be specified!" ++msgstr "" ++ ++msgid "One or more fields contain invalid values!" ++msgstr "" ++ ++msgid "One or more required fields have no value!" ++msgstr "" ++ ++msgid "Open list..." ++msgstr "" ++ ++msgid "OpenConnect (CISCO AnyConnect)" ++msgstr "" ++ ++msgid "Operating frequency" ++msgstr "" ++ ++msgid "Option changed" ++msgstr "" ++ ++msgid "Option removed" ++msgstr "" ++ ++msgid "Optional, specify to override default server (tic.sixxs.net)" ++msgstr "" ++ ++msgid "Optional, use when the SIXXS account has more than one tunnel" ++msgstr "" ++ ++msgid "Options" ++msgstr "Pilihan" ++ ++msgid "Other:" ++msgstr "" ++ ++msgid "Out" ++msgstr "Keluar" ++ ++msgid "Outbound:" ++msgstr "" ++ ++msgid "Outdoor Channels" ++msgstr "Saluran Outdoor" ++ ++msgid "Output Interface" ++msgstr "" ++ ++msgid "Override MAC address" ++msgstr "" ++ ++msgid "Override MTU" ++msgstr "" ++ ++msgid "Override the gateway in DHCP responses" ++msgstr "" ++ ++msgid "" ++"Override the netmask sent to clients. Normally it is calculated from the " ++"subnet that is served." ++msgstr "" ++ ++msgid "Override the table used for internal routes" ++msgstr "" ++ ++msgid "Overview" ++msgstr "Keseluruhan" ++ ++msgid "Owner" ++msgstr "Pemilik" ++ ++msgid "PAP/CHAP password" ++msgstr "" ++ ++msgid "PAP/CHAP username" ++msgstr "" ++ ++msgid "PID" ++msgstr "PID" ++ ++msgid "PIN" ++msgstr "" ++ ++msgid "PPP" ++msgstr "" ++ ++msgid "PPPoA Encapsulation" ++msgstr "Pengkapsulan PPPoA" ++ ++msgid "PPPoATM" ++msgstr "" ++ ++msgid "PPPoE" ++msgstr "" ++ ++msgid "PPtP" ++msgstr "" ++ ++msgid "Package libiwinfo required!" ++msgstr "" ++ ++msgid "Package lists are older than 24 hours" ++msgstr "" ++ ++msgid "Package name" ++msgstr "Nama pakej" ++ ++msgid "Packets" ++msgstr "Paket" ++ ++msgid "Part of zone %q" ++msgstr "" ++ ++msgid "Password" ++msgstr "Kata laluan" ++ ++msgid "Password authentication" ++msgstr "Kata laluan pengesahan" ++ ++msgid "Password of Private Key" ++msgstr "Kata Laluan Kunci Swasta" ++ ++msgid "Password successfully changed!" ++msgstr "" ++ ++msgid "Path" ++msgstr "Path" ++ ++msgid "Path to CA-Certificate" ++msgstr "Path ke CA-Sijil" ++ ++msgid "Path to Client-Certificate" ++msgstr "" ++ ++msgid "Path to Private Key" ++msgstr "Path ke Kunci Swasta" ++ ++msgid "Path to executable which handles the button event" ++msgstr "Path ke eksekusi yang mengendalikan acara butang" ++ ++msgid "Peak:" ++msgstr "" ++ ++msgid "Perform reboot" ++msgstr "Lakukan reboot" ++ ++msgid "Perform reset" ++msgstr "" ++ ++msgid "Phy Rate:" ++msgstr "" ++ ++msgid "Physical Settings" ++msgstr "Tetapan Fizikal" ++ ++msgid "Ping" ++msgstr "" ++ ++msgid "Pkts." ++msgstr "Pkts." ++ ++msgid "Please enter your username and password." ++msgstr "Sila masukkan username dan kata laluan anda." ++ ++msgid "Please wait: Device rebooting..." ++msgstr "Sila tunggu: Peranti sedang reboot..." ++ ++msgid "Policy" ++msgstr "Dasar" ++ ++msgid "Port" ++msgstr "Port" ++ ++msgid "Port %d" ++msgstr "" ++ ++msgid "Port %d is untagged in multiple VLANs!" ++msgstr "" ++ ++msgid "Port status:" ++msgstr "" ++ ++msgid "" ++"Presume peer to be dead after given amount of LCP echo failures, use 0 to " ++"ignore failures" ++msgstr "" ++ ++msgid "Prevents client-to-client communication" ++msgstr "Mencegah komunikasi sesama Pelanggan" ++ ++msgid "Prism2/2.5/3 802.11b Wireless Controller" ++msgstr "" ++ ++msgid "Proceed" ++msgstr "Teruskan" ++ ++msgid "Processes" ++msgstr "Proses" ++ ++msgid "Prot." ++msgstr "Prot." ++ ++msgid "Protocol" ++msgstr "Protokol" ++ ++msgid "Protocol family" ++msgstr "" ++ ++msgid "Protocol of the new interface" ++msgstr "" ++ ++msgid "Protocol support is not installed" ++msgstr "" ++ ++msgid "Provide NTP server" ++msgstr "" ++ ++msgid "Provide new network" ++msgstr "" ++ ++msgid "Pseudo Ad-Hoc (ahdemo)" ++msgstr "Pseudo Ad-Hoc (ahdemo)" ++ ++msgid "Public prefix routed to this device for distribution to clients." ++msgstr "" ++ ++msgid "Quality" ++msgstr "" ++ ++msgid "RTS/CTS Threshold" ++msgstr "RTS/CTS-Ambang" ++ ++# Ein / Aus, eingehend / ausgehend? ++msgid "RX" ++msgstr "RX" ++ ++msgid "RX Rate" ++msgstr "" ++ ++msgid "RaLink 802.11%s Wireless Controller" ++msgstr "" ++ ++msgid "Radius-Accounting-Port" ++msgstr "" ++ ++msgid "Radius-Accounting-Secret" ++msgstr "" ++ ++msgid "Radius-Accounting-Server" ++msgstr "" ++ ++msgid "Radius-Authentication-Port" ++msgstr "" ++ ++msgid "Radius-Authentication-Secret" ++msgstr "" ++ ++msgid "Radius-Authentication-Server" ++msgstr "" ++ ++msgid "" ++"Read /etc/ethers to configure the DHCP-Server" ++msgstr "Baca /etc/ethers untuk mengkonfigurasikan DHCP-Server" ++ ++msgid "" ++"Really delete this interface? The deletion cannot be undone!\\nYou might " ++"lose access to this device if you are connected via this interface." ++msgstr "" ++ ++msgid "" ++"Really delete this wireless network? The deletion cannot be undone!\\nYou " ++"might lose access to this device if you are connected via this network." ++msgstr "" ++ ++msgid "Really reset all changes?" ++msgstr "" ++ ++msgid "" ++"Really shut down network?\\nYou might lose access to this device if you are " ++"connected via this interface." ++msgstr "" ++ ++msgid "" ++"Really shutdown interface \"%s\" ?\\nYou might lose access to this device if " ++"you are connected via this interface." ++msgstr "" ++ ++msgid "Really switch protocol?" ++msgstr "" ++ ++msgid "Realtime Connections" ++msgstr "" ++ ++msgid "Realtime Graphs" ++msgstr "" ++ ++msgid "Realtime Load" ++msgstr "" ++ ++msgid "Realtime Traffic" ++msgstr "" ++ ++msgid "Realtime Wireless" ++msgstr "" ++ ++msgid "Rebind protection" ++msgstr "" ++ ++msgid "Reboot" ++msgstr "Reboot" ++ ++msgid "Rebooting..." ++msgstr "" ++ ++msgid "Reboots the operating system of your device" ++msgstr "Reboot sistem operasi peranti anda" ++ ++msgid "Receive" ++msgstr "Menerima" ++ ++msgid "Receiver Antenna" ++msgstr "Antena Penerima" ++ ++msgid "Reconnect this interface" ++msgstr "" ++ ++msgid "Reconnecting interface" ++msgstr "" ++ ++msgid "References" ++msgstr "Rujukan" ++ ++msgid "Regulatory Domain" ++msgstr "Peraturan Domain" ++ ++msgid "Relay" ++msgstr "" ++ ++msgid "Relay Bridge" ++msgstr "" ++ ++msgid "Relay between networks" ++msgstr "" ++ ++msgid "Relay bridge" ++msgstr "" ++ ++msgid "Remote IPv4 address" ++msgstr "" ++ ++msgid "Remove" ++msgstr "Menghapuskan" ++ ++msgid "Repeat scan" ++msgstr "Ulangi scan" ++ ++msgid "Replace entry" ++msgstr "Tukar entri" ++ ++msgid "Replace wireless configuration" ++msgstr "" ++ ++msgid "Request IPv6-address" ++msgstr "" ++ ++msgid "Request IPv6-prefix of length" ++msgstr "" ++ ++msgid "Require TLS" ++msgstr "" ++ ++msgid "Required for certain ISPs, e.g. Charter with DOCSIS 3" ++msgstr "" ++ ++msgid "Reset" ++msgstr "Reset" ++ ++msgid "Reset Counters" ++msgstr "Reset Loket" ++ ++msgid "Reset to defaults" ++msgstr "" ++ ++msgid "Resolv and Hosts Files" ++msgstr "" ++ ++msgid "Resolve file" ++msgstr "" ++ ++msgid "Restart" ++msgstr "" ++ ++msgid "Restart Firewall" ++msgstr "Restart Firewall" ++ ++msgid "Restore backup" ++msgstr "Kembalikan sandaran" ++ ++msgid "Reveal/hide password" ++msgstr "" ++ ++msgid "Revert" ++msgstr "Kembali" ++ ++msgid "Root" ++msgstr "" ++ ++msgid "Root directory for files served via TFTP" ++msgstr "" ++ ++msgid "Root preparation" ++msgstr "" ++ ++msgid "Routed IPv6 prefix for downstream interfaces" ++msgstr "" ++ ++msgid "Router Advertisement-Service" ++msgstr "" ++ ++msgid "Router Password" ++msgstr "" ++ ++msgid "Routes" ++msgstr "Laluan" ++ ++msgid "" ++"Routes specify over which interface and gateway a certain host or network " ++"can be reached." ++msgstr "" ++"Laluan menentukan di mana interface dan gateway host atau rangkaian tertentu " ++"yang boleh dicapai." ++ ++msgid "Rule #" ++msgstr "Peraturan #" ++ ++msgid "Run a filesystem check before mounting the device" ++msgstr "" ++ ++msgid "Run filesystem check" ++msgstr "" ++ ++msgid "" ++"SIXXS supports TIC only, for static tunnels using IP protocol 41 (RFC4213) " ++"use 6in4 instead" ++msgstr "" ++ ++msgid "SIXXS-handle[/Tunnel-ID]" ++msgstr "" ++ ++msgid "SSH Access" ++msgstr "" ++ ++msgid "SSH-Keys" ++msgstr "" ++ ++msgid "SSID" ++msgstr "SSID" ++ ++msgid "Save" ++msgstr "Simpan" ++ ++msgid "Save & Apply" ++msgstr "Simpan & Melaksanakan" ++ ++msgid "Save & Apply" ++msgstr "" ++ ++msgid "Scan" ++msgstr "Scan" ++ ++msgid "Scheduled Tasks" ++msgstr "Tugas Jadual" ++ ++msgid "Section added" ++msgstr "" ++ ++msgid "Section removed" ++msgstr "" ++ ++msgid "See \"mount\" manpage for details" ++msgstr "Rujuk \"mount\" laman manual untuk detail" ++ ++msgid "" ++"Send LCP echo requests at the given interval in seconds, only effective in " ++"conjunction with failure threshold" ++msgstr "" ++ ++msgid "Separate Clients" ++msgstr "Pisahkan Pelanggan" ++ ++msgid "Separate WDS" ++msgstr "Pisahkan WDS" ++ ++msgid "Server Settings" ++msgstr "" ++ ++msgid "Server password" ++msgstr "" ++ ++msgid "" ++"Server password, enter the specific password of the tunnel when the username " ++"contains the tunnel ID" ++msgstr "" ++ ++msgid "Server username" ++msgstr "" ++ ++msgid "Service Name" ++msgstr "" ++ ++msgid "Service Type" ++msgstr "" ++ ++msgid "Services" ++msgstr "Perkhidmatan" ++ ++msgid "Set up Time Synchronization" ++msgstr "" ++ ++msgid "Setup DHCP Server" ++msgstr "" ++ ++msgid "Show current backup file list" ++msgstr "" ++ ++msgid "Shutdown this interface" ++msgstr "" ++ ++msgid "Shutdown this network" ++msgstr "" ++ ++msgid "Signal" ++msgstr "Isyarat" ++ ++msgid "Signal:" ++msgstr "" ++ ++msgid "Size" ++msgstr "Saiz" ++ ++msgid "Skip" ++msgstr "Skip" ++ ++msgid "Skip to content" ++msgstr "Skip ke kadar" ++ ++msgid "Skip to navigation" ++msgstr "Skip ke navigation" ++ ++msgid "Slot time" ++msgstr "Slot masa" ++ ++msgid "Software" ++msgstr "Perisian" ++ ++msgid "Some fields are invalid, cannot save values!" ++msgstr "" ++ ++msgid "Sorry, the object you requested was not found." ++msgstr "" ++ ++msgid "Sorry, the server encountered an unexpected error." ++msgstr "" ++ ++msgid "" ++"Sorry, there is no sysupgrade support present; a new firmware image must be " ++"flashed manually. Please refer to the OpenWrt wiki for device specific " ++"install instructions." ++msgstr "" ++ ++msgid "Sort" ++msgstr "" ++ ++msgid "Source" ++msgstr "Sumber" ++ ++msgid "Source routing" ++msgstr "" ++ ++#, fuzzy ++msgid "Specifies the button state to handle" ++msgstr "Menentukan state butang untuk melaku" ++ ++msgid "Specifies the directory the device is attached to" ++msgstr "" ++ ++msgid "Specifies the listening port of this Dropbear instance" ++msgstr "" ++ ++msgid "" ++"Specifies the maximum amount of failed ARP requests until hosts are presumed " ++"to be dead" ++msgstr "" ++ ++msgid "" ++"Specifies the maximum amount of seconds after which hosts are presumed to be " ++"dead" ++msgstr "" ++ ++msgid "Specify the secret encryption key here." ++msgstr "" ++ ++msgid "Start" ++msgstr "Mula" ++ ++msgid "Start priority" ++msgstr "" ++ ++msgid "Startup" ++msgstr "" ++ ++msgid "Static IPv4 Routes" ++msgstr "Laluan IPv4 Statik" ++ ++msgid "Static IPv6 Routes" ++msgstr "Laluan IPv6 Statik" ++ ++msgid "Static Leases" ++msgstr "Statische Einträge" ++ ++msgid "Static Routes" ++msgstr "Laluan Statik" ++ ++msgid "Static WDS" ++msgstr "" ++ ++msgid "Static address" ++msgstr "" ++ ++msgid "" ++"Static leases are used to assign fixed IP addresses and symbolic hostnames " ++"to DHCP clients. They are also required for non-dynamic interface " ++"configurations where only hosts with a corresponding lease are served." ++msgstr "" ++ ++msgid "Status" ++msgstr "Status" ++ ++msgid "Stop" ++msgstr "" ++ ++msgid "Strict order" ++msgstr "Order Ketat" ++ ++msgid "Submit" ++msgstr "Menyerahkan" ++ ++msgid "Swap" ++msgstr "" ++ ++msgid "Swap Entry" ++msgstr "" ++ ++msgid "Switch" ++msgstr "Beralih" ++ ++msgid "Switch %q" ++msgstr "" ++ ++msgid "Switch %q (%s)" ++msgstr "" ++ ++msgid "Switch protocol" ++msgstr "" ++ ++msgid "Sync with browser" ++msgstr "" ++ ++msgid "Synchronizing..." ++msgstr "" ++ ++msgid "System" ++msgstr "Sistem" ++ ++msgid "System Log" ++msgstr "Log Sistem" ++ ++msgid "System Properties" ++msgstr "" ++ ++msgid "System log buffer size" ++msgstr "" ++ ++msgid "TCP:" ++msgstr "" ++ ++msgid "TFTP Settings" ++msgstr "" ++ ++msgid "TFTP server root" ++msgstr "" ++ ++# same as RX ++msgid "TX" ++msgstr "TX" ++ ++msgid "TX Rate" ++msgstr "" ++ ++msgid "Table" ++msgstr "Meja" ++ ++msgid "Target" ++msgstr "Sasaran" ++ ++msgid "Terminate" ++msgstr "Menamatkan" ++ ++msgid "" ++"The Device Configuration section covers physical settings of the " ++"radio hardware such as channel, transmit power or antenna selection which " ++"are shared among all defined wireless networks (if the radio hardware is " ++"multi-SSID capable). Per network settings like encryption or operation mode " ++"are grouped in the Interface Configuration." ++msgstr "" ++ ++msgid "" ++"The libiwinfo-lua package is not installed. You must install this " ++"component for working wireless configuration!" ++msgstr "" ++ ++msgid "" ++"The HE.net endpoint update configuration changed, you must now use the plain " ++"username instead of the user ID!" ++msgstr "" ++ ++msgid "" ++"The IPv6 prefix assigned to the provider, usually ends with ::" ++msgstr "" ++ ++msgid "" ++"The allowed characters are: A-Z, a-z, 0-9 and _" ++msgstr "" ++"Karakter yang diizinkan adalah: A-Z, a-z, " ++"0-9 dan _" ++ ++msgid "The configuration file could not be loaded due to the following error:" ++msgstr "" ++ ++msgid "" ++"The device file of the memory or partition (e.g." ++" /dev/sda1)" ++msgstr "Fail peranti memori atau partisyen, (contohnya: /dev/sda)" ++ ++msgid "" ++"The filesystem that was used to format the memory (e.g. ext3)" ++msgstr "Failsistem yang digunakan untuk memformat memori (contohnya: ext3)" ++ ++msgid "" ++"The flash image was uploaded. Below is the checksum and file size listed, " ++"compare them with the original file to ensure data integrity.
    Click " ++"\"Proceed\" below to start the flash procedure." ++msgstr "" ++"Fail gambar flash telah di-upload. Berikut ini adalah checksum dan saiz fail " ++"yang berdaftar, membandingkannya dengan fail gambar asli untuk memastikan " ++"integriti data.
    Klik butang terus di bawah untuk memulakan prosedur " ++"flash." ++ ++msgid "The following changes have been committed" ++msgstr "" ++ ++msgid "The following changes have been reverted" ++msgstr "Laman berikut telah kembali" ++ ++msgid "The following rules are currently active on this system." ++msgstr "Peraturan berikut sedang aktif pada sistem ini." ++ ++msgid "The given network name is not unique" ++msgstr "" ++ ++msgid "" ++"The hardware is not multi-SSID capable and the existing configuration will " ++"be replaced if you proceed." ++msgstr "" ++ ++msgid "" ++"The length of the IPv4 prefix in bits, the remainder is used in the IPv6 " ++"addresses." ++msgstr "" ++ ++msgid "The length of the IPv6 prefix in bits" ++msgstr "" ++ ++msgid "" ++"The network ports on this device can be combined to several VLANs in which computers can " ++"communicate directly with each other. VLANs are often used to separate different network " ++"segments. Often there is by default one Uplink port for a connection to the " ++"next greater network like the internet and other ports for a local network." ++msgstr "" ++ ++msgid "The selected protocol needs a device assigned" ++msgstr "" ++ ++msgid "" ++"The system is erasing the configuration partition now and will reboot itself " ++"when finished." ++msgstr "" ++ ++#, fuzzy ++msgid "" ++"The system is flashing now.
    DO NOT POWER OFF THE DEVICE!
    Wait a " ++"few minutes before you try to reconnect. It might be necessary to renew the " ++"address of your computer to reach the device again, depending on your " ++"settings." ++msgstr "" ++"Sistem ini sekarang mula flash.
    JANGAN TUTUP KUASA UNTUK PERANTI!
    Tunggu beberapa minit sehingga anda cuba untuk menyambung kembali. Mungkin " ++"anda perlu mengemas kini alamat komputer anda untuk mencapai peranti lagi, " ++"bergantung pada tetapan anda." ++ ++msgid "" ++"The tunnel end-point is behind NAT, defaults to disabled and only applies to " ++"AYIYA" ++msgstr "" ++ ++msgid "" ++"The uploaded image file does not contain a supported format. Make sure that " ++"you choose the generic image format for your platform." ++msgstr "" ++"Format Fail gambar yang diupload tidak disokongkan. Pastikan anda memilih " ++"fail format gambar yang generik untuk platform anda." ++ ++msgid "There are no active leases." ++msgstr "" ++ ++msgid "There are no pending changes to apply!" ++msgstr "" ++ ++msgid "There are no pending changes to revert!" ++msgstr "" ++ ++msgid "There are no pending changes!" ++msgstr "" ++ ++msgid "" ++"There is no device assigned yet, please attach a network device in the " ++"\"Physical Settings\" tab" ++msgstr "" ++ ++msgid "" ++"There is no password set on this router. Please configure a root password to " ++"protect the web interface and enable SSH." ++msgstr "" ++ ++msgid "This IPv4 address of the relay" ++msgstr "" ++ ++msgid "" ++"This is a list of shell glob patterns for matching files and directories to " ++"include during sysupgrade. Modified files in /etc/config/ and certain other " ++"configurations are automatically preserved." ++msgstr "" ++ ++msgid "" ++"This is either the \"Update Key\" configured for the tunnel or the account " ++"password if no update key has been configured" ++msgstr "" ++ ++msgid "" ++"This is the content of /etc/rc.local. Insert your own commands here (in " ++"front of 'exit 0') to execute them at the end of the boot process." ++msgstr "" ++ ++msgid "" ++"This is the local endpoint address assigned by the tunnel broker, it usually " ++"ends with :2" ++msgstr "" ++ ++msgid "" ++"This is the only DHCP in the local network" ++msgstr "Ini adalah DHCP hanya dalam rangkaian tempatan." ++ ++msgid "This is the plain username for logging into the account" ++msgstr "" ++ ++msgid "" ++"This is the prefix routed to you by the tunnel broker for use by clients" ++msgstr "" ++ ++msgid "This is the system crontab in which scheduled tasks can be defined." ++msgstr "" ++"Ini adalah crontab sistem di mana tugas-tugas yang dijadualkan boleh " ++"ditakrifkan." ++ ++msgid "" ++"This is usually the address of the nearest PoP operated by the tunnel broker" ++msgstr "" ++ ++msgid "" ++"This list gives an overview over currently running system processes and " ++"their status." ++msgstr "" ++"Senarai ini memberikan gambaran lebih pada proses sistem yang sedang " ++"berjalan dan statusnya." ++ ++msgid "This page allows the configuration of custom button actions" ++msgstr "Laman ini membolehkan konfigurasi butang tindakan peribadi" ++ ++msgid "This page gives an overview over currently active network connections." ++msgstr "" ++"Laman ini memberikan gambaran lebih dari saat ini sambungan rangkaian yang " ++"aktif." ++ ++msgid "This section contains no values yet" ++msgstr "Bahagian ini belum mengandungi nilai-nilai lagi" ++ ++msgid "Time Synchronization" ++msgstr "" ++ ++msgid "Time Synchronization is not configured yet." ++msgstr "" ++ ++msgid "Timezone" ++msgstr "Zon masa" ++ ++msgid "" ++"To restore configuration files, you can upload a previously generated backup " ++"archive here." ++msgstr "" ++ ++msgid "Total Available" ++msgstr "" ++ ++msgid "Traceroute" ++msgstr "" ++ ++msgid "Traffic" ++msgstr "Lalu lintas" ++ ++msgid "Transfer" ++msgstr "Pemindahan" ++ ++msgid "Transmission Rate" ++msgstr "Kelajuan Penghantaran" ++ ++msgid "Transmit" ++msgstr "Pancar" ++ ++msgid "Transmit Power" ++msgstr "Daya Pancar" ++ ++msgid "Transmitter Antenna" ++msgstr "Antena Pemancar" ++ ++msgid "Trigger" ++msgstr "" ++ ++msgid "Trigger Mode" ++msgstr "" ++ ++msgid "Tunnel ID" ++msgstr "" ++ ++msgid "Tunnel Interface" ++msgstr "" ++ ++msgid "Tunnel Link" ++msgstr "" ++ ++msgid "Tunnel broker protocol" ++msgstr "" ++ ++msgid "Tunnel setup server" ++msgstr "" ++ ++msgid "Tunnel type" ++msgstr "" ++ ++msgid "Turbo Mode" ++msgstr "Mod Turbo" ++ ++msgid "Tx-Power" ++msgstr "" ++ ++msgid "Type" ++msgstr "Jenis" ++ ++msgid "UDP:" ++msgstr "" ++ ++msgid "UMTS only" ++msgstr "" ++ ++msgid "UMTS/GPRS/EV-DO" ++msgstr "" ++ ++msgid "USB Device" ++msgstr "" ++ ++msgid "UUID" ++msgstr "" ++ ++msgid "Unable to dispatch" ++msgstr "" ++ ++msgid "Unknown" ++msgstr "" ++ ++msgid "Unknown Error, password not changed!" ++msgstr "" ++ ++msgid "Unmanaged" ++msgstr "" ++ ++msgid "Unsaved Changes" ++msgstr "Perubahan yang belum disimpan" ++ ++msgid "Unsupported protocol type." ++msgstr "" ++ ++msgid "Update lists" ++msgstr "" ++ ++msgid "" ++"Upload a sysupgrade-compatible image here to replace the running firmware. " ++"Check \"Keep settings\" to retain the current configuration (requires an " ++"OpenWrt compatible firmware image)." ++msgstr "" ++ ++msgid "Upload archive..." ++msgstr "" ++ ++msgid "Uploaded File" ++msgstr "Uploaded Fail" ++ ++msgid "Uptime" ++msgstr "Masa Aktif" ++ ++msgid "Use /etc/ethers" ++msgstr "Guna /etc/ethers" ++ ++msgid "Use DHCP gateway" ++msgstr "" ++ ++msgid "Use DNS servers advertised by peer" ++msgstr "" ++ ++msgid "Use ISO/IEC 3166 alpha2 country codes." ++msgstr "" ++ ++msgid "Use MTU on tunnel interface" ++msgstr "" ++ ++msgid "Use TTL on tunnel interface" ++msgstr "" ++ ++msgid "Use as external overlay (/overlay)" ++msgstr "" ++ ++msgid "Use as root filesystem (/)" ++msgstr "" ++ ++msgid "Use broadcast flag" ++msgstr "" ++ ++msgid "Use builtin IPv6-management" ++msgstr "" ++ ++msgid "Use custom DNS servers" ++msgstr "" ++ ++msgid "Use default gateway" ++msgstr "" ++ ++msgid "Use gateway metric" ++msgstr "" ++ ++msgid "Use routing table" ++msgstr "" ++ ++msgid "" ++"Use the Add Button to add a new lease entry. The MAC-Address indentifies the host, the IPv4-Address specifies to the fixed " ++"address to use and the Hostname is assigned as symbolic name to the " ++"requesting host." ++msgstr "" ++ ++msgid "Used" ++msgstr "Diguna" ++ ++msgid "Used Key Slot" ++msgstr "" ++ ++msgid "User certificate (PEM encoded)" ++msgstr "" ++ ++msgid "User key (PEM encoded)" ++msgstr "" ++ ++msgid "Username" ++msgstr "Username" ++ ++msgid "VC-Mux" ++msgstr "" ++ ++msgid "VLAN Interface" ++msgstr "" ++ ++msgid "VLANs on %q" ++msgstr "" ++ ++msgid "VLANs on %q (%s)" ++msgstr "" ++ ++msgid "VPN Server" ++msgstr "" ++ ++msgid "VPN Server port" ++msgstr "" ++ ++msgid "VPN Server's certificate SHA1 hash" ++msgstr "" ++ ++msgid "Vendor Class to send when requesting DHCP" ++msgstr "" ++ ++msgid "Verbose" ++msgstr "" ++ ++msgid "Verbose logging by aiccu daemon" ++msgstr "" ++ ++msgid "Verify" ++msgstr "" ++ ++msgid "Version" ++msgstr "Versi" ++ ++msgid "WDS" ++msgstr "WDS" ++ ++msgid "WEP Open System" ++msgstr "" ++ ++msgid "WEP Shared Key" ++msgstr "" ++ ++msgid "WEP passphrase" ++msgstr "" ++ ++msgid "WMM Mode" ++msgstr "WMM Mod" ++ ++msgid "WPA passphrase" ++msgstr "" ++ ++msgid "" ++"WPA-Encryption requires wpa_supplicant (for client mode) or hostapd (for AP " ++"and ad-hoc mode) to be installed." ++msgstr "" ++"WPA-Enkripsi memerlukan pemohan wpa (untuk mod pelanggan) atau hostapd " ++"(untuk AP dan mod ad-hoc) yang akan dipasangkan." ++ ++msgid "" ++"Wait for NTP sync that many seconds, seting to 0 disables waiting (optional)" ++msgstr "" ++ ++msgid "Waiting for changes to be applied..." ++msgstr "" ++ ++msgid "Waiting for command to complete..." ++msgstr "" ++ ++msgid "Warning" ++msgstr "" ++ ++msgid "Warning: There are unsaved changes that will be lost while rebooting!" ++msgstr "Amaran: Ada perubahan yang belum disimpan akan hilang saat reboot!" ++ ++msgid "Whether to create an IPv6 default route over the tunnel" ++msgstr "" ++ ++msgid "Whether to route only packets from delegated prefixes" ++msgstr "" ++ ++msgid "Width" ++msgstr "" ++ ++msgid "Wifi" ++msgstr "Wifi" ++ ++msgid "Wireless" ++msgstr "" ++ ++msgid "Wireless Adapter" ++msgstr "Adapter Wayarles" ++ ++msgid "Wireless Network" ++msgstr "Rangkaian Wayarles" ++ ++msgid "Wireless Overview" ++msgstr "Gambaran keseluruhan Wayarles" ++ ++msgid "Wireless Security" ++msgstr "Keselamatan WLAN" ++ ++msgid "Wireless is disabled or not associated" ++msgstr "" ++ ++msgid "Wireless is restarting..." ++msgstr "" ++ ++msgid "Wireless network is disabled" ++msgstr "" ++ ++msgid "Wireless network is enabled" ++msgstr "" ++ ++msgid "Wireless restarted" ++msgstr "" ++ ++msgid "Wireless shut down" ++msgstr "" ++ ++msgid "Write received DNS requests to syslog" ++msgstr "" ++ ++msgid "XR Support" ++msgstr "Sokongan XR" ++ ++msgid "" ++"You can enable or disable installed init scripts here. Changes will applied " ++"after a device reboot.
    Warning: If you disable essential init " ++"scripts like \"network\", your device might become inaccessible!" ++msgstr "" ++ ++msgid "" ++"You must enable Java Script in your browser or LuCI will not work properly." ++msgstr "" ++ ++msgid "" ++"Your Internet Explorer is too old to display this page correctly. Please " ++"upgrade it to at least version 7 or use another browser like Firefox, Opera " ++"or Safari." ++msgstr "" ++ ++msgid "any" ++msgstr "" ++ ++msgid "auto" ++msgstr "auto" ++ ++msgid "automatic" ++msgstr "automatik" ++ ++msgid "baseT" ++msgstr "" ++ ++msgid "bridged" ++msgstr "" ++ ++msgid "create:" ++msgstr "" ++ ++msgid "creates a bridge over specified interface(s)" ++msgstr "mencipta jambatan di antara muka tertentu" ++ ++msgid "dB" ++msgstr "" ++ ++msgid "dBm" ++msgstr "" ++ ++msgid "disable" ++msgstr "mematikan" ++ ++msgid "disabled" ++msgstr "" ++ ++msgid "expired" ++msgstr "" ++ ++msgid "" ++"file where given DHCP-leases will be stored" ++msgstr "fail dimana DHCP-sewa akan disimpan" ++ ++msgid "forward" ++msgstr "" ++ ++msgid "full-duplex" ++msgstr "" ++ ++msgid "half-duplex" ++msgstr "" ++ ++msgid "help" ++msgstr "Membantu" ++ ++msgid "hidden" ++msgstr "" ++ ++msgid "hybrid mode" ++msgstr "" ++ ++msgid "if target is a network" ++msgstr "jika target itu ialah rangkaian" ++ ++msgid "input" ++msgstr "" ++ ++msgid "kB" ++msgstr "" ++ ++msgid "kB/s" ++msgstr "" ++ ++msgid "kbit/s" ++msgstr "" ++ ++msgid "local DNS file" ++msgstr "Fail DNS tempatan" ++ ++msgid "minimum 1280, maximum 1480" ++msgstr "" ++ ++msgid "navigation Navigation" ++msgstr "" ++ ++msgid "no" ++msgstr "" ++ ++msgid "no link" ++msgstr "" ++ ++msgid "none" ++msgstr "tidak ada" ++ ++msgid "not present" ++msgstr "" ++ ++msgid "off" ++msgstr "" ++ ++msgid "on" ++msgstr "" ++ ++msgid "open" ++msgstr "" ++ ++msgid "overlay" ++msgstr "" ++ ++msgid "relay mode" ++msgstr "" ++ ++msgid "routed" ++msgstr "" ++ ++msgid "server mode" ++msgstr "" ++ ++msgid "skiplink1 Skip to navigation" ++msgstr "" ++ ++msgid "skiplink2 Skip to content" ++msgstr "" ++ ++msgid "stateful-only" ++msgstr "" ++ ++msgid "stateless" ++msgstr "" ++ ++msgid "stateless + stateful" ++msgstr "" ++ ++msgid "tagged" ++msgstr "" ++ ++msgid "unknown" ++msgstr "" ++ ++msgid "unlimited" ++msgstr "" ++ ++msgid "unspecified" ++msgstr "" ++ ++msgid "unspecified -or- create:" ++msgstr "Tidak dirinci -atau- buat:" ++ ++msgid "untagged" ++msgstr "" ++ ++msgid "yes" ++msgstr "" ++ ++msgid "« Back" ++msgstr "« Kembali" ++ ++#~ msgid "Frequency Hopping" ++#~ msgstr "Melompat Frekuensi" ++ ++#~ msgid "Active Leases" ++#~ msgstr "Penyewaan Aktif" ++ ++#~ msgid "MAC" ++#~ msgstr "Alamat MAC" ++ ++#~ msgid "Encr." ++#~ msgstr "Vers." ++ ++#~ msgid "WLAN-Scan" ++#~ msgstr "WLAN-Scan" ++ ++#~ msgid "Create Network" ++#~ msgstr "Buat Jaringan" ++ ++#~ msgid "Link" ++#~ msgstr "Link" ++ ++#~ msgid "Networks" ++#~ msgstr "Rangkaian" ++ ++#~ msgid "Power" ++#~ msgstr "Daya" ++ ++#~ msgid "Wifi networks in your local environment" ++#~ msgstr "Rangkaian wifi di lingkungan tempatan" ++ ++#~ msgid "" ++#~ "CIDR-Notation: " ++#~ "address/prefix" ++#~ msgstr "CIDR-Notation: Adresse/Prefix" ++ ++#~ msgid "DNS-Server" ++#~ msgstr "DNS-Server" ++ ++#~ msgid "IPv4-Broadcast" ++#~ msgstr "IPv4-Siaran" ++ ++#~ msgid "IPv6-Address" ++#~ msgstr "IPv6-Alamat" ++ ++#~ msgid "IPv6 Setup" ++#~ msgstr "Setup IPv6" ++ ++#~ msgid "" ++#~ "The network ports on your router can be combined to several VLANs in which computers can " ++#~ "communicate directly with each other. VLANs are often used to separate different network " ++#~ "segments. Often there is by default one Uplink port for a connection to " ++#~ "the next greater network like the internet and other ports for a local " ++#~ "network." ++#~ msgstr "" ++#~ "Rangkaian port pada router anda boleh digabungkan untuk beberapa VLAN di " ++#~ "mana komputer dapat berkomunikasi secara langsung dengan satu sama lain. " ++#~ "VLAN sering digunakan untuk memisahkan segmen rangkaian yang berbeza. " ++#~ "Seringkali ada secara default satu port Uplink untuk sambungan kepada " ++#~ "rangkaian yang lebih besar seterusnya seperti internet dan port lain " ++#~ "untuk rangkaian tempatan." ++ ++#~ msgid "Files to be kept when flashing a new firmware" ++#~ msgstr "Fail yang akan disimpan saat flash firmware baru" ++ ++#~ msgid "General" ++#~ msgstr "Umum" ++ ++#~ msgid "" ++#~ "Here you can customize the settings and the functionality of LuCI." ++#~ msgstr "Di sini anda boleh melaraskan tetapan dan fungsi Luci" ++ ++#~ msgid "Post-commit actions" ++#~ msgstr "UCI-komit tindakan" ++ ++#~ msgid "" ++#~ "These commands will be executed automatically when a given UCI configuration is committed " ++#~ "allowing changes to be applied instantly." ++#~ msgstr "" ++#~ "Perintah-perintah ini akan dijalankan secara automatik apabila tatarajah " ++#~ "UCI diberikan komited membolehkan perubahan yang akan diterapkan langsung." ++ ++#~ msgid "Web UI" ++#~ msgstr "Antarmuka pengguna Web" ++ ++#~ msgid "PPTP-Server" ++#~ msgstr "" ++#~ "PPTP-Server" ++ ++#~ msgid "Access point (APN)" ++#~ msgstr "Pusat akses (APN)" ++ ++#~ msgid "Additional pppd options" ++#~ msgstr "Pilihan Tambahan Pppd" ++ ++#~ msgid "Automatic Disconnect" ++#~ msgstr "Pemutusan automatik" ++ ++#~ msgid "Backup Archive" ++#~ msgstr "Arkib Sandaran" ++ ++#~ msgid "" ++#~ "Configure the local DNS server to use the name servers adverticed by the " ++#~ "PPP peer" ++#~ msgstr "" ++#~ "Mengkonfigurasi pelayan DNS tempatan untuk menggunakan pelayan nama " ++#~ "diiklan oleh rakan PPP" ++ ++#~ msgid "Connect script" ++#~ msgstr "Menyambung script" ++ ++#~ msgid "Create backup" ++#~ msgstr "Buat Sandaran" ++ ++#~ msgid "Disconnect script" ++#~ msgstr "Putuskan naskah" ++ ++#~ msgid "Edit package lists and installation targets" ++#~ msgstr "Edit senarai pakej dan target pemasangan" ++ ++#~ msgid "Enable IPv6 on PPP link" ++#~ msgstr "Aktifkan IPv6 di PPP link" ++ ++#~ msgid "Firmware image" ++#~ msgstr "Gambar Firmware" ++ ++#~ msgid "" ++#~ "Here you can backup and restore your router configuration and - if " ++#~ "possible - reset the router to the default settings." ++#~ msgstr "" ++#~ "Di sini anda boleh sandaran dan mengembalikan konfigurasi router dan - " ++#~ "jika mungkin - Reset router ke tetapan lalai." ++ ++#~ msgid "Installation targets" ++#~ msgstr "Target pemasangan" ++ ++#~ msgid "Keep configuration files" ++#~ msgstr "Simpan fail konfigurasi" ++ ++#~ msgid "Keep-Alive" ++#~ msgstr "Keep-Alive" ++ ++#~ msgid "" ++#~ "Let pppd replace the current default route to use the PPP interface after " ++#~ "successful connect" ++#~ msgstr "" ++#~ "Biarkan pppd menggantikan laluan asal saat ini untuk menggunakan " ++#~ "antaramuka PPP selepas berjaya menyambung" ++ ++#~ msgid "Let pppd run this script after establishing the PPP link" ++#~ msgstr "Biarkan pppd menjalankan naskah ini setelah menetapkan link PPP" ++ ++#~ msgid "Let pppd run this script before tearing down the PPP link" ++#~ msgstr "Biarkan pppd menjalankan naskah ini sebelum menghancurkan link PPP" ++ ++#~ msgid "" ++#~ "Make sure that you provide the correct pin code here or you might lock " ++#~ "your sim card!" ++#~ msgstr "" ++#~ "Pastikan bahawa anda mempunyai kod pin yang sah. Kalau tidak anda mungkin " ++#~ "akan terkunci kad sim anda!" ++ ++#~ msgid "" ++#~ "Most of them are network servers, that offer a certain service for your " ++#~ "device or network like shell access, serving webpages like LuCI, doing mesh routing, sending " ++#~ "e-mails, ..." ++#~ msgstr "" ++#~ "Kebanyakan dari mereka adalah pelayan rangkaian, yang menawarkan " ++#~ "perkhidmatan tertentu untuk peranti anda atau rangkaian seperti akses " ++#~ "shell, melayani laman web seperti LuCI, melakukan mesh routing, " ++#~ "menghantar e-mel, dan lain-lain" ++ ++#~ msgid "Number of failed connection tests to initiate automatic reconnect" ++#~ msgstr "" ++#~ "Jumlah ujian sambungan gagal sebelum memulakan semula sambungan automatik" ++ ++#~ msgid "PIN code" ++#~ msgstr "PIN-Code" ++ ++#~ msgid "PPP Settings" ++#~ msgstr "Tetapan PPP" ++ ++#~ msgid "Package lists" ++#~ msgstr "Senarai pakej" ++ ++#~ msgid "Proceed reverting all settings and resetting to firmware defaults?" ++#~ msgstr "Teruskan mengembalikan semua tatacara dan ulang ke firmware asal?" ++ ++#~ msgid "Processor" ++#~ msgstr "Processor" ++ ++#~ msgid "Radius-Port" ++#~ msgstr "Radius-Port" ++ ++#~ msgid "Radius-Server" ++#~ msgstr "Radius-Server" ++ ++#~ msgid "Replace default route" ++#~ msgstr "Tukar laluan asal" ++ ++#~ msgid "Reset router to defaults" ++#~ msgstr "Reset router ke tetapan lalai" ++ ++#~ msgid "" ++#~ "Seconds to wait for the modem to become ready before attempting to connect" ++#~ msgstr "" ++#~ "Detik untuk menunggu modem bersedia sebelum mencuba untuk menyambung" ++ ++#~ msgid "Service type" ++#~ msgstr "Jenis Perkhidmatan" ++ ++#~ msgid "Services and daemons perform certain tasks on your device." ++#~ msgstr "" ++#~ "Perkhidmatan dan daemon melakukan tugas tertentu dalam peranti anda." ++ ++#~ msgid "Settings" ++#~ msgstr "Tetapan" ++ ++#~ msgid "Setup wait time" ++#~ msgstr "Menetapkan masa menunggu" ++ ++#~ msgid "" ++#~ "Sorry. OpenWrt does not support a system upgrade on this platform.
    " ++#~ "You need to manually flash your device." ++#~ msgstr "" ++#~ "Maafkan. OpenWRT tidak menyokong meningkatkan sistem pada peron ini.
    Anda perlu flash peranti anda secara manual." ++ ++#~ msgid "Specify additional command line arguments for pppd here" ++#~ msgstr "Tentukan arahan tambahan untuk pppd di sini" ++ ++#~ msgid "The device node of your modem, e.g. /dev/ttyUSB0" ++#~ msgstr "Node peranti modem anda, contohnya /dev/ttyUSB0" ++ ++#~ msgid "Time (in seconds) after which an unused connection will be closed" ++#~ msgstr "" ++#~ "Waktu (dalam detik) selepas mana sambungan yang tidak terpakai akan " ++#~ "ditutup" ++ ++#~ msgid "Update package lists" ++#~ msgstr "Mengemas kini senarai pakej" ++ ++#~ msgid "Upload an OpenWrt image file to reflash the device." ++#~ msgstr "Upload fail gambar OpenWRT untuk flash semula peranti." ++ ++#~ msgid "Upload image" ++#~ msgstr "Upload fail gambar" ++ ++#~ msgid "Use peer DNS" ++#~ msgstr "Guna rakan DNS" ++ ++#~ msgid "" ++#~ "You need to install \"comgt\" for UMTS/GPRS, \"ppp-mod-pppoe\" for PPPoE, " ++#~ "\"ppp-mod-pppoa\" for PPPoA or \"pptp\" for PPtP support" ++#~ msgstr "" ++#~ "Anda perlu memasang \"comgt\" untuk UMTS/GPRS, \"ppp-mod-pppoe\" untuk " ++#~ "PPPoE, \"ppp-mod-pppoa\" untuk PPPoA atau \"pptp\" untuk sokongan PPtP" ++ ++#~ msgid "back" ++#~ msgstr "kembali" ++ ++#~ msgid "buffered" ++#~ msgstr "buffer" ++ ++#~ msgid "cached" ++#~ msgstr "cache" ++ ++#~ msgid "free" ++#~ msgstr "Membebaskan" ++ ++#~ msgid "static" ++#~ msgstr "statik" ++ ++#~ msgid "" ++#~ "LuCI is a collection " ++#~ "of free Lua software including an MVC-Webframework and webinterface for embedded devices. LuCI is licensed under the " ++#~ "Apache-License." ++#~ msgstr "" ++#~ "Luci adalah kumpulan perisian bebas Lua termasuk MVC-Kerangka dan muka " ++#~ "web untuk peranti embedded. LuCI di lesen Lesen Apache." ++ ++#~ msgid "SSH-Keys" ++#~ msgstr "SSH-Kunci" ++ ++#~ msgid "" ++#~ "A lightweight HTTP/1.1 webserver written in C and Lua designed to serve " ++#~ "LuCI" ++#~ msgstr "" ++#~ "Sebuah webserver HTTP/1.1 ringan ditulis dalam C dan Lua direka untuk " ++#~ "melayani Luci" ++ ++#~ msgid "" ++#~ "A small webserver which can be used to serve LuCI." ++#~ msgstr "" ++#~ "Sebuah webserver kecil yang boleh digunakan untuk melayani muka " ++#~ "Konfigurasi Lua LuCI" ++ ++#~ msgid "About" ++#~ msgstr "Tentang" ++ ++#~ msgid "Addresses" ++#~ msgstr "Alamat" ++ ++#~ msgid "Admin Password" ++#~ msgstr "Kata Laluan Admin" ++ ++#~ msgid "Alias" ++#~ msgstr "Alias" ++ ++#~ msgid "Authentication Realm" ++#~ msgstr "Anmeldeaufforderung" ++ ++#~ msgid "Bridge Port" ++#~ msgstr "Bridge Port" ++ ++#~ msgid "" ++#~ "Change the password of the system administrator (User root)" ++#~ msgstr "Mengubah kata laluan sistem pentadbir (User \"root\")" ++ ++#~ msgid "Client + WDS" ++#~ msgstr "Pelanggan + WDS" ++ ++#~ msgid "Configuration file" ++#~ msgstr "fail konfigurasi" ++ ++#~ msgid "Connection timeout" ++#~ msgstr "Sambungan timeout" ++ ++#~ msgid "Contributing Developers" ++#~ msgstr "Menyumbang Pengembang" ++ ++#~ msgid "DHCP assigned" ++#~ msgstr "DHCP ditugaskan" ++ ++#~ msgid "Document root" ++#~ msgstr "Dokumen root" ++ ++#~ msgid "Enable Keep-Alive" ++#~ msgstr "Aktifkan Keep-Alive" ++ ++#~ msgid "Ethernet Bridge" ++#~ msgstr "Jambatan Ethernet" ++ ++#~ msgid "" ++#~ "Here you can paste public SSH-Keys " ++#~ "(one per line) for SSH public-key " ++#~ "authentication." ++#~ msgstr "Di sini anda boleh memasukkan kunci awam SSH untuk pengesahan." ++ ++#~ msgid "ID" ++#~ msgstr "ID" ++ ++#~ msgid "IP Configuration" ++#~ msgstr "Konfigurasi IP" ++ ++#~ msgid "Interface Status" ++#~ msgstr "Status Interface" ++ ++#~ msgid "Lead Development" ++#~ msgstr "Pemimpin Pengembangan" ++ ++#~ msgid "Master" ++#~ msgstr "Master" ++ ++#~ msgid "Master + WDS" ++#~ msgstr "Master + WDS" ++ ++#~ msgid "Not configured" ++#~ msgstr "Belum dikonfigurasikan" ++ ++#~ msgid "Password successfully changed" ++#~ msgstr "Kata laluan berjaya ditukar" ++ ++#~ msgid "Plugin path" ++#~ msgstr "Tunjuk locasi Plugin" ++ ++#~ msgid "Ports" ++#~ msgstr "Ports" ++ ++#~ msgid "Primary" ++#~ msgstr "Primary" ++ ++#~ msgid "Project Homepage" ++#~ msgstr "Tapak Web Projek" ++ ++#~ msgid "Pseudo Ad-Hoc" ++#~ msgstr "Pseudo-Ad-Hoc (Atheros)" ++ ++#~ msgid "STP" ++#~ msgstr "Spanning-Tree-Protokol" ++ ++#~ msgid "Thanks To" ++#~ msgstr "Terima Kasih kepada" ++ ++#~ msgid "" ++#~ "The realm which will be displayed at the authentication prompt for " ++#~ "protected pages." ++#~ msgstr "" ++#~ "Wilayah yang akan dipaparkan di pengesahan prompt untuk laman yang " ++#~ "dilindungi." ++ ++#~ msgid "Unknown Error" ++#~ msgstr "Kesalahan tidak diketahui" ++ ++#~ msgid "VLAN" ++#~ msgstr "VLAN" ++ ++#~ msgid "defaults to /etc/httpd.conf" ++#~ msgstr "defaultnya /etc/httpd.conf" ++ ++#~ msgid "OPKG error code %i" ++#~ msgstr "OPKG kod kesalahan %i" ++ ++#~ msgid "Package lists updated" ++#~ msgstr "Senarai pakej dikemaskini" ++ ++#~ msgid "Upgrade installed packages" ++#~ msgstr "Mengemas kini pakej dipasang" ++ ++#~ msgid "" ++#~ "Also kernel or service logfiles can be viewed here to get an overview " ++#~ "over their current state." ++#~ msgstr "" ++#~ "kernel atau perkhidmatan logfiles yang juga dapat dilihat di sini untuk " ++#~ "mendapatkan gambaran atassituasi kini." ++ ++#~ msgid "" ++#~ "Here you can find information about the current system status like CPU clock frequency, memory " ++#~ "usage or network interface data." ++#~ msgstr "" ++#~ "Di sini anda dapat mencari maklumat tentang sistem saat ini status " ++#~ "seperti frekuensi masa CPU, penggunaan memori atau antara muka rangkaian " ++#~ "data." ++ ++#~ msgid "Search file..." ++#~ msgstr "Cari fail ..." ++ ++#~ msgid "" ++#~ "LuCI is a free, " ++#~ "flexible, and user friendly graphical interface for configuring OpenWrt " ++#~ "Kamikaze." ++#~ msgstr "" ++#~ "LuCI adalah percuma, fleksibel, dan mempunyai muka pengguna grafik yang " ++#~ "ramah untuk mengkonfigurasikan OpenWRT Kamikaze." ++ ++#~ msgid "And now have fun with your router!" ++#~ msgstr "Nikmati router anda!" ++ ++#~ msgid "" ++#~ "As we always want to improve this interface we are looking forward to " ++#~ "your feedback and suggestions." ++#~ msgstr "" ++#~ "Kami ingin selalu memperbaiki interface ini, kita berharap memperolehi " ++#~ "tanggapan dan cadangan anda" ++ ++#~ msgid "Hello!" ++#~ msgstr "Halo!" ++ ++#~ msgid "" ++#~ "Notice: In LuCI " ++#~ "changes have to be confirmed by clicking Changes - Save & Apply " ++#~ "before being applied." ++#~ msgstr "" ++#~ "Perhatikan: Pada perubahan Luci harus disahkan dengan mengklik Laman - " ++#~ "Simpan & terap sebelum perubahan diterapkan" ++ ++#~ msgid "" ++#~ "On the following pages you can adjust all important settings of your " ++#~ "router." ++#~ msgstr "" ++#~ "Pada halaman berikut, anda boleh menetapkan semua tatacara penting dari " ++#~ "router anda." ++ ++#~ msgid "The LuCI Team" ++#~ msgstr "Pasukan LuCI" ++ ++#~ msgid "" ++#~ "This is the administration area of LuCI." ++#~ msgstr "Ini adalah wilayah pentadbiran LuCI." ++ ++#~ msgid "User Interface" ++#~ msgstr "Antara muka pengguna" ++ ++#~ msgid "enable" ++#~ msgstr "membolehkan" ++ ++#~ msgid "(hidden)" ++#~ msgstr "(tersembunyi)" ++ ++#~ msgid "(optional)" ++#~ msgstr "(pilihan)" ++ ++#~ msgid "DNS-Port" ++#~ msgstr "DNS-Port" ++ ++#~ msgid "" ++#~ "DNS-Server will be queried in " ++#~ "the order of the resolvfile" ++#~ msgstr "" ++#~ "DNS-Pelayan akan dipertanyakan pada urutan menyelesaikan jumlah fail" ++ ++#~ msgid "" ++#~ "max. DHCP-Leases" ++#~ msgstr "maksimum DHCP untuk disewa" ++ ++#~ msgid "" ++#~ "max. EDNS0 packet size" ++#~ msgstr "" ++#~ "maksimum EDNS.0 " ++#~ "saiz paket" ++ ++#~ msgid "AP-Isolation" ++#~ msgstr "AP-Isolasi" ++ ++#~ msgid "Add the Wifi network to physical network" ++#~ msgstr "Tambah rangkaian Wifi ke rangkaian fizikal" ++ ++#~ msgid "Aliases" ++#~ msgstr "Aliases" ++ ++#~ msgid "Attach to existing network" ++#~ msgstr "Lampir rangkaian yang ada" ++ ++#~ msgid "Clamp Segment Size" ++#~ msgstr "Saiz Klip Segmen" ++ ++#, fuzzy ++#~ msgid "Create Or Attach Network" ++#~ msgstr "Buat Atau Lampir Rangkaian" ++ ++#~ msgid "DHCP" ++#~ msgstr "DHCP" ++ ++#~ msgid "Devices" ++#~ msgstr "Alat" ++ ++#~ msgid "Don't forward reverse lookups for local networks" ++#~ msgstr "Jangan hantar reverse lookup untuk rangkaian tempatan" ++ ++#~ msgid "Enable TFTP-Server" ++#~ msgstr "Aktifkan Tftp Server" ++ ++#~ msgid "Errors" ++#~ msgstr "Kesalahan" ++ ++#~ msgid "Essentials" ++#~ msgstr "Keperluan" ++ ++#~ msgid "Expand Hosts" ++#~ msgstr "Memperluaskan Host" ++ ++#~ msgid "First leased address" ++#~ msgstr "Alamat sewaan pertama" ++ ++#~ msgid "" ++#~ "Fixes problems with unreachable websites, submitting forms or other " ++#~ "unexpected behaviour for some ISPs." ++#~ msgstr "" ++#~ "Perbaikan masalah hubungan dengan laman web, menghantar bentuk atau " ++#~ "lainnya perilaku ISP yang tak terduga." ++ ++#~ msgid "Hardware Address" ++#~ msgstr "Alamat Peranti" ++ ++#~ msgid "Here you can configure installed wifi devices." ++#~ msgstr "Di sini anda boleh mengkonfigurasi peranti wifi dipasang." ++ ++#~ msgid "" ++#~ "If the interface is attached to an existing network it will be " ++#~ "bridged to the existing interfaces and is covered by the " ++#~ "firewall zone of the choosen network.
    Uncheck the attach option to " ++#~ "define a new standalone network for this interface." ++#~ msgstr "" ++#~ "Jika antara muka dipasang ke rangkaian yang ada akan dijembatani kepada " ++#~ "antara muka yang ada dan ditutupi oleh zon firewall dari rangkaian yang " ++#~ "dipilih. Hapus tanda pada pilihan untuk menentukan melampirkan rangkaian " ++#~ "mandiri baru untuk antara muka ini." ++ ++#~ msgid "Ignore /etc/hosts" ++#~ msgstr "Mengabaikan /etc/hosts" ++ ++#~ msgid "Independent (Ad-Hoc)" ++#~ msgstr "(Ad-Hoc) Tersendiri" ++ ++#~ msgid "Internet Connection" ++#~ msgstr "Sambungan Internet" ++ ++#~ msgid "Join (Client)" ++#~ msgstr "Gabung dengan (Client)" ++ ++#~ msgid "Leases" ++#~ msgstr "Penyewaan" ++ ++#~ msgid "Local Domain" ++#~ msgstr "Domain Tempatan" ++ ++#~ msgid "Local Network" ++#~ msgstr "Rangkaian Tempatan" ++ ++#~ msgid "Local Server" ++#~ msgstr "Server Tempatan" ++ ++#~ msgid "Network Boot Image" ++#~ msgstr "Boot fail gambar rangkaian" ++ ++#~ msgid "" ++#~ "Network Name (ESSID)" ++#~ msgstr "Nama Rangkaian (ESSID)" ++ ++#~ msgid "Network to attach interface to" ++#~ msgstr "Rangkaian untuk melampirkan antara muka ke" ++ ++#~ msgid "Number of leased addresses" ++#~ msgstr "Jumlah alamat disewakan" ++ ++#~ msgid "Perform Actions" ++#~ msgstr "Lakukan Tindakan" ++ ++#~ msgid "Prevents Client to Client communication" ++#~ msgstr "Mencegah komunikasi sesama Pelanggan" ++ ++#~ msgid "Provide (Access Point)" ++#~ msgstr "Menyediakan (Access Point)" ++ ++#~ msgid "Resolvfile" ++#~ msgstr "Resolvfail" ++ ++#~ msgid "TFTP-Server Root" ++#~ msgstr "TFTP-Server Root" ++ ++#~ msgid "TX / RX" ++#~ msgstr "TX / RX" ++ ++#~ msgid "The following changes have been applied" ++#~ msgstr "Laman berikut telah dilaksanakan" ++ ++#~ msgid "" ++#~ "When flashing a new firmware with LuCI these files will be added to the new firmware " ++#~ "installation." ++#~ msgstr "" ++#~ "Ketika flash firmware baru dengan LuCI semua fail akan ditambah ketika " ++#~ "pemasangan firmware baru." ++ ++#~ msgid "Wireless Scan" ++#~ msgstr "WLAN-Scan" ++ ++#~ msgid "" ++#~ "With DHCP " ++#~ "network members can automatically receive their network settings (IP-address, netmask, DNS-server, ...)." ++#~ msgstr "" ++#~ "Dengan rangkaian DHCP ahli boleh menerima tetapan rangkaian Alamat-IP, Awalan, Pelayan-DNS, dan lain-lain secara automatik" ++ ++#~ msgid "" ++#~ "You are about to join the wireless network %s. " ++#~ "In order to complete the process, you need to provide some additional " ++#~ "details." ++#~ msgstr "" ++#~ "Anda akan menyertai rangkaian wayarles %s.Untuk " ++#~ "melengkapkan proses, anda perlu memberi beberapa butiran tambahan." ++ ++#~ msgid "" ++#~ "You can run several wifi networks with one device. Be aware that there " ++#~ "are certain hardware and driverspecific restrictions. Normally you can " ++#~ "operate 1 Ad-Hoc or up to 3 Master-Mode and 1 Client-Mode network " ++#~ "simultaneously." ++#~ msgstr "" ++#~ "Anda boleh menjalankan beberapa rangkaian wifi dengan satu peranti. Perlu " ++#~ "diketahui bahawa ada peranti keras tertentu dan sekatan driverspecific. " ++#~ "Biasanya anda boleh beroperasi 1 Ad-Hoc atau sampai dengan 3 Master-Mode " ++#~ "dan 1 Client-Mode rangkaian secara serentak." ++ ++#~ msgid "" ++#~ "You need to install \"ppp-mod-pppoe\" for PPPoE or \"pptp\" for PPtP " ++#~ "support" ++#~ msgstr "" ++#~ "Anda perlu memasang \"ppp-mod-pppoe\" untuk PPPoE atau \"pptp\" untuk " ++#~ "sokongan PPtP" ++ ++#~ msgid "" ++#~ "You need to install wpa-supplicant to use WPA!" ++#~ msgstr "" ++#~ "Anda perlu memasang pemohan-wpa untuk " ++#~ "menggunakan WPA!" ++ ++#~ msgid "" ++#~ "You need to install the Broadcom nas supplicant " ++#~ "to use WPA!" ++#~ msgstr "" ++#~ "Anda perlu memasang pemohan Broadcom nas untuk " ++#~ "menggunakan WPA!" ++ ++#~ msgid "Zone" ++#~ msgstr "Zon" ++ ++#~ msgid "additional hostfile" ++#~ msgstr "tambahan hostfail" ++ ++#~ msgid "adds domain names to hostentries in the resolv file" ++#~ msgstr "Menambah nama domain ke hostentries di resolv fail" ++ ++#~ msgid "automatically reconnect" ++#~ msgstr "menyambung semula secara automatik" ++ ++#~ msgid "concurrent queries" ++#~ msgstr "konkuren query" ++ ++#~ msgid "" ++#~ "disable DHCP " ++#~ "for this interface" ++#~ msgstr "mematikan DHCP untuk antara muka ini" ++ ++#~ msgid "disconnect when idle for" ++#~ msgstr "menamatkan sambungan apabila diam selama" ++ ++#~ msgid "don't cache unknown" ++#~ msgstr "jangan cache yang tidak diketahui" ++ ++#~ msgid "" ++#~ "filter useless DNS-queries of " ++#~ "Windows-systems" ++#~ msgstr "menapis soalan-DNS yang tidak berguna untuk Windows-sistem" ++ ++#~ msgid "installed" ++#~ msgstr "dipasang" ++ ++#~ msgid "localises the hostname depending on its subnet" ++#~ msgstr "Menempatkan nama host yang bergantung pada subnetnya" ++ ++#~ msgid "manual" ++#~ msgstr "manual" ++ ++#~ msgid "not installed" ++#~ msgstr "tidak dipasang" ++ ++#~ msgid "" ++#~ "prevents caching of negative DNS-replies" ++#~ msgstr "mencegah caching untuk balasan negatif dari DNS" ++ ++#~ msgid "query port" ++#~ msgstr "penyoalan port" ++ ++#~ msgid "transmitted / received" ++#~ msgstr "dihantar / diterima" ++ ++#, fuzzy ++#~ msgid "Join network" ++#~ msgstr "Gabung rangkaian" ++ ++#~ msgid "all" ++#~ msgstr "semua" ++ ++#~ msgid "Code" ++#~ msgstr "Kod" ++ ++#~ msgid "Distance" ++#~ msgstr "Jarak" ++ ++#~ msgid "Legend" ++#~ msgstr "Legenda" ++ ++#~ msgid "Library" ++#~ msgstr "Perpustakaan" ++ ++#~ msgid "see '%s' manpage" ++#~ msgstr "Rujuk '%s' manpage" ++ ++#~ msgid "Package Manager" ++#~ msgstr "Pengurus-Paket" ++ ++#~ msgid "Service" ++#~ msgstr "Servis" ++ ++#~ msgid "Statistics" ++#~ msgstr "Statistik" ++ ++#~ msgid "zone" ++#~ msgstr "Zon" +diff --git a/feeds/luci/modules/luci-base/po/no/base.po b/feeds/luci/modules/luci-base/po/no/base.po +new file mode 100644 +index 0000000..21176ed +--- /dev/null ++++ b/feeds/luci/modules/luci-base/po/no/base.po +@@ -0,0 +1,3914 @@ ++msgid "" ++msgstr "" ++"PO-Revision-Date: 2013-03-25 23:36+0200\n" ++"Last-Translator: protx \n" ++"Language: no\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n != 1);\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "(%d minute window, %d second interval)" ++msgstr "(%d minutters vindu, %d sekunds intervall)" ++ ++msgid "(%s available)" ++msgstr "(%s Tilgjengelig)" ++ ++msgid "(empty)" ++msgstr "(tom)" ++ ++msgid "(no interfaces attached)" ++msgstr "(ingen grensesnitt tilknyttet)" ++ ++msgid "-- Additional Field --" ++msgstr "-- Tilleggs Felt --" ++ ++msgid "-- Please choose --" ++msgstr "-- Vennligst velg --" ++ ++msgid "-- custom --" ++msgstr "-- egendefinert --" ++ ++msgid "-- match by device --" ++msgstr "" ++ ++msgid "-- match by label --" ++msgstr "" ++ ++msgid "1 Minute Load:" ++msgstr "1 minutts belastning:" ++ ++msgid "15 Minute Load:" ++msgstr "15 minutters belastning:" ++ ++msgid "5 Minute Load:" ++msgstr "5 minutters belastning:" ++ ++msgid "BSSID" ++msgstr "BSSID" ++ ++msgid "DNS query port" ++msgstr "DNS spørre port" ++ ++msgid "DNS server port" ++msgstr "DNS server port" ++ ++msgid "" ++"DNS servers will be queried in the " ++"order of the resolvfile" ++msgstr "" ++"DNS servere skal følge rekkefølgen " ++"i oppslagsfilen ved spørringer" ++ ++msgid "ESSID" ++msgstr "ESSID" ++ ++msgid "IPv4-Address" ++msgstr "IPv4-Adresse" ++ ++msgid "IPv4-Gateway" ++msgstr "IPv4-Gateway" ++ ++msgid "IPv4-Netmask" ++msgstr "IPv4-Nettmaske" ++ ++msgid "" ++"IPv6-Address or Network " ++"(CIDR)" ++msgstr "" ++"IPv6-Adresse eller " ++"Nettverk (CIDR)" ++ ++msgid "IPv6-Gateway" ++msgstr "IPv6-Gateway" ++ ++msgid "IPv6-Suffix (hex)" ++msgstr "" ++ ++msgid "LED Configuration" ++msgstr "LED Konfigurasjon" ++ ++msgid "LED Name" ++msgstr "LED Navn" ++ ++msgid "MAC-Address" ++msgstr "MAC-Adresse" ++ ++msgid "" ++"Max. DHCP leases" ++msgstr "" ++"Maksimalt antall DHCP leier" ++ ++msgid "" ++"Max. EDNS0 packet size" ++msgstr "" ++"Maks. EDNS0 pakke størrelse" ++ ++msgid "Max. concurrent queries" ++msgstr "Maks. samtidige spørringer" ++ ++msgid "%s - %s" ++msgstr "%s - %s" ++ ++msgid "ADSL" ++msgstr "" ++ ++msgid "ADSL Status" ++msgstr "" ++ ++msgid "AICCU (SIXXS)" ++msgstr "" ++ ++msgid "APN" ++msgstr "APN" ++ ++msgid "AR Support" ++msgstr "AR Støtte" ++ ++msgid "ARP retry threshold" ++msgstr "APR terskel for nytt forsøk" ++ ++msgid "ATM Bridges" ++msgstr "ATM Broer" ++ ++msgid "ATM Virtual Channel Identifier (VCI)" ++msgstr "" ++"ATM Virtuell kanal " ++"identifikator (VCI)" ++ ++msgid "ATM Virtual Path Identifier (VPI)" ++msgstr "" ++"ATM Virtuell plasserings " ++"identifikator (VPI)" ++ ++msgid "" ++"ATM bridges expose encapsulated ethernet in AAL5 connections as virtual " ++"Linux network interfaces which can be used in conjunction with DHCP or PPP " ++"to dial into the provider network." ++msgstr "" ++"ATM broer viser innkapslede ethernet i AAL5 forbindelser som virtuelle Linux-" ++"nettverk grensesnitt, dette kan brukes sammen med DHCP eller PPP for å koble " ++"seg mot en leverandørs nettverk." ++ ++msgid "ATM device number" ++msgstr "ATM enhetsnummer" ++ ++msgid "AYIYA" ++msgstr "" ++ ++msgid "Access Concentrator" ++msgstr "Tilgangskonsentrator" ++ ++msgid "Access Point" ++msgstr "Aksesspunkt" ++ ++msgid "Action" ++msgstr "Handling" ++ ++msgid "Actions" ++msgstr "Handlinger" ++ ++msgid "Activate this network" ++msgstr "Aktiver dette nettverket" ++ ++msgid "Active IPv4-Routes" ++msgstr "Aktive IPv4-Ruter" ++ ++msgid "Active IPv6-Routes" ++msgstr "Aktive IPv6-Ruter" ++ ++msgid "Active Connections" ++msgstr "Aktive Tilkoblinger" ++ ++msgid "Active DHCP Leases" ++msgstr "Aktive DHCP Leier" ++ ++msgid "Active DHCPv6 Leases" ++msgstr "Aktive DHCPv6 Leier" ++ ++msgid "Ad-Hoc" ++msgstr "Ad-Hoc (Uavhengig)" ++ ++msgid "Add" ++msgstr "Legg til" ++ ++msgid "Add local domain suffix to names served from hosts files" ++msgstr "Legg det lokale domenesuffikset til navn utgitt fra vertsfiler" ++ ++msgid "Add new interface..." ++msgstr "Legg til grensesnitt..." ++ ++msgid "Additional Hosts files" ++msgstr "Tilleggs vertsfiler" ++ ++msgid "Address" ++msgstr "Adresse" ++ ++msgid "Address to access local relay bridge" ++msgstr "Adresse for tilgang til lokal relébro" ++ ++msgid "Administration" ++msgstr "Administrasjon" ++ ++msgid "Advanced Settings" ++msgstr "Avanserte Innstillinger" ++ ++msgid "Alert" ++msgstr "Varsle" ++ ++msgid "Allow SSH password authentication" ++msgstr "Tillat SSH passord godkjenning" ++ ++msgid "Allow all except listed" ++msgstr "Tillat alle unntatt oppførte" ++ ++msgid "Allow listed only" ++msgstr "Tillat kun oppførte" ++ ++msgid "Allow localhost" ++msgstr "Tillat lokalvert" ++ ++msgid "Allow remote hosts to connect to local SSH forwarded ports" ++msgstr "Tillat eksterne verter å koble til lokale SSH videresendt porter" ++ ++msgid "Allow root logins with password" ++msgstr "Tillat root pålogginger med passord" ++ ++msgid "Allow the root user to login with password" ++msgstr "Tillat bruker root å logge inn med passord" ++ ++msgid "" ++"Allow upstream responses in the 127.0.0.0/8 range, e.g. for RBL services" ++msgstr "Tillat oppstrøms svar i 127.0.0.0/8 nettet, f.eks for RBL tjenester" ++ ++msgid "" ++"Also see Tunneling Comparison on SIXXS" ++msgstr "" ++ ++msgid "Always announce default router" ++msgstr "" ++ ++msgid "An additional network will be created if you leave this unchecked." ++msgstr "Et nytt nettverk vil bli opprettet hvis du tar bort haken." ++ ++msgid "Announce as default router even if no public prefix is available." ++msgstr "" ++ ++msgid "Announced DNS domains" ++msgstr "" ++ ++msgid "Announced DNS servers" ++msgstr "" ++ ++msgid "Antenna 1" ++msgstr "Antenne 1" ++ ++msgid "Antenna 2" ++msgstr "Antenne 2" ++ ++msgid "Antenna Configuration" ++msgstr "Antennekonfigurasjon" ++ ++msgid "Any zone" ++msgstr "Alle soner" ++ ++msgid "Apply" ++msgstr "Bruk" ++ ++msgid "Applying changes" ++msgstr "Utfører endringer" ++ ++msgid "" ++"Assign a part of given length of every public IPv6-prefix to this interface" ++msgstr "" ++ ++msgid "Assign interfaces..." ++msgstr "Tilknytt grensesnitt..." ++ ++msgid "" ++"Assign prefix parts using this hexadecimal subprefix ID for this interface." ++msgstr "" ++ ++msgid "Associated Stations" ++msgstr "Tilkoblede Klienter" ++ ++msgid "Atheros 802.11%s Wireless Controller" ++msgstr "Atheros 802.11%s Trådløs Kontroller" ++ ++msgid "AuthGroup" ++msgstr "" ++ ++msgid "Authentication" ++msgstr "Godkjenning" ++ ++msgid "Authoritative" ++msgstr "Autoritativ" ++ ++msgid "Authorization Required" ++msgstr "Autorisasjon er nødvendig" ++ ++msgid "Auto Refresh" ++msgstr "Automatisk oppdatering" ++ ++msgid "Automatic" ++msgstr "" ++ ++msgid "Automatic Homenet (HNCP)" ++msgstr "" ++ ++msgid "Available" ++msgstr "Tilgjengelig" ++ ++msgid "Available packages" ++msgstr "Tilgjengelige pakker" ++ ++msgid "Average:" ++msgstr "Gjennomsnitt:" ++ ++msgid "BSSID" ++msgstr "BSSID" ++ ++msgid "Back" ++msgstr "Tilbake" ++ ++msgid "Back to Overview" ++msgstr "Tilbake til oversikt" ++ ++msgid "Back to configuration" ++msgstr "Tilbake til konfigurasjon" ++ ++msgid "Back to overview" ++msgstr "Tilbake til oversikt" ++ ++msgid "Back to scan results" ++msgstr "Tilbake til skanne resultat" ++ ++msgid "Background Scan" ++msgstr "Bakgrunns Skanning" ++ ++msgid "Backup / Flash Firmware" ++msgstr "Sikkerhetskopiering/Firmware oppgradering" ++ ++msgid "Backup / Restore" ++msgstr "Sikkerhetskopi/Gjenoppretting" ++ ++msgid "Backup file list" ++msgstr "Sikkerhetskopier filliste" ++ ++msgid "Bad address specified!" ++msgstr "Ugyldig adresse oppgitt!" ++ ++msgid "Band" ++msgstr "" ++ ++msgid "Behind NAT" ++msgstr "" ++ ++msgid "" ++"Below is the determined list of files to backup. It consists of changed " ++"configuration files marked by opkg, essential base files and the user " ++"defined backup patterns." ++msgstr "" ++"Nedenfor er listen med filer som blir sikkerthetskopiert. Listen består av " ++"konfigurasjonsfiler som er merket av opkg, essensielle enhets filer og andre " ++"filer valgt av bruker." ++ ++msgid "Bitrate" ++msgstr "Bitrate" ++ ++msgid "Bogus NX Domain Override" ++msgstr "Overstyr falske NX Domener" ++ ++msgid "Bridge" ++msgstr "Bro" ++ ++msgid "Bridge interfaces" ++msgstr "Sammenkoble grensesnitt" ++ ++msgid "Bridge unit number" ++msgstr "Bro enhetsnummer" ++ ++msgid "Bring up on boot" ++msgstr "Slå på ved oppstart" ++ ++msgid "Broadcom 802.11%s Wireless Controller" ++msgstr "Broadcom 802.11%s Trådløs Kontroller" ++ ++msgid "Broadcom BCM%04x 802.11 Wireless Controller" ++msgstr "Broadcom BCM%04x 802.11 Trådløs Kontroller" ++ ++msgid "Buffered" ++msgstr "Bufret" ++ ++msgid "Buttons" ++msgstr "Knapper" ++ ++msgid "CA certificate; if empty it will be saved after the first connection." ++msgstr "" ++ ++msgid "CPU" ++msgstr "CPU" ++ ++msgid "CPU usage (%)" ++msgstr "CPU forbruk (%)" ++ ++msgid "Cancel" ++msgstr "Avbryt" ++ ++msgid "Category" ++msgstr "" ++ ++msgid "Chain" ++msgstr "Lenke" ++ ++msgid "Changes" ++msgstr "Endringer" ++ ++msgid "Changes applied." ++msgstr "Endringer utført." ++ ++msgid "Changes the administrator password for accessing the device" ++msgstr "Endrer administrator passordet for tilgang til enheten" ++ ++msgid "Channel" ++msgstr "Kanal" ++ ++msgid "Check" ++msgstr "Kontroller" ++ ++msgid "Checksum" ++msgstr "Kontrollsum" ++ ++msgid "" ++"Choose the firewall zone you want to assign to this interface. Select " ++"unspecified to remove the interface from the associated zone or " ++"fill out the create field to define a new zone and attach the " ++"interface to it." ++msgstr "" ++"Velg brannmur sonen du ønsker å knytte til dette grensesnittet. Velg " ++"uspesifisert for å fjerne grensesnittet fra den tilknyttede sonen. " ++"Eller fyll ut Opprett feltet for å definere en ny sone og tilknytte " ++"grensesnittet til det." ++ ++msgid "" ++"Choose the network(s) you want to attach to this wireless interface or fill " ++"out the create field to define a new network." ++msgstr "" ++"Velg det eller de nettverk du vil legge til dette trådløse grensesnittet, " ++"eller fyll ut Opprett feltet for å definere et nytt nettverk." ++ ++msgid "Cipher" ++msgstr "Krypteringsmetode" ++ ++msgid "" ++"Click \"Generate archive\" to download a tar archive of the current " ++"configuration files. To reset the firmware to its initial state, click " ++"\"Perform reset\" (only possible with squashfs images)." ++msgstr "" ++"Klikk \"Opprett arkiv\" for å laste ned et tar arkiv av de gjeldende " ++"konfigurasjons filer. For å nullstille firmwaren til opprinnelig tilstand, " ++"klikker du på \"Utfør nullstilling\" (kun mulig på squashfs firmwarer)." ++ ++msgid "Client" ++msgstr "Klient" ++ ++msgid "Client ID to send when requesting DHCP" ++msgstr "Klient ID som sendes ved DHCP spørring" ++ ++msgid "" ++"Close inactive connection after the given amount of seconds, use 0 to " ++"persist connection" ++msgstr "" ++"Lukk inaktiver tilkoblinger etter angitt antall sekunder, bruk 0 for en " ++"kontinuerlig tilkobling" ++ ++msgid "Close list..." ++msgstr "Lukk liste..." ++ ++msgid "Collecting data..." ++msgstr "Henter data..." ++ ++msgid "Command" ++msgstr "Kommando" ++ ++msgid "Common Configuration" ++msgstr "Vanlige Innstillinger" ++ ++msgid "Compression" ++msgstr "Komprimering" ++ ++msgid "Configuration" ++msgstr "Konfigurasjon" ++ ++msgid "Configuration applied." ++msgstr "Konfigurasjons endring utført." ++ ++msgid "Configuration files will be kept." ++msgstr "Konfigurasjonsfiler vil bli bevart." ++ ++msgid "Confirmation" ++msgstr "Bekreftelse" ++ ++msgid "Connect" ++msgstr "Koble til" ++ ++msgid "Connected" ++msgstr "Tilkoblet" ++ ++msgid "Connection Limit" ++msgstr "Tilkoblingsgrense (antall)" ++ ++msgid "Connection to server fails when TLS cannot be used" ++msgstr "" ++ ++msgid "Connections" ++msgstr "Tilkoblinger" ++ ++msgid "Country" ++msgstr "Land" ++ ++msgid "Country Code" ++msgstr "Landskode" ++ ++msgid "Cover the following interface" ++msgstr "Gjelder det følgende grensesnitt" ++ ++msgid "Cover the following interfaces" ++msgstr "Gjelder de følgende grensesnitt" ++ ++msgid "Create / Assign firewall-zone" ++msgstr "Opprett/Tildel brannmur sone" ++ ++msgid "Create Interface" ++msgstr "Opprett Grensesnitt" ++ ++msgid "Create a bridge over multiple interfaces" ++msgstr "Opprett en bro over flere grensesnitt" ++ ++msgid "Critical" ++msgstr "Kritisk" ++ ++msgid "Cron Log Level" ++msgstr "Cron logg nivå" ++ ++msgid "Custom Interface" ++msgstr "Egendefinerte Grensesnitt" ++ ++msgid "Custom delegated IPv6-prefix" ++msgstr "" ++ ++msgid "" ++"Customizes the behaviour of the device LEDs if possible." ++msgstr "" ++"Tilpasser oppførselen til enhetens LEDs om mulig." ++ ++msgid "DHCP Leases" ++msgstr "DHCP Leier" ++ ++msgid "DHCP Server" ++msgstr "DHCP Server" ++ ++msgid "DHCP and DNS" ++msgstr "DHCP og DNS" ++ ++msgid "DHCP client" ++msgstr "DHCP klient" ++ ++msgid "DHCP-Options" ++msgstr "DHCP-Alternativer" ++ ++msgid "DHCPv6 Leases" ++msgstr "DHCPv6 Leier" ++ ++msgid "DHCPv6 client" ++msgstr "" ++ ++msgid "DHCPv6-Mode" ++msgstr "" ++ ++msgid "DHCPv6-Service" ++msgstr "" ++ ++msgid "DNS" ++msgstr "DNS" ++ ++msgid "DNS forwardings" ++msgstr "DNS videresendinger" ++ ++msgid "DNS-Label / FQDN" ++msgstr "" ++ ++msgid "DS-Lite AFTR address" ++msgstr "" ++ ++msgid "DUID" ++msgstr "DUID" ++ ++msgid "Debug" ++msgstr "Feilsøking" ++ ++msgid "Default %d" ++msgstr "Standard %d" ++ ++msgid "Default gateway" ++msgstr "Standard gateway" ++ ++msgid "Default route" ++msgstr "" ++ ++msgid "Default state" ++msgstr "Standard tilstand" ++ ++msgid "Define a name for this network." ++msgstr "Definer et navn for dette nettverket." ++ ++msgid "" ++"Define additional DHCP options, for example " ++"\"6,192.168.2.1,192.168.2.2\" which advertises different DNS " ++"servers to clients." ++msgstr "" ++"Definer flere DHCP valg, f.eks \"192.168.2.1,192.168.2.2\" som " ++"annonserer forskjellige DNS servere til klientene." ++ ++msgid "Delete" ++msgstr "Fjern" ++ ++msgid "Delete this interface" ++msgstr "Fjern dette grensesnitt" ++ ++msgid "Delete this network" ++msgstr "Fjern dette nettverket" ++ ++msgid "Description" ++msgstr "Beskrivelse" ++ ++msgid "Design" ++msgstr "Design" ++ ++msgid "Destination" ++msgstr "Destinasjon" ++ ++msgid "Device" ++msgstr "Enhet" ++ ++msgid "Device Configuration" ++msgstr "Enhet Konfigurasjon" ++ ++msgid "Diagnostics" ++msgstr "Nettverksdiagnostikk" ++ ++msgid "Dial number" ++msgstr "" ++ ++msgid "Directory" ++msgstr "Katalog" ++ ++msgid "Disable" ++msgstr "Deaktiver" ++ ++msgid "" ++"Disable DHCP for " ++"this interface." ++msgstr "" ++"Deaktiver DHCP " ++"for dette nettverket." ++ ++msgid "Disable DNS setup" ++msgstr "Deaktiver DNS oppsett" ++ ++msgid "Disable HW-Beacon timer" ++msgstr "Deaktiver HW-Beacon timer" ++ ++msgid "Disabled" ++msgstr "Deaktivert" ++ ++msgid "Discard upstream RFC1918 responses" ++msgstr "Forkast oppstrøms RFC1918 svar" ++ ++msgid "Displaying only packages containing" ++msgstr "Viser bare pakker som inneholder" ++ ++msgid "Distance Optimization" ++msgstr "Avstand Optimalisering" ++ ++msgid "Distance to farthest network member in meters." ++msgstr "Avstand i meter til det medlem av nettverket som er lengst unna." ++ ++msgid "Diversity" ++msgstr "Antennevariasjon" ++ ++msgid "" ++"Dnsmasq is a combined DHCP-Server and DNS-" ++"Forwarder for NAT " ++"firewalls" ++msgstr "" ++"Dnsmasq er en kombinert DHCP-Server og DNS-" ++"Fremsender for NAT " ++"brannmurer" ++ ++msgid "Do not cache negative replies, e.g. for not existing domains" ++msgstr "Ikke cache negative svar, f.eks for ikke eksisterende domener" ++ ++msgid "Do not forward requests that cannot be answered by public name servers" ++msgstr "" ++"Ikke videresend forespørsler som ikke kan besvares med offentlige " ++"navneservere" ++ ++msgid "Do not forward reverse lookups for local networks" ++msgstr "Ikke videresend reverserte oppslag for lokale nettverk" ++ ++msgid "Do not send probe responses" ++msgstr "Ikke send probe svar" ++ ++msgid "Domain required" ++msgstr "Domene kreves" ++ ++msgid "Domain whitelist" ++msgstr "Domene hviteliste" ++ ++msgid "" ++"Don't forward DNS-Requests without " ++"DNS-Name" ++msgstr "" ++"Ikke videresend DNS-Forespørsler " ++"uten DNS-Navn" ++ ++msgid "Download and install package" ++msgstr "Last ned og installer pakken" ++ ++msgid "Download backup" ++msgstr "Last ned sikkerhetskopi" ++ ++msgid "Dropbear Instance" ++msgstr "Dropbear Instans" ++ ++msgid "" ++"Dropbear offers SSH network shell access " ++"and an integrated SCP server" ++msgstr "" ++"Dropbear tilbyr SSH-nettverks shell " ++"tilgang og en integrert SCP server" ++ ++msgid "Dual-Stack Lite (RFC6333)" ++msgstr "" ++ ++msgid "Dynamic DHCP" ++msgstr "" ++"Dynamisk DHCP" ++ ++msgid "Dynamic tunnel" ++msgstr "Dynamisk tunnel" ++ ++msgid "" ++"Dynamically allocate DHCP addresses for clients. If disabled, only clients " ++"having static leases will be served." ++msgstr "" ++"Dynamisk tildeling av DHCP adresser til klienter. Om deaktivert, kan en kun " ++"bruke klienter med statisk leie." ++ ++msgid "EAP-Method" ++msgstr "EAP-metode" ++ ++msgid "Edit" ++msgstr "Endre" ++ ++msgid "" ++"Edit the raw configuration data above to fix any error and hit \"Save\" to " ++"reload the page." ++msgstr "" ++ ++msgid "Edit this interface" ++msgstr "Endre dette grensesnittet" ++ ++msgid "Edit this network" ++msgstr "Endre dette nettverket" ++ ++msgid "Emergency" ++msgstr "Krisesituasjon" ++ ++msgid "Enable" ++msgstr "Aktiver" ++ ++msgid "Enable STP" ++msgstr "Aktiver STP" ++ ++msgid "Enable HE.net dynamic endpoint update" ++msgstr "Aktiver HE,net dynamisk endepunkt oppdatering" ++ ++msgid "Enable IPv6 negotiation on the PPP link" ++msgstr "Aktiver IPv6 på PPP lenke" ++ ++msgid "Enable Jumbo Frame passthrough" ++msgstr "Aktiver Jumbo Frames gjennomgang" ++ ++msgid "Enable NTP client" ++msgstr "Aktiver NTP klient" ++ ++msgid "Enable TFTP server" ++msgstr "Aktiver TFTP server" ++ ++msgid "Enable VLAN functionality" ++msgstr "Aktiver VLAN funksjonalitet" ++ ++msgid "Enable WPS pushbutton, requires WPA(2)-PSK" ++msgstr "" ++ ++msgid "Enable learning and aging" ++msgstr "Aktiver 'læring' og 'aldring'" ++ ++msgid "Enable mirroring of incoming packets" ++msgstr "" ++ ++msgid "Enable mirroring of outgoing packets" ++msgstr "" ++ ++msgid "Enable this mount" ++msgstr "Aktiver dette monteringspunktet" ++ ++msgid "Enable this swap" ++msgstr "Aktiver denne swapenhet" ++ ++msgid "Enable/Disable" ++msgstr "Aktiver/Deaktiver" ++ ++msgid "Enabled" ++msgstr "Aktivert" ++ ++msgid "Enables the Spanning Tree Protocol on this bridge" ++msgstr "Aktiverer Spanning Tree Protocol på denne broen" ++ ++msgid "Encapsulation mode" ++msgstr "Innkapsling modus" ++ ++msgid "Encryption" ++msgstr "Kryptering" ++ ++msgid "Erasing..." ++msgstr "Sletter..." ++ ++msgid "Error" ++msgstr "Feil" ++ ++msgid "Ethernet Adapter" ++msgstr "Ethernet Tilslutning" ++ ++msgid "Ethernet Switch" ++msgstr "Ethernet Svitsj" ++ ++msgid "Expand hosts" ++msgstr "Utvid vertsliste" ++ ++msgid "Expires" ++msgstr "Utgår" ++ ++#, fuzzy ++msgid "" ++"Expiry time of leased addresses, minimum is 2 minutes (2m)." ++msgstr "Utløpstid på leide adresser, minimum er 2 minutter (2m)." ++ ++msgid "External" ++msgstr "" ++ ++msgid "External system log server" ++msgstr "Ekstern systemlogg server" ++ ++msgid "External system log server port" ++msgstr "Ekstern systemlogg server port" ++ ++msgid "Fast Frames" ++msgstr "Fast Frames" ++ ++msgid "File" ++msgstr "Fil" ++ ++msgid "Filename of the boot image advertised to clients" ++msgstr "Filnavn fra boot image annonsert til klienter" ++ ++msgid "Filesystem" ++msgstr "Filsystem" ++ ++msgid "Filter" ++msgstr "Filter" ++ ++msgid "Filter private" ++msgstr "Filtrer private" ++ ++msgid "Filter useless" ++msgstr "Filtrer ubrukelige" ++ ++msgid "Find and join network" ++msgstr "Finn og koble til nettverk" ++ ++msgid "Find package" ++msgstr "Finn pakke" ++ ++msgid "Finish" ++msgstr "Fullfør" ++ ++msgid "Firewall" ++msgstr "Brannmur" ++ ++msgid "Firewall Settings" ++msgstr "Brannmur Innstillinger" ++ ++msgid "Firewall Status" ++msgstr "Brannmur Status" ++ ++msgid "Firmware Version" ++msgstr "Firmware Versjon" ++ ++msgid "Fixed source port for outbound DNS queries" ++msgstr "Fast kilde port for utgående DNS-spørringer" ++ ++msgid "Flags" ++msgstr "Flagg" ++ ++msgid "Flash Firmware" ++msgstr "Firmware Oppradering" ++ ++msgid "Flash image..." ++msgstr "Flash firmware..." ++ ++msgid "Flash new firmware image" ++msgstr "Flash nytt firmware image" ++ ++msgid "Flash operations" ++msgstr "Flash operasjoner" ++ ++msgid "Flashing..." ++msgstr "Flasher..." ++ ++msgid "Force" ++msgstr "Bruk" ++ ++msgid "Force CCMP (AES)" ++msgstr "Bruk CCMP (AES)" ++ ++msgid "Force DHCP on this network even if another server is detected." ++msgstr "" ++"Bruk DHCP i dette nettverket, selv om en annen DHCP server er oppdaget." ++ ++msgid "Force TKIP" ++msgstr "Bruk TKIP" ++ ++msgid "Force TKIP and CCMP (AES)" ++msgstr "Bruk TKIP og CCMP (AES)" ++ ++msgid "Forward DHCP traffic" ++msgstr "Videresend DHCP trafikk" ++ ++msgid "Forward broadcast traffic" ++msgstr "Videresend kringkastingstrafikk" ++ ++msgid "Forwarding mode" ++msgstr "Videresending modus" ++ ++msgid "Fragmentation Threshold" ++msgstr "Fragmenterings Terskel" ++ ++msgid "Frame Bursting" ++msgstr "Frame Bursting" ++ ++msgid "Free" ++msgstr "Ledig" ++ ++msgid "Free space" ++msgstr "Ledig plass" ++ ++msgid "GHz" ++msgstr "GHz" ++ ++msgid "GPRS only" ++msgstr "Kun GPRS" ++ ++msgid "Gateway" ++msgstr "Gateway" ++ ++msgid "Gateway ports" ++msgstr "Gateway porter" ++ ++msgid "General Settings" ++msgstr "Generelle Innstillinger" ++ ++msgid "General Setup" ++msgstr "Generelt Oppsett" ++ ++msgid "Generate archive" ++msgstr "Opprett arkiv" ++ ++msgid "Generic 802.11%s Wireless Controller" ++msgstr "Generell 802.11%s Trådløs Kontroller" ++ ++msgid "Given password confirmation did not match, password not changed!" ++msgstr "Det oppgitte passordet var ikke korrekt, passord ble ikke endret!" ++ ++msgid "Global network options" ++msgstr "" ++ ++msgid "Go to password configuration..." ++msgstr "Gå til passord konfigurasjon..." ++ ++msgid "Go to relevant configuration page" ++msgstr "Gå til relevant konfigurasjonen side" ++ ++msgid "Guest" ++msgstr "" ++ ++msgid "HE.net password" ++msgstr "HE.net passord" ++ ++msgid "HE.net username" ++msgstr "" ++ ++msgid "Handler" ++msgstr "Behandler" ++ ++msgid "Hang Up" ++msgstr "Slå av" ++ ++msgid "Heartbeat" ++msgstr "" ++ ++msgid "" ++"Here you can configure the basic aspects of your device like its hostname or " ++"the timezone." ++msgstr "" ++"Her kan du konfigurere grunnleggende aspekter av enheten som f.eks. dens " ++"vertsnavn eller tidssone." ++ ++msgid "" ++"Here you can paste public SSH-Keys (one per line) for SSH public-key " ++"authentication." ++msgstr "" ++"Her kan du lime inn felles SSH-nøkler(en per linje), for SSH godkjenning." ++ ++msgid "Hermes 802.11b Wireless Controller" ++msgstr "Hermes 802.11b Trådløs Kontroller" ++ ++msgid "Hide ESSID" ++msgstr "Skjul ESSID" ++ ++msgid "Host entries" ++msgstr "Vertsoppføringer" ++ ++msgid "Host expiry timeout" ++msgstr "Verts utløpstid" ++ ++msgid "Host-IP or Network" ++msgstr "" ++"Verts-IP eller Nettverk" ++ ++msgid "Hostname" ++msgstr "Vertsnavn" ++ ++msgid "Hostname to send when requesting DHCP" ++msgstr "Vertsnavn som sendes ved DHCP forespørsel" ++ ++msgid "Hostnames" ++msgstr "Vertsnavn" ++ ++msgid "Hybrid" ++msgstr "" ++ ++msgid "IP address" ++msgstr "IP adresse" ++ ++msgid "IPv4" ++msgstr "IPv4" ++ ++msgid "IPv4 Firewall" ++msgstr "IPv4 Brannmur" ++ ++msgid "IPv4 WAN Status" ++msgstr "IPv4 WAN Status" ++ ++msgid "IPv4 address" ++msgstr "IPv4 adresse" ++ ++msgid "IPv4 and IPv6" ++msgstr "IPv4 og IPv6" ++ ++msgid "IPv4 assignment length" ++msgstr "" ++ ++msgid "IPv4 broadcast" ++msgstr "IPv4 kringkasting" ++ ++msgid "IPv4 gateway" ++msgstr "IPv4 gateway" ++ ++msgid "IPv4 netmask" ++msgstr "IPv4 nettmaske" ++ ++msgid "IPv4 only" ++msgstr "Kun IPv4" ++ ++msgid "IPv4 prefix length" ++msgstr "IPv4 prefikslengde" ++ ++msgid "IPv4-Address" ++msgstr "IPv4-Adresse" ++ ++msgid "IPv6" ++msgstr "IPv6" ++ ++msgid "IPv6 Firewall" ++msgstr "IPv6 Brannmur" ++ ++msgid "IPv6 Neighbours" ++msgstr "" ++ ++msgid "IPv6 Settings" ++msgstr "" ++ ++msgid "IPv6 ULA-Prefix" ++msgstr "" ++ ++msgid "IPv6 WAN Status" ++msgstr "IPv6 WAN Status" ++ ++msgid "IPv6 address" ++msgstr "IPv6 adresse" ++ ++msgid "IPv6 address delegated to the local tunnel endpoint (optional)" ++msgstr "" ++ ++msgid "IPv6 assignment hint" ++msgstr "" ++ ++msgid "IPv6 assignment length" ++msgstr "" ++ ++msgid "IPv6 gateway" ++msgstr "IPv6 gateway" ++ ++msgid "IPv6 only" ++msgstr "Kun IPv6" ++ ++msgid "IPv6 prefix" ++msgstr "IPv6 prefiks" ++ ++msgid "IPv6 prefix length" ++msgstr "IPv6 prefikslengde" ++ ++msgid "IPv6 routed prefix" ++msgstr "" ++ ++msgid "IPv6-Address" ++msgstr "IPv6-Adresse" ++ ++msgid "IPv6-in-IPv4 (RFC4213)" ++msgstr "IPv6-i-IPv4 (RFC4213)" ++ ++msgid "IPv6-over-IPv4 (6rd)" ++msgstr "IPv6-over-IPv4 (6rd)" ++ ++msgid "IPv6-over-IPv4 (6to4)" ++msgstr "IPv6-over-IPv4 (6til4)" ++ ++msgid "Identity" ++msgstr "Identitet" ++ ++msgid "" ++"If specified, mount the device by its UUID instead of a fixed device node" ++msgstr "Hvis oppgitt vil denne enhet monteres ut fra dens UUID" ++ ++msgid "" ++"If specified, mount the device by the partition label instead of a fixed " ++"device node" ++msgstr "Hvis oppgitt vil denne enheten bli montert utfra dens Volumnavn" ++ ++msgid "If unchecked, no default route is configured" ++msgstr "Dersom ikke avmerket blir ingen standard rute konfigurert" ++ ++msgid "If unchecked, the advertised DNS server addresses are ignored" ++msgstr "Dersom ikke avmerket blir de annonserte DNS server adresser ignorert" ++ ++msgid "" ++"If your physical memory is insufficient unused data can be temporarily " ++"swapped to a swap-device resulting in a higher amount of usable RAM. Be aware that swapping data is a very " ++"slow process as the swap-device cannot be accessed with the high datarates " ++"of the RAM." ++msgstr "" ++"Om ruterens fysiske minne er utilstrekkelig, ubrukte data kan midlertidig " ++"gjøres om til en swap-enhet som gir deg mere tilgjengelig RAM. Vær oppmerksom på at bruk av swap er " ++"mye langsommere en RAM." ++ ++msgid "Ignore Hosts files" ++msgstr "Ignorer vertsfiler" ++ ++msgid "Ignore interface" ++msgstr "Ignorer grensesnitt" ++ ++msgid "Ignore resolve file" ++msgstr "Ignorer oppslagsfil" ++ ++msgid "Image" ++msgstr "Firmware" ++ ++msgid "In" ++msgstr "i" ++ ++msgid "Inactivity timeout" ++msgstr "Tidsavbrudd etter innaktivitet" ++ ++msgid "Inbound:" ++msgstr "Innkommende:" ++ ++msgid "Info" ++msgstr "Informasjon" ++ ++msgid "Initscript" ++msgstr "Oppstartskript" ++ ++msgid "Initscripts" ++msgstr "Oppstartsskript" ++ ++msgid "Install" ++msgstr "Installer" ++ ++msgid "Install iputils-traceroute6 for IPv6 traceroute" ++msgstr "" ++ ++msgid "Install package %q" ++msgstr "Installer pakken %q" ++ ++msgid "Install protocol extensions..." ++msgstr "Installer protokoll utvidelser..." ++ ++msgid "Installed packages" ++msgstr "Installerte pakker" ++ ++msgid "Interface" ++msgstr "Grensesnitt" ++ ++msgid "Interface Configuration" ++msgstr "Grensesnitt Konfigurasjon" ++ ++msgid "Interface Overview" ++msgstr "Grensesnitt Oversikt" ++ ++msgid "Interface is reconnecting..." ++msgstr "Grensesnittet kobler til igjen..." ++ ++msgid "Interface is shutting down..." ++msgstr "Grensesnittet slår seg av..." ++ ++msgid "Interface not present or not connected yet." ++msgstr "Grensesnittet er ikke tilgjengelig eller er ikke tilknyttet." ++ ++msgid "Interface reconnected" ++msgstr "Grensesnittet er koblet til igjen" ++ ++msgid "Interface shut down" ++msgstr "Grensesnittet er slått av" ++ ++msgid "Interfaces" ++msgstr "Grensesnitt" ++ ++msgid "Internal" ++msgstr "" ++ ++msgid "Internal Server Error" ++msgstr "Intern server feil" ++ ++msgid "Invalid" ++msgstr "Ugyldig" ++ ++msgid "Invalid VLAN ID given! Only IDs between %d and %d are allowed." ++msgstr "Ugyldig VLAN ID gitt! Bare IDer mellom %d og %d er tillatt." ++ ++msgid "Invalid VLAN ID given! Only unique IDs are allowed" ++msgstr "Ugyldig VLAN ID gitt! Bare unike ID'er er tillatt" ++ ++msgid "Invalid username and/or password! Please try again." ++msgstr "Ugyldig brukernavn og/eller passord! Vennligst prøv igjen." ++ ++#, fuzzy ++msgid "" ++"It appears that you are trying to flash an image that does not fit into the " ++"flash memory, please verify the image file!" ++msgstr "" ++"Det virker som du prøver å flashe med en firmware som ikke passer inn i " ++"flash-minnet, vennligst kontroller firmware filen!" ++ ++msgid "Java Script required!" ++msgstr "Java Script kreves!" ++ ++msgid "Join Network" ++msgstr "Koble til nettverket" ++ ++msgid "Join Network: Settings" ++msgstr "Koble til nettverk: Innstilling" ++ ++msgid "Join Network: Wireless Scan" ++msgstr "Koble til nettverk: Trådløs Skanning" ++ ++msgid "Keep settings" ++msgstr "Behold innstillinger" ++ ++msgid "Kernel Log" ++msgstr "Kjerne Logg" ++ ++msgid "Kernel Version" ++msgstr "Kjerne Versjon" ++ ++msgid "Key" ++msgstr "Nøkkel" ++ ++msgid "Key #%d" ++msgstr "Nøkkel #%d" ++ ++msgid "Kill" ++msgstr "Drep" ++ ++msgid "L2TP" ++msgstr "L2TP" ++ ++msgid "L2TP Server" ++msgstr "L2TP Server" ++ ++msgid "LCP echo failure threshold" ++msgstr "LCP ekko feil terskel" ++ ++msgid "LCP echo interval" ++msgstr "LCP ekko intervall" ++ ++msgid "LLC" ++msgstr "LLC" ++ ++msgid "Label" ++msgstr "Volumnavn" ++ ++msgid "Language" ++msgstr "Språk" ++ ++msgid "Language and Style" ++msgstr "Språk og Utseende" ++ ++msgid "Leaf" ++msgstr "" ++ ++msgid "Lease validity time" ++msgstr "Gyldig leietid" ++ ++msgid "Leasefile" ++msgstr "Leie-fil" ++ ++msgid "Leasetime" ++msgstr "Leietid" ++ ++msgid "Leasetime remaining" ++msgstr "Gjenværende leietid" ++ ++msgid "Leave empty to autodetect" ++msgstr "La stå tomt for automatisk oppdagelse" ++ ++msgid "Leave empty to use the current WAN address" ++msgstr "La stå tomt for å bruke gjeldene WAN adresse" ++ ++msgid "Legend:" ++msgstr "Forklaring:" ++ ++msgid "Limit" ++msgstr "Grense" ++ ++msgid "Line Attenuation" ++msgstr "" ++ ++msgid "Line Speed" ++msgstr "" ++ ++msgid "Line State" ++msgstr "" ++ ++msgid "Link On" ++msgstr "Forbindelse" ++ ++msgid "" ++"List of DNS servers to forward " ++"requests to" ++msgstr "" ++"Liste med DNS servere som " ++"forespørsler blir videresendt til" ++ ++msgid "List of domains to allow RFC1918 responses for" ++msgstr "Liste over domener hvor en tillater RFC1918 svar" ++ ++msgid "List of hosts that supply bogus NX domain results" ++msgstr "Liste over verter som returneren falske NX domene resultater" ++ ++msgid "Listen only on the given interface or, if unspecified, on all" ++msgstr "" ++"Lytt kun på det angitte grensesnitt, om ingen er angitt lyttes det på alle" ++ ++msgid "Listening port for inbound DNS queries" ++msgstr "Lytte-port for innkommende DNS-spørring" ++ ++msgid "Load" ++msgstr "Belastning" ++ ++msgid "Load Average" ++msgstr "Belastning Gjennomsnitt" ++ ++msgid "Loading" ++msgstr "Laster" ++ ++msgid "Local IPv4 address" ++msgstr "Lokal IPv4 adresse" ++ ++msgid "Local IPv6 address" ++msgstr "Lokal IPv6 adresse" ++ ++msgid "Local Startup" ++msgstr "Lokal Oppstart" ++ ++msgid "Local Time" ++msgstr "Lokal tid" ++ ++msgid "Local domain" ++msgstr "Lokalt domene" ++ ++#, fuzzy ++msgid "" ++"Local domain specification. Names matching this domain are never forwarded " ++"and are resolved from DHCP or hosts files only" ++msgstr "" ++"Lokalt domene spesifikasjon. Navn som passer dette domenet blir aldri " ++"videresendt, de blir kun løst av DHCP eller vertsfiler" ++ ++msgid "Local domain suffix appended to DHCP names and hosts file entries" ++msgstr "Lokalt domenesuffiks lagt til DHCP navn og vertsfil oppføringer" ++ ++msgid "Local server" ++msgstr "Lokal server" ++ ++msgid "" ++"Localise hostname depending on the requesting subnet if multiple IPs are " ++"available" ++msgstr "" ++"Lokaliser vertsnavn avhengig av subnett hvis flere IP-adresser er " ++"tilgjengelig" ++ ++msgid "Localise queries" ++msgstr "Lokalisere søk" ++ ++msgid "Locked to channel %d used by: %s" ++msgstr "" ++ ++msgid "Log output level" ++msgstr "Logg nivå" ++ ++msgid "Log queries" ++msgstr "Logg spørringer" ++ ++msgid "Logging" ++msgstr "Logging" ++ ++msgid "Login" ++msgstr "Logg inn" ++ ++msgid "Logout" ++msgstr "Logg ut" ++ ++msgid "Lowest leased address as offset from the network address." ++msgstr "Laveste leide adresse, forskjøvet fra nettverks adressen." ++ ++msgid "MAC-Address" ++msgstr "MAC-Adresse" ++ ++msgid "MAC-Address Filter" ++msgstr "MAC-Addresse Filter" ++ ++msgid "MAC-Filter" ++msgstr "MAC-Filter" ++ ++msgid "MAC-List" ++msgstr "MAC-Liste" ++ ++msgid "MB/s" ++msgstr "MB/s" ++ ++msgid "MHz" ++msgstr "MHz" ++ ++msgid "MTU" ++msgstr "MTU" ++ ++msgid "" ++"Make sure to clone the root filesystem using something like the commands " ++"below:" ++msgstr "" ++ ++msgid "Maximum Rate" ++msgstr "Maksimal hastighet" ++ ++msgid "Maximum allowed number of active DHCP leases" ++msgstr "Maksimalt antall aktive DHCP leieavtaler" ++ ++msgid "Maximum allowed number of concurrent DNS queries" ++msgstr "Maksimalt antall samtidige DNS spørringer" ++ ++msgid "Maximum allowed size of EDNS.0 UDP packets" ++msgstr "Maksimal tillatt størrelse på EDNS.0 UDP-pakker" ++ ++msgid "Maximum amount of seconds to wait for the modem to become ready" ++msgstr "Maksimalt antall sekunder å vente på at modemet skal bli klart" ++ ++msgid "Maximum hold time" ++msgstr "Maksimal holde tid" ++ ++msgid "Maximum number of leased addresses." ++msgstr "Maksimalt antall utleide adresser." ++ ++msgid "Mbit/s" ++msgstr "Mbit/s" ++ ++msgid "Memory" ++msgstr "Minne" ++ ++msgid "Memory usage (%)" ++msgstr "Minne forbruk (%)" ++ ++msgid "Metric" ++msgstr "Metrisk" ++ ++msgid "Minimum Rate" ++msgstr "Minimum hastighet" ++ ++msgid "Minimum hold time" ++msgstr "Minimum holde tid" ++ ++msgid "Mirror monitor port" ++msgstr "" ++ ++msgid "Mirror source port" ++msgstr "" ++ ++msgid "Missing protocol extension for proto %q" ++msgstr "Mangler protokoll utvidelse for proto %q" ++ ++msgid "Mode" ++msgstr "Modus" ++ ++msgid "Model" ++msgstr "" ++ ++msgid "Modem device" ++msgstr "Modem" ++ ++msgid "Modem init timeout" ++msgstr "Modem initiering tidsavbrudd" ++ ++msgid "Monitor" ++msgstr "Monitor" ++ ++msgid "Mount Entry" ++msgstr "Monterings Enhet" ++ ++msgid "Mount Point" ++msgstr "Monterings Punkt" ++ ++msgid "Mount Points" ++msgstr "Monterings Punkter" ++ ++msgid "Mount Points - Mount Entry" ++msgstr "Monterings Punkter - Monterings Enhet" ++ ++msgid "Mount Points - Swap Entry" ++msgstr "Monterings Punkter - Swap Enhet" ++ ++msgid "" ++"Mount Points define at which point a memory device will be attached to the " ++"filesystem" ++msgstr "" ++"Monterings punkter definerer hvor lagrings enheter blir tilsluttet " ++"filsystemet" ++ ++msgid "Mount options" ++msgstr "Monterings alternativer" ++ ++msgid "Mount point" ++msgstr "Monterings punkt" ++ ++msgid "Mounted file systems" ++msgstr "Monterte Filsystemer" ++ ++msgid "Move down" ++msgstr "Flytt ned" ++ ++msgid "Move up" ++msgstr "Flytt opp" ++ ++msgid "Multicast Rate" ++msgstr "Multicast hastighet" ++ ++msgid "Multicast address" ++msgstr "Multicast adresse" ++ ++msgid "NAS ID" ++msgstr "NAS ID" ++ ++msgid "NDP-Proxy" ++msgstr "" ++ ++msgid "NTP server candidates" ++msgstr "NTP server kandidater" ++ ++msgid "NTP sync time-out" ++msgstr "" ++ ++msgid "Name" ++msgstr "Navn" ++ ++msgid "Name of the new interface" ++msgstr "Navnet til det nye grensesnittet" ++ ++msgid "Name of the new network" ++msgstr "Navnet til det nye nettverket" ++ ++msgid "Navigation" ++msgstr "Navigasjon" ++ ++msgid "Netmask" ++msgstr "Nettmaske" ++ ++msgid "Network" ++msgstr "Nettverk" ++ ++msgid "Network Utilities" ++msgstr "Nettverks Verktøy" ++ ++msgid "Network boot image" ++msgstr "Nettverks boot image" ++ ++msgid "Network without interfaces." ++msgstr "Nettverk uten grensesnitt." ++ ++msgid "Next »" ++msgstr "Neste »" ++ ++msgid "No DHCP Server configured for this interface" ++msgstr "Ingen DHCP server er konfigurert for dette grensesnittet" ++ ++msgid "No chains in this table" ++msgstr "Ingen lenker i denne tabellen" ++ ++msgid "No files found" ++msgstr "Ingen filer funnet" ++ ++msgid "No information available" ++msgstr "Ingen informasjon tilgjengelig" ++ ++msgid "No negative cache" ++msgstr "Ingen negative cache" ++ ++msgid "No network configured on this device" ++msgstr "Ingen nettverk er konfigurert på denne enheten" ++ ++msgid "No network name specified" ++msgstr "Ingen nettverksnavn spesifisert" ++ ++msgid "No package lists available" ++msgstr "Ingen pakkelister tilgjengelig" ++ ++msgid "No password set!" ++msgstr "Ruteren er ikke passordbeskyttet!" ++ ++msgid "No rules in this chain" ++msgstr "Ingen regler i denne tabellen" ++ ++msgid "No zone assigned" ++msgstr "Ingen sone tilknyttet" ++ ++msgid "Noise" ++msgstr "Støy" ++ ++msgid "Noise Margin" ++msgstr "" ++ ++msgid "Noise:" ++msgstr "Støy:" ++ ++msgid "None" ++msgstr "Ingen" ++ ++msgid "Normal" ++msgstr "Normal" ++ ++msgid "Not Found" ++msgstr "Ikke funnet" ++ ++msgid "Not associated" ++msgstr "Ikke tilknyttet" ++ ++msgid "Not connected" ++msgstr "Ikke tilkoblet" ++ ++msgid "Note: Configuration files will be erased." ++msgstr "Merk: Konfigurasjonsfiler vil bli slettet" ++ ++msgid "Notice" ++msgstr "Merk" ++ ++msgid "Nslookup" ++msgstr "Nslookup" ++ ++msgid "OK" ++msgstr "OK" ++ ++msgid "OPKG-Configuration" ++msgstr "OPKG-Konfigurasjon" ++ ++msgid "Off-State Delay" ++msgstr "Forsinkelse ved tilstand Av" ++ ++msgid "" ++"On this page you can configure the network interfaces. You can bridge " ++"several interfaces by ticking the \"bridge interfaces\" field and enter the " ++"names of several network interfaces separated by spaces. You can also use " ++"VLAN notation " ++"INTERFACE.VLANNR (e.g.: " ++"eth0.1)." ++msgstr "" ++"På denne siden kan du konfigurere nettverks grensesnittet. Du kan " ++"sammenkoble flere grensesnitt ved å hake av \"Sammekoble grensesnitt\" " ++"feltet og skrive inn navn på grensesnittene atskilt med mellomrom. Du kan " ++"også bruke VLAN betegnelse " ++"INTERFACE.VLANNR (f.eks: " ++"eth0.1)." ++ ++msgid "On-State Delay" ++msgstr "Forsinkelse ved tilstand -På-" ++ ++msgid "One of hostname or mac address must be specified!" ++msgstr "Enten Vertsnavn eller Mac-adresse må oppgis!" ++ ++msgid "One or more fields contain invalid values!" ++msgstr "Ett eller flere felt inneholder ugyldige verdier!" ++ ++msgid "One or more required fields have no value!" ++msgstr "Ett eller flere obligatoriske felter har ingen verdi!" ++ ++msgid "Open list..." ++msgstr "Åpne liste..." ++ ++msgid "OpenConnect (CISCO AnyConnect)" ++msgstr "" ++ ++msgid "Operating frequency" ++msgstr "" ++ ++msgid "Option changed" ++msgstr "Innstilling endret" ++ ++msgid "Option removed" ++msgstr "Innstilling fjernet" ++ ++msgid "Optional, specify to override default server (tic.sixxs.net)" ++msgstr "" ++ ++msgid "Optional, use when the SIXXS account has more than one tunnel" ++msgstr "" ++ ++msgid "Options" ++msgstr "Alternativer" ++ ++msgid "Other:" ++msgstr "Andre:" ++ ++msgid "Out" ++msgstr "Ut" ++ ++msgid "Outbound:" ++msgstr "Ugående:" ++ ++msgid "Outdoor Channels" ++msgstr "Utendørs Kanaler" ++ ++msgid "Output Interface" ++msgstr "" ++ ++msgid "Override MAC address" ++msgstr "Overstyr MAC adresse" ++ ++msgid "Override MTU" ++msgstr "Overstyr MTU" ++ ++msgid "Override the gateway in DHCP responses" ++msgstr "Overstyr gatewayen mottatt av DHCP respons" ++ ++msgid "" ++"Override the netmask sent to clients. Normally it is calculated from the " ++"subnet that is served." ++msgstr "" ++"Overstyr nettmaske sendt til klienter. Normalt er nettmasken beregnet ut fra " ++"subnettet som blir tildelt." ++ ++msgid "Override the table used for internal routes" ++msgstr "Overstyr tabellen som brukes for interne ruter" ++ ++msgid "Overview" ++msgstr "Oversikt" ++ ++msgid "Owner" ++msgstr "Eier" ++ ++msgid "PAP/CHAP password" ++msgstr "PAP/CHAP passord" ++ ++msgid "PAP/CHAP username" ++msgstr "PAP/CHAP brukernavn" ++ ++msgid "PID" ++msgstr "PID" ++ ++msgid "PIN" ++msgstr "PIN" ++ ++msgid "PPP" ++msgstr "PPP" ++ ++msgid "PPPoA Encapsulation" ++msgstr "PPPoA Innkapsling" ++ ++msgid "PPPoATM" ++msgstr "PPPoATM" ++ ++msgid "PPPoE" ++msgstr "PPPoE" ++ ++msgid "PPtP" ++msgstr "PPtP" ++ ++msgid "Package libiwinfo required!" ++msgstr "Pakken libiwinfo er nødvendig!" ++ ++msgid "Package lists are older than 24 hours" ++msgstr "Pakkelistene er eldre enn 24 timer" ++ ++msgid "Package name" ++msgstr "Pakkenavn" ++ ++msgid "Packets" ++msgstr "Pakker" ++ ++msgid "Part of zone %q" ++msgstr "En del av sone %q" ++ ++msgid "Password" ++msgstr "Passord" ++ ++msgid "Password authentication" ++msgstr "Passord godkjenning" ++ ++msgid "Password of Private Key" ++msgstr "Passord for privatnøkkel" ++ ++msgid "Password successfully changed!" ++msgstr "Passordet er endret!" ++ ++msgid "Path" ++msgstr "" ++ ++msgid "Path to CA-Certificate" ++msgstr "Sti til CA-sertifikat" ++ ++msgid "Path to Client-Certificate" ++msgstr "Sti til klient-sertifikat" ++ ++msgid "Path to Private Key" ++msgstr "Sti til privatnøkkel" ++ ++msgid "Path to executable which handles the button event" ++msgstr "Sti til program som håndterer handling ved bruk av knapp" ++ ++msgid "Peak:" ++msgstr "Maksimalt:" ++ ++msgid "Perform reboot" ++msgstr "Omstart nå" ++ ++msgid "Perform reset" ++msgstr "Foreta nullstilling" ++ ++msgid "Phy Rate:" ++msgstr "Phy Hastighet:" ++ ++msgid "Physical Settings" ++msgstr "Fysiske Innstillinger" ++ ++msgid "Ping" ++msgstr "Ping" ++ ++msgid "Pkts." ++msgstr "Pakker." ++ ++msgid "Please enter your username and password." ++msgstr "Skriv inn ditt brukernavn og passord." ++ ++msgid "Please wait: Device rebooting..." ++msgstr "Vent: Enheten starter på nytt..." ++ ++msgid "Policy" ++msgstr "Policy" ++ ++msgid "Port" ++msgstr "Port" ++ ++msgid "Port %d" ++msgstr "Port %d" ++ ++msgid "Port %d is untagged in multiple VLANs!" ++msgstr "Port %d er utagget i flere VLANs!" ++ ++msgid "Port status:" ++msgstr "Port status:" ++ ++msgid "" ++"Presume peer to be dead after given amount of LCP echo failures, use 0 to " ++"ignore failures" ++msgstr "" ++"Annta at peer er uten forbindelse om angitt LCP ekko feiler, bruk verdi 0 " ++"for å overse feil" ++ ++msgid "Prevents client-to-client communication" ++msgstr "Hindrer klient-til-klient kommunikasjon" ++ ++msgid "Prism2/2.5/3 802.11b Wireless Controller" ++msgstr "Prism2/2.5/3 802.11b Trådløs Kontroller" ++ ++msgid "Proceed" ++msgstr "Fortsett" ++ ++msgid "Processes" ++msgstr "Prosesser" ++ ++msgid "Prot." ++msgstr "Prot." ++ ++msgid "Protocol" ++msgstr "Protokoll" ++ ++msgid "Protocol family" ++msgstr "Protokoll familie" ++ ++msgid "Protocol of the new interface" ++msgstr "Protokoll til det nye grensesnittet" ++ ++msgid "Protocol support is not installed" ++msgstr "Protokoll støtte er ikke installert" ++ ++msgid "Provide NTP server" ++msgstr "Funger som NTP Server" ++ ++msgid "Provide new network" ++msgstr "Lag nytt nettverk" ++ ++msgid "Pseudo Ad-Hoc (ahdemo)" ++msgstr "Pseudo Ad-Hoc (ahdemo)" ++ ++msgid "Public prefix routed to this device for distribution to clients." ++msgstr "" ++ ++msgid "Quality" ++msgstr "Kvalitet" ++ ++msgid "RTS/CTS Threshold" ++msgstr "RTS/CTS Terskel" ++ ++msgid "RX" ++msgstr "RX" ++ ++msgid "RX Rate" ++msgstr "RX Rate" ++ ++msgid "RaLink 802.11%s Wireless Controller" ++msgstr "RaLink 802.11%s Trådløs Kontroller" ++ ++msgid "Radius-Accounting-Port" ++msgstr "Radius-Accounting-Port" ++ ++msgid "Radius-Accounting-Secret" ++msgstr "Radius-Accounting-Secret" ++ ++msgid "Radius-Accounting-Server" ++msgstr "Radius-Accounting-Server" ++ ++msgid "Radius-Authentication-Port" ++msgstr "Radius-Authentication-Port" ++ ++msgid "Radius-Authentication-Secret" ++msgstr "Radius-Authentication-Secret" ++ ++msgid "Radius-Authentication-Server" ++msgstr "Radius-Authentication-Server" ++ ++msgid "" ++"Read /etc/ethers to configure the DHCP-Server" ++msgstr "" ++"Benytt /etc/ethers for å konfigurere DHCP-Server" ++ ++msgid "" ++"Really delete this interface? The deletion cannot be undone!\\nYou might " ++"lose access to this device if you are connected via this interface." ++msgstr "" ++"Fjerne dette grensesnittet? Slettingen kan ikke omgjøres!\n" ++"Du kan miste kontakten med ruteren om du er tilkoblet via dette " ++"grensesnittet." ++ ++msgid "" ++"Really delete this wireless network? The deletion cannot be undone!\\nYou " ++"might lose access to this device if you are connected via this network." ++msgstr "" ++"Fjerne dette trådløse nettverket? Slettingen kan ikke omgjøres!\n" ++"Du kan miste kontakten med ruteren om du er tilkoblet via dette nettverket." ++ ++msgid "Really reset all changes?" ++msgstr "Vil du nullstille alle endringer?" ++ ++#, fuzzy ++msgid "" ++"Really shut down network?\\nYou might lose access to this device if you are " ++"connected via this interface." ++msgstr "" ++"Slå av dette nettverket ?\n" ++"Du kan miste kontakten med ruteren om du er tilkoblet via dette " ++"grensesnittet." ++ ++msgid "" ++"Really shutdown interface \"%s\" ?\\nYou might lose access to this device if " ++"you are connected via this interface." ++msgstr "" ++"Slå av dette grensesnittet \"%s\" ?\n" ++"Du kan miste kontakten med ruteren om du er tilkoblet via dette " ++"grensesnittet." ++ ++msgid "Really switch protocol?" ++msgstr "Vil du endre protokoll?" ++ ++msgid "Realtime Connections" ++msgstr "Tilkoblinger Sanntid" ++ ++msgid "Realtime Graphs" ++msgstr "Grafer i sanntid" ++ ++msgid "Realtime Load" ++msgstr "Belastning Sanntid" ++ ++msgid "Realtime Traffic" ++msgstr "Trafikk Sanntid" ++ ++msgid "Realtime Wireless" ++msgstr "Trådløst i sanntid" ++ ++msgid "Rebind protection" ++msgstr "Binde beskyttelse" ++ ++msgid "Reboot" ++msgstr "Omstart" ++ ++msgid "Rebooting..." ++msgstr "Starter på nytt..." ++ ++msgid "Reboots the operating system of your device" ++msgstr "Omstarter operativsystemet på enheten" ++ ++msgid "Receive" ++msgstr "Motta" ++ ++msgid "Receiver Antenna" ++msgstr "Mottak antenne" ++ ++msgid "Reconnect this interface" ++msgstr "Koble til igjen" ++ ++msgid "Reconnecting interface" ++msgstr "Kobler til igjen" ++ ++msgid "References" ++msgstr "Referanser" ++ ++msgid "Regulatory Domain" ++msgstr "Regulerende Domene" ++ ++msgid "Relay" ++msgstr "Relay" ++ ++msgid "Relay Bridge" ++msgstr "Relay bro" ++ ++msgid "Relay between networks" ++msgstr "Relay mellom nettverk" ++ ++msgid "Relay bridge" ++msgstr "Relay bro" ++ ++msgid "Remote IPv4 address" ++msgstr "Ekstern IPv4 adresse" ++ ++msgid "Remove" ++msgstr "Avinstaller" ++ ++msgid "Repeat scan" ++msgstr "Skann på nytt" ++ ++msgid "Replace entry" ++msgstr "Erstatt oppføring" ++ ++msgid "Replace wireless configuration" ++msgstr "Erstatt trådløs konfigurasjon" ++ ++msgid "Request IPv6-address" ++msgstr "" ++ ++msgid "Request IPv6-prefix of length" ++msgstr "" ++ ++msgid "Require TLS" ++msgstr "" ++ ++msgid "Required for certain ISPs, e.g. Charter with DOCSIS 3" ++msgstr "Er nødvendig for noen nettleverandører, f.eks Charter med DOCSIS 3" ++ ++msgid "Reset" ++msgstr "Nullstill" ++ ++msgid "Reset Counters" ++msgstr "Nullstill Tellere" ++ ++msgid "Reset to defaults" ++msgstr "Nullstill til standard innstilling" ++ ++msgid "Resolv and Hosts Files" ++msgstr "Oppslag og Vertsfiler" ++ ++msgid "Resolve file" ++msgstr "Oppslagsfil" ++ ++msgid "Restart" ++msgstr "Omstart" ++ ++msgid "Restart Firewall" ++msgstr "Omstart Brannmur" ++ ++msgid "Restore backup" ++msgstr "Gjenopprett sikkerhetskopi" ++ ++msgid "Reveal/hide password" ++msgstr "Vis/Skjul passord" ++ ++msgid "Revert" ++msgstr "Tilbakestill" ++ ++msgid "Root" ++msgstr "Rot" ++ ++msgid "Root directory for files served via TFTP" ++msgstr "Rot katalog for filer gitt fra TFTP" ++ ++msgid "Root preparation" ++msgstr "" ++ ++msgid "Routed IPv6 prefix for downstream interfaces" ++msgstr "" ++ ++msgid "Router Advertisement-Service" ++msgstr "" ++ ++msgid "Router Password" ++msgstr "Ruter Passord" ++ ++msgid "Routes" ++msgstr "Ruter" ++ ++msgid "" ++"Routes specify over which interface and gateway a certain host or network " ++"can be reached." ++msgstr "" ++"Ruter, angir hvilket nettverksgrensesnitt og hvilken gateway som brukes for " ++"å nå et gitt nettverk eller vert." ++ ++msgid "Rule #" ++msgstr "Regel #" ++ ++msgid "Run a filesystem check before mounting the device" ++msgstr "Kjør filsystem sjekk før montering av enheten" ++ ++msgid "Run filesystem check" ++msgstr "Kjør filsystem sjekk" ++ ++msgid "" ++"SIXXS supports TIC only, for static tunnels using IP protocol 41 (RFC4213) " ++"use 6in4 instead" ++msgstr "" ++ ++msgid "SIXXS-handle[/Tunnel-ID]" ++msgstr "" ++ ++msgid "SSH Access" ++msgstr "SSH Tilgang" ++ ++msgid "SSH-Keys" ++msgstr "SSH-Nøkler" ++ ++msgid "SSID" ++msgstr "SSID" ++ ++msgid "Save" ++msgstr "Lagre" ++ ++msgid "Save & Apply" ++msgstr "Lagre & Aktiver" ++ ++msgid "Save & Apply" ++msgstr "Lagre & Aktiver" ++ ++msgid "Scan" ++msgstr "Skann" ++ ++msgid "Scheduled Tasks" ++msgstr "Planlagte Oppgaver" ++ ++msgid "Section added" ++msgstr "Seksjon lagt til" ++ ++msgid "Section removed" ++msgstr "Seksjon fjernet" ++ ++msgid "See \"mount\" manpage for details" ++msgstr "Se \"mount\" manpage for detaljer" ++ ++msgid "" ++"Send LCP echo requests at the given interval in seconds, only effective in " ++"conjunction with failure threshold" ++msgstr "" ++"Send LCP ekko forespørsler etter angitt intervall i sekunder, dette er kun " ++"gjeldene dersom feilterskelen er nådd" ++ ++msgid "Separate Clients" ++msgstr "Separerte Klienter" ++ ++msgid "Separate WDS" ++msgstr "Separert WDS" ++ ++msgid "Server Settings" ++msgstr "Server Innstillinger" ++ ++msgid "Server password" ++msgstr "" ++ ++msgid "" ++"Server password, enter the specific password of the tunnel when the username " ++"contains the tunnel ID" ++msgstr "" ++ ++msgid "Server username" ++msgstr "" ++ ++msgid "Service Name" ++msgstr "Tjeneste navn" ++ ++msgid "Service Type" ++msgstr "Tjeneste type" ++ ++msgid "Services" ++msgstr "Tjenester" ++ ++#, fuzzy ++msgid "Set up Time Synchronization" ++msgstr "Oppsett tidssynkronisering" ++ ++msgid "Setup DHCP Server" ++msgstr "Oppsett DHCP server" ++ ++msgid "Show current backup file list" ++msgstr "Vis gjeldende liste med sikkerhetskopifiler" ++ ++msgid "Shutdown this interface" ++msgstr "Slå av dette grensesnittet" ++ ++msgid "Shutdown this network" ++msgstr "Slå av dette nettverket" ++ ++msgid "Signal" ++msgstr "Signal" ++ ++msgid "Signal:" ++msgstr "Signal:" ++ ++msgid "Size" ++msgstr "Størrelse" ++ ++msgid "Skip" ++msgstr "Gå videre" ++ ++msgid "Skip to content" ++msgstr "Gå til innhold" ++ ++msgid "Skip to navigation" ++msgstr "Gå til navigasjon" ++ ++msgid "Slot time" ++msgstr "Slot tid" ++ ++msgid "Software" ++msgstr "Programvare" ++ ++msgid "Some fields are invalid, cannot save values!" ++msgstr "Noen felt er ugyldige, kan ikke lagre verdier!" ++ ++msgid "Sorry, the object you requested was not found." ++msgstr "Beklager, objektet du spurte om ble ikke funnet." ++ ++msgid "Sorry, the server encountered an unexpected error." ++msgstr "Beklager, det oppstod en uventet feil på serveren." ++ ++#, fuzzy ++msgid "" ++"Sorry, there is no sysupgrade support present; a new firmware image must be " ++"flashed manually. Please refer to the OpenWrt wiki for device specific " ++"install instructions." ++msgstr "" ++"Beklager, men finner ikke støtte for 'sysupgrade', ny firmware må derfor " ++"flashes manuelt. Viser til OpenWrt wiki for installering av firmare på " ++"forskjellige enheter." ++ ++msgid "Sort" ++msgstr "Sortering" ++ ++msgid "Source" ++msgstr "Kilde" ++ ++msgid "Source routing" ++msgstr "" ++ ++msgid "Specifies the button state to handle" ++msgstr "Spesifiserer knappens handlemønster" ++ ++msgid "Specifies the directory the device is attached to" ++msgstr "Hvor lagrings enheten blir tilsluttet filsystemet (f.eks. /mnt/sda1)" ++ ++msgid "Specifies the listening port of this Dropbear instance" ++msgstr "Angir den lyttende porten for denne Dropbear instansen" ++ ++msgid "" ++"Specifies the maximum amount of failed ARP requests until hosts are presumed " ++"to be dead" ++msgstr "" ++"Angir maksimalt antall feilede ARP forespørsler før verter ansees frakoblet" ++ ++msgid "" ++"Specifies the maximum amount of seconds after which hosts are presumed to be " ++"dead" ++msgstr "Angir maksimalt antall sekunder før verter ansees som frakoblet" ++ ++msgid "Specify the secret encryption key here." ++msgstr "Angi krypteringsnøkkelen her." ++ ++msgid "Start" ++msgstr "Start" ++ ++msgid "Start priority" ++msgstr "Start prioritet" ++ ++msgid "Startup" ++msgstr "Oppstart" ++ ++msgid "Static IPv4 Routes" ++msgstr "Statiske IPv4 Ruter" ++ ++msgid "Static IPv6 Routes" ++msgstr "Statiske IPv6 Ruter" ++ ++msgid "Static Leases" ++msgstr "Statiske Leier" ++ ++msgid "Static Routes" ++msgstr "Statiske Ruter" ++ ++msgid "Static WDS" ++msgstr "Statisk WDS" ++ ++msgid "Static address" ++msgstr "Statisk adresse" ++ ++msgid "" ++"Static leases are used to assign fixed IP addresses and symbolic hostnames " ++"to DHCP clients. They are also required for non-dynamic interface " ++"configurations where only hosts with a corresponding lease are served." ++msgstr "" ++"Statisk leieavtaler brukes til å tildele faste IP adresser og symbolske " ++"vertsnavn til DHCP klienter. Dette er nødvendig om grensesnittet ikke er " ++"dynamisk konfigurert og kun klienter med dhcp leieavtale får IP." ++ ++msgid "Status" ++msgstr "Status" ++ ++msgid "Stop" ++msgstr "Stop" ++ ++msgid "Strict order" ++msgstr "Streng overholdelse" ++ ++msgid "Submit" ++msgstr "Send" ++ ++msgid "Swap" ++msgstr "" ++ ++msgid "Swap Entry" ++msgstr "Swap Enhet" ++ ++msgid "Switch" ++msgstr "Svitsj" ++ ++msgid "Switch %q" ++msgstr "Svitsj %q" ++ ++msgid "Switch %q (%s)" ++msgstr "Svitsj %q (%s)" ++ ++msgid "Switch protocol" ++msgstr "Svitsj protokoll" ++ ++msgid "Sync with browser" ++msgstr "Synkroniser med nettleser" ++ ++msgid "Synchronizing..." ++msgstr "Synkroniser..." ++ ++msgid "System" ++msgstr "System" ++ ++msgid "System Log" ++msgstr "System Logg" ++ ++msgid "System Properties" ++msgstr "System Egenskaper" ++ ++msgid "System log buffer size" ++msgstr "System logg buffer størrelse" ++ ++msgid "TCP:" ++msgstr "TCP:" ++ ++msgid "TFTP Settings" ++msgstr "TFTP Innstillinger" ++ ++msgid "TFTP server root" ++msgstr "TFTP server roten" ++ ++msgid "TX" ++msgstr "TX" ++ ++msgid "TX Rate" ++msgstr "TX rate" ++ ++msgid "Table" ++msgstr "Tabell" ++ ++msgid "Target" ++msgstr "Mål" ++ ++msgid "Terminate" ++msgstr "Avslutte" ++ ++#, fuzzy ++msgid "" ++"The Device Configuration section covers physical settings of the " ++"radio hardware such as channel, transmit power or antenna selection which " ++"are shared among all defined wireless networks (if the radio hardware is " ++"multi-SSID capable). Per network settings like encryption or operation mode " ++"are grouped in the Interface Configuration." ++msgstr "" ++"Enhet Konfigurasjon seksjonen omhandler innstillingene av den " ++"trådløse enheten som kanaler, sende stryke eller antenne valg. Disse " ++"innstillingene er delt mellom alle definerte trådløse nettverk opprettet " ++"utfra denne enhet. (om den trådløse enheten støtter mulit-SSID). Nettverks " ++"innstillinger som kryptering eller kanaler er gruppert i Grensesnitt " ++"Konfigurasjon." ++ ++msgid "" ++"The libiwinfo-lua package is not installed. You must install this " ++"component for working wireless configuration!" ++msgstr "" ++"Pakken libiwinfo-lua er ikke installert. Du må installere denne " ++"pakken for å kunne konfigurerer trådløse enheter!" ++ ++msgid "" ++"The HE.net endpoint update configuration changed, you must now use the plain " ++"username instead of the user ID!" ++msgstr "" ++ ++msgid "" ++"The IPv6 prefix assigned to the provider, usually ends with ::" ++msgstr "" ++"IPv6 prefikset tilordnet mot leverandør, ender som regel med ::" ++ ++msgid "" ++"The allowed characters are: A-Z, a-z, 0-9 and _" ++msgstr "" ++"Gyldige tegn er: A-Z, a-z, 0-9 og " ++"_" ++ ++msgid "The configuration file could not be loaded due to the following error:" ++msgstr "" ++ ++msgid "" ++"The device file of the memory or partition (e.g." ++" /dev/sda1)" ++msgstr "" ++"Filenheten til partisjonen eller minnet (f.eks." ++" /dev/sda1)" ++ ++msgid "" ++"The filesystem that was used to format the memory (e.g. ext3)" ++msgstr "" ++"Filsystemet som ble brukt til å formatere partisjonen eller minnet. (f.eks. ext3)" ++ ++msgid "" ++"The flash image was uploaded. Below is the checksum and file size listed, " ++"compare them with the original file to ensure data integrity.
    Click " ++"\"Proceed\" below to start the flash procedure." ++msgstr "" ++"Firmwaren ble lastet opp. Nedenfor er kontrollsum og filstørrelse oppført, " ++"sammenlign dem med den opprinnelige filen for å sikre dataintegriteten.
    Klikk \"Fortsett\" nedenfor for å starte flash prosedyren." ++ ++msgid "The following changes have been committed" ++msgstr "Følgende endringer er foretatt" ++ ++msgid "The following changes have been reverted" ++msgstr "Følgende endringer er forkastet" ++ ++msgid "The following rules are currently active on this system." ++msgstr "Følgende regler er aktiver på systemet." ++ ++msgid "The given network name is not unique" ++msgstr "Det angitte nettverksnavnet er ikke unikt" ++ ++#, fuzzy ++msgid "" ++"The hardware is not multi-SSID capable and the existing configuration will " ++"be replaced if you proceed." ++msgstr "" ++"Maskinvaren er ikke multi-SSID kapabel og den ekisterende konfigurasjonen " ++"vil bli erstattet om du fortsetter." ++ ++msgid "" ++"The length of the IPv4 prefix in bits, the remainder is used in the IPv6 " ++"addresses." ++msgstr "Lengden IPv4 prefikset i bits, resten brukt i IPv6-adresser." ++ ++msgid "The length of the IPv6 prefix in bits" ++msgstr "Lengden på IPv6 prefikset i bits" ++ ++msgid "" ++"The network ports on this device can be combined to several VLANs in which computers can " ++"communicate directly with each other. VLANs are often used to separate different network " ++"segments. Often there is by default one Uplink port for a connection to the " ++"next greater network like the internet and other ports for a local network." ++msgstr "" ++"Nettverks portene på ruteren kan kombineres til flere VLANs der datamaskiner kan kommunisere direkte " ++"med hverandre. VLANs " ++"brukes ofte for å skille ulike nettverk segmenter. Det er vanlig og ha en " ++"Uplink port for tilkobling til større nettverk som internett og andre porter " ++"til lokalt nettverk." ++ ++msgid "The selected protocol needs a device assigned" ++msgstr "Den valgte protokoll må ha en enhet tilknyttet" ++ ++msgid "" ++"The system is erasing the configuration partition now and will reboot itself " ++"when finished." ++msgstr "" ++"Systemet sletter konfigurasjonspartisjonen nå, enheten vil bli startet på " ++"nytt når dette er utført." ++ ++#, fuzzy ++msgid "" ++"The system is flashing now.
    DO NOT POWER OFF THE DEVICE!
    Wait a " ++"few minutes before you try to reconnect. It might be necessary to renew the " ++"address of your computer to reach the device again, depending on your " ++"settings." ++msgstr "" ++"Systemet flashes nå.
    IKKE SLÃ… AV ENHETEN!
    Vent noen minutter før " ++"du prøver å koble til igjen. Det kan være nødvendig å fornye ip-adressen til " ++"datamaskinen din for å nå enheten på nytt. (avhengig av innstillingene dine)" ++ ++msgid "" ++"The tunnel end-point is behind NAT, defaults to disabled and only applies to " ++"AYIYA" ++msgstr "" ++ ++msgid "" ++"The uploaded image file does not contain a supported format. Make sure that " ++"you choose the generic image format for your platform." ++msgstr "" ++"Den opplastede programvaren er av et format som ikke støttes. Sørg for at du " ++"velger det generelle firmware-bildet for din plattform." ++ ++msgid "There are no active leases." ++msgstr "Det er ingen aktive leieavtaler." ++ ++msgid "There are no pending changes to apply!" ++msgstr "Det finnes ingen endringer som kan utføres!" ++ ++msgid "There are no pending changes to revert!" ++msgstr "Det finnes ingen endriger å reversere!" ++ ++msgid "There are no pending changes!" ++msgstr "Det finnes ingen endringer!" ++ ++msgid "" ++"There is no device assigned yet, please attach a network device in the " ++"\"Physical Settings\" tab" ++msgstr "" ++"Det er ingen enhet som er tilordnet ennå, vennligst legg til en " ++"nettverksenhet i \"Fysiske Innstillinger\"" ++ ++msgid "" ++"There is no password set on this router. Please configure a root password to " ++"protect the web interface and enable SSH." ++msgstr "" ++"Det er ikke satt noe passord på denne ruter. Vennligst konfigurer et " ++"passord, dette beskytter webgrensesnittet og aktiverer SSH." ++ ++msgid "This IPv4 address of the relay" ++msgstr "Dette IPv4 adressen til relayet" ++ ++msgid "" ++"This is a list of shell glob patterns for matching files and directories to " ++"include during sysupgrade. Modified files in /etc/config/ and certain other " ++"configurations are automatically preserved." ++msgstr "" ++"Dette er en liste med 'shell glob patterns' for å matche filer og kataloger " ++"som skal inkluderes under sysupgrade. Endrede filer i /etc/config/ og " ++"enkelte andre konfigurasjoner blir automatisk bevart." ++ ++msgid "" ++"This is either the \"Update Key\" configured for the tunnel or the account " ++"password if no update key has been configured" ++msgstr "" ++ ++msgid "" ++"This is the content of /etc/rc.local. Insert your own commands here (in " ++"front of 'exit 0') to execute them at the end of the boot process." ++msgstr "" ++"Dette er innholdet i /etc/rc.local. Her kan du legge til egne kommandoer som " ++"blir startet ved slutten av boot sekvensen. (før 'exit 0')" ++ ++msgid "" ++"This is the local endpoint address assigned by the tunnel broker, it usually " ++"ends with :2" ++msgstr "" ++"Dette er den lokale endepunkt adressen som ble tildelt av tunnel 'broker', " ++"adressen ender vanligvis med :2" ++ ++msgid "" ++"This is the only DHCP in the local network" ++msgstr "" ++"Dette er den eneste DHCP server i det lokale nettverket" ++ ++msgid "This is the plain username for logging into the account" ++msgstr "" ++ ++msgid "" ++"This is the prefix routed to you by the tunnel broker for use by clients" ++msgstr "" ++ ++msgid "This is the system crontab in which scheduled tasks can be defined." ++msgstr "Dette er systemets crontab, hvor planlagte oppgaver kan defineres." ++ ++msgid "" ++"This is usually the address of the nearest PoP operated by the tunnel broker" ++msgstr "" ++"Dette er vanligvis adressen til nærmeste PoP som drives av tunell 'broker'" ++ ++msgid "" ++"This list gives an overview over currently running system processes and " ++"their status." ++msgstr "Denne listen gir en oversikt over kjørende prosesser og deres status." ++ ++msgid "This page allows the configuration of custom button actions" ++msgstr "" ++"Denne siden gir mulighet for å definerte egne knappers handlingsmønster" ++ ++msgid "This page gives an overview over currently active network connections." ++msgstr "" ++"Denne siden gir en oversikt over gjeldende aktive nettverkstilkoblinger." ++ ++msgid "This section contains no values yet" ++msgstr "Denne seksjonen inneholder ennå ingen verdier" ++ ++msgid "Time Synchronization" ++msgstr "Tidssynkronisering" ++ ++msgid "Time Synchronization is not configured yet." ++msgstr "Tiden Synkroniseringen er ikke konfigurert ennå." ++ ++msgid "Timezone" ++msgstr "Tidssone" ++ ++msgid "" ++"To restore configuration files, you can upload a previously generated backup " ++"archive here." ++msgstr "" ++"For å gjenopprette konfigurasjonsfiler, kan du her laste opp et backup arkiv " ++"som ble opprettet tidligere." ++ ++msgid "Total Available" ++msgstr "Totalt Tilgjengelig" ++ ++msgid "Traceroute" ++msgstr "Traceroute" ++ ++msgid "Traffic" ++msgstr "Trafikk" ++ ++msgid "Transfer" ++msgstr "Overføring" ++ ++msgid "Transmission Rate" ++msgstr "Overførings rate" ++ ++msgid "Transmit" ++msgstr "Sende" ++ ++msgid "Transmit Power" ++msgstr "Sende styrke" ++ ++msgid "Transmitter Antenna" ++msgstr "Sende Antenne" ++ ++msgid "Trigger" ++msgstr "Utløser" ++ ++msgid "Trigger Mode" ++msgstr "Utløsende Tilstand" ++ ++msgid "Tunnel ID" ++msgstr "Tunnel ID" ++ ++msgid "Tunnel Interface" ++msgstr "Tunnel grensesnitt" ++ ++msgid "Tunnel Link" ++msgstr "" ++ ++msgid "Tunnel broker protocol" ++msgstr "" ++ ++msgid "Tunnel setup server" ++msgstr "" ++ ++msgid "Tunnel type" ++msgstr "" ++ ++msgid "Turbo Mode" ++msgstr "Turbo Modus" ++ ++msgid "Tx-Power" ++msgstr "Tx-Styrke" ++ ++msgid "Type" ++msgstr "Type" ++ ++msgid "UDP:" ++msgstr "UDP:" ++ ++msgid "UMTS only" ++msgstr "Kun UMTS" ++ ++msgid "UMTS/GPRS/EV-DO" ++msgstr "UMTS/GPRS/EV-DO" ++ ++msgid "USB Device" ++msgstr "USB Enhet" ++ ++msgid "UUID" ++msgstr "UUID" ++ ++msgid "Unable to dispatch" ++msgstr "Kan ikke sende" ++ ++msgid "Unknown" ++msgstr "Ukjent" ++ ++msgid "Unknown Error, password not changed!" ++msgstr "Ukjent feil, passordet ble ikke endret!" ++ ++msgid "Unmanaged" ++msgstr "Uhåndtert" ++ ++msgid "Unsaved Changes" ++msgstr "Ulagrede Endringer" ++ ++msgid "Unsupported protocol type." ++msgstr "Protokoll type er ikke støttet." ++ ++msgid "Update lists" ++msgstr "Oppdater lister" ++ ++msgid "" ++"Upload a sysupgrade-compatible image here to replace the running firmware. " ++"Check \"Keep settings\" to retain the current configuration (requires an " ++"OpenWrt compatible firmware image)." ++msgstr "" ++"Last her opp en sysupgrade-kompatibel firmware som skal erstatte den " ++"kjørende firmware. Merk av \"Behold innstillinger\" for å beholde gjeldene " ++"konfigurasjon. (en OpenWrt kompatibel firmware er nødvendig)" ++ ++msgid "Upload archive..." ++msgstr "Last opp arkiv..." ++ ++msgid "Uploaded File" ++msgstr "Opplastet Fil" ++ ++msgid "Uptime" ++msgstr "Oppetid" ++ ++msgid "Use /etc/ethers" ++msgstr "Bruk /etc/ethers" ++ ++msgid "Use DHCP gateway" ++msgstr "Bruk DHCP gateway" ++ ++msgid "Use DNS servers advertised by peer" ++msgstr "Bruk DNS servere annonsert av peer" ++ ++msgid "Use ISO/IEC 3166 alpha2 country codes." ++msgstr "Bruk ISO/IEC 3166 alpha2 landskoder." ++ ++msgid "Use MTU on tunnel interface" ++msgstr "Bruk MTU på tunnel grensesnitt" ++ ++msgid "Use TTL on tunnel interface" ++msgstr "Bruk TTL på tunnel grensesnitt" ++ ++msgid "Use as external overlay (/overlay)" ++msgstr "" ++ ++msgid "Use as root filesystem (/)" ++msgstr "" ++ ++msgid "Use broadcast flag" ++msgstr "Bruk kringkasting flagg" ++ ++msgid "Use builtin IPv6-management" ++msgstr "" ++ ++msgid "Use custom DNS servers" ++msgstr "Bruk egendefinerte DNS servere" ++ ++msgid "Use default gateway" ++msgstr "Bruk standard gateway" ++ ++msgid "Use gateway metric" ++msgstr "Bruk gateway metrikk" ++ ++msgid "Use routing table" ++msgstr "Bruk rutingtabellen" ++ ++msgid "" ++"Use the Add Button to add a new lease entry. The MAC-Address indentifies the host, the IPv4-Address specifies to the fixed " ++"address to use and the Hostname is assigned as symbolic name to the " ++"requesting host." ++msgstr "" ++"Bruk Legg til knappen får å legge til en leieavtale. MAC-" ++"Adresse identifiserer verten, IPv4-Adresse angir hvilken " ++"statisk IP adresse som skal brukes og Vertsnavn blir symbolsk " ++"tilknyttet den anmodende verten." ++ ++msgid "Used" ++msgstr "Brukt" ++ ++msgid "Used Key Slot" ++msgstr "Brukte Nøkler" ++ ++msgid "User certificate (PEM encoded)" ++msgstr "" ++ ++msgid "User key (PEM encoded)" ++msgstr "" ++ ++msgid "Username" ++msgstr "Brukernavn" ++ ++msgid "VC-Mux" ++msgstr "VC-Mux" ++ ++msgid "VLAN Interface" ++msgstr "VLAN grensesnitt" ++ ++msgid "VLANs on %q" ++msgstr "VLANs på %q" ++ ++msgid "VLANs on %q (%s)" ++msgstr "VLANs på %q (%s)" ++ ++msgid "VPN Server" ++msgstr "VPN server" ++ ++msgid "VPN Server port" ++msgstr "" ++ ++msgid "VPN Server's certificate SHA1 hash" ++msgstr "" ++ ++msgid "Vendor Class to send when requesting DHCP" ++msgstr "Leverandør klasse som sendes ved DHCP spørring" ++ ++msgid "Verbose" ++msgstr "" ++ ++msgid "Verbose logging by aiccu daemon" ++msgstr "" ++ ++msgid "Verify" ++msgstr "Bekreft" ++ ++msgid "Version" ++msgstr "Versjon" ++ ++msgid "WDS" ++msgstr "WDS" ++ ++msgid "WEP Open System" ++msgstr "WEP åpent system" ++ ++msgid "WEP Shared Key" ++msgstr "WEP delt nøkkel" ++ ++msgid "WEP passphrase" ++msgstr "WEP passord" ++ ++msgid "WMM Mode" ++msgstr "WMM Modus" ++ ++msgid "WPA passphrase" ++msgstr "WPA passord" ++ ++msgid "" ++"WPA-Encryption requires wpa_supplicant (for client mode) or hostapd (for AP " ++"and ad-hoc mode) to be installed." ++msgstr "" ++"WPA-Kryptering krever at wpa_supplicant (for klient-modus) eller hostapd " ++"(for AP og ad-hoc-modus) er installert." ++ ++msgid "" ++"Wait for NTP sync that many seconds, seting to 0 disables waiting (optional)" ++msgstr "" ++ ++msgid "Waiting for changes to be applied..." ++msgstr "Venter på at endringer utføres..." ++ ++msgid "Waiting for command to complete..." ++msgstr "Venter på at kommando fullføres..." ++ ++msgid "Warning" ++msgstr "Advarsel" ++ ++msgid "Warning: There are unsaved changes that will be lost while rebooting!" ++msgstr "Advarsel: Det er ulagrede endringer som vil gå tapt under omstarten!" ++ ++msgid "Whether to create an IPv6 default route over the tunnel" ++msgstr "" ++ ++msgid "Whether to route only packets from delegated prefixes" ++msgstr "" ++ ++msgid "Width" ++msgstr "" ++ ++msgid "Wifi" ++msgstr "Trådløs" ++ ++msgid "Wireless" ++msgstr "Trådløs" ++ ++msgid "Wireless Adapter" ++msgstr "Trådløs Tilslutning" ++ ++msgid "Wireless Network" ++msgstr "Trådløst Nettverk" ++ ++msgid "Wireless Overview" ++msgstr "Trådløs Oversikt" ++ ++msgid "Wireless Security" ++msgstr "Trådløs Sikkerhet" ++ ++msgid "Wireless is disabled or not associated" ++msgstr "Trådløs er deaktiver eller ikke tilknyttet" ++ ++msgid "Wireless is restarting..." ++msgstr "Trådløst starter på nytt..." ++ ++msgid "Wireless network is disabled" ++msgstr "Trådløst nettverk er deaktivert" ++ ++msgid "Wireless network is enabled" ++msgstr "Trådløst nettverk er aktivert" ++ ++msgid "Wireless restarted" ++msgstr "Trådløst startet på nytt" ++ ++msgid "Wireless shut down" ++msgstr "Trådløst er slått av" ++ ++msgid "Write received DNS requests to syslog" ++msgstr "Skriv mottatte DNS forespørsler til syslog" ++ ++msgid "XR Support" ++msgstr "XR Støtte" ++ ++msgid "" ++"You can enable or disable installed init scripts here. Changes will applied " ++"after a device reboot.
    Warning: If you disable essential init " ++"scripts like \"network\", your device might become inaccessible!" ++msgstr "" ++"Her kan du aktivere eller deaktivere installerte oppstartsskript. Enheten må " ++"omstartes før endringene blir tatt i bruk.
    Advarsel: Om du " ++"deaktiverer nødvendige init skript som f.eks. \"nettverk\", kan enheten bli " ++"utilgjengelig! " ++ ++msgid "" ++"You must enable Java Script in your browser or LuCI will not work properly." ++msgstr "" ++"Du må aktivere Java Script i nettleseren din ellers vil ikke LuCI fungere " ++"skikkelig." ++ ++msgid "" ++"Your Internet Explorer is too old to display this page correctly. Please " ++"upgrade it to at least version 7 or use another browser like Firefox, Opera " ++"or Safari." ++msgstr "" ++ ++msgid "any" ++msgstr "enhver" ++ ++msgid "auto" ++msgstr "auto" ++ ++msgid "automatic" ++msgstr "" ++ ++msgid "baseT" ++msgstr "baseT" ++ ++msgid "bridged" ++msgstr "brokoblet" ++ ++msgid "create:" ++msgstr "opprett:" ++ ++msgid "creates a bridge over specified interface(s)" ++msgstr "Oppretter en bro mellom angitte grensesnitt" ++ ++msgid "dB" ++msgstr "dB" ++ ++msgid "dBm" ++msgstr "dBm" ++ ++msgid "disable" ++msgstr "Deaktiver" ++ ++msgid "disabled" ++msgstr "" ++ ++msgid "expired" ++msgstr "utgått" ++ ++msgid "" ++"file where given DHCP-leases will be stored" ++msgstr "" ++"filen der gitt DHCP-leier vil bli lagret" ++ ++msgid "forward" ++msgstr "videresend" ++ ++msgid "full-duplex" ++msgstr "full-dupleks" ++ ++msgid "half-duplex" ++msgstr "halv-dupleks" ++ ++msgid "help" ++msgstr "Hjelp" ++ ++msgid "hidden" ++msgstr "skjult" ++ ++msgid "hybrid mode" ++msgstr "" ++ ++msgid "if target is a network" ++msgstr "Dersom målet er et nettverk" ++ ++msgid "input" ++msgstr "inndata" ++ ++msgid "kB" ++msgstr "kB" ++ ++msgid "kB/s" ++msgstr "kB/s" ++ ++msgid "kbit/s" ++msgstr "kbit/s" ++ ++msgid "local DNS file" ++msgstr "lokal DNS-fil" ++ ++msgid "minimum 1280, maximum 1480" ++msgstr "" ++ ++msgid "navigation Navigation" ++msgstr "" ++ ++msgid "no" ++msgstr "nei" ++ ++msgid "no link" ++msgstr "ingen forbindelse" ++ ++msgid "none" ++msgstr "ingen" ++ ++msgid "not present" ++msgstr "" ++ ++msgid "off" ++msgstr "av" ++ ++msgid "on" ++msgstr "på" ++ ++msgid "open" ++msgstr "åpen" ++ ++msgid "overlay" ++msgstr "" ++ ++msgid "relay mode" ++msgstr "" ++ ++msgid "routed" ++msgstr "rutet" ++ ++msgid "server mode" ++msgstr "" ++ ++msgid "skiplink1 Skip to navigation" ++msgstr "" ++ ++msgid "skiplink2 Skip to content" ++msgstr "" ++ ++msgid "stateful-only" ++msgstr "" ++ ++msgid "stateless" ++msgstr "" ++ ++msgid "stateless + stateful" ++msgstr "" ++ ++msgid "tagged" ++msgstr "tagget" ++ ++msgid "unknown" ++msgstr "ukjent" ++ ++msgid "unlimited" ++msgstr "ubegrenset" ++ ++msgid "unspecified" ++msgstr "uspesifisert" ++ ++msgid "unspecified -or- create:" ++msgstr "uspesifisert --eller-- opprett:" ++ ++msgid "untagged" ++msgstr "utagget" ++ ++msgid "yes" ++msgstr "ja" ++ ++msgid "« Back" ++msgstr "« Tilbake" ++ ++#~ msgid "" ++#~ "Always use 40MHz channels even if the secondary channel overlaps. Using " ++#~ "this option does not comply with IEEE 802.11n-2009!" ++#~ msgstr "" ++#~ "Bruk alltid 40MHz kanaler selv om sekundær kanal overlapper. Dette " ++#~ "alternativet er ikke i samsvar med IEEE 802.11n-2009!" ++ ++#~ msgid "Cached" ++#~ msgstr "Hurtigbufret" ++ ++#~ msgid "Configures this mount as overlay storage for block-extroot" ++#~ msgstr "" ++#~ "Konfigurerer dette monteringspunktet som overlay lagringspunkt for block-" ++#~ "extroot" ++ ++#~ msgid "Force 40MHz mode" ++#~ msgstr "Bruk 40MHz modus" ++ ++#~ msgid "Frequency Hopping" ++#~ msgstr "Frekvens Hopping" ++ ++#~ msgid "Locked to channel %d used by %s" ++#~ msgstr "Låst til kanal %d brukt av %s" ++ ++#~ msgid "Use as root filesystem" ++#~ msgstr "Bruk som rot filsystem" ++ ++#~ msgid "HE.net user ID" ++#~ msgstr "HE.net bruker ID" ++ ++#~ msgid "This is the 32 byte hex encoded user ID, not the login name" ++#~ msgstr "Dette er det 32 byte hexkodede bruker ID'en, ikke påloggingsnavnet" ++ ++#~ msgid "40MHz 2nd channel above" ++#~ msgstr "40MHz, Sekundær kanal over" ++ ++#~ msgid "40MHz 2nd channel below" ++#~ msgstr "40MHz, Sekundær kanal under" ++ ++#~ msgid "Accept router advertisements" ++#~ msgstr "Godta ruterkunngjøringer" ++ ++#~ msgid "Advertise IPv6 on network" ++#~ msgstr "Annonser IPv6 på nettverket" ++ ++#~ msgid "Advertised network ID" ++#~ msgstr "Annonsert nettverks ID" ++ ++#~ msgid "Allowed range is 1 to 65535" ++#~ msgstr "Det tillatte området er fra 1 til 65535" ++ ++#~ msgid "HT capabilities" ++#~ msgstr "HT Muligheter" ++ ++#~ msgid "HT mode" ++#~ msgstr "HT Modus" ++ ++#~ msgid "Router Model" ++#~ msgstr "Ruter Modell" ++ ++#~ msgid "Router Name" ++#~ msgstr "Ruter Navn" ++ ++#~ msgid "Send router solicitations" ++#~ msgstr "Send ruter anmodninger" ++ ++#~ msgid "Specifies the advertised preferred prefix lifetime in seconds" ++#~ msgstr "Angir den annonserte foretrukne prefikslevetiden i sekunder" ++ ++#~ msgid "Specifies the advertised valid prefix lifetime in seconds" ++#~ msgstr "Angir den annonserte gyldige prefikslevetiden i sekunder" ++ ++#~ msgid "Use preferred lifetime" ++#~ msgstr "Bruk foretrukket levetid" ++ ++#~ msgid "Use valid lifetime" ++#~ msgstr "Bruk gyldig levetid" ++ ++#~ msgid "Waiting for router..." ++#~ msgstr "Venter på ruter..." ++ ++#~ msgid "Active Leases" ++#~ msgstr "Aktive leier" ++ ++#~ msgid "Open" ++#~ msgstr "Åpne" ++ ++#~ msgid "KB" ++#~ msgstr "KB" ++ ++#~ msgid "Bit Rate" ++#~ msgstr "Bithastighet" ++ ++#~ msgid "Configuration / Apply" ++#~ msgstr "Konfigurasjon / Bruk" ++ ++#~ msgid "Configuration / Changes" ++#~ msgstr "Konfigurasjon / Endringer" ++ ++#~ msgid "Configuration / Revert" ++#~ msgstr "Konfigurasjon / Tilbakestill" ++ ++#~ msgid "MAC" ++#~ msgstr "MAC" ++ ++#~ msgid "MAC Address" ++#~ msgstr "MAC adresse" ++ ++#~ msgid "Encr." ++#~ msgstr "Kryptert" ++ ++#~ msgid "WLAN-Scan" ++#~ msgstr "WLAN-Skanning" ++ ++#~ msgid "" ++#~ "Choose the network you want to attach to this wireless interface. Select " ++#~ "unspecified to not attach any network or fill out the " ++#~ "create field to define a new network." ++#~ msgstr "" ++#~ "Velg det nettverket du ønsker å knytte til dette trådløse grensesnittet. " ++#~ "Velg uspesifisert for ikke tilknytte noe nettverk, eller fyll ut " ++#~ "opprett feltet for å definere et nytt nettverk." ++ ++#~ msgid "Create Network" ++#~ msgstr "Opprett Nettverk" ++ ++#~ msgid "Link" ++#~ msgstr "Link" ++ ++#~ msgid "Networks" ++#~ msgstr "Nettverk" ++ ++#~ msgid "Power" ++#~ msgstr "Styrke" ++ ++#~ msgid "Wifi networks in your local environment" ++#~ msgstr "Trådløse nettverk i nærheten av deg" ++ ++#~ msgid "" ++#~ "CIDR-Notation: " ++#~ "address/prefix" ++#~ msgstr "" ++#~ "CIDR-Notasjon: " ++#~ "adresse/prefiks" ++ ++#~ msgid "DNS-Server" ++#~ msgstr "DNS-Server" ++ ++#~ msgid "IPv4-Broadcast" ++#~ msgstr "" ++#~ "IPv4-Kringkasting" ++ ++#~ msgid "IPv6-Address" ++#~ msgstr "IPv6-Adresse" ++ ++#~ msgid "IP-Aliases" ++#~ msgstr "IP aliaser" ++ ++#~ msgid "IPv6 Setup" ++#~ msgstr "IPv6 oppsett" ++ ++#~ msgid "" ++#~ "Note: If you choose an interface here which is part of another network, " ++#~ "it will be moved into this network." ++#~ msgstr "" ++#~ "Vær oppmerksom på at om du velger et grensesnitt som allerede er med et " ++#~ "annet nettverk, blir det flyttet til dette nettverket" ++ ++#~ msgid "" ++#~ "Really delete this interface? The deletion cannot be undone!\\nYou might " ++#~ "lose access to this router if you are connected via this interface." ++#~ msgstr "" ++#~ "Fjerne dette grensesnittet? Slettingen kan ikke omgjøres!\\nDu kan miste " ++#~ "kontakten med ruteren om du er tilkoblet via dette grensesnittet." ++ ++#~ msgid "" ++#~ "Really delete this wireless network? The deletion cannot be undone!\\nYou " ++#~ "might lose access to this router if you are connected via this network." ++#~ msgstr "" ++#~ "Fjerne dette trådløse nettverket? Slettingen kan ikke omgjøres!\\nDu kan " ++#~ "miste kontakten med ruteren om du er tilkoblet via dette nettverket." ++ ++#~ msgid "" ++#~ "Really shutdown interface \"%s\" ?\\nYou might lose access to this router " ++#~ "if you are connected via this interface." ++#~ msgstr "" ++#~ "Slå av dette grensesnittet? \"%s\" ?\\nDu kan miste kontakten med ruteren " ++#~ "om du er tilkoblet via dette grensesnittet." ++ ++#~ msgid "" ++#~ "The network ports on your router can be combined to several VLANs in which computers can " ++#~ "communicate directly with each other. VLANs are often used to separate different network " ++#~ "segments. Often there is by default one Uplink port for a connection to " ++#~ "the next greater network like the internet and other ports for a local " ++#~ "network." ++#~ msgstr "" ++#~ "Nettverks portene på ruteren kan kombineres til flere VLANs der datamaskiner kan kommunisere " ++#~ "direkte med hverandre. VLANs " ++#~ "brukes ofte for å skille ulike nettverk segmenter. Det er vanlig og ha en " ++#~ "uplink-port for tilkobling til større nettverk som internett og andre " ++#~ "porter til lokalt nettverk." ++ ++#~ msgid "Custom Files" ++#~ msgstr "Egendefinerte Filer" ++ ++#~ msgid "Custom files" ++#~ msgstr "Egendefinerte filer" ++ ++#~ msgid "Detected Files" ++#~ msgstr "Filer funnet" ++ ++#~ msgid "Detected files" ++#~ msgstr "Filer funnet" ++ ++#~ msgid "Files to be kept when flashing a new firmware" ++#~ msgstr "Beholde filer ved programvare oppgradering" ++ ++#~ msgid "General" ++#~ msgstr "Generelt" ++ ++#~ msgid "" ++#~ "Here you can customize the settings and the functionality of LuCI." ++#~ msgstr "Her kan du endre innstillinger og funksjonaliteten til LuCI." ++ ++#~ msgid "Post-commit actions" ++#~ msgstr "Aktiver endringer" ++ ++#~ msgid "" ++#~ "The following files are detected by the system and will be kept " ++#~ "automatically during sysupgrade" ++#~ msgstr "" ++#~ "Følgende filer er oppdaget av systemet og vil automatisk bli bevart under " ++#~ "systemoppgradering" ++ ++#~ msgid "" ++#~ "These commands will be executed automatically when a given UCI configuration is committed " ++#~ "allowing changes to be applied instantly." ++#~ msgstr "" ++#~ "Disse endringene vil bli utført automatisk når en UCI konfigurasjon brukes, endringen trer " ++#~ "i kraft umiddelbart." ++ ++#~ msgid "" ++#~ "This is a list of shell glob patterns for matching files and directories " ++#~ "to include during sysupgrade" ++#~ msgstr "" ++#~ "Dette er en liste med filer og regler som skal inkluderes ved " ++#~ "systemoppgradering" ++ ++#~ msgid "Web UI" ++#~ msgstr "Web Brukergrensesnitt" ++ ++#~ msgid "PPTP-Server" ++#~ msgstr "" ++#~ "PPTP-Server" ++ ++#~ msgid "AHCP Settings" ++#~ msgstr "AHCP Innstillinger" ++ ++#~ msgid "ARP ping retries" ++#~ msgstr "ARP ping forsøk" ++ ++#~ msgid "ATM Settings" ++#~ msgstr "ATMInnstillinger" ++ ++#~ msgid "Accept Router Advertisements" ++#~ msgstr "Godta Ruter Annonseringer" ++ ++#~ msgid "Access point (APN)" ++#~ msgstr "Aksesspunkt (APN)" ++ ++#~ msgid "Additional pppd options" ++#~ msgstr "Andre pppd alternativer" ++ ++#~ msgid "Allowed range is 1 to FFFF" ++#~ msgstr "Det tillatte området er 1 til FFFF" ++ ++#~ msgid "Automatic Disconnect" ++#~ msgstr "Automatisk nedkobling" ++ ++#~ msgid "Backup Archive" ++#~ msgstr "Sikkerhetskopi arkiv" ++ ++#~ msgid "" ++#~ "Configure the local DNS server to use the name servers adverticed by the " ++#~ "PPP peer" ++#~ msgstr "" ++#~ "Konfigurer den lokale DNS-serveren slik at den bruker navnetjeneren som " ++#~ "blir gitt av PPP peer" ++ ++#~ msgid "Connect script" ++#~ msgstr "Oppkoblings skript" ++ ++#~ msgid "Create backup" ++#~ msgstr "Lag sikkerhetskopi" ++ ++#~ msgid "Default" ++#~ msgstr "Standard" ++ ++#~ msgid "Disconnect script" ++#~ msgstr "Frakoblings skript" ++ ++#~ msgid "Edit package lists and installation targets" ++#~ msgstr "Endre pakke-liste og installasjon mål" ++ ++#~ msgid "Enable 4K VLANs" ++#~ msgstr "Aktiver 4K VLANs" ++ ++#~ msgid "Enable IPv6 on PPP link" ++#~ msgstr "Aktiver IPv6 på PPP lenke" ++ ++#~ msgid "Firmware image" ++#~ msgstr "Firmware fil" ++ ++#~ msgid "Forward DHCP" ++#~ msgstr "Videresend DHCP" ++ ++#~ msgid "Forward broadcasts" ++#~ msgstr "Videresend broadcast" ++ ++#~ msgid "HE.net Tunnel ID" ++#~ msgstr "HE.net Tunnel ID" ++ ++#~ msgid "" ++#~ "Here you can backup and restore your router configuration and - if " ++#~ "possible - reset the router to the default settings." ++#~ msgstr "" ++#~ "Her kan du ta sikkerhetskopi og gjenopprette ruterens konfigurasjon og -" ++#~ "om mulig- tilbakestille ruteren til standardinnstillingene." ++ ++#~ msgid "Installation targets" ++#~ msgstr "Installasjon mål" ++ ++#~ msgid "Keep configuration files" ++#~ msgstr "Behold konfigurasjonsfiler" ++ ++#~ msgid "Keep-Alive" ++#~ msgstr "Keep-Alive" ++ ++#~ msgid "Kernel" ++#~ msgstr "Kjerne" ++ ++#~ msgid "" ++#~ "Let pppd replace the current default route to use the PPP interface after " ++#~ "successful connect" ++#~ msgstr "" ++#~ "Etter vellykket oppkobling, la pppd erstatte standard rute og sett den " ++#~ "opp for PPP-grensesnittet" ++ ++#~ msgid "Let pppd run this script after establishing the PPP link" ++#~ msgstr "La pppd kjøre dette skriptet etter PPP oppkobling" ++ ++#~ msgid "Let pppd run this script before tearing down the PPP link" ++#~ msgstr "La pppd kjøre dette skriptet før frakobling av PPP lenke" ++ ++#~ msgid "" ++#~ "Make sure that you provide the correct pin code here or you might lock " ++#~ "your sim card!" ++#~ msgstr "" ++#~ "Pass på at du oppgir riktig PIN-kode her, om ikke kan du låse SIM-kortet!" ++ ++#~ msgid "" ++#~ "Most of them are network servers, that offer a certain service for your " ++#~ "device or network like shell access, serving webpages like LuCI, doing mesh routing, sending " ++#~ "e-mails, ..." ++#~ msgstr "" ++#~ "De fleste av dem er nettverkstjenere som tilbyr tjenester på enheten " ++#~ "eller nettverket. Som f.eks. shell tilgang, webserver for LuCI, mesh ruting, sende e-" ++#~ "post, ..." ++ ++#~ msgid "Number of failed connection tests to initiate automatic reconnect" ++#~ msgstr "" ++#~ "Antallet mislykkede forsøk på forbindelse før automatisk oppkobling blir " ++#~ "initiert." ++ ++#~ msgid "Override Gateway" ++#~ msgstr "Overstyr Gateway" ++ ++#~ msgid "PIN code" ++#~ msgstr "PIN kode" ++ ++#~ msgid "PPP Settings" ++#~ msgstr "PPP Innstillinger" ++ ++#~ msgid "Package lists" ++#~ msgstr "Pakke-lister" ++ ++#~ msgid "" ++#~ "Port PVIDs specify the default " ++#~ "VLAN ID added to received untagged frames." ++#~ msgstr "" ++#~ "Port PVIDs spesifiserer standard " ++#~ "VLAN ID som legges på mottatte utaggete ethernet-rammer.
    " ++ ++#~ msgid "Port PVIDs on %q" ++#~ msgstr "Port PVIDs på %q" ++ ++#~ msgid "Proceed reverting all settings and resetting to firmware defaults?" ++#~ msgstr "Fortsette tilbakestilling av alle innstillinger til standard?" ++ ++#~ msgid "Processor" ++#~ msgstr "Prosessor" ++ ++#~ msgid "Radius-Port" ++#~ msgstr "Radius-Port" ++ ++#~ msgid "Radius-Server" ++#~ msgstr "Radius-Server" ++ ++#~ msgid "Relay Settings" ++#~ msgstr "Relay Innstillinger" ++ ++#~ msgid "Replace default route" ++#~ msgstr "Erstatt standard rute" ++ ++#~ msgid "Reset router to defaults" ++#~ msgstr "Tilbakestill ruteren til standard innstilling" ++ ++#~ msgid "Routing table ID" ++#~ msgstr "Ruting tabell ID" ++ ++#~ msgid "" ++#~ "Seconds to wait for the modem to become ready before attempting to connect" ++#~ msgstr "Antall sekunder en må vente før modemet er klar for oppkobling" ++ ++#~ msgid "Send Router Solicitiations" ++#~ msgstr "Send Ruter Anmodninger" ++ ++#~ msgid "Server IPv4-Address" ++#~ msgstr "Server IPv4-Adresse" ++ ++#~ msgid "Service type" ++#~ msgstr "Tjeneste type" ++ ++#~ msgid "Services and daemons perform certain tasks on your device." ++#~ msgstr "Tjenester og daemoner utfører forskjellige oppgaver på enheten." ++ ++#~ msgid "Settings" ++#~ msgstr "Innstillinger" ++ ++#~ msgid "Setup wait time" ++#~ msgstr "Initialiserings ventetid" ++ ++#~ msgid "" ++#~ "Sorry. OpenWrt does not support a system upgrade on this platform.
    " ++#~ "You need to manually flash your device." ++#~ msgstr "" ++#~ "Beklager. OpenWrt støtter ikke systemoppgradering på denne plattformen." ++#~ "
    Du mÃ¥ flashe enheten manuelt." ++ ++#~ msgid "Specify additional command line arguments for pppd here" ++#~ msgstr "Angi flere kommandolinje argumenter for pppd her" ++ ++#~ msgid "TTL" ++#~ msgstr "TTL" ++ ++#~ msgid "The device node of your modem, e.g. /dev/ttyUSB0" ++#~ msgstr "Node enheten for modemet, f.eks. /dev/ttyUSB0" ++ ++#~ msgid "Time (in seconds) after which an unused connection will be closed" ++#~ msgstr "Tid (i sekunder) før ubrukt forbindelse vil bli frakoblet" ++ ++#~ msgid "Time Server (rdate)" ++#~ msgstr "Tids Server (rdate)" ++ ++#~ msgid "Tunnel Settings" ++#~ msgstr "Tunnel Innstillinger" ++ ++#~ msgid "Update package lists" ++#~ msgstr "Oppdater pakke-listene" ++ ++#~ msgid "Upload an OpenWrt image file to reflash the device." ++#~ msgstr "" ++#~ "Last opp en OpenWrt Firmware fil, som deretter blir brukt til Ã¥ " ++#~ "oppgradere enheten." ++ ++#~ msgid "Upload image" ++#~ msgstr "Last opp firmware" ++ ++#~ msgid "Use peer DNS" ++#~ msgstr "Bruk peer DNS" ++ ++#~ msgid "VLAN %d" ++#~ msgstr "VLAN %d" ++ ++#~ msgid "" ++#~ "You can specify multiple DNS servers here, press enter to add a new " ++#~ "entry. Servers entered here will override automatically assigned ones." ++#~ msgstr "" ++#~ "Her kan du definere flere DNS servere, trykk 'Enter' for Ã¥ legge til en " ++#~ "ny oppføring. Servere definert her vil overstyre de automatisk tildelte." ++ ++#~ msgid "" ++#~ "You need to install \"comgt\" for UMTS/GPRS, \"ppp-mod-pppoe\" for PPPoE, " ++#~ "\"ppp-mod-pppoa\" for PPPoA or \"pptp\" for PPtP support" ++#~ msgstr "" ++#~ "Du mÃ¥ installere \"comgt\" for UMTS/GPRS, \"ppp-mod-pppoe\" for PPPoE, " ++#~ "\"ppp-mod-pppoa\" for PPPoA eller \"pptp\" for PPtP støtte" ++ ++#~ msgid "back" ++#~ msgstr "tilbake" ++ ++#~ msgid "buffered" ++#~ msgstr "bufret" ++ ++#~ msgid "cached" ++#~ msgstr "hurtigbufrede" ++ ++#~ msgid "free" ++#~ msgstr "tilgjengelig" ++ ++#~ msgid "static" ++#~ msgstr "Statisk" ++ ++#~ msgid "" ++#~ "LuCI is a collection " ++#~ "of free Lua software including an MVC-Webframework and webinterface for embedded devices. LuCI is licensed under the " ++#~ "Apache-License." ++#~ msgstr "" ++#~ "LuCI er en samling av " ++#~ "fri Lua programvare som inkluderer MVC-Webframework og webgrensnitt for innebygde enheter. LuCI er lisensert under " ++#~ "Apache-lisensen." ++ ++#~ msgid "SSH-Keys" ++#~ msgstr "SSH-Nøkler" ++ ++#~ msgid "" ++#~ "A lightweight HTTP/1.1 webserver written in C and Lua designed to serve " ++#~ "LuCI" ++#~ msgstr "En lettvekts HTTP/1.1 webserver skrevet i C og Lua laget for LuCI" ++ ++#~ msgid "" ++#~ "A small webserver which can be used to serve LuCI." ++#~ msgstr "" ++#~ "En lettvekts webserver som kan brukes til Ã¥ tjene LuCI." ++ ++#~ msgid "About" ++#~ msgstr "Om" ++ ++#~ msgid "Active IP Connections" ++#~ msgstr "Aktive IP tilkoblinger" ++ ++#~ msgid "Addresses" ++#~ msgstr "Adresser" ++ ++#~ msgid "Admin Password" ++#~ msgstr "Admin Passord" ++ ++#~ msgid "Alias" ++#~ msgstr "Alias" ++ ++#~ msgid "Authentication Realm" ++#~ msgstr "Passord beskyttet omrÃ¥de" ++ ++#~ msgid "Bridge Port" ++#~ msgstr "Bro Port" ++ ++#~ msgid "" ++#~ "Change the password of the system administrator (User root)" ++#~ msgstr "Endre passordet for systemansvarlig (Bruker root)" ++ ++#~ msgid "Client + WDS" ++#~ msgstr "Klient + WDS" ++ ++#~ msgid "Configuration file" ++#~ msgstr "Konfigurasjonsfil" ++ ++#~ msgid "Connection timeout" ++#~ msgstr "Tidsavbrudd for tilkobling" ++ ++#~ msgid "Contributing Developers" ++#~ msgstr "Medvirkende utviklere" ++ ++#~ msgid "DHCP assigned" ++#~ msgstr "DHCP tildelt" ++ ++#~ msgid "Document root" ++#~ msgstr "Dokument-roten" ++ ++#~ msgid "Enable Keep-Alive" ++#~ msgstr "Aktiver Keep-Alive" ++ ++#~ msgid "Enable device" ++#~ msgstr "Aktiver enhet" ++ ++#~ msgid "Ethernet Bridge" ++#~ msgstr "Ethernet Bro" ++ ++#~ msgid "" ++#~ "Here you can paste public SSH-Keys " ++#~ "(one per line) for SSH public-key " ++#~ "authentication." ++#~ msgstr "" ++#~ "Her kan du lime inn felles SSH-nøkler " ++#~ "(en per linje) for SSH godkjenning." ++ ++#~ msgid "ID" ++#~ msgstr "ID" ++ ++#~ msgid "IP Configuration" ++#~ msgstr "IP Konfigurasjon" ++ ++#~ msgid "Interface Status" ++#~ msgstr "Grensesnitt Status" ++ ++#~ msgid "Lead Development" ++#~ msgstr "Hovedutviklere" ++ ++#~ msgid "Master" ++#~ msgstr "Aksesspunkt" ++ ++#~ msgid "Master + WDS" ++#~ msgstr "Aksesspunkt + WDS" ++ ++#~ msgid "No address configured on this interface." ++#~ msgstr "Ingen adresse er konfigurert pÃ¥ dette grensesnittet." ++ ++#~ msgid "Not configured" ++#~ msgstr "Ikke konfigurert" ++ ++#~ msgid "Password successfully changed" ++#~ msgstr "Passordet er endret" ++ ++#~ msgid "Plugin path" ++#~ msgstr "Plugin sti" ++ ++#~ msgid "Ports" ++#~ msgstr "Porter" ++ ++#~ msgid "Primary" ++#~ msgstr "Primær" ++ ++#~ msgid "Project Homepage" ++#~ msgstr "Prosjektets Hjemmeside" ++ ++#~ msgid "Pseudo Ad-Hoc" ++#~ msgstr "Pseudo Ad-Hoc" ++ ++#~ msgid "STP" ++#~ msgstr "STP" ++ ++#~ msgid "Thanks To" ++#~ msgstr "Takk til" ++ ++#~ msgid "" ++#~ "The realm which will be displayed at the authentication prompt for " ++#~ "protected pages." ++#~ msgstr "Beskrivelse av passord beskyttet omrÃ¥de, vises ved innlogging." ++ ++#~ msgid "Unknown Error" ++#~ msgstr "Ukjent feil" ++ ++#~ msgid "VLAN" ++#~ msgstr "VLAN" ++ ++#~ msgid "defaults to /etc/httpd.conf" ++#~ msgstr "Standard /etc/httpd.conf" ++ ++#~ msgid "Enable this switch" ++#~ msgstr "Aktiver denne svitsj" ++ ++#~ msgid "OPKG error code %i" ++#~ msgstr "OPKG feil kode %i" ++ ++#~ msgid "Package lists updated" ++#~ msgstr "Pakke-listene oppdatert" ++ ++#~ msgid "Reset switch during setup" ++#~ msgstr "Nullstill svitsj under oppstart" ++ ++#~ msgid "Upgrade installed packages" ++#~ msgstr "Oppgrader installerte pakker" +diff --git a/feeds/luci/modules/luci-base/po/pl/base.po b/feeds/luci/modules/luci-base/po/pl/base.po +new file mode 100644 +index 0000000..e1ec57f +--- /dev/null ++++ b/feeds/luci/modules/luci-base/po/pl/base.po +@@ -0,0 +1,3406 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: LuCI\n" ++"Report-Msgid-Bugs-To: \n" ++"POT-Creation-Date: 2010-04-20 09:40+0200\n" ++"PO-Revision-Date: 2014-04-23 19:15+0200\n" ++"Last-Translator: goodgod261 \n" ++"Language-Team: Polish\n" ++"Language: pl\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 " ++"|| n%100>=20) ? 1 : 2);\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "(%d minute window, %d second interval)" ++msgstr "(okno %d minut, interwaÅ‚ %d sekund)" ++ ++msgid "(%s available)" ++msgstr "(dostÄ™pne %s)" ++ ++msgid "(empty)" ++msgstr "(pusty)" ++ ++msgid "(no interfaces attached)" ++msgstr "(brak podÅ‚Ä…czonych interfejsów)" ++ ++msgid "-- Additional Field --" ++msgstr "-- Dodatkowe pole --" ++ ++msgid "-- Please choose --" ++msgstr "-- ProszÄ™ wybrać --" ++ ++msgid "-- custom --" ++msgstr "-- wÅ‚asne --" ++ ++msgid "-- match by device --" ++msgstr "" ++ ++msgid "-- match by label --" ++msgstr "" ++ ++msgid "1 Minute Load:" ++msgstr "Obciążenie 1 min.:" ++ ++msgid "15 Minute Load:" ++msgstr "Obciążenie 15 min.:" ++ ++msgid "5 Minute Load:" ++msgstr "Obciążenie 5 min.:" ++ ++msgid "BSSID" ++msgstr "BSSID" ++ ++msgid "DNS query port" ++msgstr "Port wywoÅ‚ania DNS" ++ ++msgid "DNS server port" ++msgstr "Port serwera DNS" ++ ++msgid "" ++"DNS servers will be queried in the " ++"order of the resolvfile" ++msgstr "" ++"Nazwa DNS bÄ™dzie rozwijana przez " ++"kolejne serwery w porzÄ…dku podanym w resolvfile" ++ ++msgid "ESSID" ++msgstr "ESSID" ++ ++msgid "IPv4-Address" ++msgstr "Adres IPv4" ++ ++msgid "IPv4-Gateway" ++msgstr "Brama IPv4" ++ ++msgid "IPv4-Netmask" ++msgstr "Maska sieci IPv4" ++ ++msgid "" ++"IPv6-Address or Network " ++"(CIDR)" ++msgstr "" ++"Adres sieci (CIDR) IPv6" ++ ++msgid "IPv6-Gateway" ++msgstr "Brama IPv6" ++ ++msgid "IPv6-Suffix (hex)" ++msgstr "" ++ ++msgid "LED Configuration" ++msgstr "Konfiguracja diod LED" ++ ++msgid "LED Name" ++msgstr "Nazwa diody LED" ++ ++msgid "MAC-Address" ++msgstr "Adres MAC" ++ ++msgid "" ++"Max. DHCP leases" ++msgstr "" ++"Maks. dzierżaw DHCP" ++ ++msgid "" ++"Max. EDNS0 packet size" ++msgstr "" ++"Maks. rozmiar pakietu EDNS0" ++ ++msgid "Max. concurrent queries" ++msgstr "Maks. zapytaÅ„ równoczesnych" ++ ++msgid "%s - %s" ++msgstr "%s - %s" ++ ++msgid "ADSL" ++msgstr "" ++ ++msgid "ADSL Status" ++msgstr "" ++ ++msgid "AICCU (SIXXS)" ++msgstr "" ++ ++msgid "APN" ++msgstr "APN" ++ ++# Wydaje mi siÄ™ że brakuje litery R... ++msgid "AR Support" ++msgstr "Wsparcie dla ARP" ++ ++msgid "ARP retry threshold" ++msgstr "Próg powtórzeÅ„ ARP" ++ ++msgid "ATM Bridges" ++msgstr "Mostki ATM" ++ ++# Nie wiem czy to powinno siÄ™ tÅ‚umaczyć wg. mnie lepiej zostawić po angielsku ++msgid "ATM Virtual Channel Identifier (VCI)" ++msgstr "Identyfikator kanaÅ‚u wirtualnego ATM (VCI)" ++ ++# j.w. ++msgid "ATM Virtual Path Identifier (VPI)" ++msgstr "Identyfikator Å›cieżki wirtualnej ATM (VPI)" ++ ++# Jak zwykle zakrÄ™ciÅ‚em...niech ktoÅ› poprawi ++msgid "" ++"ATM bridges expose encapsulated ethernet in AAL5 connections as virtual " ++"Linux network interfaces which can be used in conjunction with DHCP or PPP " ++"to dial into the provider network." ++msgstr "" ++"Mostki ATM maskujÄ… za-kapsuÅ‚kowane ramki Ethernet w poÅ‚Ä…czeniach AAL5 jako " ++"wirtualne interfejsy w Linuksie. Interfejsy takie mogÄ… być użyte w " ++"poÅ‚Ä…czeniu z protokoÅ‚ami DHCP lub PPP do wdzwaniania siÄ™ do sieci provider`a" ++ ++msgid "ATM device number" ++msgstr "Numer urzÄ…dzenia ATM" ++ ++msgid "AYIYA" ++msgstr "" ++ ++# co to takiego? ++msgid "Access Concentrator" ++msgstr "Koncentrator dostÄ™powy ATM" ++ ++msgid "Access Point" ++msgstr "Punkt dostÄ™powy" ++ ++msgid "Action" ++msgstr "Akcja" ++ ++msgid "Actions" ++msgstr "Akcje" ++ ++msgid "Activate this network" ++msgstr "Aktywuj tÄ… sieć" ++ ++msgid "Active IPv4-Routes" ++msgstr "" ++"Aktywne trasy routingu IPv4" ++ ++msgid "Active IPv6-Routes" ++msgstr "" ++"Aktywne trasy routingu IPv6" ++ ++msgid "Active Connections" ++msgstr "Aktywne poÅ‚Ä…czenia" ++ ++msgid "Active DHCP Leases" ++msgstr "Aktywne dzierżawy DHCP" ++ ++msgid "Active DHCPv6 Leases" ++msgstr "Aktywne dzierżawy DHCPv6" ++ ++msgid "Ad-Hoc" ++msgstr "Ad-Hoc" ++ ++msgid "Add" ++msgstr "Dodaj" ++ ++msgid "Add local domain suffix to names served from hosts files" ++msgstr "Dodaj lokalny sufiks domeny do nazw urzÄ…dzeÅ„ z pliku hosts" ++ ++msgid "Add new interface..." ++msgstr "Dodaj nowy interfejs..." ++ ++msgid "Additional Hosts files" ++msgstr "Dodatkowe pliki Hosts" ++ ++msgid "Address" ++msgstr "Adres" ++ ++# Na upartego można by zrobić Adres dostÄ™powy mostu przekaźnikowego - ale kto to zrozumie? ++msgid "Address to access local relay bridge" ++msgstr "Adres dostÄ™powy do \"relay bridge\"" ++ ++msgid "Administration" ++msgstr "ZarzÄ…dzanie" ++ ++msgid "Advanced Settings" ++msgstr "Ustawienia zaawansowane" ++ ++msgid "Alert" ++msgstr "Alarm" ++ ++msgid "Allow SSH password authentication" ++msgstr "Pozwól na logowanie SSH" ++ ++msgid "Allow all except listed" ++msgstr "Pozwól wszystkim oprócz wymienionych" ++ ++msgid "Allow listed only" ++msgstr "Pozwól tylko wymienionym" ++ ++msgid "Allow localhost" ++msgstr "Pozwól tylko sobie (localhost)" ++ ++msgid "Allow remote hosts to connect to local SSH forwarded ports" ++msgstr "" ++"Pozwól zdalnym komputerom na poÅ‚Ä…czenia SSH do lokalnych przekierowanych " ++"portów" ++ ++msgid "Allow root logins with password" ++msgstr "Zezwól na logowanie roota przy pomocy hasÅ‚a" ++ ++# Brak spacji... ++msgid "Allow the root user to login with password" ++msgstr "Pozwól użytkownikowi root na logowanie przy pomocy hasÅ‚a" ++ ++msgid "" ++"Allow upstream responses in the 127.0.0.0/8 range, e.g. for RBL services" ++msgstr "" ++"Pozwól na ruch wychodzÄ…cy (odpowiedzi) z podsieci 127.0.0.0/8, np. usÅ‚ugi RBL" ++ ++msgid "" ++"Also see Tunneling Comparison on SIXXS" ++msgstr "" ++ ++msgid "Always announce default router" ++msgstr "" ++ ++msgid "An additional network will be created if you leave this unchecked." ++msgstr "" ++"Zostanie utworzona dodatkowa sieć jeÅ›li zostawisz tÄ… opcjÄ™ niezaznaczonÄ…." ++ ++msgid "Announce as default router even if no public prefix is available." ++msgstr "" ++ ++msgid "Announced DNS domains" ++msgstr "" ++ ++msgid "Announced DNS servers" ++msgstr "" ++ ++msgid "Antenna 1" ++msgstr "Antena 1" ++ ++msgid "Antenna 2" ++msgstr "Antena 2" ++ ++msgid "Antenna Configuration" ++msgstr "Ustawienia anteny" ++ ++msgid "Any zone" ++msgstr "Dowolna strefa" ++ ++msgid "Apply" ++msgstr "Zatwierdź" ++ ++msgid "Applying changes" ++msgstr "Wprowadzam zmiany" ++ ++msgid "" ++"Assign a part of given length of every public IPv6-prefix to this interface" ++msgstr "" ++ ++msgid "Assign interfaces..." ++msgstr "Przypisz interfejsy..." ++ ++msgid "" ++"Assign prefix parts using this hexadecimal subprefix ID for this interface." ++msgstr "" ++ ++msgid "Associated Stations" ++msgstr "PoÅ‚Ä…czone stacje" ++ ++msgid "Atheros 802.11%s Wireless Controller" ++msgstr "Bezprzewodowy kontroler Atheros 802.11%s" ++ ++msgid "AuthGroup" ++msgstr "" ++ ++msgid "Authentication" ++msgstr "Uwierzytelnianie" ++ ++# Nawet M$ tego nie tÅ‚umaczy;) ++msgid "Authoritative" ++msgstr "Autorytatywny" ++ ++msgid "Authorization Required" ++msgstr "Wymagana autoryzacja" ++ ++msgid "Auto Refresh" ++msgstr "Automatyczne odÅ›wieżanie" ++ ++msgid "Automatic" ++msgstr "" ++ ++msgid "Automatic Homenet (HNCP)" ++msgstr "" ++ ++msgid "Available" ++msgstr "DostÄ™pne" ++ ++msgid "Available packages" ++msgstr "DostÄ™pne pakiety" ++ ++msgid "Average:" ++msgstr "Åšrednia:" ++ ++msgid "BSSID" ++msgstr "BSSID" ++ ++msgid "Back" ++msgstr "Wróć" ++ ++msgid "Back to Overview" ++msgstr "Wróć do przeglÄ…du" ++ ++msgid "Back to configuration" ++msgstr "Wróć do konfiguracji" ++ ++msgid "Back to overview" ++msgstr "Wróć do przeglÄ…du" ++ ++msgid "Back to scan results" ++msgstr "Wróć do wyników skanowania" ++ ++msgid "Background Scan" ++msgstr "Skanowanie w tle" ++ ++msgid "Backup / Flash Firmware" ++msgstr "Kopia zapasowa/aktualizacja firmware" ++ ++# NIe ma powodu skracać tekstu, zmieÅ›ci siÄ™ w polu. ++msgid "Backup / Restore" ++msgstr "Kopia zapasowa/Przywróć" ++ ++msgid "Backup file list" ++msgstr "Kopia zapas. listy plików" ++ ++msgid "Bad address specified!" ++msgstr "Wprowadzono zÅ‚y adres" ++ ++msgid "Band" ++msgstr "" ++ ++msgid "Behind NAT" ++msgstr "" ++ ++msgid "" ++"Below is the determined list of files to backup. It consists of changed " ++"configuration files marked by opkg, essential base files and the user " ++"defined backup patterns." ++msgstr "" ++"Poniżej widoczna jest lista plików przeznaczonych do kopii zapasowej. " ++"Zawiera ona zmienione pliki konfiguracyjne oznaczone przez opkg, podstawowe " ++"pliki systemowe, oraz pliki oznaczone do kopiowania przez użytkownika." ++ ++msgid "Bitrate" ++msgstr "PrzepÅ‚ywność" ++ ++msgid "Bogus NX Domain Override" ++msgstr "Podrób statystyki NXDOMAIN" ++ ++msgid "Bridge" ++msgstr "Most" ++ ++msgid "Bridge interfaces" ++msgstr "Interfejs mostu" ++ ++msgid "Bridge unit number" ++msgstr "Numer Mostu (urzÄ…dzenia)" ++ ++# Podejrzewam że chodzi o interfejs? mam racjÄ™? ++msgid "Bring up on boot" ++msgstr "PodnieÅ› przy stracie" ++ ++msgid "Broadcom 802.11%s Wireless Controller" ++msgstr "Bezprzewodowy kontroler Broadcom 802.11%s" ++ ++msgid "Broadcom BCM%04x 802.11 Wireless Controller" ++msgstr "Bezprzewodowy kontroler Broadcom BCM%04x 802.11" ++ ++msgid "Buffered" ++msgstr "Buforowana" ++ ++msgid "Buttons" ++msgstr "Przyciski" ++ ++msgid "CA certificate; if empty it will be saved after the first connection." ++msgstr "" ++ ++msgid "CPU" ++msgstr "CPU" ++ ++msgid "CPU usage (%)" ++msgstr "Użycie CPU (%)" ++ ++msgid "Cancel" ++msgstr "Anuluj" ++ ++msgid "Category" ++msgstr "" ++ ++msgid "Chain" ++msgstr "ÅaÅ„cuch" ++ ++msgid "Changes" ++msgstr "Zmiany" ++ ++msgid "Changes applied." ++msgstr "Zmiany zostaÅ‚y zastosowane." ++ ++msgid "Changes the administrator password for accessing the device" ++msgstr "Zmienia hasÅ‚o administratora" ++ ++msgid "Channel" ++msgstr "KanaÅ‚" ++ ++msgid "Check" ++msgstr "Sprawdź" ++ ++msgid "Checksum" ++msgstr "Suma kontrolna" ++ ++msgid "" ++"Choose the firewall zone you want to assign to this interface. Select " ++"unspecified to remove the interface from the associated zone or " ++"fill out the create field to define a new zone and attach the " ++"interface to it." ++msgstr "" ++"Wybierz strefÄ™ firewalla którÄ… chcesz przypisać do tego interfejsu. Wybierz " ++"unspecified aby usunąć interfejs z przypisanej strefy lub wybierz " ++"pole create aby zdefiniować nowÄ… strefÄ™ i przypisać jÄ… do " ++"interfejsu." ++ ++msgid "" ++"Choose the network(s) you want to attach to this wireless interface or fill " ++"out the create field to define a new network." ++msgstr "" ++"Wybierz sieć/sieci które chcesz przyÅ‚Ä…czyć do tego interfejsu " ++"bezprzewodowego lub wypeÅ‚nij pole utwórz aby utworzyć nowÄ… sieć." ++ ++msgid "Cipher" ++msgstr "Szyfr" ++ ++# Przyciski nazywajÄ… sie "Twórz archiwum" i "Wykonaj reset" a nie Przywróć Ustawienia ++msgid "" ++"Click \"Generate archive\" to download a tar archive of the current " ++"configuration files. To reset the firmware to its initial state, click " ++"\"Perform reset\" (only possible with squashfs images)." ++msgstr "" ++"WciÅ›nij \"Twórz archiwum\" aby pobrać archiwum tar zawierajÄ…ce bieżące pliki " ++"konfiguracyjne. Aby przywrócić ustawienia domyÅ›lne wciÅ›nij \"Wykonaj reset" ++"\" (możliwe tylko w przypadku obrazu squashfs)." ++ ++msgid "Client" ++msgstr "Klient" ++ ++msgid "Client ID to send when requesting DHCP" ++msgstr "Nazwa (ID) klienta do wysÅ‚ania podczas negocjacji DHCP" ++ ++msgid "" ++"Close inactive connection after the given amount of seconds, use 0 to " ++"persist connection" ++msgstr "" ++"Zamykaj nieaktywne poÅ‚Ä…czenia po okreÅ›lonym czasie podanym w sekundach, " ++"wpisz 0 aby uzyskać staÅ‚e poÅ‚Ä…czenie." ++ ++msgid "Close list..." ++msgstr "Zamknij listÄ™..." ++ ++msgid "Collecting data..." ++msgstr "Zbieranie danych..." ++ ++msgid "Command" ++msgstr "Polecenie" ++ ++msgid "Common Configuration" ++msgstr "Konfiguracja podstawowa" ++ ++msgid "Compression" ++msgstr "Kompresja" ++ ++msgid "Configuration" ++msgstr "Konfiguracja" ++ ++msgid "Configuration applied." ++msgstr "Konfiguracja zostaÅ‚a zastosowana." ++ ++msgid "Configuration files will be kept." ++msgstr "Pliki konfiguracyjne zostanÄ… zachowane." ++ ++msgid "Confirmation" ++msgstr "Potwierdzenie" ++ ++msgid "Connect" ++msgstr "PoÅ‚Ä…cz" ++ ++msgid "Connected" ++msgstr "PoÅ‚Ä…czony" ++ ++msgid "Connection Limit" ++msgstr "Limit poÅ‚Ä…czeÅ„" ++ ++msgid "Connection to server fails when TLS cannot be used" ++msgstr "" ++ ++msgid "Connections" ++msgstr "PoÅ‚Ä…czenia" ++ ++msgid "Country" ++msgstr "Kraj" ++ ++msgid "Country Code" ++msgstr "Kod kraju" ++ ++# Pokrywa nastÄ™pujÄ…ce interfejsy ++msgid "Cover the following interface" ++msgstr "Pokrywa nastÄ™pujÄ…cy interfejs" ++ ++msgid "Cover the following interfaces" ++msgstr "Pokrywa nastÄ™pujÄ…ce interfejsy" ++ ++msgid "Create / Assign firewall-zone" ++msgstr "Utwórz / Przypisz strefÄ™ firewalla" ++ ++msgid "Create Interface" ++msgstr "Utwórz interfejs" ++ ++msgid "Create a bridge over multiple interfaces" ++msgstr "Utwórz most pomiÄ™dzy wieloma interfejsami" ++ ++msgid "Critical" ++msgstr "Krytyczne" ++ ++msgid "Cron Log Level" ++msgstr "Poziom logowania Cron`a" ++ ++msgid "Custom Interface" ++msgstr "Interfejs Niestandardowy" ++ ++msgid "Custom delegated IPv6-prefix" ++msgstr "" ++ ++# Spacji zabraÅ‚o i napisy siÄ™ skleiÅ‚y ++msgid "" ++"Customizes the behaviour of the device LEDs if possible." ++msgstr "" ++"Dostosuj zachowanie diod LED " ++"urzÄ…dzenia jeÅ›li jest to możliwe." ++ ++msgid "DHCP Leases" ++msgstr "Dzierżawy DHCP" ++ ++msgid "DHCP Server" ++msgstr "Serwer DHCP" ++ ++msgid "DHCP and DNS" ++msgstr "DHCP i DNS" ++ ++msgid "DHCP client" ++msgstr "Klient DHCP" ++ ++msgid "DHCP-Options" ++msgstr "Opcje DHCP" ++ ++msgid "DHCPv6 Leases" ++msgstr "Dzierżawy DHCPv6" ++ ++msgid "DHCPv6 client" ++msgstr "" ++ ++msgid "DHCPv6-Mode" ++msgstr "" ++ ++msgid "DHCPv6-Service" ++msgstr "" ++ ++msgid "DNS" ++msgstr "DNS" ++ ++msgid "DNS forwardings" ++msgstr "Przekierowania DNS" ++ ++msgid "DNS-Label / FQDN" ++msgstr "" ++ ++msgid "DS-Lite AFTR address" ++msgstr "" ++ ++msgid "DUID" ++msgstr "DUID" ++ ++msgid "Debug" ++msgstr "Debug" ++ ++msgid "Default %d" ++msgstr "DomyÅ›lne %d" ++ ++msgid "Default gateway" ++msgstr "Brama domyÅ›lna" ++ ++msgid "Default route" ++msgstr "" ++ ++msgid "Default state" ++msgstr "Stan domyÅ›lny" ++ ++msgid "Define a name for this network." ++msgstr "OkreÅ›l nazwÄ™ dla tej sieci." ++ ++msgid "" ++"Define additional DHCP options, for example " ++"\"6,192.168.2.1,192.168.2.2\" which advertises different DNS " ++"servers to clients." ++msgstr "" ++"Zdefiniuj dodatkowe opcje DHCP, np. \"6,192.168.2.1,192.168.2.2" ++"\" rozgÅ‚asza domyÅ›lne serwery DNS klientom DHCP." ++ ++msgid "Delete" ++msgstr "UsuÅ„" ++ ++msgid "Delete this interface" ++msgstr "UsuÅ„ ten interfejs" ++ ++msgid "Delete this network" ++msgstr "UsuÅ„ tÄ… sieć" ++ ++msgid "Description" ++msgstr "Opis" ++ ++# KtoÅ› tÅ‚umaczyÅ‚ bez zobaczenia tego w gui. Dotyczy zmiany motywu ten opis. ++msgid "Design" ++msgstr "Motyw" ++ ++msgid "Destination" ++msgstr "Przeznaczenie" ++ ++msgid "Device" ++msgstr "UrzÄ…dzenie" ++ ++msgid "Device Configuration" ++msgstr "Konfiguracja urzÄ…dzenia" ++ ++msgid "Diagnostics" ++msgstr "Diagnostyka" ++ ++msgid "Dial number" ++msgstr "" ++ ++msgid "Directory" ++msgstr "Katalog" ++ ++msgid "Disable" ++msgstr "WyÅ‚Ä…cz" ++ ++msgid "" ++"Disable DHCP for " ++"this interface." ++msgstr "" ++"WyÅ‚Ä…cz DHCP na " ++"tym interfejsie." ++ ++msgid "Disable DNS setup" ++msgstr "WyÅ‚Ä…cz konfigurowanie DNS" ++ ++msgid "Disable HW-Beacon timer" ++msgstr "WyÅ‚Ä…cz zegar HW-Beacon" ++ ++msgid "Disabled" ++msgstr "WyÅ‚Ä…czony" ++ ++msgid "Discard upstream RFC1918 responses" ++msgstr "Odrzuć wychodzÄ…ce odpowiedzi RFC1918" ++ ++msgid "Displaying only packages containing" ++msgstr "PokazujÄ™ tylko paczki zawierajÄ…ce" ++ ++msgid "Distance Optimization" ++msgstr "Optymalizacja odlegÅ‚oÅ›ci" ++ ++msgid "Distance to farthest network member in meters." ++msgstr "OdlegÅ‚ość do najdalej oddalonego czÅ‚onka sieci w metrach." ++ ++# Jak poprzednio trzymam siÄ™ konwencji ++msgid "Diversity" ++msgstr "Wielorakość" ++ ++# Nie wiem czy nie zamotaÅ‚em ja rozumiem;) ++msgid "" ++"Dnsmasq is a combined DHCP-Server and DNS-" ++"Forwarder for NAT " ++"firewalls" ++msgstr "" ++"Dnsmasq jest to serwer DHCP poÅ‚Ä…czony z serwerem DNS. Jest to serwer przekazujÄ…cy (Fowarder) dla firewalli NAT" ++ ++msgid "Do not cache negative replies, e.g. for not existing domains" ++msgstr "Nie cache`uj odpowiedzi negatywnych, np. nie dla bieżących domen" ++ ++msgid "Do not forward requests that cannot be answered by public name servers" ++msgstr "" ++"Nie przekazuj zapytaÅ„ które nie mogÄ… być zrealizowane przez publiczne " ++"serwery nazw" ++ ++msgid "Do not forward reverse lookups for local networks" ++msgstr "Nie przekazuj odwrotnych lookup`ów do sieci lokalnych" ++ ++msgid "Do not send probe responses" ++msgstr "Nie wysyÅ‚aj ramek probe response" ++ ++msgid "Domain required" ++msgstr "Wymagana domena" ++ ++msgid "Domain whitelist" ++msgstr "Whitelist domen (Dozwolone domeny)" ++ ++msgid "" ++"Don't forward DNS-Requests without " ++"DNS-Name" ++msgstr "" ++"Nie przekazuj zapytaÅ„ DNS bez " ++"nazwy DNS'a" ++ ++msgid "Download and install package" ++msgstr "Pobierz i zainstaluj pakiet" ++ ++msgid "Download backup" ++msgstr "Pobierz kopiÄ™ zapasowÄ…" ++ ++msgid "Dropbear Instance" ++msgstr "UsÅ‚uga Dropbear" ++ ++msgid "" ++"Dropbear offers SSH network shell access " ++"and an integrated SCP server" ++msgstr "" ++"Dropbear oferuje zdalny dostÄ™p do konsoli (shell`a) poprzez swojego klienta " ++"SSH oraz serwer SCP" ++ ++msgid "Dual-Stack Lite (RFC6333)" ++msgstr "" ++ ++# "n" brakowaÅ‚o... ++msgid "Dynamic DHCP" ++msgstr "" ++"DHCP dynamiczne" ++ ++msgid "Dynamic tunnel" ++msgstr "Tunel dynamiczny" ++ ++msgid "" ++"Dynamically allocate DHCP addresses for clients. If disabled, only clients " ++"having static leases will be served." ++msgstr "" ++"Dynamicznie rezerwuje adresy DHCP dla klientów. JeÅ›li jest wyÅ‚Ä…czone tylko " ++"klienci posiadajÄ…cy staÅ‚e dzierżawy bÄ™dÄ… obsÅ‚użeni." ++ ++msgid "EAP-Method" ++msgstr "Metoda EAP" ++ ++msgid "Edit" ++msgstr "Edycja" ++ ++msgid "" ++"Edit the raw configuration data above to fix any error and hit \"Save\" to " ++"reload the page." ++msgstr "" ++ ++msgid "Edit this interface" ++msgstr "Edytuj ten interfejs" ++ ++msgid "Edit this network" ++msgstr "Edytuj tÄ… sieć" ++ ++# dosÅ‚ownie nagÅ‚y wypadek ++msgid "Emergency" ++msgstr "Zagrożenie" ++ ++msgid "Enable" ++msgstr "WÅ‚Ä…cz" ++ ++msgid "Enable STP" ++msgstr "WÅ‚Ä…cz STP" ++ ++msgid "Enable HE.net dynamic endpoint update" ++msgstr "WÅ‚Ä…cz dynamicznÄ… aktualizacjÄ™ punktu koÅ„cowego sieci HE.net" ++ ++msgid "Enable IPv6 negotiation on the PPP link" ++msgstr "WÅ‚Ä…cz negocjacjÄ™ IPv6 na Å‚Ä…czu PPP" ++ ++msgid "Enable Jumbo Frame passthrough" ++msgstr "WÅ‚Ä…cz przechodzenie ramek Jumbo" ++ ++msgid "Enable NTP client" ++msgstr "WÅ‚Ä…cz klienta NTP" ++ ++msgid "Enable TFTP server" ++msgstr "WÅ‚Ä…cz serwer TFTP" ++ ++msgid "Enable VLAN functionality" ++msgstr "WÅ‚Ä…cz funkcjonalność VLAN" ++ ++msgid "Enable WPS pushbutton, requires WPA(2)-PSK" ++msgstr "" ++ ++msgid "Enable learning and aging" ++msgstr "WÅ‚Ä…cz uczenie siÄ™ i starzenie" ++ ++msgid "Enable mirroring of incoming packets" ++msgstr "" ++ ++msgid "Enable mirroring of outgoing packets" ++msgstr "" ++ ++msgid "Enable this mount" ++msgstr "WÅ‚Ä…cz ten punkt montowania" ++ ++msgid "Enable this swap" ++msgstr "WÅ‚Ä…cz ten swap" ++ ++msgid "Enable/Disable" ++msgstr "WlÄ…cz/WyÅ‚Ä…cz" ++ ++msgid "Enabled" ++msgstr "WÅ‚Ä…czony" ++ ++msgid "Enables the Spanning Tree Protocol on this bridge" ++msgstr "" ++"WÅ‚Ä…cz protokół STP na tym " ++"moÅ›cie" ++ ++# a może sposób kapsuÅ‚kowania byÅ‚by lepszy? ++msgid "Encapsulation mode" ++msgstr "Sposób Enkapsulacji" ++ ++msgid "Encryption" ++msgstr "Szyfrowanie" ++ ++msgid "Erasing..." ++msgstr "Usuwanie..." ++ ++msgid "Error" ++msgstr "BÅ‚Ä…d" ++ ++msgid "Ethernet Adapter" ++msgstr "Karta Ethernet" ++ ++msgid "Ethernet Switch" ++msgstr "Switch Ethernet" ++ ++msgid "Expand hosts" ++msgstr "RozwiÅ„ hosty" ++ ++msgid "Expires" ++msgstr "Wygasa" ++ ++#, fuzzy ++msgid "" ++"Expiry time of leased addresses, minimum is 2 minutes (2m)." ++msgstr "" ++"Czas wygasania dzierżawy adresu, minimum to 2 Minuty (2m)." ++ ++msgid "External" ++msgstr "" ++ ++msgid "External system log server" ++msgstr "ZewnÄ™trzny serwer dla loga systemowego" ++ ++msgid "External system log server port" ++msgstr "Port zewnÄ™trznego serwera dla loga systemowego" ++ ++msgid "Fast Frames" ++msgstr "Szybkie ramki (Fast Frames)" ++ ++msgid "File" ++msgstr "Plik" ++ ++msgid "Filename of the boot image advertised to clients" ++msgstr "RozgÅ‚oszono nazwÄ™ pliku obrazu startowego do klientów" ++ ++msgid "Filesystem" ++msgstr "System plików" ++ ++msgid "Filter" ++msgstr "Filtr" ++ ++msgid "Filter private" ++msgstr "Filtruj prywatne" ++ ++msgid "Filter useless" ++msgstr "Filtruj bezużyteczne" ++ ++msgid "Find and join network" ++msgstr "Znajdź i podÅ‚Ä…cz siÄ™ do sieci" ++ ++msgid "Find package" ++msgstr "Znajdź pakiet" ++ ++msgid "Finish" ++msgstr "ZakoÅ„cz" ++ ++msgid "Firewall" ++msgstr "Firewall" ++ ++# Nie ma potrzeby pisania z dużej litery ++msgid "Firewall Settings" ++msgstr "Ustawienia firewalla" ++ ++msgid "Firewall Status" ++msgstr "Stan firewalla" ++ ++msgid "Firmware Version" ++msgstr "Wersja firmware" ++ ++msgid "Fixed source port for outbound DNS queries" ++msgstr "StaÅ‚y port źródÅ‚owy dla wychodzÄ…cych zapytaÅ„ DNS" ++ ++msgid "Flags" ++msgstr "Flagi" ++ ++msgid "Flash Firmware" ++msgstr "Aktualizuj firmware" ++ ++msgid "Flash image..." ++msgstr "Wgraj obraz..." ++ ++msgid "Flash new firmware image" ++msgstr "Wgraj nowy firmware" ++ ++msgid "Flash operations" ++msgstr "Operacje aktualizacji" ++ ++msgid "Flashing..." ++msgstr "Flashowanie..." ++ ++msgid "Force" ++msgstr "WymuÅ›" ++ ++msgid "Force CCMP (AES)" ++msgstr "WymuÅ› CCMP (AES)" ++ ++msgid "Force DHCP on this network even if another server is detected." ++msgstr "" ++"WymuÅ› uruchomienie serwera DHCP w tej sieci nawet gdy wykryto inny serwer." ++ ++msgid "Force TKIP" ++msgstr "WymuÅ› TKIP" ++ ++msgid "Force TKIP and CCMP (AES)" ++msgstr "WymuÅ› TKIP i CCMP (AES)" ++ ++msgid "Forward DHCP traffic" ++msgstr "Przekazuj ruch DHCP" ++ ++msgid "Forward broadcast traffic" ++msgstr "Przekazuj broadcast`y" ++ ++msgid "Forwarding mode" ++msgstr "Tryb przekazywania" ++ ++msgid "Fragmentation Threshold" ++msgstr "Próg Fragmentacji" ++ ++msgid "Frame Bursting" ++msgstr "Dzielenie ramek" ++ ++msgid "Free" ++msgstr "Wolna" ++ ++msgid "Free space" ++msgstr "Wolna przestrzeÅ„" ++ ++msgid "GHz" ++msgstr "GHz" ++ ++msgid "GPRS only" ++msgstr "Tylko GPRS" ++ ++msgid "Gateway" ++msgstr "Brama" ++ ++msgid "Gateway ports" ++msgstr "Porty bramy" ++ ++msgid "General Settings" ++msgstr "Ustawienia główne" ++ ++msgid "General Setup" ++msgstr "Ustawienia podstawowe" ++ ++msgid "Generate archive" ++msgstr "Twórz archiwum" ++ ++msgid "Generic 802.11%s Wireless Controller" ++msgstr "Ogólny bezprzewodowy kontroler 802.11%s" ++ ++msgid "Given password confirmation did not match, password not changed!" ++msgstr "" ++"HasÅ‚o nie zostaÅ‚o zmienione, wpisane poprzednie hasÅ‚o routera jest " ++"niewÅ‚aÅ›ciwe!" ++ ++msgid "Global network options" ++msgstr "" ++ ++msgid "Go to password configuration..." ++msgstr "Przejdź do konfiguracji hasÅ‚a..." ++ ++msgid "Go to relevant configuration page" ++msgstr "Przejdź do powiÄ…zanych ustawieÅ„" ++ ++msgid "Guest" ++msgstr "" ++ ++msgid "HE.net password" ++msgstr "HasÅ‚o HE.net" ++ ++msgid "HE.net username" ++msgstr "" ++ ++msgid "Handler" ++msgstr "Uchwyt" ++ ++msgid "Hang Up" ++msgstr "RozÅ‚Ä…cz" ++ ++msgid "Heartbeat" ++msgstr "" ++ ++msgid "" ++"Here you can configure the basic aspects of your device like its hostname or " ++"the timezone." ++msgstr "" ++"Tutaj możesz skonfigurować podstawowe ustawienia twojego urzÄ…dzenia, np. " ++"nazwÄ™ hosta, strefÄ™ czasowÄ…." ++ ++# nie ma sÅ‚owa "autentykacji". Uwierzytelnianie! ++msgid "" ++"Here you can paste public SSH-Keys (one per line) for SSH public-key " ++"authentication." ++msgstr "" ++"Tutaj wklej swoje klucze publiczne SSH (po jednym w linii), dla " ++"uwierzytelniania SSH" ++ ++msgid "Hermes 802.11b Wireless Controller" ++msgstr "Kontroler bezprzewodowy Hermes 802.11b" ++ ++msgid "Hide ESSID" ++msgstr "" ++"Ukryj ESSID" ++ ++msgid "Host entries" ++msgstr "Wpisy PC" ++ ++msgid "Host expiry timeout" ++msgstr "Czas wygasania hosta" ++ ++msgid "Host-IP or Network" ++msgstr "IP lub sieć Hosta" ++ ++msgid "Hostname" ++msgstr "Nazwa hosta" ++ ++msgid "Hostname to send when requesting DHCP" ++msgstr "Nazwa hosta do wysÅ‚ania podczas negocjacji DHCP" ++ ++msgid "Hostnames" ++msgstr "Nazwy hostów" ++ ++msgid "Hybrid" ++msgstr "" ++ ++msgid "IP address" ++msgstr "Adres IP" ++ ++msgid "IPv4" ++msgstr "IPv4" ++ ++msgid "IPv4 Firewall" ++msgstr "Firewall IPv4" ++ ++msgid "IPv4 WAN Status" ++msgstr "Status IPv4 WAN" ++ ++msgid "IPv4 address" ++msgstr "Adres IPv4" ++ ++msgid "IPv4 and IPv6" ++msgstr "IPv4 oraz IPv6" ++ ++msgid "IPv4 assignment length" ++msgstr "" ++ ++msgid "IPv4 broadcast" ++msgstr "Broadcast IPv4" ++ ++msgid "IPv4 gateway" ++msgstr "Brama IPv4" ++ ++msgid "IPv4 netmask" ++msgstr "Maska IPv4" ++ ++msgid "IPv4 only" ++msgstr "Tylko IPv4" ++ ++msgid "IPv4 prefix length" ++msgstr "DÅ‚ugość prefiksu IPv4" ++ ++msgid "IPv4-Address" ++msgstr "Adres IPv4" ++ ++msgid "IPv6" ++msgstr "IPv6" ++ ++msgid "IPv6 Firewall" ++msgstr "Firewall IPv6" ++ ++msgid "IPv6 Neighbours" ++msgstr "" ++ ++msgid "IPv6 Settings" ++msgstr "" ++ ++msgid "IPv6 ULA-Prefix" ++msgstr "" ++ ++msgid "IPv6 WAN Status" ++msgstr "Status WAN IPv6" ++ ++msgid "IPv6 address" ++msgstr "Adres IPv6" ++ ++msgid "IPv6 address delegated to the local tunnel endpoint (optional)" ++msgstr "" ++ ++msgid "IPv6 assignment hint" ++msgstr "" ++ ++msgid "IPv6 assignment length" ++msgstr "" ++ ++msgid "IPv6 gateway" ++msgstr "Brama IPv6" ++ ++msgid "IPv6 only" ++msgstr "Tylko IPv6" ++ ++msgid "IPv6 prefix" ++msgstr "Prefiks IPv6" ++ ++msgid "IPv6 prefix length" ++msgstr "DÅ‚ugość prefiksu IPv6" ++ ++msgid "IPv6 routed prefix" ++msgstr "" ++ ++msgid "IPv6-Address" ++msgstr "Adres IPv6" ++ ++msgid "IPv6-in-IPv4 (RFC4213)" ++msgstr "IPv6-w-IPv4 (RFC4213)" ++ ++# 6rd to nie "szóste", tylko IPv6 rapid deployment ++msgid "IPv6-over-IPv4 (6rd)" ++msgstr "IPv6-przez-IPv4 (6rd)" ++ ++msgid "IPv6-over-IPv4 (6to4)" ++msgstr "IPv6-przez-IPv4 (6to4)" ++ ++msgid "Identity" ++msgstr "Tożsamość" ++ ++msgid "" ++"If specified, mount the device by its UUID instead of a fixed device node" ++msgstr "" ++"JeÅ›li podano, zainstaluj urzÄ…dzenie poprzez jego UUID zamiast ustalonego wÄ™zÅ‚a urzÄ…dzenia" ++ ++msgid "" ++"If specified, mount the device by the partition label instead of a fixed " ++"device node" ++msgstr "" ++"JeÅ›li podano, zainstaluj urzÄ…dzenie poprzez nazwÄ™ partycji zamiast ustalonego wÄ™zÅ‚a urzÄ…dzenia" ++ ++msgid "If unchecked, no default route is configured" ++msgstr "JeÅ›li odznaczone, nie ma zdefiniowanej domyÅ›lnej Å›cieżki routingu" ++ ++msgid "If unchecked, the advertised DNS server addresses are ignored" ++msgstr "JeÅ›li odznaczone, rozgÅ‚oszane adresy serwerów DNS sÄ… ignorowane" ++ ++msgid "" ++"If your physical memory is insufficient unused data can be temporarily " ++"swapped to a swap-device resulting in a higher amount of usable RAM. Be aware that swapping data is a very " ++"slow process as the swap-device cannot be accessed with the high datarates " ++"of the RAM." ++msgstr "" ++"JeÅ›li ilość twojej pamiÄ™ci fizycznej jest niewystarczajÄ…ca, nieużywane " ++"miejsce na dysku może być tymczasowo wykorzystane na urzÄ…dzenie pliku " ++"wymiany. W rezultacie wiÄ™ksza ilość pamiÄ™ci RAM bÄ™dzie dostÄ™pna. Uwaga - plik wymiany jest dużo " ++"wolniejszy niż pamięć RAM." ++ ++msgid "Ignore Hosts files" ++msgstr "Ignoruj pliki Hosts" ++ ++msgid "Ignore interface" ++msgstr "Ignoruj interfejs" ++ ++msgid "Ignore resolve file" ++msgstr "Ignoruj pliki resolve" ++ ++msgid "Image" ++msgstr "Obraz" ++ ++msgid "In" ++msgstr "W" ++ ++msgid "Inactivity timeout" ++msgstr "Czas bezczynnoÅ›ci" ++ ++msgid "Inbound:" ++msgstr "PrzychodzÄ…cy:" ++ ++msgid "Info" ++msgstr "Info" ++ ++msgid "Initscript" ++msgstr "Skrypt startowy" ++ ++msgid "Initscripts" ++msgstr "Skrypty startowe" ++ ++msgid "Install" ++msgstr "Instaluj" ++ ++msgid "Install iputils-traceroute6 for IPv6 traceroute" ++msgstr "" ++ ++msgid "Install package %q" ++msgstr "Instaluj pakiet %q" ++ ++msgid "Install protocol extensions..." ++msgstr "Instaluj rozszerzenia protokołów..." ++ ++msgid "Installed packages" ++msgstr "Zainstalowane pakiety" ++ ++msgid "Interface" ++msgstr "Interfejs" ++ ++msgid "Interface Configuration" ++msgstr "Konfiguracja Interfejsu" ++ ++# Tam jest lista interfejsów.... ++msgid "Interface Overview" ++msgstr "PrzeglÄ…d Interfejsów" ++ ++msgid "Interface is reconnecting..." ++msgstr "Ponowne Å‚Ä…czenie interfejsu..." ++ ++msgid "Interface is shutting down..." ++msgstr "Interfejs jest wyÅ‚Ä…czany..." ++ ++msgid "Interface not present or not connected yet." ++msgstr "Interfejs nie istnieje lub nie jest jeszcze podÅ‚Ä…czony." ++ ++msgid "Interface reconnected" ++msgstr "PoÅ‚Ä…czono ponownie interfejs" ++ ++msgid "Interface shut down" ++msgstr "WyÅ‚Ä…czono interfejs" ++ ++msgid "Interfaces" ++msgstr "Interfejsy" ++ ++msgid "Internal" ++msgstr "" ++ ++# Nadużycie tagu abbr uważam za uzasadnione. ++msgid "Internal Server Error" ++msgstr "WewnÄ™trzny bÅ‚Ä…d serwera" ++ ++msgid "Invalid" ++msgstr "NiewÅ‚aÅ›ciwy" ++ ++msgid "Invalid VLAN ID given! Only IDs between %d and %d are allowed." ++msgstr "Podano niewÅ‚aÅ›ciwy ID VLAN`u! Dozwolone sÄ… tylko ID pomiÄ™dzy %d a %d." ++ ++msgid "Invalid VLAN ID given! Only unique IDs are allowed" ++msgstr "Podano niewÅ‚aÅ›ciwy ID VLAN`u! Dozwolone sÄ… tylko unikalne ID." ++ ++msgid "Invalid username and/or password! Please try again." ++msgstr "NiewÅ‚aÅ›ciwy login i/lub hasÅ‚o! Spróbuj ponownie." ++ ++#, fuzzy ++msgid "" ++"It appears that you are trying to flash an image that does not fit into the " ++"flash memory, please verify the image file!" ++msgstr "" ++"WyglÄ…da na to, że próbujesz wgrać obraz wiÄ™kszy niż twoja pamięć flash, " ++"proszÄ™ sprawdź czy to wÅ‚aÅ›ciwy obraz!" ++ ++msgid "Java Script required!" ++msgstr "Java Script jest wymagany!" ++ ++msgid "Join Network" ++msgstr "PoÅ‚Ä…cz z sieciÄ…" ++ ++msgid "Join Network: Settings" ++msgstr "PrzyÅ‚Ä…cz do sieci: Ustawienia" ++ ++msgid "Join Network: Wireless Scan" ++msgstr "PrzyÅ‚Ä…cz do sieci: Skanuj sieci WiFi" ++ ++msgid "Keep settings" ++msgstr "Zachowaj ustawienia" ++ ++msgid "Kernel Log" ++msgstr "Log jÄ…dra" ++ ++msgid "Kernel Version" ++msgstr "Wersja jÄ…dra" ++ ++msgid "Key" ++msgstr "Klucz" ++ ++msgid "Key #%d" ++msgstr "Klucz #%d" ++ ++msgid "Kill" ++msgstr "Zabij" ++ ++msgid "L2TP" ++msgstr "L2TP" ++ ++msgid "L2TP Server" ++msgstr "Serwer L2TP" ++ ++msgid "LCP echo failure threshold" ++msgstr "Próg bÅ‚Ä™du echa LCP" ++ ++msgid "LCP echo interval" ++msgstr "CzÄ™stotliwość echa LCP" ++ ++msgid "LLC" ++msgstr "LLC" ++ ++msgid "Label" ++msgstr "Oznaczenie" ++ ++msgid "Language" ++msgstr "JÄ™zyk" ++ ++msgid "Language and Style" ++msgstr "WyglÄ…d i jÄ™zyk" ++ ++msgid "Leaf" ++msgstr "" ++ ++msgid "Lease validity time" ++msgstr "Czas ważnoÅ›ci dzierżawy" ++ ++msgid "Leasefile" ++msgstr "Plik dzierżaw" ++ ++msgid "Leasetime" ++msgstr "Czas dzierżawy" ++ ++msgid "Leasetime remaining" ++msgstr "PozostaÅ‚y czas dzierżawy" ++ ++msgid "Leave empty to autodetect" ++msgstr "Pozostaw niewypeÅ‚nione dla autodetekcji" ++ ++msgid "Leave empty to use the current WAN address" ++msgstr "Pozostaw niewypeÅ‚nione aby użyć bieżącego adresu WAN" ++ ++msgid "Legend:" ++msgstr "Legenda:" ++ ++msgid "Limit" ++msgstr "Limit" ++ ++msgid "Line Attenuation" ++msgstr "" ++ ++msgid "Line Speed" ++msgstr "" ++ ++msgid "Line State" ++msgstr "" ++ ++msgid "Link On" ++msgstr "PoÅ‚Ä…czenie aktywne" ++ ++msgid "" ++"List of DNS servers to forward " ++"requests to" ++msgstr "" ++"Lista serwerów DNS do których bÄ™dÄ… " ++"przekazywane zapytania" ++ ++msgid "List of domains to allow RFC1918 responses for" ++msgstr "Lista domen zezwalajÄ…cych na odpowiedzi RFC1918" ++ ++msgid "List of hosts that supply bogus NX domain results" ++msgstr "Lista hostów które dostarczajÄ… zafaÅ‚szowane wyniki NX domain" ++ ++msgid "Listen only on the given interface or, if unspecified, on all" ++msgstr "" ++"SÅ‚uchaj tylko na podanym interfejsie, lub jeÅ›li nie podano na wszystkich" ++ ++msgid "Listening port for inbound DNS queries" ++msgstr "Port nasÅ‚uchu dla przychodzÄ…cych zapytaÅ„ DNS" ++ ++msgid "Load" ++msgstr "Obciążenie" ++ ++msgid "Load Average" ++msgstr "Åšrednie obciążenie" ++ ++msgid "Loading" ++msgstr "Åadowanie" ++ ++msgid "Local IPv4 address" ++msgstr "Lokalny adres IPv4" ++ ++msgid "Local IPv6 address" ++msgstr "Lokalny adres IPv6" ++ ++msgid "Local Startup" ++msgstr "Lokalny autostart" ++ ++msgid "Local Time" ++msgstr "Czas lokalny" ++ ++msgid "Local domain" ++msgstr "Domena lokalna" ++ ++#, fuzzy ++msgid "" ++"Local domain specification. Names matching this domain are never forwarded " ++"and are resolved from DHCP or hosts files only" ++msgstr "" ++"Specyfikacja domeny lokalnej. Nazwy należące do tej domeny nie sÄ… " ++"przekazywane dalej ani rozwijane przez DHCP lub tylko pliki hosts" ++ ++msgid "Local domain suffix appended to DHCP names and hosts file entries" ++msgstr "" ++"Przyrostek (suffiks) domeny przyÅ‚Ä…czany do nazw DHCP i wpisów w pliku hosts" ++ ++msgid "Local server" ++msgstr "Serwer lokalny" ++ ++msgid "" ++"Localise hostname depending on the requesting subnet if multiple IPs are " ++"available" ++msgstr "" ++"Zlokalizuj nazwÄ™ hosta w zależnoÅ›ci od odpytujÄ…cej podsieci jeÅ›li jest " ++"dostÄ™pne wiÄ™cej niż jedno IP" ++ ++msgid "Localise queries" ++msgstr "Zapytania lokalizujÄ…ce" ++ ++msgid "Locked to channel %d used by: %s" ++msgstr "" ++ ++msgid "Log output level" ++msgstr "Poziom logowania" ++ ++msgid "Log queries" ++msgstr "Loguj zapytania" ++ ++msgid "Logging" ++msgstr "Logowanie" ++ ++msgid "Login" ++msgstr "Zaloguj" ++ ++msgid "Logout" ++msgstr "Wyloguj" ++ ++msgid "Lowest leased address as offset from the network address." ++msgstr "Najniższy wydzierżawiony adres jako offset dla adresu sieci." ++ ++msgid "MAC-Address" ++msgstr "Adres MAC" ++ ++msgid "MAC-Address Filter" ++msgstr "Filtr adresów MAC" ++ ++msgid "MAC-Filter" ++msgstr "Filtr adresów MAC" ++ ++msgid "MAC-List" ++msgstr "Lista MAC" ++ ++msgid "MB/s" ++msgstr "MB/s" ++ ++msgid "MHz" ++msgstr "MHz" ++ ++msgid "MTU" ++msgstr "MTU" ++ ++msgid "" ++"Make sure to clone the root filesystem using something like the commands " ++"below:" ++msgstr "" ++ ++msgid "Maximum Rate" ++msgstr "Maksymalna Szybkość" ++ ++msgid "Maximum allowed number of active DHCP leases" ++msgstr "Maksymalna dozwolona liczba aktywnych dzierżaw DHCP" ++ ++msgid "Maximum allowed number of concurrent DNS queries" ++msgstr "Maksymalna dozwolona liczba jednoczesnych zapytaÅ„ DNS" ++ ++msgid "Maximum allowed size of EDNS.0 UDP packets" ++msgstr "Maksymalny dozwolony rozmiar pakietu EDNS.0 UDP" ++ ++msgid "Maximum amount of seconds to wait for the modem to become ready" ++msgstr "Maksymalny czas podany w sekundach do peÅ‚nej gotowoÅ›ci modemu" ++ ++msgid "Maximum hold time" ++msgstr "Maksymalny czas podtrzymania" ++ ++msgid "Maximum number of leased addresses." ++msgstr "Maksymalna liczba dzierżawionych adresów." ++ ++msgid "Mbit/s" ++msgstr "Mbit/s" ++ ++msgid "Memory" ++msgstr "Pamięć" ++ ++msgid "Memory usage (%)" ++msgstr "Użycie pamiÄ™ci (%)" ++ ++msgid "Metric" ++msgstr "Metryka" ++ ++msgid "Minimum Rate" ++msgstr "Minimalna Szybkość" ++ ++msgid "Minimum hold time" ++msgstr "Minimalny czas podtrzymania" ++ ++msgid "Mirror monitor port" ++msgstr "" ++ ++msgid "Mirror source port" ++msgstr "" ++ ++msgid "Missing protocol extension for proto %q" ++msgstr "BrakujÄ…ce rozszerzenie protokoÅ‚u dla protokoÅ‚u %q" ++ ++msgid "Mode" ++msgstr "Tryb" ++ ++msgid "Model" ++msgstr "" ++ ++msgid "Modem device" ++msgstr "Modem" ++ ++msgid "Modem init timeout" ++msgstr "Limit czasu inicjacji modemu" ++ ++msgid "Monitor" ++msgstr "Monitor" ++ ++msgid "Mount Entry" ++msgstr "Wpis montowania" ++ ++msgid "Mount Point" ++msgstr "Punkt montowania" ++ ++msgid "Mount Points" ++msgstr "Punkty montowania" ++ ++msgid "Mount Points - Mount Entry" ++msgstr "Punkty montowania - Wpis montownia" ++ ++msgid "Mount Points - Swap Entry" ++msgstr "Punkty montowania - Wpis Swap" ++ ++msgid "" ++"Mount Points define at which point a memory device will be attached to the " ++"filesystem" ++msgstr "" ++"Punkty montowania definiujÄ… gdzie urzÄ…dzenie pamiÄ™ci zostanie podÅ‚Ä…czone do " ++"systemu plików" ++ ++msgid "Mount options" ++msgstr "Opcje montowania" ++ ++msgid "Mount point" ++msgstr "Punkt montownia" ++ ++msgid "Mounted file systems" ++msgstr "Zamontowane systemy plików" ++ ++msgid "Move down" ++msgstr "PrzesuÅ„ w dół" ++ ++msgid "Move up" ++msgstr "PrzesuÅ„ w górÄ™" ++ ++msgid "Multicast Rate" ++msgstr "Szybkość Multicast`u" ++ ++msgid "Multicast address" ++msgstr "Adres Multicast`u" ++ ++msgid "NAS ID" ++msgstr "NAS ID" ++ ++msgid "NDP-Proxy" ++msgstr "" ++ ++msgid "NTP server candidates" ++msgstr "Lista serwerów NTP" ++ ++msgid "NTP sync time-out" ++msgstr "" ++ ++msgid "Name" ++msgstr "Nazwa" ++ ++msgid "Name of the new interface" ++msgstr "Nazwa nowego interfejsu" ++ ++msgid "Name of the new network" ++msgstr "Nazwa nowej sieci" ++ ++msgid "Navigation" ++msgstr "Nawigacja" ++ ++msgid "Netmask" ++msgstr "Maska sieci" ++ ++msgid "Network" ++msgstr "Sieć" ++ ++msgid "Network Utilities" ++msgstr "NarzÄ™dzia sieciowe" ++ ++msgid "Network boot image" ++msgstr "Sieciowy obraz startowy" ++ ++msgid "Network without interfaces." ++msgstr "Sieć bez interfejsów" ++ ++msgid "Next »" ++msgstr "NastÄ™pna »" ++ ++msgid "No DHCP Server configured for this interface" ++msgstr "Brak skonfigurowanego serwera DHCP dla tego interfejsu" ++ ++msgid "No chains in this table" ++msgstr "Brak Å‚aÅ„cuchów w tej tablicy" ++ ++msgid "No files found" ++msgstr "Nie znaleziono plików" ++ ++msgid "No information available" ++msgstr "Brak dostÄ™pnych informacji" ++ ++msgid "No negative cache" ++msgstr "Brak odwrotnego cache`a" ++ ++msgid "No network configured on this device" ++msgstr "Brak skonfigurowanych sieci na tym urzÄ…dzeniu" ++ ++msgid "No network name specified" ++msgstr "Nie podano nazwy sieci" ++ ++msgid "No package lists available" ++msgstr "Brak dostÄ™pu do listy pakietów" ++ ++msgid "No password set!" ++msgstr "Nie ustawiono hasÅ‚a!" ++ ++msgid "No rules in this chain" ++msgstr "Brak zasad w tym Å‚aÅ„cuchu" ++ ++msgid "No zone assigned" ++msgstr "Brak przypisanej strefy" ++ ++msgid "Noise" ++msgstr "Szum" ++ ++msgid "Noise Margin" ++msgstr "" ++ ++msgid "Noise:" ++msgstr "Szum:" ++ ++msgid "None" ++msgstr "Brak" ++ ++msgid "Normal" ++msgstr "Normalny" ++ ++msgid "Not Found" ++msgstr "Nie znaleziono" ++ ++msgid "Not associated" ++msgstr "Nie powiÄ…zany" ++ ++msgid "Not connected" ++msgstr "Nie podÅ‚Ä…czony" ++ ++msgid "Note: Configuration files will be erased." ++msgstr "UWAGA: Pliki konfiguracyjne zostanÄ… usuniÄ™te." ++ ++msgid "Notice" ++msgstr "Spostrzeżenie" ++ ++msgid "Nslookup" ++msgstr "Nslookup" ++ ++msgid "OK" ++msgstr "OK" ++ ++msgid "OPKG-Configuration" ++msgstr "Konfiguracja OPKG" ++ ++msgid "Off-State Delay" ++msgstr "ZwÅ‚oka wyÅ‚Ä…czenia" ++ ++msgid "" ++"On this page you can configure the network interfaces. You can bridge " ++"several interfaces by ticking the \"bridge interfaces\" field and enter the " ++"names of several network interfaces separated by spaces. You can also use " ++"VLAN notation " ++"INTERFACE.VLANNR (e.g.: " ++"eth0.1)." ++msgstr "" ++"Na tej stronie można skonfigurować interfejsy urzÄ…dzenia. Możesz zmostkować " ++"kilka interfejsów zaznaczajÄ…c pole \"mostkuj interfejsy\", a nastÄ™pnie " ++"wpisujÄ…c ich nazwy oddzielone spacjami. Można także użyć notacji VLAN`ów INTERFACE.VLANNR " ++"(np.: eth0.1)." ++ ++msgid "On-State Delay" ++msgstr "ZwÅ‚oka wÅ‚Ä…czenia" ++ ++msgid "One of hostname or mac address must be specified!" ++msgstr "Nazwa hosta lub adres MAC musu być podany!" ++ ++msgid "One or more fields contain invalid values!" ++msgstr "Jedno lub wiÄ™cej pól zawiera nieprawidÅ‚owe wartoÅ›ci!" ++ ++msgid "One or more required fields have no value!" ++msgstr "Jedno lub wiÄ™cej pól nie posiada wpisanych wartoÅ›ci!" ++ ++msgid "Open list..." ++msgstr "Otwórz listÄ™..." ++ ++msgid "OpenConnect (CISCO AnyConnect)" ++msgstr "" ++ ++msgid "Operating frequency" ++msgstr "" ++ ++msgid "Option changed" ++msgstr "Wartość zmieniona" ++ ++msgid "Option removed" ++msgstr "UsuniÄ™to wartość" ++ ++msgid "Optional, specify to override default server (tic.sixxs.net)" ++msgstr "" ++ ++msgid "Optional, use when the SIXXS account has more than one tunnel" ++msgstr "" ++ ++msgid "Options" ++msgstr "Opcje" ++ ++msgid "Other:" ++msgstr "Inne:" ++ ++msgid "Out" ++msgstr "WychodzÄ…ce" ++ ++msgid "Outbound:" ++msgstr "WychodzÄ…cy:" ++ ++msgid "Outdoor Channels" ++msgstr "KanaÅ‚y zewnÄ™trzne" ++ ++msgid "Output Interface" ++msgstr "" ++ ++msgid "Override MAC address" ++msgstr "Nadpisz adres MAC" ++ ++msgid "Override MTU" ++msgstr "Nadpisz MTU" ++ ++msgid "Override the gateway in DHCP responses" ++msgstr "Nadpisz adres bramy w odpowiedziach DHCP" ++ ++msgid "" ++"Override the netmask sent to clients. Normally it is calculated from the " ++"subnet that is served." ++msgstr "" ++"Nadpisz maskÄ™ sieci wysyÅ‚anÄ… do klientów. Zazwyczaj jest ona wyliczana z " ++"podsieci która jest rozsyÅ‚ana." ++ ++msgid "Override the table used for internal routes" ++msgstr "Nadpisz tablicÄ™ routingu używanÄ… dla wewnÄ™trznych tras routowania" ++ ++msgid "Overview" ++msgstr "PrzeglÄ…d" ++ ++msgid "Owner" ++msgstr "WÅ‚aÅ›ciciel" ++ ++msgid "PAP/CHAP password" ++msgstr "HasÅ‚o PAP/CHAP" ++ ++msgid "PAP/CHAP username" ++msgstr "Nazwa użytkownika PAP/CHAP" ++ ++msgid "PID" ++msgstr "PID" ++ ++msgid "PIN" ++msgstr "PIN" ++ ++msgid "PPP" ++msgstr "PPP" ++ ++msgid "PPPoA Encapsulation" ++msgstr "Enkapsulacja PPPoA" ++ ++msgid "PPPoATM" ++msgstr "PPPoATM" ++ ++msgid "PPPoE" ++msgstr "PPPoE" ++ ++msgid "PPtP" ++msgstr "PPtP" ++ ++msgid "Package libiwinfo required!" ++msgstr "Wymagany pakiet libiwinfo!" ++ ++msgid "Package lists are older than 24 hours" ++msgstr "Lista pakietów jest starsza niż 24 godziny" ++ ++msgid "Package name" ++msgstr "Nazwa pakietu" ++ ++msgid "Packets" ++msgstr "Pakiety" ++ ++msgid "Part of zone %q" ++msgstr "Część strefy %q" ++ ++msgid "Password" ++msgstr "HasÅ‚o" ++ ++msgid "Password authentication" ++msgstr "Identyfikacja hasÅ‚em" ++ ++msgid "Password of Private Key" ++msgstr "HasÅ‚o lub klucz prywatny" ++ ++msgid "Password successfully changed!" ++msgstr "PomyÅ›lnie zmieniono hasÅ‚o!" ++ ++msgid "Path" ++msgstr "" ++ ++msgid "Path to CA-Certificate" ++msgstr "Åšcieżka do certyfikatu CA" ++ ++msgid "Path to Client-Certificate" ++msgstr "Åšcieżka do certyfikatu Klienta" ++ ++msgid "Path to Private Key" ++msgstr "Åšcieżka do Klucza Prywatnego" ++ ++msgid "Path to executable which handles the button event" ++msgstr "" ++"Åšcieżka do pliku wykonywalnego, który obsÅ‚uguje zdarzenie dla danego " ++"przycisku" ++ ++msgid "Peak:" ++msgstr "Szczyt:" ++ ++msgid "Perform reboot" ++msgstr "Wykonaj restart" ++ ++msgid "Perform reset" ++msgstr "Wykonaj reset" ++ ++msgid "Phy Rate:" ++msgstr "Szybkość Phy:" ++ ++msgid "Physical Settings" ++msgstr "Ustawienia sprzÄ™towe" ++ ++msgid "Ping" ++msgstr "Ping" ++ ++msgid "Pkts." ++msgstr "Pktw." ++ ++msgid "Please enter your username and password." ++msgstr "ProszÄ™ wprowadź swój login i hasÅ‚o." ++ ++msgid "Please wait: Device rebooting..." ++msgstr "ProszÄ™ czekać: Ponowne uruchamianie..." ++ ++msgid "Policy" ++msgstr "Zasada" ++ ++msgid "Port" ++msgstr "Port" ++ ++msgid "Port %d" ++msgstr "Port %d" ++ ++msgid "Port %d is untagged in multiple VLANs!" ++msgstr "Port %d jest nietagowany w wielu VLAN`ach!" ++ ++msgid "Port status:" ++msgstr "Status portu:" ++ ++msgid "" ++"Presume peer to be dead after given amount of LCP echo failures, use 0 to " ++"ignore failures" ++msgstr "" ++"ZakÅ‚adaj że klient jest martwy po danej iloÅ›ci bÅ‚edów odpowiedzi echa LCP, " ++"wpisz 0 aby zignorować bÅ‚Ä™dy" ++ ++msgid "Prevents client-to-client communication" ++msgstr "Zapobiegaj komunikacji klientów pomiÄ™dzy sobÄ…" ++ ++msgid "Prism2/2.5/3 802.11b Wireless Controller" ++msgstr "Kontroler bezprzewodowy Prism2/2.5/3 802.11b" ++ ++msgid "Proceed" ++msgstr "Wykonaj" ++ ++msgid "Processes" ++msgstr "Procesy" ++ ++msgid "Prot." ++msgstr "Prot." ++ ++msgid "Protocol" ++msgstr "Protokół" ++ ++msgid "Protocol family" ++msgstr "Rodzina protokołów" ++ ++msgid "Protocol of the new interface" ++msgstr "Protokół nowego interfejsu" ++ ++msgid "Protocol support is not installed" ++msgstr "Wsparcie dla protokoÅ‚u nie jest zainstalowane" ++ ++# Opcja dotyczy wÅ‚Ä…czenia serwera czasu, wiÄ™c "podaj" nie jest wÅ‚aÅ›ciwym tÅ‚umaczeniem w tym miejscu - obsy ++msgid "Provide NTP server" ++msgstr "WÅ‚Ä…cz serwer NTP" ++ ++msgid "Provide new network" ++msgstr "Utwórz nowÄ… sieć" ++ ++msgid "Pseudo Ad-Hoc (ahdemo)" ++msgstr "Pseudo Ad-Hoc (ahdemo)" ++ ++msgid "Public prefix routed to this device for distribution to clients." ++msgstr "" ++ ++msgid "Quality" ++msgstr "Jakość" ++ ++msgid "RTS/CTS Threshold" ++msgstr "Próg RTS/CTS" ++ ++msgid "RX" ++msgstr "RX" ++ ++msgid "RX Rate" ++msgstr "Szybkość RX" ++ ++msgid "RaLink 802.11%s Wireless Controller" ++msgstr "Kontroler bezprzewodowy RaLink 802.11%s" ++ ++msgid "Radius-Accounting-Port" ++msgstr "Port Radius-Accounting" ++ ++msgid "Radius-Accounting-Secret" ++msgstr "Sekret Radius-Accounting" ++ ++msgid "Radius-Accounting-Server" ++msgstr "Serwer Radius-Accounting" ++ ++msgid "Radius-Authentication-Port" ++msgstr "Port Radius-Authentication" ++ ++msgid "Radius-Authentication-Secret" ++msgstr "Sekret Radius-Authentication" ++ ++msgid "Radius-Authentication-Server" ++msgstr "Serwer Radius-Authentication" ++ ++msgid "" ++"Read /etc/ethers to configure the DHCP-Server" ++msgstr "" ++"Przejrzyj plik /etc/ethers aby skonfigurować serwer DHCP" ++ ++msgid "" ++"Really delete this interface? The deletion cannot be undone!\\nYou might " ++"lose access to this device if you are connected via this interface." ++msgstr "" ++"NaprawdÄ™ usunąć ten interfejs? UsuniÄ™cie nie może zostać cofniÄ™te!\n" ++"Możesz stracić dostÄ™p do tego urzÄ…dzenia, jeÅ›li jesteÅ› poÅ‚Ä…czony przez ten " ++"interfejs!" ++ ++msgid "" ++"Really delete this wireless network? The deletion cannot be undone!\\nYou " ++"might lose access to this device if you are connected via this network." ++msgstr "" ++"NaprawdÄ™ usunąć tÄ™ sieć bezprzewodowÄ…? UsuniÄ™cie nie może zostać cofniÄ™te!\n" ++"Możesz stracić dostÄ™p do tego urzÄ…dzenia, jeÅ›li jesteÅ› poÅ‚Ä…czony przez tÄ™ " ++"sieć!" ++ ++msgid "Really reset all changes?" ++msgstr "NaprawdÄ™ usunąć wszelkie zmiany?" ++ ++#, fuzzy ++msgid "" ++"Really shut down network?\\nYou might lose access to this device if you are " ++"connected via this interface." ++msgstr "" ++"NaprawdÄ™ wyÅ‚Ä…czyć tÄ™ sieć?\n" ++"Możesz stracić dostÄ™p do tego urzÄ…dzenia jeÅ›li jesteÅ› poÅ‚Ä…czony przez ten " ++"interfejs!" ++ ++msgid "" ++"Really shutdown interface \"%s\" ?\\nYou might lose access to this device if " ++"you are connected via this interface." ++msgstr "" ++"NaprawdÄ™ wyÅ‚Ä…czyć interfejs \"%s\"?\n" ++"Możesz stracić dostÄ™p do tego urzÄ…dzenia jeÅ›li jesteÅ› poÅ‚Ä…czony przez ten " ++"interfejs!" ++ ++msgid "Really switch protocol?" ++msgstr "NaprawdÄ™ zmienić protokół?" ++ ++msgid "Realtime Connections" ++msgstr "PoÅ‚Ä…czenia w czasie rzeczywistym" ++ ++msgid "Realtime Graphs" ++msgstr "Wykresy w czasie rzeczywistym" ++ ++msgid "Realtime Load" ++msgstr "Obciążenie w czasie rzeczywistym" ++ ++msgid "Realtime Traffic" ++msgstr "Ruch w czasie rzeczywistym" ++ ++msgid "Realtime Wireless" ++msgstr "WiFi w czasie rzeczywistym" ++ ++msgid "Rebind protection" ++msgstr "Przypisz ochronÄ™" ++ ++msgid "Reboot" ++msgstr "Restart" ++ ++msgid "Rebooting..." ++msgstr "Ponowne uruchamianie..." ++ ++msgid "Reboots the operating system of your device" ++msgstr "Uruchamia ponownie system na twoim urzÄ…dzeniu" ++ ++msgid "Receive" ++msgstr "Odebrane" ++ ++msgid "Receiver Antenna" ++msgstr "Antena odbiorcza" ++ ++msgid "Reconnect this interface" ++msgstr "PoÅ‚Ä…cz ponownie ten interfejs" ++ ++msgid "Reconnecting interface" ++msgstr "ÅÄ…czÄ™ ponownie interfejs" ++ ++msgid "References" ++msgstr "Referencje" ++ ++msgid "Regulatory Domain" ++msgstr "Domena regulacji" ++ ++msgid "Relay" ++msgstr "Przekaźnik" ++ ++msgid "Relay Bridge" ++msgstr "Most przekaźnikowy" ++ ++msgid "Relay between networks" ++msgstr "Przekaźnik pomiÄ™dzy sieciami" ++ ++msgid "Relay bridge" ++msgstr "Most przekaźnikowy" ++ ++msgid "Remote IPv4 address" ++msgstr "Zdalny adres IPv4" ++ ++msgid "Remove" ++msgstr "UsuÅ„" ++ ++msgid "Repeat scan" ++msgstr "Powtórz skanowanie" ++ ++msgid "Replace entry" ++msgstr "ZamieÅ„ wpis" ++ ++msgid "Replace wireless configuration" ++msgstr "ZamieÅ„ konfiguracjÄ™ WiFi" ++ ++msgid "Request IPv6-address" ++msgstr "" ++ ++msgid "Request IPv6-prefix of length" ++msgstr "" ++ ++msgid "Require TLS" ++msgstr "" ++ ++msgid "Required for certain ISPs, e.g. Charter with DOCSIS 3" ++msgstr "Wymagany dla niektórych dostawców internetu, np. Charter z DOCSIS 3" ++ ++msgid "Reset" ++msgstr "Resetuj" ++ ++msgid "Reset Counters" ++msgstr "Wyczyść liczniki" ++ ++msgid "Reset to defaults" ++msgstr "Resetuj do domyÅ›lnych" ++ ++msgid "Resolv and Hosts Files" ++msgstr "Pliki Resolv i Hosts" ++ ++msgid "Resolve file" ++msgstr "Plik Resolve" ++ ++msgid "Restart" ++msgstr "Uruchom ponownie" ++ ++msgid "Restart Firewall" ++msgstr "Uruchom ponownie firewalla" ++ ++msgid "Restore backup" ++msgstr "Przywróć kopiÄ™ zapasowÄ…" ++ ++msgid "Reveal/hide password" ++msgstr "OdsÅ‚oÅ„/Ukryj hasÅ‚o" ++ ++msgid "Revert" ++msgstr "Przywróć" ++ ++msgid "Root" ++msgstr "Root" ++ ++msgid "Root directory for files served via TFTP" ++msgstr "Katalog Root`a dla plików udostÄ™pnianych przez TFTP" ++ ++msgid "Root preparation" ++msgstr "" ++ ++msgid "Routed IPv6 prefix for downstream interfaces" ++msgstr "" ++ ++msgid "Router Advertisement-Service" ++msgstr "" ++ ++msgid "Router Password" ++msgstr "HasÅ‚o routera" ++ ++msgid "Routes" ++msgstr "Åšcieżki routingu" ++ ++msgid "" ++"Routes specify over which interface and gateway a certain host or network " ++"can be reached." ++msgstr "" ++"Åšcieżki routingu pokazujÄ… routerowi przez który interfejs oraz którÄ… bramÄ™ " ++"może skomunikować siÄ™ z danÄ… sieciÄ… lub komputerem." ++ ++msgid "Rule #" ++msgstr "Zasada #" ++ ++msgid "Run a filesystem check before mounting the device" ++msgstr "" ++"Sprawdź czy system plików nie zawiera bÅ‚Ä™dów przed zamontowaniem urzÄ…dzenia" ++ ++msgid "Run filesystem check" ++msgstr "Sprawdź czy system plików nie zawiera bÅ‚Ä™dów" ++ ++msgid "" ++"SIXXS supports TIC only, for static tunnels using IP protocol 41 (RFC4213) " ++"use 6in4 instead" ++msgstr "" ++ ++msgid "SIXXS-handle[/Tunnel-ID]" ++msgstr "" ++ ++msgid "SSH Access" ++msgstr "DostÄ™p SSH" ++ ++msgid "SSH-Keys" ++msgstr "Klucze SSH" ++ ++msgid "SSID" ++msgstr "SSID" ++ ++msgid "Save" ++msgstr "Zapisz" ++ ++msgid "Save & Apply" ++msgstr "Zapisz i zastosuj" ++ ++msgid "Save & Apply" ++msgstr "Zapisz i zastosuj" ++ ++msgid "Scan" ++msgstr "Skanuj" ++ ++# Raczej nie stosuje siÄ™ kilku dużych liter w tym samym ++msgid "Scheduled Tasks" ++msgstr "Zaplanowane zadania" ++ ++msgid "Section added" ++msgstr "Dodano sekcjÄ™" ++ ++msgid "Section removed" ++msgstr "UsuniÄ™to sekcjÄ™" ++ ++msgid "See \"mount\" manpage for details" ++msgstr "Aby poznać szczegóły przeczytaj stronÄ™ instrukcji \"mount\"" ++ ++msgid "" ++"Send LCP echo requests at the given interval in seconds, only effective in " ++"conjunction with failure threshold" ++msgstr "" ++"Co podany czas (w sekundach) wyÅ›lij zapytania LCP echo, to ustawienie dziaÅ‚a " ++"tylko gdy ustawiony jest próg bÅ‚Ä™du LCP echo" ++ ++msgid "Separate Clients" ++msgstr "Rozdziel klientów" ++ ++msgid "Separate WDS" ++msgstr "Rozdziel WDS" ++ ++msgid "Server Settings" ++msgstr "Ustawienia serwera" ++ ++msgid "Server password" ++msgstr "" ++ ++msgid "" ++"Server password, enter the specific password of the tunnel when the username " ++"contains the tunnel ID" ++msgstr "" ++ ++msgid "Server username" ++msgstr "" ++ ++msgid "Service Name" ++msgstr "Nazwa serwisu" ++ ++msgid "Service Type" ++msgstr "Typ serwisu" ++ ++msgid "Services" ++msgstr "Serwisy" ++ ++#, fuzzy ++msgid "Set up Time Synchronization" ++msgstr "Ustawienia synchronizacji czasu" ++ ++msgid "Setup DHCP Server" ++msgstr "Ustawienia serwera DHCP" ++ ++msgid "Show current backup file list" ++msgstr "Pokaż aktualnÄ… listÄ™ plików do backupu" ++ ++msgid "Shutdown this interface" ++msgstr "WyÅ‚Ä…cz ten interfejs" ++ ++msgid "Shutdown this network" ++msgstr "WyÅ‚Ä…cz tÄ… sieć" ++ ++msgid "Signal" ++msgstr "SygnaÅ‚" ++ ++msgid "Signal:" ++msgstr "SygnaÅ‚:" ++ ++msgid "Size" ++msgstr "Rozmiar" ++ ++msgid "Skip" ++msgstr "PomiÅ„" ++ ++msgid "Skip to content" ++msgstr "PomiÅ„ do zawartoÅ›ci" ++ ++msgid "Skip to navigation" ++msgstr "PomiÅ„ do nawigacji" ++ ++msgid "Slot time" ++msgstr "Szczelina czasowa" ++ ++msgid "Software" ++msgstr "Oprogramowanie" ++ ++msgid "Some fields are invalid, cannot save values!" ++msgstr "WartoÅ›ci pewnych pól sÄ… niewÅ‚aÅ›ciwe, nie mogÄ™ ich zachować!" ++ ++msgid "Sorry, the object you requested was not found." ++msgstr "Przepraszamy, ale żądany obiekt nie zostaÅ‚ znaleziony." ++ ++msgid "Sorry, the server encountered an unexpected error." ++msgstr "Przepraszamy, ale serwer napotkaÅ‚ nieoczekiwany bÅ‚Ä…d." ++ ++#, fuzzy ++msgid "" ++"Sorry, there is no sysupgrade support present; a new firmware image must be " ++"flashed manually. Please refer to the OpenWrt wiki for device specific " ++"install instructions." ++msgstr "" ++"Przepraszamy, ale nie ma wsparcia dla trybu sysupgrade. Nowy firmware musi " ++"być wgrany rÄ™cznie. Sprawdź stronÄ™ OpenWrt wiki, aby uzyskać instrukcjÄ™ dla " ++"danego urzÄ…dzenia." ++ ++msgid "Sort" ++msgstr "Posortuj" ++ ++msgid "Source" ++msgstr "ŹródÅ‚o" ++ ++msgid "Source routing" ++msgstr "" ++ ++msgid "Specifies the button state to handle" ++msgstr "OkreÅ›la zachowanie w zależnoÅ›ci od stanu przycisku" ++ ++msgid "Specifies the directory the device is attached to" ++msgstr "Podaje katalog do którego jest podÅ‚Ä…czone urzÄ…dzenie" ++ ++msgid "Specifies the listening port of this Dropbear instance" ++msgstr "OkreÅ›la port nasÅ‚uchu dla tej instancji Dropbear" ++ ++msgid "" ++"Specifies the maximum amount of failed ARP requests until hosts are presumed " ++"to be dead" ++msgstr "" ++"OkreÅ›la maksymalnÄ… ilość bÅ‚Ä™dów dla zapytania ARP przed zaÅ‚ożeniem, że host " ++"jest martwy" ++ ++msgid "" ++"Specifies the maximum amount of seconds after which hosts are presumed to be " ++"dead" ++msgstr "" ++"OkreÅ›la maksymalny czas w sekundach przed zaÅ‚ożeniem, że host jest martwy" ++ ++msgid "Specify the secret encryption key here." ++msgstr "OkreÅ›l tajny klucz szyfrowania." ++ ++msgid "Start" ++msgstr "Uruchomienie" ++ ++msgid "Start priority" ++msgstr "Priorytet uruchomienia" ++ ++msgid "Startup" ++msgstr "Autostart" ++ ++msgid "Static IPv4 Routes" ++msgstr "Statyczne Å›cieżki routingu IPv4" ++ ++msgid "Static IPv6 Routes" ++msgstr "Statyczne Å›cieżki routingu IPv6" ++ ++msgid "Static Leases" ++msgstr "Dzierżawy statyczne" ++ ++msgid "Static Routes" ++msgstr "Statyczne Å›cieżki routingu" ++ ++msgid "Static WDS" ++msgstr "Statyczny WDS" ++ ++msgid "Static address" ++msgstr "StaÅ‚y adres" ++ ++msgid "" ++"Static leases are used to assign fixed IP addresses and symbolic hostnames " ++"to DHCP clients. They are also required for non-dynamic interface " ++"configurations where only hosts with a corresponding lease are served." ++msgstr "" ++"Statyczne dzierżawy sÄ… używane do przypisania staÅ‚ych adresów IP i " ++"symbolicznych nazw klientom DHCP. SÄ… one również wymagane dla " ++"niedynamicznych konfiguracji interfejsu, gdzie obsÅ‚ugiwane sÄ… tylko hosty z " ++"odpowiednim dzierżawami." ++ ++msgid "Status" ++msgstr "Stan" ++ ++msgid "Stop" ++msgstr "Stop" ++ ++msgid "Strict order" ++msgstr "Zachowaj kolejność" ++ ++msgid "Submit" ++msgstr "WyÅ›lij" ++ ++msgid "Swap" ++msgstr "" ++ ++msgid "Swap Entry" ++msgstr "ZamieÅ„ wpis" ++ ++msgid "Switch" ++msgstr "PrzeÅ‚Ä…cznik" ++ ++msgid "Switch %q" ++msgstr "PrzeÅ‚Ä…cznik %q" ++ ++msgid "Switch %q (%s)" ++msgstr "PrzeÅ‚Ä…cznik %q (%s)" ++ ++msgid "Switch protocol" ++msgstr "Protokół przeÅ‚Ä…cznika" ++ ++msgid "Sync with browser" ++msgstr "Synchronizuj z przeglÄ…darkÄ…" ++ ++msgid "Synchronizing..." ++msgstr "Synchronizacja..." ++ ++msgid "System" ++msgstr "System" ++ ++msgid "System Log" ++msgstr "Log systemowy" ++ ++msgid "System Properties" ++msgstr "WÅ‚aÅ›ciwoÅ›ci systemu" ++ ++# WszÄ™dzie używane jest "loga" z maÅ‚ej litery. ++msgid "System log buffer size" ++msgstr "Rozmiar bufora loga systemu" ++ ++msgid "TCP:" ++msgstr "TCP:" ++ ++msgid "TFTP Settings" ++msgstr "Ustawienia TFTP" ++ ++msgid "TFTP server root" ++msgstr "Root serwera TFTP" ++ ++msgid "TX" ++msgstr "TX" ++ ++msgid "TX Rate" ++msgstr "Szybkość TX" ++ ++msgid "Table" ++msgstr "Tablica" ++ ++msgid "Target" ++msgstr "Cel" ++ ++msgid "Terminate" ++msgstr "ZakoÅ„cz" ++ ++#, fuzzy ++msgid "" ++"The Device Configuration section covers physical settings of the " ++"radio hardware such as channel, transmit power or antenna selection which " ++"are shared among all defined wireless networks (if the radio hardware is " ++"multi-SSID capable). Per network settings like encryption or operation mode " ++"are grouped in the Interface Configuration." ++msgstr "" ++"Sekcja Konfiguracja UrzÄ…dzenia zawiera sprzÄ™towe ustawienia toru " ++"transmisji radiowej takie jak kanaÅ‚, moc sygnaÅ‚u, czy wybór anteny, które to " ++"sÄ… wspólne dla wszystkich zdefiniowanych sieci bezprzewodowych (jeÅ›li tor " ++"transmisji jest kompatybilny z transmisjÄ… multi-SSID). Ustawienia sieci " ++"takie jak szyfrowanie lub tryb operacji sÄ… zebrane w sekcji Konfiguracja " ++"Interfejsu." ++ ++msgid "" ++"The libiwinfo-lua package is not installed. You must install this " ++"component for working wireless configuration!" ++msgstr "" ++"Pakiet libiwinfo-lua nie jest zainstalowany. Musisz go zainstalować " ++"aby WiFi prawidÅ‚owo zadziaÅ‚aÅ‚o!" ++ ++msgid "" ++"The HE.net endpoint update configuration changed, you must now use the plain " ++"username instead of the user ID!" ++msgstr "" ++ ++msgid "" ++"The IPv6 prefix assigned to the provider, usually ends with ::" ++msgstr "" ++"Prefiks IPv6 przypisany do dostawcy, zazwyczaj koÅ„czy siÄ™ ::" ++ ++msgid "" ++"The allowed characters are: A-Z, a-z, 0-9 and _" ++msgstr "" ++"Dozwolone znaki to: A-Z, a-z, 0-9 " ++"oraz _" ++ ++msgid "The configuration file could not be loaded due to the following error:" ++msgstr "" ++ ++msgid "" ++"The device file of the memory or partition (e.g." ++" /dev/sda1)" ++msgstr "" ++"Plik urzÄ…dzenia - pamiÄ™ci lub partycji (np. /dev/sda1)" ++ ++msgid "" ++"The filesystem that was used to format the memory (e.g. ext3)" ++msgstr "" ++"System plików, który zostaÅ‚ użyty do sformatowania noÅ›nika (np. ext3)" ++ ++# Przycisk nazywa siÄ™ "Wykonaj", wiÄ™c taki sam opis ma być w podpowiedzi. ++msgid "" ++"The flash image was uploaded. Below is the checksum and file size listed, " ++"compare them with the original file to ensure data integrity.
    Click " ++"\"Proceed\" below to start the flash procedure." ++msgstr "" ++"Obraz flash`a został przesłany. Poniżej znajduje się suma kontrolna i " ++"rozmiar obrazu, porównaj je z sumą kontrolną i rozmiarem oryginału, aby " ++"upewnić się, że został przesłany poprawnie.
    Wciśnij \"Wykonaj\" aby " ++"kontynuować aktualizację." ++ ++msgid "The following changes have been committed" ++msgstr "Następujące zmiany zostały zatwierdzone" ++ ++msgid "The following changes have been reverted" ++msgstr "Następujące zmiany zostały odrzucone" ++ ++msgid "The following rules are currently active on this system." ++msgstr "Następujące zasady są obecnie aktywne w tym systemie." ++ ++msgid "The given network name is not unique" ++msgstr "Podana sieć NIE jest unikalna" ++ ++#, fuzzy ++msgid "" ++"The hardware is not multi-SSID capable and the existing configuration will " ++"be replaced if you proceed." ++msgstr "" ++"Sprzęt nie jest urządzeniem typu multi-SSID, więc bieżąca konfiguracja " ++"zostanie nadpisana nową jeśli będziesz kontynuować." ++ ++msgid "" ++"The length of the IPv4 prefix in bits, the remainder is used in the IPv6 " ++"addresses." ++msgstr "" ++"Długość prefiksu IPv4 w bitach, pozostała część jest używana w adresach IPv6." ++ ++msgid "The length of the IPv6 prefix in bits" ++msgstr "Długość prefiksu IPv6 w bitach" ++ ++msgid "" ++"The network ports on this device can be combined to several VLANs in which computers can " ++"communicate directly with each other. VLANs are often used to separate different network " ++"segments. Often there is by default one Uplink port for a connection to the " ++"next greater network like the internet and other ports for a local network." ++msgstr "" ++"Porty sieciowe na tym urządzeniu mogą być łączone w kilka sieci VLAN, w których komputery mogą " ++"komunikować się ze sobą bezpośrednio. Sieci VLAN są często stosowane w celu oddzielenia różnych " ++"segmentów sieci. Często domyślnie jeden port typu Uplink jest wykorzystywany " ++"do połączenia z większą siecią, taką jak Internet, a inne porty dla sieci " ++"lokalnej." ++ ++msgid "The selected protocol needs a device assigned" ++msgstr "Wybrany protokół potrzebuje przypisanego urządzenia" ++ ++msgid "" ++"The system is erasing the configuration partition now and will reboot itself " ++"when finished." ++msgstr "" ++"System usuwa teraz partycję konfiguracji i zrestartuje się po zakończeniu." ++ ++#, fuzzy ++msgid "" ++"The system is flashing now.
    DO NOT POWER OFF THE DEVICE!
    Wait a " ++"few minutes before you try to reconnect. It might be necessary to renew the " ++"address of your computer to reach the device again, depending on your " ++"settings." ++msgstr "" ++"System wykonuje flashowanie.
    NIE WYÅÄ„CZAĆ URZÄ„DZENIA!
    Poczekaj " ++"kilka minut, zanim spróbujesz połączyć się ponownie. W zależności od " ++"ustawień może być konieczne odnowienie adresu Twojego komputera, aby dostać " ++"się do urządzenia." ++ ++msgid "" ++"The tunnel end-point is behind NAT, defaults to disabled and only applies to " ++"AYIYA" ++msgstr "" ++ ++msgid "" ++"The uploaded image file does not contain a supported format. Make sure that " ++"you choose the generic image format for your platform." ++msgstr "" ++"Przesłany plik obrazu nie zawiera obsługiwanego formatu. Upewnij się, że " ++"wybrałeś odpowiedni format obrazu dla danej platformy." ++ ++msgid "There are no active leases." ++msgstr "Brak aktywnych dzierżaw." ++ ++msgid "There are no pending changes to apply!" ++msgstr "Brak oczekujących zmian do zastosowania!" ++ ++msgid "There are no pending changes to revert!" ++msgstr "Brak oczekujących zmian do przywrócenia!" ++ ++msgid "There are no pending changes!" ++msgstr "Brak oczekujących zmian!" ++ ++msgid "" ++"There is no device assigned yet, please attach a network device in the " ++"\"Physical Settings\" tab" ++msgstr "" ++"Żadne urządzenie nie jest jeszcze przypisane. Proszę dołączyć urządzenie " ++"sieciowe na karcie \"Ustawienia sprzętowe\"" ++ ++msgid "" ++"There is no password set on this router. Please configure a root password to " ++"protect the web interface and enable SSH." ++msgstr "" ++"Hasło nie zostało ustawione. Proszę skonfigurować hasło roota, aby " ++"zabezpieczyć interfejs WWW i włączyć SSH." ++ ++msgid "This IPv4 address of the relay" ++msgstr "Ten adres IPv4 przekaźnika" ++ ++msgid "" ++"This is a list of shell glob patterns for matching files and directories to " ++"include during sysupgrade. Modified files in /etc/config/ and certain other " ++"configurations are automatically preserved." ++msgstr "" ++"Jest to lista globalnych wzorców dopasowywania plików i katalogów " ++"uwzględnianych podczas przeprowadzania aktualizacji z użyciem \"sysupgrade" ++"\". Zmodyfikowane pliki w /etc/config/ i w niektórych innych ustawieniach są " ++"automatycznie zachowywane." ++ ++msgid "" ++"This is either the \"Update Key\" configured for the tunnel or the account " ++"password if no update key has been configured" ++msgstr "" ++ ++msgid "" ++"This is the content of /etc/rc.local. Insert your own commands here (in " ++"front of 'exit 0') to execute them at the end of the boot process." ++msgstr "" ++"To jest zawartość pliku /etc/rc.local. Wstaw tutaj własne komendy (przed " ++"'exit 0'), aby zostały wykonane pod koniec procesu rozruchu." ++ ++msgid "" ++"This is the local endpoint address assigned by the tunnel broker, it usually " ++"ends with :2" ++msgstr "" ++"To jest lokalny adres końcowy przypisany przez tunnel broker'a, zwykle " ++"kończący się z :2" ++ ++# w tłumaczeniu pojawiła się spacja po DHCP
    co powoduje niepoprawne wyświetlanie się strony z lang PL ++msgid "" ++"This is the only DHCP in the local network" ++msgstr "" ++"To jest jedyny serwer DHCP w sieci lokalnej" ++ ++msgid "This is the plain username for logging into the account" ++msgstr "" ++ ++msgid "" ++"This is the prefix routed to you by the tunnel broker for use by clients" ++msgstr "" ++ ++msgid "This is the system crontab in which scheduled tasks can be defined." ++msgstr "" ++"To jest system crontab, w którym mogą być zdefiniowane zaplanowane zadania." ++ ++msgid "" ++"This is usually the address of the nearest PoP operated by the tunnel broker" ++msgstr "" ++"Zwykle jest to adres najbliższego PoP prowadzonego przez tunnel broker'a" ++ ++msgid "" ++"This list gives an overview over currently running system processes and " ++"their status." ++msgstr "" ++"Poniższa lista przedstawia aktualnie uruchomione procesy systemowe i ich " ++"status." ++ ++msgid "This page allows the configuration of custom button actions" ++msgstr "" ++"Poniższa strona umożliwia konfigurację działania niestandardowych przycisków" ++ ++msgid "This page gives an overview over currently active network connections." ++msgstr "Poniższa strona przedstawia aktualnie aktywne połączenia sieciowe." ++ ++msgid "This section contains no values yet" ++msgstr "Ta sekcja nie zawiera jeszcze żadnych wartości" ++ ++msgid "Time Synchronization" ++msgstr "Synchronizacja czasu" ++ ++msgid "Time Synchronization is not configured yet." ++msgstr "Synchronizacja czasu nie jest jeszcze skonfigurowana." ++ ++msgid "Timezone" ++msgstr "Strefa czasowa" ++ ++msgid "" ++"To restore configuration files, you can upload a previously generated backup " ++"archive here." ++msgstr "" ++"Aby przywrócić pliki konfiguracyjne, można tutaj wczytać wcześniej utworzone " ++"archiwum kopii zapasowej." ++ ++msgid "Total Available" ++msgstr "Całkowicie dostępna" ++ ++msgid "Traceroute" ++msgstr "Trasa routowania" ++ ++msgid "Traffic" ++msgstr "Ruch" ++ ++msgid "Transfer" ++msgstr "Transfer" ++ ++msgid "Transmission Rate" ++msgstr "Prędkość transmisji" ++ ++msgid "Transmit" ++msgstr "Nadawanie" ++ ++msgid "Transmit Power" ++msgstr "Siła nadawania" ++ ++msgid "Transmitter Antenna" ++msgstr "Antena nadajnika" ++ ++msgid "Trigger" ++msgstr "Trigger" ++ ++msgid "Trigger Mode" ++msgstr "Tryb Trigger" ++ ++msgid "Tunnel ID" ++msgstr "Numer identyfikacyjny tunelu" ++ ++msgid "Tunnel Interface" ++msgstr "Interfejs tunelu" ++ ++msgid "Tunnel Link" ++msgstr "" ++ ++msgid "Tunnel broker protocol" ++msgstr "" ++ ++msgid "Tunnel setup server" ++msgstr "" ++ ++msgid "Tunnel type" ++msgstr "" ++ ++msgid "Turbo Mode" ++msgstr "Tryb Turbo" ++ ++msgid "Tx-Power" ++msgstr "Moc nadawania" ++ ++msgid "Type" ++msgstr "Typ" ++ ++msgid "UDP:" ++msgstr "UDP:" ++ ++msgid "UMTS only" ++msgstr "Tylko UMTS" ++ ++msgid "UMTS/GPRS/EV-DO" ++msgstr "UMTS/GPRS/EV-DO" ++ ++msgid "USB Device" ++msgstr "Urządzenie USB" ++ ++msgid "UUID" ++msgstr "UUID" ++ ++msgid "Unable to dispatch" ++msgstr "Nie można wysłać" ++ ++msgid "Unknown" ++msgstr "Nieznany" ++ ++msgid "Unknown Error, password not changed!" ++msgstr "Nieznany błąd, hasło nie zostało zmienione" ++ ++msgid "Unmanaged" ++msgstr "Niezarządzalny" ++ ++msgid "Unsaved Changes" ++msgstr "Niezapisane zmiany" ++ ++msgid "Unsupported protocol type." ++msgstr "Nieobsługiwany typ protokołu." ++ ++msgid "Update lists" ++msgstr "Aktualizuj listy" ++ ++msgid "" ++"Upload a sysupgrade-compatible image here to replace the running firmware. " ++"Check \"Keep settings\" to retain the current configuration (requires an " ++"OpenWrt compatible firmware image)." ++msgstr "" ++"Prześlij zgodny z funkcją sysupgrade obraz tutaj, aby zastąpić aktualnie " ++"działające firmware. Zaznacz opcję \"Zachowaj ustawienia\", aby zachować " ++"bieżącą konfigurację (wymaga zgodnego obrazu firmware OpenWrt)." ++ ++msgid "Upload archive..." ++msgstr "Załaduj archiwum..." ++ ++msgid "Uploaded File" ++msgstr "Załaduj plik" ++ ++msgid "Uptime" ++msgstr "Czas pracy" ++ ++msgid "Use /etc/ethers" ++msgstr "Użyj /etc/ethers" ++ ++msgid "Use DHCP gateway" ++msgstr "Użyj bramy DHCP" ++ ++msgid "Use DNS servers advertised by peer" ++msgstr "Użyj serwerów DNS rozgłaszanych przez peera" ++ ++msgid "Use ISO/IEC 3166 alpha2 country codes." ++msgstr "Użyj kodów kraju ISO/IEC 3166 alpha2" ++ ++msgid "Use MTU on tunnel interface" ++msgstr "Użyj MTU na interfejsie tunelu" ++ ++msgid "Use TTL on tunnel interface" ++msgstr "Użyj TTL na interfejsie tunelu" ++ ++msgid "Use as external overlay (/overlay)" ++msgstr "" ++ ++msgid "Use as root filesystem (/)" ++msgstr "" ++ ++msgid "Use broadcast flag" ++msgstr "Użyj flagi rozgłaszania" ++ ++msgid "Use builtin IPv6-management" ++msgstr "" ++ ++msgid "Use custom DNS servers" ++msgstr "Użyj własnych serwerów DNS" ++ ++msgid "Use default gateway" ++msgstr "Użyj domyślnej bramy" ++ ++msgid "Use gateway metric" ++msgstr "Użyj metryki bramy" ++ ++msgid "Use routing table" ++msgstr "Użyj tabeli routingu" ++ ++msgid "" ++"Use the Add Button to add a new lease entry. The MAC-Address indentifies the host, the IPv4-Address specifies to the fixed " ++"address to use and the Hostname is assigned as symbolic name to the " ++"requesting host." ++msgstr "" ++"Użyj przycisku Dodaj, aby dodać nowy wpis dzierżawy. Adres MAC identyfikuje hosta, Adres IPv4 określa, którego stałego adresu " ++"użyć, natomiast Nazwa hosta jest przypisana jako symboliczna nazwa " ++"do określonego hosta." ++ ++# Przy liście zamontowanych systemów plików ++msgid "Used" ++msgstr "Użyte" ++ ++msgid "Used Key Slot" ++msgstr "Użyte gniazdo klucza" ++ ++msgid "User certificate (PEM encoded)" ++msgstr "" ++ ++msgid "User key (PEM encoded)" ++msgstr "" ++ ++msgid "Username" ++msgstr "Nazwa użytkownika" ++ ++msgid "VC-Mux" ++msgstr "VC-Mux" ++ ++msgid "VLAN Interface" ++msgstr "Interfejs VLAN" ++ ++msgid "VLANs on %q" ++msgstr "Sieci VLAN na %q" ++ ++msgid "VLANs on %q (%s)" ++msgstr "Sieci VLAN na %q (%s)" ++ ++msgid "VPN Server" ++msgstr "Serwer VPN" ++ ++msgid "VPN Server port" ++msgstr "" ++ ++msgid "VPN Server's certificate SHA1 hash" ++msgstr "" ++ ++msgid "Vendor Class to send when requesting DHCP" ++msgstr "Klasa producenta do wysłania podczas żądania DHCP" ++ ++msgid "Verbose" ++msgstr "" ++ ++msgid "Verbose logging by aiccu daemon" ++msgstr "" ++ ++msgid "Verify" ++msgstr "Zweryfikuj" ++ ++msgid "Version" ++msgstr "Wersja" ++ ++msgid "WDS" ++msgstr "WDS" ++ ++msgid "WEP Open System" ++msgstr "Otwarty system WEP" ++ ++msgid "WEP Shared Key" ++msgstr "Współdzielony klucz WEP" ++ ++msgid "WEP passphrase" ++msgstr "Hasło WEP" ++ ++msgid "WMM Mode" ++msgstr "Tryb WMM" ++ ++msgid "WPA passphrase" ++msgstr "Hasło WPA" ++ ++msgid "" ++"WPA-Encryption requires wpa_supplicant (for client mode) or hostapd (for AP " ++"and ad-hoc mode) to be installed." ++msgstr "" ++"Kodowanie WPA wymaga zainstalowanych modułów wpa_supplicant (na tryb " ++"klienta) lub hostapd (dla trybów AP lub ad-hoc)" ++ ++msgid "" ++"Wait for NTP sync that many seconds, seting to 0 disables waiting (optional)" ++msgstr "" ++ ++# obsy: Brzmi to lepiej niż "czekanie na wprowadzanie zmian. ++msgid "Waiting for changes to be applied..." ++msgstr "Trwa wprowadzenie zmian..." ++ ++msgid "Waiting for command to complete..." ++msgstr "Trwa wykonanie polecenia..." ++ ++msgid "Warning" ++msgstr "Ostrzeżenie" ++ ++msgid "Warning: There are unsaved changes that will be lost while rebooting!" ++msgstr "" ++"Ostrzeżenie: Pozostały niezapisane zmian, które zostaną utracone podczas " ++"restartu!" ++ ++msgid "Whether to create an IPv6 default route over the tunnel" ++msgstr "" ++ ++msgid "Whether to route only packets from delegated prefixes" ++msgstr "" ++ ++msgid "Width" ++msgstr "" ++ ++msgid "Wifi" ++msgstr "Wifi" ++ ++msgid "Wireless" ++msgstr "Sieć bezprzewodowa" ++ ++msgid "Wireless Adapter" ++msgstr "Adapter bezprzewodowy" ++ ++msgid "Wireless Network" ++msgstr "Sieć bezprzewodowa" ++ ++msgid "Wireless Overview" ++msgstr "Przegląd sieci bezprzewodowych" ++ ++msgid "Wireless Security" ++msgstr "Zabezpieczenia sieci bezprzewodowych" ++ ++msgid "Wireless is disabled or not associated" ++msgstr "Sieć bezprzewodowa jest wyłączona lub niepołączona" ++ ++msgid "Wireless is restarting..." ++msgstr "Restart sieci bezprzewodowej..." ++ ++msgid "Wireless network is disabled" ++msgstr "Sieć bezprzewodowa jest wyłączona" ++ ++msgid "Wireless network is enabled" ++msgstr "Sieć bezprzewodowa jest włączona" ++ ++msgid "Wireless restarted" ++msgstr "Zrestartowano sieć bezprzewodową" ++ ++msgid "Wireless shut down" ++msgstr "Wyłączanie sieci bezprzewodowej" ++ ++msgid "Write received DNS requests to syslog" ++msgstr "Zapisz otrzymane żądania DNS do syslog'a" ++ ++msgid "XR Support" ++msgstr "Wsparcie XR" ++ ++msgid "" ++"You can enable or disable installed init scripts here. Changes will applied " ++"after a device reboot.
    Warning: If you disable essential init " ++"scripts like \"network\", your device might become inaccessible!" ++msgstr "" ++"Tutaj można włączyć lub wyłączyć zainstalowane skrypty. Zmiany zostaną " ++"zastosowane po ponownym uruchomieniu urządzenia.
    Ostrzeżenie: " ++"Jeśli wyłączysz podstawowe skrypty typu \"networks\", urządzenie może stać " ++"się nieosiągalne!" ++ ++msgid "" ++"You must enable Java Script in your browser or LuCI will not work properly." ++msgstr "" ++"Musisz włączyć obsługę Java Script w swojej przeglądarce, inaczej LuCI nie " ++"będzie działać poprawnie." ++ ++msgid "" ++"Your Internet Explorer is too old to display this page correctly. Please " ++"upgrade it to at least version 7 or use another browser like Firefox, Opera " ++"or Safari." ++msgstr "" ++ ++msgid "any" ++msgstr "dowolny" ++ ++msgid "auto" ++msgstr "auto" ++ ++msgid "automatic" ++msgstr "" ++ ++msgid "baseT" ++msgstr "baseT" ++ ++msgid "bridged" ++msgstr "bridged" ++ ++msgid "create:" ++msgstr "utwórz:" ++ ++msgid "creates a bridge over specified interface(s)" ++msgstr "utwórz bridge na określonych interfejsach" ++ ++msgid "dB" ++msgstr "dB" ++ ++msgid "dBm" ++msgstr "dBm" ++ ++msgid "disable" ++msgstr "wyłącz" ++ ++msgid "disabled" ++msgstr "" ++ ++msgid "expired" ++msgstr "wygasły" ++ ++msgid "" ++"file where given DHCP-leases will be stored" ++msgstr "" ++"plik, w którym podano żądania DHCP, zostanie zachowany" ++ ++msgid "forward" ++msgstr "przekaż" ++ ++msgid "full-duplex" ++msgstr "pełny-duplex" ++ ++msgid "half-duplex" ++msgstr "pół-duplex" ++ ++msgid "help" ++msgstr "pomoc" ++ ++msgid "hidden" ++msgstr "ukryty" ++ ++msgid "hybrid mode" ++msgstr "" ++ ++msgid "if target is a network" ++msgstr "jeżeli celem jest sieć" ++ ++msgid "input" ++msgstr "wejście" ++ ++msgid "kB" ++msgstr "kB" ++ ++msgid "kB/s" ++msgstr "kB/s" ++ ++msgid "kbit/s" ++msgstr "kbit/s" ++ ++msgid "local DNS file" ++msgstr "lokalny plik DNS" ++ ++msgid "minimum 1280, maximum 1480" ++msgstr "" ++ ++msgid "navigation Navigation" ++msgstr "" ++ ++msgid "no" ++msgstr "nie" ++ ++# skorzystałem z niemieckiego tłumaczenia ++msgid "no link" ++msgstr "niepowiązane" ++ ++msgid "none" ++msgstr "żaden" ++ ++msgid "not present" ++msgstr "" ++ ++msgid "off" ++msgstr "wyłączone" ++ ++msgid "on" ++msgstr "włączone" ++ ++msgid "open" ++msgstr "otwarte" ++ ++msgid "overlay" ++msgstr "" ++ ++msgid "relay mode" ++msgstr "" ++ ++msgid "routed" ++msgstr "routowane" ++ ++msgid "server mode" ++msgstr "" ++ ++msgid "skiplink1 Skip to navigation" ++msgstr "" ++ ++msgid "skiplink2 Skip to content" ++msgstr "" ++ ++msgid "stateful-only" ++msgstr "" ++ ++msgid "stateless" ++msgstr "" ++ ++msgid "stateless + stateful" ++msgstr "" ++ ++msgid "tagged" ++msgstr "tagowane" ++ ++msgid "unknown" ++msgstr "nieznane" ++ ++msgid "unlimited" ++msgstr "nielimitowane" ++ ++msgid "unspecified" ++msgstr "nieokreślone" ++ ++msgid "unspecified -or- create:" ++msgstr "nieokreślone -lub- utwórz:" ++ ++msgid "untagged" ++msgstr "nietagowane" ++ ++msgid "yes" ++msgstr "tak" ++ ++msgid "« Back" ++msgstr "« Wróć" ++ ++#~ msgid "" ++#~ "Always use 40MHz channels even if the secondary channel overlaps. Using " ++#~ "this option does not comply with IEEE 802.11n-2009!" ++#~ msgstr "" ++#~ "Zawsze używaj kanał 40MHz nawet jeśli drugi kanał pokrywa się. Użycie tej " ++#~ "opcji nie jest zgodne ze standardem IEEE 802.11n-2009!" ++ ++#~ msgid "Cached" ++#~ msgstr "Cache" ++ ++#~ msgid "Configures this mount as overlay storage for block-extroot" ++#~ msgstr "Konfiguruje ten zasób jako zasób overlay dla block-extroot" ++ ++#~ msgid "Force 40MHz mode" ++#~ msgstr "Wymuś tryb 40MHz" ++ ++#~ msgid "Frequency Hopping" ++#~ msgstr "Skakanie po częstotliwościach" ++ ++#~ msgid "Locked to channel %d used by %s" ++#~ msgstr "Zablokowano dla kanału %d używanego przez %s" ++ ++#~ msgid "Use as root filesystem" ++#~ msgstr "Użyj systemu plików root'a" ++ ++#~ msgid "HE.net user ID" ++#~ msgstr "Login (ID) HE.net" ++ ++#~ msgid "This is the 32 byte hex encoded user ID, not the login name" ++#~ msgstr "" ++#~ "To jest 32-bajtowy heksadecymalny zakodowany identyfikator użytkownika, a " ++#~ "nie login" ++ ++#~ msgid "40MHz 2nd channel above" ++#~ msgstr "40MHz drugi kanał powyżej" ++ ++#~ msgid "40MHz 2nd channel below" ++#~ msgstr "40MHz drugi kanał poniżej" ++ ++#~ msgid "Accept router advertisements" ++#~ msgstr "Akceptuj rozgłoszenia routera" ++ ++# Dosłowne tłumaczenie ++#~ msgid "Advertise IPv6 on network" ++#~ msgstr "Rozgłoś protokół IPv6 w sieci" ++ ++#~ msgid "Advertised network ID" ++#~ msgstr "Rozgłoś identyfikator sieci (network ID)" ++ ++#~ msgid "Allowed range is 1 to 65535" ++#~ msgstr "Dopuszczalny zakres to 1 do 65535" ++ ++#~ msgid "HT capabilities" ++#~ msgstr "Możliwości HT" ++ ++#~ msgid "HT mode" ++#~ msgstr "Tryb HT" ++ ++#~ msgid "Router Model" ++#~ msgstr "Model routera" ++ ++#~ msgid "Router Name" ++#~ msgstr "Nazwa routera" ++ ++#~ msgid "Send router solicitations" ++#~ msgstr "Wyślij pakiet wymuszający rozgłoszenia routera" ++ ++#~ msgid "Specifies the advertised preferred prefix lifetime in seconds" ++#~ msgstr "Określa czas życia rozgłoszenia preferowanego prefiksu w sekundach" ++ ++#~ msgid "Specifies the advertised valid prefix lifetime in seconds" ++#~ msgstr "Określa czas życia rozgłoszenia obowiązującego prefiksu w sekundach" ++ ++#~ msgid "Use preferred lifetime" ++#~ msgstr "Użyj preferowanego czasu życia" ++ ++#~ msgid "Use valid lifetime" ++#~ msgstr "Użyj prawidłowego czasu życia" ++ ++#~ msgid "Waiting for router..." ++#~ msgstr "Czekanie na router..." ++ ++#~ msgid "Enable builtin NTP server" ++#~ msgstr "Włącz wbudowany serwer NTP" ++ ++#~ msgid "Active Leases" ++#~ msgstr "Aktywne dzierżawy" ++ ++#~ msgid "Open" ++#~ msgstr "Otwórz" ++ ++#~ msgid "Bit Rate" ++#~ msgstr "Przepływność" ++ ++#~ msgid "Configuration / Apply" ++#~ msgstr "Konfiguracja / Zastosuj" ++ ++#~ msgid "Configuration / Changes" ++#~ msgstr "Konfiguracja / zmiany" ++ ++#~ msgid "Configuration / Revert" ++#~ msgstr "Konfiguracja / cofnięcie zmian" ++ ++#~ msgid "MAC" ++#~ msgstr "MAC" ++ ++#~ msgid "MAC Address" ++#~ msgstr "Adres MAC" +diff --git a/feeds/luci/modules/luci-base/po/pt-br/base.po b/feeds/luci/modules/luci-base/po/pt-br/base.po +new file mode 100644 +index 0000000..ec4401b +--- /dev/null ++++ b/feeds/luci/modules/luci-base/po/pt-br/base.po +@@ -0,0 +1,4352 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Report-Msgid-Bugs-To: \n" ++"POT-Creation-Date: 2009-06-10 03:41+0200\n" ++"PO-Revision-Date: 2014-03-29 23:31+0200\n" ++"Last-Translator: Luiz Angelo \n" ++"Language-Team: LANGUAGE \n" ++"Language: pt_BR\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n > 1);\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "(%d minute window, %d second interval)" ++msgstr "(janela de %d minutos, intervalo de %d segundos)" ++ ++msgid "(%s available)" ++msgstr "(%s disponível)" ++ ++msgid "(empty)" ++msgstr "(vazio)" ++ ++msgid "(no interfaces attached)" ++msgstr "(nenhuma interface conectada)" ++ ++msgid "-- Additional Field --" ++msgstr "-- Campo Adicional --" ++ ++msgid "-- Please choose --" ++msgstr "-- Por favor, escolha --" ++ ++msgid "-- custom --" ++msgstr "-- personalizado --" ++ ++msgid "-- match by device --" ++msgstr "" ++ ++msgid "-- match by label --" ++msgstr "" ++ ++msgid "1 Minute Load:" ++msgstr "Carga 1 Minuto:" ++ ++msgid "15 Minute Load:" ++msgstr "Carga 15 Minutos:" ++ ++msgid "5 Minute Load:" ++msgstr "Carga 5 Minutos:" ++ ++msgid "BSSID" ++msgstr "" ++"BSSID" ++ ++msgid "DNS query port" ++msgstr "" ++"Porta de consulta DNS" ++ ++msgid "DNS server port" ++msgstr "" ++"Porta do servidor DNS" ++ ++msgid "" ++"DNS servers will be queried in the " ++"order of the resolvfile" ++msgstr "" ++"O servidor DNS irá " ++"consultar na ordem do arquivo resolvfile" ++ ++msgid "ESSID" ++msgstr "" ++"ESSID" ++ ++msgid "IPv4-Address" ++msgstr "Endereço IPv4" ++ ++msgid "IPv4-Gateway" ++msgstr "Roteador IPv4" ++ ++msgid "IPv4-Netmask" ++msgstr "" ++"Máscara de rede IPv4" ++ ++msgid "" ++"IPv6-Address or Network " ++"(CIDR)" ++msgstr "" ++"Endereço do IPv6 " ++"Endereço ou rede (CIDR)" ++ ++msgid "IPv6-Gateway" ++msgstr "Roteador IPv6" ++ ++msgid "IPv6-Suffix (hex)" ++msgstr "" ++ ++msgid "LED Configuration" ++msgstr "Configuração do LED" ++ ++msgid "LED Name" ++msgstr "Nome do LED" ++ ++msgid "MAC-Address" ++msgstr "Endereço MAC" ++ ++msgid "" ++"Max. DHCP leases" ++msgstr "" ++"Numero máximo de alocações DHCP" ++ ++msgid "" ++"Max. EDNS0 packet size" ++msgstr "" ++"Tamanho máximo do pacote do EDNS0" ++ ++msgid "Max. concurrent queries" ++msgstr "Número máximo de consultas concorrentes" ++ ++msgid "%s - %s" ++msgstr "%s - %s" ++ ++msgid "ADSL" ++msgstr "" ++ ++msgid "ADSL Status" ++msgstr "" ++ ++msgid "AICCU (SIXXS)" ++msgstr "" ++ ++msgid "APN" ++msgstr "APN" ++ ++msgid "AR Support" ++msgstr "Suporte AR" ++ ++msgid "ARP retry threshold" ++msgstr "" ++"Limite de retentativas do ARP" ++ ++msgid "ATM Bridges" ++msgstr "Ponte ATM" ++ ++msgid "ATM Virtual Channel Identifier (VCI)" ++msgstr "Identificador de Canal Virtual ATM (VCI)" ++ ++msgid "ATM Virtual Path Identifier (VPI)" ++msgstr "Identificador de Caminho Virtual ATM (VPI)" ++ ++msgid "" ++"ATM bridges expose encapsulated ethernet in AAL5 connections as virtual " ++"Linux network interfaces which can be used in conjunction with DHCP or PPP " ++"to dial into the provider network." ++msgstr "" ++"Pontes ATM expõem ethernet encapsuladas em conexões AAL5 como interfaces de " ++"rede virutais no Linux. Estas podem ser usadas em conjunto com o DHCP ou PPP " ++"para discar em um provedor de rede." ++ ++msgid "ATM device number" ++msgstr "Número do dispositivo ATM" ++ ++msgid "AYIYA" ++msgstr "" ++ ++msgid "Access Concentrator" ++msgstr "Concentrador de Acesso" ++ ++msgid "Access Point" ++msgstr "Ponto de Acceso (AP)" ++ ++msgid "Action" ++msgstr "Ação" ++ ++msgid "Actions" ++msgstr "Ações" ++ ++msgid "Activate this network" ++msgstr "Ativar esta rede" ++ ++msgid "Active IPv4-Routes" ++msgstr "" ++"Rotas IPv4 ativas" ++ ++msgid "Active IPv6-Routes" ++msgstr "" ++"Rotas IPv6 ativas" ++ ++msgid "Active Connections" ++msgstr "Conexões Ativas" ++ ++msgid "Active DHCP Leases" ++msgstr "Alocações DHCP ativas" ++ ++msgid "Active DHCPv6 Leases" ++msgstr "Alocações DHCPv6 ativas" ++ ++msgid "Ad-Hoc" ++msgstr "Ad-Hoc" ++ ++msgid "Add" ++msgstr "Adicionar" ++ ++msgid "Add local domain suffix to names served from hosts files" ++msgstr "Adiciona um sufixo de domínio local para equipamentos conhecidos" ++ ++msgid "Add new interface..." ++msgstr "Adiciona uma nova interface..." ++ ++msgid "Additional Hosts files" ++msgstr "Arquivos adicionais de equipamentos conhecidos (hosts)" ++ ++msgid "Address" ++msgstr "Endereço" ++ ++msgid "Address to access local relay bridge" ++msgstr "Endereço para acessar a ponte por retransmissão local " ++ ++msgid "Administration" ++msgstr "Administração" ++ ++msgid "Advanced Settings" ++msgstr "Opções Avançadas" ++ ++msgid "Alert" ++msgstr "Alerta" ++ ++msgid "Allow SSH password authentication" ++msgstr "" ++"Permitir autenticação SSH por senha" ++ ++msgid "Allow all except listed" ++msgstr "Permitir todos, exceto os listados" ++ ++msgid "Allow listed only" ++msgstr "Permitir somente os listados" ++ ++msgid "Allow localhost" ++msgstr "Permitir computador local" ++ ++msgid "Allow remote hosts to connect to local SSH forwarded ports" ++msgstr "" ++"Permitir que equipamentos remotos conectem à portas locais encaminhadas por " ++"SSH" ++ ++msgid "Allow root logins with password" ++msgstr "Permite autenticação do root com senha" ++ ++msgid "Allow the root user to login with password" ++msgstr "Permite que o usuário root se autentique utilizando senha" ++ ++msgid "" ++"Allow upstream responses in the 127.0.0.0/8 range, e.g. for RBL services" ++msgstr "" ++"Permite respostas que apontem para 127.0.0.0/8 de servidores externos, por " ++"exemplo, para os serviços RBL" ++ ++msgid "" ++"Also see Tunneling Comparison on SIXXS" ++msgstr "" ++ ++msgid "Always announce default router" ++msgstr "" ++ ++msgid "An additional network will be created if you leave this unchecked." ++msgstr "Uma rede adicional será criada se você deixar isto desmarcado." ++ ++msgid "Announce as default router even if no public prefix is available." ++msgstr "" ++ ++msgid "Announced DNS domains" ++msgstr "" ++ ++msgid "Announced DNS servers" ++msgstr "" ++ ++msgid "Antenna 1" ++msgstr "Antena 1" ++ ++msgid "Antenna 2" ++msgstr "Antena 2" ++ ++msgid "Antenna Configuration" ++msgstr "configuração de antena" ++ ++msgid "Any zone" ++msgstr "Qualquer zona" ++ ++msgid "Apply" ++msgstr "Aplicar" ++ ++msgid "Applying changes" ++msgstr "Aplicar as alterações" ++ ++msgid "" ++"Assign a part of given length of every public IPv6-prefix to this interface" ++msgstr "" ++ ++msgid "Assign interfaces..." ++msgstr "atribuir as interfaces" ++ ++msgid "" ++"Assign prefix parts using this hexadecimal subprefix ID for this interface." ++msgstr "" ++ ++msgid "Associated Stations" ++msgstr "Estações associadas" ++ ++msgid "Atheros 802.11%s Wireless Controller" ++msgstr "Controlador Wireless Atheros 802.11%s" ++ ++msgid "AuthGroup" ++msgstr "" ++ ++msgid "Authentication" ++msgstr "Autenticação" ++ ++msgid "Authoritative" ++msgstr "Autoritário" ++ ++msgid "Authorization Required" ++msgstr "Autorização Necessária" ++ ++msgid "Auto Refresh" ++msgstr "Atualização Automática" ++ ++msgid "Automatic" ++msgstr "" ++ ++msgid "Automatic Homenet (HNCP)" ++msgstr "" ++ ++msgid "Available" ++msgstr "Disponível" ++ ++msgid "Available packages" ++msgstr "Pacotes disponíveis" ++ ++msgid "Average:" ++msgstr "Média:" ++ ++msgid "BSSID" ++msgstr "BSSID" ++ ++msgid "Back" ++msgstr "Voltar" ++ ++msgid "Back to Overview" ++msgstr "Voltar para Visão Geral" ++ ++msgid "Back to configuration" ++msgstr "Voltar para configuração" ++ ++msgid "Back to overview" ++msgstr "Voltar para visão geral" ++ ++msgid "Back to scan results" ++msgstr "Voltar para os resultados da busca" ++ ++msgid "Background Scan" ++msgstr "Busca em Segundo Plano" ++ ++msgid "Backup / Flash Firmware" ++msgstr "Cópia de Segurança / Gravar Firmware" ++ ++msgid "Backup / Restore" ++msgstr "Cópia de Segurança / Restauração" ++ ++msgid "Backup file list" ++msgstr "Lista de arquivos para a cópia de segurança" ++ ++msgid "Bad address specified!" ++msgstr "Endereço especificado está incorreto!" ++ ++msgid "Band" ++msgstr "" ++ ++msgid "Behind NAT" ++msgstr "" ++ ++msgid "" ++"Below is the determined list of files to backup. It consists of changed " ++"configuration files marked by opkg, essential base files and the user " ++"defined backup patterns." ++msgstr "" ++"Abaixo estão os arquivos para a cópia de segurança. Ela consiste de arquivos " ++"de configuração alterados marcados pelo opkg, arquivos base essenciais e " ++"padrões para a cópia de segurança definidos pelo usuário." ++ ++msgid "Bitrate" ++msgstr "Taxa de bits" ++ ++msgid "Bogus NX Domain Override" ++msgstr "Substituir Domínio NX Falsos" ++ ++msgid "Bridge" ++msgstr "Ponte" ++ ++msgid "Bridge interfaces" ++msgstr "Juntar interfaces em uma ponte" ++ ++msgid "Bridge unit number" ++msgstr "Número da ponte" ++ ++msgid "Bring up on boot" ++msgstr "Levantar na iniciação" ++ ++msgid "Broadcom 802.11%s Wireless Controller" ++msgstr "Controlador Wireless Broadcom 802.11%s" ++ ++msgid "Broadcom BCM%04x 802.11 Wireless Controller" ++msgstr "Broadcom BCM%04x 802.11 Wireless Controlador" ++ ++msgid "Buffered" ++msgstr "Buffered" ++ ++msgid "Buttons" ++msgstr "Botões" ++ ++msgid "CA certificate; if empty it will be saved after the first connection." ++msgstr "" ++ ++msgid "CPU" ++msgstr "CPU" ++ ++msgid "CPU usage (%)" ++msgstr "Uso da CPU (%)" ++ ++msgid "Cancel" ++msgstr "Cancelar" ++ ++msgid "Category" ++msgstr "" ++ ++msgid "Chain" ++msgstr "Cadeia" ++ ++msgid "Changes" ++msgstr "Alterações" ++ ++msgid "Changes applied." ++msgstr "Alterações aplicadas." ++ ++msgid "Changes the administrator password for accessing the device" ++msgstr "Muda a senha do administrador para acessar este dispositivo" ++ ++msgid "Channel" ++msgstr "Canal" ++ ++msgid "Check" ++msgstr "Verificar" ++ ++msgid "Checksum" ++msgstr "Soma de verificação" ++ ++msgid "" ++"Choose the firewall zone you want to assign to this interface. Select " ++"unspecified to remove the interface from the associated zone or " ++"fill out the create field to define a new zone and attach the " ++"interface to it." ++msgstr "" ++"Escolha a zona do firewall que você quer definir para esta interface. " ++"Selecione não especificado -ou- criar para remover a interface da " ++"zona associada ou preencha o campo para criar uma nova zona associada a esta " ++"interface." ++ ++msgid "" ++"Choose the network(s) you want to attach to this wireless interface or fill " ++"out the create field to define a new network." ++msgstr "" ++"Escolha a rede (s) que deseja anexar a este interface wireless ou preencha o " ++" criar campo para definir uma nova rede." ++ ++msgid "Cipher" ++msgstr "Cifra" ++ ++msgid "" ++"Click \"Generate archive\" to download a tar archive of the current " ++"configuration files. To reset the firmware to its initial state, click " ++"\"Perform reset\" (only possible with squashfs images)." ++msgstr "" ++"Clique em \"Gerar arquivo\" para baixar um arquivo tar com os arquivos de " ++"configuração atuais. Para retornar o roteador para o seu estado inicial, " ++"clique em \"Zerar configuração\" (somente possível para imagens squashfs)." ++ ++msgid "Client" ++msgstr "Cliente" ++ ++msgid "Client ID to send when requesting DHCP" ++msgstr "" ++"Identificador do cliente enviando quando a requisição do DHCP é realizada" ++ ++msgid "" ++"Close inactive connection after the given amount of seconds, use 0 to " ++"persist connection" ++msgstr "" ++"Feche as conexões inativas após uma dada quantidade de segundos. Use 0 para " ++"manter as conexões." ++ ++msgid "Close list..." ++msgstr "Fechar a lista..." ++ ++msgid "Collecting data..." ++msgstr "Coletando dados..." ++ ++msgid "Command" ++msgstr "Comando" ++ ++msgid "Common Configuration" ++msgstr "Configuração Comum" ++ ++msgid "Compression" ++msgstr "Compressão" ++ ++msgid "Configuration" ++msgstr "Configuração" ++ ++msgid "Configuration applied." ++msgstr "Configuração aplicada." ++ ++msgid "Configuration files will be kept." ++msgstr "Os arquivos de configuração serão mantidos." ++ ++msgid "Confirmation" ++msgstr "Confirmação" ++ ++msgid "Connect" ++msgstr "Conectar" ++ ++msgid "Connected" ++msgstr "Conectado" ++ ++msgid "Connection Limit" ++msgstr "Limite de conexão" ++ ++msgid "Connection to server fails when TLS cannot be used" ++msgstr "" ++ ++msgid "Connections" ++msgstr "Conexões" ++ ++msgid "Country" ++msgstr "País" ++ ++msgid "Country Code" ++msgstr "Código do País" ++ ++msgid "Cover the following interface" ++msgstr "Utilizando a seguinte interface" ++ ++msgid "Cover the following interfaces" ++msgstr "Utilizando as seguintes interfaces" ++ ++msgid "Create / Assign firewall-zone" ++msgstr "Criar / Atribuir a uma zona de firewall" ++ ++msgid "Create Interface" ++msgstr "Criar Interface" ++ ++msgid "Create a bridge over multiple interfaces" ++msgstr "Criar uma ponte juntando múltiplas interfaces" ++ ++msgid "Critical" ++msgstr "Crítico" ++ ++msgid "Cron Log Level" ++msgstr "Nível de Registro da Cron" ++ ++msgid "Custom Interface" ++msgstr "Interface Personalizada" ++ ++msgid "Custom delegated IPv6-prefix" ++msgstr "" ++ ++msgid "" ++"Customizes the behaviour of the device LEDs if possible." ++msgstr "" ++"Se possível, personaliza o comportamento dos LEDs." ++ ++msgid "DHCP Leases" ++msgstr "Alocações do DHCP" ++ ++msgid "DHCP Server" ++msgstr "Servidor DHCP" ++ ++msgid "DHCP and DNS" ++msgstr "DHCP e DNS" ++ ++msgid "DHCP client" ++msgstr "Cliente DHCP" ++ ++msgid "DHCP-Options" ++msgstr "Opções de DHCP" ++ ++msgid "DHCPv6 Leases" ++msgstr "Alocações DHCPv6" ++ ++msgid "DHCPv6 client" ++msgstr "" ++ ++msgid "DHCPv6-Mode" ++msgstr "" ++ ++msgid "DHCPv6-Service" ++msgstr "" ++ ++msgid "DNS" ++msgstr "DNS" ++ ++msgid "DNS forwardings" ++msgstr "Encaminhamentos DNS" ++ ++msgid "DNS-Label / FQDN" ++msgstr "" ++ ++msgid "DS-Lite AFTR address" ++msgstr "" ++ ++msgid "DUID" ++msgstr "DUID" ++ ++msgid "Debug" ++msgstr "Depurar" ++ ++msgid "Default %d" ++msgstr "Padrão %d" ++ ++msgid "Default gateway" ++msgstr "Roteador Padrão" ++ ++msgid "Default route" ++msgstr "" ++ ++msgid "Default state" ++msgstr "Estado padrão" ++ ++msgid "Define a name for this network." ++msgstr "Define um nome para esta rede." ++ ++msgid "" ++"Define additional DHCP options, for example " ++"\"6,192.168.2.1,192.168.2.2\" which advertises different DNS " ++"servers to clients." ++msgstr "" ++"Define opções adicionais do DHCP. Por exemplo " ++"\"6,192.168.2.1,192.168.2.2\" que anuncia diferentes servidores " ++"DNS para os clientes." ++ ++msgid "Delete" ++msgstr "Apagar" ++ ++msgid "Delete this interface" ++msgstr "Apagar esta interface" ++ ++msgid "Delete this network" ++msgstr "Apagar esta rede" ++ ++msgid "Description" ++msgstr "Descrição" ++ ++msgid "Design" ++msgstr "Tema" ++ ++msgid "Destination" ++msgstr "Destino" ++ ++msgid "Device" ++msgstr "Dispositivo" ++ ++msgid "Device Configuration" ++msgstr "Configuração do Dispositivo" ++ ++msgid "Diagnostics" ++msgstr "Diagnóstico" ++ ++msgid "Dial number" ++msgstr "Número de discagem" ++ ++msgid "Directory" ++msgstr "Diretório" ++ ++msgid "Disable" ++msgstr "Desabilitar" ++ ++msgid "" ++"Disable DHCP for " ++"this interface." ++msgstr "" ++"Desabilita DHCP " ++"para esta interface." ++ ++msgid "Disable DNS setup" ++msgstr "Desabilita a configuração do DNS" ++ ++msgid "Disable HW-Beacon timer" ++msgstr "Desativar temporizador de Beacon de Hardware" ++ ++msgid "Disabled" ++msgstr "Desabilitado" ++ ++msgid "Discard upstream RFC1918 responses" ++msgstr "" ++"Descartar respostas de servidores externos para redes privadas (RFC1918)" ++ ++msgid "Displaying only packages containing" ++msgstr "Mostre somente os pacotes contendo" ++ ++msgid "Distance Optimization" ++msgstr "Otimização de Distância" ++ ++msgid "Distance to farthest network member in meters." ++msgstr "Distância para o computador mais distante da rede (em metros)." ++ ++msgid "Diversity" ++msgstr "Diversidade" ++ ++msgid "" ++"Dnsmasq is a combined DHCP-Server and DNS-" ++"Forwarder for NAT " ++"firewalls" ++msgstr "" ++"Dnsmasq é um servidor combinado de DHCP e DNS para firewalls NAT" ++ ++msgid "Do not cache negative replies, e.g. for not existing domains" ++msgstr "" ++"Não mantenha em cache para respostas negativas como, por exemplo, para os " ++"domínios inexistentes" ++ ++msgid "Do not forward requests that cannot be answered by public name servers" ++msgstr "" ++"Não encaminhe requisições que não podem ser respondidas por servidores de " ++"nomes públicos" ++ ++msgid "Do not forward reverse lookups for local networks" ++msgstr "Não encaminhe buscas por endereço reverso das redes local" ++ ++msgid "Do not send probe responses" ++msgstr "Não enviar respostas de exames" ++ ++msgid "Domain required" ++msgstr "Requerer domínio" ++ ++msgid "Domain whitelist" ++msgstr "Lista branca de domínios" ++ ++msgid "" ++"Don't forward DNS-Requests without " ++"DNS-Name" ++msgstr "" ++"Não encaminhar consultas DNS sem o nome completo do DNS" ++ ++msgid "Download and install package" ++msgstr "Baixe e instale o pacote" ++ ++msgid "Download backup" ++msgstr "Baixar a cópia de segurança" ++ ++msgid "Dropbear Instance" ++msgstr "Dropbear" ++ ++msgid "" ++"Dropbear offers SSH network shell access " ++"and an integrated SCP server" ++msgstr "" ++"Dropbear oferece um acesso shell seguro à rede (SSH) e um servidor SCP " ++"integrado" ++ ++msgid "Dual-Stack Lite (RFC6333)" ++msgstr "" ++ ++msgid "Dynamic DHCP" ++msgstr "" ++"DHCP " ++"Dinâmico" ++ ++msgid "Dynamic tunnel" ++msgstr "Túnel dinâmico" ++ ++msgid "" ++"Dynamically allocate DHCP addresses for clients. If disabled, only clients " ++"having static leases will be served." ++msgstr "" ++"Aloca dinamicamente os endereços do DHCP para os clientes. Se desabilitado, " ++"somente os clientes com atribuições estáticas serão servidos. " ++ ++msgid "EAP-Method" ++msgstr "Método EAP" ++ ++msgid "Edit" ++msgstr "Editar" ++ ++msgid "" ++"Edit the raw configuration data above to fix any error and hit \"Save\" to " ++"reload the page." ++msgstr "" ++ ++msgid "Edit this interface" ++msgstr "Editar esta interface" ++ ++msgid "Edit this network" ++msgstr "Editar esta rede" ++ ++msgid "Emergency" ++msgstr "Emergência" ++ ++msgid "Enable" ++msgstr "Ativar" ++ ++msgid "Enable STP" ++msgstr "Ativar STP" ++ ++msgid "Enable HE.net dynamic endpoint update" ++msgstr "Ativar a atualização de ponto final dinâmico HE.net" ++ ++msgid "Enable IPv6 negotiation on the PPP link" ++msgstr "Ativar a negociação de IPv6 no enlace PPP" ++ ++msgid "Enable Jumbo Frame passthrough" ++msgstr "Ativar o encaminhamento de quadros jumbos (Jumbo Frames)" ++ ++msgid "Enable NTP client" ++msgstr "Ativar o cliente NTP" ++ ++msgid "Enable TFTP server" ++msgstr "Ativar servidor TFTP" ++ ++msgid "Enable VLAN functionality" ++msgstr "Ativar funcionalidade de VLAN" ++ ++msgid "Enable WPS pushbutton, requires WPA(2)-PSK" ++msgstr "" ++ ++msgid "Enable learning and aging" ++msgstr "Ativar o aprendizado e obsolescência" ++ ++msgid "Enable mirroring of incoming packets" ++msgstr "" ++ ++msgid "Enable mirroring of outgoing packets" ++msgstr "" ++ ++msgid "Enable this mount" ++msgstr "Ativar esta montagem" ++ ++msgid "Enable this swap" ++msgstr "Ativar este espaço de troca (swap)" ++ ++msgid "Enable/Disable" ++msgstr "Ativar/Desativar" ++ ++msgid "Enabled" ++msgstr "Ativado" ++ ++msgid "Enables the Spanning Tree Protocol on this bridge" ++msgstr "Ativa o protocolo STP nesta ponte" ++ ++msgid "Encapsulation mode" ++msgstr "Modo de encapsulamento" ++ ++msgid "Encryption" ++msgstr "Cifragem" ++ ++msgid "Erasing..." ++msgstr "Apagando..." ++ ++msgid "Error" ++msgstr "Erro" ++ ++msgid "Ethernet Adapter" ++msgstr "Adaptador Ethernet" ++ ++msgid "Ethernet Switch" ++msgstr "Switch Ethernet" ++ ++msgid "Expand hosts" ++msgstr "Expandir arquivos de equipamentos conhecidos (hosts)" ++ ++msgid "Expires" ++msgstr "Expira" ++ ++#, fuzzy ++msgid "" ++"Expiry time of leased addresses, minimum is 2 minutes (2m)." ++msgstr "" ++"Tempo de expiração dos endereços atribuídos. Mínimo é 2 minutos (2m)." ++ ++msgid "External" ++msgstr "" ++ ++msgid "External system log server" ++msgstr "Servidor externo de registros do sistema (syslog)" ++ ++msgid "External system log server port" ++msgstr "Porta do servidor externo de registro do sistema (syslog)" ++ ++msgid "Fast Frames" ++msgstr "Quadros Rápidos" ++ ++msgid "File" ++msgstr "Arquivo" ++ ++msgid "Filename of the boot image advertised to clients" ++msgstr "Nome do arquivo da imagem de boot anunciada para os clientes" ++ ++msgid "Filesystem" ++msgstr "Sistema de Arquivos" ++ ++msgid "Filter" ++msgstr "Filtro" ++ ++msgid "Filter private" ++msgstr "Filtrar endereços privados" ++ ++msgid "Filter useless" ++msgstr "Filtrar consultas inúteis" ++ ++msgid "Find and join network" ++msgstr "Procurar e conectar à rede" ++ ++msgid "Find package" ++msgstr "Procurar pacote" ++ ++msgid "Finish" ++msgstr "Terminar" ++ ++msgid "Firewall" ++msgstr "Firewall" ++ ++msgid "Firewall Settings" ++msgstr "Configurações do Firewall" ++ ++msgid "Firewall Status" ++msgstr "Estado do Firewall" ++ ++msgid "Firmware Version" ++msgstr "Versão do Firmware" ++ ++msgid "Fixed source port for outbound DNS queries" ++msgstr "Porta de origem fixa para saída de consultas DNS" ++ ++msgid "Flags" ++msgstr "Marcadores" ++ ++msgid "Flash Firmware" ++msgstr "Gravar Firmware" ++ ++msgid "Flash image..." ++msgstr "Gravar imagem..." ++ ++msgid "Flash new firmware image" ++msgstr "Gravar nova imagem do firmware" ++ ++msgid "Flash operations" ++msgstr "Operações na memória flash" ++ ++msgid "Flashing..." ++msgstr "Gravando na flash..." ++ ++msgid "Force" ++msgstr "Forçar" ++ ++msgid "Force CCMP (AES)" ++msgstr "Forçar CCMP (AES)" ++ ++msgid "Force DHCP on this network even if another server is detected." ++msgstr "Forçar o DHCP nesta rede mesmo se outro servidor for detectado." ++ ++msgid "Force TKIP" ++msgstr "Forçar TKIP" ++ ++msgid "Force TKIP and CCMP (AES)" ++msgstr "Forçar TKIP e CCMP (AES)" ++ ++msgid "Forward DHCP traffic" ++msgstr "Encaminhar tráfego DHCP" ++ ++msgid "Forward broadcast traffic" ++msgstr "Encaminhar tráfego broadcast" ++ ++msgid "Forwarding mode" ++msgstr "Modo de encaminhamento" ++ ++msgid "Fragmentation Threshold" ++msgstr "Limiar de Fragmentação" ++ ++msgid "Frame Bursting" ++msgstr "Explosão de Quadros (Frame Bursting)" ++ ++msgid "Free" ++msgstr "Livre" ++ ++msgid "Free space" ++msgstr "Espaço livre" ++ ++msgid "GHz" ++msgstr "GHz" ++ ++msgid "GPRS only" ++msgstr "Somente GPRS" ++ ++msgid "Gateway" ++msgstr "Roteador" ++ ++msgid "Gateway ports" ++msgstr "Acesso remoto a portas encaminhadas" ++ ++msgid "General Settings" ++msgstr "Configurações Gerais" ++ ++msgid "General Setup" ++msgstr "Configurações Gerais" ++ ++msgid "Generate archive" ++msgstr "Gerar arquivo" ++ ++msgid "Generic 802.11%s Wireless Controller" ++msgstr "Generico 802.11%s Wireless Controlador" ++ ++msgid "Given password confirmation did not match, password not changed!" ++msgstr "A senha de confirmação informada não casa. Senha não alterada!" ++ ++msgid "Global network options" ++msgstr "" ++ ++msgid "Go to password configuration..." ++msgstr "Ir para a configuração de senha..." ++ ++msgid "Go to relevant configuration page" ++msgstr "Ir para a página de configuração pertinente" ++ ++msgid "Guest" ++msgstr "" ++ ++msgid "HE.net password" ++msgstr "Senha HE.net" ++ ++msgid "HE.net username" ++msgstr "" ++ ++# Não sei que contexto isto está sendo usado ++msgid "Handler" ++msgstr "Responsável" ++ ++msgid "Hang Up" ++msgstr "Suspender" ++ ++msgid "Heartbeat" ++msgstr "" ++ ++msgid "" ++"Here you can configure the basic aspects of your device like its hostname or " ++"the timezone." ++msgstr "" ++"Aqui você pode configurar os aspectos básicos do seu equipamento, como o " ++"nome do equipamento ou o fuso horário." ++ ++msgid "" ++"Here you can paste public SSH-Keys (one per line) for SSH public-key " ++"authentication." ++msgstr "" ++"Aqui você pode colar as chaves públicas do SSH (uma por linha) para a " ++"autenticação por chaves do SSH." ++ ++msgid "Hermes 802.11b Wireless Controller" ++msgstr "Hermes 802.11b Wireless Controlador" ++ ++msgid "Hide ESSID" ++msgstr "" ++"Ocultar ESSID" ++ ++msgid "Host entries" ++msgstr "Entradas de Equipamentos" ++ ++msgid "Host expiry timeout" ++msgstr "Tempo limite de expiração de equipamento" ++ ++msgid "Host-IP or Network" ++msgstr "" ++"IP do Equipamento " ++"ou Rede" ++ ++msgid "Hostname" ++msgstr "Nome do equipamento" ++ ++msgid "Hostname to send when requesting DHCP" ++msgstr "Nome do equipamento enviado quando requisitar DHCP" ++ ++msgid "Hostnames" ++msgstr "Nome dos equipamentos" ++ ++msgid "Hybrid" ++msgstr "" ++ ++msgid "IP address" ++msgstr "Endereço IP" ++ ++msgid "IPv4" ++msgstr "IPv4" ++ ++msgid "IPv4 Firewall" ++msgstr "Firewall para IPv4" ++ ++msgid "IPv4 WAN Status" ++msgstr "Estado IPv4 da WAN" ++ ++msgid "IPv4 address" ++msgstr "Endereço IPv4" ++ ++msgid "IPv4 and IPv6" ++msgstr "IPv4 e IPv6" ++ ++msgid "IPv4 assignment length" ++msgstr "" ++ ++msgid "IPv4 broadcast" ++msgstr "Broadcast IPv4" ++ ++msgid "IPv4 gateway" ++msgstr "Roteador padrão IPv4" ++ ++msgid "IPv4 netmask" ++msgstr "Máscara de rede IPv4" ++ ++msgid "IPv4 only" ++msgstr "Somente IPv4" ++ ++msgid "IPv4 prefix length" ++msgstr "Tamanho do prefixo IPv4" ++ ++msgid "IPv4-Address" ++msgstr "Endereço IPv4" ++ ++msgid "IPv6" ++msgstr "IPv6" ++ ++msgid "IPv6 Firewall" ++msgstr "Firewall para IPv6" ++ ++msgid "IPv6 Neighbours" ++msgstr "" ++ ++msgid "IPv6 Settings" ++msgstr "" ++ ++msgid "IPv6 ULA-Prefix" ++msgstr "" ++ ++msgid "IPv6 WAN Status" ++msgstr "Estado IPv6 da WAN" ++ ++msgid "IPv6 address" ++msgstr "Endereço IPv6" ++ ++msgid "IPv6 address delegated to the local tunnel endpoint (optional)" ++msgstr "" ++ ++msgid "IPv6 assignment hint" ++msgstr "" ++ ++msgid "IPv6 assignment length" ++msgstr "" ++ ++msgid "IPv6 gateway" ++msgstr "Roteador padrão do IPv6" ++ ++msgid "IPv6 only" ++msgstr "Somente IPv6" ++ ++msgid "IPv6 prefix" ++msgstr "Prefixo IPv6" ++ ++msgid "IPv6 prefix length" ++msgstr "Tamanho Prefixo IPv6" ++ ++msgid "IPv6 routed prefix" ++msgstr "" ++ ++msgid "IPv6-Address" ++msgstr "Endereço IPv6" ++ ++msgid "IPv6-in-IPv4 (RFC4213)" ++msgstr "IPv6-in-IPv4 (RFC4213)" ++ ++msgid "IPv6-over-IPv4 (6rd)" ++msgstr "IPv6-sobre-IPv4 (6rd)" ++ ++msgid "IPv6-over-IPv4 (6to4)" ++msgstr "IPv6-sobre-IPv4 (6to4)" ++ ++msgid "Identity" ++msgstr "Identidade PEAP" ++ ++msgid "" ++"If specified, mount the device by its UUID instead of a fixed device node" ++msgstr "" ++"Se especificado, monta o dispositivo pelo seu UUID ao invés de um nó de " ++"dispositivo fixo" ++ ++msgid "" ++"If specified, mount the device by the partition label instead of a fixed " ++"device node" ++msgstr "" ++"Se especificado, monta o dispositivo pela etiqueta da partiçãoo ao invés de " ++"um nó de dispositivo fixo" ++ ++msgid "If unchecked, no default route is configured" ++msgstr "Se desmarcado, nenhuma rota padrão será configurada" ++ ++msgid "If unchecked, the advertised DNS server addresses are ignored" ++msgstr "" ++"Se desmarcado, os endereços dos servidores DNS anunciados serão ignorados" ++ ++msgid "" ++"If your physical memory is insufficient unused data can be temporarily " ++"swapped to a swap-device resulting in a higher amount of usable RAM. Be aware that swapping data is a very " ++"slow process as the swap-device cannot be accessed with the high datarates " ++"of the RAM." ++msgstr "" ++"Se a sua memória física for insuficiente, os dados não utilizados poderão " ++"ser armazenados temporariamente em um dispositivo swap, resultando em uma " ++"maior quantidade de memória RAM utilizável. Esteja ciente de que a troca de dados (swap) é um processo " ++"muito lento, uma vez que o dispositivo swap não pode ser acessado com taxas " ++"de transferência tão altas com a memória RAM." ++ ++msgid "Ignore Hosts files" ++msgstr "Ignorar arquivos de equipamentos conhecidos (hosts)" ++ ++msgid "Ignore interface" ++msgstr "Ignorar interface" ++ ++msgid "Ignore resolve file" ++msgstr "Ignorar arquivo de resolução de nomes (resolv.conf)" ++ ++msgid "Image" ++msgstr "Imagem" ++ ++msgid "In" ++msgstr "Entrada" ++ ++msgid "Inactivity timeout" ++msgstr "Tempo limite de inatividade" ++ ++msgid "Inbound:" ++msgstr "Entrando:" ++ ++msgid "Info" ++msgstr "Informação" ++ ++msgid "Initscript" ++msgstr "Script de iniciação" ++ ++msgid "Initscripts" ++msgstr "Scripts de iniciação" ++ ++msgid "Install" ++msgstr "Instalar" ++ ++msgid "Install iputils-traceroute6 for IPv6 traceroute" ++msgstr "" ++ ++msgid "Install package %q" ++msgstr "Instalar pacote %q" ++ ++msgid "Install protocol extensions..." ++msgstr "Instalar extensões de protocolo..." ++ ++msgid "Installed packages" ++msgstr "Pacotes instalados" ++ ++msgid "Interface" ++msgstr "Interface" ++ ++msgid "Interface Configuration" ++msgstr "Configuração da Interface" ++ ++msgid "Interface Overview" ++msgstr "Visão Geral da Interface" ++ ++msgid "Interface is reconnecting..." ++msgstr "A interface está reconectando..." ++ ++msgid "Interface is shutting down..." ++msgstr "A interface está desligando..." ++ ++msgid "Interface not present or not connected yet." ++msgstr "A interface não está presente ou não está conectada ainda." ++ ++msgid "Interface reconnected" ++msgstr "Interface reconectada" ++ ++msgid "Interface shut down" ++msgstr "Interface desligada" ++ ++msgid "Interfaces" ++msgstr "Interfaces" ++ ++msgid "Internal" ++msgstr "" ++ ++msgid "Internal Server Error" ++msgstr "erro no servidor interno" ++ ++msgid "Invalid" ++msgstr "Valor inválido" ++ ++msgid "Invalid VLAN ID given! Only IDs between %d and %d are allowed." ++msgstr "" ++"O valor informado do ID da VLAN é inválido! Somente valores entre %d e %d " ++"são permitidos." ++ ++msgid "Invalid VLAN ID given! Only unique IDs are allowed" ++msgstr "" ++"O valor informado do ID da VLAN é inválido! Somente valores únicos são " ++"permitidos." ++ ++msgid "Invalid username and/or password! Please try again." ++msgstr "Usuário e/ou senha inválida! Por favor, tente novamente." ++ ++#, fuzzy ++msgid "" ++"It appears that you are trying to flash an image that does not fit into the " ++"flash memory, please verify the image file!" ++msgstr "" ++"A imagem que está a tentar carregar aparenta nao caber na flash do " ++"equipamento. Por favor verifique o arquivo da imagem!" ++ ++msgid "Java Script required!" ++msgstr "É necessário Java Script!" ++ ++msgid "Join Network" ++msgstr "Conectar à Rede" ++ ++msgid "Join Network: Settings" ++msgstr "Conectar à Rede: Configurações" ++ ++msgid "Join Network: Wireless Scan" ++msgstr "Conectar à Rede: Busca por Rede Sem Fio" ++ ++msgid "Keep settings" ++msgstr "Manter configurações" ++ ++msgid "Kernel Log" ++msgstr "Registo do Kernel" ++ ++msgid "Kernel Version" ++msgstr "Versão do Kernel" ++ ++msgid "Key" ++msgstr "Chave" ++ ++msgid "Key #%d" ++msgstr "Chave #%d" ++ ++msgid "Kill" ++msgstr "Matar" ++ ++msgid "L2TP" ++msgstr "L2TP" ++ ++msgid "L2TP Server" ++msgstr "Servidor L2TP" ++ ++msgid "LCP echo failure threshold" ++msgstr "Limite de falha no eco do LCP" ++ ++msgid "LCP echo interval" ++msgstr "Intervalo do eco do LCP" ++ ++msgid "LLC" ++msgstr "LLC" ++ ++msgid "Label" ++msgstr "Etiqueta" ++ ++msgid "Language" ++msgstr "Idioma" ++ ++msgid "Language and Style" ++msgstr "Idioma e Estilo" ++ ++msgid "Leaf" ++msgstr "" ++ ++msgid "Lease validity time" ++msgstr "Tempo de validade da atribuição" ++ ++msgid "Leasefile" ++msgstr "Arquivo de atribuições" ++ ++msgid "Leasetime" ++msgstr "Tempo de atribuição do DHCP" ++ ++msgid "Leasetime remaining" ++msgstr "Tempo restante da atribuição" ++ ++msgid "Leave empty to autodetect" ++msgstr "Deixe vazio para detectar automaticamente" ++ ++msgid "Leave empty to use the current WAN address" ++msgstr "Deixe vazio para usar o endereço WAN atual" ++ ++msgid "Legend:" ++msgstr "Legenda:" ++ ++msgid "Limit" ++msgstr "Limite" ++ ++msgid "Line Attenuation" ++msgstr "" ++ ++msgid "Line Speed" ++msgstr "" ++ ++msgid "Line State" ++msgstr "" ++ ++msgid "Link On" ++msgstr "Enlace Ativo" ++ ++msgid "" ++"List of DNS servers to forward " ++"requests to" ++msgstr "" ++"Lista dos servidores DNS para " ++"encaminhar as requisições" ++ ++msgid "List of domains to allow RFC1918 responses for" ++msgstr "" ++"Lista dos domínios para os quais será permitido respostas apontando para " ++"redes privadas (RFC1918)" ++ ++msgid "List of hosts that supply bogus NX domain results" ++msgstr "" ++"Lista de servidores DNS que " ++"fornecem resultados errados para consultas a domínios inexistentes (NX)" ++ ++msgid "Listen only on the given interface or, if unspecified, on all" ++msgstr "" ++"Escuta apenas na interface especificada. Se não especificado, escuta em todas" ++ ++msgid "Listening port for inbound DNS queries" ++msgstr "Porta de escuta para a entrada das consultas DNS" ++ ++msgid "Load" ++msgstr "Carga" ++ ++msgid "Load Average" ++msgstr "Carga Média" ++ ++msgid "Loading" ++msgstr "Carregando" ++ ++msgid "Local IPv4 address" ++msgstr "Endereço IPv4 local" ++ ++msgid "Local IPv6 address" ++msgstr "Endereço IPv6 local" ++ ++msgid "Local Startup" ++msgstr "Iniciação Local" ++ ++msgid "Local Time" ++msgstr "Hora Local" ++ ++msgid "Local domain" ++msgstr "Domínio Local" ++ ++#, fuzzy ++msgid "" ++"Local domain specification. Names matching this domain are never forwarded " ++"and are resolved from DHCP or hosts files only" ++msgstr "" ++"Especificação do domínio local. Nomes que casam com este domínio nunca serão " ++"encaminhados e são resolvidos somente pelo DHCP ou pelo arquivos de " ++"equipamentos conhecidos (hosts)" ++ ++msgid "Local domain suffix appended to DHCP names and hosts file entries" ++msgstr "" ++"Sufixo do domínio local adicionado aos nomes no DHCP e nas entradas dos " ++"arquivo de equipamentos conhecidos (hosts)" ++ ++msgid "Local server" ++msgstr "Servidor local" ++ ++msgid "" ++"Localise hostname depending on the requesting subnet if multiple IPs are " ++"available" ++msgstr "" ++"Localizar o nome do equipamento dependendo da subrede requisitante se " ++"mútliplos endereços IPs estiverem disponíveis" ++ ++msgid "Localise queries" ++msgstr "Localizar consultas" ++ ++msgid "Locked to channel %d used by: %s" ++msgstr "" ++ ++msgid "Log output level" ++msgstr "Nível de detalhamento de saída dos registros" ++ ++msgid "Log queries" ++msgstr "Registar as consultas" ++ ++msgid "Logging" ++msgstr "Registrando os eventos" ++ ++msgid "Login" ++msgstr "Entrar" ++ ++msgid "Logout" ++msgstr "Sair" ++ ++msgid "Lowest leased address as offset from the network address." ++msgstr "O endereço mais baixo concedido como deslocamento do endereço da rede." ++ ++msgid "MAC-Address" ++msgstr "Endereço MAC" ++ ++msgid "MAC-Address Filter" ++msgstr "Filtro de Endereço MAC" ++ ++msgid "MAC-Filter" ++msgstr "Filtro de MAC" ++ ++msgid "MAC-List" ++msgstr "Lista de MAC" ++ ++msgid "MB/s" ++msgstr "MB/s" ++ ++msgid "MHz" ++msgstr "MHz" ++ ++msgid "MTU" ++msgstr "" ++"MTU" ++ ++msgid "" ++"Make sure to clone the root filesystem using something like the commands " ++"below:" ++msgstr "" ++ ++msgid "Maximum Rate" ++msgstr "Taxa Máxima" ++ ++msgid "Maximum allowed number of active DHCP leases" ++msgstr "Número máximo permitido de alocações DHCP ativas" ++ ++msgid "Maximum allowed number of concurrent DNS queries" ++msgstr "Número máximo permitido de consultas DNS concorrentes" ++ ++msgid "Maximum allowed size of EDNS.0 UDP packets" ++msgstr "Tamanho máximo permitido dos pacotes UDP EDNS.0" ++ ++msgid "Maximum amount of seconds to wait for the modem to become ready" ++msgstr "Tempo máximo, em segundos, para esperar que o modem fique pronto" ++ ++# Desconheço o uso ++msgid "Maximum hold time" ++msgstr "Tempo máximo de espera" ++ ++msgid "Maximum number of leased addresses." ++msgstr "Número máximo de endereços atribuídos." ++ ++msgid "Mbit/s" ++msgstr "Mbit/s" ++ ++msgid "Memory" ++msgstr "Memória" ++ ++msgid "Memory usage (%)" ++msgstr "Uso da memória (%)" ++ ++msgid "Metric" ++msgstr "Métrica" ++ ++msgid "Minimum Rate" ++msgstr "Taxa Mínima" ++ ++msgid "Minimum hold time" ++msgstr "Tempo mínimo de espera" ++ ++msgid "Mirror monitor port" ++msgstr "" ++ ++msgid "Mirror source port" ++msgstr "" ++ ++msgid "Missing protocol extension for proto %q" ++msgstr "Extensão para o protocolo %q está ausente" ++ ++msgid "Mode" ++msgstr "Modo" ++ ++msgid "Model" ++msgstr "" ++ ++msgid "Modem device" ++msgstr "Dispositivo do Modem" ++ ++msgid "Modem init timeout" ++msgstr "Estouro de tempo da iniciação do modem" ++ ++msgid "Monitor" ++msgstr "Monitor" ++ ++msgid "Mount Entry" ++msgstr "Entrada de Montagem" ++ ++msgid "Mount Point" ++msgstr "Ponto de Montagem" ++ ++msgid "Mount Points" ++msgstr "Pontos de Montagem" ++ ++msgid "Mount Points - Mount Entry" ++msgstr "Pontos de Montagem - Entrada de Montagem" ++ ++msgid "Mount Points - Swap Entry" ++msgstr "Pontos de Montagem - Entrada da Swap" ++ ++msgid "" ++"Mount Points define at which point a memory device will be attached to the " ++"filesystem" ++msgstr "" ++"Pontos de montagem definem em que ponto um dispositivo de armazenamento será " ++"anexado ao sistema de arquivos" ++ ++msgid "Mount options" ++msgstr "Opções de montagem" ++ ++msgid "Mount point" ++msgstr "Ponto de montagem" ++ ++msgid "Mounted file systems" ++msgstr "Sistemas de arquivos montados" ++ ++msgid "Move down" ++msgstr "Mover para baixo" ++ ++msgid "Move up" ++msgstr "Mover para cima" ++ ++msgid "Multicast Rate" ++msgstr "Taxa de Multicast" ++ ++msgid "Multicast address" ++msgstr "Endereço de Multicast" ++ ++msgid "NAS ID" ++msgstr "NAS ID" ++ ++msgid "NDP-Proxy" ++msgstr "" ++ ++msgid "NTP server candidates" ++msgstr "Candidatos a servidor NTP" ++ ++msgid "NTP sync time-out" ++msgstr "" ++ ++msgid "Name" ++msgstr "Nome" ++ ++msgid "Name of the new interface" ++msgstr "Nome da nova interface" ++ ++msgid "Name of the new network" ++msgstr "Nome da nova rede" ++ ++msgid "Navigation" ++msgstr "Navegação" ++ ++msgid "Netmask" ++msgstr "Máscara de rede" ++ ++msgid "Network" ++msgstr "Rede" ++ ++msgid "Network Utilities" ++msgstr "Utilitários de Rede" ++ ++msgid "Network boot image" ++msgstr "Imagem de boot pela rede" ++ ++msgid "Network without interfaces." ++msgstr "Rede sem interfaces." ++ ++msgid "Next »" ++msgstr "Próximo »" ++ ++msgid "No DHCP Server configured for this interface" ++msgstr "Nenhum Servidor DHCP configurado para esta interface" ++ ++msgid "No chains in this table" ++msgstr "Nenhuma cadeira nesta tabela" ++ ++msgid "No files found" ++msgstr "Nenhum arquivo encontrado" ++ ++msgid "No information available" ++msgstr "Nenhuma informação disponível" ++ ++msgid "No negative cache" ++msgstr "Nenhum cache negativo" ++ ++msgid "No network configured on this device" ++msgstr "Nenhuma rede configurada neste dispositivo" ++ ++msgid "No network name specified" ++msgstr "Nenhum nome de rede foi especificado" ++ ++msgid "No package lists available" ++msgstr "Nenhuma lista de pacotes disponível" ++ ++msgid "No password set!" ++msgstr "Nenhuma senha definida!" ++ ++msgid "No rules in this chain" ++msgstr "Sem regras nesta cadeia" ++ ++msgid "No zone assigned" ++msgstr "Nenhuma zona definida" ++ ++msgid "Noise" ++msgstr "Ruído" ++ ++msgid "Noise Margin" ++msgstr "" ++ ++msgid "Noise:" ++msgstr "Ruído:" ++ ++msgid "None" ++msgstr "Nenhum" ++ ++msgid "Normal" ++msgstr "Normal" ++ ++msgid "Not Found" ++msgstr "Não Encontrado" ++ ++msgid "Not associated" ++msgstr "Não conectado" ++ ++msgid "Not connected" ++msgstr "Não conectado" ++ ++msgid "Note: Configuration files will be erased." ++msgstr "Nota: Os arquivos de configuração serão apagados." ++ ++msgid "Notice" ++msgstr "Aviso" ++ ++msgid "Nslookup" ++msgstr "Nslookup" ++ ++msgid "OK" ++msgstr "OK" ++ ++msgid "OPKG-Configuration" ++msgstr "Configuração-OPKG" ++ ++msgid "Off-State Delay" ++msgstr "Atraso no estado de desligado" ++ ++msgid "" ++"On this page you can configure the network interfaces. You can bridge " ++"several interfaces by ticking the \"bridge interfaces\" field and enter the " ++"names of several network interfaces separated by spaces. You can also use " ++"VLAN notation " ++"INTERFACE.VLANNR (e.g.: " ++"eth0.1)." ++msgstr "" ++"Nesta página pode configurar as interfaces de rede. Esta interface pode " ++"formar uma ponte juntando várias interfaces. Para isto, marque o campo " ++"\"Juntar interfaces em uma ponte\" e informar as várias interfaces de rede. " ++"Pode também usar a notação para VLAN INTERFACE.VLANNR (ex.: " ++"eth0.1)." ++ ++msgid "On-State Delay" ++msgstr "Atraso no estado de conexões" ++ ++msgid "One of hostname or mac address must be specified!" ++msgstr "" ++"É necessário especificar ao menos um nome de equipamento ou endereço MAC!" ++ ++msgid "One or more fields contain invalid values!" ++msgstr "Um ou mais campos contém valores inválidos!" ++ ++msgid "One or more required fields have no value!" ++msgstr "Um ou mais campos obrigatórios não tem valor!" ++ ++msgid "Open list..." ++msgstr "Abrir lista..." ++ ++msgid "OpenConnect (CISCO AnyConnect)" ++msgstr "" ++ ++msgid "Operating frequency" ++msgstr "" ++ ++msgid "Option changed" ++msgstr "Opção alterada" ++ ++msgid "Option removed" ++msgstr "Opção removida" ++ ++msgid "Optional, specify to override default server (tic.sixxs.net)" ++msgstr "" ++ ++msgid "Optional, use when the SIXXS account has more than one tunnel" ++msgstr "" ++ ++msgid "Options" ++msgstr "Opções" ++ ++msgid "Other:" ++msgstr "Outro:" ++ ++msgid "Out" ++msgstr "Saída" ++ ++msgid "Outbound:" ++msgstr "Saindo:" ++ ++msgid "Outdoor Channels" ++msgstr "Canais para externo" ++ ++msgid "Output Interface" ++msgstr "" ++ ++msgid "Override MAC address" ++msgstr "Sobrescrever o endereço MAC" ++ ++msgid "Override MTU" ++msgstr "Sobrescrever o MTU" ++ ++msgid "Override the gateway in DHCP responses" ++msgstr "Sobrescrever o roteador padrão nas respostas do DHCP" ++ ++msgid "" ++"Override the netmask sent to clients. Normally it is calculated from the " ++"subnet that is served." ++msgstr "" ++"Sobrescrever a máscara de rede enviada aos clientes. Normalmente, ela é " ++"calculada a partir da máscara da subrede de onde o cliente solicitou o " ++"endereço." ++ ++msgid "Override the table used for internal routes" ++msgstr "Sobrescrever a tabela usada para as rotas internas" ++ ++msgid "Overview" ++msgstr "Visão geral" ++ ++msgid "Owner" ++msgstr "Dono" ++ ++msgid "PAP/CHAP password" ++msgstr "Senha do PAP/CHAP" ++ ++msgid "PAP/CHAP username" ++msgstr "Usuário do PAP/CHAP" ++ ++msgid "PID" ++msgstr "PID" ++ ++msgid "PIN" ++msgstr "PIN" ++ ++msgid "PPP" ++msgstr "PPP" ++ ++msgid "PPPoA Encapsulation" ++msgstr "Encapsulamento PPPoA " ++ ++msgid "PPPoATM" ++msgstr "PPPoATM" ++ ++msgid "PPPoE" ++msgstr "PPPoE" ++ ++msgid "PPtP" ++msgstr "PPtP" ++ ++msgid "Package libiwinfo required!" ++msgstr "O pacote libiwinfo é necessário!" ++ ++msgid "Package lists are older than 24 hours" ++msgstr "As listas de pacotes são mais antigas do que 24 horas" ++ ++msgid "Package name" ++msgstr "Nome do Pacote" ++ ++msgid "Packets" ++msgstr "Pacotes" ++ ++msgid "Part of zone %q" ++msgstr "Parte da zona %q" ++ ++msgid "Password" ++msgstr "Senha" ++ ++msgid "Password authentication" ++msgstr "Autenticação por senha" ++ ++msgid "Password of Private Key" ++msgstr "Senha da Chave Privada" ++ ++msgid "Password successfully changed!" ++msgstr "A senha foi alterada com sucesso!" ++ ++msgid "Path" ++msgstr "Directório" ++ ++msgid "Path to CA-Certificate" ++msgstr "Caminho para o Certificado da AC" ++ ++msgid "Path to Client-Certificate" ++msgstr "Caminho para o Certificado do Cliente" ++ ++msgid "Path to Private Key" ++msgstr "Caminho para a Chave Privada" ++ ++msgid "Path to executable which handles the button event" ++msgstr "Caminho para o executável que trata o evento do botão" ++ ++msgid "Peak:" ++msgstr "Pico:" ++ ++msgid "Perform reboot" ++msgstr "Reiniciar o sistema" ++ ++msgid "Perform reset" ++msgstr "Zerar configuração" ++ ++msgid "Phy Rate:" ++msgstr "Taxa física:" ++ ++msgid "Physical Settings" ++msgstr "Configurações Físicas" ++ ++msgid "Ping" ++msgstr "Ping" ++ ++msgid "Pkts." ++msgstr "Pcts." ++ ++msgid "Please enter your username and password." ++msgstr "Entre com o seu usuário e senha." ++ ++msgid "Please wait: Device rebooting..." ++msgstr "Por favor aguarde: Equipamento reiniciando..." ++ ++msgid "Policy" ++msgstr "Política" ++ ++msgid "Port" ++msgstr "Porta" ++ ++msgid "Port %d" ++msgstr "Porta %d" ++ ++msgid "Port %d is untagged in multiple VLANs!" ++msgstr "Porta %d está sem etiqueta para mútliplas VLANs!" ++ ++msgid "Port status:" ++msgstr "Status da porta" ++ ++msgid "" ++"Presume peer to be dead after given amount of LCP echo failures, use 0 to " ++"ignore failures" ++msgstr "" ++"Assumir que o parceiro está morto depois de uma data quantidade de falhas de " ++"echo do LCP. Use 0 para ignorar as falhas" ++ ++msgid "Prevents client-to-client communication" ++msgstr "Impede a comunicação de cliente para cliente" ++ ++msgid "Prism2/2.5/3 802.11b Wireless Controller" ++msgstr "Prism2/2.5/3 802.11b Wireless Controlador" ++ ++msgid "Proceed" ++msgstr "Proceder" ++ ++msgid "Processes" ++msgstr "Processos" ++ ++msgid "Prot." ++msgstr "Protocolo" ++ ++msgid "Protocol" ++msgstr "Protocolo" ++ ++msgid "Protocol family" ++msgstr "Família do protocolo" ++ ++msgid "Protocol of the new interface" ++msgstr "Protocolo para a nova interface" ++ ++msgid "Protocol support is not installed" ++msgstr "O suporte ao protocolo não está instalado" ++ ++msgid "Provide NTP server" ++msgstr "Fornecer serviço NTP" ++ ++msgid "Provide new network" ++msgstr "Prover nova rede" ++ ++msgid "Pseudo Ad-Hoc (ahdemo)" ++msgstr "Ad-Hoc falso (ahdemo)" ++ ++msgid "Public prefix routed to this device for distribution to clients." ++msgstr "" ++ ++msgid "Quality" ++msgstr "Qualidade" ++ ++msgid "RTS/CTS Threshold" ++msgstr "Limiar RTS/CTS" ++ ++msgid "RX" ++msgstr "RX" ++ ++msgid "RX Rate" ++msgstr "Taxa de RX" ++ ++msgid "RaLink 802.11%s Wireless Controller" ++msgstr "RaLink 802.11%s Wireless Controlador" ++ ++msgid "Radius-Accounting-Port" ++msgstr "Porta de contabilidade do RADIUS" ++ ++msgid "Radius-Accounting-Secret" ++msgstr "Segredo da contabilidade do RADIUS" ++ ++msgid "Radius-Accounting-Server" ++msgstr "Servidor da contabilidade do RADIUS" ++ ++msgid "Radius-Authentication-Port" ++msgstr "Porta de autenticação do RADIUS" ++ ++msgid "Radius-Authentication-Secret" ++msgstr "Segredo da autenticação do RADIUS" ++ ++msgid "Radius-Authentication-Server" ++msgstr "Servidor da autenticação do RADIUS" ++ ++msgid "" ++"Read /etc/ethers to configure the DHCP-Server" ++msgstr "" ++"Ler /etc/ethers para configurar o Servidor-DHCP" ++ ++msgid "" ++"Really delete this interface? The deletion cannot be undone!\\nYou might " ++"lose access to this device if you are connected via this interface." ++msgstr "" ++"Realmente excluir esta interface? A exclusão não pode ser desfeita!\n" ++" Você poderá perder o acesso a este dispositivo se você estiver conectado " ++"através desta interface." ++ ++msgid "" ++"Really delete this wireless network? The deletion cannot be undone!\\nYou " ++"might lose access to this device if you are connected via this network." ++msgstr "" ++"Realmente excluir esta interface Wireless? A exclusão não pode ser " ++"desfeita!\n" ++"Você poderá perder o acesso a este dispositivo se você estiver conectado " ++"através desta interface." ++ ++msgid "Really reset all changes?" ++msgstr "Realmente limpar todas as mudanças?" ++ ++#, fuzzy ++msgid "" ++"Really shut down network?\\nYou might lose access to this device if you are " ++"connected via this interface." ++msgstr "" ++"Realmente desligar esta rede\"%s\" ?\n" ++"Você poderá perder o acesso a este dispositivo se você estiver conectado " ++"através desta interface." ++ ++msgid "" ++"Really shutdown interface \"%s\" ?\\nYou might lose access to this device if " ++"you are connected via this interface." ++msgstr "" ++"Realmente desligar esta interface\"%s\" ?\n" ++"Você poderá perder o acesso a este dispositivo se você estiver conectado " ++"através desta interface." ++ ++msgid "Really switch protocol?" ++msgstr "Realmente trocar o protocolo?" ++ ++msgid "Realtime Connections" ++msgstr "Conexões em Tempo Real" ++ ++msgid "Realtime Graphs" ++msgstr "Gráficos em Tempo Real" ++ ++msgid "Realtime Load" ++msgstr "Carga em Tempo Real" ++ ++msgid "Realtime Traffic" ++msgstr "Tráfego em Tempo Real" ++ ++msgid "Realtime Wireless" ++msgstr "Rede sem fio em Tempo Real" ++ ++msgid "Rebind protection" ++msgstr "Proteção contra \"Rebind\"" ++ ++msgid "Reboot" ++msgstr "Reiniciar" ++ ++msgid "Rebooting..." ++msgstr "Reiniciando..." ++ ++msgid "Reboots the operating system of your device" ++msgstr "Reinicia o sistema operacional do seu dispositivo" ++ ++msgid "Receive" ++msgstr "Receber" ++ ++msgid "Receiver Antenna" ++msgstr "Antena de Recepção" ++ ++msgid "Reconnect this interface" ++msgstr "Reconectar esta interface" ++ ++msgid "Reconnecting interface" ++msgstr "Reconectando interface" ++ ++msgid "References" ++msgstr "Referências" ++ ++msgid "Regulatory Domain" ++msgstr "Domínio Regulatório" ++ ++msgid "Relay" ++msgstr "Retransmissor" ++ ++msgid "Relay Bridge" ++msgstr "Ponte por Retransmissão" ++ ++msgid "Relay between networks" ++msgstr "Encaminha o tráfego entre as redes" ++ ++msgid "Relay bridge" ++msgstr "Ponte por retransmissão" ++ ++msgid "Remote IPv4 address" ++msgstr "Endereço IPv4 remoto" ++ ++msgid "Remove" ++msgstr "Remover" ++ ++msgid "Repeat scan" ++msgstr "Repetir busca" ++ ++msgid "Replace entry" ++msgstr "Substituir entrada" ++ ++msgid "Replace wireless configuration" ++msgstr "Substituir a configuração da rede sem fio" ++ ++msgid "Request IPv6-address" ++msgstr "" ++ ++msgid "Request IPv6-prefix of length" ++msgstr "" ++ ++msgid "Require TLS" ++msgstr "" ++ ++msgid "Required for certain ISPs, e.g. Charter with DOCSIS 3" ++msgstr "Requerido para alguns provedores de internet, ex. Charter com DOCSIS 3" ++ ++msgid "Reset" ++msgstr "Limpar" ++ ++msgid "Reset Counters" ++msgstr "Reiniciar contadores" ++ ++msgid "Reset to defaults" ++msgstr "Redefinir para os valores padrão" ++ ++msgid "Resolv and Hosts Files" ++msgstr "Arquivos de Resolv e Hosts" ++ ++msgid "Resolve file" ++msgstr "Arquivo Resolv" ++ ++msgid "Restart" ++msgstr "Reiniciar" ++ ++msgid "Restart Firewall" ++msgstr "Reiniciar o firewall" ++ ++msgid "Restore backup" ++msgstr "Restaurar cópia de segurança" ++ ++msgid "Reveal/hide password" ++msgstr "Relevar/esconder senha" ++ ++msgid "Revert" ++msgstr "Reverter" ++ ++msgid "Root" ++msgstr "Raiz" ++ ++msgid "Root directory for files served via TFTP" ++msgstr "Diretório raiz para arquivos disponibilizados pelo TFTP" ++ ++msgid "Root preparation" ++msgstr "" ++ ++msgid "Routed IPv6 prefix for downstream interfaces" ++msgstr "" ++ ++msgid "Router Advertisement-Service" ++msgstr "" ++ ++msgid "Router Password" ++msgstr "Senha do Roteador" ++ ++msgid "Routes" ++msgstr "Rotas" ++ ++msgid "" ++"Routes specify over which interface and gateway a certain host or network " ++"can be reached." ++msgstr "" ++"As rotas especificam através de qual interface e roteador um certo destino " ++"podem ser alcançado." ++ ++msgid "Rule #" ++msgstr "Regra #" ++ ++msgid "Run a filesystem check before mounting the device" ++msgstr "" ++"Execute a verificação do sistema de arquivos antes da montagem do dispositivo" ++ ++msgid "Run filesystem check" ++msgstr "Execute a verificação do sistema de arquivos " ++ ++msgid "" ++"SIXXS supports TIC only, for static tunnels using IP protocol 41 (RFC4213) " ++"use 6in4 instead" ++msgstr "" ++ ++msgid "SIXXS-handle[/Tunnel-ID]" ++msgstr "" ++ ++msgid "SSH Access" ++msgstr "Acesso SSH" ++ ++msgid "SSH-Keys" ++msgstr "Chaves SSH" ++ ++msgid "SSID" ++msgstr "SSID" ++ ++msgid "Save" ++msgstr "Salvar" ++ ++msgid "Save & Apply" ++msgstr "Salvar & Aplicar" ++ ++msgid "Save & Apply" ++msgstr "Save & Aplicar" ++ ++msgid "Scan" ++msgstr "Procurar" ++ ++msgid "Scheduled Tasks" ++msgstr "Tarefas Agendadas" ++ ++msgid "Section added" ++msgstr "Seção adicionada" ++ ++msgid "Section removed" ++msgstr "Seção removida" ++ ++msgid "See \"mount\" manpage for details" ++msgstr "Veja o manual (man) do comando \"mount\" para detalhes" ++ ++msgid "" ++"Send LCP echo requests at the given interval in seconds, only effective in " ++"conjunction with failure threshold" ++msgstr "" ++"Enviar requisições de eco do LCP no dado intervalo em segundos. Somente " ++"efetivo em conjunto com o limite de falhas." ++ ++msgid "Separate Clients" ++msgstr "Isolar Clientes" ++ ++msgid "Separate WDS" ++msgstr "Separar WDS" ++ ++msgid "Server Settings" ++msgstr "Configurações do Servidor" ++ ++msgid "Server password" ++msgstr "" ++ ++msgid "" ++"Server password, enter the specific password of the tunnel when the username " ++"contains the tunnel ID" ++msgstr "" ++ ++msgid "Server username" ++msgstr "" ++ ++msgid "Service Name" ++msgstr "Nome do Serviço" ++ ++msgid "Service Type" ++msgstr "Tipo do Serviço" ++ ++msgid "Services" ++msgstr "Serviços" ++ ++#, fuzzy ++msgid "Set up Time Synchronization" ++msgstr "Configurar a Sincronização do Horário" ++ ++msgid "Setup DHCP Server" ++msgstr "Configurar Servidor DHCP" ++ ++msgid "Show current backup file list" ++msgstr "Mostra a lista atual de arquivos para a cópia de segurança" ++ ++msgid "Shutdown this interface" ++msgstr "Desligar esta interface" ++ ++msgid "Shutdown this network" ++msgstr "Desligar esta rede" ++ ++msgid "Signal" ++msgstr "Sinal" ++ ++msgid "Signal:" ++msgstr "Sinal:" ++ ++msgid "Size" ++msgstr "Tamanho" ++ ++msgid "Skip" ++msgstr "Pular" ++ ++msgid "Skip to content" ++msgstr "Pular para o conteúdo" ++ ++msgid "Skip to navigation" ++msgstr "Pular para a navegação" ++ ++msgid "Slot time" ++msgstr "Intervalo de tempo" ++ ++msgid "Software" ++msgstr "Software" ++ ++msgid "Some fields are invalid, cannot save values!" ++msgstr "Alguns campos estão inválidos e os valores não podem ser salvos!" ++ ++msgid "Sorry, the object you requested was not found." ++msgstr "Desculpe o objeto solicitado não foi encontrado" ++ ++msgid "Sorry, the server encountered an unexpected error." ++msgstr "Desculpe, o servidor encontrou um erro inesperado." ++ ++#, fuzzy ++msgid "" ++"Sorry, there is no sysupgrade support present; a new firmware image must be " ++"flashed manually. Please refer to the OpenWrt wiki for device specific " ++"install instructions." ++msgstr "" ++"Sinto muito, não existe suporte para o sysupgrade. Uma nova imagem de " ++"firmware deve ser gravada manualmente. Por favor, consulte a wiki do OpenWrt " ++"para instruções específicas da instalação deste dispositivo." ++ ++msgid "Sort" ++msgstr "Ordenar" ++ ++msgid "Source" ++msgstr "Origem" ++ ++msgid "Source routing" ++msgstr "" ++ ++msgid "Specifies the button state to handle" ++msgstr "Especifica o estado do botão para ser tratado" ++ ++msgid "Specifies the directory the device is attached to" ++msgstr "Especifica o diretório que o dispositivo está conectado" ++ ++msgid "Specifies the listening port of this Dropbear instance" ++msgstr "Especifica a porta de escuta deste Dropbear" ++ ++msgid "" ++"Specifies the maximum amount of failed ARP requests until hosts are presumed " ++"to be dead" ++msgstr "" ++"Especifica a quantidade máxima de requisições ARP falhadas antes de " ++"considerar que um equipamento está morto" ++ ++msgid "" ++"Specifies the maximum amount of seconds after which hosts are presumed to be " ++"dead" ++msgstr "" ++"Especifica a quantidade máxima de segundos antes de considerar que um " ++"equipamento está morto" ++ ++msgid "Specify the secret encryption key here." ++msgstr "Especifique a chave de cifragem secreta aqui." ++ ++msgid "Start" ++msgstr "Iniciar" ++ ++msgid "Start priority" ++msgstr "Prioridade de iniciação" ++ ++msgid "Startup" ++msgstr "Iniciação" ++ ++msgid "Static IPv4 Routes" ++msgstr "Rotas Estáticas IPv4" ++ ++msgid "Static IPv6 Routes" ++msgstr "Rotas Estáticas IPv6" ++ ++msgid "Static Leases" ++msgstr "Alocações Estáticas" ++ ++msgid "Static Routes" ++msgstr "Rotas Estáticas" ++ ++msgid "Static WDS" ++msgstr "WDS Estático" ++ ++msgid "Static address" ++msgstr "Endereço Estático" ++ ++msgid "" ++"Static leases are used to assign fixed IP addresses and symbolic hostnames " ++"to DHCP clients. They are also required for non-dynamic interface " ++"configurations where only hosts with a corresponding lease are served." ++msgstr "" ++"Alocações estáticas são usadas para definir um endereço IP fixo e nome " ++"simbólico para os clientes do DHCP. Elas também são necessárias para " ++"configurações não dinâmicas onde um computador com a alocação correspondente " ++"é provido." ++ ++msgid "Status" ++msgstr "Estado" ++ ++msgid "Stop" ++msgstr "Parar" ++ ++msgid "Strict order" ++msgstr "Ordem Exata" ++ ++msgid "Submit" ++msgstr "Enviar" ++ ++msgid "Swap" ++msgstr "" ++ ++msgid "Swap Entry" ++msgstr "Entrada do espaço de troca (Swap)" ++ ++msgid "Switch" ++msgstr "Switch" ++ ++msgid "Switch %q" ++msgstr "Switch %q" ++ ++msgid "Switch %q (%s)" ++msgstr "Switch %q (%s)" ++ ++msgid "Switch protocol" ++msgstr "Trocar o protocolo" ++ ++msgid "Sync with browser" ++msgstr "Sincronizar com o navegador" ++ ++msgid "Synchronizing..." ++msgstr "Sincronizando..." ++ ++msgid "System" ++msgstr "Sistema" ++ ++msgid "System Log" ++msgstr "Registo do Sistema" ++ ++msgid "System Properties" ++msgstr "Propriedades do Sistema" ++ ++msgid "System log buffer size" ++msgstr "Tamanho do buffer de registro do sistema" ++ ++msgid "TCP:" ++msgstr "TCP:" ++ ++msgid "TFTP Settings" ++msgstr "Configurações do TFTP" ++ ++msgid "TFTP server root" ++msgstr "Raiz do servidor TFTP" ++ ++msgid "TX" ++msgstr "TX" ++ ++msgid "TX Rate" ++msgstr "Taxa de TX" ++ ++msgid "Table" ++msgstr "Tabela" ++ ++msgid "Target" ++msgstr "Destino" ++ ++msgid "Terminate" ++msgstr "Terminar" ++ ++#, fuzzy ++msgid "" ++"The Device Configuration section covers physical settings of the " ++"radio hardware such as channel, transmit power or antenna selection which " ++"are shared among all defined wireless networks (if the radio hardware is " ++"multi-SSID capable). Per network settings like encryption or operation mode " ++"are grouped in the Interface Configuration." ++msgstr "" ++"A seção da Configuração do Dispositivo engloba as configurações " ++"físicas do rádio como canal, potência de transmissão ou seleção da antena. " ++"Estas configurações são compartilhadas entre todas as redes sem fio (se o " ++"hardware for capaz de utilizar múltiplas SSID). As configurações específicas " ++"de cada rede, como cifragem ou modo de operação estão agrupadas na " ++"Configuração da Interface." ++ ++msgid "" ++"The libiwinfo-lua package is not installed. You must install this " ++"component for working wireless configuration!" ++msgstr "" ++"O pacote libiwinfo-lua não está instalado. Você precisa instalar " ++"este componente para ter uma configuração da rede sem fio funcional!" ++ ++msgid "" ++"The HE.net endpoint update configuration changed, you must now use the plain " ++"username instead of the user ID!" ++msgstr "" ++ ++msgid "" ++"The IPv6 prefix assigned to the provider, usually ends with ::" ++msgstr "" ++"O prefixo IPv6 atribuído pelo provedor, geralmente termina com::" ++ ++msgid "" ++"The allowed characters are: A-Z, a-z, 0-9 and _" ++msgstr "" ++"Os caracteres permitidos são: A-Z, a-z, 0-9 e _" ++ ++msgid "The configuration file could not be loaded due to the following error:" ++msgstr "" ++ ++msgid "" ++"The device file of the memory or partition (e.g." ++" /dev/sda1)" ++msgstr "" ++"O arquivo do dispositivo de armazenamento ou da partição (ex. /dev/sda1)" ++ ++msgid "" ++"The filesystem that was used to format the memory (e.g. ext3)" ++msgstr "" ++"O sistema de arquivos que foi usado para formatar a unidade de armazenamento " ++"(ex. ext3)" ++ ++msgid "" ++"The flash image was uploaded. Below is the checksum and file size listed, " ++"compare them with the original file to ensure data integrity.
    Click " ++"\"Proceed\" below to start the flash procedure." ++msgstr "" ++"A imagem do firmware foi enviada. Abaixo estão a soma de verificação " ++"(checksum) e o tamanho dom arquivo. Compare-os com o arquivo original para " ++"garantir a integridade dos dados.
    Clique em \"Proceder\" para iniciar " ++"o procedimetno de gravação." ++ ++msgid "The following changes have been committed" ++msgstr "As seguintes mudanças foram aplicadas" ++ ++msgid "The following changes have been reverted" ++msgstr "As seguintes alterações foram revertidas" ++ ++msgid "The following rules are currently active on this system." ++msgstr "As seguintes regras estão atualmente ativas neste sistema." ++ ++msgid "The given network name is not unique" ++msgstr "O nome de rede informado não é único" ++ ++#, fuzzy ++msgid "" ++"The hardware is not multi-SSID capable and the existing configuration will " ++"be replaced if you proceed." ++msgstr "" ++"Este equipamento não é capaz de utilizar SSID múltiplos e as configurações " ++"existentes serão substituídas se você proceder." ++ ++msgid "" ++"The length of the IPv4 prefix in bits, the remainder is used in the IPv6 " ++"addresses." ++msgstr "" ++"O comprimento do prefixo IPv4 em bits, o restante é usado nos endereços IPv6." ++ ++msgid "The length of the IPv6 prefix in bits" ++msgstr "O comprimento do prefixo IPv6 em bits" ++ ++msgid "" ++"The network ports on this device can be combined to several VLANs in which computers can " ++"communicate directly with each other. VLANs are often used to separate different network " ++"segments. Often there is by default one Uplink port for a connection to the " ++"next greater network like the internet and other ports for a local network." ++msgstr "" ++"As portas de rede neste dispositivo podem ser configuradas em diversas VLANs nas quais computadores em uma " ++"mesma VLAN podem se comunicar " ++"diretamente. VLANs são muitas " ++"vezes utilizadas para separar diferentes segmentos de rede. Em geral, existe " ++"uma porta para o enlace superior (uplink) e as demais portas são utilizadas " ++"para a rede local." ++ ++msgid "The selected protocol needs a device assigned" ++msgstr "O protocolo selecionado necessita estar associado a um dispositivo" ++ ++msgid "" ++"The system is erasing the configuration partition now and will reboot itself " ++"when finished." ++msgstr "" ++"O sistema está apagando agora a partição da configuração e irá reiniciar " ++"quando terminado." ++ ++#, fuzzy ++msgid "" ++"The system is flashing now.
    DO NOT POWER OFF THE DEVICE!
    Wait a " ++"few minutes before you try to reconnect. It might be necessary to renew the " ++"address of your computer to reach the device again, depending on your " ++"settings." ++msgstr "" ++"O sistema está gravando o firmware para a flash.
    NÃO DESLIGUE O " ++"EQUIPAMENTO!
    Espere alguns minutos até tentar reconectar. Dependendo " ++"da sua configuração, pode ser necessário renovar o endereço do seu " ++"computador para poder conectar novamente ao roteador." ++ ++msgid "" ++"The tunnel end-point is behind NAT, defaults to disabled and only applies to " ++"AYIYA" ++msgstr "" ++ ++msgid "" ++"The uploaded image file does not contain a supported format. Make sure that " ++"you choose the generic image format for your platform." ++msgstr "" ++"A imagem carregada não contém um formato suportado. Confirme que você " ++"escolheu uma imagem para a sua plataforma." ++ ++msgid "There are no active leases." ++msgstr "Não existem alocações ativas." ++ ++msgid "There are no pending changes to apply!" ++msgstr "Não existem modificações pendentes para aplicar!" ++ ++msgid "There are no pending changes to revert!" ++msgstr "Não existem modificações pendentes para reverter!" ++ ++msgid "There are no pending changes!" ++msgstr "Não existem modificações pendentes!" ++ ++msgid "" ++"There is no device assigned yet, please attach a network device in the " ++"\"Physical Settings\" tab" ++msgstr "" ++"Ainda não existe um dispositivo associado. Por favor, associe um dispositivo " ++"de rede na aba \"Configurações Físicas\"" ++ ++msgid "" ++"There is no password set on this router. Please configure a root password to " ++"protect the web interface and enable SSH." ++msgstr "" ++"Não existem uma senha definida para este roteador. Por favor, configure uma " ++"senha para o root para proteger a interface WEB e habilitar o SSH." ++ ++msgid "This IPv4 address of the relay" ++msgstr "Este endereço IPv4 do repassar" ++ ++msgid "" ++"This is a list of shell glob patterns for matching files and directories to " ++"include during sysupgrade. Modified files in /etc/config/ and certain other " ++"configurations are automatically preserved." ++msgstr "" ++"Esta é a lista dos padrões de expressão shell para casar com os arquivos e " ++"diretórios incluídos durante a atualização do sistema. Arquivos modificados " ++"em /etc/config/ e alguns outros arquivos de configuração são automaticamente " ++"preservados." ++ ++msgid "" ++"This is either the \"Update Key\" configured for the tunnel or the account " ++"password if no update key has been configured" ++msgstr "" ++ ++msgid "" ++"This is the content of /etc/rc.local. Insert your own commands here (in " ++"front of 'exit 0') to execute them at the end of the boot process." ++msgstr "" ++"Este é o conteúdo do /etc/rc.local. Insira seus próprios comandos aqui " ++"(antes de 'exit 0') para executá-los no final do processo de boot." ++ ++msgid "" ++"This is the local endpoint address assigned by the tunnel broker, it usually " ++"ends with :2" ++msgstr "" ++"Este é o endereço da ponta local designado pelo agente de túnel. normalmente " ++"ele termina com :2" ++ ++msgid "" ++"This is the only DHCP in the local network" ++msgstr "" ++"Este é o único DHCP na rede local" ++ ++msgid "This is the plain username for logging into the account" ++msgstr "" ++ ++msgid "" ++"This is the prefix routed to you by the tunnel broker for use by clients" ++msgstr "" ++ ++msgid "This is the system crontab in which scheduled tasks can be defined." ++msgstr "Este é o sistema de agendamento de tarefas." ++ ++msgid "" ++"This is usually the address of the nearest PoP operated by the tunnel broker" ++msgstr "" ++"Este é normalmente o endereço do PoP mais próximo operado pelo agente de túnel" ++ ++msgid "" ++"This list gives an overview over currently running system processes and " ++"their status." ++msgstr "" ++"Esta lista fornece uma visão geral sobre os processos em execução no sistema." ++ ++msgid "This page allows the configuration of custom button actions" ++msgstr "" ++"Esta página permite a configuração de ações personalizadas para os botões" ++ ++msgid "This page gives an overview over currently active network connections." ++msgstr "Esta página fornece informações sobre as conexões de rede ativas." ++ ++msgid "This section contains no values yet" ++msgstr "Esta seção ainda não contêm valores" ++ ++msgid "Time Synchronization" ++msgstr "Sincronização de horário" ++ ++msgid "Time Synchronization is not configured yet." ++msgstr "A sincronização do horário ainda não está configurada." ++ ++msgid "Timezone" ++msgstr "Fuso Horário" ++ ++msgid "" ++"To restore configuration files, you can upload a previously generated backup " ++"archive here." ++msgstr "" ++"Para recuperar os arquivos de configuração, você pode enviar aqui uma cópia " ++"de segurança anterior." ++ ++msgid "Total Available" ++msgstr "Total Disponível" ++ ++msgid "Traceroute" ++msgstr "Traceroute" ++ ++msgid "Traffic" ++msgstr "Tráfego" ++ ++msgid "Transfer" ++msgstr "Transferências" ++ ++msgid "Transmission Rate" ++msgstr "Taxa de Transmissão" ++ ++msgid "Transmit" ++msgstr "Transmitir" ++ ++msgid "Transmit Power" ++msgstr "Potência de Transmissão" ++ ++msgid "Transmitter Antenna" ++msgstr "Antena de Transmissão" ++ ++msgid "Trigger" ++msgstr "Disparo" ++ ++msgid "Trigger Mode" ++msgstr "Modo de disparo" ++ ++msgid "Tunnel ID" ++msgstr "Identificador do Túnel" ++ ++msgid "Tunnel Interface" ++msgstr "Interface de Tunelamento" ++ ++msgid "Tunnel Link" ++msgstr "" ++ ++msgid "Tunnel broker protocol" ++msgstr "" ++ ++msgid "Tunnel setup server" ++msgstr "" ++ ++msgid "Tunnel type" ++msgstr "" ++ ++msgid "Turbo Mode" ++msgstr "Modo Turbo" ++ ++msgid "Tx-Power" ++msgstr "Potência de transmissão" ++ ++msgid "Type" ++msgstr "Tipo" ++ ++msgid "UDP:" ++msgstr "UDP:" ++ ++msgid "UMTS only" ++msgstr "UMTS somente" ++ ++msgid "UMTS/GPRS/EV-DO" ++msgstr "UMTS/GPRS/EV-DO" ++ ++msgid "USB Device" ++msgstr "Dispositivo USB" ++ ++msgid "UUID" ++msgstr "UUID" ++ ++msgid "Unable to dispatch" ++msgstr "Não é possível a expedição" ++ ++msgid "Unknown" ++msgstr "Desconhecido" ++ ++msgid "Unknown Error, password not changed!" ++msgstr "Erro Desconhecido, a senha não foi alterada!" ++ ++msgid "Unmanaged" ++msgstr "Não gerenciado" ++ ++msgid "Unsaved Changes" ++msgstr "Alterações Não Salvas" ++ ++msgid "Unsupported protocol type." ++msgstr "Tipo de protocolo não suportado." ++ ++msgid "Update lists" ++msgstr "Atualizar listas" ++ ++msgid "" ++"Upload a sysupgrade-compatible image here to replace the running firmware. " ++"Check \"Keep settings\" to retain the current configuration (requires an " ++"OpenWrt compatible firmware image)." ++msgstr "" ++"Envia uma imagem compatível do sistema para substituir o firmware em " ++"execução. Marque \"Manter configurações\" para manter as configurações " ++"atuais (requer uma imagem OpenWrt compatível)." ++ ++msgid "Upload archive..." ++msgstr "Enviar arquivo..." ++ ++msgid "Uploaded File" ++msgstr "Arquivo Carregado" ++ ++msgid "Uptime" ++msgstr "Tempo de atividade" ++ ++msgid "Use /etc/ethers" ++msgstr "Usar /etc/ethers" ++ ++msgid "Use DHCP gateway" ++msgstr "Use o roteador do DHCP" ++ ++msgid "Use DNS servers advertised by peer" ++msgstr "Use os servidores DNS anunciados pelo parceiro" ++ ++msgid "Use ISO/IEC 3166 alpha2 country codes." ++msgstr "Usar códigos de países ISO/IEC 3166 alpha2." ++ ++msgid "Use MTU on tunnel interface" ++msgstr "Use MTU na interface do túnel" ++ ++msgid "Use TTL on tunnel interface" ++msgstr "Use TTL na interface do túnel" ++ ++msgid "Use as external overlay (/overlay)" ++msgstr "" ++ ++msgid "Use as root filesystem (/)" ++msgstr "" ++ ++msgid "Use broadcast flag" ++msgstr "Use a marcação de broadcast" ++ ++msgid "Use builtin IPv6-management" ++msgstr "" ++ ++msgid "Use custom DNS servers" ++msgstr "Use servidores DNS personalizados" ++ ++msgid "Use default gateway" ++msgstr "Use o roteador padrão" ++ ++msgid "Use gateway metric" ++msgstr "Use a métrica do roteador" ++ ++msgid "Use routing table" ++msgstr "Use a tabela de roteamento" ++ ++msgid "" ++"Use the Add Button to add a new lease entry. The MAC-Address indentifies the host, the IPv4-Address specifies to the fixed " ++"address to use and the Hostname is assigned as symbolic name to the " ++"requesting host." ++msgstr "" ++"Use o botão Adicionar para adicionar uma nova entrada de " ++"atribuição. O endereço MAC-Address identifica o equipamento, o " ++"endereço IPv4 especifica o endereço fixo para usar e o nome do " ++"equipamento é designado como nome simbólico (DNS) para o equipamento " ++"requisitante." ++ ++msgid "Used" ++msgstr "Usado" ++ ++msgid "Used Key Slot" ++msgstr "Posição da Chave Usada" ++ ++msgid "User certificate (PEM encoded)" ++msgstr "" ++ ++msgid "User key (PEM encoded)" ++msgstr "" ++ ++msgid "Username" ++msgstr "Usuário" ++ ++msgid "VC-Mux" ++msgstr "VC-Mux" ++ ++msgid "VLAN Interface" ++msgstr "Interface VLAN" ++ ++msgid "VLANs on %q" ++msgstr "VLANs em %q" ++ ++msgid "VLANs on %q (%s)" ++msgstr "VLANs em %q (%s)" ++ ++msgid "VPN Server" ++msgstr "Servidor VPN" ++ ++msgid "VPN Server port" ++msgstr "" ++ ++msgid "VPN Server's certificate SHA1 hash" ++msgstr "" ++ ++msgid "Vendor Class to send when requesting DHCP" ++msgstr "Classe do fabricante para enviar quando requisitar o DHCP" ++ ++msgid "Verbose" ++msgstr "" ++ ++msgid "Verbose logging by aiccu daemon" ++msgstr "" ++ ++msgid "Verify" ++msgstr "Verificar" ++ ++msgid "Version" ++msgstr "Versão" ++ ++msgid "WDS" ++msgstr "WDS" ++ ++msgid "WEP Open System" ++msgstr "WEP Sistema Aberto" ++ ++msgid "WEP Shared Key" ++msgstr "WEP Chave Compartilhada" ++ ++msgid "WEP passphrase" ++msgstr "WEP Senha" ++ ++msgid "WMM Mode" ++msgstr "Modo WMM" ++ ++msgid "WPA passphrase" ++msgstr "WPA Senha" ++ ++msgid "" ++"WPA-Encryption requires wpa_supplicant (for client mode) or hostapd (for AP " ++"and ad-hoc mode) to be installed." ++msgstr "" ++"A cifragem WPA requer a instalação do wpa_supplicant (para modo cliente) ou " ++"do hostapd (para modo AP ou ad-hoc)." ++ ++msgid "" ++"Wait for NTP sync that many seconds, seting to 0 disables waiting (optional)" ++msgstr "" ++ ++msgid "Waiting for changes to be applied..." ++msgstr "Esperando a aplicação das mudanças..." ++ ++msgid "Waiting for command to complete..." ++msgstr "Esperando o término do comando..." ++ ++msgid "Warning" ++msgstr "Atenção" ++ ++msgid "Warning: There are unsaved changes that will be lost while rebooting!" ++msgstr "" ++"Aviso: Existem alterações não salvas que serão perdidas durante a " ++"reiniciação!" ++ ++msgid "Whether to create an IPv6 default route over the tunnel" ++msgstr "" ++ ++msgid "Whether to route only packets from delegated prefixes" ++msgstr "" ++ ++msgid "Width" ++msgstr "" ++ ++msgid "Wifi" ++msgstr "Wifi" ++ ++msgid "Wireless" ++msgstr "Rede sem fio" ++ ++msgid "Wireless Adapter" ++msgstr "Dispositivo de Rede sem Fio" ++ ++msgid "Wireless Network" ++msgstr "Rede sem Fio" ++ ++msgid "Wireless Overview" ++msgstr "Visão Geral da Rede sem Fio" ++ ++msgid "Wireless Security" ++msgstr "Segurança da Rede sem Fio" ++ ++msgid "Wireless is disabled or not associated" ++msgstr "Rede sem fio está desabilitada ou não conectada" ++ ++msgid "Wireless is restarting..." ++msgstr "A rede sem fio está reiniciando..." ++ ++msgid "Wireless network is disabled" ++msgstr "A rede sem fio está desabilitada" ++ ++msgid "Wireless network is enabled" ++msgstr "A rede sem fio está habilitada" ++ ++msgid "Wireless restarted" ++msgstr "A rede sem fio reiniciou" ++ ++msgid "Wireless shut down" ++msgstr "Rede sem fio desligada" ++ ++msgid "Write received DNS requests to syslog" ++msgstr "Escreva as requisições DNS para o servidor de registro (syslog)" ++ ++msgid "XR Support" ++msgstr "Suporte a XR" ++ ++msgid "" ++"You can enable or disable installed init scripts here. Changes will applied " ++"after a device reboot.
    Warning: If you disable essential init " ++"scripts like \"network\", your device might become inaccessible!" ++msgstr "" ++"Neste local, você pode ativar ou desativar os scripts de iniciação " ++"instalados. As mudanças serão aplicadas após a reiniciação do equipamento." ++"
    Aviso: Se você desativar algum script de iniciação essencial " ++"como por exemplo \"rede/network\", o dispositivo poderá tornar-se " ++"inacessível!" ++ ++msgid "" ++"You must enable Java Script in your browser or LuCI will not work properly." ++msgstr "" ++"Você precisa habilitar o JavaScript no seu navegador ou o LuCI não irá " ++"funcionar corretamente." ++ ++msgid "" ++"Your Internet Explorer is too old to display this page correctly. Please " ++"upgrade it to at least version 7 or use another browser like Firefox, Opera " ++"or Safari." ++msgstr "" ++ ++msgid "any" ++msgstr "qualquer" ++ ++msgid "auto" ++msgstr "automático" ++ ++#, fuzzy ++msgid "automatic" ++msgstr "estático" ++ ++msgid "baseT" ++msgstr "baseT" ++ ++msgid "bridged" ++msgstr "em ponte" ++ ++msgid "create:" ++msgstr "criar" ++ ++msgid "creates a bridge over specified interface(s)" ++msgstr "cria uma ponte sobre determinada(s) interface(s)" ++ ++msgid "dB" ++msgstr "dB" ++ ++msgid "dBm" ++msgstr "dBm" ++ ++msgid "disable" ++msgstr "desativar" ++ ++msgid "disabled" ++msgstr "" ++ ++msgid "expired" ++msgstr "expirado" ++ ++msgid "" ++"file where given DHCP-leases will be stored" ++msgstr "" ++"Arquivo onde as alocações DHCP são armazenadas" ++ ++msgid "forward" ++msgstr "encaminhar" ++ ++msgid "full-duplex" ++msgstr "full-duplex" ++ ++msgid "half-duplex" ++msgstr "half-duplex" ++ ++msgid "help" ++msgstr "ajuda" ++ ++msgid "hidden" ++msgstr "ocultar" ++ ++msgid "hybrid mode" ++msgstr "" ++ ++msgid "if target is a network" ++msgstr "se o destino for uma rede" ++ ++msgid "input" ++msgstr "entrada" ++ ++msgid "kB" ++msgstr "kB" ++ ++msgid "kB/s" ++msgstr "kB/s" ++ ++msgid "kbit/s" ++msgstr "kbit/s" ++ ++msgid "local DNS file" ++msgstr "" ++"Arquivo local de DNS" ++ ++msgid "minimum 1280, maximum 1480" ++msgstr "" ++ ++msgid "navigation Navigation" ++msgstr "" ++ ++# Is this yes/no or no like in no one? ++msgid "no" ++msgstr "não" ++ ++msgid "no link" ++msgstr "sem link" ++ ++msgid "none" ++msgstr "nenhum" ++ ++msgid "not present" ++msgstr "" ++ ++msgid "off" ++msgstr "desligado" ++ ++msgid "on" ++msgstr "ligado" ++ ++msgid "open" ++msgstr "aberto" ++ ++msgid "overlay" ++msgstr "" ++ ++msgid "relay mode" ++msgstr "" ++ ++msgid "routed" ++msgstr "roteado" ++ ++msgid "server mode" ++msgstr "" ++ ++msgid "skiplink1 Skip to navigation" ++msgstr "" ++ ++msgid "skiplink2 Skip to content" ++msgstr "" ++ ++msgid "stateful-only" ++msgstr "" ++ ++msgid "stateless" ++msgstr "" ++ ++msgid "stateless + stateful" ++msgstr "" ++ ++msgid "tagged" ++msgstr "etiquetado" ++ ++msgid "unknown" ++msgstr "desconhecido" ++ ++msgid "unlimited" ++msgstr "ilimitado" ++ ++msgid "unspecified" ++msgstr "não especificado" ++ ++msgid "unspecified -or- create:" ++msgstr "não especificado -ou- criar:" ++ ++msgid "untagged" ++msgstr "não etiquetado" ++ ++msgid "yes" ++msgstr "sim" ++ ++msgid "« Back" ++msgstr "« Voltar" ++ ++#~ msgid "" ++#~ "Always use 40MHz channels even if the secondary channel overlaps. Using " ++#~ "this option does not comply with IEEE 802.11n-2009!" ++#~ msgstr "" ++#~ "Sempre use canais 40MHz mesmo se o canal secundário estiver sobreposto. " ++#~ "Usando esta opção, você não estará de acordo com a norma IEEE " ++#~ "802.11n-2009!" ++ ++#~ msgid "Cached" ++#~ msgstr "Cached" ++ ++#~ msgid "Configures this mount as overlay storage for block-extroot" ++#~ msgstr "" ++#~ "Configura esta montagem como um armazenamento sobreposto para o bloco-" ++#~ "extroot" ++ ++#~ msgid "Force 40MHz mode" ++#~ msgstr "Forçar modo 40MHz" ++ ++#~ msgid "Frequency Hopping" ++#~ msgstr "Salto de Frequência" ++ ++#~ msgid "Locked to channel %d used by %s" ++#~ msgstr "Travado para o canal %d usado por %s" ++ ++#~ msgid "Use as root filesystem" ++#~ msgstr "Usar como sistema de arquivos raiz" ++ ++#~ msgid "HE.net user ID" ++#~ msgstr "Identificador do usuário HE.net" ++ ++#~ msgid "This is the 32 byte hex encoded user ID, not the login name" ++#~ msgstr "" ++#~ "Este é o identificador do usuário de 32 bytes codificado em hexadecimal, " ++#~ "não o nome do usuário" ++ ++#~ msgid "40MHz 2nd channel above" ++#~ msgstr "40MHz, 2º canal acima" ++ ++#~ msgid "40MHz 2nd channel below" ++#~ msgstr "40MHz, 2º canal abaixo" ++ ++#~ msgid "Accept router advertisements" ++#~ msgstr "Aceita anúncios de roteador" ++ ++#~ msgid "Advertise IPv6 on network" ++#~ msgstr "Anuncie IPv6 na rede" ++ ++#~ msgid "Advertised network ID" ++#~ msgstr "Identificador da rede anunciado" ++ ++#~ msgid "Allowed range is 1 to 65535" ++#~ msgstr "Faixa permitida de 1 a 65535" ++ ++#~ msgid "HT capabilities" ++#~ msgstr "Capacidade de HT" ++ ++#~ msgid "HT mode" ++#~ msgstr "Modo HT" ++ ++#~ msgid "Router Model" ++#~ msgstr "Modelo do Roteador" ++ ++#~ msgid "Router Name" ++#~ msgstr "Nome do Roteador" ++ ++#~ msgid "Send router solicitations" ++#~ msgstr "Enviar solicitações de roteador" ++ ++#~ msgid "Specifies the advertised preferred prefix lifetime in seconds" ++#~ msgstr "" ++#~ "Especifica o tempo de vida, em segundos, do prefixo preferencial anunciado" ++ ++#~ msgid "Specifies the advertised valid prefix lifetime in seconds" ++#~ msgstr "" ++#~ "Especifica o tempo de vida, em segundos, do prefixo válido anunciado" ++ ++#~ msgid "Use preferred lifetime" ++#~ msgstr "Use o tempo de vida preferencial" ++ ++#~ msgid "Use valid lifetime" ++#~ msgstr "Use o tempo de vida válido" ++ ++#~ msgid "Waiting for router..." ++#~ msgstr "Esperando pelo roteador..." ++ ++#~ msgid "Enable builtin NTP server" ++#~ msgstr "Ativar o servidor NTP embutido" ++ ++#~ msgid "Active Leases" ++#~ msgstr "Atribuições Ativas" ++ ++#~ msgid "Open" ++#~ msgstr "Abrir" ++ ++#~ msgid "Bit Rate" ++#~ msgstr "Taxa de Bits" ++ ++#~ msgid "Configuration / Apply" ++#~ msgstr "Configuração / Aplicar" ++ ++#~ msgid "Configuration / Changes" ++#~ msgstr "Configuração / Mudanças" ++ ++#~ msgid "Configuration / Revert" ++#~ msgstr "Configuração / Reverter" ++ ++#~ msgid "MAC" ++#~ msgstr "MAC" ++ ++#~ msgid "MAC Address" ++#~ msgstr "Endereço Físico (MAC)" ++ ++#~ msgid "Encr." ++#~ msgstr "Encr." ++ ++#~ msgid "WLAN-Scan" ++#~ msgstr "WLAN-Pesquisa" ++ ++#~ msgid "" ++#~ "Choose the network you want to attach to this wireless interface. Select " ++#~ "unspecified to not attach any network or fill out the " ++#~ "create field to define a new network." ++#~ msgstr "" ++#~ "Escolha a rede que você quer associar com esta interface de rede sem fio. " ++#~ "Selecione não especificado para não ligar a interface a qualquer " ++#~ "rede ou preencha o campo criar para definir uma nova rede." ++ ++#~ msgid "Create Network" ++#~ msgstr "Criar Rede" ++ ++#~ msgid "Link" ++#~ msgstr "Enlace" ++ ++#~ msgid "Networks" ++#~ msgstr "Redes" ++ ++#~ msgid "Power" ++#~ msgstr "Potência" ++ ++#~ msgid "Wifi networks in your local environment" ++#~ msgstr "Redes Wifi no seu ambiente local" ++ ++#~ msgid "" ++#~ "CIDR-Notation: " ++#~ "address/prefix" ++#~ msgstr "" ++#~ "Notação CIDR: " ++#~ "endereço/prefixo" ++ ++#~ msgid "DNS-Server" ++#~ msgstr "Servidor DNS" ++ ++#~ msgid "IPv4-Broadcast" ++#~ msgstr "" ++#~ "Broadcast IPv4" ++ ++#~ msgid "IPv6-Address" ++#~ msgstr "Endereço IPv6" ++ ++#~ msgid "IP-Aliases" ++#~ msgstr "Endereços IP alternativos" ++ ++#~ msgid "IPv6 Setup" ++#~ msgstr "Configuração do IPv6" ++ ++#~ msgid "" ++#~ "Note: If you choose an interface here which is part of another network, " ++#~ "it will be moved into this network." ++#~ msgstr "" ++#~ "Nota: Se você escolher a interface aqui que é pertencente a outra rede, " ++#~ "ela será movida para esta rede." ++ ++#~ msgid "" ++#~ "Really delete this interface? The deletion cannot be undone!\\nYou might " ++#~ "lose access to this router if you are connected via this interface." ++#~ msgstr "" ++#~ "Você realmente deseja apagar esta interface? A operação não pode ser " ++#~ "revertida!\\nVocê pode perder acesso a este roteador se voc6e está " ++#~ "conectado através desta interface." ++ ++#~ msgid "" ++#~ "Really delete this wireless network? The deletion cannot be undone!\\nYou " ++#~ "might lose access to this router if you are connected via this network." ++#~ msgstr "" ++#~ "Você realmente deseja apagar esta rede sem fio? A operação não pode ser " ++#~ "revertida!\\nVocê pode perder acesso a este roteador se voc6e está " ++#~ "conectado através desta interface." ++ ++#~ msgid "" ++#~ "Really shutdown interface \"%s\" ?\\nYou might lose access to this router " ++#~ "if you are connected via this interface." ++#~ msgstr "" ++#~ "Você realmente deseja desligar a interface \"%s\"?\\nVocê pode perder " ++#~ "acesso a este roteador se voc6e está conectado através desta interface." ++ ++#~ msgid "" ++#~ "Really shutdown network ?\\nYou might lose access to this router if you " ++#~ "are connected via this interface." ++#~ msgstr "" ++#~ "Você realmente deseja desligar a rede?\\nVocê pode perder acesso a este " ++#~ "roteador se voc6e está conectado através desta rede." ++ ++#~ msgid "" ++#~ "The network ports on your router can be combined to several VLANs in which computers can " ++#~ "communicate directly with each other. VLANs are often used to separate different network " ++#~ "segments. Often there is by default one Uplink port for a connection to " ++#~ "the next greater network like the internet and other ports for a local " ++#~ "network." ++#~ msgstr "" ++#~ "As portas de rede do seu router podem ser combinadas com diversas VLANs em que os computadores podem " ++#~ "comunicar diretamente entre si. As VLANs são frequentemente utilizadas para separar segmentos de " ++#~ "redes diferentes. Muitas vezes é padrão uma porta para o enlace superior " ++#~ "(Uplink) para a conexão com a próxima rede maior, como a Internet. As " ++#~ "outras portas são, por padrão, utilizadas para conectar uma rede local." ++ ++#~ msgid "Enable buffering" ++#~ msgstr "Ativar bufferização" ++ ++#~ msgid "IPv6-over-IPv4" ++#~ msgstr "IPv6-over-IPv4" ++ ++#~ msgid "Custom Files" ++#~ msgstr "Arquivos Personalizados" ++ ++#~ msgid "Custom files" ++#~ msgstr "Arquivos personalizados" ++ ++#~ msgid "Detected Files" ++#~ msgstr "Arquivos Detectados" ++ ++#~ msgid "Detected files" ++#~ msgstr "Arquivos detectados" ++ ++#~ msgid "Files to be kept when flashing a new firmware" ++#~ msgstr "Arquivos que devem ser mantidos quando gravar um novo firmware" ++ ++#~ msgid "General" ++#~ msgstr "Geral" ++ ++#~ msgid "" ++#~ "Here you can customize the settings and the functionality of LuCI." ++#~ msgstr "" ++#~ "Aqui você pode personalizar as configurações e funcionalidades do LuCI." ++ ++#~ msgid "Post-commit actions" ++#~ msgstr "Ações após a gravação" ++ ++#~ msgid "" ++#~ "The following files are detected by the system and will be kept " ++#~ "automatically during sysupgrade" ++#~ msgstr "" ++#~ "Os seguintes arquivos foram detectados pelo sistema e serão mantidos " ++#~ "automaticamente durante uma atualização do sistema" ++ ++#~ msgid "" ++#~ "These commands will be executed automatically when a given UCI configuration is committed " ++#~ "allowing changes to be applied instantly." ++#~ msgstr "" ++#~ "Estes comandos são executados automaticamente quando uma determinada " ++#~ "configuração da UCI está gravada, permitindo mudanças a serem aplicadas " ++#~ "instantaneamente." ++ ++#~ msgid "" ++#~ "This is a list of shell glob patterns for matching files and directories " ++#~ "to include during sysupgrade" ++#~ msgstr "" ++#~ "Esta é a lista dos padrões de expressão shell para casar com os arquivos " ++#~ "e diretórios incluídos durante a atualização do sistema" ++ ++#~ msgid "Web UI" ++#~ msgstr "Interface Web" ++ ++#~ msgid "PPTP-Server" ++#~ msgstr "" ++#~ "Servidor PPTP" ++ ++#~ msgid "AHCP Settings" ++#~ msgstr "Configurações AHCP" ++ ++#~ msgid "ARP ping retries" ++#~ msgstr "Retentativa de ping ARP" ++ ++#~ msgid "ATM Settings" ++#~ msgstr "Configurações ATM" ++ ++#~ msgid "Accept Router Advertisements" ++#~ msgstr "Aceita anúncios de roteador" ++ ++#~ msgid "Access point (APN)" ++#~ msgstr "Ponto de acesso (APN)" ++ ++#~ msgid "Additional pppd options" ++#~ msgstr "Opções adicionais do pppd" ++ ++#~ msgid "Allowed range is 1 to FFFF" ++#~ msgstr "A faixa permitida é de 1 a FFFF" ++ ++#~ msgid "Automatic Disconnect" ++#~ msgstr "Desconexão automática" ++ ++#~ msgid "Backup Archive" ++#~ msgstr "Arquivo de Backup" ++ ++#~ msgid "" ++#~ "Configure the local DNS server to use the name servers adverticed by the " ++#~ "PPP peer" ++#~ msgstr "" ++#~ "Configurar o servidor DNS local para usar o servidores de nomes " ++#~ "fornecidos pelo PPP" ++ ++#~ msgid "Connect script" ++#~ msgstr "Script de conexão" ++ ++#~ msgid "Create backup" ++#~ msgstr "Criar backup" ++ ++#~ msgid "Default" ++#~ msgstr "Padrão" ++ ++#~ msgid "Disconnect script" ++#~ msgstr "Script de desconexão" ++ ++#~ msgid "Edit package lists and installation targets" ++#~ msgstr "Editar listas de pacotes e destinos da instalação" ++ ++#~ msgid "Enable 4K VLANs" ++#~ msgstr "Ativar VLANs 4K" ++ ++#~ msgid "Enable IPv6 on PPP link" ++#~ msgstr "Ativar IPv6 na conexão PPP" ++ ++#~ msgid "Firmware image" ++#~ msgstr "Imagem de Firmware" ++ ++#~ msgid "Forward DHCP" ++#~ msgstr "Encaminhar DHCP" ++ ++#~ msgid "Forward broadcasts" ++#~ msgstr "Encaminhar broadcast" ++ ++#~ msgid "HE.net Tunnel ID" ++#~ msgstr "HE.net Tunnel ID" ++ ++#~ msgid "" ++#~ "Here you can backup and restore your router configuration and - if " ++#~ "possible - reset the router to the default settings." ++#~ msgstr "" ++#~ "Aqui você pode fazer o backup e restaurar as configurações do router. " ++#~ "Também pode retornar o router para as configurações padrão." ++ ++#~ msgid "Installation targets" ++#~ msgstr "Destinos da Instalação" ++ ++#~ msgid "Keep configuration files" ++#~ msgstr "Manter arquivos de configuração" ++ ++#~ msgid "Keep-Alive" ++#~ msgstr "Manter conectada" ++ ++#~ msgid "Kernel" ++#~ msgstr "Kernel" ++ ++#~ msgid "" ++#~ "Let pppd replace the current default route to use the PPP interface after " ++#~ "successful connect" ++#~ msgstr "" ++#~ "Permitir o pppd substituir a rota padrão atual e usar a interface PPP " ++#~ "como padrão após a conexão ser efeuada com sucesso" ++ ++#~ msgid "Let pppd run this script after establishing the PPP link" ++#~ msgstr "" ++#~ "Deixar o pppd executar este script após o estabelecimento do enlace PPP" ++ ++#~ msgid "Let pppd run this script before tearing down the PPP link" ++#~ msgstr "Deixar o pppd executar este script antes de terminar o enlace PPP" ++ ++#~ msgid "" ++#~ "Make sure that you provide the correct pin code here or you might lock " ++#~ "your sim card!" ++#~ msgstr "" ++#~ "Certifique-se que forneceu o código PIN correcto aqui, ou pode bloquear o " ++#~ "seu cartão SIM!" ++ ++#~ msgid "" ++#~ "Most of them are network servers, that offer a certain service for your " ++#~ "device or network like shell access, serving webpages like LuCI, doing mesh routing, sending " ++#~ "e-mails, ..." ++#~ msgstr "" ++#~ "A maioria deles são servidores de rede, que oferecem um determinado " ++#~ "serviço para seu equipamento ou rede como acesso shell, servindo páginas " ++#~ "web como o LuCI, " ++#~ "fazendo roteamento, enviando e-mails, ..." ++ ++#~ msgid "Number of failed connection tests to initiate automatic reconnect" ++#~ msgstr "" ++#~ "Número de testes de conexão falhadas para iniciar a reconexão automática" ++ ++#~ msgid "Override Gateway" ++#~ msgstr "Sobrescrever Gateway" ++ ++#~ msgid "PIN code" ++#~ msgstr "Código PIN" ++ ++#~ msgid "PPP Settings" ++#~ msgstr "Configurações do PPP" ++ ++#~ msgid "Package lists" ++#~ msgstr "Listas de pacotes" ++ ++#~ msgid "" ++#~ "Port PVIDs specify the default " ++#~ "VLAN ID added to received untagged frames." ++#~ msgstr "" ++#~ "O PVIDs da porta especifica o ID " ++#~ "padrão da VLAN adicionado a quadros sem etiquetas." ++ ++#~ msgid "Port PVIDs on %q" ++#~ msgstr "PVIDs da Porta em %q" ++ ++#~ msgid "Proceed reverting all settings and resetting to firmware defaults?" ++#~ msgstr "Proceder com a restauração das configurações padrão do firmware?" ++ ++#~ msgid "Processor" ++#~ msgstr "Processador" ++ ++#~ msgid "Radius-Port" ++#~ msgstr "Porta RADIUS" ++ ++#~ msgid "Radius-Server" ++#~ msgstr "Servidor RADIUS" ++ ++#~ msgid "Relay Settings" ++#~ msgstr "Configuração de Relay" ++ ++#~ msgid "Replace default route" ++#~ msgstr "Substituir a rota padrão" ++ ++#~ msgid "Reset router to defaults" ++#~ msgstr "Restaurar as configurações para o padrão" ++ ++#~ msgid "Routing table ID" ++#~ msgstr "ID da tabela de roteamento" ++ ++#~ msgid "" ++#~ "Seconds to wait for the modem to become ready before attempting to connect" ++#~ msgstr "" ++#~ "Segundos de espera para o modem ficar pronto antes de tentar uma conexão" ++ ++#~ msgid "Send Router Solicitiations" ++#~ msgstr "Enviar Solicitações de Roteador" ++ ++#~ msgid "Server IPv4-Address" ++#~ msgstr "Endereço IPv4 do Servidor" ++ ++#~ msgid "Service type" ++#~ msgstr "Tipo de serviço" ++ ++#~ msgid "Services and daemons perform certain tasks on your device." ++#~ msgstr "Serviços executam diversas tarefas no seu equipamento." ++ ++#~ msgid "Settings" ++#~ msgstr "Configurações" ++ ++#~ msgid "Setup wait time" ++#~ msgstr "Configurar tempo de espera" ++ ++#~ msgid "" ++#~ "Sorry. OpenWrt does not support a system upgrade on this platform.
    " ++#~ "You need to manually flash your device." ++#~ msgstr "" ++#~ "Lamentamos, mas o OpenWrt não suporta uma atualização do sistema para " ++#~ "esta plataforma.
    É necessário gravar manualmente seu equipamento." ++ ++#~ msgid "Specify additional command line arguments for pppd here" ++#~ msgstr "" ++#~ "Especifique os argumentos adicionais de linha de comando para o pppd aqui" ++ ++#~ msgid "TTL" ++#~ msgstr "TTL" ++ ++#~ msgid "The device node of your modem, e.g. /dev/ttyUSB0" ++#~ msgstr "O caminho do dispositivo do seu modem, ex. /dev/ttyUSB0" ++ ++#~ msgid "Time (in seconds) after which an unused connection will be closed" ++#~ msgstr "Tempo (em segundos) para fim de uma conexão já não utilizada" ++ ++#~ msgid "Time Server (rdate)" ++#~ msgstr "Servidor de Hora (rdate)" ++ ++#~ msgid "Tunnel Settings" ++#~ msgstr "Configurações de Tunelamento" ++ ++#~ msgid "Update package lists" ++#~ msgstr "Atualizar listas de pacotes" ++ ++#~ msgid "Upload an OpenWrt image file to reflash the device." ++#~ msgstr "Carregar uma imagem OpenWrt para a gravar no roteador." ++ ++#~ msgid "Upload image" ++#~ msgstr "Carregar imagem" ++ ++#~ msgid "Use peer DNS" ++#~ msgstr "Utilizar DNS do parceiro" ++ ++#~ msgid "VLAN %d" ++#~ msgstr "VLAN %d" ++ ++#~ msgid "" ++#~ "You can specify multiple DNS servers here, press enter to add a new " ++#~ "entry. Servers entered here will override automatically assigned ones." ++#~ msgstr "" ++#~ "Você pode especificar aqui múltiplos servidores DNS. Pressione \"enter\" " ++#~ "para adicionar uma nova entrada. Os servidores informados aqui " ++#~ "sobrescreverão automaticamente os designados." ++ ++#~ msgid "" ++#~ "You need to install \"comgt\" for UMTS/GPRS, \"ppp-mod-pppoe\" for PPPoE, " ++#~ "\"ppp-mod-pppoa\" for PPPoA or \"pptp\" for PPtP support" ++#~ msgstr "" ++#~ "Você precisa instalar os pacotes \"comgt\" para usar UMTS/GPRS, \"ppp-mod-" ++#~ "pppoe\" para PPPoE, \"ppp-mod-pppoa\" para PPPoA ou \"pptp\" para o " ++#~ "suporte PPtP" ++ ++#~ msgid "back" ++#~ msgstr "voltar" ++ ++#~ msgid "buffered" ++#~ msgstr "em buffer" ++ ++#~ msgid "cached" ++#~ msgstr "em cache" ++ ++#~ msgid "free" ++#~ msgstr "livre" ++ ++#~ msgid "static" ++#~ msgstr "estático" ++ ++#~ msgid "" ++#~ "LuCI is a collection " ++#~ "of free Lua software including an MVC-Webframework and webinterface for embedded devices. LuCI is licensed under the " ++#~ "Apache-License." ++#~ msgstr "" ++#~ "LuCI é uma colecção " ++#~ "gratuita de programas Lua incluindo um Framework Web MVC e uma Interface Web para micro-" ++#~ "dispositivos. LuCI é " ++#~ "licenciado sob a Licença Apache." ++ ++#~ msgid "SSH-Keys" ++#~ msgstr "Chaves-SSH" ++ ++#~ msgid "" ++#~ "A lightweight HTTP/1.1 webserver written in C and Lua designed to serve " ++#~ "LuCI" ++#~ msgstr "" ++#~ "Um servidor web HTTP/1.1 ligeiro escrito em C e desenvolvido em Lua para " ++#~ "servir LuCI" ++ ++#~ msgid "" ++#~ "A small webserver which can be used to serve LuCI." ++#~ msgstr "" ++#~ "Um pequeno servidor web que pode ser utilizado para servir a interface " ++#~ "LuCI." ++ ++#~ msgid "About" ++#~ msgstr "Sobre" ++ ++#~ msgid "Addresses" ++#~ msgstr "Endereços" ++ ++#~ msgid "Admin Password" ++#~ msgstr "Password do Administrador" ++ ++#~ msgid "Alias" ++#~ msgstr "Configuração IP alternativa" ++ ++#~ msgid "Authentication Realm" ++#~ msgstr "Ãrea de autenticação" ++ ++#~ msgid "Bridge Port" ++#~ msgstr "Porta do interface em ponte" ++ ++#~ msgid "" ++#~ "Change the password of the system administrator (User root)" ++#~ msgstr "" ++#~ "Altera a senha do administrador do sistema (Login root)" ++ ++#~ msgid "Client + WDS" ++#~ msgstr "Cliente (WDS)" ++ ++#~ msgid "Configuration file" ++#~ msgstr "Ficheiro de configuração" ++ ++#~ msgid "Connection timeout" ++#~ msgstr "Esgotado o tempo de ligação" ++ ++#~ msgid "Contributing Developers" ++#~ msgstr "Programadores Contribuintes" ++ ++#~ msgid "DHCP assigned" ++#~ msgstr "DHCP atribuido" ++ ++#~ msgid "Document root" ++#~ msgstr "Diretório raiz" ++ ++#~ msgid "Enable Keep-Alive" ++#~ msgstr "Activar keep-alive" ++ ++#~ msgid "Ethernet Bridge" ++#~ msgstr "Ponte Ethernet" ++ ++#~ msgid "" ++#~ "Here you can paste public SSH-Keys " ++#~ "(one per line) for SSH public-key " ++#~ "authentication." ++#~ msgstr "" ++#~ "Aqui pode colar suas Chaves-SSH " ++#~ "públicas (uma por linha) para a autenticação SSH por chave-pública." ++ ++#~ msgid "ID" ++#~ msgstr "Identificação de interface em ponte" ++ ++#~ msgid "IP Configuration" ++#~ msgstr "Configuração IP" ++ ++#~ msgid "Interface Status" ++#~ msgstr "" ++#~ "Aqui encontra informações sobre o estado actual do sistema, como CPU, frequência do relógio, uso " ++#~ "de memória ou uso da interface de rede de dados." ++ ++#~ msgid "Lead Development" ++#~ msgstr "Equipa de Desenvolvimento" ++ ++#~ msgid "Master" ++#~ msgstr "AP" ++ ++#~ msgid "Master + WDS" ++#~ msgstr "AP+WDS" ++ ++#~ msgid "Not configured" ++#~ msgstr "Não configurado" ++ ++#~ msgid "Password successfully changed" ++#~ msgstr "Senha alterada com sucesso" ++ ++#~ msgid "Plugin path" ++#~ msgstr "Directorio de plugins" ++ ++#~ msgid "Ports" ++#~ msgstr "Portas" ++ ++#~ msgid "Primary" ++#~ msgstr "Primário" ++ ++#~ msgid "Project Homepage" ++#~ msgstr "Página do Projecto" ++ ++#~ msgid "Pseudo Ad-Hoc" ++#~ msgstr "Ahdemo" ++ ++#~ msgid "STP" ++#~ msgstr "STP" ++ ++#~ msgid "Thanks To" ++#~ msgstr "Obrigado a" ++ ++#~ msgid "" ++#~ "The realm which will be displayed at the authentication prompt for " ++#~ "protected pages." ++#~ msgstr "" ++#~ "A área de autenticação (realm) que será mostrada na prompt de " ++#~ "autenticação das páginas protegidas." ++ ++#~ msgid "Unknown Error" ++#~ msgstr "Erro Desconhecido" ++ ++#~ msgid "VLAN" ++#~ msgstr "VLAN" ++ ++#~ msgid "defaults to /etc/httpd.conf" ++#~ msgstr "padrão é /etc/httpd.conf" ++ ++#~ msgid "Package lists updated" ++#~ msgstr "As listas de pacotes foram actualizadas" ++ ++#~ msgid "Upgrade installed packages" ++#~ msgstr "Actualizar os pacotes instalados" ++ ++#~ msgid "" ++#~ "Also kernel or service logfiles can be viewed here to get an overview " ++#~ "over their current state." ++#~ msgstr "" ++#~ "Também os arquivos de logs do kernel ou dos serviços podem ser " ++#~ "consultados aqui para obter uma visão geral sobre o seu estado actual." ++ ++#~ msgid "" ++#~ "Here you can find information about the current system status like CPU clock frequency, memory " ++#~ "usage or network interface data." ++#~ msgstr "" ++#~ "Aqui você pode encontrar informações sobre o estado actual do sistema, " ++#~ "tais como CPU, frequência " ++#~ "do relógio, uso de memória ou da interface de rede de dados." ++ ++#~ msgid "Search file..." ++#~ msgstr "Procurar ficheiro..." ++ ++# "free as in freedom" equivale a "livre de liberdade" não de "grátis" ++#~ msgid "" ++#~ "LuCI is a free, " ++#~ "flexible, and user friendly graphical interface for configuring OpenWrt " ++#~ "Kamikaze." ++#~ msgstr "" ++#~ "O LuCI é um " ++#~ "interface gráfico livre, flexível e fácil de utilizar para configurar o " ++#~ "OpenWrt Kamikaze." ++ ++#~ msgid "And now have fun with your router!" ++#~ msgstr "E agora divirta-se com o seu router!" ++ ++#~ msgid "" ++#~ "As we always want to improve this interface we are looking forward to " ++#~ "your feedback and suggestions." ++#~ msgstr "" ++#~ "Agradecemos os seus comentários e sugestões por forma a podermos " ++#~ "continuar a melhorar este interface." ++ ++#~ msgid "Hello!" ++#~ msgstr "Olá!" ++ ++#~ msgid "" ++#~ "Notice: In LuCI " ++#~ "changes have to be confirmed by clicking Changes - Save & Apply " ++#~ "before being applied." ++#~ msgstr "" ++#~ "Aviso: No LuCI as " ++#~ "alterações devem ser confirmadas clicando em Alterações - Salvar & " ++#~ "Aplicar antes de serem aplicadas." ++ ++#~ msgid "" ++#~ "On the following pages you can adjust all important settings of your " ++#~ "router." ++#~ msgstr "" ++#~ "Nas próximas páginas, pode ajustar todas as definições importantes do seu " ++#~ "router." ++ ++#~ msgid "The LuCI Team" ++#~ msgstr "" ++#~ "A equipa do LuCI" ++ ++#~ msgid "" ++#~ "This is the administration area of LuCI." ++#~ msgstr "" ++#~ "Esta é a área de administração do LuCI." ++ ++#~ msgid "User Interface" ++#~ msgstr "Interface do Utilizador" ++ ++#~ msgid "enable" ++#~ msgstr "activar" ++ ++#, fuzzy ++#~ msgid "(optional)" ++#~ msgstr " (opcional)" ++ ++#~ msgid "DNS-Port" ++#~ msgstr "Porta do DNS" ++ ++#~ msgid "" ++#~ "DNS-Server will be queried in " ++#~ "the order of the resolvfile" ++#~ msgstr "" ++#~ "Servidor DNS será " ++#~ "consultado na ordem do arquivo resolv.conf" ++ ++#~ msgid "" ++#~ "max. DHCP-Leases" ++#~ msgstr "" ++#~ "max. de DHCP-Leases" ++ ++#~ msgid "" ++#~ "max. EDNS0 packet size" ++#~ msgstr "" ++#~ "tamanho max. do pacote EDNS0" ++ ++#~ msgid "AP-Isolation" ++#~ msgstr "Isolamento do AP" ++ ++#~ msgid "Add the Wifi network to physical network" ++#~ msgstr "Adicione a rede Wifi à rede física" ++ ++#~ msgid "Aliases" ++#~ msgstr "Aliases" ++ ++#~ msgid "Clamp Segment Size" ++#~ msgstr "Clamp Segment Size" ++ ++#, fuzzy ++#~ msgid "Create Or Attach Network" ++#~ msgstr "Criar Rede" ++ ++#~ msgid "Devices" ++#~ msgstr "Dispositivos" ++ ++#~ msgid "Don't forward reverse lookups for local networks" ++#~ msgstr "Não encaminhar as pesquisas reversas para redes locais" ++ ++#~ msgid "Enable TFTP-Server" ++#~ msgstr "Activar servidor TFTP" ++ ++#~ msgid "Errors" ++#~ msgstr "Erros" ++ ++#~ msgid "Essentials" ++#~ msgstr "Básico" ++ ++#~ msgid "Expand Hosts" ++#~ msgstr "Expandir Hosts" ++ ++#~ msgid "First leased address" ++#~ msgstr "Primeiro endereço de atribuição" ++ ++#~ msgid "" ++#~ "Fixes problems with unreachable websites, submitting forms or other " ++#~ "unexpected behaviour for some ISPs." ++#~ msgstr "" ++#~ "Resolve problemas com websites indisponíveis, submissão de formulários ou " ++#~ "comportamentos inesperados de alguns ISP's." ++ ++#~ msgid "Hardware Address" ++#~ msgstr "Endereço do Hardware" ++ ++#~ msgid "Here you can configure installed wifi devices." ++#~ msgstr "Aqui pode configurar os dispositivos wifi instalados. " ++ ++#~ msgid "Ignore /etc/hosts" ++#~ msgstr "Ignorar /etc/hosts" ++ ++#~ msgid "Independent (Ad-Hoc)" ++#~ msgstr "Independente (Ad-Hoc)" ++ ++#~ msgid "Internet Connection" ++#~ msgstr "Ligação Internet" ++ ++#~ msgid "Join (Client)" ++#~ msgstr "Cliente (Client)" ++ ++#~ msgid "Leases" ++#~ msgstr "Atribuições" ++ ++#~ msgid "Local Domain" ++#~ msgstr "Domínio Local" ++ ++#~ msgid "Local Network" ++#~ msgstr "Rede Local" ++ ++#~ msgid "Local Server" ++#~ msgstr "Servidor Local" ++ ++#~ msgid "Network Boot Image" ++#~ msgstr "Imagem para o boot remoto (PXE)" ++ ++#~ msgid "" ++#~ "Network Name (ESSID)" ++#~ msgstr "" ++#~ "Nome da Rede (ESSID)" ++ ++#~ msgid "Number of leased addresses" ++#~ msgstr "Número de endereços atribuidos" ++ ++#~ msgid "Perform Actions" ++#~ msgstr "Executar Acções" ++ ++#~ msgid "Prevents Client to Client communication" ++#~ msgstr "Impede a comunicação de Cliente para Cliente" ++ ++#~ msgid "Provide (Access Point)" ++#~ msgstr "Ponto de Acesso (Access Point)" ++ ++#~ msgid "Resolvfile" ++#~ msgstr "Ficheiro resolv.conf" ++ ++#~ msgid "TFTP-Server Root" ++#~ msgstr "Directório raiz do servidor TFTP" ++ ++#~ msgid "TX / RX" ++#~ msgstr "TX / RX" ++ ++#~ msgid "The following changes have been applied" ++#~ msgstr "Foram aplicadas as seguintes alterações " ++ ++#~ msgid "" ++#~ "When flashing a new firmware with LuCI these files will be added to the new firmware " ++#~ "installation." ++#~ msgstr "" ++#~ "Quando gravar um novo firmware com o LuCI estes arquivos serão adicionados ao novo " ++#~ "firmware instalado." ++ ++#, fuzzy ++#~ msgid "Wireless Scan" ++#~ msgstr "Wireless" ++ ++#~ msgid "" ++#~ "With DHCP " ++#~ "network members can automatically receive their network settings (IP-address, netmask, DNS-server, ...)." ++#~ msgstr "" ++#~ "Com o DHCP os membros da rede podem automaticamente receber as suas " ++#~ "configurações de rede (endereço-IP, netmask, servidor-DNS, ...)." ++ ++#~ msgid "" ++#~ "You can run several wifi networks with one device. Be aware that there " ++#~ "are certain hardware and driverspecific restrictions. Normally you can " ++#~ "operate 1 Ad-Hoc or up to 3 Master-Mode and 1 Client-Mode network " ++#~ "simultaneously." ++#~ msgstr "" ++#~ "Pode servir várias redes wifi com o mesmo dispositivo. Esteja ciente de " ++#~ "que existem certas restrições específicas do hardware e do controlador. " ++#~ "Pode normalmente operar 1 rede Ad-Hoc ou até 3 redes AP e 1 Cliente " ++#~ "simultaneamente." ++ ++#~ msgid "" ++#~ "You need to install \"ppp-mod-pppoe\" for PPPoE or \"pptp\" for PPtP " ++#~ "support" ++#~ msgstr "" ++#~ "Precisa de instalar os pacotes \"ppp-mod-pppoe\" para PPPoE ou \"pptp\" " ++#~ "para o suporte PPtP" ++ ++#~ msgid "Zone" ++#~ msgstr "Zona" ++ ++#~ msgid "additional hostfile" ++#~ msgstr "ficheiro de hosts adicional" ++ ++#~ msgid "adds domain names to hostentries in the resolv file" ++#~ msgstr "" ++#~ "Adiciona os nomes dos domínios às entradas de hosts no arquivo resolv.conf" ++ ++#~ msgid "automatically reconnect" ++#~ msgstr "ligação automática" ++ ++#~ msgid "concurrent queries" ++#~ msgstr "Consultas simultâneas" ++ ++#~ msgid "" ++#~ "disable DHCP " ++#~ "for this interface" ++#~ msgstr "" ++#~ "desabilitar DHCP para esta interface" ++ ++#~ msgid "disconnect when idle for" ++#~ msgstr "desligar quando ocioso por" ++ ++#~ msgid "don't cache unknown" ++#~ msgstr "Não fazer cache de desconhecidos" ++ ++#~ msgid "" ++#~ "filter useless DNS-queries of " ++#~ "Windows-systems" ++#~ msgstr "" ++#~ "Filtro de consultas inuteis-DNS de sistemas windows" ++ ++#~ msgid "installed" ++#~ msgstr "instalado" ++ ++#~ msgid "localises the hostname depending on its subnet" ++#~ msgstr "Localizar o hostname dependendo de sua sub-rede" ++ ++#~ msgid "not installed" ++#~ msgstr "não instalado" ++ ++#~ msgid "" ++#~ "prevents caching of negative DNS-replies" ++#~ msgstr "" ++#~ "Impede o cache de respostas-DNS negativas" ++ ++#~ msgid "query port" ++#~ msgstr "porta para consultas" ++ ++#~ msgid "transmitted / received" ++#~ msgstr "transmitido / recebido" ++ ++#, fuzzy ++#~ msgid "Join network" ++#~ msgstr "redes contidas" ++ ++#~ msgid "all" ++#~ msgstr "todos" ++ ++#~ msgid "Code" ++#~ msgstr "Código" ++ ++#~ msgid "Distance" ++#~ msgstr "Distância" ++ ++#~ msgid "Legend" ++#~ msgstr "Legenda" ++ ++#~ msgid "Library" ++#~ msgstr "Biblioteca" ++ ++#~ msgid "see '%s' manpage" ++#~ msgstr "veja sobre '%s' na página de manual (man)" ++ ++#~ msgid "Package Manager" ++#~ msgstr "Gestor de Pacotes" ++ ++#~ msgid "Service" ++#~ msgstr "Serviço" ++ ++#~ msgid "Statistics" ++#~ msgstr "Estatísticas" ++ ++#~ msgid "zone" ++#~ msgstr "Zona" +diff --git a/feeds/luci/modules/luci-base/po/pt/base.po b/feeds/luci/modules/luci-base/po/pt/base.po +new file mode 100644 +index 0000000..1acc852 +--- /dev/null ++++ b/feeds/luci/modules/luci-base/po/pt/base.po +@@ -0,0 +1,4054 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Report-Msgid-Bugs-To: \n" ++"POT-Creation-Date: 2009-05-26 19:03+0200\n" ++"PO-Revision-Date: 2013-09-22 18:50+0200\n" ++"Last-Translator: Low \n" ++"Language-Team: LANGUAGE \n" ++"Language: pt\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n != 1);\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "(%d minute window, %d second interval)" ++msgstr "(janela de %d minutos, intervalo de %d segundos)" ++ ++msgid "(%s available)" ++msgstr "(%s disponível)" ++ ++msgid "(empty)" ++msgstr "(vazio)" ++ ++msgid "(no interfaces attached)" ++msgstr "(não existem interfaces ligadas)" ++ ++msgid "-- Additional Field --" ++msgstr "-- Campo Adicional --" ++ ++msgid "-- Please choose --" ++msgstr "-- Por favor escolha --" ++ ++msgid "-- custom --" ++msgstr "-- personalizado --" ++ ++msgid "-- match by device --" ++msgstr "" ++ ++msgid "-- match by label --" ++msgstr "" ++ ++msgid "1 Minute Load:" ++msgstr "Carga de 1 Minuto:" ++ ++msgid "15 Minute Load:" ++msgstr "Carga de 15 minutos:" ++ ++msgid "5 Minute Load:" ++msgstr "Carga 5 Minutos:" ++ ++msgid "BSSID" ++msgstr "" ++"BSSID" ++ ++msgid "DNS query port" ++msgstr "" ++"Porta de consulta de DNS" ++ ++msgid "DNS server port" ++msgstr "" ++"Porta do servidorDNS" ++ ++msgid "" ++"DNS servers will be queried in the " ++"order of the resolvfile" ++msgstr "" ++"Os servidores de DNS " ++"serão consultados pela ordem no ficheiro resolv" ++ ++msgid "ESSID" ++msgstr "" ++"ESSID" ++ ++msgid "IPv4-Address" ++msgstr "Endereço IPv4" ++ ++msgid "IPv4-Gateway" ++msgstr "Gateway IPv4" ++ ++msgid "IPv4-Netmask" ++msgstr "" ++"Máscara de rede IPv4" ++ ++msgid "" ++"IPv6-Address or Network " ++"(CIDR)" ++msgstr "" ++"IPv6-Endereço ou Rede " ++"(CIDR)" ++ ++msgid "IPv6-Gateway" ++msgstr "Gateway IPv6" ++ ++msgid "IPv6-Suffix (hex)" ++msgstr "" ++ ++msgid "LED Configuration" ++msgstr "Configuração do LED" ++ ++msgid "LED Name" ++msgstr "Nome da LED" ++ ++msgid "MAC-Address" ++msgstr "Endereço MAC" ++ ++msgid "" ++"Max. DHCP leases" ++msgstr "" ++"Max. de concessõesDHCP" ++ ++msgid "" ++"Max. EDNS0 packet size" ++msgstr "" ++"Tamanho Max. do pacote EDNS0 " ++ ++msgid "Max. concurrent queries" ++msgstr "Max. consultas concorrentes" ++ ++msgid "%s - %s" ++msgstr "%s - %s" ++ ++msgid "ADSL" ++msgstr "" ++ ++msgid "ADSL Status" ++msgstr "" ++ ++msgid "AICCU (SIXXS)" ++msgstr "" ++ ++msgid "APN" ++msgstr "APN" ++ ++msgid "AR Support" ++msgstr "Suporte AR" ++ ++msgid "ARP retry threshold" ++msgstr "Limiar de tentativas ARP" ++ ++msgid "ATM Bridges" ++msgstr "Bridges ATM" ++ ++msgid "ATM Virtual Channel Identifier (VCI)" ++msgstr "Identificador Canais Virtuais ATM (VCI)" ++ ++msgid "ATM Virtual Path Identifier (VPI)" ++msgstr "Identificador de Caminho Virtual ATM (VPI)" ++ ++msgid "" ++"ATM bridges expose encapsulated ethernet in AAL5 connections as virtual " ++"Linux network interfaces which can be used in conjunction with DHCP or PPP " ++"to dial into the provider network." ++msgstr "" ++"As bridges ATM expõem o encapsulamento ethernet em ligações AAL5 como uma " ++"interface de Rede Virtual Linux que pode ser usada em conjugação com o DHCP " ++"ou PPP para marcar para a rede ISP." ++ ++msgid "ATM device number" ++msgstr "Número de Dispositivo ATM" ++ ++msgid "AYIYA" ++msgstr "" ++ ++msgid "Access Concentrator" ++msgstr "Concentrador de Acesso" ++ ++msgid "Access Point" ++msgstr "Access Point (AP)" ++ ++msgid "Action" ++msgstr "Acção" ++ ++msgid "Actions" ++msgstr "Acções" ++ ++msgid "Activate this network" ++msgstr "Ativar esta rede" ++ ++msgid "Active IPv4-Routes" ++msgstr "" ++"Rotas-IPv4 ativas" ++ ++msgid "Active IPv6-Routes" ++msgstr "" ++"Rotas-IPv6 ativas" ++ ++msgid "Active Connections" ++msgstr "Ligações Ativas" ++ ++msgid "Active DHCP Leases" ++msgstr "Concessões DHCP Ativas" ++ ++msgid "Active DHCPv6 Leases" ++msgstr "Concessões DHCPv6 Ativas" ++ ++msgid "Ad-Hoc" ++msgstr "Ad-Hoc" ++ ++msgid "Add" ++msgstr "Adicionar" ++ ++msgid "Add local domain suffix to names served from hosts files" ++msgstr "" ++"Adicionar um sufixo de domínio local aos nomes servidos dos ficheiros de " ++"hosts" ++ ++msgid "Add new interface..." ++msgstr "Adicionar uma nova interface..." ++ ++msgid "Additional Hosts files" ++msgstr "Ficheiro Adicional de Hosts" ++ ++msgid "Address" ++msgstr "Endereço" ++ ++msgid "Address to access local relay bridge" ++msgstr "" ++ ++msgid "Administration" ++msgstr "Administração" ++ ++msgid "Advanced Settings" ++msgstr "Definições Avançadas" ++ ++msgid "Alert" ++msgstr "Alerta" ++ ++msgid "Allow SSH password authentication" ++msgstr "" ++"Permitir autenticação SSH por senha" ++ ++msgid "Allow all except listed" ++msgstr "Permitir todos, excepto os listados" ++ ++msgid "Allow listed only" ++msgstr "Permitir somente os listados" ++ ++msgid "Allow localhost" ++msgstr "Permitir localhost" ++ ++msgid "Allow remote hosts to connect to local SSH forwarded ports" ++msgstr "" ++"Permitir que hosts remotos se conectem às portas encaminhadas do SSH local" ++ ++msgid "Allow root logins with password" ++msgstr "Permitir o login como root só com password" ++ ++msgid "Allow the root user to login with password" ++msgstr "Permitir que o utilizador root faça login só com password" ++ ++msgid "" ++"Allow upstream responses in the 127.0.0.0/8 range, e.g. for RBL services" ++msgstr "" ++"Permitir respostas a montante na gama 127.0.0.1/8, p.e. para serviços RBL" ++ ++msgid "" ++"Also see Tunneling Comparison on SIXXS" ++msgstr "" ++ ++msgid "Always announce default router" ++msgstr "" ++ ++msgid "An additional network will be created if you leave this unchecked." ++msgstr "Uma rede adicional será criada se deixar isto desmarcado." ++ ++msgid "Announce as default router even if no public prefix is available." ++msgstr "" ++ ++msgid "Announced DNS domains" ++msgstr "" ++ ++msgid "Announced DNS servers" ++msgstr "" ++ ++msgid "Antenna 1" ++msgstr "Antena 1" ++ ++msgid "Antenna 2" ++msgstr "Antena 2" ++ ++msgid "Antenna Configuration" ++msgstr "Configuração das Antenas" ++ ++msgid "Any zone" ++msgstr "Qualquer zona" ++ ++msgid "Apply" ++msgstr "Aplicar" ++ ++msgid "Applying changes" ++msgstr "A aplicar as alterações" ++ ++msgid "" ++"Assign a part of given length of every public IPv6-prefix to this interface" ++msgstr "" ++ ++msgid "Assign interfaces..." ++msgstr "Atribuir interfaces..." ++ ++msgid "" ++"Assign prefix parts using this hexadecimal subprefix ID for this interface." ++msgstr "" ++ ++msgid "Associated Stations" ++msgstr "Estações Associadas" ++ ++msgid "Atheros 802.11%s Wireless Controller" ++msgstr "Controlador Wireless Atheros 802.11%s" ++ ++msgid "AuthGroup" ++msgstr "" ++ ++msgid "Authentication" ++msgstr "Autenticação" ++ ++msgid "Authoritative" ++msgstr "Autoritário" ++ ++msgid "Authorization Required" ++msgstr "Autorização Requerida" ++ ++msgid "Auto Refresh" ++msgstr "Actualização Automática" ++ ++msgid "Automatic" ++msgstr "" ++ ++msgid "Automatic Homenet (HNCP)" ++msgstr "" ++ ++msgid "Available" ++msgstr "Disponível" ++ ++msgid "Available packages" ++msgstr "Pacotes disponíveis" ++ ++msgid "Average:" ++msgstr "Média:" ++ ++msgid "BSSID" ++msgstr "BSSID" ++ ++msgid "Back" ++msgstr "Voltar" ++ ++msgid "Back to Overview" ++msgstr "Voltar à Visão Global" ++ ++msgid "Back to configuration" ++msgstr "Voltar à configuração" ++ ++msgid "Back to overview" ++msgstr "Voltar à vista global" ++ ++msgid "Back to scan results" ++msgstr "Voltar aos resultados do scan" ++ ++msgid "Background Scan" ++msgstr "Procurar em Segundo Plano" ++ ++msgid "Backup / Flash Firmware" ++msgstr "Backup / Flashar Firmware" ++ ++msgid "Backup / Restore" ++msgstr "Backup / Restauração" ++ ++msgid "Backup file list" ++msgstr "Lista de ficheiros para backup" ++ ++msgid "Bad address specified!" ++msgstr "Endereço mal especificado!" ++ ++msgid "Band" ++msgstr "" ++ ++msgid "Behind NAT" ++msgstr "" ++ ++msgid "" ++"Below is the determined list of files to backup. It consists of changed " ++"configuration files marked by opkg, essential base files and the user " ++"defined backup patterns." ++msgstr "" ++"Abaixo está a lista de ficheiros para backup. Este consiste nos ficheiros de " ++"configuração alterados e marcados pelo opkg, ficheiros base essenciais e " ++"padrões de backup definidos pelo utilizador." ++ ++msgid "Bitrate" ++msgstr "Taxa de bits" ++ ++msgid "Bogus NX Domain Override" ++msgstr "" ++ ++msgid "Bridge" ++msgstr "Bridge" ++ ++msgid "Bridge interfaces" ++msgstr "Ativar brigde nas interfaces" ++ ++msgid "Bridge unit number" ++msgstr "Número de unidade da bridge" ++ ++msgid "Bring up on boot" ++msgstr "Levantar no arranque" ++ ++msgid "Broadcom 802.11%s Wireless Controller" ++msgstr "Controlador Wireless Broadcom 802.11%s" ++ ++msgid "Broadcom BCM%04x 802.11 Wireless Controller" ++msgstr "Controlador Wireless Broadcom BCM%04x 802.11" ++ ++msgid "Buffered" ++msgstr "" ++ ++msgid "Buttons" ++msgstr "Botões" ++ ++msgid "CA certificate; if empty it will be saved after the first connection." ++msgstr "" ++ ++msgid "CPU" ++msgstr "CPU" ++ ++msgid "CPU usage (%)" ++msgstr "Uso da CPU (%)" ++ ++msgid "Cancel" ++msgstr "Cancelar" ++ ++msgid "Category" ++msgstr "" ++ ++msgid "Chain" ++msgstr "Cadeia" ++ ++msgid "Changes" ++msgstr "Alterações" ++ ++msgid "Changes applied." ++msgstr "Alterações aplicadas." ++ ++msgid "Changes the administrator password for accessing the device" ++msgstr "Altera a password de administrador para acesso ao dispositivo" ++ ++msgid "Channel" ++msgstr "Canal" ++ ++msgid "Check" ++msgstr "Verificar" ++ ++msgid "Checksum" ++msgstr "Checksum" ++ ++msgid "" ++"Choose the firewall zone you want to assign to this interface. Select " ++"unspecified to remove the interface from the associated zone or " ++"fill out the create field to define a new zone and attach the " ++"interface to it." ++msgstr "" ++"Escolha a zona de firewall que pretende associar a esta interface. Escolha " ++"não especificado para remover a interface da zona associada ou " ++"coloque em branco o campo criar para definir a nova zona e ligar-" ++"lhe a interface." ++ ++msgid "" ++"Choose the network(s) you want to attach to this wireless interface or fill " ++"out the create field to define a new network." ++msgstr "" ++"Escolha a rede(s) à(s) qual(is) deseja ligar esta interface wireless ou " ++"preencha o campo criar para definir a nova rede." ++ ++msgid "Cipher" ++msgstr "Cifra" ++ ++msgid "" ++"Click \"Generate archive\" to download a tar archive of the current " ++"configuration files. To reset the firmware to its initial state, click " ++"\"Perform reset\" (only possible with squashfs images)." ++msgstr "" ++"Clique em \"Gerar arquivo\" para descarregar o ficheiro tar com os actuais " ++"ficheiros de configuração. Para voltar as definições originais do firmware, " ++"clique \" Fazer reset\" (só possível com imagens squashfs)" ++ ++msgid "Client" ++msgstr "Cliente" ++ ++msgid "Client ID to send when requesting DHCP" ++msgstr "ID de cliente a enviar para pedidos de DHCP" ++ ++msgid "" ++"Close inactive connection after the given amount of seconds, use 0 to " ++"persist connection" ++msgstr "" ++"Fechar ligação inativa após um dado tempo em segundos, usando 0 a ligação é " ++"persistente" ++ ++msgid "Close list..." ++msgstr "Fechar lista..." ++ ++msgid "Collecting data..." ++msgstr "A obter dados..." ++ ++msgid "Command" ++msgstr "Comando" ++ ++msgid "Common Configuration" ++msgstr "Configuração comum" ++ ++msgid "Compression" ++msgstr "Compressão" ++ ++msgid "Configuration" ++msgstr "Configuração" ++ ++msgid "Configuration applied." ++msgstr "Configuração aplicada." ++ ++msgid "Configuration files will be kept." ++msgstr "Os ficheiros de configuração serão mantidos." ++ ++msgid "Confirmation" ++msgstr "Confirmação" ++ ++msgid "Connect" ++msgstr "Ligar" ++ ++msgid "Connected" ++msgstr "Ligado" ++ ++msgid "Connection Limit" ++msgstr "Limite de Ligações" ++ ++msgid "Connection to server fails when TLS cannot be used" ++msgstr "" ++ ++msgid "Connections" ++msgstr "Ligações" ++ ++msgid "Country" ++msgstr "País" ++ ++msgid "Country Code" ++msgstr "Código do País" ++ ++msgid "Cover the following interface" ++msgstr "Abranger a seguinte interface" ++ ++msgid "Cover the following interfaces" ++msgstr "Abranger as seguintes interfaces" ++ ++msgid "Create / Assign firewall-zone" ++msgstr "Criar / Atribuir a uma zona de firewall" ++ ++msgid "Create Interface" ++msgstr "Criar interface" ++ ++msgid "Create a bridge over multiple interfaces" ++msgstr "Criar uma bridge entre múltiplas interfaces " ++ ++msgid "Critical" ++msgstr "Critico" ++ ++msgid "Cron Log Level" ++msgstr "Nível de Log do Cron" ++ ++msgid "Custom Interface" ++msgstr "Interface Personalizada" ++ ++msgid "Custom delegated IPv6-prefix" ++msgstr "" ++ ++msgid "" ++"Customizes the behaviour of the device LEDs if possible." ++msgstr "" ++"Customiza o comportamento dos LEDs, se possível." ++ ++msgid "DHCP Leases" ++msgstr "Concessões DHCP" ++ ++msgid "DHCP Server" ++msgstr "Servidor DHCP" ++ ++msgid "DHCP and DNS" ++msgstr "DHCP e DNS" ++ ++msgid "DHCP client" ++msgstr "Cliente DHCP" ++ ++msgid "DHCP-Options" ++msgstr "Opções DHCP" ++ ++msgid "DHCPv6 Leases" ++msgstr "Concessões DHCPv6" ++ ++msgid "DHCPv6 client" ++msgstr "" ++ ++msgid "DHCPv6-Mode" ++msgstr "" ++ ++msgid "DHCPv6-Service" ++msgstr "" ++ ++msgid "DNS" ++msgstr "DNS" ++ ++msgid "DNS forwardings" ++msgstr "Encaminhamentos DNS" ++ ++msgid "DNS-Label / FQDN" ++msgstr "" ++ ++msgid "DS-Lite AFTR address" ++msgstr "" ++ ++msgid "DUID" ++msgstr "DUID" ++ ++msgid "Debug" ++msgstr "Depurar" ++ ++msgid "Default %d" ++msgstr "" ++ ++msgid "Default gateway" ++msgstr "Gateway predefinido" ++ ++msgid "Default route" ++msgstr "" ++ ++msgid "Default state" ++msgstr "Estado predefinido" ++ ++msgid "Define a name for this network." ++msgstr "Definir um nome para esta rede." ++ ++msgid "" ++"Define additional DHCP options, for example " ++"\"6,192.168.2.1,192.168.2.2\" which advertises different DNS " ++"servers to clients." ++msgstr "" ++"Definir opções adicionais de DHCP, por exemplo " ++"\"6,192.168.2.1,192.168.2.2\" informa os clientes de diferentes " ++"servidores DNS." ++ ++msgid "Delete" ++msgstr "Apagar" ++ ++msgid "Delete this interface" ++msgstr "Apagar esta interface" ++ ++msgid "Delete this network" ++msgstr "Apagar esta rede" ++ ++msgid "Description" ++msgstr "Descrição" ++ ++msgid "Design" ++msgstr "Tema" ++ ++msgid "Destination" ++msgstr "Destino" ++ ++msgid "Device" ++msgstr "Dispositivo" ++ ++msgid "Device Configuration" ++msgstr "Configuração do Dispositivo" ++ ++msgid "Diagnostics" ++msgstr "Diagnósticos" ++ ++msgid "Dial number" ++msgstr "" ++ ++msgid "Directory" ++msgstr "Directório" ++ ++msgid "Disable" ++msgstr "Desativar" ++ ++msgid "" ++"Disable DHCP for " ++"this interface." ++msgstr "" ++"Desativar DHCP para esta interface." ++ ++msgid "Disable DNS setup" ++msgstr "Desativar configuração de DNS" ++ ++msgid "Disable HW-Beacon timer" ++msgstr "Desativar temporizador de HW-Beacon" ++ ++msgid "Disabled" ++msgstr "Desativado" ++ ++msgid "Discard upstream RFC1918 responses" ++msgstr "Descartar respostas RFC1918 a montante" ++ ++msgid "Displaying only packages containing" ++msgstr "Mostrar somente pacotes contendo" ++ ++msgid "Distance Optimization" ++msgstr "Optimização de Distância" ++ ++msgid "Distance to farthest network member in meters." ++msgstr "Distância para o último host da rede em metros." ++ ++msgid "Diversity" ++msgstr "Diversidade" ++ ++msgid "" ++"Dnsmasq is a combined DHCP-Server and DNS-" ++"Forwarder for NAT " ++"firewalls" ++msgstr "" ++"Dnsmasq é um servidor combinado de DHCP e DNS para firewalls NAT" ++ ++msgid "Do not cache negative replies, e.g. for not existing domains" ++msgstr "" ++"Não colocar em cache as respostas negativas, p.e. para dominios inexistentes" ++ ++msgid "Do not forward requests that cannot be answered by public name servers" ++msgstr "" ++"Não encaminhar pedidos que não possam ser respondidos por servidor públicos " ++"de nomes" ++ ++msgid "Do not forward reverse lookups for local networks" ++msgstr "Não encaminhar lookups reversos para as redes locais" ++ ++msgid "Do not send probe responses" ++msgstr "Não enviar respostas a sondas" ++ ++msgid "Domain required" ++msgstr "Requerer domínio" ++ ++msgid "Domain whitelist" ++msgstr "Lista Branca do Dominio" ++ ++msgid "" ++"Don't forward DNS-Requests without " ++"DNS-Name" ++msgstr "" ++"Não encaminhar consultas DNS sem o nome do DNS" ++ ++msgid "Download and install package" ++msgstr "Descarregar e instalar pacote" ++ ++msgid "Download backup" ++msgstr "Descarregar backup" ++ ++msgid "Dropbear Instance" ++msgstr "Instância do Dropbear" ++ ++msgid "" ++"Dropbear offers SSH network shell access " ++"and an integrated SCP server" ++msgstr "" ++"Dropbear oferece um acesso shell seguro à rede SSH e um servidor SCP integrado" ++ ++msgid "Dual-Stack Lite (RFC6333)" ++msgstr "" ++ ++msgid "Dynamic DHCP" ++msgstr "" ++"DHCP " ++"Dinâmico" ++ ++msgid "Dynamic tunnel" ++msgstr "Túnel dinâmico" ++ ++msgid "" ++"Dynamically allocate DHCP addresses for clients. If disabled, only clients " ++"having static leases will be served." ++msgstr "" ++"Alocar dinamicamente endereços DHCP para clientes. Se desativado, só os " ++"clientes com reservas estáticas serão servidos." ++ ++msgid "EAP-Method" ++msgstr "Metodo-EAP" ++ ++msgid "Edit" ++msgstr "Editar" ++ ++msgid "" ++"Edit the raw configuration data above to fix any error and hit \"Save\" to " ++"reload the page." ++msgstr "" ++ ++msgid "Edit this interface" ++msgstr "Editar esta interface" ++ ++msgid "Edit this network" ++msgstr "Editar esta rede" ++ ++msgid "Emergency" ++msgstr "Emergência" ++ ++msgid "Enable" ++msgstr "Ativar" ++ ++msgid "Enable STP" ++msgstr "Ativar STP" ++ ++msgid "Enable HE.net dynamic endpoint update" ++msgstr "Ativar a atualização dinâmica de ponto final HE.net" ++ ++msgid "Enable IPv6 negotiation on the PPP link" ++msgstr "Ativar a negociação IPv6 no link PPP" ++ ++msgid "Enable Jumbo Frame passthrough" ++msgstr "Ativar a passagem de Jumbo Frames" ++ ++msgid "Enable NTP client" ++msgstr "Ativar o cliente NTP" ++ ++msgid "Enable TFTP server" ++msgstr "Ativar o servidor TFTP" ++ ++msgid "Enable VLAN functionality" ++msgstr "Ativar a funcionalidade VLAN" ++ ++msgid "Enable WPS pushbutton, requires WPA(2)-PSK" ++msgstr "" ++ ++msgid "Enable learning and aging" ++msgstr "Ativar aprendizagem e envelhecimento" ++ ++msgid "Enable mirroring of incoming packets" ++msgstr "" ++ ++msgid "Enable mirroring of outgoing packets" ++msgstr "" ++ ++msgid "Enable this mount" ++msgstr "Ativar este mount" ++ ++msgid "Enable this swap" ++msgstr "Ativar esta swap" ++ ++msgid "Enable/Disable" ++msgstr "Ativar/Desativar" ++ ++msgid "Enabled" ++msgstr "Ativado" ++ ++msgid "Enables the Spanning Tree Protocol on this bridge" ++msgstr "Ativa o Spanning Tree nesta bridge" ++ ++msgid "Encapsulation mode" ++msgstr "Modo de encapsulamento" ++ ++msgid "Encryption" ++msgstr "Encriptação" ++ ++msgid "Erasing..." ++msgstr "A apagar..." ++ ++msgid "Error" ++msgstr "Erro" ++ ++msgid "Ethernet Adapter" ++msgstr "Adaptador Ethernet" ++ ++msgid "Ethernet Switch" ++msgstr "Switch Ethernet" ++ ++msgid "Expand hosts" ++msgstr "Expandir hosts" ++ ++msgid "Expires" ++msgstr "Expira" ++ ++#, fuzzy ++msgid "" ++"Expiry time of leased addresses, minimum is 2 minutes (2m)." ++msgstr "" ++"O tempo de caducidade dos endereços concessionados, minimo de 2 minutos " ++"(2m)." ++ ++msgid "External" ++msgstr "" ++ ++msgid "External system log server" ++msgstr "Servidor externo de logs de sistema" ++ ++msgid "External system log server port" ++msgstr "Porta do Servidor externo de logs de sistema" ++ ++msgid "Fast Frames" ++msgstr "Frames Rápidas" ++ ++msgid "File" ++msgstr "Ficheiro" ++ ++msgid "Filename of the boot image advertised to clients" ++msgstr "Nome de ficheiro da imagem de boot a anunciar aos clientes" ++ ++msgid "Filesystem" ++msgstr "Sistema de ficheiros" ++ ++msgid "Filter" ++msgstr "Filtro" ++ ++msgid "Filter private" ++msgstr "Filtrar endereços privados" ++ ++msgid "Filter useless" ++msgstr "Filtro inútil" ++ ++msgid "Find and join network" ++msgstr "Procurar e ligar rede" ++ ++msgid "Find package" ++msgstr "Procurar pacote" ++ ++msgid "Finish" ++msgstr "Terminar" ++ ++msgid "Firewall" ++msgstr "Firewall" ++ ++msgid "Firewall Settings" ++msgstr "Definições da Firewall" ++ ++msgid "Firewall Status" ++msgstr "Estado da Firewall" ++ ++msgid "Firmware Version" ++msgstr "Versão do Firmware" ++ ++msgid "Fixed source port for outbound DNS queries" ++msgstr "Porta fixa de origem para saída das consultas DNS" ++ ++msgid "Flags" ++msgstr "Flags" ++ ++msgid "Flash Firmware" ++msgstr "Gravar Firmware" ++ ++msgid "Flash image..." ++msgstr "Flashar imagem..." ++ ++msgid "Flash new firmware image" ++msgstr "Flashar nova imagem do firmware" ++ ++msgid "Flash operations" ++msgstr "" ++ ++msgid "Flashing..." ++msgstr "A programar...." ++ ++msgid "Force" ++msgstr "Forçar" ++ ++msgid "Force CCMP (AES)" ++msgstr "Forçar CCMP (AES)" ++ ++msgid "Force DHCP on this network even if another server is detected." ++msgstr "Forçar DHCP nesta rede mesmo se outro servidor for detectado." ++ ++msgid "Force TKIP" ++msgstr "Forçar TKIP" ++ ++msgid "Force TKIP and CCMP (AES)" ++msgstr "Forçar TKIP e CCMP (AES)" ++ ++msgid "Forward DHCP traffic" ++msgstr "Encaminhar tráfego DHCP" ++ ++msgid "Forward broadcast traffic" ++msgstr "Encaminhar trafego de broadcast" ++ ++msgid "Forwarding mode" ++msgstr "Modo de encaminhamento" ++ ++msgid "Fragmentation Threshold" ++msgstr "Margem de Fragmentação" ++ ++msgid "Frame Bursting" ++msgstr "Frame Bursting" ++ ++msgid "Free" ++msgstr "Livre" ++ ++msgid "Free space" ++msgstr "Espaço livre" ++ ++msgid "GHz" ++msgstr "GHz" ++ ++msgid "GPRS only" ++msgstr "Só GPRS" ++ ++msgid "Gateway" ++msgstr "Gateway" ++ ++msgid "Gateway ports" ++msgstr "Portas de gateway" ++ ++msgid "General Settings" ++msgstr "Definições Gerais" ++ ++msgid "General Setup" ++msgstr "Configuração Geral" ++ ++msgid "Generate archive" ++msgstr "Gerar arquivo" ++ ++msgid "Generic 802.11%s Wireless Controller" ++msgstr "Controlador Wireless Genérico 802.11%s" ++ ++msgid "Given password confirmation did not match, password not changed!" ++msgstr "" ++"A confirmação de password não corresponde, a password não foi alterada!" ++ ++msgid "Global network options" ++msgstr "" ++ ++msgid "Go to password configuration..." ++msgstr "Ir para a configuração da password" ++ ++msgid "Go to relevant configuration page" ++msgstr "Ir para a página respectiva de configuração" ++ ++msgid "Guest" ++msgstr "" ++ ++msgid "HE.net password" ++msgstr "Password HE.net" ++ ++msgid "HE.net username" ++msgstr "" ++ ++msgid "Handler" ++msgstr "Handler" ++ ++msgid "Hang Up" ++msgstr "Suspender" ++ ++msgid "Heartbeat" ++msgstr "" ++ ++msgid "" ++"Here you can configure the basic aspects of your device like its hostname or " ++"the timezone." ++msgstr "" ++"Aqui pode configurar os aspectos básicos do seu equipamento, como o nome do " ++"host ou o fuso horário." ++ ++msgid "" ++"Here you can paste public SSH-Keys (one per line) for SSH public-key " ++"authentication." ++msgstr "" ++"Aqui pode colar as chaves SSH (uma por linha) para a autenticação SSH por " ++"chave pública." ++ ++msgid "Hermes 802.11b Wireless Controller" ++msgstr "Controlador Wireless Hermes 802.11b" ++ ++msgid "Hide ESSID" ++msgstr "" ++"Ocultar ESSID" ++ ++msgid "Host entries" ++msgstr "Entradas de hosts" ++ ++msgid "Host expiry timeout" ++msgstr "" ++ ++msgid "Host-IP or Network" ++msgstr "" ++"IP do host ou rede" ++ ++msgid "Hostname" ++msgstr "Hostname" ++ ++msgid "Hostname to send when requesting DHCP" ++msgstr "Hostname a enviar quando houver solicitação por DHCP" ++ ++msgid "Hostnames" ++msgstr "Hostnames" ++ ++msgid "Hybrid" ++msgstr "" ++ ++msgid "IP address" ++msgstr "Endereço IP" ++ ++msgid "IPv4" ++msgstr "IPv4" ++ ++msgid "IPv4 Firewall" ++msgstr "Firewall IPv4" ++ ++msgid "IPv4 WAN Status" ++msgstr "Estado WAN IPv4" ++ ++msgid "IPv4 address" ++msgstr "Endereço IPv4" ++ ++msgid "IPv4 and IPv6" ++msgstr "IPv4 e IPv6" ++ ++msgid "IPv4 assignment length" ++msgstr "" ++ ++msgid "IPv4 broadcast" ++msgstr "Broadcast IPv4" ++ ++msgid "IPv4 gateway" ++msgstr "Gateway IPv4" ++ ++msgid "IPv4 netmask" ++msgstr "Máscara IPv4" ++ ++msgid "IPv4 only" ++msgstr "Só IPv4" ++ ++msgid "IPv4 prefix length" ++msgstr "Comprimento do prefixo IPv4" ++ ++msgid "IPv4-Address" ++msgstr "Endereço-IPv4" ++ ++msgid "IPv6" ++msgstr "IPv6" ++ ++msgid "IPv6 Firewall" ++msgstr "Firewall IPv6" ++ ++msgid "IPv6 Neighbours" ++msgstr "" ++ ++msgid "IPv6 Settings" ++msgstr "" ++ ++msgid "IPv6 ULA-Prefix" ++msgstr "" ++ ++msgid "IPv6 WAN Status" ++msgstr "Estado WAN IPv6" ++ ++msgid "IPv6 address" ++msgstr "Endereço IPv6" ++ ++msgid "IPv6 address delegated to the local tunnel endpoint (optional)" ++msgstr "" ++ ++msgid "IPv6 assignment hint" ++msgstr "" ++ ++msgid "IPv6 assignment length" ++msgstr "" ++ ++msgid "IPv6 gateway" ++msgstr "Gateway IPv6" ++ ++msgid "IPv6 only" ++msgstr "Só IPv6" ++ ++msgid "IPv6 prefix" ++msgstr "Prefixo IPv6" ++ ++msgid "IPv6 prefix length" ++msgstr "Comprimento do prefixo IPv6" ++ ++msgid "IPv6 routed prefix" ++msgstr "" ++ ++msgid "IPv6-Address" ++msgstr "Endereço-IPv6" ++ ++msgid "IPv6-in-IPv4 (RFC4213)" ++msgstr "IPv6-em-IPv4 (RFC4213)" ++ ++msgid "IPv6-over-IPv4 (6rd)" ++msgstr "IPv6-sobre-IPv4 (6rd)" ++ ++msgid "IPv6-over-IPv4 (6to4)" ++msgstr "IPv6-sobre-IPv4 (6to4)" ++ ++msgid "Identity" ++msgstr "Identidade" ++ ++msgid "" ++"If specified, mount the device by its UUID instead of a fixed device node" ++msgstr "" ++ ++msgid "" ++"If specified, mount the device by the partition label instead of a fixed " ++"device node" ++msgstr "" ++ ++msgid "If unchecked, no default route is configured" ++msgstr "Se desmarcado, não é configurada uma rota pré-definida" ++ ++msgid "If unchecked, the advertised DNS server addresses are ignored" ++msgstr "Se desmarcado, os endereços servidor DNS anunciados são ignorados " ++ ++msgid "" ++"If your physical memory is insufficient unused data can be temporarily " ++"swapped to a swap-device resulting in a higher amount of usable RAM. Be aware that swapping data is a very " ++"slow process as the swap-device cannot be accessed with the high datarates " ++"of the RAM." ++msgstr "" ++"Se a memória física for insuficiente, os dados poderão ser trocados " ++"temporariamente para um dispositivo swap, resultando em uma maior quantidade " ++"de memória utilizável RAM. Esteja ciente de que a troca de dados (swap) é um processo muito " ++"lento pois o dispositivo swap não pode ser acedido com um nível elevado de " ++"memória RAM." ++ ++msgid "Ignore Hosts files" ++msgstr "Ignorar ficheiros de Hosts" ++ ++msgid "Ignore interface" ++msgstr "Ignorar interface" ++ ++msgid "Ignore resolve file" ++msgstr "Ignorar ficheiro resolv.conf" ++ ++msgid "Image" ++msgstr "Imagem" ++ ++msgid "In" ++msgstr "Entrada" ++ ++msgid "Inactivity timeout" ++msgstr "Tempo de inatividade" ++ ++msgid "Inbound:" ++msgstr "Entrada:" ++ ++msgid "Info" ++msgstr "Info" ++ ++msgid "Initscript" ++msgstr "Script de inicialização" ++ ++msgid "Initscripts" ++msgstr "Scripts de Inicialização" ++ ++msgid "Install" ++msgstr "Instalar" ++ ++msgid "Install iputils-traceroute6 for IPv6 traceroute" ++msgstr "" ++ ++msgid "Install package %q" ++msgstr "Instalar pacote %q" ++ ++msgid "Install protocol extensions..." ++msgstr "Instalar extensões do protocolo..." ++ ++msgid "Installed packages" ++msgstr "Instalar pacotes" ++ ++msgid "Interface" ++msgstr "Interface" ++ ++msgid "Interface Configuration" ++msgstr "Configuração da Interface" ++ ++msgid "Interface Overview" ++msgstr "Visão Geral da Interface" ++ ++msgid "Interface is reconnecting..." ++msgstr "A interface está a religar..." ++ ++msgid "Interface is shutting down..." ++msgstr "A interface está a desligar..." ++ ++msgid "Interface not present or not connected yet." ++msgstr "Interface não presente ou ainda não ligada." ++ ++msgid "Interface reconnected" ++msgstr "Interface religada" ++ ++msgid "Interface shut down" ++msgstr "Desligar interface" ++ ++msgid "Interfaces" ++msgstr "Interfaces" ++ ++msgid "Internal" ++msgstr "" ++ ++msgid "Internal Server Error" ++msgstr "Erro Interno do Servidor" ++ ++msgid "Invalid" ++msgstr "Valor inválido" ++ ++msgid "Invalid VLAN ID given! Only IDs between %d and %d are allowed." ++msgstr "" ++"O ID de VLAN fornecido é inválido! Só os IDs entre %d e %d são permitidos." ++ ++msgid "Invalid VLAN ID given! Only unique IDs are allowed" ++msgstr "O ID de VLAN fornecido é inválido! Só os IDs únicos são permitidos." ++ ++msgid "Invalid username and/or password! Please try again." ++msgstr "Username inválido e/ou a password! Por favor, tente novamente." ++ ++#, fuzzy ++msgid "" ++"It appears that you are trying to flash an image that does not fit into the " ++"flash memory, please verify the image file!" ++msgstr "" ++"A imagem que está a tentar carregar aparenta não caber na flash do " ++"equipamento. Por favor verifique o ficheiro de imagem." ++ ++msgid "Java Script required!" ++msgstr "É necessário Javascript!" ++ ++msgid "Join Network" ++msgstr "Associar Rede" ++ ++msgid "Join Network: Settings" ++msgstr "Associar Rede: Definições" ++ ++msgid "Join Network: Wireless Scan" ++msgstr "Associar Rede: Procurar Redes Wireless" ++ ++msgid "Keep settings" ++msgstr "Manter definições" ++ ++msgid "Kernel Log" ++msgstr "Registo do Kernel" ++ ++msgid "Kernel Version" ++msgstr "Versão do Kernel" ++ ++msgid "Key" ++msgstr "Chave" ++ ++msgid "Key #%d" ++msgstr "Chave #%d" ++ ++msgid "Kill" ++msgstr "Matar" ++ ++msgid "L2TP" ++msgstr "L2TP" ++ ++msgid "L2TP Server" ++msgstr "Servidor L2TP" ++ ++msgid "LCP echo failure threshold" ++msgstr "" ++ ++msgid "LCP echo interval" ++msgstr "Intervalo de echo LCP" ++ ++msgid "LLC" ++msgstr "LLC" ++ ++msgid "Label" ++msgstr "Etiqueta" ++ ++msgid "Language" ++msgstr "Idioma" ++ ++msgid "Language and Style" ++msgstr "Língua e Tema" ++ ++msgid "Leaf" ++msgstr "" ++ ++msgid "Lease validity time" ++msgstr "Tempo de validade da concessão" ++ ++msgid "Leasefile" ++msgstr "Ficheiro de concessões" ++ ++msgid "Leasetime" ++msgstr "Tempo de concessão" ++ ++msgid "Leasetime remaining" ++msgstr "Tempo de atribuição restante" ++ ++msgid "Leave empty to autodetect" ++msgstr "Deixar em branco para auto-detecção" ++ ++msgid "Leave empty to use the current WAN address" ++msgstr "Deixar em branco para usar o endereço WAN actual" ++ ++msgid "Legend:" ++msgstr "Legenda:" ++ ++msgid "Limit" ++msgstr "Limite" ++ ++msgid "Line Attenuation" ++msgstr "" ++ ++msgid "Line Speed" ++msgstr "" ++ ++msgid "Line State" ++msgstr "" ++ ++msgid "Link On" ++msgstr "Link Ativo" ++ ++msgid "" ++"List of DNS servers to forward " ++"requests to" ++msgstr "" ++"Lista de servidores DNS para " ++"onde encaminhar os pedidos" ++ ++msgid "List of domains to allow RFC1918 responses for" ++msgstr "Lista de dominios que permitem respostas RFC1918 para" ++ ++msgid "List of hosts that supply bogus NX domain results" ++msgstr "" ++ ++msgid "Listen only on the given interface or, if unspecified, on all" ++msgstr "" ++"Escutar apenas na interface fornecida ou, se não especificada, em todas" ++ ++msgid "Listening port for inbound DNS queries" ++msgstr "Porta de escuta para entrada de consultas DNS" ++ ++msgid "Load" ++msgstr "Carga" ++ ++msgid "Load Average" ++msgstr "Carga Média" ++ ++msgid "Loading" ++msgstr "A carregar" ++ ++msgid "Local IPv4 address" ++msgstr "Endereço IPv4 Local" ++ ++msgid "Local IPv6 address" ++msgstr "Endereço IPv6 Local" ++ ++msgid "Local Startup" ++msgstr "Arranque Local" ++ ++msgid "Local Time" ++msgstr "Hora Local" ++ ++msgid "Local domain" ++msgstr "Domínio local" ++ ++#, fuzzy ++msgid "" ++"Local domain specification. Names matching this domain are never forwarded " ++"and are resolved from DHCP or hosts files only" ++msgstr "" ++"Especificação de dominio local. Os nomes que correspondam a este dominio " ++"nunca são encaminhados e resolvidos do DHCP ou do ficheiro de hosts" ++ ++msgid "Local domain suffix appended to DHCP names and hosts file entries" ++msgstr "" ++"Sufixos de dominio local a juntar aos nomes DHCP e às entradas do ficheiro " ++"de hosts" ++ ++msgid "Local server" ++msgstr "Servidor local" ++ ++msgid "" ++"Localise hostname depending on the requesting subnet if multiple IPs are " ++"available" ++msgstr "" ++ ++msgid "Localise queries" ++msgstr "Localizar consultas" ++ ++msgid "Locked to channel %d used by: %s" ++msgstr "" ++ ++msgid "Log output level" ++msgstr "Nível de output do log" ++ ++msgid "Log queries" ++msgstr "Registo das consultas" ++ ++msgid "Logging" ++msgstr "" ++ ++msgid "Login" ++msgstr "Login" ++ ++msgid "Logout" ++msgstr "Logout" ++ ++msgid "Lowest leased address as offset from the network address." ++msgstr "" ++ ++msgid "MAC-Address" ++msgstr "Endereço-MAC" ++ ++msgid "MAC-Address Filter" ++msgstr "Filtro de Endereço-MAC" ++ ++msgid "MAC-Filter" ++msgstr "Filtro-MAC" ++ ++msgid "MAC-List" ++msgstr "Lista-MAC" ++ ++msgid "MB/s" ++msgstr "MB/s" ++ ++msgid "MHz" ++msgstr "MHz" ++ ++msgid "MTU" ++msgstr "MTU" ++ ++msgid "" ++"Make sure to clone the root filesystem using something like the commands " ++"below:" ++msgstr "" ++ ++msgid "Maximum Rate" ++msgstr "Taxa Máxima" ++ ++msgid "Maximum allowed number of active DHCP leases" ++msgstr "Número máximo permitido de concessões DHCP ativas" ++ ++msgid "Maximum allowed number of concurrent DNS queries" ++msgstr "Número máximo permitido de consultas DNS permitidas" ++ ++msgid "Maximum allowed size of EDNS.0 UDP packets" ++msgstr "" ++ ++msgid "Maximum amount of seconds to wait for the modem to become ready" ++msgstr "Número máximo de segundos a esperar pelo modem para ficar pronto" ++ ++msgid "Maximum hold time" ++msgstr "Tempo máximo de espera" ++ ++msgid "Maximum number of leased addresses." ++msgstr "Número máximo de endereços concessionados." ++ ++msgid "Mbit/s" ++msgstr "Mbit/s" ++ ++msgid "Memory" ++msgstr "Memória" ++ ++msgid "Memory usage (%)" ++msgstr "Uso de memória (%)" ++ ++msgid "Metric" ++msgstr "Métrica" ++ ++msgid "Minimum Rate" ++msgstr "Taxa Mínima" ++ ++msgid "Minimum hold time" ++msgstr "Tempo de retenção mínimo" ++ ++msgid "Mirror monitor port" ++msgstr "" ++ ++msgid "Mirror source port" ++msgstr "" ++ ++msgid "Missing protocol extension for proto %q" ++msgstr "Falta a extensão de protocolo para o protocolo %q" ++ ++msgid "Mode" ++msgstr "Modo" ++ ++msgid "Model" ++msgstr "" ++ ++msgid "Modem device" ++msgstr "Dispositivo do modem" ++ ++msgid "Modem init timeout" ++msgstr "" ++ ++msgid "Monitor" ++msgstr "Monitor" ++ ++msgid "Mount Entry" ++msgstr "Montar Entrada" ++ ++msgid "Mount Point" ++msgstr "Ponto de Montagem" ++ ++msgid "Mount Points" ++msgstr "Pontos de Montagem" ++ ++msgid "Mount Points - Mount Entry" ++msgstr "" ++ ++msgid "Mount Points - Swap Entry" ++msgstr "" ++ ++msgid "" ++"Mount Points define at which point a memory device will be attached to the " ++"filesystem" ++msgstr "" ++"Pontos de montagem definem em que ponto um dispositivo de memória será " ++"anexado ao sistema de arquivos" ++ ++msgid "Mount options" ++msgstr "" ++ ++msgid "Mount point" ++msgstr "Ponto de montagem" ++ ++msgid "Mounted file systems" ++msgstr "Sistemas de arquivos montados" ++ ++msgid "Move down" ++msgstr "Subir" ++ ++msgid "Move up" ++msgstr "Descer" ++ ++msgid "Multicast Rate" ++msgstr "Taxa de Multicast" ++ ++msgid "Multicast address" ++msgstr "Endereço de multicast" ++ ++msgid "NAS ID" ++msgstr "NAS ID" ++ ++msgid "NDP-Proxy" ++msgstr "" ++ ++msgid "NTP server candidates" ++msgstr "Candidatos a servidor NTP" ++ ++msgid "NTP sync time-out" ++msgstr "" ++ ++msgid "Name" ++msgstr "Nome" ++ ++msgid "Name of the new interface" ++msgstr "Nome da nova interface" ++ ++msgid "Name of the new network" ++msgstr "Nome da nova rede" ++ ++msgid "Navigation" ++msgstr "Navegação" ++ ++msgid "Netmask" ++msgstr "Mascara de rede" ++ ++msgid "Network" ++msgstr "Rede" ++ ++msgid "Network Utilities" ++msgstr "Ferramentas de Rede" ++ ++msgid "Network boot image" ++msgstr "Imagem de arranque via rede" ++ ++msgid "Network without interfaces." ++msgstr "Rede sem interfaces." ++ ++msgid "Next »" ++msgstr "Seguinte »" ++ ++msgid "No DHCP Server configured for this interface" ++msgstr "Sem Servidor DHCP configurado nesta interface" ++ ++msgid "No chains in this table" ++msgstr "Tabela sem chains" ++ ++msgid "No files found" ++msgstr "Não foram encontrados ficheiros" ++ ++msgid "No information available" ++msgstr "Sem informação disponível" ++ ++msgid "No negative cache" ++msgstr "Sem cache negativa" ++ ++msgid "No network configured on this device" ++msgstr "Nenhuma rede configurada no dispositivo" ++ ++msgid "No network name specified" ++msgstr "Nome de rede não especificado" ++ ++msgid "No package lists available" ++msgstr "Não há listas de pacotes disponiveis" ++ ++msgid "No password set!" ++msgstr "Sem password definida!" ++ ++msgid "No rules in this chain" ++msgstr "Sem regras nesta cadeia" ++ ++msgid "No zone assigned" ++msgstr "Sem zona atribuída" ++ ++msgid "Noise" ++msgstr "Ruído" ++ ++msgid "Noise Margin" ++msgstr "" ++ ++msgid "Noise:" ++msgstr "Ruído:" ++ ++msgid "None" ++msgstr "Nenhum" ++ ++msgid "Normal" ++msgstr "Normal" ++ ++msgid "Not Found" ++msgstr "Não encontrado" ++ ++msgid "Not associated" ++msgstr "Não associado" ++ ++msgid "Not connected" ++msgstr "Não ligado" ++ ++msgid "Note: Configuration files will be erased." ++msgstr "Nota: Os ficheiros de configuração serão apagados." ++ ++msgid "Notice" ++msgstr "Reparo" ++ ++msgid "Nslookup" ++msgstr "Nslookup" ++ ++msgid "OK" ++msgstr "OK" ++ ++msgid "OPKG-Configuration" ++msgstr "Configuração-OPKG" ++ ++msgid "Off-State Delay" ++msgstr "Atraso do Off-State" ++ ++msgid "" ++"On this page you can configure the network interfaces. You can bridge " ++"several interfaces by ticking the \"bridge interfaces\" field and enter the " ++"names of several network interfaces separated by spaces. You can also use " ++"VLAN notation " ++"INTERFACE.VLANNR (e.g.: " ++"eth0.1)." ++msgstr "" ++"Nesta página pode configurar as interfaces de rede. Pode ter várias " ++"interfaces do tipo bridge, assinalando o campo \"interfaces bridge\" e " ++"inserir os nomes de várias interfaces de rede separadas por espaços. Pode " ++"também usar a notação para VLAN " ++"INTERFACE.VLANNR (ex.: " ++"eth0.1)." ++ ++msgid "On-State Delay" ++msgstr "Atraso do On-State" ++ ++msgid "One of hostname or mac address must be specified!" ++msgstr "Um nome de host ou endereço MAC deve ser especificado!" ++ ++msgid "One or more fields contain invalid values!" ++msgstr "Um ou mais campos contêm valores inválidos!" ++ ++msgid "One or more required fields have no value!" ++msgstr "Um ou mais campos obrigatórios não têm valores!" ++ ++msgid "Open list..." ++msgstr "Abrir lista..." ++ ++msgid "OpenConnect (CISCO AnyConnect)" ++msgstr "" ++ ++msgid "Operating frequency" ++msgstr "" ++ ++msgid "Option changed" ++msgstr "Opção alterada" ++ ++msgid "Option removed" ++msgstr "Opção removida" ++ ++msgid "Optional, specify to override default server (tic.sixxs.net)" ++msgstr "" ++ ++msgid "Optional, use when the SIXXS account has more than one tunnel" ++msgstr "" ++ ++msgid "Options" ++msgstr "Opções" ++ ++msgid "Other:" ++msgstr "Outro:" ++ ++msgid "Out" ++msgstr "Saída" ++ ++msgid "Outbound:" ++msgstr "Saída:" ++ ++msgid "Outdoor Channels" ++msgstr "Canais de Outdoor" ++ ++msgid "Output Interface" ++msgstr "" ++ ++msgid "Override MAC address" ++msgstr "" ++ ++msgid "Override MTU" ++msgstr "" ++ ++msgid "Override the gateway in DHCP responses" ++msgstr "" ++ ++msgid "" ++"Override the netmask sent to clients. Normally it is calculated from the " ++"subnet that is served." ++msgstr "" ++ ++msgid "Override the table used for internal routes" ++msgstr "" ++ ++msgid "Overview" ++msgstr "Visão Geral" ++ ++msgid "Owner" ++msgstr "Dono" ++ ++msgid "PAP/CHAP password" ++msgstr "Password PAP/CHAP" ++ ++msgid "PAP/CHAP username" ++msgstr "Utilizador PAP/CHAP" ++ ++msgid "PID" ++msgstr "PID" ++ ++msgid "PIN" ++msgstr "PIN" ++ ++msgid "PPP" ++msgstr "PPP" ++ ++msgid "PPPoA Encapsulation" ++msgstr "Encapsulamento PPPoA " ++ ++msgid "PPPoATM" ++msgstr "PPPoATM" ++ ++msgid "PPPoE" ++msgstr "PPPoE" ++ ++msgid "PPtP" ++msgstr "PPtp" ++ ++msgid "Package libiwinfo required!" ++msgstr "O pacote libiwinfo é necessário!" ++ ++msgid "Package lists are older than 24 hours" ++msgstr "As listas de pacotes têm mais de 24 horas" ++ ++msgid "Package name" ++msgstr "Nome do pacote" ++ ++msgid "Packets" ++msgstr "Pacotes" ++ ++msgid "Part of zone %q" ++msgstr "Parte da zona %q" ++ ++msgid "Password" ++msgstr "Senha" ++ ++msgid "Password authentication" ++msgstr "Autenticação por senha" ++ ++msgid "Password of Private Key" ++msgstr "Senha da Chave Privada" ++ ++msgid "Password successfully changed!" ++msgstr "Password alterada com sucesso!" ++ ++msgid "Path" ++msgstr "Directório" ++ ++msgid "Path to CA-Certificate" ++msgstr "Directorio do Certificado CA" ++ ++msgid "Path to Client-Certificate" ++msgstr "Caminho para o Certificado de Cliente" ++ ++msgid "Path to Private Key" ++msgstr "Caminho da Chave Privada" ++ ++msgid "Path to executable which handles the button event" ++msgstr "Caminho do executável que lida com o botão de eventos" ++ ++msgid "Peak:" ++msgstr "Pico:" ++ ++msgid "Perform reboot" ++msgstr "Executar reinicialização" ++ ++msgid "Perform reset" ++msgstr "Executar reset" ++ ++msgid "Phy Rate:" ++msgstr "" ++ ++msgid "Physical Settings" ++msgstr "Definições Físicas" ++ ++msgid "Ping" ++msgstr "Ping" ++ ++msgid "Pkts." ++msgstr "Pkts." ++ ++msgid "Please enter your username and password." ++msgstr "Insira o seu username e password." ++ ++msgid "Please wait: Device rebooting..." ++msgstr "Por favor aguarde: Equipamento a reiniciar..." ++ ++msgid "Policy" ++msgstr "Política" ++ ++msgid "Port" ++msgstr "Porta" ++ ++msgid "Port %d" ++msgstr "Porta %d" ++ ++msgid "Port %d is untagged in multiple VLANs!" ++msgstr "" ++ ++msgid "Port status:" ++msgstr "Estado da porta:" ++ ++msgid "" ++"Presume peer to be dead after given amount of LCP echo failures, use 0 to " ++"ignore failures" ++msgstr "" ++ ++msgid "Prevents client-to-client communication" ++msgstr "Impede a comunicação cliente-a-cliente" ++ ++msgid "Prism2/2.5/3 802.11b Wireless Controller" ++msgstr "Controlador Wireless Prism2/2.5/3 802.11b" ++ ++msgid "Proceed" ++msgstr "Proceder" ++ ++msgid "Processes" ++msgstr "Processos" ++ ++msgid "Prot." ++msgstr "Protocolo" ++ ++msgid "Protocol" ++msgstr "Protocolo" ++ ++msgid "Protocol family" ++msgstr "Família do protocolo" ++ ++msgid "Protocol of the new interface" ++msgstr "Protocolo da nova interface" ++ ++msgid "Protocol support is not installed" ++msgstr "O protocolo suportado não está instalado" ++ ++msgid "Provide NTP server" ++msgstr "" ++ ++msgid "Provide new network" ++msgstr "" ++ ++msgid "Pseudo Ad-Hoc (ahdemo)" ++msgstr "Pseudo Ad-Hoc (ahdemo)" ++ ++msgid "Public prefix routed to this device for distribution to clients." ++msgstr "" ++ ++msgid "Quality" ++msgstr "Qualidade" ++ ++msgid "RTS/CTS Threshold" ++msgstr "RTS/CTS Threshold" ++ ++msgid "RX" ++msgstr "RX" ++ ++msgid "RX Rate" ++msgstr "Taxa RX" ++ ++msgid "RaLink 802.11%s Wireless Controller" ++msgstr "Controlador Wireless RaLink 802.11%s" ++ ++msgid "Radius-Accounting-Port" ++msgstr "Porta-Conta-Radius" ++ ++msgid "Radius-Accounting-Secret" ++msgstr "Segredo-Conta-Radius" ++ ++msgid "Radius-Accounting-Server" ++msgstr "Servidor-Conta-Radius" ++ ++msgid "Radius-Authentication-Port" ++msgstr "Porta-Autenticação-Radius" ++ ++msgid "Radius-Authentication-Secret" ++msgstr "Segredo-Autenticação-Radius" ++ ++msgid "Radius-Authentication-Server" ++msgstr "Servidor-Autenticação-Radius" ++ ++msgid "" ++"Read /etc/ethers to configure the DHCP-Server" ++msgstr "" ++"Ler /etc/ethers para configurar o Servidor-DHCP" ++ ++msgid "" ++"Really delete this interface? The deletion cannot be undone!\\nYou might " ++"lose access to this device if you are connected via this interface." ++msgstr "" ++"Deseja mesmo apagar esta interface? A eliminação não poder desfeita!\n" ++"Pode perde a ligação ao dispositivo, caso esta ligado através desta " ++"interface." ++ ++msgid "" ++"Really delete this wireless network? The deletion cannot be undone!\\nYou " ++"might lose access to this device if you are connected via this network." ++msgstr "" ++"Deseja mesmo apagar esta rede? A eliminação não poder desfeita!\n" ++"Pode perde a ligação ao dispositivo, caso esta ligado através desta rede." ++ ++msgid "Really reset all changes?" ++msgstr "Deseja mesmo limpar todas as alterações?" ++ ++#, fuzzy ++msgid "" ++"Really shut down network?\\nYou might lose access to this device if you are " ++"connected via this interface." ++msgstr "" ++"Deseja mesmo desligar esta rede?\n" ++"Pode perder o acesso ao dispositivo se estiver ligado através desta rede." ++ ++msgid "" ++"Really shutdown interface \"%s\" ?\\nYou might lose access to this device if " ++"you are connected via this interface." ++msgstr "" ++"Deseja mesmo desligar a interface \"%s\" ?\n" ++"Pode perder o acesso ao dispositivo se estiver ligado através desta " ++"interface." ++ ++msgid "Really switch protocol?" ++msgstr "Deseja mesmo trocar o protocolo?" ++ ++msgid "Realtime Connections" ++msgstr "Ligações em Tempo Real" ++ ++msgid "Realtime Graphs" ++msgstr "Gráficos em Tempo Real" ++ ++msgid "Realtime Load" ++msgstr "Carga em Tempo Real" ++ ++msgid "Realtime Traffic" ++msgstr "Tráfego em Tempo Real" ++ ++msgid "Realtime Wireless" ++msgstr "Wireless em Tempo Real" ++ ++msgid "Rebind protection" ++msgstr "Religar protecção" ++ ++msgid "Reboot" ++msgstr "Reiniciar" ++ ++msgid "Rebooting..." ++msgstr "A reiniciar..." ++ ++msgid "Reboots the operating system of your device" ++msgstr "Reinicia o seu dispositivo" ++ ++msgid "Receive" ++msgstr "Receber" ++ ++msgid "Receiver Antenna" ++msgstr "Antena de Recepção" ++ ++msgid "Reconnect this interface" ++msgstr "Reconetar esta interface" ++ ++msgid "Reconnecting interface" ++msgstr "A reconectar interface" ++ ++msgid "References" ++msgstr "Referências" ++ ++msgid "Regulatory Domain" ++msgstr "Domínio Regulatório" ++ ++msgid "Relay" ++msgstr "" ++ ++msgid "Relay Bridge" ++msgstr "" ++ ++msgid "Relay between networks" ++msgstr "" ++ ++msgid "Relay bridge" ++msgstr "" ++ ++msgid "Remote IPv4 address" ++msgstr "Endereço IPv4 remoto" ++ ++msgid "Remove" ++msgstr "Remover" ++ ++msgid "Repeat scan" ++msgstr "Repetir scan" ++ ++msgid "Replace entry" ++msgstr "Substituir entrada" ++ ++msgid "Replace wireless configuration" ++msgstr "Substituir configuração wireless" ++ ++msgid "Request IPv6-address" ++msgstr "" ++ ++msgid "Request IPv6-prefix of length" ++msgstr "" ++ ++msgid "Require TLS" ++msgstr "" ++ ++msgid "Required for certain ISPs, e.g. Charter with DOCSIS 3" ++msgstr "Necessário para certos ISPs, p.ex. Charter with DOCSIS 3" ++ ++msgid "Reset" ++msgstr "Reset" ++ ++msgid "Reset Counters" ++msgstr "Limpar contadores" ++ ++msgid "Reset to defaults" ++msgstr "" ++ ++msgid "Resolv and Hosts Files" ++msgstr "Ficheiros Resolv e Hosts" ++ ++msgid "Resolve file" ++msgstr "" ++ ++msgid "Restart" ++msgstr "Reiniciar" ++ ++msgid "Restart Firewall" ++msgstr "Reiniciar Firewall" ++ ++msgid "Restore backup" ++msgstr "Restaurar backup" ++ ++msgid "Reveal/hide password" ++msgstr "Revelar/esconder password" ++ ++msgid "Revert" ++msgstr "Reverter" ++ ++msgid "Root" ++msgstr "" ++ ++msgid "Root directory for files served via TFTP" ++msgstr "" ++ ++msgid "Root preparation" ++msgstr "" ++ ++msgid "Routed IPv6 prefix for downstream interfaces" ++msgstr "" ++ ++msgid "Router Advertisement-Service" ++msgstr "" ++ ++msgid "Router Password" ++msgstr "Password do Router" ++ ++msgid "Routes" ++msgstr "Rotas" ++ ++msgid "" ++"Routes specify over which interface and gateway a certain host or network " ++"can be reached." ++msgstr "" ++"As rotas especificam através de que interfaces ou gateways podem ser " ++"alcançados determinadas redes ou hosts." ++ ++msgid "Rule #" ++msgstr "Regra #" ++ ++msgid "Run a filesystem check before mounting the device" ++msgstr "" ++"Correr uma verificação do sistema de ficheiros antes de montar um dispositivo" ++ ++msgid "Run filesystem check" ++msgstr "Correr uma verificação do sistema de ficheiros" ++ ++msgid "" ++"SIXXS supports TIC only, for static tunnels using IP protocol 41 (RFC4213) " ++"use 6in4 instead" ++msgstr "" ++ ++msgid "SIXXS-handle[/Tunnel-ID]" ++msgstr "" ++ ++msgid "SSH Access" ++msgstr "Acesso SSH" ++ ++msgid "SSH-Keys" ++msgstr "Chaves-SSH" ++ ++msgid "SSID" ++msgstr "SSID" ++ ++msgid "Save" ++msgstr "Salvar" ++ ++msgid "Save & Apply" ++msgstr "Salvar & Aplicar" ++ ++msgid "Save & Apply" ++msgstr "Salvar & Aplicar" ++ ++msgid "Scan" ++msgstr "Procurar" ++ ++msgid "Scheduled Tasks" ++msgstr "Tarefas Agendadas" ++ ++msgid "Section added" ++msgstr "Secção adicionada" ++ ++msgid "Section removed" ++msgstr "Secção removida" ++ ++msgid "See \"mount\" manpage for details" ++msgstr "" ++ ++msgid "" ++"Send LCP echo requests at the given interval in seconds, only effective in " ++"conjunction with failure threshold" ++msgstr "" ++ ++msgid "Separate Clients" ++msgstr "Isolar Clientes" ++ ++msgid "Separate WDS" ++msgstr "Separar WDS" ++ ++msgid "Server Settings" ++msgstr "" ++ ++msgid "Server password" ++msgstr "" ++ ++msgid "" ++"Server password, enter the specific password of the tunnel when the username " ++"contains the tunnel ID" ++msgstr "" ++ ++msgid "Server username" ++msgstr "" ++ ++msgid "Service Name" ++msgstr "Nome do Serviço" ++ ++msgid "Service Type" ++msgstr "Tipo de Serviço" ++ ++msgid "Services" ++msgstr "Serviços" ++ ++#, fuzzy ++msgid "Set up Time Synchronization" ++msgstr "Configurar Sincronização Horária" ++ ++msgid "Setup DHCP Server" ++msgstr "Configurar Servidor DHCP" ++ ++msgid "Show current backup file list" ++msgstr "Mostrar lista ficheiros para backup" ++ ++msgid "Shutdown this interface" ++msgstr "Desligar esta interface" ++ ++msgid "Shutdown this network" ++msgstr "Desligar esta rede" ++ ++msgid "Signal" ++msgstr "Sinal" ++ ++msgid "Signal:" ++msgstr "Sinal:" ++ ++msgid "Size" ++msgstr "Tamanho" ++ ++msgid "Skip" ++msgstr "Saltar" ++ ++msgid "Skip to content" ++msgstr "Ir para o conteúdo" ++ ++msgid "Skip to navigation" ++msgstr "Ir para a navegação" ++ ++msgid "Slot time" ++msgstr "" ++ ++msgid "Software" ++msgstr "Software" ++ ++msgid "Some fields are invalid, cannot save values!" ++msgstr "Alguns campos são inválidos, não é possível gravar valores!" ++ ++msgid "Sorry, the object you requested was not found." ++msgstr "Lamento, o objecto que pediu não foi encontrado." ++ ++msgid "Sorry, the server encountered an unexpected error." ++msgstr "Lamento, o servidor encontrou um erro inesperado." ++ ++msgid "" ++"Sorry, there is no sysupgrade support present; a new firmware image must be " ++"flashed manually. Please refer to the OpenWrt wiki for device specific " ++"install instructions." ++msgstr "" ++ ++msgid "Sort" ++msgstr "Ordenar" ++ ++msgid "Source" ++msgstr "Origem" ++ ++msgid "Source routing" ++msgstr "" ++ ++msgid "Specifies the button state to handle" ++msgstr "" ++ ++msgid "Specifies the directory the device is attached to" ++msgstr "" ++ ++msgid "Specifies the listening port of this Dropbear instance" ++msgstr "Especifica as portas de escuta desta instância Dropbear" ++ ++msgid "" ++"Specifies the maximum amount of failed ARP requests until hosts are presumed " ++"to be dead" ++msgstr "" ++ ++msgid "" ++"Specifies the maximum amount of seconds after which hosts are presumed to be " ++"dead" ++msgstr "" ++ ++msgid "Specify the secret encryption key here." ++msgstr "" ++ ++msgid "Start" ++msgstr "Iniciar" ++ ++msgid "Start priority" ++msgstr "Prioridade de inicialização" ++ ++msgid "Startup" ++msgstr "" ++ ++msgid "Static IPv4 Routes" ++msgstr "Rotas Estáticas IPv4" ++ ++msgid "Static IPv6 Routes" ++msgstr "Rotas Estáticas IPv6" ++ ++msgid "Static Leases" ++msgstr "Atribuições Estáticas" ++ ++msgid "Static Routes" ++msgstr "Rotas Estáticas" ++ ++msgid "Static WDS" ++msgstr "WDS Estático" ++ ++msgid "Static address" ++msgstr "Endereço estático" ++ ++msgid "" ++"Static leases are used to assign fixed IP addresses and symbolic hostnames " ++"to DHCP clients. They are also required for non-dynamic interface " ++"configurations where only hosts with a corresponding lease are served." ++msgstr "" ++ ++msgid "Status" ++msgstr "Status" ++ ++msgid "Stop" ++msgstr "Parar" ++ ++msgid "Strict order" ++msgstr "Ordem exacta" ++ ++msgid "Submit" ++msgstr "Enviar" ++ ++msgid "Swap" ++msgstr "" ++ ++msgid "Swap Entry" ++msgstr "" ++ ++msgid "Switch" ++msgstr "Switch" ++ ++msgid "Switch %q" ++msgstr "" ++ ++msgid "Switch %q (%s)" ++msgstr "" ++ ++msgid "Switch protocol" ++msgstr "" ++ ++msgid "Sync with browser" ++msgstr "Sincronizar com o browser" ++ ++msgid "Synchronizing..." ++msgstr "A sincronizar..." ++ ++msgid "System" ++msgstr "Sistema" ++ ++msgid "System Log" ++msgstr "Registo do Sistema" ++ ++msgid "System Properties" ++msgstr "Propriedades do Sistema" ++ ++msgid "System log buffer size" ++msgstr "" ++ ++msgid "TCP:" ++msgstr "TCP:" ++ ++msgid "TFTP Settings" ++msgstr "Definições TFTP" ++ ++msgid "TFTP server root" ++msgstr "Raíz do servidor TFTP" ++ ++msgid "TX" ++msgstr "TX" ++ ++msgid "TX Rate" ++msgstr "" ++ ++msgid "Table" ++msgstr "Tabela" ++ ++msgid "Target" ++msgstr "Destino" ++ ++msgid "Terminate" ++msgstr "Terminar" ++ ++msgid "" ++"The Device Configuration section covers physical settings of the " ++"radio hardware such as channel, transmit power or antenna selection which " ++"are shared among all defined wireless networks (if the radio hardware is " ++"multi-SSID capable). Per network settings like encryption or operation mode " ++"are grouped in the Interface Configuration." ++msgstr "" ++ ++msgid "" ++"The libiwinfo-lua package is not installed. You must install this " ++"component for working wireless configuration!" ++msgstr "" ++"O pacote libiwinfo-lua não está instalado. Precisa de instalar este " ++"pacote para que a configuração wireless funcione!" ++ ++msgid "" ++"The HE.net endpoint update configuration changed, you must now use the plain " ++"username instead of the user ID!" ++msgstr "" ++ ++msgid "" ++"The IPv6 prefix assigned to the provider, usually ends with ::" ++msgstr "" ++"O prefixo IPv6 atribuído ao provider, habitualmente termina com ::" ++ ++msgid "" ++"The allowed characters are: A-Z, a-z, 0-9 and _" ++msgstr "" ++"Os caracteres permitidos são: A-Z, a-z, 0-9 e _" ++ ++msgid "The configuration file could not be loaded due to the following error:" ++msgstr "" ++ ++msgid "" ++"The device file of the memory or partition (e.g." ++" /dev/sda1)" ++msgstr "" ++"O arquivo do dispositivo de memória ou da partição (ex. /dev/sda1)" ++ ++msgid "" ++"The filesystem that was used to format the memory (e.g. ext3)" ++msgstr "" ++"O sistema que foi usado para formatar a memória (ex. ext3)" ++ ++msgid "" ++"The flash image was uploaded. Below is the checksum and file size listed, " ++"compare them with the original file to ensure data integrity.
    Click " ++"\"Proceed\" below to start the flash procedure." ++msgstr "" ++"A imagem foi carregada. Abaixo está o checksum e o tamanho dos ficheiros, " ++"compare com o ficheiro original para assegurar a integração de dados.
    " ++"Click em \"Proceder\" para iniciar o procedimento." ++ ++msgid "The following changes have been committed" ++msgstr "As seguintes alterações foram escritas" ++ ++msgid "The following changes have been reverted" ++msgstr "Foram recuperadas as seguintes alterações " ++ ++msgid "The following rules are currently active on this system." ++msgstr "As seguintes regras estão actualmente acivas neste sistema." ++ ++msgid "The given network name is not unique" ++msgstr "O nome dado não é único" ++ ++#, fuzzy ++msgid "" ++"The hardware is not multi-SSID capable and the existing configuration will " ++"be replaced if you proceed." ++msgstr "" ++"O hardware não é comporta multi-SSIDs a configuração será substituída se " ++"prosseguir." ++ ++msgid "" ++"The length of the IPv4 prefix in bits, the remainder is used in the IPv6 " ++"addresses." ++msgstr "" ++"O tamanho do perfico IPv4 em bits, o restante é usado em endereços IPv6." ++ ++msgid "The length of the IPv6 prefix in bits" ++msgstr "O comprimento do prefixo IPv6 em bits" ++ ++msgid "" ++"The network ports on this device can be combined to several VLANs in which computers can " ++"communicate directly with each other. VLANs are often used to separate different network " ++"segments. Often there is by default one Uplink port for a connection to the " ++"next greater network like the internet and other ports for a local network." ++msgstr "" ++"As portas de rede neste dispositivo podem ser combinadas com várias VLANs onde os computadores podem " ++"comunicar directamente entre eles. VLANs são muito utilizadas para separar dois segmentos de rede " ++"diferentes. Muitas vezes existe por defeito uma porta de Uplink para uma " ++"ligação para a rede acima como a internet ou outras portas de uma rede local." ++ ++msgid "The selected protocol needs a device assigned" ++msgstr "O protocolo escolhido precisa de um dispositivo atribuído." ++ ++msgid "" ++"The system is erasing the configuration partition now and will reboot itself " ++"when finished." ++msgstr "" ++"O sistema está agora a limpar a partição de configuração e irá reiniciar-se " ++"quando terminar." ++ ++#, fuzzy ++msgid "" ++"The system is flashing now.
    DO NOT POWER OFF THE DEVICE!
    Wait a " ++"few minutes before you try to reconnect. It might be necessary to renew the " ++"address of your computer to reach the device again, depending on your " ++"settings." ++msgstr "" ++"O sistema está a carregar o firmware para a flash.
    NÃO DESLIGUE O " ++"EQUIPAMENTO!
    Espere alguns minutos até tentar uma ligação. Dependendo " ++"da sua configuração, ode ser necessário renovar o endereço do seu computador " ++"para poder ligar novamente ao router." ++ ++msgid "" ++"The tunnel end-point is behind NAT, defaults to disabled and only applies to " ++"AYIYA" ++msgstr "" ++ ++msgid "" ++"The uploaded image file does not contain a supported format. Make sure that " ++"you choose the generic image format for your platform." ++msgstr "" ++"A imagem carregada não contém um formato suportado. Confirme que escolhe uma " ++"imagem genérica para a sua plataforma." ++ ++msgid "There are no active leases." ++msgstr "Não há concessões ativas." ++ ++msgid "There are no pending changes to apply!" ++msgstr "Não há alterações pendentes para aplicar!" ++ ++msgid "There are no pending changes to revert!" ++msgstr "Não há alterações pendentes para reverter!" ++ ++msgid "There are no pending changes!" ++msgstr "Não há alterações pendentes!" ++ ++msgid "" ++"There is no device assigned yet, please attach a network device in the " ++"\"Physical Settings\" tab" ++msgstr "" ++"Ainda não há um dispositivo atribuído, por favor ligue um dispositivo de " ++"rede nas \"Definições Físicas\"" ++ ++msgid "" ++"There is no password set on this router. Please configure a root password to " ++"protect the web interface and enable SSH." ++msgstr "" ++"Não há uma password definida neste router. Por favor defina uma senha de " ++"root para proteger a interface web e ativar o SSH." ++ ++msgid "This IPv4 address of the relay" ++msgstr "" ++ ++msgid "" ++"This is a list of shell glob patterns for matching files and directories to " ++"include during sysupgrade. Modified files in /etc/config/ and certain other " ++"configurations are automatically preserved." ++msgstr "" ++ ++msgid "" ++"This is either the \"Update Key\" configured for the tunnel or the account " ++"password if no update key has been configured" ++msgstr "" ++ ++msgid "" ++"This is the content of /etc/rc.local. Insert your own commands here (in " ++"front of 'exit 0') to execute them at the end of the boot process." ++msgstr "" ++"Este é o conteúdo de /etc/rc.local. Insira os seus próprios comandos aqui " ++"(antes de 'exit 0') para executá-los no final do processo de arranque." ++ ++msgid "" ++"This is the local endpoint address assigned by the tunnel broker, it usually " ++"ends with :2" ++msgstr "" ++ ++msgid "" ++"This is the only DHCP in the local network" ++msgstr "" ++"Este é o único DHCP na rede local" ++ ++msgid "This is the plain username for logging into the account" ++msgstr "" ++ ++msgid "" ++"This is the prefix routed to you by the tunnel broker for use by clients" ++msgstr "" ++ ++msgid "This is the system crontab in which scheduled tasks can be defined." ++msgstr "Este é o sistema de agendamento de tarefas." ++ ++msgid "" ++"This is usually the address of the nearest PoP operated by the tunnel broker" ++msgstr "" ++ ++msgid "" ++"This list gives an overview over currently running system processes and " ++"their status." ++msgstr "" ++"Esta lista fornece uma visão geral sobre os processos em execução no sistema." ++ ++msgid "This page allows the configuration of custom button actions" ++msgstr "" ++"Esta página permite a configuração de botões para acções personalizadas." ++ ++msgid "This page gives an overview over currently active network connections." ++msgstr "Esta página fornece informações sobre as ligações de rede ativas." ++ ++msgid "This section contains no values yet" ++msgstr "Esta secção ainda não contêm valores" ++ ++msgid "Time Synchronization" ++msgstr "Sincronização Horária" ++ ++msgid "Time Synchronization is not configured yet." ++msgstr "A sincronização horária ainda não está configurada." ++ ++msgid "Timezone" ++msgstr "Fuso Horário" ++ ++msgid "" ++"To restore configuration files, you can upload a previously generated backup " ++"archive here." ++msgstr "" ++"Para restaurar os ficheiros de configuração, pode carregar aqui um ficheiro " ++"de backup gerado anteriormente." ++ ++msgid "Total Available" ++msgstr "Total Disponível" ++ ++msgid "Traceroute" ++msgstr "Traceroute" ++ ++msgid "Traffic" ++msgstr "Tráfego" ++ ++msgid "Transfer" ++msgstr "Transferências" ++ ++msgid "Transmission Rate" ++msgstr "Taxa de Transmissão" ++ ++msgid "Transmit" ++msgstr "Transmitir" ++ ++msgid "Transmit Power" ++msgstr "Potência de Transmissão" ++ ++msgid "Transmitter Antenna" ++msgstr "Antena de Transmissão" ++ ++msgid "Trigger" ++msgstr "Trigger" ++ ++msgid "Trigger Mode" ++msgstr "Modo de Trigger" ++ ++msgid "Tunnel ID" ++msgstr "ID do Túnel" ++ ++msgid "Tunnel Interface" ++msgstr "Interface de Túnel" ++ ++msgid "Tunnel Link" ++msgstr "" ++ ++msgid "Tunnel broker protocol" ++msgstr "" ++ ++msgid "Tunnel setup server" ++msgstr "" ++ ++msgid "Tunnel type" ++msgstr "" ++ ++msgid "Turbo Mode" ++msgstr "Modo Turbo" ++ ++msgid "Tx-Power" ++msgstr "Potência de Tx" ++ ++msgid "Type" ++msgstr "Tipo" ++ ++msgid "UDP:" ++msgstr "UDP:" ++ ++msgid "UMTS only" ++msgstr "Só UMTS" ++ ++msgid "UMTS/GPRS/EV-DO" ++msgstr "UMTS/GPRS/EV-DO" ++ ++msgid "USB Device" ++msgstr "Dispositivo USB" ++ ++msgid "UUID" ++msgstr "UUID" ++ ++msgid "Unable to dispatch" ++msgstr "" ++ ++msgid "Unknown" ++msgstr "Desconhecido" ++ ++msgid "Unknown Error, password not changed!" ++msgstr "Erro Desconhecido, a password não foi alterada!" ++ ++msgid "Unmanaged" ++msgstr "Não gerido" ++ ++msgid "Unsaved Changes" ++msgstr "Alterações não Guardadas" ++ ++msgid "Unsupported protocol type." ++msgstr "Tipo de protocolo não suportado." ++ ++msgid "Update lists" ++msgstr "Actualizar listas" ++ ++msgid "" ++"Upload a sysupgrade-compatible image here to replace the running firmware. " ++"Check \"Keep settings\" to retain the current configuration (requires an " ++"OpenWrt compatible firmware image)." ++msgstr "" ++ ++msgid "Upload archive..." ++msgstr "Carregar arquivo..." ++ ++msgid "Uploaded File" ++msgstr "Ficheiro carregado" ++ ++msgid "Uptime" ++msgstr "Uptime" ++ ++msgid "Use /etc/ethers" ++msgstr "Usar /etc/ethers" ++ ++msgid "Use DHCP gateway" ++msgstr "Usar a gateway do DHCP" ++ ++msgid "Use DNS servers advertised by peer" ++msgstr "Usar os servidores DNS fornecidos pelo parceiro" ++ ++msgid "Use ISO/IEC 3166 alpha2 country codes." ++msgstr "" ++ ++msgid "Use MTU on tunnel interface" ++msgstr "" ++ ++msgid "Use TTL on tunnel interface" ++msgstr "" ++ ++msgid "Use as external overlay (/overlay)" ++msgstr "" ++ ++msgid "Use as root filesystem (/)" ++msgstr "" ++ ++msgid "Use broadcast flag" ++msgstr "" ++ ++msgid "Use builtin IPv6-management" ++msgstr "" ++ ++msgid "Use custom DNS servers" ++msgstr "Usar servidores DNS personalizados" ++ ++msgid "Use default gateway" ++msgstr "Usar gateway pre-definida" ++ ++msgid "Use gateway metric" ++msgstr "" ++ ++msgid "Use routing table" ++msgstr "Usar tabela de roteamento" ++ ++msgid "" ++"Use the Add Button to add a new lease entry. The MAC-Address indentifies the host, the IPv4-Address specifies to the fixed " ++"address to use and the Hostname is assigned as symbolic name to the " ++"requesting host." ++msgstr "" ++ ++msgid "Used" ++msgstr "Usado" ++ ++msgid "Used Key Slot" ++msgstr "" ++ ++msgid "User certificate (PEM encoded)" ++msgstr "" ++ ++msgid "User key (PEM encoded)" ++msgstr "" ++ ++msgid "Username" ++msgstr "Utilizador" ++ ++msgid "VC-Mux" ++msgstr "" ++ ++msgid "VLAN Interface" ++msgstr "Interface VLAN" ++ ++msgid "VLANs on %q" ++msgstr "VLANs em %q" ++ ++msgid "VLANs on %q (%s)" ++msgstr "VLANs em %q (%s)" ++ ++msgid "VPN Server" ++msgstr "Servidor VPN" ++ ++msgid "VPN Server port" ++msgstr "" ++ ++msgid "VPN Server's certificate SHA1 hash" ++msgstr "" ++ ++msgid "Vendor Class to send when requesting DHCP" ++msgstr "" ++ ++msgid "Verbose" ++msgstr "" ++ ++msgid "Verbose logging by aiccu daemon" ++msgstr "" ++ ++msgid "Verify" ++msgstr "Verificar" ++ ++msgid "Version" ++msgstr "Versão" ++ ++msgid "WDS" ++msgstr "WDS" ++ ++msgid "WEP Open System" ++msgstr "Sistema Aberto WEP" ++ ++msgid "WEP Shared Key" ++msgstr "Chave partilhada WEP" ++ ++msgid "WEP passphrase" ++msgstr "Palavra-Passe WEP" ++ ++msgid "WMM Mode" ++msgstr "Modo WMM" ++ ++msgid "WPA passphrase" ++msgstr "Palavra-Passe WPA" ++ ++msgid "" ++"WPA-Encryption requires wpa_supplicant (for client mode) or hostapd (for AP " ++"and ad-hoc mode) to be installed." ++msgstr "" ++"A encriptação-WPA necessita do wpa_supplicant (para modo cliente) ou do " ++"hostapd (para modo AP ou ah-hoc) esteja instalado." ++ ++msgid "" ++"Wait for NTP sync that many seconds, seting to 0 disables waiting (optional)" ++msgstr "" ++ ++msgid "Waiting for changes to be applied..." ++msgstr "A aguardar que as mudanças sejam aplicadas..." ++ ++msgid "Waiting for command to complete..." ++msgstr "A aguardar que o comando termine..." ++ ++msgid "Warning" ++msgstr "Aviso" ++ ++msgid "Warning: There are unsaved changes that will be lost while rebooting!" ++msgstr "" ++"Aviso: Existem alterações não salvas que serão perdidas durante a " ++"reinicialização!" ++ ++msgid "Whether to create an IPv6 default route over the tunnel" ++msgstr "" ++ ++msgid "Whether to route only packets from delegated prefixes" ++msgstr "" ++ ++msgid "Width" ++msgstr "" ++ ++msgid "Wifi" ++msgstr "Wifi" ++ ++msgid "Wireless" ++msgstr "Rede Wireless" ++ ++msgid "Wireless Adapter" ++msgstr "Adaptador Wireless" ++ ++msgid "Wireless Network" ++msgstr "Rede Wireless" ++ ++msgid "Wireless Overview" ++msgstr "Vista Global Wireless" ++ ++msgid "Wireless Security" ++msgstr "Segurança Wireless" ++ ++msgid "Wireless is disabled or not associated" ++msgstr "Wireless desativada ou não associada" ++ ++msgid "Wireless is restarting..." ++msgstr "A Wireless está a reiniciar..." ++ ++msgid "Wireless network is disabled" ++msgstr "Wireless está desativado." ++ ++msgid "Wireless network is enabled" ++msgstr "A rede wireless está ativada" ++ ++msgid "Wireless restarted" ++msgstr "Rede wireless reiniciada" ++ ++msgid "Wireless shut down" ++msgstr "Desligar wireless" ++ ++msgid "Write received DNS requests to syslog" ++msgstr "Escrever os pedidos de DNS para o syslog" ++ ++msgid "XR Support" ++msgstr "Suporte XR" ++ ++msgid "" ++"You can enable or disable installed init scripts here. Changes will applied " ++"after a device reboot.
    Warning: If you disable essential init " ++"scripts like \"network\", your device might become inaccessible!" ++msgstr "" ++"Você pode ativar ou desativar os scripts de inicialização instalados aqui. " ++"As mudanças serão aplicadas após a reinicialização do equipamento.
    Aviso: Se você desativar algum script de inicialização essencial " ++"como por exemplo \"rede/network\", o dispositivo poderá tornar-se " ++"inacessível!" ++ ++msgid "" ++"You must enable Java Script in your browser or LuCI will not work properly." ++msgstr "" ++"Tem de activar o Java Script no seu browser ou a LuCI não funcionará " ++"corretamente." ++ ++msgid "" ++"Your Internet Explorer is too old to display this page correctly. Please " ++"upgrade it to at least version 7 or use another browser like Firefox, Opera " ++"or Safari." ++msgstr "" ++ ++msgid "any" ++msgstr "qualquer" ++ ++msgid "auto" ++msgstr "automático" ++ ++#, fuzzy ++msgid "automatic" ++msgstr "estático" ++ ++msgid "baseT" ++msgstr "baseT" ++ ++msgid "bridged" ++msgstr "" ++ ++msgid "create:" ++msgstr "criar:" ++ ++msgid "creates a bridge over specified interface(s)" ++msgstr "cria uma bridge sobre determinada(s) interface(s)" ++ ++msgid "dB" ++msgstr "dB" ++ ++msgid "dBm" ++msgstr "dBm" ++ ++msgid "disable" ++msgstr "desativar" ++ ++msgid "disabled" ++msgstr "" ++ ++msgid "expired" ++msgstr "expirou" ++ ++msgid "" ++"file where given DHCP-leases will be stored" ++msgstr "" ++"Ficheiro onde as atribuições DHCP são armazenadas" ++ ++msgid "forward" ++msgstr "" ++ ++msgid "full-duplex" ++msgstr "full-duplex" ++ ++msgid "half-duplex" ++msgstr "half-duplex" ++ ++msgid "help" ++msgstr "ajuda" ++ ++msgid "hidden" ++msgstr "escondido" ++ ++msgid "hybrid mode" ++msgstr "" ++ ++msgid "if target is a network" ++msgstr "se o destino for uma rede" ++ ++msgid "input" ++msgstr "entrada" ++ ++msgid "kB" ++msgstr "kB" ++ ++msgid "kB/s" ++msgstr "kB/s" ++ ++msgid "kbit/s" ++msgstr "kbit/s" ++ ++msgid "local DNS file" ++msgstr "" ++"Ficheiro local de DNS" ++ ++msgid "minimum 1280, maximum 1480" ++msgstr "" ++ ++msgid "navigation Navigation" ++msgstr "" ++ ++msgid "no" ++msgstr "não" ++ ++msgid "no link" ++msgstr "sem link" ++ ++msgid "none" ++msgstr "nenhum" ++ ++msgid "not present" ++msgstr "" ++ ++msgid "off" ++msgstr "desligado" ++ ++msgid "on" ++msgstr "ligado" ++ ++msgid "open" ++msgstr "abrir" ++ ++msgid "overlay" ++msgstr "" ++ ++msgid "relay mode" ++msgstr "" ++ ++msgid "routed" ++msgstr "" ++ ++msgid "server mode" ++msgstr "" ++ ++msgid "skiplink1 Skip to navigation" ++msgstr "" ++ ++msgid "skiplink2 Skip to content" ++msgstr "" ++ ++msgid "stateful-only" ++msgstr "" ++ ++msgid "stateless" ++msgstr "" ++ ++msgid "stateless + stateful" ++msgstr "" ++ ++msgid "tagged" ++msgstr "" ++ ++msgid "unknown" ++msgstr "desconhecido" ++ ++msgid "unlimited" ++msgstr "ilimitado" ++ ++msgid "unspecified" ++msgstr "não especificado" ++ ++msgid "unspecified -or- create:" ++msgstr "" ++ ++msgid "untagged" ++msgstr "" ++ ++msgid "yes" ++msgstr "sim" ++ ++msgid "« Back" ++msgstr "« Voltar" ++ ++#~ msgid "" ++#~ "Always use 40MHz channels even if the secondary channel overlaps. Using " ++#~ "this option does not comply with IEEE 802.11n-2009!" ++#~ msgstr "" ++#~ "Usar sempre os canais de 40MHz mesmo se o segundo canal se sobrepuser. " ++#~ "Usando esta opção não obdece com IEEE 802.11n-2009!" ++ ++#~ msgid "Cached" ++#~ msgstr "Em cache" ++ ++#~ msgid "Force 40MHz mode" ++#~ msgstr "Forçar modo 40MHz" ++ ++#~ msgid "Frequency Hopping" ++#~ msgstr "Salto de Frequência" ++ ++#~ msgid "Locked to channel %d used by %s" ++#~ msgstr "Bloqueado ao canal %d usado por %s" ++ ++#~ msgid "HE.net user ID" ++#~ msgstr "ID utilizador HE.net" ++ ++#~ msgid "40MHz 2nd channel above" ++#~ msgstr "40 Mhz 2.º canal acima" ++ ++#~ msgid "40MHz 2nd channel below" ++#~ msgstr "40MHz 2.º canal abaixo" ++ ++#~ msgid "Accept router advertisements" ++#~ msgstr "Aceitar os avisos do router" ++ ++#~ msgid "Advertise IPv6 on network" ++#~ msgstr "Anúnciar IPv6 na rede" ++ ++#~ msgid "Advertised network ID" ++#~ msgstr "ID da rede anunciada" ++ ++#~ msgid "Allowed range is 1 to 65535" ++#~ msgstr "O intervalo permitido é de 1 até 65535" ++ ++#~ msgid "HT capabilities" ++#~ msgstr "Capacidades HT" ++ ++#~ msgid "HT mode" ++#~ msgstr "Modo HT" ++ ++#~ msgid "Router Model" ++#~ msgstr "Modelo do Router" ++ ++#~ msgid "Router Name" ++#~ msgstr "Nome do Router" ++ ++#~ msgid "Active Leases" ++#~ msgstr "Atribuições Activas" ++ ++#~ msgid "MAC" ++#~ msgstr "MAC" ++ ++#~ msgid "Encr." ++#~ msgstr "Encr." ++ ++#~ msgid "WLAN-Scan" ++#~ msgstr "WLAN-Pesquisa" ++ ++#~ msgid "Create Network" ++#~ msgstr "Criar Rede" ++ ++#~ msgid "Link" ++#~ msgstr "Link" ++ ++#~ msgid "Networks" ++#~ msgstr "Redes" ++ ++#~ msgid "Power" ++#~ msgstr "Potência" ++ ++#~ msgid "Wifi networks in your local environment" ++#~ msgstr "Redes Wifi no seu ambiente local" ++ ++#~ msgid "" ++#~ "CIDR-Notation: " ++#~ "address/prefix" ++#~ msgstr "" ++#~ "Notação CIDR: " ++#~ "endereço/prefixo" ++ ++#~ msgid "DNS-Server" ++#~ msgstr "Servidor DNS" ++ ++#~ msgid "IPv4-Broadcast" ++#~ msgstr "" ++#~ "Broadcast IPv4" ++ ++#~ msgid "IPv6-Address" ++#~ msgstr "Endereço IPv6" ++ ++#~ msgid "" ++#~ "The network ports on your router can be combined to several VLANs in which computers can " ++#~ "communicate directly with each other. VLANs are often used to separate different network " ++#~ "segments. Often there is by default one Uplink port for a connection to " ++#~ "the next greater network like the internet and other ports for a local " ++#~ "network." ++#~ msgstr "" ++#~ "As portas de rede do seu router podem ser combinadas com diversas VLANs em que os computadores podem " ++#~ "comunicar directamente entre si. As VLANs são frequentemente utilizadas para separar segmentos de " ++#~ "redes diferentes. Muitas vezes é padrão uma porta Uplink para a ligação " ++#~ "com a próxima rede, como a Internet e outras portas para uma rede local." ++ ++#~ msgid "Files to be kept when flashing a new firmware" ++#~ msgstr "Ficheiros que devem ser mantidos quando gravar um novo firmware." ++ ++#~ msgid "General" ++#~ msgstr "Geral" ++ ++#~ msgid "" ++#~ "Here you can customize the settings and the functionality of LuCI." ++#~ msgstr "" ++#~ "Aqui pode personalizar as configurações e funcionalidades do LuCI." ++ ++#~ msgid "Post-commit actions" ++#~ msgstr "Acções pós-gravação" ++ ++#~ msgid "" ++#~ "These commands will be executed automatically when a given UCI configuration is committed " ++#~ "allowing changes to be applied instantly." ++#~ msgstr "" ++#~ "Estes comandos são executados automaticamente quando uma determinada " ++#~ "configuração da UCI está gravada, permitindo mudanças a serem aplicadas " ++#~ "instantaneamente." ++ ++#~ msgid "Web UI" ++#~ msgstr "Web UI" ++ ++#~ msgid "Access point (APN)" ++#~ msgstr "Ponto de acesso (APN)" ++ ++#~ msgid "Additional pppd options" ++#~ msgstr "Opções adicionais do pppd" ++ ++#~ msgid "Automatic Disconnect" ++#~ msgstr "Fim automático de ligação" ++ ++#~ msgid "Backup Archive" ++#~ msgstr "Arquivo de backup" ++ ++#~ msgid "" ++#~ "Configure the local DNS server to use the name servers adverticed by the " ++#~ "PPP peer" ++#~ msgstr "" ++#~ "Configurar o servidor DNS local para usar o servidores de nomes " ++#~ "fornecidos pelo PPP" ++ ++#~ msgid "Connect script" ++#~ msgstr "Script de ligação" ++ ++#~ msgid "Create backup" ++#~ msgstr "Criar backup" ++ ++#~ msgid "Disconnect script" ++#~ msgstr "Script de fim de ligação" ++ ++#~ msgid "Edit package lists and installation targets" ++#~ msgstr "Editar listas de pacotes e destinos de instalação" ++ ++#~ msgid "Enable IPv6 on PPP link" ++#~ msgstr "Activar IPv6 no link PPP" ++ ++#~ msgid "Firmware image" ++#~ msgstr "Imagem de Firmware" ++ ++#~ msgid "" ++#~ "Here you can backup and restore your router configuration and - if " ++#~ "possible - reset the router to the default settings." ++#~ msgstr "" ++#~ "Aqui pode fazer o backup e restaurar as configurações do seu router. " ++#~ "Também pode restaurar seu router para as configurações pré-definidas." ++ ++#~ msgid "Installation targets" ++#~ msgstr "Destino de Instalação" ++ ++#~ msgid "Keep configuration files" ++#~ msgstr "Manter ficheiros de configuração" ++ ++#~ msgid "Keep-Alive" ++#~ msgstr "Manter em Actividade" ++ ++#~ msgid "" ++#~ "Let pppd replace the current default route to use the PPP interface after " ++#~ "successful connect" ++#~ msgstr "" ++#~ "Permitir o pppd substituir a rota padrão actual e usar a interface PPP " ++#~ "como padrão após a ligação ser efectuada com sucesso" ++ ++#~ msgid "Let pppd run this script after establishing the PPP link" ++#~ msgstr "" ++#~ "Deixar o pppd executar este script após o estabelecimento do link PPP" ++ ++#~ msgid "Let pppd run this script before tearing down the PPP link" ++#~ msgstr "Deixar o pppd executar este script antes de terminar o link PPP" ++ ++#~ msgid "" ++#~ "Make sure that you provide the correct pin code here or you might lock " ++#~ "your sim card!" ++#~ msgstr "" ++#~ "Certifique-se que forneceu o código PIN correcto aqui, ou pode bloquear o " ++#~ "seu cartão SIM" ++ ++#~ msgid "" ++#~ "Most of them are network servers, that offer a certain service for your " ++#~ "device or network like shell access, serving webpages like LuCI, doing mesh routing, sending " ++#~ "e-mails, ..." ++#~ msgstr "" ++#~ "A maioria deles são servidores de rede, que oferecem um determinado " ++#~ "serviço para seu equipamento ou rede como acesso shell, servindo páginas " ++#~ "web como o LuCI, " ++#~ "fazendo roteamento, enviando e-mails, ..." ++ ++#~ msgid "Number of failed connection tests to initiate automatic reconnect" ++#~ msgstr "" ++#~ "Número de falhas do teste de ligação para reiniciar uma ligação automática" ++ ++#~ msgid "PIN code" ++#~ msgstr "Código PIN" ++ ++#~ msgid "Package lists" ++#~ msgstr "Listas de pacotes" ++ ++#~ msgid "Proceed reverting all settings and resetting to firmware defaults?" ++#~ msgstr "Proceder com a restauração das configurações pré-definidas?" ++ ++#~ msgid "Processor" ++#~ msgstr "Processador" ++ ++#~ msgid "Radius-Port" ++#~ msgstr "Porta RADIUS" ++ ++#~ msgid "Radius-Server" ++#~ msgstr "Servidor RADIUS" ++ ++#~ msgid "Replace default route" ++#~ msgstr "Substituir a rota padrão" ++ ++#~ msgid "Reset router to defaults" ++#~ msgstr "Restaurar as configurações pré-definidas do router" ++ ++#~ msgid "" ++#~ "Seconds to wait for the modem to become ready before attempting to connect" ++#~ msgstr "" ++#~ "Segundos de espera para o modem ficar pronto antes de tentar uma ligação" ++ ++#~ msgid "Service type" ++#~ msgstr "Tipo do serviço" ++ ++#~ msgid "Services and daemons perform certain tasks on your device." ++#~ msgstr "" ++#~ "Serviços e daemons que estão a executar diversas tarefas no seu " ++#~ "equipamento." ++ ++#~ msgid "Settings" ++#~ msgstr "Definições" ++ ++#~ msgid "Setup wait time" ++#~ msgstr "Configurar tempo de espera" ++ ++#~ msgid "" ++#~ "Sorry. OpenWrt does not support a system upgrade on this platform.
    " ++#~ "You need to manually flash your device." ++#~ msgstr "" ++#~ "Lamentamos, mas o OpenWrt não suporta uma actualização do sistema para " ++#~ "esta plataforma.
    É necessário carregar manualmente uma imagem para " ++#~ "a flash do seu equipamento." ++ ++#~ msgid "Specify additional command line arguments for pppd here" ++#~ msgstr "" ++#~ "Especificar argumentos adicionais por linha de comando para o pppd aqui" ++ ++#~ msgid "The device node of your modem, e.g. /dev/ttyUSB0" ++#~ msgstr "O caminho do dispositivo do seu modem, ex. /dev/ttyUSB0" ++ ++#~ msgid "Time (in seconds) after which an unused connection will be closed" ++#~ msgstr "Tempo (em segundos) para fim de uma ligação já não utilizada" ++ ++#~ msgid "Update package lists" ++#~ msgstr "Actualizar listas de pacotes" ++ ++#~ msgid "Upload an OpenWrt image file to reflash the device." ++#~ msgstr "Carregar uma imagem OpenWrt para a flash do router." ++ ++#~ msgid "Upload image" ++#~ msgstr "Carregar imagem" ++ ++#~ msgid "Use peer DNS" ++#~ msgstr "Utilizar DNS do peer" ++ ++#~ msgid "" ++#~ "You need to install \"comgt\" for UMTS/GPRS, \"ppp-mod-pppoe\" for PPPoE, " ++#~ "\"ppp-mod-pppoa\" for PPPoA or \"pptp\" for PPtP support" ++#~ msgstr "" ++#~ "Precisa de instalar os pacotes \"comgt\" para UMTS/GPRS, \"ppp-mod-pppoe" ++#~ "\" para PPPoE, \"ppp-mod-pppoa\" para PPPoA ou \"pptp\" para o suporte " ++#~ "PPtP" ++ ++#~ msgid "back" ++#~ msgstr "voltar" ++ ++#~ msgid "buffered" ++#~ msgstr "em buffer" ++ ++#~ msgid "cached" ++#~ msgstr "em cache" ++ ++#~ msgid "free" ++#~ msgstr "livre" ++ ++#~ msgid "static" ++#~ msgstr "estático" ++ ++#~ msgid "" ++#~ "LuCI is a collection " ++#~ "of free Lua software including an MVC-Webframework and webinterface for embedded devices. LuCI is licensed under the " ++#~ "Apache-License." ++#~ msgstr "" ++#~ "LuCI é uma colecção " ++#~ "gratuita de programas Lua incluindo um Framework Web MVC e uma Interface Web para micro-" ++#~ "dispositivos. LuCI é " ++#~ "licenciado sob a Licença Apache." ++ ++#~ msgid "SSH-Keys" ++#~ msgstr "Chaves-SSH" ++ ++#~ msgid "" ++#~ "A lightweight HTTP/1.1 webserver written in C and Lua designed to serve " ++#~ "LuCI" ++#~ msgstr "" ++#~ "Um servidor web HTTP/1.1 ligeiro escrito em C e desenvolvido em Lua para " ++#~ "servir LuCI" ++ ++#~ msgid "" ++#~ "A small webserver which can be used to serve LuCI." ++#~ msgstr "" ++#~ "Um pequeno servidor web que pode ser utilizado para servir a interface " ++#~ "LuCI." ++ ++#~ msgid "About" ++#~ msgstr "Sobre" ++ ++#~ msgid "Addresses" ++#~ msgstr "Endereços" ++ ++#~ msgid "Admin Password" ++#~ msgstr "Password do Administrador" ++ ++#~ msgid "Alias" ++#~ msgstr "Configuração IP alternativa" ++ ++#~ msgid "Authentication Realm" ++#~ msgstr "Ãrea de autenticação" ++ ++#~ msgid "Bridge Port" ++#~ msgstr "Porta do interface em ponte" ++ ++#~ msgid "" ++#~ "Change the password of the system administrator (User root)" ++#~ msgstr "" ++#~ "Altera a senha do administrador do sistema (Login root)" ++ ++#~ msgid "Client + WDS" ++#~ msgstr "Cliente (WDS)" ++ ++#~ msgid "Configuration file" ++#~ msgstr "Ficheiro de configuração" ++ ++#~ msgid "Connection timeout" ++#~ msgstr "Esgotado o tempo de ligação" ++ ++#~ msgid "Contributing Developers" ++#~ msgstr "Programadores Contribuintes" ++ ++#~ msgid "DHCP assigned" ++#~ msgstr "DHCP atribuido" ++ ++#~ msgid "Document root" ++#~ msgstr "Diretório raiz" ++ ++#~ msgid "Enable Keep-Alive" ++#~ msgstr "Activar keep-alive" ++ ++#~ msgid "Ethernet Bridge" ++#~ msgstr "Ponte Ethernet" ++ ++#~ msgid "" ++#~ "Here you can paste public SSH-Keys " ++#~ "(one per line) for SSH public-key " ++#~ "authentication." ++#~ msgstr "" ++#~ "Aqui pode colar suas Chaves-SSH " ++#~ "públicas (uma por linha) para a autenticação SSH por chave-pública." ++ ++#~ msgid "ID" ++#~ msgstr "Identificação de interface em ponte" ++ ++#~ msgid "IP Configuration" ++#~ msgstr "Configuração IP" ++ ++#~ msgid "Interface Status" ++#~ msgstr "" ++#~ "Aqui encontra informações sobre o estado actual do sistema, como CPU, frequência do relógio, uso " ++#~ "de memória ou uso da interface de rede de dados." ++ ++#~ msgid "Lead Development" ++#~ msgstr "Equipa de Desenvolvimento" ++ ++#~ msgid "Master" ++#~ msgstr "AP" ++ ++#~ msgid "Master + WDS" ++#~ msgstr "AP+WDS" ++ ++#~ msgid "Not configured" ++#~ msgstr "Não configurado" ++ ++#~ msgid "Password successfully changed" ++#~ msgstr "Senha alterada com sucesso" ++ ++#~ msgid "Plugin path" ++#~ msgstr "Directorio de plugins" ++ ++#~ msgid "Ports" ++#~ msgstr "Portas" ++ ++#~ msgid "Primary" ++#~ msgstr "Primário" ++ ++#~ msgid "Project Homepage" ++#~ msgstr "Página do Projecto" ++ ++#~ msgid "Pseudo Ad-Hoc" ++#~ msgstr "Ahdemo" ++ ++#~ msgid "STP" ++#~ msgstr "STP" ++ ++#~ msgid "Thanks To" ++#~ msgstr "Obrigado a" ++ ++#~ msgid "" ++#~ "The realm which will be displayed at the authentication prompt for " ++#~ "protected pages." ++#~ msgstr "" ++#~ "A área de autenticação (realm) que será mostrada na prompt de " ++#~ "autenticação das páginas protegidas." ++ ++#~ msgid "Unknown Error" ++#~ msgstr "Erro Desconhecido" ++ ++#~ msgid "VLAN" ++#~ msgstr "VLAN" ++ ++#~ msgid "defaults to /etc/httpd.conf" ++#~ msgstr "padrão é /etc/httpd.conf" ++ ++#~ msgid "Package lists updated" ++#~ msgstr "As listas de pacotes foram actualizadas" ++ ++#~ msgid "Upgrade installed packages" ++#~ msgstr "Actualizar os pacotes instalados" ++ ++#~ msgid "" ++#~ "Also kernel or service logfiles can be viewed here to get an overview " ++#~ "over their current state." ++#~ msgstr "" ++#~ "Também os arquivos de logs do kernel ou dos serviços podem ser " ++#~ "consultados aqui para obter uma visão geral sobre o seu estado actual." ++ ++#~ msgid "" ++#~ "Here you can find information about the current system status like CPU clock frequency, memory " ++#~ "usage or network interface data." ++#~ msgstr "" ++#~ "Aqui você pode encontrar informações sobre o estado actual do sistema, " ++#~ "tais como CPU, frequência " ++#~ "do relógio, uso de memória ou da interface de rede de dados." ++ ++#~ msgid "Search file..." ++#~ msgstr "Procurar ficheiro..." ++ ++# "free as in freedom" equivale a "livre de liberdade" não de "grátis" ++#~ msgid "" ++#~ "LuCI is a free, " ++#~ "flexible, and user friendly graphical interface for configuring OpenWrt " ++#~ "Kamikaze." ++#~ msgstr "" ++#~ "O LuCI é um " ++#~ "interface gráfico livre, flexível e fácil de utilizar para configurar o " ++#~ "OpenWrt Kamikaze." ++ ++#~ msgid "And now have fun with your router!" ++#~ msgstr "E agora divirta-se com o seu router!" ++ ++#~ msgid "" ++#~ "As we always want to improve this interface we are looking forward to " ++#~ "your feedback and suggestions." ++#~ msgstr "" ++#~ "Agradecemos os seus comentários e sugestões por forma a podermos " ++#~ "continuar a melhorar este interface." ++ ++#~ msgid "Hello!" ++#~ msgstr "Olá!" ++ ++#~ msgid "" ++#~ "Notice: In LuCI " ++#~ "changes have to be confirmed by clicking Changes - Save & Apply " ++#~ "before being applied." ++#~ msgstr "" ++#~ "Aviso: No LuCI as " ++#~ "alterações devem ser confirmadas clicando em Alterações - Salvar & " ++#~ "Aplicar antes de serem aplicadas." ++ ++#~ msgid "" ++#~ "On the following pages you can adjust all important settings of your " ++#~ "router." ++#~ msgstr "" ++#~ "Nas próximas páginas, pode ajustar todas as definições importantes do seu " ++#~ "router." ++ ++#~ msgid "The LuCI Team" ++#~ msgstr "" ++#~ "A equipa do LuCI" ++ ++#~ msgid "" ++#~ "This is the administration area of LuCI." ++#~ msgstr "" ++#~ "Esta é a área de administração do LuCI." ++ ++#~ msgid "User Interface" ++#~ msgstr "Interface do Utilizador" ++ ++#~ msgid "enable" ++#~ msgstr "activar" ++ ++#, fuzzy ++#~ msgid "(optional)" ++#~ msgstr " (opcional)" ++ ++#~ msgid "DNS-Port" ++#~ msgstr "Porta do DNS" ++ ++#~ msgid "" ++#~ "DNS-Server will be queried in " ++#~ "the order of the resolvfile" ++#~ msgstr "" ++#~ "Servidor DNS será " ++#~ "consultado na ordem do arquivo resolv.conf" ++ ++#~ msgid "" ++#~ "max. DHCP-Leases" ++#~ msgstr "" ++#~ "max. de DHCP-Leases" ++ ++#~ msgid "" ++#~ "max. EDNS0 packet size" ++#~ msgstr "" ++#~ "tamanho max. do pacote EDNS0" ++ ++#~ msgid "AP-Isolation" ++#~ msgstr "Isolamento do AP" ++ ++#~ msgid "Add the Wifi network to physical network" ++#~ msgstr "Adicione a rede Wifi à rede física" ++ ++#~ msgid "Aliases" ++#~ msgstr "Aliases" ++ ++#~ msgid "Clamp Segment Size" ++#~ msgstr "Clamp Segment Size" ++ ++#, fuzzy ++#~ msgid "Create Or Attach Network" ++#~ msgstr "Criar Rede" ++ ++#~ msgid "Devices" ++#~ msgstr "Dispositivos" ++ ++#~ msgid "Don't forward reverse lookups for local networks" ++#~ msgstr "Não encaminhar as pesquisas reversas para redes locais" ++ ++#~ msgid "Enable TFTP-Server" ++#~ msgstr "Activar servidor TFTP" ++ ++#~ msgid "Errors" ++#~ msgstr "Erros" ++ ++#~ msgid "Essentials" ++#~ msgstr "Básico" ++ ++#~ msgid "Expand Hosts" ++#~ msgstr "Expandir Hosts" ++ ++#~ msgid "First leased address" ++#~ msgstr "Primeiro endereço de atribuição" ++ ++#~ msgid "" ++#~ "Fixes problems with unreachable websites, submitting forms or other " ++#~ "unexpected behaviour for some ISPs." ++#~ msgstr "" ++#~ "Resolve problemas com websites indisponíveis, submissão de formulários ou " ++#~ "comportamentos inesperados de alguns ISP's." ++ ++#~ msgid "Hardware Address" ++#~ msgstr "Endereço do Hardware" ++ ++#~ msgid "Here you can configure installed wifi devices." ++#~ msgstr "Aqui pode configurar os dispositivos wifi instalados. " ++ ++#~ msgid "Ignore /etc/hosts" ++#~ msgstr "Ignorar /etc/hosts" ++ ++#~ msgid "Independent (Ad-Hoc)" ++#~ msgstr "Independente (Ad-Hoc)" ++ ++#~ msgid "Internet Connection" ++#~ msgstr "Ligação Internet" ++ ++#~ msgid "Join (Client)" ++#~ msgstr "Cliente (Client)" ++ ++#~ msgid "Leases" ++#~ msgstr "Atribuições" ++ ++#~ msgid "Local Domain" ++#~ msgstr "Domínio Local" ++ ++#~ msgid "Local Network" ++#~ msgstr "Rede Local" ++ ++#~ msgid "Local Server" ++#~ msgstr "Servidor Local" ++ ++#~ msgid "Network Boot Image" ++#~ msgstr "Imagem para o boot remoto (PXE)" ++ ++#~ msgid "" ++#~ "Network Name (ESSID)" ++#~ msgstr "" ++#~ "Nome da Rede (ESSID)" ++ ++#~ msgid "Number of leased addresses" ++#~ msgstr "Número de endereços atribuidos" ++ ++#~ msgid "Perform Actions" ++#~ msgstr "Executar Acções" ++ ++#~ msgid "Prevents Client to Client communication" ++#~ msgstr "Impede a comunicação de Cliente para Cliente" ++ ++#~ msgid "Provide (Access Point)" ++#~ msgstr "Ponto de Acesso (Access Point)" ++ ++#~ msgid "Resolvfile" ++#~ msgstr "Ficheiro resolv.conf" ++ ++#~ msgid "TFTP-Server Root" ++#~ msgstr "Directório raiz do servidor TFTP" ++ ++#~ msgid "TX / RX" ++#~ msgstr "TX / RX" ++ ++#~ msgid "The following changes have been applied" ++#~ msgstr "Foram aplicadas as seguintes alterações " ++ ++#~ msgid "" ++#~ "When flashing a new firmware with LuCI these files will be added to the new firmware " ++#~ "installation." ++#~ msgstr "" ++#~ "Quando gravar um novo firmware com o LuCI estes arquivos serão adicionados ao novo " ++#~ "firmware instalado." ++ ++#, fuzzy ++#~ msgid "Wireless Scan" ++#~ msgstr "Wireless" ++ ++#~ msgid "" ++#~ "With DHCP " ++#~ "network members can automatically receive their network settings (IP-address, netmask, DNS-server, ...)." ++#~ msgstr "" ++#~ "Com o DHCP os membros da rede podem automaticamente receber as suas " ++#~ "configurações de rede (endereço-IP, netmask, servidor-DNS, ...)." ++ ++#~ msgid "" ++#~ "You can run several wifi networks with one device. Be aware that there " ++#~ "are certain hardware and driverspecific restrictions. Normally you can " ++#~ "operate 1 Ad-Hoc or up to 3 Master-Mode and 1 Client-Mode network " ++#~ "simultaneously." ++#~ msgstr "" ++#~ "Pode servir várias redes wifi com o mesmo dispositivo. Esteja ciente de " ++#~ "que existem certas restrições específicas do hardware e do controlador. " ++#~ "Pode normalmente operar 1 rede Ad-Hoc ou até 3 redes AP e 1 Cliente " ++#~ "simultaneamente." ++ ++#~ msgid "" ++#~ "You need to install \"ppp-mod-pppoe\" for PPPoE or \"pptp\" for PPtP " ++#~ "support" ++#~ msgstr "" ++#~ "Precisa de instalar os pacotes \"ppp-mod-pppoe\" para PPPoE ou \"pptp\" " ++#~ "para o suporte PPtP" ++ ++#~ msgid "Zone" ++#~ msgstr "Zona" ++ ++#~ msgid "additional hostfile" ++#~ msgstr "ficheiro de hosts adicional" ++ ++#~ msgid "adds domain names to hostentries in the resolv file" ++#~ msgstr "" ++#~ "Adiciona os nomes dos domínios às entradas de hosts no arquivo resolv.conf" ++ ++#~ msgid "automatically reconnect" ++#~ msgstr "ligação automática" ++ ++#~ msgid "concurrent queries" ++#~ msgstr "Consultas simultâneas" ++ ++#~ msgid "" ++#~ "disable DHCP " ++#~ "for this interface" ++#~ msgstr "" ++#~ "desabilitar DHCP para esta interface" ++ ++#~ msgid "disconnect when idle for" ++#~ msgstr "desligar quando ocioso por" ++ ++#~ msgid "don't cache unknown" ++#~ msgstr "Não fazer cache de desconhecidos" ++ ++#~ msgid "" ++#~ "filter useless DNS-queries of " ++#~ "Windows-systems" ++#~ msgstr "" ++#~ "Filtro de consultas inuteis-DNS de sistemas windows" ++ ++#~ msgid "installed" ++#~ msgstr "instalado" ++ ++#~ msgid "localises the hostname depending on its subnet" ++#~ msgstr "Localizar o hostname dependendo de sua sub-rede" ++ ++#~ msgid "not installed" ++#~ msgstr "não instalado" ++ ++#~ msgid "" ++#~ "prevents caching of negative DNS-replies" ++#~ msgstr "" ++#~ "Impede o cache de respostas-DNS negativas" ++ ++#~ msgid "query port" ++#~ msgstr "porta para consultas" ++ ++#~ msgid "transmitted / received" ++#~ msgstr "transmitido / recebido" ++ ++#, fuzzy ++#~ msgid "Join network" ++#~ msgstr "redes contidas" ++ ++#~ msgid "all" ++#~ msgstr "todos" ++ ++#~ msgid "Code" ++#~ msgstr "Código" ++ ++#~ msgid "Distance" ++#~ msgstr "Distância" ++ ++#~ msgid "Legend" ++#~ msgstr "Legenda" ++ ++#~ msgid "Library" ++#~ msgstr "Biblioteca" ++ ++#~ msgid "see '%s' manpage" ++#~ msgstr "veja sobre '%s' na página de manual (man)" ++ ++#~ msgid "Package Manager" ++#~ msgstr "Gestor de Pacotes" ++ ++#~ msgid "Service" ++#~ msgstr "Serviço" ++ ++#~ msgid "Statistics" ++#~ msgstr "Estatísticas" ++ ++#~ msgid "zone" ++#~ msgstr "Zona" +diff --git a/feeds/luci/modules/luci-base/po/ro/base.po b/feeds/luci/modules/luci-base/po/ro/base.po +new file mode 100644 +index 0000000..3692b7d +--- /dev/null ++++ b/feeds/luci/modules/luci-base/po/ro/base.po +@@ -0,0 +1,3320 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"PO-Revision-Date: 2014-04-01 23:12+0200\n" ++"Last-Translator: xcentric \n" ++"Language-Team: none\n" ++"Language: ro\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=3; plural=(n==1 ? 0 : (n==0 || (n%100 > 0 && n%100 < " ++"20)) ? 1 : 2);;\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "(%d minute window, %d second interval)" ++msgstr "(%d fereastra minute, %d interval secunde)" ++ ++msgid "(%s available)" ++msgstr "(%s disponibil)" ++ ++msgid "(empty)" ++msgstr "(gol)" ++ ++msgid "(no interfaces attached)" ++msgstr "(nici o interfata atasata)" ++ ++msgid "-- Additional Field --" ++msgstr "-- Camp suplimentar --" ++ ++msgid "-- Please choose --" ++msgstr "-- Te rog sa alegi --" ++ ++msgid "-- custom --" ++msgstr "-- particularizat --" ++ ++msgid "-- match by device --" ++msgstr "" ++ ++msgid "-- match by label --" ++msgstr "" ++ ++msgid "1 Minute Load:" ++msgstr "Incarcarea in ultimul minut" ++ ++msgid "15 Minute Load:" ++msgstr "Incarcarea in ultimele 15 minute" ++ ++msgid "5 Minute Load:" ++msgstr "Incarcarea in ultimele 5 minute" ++ ++msgid "BSSID" ++msgstr "BSSID" ++ ++msgid "DNS query port" ++msgstr "DNSport de apelare" ++ ++msgid "DNS server port" ++msgstr "DNS port server" ++ ++msgid "" ++"DNS servers will be queried in the " ++"order of the resolvfile" ++msgstr "" ++"DNS serverul va interoga in " ++"vederea procesarii fisierului" ++ ++msgid "ESSID" ++msgstr "ESSID" ++ ++msgid "IPv4-Address" ++msgstr "Adresa IPv4" ++ ++msgid "IPv4-Gateway" ++msgstr "IPv4-Poarta Acces " ++ ++msgid "IPv4-Netmask" ++msgstr "Masca de retea IPv4" ++ ++msgid "" ++"IPv6-Address or Network " ++"(CIDR)" ++msgstr "" ++"IPv6-Addresa retea (CIDR)" ++ ++msgid "IPv6-Gateway" ++msgstr "IPv6-Poarta Acces" ++ ++msgid "IPv6-Suffix (hex)" ++msgstr "" ++ ++msgid "LED Configuration" ++msgstr "LED Configurare" ++ ++msgid "LED Name" ++msgstr "LED Nume" ++ ++msgid "MAC-Address" ++msgstr "MAC-Addresa" ++ ++msgid "" ++"Max. DHCP leases" ++msgstr "" ++ ++msgid "" ++"Max. EDNS0 packet size" ++msgstr "" ++"Max. EDNS0 marime pachet" ++ ++msgid "Max. concurrent queries" ++msgstr "Max. interogari simultane" ++ ++msgid "%s - %s" ++msgstr "%s - %s" ++ ++msgid "ADSL" ++msgstr "" ++ ++msgid "ADSL Status" ++msgstr "" ++ ++msgid "AICCU (SIXXS)" ++msgstr "" ++ ++msgid "APN" ++msgstr "APN" ++ ++msgid "AR Support" ++msgstr "Suport AR" ++ ++msgid "ARP retry threshold" ++msgstr "ARP prag reincercare" ++ ++msgid "ATM Bridges" ++msgstr "Punti ATM" ++ ++msgid "ATM Virtual Channel Identifier (VCI)" ++msgstr "ATM Indentificator Canal Virtual (VCI)" ++ ++msgid "ATM Virtual Path Identifier (VPI)" ++msgstr "ATM Indentificator Cale Virtual(VPI)" ++ ++msgid "" ++"ATM bridges expose encapsulated ethernet in AAL5 connections as virtual " ++"Linux network interfaces which can be used in conjunction with DHCP or PPP " ++"to dial into the provider network." ++msgstr "" ++"Puntile ATM expune reteaua intergrata în conexiunile AAL5 ca interfeÈ›e " ++"virtuale de reÈ›ea Linux care pot fi utilizate în asociere cu DHCP sau PPP " ++"pentru a forma în reÈ›eaua furnizorului." ++ ++msgid "ATM device number" ++msgstr "ATM numar echipament" ++ ++msgid "AYIYA" ++msgstr "" ++ ++msgid "Access Concentrator" ++msgstr "Concentrator de Access " ++ ++msgid "Access Point" ++msgstr "Punct de Acces" ++ ++msgid "Action" ++msgstr "Actiune" ++ ++msgid "Actions" ++msgstr "Actiune" ++ ++msgid "Activate this network" ++msgstr "Activeaza aceasta retea" ++ ++msgid "Active IPv4-Routes" ++msgstr "Rute active IPv4" ++ ++msgid "Active IPv6-Routes" ++msgstr "Rute active IPv6" ++ ++msgid "Active Connections" ++msgstr "Conexiuni active" ++ ++msgid "Active DHCP Leases" ++msgstr "" ++ ++msgid "Active DHCPv6 Leases" ++msgstr "" ++ ++msgid "Ad-Hoc" ++msgstr "Ad-Hoc" ++ ++msgid "Add" ++msgstr "Adauga" ++ ++msgid "Add local domain suffix to names served from hosts files" ++msgstr "Adauga un sufix local numelor servite din fisierele de tip hosts" ++ ++msgid "Add new interface..." ++msgstr "Adauga interfata noua.." ++ ++msgid "Additional Hosts files" ++msgstr "Fisiere de tip hosts aditionale" ++ ++msgid "Address" ++msgstr "Adresa" ++ ++msgid "Address to access local relay bridge" ++msgstr "Adresa de acces punte locala repetor" ++ ++msgid "Administration" ++msgstr "Administrare" ++ ++msgid "Advanced Settings" ++msgstr "Setari avansate" ++ ++msgid "Alert" ++msgstr "Alerta" ++ ++msgid "Allow SSH password authentication" ++msgstr "" ++"Permite autentificarea prin parola a SSH " ++ ++msgid "Allow all except listed" ++msgstr "Permite toate cu exceptia celor listate" ++ ++msgid "Allow listed only" ++msgstr "Permite doar cele listate" ++ ++msgid "Allow localhost" ++msgstr "Permite localhost" ++ ++msgid "Allow remote hosts to connect to local SSH forwarded ports" ++msgstr "Permite statiilor externe sa se conecteze la porturile SSH locale" ++ ++msgid "Allow root logins with password" ++msgstr "Permite autentificarea contului root cu parola" ++ ++msgid "Allow the root user to login with password" ++msgstr "Permite contului root sa se autentifice cu parola" ++ ++msgid "" ++"Allow upstream responses in the 127.0.0.0/8 range, e.g. for RBL services" ++msgstr "" ++"Permite raspuns upstream in plaja 127.0.0.0/8, e.g. pentru serviciile RBL" ++ ++msgid "" ++"Also see Tunneling Comparison on SIXXS" ++msgstr "" ++ ++msgid "Always announce default router" ++msgstr "" ++ ++msgid "An additional network will be created if you leave this unchecked." ++msgstr "" ++"Daca lasati aceasta optiune neselectata va fi creata o retea aditionala" ++ ++msgid "Announce as default router even if no public prefix is available." ++msgstr "" ++ ++msgid "Announced DNS domains" ++msgstr "" ++ ++msgid "Announced DNS servers" ++msgstr "" ++ ++msgid "Antenna 1" ++msgstr "Antena 1" ++ ++msgid "Antenna 2" ++msgstr "Antena 2" ++ ++msgid "Antenna Configuration" ++msgstr "Configurarea Antenei" ++ ++msgid "Any zone" ++msgstr "Orice Zona" ++ ++msgid "Apply" ++msgstr "Aplica" ++ ++msgid "Applying changes" ++msgstr "Se aplica modificarile" ++ ++msgid "" ++"Assign a part of given length of every public IPv6-prefix to this interface" ++msgstr "" ++ ++msgid "Assign interfaces..." ++msgstr "Inregistreaza interfetele" ++ ++msgid "" ++"Assign prefix parts using this hexadecimal subprefix ID for this interface." ++msgstr "" ++ ++msgid "Associated Stations" ++msgstr "Statiile asociate" ++ ++msgid "Atheros 802.11%s Wireless Controller" ++msgstr "Atheros 802.11%s Controler Fara Fir" ++ ++msgid "AuthGroup" ++msgstr "" ++ ++msgid "Authentication" ++msgstr "Autentificare" ++ ++msgid "Authoritative" ++msgstr "Autoritare" ++ ++msgid "Authorization Required" ++msgstr "Necesita Autorizare" ++ ++msgid "Auto Refresh" ++msgstr "Reimprospatare automata" ++ ++msgid "Automatic" ++msgstr "" ++ ++msgid "Automatic Homenet (HNCP)" ++msgstr "" ++ ++msgid "Available" ++msgstr "Disponibil" ++ ++msgid "Available packages" ++msgstr "Pachete disponibile" ++ ++msgid "Average:" ++msgstr "Medie:" ++ ++msgid "BSSID" ++msgstr "BSSID" ++ ++msgid "Back" ++msgstr "Inapoi" ++ ++msgid "Back to Overview" ++msgstr "Inapoi la sumar" ++ ++msgid "Back to configuration" ++msgstr "Inapoi la Configurare" ++ ++msgid "Back to overview" ++msgstr "Inapoi la vedere generala" ++ ++msgid "Back to scan results" ++msgstr "Inapoi la rezultatele scanarii" ++ ++msgid "Background Scan" ++msgstr "Scanare in fundal" ++ ++msgid "Backup / Flash Firmware" ++msgstr "Salveaza / Scrie Firmware" ++ ++msgid "Backup / Restore" ++msgstr "Salveaza / Restaureaza" ++ ++msgid "Backup file list" ++msgstr "Salveaza lista fisiere" ++ ++msgid "Bad address specified!" ++msgstr "Adresa specificata gresit !" ++ ++msgid "Band" ++msgstr "" ++ ++msgid "Behind NAT" ++msgstr "" ++ ++msgid "" ++"Below is the determined list of files to backup. It consists of changed " ++"configuration files marked by opkg, essential base files and the user " ++"defined backup patterns." ++msgstr "" ++ ++msgid "Bitrate" ++msgstr "Bitrate" ++ ++msgid "Bogus NX Domain Override" ++msgstr "Bogus NX Domain Override" ++ ++msgid "Bridge" ++msgstr "Punte" ++ ++msgid "Bridge interfaces" ++msgstr "Leaga interfetele" ++ ++msgid "Bridge unit number" ++msgstr "Numarul unitatii in punte" ++ ++msgid "Bring up on boot" ++msgstr "Activeaza la pornire" ++ ++msgid "Broadcom 802.11%s Wireless Controller" ++msgstr "Broadcom 802.11%s Controller Fara Fir" ++ ++msgid "Broadcom BCM%04x 802.11 Wireless Controller" ++msgstr "Broadcom BCM%04x 802.11 Controller Fara Fir" ++ ++msgid "Buffered" ++msgstr "Incarcat" ++ ++msgid "Buttons" ++msgstr "Butoane" ++ ++msgid "CA certificate; if empty it will be saved after the first connection." ++msgstr "" ++ ++msgid "CPU" ++msgstr "Procesor" ++ ++msgid "CPU usage (%)" ++msgstr "Utilizarea procesorului (%)" ++ ++msgid "Cancel" ++msgstr "Anuleaza" ++ ++msgid "Category" ++msgstr "" ++ ++msgid "Chain" ++msgstr "Lant" ++ ++msgid "Changes" ++msgstr "Modificari" ++ ++msgid "Changes applied." ++msgstr "Modificari aplicate." ++ ++msgid "Changes the administrator password for accessing the device" ++msgstr "Schimba parola administratorului pentru accesarea dispozitivului" ++ ++msgid "Channel" ++msgstr "Canal" ++ ++msgid "Check" ++msgstr "Verificare" ++ ++msgid "Checksum" ++msgstr "Suma de verificare" ++ ++msgid "" ++"Choose the firewall zone you want to assign to this interface. Select " ++"unspecified to remove the interface from the associated zone or " ++"fill out the create field to define a new zone and attach the " ++"interface to it." ++msgstr "" ++"Alege zona paravanului care doresti sa o aloci acestei interfete. Selecteaza " ++"nespecificat pentru a sterge interfata sau golire creaza " ++"camp ce defineste o zona noua asociata interfetei." ++ ++msgid "" ++"Choose the network(s) you want to attach to this wireless interface or fill " ++"out the create field to define a new network." ++msgstr "" ++ ++msgid "Cipher" ++msgstr "" ++ ++msgid "" ++"Click \"Generate archive\" to download a tar archive of the current " ++"configuration files. To reset the firmware to its initial state, click " ++"\"Perform reset\" (only possible with squashfs images)." ++msgstr "" ++ ++msgid "Client" ++msgstr "" ++ ++msgid "Client ID to send when requesting DHCP" ++msgstr "" ++ ++msgid "" ++"Close inactive connection after the given amount of seconds, use 0 to " ++"persist connection" ++msgstr "" ++ ++msgid "Close list..." ++msgstr "" ++ ++msgid "Collecting data..." ++msgstr "Colectez datele.." ++ ++msgid "Command" ++msgstr "Comanda" ++ ++msgid "Common Configuration" ++msgstr "Configurarea obisnuita" ++ ++msgid "Compression" ++msgstr "Comprimare" ++ ++msgid "Configuration" ++msgstr "Configurare" ++ ++msgid "Configuration applied." ++msgstr "Configurarea aplicata." ++ ++msgid "Configuration files will be kept." ++msgstr "Fisierele de configurare vor fi pastrate." ++ ++msgid "Confirmation" ++msgstr "Confirmare" ++ ++msgid "Connect" ++msgstr "Conectare" ++ ++msgid "Connected" ++msgstr "Conectat" ++ ++msgid "Connection Limit" ++msgstr "Limita de conexiune" ++ ++msgid "Connection to server fails when TLS cannot be used" ++msgstr "" ++ ++msgid "Connections" ++msgstr "Conexiuni" ++ ++msgid "Country" ++msgstr "Tara" ++ ++msgid "Country Code" ++msgstr "Codul de tara" ++ ++msgid "Cover the following interface" ++msgstr "" ++ ++msgid "Cover the following interfaces" ++msgstr "" ++ ++msgid "Create / Assign firewall-zone" ++msgstr "" ++ ++msgid "Create Interface" ++msgstr "Creaza interfata" ++ ++msgid "Create a bridge over multiple interfaces" ++msgstr "" ++ ++msgid "Critical" ++msgstr "Critic" ++ ++msgid "Cron Log Level" ++msgstr "" ++ ++msgid "Custom Interface" ++msgstr "" ++ ++msgid "Custom delegated IPv6-prefix" ++msgstr "" ++ ++msgid "" ++"Customizes the behaviour of the device LEDs if possible." ++msgstr "" ++ ++msgid "DHCP Leases" ++msgstr "Conexiuni DHCP" ++ ++msgid "DHCP Server" ++msgstr "Server DHCP" ++ ++msgid "DHCP and DNS" ++msgstr "DHCP si DNS" ++ ++msgid "DHCP client" ++msgstr "" ++ ++msgid "DHCP-Options" ++msgstr "Optiuni DHCP" ++ ++msgid "DHCPv6 Leases" ++msgstr "" ++ ++msgid "DHCPv6 client" ++msgstr "" ++ ++msgid "DHCPv6-Mode" ++msgstr "" ++ ++msgid "DHCPv6-Service" ++msgstr "" ++ ++msgid "DNS" ++msgstr "DNS" ++ ++msgid "DNS forwardings" ++msgstr "" ++ ++msgid "DNS-Label / FQDN" ++msgstr "" ++ ++msgid "DS-Lite AFTR address" ++msgstr "" ++ ++msgid "DUID" ++msgstr "" ++ ++msgid "Debug" ++msgstr "" ++ ++msgid "Default %d" ++msgstr "" ++ ++msgid "Default gateway" ++msgstr "" ++ ++msgid "Default route" ++msgstr "" ++ ++msgid "Default state" ++msgstr "Stare implicita" ++ ++msgid "Define a name for this network." ++msgstr "Definiti un nume pentru aceasta retea." ++ ++msgid "" ++"Define additional DHCP options, for example " ++"\"6,192.168.2.1,192.168.2.2\" which advertises different DNS " ++"servers to clients." ++msgstr "" ++ ++msgid "Delete" ++msgstr "Sterge" ++ ++msgid "Delete this interface" ++msgstr "Sterge aceasta interfata" ++ ++msgid "Delete this network" ++msgstr "Sterge aceasta retea" ++ ++msgid "Description" ++msgstr "Descriere" ++ ++msgid "Design" ++msgstr "" ++ ++msgid "Destination" ++msgstr "Destinatie" ++ ++msgid "Device" ++msgstr "Dispozitiv" ++ ++msgid "Device Configuration" ++msgstr "Configurarea dispozitivului" ++ ++msgid "Diagnostics" ++msgstr "Diagnosticuri" ++ ++msgid "Dial number" ++msgstr "" ++ ++msgid "Directory" ++msgstr "Director" ++ ++msgid "Disable" ++msgstr "Dezactiveaza" ++ ++msgid "" ++"Disable DHCP for " ++"this interface." ++msgstr "" ++"Dezactiveaza DHCP " ++"pentru aceasta interfata." ++ ++msgid "Disable DNS setup" ++msgstr "Dezactiveaza configuratia DNS" ++ ++msgid "Disable HW-Beacon timer" ++msgstr "" ++ ++msgid "Disabled" ++msgstr "Dezactivat" ++ ++msgid "Discard upstream RFC1918 responses" ++msgstr "" ++ ++msgid "Displaying only packages containing" ++msgstr "" ++ ++msgid "Distance Optimization" ++msgstr "Optimizarea distantei" ++ ++msgid "Distance to farthest network member in meters." ++msgstr "Distanta catre cel mai departat membru din retea in metri." ++ ++msgid "Diversity" ++msgstr "Diversitate" ++ ++msgid "" ++"Dnsmasq is a combined DHCP-Server and DNS-" ++"Forwarder for NAT " ++"firewalls" ++msgstr "" ++ ++msgid "Do not cache negative replies, e.g. for not existing domains" ++msgstr "" ++ ++msgid "Do not forward requests that cannot be answered by public name servers" ++msgstr "" ++ ++msgid "Do not forward reverse lookups for local networks" ++msgstr "" ++ ++msgid "Do not send probe responses" ++msgstr "" ++ ++msgid "Domain required" ++msgstr "Domeniul necesar" ++ ++msgid "Domain whitelist" ++msgstr "" ++ ++msgid "" ++"Don't forward DNS-Requests without " ++"DNS-Name" ++msgstr "" ++ ++msgid "Download and install package" ++msgstr "Descarca si instaleaza pachetul" ++ ++msgid "Download backup" ++msgstr "Descarca backup" ++ ++msgid "Dropbear Instance" ++msgstr "Instanta dropbear" ++ ++msgid "" ++"Dropbear offers SSH network shell access " ++"and an integrated SCP server" ++msgstr "" ++ ++msgid "Dual-Stack Lite (RFC6333)" ++msgstr "" ++ ++msgid "Dynamic DHCP" ++msgstr "" ++ ++msgid "Dynamic tunnel" ++msgstr "" ++ ++msgid "" ++"Dynamically allocate DHCP addresses for clients. If disabled, only clients " ++"having static leases will be served." ++msgstr "" ++ ++msgid "EAP-Method" ++msgstr "" ++ ++msgid "Edit" ++msgstr "Editeaza" ++ ++msgid "" ++"Edit the raw configuration data above to fix any error and hit \"Save\" to " ++"reload the page." ++msgstr "" ++ ++msgid "Edit this interface" ++msgstr "Editeaza aceasta interfata" ++ ++msgid "Edit this network" ++msgstr "Editeaza aceasta retea" ++ ++msgid "Emergency" ++msgstr "Urgenta" ++ ++msgid "Enable" ++msgstr "Activeaza" ++ ++msgid "Enable STP" ++msgstr "Activeaza STP" ++ ++msgid "Enable HE.net dynamic endpoint update" ++msgstr "" ++ ++msgid "Enable IPv6 negotiation on the PPP link" ++msgstr "" ++ ++msgid "Enable Jumbo Frame passthrough" ++msgstr "" ++ ++msgid "Enable NTP client" ++msgstr "" ++ ++msgid "Enable TFTP server" ++msgstr "Activeaza serverul TFTP" ++ ++msgid "Enable VLAN functionality" ++msgstr "Activeaza VLAN-urile" ++ ++msgid "Enable WPS pushbutton, requires WPA(2)-PSK" ++msgstr "" ++ ++msgid "Enable learning and aging" ++msgstr "" ++ ++msgid "Enable mirroring of incoming packets" ++msgstr "" ++ ++msgid "Enable mirroring of outgoing packets" ++msgstr "" ++ ++msgid "Enable this mount" ++msgstr "" ++ ++msgid "Enable this swap" ++msgstr "" ++ ++msgid "Enable/Disable" ++msgstr "Activeaza/Dezactiveaza" ++ ++msgid "Enabled" ++msgstr "Activat" ++ ++msgid "Enables the Spanning Tree Protocol on this bridge" ++msgstr "" ++ ++msgid "Encapsulation mode" ++msgstr "Modul de incapsulare" ++ ++msgid "Encryption" ++msgstr "Criptare" ++ ++msgid "Erasing..." ++msgstr "Stergere..." ++ ++msgid "Error" ++msgstr "Eroare" ++ ++msgid "Ethernet Adapter" ++msgstr "Adaptor de retea ethernet" ++ ++msgid "Ethernet Switch" ++msgstr "Switch-ul ethernet" ++ ++msgid "Expand hosts" ++msgstr "" ++ ++msgid "Expires" ++msgstr "Expira" ++ ++msgid "" ++"Expiry time of leased addresses, minimum is 2 minutes (2m)." ++msgstr "" ++ ++msgid "External" ++msgstr "" ++ ++msgid "External system log server" ++msgstr "Server de log-uri extern" ++ ++msgid "External system log server port" ++msgstr "Portul serverului de log-uri extern" ++ ++msgid "Fast Frames" ++msgstr "" ++ ++msgid "File" ++msgstr "Fisier" ++ ++msgid "Filename of the boot image advertised to clients" ++msgstr "" ++ ++msgid "Filesystem" ++msgstr "Sistem de fisiere" ++ ++msgid "Filter" ++msgstr "Filtreaza" ++ ++msgid "Filter private" ++msgstr "Filtreaza privatele" ++ ++msgid "Filter useless" ++msgstr "Filtreaza nefolositele" ++ ++msgid "Find and join network" ++msgstr "Gaseste si alatura in retea" ++ ++msgid "Find package" ++msgstr "Gaseste pachet" ++ ++msgid "Finish" ++msgstr "Termina" ++ ++msgid "Firewall" ++msgstr "Firewall" ++ ++msgid "Firewall Settings" ++msgstr "Setarile firewall-ului" ++ ++msgid "Firewall Status" ++msgstr "Status la firewall" ++ ++msgid "Firmware Version" ++msgstr "Versiunea de firmware" ++ ++msgid "Fixed source port for outbound DNS queries" ++msgstr "Portul sursa pentru intrebarile DNS catre exterior" ++ ++msgid "Flags" ++msgstr "" ++ ++msgid "Flash Firmware" ++msgstr "Rescrie firmware" ++ ++msgid "Flash image..." ++msgstr "" ++ ++msgid "Flash new firmware image" ++msgstr "" ++ ++msgid "Flash operations" ++msgstr "" ++ ++msgid "Flashing..." ++msgstr "" ++ ++msgid "Force" ++msgstr "Forteaza" ++ ++msgid "Force CCMP (AES)" ++msgstr "Forteaza CCMP (AES)" ++ ++msgid "Force DHCP on this network even if another server is detected." ++msgstr "" ++"Forteaza facilitatea DHCP in aceasta retea chiar daca alt server DHCP exista." ++ ++msgid "Force TKIP" ++msgstr "Forteaza TKIP" ++ ++msgid "Force TKIP and CCMP (AES)" ++msgstr "Forteaza TKIP si CCMP (AES)" ++ ++msgid "Forward DHCP traffic" ++msgstr "" ++ ++msgid "Forward broadcast traffic" ++msgstr "" ++ ++msgid "Forwarding mode" ++msgstr "" ++ ++msgid "Fragmentation Threshold" ++msgstr "" ++ ++msgid "Frame Bursting" ++msgstr "" ++ ++msgid "Free" ++msgstr "Liber" ++ ++msgid "Free space" ++msgstr "Spatiu liber" ++ ++msgid "GHz" ++msgstr "" ++ ++msgid "GPRS only" ++msgstr "Doar GPRS" ++ ++msgid "Gateway" ++msgstr "Gateway" ++ ++msgid "Gateway ports" ++msgstr "Porturile gateway" ++ ++msgid "General Settings" ++msgstr "Setari principale" ++ ++msgid "General Setup" ++msgstr "Configurare generala" ++ ++msgid "Generate archive" ++msgstr "" ++ ++msgid "Generic 802.11%s Wireless Controller" ++msgstr "" ++ ++msgid "Given password confirmation did not match, password not changed!" ++msgstr "Confirmarea parolei nu se potriveste cu prima, parola neschimbata !" ++ ++msgid "Global network options" ++msgstr "" ++ ++msgid "Go to password configuration..." ++msgstr "" ++ ++msgid "Go to relevant configuration page" ++msgstr "" ++ ++msgid "Guest" ++msgstr "" ++ ++msgid "HE.net password" ++msgstr "" ++ ++msgid "HE.net username" ++msgstr "" ++ ++msgid "Handler" ++msgstr "" ++ ++msgid "Hang Up" ++msgstr "" ++ ++msgid "Heartbeat" ++msgstr "" ++ ++msgid "" ++"Here you can configure the basic aspects of your device like its hostname or " ++"the timezone." ++msgstr "" ++"Aici poti configura aspectele de baza ale dispozitivului cum ar fi numele " ++"sau fusul orar." ++ ++msgid "" ++"Here you can paste public SSH-Keys (one per line) for SSH public-key " ++"authentication." ++msgstr "" ++ ++msgid "Hermes 802.11b Wireless Controller" ++msgstr "" ++ ++msgid "Hide ESSID" ++msgstr "Ascunde ESSID" ++ ++msgid "Host entries" ++msgstr "Intrari de tip host" ++ ++msgid "Host expiry timeout" ++msgstr "" ++ ++msgid "Host-IP or Network" ++msgstr "" ++ ++msgid "Hostname" ++msgstr "Numele de host" ++ ++msgid "Hostname to send when requesting DHCP" ++msgstr "" ++ ++msgid "Hostnames" ++msgstr "Nume de host" ++ ++msgid "Hybrid" ++msgstr "" ++ ++msgid "IP address" ++msgstr "Adresa IP" ++ ++msgid "IPv4" ++msgstr "IPv4" ++ ++msgid "IPv4 Firewall" ++msgstr "Firewall IPv4" ++ ++msgid "IPv4 WAN Status" ++msgstr "Statusul IPv4 pe WAN" ++ ++msgid "IPv4 address" ++msgstr "Adresa IPv4" ++ ++msgid "IPv4 and IPv6" ++msgstr "IPv4 si IPv6" ++ ++msgid "IPv4 assignment length" ++msgstr "" ++ ++msgid "IPv4 broadcast" ++msgstr "" ++ ++msgid "IPv4 gateway" ++msgstr "" ++ ++msgid "IPv4 netmask" ++msgstr "" ++ ++msgid "IPv4 only" ++msgstr "Doar IPv4" ++ ++msgid "IPv4 prefix length" ++msgstr "" ++ ++msgid "IPv4-Address" ++msgstr "Adresa IPv4" ++ ++msgid "IPv6" ++msgstr "IPv6" ++ ++msgid "IPv6 Firewall" ++msgstr "Firewall IPv6" ++ ++msgid "IPv6 Neighbours" ++msgstr "" ++ ++msgid "IPv6 Settings" ++msgstr "" ++ ++msgid "IPv6 ULA-Prefix" ++msgstr "" ++ ++msgid "IPv6 WAN Status" ++msgstr "Statusul IPv6 pe WAN" ++ ++msgid "IPv6 address" ++msgstr "Adresa IPv6" ++ ++msgid "IPv6 address delegated to the local tunnel endpoint (optional)" ++msgstr "" ++ ++msgid "IPv6 assignment hint" ++msgstr "" ++ ++msgid "IPv6 assignment length" ++msgstr "" ++ ++msgid "IPv6 gateway" ++msgstr "" ++ ++msgid "IPv6 only" ++msgstr "Doar IPv6" ++ ++msgid "IPv6 prefix" ++msgstr "" ++ ++msgid "IPv6 prefix length" ++msgstr "" ++ ++msgid "IPv6 routed prefix" ++msgstr "" ++ ++msgid "IPv6-Address" ++msgstr "" ++ ++msgid "IPv6-in-IPv4 (RFC4213)" ++msgstr "" ++ ++msgid "IPv6-over-IPv4 (6rd)" ++msgstr "" ++ ++msgid "IPv6-over-IPv4 (6to4)" ++msgstr "" ++ ++msgid "Identity" ++msgstr "Identitate" ++ ++msgid "" ++"If specified, mount the device by its UUID instead of a fixed device node" ++msgstr "" ++ ++msgid "" ++"If specified, mount the device by the partition label instead of a fixed " ++"device node" ++msgstr "" ++ ++msgid "If unchecked, no default route is configured" ++msgstr "" ++ ++msgid "If unchecked, the advertised DNS server addresses are ignored" ++msgstr "" ++ ++msgid "" ++"If your physical memory is insufficient unused data can be temporarily " ++"swapped to a swap-device resulting in a higher amount of usable RAM. Be aware that swapping data is a very " ++"slow process as the swap-device cannot be accessed with the high datarates " ++"of the RAM." ++msgstr "" ++ ++msgid "Ignore Hosts files" ++msgstr "" ++ ++msgid "Ignore interface" ++msgstr "" ++ ++msgid "Ignore resolve file" ++msgstr "" ++ ++msgid "Image" ++msgstr "Imagine" ++ ++msgid "In" ++msgstr "" ++ ++msgid "Inactivity timeout" ++msgstr "" ++ ++msgid "Inbound:" ++msgstr "Intrare:" ++ ++msgid "Info" ++msgstr "Informatii" ++ ++msgid "Initscript" ++msgstr "Script de initializare" ++ ++msgid "Initscripts" ++msgstr "Scripturi de initializare" ++ ++msgid "Install" ++msgstr "Instalati" ++ ++msgid "Install iputils-traceroute6 for IPv6 traceroute" ++msgstr "" ++ ++msgid "Install package %q" ++msgstr "Instalati pachetul %q" ++ ++msgid "Install protocol extensions..." ++msgstr "" ++ ++msgid "Installed packages" ++msgstr "Pachete instalate" ++ ++msgid "Interface" ++msgstr "Interfata" ++ ++msgid "Interface Configuration" ++msgstr "Configurarea interfetei" ++ ++msgid "Interface Overview" ++msgstr "Prezentare interfata" ++ ++msgid "Interface is reconnecting..." ++msgstr "Interfata se reconecteaza.." ++ ++msgid "Interface is shutting down..." ++msgstr "Interfata se opreste.." ++ ++msgid "Interface not present or not connected yet." ++msgstr "Interfata nu e prezenta sau nu este conectata inca." ++ ++msgid "Interface reconnected" ++msgstr "Interfata reconectata" ++ ++msgid "Interface shut down" ++msgstr "Interfata oprita" ++ ++msgid "Interfaces" ++msgstr "Interfete" ++ ++msgid "Internal" ++msgstr "" ++ ++msgid "Internal Server Error" ++msgstr "Eroare interna de server" ++ ++msgid "Invalid" ++msgstr "Invalid" ++ ++msgid "Invalid VLAN ID given! Only IDs between %d and %d are allowed." ++msgstr "" ++ ++msgid "Invalid VLAN ID given! Only unique IDs are allowed" ++msgstr "" ++ ++msgid "Invalid username and/or password! Please try again." ++msgstr "Utilizator si/sau parola invalide! Incearcati din nou." ++ ++#, fuzzy ++msgid "" ++"It appears that you are trying to flash an image that does not fit into the " ++"flash memory, please verify the image file!" ++msgstr "" ++"Se pare ca ai incercat sa rescrii o imagine care nu are loc in memoria " ++"flash, verifica fisierul din nou!" ++ ++msgid "Java Script required!" ++msgstr "Ai nevoie de Java Script !" ++ ++msgid "Join Network" ++msgstr "" ++ ++msgid "Join Network: Settings" ++msgstr "" ++ ++msgid "Join Network: Wireless Scan" ++msgstr "" ++ ++msgid "Keep settings" ++msgstr "Pastrati setarile" ++ ++msgid "Kernel Log" ++msgstr "Log-ul kernelului" ++ ++msgid "Kernel Version" ++msgstr "Versiunea de kernel" ++ ++msgid "Key" ++msgstr "" ++ ++msgid "Key #%d" ++msgstr "" ++ ++msgid "Kill" ++msgstr "Opreste" ++ ++msgid "L2TP" ++msgstr "" ++ ++msgid "L2TP Server" ++msgstr "" ++ ++msgid "LCP echo failure threshold" ++msgstr "" ++ ++msgid "LCP echo interval" ++msgstr "" ++ ++msgid "LLC" ++msgstr "" ++ ++msgid "Label" ++msgstr "Eticheta" ++ ++msgid "Language" ++msgstr "Limba" ++ ++msgid "Language and Style" ++msgstr "Limba si stilul interfetei" ++ ++msgid "Leaf" ++msgstr "" ++ ++msgid "Lease validity time" ++msgstr "" ++ ++msgid "Leasefile" ++msgstr "" ++ ++msgid "Leasetime" ++msgstr "" ++ ++msgid "Leasetime remaining" ++msgstr "" ++ ++msgid "Leave empty to autodetect" ++msgstr "" ++ ++msgid "Leave empty to use the current WAN address" ++msgstr "" ++ ++msgid "Legend:" ++msgstr "Legenda:" ++ ++msgid "Limit" ++msgstr "Limita" ++ ++msgid "Line Attenuation" ++msgstr "" ++ ++msgid "Line Speed" ++msgstr "" ++ ++msgid "Line State" ++msgstr "" ++ ++msgid "Link On" ++msgstr "" ++ ++msgid "" ++"List of DNS servers to forward " ++"requests to" ++msgstr "" ++ ++msgid "List of domains to allow RFC1918 responses for" ++msgstr "" ++ ++msgid "List of hosts that supply bogus NX domain results" ++msgstr "" ++ ++msgid "Listen only on the given interface or, if unspecified, on all" ++msgstr "" ++ ++msgid "Listening port for inbound DNS queries" ++msgstr "" ++ ++msgid "Load" ++msgstr "Incarcarea" ++ ++msgid "Load Average" ++msgstr "Incarcarea medie" ++ ++msgid "Loading" ++msgstr "Incarcare" ++ ++msgid "Local IPv4 address" ++msgstr "Adresa IPv4 locala" ++ ++msgid "Local IPv6 address" ++msgstr "Adresa IPv6 locala" ++ ++msgid "Local Startup" ++msgstr "" ++ ++msgid "Local Time" ++msgstr "Ora locala" ++ ++msgid "Local domain" ++msgstr "Domeniu local" ++ ++msgid "" ++"Local domain specification. Names matching this domain are never forwarded " ++"and are resolved from DHCP or hosts files only" ++msgstr "" ++ ++msgid "Local domain suffix appended to DHCP names and hosts file entries" ++msgstr "" ++ ++msgid "Local server" ++msgstr "Server local" ++ ++msgid "" ++"Localise hostname depending on the requesting subnet if multiple IPs are " ++"available" ++msgstr "" ++ ++msgid "Localise queries" ++msgstr "" ++ ++msgid "Locked to channel %d used by: %s" ++msgstr "" ++ ++msgid "Log output level" ++msgstr "" ++ ++msgid "Log queries" ++msgstr "" ++ ++msgid "Logging" ++msgstr "" ++ ++msgid "Login" ++msgstr "Autentificare" ++ ++msgid "Logout" ++msgstr "Iesire" ++ ++msgid "Lowest leased address as offset from the network address." ++msgstr "" ++ ++msgid "MAC-Address" ++msgstr "" ++ ++msgid "MAC-Address Filter" ++msgstr "" ++ ++msgid "MAC-Filter" ++msgstr "" ++ ++msgid "MAC-List" ++msgstr "" ++ ++msgid "MB/s" ++msgstr "" ++ ++msgid "MHz" ++msgstr "" ++ ++msgid "MTU" ++msgstr "" ++ ++msgid "" ++"Make sure to clone the root filesystem using something like the commands " ++"below:" ++msgstr "" ++ ++msgid "Maximum Rate" ++msgstr "Rata maxima" ++ ++msgid "Maximum allowed number of active DHCP leases" ++msgstr "" ++ ++msgid "Maximum allowed number of concurrent DNS queries" ++msgstr "Numarul maxim de intrebari DNS simultane" ++ ++msgid "Maximum allowed size of EDNS.0 UDP packets" ++msgstr "" ++ ++msgid "Maximum amount of seconds to wait for the modem to become ready" ++msgstr "" ++ ++msgid "Maximum hold time" ++msgstr "" ++ ++msgid "Maximum number of leased addresses." ++msgstr "" ++ ++msgid "Mbit/s" ++msgstr "" ++ ++msgid "Memory" ++msgstr "Memorie" ++ ++msgid "Memory usage (%)" ++msgstr "Utilizarea memoriei (%)" ++ ++msgid "Metric" ++msgstr "Metrica" ++ ++msgid "Minimum Rate" ++msgstr "Rata minima" ++ ++msgid "Minimum hold time" ++msgstr "" ++ ++msgid "Mirror monitor port" ++msgstr "" ++ ++msgid "Mirror source port" ++msgstr "" ++ ++msgid "Missing protocol extension for proto %q" ++msgstr "" ++ ++msgid "Mode" ++msgstr "Mod" ++ ++msgid "Model" ++msgstr "" ++ ++msgid "Modem device" ++msgstr "" ++ ++msgid "Modem init timeout" ++msgstr "" ++ ++msgid "Monitor" ++msgstr "" ++ ++msgid "Mount Entry" ++msgstr "" ++ ++msgid "Mount Point" ++msgstr "" ++ ++msgid "Mount Points" ++msgstr "" ++ ++msgid "Mount Points - Mount Entry" ++msgstr "" ++ ++msgid "Mount Points - Swap Entry" ++msgstr "" ++ ++msgid "" ++"Mount Points define at which point a memory device will be attached to the " ++"filesystem" ++msgstr "" ++ ++msgid "Mount options" ++msgstr "" ++ ++msgid "Mount point" ++msgstr "" ++ ++msgid "Mounted file systems" ++msgstr "" ++ ++msgid "Move down" ++msgstr "" ++ ++msgid "Move up" ++msgstr "" ++ ++msgid "Multicast Rate" ++msgstr "Rata de multicast" ++ ++msgid "Multicast address" ++msgstr "" ++ ++msgid "NAS ID" ++msgstr "" ++ ++msgid "NDP-Proxy" ++msgstr "" ++ ++msgid "NTP server candidates" ++msgstr "" ++ ++msgid "NTP sync time-out" ++msgstr "" ++ ++msgid "Name" ++msgstr "Nume" ++ ++msgid "Name of the new interface" ++msgstr "Numele interfetei noi" ++ ++msgid "Name of the new network" ++msgstr "Numele interfetei noi" ++ ++msgid "Navigation" ++msgstr "Navigare" ++ ++msgid "Netmask" ++msgstr "Netmask" ++ ++msgid "Network" ++msgstr "Retea" ++ ++msgid "Network Utilities" ++msgstr "Utilitare de retea" ++ ++msgid "Network boot image" ++msgstr "" ++ ++msgid "Network without interfaces." ++msgstr "" ++ ++msgid "Next »" ++msgstr "Mai departe »" ++ ++msgid "No DHCP Server configured for this interface" ++msgstr "Nici un server DHCP configurat pentru aceasta interfata" ++ ++msgid "No chains in this table" ++msgstr "" ++ ++msgid "No files found" ++msgstr "Nici un fisier gasit" ++ ++msgid "No information available" ++msgstr "Nici o informatie disponibila" ++ ++msgid "No negative cache" ++msgstr "" ++ ++msgid "No network configured on this device" ++msgstr "Nici o retea configurata pe acest dispozitiv" ++ ++msgid "No network name specified" ++msgstr "" ++ ++msgid "No package lists available" ++msgstr "" ++ ++msgid "No password set!" ++msgstr "Nici o parola setata !" ++ ++msgid "No rules in this chain" ++msgstr "" ++ ++msgid "No zone assigned" ++msgstr "" ++ ++msgid "Noise" ++msgstr "Zgomot" ++ ++msgid "Noise Margin" ++msgstr "" ++ ++msgid "Noise:" ++msgstr "Zgomot:" ++ ++msgid "None" ++msgstr "" ++ ++msgid "Normal" ++msgstr "Normal" ++ ++msgid "Not Found" ++msgstr "Nu a fost gasit" ++ ++msgid "Not associated" ++msgstr "Nu este asociat." ++ ++msgid "Not connected" ++msgstr "Nu este conectat" ++ ++msgid "Note: Configuration files will be erased." ++msgstr "Nota: fisierele de configurare vor fi sterse." ++ ++msgid "Notice" ++msgstr "Notificare" ++ ++msgid "Nslookup" ++msgstr "" ++ ++msgid "OK" ++msgstr "OK" ++ ++msgid "OPKG-Configuration" ++msgstr "Configuratia-OPKG" ++ ++msgid "Off-State Delay" ++msgstr "" ++ ++msgid "" ++"On this page you can configure the network interfaces. You can bridge " ++"several interfaces by ticking the \"bridge interfaces\" field and enter the " ++"names of several network interfaces separated by spaces. You can also use " ++"VLAN notation " ++"INTERFACE.VLANNR (e.g.: " ++"eth0.1)." ++msgstr "" ++ ++msgid "On-State Delay" ++msgstr "" ++ ++msgid "One of hostname or mac address must be specified!" ++msgstr "" ++ ++msgid "One or more fields contain invalid values!" ++msgstr "Unul sau mai multe campuri contin valori invalide !" ++ ++msgid "One or more required fields have no value!" ++msgstr "Unul sau mai multe campuri nu contin valori !" ++ ++msgid "Open list..." ++msgstr "" ++ ++msgid "OpenConnect (CISCO AnyConnect)" ++msgstr "" ++ ++msgid "Operating frequency" ++msgstr "" ++ ++msgid "Option changed" ++msgstr "Optiunea schimbata" ++ ++msgid "Option removed" ++msgstr "Optiunea eliminata" ++ ++msgid "Optional, specify to override default server (tic.sixxs.net)" ++msgstr "" ++ ++msgid "Optional, use when the SIXXS account has more than one tunnel" ++msgstr "" ++ ++msgid "Options" ++msgstr "Optiuni" ++ ++msgid "Other:" ++msgstr "Altele:" ++ ++msgid "Out" ++msgstr "Iesire" ++ ++msgid "Outbound:" ++msgstr "" ++ ++msgid "Outdoor Channels" ++msgstr "" ++ ++msgid "Output Interface" ++msgstr "" ++ ++msgid "Override MAC address" ++msgstr "" ++ ++msgid "Override MTU" ++msgstr "" ++ ++msgid "Override the gateway in DHCP responses" ++msgstr "" ++ ++msgid "" ++"Override the netmask sent to clients. Normally it is calculated from the " ++"subnet that is served." ++msgstr "" ++ ++msgid "Override the table used for internal routes" ++msgstr "" ++ ++msgid "Overview" ++msgstr "Prezentare generala" ++ ++msgid "Owner" ++msgstr "Proprietar" ++ ++msgid "PAP/CHAP password" ++msgstr "" ++ ++msgid "PAP/CHAP username" ++msgstr "" ++ ++msgid "PID" ++msgstr "PID" ++ ++msgid "PIN" ++msgstr "" ++ ++msgid "PPP" ++msgstr "" ++ ++msgid "PPPoA Encapsulation" ++msgstr "Incapsulare PPPoA" ++ ++msgid "PPPoATM" ++msgstr "" ++ ++msgid "PPPoE" ++msgstr "" ++ ++msgid "PPtP" ++msgstr "" ++ ++msgid "Package libiwinfo required!" ++msgstr "Pachetul libiwinfo este necesar !" ++ ++msgid "Package lists are older than 24 hours" ++msgstr "" ++ ++msgid "Package name" ++msgstr "Numele pachetului" ++ ++msgid "Packets" ++msgstr "Pachete" ++ ++msgid "Part of zone %q" ++msgstr "" ++ ++msgid "Password" ++msgstr "Parola" ++ ++msgid "Password authentication" ++msgstr "Autentificarea cu parola" ++ ++msgid "Password of Private Key" ++msgstr "Parola cheii private" ++ ++msgid "Password successfully changed!" ++msgstr "Parola schimbata cu succes !" ++ ++msgid "Path" ++msgstr "" ++ ++msgid "Path to CA-Certificate" ++msgstr "Calea catre certificatul CA" ++ ++msgid "Path to Client-Certificate" ++msgstr "" ++ ++msgid "Path to Private Key" ++msgstr "Calea catre cheia privata" ++ ++msgid "Path to executable which handles the button event" ++msgstr "Calea catre executabilul care se ocupa de evenimentul butonului" ++ ++msgid "Peak:" ++msgstr "Maxim:" ++ ++msgid "Perform reboot" ++msgstr "Restarteaza" ++ ++msgid "Perform reset" ++msgstr "Reseteaza" ++ ++msgid "Phy Rate:" ++msgstr "Rata phy:" ++ ++msgid "Physical Settings" ++msgstr "Setarile fizice" ++ ++msgid "Ping" ++msgstr "" ++ ++msgid "Pkts." ++msgstr "Packete." ++ ++msgid "Please enter your username and password." ++msgstr "Introdu utilizatorul si parola." ++ ++msgid "Please wait: Device rebooting..." ++msgstr "Asteapta: dispozitivul se restarteaza.." ++ ++msgid "Policy" ++msgstr "" ++ ++msgid "Port" ++msgstr "Port" ++ ++msgid "Port %d" ++msgstr "Port %d" ++ ++msgid "Port %d is untagged in multiple VLANs!" ++msgstr "" ++ ++msgid "Port status:" ++msgstr "Stare port:" ++ ++msgid "" ++"Presume peer to be dead after given amount of LCP echo failures, use 0 to " ++"ignore failures" ++msgstr "" ++ ++msgid "Prevents client-to-client communication" ++msgstr "" ++ ++msgid "Prism2/2.5/3 802.11b Wireless Controller" ++msgstr "" ++ ++msgid "Proceed" ++msgstr "Continua" ++ ++msgid "Processes" ++msgstr "Procese" ++ ++msgid "Prot." ++msgstr "" ++ ++msgid "Protocol" ++msgstr "Protocol" ++ ++msgid "Protocol family" ++msgstr "Familia de protocol" ++ ++msgid "Protocol of the new interface" ++msgstr "" ++ ++msgid "Protocol support is not installed" ++msgstr "" ++ ++msgid "Provide NTP server" ++msgstr "" ++ ++msgid "Provide new network" ++msgstr "" ++ ++msgid "Pseudo Ad-Hoc (ahdemo)" ++msgstr "" ++ ++msgid "Public prefix routed to this device for distribution to clients." ++msgstr "" ++ ++msgid "Quality" ++msgstr "Calitate" ++ ++msgid "RTS/CTS Threshold" ++msgstr "" ++ ++msgid "RX" ++msgstr "RX" ++ ++msgid "RX Rate" ++msgstr "" ++ ++msgid "RaLink 802.11%s Wireless Controller" ++msgstr "" ++ ++msgid "Radius-Accounting-Port" ++msgstr "" ++ ++msgid "Radius-Accounting-Secret" ++msgstr "" ++ ++msgid "Radius-Accounting-Server" ++msgstr "" ++ ++msgid "Radius-Authentication-Port" ++msgstr "" ++ ++msgid "Radius-Authentication-Secret" ++msgstr "" ++ ++msgid "Radius-Authentication-Server" ++msgstr "" ++ ++msgid "" ++"Read /etc/ethers to configure the DHCP-Server" ++msgstr "" ++"Citeste fisierul /etc/ethers pentru configurarea serverului " ++"DHCP-" ++ ++msgid "" ++"Really delete this interface? The deletion cannot be undone!\\nYou might " ++"lose access to this device if you are connected via this interface." ++msgstr "" ++ ++msgid "" ++"Really delete this wireless network? The deletion cannot be undone!\\nYou " ++"might lose access to this device if you are connected via this network." ++msgstr "" ++ ++msgid "Really reset all changes?" ++msgstr "" ++ ++msgid "" ++"Really shut down network?\\nYou might lose access to this device if you are " ++"connected via this interface." ++msgstr "" ++ ++msgid "" ++"Really shutdown interface \"%s\" ?\\nYou might lose access to this device if " ++"you are connected via this interface." ++msgstr "" ++ ++msgid "Really switch protocol?" ++msgstr "" ++ ++msgid "Realtime Connections" ++msgstr "Conexiuni in timp real" ++ ++msgid "Realtime Graphs" ++msgstr "Grafice in timp real" ++ ++msgid "Realtime Load" ++msgstr "Incarcarea in timp real" ++ ++msgid "Realtime Traffic" ++msgstr "Traficul in timp real" ++ ++msgid "Realtime Wireless" ++msgstr "" ++ ++msgid "Rebind protection" ++msgstr "" ++ ++msgid "Reboot" ++msgstr "Rebooteaza" ++ ++msgid "Rebooting..." ++msgstr "" ++ ++msgid "Reboots the operating system of your device" ++msgstr "Rebooteaza sistemul de operare al dispozitivului tau" ++ ++msgid "Receive" ++msgstr "" ++ ++msgid "Receiver Antenna" ++msgstr "Antena receptorului" ++ ++msgid "Reconnect this interface" ++msgstr "Reconecteaza aceasta interfata" ++ ++msgid "Reconnecting interface" ++msgstr "Interfata se reconecteaza chiar acum" ++ ++msgid "References" ++msgstr "Referinte" ++ ++msgid "Regulatory Domain" ++msgstr "Domeniu regulatoriu" ++ ++msgid "Relay" ++msgstr "" ++ ++msgid "Relay Bridge" ++msgstr "" ++ ++msgid "Relay between networks" ++msgstr "" ++ ++msgid "Relay bridge" ++msgstr "" ++ ++msgid "Remote IPv4 address" ++msgstr "" ++ ++msgid "Remove" ++msgstr "Elimina" ++ ++msgid "Repeat scan" ++msgstr "Repeta scanarea" ++ ++msgid "Replace entry" ++msgstr "Inlocuieste intrarea" ++ ++msgid "Replace wireless configuration" ++msgstr "Inlocuieste configuratia wireless" ++ ++msgid "Request IPv6-address" ++msgstr "" ++ ++msgid "Request IPv6-prefix of length" ++msgstr "" ++ ++msgid "Require TLS" ++msgstr "" ++ ++msgid "Required for certain ISPs, e.g. Charter with DOCSIS 3" ++msgstr "" ++ ++msgid "Reset" ++msgstr "Reset" ++ ++msgid "Reset Counters" ++msgstr "Reseteaza counterii" ++ ++msgid "Reset to defaults" ++msgstr "" ++ ++msgid "Resolv and Hosts Files" ++msgstr "Fisierele de rezolvare si hosturi DNS" ++ ++msgid "Resolve file" ++msgstr "Fisierul de rezolvare" ++ ++msgid "Restart" ++msgstr "Restart" ++ ++msgid "Restart Firewall" ++msgstr "Restarteaza firewallul" ++ ++msgid "Restore backup" ++msgstr "Reface backup-ul" ++ ++msgid "Reveal/hide password" ++msgstr "Arata / ascunde parola" ++ ++msgid "Revert" ++msgstr "" ++ ++msgid "Root" ++msgstr "" ++ ++msgid "Root directory for files served via TFTP" ++msgstr "" ++ ++msgid "Root preparation" ++msgstr "" ++ ++msgid "Routed IPv6 prefix for downstream interfaces" ++msgstr "" ++ ++msgid "Router Advertisement-Service" ++msgstr "" ++ ++msgid "Router Password" ++msgstr "Parola routerului" ++ ++msgid "Routes" ++msgstr "Rute" ++ ++msgid "" ++"Routes specify over which interface and gateway a certain host or network " ++"can be reached." ++msgstr "" ++ ++msgid "Rule #" ++msgstr "Regula #" ++ ++msgid "Run a filesystem check before mounting the device" ++msgstr "" ++ ++msgid "Run filesystem check" ++msgstr "" ++ ++msgid "" ++"SIXXS supports TIC only, for static tunnels using IP protocol 41 (RFC4213) " ++"use 6in4 instead" ++msgstr "" ++ ++msgid "SIXXS-handle[/Tunnel-ID]" ++msgstr "" ++ ++msgid "SSH Access" ++msgstr "Acces SSH" ++ ++msgid "SSH-Keys" ++msgstr "Cheile SSH" ++ ++msgid "SSID" ++msgstr "SSID" ++ ++msgid "Save" ++msgstr "Salveaza" ++ ++msgid "Save & Apply" ++msgstr "Salveaza si aplica" ++ ++msgid "Save & Apply" ++msgstr "Salveaza & Aplica" ++ ++msgid "Scan" ++msgstr "Scan" ++ ++msgid "Scheduled Tasks" ++msgstr "Operatiuni programate" ++ ++msgid "Section added" ++msgstr "Sectiune adaugata" ++ ++msgid "Section removed" ++msgstr "Sectiune eliminata" ++ ++msgid "See \"mount\" manpage for details" ++msgstr "" ++ ++msgid "" ++"Send LCP echo requests at the given interval in seconds, only effective in " ++"conjunction with failure threshold" ++msgstr "" ++ ++msgid "Separate Clients" ++msgstr "" ++ ++msgid "Separate WDS" ++msgstr "" ++ ++msgid "Server Settings" ++msgstr "Setarile serverului" ++ ++msgid "Server password" ++msgstr "" ++ ++msgid "" ++"Server password, enter the specific password of the tunnel when the username " ++"contains the tunnel ID" ++msgstr "" ++ ++msgid "Server username" ++msgstr "" ++ ++msgid "Service Name" ++msgstr "Nume serviciu" ++ ++msgid "Service Type" ++msgstr "Tip de serviciu" ++ ++msgid "Services" ++msgstr "Servicii" ++ ++#, fuzzy ++msgid "Set up Time Synchronization" ++msgstr "Configurare sincronizare timp" ++ ++msgid "Setup DHCP Server" ++msgstr "Seteaza serverul DHCP" ++ ++msgid "Show current backup file list" ++msgstr "" ++ ++msgid "Shutdown this interface" ++msgstr "Opreste aceasta interfata" ++ ++msgid "Shutdown this network" ++msgstr "Opreste aceasta retea" ++ ++msgid "Signal" ++msgstr "Semnal" ++ ++msgid "Signal:" ++msgstr "Semnal:" ++ ++msgid "Size" ++msgstr "Marime" ++ ++msgid "Skip" ++msgstr "" ++ ++msgid "Skip to content" ++msgstr "" ++ ++msgid "Skip to navigation" ++msgstr "" ++ ++msgid "Slot time" ++msgstr "" ++ ++msgid "Software" ++msgstr "Software" ++ ++msgid "Some fields are invalid, cannot save values!" ++msgstr "" ++ ++msgid "Sorry, the object you requested was not found." ++msgstr "" ++ ++msgid "Sorry, the server encountered an unexpected error." ++msgstr "" ++ ++msgid "" ++"Sorry, there is no sysupgrade support present; a new firmware image must be " ++"flashed manually. Please refer to the OpenWrt wiki for device specific " ++"install instructions." ++msgstr "" ++ ++msgid "Sort" ++msgstr "" ++ ++msgid "Source" ++msgstr "Sursa" ++ ++msgid "Source routing" ++msgstr "" ++ ++msgid "Specifies the button state to handle" ++msgstr "" ++ ++msgid "Specifies the directory the device is attached to" ++msgstr "" ++ ++msgid "Specifies the listening port of this Dropbear instance" ++msgstr "" ++ ++msgid "" ++"Specifies the maximum amount of failed ARP requests until hosts are presumed " ++"to be dead" ++msgstr "" ++ ++msgid "" ++"Specifies the maximum amount of seconds after which hosts are presumed to be " ++"dead" ++msgstr "" ++ ++msgid "Specify the secret encryption key here." ++msgstr "" ++ ++msgid "Start" ++msgstr "Start" ++ ++msgid "Start priority" ++msgstr "" ++ ++msgid "Startup" ++msgstr "Pornire" ++ ++msgid "Static IPv4 Routes" ++msgstr "Rute statice IPv4" ++ ++msgid "Static IPv6 Routes" ++msgstr "Rute statice IPv6" ++ ++msgid "Static Leases" ++msgstr "" ++ ++msgid "Static Routes" ++msgstr "Rute statice" ++ ++msgid "Static WDS" ++msgstr "" ++ ++msgid "Static address" ++msgstr "" ++ ++msgid "" ++"Static leases are used to assign fixed IP addresses and symbolic hostnames " ++"to DHCP clients. They are also required for non-dynamic interface " ++"configurations where only hosts with a corresponding lease are served." ++msgstr "" ++ ++msgid "Status" ++msgstr "Status" ++ ++msgid "Stop" ++msgstr "Stop" ++ ++msgid "Strict order" ++msgstr "" ++ ++msgid "Submit" ++msgstr "Trimite" ++ ++msgid "Swap" ++msgstr "" ++ ++msgid "Swap Entry" ++msgstr "" ++ ++msgid "Switch" ++msgstr "" ++ ++msgid "Switch %q" ++msgstr "" ++ ++msgid "Switch %q (%s)" ++msgstr "" ++ ++msgid "Switch protocol" ++msgstr "" ++ ++msgid "Sync with browser" ++msgstr "" ++ ++msgid "Synchronizing..." ++msgstr "" ++ ++msgid "System" ++msgstr "Sistem" ++ ++msgid "System Log" ++msgstr "Log de sistem" ++ ++msgid "System Properties" ++msgstr "Proprietati sistem" ++ ++msgid "System log buffer size" ++msgstr "" ++ ++msgid "TCP:" ++msgstr "" ++ ++msgid "TFTP Settings" ++msgstr "Setarile TFTP" ++ ++msgid "TFTP server root" ++msgstr "" ++ ++msgid "TX" ++msgstr "TX" ++ ++msgid "TX Rate" ++msgstr "" ++ ++msgid "Table" ++msgstr "Tabel" ++ ++msgid "Target" ++msgstr "Tinta" ++ ++msgid "Terminate" ++msgstr "Termina" ++ ++msgid "" ++"The Device Configuration section covers physical settings of the " ++"radio hardware such as channel, transmit power or antenna selection which " ++"are shared among all defined wireless networks (if the radio hardware is " ++"multi-SSID capable). Per network settings like encryption or operation mode " ++"are grouped in the Interface Configuration." ++msgstr "" ++ ++msgid "" ++"The libiwinfo-lua package is not installed. You must install this " ++"component for working wireless configuration!" ++msgstr "" ++ ++msgid "" ++"The HE.net endpoint update configuration changed, you must now use the plain " ++"username instead of the user ID!" ++msgstr "" ++ ++msgid "" ++"The IPv6 prefix assigned to the provider, usually ends with ::" ++msgstr "" ++ ++msgid "" ++"The allowed characters are: A-Z, a-z, 0-9 and _" ++msgstr "" ++ ++msgid "The configuration file could not be loaded due to the following error:" ++msgstr "" ++ ++msgid "" ++"The device file of the memory or partition (e.g." ++" /dev/sda1)" ++msgstr "" ++ ++msgid "" ++"The filesystem that was used to format the memory (e.g. ext3)" ++msgstr "" ++ ++msgid "" ++"The flash image was uploaded. Below is the checksum and file size listed, " ++"compare them with the original file to ensure data integrity.
    Click " ++"\"Proceed\" below to start the flash procedure." ++msgstr "" ++ ++msgid "The following changes have been committed" ++msgstr "" ++ ++msgid "The following changes have been reverted" ++msgstr "" ++ ++msgid "The following rules are currently active on this system." ++msgstr "" ++ ++msgid "The given network name is not unique" ++msgstr "" ++ ++msgid "" ++"The hardware is not multi-SSID capable and the existing configuration will " ++"be replaced if you proceed." ++msgstr "" ++ ++msgid "" ++"The length of the IPv4 prefix in bits, the remainder is used in the IPv6 " ++"addresses." ++msgstr "" ++ ++msgid "The length of the IPv6 prefix in bits" ++msgstr "" ++ ++msgid "" ++"The network ports on this device can be combined to several VLANs in which computers can " ++"communicate directly with each other. VLANs are often used to separate different network " ++"segments. Often there is by default one Uplink port for a connection to the " ++"next greater network like the internet and other ports for a local network." ++msgstr "" ++ ++msgid "The selected protocol needs a device assigned" ++msgstr "" ++ ++msgid "" ++"The system is erasing the configuration partition now and will reboot itself " ++"when finished." ++msgstr "" ++ ++msgid "" ++"The system is flashing now.
    DO NOT POWER OFF THE DEVICE!
    Wait a " ++"few minutes before you try to reconnect. It might be necessary to renew the " ++"address of your computer to reach the device again, depending on your " ++"settings." ++msgstr "" ++ ++msgid "" ++"The tunnel end-point is behind NAT, defaults to disabled and only applies to " ++"AYIYA" ++msgstr "" ++ ++msgid "" ++"The uploaded image file does not contain a supported format. Make sure that " ++"you choose the generic image format for your platform." ++msgstr "" ++ ++msgid "There are no active leases." ++msgstr "" ++ ++msgid "There are no pending changes to apply!" ++msgstr "Nu exista modificari in asteptare de aplicat !" ++ ++msgid "There are no pending changes to revert!" ++msgstr "Nu exista modificari in asteptare de anulat !" ++ ++msgid "There are no pending changes!" ++msgstr "Nu exista modificari in asteptare !" ++ ++msgid "" ++"There is no device assigned yet, please attach a network device in the " ++"\"Physical Settings\" tab" ++msgstr "" ++ ++msgid "" ++"There is no password set on this router. Please configure a root password to " ++"protect the web interface and enable SSH." ++msgstr "" ++"Nu exista o parola pe acest router. Configureaza o parola la contul root " ++"pentru a proteja interfata web si porni SSH." ++ ++msgid "This IPv4 address of the relay" ++msgstr "" ++ ++msgid "" ++"This is a list of shell glob patterns for matching files and directories to " ++"include during sysupgrade. Modified files in /etc/config/ and certain other " ++"configurations are automatically preserved." ++msgstr "" ++ ++msgid "" ++"This is either the \"Update Key\" configured for the tunnel or the account " ++"password if no update key has been configured" ++msgstr "" ++ ++msgid "" ++"This is the content of /etc/rc.local. Insert your own commands here (in " ++"front of 'exit 0') to execute them at the end of the boot process." ++msgstr "" ++ ++msgid "" ++"This is the local endpoint address assigned by the tunnel broker, it usually " ++"ends with :2" ++msgstr "" ++ ++msgid "" ++"This is the only DHCP in the local network" ++msgstr "" ++ ++msgid "This is the plain username for logging into the account" ++msgstr "" ++ ++msgid "" ++"This is the prefix routed to you by the tunnel broker for use by clients" ++msgstr "" ++ ++msgid "This is the system crontab in which scheduled tasks can be defined." ++msgstr "" ++ ++msgid "" ++"This is usually the address of the nearest PoP operated by the tunnel broker" ++msgstr "" ++ ++msgid "" ++"This list gives an overview over currently running system processes and " ++"their status." ++msgstr "" ++ ++msgid "This page allows the configuration of custom button actions" ++msgstr "" ++ ++msgid "This page gives an overview over currently active network connections." ++msgstr "" ++ ++msgid "This section contains no values yet" ++msgstr "" ++ ++msgid "Time Synchronization" ++msgstr "" ++ ++msgid "Time Synchronization is not configured yet." ++msgstr "" ++ ++msgid "Timezone" ++msgstr "Fusul orar" ++ ++msgid "" ++"To restore configuration files, you can upload a previously generated backup " ++"archive here." ++msgstr "" ++ ++msgid "Total Available" ++msgstr "Total disponibil" ++ ++msgid "Traceroute" ++msgstr "" ++ ++msgid "Traffic" ++msgstr "Trafic" ++ ++msgid "Transfer" ++msgstr "Transfer" ++ ++msgid "Transmission Rate" ++msgstr "Rata de transmitere" ++ ++msgid "Transmit" ++msgstr "" ++ ++msgid "Transmit Power" ++msgstr "Puterea de transmitere" ++ ++msgid "Transmitter Antenna" ++msgstr "Antena de transmitere" ++ ++msgid "Trigger" ++msgstr "" ++ ++msgid "Trigger Mode" ++msgstr "" ++ ++msgid "Tunnel ID" ++msgstr "" ++ ++msgid "Tunnel Interface" ++msgstr "Interfata de tunel" ++ ++msgid "Tunnel Link" ++msgstr "" ++ ++msgid "Tunnel broker protocol" ++msgstr "" ++ ++msgid "Tunnel setup server" ++msgstr "" ++ ++msgid "Tunnel type" ++msgstr "" ++ ++msgid "Turbo Mode" ++msgstr "Mod turbo" ++ ++msgid "Tx-Power" ++msgstr "Puterea TX" ++ ++msgid "Type" ++msgstr "Tip" ++ ++msgid "UDP:" ++msgstr "UDP:" ++ ++msgid "UMTS only" ++msgstr "Doar UMTS" ++ ++msgid "UMTS/GPRS/EV-DO" ++msgstr "" ++ ++msgid "USB Device" ++msgstr "Dispozitiv USB" ++ ++msgid "UUID" ++msgstr "UUID" ++ ++msgid "Unable to dispatch" ++msgstr "" ++ ++msgid "Unknown" ++msgstr "Necunoscut" ++ ++msgid "Unknown Error, password not changed!" ++msgstr "Eroare necunoscuta, parola neschimbata !" ++ ++msgid "Unmanaged" ++msgstr "Neadministrate" ++ ++msgid "Unsaved Changes" ++msgstr "Modificari nesalvate" ++ ++msgid "Unsupported protocol type." ++msgstr "Tipul de protocol neacceptat." ++ ++msgid "Update lists" ++msgstr "" ++ ++msgid "" ++"Upload a sysupgrade-compatible image here to replace the running firmware. " ++"Check \"Keep settings\" to retain the current configuration (requires an " ++"OpenWrt compatible firmware image)." ++msgstr "" ++ ++msgid "Upload archive..." ++msgstr "" ++ ++msgid "Uploaded File" ++msgstr "Fisier incarcat" ++ ++msgid "Uptime" ++msgstr "Uptime" ++ ++msgid "Use /etc/ethers" ++msgstr "Foloseste /etc/ethers" ++ ++msgid "Use DHCP gateway" ++msgstr "" ++ ++msgid "Use DNS servers advertised by peer" ++msgstr "" ++ ++msgid "Use ISO/IEC 3166 alpha2 country codes." ++msgstr "Foloseste codurile de tara ISO/IEC 3166 alpha2." ++ ++msgid "Use MTU on tunnel interface" ++msgstr "" ++ ++msgid "Use TTL on tunnel interface" ++msgstr "" ++ ++msgid "Use as external overlay (/overlay)" ++msgstr "" ++ ++msgid "Use as root filesystem (/)" ++msgstr "" ++ ++msgid "Use broadcast flag" ++msgstr "" ++ ++msgid "Use builtin IPv6-management" ++msgstr "" ++ ++msgid "Use custom DNS servers" ++msgstr "" ++ ++msgid "Use default gateway" ++msgstr "" ++ ++msgid "Use gateway metric" ++msgstr "" ++ ++msgid "Use routing table" ++msgstr "" ++ ++msgid "" ++"Use the Add Button to add a new lease entry. The MAC-Address indentifies the host, the IPv4-Address specifies to the fixed " ++"address to use and the Hostname is assigned as symbolic name to the " ++"requesting host." ++msgstr "" ++ ++msgid "Used" ++msgstr "Folosit" ++ ++msgid "Used Key Slot" ++msgstr "Slot de cheie folosit" ++ ++msgid "User certificate (PEM encoded)" ++msgstr "" ++ ++msgid "User key (PEM encoded)" ++msgstr "" ++ ++msgid "Username" ++msgstr "Utilizator" ++ ++msgid "VC-Mux" ++msgstr "VC-Mux" ++ ++msgid "VLAN Interface" ++msgstr "Interfata VLAN" ++ ++msgid "VLANs on %q" ++msgstr "VLANuri pe %q" ++ ++msgid "VLANs on %q (%s)" ++msgstr "" ++ ++msgid "VPN Server" ++msgstr "" ++ ++msgid "VPN Server port" ++msgstr "" ++ ++msgid "VPN Server's certificate SHA1 hash" ++msgstr "" ++ ++msgid "Vendor Class to send when requesting DHCP" ++msgstr "" ++ ++msgid "Verbose" ++msgstr "" ++ ++msgid "Verbose logging by aiccu daemon" ++msgstr "" ++ ++msgid "Verify" ++msgstr "" ++ ++msgid "Version" ++msgstr "Versiune" ++ ++msgid "WDS" ++msgstr "WDS" ++ ++msgid "WEP Open System" ++msgstr "Sistem deschis WEP" ++ ++msgid "WEP Shared Key" ++msgstr "Sistem de cheie impartasita WEP" ++ ++msgid "WEP passphrase" ++msgstr "Parola WEP" ++ ++msgid "WMM Mode" ++msgstr "Mod WMM" ++ ++msgid "WPA passphrase" ++msgstr "Parola WPA" ++ ++msgid "" ++"WPA-Encryption requires wpa_supplicant (for client mode) or hostapd (for AP " ++"and ad-hoc mode) to be installed." ++msgstr "" ++"Criptarea WPA necesita wpa_supplicant (pentru modul client) sau hostapd " ++"(pentru modul AP sau ad-hoc) instalate." ++ ++msgid "" ++"Wait for NTP sync that many seconds, seting to 0 disables waiting (optional)" ++msgstr "" ++ ++msgid "Waiting for changes to be applied..." ++msgstr "" ++ ++msgid "Waiting for command to complete..." ++msgstr "" ++ ++msgid "Warning" ++msgstr "Avertizare" ++ ++msgid "Warning: There are unsaved changes that will be lost while rebooting!" ++msgstr "Atentie: exista modificari nesalvate care vor fi pierdute la restart !" ++ ++msgid "Whether to create an IPv6 default route over the tunnel" ++msgstr "" ++ ++msgid "Whether to route only packets from delegated prefixes" ++msgstr "" ++ ++msgid "Width" ++msgstr "" ++ ++msgid "Wifi" ++msgstr "Wifi" ++ ++msgid "Wireless" ++msgstr "Wireless" ++ ++msgid "Wireless Adapter" ++msgstr "Adaptorul wireless" ++ ++msgid "Wireless Network" ++msgstr "Retea wireless" ++ ++msgid "Wireless Overview" ++msgstr "Sumarul wireless" ++ ++msgid "Wireless Security" ++msgstr "Securitate wireless" ++ ++msgid "Wireless is disabled or not associated" ++msgstr "Wireless-ul este dezactivat sau ne-asociat" ++ ++msgid "Wireless is restarting..." ++msgstr "Wireless-ul se restarteaza.." ++ ++msgid "Wireless network is disabled" ++msgstr "Reteaua wireless este dezactivata" ++ ++msgid "Wireless network is enabled" ++msgstr "Reteaua wireless este activata" ++ ++msgid "Wireless restarted" ++msgstr "Wireless-ul restartat" ++ ++msgid "Wireless shut down" ++msgstr "Wireless-ul oprit" ++ ++msgid "Write received DNS requests to syslog" ++msgstr "Scrie cererile DNS primite in syslog" ++ ++msgid "XR Support" ++msgstr "Suport XR" ++ ++msgid "" ++"You can enable or disable installed init scripts here. Changes will applied " ++"after a device reboot.
    Warning: If you disable essential init " ++"scripts like \"network\", your device might become inaccessible!" ++msgstr "" ++ ++msgid "" ++"You must enable Java Script in your browser or LuCI will not work properly." ++msgstr "" ++ ++msgid "" ++"Your Internet Explorer is too old to display this page correctly. Please " ++"upgrade it to at least version 7 or use another browser like Firefox, Opera " ++"or Safari." ++msgstr "" ++ ++msgid "any" ++msgstr "oricare" ++ ++msgid "auto" ++msgstr "auto" ++ ++msgid "automatic" ++msgstr "" ++ ++msgid "baseT" ++msgstr "" ++ ++msgid "bridged" ++msgstr "" ++ ++msgid "create:" ++msgstr "" ++ ++msgid "creates a bridge over specified interface(s)" ++msgstr "" ++ ++msgid "dB" ++msgstr "" ++ ++msgid "dBm" ++msgstr "" ++ ++msgid "disable" ++msgstr "dezactiveaza" ++ ++msgid "disabled" ++msgstr "" ++ ++msgid "expired" ++msgstr "expirat" ++ ++msgid "" ++"file where given DHCP-leases will be stored" ++msgstr "" ++ ++msgid "forward" ++msgstr "" ++ ++msgid "full-duplex" ++msgstr "" ++ ++msgid "half-duplex" ++msgstr "" ++ ++msgid "help" ++msgstr "ajutor" ++ ++msgid "hidden" ++msgstr "ascuns" ++ ++msgid "hybrid mode" ++msgstr "" ++ ++msgid "if target is a network" ++msgstr "daca tinta este o retea" ++ ++msgid "input" ++msgstr "" ++ ++msgid "kB" ++msgstr "" ++ ++msgid "kB/s" ++msgstr "" ++ ++msgid "kbit/s" ++msgstr "" ++ ++msgid "local DNS file" ++msgstr "" ++ ++msgid "minimum 1280, maximum 1480" ++msgstr "" ++ ++msgid "navigation Navigation" ++msgstr "" ++ ++msgid "no" ++msgstr "nu" ++ ++msgid "no link" ++msgstr "" ++ ++msgid "none" ++msgstr "" ++ ++msgid "not present" ++msgstr "" ++ ++msgid "off" ++msgstr "" ++ ++msgid "on" ++msgstr "" ++ ++msgid "open" ++msgstr "" ++ ++msgid "overlay" ++msgstr "" ++ ++msgid "relay mode" ++msgstr "" ++ ++msgid "routed" ++msgstr "rutat" ++ ++msgid "server mode" ++msgstr "" ++ ++msgid "skiplink1 Skip to navigation" ++msgstr "" ++ ++msgid "skiplink2 Skip to content" ++msgstr "" ++ ++msgid "stateful-only" ++msgstr "" ++ ++msgid "stateless" ++msgstr "" ++ ++msgid "stateless + stateful" ++msgstr "" ++ ++msgid "tagged" ++msgstr "etichetat" ++ ++msgid "unknown" ++msgstr "necunoscut" ++ ++msgid "unlimited" ++msgstr "nelimitat" ++ ++msgid "unspecified" ++msgstr "nespecificat" ++ ++msgid "unspecified -or- create:" ++msgstr "" ++ ++msgid "untagged" ++msgstr "neetichetat" ++ ++msgid "yes" ++msgstr "da" ++ ++msgid "« Back" ++msgstr "« Inapoi" ++ ++#~ msgid "" ++#~ "Always use 40MHz channels even if the secondary channel overlaps. Using " ++#~ "this option does not comply with IEEE 802.11n-2009!" ++#~ msgstr "" ++#~ "Intotdeauna foloseste canalul de 40MHz chiar daca canalul secundar da " ++#~ "rateu. Folosirea acestei optiuni nu este compatibila cu IEEE 802.11n-2009!" ++ ++#~ msgid "Cached" ++#~ msgstr "Asimilat" ++ ++#~ msgid "Use as root filesystem" ++#~ msgstr "Foloseste ca sistem de fisiere primar" ++ ++#~ msgid "40MHz 2nd channel above" ++#~ msgstr "40MHz 2 canale de mai jos" ++ ++#~ msgid "40MHz 2nd channel below" ++#~ msgstr "40MHz 2 canale de mai sus" ++ ++#~ msgid "Accept router advertisements" ++#~ msgstr "Accepta anunturile routerului" ++ ++#~ msgid "Advertise IPv6 on network" ++#~ msgstr "Anunta IPv6 in retea" ++ ++#~ msgid "Advertised network ID" ++#~ msgstr "ID-ul retelei anuntate" ++ ++#~ msgid "Allowed range is 1 to 65535" ++#~ msgstr "Plaja permisa este de la 1 la 65535" ++ ++#~ msgid "HT capabilities" ++#~ msgstr "Capabilitati HT" ++ ++#~ msgid "HT mode" ++#~ msgstr "Mod HT" ++ ++#~ msgid "Router Model" ++#~ msgstr "Modelul routerului" ++ ++#~ msgid "Router Name" ++#~ msgstr "Numele routerului" ++ ++#~ msgid "Waiting for router..." ++#~ msgstr "Asteptam dupa router.." ++ ++#~ msgid "Active Leases" ++#~ msgstr "Conexiuni dhcp active" ++ ++#~ msgid "Configuration / Apply" ++#~ msgstr "Configurare / Aplica" ++ ++#~ msgid "Configuration / Changes" ++#~ msgstr "Configurare / Schimbari" ++ ++#~ msgid "Configuration / Revert" ++#~ msgstr "Configurare / Anuleaza schimbarile" ++ ++#~ msgid "Create Network" ++#~ msgstr "Creaza retea" ++ ++#~ msgid "Networks" ++#~ msgstr "Retele" ++ ++#~ msgid "Wifi networks in your local environment" ++#~ msgstr "Retele wireless in apropiere" ++ ++#~ msgid "IPv6-Address" ++#~ msgstr "Adresa IPv6" ++ ++#~ msgid "IP-Aliases" ++#~ msgstr "Aliasuri IP" ++ ++#~ msgid "IPv6 Setup" ++#~ msgstr "Setarea IPv6" ++ ++#~ msgid "Detected Files" ++#~ msgstr "Fisiere detectate" ++ ++#~ msgid "Detected files" ++#~ msgstr "Fisiere detectate" ++ ++#~ msgid "Files to be kept when flashing a new firmware" ++#~ msgstr "Fisiere de pastrat cand se rescrie firmware-ul" ++ ++#~ msgid "General" ++#~ msgstr "General" ++ ++#~ msgid "" ++#~ "Here you can customize the settings and the functionality of LuCI." ++#~ msgstr "" ++#~ "Aici poti configura setarile si functionalitatea interfetei web LuCI." ++ ++#~ msgid "Web UI" ++#~ msgstr "Interfata web" ++ ++#~ msgid "Additional pppd options" ++#~ msgstr "Optiuni aditionale pentru pppd" ++ ++#~ msgid "Automatic Disconnect" ++#~ msgstr "Deconectare automata" ++ ++#~ msgid "" ++#~ "Configure the local DNS server to use the name servers adverticed by the " ++#~ "PPP peer" ++#~ msgstr "" ++#~ "Configureaza serverul local de DNS sa foloseasca serverele de domeniu " ++#~ "anuntate la conexiunea PPP" ++ ++#~ msgid "Connect script" ++#~ msgstr "Script de conectare" ++ ++#~ msgid "Default" ++#~ msgstr "Implicit" ++ ++#~ msgid "Disconnect script" ++#~ msgstr "Script pentru deconectare" ++ ++#~ msgid "Edit package lists and installation targets" ++#~ msgstr "Editeaza lista de pachete si destinatiile de instalare" ++ ++#~ msgid "Enable 4K VLANs" ++#~ msgstr "Activeaza 4 mii de VLAN-uri" ++ ++#~ msgid "Enable IPv6 on PPP link" ++#~ msgstr "Activeaza IPv6 pe legatura PPP" ++ ++#~ msgid "Firmware image" ++#~ msgstr "Imaginea de firmware" ++ ++#~ msgid "" ++#~ "Here you can backup and restore your router configuration and - if " ++#~ "possible - reset the router to the default settings." ++#~ msgstr "" ++#~ "Aici poti face backup si restore la configuratia routerului si daca e " ++#~ "posibil chiar resetarea routerului la modul implicit." ++ ++#~ msgid "Keep configuration files" ++#~ msgstr "Pastreaza fisierele de configurare" ++ ++#~ msgid "Keep-Alive" ++#~ msgstr "Keep-Alive" ++ ++#~ msgid "Kernel" ++#~ msgstr "Kernel" ++ ++#~ msgid "" ++#~ "Let pppd replace the current default route to use the PPP interface after " ++#~ "successful connect" ++#~ msgstr "" ++#~ "PPPD va inlocui ruta default cu cea oferita de interfata PPP dupa " ++#~ "conectarea cu succes" ++ ++#~ msgid "Let pppd run this script after establishing the PPP link" ++#~ msgstr "PPPD va rula acest script dupa stabilirea conexiunii PPP" ++ ++#~ msgid "Let pppd run this script before tearing down the PPP link" ++#~ msgstr "PPPD va rula acest script inainte sa inchida conexiunea PPP" ++ ++#~ msgid "Number of failed connection tests to initiate automatic reconnect" ++#~ msgstr "Numarul de teste de conexiune esuate pentru a reconecta" ++ ++#~ msgid "Override Gateway" ++#~ msgstr "Suprascrie gateway" ++ ++#~ msgid "PIN code" ++#~ msgstr "Codul PIN" ++ ++#~ msgid "PPP Settings" ++#~ msgstr "Setari PPP" ++ ++#~ msgid "Package lists" ++#~ msgstr "Lista de pachete" ++ ++#~ msgid "Proceed reverting all settings and resetting to firmware defaults?" ++#~ msgstr "Continua anuland toate modificarile facute si resetand la default?" ++ ++#~ msgid "Processor" ++#~ msgstr "Procesor" ++ ++#~ msgid "Radius-Port" ++#~ msgstr "Portul radiusului" ++ ++#~ msgid "Radius-Server" ++#~ msgstr "Serverul radius" ++ ++#~ msgid "Replace default route" ++#~ msgstr "Inlocuieste ruta default" ++ ++#~ msgid "Reset router to defaults" ++#~ msgstr "Reseteaza routerul la default" ++ ++#~ msgid "" ++#~ "Seconds to wait for the modem to become ready before attempting to connect" ++#~ msgstr "" ++#~ "Numarul de secunde de asteptat ca modemul sa devine pregatit inainte de " ++#~ "conectare" ++ ++#~ msgid "Send Router Solicitiations" ++#~ msgstr "Trimite solicitari de Router" ++ ++#~ msgid "Server IPv4-Address" ++#~ msgstr "Adresa IPv4 a serverului" ++ ++#~ msgid "Service type" ++#~ msgstr "Tipul de serviciu" ++ ++#~ msgid "Settings" ++#~ msgstr "Setari" ++ ++#~ msgid "TTL" ++#~ msgstr "TTL" ++ ++#~ msgid "Tunnel Settings" ++#~ msgstr "Setarile de tunel" ++ ++#~ msgid "Update package lists" ++#~ msgstr "Updateaza lista de pachete" ++ ++#~ msgid "Upload an OpenWrt image file to reflash the device." ++#~ msgstr "Uploadeaza o imagine OpenWRT pentru rescrierea firmware-ului." ++ ++#~ msgid "Upload image" ++#~ msgstr "Uploadeaza firmware" ++ ++#~ msgid "Use peer DNS" ++#~ msgstr "Foloseste DNS-urile primite pe conexiune" ++ ++#~ msgid "VLAN %d" ++#~ msgstr "VLAN %d" ++ ++#~ msgid "back" ++#~ msgstr "inapoi" ++ ++#~ msgid "static" ++#~ msgstr "static" +diff --git a/feeds/luci/modules/luci-base/po/ru/base.po b/feeds/luci/modules/luci-base/po/ru/base.po +new file mode 100644 +index 0000000..94fa6fb +--- /dev/null ++++ b/feeds/luci/modules/luci-base/po/ru/base.po +@@ -0,0 +1,4286 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: LuCI: base\n" ++"Report-Msgid-Bugs-To: \n" ++"POT-Creation-Date: 2009-05-19 19:36+0200\n" ++"PO-Revision-Date: 2014-01-31 21:08+0200\n" ++"Last-Translator: Moon_dark \n" ++"Language-Team: Russian \n" ++"Language: ru\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%" ++"10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" ++"X-Generator: Pootle 2.0.6\n" ++"X-Poedit-SourceCharset: UTF-8\n" ++ ++msgid "(%d minute window, %d second interval)" ++msgstr "(%d минутное окно, %d Ñекундный интервал)" ++ ++msgid "(%s available)" ++msgstr "(%s доÑтупно)" ++ ++msgid "(empty)" ++msgstr "(пуÑто)" ++ ++msgid "(no interfaces attached)" ++msgstr "(нет ÑвÑзанных интерфейÑов)" ++ ++msgid "-- Additional Field --" ++msgstr "-- Дополнительное поле --" ++ ++msgid "-- Please choose --" ++msgstr "-- ПожалуйÑта, выберите --" ++ ++msgid "-- custom --" ++msgstr "-- пользовательÑкий --" ++ ++msgid "-- match by device --" ++msgstr "" ++ ++msgid "-- match by label --" ++msgstr "" ++ ++msgid "1 Minute Load:" ++msgstr "Загрузка за 1 минуту:" ++ ++msgid "15 Minute Load:" ++msgstr "Загрузка за 15 минут:" ++ ++msgid "5 Minute Load:" ++msgstr "Загрузка за 5 минут:" ++ ++msgid "BSSID" ++msgstr "BSSID" ++ ++msgid "DNS query port" ++msgstr "Порт запроÑа DNS" ++ ++msgid "DNS server port" ++msgstr "Порт DNS-Ñервера" ++ ++msgid "" ++"DNS servers will be queried in the " ++"order of the resolvfile" ++msgstr "" ++"DNS Ñерверы будут опрошены в " ++"порÑдке, определенном в resolvfile файле" ++ ++msgid "ESSID" ++msgstr "ESSID" ++ ++msgid "IPv4-Address" ++msgstr "IPv4-адреÑ" ++ ++msgid "IPv4-Gateway" ++msgstr "IPv4-Ð°Ð´Ñ€ÐµÑ ÑˆÐ»ÑŽÐ·Ð°" ++ ++msgid "IPv4-Netmask" ++msgstr "МаÑка Ñети IPv4" ++ ++msgid "" ++"IPv6-Address or Network " ++"(CIDR)" ++msgstr "" ++"IPv6-Ð°Ð´Ñ€ÐµÑ Ð¸Ð»Ð¸ Ñеть (CIDR)" ++ ++msgid "IPv6-Gateway" ++msgstr "IPv6-Ð°Ð´Ñ€ÐµÑ ÑˆÐ»ÑŽÐ·Ð°" ++ ++msgid "IPv6-Suffix (hex)" ++msgstr "" ++ ++msgid "LED Configuration" ++msgstr "ÐаÑтройка LED" ++ ++msgid "LED Name" ++msgstr "Ðазвание LED" ++ ++msgid "MAC-Address" ++msgstr "MAC-адреÑ" ++ ++msgid "" ++"Max. DHCP leases" ++msgstr "" ++"МакÑ. кол-во аренд DHCP" ++ ++msgid "" ++"Max. EDNS0 packet size" ++msgstr "" ++"МакÑ. размер пакета EDNS0" ++ ++msgid "Max. concurrent queries" ++msgstr "" ++"МакÑ. кол-во одновременных запроÑов" ++ ++# Парный шифр иÑпользуетÑÑ Ð´Ð»Ñ Ð¾Ð´Ð½Ð¾Ð°Ð´Ñ€ÐµÑной передачи, а групповой - Ð´Ð»Ñ ÑˆÐ¸Ñ€Ð¾ÐºÐ¾Ð²ÐµÑ‰Ð°Ñ‚ÐµÐ»ÑŒÐ½Ð¾Ð¹ и мультикаÑта ++msgid "%s - %s" ++msgstr "%s - %s" ++ ++msgid "ADSL" ++msgstr "" ++ ++msgid "ADSL Status" ++msgstr "" ++ ++msgid "AICCU (SIXXS)" ++msgstr "" ++ ++msgid "APN" ++msgstr "APN" ++ ++msgid "AR Support" ++msgstr "Поддержка AR" ++ ++msgid "ARP retry threshold" ++msgstr "Порог повтора ARP" ++ ++msgid "ATM Bridges" ++msgstr "МоÑÑ‚Ñ‹ ATM" ++ ++msgid "ATM Virtual Channel Identifier (VCI)" ++msgstr "Идентификатор виртуального канала ATM (VCI)" ++ ++msgid "ATM Virtual Path Identifier (VPI)" ++msgstr "Идентификатор виртуального пути ATM (VPI)" ++ ++msgid "" ++"ATM bridges expose encapsulated ethernet in AAL5 connections as virtual " ++"Linux network interfaces which can be used in conjunction with DHCP or PPP " ++"to dial into the provider network." ++msgstr "" ++"ATM-моÑÑ‚Ñ‹ выÑтавлÑÑŽÑ‚ инкапÑулированный Ethernet в ÑоединениÑÑ… AAL5 в " ++"качеÑтве виртуальных Ñетевых интерфейÑов Linux, которые могут быть " ++"иÑпользованы в Ñочетании Ñ DHCP или PPP Ð´Ð»Ñ Ð¿Ð¾Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ Ðº Ñети провайдера." ++ ++msgid "ATM device number" ++msgstr "Ðомер уÑтройÑтва ATM" ++ ++msgid "AYIYA" ++msgstr "" ++ ++msgid "Access Concentrator" ++msgstr "Концентратор доÑтупа" ++ ++msgid "Access Point" ++msgstr "Точка доÑтупа" ++ ++msgid "Action" ++msgstr "ДейÑтвие" ++ ++msgid "Actions" ++msgstr "ДейÑтвиÑ" ++ ++msgid "Activate this network" ++msgstr "Ðктивировать Ñту Ñеть" ++ ++msgid "Active IPv4-Routes" ++msgstr "" ++"Ðктивные маршруты IPv4" ++ ++msgid "Active IPv6-Routes" ++msgstr "" ++"Ðктивные маршруты IPv6" ++ ++msgid "Active Connections" ++msgstr "Ðктивные ÑоединениÑ" ++ ++msgid "Active DHCP Leases" ++msgstr "Ðктивные аренды DHCP" ++ ++msgid "Active DHCPv6 Leases" ++msgstr "Ðктивные аренды DHCPv6" ++ ++msgid "Ad-Hoc" ++msgstr "Ad-Hoc" ++ ++msgid "Add" ++msgstr "Добавить" ++ ++msgid "Add local domain suffix to names served from hosts files" ++msgstr "" ++"Добавить ÑÑƒÑ„Ñ„Ð¸ÐºÑ Ð»Ð¾ÐºÐ°Ð»ÑŒÐ½Ð¾Ð³Ð¾ домена к именам, полученным из файлов hosts" ++ ++msgid "Add new interface..." ++msgstr "Добавить новый интерфейÑ..." ++ ++msgid "Additional Hosts files" ++msgstr "Дополнительные файлы hosts" ++ ++msgid "Address" ++msgstr "ÐдреÑ" ++ ++msgid "Address to access local relay bridge" ++msgstr "ÐÐ´Ñ€ÐµÑ Ð´Ð»Ñ Ð´Ð¾Ñтупа к локальному моÑту-ретранÑлÑтору" ++ ++msgid "Administration" ++msgstr "Управление" ++ ++msgid "Advanced Settings" ++msgstr "РаÑширенные наÑтройки" ++ ++msgid "Alert" ++msgstr "Ð¢Ñ€ÐµÐ²Ð¾Ð¶Ð½Ð°Ñ ÑитуациÑ" ++ ++msgid "Allow SSH password authentication" ++msgstr "" ++"Разрешить SSH-аутентификацию Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ " ++"паролÑ" ++ ++msgid "Allow all except listed" ++msgstr "Разрешить вÑе, кроме перечиÑленных" ++ ++msgid "Allow listed only" ++msgstr "Разрешить только перечиÑленные" ++ ++msgid "Allow localhost" ++msgstr "Разрешить локальный хоÑÑ‚" ++ ++msgid "Allow remote hosts to connect to local SSH forwarded ports" ++msgstr "" ++"Разрешить удалённым хоÑтам подключатьÑÑ Ðº локальным перенаправленным портам " ++"SSH" ++ ++msgid "Allow root logins with password" ++msgstr "Разрешить пользователю root вход Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ паролÑ" ++ ++msgid "Allow the root user to login with password" ++msgstr "" ++"Разрешить пользователю root входить в ÑиÑтему Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ паролÑ" ++ ++msgid "" ++"Allow upstream responses in the 127.0.0.0/8 range, e.g. for RBL services" ++msgstr "Разрешить ответы в диапазоне 127.0.0.0/8, например, Ð´Ð»Ñ RBL-ÑервиÑов" ++ ++msgid "" ++"Also see Tunneling Comparison on SIXXS" ++msgstr "" ++ ++msgid "Always announce default router" ++msgstr "" ++ ++msgid "An additional network will be created if you leave this unchecked." ++msgstr "ЕÑли вы не выберите Ñту опцию, то будет Ñоздана Ð´Ð¾Ð¿Ð¾Ð»Ð½Ð¸Ñ‚ÐµÐ»ÑŒÐ½Ð°Ñ Ñеть." ++ ++msgid "Announce as default router even if no public prefix is available." ++msgstr "" ++ ++msgid "Announced DNS domains" ++msgstr "" ++ ++msgid "Announced DNS servers" ++msgstr "" ++ ++msgid "Antenna 1" ++msgstr "Ðнтенна 1" ++ ++msgid "Antenna 2" ++msgstr "Ðнтенна 2" ++ ++msgid "Antenna Configuration" ++msgstr "ÐšÐ¾Ð½Ñ„Ð¸Ð³ÑƒÑ€Ð°Ñ†Ð¸Ñ Ð°Ð½Ñ‚ÐµÐ½Ð½" ++ ++msgid "Any zone" ++msgstr "Ð›ÑŽÐ±Ð°Ñ Ð·Ð¾Ð½Ð°" ++ ++msgid "Apply" ++msgstr "ПринÑÑ‚ÑŒ" ++ ++msgid "Applying changes" ++msgstr "Применение изменений" ++ ++msgid "" ++"Assign a part of given length of every public IPv6-prefix to this interface" ++msgstr "" ++ ++msgid "Assign interfaces..." ++msgstr "Ðазначить интерфейÑÑ‹..." ++ ++msgid "" ++"Assign prefix parts using this hexadecimal subprefix ID for this interface." ++msgstr "" ++ ++msgid "Associated Stations" ++msgstr "Подключенные клиенты" ++ ++msgid "Atheros 802.11%s Wireless Controller" ++msgstr "БеÑпроводной 802.11%s контроллер Atheros" ++ ++msgid "AuthGroup" ++msgstr "" ++ ++msgid "Authentication" ++msgstr "ÐутентификациÑ" ++ ++msgid "Authoritative" ++msgstr "Ðвторитетный" ++ ++msgid "Authorization Required" ++msgstr "ТребуетÑÑ Ð°Ð²Ñ‚Ð¾Ñ€Ð¸Ð·Ð°Ñ†Ð¸Ñ" ++ ++msgid "Auto Refresh" ++msgstr "Ðвтообновление" ++ ++msgid "Automatic" ++msgstr "" ++ ++msgid "Automatic Homenet (HNCP)" ++msgstr "" ++ ++msgid "Available" ++msgstr "ДоÑтупно" ++ ++msgid "Available packages" ++msgstr "ДоÑтупные пакеты" ++ ++msgid "Average:" ++msgstr "СреднÑÑ:" ++ ++msgid "BSSID" ++msgstr "BSSID" ++ ++msgid "Back" ++msgstr "Ðазад" ++ ++msgid "Back to Overview" ++msgstr "Ðазад к обзору" ++ ++msgid "Back to configuration" ++msgstr "Ðазад к наÑтройке" ++ ++msgid "Back to overview" ++msgstr "Ðазад к обзору" ++ ++msgid "Back to scan results" ++msgstr "Ðазад к результатам ÑканированиÑ" ++ ++msgid "Background Scan" ++msgstr "Фоновое Ñканирование" ++ ++msgid "Backup / Flash Firmware" ++msgstr "Ð ÐµÐ·ÐµÑ€Ð²Ð½Ð°Ñ ÐºÐ¾Ð¿Ð¸Ñ / прошивка" ++ ++msgid "Backup / Restore" ++msgstr "Резервное копирование / ВоÑÑтановление" ++ ++msgid "Backup file list" ++msgstr "СпиÑок файлов Ð´Ð»Ñ Ñ€ÐµÐ·ÐµÑ€Ð²Ð½Ð¾Ð³Ð¾ копированиÑ" ++ ++msgid "Bad address specified!" ++msgstr "Указан неправильный адреÑ!" ++ ++msgid "Band" ++msgstr "" ++ ++msgid "Behind NAT" ++msgstr "" ++ ++msgid "" ++"Below is the determined list of files to backup. It consists of changed " ++"configuration files marked by opkg, essential base files and the user " ++"defined backup patterns." ++msgstr "" ++"Ðиже приводитÑÑ Ð¾Ð¿Ñ€ÐµÐ´ÐµÐ»Ñ‘Ð½Ð½Ñ‹Ð¹ ÑпиÑок файлов Ð´Ð»Ñ Ñ€ÐµÐ·ÐµÑ€Ð²Ð½Ð¾Ð³Ð¾ копированиÑ. Он " ++"ÑоÑтоит из изменённых конфигурационных файлов, отмеченных opkg, необходимых " ++"базовых файлов, а также шаблонов резервного копированиÑ, определённых " ++"пользователем." ++ ++msgid "Bitrate" ++msgstr "СкороÑÑ‚ÑŒ" ++ ++msgid "Bogus NX Domain Override" ++msgstr "Переопределение поддельного NX-домена" ++ ++msgid "Bridge" ++msgstr "МоÑÑ‚" ++ ++msgid "Bridge interfaces" ++msgstr "Объединить в моÑÑ‚" ++ ++msgid "Bridge unit number" ++msgstr "Ðомер моÑта" ++ ++msgid "Bring up on boot" ++msgstr "ЗапуÑтить при загрузке" ++ ++msgid "Broadcom 802.11%s Wireless Controller" ++msgstr "БеÑпроводной 802.11%s контроллер Broadcom" ++ ++msgid "Broadcom BCM%04x 802.11 Wireless Controller" ++msgstr "БеÑпроводной 802.11 контроллер Broadcom BCM%04x" ++ ++msgid "Buffered" ++msgstr "Буферизировано" ++ ++msgid "Buttons" ++msgstr "Кнопки" ++ ++msgid "CA certificate; if empty it will be saved after the first connection." ++msgstr "" ++ ++msgid "CPU" ++msgstr "ЦП" ++ ++msgid "CPU usage (%)" ++msgstr "Загрузка ЦП (%)" ++ ++msgid "Cancel" ++msgstr "Отменить" ++ ++msgid "Category" ++msgstr "" ++ ++msgid "Chain" ++msgstr "Цепочка" ++ ++msgid "Changes" ++msgstr "ИзменениÑ" ++ ++msgid "Changes applied." ++msgstr "Ð˜Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð¿Ñ€Ð¸Ð½ÑÑ‚Ñ‹." ++ ++msgid "Changes the administrator password for accessing the device" ++msgstr "Изменить пароль админиÑтратора Ð´Ð»Ñ Ð´Ð¾Ñтупа к уÑтройÑтву" ++ ++msgid "Channel" ++msgstr "Канал" ++ ++msgid "Check" ++msgstr "Проверить" ++ ++msgid "Checksum" ++msgstr "ÐšÐ¾Ð½Ñ‚Ñ€Ð¾Ð»ÑŒÐ½Ð°Ñ Ñумма" ++ ++msgid "" ++"Choose the firewall zone you want to assign to this interface. Select " ++"unspecified to remove the interface from the associated zone or " ++"fill out the create field to define a new zone and attach the " ++"interface to it." ++msgstr "" ++"Укажите зону, которую вы хотите прикрепить к Ñтому интерфейÑу. Выберите " ++"не определено, чтобы удалить Ñтот Ð¸Ð½Ñ‚ÐµÑ€Ñ„ÐµÐ¹Ñ Ð¸Ð· зоны, или заполните " ++"поле Ñоздать, чтобы определить новую зону и прикрепить к ней Ñтот " ++"интерфейÑ." ++ ++msgid "" ++"Choose the network(s) you want to attach to this wireless interface or fill " ++"out the create field to define a new network." ++msgstr "" ++"Выберите Ñеть (Ñети), которые вы хотите прикрепить к Ñтому беÑпроводному " ++"интерфейÑу, или заполните поле Ñоздать, чтобы определить новую Ñеть." ++ ++msgid "Cipher" ++msgstr "Шифрование" ++ ++msgid "" ++"Click \"Generate archive\" to download a tar archive of the current " ++"configuration files. To reset the firmware to its initial state, click " ++"\"Perform reset\" (only possible with squashfs images)." ++msgstr "" ++"Ðажмите \"Создать архив\", чтобы загрузить tar-архив текущих " ++"конфигурационных файлов. Ð”Ð»Ñ ÑброÑа наÑтроек прошивки к иÑходному ÑоÑтоÑнию " ++"нажмите \"Выполнить ÑброÑ\" (возможно только Ð´Ð»Ñ squashfs-образов)." ++ ++msgid "Client" ++msgstr "Клиент" ++ ++msgid "Client ID to send when requesting DHCP" ++msgstr "ID клиента при DHCP-запроÑе" ++ ++msgid "" ++"Close inactive connection after the given amount of seconds, use 0 to " ++"persist connection" ++msgstr "" ++"Завершать неактивное Ñоединение поÑле заданного интервала (Ñек.), " ++"иÑпользуйте значение 0 Ð´Ð»Ñ ÑƒÐ´ÐµÑ€Ð¶Ð°Ð½Ð¸Ñ Ð½ÐµÐ°ÐºÑ‚Ð¸Ð²Ð½Ð¾Ð³Ð¾ ÑоединениÑ" ++ ++msgid "Close list..." ++msgstr "Закрыть ÑпиÑок..." ++ ++msgid "Collecting data..." ++msgstr "Сбор информации..." ++ ++msgid "Command" ++msgstr "Команда" ++ ++msgid "Common Configuration" ++msgstr "ÐžÐ±Ñ‰Ð°Ñ ÐºÐ¾Ð½Ñ„Ð¸Ð³ÑƒÑ€Ð°Ñ†Ð¸Ñ" ++ ++msgid "Compression" ++msgstr "Сжатие" ++ ++msgid "Configuration" ++msgstr "КонфигурациÑ" ++ ++msgid "Configuration applied." ++msgstr "ÐšÐ¾Ð½Ñ„Ð¸Ð³ÑƒÑ€Ð°Ñ†Ð¸Ñ Ð¿Ñ€Ð¸Ð¼ÐµÐ½ÐµÐ½Ð°." ++ ++msgid "Configuration files will be kept." ++msgstr "Конфигурационные файлы будут Ñохранены." ++ ++msgid "Confirmation" ++msgstr "Подтверждение паролÑ" ++ ++msgid "Connect" ++msgstr "Соединить" ++ ++msgid "Connected" ++msgstr "Подключен" ++ ++msgid "Connection Limit" ++msgstr "Ограничение Ñоединений" ++ ++msgid "Connection to server fails when TLS cannot be used" ++msgstr "" ++ ++msgid "Connections" ++msgstr "СоединениÑ" ++ ++msgid "Country" ++msgstr "Страна" ++ ++msgid "Country Code" ++msgstr "Код Ñтраны" ++ ++msgid "Cover the following interface" ++msgstr "Включить Ñледующий интерфейÑ" ++ ++msgid "Cover the following interfaces" ++msgstr "Включить Ñледующие интерфейÑÑ‹" ++ ++msgid "Create / Assign firewall-zone" ++msgstr "Создать / назначить зону Ñетевого Ñкрана" ++ ++msgid "Create Interface" ++msgstr "Создать интерфейÑ" ++ ++msgid "Create a bridge over multiple interfaces" ++msgstr "Создать моÑÑ‚ над неÑколькими интерфейÑами" ++ ++msgid "Critical" ++msgstr "КритичеÑÐºÐ°Ñ ÑитуациÑ" ++ ++msgid "Cron Log Level" ++msgstr "Уровень вывода Cron" ++ ++msgid "Custom Interface" ++msgstr "ПользовательÑкий интерфейÑ" ++ ++msgid "Custom delegated IPv6-prefix" ++msgstr "" ++ ++msgid "" ++"Customizes the behaviour of the device LEDs if possible." ++msgstr "" ++"ÐаÑтройка Ð¿Ð¾Ð²ÐµÐ´ÐµÐ½Ð¸Ñ LED еÑли Ñто возможно." ++ ++msgid "DHCP Leases" ++msgstr "Ðренды DHCP" ++ ++msgid "DHCP Server" ++msgstr "DHCP-Ñервер" ++ ++msgid "DHCP and DNS" ++msgstr "DHCP и DNS" ++ ++msgid "DHCP client" ++msgstr "DHCP-клиент" ++ ++msgid "DHCP-Options" ++msgstr "DHCP-ÐаÑтройки" ++ ++msgid "DHCPv6 Leases" ++msgstr "Ðренды DHCPv6" ++ ++msgid "DHCPv6 client" ++msgstr "" ++ ++msgid "DHCPv6-Mode" ++msgstr "" ++ ++msgid "DHCPv6-Service" ++msgstr "" ++ ++msgid "DNS" ++msgstr "DNS" ++ ++msgid "DNS forwardings" ++msgstr "Перенаправление запроÑов DNS" ++ ++msgid "DNS-Label / FQDN" ++msgstr "" ++ ++msgid "DS-Lite AFTR address" ++msgstr "" ++ ++msgid "DUID" ++msgstr "DUID" ++ ++msgid "Debug" ++msgstr "Отладка" ++ ++msgid "Default %d" ++msgstr "По умолчанию %d" ++ ++msgid "Default gateway" ++msgstr "Шлюз по умолчанию" ++ ++msgid "Default route" ++msgstr "" ++ ++msgid "Default state" ++msgstr "Ðачальное ÑоÑтоÑние" ++ ++msgid "Define a name for this network." ++msgstr "Укажите Ð¸Ð¼Ñ Ñтой Ñети." ++ ++msgid "" ++"Define additional DHCP options, for example " ++"\"6,192.168.2.1,192.168.2.2\" which advertises different DNS " ++"servers to clients." ++msgstr "" ++"Определить дополнительные опции DHCP, например, " ++"\"6,192.168.2.1,192.168.2.2\", чтобы извеÑтить клиентов о DNS-" ++"Ñерверах." ++ ++msgid "Delete" ++msgstr "Удалить" ++ ++msgid "Delete this interface" ++msgstr "Удалить Ñтот интерфейÑ" ++ ++msgid "Delete this network" ++msgstr "Удалить Ñту Ñеть" ++ ++msgid "Description" ++msgstr "ОпиÑание" ++ ++msgid "Design" ++msgstr "Тема" ++ ++msgid "Destination" ++msgstr "Ðазначение" ++ ++msgid "Device" ++msgstr "УÑтройÑтво" ++ ++msgid "Device Configuration" ++msgstr "ÐšÐ¾Ð½Ñ„Ð¸Ð³ÑƒÑ€Ð°Ñ†Ð¸Ñ ÑƒÑтройÑтва" ++ ++msgid "Diagnostics" ++msgstr "ДиагноÑтика" ++ ++msgid "Dial number" ++msgstr "" ++ ++msgid "Directory" ++msgstr "ДиректориÑ" ++ ++msgid "Disable" ++msgstr "Отключить" ++ ++msgid "" ++"Disable DHCP for " ++"this interface." ++msgstr "" ++"Отключить DHCP Ð´Ð»Ñ Ñтого интерфейÑа." ++ ++msgid "Disable DNS setup" ++msgstr "Отключить наÑтройку DNS" ++ ++msgid "Disable HW-Beacon timer" ++msgstr "Отключить таймер HW-Beacon" ++ ++msgid "Disabled" ++msgstr "Отключено" ++ ++msgid "Discard upstream RFC1918 responses" ++msgstr "ОтбраÑывать ответы RFC1918" ++ ++msgid "Displaying only packages containing" ++msgstr "ПоказываютÑÑ Ñ‚Ð¾Ð»ÑŒÐºÐ¾ пакеты, Ñодержащие" ++ ++msgid "Distance Optimization" ++msgstr "ÐžÐ¿Ñ‚Ð¸Ð¼Ð¸Ð·Ð°Ñ†Ð¸Ñ Ñ€Ð°ÑÑтоÑниÑ" ++ ++msgid "Distance to farthest network member in meters." ++msgstr "РаÑÑтоÑние до Ñамого удалённого Ñетевого узла в метрах." ++ ++msgid "Diversity" ++msgstr "РазновидноÑÑ‚ÑŒ антенн" ++ ++msgid "" ++"Dnsmasq is a combined DHCP-Server and DNS-" ++"Forwarder for NAT " ++"firewalls" ++msgstr "" ++"Dnsmasq Ñодержит в Ñебе DHCP-Ñервер и DNS-" ++"прокÑи Ð´Ð»Ñ Ñетевых Ñкранов NAT" ++ ++msgid "Do not cache negative replies, e.g. for not existing domains" ++msgstr "Ðе кешировать отрицательные ответы, в Ñ‚.ч. Ð´Ð»Ñ Ð½ÐµÑущеÑтвующих доменов" ++ ++msgid "Do not forward requests that cannot be answered by public name servers" ++msgstr "" ++"Ðе перенаправлÑÑ‚ÑŒ запроÑÑ‹, которые не могут быть обработаны публичными DNS-" ++"Ñерверами" ++ ++msgid "Do not forward reverse lookups for local networks" ++msgstr "Ðе перенаправлÑÑ‚ÑŒ обратные DNS-запроÑÑ‹ Ð´Ð»Ñ Ð»Ð¾ÐºÐ°Ð»ÑŒÐ½Ñ‹Ñ… Ñетей" ++ ++msgid "Do not send probe responses" ++msgstr "Ðе поÑылать теÑтовые ответы" ++ ++msgid "Domain required" ++msgstr "ТребуетÑÑ Ð´Ð¾Ð¼ÐµÐ½" ++ ++msgid "Domain whitelist" ++msgstr "Белый ÑпиÑок доменов" ++ ++msgid "" ++"Don't forward DNS-Requests without " ++"DNS-Name" ++msgstr "" ++"Ðе перенаправлÑÑ‚ÑŒ DNS-запроÑÑ‹ " ++"без DNS-имени" ++ ++msgid "Download and install package" ++msgstr "Загрузить и уÑтановить пакет" ++ ++msgid "Download backup" ++msgstr "Загрузить резервную копию" ++ ++msgid "Dropbear Instance" ++msgstr "Dropbear" ++ ++msgid "" ++"Dropbear offers SSH network shell access " ++"and an integrated SCP server" ++msgstr "" ++"Dropbear - Ñто SSH-Ñервер Ñо вÑтроенным " ++"SCP" ++ ++msgid "Dual-Stack Lite (RFC6333)" ++msgstr "" ++ ++msgid "Dynamic DHCP" ++msgstr "" ++"ДинамичеÑкий DHCP" ++ ++msgid "Dynamic tunnel" ++msgstr "ДинамичеÑкий туннель" ++ ++msgid "" ++"Dynamically allocate DHCP addresses for clients. If disabled, only clients " ++"having static leases will be served." ++msgstr "" ++"ДинамичеÑки выделÑÑ‚ÑŒ DHCP-адреÑа клиентам. ЕÑли выключено, то будут " ++"обÑлужены только клиенты Ñ Ð¿Ð¾ÑтоÑнно арендованными адреÑами." ++ ++msgid "EAP-Method" ++msgstr "Метод EAP" ++ ++# "Редактировать" длинно и не влазит по ширине в кнопку - текÑÑ‚ наезжает на иконку ++#, fuzzy ++msgid "Edit" ++msgstr "Редактировать" ++ ++msgid "" ++"Edit the raw configuration data above to fix any error and hit \"Save\" to " ++"reload the page." ++msgstr "" ++ ++#, fuzzy ++msgid "Edit this interface" ++msgstr "Редактировать Ñтот интерфейÑ" ++ ++msgid "Edit this network" ++msgstr "Редактировать Ñту Ñеть" ++ ++msgid "Emergency" ++msgstr "Ð§Ñ€ÐµÐ·Ð²Ñ‹Ñ‡Ð°Ð¹Ð½Ð°Ñ ÑитуациÑ" ++ ++msgid "Enable" ++msgstr "Включить" ++ ++msgid "Enable STP" ++msgstr "Включить STP" ++ ++msgid "Enable HE.net dynamic endpoint update" ++msgstr "Включить динамичеÑкое обновление оконечной точки HE.net" ++ ++msgid "Enable IPv6 negotiation on the PPP link" ++msgstr "Включить IPv6-ÑоглаÑование на PPP-Ñоединении" ++ ++msgid "Enable Jumbo Frame passthrough" ++msgstr "ПропуÑкать Jumbo-кадры" ++ ++msgid "Enable NTP client" ++msgstr "Включить NTP-клиент" ++ ++msgid "Enable TFTP server" ++msgstr "Включить TFTP-Ñервер" ++ ++msgid "Enable VLAN functionality" ++msgstr "Включить поддержку VLAN" ++ ++msgid "Enable WPS pushbutton, requires WPA(2)-PSK" ++msgstr "" ++ ++msgid "Enable learning and aging" ++msgstr "Включить изучение и уÑтаревание (learning/aging)" ++ ++msgid "Enable mirroring of incoming packets" ++msgstr "" ++ ++msgid "Enable mirroring of outgoing packets" ++msgstr "" ++ ++msgid "Enable this mount" ++msgstr "Включить Ñту точку монтированиÑ" ++ ++msgid "Enable this swap" ++msgstr "Включить Ñтот раздел подкачки" ++ ++msgid "Enable/Disable" ++msgstr "Включить/выключить" ++ ++msgid "Enabled" ++msgstr "Включено" ++ ++msgid "Enables the Spanning Tree Protocol on this bridge" ++msgstr "Включает Spanning Tree Protocol на Ñтом моÑту" ++ ++msgid "Encapsulation mode" ++msgstr "Режим инкапÑулÑции" ++ ++msgid "Encryption" ++msgstr "Шифрование" ++ ++msgid "Erasing..." ++msgstr "Стирание..." ++ ++msgid "Error" ++msgstr "Ошибка" ++ ++msgid "Ethernet Adapter" ++msgstr "Ethernet-адаптер" ++ ++msgid "Ethernet Switch" ++msgstr "Ethernet-коммутатор" ++ ++msgid "Expand hosts" ++msgstr "РаÑширÑÑ‚ÑŒ имена узлов" ++ ++msgid "Expires" ++msgstr "ИÑтекает" ++ ++#, fuzzy ++msgid "" ++"Expiry time of leased addresses, minimum is 2 minutes (2m)." ++msgstr "" ++"ВремÑ, через которое иÑтекает аренда адреÑа, минимум 2 минуты (2m)." ++ ++msgid "External" ++msgstr "" ++ ++msgid "External system log server" ++msgstr "Сервер ÑиÑтемного журнала" ++ ++msgid "External system log server port" ++msgstr "Порт Ñервера ÑиÑтемного журнала" ++ ++msgid "Fast Frames" ++msgstr "БыÑтрые кадры" ++ ++msgid "File" ++msgstr "Файл" ++ ++msgid "Filename of the boot image advertised to clients" ++msgstr "Ð˜Ð¼Ñ Ð·Ð°Ð³Ñ€ÑƒÐ·Ð¾Ñ‡Ð½Ð¾Ð³Ð¾ образа, извещаемого клиентам" ++ ++msgid "Filesystem" ++msgstr "Ð¤Ð°Ð¹Ð»Ð¾Ð²Ð°Ñ ÑиÑтема" ++ ++msgid "Filter" ++msgstr "Фильтр" ++ ++msgid "Filter private" ++msgstr "Фильтровать чаÑтные" ++ ++msgid "Filter useless" ++msgstr "Фильтровать беÑполезные" ++ ++msgid "Find and join network" ++msgstr "Ðайти и приÑоединитьÑÑ Ðº Ñети" ++ ++msgid "Find package" ++msgstr "Ðайти пакет" ++ ++msgid "Finish" ++msgstr "Завершить" ++ ++msgid "Firewall" ++msgstr "МежÑетевой Ñкран" ++ ++msgid "Firewall Settings" ++msgstr "ÐаÑтройки межÑетевого Ñкрана" ++ ++msgid "Firewall Status" ++msgstr "Ð¡Ñ‚Ð°Ñ‚ÑƒÑ Ð¼ÐµÐ¶Ñетевого Ñкрана" ++ ++msgid "Firmware Version" ++msgstr "ВерÑÐ¸Ñ Ð¿Ñ€Ð¾ÑˆÐ¸Ð²ÐºÐ¸" ++ ++msgid "Fixed source port for outbound DNS queries" ++msgstr "ФикÑированный порт Ð´Ð»Ñ Ð¸ÑходÑщих DNS-запроÑов" ++ ++msgid "Flags" ++msgstr "Флаги" ++ ++msgid "Flash Firmware" ++msgstr "УÑтановить прошивку" ++ ++msgid "Flash image..." ++msgstr "УÑтановить..." ++ ++msgid "Flash new firmware image" ++msgstr "УÑтановить новый образ прошивки" ++ ++msgid "Flash operations" ++msgstr "Операции Ñ Ð¿Ñ€Ð¾ÑˆÐ¸Ð²ÐºÐ¾Ð¹" ++ ++msgid "Flashing..." ++msgstr "Прошивка..." ++ ++# Force DHCP on the network ++msgid "Force" ++msgstr "Принудительно" ++ ++msgid "Force CCMP (AES)" ++msgstr "Требовать CCMP (AES)" ++ ++msgid "Force DHCP on this network even if another server is detected." ++msgstr "ИÑпользовать DHCP в Ñтой Ñети, даже еÑли найден другой Ñервер." ++ ++msgid "Force TKIP" ++msgstr "Требовать TKIP" ++ ++msgid "Force TKIP and CCMP (AES)" ++msgstr "TKIP или CCMP (AES)" ++ ++msgid "Forward DHCP traffic" ++msgstr "ПеренаправлÑÑ‚ÑŒ трафик DHCP" ++ ++msgid "Forward broadcast traffic" ++msgstr "ПеренаправлÑÑ‚ÑŒ широковещательный траффик" ++ ++msgid "Forwarding mode" ++msgstr "Режим перенаправлениÑ" ++ ++msgid "Fragmentation Threshold" ++msgstr "Порог фрагментации" ++ ++msgid "Frame Bursting" ++msgstr "ÐŸÐ°ÐºÐµÑ‚Ð½Ð°Ñ Ð¿ÐµÑ€ÐµÐ´Ð°Ñ‡Ð° кадров" ++ ++msgid "Free" ++msgstr "Свободно" ++ ++msgid "Free space" ++msgstr "Свободное меÑто" ++ ++msgid "GHz" ++msgstr "ГГц" ++ ++msgid "GPRS only" ++msgstr "Только GPRS" ++ ++msgid "Gateway" ++msgstr "Шлюз" ++ ++msgid "Gateway ports" ++msgstr "Порты шлюза" ++ ++msgid "General Settings" ++msgstr "ОÑновные наÑтройки" ++ ++msgid "General Setup" ++msgstr "ОÑновные наÑтройки" ++ ++msgid "Generate archive" ++msgstr "Создать архив" ++ ++msgid "Generic 802.11%s Wireless Controller" ++msgstr "БеÑпроводной 802.11%s контроллер" ++ ++msgid "Given password confirmation did not match, password not changed!" ++msgstr "Введённые пароли не Ñовпадают, пароль не изменён!" ++ ++msgid "Global network options" ++msgstr "" ++ ++msgid "Go to password configuration..." ++msgstr "Перейти к наÑтройке паролÑ..." ++ ++msgid "Go to relevant configuration page" ++msgstr "Перейти к Ñтранице конфигурации" ++ ++msgid "Guest" ++msgstr "" ++ ++msgid "HE.net password" ++msgstr "Пароль HE.net" ++ ++msgid "HE.net username" ++msgstr "" ++ ++msgid "Handler" ++msgstr "Обработчик" ++ ++# Вообще, SIGHUP означает, что "пользователь отключилÑÑ Ð¾Ñ‚ терминала". Ðо чаще вÑего Ñигнал иÑпользуетÑÑ Ð´Ð»Ñ Ð¿ÐµÑ€ÐµÐ·Ð°Ð¿ÑƒÑка, так что переведу именно так. ++msgid "Hang Up" ++msgstr "ПерезапуÑтить" ++ ++msgid "Heartbeat" ++msgstr "" ++ ++msgid "" ++"Here you can configure the basic aspects of your device like its hostname or " ++"the timezone." ++msgstr "" ++"ЗдеÑÑŒ вы можете наÑтроить оÑновные параметры вашего уÑтройÑтва такие как Ð¸Ð¼Ñ " ++"хоÑта или чаÑовой поÑÑ." ++ ++msgid "" ++"Here you can paste public SSH-Keys (one per line) for SSH public-key " ++"authentication." ++msgstr "" ++"ЗдеÑÑŒ вы можете добавить открытые SSH ключи (один ключ на Ñтроку) Ð´Ð»Ñ SSH " ++"аутентификации." ++ ++msgid "Hermes 802.11b Wireless Controller" ++msgstr "БеÑпроводной 802.11b контроллер Hermes" ++ ++msgid "Hide ESSID" ++msgstr "Скрыть ESSID" ++ ++msgid "Host entries" ++msgstr "ЗапиÑи хоÑтов" ++ ++msgid "Host expiry timeout" ++msgstr "Таймаут хоÑта" ++ ++msgid "Host-IP or Network" ++msgstr "IP-Ð°Ð´Ñ€ÐµÑ Ð¸Ð»Ð¸ Ñеть" ++ ++msgid "Hostname" ++msgstr "Ð˜Ð¼Ñ Ñ…Ð¾Ñта" ++ ++msgid "Hostname to send when requesting DHCP" ++msgstr "Ð˜Ð¼Ñ Ñ…Ð¾Ñта в DHCP-запроÑах" ++ ++msgid "Hostnames" ++msgstr "Имена хоÑтов" ++ ++msgid "Hybrid" ++msgstr "" ++ ++msgid "IP address" ++msgstr "IP-адреÑ" ++ ++msgid "IPv4" ++msgstr "IPv4" ++ ++msgid "IPv4 Firewall" ++msgstr "МежÑетевой Ñкран IPv4" ++ ++msgid "IPv4 WAN Status" ++msgstr "Ð¡Ñ‚Ð°Ñ‚ÑƒÑ IPv4 WAN" ++ ++msgid "IPv4 address" ++msgstr "IPv4-адреÑ" ++ ++msgid "IPv4 and IPv6" ++msgstr "IPv4 и IPv6" ++ ++msgid "IPv4 assignment length" ++msgstr "" ++ ++msgid "IPv4 broadcast" ++msgstr "Широковещательный IPv4-адреÑ" ++ ++msgid "IPv4 gateway" ++msgstr "IPv4-Ð°Ð´Ñ€ÐµÑ ÑˆÐ»ÑŽÐ·Ð°" ++ ++msgid "IPv4 netmask" ++msgstr "МаÑка Ñети IPv4" ++ ++msgid "IPv4 only" ++msgstr "Только IPv4" ++ ++msgid "IPv4 prefix length" ++msgstr "Длина префикÑа IPv4" ++ ++msgid "IPv4-Address" ++msgstr "IPv4-адреÑ" ++ ++msgid "IPv6" ++msgstr "IPv6" ++ ++msgid "IPv6 Firewall" ++msgstr "МежÑетевой Ñкран IPv6" ++ ++msgid "IPv6 Neighbours" ++msgstr "" ++ ++msgid "IPv6 Settings" ++msgstr "" ++ ++msgid "IPv6 ULA-Prefix" ++msgstr "" ++ ++msgid "IPv6 WAN Status" ++msgstr "Ð¡Ñ‚Ð°Ñ‚ÑƒÑ IPv6 WAN" ++ ++msgid "IPv6 address" ++msgstr "IPv6-адреÑ" ++ ++msgid "IPv6 address delegated to the local tunnel endpoint (optional)" ++msgstr "" ++ ++msgid "IPv6 assignment hint" ++msgstr "" ++ ++msgid "IPv6 assignment length" ++msgstr "" ++ ++msgid "IPv6 gateway" ++msgstr "IPv6-Ð°Ð´Ñ€ÐµÑ ÑˆÐ»ÑŽÐ·Ð°" ++ ++msgid "IPv6 only" ++msgstr "Только IPv6" ++ ++msgid "IPv6 prefix" ++msgstr "ÐŸÑ€ÐµÑ„Ð¸ÐºÑ IPv6" ++ ++msgid "IPv6 prefix length" ++msgstr "Длина префикÑа IPv6" ++ ++msgid "IPv6 routed prefix" ++msgstr "" ++ ++msgid "IPv6-Address" ++msgstr "IPv6-адреÑ" ++ ++msgid "IPv6-in-IPv4 (RFC4213)" ++msgstr "IPv6 в IPv4 (RFC4213)" ++ ++msgid "IPv6-over-IPv4 (6rd)" ++msgstr "IPv6 через IPv4 (6rd)" ++ ++msgid "IPv6-over-IPv4 (6to4)" ++msgstr "IPv6 через IPv4 (6to4)" ++ ++msgid "Identity" ++msgstr "Ð˜Ð´ÐµÐ½Ñ‚Ð¸Ñ„Ð¸ÐºÐ°Ñ†Ð¸Ñ EAP" ++ ++msgid "" ++"If specified, mount the device by its UUID instead of a fixed device node" ++msgstr "" ++"ЕÑли выбрано, монтировать уÑтройÑтво, иÑÐ¿Ð¾Ð»ÑŒÐ·ÑƒÑ ÐµÐ³Ð¾ UUID, вмеÑто " ++"фикÑированного файла уÑтройÑтва" ++ ++msgid "" ++"If specified, mount the device by the partition label instead of a fixed " ++"device node" ++msgstr "" ++"ЕÑли выбрано, монтировать уÑтройÑтво, иÑÐ¿Ð¾Ð»ÑŒÐ·ÑƒÑ Ð½Ð°Ð·Ð²Ð°Ð½Ð¸Ðµ его раздела, вмеÑто " ++"фикÑированного файла уÑтройÑтва" ++ ++msgid "If unchecked, no default route is configured" ++msgstr "ЕÑли не выбрано, то маршрут по умолчанию не наÑтраиваетÑÑ" ++ ++msgid "If unchecked, the advertised DNS server addresses are ignored" ++msgstr "ЕÑли не выбрано, то извещаемые адреÑа DNS-Ñерверов игнорируютÑÑ" ++ ++msgid "" ++"If your physical memory is insufficient unused data can be temporarily " ++"swapped to a swap-device resulting in a higher amount of usable RAM. Be aware that swapping data is a very " ++"slow process as the swap-device cannot be accessed with the high datarates " ++"of the RAM." ++msgstr "" ++"ЕÑли физичеÑкой памÑти не доÑтаточно, то неиÑпользуемые данные могут быть " ++"временно перемещены в раздел подкачки, что в Ñвою очередь приведет к " ++"увеличению объёму Ñвободной RAM. " ++"Однако, перемещение в файл - Ñто доÑтаточно долгий процеÑÑ, так как " ++"уÑтройÑтво, на котором раÑполагаетÑÑ Ñ€Ð°Ð·Ð´ÐµÐ» подкачки, работает гораздо " ++"медленнее, чем RAM." ++ ++msgid "Ignore Hosts files" ++msgstr "Игнорировать файлы hosts" ++ ++msgid "Ignore interface" ++msgstr "Игнорировать интерфейÑ" ++ ++msgid "Ignore resolve file" ++msgstr "Игнорировать файл resolv" ++ ++msgid "Image" ++msgstr "Образ" ++ ++msgid "In" ++msgstr "Ð’" ++ ++msgid "Inactivity timeout" ++msgstr "Таймаут бездейÑтвиÑ" ++ ++msgid "Inbound:" ++msgstr "ВходÑщий:" ++ ++msgid "Info" ++msgstr "ИнформациÑ" ++ ++msgid "Initscript" ++msgstr "Скрипт инициализации" ++ ++msgid "Initscripts" ++msgstr "Скрипты инциализации" ++ ++msgid "Install" ++msgstr "УÑтановить" ++ ++msgid "Install iputils-traceroute6 for IPv6 traceroute" ++msgstr "" ++ ++msgid "Install package %q" ++msgstr "УÑтановить пакет %q" ++ ++msgid "Install protocol extensions..." ++msgstr "УÑтановить раÑÑˆÐ¸Ñ€ÐµÐ½Ð¸Ñ Ð¿Ñ€Ð¾Ñ‚Ð¾ÐºÐ¾Ð»Ð°..." ++ ++msgid "Installed packages" ++msgstr "УÑтановленные пакеты" ++ ++msgid "Interface" ++msgstr "ИнтерфейÑ" ++ ++msgid "Interface Configuration" ++msgstr "ÐšÐ¾Ð½Ñ„Ð¸Ð³ÑƒÑ€Ð°Ñ†Ð¸Ñ Ð¸Ð½Ñ‚ÐµÑ€Ñ„ÐµÐ¹Ñа" ++ ++msgid "Interface Overview" ++msgstr "Обзор интерфейÑа" ++ ++msgid "Interface is reconnecting..." ++msgstr "Ð˜Ð½Ñ‚ÐµÑ€Ñ„ÐµÐ¹Ñ Ð¿ÐµÑ€ÐµÐ¿Ð¾Ð´ÐºÐ»ÑŽÑ‡Ð°ÐµÑ‚ÑÑ..." ++ ++msgid "Interface is shutting down..." ++msgstr "Ð˜Ð½Ñ‚ÐµÑ€Ñ„ÐµÐ¹Ñ Ð¾Ñ‚ÐºÐ»ÑŽÑ‡Ð°ÐµÑ‚ÑÑ..." ++ ++msgid "Interface not present or not connected yet." ++msgstr "Ð˜Ð½Ñ‚ÐµÑ€Ñ„ÐµÐ¹Ñ Ð½Ðµ ÑущеÑтвует или пока не подключен." ++ ++msgid "Interface reconnected" ++msgstr "Ð˜Ð½Ñ‚ÐµÑ€Ñ„ÐµÐ¹Ñ Ð¿ÐµÑ€ÐµÐ¿Ð¾Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½" ++ ++msgid "Interface shut down" ++msgstr "Ð˜Ð½Ñ‚ÐµÑ€Ñ„ÐµÐ¹Ñ Ð¾Ñ‚ÐºÐ»ÑŽÑ‡ÐµÐ½" ++ ++msgid "Interfaces" ++msgstr "ИнтерфейÑÑ‹" ++ ++msgid "Internal" ++msgstr "" ++ ++msgid "Internal Server Error" ++msgstr "ВнутреннÑÑ Ð¾ÑˆÐ¸Ð±ÐºÐ° Ñервера" ++ ++msgid "Invalid" ++msgstr "Введённое значение не верно" ++ ++msgid "Invalid VLAN ID given! Only IDs between %d and %d are allowed." ++msgstr "" ++"Указан неверный VLAN ID! ДоÑтупны только идентификаторы в диапазоне от %d до " ++"%d." ++ ++msgid "Invalid VLAN ID given! Only unique IDs are allowed" ++msgstr "Указан неверный VLAN ID! ДоÑтупны только уникальные ID" ++ ++msgid "Invalid username and/or password! Please try again." ++msgstr "Ðеверный логин и/или пароль! ПожалуйÑта попробуйте Ñнова." ++ ++#, fuzzy ++msgid "" ++"It appears that you are trying to flash an image that does not fit into the " ++"flash memory, please verify the image file!" ++msgstr "" ++"Ð’Ñ‹ пытаетеÑÑŒ обновить прошивку файлом, который не помещаетÑÑ Ð² памÑÑ‚ÑŒ " ++"уÑтройÑтва! ПожалуйÑта, проверьте файл образа." ++ ++msgid "Java Script required!" ++msgstr "ТребуетÑÑ Java Script!" ++ ++msgid "Join Network" ++msgstr "Подключение к Ñети" ++ ++msgid "Join Network: Settings" ++msgstr "Подключение к Ñети: наÑтройки" ++ ++msgid "Join Network: Wireless Scan" ++msgstr "Подключение к Ñети: Ñканирование" ++ ++msgid "Keep settings" ++msgstr "Сохранить наÑтройки" ++ ++msgid "Kernel Log" ++msgstr "Журнал Ñдра" ++ ++msgid "Kernel Version" ++msgstr "ВерÑÐ¸Ñ Ñдра" ++ ++msgid "Key" ++msgstr "Ключ" ++ ++msgid "Key #%d" ++msgstr "Ключ â„–%d" ++ ++msgid "Kill" ++msgstr "Принудительно завершить" ++ ++msgid "L2TP" ++msgstr "L2TP" ++ ++msgid "L2TP Server" ++msgstr "L2TP-Ñервер" ++ ++msgid "LCP echo failure threshold" ++msgstr "Порог ошибок Ñхо-запроÑов LCP" ++ ++msgid "LCP echo interval" ++msgstr "Интервал Ñхо-запроÑов LCP" ++ ++msgid "LLC" ++msgstr "LLC" ++ ++msgid "Label" ++msgstr "Метка" ++ ++msgid "Language" ++msgstr "Язык" ++ ++msgid "Language and Style" ++msgstr "Язык и тема" ++ ++msgid "Leaf" ++msgstr "" ++ ++msgid "Lease validity time" ++msgstr "Срок дейÑÑ‚Ð²Ð¸Ñ Ð°Ñ€ÐµÐ½Ð´Ñ‹" ++ ++msgid "Leasefile" ++msgstr "Файл аренд" ++ ++msgid "Leasetime" ++msgstr "Ð’Ñ€ÐµÐ¼Ñ Ð°Ñ€ÐµÐ½Ð´Ñ‹" ++ ++msgid "Leasetime remaining" ++msgstr "ОÑтавшееÑÑ Ð²Ñ€ÐµÐ¼Ñ Ð°Ñ€ÐµÐ½Ð´Ñ‹" ++ ++msgid "Leave empty to autodetect" ++msgstr "ОÑтавьте поле пуÑтым Ð´Ð»Ñ Ð°Ð²Ñ‚Ð¾Ð¾Ð¿Ñ€ÐµÐ´ÐµÐ»ÐµÐ½Ð¸Ñ" ++ ++msgid "Leave empty to use the current WAN address" ++msgstr "ОÑтавьте пуÑтым Ð´Ð»Ñ Ð¸ÑÐ¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Ñ‚ÐµÐºÑƒÑ‰ÐµÐ³Ð¾ адреÑа WAN" ++ ++msgid "Legend:" ++msgstr "Легенда:" ++ ++msgid "Limit" ++msgstr "Предел" ++ ++msgid "Line Attenuation" ++msgstr "" ++ ++msgid "Line Speed" ++msgstr "" ++ ++msgid "Line State" ++msgstr "" ++ ++msgid "Link On" ++msgstr "Подключение" ++ ++msgid "" ++"List of DNS servers to forward " ++"requests to" ++msgstr "" ++"СпиÑок DNS-Ñерверов Ð´Ð»Ñ " ++"Ð¿ÐµÑ€ÐµÐ½Ð°Ð¿Ñ€Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ð·Ð°Ð¿Ñ€Ð¾Ñов" ++ ++msgid "List of domains to allow RFC1918 responses for" ++msgstr "СпиÑок доменов, Ð´Ð»Ñ ÐºÐ¾Ñ‚Ð¾Ñ€Ñ‹Ñ… разрешены ответы RFC1918" ++ ++msgid "List of hosts that supply bogus NX domain results" ++msgstr "СпиÑок хоÑтов, поÑтавлÑющих поддельные результаты домена NX" ++ ++msgid "Listen only on the given interface or, if unspecified, on all" ++msgstr "Слушать только на данном интерфейÑе или, еÑли не определено, на вÑех" ++ ++msgid "Listening port for inbound DNS queries" ++msgstr "Порт Ð´Ð»Ñ Ð²Ñ…Ð¾Ð´Ñщих DNS-запроÑов" ++ ++msgid "Load" ++msgstr "Загрузка" ++ ++msgid "Load Average" ++msgstr "СреднÑÑ Ð·Ð°Ð³Ñ€ÑƒÐ·ÐºÐ°" ++ ++msgid "Loading" ++msgstr "Загрузка" ++ ++msgid "Local IPv4 address" ++msgstr "Локальный IPv4-адреÑ" ++ ++msgid "Local IPv6 address" ++msgstr "Локальный IPv6-адреÑ" ++ ++msgid "Local Startup" ++msgstr "Ð›Ð¾ÐºÐ°Ð»ÑŒÐ½Ð°Ñ Ð·Ð°Ð³Ñ€ÑƒÐ·ÐºÐ°" ++ ++msgid "Local Time" ++msgstr "МеÑтное времÑ" ++ ++msgid "Local domain" ++msgstr "Локальный домен" ++ ++#, fuzzy ++msgid "" ++"Local domain specification. Names matching this domain are never forwarded " ++"and are resolved from DHCP or hosts files only" ++msgstr "" ++"Определение локального домена. Имена в Ñтом домене никогда не запрашиваютÑÑ " ++"у DNS-Ñервера, а разрешаютÑÑ Ð½Ð° оÑнове данных DHCP и файлов hosts" ++ ++msgid "Local domain suffix appended to DHCP names and hosts file entries" ++msgstr "" ++"Ð¡ÑƒÑ„Ñ„Ð¸ÐºÑ Ð»Ð¾ÐºÐ°Ð»ÑŒÐ½Ð¾Ð³Ð¾ домена, который будет добавлен к DHCP-именам и запиÑÑм из " ++"файлов hosts" ++ ++msgid "Local server" ++msgstr "Локальный Ñервер" ++ ++msgid "" ++"Localise hostname depending on the requesting subnet if multiple IPs are " ++"available" ++msgstr "" ++"Локализировать Ð¸Ð¼Ñ Ñ…Ð¾Ñта в завиÑимоÑти от запрашиваемой подÑети, еÑли " ++"доÑтупно неÑколько IP-адреÑов." ++ ++msgid "Localise queries" ++msgstr "Локализовывать запроÑÑ‹" ++ ++msgid "Locked to channel %d used by: %s" ++msgstr "" ++ ++msgid "Log output level" ++msgstr "Уровень вывода" ++ ++msgid "Log queries" ++msgstr "ЗапиÑывать запроÑÑ‹ в журнал" ++ ++msgid "Logging" ++msgstr "Журналирование" ++ ++msgid "Login" ++msgstr "Войти" ++ ++msgid "Logout" ++msgstr "Выйти" ++ ++msgid "Lowest leased address as offset from the network address." ++msgstr "Минимальный Ð°Ð´Ñ€ÐµÑ Ð°Ñ€ÐµÐ½Ð´Ñ‹." ++ ++msgid "MAC-Address" ++msgstr "MAC-адреÑ" ++ ++msgid "MAC-Address Filter" ++msgstr "Фильтр MAC-адреÑов" ++ ++msgid "MAC-Filter" ++msgstr "MAC-фильтр" ++ ++msgid "MAC-List" ++msgstr "СпиÑок MAC" ++ ++msgid "MB/s" ++msgstr "МБ/Ñ" ++ ++msgid "MHz" ++msgstr "МГц" ++ ++msgid "MTU" ++msgstr "MTU" ++ ++msgid "" ++"Make sure to clone the root filesystem using something like the commands " ++"below:" ++msgstr "" ++ ++msgid "Maximum Rate" ++msgstr "МакÑÐ¸Ð¼Ð°Ð»ÑŒÐ½Ð°Ñ ÑкороÑÑ‚ÑŒ" ++ ++msgid "Maximum allowed number of active DHCP leases" ++msgstr "МакÑимальное количеÑтво активных арендованных DHCP-адреÑов" ++ ++msgid "Maximum allowed number of concurrent DNS queries" ++msgstr "МакÑимально допуÑтимое количеÑтво одновременных DNS-запроÑов" ++ ++msgid "Maximum allowed size of EDNS.0 UDP packets" ++msgstr "МакÑимально допуÑтимый размер UDP пакетов-EDNS.0" ++ ++msgid "Maximum amount of seconds to wait for the modem to become ready" ++msgstr "МакÑимальное Ð²Ñ€ÐµÐ¼Ñ Ð¾Ð¶Ð¸Ð´Ð°Ð½Ð¸Ñ Ð³Ð¾Ñ‚Ð¾Ð²Ð½Ð¾Ñти модема (Ñекунды)" ++ ++msgid "Maximum hold time" ++msgstr "МакÑимальное Ð²Ñ€ÐµÐ¼Ñ ÑƒÐ´ÐµÑ€Ð¶Ð°Ð½Ð¸Ñ" ++ ++msgid "Maximum number of leased addresses." ++msgstr "МакÑимальное количеÑтво арендованных адреÑов." ++ ++msgid "Mbit/s" ++msgstr "Мбит/Ñ" ++ ++msgid "Memory" ++msgstr "ПамÑÑ‚ÑŒ" ++ ++msgid "Memory usage (%)" ++msgstr "ИÑпользование памÑти (%)" ++ ++msgid "Metric" ++msgstr "Метрика" ++ ++msgid "Minimum Rate" ++msgstr "ÐœÐ¸Ð½Ð¸Ð¼Ð°Ð»ÑŒÐ½Ð°Ñ ÑкороÑÑ‚ÑŒ" ++ ++msgid "Minimum hold time" ++msgstr "Минимальное Ð²Ñ€ÐµÐ¼Ñ ÑƒÐ´ÐµÑ€Ð¶Ð°Ð½Ð¸Ñ" ++ ++msgid "Mirror monitor port" ++msgstr "" ++ ++msgid "Mirror source port" ++msgstr "" ++ ++msgid "Missing protocol extension for proto %q" ++msgstr "ОтÑутÑтвует раÑширение протокола %q" ++ ++msgid "Mode" ++msgstr "Режим" ++ ++msgid "Model" ++msgstr "" ++ ++msgid "Modem device" ++msgstr "Модем" ++ ++msgid "Modem init timeout" ++msgstr "Таймаут инициализации модема" ++ ++# 802.11 monitor mode ++msgid "Monitor" ++msgstr "Монитор" ++ ++msgid "Mount Entry" ++msgstr "Точка монтированиÑ" ++ ++msgid "Mount Point" ++msgstr "Точка монтированиÑ" ++ ++msgid "Mount Points" ++msgstr "Точки монтированиÑ" ++ ++msgid "Mount Points - Mount Entry" ++msgstr "Точки Ð¼Ð¾Ð½Ñ‚Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ - ЗапиÑÑŒ" ++ ++msgid "Mount Points - Swap Entry" ++msgstr "Точки Ð¼Ð¾Ð½Ñ‚Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ - ЗапиÑÑŒ подкачки" ++ ++msgid "" ++"Mount Points define at which point a memory device will be attached to the " ++"filesystem" ++msgstr "" ++"Точки Ð¼Ð¾Ð½Ñ‚Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ð¾Ð¿Ñ€ÐµÐ´ÐµÐ»ÑÑŽÑ‚, куда в файловой ÑиÑтеме будет прикреплено " ++"запоминающее уÑтройÑтво" ++ ++msgid "Mount options" ++msgstr "Опции монтированиÑ" ++ ++msgid "Mount point" ++msgstr "Точка монтированиÑ" ++ ++msgid "Mounted file systems" ++msgstr "Смонтированные файловые ÑиÑтемы" ++ ++msgid "Move down" ++msgstr "ПеремеÑтить вниз" ++ ++msgid "Move up" ++msgstr "ПеремеÑтить вверх" ++ ++msgid "Multicast Rate" ++msgstr "СкороÑÑ‚ÑŒ групповой передачи" ++ ++msgid "Multicast address" ++msgstr "ÐÐ´Ñ€ÐµÑ Ð³Ñ€ÑƒÐ¿Ð¿Ð¾Ð²Ð¾Ð¹ передачи" ++ ++msgid "NAS ID" ++msgstr "Идентификатор NAS" ++ ++msgid "NDP-Proxy" ++msgstr "" ++ ++msgid "NTP server candidates" ++msgstr "СпиÑок NTP-Ñерверов" ++ ++msgid "NTP sync time-out" ++msgstr "" ++ ++msgid "Name" ++msgstr "ИмÑ" ++ ++msgid "Name of the new interface" ++msgstr "Ð˜Ð¼Ñ Ð½Ð¾Ð²Ð¾Ð³Ð¾ интерфейÑа" ++ ++msgid "Name of the new network" ++msgstr "Ð˜Ð¼Ñ Ð½Ð¾Ð²Ð¾Ð¹ Ñети" ++ ++msgid "Navigation" ++msgstr "ÐавигациÑ" ++ ++msgid "Netmask" ++msgstr "МаÑка Ñети" ++ ++msgid "Network" ++msgstr "Сеть" ++ ++msgid "Network Utilities" ++msgstr "Сетевые утилиты" ++ ++msgid "Network boot image" ++msgstr "Образ ÑиÑтемы Ð´Ð»Ñ Ñетевой загрузки" ++ ++msgid "Network without interfaces." ++msgstr "Сеть без интерфейÑов." ++ ++msgid "Next »" ++msgstr "Следующий »" ++ ++msgid "No DHCP Server configured for this interface" ++msgstr "DHCP-Ñервер не наÑтроен Ð´Ð»Ñ Ñтого интерфейÑа" ++ ++msgid "No chains in this table" ++msgstr "Ðет цепочек в Ñтой таблице" ++ ++msgid "No files found" ++msgstr "Файлы не найдены" ++ ++msgid "No information available" ++msgstr "Ðет доÑтупной информации" ++ ++msgid "No negative cache" ++msgstr "Отключить кÑш отрицательных ответов" ++ ++msgid "No network configured on this device" ++msgstr "Ðе наÑтроена Ñеть на уÑтройÑтве" ++ ++msgid "No network name specified" ++msgstr "Ðе задано Ð¸Ð¼Ñ Ñети" ++ ++msgid "No package lists available" ++msgstr "СпиÑок пакетов не доÑтупен" ++ ++msgid "No password set!" ++msgstr "Пароль не уÑтановлен!" ++ ++msgid "No rules in this chain" ++msgstr "Ðет правил в данной цепочке" ++ ++msgid "No zone assigned" ++msgstr "Зона не приÑвоена" ++ ++msgid "Noise" ++msgstr "Шум" ++ ++msgid "Noise Margin" ++msgstr "" ++ ++msgid "Noise:" ++msgstr "Шум:" ++ ++msgid "None" ++msgstr "Ðет" ++ ++msgid "Normal" ++msgstr "Ðормально" ++ ++msgid "Not Found" ++msgstr "Ðе найдено" ++ ++msgid "Not associated" ++msgstr "Ðе ÑвÑзанный" ++ ++msgid "Not connected" ++msgstr "Ðе подключено" ++ ++msgid "Note: Configuration files will be erased." ++msgstr "Примечание: конфигурационные файлы будут Ñтёрты." ++ ++msgid "Notice" ++msgstr "Заметка" ++ ++msgid "Nslookup" ++msgstr "DNS-запроÑ" ++ ++msgid "OK" ++msgstr "OK" ++ ++msgid "OPKG-Configuration" ++msgstr "ÐаÑтройка OPKG" ++ ++msgid "Off-State Delay" ++msgstr "Задержка выключенного ÑоÑтоÑниÑ" ++ ++msgid "" ++"On this page you can configure the network interfaces. You can bridge " ++"several interfaces by ticking the \"bridge interfaces\" field and enter the " ++"names of several network interfaces separated by spaces. You can also use " ++"VLAN notation " ++"INTERFACE.VLANNR (e.g.: " ++"eth0.1)." ++msgstr "" ++"Ðа Ñтой Ñтранице вы можете наÑтроить Ñетевые интерфейÑÑ‹. Ð’Ñ‹ можете " ++"объединить неÑколько интерфейÑов в моÑÑ‚, выбрав опцию \"Объединить в моÑÑ‚\" " ++"и Ð²Ð²ÐµÐ´Ñ ÑпиÑок интерфейÑов, разделенных пробелами. Ð’Ñ‹ также можете " ++"иÑпользовать VLAN-" ++"Ð¾Ð±Ð¾Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ Ð²Ð¸Ð´Ð° ИÐТЕРФЕЙС.ÐОМЕРVLAN (напр.: eth0.1)." ++ ++msgid "On-State Delay" ++msgstr "Задержка включенного ÑоÑтоÑниÑ" ++ ++msgid "One of hostname or mac address must be specified!" ++msgstr "Должен быть указан либо MAC-адреÑ, либо Ð¸Ð¼Ñ Ñ…Ð¾Ñта!" ++ ++msgid "One or more fields contain invalid values!" ++msgstr "Одно или неÑколько полей Ñодержат недопуÑтимые значениÑ!" ++ ++msgid "One or more required fields have no value!" ++msgstr "Одно или неÑколько обÑзательных полей не заполнены!" ++ ++msgid "Open list..." ++msgstr "Открыть ÑпиÑок..." ++ ++msgid "OpenConnect (CISCO AnyConnect)" ++msgstr "" ++ ++msgid "Operating frequency" ++msgstr "" ++ ++msgid "Option changed" ++msgstr "ÐžÐ¿Ñ†Ð¸Ñ Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð°" ++ ++msgid "Option removed" ++msgstr "ÐžÐ¿Ñ†Ð¸Ñ ÑƒÐ´Ð°Ð»ÐµÐ½Ð°" ++ ++msgid "Optional, specify to override default server (tic.sixxs.net)" ++msgstr "" ++ ++msgid "Optional, use when the SIXXS account has more than one tunnel" ++msgstr "" ++ ++msgid "Options" ++msgstr "Опции" ++ ++msgid "Other:" ++msgstr "Другие:" ++ ++msgid "Out" ++msgstr "Вне" ++ ++msgid "Outbound:" ++msgstr "ИÑходÑщий:" ++ ++msgid "Outdoor Channels" ++msgstr "Внешние каналы" ++ ++msgid "Output Interface" ++msgstr "" ++ ++msgid "Override MAC address" ++msgstr "Ðазначить MAC-адреÑ" ++ ++msgid "Override MTU" ++msgstr "Ðазначить MTU" ++ ++msgid "Override the gateway in DHCP responses" ++msgstr "Ðазначить шлюз в ответах DHCP" ++ ++msgid "" ++"Override the netmask sent to clients. Normally it is calculated from the " ++"subnet that is served." ++msgstr "" ++"Переопределите Ñетевую маÑку, отправленную клиентам. Обычно Ñто вычиÑлено от " ++"подÑети, ÐºÐ¾Ñ‚Ð¾Ñ€Ð°Ñ Ð¿Ð¾Ð´Ð°Ð½Ð°." ++ ++msgid "Override the table used for internal routes" ++msgstr "Ðазначить таблицу внутренних маршрутов" ++ ++msgid "Overview" ++msgstr "Обзор" ++ ++msgid "Owner" ++msgstr "Владелец" ++ ++msgid "PAP/CHAP password" ++msgstr "Пароль PAP/CHAP" ++ ++msgid "PAP/CHAP username" ++msgstr "Ð˜Ð¼Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ PAP/CHAP" ++ ++msgid "PID" ++msgstr "PID" ++ ++msgid "PIN" ++msgstr "PIN" ++ ++msgid "PPP" ++msgstr "PPP" ++ ++msgid "PPPoA Encapsulation" ++msgstr "ИнкапÑулÑÑ†Ð¸Ñ PPPoA" ++ ++msgid "PPPoATM" ++msgstr "PPPoATM" ++ ++msgid "PPPoE" ++msgstr "PPPoE" ++ ++msgid "PPtP" ++msgstr "PPTP" ++ ++msgid "Package libiwinfo required!" ++msgstr "ТребуетÑÑ Ð¿Ð°ÐºÐµÑ‚ libiwinfo!" ++ ++msgid "Package lists are older than 24 hours" ++msgstr "СпиÑок пакетов обновлÑлÑÑ Ð±Ð¾Ð»ÐµÐµ 24 чаÑов назад" ++ ++msgid "Package name" ++msgstr "Ð˜Ð¼Ñ Ð¿Ð°ÐºÐµÑ‚Ð°" ++ ++msgid "Packets" ++msgstr "Пакеты" ++ ++msgid "Part of zone %q" ++msgstr "ЧаÑÑ‚ÑŒ зоны %q" ++ ++msgid "Password" ++msgstr "Пароль" ++ ++msgid "Password authentication" ++msgstr "ÐÑƒÑ‚ÐµÐ½Ñ‚Ð¸Ñ„Ð¸ÐºÐ°Ñ†Ð¸Ñ Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ паролÑ" ++ ++msgid "Password of Private Key" ++msgstr "Пароль или закрытый ключ" ++ ++msgid "Password successfully changed!" ++msgstr "Пароль уÑпешно изменён!" ++ ++msgid "Path" ++msgstr "Путь" ++ ++msgid "Path to CA-Certificate" ++msgstr "Путь к центру Ñертификации" ++ ++msgid "Path to Client-Certificate" ++msgstr "Путь к клиентÑкому Ñертификату" ++ ++msgid "Path to Private Key" ++msgstr "Путь к личному ключу" ++ ++msgid "Path to executable which handles the button event" ++msgstr "Путь к программе, обрабатывающей нажатие кнопки" ++ ++msgid "Peak:" ++msgstr "ПиковаÑ:" ++ ++msgid "Perform reboot" ++msgstr "Выполнить перезагрузку" ++ ++msgid "Perform reset" ++msgstr "Выполнить ÑброÑ" ++ ++msgid "Phy Rate:" ++msgstr "СкороÑÑ‚ÑŒ:" ++ ++msgid "Physical Settings" ++msgstr "ÐаÑтройки канала" ++ ++msgid "Ping" ++msgstr "Эхо-запроÑ" ++ ++msgid "Pkts." ++msgstr "Пакетов." ++ ++msgid "Please enter your username and password." ++msgstr "ПожалуйÑта, введите логин и пароль." ++ ++msgid "Please wait: Device rebooting..." ++msgstr "ПожалуйÑта подождите: уÑтройÑтво перезагружаетÑÑ..." ++ ++msgid "Policy" ++msgstr "Политика" ++ ++msgid "Port" ++msgstr "Порт" ++ ++msgid "Port %d" ++msgstr "Порт %d" ++ ++msgid "Port %d is untagged in multiple VLANs!" ++msgstr "Порт %d нетегирован в неÑкольких VLANах!" ++ ++msgid "Port status:" ++msgstr "СоÑтоÑние порта:" ++ ++msgid "" ++"Presume peer to be dead after given amount of LCP echo failures, use 0 to " ++"ignore failures" ++msgstr "" ++"Предполагать, что узел недоÑтупен поÑле указанного количеÑтва ошибок " ++"Ð¿Ð¾Ð»ÑƒÑ‡ÐµÐ½Ð¸Ñ Ñхо-пакета LCP, введите 0 Ð´Ð»Ñ Ð¸Ð³Ð½Ð¾Ñ€Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ð¾ÑˆÐ¸Ð±Ð¾Ðº" ++ ++msgid "Prevents client-to-client communication" ++msgstr "Ðе позволÑет клиентам обмениватьÑÑ Ð´Ñ€ÑƒÐ³ Ñ Ð´Ñ€ÑƒÐ³Ð¾Ð¼ информацией" ++ ++msgid "Prism2/2.5/3 802.11b Wireless Controller" ++msgstr "БеÑпроводной 802.11b контроллер Prism2/2.5/3" ++ ++msgid "Proceed" ++msgstr "Продолжить" ++ ++msgid "Processes" ++msgstr "ПроцеÑÑÑ‹" ++ ++msgid "Prot." ++msgstr "Прот." ++ ++msgid "Protocol" ++msgstr "Протокол" ++ ++msgid "Protocol family" ++msgstr "СемейÑтво протоколов" ++ ++msgid "Protocol of the new interface" ++msgstr "Протокол нового интерфейÑа" ++ ++msgid "Protocol support is not installed" ++msgstr "Поддержка протокола не уÑтановлена" ++ ++msgid "Provide NTP server" ++msgstr "Включить NTP-Ñервер" ++ ++msgid "Provide new network" ++msgstr "ПредоÑтавлÑÑ‚ÑŒ новую Ñеть" ++ ++msgid "Pseudo Ad-Hoc (ahdemo)" ++msgstr "ПÑевдо Ad-Hoc (ahdemo)" ++ ++msgid "Public prefix routed to this device for distribution to clients." ++msgstr "" ++ ++msgid "Quality" ++msgstr "КачеÑтво" ++ ++msgid "RTS/CTS Threshold" ++msgstr "Порог RTS/CTS" ++ ++msgid "RX" ++msgstr "RX" ++ ++msgid "RX Rate" ++msgstr "СкороÑÑ‚ÑŒ приёма" ++ ++msgid "RaLink 802.11%s Wireless Controller" ++msgstr "БеÑпроводной 802.11%s контроллер RaLink" ++ ++msgid "Radius-Accounting-Port" ++msgstr "Порт Radius-Accounting" ++ ++msgid "Radius-Accounting-Secret" ++msgstr "Секрет Radius-Accounting" ++ ++msgid "Radius-Accounting-Server" ++msgstr "Сервер Radius-Accounting" ++ ++msgid "Radius-Authentication-Port" ++msgstr "Порт Radius-Authentication" ++ ++msgid "Radius-Authentication-Secret" ++msgstr "Секрет Radius-Authentication" ++ ++msgid "Radius-Authentication-Server" ++msgstr "Сервер Radius-Authentication" ++ ++msgid "" ++"Read /etc/ethers to configure the DHCP-Server" ++msgstr "" ++"Читать /etc/ethers Ð´Ð»Ñ Ð½Ð°Ñтройки DHCP-Ñервера" ++ ++msgid "" ++"Really delete this interface? The deletion cannot be undone!\\nYou might " ++"lose access to this device if you are connected via this interface." ++msgstr "" ++"ДейÑтвительно удалить Ñтот интерфейÑ? Удаление не может быть отменено!\\nÐ’Ñ‹ " ++"можете потерÑÑ‚ÑŒ доÑтуп к Ñтому уÑтройÑтву, еÑли вы подключены через Ñтот " ++"интерфейÑ." ++ ++msgid "" ++"Really delete this wireless network? The deletion cannot be undone!\\nYou " ++"might lose access to this device if you are connected via this network." ++msgstr "" ++"ДейÑтвительно удалить Ñту беÑпроводную Ñеть? Удаление не может быть отменено!" ++"\\nÐ’Ñ‹ можете потерÑÑ‚ÑŒ доÑтуп к Ñтому уÑтройÑтву, еÑли вы подключены через " ++"Ñту Ñеть." ++ ++msgid "Really reset all changes?" ++msgstr "ДейÑтвительно ÑброÑить вÑе изменениÑ?" ++ ++#, fuzzy ++msgid "" ++"Really shut down network?\\nYou might lose access to this device if you are " ++"connected via this interface." ++msgstr "" ++"ДейÑтвительно выключить Ñеть?\\nÐ’Ñ‹ можете потерÑÑ‚ÑŒ доÑтуп к Ñтому " ++"уÑтройÑтву, еÑли вы подключены через Ñтот интерфейÑ." ++ ++msgid "" ++"Really shutdown interface \"%s\" ?\\nYou might lose access to this device if " ++"you are connected via this interface." ++msgstr "" ++"ДейÑтвительно отключить Ð¸Ð½Ñ‚ÐµÑ€Ñ„ÐµÐ¹Ñ \"%s\" ?\\nÐ’Ñ‹ можете потерÑÑ‚ÑŒ доÑтуп к " ++"Ñтому уÑтройÑтву, еÑли вы подключены через Ñтот интерфейÑ." ++ ++msgid "Really switch protocol?" ++msgstr "Ð’Ñ‹ дейÑтвительно хотите изменить протокол?" ++ ++msgid "Realtime Connections" ++msgstr "Ð¡Ð¾ÐµÐ´Ð¸Ð½ÐµÐ½Ð¸Ñ Ð² реальном времени" ++ ++msgid "Realtime Graphs" ++msgstr "Графики в реальном времени" ++ ++msgid "Realtime Load" ++msgstr "Загрузка в реальном времени" ++ ++msgid "Realtime Traffic" ++msgstr "Трафик в реальном времени" ++ ++msgid "Realtime Wireless" ++msgstr "БеÑÐ¿Ñ€Ð¾Ð²Ð¾Ð´Ð½Ð°Ñ Ñеть в реальном времени" ++ ++msgid "Rebind protection" ++msgstr "Защита от DNS Rebinding" ++ ++msgid "Reboot" ++msgstr "Перезагрузка" ++ ++msgid "Rebooting..." ++msgstr "Перезагрузка..." ++ ++msgid "Reboots the operating system of your device" ++msgstr "Перезагрузить операционную ÑиÑтему вашего уÑтройÑтва" ++ ++msgid "Receive" ++msgstr "Приём" ++ ++msgid "Receiver Antenna" ++msgstr "ÐŸÑ€Ð¸Ñ‘Ð¼Ð½Ð°Ñ Ð°Ð½Ñ‚ÐµÐ½Ð½Ð°" ++ ++msgid "Reconnect this interface" ++msgstr "Переподключить Ñтот интерфейÑ" ++ ++msgid "Reconnecting interface" ++msgstr "Ð˜Ð½Ñ‚ÐµÑ€Ñ„ÐµÐ¹Ñ Ð¿ÐµÑ€ÐµÐ¿Ð¾Ð´ÐºÐ»ÑŽÑ‡Ð°ÐµÑ‚ÑÑ" ++ ++# References to firewall chains ++msgid "References" ++msgstr "СÑылки" ++ ++msgid "Regulatory Domain" ++msgstr "ÐÐ¾Ñ€Ð¼Ð°Ñ‚Ð¸Ð²Ð½Ð°Ñ Ð·Ð¾Ð½Ð°" ++ ++msgid "Relay" ++msgstr "РетранÑлÑтор" ++ ++msgid "Relay Bridge" ++msgstr "МоÑÑ‚-ретранÑлÑтор" ++ ++msgid "Relay between networks" ++msgstr "РетранÑлÑтор между ÑетÑми" ++ ++msgid "Relay bridge" ++msgstr "МоÑÑ‚-ретранÑлÑтор" ++ ++msgid "Remote IPv4 address" ++msgstr "Удалённый IPv4-адреÑ" ++ ++msgid "Remove" ++msgstr "Удалить" ++ ++msgid "Repeat scan" ++msgstr "Повторить Ñканирование" ++ ++msgid "Replace entry" ++msgstr "Заменить запиÑÑŒ" ++ ++msgid "Replace wireless configuration" ++msgstr "Заменить беÑпроводную конфигурацию" ++ ++msgid "Request IPv6-address" ++msgstr "" ++ ++msgid "Request IPv6-prefix of length" ++msgstr "" ++ ++msgid "Require TLS" ++msgstr "" ++ ++msgid "Required for certain ISPs, e.g. Charter with DOCSIS 3" ++msgstr "ТребуетÑÑ Ð´Ð»Ñ Ð½ÐµÐºÐ¾Ñ‚Ð¾Ñ€Ñ‹Ñ… интернет-провайдеров" ++ ++msgid "Reset" ++msgstr "СброÑить" ++ ++msgid "Reset Counters" ++msgstr "СброÑить Ñчётчики" ++ ++msgid "Reset to defaults" ++msgstr "СброÑить на Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ Ð¿Ð¾ умолчанию" ++ ++msgid "Resolv and Hosts Files" ++msgstr "Файлы resolv и hosts" ++ ++msgid "Resolve file" ++msgstr "Файл resolv" ++ ++msgid "Restart" ++msgstr "ПерезапуÑтить" ++ ++msgid "Restart Firewall" ++msgstr "ПерезапуÑтить межÑетевой Ñкран" ++ ++msgid "Restore backup" ++msgstr "ВоÑÑтановить резервную копию" ++ ++msgid "Reveal/hide password" ++msgstr "Показать/Ñкрыть пароль" ++ ++msgid "Revert" ++msgstr "Вернуть" ++ ++msgid "Root" ++msgstr "Корень" ++ ++msgid "Root directory for files served via TFTP" ++msgstr "ÐšÐ¾Ñ€Ð½ÐµÐ²Ð°Ñ Ð´Ð¸Ñ€ÐµÐºÑ‚Ð¾Ñ€Ð¸Ñ Ð´Ð»Ñ TFTP" ++ ++msgid "Root preparation" ++msgstr "" ++ ++msgid "Routed IPv6 prefix for downstream interfaces" ++msgstr "" ++ ++msgid "Router Advertisement-Service" ++msgstr "" ++ ++msgid "Router Password" ++msgstr "Пароль маршрутизатора" ++ ++msgid "Routes" ++msgstr "Маршруты" ++ ++msgid "" ++"Routes specify over which interface and gateway a certain host or network " ++"can be reached." ++msgstr "" ++"ÐœÐ°Ñ€ÑˆÑ€ÑƒÑ‚Ð¸Ð·Ð°Ñ†Ð¸Ñ Ñлужит Ð´Ð»Ñ Ð¾Ð¿Ñ€ÐµÐ´ÐµÐ»ÐµÐ½Ð¸Ñ Ñ‡ÐµÑ€ÐµÐ· какой Ð¸Ð½Ñ‚ÐµÑ€Ñ„ÐµÐ¹Ñ Ð¸ шлюз можно " ++"доÑтичть определённого хоÑта или Ñети." ++ ++msgid "Rule #" ++msgstr "Правило â„–" ++ ++msgid "Run a filesystem check before mounting the device" ++msgstr "ПроверÑÑ‚ÑŒ файловую ÑиÑтему перед монтированием уÑтройÑтва" ++ ++msgid "Run filesystem check" ++msgstr "ПроверÑÑ‚ÑŒ файловую ÑиÑтему" ++ ++msgid "" ++"SIXXS supports TIC only, for static tunnels using IP protocol 41 (RFC4213) " ++"use 6in4 instead" ++msgstr "" ++ ++msgid "SIXXS-handle[/Tunnel-ID]" ++msgstr "" ++ ++msgid "SSH Access" ++msgstr "ДоÑтуп по SSH" ++ ++msgid "SSH-Keys" ++msgstr "SSH-ключи" ++ ++msgid "SSID" ++msgstr "SSID" ++ ++msgid "Save" ++msgstr "Сохранить" ++ ++msgid "Save & Apply" ++msgstr "Сохранить и применить" ++ ++msgid "Save & Apply" ++msgstr "Сохранить и применить" ++ ++msgid "Scan" ++msgstr "Сканировать" ++ ++msgid "Scheduled Tasks" ++msgstr "Запланированные заданиÑ" ++ ++msgid "Section added" ++msgstr "Ð¡ÐµÐºÑ†Ð¸Ñ Ð´Ð¾Ð±Ð°Ð²Ð»ÐµÐ½Ð°" ++ ++msgid "Section removed" ++msgstr "Ð¡ÐµÐºÑ†Ð¸Ñ ÑƒÐ´Ð°Ð»ÐµÐ½Ð°" ++ ++msgid "See \"mount\" manpage for details" ++msgstr "Ð”Ð»Ñ Ð¿Ð¾Ð´Ñ€Ð¾Ð±Ð½Ð¾Ð¹ информации обратитеÑÑŒ к Ñправке по \"mount\" (man mount)" ++ ++msgid "" ++"Send LCP echo requests at the given interval in seconds, only effective in " ++"conjunction with failure threshold" ++msgstr "" ++"ОтправлÑÑ‚ÑŒ Ñхо-пакеты LCP Ñ ÑƒÐºÐ°Ð·Ð°Ð½Ð½Ñ‹Ð¼ интервалом (Ñекунды), Ñффективно " ++"только в Ñочетании Ñ Ð¿Ð¾Ñ€Ð¾Ð³Ð¾Ð¼ ошибок" ++ ++msgid "Separate Clients" ++msgstr "РазделÑÑ‚ÑŒ клиентов" ++ ++msgid "Separate WDS" ++msgstr "Отдельный WDS" ++ ++msgid "Server Settings" ++msgstr "ÐаÑтройки Ñервера" ++ ++msgid "Server password" ++msgstr "" ++ ++msgid "" ++"Server password, enter the specific password of the tunnel when the username " ++"contains the tunnel ID" ++msgstr "" ++ ++msgid "Server username" ++msgstr "" ++ ++msgid "Service Name" ++msgstr "Ð˜Ð¼Ñ Ñлужбы" ++ ++msgid "Service Type" ++msgstr "Тип Ñлужбы" ++ ++msgid "Services" ++msgstr "СервиÑÑ‹" ++ ++#, fuzzy ++msgid "Set up Time Synchronization" ++msgstr "ÐаÑтроить Ñинхронизацию времени" ++ ++msgid "Setup DHCP Server" ++msgstr "ÐаÑтроить Ñервер DHCP" ++ ++msgid "Show current backup file list" ++msgstr "Показать текущий ÑпиÑок файлов резервной копии" ++ ++msgid "Shutdown this interface" ++msgstr "Выключить Ñтот интерфейÑ" ++ ++msgid "Shutdown this network" ++msgstr "Выключить Ñту Ñеть" ++ ++msgid "Signal" ++msgstr "Сигнал" ++ ++msgid "Signal:" ++msgstr "Сигнал:" ++ ++msgid "Size" ++msgstr "Размер" ++ ++msgid "Skip" ++msgstr "ПропуÑтить" ++ ++msgid "Skip to content" ++msgstr "Перейти к Ñодержимому" ++ ++msgid "Skip to navigation" ++msgstr "Перейти к навигации" ++ ++msgid "Slot time" ++msgstr "Ð’Ñ€ÐµÐ¼Ñ Ñлота" ++ ++msgid "Software" ++msgstr "Программное обеÑпечение" ++ ++msgid "Some fields are invalid, cannot save values!" ++msgstr "Ðекоторые Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ Ð¿Ð¾Ð»ÐµÐ¹ недопуÑтимы, невозможно Ñохранить информацию!" ++ ++msgid "Sorry, the object you requested was not found." ++msgstr "Извините, запрошенный объект не был найден." ++ ++msgid "Sorry, the server encountered an unexpected error." ++msgstr "Извините, Ñервер ÑтолкнулÑÑ Ñ Ð½ÐµÐ¾Ð¶Ð¸Ð´Ð°Ð½Ð½Ð¾Ð¹ ошибкой." ++ ++#, fuzzy ++msgid "" ++"Sorry, there is no sysupgrade support present; a new firmware image must be " ++"flashed manually. Please refer to the OpenWrt wiki for device specific " ++"install instructions." ++msgstr "" ++"К Ñожалению, автоматичеÑкое обновление не поддерживаетÑÑ, Ð½Ð¾Ð²Ð°Ñ Ð¿Ñ€Ð¾ÑˆÐ¸Ð²ÐºÐ° " ++"должна быть уÑтановлена вручную. ОбратитеÑÑŒ к вики OpenWrt Ð´Ð»Ñ Ð¿Ð¾Ð»ÑƒÑ‡ÐµÐ½Ð¸Ñ " ++"конкретных инÑтрукций Ð´Ð»Ñ Ð²Ð°ÑˆÐµÐ³Ð¾ уÑтройÑтва." ++ ++msgid "Sort" ++msgstr "Сортировка" ++ ++msgid "Source" ++msgstr "ИÑточник" ++ ++msgid "Source routing" ++msgstr "" ++ ++msgid "Specifies the button state to handle" ++msgstr "СоÑтоÑние кнопки, которое необходимо обработать" ++ ++msgid "Specifies the directory the device is attached to" ++msgstr "ДиректориÑ, к которой приÑоединено уÑтройÑтво" ++ ++msgid "Specifies the listening port of this Dropbear instance" ++msgstr "Порт данного процеÑÑа Dropbear" ++ ++msgid "" ++"Specifies the maximum amount of failed ARP requests until hosts are presumed " ++"to be dead" ++msgstr "" ++"МакÑимальное количеÑтво неудачных запроÑов ARP, поÑле которого узлы " ++"ÑчитаютÑÑ Ð¾Ñ‚ÐºÐ»ÑŽÑ‡ÐµÐ½Ð½Ñ‹Ð¼Ð¸" ++ ++msgid "" ++"Specifies the maximum amount of seconds after which hosts are presumed to be " ++"dead" ++msgstr "" ++"МакÑимальное количеÑтво Ñекунд, поÑле которого узлы ÑчитаютÑÑ Ð¾Ñ‚ÐºÐ»ÑŽÑ‡ÐµÐ½Ð½Ñ‹Ð¼Ð¸" ++ ++msgid "Specify the secret encryption key here." ++msgstr "Укажите закрытый ключ." ++ ++msgid "Start" ++msgstr "ЗапуÑтить" ++ ++msgid "Start priority" ++msgstr "Приоритет" ++ ++msgid "Startup" ++msgstr "Загрузка" ++ ++msgid "Static IPv4 Routes" ++msgstr "СтатичеÑкие маршруты IPv4" ++ ++msgid "Static IPv6 Routes" ++msgstr "СтатичеÑкие маршруты IPv6" ++ ++msgid "Static Leases" ++msgstr "ПоÑтоÑнные аренды" ++ ++msgid "Static Routes" ++msgstr "СтатичеÑкие маршруты" ++ ++msgid "Static WDS" ++msgstr "СтатичеÑкий WDS" ++ ++msgid "Static address" ++msgstr "СтатичеÑкий адреÑ" ++ ++msgid "" ++"Static leases are used to assign fixed IP addresses and symbolic hostnames " ++"to DHCP clients. They are also required for non-dynamic interface " ++"configurations where only hosts with a corresponding lease are served." ++msgstr "" ++"ПоÑтоÑÐ½Ð½Ð°Ñ Ð°Ñ€ÐµÐ½Ð´Ð° иÑпользуетÑÑ Ð´Ð»Ñ Ð¿Ñ€Ð¸ÑÐ²Ð¾ÐµÐ½Ð¸Ñ Ñ„Ð¸ÐºÑированных IP-адреÑов и " ++"имён DHCP-клиентам. ПоÑтоÑÐ½Ð½Ð°Ñ Ð°Ñ€ÐµÐ½Ð´Ð° также необходима Ð´Ð»Ñ ÑтатичеÑких " ++"интерфейÑов, в которых обÑлуживаютÑÑ Ñ‚Ð¾Ð»ÑŒÐºÐ¾ клиенты Ñ Ð¿Ñ€Ð¸Ñвоенными адреÑами." ++ ++msgid "Status" ++msgstr "СтатуÑ" ++ ++msgid "Stop" ++msgstr "ОÑтановить" ++ ++msgid "Strict order" ++msgstr "Строгий порÑдок" ++ ++msgid "Submit" ++msgstr "Применить" ++ ++msgid "Swap" ++msgstr "" ++ ++msgid "Swap Entry" ++msgstr "Раздел подкачки" ++ ++msgid "Switch" ++msgstr "Коммутатор" ++ ++msgid "Switch %q" ++msgstr "Коммутатор %q" ++ ++msgid "Switch %q (%s)" ++msgstr "Коммутатор %q (%s)" ++ ++msgid "Switch protocol" ++msgstr "Изменить протокол" ++ ++msgid "Sync with browser" ++msgstr "Синхронизировать Ñ Ð±Ñ€Ð°ÑƒÐ·ÐµÑ€Ð¾Ð¼" ++ ++msgid "Synchronizing..." ++msgstr "СинхронизациÑ..." ++ ++msgid "System" ++msgstr "СиÑтема" ++ ++msgid "System Log" ++msgstr "СиÑтемный журнал" ++ ++msgid "System Properties" ++msgstr "СвойÑтва ÑиÑтемы" ++ ++msgid "System log buffer size" ++msgstr "Размер ÑиÑтемного журнала" ++ ++msgid "TCP:" ++msgstr "TCP:" ++ ++msgid "TFTP Settings" ++msgstr "ÐаÑтройки TFTP" ++ ++msgid "TFTP server root" ++msgstr "Корень TFTP-Ñервера" ++ ++msgid "TX" ++msgstr "TX" ++ ++msgid "TX Rate" ++msgstr "СкороÑÑ‚ÑŒ передачи" ++ ++msgid "Table" ++msgstr "Таблица" ++ ++msgid "Target" ++msgstr "Цель" ++ ++msgid "Terminate" ++msgstr "Завершить" ++ ++#, fuzzy ++msgid "" ++"The Device Configuration section covers physical settings of the " ++"radio hardware such as channel, transmit power or antenna selection which " ++"are shared among all defined wireless networks (if the radio hardware is " ++"multi-SSID capable). Per network settings like encryption or operation mode " ++"are grouped in the Interface Configuration." ++msgstr "" ++"Раздел ÐšÐ¾Ð½Ñ„Ð¸Ð³ÑƒÑ€Ð°Ñ†Ð¸Ñ ÑƒÑтройÑтва Ñодержит физичеÑкие наÑтройки " ++"беÑпроводного оборудованиÑ, такие как канал, мощноÑÑ‚ÑŒ передатчика или выбор " ++"антенны, которые ÑвлÑÑŽÑ‚ÑÑ Ð¾Ð±Ñ‰Ð¸Ð¼Ð¸ Ð´Ð»Ñ Ð²Ñех определённых беÑпроводных Ñетей " ++"(еÑли оборудование поддерживает неÑколько SSID). ÐаÑтройки отдельных Ñетей, " ++"такие как шифрование или режим работы, Ñгруппированы в разделе " ++"ÐšÐ¾Ð½Ñ„Ð¸Ð³ÑƒÑ€Ð°Ñ†Ð¸Ñ Ð¸Ð½Ñ‚ÐµÑ€Ñ„ÐµÐ¹Ñа." ++ ++msgid "" ++"The libiwinfo-lua package is not installed. You must install this " ++"component for working wireless configuration!" ++msgstr "" ++"Пакет libiwinfo-lua не уÑтановлен. Ð”Ð»Ñ Ð²ÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ Ð½Ð°Ñтроек " ++"беÑпроводных Ñетей, вам необходимо уÑтановить Ñтот компонент!" ++ ++msgid "" ++"The HE.net endpoint update configuration changed, you must now use the plain " ++"username instead of the user ID!" ++msgstr "" ++ ++msgid "" ++"The IPv6 prefix assigned to the provider, usually ends with ::" ++msgstr "" ++"Ðазначенный провайдеру Ð¿Ñ€ÐµÑ„Ð¸ÐºÑ IPv6, обычно заканчиваетÑÑ Ð½Ð° ::" ++ ++msgid "" ++"The allowed characters are: A-Z, a-z, 0-9 and _" ++msgstr "" ++"ДопуÑтимые Ñимволы: A-Z, a-z, 0-9 и " ++"_" ++ ++msgid "The configuration file could not be loaded due to the following error:" ++msgstr "" ++ ++msgid "" ++"The device file of the memory or partition (e.g." ++" /dev/sda1)" ++msgstr "" ++"УÑтройÑтво или раздел (напр. /dev/" ++"sda1)" ++ ++msgid "" ++"The filesystem that was used to format the memory (e.g. ext3)" ++msgstr "" ++"Формат файловой ÑиÑтемы (напр. ext3)" ++ ++msgid "" ++"The flash image was uploaded. Below is the checksum and file size listed, " ++"compare them with the original file to ensure data integrity.
    Click " ++"\"Proceed\" below to start the flash procedure." ++msgstr "" ++"Образ загружен. ПожалуйÑта, Ñравните размер файла и контрольную Ñумму, чтобы " ++"удоÑтоверитьÑÑ Ð² целоÑтноÑти данных.
    Ðажмите \"Продолжить\", чтобы " ++"начать процедуру Ð¾Ð±Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ Ð¿Ñ€Ð¾ÑˆÐ¸Ð²ÐºÐ¸." ++ ++msgid "The following changes have been committed" ++msgstr "Данные Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð±Ñ‹Ð»Ð¸ применены" ++ ++msgid "The following changes have been reverted" ++msgstr "Данные Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð±Ñ‹Ð»Ð¸ отвергнуты" ++ ++msgid "The following rules are currently active on this system." ++msgstr "Ðа данном уÑтройÑтве активны Ñледующие правила." ++ ++msgid "The given network name is not unique" ++msgstr "Заданное Ð¸Ð¼Ñ Ñети не ÑвлÑетÑÑ ÑƒÐ½Ð¸ÐºÐ°Ð»ÑŒÐ½Ñ‹Ð¼" ++ ++#, fuzzy ++msgid "" ++"The hardware is not multi-SSID capable and the existing configuration will " ++"be replaced if you proceed." ++msgstr "" ++"Оборудование не поддерживает неÑколько SSID, и, еÑли вы продолжите, " ++"ÑущеÑÑ‚Ð²ÑƒÑŽÑ‰Ð°Ñ ÐºÐ¾Ð½Ñ„Ð¸Ð³ÑƒÑ€Ð°Ñ†Ð¸Ñ Ð±ÑƒÐ´ÐµÑ‚ заменена." ++ ++msgid "" ++"The length of the IPv4 prefix in bits, the remainder is used in the IPv6 " ++"addresses." ++msgstr "" ++"Длина префикÑа IPv4 в битах, оÑтавшееÑÑ Ð±ÑƒÐ´ÐµÑ‚ иÑпользоватьÑÑ Ð² IPv6-адреÑах." ++ ++msgid "The length of the IPv6 prefix in bits" ++msgstr "Длина префикÑа IPv6 в битах" ++ ++msgid "" ++"The network ports on this device can be combined to several VLANs in which computers can " ++"communicate directly with each other. VLANs are often used to separate different network " ++"segments. Often there is by default one Uplink port for a connection to the " ++"next greater network like the internet and other ports for a local network." ++msgstr "" ++"Сетевые порты Ñтого уÑтройÑтва могут быть объединены в неÑколько VLANов, в которых компьютеры могут " ++"ÑвÑзыватьÑÑ Ð½Ð°Ð¿Ñ€Ñмую между Ñобой. VLANÑ‹ чаÑто иÑпользуютÑÑ Ð´Ð»Ñ Ñ€Ð°Ð·Ð´ÐµÐ»ÐµÐ½Ð¸Ñ Ð½ÐµÑкольких Ñетевых " ++"Ñегментов. Обычно по умолчанию иÑпользуетÑÑ Ð¾Ð´Ð¸Ð½ воÑходÑщий порт Ð´Ð»Ñ " ++"Ð¿Ð¾Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ Ðº выÑшей рангом Ñети, например к интернету или к другим портам " ++"локальной Ñети." ++ ++msgid "The selected protocol needs a device assigned" ++msgstr "Ð”Ð»Ñ Ð²Ñ‹Ð±Ñ€Ð°Ð½Ð½Ð¾Ð³Ð¾ протокола необходимо задать уÑтройÑтво" ++ ++msgid "" ++"The system is erasing the configuration partition now and will reboot itself " ++"when finished." ++msgstr "" ++"Идёт удаление раздела конфигурации Ñ Ð¿Ð¾Ñледующей перезагрузкой ÑиÑитемы." ++ ++#, fuzzy ++msgid "" ++"The system is flashing now.
    DO NOT POWER OFF THE DEVICE!
    Wait a " ++"few minutes before you try to reconnect. It might be necessary to renew the " ++"address of your computer to reach the device again, depending on your " ++"settings." ++msgstr "" ++"СиÑтема обновлÑетÑÑ.
    ÐЕ ОТКЛЮЧÐЙТЕ ПИТÐÐИЕ УСТРОЙСТВÐ!
    Подождите " ++"неÑколько минут перед тем, как попытаетеÑÑŒ заново ÑоединитьÑÑ. Ð’ завиÑимоÑти " ++"от ваших наÑтроек, возможно вам понадобитÑÑ Ð¾Ð±Ð½Ð¾Ð²Ð¸Ñ‚ÑŒ Ð°Ð´Ñ€ÐµÑ Ð²Ð°ÑˆÐµÐ³Ð¾ " ++"компьютера, чтобы Ñнова получить доÑтуп к уÑтройÑтву." ++ ++msgid "" ++"The tunnel end-point is behind NAT, defaults to disabled and only applies to " ++"AYIYA" ++msgstr "" ++ ++msgid "" ++"The uploaded image file does not contain a supported format. Make sure that " ++"you choose the generic image format for your platform." ++msgstr "" ++"Загруженный файл образа не поддерживаетÑÑ. ПожалуйÑта, проверьте, что вы " ++"загрузили правильный образ Ð´Ð»Ñ Ð²Ð°ÑˆÐµÐ¹ платформы." ++ ++msgid "There are no active leases." ++msgstr "Ðет активных арендованных адреÑов." ++ ++msgid "There are no pending changes to apply!" ++msgstr "Ðет изменений, которые можно применить!" ++ ++msgid "There are no pending changes to revert!" ++msgstr "Ðет изменений, которые можно отменить!" ++ ++msgid "There are no pending changes!" ++msgstr "Ðет изменений, которые можно применить!" ++ ++msgid "" ++"There is no device assigned yet, please attach a network device in the " ++"\"Physical Settings\" tab" ++msgstr "" ++"УÑтройÑтво не назначено. ПожалуйÑта, назначьте Ñетевое уÑтройÑтво во вкладке " ++"\"ÐаÑтройки канала\"" ++ ++msgid "" ++"There is no password set on this router. Please configure a root password to " ++"protect the web interface and enable SSH." ++msgstr "" ++"Пароль Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ root не уÑтановлен. ПожалуйÑта, уÑтановите пароль, чтобы " ++"защитить веб-Ð¸Ð½Ñ‚ÐµÑ€Ñ„ÐµÐ¹Ñ Ð¸ включить SSH." ++ ++msgid "This IPv4 address of the relay" ++msgstr "IPv4-Ð°Ð´Ñ€ÐµÑ Ñ€ÐµÑ‚Ñ€Ð°Ð½ÑлÑтора" ++ ++msgid "" ++"This is a list of shell glob patterns for matching files and directories to " ++"include during sysupgrade. Modified files in /etc/config/ and certain other " ++"configurations are automatically preserved." ++msgstr "" ++"Это ÑпиÑок шаблонов Ð´Ð»Ñ ÑоответÑÑ‚Ð²Ð¸Ñ Ñ„Ð°Ð¹Ð»Ð¾Ð² и директорий Ð´Ð»Ñ ÑÐ¾Ñ…Ñ€Ð°Ð½ÐµÐ½Ð¸Ñ Ð¿Ñ€Ð¸ " ++"иÑпользовании sysupgrade. Изменённые файлы в /etc/config и некоторые другие " ++"конфигурации автоматичеÑки ÑохранÑÑŽÑ‚ÑÑ." ++ ++msgid "" ++"This is either the \"Update Key\" configured for the tunnel or the account " ++"password if no update key has been configured" ++msgstr "" ++ ++msgid "" ++"This is the content of /etc/rc.local. Insert your own commands here (in " ++"front of 'exit 0') to execute them at the end of the boot process." ++msgstr "" ++"Это Ñодержимое /etc/rc.local. Ð’Ñ‹ можете добавить Ñвои команды (перед 'exit " ++"0'), чтобы выполнить их в конце загрузки." ++ ++# Maybe it usually ends with ::2? ++msgid "" ++"This is the local endpoint address assigned by the tunnel broker, it usually " ++"ends with :2" ++msgstr "" ++"Это локальный адреÑ, назначенный туннельным брокером, обычно заканчиваетÑÑ " ++"на :2" ++ ++msgid "" ++"This is the only DHCP in the local network" ++msgstr "" ++"Это единÑтвенный DHCP-Ñервер в локальной Ñети" ++ ++msgid "This is the plain username for logging into the account" ++msgstr "" ++ ++msgid "" ++"This is the prefix routed to you by the tunnel broker for use by clients" ++msgstr "" ++ ++msgid "This is the system crontab in which scheduled tasks can be defined." ++msgstr "" ++"Это таблица cron (crontab), в которой вы можете определить запланированные " ++"заданиÑ." ++ ++msgid "" ++"This is usually the address of the nearest PoP operated by the tunnel broker" ++msgstr "Это Ð°Ð´Ñ€ÐµÑ Ð±Ð»Ð¸Ð¶Ð°Ð¹ÑˆÐµÐ¹ точки приÑутÑÑ‚Ð²Ð¸Ñ Ñ‚ÑƒÐ½Ð½ÐµÐ»ÑŒÐ½Ð¾Ð³Ð¾ брокера" ++ ++msgid "" ++"This list gives an overview over currently running system processes and " ++"their status." ++msgstr "Данный ÑпиÑок Ñодержит работающие процеÑÑÑ‹ и их ÑтатуÑ." ++ ++msgid "This page allows the configuration of custom button actions" ++msgstr "Ð”Ð°Ð½Ð½Ð°Ñ Ñтраница позволÑет наÑтроить обработку кнопок" ++ ++msgid "This page gives an overview over currently active network connections." ++msgstr "" ++"Ð”Ð°Ð½Ð½Ð°Ñ Ñтраница Ñодержит обзор вÑех активных на данный момент Ñетевых " ++"Ñоединений." ++ ++msgid "This section contains no values yet" ++msgstr "Эта ÑÐµÐºÑ†Ð¸Ñ Ð¿Ð¾ÐºÐ° не Ñодержит значений" ++ ++msgid "Time Synchronization" ++msgstr "Ð¡Ð¸Ð½Ñ…Ñ€Ð¾Ð½Ð¸Ð·Ð°Ñ†Ð¸Ñ Ð²Ñ€ÐµÐ¼ÐµÐ½Ð¸" ++ ++msgid "Time Synchronization is not configured yet." ++msgstr "Ð¡Ð¸Ð½Ñ…Ñ€Ð¾Ð½Ð¸Ð·Ð°Ñ†Ð¸Ñ Ð²Ñ€ÐµÐ¼ÐµÐ½Ð¸ ещё не наÑтроена." ++ ++msgid "Timezone" ++msgstr "ЧаÑовой поÑÑ" ++ ++msgid "" ++"To restore configuration files, you can upload a previously generated backup " ++"archive here." ++msgstr "" ++"Чтобы воÑÑтановить файлы конфигурации, вы можете загрузить ранее Ñозданный " ++"архив здеÑÑŒ." ++ ++msgid "Total Available" ++msgstr "Ð’Ñего доÑтупно" ++ ++msgid "Traceroute" ++msgstr "ТраÑÑировка" ++ ++msgid "Traffic" ++msgstr "Трафик" ++ ++msgid "Transfer" ++msgstr "Передача" ++ ++msgid "Transmission Rate" ++msgstr "СкороÑÑ‚ÑŒ передачи" ++ ++msgid "Transmit" ++msgstr "Передача" ++ ++msgid "Transmit Power" ++msgstr "МощноÑÑ‚ÑŒ передатчика" ++ ++msgid "Transmitter Antenna" ++msgstr "ÐŸÐµÑ€ÐµÐ´Ð°ÑŽÑ‰Ð°Ñ Ð°Ð½Ñ‚ÐµÐ½Ð½Ð°" ++ ++msgid "Trigger" ++msgstr "Триггер" ++ ++msgid "Trigger Mode" ++msgstr "Режим ÑрабатываниÑ" ++ ++msgid "Tunnel ID" ++msgstr "Идентификатор туннелÑ" ++ ++msgid "Tunnel Interface" ++msgstr "Ð˜Ð½Ñ‚ÐµÑ€Ñ„ÐµÐ¹Ñ Ñ‚ÑƒÐ½Ð½ÐµÐ»Ñ" ++ ++msgid "Tunnel Link" ++msgstr "" ++ ++msgid "Tunnel broker protocol" ++msgstr "" ++ ++msgid "Tunnel setup server" ++msgstr "" ++ ++msgid "Tunnel type" ++msgstr "" ++ ++msgid "Turbo Mode" ++msgstr "Турбо-режим" ++ ++msgid "Tx-Power" ++msgstr "МощноÑÑ‚ÑŒ передатчика" ++ ++msgid "Type" ++msgstr "Тип" ++ ++msgid "UDP:" ++msgstr "UDP:" ++ ++msgid "UMTS only" ++msgstr "Только UMTS" ++ ++msgid "UMTS/GPRS/EV-DO" ++msgstr "UMTS/GPRS/EV-DO" ++ ++msgid "USB Device" ++msgstr "USB-уÑтройÑтво" ++ ++msgid "UUID" ++msgstr "UUID" ++ ++msgid "Unable to dispatch" ++msgstr "Ðевозможно обработать Ð·Ð°Ð¿Ñ€Ð¾Ñ Ð´Ð»Ñ" ++ ++msgid "Unknown" ++msgstr "ÐеизвеÑтно" ++ ++msgid "Unknown Error, password not changed!" ++msgstr "ÐеизвеÑÑ‚Ð½Ð°Ñ Ð¾ÑˆÐ¸Ð±ÐºÐ°, пароль не был изменен!" ++ ++msgid "Unmanaged" ++msgstr "ÐеуправлÑемый" ++ ++msgid "Unsaved Changes" ++msgstr "ÐепринÑтые изменениÑ" ++ ++msgid "Unsupported protocol type." ++msgstr "Ðеподдерживаемый тип протокола." ++ ++msgid "Update lists" ++msgstr "Обновить ÑпиÑки" ++ ++msgid "" ++"Upload a sysupgrade-compatible image here to replace the running firmware. " ++"Check \"Keep settings\" to retain the current configuration (requires an " ++"OpenWrt compatible firmware image)." ++msgstr "" ++"Загрузите sysupgrade-ÑовмеÑтимый образ, чтобы заменить текущую прошивку. " ++"УÑтановите флажок \"Сохранить наÑтройки\", чтобы Ñохранить текущую " ++"конфигурацию (требуетÑÑ ÑовмеÑтимый Ñ OpenWrt образ прошивки)." ++ ++msgid "Upload archive..." ++msgstr "Загрузить архив..." ++ ++msgid "Uploaded File" ++msgstr "Загруженный файл" ++ ++msgid "Uptime" ++msgstr "Ð’Ñ€ÐµÐ¼Ñ Ñ€Ð°Ð±Ð¾Ñ‚Ñ‹" ++ ++msgid "Use /etc/ethers" ++msgstr "ИÑпользовать /etc/ethers" ++ ++msgid "Use DHCP gateway" ++msgstr "ИÑпользовать шлюз DHCP" ++ ++msgid "Use DNS servers advertised by peer" ++msgstr "ИÑпользовать объÑвлÑемые узлом DNS-Ñерверы" ++ ++msgid "Use ISO/IEC 3166 alpha2 country codes." ++msgstr "ИÑпользовать коды Ñтран ISO/IEC 3166 alpha2." ++ ++msgid "Use MTU on tunnel interface" ++msgstr "ИÑпользовать MTU на интерфейÑе туннелÑ" ++ ++msgid "Use TTL on tunnel interface" ++msgstr "ИÑпользовать TTL на интерфейÑе туннелÑ" ++ ++msgid "Use as external overlay (/overlay)" ++msgstr "" ++ ++msgid "Use as root filesystem (/)" ++msgstr "" ++ ++msgid "Use broadcast flag" ++msgstr "ИÑпользовать широковещательный флаг" ++ ++msgid "Use builtin IPv6-management" ++msgstr "" ++ ++msgid "Use custom DNS servers" ++msgstr "ИÑпользовать ÑобÑтвенные DNS-Ñерверы" ++ ++msgid "Use default gateway" ++msgstr "ИÑпользовать шлюз по умолчанию" ++ ++msgid "Use gateway metric" ++msgstr "ИÑпользовать метрику шлюза" ++ ++msgid "Use routing table" ++msgstr "ИÑпользовать таблицу маршрутизации" ++ ++msgid "" ++"Use the Add Button to add a new lease entry. The MAC-Address indentifies the host, the IPv4-Address specifies to the fixed " ++"address to use and the Hostname is assigned as symbolic name to the " ++"requesting host." ++msgstr "" ++"Ðажмите кнопку Добавить, чтобы добавить новую запиÑÑŒ аренды. " ++"MAC-Ð°Ð´Ñ€ÐµÑ Ð¸Ð´ÐµÐ½Ñ‚Ð¸Ñ„Ð¸Ñ†Ð¸Ñ€ÑƒÐµÑ‚ хоÑÑ‚, IPv4-Ð°Ð´Ñ€ÐµÑ ÑƒÐºÐ°Ð·Ñ‹Ð²Ð°ÐµÑ‚ " ++"фикÑированный адреÑ, а Ð˜Ð¼Ñ Ñ…Ð¾Ñта приÑваиваетÑÑ Ð² качеÑтве " ++"Ñимвольного имени Ð´Ð»Ñ Ð·Ð°Ð¿Ñ€Ð°ÑˆÐ¸Ð²Ð°ÑŽÑ‰ÐµÐ³Ð¾ хоÑта." ++ ++msgid "Used" ++msgstr "ИÑпользовано" ++ ++msgid "Used Key Slot" ++msgstr "ИÑпользуемый Ñлот ключа" ++ ++msgid "User certificate (PEM encoded)" ++msgstr "" ++ ++msgid "User key (PEM encoded)" ++msgstr "" ++ ++msgid "Username" ++msgstr "Ð˜Ð¼Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ" ++ ++msgid "VC-Mux" ++msgstr "VC-Mux" ++ ++msgid "VLAN Interface" ++msgstr "Ð˜Ð½Ñ‚ÐµÑ€Ñ„ÐµÐ¹Ñ VLAN" ++ ++msgid "VLANs on %q" ++msgstr "VLANÑ‹ на %q" ++ ++msgid "VLANs on %q (%s)" ++msgstr "VLANÑ‹ на %q (%s)" ++ ++msgid "VPN Server" ++msgstr "Сервер VPN" ++ ++msgid "VPN Server port" ++msgstr "" ++ ++msgid "VPN Server's certificate SHA1 hash" ++msgstr "" ++ ++msgid "Vendor Class to send when requesting DHCP" ++msgstr "" ++"КлаÑÑ Ð¿Ñ€Ð¾Ð¸Ð·Ð²Ð¾Ð´Ð¸Ñ‚ÐµÐ»Ñ (Vendor class), который отправлÑÑ‚ÑŒ при DHCP-запроÑах" ++ ++msgid "Verbose" ++msgstr "" ++ ++msgid "Verbose logging by aiccu daemon" ++msgstr "" ++ ++msgid "Verify" ++msgstr "Проверить" ++ ++msgid "Version" ++msgstr "ВерÑиÑ" ++ ++msgid "WDS" ++msgstr "WDS" ++ ++msgid "WEP Open System" ++msgstr "ÐžÑ‚ÐºÑ€Ñ‹Ñ‚Ð°Ñ ÑиÑтема WEP" ++ ++msgid "WEP Shared Key" ++msgstr "Общий ключ WEP" ++ ++msgid "WEP passphrase" ++msgstr "Пароль WEP" ++ ++msgid "WMM Mode" ++msgstr "Режим WMM" ++ ++msgid "WPA passphrase" ++msgstr "Пароль WPA" ++ ++msgid "" ++"WPA-Encryption requires wpa_supplicant (for client mode) or hostapd (for AP " ++"and ad-hoc mode) to be installed." ++msgstr "" ++"Ðеобходимо уÑтановить wpa_supplicant (режим клиента) или hostapd (режим " ++"точки доÑтупа или ad-hoc) Ð´Ð»Ñ Ð¿Ð¾Ð´Ð´ÐµÑ€Ð¶ÐºÐ¸ ÑˆÐ¸Ñ„Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ WPA." ++ ++msgid "" ++"Wait for NTP sync that many seconds, seting to 0 disables waiting (optional)" ++msgstr "" ++ ++msgid "Waiting for changes to be applied..." ++msgstr "Ожидание Ð¿Ñ€Ð¸Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ð¹..." ++ ++msgid "Waiting for command to complete..." ++msgstr "Ожидание Ð·Ð°Ð²ÐµÑ€ÑˆÐµÐ½Ð¸Ñ Ð²Ñ‹Ð¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ‹..." ++ ++msgid "Warning" ++msgstr "Внимание" ++ ++msgid "Warning: There are unsaved changes that will be lost while rebooting!" ++msgstr "" ++"Внимание: еÑÑ‚ÑŒ неÑохранённые изменениÑ, которые потерÑÑŽÑ‚ÑÑ Ð¿Ð¾Ñле " ++"перезагрузки!" ++ ++msgid "Whether to create an IPv6 default route over the tunnel" ++msgstr "" ++ ++msgid "Whether to route only packets from delegated prefixes" ++msgstr "" ++ ++msgid "Width" ++msgstr "" ++ ++msgid "Wifi" ++msgstr "Wi-Fi" ++ ++msgid "Wireless" ++msgstr "Wi-Fi" ++ ++msgid "Wireless Adapter" ++msgstr "БеÑпроводной адаптер" ++ ++msgid "Wireless Network" ++msgstr "БеÑÐ¿Ñ€Ð¾Ð²Ð¾Ð´Ð½Ð°Ñ Ñеть" ++ ++msgid "Wireless Overview" ++msgstr "Обзор беÑпроводных Ñетей" ++ ++msgid "Wireless Security" ++msgstr "БезопаÑноÑÑ‚ÑŒ беÑпроводной Ñети" ++ ++msgid "Wireless is disabled or not associated" ++msgstr "БеÑÐ¿Ñ€Ð¾Ð²Ð¾Ð´Ð½Ð°Ñ Ñеть отключена или не ÑвÑзана " ++ ++msgid "Wireless is restarting..." ++msgstr "БеÑÐ¿Ñ€Ð¾Ð²Ð¾Ð´Ð½Ð°Ñ Ñеть перезапуÑкаетÑÑ..." ++ ++msgid "Wireless network is disabled" ++msgstr "БеÑÐ¿Ñ€Ð¾Ð²Ð¾Ð´Ð½Ð°Ñ Ñеть отключена" ++ ++msgid "Wireless network is enabled" ++msgstr "БеÑÐ¿Ñ€Ð¾Ð²Ð¾Ð´Ð½Ð°Ñ Ñеть включена" ++ ++msgid "Wireless restarted" ++msgstr "БеÑÐ¿Ñ€Ð¾Ð²Ð¾Ð´Ð½Ð°Ñ Ñеть перезапущена" ++ ++msgid "Wireless shut down" ++msgstr "Выключение беÑпроводной Ñети" ++ ++msgid "Write received DNS requests to syslog" ++msgstr "ЗапиÑывать полученные DNS-запроÑÑ‹ в ÑиÑтемный журнал" ++ ++msgid "XR Support" ++msgstr "Поддержка XR" ++ ++msgid "" ++"You can enable or disable installed init scripts here. Changes will applied " ++"after a device reboot.
    Warning: If you disable essential init " ++"scripts like \"network\", your device might become inaccessible!" ++msgstr "" ++"ЗдеÑÑŒ вы можете включить или выключить уÑтановленные Ñкрипты инициализации. " ++"Ð˜Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð²ÑтупÑÑ‚ в Ñилу поÑле перезагрузки уÑтройÑтва.
    Внимание: еÑли вы выключите один из оÑновных Ñкриптов инициализации " ++"(например \"network\"), ваше уÑтройÑтво может оказатьÑÑ Ð½ÐµÐ´Ð¾Ñтупным!" ++ ++msgid "" ++"You must enable Java Script in your browser or LuCI will not work properly." ++msgstr "" ++"Вам необходимо включить Java Script в вашем браузере Ð´Ð»Ñ ÐºÐ¾Ñ€Ñ€ÐµÐºÑ‚Ð½Ð¾Ð¹ работы " ++"LuCI." ++ ++msgid "" ++"Your Internet Explorer is too old to display this page correctly. Please " ++"upgrade it to at least version 7 or use another browser like Firefox, Opera " ++"or Safari." ++msgstr "" ++ ++msgid "any" ++msgstr "любой" ++ ++msgid "auto" ++msgstr "авто" ++ ++#, fuzzy ++msgid "automatic" ++msgstr "ÑтатичеÑкий" ++ ++msgid "baseT" ++msgstr "baseT" ++ ++msgid "bridged" ++msgstr "Ñоед. моÑтом" ++ ++msgid "create:" ++msgstr "Ñоздать:" ++ ++msgid "creates a bridge over specified interface(s)" ++msgstr "Ñоздаёт моÑÑ‚ Ð´Ð»Ñ Ð²Ñ‹Ð±Ñ€Ð°Ð½Ð½Ñ‹Ñ… Ñетевых интерфейÑов" ++ ++msgid "dB" ++msgstr "дБ" ++ ++msgid "dBm" ++msgstr "дБм" ++ ++msgid "disable" ++msgstr "выключено" ++ ++msgid "disabled" ++msgstr "" ++ ++msgid "expired" ++msgstr "иÑтекло" ++ ++# убил бы ++msgid "" ++"file where given DHCP-leases will be stored" ++msgstr "" ++"файл, где хранÑÑ‚ÑÑ Ð°Ñ€ÐµÐ½Ð´Ð¾Ð²Ð°Ð½Ð½Ñ‹Ðµ DHCP-адреÑа" ++ ++msgid "forward" ++msgstr "перенаправить" ++ ++msgid "full-duplex" ++msgstr "полный дуплекÑ" ++ ++msgid "half-duplex" ++msgstr "полудуплекÑ" ++ ++msgid "help" ++msgstr "помощь" ++ ++msgid "hidden" ++msgstr "Ñкрытый" ++ ++msgid "hybrid mode" ++msgstr "" ++ ++msgid "if target is a network" ++msgstr "еÑли Ñеть" ++ ++msgid "input" ++msgstr "ввод" ++ ++msgid "kB" ++msgstr "кБ" ++ ++msgid "kB/s" ++msgstr "кБ/Ñ" ++ ++msgid "kbit/s" ++msgstr "кбит/Ñ" ++ ++msgid "local DNS file" ++msgstr "локальный DNS-файл" ++ ++msgid "minimum 1280, maximum 1480" ++msgstr "" ++ ++msgid "navigation Navigation" ++msgstr "" ++ ++msgid "no" ++msgstr "нет" ++ ++msgid "no link" ++msgstr "нет ÑоединениÑ" ++ ++msgid "none" ++msgstr "ничего" ++ ++msgid "not present" ++msgstr "" ++ ++msgid "off" ++msgstr "выключено" ++ ++msgid "on" ++msgstr "включено" ++ ++msgid "open" ++msgstr "открытаÑ" ++ ++msgid "overlay" ++msgstr "" ++ ++msgid "relay mode" ++msgstr "" ++ ++msgid "routed" ++msgstr "маршрутизируемый" ++ ++msgid "server mode" ++msgstr "" ++ ++msgid "skiplink1 Skip to navigation" ++msgstr "" ++ ++msgid "skiplink2 Skip to content" ++msgstr "" ++ ++msgid "stateful-only" ++msgstr "" ++ ++msgid "stateless" ++msgstr "" ++ ++msgid "stateless + stateful" ++msgstr "" ++ ++msgid "tagged" ++msgstr "Ñ Ñ‚ÐµÐ³Ð¾Ð¼" ++ ++msgid "unknown" ++msgstr "неизвеÑтный" ++ ++msgid "unlimited" ++msgstr "неограниченный" ++ ++msgid "unspecified" ++msgstr "не определено" ++ ++msgid "unspecified -or- create:" ++msgstr "не определено -или- Ñоздать:" ++ ++msgid "untagged" ++msgstr "без тега" ++ ++msgid "yes" ++msgstr "да" ++ ++msgid "« Back" ++msgstr "« Ðазад" ++ ++#~ msgid "" ++#~ "Always use 40MHz channels even if the secondary channel overlaps. Using " ++#~ "this option does not comply with IEEE 802.11n-2009!" ++#~ msgstr "" ++#~ "Ð’Ñегда иÑпользовать ширину каналов 40 МГц, даже еÑли каналы " ++#~ "перекрываютÑÑ. ИÑпользование Ñтой опции не ÑовмеÑтимо Ñо Ñтандартом IEEE " ++#~ "802.11n-2009!" ++ ++#~ msgid "Cached" ++#~ msgstr "КÑшировано" ++ ++#~ msgid "Configures this mount as overlay storage for block-extroot" ++#~ msgstr "" ++#~ "ИÑпользовать Ñту точку Ð¼Ð¾Ð½Ñ‚Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ð² качеÑтве overlay-хранилища Ð´Ð»Ñ " ++#~ "block-extroot" ++ ++#~ msgid "Force 40MHz mode" ++#~ msgstr "Принудительно уÑтановить режим 40 МГц ширины канала" ++ ++#~ msgid "Frequency Hopping" ++#~ msgstr "Ð¡ÐºÐ°Ñ‡ÐºÐ¾Ð¾Ð±Ñ€Ð°Ð·Ð½Ð°Ñ Ð¿ÐµÑ€ÐµÑтройка чаÑтоты" ++ ++#~ msgid "Locked to channel %d used by %s" ++#~ msgstr "ПривÑзка к каналу %d, иÑпользуемому %s" ++ ++#~ msgid "Use as root filesystem" ++#~ msgstr "ИÑпользовать в качеÑтве корневой файловой ÑиÑтемы" ++ ++#~ msgid "HE.net user ID" ++#~ msgstr "Идентификатор Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ HE.net" ++ ++#~ msgid "This is the 32 byte hex encoded user ID, not the login name" ++#~ msgstr "" ++#~ "Это 32-байтный шеÑтнадцатиричный идентификатор пользователÑ, не Ð¸Ð¼Ñ Ð²Ñ…Ð¾Ð´Ð°" ++ ++#~ msgid "40MHz 2nd channel above" ++#~ msgstr "Второй 40МГц канал Ñверху" ++ ++#~ msgid "40MHz 2nd channel below" ++#~ msgstr "Второй 40МГц канал Ñнизу" ++ ++#~ msgid "Accept router advertisements" ++#~ msgstr "Принимать Ð¸Ð·Ð²ÐµÑ‰ÐµÐ½Ð¸Ñ Ð¼Ð°Ñ€ÑˆÑ€ÑƒÑ‚Ð¸Ð·Ð°Ñ‚Ð¾Ñ€Ð°" ++ ++#~ msgid "Advertise IPv6 on network" ++#~ msgstr "Извещать об IPv6 в Ñети" ++ ++#~ msgid "Advertised network ID" ++#~ msgstr "Идентификатор Ñети" ++ ++#~ msgid "Allowed range is 1 to 65535" ++#~ msgstr "ДопуÑтимый диапазон от 1 до 65535" ++ ++#~ msgid "HT capabilities" ++#~ msgstr "ВозможноÑти HT" ++ ++#~ msgid "HT mode" ++#~ msgstr "Режим HT" ++ ++#~ msgid "Router Model" ++#~ msgstr "Модель маршрутизатора" ++ ++#~ msgid "Router Name" ++#~ msgstr "Ðазвание маршрутизатора" ++ ++#~ msgid "Send router solicitations" ++#~ msgstr "ОтправлÑÑ‚ÑŒ Ð¸Ð·Ð²ÐµÑ‰ÐµÐ½Ð¸Ñ Ð¼Ð°Ñ€ÑˆÑ€ÑƒÑ‚Ð¸Ð·Ð°Ñ‚Ð¾Ñ€Ð°" ++ ++#~ msgid "Specifies the advertised preferred prefix lifetime in seconds" ++#~ msgstr "ÐнонÑируемое предпочитаемое Ð²Ñ€ÐµÐ¼Ñ Ð¶Ð¸Ð·Ð½Ð¸ префикÑа (Ñек.)" ++ ++#~ msgid "Specifies the advertised valid prefix lifetime in seconds" ++#~ msgstr "ÐнонÑируемое дейÑтвительное Ð²Ñ€ÐµÐ¼Ñ Ð¶Ð¸Ð·Ð½Ð¸ префикÑа (Ñек.)" ++ ++#~ msgid "Use preferred lifetime" ++#~ msgstr "ИÑпользовать предпочитаемое Ð²Ñ€ÐµÐ¼Ñ Ð¶Ð¸Ð·Ð½Ð¸" ++ ++#~ msgid "Use valid lifetime" ++#~ msgstr "ИÑпользовать дейÑтвительное Ð²Ñ€ÐµÐ¼Ñ Ð¶Ð¸Ð·Ð½Ð¸" ++ ++#~ msgid "Waiting for router..." ++#~ msgstr "Ожидание маршрутизатора..." ++ ++#~ msgid "Enable builtin NTP server" ++#~ msgstr "Включить вÑтроенный NTP-Ñервер" ++ ++#~ msgid "Active Leases" ++#~ msgstr "Ðктивные аренды" ++ ++#~ msgid "Open" ++#~ msgstr "Открыть" ++ ++#~ msgid "KB" ++#~ msgstr "KB" ++ ++#~ msgid "Bit Rate" ++#~ msgstr "СкороÑÑ‚ÑŒ передачи в битах" ++ ++#~ msgid "Configuration / Apply" ++#~ msgstr "ÐšÐ¾Ð½Ñ„Ð¸Ð³ÑƒÑ€Ð°Ñ†Ð¸Ñ / Применить" ++ ++#~ msgid "Configuration / Changes" ++#~ msgstr "ÐšÐ¾Ð½Ñ„Ð¸Ð³ÑƒÑ€Ð°Ñ†Ð¸Ñ / ИзменениÑ" ++ ++#~ msgid "Configuration / Revert" ++#~ msgstr "ÐšÐ¾Ð½Ñ„Ð¸Ð³ÑƒÑ€Ð°Ñ†Ð¸Ñ / Обратить изменениÑ" ++ ++#~ msgid "MAC" ++#~ msgstr "MAC" ++ ++#~ msgid "MAC Address" ++#~ msgstr "MAC ÐдреÑ" ++ ++#~ msgid "Encr." ++#~ msgstr "Шифрование" ++ ++#~ msgid "WLAN-Scan" ++#~ msgstr "" ++#~ "WLAN-Сканирование" ++ ++#~ msgid "" ++#~ "Choose the network you want to attach to this wireless interface. Select " ++#~ "unspecified to not attach any network or fill out the " ++#~ "create field to define a new network." ++#~ msgstr "" ++#~ "Укажите Ñеть, которую вы хотите прикрепить к Ñтому беÑпроводному " ++#~ "интерфейÑу. Выберите не определено чтобы не прикреплÑÑ‚ÑŒ Ñеть или " ++#~ "заполните поле Ñоздать чтобы определить новую Ñеть." ++ ++#~ msgid "Create Network" ++#~ msgstr "Создать Ñеть" ++ ++#~ msgid "Link" ++#~ msgstr "Соединение" ++ ++#~ msgid "Networks" ++#~ msgstr "Сети" ++ ++#~ msgid "Power" ++#~ msgstr "МощноÑÑ‚ÑŒ" ++ ++#~ msgid "Wifi networks in your local environment" ++#~ msgstr "Обзор ÑущеÑтвующих Wi-Fi Ñетей" ++ ++#~ msgid "" ++#~ "CIDR-Notation: " ++#~ "address/prefix" ++#~ msgstr "" ++#~ "CIDR-Обозначение: адреÑ/" ++#~ "префикÑ" ++ ++#~ msgid "DNS-Server" ++#~ msgstr "DNS-Сервер" ++ ++#~ msgid "IPv4-Broadcast" ++#~ msgstr "" ++#~ "IPv4-Широковещательный" ++ ++#~ msgid "IPv6-Address" ++#~ msgstr "IPv6-ÐдреÑ" ++ ++#~ msgid "IP-Aliases" ++#~ msgstr "IP пÑевдонимы" ++ ++#~ msgid "IPv6 Setup" ++#~ msgstr "УÑтановки IPv6" ++ ++#~ msgid "" ++#~ "Note: If you choose an interface here which is part of another network, " ++#~ "it will be moved into this network." ++#~ msgstr "" ++#~ "Заметка: ЕÑли здеÑÑŒ вы выберете интерфейÑ, который ÑвлÑетÑÑ Ñ‡Ð°Ñтью другой " ++#~ "Ñети, то он будет перемещен в Ñту Ñеть." ++ ++#~ msgid "" ++#~ "Really delete this interface? The deletion cannot be undone!\\nYou might " ++#~ "lose access to this router if you are connected via this interface." ++#~ msgstr "" ++#~ "Ð’Ñ‹ дейÑтвительно хотите удалить Ñтот интерфейÑ? Удаление невозможно " ++#~ "отменить!\\nÐ’Ñ‹ можете потерÑÑ‚ÑŒ доÑтуп к Ñтому маршрутизатору, еÑли ваш " ++#~ "компьютер подключен через Ñтот интерфейÑ." ++ ++#~ msgid "" ++#~ "Really delete this wireless network? The deletion cannot be undone!\\nYou " ++#~ "might lose access to this router if you are connected via this network." ++#~ msgstr "" ++#~ "Ð’Ñ‹ дейÑтвительно хотите удалить Ñту беÑпроводную Ñеть? Удаление " ++#~ "невозможно отменить!\\nÐ’Ñ‹ можете потерÑÑ‚ÑŒ доÑтуп к Ñтому маршрутизатору, " ++#~ "еÑли ваш компьютер подключен через Ñтот интерфейÑ." ++ ++#~ msgid "" ++#~ "Really shutdown interface \"%s\" ?\\nYou might lose access to this router " ++#~ "if you are connected via this interface." ++#~ msgstr "" ++#~ "Ð’Ñ‹ дейÑтвительно хотите выключить Ð¸Ð½Ñ‚ÐµÑ€Ñ„ÐµÐ¹Ñ \"%s\" ?\\nÐ’Ñ‹ можете потерÑÑ‚ÑŒ " ++#~ "доÑтуп к Ñтому маршрутизатору, еÑли ваш компьютер подключен через Ñтот " ++#~ "интерфейÑ." ++ ++#~ msgid "" ++#~ "Really shutdown network ?\\nYou might lose access to this router if you " ++#~ "are connected via this interface." ++#~ msgstr "" ++#~ "Ð’Ñ‹ дейÑтвительно хотите выключить Ñеть?\\nÐ’Ñ‹ можете поторÑÑ‚ÑŒ ÑÐ¾ÐµÐ´Ð¸Ð½ÐµÐ½Ð¸Ñ Ñ " ++#~ "данным маршрутизатором при иÑпользовании Ñтого интерфейÑа." ++ ++#~ msgid "" ++#~ "The network ports on your router can be combined to several VLANs in which computers can " ++#~ "communicate directly with each other. VLANs are often used to separate different network " ++#~ "segments. Often there is by default one Uplink port for a connection to " ++#~ "the next greater network like the internet and other ports for a local " ++#~ "network." ++#~ msgstr "" ++#~ "Сетевые порты на вашем маршрутизаторе могут быть объединены в неÑколько " ++#~ "VLAN ов, в которых " ++#~ "компьютеры могут напрÑмую общатьÑÑ Ð´Ñ€ÑƒÐ³ Ñ Ð´Ñ€ÑƒÐ³Ð¾Ð¼. VLAN Ñ‹ чаÑто иÑпользуютÑÑ Ð´Ð»Ñ " ++#~ "Ñ€Ð°Ð·Ð´ÐµÐ»ÐµÐ½Ð¸Ñ Ñети на разные Ñегменты. Обычно один иÑходÑщий порт " ++#~ "иÑпользуетÑÑ Ð´Ð»Ñ ÑÐ¾ÐµÐ´Ð¸Ð½ÐµÐ½Ð¸Ñ Ñ Ð´Ñ€ÑƒÐ³Ð¾Ð¹ Ñетью, такой например, как интернет, " ++#~ "а оÑтальные порты иÑпользуютÑÑ Ð´Ð»Ñ Ð»Ð¾ÐºÐ°Ð»ÑŒÐ½Ð¾Ð¹ Ñети." ++ ++#~ msgid "Enable buffering" ++#~ msgstr "Включить буферизацию" ++ ++#~ msgid "IPv6-over-IPv4" ++#~ msgstr "IPv6 через IPv4" ++ ++#~ msgid "Custom Files" ++#~ msgstr "ПользовательÑкие файлы" ++ ++#~ msgid "Custom files" ++#~ msgstr "ПользовательÑкие файлы" ++ ++#~ msgid "Detected Files" ++#~ msgstr "Ðайденные файлы" ++ ++#~ msgid "Detected files" ++#~ msgstr "Ðайденные файлы" ++ ++#~ msgid "Files to be kept when flashing a new firmware" ++#~ msgstr "Файлы которые необходимо Ñохранить при обновлении прошивки" ++ ++#~ msgid "General" ++#~ msgstr "ОÑновные" ++ ++#~ msgid "" ++#~ "Here you can customize the settings and the functionality of LuCI." ++#~ msgstr "" ++#~ "ЗдеÑÑŒ вы можете изменить наÑтройки и функциональноÑÑ‚ÑŒ LuCI." ++ ++#~ msgid "Post-commit actions" ++#~ msgstr "ЗапуÑк команд" ++ ++#~ msgid "" ++#~ "The following files are detected by the system and will be kept " ++#~ "automatically during sysupgrade" ++#~ msgstr "" ++#~ "Эти файлы были найдены ÑиÑтемой и будут автоматичеÑки Ñохранены во Ð²Ñ€ÐµÐ¼Ñ " ++#~ "Ð¾Ð±Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ Ð¿Ñ€Ð¾ÑˆÐ¸Ð²ÐºÐ¸" ++ ++#~ msgid "" ++#~ "These commands will be executed automatically when a given UCI configuration is committed " ++#~ "allowing changes to be applied instantly." ++#~ msgstr "" ++#~ "Эти команды будут запущенны автоматичеÑки когда Ð´Ð°Ð½Ð½Ð°Ñ UCI ÐºÐ¾Ð½Ñ„Ð¸Ð³ÑƒÑ€Ð°Ñ†Ð¸Ñ Ð´Ð¾Ð±Ð°Ð²Ð»ÐµÐ½Ð° и " ++#~ "Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð±ÑƒÐ´ÑƒÑ‚ принÑÑ‚Ñ‹." ++ ++#~ msgid "" ++#~ "This is a list of shell glob patterns for matching files and directories " ++#~ "to include during sysupgrade" ++#~ msgstr "" ++#~ "Это ÑпиÑок дополнительных файлов и директорий (допуÑтимо иÑпользование " ++#~ "регулÑрных выражений) которые будут Ñохранены во Ð²Ñ€ÐµÐ¼Ñ Ð¾Ð±Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ Ð¿Ñ€Ð¾ÑˆÐ¸Ð²ÐºÐ¸" ++ ++#~ msgid "Web UI" ++#~ msgstr "Web UI" ++ ++#~ msgid "PPTP-Server" ++#~ msgstr "" ++#~ "PPTP-Сервер" ++ ++#~ msgid "AHCP Settings" ++#~ msgstr "AHCP ÐаÑтройки" ++ ++#~ msgid "ARP ping retries" ++#~ msgstr "КоличеÑтво ARP попыток" ++ ++#~ msgid "ATM Settings" ++#~ msgstr "ÐаÑтройки ATM" ++ ++#~ msgid "Access point (APN)" ++#~ msgstr "Точка доÑтупа (APN)" ++ ++#~ msgid "Additional pppd options" ++#~ msgstr "Дополнительные наÑтройки pppd" ++ ++#~ msgid "Allowed range is 1 to FFFF" ++#~ msgstr "Разрешен диапазон от 1 до FFFF" ++ ++#~ msgid "Automatic Disconnect" ++#~ msgstr "ÐвтоматичеÑкое разъединение" ++ ++#~ msgid "Backup Archive" ++#~ msgstr "Ð ÐµÐ·ÐµÑ€Ð²Ð½Ð°Ñ ÐºÐ¾Ð¿Ð¸Ñ" ++ ++#~ msgid "" ++#~ "Configure the local DNS server to use the name servers adverticed by the " ++#~ "PPP peer" ++#~ msgstr "" ++#~ "ÐаÑтроить локальный DNS Ñервер таким образом, чтобы он иÑпользовал DNS " ++#~ "Ñерверы полученные от PPP пира" ++ ++#~ msgid "Connect script" ++#~ msgstr "Скрипт подключениÑ" ++ ++#~ msgid "Create backup" ++#~ msgstr "Создать резервную копию" ++ ++#~ msgid "Default" ++#~ msgstr "По умолчанию" ++ ++#~ msgid "Disconnect script" ++#~ msgstr "Скрипт разъединениÑ" ++ ++#~ msgid "Edit package lists and installation targets" ++#~ msgstr "Изменить ÑпиÑок пакетов и путей уÑтановки" ++ ++#~ msgid "Enable 4K VLANs" ++#~ msgstr "Включить 4K VLANÑ‹" ++ ++#~ msgid "Enable IPv6 on PPP link" ++#~ msgstr "Ðктивировать IPv6 в PPP Ñоединении" ++ ++#~ msgid "Firmware image" ++#~ msgstr "Прошивка" ++ ++#~ msgid "Forward DHCP" ++#~ msgstr "ПеренаправлÑÑ‚ÑŒ DHCP" ++ ++#~ msgid "Forward broadcasts" ++#~ msgstr "ПеренаправлÑÑ‚ÑŒ широковещательные ÑообщениÑ" ++ ++#~ msgid "HE.net Tunnel ID" ++#~ msgstr "ID Ð¢ÑƒÐ½Ð½ÐµÐ»Ñ HE.net" ++ ++#~ msgid "" ++#~ "Here you can backup and restore your router configuration and - if " ++#~ "possible - reset the router to the default settings." ++#~ msgstr "" ++#~ "ЗдеÑÑŒ вы можете Ñделать резервную копию и воÑÑтановить конфигурацию " ++#~ "вашего маршрутизатора, еÑли Ñто возможно, или уÑтановить наÑтройки по " ++#~ "умолчанию." ++ ++#~ msgid "Installation targets" ++#~ msgstr "Путь уÑтановки" ++ ++#~ msgid "Keep configuration files" ++#~ msgstr "Сохранить конфигурационные файлы" ++ ++#~ msgid "Keep-Alive" ++#~ msgstr "Keep-Alive" ++ ++#~ msgid "Kernel" ++#~ msgstr "Ядро" ++ ++#~ msgid "" ++#~ "Let pppd replace the current default route to use the PPP interface after " ++#~ "successful connect" ++#~ msgstr "" ++#~ "Позволить pppd поÑле уÑпешного ÑÐ¾ÐµÐ´Ð¸Ð½ÐµÐ½Ð¸Ñ Ð¸Ð·Ð¼ÐµÐ½Ð¸Ñ‚ÑŒ маршрут по умолчанию " ++#~ "Ð´Ð»Ñ Ð¸ÑÐ¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ PPP интерфейÑа" ++ ++#~ msgid "Let pppd run this script after establishing the PPP link" ++#~ msgstr "Позволить pppd запуÑтить Ñкрипт поÑле уÑÑ‚Ð°Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ PPP ÑоединениÑ" ++ ++#~ msgid "Let pppd run this script before tearing down the PPP link" ++#~ msgstr "Позволить pppd запуÑтить Ñкрипт до уÑÑ‚Ð°Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ PPP ÑоединениÑ" ++ ++#~ msgid "" ++#~ "Make sure that you provide the correct pin code here or you might lock " ++#~ "your sim card!" ++#~ msgstr "" ++#~ "УдоÑтоверьтеÑÑŒ, что вы ввели корректный пин код, иначе вы можете " ++#~ "заблокировать вашу Ñим карту!" ++ ++#~ msgid "" ++#~ "Most of them are network servers, that offer a certain service for your " ++#~ "device or network like shell access, serving webpages like LuCI, doing mesh routing, sending " ++#~ "e-mails, ..." ++#~ msgstr "" ++#~ "БольшинÑтво из них Ñетевые Ñерверы, которые выполнÑÑŽÑ‚ определённые задачи " ++#~ "Ð´Ð»Ñ Ð²Ð°ÑˆÐ¸Ñ… уÑтройÑтв или Ñетей наподобие shell-доÑтупа, web-Ñтраниц таких " ++#~ "как LuCI, выполнÑÑŽÑ‚ " ++#~ "mesh-маршрутизацию, отправлÑÑŽÑ‚ пиÑьма , ..." ++ ++#~ msgid "Number of failed connection tests to initiate automatic reconnect" ++#~ msgstr "" ++#~ "КоличеÑтво неудачных Ñоединений Ð´Ð»Ñ Ð¸Ð½Ð¸Ñ†Ð¸Ð°Ð»Ð¸Ð·Ð°Ñ†Ð¸Ð¸ переподÑÐ¾ÐµÐ´Ð¸Ð½ÐµÐ½Ð¸Ñ Ðº " ++#~ "Ñерверу" ++ ++#~ msgid "Override Gateway" ++#~ msgstr "Переопределение шлюза" ++ ++#~ msgid "PIN code" ++#~ msgstr "PIN код" ++ ++#~ msgid "PPP Settings" ++#~ msgstr "ÐаÑтройки PPP" ++ ++#~ msgid "Package lists" ++#~ msgstr "СпиÑок пакетов" ++ ++#~ msgid "Port PVIDs on %q" ++#~ msgstr "PVIDÑ‹ порта на %q" ++ ++#~ msgid "Proceed reverting all settings and resetting to firmware defaults?" ++#~ msgstr "" ++#~ "Перейти к возврашению вÑех наÑтроек и уÑтановить наÑтройки по умолчанию?" ++ ++#~ msgid "Processor" ++#~ msgstr "ПроцеÑÑор" ++ ++#~ msgid "Radius-Port" ++#~ msgstr "Radius-Порт" ++ ++#~ msgid "Radius-Server" ++#~ msgstr "Radius-Сервер" ++ ++#~ msgid "Replace default route" ++#~ msgstr "Заменить маршрут по умолчанию" ++ ++#~ msgid "Reset router to defaults" ++#~ msgstr "СброÑить маршрутизатор к наÑтройкам по умолчанию" ++ ++#~ msgid "Routing table ID" ++#~ msgstr "ID таблицы маршрутизации" ++ ++#~ msgid "" ++#~ "Seconds to wait for the modem to become ready before attempting to connect" ++#~ msgstr "Таймаут в Ñекундах перед попыткой ÑоединениÑ" ++ ++#~ msgid "Server IPv4-Address" ++#~ msgstr "IPv4-ÐÐ´Ñ€ÐµÑ Ñервера" ++ ++#~ msgid "Service type" ++#~ msgstr "Тип Ñлужбы" ++ ++#~ msgid "Services and daemons perform certain tasks on your device." ++#~ msgstr "СервиÑÑ‹ и демоны выполнÑÑŽÑ‚ определённые задачи на вашем уÑтройÑтве." ++ ++#~ msgid "Settings" ++#~ msgstr "ÐаÑтройки" ++ ++#~ msgid "Setup wait time" ++#~ msgstr "УÑтановить Ð²Ñ€ÐµÐ¼Ñ Ð¾Ð¶Ð¸Ð´Ð°Ð½Ð¸Ñ" ++ ++#~ msgid "" ++#~ "Sorry. OpenWrt does not support a system upgrade on this platform.
    " ++#~ "You need to manually flash your device." ++#~ msgstr "" ++#~ "Извините. OpenWrt не поддерживает обновление прошивки на данном " ++#~ "уÑтройÑтве.
    Вам необходимо вручную обновить прошивку." ++ ++#~ msgid "Specify additional command line arguments for pppd here" ++#~ msgstr "Укажите дополнительные аргументы pppd" ++ ++#~ msgid "TTL" ++#~ msgstr "TTL" ++ ++#~ msgid "The device node of your modem, e.g. /dev/ttyUSB0" ++#~ msgstr "Файл уÑтройÑтва вашего модема, например /dev/ttyUSB0" ++ ++#~ msgid "Time (in seconds) after which an unused connection will be closed" ++#~ msgstr "" ++#~ "Ð’Ñ€ÐµÐ¼Ñ (в Ñек.) поÑле которого неиÑпользованное Ñоединение будет закрыто" ++ ++#~ msgid "Time Server (rdate)" ++#~ msgstr "Серверы Ñинхронизации времени (rdate)" ++ ++#~ msgid "Tunnel Settings" ++#~ msgstr "ÐаÑтройки туннелированиÑ" ++ ++#~ msgid "Update package lists" ++#~ msgstr "Обновить ÑпиÑок пакетов" ++ ++#~ msgid "Upload an OpenWrt image file to reflash the device." ++#~ msgstr "Загрузите образ OpenWRT чтобы обновить прошивку уÑтройÑтва." ++ ++#~ msgid "Upload image" ++#~ msgstr "Загрузить образ" ++ ++#~ msgid "Use peer DNS" ++#~ msgstr "ИÑпользовать DNS пиров" ++ ++#~ msgid "VLAN %d" ++#~ msgstr "VLAN %d" ++ ++#~ msgid "" ++#~ "You can specify multiple DNS servers here, press enter to add a new " ++#~ "entry. Servers entered here will override automatically assigned ones." ++#~ msgstr "" ++#~ "Ð’Ñ‹ можете указать неÑколько DNS Ñерверов, нажмите Enter чтобы добавить " ++#~ "новую запиÑÑŒ. Введенные Ñерверы переопределÑÑ‚ адреÑа, назначенные " ++#~ "автоматичеÑки." ++ ++#~ msgid "" ++#~ "You need to install \"comgt\" for UMTS/GPRS, \"ppp-mod-pppoe\" for PPPoE, " ++#~ "\"ppp-mod-pppoa\" for PPPoA or \"pptp\" for PPtP support" ++#~ msgstr "" ++#~ "Вам необходимо уÑтановить \"comgt\" Ð´Ð»Ñ Ð¿Ð¾Ð´Ð´ÐµÑ€Ð¶ÐºÐ¸ UMTS/GPRS, \"ppp-mod-" ++#~ "pppoe\" Ð´Ð»Ñ PPPoE, \"ppp-mod-pppoa\" Ð´Ð»Ñ PPPoA и \"pptp\" Ð´Ð»Ñ PPtP" ++ ++#~ msgid "back" ++#~ msgstr "назад" ++ ++#~ msgid "buffered" ++#~ msgstr "буфферизовано" ++ ++#~ msgid "cached" ++#~ msgstr "кÑшировано" ++ ++#~ msgid "free" ++#~ msgstr "Ñвободно" ++ ++#~ msgid "static" ++#~ msgstr "ÑтатичеÑкий" ++ ++#~ msgid "" ++#~ "LuCI is a collection " ++#~ "of free Lua software including an MVC-Webframework and webinterface for embedded devices. LuCI is licensed under the " ++#~ "Apache-License." ++#~ msgstr "" ++#~ "LuCI Ñто Ñвободное " ++#~ "Lua програмное обеÑпечение Ð²ÐºÐ»ÑŽÑ‡Ð°Ñ MVC-Вебфреймворк и веб Ð¸Ð½Ñ‚ÐµÑ€Ñ„ÐµÐ¹Ñ Ð²Ñтраиваемый в уÑтройÑтва. " ++#~ "LuCI " ++#~ "раÑпроÑтранÑетÑÑ Ð¿Ð¾Ð´ лицензией Apache-License." ++ ++#~ msgid "SSH-Keys" ++#~ msgstr "SSH-Ключи" ++ ++#~ msgid "" ++#~ "A lightweight HTTP/1.1 webserver written in C and Lua designed to serve " ++#~ "LuCI" ++#~ msgstr "" ++#~ "ПроÑтой HTTP/1.1 веб-Ñервер Ð´Ð»Ñ LuCI, реализованный на \"Си\" и \"Lua\"" ++ ++#~ msgid "" ++#~ "A small webserver which can be used to serve LuCI." ++#~ msgstr "" ++#~ "Маленький веб-Ñервер, Ñлужащий Ð´Ð»Ñ Ð¿Ñ€ÐµÐ´Ð¾ÑÑ‚Ð°Ð²Ð»ÐµÐ½Ð¸Ñ LuCI." ++ ++#~ msgid "About" ++#~ msgstr "О программе" ++ ++#~ msgid "Active IP Connections" ++#~ msgstr "Ðктивные IP ÑоединениÑ" ++ ++#~ msgid "Addresses" ++#~ msgstr "ÐдреÑа" ++ ++#~ msgid "Admin Password" ++#~ msgstr "Пароль админиÑтратора" ++ ++#~ msgid "Alias" ++#~ msgstr "ПÑевдоним" ++ ++#~ msgid "Authentication Realm" ++#~ msgstr "ÐÑƒÑ‚ÐµÐ½Ñ‚Ð¸Ñ„Ð¸ÐºÐ°Ñ†Ð¸Ð¾Ð½Ð½Ð°Ñ Ð¾Ð±Ð»Ð°ÑÑ‚ÑŒ" ++ ++#~ msgid "Bridge Port" ++#~ msgstr "Порт моÑта" ++ ++#~ msgid "" ++#~ "Change the password of the system administrator (User root)" ++#~ msgstr "" ++#~ "Изменение Ð¿Ð°Ñ€Ð¾Ð»Ñ ÑиÑтемного админиÑтратора (Пользователь root)" ++ ++#~ msgid "Client + WDS" ++#~ msgstr "Клиент + WDS" ++ ++#~ msgid "Configuration file" ++#~ msgstr "Файл конфигурации" ++ ++#~ msgid "Connection timeout" ++#~ msgstr "Таймаут подключениÑ" ++ ++#~ msgid "Contributing Developers" ++#~ msgstr "Помогавшие в разработке" ++ ++#~ msgid "DHCP assigned" ++#~ msgstr "ПриÑвоенный DHCP" ++ ++#~ msgid "Document root" ++#~ msgstr "ÐšÐ¾Ñ€Ð½ÐµÐ²Ð°Ñ Ð¿Ð°Ð¿ÐºÐ°" ++ ++#~ msgid "Enable Keep-Alive" ++#~ msgstr "Включить Keep-Alive" ++ ++#~ msgid "Enable device" ++#~ msgstr "Включить уÑтройÑтво" ++ ++#~ msgid "Ethernet Bridge" ++#~ msgstr "Ethernet МоÑÑ‚" ++ ++#~ msgid "" ++#~ "Here you can paste public SSH-Keys " ++#~ "(one per line) for SSH public-key " ++#~ "authentication." ++#~ msgstr "" ++#~ "ЗдеÑÑŒ вы можете указать публичный SSH-" ++#~ "Ключ (один на Ñтроку) Ð´Ð»Ñ SSH " ++#~ "публичной-ключевой аутентификации." ++ ++#~ msgid "ID" ++#~ msgstr "ID" ++ ++#~ msgid "IP Configuration" ++#~ msgstr "IP КонфигурациÑ" ++ ++#~ msgid "Interface Status" ++#~ msgstr "Ð¡Ñ‚Ð°Ñ‚ÑƒÑ Ð¸Ð½Ñ‚ÐµÑ€Ñ„ÐµÐ¹Ñа" ++ ++#~ msgid "Lead Development" ++#~ msgstr "Ведущие разработчики" ++ ++#~ msgid "No address configured on this interface." ++#~ msgstr "Ðа Ñтом интерфейÑе не Ñконфигурирован адреÑ." ++ ++#~ msgid "Not configured" ++#~ msgstr "Ðе наÑтроенный" ++ ++#~ msgid "Password successfully changed" ++#~ msgstr "Пароль уÑпешно изменён" ++ ++#~ msgid "Plugin path" ++#~ msgstr "Путь к плагину" ++ ++#~ msgid "Ports" ++#~ msgstr "Порты" ++ ++#~ msgid "Primary" ++#~ msgstr "Первичный" ++ ++#~ msgid "Project Homepage" ++#~ msgstr "ДомашнÑÑ Ñтраница проекта" ++ ++#~ msgid "Pseudo Ad-Hoc" ++#~ msgstr "ПÑевдо Ad-Hoc" ++ ++#~ msgid "STP" ++#~ msgstr "STP" ++ ++#~ msgid "Thanks To" ++#~ msgstr "БлагодарÑ" ++ ++#~ msgid "" ++#~ "The realm which will be displayed at the authentication prompt for " ++#~ "protected pages." ++#~ msgstr "Что будет показано при авторизации на защищённых Ñтраницах." ++ ++#~ msgid "Unknown Error" ++#~ msgstr "ÐеизвеÑÑ‚Ð½Ð°Ñ Ð¾ÑˆÐ¸Ð±ÐºÐ°" ++ ++#~ msgid "VLAN" ++#~ msgstr "VLAN" ++ ++#~ msgid "defaults to /etc/httpd.conf" ++#~ msgstr "по умолчанию /etc/httpd.conf" ++ ++#~ msgid "Enable this switch" ++#~ msgstr "Включить Ñтот Ñетевой коммутатор" ++ ++#~ msgid "OPKG error code %i" ++#~ msgstr "Код ошибки OPKG %i" ++ ++#~ msgid "Package lists updated" ++#~ msgstr "СпиÑок пакетов обновлён" ++ ++#~ msgid "Reset switch during setup" ++#~ msgstr "СброÑить коммутатор во Ð²Ñ€ÐµÐ¼Ñ Ð½Ð°Ñтройки" ++ ++#~ msgid "Upgrade installed packages" ++#~ msgstr "Заменить уÑтановленные пакеты" ++ ++#~ msgid "" ++#~ "Also kernel or service logfiles can be viewed here to get an overview " ++#~ "over their current state." ++#~ msgstr "" ++#~ "Ртак же Ñдра или ÑервиÑов, ÑиÑтемный журнал может быть так же проÑмотрен " ++#~ "здеÑÑŒ Ð´Ð»Ñ Ñ‚Ð¾Ð³Ð¾ что бы получить полный обзор текущего ÑоÑтоÑÐ½Ð¸Ñ ÑиÑтемы." ++ ++#~ msgid "" ++#~ "Here you can find information about the current system status like CPU clock frequency, memory " ++#~ "usage or network interface data." ++#~ msgstr "" ++#~ "ЗдеÑÑŒ вы можете найти информацию о текущей ÑтатиÑтики ÑиÑтемы вроде " ++#~ "чаÑтоты процеÑÑора, иÑÐ¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Ð¿Ð°Ð¼Ñти или Ñетевого интерфейÑа." ++ ++#~ msgid "" ++#~ "LuCI is a free, " ++#~ "flexible, and user friendly graphical interface for configuring OpenWrt " ++#~ "Kamikaze." ++#~ msgstr "" ++#~ "LuCI Ñвободный, " ++#~ "гибкий и дружелюбный графичеÑкий Ð¸Ð½Ñ‚ÐµÑ€Ñ„ÐµÐ¹Ñ Ð´Ð»Ñ Ð½Ð°Ñтройки OpenWrt Kamikaze." ++ ++#~ msgid "And now have fun with your router!" ++#~ msgstr "Ртеперь повеÑелитеÑÑŒ Ñо Ñвоим роутером!" ++ ++#~ msgid "" ++#~ "As we always want to improve this interface we are looking forward to " ++#~ "your feedback and suggestions." ++#~ msgstr "" ++#~ "Так же мы вÑегда желаем улучшить Ñтот интерфейÑ, мы вÑегда обратим " ++#~ "внимание на ваши вопроÑÑ‹ и предложениÑ." ++ ++#~ msgid "Hello!" ++#~ msgstr "Добро пожаловать." ++ ++#~ msgid "" ++#~ "Notice: In LuCI " ++#~ "changes have to be confirmed by clicking Changes - Save & Apply " ++#~ "before being applied." ++#~ msgstr "" ++#~ "Внимание: Ð’ LuCI " ++#~ "Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð¿Ñ€Ð¸Ð½Ð¸Ð¼Ð°ÑŽÑ‚ÑÑ Ð¿Ð¾Ñле Ð½Ð°Ð¶Ð°Ñ‚Ð¸Ñ - ПринÑÑ‚ÑŒ." ++ ++#~ msgid "" ++#~ "On the following pages you can adjust all important settings of your " ++#~ "router." ++#~ msgstr "" ++#~ "С помощью Ñтих Ñтраниц вы можете изменить оÑновные наÑтройки вашего " ++#~ "роутера." ++ ++#~ msgid "The LuCI Team" ++#~ msgstr "Команда LuCI" ++ ++#~ msgid "" ++#~ "This is the administration area of LuCI." ++#~ msgstr "" ++#~ "Это зона ÑƒÐ¿Ñ€Ð°Ð²Ð»ÐµÐ½Ð¸Ñ LuCI." ++ ++#~ msgid "User Interface" ++#~ msgstr "ПользовательÑкий интерфейÑ" ++ ++#~ msgid "enable" ++#~ msgstr "включено" ++ ++#, fuzzy ++#~ msgid "(optional)" ++#~ msgstr " (дополнительно)" ++ ++#~ msgid "DNS-Port" ++#~ msgstr "DNS-Port" ++ ++#~ msgid "" ++#~ "DNS-Server will be queried in " ++#~ "the order of the resolvfile" ++#~ msgstr "" ++#~ "DNS-Сервер будет обращатьÑÑ Ðº " ++#~ "resolvfile" ++ ++#~ msgid "" ++#~ "max. DHCP-Leases" ++#~ msgstr "" ++#~ "max. DHCP-Leases" ++ ++#~ msgid "" ++#~ "max. EDNS0 paket size" ++#~ msgstr "" ++#~ "max. EDNS0 размер пакета" ++ ++#~ msgid "AP-Isolation" ++#~ msgstr "AP-Isolation" ++ ++#~ msgid "Add the Wifi network to physical network" ++#~ msgstr "Добавить Wifi Ñеть в физичеÑкую Ñеть" ++ ++#~ msgid "Aliases" ++#~ msgstr "СÑылка" ++ ++#~ msgid "Clamp Segment Size" ++#~ msgstr "Clamp Segment Size" ++ ++#~ msgid "Devices" ++#~ msgstr "УÑтройÑтва" ++ ++#~ msgid "Don't forward reverse lookups for local networks" ++#~ msgstr "не форвардить реверÑные-Ð´Ð½Ñ Ð·Ð°Ð¿Ñ€Ð¾ÑÑ‹ Ð´Ð»Ñ Ð»Ð¾ÐºÐ°Ð»ÑŒÐ½Ð¾Ð¹ Ñети" ++ ++#~ msgid "Errors" ++#~ msgstr "Ошибок" ++ ++#~ msgid "Essentials" ++#~ msgstr "Essentials" ++ ++#~ msgid "Expand Hosts" ++#~ msgstr "Expand Hosts" ++ ++#~ msgid "First leased address" ++#~ msgstr "Первый арендованный адреÑ" ++ ++#~ msgid "" ++#~ "Fixes problems with unreachable websites, submitting forms or other " ++#~ "unexpected behaviour for some ISPs." ++#~ msgstr "" ++#~ "Fixes problems with unreachable websites, submitting forms or other " ++#~ "unexpected behaviour for some ISPs." ++ ++#~ msgid "Hardware Address" ++#~ msgstr "ÐÐ´Ñ€ÐµÑ ÑƒÑтройÑтва" ++ ++#~ msgid "Here you can configure installed wifi devices." ++#~ msgstr "ЗдеÑÑŒ вы можете наÑтроить уÑтановленные Wi-Fi уÑтройÑтва." ++ ++#~ msgid "Ignore /etc/hosts" ++#~ msgstr "Ignore /etc/hosts" ++ ++#~ msgid "Independent (Ad-Hoc)" ++#~ msgstr "ÐезаыиÑÐ¸Ð¼Ð°Ñ (Ad-Hoc)" ++ ++#~ msgid "Internet Connection" ++#~ msgstr "Интернет Ñоединение" ++ ++#~ msgid "Join (Client)" ++#~ msgstr "ПриÑоединитьÑÑ (Client)" ++ ++#~ msgid "Leases" ++#~ msgstr "Leases" ++ ++#~ msgid "Local Domain" ++#~ msgstr "Локальный домен" ++ ++#~ msgid "Local Network" ++#~ msgstr "Ð›Ð¾ÐºÐ°Ð»ÑŒÐ½Ð°Ñ Ñеть" ++ ++#~ msgid "Local Server" ++#~ msgstr "Локальный Ñервер" ++ ++#, fuzzy ++#~ msgid "Network Boot Image" ++#~ msgstr "DNS-Port" ++ ++#~ msgid "" ++#~ "Network Name (ESSID)" ++#~ msgstr "" ++#~ "Ðазвание Ñети (ESSID)" ++ ++#~ msgid "Number of leased addresses" ++#~ msgstr "КоличеÑтво арендованных адреÑов" ++ ++#~ msgid "Perform Actions" ++#~ msgstr "ПринÑÑ‚ÑŒ изменениÑ" ++ ++#~ msgid "Prevents Client to Client communication" ++#~ msgstr "Ðе позволÑет клиентам обмениватьÑÑ Ð´Ñ€ÑƒÐ³ Ñ Ð´Ñ€ÑƒÐ³Ð¾Ð¼ информацией" ++ ++#~ msgid "Provide (Access Point)" ++#~ msgstr "ОбеÑпечивает (AP)" ++ ++#~ msgid "Resolvfile" ++#~ msgstr "Resolvfile" ++ ++#, fuzzy ++#~ msgid "TFTP-Server Root" ++#~ msgstr "DNS-Port" ++ ++#~ msgid "TX / RX" ++#~ msgstr "Перед. / Получ." ++ ++#~ msgid "The following changes have been applied" ++#~ msgstr "Данные Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð±Ñ‹Ð»Ð¸ принÑÑ‚Ñ‹" ++ ++#~ msgid "" ++#~ "When flashing a new firmware with LuCI these files will be added to the new firmware " ++#~ "installation." ++#~ msgstr "" ++#~ "ПоÑле перепрошивки LuCI Ñти файлы будут добавлены в обновлённую ÑиÑтему ." ++ ++#~ msgid "" ++#~ "With DHCP " ++#~ "network members can automatically receive their network settings (IP-address, netmask, DNS-server, ...)." ++#~ msgstr "" ++#~ "С помощью DHCP члены Ñетей могут автоматичеÑки получить такие наÑтройки как (IP-ÐдреÑ, Ñетевую маÑку, DNS-имÑ, ...)." ++ ++#~ msgid "" ++#~ "You can run several wifi networks with one device. Be aware that there " ++#~ "are certain hardware and driverspecific restrictions. Normally you can " ++#~ "operate 1 Ad-Hoc or up to 3 Master-Mode and 1 Client-Mode network " ++#~ "simultaneously." ++#~ msgstr "" ++#~ "Ð’Ñ‹ можете наÑтраивать различные wifi Ñети на одном уÑтройÑтве. Помните " ++#~ "что еÑÑ‚ÑŒ определённые програмные и аппаратные ограничениÑ. Ðормально вы " ++#~ "можете иÑпользовать например 1 Ad-Hoc или до 3 Точек и Ñимулированных 1 " ++#~ "Клиента." ++ ++#, fuzzy ++#~ msgid "" ++#~ "You need to install \"ppp-mod-pppoe\" for PPPoE or \"pptp\" for PPtP " ++#~ "support" ++#~ msgstr "Ошибок" ++ ++#~ msgid "additional hostfile" ++#~ msgstr "дополнительный hostfile" ++ ++#~ msgid "adds domain names to hostentries in the resolv file" ++#~ msgstr "ДобавлÑÑ‚ÑŒ доменные имена в хоÑÑ‚Ñ‹" ++ ++#~ msgid "automatically reconnect" ++#~ msgstr "автоматичеÑки переподÑоединÑÑ‚ÑÑ" ++ ++#~ msgid "concurrent queries" ++#~ msgstr "concurrent queries" ++ ++#~ msgid "" ++#~ "disable DHCP " ++#~ "for this interface" ++#~ msgstr "" ++#~ "отключить DHCP Ð´Ð»Ñ Ð´Ð°Ð½Ð½Ð¾Ð³Ð¾ интерфейÑа" ++ ++#~ msgid "disconnect when idle for" ++#~ msgstr "отÑоединитьÑÑ ÐºÐ¾Ð³Ð´Ð° проÑтой длÑ" ++ ++#~ msgid "don't cache unknown" ++#~ msgstr "Don't cache unknown" ++ ++#~ msgid "" ++#~ "filter useless DNS-queries of " ++#~ "Windows-systems" ++#~ msgstr "" ++#~ "фильтровать ненужные DNS-" ++#~ "запроÑÑ‹ Windows-ÑиÑтем" ++ ++#~ msgid "installed" ++#~ msgstr "уÑтановленные" ++ ++#~ msgid "localises the hostname depending on its subnet" ++#~ msgstr "локализировать Ð¸Ð¼Ñ Ñ…Ð¾Ñта отноÑÑщегоÑÑ Ðº данной подÑети" ++ ++#~ msgid "not installed" ++#~ msgstr "не уÑтановленно" ++ ++#~ msgid "" ++#~ "prevents caching of negative DNS-replies" ++#~ msgstr "" ++#~ "Запрещать кешировать негативные DNS-ответы" ++ ++#~ msgid "query port" ++#~ msgstr "порт запроÑов" ++ ++#~ msgid "transmitted / received" ++#~ msgstr "передано / получено" ++ ++#, fuzzy ++#~ msgid "Join network" ++#~ msgstr "Ð›Ð¾ÐºÐ°Ð»ÑŒÐ½Ð°Ñ Ñеть" ++ ++#~ msgid "all" ++#~ msgstr "Ð’Ñе" ++ ++#~ msgid "Code" ++#~ msgstr "Код" ++ ++#~ msgid "Distance" ++#~ msgstr "РаÑÑтоÑние" ++ ++#~ msgid "Legend" ++#~ msgstr "ÐадпиÑÑŒ" ++ ++#~ msgid "Library" ++#~ msgstr "Библиотека" ++ ++#~ msgid "see '%s' manpage" ++#~ msgstr "Ñмотрите '%s' руководÑтво" ++ ++#~ msgid "Package Manager" ++#~ msgstr "Менеджер пакетов" ++ ++#~ msgid "Service" ++#~ msgstr "СервиÑ" ++ ++#~ msgid "Statistics" ++#~ msgstr "СтатиÑтика" ++ ++#~ msgid "zone" ++#~ msgstr "Зона" +diff --git a/feeds/luci/modules/luci-base/po/sk/base.po b/feeds/luci/modules/luci-base/po/sk/base.po +new file mode 100644 +index 0000000..d943ccb +--- /dev/null ++++ b/feeds/luci/modules/luci-base/po/sk/base.po +@@ -0,0 +1,3048 @@ ++msgid "" ++msgstr "" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Last-Translator: Automatically generated\n" ++"Language-Team: none\n" ++"MIME-Version: 1.0\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n" ++ ++msgid "(%d minute window, %d second interval)" ++msgstr "" ++ ++msgid "(%s available)" ++msgstr "" ++ ++msgid "(empty)" ++msgstr "" ++ ++msgid "(no interfaces attached)" ++msgstr "" ++ ++msgid "-- Additional Field --" ++msgstr "" ++ ++msgid "-- Please choose --" ++msgstr "" ++ ++msgid "-- custom --" ++msgstr "" ++ ++msgid "-- match by device --" ++msgstr "" ++ ++msgid "-- match by label --" ++msgstr "" ++ ++msgid "1 Minute Load:" ++msgstr "" ++ ++msgid "15 Minute Load:" ++msgstr "" ++ ++msgid "5 Minute Load:" ++msgstr "" ++ ++msgid "BSSID" ++msgstr "" ++ ++msgid "DNS query port" ++msgstr "" ++ ++msgid "DNS server port" ++msgstr "" ++ ++msgid "" ++"DNS servers will be queried in the " ++"order of the resolvfile" ++msgstr "" ++ ++msgid "ESSID" ++msgstr "" ++ ++msgid "IPv4-Address" ++msgstr "" ++ ++msgid "IPv4-Gateway" ++msgstr "" ++ ++msgid "IPv4-Netmask" ++msgstr "" ++ ++msgid "" ++"IPv6-Address or Network " ++"(CIDR)" ++msgstr "" ++ ++msgid "IPv6-Gateway" ++msgstr "" ++ ++msgid "IPv6-Suffix (hex)" ++msgstr "" ++ ++msgid "LED Configuration" ++msgstr "" ++ ++msgid "LED Name" ++msgstr "" ++ ++msgid "MAC-Address" ++msgstr "" ++ ++msgid "" ++"Max. DHCP leases" ++msgstr "" ++ ++msgid "" ++"Max. EDNS0 packet size" ++msgstr "" ++ ++msgid "Max. concurrent queries" ++msgstr "" ++ ++msgid "%s - %s" ++msgstr "" ++ ++msgid "ADSL" ++msgstr "" ++ ++msgid "ADSL Status" ++msgstr "" ++ ++msgid "AICCU (SIXXS)" ++msgstr "" ++ ++msgid "APN" ++msgstr "" ++ ++msgid "AR Support" ++msgstr "" ++ ++msgid "ARP retry threshold" ++msgstr "" ++ ++msgid "ATM Bridges" ++msgstr "" ++ ++msgid "ATM Virtual Channel Identifier (VCI)" ++msgstr "" ++ ++msgid "ATM Virtual Path Identifier (VPI)" ++msgstr "" ++ ++msgid "" ++"ATM bridges expose encapsulated ethernet in AAL5 connections as virtual " ++"Linux network interfaces which can be used in conjunction with DHCP or PPP " ++"to dial into the provider network." ++msgstr "" ++ ++msgid "ATM device number" ++msgstr "" ++ ++msgid "AYIYA" ++msgstr "" ++ ++msgid "Access Concentrator" ++msgstr "" ++ ++msgid "Access Point" ++msgstr "" ++ ++msgid "Action" ++msgstr "" ++ ++msgid "Actions" ++msgstr "" ++ ++msgid "Activate this network" ++msgstr "" ++ ++msgid "Active IPv4-Routes" ++msgstr "" ++ ++msgid "Active IPv6-Routes" ++msgstr "" ++ ++msgid "Active Connections" ++msgstr "" ++ ++msgid "Active DHCP Leases" ++msgstr "" ++ ++msgid "Active DHCPv6 Leases" ++msgstr "" ++ ++msgid "Ad-Hoc" ++msgstr "" ++ ++msgid "Add" ++msgstr "" ++ ++msgid "Add local domain suffix to names served from hosts files" ++msgstr "" ++ ++msgid "Add new interface..." ++msgstr "" ++ ++msgid "Additional Hosts files" ++msgstr "" ++ ++msgid "Address" ++msgstr "" ++ ++msgid "Address to access local relay bridge" ++msgstr "" ++ ++msgid "Administration" ++msgstr "" ++ ++msgid "Advanced Settings" ++msgstr "" ++ ++msgid "Alert" ++msgstr "" ++ ++msgid "Allow SSH password authentication" ++msgstr "" ++ ++msgid "Allow all except listed" ++msgstr "" ++ ++msgid "Allow listed only" ++msgstr "" ++ ++msgid "Allow localhost" ++msgstr "" ++ ++msgid "Allow remote hosts to connect to local SSH forwarded ports" ++msgstr "" ++ ++msgid "Allow root logins with password" ++msgstr "" ++ ++msgid "Allow the root user to login with password" ++msgstr "" ++ ++msgid "" ++"Allow upstream responses in the 127.0.0.0/8 range, e.g. for RBL services" ++msgstr "" ++ ++msgid "" ++"Also see Tunneling Comparison on SIXXS" ++msgstr "" ++ ++msgid "Always announce default router" ++msgstr "" ++ ++msgid "An additional network will be created if you leave this unchecked." ++msgstr "" ++ ++msgid "Announce as default router even if no public prefix is available." ++msgstr "" ++ ++msgid "Announced DNS domains" ++msgstr "" ++ ++msgid "Announced DNS servers" ++msgstr "" ++ ++msgid "Antenna 1" ++msgstr "" ++ ++msgid "Antenna 2" ++msgstr "" ++ ++msgid "Antenna Configuration" ++msgstr "" ++ ++msgid "Any zone" ++msgstr "" ++ ++msgid "Apply" ++msgstr "" ++ ++msgid "Applying changes" ++msgstr "" ++ ++msgid "" ++"Assign a part of given length of every public IPv6-prefix to this interface" ++msgstr "" ++ ++msgid "Assign interfaces..." ++msgstr "" ++ ++msgid "" ++"Assign prefix parts using this hexadecimal subprefix ID for this interface." ++msgstr "" ++ ++msgid "Associated Stations" ++msgstr "" ++ ++msgid "Atheros 802.11%s Wireless Controller" ++msgstr "" ++ ++msgid "AuthGroup" ++msgstr "" ++ ++msgid "Authentication" ++msgstr "" ++ ++msgid "Authoritative" ++msgstr "" ++ ++msgid "Authorization Required" ++msgstr "" ++ ++msgid "Auto Refresh" ++msgstr "" ++ ++msgid "Automatic" ++msgstr "" ++ ++msgid "Automatic Homenet (HNCP)" ++msgstr "" ++ ++msgid "Available" ++msgstr "" ++ ++msgid "Available packages" ++msgstr "" ++ ++msgid "Average:" ++msgstr "" ++ ++msgid "BSSID" ++msgstr "" ++ ++msgid "Back" ++msgstr "" ++ ++msgid "Back to Overview" ++msgstr "" ++ ++msgid "Back to configuration" ++msgstr "" ++ ++msgid "Back to overview" ++msgstr "" ++ ++msgid "Back to scan results" ++msgstr "" ++ ++msgid "Background Scan" ++msgstr "" ++ ++msgid "Backup / Flash Firmware" ++msgstr "" ++ ++msgid "Backup / Restore" ++msgstr "" ++ ++msgid "Backup file list" ++msgstr "" ++ ++msgid "Bad address specified!" ++msgstr "" ++ ++msgid "Band" ++msgstr "" ++ ++msgid "Behind NAT" ++msgstr "" ++ ++msgid "" ++"Below is the determined list of files to backup. It consists of changed " ++"configuration files marked by opkg, essential base files and the user " ++"defined backup patterns." ++msgstr "" ++ ++msgid "Bitrate" ++msgstr "" ++ ++msgid "Bogus NX Domain Override" ++msgstr "" ++ ++msgid "Bridge" ++msgstr "" ++ ++msgid "Bridge interfaces" ++msgstr "" ++ ++msgid "Bridge unit number" ++msgstr "" ++ ++msgid "Bring up on boot" ++msgstr "" ++ ++msgid "Broadcom 802.11%s Wireless Controller" ++msgstr "" ++ ++msgid "Broadcom BCM%04x 802.11 Wireless Controller" ++msgstr "" ++ ++msgid "Buffered" ++msgstr "" ++ ++msgid "Buttons" ++msgstr "" ++ ++msgid "CA certificate; if empty it will be saved after the first connection." ++msgstr "" ++ ++msgid "CPU" ++msgstr "" ++ ++msgid "CPU usage (%)" ++msgstr "" ++ ++msgid "Cancel" ++msgstr "" ++ ++msgid "Category" ++msgstr "" ++ ++msgid "Chain" ++msgstr "" ++ ++msgid "Changes" ++msgstr "" ++ ++msgid "Changes applied." ++msgstr "" ++ ++msgid "Changes the administrator password for accessing the device" ++msgstr "" ++ ++msgid "Channel" ++msgstr "" ++ ++msgid "Check" ++msgstr "" ++ ++msgid "Checksum" ++msgstr "" ++ ++msgid "" ++"Choose the firewall zone you want to assign to this interface. Select " ++"unspecified to remove the interface from the associated zone or " ++"fill out the create field to define a new zone and attach the " ++"interface to it." ++msgstr "" ++ ++msgid "" ++"Choose the network(s) you want to attach to this wireless interface or fill " ++"out the create field to define a new network." ++msgstr "" ++ ++msgid "Cipher" ++msgstr "" ++ ++msgid "" ++"Click \"Generate archive\" to download a tar archive of the current " ++"configuration files. To reset the firmware to its initial state, click " ++"\"Perform reset\" (only possible with squashfs images)." ++msgstr "" ++ ++msgid "Client" ++msgstr "" ++ ++msgid "Client ID to send when requesting DHCP" ++msgstr "" ++ ++msgid "" ++"Close inactive connection after the given amount of seconds, use 0 to " ++"persist connection" ++msgstr "" ++ ++msgid "Close list..." ++msgstr "" ++ ++msgid "Collecting data..." ++msgstr "" ++ ++msgid "Command" ++msgstr "" ++ ++msgid "Common Configuration" ++msgstr "" ++ ++msgid "Compression" ++msgstr "" ++ ++msgid "Configuration" ++msgstr "" ++ ++msgid "Configuration applied." ++msgstr "" ++ ++msgid "Configuration files will be kept." ++msgstr "" ++ ++msgid "Confirmation" ++msgstr "" ++ ++msgid "Connect" ++msgstr "" ++ ++msgid "Connected" ++msgstr "" ++ ++msgid "Connection Limit" ++msgstr "" ++ ++msgid "Connection to server fails when TLS cannot be used" ++msgstr "" ++ ++msgid "Connections" ++msgstr "" ++ ++msgid "Country" ++msgstr "" ++ ++msgid "Country Code" ++msgstr "" ++ ++msgid "Cover the following interface" ++msgstr "" ++ ++msgid "Cover the following interfaces" ++msgstr "" ++ ++msgid "Create / Assign firewall-zone" ++msgstr "" ++ ++msgid "Create Interface" ++msgstr "" ++ ++msgid "Create a bridge over multiple interfaces" ++msgstr "" ++ ++msgid "Critical" ++msgstr "" ++ ++msgid "Cron Log Level" ++msgstr "" ++ ++msgid "Custom Interface" ++msgstr "" ++ ++msgid "Custom delegated IPv6-prefix" ++msgstr "" ++ ++msgid "" ++"Customizes the behaviour of the device LEDs if possible." ++msgstr "" ++ ++msgid "DHCP Leases" ++msgstr "" ++ ++msgid "DHCP Server" ++msgstr "" ++ ++msgid "DHCP and DNS" ++msgstr "" ++ ++msgid "DHCP client" ++msgstr "" ++ ++msgid "DHCP-Options" ++msgstr "" ++ ++msgid "DHCPv6 Leases" ++msgstr "" ++ ++msgid "DHCPv6 client" ++msgstr "" ++ ++msgid "DHCPv6-Mode" ++msgstr "" ++ ++msgid "DHCPv6-Service" ++msgstr "" ++ ++msgid "DNS" ++msgstr "" ++ ++msgid "DNS forwardings" ++msgstr "" ++ ++msgid "DNS-Label / FQDN" ++msgstr "" ++ ++msgid "DS-Lite AFTR address" ++msgstr "" ++ ++msgid "DUID" ++msgstr "" ++ ++msgid "Debug" ++msgstr "" ++ ++msgid "Default %d" ++msgstr "" ++ ++msgid "Default gateway" ++msgstr "" ++ ++msgid "Default route" ++msgstr "" ++ ++msgid "Default state" ++msgstr "" ++ ++msgid "Define a name for this network." ++msgstr "" ++ ++msgid "" ++"Define additional DHCP options, for example " ++"\"6,192.168.2.1,192.168.2.2\" which advertises different DNS " ++"servers to clients." ++msgstr "" ++ ++msgid "Delete" ++msgstr "" ++ ++msgid "Delete this interface" ++msgstr "" ++ ++msgid "Delete this network" ++msgstr "" ++ ++msgid "Description" ++msgstr "" ++ ++msgid "Design" ++msgstr "" ++ ++msgid "Destination" ++msgstr "" ++ ++msgid "Device" ++msgstr "" ++ ++msgid "Device Configuration" ++msgstr "" ++ ++msgid "Diagnostics" ++msgstr "" ++ ++msgid "Dial number" ++msgstr "" ++ ++msgid "Directory" ++msgstr "" ++ ++msgid "Disable" ++msgstr "" ++ ++msgid "" ++"Disable DHCP for " ++"this interface." ++msgstr "" ++ ++msgid "Disable DNS setup" ++msgstr "" ++ ++msgid "Disable HW-Beacon timer" ++msgstr "" ++ ++msgid "Disabled" ++msgstr "" ++ ++msgid "Discard upstream RFC1918 responses" ++msgstr "" ++ ++msgid "Displaying only packages containing" ++msgstr "" ++ ++msgid "Distance Optimization" ++msgstr "" ++ ++msgid "Distance to farthest network member in meters." ++msgstr "" ++ ++msgid "Diversity" ++msgstr "" ++ ++msgid "" ++"Dnsmasq is a combined DHCP-Server and DNS-" ++"Forwarder for NAT " ++"firewalls" ++msgstr "" ++ ++msgid "Do not cache negative replies, e.g. for not existing domains" ++msgstr "" ++ ++msgid "Do not forward requests that cannot be answered by public name servers" ++msgstr "" ++ ++msgid "Do not forward reverse lookups for local networks" ++msgstr "" ++ ++msgid "Do not send probe responses" ++msgstr "" ++ ++msgid "Domain required" ++msgstr "" ++ ++msgid "Domain whitelist" ++msgstr "" ++ ++msgid "" ++"Don't forward DNS-Requests without " ++"DNS-Name" ++msgstr "" ++ ++msgid "Download and install package" ++msgstr "" ++ ++msgid "Download backup" ++msgstr "" ++ ++msgid "Dropbear Instance" ++msgstr "" ++ ++msgid "" ++"Dropbear offers SSH network shell access " ++"and an integrated SCP server" ++msgstr "" ++ ++msgid "Dual-Stack Lite (RFC6333)" ++msgstr "" ++ ++msgid "Dynamic DHCP" ++msgstr "" ++ ++msgid "Dynamic tunnel" ++msgstr "" ++ ++msgid "" ++"Dynamically allocate DHCP addresses for clients. If disabled, only clients " ++"having static leases will be served." ++msgstr "" ++ ++msgid "EAP-Method" ++msgstr "" ++ ++msgid "Edit" ++msgstr "" ++ ++msgid "" ++"Edit the raw configuration data above to fix any error and hit \"Save\" to " ++"reload the page." ++msgstr "" ++ ++msgid "Edit this interface" ++msgstr "" ++ ++msgid "Edit this network" ++msgstr "" ++ ++msgid "Emergency" ++msgstr "" ++ ++msgid "Enable" ++msgstr "" ++ ++msgid "Enable STP" ++msgstr "" ++ ++msgid "Enable HE.net dynamic endpoint update" ++msgstr "" ++ ++msgid "Enable IPv6 negotiation on the PPP link" ++msgstr "" ++ ++msgid "Enable Jumbo Frame passthrough" ++msgstr "" ++ ++msgid "Enable NTP client" ++msgstr "" ++ ++msgid "Enable TFTP server" ++msgstr "" ++ ++msgid "Enable VLAN functionality" ++msgstr "" ++ ++msgid "Enable WPS pushbutton, requires WPA(2)-PSK" ++msgstr "" ++ ++msgid "Enable learning and aging" ++msgstr "" ++ ++msgid "Enable mirroring of incoming packets" ++msgstr "" ++ ++msgid "Enable mirroring of outgoing packets" ++msgstr "" ++ ++msgid "Enable this mount" ++msgstr "" ++ ++msgid "Enable this swap" ++msgstr "" ++ ++msgid "Enable/Disable" ++msgstr "" ++ ++msgid "Enabled" ++msgstr "" ++ ++msgid "Enables the Spanning Tree Protocol on this bridge" ++msgstr "" ++ ++msgid "Encapsulation mode" ++msgstr "" ++ ++msgid "Encryption" ++msgstr "" ++ ++msgid "Erasing..." ++msgstr "" ++ ++msgid "Error" ++msgstr "" ++ ++msgid "Ethernet Adapter" ++msgstr "" ++ ++msgid "Ethernet Switch" ++msgstr "" ++ ++msgid "Expand hosts" ++msgstr "" ++ ++msgid "Expires" ++msgstr "" ++ ++msgid "" ++"Expiry time of leased addresses, minimum is 2 minutes (2m)." ++msgstr "" ++ ++msgid "External" ++msgstr "" ++ ++msgid "External system log server" ++msgstr "" ++ ++msgid "External system log server port" ++msgstr "" ++ ++msgid "Fast Frames" ++msgstr "" ++ ++msgid "File" ++msgstr "" ++ ++msgid "Filename of the boot image advertised to clients" ++msgstr "" ++ ++msgid "Filesystem" ++msgstr "" ++ ++msgid "Filter" ++msgstr "" ++ ++msgid "Filter private" ++msgstr "" ++ ++msgid "Filter useless" ++msgstr "" ++ ++msgid "Find and join network" ++msgstr "" ++ ++msgid "Find package" ++msgstr "" ++ ++msgid "Finish" ++msgstr "" ++ ++msgid "Firewall" ++msgstr "" ++ ++msgid "Firewall Settings" ++msgstr "" ++ ++msgid "Firewall Status" ++msgstr "" ++ ++msgid "Firmware Version" ++msgstr "" ++ ++msgid "Fixed source port for outbound DNS queries" ++msgstr "" ++ ++msgid "Flags" ++msgstr "" ++ ++msgid "Flash Firmware" ++msgstr "" ++ ++msgid "Flash image..." ++msgstr "" ++ ++msgid "Flash new firmware image" ++msgstr "" ++ ++msgid "Flash operations" ++msgstr "" ++ ++msgid "Flashing..." ++msgstr "" ++ ++msgid "Force" ++msgstr "" ++ ++msgid "Force CCMP (AES)" ++msgstr "" ++ ++msgid "Force DHCP on this network even if another server is detected." ++msgstr "" ++ ++msgid "Force TKIP" ++msgstr "" ++ ++msgid "Force TKIP and CCMP (AES)" ++msgstr "" ++ ++msgid "Forward DHCP traffic" ++msgstr "" ++ ++msgid "Forward broadcast traffic" ++msgstr "" ++ ++msgid "Forwarding mode" ++msgstr "" ++ ++msgid "Fragmentation Threshold" ++msgstr "" ++ ++msgid "Frame Bursting" ++msgstr "" ++ ++msgid "Free" ++msgstr "" ++ ++msgid "Free space" ++msgstr "" ++ ++msgid "GHz" ++msgstr "" ++ ++msgid "GPRS only" ++msgstr "" ++ ++msgid "Gateway" ++msgstr "" ++ ++msgid "Gateway ports" ++msgstr "" ++ ++msgid "General Settings" ++msgstr "" ++ ++msgid "General Setup" ++msgstr "" ++ ++msgid "Generate archive" ++msgstr "" ++ ++msgid "Generic 802.11%s Wireless Controller" ++msgstr "" ++ ++msgid "Given password confirmation did not match, password not changed!" ++msgstr "" ++ ++msgid "Global network options" ++msgstr "" ++ ++msgid "Go to password configuration..." ++msgstr "" ++ ++msgid "Go to relevant configuration page" ++msgstr "" ++ ++msgid "Guest" ++msgstr "" ++ ++msgid "HE.net password" ++msgstr "" ++ ++msgid "HE.net username" ++msgstr "" ++ ++msgid "Handler" ++msgstr "" ++ ++msgid "Hang Up" ++msgstr "" ++ ++msgid "Heartbeat" ++msgstr "" ++ ++msgid "" ++"Here you can configure the basic aspects of your device like its hostname or " ++"the timezone." ++msgstr "" ++ ++msgid "" ++"Here you can paste public SSH-Keys (one per line) for SSH public-key " ++"authentication." ++msgstr "" ++ ++msgid "Hermes 802.11b Wireless Controller" ++msgstr "" ++ ++msgid "Hide ESSID" ++msgstr "" ++ ++msgid "Host entries" ++msgstr "" ++ ++msgid "Host expiry timeout" ++msgstr "" ++ ++msgid "Host-IP or Network" ++msgstr "" ++ ++msgid "Hostname" ++msgstr "" ++ ++msgid "Hostname to send when requesting DHCP" ++msgstr "" ++ ++msgid "Hostnames" ++msgstr "" ++ ++msgid "Hybrid" ++msgstr "" ++ ++msgid "IP address" ++msgstr "" ++ ++msgid "IPv4" ++msgstr "" ++ ++msgid "IPv4 Firewall" ++msgstr "" ++ ++msgid "IPv4 WAN Status" ++msgstr "" ++ ++msgid "IPv4 address" ++msgstr "" ++ ++msgid "IPv4 and IPv6" ++msgstr "" ++ ++msgid "IPv4 assignment length" ++msgstr "" ++ ++msgid "IPv4 broadcast" ++msgstr "" ++ ++msgid "IPv4 gateway" ++msgstr "" ++ ++msgid "IPv4 netmask" ++msgstr "" ++ ++msgid "IPv4 only" ++msgstr "" ++ ++msgid "IPv4 prefix length" ++msgstr "" ++ ++msgid "IPv4-Address" ++msgstr "" ++ ++msgid "IPv6" ++msgstr "" ++ ++msgid "IPv6 Firewall" ++msgstr "" ++ ++msgid "IPv6 Neighbours" ++msgstr "" ++ ++msgid "IPv6 Settings" ++msgstr "" ++ ++msgid "IPv6 ULA-Prefix" ++msgstr "" ++ ++msgid "IPv6 WAN Status" ++msgstr "" ++ ++msgid "IPv6 address" ++msgstr "" ++ ++msgid "IPv6 address delegated to the local tunnel endpoint (optional)" ++msgstr "" ++ ++msgid "IPv6 assignment hint" ++msgstr "" ++ ++msgid "IPv6 assignment length" ++msgstr "" ++ ++msgid "IPv6 gateway" ++msgstr "" ++ ++msgid "IPv6 only" ++msgstr "" ++ ++msgid "IPv6 prefix" ++msgstr "" ++ ++msgid "IPv6 prefix length" ++msgstr "" ++ ++msgid "IPv6 routed prefix" ++msgstr "" ++ ++msgid "IPv6-Address" ++msgstr "" ++ ++msgid "IPv6-in-IPv4 (RFC4213)" ++msgstr "" ++ ++msgid "IPv6-over-IPv4 (6rd)" ++msgstr "" ++ ++msgid "IPv6-over-IPv4 (6to4)" ++msgstr "" ++ ++msgid "Identity" ++msgstr "" ++ ++msgid "" ++"If specified, mount the device by its UUID instead of a fixed device node" ++msgstr "" ++ ++msgid "" ++"If specified, mount the device by the partition label instead of a fixed " ++"device node" ++msgstr "" ++ ++msgid "If unchecked, no default route is configured" ++msgstr "" ++ ++msgid "If unchecked, the advertised DNS server addresses are ignored" ++msgstr "" ++ ++msgid "" ++"If your physical memory is insufficient unused data can be temporarily " ++"swapped to a swap-device resulting in a higher amount of usable RAM. Be aware that swapping data is a very " ++"slow process as the swap-device cannot be accessed with the high datarates " ++"of the RAM." ++msgstr "" ++ ++msgid "Ignore Hosts files" ++msgstr "" ++ ++msgid "Ignore interface" ++msgstr "" ++ ++msgid "Ignore resolve file" ++msgstr "" ++ ++msgid "Image" ++msgstr "" ++ ++msgid "In" ++msgstr "" ++ ++msgid "Inactivity timeout" ++msgstr "" ++ ++msgid "Inbound:" ++msgstr "" ++ ++msgid "Info" ++msgstr "" ++ ++msgid "Initscript" ++msgstr "" ++ ++msgid "Initscripts" ++msgstr "" ++ ++msgid "Install" ++msgstr "" ++ ++msgid "Install iputils-traceroute6 for IPv6 traceroute" ++msgstr "" ++ ++msgid "Install package %q" ++msgstr "" ++ ++msgid "Install protocol extensions..." ++msgstr "" ++ ++msgid "Installed packages" ++msgstr "" ++ ++msgid "Interface" ++msgstr "" ++ ++msgid "Interface Configuration" ++msgstr "" ++ ++msgid "Interface Overview" ++msgstr "" ++ ++msgid "Interface is reconnecting..." ++msgstr "" ++ ++msgid "Interface is shutting down..." ++msgstr "" ++ ++msgid "Interface not present or not connected yet." ++msgstr "" ++ ++msgid "Interface reconnected" ++msgstr "" ++ ++msgid "Interface shut down" ++msgstr "" ++ ++msgid "Interfaces" ++msgstr "" ++ ++msgid "Internal" ++msgstr "" ++ ++msgid "Internal Server Error" ++msgstr "" ++ ++msgid "Invalid" ++msgstr "" ++ ++msgid "Invalid VLAN ID given! Only IDs between %d and %d are allowed." ++msgstr "" ++ ++msgid "Invalid VLAN ID given! Only unique IDs are allowed" ++msgstr "" ++ ++msgid "Invalid username and/or password! Please try again." ++msgstr "" ++ ++msgid "" ++"It appears that you are trying to flash an image that does not fit into the " ++"flash memory, please verify the image file!" ++msgstr "" ++ ++msgid "Java Script required!" ++msgstr "" ++ ++msgid "Join Network" ++msgstr "" ++ ++msgid "Join Network: Settings" ++msgstr "" ++ ++msgid "Join Network: Wireless Scan" ++msgstr "" ++ ++msgid "Keep settings" ++msgstr "" ++ ++msgid "Kernel Log" ++msgstr "" ++ ++msgid "Kernel Version" ++msgstr "" ++ ++msgid "Key" ++msgstr "" ++ ++msgid "Key #%d" ++msgstr "" ++ ++msgid "Kill" ++msgstr "" ++ ++msgid "L2TP" ++msgstr "" ++ ++msgid "L2TP Server" ++msgstr "" ++ ++msgid "LCP echo failure threshold" ++msgstr "" ++ ++msgid "LCP echo interval" ++msgstr "" ++ ++msgid "LLC" ++msgstr "" ++ ++msgid "Label" ++msgstr "" ++ ++msgid "Language" ++msgstr "" ++ ++msgid "Language and Style" ++msgstr "" ++ ++msgid "Leaf" ++msgstr "" ++ ++msgid "Lease validity time" ++msgstr "" ++ ++msgid "Leasefile" ++msgstr "" ++ ++msgid "Leasetime" ++msgstr "" ++ ++msgid "Leasetime remaining" ++msgstr "" ++ ++msgid "Leave empty to autodetect" ++msgstr "" ++ ++msgid "Leave empty to use the current WAN address" ++msgstr "" ++ ++msgid "Legend:" ++msgstr "" ++ ++msgid "Limit" ++msgstr "" ++ ++msgid "Line Attenuation" ++msgstr "" ++ ++msgid "Line Speed" ++msgstr "" ++ ++msgid "Line State" ++msgstr "" ++ ++msgid "Link On" ++msgstr "" ++ ++msgid "" ++"List of DNS servers to forward " ++"requests to" ++msgstr "" ++ ++msgid "List of domains to allow RFC1918 responses for" ++msgstr "" ++ ++msgid "List of hosts that supply bogus NX domain results" ++msgstr "" ++ ++msgid "Listen only on the given interface or, if unspecified, on all" ++msgstr "" ++ ++msgid "Listening port for inbound DNS queries" ++msgstr "" ++ ++msgid "Load" ++msgstr "" ++ ++msgid "Load Average" ++msgstr "" ++ ++msgid "Loading" ++msgstr "" ++ ++msgid "Local IPv4 address" ++msgstr "" ++ ++msgid "Local IPv6 address" ++msgstr "" ++ ++msgid "Local Startup" ++msgstr "" ++ ++msgid "Local Time" ++msgstr "" ++ ++msgid "Local domain" ++msgstr "" ++ ++msgid "" ++"Local domain specification. Names matching this domain are never forwarded " ++"and are resolved from DHCP or hosts files only" ++msgstr "" ++ ++msgid "Local domain suffix appended to DHCP names and hosts file entries" ++msgstr "" ++ ++msgid "Local server" ++msgstr "" ++ ++msgid "" ++"Localise hostname depending on the requesting subnet if multiple IPs are " ++"available" ++msgstr "" ++ ++msgid "Localise queries" ++msgstr "" ++ ++msgid "Locked to channel %d used by: %s" ++msgstr "" ++ ++msgid "Log output level" ++msgstr "" ++ ++msgid "Log queries" ++msgstr "" ++ ++msgid "Logging" ++msgstr "" ++ ++msgid "Login" ++msgstr "" ++ ++msgid "Logout" ++msgstr "" ++ ++msgid "Lowest leased address as offset from the network address." ++msgstr "" ++ ++msgid "MAC-Address" ++msgstr "" ++ ++msgid "MAC-Address Filter" ++msgstr "" ++ ++msgid "MAC-Filter" ++msgstr "" ++ ++msgid "MAC-List" ++msgstr "" ++ ++msgid "MB/s" ++msgstr "" ++ ++msgid "MHz" ++msgstr "" ++ ++msgid "MTU" ++msgstr "" ++ ++msgid "" ++"Make sure to clone the root filesystem using something like the commands " ++"below:" ++msgstr "" ++ ++msgid "Maximum Rate" ++msgstr "" ++ ++msgid "Maximum allowed number of active DHCP leases" ++msgstr "" ++ ++msgid "Maximum allowed number of concurrent DNS queries" ++msgstr "" ++ ++msgid "Maximum allowed size of EDNS.0 UDP packets" ++msgstr "" ++ ++msgid "Maximum amount of seconds to wait for the modem to become ready" ++msgstr "" ++ ++msgid "Maximum hold time" ++msgstr "" ++ ++msgid "Maximum number of leased addresses." ++msgstr "" ++ ++msgid "Mbit/s" ++msgstr "" ++ ++msgid "Memory" ++msgstr "" ++ ++msgid "Memory usage (%)" ++msgstr "" ++ ++msgid "Metric" ++msgstr "" ++ ++msgid "Minimum Rate" ++msgstr "" ++ ++msgid "Minimum hold time" ++msgstr "" ++ ++msgid "Mirror monitor port" ++msgstr "" ++ ++msgid "Mirror source port" ++msgstr "" ++ ++msgid "Missing protocol extension for proto %q" ++msgstr "" ++ ++msgid "Mode" ++msgstr "" ++ ++msgid "Model" ++msgstr "" ++ ++msgid "Modem device" ++msgstr "" ++ ++msgid "Modem init timeout" ++msgstr "" ++ ++msgid "Monitor" ++msgstr "" ++ ++msgid "Mount Entry" ++msgstr "" ++ ++msgid "Mount Point" ++msgstr "" ++ ++msgid "Mount Points" ++msgstr "" ++ ++msgid "Mount Points - Mount Entry" ++msgstr "" ++ ++msgid "Mount Points - Swap Entry" ++msgstr "" ++ ++msgid "" ++"Mount Points define at which point a memory device will be attached to the " ++"filesystem" ++msgstr "" ++ ++msgid "Mount options" ++msgstr "" ++ ++msgid "Mount point" ++msgstr "" ++ ++msgid "Mounted file systems" ++msgstr "" ++ ++msgid "Move down" ++msgstr "" ++ ++msgid "Move up" ++msgstr "" ++ ++msgid "Multicast Rate" ++msgstr "" ++ ++msgid "Multicast address" ++msgstr "" ++ ++msgid "NAS ID" ++msgstr "" ++ ++msgid "NDP-Proxy" ++msgstr "" ++ ++msgid "NTP server candidates" ++msgstr "" ++ ++msgid "NTP sync time-out" ++msgstr "" ++ ++msgid "Name" ++msgstr "" ++ ++msgid "Name of the new interface" ++msgstr "" ++ ++msgid "Name of the new network" ++msgstr "" ++ ++msgid "Navigation" ++msgstr "" ++ ++msgid "Netmask" ++msgstr "" ++ ++msgid "Network" ++msgstr "" ++ ++msgid "Network Utilities" ++msgstr "" ++ ++msgid "Network boot image" ++msgstr "" ++ ++msgid "Network without interfaces." ++msgstr "" ++ ++msgid "Next »" ++msgstr "" ++ ++msgid "No DHCP Server configured for this interface" ++msgstr "" ++ ++msgid "No chains in this table" ++msgstr "" ++ ++msgid "No files found" ++msgstr "" ++ ++msgid "No information available" ++msgstr "" ++ ++msgid "No negative cache" ++msgstr "" ++ ++msgid "No network configured on this device" ++msgstr "" ++ ++msgid "No network name specified" ++msgstr "" ++ ++msgid "No package lists available" ++msgstr "" ++ ++msgid "No password set!" ++msgstr "" ++ ++msgid "No rules in this chain" ++msgstr "" ++ ++msgid "No zone assigned" ++msgstr "" ++ ++msgid "Noise" ++msgstr "" ++ ++msgid "Noise Margin" ++msgstr "" ++ ++msgid "Noise:" ++msgstr "" ++ ++msgid "None" ++msgstr "" ++ ++msgid "Normal" ++msgstr "" ++ ++msgid "Not Found" ++msgstr "" ++ ++msgid "Not associated" ++msgstr "" ++ ++msgid "Not connected" ++msgstr "" ++ ++msgid "Note: Configuration files will be erased." ++msgstr "" ++ ++msgid "Notice" ++msgstr "" ++ ++msgid "Nslookup" ++msgstr "" ++ ++msgid "OK" ++msgstr "" ++ ++msgid "OPKG-Configuration" ++msgstr "" ++ ++msgid "Off-State Delay" ++msgstr "" ++ ++msgid "" ++"On this page you can configure the network interfaces. You can bridge " ++"several interfaces by ticking the \"bridge interfaces\" field and enter the " ++"names of several network interfaces separated by spaces. You can also use " ++"VLAN notation " ++"INTERFACE.VLANNR (e.g.: " ++"eth0.1)." ++msgstr "" ++ ++msgid "On-State Delay" ++msgstr "" ++ ++msgid "One of hostname or mac address must be specified!" ++msgstr "" ++ ++msgid "One or more fields contain invalid values!" ++msgstr "" ++ ++msgid "One or more required fields have no value!" ++msgstr "" ++ ++msgid "Open list..." ++msgstr "" ++ ++msgid "OpenConnect (CISCO AnyConnect)" ++msgstr "" ++ ++msgid "Operating frequency" ++msgstr "" ++ ++msgid "Option changed" ++msgstr "" ++ ++msgid "Option removed" ++msgstr "" ++ ++msgid "Optional, specify to override default server (tic.sixxs.net)" ++msgstr "" ++ ++msgid "Optional, use when the SIXXS account has more than one tunnel" ++msgstr "" ++ ++msgid "Options" ++msgstr "" ++ ++msgid "Other:" ++msgstr "" ++ ++msgid "Out" ++msgstr "" ++ ++msgid "Outbound:" ++msgstr "" ++ ++msgid "Outdoor Channels" ++msgstr "" ++ ++msgid "Output Interface" ++msgstr "" ++ ++msgid "Override MAC address" ++msgstr "" ++ ++msgid "Override MTU" ++msgstr "" ++ ++msgid "Override the gateway in DHCP responses" ++msgstr "" ++ ++msgid "" ++"Override the netmask sent to clients. Normally it is calculated from the " ++"subnet that is served." ++msgstr "" ++ ++msgid "Override the table used for internal routes" ++msgstr "" ++ ++msgid "Overview" ++msgstr "" ++ ++msgid "Owner" ++msgstr "" ++ ++msgid "PAP/CHAP password" ++msgstr "" ++ ++msgid "PAP/CHAP username" ++msgstr "" ++ ++msgid "PID" ++msgstr "" ++ ++msgid "PIN" ++msgstr "" ++ ++msgid "PPP" ++msgstr "" ++ ++msgid "PPPoA Encapsulation" ++msgstr "" ++ ++msgid "PPPoATM" ++msgstr "" ++ ++msgid "PPPoE" ++msgstr "" ++ ++msgid "PPtP" ++msgstr "" ++ ++msgid "Package libiwinfo required!" ++msgstr "" ++ ++msgid "Package lists are older than 24 hours" ++msgstr "" ++ ++msgid "Package name" ++msgstr "" ++ ++msgid "Packets" ++msgstr "" ++ ++msgid "Part of zone %q" ++msgstr "" ++ ++msgid "Password" ++msgstr "" ++ ++msgid "Password authentication" ++msgstr "" ++ ++msgid "Password of Private Key" ++msgstr "" ++ ++msgid "Password successfully changed!" ++msgstr "" ++ ++msgid "Path" ++msgstr "" ++ ++msgid "Path to CA-Certificate" ++msgstr "" ++ ++msgid "Path to Client-Certificate" ++msgstr "" ++ ++msgid "Path to Private Key" ++msgstr "" ++ ++msgid "Path to executable which handles the button event" ++msgstr "" ++ ++msgid "Peak:" ++msgstr "" ++ ++msgid "Perform reboot" ++msgstr "" ++ ++msgid "Perform reset" ++msgstr "" ++ ++msgid "Phy Rate:" ++msgstr "" ++ ++msgid "Physical Settings" ++msgstr "" ++ ++msgid "Ping" ++msgstr "" ++ ++msgid "Pkts." ++msgstr "" ++ ++msgid "Please enter your username and password." ++msgstr "" ++ ++msgid "Please wait: Device rebooting..." ++msgstr "" ++ ++msgid "Policy" ++msgstr "" ++ ++msgid "Port" ++msgstr "" ++ ++msgid "Port %d" ++msgstr "" ++ ++msgid "Port %d is untagged in multiple VLANs!" ++msgstr "" ++ ++msgid "Port status:" ++msgstr "" ++ ++msgid "" ++"Presume peer to be dead after given amount of LCP echo failures, use 0 to " ++"ignore failures" ++msgstr "" ++ ++msgid "Prevents client-to-client communication" ++msgstr "" ++ ++msgid "Prism2/2.5/3 802.11b Wireless Controller" ++msgstr "" ++ ++msgid "Proceed" ++msgstr "" ++ ++msgid "Processes" ++msgstr "" ++ ++msgid "Prot." ++msgstr "" ++ ++msgid "Protocol" ++msgstr "" ++ ++msgid "Protocol family" ++msgstr "" ++ ++msgid "Protocol of the new interface" ++msgstr "" ++ ++msgid "Protocol support is not installed" ++msgstr "" ++ ++msgid "Provide NTP server" ++msgstr "" ++ ++msgid "Provide new network" ++msgstr "" ++ ++msgid "Pseudo Ad-Hoc (ahdemo)" ++msgstr "" ++ ++msgid "Public prefix routed to this device for distribution to clients." ++msgstr "" ++ ++msgid "Quality" ++msgstr "" ++ ++msgid "RTS/CTS Threshold" ++msgstr "" ++ ++msgid "RX" ++msgstr "" ++ ++msgid "RX Rate" ++msgstr "" ++ ++msgid "RaLink 802.11%s Wireless Controller" ++msgstr "" ++ ++msgid "Radius-Accounting-Port" ++msgstr "" ++ ++msgid "Radius-Accounting-Secret" ++msgstr "" ++ ++msgid "Radius-Accounting-Server" ++msgstr "" ++ ++msgid "Radius-Authentication-Port" ++msgstr "" ++ ++msgid "Radius-Authentication-Secret" ++msgstr "" ++ ++msgid "Radius-Authentication-Server" ++msgstr "" ++ ++msgid "" ++"Read /etc/ethers to configure the DHCP-Server" ++msgstr "" ++ ++msgid "" ++"Really delete this interface? The deletion cannot be undone!\\nYou might " ++"lose access to this device if you are connected via this interface." ++msgstr "" ++ ++msgid "" ++"Really delete this wireless network? The deletion cannot be undone!\\nYou " ++"might lose access to this device if you are connected via this network." ++msgstr "" ++ ++msgid "Really reset all changes?" ++msgstr "" ++ ++msgid "" ++"Really shut down network?\\nYou might lose access to this device if you are " ++"connected via this interface." ++msgstr "" ++ ++msgid "" ++"Really shutdown interface \"%s\" ?\\nYou might lose access to this device if " ++"you are connected via this interface." ++msgstr "" ++ ++msgid "Really switch protocol?" ++msgstr "" ++ ++msgid "Realtime Connections" ++msgstr "" ++ ++msgid "Realtime Graphs" ++msgstr "" ++ ++msgid "Realtime Load" ++msgstr "" ++ ++msgid "Realtime Traffic" ++msgstr "" ++ ++msgid "Realtime Wireless" ++msgstr "" ++ ++msgid "Rebind protection" ++msgstr "" ++ ++msgid "Reboot" ++msgstr "" ++ ++msgid "Rebooting..." ++msgstr "" ++ ++msgid "Reboots the operating system of your device" ++msgstr "" ++ ++msgid "Receive" ++msgstr "" ++ ++msgid "Receiver Antenna" ++msgstr "" ++ ++msgid "Reconnect this interface" ++msgstr "" ++ ++msgid "Reconnecting interface" ++msgstr "" ++ ++msgid "References" ++msgstr "" ++ ++msgid "Regulatory Domain" ++msgstr "" ++ ++msgid "Relay" ++msgstr "" ++ ++msgid "Relay Bridge" ++msgstr "" ++ ++msgid "Relay between networks" ++msgstr "" ++ ++msgid "Relay bridge" ++msgstr "" ++ ++msgid "Remote IPv4 address" ++msgstr "" ++ ++msgid "Remove" ++msgstr "" ++ ++msgid "Repeat scan" ++msgstr "" ++ ++msgid "Replace entry" ++msgstr "" ++ ++msgid "Replace wireless configuration" ++msgstr "" ++ ++msgid "Request IPv6-address" ++msgstr "" ++ ++msgid "Request IPv6-prefix of length" ++msgstr "" ++ ++msgid "Require TLS" ++msgstr "" ++ ++msgid "Required for certain ISPs, e.g. Charter with DOCSIS 3" ++msgstr "" ++ ++msgid "Reset" ++msgstr "" ++ ++msgid "Reset Counters" ++msgstr "" ++ ++msgid "Reset to defaults" ++msgstr "" ++ ++msgid "Resolv and Hosts Files" ++msgstr "" ++ ++msgid "Resolve file" ++msgstr "" ++ ++msgid "Restart" ++msgstr "" ++ ++msgid "Restart Firewall" ++msgstr "" ++ ++msgid "Restore backup" ++msgstr "" ++ ++msgid "Reveal/hide password" ++msgstr "" ++ ++msgid "Revert" ++msgstr "" ++ ++msgid "Root" ++msgstr "" ++ ++msgid "Root directory for files served via TFTP" ++msgstr "" ++ ++msgid "Root preparation" ++msgstr "" ++ ++msgid "Routed IPv6 prefix for downstream interfaces" ++msgstr "" ++ ++msgid "Router Advertisement-Service" ++msgstr "" ++ ++msgid "Router Password" ++msgstr "" ++ ++msgid "Routes" ++msgstr "" ++ ++msgid "" ++"Routes specify over which interface and gateway a certain host or network " ++"can be reached." ++msgstr "" ++ ++msgid "Rule #" ++msgstr "" ++ ++msgid "Run a filesystem check before mounting the device" ++msgstr "" ++ ++msgid "Run filesystem check" ++msgstr "" ++ ++msgid "" ++"SIXXS supports TIC only, for static tunnels using IP protocol 41 (RFC4213) " ++"use 6in4 instead" ++msgstr "" ++ ++msgid "SIXXS-handle[/Tunnel-ID]" ++msgstr "" ++ ++msgid "SSH Access" ++msgstr "" ++ ++msgid "SSH-Keys" ++msgstr "" ++ ++msgid "SSID" ++msgstr "" ++ ++msgid "Save" ++msgstr "" ++ ++msgid "Save & Apply" ++msgstr "" ++ ++msgid "Save & Apply" ++msgstr "" ++ ++msgid "Scan" ++msgstr "" ++ ++msgid "Scheduled Tasks" ++msgstr "" ++ ++msgid "Section added" ++msgstr "" ++ ++msgid "Section removed" ++msgstr "" ++ ++msgid "See \"mount\" manpage for details" ++msgstr "" ++ ++msgid "" ++"Send LCP echo requests at the given interval in seconds, only effective in " ++"conjunction with failure threshold" ++msgstr "" ++ ++msgid "Separate Clients" ++msgstr "" ++ ++msgid "Separate WDS" ++msgstr "" ++ ++msgid "Server Settings" ++msgstr "" ++ ++msgid "Server password" ++msgstr "" ++ ++msgid "" ++"Server password, enter the specific password of the tunnel when the username " ++"contains the tunnel ID" ++msgstr "" ++ ++msgid "Server username" ++msgstr "" ++ ++msgid "Service Name" ++msgstr "" ++ ++msgid "Service Type" ++msgstr "" ++ ++msgid "Services" ++msgstr "" ++ ++msgid "Set up Time Synchronization" ++msgstr "" ++ ++msgid "Setup DHCP Server" ++msgstr "" ++ ++msgid "Show current backup file list" ++msgstr "" ++ ++msgid "Shutdown this interface" ++msgstr "" ++ ++msgid "Shutdown this network" ++msgstr "" ++ ++msgid "Signal" ++msgstr "" ++ ++msgid "Signal:" ++msgstr "" ++ ++msgid "Size" ++msgstr "" ++ ++msgid "Skip" ++msgstr "" ++ ++msgid "Skip to content" ++msgstr "" ++ ++msgid "Skip to navigation" ++msgstr "" ++ ++msgid "Slot time" ++msgstr "" ++ ++msgid "Software" ++msgstr "" ++ ++msgid "Some fields are invalid, cannot save values!" ++msgstr "" ++ ++msgid "Sorry, the object you requested was not found." ++msgstr "" ++ ++msgid "Sorry, the server encountered an unexpected error." ++msgstr "" ++ ++msgid "" ++"Sorry, there is no sysupgrade support present; a new firmware image must be " ++"flashed manually. Please refer to the OpenWrt wiki for device specific " ++"install instructions." ++msgstr "" ++ ++msgid "Sort" ++msgstr "" ++ ++msgid "Source" ++msgstr "" ++ ++msgid "Source routing" ++msgstr "" ++ ++msgid "Specifies the button state to handle" ++msgstr "" ++ ++msgid "Specifies the directory the device is attached to" ++msgstr "" ++ ++msgid "Specifies the listening port of this Dropbear instance" ++msgstr "" ++ ++msgid "" ++"Specifies the maximum amount of failed ARP requests until hosts are presumed " ++"to be dead" ++msgstr "" ++ ++msgid "" ++"Specifies the maximum amount of seconds after which hosts are presumed to be " ++"dead" ++msgstr "" ++ ++msgid "Specify the secret encryption key here." ++msgstr "" ++ ++msgid "Start" ++msgstr "" ++ ++msgid "Start priority" ++msgstr "" ++ ++msgid "Startup" ++msgstr "" ++ ++msgid "Static IPv4 Routes" ++msgstr "" ++ ++msgid "Static IPv6 Routes" ++msgstr "" ++ ++msgid "Static Leases" ++msgstr "" ++ ++msgid "Static Routes" ++msgstr "" ++ ++msgid "Static WDS" ++msgstr "" ++ ++msgid "Static address" ++msgstr "" ++ ++msgid "" ++"Static leases are used to assign fixed IP addresses and symbolic hostnames " ++"to DHCP clients. They are also required for non-dynamic interface " ++"configurations where only hosts with a corresponding lease are served." ++msgstr "" ++ ++msgid "Status" ++msgstr "" ++ ++msgid "Stop" ++msgstr "" ++ ++msgid "Strict order" ++msgstr "" ++ ++msgid "Submit" ++msgstr "" ++ ++msgid "Swap" ++msgstr "" ++ ++msgid "Swap Entry" ++msgstr "" ++ ++msgid "Switch" ++msgstr "" ++ ++msgid "Switch %q" ++msgstr "" ++ ++msgid "Switch %q (%s)" ++msgstr "" ++ ++msgid "Switch protocol" ++msgstr "" ++ ++msgid "Sync with browser" ++msgstr "" ++ ++msgid "Synchronizing..." ++msgstr "" ++ ++msgid "System" ++msgstr "" ++ ++msgid "System Log" ++msgstr "" ++ ++msgid "System Properties" ++msgstr "" ++ ++msgid "System log buffer size" ++msgstr "" ++ ++msgid "TCP:" ++msgstr "" ++ ++msgid "TFTP Settings" ++msgstr "" ++ ++msgid "TFTP server root" ++msgstr "" ++ ++msgid "TX" ++msgstr "" ++ ++msgid "TX Rate" ++msgstr "" ++ ++msgid "Table" ++msgstr "" ++ ++msgid "Target" ++msgstr "" ++ ++msgid "Terminate" ++msgstr "" ++ ++msgid "" ++"The Device Configuration section covers physical settings of the " ++"radio hardware such as channel, transmit power or antenna selection which " ++"are shared among all defined wireless networks (if the radio hardware is " ++"multi-SSID capable). Per network settings like encryption or operation mode " ++"are grouped in the Interface Configuration." ++msgstr "" ++ ++msgid "" ++"The libiwinfo-lua package is not installed. You must install this " ++"component for working wireless configuration!" ++msgstr "" ++ ++msgid "" ++"The HE.net endpoint update configuration changed, you must now use the plain " ++"username instead of the user ID!" ++msgstr "" ++ ++msgid "" ++"The IPv6 prefix assigned to the provider, usually ends with ::" ++msgstr "" ++ ++msgid "" ++"The allowed characters are: A-Z, a-z, 0-9 and _" ++msgstr "" ++ ++msgid "The configuration file could not be loaded due to the following error:" ++msgstr "" ++ ++msgid "" ++"The device file of the memory or partition (e.g." ++" /dev/sda1)" ++msgstr "" ++ ++msgid "" ++"The filesystem that was used to format the memory (e.g. ext3)" ++msgstr "" ++ ++msgid "" ++"The flash image was uploaded. Below is the checksum and file size listed, " ++"compare them with the original file to ensure data integrity.
    Click " ++"\"Proceed\" below to start the flash procedure." ++msgstr "" ++ ++msgid "The following changes have been committed" ++msgstr "" ++ ++msgid "The following changes have been reverted" ++msgstr "" ++ ++msgid "The following rules are currently active on this system." ++msgstr "" ++ ++msgid "The given network name is not unique" ++msgstr "" ++ ++msgid "" ++"The hardware is not multi-SSID capable and the existing configuration will " ++"be replaced if you proceed." ++msgstr "" ++ ++msgid "" ++"The length of the IPv4 prefix in bits, the remainder is used in the IPv6 " ++"addresses." ++msgstr "" ++ ++msgid "The length of the IPv6 prefix in bits" ++msgstr "" ++ ++msgid "" ++"The network ports on this device can be combined to several VLANs in which computers can " ++"communicate directly with each other. VLANs are often used to separate different network " ++"segments. Often there is by default one Uplink port for a connection to the " ++"next greater network like the internet and other ports for a local network." ++msgstr "" ++ ++msgid "The selected protocol needs a device assigned" ++msgstr "" ++ ++msgid "" ++"The system is erasing the configuration partition now and will reboot itself " ++"when finished." ++msgstr "" ++ ++msgid "" ++"The system is flashing now.
    DO NOT POWER OFF THE DEVICE!
    Wait a " ++"few minutes before you try to reconnect. It might be necessary to renew the " ++"address of your computer to reach the device again, depending on your " ++"settings." ++msgstr "" ++ ++msgid "" ++"The tunnel end-point is behind NAT, defaults to disabled and only applies to " ++"AYIYA" ++msgstr "" ++ ++msgid "" ++"The uploaded image file does not contain a supported format. Make sure that " ++"you choose the generic image format for your platform." ++msgstr "" ++ ++msgid "There are no active leases." ++msgstr "" ++ ++msgid "There are no pending changes to apply!" ++msgstr "" ++ ++msgid "There are no pending changes to revert!" ++msgstr "" ++ ++msgid "There are no pending changes!" ++msgstr "" ++ ++msgid "" ++"There is no device assigned yet, please attach a network device in the " ++"\"Physical Settings\" tab" ++msgstr "" ++ ++msgid "" ++"There is no password set on this router. Please configure a root password to " ++"protect the web interface and enable SSH." ++msgstr "" ++ ++msgid "This IPv4 address of the relay" ++msgstr "" ++ ++msgid "" ++"This is a list of shell glob patterns for matching files and directories to " ++"include during sysupgrade. Modified files in /etc/config/ and certain other " ++"configurations are automatically preserved." ++msgstr "" ++ ++msgid "" ++"This is either the \"Update Key\" configured for the tunnel or the account " ++"password if no update key has been configured" ++msgstr "" ++ ++msgid "" ++"This is the content of /etc/rc.local. Insert your own commands here (in " ++"front of 'exit 0') to execute them at the end of the boot process." ++msgstr "" ++ ++msgid "" ++"This is the local endpoint address assigned by the tunnel broker, it usually " ++"ends with :2" ++msgstr "" ++ ++msgid "" ++"This is the only DHCP in the local network" ++msgstr "" ++ ++msgid "This is the plain username for logging into the account" ++msgstr "" ++ ++msgid "" ++"This is the prefix routed to you by the tunnel broker for use by clients" ++msgstr "" ++ ++msgid "This is the system crontab in which scheduled tasks can be defined." ++msgstr "" ++ ++msgid "" ++"This is usually the address of the nearest PoP operated by the tunnel broker" ++msgstr "" ++ ++msgid "" ++"This list gives an overview over currently running system processes and " ++"their status." ++msgstr "" ++ ++msgid "This page allows the configuration of custom button actions" ++msgstr "" ++ ++msgid "This page gives an overview over currently active network connections." ++msgstr "" ++ ++msgid "This section contains no values yet" ++msgstr "" ++ ++msgid "Time Synchronization" ++msgstr "" ++ ++msgid "Time Synchronization is not configured yet." ++msgstr "" ++ ++msgid "Timezone" ++msgstr "" ++ ++msgid "" ++"To restore configuration files, you can upload a previously generated backup " ++"archive here." ++msgstr "" ++ ++msgid "Total Available" ++msgstr "" ++ ++msgid "Traceroute" ++msgstr "" ++ ++msgid "Traffic" ++msgstr "" ++ ++msgid "Transfer" ++msgstr "" ++ ++msgid "Transmission Rate" ++msgstr "" ++ ++msgid "Transmit" ++msgstr "" ++ ++msgid "Transmit Power" ++msgstr "" ++ ++msgid "Transmitter Antenna" ++msgstr "" ++ ++msgid "Trigger" ++msgstr "" ++ ++msgid "Trigger Mode" ++msgstr "" ++ ++msgid "Tunnel ID" ++msgstr "" ++ ++msgid "Tunnel Interface" ++msgstr "" ++ ++msgid "Tunnel Link" ++msgstr "" ++ ++msgid "Tunnel broker protocol" ++msgstr "" ++ ++msgid "Tunnel setup server" ++msgstr "" ++ ++msgid "Tunnel type" ++msgstr "" ++ ++msgid "Turbo Mode" ++msgstr "" ++ ++msgid "Tx-Power" ++msgstr "" ++ ++msgid "Type" ++msgstr "" ++ ++msgid "UDP:" ++msgstr "" ++ ++msgid "UMTS only" ++msgstr "" ++ ++msgid "UMTS/GPRS/EV-DO" ++msgstr "" ++ ++msgid "USB Device" ++msgstr "" ++ ++msgid "UUID" ++msgstr "" ++ ++msgid "Unable to dispatch" ++msgstr "" ++ ++msgid "Unknown" ++msgstr "" ++ ++msgid "Unknown Error, password not changed!" ++msgstr "" ++ ++msgid "Unmanaged" ++msgstr "" ++ ++msgid "Unsaved Changes" ++msgstr "" ++ ++msgid "Unsupported protocol type." ++msgstr "" ++ ++msgid "Update lists" ++msgstr "" ++ ++msgid "" ++"Upload a sysupgrade-compatible image here to replace the running firmware. " ++"Check \"Keep settings\" to retain the current configuration (requires an " ++"OpenWrt compatible firmware image)." ++msgstr "" ++ ++msgid "Upload archive..." ++msgstr "" ++ ++msgid "Uploaded File" ++msgstr "" ++ ++msgid "Uptime" ++msgstr "" ++ ++msgid "Use /etc/ethers" ++msgstr "" ++ ++msgid "Use DHCP gateway" ++msgstr "" ++ ++msgid "Use DNS servers advertised by peer" ++msgstr "" ++ ++msgid "Use ISO/IEC 3166 alpha2 country codes." ++msgstr "" ++ ++msgid "Use MTU on tunnel interface" ++msgstr "" ++ ++msgid "Use TTL on tunnel interface" ++msgstr "" ++ ++msgid "Use as external overlay (/overlay)" ++msgstr "" ++ ++msgid "Use as root filesystem (/)" ++msgstr "" ++ ++msgid "Use broadcast flag" ++msgstr "" ++ ++msgid "Use builtin IPv6-management" ++msgstr "" ++ ++msgid "Use custom DNS servers" ++msgstr "" ++ ++msgid "Use default gateway" ++msgstr "" ++ ++msgid "Use gateway metric" ++msgstr "" ++ ++msgid "Use routing table" ++msgstr "" ++ ++msgid "" ++"Use the Add Button to add a new lease entry. The MAC-Address indentifies the host, the IPv4-Address specifies to the fixed " ++"address to use and the Hostname is assigned as symbolic name to the " ++"requesting host." ++msgstr "" ++ ++msgid "Used" ++msgstr "" ++ ++msgid "Used Key Slot" ++msgstr "" ++ ++msgid "User certificate (PEM encoded)" ++msgstr "" ++ ++msgid "User key (PEM encoded)" ++msgstr "" ++ ++msgid "Username" ++msgstr "" ++ ++msgid "VC-Mux" ++msgstr "" ++ ++msgid "VLAN Interface" ++msgstr "" ++ ++msgid "VLANs on %q" ++msgstr "" ++ ++msgid "VLANs on %q (%s)" ++msgstr "" ++ ++msgid "VPN Server" ++msgstr "" ++ ++msgid "VPN Server port" ++msgstr "" ++ ++msgid "VPN Server's certificate SHA1 hash" ++msgstr "" ++ ++msgid "Vendor Class to send when requesting DHCP" ++msgstr "" ++ ++msgid "Verbose" ++msgstr "" ++ ++msgid "Verbose logging by aiccu daemon" ++msgstr "" ++ ++msgid "Verify" ++msgstr "" ++ ++msgid "Version" ++msgstr "" ++ ++msgid "WDS" ++msgstr "" ++ ++msgid "WEP Open System" ++msgstr "" ++ ++msgid "WEP Shared Key" ++msgstr "" ++ ++msgid "WEP passphrase" ++msgstr "" ++ ++msgid "WMM Mode" ++msgstr "" ++ ++msgid "WPA passphrase" ++msgstr "" ++ ++msgid "" ++"WPA-Encryption requires wpa_supplicant (for client mode) or hostapd (for AP " ++"and ad-hoc mode) to be installed." ++msgstr "" ++ ++msgid "" ++"Wait for NTP sync that many seconds, seting to 0 disables waiting (optional)" ++msgstr "" ++ ++msgid "Waiting for changes to be applied..." ++msgstr "" ++ ++msgid "Waiting for command to complete..." ++msgstr "" ++ ++msgid "Warning" ++msgstr "" ++ ++msgid "Warning: There are unsaved changes that will be lost while rebooting!" ++msgstr "" ++ ++msgid "Whether to create an IPv6 default route over the tunnel" ++msgstr "" ++ ++msgid "Whether to route only packets from delegated prefixes" ++msgstr "" ++ ++msgid "Width" ++msgstr "" ++ ++msgid "Wifi" ++msgstr "" ++ ++msgid "Wireless" ++msgstr "" ++ ++msgid "Wireless Adapter" ++msgstr "" ++ ++msgid "Wireless Network" ++msgstr "" ++ ++msgid "Wireless Overview" ++msgstr "" ++ ++msgid "Wireless Security" ++msgstr "" ++ ++msgid "Wireless is disabled or not associated" ++msgstr "" ++ ++msgid "Wireless is restarting..." ++msgstr "" ++ ++msgid "Wireless network is disabled" ++msgstr "" ++ ++msgid "Wireless network is enabled" ++msgstr "" ++ ++msgid "Wireless restarted" ++msgstr "" ++ ++msgid "Wireless shut down" ++msgstr "" ++ ++msgid "Write received DNS requests to syslog" ++msgstr "" ++ ++msgid "XR Support" ++msgstr "" ++ ++msgid "" ++"You can enable or disable installed init scripts here. Changes will applied " ++"after a device reboot.
    Warning: If you disable essential init " ++"scripts like \"network\", your device might become inaccessible!" ++msgstr "" ++ ++msgid "" ++"You must enable Java Script in your browser or LuCI will not work properly." ++msgstr "" ++ ++msgid "" ++"Your Internet Explorer is too old to display this page correctly. Please " ++"upgrade it to at least version 7 or use another browser like Firefox, Opera " ++"or Safari." ++msgstr "" ++ ++msgid "any" ++msgstr "" ++ ++msgid "auto" ++msgstr "" ++ ++msgid "automatic" ++msgstr "" ++ ++msgid "baseT" ++msgstr "" ++ ++msgid "bridged" ++msgstr "" ++ ++msgid "create:" ++msgstr "" ++ ++msgid "creates a bridge over specified interface(s)" ++msgstr "" ++ ++msgid "dB" ++msgstr "" ++ ++msgid "dBm" ++msgstr "" ++ ++msgid "disable" ++msgstr "" ++ ++msgid "disabled" ++msgstr "" ++ ++msgid "expired" ++msgstr "" ++ ++msgid "" ++"file where given DHCP-leases will be stored" ++msgstr "" ++ ++msgid "forward" ++msgstr "" ++ ++msgid "full-duplex" ++msgstr "" ++ ++msgid "half-duplex" ++msgstr "" ++ ++msgid "help" ++msgstr "" ++ ++msgid "hidden" ++msgstr "" ++ ++msgid "hybrid mode" ++msgstr "" ++ ++msgid "if target is a network" ++msgstr "" ++ ++msgid "input" ++msgstr "" ++ ++msgid "kB" ++msgstr "" ++ ++msgid "kB/s" ++msgstr "" ++ ++msgid "kbit/s" ++msgstr "" ++ ++msgid "local DNS file" ++msgstr "" ++ ++msgid "minimum 1280, maximum 1480" ++msgstr "" ++ ++msgid "navigation Navigation" ++msgstr "" ++ ++msgid "no" ++msgstr "" ++ ++msgid "no link" ++msgstr "" ++ ++msgid "none" ++msgstr "" ++ ++msgid "not present" ++msgstr "" ++ ++msgid "off" ++msgstr "" ++ ++msgid "on" ++msgstr "" ++ ++msgid "open" ++msgstr "" ++ ++msgid "overlay" ++msgstr "" ++ ++msgid "relay mode" ++msgstr "" ++ ++msgid "routed" ++msgstr "" ++ ++msgid "server mode" ++msgstr "" ++ ++msgid "skiplink1 Skip to navigation" ++msgstr "" ++ ++msgid "skiplink2 Skip to content" ++msgstr "" ++ ++msgid "stateful-only" ++msgstr "" ++ ++msgid "stateless" ++msgstr "" ++ ++msgid "stateless + stateful" ++msgstr "" ++ ++msgid "tagged" ++msgstr "" ++ ++msgid "unknown" ++msgstr "" ++ ++msgid "unlimited" ++msgstr "" ++ ++msgid "unspecified" ++msgstr "" ++ ++msgid "unspecified -or- create:" ++msgstr "" ++ ++msgid "untagged" ++msgstr "" ++ ++msgid "yes" ++msgstr "" ++ ++msgid "« Back" ++msgstr "" +diff --git a/feeds/luci/modules/luci-base/po/sv/base.po b/feeds/luci/modules/luci-base/po/sv/base.po +new file mode 100644 +index 0000000..86fa224 +--- /dev/null ++++ b/feeds/luci/modules/luci-base/po/sv/base.po +@@ -0,0 +1,3060 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"PO-Revision-Date: 2014-04-28 09:22+0200\n" ++"Last-Translator: EricJ \n" ++"Language-Team: none\n" ++"Language: sv\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n != 1);\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "(%d minute window, %d second interval)" ++msgstr "" ++ ++msgid "(%s available)" ++msgstr "(%s tillgängligt)" ++ ++msgid "(empty)" ++msgstr "(tomt)" ++ ++msgid "(no interfaces attached)" ++msgstr "(inga gränssnitt har bifogats)" ++ ++msgid "-- Additional Field --" ++msgstr "" ++ ++msgid "-- Please choose --" ++msgstr "" ++ ++msgid "-- custom --" ++msgstr "-- anpassad --" ++ ++msgid "-- match by device --" ++msgstr "" ++ ++msgid "-- match by label --" ++msgstr "" ++ ++msgid "1 Minute Load:" ++msgstr "Belastning senaste minuten:" ++ ++msgid "15 Minute Load:" ++msgstr "Belastning senaste 15 minutrarna:" ++ ++msgid "5 Minute Load:" ++msgstr "Belastning senaste 5 minutrarna:" ++ ++msgid "BSSID" ++msgstr "BSSID" ++ ++msgid "DNS query port" ++msgstr "" ++ ++msgid "DNS server port" ++msgstr "DNSserver-port" ++ ++msgid "" ++"DNS servers will be queried in the " ++"order of the resolvfile" ++msgstr "" ++ ++msgid "ESSID" ++msgstr "" ++ ++msgid "IPv4-Address" ++msgstr "IPv4-adress" ++ ++# I don't think "Gateway" is commonly translated. ++msgid "IPv4-Gateway" ++msgstr "IPv4-gateway" ++ ++msgid "IPv4-Netmask" ++msgstr "IPv4-nätmask" ++ ++msgid "" ++"IPv6-Address or Network " ++"(CIDR)" ++msgstr "" ++"IPv6-adress eller nätverk " ++"(CIDR)" ++ ++msgid "IPv6-Gateway" ++msgstr "IPv6-gateway" ++ ++msgid "IPv6-Suffix (hex)" ++msgstr "" ++ ++msgid "LED Configuration" ++msgstr "LED-konfiguration" ++ ++msgid "LED Name" ++msgstr "" ++ ++msgid "MAC-Address" ++msgstr "" ++ ++msgid "" ++"Max. DHCP leases" ++msgstr "" ++ ++msgid "" ++"Max. EDNS0 packet size" ++msgstr "" ++ ++msgid "Max. concurrent queries" ++msgstr "" ++ ++msgid "%s - %s" ++msgstr "" ++ ++msgid "ADSL" ++msgstr "" ++ ++msgid "ADSL Status" ++msgstr "" ++ ++msgid "AICCU (SIXXS)" ++msgstr "" ++ ++msgid "APN" ++msgstr "" ++ ++msgid "AR Support" ++msgstr "" ++ ++msgid "ARP retry threshold" ++msgstr "" ++ ++msgid "ATM Bridges" ++msgstr "" ++ ++msgid "ATM Virtual Channel Identifier (VCI)" ++msgstr "" ++ ++msgid "ATM Virtual Path Identifier (VPI)" ++msgstr "" ++ ++msgid "" ++"ATM bridges expose encapsulated ethernet in AAL5 connections as virtual " ++"Linux network interfaces which can be used in conjunction with DHCP or PPP " ++"to dial into the provider network." ++msgstr "" ++ ++msgid "ATM device number" ++msgstr "" ++ ++msgid "AYIYA" ++msgstr "" ++ ++msgid "Access Concentrator" ++msgstr "" ++ ++msgid "Access Point" ++msgstr "" ++ ++msgid "Action" ++msgstr "" ++ ++msgid "Actions" ++msgstr "" ++ ++msgid "Activate this network" ++msgstr "" ++ ++msgid "Active IPv4-Routes" ++msgstr "" ++ ++msgid "Active IPv6-Routes" ++msgstr "" ++ ++msgid "Active Connections" ++msgstr "" ++ ++msgid "Active DHCP Leases" ++msgstr "" ++ ++msgid "Active DHCPv6 Leases" ++msgstr "" ++ ++msgid "Ad-Hoc" ++msgstr "" ++ ++msgid "Add" ++msgstr "" ++ ++msgid "Add local domain suffix to names served from hosts files" ++msgstr "" ++ ++msgid "Add new interface..." ++msgstr "" ++ ++msgid "Additional Hosts files" ++msgstr "" ++ ++msgid "Address" ++msgstr "" ++ ++msgid "Address to access local relay bridge" ++msgstr "" ++ ++msgid "Administration" ++msgstr "" ++ ++msgid "Advanced Settings" ++msgstr "" ++ ++msgid "Alert" ++msgstr "" ++ ++msgid "Allow SSH password authentication" ++msgstr "" ++ ++msgid "Allow all except listed" ++msgstr "" ++ ++msgid "Allow listed only" ++msgstr "" ++ ++msgid "Allow localhost" ++msgstr "" ++ ++msgid "Allow remote hosts to connect to local SSH forwarded ports" ++msgstr "" ++ ++msgid "Allow root logins with password" ++msgstr "" ++ ++msgid "Allow the root user to login with password" ++msgstr "" ++ ++msgid "" ++"Allow upstream responses in the 127.0.0.0/8 range, e.g. for RBL services" ++msgstr "" ++ ++msgid "" ++"Also see Tunneling Comparison on SIXXS" ++msgstr "" ++ ++msgid "Always announce default router" ++msgstr "" ++ ++msgid "An additional network will be created if you leave this unchecked." ++msgstr "" ++ ++msgid "Announce as default router even if no public prefix is available." ++msgstr "" ++ ++msgid "Announced DNS domains" ++msgstr "" ++ ++msgid "Announced DNS servers" ++msgstr "" ++ ++msgid "Antenna 1" ++msgstr "" ++ ++msgid "Antenna 2" ++msgstr "" ++ ++msgid "Antenna Configuration" ++msgstr "" ++ ++msgid "Any zone" ++msgstr "" ++ ++msgid "Apply" ++msgstr "" ++ ++msgid "Applying changes" ++msgstr "" ++ ++msgid "" ++"Assign a part of given length of every public IPv6-prefix to this interface" ++msgstr "" ++ ++msgid "Assign interfaces..." ++msgstr "" ++ ++msgid "" ++"Assign prefix parts using this hexadecimal subprefix ID for this interface." ++msgstr "" ++ ++msgid "Associated Stations" ++msgstr "" ++ ++msgid "Atheros 802.11%s Wireless Controller" ++msgstr "" ++ ++msgid "AuthGroup" ++msgstr "" ++ ++msgid "Authentication" ++msgstr "" ++ ++msgid "Authoritative" ++msgstr "" ++ ++msgid "Authorization Required" ++msgstr "" ++ ++msgid "Auto Refresh" ++msgstr "" ++ ++msgid "Automatic" ++msgstr "" ++ ++msgid "Automatic Homenet (HNCP)" ++msgstr "" ++ ++msgid "Available" ++msgstr "" ++ ++msgid "Available packages" ++msgstr "" ++ ++msgid "Average:" ++msgstr "" ++ ++msgid "BSSID" ++msgstr "" ++ ++msgid "Back" ++msgstr "" ++ ++msgid "Back to Overview" ++msgstr "" ++ ++msgid "Back to configuration" ++msgstr "" ++ ++msgid "Back to overview" ++msgstr "" ++ ++msgid "Back to scan results" ++msgstr "" ++ ++msgid "Background Scan" ++msgstr "" ++ ++msgid "Backup / Flash Firmware" ++msgstr "" ++ ++msgid "Backup / Restore" ++msgstr "" ++ ++msgid "Backup file list" ++msgstr "" ++ ++msgid "Bad address specified!" ++msgstr "" ++ ++msgid "Band" ++msgstr "" ++ ++msgid "Behind NAT" ++msgstr "" ++ ++msgid "" ++"Below is the determined list of files to backup. It consists of changed " ++"configuration files marked by opkg, essential base files and the user " ++"defined backup patterns." ++msgstr "" ++ ++msgid "Bitrate" ++msgstr "" ++ ++msgid "Bogus NX Domain Override" ++msgstr "" ++ ++msgid "Bridge" ++msgstr "" ++ ++msgid "Bridge interfaces" ++msgstr "" ++ ++msgid "Bridge unit number" ++msgstr "" ++ ++msgid "Bring up on boot" ++msgstr "" ++ ++msgid "Broadcom 802.11%s Wireless Controller" ++msgstr "" ++ ++msgid "Broadcom BCM%04x 802.11 Wireless Controller" ++msgstr "" ++ ++msgid "Buffered" ++msgstr "" ++ ++msgid "Buttons" ++msgstr "" ++ ++msgid "CA certificate; if empty it will be saved after the first connection." ++msgstr "" ++ ++msgid "CPU" ++msgstr "" ++ ++msgid "CPU usage (%)" ++msgstr "" ++ ++msgid "Cancel" ++msgstr "" ++ ++msgid "Category" ++msgstr "" ++ ++msgid "Chain" ++msgstr "" ++ ++msgid "Changes" ++msgstr "" ++ ++msgid "Changes applied." ++msgstr "" ++ ++msgid "Changes the administrator password for accessing the device" ++msgstr "" ++ ++msgid "Channel" ++msgstr "" ++ ++msgid "Check" ++msgstr "" ++ ++msgid "Checksum" ++msgstr "" ++ ++msgid "" ++"Choose the firewall zone you want to assign to this interface. Select " ++"unspecified to remove the interface from the associated zone or " ++"fill out the create field to define a new zone and attach the " ++"interface to it." ++msgstr "" ++ ++msgid "" ++"Choose the network(s) you want to attach to this wireless interface or fill " ++"out the create field to define a new network." ++msgstr "" ++ ++msgid "Cipher" ++msgstr "" ++ ++msgid "" ++"Click \"Generate archive\" to download a tar archive of the current " ++"configuration files. To reset the firmware to its initial state, click " ++"\"Perform reset\" (only possible with squashfs images)." ++msgstr "" ++ ++msgid "Client" ++msgstr "" ++ ++msgid "Client ID to send when requesting DHCP" ++msgstr "" ++ ++msgid "" ++"Close inactive connection after the given amount of seconds, use 0 to " ++"persist connection" ++msgstr "" ++ ++msgid "Close list..." ++msgstr "" ++ ++msgid "Collecting data..." ++msgstr "" ++ ++msgid "Command" ++msgstr "" ++ ++msgid "Common Configuration" ++msgstr "" ++ ++msgid "Compression" ++msgstr "" ++ ++msgid "Configuration" ++msgstr "" ++ ++msgid "Configuration applied." ++msgstr "" ++ ++msgid "Configuration files will be kept." ++msgstr "" ++ ++msgid "Confirmation" ++msgstr "" ++ ++msgid "Connect" ++msgstr "" ++ ++msgid "Connected" ++msgstr "" ++ ++msgid "Connection Limit" ++msgstr "" ++ ++msgid "Connection to server fails when TLS cannot be used" ++msgstr "" ++ ++msgid "Connections" ++msgstr "" ++ ++msgid "Country" ++msgstr "" ++ ++msgid "Country Code" ++msgstr "" ++ ++msgid "Cover the following interface" ++msgstr "" ++ ++msgid "Cover the following interfaces" ++msgstr "" ++ ++msgid "Create / Assign firewall-zone" ++msgstr "" ++ ++msgid "Create Interface" ++msgstr "" ++ ++msgid "Create a bridge over multiple interfaces" ++msgstr "" ++ ++msgid "Critical" ++msgstr "" ++ ++msgid "Cron Log Level" ++msgstr "" ++ ++msgid "Custom Interface" ++msgstr "" ++ ++msgid "Custom delegated IPv6-prefix" ++msgstr "" ++ ++msgid "" ++"Customizes the behaviour of the device LEDs if possible." ++msgstr "" ++ ++msgid "DHCP Leases" ++msgstr "" ++ ++msgid "DHCP Server" ++msgstr "" ++ ++msgid "DHCP and DNS" ++msgstr "" ++ ++msgid "DHCP client" ++msgstr "" ++ ++msgid "DHCP-Options" ++msgstr "" ++ ++msgid "DHCPv6 Leases" ++msgstr "" ++ ++msgid "DHCPv6 client" ++msgstr "" ++ ++msgid "DHCPv6-Mode" ++msgstr "" ++ ++msgid "DHCPv6-Service" ++msgstr "" ++ ++msgid "DNS" ++msgstr "" ++ ++msgid "DNS forwardings" ++msgstr "" ++ ++msgid "DNS-Label / FQDN" ++msgstr "" ++ ++msgid "DS-Lite AFTR address" ++msgstr "" ++ ++msgid "DUID" ++msgstr "" ++ ++msgid "Debug" ++msgstr "" ++ ++msgid "Default %d" ++msgstr "" ++ ++msgid "Default gateway" ++msgstr "" ++ ++msgid "Default route" ++msgstr "" ++ ++msgid "Default state" ++msgstr "" ++ ++msgid "Define a name for this network." ++msgstr "" ++ ++msgid "" ++"Define additional DHCP options, for example " ++"\"6,192.168.2.1,192.168.2.2\" which advertises different DNS " ++"servers to clients." ++msgstr "" ++ ++msgid "Delete" ++msgstr "" ++ ++msgid "Delete this interface" ++msgstr "" ++ ++msgid "Delete this network" ++msgstr "" ++ ++msgid "Description" ++msgstr "" ++ ++msgid "Design" ++msgstr "" ++ ++msgid "Destination" ++msgstr "" ++ ++msgid "Device" ++msgstr "" ++ ++msgid "Device Configuration" ++msgstr "" ++ ++msgid "Diagnostics" ++msgstr "" ++ ++msgid "Dial number" ++msgstr "" ++ ++msgid "Directory" ++msgstr "" ++ ++msgid "Disable" ++msgstr "" ++ ++msgid "" ++"Disable DHCP for " ++"this interface." ++msgstr "" ++ ++msgid "Disable DNS setup" ++msgstr "" ++ ++msgid "Disable HW-Beacon timer" ++msgstr "" ++ ++msgid "Disabled" ++msgstr "" ++ ++msgid "Discard upstream RFC1918 responses" ++msgstr "" ++ ++msgid "Displaying only packages containing" ++msgstr "" ++ ++msgid "Distance Optimization" ++msgstr "" ++ ++msgid "Distance to farthest network member in meters." ++msgstr "" ++ ++msgid "Diversity" ++msgstr "" ++ ++msgid "" ++"Dnsmasq is a combined DHCP-Server and DNS-" ++"Forwarder for NAT " ++"firewalls" ++msgstr "" ++ ++msgid "Do not cache negative replies, e.g. for not existing domains" ++msgstr "" ++ ++msgid "Do not forward requests that cannot be answered by public name servers" ++msgstr "" ++ ++msgid "Do not forward reverse lookups for local networks" ++msgstr "" ++ ++msgid "Do not send probe responses" ++msgstr "" ++ ++msgid "Domain required" ++msgstr "" ++ ++msgid "Domain whitelist" ++msgstr "" ++ ++msgid "" ++"Don't forward DNS-Requests without " ++"DNS-Name" ++msgstr "" ++ ++msgid "Download and install package" ++msgstr "" ++ ++msgid "Download backup" ++msgstr "" ++ ++msgid "Dropbear Instance" ++msgstr "" ++ ++msgid "" ++"Dropbear offers SSH network shell access " ++"and an integrated SCP server" ++msgstr "" ++ ++msgid "Dual-Stack Lite (RFC6333)" ++msgstr "" ++ ++msgid "Dynamic DHCP" ++msgstr "" ++ ++msgid "Dynamic tunnel" ++msgstr "" ++ ++msgid "" ++"Dynamically allocate DHCP addresses for clients. If disabled, only clients " ++"having static leases will be served." ++msgstr "" ++ ++msgid "EAP-Method" ++msgstr "" ++ ++msgid "Edit" ++msgstr "" ++ ++msgid "" ++"Edit the raw configuration data above to fix any error and hit \"Save\" to " ++"reload the page." ++msgstr "" ++ ++msgid "Edit this interface" ++msgstr "" ++ ++msgid "Edit this network" ++msgstr "" ++ ++msgid "Emergency" ++msgstr "" ++ ++msgid "Enable" ++msgstr "" ++ ++msgid "Enable STP" ++msgstr "" ++ ++msgid "Enable HE.net dynamic endpoint update" ++msgstr "" ++ ++msgid "Enable IPv6 negotiation on the PPP link" ++msgstr "" ++ ++msgid "Enable Jumbo Frame passthrough" ++msgstr "" ++ ++msgid "Enable NTP client" ++msgstr "" ++ ++msgid "Enable TFTP server" ++msgstr "" ++ ++msgid "Enable VLAN functionality" ++msgstr "" ++ ++msgid "Enable WPS pushbutton, requires WPA(2)-PSK" ++msgstr "" ++ ++msgid "Enable learning and aging" ++msgstr "" ++ ++msgid "Enable mirroring of incoming packets" ++msgstr "" ++ ++msgid "Enable mirroring of outgoing packets" ++msgstr "" ++ ++msgid "Enable this mount" ++msgstr "" ++ ++msgid "Enable this swap" ++msgstr "" ++ ++msgid "Enable/Disable" ++msgstr "" ++ ++msgid "Enabled" ++msgstr "" ++ ++msgid "Enables the Spanning Tree Protocol on this bridge" ++msgstr "" ++ ++msgid "Encapsulation mode" ++msgstr "" ++ ++msgid "Encryption" ++msgstr "" ++ ++msgid "Erasing..." ++msgstr "" ++ ++msgid "Error" ++msgstr "" ++ ++msgid "Ethernet Adapter" ++msgstr "" ++ ++msgid "Ethernet Switch" ++msgstr "" ++ ++msgid "Expand hosts" ++msgstr "" ++ ++msgid "Expires" ++msgstr "" ++ ++msgid "" ++"Expiry time of leased addresses, minimum is 2 minutes (2m)." ++msgstr "" ++ ++msgid "External" ++msgstr "" ++ ++msgid "External system log server" ++msgstr "" ++ ++msgid "External system log server port" ++msgstr "" ++ ++msgid "Fast Frames" ++msgstr "" ++ ++msgid "File" ++msgstr "" ++ ++msgid "Filename of the boot image advertised to clients" ++msgstr "" ++ ++msgid "Filesystem" ++msgstr "" ++ ++msgid "Filter" ++msgstr "" ++ ++msgid "Filter private" ++msgstr "" ++ ++msgid "Filter useless" ++msgstr "" ++ ++msgid "Find and join network" ++msgstr "" ++ ++msgid "Find package" ++msgstr "" ++ ++msgid "Finish" ++msgstr "" ++ ++msgid "Firewall" ++msgstr "" ++ ++msgid "Firewall Settings" ++msgstr "" ++ ++msgid "Firewall Status" ++msgstr "" ++ ++msgid "Firmware Version" ++msgstr "" ++ ++msgid "Fixed source port for outbound DNS queries" ++msgstr "" ++ ++msgid "Flags" ++msgstr "" ++ ++msgid "Flash Firmware" ++msgstr "" ++ ++msgid "Flash image..." ++msgstr "" ++ ++msgid "Flash new firmware image" ++msgstr "" ++ ++msgid "Flash operations" ++msgstr "" ++ ++msgid "Flashing..." ++msgstr "" ++ ++msgid "Force" ++msgstr "" ++ ++msgid "Force CCMP (AES)" ++msgstr "" ++ ++msgid "Force DHCP on this network even if another server is detected." ++msgstr "" ++ ++msgid "Force TKIP" ++msgstr "" ++ ++msgid "Force TKIP and CCMP (AES)" ++msgstr "" ++ ++msgid "Forward DHCP traffic" ++msgstr "" ++ ++msgid "Forward broadcast traffic" ++msgstr "" ++ ++msgid "Forwarding mode" ++msgstr "" ++ ++msgid "Fragmentation Threshold" ++msgstr "" ++ ++msgid "Frame Bursting" ++msgstr "" ++ ++msgid "Free" ++msgstr "" ++ ++msgid "Free space" ++msgstr "" ++ ++msgid "GHz" ++msgstr "" ++ ++msgid "GPRS only" ++msgstr "" ++ ++msgid "Gateway" ++msgstr "" ++ ++msgid "Gateway ports" ++msgstr "" ++ ++msgid "General Settings" ++msgstr "" ++ ++msgid "General Setup" ++msgstr "" ++ ++msgid "Generate archive" ++msgstr "" ++ ++msgid "Generic 802.11%s Wireless Controller" ++msgstr "" ++ ++msgid "Given password confirmation did not match, password not changed!" ++msgstr "" ++ ++msgid "Global network options" ++msgstr "" ++ ++msgid "Go to password configuration..." ++msgstr "" ++ ++msgid "Go to relevant configuration page" ++msgstr "" ++ ++msgid "Guest" ++msgstr "" ++ ++msgid "HE.net password" ++msgstr "" ++ ++msgid "HE.net username" ++msgstr "" ++ ++msgid "Handler" ++msgstr "" ++ ++msgid "Hang Up" ++msgstr "" ++ ++msgid "Heartbeat" ++msgstr "" ++ ++msgid "" ++"Here you can configure the basic aspects of your device like its hostname or " ++"the timezone." ++msgstr "" ++ ++msgid "" ++"Here you can paste public SSH-Keys (one per line) for SSH public-key " ++"authentication." ++msgstr "" ++ ++msgid "Hermes 802.11b Wireless Controller" ++msgstr "" ++ ++msgid "Hide ESSID" ++msgstr "" ++ ++msgid "Host entries" ++msgstr "" ++ ++msgid "Host expiry timeout" ++msgstr "" ++ ++msgid "Host-IP or Network" ++msgstr "" ++ ++msgid "Hostname" ++msgstr "" ++ ++msgid "Hostname to send when requesting DHCP" ++msgstr "" ++ ++msgid "Hostnames" ++msgstr "" ++ ++msgid "Hybrid" ++msgstr "" ++ ++msgid "IP address" ++msgstr "" ++ ++msgid "IPv4" ++msgstr "" ++ ++msgid "IPv4 Firewall" ++msgstr "" ++ ++msgid "IPv4 WAN Status" ++msgstr "" ++ ++msgid "IPv4 address" ++msgstr "" ++ ++msgid "IPv4 and IPv6" ++msgstr "" ++ ++msgid "IPv4 assignment length" ++msgstr "" ++ ++msgid "IPv4 broadcast" ++msgstr "" ++ ++msgid "IPv4 gateway" ++msgstr "" ++ ++msgid "IPv4 netmask" ++msgstr "" ++ ++msgid "IPv4 only" ++msgstr "" ++ ++msgid "IPv4 prefix length" ++msgstr "" ++ ++msgid "IPv4-Address" ++msgstr "" ++ ++msgid "IPv6" ++msgstr "" ++ ++msgid "IPv6 Firewall" ++msgstr "" ++ ++msgid "IPv6 Neighbours" ++msgstr "" ++ ++msgid "IPv6 Settings" ++msgstr "" ++ ++msgid "IPv6 ULA-Prefix" ++msgstr "" ++ ++msgid "IPv6 WAN Status" ++msgstr "" ++ ++msgid "IPv6 address" ++msgstr "" ++ ++msgid "IPv6 address delegated to the local tunnel endpoint (optional)" ++msgstr "" ++ ++msgid "IPv6 assignment hint" ++msgstr "" ++ ++msgid "IPv6 assignment length" ++msgstr "" ++ ++msgid "IPv6 gateway" ++msgstr "" ++ ++msgid "IPv6 only" ++msgstr "" ++ ++msgid "IPv6 prefix" ++msgstr "" ++ ++msgid "IPv6 prefix length" ++msgstr "" ++ ++msgid "IPv6 routed prefix" ++msgstr "" ++ ++msgid "IPv6-Address" ++msgstr "" ++ ++msgid "IPv6-in-IPv4 (RFC4213)" ++msgstr "" ++ ++msgid "IPv6-over-IPv4 (6rd)" ++msgstr "" ++ ++msgid "IPv6-over-IPv4 (6to4)" ++msgstr "" ++ ++msgid "Identity" ++msgstr "" ++ ++msgid "" ++"If specified, mount the device by its UUID instead of a fixed device node" ++msgstr "" ++ ++msgid "" ++"If specified, mount the device by the partition label instead of a fixed " ++"device node" ++msgstr "" ++ ++msgid "If unchecked, no default route is configured" ++msgstr "" ++ ++msgid "If unchecked, the advertised DNS server addresses are ignored" ++msgstr "" ++ ++msgid "" ++"If your physical memory is insufficient unused data can be temporarily " ++"swapped to a swap-device resulting in a higher amount of usable RAM. Be aware that swapping data is a very " ++"slow process as the swap-device cannot be accessed with the high datarates " ++"of the RAM." ++msgstr "" ++ ++msgid "Ignore Hosts files" ++msgstr "" ++ ++msgid "Ignore interface" ++msgstr "" ++ ++msgid "Ignore resolve file" ++msgstr "" ++ ++msgid "Image" ++msgstr "" ++ ++msgid "In" ++msgstr "" ++ ++msgid "Inactivity timeout" ++msgstr "" ++ ++msgid "Inbound:" ++msgstr "" ++ ++msgid "Info" ++msgstr "" ++ ++msgid "Initscript" ++msgstr "" ++ ++msgid "Initscripts" ++msgstr "" ++ ++msgid "Install" ++msgstr "" ++ ++msgid "Install iputils-traceroute6 for IPv6 traceroute" ++msgstr "" ++ ++msgid "Install package %q" ++msgstr "" ++ ++msgid "Install protocol extensions..." ++msgstr "" ++ ++msgid "Installed packages" ++msgstr "" ++ ++msgid "Interface" ++msgstr "" ++ ++msgid "Interface Configuration" ++msgstr "" ++ ++msgid "Interface Overview" ++msgstr "" ++ ++msgid "Interface is reconnecting..." ++msgstr "" ++ ++msgid "Interface is shutting down..." ++msgstr "" ++ ++msgid "Interface not present or not connected yet." ++msgstr "" ++ ++msgid "Interface reconnected" ++msgstr "" ++ ++msgid "Interface shut down" ++msgstr "" ++ ++msgid "Interfaces" ++msgstr "" ++ ++msgid "Internal" ++msgstr "" ++ ++msgid "Internal Server Error" ++msgstr "" ++ ++msgid "Invalid" ++msgstr "" ++ ++msgid "Invalid VLAN ID given! Only IDs between %d and %d are allowed." ++msgstr "" ++ ++msgid "Invalid VLAN ID given! Only unique IDs are allowed" ++msgstr "" ++ ++msgid "Invalid username and/or password! Please try again." ++msgstr "" ++ ++msgid "" ++"It appears that you are trying to flash an image that does not fit into the " ++"flash memory, please verify the image file!" ++msgstr "" ++ ++msgid "Java Script required!" ++msgstr "" ++ ++msgid "Join Network" ++msgstr "" ++ ++msgid "Join Network: Settings" ++msgstr "" ++ ++msgid "Join Network: Wireless Scan" ++msgstr "" ++ ++msgid "Keep settings" ++msgstr "" ++ ++msgid "Kernel Log" ++msgstr "" ++ ++msgid "Kernel Version" ++msgstr "" ++ ++msgid "Key" ++msgstr "" ++ ++msgid "Key #%d" ++msgstr "" ++ ++msgid "Kill" ++msgstr "" ++ ++msgid "L2TP" ++msgstr "" ++ ++msgid "L2TP Server" ++msgstr "" ++ ++msgid "LCP echo failure threshold" ++msgstr "" ++ ++msgid "LCP echo interval" ++msgstr "" ++ ++msgid "LLC" ++msgstr "" ++ ++msgid "Label" ++msgstr "" ++ ++msgid "Language" ++msgstr "" ++ ++msgid "Language and Style" ++msgstr "" ++ ++msgid "Leaf" ++msgstr "" ++ ++msgid "Lease validity time" ++msgstr "" ++ ++msgid "Leasefile" ++msgstr "" ++ ++msgid "Leasetime" ++msgstr "" ++ ++msgid "Leasetime remaining" ++msgstr "" ++ ++msgid "Leave empty to autodetect" ++msgstr "" ++ ++msgid "Leave empty to use the current WAN address" ++msgstr "" ++ ++msgid "Legend:" ++msgstr "" ++ ++msgid "Limit" ++msgstr "" ++ ++msgid "Line Attenuation" ++msgstr "" ++ ++msgid "Line Speed" ++msgstr "" ++ ++msgid "Line State" ++msgstr "" ++ ++msgid "Link On" ++msgstr "" ++ ++msgid "" ++"List of DNS servers to forward " ++"requests to" ++msgstr "" ++ ++msgid "List of domains to allow RFC1918 responses for" ++msgstr "" ++ ++msgid "List of hosts that supply bogus NX domain results" ++msgstr "" ++ ++msgid "Listen only on the given interface or, if unspecified, on all" ++msgstr "" ++ ++msgid "Listening port for inbound DNS queries" ++msgstr "" ++ ++msgid "Load" ++msgstr "" ++ ++msgid "Load Average" ++msgstr "" ++ ++msgid "Loading" ++msgstr "" ++ ++msgid "Local IPv4 address" ++msgstr "" ++ ++msgid "Local IPv6 address" ++msgstr "" ++ ++msgid "Local Startup" ++msgstr "" ++ ++msgid "Local Time" ++msgstr "" ++ ++msgid "Local domain" ++msgstr "" ++ ++msgid "" ++"Local domain specification. Names matching this domain are never forwarded " ++"and are resolved from DHCP or hosts files only" ++msgstr "" ++ ++msgid "Local domain suffix appended to DHCP names and hosts file entries" ++msgstr "" ++ ++msgid "Local server" ++msgstr "" ++ ++msgid "" ++"Localise hostname depending on the requesting subnet if multiple IPs are " ++"available" ++msgstr "" ++ ++msgid "Localise queries" ++msgstr "" ++ ++msgid "Locked to channel %d used by: %s" ++msgstr "" ++ ++msgid "Log output level" ++msgstr "" ++ ++msgid "Log queries" ++msgstr "" ++ ++msgid "Logging" ++msgstr "" ++ ++msgid "Login" ++msgstr "" ++ ++msgid "Logout" ++msgstr "" ++ ++msgid "Lowest leased address as offset from the network address." ++msgstr "" ++ ++msgid "MAC-Address" ++msgstr "" ++ ++msgid "MAC-Address Filter" ++msgstr "" ++ ++msgid "MAC-Filter" ++msgstr "" ++ ++msgid "MAC-List" ++msgstr "" ++ ++msgid "MB/s" ++msgstr "" ++ ++msgid "MHz" ++msgstr "" ++ ++msgid "MTU" ++msgstr "" ++ ++msgid "" ++"Make sure to clone the root filesystem using something like the commands " ++"below:" ++msgstr "" ++ ++msgid "Maximum Rate" ++msgstr "" ++ ++msgid "Maximum allowed number of active DHCP leases" ++msgstr "" ++ ++msgid "Maximum allowed number of concurrent DNS queries" ++msgstr "" ++ ++msgid "Maximum allowed size of EDNS.0 UDP packets" ++msgstr "" ++ ++msgid "Maximum amount of seconds to wait for the modem to become ready" ++msgstr "" ++ ++msgid "Maximum hold time" ++msgstr "" ++ ++msgid "Maximum number of leased addresses." ++msgstr "" ++ ++msgid "Mbit/s" ++msgstr "" ++ ++msgid "Memory" ++msgstr "" ++ ++msgid "Memory usage (%)" ++msgstr "" ++ ++msgid "Metric" ++msgstr "" ++ ++msgid "Minimum Rate" ++msgstr "" ++ ++msgid "Minimum hold time" ++msgstr "" ++ ++msgid "Mirror monitor port" ++msgstr "" ++ ++msgid "Mirror source port" ++msgstr "" ++ ++msgid "Missing protocol extension for proto %q" ++msgstr "" ++ ++msgid "Mode" ++msgstr "" ++ ++msgid "Model" ++msgstr "" ++ ++msgid "Modem device" ++msgstr "" ++ ++msgid "Modem init timeout" ++msgstr "" ++ ++msgid "Monitor" ++msgstr "" ++ ++msgid "Mount Entry" ++msgstr "" ++ ++msgid "Mount Point" ++msgstr "" ++ ++msgid "Mount Points" ++msgstr "" ++ ++msgid "Mount Points - Mount Entry" ++msgstr "" ++ ++msgid "Mount Points - Swap Entry" ++msgstr "" ++ ++msgid "" ++"Mount Points define at which point a memory device will be attached to the " ++"filesystem" ++msgstr "" ++ ++msgid "Mount options" ++msgstr "" ++ ++msgid "Mount point" ++msgstr "" ++ ++msgid "Mounted file systems" ++msgstr "" ++ ++msgid "Move down" ++msgstr "" ++ ++msgid "Move up" ++msgstr "" ++ ++msgid "Multicast Rate" ++msgstr "" ++ ++msgid "Multicast address" ++msgstr "" ++ ++msgid "NAS ID" ++msgstr "" ++ ++msgid "NDP-Proxy" ++msgstr "" ++ ++msgid "NTP server candidates" ++msgstr "" ++ ++msgid "NTP sync time-out" ++msgstr "" ++ ++msgid "Name" ++msgstr "" ++ ++msgid "Name of the new interface" ++msgstr "" ++ ++msgid "Name of the new network" ++msgstr "" ++ ++msgid "Navigation" ++msgstr "" ++ ++msgid "Netmask" ++msgstr "" ++ ++msgid "Network" ++msgstr "" ++ ++msgid "Network Utilities" ++msgstr "" ++ ++msgid "Network boot image" ++msgstr "" ++ ++msgid "Network without interfaces." ++msgstr "" ++ ++msgid "Next »" ++msgstr "" ++ ++msgid "No DHCP Server configured for this interface" ++msgstr "" ++ ++msgid "No chains in this table" ++msgstr "" ++ ++msgid "No files found" ++msgstr "" ++ ++msgid "No information available" ++msgstr "" ++ ++msgid "No negative cache" ++msgstr "" ++ ++msgid "No network configured on this device" ++msgstr "" ++ ++msgid "No network name specified" ++msgstr "" ++ ++msgid "No package lists available" ++msgstr "" ++ ++msgid "No password set!" ++msgstr "" ++ ++msgid "No rules in this chain" ++msgstr "" ++ ++msgid "No zone assigned" ++msgstr "" ++ ++msgid "Noise" ++msgstr "" ++ ++msgid "Noise Margin" ++msgstr "" ++ ++msgid "Noise:" ++msgstr "" ++ ++msgid "None" ++msgstr "" ++ ++msgid "Normal" ++msgstr "" ++ ++msgid "Not Found" ++msgstr "" ++ ++msgid "Not associated" ++msgstr "" ++ ++msgid "Not connected" ++msgstr "" ++ ++msgid "Note: Configuration files will be erased." ++msgstr "" ++ ++msgid "Notice" ++msgstr "" ++ ++msgid "Nslookup" ++msgstr "" ++ ++msgid "OK" ++msgstr "" ++ ++msgid "OPKG-Configuration" ++msgstr "" ++ ++msgid "Off-State Delay" ++msgstr "" ++ ++msgid "" ++"On this page you can configure the network interfaces. You can bridge " ++"several interfaces by ticking the \"bridge interfaces\" field and enter the " ++"names of several network interfaces separated by spaces. You can also use " ++"VLAN notation " ++"INTERFACE.VLANNR (e.g.: " ++"eth0.1)." ++msgstr "" ++ ++msgid "On-State Delay" ++msgstr "" ++ ++msgid "One of hostname or mac address must be specified!" ++msgstr "" ++ ++msgid "One or more fields contain invalid values!" ++msgstr "" ++ ++msgid "One or more required fields have no value!" ++msgstr "" ++ ++msgid "Open list..." ++msgstr "" ++ ++msgid "OpenConnect (CISCO AnyConnect)" ++msgstr "" ++ ++msgid "Operating frequency" ++msgstr "" ++ ++msgid "Option changed" ++msgstr "" ++ ++msgid "Option removed" ++msgstr "" ++ ++msgid "Optional, specify to override default server (tic.sixxs.net)" ++msgstr "" ++ ++msgid "Optional, use when the SIXXS account has more than one tunnel" ++msgstr "" ++ ++msgid "Options" ++msgstr "" ++ ++msgid "Other:" ++msgstr "" ++ ++msgid "Out" ++msgstr "" ++ ++msgid "Outbound:" ++msgstr "" ++ ++msgid "Outdoor Channels" ++msgstr "" ++ ++msgid "Output Interface" ++msgstr "" ++ ++msgid "Override MAC address" ++msgstr "" ++ ++msgid "Override MTU" ++msgstr "" ++ ++msgid "Override the gateway in DHCP responses" ++msgstr "" ++ ++msgid "" ++"Override the netmask sent to clients. Normally it is calculated from the " ++"subnet that is served." ++msgstr "" ++ ++msgid "Override the table used for internal routes" ++msgstr "" ++ ++msgid "Overview" ++msgstr "" ++ ++msgid "Owner" ++msgstr "" ++ ++msgid "PAP/CHAP password" ++msgstr "" ++ ++msgid "PAP/CHAP username" ++msgstr "" ++ ++msgid "PID" ++msgstr "" ++ ++msgid "PIN" ++msgstr "" ++ ++msgid "PPP" ++msgstr "" ++ ++msgid "PPPoA Encapsulation" ++msgstr "" ++ ++msgid "PPPoATM" ++msgstr "" ++ ++msgid "PPPoE" ++msgstr "" ++ ++msgid "PPtP" ++msgstr "" ++ ++msgid "Package libiwinfo required!" ++msgstr "" ++ ++msgid "Package lists are older than 24 hours" ++msgstr "" ++ ++msgid "Package name" ++msgstr "" ++ ++msgid "Packets" ++msgstr "" ++ ++msgid "Part of zone %q" ++msgstr "" ++ ++msgid "Password" ++msgstr "" ++ ++msgid "Password authentication" ++msgstr "" ++ ++msgid "Password of Private Key" ++msgstr "" ++ ++msgid "Password successfully changed!" ++msgstr "" ++ ++msgid "Path" ++msgstr "" ++ ++msgid "Path to CA-Certificate" ++msgstr "" ++ ++msgid "Path to Client-Certificate" ++msgstr "" ++ ++msgid "Path to Private Key" ++msgstr "" ++ ++msgid "Path to executable which handles the button event" ++msgstr "" ++ ++msgid "Peak:" ++msgstr "" ++ ++msgid "Perform reboot" ++msgstr "" ++ ++msgid "Perform reset" ++msgstr "" ++ ++msgid "Phy Rate:" ++msgstr "" ++ ++msgid "Physical Settings" ++msgstr "" ++ ++msgid "Ping" ++msgstr "" ++ ++msgid "Pkts." ++msgstr "" ++ ++msgid "Please enter your username and password." ++msgstr "" ++ ++msgid "Please wait: Device rebooting..." ++msgstr "" ++ ++msgid "Policy" ++msgstr "" ++ ++msgid "Port" ++msgstr "" ++ ++msgid "Port %d" ++msgstr "" ++ ++msgid "Port %d is untagged in multiple VLANs!" ++msgstr "" ++ ++msgid "Port status:" ++msgstr "" ++ ++msgid "" ++"Presume peer to be dead after given amount of LCP echo failures, use 0 to " ++"ignore failures" ++msgstr "" ++ ++msgid "Prevents client-to-client communication" ++msgstr "" ++ ++msgid "Prism2/2.5/3 802.11b Wireless Controller" ++msgstr "" ++ ++msgid "Proceed" ++msgstr "" ++ ++msgid "Processes" ++msgstr "" ++ ++msgid "Prot." ++msgstr "" ++ ++msgid "Protocol" ++msgstr "" ++ ++msgid "Protocol family" ++msgstr "" ++ ++msgid "Protocol of the new interface" ++msgstr "" ++ ++msgid "Protocol support is not installed" ++msgstr "" ++ ++msgid "Provide NTP server" ++msgstr "" ++ ++msgid "Provide new network" ++msgstr "" ++ ++msgid "Pseudo Ad-Hoc (ahdemo)" ++msgstr "" ++ ++msgid "Public prefix routed to this device for distribution to clients." ++msgstr "" ++ ++msgid "Quality" ++msgstr "" ++ ++msgid "RTS/CTS Threshold" ++msgstr "" ++ ++msgid "RX" ++msgstr "" ++ ++msgid "RX Rate" ++msgstr "" ++ ++msgid "RaLink 802.11%s Wireless Controller" ++msgstr "" ++ ++msgid "Radius-Accounting-Port" ++msgstr "" ++ ++msgid "Radius-Accounting-Secret" ++msgstr "" ++ ++msgid "Radius-Accounting-Server" ++msgstr "" ++ ++msgid "Radius-Authentication-Port" ++msgstr "" ++ ++msgid "Radius-Authentication-Secret" ++msgstr "" ++ ++msgid "Radius-Authentication-Server" ++msgstr "" ++ ++msgid "" ++"Read /etc/ethers to configure the DHCP-Server" ++msgstr "" ++ ++msgid "" ++"Really delete this interface? The deletion cannot be undone!\\nYou might " ++"lose access to this device if you are connected via this interface." ++msgstr "" ++ ++msgid "" ++"Really delete this wireless network? The deletion cannot be undone!\\nYou " ++"might lose access to this device if you are connected via this network." ++msgstr "" ++ ++msgid "Really reset all changes?" ++msgstr "" ++ ++msgid "" ++"Really shut down network?\\nYou might lose access to this device if you are " ++"connected via this interface." ++msgstr "" ++ ++msgid "" ++"Really shutdown interface \"%s\" ?\\nYou might lose access to this device if " ++"you are connected via this interface." ++msgstr "" ++ ++msgid "Really switch protocol?" ++msgstr "" ++ ++msgid "Realtime Connections" ++msgstr "" ++ ++msgid "Realtime Graphs" ++msgstr "" ++ ++msgid "Realtime Load" ++msgstr "" ++ ++msgid "Realtime Traffic" ++msgstr "" ++ ++msgid "Realtime Wireless" ++msgstr "" ++ ++msgid "Rebind protection" ++msgstr "" ++ ++msgid "Reboot" ++msgstr "" ++ ++msgid "Rebooting..." ++msgstr "" ++ ++msgid "Reboots the operating system of your device" ++msgstr "" ++ ++msgid "Receive" ++msgstr "" ++ ++msgid "Receiver Antenna" ++msgstr "" ++ ++msgid "Reconnect this interface" ++msgstr "" ++ ++msgid "Reconnecting interface" ++msgstr "" ++ ++msgid "References" ++msgstr "" ++ ++msgid "Regulatory Domain" ++msgstr "" ++ ++msgid "Relay" ++msgstr "" ++ ++msgid "Relay Bridge" ++msgstr "" ++ ++msgid "Relay between networks" ++msgstr "" ++ ++msgid "Relay bridge" ++msgstr "" ++ ++msgid "Remote IPv4 address" ++msgstr "" ++ ++msgid "Remove" ++msgstr "" ++ ++msgid "Repeat scan" ++msgstr "" ++ ++msgid "Replace entry" ++msgstr "" ++ ++msgid "Replace wireless configuration" ++msgstr "" ++ ++msgid "Request IPv6-address" ++msgstr "" ++ ++msgid "Request IPv6-prefix of length" ++msgstr "" ++ ++msgid "Require TLS" ++msgstr "" ++ ++msgid "Required for certain ISPs, e.g. Charter with DOCSIS 3" ++msgstr "" ++ ++msgid "Reset" ++msgstr "" ++ ++msgid "Reset Counters" ++msgstr "" ++ ++msgid "Reset to defaults" ++msgstr "" ++ ++msgid "Resolv and Hosts Files" ++msgstr "" ++ ++msgid "Resolve file" ++msgstr "" ++ ++msgid "Restart" ++msgstr "" ++ ++msgid "Restart Firewall" ++msgstr "" ++ ++msgid "Restore backup" ++msgstr "" ++ ++msgid "Reveal/hide password" ++msgstr "" ++ ++msgid "Revert" ++msgstr "" ++ ++msgid "Root" ++msgstr "" ++ ++msgid "Root directory for files served via TFTP" ++msgstr "" ++ ++msgid "Root preparation" ++msgstr "" ++ ++msgid "Routed IPv6 prefix for downstream interfaces" ++msgstr "" ++ ++msgid "Router Advertisement-Service" ++msgstr "" ++ ++msgid "Router Password" ++msgstr "" ++ ++msgid "Routes" ++msgstr "" ++ ++msgid "" ++"Routes specify over which interface and gateway a certain host or network " ++"can be reached." ++msgstr "" ++ ++msgid "Rule #" ++msgstr "" ++ ++msgid "Run a filesystem check before mounting the device" ++msgstr "" ++ ++msgid "Run filesystem check" ++msgstr "" ++ ++msgid "" ++"SIXXS supports TIC only, for static tunnels using IP protocol 41 (RFC4213) " ++"use 6in4 instead" ++msgstr "" ++ ++msgid "SIXXS-handle[/Tunnel-ID]" ++msgstr "" ++ ++msgid "SSH Access" ++msgstr "" ++ ++msgid "SSH-Keys" ++msgstr "" ++ ++msgid "SSID" ++msgstr "" ++ ++msgid "Save" ++msgstr "" ++ ++msgid "Save & Apply" ++msgstr "" ++ ++msgid "Save & Apply" ++msgstr "" ++ ++msgid "Scan" ++msgstr "" ++ ++msgid "Scheduled Tasks" ++msgstr "" ++ ++msgid "Section added" ++msgstr "" ++ ++msgid "Section removed" ++msgstr "" ++ ++msgid "See \"mount\" manpage for details" ++msgstr "" ++ ++msgid "" ++"Send LCP echo requests at the given interval in seconds, only effective in " ++"conjunction with failure threshold" ++msgstr "" ++ ++msgid "Separate Clients" ++msgstr "" ++ ++msgid "Separate WDS" ++msgstr "" ++ ++msgid "Server Settings" ++msgstr "" ++ ++msgid "Server password" ++msgstr "" ++ ++msgid "" ++"Server password, enter the specific password of the tunnel when the username " ++"contains the tunnel ID" ++msgstr "" ++ ++msgid "Server username" ++msgstr "" ++ ++msgid "Service Name" ++msgstr "" ++ ++msgid "Service Type" ++msgstr "" ++ ++msgid "Services" ++msgstr "" ++ ++msgid "Set up Time Synchronization" ++msgstr "" ++ ++msgid "Setup DHCP Server" ++msgstr "" ++ ++msgid "Show current backup file list" ++msgstr "" ++ ++msgid "Shutdown this interface" ++msgstr "" ++ ++msgid "Shutdown this network" ++msgstr "" ++ ++msgid "Signal" ++msgstr "" ++ ++msgid "Signal:" ++msgstr "" ++ ++msgid "Size" ++msgstr "" ++ ++msgid "Skip" ++msgstr "" ++ ++msgid "Skip to content" ++msgstr "" ++ ++msgid "Skip to navigation" ++msgstr "" ++ ++msgid "Slot time" ++msgstr "" ++ ++msgid "Software" ++msgstr "" ++ ++msgid "Some fields are invalid, cannot save values!" ++msgstr "" ++ ++msgid "Sorry, the object you requested was not found." ++msgstr "" ++ ++msgid "Sorry, the server encountered an unexpected error." ++msgstr "" ++ ++msgid "" ++"Sorry, there is no sysupgrade support present; a new firmware image must be " ++"flashed manually. Please refer to the OpenWrt wiki for device specific " ++"install instructions." ++msgstr "" ++ ++msgid "Sort" ++msgstr "" ++ ++msgid "Source" ++msgstr "" ++ ++msgid "Source routing" ++msgstr "" ++ ++msgid "Specifies the button state to handle" ++msgstr "" ++ ++msgid "Specifies the directory the device is attached to" ++msgstr "" ++ ++msgid "Specifies the listening port of this Dropbear instance" ++msgstr "" ++ ++msgid "" ++"Specifies the maximum amount of failed ARP requests until hosts are presumed " ++"to be dead" ++msgstr "" ++ ++msgid "" ++"Specifies the maximum amount of seconds after which hosts are presumed to be " ++"dead" ++msgstr "" ++ ++msgid "Specify the secret encryption key here." ++msgstr "" ++ ++msgid "Start" ++msgstr "" ++ ++msgid "Start priority" ++msgstr "" ++ ++msgid "Startup" ++msgstr "" ++ ++msgid "Static IPv4 Routes" ++msgstr "" ++ ++msgid "Static IPv6 Routes" ++msgstr "" ++ ++msgid "Static Leases" ++msgstr "" ++ ++msgid "Static Routes" ++msgstr "" ++ ++msgid "Static WDS" ++msgstr "" ++ ++msgid "Static address" ++msgstr "" ++ ++msgid "" ++"Static leases are used to assign fixed IP addresses and symbolic hostnames " ++"to DHCP clients. They are also required for non-dynamic interface " ++"configurations where only hosts with a corresponding lease are served." ++msgstr "" ++ ++msgid "Status" ++msgstr "" ++ ++msgid "Stop" ++msgstr "" ++ ++msgid "Strict order" ++msgstr "" ++ ++msgid "Submit" ++msgstr "" ++ ++msgid "Swap" ++msgstr "" ++ ++msgid "Swap Entry" ++msgstr "" ++ ++msgid "Switch" ++msgstr "" ++ ++msgid "Switch %q" ++msgstr "" ++ ++msgid "Switch %q (%s)" ++msgstr "" ++ ++msgid "Switch protocol" ++msgstr "" ++ ++msgid "Sync with browser" ++msgstr "" ++ ++msgid "Synchronizing..." ++msgstr "" ++ ++msgid "System" ++msgstr "" ++ ++msgid "System Log" ++msgstr "" ++ ++msgid "System Properties" ++msgstr "" ++ ++msgid "System log buffer size" ++msgstr "" ++ ++msgid "TCP:" ++msgstr "" ++ ++msgid "TFTP Settings" ++msgstr "" ++ ++msgid "TFTP server root" ++msgstr "" ++ ++msgid "TX" ++msgstr "" ++ ++msgid "TX Rate" ++msgstr "" ++ ++msgid "Table" ++msgstr "" ++ ++msgid "Target" ++msgstr "" ++ ++msgid "Terminate" ++msgstr "" ++ ++msgid "" ++"The Device Configuration section covers physical settings of the " ++"radio hardware such as channel, transmit power or antenna selection which " ++"are shared among all defined wireless networks (if the radio hardware is " ++"multi-SSID capable). Per network settings like encryption or operation mode " ++"are grouped in the Interface Configuration." ++msgstr "" ++ ++msgid "" ++"The libiwinfo-lua package is not installed. You must install this " ++"component for working wireless configuration!" ++msgstr "" ++ ++msgid "" ++"The HE.net endpoint update configuration changed, you must now use the plain " ++"username instead of the user ID!" ++msgstr "" ++ ++msgid "" ++"The IPv6 prefix assigned to the provider, usually ends with ::" ++msgstr "" ++ ++msgid "" ++"The allowed characters are: A-Z, a-z, 0-9 and _" ++msgstr "" ++ ++msgid "The configuration file could not be loaded due to the following error:" ++msgstr "" ++ ++msgid "" ++"The device file of the memory or partition (e.g." ++" /dev/sda1)" ++msgstr "" ++ ++msgid "" ++"The filesystem that was used to format the memory (e.g. ext3)" ++msgstr "" ++ ++msgid "" ++"The flash image was uploaded. Below is the checksum and file size listed, " ++"compare them with the original file to ensure data integrity.
    Click " ++"\"Proceed\" below to start the flash procedure." ++msgstr "" ++ ++msgid "The following changes have been committed" ++msgstr "" ++ ++msgid "The following changes have been reverted" ++msgstr "" ++ ++msgid "The following rules are currently active on this system." ++msgstr "" ++ ++msgid "The given network name is not unique" ++msgstr "" ++ ++msgid "" ++"The hardware is not multi-SSID capable and the existing configuration will " ++"be replaced if you proceed." ++msgstr "" ++ ++msgid "" ++"The length of the IPv4 prefix in bits, the remainder is used in the IPv6 " ++"addresses." ++msgstr "" ++ ++msgid "The length of the IPv6 prefix in bits" ++msgstr "" ++ ++msgid "" ++"The network ports on this device can be combined to several VLANs in which computers can " ++"communicate directly with each other. VLANs are often used to separate different network " ++"segments. Often there is by default one Uplink port for a connection to the " ++"next greater network like the internet and other ports for a local network." ++msgstr "" ++ ++msgid "The selected protocol needs a device assigned" ++msgstr "" ++ ++msgid "" ++"The system is erasing the configuration partition now and will reboot itself " ++"when finished." ++msgstr "" ++ ++msgid "" ++"The system is flashing now.
    DO NOT POWER OFF THE DEVICE!
    Wait a " ++"few minutes before you try to reconnect. It might be necessary to renew the " ++"address of your computer to reach the device again, depending on your " ++"settings." ++msgstr "" ++ ++msgid "" ++"The tunnel end-point is behind NAT, defaults to disabled and only applies to " ++"AYIYA" ++msgstr "" ++ ++msgid "" ++"The uploaded image file does not contain a supported format. Make sure that " ++"you choose the generic image format for your platform." ++msgstr "" ++ ++msgid "There are no active leases." ++msgstr "" ++ ++msgid "There are no pending changes to apply!" ++msgstr "" ++ ++msgid "There are no pending changes to revert!" ++msgstr "" ++ ++msgid "There are no pending changes!" ++msgstr "" ++ ++msgid "" ++"There is no device assigned yet, please attach a network device in the " ++"\"Physical Settings\" tab" ++msgstr "" ++ ++msgid "" ++"There is no password set on this router. Please configure a root password to " ++"protect the web interface and enable SSH." ++msgstr "" ++ ++msgid "This IPv4 address of the relay" ++msgstr "" ++ ++msgid "" ++"This is a list of shell glob patterns for matching files and directories to " ++"include during sysupgrade. Modified files in /etc/config/ and certain other " ++"configurations are automatically preserved." ++msgstr "" ++ ++msgid "" ++"This is either the \"Update Key\" configured for the tunnel or the account " ++"password if no update key has been configured" ++msgstr "" ++ ++msgid "" ++"This is the content of /etc/rc.local. Insert your own commands here (in " ++"front of 'exit 0') to execute them at the end of the boot process." ++msgstr "" ++ ++msgid "" ++"This is the local endpoint address assigned by the tunnel broker, it usually " ++"ends with :2" ++msgstr "" ++ ++msgid "" ++"This is the only DHCP in the local network" ++msgstr "" ++ ++msgid "This is the plain username for logging into the account" ++msgstr "" ++ ++msgid "" ++"This is the prefix routed to you by the tunnel broker for use by clients" ++msgstr "" ++ ++msgid "This is the system crontab in which scheduled tasks can be defined." ++msgstr "" ++ ++msgid "" ++"This is usually the address of the nearest PoP operated by the tunnel broker" ++msgstr "" ++ ++msgid "" ++"This list gives an overview over currently running system processes and " ++"their status." ++msgstr "" ++ ++msgid "This page allows the configuration of custom button actions" ++msgstr "" ++ ++msgid "This page gives an overview over currently active network connections." ++msgstr "" ++ ++msgid "This section contains no values yet" ++msgstr "" ++ ++msgid "Time Synchronization" ++msgstr "" ++ ++msgid "Time Synchronization is not configured yet." ++msgstr "" ++ ++msgid "Timezone" ++msgstr "" ++ ++msgid "" ++"To restore configuration files, you can upload a previously generated backup " ++"archive here." ++msgstr "" ++ ++msgid "Total Available" ++msgstr "" ++ ++msgid "Traceroute" ++msgstr "" ++ ++msgid "Traffic" ++msgstr "" ++ ++msgid "Transfer" ++msgstr "" ++ ++msgid "Transmission Rate" ++msgstr "" ++ ++msgid "Transmit" ++msgstr "" ++ ++msgid "Transmit Power" ++msgstr "" ++ ++msgid "Transmitter Antenna" ++msgstr "" ++ ++msgid "Trigger" ++msgstr "" ++ ++msgid "Trigger Mode" ++msgstr "" ++ ++msgid "Tunnel ID" ++msgstr "" ++ ++msgid "Tunnel Interface" ++msgstr "" ++ ++msgid "Tunnel Link" ++msgstr "" ++ ++msgid "Tunnel broker protocol" ++msgstr "" ++ ++msgid "Tunnel setup server" ++msgstr "" ++ ++msgid "Tunnel type" ++msgstr "" ++ ++msgid "Turbo Mode" ++msgstr "" ++ ++msgid "Tx-Power" ++msgstr "" ++ ++msgid "Type" ++msgstr "" ++ ++msgid "UDP:" ++msgstr "" ++ ++msgid "UMTS only" ++msgstr "" ++ ++msgid "UMTS/GPRS/EV-DO" ++msgstr "" ++ ++msgid "USB Device" ++msgstr "" ++ ++msgid "UUID" ++msgstr "" ++ ++msgid "Unable to dispatch" ++msgstr "" ++ ++msgid "Unknown" ++msgstr "" ++ ++msgid "Unknown Error, password not changed!" ++msgstr "" ++ ++msgid "Unmanaged" ++msgstr "" ++ ++msgid "Unsaved Changes" ++msgstr "" ++ ++msgid "Unsupported protocol type." ++msgstr "" ++ ++msgid "Update lists" ++msgstr "" ++ ++msgid "" ++"Upload a sysupgrade-compatible image here to replace the running firmware. " ++"Check \"Keep settings\" to retain the current configuration (requires an " ++"OpenWrt compatible firmware image)." ++msgstr "" ++ ++msgid "Upload archive..." ++msgstr "" ++ ++msgid "Uploaded File" ++msgstr "" ++ ++msgid "Uptime" ++msgstr "" ++ ++msgid "Use /etc/ethers" ++msgstr "" ++ ++msgid "Use DHCP gateway" ++msgstr "" ++ ++msgid "Use DNS servers advertised by peer" ++msgstr "" ++ ++msgid "Use ISO/IEC 3166 alpha2 country codes." ++msgstr "" ++ ++msgid "Use MTU on tunnel interface" ++msgstr "" ++ ++msgid "Use TTL on tunnel interface" ++msgstr "" ++ ++msgid "Use as external overlay (/overlay)" ++msgstr "" ++ ++msgid "Use as root filesystem (/)" ++msgstr "" ++ ++msgid "Use broadcast flag" ++msgstr "" ++ ++msgid "Use builtin IPv6-management" ++msgstr "" ++ ++msgid "Use custom DNS servers" ++msgstr "" ++ ++msgid "Use default gateway" ++msgstr "" ++ ++msgid "Use gateway metric" ++msgstr "" ++ ++msgid "Use routing table" ++msgstr "" ++ ++msgid "" ++"Use the Add Button to add a new lease entry. The MAC-Address indentifies the host, the IPv4-Address specifies to the fixed " ++"address to use and the Hostname is assigned as symbolic name to the " ++"requesting host." ++msgstr "" ++ ++msgid "Used" ++msgstr "" ++ ++msgid "Used Key Slot" ++msgstr "" ++ ++msgid "User certificate (PEM encoded)" ++msgstr "" ++ ++msgid "User key (PEM encoded)" ++msgstr "" ++ ++msgid "Username" ++msgstr "" ++ ++msgid "VC-Mux" ++msgstr "" ++ ++msgid "VLAN Interface" ++msgstr "" ++ ++msgid "VLANs on %q" ++msgstr "" ++ ++msgid "VLANs on %q (%s)" ++msgstr "" ++ ++msgid "VPN Server" ++msgstr "" ++ ++msgid "VPN Server port" ++msgstr "" ++ ++msgid "VPN Server's certificate SHA1 hash" ++msgstr "" ++ ++msgid "Vendor Class to send when requesting DHCP" ++msgstr "" ++ ++msgid "Verbose" ++msgstr "" ++ ++msgid "Verbose logging by aiccu daemon" ++msgstr "" ++ ++msgid "Verify" ++msgstr "" ++ ++msgid "Version" ++msgstr "" ++ ++msgid "WDS" ++msgstr "" ++ ++msgid "WEP Open System" ++msgstr "" ++ ++msgid "WEP Shared Key" ++msgstr "" ++ ++msgid "WEP passphrase" ++msgstr "" ++ ++msgid "WMM Mode" ++msgstr "" ++ ++msgid "WPA passphrase" ++msgstr "" ++ ++msgid "" ++"WPA-Encryption requires wpa_supplicant (for client mode) or hostapd (for AP " ++"and ad-hoc mode) to be installed." ++msgstr "" ++ ++msgid "" ++"Wait for NTP sync that many seconds, seting to 0 disables waiting (optional)" ++msgstr "" ++ ++msgid "Waiting for changes to be applied..." ++msgstr "" ++ ++msgid "Waiting for command to complete..." ++msgstr "" ++ ++msgid "Warning" ++msgstr "" ++ ++msgid "Warning: There are unsaved changes that will be lost while rebooting!" ++msgstr "" ++ ++msgid "Whether to create an IPv6 default route over the tunnel" ++msgstr "" ++ ++msgid "Whether to route only packets from delegated prefixes" ++msgstr "" ++ ++msgid "Width" ++msgstr "" ++ ++msgid "Wifi" ++msgstr "" ++ ++msgid "Wireless" ++msgstr "" ++ ++msgid "Wireless Adapter" ++msgstr "" ++ ++msgid "Wireless Network" ++msgstr "" ++ ++msgid "Wireless Overview" ++msgstr "" ++ ++msgid "Wireless Security" ++msgstr "" ++ ++msgid "Wireless is disabled or not associated" ++msgstr "" ++ ++msgid "Wireless is restarting..." ++msgstr "" ++ ++msgid "Wireless network is disabled" ++msgstr "" ++ ++msgid "Wireless network is enabled" ++msgstr "" ++ ++msgid "Wireless restarted" ++msgstr "" ++ ++msgid "Wireless shut down" ++msgstr "" ++ ++msgid "Write received DNS requests to syslog" ++msgstr "" ++ ++msgid "XR Support" ++msgstr "" ++ ++msgid "" ++"You can enable or disable installed init scripts here. Changes will applied " ++"after a device reboot.
    Warning: If you disable essential init " ++"scripts like \"network\", your device might become inaccessible!" ++msgstr "" ++ ++msgid "" ++"You must enable Java Script in your browser or LuCI will not work properly." ++msgstr "" ++ ++msgid "" ++"Your Internet Explorer is too old to display this page correctly. Please " ++"upgrade it to at least version 7 or use another browser like Firefox, Opera " ++"or Safari." ++msgstr "" ++ ++msgid "any" ++msgstr "" ++ ++msgid "auto" ++msgstr "" ++ ++msgid "automatic" ++msgstr "" ++ ++msgid "baseT" ++msgstr "" ++ ++msgid "bridged" ++msgstr "" ++ ++msgid "create:" ++msgstr "" ++ ++msgid "creates a bridge over specified interface(s)" ++msgstr "" ++ ++msgid "dB" ++msgstr "" ++ ++msgid "dBm" ++msgstr "" ++ ++msgid "disable" ++msgstr "" ++ ++msgid "disabled" ++msgstr "" ++ ++msgid "expired" ++msgstr "" ++ ++msgid "" ++"file where given DHCP-leases will be stored" ++msgstr "" ++ ++msgid "forward" ++msgstr "" ++ ++msgid "full-duplex" ++msgstr "" ++ ++msgid "half-duplex" ++msgstr "" ++ ++msgid "help" ++msgstr "" ++ ++msgid "hidden" ++msgstr "" ++ ++msgid "hybrid mode" ++msgstr "" ++ ++msgid "if target is a network" ++msgstr "" ++ ++msgid "input" ++msgstr "" ++ ++msgid "kB" ++msgstr "" ++ ++msgid "kB/s" ++msgstr "" ++ ++msgid "kbit/s" ++msgstr "" ++ ++msgid "local DNS file" ++msgstr "" ++ ++msgid "minimum 1280, maximum 1480" ++msgstr "" ++ ++msgid "navigation Navigation" ++msgstr "" ++ ++msgid "no" ++msgstr "" ++ ++msgid "no link" ++msgstr "" ++ ++msgid "none" ++msgstr "" ++ ++msgid "not present" ++msgstr "" ++ ++msgid "off" ++msgstr "" ++ ++msgid "on" ++msgstr "" ++ ++msgid "open" ++msgstr "" ++ ++msgid "overlay" ++msgstr "" ++ ++msgid "relay mode" ++msgstr "" ++ ++msgid "routed" ++msgstr "" ++ ++msgid "server mode" ++msgstr "" ++ ++msgid "skiplink1 Skip to navigation" ++msgstr "" ++ ++msgid "skiplink2 Skip to content" ++msgstr "" ++ ++msgid "stateful-only" ++msgstr "" ++ ++msgid "stateless" ++msgstr "" ++ ++msgid "stateless + stateful" ++msgstr "" ++ ++msgid "tagged" ++msgstr "" ++ ++msgid "unknown" ++msgstr "" ++ ++msgid "unlimited" ++msgstr "" ++ ++msgid "unspecified" ++msgstr "" ++ ++msgid "unspecified -or- create:" ++msgstr "" ++ ++msgid "untagged" ++msgstr "" ++ ++msgid "yes" ++msgstr "" ++ ++msgid "« Back" ++msgstr "" ++ ++#~ msgid "40MHz 2nd channel above" ++#~ msgstr "40MHz andra kanalen ovanför" ++ ++#~ msgid "40MHz 2nd channel below" ++#~ msgstr "40MHz andra kanalen nedanför" +diff --git a/feeds/luci/modules/luci-base/po/templates/base.pot b/feeds/luci/modules/luci-base/po/templates/base.pot +new file mode 100644 +index 0000000..21ec657 +--- /dev/null ++++ b/feeds/luci/modules/luci-base/po/templates/base.pot +@@ -0,0 +1,3033 @@ ++msgid "" ++msgstr "Content-Type: text/plain; charset=UTF-8" ++ ++msgid "(%d minute window, %d second interval)" ++msgstr "" ++ ++msgid "(%s available)" ++msgstr "" ++ ++msgid "(empty)" ++msgstr "" ++ ++msgid "(no interfaces attached)" ++msgstr "" ++ ++msgid "-- Additional Field --" ++msgstr "" ++ ++msgid "-- Please choose --" ++msgstr "" ++ ++msgid "-- custom --" ++msgstr "" ++ ++msgid "-- match by device --" ++msgstr "" ++ ++msgid "-- match by label --" ++msgstr "" ++ ++msgid "1 Minute Load:" ++msgstr "" ++ ++msgid "15 Minute Load:" ++msgstr "" ++ ++msgid "5 Minute Load:" ++msgstr "" ++ ++msgid "BSSID" ++msgstr "" ++ ++msgid "DNS query port" ++msgstr "" ++ ++msgid "DNS server port" ++msgstr "" ++ ++msgid "" ++"DNS servers will be queried in the " ++"order of the resolvfile" ++msgstr "" ++ ++msgid "ESSID" ++msgstr "" ++ ++msgid "IPv4-Address" ++msgstr "" ++ ++msgid "IPv4-Gateway" ++msgstr "" ++ ++msgid "IPv4-Netmask" ++msgstr "" ++ ++msgid "" ++"IPv6-Address or Network " ++"(CIDR)" ++msgstr "" ++ ++msgid "IPv6-Gateway" ++msgstr "" ++ ++msgid "IPv6-Suffix (hex)" ++msgstr "" ++ ++msgid "LED Configuration" ++msgstr "" ++ ++msgid "LED Name" ++msgstr "" ++ ++msgid "MAC-Address" ++msgstr "" ++ ++msgid "" ++"Max. DHCP leases" ++msgstr "" ++ ++msgid "" ++"Max. EDNS0 packet size" ++msgstr "" ++ ++msgid "Max. concurrent queries" ++msgstr "" ++ ++msgid "%s - %s" ++msgstr "" ++ ++msgid "ADSL" ++msgstr "" ++ ++msgid "ADSL Status" ++msgstr "" ++ ++msgid "AICCU (SIXXS)" ++msgstr "" ++ ++msgid "APN" ++msgstr "" ++ ++msgid "AR Support" ++msgstr "" ++ ++msgid "ARP retry threshold" ++msgstr "" ++ ++msgid "ATM Bridges" ++msgstr "" ++ ++msgid "ATM Virtual Channel Identifier (VCI)" ++msgstr "" ++ ++msgid "ATM Virtual Path Identifier (VPI)" ++msgstr "" ++ ++msgid "" ++"ATM bridges expose encapsulated ethernet in AAL5 connections as virtual " ++"Linux network interfaces which can be used in conjunction with DHCP or PPP " ++"to dial into the provider network." ++msgstr "" ++ ++msgid "ATM device number" ++msgstr "" ++ ++msgid "AYIYA" ++msgstr "" ++ ++msgid "Access Concentrator" ++msgstr "" ++ ++msgid "Access Point" ++msgstr "" ++ ++msgid "Action" ++msgstr "" ++ ++msgid "Actions" ++msgstr "" ++ ++msgid "Activate this network" ++msgstr "" ++ ++msgid "Active IPv4-Routes" ++msgstr "" ++ ++msgid "Active IPv6-Routes" ++msgstr "" ++ ++msgid "Active Connections" ++msgstr "" ++ ++msgid "Active DHCP Leases" ++msgstr "" ++ ++msgid "Active DHCPv6 Leases" ++msgstr "" ++ ++msgid "Ad-Hoc" ++msgstr "" ++ ++msgid "Add" ++msgstr "" ++ ++msgid "Add local domain suffix to names served from hosts files" ++msgstr "" ++ ++msgid "Add new interface..." ++msgstr "" ++ ++msgid "Additional Hosts files" ++msgstr "" ++ ++msgid "Address" ++msgstr "" ++ ++msgid "Address to access local relay bridge" ++msgstr "" ++ ++msgid "Administration" ++msgstr "" ++ ++msgid "Advanced Settings" ++msgstr "" ++ ++msgid "Alert" ++msgstr "" ++ ++msgid "Allow SSH password authentication" ++msgstr "" ++ ++msgid "Allow all except listed" ++msgstr "" ++ ++msgid "Allow listed only" ++msgstr "" ++ ++msgid "Allow localhost" ++msgstr "" ++ ++msgid "Allow remote hosts to connect to local SSH forwarded ports" ++msgstr "" ++ ++msgid "Allow root logins with password" ++msgstr "" ++ ++msgid "Allow the root user to login with password" ++msgstr "" ++ ++msgid "" ++"Allow upstream responses in the 127.0.0.0/8 range, e.g. for RBL services" ++msgstr "" ++ ++msgid "" ++"Also see Tunneling Comparison on SIXXS" ++msgstr "" ++ ++msgid "Always announce default router" ++msgstr "" ++ ++msgid "An additional network will be created if you leave this unchecked." ++msgstr "" ++ ++msgid "Announce as default router even if no public prefix is available." ++msgstr "" ++ ++msgid "Announced DNS domains" ++msgstr "" ++ ++msgid "Announced DNS servers" ++msgstr "" ++ ++msgid "Antenna 1" ++msgstr "" ++ ++msgid "Antenna 2" ++msgstr "" ++ ++msgid "Antenna Configuration" ++msgstr "" ++ ++msgid "Any zone" ++msgstr "" ++ ++msgid "Apply" ++msgstr "" ++ ++msgid "Applying changes" ++msgstr "" ++ ++msgid "" ++"Assign a part of given length of every public IPv6-prefix to this interface" ++msgstr "" ++ ++msgid "Assign interfaces..." ++msgstr "" ++ ++msgid "" ++"Assign prefix parts using this hexadecimal subprefix ID for this interface." ++msgstr "" ++ ++msgid "Associated Stations" ++msgstr "" ++ ++msgid "Atheros 802.11%s Wireless Controller" ++msgstr "" ++ ++msgid "AuthGroup" ++msgstr "" ++ ++msgid "Authentication" ++msgstr "" ++ ++msgid "Authoritative" ++msgstr "" ++ ++msgid "Authorization Required" ++msgstr "" ++ ++msgid "Auto Refresh" ++msgstr "" ++ ++msgid "Automatic" ++msgstr "" ++ ++msgid "Automatic Homenet (HNCP)" ++msgstr "" ++ ++msgid "Available" ++msgstr "" ++ ++msgid "Available packages" ++msgstr "" ++ ++msgid "Average:" ++msgstr "" ++ ++msgid "BSSID" ++msgstr "" ++ ++msgid "Back" ++msgstr "" ++ ++msgid "Back to Overview" ++msgstr "" ++ ++msgid "Back to configuration" ++msgstr "" ++ ++msgid "Back to overview" ++msgstr "" ++ ++msgid "Back to scan results" ++msgstr "" ++ ++msgid "Background Scan" ++msgstr "" ++ ++msgid "Backup / Flash Firmware" ++msgstr "" ++ ++msgid "Backup / Restore" ++msgstr "" ++ ++msgid "Backup file list" ++msgstr "" ++ ++msgid "Bad address specified!" ++msgstr "" ++ ++msgid "Band" ++msgstr "" ++ ++msgid "Behind NAT" ++msgstr "" ++ ++msgid "" ++"Below is the determined list of files to backup. It consists of changed " ++"configuration files marked by opkg, essential base files and the user " ++"defined backup patterns." ++msgstr "" ++ ++msgid "Bitrate" ++msgstr "" ++ ++msgid "Bogus NX Domain Override" ++msgstr "" ++ ++msgid "Bridge" ++msgstr "" ++ ++msgid "Bridge interfaces" ++msgstr "" ++ ++msgid "Bridge unit number" ++msgstr "" ++ ++msgid "Bring up on boot" ++msgstr "" ++ ++msgid "Broadcom 802.11%s Wireless Controller" ++msgstr "" ++ ++msgid "Broadcom BCM%04x 802.11 Wireless Controller" ++msgstr "" ++ ++msgid "Buffered" ++msgstr "" ++ ++msgid "Buttons" ++msgstr "" ++ ++msgid "CA certificate; if empty it will be saved after the first connection." ++msgstr "" ++ ++msgid "CPU" ++msgstr "" ++ ++msgid "CPU usage (%)" ++msgstr "" ++ ++msgid "Cancel" ++msgstr "" ++ ++msgid "Category" ++msgstr "" ++ ++msgid "Chain" ++msgstr "" ++ ++msgid "Changes" ++msgstr "" ++ ++msgid "Changes applied." ++msgstr "" ++ ++msgid "Changes the administrator password for accessing the device" ++msgstr "" ++ ++msgid "Channel" ++msgstr "" ++ ++msgid "Check" ++msgstr "" ++ ++msgid "Checksum" ++msgstr "" ++ ++msgid "" ++"Choose the firewall zone you want to assign to this interface. Select " ++"unspecified to remove the interface from the associated zone or " ++"fill out the create field to define a new zone and attach the " ++"interface to it." ++msgstr "" ++ ++msgid "" ++"Choose the network(s) you want to attach to this wireless interface or fill " ++"out the create field to define a new network." ++msgstr "" ++ ++msgid "Cipher" ++msgstr "" ++ ++msgid "" ++"Click \"Generate archive\" to download a tar archive of the current " ++"configuration files. To reset the firmware to its initial state, click " ++"\"Perform reset\" (only possible with squashfs images)." ++msgstr "" ++ ++msgid "Client" ++msgstr "" ++ ++msgid "Client ID to send when requesting DHCP" ++msgstr "" ++ ++msgid "" ++"Close inactive connection after the given amount of seconds, use 0 to " ++"persist connection" ++msgstr "" ++ ++msgid "Close list..." ++msgstr "" ++ ++msgid "Collecting data..." ++msgstr "" ++ ++msgid "Command" ++msgstr "" ++ ++msgid "Common Configuration" ++msgstr "" ++ ++msgid "Compression" ++msgstr "" ++ ++msgid "Configuration" ++msgstr "" ++ ++msgid "Configuration applied." ++msgstr "" ++ ++msgid "Configuration files will be kept." ++msgstr "" ++ ++msgid "Confirmation" ++msgstr "" ++ ++msgid "Connect" ++msgstr "" ++ ++msgid "Connected" ++msgstr "" ++ ++msgid "Connection Limit" ++msgstr "" ++ ++msgid "Connection to server fails when TLS cannot be used" ++msgstr "" ++ ++msgid "Connections" ++msgstr "" ++ ++msgid "Country" ++msgstr "" ++ ++msgid "Country Code" ++msgstr "" ++ ++msgid "Cover the following interface" ++msgstr "" ++ ++msgid "Cover the following interfaces" ++msgstr "" ++ ++msgid "Create / Assign firewall-zone" ++msgstr "" ++ ++msgid "Create Interface" ++msgstr "" ++ ++msgid "Create a bridge over multiple interfaces" ++msgstr "" ++ ++msgid "Critical" ++msgstr "" ++ ++msgid "Cron Log Level" ++msgstr "" ++ ++msgid "Custom Interface" ++msgstr "" ++ ++msgid "Custom delegated IPv6-prefix" ++msgstr "" ++ ++msgid "" ++"Customizes the behaviour of the device LEDs if possible." ++msgstr "" ++ ++msgid "DHCP Leases" ++msgstr "" ++ ++msgid "DHCP Server" ++msgstr "" ++ ++msgid "DHCP and DNS" ++msgstr "" ++ ++msgid "DHCP client" ++msgstr "" ++ ++msgid "DHCP-Options" ++msgstr "" ++ ++msgid "DHCPv6 Leases" ++msgstr "" ++ ++msgid "DHCPv6 client" ++msgstr "" ++ ++msgid "DHCPv6-Mode" ++msgstr "" ++ ++msgid "DHCPv6-Service" ++msgstr "" ++ ++msgid "DNS" ++msgstr "" ++ ++msgid "DNS forwardings" ++msgstr "" ++ ++msgid "DNS-Label / FQDN" ++msgstr "" ++ ++msgid "DS-Lite AFTR address" ++msgstr "" ++ ++msgid "DUID" ++msgstr "" ++ ++msgid "Debug" ++msgstr "" ++ ++msgid "Default %d" ++msgstr "" ++ ++msgid "Default gateway" ++msgstr "" ++ ++msgid "Default route" ++msgstr "" ++ ++msgid "Default state" ++msgstr "" ++ ++msgid "Define a name for this network." ++msgstr "" ++ ++msgid "" ++"Define additional DHCP options, for example " ++"\"6,192.168.2.1,192.168.2.2\" which advertises different DNS " ++"servers to clients." ++msgstr "" ++ ++msgid "Delete" ++msgstr "" ++ ++msgid "Delete this interface" ++msgstr "" ++ ++msgid "Delete this network" ++msgstr "" ++ ++msgid "Description" ++msgstr "" ++ ++msgid "Design" ++msgstr "" ++ ++msgid "Destination" ++msgstr "" ++ ++msgid "Device" ++msgstr "" ++ ++msgid "Device Configuration" ++msgstr "" ++ ++msgid "Diagnostics" ++msgstr "" ++ ++msgid "Dial number" ++msgstr "" ++ ++msgid "Directory" ++msgstr "" ++ ++msgid "Disable" ++msgstr "" ++ ++msgid "" ++"Disable DHCP for " ++"this interface." ++msgstr "" ++ ++msgid "Disable DNS setup" ++msgstr "" ++ ++msgid "Disable HW-Beacon timer" ++msgstr "" ++ ++msgid "Disabled" ++msgstr "" ++ ++msgid "Discard upstream RFC1918 responses" ++msgstr "" ++ ++msgid "Displaying only packages containing" ++msgstr "" ++ ++msgid "Distance Optimization" ++msgstr "" ++ ++msgid "Distance to farthest network member in meters." ++msgstr "" ++ ++msgid "Diversity" ++msgstr "" ++ ++msgid "" ++"Dnsmasq is a combined DHCP-Server and DNS-" ++"Forwarder for NAT " ++"firewalls" ++msgstr "" ++ ++msgid "Do not cache negative replies, e.g. for not existing domains" ++msgstr "" ++ ++msgid "Do not forward requests that cannot be answered by public name servers" ++msgstr "" ++ ++msgid "Do not forward reverse lookups for local networks" ++msgstr "" ++ ++msgid "Do not send probe responses" ++msgstr "" ++ ++msgid "Domain required" ++msgstr "" ++ ++msgid "Domain whitelist" ++msgstr "" ++ ++msgid "" ++"Don't forward DNS-Requests without " ++"DNS-Name" ++msgstr "" ++ ++msgid "Download and install package" ++msgstr "" ++ ++msgid "Download backup" ++msgstr "" ++ ++msgid "Dropbear Instance" ++msgstr "" ++ ++msgid "" ++"Dropbear offers SSH network shell access " ++"and an integrated SCP server" ++msgstr "" ++ ++msgid "Dual-Stack Lite (RFC6333)" ++msgstr "" ++ ++msgid "Dynamic DHCP" ++msgstr "" ++ ++msgid "Dynamic tunnel" ++msgstr "" ++ ++msgid "" ++"Dynamically allocate DHCP addresses for clients. If disabled, only clients " ++"having static leases will be served." ++msgstr "" ++ ++msgid "EAP-Method" ++msgstr "" ++ ++msgid "Edit" ++msgstr "" ++ ++msgid "Edit this interface" ++msgstr "" ++ ++msgid "Edit this network" ++msgstr "" ++ ++msgid "Emergency" ++msgstr "" ++ ++msgid "Enable" ++msgstr "" ++ ++msgid "Enable STP" ++msgstr "" ++ ++msgid "Enable HE.net dynamic endpoint update" ++msgstr "" ++ ++msgid "Enable IPv6 negotiation on the PPP link" ++msgstr "" ++ ++msgid "Enable Jumbo Frame passthrough" ++msgstr "" ++ ++msgid "Enable NTP client" ++msgstr "" ++ ++msgid "Enable TFTP server" ++msgstr "" ++ ++msgid "Enable VLAN functionality" ++msgstr "" ++ ++msgid "Enable WPS pushbutton, requires WPA(2)-PSK" ++msgstr "" ++ ++msgid "Enable learning and aging" ++msgstr "" ++ ++msgid "Enable mirroring of incoming packets" ++msgstr "" ++ ++msgid "Enable mirroring of outgoing packets" ++msgstr "" ++ ++msgid "Enable this mount" ++msgstr "" ++ ++msgid "Enable this swap" ++msgstr "" ++ ++msgid "Enable/Disable" ++msgstr "" ++ ++msgid "Enabled" ++msgstr "" ++ ++msgid "Enables the Spanning Tree Protocol on this bridge" ++msgstr "" ++ ++msgid "Encapsulation mode" ++msgstr "" ++ ++msgid "Encryption" ++msgstr "" ++ ++msgid "Erasing..." ++msgstr "" ++ ++msgid "Error" ++msgstr "" ++ ++msgid "Ethernet Adapter" ++msgstr "" ++ ++msgid "Ethernet Switch" ++msgstr "" ++ ++msgid "Expand hosts" ++msgstr "" ++ ++msgid "Expires" ++msgstr "" ++ ++msgid "" ++"Expiry time of leased addresses, minimum is 2 minutes (2m)." ++msgstr "" ++ ++msgid "External" ++msgstr "" ++ ++msgid "External system log server" ++msgstr "" ++ ++msgid "External system log server port" ++msgstr "" ++ ++msgid "Fast Frames" ++msgstr "" ++ ++msgid "File" ++msgstr "" ++ ++msgid "Filename of the boot image advertised to clients" ++msgstr "" ++ ++msgid "Filesystem" ++msgstr "" ++ ++msgid "Filter" ++msgstr "" ++ ++msgid "Filter private" ++msgstr "" ++ ++msgid "Filter useless" ++msgstr "" ++ ++msgid "Find and join network" ++msgstr "" ++ ++msgid "Find package" ++msgstr "" ++ ++msgid "Finish" ++msgstr "" ++ ++msgid "Firewall" ++msgstr "" ++ ++msgid "Firewall Settings" ++msgstr "" ++ ++msgid "Firewall Status" ++msgstr "" ++ ++msgid "Firmware Version" ++msgstr "" ++ ++msgid "Fixed source port for outbound DNS queries" ++msgstr "" ++ ++msgid "Flags" ++msgstr "" ++ ++msgid "Flash Firmware" ++msgstr "" ++ ++msgid "Flash image..." ++msgstr "" ++ ++msgid "Flash new firmware image" ++msgstr "" ++ ++msgid "Flash operations" ++msgstr "" ++ ++msgid "Flashing..." ++msgstr "" ++ ++msgid "Force" ++msgstr "" ++ ++msgid "Force CCMP (AES)" ++msgstr "" ++ ++msgid "Force DHCP on this network even if another server is detected." ++msgstr "" ++ ++msgid "Force TKIP" ++msgstr "" ++ ++msgid "Force TKIP and CCMP (AES)" ++msgstr "" ++ ++msgid "Forward DHCP traffic" ++msgstr "" ++ ++msgid "Forward broadcast traffic" ++msgstr "" ++ ++msgid "Forwarding mode" ++msgstr "" ++ ++msgid "Fragmentation Threshold" ++msgstr "" ++ ++msgid "Frame Bursting" ++msgstr "" ++ ++msgid "Free" ++msgstr "" ++ ++msgid "Free space" ++msgstr "" ++ ++msgid "GHz" ++msgstr "" ++ ++msgid "GPRS only" ++msgstr "" ++ ++msgid "Gateway" ++msgstr "" ++ ++msgid "Gateway ports" ++msgstr "" ++ ++msgid "General Settings" ++msgstr "" ++ ++msgid "General Setup" ++msgstr "" ++ ++msgid "Generate archive" ++msgstr "" ++ ++msgid "Generic 802.11%s Wireless Controller" ++msgstr "" ++ ++msgid "Given password confirmation did not match, password not changed!" ++msgstr "" ++ ++msgid "Global network options" ++msgstr "" ++ ++msgid "Go to password configuration..." ++msgstr "" ++ ++msgid "Go to relevant configuration page" ++msgstr "" ++ ++msgid "Guest" ++msgstr "" ++ ++msgid "HE.net password" ++msgstr "" ++ ++msgid "HE.net username" ++msgstr "" ++ ++msgid "Handler" ++msgstr "" ++ ++msgid "Hang Up" ++msgstr "" ++ ++msgid "Heartbeat" ++msgstr "" ++ ++msgid "" ++"Here you can configure the basic aspects of your device like its hostname or " ++"the timezone." ++msgstr "" ++ ++msgid "" ++"Here you can paste public SSH-Keys (one per line) for SSH public-key " ++"authentication." ++msgstr "" ++ ++msgid "Hermes 802.11b Wireless Controller" ++msgstr "" ++ ++msgid "Hide ESSID" ++msgstr "" ++ ++msgid "Host entries" ++msgstr "" ++ ++msgid "Host expiry timeout" ++msgstr "" ++ ++msgid "Host-IP or Network" ++msgstr "" ++ ++msgid "Hostname" ++msgstr "" ++ ++msgid "Hostname to send when requesting DHCP" ++msgstr "" ++ ++msgid "Hostnames" ++msgstr "" ++ ++msgid "Hybrid" ++msgstr "" ++ ++msgid "IP address" ++msgstr "" ++ ++msgid "IPv4" ++msgstr "" ++ ++msgid "IPv4 Firewall" ++msgstr "" ++ ++msgid "IPv4 WAN Status" ++msgstr "" ++ ++msgid "IPv4 address" ++msgstr "" ++ ++msgid "IPv4 and IPv6" ++msgstr "" ++ ++msgid "IPv4 assignment length" ++msgstr "" ++ ++msgid "IPv4 broadcast" ++msgstr "" ++ ++msgid "IPv4 gateway" ++msgstr "" ++ ++msgid "IPv4 netmask" ++msgstr "" ++ ++msgid "IPv4 only" ++msgstr "" ++ ++msgid "IPv4 prefix length" ++msgstr "" ++ ++msgid "IPv4-Address" ++msgstr "" ++ ++msgid "IPv6" ++msgstr "" ++ ++msgid "IPv6 Firewall" ++msgstr "" ++ ++msgid "IPv6 Neighbours" ++msgstr "" ++ ++msgid "IPv6 Settings" ++msgstr "" ++ ++msgid "IPv6 ULA-Prefix" ++msgstr "" ++ ++msgid "IPv6 WAN Status" ++msgstr "" ++ ++msgid "IPv6 address" ++msgstr "" ++ ++msgid "IPv6 address delegated to the local tunnel endpoint (optional)" ++msgstr "" ++ ++msgid "IPv6 assignment hint" ++msgstr "" ++ ++msgid "IPv6 assignment length" ++msgstr "" ++ ++msgid "IPv6 gateway" ++msgstr "" ++ ++msgid "IPv6 only" ++msgstr "" ++ ++msgid "IPv6 prefix" ++msgstr "" ++ ++msgid "IPv6 prefix length" ++msgstr "" ++ ++msgid "IPv6 routed prefix" ++msgstr "" ++ ++msgid "IPv6-Address" ++msgstr "" ++ ++msgid "IPv6-in-IPv4 (RFC4213)" ++msgstr "" ++ ++msgid "IPv6-over-IPv4 (6rd)" ++msgstr "" ++ ++msgid "IPv6-over-IPv4 (6to4)" ++msgstr "" ++ ++msgid "Identity" ++msgstr "" ++ ++msgid "" ++"If specified, mount the device by its UUID instead of a fixed device node" ++msgstr "" ++ ++msgid "" ++"If specified, mount the device by the partition label instead of a fixed " ++"device node" ++msgstr "" ++ ++msgid "If unchecked, no default route is configured" ++msgstr "" ++ ++msgid "If unchecked, the advertised DNS server addresses are ignored" ++msgstr "" ++ ++msgid "" ++"If your physical memory is insufficient unused data can be temporarily " ++"swapped to a swap-device resulting in a higher amount of usable RAM. Be aware that swapping data is a very " ++"slow process as the swap-device cannot be accessed with the high datarates " ++"of the RAM." ++msgstr "" ++ ++msgid "Ignore Hosts files" ++msgstr "" ++ ++msgid "Ignore interface" ++msgstr "" ++ ++msgid "Ignore resolve file" ++msgstr "" ++ ++msgid "Image" ++msgstr "" ++ ++msgid "In" ++msgstr "" ++ ++msgid "Inactivity timeout" ++msgstr "" ++ ++msgid "Inbound:" ++msgstr "" ++ ++msgid "Info" ++msgstr "" ++ ++msgid "Initscript" ++msgstr "" ++ ++msgid "Initscripts" ++msgstr "" ++ ++msgid "Install" ++msgstr "" ++ ++msgid "Install iputils-traceroute6 for IPv6 traceroute" ++msgstr "" ++ ++msgid "Install package %q" ++msgstr "" ++ ++msgid "Install protocol extensions..." ++msgstr "" ++ ++msgid "Installed packages" ++msgstr "" ++ ++msgid "Interface" ++msgstr "" ++ ++msgid "Interface Configuration" ++msgstr "" ++ ++msgid "Interface Overview" ++msgstr "" ++ ++msgid "Interface is reconnecting..." ++msgstr "" ++ ++msgid "Interface is shutting down..." ++msgstr "" ++ ++msgid "Interface not present or not connected yet." ++msgstr "" ++ ++msgid "Interface reconnected" ++msgstr "" ++ ++msgid "Interface shut down" ++msgstr "" ++ ++msgid "Interfaces" ++msgstr "" ++ ++msgid "Internal" ++msgstr "" ++ ++msgid "Internal Server Error" ++msgstr "" ++ ++msgid "Invalid" ++msgstr "" ++ ++msgid "Invalid VLAN ID given! Only IDs between %d and %d are allowed." ++msgstr "" ++ ++msgid "Invalid VLAN ID given! Only unique IDs are allowed" ++msgstr "" ++ ++msgid "Invalid username and/or password! Please try again." ++msgstr "" ++ ++msgid "" ++"It appears that you are trying to flash an image that does not fit into the " ++"flash memory, please verify the image file!" ++msgstr "" ++ ++msgid "Java Script required!" ++msgstr "" ++ ++msgid "Join Network" ++msgstr "" ++ ++msgid "Join Network: Settings" ++msgstr "" ++ ++msgid "Join Network: Wireless Scan" ++msgstr "" ++ ++msgid "Keep settings" ++msgstr "" ++ ++msgid "Kernel Log" ++msgstr "" ++ ++msgid "Kernel Version" ++msgstr "" ++ ++msgid "Key" ++msgstr "" ++ ++msgid "Key #%d" ++msgstr "" ++ ++msgid "Kill" ++msgstr "" ++ ++msgid "L2TP" ++msgstr "" ++ ++msgid "L2TP Server" ++msgstr "" ++ ++msgid "LCP echo failure threshold" ++msgstr "" ++ ++msgid "LCP echo interval" ++msgstr "" ++ ++msgid "LLC" ++msgstr "" ++ ++msgid "Label" ++msgstr "" ++ ++msgid "Language" ++msgstr "" ++ ++msgid "Language and Style" ++msgstr "" ++ ++msgid "Leaf" ++msgstr "" ++ ++msgid "Lease validity time" ++msgstr "" ++ ++msgid "Leasefile" ++msgstr "" ++ ++msgid "Leasetime" ++msgstr "" ++ ++msgid "Leasetime remaining" ++msgstr "" ++ ++msgid "Leave empty to autodetect" ++msgstr "" ++ ++msgid "Leave empty to use the current WAN address" ++msgstr "" ++ ++msgid "Legend:" ++msgstr "" ++ ++msgid "Limit" ++msgstr "" ++ ++msgid "Line Attenuation" ++msgstr "" ++ ++msgid "Line Speed" ++msgstr "" ++ ++msgid "Line State" ++msgstr "" ++ ++msgid "Link On" ++msgstr "" ++ ++msgid "" ++"List of DNS servers to forward " ++"requests to" ++msgstr "" ++ ++msgid "List of domains to allow RFC1918 responses for" ++msgstr "" ++ ++msgid "List of hosts that supply bogus NX domain results" ++msgstr "" ++ ++msgid "Listen only on the given interface or, if unspecified, on all" ++msgstr "" ++ ++msgid "Listening port for inbound DNS queries" ++msgstr "" ++ ++msgid "Load" ++msgstr "" ++ ++msgid "Load Average" ++msgstr "" ++ ++msgid "Loading" ++msgstr "" ++ ++msgid "Local IPv4 address" ++msgstr "" ++ ++msgid "Local IPv6 address" ++msgstr "" ++ ++msgid "Local Startup" ++msgstr "" ++ ++msgid "Local Time" ++msgstr "" ++ ++msgid "Local domain" ++msgstr "" ++ ++msgid "" ++"Local domain specification. Names matching this domain are never forwarded " ++"and are resolved from DHCP or hosts files only" ++msgstr "" ++ ++msgid "Local domain suffix appended to DHCP names and hosts file entries" ++msgstr "" ++ ++msgid "Local server" ++msgstr "" ++ ++msgid "" ++"Localise hostname depending on the requesting subnet if multiple IPs are " ++"available" ++msgstr "" ++ ++msgid "Localise queries" ++msgstr "" ++ ++msgid "Locked to channel %d used by: %s" ++msgstr "" ++ ++msgid "Log output level" ++msgstr "" ++ ++msgid "Log queries" ++msgstr "" ++ ++msgid "Logging" ++msgstr "" ++ ++msgid "Login" ++msgstr "" ++ ++msgid "Logout" ++msgstr "" ++ ++msgid "Lowest leased address as offset from the network address." ++msgstr "" ++ ++msgid "MAC-Address" ++msgstr "" ++ ++msgid "MAC-Address Filter" ++msgstr "" ++ ++msgid "MAC-Filter" ++msgstr "" ++ ++msgid "MAC-List" ++msgstr "" ++ ++msgid "MB/s" ++msgstr "" ++ ++msgid "MHz" ++msgstr "" ++ ++msgid "MTU" ++msgstr "" ++ ++msgid "" ++"Make sure to clone the root filesystem using something like the commands " ++"below:" ++msgstr "" ++ ++msgid "Maximum Rate" ++msgstr "" ++ ++msgid "Maximum allowed number of active DHCP leases" ++msgstr "" ++ ++msgid "Maximum allowed number of concurrent DNS queries" ++msgstr "" ++ ++msgid "Maximum allowed size of EDNS.0 UDP packets" ++msgstr "" ++ ++msgid "Maximum amount of seconds to wait for the modem to become ready" ++msgstr "" ++ ++msgid "Maximum hold time" ++msgstr "" ++ ++msgid "Maximum number of leased addresses." ++msgstr "" ++ ++msgid "Mbit/s" ++msgstr "" ++ ++msgid "Memory" ++msgstr "" ++ ++msgid "Memory usage (%)" ++msgstr "" ++ ++msgid "Metric" ++msgstr "" ++ ++msgid "Minimum Rate" ++msgstr "" ++ ++msgid "Minimum hold time" ++msgstr "" ++ ++msgid "Mirror monitor port" ++msgstr "" ++ ++msgid "Mirror source port" ++msgstr "" ++ ++msgid "Missing protocol extension for proto %q" ++msgstr "" ++ ++msgid "Mode" ++msgstr "" ++ ++msgid "Model" ++msgstr "" ++ ++msgid "Modem device" ++msgstr "" ++ ++msgid "Modem init timeout" ++msgstr "" ++ ++msgid "Monitor" ++msgstr "" ++ ++msgid "Mount Entry" ++msgstr "" ++ ++msgid "Mount Point" ++msgstr "" ++ ++msgid "Mount Points" ++msgstr "" ++ ++msgid "Mount Points - Mount Entry" ++msgstr "" ++ ++msgid "Mount Points - Swap Entry" ++msgstr "" ++ ++msgid "" ++"Mount Points define at which point a memory device will be attached to the " ++"filesystem" ++msgstr "" ++ ++msgid "Mount options" ++msgstr "" ++ ++msgid "Mount point" ++msgstr "" ++ ++msgid "Mounted file systems" ++msgstr "" ++ ++msgid "Move down" ++msgstr "" ++ ++msgid "Move up" ++msgstr "" ++ ++msgid "Multicast Rate" ++msgstr "" ++ ++msgid "Multicast address" ++msgstr "" ++ ++msgid "NAS ID" ++msgstr "" ++ ++msgid "NDP-Proxy" ++msgstr "" ++ ++msgid "NTP server candidates" ++msgstr "" ++ ++msgid "NTP sync time-out" ++msgstr "" ++ ++msgid "Name" ++msgstr "" ++ ++msgid "Name of the new interface" ++msgstr "" ++ ++msgid "Name of the new network" ++msgstr "" ++ ++msgid "Navigation" ++msgstr "" ++ ++msgid "Netmask" ++msgstr "" ++ ++msgid "Network" ++msgstr "" ++ ++msgid "Network Utilities" ++msgstr "" ++ ++msgid "Network boot image" ++msgstr "" ++ ++msgid "Network without interfaces." ++msgstr "" ++ ++msgid "Next »" ++msgstr "" ++ ++msgid "No DHCP Server configured for this interface" ++msgstr "" ++ ++msgid "No chains in this table" ++msgstr "" ++ ++msgid "No files found" ++msgstr "" ++ ++msgid "No information available" ++msgstr "" ++ ++msgid "No negative cache" ++msgstr "" ++ ++msgid "No network configured on this device" ++msgstr "" ++ ++msgid "No network name specified" ++msgstr "" ++ ++msgid "No package lists available" ++msgstr "" ++ ++msgid "No password set!" ++msgstr "" ++ ++msgid "No rules in this chain" ++msgstr "" ++ ++msgid "No zone assigned" ++msgstr "" ++ ++msgid "Noise" ++msgstr "" ++ ++msgid "Noise Margin" ++msgstr "" ++ ++msgid "Noise:" ++msgstr "" ++ ++msgid "None" ++msgstr "" ++ ++msgid "Normal" ++msgstr "" ++ ++msgid "Not Found" ++msgstr "" ++ ++msgid "Not associated" ++msgstr "" ++ ++msgid "Not connected" ++msgstr "" ++ ++msgid "Note: Configuration files will be erased." ++msgstr "" ++ ++msgid "Notice" ++msgstr "" ++ ++msgid "Nslookup" ++msgstr "" ++ ++msgid "OK" ++msgstr "" ++ ++msgid "OPKG-Configuration" ++msgstr "" ++ ++msgid "Off-State Delay" ++msgstr "" ++ ++msgid "" ++"On this page you can configure the network interfaces. You can bridge " ++"several interfaces by ticking the \"bridge interfaces\" field and enter the " ++"names of several network interfaces separated by spaces. You can also use " ++"VLAN notation " ++"INTERFACE.VLANNR (e.g.: " ++"eth0.1)." ++msgstr "" ++ ++msgid "On-State Delay" ++msgstr "" ++ ++msgid "One of hostname or mac address must be specified!" ++msgstr "" ++ ++msgid "One or more fields contain invalid values!" ++msgstr "" ++ ++msgid "One or more required fields have no value!" ++msgstr "" ++ ++msgid "Open list..." ++msgstr "" ++ ++msgid "OpenConnect (CISCO AnyConnect)" ++msgstr "" ++ ++msgid "Operating frequency" ++msgstr "" ++ ++msgid "Option changed" ++msgstr "" ++ ++msgid "Option removed" ++msgstr "" ++ ++msgid "Optional, specify to override default server (tic.sixxs.net)" ++msgstr "" ++ ++msgid "Optional, use when the SIXXS account has more than one tunnel" ++msgstr "" ++ ++msgid "Options" ++msgstr "" ++ ++msgid "Other:" ++msgstr "" ++ ++msgid "Out" ++msgstr "" ++ ++msgid "Outbound:" ++msgstr "" ++ ++msgid "Outdoor Channels" ++msgstr "" ++ ++msgid "Output Interface" ++msgstr "" ++ ++msgid "Override MAC address" ++msgstr "" ++ ++msgid "Override MTU" ++msgstr "" ++ ++msgid "Override the gateway in DHCP responses" ++msgstr "" ++ ++msgid "" ++"Override the netmask sent to clients. Normally it is calculated from the " ++"subnet that is served." ++msgstr "" ++ ++msgid "Override the table used for internal routes" ++msgstr "" ++ ++msgid "Overview" ++msgstr "" ++ ++msgid "Owner" ++msgstr "" ++ ++msgid "PAP/CHAP password" ++msgstr "" ++ ++msgid "PAP/CHAP username" ++msgstr "" ++ ++msgid "PID" ++msgstr "" ++ ++msgid "PIN" ++msgstr "" ++ ++msgid "PPP" ++msgstr "" ++ ++msgid "PPPoA Encapsulation" ++msgstr "" ++ ++msgid "PPPoATM" ++msgstr "" ++ ++msgid "PPPoE" ++msgstr "" ++ ++msgid "PPtP" ++msgstr "" ++ ++msgid "Package libiwinfo required!" ++msgstr "" ++ ++msgid "Package lists are older than 24 hours" ++msgstr "" ++ ++msgid "Package name" ++msgstr "" ++ ++msgid "Packets" ++msgstr "" ++ ++msgid "Part of zone %q" ++msgstr "" ++ ++msgid "Password" ++msgstr "" ++ ++msgid "Password authentication" ++msgstr "" ++ ++msgid "Password of Private Key" ++msgstr "" ++ ++msgid "Password successfully changed!" ++msgstr "" ++ ++msgid "Path" ++msgstr "" ++ ++msgid "Path to CA-Certificate" ++msgstr "" ++ ++msgid "Path to Client-Certificate" ++msgstr "" ++ ++msgid "Path to Private Key" ++msgstr "" ++ ++msgid "Path to executable which handles the button event" ++msgstr "" ++ ++msgid "Peak:" ++msgstr "" ++ ++msgid "Perform reboot" ++msgstr "" ++ ++msgid "Perform reset" ++msgstr "" ++ ++msgid "Phy Rate:" ++msgstr "" ++ ++msgid "Physical Settings" ++msgstr "" ++ ++msgid "Ping" ++msgstr "" ++ ++msgid "Pkts." ++msgstr "" ++ ++msgid "Please enter your username and password." ++msgstr "" ++ ++msgid "Please wait: Device rebooting..." ++msgstr "" ++ ++msgid "Policy" ++msgstr "" ++ ++msgid "Port" ++msgstr "" ++ ++msgid "Port %d" ++msgstr "" ++ ++msgid "Port %d is untagged in multiple VLANs!" ++msgstr "" ++ ++msgid "Port status:" ++msgstr "" ++ ++msgid "" ++"Presume peer to be dead after given amount of LCP echo failures, use 0 to " ++"ignore failures" ++msgstr "" ++ ++msgid "Prevents client-to-client communication" ++msgstr "" ++ ++msgid "Prism2/2.5/3 802.11b Wireless Controller" ++msgstr "" ++ ++msgid "Proceed" ++msgstr "" ++ ++msgid "Processes" ++msgstr "" ++ ++msgid "Prot." ++msgstr "" ++ ++msgid "Protocol" ++msgstr "" ++ ++msgid "Protocol family" ++msgstr "" ++ ++msgid "Protocol of the new interface" ++msgstr "" ++ ++msgid "Protocol support is not installed" ++msgstr "" ++ ++msgid "Provide NTP server" ++msgstr "" ++ ++msgid "Provide new network" ++msgstr "" ++ ++msgid "Pseudo Ad-Hoc (ahdemo)" ++msgstr "" ++ ++msgid "Public prefix routed to this device for distribution to clients." ++msgstr "" ++ ++msgid "Quality" ++msgstr "" ++ ++msgid "RTS/CTS Threshold" ++msgstr "" ++ ++msgid "RX" ++msgstr "" ++ ++msgid "RX Rate" ++msgstr "" ++ ++msgid "RaLink 802.11%s Wireless Controller" ++msgstr "" ++ ++msgid "Radius-Accounting-Port" ++msgstr "" ++ ++msgid "Radius-Accounting-Secret" ++msgstr "" ++ ++msgid "Radius-Accounting-Server" ++msgstr "" ++ ++msgid "Radius-Authentication-Port" ++msgstr "" ++ ++msgid "Radius-Authentication-Secret" ++msgstr "" ++ ++msgid "Radius-Authentication-Server" ++msgstr "" ++ ++msgid "" ++"Read /etc/ethers to configure the DHCP-Server" ++msgstr "" ++ ++msgid "" ++"Really delete this interface? The deletion cannot be undone!\\nYou might " ++"lose access to this device if you are connected via this interface." ++msgstr "" ++ ++msgid "" ++"Really delete this wireless network? The deletion cannot be undone!\\nYou " ++"might lose access to this device if you are connected via this network." ++msgstr "" ++ ++msgid "Really reset all changes?" ++msgstr "" ++ ++msgid "" ++"Really shut down network?\\nYou might lose access to this device if you are " ++"connected via this interface." ++msgstr "" ++ ++msgid "" ++"Really shutdown interface \"%s\" ?\\nYou might lose access to this device if " ++"you are connected via this interface." ++msgstr "" ++ ++msgid "Really switch protocol?" ++msgstr "" ++ ++msgid "Realtime Connections" ++msgstr "" ++ ++msgid "Realtime Graphs" ++msgstr "" ++ ++msgid "Realtime Load" ++msgstr "" ++ ++msgid "Realtime Traffic" ++msgstr "" ++ ++msgid "Realtime Wireless" ++msgstr "" ++ ++msgid "Rebind protection" ++msgstr "" ++ ++msgid "Reboot" ++msgstr "" ++ ++msgid "Rebooting..." ++msgstr "" ++ ++msgid "Reboots the operating system of your device" ++msgstr "" ++ ++msgid "Receive" ++msgstr "" ++ ++msgid "Receiver Antenna" ++msgstr "" ++ ++msgid "Reconnect this interface" ++msgstr "" ++ ++msgid "Reconnecting interface" ++msgstr "" ++ ++msgid "References" ++msgstr "" ++ ++msgid "Regulatory Domain" ++msgstr "" ++ ++msgid "Relay" ++msgstr "" ++ ++msgid "Relay Bridge" ++msgstr "" ++ ++msgid "Relay between networks" ++msgstr "" ++ ++msgid "Relay bridge" ++msgstr "" ++ ++msgid "Remote IPv4 address" ++msgstr "" ++ ++msgid "Remove" ++msgstr "" ++ ++msgid "Repeat scan" ++msgstr "" ++ ++msgid "Replace entry" ++msgstr "" ++ ++msgid "Replace wireless configuration" ++msgstr "" ++ ++msgid "Request IPv6-address" ++msgstr "" ++ ++msgid "Request IPv6-prefix of length" ++msgstr "" ++ ++msgid "Require TLS" ++msgstr "" ++ ++msgid "Required for certain ISPs, e.g. Charter with DOCSIS 3" ++msgstr "" ++ ++msgid "Reset" ++msgstr "" ++ ++msgid "Reset Counters" ++msgstr "" ++ ++msgid "Reset to defaults" ++msgstr "" ++ ++msgid "Resolv and Hosts Files" ++msgstr "" ++ ++msgid "Resolve file" ++msgstr "" ++ ++msgid "Restart" ++msgstr "" ++ ++msgid "Restart Firewall" ++msgstr "" ++ ++msgid "Restore backup" ++msgstr "" ++ ++msgid "Reveal/hide password" ++msgstr "" ++ ++msgid "Revert" ++msgstr "" ++ ++msgid "Root" ++msgstr "" ++ ++msgid "Root directory for files served via TFTP" ++msgstr "" ++ ++msgid "Root preparation" ++msgstr "" ++ ++msgid "Routed IPv6 prefix for downstream interfaces" ++msgstr "" ++ ++msgid "Router Advertisement-Service" ++msgstr "" ++ ++msgid "Router Password" ++msgstr "" ++ ++msgid "Routes" ++msgstr "" ++ ++msgid "" ++"Routes specify over which interface and gateway a certain host or network " ++"can be reached." ++msgstr "" ++ ++msgid "Rule #" ++msgstr "" ++ ++msgid "Run a filesystem check before mounting the device" ++msgstr "" ++ ++msgid "Run filesystem check" ++msgstr "" ++ ++msgid "" ++"SIXXS supports TIC only, for static tunnels using IP protocol 41 (RFC4213) " ++"use 6in4 instead" ++msgstr "" ++ ++msgid "SIXXS-handle[/Tunnel-ID]" ++msgstr "" ++ ++msgid "SSH Access" ++msgstr "" ++ ++msgid "SSH-Keys" ++msgstr "" ++ ++msgid "SSID" ++msgstr "" ++ ++msgid "Save" ++msgstr "" ++ ++msgid "Save & Apply" ++msgstr "" ++ ++msgid "Save & Apply" ++msgstr "" ++ ++msgid "Scan" ++msgstr "" ++ ++msgid "Scheduled Tasks" ++msgstr "" ++ ++msgid "Section added" ++msgstr "" ++ ++msgid "Section removed" ++msgstr "" ++ ++msgid "See \"mount\" manpage for details" ++msgstr "" ++ ++msgid "" ++"Send LCP echo requests at the given interval in seconds, only effective in " ++"conjunction with failure threshold" ++msgstr "" ++ ++msgid "Separate Clients" ++msgstr "" ++ ++msgid "Separate WDS" ++msgstr "" ++ ++msgid "Server Settings" ++msgstr "" ++ ++msgid "Server password" ++msgstr "" ++ ++msgid "" ++"Server password, enter the specific password of the tunnel when the username " ++"contains the tunnel ID" ++msgstr "" ++ ++msgid "Server username" ++msgstr "" ++ ++msgid "Service Name" ++msgstr "" ++ ++msgid "Service Type" ++msgstr "" ++ ++msgid "Services" ++msgstr "" ++ ++msgid "Set up Time Synchronization" ++msgstr "" ++ ++msgid "Setup DHCP Server" ++msgstr "" ++ ++msgid "Show current backup file list" ++msgstr "" ++ ++msgid "Shutdown this interface" ++msgstr "" ++ ++msgid "Shutdown this network" ++msgstr "" ++ ++msgid "Signal" ++msgstr "" ++ ++msgid "Signal:" ++msgstr "" ++ ++msgid "Size" ++msgstr "" ++ ++msgid "Skip" ++msgstr "" ++ ++msgid "Skip to content" ++msgstr "" ++ ++msgid "Skip to navigation" ++msgstr "" ++ ++msgid "Slot time" ++msgstr "" ++ ++msgid "Software" ++msgstr "" ++ ++msgid "Some fields are invalid, cannot save values!" ++msgstr "" ++ ++msgid "Sorry, the object you requested was not found." ++msgstr "" ++ ++msgid "Sorry, the server encountered an unexpected error." ++msgstr "" ++ ++msgid "" ++"Sorry, there is no sysupgrade support present; a new firmware image must be " ++"flashed manually. Please refer to the OpenWrt wiki for device specific " ++"install instructions." ++msgstr "" ++ ++msgid "Sort" ++msgstr "" ++ ++msgid "Source" ++msgstr "" ++ ++msgid "Source routing" ++msgstr "" ++ ++msgid "Specifies the button state to handle" ++msgstr "" ++ ++msgid "Specifies the directory the device is attached to" ++msgstr "" ++ ++msgid "Specifies the listening port of this Dropbear instance" ++msgstr "" ++ ++msgid "" ++"Specifies the maximum amount of failed ARP requests until hosts are presumed " ++"to be dead" ++msgstr "" ++ ++msgid "" ++"Specifies the maximum amount of seconds after which hosts are presumed to be " ++"dead" ++msgstr "" ++ ++msgid "Specify the secret encryption key here." ++msgstr "" ++ ++msgid "Start" ++msgstr "" ++ ++msgid "Start priority" ++msgstr "" ++ ++msgid "Startup" ++msgstr "" ++ ++msgid "Static IPv4 Routes" ++msgstr "" ++ ++msgid "Static IPv6 Routes" ++msgstr "" ++ ++msgid "Static Leases" ++msgstr "" ++ ++msgid "Static Routes" ++msgstr "" ++ ++msgid "Static WDS" ++msgstr "" ++ ++msgid "Static address" ++msgstr "" ++ ++msgid "" ++"Static leases are used to assign fixed IP addresses and symbolic hostnames " ++"to DHCP clients. They are also required for non-dynamic interface " ++"configurations where only hosts with a corresponding lease are served." ++msgstr "" ++ ++msgid "Status" ++msgstr "" ++ ++msgid "Stop" ++msgstr "" ++ ++msgid "Strict order" ++msgstr "" ++ ++msgid "Submit" ++msgstr "" ++ ++msgid "Swap" ++msgstr "" ++ ++msgid "Swap Entry" ++msgstr "" ++ ++msgid "Switch" ++msgstr "" ++ ++msgid "Switch %q" ++msgstr "" ++ ++msgid "Switch %q (%s)" ++msgstr "" ++ ++msgid "Switch protocol" ++msgstr "" ++ ++msgid "Sync with browser" ++msgstr "" ++ ++msgid "Synchronizing..." ++msgstr "" ++ ++msgid "System" ++msgstr "" ++ ++msgid "System Log" ++msgstr "" ++ ++msgid "System Properties" ++msgstr "" ++ ++msgid "System log buffer size" ++msgstr "" ++ ++msgid "TCP:" ++msgstr "" ++ ++msgid "TFTP Settings" ++msgstr "" ++ ++msgid "TFTP server root" ++msgstr "" ++ ++msgid "TX" ++msgstr "" ++ ++msgid "TX Rate" ++msgstr "" ++ ++msgid "Table" ++msgstr "" ++ ++msgid "Target" ++msgstr "" ++ ++msgid "Terminate" ++msgstr "" ++ ++msgid "" ++"The Device Configuration section covers physical settings of the " ++"radio hardware such as channel, transmit power or antenna selection which " ++"are shared among all defined wireless networks (if the radio hardware is " ++"multi-SSID capable). Per network settings like encryption or operation mode " ++"are grouped in the Interface Configuration." ++msgstr "" ++ ++msgid "" ++"The libiwinfo-lua package is not installed. You must install this " ++"component for working wireless configuration!" ++msgstr "" ++ ++msgid "" ++"The HE.net endpoint update configuration changed, you must now use the plain " ++"username instead of the user ID!" ++msgstr "" ++ ++msgid "" ++"The IPv6 prefix assigned to the provider, usually ends with ::" ++msgstr "" ++ ++msgid "" ++"The allowed characters are: A-Z, a-z, 0-9 and _" ++msgstr "" ++ ++msgid "" ++"The device file of the memory or partition (e.g." ++" /dev/sda1)" ++msgstr "" ++ ++msgid "" ++"The filesystem that was used to format the memory (e.g. ext3)" ++msgstr "" ++ ++msgid "" ++"The flash image was uploaded. Below is the checksum and file size listed, " ++"compare them with the original file to ensure data integrity.
    Click " ++"\"Proceed\" below to start the flash procedure." ++msgstr "" ++ ++msgid "The following changes have been committed" ++msgstr "" ++ ++msgid "The following changes have been reverted" ++msgstr "" ++ ++msgid "The following rules are currently active on this system." ++msgstr "" ++ ++msgid "The given network name is not unique" ++msgstr "" ++ ++msgid "" ++"The hardware is not multi-SSID capable and the existing configuration will " ++"be replaced if you proceed." ++msgstr "" ++ ++msgid "" ++"The length of the IPv4 prefix in bits, the remainder is used in the IPv6 " ++"addresses." ++msgstr "" ++ ++msgid "The length of the IPv6 prefix in bits" ++msgstr "" ++ ++msgid "" ++"The network ports on this device can be combined to several VLANs in which computers can " ++"communicate directly with each other. VLANs are often used to separate different network " ++"segments. Often there is by default one Uplink port for a connection to the " ++"next greater network like the internet and other ports for a local network." ++msgstr "" ++ ++msgid "The selected protocol needs a device assigned" ++msgstr "" ++ ++msgid "" ++"The system is erasing the configuration partition now and will reboot itself " ++"when finished." ++msgstr "" ++ ++msgid "" ++"The system is flashing now.
    DO NOT POWER OFF THE DEVICE!
    Wait a " ++"few minutes before you try to reconnect. It might be necessary to renew the " ++"address of your computer to reach the device again, depending on your " ++"settings." ++msgstr "" ++ ++msgid "" ++"The tunnel end-point is behind NAT, defaults to disabled and only applies to " ++"AYIYA" ++msgstr "" ++ ++msgid "" ++"The uploaded image file does not contain a supported format. Make sure that " ++"you choose the generic image format for your platform." ++msgstr "" ++ ++msgid "There are no active leases." ++msgstr "" ++ ++msgid "There are no pending changes to apply!" ++msgstr "" ++ ++msgid "There are no pending changes to revert!" ++msgstr "" ++ ++msgid "There are no pending changes!" ++msgstr "" ++ ++msgid "" ++"There is no device assigned yet, please attach a network device in the " ++"\"Physical Settings\" tab" ++msgstr "" ++ ++msgid "" ++"There is no password set on this router. Please configure a root password to " ++"protect the web interface and enable SSH." ++msgstr "" ++ ++msgid "This IPv4 address of the relay" ++msgstr "" ++ ++msgid "" ++"This is a list of shell glob patterns for matching files and directories to " ++"include during sysupgrade. Modified files in /etc/config/ and certain other " ++"configurations are automatically preserved." ++msgstr "" ++ ++msgid "" ++"This is either the \"Update Key\" configured for the tunnel or the account " ++"password if no update key has been configured" ++msgstr "" ++ ++msgid "" ++"This is the content of /etc/rc.local. Insert your own commands here (in " ++"front of 'exit 0') to execute them at the end of the boot process." ++msgstr "" ++ ++msgid "" ++"This is the local endpoint address assigned by the tunnel broker, it usually " ++"ends with :2" ++msgstr "" ++ ++msgid "" ++"This is the only DHCP in the local network" ++msgstr "" ++ ++msgid "This is the plain username for logging into the account" ++msgstr "" ++ ++msgid "" ++"This is the prefix routed to you by the tunnel broker for use by clients" ++msgstr "" ++ ++msgid "This is the system crontab in which scheduled tasks can be defined." ++msgstr "" ++ ++msgid "" ++"This is usually the address of the nearest PoP operated by the tunnel broker" ++msgstr "" ++ ++msgid "" ++"This list gives an overview over currently running system processes and " ++"their status." ++msgstr "" ++ ++msgid "This page allows the configuration of custom button actions" ++msgstr "" ++ ++msgid "This page gives an overview over currently active network connections." ++msgstr "" ++ ++msgid "This section contains no values yet" ++msgstr "" ++ ++msgid "Time Synchronization" ++msgstr "" ++ ++msgid "Time Synchronization is not configured yet." ++msgstr "" ++ ++msgid "Timezone" ++msgstr "" ++ ++msgid "" ++"To restore configuration files, you can upload a previously generated backup " ++"archive here." ++msgstr "" ++ ++msgid "Total Available" ++msgstr "" ++ ++msgid "Traceroute" ++msgstr "" ++ ++msgid "Traffic" ++msgstr "" ++ ++msgid "Transfer" ++msgstr "" ++ ++msgid "Transmission Rate" ++msgstr "" ++ ++msgid "Transmit" ++msgstr "" ++ ++msgid "Transmit Power" ++msgstr "" ++ ++msgid "Transmitter Antenna" ++msgstr "" ++ ++msgid "Trigger" ++msgstr "" ++ ++msgid "Trigger Mode" ++msgstr "" ++ ++msgid "Tunnel ID" ++msgstr "" ++ ++msgid "Tunnel Interface" ++msgstr "" ++ ++msgid "Tunnel Link" ++msgstr "" ++ ++msgid "Tunnel broker protocol" ++msgstr "" ++ ++msgid "Tunnel setup server" ++msgstr "" ++ ++msgid "Tunnel type" ++msgstr "" ++ ++msgid "Turbo Mode" ++msgstr "" ++ ++msgid "Tx-Power" ++msgstr "" ++ ++msgid "Type" ++msgstr "" ++ ++msgid "UDP:" ++msgstr "" ++ ++msgid "UMTS only" ++msgstr "" ++ ++msgid "UMTS/GPRS/EV-DO" ++msgstr "" ++ ++msgid "USB Device" ++msgstr "" ++ ++msgid "UUID" ++msgstr "" ++ ++msgid "Unable to dispatch" ++msgstr "" ++ ++msgid "Unknown" ++msgstr "" ++ ++msgid "Unknown Error, password not changed!" ++msgstr "" ++ ++msgid "Unmanaged" ++msgstr "" ++ ++msgid "Unsaved Changes" ++msgstr "" ++ ++msgid "Unsupported protocol type." ++msgstr "" ++ ++msgid "Update lists" ++msgstr "" ++ ++msgid "" ++"Upload a sysupgrade-compatible image here to replace the running firmware. " ++"Check \"Keep settings\" to retain the current configuration (requires an " ++"OpenWrt compatible firmware image)." ++msgstr "" ++ ++msgid "Upload archive..." ++msgstr "" ++ ++msgid "Uploaded File" ++msgstr "" ++ ++msgid "Uptime" ++msgstr "" ++ ++msgid "Use /etc/ethers" ++msgstr "" ++ ++msgid "Use DHCP gateway" ++msgstr "" ++ ++msgid "Use DNS servers advertised by peer" ++msgstr "" ++ ++msgid "Use ISO/IEC 3166 alpha2 country codes." ++msgstr "" ++ ++msgid "Use MTU on tunnel interface" ++msgstr "" ++ ++msgid "Use TTL on tunnel interface" ++msgstr "" ++ ++msgid "Use as external overlay (/overlay)" ++msgstr "" ++ ++msgid "Use as root filesystem (/)" ++msgstr "" ++ ++msgid "Use broadcast flag" ++msgstr "" ++ ++msgid "Use builtin IPv6-management" ++msgstr "" ++ ++msgid "Use custom DNS servers" ++msgstr "" ++ ++msgid "Use default gateway" ++msgstr "" ++ ++msgid "Use gateway metric" ++msgstr "" ++ ++msgid "Use routing table" ++msgstr "" ++ ++msgid "" ++"Use the Add Button to add a new lease entry. The MAC-Address indentifies the host, the IPv4-Address specifies to the fixed " ++"address to use and the Hostname is assigned as symbolic name to the " ++"requesting host." ++msgstr "" ++ ++msgid "Used" ++msgstr "" ++ ++msgid "Used Key Slot" ++msgstr "" ++ ++msgid "User certificate (PEM encoded)" ++msgstr "" ++ ++msgid "User key (PEM encoded)" ++msgstr "" ++ ++msgid "Username" ++msgstr "" ++ ++msgid "VC-Mux" ++msgstr "" ++ ++msgid "VLAN Interface" ++msgstr "" ++ ++msgid "VLANs on %q" ++msgstr "" ++ ++msgid "VLANs on %q (%s)" ++msgstr "" ++ ++msgid "VPN Server" ++msgstr "" ++ ++msgid "VPN Server port" ++msgstr "" ++ ++msgid "VPN Server's certificate SHA1 hash" ++msgstr "" ++ ++msgid "Vendor Class to send when requesting DHCP" ++msgstr "" ++ ++msgid "Verbose" ++msgstr "" ++ ++msgid "Verbose logging by aiccu daemon" ++msgstr "" ++ ++msgid "Verify" ++msgstr "" ++ ++msgid "Version" ++msgstr "" ++ ++msgid "WDS" ++msgstr "" ++ ++msgid "WEP Open System" ++msgstr "" ++ ++msgid "WEP Shared Key" ++msgstr "" ++ ++msgid "WEP passphrase" ++msgstr "" ++ ++msgid "WMM Mode" ++msgstr "" ++ ++msgid "WPA passphrase" ++msgstr "" ++ ++msgid "" ++"WPA-Encryption requires wpa_supplicant (for client mode) or hostapd (for AP " ++"and ad-hoc mode) to be installed." ++msgstr "" ++ ++msgid "" ++"Wait for NTP sync that many seconds, seting to 0 disables waiting (optional)" ++msgstr "" ++ ++msgid "Waiting for changes to be applied..." ++msgstr "" ++ ++msgid "Waiting for command to complete..." ++msgstr "" ++ ++msgid "Warning" ++msgstr "" ++ ++msgid "Warning: There are unsaved changes that will be lost while rebooting!" ++msgstr "" ++ ++msgid "Whether to create an IPv6 default route over the tunnel" ++msgstr "" ++ ++msgid "Whether to route only packets from delegated prefixes" ++msgstr "" ++ ++msgid "Width" ++msgstr "" ++ ++msgid "Wifi" ++msgstr "" ++ ++msgid "Wireless" ++msgstr "" ++ ++msgid "Wireless Adapter" ++msgstr "" ++ ++msgid "Wireless Network" ++msgstr "" ++ ++msgid "Wireless Overview" ++msgstr "" ++ ++msgid "Wireless Security" ++msgstr "" ++ ++msgid "Wireless is disabled or not associated" ++msgstr "" ++ ++msgid "Wireless is restarting..." ++msgstr "" ++ ++msgid "Wireless network is disabled" ++msgstr "" ++ ++msgid "Wireless network is enabled" ++msgstr "" ++ ++msgid "Wireless restarted" ++msgstr "" ++ ++msgid "Wireless shut down" ++msgstr "" ++ ++msgid "Write received DNS requests to syslog" ++msgstr "" ++ ++msgid "XR Support" ++msgstr "" ++ ++msgid "" ++"You can enable or disable installed init scripts here. Changes will applied " ++"after a device reboot.
    Warning: If you disable essential init " ++"scripts like \"network\", your device might become inaccessible!" ++msgstr "" ++ ++msgid "" ++"You must enable Java Script in your browser or LuCI will not work properly." ++msgstr "" ++ ++msgid "" ++"Your Internet Explorer is too old to display this page correctly. Please " ++"upgrade it to at least version 7 or use another browser like Firefox, Opera " ++"or Safari." ++msgstr "" ++ ++msgid "any" ++msgstr "" ++ ++msgid "auto" ++msgstr "" ++ ++msgid "automatic" ++msgstr "" ++ ++msgid "baseT" ++msgstr "" ++ ++msgid "bridged" ++msgstr "" ++ ++msgid "create:" ++msgstr "" ++ ++msgid "creates a bridge over specified interface(s)" ++msgstr "" ++ ++msgid "dB" ++msgstr "" ++ ++msgid "dBm" ++msgstr "" ++ ++msgid "disable" ++msgstr "" ++ ++msgid "disabled" ++msgstr "" ++ ++msgid "expired" ++msgstr "" ++ ++msgid "" ++"file where given DHCP-leases will be stored" ++msgstr "" ++ ++msgid "forward" ++msgstr "" ++ ++msgid "full-duplex" ++msgstr "" ++ ++msgid "half-duplex" ++msgstr "" ++ ++msgid "help" ++msgstr "" ++ ++msgid "hidden" ++msgstr "" ++ ++msgid "hybrid mode" ++msgstr "" ++ ++msgid "if target is a network" ++msgstr "" ++ ++msgid "input" ++msgstr "" ++ ++msgid "kB" ++msgstr "" ++ ++msgid "kB/s" ++msgstr "" ++ ++msgid "kbit/s" ++msgstr "" ++ ++msgid "local DNS file" ++msgstr "" ++ ++msgid "minimum 1280, maximum 1480" ++msgstr "" ++ ++msgid "navigation Navigation" ++msgstr "" ++ ++msgid "no" ++msgstr "" ++ ++msgid "no link" ++msgstr "" ++ ++msgid "none" ++msgstr "" ++ ++msgid "not present" ++msgstr "" ++ ++msgid "off" ++msgstr "" ++ ++msgid "on" ++msgstr "" ++ ++msgid "open" ++msgstr "" ++ ++msgid "overlay" ++msgstr "" ++ ++msgid "relay mode" ++msgstr "" ++ ++msgid "routed" ++msgstr "" ++ ++msgid "server mode" ++msgstr "" ++ ++msgid "skiplink1 Skip to navigation" ++msgstr "" ++ ++msgid "skiplink2 Skip to content" ++msgstr "" ++ ++msgid "stateful-only" ++msgstr "" ++ ++msgid "stateless" ++msgstr "" ++ ++msgid "stateless + stateful" ++msgstr "" ++ ++msgid "tagged" ++msgstr "" ++ ++msgid "unknown" ++msgstr "" ++ ++msgid "unlimited" ++msgstr "" ++ ++msgid "unspecified" ++msgstr "" ++ ++msgid "unspecified -or- create:" ++msgstr "" ++ ++msgid "untagged" ++msgstr "" ++ ++msgid "yes" ++msgstr "" ++ ++msgid "« Back" ++msgstr "" +diff --git a/feeds/luci/modules/luci-base/po/tr/base.po b/feeds/luci/modules/luci-base/po/tr/base.po +new file mode 100644 +index 0000000..1bf53aa +--- /dev/null ++++ b/feeds/luci/modules/luci-base/po/tr/base.po +@@ -0,0 +1,3087 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"PO-Revision-Date: 2013-11-25 14:47+0200\n" ++"Last-Translator: qbilay \n" ++"Language-Team: none\n" ++"Language: tr\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=1; plural=0;\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "(%d minute window, %d second interval)" ++msgstr "(%d dakika gösteriliyor, %d saniye aralıklı)" ++ ++msgid "(%s available)" ++msgstr "(%s uygun)" ++ ++msgid "(empty)" ++msgstr "(boş)" ++ ++msgid "(no interfaces attached)" ++msgstr "(arayüz eklenmedi)" ++ ++msgid "-- Additional Field --" ++msgstr "-- Ek Alan--" ++ ++msgid "-- Please choose --" ++msgstr "-- Lütfen seçiniz --" ++ ++msgid "-- custom --" ++msgstr "-- özel --" ++ ++msgid "-- match by device --" ++msgstr "" ++ ++msgid "-- match by label --" ++msgstr "" ++ ++msgid "1 Minute Load:" ++msgstr "1 Dakikalık Yük:" ++ ++msgid "15 Minute Load:" ++msgstr "15 Dakikalık Yük:" ++ ++msgid "5 Minute Load:" ++msgstr "5 Dakikalık Yük:" ++ ++msgid "BSSID" ++msgstr " BSSID " ++ ++msgid "DNS query port" ++msgstr "DNS port sorgula" ++ ++msgid "DNS server port" ++msgstr "DNS sunucu port" ++ ++msgid "" ++"DNS servers will be queried in the " ++"order of the resolvfile" ++msgstr "" ++ ++msgid "ESSID" ++msgstr "" ++ ++msgid "IPv4-Address" ++msgstr "IPv4-Adres" ++ ++msgid "IPv4-Gateway" ++msgstr "IPv4-Gateway" ++ ++msgid "IPv4-Netmask" ++msgstr "IPv4-Netmask" ++ ++msgid "" ++"IPv6-Address or Network " ++"(CIDR)" ++msgstr "" ++"IPv6-Address or Network " ++"(CIDR)" ++ ++msgid "IPv6-Gateway" ++msgstr "IPv6-Gateway" ++ ++msgid "IPv6-Suffix (hex)" ++msgstr "" ++ ++msgid "LED Configuration" ++msgstr "LED Ayarları" ++ ++msgid "LED Name" ++msgstr "LED Adı" ++ ++msgid "MAC-Address" ++msgstr "MAC-Adresi" ++ ++msgid "" ++"Max. DHCP leases" ++msgstr "" ++"Maks. DHCP leases" ++ ++msgid "" ++"Max. EDNS0 packet size" ++msgstr "" ++"Maks. EDNS0 paket boyutu" ++ ++msgid "Max. concurrent queries" ++msgstr "Maks. eşzamanlı sorgu" ++ ++msgid "%s - %s" ++msgstr "" ++ ++msgid "ADSL" ++msgstr "" ++ ++msgid "ADSL Status" ++msgstr "" ++ ++msgid "AICCU (SIXXS)" ++msgstr "" ++ ++msgid "APN" ++msgstr "APN" ++ ++msgid "AR Support" ++msgstr "AR Desteği" ++ ++msgid "ARP retry threshold" ++msgstr "ARP yenileme aralığı" ++ ++msgid "ATM Bridges" ++msgstr "ATM Köprüleri" ++ ++msgid "ATM Virtual Channel Identifier (VCI)" ++msgstr "" ++ ++msgid "ATM Virtual Path Identifier (VPI)" ++msgstr "" ++ ++msgid "" ++"ATM bridges expose encapsulated ethernet in AAL5 connections as virtual " ++"Linux network interfaces which can be used in conjunction with DHCP or PPP " ++"to dial into the provider network." ++msgstr "" ++ ++msgid "ATM device number" ++msgstr "" ++ ++msgid "AYIYA" ++msgstr "" ++ ++msgid "Access Concentrator" ++msgstr "" ++ ++msgid "Access Point" ++msgstr "Erişim Noktası" ++ ++msgid "Action" ++msgstr "Eylem" ++ ++msgid "Actions" ++msgstr "Eylemler" ++ ++msgid "Activate this network" ++msgstr "Bu ağı etkinleştir" ++ ++msgid "Active IPv4-Routes" ++msgstr "" ++"Aktif IPv4-Yönlendiriciler" ++ ++msgid "Active IPv6-Routes" ++msgstr "" ++"Aktif IPv6-Yönlendiriciler" ++ ++msgid "Active Connections" ++msgstr "Aktif Bağlantılar" ++ ++msgid "Active DHCP Leases" ++msgstr "Aktif DHCP Kiraları" ++ ++msgid "Active DHCPv6 Leases" ++msgstr "Aktif DHCPv6 Kiraları" ++ ++msgid "Ad-Hoc" ++msgstr "" ++ ++msgid "Add" ++msgstr "Ekle" ++ ++msgid "Add local domain suffix to names served from hosts files" ++msgstr "" ++ ++msgid "Add new interface..." ++msgstr "Yeni arabirim ekle..." ++ ++msgid "Additional Hosts files" ++msgstr "" ++ ++msgid "Address" ++msgstr "Adresler" ++ ++msgid "Address to access local relay bridge" ++msgstr "" ++ ++msgid "Administration" ++msgstr "" ++ ++msgid "Advanced Settings" ++msgstr "Gelişmiş Ayarlar" ++ ++msgid "Alert" ++msgstr "Uyarı" ++ ++# "Secure Shell" için ne kullanılabilinir bir fikrim yok. ++msgid "Allow SSH password authentication" ++msgstr "" ++"SSH parola kimlik doğrulamasına izin ver" ++ ++msgid "Allow all except listed" ++msgstr "Listelenenlerin haricindekilere izin ver" ++ ++msgid "Allow listed only" ++msgstr "Yanlızca listelenenlere izin ver" ++ ++msgid "Allow localhost" ++msgstr "" ++ ++msgid "Allow remote hosts to connect to local SSH forwarded ports" ++msgstr "" ++ ++msgid "Allow root logins with password" ++msgstr "" ++ ++msgid "Allow the root user to login with password" ++msgstr "" ++ ++msgid "" ++"Allow upstream responses in the 127.0.0.0/8 range, e.g. for RBL services" ++msgstr "" ++ ++msgid "" ++"Also see Tunneling Comparison on SIXXS" ++msgstr "" ++ ++msgid "Always announce default router" ++msgstr "" ++ ++msgid "An additional network will be created if you leave this unchecked." ++msgstr "" ++ ++msgid "Announce as default router even if no public prefix is available." ++msgstr "" ++ ++msgid "Announced DNS domains" ++msgstr "" ++ ++msgid "Announced DNS servers" ++msgstr "" ++ ++msgid "Antenna 1" ++msgstr "1. Anten" ++ ++msgid "Antenna 2" ++msgstr "2. Anten" ++ ++msgid "Antenna Configuration" ++msgstr "Anten Yapılandırması" ++ ++msgid "Any zone" ++msgstr "" ++ ++msgid "Apply" ++msgstr "Uygula" ++ ++msgid "Applying changes" ++msgstr "Değişiklikleri uygula" ++ ++msgid "" ++"Assign a part of given length of every public IPv6-prefix to this interface" ++msgstr "" ++ ++msgid "Assign interfaces..." ++msgstr "Arabirim ata..." ++ ++msgid "" ++"Assign prefix parts using this hexadecimal subprefix ID for this interface." ++msgstr "" ++ ++msgid "Associated Stations" ++msgstr "" ++ ++msgid "Atheros 802.11%s Wireless Controller" ++msgstr "Atheros 802.11%s Kablosuz Denetleyicisi" ++ ++msgid "AuthGroup" ++msgstr "" ++ ++msgid "Authentication" ++msgstr "Kimlik doğrulama" ++ ++msgid "Authoritative" ++msgstr "Yetkilendirme" ++ ++msgid "Authorization Required" ++msgstr "Yetkilendirme Gerekli" ++ ++msgid "Auto Refresh" ++msgstr "Otomatik Yenileme" ++ ++msgid "Automatic" ++msgstr "" ++ ++msgid "Automatic Homenet (HNCP)" ++msgstr "" ++ ++msgid "Available" ++msgstr "Kullanılabilir" ++ ++msgid "Available packages" ++msgstr "Kullanılabilir Paketler" ++ ++msgid "Average:" ++msgstr "Ortalama:" ++ ++msgid "BSSID" ++msgstr "" ++ ++msgid "Back" ++msgstr "Geri" ++ ++msgid "Back to Overview" ++msgstr "Genel Bakışa dön" ++ ++msgid "Back to configuration" ++msgstr "Yapılandırmaya dön" ++ ++msgid "Back to overview" ++msgstr "Genel Bakışa dön" ++ ++msgid "Back to scan results" ++msgstr "Tarama sonuçlarına dön" ++ ++msgid "Background Scan" ++msgstr "Arka Planda Tarama" ++ ++msgid "Backup / Flash Firmware" ++msgstr "" ++ ++msgid "Backup / Restore" ++msgstr "Yedekleme / Geri Yükleme" ++ ++msgid "Backup file list" ++msgstr "" ++ ++msgid "Bad address specified!" ++msgstr "" ++ ++msgid "Band" ++msgstr "" ++ ++msgid "Behind NAT" ++msgstr "" ++ ++msgid "" ++"Below is the determined list of files to backup. It consists of changed " ++"configuration files marked by opkg, essential base files and the user " ++"defined backup patterns." ++msgstr "" ++ ++msgid "Bitrate" ++msgstr "" ++ ++msgid "Bogus NX Domain Override" ++msgstr "" ++ ++msgid "Bridge" ++msgstr "" ++ ++msgid "Bridge interfaces" ++msgstr "" ++ ++msgid "Bridge unit number" ++msgstr "" ++ ++msgid "Bring up on boot" ++msgstr "" ++ ++msgid "Broadcom 802.11%s Wireless Controller" ++msgstr "" ++ ++msgid "Broadcom BCM%04x 802.11 Wireless Controller" ++msgstr "" ++ ++msgid "Buffered" ++msgstr "" ++ ++msgid "Buttons" ++msgstr "" ++ ++msgid "CA certificate; if empty it will be saved after the first connection." ++msgstr "" ++ ++msgid "CPU" ++msgstr "" ++ ++msgid "CPU usage (%)" ++msgstr "" ++ ++msgid "Cancel" ++msgstr "" ++ ++msgid "Category" ++msgstr "" ++ ++msgid "Chain" ++msgstr "" ++ ++msgid "Changes" ++msgstr "" ++ ++msgid "Changes applied." ++msgstr "" ++ ++msgid "Changes the administrator password for accessing the device" ++msgstr "" ++ ++msgid "Channel" ++msgstr "" ++ ++msgid "Check" ++msgstr "" ++ ++msgid "Checksum" ++msgstr "" ++ ++msgid "" ++"Choose the firewall zone you want to assign to this interface. Select " ++"unspecified to remove the interface from the associated zone or " ++"fill out the create field to define a new zone and attach the " ++"interface to it." ++msgstr "" ++ ++msgid "" ++"Choose the network(s) you want to attach to this wireless interface or fill " ++"out the create field to define a new network." ++msgstr "" ++ ++msgid "Cipher" ++msgstr "" ++ ++msgid "" ++"Click \"Generate archive\" to download a tar archive of the current " ++"configuration files. To reset the firmware to its initial state, click " ++"\"Perform reset\" (only possible with squashfs images)." ++msgstr "" ++ ++msgid "Client" ++msgstr "" ++ ++msgid "Client ID to send when requesting DHCP" ++msgstr "" ++ ++msgid "" ++"Close inactive connection after the given amount of seconds, use 0 to " ++"persist connection" ++msgstr "" ++ ++msgid "Close list..." ++msgstr "" ++ ++msgid "Collecting data..." ++msgstr "" ++ ++msgid "Command" ++msgstr "" ++ ++msgid "Common Configuration" ++msgstr "" ++ ++msgid "Compression" ++msgstr "" ++ ++msgid "Configuration" ++msgstr "" ++ ++msgid "Configuration applied." ++msgstr "" ++ ++msgid "Configuration files will be kept." ++msgstr "" ++ ++msgid "Confirmation" ++msgstr "" ++ ++msgid "Connect" ++msgstr "" ++ ++msgid "Connected" ++msgstr "" ++ ++msgid "Connection Limit" ++msgstr "" ++ ++msgid "Connection to server fails when TLS cannot be used" ++msgstr "" ++ ++msgid "Connections" ++msgstr "" ++ ++msgid "Country" ++msgstr "" ++ ++msgid "Country Code" ++msgstr "" ++ ++msgid "Cover the following interface" ++msgstr "" ++ ++msgid "Cover the following interfaces" ++msgstr "" ++ ++msgid "Create / Assign firewall-zone" ++msgstr "" ++ ++msgid "Create Interface" ++msgstr "" ++ ++msgid "Create a bridge over multiple interfaces" ++msgstr "" ++ ++msgid "Critical" ++msgstr "" ++ ++msgid "Cron Log Level" ++msgstr "" ++ ++msgid "Custom Interface" ++msgstr "" ++ ++msgid "Custom delegated IPv6-prefix" ++msgstr "" ++ ++msgid "" ++"Customizes the behaviour of the device LEDs if possible." ++msgstr "" ++ ++msgid "DHCP Leases" ++msgstr "" ++ ++msgid "DHCP Server" ++msgstr "" ++ ++msgid "DHCP and DNS" ++msgstr "" ++ ++msgid "DHCP client" ++msgstr "" ++ ++msgid "DHCP-Options" ++msgstr "" ++ ++msgid "DHCPv6 Leases" ++msgstr "" ++ ++msgid "DHCPv6 client" ++msgstr "" ++ ++msgid "DHCPv6-Mode" ++msgstr "" ++ ++msgid "DHCPv6-Service" ++msgstr "" ++ ++msgid "DNS" ++msgstr "" ++ ++msgid "DNS forwardings" ++msgstr "" ++ ++msgid "DNS-Label / FQDN" ++msgstr "" ++ ++msgid "DS-Lite AFTR address" ++msgstr "" ++ ++msgid "DUID" ++msgstr "" ++ ++msgid "Debug" ++msgstr "" ++ ++msgid "Default %d" ++msgstr "" ++ ++msgid "Default gateway" ++msgstr "" ++ ++msgid "Default route" ++msgstr "" ++ ++msgid "Default state" ++msgstr "" ++ ++msgid "Define a name for this network." ++msgstr "" ++ ++msgid "" ++"Define additional DHCP options, for example " ++"\"6,192.168.2.1,192.168.2.2\" which advertises different DNS " ++"servers to clients." ++msgstr "" ++ ++msgid "Delete" ++msgstr "" ++ ++msgid "Delete this interface" ++msgstr "" ++ ++msgid "Delete this network" ++msgstr "" ++ ++msgid "Description" ++msgstr "" ++ ++msgid "Design" ++msgstr "" ++ ++msgid "Destination" ++msgstr "" ++ ++msgid "Device" ++msgstr "" ++ ++msgid "Device Configuration" ++msgstr "" ++ ++msgid "Diagnostics" ++msgstr "" ++ ++msgid "Dial number" ++msgstr "" ++ ++msgid "Directory" ++msgstr "" ++ ++msgid "Disable" ++msgstr "" ++ ++msgid "" ++"Disable DHCP for " ++"this interface." ++msgstr "" ++ ++msgid "Disable DNS setup" ++msgstr "" ++ ++msgid "Disable HW-Beacon timer" ++msgstr "" ++ ++msgid "Disabled" ++msgstr "" ++ ++msgid "Discard upstream RFC1918 responses" ++msgstr "" ++ ++msgid "Displaying only packages containing" ++msgstr "" ++ ++msgid "Distance Optimization" ++msgstr "" ++ ++msgid "Distance to farthest network member in meters." ++msgstr "" ++ ++msgid "Diversity" ++msgstr "" ++ ++msgid "" ++"Dnsmasq is a combined DHCP-Server and DNS-" ++"Forwarder for NAT " ++"firewalls" ++msgstr "" ++ ++msgid "Do not cache negative replies, e.g. for not existing domains" ++msgstr "" ++ ++msgid "Do not forward requests that cannot be answered by public name servers" ++msgstr "" ++ ++msgid "Do not forward reverse lookups for local networks" ++msgstr "" ++ ++msgid "Do not send probe responses" ++msgstr "" ++ ++msgid "Domain required" ++msgstr "" ++ ++msgid "Domain whitelist" ++msgstr "" ++ ++msgid "" ++"Don't forward DNS-Requests without " ++"DNS-Name" ++msgstr "" ++ ++msgid "Download and install package" ++msgstr "" ++ ++msgid "Download backup" ++msgstr "" ++ ++msgid "Dropbear Instance" ++msgstr "" ++ ++msgid "" ++"Dropbear offers SSH network shell access " ++"and an integrated SCP server" ++msgstr "" ++ ++msgid "Dual-Stack Lite (RFC6333)" ++msgstr "" ++ ++msgid "Dynamic DHCP" ++msgstr "" ++ ++msgid "Dynamic tunnel" ++msgstr "" ++ ++msgid "" ++"Dynamically allocate DHCP addresses for clients. If disabled, only clients " ++"having static leases will be served." ++msgstr "" ++ ++msgid "EAP-Method" ++msgstr "" ++ ++msgid "Edit" ++msgstr "" ++ ++msgid "" ++"Edit the raw configuration data above to fix any error and hit \"Save\" to " ++"reload the page." ++msgstr "" ++ ++msgid "Edit this interface" ++msgstr "" ++ ++msgid "Edit this network" ++msgstr "" ++ ++msgid "Emergency" ++msgstr "" ++ ++msgid "Enable" ++msgstr "" ++ ++msgid "Enable STP" ++msgstr "" ++ ++msgid "Enable HE.net dynamic endpoint update" ++msgstr "" ++ ++msgid "Enable IPv6 negotiation on the PPP link" ++msgstr "" ++ ++msgid "Enable Jumbo Frame passthrough" ++msgstr "" ++ ++msgid "Enable NTP client" ++msgstr "" ++ ++msgid "Enable TFTP server" ++msgstr "" ++ ++msgid "Enable VLAN functionality" ++msgstr "" ++ ++msgid "Enable WPS pushbutton, requires WPA(2)-PSK" ++msgstr "" ++ ++msgid "Enable learning and aging" ++msgstr "" ++ ++msgid "Enable mirroring of incoming packets" ++msgstr "" ++ ++msgid "Enable mirroring of outgoing packets" ++msgstr "" ++ ++msgid "Enable this mount" ++msgstr "" ++ ++msgid "Enable this swap" ++msgstr "" ++ ++msgid "Enable/Disable" ++msgstr "" ++ ++msgid "Enabled" ++msgstr "" ++ ++msgid "Enables the Spanning Tree Protocol on this bridge" ++msgstr "" ++ ++msgid "Encapsulation mode" ++msgstr "" ++ ++msgid "Encryption" ++msgstr "" ++ ++msgid "Erasing..." ++msgstr "" ++ ++msgid "Error" ++msgstr "" ++ ++msgid "Ethernet Adapter" ++msgstr "" ++ ++msgid "Ethernet Switch" ++msgstr "" ++ ++msgid "Expand hosts" ++msgstr "" ++ ++msgid "Expires" ++msgstr "" ++ ++msgid "" ++"Expiry time of leased addresses, minimum is 2 minutes (2m)." ++msgstr "" ++ ++msgid "External" ++msgstr "" ++ ++msgid "External system log server" ++msgstr "" ++ ++msgid "External system log server port" ++msgstr "" ++ ++msgid "Fast Frames" ++msgstr "" ++ ++msgid "File" ++msgstr "" ++ ++msgid "Filename of the boot image advertised to clients" ++msgstr "" ++ ++msgid "Filesystem" ++msgstr "" ++ ++msgid "Filter" ++msgstr "" ++ ++msgid "Filter private" ++msgstr "" ++ ++msgid "Filter useless" ++msgstr "" ++ ++msgid "Find and join network" ++msgstr "" ++ ++msgid "Find package" ++msgstr "" ++ ++msgid "Finish" ++msgstr "" ++ ++msgid "Firewall" ++msgstr "" ++ ++msgid "Firewall Settings" ++msgstr "" ++ ++msgid "Firewall Status" ++msgstr "" ++ ++msgid "Firmware Version" ++msgstr "" ++ ++msgid "Fixed source port for outbound DNS queries" ++msgstr "" ++ ++msgid "Flags" ++msgstr "" ++ ++msgid "Flash Firmware" ++msgstr "" ++ ++msgid "Flash image..." ++msgstr "" ++ ++msgid "Flash new firmware image" ++msgstr "" ++ ++msgid "Flash operations" ++msgstr "" ++ ++msgid "Flashing..." ++msgstr "" ++ ++msgid "Force" ++msgstr "" ++ ++msgid "Force CCMP (AES)" ++msgstr "" ++ ++msgid "Force DHCP on this network even if another server is detected." ++msgstr "" ++ ++msgid "Force TKIP" ++msgstr "" ++ ++msgid "Force TKIP and CCMP (AES)" ++msgstr "" ++ ++msgid "Forward DHCP traffic" ++msgstr "" ++ ++msgid "Forward broadcast traffic" ++msgstr "" ++ ++msgid "Forwarding mode" ++msgstr "" ++ ++msgid "Fragmentation Threshold" ++msgstr "" ++ ++msgid "Frame Bursting" ++msgstr "" ++ ++msgid "Free" ++msgstr "" ++ ++msgid "Free space" ++msgstr "" ++ ++msgid "GHz" ++msgstr "" ++ ++msgid "GPRS only" ++msgstr "" ++ ++msgid "Gateway" ++msgstr "" ++ ++msgid "Gateway ports" ++msgstr "" ++ ++msgid "General Settings" ++msgstr "" ++ ++msgid "General Setup" ++msgstr "" ++ ++msgid "Generate archive" ++msgstr "" ++ ++msgid "Generic 802.11%s Wireless Controller" ++msgstr "" ++ ++msgid "Given password confirmation did not match, password not changed!" ++msgstr "" ++ ++msgid "Global network options" ++msgstr "" ++ ++msgid "Go to password configuration..." ++msgstr "" ++ ++msgid "Go to relevant configuration page" ++msgstr "" ++ ++msgid "Guest" ++msgstr "" ++ ++msgid "HE.net password" ++msgstr "" ++ ++msgid "HE.net username" ++msgstr "" ++ ++msgid "Handler" ++msgstr "" ++ ++msgid "Hang Up" ++msgstr "" ++ ++msgid "Heartbeat" ++msgstr "" ++ ++msgid "" ++"Here you can configure the basic aspects of your device like its hostname or " ++"the timezone." ++msgstr "" ++ ++msgid "" ++"Here you can paste public SSH-Keys (one per line) for SSH public-key " ++"authentication." ++msgstr "" ++ ++msgid "Hermes 802.11b Wireless Controller" ++msgstr "" ++ ++msgid "Hide ESSID" ++msgstr "" ++ ++msgid "Host entries" ++msgstr "" ++ ++msgid "Host expiry timeout" ++msgstr "" ++ ++msgid "Host-IP or Network" ++msgstr "" ++ ++msgid "Hostname" ++msgstr "" ++ ++msgid "Hostname to send when requesting DHCP" ++msgstr "" ++ ++msgid "Hostnames" ++msgstr "" ++ ++msgid "Hybrid" ++msgstr "" ++ ++msgid "IP address" ++msgstr "" ++ ++msgid "IPv4" ++msgstr "" ++ ++msgid "IPv4 Firewall" ++msgstr "" ++ ++msgid "IPv4 WAN Status" ++msgstr "" ++ ++msgid "IPv4 address" ++msgstr "" ++ ++msgid "IPv4 and IPv6" ++msgstr "" ++ ++msgid "IPv4 assignment length" ++msgstr "" ++ ++msgid "IPv4 broadcast" ++msgstr "" ++ ++msgid "IPv4 gateway" ++msgstr "" ++ ++msgid "IPv4 netmask" ++msgstr "" ++ ++msgid "IPv4 only" ++msgstr "" ++ ++msgid "IPv4 prefix length" ++msgstr "" ++ ++msgid "IPv4-Address" ++msgstr "" ++ ++msgid "IPv6" ++msgstr "" ++ ++msgid "IPv6 Firewall" ++msgstr "" ++ ++msgid "IPv6 Neighbours" ++msgstr "" ++ ++msgid "IPv6 Settings" ++msgstr "" ++ ++msgid "IPv6 ULA-Prefix" ++msgstr "" ++ ++msgid "IPv6 WAN Status" ++msgstr "" ++ ++msgid "IPv6 address" ++msgstr "" ++ ++msgid "IPv6 address delegated to the local tunnel endpoint (optional)" ++msgstr "" ++ ++msgid "IPv6 assignment hint" ++msgstr "" ++ ++msgid "IPv6 assignment length" ++msgstr "" ++ ++msgid "IPv6 gateway" ++msgstr "" ++ ++msgid "IPv6 only" ++msgstr "" ++ ++msgid "IPv6 prefix" ++msgstr "" ++ ++msgid "IPv6 prefix length" ++msgstr "" ++ ++msgid "IPv6 routed prefix" ++msgstr "" ++ ++msgid "IPv6-Address" ++msgstr "" ++ ++msgid "IPv6-in-IPv4 (RFC4213)" ++msgstr "" ++ ++msgid "IPv6-over-IPv4 (6rd)" ++msgstr "" ++ ++msgid "IPv6-over-IPv4 (6to4)" ++msgstr "" ++ ++msgid "Identity" ++msgstr "" ++ ++msgid "" ++"If specified, mount the device by its UUID instead of a fixed device node" ++msgstr "" ++ ++msgid "" ++"If specified, mount the device by the partition label instead of a fixed " ++"device node" ++msgstr "" ++ ++msgid "If unchecked, no default route is configured" ++msgstr "" ++ ++msgid "If unchecked, the advertised DNS server addresses are ignored" ++msgstr "" ++ ++msgid "" ++"If your physical memory is insufficient unused data can be temporarily " ++"swapped to a swap-device resulting in a higher amount of usable RAM. Be aware that swapping data is a very " ++"slow process as the swap-device cannot be accessed with the high datarates " ++"of the RAM." ++msgstr "" ++ ++msgid "Ignore Hosts files" ++msgstr "" ++ ++msgid "Ignore interface" ++msgstr "" ++ ++msgid "Ignore resolve file" ++msgstr "" ++ ++msgid "Image" ++msgstr "" ++ ++msgid "In" ++msgstr "" ++ ++msgid "Inactivity timeout" ++msgstr "" ++ ++msgid "Inbound:" ++msgstr "" ++ ++msgid "Info" ++msgstr "" ++ ++msgid "Initscript" ++msgstr "" ++ ++msgid "Initscripts" ++msgstr "" ++ ++msgid "Install" ++msgstr "" ++ ++msgid "Install iputils-traceroute6 for IPv6 traceroute" ++msgstr "" ++ ++msgid "Install package %q" ++msgstr "" ++ ++msgid "Install protocol extensions..." ++msgstr "" ++ ++msgid "Installed packages" ++msgstr "" ++ ++msgid "Interface" ++msgstr "" ++ ++msgid "Interface Configuration" ++msgstr "" ++ ++msgid "Interface Overview" ++msgstr "" ++ ++msgid "Interface is reconnecting..." ++msgstr "" ++ ++msgid "Interface is shutting down..." ++msgstr "" ++ ++msgid "Interface not present or not connected yet." ++msgstr "" ++ ++msgid "Interface reconnected" ++msgstr "" ++ ++msgid "Interface shut down" ++msgstr "" ++ ++msgid "Interfaces" ++msgstr "" ++ ++msgid "Internal" ++msgstr "" ++ ++msgid "Internal Server Error" ++msgstr "" ++ ++msgid "Invalid" ++msgstr "" ++ ++msgid "Invalid VLAN ID given! Only IDs between %d and %d are allowed." ++msgstr "" ++ ++msgid "Invalid VLAN ID given! Only unique IDs are allowed" ++msgstr "" ++ ++msgid "Invalid username and/or password! Please try again." ++msgstr "" ++ ++msgid "" ++"It appears that you are trying to flash an image that does not fit into the " ++"flash memory, please verify the image file!" ++msgstr "" ++ ++msgid "Java Script required!" ++msgstr "" ++ ++msgid "Join Network" ++msgstr "" ++ ++msgid "Join Network: Settings" ++msgstr "" ++ ++msgid "Join Network: Wireless Scan" ++msgstr "" ++ ++msgid "Keep settings" ++msgstr "" ++ ++msgid "Kernel Log" ++msgstr "" ++ ++msgid "Kernel Version" ++msgstr "" ++ ++msgid "Key" ++msgstr "" ++ ++msgid "Key #%d" ++msgstr "" ++ ++msgid "Kill" ++msgstr "" ++ ++msgid "L2TP" ++msgstr "" ++ ++msgid "L2TP Server" ++msgstr "" ++ ++msgid "LCP echo failure threshold" ++msgstr "" ++ ++msgid "LCP echo interval" ++msgstr "" ++ ++msgid "LLC" ++msgstr "" ++ ++msgid "Label" ++msgstr "" ++ ++msgid "Language" ++msgstr "" ++ ++msgid "Language and Style" ++msgstr "" ++ ++msgid "Leaf" ++msgstr "" ++ ++msgid "Lease validity time" ++msgstr "" ++ ++msgid "Leasefile" ++msgstr "" ++ ++msgid "Leasetime" ++msgstr "" ++ ++msgid "Leasetime remaining" ++msgstr "" ++ ++msgid "Leave empty to autodetect" ++msgstr "" ++ ++msgid "Leave empty to use the current WAN address" ++msgstr "" ++ ++msgid "Legend:" ++msgstr "" ++ ++msgid "Limit" ++msgstr "" ++ ++msgid "Line Attenuation" ++msgstr "" ++ ++msgid "Line Speed" ++msgstr "" ++ ++msgid "Line State" ++msgstr "" ++ ++msgid "Link On" ++msgstr "" ++ ++msgid "" ++"List of DNS servers to forward " ++"requests to" ++msgstr "" ++ ++msgid "List of domains to allow RFC1918 responses for" ++msgstr "" ++ ++msgid "List of hosts that supply bogus NX domain results" ++msgstr "" ++ ++msgid "Listen only on the given interface or, if unspecified, on all" ++msgstr "" ++ ++msgid "Listening port for inbound DNS queries" ++msgstr "" ++ ++msgid "Load" ++msgstr "" ++ ++msgid "Load Average" ++msgstr "" ++ ++msgid "Loading" ++msgstr "" ++ ++msgid "Local IPv4 address" ++msgstr "" ++ ++msgid "Local IPv6 address" ++msgstr "" ++ ++msgid "Local Startup" ++msgstr "" ++ ++msgid "Local Time" ++msgstr "" ++ ++msgid "Local domain" ++msgstr "" ++ ++msgid "" ++"Local domain specification. Names matching this domain are never forwarded " ++"and are resolved from DHCP or hosts files only" ++msgstr "" ++ ++msgid "Local domain suffix appended to DHCP names and hosts file entries" ++msgstr "" ++ ++msgid "Local server" ++msgstr "" ++ ++msgid "" ++"Localise hostname depending on the requesting subnet if multiple IPs are " ++"available" ++msgstr "" ++ ++msgid "Localise queries" ++msgstr "" ++ ++msgid "Locked to channel %d used by: %s" ++msgstr "" ++ ++msgid "Log output level" ++msgstr "" ++ ++msgid "Log queries" ++msgstr "" ++ ++msgid "Logging" ++msgstr "" ++ ++msgid "Login" ++msgstr "" ++ ++msgid "Logout" ++msgstr "" ++ ++msgid "Lowest leased address as offset from the network address." ++msgstr "" ++ ++msgid "MAC-Address" ++msgstr "" ++ ++msgid "MAC-Address Filter" ++msgstr "" ++ ++msgid "MAC-Filter" ++msgstr "" ++ ++msgid "MAC-List" ++msgstr "" ++ ++msgid "MB/s" ++msgstr "" ++ ++msgid "MHz" ++msgstr "" ++ ++msgid "MTU" ++msgstr "" ++ ++msgid "" ++"Make sure to clone the root filesystem using something like the commands " ++"below:" ++msgstr "" ++ ++msgid "Maximum Rate" ++msgstr "" ++ ++msgid "Maximum allowed number of active DHCP leases" ++msgstr "" ++ ++msgid "Maximum allowed number of concurrent DNS queries" ++msgstr "" ++ ++msgid "Maximum allowed size of EDNS.0 UDP packets" ++msgstr "" ++ ++msgid "Maximum amount of seconds to wait for the modem to become ready" ++msgstr "" ++ ++msgid "Maximum hold time" ++msgstr "" ++ ++msgid "Maximum number of leased addresses." ++msgstr "" ++ ++msgid "Mbit/s" ++msgstr "" ++ ++msgid "Memory" ++msgstr "" ++ ++msgid "Memory usage (%)" ++msgstr "" ++ ++msgid "Metric" ++msgstr "" ++ ++msgid "Minimum Rate" ++msgstr "" ++ ++msgid "Minimum hold time" ++msgstr "" ++ ++msgid "Mirror monitor port" ++msgstr "" ++ ++msgid "Mirror source port" ++msgstr "" ++ ++msgid "Missing protocol extension for proto %q" ++msgstr "" ++ ++msgid "Mode" ++msgstr "" ++ ++msgid "Model" ++msgstr "" ++ ++msgid "Modem device" ++msgstr "" ++ ++msgid "Modem init timeout" ++msgstr "" ++ ++msgid "Monitor" ++msgstr "" ++ ++msgid "Mount Entry" ++msgstr "" ++ ++msgid "Mount Point" ++msgstr "" ++ ++msgid "Mount Points" ++msgstr "" ++ ++msgid "Mount Points - Mount Entry" ++msgstr "" ++ ++msgid "Mount Points - Swap Entry" ++msgstr "" ++ ++msgid "" ++"Mount Points define at which point a memory device will be attached to the " ++"filesystem" ++msgstr "" ++ ++msgid "Mount options" ++msgstr "" ++ ++msgid "Mount point" ++msgstr "" ++ ++msgid "Mounted file systems" ++msgstr "" ++ ++msgid "Move down" ++msgstr "" ++ ++msgid "Move up" ++msgstr "" ++ ++msgid "Multicast Rate" ++msgstr "" ++ ++msgid "Multicast address" ++msgstr "" ++ ++msgid "NAS ID" ++msgstr "" ++ ++msgid "NDP-Proxy" ++msgstr "" ++ ++msgid "NTP server candidates" ++msgstr "" ++ ++msgid "NTP sync time-out" ++msgstr "" ++ ++msgid "Name" ++msgstr "" ++ ++msgid "Name of the new interface" ++msgstr "" ++ ++msgid "Name of the new network" ++msgstr "" ++ ++msgid "Navigation" ++msgstr "" ++ ++msgid "Netmask" ++msgstr "" ++ ++msgid "Network" ++msgstr "" ++ ++msgid "Network Utilities" ++msgstr "" ++ ++msgid "Network boot image" ++msgstr "" ++ ++msgid "Network without interfaces." ++msgstr "" ++ ++msgid "Next »" ++msgstr "" ++ ++msgid "No DHCP Server configured for this interface" ++msgstr "" ++ ++msgid "No chains in this table" ++msgstr "" ++ ++msgid "No files found" ++msgstr "" ++ ++msgid "No information available" ++msgstr "" ++ ++msgid "No negative cache" ++msgstr "" ++ ++msgid "No network configured on this device" ++msgstr "" ++ ++msgid "No network name specified" ++msgstr "" ++ ++msgid "No package lists available" ++msgstr "" ++ ++msgid "No password set!" ++msgstr "" ++ ++msgid "No rules in this chain" ++msgstr "" ++ ++msgid "No zone assigned" ++msgstr "" ++ ++msgid "Noise" ++msgstr "" ++ ++msgid "Noise Margin" ++msgstr "" ++ ++msgid "Noise:" ++msgstr "" ++ ++msgid "None" ++msgstr "" ++ ++msgid "Normal" ++msgstr "" ++ ++msgid "Not Found" ++msgstr "" ++ ++msgid "Not associated" ++msgstr "" ++ ++msgid "Not connected" ++msgstr "" ++ ++msgid "Note: Configuration files will be erased." ++msgstr "" ++ ++msgid "Notice" ++msgstr "" ++ ++msgid "Nslookup" ++msgstr "" ++ ++msgid "OK" ++msgstr "" ++ ++msgid "OPKG-Configuration" ++msgstr "" ++ ++msgid "Off-State Delay" ++msgstr "" ++ ++msgid "" ++"On this page you can configure the network interfaces. You can bridge " ++"several interfaces by ticking the \"bridge interfaces\" field and enter the " ++"names of several network interfaces separated by spaces. You can also use " ++"VLAN notation " ++"INTERFACE.VLANNR (e.g.: " ++"eth0.1)." ++msgstr "" ++ ++msgid "On-State Delay" ++msgstr "" ++ ++msgid "One of hostname or mac address must be specified!" ++msgstr "" ++ ++msgid "One or more fields contain invalid values!" ++msgstr "" ++ ++msgid "One or more required fields have no value!" ++msgstr "" ++ ++msgid "Open list..." ++msgstr "" ++ ++msgid "OpenConnect (CISCO AnyConnect)" ++msgstr "" ++ ++msgid "Operating frequency" ++msgstr "" ++ ++msgid "Option changed" ++msgstr "" ++ ++msgid "Option removed" ++msgstr "" ++ ++msgid "Optional, specify to override default server (tic.sixxs.net)" ++msgstr "" ++ ++msgid "Optional, use when the SIXXS account has more than one tunnel" ++msgstr "" ++ ++msgid "Options" ++msgstr "" ++ ++msgid "Other:" ++msgstr "" ++ ++msgid "Out" ++msgstr "" ++ ++msgid "Outbound:" ++msgstr "" ++ ++msgid "Outdoor Channels" ++msgstr "" ++ ++msgid "Output Interface" ++msgstr "" ++ ++msgid "Override MAC address" ++msgstr "" ++ ++msgid "Override MTU" ++msgstr "" ++ ++msgid "Override the gateway in DHCP responses" ++msgstr "" ++ ++msgid "" ++"Override the netmask sent to clients. Normally it is calculated from the " ++"subnet that is served." ++msgstr "" ++ ++msgid "Override the table used for internal routes" ++msgstr "" ++ ++msgid "Overview" ++msgstr "" ++ ++msgid "Owner" ++msgstr "" ++ ++msgid "PAP/CHAP password" ++msgstr "" ++ ++msgid "PAP/CHAP username" ++msgstr "" ++ ++msgid "PID" ++msgstr "" ++ ++msgid "PIN" ++msgstr "" ++ ++msgid "PPP" ++msgstr "" ++ ++msgid "PPPoA Encapsulation" ++msgstr "" ++ ++msgid "PPPoATM" ++msgstr "" ++ ++msgid "PPPoE" ++msgstr "" ++ ++msgid "PPtP" ++msgstr "" ++ ++msgid "Package libiwinfo required!" ++msgstr "" ++ ++msgid "Package lists are older than 24 hours" ++msgstr "" ++ ++msgid "Package name" ++msgstr "" ++ ++msgid "Packets" ++msgstr "" ++ ++msgid "Part of zone %q" ++msgstr "" ++ ++msgid "Password" ++msgstr "" ++ ++msgid "Password authentication" ++msgstr "" ++ ++msgid "Password of Private Key" ++msgstr "" ++ ++msgid "Password successfully changed!" ++msgstr "" ++ ++msgid "Path" ++msgstr "" ++ ++msgid "Path to CA-Certificate" ++msgstr "" ++ ++msgid "Path to Client-Certificate" ++msgstr "" ++ ++msgid "Path to Private Key" ++msgstr "" ++ ++msgid "Path to executable which handles the button event" ++msgstr "" ++ ++msgid "Peak:" ++msgstr "" ++ ++msgid "Perform reboot" ++msgstr "" ++ ++msgid "Perform reset" ++msgstr "" ++ ++msgid "Phy Rate:" ++msgstr "" ++ ++msgid "Physical Settings" ++msgstr "" ++ ++msgid "Ping" ++msgstr "" ++ ++msgid "Pkts." ++msgstr "" ++ ++msgid "Please enter your username and password." ++msgstr "" ++ ++msgid "Please wait: Device rebooting..." ++msgstr "" ++ ++msgid "Policy" ++msgstr "" ++ ++msgid "Port" ++msgstr "" ++ ++msgid "Port %d" ++msgstr "" ++ ++msgid "Port %d is untagged in multiple VLANs!" ++msgstr "" ++ ++msgid "Port status:" ++msgstr "" ++ ++msgid "" ++"Presume peer to be dead after given amount of LCP echo failures, use 0 to " ++"ignore failures" ++msgstr "" ++ ++msgid "Prevents client-to-client communication" ++msgstr "" ++ ++msgid "Prism2/2.5/3 802.11b Wireless Controller" ++msgstr "" ++ ++msgid "Proceed" ++msgstr "" ++ ++msgid "Processes" ++msgstr "" ++ ++msgid "Prot." ++msgstr "" ++ ++msgid "Protocol" ++msgstr "" ++ ++msgid "Protocol family" ++msgstr "" ++ ++msgid "Protocol of the new interface" ++msgstr "" ++ ++msgid "Protocol support is not installed" ++msgstr "" ++ ++msgid "Provide NTP server" ++msgstr "" ++ ++msgid "Provide new network" ++msgstr "" ++ ++msgid "Pseudo Ad-Hoc (ahdemo)" ++msgstr "" ++ ++msgid "Public prefix routed to this device for distribution to clients." ++msgstr "" ++ ++msgid "Quality" ++msgstr "" ++ ++msgid "RTS/CTS Threshold" ++msgstr "" ++ ++msgid "RX" ++msgstr "" ++ ++msgid "RX Rate" ++msgstr "" ++ ++msgid "RaLink 802.11%s Wireless Controller" ++msgstr "" ++ ++msgid "Radius-Accounting-Port" ++msgstr "" ++ ++msgid "Radius-Accounting-Secret" ++msgstr "" ++ ++msgid "Radius-Accounting-Server" ++msgstr "" ++ ++msgid "Radius-Authentication-Port" ++msgstr "" ++ ++msgid "Radius-Authentication-Secret" ++msgstr "" ++ ++msgid "Radius-Authentication-Server" ++msgstr "" ++ ++msgid "" ++"Read /etc/ethers to configure the DHCP-Server" ++msgstr "" ++ ++msgid "" ++"Really delete this interface? The deletion cannot be undone!\\nYou might " ++"lose access to this device if you are connected via this interface." ++msgstr "" ++ ++msgid "" ++"Really delete this wireless network? The deletion cannot be undone!\\nYou " ++"might lose access to this device if you are connected via this network." ++msgstr "" ++ ++msgid "Really reset all changes?" ++msgstr "" ++ ++msgid "" ++"Really shut down network?\\nYou might lose access to this device if you are " ++"connected via this interface." ++msgstr "" ++ ++msgid "" ++"Really shutdown interface \"%s\" ?\\nYou might lose access to this device if " ++"you are connected via this interface." ++msgstr "" ++ ++msgid "Really switch protocol?" ++msgstr "" ++ ++msgid "Realtime Connections" ++msgstr "" ++ ++msgid "Realtime Graphs" ++msgstr "" ++ ++msgid "Realtime Load" ++msgstr "" ++ ++msgid "Realtime Traffic" ++msgstr "" ++ ++msgid "Realtime Wireless" ++msgstr "" ++ ++msgid "Rebind protection" ++msgstr "" ++ ++msgid "Reboot" ++msgstr "" ++ ++msgid "Rebooting..." ++msgstr "" ++ ++msgid "Reboots the operating system of your device" ++msgstr "" ++ ++msgid "Receive" ++msgstr "" ++ ++msgid "Receiver Antenna" ++msgstr "" ++ ++msgid "Reconnect this interface" ++msgstr "" ++ ++msgid "Reconnecting interface" ++msgstr "" ++ ++msgid "References" ++msgstr "" ++ ++msgid "Regulatory Domain" ++msgstr "" ++ ++msgid "Relay" ++msgstr "" ++ ++msgid "Relay Bridge" ++msgstr "" ++ ++msgid "Relay between networks" ++msgstr "" ++ ++msgid "Relay bridge" ++msgstr "" ++ ++msgid "Remote IPv4 address" ++msgstr "" ++ ++msgid "Remove" ++msgstr "" ++ ++msgid "Repeat scan" ++msgstr "" ++ ++msgid "Replace entry" ++msgstr "" ++ ++msgid "Replace wireless configuration" ++msgstr "" ++ ++msgid "Request IPv6-address" ++msgstr "" ++ ++msgid "Request IPv6-prefix of length" ++msgstr "" ++ ++msgid "Require TLS" ++msgstr "" ++ ++msgid "Required for certain ISPs, e.g. Charter with DOCSIS 3" ++msgstr "" ++ ++msgid "Reset" ++msgstr "" ++ ++msgid "Reset Counters" ++msgstr "" ++ ++msgid "Reset to defaults" ++msgstr "" ++ ++msgid "Resolv and Hosts Files" ++msgstr "" ++ ++msgid "Resolve file" ++msgstr "" ++ ++msgid "Restart" ++msgstr "" ++ ++msgid "Restart Firewall" ++msgstr "" ++ ++msgid "Restore backup" ++msgstr "" ++ ++msgid "Reveal/hide password" ++msgstr "" ++ ++msgid "Revert" ++msgstr "" ++ ++msgid "Root" ++msgstr "" ++ ++msgid "Root directory for files served via TFTP" ++msgstr "" ++ ++msgid "Root preparation" ++msgstr "" ++ ++msgid "Routed IPv6 prefix for downstream interfaces" ++msgstr "" ++ ++msgid "Router Advertisement-Service" ++msgstr "" ++ ++msgid "Router Password" ++msgstr "" ++ ++msgid "Routes" ++msgstr "" ++ ++msgid "" ++"Routes specify over which interface and gateway a certain host or network " ++"can be reached." ++msgstr "" ++ ++msgid "Rule #" ++msgstr "" ++ ++msgid "Run a filesystem check before mounting the device" ++msgstr "" ++ ++msgid "Run filesystem check" ++msgstr "" ++ ++msgid "" ++"SIXXS supports TIC only, for static tunnels using IP protocol 41 (RFC4213) " ++"use 6in4 instead" ++msgstr "" ++ ++msgid "SIXXS-handle[/Tunnel-ID]" ++msgstr "" ++ ++msgid "SSH Access" ++msgstr "" ++ ++msgid "SSH-Keys" ++msgstr "" ++ ++msgid "SSID" ++msgstr "" ++ ++msgid "Save" ++msgstr "" ++ ++msgid "Save & Apply" ++msgstr "" ++ ++msgid "Save & Apply" ++msgstr "" ++ ++msgid "Scan" ++msgstr "" ++ ++msgid "Scheduled Tasks" ++msgstr "" ++ ++msgid "Section added" ++msgstr "" ++ ++msgid "Section removed" ++msgstr "" ++ ++msgid "See \"mount\" manpage for details" ++msgstr "" ++ ++msgid "" ++"Send LCP echo requests at the given interval in seconds, only effective in " ++"conjunction with failure threshold" ++msgstr "" ++ ++msgid "Separate Clients" ++msgstr "" ++ ++msgid "Separate WDS" ++msgstr "" ++ ++msgid "Server Settings" ++msgstr "" ++ ++msgid "Server password" ++msgstr "" ++ ++msgid "" ++"Server password, enter the specific password of the tunnel when the username " ++"contains the tunnel ID" ++msgstr "" ++ ++msgid "Server username" ++msgstr "" ++ ++msgid "Service Name" ++msgstr "" ++ ++msgid "Service Type" ++msgstr "" ++ ++msgid "Services" ++msgstr "" ++ ++msgid "Set up Time Synchronization" ++msgstr "" ++ ++msgid "Setup DHCP Server" ++msgstr "" ++ ++msgid "Show current backup file list" ++msgstr "" ++ ++msgid "Shutdown this interface" ++msgstr "" ++ ++msgid "Shutdown this network" ++msgstr "" ++ ++msgid "Signal" ++msgstr "" ++ ++msgid "Signal:" ++msgstr "" ++ ++msgid "Size" ++msgstr "" ++ ++msgid "Skip" ++msgstr "" ++ ++msgid "Skip to content" ++msgstr "" ++ ++msgid "Skip to navigation" ++msgstr "" ++ ++msgid "Slot time" ++msgstr "" ++ ++msgid "Software" ++msgstr "" ++ ++msgid "Some fields are invalid, cannot save values!" ++msgstr "" ++ ++msgid "Sorry, the object you requested was not found." ++msgstr "" ++ ++msgid "Sorry, the server encountered an unexpected error." ++msgstr "" ++ ++msgid "" ++"Sorry, there is no sysupgrade support present; a new firmware image must be " ++"flashed manually. Please refer to the OpenWrt wiki for device specific " ++"install instructions." ++msgstr "" ++ ++msgid "Sort" ++msgstr "" ++ ++msgid "Source" ++msgstr "" ++ ++msgid "Source routing" ++msgstr "" ++ ++msgid "Specifies the button state to handle" ++msgstr "" ++ ++msgid "Specifies the directory the device is attached to" ++msgstr "" ++ ++msgid "Specifies the listening port of this Dropbear instance" ++msgstr "" ++ ++msgid "" ++"Specifies the maximum amount of failed ARP requests until hosts are presumed " ++"to be dead" ++msgstr "" ++ ++msgid "" ++"Specifies the maximum amount of seconds after which hosts are presumed to be " ++"dead" ++msgstr "" ++ ++msgid "Specify the secret encryption key here." ++msgstr "" ++ ++msgid "Start" ++msgstr "" ++ ++msgid "Start priority" ++msgstr "" ++ ++msgid "Startup" ++msgstr "" ++ ++msgid "Static IPv4 Routes" ++msgstr "" ++ ++msgid "Static IPv6 Routes" ++msgstr "" ++ ++msgid "Static Leases" ++msgstr "" ++ ++msgid "Static Routes" ++msgstr "" ++ ++msgid "Static WDS" ++msgstr "" ++ ++msgid "Static address" ++msgstr "" ++ ++msgid "" ++"Static leases are used to assign fixed IP addresses and symbolic hostnames " ++"to DHCP clients. They are also required for non-dynamic interface " ++"configurations where only hosts with a corresponding lease are served." ++msgstr "" ++ ++msgid "Status" ++msgstr "" ++ ++msgid "Stop" ++msgstr "" ++ ++msgid "Strict order" ++msgstr "" ++ ++msgid "Submit" ++msgstr "" ++ ++msgid "Swap" ++msgstr "" ++ ++msgid "Swap Entry" ++msgstr "" ++ ++msgid "Switch" ++msgstr "" ++ ++msgid "Switch %q" ++msgstr "" ++ ++msgid "Switch %q (%s)" ++msgstr "" ++ ++msgid "Switch protocol" ++msgstr "" ++ ++msgid "Sync with browser" ++msgstr "" ++ ++msgid "Synchronizing..." ++msgstr "" ++ ++msgid "System" ++msgstr "" ++ ++msgid "System Log" ++msgstr "" ++ ++msgid "System Properties" ++msgstr "" ++ ++msgid "System log buffer size" ++msgstr "" ++ ++msgid "TCP:" ++msgstr "" ++ ++msgid "TFTP Settings" ++msgstr "" ++ ++msgid "TFTP server root" ++msgstr "" ++ ++msgid "TX" ++msgstr "" ++ ++msgid "TX Rate" ++msgstr "" ++ ++msgid "Table" ++msgstr "" ++ ++msgid "Target" ++msgstr "" ++ ++msgid "Terminate" ++msgstr "" ++ ++msgid "" ++"The Device Configuration section covers physical settings of the " ++"radio hardware such as channel, transmit power or antenna selection which " ++"are shared among all defined wireless networks (if the radio hardware is " ++"multi-SSID capable). Per network settings like encryption or operation mode " ++"are grouped in the Interface Configuration." ++msgstr "" ++ ++msgid "" ++"The libiwinfo-lua package is not installed. You must install this " ++"component for working wireless configuration!" ++msgstr "" ++ ++msgid "" ++"The HE.net endpoint update configuration changed, you must now use the plain " ++"username instead of the user ID!" ++msgstr "" ++ ++msgid "" ++"The IPv6 prefix assigned to the provider, usually ends with ::" ++msgstr "" ++ ++msgid "" ++"The allowed characters are: A-Z, a-z, 0-9 and _" ++msgstr "" ++ ++msgid "The configuration file could not be loaded due to the following error:" ++msgstr "" ++ ++msgid "" ++"The device file of the memory or partition (e.g." ++" /dev/sda1)" ++msgstr "" ++ ++msgid "" ++"The filesystem that was used to format the memory (e.g. ext3)" ++msgstr "" ++ ++msgid "" ++"The flash image was uploaded. Below is the checksum and file size listed, " ++"compare them with the original file to ensure data integrity.
    Click " ++"\"Proceed\" below to start the flash procedure." ++msgstr "" ++ ++msgid "The following changes have been committed" ++msgstr "" ++ ++msgid "The following changes have been reverted" ++msgstr "" ++ ++msgid "The following rules are currently active on this system." ++msgstr "" ++ ++msgid "The given network name is not unique" ++msgstr "" ++ ++msgid "" ++"The hardware is not multi-SSID capable and the existing configuration will " ++"be replaced if you proceed." ++msgstr "" ++ ++msgid "" ++"The length of the IPv4 prefix in bits, the remainder is used in the IPv6 " ++"addresses." ++msgstr "" ++ ++msgid "The length of the IPv6 prefix in bits" ++msgstr "" ++ ++msgid "" ++"The network ports on this device can be combined to several VLANs in which computers can " ++"communicate directly with each other. VLANs are often used to separate different network " ++"segments. Often there is by default one Uplink port for a connection to the " ++"next greater network like the internet and other ports for a local network." ++msgstr "" ++ ++msgid "The selected protocol needs a device assigned" ++msgstr "" ++ ++msgid "" ++"The system is erasing the configuration partition now and will reboot itself " ++"when finished." ++msgstr "" ++ ++msgid "" ++"The system is flashing now.
    DO NOT POWER OFF THE DEVICE!
    Wait a " ++"few minutes before you try to reconnect. It might be necessary to renew the " ++"address of your computer to reach the device again, depending on your " ++"settings." ++msgstr "" ++ ++msgid "" ++"The tunnel end-point is behind NAT, defaults to disabled and only applies to " ++"AYIYA" ++msgstr "" ++ ++msgid "" ++"The uploaded image file does not contain a supported format. Make sure that " ++"you choose the generic image format for your platform." ++msgstr "" ++ ++msgid "There are no active leases." ++msgstr "" ++ ++msgid "There are no pending changes to apply!" ++msgstr "" ++ ++msgid "There are no pending changes to revert!" ++msgstr "" ++ ++msgid "There are no pending changes!" ++msgstr "" ++ ++msgid "" ++"There is no device assigned yet, please attach a network device in the " ++"\"Physical Settings\" tab" ++msgstr "" ++ ++msgid "" ++"There is no password set on this router. Please configure a root password to " ++"protect the web interface and enable SSH." ++msgstr "" ++ ++msgid "This IPv4 address of the relay" ++msgstr "" ++ ++msgid "" ++"This is a list of shell glob patterns for matching files and directories to " ++"include during sysupgrade. Modified files in /etc/config/ and certain other " ++"configurations are automatically preserved." ++msgstr "" ++ ++msgid "" ++"This is either the \"Update Key\" configured for the tunnel or the account " ++"password if no update key has been configured" ++msgstr "" ++ ++msgid "" ++"This is the content of /etc/rc.local. Insert your own commands here (in " ++"front of 'exit 0') to execute them at the end of the boot process." ++msgstr "" ++ ++msgid "" ++"This is the local endpoint address assigned by the tunnel broker, it usually " ++"ends with :2" ++msgstr "" ++ ++msgid "" ++"This is the only DHCP in the local network" ++msgstr "" ++ ++msgid "This is the plain username for logging into the account" ++msgstr "" ++ ++msgid "" ++"This is the prefix routed to you by the tunnel broker for use by clients" ++msgstr "" ++ ++msgid "This is the system crontab in which scheduled tasks can be defined." ++msgstr "" ++ ++msgid "" ++"This is usually the address of the nearest PoP operated by the tunnel broker" ++msgstr "" ++ ++msgid "" ++"This list gives an overview over currently running system processes and " ++"their status." ++msgstr "" ++ ++msgid "This page allows the configuration of custom button actions" ++msgstr "" ++ ++msgid "This page gives an overview over currently active network connections." ++msgstr "" ++ ++msgid "This section contains no values yet" ++msgstr "" ++ ++msgid "Time Synchronization" ++msgstr "" ++ ++msgid "Time Synchronization is not configured yet." ++msgstr "" ++ ++msgid "Timezone" ++msgstr "" ++ ++msgid "" ++"To restore configuration files, you can upload a previously generated backup " ++"archive here." ++msgstr "" ++ ++msgid "Total Available" ++msgstr "" ++ ++msgid "Traceroute" ++msgstr "" ++ ++msgid "Traffic" ++msgstr "" ++ ++msgid "Transfer" ++msgstr "" ++ ++msgid "Transmission Rate" ++msgstr "" ++ ++msgid "Transmit" ++msgstr "" ++ ++msgid "Transmit Power" ++msgstr "" ++ ++msgid "Transmitter Antenna" ++msgstr "" ++ ++msgid "Trigger" ++msgstr "" ++ ++msgid "Trigger Mode" ++msgstr "" ++ ++msgid "Tunnel ID" ++msgstr "" ++ ++msgid "Tunnel Interface" ++msgstr "" ++ ++msgid "Tunnel Link" ++msgstr "" ++ ++msgid "Tunnel broker protocol" ++msgstr "" ++ ++msgid "Tunnel setup server" ++msgstr "" ++ ++msgid "Tunnel type" ++msgstr "" ++ ++msgid "Turbo Mode" ++msgstr "" ++ ++msgid "Tx-Power" ++msgstr "" ++ ++msgid "Type" ++msgstr "" ++ ++msgid "UDP:" ++msgstr "" ++ ++msgid "UMTS only" ++msgstr "" ++ ++msgid "UMTS/GPRS/EV-DO" ++msgstr "" ++ ++msgid "USB Device" ++msgstr "" ++ ++msgid "UUID" ++msgstr "" ++ ++msgid "Unable to dispatch" ++msgstr "" ++ ++msgid "Unknown" ++msgstr "" ++ ++msgid "Unknown Error, password not changed!" ++msgstr "" ++ ++msgid "Unmanaged" ++msgstr "" ++ ++msgid "Unsaved Changes" ++msgstr "" ++ ++msgid "Unsupported protocol type." ++msgstr "" ++ ++msgid "Update lists" ++msgstr "" ++ ++msgid "" ++"Upload a sysupgrade-compatible image here to replace the running firmware. " ++"Check \"Keep settings\" to retain the current configuration (requires an " ++"OpenWrt compatible firmware image)." ++msgstr "" ++ ++msgid "Upload archive..." ++msgstr "" ++ ++msgid "Uploaded File" ++msgstr "" ++ ++msgid "Uptime" ++msgstr "" ++ ++msgid "Use /etc/ethers" ++msgstr "" ++ ++msgid "Use DHCP gateway" ++msgstr "" ++ ++msgid "Use DNS servers advertised by peer" ++msgstr "" ++ ++msgid "Use ISO/IEC 3166 alpha2 country codes." ++msgstr "" ++ ++msgid "Use MTU on tunnel interface" ++msgstr "" ++ ++msgid "Use TTL on tunnel interface" ++msgstr "" ++ ++msgid "Use as external overlay (/overlay)" ++msgstr "" ++ ++msgid "Use as root filesystem (/)" ++msgstr "" ++ ++msgid "Use broadcast flag" ++msgstr "" ++ ++msgid "Use builtin IPv6-management" ++msgstr "" ++ ++msgid "Use custom DNS servers" ++msgstr "" ++ ++msgid "Use default gateway" ++msgstr "" ++ ++msgid "Use gateway metric" ++msgstr "" ++ ++msgid "Use routing table" ++msgstr "" ++ ++msgid "" ++"Use the Add Button to add a new lease entry. The MAC-Address indentifies the host, the IPv4-Address specifies to the fixed " ++"address to use and the Hostname is assigned as symbolic name to the " ++"requesting host." ++msgstr "" ++ ++msgid "Used" ++msgstr "" ++ ++msgid "Used Key Slot" ++msgstr "" ++ ++msgid "User certificate (PEM encoded)" ++msgstr "" ++ ++msgid "User key (PEM encoded)" ++msgstr "" ++ ++msgid "Username" ++msgstr "" ++ ++msgid "VC-Mux" ++msgstr "" ++ ++msgid "VLAN Interface" ++msgstr "" ++ ++msgid "VLANs on %q" ++msgstr "" ++ ++msgid "VLANs on %q (%s)" ++msgstr "" ++ ++msgid "VPN Server" ++msgstr "" ++ ++msgid "VPN Server port" ++msgstr "" ++ ++msgid "VPN Server's certificate SHA1 hash" ++msgstr "" ++ ++msgid "Vendor Class to send when requesting DHCP" ++msgstr "" ++ ++msgid "Verbose" ++msgstr "" ++ ++msgid "Verbose logging by aiccu daemon" ++msgstr "" ++ ++msgid "Verify" ++msgstr "" ++ ++msgid "Version" ++msgstr "" ++ ++msgid "WDS" ++msgstr "" ++ ++msgid "WEP Open System" ++msgstr "" ++ ++msgid "WEP Shared Key" ++msgstr "" ++ ++msgid "WEP passphrase" ++msgstr "" ++ ++msgid "WMM Mode" ++msgstr "" ++ ++msgid "WPA passphrase" ++msgstr "" ++ ++msgid "" ++"WPA-Encryption requires wpa_supplicant (for client mode) or hostapd (for AP " ++"and ad-hoc mode) to be installed." ++msgstr "" ++ ++msgid "" ++"Wait for NTP sync that many seconds, seting to 0 disables waiting (optional)" ++msgstr "" ++ ++msgid "Waiting for changes to be applied..." ++msgstr "" ++ ++msgid "Waiting for command to complete..." ++msgstr "" ++ ++msgid "Warning" ++msgstr "" ++ ++msgid "Warning: There are unsaved changes that will be lost while rebooting!" ++msgstr "" ++ ++msgid "Whether to create an IPv6 default route over the tunnel" ++msgstr "" ++ ++msgid "Whether to route only packets from delegated prefixes" ++msgstr "" ++ ++msgid "Width" ++msgstr "" ++ ++msgid "Wifi" ++msgstr "" ++ ++msgid "Wireless" ++msgstr "" ++ ++msgid "Wireless Adapter" ++msgstr "" ++ ++msgid "Wireless Network" ++msgstr "" ++ ++msgid "Wireless Overview" ++msgstr "" ++ ++msgid "Wireless Security" ++msgstr "" ++ ++msgid "Wireless is disabled or not associated" ++msgstr "" ++ ++msgid "Wireless is restarting..." ++msgstr "" ++ ++msgid "Wireless network is disabled" ++msgstr "" ++ ++msgid "Wireless network is enabled" ++msgstr "" ++ ++msgid "Wireless restarted" ++msgstr "" ++ ++msgid "Wireless shut down" ++msgstr "" ++ ++msgid "Write received DNS requests to syslog" ++msgstr "" ++ ++msgid "XR Support" ++msgstr "" ++ ++msgid "" ++"You can enable or disable installed init scripts here. Changes will applied " ++"after a device reboot.
    Warning: If you disable essential init " ++"scripts like \"network\", your device might become inaccessible!" ++msgstr "" ++ ++msgid "" ++"You must enable Java Script in your browser or LuCI will not work properly." ++msgstr "" ++"LuCI'nin düzgün çalışması için tarayıcınızda Java Scripti " ++"etkinleÅŸtirmelisiniz." ++ ++msgid "" ++"Your Internet Explorer is too old to display this page correctly. Please " ++"upgrade it to at least version 7 or use another browser like Firefox, Opera " ++"or Safari." ++msgstr "" ++ ++msgid "any" ++msgstr "herhangi" ++ ++msgid "auto" ++msgstr "otomatik" ++ ++msgid "automatic" ++msgstr "" ++ ++msgid "baseT" ++msgstr "" ++ ++msgid "bridged" ++msgstr "köprülü" ++ ++msgid "create:" ++msgstr "" ++ ++msgid "creates a bridge over specified interface(s)" ++msgstr "" ++ ++msgid "dB" ++msgstr "" ++ ++msgid "dBm" ++msgstr "" ++ ++msgid "disable" ++msgstr "etkin deÄŸil" ++ ++msgid "disabled" ++msgstr "" ++ ++msgid "expired" ++msgstr "sona ermiÅŸ" ++ ++msgid "" ++"file where given DHCP-leases will be stored" ++msgstr "" ++ ++msgid "forward" ++msgstr "ileri" ++ ++msgid "full-duplex" ++msgstr "" ++ ++msgid "half-duplex" ++msgstr "" ++ ++msgid "help" ++msgstr "yardım" ++ ++msgid "hidden" ++msgstr "" ++ ++msgid "hybrid mode" ++msgstr "" ++ ++msgid "if target is a network" ++msgstr "eÄŸer hedef aÄŸsa" ++ ++msgid "input" ++msgstr "giriÅŸ" ++ ++msgid "kB" ++msgstr "" ++ ++msgid "kB/s" ++msgstr "" ++ ++msgid "kbit/s" ++msgstr "" ++ ++msgid "local DNS file" ++msgstr "yerel DNS dosyası" ++ ++msgid "minimum 1280, maximum 1480" ++msgstr "" ++ ++msgid "navigation Navigation" ++msgstr "" ++ ++msgid "no" ++msgstr "hayır" ++ ++msgid "no link" ++msgstr "" ++ ++msgid "none" ++msgstr "hiçbiri" ++ ++msgid "not present" ++msgstr "" ++ ++msgid "off" ++msgstr "kapalı" ++ ++msgid "on" ++msgstr "açık" ++ ++msgid "open" ++msgstr "" ++ ++msgid "overlay" ++msgstr "" ++ ++msgid "relay mode" ++msgstr "" ++ ++msgid "routed" ++msgstr "yönlendirildi" ++ ++msgid "server mode" ++msgstr "" ++ ++msgid "skiplink1 Skip to navigation" ++msgstr "" ++ ++msgid "skiplink2 Skip to content" ++msgstr "" ++ ++msgid "stateful-only" ++msgstr "" ++ ++msgid "stateless" ++msgstr "" ++ ++msgid "stateless + stateful" ++msgstr "" ++ ++msgid "tagged" ++msgstr "etiketlendi" ++ ++msgid "unknown" ++msgstr "" ++ ++msgid "unlimited" ++msgstr "sınırsız" ++ ++msgid "unspecified" ++msgstr "tanımsız" ++ ++msgid "unspecified -or- create:" ++msgstr "tanımsız -veya- oluÅŸturun:" ++ ++msgid "untagged" ++msgstr "etiketsiz" ++ ++msgid "yes" ++msgstr "evet" ++ ++msgid "« Back" ++msgstr "« Geri" ++ ++#~ msgid "40MHz 2nd channel above" ++#~ msgstr "40MHz 2. kanal üzerinde" ++ ++#~ msgid "40MHz 2nd channel below" ++#~ msgstr "40MHz 2. kanal altında" ++ ++#~ msgid "Encr." ++#~ msgstr "Åžifreli" ++ ++#~ msgid "WLAN-Scan" ++#~ msgstr "WLAN-Tara" ++ ++#~ msgid "" ++#~ "CIDR-Notation: " ++#~ "address/prefix" ++#~ msgstr "" ++#~ "CIDR-Not: adres/önek" ++ ++#~ msgid "IPv4-Broadcast" ++#~ msgstr "IPv4-Broadcast" ++ ++#~ msgid "IPv6-Address" ++#~ msgstr "IPv6-Address" +diff --git a/feeds/luci/modules/luci-base/po/uk/base.po b/feeds/luci/modules/luci-base/po/uk/base.po +new file mode 100644 +index 0000000..c548322 +--- /dev/null ++++ b/feeds/luci/modules/luci-base/po/uk/base.po +@@ -0,0 +1,3507 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"PO-Revision-Date: 2013-12-05 19:07+0200\n" ++"Last-Translator: Dmitri <4glitch@gmail.com>\n" ++"Language-Team: none\n" ++"Language: uk\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%" ++"10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "(%d minute window, %d second interval)" ++msgstr "(%d-хвилинне вікно, %d-Ñекундний інтервал)" ++ ++msgid "(%s available)" ++msgstr "(%s доÑтупно)" ++ ++msgid "(empty)" ++msgstr "(пуÑто)" ++ ++msgid "(no interfaces attached)" ++msgstr "(нема приєднаних інтерфейÑів)" ++ ++msgid "-- Additional Field --" ++msgstr "-- Додаткові Ð¿Ð¾Ð»Ñ --" ++ ++msgid "-- Please choose --" ++msgstr "-- Виберіть --" ++ ++msgid "-- custom --" ++msgstr "-- нетипово --" ++ ++msgid "-- match by device --" ++msgstr "" ++ ++msgid "-- match by label --" ++msgstr "" ++ ++msgid "1 Minute Load:" ++msgstr "ÐÐ°Ð²Ð°Ð½Ñ‚Ð°Ð¶ÐµÐ½Ð½Ñ Ð·Ð° 1 хвилину:" ++ ++msgid "15 Minute Load:" ++msgstr "ÐÐ°Ð²Ð°Ð½Ñ‚Ð°Ð¶ÐµÐ½Ð½Ñ Ð·Ð° 15 хвилин:" ++ ++msgid "5 Minute Load:" ++msgstr "ÐÐ°Ð²Ð°Ð½Ñ‚Ð°Ð¶ÐµÐ½Ð½Ñ Ð·Ð° 5 хвилин:" ++ ++msgid "BSSID" ++msgstr "" ++"BSSID" ++ ++msgid "DNS query port" ++msgstr "" ++"Порт DNS-" ++"запиту" ++ ++msgid "DNS server port" ++msgstr "" ++"Порт DNS-" ++"Ñервера" ++ ++msgid "" ++"DNS servers will be queried in the " ++"order of the resolvfile" ++msgstr "" ++"DNS-" ++"Ñервери будуть опитані у порÑдку, визначеному файлом resolvfile" ++ ++msgid "ESSID" ++msgstr "" ++"ESSID" ++ ++msgid "IPv4-Address" ++msgstr "IPv4-адреÑа" ++ ++msgid "IPv4-Gateway" ++msgstr "IPv4-шлюз" ++ ++msgid "IPv4-Netmask" ++msgstr "IPv4-маÑка" ++ ++msgid "" ++"IPv6-Address or Network " ++"(CIDR)" ++msgstr "" ++"IPv6-адреÑа або мережа " ++"(CIDR)" ++ ++msgid "IPv6-Gateway" ++msgstr "IPv6-шлюз" ++ ++msgid "IPv6-Suffix (hex)" ++msgstr "" ++ ++msgid "LED Configuration" ++msgstr "" ++"ÐаÑÑ‚Ñ€Ð¾ÑŽÐ²Ð°Ð½Ð½Ñ LED" ++ ++msgid "LED Name" ++msgstr "Ðазва LED" ++ ++msgid "MAC-Address" ++msgstr "" ++"MAC-адреÑа" ++ ++msgid "" ++"Max. DHCP leases" ++msgstr "" ++"Max. оренд DHCP" ++ ++msgid "" ++"Max. EDNS0 packet size" ++msgstr "" ++"Max. розмір пакета EDNS0" ++ ++msgid "Max. concurrent queries" ++msgstr "Max. одночаÑних запитів" ++ ++msgid "%s - %s" ++msgstr "%s - %s" ++ ++msgid "ADSL" ++msgstr "" ++ ++msgid "ADSL Status" ++msgstr "" ++ ++msgid "AICCU (SIXXS)" ++msgstr "" ++ ++msgid "APN" ++msgstr "" ++"APN" ++ ++msgid "AR Support" ++msgstr "Підтримка AR" ++ ++msgid "ARP retry threshold" ++msgstr "Поріг повтору ARP" ++ ++msgid "ATM Bridges" ++msgstr "ATM-моÑти" ++ ++msgid "ATM Virtual Channel Identifier (VCI)" ++msgstr "" ++"Ідентифікатор віртуального каналу ATM (VCI)" ++ ++msgid "ATM Virtual Path Identifier (VPI)" ++msgstr "" ++"Ідентифікатор віртуального шлÑху ATM (VPI)" ++ ++msgid "" ++"ATM bridges expose encapsulated ethernet in AAL5 connections as virtual " ++"Linux network interfaces which can be used in conjunction with DHCP or PPP " ++"to dial into the provider network." ++msgstr "" ++"ATM-моÑти виÑтавлÑÑŽÑ‚ÑŒ інкапÑульований Ethernet у з'єднаннÑÑ… AAL5 Ñк " ++"віртуальні мережеві інтерфейÑи Linux, котрі можуть викориÑтовуватиÑÑ Ð² " ++"поєднанні з DHCP або PPP Ð´Ð»Ñ Ð¿Ñ–Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð½Ñ Ð´Ð¾ мережі провайдера." ++ ++msgid "ATM device number" ++msgstr "Ðомер ATM-приÑтрою" ++ ++msgid "AYIYA" ++msgstr "" ++ ++msgid "Access Concentrator" ++msgstr "Концентратор доÑтупу" ++ ++msgid "Access Point" ++msgstr "Точка доÑтупу" ++ ++msgid "Action" ++msgstr "ДіÑ" ++ ++msgid "Actions" ++msgstr "Дії" ++ ++msgid "Activate this network" ++msgstr "Ðктивувати цю мережу" ++ ++msgid "Active IPv4-Routes" ++msgstr "IPv4-маршрути" ++ ++msgid "Active IPv6-Routes" ++msgstr "IPv6-маршрути" ++ ++msgid "Active Connections" ++msgstr "Ðктивні підключеннÑ" ++ ++msgid "Active DHCP Leases" ++msgstr "Ðктивні оренди DHCP" ++ ++msgid "Active DHCPv6 Leases" ++msgstr "Ðктивні оренди DHCPv6" ++ ++msgid "Ad-Hoc" ++msgstr "Ad-Hoc" ++ ++msgid "Add" ++msgstr "Додати" ++ ++msgid "Add local domain suffix to names served from hosts files" ++msgstr "Додавати ÑÑƒÑ„Ñ–ÐºÑ Ð»Ð¾ÐºÐ°Ð»ÑŒÐ½Ð¾Ð³Ð¾ домену до імен, отриманих із файлів hosts" ++ ++msgid "Add new interface..." ++msgstr "Додати новий інтерфейÑ..." ++ ++msgid "Additional Hosts files" ++msgstr "Додаткові файли hosts" ++ ++msgid "Address" ++msgstr "ÐдреÑа" ++ ++msgid "Address to access local relay bridge" ++msgstr "ÐдреÑа Ð´Ð»Ñ Ð´Ð¾Ñтупу до моÑту локального ретранÑлÑтора" ++ ++msgid "Administration" ++msgstr "ÐдмініÑтруваннÑ" ++ ++msgid "Advanced Settings" ++msgstr "Додаткові параметри" ++ ++msgid "Alert" ++msgstr "Тривога" ++ ++msgid "Allow SSH password authentication" ++msgstr "" ++"Дозволити SSH-" ++"перевірку паролÑ" ++ ++msgid "Allow all except listed" ++msgstr "Дозволити вÑÑ–, крім зазначених" ++ ++msgid "Allow listed only" ++msgstr "Дозволити тільки зазначені" ++ ++msgid "Allow localhost" ++msgstr "Дозволити локальний вузол" ++ ++msgid "Allow remote hosts to connect to local SSH forwarded ports" ++msgstr "" ++"Дозволити віддаленим вузлам Ð¿Ñ–Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð½Ñ Ð´Ð¾ локальних SSH-ÑпрÑмованих портів" ++ ++msgid "Allow root logins with password" ++msgstr "Дозволити root-вхід із паролем" ++ ++msgid "Allow the root user to login with password" ++msgstr "Дозволити кориÑтувачеві root вхід у ÑиÑтему з паролем" ++ ++msgid "" ++"Allow upstream responses in the 127.0.0.0/8 range, e.g. for RBL services" ++msgstr "" ++"Дозволити відповіді від клієнта на Ñервер у діапазоні 127.0.0.0/8, " ++"наприклад, Ð´Ð»Ñ RBL-поÑлуг" ++ ++msgid "" ++"Also see Tunneling Comparison on SIXXS" ++msgstr "" ++ ++msgid "Always announce default router" ++msgstr "" ++ ++msgid "An additional network will be created if you leave this unchecked." ++msgstr "Якщо ви залишите це невибраним, буде Ñтворена додаткова мережа." ++ ++msgid "Announce as default router even if no public prefix is available." ++msgstr "" ++ ++msgid "Announced DNS domains" ++msgstr "" ++ ++msgid "Announced DNS servers" ++msgstr "" ++ ++msgid "Antenna 1" ++msgstr "Ðнтена 1" ++ ++msgid "Antenna 2" ++msgstr "Ðнтена 2" ++ ++msgid "Antenna Configuration" ++msgstr "ÐšÐ¾Ð½Ñ„Ð¸Ð³ÑƒÑ€Ð°Ñ†Ñ–Ñ Ð°Ð½Ñ‚ÐµÐ½Ð¸" ++ ++msgid "Any zone" ++msgstr "Будь-Ñка зона" ++ ++msgid "Apply" ++msgstr "ЗаÑтоÑувати" ++ ++msgid "Applying changes" ++msgstr "ЗаÑтоÑÑƒÐ²Ð°Ð½Ð½Ñ Ð·Ð¼Ñ–Ð½" ++ ++msgid "" ++"Assign a part of given length of every public IPv6-prefix to this interface" ++msgstr "" ++ ++msgid "Assign interfaces..." ++msgstr "ÐŸÑ€Ð¸Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ñ–Ð½Ñ‚ÐµÑ€Ñ„ÐµÐ¹Ñів..." ++ ++msgid "" ++"Assign prefix parts using this hexadecimal subprefix ID for this interface." ++msgstr "" ++ ++msgid "Associated Stations" ++msgstr "Приєднані Ñтанції" ++ ++msgid "Atheros 802.11%s Wireless Controller" ++msgstr "Бездротовий 802.11%s контролер Atheros" ++ ++msgid "AuthGroup" ++msgstr "" ++ ++msgid "Authentication" ++msgstr "ÐвтентифікаціÑ" ++ ++msgid "Authoritative" ++msgstr "Ðадійний" ++ ++msgid "Authorization Required" ++msgstr "Потрібна авторизаціÑ" ++ ++msgid "Auto Refresh" ++msgstr "Ðвтоматичне оновленнÑ" ++ ++msgid "Automatic" ++msgstr "" ++ ++msgid "Automatic Homenet (HNCP)" ++msgstr "" ++ ++msgid "Available" ++msgstr "ДоÑтупно" ++ ++msgid "Available packages" ++msgstr "ДоÑтупні пакети" ++ ++msgid "Average:" ++msgstr "Середнє значеннÑ:" ++ ++msgid "BSSID" ++msgstr "BSSID" ++ ++msgid "Back" ++msgstr "Ðазад" ++ ++msgid "Back to Overview" ++msgstr "ПовернутиÑÑ Ð´Ð¾ переліку" ++ ++msgid "Back to configuration" ++msgstr "ПовернутиÑÑ Ð´Ð¾ конфігурації" ++ ++msgid "Back to overview" ++msgstr "ПовернутиÑÑ Ð´Ð¾ переліку" ++ ++msgid "Back to scan results" ++msgstr "ПовернутиÑÑ Ð´Ð¾ результатів ÑкануваннÑ" ++ ++msgid "Background Scan" ++msgstr "Ð¡ÐºÐ°Ð½ÑƒÐ²Ð°Ð½Ð½Ñ Ñƒ фоновому режимі" ++ ++msgid "Backup / Flash Firmware" ++msgstr "Резервне ÐºÐ¾Ð¿Ñ–ÑŽÐ²Ð°Ð½Ð½Ñ / ÐžÐ½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ð¿Ñ€Ð¾ÑˆÐ¸Ð²ÐºÐ¸" ++ ++msgid "Backup / Restore" ++msgstr "Резервне копіюваннÑ/відновленнÑ" ++ ++msgid "Backup file list" ++msgstr "СпиÑок файлів резервних копій" ++ ++msgid "Bad address specified!" ++msgstr "Вказана неправильна адреÑа!" ++ ++msgid "Band" ++msgstr "" ++ ++msgid "Behind NAT" ++msgstr "" ++ ++msgid "" ++"Below is the determined list of files to backup. It consists of changed " ++"configuration files marked by opkg, essential base files and the user " ++"defined backup patterns." ++msgstr "" ++"Ðижче наведено визначений ÑпиÑок файлів Ð´Ð»Ñ Ñ€ÐµÐ·ÐµÑ€Ð²Ð½Ð¾Ð³Ð¾ копіюваннÑ. Він " ++"ÑкладаєтьÑÑ Ñ–Ð· позначених opkg змінених файлів конфігурації, невідокремних " ++"базових файлів, та файлів за кориÑтувацькими шаблонами резервного копіюваннÑ." ++ ++msgid "Bitrate" ++msgstr "ШвидкіÑÑ‚ÑŒ передачі даних" ++ ++msgid "Bogus NX Domain Override" ++msgstr "Відкидати підробки NX-домену" ++ ++msgid "Bridge" ++msgstr "МіÑÑ‚" ++ ++msgid "Bridge interfaces" ++msgstr "Об'єднати інтерфейÑи в міÑÑ‚" ++ ++msgid "Bridge unit number" ++msgstr "Ðомер моÑта" ++ ++msgid "Bring up on boot" ++msgstr "Піднімати при завантаженні" ++ ++msgid "Broadcom 802.11%s Wireless Controller" ++msgstr "Бездротовий 802.11%s контролер Broadcom" ++ ++msgid "Broadcom BCM%04x 802.11 Wireless Controller" ++msgstr "Бездротовий 802.11 контролер Broadcom BCM%04x" ++ ++msgid "Buffered" ++msgstr "Буферизовано" ++ ++msgid "Buttons" ++msgstr "Кнопки" ++ ++msgid "CA certificate; if empty it will be saved after the first connection." ++msgstr "" ++ ++msgid "CPU" ++msgstr "ЦП" ++ ++msgid "CPU usage (%)" ++msgstr "Ð—Ð°Ð²Ð°Ð½Ñ‚Ð°Ð¶ÐµÐ½Ð½Ñ Ð¦ÐŸ, %" ++ ++msgid "Cancel" ++msgstr "СкаÑувати" ++ ++msgid "Category" ++msgstr "" ++ ++msgid "Chain" ++msgstr "Ланцюжок" ++ ++msgid "Changes" ++msgstr "Зміни" ++ ++msgid "Changes applied." ++msgstr "Зміни заÑтоÑовано." ++ ++msgid "Changes the administrator password for accessing the device" ++msgstr "Зміна Ð¿Ð°Ñ€Ð¾Ð»Ñ Ð°Ð´Ð¼Ñ–Ð½Ñ–Ñтратора Ð´Ð»Ñ Ð´Ð¾Ñтупу до приÑтрою" ++ ++msgid "Channel" ++msgstr "Канал" ++ ++msgid "Check" ++msgstr "Перевірити" ++ ++msgid "Checksum" ++msgstr "Контрольна Ñума" ++ ++msgid "" ++"Choose the firewall zone you want to assign to this interface. Select " ++"unspecified to remove the interface from the associated zone or " ++"fill out the create field to define a new zone and attach the " ++"interface to it." ++msgstr "" ++"Оберіть зону брандмауера, Ñку ви хочете призначити на цей інтерфейÑ. " ++"Виберіть не визначено, щоб видалити Ñ–Ð½Ñ‚ÐµÑ€Ñ„ÐµÐ¹Ñ Ð· відповідних зон, " ++"або заповніть поле Ñтворити, щоб визначити нову зону Ñ– прикріпити " ++"до неї інтерфейÑ." ++ ++msgid "" ++"Choose the network(s) you want to attach to this wireless interface or fill " ++"out the create field to define a new network." ++msgstr "" ++"Оберіть мережі, Ñкі ви хочете прикріпити до цього бездротового інтерфейÑу " ++"або заповніть поле Ñтворити, щоб визначити нову мережу." ++ ++msgid "Cipher" ++msgstr "Шифр" ++ ++msgid "" ++"Click \"Generate archive\" to download a tar archive of the current " ++"configuration files. To reset the firmware to its initial state, click " ++"\"Perform reset\" (only possible with squashfs images)." ++msgstr "" ++"ÐатиÑніть кнопку \"Створити архів\", щоб завантажити tar-архів поточних " ++"файлів конфігурації. Ð”Ð»Ñ Ð²Ñ–Ð´Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ð¿Ñ€Ð¾ÑˆÐ¸Ð²ÐºÐ¸ до Ñ—Ñ— початкового Ñтану, " ++"натиÑніть кнопку \"Відновити\" (можливе тільки з образами SquashFS)." ++ ++msgid "Client" ++msgstr "Клієнт" ++ ++msgid "Client ID to send when requesting DHCP" ++msgstr "Ідентифікатор клієнта Ð´Ð»Ñ Ð²Ñ–Ð´Ð¿Ñ€Ð°Ð²ÐºÐ¸ при запиті DHCP" ++ ++msgid "" ++"Close inactive connection after the given amount of seconds, use 0 to " ++"persist connection" ++msgstr "" ++"Закривати неактивні з'Ñ”Ð´Ð½Ð°Ð½Ð½Ñ Ð¿Ñ–ÑÐ»Ñ Ð¿ÐµÐ²Ð½Ð¾Ð³Ð¾ інтервалу чаÑу (Ñекунди). Ð”Ð»Ñ " ++"ÑƒÑ‚Ñ€Ð¸Ð¼Ð°Ð½Ð½Ñ Ð½ÐµÐ°ÐºÑ‚Ð¸Ð²Ð½Ð¸Ñ… з'єднань викориÑтовуйте 0" ++ ++msgid "Close list..." ++msgstr "Згорнути ÑпиÑок..." ++ ++msgid "Collecting data..." ++msgstr "Ð—Ð±Ð¸Ñ€Ð°Ð½Ð½Ñ Ð´Ð°Ð½Ð¸Ñ…..." ++ ++msgid "Command" ++msgstr "Команда" ++ ++msgid "Common Configuration" ++msgstr "Загальна конфігураціÑ" ++ ++msgid "Compression" ++msgstr "СтиÑненнÑ" ++ ++msgid "Configuration" ++msgstr "КонфігураціÑ" ++ ++msgid "Configuration applied." ++msgstr "ÐšÐ¾Ð½Ñ„Ñ–Ð³ÑƒÑ€Ð°Ñ†Ñ–Ñ Ð·Ð°ÑтоÑована." ++ ++msgid "Configuration files will be kept." ++msgstr "Конфігураційні файли будуть збережені." ++ ++msgid "Confirmation" ++msgstr "ПідтвердженнÑ" ++ ++msgid "Connect" ++msgstr "Підключити" ++ ++msgid "Connected" ++msgstr "Підключений" ++ ++msgid "Connection Limit" ++msgstr "Гранична кількіÑÑ‚ÑŒ підключень" ++ ++msgid "Connection to server fails when TLS cannot be used" ++msgstr "" ++ ++msgid "Connections" ++msgstr "ПідключеннÑ" ++ ++msgid "Country" ++msgstr "Країна" ++ ++msgid "Country Code" ++msgstr "Код країни" ++ ++msgid "Cover the following interface" ++msgstr "Покривати наÑтупний інтерфейÑ" ++ ++msgid "Cover the following interfaces" ++msgstr "Покривати наÑтупні інтерфейÑи" ++ ++msgid "Create / Assign firewall-zone" ++msgstr "Створити / Визначити зону брандмауера" ++ ++msgid "Create Interface" ++msgstr "Створити інтерфейÑ" ++ ++msgid "Create a bridge over multiple interfaces" ++msgstr "Створити міÑÑ‚ через кілька інтерфейÑів" ++ ++msgid "Critical" ++msgstr "Критичний" ++ ++msgid "Cron Log Level" ++msgstr "Рівень Ð²Ð¸Ð²ÐµÐ´ÐµÐ½Ð½Ñ Ñ–Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ñ–Ñ— Cron" ++ ++msgid "Custom Interface" ++msgstr "Ð†Ð½Ñ‚ÐµÑ€Ñ„ÐµÐ¹Ñ ÐºÐ¾Ñ€Ð¸Ñтувача" ++ ++msgid "Custom delegated IPv6-prefix" ++msgstr "" ++ ++msgid "" ++"Customizes the behaviour of the device LEDs if possible." ++msgstr "" ++"ÐаÑÑ‚Ñ€Ð¾ÑŽÐ²Ð°Ð½Ð½Ñ Ð¿Ð¾Ð²ÐµÐ´Ñ–Ð½ÐºÐ¸ LED, Ñкщо це можливо." ++ ++msgid "DHCP Leases" ++msgstr "Оренди DHCP" ++ ++msgid "DHCP Server" ++msgstr "Сервер DHCP" ++ ++msgid "DHCP and DNS" ++msgstr "DHCP та DNS" ++ ++msgid "DHCP client" ++msgstr "Клієнт DHCP" ++ ++msgid "DHCP-Options" ++msgstr "Параметри DHCP" ++ ++msgid "DHCPv6 Leases" ++msgstr "Оренди DHCPv6" ++ ++msgid "DHCPv6 client" ++msgstr "" ++ ++msgid "DHCPv6-Mode" ++msgstr "" ++ ++msgid "DHCPv6-Service" ++msgstr "" ++ ++msgid "DNS" ++msgstr "DNS" ++ ++msgid "DNS forwardings" ++msgstr "СпрÑÐ¼Ð¾Ð²ÑƒÐ²Ð°Ð½Ð½Ñ DNS-запитів" ++ ++msgid "DNS-Label / FQDN" ++msgstr "" ++ ++msgid "DS-Lite AFTR address" ++msgstr "" ++ ++msgid "DUID" ++msgstr "DUID" ++ ++msgid "Debug" ++msgstr "ЗневаджуваннÑ" ++ ++msgid "Default %d" ++msgstr "Типово %d" ++ ++msgid "Default gateway" ++msgstr "Типовий шлюз" ++ ++msgid "Default route" ++msgstr "" ++ ++msgid "Default state" ++msgstr "Типовий Ñтан" ++ ++msgid "Define a name for this network." ++msgstr "Ð’Ð¸Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ñ–Ð¼ÐµÐ½Ñ– Ð´Ð»Ñ Ñ†Ñ–Ñ”Ñ— мережі." ++ ++msgid "" ++"Define additional DHCP options, for example " ++"\"6,192.168.2.1,192.168.2.2\" which advertises different DNS " ++"servers to clients." ++msgstr "" ++"Ð’Ð¸Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð´Ð¾Ð´Ð°Ñ‚ÐºÐ¾Ð²Ð¸Ñ… опцій DHCP, наприклад " ++"\"6,192.168.2.1,192.168.2.2\", щоб оголошувати різні DNS-" ++"Ñервери Ð´Ð»Ñ ÐºÐ»Ñ–Ñ”Ð½Ñ‚Ñ–Ð²." ++ ++msgid "Delete" ++msgstr "Видалити" ++ ++msgid "Delete this interface" ++msgstr "Видалити цей інтерфейÑ" ++ ++msgid "Delete this network" ++msgstr "Видалити цю мережу" ++ ++msgid "Description" ++msgstr "ОпиÑ" ++ ++msgid "Design" ++msgstr "Стиль (тема)" ++ ++msgid "Destination" ++msgstr "ПризначеннÑ" ++ ++msgid "Device" ++msgstr "ПриÑтрій" ++ ++msgid "Device Configuration" ++msgstr "ÐšÐ¾Ð½Ñ„Ñ–Ð³ÑƒÑ€Ð°Ñ†Ñ–Ñ Ð¿Ñ€Ð¸Ñтрою" ++ ++msgid "Diagnostics" ++msgstr "ДіагноÑтика" ++ ++msgid "Dial number" ++msgstr "" ++ ++msgid "Directory" ++msgstr "Каталог" ++ ++msgid "Disable" ++msgstr "Вимкнути" ++ ++msgid "" ++"Disable DHCP for " ++"this interface." ++msgstr "" ++"Вимкнути DHCP Ð´Ð»Ñ Ñ†ÑŒÐ¾Ð³Ð¾ інтерфейÑу." ++ ++msgid "Disable DNS setup" ++msgstr "Вимкнути наÑÑ‚Ñ€Ð¾ÑŽÐ²Ð°Ð½Ð½Ñ DNS" ++ ++msgid "Disable HW-Beacon timer" ++msgstr "Вимкнути таймер HW-Beacon" ++ ++msgid "Disabled" ++msgstr "Вимкнено" ++ ++msgid "Discard upstream RFC1918 responses" ++msgstr "Відкидати RFC1918-відповіді від клієнта на Ñервер" ++ ++msgid "Displaying only packages containing" ++msgstr "Показані тільки непорожні пакети" ++ ++msgid "Distance Optimization" ++msgstr "ÐžÐ¿Ñ‚Ð¸Ð¼Ñ–Ð·Ð°Ñ†Ñ–Ñ Ð·Ð° відÑтанню" ++ ++msgid "Distance to farthest network member in meters." ++msgstr "ВідÑтань до найвіддаленішого вузла мережі в метрах." ++ ++msgid "Diversity" ++msgstr "РізновидніÑÑ‚ÑŒ" ++ ++msgid "" ++"Dnsmasq is a combined DHCP-Server and DNS-" ++"Forwarder for NAT " ++"firewalls" ++msgstr "" ++"Dnsmasq ÑвлÑÑ” Ñобою комбінований DHCP-Ñервер Ñ– " ++"DNS-" ++"транÑпортер Ð´Ð»Ñ Ð±Ñ€Ð°Ð½Ð´Ð¼Ð°ÑƒÐµÑ€Ñ–Ð² NAT" ++ ++msgid "Do not cache negative replies, e.g. for not existing domains" ++msgstr "Ðе кешувати негативні відповіді, наприклад, за неіÑнуючих доменів" ++ ++msgid "Do not forward requests that cannot be answered by public name servers" ++msgstr "" ++"Ðе ÑпрÑмовувати запити, Ñкі не можуть бути оброблені публічними Ñерверами " ++"імен" ++ ++msgid "Do not forward reverse lookups for local networks" ++msgstr "Ðе ÑпрÑмовувати зворотний переглÑд Ð´Ð»Ñ Ð»Ð¾ÐºÐ°Ð»ÑŒÐ½Ð¸Ñ… мереж" ++ ++msgid "Do not send probe responses" ++msgstr "Ðе надÑилати відповіді на зондуваннÑ" ++ ++msgid "Domain required" ++msgstr "Потрібен домен" ++ ++msgid "Domain whitelist" ++msgstr "\"Білий ÑпиÑок\" доменів" ++ ++msgid "" ++"Don't forward DNS-Requests without " ++"DNS-Name" ++msgstr "" ++"Ðе переÑилати DNS-запити без DNS-імені" ++ ++msgid "Download and install package" ++msgstr "Завантажити та інÑталювати пакети" ++ ++msgid "Download backup" ++msgstr "Завантажити резервну копію" ++ ++msgid "Dropbear Instance" ++msgstr "Ð ÐµÐ°Ð»Ñ–Ð·Ð°Ñ†Ñ–Ñ Dropbear" ++ ++msgid "" ++"Dropbear offers SSH network shell access " ++"and an integrated SCP server" ++msgstr "" ++"Dropbear — це SSH-" ++"Ñервер із вбудованим SCP" ++ ++msgid "Dual-Stack Lite (RFC6333)" ++msgstr "" ++ ++msgid "Dynamic DHCP" ++msgstr "" ++"Динамічний DHCP" ++ ++msgid "Dynamic tunnel" ++msgstr "Динамічний тунель" ++ ++msgid "" ++"Dynamically allocate DHCP addresses for clients. If disabled, only clients " ++"having static leases will be served." ++msgstr "" ++"Динамічне Ð²Ð¸Ð´Ñ–Ð»ÐµÐ½Ð½Ñ DHCP-Ð°Ð´Ñ€ÐµÑ Ð´Ð»Ñ ÐºÐ»Ñ–Ñ”Ð½Ñ‚Ñ–Ð². Якщо вимкнути, будуть " ++"обÑлуговуватиÑÑ Ñ‚Ñ–Ð»ÑŒÐºÐ¸ клієнти, Ñкі мають Ñтатичні оренди." ++ ++msgid "EAP-Method" ++msgstr "EAP-Метод" ++ ++msgid "Edit" ++msgstr "Редагувати" ++ ++msgid "" ++"Edit the raw configuration data above to fix any error and hit \"Save\" to " ++"reload the page." ++msgstr "" ++ ++msgid "Edit this interface" ++msgstr "Редагувати цей інтерфейÑ" ++ ++msgid "Edit this network" ++msgstr "Редагувати цю мережу" ++ ++msgid "Emergency" ++msgstr "Ðварійний" ++ ++msgid "Enable" ++msgstr "Увімкнути" ++ ++msgid "Enable STP" ++msgstr "Увімкнути STP" ++ ++msgid "Enable HE.net dynamic endpoint update" ++msgstr "Увімкнути динамічне Ð¾Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ ÐºÑ–Ð½Ñ†ÐµÐ²Ð¾Ñ— точки HE.net" ++ ++msgid "Enable IPv6 negotiation on the PPP link" ++msgstr "Увімкнути ÑƒÐ·Ð³Ð¾Ð´Ð¶ÐµÐ½Ð½Ñ IPv6 Ð´Ð»Ñ PPP-з'єднань" ++ ++msgid "Enable Jumbo Frame passthrough" ++msgstr "ПропуÑкати Jumbo-фрейми" ++ ++msgid "Enable NTP client" ++msgstr "Увімкнути NTP-клієнт" ++ ++msgid "Enable TFTP server" ++msgstr "Увімкнути TFTP-Ñервер" ++ ++msgid "Enable VLAN functionality" ++msgstr "Увімкнути підтримку VLAN" ++ ++msgid "Enable WPS pushbutton, requires WPA(2)-PSK" ++msgstr "" ++ ++msgid "Enable learning and aging" ++msgstr "Увімкнути learning та aging" ++ ++msgid "Enable mirroring of incoming packets" ++msgstr "" ++ ++msgid "Enable mirroring of outgoing packets" ++msgstr "" ++ ++msgid "Enable this mount" ++msgstr "Увімкнути це монтуваннÑ" ++ ++msgid "Enable this swap" ++msgstr "Увімкнути це довантаженнÑ" ++ ++msgid "Enable/Disable" ++msgstr "Увімкнено/Вимкнено" ++ ++msgid "Enabled" ++msgstr "Увімкнено" ++ ++msgid "Enables the Spanning Tree Protocol on this bridge" ++msgstr "" ++"Увімкнути STP на цьому моÑту" ++ ++msgid "Encapsulation mode" ++msgstr "Режим інкапÑулÑції" ++ ++msgid "Encryption" ++msgstr "ШифруваннÑ" ++ ++msgid "Erasing..." ++msgstr "ВидаленнÑ..." ++ ++msgid "Error" ++msgstr "Помилка" ++ ++msgid "Ethernet Adapter" ++msgstr "Ðдаптер Ethernet" ++ ++msgid "Ethernet Switch" ++msgstr "Ethernet-комутатор" ++ ++msgid "Expand hosts" ++msgstr "Ð Ð¾Ð·ÑˆÐ¸Ñ€ÐµÐ½Ð½Ñ Ð²ÑƒÐ·Ð»Ñ–Ð²" ++ ++msgid "Expires" ++msgstr "ДійÑний ще" ++ ++#, fuzzy ++msgid "" ++"Expiry time of leased addresses, minimum is 2 minutes (2m)." ++msgstr "Термін оренди адреÑ, мінімум 2 хвилини (2m)." ++ ++msgid "External" ++msgstr "" ++ ++msgid "External system log server" ++msgstr "Зовнішній Ñервер ÑиÑтемного журналу" ++ ++msgid "External system log server port" ++msgstr "Порт зовнішнього Ñервера ÑиÑтемного журналу" ++ ++msgid "Fast Frames" ++msgstr "Швидкі фрейми" ++ ++msgid "File" ++msgstr "Файл" ++ ++msgid "Filename of the boot image advertised to clients" ++msgstr "І'Ð¼Ñ Ð·Ð°Ð²Ð°Ð½Ñ‚Ð°Ð¶ÑƒÐ²Ð°Ð»ÑŒÐ½Ð¾Ð³Ð¾ образу, що оголошуєтьÑÑ ÐºÐ»Ñ–Ñ”Ð½Ñ‚Ð°Ð¼" ++ ++msgid "Filesystem" ++msgstr "Файлова ÑиÑтема" ++ ++msgid "Filter" ++msgstr "Фільтр" ++ ++msgid "Filter private" ++msgstr "Фільтрувати приватні" ++ ++msgid "Filter useless" ++msgstr "Фільтрувати непридатні" ++ ++msgid "Find and join network" ++msgstr "Знайти мережу й приєднатиÑÑ" ++ ++msgid "Find package" ++msgstr "Знайти пакет" ++ ++msgid "Finish" ++msgstr "Готово" ++ ++msgid "Firewall" ++msgstr "Брандмауер" ++ ++msgid "Firewall Settings" ++msgstr "ÐаÑтройки брандмауера" ++ ++msgid "Firewall Status" ++msgstr "Ð¡Ñ‚Ð°Ñ‚ÑƒÑ Ð±Ñ€Ð°Ð½Ð´Ð¼Ð°ÑƒÐµÑ€Ð°" ++ ++msgid "Firmware Version" ++msgstr "ВерÑÑ–Ñ Ð¿Ñ€Ð¾ÑˆÐ¸Ð²ÐºÐ¸" ++ ++msgid "Fixed source port for outbound DNS queries" ++msgstr "ФікÑований порт Ð´Ð»Ñ Ð²Ð¸Ñ…Ñ–Ð´Ð½Ð¸Ñ… DNS-запитів" ++ ++msgid "Flags" ++msgstr "Позначки" ++ ++msgid "Flash Firmware" ++msgstr "Заливаємо прошивку" ++ ++msgid "Flash image..." ++msgstr "Відвантажити образ..." ++ ++msgid "Flash new firmware image" ++msgstr "Залити новий образ прошивки" ++ ++msgid "Flash operations" ++msgstr "Операції заливаннÑ" ++ ++msgid "Flashing..." ++msgstr "Заливаємо..." ++ ++msgid "Force" ++msgstr "ПримуÑово" ++ ++msgid "Force CCMP (AES)" ++msgstr "ПримуÑово CCMP (AES)" ++ ++msgid "Force DHCP on this network even if another server is detected." ++msgstr "ПримуÑово DHCP у цій мережі, навіть Ñкщо виÑвлено інший Ñервер." ++ ++msgid "Force TKIP" ++msgstr "ПримуÑово TKIP" ++ ++msgid "Force TKIP and CCMP (AES)" ++msgstr "ПримуÑово TKIP та CCMP (AES)" ++ ++msgid "Forward DHCP traffic" ++msgstr "СпрÑмовувати DHCP-трафік" ++ ++msgid "Forward broadcast traffic" ++msgstr "СпрÑмовувати широкомовний трафік" ++ ++msgid "Forwarding mode" ++msgstr "Режим ÑпрÑмовуваннÑ" ++ ++msgid "Fragmentation Threshold" ++msgstr "Поріг фрагментації" ++ ++msgid "Frame Bursting" ++msgstr "Frame Bursting" ++ ++msgid "Free" ++msgstr "Вільно" ++ ++msgid "Free space" ++msgstr "Вільне міÑце" ++ ++msgid "GHz" ++msgstr "ГГц" ++ ++msgid "GPRS only" ++msgstr "Тільки GPRS" ++ ++msgid "Gateway" ++msgstr "Шлюз" ++ ++msgid "Gateway ports" ++msgstr "Порти шлюзу" ++ ++msgid "General Settings" ++msgstr "Загальні наÑтройки" ++ ++msgid "General Setup" ++msgstr "Загальні наÑтройки" ++ ++msgid "Generate archive" ++msgstr "Cтворити архів" ++ ++msgid "Generic 802.11%s Wireless Controller" ++msgstr "Бездротовий 802.11%s контролер" ++ ++msgid "Given password confirmation did not match, password not changed!" ++msgstr "ОÑкільки пароль Ñ– Ð¿Ñ–Ð´Ñ‚Ð²ÐµÑ€Ð´Ð¶ÐµÐ½Ð½Ñ Ð½Ðµ Ñпівпадають, то пароль не змінено!" ++ ++msgid "Global network options" ++msgstr "" ++ ++msgid "Go to password configuration..." ++msgstr "Перейти до конфігурації паролÑ..." ++ ++msgid "Go to relevant configuration page" ++msgstr "Перейти до відповідної Ñторінки конфігурації" ++ ++msgid "Guest" ++msgstr "" ++ ++msgid "HE.net password" ++msgstr "Пароль HE.net" ++ ++msgid "HE.net username" ++msgstr "" ++ ++msgid "Handler" ++msgstr "Обробник" ++ ++msgid "Hang Up" ++msgstr "Призупинити" ++ ++msgid "Heartbeat" ++msgstr "" ++ ++msgid "" ++"Here you can configure the basic aspects of your device like its hostname or " ++"the timezone." ++msgstr "" ++"Тут ви можете наÑтроїти оÑновні параметри виглÑду вашого приÑтрою, такі Ñк " ++"назва (ім’Ñ) вузла або чаÑовий поÑÑ." ++ ++msgid "" ++"Here you can paste public SSH-Keys (one per line) for SSH public-key " ++"authentication." ++msgstr "" ++"Тут ви можете вÑтавити відкриті SSH-ключі (по одному на Ñ€Ñдок) Ð´Ð»Ñ SSH з " ++"відкритим ключем автентифікації." ++ ++msgid "Hermes 802.11b Wireless Controller" ++msgstr "Бездротовий 802.11b контролер Hermes" ++ ++msgid "Hide ESSID" ++msgstr "" ++"Приховати ESSID" ++ ++msgid "Host entries" ++msgstr "ЗапиÑи вузлів" ++ ++msgid "Host expiry timeout" ++msgstr "Тайм-аут вузла" ++ ++msgid "Host-IP or Network" ++msgstr "IP вузла або мережа" ++ ++msgid "Hostname" ++msgstr "Ðазва (ім'Ñ) вузла" ++ ++msgid "Hostname to send when requesting DHCP" ++msgstr "Ім'Ñ Ð²ÑƒÐ·Ð»Ð° Ð´Ð»Ñ Ð½Ð°Ð´ÑÐ¸Ð»Ð°Ð½Ð½Ñ Ð¿Ñ€Ð¸ запиті DHCP" ++ ++msgid "Hostnames" ++msgstr "Імена вузлів" ++ ++msgid "Hybrid" ++msgstr "" ++ ++msgid "IP address" ++msgstr "IP-адреÑа" ++ ++msgid "IPv4" ++msgstr "IPv4" ++ ++msgid "IPv4 Firewall" ++msgstr "Брандмауер IPv4" ++ ++msgid "IPv4 WAN Status" ++msgstr "Ð¡Ñ‚Ð°Ñ‚ÑƒÑ IPv4 WAN" ++ ++msgid "IPv4 address" ++msgstr "ÐдреÑа IPv4" ++ ++msgid "IPv4 and IPv6" ++msgstr "IPv4 та IPv6" ++ ++msgid "IPv4 assignment length" ++msgstr "" ++ ++msgid "IPv4 broadcast" ++msgstr "Широкомовний IPv4" ++ ++msgid "IPv4 gateway" ++msgstr "Шлюз IPv4" ++ ++msgid "IPv4 netmask" ++msgstr "МаÑка мережі IPv4" ++ ++msgid "IPv4 only" ++msgstr "Тільки IPv4" ++ ++msgid "IPv4 prefix length" ++msgstr "Довжина префікÑа IPv4" ++ ++msgid "IPv4-Address" ++msgstr "IPv4-адреÑа" ++ ++msgid "IPv6" ++msgstr "IPv6" ++ ++msgid "IPv6 Firewall" ++msgstr "Брандмауер IPv6" ++ ++msgid "IPv6 Neighbours" ++msgstr "" ++ ++msgid "IPv6 Settings" ++msgstr "" ++ ++msgid "IPv6 ULA-Prefix" ++msgstr "" ++ ++msgid "IPv6 WAN Status" ++msgstr "Ð¡Ñ‚Ð°Ñ‚ÑƒÑ IPv6 WAN" ++ ++msgid "IPv6 address" ++msgstr "ÐдреÑа IPv6" ++ ++msgid "IPv6 address delegated to the local tunnel endpoint (optional)" ++msgstr "" ++ ++msgid "IPv6 assignment hint" ++msgstr "" ++ ++msgid "IPv6 assignment length" ++msgstr "" ++ ++msgid "IPv6 gateway" ++msgstr "Шлюз IPv6" ++ ++msgid "IPv6 only" ++msgstr "Тільки IPv6" ++ ++msgid "IPv6 prefix" ++msgstr "ÐŸÑ€ÐµÑ„Ñ–ÐºÑ IPv6" ++ ++msgid "IPv6 prefix length" ++msgstr "Довжина префікÑа IPv6" ++ ++msgid "IPv6 routed prefix" ++msgstr "" ++ ++msgid "IPv6-Address" ++msgstr "IPv6-адреÑа" ++ ++msgid "IPv6-in-IPv4 (RFC4213)" ++msgstr "IPv6 у IPv4 (RFC4213)" ++ ++msgid "IPv6-over-IPv4 (6rd)" ++msgstr "IPv6 через IPv4 (6rd)" ++ ++msgid "IPv6-over-IPv4 (6to4)" ++msgstr "IPv6 через IPv4 (6to4)" ++ ++msgid "Identity" ++msgstr "ІдентичніÑÑ‚ÑŒ" ++ ++msgid "" ++"If specified, mount the device by its UUID instead of a fixed device node" ++msgstr "" ++"Якщо обрано, монтувати приÑтрій за його UUID заміÑÑ‚ÑŒ фікÑованого вузла " ++"приÑтрою" ++ ++msgid "" ++"If specified, mount the device by the partition label instead of a fixed " ++"device node" ++msgstr "" ++"Якщо обрано, монтувати приÑтрій за назвою його розділу заміÑÑ‚ÑŒ фікÑованого " ++"вузла приÑтрою" ++ ++msgid "If unchecked, no default route is configured" ++msgstr "Якщо не позначено, типовий маршрут не наÑтроєно" ++ ++msgid "If unchecked, the advertised DNS server addresses are ignored" ++msgstr "Якщо не позначено, оголошувані адреÑи DNS-Ñерверів ігноруютьÑÑ" ++ ++msgid "" ++"If your physical memory is insufficient unused data can be temporarily " ++"swapped to a swap-device resulting in a higher amount of usable RAM. Be aware that swapping data is a very " ++"slow process as the swap-device cannot be accessed with the high datarates " ++"of the RAM." ++msgstr "" ++"Якщо фізичної пам'ÑÑ‚Ñ– недоÑтатньо, невикориÑтовувані дані можуть тимчаÑово " ++"витіÑнÑтиÑÑ Ð½Ð° Ñвоп-приÑтрій, у результаті чого збільшуєтьÑÑ ÐºÑ–Ð»ÑŒÐºÑ–ÑÑ‚ÑŒ " ++"кориÑної оперативної пам'ÑÑ‚Ñ– (RAM). Майте на увазі, що Ñвопінг даних Ñ” дуже повільним процеÑом, оÑкільки " ++"Ñвоп-приÑтрої не можуть бути доÑтупні з такою виÑокою швидкіÑÑ‚ÑŽ, Ñк RAM." ++ ++msgid "Ignore Hosts files" ++msgstr "Ігнорувати файли hosts" ++ ++msgid "Ignore interface" ++msgstr "Ігнорувати интерфейÑ" ++ ++msgid "Ignore resolve file" ++msgstr "Ігнорувати файли resolv" ++ ++msgid "Image" ++msgstr "Образ" ++ ++msgid "In" ++msgstr "Ð’Ñ…." ++ ++msgid "Inactivity timeout" ++msgstr "Тайм-аут бездіÑльноÑÑ‚Ñ–" ++ ++msgid "Inbound:" ++msgstr "Вхідний:" ++ ++msgid "Info" ++msgstr "ІнформаціÑ" ++ ++msgid "Initscript" ++msgstr "Скрипт ініціалізації" ++ ++msgid "Initscripts" ++msgstr "Скрипти ініціалізації" ++ ++msgid "Install" ++msgstr "ІнÑталювати" ++ ++msgid "Install iputils-traceroute6 for IPv6 traceroute" ++msgstr "" ++ ++msgid "Install package %q" ++msgstr "ІнÑталÑÑ†Ñ–Ñ Ð¿Ð°ÐºÐµÑ‚Ð° %q" ++ ++msgid "Install protocol extensions..." ++msgstr "ІнÑталÑÑ†Ñ–Ñ Ñ€Ð¾Ð·ÑˆÐ¸Ñ€ÐµÐ½ÑŒ протоколу..." ++ ++msgid "Installed packages" ++msgstr "ІнÑтальовані пакети" ++ ++msgid "Interface" ++msgstr "ІнтерфейÑ" ++ ++msgid "Interface Configuration" ++msgstr "ÐšÐ¾Ð½Ñ„Ñ–Ð³ÑƒÑ€Ð°Ñ†Ñ–Ñ Ñ–Ð½Ñ‚ÐµÑ€Ñ„ÐµÐ¹Ñу" ++ ++msgid "Interface Overview" ++msgstr "ОглÑд інтерфейÑів" ++ ++msgid "Interface is reconnecting..." ++msgstr "ÐŸÐµÑ€ÐµÐ¿Ñ–Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð½Ñ Ñ–Ð½Ñ‚ÐµÑ€Ñ„ÐµÐ¹Ñу..." ++ ++msgid "Interface is shutting down..." ++msgstr "Ð†Ð½Ñ‚ÐµÑ€Ñ„ÐµÐ¹Ñ Ð·Ð°Ð²ÐµÑ€ÑˆÑƒÑ” роботу..." ++ ++msgid "Interface not present or not connected yet." ++msgstr "Ð†Ð½Ñ‚ÐµÑ€Ñ„ÐµÐ¹Ñ Ð²Ñ–Ð´Ñутній або ще не підключений." ++ ++msgid "Interface reconnected" ++msgstr "Ð†Ð½Ñ‚ÐµÑ€Ñ„ÐµÐ¹Ñ Ð¿ÐµÑ€ÐµÐ¿Ñ–Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð¾" ++ ++msgid "Interface shut down" ++msgstr "Ð†Ð½Ñ‚ÐµÑ€Ñ„ÐµÐ¹Ñ Ð·Ð°Ð²ÐµÑ€ÑˆÐ¸Ð² роботу" ++ ++msgid "Interfaces" ++msgstr "ІнтерфейÑи" ++ ++msgid "Internal" ++msgstr "" ++ ++msgid "Internal Server Error" ++msgstr "Ð’Ð½ÑƒÑ‚Ñ€Ñ–ÑˆÐ½Ñ Ð¿Ð¾Ð¼Ð¸Ð»ÐºÐ° Ñервера" ++ ++msgid "Invalid" ++msgstr "ÐеприпуÑтимо" ++ ++msgid "Invalid VLAN ID given! Only IDs between %d and %d are allowed." ++msgstr "" ++"Задано невірний VLAN ID! ДоÑтупні тільки ідентифікатори в межах між %d Ñ– %d." ++ ++msgid "Invalid VLAN ID given! Only unique IDs are allowed" ++msgstr "Задано невірний VLAN ID! ДоÑтупні тільки унікальні ідентифікатори." ++ ++msgid "Invalid username and/or password! Please try again." ++msgstr "ÐеприпуÑтиме Ñ–Ð¼â€™Ñ ÐºÐ¾Ñ€Ð¸Ñтувача та/або пароль! Спробуйте ще раз." ++ ++#, fuzzy ++msgid "" ++"It appears that you are trying to flash an image that does not fit into the " ++"flash memory, please verify the image file!" ++msgstr "" ++"Схоже, що ви намагаєтеÑÑ Ð·Ð°Ð»Ð¸Ñ‚Ð¸ образ, Ñкий не вміщаєтьÑÑ Ñƒ флеш-пам'ÑÑ‚ÑŒ! " ++"Перевірте файл образу!" ++ ++msgid "Java Script required!" ++msgstr "Потрібен Java Script!" ++ ++msgid "Join Network" ++msgstr "ÐŸÑ–Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð½Ñ Ð´Ð¾ мережі" ++ ++msgid "Join Network: Settings" ++msgstr "ÐŸÑ–Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð½Ñ Ð´Ð¾ мережі: ÐаÑтройки" ++ ++msgid "Join Network: Wireless Scan" ++msgstr "ÐŸÑ–Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð½Ñ Ð´Ð¾ мережі: Ð¡ÐºÐ°Ð½ÑƒÐ²Ð°Ð½Ð½Ñ Ð±ÐµÐ·Ð´Ñ€Ð¾Ñ‚Ð¾Ð²Ð¸Ñ… мереж" ++ ++msgid "Keep settings" ++msgstr "Зберегти наÑтройки" ++ ++msgid "Kernel Log" ++msgstr "Журнал Ñдра" ++ ++msgid "Kernel Version" ++msgstr "ВерÑÑ–Ñ Ñдра" ++ ++msgid "Key" ++msgstr "Ключ" ++ ++msgid "Key #%d" ++msgstr "Ключ #%d" ++ ++msgid "Kill" ++msgstr "Знищити" ++ ++msgid "L2TP" ++msgstr "L2TP" ++ ++msgid "L2TP Server" ++msgstr "Сервер L2TP" ++ ++msgid "LCP echo failure threshold" ++msgstr "Поріг помилок ехо-запитів LCP" ++ ++msgid "LCP echo interval" ++msgstr "Інтервал ехо-запитів LCP" ++ ++msgid "LLC" ++msgstr "LLC" ++ ++msgid "Label" ++msgstr "Мітка" ++ ++msgid "Language" ++msgstr "Мова" ++ ++msgid "Language and Style" ++msgstr "Мова та Ñтиль" ++ ++msgid "Leaf" ++msgstr "" ++ ++msgid "Lease validity time" ++msgstr "Ð§Ð°Ñ Ñ‡Ð¸Ð½Ð½Ð¾ÑÑ‚Ñ– оренди" ++ ++msgid "Leasefile" ++msgstr "Файл оренд" ++ ++msgid "Leasetime" ++msgstr "Ð§Ð°Ñ Ð¾Ñ€ÐµÐ½Ð´Ð¸" ++ ++msgid "Leasetime remaining" ++msgstr "Ð§Ð°Ñ Ð¾Ñ€ÐµÐ½Ð´Ð¸, що лишивÑÑ" ++ ++msgid "Leave empty to autodetect" ++msgstr "Залиште поле порожнім Ð´Ð»Ñ Ð°Ð²Ñ‚Ð¾Ð²Ð¸Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ" ++ ++msgid "Leave empty to use the current WAN address" ++msgstr "Залиште порожнім, щоб викориÑтовувати поточну адреÑу WAN" ++ ++msgid "Legend:" ++msgstr "Легенда:" ++ ++msgid "Limit" ++msgstr "Межа" ++ ++msgid "Line Attenuation" ++msgstr "" ++ ++msgid "Line Speed" ++msgstr "" ++ ++msgid "Line State" ++msgstr "" ++ ++msgid "Link On" ++msgstr "Зв'Ñзок вÑтановлено" ++ ++msgid "" ++"List of DNS servers to forward " ++"requests to" ++msgstr "" ++"СпиÑок DNS-Ñерверів, до Ñких " ++"переÑилати запити" ++ ++msgid "List of domains to allow RFC1918 responses for" ++msgstr "СпиÑок доменів, Ð´Ð»Ñ Ñких дозволені RFC1918-відповіді" ++ ++msgid "List of hosts that supply bogus NX domain results" ++msgstr "СпиÑок доменів, Ñкі підтримують результати підробки NX-доменів" ++ ++msgid "Listen only on the given interface or, if unspecified, on all" ++msgstr "" ++"ПроÑлуховувати тільки на цьому інтерфейÑÑ–, або на вÑÑ–Ñ… (Ñкщо не " ++"визначено)" ++ ++msgid "Listening port for inbound DNS queries" ++msgstr "Порт проÑÐ»ÑƒÑ…Ð¾Ð²ÑƒÐ²Ð°Ð½Ð½Ñ Ð´Ð»Ñ Ð²Ñ…Ñ–Ð´Ð½Ð¸Ñ… DNS-запитів" ++ ++msgid "Load" ++msgstr "ÐавантаженнÑ" ++ ++msgid "Load Average" ++msgstr "Середнє навантаженнÑ" ++ ++msgid "Loading" ++msgstr "ЗавантаженнÑ" ++ ++msgid "Local IPv4 address" ++msgstr "Локальна адреÑа IPv4" ++ ++msgid "Local IPv6 address" ++msgstr "Локальна адреÑа IPv6" ++ ++msgid "Local Startup" ++msgstr "Локальний запуÑк" ++ ++msgid "Local Time" ++msgstr "МіÑцевий чаÑ" ++ ++msgid "Local domain" ++msgstr "Локальний домен" ++ ++#, fuzzy ++msgid "" ++"Local domain specification. Names matching this domain are never forwarded " ++"and are resolved from DHCP or hosts files only" ++msgstr "" ++"Ð¡Ð¿ÐµÑ†Ð¸Ñ„Ñ–ÐºÐ°Ñ†Ñ–Ñ Ð»Ð¾ÐºÐ°Ð»ÑŒÐ½Ð¸Ñ… доменів. Імена, зіÑтавлені цьому домену, ніколи не " ++"ÑпрÑмовуютьÑÑ Ñ– виділÑÑŽÑ‚ÑŒÑÑ Ñ‚Ñ–Ð»ÑŒÐºÐ¸ через DHCP або файли hosts" ++ ++msgid "Local domain suffix appended to DHCP names and hosts file entries" ++msgstr "" ++"Ð¡ÑƒÑ„Ñ–ÐºÑ Ð»Ð¾ÐºÐ°Ð»ÑŒÐ½Ð¾Ð³Ð¾ домену додаєтьÑÑ Ð´Ð¾ DHCP-імен вузлів та запиÑів з файлу " ++"hosts" ++ ++msgid "Local server" ++msgstr "Локальний Ñервер" ++ ++msgid "" ++"Localise hostname depending on the requesting subnet if multiple IPs are " ++"available" ++msgstr "" ++"Локалізувати ім'Ñ Ñ…Ð¾Ñта залежно від запитуючої підмережі, Ñкщо доÑтупні " ++"кілька IP-адреÑ" ++ ++msgid "Localise queries" ++msgstr "Локалізувати запити" ++ ++msgid "Locked to channel %d used by: %s" ++msgstr "" ++ ++msgid "Log output level" ++msgstr "Рівень Ð²Ð¸Ð²ÐµÐ´ÐµÐ½Ð½Ñ Ñ–Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ñ–Ñ– до журналу" ++ ++msgid "Log queries" ++msgstr "Журнал запитів" ++ ++msgid "Logging" ++msgstr "ЖурналюваннÑ" ++ ++msgid "Login" ++msgstr "Увійти" ++ ++msgid "Logout" ++msgstr "Вийти" ++ ++msgid "Lowest leased address as offset from the network address." ++msgstr "Ðайнижча орендована адреÑа" ++ ++msgid "MAC-Address" ++msgstr "MAC-адреÑа" ++ ++msgid "MAC-Address Filter" ++msgstr "Фільтр MAC-адреÑ" ++ ++msgid "MAC-Filter" ++msgstr "MAC-фільтр" ++ ++msgid "MAC-List" ++msgstr "MAC-ÑпиÑок" ++ ++msgid "MB/s" ++msgstr "MБ/Ñ" ++ ++msgid "MHz" ++msgstr "МГц" ++ ++msgid "MTU" ++msgstr "MTU" ++ ++msgid "" ++"Make sure to clone the root filesystem using something like the commands " ++"below:" ++msgstr "" ++ ++msgid "Maximum Rate" ++msgstr "МакÑимальна швидкіÑÑ‚ÑŒ" ++ ++msgid "Maximum allowed number of active DHCP leases" ++msgstr "МакÑимально допуÑтима кількіÑÑ‚ÑŒ активних оренд DHCP" ++ ++msgid "Maximum allowed number of concurrent DNS queries" ++msgstr "МакÑимально допуÑтима кількіÑÑ‚ÑŒ одночаÑних DNS-запитів" ++ ++msgid "Maximum allowed size of EDNS.0 UDP packets" ++msgstr "МакÑимально допуÑтимий розмір UDP-пакетів EDNS.0" ++ ++msgid "Maximum amount of seconds to wait for the modem to become ready" ++msgstr "МакÑимальний Ñ‡Ð°Ñ Ð¾Ñ‡Ñ–ÐºÑƒÐ²Ð°Ð½Ð½Ñ Ð³Ð¾Ñ‚Ð¾Ð²Ð½Ð¾ÑÑ‚Ñ– модему (Ñекунд)" ++ ++msgid "Maximum hold time" ++msgstr "МакÑимальний Ñ‡Ð°Ñ ÑƒÑ‚Ñ€Ð¸Ð¼ÑƒÐ²Ð°Ð½Ð½Ñ" ++ ++msgid "Maximum number of leased addresses." ++msgstr "МакÑимальна кількіÑÑ‚ÑŒ орендованих адреÑ." ++ ++msgid "Mbit/s" ++msgstr "Мбіт/Ñ" ++ ++msgid "Memory" ++msgstr "Пам'ÑÑ‚ÑŒ" ++ ++msgid "Memory usage (%)" ++msgstr "ВикориÑÑ‚Ð°Ð½Ð½Ñ Ð¿Ð°Ð¼'ÑÑ‚Ñ–, %" ++ ++msgid "Metric" ++msgstr "Метрика" ++ ++msgid "Minimum Rate" ++msgstr "Мінімальна швидкіÑÑ‚ÑŒ" ++ ++msgid "Minimum hold time" ++msgstr "Мінімальний Ñ‡Ð°Ñ ÑƒÑ‚Ñ€Ð¸Ð¼ÑƒÐ²Ð°Ð½Ð½Ñ" ++ ++msgid "Mirror monitor port" ++msgstr "" ++ ++msgid "Mirror source port" ++msgstr "" ++ ++msgid "Missing protocol extension for proto %q" ++msgstr "ВідÑутні Ñ€Ð¾Ð·ÑˆÐ¸Ñ€ÐµÐ½Ð½Ñ Ð´Ð»Ñ Ð¿Ñ€Ð¾Ñ‚Ð¾ÐºÐ¾Ð»Ñƒ %q" ++ ++msgid "Mode" ++msgstr "Режим" ++ ++msgid "Model" ++msgstr "" ++ ++msgid "Modem device" ++msgstr "Модем" ++ ++msgid "Modem init timeout" ++msgstr "Тайм-аут ініціалізації модему" ++ ++msgid "Monitor" ++msgstr "Монітор" ++ ++msgid "Mount Entry" ++msgstr "Вхід монтуваннÑ" ++ ++msgid "Mount Point" ++msgstr "Точка монтуваннÑ" ++ ++msgid "Mount Points" ++msgstr "Точки монтуваннÑ" ++ ++msgid "Mount Points - Mount Entry" ++msgstr "Точки Ð¼Ð¾Ð½Ñ‚ÑƒÐ²Ð°Ð½Ð½Ñ - ЗапиÑи монтуваннÑ" ++ ++msgid "Mount Points - Swap Entry" ++msgstr "Точки Ð¼Ð¾Ð½Ñ‚ÑƒÐ²Ð°Ð½Ð½Ñ - Вхід довантаженнÑ" ++ ++msgid "" ++"Mount Points define at which point a memory device will be attached to the " ++"filesystem" ++msgstr "" ++"Точки Ð¼Ð¾Ð½Ñ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ð²Ð¸Ð·Ð½Ð°Ñ‡Ð°ÑŽÑ‚ÑŒ, до Ñкої точки приÑтрою пам'ÑÑ‚Ñ– буде прикріплена " ++"файлова ÑиÑтема" ++ ++msgid "Mount options" ++msgstr "Опції монтуваннÑ" ++ ++msgid "Mount point" ++msgstr "Точка монтуваннÑ" ++ ++msgid "Mounted file systems" ++msgstr "Змонтовані файлові ÑиÑтеми" ++ ++msgid "Move down" ++msgstr "Вниз" ++ ++msgid "Move up" ++msgstr "Вгору" ++ ++msgid "Multicast Rate" ++msgstr "ШвидкіÑÑ‚ÑŒ багатоадреÑного потоку" ++ ++msgid "Multicast address" ++msgstr "ÐдреÑа багатоадреÑного потоку" ++ ++msgid "NAS ID" ++msgstr "Ідентифікатор NAS" ++ ++msgid "NDP-Proxy" ++msgstr "" ++ ++msgid "NTP server candidates" ++msgstr "Кандидати Ð´Ð»Ñ Ñинхронізації NTP-Ñервера" ++ ++msgid "NTP sync time-out" ++msgstr "" ++ ++msgid "Name" ++msgstr "Ім'Ñ" ++ ++msgid "Name of the new interface" ++msgstr "Ім'Ñ Ð½Ð¾Ð²Ð¾Ð³Ð¾ інтерфейÑу" ++ ++msgid "Name of the new network" ++msgstr "Ðазва (ім'Ñ) нової мережі" ++ ++msgid "Navigation" ++msgstr "ÐавігаціÑ" ++ ++msgid "Netmask" ++msgstr "МаÑка мережі" ++ ++msgid "Network" ++msgstr "Мережа" ++ ++msgid "Network Utilities" ++msgstr "Мережеві утиліти" ++ ++msgid "Network boot image" ++msgstr "Образ Ð´Ð»Ñ Ð¼ÐµÑ€ÐµÐ¶ÐµÐ²Ð¾Ð³Ð¾ завантаженнÑ" ++ ++msgid "Network without interfaces." ++msgstr "Мережа без інтерфейÑів." ++ ++msgid "Next »" ++msgstr "ÐаÑтупний »" ++ ++msgid "No DHCP Server configured for this interface" ++msgstr "Ðемає DHCP-Ñервера, наÑтроєного Ð´Ð»Ñ Ñ†ÑŒÐ¾Ð³Ð¾ інтерфейÑу" ++ ++msgid "No chains in this table" ++msgstr "У цій таблиці нема ланцюжків" ++ ++msgid "No files found" ++msgstr "Файли не знайдено" ++ ++msgid "No information available" ++msgstr "Ð†Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ñ–Ñ Ð²Ñ–Ð´ÑутнÑ" ++ ++msgid "No negative cache" ++msgstr "ÐÑ–Ñких негативних кешувань" ++ ++msgid "No network configured on this device" ++msgstr "Ðа цьому приÑтрої нема наÑтроєної мережі" ++ ++msgid "No network name specified" ++msgstr "Ім'Ñ Ð¼ÐµÑ€ÐµÐ¶Ñ– не визначене" ++ ++msgid "No package lists available" ++msgstr "Ðемає доÑтупних ÑпиÑків пакетів" ++ ++msgid "No password set!" ++msgstr "Пароль не вÑтановлено!" ++ ++msgid "No rules in this chain" ++msgstr "У цьму ланцюжку нема правил" ++ ++msgid "No zone assigned" ++msgstr "Зона не призначена" ++ ++msgid "Noise" ++msgstr "Шум" ++ ++msgid "Noise Margin" ++msgstr "" ++ ++msgid "Noise:" ++msgstr "Шум:" ++ ++msgid "None" ++msgstr "Жоден" ++ ++msgid "Normal" ++msgstr "Ðормальний" ++ ++msgid "Not Found" ++msgstr "Ðе знайдено" ++ ++msgid "Not associated" ++msgstr "Ðе пов'Ñзаний" ++ ++msgid "Not connected" ++msgstr "Ðе підключено" ++ ++msgid "Note: Configuration files will be erased." ++msgstr "Примітка: конфігураційні файли будуть видалені." ++ ++msgid "Notice" ++msgstr "ПопередженнÑ" ++ ++msgid "Nslookup" ++msgstr "DNS-запит" ++ ++msgid "OK" ++msgstr "OK" ++ ++msgid "OPKG-Configuration" ++msgstr "ÐšÐ¾Ð½Ñ„Ñ–Ð³ÑƒÑ€Ð°Ñ†Ñ–Ñ OPKG" ++ ++msgid "Off-State Delay" ++msgstr "Затримка Off-State" ++ ++msgid "" ++"On this page you can configure the network interfaces. You can bridge " ++"several interfaces by ticking the \"bridge interfaces\" field and enter the " ++"names of several network interfaces separated by spaces. You can also use " ++"VLAN notation " ++"INTERFACE.VLANNR (e.g.: " ++"eth0.1)." ++msgstr "" ++"Ðа цій Ñторінці ви можете наÑтроїти мережеві інтерфейÑи. Ви можете " ++"об'єднатиати кілька інтерфейÑів моÑтом, відзначивши поле \"Об'єднати " ++"інтерфейÑи в міÑÑ‚\" та ввівши імена кількох мережевих інтерфейÑів, розділені " ++"пробілами. Також ви можете викориÑтовувати VLAN-Ð¿Ð¾Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ " ++"ІÐТЕРФЕЙС.ÐОМЕР_VLAN (наприклад, eth0.1)." ++ ++msgid "On-State Delay" ++msgstr "Затримка On-State" ++ ++msgid "One of hostname or mac address must be specified!" ++msgstr "Має бути вказане одне з двох - ім'Ñ Ð²ÑƒÐ·Ð»Ð° або ÐœÐС-адреÑа!" ++ ++msgid "One or more fields contain invalid values!" ++msgstr "Одне або декілька полів міÑÑ‚ÑÑ‚ÑŒ неприпуÑтимі значеннÑ!" ++ ++msgid "One or more required fields have no value!" ++msgstr "Одне або декілька обов'Ñзкових полів не мають значень!" ++ ++msgid "Open list..." ++msgstr "Відкрити ÑпиÑок..." ++ ++msgid "OpenConnect (CISCO AnyConnect)" ++msgstr "" ++ ++msgid "Operating frequency" ++msgstr "" ++ ++msgid "Option changed" ++msgstr "ÐžÐ¿Ñ†Ñ–Ñ Ð·Ð¼Ñ–Ð½ÐµÐ½Ð°" ++ ++msgid "Option removed" ++msgstr "ÐžÐ¿Ñ†Ñ–Ñ Ð²Ð¸Ð´Ð°Ð»ÐµÐ½Ð°" ++ ++msgid "Optional, specify to override default server (tic.sixxs.net)" ++msgstr "" ++ ++msgid "Optional, use when the SIXXS account has more than one tunnel" ++msgstr "" ++ ++msgid "Options" ++msgstr "Опції" ++ ++msgid "Other:" ++msgstr "Інше:" ++ ++msgid "Out" ++msgstr "Вих." ++ ++msgid "Outbound:" ++msgstr "Вихідний:" ++ ++msgid "Outdoor Channels" ++msgstr "Зовнішні канали" ++ ++msgid "Output Interface" ++msgstr "" ++ ++msgid "Override MAC address" ++msgstr "Перевизначити MAC-адреÑу" ++ ++msgid "Override MTU" ++msgstr "Перевизначити MTU" ++ ++msgid "Override the gateway in DHCP responses" ++msgstr "ÐŸÐµÑ€ÐµÐ²Ð¸Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ ÑˆÐ»ÑŽÐ·Ñƒ у відповідÑÑ… DHCP" ++ ++msgid "" ++"Override the netmask sent to clients. Normally it is calculated from the " ++"subnet that is served." ++msgstr "" ++"ÐŸÐµÑ€ÐµÐ²Ð¸Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð¼ÐµÑ€ÐµÐ¶ÐµÐ²Ð¾Ñ— маÑки, Ñка надÑилаєтьÑÑ ÐºÐ»Ñ–Ñ”Ð½Ñ‚Ð°Ð¼. Зазвичай вона " ++"обчиÑлюєтьÑÑ Ð²Ñ–Ð´ підмережі, що обÑлуговуєтьÑÑ." ++ ++msgid "Override the table used for internal routes" ++msgstr "" ++"ÐŸÐµÑ€ÐµÐ²Ð¸Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ñ‚Ð°Ð±Ð»Ð¸Ñ†Ñ–, що викориÑтовужтьÑÑ Ð´Ð»Ñ Ð²Ð½ÑƒÑ‚Ñ€Ñ–ÑˆÐ½Ñ–Ñ… ÑпрÑмовувань" ++ ++msgid "Overview" ++msgstr "ОглÑд" ++ ++msgid "Owner" ++msgstr "ВлаÑник" ++ ++msgid "PAP/CHAP password" ++msgstr "Пароль PAP/CHAP" ++ ++msgid "PAP/CHAP username" ++msgstr "Ім'Ñ ÐºÐ¾Ñ€Ð¸Ñтувача PAP/CHAP" ++ ++msgid "PID" ++msgstr "PID" ++ ++msgid "PIN" ++msgstr "" ++">PIN" ++ ++msgid "PPP" ++msgstr "PPP" ++ ++msgid "PPPoA Encapsulation" ++msgstr "ІнкапÑулÑÑ†Ñ–Ñ PPPoA" ++ ++msgid "PPPoATM" ++msgstr "PPPoATM" ++ ++msgid "PPPoE" ++msgstr "PPPoE" ++ ++msgid "PPtP" ++msgstr "PPtP" ++ ++msgid "Package libiwinfo required!" ++msgstr "Потрібен пакет libiwinfo!" ++ ++msgid "Package lists are older than 24 hours" ++msgstr "Перелік пакетів Ñтворений більше ніж 24 години тому" ++ ++msgid "Package name" ++msgstr "Ðазва пакета" ++ ++msgid "Packets" ++msgstr "Пакети" ++ ++msgid "Part of zone %q" ++msgstr "ЧаÑтина зони %q" ++ ++msgid "Password" ++msgstr "Пароль" ++ ++msgid "Password authentication" ++msgstr "ÐÐ²Ñ‚ÐµÐ½Ñ‚Ð¸Ñ„Ñ–ÐºÐ°Ñ†Ñ–Ñ Ð·Ð° паролем" ++ ++msgid "Password of Private Key" ++msgstr "Пароль закритого ключа" ++ ++msgid "Password successfully changed!" ++msgstr "Пароль уÑпішно змінено!" ++ ++msgid "Path" ++msgstr "" ++ ++msgid "Path to CA-Certificate" ++msgstr "ШлÑÑ… до центру Ñертифікції" ++ ++msgid "Path to Client-Certificate" ++msgstr "ШлÑÑ… до Ñертифікату клієнта" ++ ++msgid "Path to Private Key" ++msgstr "ШлÑÑ… до закритого ключа" ++ ++msgid "Path to executable which handles the button event" ++msgstr "ШлÑÑ… до програми, Ñка оброблÑÑ” натиÑÐºÐ°Ð½Ð½Ñ ÐºÐ½Ð¾Ð¿ÐºÐ¸" ++ ++msgid "Peak:" ++msgstr "Пік:" ++ ++msgid "Perform reboot" ++msgstr "Виконати перезавантаженнÑ" ++ ++msgid "Perform reset" ++msgstr "Відновити" ++ ++msgid "Phy Rate:" ++msgstr "Фізична швидкіÑÑ‚ÑŒ:" ++ ++msgid "Physical Settings" ++msgstr "Фізичні параметри" ++ ++msgid "Ping" ++msgstr "Ехо-запит" ++ ++msgid "Pkts." ++msgstr "пакетів" ++ ++msgid "Please enter your username and password." ++msgstr "Введіть ім'Ñ ÐºÐ¾Ñ€Ð¸Ñтувача Ñ– пароль" ++ ++msgid "Please wait: Device rebooting..." ++msgstr "Зачекайте. ПриÑтрій перезавантажуєтьÑÑ..." ++ ++msgid "Policy" ++msgstr "Політика" ++ ++msgid "Port" ++msgstr "Порт" ++ ++msgid "Port %d" ++msgstr "Порт %d" ++ ++msgid "Port %d is untagged in multiple VLANs!" ++msgstr "Порт %d нетегований у кількох VLAN-ах!" ++ ++msgid "Port status:" ++msgstr "Ð¡Ñ‚Ð°Ñ‚ÑƒÑ Ð¿Ð¾Ñ€Ñ‚Ñƒ:" ++ ++msgid "" ++"Presume peer to be dead after given amount of LCP echo failures, use 0 to " ++"ignore failures" ++msgstr "" ++"Вважати вузол недоÑтупним піÑÐ»Ñ Ð²Ð¸Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¾Ñ— кількоÑÑ‚Ñ– невдач Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ð½Ð½Ñ ÐµÑ…Ð¾-" ++"пакета LCP, викориÑтовуйте 0, щоб ігнорувати невдачі" ++ ++msgid "Prevents client-to-client communication" ++msgstr "Запобігає зв'Ñзкам клієнт-клієнт" ++ ++msgid "Prism2/2.5/3 802.11b Wireless Controller" ++msgstr "Бездротовий 802.11b контролер Prism2/2.5/3" ++ ++msgid "Proceed" ++msgstr "Продовжити" ++ ++msgid "Processes" ++msgstr "ПроцеÑи" ++ ++msgid "Prot." ++msgstr "Прот." ++ ++msgid "Protocol" ++msgstr "Протокол" ++ ++msgid "Protocol family" ++msgstr "СімейÑтво протоколів" ++ ++msgid "Protocol of the new interface" ++msgstr "Протокол нового інтерфейÑу" ++ ++msgid "Protocol support is not installed" ++msgstr "Підтримка протоколу не інÑтальована" ++ ++msgid "Provide NTP server" ++msgstr "Забезпечувати NTP-Ñервер" ++ ++msgid "Provide new network" ++msgstr "ПоÑтачити нову мережу" ++ ++msgid "Pseudo Ad-Hoc (ahdemo)" ++msgstr "ПÑевдо Ad-Hoc (ahdemo)" ++ ++msgid "Public prefix routed to this device for distribution to clients." ++msgstr "" ++ ++msgid "Quality" ++msgstr "ЯкіÑÑ‚ÑŒ" ++ ++msgid "RTS/CTS Threshold" ++msgstr "Поріг RTS/CTS" ++ ++msgid "RX" ++msgstr "Одержано" ++ ++msgid "RX Rate" ++msgstr "ШвидкіÑÑ‚ÑŒ прийманнÑ" ++ ++msgid "RaLink 802.11%s Wireless Controller" ++msgstr "Бездротовий 802.11%s контролер RaLink" ++ ++msgid "Radius-Accounting-Port" ++msgstr "Порт Radius-Accounting" ++ ++msgid "Radius-Accounting-Secret" ++msgstr "Секрет Radius-Accounting" ++ ++msgid "Radius-Accounting-Server" ++msgstr "Сервер Radius-Accounting" ++ ++msgid "Radius-Authentication-Port" ++msgstr "Порт Radius-Authentication" ++ ++msgid "Radius-Authentication-Secret" ++msgstr "Секрет Radius-Authentication" ++ ++msgid "Radius-Authentication-Server" ++msgstr "Сервер Radius-Authentication" ++ ++msgid "" ++"Read /etc/ethers to configure the DHCP-Server" ++msgstr "" ++"Читати /etc/ethers Ð´Ð»Ñ Ð½Ð°ÑÑ‚Ñ€Ð¾ÑŽÐ²Ð°Ð½Ð½Ñ DHCP-Ñервера" ++ ++msgid "" ++"Really delete this interface? The deletion cannot be undone!\\nYou might " ++"lose access to this device if you are connected via this interface." ++msgstr "" ++"ДійÑно видалити цей інтерфейÑ? СкаÑувати Ð²Ð¸Ð´Ð°Ð»ÐµÐ½Ð½Ñ Ð½ÐµÐ¼Ð¾Ð¶Ð»Ð¸Ð²Ð¾!\n" ++"Ви можете втратити доÑтуп до цього приÑтрою, Ñкщо ви підключені через цей " ++"інтерфейÑ." ++ ++msgid "" ++"Really delete this wireless network? The deletion cannot be undone!\\nYou " ++"might lose access to this device if you are connected via this network." ++msgstr "" ++"ДійÑно видалити цю бездротову мережу? СкаÑувати Ð²Ð¸Ð´Ð°Ð»ÐµÐ½Ð½Ñ Ð½ÐµÐ¼Ð¾Ð¶Ð»Ð¸Ð²Ð¾!\n" ++"Ви можете втратити доÑтуп до цього приÑтрою, Ñкщо ви підключені через цю " ++"мережу." ++ ++msgid "Really reset all changes?" ++msgstr "ДійÑно Ñкинути вÑÑ– зміни?" ++ ++#, fuzzy ++msgid "" ++"Really shut down network?\\nYou might lose access to this device if you are " ++"connected via this interface." ++msgstr "" ++"ДійÑно вимкнути мережу?\n" ++"Ви можете втратити доÑтуп до цього приÑтрою, Ñкщо ви підключені через цю " ++"мережу." ++ ++msgid "" ++"Really shutdown interface \"%s\" ?\\nYou might lose access to this device if " ++"you are connected via this interface." ++msgstr "" ++"ДійÑно вимкнути Ñ–Ð½Ñ‚ÐµÑ€Ñ„ÐµÐ¹Ñ \"%s\"?\n" ++"Ви можете втратити доÑтуп до цього приÑтрою, Ñкщо ви підключені через цей " ++"інтерфейÑ." ++ ++msgid "Really switch protocol?" ++msgstr "ДійÑно змінити протокол?" ++ ++msgid "Realtime Connections" ++msgstr "ÐŸÑ–Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð½Ñ Ñƒ реальному чаÑÑ–" ++ ++msgid "Realtime Graphs" ++msgstr "Графіки у реальному чаÑÑ–" ++ ++msgid "Realtime Load" ++msgstr "ÐÐ°Ð²Ð°Ð½Ñ‚Ð°Ð¶ÐµÐ½Ð½Ñ Ñƒ реальному чаÑÑ–" ++ ++msgid "Realtime Traffic" ++msgstr "Трафік у реальному чаÑÑ–" ++ ++msgid "Realtime Wireless" ++msgstr "Бездротові мережі у реальному чаÑÑ–" ++ ++msgid "Rebind protection" ++msgstr "ЗахиÑÑ‚ від переприв'Ñзки" ++ ++msgid "Reboot" ++msgstr "ПерезавантаженнÑ" ++ ++msgid "Rebooting..." ++msgstr "ПерезавантаженнÑ..." ++ ++msgid "Reboots the operating system of your device" ++msgstr "Перезавантажити операційну ÑиÑтему вашого приÑтрою" ++ ++msgid "Receive" ++msgstr "Прийом" ++ ++msgid "Receiver Antenna" ++msgstr "Ðнтена приймача" ++ ++msgid "Reconnect this interface" ++msgstr "Перепідключити цей інтерфейÑ" ++ ++msgid "Reconnecting interface" ++msgstr "ÐŸÐµÑ€ÐµÐ¿Ñ–Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð½Ñ Ñ–Ð½Ñ‚ÐµÑ€Ñ„ÐµÐ¹Ñу" ++ ++msgid "References" ++msgstr "ПоÑиланнÑ" ++ ++msgid "Regulatory Domain" ++msgstr "РегулÑтивний домен" ++ ++msgid "Relay" ++msgstr "РетранÑлÑтор" ++ ++msgid "Relay Bridge" ++msgstr "МіÑÑ‚-ретранÑлÑтор" ++ ++msgid "Relay between networks" ++msgstr "Міжмережевий ретранÑлÑтор" ++ ++msgid "Relay bridge" ++msgstr "МіÑÑ‚-ретранÑлÑтор" ++ ++msgid "Remote IPv4 address" ++msgstr "Віддалена адреÑа IPv4" ++ ++msgid "Remove" ++msgstr "Видалити" ++ ++msgid "Repeat scan" ++msgstr "Повторити ÑкануваннÑ" ++ ++msgid "Replace entry" ++msgstr "Замінити запиÑ" ++ ++msgid "Replace wireless configuration" ++msgstr "Замінити конфігурацію бездротової мережі" ++ ++msgid "Request IPv6-address" ++msgstr "" ++ ++msgid "Request IPv6-prefix of length" ++msgstr "" ++ ++msgid "Require TLS" ++msgstr "" ++ ++msgid "Required for certain ISPs, e.g. Charter with DOCSIS 3" ++msgstr "Потрібно Ð´Ð»Ñ Ð´ÐµÑких провайдерів, наприклад, Charter із DOCSIS 3" ++ ++msgid "Reset" ++msgstr "Скинути" ++ ++msgid "Reset Counters" ++msgstr "Скинути лічильники" ++ ++msgid "Reset to defaults" ++msgstr "Відновити початковий Ñтан" ++ ++msgid "Resolv and Hosts Files" ++msgstr "Файли resolv Ñ– hosts" ++ ++msgid "Resolve file" ++msgstr "Файл resolv" ++ ++msgid "Restart" ++msgstr "Перезавантажити" ++ ++msgid "Restart Firewall" ++msgstr "Перезавантажити брандмауер" ++ ++msgid "Restore backup" ++msgstr "Відновити з резервної копії" ++ ++msgid "Reveal/hide password" ++msgstr "Показати/приховати пароль" ++ ++msgid "Revert" ++msgstr "СкаÑувати зміни" ++ ++msgid "Root" ++msgstr "Корінь" ++ ++msgid "Root directory for files served via TFTP" ++msgstr "Кореневий каталог Ð´Ð»Ñ Ñ„Ð°Ð¹Ð»Ñ–Ð² TFTP" ++ ++msgid "Root preparation" ++msgstr "" ++ ++msgid "Routed IPv6 prefix for downstream interfaces" ++msgstr "" ++ ++msgid "Router Advertisement-Service" ++msgstr "" ++ ++msgid "Router Password" ++msgstr "Пароль маршрутизатора" ++ ++msgid "Routes" ++msgstr "Маршрути" ++ ++msgid "" ++"Routes specify over which interface and gateway a certain host or network " ++"can be reached." ++msgstr "" ++"Маршрути визначають через Ñкий Ñ–Ð½Ñ‚ÐµÑ€Ñ„ÐµÐ¹Ñ Ñ– шлюз можна доÑÑгнути певного " ++"вузла або мережі." ++ ++msgid "Rule #" ++msgstr "Правило #" ++ ++msgid "Run a filesystem check before mounting the device" ++msgstr "Виконати перевірку файлової ÑиÑтеми перед монтуваннÑм приÑтрою" ++ ++msgid "Run filesystem check" ++msgstr "Виконати перевірку файлової ÑиÑтеми" ++ ++msgid "" ++"SIXXS supports TIC only, for static tunnels using IP protocol 41 (RFC4213) " ++"use 6in4 instead" ++msgstr "" ++ ++msgid "SIXXS-handle[/Tunnel-ID]" ++msgstr "" ++ ++msgid "SSH Access" ++msgstr "SSH-доÑтуп" ++ ++msgid "SSH-Keys" ++msgstr "SSH-ключі" ++ ++msgid "SSID" ++msgstr "SSID" ++ ++msgid "Save" ++msgstr "Зберегти" ++ ++msgid "Save & Apply" ++msgstr "Зберегти Ñ– заÑтоÑувати" ++ ++msgid "Save & Apply" ++msgstr "Зберегти Ñ– заÑтоÑувати" ++ ++msgid "Scan" ++msgstr "Сканувати" ++ ++msgid "Scheduled Tasks" ++msgstr "Заплановані завданнÑ" ++ ++msgid "Section added" ++msgstr "Ð¡ÐµÐºÑ†Ñ–Ñ Ð´Ð¾Ð´Ð°Ð½Ð°" ++ ++msgid "Section removed" ++msgstr "Ð¡ÐµÐºÑ†Ñ–Ñ Ð²Ð¸Ð´Ð°Ð»ÐµÐ½Ð°" ++ ++msgid "See \"mount\" manpage for details" ++msgstr "Подробиці див. на Ñторінці керівництва \"mount\"" ++ ++msgid "" ++"Send LCP echo requests at the given interval in seconds, only effective in " ++"conjunction with failure threshold" ++msgstr "" ++"ÐадÑилати ехо-пакети LCP зі вказаним інтервалом (Ñекунди), ефективно тільки " ++"в поєднанні з порогом помилок" ++ ++msgid "Separate Clients" ++msgstr "РозділÑти клієнтів" ++ ++msgid "Separate WDS" ++msgstr "РозділÑти WDS" ++ ++msgid "Server Settings" ++msgstr "ÐаÑтройки Ñервера" ++ ++msgid "Server password" ++msgstr "" ++ ++msgid "" ++"Server password, enter the specific password of the tunnel when the username " ++"contains the tunnel ID" ++msgstr "" ++ ++msgid "Server username" ++msgstr "" ++ ++msgid "Service Name" ++msgstr "Ðазва (ім'Ñ) ÑервіÑу" ++ ++msgid "Service Type" ++msgstr "Тип ÑервіÑу" ++ ++msgid "Services" ++msgstr "СервіÑи" ++ ++#, fuzzy ++msgid "Set up Time Synchronization" ++msgstr "ÐаÑтройки Ñинхронізації чаÑу" ++ ++msgid "Setup DHCP Server" ++msgstr "ÐаÑтройки DHCP-Ñервера" ++ ++msgid "Show current backup file list" ++msgstr "Показати поточний ÑпиÑок файлів резервного копіюваннÑ" ++ ++msgid "Shutdown this interface" ++msgstr "Вимкнути цей інтерфейÑ" ++ ++msgid "Shutdown this network" ++msgstr "Вимкнути цю мережу" ++ ++msgid "Signal" ++msgstr "Сигнал" ++ ++msgid "Signal:" ++msgstr "Сигнал:" ++ ++msgid "Size" ++msgstr "Розмір" ++ ++msgid "Skip" ++msgstr "ПропуÑтити" ++ ++msgid "Skip to content" ++msgstr "Перейти до вміÑту" ++ ++msgid "Skip to navigation" ++msgstr "Перейти до навігації" ++ ++msgid "Slot time" ++msgstr "Ð§Ð°Ñ Ñлота" ++ ++msgid "Software" ++msgstr "Програмне забезпеченнÑ" ++ ++msgid "Some fields are invalid, cannot save values!" ++msgstr "ДеÑкі Ð¿Ð¾Ð»Ñ Ñ” неприпуÑтимими, неможливо зберегти значеннÑ!" ++ ++msgid "Sorry, the object you requested was not found." ++msgstr "Ðа жаль, об'єкт, Ñкий ви проÑили, не знайдено." ++ ++msgid "Sorry, the server encountered an unexpected error." ++msgstr "Ðа жаль, на Ñервері ÑталаÑÑ Ð½ÐµÐ¾Ñ‡Ñ–ÐºÑƒÐ²Ð°Ð½Ð° помилка." ++ ++#, fuzzy ++msgid "" ++"Sorry, there is no sysupgrade support present; a new firmware image must be " ++"flashed manually. Please refer to the OpenWrt wiki for device specific " ++"install instructions." ++msgstr "" ++"Ðа жаль, автоматичне Ð¾Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ ÑиÑтеми не підтримуєтьÑÑ. Ðовий образ " ++"прошивки повинен бути залитий вручну. ЗвернітьÑÑ Ð´Ð¾ OpenWrt Wiki за " ++"інÑтрукцією з інÑталÑції Ð´Ð»Ñ ÐºÐ¾Ð½ÐºÑ€ÐµÑ‚Ð½Ð¾Ð³Ð¾ приÑтрою." ++ ++msgid "Sort" ++msgstr "СортуваннÑ" ++ ++msgid "Source" ++msgstr "Джерело" ++ ++msgid "Source routing" ++msgstr "" ++ ++msgid "Specifies the button state to handle" ++msgstr "Визначає Ñтан кнопки Ð´Ð»Ñ Ð¾Ð±Ñ€Ð¾Ð±ÐºÐ¸" ++ ++msgid "Specifies the directory the device is attached to" ++msgstr "Визначає каталог, до Ñкого приєднаний приÑтрій" ++ ++msgid "Specifies the listening port of this Dropbear instance" ++msgstr "Визначає порт проÑÐ»ÑƒÑ…Ð¾Ð²ÑƒÐ²Ð°Ð½Ð½Ñ Ñ†Ñ–Ñ”Ñ— реалізації Dropbear" ++ ++msgid "" ++"Specifies the maximum amount of failed ARP requests until hosts are presumed " ++"to be dead" ++msgstr "" ++"Визначає макÑимальну кількіÑÑ‚ÑŒ невдалих ARP-запитів до вузлів, піÑÐ»Ñ Ñкого " ++"вважаєтьÑÑ, що вузли \"мертві\"" ++ ++msgid "" ++"Specifies the maximum amount of seconds after which hosts are presumed to be " ++"dead" ++msgstr "" ++"Визначає макÑимальний Ñ‡Ð°Ñ (Ñекунди), піÑÐ»Ñ Ñкого вважаєтьÑÑ, що вузли " ++"\"мертві\"" ++ ++msgid "Specify the secret encryption key here." ++msgstr "Вкажіть тут Ñекретний ключ шифруваннÑ." ++ ++msgid "Start" ++msgstr "ЗапуÑтити" ++ ++msgid "Start priority" ++msgstr "Стартовий пріоритет" ++ ++msgid "Startup" ++msgstr "ЗапуÑк" ++ ++msgid "Static IPv4 Routes" ++msgstr "Статичні маршрути IPv4" ++ ++msgid "Static IPv6 Routes" ++msgstr "Статичні маршрути IPv6" ++ ++msgid "Static Leases" ++msgstr "Статичні оренди" ++ ++msgid "Static Routes" ++msgstr "Статичні маршрути" ++ ++msgid "Static WDS" ++msgstr "Статичний WDS" ++ ++msgid "Static address" ++msgstr "Статичні адреÑи" ++ ++msgid "" ++"Static leases are used to assign fixed IP addresses and symbolic hostnames " ++"to DHCP clients. They are also required for non-dynamic interface " ++"configurations where only hosts with a corresponding lease are served." ++msgstr "" ++"Статичні оренди викориÑтовуютьÑÑ Ð´Ð»Ñ Ð¿Ñ€Ð¸Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ñ„Ñ–ÐºÑованих IP-Ð°Ð´Ñ€ÐµÑ Ñ– " ++"Ñимволічних імен вузлів DHCP-клієнтам. Вони також необхідні Ð´Ð»Ñ Ñтатичних " ++"конфігурацій інтерфейÑів, коли обÑлуговуютьÑÑ Ñ‚Ñ–Ð»ÑŒÐºÐ¸ вузли з відповідною " ++"орендою." ++ ++msgid "Status" ++msgstr "СтатуÑ" ++ ++msgid "Stop" ++msgstr "Зупинити" ++ ++msgid "Strict order" ++msgstr "Строгий порÑдок" ++ ++msgid "Submit" ++msgstr "ÐадіÑлати" ++ ++msgid "Swap" ++msgstr "" ++ ++msgid "Swap Entry" ++msgstr "Вхід довантаженнÑ" ++ ++msgid "Switch" ++msgstr "Комутатор" ++ ++msgid "Switch %q" ++msgstr "Комутатор %q" ++ ++msgid "Switch %q (%s)" ++msgstr "Комутатор %q (%s)" ++ ++msgid "Switch protocol" ++msgstr "Протокол комутатора" ++ ++msgid "Sync with browser" ++msgstr "Синхронізувати з браузером" ++ ++msgid "Synchronizing..." ++msgstr "СинхронізаціÑ..." ++ ++msgid "System" ++msgstr "СиÑтема" ++ ++msgid "System Log" ++msgstr "СиÑтемний журнал" ++ ++msgid "System Properties" ++msgstr "ВлаÑтивоÑÑ‚Ñ– ÑиÑтеми" ++ ++msgid "System log buffer size" ++msgstr "Розмір буфера ÑиÑтемного журналу" ++ ++msgid "TCP:" ++msgstr "TCP:" ++ ++msgid "TFTP Settings" ++msgstr "ÐаÑтройки TFTP" ++ ++msgid "TFTP server root" ++msgstr "Корінь TFTP-Ñервера" ++ ++msgid "TX" ++msgstr "Передано" ++ ++msgid "TX Rate" ++msgstr "ШвидкіÑÑ‚ÑŒ передаваннÑ" ++ ++msgid "Table" ++msgstr "ТаблицÑ" ++ ++msgid "Target" ++msgstr "Мета" ++ ++msgid "Terminate" ++msgstr "Завершити" ++ ++#, fuzzy ++msgid "" ++"The Device Configuration section covers physical settings of the " ++"radio hardware such as channel, transmit power or antenna selection which " ++"are shared among all defined wireless networks (if the radio hardware is " ++"multi-SSID capable). Per network settings like encryption or operation mode " ++"are grouped in the Interface Configuration." ++msgstr "" ++"Розділ ÐšÐ¾Ð½Ñ„Ñ–Ð³ÑƒÑ€Ð°Ñ†Ñ–Ñ Ð¿Ñ€Ð¸Ñтрою охоплює фізичні параметри радіо-" ++"апаратних заÑобів, такі, Ñк канал, потужніÑÑ‚ÑŒ передавача або вибір антени, " ++"Ñкі Ñ” Ñпільними Ð´Ð»Ñ Ð²ÑÑ–Ñ… визначених бездротових мереж (Ñкщо радіо-апаратні " ++"заÑоби здатні підтримувати кілька SSID). Параметри окремих мереж, такі, Ñк " ++"ÑˆÐ¸Ñ„Ñ€ÑƒÐ²Ð°Ð½Ð½Ñ Ð°Ð±Ð¾ режим роботи, згруповані в розділі ÐšÐ¾Ð½Ñ„Ñ–Ð³ÑƒÑ€Ð°Ñ†Ñ–Ñ " ++"інтерфейÑу." ++ ++msgid "" ++"The libiwinfo-lua package is not installed. You must install this " ++"component for working wireless configuration!" ++msgstr "" ++"Пакет libiwinfo-lua не інÑтальований. Щоб мати можливіÑÑ‚ÑŒ " ++"наÑтроювати безпровідні мережі, Ñлід інÑталювати цей компонент!" ++ ++msgid "" ++"The HE.net endpoint update configuration changed, you must now use the plain " ++"username instead of the user ID!" ++msgstr "" ++ ++msgid "" ++"The IPv6 prefix assigned to the provider, usually ends with ::" ++msgstr "" ++"Призначений провайдеру IPv6-префікÑ, зазвичай закінчуєтьÑÑ Ð½Ð° ::" ++ ++msgid "" ++"The allowed characters are: A-Z, a-z, 0-9 and _" ++msgstr "" ++"Дозволені Ñимволи: A-Z, a-z, 0-9 та " ++"_" ++ ++msgid "The configuration file could not be loaded due to the following error:" ++msgstr "" ++ ++msgid "" ++"The device file of the memory or partition (e.g." ++" /dev/sda1)" ++msgstr "Файл приÑтрою пам'ÑÑ‚Ñ– або розділу (наприклад, /dev/sda1)" ++ ++msgid "" ++"The filesystem that was used to format the memory (e.g. ext3)" ++msgstr "" ++"Файлова ÑиÑтема, Ñка викориÑтовуватиметьÑÑ Ð´Ð»Ñ Ñ„Ð¾Ñ€Ð¼Ð°Ñ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ð¿Ð°Ð¼'ÑÑ‚Ñ– " ++"(наприклад, ext3)" ++ ++msgid "" ++"The flash image was uploaded. Below is the checksum and file size listed, " ++"compare them with the original file to ensure data integrity.
    Click " ++"\"Proceed\" below to start the flash procedure." ++msgstr "" ++"Образ завантажено. Ðижче наведено контрольну Ñуму Ñ– розмір файлу. ПорівнÑйте " ++"Ñ—Ñ… з вихідним файлом Ð´Ð»Ñ Ð·Ð°Ð±ÐµÐ·Ð¿ÐµÑ‡ÐµÐ½Ð½Ñ Ñ†Ñ–Ð»Ñ–ÑноÑÑ‚Ñ– даних.
    ÐатиÑніть " ++"\"Продовжити\", щоб розпочати процедуру Ð¾Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ð¿Ñ€Ð¾ÑˆÐ¸Ð²ÐºÐ¸." ++ ++msgid "The following changes have been committed" ++msgstr "Ðижче наведені зміни були заÑтоÑовані" ++ ++msgid "The following changes have been reverted" ++msgstr "Ðижче наведені зміни були ÑкаÑовані" ++ ++msgid "The following rules are currently active on this system." ++msgstr "У даний Ñ‡Ð°Ñ Ñƒ цій ÑиÑтемі активні такі правила." ++ ++msgid "The given network name is not unique" ++msgstr "Задане мережеве ім'Ñ Ð½Ðµ Ñ” унікальним" ++ ++#, fuzzy ++msgid "" ++"The hardware is not multi-SSID capable and the existing configuration will " ++"be replaced if you proceed." ++msgstr "" ++"ÐžÐ±Ð»Ð°Ð´Ð½Ð°Ð½Ð½Ñ Ð½Ðµ підтримує мульти-SSID Ñ–, Ñкщо ви продовжите, Ñ–Ñнуюча " ++"ÐºÐ¾Ð½Ñ„Ñ–Ð³ÑƒÑ€Ð°Ñ†Ñ–Ñ Ð±ÑƒÐ´Ðµ замінена." ++ ++msgid "" ++"The length of the IPv4 prefix in bits, the remainder is used in the IPv6 " ++"addresses." ++msgstr "Довжина IPv4-префікÑа в бітах, решта викориÑтовуєтьÑÑ Ð² IPv6-адреÑах." ++ ++msgid "The length of the IPv6 prefix in bits" ++msgstr "Довжина IPv6-префікÑа в бітах" ++ ++msgid "" ++"The network ports on this device can be combined to several VLANs in which computers can " ++"communicate directly with each other. VLANs are often used to separate different network " ++"segments. Often there is by default one Uplink port for a connection to the " ++"next greater network like the internet and other ports for a local network." ++msgstr "" ++"Мережеві порти вашого приÑтрою можуть бути об'єднані у декілька VLAN, у Ñких комп'ютери можуть напрÑму ÑпілкуватиÑÑ Ð¾Ð´Ð¸Ð½ з одним. " ++"VLAN чаÑто викориÑтовуютьÑÑ Ð´Ð»Ñ Ñ€Ð¾Ð·Ð´Ñ–Ð»ÐµÐ½Ð½Ñ Ð¼ÐµÑ€ÐµÐ¶Ñ– на окремі " ++"Ñегменти. Зазвичай один виcхідний порт викориÑтовуєтьÑÑ Ð´Ð»Ñ Ð·'Ñ”Ð´Ð½Ð°Ð½Ð½Ñ Ð· " ++"більшою мережею, такою наприклад, Ñк Інтернет, а інші порти — Ð´Ð»Ñ Ð»Ð¾ÐºÐ°Ð»ÑŒÐ½Ð¾Ñ— " ++"мережі." ++ ++msgid "The selected protocol needs a device assigned" ++msgstr "Обраний протокол потребує призначених приÑтроїв" ++ ++msgid "" ++"The system is erasing the configuration partition now and will reboot itself " ++"when finished." ++msgstr "" ++"Зараз ÑиÑтема видалÑÑ” розділ конфігурації Ñ– коли закінчить, " ++"перезавантажитьÑÑ." ++ ++#, fuzzy ++msgid "" ++"The system is flashing now.
    DO NOT POWER OFF THE DEVICE!
    Wait a " ++"few minutes before you try to reconnect. It might be necessary to renew the " ++"address of your computer to reach the device again, depending on your " ++"settings." ++msgstr "" ++"СиÑтема перепрошиваєтьÑÑ.
    ÐЕ ВИМИКÐЙТЕ ЖИВЛЕÐÐЯ ПРИСТРОЮ!
    Зачекайте кілька хвилин перед тим, Ñк пробувати знову " ++"з'єднатиÑÑ. Залежно від ваших наÑтройок, можливо, вам треба буде оновити " ++"адреÑу вашого комп'ютера, щоб знову отримати доÑтуп до приÑтрою." ++ ++msgid "" ++"The tunnel end-point is behind NAT, defaults to disabled and only applies to " ++"AYIYA" ++msgstr "" ++ ++msgid "" ++"The uploaded image file does not contain a supported format. Make sure that " ++"you choose the generic image format for your platform." ++msgstr "" ++"Завантажений файл образу не міÑтить підтримуваний формат. ПереконайтеÑÑ, що " ++"ви вибираєте універÑальний формат образу Ð´Ð»Ñ Ð²Ð°ÑˆÐ¾Ñ— платформи." ++ ++msgid "There are no active leases." ++msgstr "Ðктивних оренд немає." ++ ++msgid "There are no pending changes to apply!" ++msgstr "Ðемає жодних змін до заÑтоÑуваннÑ!" ++ ++msgid "There are no pending changes to revert!" ++msgstr "Ðемає жодних змін до ÑкаÑуваннÑ!" ++ ++msgid "There are no pending changes!" ++msgstr "Ðемає жодних очікуючих змін!" ++ ++msgid "" ++"There is no device assigned yet, please attach a network device in the " ++"\"Physical Settings\" tab" ++msgstr "" ++"Ðемає жодного призначеного приÑтрою. Призначте мережевий приÑтрій у вкладці " ++"\"Фізичні параметри\"." ++ ++msgid "" ++"There is no password set on this router. Please configure a root password to " ++"protect the web interface and enable SSH." ++msgstr "" ++"Цей маршрутизатор не має паролÑ. Ð’Ñтановіть пароль, шоб захиÑтити веб-" ++"Ñ–Ð½Ñ‚ÐµÑ€Ñ„ÐµÐ¹Ñ Ñ– увімкнути SSH." ++ ++msgid "This IPv4 address of the relay" ++msgstr "Це IPv4-адреÑа ретранÑлÑтора" ++ ++msgid "" ++"This is a list of shell glob patterns for matching files and directories to " ++"include during sysupgrade. Modified files in /etc/config/ and certain other " ++"configurations are automatically preserved." ++msgstr "" ++"Це ÑпиÑок шаблонів Ð´Ð»Ñ Ð²Ñ–Ð´Ð±Ð¾Ñ€Ñƒ файлів Ñ– каталогів, Ñкі мають увійти до " ++"резервної копії. Змінені файли у /etc/config/ та деÑкі інші " ++"зберігаютьÑÑ Ð°Ð²Ñ‚Ð¾Ð¼Ð°Ñ‚Ð¸Ñ‡Ð½Ð¾." ++ ++msgid "" ++"This is either the \"Update Key\" configured for the tunnel or the account " ++"password if no update key has been configured" ++msgstr "" ++ ++msgid "" ++"This is the content of /etc/rc.local. Insert your own commands here (in " ++"front of 'exit 0') to execute them at the end of the boot process." ++msgstr "" ++"Це вміÑÑ‚ файлу /etc/rc.local. Ð’Ñтавте тут ваші влаÑні команди " ++"(перед 'exit 0'), щоб виконати Ñ—Ñ… у кінці процеÑу завантаженнÑ." ++ ++msgid "" ++"This is the local endpoint address assigned by the tunnel broker, it usually " ++"ends with :2" ++msgstr "" ++"Це локальна адреÑа кінцевої точки, приÑвоєна тунельним брокером, зазвичай " ++"закінчуєтьÑÑ Ð½Ð° :2" ++ ++msgid "" ++"This is the only DHCP in the local network" ++msgstr "" ++"Тільки Ð´Ð»Ñ DHCP у локальній мережі" ++ ++msgid "This is the plain username for logging into the account" ++msgstr "" ++ ++msgid "" ++"This is the prefix routed to you by the tunnel broker for use by clients" ++msgstr "" ++ ++msgid "This is the system crontab in which scheduled tasks can be defined." ++msgstr "" ++"Це ÑиÑтемна Ñ‚Ð°Ð±Ð»Ð¸Ñ†Ñ Cron (crontab), у Ñкій можна визначити заплановані " ++"завданнÑ." ++ ++msgid "" ++"This is usually the address of the nearest PoP operated by the tunnel broker" ++msgstr "" ++"Зазвичай, це адреÑа найближчої точки приÑутноÑÑ‚Ñ–, що управлÑєтьÑÑ Ñ‚ÑƒÐ½ÐµÐ»Ð½Ð¸Ð¼ " ++"брокером" ++ ++msgid "" ++"This list gives an overview over currently running system processes and " ++"their status." ++msgstr "" ++"У цьому ÑпиÑку наведені працюючі на даний момент ÑиÑтемні процеÑи та Ñ—Ñ… " ++"ÑтатуÑ." ++ ++msgid "This page allows the configuration of custom button actions" ++msgstr "Ð¦Ñ Ñторінка дозволÑÑ” наÑтроїти нетипові дії кнопки" ++ ++msgid "This page gives an overview over currently active network connections." ++msgstr "Ð¦Ñ Ñторінка надає оглÑд поточних активних мережних підключень." ++ ++msgid "This section contains no values yet" ++msgstr "Ð¦Ñ ÑÐµÐºÑ†Ñ–Ñ Ð¿Ð¾ÐºÐ¸ що не міÑтить значень" ++ ++msgid "Time Synchronization" ++msgstr "Ð¡Ð¸Ð½Ñ…Ñ€Ð¾Ð½Ñ–Ð·Ð°Ñ†Ñ–Ñ Ñ‡Ð°Ñу" ++ ++msgid "Time Synchronization is not configured yet." ++msgstr "Ð¡Ð¸Ð½Ñ…Ñ€Ð¾Ð½Ñ–Ð·Ð°Ñ†Ñ–Ñ Ñ‡Ð°Ñу не наÑтроєна." ++ ++msgid "Timezone" ++msgstr "ЧаÑовий поÑÑ" ++ ++msgid "" ++"To restore configuration files, you can upload a previously generated backup " ++"archive here." ++msgstr "" ++"Щоб відновити файли конфігурації, ви можете відвантажити раніше Ñтворений " ++"архів резервної копії." ++ ++msgid "Total Available" ++msgstr "УÑього доÑтупно" ++ ++msgid "Traceroute" ++msgstr "ТраÑуваннÑ" ++ ++msgid "Traffic" ++msgstr "Трафік" ++ ++msgid "Transfer" ++msgstr "Передано" ++ ++msgid "Transmission Rate" ++msgstr "ШвидкіÑÑ‚ÑŒ передаваннÑ" ++ ++msgid "Transmit" ++msgstr "Передача" ++ ++msgid "Transmit Power" ++msgstr "ПотужніÑÑ‚ÑŒ передавача" ++ ++msgid "Transmitter Antenna" ++msgstr "Ðнтена передавача" ++ ++msgid "Trigger" ++msgstr "Тригер" ++ ++msgid "Trigger Mode" ++msgstr "Режим запуÑку" ++ ++msgid "Tunnel ID" ++msgstr "Ідентифікатор тунелю" ++ ++msgid "Tunnel Interface" ++msgstr "Ð†Ð½Ñ‚ÐµÑ€Ñ„ÐµÐ¹Ñ Ñ‚ÑƒÐ½ÐµÐ»ÑŽ" ++ ++msgid "Tunnel Link" ++msgstr "" ++ ++msgid "Tunnel broker protocol" ++msgstr "" ++ ++msgid "Tunnel setup server" ++msgstr "" ++ ++msgid "Tunnel type" ++msgstr "" ++ ++msgid "Turbo Mode" ++msgstr "Режим Turbo" ++ ++msgid "Tx-Power" ++msgstr "ПотужніÑÑ‚ÑŒ передавача" ++ ++msgid "Type" ++msgstr "Тип" ++ ++msgid "UDP:" ++msgstr "UDP:" ++ ++msgid "UMTS only" ++msgstr "Тільки UMTS" ++ ++msgid "UMTS/GPRS/EV-DO" ++msgstr "UMTS/GPRS/EV-DO" ++ ++msgid "USB Device" ++msgstr "USB-приÑтрій" ++ ++msgid "UUID" ++msgstr "UUID" ++ ++msgid "Unable to dispatch" ++msgstr "Ðе вдалоÑÑ Ð¾Ð¿Ñ€Ð°Ñ†ÑŽÐ²Ð°Ñ‚Ð¸ запит" ++ ++msgid "Unknown" ++msgstr "Ðевідомо" ++ ++msgid "Unknown Error, password not changed!" ++msgstr "Ðевідома помилка, пароль не змінивÑÑ!" ++ ++msgid "Unmanaged" ++msgstr "Ðекерований" ++ ++msgid "Unsaved Changes" ++msgstr "Ðезбережені зміни" ++ ++msgid "Unsupported protocol type." ++msgstr "Ðепідтримуваний тип протоколу." ++ ++msgid "Update lists" ++msgstr "Оновити ÑпиÑки..." ++ ++msgid "" ++"Upload a sysupgrade-compatible image here to replace the running firmware. " ++"Check \"Keep settings\" to retain the current configuration (requires an " ++"OpenWrt compatible firmware image)." ++msgstr "" ++"Відвантажити sysupgrade-ÑуміÑний образ, щоб замінити поточну прошивку. Ð”Ð»Ñ " ++"Ð·Ð±ÐµÑ€ÐµÐ¶ÐµÐ½Ð½Ñ Ð¿Ð¾Ñ‚Ð¾Ñ‡Ð½Ð¾Ñ— конфігурації вÑтановіть прапорець \"Зберегти наÑтройки" ++"\" (потрібен OpenWrt-ÑуміÑний образ прошивки)." ++ ++msgid "Upload archive..." ++msgstr "Відвантажити архів..." ++ ++msgid "Uploaded File" ++msgstr "Відвантажений файл" ++ ++msgid "Uptime" ++msgstr "Ð§Ð°Ñ Ð±ÐµÐ·Ð¿ÐµÑ€ÐµÑ€Ð²Ð½Ð¾Ñ— роботи" ++ ++msgid "Use /etc/ethers" ++msgstr "ВикориÑтовувати /etc/ethers" ++ ++msgid "Use DHCP gateway" ++msgstr "ВикориÑтовувати DHCP-шлюз" ++ ++msgid "Use DNS servers advertised by peer" ++msgstr "ВикориÑтовувати DNS-Ñервери, оголошувані вузлом" ++ ++msgid "Use ISO/IEC 3166 alpha2 country codes." ++msgstr "ВикориÑтовуйте коди країн згідно ISO/IEC 3166 alpha2." ++ ++msgid "Use MTU on tunnel interface" ++msgstr "ВикориÑтовувати на тунельному інтерфейÑÑ– MTU" ++ ++msgid "Use TTL on tunnel interface" ++msgstr "ВикориÑтовувати на тунельному інтерфейÑÑ– TTL" ++ ++msgid "Use as external overlay (/overlay)" ++msgstr "" ++ ++msgid "Use as root filesystem (/)" ++msgstr "" ++ ++msgid "Use broadcast flag" ++msgstr "ВикориÑтовувати прапорець широкомовноÑÑ‚Ñ–" ++ ++msgid "Use builtin IPv6-management" ++msgstr "" ++ ++msgid "Use custom DNS servers" ++msgstr "ВикориÑтовувати оÑобливі DNS-Ñервери" ++ ++msgid "Use default gateway" ++msgstr "ВикориÑтовувати типовий шлюз" ++ ++msgid "Use gateway metric" ++msgstr "ВикориÑтовувати метрику шлюзу" ++ ++msgid "Use routing table" ++msgstr "ВикориÑтовувати таблицю маршрутизації" ++ ++msgid "" ++"Use the Add Button to add a new lease entry. The MAC-Address indentifies the host, the IPv4-Address specifies to the fixed " ++"address to use and the Hostname is assigned as symbolic name to the " ++"requesting host." ++msgstr "" ++"ВикориÑтовуйте кнопку Додати, щоб додати новий Ð·Ð°Ð¿Ð¸Ñ Ð¾Ñ€ÐµÐ½Ð´Ð¸. " ++"MAC-адреÑа ідентифікує вузол, IPv4-адреÑа визначає " ++"фікÑовану адреÑу, Ñка буде викориÑтовуватиÑÑ, а Ðазва (ім'Ñ) вузла " ++"призначає Ñимволічне ім'Ñ Ð²ÑƒÐ·Ð»Ð°." ++ ++msgid "Used" ++msgstr "ВикориÑтано" ++ ++msgid "Used Key Slot" ++msgstr "ВикориÑтовуєтьÑÑ Ñлот ключа" ++ ++msgid "User certificate (PEM encoded)" ++msgstr "" ++ ++msgid "User key (PEM encoded)" ++msgstr "" ++ ++msgid "Username" ++msgstr "Ім'Ñ ÐºÐ¾Ñ€Ð¸Ñтувача" ++ ++msgid "VC-Mux" ++msgstr "VC-Mux" ++ ++msgid "VLAN Interface" ++msgstr "VLAN-інтерфейÑ" ++ ++msgid "VLANs on %q" ++msgstr "VLAN на %q" ++ ++msgid "VLANs on %q (%s)" ++msgstr "VLAN на %q (%s)" ++ ++msgid "VPN Server" ++msgstr "VPN-Ñервер" ++ ++msgid "VPN Server port" ++msgstr "" ++ ++msgid "VPN Server's certificate SHA1 hash" ++msgstr "" ++ ++msgid "Vendor Class to send when requesting DHCP" ++msgstr "ÐšÐ»Ð°Ñ Ð¿Ð¾Ñтачальника Ð´Ð»Ñ Ð²Ñ–Ð´Ð¿Ñ€Ð°Ð²ÐºÐ¸ при запиті DHCP" ++ ++msgid "Verbose" ++msgstr "" ++ ++msgid "Verbose logging by aiccu daemon" ++msgstr "" ++ ++msgid "Verify" ++msgstr "Перевірте" ++ ++msgid "Version" ++msgstr "ВерÑÑ–Ñ" ++ ++msgid "WDS" ++msgstr "WDS" ++ ++msgid "WEP Open System" ++msgstr "Відкрита ÑиÑтема WEP" ++ ++msgid "WEP Shared Key" ++msgstr "Спільний ключ WEP" ++ ++msgid "WEP passphrase" ++msgstr "Парольна фраза WEP" ++ ++msgid "WMM Mode" ++msgstr "Режим WMM" ++ ++msgid "WPA passphrase" ++msgstr "Парольна фраза WPA" ++ ++msgid "" ++"WPA-Encryption requires wpa_supplicant (for client mode) or hostapd (for AP " ++"and ad-hoc mode) to be installed." ++msgstr "" ++"WPA-ÑˆÐ¸Ñ„Ñ€ÑƒÐ²Ð°Ð½Ð½Ñ Ð¿Ð¾Ñ‚Ñ€ÐµÐ±ÑƒÑ” інÑталÑції wpa_supplicant (Ð´Ð»Ñ Ñ€ÐµÐ¶Ð¸Ð¼Ñƒ " ++"клієнта) або hostapd (Ð´Ð»Ñ Ð¢Ð¾Ñ‡ÐºÐ¸ доÑтупу та режиму ad-hoc)." ++ ++msgid "" ++"Wait for NTP sync that many seconds, seting to 0 disables waiting (optional)" ++msgstr "" ++ ++msgid "Waiting for changes to be applied..." ++msgstr "Очікуємо, доки зміни наберуть чинноÑÑ‚Ñ–..." ++ ++msgid "Waiting for command to complete..." ++msgstr "Очікуємо Ð·Ð°Ð²ÐµÑ€ÑˆÐµÐ½Ð½Ñ Ð²Ð¸ÐºÐ¾Ð½Ð°Ð½Ð½Ñ ÐºÐ¾Ð¼Ð°Ð½Ð´Ð¸..." ++ ++msgid "Warning" ++msgstr "ЗаÑтереженнÑ" ++ ++msgid "Warning: There are unsaved changes that will be lost while rebooting!" ++msgstr "Увага: Є незбережені зміни, Ñкі будуть втрачені при перезавантаженні!" ++ ++msgid "Whether to create an IPv6 default route over the tunnel" ++msgstr "" ++ ++msgid "Whether to route only packets from delegated prefixes" ++msgstr "" ++ ++msgid "Width" ++msgstr "" ++ ++msgid "Wifi" ++msgstr "Wi-Fi" ++ ++msgid "Wireless" ++msgstr "Бездротові мережі" ++ ++msgid "Wireless Adapter" ++msgstr "Бездротовий адаптер" ++ ++msgid "Wireless Network" ++msgstr "Бездротова мережа" ++ ++msgid "Wireless Overview" ++msgstr "ОглÑд бездротових мереж" ++ ++msgid "Wireless Security" ++msgstr "Безпека бездротової мережі" ++ ++msgid "Wireless is disabled or not associated" ++msgstr "Бездротову мережу вимкнено або не пов'Ñзано" ++ ++msgid "Wireless is restarting..." ++msgstr "Бездротова мережа перезапуÑкаєтьÑÑ..." ++ ++msgid "Wireless network is disabled" ++msgstr "Бездротова мережа вимкнена" ++ ++msgid "Wireless network is enabled" ++msgstr "Бездротова мережа ввімкнена" ++ ++msgid "Wireless restarted" ++msgstr "Бездротова мережа перезапущена" ++ ++msgid "Wireless shut down" ++msgstr "Бездротова мережа припинила роботу" ++ ++msgid "Write received DNS requests to syslog" ++msgstr "ЗапиÑувати отримані DNS-запити до ÑиÑтемного журналу" ++ ++msgid "XR Support" ++msgstr "Підтримка XR" ++ ++msgid "" ++"You can enable or disable installed init scripts here. Changes will applied " ++"after a device reboot.
    Warning: If you disable essential init " ++"scripts like \"network\", your device might become inaccessible!" ++msgstr "" ++"Тут ви можете увімкнути або вимкнути інÑтальовані Ñкрипти ініціалізації. " ++"Зміни набудуть чинноÑÑ‚Ñ– піÑÐ»Ñ Ð¿ÐµÑ€ÐµÐ·Ð°Ð²Ð°Ð½Ñ‚Ð°Ð¶ÐµÐ½Ð½Ñ Ð¿Ñ€Ð¸Ñтрою.
    Увага: " ++"Якщо ви вимкнете оÑновний Ñкрипт ініціалізації (наприклад \"network\"), " ++"приÑтрій може Ñтати недоÑтупним!" ++ ++msgid "" ++"You must enable Java Script in your browser or LuCI will not work properly." ++msgstr "" ++"Ви повинні увімкнути Java Script у вашому браузері, або LuCI не буде " ++"працювати належним чином." ++ ++msgid "" ++"Your Internet Explorer is too old to display this page correctly. Please " ++"upgrade it to at least version 7 or use another browser like Firefox, Opera " ++"or Safari." ++msgstr "" ++ ++msgid "any" ++msgstr "будь-Ñкий" ++ ++msgid "auto" ++msgstr "авто" ++ ++msgid "automatic" ++msgstr "" ++ ++msgid "baseT" ++msgstr "baseT" ++ ++msgid "bridged" ++msgstr "зв'Ñзано" ++ ++msgid "create:" ++msgstr "Ñтворити:" ++ ++msgid "creates a bridge over specified interface(s)" ++msgstr "Створити міÑÑ‚ через вказаний інтерфейÑ(и)" ++ ++msgid "dB" ++msgstr "дБ" ++ ++msgid "dBm" ++msgstr "дБм" ++ ++msgid "disable" ++msgstr "вимкнено" ++ ++msgid "disabled" ++msgstr "" ++ ++msgid "expired" ++msgstr "минув" ++ ++msgid "" ++"file where given DHCP-leases will be stored" ++msgstr "" ++"Файл, де зберігаютьÑÑ Ð²Ð¸Ð´Ð°Ð½Ñ– DHCP-оренди" ++ ++msgid "forward" ++msgstr "переÑлати" ++ ++msgid "full-duplex" ++msgstr "повний дуплекÑ" ++ ++msgid "half-duplex" ++msgstr "напівдуплекÑ" ++ ++msgid "help" ++msgstr "довідка" ++ ++msgid "hidden" ++msgstr "прихований" ++ ++msgid "hybrid mode" ++msgstr "" ++ ++msgid "if target is a network" ++msgstr "Ñкщо мета — мережа" ++ ++msgid "input" ++msgstr "вхід" ++ ++msgid "kB" ++msgstr "КБ" ++ ++msgid "kB/s" ++msgstr "КБ/Ñ" ++ ++msgid "kbit/s" ++msgstr "Кбіт/Ñ" ++ ++msgid "local DNS file" ++msgstr "" ++"Локальний DNS-файл" ++ ++msgid "minimum 1280, maximum 1480" ++msgstr "" ++ ++msgid "navigation Navigation" ++msgstr "" ++ ++msgid "no" ++msgstr "ні" ++ ++msgid "no link" ++msgstr "нема з'єднаннÑ" ++ ++msgid "none" ++msgstr "нема нічого" ++ ++msgid "not present" ++msgstr "" ++ ++msgid "off" ++msgstr "вимкнено" ++ ++msgid "on" ++msgstr "увімкнено" ++ ++msgid "open" ++msgstr "відкрита" ++ ++msgid "overlay" ++msgstr "" ++ ++msgid "relay mode" ++msgstr "" ++ ++msgid "routed" ++msgstr "ÑпрÑмовано" ++ ++msgid "server mode" ++msgstr "" ++ ++msgid "skiplink1 Skip to navigation" ++msgstr "" ++ ++msgid "skiplink2 Skip to content" ++msgstr "" ++ ++msgid "stateful-only" ++msgstr "" ++ ++msgid "stateless" ++msgstr "" ++ ++msgid "stateless + stateful" ++msgstr "" ++ ++msgid "tagged" ++msgstr "з позначкою" ++ ++msgid "unknown" ++msgstr "невідомий" ++ ++msgid "unlimited" ++msgstr "необмежений" ++ ++msgid "unspecified" ++msgstr "не визначено" ++ ++msgid "unspecified -or- create:" ++msgstr "не визначено -або- Ñтворити" ++ ++msgid "untagged" ++msgstr "без позначки" ++ ++msgid "yes" ++msgstr "так" ++ ++msgid "« Back" ++msgstr "« Ðазад" ++ ++#~ msgid "" ++#~ "Always use 40MHz channels even if the secondary channel overlaps. Using " ++#~ "this option does not comply with IEEE 802.11n-2009!" ++#~ msgstr "" ++#~ "Завжди викориÑтовувати канали 40MHz, навіть Ñкщо вторинний канал " ++#~ "перекриваєтьÑÑ. ВикориÑÑ‚Ð°Ð½Ð½Ñ Ñ†Ñ–Ñ”Ñ— опції не відповідає Ñтандарту IEEE " ++#~ "802.11n-2009!" ++ ++#~ msgid "Cached" ++#~ msgstr "Кешовано" ++ ++#~ msgid "Configures this mount as overlay storage for block-extroot" ++#~ msgstr "ÐаÑтроїти це монтуваннÑ, Ñк оверлейне Ñховище Ð´Ð»Ñ block-extroot" ++ ++#~ msgid "Force 40MHz mode" ++#~ msgstr "ПримуÑово режим 40MHz" ++ ++#~ msgid "Frequency Hopping" ++#~ msgstr "Frequency Hopping" ++ ++#~ msgid "Locked to channel %d used by %s" ++#~ msgstr "Замкнено на канал %d, викориÑтовуваний %s" ++ ++#~ msgid "Use as root filesystem" ++#~ msgstr "ВикориÑтовувати Ñк кореневу файлову ÑиÑтему" ++ ++#~ msgid "HE.net user ID" ++#~ msgstr "Ідентифікатор кориÑтувача HE.net" ++ ++#~ msgid "This is the 32 byte hex encoded user ID, not the login name" ++#~ msgstr "" ++#~ "Це 32-байтний шіÑтнадцÑтковий закодований ідентифікатор кориÑтувача, не " ++#~ "ім'Ñ Ð´Ð»Ñ Ð²Ñ…Ð¾Ð´Ñƒ" ++ ++#~ msgid "40MHz 2nd channel above" ++#~ msgstr "40MHz (2-й канал вище)" ++ ++#~ msgid "40MHz 2nd channel below" ++#~ msgstr "40MHz (2-й канал нижче)" ++ ++#~ msgid "Accept router advertisements" ++#~ msgstr "Отримувати Ð¾Ð³Ð¾Ð»Ð¾ÑˆÐµÐ½Ð½Ñ Ð¼Ð°Ñ€ÑˆÑ€ÑƒÑ‚Ð¸Ð·Ð°Ñ‚Ð¾Ñ€Ð°" ++ ++#~ msgid "Advertise IPv6 on network" ++#~ msgstr "Оголошувати IPv6 у мережі" ++ ++#~ msgid "Advertised network ID" ++#~ msgstr "Оголошуваний ідентифікатор мережі" ++ ++#~ msgid "Allowed range is 1 to 65535" ++#~ msgstr "ДопуÑтимий діапазон — від 1 до 65535" ++ ++#~ msgid "HT capabilities" ++#~ msgstr "HT-можливоÑÑ‚Ñ–" ++ ++#~ msgid "HT mode" ++#~ msgstr "HT-режим" ++ ++#~ msgid "Router Model" ++#~ msgstr "Модель маршрутизатора" ++ ++#~ msgid "Router Name" ++#~ msgstr "Ðазва (ім'Ñ) маршрутизатора" ++ ++#~ msgid "Send router solicitations" ++#~ msgstr "ÐадÑилати ÐºÐ»Ð¾Ð¿Ð¾Ñ‚Ð°Ð½Ð½Ñ Ð¼Ð°Ñ€ÑˆÑ€ÑƒÑ‚Ð¸Ð·Ð°Ñ‚Ð¾Ñ€Ð°" ++ ++#~ msgid "Specifies the advertised preferred prefix lifetime in seconds" ++#~ msgstr "Визначає Ñ‡Ð°Ñ Ð¶Ð¸Ñ‚Ñ‚Ñ Ð¾Ð³Ð¾Ð»Ð¾ÑˆÐµÐ½Ð¾Ð³Ð¾ рекомендованого префікÑу в Ñекундах" ++ ++#~ msgid "Specifies the advertised valid prefix lifetime in seconds" ++#~ msgstr "Визначає Ñ‡Ð°Ñ Ð¶Ð¸Ñ‚Ñ‚Ñ Ð¾Ð³Ð¾Ð»Ð¾ÑˆÐµÐ½Ð¾Ð³Ð¾ чинного префікÑу в Ñекундах" ++ ++#~ msgid "Use preferred lifetime" ++#~ msgstr "ВикориÑтовувати Ñ‡Ð°Ñ Ð¶Ð¸Ñ‚Ñ‚Ñ Ñ€ÐµÐºÐ¾Ð¼ÐµÐ½Ð´Ð¾Ð²Ð°Ð½Ð¾Ð³Ð¾" ++ ++#~ msgid "Use valid lifetime" ++#~ msgstr "ВикориÑтовувати Ñ‡Ð°Ñ Ð¶Ð¸Ñ‚Ñ‚Ñ Ñ‡Ð¸Ð½Ð½Ð¾Ð³Ð¾" ++ ++#~ msgid "Waiting for router..." ++#~ msgstr "ÐžÑ‡Ñ–ÐºÑƒÐ²Ð°Ð½Ð½Ñ Ð¼Ð°Ñ€ÑˆÑ€ÑƒÑ‚Ð¸Ð·Ð°Ñ‚Ð¾Ñ€Ð°..." ++ ++#~ msgid "Enable builtin NTP server" ++#~ msgstr "Увімкнути вбудований NTP-Ñервер" ++ ++#~ msgid "Active Leases" ++#~ msgstr "Ðктивні оренди" ++ ++#~ msgid "Open" ++#~ msgstr "Відкрити" ++ ++#~ msgid "Bit Rate" ++#~ msgstr "ШвидкіÑÑ‚ÑŒ передачі даних" ++ ++#~ msgid "Configuration / Apply" ++#~ msgstr "ÐšÐ¾Ð½Ñ„Ñ–Ð³ÑƒÑ€Ð°Ñ†Ñ–Ñ / ЗаÑтоÑÑƒÐ²Ð°Ð½Ð½Ñ Ð·Ð¼Ñ–Ð½" ++ ++#~ msgid "Configuration / Changes" ++#~ msgstr "ÐšÐ¾Ð½Ñ„Ñ–Ð³ÑƒÑ€Ð°Ñ†Ñ–Ñ / Зміни" ++ ++#~ msgid "Configuration / Revert" ++#~ msgstr "ÐšÐ¾Ð½Ñ„Ñ–Ð³ÑƒÑ€Ð°Ñ†Ñ–Ñ / СкаÑÑƒÐ²Ð°Ð½Ð½Ñ Ð·Ð¼Ñ–Ð½" ++ ++#~ msgid "MAC" ++#~ msgstr "MAC" ++ ++#~ msgid "MAC Address" ++#~ msgstr "MAC-адреÑа" ++ ++#~ msgid "Encr." ++#~ msgstr "Зашифр." ++ ++#~ msgid "WLAN-Scan" ++#~ msgstr "" ++#~ "WLAN-ÑкануваннÑ" ++ ++#~ msgid "" ++#~ "Choose the network you want to attach to this wireless interface. Select " ++#~ "unspecified to not attach any network or fill out the " ++#~ "create field to define a new network." ++#~ msgstr "" ++#~ "Оберіть мережу, Ñку ви хочете прикріпити до цього бездротового " ++#~ "інтерфейÑу. Виберіть не визначено, щоб не прикріплÑти ніÑкої " ++#~ "мережі, або заповніть поле Ñтворити, щоб визначити нову мережу." ++ ++#~ msgid "Create Network" ++#~ msgstr "Створити мережу" ++ ++#~ msgid "Link" ++#~ msgstr "З'єднаннÑ" ++ ++#~ msgid "Networks" ++#~ msgstr "Мережі" ++ ++#~ msgid "Power" ++#~ msgstr "ПотужніÑÑ‚ÑŒ" ++ ++#~ msgid "Wifi networks in your local environment" ++#~ msgstr "Wi-Fi мережі у вашому оточенні" ++ ++#~ msgid "" ++#~ "CIDR-Notation: " ++#~ "address/prefix" ++#~ msgstr "" ++#~ "CIDR-запиÑ: адреÑа/Ð¿Ñ€ÐµÑ„Ñ–ÐºÑ " ++ ++#~ msgid "DNS-Server" ++#~ msgstr "" ++#~ "DNS-" ++#~ "Ñервер" ++ ++#~ msgid "IPv4-Broadcast" ++#~ msgstr "IPv4-широкомовний" ++ ++#~ msgid "IPv6-Address" ++#~ msgstr "IPv6-адреÑа" ++ ++#~ msgid "IP-Aliases" ++#~ msgstr "IP-пÑевдоніми" ++ ++#~ msgid "IPv6 Setup" ++#~ msgstr "ÐаÑтройки IPv6" ++ ++#~ msgid "" ++#~ "Note: If you choose an interface here which is part of another network, " ++#~ "it will be moved into this network." ++#~ msgstr "" ++#~ "Примітка: Якщо ви тут оберете інтерфейÑ, Ñкий Ñ” чаÑтиною іншої мережі, " ++#~ "він буде переміщений до цієї мережі." ++ ++#~ msgid "" ++#~ "Really delete this interface? The deletion cannot be undone!\\nYou might " ++#~ "lose access to this router if you are connected via this interface." ++#~ msgstr "" ++#~ "ДійÑно видалити цей інтерфейÑ? СкаÑувати Ð²Ð¸Ð´Ð°Ð»ÐµÐ½Ð½Ñ Ð½ÐµÐ¼Ð¾Ð¶Ð»Ð¸Ð²Ð¾!\\nВи можете " ++#~ "втратити доÑтуп до цього маршрутизатора, Ñкщо ваш комп'ютер підключений " ++#~ "через цей інтерфейÑ." ++ ++#~ msgid "" ++#~ "Really delete this wireless network? The deletion cannot be undone!\\nYou " ++#~ "might lose access to this router if you are connected via this network." ++#~ msgstr "" ++#~ "ДійÑно видалити цю бездротову мережу? СкаÑувати Ð²Ð¸Ð´Ð°Ð»ÐµÐ½Ð½Ñ Ð½ÐµÐ¼Ð¾Ð¶Ð»Ð¸Ð²Ð¾!\\nВи " ++#~ "можете втратити доÑтуп до цього маршрутизатора, Ñкщо ваш комп'ютер " ++#~ "підключений через цю мережу." ++ ++#~ msgid "" ++#~ "Really shutdown interface \"%s\" ?\\nYou might lose access to this router " ++#~ "if you are connected via this interface." ++#~ msgstr "" ++#~ "ДійÑно вимкнути Ñ–Ð½Ñ‚ÐµÑ€Ñ„ÐµÐ¹Ñ \"%s\"?\\nВи можете втратити доÑтуп до цього " ++#~ "маршрутизатора, Ñкщо ваш комп'ютер підключений через цей інтерфейÑ." ++ ++#~ msgid "" ++#~ "Really shutdown network ?\\nYou might lose access to this router if you " ++#~ "are connected via this interface." ++#~ msgstr "" ++#~ "ДійÑно вимкнути мережу?\\nВи можете втратити доÑтуп до цього " ++#~ "маршрутизатора, Ñкщо ваш комп'ютер підключений через цей інтерфейÑ." ++ ++#~ msgid "" ++#~ "The network ports on your router can be combined to several VLANs in which computers can " ++#~ "communicate directly with each other. VLANs are often used to separate different network " ++#~ "segments. Often there is by default one Uplink port for a connection to " ++#~ "the next greater network like the internet and other ports for a local " ++#~ "network." ++#~ msgstr "" ++#~ "Мережеві порти вашого маршрутизатора можуть бути об'єднані у декілька " ++#~ "VLAN, у Ñких комп'ютери можуть напрÑму " ++#~ "ÑпілкуватиÑÑ Ð¾Ð´Ð¸Ð½ з одним. VLAN чаÑто " ++#~ "викориÑтовуютьÑÑ Ð´Ð»Ñ Ñ€Ð¾Ð·Ð´Ñ–Ð»ÐµÐ½Ð½Ñ Ð¼ÐµÑ€ÐµÐ¶Ñ– на окремі Ñегменти. Зазвичай один " ++#~ "вихідний порт викориÑтовуєтьÑÑ Ð´Ð»Ñ Ð·'Ñ”Ð´Ð½Ð°Ð½Ð½Ñ Ð· більшою мережею, такою " ++#~ "наприклад, Ñк Інтернет, а інші порти — Ð´Ð»Ñ Ð»Ð¾ÐºÐ°Ð»ÑŒÐ½Ð¾Ñ— мережі." ++ ++#~ msgid "Enable buffering" ++#~ msgstr "Увімкнути буферизацію" ++ ++#~ msgid "IPv6-over-IPv4" ++#~ msgstr "IPv6 через IPv4" +diff --git a/feeds/luci/modules/luci-base/po/vi/base.po b/feeds/luci/modules/luci-base/po/vi/base.po +new file mode 100644 +index 0000000..d81be16 +--- /dev/null ++++ b/feeds/luci/modules/luci-base/po/vi/base.po +@@ -0,0 +1,3876 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Report-Msgid-Bugs-To: \n" ++"POT-Creation-Date: 2009-08-16 06:59+0200\n" ++"PO-Revision-Date: 2009-08-14 12:23+0200\n" ++"Last-Translator: Hong Phuc Dang \n" ++"Language-Team: LANGUAGE \n" ++"Language: \n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"X-Generator: Pootle 1.1.0\n" ++ ++msgid "(%d minute window, %d second interval)" ++msgstr "" ++ ++#, fuzzy ++msgid "(%s available)" ++msgstr "(%s available)" ++ ++msgid "(empty)" ++msgstr "" ++ ++msgid "(no interfaces attached)" ++msgstr "" ++ ++msgid "-- Additional Field --" ++msgstr "---Mục bổ sung---" ++ ++msgid "-- Please choose --" ++msgstr "--Hãy chá»n--" ++ ++msgid "-- custom --" ++msgstr "--tùy chỉnh--" ++ ++msgid "-- match by device --" ++msgstr "" ++ ++msgid "-- match by label --" ++msgstr "" ++ ++msgid "1 Minute Load:" ++msgstr "" ++ ++msgid "15 Minute Load:" ++msgstr "" ++ ++msgid "5 Minute Load:" ++msgstr "" ++ ++msgid "BSSID" ++msgstr "BSSID" ++ ++msgid "DNS query port" ++msgstr "" ++ ++msgid "DNS server port" ++msgstr "" ++ ++msgid "" ++"DNS servers will be queried in the " ++"order of the resolvfile" ++msgstr "" ++ ++msgid "ESSID" ++msgstr "ESSID" ++ ++msgid "IPv4-Address" ++msgstr "IPv4-Address" ++ ++msgid "IPv4-Gateway" ++msgstr "IPv4-Gateway" ++ ++msgid "IPv4-Netmask" ++msgstr "IPv4-Netmask" ++ ++msgid "" ++"IPv6-Address or Network " ++"(CIDR)" ++msgstr "" ++"IPv6-Address or Network " ++"(CIDR)" ++ ++msgid "IPv6-Gateway" ++msgstr "IPv6-Gateway" ++ ++msgid "IPv6-Suffix (hex)" ++msgstr "" ++ ++msgid "LED Configuration" ++msgstr "LED Configuration" ++ ++msgid "LED Name" ++msgstr "" ++ ++msgid "MAC-Address" ++msgstr "MAC-Address" ++ ++msgid "" ++"Max. DHCP leases" ++msgstr "" ++ ++msgid "" ++"Max. EDNS0 packet size" ++msgstr "" ++ ++msgid "Max. concurrent queries" ++msgstr "" ++ ++msgid "%s - %s" ++msgstr "" ++ ++msgid "ADSL" ++msgstr "" ++ ++msgid "ADSL Status" ++msgstr "" ++ ++msgid "AICCU (SIXXS)" ++msgstr "" ++ ++msgid "APN" ++msgstr "" ++ ++msgid "AR Support" ++msgstr "Há»— trợ AR" ++ ++msgid "ARP retry threshold" ++msgstr "" ++ ++msgid "ATM Bridges" ++msgstr "" ++ ++msgid "ATM Virtual Channel Identifier (VCI)" ++msgstr "" ++ ++msgid "ATM Virtual Path Identifier (VPI)" ++msgstr "" ++ ++msgid "" ++"ATM bridges expose encapsulated ethernet in AAL5 connections as virtual " ++"Linux network interfaces which can be used in conjunction with DHCP or PPP " ++"to dial into the provider network." ++msgstr "" ++ ++msgid "ATM device number" ++msgstr "" ++ ++msgid "AYIYA" ++msgstr "" ++ ++msgid "Access Concentrator" ++msgstr "" ++ ++msgid "Access Point" ++msgstr "Äiểm truy cập" ++ ++msgid "Action" ++msgstr "Action" ++ ++msgid "Actions" ++msgstr "Hành Ä‘á»™ng" ++ ++msgid "Activate this network" ++msgstr "" ++ ++msgid "Active IPv4-Routes" ++msgstr "Active IPv4-Routes" ++ ++msgid "Active IPv6-Routes" ++msgstr "Active IPv6-Routes" ++ ++msgid "Active Connections" ++msgstr "kết nối Ä‘ang hoạt Ä‘á»™ng" ++ ++msgid "Active DHCP Leases" ++msgstr "" ++ ++msgid "Active DHCPv6 Leases" ++msgstr "" ++ ++msgid "Ad-Hoc" ++msgstr "Ad-Hoc" ++ ++msgid "Add" ++msgstr "Thêm vào" ++ ++msgid "Add local domain suffix to names served from hosts files" ++msgstr "" ++ ++msgid "Add new interface..." ++msgstr "" ++ ++msgid "Additional Hosts files" ++msgstr "" ++ ++msgid "Address" ++msgstr "" ++ ++msgid "Address to access local relay bridge" ++msgstr "" ++ ++msgid "Administration" ++msgstr "Quản trị" ++ ++msgid "Advanced Settings" ++msgstr "" ++ ++msgid "Alert" ++msgstr "" ++ ++msgid "Allow SSH password authentication" ++msgstr "Cho phép SSH xác thá»±c mật mã" ++ ++msgid "Allow all except listed" ++msgstr "Cho phép tất cả trừ danh sách liệt kê" ++ ++msgid "Allow listed only" ++msgstr "Chỉ cho phép danh sách liệt kê" ++ ++msgid "Allow localhost" ++msgstr "" ++ ++msgid "Allow remote hosts to connect to local SSH forwarded ports" ++msgstr "" ++ ++msgid "Allow root logins with password" ++msgstr "" ++ ++msgid "Allow the root user to login with password" ++msgstr "" ++ ++msgid "" ++"Allow upstream responses in the 127.0.0.0/8 range, e.g. for RBL services" ++msgstr "" ++ ++msgid "" ++"Also see Tunneling Comparison on SIXXS" ++msgstr "" ++ ++msgid "Always announce default router" ++msgstr "" ++ ++msgid "An additional network will be created if you leave this unchecked." ++msgstr "" ++ ++msgid "Announce as default router even if no public prefix is available." ++msgstr "" ++ ++msgid "Announced DNS domains" ++msgstr "" ++ ++msgid "Announced DNS servers" ++msgstr "" ++ ++msgid "Antenna 1" ++msgstr "" ++ ++msgid "Antenna 2" ++msgstr "" ++ ++msgid "Antenna Configuration" ++msgstr "" ++ ++msgid "Any zone" ++msgstr "" ++ ++msgid "Apply" ++msgstr "Ãp dụng" ++ ++msgid "Applying changes" ++msgstr "Tiến hành thay đổi" ++ ++msgid "" ++"Assign a part of given length of every public IPv6-prefix to this interface" ++msgstr "" ++ ++msgid "Assign interfaces..." ++msgstr "" ++ ++msgid "" ++"Assign prefix parts using this hexadecimal subprefix ID for this interface." ++msgstr "" ++ ++msgid "Associated Stations" ++msgstr "" ++ ++msgid "Atheros 802.11%s Wireless Controller" ++msgstr "" ++ ++msgid "AuthGroup" ++msgstr "" ++ ++msgid "Authentication" ++msgstr "Xác thá»±c" ++ ++msgid "Authoritative" ++msgstr "Authoritative" ++ ++msgid "Authorization Required" ++msgstr "Yêu cầu ủy quyá»n" ++ ++msgid "Auto Refresh" ++msgstr "" ++ ++msgid "Automatic" ++msgstr "" ++ ++msgid "Automatic Homenet (HNCP)" ++msgstr "" ++ ++msgid "Available" ++msgstr "Sẵn có" ++ ++msgid "Available packages" ++msgstr "" ++ ++msgid "Average:" ++msgstr "" ++ ++msgid "BSSID" ++msgstr "" ++ ++msgid "Back" ++msgstr "" ++ ++msgid "Back to Overview" ++msgstr "" ++ ++msgid "Back to configuration" ++msgstr "" ++ ++msgid "Back to overview" ++msgstr "" ++ ++msgid "Back to scan results" ++msgstr "" ++ ++msgid "Background Scan" ++msgstr "Background Scan" ++ ++msgid "Backup / Flash Firmware" ++msgstr "" ++ ++msgid "Backup / Restore" ++msgstr "Backup/ Restore" ++ ++msgid "Backup file list" ++msgstr "" ++ ++msgid "Bad address specified!" ++msgstr "" ++ ++msgid "Band" ++msgstr "" ++ ++msgid "Behind NAT" ++msgstr "" ++ ++msgid "" ++"Below is the determined list of files to backup. It consists of changed " ++"configuration files marked by opkg, essential base files and the user " ++"defined backup patterns." ++msgstr "" ++ ++msgid "Bitrate" ++msgstr "" ++ ++msgid "Bogus NX Domain Override" ++msgstr "" ++ ++msgid "Bridge" ++msgstr "" ++ ++msgid "Bridge interfaces" ++msgstr "Giao diện cầu nối" ++ ++msgid "Bridge unit number" ++msgstr "" ++ ++msgid "Bring up on boot" ++msgstr "" ++ ++msgid "Broadcom 802.11%s Wireless Controller" ++msgstr "" ++ ++msgid "Broadcom BCM%04x 802.11 Wireless Controller" ++msgstr "" ++ ++msgid "Buffered" ++msgstr "" ++ ++msgid "Buttons" ++msgstr "" ++ ++msgid "CA certificate; if empty it will be saved after the first connection." ++msgstr "" ++ ++msgid "CPU" ++msgstr "" ++ ++msgid "CPU usage (%)" ++msgstr "CPU usage (%)" ++ ++msgid "Cancel" ++msgstr "Bá» qua" ++ ++msgid "Category" ++msgstr "" ++ ++msgid "Chain" ++msgstr "chuá»—i" ++ ++msgid "Changes" ++msgstr "Thay đổi" ++ ++msgid "Changes applied." ++msgstr "Thay đổi đã áp dụng" ++ ++msgid "Changes the administrator password for accessing the device" ++msgstr "" ++ ++msgid "Channel" ++msgstr "Kênh" ++ ++msgid "Check" ++msgstr "" ++ ++msgid "Checksum" ++msgstr "Checksum" ++ ++msgid "" ++"Choose the firewall zone you want to assign to this interface. Select " ++"unspecified to remove the interface from the associated zone or " ++"fill out the create field to define a new zone and attach the " ++"interface to it." ++msgstr "Giao diện này chÆ°a thuá»™c vá» bất kỳ firewall zone nào." ++ ++msgid "" ++"Choose the network(s) you want to attach to this wireless interface or fill " ++"out the create field to define a new network." ++msgstr "" ++ ++msgid "Cipher" ++msgstr "" ++ ++msgid "" ++"Click \"Generate archive\" to download a tar archive of the current " ++"configuration files. To reset the firmware to its initial state, click " ++"\"Perform reset\" (only possible with squashfs images)." ++msgstr "" ++ ++msgid "Client" ++msgstr "Client" ++ ++msgid "Client ID to send when requesting DHCP" ++msgstr "" ++ ++msgid "" ++"Close inactive connection after the given amount of seconds, use 0 to " ++"persist connection" ++msgstr "" ++ ++msgid "Close list..." ++msgstr "" ++ ++msgid "Collecting data..." ++msgstr "" ++ ++msgid "Command" ++msgstr "Lệnh" ++ ++msgid "Common Configuration" ++msgstr "" ++ ++msgid "Compression" ++msgstr "Sức nén" ++ ++msgid "Configuration" ++msgstr "Cấu hình" ++ ++msgid "Configuration applied." ++msgstr "" ++ ++msgid "Configuration files will be kept." ++msgstr "" ++ ++msgid "Confirmation" ++msgstr "Xác nhận" ++ ++msgid "Connect" ++msgstr "" ++ ++msgid "Connected" ++msgstr "" ++ ++msgid "Connection Limit" ++msgstr "Giá»›i hạn kết nối" ++ ++msgid "Connection to server fails when TLS cannot be used" ++msgstr "" ++ ++msgid "Connections" ++msgstr "" ++ ++msgid "Country" ++msgstr "" ++ ++msgid "Country Code" ++msgstr "Mã quốc gia" ++ ++msgid "Cover the following interface" ++msgstr "" ++ ++msgid "Cover the following interfaces" ++msgstr "" ++ ++msgid "Create / Assign firewall-zone" ++msgstr "Tạo/ gán firewall-zone" ++ ++msgid "Create Interface" ++msgstr "" ++ ++msgid "Create a bridge over multiple interfaces" ++msgstr "" ++ ++msgid "Critical" ++msgstr "" ++ ++msgid "Cron Log Level" ++msgstr "" ++ ++msgid "Custom Interface" ++msgstr "" ++ ++msgid "Custom delegated IPv6-prefix" ++msgstr "" ++ ++msgid "" ++"Customizes the behaviour of the device LEDs if possible." ++msgstr "" ++"Tùy chỉnh chế Ä‘á»™ của thiết bị LEDs nếu có thể." ++ ++msgid "DHCP Leases" ++msgstr "" ++ ++msgid "DHCP Server" ++msgstr "" ++ ++msgid "DHCP and DNS" ++msgstr "" ++ ++msgid "DHCP client" ++msgstr "" ++ ++msgid "DHCP-Options" ++msgstr "Tùy chá»n DHCP" ++ ++msgid "DHCPv6 Leases" ++msgstr "" ++ ++msgid "DHCPv6 client" ++msgstr "" ++ ++msgid "DHCPv6-Mode" ++msgstr "" ++ ++msgid "DHCPv6-Service" ++msgstr "" ++ ++msgid "DNS" ++msgstr "" ++ ++msgid "DNS forwardings" ++msgstr "" ++ ++msgid "DNS-Label / FQDN" ++msgstr "" ++ ++msgid "DS-Lite AFTR address" ++msgstr "" ++ ++msgid "DUID" ++msgstr "" ++ ++msgid "Debug" ++msgstr "" ++ ++msgid "Default %d" ++msgstr "" ++ ++msgid "Default gateway" ++msgstr "" ++ ++msgid "Default route" ++msgstr "" ++ ++msgid "Default state" ++msgstr "" ++ ++msgid "Define a name for this network." ++msgstr "" ++ ++msgid "" ++"Define additional DHCP options, for example " ++"\"6,192.168.2.1,192.168.2.2\" which advertises different DNS " ++"servers to clients." ++msgstr "" ++ ++msgid "Delete" ++msgstr "Xóa" ++ ++msgid "Delete this interface" ++msgstr "" ++ ++msgid "Delete this network" ++msgstr "" ++ ++msgid "Description" ++msgstr "Mô tả" ++ ++msgid "Design" ++msgstr "Thiết kế" ++ ++msgid "Destination" ++msgstr "Äiểm đến" ++ ++msgid "Device" ++msgstr "Công cụ" ++ ++msgid "Device Configuration" ++msgstr "" ++ ++msgid "Diagnostics" ++msgstr "" ++ ++msgid "Dial number" ++msgstr "" ++ ++msgid "Directory" ++msgstr "" ++ ++msgid "Disable" ++msgstr "" ++ ++msgid "" ++"Disable DHCP for " ++"this interface." ++msgstr "" ++ ++msgid "Disable DNS setup" ++msgstr "" ++ ++msgid "Disable HW-Beacon timer" ++msgstr "Vô hiệu hóa bá»™ chỉnh giá» HW-Beacon" ++ ++msgid "Disabled" ++msgstr "" ++ ++msgid "Discard upstream RFC1918 responses" ++msgstr "" ++ ++msgid "Displaying only packages containing" ++msgstr "" ++ ++msgid "Distance Optimization" ++msgstr "Khoảng cách tối Æ°u" ++ ++msgid "Distance to farthest network member in meters." ++msgstr "Khoảng cách tá»›i thành viên xa nhất trong mạng lÆ°á»›i tính bằng mét" ++ ++msgid "Diversity" ++msgstr "Tính Ä‘a dạng" ++ ++msgid "" ++"Dnsmasq is a combined DHCP-Server and DNS-" ++"Forwarder for NAT " ++"firewalls" ++msgstr "" ++"Dnsmasq là má»™t phối hợp DHCP-Server and DNS-" ++"Forwarder for NAT " ++"firewalls" ++ ++msgid "Do not cache negative replies, e.g. for not existing domains" ++msgstr "" ++ ++msgid "Do not forward requests that cannot be answered by public name servers" ++msgstr "" ++ ++msgid "Do not forward reverse lookups for local networks" ++msgstr "" ++ ++msgid "Do not send probe responses" ++msgstr "Không gá»­i nhắc hồi đáp" ++ ++msgid "Domain required" ++msgstr "Domain yêu cầu" ++ ++msgid "Domain whitelist" ++msgstr "" ++ ++msgid "" ++"Don't forward DNS-Requests without " ++"DNS-Name" ++msgstr "" ++"Don&#39;t chuyển tiếp DNS-Yêu " ++"cầu không cần DNS-Tên" ++ ++msgid "Download and install package" ++msgstr "Tải và cài đặt gói" ++ ++msgid "Download backup" ++msgstr "" ++ ++msgid "Dropbear Instance" ++msgstr "" ++ ++msgid "" ++"Dropbear offers SSH network shell access " ++"and an integrated SCP server" ++msgstr "" ++"Dropbear cung cấp SSH mạng lÆ°á»›i shell " ++"truy cập và má»™t SCP server tích hợp" ++ ++msgid "Dual-Stack Lite (RFC6333)" ++msgstr "" ++ ++msgid "Dynamic DHCP" ++msgstr "" ++"Dynamic DHCP" ++ ++msgid "Dynamic tunnel" ++msgstr "" ++ ++msgid "" ++"Dynamically allocate DHCP addresses for clients. If disabled, only clients " ++"having static leases will be served." ++msgstr "" ++ ++msgid "EAP-Method" ++msgstr "EAP-Method" ++ ++msgid "Edit" ++msgstr "Chỉnh sá»­a" ++ ++msgid "" ++"Edit the raw configuration data above to fix any error and hit \"Save\" to " ++"reload the page." ++msgstr "" ++ ++msgid "Edit this interface" ++msgstr "" ++ ++msgid "Edit this network" ++msgstr "" ++ ++msgid "Emergency" ++msgstr "" ++ ++msgid "Enable" ++msgstr "" ++ ++msgid "Enable STP" ++msgstr "Kích hoạt STP" ++ ++msgid "Enable HE.net dynamic endpoint update" ++msgstr "" ++ ++msgid "Enable IPv6 negotiation on the PPP link" ++msgstr "" ++ ++msgid "Enable Jumbo Frame passthrough" ++msgstr "" ++ ++msgid "Enable NTP client" ++msgstr "" ++ ++msgid "Enable TFTP server" ++msgstr "" ++ ++msgid "Enable VLAN functionality" ++msgstr "" ++ ++msgid "Enable WPS pushbutton, requires WPA(2)-PSK" ++msgstr "" ++ ++msgid "Enable learning and aging" ++msgstr "" ++ ++msgid "Enable mirroring of incoming packets" ++msgstr "" ++ ++msgid "Enable mirroring of outgoing packets" ++msgstr "" ++ ++msgid "Enable this mount" ++msgstr "" ++ ++msgid "Enable this swap" ++msgstr "" ++ ++msgid "Enable/Disable" ++msgstr "Cho kích hoạt/ Vô hiệu hóa" ++ ++msgid "Enabled" ++msgstr "" ++ ++msgid "Enables the Spanning Tree Protocol on this bridge" ++msgstr "Kích hoạt Spanning Tree Protocol trên cầu nối này" ++ ++msgid "Encapsulation mode" ++msgstr "" ++ ++msgid "Encryption" ++msgstr "Encryption" ++ ++msgid "Erasing..." ++msgstr "" ++ ++msgid "Error" ++msgstr "Lá»—i" ++ ++msgid "Ethernet Adapter" ++msgstr "Bá»™ tÆ°Æ¡ng hợp ethernet" ++ ++msgid "Ethernet Switch" ++msgstr "Bá»™ chuyển đảo ethernet" ++ ++msgid "Expand hosts" ++msgstr "" ++ ++msgid "Expires" ++msgstr "" ++ ++msgid "" ++"Expiry time of leased addresses, minimum is 2 minutes (2m)." ++msgstr "" ++ ++msgid "External" ++msgstr "" ++ ++msgid "External system log server" ++msgstr "" ++ ++msgid "External system log server port" ++msgstr "" ++ ++msgid "Fast Frames" ++msgstr "Khung nhanh" ++ ++msgid "File" ++msgstr "" ++ ++msgid "Filename of the boot image advertised to clients" ++msgstr "" ++ ++msgid "Filesystem" ++msgstr "Tập tin hệ thống" ++ ++msgid "Filter" ++msgstr "Lá»c" ++ ++msgid "Filter private" ++msgstr "Filter private" ++ ++msgid "Filter useless" ++msgstr "Lá»c không hữu dụng" ++ ++msgid "Find and join network" ++msgstr "" ++ ++msgid "Find package" ++msgstr "Tìm gói" ++ ++msgid "Finish" ++msgstr "" ++ ++msgid "Firewall" ++msgstr "Firewall" ++ ++msgid "Firewall Settings" ++msgstr "" ++ ++msgid "Firewall Status" ++msgstr "" ++ ++msgid "Firmware Version" ++msgstr "" ++ ++msgid "Fixed source port for outbound DNS queries" ++msgstr "" ++ ++msgid "Flags" ++msgstr "Cá»" ++ ++msgid "Flash Firmware" ++msgstr "Phần cứng flash" ++ ++msgid "Flash image..." ++msgstr "" ++ ++msgid "Flash new firmware image" ++msgstr "" ++ ++msgid "Flash operations" ++msgstr "" ++ ++msgid "Flashing..." ++msgstr "" ++ ++msgid "Force" ++msgstr "Force" ++ ++msgid "Force CCMP (AES)" ++msgstr "" ++ ++msgid "Force DHCP on this network even if another server is detected." ++msgstr "" ++ ++msgid "Force TKIP" ++msgstr "" ++ ++msgid "Force TKIP and CCMP (AES)" ++msgstr "" ++ ++msgid "Forward DHCP traffic" ++msgstr "" ++ ++msgid "Forward broadcast traffic" ++msgstr "" ++ ++msgid "Forwarding mode" ++msgstr "" ++ ++msgid "Fragmentation Threshold" ++msgstr "Ngưỡng cá»­a Phân Ä‘oạn" ++ ++msgid "Frame Bursting" ++msgstr "Khung nổ" ++ ++msgid "Free" ++msgstr "" ++ ++msgid "Free space" ++msgstr "" ++ ++msgid "GHz" ++msgstr "" ++ ++msgid "GPRS only" ++msgstr "" ++ ++msgid "Gateway" ++msgstr "" ++ ++msgid "Gateway ports" ++msgstr "" ++ ++msgid "General Settings" ++msgstr "" ++ ++msgid "General Setup" ++msgstr "" ++ ++msgid "Generate archive" ++msgstr "" ++ ++msgid "Generic 802.11%s Wireless Controller" ++msgstr "" ++ ++msgid "Given password confirmation did not match, password not changed!" ++msgstr "" ++ ++msgid "Global network options" ++msgstr "" ++ ++msgid "Go to password configuration..." ++msgstr "" ++ ++msgid "Go to relevant configuration page" ++msgstr "Äi tá»›i trang cấu hình thích hợp" ++ ++msgid "Guest" ++msgstr "" ++ ++msgid "HE.net password" ++msgstr "" ++ ++msgid "HE.net username" ++msgstr "" ++ ++msgid "Handler" ++msgstr "" ++ ++msgid "Hang Up" ++msgstr "Hang Up" ++ ++msgid "Heartbeat" ++msgstr "" ++ ++msgid "" ++"Here you can configure the basic aspects of your device like its hostname or " ++"the timezone." ++msgstr "" ++"Ở đây bạn có thể cấu hình những đặc tính cÆ¡ bản của thiết bị nhÆ° tên máy chủ " ++"hoặc múi giá»." ++ ++msgid "" ++"Here you can paste public SSH-Keys (one per line) for SSH public-key " ++"authentication." ++msgstr "" ++ ++msgid "Hermes 802.11b Wireless Controller" ++msgstr "" ++ ++msgid "Hide ESSID" ++msgstr "Giấu ESSID" ++ ++msgid "Host entries" ++msgstr "Host entries" ++ ++msgid "Host expiry timeout" ++msgstr "" ++ ++msgid "Host-IP or Network" ++msgstr "Host-IP or Network" ++ ++msgid "Hostname" ++msgstr "Tên host" ++ ++msgid "Hostname to send when requesting DHCP" ++msgstr "" ++ ++msgid "Hostnames" ++msgstr "Tên host" ++ ++msgid "Hybrid" ++msgstr "" ++ ++msgid "IP address" ++msgstr "Äịa chỉ IP" ++ ++msgid "IPv4" ++msgstr "" ++ ++msgid "IPv4 Firewall" ++msgstr "" ++ ++msgid "IPv4 WAN Status" ++msgstr "" ++ ++msgid "IPv4 address" ++msgstr "" ++ ++msgid "IPv4 and IPv6" ++msgstr "" ++ ++msgid "IPv4 assignment length" ++msgstr "" ++ ++msgid "IPv4 broadcast" ++msgstr "" ++ ++msgid "IPv4 gateway" ++msgstr "" ++ ++msgid "IPv4 netmask" ++msgstr "" ++ ++msgid "IPv4 only" ++msgstr "" ++ ++msgid "IPv4 prefix length" ++msgstr "" ++ ++msgid "IPv4-Address" ++msgstr "" ++ ++msgid "IPv6" ++msgstr "IPv6" ++ ++msgid "IPv6 Firewall" ++msgstr "" ++ ++msgid "IPv6 Neighbours" ++msgstr "" ++ ++msgid "IPv6 Settings" ++msgstr "" ++ ++msgid "IPv6 ULA-Prefix" ++msgstr "" ++ ++msgid "IPv6 WAN Status" ++msgstr "" ++ ++msgid "IPv6 address" ++msgstr "" ++ ++msgid "IPv6 address delegated to the local tunnel endpoint (optional)" ++msgstr "" ++ ++msgid "IPv6 assignment hint" ++msgstr "" ++ ++msgid "IPv6 assignment length" ++msgstr "" ++ ++msgid "IPv6 gateway" ++msgstr "" ++ ++msgid "IPv6 only" ++msgstr "" ++ ++msgid "IPv6 prefix" ++msgstr "" ++ ++msgid "IPv6 prefix length" ++msgstr "" ++ ++msgid "IPv6 routed prefix" ++msgstr "" ++ ++msgid "IPv6-Address" ++msgstr "" ++ ++msgid "IPv6-in-IPv4 (RFC4213)" ++msgstr "" ++ ++msgid "IPv6-over-IPv4 (6rd)" ++msgstr "" ++ ++msgid "IPv6-over-IPv4 (6to4)" ++msgstr "" ++ ++msgid "Identity" ++msgstr "Nhận dạng" ++ ++msgid "" ++"If specified, mount the device by its UUID instead of a fixed device node" ++msgstr "" ++ ++msgid "" ++"If specified, mount the device by the partition label instead of a fixed " ++"device node" ++msgstr "" ++ ++msgid "If unchecked, no default route is configured" ++msgstr "" ++ ++msgid "If unchecked, the advertised DNS server addresses are ignored" ++msgstr "" ++ ++msgid "" ++"If your physical memory is insufficient unused data can be temporarily " ++"swapped to a swap-device resulting in a higher amount of usable RAM. Be aware that swapping data is a very " ++"slow process as the swap-device cannot be accessed with the high datarates " ++"of the RAM." ++msgstr "" ++"Nếu bá»™ nhá»› vật lý không đủ dữ liệu không dùng có thể được swap tạm thá»i đến " ++"má»™t thiết bị swap để tạo ra nhiá»u khoảng trống hÆ¡n trong RAM. Hãy nhận biết rằng swapping dữ liệu là " ++"má»™t quá trình rất chậm vì má»™t thiết bị swap không thể được truy cập vá»›i " ++"datarates cao hÆ¡n của RAM." ++ ++msgid "Ignore Hosts files" ++msgstr "" ++ ++msgid "Ignore interface" ++msgstr "Lá» Ä‘i giao diện" ++ ++msgid "Ignore resolve file" ++msgstr "Lá» Ä‘i tập tin resolve" ++ ++msgid "Image" ++msgstr "" ++ ++msgid "In" ++msgstr "Trong" ++ ++msgid "Inactivity timeout" ++msgstr "" ++ ++msgid "Inbound:" ++msgstr "" ++ ++msgid "Info" ++msgstr "" ++ ++msgid "Initscript" ++msgstr "Initscript" ++ ++msgid "Initscripts" ++msgstr "Initscripts" ++ ++msgid "Install" ++msgstr "Cài đặt " ++ ++msgid "Install iputils-traceroute6 for IPv6 traceroute" ++msgstr "" ++ ++msgid "Install package %q" ++msgstr "" ++ ++msgid "Install protocol extensions..." ++msgstr "" ++ ++msgid "Installed packages" ++msgstr "" ++ ++msgid "Interface" ++msgstr "Giao diện " ++ ++msgid "Interface Configuration" ++msgstr "" ++ ++msgid "Interface Overview" ++msgstr "" ++ ++msgid "Interface is reconnecting..." ++msgstr "" ++ ++msgid "Interface is shutting down..." ++msgstr "" ++ ++msgid "Interface not present or not connected yet." ++msgstr "" ++ ++msgid "Interface reconnected" ++msgstr "" ++ ++msgid "Interface shut down" ++msgstr "" ++ ++msgid "Interfaces" ++msgstr "Giao diện " ++ ++msgid "Internal" ++msgstr "" ++ ++msgid "Internal Server Error" ++msgstr "" ++ ++msgid "Invalid" ++msgstr "Giá trị nhập vào không hợp lí" ++ ++msgid "Invalid VLAN ID given! Only IDs between %d and %d are allowed." ++msgstr "" ++ ++msgid "Invalid VLAN ID given! Only unique IDs are allowed" ++msgstr "" ++ ++msgid "Invalid username and/or password! Please try again." ++msgstr "Tên và mật mã không đúng. Xin thá»­ lại " ++ ++#, fuzzy ++msgid "" ++"It appears that you are trying to flash an image that does not fit into the " ++"flash memory, please verify the image file!" ++msgstr "" ++"DÆ°á»ng nhÆ° bạn cố gắng flash má»™t hình ảnh không phù hợp vá»›i bá»™ nhá»› flash, xin " ++"vui lòng xác minh các tập tin hình ảnh!" ++ ++msgid "Java Script required!" ++msgstr "" ++ ++msgid "Join Network" ++msgstr "" ++ ++msgid "Join Network: Settings" ++msgstr "" ++ ++msgid "Join Network: Wireless Scan" ++msgstr "" ++ ++msgid "Keep settings" ++msgstr "" ++ ++msgid "Kernel Log" ++msgstr "Kernel Log" ++ ++msgid "Kernel Version" ++msgstr "" ++ ++msgid "Key" ++msgstr "Phím " ++ ++msgid "Key #%d" ++msgstr "" ++ ++msgid "Kill" ++msgstr "Kill" ++ ++msgid "L2TP" ++msgstr "" ++ ++msgid "L2TP Server" ++msgstr "" ++ ++msgid "LCP echo failure threshold" ++msgstr "" ++ ++msgid "LCP echo interval" ++msgstr "" ++ ++msgid "LLC" ++msgstr "" ++ ++msgid "Label" ++msgstr "" ++ ++msgid "Language" ++msgstr "Ngôn ngữ" ++ ++msgid "Language and Style" ++msgstr "" ++ ++msgid "Leaf" ++msgstr "" ++ ++msgid "Lease validity time" ++msgstr "" ++ ++msgid "Leasefile" ++msgstr "Leasefile" ++ ++msgid "Leasetime" ++msgstr "Leasetime" ++ ++msgid "Leasetime remaining" ++msgstr "Leasetime còn lại" ++ ++msgid "Leave empty to autodetect" ++msgstr "" ++ ++msgid "Leave empty to use the current WAN address" ++msgstr "" ++ ++msgid "Legend:" ++msgstr "" ++ ++msgid "Limit" ++msgstr "Giá»›i hạn " ++ ++msgid "Line Attenuation" ++msgstr "" ++ ++msgid "Line Speed" ++msgstr "" ++ ++msgid "Line State" ++msgstr "" ++ ++msgid "Link On" ++msgstr "Link On" ++ ++msgid "" ++"List of DNS servers to forward " ++"requests to" ++msgstr "" ++ ++msgid "List of domains to allow RFC1918 responses for" ++msgstr "" ++ ++msgid "List of hosts that supply bogus NX domain results" ++msgstr "" ++ ++msgid "Listen only on the given interface or, if unspecified, on all" ++msgstr "" ++ ++msgid "Listening port for inbound DNS queries" ++msgstr "" ++ ++msgid "Load" ++msgstr "Tải " ++ ++msgid "Load Average" ++msgstr "" ++ ++msgid "Loading" ++msgstr "" ++ ++msgid "Local IPv4 address" ++msgstr "" ++ ++msgid "Local IPv6 address" ++msgstr "" ++ ++msgid "Local Startup" ++msgstr "" ++ ++msgid "Local Time" ++msgstr "GiỠđịa phÆ°Æ¡ng" ++ ++msgid "Local domain" ++msgstr "" ++ ++msgid "" ++"Local domain specification. Names matching this domain are never forwarded " ++"and are resolved from DHCP or hosts files only" ++msgstr "" ++ ++msgid "Local domain suffix appended to DHCP names and hosts file entries" ++msgstr "" ++ ++msgid "Local server" ++msgstr "" ++ ++msgid "" ++"Localise hostname depending on the requesting subnet if multiple IPs are " ++"available" ++msgstr "" ++ ++msgid "Localise queries" ++msgstr "Tra vấn địa phÆ°Æ¡ng" ++ ++msgid "Locked to channel %d used by: %s" ++msgstr "" ++ ++msgid "Log output level" ++msgstr "" ++ ++msgid "Log queries" ++msgstr "Bản ghi tra vấn" ++ ++msgid "Logging" ++msgstr "" ++ ++msgid "Login" ++msgstr "Äăng nhập " ++ ++msgid "Logout" ++msgstr "Thoát ra" ++ ++msgid "Lowest leased address as offset from the network address." ++msgstr "" ++ ++msgid "MAC-Address" ++msgstr "" ++ ++msgid "MAC-Address Filter" ++msgstr "Lá»c địa chỉ MAC" ++ ++msgid "MAC-Filter" ++msgstr "Lá»c MAC" ++ ++msgid "MAC-List" ++msgstr "Danh sách MAC" ++ ++msgid "MB/s" ++msgstr "" ++ ++msgid "MHz" ++msgstr "" ++ ++msgid "MTU" ++msgstr "" ++ ++msgid "" ++"Make sure to clone the root filesystem using something like the commands " ++"below:" ++msgstr "" ++ ++msgid "Maximum Rate" ++msgstr "Mức cao nhất" ++ ++msgid "Maximum allowed number of active DHCP leases" ++msgstr "" ++ ++msgid "Maximum allowed number of concurrent DNS queries" ++msgstr "" ++ ++msgid "Maximum allowed size of EDNS.0 UDP packets" ++msgstr "" ++ ++msgid "Maximum amount of seconds to wait for the modem to become ready" ++msgstr "" ++ ++msgid "Maximum hold time" ++msgstr "Mức cao nhất" ++ ++msgid "Maximum number of leased addresses." ++msgstr "" ++ ++msgid "Mbit/s" ++msgstr "" ++ ++msgid "Memory" ++msgstr "Bá»™ nhá»›" ++ ++msgid "Memory usage (%)" ++msgstr "Memory usage (%)" ++ ++msgid "Metric" ++msgstr "Metric" ++ ++msgid "Minimum Rate" ++msgstr "Mức thấp nhất" ++ ++msgid "Minimum hold time" ++msgstr "Mức thấp nhất" ++ ++msgid "Mirror monitor port" ++msgstr "" ++ ++msgid "Mirror source port" ++msgstr "" ++ ++msgid "Missing protocol extension for proto %q" ++msgstr "" ++ ++msgid "Mode" ++msgstr "Chế Ä‘á»™" ++ ++msgid "Model" ++msgstr "" ++ ++msgid "Modem device" ++msgstr "Thiết bị modem" ++ ++msgid "Modem init timeout" ++msgstr "" ++ ++msgid "Monitor" ++msgstr "Monitor" ++ ++msgid "Mount Entry" ++msgstr "" ++ ++msgid "Mount Point" ++msgstr "Lắp Ä‘iểm" ++ ++msgid "Mount Points" ++msgstr "Lắp Ä‘iểm" ++ ++msgid "Mount Points - Mount Entry" ++msgstr "" ++ ++msgid "Mount Points - Swap Entry" ++msgstr "" ++ ++msgid "" ++"Mount Points define at which point a memory device will be attached to the " ++"filesystem" ++msgstr "" ++"Số Ä‘iểm lắp xác định tại má»™t Ä‘iểm mà ở đó bá»™ nhá»› sẽ được gắn vào hệ thống " ++"tập tin" ++ ++msgid "Mount options" ++msgstr "" ++ ++msgid "Mount point" ++msgstr "" ++ ++msgid "Mounted file systems" ++msgstr "Lắp tập tin hệ thống" ++ ++msgid "Move down" ++msgstr "" ++ ++msgid "Move up" ++msgstr "" ++ ++msgid "Multicast Rate" ++msgstr "Multicast Rate" ++ ++msgid "Multicast address" ++msgstr "" ++ ++msgid "NAS ID" ++msgstr "NAS ID" ++ ++msgid "NDP-Proxy" ++msgstr "" ++ ++msgid "NTP server candidates" ++msgstr "" ++ ++msgid "NTP sync time-out" ++msgstr "" ++ ++msgid "Name" ++msgstr "Tên" ++ ++msgid "Name of the new interface" ++msgstr "" ++ ++msgid "Name of the new network" ++msgstr "" ++ ++msgid "Navigation" ++msgstr "Sá»± Ä‘iá»u hÆ°á»›ng" ++ ++msgid "Netmask" ++msgstr "" ++ ++msgid "Network" ++msgstr "mạng lÆ°á»›i " ++ ++msgid "Network Utilities" ++msgstr "" ++ ++msgid "Network boot image" ++msgstr "" ++ ++msgid "Network without interfaces." ++msgstr "" ++ ++msgid "Next »" ++msgstr "" ++ ++msgid "No DHCP Server configured for this interface" ++msgstr "" ++ ++msgid "No chains in this table" ++msgstr "Không có chuá»—i trong bảng này" ++ ++msgid "No files found" ++msgstr "" ++ ++msgid "No information available" ++msgstr "" ++ ++msgid "No negative cache" ++msgstr "" ++ ++msgid "No network configured on this device" ++msgstr "" ++ ++msgid "No network name specified" ++msgstr "" ++ ++msgid "No package lists available" ++msgstr "" ++ ++msgid "No password set!" ++msgstr "" ++ ++msgid "No rules in this chain" ++msgstr "Không có quy luật trong chuá»—i này" ++ ++msgid "No zone assigned" ++msgstr "" ++ ++msgid "Noise" ++msgstr "" ++ ++msgid "Noise Margin" ++msgstr "" ++ ++msgid "Noise:" ++msgstr "" ++ ++msgid "None" ++msgstr "" ++ ++msgid "Normal" ++msgstr "" ++ ++msgid "Not Found" ++msgstr "" ++ ++msgid "Not associated" ++msgstr "" ++ ++msgid "Not connected" ++msgstr "" ++ ++msgid "Note: Configuration files will be erased." ++msgstr "" ++ ++msgid "Notice" ++msgstr "" ++ ++msgid "Nslookup" ++msgstr "" ++ ++msgid "OK" ++msgstr "OK " ++ ++msgid "OPKG-Configuration" ++msgstr "Cấu hình OPKG-" ++ ++msgid "Off-State Delay" ++msgstr "" ++ ++msgid "" ++"On this page you can configure the network interfaces. You can bridge " ++"several interfaces by ticking the \"bridge interfaces\" field and enter the " ++"names of several network interfaces separated by spaces. You can also use " ++"VLAN notation " ++"INTERFACE.VLANNR (e.g.: " ++"eth0.1)." ++msgstr "" ++"Trên trang này bạn có thể định cấu hình giao diện network. Bạn có thể bắt " ++"cầu nhiá»u giao diện bằng cách đánh dấu &quot;bridge interfaces&quot; " ++"field và nhập tên vào của nhiá»u giao diện network phân tách bởi những khoảng " ++"trống. Bạn có thể cÅ©ng dùng VLAN notation INTERFACE.VLANNR (e." ++"g.: eth0.1)." ++ ++msgid "On-State Delay" ++msgstr "" ++ ++msgid "One of hostname or mac address must be specified!" ++msgstr "" ++ ++msgid "One or more fields contain invalid values!" ++msgstr "" ++ ++msgid "One or more required fields have no value!" ++msgstr "" ++ ++msgid "Open list..." ++msgstr "" ++ ++msgid "OpenConnect (CISCO AnyConnect)" ++msgstr "" ++ ++msgid "Operating frequency" ++msgstr "" ++ ++msgid "Option changed" ++msgstr "" ++ ++msgid "Option removed" ++msgstr "" ++ ++msgid "Optional, specify to override default server (tic.sixxs.net)" ++msgstr "" ++ ++msgid "Optional, use when the SIXXS account has more than one tunnel" ++msgstr "" ++ ++msgid "Options" ++msgstr "Lá»±a chá»n " ++ ++msgid "Other:" ++msgstr "" ++ ++msgid "Out" ++msgstr "Ra khá»i" ++ ++msgid "Outbound:" ++msgstr "" ++ ++msgid "Outdoor Channels" ++msgstr "Kênh ngoại mạng" ++ ++msgid "Output Interface" ++msgstr "" ++ ++msgid "Override MAC address" ++msgstr "" ++ ++msgid "Override MTU" ++msgstr "" ++ ++msgid "Override the gateway in DHCP responses" ++msgstr "" ++ ++msgid "" ++"Override the netmask sent to clients. Normally it is calculated from the " ++"subnet that is served." ++msgstr "" ++ ++msgid "Override the table used for internal routes" ++msgstr "" ++ ++msgid "Overview" ++msgstr "Nhìn chung" ++ ++msgid "Owner" ++msgstr "Owner" ++ ++msgid "PAP/CHAP password" ++msgstr "" ++ ++msgid "PAP/CHAP username" ++msgstr "" ++ ++msgid "PID" ++msgstr "PID" ++ ++msgid "PIN" ++msgstr "" ++ ++msgid "PPP" ++msgstr "" ++ ++msgid "PPPoA Encapsulation" ++msgstr "PPPoA Encapsulation" ++ ++msgid "PPPoATM" ++msgstr "" ++ ++msgid "PPPoE" ++msgstr "" ++ ++msgid "PPtP" ++msgstr "" ++ ++msgid "Package libiwinfo required!" ++msgstr "" ++ ++msgid "Package lists are older than 24 hours" ++msgstr "" ++ ++msgid "Package name" ++msgstr "Tên gói" ++ ++msgid "Packets" ++msgstr "Gói tin" ++ ++msgid "Part of zone %q" ++msgstr "" ++ ++msgid "Password" ++msgstr "Mật mã" ++ ++msgid "Password authentication" ++msgstr "Xác thá»±c mật mã" ++ ++msgid "Password of Private Key" ++msgstr "Mật mã của private key" ++ ++msgid "Password successfully changed!" ++msgstr "" ++ ++msgid "Path" ++msgstr "ÄÆ°á»ng dẫn" ++ ++msgid "Path to CA-Certificate" ++msgstr "ÄÆ°á»ng dẫn tá»›i CA-Certificate" ++ ++msgid "Path to Client-Certificate" ++msgstr "" ++ ++msgid "Path to Private Key" ++msgstr "ÄÆ°á»ng dẫn tá»›i private key" ++ ++msgid "Path to executable which handles the button event" ++msgstr "" ++ ++msgid "Peak:" ++msgstr "" ++ ++msgid "Perform reboot" ++msgstr "Tiến hành reboot" ++ ++msgid "Perform reset" ++msgstr "" ++ ++msgid "Phy Rate:" ++msgstr "" ++ ++msgid "Physical Settings" ++msgstr "Cài đặt căn bản" ++ ++msgid "Ping" ++msgstr "" ++ ++msgid "Pkts." ++msgstr "" ++ ++msgid "Please enter your username and password." ++msgstr "Nhập tên và mật mã" ++ ++msgid "Please wait: Device rebooting..." ++msgstr "Xin chá»: Công cụ Ä‘ang reboot" ++ ++msgid "Policy" ++msgstr "Chính sách" ++ ++msgid "Port" ++msgstr "Cá»­a " ++ ++msgid "Port %d" ++msgstr "" ++ ++msgid "Port %d is untagged in multiple VLANs!" ++msgstr "" ++ ++msgid "Port status:" ++msgstr "" ++ ++msgid "" ++"Presume peer to be dead after given amount of LCP echo failures, use 0 to " ++"ignore failures" ++msgstr "" ++ ++msgid "Prevents client-to-client communication" ++msgstr "Ngăn chặn giao tiếp giữa client-và-client" ++ ++msgid "Prism2/2.5/3 802.11b Wireless Controller" ++msgstr "" ++ ++msgid "Proceed" ++msgstr "Proceed" ++ ++msgid "Processes" ++msgstr "Processes" ++ ++msgid "Prot." ++msgstr "Prot." ++ ++msgid "Protocol" ++msgstr "Protocol" ++ ++msgid "Protocol family" ++msgstr "" ++ ++msgid "Protocol of the new interface" ++msgstr "" ++ ++msgid "Protocol support is not installed" ++msgstr "" ++ ++msgid "Provide NTP server" ++msgstr "" ++ ++msgid "Provide new network" ++msgstr "" ++ ++msgid "Pseudo Ad-Hoc (ahdemo)" ++msgstr "Pseudo Ad-Hoc (ahdemo)" ++ ++msgid "Public prefix routed to this device for distribution to clients." ++msgstr "" ++ ++msgid "Quality" ++msgstr "" ++ ++msgid "RTS/CTS Threshold" ++msgstr "RTS/CTS Threshold" ++ ++msgid "RX" ++msgstr "RX" ++ ++msgid "RX Rate" ++msgstr "" ++ ++msgid "RaLink 802.11%s Wireless Controller" ++msgstr "" ++ ++msgid "Radius-Accounting-Port" ++msgstr "" ++ ++msgid "Radius-Accounting-Secret" ++msgstr "" ++ ++msgid "Radius-Accounting-Server" ++msgstr "" ++ ++msgid "Radius-Authentication-Port" ++msgstr "" ++ ++msgid "Radius-Authentication-Secret" ++msgstr "" ++ ++msgid "Radius-Authentication-Server" ++msgstr "" ++ ++msgid "" ++"Read /etc/ethers to configure the DHCP-Server" ++msgstr "" ++"Äá»c /etc/ethers để định cấu hình DHCP-Server" ++ ++msgid "" ++"Really delete this interface? The deletion cannot be undone!\\nYou might " ++"lose access to this device if you are connected via this interface." ++msgstr "" ++ ++msgid "" ++"Really delete this wireless network? The deletion cannot be undone!\\nYou " ++"might lose access to this device if you are connected via this network." ++msgstr "" ++ ++msgid "Really reset all changes?" ++msgstr "" ++ ++msgid "" ++"Really shut down network?\\nYou might lose access to this device if you are " ++"connected via this interface." ++msgstr "" ++ ++msgid "" ++"Really shutdown interface \"%s\" ?\\nYou might lose access to this device if " ++"you are connected via this interface." ++msgstr "" ++ ++msgid "Really switch protocol?" ++msgstr "" ++ ++msgid "Realtime Connections" ++msgstr "" ++ ++msgid "Realtime Graphs" ++msgstr "" ++ ++msgid "Realtime Load" ++msgstr "" ++ ++msgid "Realtime Traffic" ++msgstr "" ++ ++msgid "Realtime Wireless" ++msgstr "" ++ ++msgid "Rebind protection" ++msgstr "" ++ ++msgid "Reboot" ++msgstr "Reboot" ++ ++msgid "Rebooting..." ++msgstr "" ++ ++msgid "Reboots the operating system of your device" ++msgstr "Reboots hệ Ä‘iá»u hành của công cụ" ++ ++msgid "Receive" ++msgstr "Receive" ++ ++msgid "Receiver Antenna" ++msgstr "Máy thu Antenna" ++ ++msgid "Reconnect this interface" ++msgstr "" ++ ++msgid "Reconnecting interface" ++msgstr "" ++ ++msgid "References" ++msgstr "Tham chiếu" ++ ++msgid "Regulatory Domain" ++msgstr "Miá»n Ä‘iá»u chỉnh" ++ ++msgid "Relay" ++msgstr "" ++ ++msgid "Relay Bridge" ++msgstr "" ++ ++msgid "Relay between networks" ++msgstr "" ++ ++msgid "Relay bridge" ++msgstr "" ++ ++msgid "Remote IPv4 address" ++msgstr "" ++ ++msgid "Remove" ++msgstr "Loại bá»" ++ ++msgid "Repeat scan" ++msgstr "" ++ ++msgid "Replace entry" ++msgstr "thay đổi ná»™i dung" ++ ++msgid "Replace wireless configuration" ++msgstr "" ++ ++msgid "Request IPv6-address" ++msgstr "" ++ ++msgid "Request IPv6-prefix of length" ++msgstr "" ++ ++msgid "Require TLS" ++msgstr "" ++ ++msgid "Required for certain ISPs, e.g. Charter with DOCSIS 3" ++msgstr "" ++ ++msgid "Reset" ++msgstr "Reset" ++ ++msgid "Reset Counters" ++msgstr "Reset bá»™ đếm" ++ ++msgid "Reset to defaults" ++msgstr "" ++ ++msgid "Resolv and Hosts Files" ++msgstr "" ++ ++msgid "Resolve file" ++msgstr "" ++ ++msgid "Restart" ++msgstr "" ++ ++msgid "Restart Firewall" ++msgstr "Khởi Ä‘á»™ng lại Firewall" ++ ++msgid "Restore backup" ++msgstr "Phục hồi backup" ++ ++msgid "Reveal/hide password" ++msgstr "" ++ ++msgid "Revert" ++msgstr "Revert" ++ ++msgid "Root" ++msgstr "" ++ ++msgid "Root directory for files served via TFTP" ++msgstr "" ++ ++msgid "Root preparation" ++msgstr "" ++ ++msgid "Routed IPv6 prefix for downstream interfaces" ++msgstr "" ++ ++msgid "Router Advertisement-Service" ++msgstr "" ++ ++msgid "Router Password" ++msgstr "" ++ ++msgid "Routes" ++msgstr "Routes" ++ ++msgid "" ++"Routes specify over which interface and gateway a certain host or network " ++"can be reached." ++msgstr "" ++"Routes chỉ định trên giao diện và cổng má»™t host nhất định hay network được " ++"tiếp cận." ++ ++msgid "Rule #" ++msgstr "" ++ ++msgid "Run a filesystem check before mounting the device" ++msgstr "" ++ ++msgid "Run filesystem check" ++msgstr "" ++ ++msgid "" ++"SIXXS supports TIC only, for static tunnels using IP protocol 41 (RFC4213) " ++"use 6in4 instead" ++msgstr "" ++ ++msgid "SIXXS-handle[/Tunnel-ID]" ++msgstr "" ++ ++msgid "SSH Access" ++msgstr "" ++ ++msgid "SSH-Keys" ++msgstr "" ++ ++msgid "SSID" ++msgstr "SSID" ++ ++msgid "Save" ++msgstr "LÆ°u" ++ ++msgid "Save & Apply" ++msgstr "LÆ°u & áp dụng " ++ ++msgid "Save & Apply" ++msgstr "" ++ ++msgid "Scan" ++msgstr "Scan" ++ ++msgid "Scheduled Tasks" ++msgstr "Scheduled Tasks" ++ ++msgid "Section added" ++msgstr "" ++ ++msgid "Section removed" ++msgstr "" ++ ++msgid "See \"mount\" manpage for details" ++msgstr "" ++ ++msgid "" ++"Send LCP echo requests at the given interval in seconds, only effective in " ++"conjunction with failure threshold" ++msgstr "" ++ ++msgid "Separate Clients" ++msgstr "Cô lập đối tượng" ++ ++msgid "Separate WDS" ++msgstr "Phân tách WDS" ++ ++msgid "Server Settings" ++msgstr "" ++ ++msgid "Server password" ++msgstr "" ++ ++msgid "" ++"Server password, enter the specific password of the tunnel when the username " ++"contains the tunnel ID" ++msgstr "" ++ ++msgid "Server username" ++msgstr "" ++ ++msgid "Service Name" ++msgstr "" ++ ++msgid "Service Type" ++msgstr "" ++ ++msgid "Services" ++msgstr "Dịch vụ " ++ ++msgid "Set up Time Synchronization" ++msgstr "" ++ ++msgid "Setup DHCP Server" ++msgstr "" ++ ++msgid "Show current backup file list" ++msgstr "" ++ ++msgid "Shutdown this interface" ++msgstr "" ++ ++msgid "Shutdown this network" ++msgstr "" ++ ++msgid "Signal" ++msgstr "" ++ ++msgid "Signal:" ++msgstr "" ++ ++msgid "Size" ++msgstr "Dung lượng " ++ ++msgid "Skip" ++msgstr "" ++ ++msgid "Skip to content" ++msgstr "Nhảy tá»›i ná»™i dung" ++ ++msgid "Skip to navigation" ++msgstr "Chuyển đến mục định hÆ°á»›ng" ++ ++msgid "Slot time" ++msgstr "" ++ ++msgid "Software" ++msgstr "Phần má»m" ++ ++msgid "Some fields are invalid, cannot save values!" ++msgstr "" ++ ++msgid "Sorry, the object you requested was not found." ++msgstr "" ++ ++msgid "Sorry, the server encountered an unexpected error." ++msgstr "" ++ ++msgid "" ++"Sorry, there is no sysupgrade support present; a new firmware image must be " ++"flashed manually. Please refer to the OpenWrt wiki for device specific " ++"install instructions." ++msgstr "" ++ ++msgid "Sort" ++msgstr "" ++ ++msgid "Source" ++msgstr "Nguồn" ++ ++msgid "Source routing" ++msgstr "" ++ ++msgid "Specifies the button state to handle" ++msgstr "" ++ ++msgid "Specifies the directory the device is attached to" ++msgstr "" ++ ++msgid "Specifies the listening port of this Dropbear instance" ++msgstr "" ++ ++msgid "" ++"Specifies the maximum amount of failed ARP requests until hosts are presumed " ++"to be dead" ++msgstr "" ++ ++msgid "" ++"Specifies the maximum amount of seconds after which hosts are presumed to be " ++"dead" ++msgstr "" ++ ++msgid "Specify the secret encryption key here." ++msgstr "" ++ ++msgid "Start" ++msgstr "Bắt đầu " ++ ++msgid "Start priority" ++msgstr "Bắt đầu Æ°u tiên" ++ ++msgid "Startup" ++msgstr "" ++ ++msgid "Static IPv4 Routes" ++msgstr "Static IPv4 Routes" ++ ++msgid "Static IPv6 Routes" ++msgstr "Static IPv6 Routes" ++ ++msgid "Static Leases" ++msgstr "Thống kê leases" ++ ++msgid "Static Routes" ++msgstr "Static Routes" ++ ++msgid "Static WDS" ++msgstr "" ++ ++msgid "Static address" ++msgstr "" ++ ++msgid "" ++"Static leases are used to assign fixed IP addresses and symbolic hostnames " ++"to DHCP clients. They are also required for non-dynamic interface " ++"configurations where only hosts with a corresponding lease are served." ++msgstr "" ++ ++msgid "Status" ++msgstr "Tình trạng" ++ ++msgid "Stop" ++msgstr "" ++ ++msgid "Strict order" ++msgstr "Yêu cầu nghiêm ngặt" ++ ++msgid "Submit" ++msgstr "Trình " ++ ++msgid "Swap" ++msgstr "" ++ ++msgid "Swap Entry" ++msgstr "" ++ ++msgid "Switch" ++msgstr "chuyển đổi" ++ ++msgid "Switch %q" ++msgstr "" ++ ++msgid "Switch %q (%s)" ++msgstr "" ++ ++msgid "Switch protocol" ++msgstr "" ++ ++msgid "Sync with browser" ++msgstr "" ++ ++msgid "Synchronizing..." ++msgstr "" ++ ++msgid "System" ++msgstr "Hệ thống" ++ ++msgid "System Log" ++msgstr "System Log" ++ ++msgid "System Properties" ++msgstr "" ++ ++msgid "System log buffer size" ++msgstr "" ++ ++msgid "TCP:" ++msgstr "" ++ ++msgid "TFTP Settings" ++msgstr "" ++ ++msgid "TFTP server root" ++msgstr "" ++ ++msgid "TX" ++msgstr "TX" ++ ++msgid "TX Rate" ++msgstr "" ++ ++msgid "Table" ++msgstr "Bảng" ++ ++msgid "Target" ++msgstr "Äích" ++ ++msgid "Terminate" ++msgstr "Terminate" ++ ++msgid "" ++"The Device Configuration section covers physical settings of the " ++"radio hardware such as channel, transmit power or antenna selection which " ++"are shared among all defined wireless networks (if the radio hardware is " ++"multi-SSID capable). Per network settings like encryption or operation mode " ++"are grouped in the Interface Configuration." ++msgstr "" ++ ++msgid "" ++"The libiwinfo-lua package is not installed. You must install this " ++"component for working wireless configuration!" ++msgstr "" ++ ++msgid "" ++"The HE.net endpoint update configuration changed, you must now use the plain " ++"username instead of the user ID!" ++msgstr "" ++ ++msgid "" ++"The IPv6 prefix assigned to the provider, usually ends with ::" ++msgstr "" ++ ++msgid "" ++"The allowed characters are: A-Z, a-z, 0-9 and _" ++msgstr "" ++ ++msgid "The configuration file could not be loaded due to the following error:" ++msgstr "" ++ ++msgid "" ++"The device file of the memory or partition (e.g." ++" /dev/sda1)" ++msgstr "" ++"Tập tin công cụ của bá»™ nhá»› hoặc phân vùng (e.g. " ++"/dev/sda1)" ++ ++msgid "" ++"The filesystem that was used to format the memory (e.g. ext3)" ++msgstr "" ++"Filesystem mà được dùng để format memory (e.g. ext3)" ++ ++msgid "" ++"The flash image was uploaded. Below is the checksum and file size listed, " ++"compare them with the original file to ensure data integrity.
    Click " ++"\"Proceed\" below to start the flash procedure." ++msgstr "" ++ ++msgid "The following changes have been committed" ++msgstr "" ++ ++msgid "The following changes have been reverted" ++msgstr "Những thay đối sau đây đã được để trở vỠtình trạng cũ. " ++ ++msgid "The following rules are currently active on this system." ++msgstr "" ++ ++msgid "The given network name is not unique" ++msgstr "" ++ ++msgid "" ++"The hardware is not multi-SSID capable and the existing configuration will " ++"be replaced if you proceed." ++msgstr "" ++ ++msgid "" ++"The length of the IPv4 prefix in bits, the remainder is used in the IPv6 " ++"addresses." ++msgstr "" ++ ++msgid "The length of the IPv6 prefix in bits" ++msgstr "" ++ ++msgid "" ++"The network ports on this device can be combined to several VLANs in which computers can " ++"communicate directly with each other. VLANs are often used to separate different network " ++"segments. Often there is by default one Uplink port for a connection to the " ++"next greater network like the internet and other ports for a local network." ++msgstr "" ++ ++msgid "The selected protocol needs a device assigned" ++msgstr "" ++ ++msgid "" ++"The system is erasing the configuration partition now and will reboot itself " ++"when finished." ++msgstr "" ++ ++#, fuzzy ++msgid "" ++"The system is flashing now.
    DO NOT POWER OFF THE DEVICE!
    Wait a " ++"few minutes before you try to reconnect. It might be necessary to renew the " ++"address of your computer to reach the device again, depending on your " ++"settings." ++msgstr "" ++"Hệ thống bây giỠđang flashing.
    DO NOT POWER OFF THE DEVICE!
    Chá» " ++"má»™t vài phút cho tá»›i khi kết nối lại. Có thể cần phải làm má»›i địa chỉ của " ++"máy tính để tiếp cận thiết bị má»™t lần nữa, phụ thuá»™c vào cài đặt của bạn. " ++ ++msgid "" ++"The tunnel end-point is behind NAT, defaults to disabled and only applies to " ++"AYIYA" ++msgstr "" ++ ++msgid "" ++"The uploaded image file does not contain a supported format. Make sure that " ++"you choose the generic image format for your platform." ++msgstr "" ++"Tập tin Ä‘ang tải hình ảnh không bao gồm má»™t hổ trợ format. Bảo đảm rằng bạn " ++"chá»n má»™t image format tổng quát cho platform." ++ ++msgid "There are no active leases." ++msgstr "" ++ ++msgid "There are no pending changes to apply!" ++msgstr "" ++ ++msgid "There are no pending changes to revert!" ++msgstr "" ++ ++msgid "There are no pending changes!" ++msgstr "" ++ ++msgid "" ++"There is no device assigned yet, please attach a network device in the " ++"\"Physical Settings\" tab" ++msgstr "" ++ ++msgid "" ++"There is no password set on this router. Please configure a root password to " ++"protect the web interface and enable SSH." ++msgstr "" ++ ++msgid "This IPv4 address of the relay" ++msgstr "" ++ ++msgid "" ++"This is a list of shell glob patterns for matching files and directories to " ++"include during sysupgrade. Modified files in /etc/config/ and certain other " ++"configurations are automatically preserved." ++msgstr "" ++ ++msgid "" ++"This is either the \"Update Key\" configured for the tunnel or the account " ++"password if no update key has been configured" ++msgstr "" ++ ++msgid "" ++"This is the content of /etc/rc.local. Insert your own commands here (in " ++"front of 'exit 0') to execute them at the end of the boot process." ++msgstr "" ++ ++msgid "" ++"This is the local endpoint address assigned by the tunnel broker, it usually " ++"ends with :2" ++msgstr "" ++ ++msgid "" ++"This is the only DHCP in the local network" ++msgstr "" ++"Äây là DHCP duy " ++"nhất trong mạng địa phÆ°Æ¡ng. " ++ ++msgid "This is the plain username for logging into the account" ++msgstr "" ++ ++msgid "" ++"This is the prefix routed to you by the tunnel broker for use by clients" ++msgstr "" ++ ++msgid "This is the system crontab in which scheduled tasks can be defined." ++msgstr "Äây là system crontab mà scheduled tasks có thể bị định nghÄ©a." ++ ++msgid "" ++"This is usually the address of the nearest PoP operated by the tunnel broker" ++msgstr "" ++ ++msgid "" ++"This list gives an overview over currently running system processes and " ++"their status." ++msgstr "" ++"List này Ä‘Æ°a ra má»™t tầm nhìn tổng quát vá» xá»­ lý hệ thống Ä‘ang chạy và tình " ++"trạng của chúng." ++ ++msgid "This page allows the configuration of custom button actions" ++msgstr "" ++ ++msgid "This page gives an overview over currently active network connections." ++msgstr "" ++"Trang này cung cấp má»™t tổng quan vá» Ä‘ang hoạt Ä‘á»™ng kết nối mạng hiện tại." ++ ++msgid "This section contains no values yet" ++msgstr "Phần này chÆ°a có giá trị nào" ++ ++msgid "Time Synchronization" ++msgstr "" ++ ++msgid "Time Synchronization is not configured yet." ++msgstr "" ++ ++msgid "Timezone" ++msgstr "Múi giá» " ++ ++msgid "" ++"To restore configuration files, you can upload a previously generated backup " ++"archive here." ++msgstr "" ++ ++msgid "Total Available" ++msgstr "" ++ ++msgid "Traceroute" ++msgstr "" ++ ++msgid "Traffic" ++msgstr "" ++ ++msgid "Transfer" ++msgstr "Chuyển giao" ++ ++msgid "Transmission Rate" ++msgstr "Truyá»n tải rate" ++ ++msgid "Transmit" ++msgstr "Transmit" ++ ++msgid "Transmit Power" ++msgstr "Truyá»n tải năng lượng" ++ ++msgid "Transmitter Antenna" ++msgstr "Máy phát Antenna" ++ ++msgid "Trigger" ++msgstr "" ++ ++msgid "Trigger Mode" ++msgstr "" ++ ++msgid "Tunnel ID" ++msgstr "" ++ ++msgid "Tunnel Interface" ++msgstr "" ++ ++msgid "Tunnel Link" ++msgstr "" ++ ++msgid "Tunnel broker protocol" ++msgstr "" ++ ++msgid "Tunnel setup server" ++msgstr "" ++ ++msgid "Tunnel type" ++msgstr "" ++ ++msgid "Turbo Mode" ++msgstr "Turbo Mode" ++ ++msgid "Tx-Power" ++msgstr "" ++ ++msgid "Type" ++msgstr "Loại " ++ ++msgid "UDP:" ++msgstr "" ++ ++msgid "UMTS only" ++msgstr "" ++ ++msgid "UMTS/GPRS/EV-DO" ++msgstr "" ++ ++msgid "USB Device" ++msgstr "" ++ ++msgid "UUID" ++msgstr "" ++ ++msgid "Unable to dispatch" ++msgstr "" ++ ++msgid "Unknown" ++msgstr "" ++ ++msgid "Unknown Error, password not changed!" ++msgstr "" ++ ++msgid "Unmanaged" ++msgstr "" ++ ++msgid "Unsaved Changes" ++msgstr "Thay đổi không lÆ°u" ++ ++msgid "Unsupported protocol type." ++msgstr "" ++ ++msgid "Update lists" ++msgstr "" ++ ++msgid "" ++"Upload a sysupgrade-compatible image here to replace the running firmware. " ++"Check \"Keep settings\" to retain the current configuration (requires an " ++"OpenWrt compatible firmware image)." ++msgstr "" ++ ++msgid "Upload archive..." ++msgstr "" ++ ++msgid "Uploaded File" ++msgstr "Tập tin đã tải lên" ++ ++msgid "Uptime" ++msgstr "Uptime" ++ ++msgid "Use /etc/ethers" ++msgstr "Dùng /etc/ethers" ++ ++msgid "Use DHCP gateway" ++msgstr "" ++ ++msgid "Use DNS servers advertised by peer" ++msgstr "" ++ ++msgid "Use ISO/IEC 3166 alpha2 country codes." ++msgstr "" ++ ++msgid "Use MTU on tunnel interface" ++msgstr "" ++ ++msgid "Use TTL on tunnel interface" ++msgstr "" ++ ++msgid "Use as external overlay (/overlay)" ++msgstr "" ++ ++msgid "Use as root filesystem (/)" ++msgstr "" ++ ++msgid "Use broadcast flag" ++msgstr "" ++ ++msgid "Use builtin IPv6-management" ++msgstr "" ++ ++msgid "Use custom DNS servers" ++msgstr "" ++ ++msgid "Use default gateway" ++msgstr "" ++ ++msgid "Use gateway metric" ++msgstr "" ++ ++msgid "Use routing table" ++msgstr "" ++ ++msgid "" ++"Use the Add Button to add a new lease entry. The MAC-Address indentifies the host, the IPv4-Address specifies to the fixed " ++"address to use and the Hostname is assigned as symbolic name to the " ++"requesting host." ++msgstr "" ++ ++msgid "Used" ++msgstr "Äã sá»­ dụng" ++ ++msgid "Used Key Slot" ++msgstr "" ++ ++msgid "User certificate (PEM encoded)" ++msgstr "" ++ ++msgid "User key (PEM encoded)" ++msgstr "" ++ ++msgid "Username" ++msgstr "Tên ngÆ°á»i dùng " ++ ++msgid "VC-Mux" ++msgstr "" ++ ++msgid "VLAN Interface" ++msgstr "" ++ ++msgid "VLANs on %q" ++msgstr "" ++ ++msgid "VLANs on %q (%s)" ++msgstr "" ++ ++msgid "VPN Server" ++msgstr "" ++ ++msgid "VPN Server port" ++msgstr "" ++ ++msgid "VPN Server's certificate SHA1 hash" ++msgstr "" ++ ++msgid "Vendor Class to send when requesting DHCP" ++msgstr "" ++ ++msgid "Verbose" ++msgstr "" ++ ++msgid "Verbose logging by aiccu daemon" ++msgstr "" ++ ++msgid "Verify" ++msgstr "" ++ ++msgid "Version" ++msgstr "Phiên bản" ++ ++msgid "WDS" ++msgstr "WDS" ++ ++msgid "WEP Open System" ++msgstr "" ++ ++msgid "WEP Shared Key" ++msgstr "" ++ ++msgid "WEP passphrase" ++msgstr "" ++ ++msgid "WMM Mode" ++msgstr "WMM Mode" ++ ++msgid "WPA passphrase" ++msgstr "" ++ ++msgid "" ++"WPA-Encryption requires wpa_supplicant (for client mode) or hostapd (for AP " ++"and ad-hoc mode) to be installed." ++msgstr "" ++ ++msgid "" ++"Wait for NTP sync that many seconds, seting to 0 disables waiting (optional)" ++msgstr "" ++ ++msgid "Waiting for changes to be applied..." ++msgstr "" ++ ++msgid "Waiting for command to complete..." ++msgstr "" ++ ++msgid "Warning" ++msgstr "" ++ ++msgid "Warning: There are unsaved changes that will be lost while rebooting!" ++msgstr "Cảnh báo: Các thay đổi chÆ°a lÆ°u sẽ bị mất trong khi khởi Ä‘á»™ng lại!" ++ ++msgid "Whether to create an IPv6 default route over the tunnel" ++msgstr "" ++ ++msgid "Whether to route only packets from delegated prefixes" ++msgstr "" ++ ++msgid "Width" ++msgstr "" ++ ++msgid "Wifi" ++msgstr "Wifi" ++ ++msgid "Wireless" ++msgstr "" ++ ++msgid "Wireless Adapter" ++msgstr "Bá»™ tÆ°Æ¡ng hợp không dây" ++ ++msgid "Wireless Network" ++msgstr "" ++ ++msgid "Wireless Overview" ++msgstr "" ++ ++msgid "Wireless Security" ++msgstr "" ++ ++msgid "Wireless is disabled or not associated" ++msgstr "" ++ ++msgid "Wireless is restarting..." ++msgstr "" ++ ++msgid "Wireless network is disabled" ++msgstr "" ++ ++msgid "Wireless network is enabled" ++msgstr "" ++ ++msgid "Wireless restarted" ++msgstr "" ++ ++msgid "Wireless shut down" ++msgstr "" ++ ++msgid "Write received DNS requests to syslog" ++msgstr "" ++ ++msgid "XR Support" ++msgstr "Há»— trợ XR" ++ ++msgid "" ++"You can enable or disable installed init scripts here. Changes will applied " ++"after a device reboot.
    Warning: If you disable essential init " ++"scripts like \"network\", your device might become inaccessible!" ++msgstr "" ++"Bạn có thể bật hoặc tắt cài đặt init script tại đây. Thay đổi này sẽ được áp " ++"dụng sau khi một thiết bị khởi động lại.
    Cảnh báo: Nếu bạn vô " ++"hiệu hoá init script thiết yếu nhÆ° &quot;network&quot;, công cụ của " ++"bạn chó thể trở nên không truy cập được" ++ ++msgid "" ++"You must enable Java Script in your browser or LuCI will not work properly." ++msgstr "" ++ ++msgid "" ++"Your Internet Explorer is too old to display this page correctly. Please " ++"upgrade it to at least version 7 or use another browser like Firefox, Opera " ++"or Safari." ++msgstr "" ++ ++msgid "any" ++msgstr "" ++ ++msgid "auto" ++msgstr "tá»± Ä‘á»™ng" ++ ++#, fuzzy ++msgid "automatic" ++msgstr "thống kê" ++ ++msgid "baseT" ++msgstr "" ++ ++msgid "bridged" ++msgstr "" ++ ++msgid "create:" ++msgstr "" ++ ++msgid "creates a bridge over specified interface(s)" ++msgstr "tạo má»™t cầu nối trên má»™t giao diện được chỉ định" ++ ++msgid "dB" ++msgstr "" ++ ++msgid "dBm" ++msgstr "" ++ ++msgid "disable" ++msgstr "Vô hiệu hóa" ++ ++msgid "disabled" ++msgstr "" ++ ++msgid "expired" ++msgstr "" ++ ++msgid "" ++"file where given DHCP-leases will be stored" ++msgstr "" ++"Tập tin được cho DHCP-leases sẽ được lÆ°u trữ" ++ ++msgid "forward" ++msgstr "" ++ ++msgid "full-duplex" ++msgstr "" ++ ++msgid "half-duplex" ++msgstr "" ++ ++msgid "help" ++msgstr "" ++ ++msgid "hidden" ++msgstr "" ++ ++msgid "hybrid mode" ++msgstr "" ++ ++msgid "if target is a network" ++msgstr "Nếu mục tiêu là má»™t network" ++ ++msgid "input" ++msgstr "" ++ ++msgid "kB" ++msgstr "" ++ ++msgid "kB/s" ++msgstr "" ++ ++msgid "kbit/s" ++msgstr "" ++ ++msgid "local DNS file" ++msgstr "Tập tin DNS địa phÆ°Æ¡ng" ++ ++msgid "minimum 1280, maximum 1480" ++msgstr "" ++ ++msgid "navigation Navigation" ++msgstr "" ++ ++msgid "no" ++msgstr "" ++ ++msgid "no link" ++msgstr "" ++ ++msgid "none" ++msgstr "không " ++ ++msgid "not present" ++msgstr "" ++ ++msgid "off" ++msgstr "" ++ ++msgid "on" ++msgstr "" ++ ++msgid "open" ++msgstr "" ++ ++msgid "overlay" ++msgstr "" ++ ++msgid "relay mode" ++msgstr "" ++ ++msgid "routed" ++msgstr "" ++ ++msgid "server mode" ++msgstr "" ++ ++msgid "skiplink1 Skip to navigation" ++msgstr "" ++ ++msgid "skiplink2 Skip to content" ++msgstr "" ++ ++msgid "stateful-only" ++msgstr "" ++ ++msgid "stateless" ++msgstr "" ++ ++msgid "stateless + stateful" ++msgstr "" ++ ++msgid "tagged" ++msgstr "" ++ ++msgid "unknown" ++msgstr "" ++ ++msgid "unlimited" ++msgstr "" ++ ++msgid "unspecified" ++msgstr "" ++ ++msgid "unspecified -or- create:" ++msgstr "" ++ ++msgid "untagged" ++msgstr "" ++ ++msgid "yes" ++msgstr "" ++ ++msgid "« Back" ++msgstr "" ++ ++#~ msgid "Frequency Hopping" ++#~ msgstr "Tần số Hopping" ++ ++#~ msgid "Active Leases" ++#~ msgstr "Leases hoạt Ä‘á»™ng" ++ ++#~ msgid "MAC" ++#~ msgstr "MAC" ++ ++#~ msgid "Encr." ++#~ msgstr "Encr." ++ ++#~ msgid "WLAN-Scan" ++#~ msgstr "WLAN-Scan" ++ ++#~ msgid "Create Network" ++#~ msgstr "Tạo network" ++ ++#~ msgid "Link" ++#~ msgstr "Link" ++ ++#~ msgid "Networks" ++#~ msgstr "mạng lÆ°á»›i" ++ ++#~ msgid "Power" ++#~ msgstr "Power" ++ ++#~ msgid "Wifi networks in your local environment" ++#~ msgstr "Mạng lÆ°á»›i wifi ở môi trÆ°á»ng xung quanh bạn" ++ ++#~ msgid "" ++#~ "CIDR-Notation: " ++#~ "address/prefix" ++#~ msgstr "" ++#~ "CIDR-Notation: " ++#~ "address/prefix" ++ ++#~ msgid "DNS-Server" ++#~ msgstr "DNS-Máy chủ" ++ ++#~ msgid "IPv4-Broadcast" ++#~ msgstr "IPv4-Broadcast" ++ ++#~ msgid "IPv6-Address" ++#~ msgstr "IPv6-Address" ++ ++#~ msgid "" ++#~ "The network ports on your router can be combined to several VLANs in which computers can " ++#~ "communicate directly with each other. VLANs are often used to separate different network " ++#~ "segments. Often there is by default one Uplink port for a connection to " ++#~ "the next greater network like the internet and other ports for a local " ++#~ "network." ++#~ msgstr "" ++#~ "Cổng network trên bá»™ định tuyến có thể phối hợp vá»›i nhiá»u VLANs làm máy tính tá»± giao tiếp " ++#~ "trá»±c tiếp vá»›i nhau. VLANs thÆ°á»ng được dùng để phân tách những phân Ä‘oạn network khác nhau. " ++#~ "Thông thÆ°á»ng có má»™t cổng Uplink mặc định cho má»™t kết nối vào mạng lá»›n hÆ¡n " ++#~ "nhÆ° Internet và các cổng khác cho má»™t mạng lÆ°á»›i địa phÆ°Æ¡ng." ++ ++#~ msgid "Files to be kept when flashing a new firmware" ++#~ msgstr "Tập tin được lÆ°u giữ khi truyá»n tá»›i má»™t phần cứng má»›i" ++ ++#~ msgid "General" ++#~ msgstr "Tổng quát" ++ ++#~ msgid "" ++#~ "Here you can customize the settings and the functionality of LuCI." ++#~ msgstr "" ++#~ "Ở đây bạn có thể tùy chỉnh các cài đặt và các chức năng của LuCI." ++ ++#~ msgid "Post-commit actions" ++#~ msgstr "Äăng _ cam kết hành Ä‘á»™ng" ++ ++#~ msgid "" ++#~ "These commands will be executed automatically when a given UCI configuration is committed " ++#~ "allowing changes to be applied instantly." ++#~ msgstr "" ++#~ "Những lệnh này sẽ được thá»±c hiện tá»± Ä‘á»™ng khi má»™t UCI được cam kết cho phép các thay đổi " ++#~ "được áp dụng ngay lập tức. " ++ ++#~ msgid "Web UI" ++#~ msgstr "Web UI" ++ ++#~ msgid "Access point (APN)" ++#~ msgstr "Äiểm truy cập (APN)" ++ ++#~ msgid "Additional pppd options" ++#~ msgstr "Tùy chá»n pppd bổ sung" ++ ++#~ msgid "Automatic Disconnect" ++#~ msgstr "Tá»± Ä‘á»™ng ngừng kết nối" ++ ++#~ msgid "Backup Archive" ++#~ msgstr "Backup Archive" ++ ++#~ msgid "" ++#~ "Configure the local DNS server to use the name servers adverticed by the " ++#~ "PPP peer" ++#~ msgstr "" ++#~ "Äịnh cấu hình DNS server địa phÆ°Æ¡ng để dùng tên servers adverticed bởi " ++#~ "PPP peer" ++ ++#~ msgid "Connect script" ++#~ msgstr "Kết nối script" ++ ++#~ msgid "Create backup" ++#~ msgstr "Tạo backup" ++ ++#~ msgid "Disconnect script" ++#~ msgstr "Ngừng script" ++ ++#~ msgid "Edit package lists and installation targets" ++#~ msgstr "Chỉnh sá»­a danh sách gói và mục tiêu cài đặt" ++ ++#~ msgid "Enable IPv6 on PPP link" ++#~ msgstr "Kích hoạt IPv6 on PPP link" ++ ++#~ msgid "Firmware image" ++#~ msgstr "HÃŒnh ảnh firmware" ++ ++#~ msgid "" ++#~ "Here you can backup and restore your router configuration and - if " ++#~ "possible - reset the router to the default settings." ++#~ msgstr "" ++#~ "Ở đây bạn có thể backup và khôi phục lại cấu hình bá»™ định tuyến và- nếu " ++#~ "có thể - reset bá»™ định tuyến ở cài đặt mặc định." ++ ++#~ msgid "Installation targets" ++#~ msgstr "Mục tiêu cài đặt" ++ ++#~ msgid "Keep configuration files" ++#~ msgstr "Giữ tập tin cấu hình" ++ ++#~ msgid "Keep-Alive" ++#~ msgstr "Giữ-alive" ++ ++#~ msgid "" ++#~ "Let pppd replace the current default route to use the PPP interface after " ++#~ "successful connect" ++#~ msgstr "" ++#~ "Äể pppd thay thế route mặc định hiện tại để dùng giao diện PPP sau khi " ++#~ "kết nối thành công" ++ ++#~ msgid "Let pppd run this script after establishing the PPP link" ++#~ msgstr "Äể pppd chạy script này sau khi thành lập PPP link" ++ ++#~ msgid "Let pppd run this script before tearing down the PPP link" ++#~ msgstr "Äể pppd chạy trên script trÆ°á»›c khi phá vỡ PPP link" ++ ++#~ msgid "" ++#~ "Make sure that you provide the correct pin code here or you might lock " ++#~ "your sim card!" ++#~ msgstr "" ++#~ "Bảo đảm rằng bạn cung cấp pin code chính xác ở đây hoặc sim card của bạn " ++#~ "sẽ bị khóa" ++ ++#~ msgid "" ++#~ "Most of them are network servers, that offer a certain service for your " ++#~ "device or network like shell access, serving webpages like LuCI, doing mesh routing, sending " ++#~ "e-mails, ..." ++#~ msgstr "" ++#~ "Äa số các mạng server mà cung cấp má»™t service nhất định cho công cụ của " ++#~ "bạn hoặc mạng nhÆ° shell access, phục vụ các trang web nhÆ° LuCI, làm lÆ°á»›i định tuyến, gá»­i e-" ++#~ "mail, ..." ++ ++#~ msgid "Number of failed connection tests to initiate automatic reconnect" ++#~ msgstr "Kiểm tra số lượng kết nối không thành công để tá»± Ä‘á»™ng kết nối lại. " ++ ++#~ msgid "PIN code" ++#~ msgstr "PIN code" ++ ++#~ msgid "PPP Settings" ++#~ msgstr "Cài đặt " ++ ++#~ msgid "Package lists" ++#~ msgstr "Danh sách đóng gói" ++ ++#~ msgid "Proceed reverting all settings and resetting to firmware defaults?" ++#~ msgstr "Tiến trình này sẽ chuyển má»i thiết lập vá» firmware mặc định" ++ ++#~ msgid "Processor" ++#~ msgstr "Bá»™ xá»­ lý" ++ ++#~ msgid "Radius-Port" ++#~ msgstr "Radius-Port" ++ ++#~ msgid "Radius-Server" ++#~ msgstr "Radius-Server" ++ ++#~ msgid "Replace default route" ++#~ msgstr "Thay thế route mặc định" ++ ++#~ msgid "Reset router to defaults" ++#~ msgstr "Äặt lại bá»™ định tuyến ở chế Ä‘á»™ mặc định" ++ ++#~ msgid "" ++#~ "Seconds to wait for the modem to become ready before attempting to connect" ++#~ msgstr "Giây để chá» cho modem trở nên sẵn sàng trÆ°á»›c khi kết nối" ++ ++#~ msgid "Service type" ++#~ msgstr "Service type" ++ ++#~ msgid "Services and daemons perform certain tasks on your device." ++#~ msgstr "" ++#~ "Services và daemons tiến hành nhÆ°ng công Ä‘oạn nhất định trên công cụ của " ++#~ "bạn" ++ ++#~ msgid "Settings" ++#~ msgstr "Cài đặt " ++ ++#~ msgid "Setup wait time" ++#~ msgstr "Cài đặt thá»i gian chá»" ++ ++#~ msgid "" ++#~ "Sorry. OpenWrt does not support a system upgrade on this platform.
    " ++#~ "You need to manually flash your device." ++#~ msgstr "" ++#~ "Xin lỗi. OpenWrt không hỗ trợ nâng cấp hệ thống trên platform này.
    " ++#~ "Bạn cần tá»± flash thiết bị của bạn. " ++ ++#~ msgid "Specify additional command line arguments for pppd here" ++#~ msgstr "Chỉ định những dòng lệnh tranh cãi cho pppd ở đây" ++ ++#~ msgid "The device node of your modem, e.g. /dev/ttyUSB0" ++#~ msgstr "Thiết bị node của modem, e.g. /dev/ttyUSB0" ++ ++#~ msgid "Time (in seconds) after which an unused connection will be closed" ++#~ msgstr "Thá»i gian (giây) sau khi má»™t kết nối không sá»­ dụng sẽ bị đóng" ++ ++#~ msgid "Update package lists" ++#~ msgstr "Cập nhật danh sách gói" ++ ++#~ msgid "Upload an OpenWrt image file to reflash the device." ++#~ msgstr "Tải má»™t tập tin hình ảnh OpenWrt để reflash thiết bị." ++ ++#~ msgid "Upload image" ++#~ msgstr "Tải hình ảnh" ++ ++#~ msgid "Use peer DNS" ++#~ msgstr "Dùng peer DNS" ++ ++#~ msgid "" ++#~ "You need to install \"comgt\" for UMTS/GPRS, \"ppp-mod-pppoe\" for PPPoE, " ++#~ "\"ppp-mod-pppoa\" for PPPoA or \"pptp\" for PPtP support" ++#~ msgstr "" ++#~ "Bạn cần cài đặt &quot;comgt&quot; for UMTS/GPRS, &quot;ppp-" ++#~ "mod-pppoe&quot; for PPPoE, &quot;ppp-mod-pppoa&quot; for " ++#~ "PPPoA or &quot;pptp&quot; for PPtP support" ++ ++#~ msgid "back" ++#~ msgstr "quay lại" ++ ++#~ msgid "buffered" ++#~ msgstr "buffered" ++ ++#~ msgid "cached" ++#~ msgstr "cached" ++ ++#~ msgid "free" ++#~ msgstr "free" ++ ++#~ msgid "static" ++#~ msgstr "thống kê" ++ ++#~ msgid "" ++#~ "LuCI is a collection " ++#~ "of free Lua software including an MVC-Webframework and webinterface for embedded devices. LuCI is licensed under the " ++#~ "Apache-License." ++#~ msgstr "" ++#~ "LuCI là má»™t tập hợp của " ++#~ "phần má»m Lua bao gồm MVC-" ++#~ "Công cụ Web và giao diện Web cho thiết bị nhúng. LuCI được lÆ°u hành dÆ°á»›i giấy phép Apache." ++ ++#~ msgid "SSH-Keys" ++#~ msgstr "SSH-Phím" ++ ++#~ msgid "" ++#~ "A lightweight HTTP/1.1 webserver written in C and Lua designed to serve " ++#~ "LuCI" ++#~ msgstr "" ++#~ "Má»™t lightÆ°eight HTTP/1.1 webserver viết bằng C và Lúa được thiết kế để " ++#~ "phục vụ LuCI" ++ ++#~ msgid "" ++#~ "A small webserver which can be used to serve LuCI." ++#~ msgstr "" ++#~ "Má»™t webserver nhá» có thể dùng để phục vụ LuCI." ++ ++#~ msgid "About" ++#~ msgstr "Vá»" ++ ++#~ msgid "Addresses" ++#~ msgstr "Äịa chỉ" ++ ++#~ msgid "Admin Password" ++#~ msgstr "Mật khẩu quản lí" ++ ++#~ msgid "Alias" ++#~ msgstr "Bí danh" ++ ++#~ msgid "Authentication Realm" ++#~ msgstr "Realm xác định" ++ ++#~ msgid "Bridge Port" ++#~ msgstr "Cổng cầu nối" ++ ++#~ msgid "" ++#~ "Change the password of the system administrator (User root)" ++#~ msgstr "Thay đổi mật mã của quản lí hệ thống (User root)" ++ ++#~ msgid "Client + WDS" ++#~ msgstr "Äối tượng + WDS" ++ ++#~ msgid "Configuration file" ++#~ msgstr "Tập tin cấu hình" ++ ++#~ msgid "Connection timeout" ++#~ msgstr "Kết nối dừng" ++ ++#~ msgid "Contributing Developers" ++#~ msgstr "Phát triển viên" ++ ++#~ msgid "DHCP assigned" ++#~ msgstr "Gán DHCP" ++ ++#~ msgid "Document root" ++#~ msgstr "Gốc tài liệu " ++ ++#~ msgid "Enable Keep-Alive" ++#~ msgstr "Kích hoạt Keep-Alive" ++ ++#~ msgid "Ethernet Bridge" ++#~ msgstr "Cầu nối ethernet" ++ ++#~ msgid "" ++#~ "Here you can paste public SSH-Keys " ++#~ "(one per line) for SSH public-key " ++#~ "authentication." ++#~ msgstr "" ++#~ "ở đây bạn có thể dán công khai SSH-" ++#~ "Keys (má»—i cái má»™t dòng) for SSH xác " ++#~ "thá»±c khóa công khai" ++ ++#~ msgid "ID" ++#~ msgstr "ID" ++ ++#~ msgid "IP Configuration" ++#~ msgstr "Cấu hình IP" ++ ++#~ msgid "Interface Status" ++#~ msgstr "Tình trạng giao diện" ++ ++#~ msgid "Lead Development" ++#~ msgstr "Dẫn đầu phát triển" ++ ++#~ msgid "Master" ++#~ msgstr "Chủ" ++ ++#~ msgid "Master + WDS" ++#~ msgstr "Chủ + WDS" ++ ++#~ msgid "Not configured" ++#~ msgstr "Không định cấu hình" ++ ++#~ msgid "Password successfully changed" ++#~ msgstr "Mật mã đã thay đổi thành công" ++ ++#~ msgid "Plugin path" ++#~ msgstr "ÄÆ°á»ng dẫn Plugin" ++ ++#~ msgid "Ports" ++#~ msgstr "Cá»­a" ++ ++#~ msgid "Primary" ++#~ msgstr "Chính" ++ ++#~ msgid "Project Homepage" ++#~ msgstr "Trang chủ dá»± án" ++ ++#~ msgid "Pseudo Ad-Hoc" ++#~ msgstr "Pseudo Ad-Hoc" ++ ++#~ msgid "STP" ++#~ msgstr "STP" ++ ++#~ msgid "Thanks To" ++#~ msgstr "Cám Æ¡n" ++ ++#~ msgid "" ++#~ "The realm which will be displayed at the authentication prompt for " ++#~ "protected pages." ++#~ msgstr "" ++#~ "Realm đó sẽ được hiển thị tại dấu nhắc xác thá»±c cho các trang web được " ++#~ "bảo vệ." ++ ++#~ msgid "Unknown Error" ++#~ msgstr "Không hiểu lá»—i" ++ ++#~ msgid "VLAN" ++#~ msgstr "VLAN" ++ ++#~ msgid "defaults to /etc/httpd.conf" ++#~ msgstr "Mặc định tá»›i /etc/httpd.conf" ++ ++#~ msgid "Package lists updated" ++#~ msgstr "Danh sách gói đã được cập nhật" ++ ++#~ msgid "Upgrade installed packages" ++#~ msgstr "nâng cấp gói cài đặt" ++ ++#~ msgid "" ++#~ "Also kernel or service logfiles can be viewed here to get an overview " ++#~ "over their current state." ++#~ msgstr "" ++#~ "Kernel hoặc service logfiles cÅ©ng có thể được view ở đây để lấy tầm nhìn " ++#~ "tổng quát của hình trạng hiện tại. " ++ ++#~ msgid "" ++#~ "Here you can find information about the current system status like CPU clock frequency, memory " ++#~ "usage or network interface data." ++#~ msgstr "" ++#~ "Ở đây bạn có thể tìm thấy thông tin vá» tình trạng của hệ thống hiện hành " ++#~ "nhÆ° là CPU đồng hồ tần số, " ++#~ "bá»™ nhá»› hoặc mạng lÆ°á»›i dữ liệu giao diện." ++ ++#~ msgid "Search file..." ++#~ msgstr "Tìm tập tin..." ++ ++#~ msgid "" ++#~ "LuCI is a free, " ++#~ "flexible, and user friendly graphical interface for configuring OpenWrt " ++#~ "Kamikaze." ++#~ msgstr "" ++#~ "LuCI thì miá»…n phí, Ä‘a " ++#~ "dạng , và đồ há»a thân thiện vá»›i sá»­ dụng cho các cấu hình OpenWrt Kamikaze." ++ ++#~ msgid "And now have fun with your router!" ++#~ msgstr "Và bây giá» hãy bắt đầu chÆ¡i vá»›i bá»™ định tuyến của bạn!" ++ ++#~ msgid "" ++#~ "As we always want to improve this interface we are looking forward to " ++#~ "your feedback and suggestions." ++#~ msgstr "" ++#~ "Vì chúng tôi luôn muốn cải thiện giao diện này, chúng tôi hy vá»ng nhận " ++#~ "được đóng góp và ý kiến của các bạn. " ++ ++#~ msgid "Hello!" ++#~ msgstr "Xin chào" ++ ++#~ msgid "" ++#~ "Notice: In LuCI " ++#~ "changes have to be confirmed by clicking Changes - Save & Apply " ++#~ "before being applied." ++#~ msgstr "" ++#~ "Ghi chú: Trong LuCI những " ++#~ "thay đổi phải được xác nhận bằng cách nhấn vào Changes - Save & Ãp " ++#~ "dụng trÆ°á»›c khi được áp dụng." ++ ++#~ msgid "" ++#~ "On the following pages you can adjust all important settings of your " ++#~ "router." ++#~ msgstr "" ++#~ "Ở những trang kế tiếp, bạn có thể thay đổi những cài đặt quan trong của " ++#~ "bá»™ định tuyến." ++ ++#~ msgid "The LuCI Team" ++#~ msgstr "Nhóm LuCI " ++ ++#~ msgid "" ++#~ "This is the administration area of LuCI." ++#~ msgstr "" ++#~ "Äây là vùng quản trị của LuCI." ++ ++#~ msgid "User Interface" ++#~ msgstr "Giao diện ngÆ°á»i sá»­ dụng" ++ ++#~ msgid "enable" ++#~ msgstr "Kích hoạt" ++ ++#, fuzzy ++#~ msgid "(optional)" ++#~ msgstr "" ++#~ " \n" ++#~ "(tùy ý)" ++ ++#~ msgid "DNS-Port" ++#~ msgstr "DNS-Cổng" ++ ++#~ msgid "" ++#~ "DNS-Server will be queried in " ++#~ "the order of the resolvfile" ++#~ msgstr "" ++#~ "DNS-Server sẽ bị tra vấn theo " ++#~ "thứ tá»± của tập tin resolv. " ++ ++#~ msgid "" ++#~ "max. DHCP-Leases" ++#~ msgstr "" ++#~ "max. DHCP-Leases" ++ ++#~ msgid "" ++#~ "max. EDNS0 packet size" ++#~ msgstr "" ++#~ "max. EDNS0 dung lượng gói tin" ++ ++#~ msgid "AP-Isolation" ++#~ msgstr "AP-Isolation" ++ ++#~ msgid "Add the Wifi network to physical network" ++#~ msgstr "Thêm mạng Wifi vào màng vật lý" ++ ++#~ msgid "Aliases" ++#~ msgstr "Aliases" ++ ++#~ msgid "Clamp Segment Size" ++#~ msgstr "Clamp Segment Size" ++ ++#, fuzzy ++#~ msgid "Create Or Attach Network" ++#~ msgstr "Tạo network" ++ ++#~ msgid "Devices" ++#~ msgstr "Những công cụ" ++ ++#~ msgid "Don't forward reverse lookups for local networks" ++#~ msgstr "Don&#39;t chuyển tiếp lookups đảo ngược cho các mạng địa phÆ°Æ¡ng" ++ ++#~ msgid "Enable TFTP-Server" ++#~ msgstr "Kích hoạt TFTP-Server" ++ ++#~ msgid "Errors" ++#~ msgstr "Lá»—i" ++ ++#~ msgid "Essentials" ++#~ msgstr "Essentials" ++ ++#~ msgid "Expand Hosts" ++#~ msgstr "Mở rá»™ng Hosts" ++ ++#~ msgid "First leased address" ++#~ msgstr "Äịa chỉ lease đầu tiên" ++ ++#~ msgid "" ++#~ "Fixes problems with unreachable websites, submitting forms or other " ++#~ "unexpected behaviour for some ISPs." ++#~ msgstr "" ++#~ "Chỉnh sá»­a vấn Ä‘á» vá»›i những website không tiếp cận được, trình form hoặc " ++#~ "những hình thức bất ngá» cho má»™t vài ISP." ++ ++#~ msgid "Hardware Address" ++#~ msgstr "Äịa chỉ phần cứng" ++ ++#~ msgid "Here you can configure installed wifi devices." ++#~ msgstr "Ở đây bạn có thể định cấu hình của công cụ wifi được cài đặt." ++ ++#~ msgid "Ignore /etc/hosts" ++#~ msgstr "Lá» Ä‘i /etc/hosts" ++ ++#~ msgid "Independent (Ad-Hoc)" ++#~ msgstr "Äá»™c lập (Ad-Hoc)" ++ ++#~ msgid "Internet Connection" ++#~ msgstr "Kết nối Internet" ++ ++#~ msgid "Join (Client)" ++#~ msgstr "Tham gia (client)" ++ ++#~ msgid "Leases" ++#~ msgstr "Leases" ++ ++#~ msgid "Local Domain" ++#~ msgstr "Domain địa phÆ°Æ¡ng" ++ ++#~ msgid "Local Network" ++#~ msgstr "Network địa phÆ°Æ¡ng" ++ ++#~ msgid "Local Server" ++#~ msgstr "Server địa phÆ°Æ¡ng" ++ ++#~ msgid "Network Boot Image" ++#~ msgstr "Hình ảnh khởi Ä‘á»™ng mạng lÆ°á»›i" ++ ++#~ msgid "" ++#~ "Network Name (ESSID)" ++#~ msgstr "" ++#~ "Tên mạng (ESSID)" ++ ++#~ msgid "Number of leased addresses" ++#~ msgstr "Số của địa chỉ lease" ++ ++#~ msgid "Perform Actions" ++#~ msgstr "Trình bày hành Ä‘á»™ng" ++ ++#~ msgid "Prevents Client to Client communication" ++#~ msgstr "Ngăn chặn giao tiếp giữa client-và-client" ++ ++#~ msgid "Provide (Access Point)" ++#~ msgstr "Cung cấp (Äiểm truy cập)" ++ ++#~ msgid "Resolvfile" ++#~ msgstr "Tập tin Resolv" ++ ++#~ msgid "TFTP-Server Root" ++#~ msgstr "Gốc TFTP-Server " ++ ++#~ msgid "TX / RX" ++#~ msgstr "TX / RX" ++ ++#~ msgid "The following changes have been applied" ++#~ msgstr "Những thay đổi sau đây đã được tiến hành" ++ ++#~ msgid "" ++#~ "When flashing a new firmware with LuCI these files will be added to the new firmware " ++#~ "installation." ++#~ msgstr "" ++#~ "Khi truyá»n đến phần cứng vá»›i LuCI Những tập tin này sẽ được bổ sung vào cài đặt phần cứng " ++#~ "má»›i." ++ ++#, fuzzy ++#~ msgid "Wireless Scan" ++#~ msgstr "Mạng không dây" ++ ++#~ msgid "" ++#~ "With DHCP " ++#~ "network members can automatically receive their network settings (IP-address, netmask, DNS-server, ...)." ++#~ msgstr "" ++#~ "Vá»›i DHCP thành " ++#~ "viên network có thể tá»± Ä‘á»™ng nhận cài đặt mạng (IP-address, netmask, DNS-server, ...)." ++ ++#~ msgid "" ++#~ "You can run several wifi networks with one device. Be aware that there " ++#~ "are certain hardware and driverspecific restrictions. Normally you can " ++#~ "operate 1 Ad-Hoc or up to 3 Master-Mode and 1 Client-Mode network " ++#~ "simultaneously." ++#~ msgstr "" ++#~ "Bạn có thể chạy nhiá»u mạng wifi vá»›i má»™t công cụ. Hãy chú ý rằng má»™t số " ++#~ "phần cứng và driverspecific bị hạn chế. Thông thÆ°á»ng, bạn có thể vận hành " ++#~ "1 Ad-Hoc hay tối Ä‘a là 3-chế Ä‘á»™ master và 1-chế Ä‘á»™ client mạng lÆ°á»›i cùng " ++#~ "má»™t lúc." ++ ++#~ msgid "" ++#~ "You need to install \"ppp-mod-pppoe\" for PPPoE or \"pptp\" for PPtP " ++#~ "support" ++#~ msgstr "" ++#~ "Bạn cần cài đặt &quot;ppp-mod-pppoe&quot; for PPPoE or &quot;" ++#~ "pptp&quot; cho há»— trợ PPtP " ++ ++#~ msgid "Zone" ++#~ msgstr "Zone" ++ ++#~ msgid "additional hostfile" ++#~ msgstr "Tập tin host bổ sung" ++ ++#~ msgid "adds domain names to hostentries in the resolv file" ++#~ msgstr "Thêm tên miá»n vào hostentries trong tập tin resolv " ++ ++#~ msgid "automatically reconnect" ++#~ msgstr "Tá»± Ä‘á»™ng kết nối lại" ++ ++#~ msgid "concurrent queries" ++#~ msgstr "Äồng truy vấn" ++ ++#~ msgid "" ++#~ "disable DHCP " ++#~ "for this interface" ++#~ msgstr "" ++#~ "Vô hiệu hóa DHCP cho giao diện này" ++ ++#~ msgid "disconnect when idle for" ++#~ msgstr "Ngừng kết nối khi idle cho" ++ ++#~ msgid "don't cache unknown" ++#~ msgstr "don&#39;t cache unknown" ++ ++#~ msgid "" ++#~ "filter useless DNS-queries of " ++#~ "Windows-systems" ++#~ msgstr "" ++#~ "lá»c không hữu dụng DNS-các tra " ++#~ "vấn của hệ thống Windows" ++ ++#~ msgid "installed" ++#~ msgstr "Äã cài đặt " ++ ++#~ msgid "localises the hostname depending on its subnet" ++#~ msgstr "Äịa phÆ°Æ¡ng hóa các hostname phụ thuá»™c vào subnet" ++ ++#~ msgid "not installed" ++#~ msgstr "không cài đặt " ++ ++#~ msgid "" ++#~ "prevents caching of negative DNS-replies" ++#~ msgstr "" ++#~ "Ngăn ngừa tiêu cá»±c trong bá»™ nhá»› đệm DNS-trả lá»i" ++ ++#~ msgid "query port" ++#~ msgstr "cổng truy vấn" ++ ++#~ msgid "transmitted / received" ++#~ msgstr "Äã truyá»n/ đã nhận" ++ ++#, fuzzy ++#~ msgid "Join network" ++#~ msgstr "contained networks" ++ ++#~ msgid "all" ++#~ msgstr "tất cả" ++ ++#~ msgid "Code" ++#~ msgstr "Mã" ++ ++#~ msgid "Distance" ++#~ msgstr "Khoảng cách " ++ ++#~ msgid "Legend" ++#~ msgstr "Legend" ++ ++#~ msgid "Library" ++#~ msgstr "thÆ° viện " ++ ++#~ msgid "see '%s' manpage" ++#~ msgstr "xem &#39;%s&#39; trang chính" ++ ++#~ msgid "Package Manager" ++#~ msgstr "Quản lí gói" ++ ++#~ msgid "Service" ++#~ msgstr "Dịch vụ " ++ ++#~ msgid "Statistics" ++#~ msgstr "Thống kê" ++ ++#~ msgid "zone" ++#~ msgstr "Zone" +diff --git a/feeds/luci/modules/luci-base/po/zh-cn/base.po b/feeds/luci/modules/luci-base/po/zh-cn/base.po +new file mode 100644 +index 0000000..72bf937 +--- /dev/null ++++ b/feeds/luci/modules/luci-base/po/zh-cn/base.po +@@ -0,0 +1,4117 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: \n" ++"Report-Msgid-Bugs-To: \n" ++"POT-Creation-Date: 2009-12-21 23:08+0200\n" ++"PO-Revision-Date: 2015-04-23 13:49+0800\n" ++"Last-Translator: GuoGuo \n" ++"Language: zh_CN\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=1; plural=0;\n" ++"X-Generator: Poedit 1.7.5\n" ++ ++msgid "(%d minute window, %d second interval)" ++msgstr "(%d分钟信æ¯ï¼Œ%d秒刷新)" ++ ++msgid "(%s available)" ++msgstr "(%s å¯ç”¨)" ++ ++msgid "(empty)" ++msgstr "(空)" ++ ++msgid "(no interfaces attached)" ++msgstr "(未连接接å£)" ++ ++msgid "-- Additional Field --" ++msgstr "-- 更多选项 --" ++ ++msgid "-- Please choose --" ++msgstr "-- 请选择 --" ++ ++msgid "-- custom --" ++msgstr "-- 自定义 --" ++ ++msgid "-- match by device --" ++msgstr "-- æ ¹æ®è®¾å¤‡åŒ¹é… --" ++ ++msgid "-- match by label --" ++msgstr "-- æ ¹æ®æ ‡ç­¾åŒ¹é… --" ++ ++msgid "1 Minute Load:" ++msgstr "1分钟负载:" ++ ++msgid "15 Minute Load:" ++msgstr "15分钟负载:" ++ ++msgid "5 Minute Load:" ++msgstr "5分钟负载:" ++ ++msgid "BSSID" ++msgstr "BSSID" ++ ++msgid "DNS query port" ++msgstr "DNS 查询端å£" ++ ++msgid "DNS server port" ++msgstr "DNS æœåŠ¡å™¨ç«¯å£" ++ ++msgid "" ++"DNS servers will be queried in the " ++"order of the resolvfile" ++msgstr "将会按照指定的顺åºæŸ¥è¯¢DNS" ++ ++msgid "ESSID" ++msgstr "ESSID" ++ ++msgid "IPv4-Address" ++msgstr "IPv4-地å€" ++ ++msgid "IPv4-Gateway" ++msgstr "IPv4-网关" ++ ++msgid "IPv4-Netmask" ++msgstr "IPv4-å­ç½‘掩ç " ++ ++msgid "" ++"IPv6-Address or Network " ++"(CIDR)" ++msgstr "" ++"IPv6-地å€æˆ–超网() (CIDR)" ++ ++msgid "IPv6-Gateway" ++msgstr "IPv6-网关" ++ ++msgid "IPv6-Suffix (hex)" ++msgstr "" ++"IPv6-åŽç¼€ï¼ˆå六进制)" ++ ++msgid "LED Configuration" ++msgstr "LEDé…ç½®" ++ ++msgid "LED Name" ++msgstr "LEDå称" ++ ++msgid "MAC-Address" ++msgstr "MAC-地å€" ++ ++msgid "" ++"Max. DHCP leases" ++msgstr "" ++"最大DHCP分é…æ•°é‡" ++ ++msgid "" ++"Max. EDNS0 packet size" ++msgstr "最大EDNS0æ•°æ®åŒ…大å°" ++ ++msgid "Max. concurrent queries" ++msgstr "最大并å‘查询数" ++ ++msgid "%s - %s" ++msgstr "%s - %s" ++ ++msgid "ADSL" ++msgstr "ADSL" ++ ++msgid "ADSL Status" ++msgstr "ADSL状æ€" ++ ++msgid "AICCU (SIXXS)" ++msgstr "" ++ ++msgid "APN" ++msgstr "APN" ++ ++msgid "AR Support" ++msgstr "AR支æŒ" ++ ++msgid "ARP retry threshold" ++msgstr "ARPé‡è¯•é˜ˆå€¼" ++ ++msgid "ATM Bridges" ++msgstr "ATM桥接" ++ ++msgid "ATM Virtual Channel Identifier (VCI)" ++msgstr "ATM虚拟通é“标识(VCI)" ++ ++msgid "ATM Virtual Path Identifier (VPI)" ++msgstr "ATM虚拟路径标识(VPI)" ++ ++msgid "" ++"ATM bridges expose encapsulated ethernet in AAL5 connections as virtual " ++"Linux network interfaces which can be used in conjunction with DHCP or PPP " ++"to dial into the provider network." ++msgstr "" ++"ATM桥是以AAL5åè®®å°è£…以太网的虚拟Linux网桥,用于ååŒDHCP或PPPæ¥æ‹¨å·è¿žæŽ¥åˆ°ç½‘络" ++"è¿è¥å•†ã€‚" ++ ++msgid "ATM device number" ++msgstr "ATM设备å·ç " ++ ++msgid "AYIYA" ++msgstr "" ++ ++msgid "Access Concentrator" ++msgstr "接入集中器" ++ ++msgid "Access Point" ++msgstr "接入点AP" ++ ++msgid "Action" ++msgstr "动作" ++ ++msgid "Actions" ++msgstr "动作" ++ ++msgid "Activate this network" ++msgstr "激活此网络" ++ ++msgid "Active IPv4-Routes" ++msgstr "活动的IPv4-链路" ++ ++msgid "Active IPv6-Routes" ++msgstr "活动的IPv6-链路" ++ ++msgid "Active Connections" ++msgstr "活动连接" ++ ++msgid "Active DHCP Leases" ++msgstr "已分é…çš„DHCP租约" ++ ++msgid "Active DHCPv6 Leases" ++msgstr "已分é…çš„DHCPv6租约" ++ ++msgid "Ad-Hoc" ++msgstr "点对点Ad-Hoc" ++ ++msgid "Add" ++msgstr "添加" ++ ++msgid "Add local domain suffix to names served from hosts files" ++msgstr "添加本地域ååŽç¼€åˆ°HOSTS文件中的域å" ++ ++msgid "Add new interface..." ++msgstr "添加新接å£..." ++ ++msgid "Additional Hosts files" ++msgstr "é¢å¤–çš„HOSTS文件" ++ ++msgid "Address" ++msgstr "地å€" ++ ++msgid "Address to access local relay bridge" ++msgstr "接入本地中继桥的地å€" ++ ++msgid "Administration" ++msgstr "管ç†æƒ" ++ ++msgid "Advanced Settings" ++msgstr "高级设置" ++ ++msgid "Alert" ++msgstr "警戒" ++ ++msgid "Allow SSH password authentication" ++msgstr "å…许SSH密ç éªŒè¯" ++ ++msgid "Allow all except listed" ++msgstr "ä»…å…许列表外" ++ ++msgid "Allow listed only" ++msgstr "ä»…å…许列表内" ++ ++msgid "Allow localhost" ++msgstr "å…许本机" ++ ++msgid "Allow remote hosts to connect to local SSH forwarded ports" ++msgstr "å…许远程主机连接到本地SSH转å‘端å£" ++ ++msgid "Allow root logins with password" ++msgstr "rootæƒé™ç™»å½•" ++ ++msgid "Allow the root user to login with password" ++msgstr "å…许root用户凭密ç ç™»å½•" ++ ++msgid "" ++"Allow upstream responses in the 127.0.0.0/8 range, e.g. for RBL services" ++msgstr "å…许127.0.0.0/8回环范围内的上行å“应,例如:RBLæœåŠ¡" ++ ++msgid "" ++"Also see Tunneling Comparison on SIXXS" ++msgstr "" ++"也请查看SIXXS上的Tunneling Comparison " ++ ++msgid "Always announce default router" ++msgstr "总是广播默认路由" ++ ++msgid "An additional network will be created if you leave this unchecked." ++msgstr "å–消选中将会å¦å¤–创建一个新网络,而ä¸ä¼šè¦†ç›–当å‰ç½‘络设置" ++ ++msgid "Announce as default router even if no public prefix is available." ++msgstr "å³ä½¿æ²¡æœ‰å¯ç”¨çš„公共å‰ç¼€ä¹Ÿå¹¿æ’­é»˜è®¤è·¯ç”±" ++ ++msgid "Announced DNS domains" ++msgstr "广播的DNS域å" ++ ++msgid "Announced DNS servers" ++msgstr "广播的DNSæœåŠ¡å™¨" ++ ++msgid "Antenna 1" ++msgstr "天线 1" ++ ++msgid "Antenna 2" ++msgstr "天线 2" ++ ++msgid "Antenna Configuration" ++msgstr "天线é…ç½®" ++ ++msgid "Any zone" ++msgstr "ä»»æ„区域" ++ ++msgid "Apply" ++msgstr "应用" ++ ++msgid "Applying changes" ++msgstr "正在应用更改" ++ ++msgid "" ++"Assign a part of given length of every public IPv6-prefix to this interface" ++msgstr "ç»™æ¯ä¸ªå…¬å…±IPv6å‰ç¼€åˆ†é…指定长度的固定部分" ++ ++msgid "Assign interfaces..." ++msgstr "分é…接å£..." ++ ++msgid "" ++"Assign prefix parts using this hexadecimal subprefix ID for this interface." ++msgstr "" ++ ++msgid "Associated Stations" ++msgstr "已连接站点" ++ ++msgid "Atheros 802.11%s Wireless Controller" ++msgstr "Qualcomm/Atheros 802.11%s 无线网å¡" ++ ++msgid "AuthGroup" ++msgstr "认è¯ç»„" ++ ++msgid "Authentication" ++msgstr "认è¯" ++ ++msgid "Authoritative" ++msgstr "授æƒçš„唯一DHCPæœåŠ¡å™¨" ++ ++msgid "Authorization Required" ++msgstr "需è¦æŽˆæƒ" ++ ++msgid "Auto Refresh" ++msgstr "自动刷新" ++ ++msgid "Automatic" ++msgstr "自动" ++ ++msgid "Automatic Homenet (HNCP)" ++msgstr "自动家庭网络(HNCP)" ++ ++msgid "Available" ++msgstr "å¯ç”¨" ++ ++msgid "Available packages" ++msgstr "å¯ç”¨è½¯ä»¶åŒ…" ++ ++msgid "Average:" ++msgstr "å¹³å‡:" ++ ++msgid "BSSID" ++msgstr "BSSID" ++ ++msgid "Back" ++msgstr "返回" ++ ++msgid "Back to Overview" ++msgstr "返回至概况" ++ ++msgid "Back to configuration" ++msgstr "返回至é…ç½®" ++ ++msgid "Back to overview" ++msgstr "返回至概况" ++ ++msgid "Back to scan results" ++msgstr "返回至扫æ结果" ++ ++msgid "Background Scan" ++msgstr "åŽå°æœç´¢" ++ ++msgid "Backup / Flash Firmware" ++msgstr "备份/å‡çº§" ++ ++msgid "Backup / Restore" ++msgstr "备份/æ¢å¤" ++ ++msgid "Backup file list" ++msgstr "文件备份列表" ++ ++msgid "Bad address specified!" ++msgstr "指定了错误的地å€ï¼" ++ ++msgid "Band" ++msgstr "频宽" ++ ++msgid "Behind NAT" ++msgstr "在NAT网络内" ++ ++msgid "" ++"Below is the determined list of files to backup. It consists of changed " ++"configuration files marked by opkg, essential base files and the user " ++"defined backup patterns." ++msgstr "" ++"下é¢æ˜¯å¾…备份的文件清å•ã€‚包å«äº†æ›´æ”¹çš„é…置文件ã€å¿…è¦çš„基础文件和用户自定义的需" ++"备份文件。" ++ ++msgid "Bitrate" ++msgstr "传输速率" ++ ++msgid "Bogus NX Domain Override" ++msgstr "忽略虚å‡ç©ºåŸŸå解æž" ++ ++msgid "Bridge" ++msgstr "桥接" ++ ++msgid "Bridge interfaces" ++msgstr "桥接接å£" ++ ++msgid "Bridge unit number" ++msgstr "桥接å·" ++ ++msgid "Bring up on boot" ++msgstr "开机自动è¿è¡Œ" ++ ++msgid "Broadcom 802.11%s Wireless Controller" ++msgstr "Broadcom 802.11%s 无线网å¡" ++ ++msgid "Broadcom BCM%04x 802.11 Wireless Controller" ++msgstr "Broadcom BCM%04x 802.11 无线网å¡" ++ ++msgid "Buffered" ++msgstr "已缓冲" ++ ++msgid "Buttons" ++msgstr "按键" ++ ++msgid "CA certificate; if empty it will be saved after the first connection." ++msgstr "CAè¯ä¹¦.如果留空的è¯è¯ä¹¦å°†åœ¨ç¬¬ä¸€æ¬¡è¿žæŽ¥æ—¶è¢«ä¿å­˜." ++ ++msgid "CPU" ++msgstr "CPU" ++ ++msgid "CPU usage (%)" ++msgstr "CPU使用率(%)" ++ ++msgid "Cancel" ++msgstr "å–消" ++ ++msgid "Category" ++msgstr "分类" ++ ++msgid "Chain" ++msgstr "链" ++ ++msgid "Changes" ++msgstr "修改数" ++ ++msgid "Changes applied." ++msgstr "更改已应用" ++ ++msgid "Changes the administrator password for accessing the device" ++msgstr "修改访问设备的管ç†å‘˜å¯†ç " ++ ++msgid "Channel" ++msgstr "ä¿¡é“" ++ ++msgid "Check" ++msgstr "检查" ++ ++msgid "Checksum" ++msgstr "校验值" ++ ++msgid "" ++"Choose the firewall zone you want to assign to this interface. Select " ++"unspecified to remove the interface from the associated zone or " ++"fill out the create field to define a new zone and attach the " ++"interface to it." ++msgstr "此接å£çš„防ç«å¢™åŒºåŸŸã€‚填写创建æ å¯æ–°å»ºé˜²ç«å¢™åŒºåŸŸã€‚" ++ ++msgid "" ++"Choose the network(s) you want to attach to this wireless interface or fill " ++"out the create field to define a new network." ++msgstr "选择指派到此无线接å£çš„网络。填写创建æ å¯æ–°å»ºç½‘络。" ++ ++msgid "Cipher" ++msgstr "算法" ++ ++msgid "" ++"Click \"Generate archive\" to download a tar archive of the current " ++"configuration files. To reset the firmware to its initial state, click " ++"\"Perform reset\" (only possible with squashfs images)." ++msgstr "备份/æ¢å¤å½“å‰ç³»ç»Ÿé…置文件或é‡ç½®OpenWrt(ä»…squashfs固件有效)。" ++ ++msgid "Client" ++msgstr "客户端Client" ++ ++msgid "Client ID to send when requesting DHCP" ++msgstr "请求DHCPæ—¶å‘é€çš„客户ID" ++ ++msgid "" ++"Close inactive connection after the given amount of seconds, use 0 to " ++"persist connection" ++msgstr "定时关闭éžæ´»åŠ¨é“¾æŽ¥(秒),0为æŒç»­è¿žæŽ¥" ++ ++msgid "Close list..." ++msgstr "关闭列表..." ++ ++msgid "Collecting data..." ++msgstr "正在收集数æ®..." ++ ++msgid "Command" ++msgstr "进程命令" ++ ++msgid "Common Configuration" ++msgstr "一般设置" ++ ++msgid "Compression" ++msgstr "压缩" ++ ++msgid "Configuration" ++msgstr "é…ç½®" ++ ++msgid "Configuration applied." ++msgstr "é…置已应用" ++ ++msgid "Configuration files will be kept." ++msgstr "é…置文件将被ä¿ç•™ã€‚" ++ ++msgid "Confirmation" ++msgstr "确认密ç " ++ ++msgid "Connect" ++msgstr "连接" ++ ++msgid "Connected" ++msgstr "已连接" ++ ++msgid "Connection Limit" ++msgstr "连接数é™åˆ¶" ++ ++msgid "Connection to server fails when TLS cannot be used" ++msgstr "当TLSä¸å¯ç”¨æ—¶è¿žæŽ¥åˆ°æœåŠ¡å™¨å¤±è´¥" ++ ++msgid "Connections" ++msgstr "链接" ++ ++msgid "Country" ++msgstr "国家" ++ ++msgid "Country Code" ++msgstr "国家代ç " ++ ++msgid "Cover the following interface" ++msgstr "包括以下接å£" ++ ++msgid "Cover the following interfaces" ++msgstr "包括以下接å£" ++ ++msgid "Create / Assign firewall-zone" ++msgstr "创建/åˆ†é… é˜²ç«å¢™åŒºåŸŸ" ++ ++msgid "Create Interface" ++msgstr "创建新接å£" ++ ++msgid "Create a bridge over multiple interfaces" ++msgstr "在多个接å£ä¸Šåˆ›å»ºæ¡¥æŽ¥" ++ ++msgid "Critical" ++msgstr "致命错误" ++ ++msgid "Cron Log Level" ++msgstr "Cron日志级别" ++ ++msgid "Custom Interface" ++msgstr "自定义接å£" ++ ++msgid "Custom delegated IPv6-prefix" ++msgstr "自定义分é…çš„IPv6å‰ç¼€" ++ ++msgid "" ++"Customizes the behaviour of the device LEDs if possible." ++msgstr "自定义LED的活动状æ€ã€‚" ++ ++msgid "DHCP Leases" ++msgstr "DHCP分é…" ++ ++msgid "DHCP Server" ++msgstr "DHCPæœåŠ¡å™¨" ++ ++msgid "DHCP and DNS" ++msgstr "DHCP/DNS" ++ ++msgid "DHCP client" ++msgstr "DHCP客户端" ++ ++msgid "DHCP-Options" ++msgstr "DHCP-选项" ++ ++msgid "DHCPv6 Leases" ++msgstr "DHCPv6分é…" ++ ++msgid "DHCPv6 client" ++msgstr "DHCPv6客户端" ++ ++msgid "DHCPv6-Mode" ++msgstr "DHCPv6模å¼" ++ ++msgid "DHCPv6-Service" ++msgstr "DHCPv6æœåŠ¡" ++ ++msgid "DNS" ++msgstr "DNS" ++ ++msgid "DNS forwardings" ++msgstr "DNS转å‘" ++ ++msgid "DNS-Label / FQDN" ++msgstr "" ++ ++msgid "DS-Lite AFTR address" ++msgstr "" ++ ++msgid "DUID" ++msgstr "DUID(DHCP唯一标识符)" ++ ++msgid "Debug" ++msgstr "调试" ++ ++msgid "Default %d" ++msgstr "默认%d" ++ ++msgid "Default gateway" ++msgstr "默认网关" ++ ++msgid "Default route" ++msgstr "默认路由" ++ ++msgid "Default state" ++msgstr "默认状æ€" ++ ++msgid "Define a name for this network." ++msgstr "为网络定义å称" ++ ++msgid "" ++"Define additional DHCP options, for example " ++"\"6,192.168.2.1,192.168.2.2\" which advertises different DNS " ++"servers to clients." ++msgstr "" ++"设置DHCP的附加选项,例如设定\"6,192.168.2.1,192.168.2.2\"表示通" ++"å‘Šä¸åŒçš„DNSæœåŠ¡å™¨ç»™å®¢æˆ·ç«¯ã€‚" ++ ++msgid "Delete" ++msgstr "删除" ++ ++msgid "Delete this interface" ++msgstr "删除此接å£" ++ ++msgid "Delete this network" ++msgstr "删除此网络" ++ ++msgid "Description" ++msgstr "æè¿°" ++ ++msgid "Design" ++msgstr "主题" ++ ++msgid "Destination" ++msgstr "目标地å€" ++ ++msgid "Device" ++msgstr "设备" ++ ++msgid "Device Configuration" ++msgstr "设备é…ç½®" ++ ++msgid "Diagnostics" ++msgstr "网络诊断" ++ ++msgid "Dial number" ++msgstr "拨å·å·ç " ++ ++msgid "Directory" ++msgstr "目录" ++ ++msgid "Disable" ++msgstr "ç¦ç”¨" ++ ++msgid "" ++"Disable DHCP for " ++"this interface." ++msgstr "" ++"ç¦ç”¨æœ¬æŽ¥å£çš„DHCP。" ++ ++msgid "Disable DNS setup" ++msgstr "åœç”¨DNS设定" ++ ++msgid "Disable HW-Beacon timer" ++msgstr "åœç”¨ HW-Beacon 计时器" ++ ++msgid "Disabled" ++msgstr "ç¦ç”¨" ++ ++msgid "Discard upstream RFC1918 responses" ++msgstr "丢弃RFC1918上行å“应数æ®" ++ ++msgid "Displaying only packages containing" ++msgstr "åªæ˜¾ç¤ºæœ‰å†…容的软件包" ++ ++msgid "Distance Optimization" ++msgstr "è·ç¦»ä¼˜åŒ–" ++ ++msgid "Distance to farthest network member in meters." ++msgstr "最远客户端的è·ç¦»(ç±³)。" ++ ++msgid "Diversity" ++msgstr "分集" ++ ++msgid "" ++"Dnsmasq is a combined DHCP-Server and DNS-" ++"Forwarder for NAT " ++"firewalls" ++msgstr "Dnsmasq为NAT防ç«å¢™æ供了一个集æˆçš„DHCPæœåŠ¡å™¨å’ŒDNS转å‘器" ++ ++msgid "Do not cache negative replies, e.g. for not existing domains" ++msgstr "ä¸ç¼“存无用的回应, 比如:ä¸å­˜åœ¨çš„域。" ++ ++msgid "Do not forward requests that cannot be answered by public name servers" ++msgstr "ä¸è½¬å‘公共域åæœåŠ¡å™¨æ— æ³•å›žåº”的请求" ++ ++msgid "Do not forward reverse lookups for local networks" ++msgstr "ä¸è½¬å‘åå‘查询本地网络的Lookups命令" ++ ++msgid "Do not send probe responses" ++msgstr "ä¸å›žé€æŽ¢æµ‹å“应" ++ ++msgid "Domain required" ++msgstr "忽略空域å解æž" ++ ++msgid "Domain whitelist" ++msgstr "域å白åå•" ++ ++msgid "" ++"Don't forward DNS-Requests without " ++"DNS-Name" ++msgstr "ä¸è½¬å‘没有DNSå称的解æžè¯·æ±‚" ++ ++msgid "Download and install package" ++msgstr "下载并安装软件包" ++ ++msgid "Download backup" ++msgstr "下载备份" ++ ++msgid "Dropbear Instance" ++msgstr "Dropbear设置" ++ ++msgid "" ++"Dropbear offers SSH network shell access " ++"and an integrated SCP server" ++msgstr "" ++"Dropbearæ供了集æˆçš„SCPæœåŠ¡å™¨å’ŒåŸºäºŽSSHçš„shell访问" ++ ++msgid "Dual-Stack Lite (RFC6333)" ++msgstr "" ++ ++msgid "Dynamic DHCP" ++msgstr "动æ€DHCP" ++ ++msgid "Dynamic tunnel" ++msgstr "动æ€éš§é“" ++ ++msgid "" ++"Dynamically allocate DHCP addresses for clients. If disabled, only clients " ++"having static leases will be served." ++msgstr "动æ€åˆ†é…DHCP地å€ã€‚如果ç¦ç”¨ï¼Œåˆ™åªèƒ½ä¸ºé™æ€ç§Ÿç”¨è¡¨ä¸­çš„客户端æ供网络æœåŠ¡ã€‚" ++ ++msgid "EAP-Method" ++msgstr "EAP-Method" ++ ++msgid "Edit" ++msgstr "修改" ++ ++msgid "" ++"Edit the raw configuration data above to fix any error and hit \"Save\" to " ++"reload the page." ++msgstr "" ++ ++msgid "Edit this interface" ++msgstr "修改此接å£" ++ ++msgid "Edit this network" ++msgstr "修改此网络" ++ ++msgid "Emergency" ++msgstr "紧急" ++ ++msgid "Enable" ++msgstr "å¯ç”¨" ++ ++msgid "Enable STP" ++msgstr "å¼€å¯STP" ++ ++msgid "Enable HE.net dynamic endpoint update" ++msgstr "å¯ç”¨HE.net动æ€ç»ˆç«¯æ›´æ–°" ++ ++msgid "Enable IPv6 negotiation on the PPP link" ++msgstr "在PPP链路上å¯ç”¨IPv6å商" ++ ++msgid "Enable Jumbo Frame passthrough" ++msgstr "å¯ç”¨å·¨åž‹å¸§é€ä¼ " ++ ++msgid "Enable NTP client" ++msgstr "å¯ç”¨NTP客户端" ++ ++msgid "Enable TFTP server" ++msgstr "å¯ç”¨TFTPæœåŠ¡å™¨" ++ ++msgid "Enable VLAN functionality" ++msgstr "å¯ç”¨VLAN" ++ ++msgid "Enable WPS pushbutton, requires WPA(2)-PSK" ++msgstr "å¯ç”¨WPS按键é…ç½®.è¦æ±‚使用WPA(2)-PSK" ++ ++msgid "Enable learning and aging" ++msgstr "å¯ç”¨æ™ºèƒ½äº¤æ¢å­¦ä¹ " ++ ++msgid "Enable mirroring of incoming packets" ++msgstr "å¯ç”¨æµå…¥æ•°æ®åŒ…é•œåƒ" ++ ++msgid "Enable mirroring of outgoing packets" ++msgstr "å¯ç”¨æµå‡ºæ•°æ®åŒ…é•œåƒ" ++ ++msgid "Enable this mount" ++msgstr "å¯ç”¨æŒ‚载点" ++ ++msgid "Enable this swap" ++msgstr "å¯ç”¨äº¤æ¢åŒº" ++ ++msgid "Enable/Disable" ++msgstr "å¯ç”¨/ç¦ç”¨" ++ ++msgid "Enabled" ++msgstr "å¯ç”¨" ++ ++msgid "Enables the Spanning Tree Protocol on this bridge" ++msgstr "在此桥接上å¯ç”¨ç”Ÿæˆå议树" ++ ++msgid "Encapsulation mode" ++msgstr "å°è£…模å¼" ++ ++msgid "Encryption" ++msgstr "加密" ++ ++msgid "Erasing..." ++msgstr "擦除中..." ++ ++msgid "Error" ++msgstr "错误" ++ ++msgid "Ethernet Adapter" ++msgstr "以太网适é…器" ++ ++msgid "Ethernet Switch" ++msgstr "以太网交æ¢æœº" ++ ++msgid "Expand hosts" ++msgstr "扩展HOSTS文件中的主机åŽç¼€" ++ ++msgid "Expires" ++msgstr "到期时间" ++ ++#, fuzzy ++msgid "" ++"Expiry time of leased addresses, minimum is 2 minutes (2m)." ++msgstr "地å€ç§ŸæœŸï¼Œæœ€å°2分钟(2m)。" ++ ++msgid "External" ++msgstr "" ++ ++msgid "External system log server" ++msgstr "远程logæœåŠ¡å™¨" ++ ++msgid "External system log server port" ++msgstr "远程logæœåŠ¡å™¨ç«¯å£" ++ ++msgid "Fast Frames" ++msgstr "快速帧" ++ ++msgid "File" ++msgstr "文件" ++ ++msgid "Filename of the boot image advertised to clients" ++msgstr "å‘客户端通告的å¯åŠ¨é•œåƒæ–‡ä»¶å" ++ ++msgid "Filesystem" ++msgstr "文件系统" ++ ++msgid "Filter" ++msgstr "过滤器" ++ ++msgid "Filter private" ++msgstr "过滤本地包" ++ ++msgid "Filter useless" ++msgstr "过滤无用包" ++ ++msgid "Find and join network" ++msgstr "æœç´¢å¹¶åŠ å…¥ç½‘络" ++ ++msgid "Find package" ++msgstr "查找软件包" ++ ++msgid "Finish" ++msgstr "完æˆ" ++ ++msgid "Firewall" ++msgstr "防ç«å¢™" ++ ++msgid "Firewall Settings" ++msgstr "防ç«å¢™è®¾ç½®" ++ ++msgid "Firewall Status" ++msgstr "防ç«å¢™çŠ¶æ€" ++ ++msgid "Firmware Version" ++msgstr "固件版本" ++ ++msgid "Fixed source port for outbound DNS queries" ++msgstr "指定的DNS查询æºç«¯å£" ++ ++msgid "Flags" ++msgstr "标识" ++ ++msgid "Flash Firmware" ++msgstr "刷新固件" ++ ++msgid "Flash image..." ++msgstr "刷写固件..." ++ ++msgid "Flash new firmware image" ++msgstr "刷写新的固件" ++ ++msgid "Flash operations" ++msgstr "刷新æ“作" ++ ++msgid "Flashing..." ++msgstr "刷写中..." ++ ++msgid "Force" ++msgstr "强制开å¯DHCP" ++ ++msgid "Force CCMP (AES)" ++msgstr "强制使用CCMP(AES)加密" ++ ++msgid "Force DHCP on this network even if another server is detected." ++msgstr "强制开å¯DHCP。" ++ ++msgid "Force TKIP" ++msgstr "强制使用TKIP加密" ++ ++msgid "Force TKIP and CCMP (AES)" ++msgstr "TKIPå’ŒCCMP(AES)æ··åˆåŠ å¯†" ++ ++msgid "Forward DHCP traffic" ++msgstr "转å‘DHCPæ•°æ®åŒ…" ++ ++msgid "Forward broadcast traffic" ++msgstr "转å‘广播数æ®åŒ…" ++ ++msgid "Forwarding mode" ++msgstr "转å‘模å¼" ++ ++msgid "Fragmentation Threshold" ++msgstr "分片阈值" ++ ++msgid "Frame Bursting" ++msgstr "帧çªå‘" ++ ++msgid "Free" ++msgstr "空闲数" ++ ++msgid "Free space" ++msgstr "空闲空间" ++ ++msgid "GHz" ++msgstr "GHz" ++ ++msgid "GPRS only" ++msgstr "ä»…GPRS" ++ ++msgid "Gateway" ++msgstr "网关" ++ ++msgid "Gateway ports" ++msgstr "网关端å£" ++ ++msgid "General Settings" ++msgstr "基本设置" ++ ++msgid "General Setup" ++msgstr "基本设置" ++ ++msgid "Generate archive" ++msgstr "生æˆå¤‡ä»½" ++ ++msgid "Generic 802.11%s Wireless Controller" ++msgstr "Generic 802.11%s 无线网å¡" ++ ++msgid "Given password confirmation did not match, password not changed!" ++msgstr "由于密ç éªŒè¯ä¸åŒ¹é…,密ç æ²¡æœ‰æ›´æ”¹ï¼" ++ ++msgid "Global network options" ++msgstr "全局网络选项" ++ ++msgid "Go to password configuration..." ++msgstr "跳转到密ç é…置页..." ++ ++msgid "Go to relevant configuration page" ++msgstr "跳转到相关的é…置页é¢" ++ ++msgid "Guest" ++msgstr "访客" ++ ++msgid "HE.net password" ++msgstr "HE.net密ç " ++ ++msgid "HE.net username" ++msgstr "HE.net用户å" ++ ++msgid "Handler" ++msgstr "处ç†ç¨‹åº" ++ ++msgid "Hang Up" ++msgstr "挂起" ++ ++msgid "Heartbeat" ++msgstr "心跳" ++ ++msgid "" ++"Here you can configure the basic aspects of your device like its hostname or " ++"the timezone." ++msgstr "é…置路由器的部分基础信æ¯ã€‚" ++ ++msgid "" ++"Here you can paste public SSH-Keys (one per line) for SSH public-key " ++"authentication." ++msgstr "SSH公共密钥认è¯(æ¯è¡Œä¸€ä¸ªå¯†é’¥)。" ++ ++msgid "Hermes 802.11b Wireless Controller" ++msgstr "Hermes 802.11b 无线网å¡" ++ ++msgid "Hide ESSID" ++msgstr "éšè—ESSID" ++ ++msgid "Host entries" ++msgstr "主机目录" ++ ++msgid "Host expiry timeout" ++msgstr "主机到期超时" ++ ++msgid "Host-IP or Network" ++msgstr "主机IP或网络" ++ ++msgid "Hostname" ++msgstr "主机å" ++ ++msgid "Hostname to send when requesting DHCP" ++msgstr "请求DHCPæ—¶å‘é€çš„主机å" ++ ++msgid "Hostnames" ++msgstr "主机å" ++ ++msgid "Hybrid" ++msgstr "æ··åˆ" ++ ++msgid "IP address" ++msgstr "IP地å€" ++ ++msgid "IPv4" ++msgstr "IPv4" ++ ++msgid "IPv4 Firewall" ++msgstr "IPv4防ç«å¢™" ++ ++msgid "IPv4 WAN Status" ++msgstr "IPv4 WAN状æ€" ++ ++msgid "IPv4 address" ++msgstr "IPv4地å€" ++ ++msgid "IPv4 and IPv6" ++msgstr "IPv4å’ŒIPv6" ++ ++msgid "IPv4 assignment length" ++msgstr "分é…IPv4长度" ++ ++msgid "IPv4 broadcast" ++msgstr "IPv4广播" ++ ++msgid "IPv4 gateway" ++msgstr "IPv4网关" ++ ++msgid "IPv4 netmask" ++msgstr "IPv4å­ç½‘掩ç " ++ ++msgid "IPv4 only" ++msgstr "ä»…IPv4" ++ ++msgid "IPv4 prefix length" ++msgstr "IPv4地å€å‰ç¼€é•¿åº¦" ++ ++msgid "IPv4-Address" ++msgstr "IPv4-地å€" ++ ++msgid "IPv6" ++msgstr "IPv6" ++ ++msgid "IPv6 Firewall" ++msgstr "IPv6防ç«å¢™" ++ ++msgid "IPv6 Neighbours" ++msgstr "IPv6邻居" ++ ++msgid "IPv6 Settings" ++msgstr "IPv6设置" ++ ++msgid "IPv6 ULA-Prefix" ++msgstr "IPv6 ULAå‰ç¼€" ++ ++msgid "IPv6 WAN Status" ++msgstr "IPv6 WAN状æ€" ++ ++msgid "IPv6 address" ++msgstr "IPv6地å€" ++ ++msgid "IPv6 address delegated to the local tunnel endpoint (optional)" ++msgstr "绑定到本地隧é“终点的IPv6地å€(å¯é€‰)" ++ ++msgid "IPv6 assignment hint" ++msgstr "" ++ ++msgid "IPv6 assignment length" ++msgstr "IPv6分é…长度" ++ ++msgid "IPv6 gateway" ++msgstr "IPv6网关" ++ ++msgid "IPv6 only" ++msgstr "ä»…IPv6" ++ ++msgid "IPv6 prefix" ++msgstr "IPv6地å€å‰ç¼€" ++ ++msgid "IPv6 prefix length" ++msgstr "IPv6地å€å‰ç¼€é•¿åº¦" ++ ++msgid "IPv6 routed prefix" ++msgstr "IPv6路由å‰ç¼€" ++ ++msgid "IPv6-Address" ++msgstr "IPv6-地å€" ++ ++msgid "IPv6-in-IPv4 (RFC4213)" ++msgstr "IPv6-in-IPv4 (RFC4213)" ++ ++msgid "IPv6-over-IPv4 (6rd)" ++msgstr "IPv6-over-IPv4 (6rd)" ++ ++msgid "IPv6-over-IPv4 (6to4)" ++msgstr "IPv6-over-IPv4 (6to4)" ++ ++msgid "Identity" ++msgstr "鉴æƒ" ++ ++msgid "" ++"If specified, mount the device by its UUID instead of a fixed device node" ++msgstr "用UUIDæ¥æŒ‚载设备" ++ ++msgid "" ++"If specified, mount the device by the partition label instead of a fixed " ++"device node" ++msgstr "用å·æ ‡æ¥æŒ‚载设备" ++ ++msgid "If unchecked, no default route is configured" ++msgstr "留空则ä¸é…置默认路由" ++ ++msgid "If unchecked, the advertised DNS server addresses are ignored" ++msgstr "留空则忽略所通告的DNSæœåŠ¡å™¨åœ°å€" ++ ++msgid "" ++"If your physical memory is insufficient unused data can be temporarily " ++"swapped to a swap-device resulting in a higher amount of usable RAM. Be aware that swapping data is a very " ++"slow process as the swap-device cannot be accessed with the high datarates " ++"of the RAM." ++msgstr "如果物ç†å†…å­˜ä¸è¶³ï¼Œé—²ç½®æ•°æ®å¯è‡ªåŠ¨ç§»åˆ°äº¤æ¢åŒºæš‚存,以æ高å¯ç”¨å†…存。" ++ ++msgid "Ignore Hosts files" ++msgstr "忽略HOSTS文件" ++ ++msgid "Ignore interface" ++msgstr "关闭DHCP" ++ ++msgid "Ignore resolve file" ++msgstr "忽略解æžæ–‡ä»¶" ++ ++msgid "Image" ++msgstr "固件文件" ++ ++msgid "In" ++msgstr "å…¥å£" ++ ++msgid "Inactivity timeout" ++msgstr "活动超时" ++ ++msgid "Inbound:" ++msgstr "入站:" ++ ++msgid "Info" ++msgstr "ä¿¡æ¯" ++ ++msgid "Initscript" ++msgstr "å¯åŠ¨è„šæœ¬" ++ ++msgid "Initscripts" ++msgstr "å¯åŠ¨è„šæœ¬" ++ ++msgid "Install" ++msgstr "安装" ++ ++msgid "Install iputils-traceroute6 for IPv6 traceroute" ++msgstr "安装iputils-traceroute6以进行IPv6 traceroute" ++ ++msgid "Install package %q" ++msgstr "安装软件包%q" ++ ++msgid "Install protocol extensions..." ++msgstr "安装扩展åè®®..." ++ ++msgid "Installed packages" ++msgstr "已安装软件包" ++ ++msgid "Interface" ++msgstr "接å£" ++ ++msgid "Interface Configuration" ++msgstr "接å£é…ç½®" ++ ++msgid "Interface Overview" ++msgstr "接å£æ€»è§ˆ" ++ ++msgid "Interface is reconnecting..." ++msgstr "正在é‡æ–°è¿žæŽ¥æŽ¥å£..." ++ ++msgid "Interface is shutting down..." ++msgstr "正在关闭接å£..." ++ ++msgid "Interface not present or not connected yet." ++msgstr "接å£ä¸å­˜åœ¨æˆ–未连接" ++ ++msgid "Interface reconnected" ++msgstr "接å£å·²é‡æ–°è¿žæŽ¥" ++ ++msgid "Interface shut down" ++msgstr "接å£å·²å…³é—­" ++ ++msgid "Interfaces" ++msgstr "接å£" ++ ++msgid "Internal" ++msgstr "" ++ ++msgid "Internal Server Error" ++msgstr "内部æœåŠ¡å™¨é”™è¯¯" ++ ++msgid "Invalid" ++msgstr "无效" ++ ++msgid "Invalid VLAN ID given! Only IDs between %d and %d are allowed." ++msgstr "无效的VLAN ID! åªæœ‰ %d å’Œ %d 之间的ID有效。" ++ ++msgid "Invalid VLAN ID given! Only unique IDs are allowed" ++msgstr "无效的VLAN ID! åªå…许唯一的ID。" ++ ++msgid "Invalid username and/or password! Please try again." ++msgstr "无效的用户åå’Œ/或密ç ! 请é‡è¯•ã€‚" ++ ++#, fuzzy ++msgid "" ++"It appears that you are trying to flash an image that does not fit into the " ++"flash memory, please verify the image file!" ++msgstr "å°†è¦åˆ·æ–°çš„固件与本路由器ä¸å…¼å®¹ï¼Œè¯·é‡æ–°éªŒè¯å›ºä»¶æ–‡ä»¶ã€‚" ++ ++msgid "Java Script required!" ++msgstr "需è¦Java Scriptï¼" ++ ++msgid "Join Network" ++msgstr "加入网络" ++ ++msgid "Join Network: Settings" ++msgstr "加入网络:设置" ++ ++msgid "Join Network: Wireless Scan" ++msgstr "加入网络:æœç´¢æ— çº¿" ++ ++msgid "Keep settings" ++msgstr "ä¿ç•™é…ç½®" ++ ++msgid "Kernel Log" ++msgstr "内核日志" ++ ++msgid "Kernel Version" ++msgstr "内核版本" ++ ++msgid "Key" ++msgstr "密ç " ++ ++msgid "Key #%d" ++msgstr "å¯†ç  #%d" ++ ++msgid "Kill" ++msgstr "强制关闭" ++ ++msgid "L2TP" ++msgstr "L2TP" ++ ++msgid "L2TP Server" ++msgstr "L2TPæœåŠ¡å™¨" ++ ++msgid "LCP echo failure threshold" ++msgstr "LCPå“应故障阈值" ++ ++msgid "LCP echo interval" ++msgstr "LCPå“应间隔" ++ ++msgid "LLC" ++msgstr "LLC" ++ ++msgid "Label" ++msgstr "å·æ ‡" ++ ++msgid "Language" ++msgstr "语言" ++ ++msgid "Language and Style" ++msgstr "语言和界é¢" ++ ++msgid "Leaf" ++msgstr "å¶å­" ++ ++msgid "Lease validity time" ++msgstr "有效租期" ++ ++msgid "Leasefile" ++msgstr "租约文件" ++ ++msgid "Leasetime" ++msgstr "租用时间" ++ ++msgid "Leasetime remaining" ++msgstr "剩余租期" ++ ++msgid "Leave empty to autodetect" ++msgstr "留空则自动探测" ++ ++msgid "Leave empty to use the current WAN address" ++msgstr "留空则使用当å‰WAN地å€" ++ ++msgid "Legend:" ++msgstr "图例:" ++ ++msgid "Limit" ++msgstr "客户数" ++ ++msgid "Line Attenuation" ++msgstr "" ++ ++msgid "Line Speed" ++msgstr "线路速率" ++ ++msgid "Line State" ++msgstr "线路状æ€" ++ ++msgid "Link On" ++msgstr "活动链接" ++ ++msgid "" ++"List of DNS servers to forward " ++"requests to" ++msgstr "将指定的域åDNS解æžè½¬å‘到指定的DNSæœåŠ¡å™¨ï¼ˆæŒ‰ç…§ç¤ºä¾‹å¡«å†™ï¼‰" ++ ++msgid "List of domains to allow RFC1918 responses for" ++msgstr "å…许RFC1918å“应的域å列表" ++ ++msgid "List of hosts that supply bogus NX domain results" ++msgstr "å…许虚å‡ç©ºåŸŸåå“应的æœåŠ¡å™¨åˆ—表" ++ ++msgid "Listen only on the given interface or, if unspecified, on all" ++msgstr "监å¬æŒ‡å®šçš„接å£ï¼›æœªæŒ‡å®šåˆ™ç›‘å¬å…¨éƒ¨" ++ ++msgid "Listening port for inbound DNS queries" ++msgstr "入站DNS查询端å£" ++ ++msgid "Load" ++msgstr "è´Ÿè½½" ++ ++msgid "Load Average" ++msgstr "å¹³å‡è´Ÿè½½" ++ ++msgid "Loading" ++msgstr "加载中" ++ ++msgid "Local IPv4 address" ++msgstr "本地IPv4地å€" ++ ++msgid "Local IPv6 address" ++msgstr "本地IPv6地å€" ++ ++msgid "Local Startup" ++msgstr "本地å¯åŠ¨è„šæœ¬" ++ ++msgid "Local Time" ++msgstr "本地时间" ++ ++msgid "Local domain" ++msgstr "本地域å" ++ ++#, fuzzy ++msgid "" ++"Local domain specification. Names matching this domain are never forwarded " ++"and are resolved from DHCP or hosts files only" ++msgstr "本地域å规则。从ä¸è½¬å‘和处ç†åªæºè‡ªDHCP或HOSTS文件的本地域åæ•°æ®" ++ ++msgid "Local domain suffix appended to DHCP names and hosts file entries" ++msgstr "本地域ååŽç¼€å°†æ·»åŠ åˆ°DHCPå’ŒHOSTS文件æ¡ç›®" ++ ++msgid "Local server" ++msgstr "本地æœåŠ¡å™¨" ++ ++msgid "" ++"Localise hostname depending on the requesting subnet if multiple IPs are " ++"available" ++msgstr "如果有多个IPå¯ç”¨ï¼Œåˆ™æ ¹æ®è¯·æ±‚æ¥æºçš„å­ç½‘æ¥æœ¬åœ°åŒ–主机å" ++ ++msgid "Localise queries" ++msgstr "本地化查询" ++ ++msgid "Locked to channel %d used by: %s" ++msgstr "ä¿¡é“é“已被é”定为 %d,因为该信é“被 %s 使用" ++ ++msgid "Log output level" ++msgstr "日志记录等级" ++ ++msgid "Log queries" ++msgstr "日志查询" ++ ++msgid "Logging" ++msgstr "日志" ++ ++msgid "Login" ++msgstr "登录" ++ ++msgid "Logout" ++msgstr "退出" ++ ++msgid "Lowest leased address as offset from the network address." ++msgstr "网络地å€çš„起始分é…基å€ã€‚" ++ ++msgid "MAC-Address" ++msgstr "MAC-地å€" ++ ++msgid "MAC-Address Filter" ++msgstr "MAC-地å€è¿‡æ»¤" ++ ++msgid "MAC-Filter" ++msgstr "MAC-过滤" ++ ++msgid "MAC-List" ++msgstr "MAC-列表" ++ ++msgid "MB/s" ++msgstr "MB/s" ++ ++msgid "MHz" ++msgstr "MHz" ++ ++msgid "MTU" ++msgstr "MTU" ++ ++msgid "" ++"Make sure to clone the root filesystem using something like the commands " ++"below:" ++msgstr "请确认你已ç»å¤åˆ¶è¿‡æ•´ä¸ªæ ¹æ–‡ä»¶ç³»ç»Ÿ,例如使用以下命令:" ++ ++msgid "Maximum Rate" ++msgstr "最高速率" ++ ++msgid "Maximum allowed number of active DHCP leases" ++msgstr "å…许的最大DHCP租用数" ++ ++msgid "Maximum allowed number of concurrent DNS queries" ++msgstr "å…许的最大并å‘DNS查询数" ++ ++msgid "Maximum allowed size of EDNS.0 UDP packets" ++msgstr "å…许的最大EDNS.0 UDP报文大å°" ++ ++msgid "Maximum amount of seconds to wait for the modem to become ready" ++msgstr "调制解调器就绪的最大等待时间(秒)" ++ ++msgid "Maximum hold time" ++msgstr "最大æŒç»­æ—¶é—´" ++ ++msgid "Maximum number of leased addresses." ++msgstr "最大地å€åˆ†é…æ•°é‡ã€‚" ++ ++msgid "Mbit/s" ++msgstr "Mbit/s" ++ ++msgid "Memory" ++msgstr "内存" ++ ++msgid "Memory usage (%)" ++msgstr "内存使用率(%)" ++ ++msgid "Metric" ++msgstr "跃点数" ++ ++msgid "Minimum Rate" ++msgstr "最低速率" ++ ++msgid "Minimum hold time" ++msgstr "最低æŒç»­æ—¶é—´" ++ ++msgid "Mirror monitor port" ++msgstr "æ•°æ®åŒ…é•œåƒç›‘å¬ç«¯å£" ++ ++msgid "Mirror source port" ++msgstr "æ•°æ®åŒ…é•œåƒæºç«¯å£" ++ ++msgid "Missing protocol extension for proto %q" ++msgstr "缺少åè®®%qçš„å议扩展" ++ ++msgid "Mode" ++msgstr "模å¼" ++ ++msgid "Model" ++msgstr "主机型å·" ++ ++msgid "Modem device" ++msgstr "调制解调器节点" ++ ++msgid "Modem init timeout" ++msgstr "调制解调器åˆå§‹åŒ–超时" ++ ++msgid "Monitor" ++msgstr "监å¬Monitor" ++ ++msgid "Mount Entry" ++msgstr "挂载项目" ++ ++msgid "Mount Point" ++msgstr "挂载点" ++ ++msgid "Mount Points" ++msgstr "挂载点" ++ ++msgid "Mount Points - Mount Entry" ++msgstr "挂载点-存储区" ++ ++msgid "Mount Points - Swap Entry" ++msgstr "挂载点-交æ¢åŒº" ++ ++msgid "" ++"Mount Points define at which point a memory device will be attached to the " ++"filesystem" ++msgstr "é…置存储设备挂载到文件系统中的ä½ç½®å’Œå‚数。" ++ ++msgid "Mount options" ++msgstr "挂载选项" ++ ++msgid "Mount point" ++msgstr "挂载点" ++ ++msgid "Mounted file systems" ++msgstr "已挂载的文件系统" ++ ++msgid "Move down" ++msgstr "下移" ++ ++msgid "Move up" ++msgstr "上移" ++ ++msgid "Multicast Rate" ++msgstr "多播速率" ++ ++msgid "Multicast address" ++msgstr "多播地å€" ++ ++msgid "NAS ID" ++msgstr "NAS ID" ++ ++msgid "NDP-Proxy" ++msgstr "NDP-代ç†" ++ ++msgid "NTP server candidates" ++msgstr "候选NTPæœåŠ¡å™¨" ++ ++msgid "NTP sync time-out" ++msgstr "NTPåŒæ­¥è¶…æ—¶" ++ ++msgid "Name" ++msgstr "å称" ++ ++msgid "Name of the new interface" ++msgstr "新接å£çš„å称" ++ ++msgid "Name of the new network" ++msgstr "新网络的å称" ++ ++msgid "Navigation" ++msgstr "导航" ++ ++msgid "Netmask" ++msgstr "å­ç½‘掩ç " ++ ++msgid "Network" ++msgstr "网络" ++ ++msgid "Network Utilities" ++msgstr "网络工具" ++ ++msgid "Network boot image" ++msgstr "网络å¯åŠ¨é•œåƒ" ++ ++msgid "Network without interfaces." ++msgstr "无接å£çš„网络。" ++ ++msgid "Next »" ++msgstr "下一步 »" ++ ++msgid "No DHCP Server configured for this interface" ++msgstr "本接å£æœªé…ç½®DHCPæœåŠ¡å™¨" ++ ++msgid "No chains in this table" ++msgstr "本表中没有链" ++ ++msgid "No files found" ++msgstr "未找到文件" ++ ++msgid "No information available" ++msgstr "æ— å¯ç”¨ä¿¡æ¯" ++ ++msgid "No negative cache" ++msgstr "ç¦ç”¨æ— æ•ˆä¿¡æ¯ç¼“å­˜" ++ ++msgid "No network configured on this device" ++msgstr "本设备未é…置网络" ++ ++msgid "No network name specified" ++msgstr "未指定网络å" ++ ++msgid "No package lists available" ++msgstr "æ— å¯ç”¨è½¯ä»¶åˆ—表" ++ ++msgid "No password set!" ++msgstr "未设置密ç ï¼" ++ ++msgid "No rules in this chain" ++msgstr "本链没有规则" ++ ++msgid "No zone assigned" ++msgstr "未指定区域" ++ ++msgid "Noise" ++msgstr "噪声" ++ ++msgid "Noise Margin" ++msgstr "噪声容é™" ++ ++msgid "Noise:" ++msgstr "噪声:" ++ ++msgid "None" ++msgstr "æ— " ++ ++msgid "Normal" ++msgstr "正常" ++ ++msgid "Not Found" ++msgstr "未找到" ++ ++msgid "Not associated" ++msgstr "未关è”" ++ ++msgid "Not connected" ++msgstr "未连接" ++ ++msgid "Note: Configuration files will be erased." ++msgstr "注æ„:é…置文件将被删除。" ++ ++msgid "Notice" ++msgstr "注æ„" ++ ++msgid "Nslookup" ++msgstr "Nslookup" ++ ++msgid "OK" ++msgstr "OK" ++ ++msgid "OPKG-Configuration" ++msgstr "OPKG-é…ç½®" ++ ++msgid "Off-State Delay" ++msgstr "关闭时间" ++ ++msgid "" ++"On this page you can configure the network interfaces. You can bridge " ++"several interfaces by ticking the \"bridge interfaces\" field and enter the " ++"names of several network interfaces separated by spaces. You can also use " ++"VLAN notation " ++"INTERFACE.VLANNR (e.g.: " ++"eth0.1)." ++msgstr "é…置网络接å£ä¿¡æ¯ã€‚" ++ ++msgid "On-State Delay" ++msgstr "通电时间" ++ ++msgid "One of hostname or mac address must be specified!" ++msgstr "请指定主机å或MAC地å€ï¼" ++ ++msgid "One or more fields contain invalid values!" ++msgstr "一个或多个选项值有误ï¼" ++ ++msgid "One or more required fields have no value!" ++msgstr "一个或多个必选项值为空ï¼" ++ ++msgid "Open list..." ++msgstr "打开列表..." ++ ++msgid "OpenConnect (CISCO AnyConnect)" ++msgstr "" ++ ++msgid "Operating frequency" ++msgstr "工作频率" ++ ++msgid "Option changed" ++msgstr "修改的选项" ++ ++msgid "Option removed" ++msgstr "移除的选项" ++ ++msgid "Optional, specify to override default server (tic.sixxs.net)" ++msgstr "å¯é€‰,设置这个选项会覆盖默认设定的æœåŠ¡å™¨(tic.sixxs.net)" ++ ++msgid "Optional, use when the SIXXS account has more than one tunnel" ++msgstr "å¯é€‰,如果你的SIXXSè´¦å·æ‹¥æœ‰ä¸€ä¸ªä»¥ä¸Šçš„隧é“请设置此项." ++ ++msgid "Options" ++msgstr "选项" ++ ++msgid "Other:" ++msgstr "其余:" ++ ++msgid "Out" ++msgstr "出å£" ++ ++msgid "Outbound:" ++msgstr "出站:" ++ ++msgid "Outdoor Channels" ++msgstr "户外频é“" ++ ++msgid "Output Interface" ++msgstr "网络出å£" ++ ++msgid "Override MAC address" ++msgstr "克隆MAC地å€" ++ ++msgid "Override MTU" ++msgstr "设置MTU" ++ ++msgid "Override the gateway in DHCP responses" ++msgstr "更新网关" ++ ++msgid "" ++"Override the netmask sent to clients. Normally it is calculated from the " ++"subnet that is served." ++msgstr "æ›´æ–°å­ç½‘掩ç ã€‚" ++ ++msgid "Override the table used for internal routes" ++msgstr "更新内部路由表" ++ ++msgid "Overview" ++msgstr "总览" ++ ++msgid "Owner" ++msgstr "用户å" ++ ++msgid "PAP/CHAP password" ++msgstr "PAP/CHAP密ç " ++ ++msgid "PAP/CHAP username" ++msgstr "PAP/CHAP用户å" ++ ++msgid "PID" ++msgstr "PID" ++ ++msgid "PIN" ++msgstr "PIN" ++ ++msgid "PPP" ++msgstr "PPP" ++ ++msgid "PPPoA Encapsulation" ++msgstr "PPPoAå°åŒ…" ++ ++msgid "PPPoATM" ++msgstr "PPPoATM" ++ ++msgid "PPPoE" ++msgstr "PPPoE" ++ ++msgid "PPtP" ++msgstr "PPtP" ++ ++msgid "Package libiwinfo required!" ++msgstr "需è¦libiwinfo软件包ï¼" ++ ++msgid "Package lists are older than 24 hours" ++msgstr "软件包列表已超过24å°æ—¶æœªæ›´æ–°" ++ ++msgid "Package name" ++msgstr "软件包å称" ++ ++msgid "Packets" ++msgstr "æ•°æ®åŒ…" ++ ++msgid "Part of zone %q" ++msgstr "区域 %q" ++ ++msgid "Password" ++msgstr "密ç " ++ ++msgid "Password authentication" ++msgstr "密ç éªŒè¯" ++ ++msgid "Password of Private Key" ++msgstr "ç§æœ‰å¯†é’¥" ++ ++msgid "Password successfully changed!" ++msgstr "密ç ä¿®æ”¹æˆåŠŸï¼" ++ ++msgid "Path" ++msgstr "路径" ++ ++msgid "Path to CA-Certificate" ++msgstr "CAè¯ä¹¦è·¯å¾„" ++ ++msgid "Path to Client-Certificate" ++msgstr "客户端è¯ä¹¦è·¯å¾„" ++ ++msgid "Path to Private Key" ++msgstr "ç§é’¥è·¯å¾„" ++ ++msgid "Path to executable which handles the button event" ++msgstr "处ç†æŒ‰é”®åŠ¨ä½œçš„å¯æ‰§è¡Œæ–‡ä»¶è·¯å¾„" ++ ++msgid "Peak:" ++msgstr "峰值:" ++ ++msgid "Perform reboot" ++msgstr "执行é‡å¯" ++ ++msgid "Perform reset" ++msgstr "执行å¤ä½" ++ ++msgid "Phy Rate:" ++msgstr "物ç†é€ŸçŽ‡:" ++ ++msgid "Physical Settings" ++msgstr "物ç†è®¾ç½®" ++ ++msgid "Ping" ++msgstr "Ping" ++ ++msgid "Pkts." ++msgstr "æ•°æ®åŒ…" ++ ++msgid "Please enter your username and password." ++msgstr "请输入用户å和密ç ã€‚" ++ ++msgid "Please wait: Device rebooting..." ++msgstr "请ç¨ç­‰ï¼šè®¾å¤‡é‡å¯ä¸­..." ++ ++msgid "Policy" ++msgstr "ç­–ç•¥" ++ ++msgid "Port" ++msgstr "端å£" ++ ++msgid "Port %d" ++msgstr "ç«¯å£ %d" ++ ++msgid "Port %d is untagged in multiple VLANs!" ++msgstr "ç«¯å£ %d 在多个VLAN中å‡æœªå…³è”ï¼" ++ ++msgid "Port status:" ++msgstr "端å£çŠ¶æ€ï¼š" ++ ++msgid "" ++"Presume peer to be dead after given amount of LCP echo failures, use 0 to " ++"ignore failures" ++msgstr "在指定数é‡çš„LCPå“应故障åŽå‡å®šé“¾è·¯å·²æ–­å¼€ï¼Œ0为忽略故障" ++ ++msgid "Prevents client-to-client communication" ++msgstr "ç¦æ­¢å®¢æˆ·ç«¯é—´é€šä¿¡" ++ ++msgid "Prism2/2.5/3 802.11b Wireless Controller" ++msgstr "Prism2/2.5/3 802.11b 无线网å¡" ++ ++msgid "Proceed" ++msgstr "执行" ++ ++msgid "Processes" ++msgstr "系统进程" ++ ++msgid "Prot." ++msgstr "åè®®" ++ ++msgid "Protocol" ++msgstr "åè®®" ++ ++msgid "Protocol family" ++msgstr "åè®®æ—" ++ ++msgid "Protocol of the new interface" ++msgstr "新接å£çš„åè®®" ++ ++msgid "Protocol support is not installed" ++msgstr "未安装å议支æŒ" ++ ++msgid "Provide NTP server" ++msgstr "NTPæœåŠ¡å™¨" ++ ++msgid "Provide new network" ++msgstr "添加新网络" ++ ++msgid "Pseudo Ad-Hoc (ahdemo)" ++msgstr "伪装Ad-Hoc(ahdemo)" ++ ++msgid "Public prefix routed to this device for distribution to clients." ++msgstr "" ++ ++msgid "Quality" ++msgstr "è´¨é‡" ++ ++msgid "RTS/CTS Threshold" ++msgstr "RTS/CTS阈值" ++ ++msgid "RX" ++msgstr "接收" ++ ++msgid "RX Rate" ++msgstr "接收速率" ++ ++msgid "RaLink 802.11%s Wireless Controller" ++msgstr "MediaTek/RaLink 802.11%s 无线网å¡" ++ ++msgid "Radius-Accounting-Port" ++msgstr "Radius 计费端å£" ++ ++msgid "Radius-Accounting-Secret" ++msgstr "Radius 计费密钥" ++ ++msgid "Radius-Accounting-Server" ++msgstr "Radius 计费æœåŠ¡å™¨" ++ ++msgid "Radius-Authentication-Port" ++msgstr "Radius 认è¯ç«¯å£" ++ ++msgid "Radius-Authentication-Secret" ++msgstr "Radius 认è¯å¯†é’¥" ++ ++msgid "Radius-Authentication-Server" ++msgstr "Radius 认è¯æœåŠ¡å™¨" ++ ++msgid "" ++"Read /etc/ethers to configure the DHCP-Server" ++msgstr "" ++"æ ¹æ®/etc/ethersæ¥é…ç½®DHCP-æœåŠ¡å™¨" ++ ++msgid "" ++"Really delete this interface? The deletion cannot be undone!\\nYou might " ++"lose access to this device if you are connected via this interface." ++msgstr "" ++"确定è¦åˆ é™¤æ­¤æŽ¥å£ï¼Ÿåˆ é™¤æ“作无法撤销ï¼\\\n" ++"删除此接å£ï¼Œå¯èƒ½å¯¼è‡´æ— æ³•å†è®¿é—®è·¯ç”±å™¨ï¼" ++ ++msgid "" ++"Really delete this wireless network? The deletion cannot be undone!\\nYou " ++"might lose access to this device if you are connected via this network." ++msgstr "" ++"确定è¦åˆ é™¤æ­¤æ— çº¿ç½‘络?删除æ“作无法撤销ï¼\\\n" ++"删除此无线网络,å¯èƒ½å¯¼è‡´æ— æ³•å†è®¿é—®è·¯ç”±å™¨ï¼" ++ ++msgid "Really reset all changes?" ++msgstr "确定è¦æ”¾å¼ƒæ‰€æœ‰æ›´æ”¹ï¼Ÿ" ++ ++#, fuzzy ++msgid "" ++"Really shut down network?\\nYou might lose access to this device if you are " ++"connected via this interface." ++msgstr "" ++"确定è¦å…³é—­æ­¤ç½‘络?\\\n" ++"关闭此网络,å¯èƒ½å¯¼è‡´æ— æ³•å†è®¿é—®è·¯ç”±å™¨ï¼" ++ ++msgid "" ++"Really shutdown interface \"%s\" ?\\nYou might lose access to this device if " ++"you are connected via this interface." ++msgstr "" ++"确定è¦å…³é—­æŽ¥å£\"%s\" ?\\\n" ++"删除此网络,å¯èƒ½å¯¼è‡´æ— æ³•å†è®¿é—®è·¯ç”±å™¨ï¼" ++ ++msgid "Really switch protocol?" ++msgstr "确定è¦åˆ‡æ¢å议?" ++ ++msgid "Realtime Connections" ++msgstr "实时连接" ++ ++msgid "Realtime Graphs" ++msgstr "实时信æ¯" ++ ++msgid "Realtime Load" ++msgstr "实时负载" ++ ++msgid "Realtime Traffic" ++msgstr "实时æµé‡" ++ ++msgid "Realtime Wireless" ++msgstr "实时无线" ++ ++msgid "Rebind protection" ++msgstr "é‡ç»‘定ä¿æŠ¤" ++ ++msgid "Reboot" ++msgstr "é‡å¯" ++ ++msgid "Rebooting..." ++msgstr "é‡å¯ä¸­..." ++ ++msgid "Reboots the operating system of your device" ++msgstr "é‡å¯OpenWrt" ++ ++msgid "Receive" ++msgstr "接收" ++ ++msgid "Receiver Antenna" ++msgstr "接收天线" ++ ++msgid "Reconnect this interface" ++msgstr "é‡è¿žæ­¤æŽ¥å£" ++ ++msgid "Reconnecting interface" ++msgstr "é‡è¿žæŽ¥å£ä¸­..." ++ ++msgid "References" ++msgstr "引用" ++ ++msgid "Regulatory Domain" ++msgstr "无线网络国家区域" ++ ++msgid "Relay" ++msgstr "中继" ++ ++msgid "Relay Bridge" ++msgstr "中继桥" ++ ++msgid "Relay between networks" ++msgstr "网络间中继" ++ ++msgid "Relay bridge" ++msgstr "中继桥" ++ ++msgid "Remote IPv4 address" ++msgstr "远程IPv4地å€" ++ ++msgid "Remove" ++msgstr "移除" ++ ++msgid "Repeat scan" ++msgstr "é‡æ–°æ‰«æ" ++ ++msgid "Replace entry" ++msgstr "é‡ç½®æ¡ç›®" ++ ++msgid "Replace wireless configuration" ++msgstr "é‡ç½®æ— çº¿é…ç½®" ++ ++msgid "Request IPv6-address" ++msgstr "请求IPv6地å€" ++ ++msgid "Request IPv6-prefix of length" ++msgstr "请求指定长度的IPv6å‰ç¼€" ++ ++msgid "Require TLS" ++msgstr "必须使用TLS" ++ ++msgid "Required for certain ISPs, e.g. Charter with DOCSIS 3" ++msgstr "æŸäº›ISP需è¦ï¼Œä¾‹å¦‚:åŒè½´çº¿ç½‘络DOCSIS 3" ++ ++msgid "Reset" ++msgstr "å¤ä½" ++ ++msgid "Reset Counters" ++msgstr "å¤ä½è®¡æ•°å™¨" ++ ++msgid "Reset to defaults" ++msgstr "æ¢å¤åˆ°å‡ºåŽ‚设置" ++ ++msgid "Resolv and Hosts Files" ++msgstr "HOSTS和解æžæ–‡ä»¶" ++ ++msgid "Resolve file" ++msgstr "解æžæ–‡ä»¶" ++ ++msgid "Restart" ++msgstr "é‡å¯" ++ ++msgid "Restart Firewall" ++msgstr "é‡å¯é˜²ç«å¢™" ++ ++msgid "Restore backup" ++msgstr "æ¢å¤é…ç½®" ++ ++msgid "Reveal/hide password" ++msgstr "显示/éšè— 密ç " ++ ++msgid "Revert" ++msgstr "放弃" ++ ++msgid "Root" ++msgstr "Root" ++ ++msgid "Root directory for files served via TFTP" ++msgstr "TFTPæœåŠ¡å™¨çš„根目录" ++ ++msgid "Root preparation" ++msgstr "" ++ ++msgid "Routed IPv6 prefix for downstream interfaces" ++msgstr "" ++ ++msgid "Router Advertisement-Service" ++msgstr "" ++ ++msgid "Router Password" ++msgstr "主机密ç " ++ ++msgid "Routes" ++msgstr "路由表" ++ ++msgid "" ++"Routes specify over which interface and gateway a certain host or network " ++"can be reached." ++msgstr "路由表æ述了数æ®åŒ…çš„å¯è¾¾è·¯å¾„。" ++ ++msgid "Rule #" ++msgstr "规则 #" ++ ++msgid "Run a filesystem check before mounting the device" ++msgstr "挂载设备å‰è¿è¡Œæ–‡ä»¶ç³»ç»Ÿæ£€æŸ¥" ++ ++msgid "Run filesystem check" ++msgstr "文件系统检查" ++ ++msgid "" ++"SIXXS supports TIC only, for static tunnels using IP protocol 41 (RFC4213) " ++"use 6in4 instead" ++msgstr "" ++ ++msgid "SIXXS-handle[/Tunnel-ID]" ++msgstr "" ++ ++msgid "SSH Access" ++msgstr "SSH访问" ++ ++msgid "SSH-Keys" ++msgstr "SSH-密钥" ++ ++msgid "SSID" ++msgstr "SSID" ++ ++msgid "Save" ++msgstr "ä¿å­˜" ++ ++msgid "Save & Apply" ++msgstr "ä¿å­˜&应用" ++ ++msgid "Save & Apply" ++msgstr "ä¿å­˜&应用" ++ ++msgid "Scan" ++msgstr "æœç´¢" ++ ++msgid "Scheduled Tasks" ++msgstr "计划任务" ++ ++msgid "Section added" ++msgstr "添加的区域" ++ ++msgid "Section removed" ++msgstr "移除的区域" ++ ++msgid "See \"mount\" manpage for details" ++msgstr "详å‚\"mount\"è”机帮助" ++ ++msgid "" ++"Send LCP echo requests at the given interval in seconds, only effective in " ++"conjunction with failure threshold" ++msgstr "定时å‘é€LCPå“应(秒),仅在结åˆäº†æ•…障阈值时有效" ++ ++msgid "Separate Clients" ++msgstr "隔离客户端" ++ ++msgid "Separate WDS" ++msgstr "隔离WDS" ++ ++msgid "Server Settings" ++msgstr "æœåŠ¡å™¨è®¾ç½®" ++ ++msgid "Server password" ++msgstr "æœåŠ¡å™¨å¯†ç " ++ ++msgid "" ++"Server password, enter the specific password of the tunnel when the username " ++"contains the tunnel ID" ++msgstr "æœåŠ¡å™¨å¯†ç ,如果用户å包å«éš§é“ID则在此填写独立的密ç " ++ ++msgid "Server username" ++msgstr "æœåŠ¡å™¨ç”¨æˆ·å" ++ ++msgid "Service Name" ++msgstr "æœåŠ¡å" ++ ++msgid "Service Type" ++msgstr "æœåŠ¡ç±»åž‹" ++ ++msgid "Services" ++msgstr "æœåŠ¡" ++ ++#, fuzzy ++msgid "Set up Time Synchronization" ++msgstr "设置时间åŒæ­¥" ++ ++msgid "Setup DHCP Server" ++msgstr "é…ç½®DHCPæœåŠ¡å™¨" ++ ++msgid "Show current backup file list" ++msgstr "显示当å‰æ–‡ä»¶å¤‡ä»½åˆ—表" ++ ++msgid "Shutdown this interface" ++msgstr "关闭此接å£" ++ ++msgid "Shutdown this network" ++msgstr "关闭此网络" ++ ++msgid "Signal" ++msgstr "ä¿¡å·" ++ ++msgid "Signal:" ++msgstr "ä¿¡å·:" ++ ++msgid "Size" ++msgstr "大å°" ++ ++msgid "Skip" ++msgstr "跳过" ++ ++msgid "Skip to content" ++msgstr "跳到内容" ++ ++msgid "Skip to navigation" ++msgstr "跳转到导航" ++ ++msgid "Slot time" ++msgstr "时隙" ++ ++msgid "Software" ++msgstr "软件包" ++ ++msgid "Some fields are invalid, cannot save values!" ++msgstr "一些项目的值无效,无法ä¿å­˜ï¼" ++ ++msgid "Sorry, the object you requested was not found." ++msgstr "对ä¸èµ·ï¼Œè¯·æ±‚的目标未找到。" ++ ++msgid "Sorry, the server encountered an unexpected error." ++msgstr "对ä¸èµ·ï¼ŒæœåŠ¡å™¨é‡åˆ°æœªçŸ¥é”™è¯¯ã€‚" ++ ++#, fuzzy ++msgid "" ++"Sorry, there is no sysupgrade support present; a new firmware image must be " ++"flashed manually. Please refer to the OpenWrt wiki for device specific " ++"install instructions." ++msgstr "" ++"抱歉,当å‰ç³»ç»Ÿä¸æ”¯æŒsysupgradeå‡çº§ï¼Œéœ€æ‰‹åŠ¨åˆ·æ–°å›ºä»¶ã€‚请å‚考OpenWrt Wiki中此设" ++"备特定的安装å‘导。" ++ ++msgid "Sort" ++msgstr "排åº" ++ ++msgid "Source" ++msgstr "æºåœ°å€" ++ ++msgid "Source routing" ++msgstr "æºè·¯ç”±" ++ ++msgid "Specifies the button state to handle" ++msgstr "指定è¦å¤„ç†çš„按键状æ€" ++ ++msgid "Specifies the directory the device is attached to" ++msgstr "指定设备的挂载目录" ++ ++msgid "Specifies the listening port of this Dropbear instance" ++msgstr "指定Dropbear的监å¬ç«¯å£" ++ ++msgid "" ++"Specifies the maximum amount of failed ARP requests until hosts are presumed " ++"to be dead" ++msgstr "指定å‡è®¾ä¸»æœºå·²ä¸¢å¤±çš„最大失败ARP请求数" ++ ++msgid "" ++"Specifies the maximum amount of seconds after which hosts are presumed to be " ++"dead" ++msgstr "指定å‡è®¾ä¸»æœºå·²ä¸¢å¤±çš„最大时间(秒)" ++ ++msgid "Specify the secret encryption key here." ++msgstr "在此指定密钥。" ++ ++# å…³è”了 å¯åŠ¨é¡¹ å’Œ 接å£>LAN>DHCPæœåŠ¡å™¨>网å€åˆ†é…åŸºå€ ++msgid "Start" ++msgstr "开始" ++ ++msgid "Start priority" ++msgstr "å¯åŠ¨ä¼˜å…ˆçº§" ++ ++msgid "Startup" ++msgstr "å¯åŠ¨é¡¹" ++ ++msgid "Static IPv4 Routes" ++msgstr "é™æ€IPv4路由" ++ ++msgid "Static IPv6 Routes" ++msgstr "é™æ€IPv6路由" ++ ++msgid "Static Leases" ++msgstr "é™æ€åœ°å€åˆ†é…" ++ ++msgid "Static Routes" ++msgstr "é™æ€è·¯ç”±" ++ ++msgid "Static WDS" ++msgstr "é™æ€WDS" ++ ++msgid "Static address" ++msgstr "é™æ€åœ°å€" ++ ++msgid "" ++"Static leases are used to assign fixed IP addresses and symbolic hostnames " ++"to DHCP clients. They are also required for non-dynamic interface " ++"configurations where only hosts with a corresponding lease are served." ++msgstr "" ++"é™æ€ç§Ÿçº¦ç”¨äºŽç»™DHCP客户端分é…固定的IP地å€å’Œä¸»æœºæ ‡è¯†ã€‚åªæœ‰æŒ‡å®šçš„主机æ‰èƒ½è¿žæŽ¥ï¼Œ" ++"并且接å£é¡»ä¸ºéžåŠ¨æ€é…置。" ++ ++msgid "Status" ++msgstr "状æ€" ++ ++msgid "Stop" ++msgstr "关闭" ++ ++msgid "Strict order" ++msgstr "严谨查åº" ++ ++msgid "Submit" ++msgstr "æ交" ++ ++msgid "Swap" ++msgstr "交æ¢åŒº" ++ ++msgid "Swap Entry" ++msgstr "交æ¢é¡¹ç›®" ++ ++msgid "Switch" ++msgstr "交æ¢æœº" ++ ++msgid "Switch %q" ++msgstr "交æ¢æœº %q" ++ ++msgid "Switch %q (%s)" ++msgstr "交æ¢æœº%q (%s)" ++ ++msgid "Switch protocol" ++msgstr "切æ¢åè®®" ++ ++msgid "Sync with browser" ++msgstr "åŒæ­¥æµè§ˆå™¨æ—¶é—´" ++ ++msgid "Synchronizing..." ++msgstr "åŒæ­¥ä¸­..." ++ ++msgid "System" ++msgstr "系统" ++ ++msgid "System Log" ++msgstr "系统日志" ++ ++msgid "System Properties" ++msgstr "系统属性" ++ ++msgid "System log buffer size" ++msgstr "系统日志缓冲区大å°" ++ ++msgid "TCP:" ++msgstr "TCP:" ++ ++msgid "TFTP Settings" ++msgstr "TFTP设置" ++ ++msgid "TFTP server root" ++msgstr "TFTPæœåŠ¡å™¨æ ¹ç›®å½•" ++ ++msgid "TX" ++msgstr "å‘é€" ++ ++msgid "TX Rate" ++msgstr "å‘é€é€ŸçŽ‡" ++ ++msgid "Table" ++msgstr "表" ++ ++msgid "Target" ++msgstr "对象" ++ ++msgid "Terminate" ++msgstr "关闭" ++ ++#, fuzzy ++msgid "" ++"The Device Configuration section covers physical settings of the " ++"radio hardware such as channel, transmit power or antenna selection which " ++"are shared among all defined wireless networks (if the radio hardware is " ++"multi-SSID capable). Per network settings like encryption or operation mode " ++"are grouped in the Interface Configuration." ++msgstr "" ++"设备é…置区域å¯é…置无线的硬件å‚数,比如信é“ã€å‘射功率或å‘射天线(如果" ++"此无线模å—硬件支æŒå¤šSSID,则全部SSID共用此设备é…ç½®)。接å£é…置区域则" ++"å¯é…置此网络的工作模å¼å’ŒåŠ å¯†ç­‰ã€‚" ++ ++msgid "" ++"The libiwinfo-lua package is not installed. You must install this " ++"component for working wireless configuration!" ++msgstr "软件包libiwinfo-lua未安装。必需安装此组件以é…置无线ï¼" ++ ++msgid "" ++"The HE.net endpoint update configuration changed, you must now use the plain " ++"username instead of the user ID!" ++msgstr "HE.net客户端更新设置已ç»è¢«æ”¹å˜,您现在必须使用用户å代替用户ID/" ++ ++msgid "" ++"The IPv6 prefix assigned to the provider, usually ends with ::" ++msgstr "è¿è¥å•†ç‰¹å®šçš„IPv6å‰ç¼€ï¼Œé€šå¸¸ä»¥::为结尾" ++ ++msgid "" ++"The allowed characters are: A-Z, a-z, 0-9 and _" ++msgstr "" ++"åˆæ³•å­—符:A-Z, a-z, 0-9 å’Œ _" ++ ++msgid "The configuration file could not be loaded due to the following error:" ++msgstr "" ++ ++msgid "" ++"The device file of the memory or partition (e.g." ++" /dev/sda1)" ++msgstr "" ++"存储器或分区的设备节点,(例如 /dev/" ++"sda1)" ++ ++msgid "" ++"The filesystem that was used to format the memory (e.g. ext3)" ++msgstr "" ++"用于格å¼åŒ–存储器的文件系统,(例如 " ++"ext4)" ++ ++msgid "" ++"The flash image was uploaded. Below is the checksum and file size listed, " ++"compare them with the original file to ensure data integrity.
    Click " ++"\"Proceed\" below to start the flash procedure." ++msgstr "固件已上传,请注æ„核对文件大å°å’Œæ ¡éªŒå€¼ï¼
    刷新过程切勿断电ï¼" ++ ++msgid "The following changes have been committed" ++msgstr "以下更改已æ交" ++ ++msgid "The following changes have been reverted" ++msgstr "以下更改已放弃" ++ ++msgid "The following rules are currently active on this system." ++msgstr "系统中的活跃连接。" ++ ++msgid "The given network name is not unique" ++msgstr "给定的网络åé‡å¤" ++ ++#, fuzzy ++msgid "" ++"The hardware is not multi-SSID capable and the existing configuration will " ++"be replaced if you proceed." ++msgstr "本机的硬件ä¸æ”¯æŒå¤šSSID,继续进行将会覆盖现有é…置。" ++ ++msgid "" ++"The length of the IPv4 prefix in bits, the remainder is used in the IPv6 " ++"addresses." ++msgstr "bitæ ¼å¼çš„IPv4å‰ç¼€é•¿åº¦, 其余的用在IPv6地å€." ++ ++msgid "The length of the IPv6 prefix in bits" ++msgstr "bitæ ¼å¼çš„IPv6å‰ç¼€é•¿åº¦" ++ ++msgid "" ++"The network ports on this device can be combined to several VLANs in which computers can " ++"communicate directly with each other. VLANs are often used to separate different network " ++"segments. Often there is by default one Uplink port for a connection to the " ++"next greater network like the internet and other ports for a local network." ++msgstr "" ++"本设备å¯ä»¥åˆ’分为多个VLAN," ++"并支æŒç”µè„‘间的直接通讯。VLAN也常用于分割ä¸åŒç½‘段。默认通常是一æ¡ä¸Šè¡Œç«¯å£è¿žæŽ¥ISP,其余端å£ä¸ºæœ¬åœ°å­" ++"网。" ++ ++msgid "The selected protocol needs a device assigned" ++msgstr "所选的å议需è¦åˆ†é…设备" ++ ++msgid "" ++"The system is erasing the configuration partition now and will reboot itself " ++"when finished." ++msgstr "系统正在删除é…置分区,完æˆåŽä¼šè‡ªåŠ¨é‡å¯ã€‚" ++ ++#, fuzzy ++msgid "" ++"The system is flashing now.
    DO NOT POWER OFF THE DEVICE!
    Wait a " ++"few minutes before you try to reconnect. It might be necessary to renew the " ++"address of your computer to reach the device again, depending on your " ++"settings." ++msgstr "" ++"正在刷新系统...
    切勿关闭电æº! DO NOT POWER OFF THE DEVICE!
    ç¨ç­‰æ•°åˆ†" ++"é’Ÿå³å¯é‡æ–°è¿žæŽ¥åˆ°è·¯ç”±ã€‚å¯èƒ½éœ€è¦æ›´æ”¹è®¡ç®—机的IP地å€ä»¥é‡æ–°è¿žæŽ¥ã€‚" ++ ++msgid "" ++"The tunnel end-point is behind NAT, defaults to disabled and only applies to " ++"AYIYA" ++msgstr "" ++ ++msgid "" ++"The uploaded image file does not contain a supported format. Make sure that " ++"you choose the generic image format for your platform." ++msgstr "ä¸æ”¯æŒæ‰€ä¸Šä¼ çš„文件格å¼ã€‚请确认选择的文件无误。" ++ ++msgid "There are no active leases." ++msgstr "没有已分é…的租约。" ++ ++msgid "There are no pending changes to apply!" ++msgstr "没有待生效的更改ï¼" ++ ++msgid "There are no pending changes to revert!" ++msgstr "没有å¯æ”¾å¼ƒçš„更改ï¼" ++ ++msgid "There are no pending changes!" ++msgstr "没有待生效的更改ï¼" ++ ++msgid "" ++"There is no device assigned yet, please attach a network device in the " ++"\"Physical Settings\" tab" ++msgstr "尚未分é…设备,请在\"物ç†è®¾ç½®\"选项å¡ä¸­é€‰æ‹©ç½‘络设备" ++ ++msgid "" ++"There is no password set on this router. Please configure a root password to " ++"protect the web interface and enable SSH." ++msgstr "尚未设置密ç ã€‚请为root用户设置密ç ä»¥ä¿æŠ¤ä¸»æœºå¹¶å¼€å¯SSH。" ++ ++msgid "This IPv4 address of the relay" ++msgstr "中继的IPv4地å€" ++ ++msgid "" ++"This is a list of shell glob patterns for matching files and directories to " ++"include during sysupgrade. Modified files in /etc/config/ and certain other " ++"configurations are automatically preserved." ++msgstr "" ++"系统å‡çº§æ—¶è¦ä¿å­˜çš„é…置文件和目录的清å•ã€‚目录/etc/config/内修改过的文件以åŠéƒ¨" ++"分其他é…置会被自动ä¿å­˜ã€‚" ++ ++msgid "" ++"This is either the \"Update Key\" configured for the tunnel or the account " ++"password if no update key has been configured" ++msgstr "如果更新密钥没有设置的è¯,隧é“çš„\"更新密钥\"或者账户密ç å¿…须填写." ++ ++msgid "" ++"This is the content of /etc/rc.local. Insert your own commands here (in " ++"front of 'exit 0') to execute them at the end of the boot process." ++msgstr "å¯åŠ¨è„šæœ¬æ’入到'exit 0'之å‰å³å¯éšç³»ç»Ÿå¯åŠ¨è¿è¡Œã€‚" ++ ++msgid "" ++"This is the local endpoint address assigned by the tunnel broker, it usually " ++"ends with :2" ++msgstr "隧é“代ç†åˆ†é…的本地终端地å€ï¼Œé€šå¸¸ä»¥:2结尾" ++ ++msgid "" ++"This is the only DHCP in the local network" ++msgstr "" ++"这是内网中唯一的DHCPæœåŠ¡å™¨" ++ ++msgid "This is the plain username for logging into the account" ++msgstr "登录账户时填写的用户å" ++ ++msgid "" ++"This is the prefix routed to you by the tunnel broker for use by clients" ++msgstr "" ++ ++msgid "This is the system crontab in which scheduled tasks can be defined." ++msgstr "自定义系统crontab中的计划任务。" ++ ++msgid "" ++"This is usually the address of the nearest PoP operated by the tunnel broker" ++msgstr "这通常是隧é“代ç†æ‰€ç®¡ç†çš„最近的PoP的地å€" ++ ++msgid "" ++"This list gives an overview over currently running system processes and " ++"their status." ++msgstr "系统中正在è¿è¡Œçš„进程和其状æ€ä¿¡æ¯ã€‚" ++ ++msgid "This page allows the configuration of custom button actions" ++msgstr "自定义按键动作。" ++ ++msgid "This page gives an overview over currently active network connections." ++msgstr "活跃的网络连接概况。" ++ ++msgid "This section contains no values yet" ++msgstr "尚无任何é…ç½®" ++ ++msgid "Time Synchronization" ++msgstr "时间åŒæ­¥" ++ ++msgid "Time Synchronization is not configured yet." ++msgstr "尚未é…置时间åŒæ­¥" ++ ++msgid "Timezone" ++msgstr "时区" ++ ++msgid "" ++"To restore configuration files, you can upload a previously generated backup " ++"archive here." ++msgstr "上传备份存档以æ¢å¤é…置。" ++ ++msgid "Total Available" ++msgstr "å¯ç”¨æ•°" ++ ++msgid "Traceroute" ++msgstr "Traceroute" ++ ++msgid "Traffic" ++msgstr "æµé‡" ++ ++msgid "Transfer" ++msgstr "传输" ++ ++msgid "Transmission Rate" ++msgstr "ä¼ é€é€ŸçŽ‡" ++ ++msgid "Transmit" ++msgstr "ä¼ é€" ++ ++msgid "Transmit Power" ++msgstr "无线电功率" ++ ++msgid "Transmitter Antenna" ++msgstr "ä¼ é€å¤©çº¿" ++ ++msgid "Trigger" ++msgstr "触å‘" ++ ++msgid "Trigger Mode" ++msgstr "触å‘模å¼" ++ ++msgid "Tunnel ID" ++msgstr "隧é“ID" ++ ++msgid "Tunnel Interface" ++msgstr "隧é“接å£" ++ ++msgid "Tunnel Link" ++msgstr "隧é“链接" ++ ++msgid "Tunnel broker protocol" ++msgstr "隧é“åè®®" ++ ++msgid "Tunnel setup server" ++msgstr "隧é“é…ç½®æœåŠ¡å™¨" ++ ++msgid "Tunnel type" ++msgstr "隧é“类型" ++ ++msgid "Turbo Mode" ++msgstr "Turbo模å¼" ++ ++msgid "Tx-Power" ++msgstr "传输功率" ++ ++msgid "Type" ++msgstr "类型" ++ ++msgid "UDP:" ++msgstr "UDP:" ++ ++msgid "UMTS only" ++msgstr "ä»…UMTS(WCDMA)" ++ ++msgid "UMTS/GPRS/EV-DO" ++msgstr "UMTS/GPRS/EV-DO" ++ ++msgid "USB Device" ++msgstr "USB设备" ++ ++msgid "UUID" ++msgstr "UUID" ++ ++msgid "Unable to dispatch" ++msgstr "无法调度" ++ ++msgid "Unknown" ++msgstr "未知" ++ ++msgid "Unknown Error, password not changed!" ++msgstr "未知错误,密ç æœªæ›´æ”¹ï¼" ++ ++msgid "Unmanaged" ++msgstr "ä¸é…ç½®åè®®" ++ ++msgid "Unsaved Changes" ++msgstr "未ä¿å­˜çš„é…ç½®" ++ ++msgid "Unsupported protocol type." ++msgstr "ä¸æ”¯æŒçš„å议类型" ++ ++msgid "Update lists" ++msgstr "刷新列表" ++ ++msgid "" ++"Upload a sysupgrade-compatible image here to replace the running firmware. " ++"Check \"Keep settings\" to retain the current configuration (requires an " ++"OpenWrt compatible firmware image)." ++msgstr "上传兼容的sysupgrade固件以刷新当å‰ç³»ç»Ÿã€‚" ++ ++msgid "Upload archive..." ++msgstr "上传备份..." ++ ++msgid "Uploaded File" ++msgstr "上传的文件" ++ ++msgid "Uptime" ++msgstr "è¿è¡Œæ—¶é—´" ++ ++msgid "Use /etc/ethers" ++msgstr "使用/etc/ethersé…ç½®" ++ ++msgid "Use DHCP gateway" ++msgstr "使用DHCP网关" ++ ++msgid "Use DNS servers advertised by peer" ++msgstr "使用端局通告的DNSæœåŠ¡å™¨" ++ ++msgid "Use ISO/IEC 3166 alpha2 country codes." ++msgstr "å‚考ISO/IEC 3166 alpha2国家代ç ã€‚" ++ ++msgid "Use MTU on tunnel interface" ++msgstr "隧é“接å£çš„MTU" ++ ++msgid "Use TTL on tunnel interface" ++msgstr "隧é“接å£çš„TTL" ++ ++msgid "Use as external overlay (/overlay)" ++msgstr "作为外部overlay使用(/overlay)" ++ ++msgid "Use as root filesystem (/)" ++msgstr "作为跟文件系统使用(/)" ++ ++msgid "Use broadcast flag" ++msgstr "使用广播标签" ++ ++msgid "Use builtin IPv6-management" ++msgstr "" ++ ++msgid "Use custom DNS servers" ++msgstr "使用自定义的DNSæœåŠ¡å™¨" ++ ++msgid "Use default gateway" ++msgstr "使用默认网关" ++ ++msgid "Use gateway metric" ++msgstr "使用网关跃点" ++ ++msgid "Use routing table" ++msgstr "使用路由表" ++ ++msgid "" ++"Use the Add Button to add a new lease entry. The MAC-Address indentifies the host, the IPv4-Address specifies to the fixed " ++"address to use and the Hostname is assigned as symbolic name to the " ++"requesting host." ++msgstr "" ++"使用添加æ¥å¢žåŠ æ–°çš„租约æ¡ç›®ã€‚使用MAC-地å€é‰´åˆ«ä¸»æœºï¼ŒIPv4-" ++"地å€åˆ†é…地å€ï¼Œä¸»æœºå分é…标识。" ++ ++msgid "Used" ++msgstr "已用" ++ ++msgid "Used Key Slot" ++msgstr "å¯ç”¨å¯†ç ç»„" ++ ++msgid "User certificate (PEM encoded)" ++msgstr "客户è¯ä¹¦(PEM加密的)" ++ ++msgid "User key (PEM encoded)" ++msgstr "客户Key(PEM加密的)" ++ ++msgid "Username" ++msgstr "用户å" ++ ++msgid "VC-Mux" ++msgstr "VC-Mux" ++ ++msgid "VLAN Interface" ++msgstr "VLAN接å£" ++ ++msgid "VLANs on %q" ++msgstr "%q上的VLAN" ++ ++msgid "VLANs on %q (%s)" ++msgstr "%q (%s)上的VLAN" ++ ++msgid "VPN Server" ++msgstr "VPNæœåŠ¡å™¨" ++ ++msgid "VPN Server port" ++msgstr "VPNæœåŠ¡å™¨ç«¯å£" ++ ++msgid "VPN Server's certificate SHA1 hash" ++msgstr "VPNæœåŠ¡å™¨è¯ä¹¦çš„SHA1哈希值" ++ ++msgid "Vendor Class to send when requesting DHCP" ++msgstr "请求DHCPæ—¶å‘é€çš„Vendor Class" ++ ++msgid "Verbose" ++msgstr "" ++ ++msgid "Verbose logging by aiccu daemon" ++msgstr "" ++ ++msgid "Verify" ++msgstr "验è¯" ++ ++msgid "Version" ++msgstr "版本" ++ ++msgid "WDS" ++msgstr "WDS" ++ ++msgid "WEP Open System" ++msgstr "WEP开放认è¯" ++ ++msgid "WEP Shared Key" ++msgstr "WEP共享密钥" ++ ++msgid "WEP passphrase" ++msgstr "WEP密钥" ++ ++msgid "WMM Mode" ++msgstr "WMM多媒体加速" ++ ++msgid "WPA passphrase" ++msgstr "WPA密钥" ++ ++msgid "" ++"WPA-Encryption requires wpa_supplicant (for client mode) or hostapd (for AP " ++"and ad-hoc mode) to be installed." ++msgstr "" ++"WPA加密需è¦å®‰è£…wpa_supplicant(客户端模å¼)或安装hostapd(接入点APã€ç‚¹å¯¹ç‚¹ad-hoc" ++"模å¼)。" ++ ++msgid "" ++"Wait for NTP sync that many seconds, seting to 0 disables waiting (optional)" ++msgstr "在NTPåŒæ­¥ä¹‹å‰ç­‰å¾…时间.设置为0表示åŒæ­¥ä¹‹å‰ä¸ç­‰å¾…(å¯é€‰)" ++ ++msgid "Waiting for changes to be applied..." ++msgstr "正在应用更改..." ++ ++msgid "Waiting for command to complete..." ++msgstr "正在执行命令..." ++ ++msgid "Warning" ++msgstr "警告" ++ ++msgid "Warning: There are unsaved changes that will be lost while rebooting!" ++msgstr "警告: 有尚未ä¿å­˜çš„更改,é‡å¯å°†ä¸¢å¤±!" ++ ++msgid "Whether to create an IPv6 default route over the tunnel" ++msgstr "" ++ ++msgid "Whether to route only packets from delegated prefixes" ++msgstr "" ++ ++msgid "Width" ++msgstr "频宽" ++ ++msgid "Wifi" ++msgstr "无线" ++ ++msgid "Wireless" ++msgstr "无线" ++ ++msgid "Wireless Adapter" ++msgstr "无线适é…器" ++ ++msgid "Wireless Network" ++msgstr "无线网络" ++ ++msgid "Wireless Overview" ++msgstr "无线概况" ++ ++msgid "Wireless Security" ++msgstr "无线安全" ++ ++msgid "Wireless is disabled or not associated" ++msgstr "未开å¯æˆ–未关è”无线" ++ ++msgid "Wireless is restarting..." ++msgstr "é‡å¯æ— çº¿ä¸­..." ++ ++msgid "Wireless network is disabled" ++msgstr "无线已ç¦ç”¨" ++ ++msgid "Wireless network is enabled" ++msgstr "无线网络开关" ++ ++msgid "Wireless restarted" ++msgstr "无线已é‡å¯" ++ ++msgid "Wireless shut down" ++msgstr "无线已关闭" ++ ++msgid "Write received DNS requests to syslog" ++msgstr "将收到的DNS请求写入系统日志" ++ ++msgid "XR Support" ++msgstr "XR支æŒ" ++ ++msgid "" ++"You can enable or disable installed init scripts here. Changes will applied " ++"after a device reboot.
    Warning: If you disable essential init " ++"scripts like \"network\", your device might become inaccessible!" ++msgstr "" ++"å¯ç”¨æˆ–ç¦ç”¨å·²å®‰è£…çš„å¯åŠ¨è„šæœ¬ã€‚更改在设备é‡å¯åŽç”Ÿæ•ˆã€‚
    警告:如果ç¦" ++"用了必è¦çš„å¯åŠ¨è„šæœ¬ï¼Œæ¯”如\"network\",å¯èƒ½ä¼šå¯¼è‡´è®¾å¤‡æ— æ³•è®¿é—®ï¼" ++ ++msgid "" ++"You must enable Java Script in your browser or LuCI will not work properly." ++msgstr "LUCI的正常è¿è¡Œéœ€è¦å¼€å¯æµè§ˆå™¨çš„Java Script支æŒã€‚" ++ ++msgid "" ++"Your Internet Explorer is too old to display this page correctly. Please " ++"upgrade it to at least version 7 or use another browser like Firefox, Opera " ++"or Safari." ++msgstr "" ++"ä½ çš„Internet Explorerå·²ç»è€åˆ°æ— æ³•æ­£å¸¸æ˜¾ç¤ºè¿™ä¸ªé¡µé¢äº†!请至少更新到IE7或者使用诸" ++"如Firefox Opera Safari之类的æµè§ˆå™¨." ++ ++msgid "any" ++msgstr "ä»»æ„" ++ ++msgid "auto" ++msgstr "自动" ++ ++msgid "automatic" ++msgstr "自动" ++ ++msgid "baseT" ++msgstr "baseT" ++ ++msgid "bridged" ++msgstr "桥接的" ++ ++msgid "create:" ++msgstr "创建:" ++ ++msgid "creates a bridge over specified interface(s)" ++msgstr "为指定接å£åˆ›å»ºæ¡¥æŽ¥" ++ ++msgid "dB" ++msgstr "dB" ++ ++msgid "dBm" ++msgstr "dBm" ++ ++msgid "disable" ++msgstr "ç¦ç”¨" ++ ++msgid "disabled" ++msgstr "å·²ç¦ç”¨" ++ ++msgid "expired" ++msgstr "过期时间" ++ ++msgid "" ++"file where given DHCP-leases will be stored" ++msgstr "" ++"存放DHCP租约的文件" ++ ++msgid "forward" ++msgstr "转å‘" ++ ++msgid "full-duplex" ++msgstr "å…¨åŒå·¥" ++ ++msgid "half-duplex" ++msgstr "åŠåŒå·¥" ++ ++msgid "help" ++msgstr "帮助" ++ ++msgid "hidden" ++msgstr "éšè—" ++ ++msgid "hybrid mode" ++msgstr "æ··åˆæ¨¡å¼" ++ ++msgid "if target is a network" ++msgstr "如果对象是一个网络" ++ ++msgid "input" ++msgstr "输入" ++ ++msgid "kB" ++msgstr "kB" ++ ++msgid "kB/s" ++msgstr "kB/s" ++ ++msgid "kbit/s" ++msgstr "kbit/s" ++ ++msgid "local DNS file" ++msgstr "本地DNS解æžæ–‡ä»¶" ++ ++msgid "minimum 1280, maximum 1480" ++msgstr "最å°å€¼1280,最大值1480" ++ ++msgid "navigation Navigation" ++msgstr "" ++ ++msgid "no" ++msgstr "no" ++ ++msgid "no link" ++msgstr "未连接" ++ ++msgid "none" ++msgstr "æ— " ++ ++msgid "not present" ++msgstr "" ++ ++msgid "off" ++msgstr "å…³" ++ ++msgid "on" ++msgstr "å¼€" ++ ++msgid "open" ++msgstr "开放å¼" ++ ++msgid "overlay" ++msgstr "" ++ ++msgid "relay mode" ++msgstr "中继模å¼" ++ ++msgid "routed" ++msgstr "已路由" ++ ++msgid "server mode" ++msgstr "æœåŠ¡å™¨æ¨¡å¼" ++ ++msgid "skiplink1 Skip to navigation" ++msgstr "" ++ ++msgid "skiplink2 Skip to content" ++msgstr "" ++ ++msgid "stateful-only" ++msgstr "" ++ ++msgid "stateless" ++msgstr "" ++ ++msgid "stateless + stateful" ++msgstr "" ++ ++msgid "tagged" ++msgstr "å…³è”" ++ ++msgid "unknown" ++msgstr "未知" ++ ++msgid "unlimited" ++msgstr "æ— é™åˆ¶" ++ ++msgid "unspecified" ++msgstr "未指定" ++ ++msgid "unspecified -or- create:" ++msgstr "未指定 // 创建:" ++ ++msgid "untagged" ++msgstr "ä¸å…³è”" ++ ++msgid "yes" ++msgstr "是" ++ ++msgid "« Back" ++msgstr "« åŽé€€" ++ ++#~ msgid "CPU frequency" ++#~ msgstr "CPU 频率" ++ ++#~ msgid "Chip Model" ++#~ msgstr "芯片型å·" ++ ++#~ msgid "" ++#~ "Always use 40MHz channels even if the secondary channel overlaps. Using " ++#~ "this option does not comply with IEEE 802.11n-2009!" ++#~ msgstr "强制å¯ç”¨40MHz频宽并忽略辅助信é“é‡å ã€‚此选项ä¸å…¼å®¹IEEE 802.11n-2009!" ++ ++#~ msgid "Cached" ++#~ msgstr "已缓存" ++ ++#~ msgid "Configures this mount as overlay storage for block-extroot" ++#~ msgstr "设置挂载为extroot" ++ ++#~ msgid "Force 40MHz mode" ++#~ msgstr "强制40MHz频宽" ++ ++#~ msgid "Frequency Hopping" ++#~ msgstr "跳频" ++ ++#~ msgid "Locked to channel %d used by %s" ++#~ msgstr "ä¿¡é“å·²é”定为:%d ï¼›æºäºŽ:%s " ++ ++#~ msgid "Use as root filesystem" ++#~ msgstr "设置为根文件系统" ++ ++#~ msgid "Ad-hoc mode" ++#~ msgstr "Ad-hoc模å¼" ++ ++#~ msgid "HE.net user ID" ++#~ msgstr "HE.net用户ID" ++ ++#~ msgid "This is the 32 byte hex encoded user ID, not the login name" ++#~ msgstr "这是32 byte hexç¼–ç çš„用户ID,ä¸æ˜¯ç™»å½•å" ++ ++#~ msgid "40MHz 2nd channel above" ++#~ msgstr "40MHz HT40+ (ä»…1-7频é“å¯ç”¨ï¼‰" ++ ++#~ msgid "40MHz 2nd channel below" ++#~ msgstr "40MHz HT40- (ä»…5-13频é“å¯ç”¨ï¼‰" ++ ++#~ msgid "Accept router advertisements" ++#~ msgstr "接收路由通告" ++ ++#~ msgid "Advertise IPv6 on network" ++#~ msgstr "在网络上通告IPv6" ++ ++#~ msgid "Advertised network ID" ++#~ msgstr "通告的网络ID" ++ ++#~ msgid "Allowed range is 1 to 65535" ++#~ msgstr "å…许的范围:1 到 65535" ++ ++#~ msgid "HT capabilities" ++#~ msgstr "HT功能" ++ ++#~ msgid "HT mode" ++#~ msgstr "HT模å¼" ++ ++#~ msgid "Router Model" ++#~ msgstr "主机型å·" ++ ++#~ msgid "Router Name" ++#~ msgstr "系统å称" ++ ++#~ msgid "Send router solicitations" ++#~ msgstr "å‘é€è·¯ç”±è¯·æ±‚" ++ ++#~ msgid "Specifies the advertised preferred prefix lifetime in seconds" ++#~ msgstr "指定通告的首选å‰ç¼€ç”Ÿå­˜æ—¶é—´(秒)" ++ ++#~ msgid "Specifies the advertised valid prefix lifetime in seconds" ++#~ msgstr "指定通告的有效å‰ç¼€ç”Ÿå­˜æ—¶é—´(秒)" ++ ++#~ msgid "Use preferred lifetime" ++#~ msgstr "使用首选生存时间" ++ ++#~ msgid "Use valid lifetime" ++#~ msgstr "使用有效生存时间" ++ ++#~ msgid "Waiting for router..." ++#~ msgstr "等待路由器..." ++ ++#~ msgid "Enable builtin NTP server" ++#~ msgstr "å¼€å¯å†…ç½®NTPæœåŠ¡å™¨" ++ ++#~ msgid "Active Leases" ++#~ msgstr "活动的租约" ++ ++#~ msgid "Open" ++#~ msgstr "打开" ++ ++#~ msgid "KB" ++#~ msgstr "KB" ++ ++#~ msgid "Bit Rate" ++#~ msgstr "比特率" ++ ++#~ msgid "Configuration / Apply" ++#~ msgstr "设置 /应用" ++ ++#~ msgid "Configuration / Changes" ++#~ msgstr "设置 / 修改" ++ ++#~ msgid "Configuration / Revert" ++#~ msgstr "设置 / é‡ç½®" ++ ++#~ msgid "MAC" ++#~ msgstr "MAC" ++ ++#~ msgid "MAC Address" ++#~ msgstr "MAC地å€" ++ ++#~ msgid "Encr." ++#~ msgstr "加密" ++ ++#~ msgid "WLAN-Scan" ++#~ msgstr "æœç´¢WLAN" ++ ++#~ msgid "" ++#~ "Choose the network you want to attach to this wireless interface. Select " ++#~ "unspecified to not attach any network or fill out the " ++#~ "create field to define a new network." ++#~ msgstr "" ++#~ "请选择你需è¦é“¾æŽ¥åˆ°æ— çº¿ç½‘络接å£çš„网络. 如果ä¸é“¾æŽ¥åˆ°ä»»ä½•ç½‘络请选择 未指" ++#~ "定,如果需è¦åˆ›å»ºæ–°ç½‘络请点创建." ++ ++#~ msgid "Create Network" ++#~ msgstr "创建一个网络" ++ ++#~ msgid "Link" ++#~ msgstr "链接" ++ ++#~ msgid "Networks" ++#~ msgstr "网络" ++ ++#~ msgid "Power" ++#~ msgstr "Power" ++ ++#~ msgid "Wifi networks in your local environment" ++#~ msgstr "扫æ到的无线热点" ++ ++#~ msgid "" ++#~ "CIDR-Notation: " ++#~ "address/prefix" ++#~ msgstr "" ++#~ "CIDR-Notation: " ++#~ "address/prefix" ++ ++#~ msgid "DNS-Server" ++#~ msgstr "DNS-æœåŠ¡å™¨" ++ ++#~ msgid "IPv4-Broadcast" ++#~ msgstr "IPv4-广播" ++ ++#~ msgid "IPv6-Address" ++#~ msgstr "IPv6-地å€" ++ ++#~ msgid "IP-Aliases" ++#~ msgstr "IP-Aliases" ++ ++#~ msgid "IPv6 Setup" ++#~ msgstr "IPv6 设置" ++ ++#~ msgid "" ++#~ "Note: If you choose an interface here which is part of another network, " ++#~ "it will be moved into this network." ++#~ msgstr "" ++#~ "注æ„:当你选择一个已ç»å­˜åœ¨ä¸Žä¸€ä¸ªç½‘络中的接å£æ—¶ï¼Œå®ƒå°†ä¼šè¢«ç§»é™¤é‚£ä¸ªç½‘络。" ++ ++#~ msgid "" ++#~ "Really delete this interface? The deletion cannot be undone!\\nYou might " ++#~ "lose access to this router if you are connected via this interface." ++#~ msgstr "" ++#~ "Really delete this interface? The deletion cannot be undone!\n" ++#~ "You might lose access to this router if you are connected via this " ++#~ "interface." ++ ++#~ msgid "" ++#~ "Really delete this wireless network? The deletion cannot be undone!\\nYou " ++#~ "might lose access to this router if you are connected via this network." ++#~ msgstr "" ++#~ "Really delete this wireless network? The deletion cannot be undone!\n" ++#~ "You might lose access to this router if you are connected via this " ++#~ "network." ++ ++#~ msgid "" ++#~ "Really shutdown interface \"%s\" ?\\nYou might lose access to this router " ++#~ "if you are connected via this interface." ++#~ msgstr "" ++#~ "Really shutdown interface \"%s\" ?\n" ++#~ "You might lose access to this router if you are connected via this " ++#~ "interface." ++ ++#~ msgid "" ++#~ "Really shutdown network ?\\nYou might lose access to this router if you " ++#~ "are connected via this interface." ++#~ msgstr "" ++#~ "Really shutdown network ?\n" ++#~ "You might lose access to this router if you are connected via this " ++#~ "interface." ++ ++#~ msgid "" ++#~ "The network ports on your router can be combined to several VLANs in which computers can " ++#~ "communicate directly with each other. VLANs are often used to separate different network " ++#~ "segments. Often there is by default one Uplink port for a connection to " ++#~ "the next greater network like the internet and other ports for a local " ++#~ "network." ++#~ msgstr "" ++#~ "本设备å¯ä»¥åˆ’分为多个VLAN,并支æŒç”µè„‘间的直接通讯;VLAN也常用于分割ä¸åŒç½‘段;默认通常是一æ¡ä¸Šä¼ ç«¯å£è¿žæŽ¥ISP,其余端" ++#~ "å£ä¸ºæœ¬åœ°å­ç½‘。" ++ ++#~ msgid "Enable buffering" ++#~ msgstr "å¼€å¯ç¼“冲" ++ ++#~ msgid "IPv6-over-IPv4" ++#~ msgstr "IPv6-over-IPv4" ++ ++#~ msgid "Custom Files" ++#~ msgstr "自定义文件" ++ ++#~ msgid "Custom files" ++#~ msgstr "自定义文件" ++ ++#~ msgid "Detected Files" ++#~ msgstr "查询到的文件" ++ ++#~ msgid "Detected files" ++#~ msgstr "查询到的文件" ++ ++#~ msgid "Files to be kept when flashing a new firmware" ++#~ msgstr "更新固件时被ä¿å­˜çš„文件" ++ ++#~ msgid "General" ++#~ msgstr "基本信æ¯" ++ ++#~ msgid "" ++#~ "Here you can customize the settings and the functionality of LuCI." ++#~ msgstr "" ++#~ "这里å¯ä»¥è‡ªå®šä¹‰LuCI的组" ++#~ "件和功能。" ++ ++#~ msgid "Post-commit actions" ++#~ msgstr "Post-commitæ“作" ++ ++#~ msgid "" ++#~ "The following files are detected by the system and will be kept " ++#~ "automatically during sysupgrade" ++#~ msgstr "更新固件时è¦ä¿å­˜çš„文件" ++ ++#~ msgid "" ++#~ "These commands will be executed automatically when a given UCI configuration is committed " ++#~ "allowing changes to be applied instantly." ++#~ msgstr "" ++#~ "当UCIé…ç½®æ交并生效" ++#~ "åŽï¼Œè¿™äº›å‘½ä»¤å°†è¢«è‡ªåŠ¨æ‰§è¡Œã€‚" ++ ++#~ msgid "" ++#~ "This is a list of shell glob patterns for matching files and directories " ++#~ "to include during sysupgrade" ++#~ msgstr "系统å‡çº§æ—¶è¦ä¿å­˜çš„é…置文件以åŠç›®å½•çš„串列清å•" ++ ++#~ msgid "Web UI" ++#~ msgstr "Web UI" ++ ++#~ msgid "PPTP-Server" ++#~ msgstr "" ++#~ "PPTP-æœåŠ¡å™¨" ++ ++#~ msgid "AHCP Settings" ++#~ msgstr "AHCP设置" ++ ++#~ msgid "ARP ping retries" ++#~ msgstr "é‡è¯•ARP ping" ++ ++#~ msgid "ATM Settings" ++#~ msgstr "ATM设置" ++ ++#~ msgid "Accept Router Advertisements" ++#~ msgstr "接收路由公告" ++ ++#~ msgid "Access point (APN)" ++#~ msgstr "接入点(APN)" ++ ++#~ msgid "Additional pppd options" ++#~ msgstr "附加pppd选项" ++ ++#~ msgid "Allowed range is 1 to FFFF" ++#~ msgstr "å…许范围:1 ~ FFFF" ++ ++#~ msgid "Automatic Disconnect" ++#~ msgstr "自动断开" ++ ++#~ msgid "Backup Archive" ++#~ msgstr "备份的存档" ++ ++#~ msgid "" ++#~ "Configure the local DNS server to use the name servers adverticed by the " ++#~ "PPP peer" ++#~ msgstr "本地DNSæœåŠ¡å™¨ä½¿ç”¨PPP端局æ供的域åæœåŠ¡å™¨" ++ ++#~ msgid "Connect script" ++#~ msgstr "连接脚本" ++ ++#~ msgid "Create backup" ++#~ msgstr "创建备份" ++ ++#~ msgid "Default" ++#~ msgstr "默认" ++ ++#~ msgid "Disconnect script" ++#~ msgstr "断开脚本" ++ ++#~ msgid "Edit package lists and installation targets" ++#~ msgstr "修改软件包的åŒæ­¥æºå’Œå®‰è£…地å€" ++ ++#~ msgid "Enable 4K VLANs" ++#~ msgstr "å¼€å¯4K VLAN" ++ ++#~ msgid "Enable IPv6 on PPP link" ++#~ msgstr "在PPP链路上å¯ç”¨IPv6" ++ ++#~ msgid "Firmware image" ++#~ msgstr "固件文件" ++ ++#~ msgid "Forward DHCP" ++#~ msgstr "转å‘DHCP" ++ ++#~ msgid "Forward broadcasts" ++#~ msgstr "转å‘广播" ++ ++#~ msgid "HE.net Tunnel ID" ++#~ msgstr "HE.net隧é“ID" ++ ++#~ msgid "" ++#~ "Here you can backup and restore your router configuration and - if " ++#~ "possible - reset the router to the default settings." ++#~ msgstr "这里å¯ä»¥å¤‡ä»½å’Œæ¢å¤è·¯ç”±å™¨çš„é…置,也å¯ä»¥æ¢å¤åˆ°ç³»ç»Ÿå‡ºåŽ‚设置。" ++ ++#~ msgid "Installation targets" ++#~ msgstr "安装ä½ç½®" ++ ++#~ msgid "Keep configuration files" ++#~ msgstr "ä¿ç•™é…置文件" ++ ++#~ msgid "Keep-Alive" ++#~ msgstr "ä¿æŒæ´»åŠ¨" ++ ++#~ msgid "Kernel" ++#~ msgstr "内核" ++ ++#~ msgid "" ++#~ "Let pppd replace the current default route to use the PPP interface after " ++#~ "successful connect" ++#~ msgstr "PPP连接æˆåŠŸåŽæ›¿æ¢å½“å‰é»˜è®¤è·¯ç”±ä¸ºpppd" ++ ++#~ msgid "Let pppd run this script after establishing the PPP link" ++#~ msgstr "PPP连接建立åŽè¿è¡Œæ­¤è„šæœ¬" ++ ++#~ msgid "Let pppd run this script before tearing down the PPP link" ++#~ msgstr "PPP连接断开å‰è¿è¡Œæ­¤è„šæœ¬" ++ ++#~ msgid "" ++#~ "Make sure that you provide the correct pin code here or you might lock " ++#~ "your sim card!" ++#~ msgstr "请确认pinç æ­£ç¡®ï¼Œå¹¶ä¸”没有é”定simå¡ï¼" ++ ++#~ msgid "" ++#~ "Most of them are network servers, that offer a certain service for your " ++#~ "device or network like shell access, serving webpages like LuCI, doing mesh routing, sending " ++#~ "e-mails, ..." ++#~ msgstr "" ++#~ "这些大部分是为设备或网络æ供特定æœåŠ¡çš„,比如shell访问,LuCI App,网间漫游,å‘é€E-mailç­‰..." ++ ++#~ msgid "Number of failed connection tests to initiate automatic reconnect" ++#~ msgstr "å¯åŠ¨è‡ªåŠ¨é‡è¿žçš„失败连接次数" ++ ++#~ msgid "Override Gateway" ++#~ msgstr "更新网关" ++ ++#~ msgid "PIN code" ++#~ msgstr "PINç " ++ ++#~ msgid "PPP Settings" ++#~ msgstr "PPP设置" ++ ++#~ msgid "Package lists" ++#~ msgstr "软件åŒæ­¥æº" ++ ++#~ msgid "" ++#~ "Port PVIDs specify the default " ++#~ "VLAN ID added to received untagged frames." ++#~ msgstr "" ++#~ "端å£çš„PVID指定了添加到所接收的未标" ++#~ "记桢的默认VLAN ID。" ++ ++#~ msgid "Port PVIDs on %q" ++#~ msgstr "分é…%q的端å£PVID" ++ ++#~ msgid "Proceed reverting all settings and resetting to firmware defaults?" ++#~ msgstr "放弃所有é…置并将路由å¤ä½åˆ°é»˜è®¤çŠ¶æ€ï¼Ÿ" ++ ++#~ msgid "Processor" ++#~ msgstr "处ç†å™¨" ++ ++#~ msgid "Radius-Port" ++#~ msgstr "Radius-端å£" ++ ++#~ msgid "Radius-Server" ++#~ msgstr "Radius-æœåŠ¡å™¨" ++ ++#~ msgid "" ++#~ "Really shutdown network ?\\nYou might loose access to this router if you " ++#~ "are connected via this interface." ++#~ msgstr "" ++#~ "真的è¦å…³é—­æ­¤ç½‘络?\n" ++#~ "如果正由此网络管ç†è·¯ç”±ï¼Œå¯èƒ½å¯¼è‡´æ— æ³•å†ç®¡ç†è·¯ç”±å™¨ï¼" ++ ++#~ msgid "Relay Settings" ++#~ msgstr "中继设置" ++ ++#~ msgid "Replace default route" ++#~ msgstr "é‡ç½®é»˜è®¤è·¯ç”±" ++ ++#~ msgid "Reset router to defaults" ++#~ msgstr "æ¢å¤å‡ºåŽ‚设置" ++ ++#~ msgid "Routing table ID" ++#~ msgstr "路由表ID" ++ ++#~ msgid "" ++#~ "Seconds to wait for the modem to become ready before attempting to connect" ++#~ msgstr "Modemå°è¯•è¿žæŽ¥çš„就绪准备时间" ++ ++#~ msgid "Send Router Solicitiations" ++#~ msgstr "å‘é€è·¯ç”±æŽ¢æµ‹" ++ ++#~ msgid "Server IPv4-Address" ++#~ msgstr "æœåŠ¡å™¨IPv4-地å€" ++ ++#~ msgid "Service type" ++#~ msgstr "æœåŠ¡ç±»åž‹" ++ ++#~ msgid "Services and daemons perform certain tasks on your device." ++#~ msgstr "路由器上è¿è¡Œçš„部分任务和æœåŠ¡ã€‚" ++ ++#~ msgid "Settings" ++#~ msgstr "设置" ++ ++#~ msgid "Setup wait time" ++#~ msgstr "设置缓冲时间" ++ ++#~ msgid "" ++#~ "Sorry. OpenWrt does not support a system upgrade on this platform.
    " ++#~ "You need to manually flash your device." ++#~ msgstr "抱歉,OpenWrtä¸æ”¯æŒæœ¬å¹³å°çš„系统å‡çº§ã€‚
    请手动刷新设备。" ++ ++#~ msgid "Specify additional command line arguments for pppd here" ++#~ msgstr "指定附加命令行å‚数到pppd" ++ ++#~ msgid "TTL" ++#~ msgstr "TTL" ++ ++#~ msgid "The device node of your modem, e.g. /dev/ttyUSB0" ++#~ msgstr "modem的设备节点。例如/dev/ttyUSB0" ++ ++#~ msgid "Time (in seconds) after which an unused connection will be closed" ++#~ msgstr "自动关闭空闲连接的延迟时间(秒)" ++ ++#~ msgid "Time Server (rdate)" ++#~ msgstr "æ ¡æ—¶æœåŠ¡å™¨(rdate)" ++ ++#~ msgid "Tunnel Settings" ++#~ msgstr "隧é“设置" ++ ++#~ msgid "Update package lists" ++#~ msgstr "更新软件列表" ++ ++#~ msgid "Upload an OpenWrt image file to reflash the device." ++#~ msgstr "上传OpenWrt固件以刷新设备。" ++ ++#~ msgid "Upload image" ++#~ msgstr "上传固件" ++ ++#~ msgid "Use peer DNS" ++#~ msgstr "使用对等DNS" ++ ++#~ msgid "VLAN %d" ++#~ msgstr "VLAN %d" ++ ++#~ msgid "" ++#~ "You can specify multiple DNS servers here, press enter to add a new " ++#~ "entry. Servers entered here will override automatically assigned ones." ++#~ msgstr "这里å¯ä»¥æŒ‡å®šå¤šè·¯DNSæœåŠ¡å™¨ã€‚输入åŽä¼šè‡ªåŠ¨è¦†ç›–已分é…çš„æ¡ç›®ã€‚" ++ ++#~ msgid "" ++#~ "You need to install \"comgt\" for UMTS/GPRS, \"ppp-mod-pppoe\" for PPPoE, " ++#~ "\"ppp-mod-pppoa\" for PPPoA or \"pptp\" for PPtP support" ++#~ msgstr "" ++#~ "UMTS/GPRS功能需安装\"comgt\",PPPoE需安装\"ppp-mod-pppoe\",PPPoA需安装" ++#~ "\"ppp-mod-pppoa\",PPtP需安装\"pptp\"。" ++ ++#~ msgid "back" ++#~ msgstr "åŽé€€" ++ ++#~ msgid "buffered" ++#~ msgstr "已缓冲" ++ ++#~ msgid "cached" ++#~ msgstr "已缓存" ++ ++#~ msgid "free" ++#~ msgstr "空闲" ++ ++#~ msgid "static" ++#~ msgstr "é™æ€" ++ ++#~ msgid "" ++#~ "LuCI is a collection " ++#~ "of free Lua software including an MVC-Webframework and webinterface for embedded devices. LuCI is licensed under the " ++#~ "Apache-License." ++#~ msgstr "" ++#~ "LuCI是一款嵌入å¼è®¾å¤‡ä½¿" ++#~ "用的å…è´¹Lua软件,包å«web框架和webç•Œé¢ã€‚LuCIéµå¾ªApache-License." ++ ++#~ msgid "SSH-Keys" ++#~ msgstr "SSH-密钥" ++ ++#~ msgid "" ++#~ "A lightweight HTTP/1.1 webserver written in C and Lua designed to serve " ++#~ "LuCI" ++#~ msgstr "一个用C语言和Lua实现的æœåŠ¡äºŽLuCIçš„è½»é‡çº§ HTTP/1.1 webæœåŠ¡å™¨ã€‚" ++ ++#~ msgid "" ++#~ "A small webserver which can be used to serve LuCI." ++#~ msgstr "" ++#~ "一个用于LuCIçš„å°åž‹webæœ" ++#~ "务器。" ++ ++#~ msgid "About" ++#~ msgstr "关于" ++ ++#~ msgid "Active IP Connections" ++#~ msgstr "活动IP连接" ++ ++#~ msgid "Addresses" ++#~ msgstr "地å€" ++ ++#~ msgid "Admin Password" ++#~ msgstr "管ç†å¯†ç " ++ ++#~ msgid "Alias" ++#~ msgstr "别å" ++ ++#~ msgid "Authentication Realm" ++#~ msgstr "验è¯èŒƒå›´" ++ ++#~ msgid "Bridge Port" ++#~ msgstr "桥接端å£" ++ ++#~ msgid "" ++#~ "Change the password of the system administrator (User root)" ++#~ msgstr "修改管ç†å‘˜å¯†ç " ++ ++#~ msgid "Client + WDS" ++#~ msgstr "客户端+WDS" ++ ++#~ msgid "Configuration file" ++#~ msgstr "é…置文件" ++ ++#~ msgid "Connection timeout" ++#~ msgstr "连接超时" ++ ++#~ msgid "Contributing Developers" ++#~ msgstr "特别致谢" ++ ++#~ msgid "DHCP assigned" ++#~ msgstr "DHCP有效分é…" ++ ++#~ msgid "Document root" ++#~ msgstr "根文档" ++ ++#~ msgid "Enable Keep-Alive" ++#~ msgstr "å¼€å¯ä¿æŒæ´»åŠ¨" ++ ++#~ msgid "Enable device" ++#~ msgstr "å¼€å¯è®¾å¤‡" ++ ++#~ msgid "Ethernet Bridge" ++#~ msgstr "以太网桥" ++ ++#~ msgid "" ++#~ "Here you can paste public SSH-Keys " ++#~ "(one per line) for SSH public-key " ++#~ "authentication." ++#~ msgstr "" ++#~ "这里å¯ä»¥ç²˜è´´å…¬ç”¨SSH密钥以用于SSH公共密钥认è¯(æ¯è¡Œä¸€ä¸ªå¯†é’¥)。" ++ ++#~ msgid "ID" ++#~ msgstr "ID" ++ ++#~ msgid "IP Configuration" ++#~ msgstr "IP设置" ++ ++#~ msgid "Interface Status" ++#~ msgstr "接å£çŠ¶æ€" ++ ++#~ msgid "Lead Development" ++#~ msgstr "å¼€å‘å‘导" ++ ++#~ msgid "Master" ++#~ msgstr "Master" ++ ++#~ msgid "Master + WDS" ++#~ msgstr "Master + WDS" ++ ++#~ msgid "No address configured on this interface." ++#~ msgstr "本接å£æœªè®¾ç½®åœ°å€" ++ ++#~ msgid "Not configured" ++#~ msgstr "未设置" ++ ++#~ msgid "Password successfully changed" ++#~ msgstr "密ç å·²ä¿®æ”¹" ++ ++#~ msgid "Plugin path" ++#~ msgstr "æ’件路径" ++ ++#~ msgid "Ports" ++#~ msgstr "端å£" ++ ++#~ msgid "Primary" ++#~ msgstr "主è¦çš„" ++ ++#~ msgid "Project Homepage" ++#~ msgstr "项目主页" ++ ++#~ msgid "Pseudo Ad-Hoc" ++#~ msgstr "伪装Ad-Hoc" ++ ++#~ msgid "STP" ++#~ msgstr "STP" ++ ++#~ msgid "Thanks To" ++#~ msgstr "æ„Ÿè°¢" ++ ++#~ msgid "" ++#~ "The realm which will be displayed at the authentication prompt for " ++#~ "protected pages." ++#~ msgstr "在有æ示验è¯ä¿æŠ¤çš„网页时显示验è¯èŒƒå›´ã€‚" ++ ++#~ msgid "Unknown Error" ++#~ msgstr "未知错误" ++ ++#~ msgid "VLAN" ++#~ msgstr "VLAN" ++ ++#~ msgid "defaults to /etc/httpd.conf" ++#~ msgstr "默认为/etc/httpd.conf" ++ ++#~ msgid "Enable this switch" ++#~ msgstr "å¼€å¯äº¤æ¢æœº" ++ ++#~ msgid "OPKG error code %i" ++#~ msgstr "OPKG å‡ºé”™ä»£ç  %i" ++ ++#~ msgid "Package lists updated" ++#~ msgstr "更新软件包列表" ++ ++#~ msgid "Reset switch during setup" ++#~ msgstr "设置时å¤ä½äº¤æ¢æœº" ++ ++#~ msgid "Upgrade installed packages" ++#~ msgstr "å‡çº§å·²å®‰è£…软件" ++ ++#~ msgid "DNS-Port" ++#~ msgstr "DNS-端å£" ++ ++#~ msgid "" ++#~ "LuCI is a free, " ++#~ "flexible, and user friendly graphical interface for configuring OpenWrt " ++#~ "Kamikaze." ++#~ msgstr "" ++#~ "LuCI是一个å…费的,çµæ´»" ++#~ "的,å¯è§†åŒ–的用户界é¢ï¼Œå¯ç”¨æ¥é…ç½®OpenWrt。" ++ ++#~ msgid "AP-Isolation" ++#~ msgstr "AP隔离" ++ ++#~ msgid "Active IPv4-Routes" ++#~ msgstr "活动的IPv4链路" ++ ++#~ msgid "adds domain names to hostentries in the resolv file" ++#~ msgstr "添加域åæ¡ç›®åˆ°ä¸»æœºè§£æžæ–‡ä»¶" ++ ++#~ msgid "Add the Wifi network to physical network" ++#~ msgstr "添加无线网络到物ç†ç½‘络" ++ ++#~ msgid "" ++#~ "Also kernel or service logfiles can be viewed here to get an overview " ++#~ "over their current state." ++#~ msgstr "这里显示了系统日志,å¯ä»¥äº†è§£ç³»ç»Ÿå½“å‰çš„è¿è¡ŒçŠ¶æ€ã€‚" ++ ++#~ msgid "And now have fun with your router!" ++#~ msgstr "现在开始体验路由带æ¥çš„ä¹è¶£å§!" ++ ++#~ msgid "" ++#~ "As we always want to improve this interface we are looking forward to " ++#~ "your feedback and suggestions." ++#~ msgstr "我们一直在努力æå‡ç•Œé¢æ•ˆæžœï¼Œå¹¶æœŸå¾…ç€æ‚¨çš„æ„è§ä¸Žå»ºè®®ã€‚" ++ ++#~ msgid "Attach to existing network" ++#~ msgstr "连接现有网络" ++ ++#~ msgid "Clamp Segment Size" ++#~ msgstr "固定段大å°" ++ ++#~ msgid "Configuration applied" ++#~ msgstr "设置已应用" ++ ++#~ msgid "Create Or Attach Network" ++#~ msgstr "创建/连接 网络" ++ ++#~ msgid "Devices" ++#~ msgstr "设备" ++ ++#~ msgid "enable" ++#~ msgstr "å¯ç”¨" ++ ++#~ msgid "Errors" ++#~ msgstr "错误" ++ ++#~ msgid "Essentials" ++#~ msgstr "概è¦" ++ ++#~ msgid "" ++#~ "Fixes problems with unreachable websites, submitting forms or other " ++#~ "unexpected behaviour for some ISPs." ++#~ msgstr "ä¿®å¤æŸäº›ISPçš„ä¸å¯è¾¾ç½‘站或其他未知错误" ++ ++#~ msgid "" ++#~ "filter useless DNS-queries of " ++#~ "Windows-systems" ++#~ msgstr "" ++#~ "过滤无用的DNSWindows-systems查询" ++ ++#~ msgid "Hardware Address" ++#~ msgstr "硬件地å€" ++ ++#~ msgid "Hello!" ++#~ msgstr "Hello!" ++ ++#~ msgid "Here you can configure installed wifi devices." ++#~ msgstr "这里å¯ä»¥é…置已安装的无线设备。" ++ ++#~ msgid "" ++#~ "Here you can find information about the current system status like CPU clock frequency, memory " ++#~ "usage or network interface data." ++#~ msgstr "" ++#~ "这里å¯ä»¥æŸ¥çœ‹ç³»ç»Ÿå½“å‰çš„状æ€ä¿¡æ¯ï¼Œæ¯”如CPU频率ã€å†…存使用率或网络链接数æ®ã€‚" ++ ++#~ msgid "" ++#~ "If the interface is attached to an existing network it will be " ++#~ "bridged to the existing interfaces and is covered by the " ++#~ "firewall zone of the choosen network.
    Uncheck the attach option to " ++#~ "define a new standalone network for this interface." ++#~ msgstr "" ++#~ "如果连接在已有网络,那么它会被桥接到现有接å£ï¼Œå¹¶ä¸”被所选的防ç«å¢™" ++#~ "区域覆盖。å–消附加选项å¯ä»¥é‡å®šä¹‰æ­¤æŽ¥å£ä¸ºæ–°çš„独立网络。" ++ ++#~ msgid "Ignore /etc/hosts" ++#~ msgstr "忽略 /etc/hosts" ++ ++#~ msgid "Independent (Ad-Hoc)" ++#~ msgstr "独立(点对点Ad-Hoc)" ++ ++#~ msgid "Internet Connection" ++#~ msgstr "网络连接" ++ ++#~ msgid "Join (Client)" ++#~ msgstr "加入(客户端)" ++ ++#~ msgid "Leases" ++#~ msgstr "租约" ++ ++#~ msgid "localises the hostname depending on its subnet" ++#~ msgstr "æ ¹æ®å­ç½‘本地化主机å" ++ ++#~ msgid "LuCI Components" ++#~ msgstr "LuCI 组件" ++ ++#~ msgid "" ++#~ "Notice: In LuCI " ++#~ "changes have to be confirmed by clicking Changes - Save & Apply " ++#~ "before being applied." ++#~ msgstr "" ++#~ "注æ„:在LuCI中,点击 ä¿" ++#~ "å­˜&应用 åŽè®¾ç½®æ‰ä¼šç”Ÿæ•ˆã€‚" ++ ++#~ msgid "" ++#~ "On the following pages you can adjust all important settings of your " ++#~ "router." ++#~ msgstr "本页å¯ä»¥è®¾ç½®è·¯ç”±å™¨çš„é‡è¦å‚数。" ++ ++#~ msgid "Perform Actions" ++#~ msgstr "执行æ“作" ++ ++#~ msgid "" ++#~ "prevents caching of negative DNS-replies" ++#~ msgstr "阻止缓存无效的DNS应答" ++ ++#~ msgid "Prevents client to client communication" ++#~ msgstr "ç¦æ­¢å®¢æˆ·ç«¯é—´çš„通信" ++ ++#~ msgid "Provide (Access Point)" ++#~ msgstr "添加(接入点)" ++ ++#~ msgid "Search file..." ++#~ msgstr "查找文件..." ++ ++#~ msgid "Server" ++#~ msgstr "æœåŠ¡å™¨" ++ ++#~ msgid "TX / RX" ++#~ msgstr "å‘é€ / 接收" ++ ++#~ msgid "The LuCI Team" ++#~ msgstr "LuCIå¼€å‘团队" ++ ++#~ msgid "The following changes have been comitted" ++#~ msgstr "以下更改已æ交" ++ ++#~ msgid "The following changes have been applied" ++#~ msgstr "以下更改已生效" ++ ++#~ msgid "" ++#~ "This is the administration area of LuCI." ++#~ msgstr "" ++#~ "这是LuCI的管ç†é¡µé¢ã€‚" ++ ++#~ msgid "transmitted / received" ++#~ msgstr "已传输 / 已接收" ++ ++#~ msgid "" ++#~ "When flashing a new firmware with LuCI these files will be added to the new firmware " ++#~ "installation." ++#~ msgstr "" ++#~ "当刷写带LuCI的新固件" ++#~ "时,这些文件将被加入到新的固件中。" ++ ++#~ msgid "" ++#~ "With DHCP " ++#~ "network members can automatically receive their network settings (IP-address, netmask, DNS-server, ...)." ++#~ msgstr "" ++#~ "用户å¯ä»¥é€šè¿‡DHCP自动接收网络的(IP地å€ï¼Œå­ç½‘" ++#~ "掩ç ï¼ŒDNSæœåŠ¡å™¨, ...)ç­‰é…置信" ++#~ "æ¯ã€‚" ++ ++#~ msgid "Wireless Scan" ++#~ msgstr "æœç´¢æ— çº¿" ++ ++#~ msgid "" ++#~ "You are about to join the wireless network %s. " ++#~ "In order to complete the process, you need to provide some additional " ++#~ "details." ++#~ msgstr "" ++#~ "å³å°†åŠ å…¥æ— çº¿ç½‘络%s,这需è¦å¡«å†™ä¸€äº›é¢å¤–ä¿¡æ¯ã€‚" ++ ++#~ msgid "" ++#~ "You can run several wifi networks with one device. Be aware that there " ++#~ "are certain hardware and driverspecific restrictions. Normally you can " ++#~ "operate 1 Ad-Hoc or up to 3 Master-Mode and 1 Client-Mode network " ++#~ "simultaneously." ++#~ msgstr "" ++#~ "一å°è®¾å¤‡å¯ä»¥ç”¨è™šæ‹Ÿæ–¹å¼åŒæ—¶è¿è¡Œå‡ ä¸ªæ— çº¿ç½‘络。但注æ„会有硬件或软件é™åˆ¶ã€‚通常" ++#~ "å¯ä»¥è¿è¡Œä¸€ä¸ªç‚¹å¯¹ç‚¹æ— çº¿ç½‘络,或åŒæ—¶è¿è¡Œä¸‰ä¸ªMaster模å¼å’Œä¸€ä¸ªå®¢æˆ·ç«¯æ¨¡å¼çš„无线" ++#~ "网络。" ++ ++#~ msgid "" ++#~ "You need to install \"ppp-mod-pppoe\" for PPPoE or \"pptp\" for PPtP " ++#~ "support" ++#~ msgstr "需è¦å®‰è£…\"ppp-mod-pppoe\"以支æŒPPPoe,\"pptp\"以支æŒPPtP" ++ ++#~ msgid "" ++#~ "You need to install wpa-supplicant to use WPA!" ++#~ msgstr "需è¦å®‰è£…wpa-supplicant以支æŒWPA加密!" ++ ++#~ msgid "" ++#~ "You need to install the Broadcom nas supplicant " ++#~ "to use WPA!" ++#~ msgstr "" ++#~ "需è¦å®‰è£…Broadcomnas supplicant以支æŒWPA加密!" ++ ++#~ msgid "User Interface" ++#~ msgstr "用户界é¢" ++ ++#~ msgid "(hidden)" ++#~ msgstr "(éšè—)" ++ ++#~ msgid "(optional)" ++#~ msgstr "(ä»»æ„)" ++ ++#~ msgid "Aliases" ++#~ msgstr "别å" ++ ++#~ msgid "First leased address" ++#~ msgstr "起始分é…地å€" ++ ++#~ msgid "Local Network" ++#~ msgstr "本地网络" ++ ++#~ msgid "Number of leased addresses" ++#~ msgstr "地å€ç§Ÿç”¨æ•°" ++ ++#~ msgid "Resolvfile" ++#~ msgstr "解æžæ–‡ä»¶" ++ ++#~ msgid "Zone" ++#~ msgstr "区域" ++ ++#~ msgid "additional hostfile" ++#~ msgstr "附加的主机文件" ++ ++#~ msgid "automatically reconnect" ++#~ msgstr "自动é‡è¿ž" ++ ++#~ msgid "concurrent queries" ++#~ msgstr "并å‘查询" ++ ++#~ msgid "disconnect when idle for" ++#~ msgstr "空闲自动断开" ++ ++#~ msgid "don't cache unknown" ++#~ msgstr "ä¸ç¼“存未知数æ®" ++ ++#~ msgid "installed" ++#~ msgstr "已安装" ++ ++#~ msgid "manual" ++#~ msgstr "手册" ++ ++#~ msgid "not installed" ++#~ msgstr "未安装" ++ ++#~ msgid "query port" ++#~ msgstr "查询端å£" ++ ++#~ msgid "all" ++#~ msgstr "全部" ++ ++#~ msgid "Code" ++#~ msgstr "代ç " ++ ++#~ msgid "Distance" ++#~ msgstr "è·ç¦»" ++ ++#~ msgid "Legend" ++#~ msgstr "图例" ++ ++#~ msgid "Library" ++#~ msgstr "Library" ++ ++#~ msgid "see '%s' manpage" ++#~ msgstr "è¯¦å‚ '%s' è”机帮助" ++ ++#~ msgid "Package Manager" ++#~ msgstr "软件包管ç†" ++ ++#~ msgid "Service" ++#~ msgstr "æœåŠ¡" ++ ++#~ msgid "Statistics" ++#~ msgstr "统计信æ¯" +diff --git a/feeds/luci/modules/luci-base/po/zh-tw/base.po b/feeds/luci/modules/luci-base/po/zh-tw/base.po +new file mode 100644 +index 0000000..ec901b8 +--- /dev/null ++++ b/feeds/luci/modules/luci-base/po/zh-tw/base.po +@@ -0,0 +1,3222 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"PO-Revision-Date: 2014-05-21 10:34+0200\n" ++"Last-Translator: omnistack \n" ++"Language-Team: none\n" ++"Language: zh_TW\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=1; plural=0;\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "(%d minute window, %d second interval)" ++msgstr "(%d 分é˜è¨Šæ¯, %d 秒更新)" ++ ++msgid "(%s available)" ++msgstr "(%s å¯ç”¨)" ++ ++msgid "(empty)" ++msgstr "(空白)" ++ ++msgid "(no interfaces attached)" ++msgstr "(未連接界é¢)" ++ ++msgid "-- Additional Field --" ++msgstr "-- 更多é¸é … --" ++ ++msgid "-- Please choose --" ++msgstr "-- è«‹é¸æ“‡ --" ++ ++msgid "-- custom --" ++msgstr "-- 自訂 --" ++ ++msgid "-- match by device --" ++msgstr "" ++ ++msgid "-- match by label --" ++msgstr "" ++ ++msgid "1 Minute Load:" ++msgstr "1分é˜è² è¼‰" ++ ++msgid "15 Minute Load:" ++msgstr "15分é˜è² è¼‰" ++ ++msgid "5 Minute Load:" ++msgstr "5分é˜è² è¼‰" ++ ++msgid "BSSID" ++msgstr "BSSID" ++ ++msgid "DNS query port" ++msgstr "DNS 查詢通訊埠" ++ ++msgid "DNS server port" ++msgstr "DNS 伺æœå™¨é€šè¨ŠåŸ " ++ ++msgid "" ++"DNS servers will be queried in the " ++"order of the resolvfile" ++msgstr "將會按照指定的順åºæŸ¥è©¢DNS" ++ ++msgid "ESSID" ++msgstr "ESSID" ++ ++msgid "IPv4-Address" ++msgstr "IPv4-ä½ç½®" ++ ++msgid "IPv4-Gateway" ++msgstr "IPv4-é–˜é“" ++ ++msgid "IPv4-Netmask" ++msgstr "IPv4-é®ç½©" ++ ++msgid "" ++"IPv6-Address or Network " ++"(CIDR)" ++msgstr "" ++"IPv6-ä½ç½®æˆ–網路(CIDR)" ++ ++msgid "IPv6-Gateway" ++msgstr "IPv6-é–˜é“" ++ ++msgid "IPv6-Suffix (hex)" ++msgstr "" ++ ++msgid "LED Configuration" ++msgstr "LED 設定" ++ ++msgid "LED Name" ++msgstr "LED å稱" ++ ++msgid "MAC-Address" ++msgstr "MAC-ä½ç½®" ++ ++msgid "" ++"Max. DHCP leases" ++msgstr "" ++"最大 DHCP 分é…數é‡" ++ ++msgid "" ++"Max. EDNS0 packet size" ++msgstr "" ++"最大 EDNS0 å°åŒ…大å°" ++ ++msgid "Max. concurrent queries" ++msgstr "最大並發查詢數" ++ ++msgid "%s - %s" ++msgstr "%s - %s" ++ ++msgid "ADSL" ++msgstr "" ++ ++msgid "ADSL Status" ++msgstr "" ++ ++msgid "AICCU (SIXXS)" ++msgstr "" ++ ++msgid "APN" ++msgstr "APN" ++ ++msgid "AR Support" ++msgstr "AR支æ´" ++ ++msgid "ARP retry threshold" ++msgstr "ARPé‡è©¦é–€æª»" ++ ++msgid "ATM Bridges" ++msgstr "ATM橋接" ++ ++msgid "ATM Virtual Channel Identifier (VCI)" ++msgstr "ATM虛擬通é“識別(VCI)" ++ ++msgid "ATM Virtual Path Identifier (VPI)" ++msgstr "ATM虛擬路徑識別(VPI)" ++ ++msgid "" ++"ATM bridges expose encapsulated ethernet in AAL5 connections as virtual " ++"Linux network interfaces which can be used in conjunction with DHCP or PPP " ++"to dial into the provider network." ++msgstr "" ++"ATM橋接是以AAL5å”定å°è£ä¹™å¤ªç¶²è·¯å¦‚åŒè™›æ“¬Linux網路界é¢å¡ï¼Œç”¨æ–¼é€£æŽ¥DHCP或PPP來撥" ++"號連接到網際網路。" ++ ++msgid "ATM device number" ++msgstr "ATMè£ç½®è™Ÿç¢¼" ++ ++msgid "AYIYA" ++msgstr "" ++ ++msgid "Access Concentrator" ++msgstr "接入集線器" ++ ++msgid "Access Point" ++msgstr "å­˜å–點 (AP)" ++ ++msgid "Action" ++msgstr "動作" ++ ++msgid "Actions" ++msgstr "動作" ++ ++msgid "Activate this network" ++msgstr "啟用此網路" ++ ++msgid "Active IPv4-Routes" ++msgstr "啟用 IPv4-路由" ++ ++msgid "Active IPv6-Routes" ++msgstr "啟用 IPv6-路由" ++ ++msgid "Active Connections" ++msgstr "啟用連線" ++ ++msgid "Active DHCP Leases" ++msgstr "已分é…çš„DHCP租用" ++ ++msgid "Active DHCPv6 Leases" ++msgstr "已分é…çš„DHCPv6租用" ++ ++msgid "Ad-Hoc" ++msgstr "Ad-Hoc" ++ ++msgid "Add" ++msgstr "增加" ++ ++msgid "Add local domain suffix to names served from hosts files" ++msgstr "添加本地網域微碼到HOSTS檔案" ++ ++msgid "Add new interface..." ++msgstr "增加新界é¢" ++ ++msgid "Additional Hosts files" ++msgstr "é¡å¤–çš„HOST檔案" ++ ++msgid "Address" ++msgstr "ä½ç½®" ++ ++msgid "Address to access local relay bridge" ++msgstr "å­˜å–本地中繼橋接ä½ç½®" ++ ++msgid "Administration" ++msgstr "管ç†" ++ ++msgid "Advanced Settings" ++msgstr "進階設定" ++ ++msgid "Alert" ++msgstr "警示" ++ ++msgid "Allow SSH password authentication" ++msgstr "å…許 SSH 密碼驗證" ++ ++msgid "Allow all except listed" ++msgstr "僅å…許列表外" ++ ++msgid "Allow listed only" ++msgstr "僅å…許列表內" ++ ++msgid "Allow localhost" ++msgstr "å…許本機" ++ ++msgid "Allow remote hosts to connect to local SSH forwarded ports" ++msgstr "å…許é ç«¯ä¸»æ©Ÿé€£æŽ¥åˆ°æœ¬æ©ŸSSH轉é€é€šè¨ŠåŸ " ++ ++msgid "Allow root logins with password" ++msgstr "å…許root登入" ++ ++msgid "Allow the root user to login with password" ++msgstr "å…許 root 使用者登入" ++ ++msgid "" ++"Allow upstream responses in the 127.0.0.0/8 range, e.g. for RBL services" ++msgstr "å…許127.0.0.0/8範åœå…§çš„上游回應,例如:RBLæœå‹™" ++ ++msgid "" ++"Also see Tunneling Comparison on SIXXS" ++msgstr "" ++ ++msgid "Always announce default router" ++msgstr "" ++ ++msgid "An additional network will be created if you leave this unchecked." ++msgstr "å–消é¸å–將會å¦å¤–建立一個新網路,而ä¸æœƒè¦†è“‹ç›®å‰çš„網路設定" ++ ++msgid "Announce as default router even if no public prefix is available." ++msgstr "" ++ ++msgid "Announced DNS domains" ++msgstr "" ++ ++msgid "Announced DNS servers" ++msgstr "" ++ ++msgid "Antenna 1" ++msgstr "天線 1" ++ ++msgid "Antenna 2" ++msgstr "天線 2" ++ ++msgid "Antenna Configuration" ++msgstr "天線設定" ++ ++msgid "Any zone" ++msgstr "ä»»æ„å€åŸŸ" ++ ++msgid "Apply" ++msgstr "套用" ++ ++msgid "Applying changes" ++msgstr "正在套用變更" ++ ++msgid "" ++"Assign a part of given length of every public IPv6-prefix to this interface" ++msgstr "" ++ ++msgid "Assign interfaces..." ++msgstr "分é…ç•Œé¢..." ++ ++msgid "" ++"Assign prefix parts using this hexadecimal subprefix ID for this interface." ++msgstr "" ++ ++msgid "Associated Stations" ++msgstr "已連接站點" ++ ++msgid "Atheros 802.11%s Wireless Controller" ++msgstr "Atheros 802.11%s 無線控制器" ++ ++msgid "AuthGroup" ++msgstr "" ++ ++msgid "Authentication" ++msgstr "èªè­‰" ++ ++msgid "Authoritative" ++msgstr "授權" ++ ++msgid "Authorization Required" ++msgstr "需è¦æŽˆæ¬Š" ++ ++msgid "Auto Refresh" ++msgstr "自動更新" ++ ++msgid "Automatic" ++msgstr "" ++ ++msgid "Automatic Homenet (HNCP)" ++msgstr "" ++ ++msgid "Available" ++msgstr "å¯ç”¨" ++ ++msgid "Available packages" ++msgstr "å¯ç”¨è»Ÿé«”包" ++ ++msgid "Average:" ++msgstr "å¹³å‡:" ++ ++msgid "BSSID" ++msgstr "BSSID" ++ ++msgid "Back" ++msgstr "返回" ++ ++msgid "Back to Overview" ++msgstr "返回至總覽" ++ ++msgid "Back to configuration" ++msgstr "返回至設定" ++ ++msgid "Back to overview" ++msgstr "返回至總覽" ++ ++msgid "Back to scan results" ++msgstr "返回至掃æçµæžœ" ++ ++msgid "Background Scan" ++msgstr "背景æœå°‹" ++ ++msgid "Backup / Flash Firmware" ++msgstr "備份/å‡ç´šéŸŒé«”" ++ ++msgid "Backup / Restore" ++msgstr "備份/還原" ++ ++msgid "Backup file list" ++msgstr "備份檔列表" ++ ++msgid "Bad address specified!" ++msgstr "指定了錯誤的ä½ç½®ï¼" ++ ++msgid "Band" ++msgstr "" ++ ++msgid "Behind NAT" ++msgstr "" ++ ++msgid "" ++"Below is the determined list of files to backup. It consists of changed " ++"configuration files marked by opkg, essential base files and the user " ++"defined backup patterns." ++msgstr "" ++"下é¢æ˜¯å¾…備份的檔案清單。包å«äº†æ›´æ”¹çš„設定檔案ã€å¿…è¦çš„基本檔案和使用者自訂的備" ++"份檔案" ++ ++msgid "Bitrate" ++msgstr "傳輸速率" ++ ++msgid "Bogus NX Domain Override" ++msgstr "忽略NX網域解æž" ++ ++msgid "Bridge" ++msgstr "橋接" ++ ++msgid "Bridge interfaces" ++msgstr "橋接介é¢" ++ ++msgid "Bridge unit number" ++msgstr "橋接單ä½è™Ÿç¢¼" ++ ++msgid "Bring up on boot" ++msgstr "開機自動執行" ++ ++msgid "Broadcom 802.11%s Wireless Controller" ++msgstr "Broadcom 802.11%s 無線控制器" ++ ++msgid "Broadcom BCM%04x 802.11 Wireless Controller" ++msgstr "Broadcom BCM%04x 802.11 無線控制器" ++ ++msgid "Buffered" ++msgstr "已緩è¡" ++ ++msgid "Buttons" ++msgstr "按鈕" ++ ++msgid "CA certificate; if empty it will be saved after the first connection." ++msgstr "" ++ ++msgid "CPU" ++msgstr "CPU" ++ ++msgid "CPU usage (%)" ++msgstr "CPU 使用率 (%)" ++ ++msgid "Cancel" ++msgstr "å–消" ++ ++msgid "Category" ++msgstr "" ++ ++msgid "Chain" ++msgstr "éˆ" ++ ++msgid "Changes" ++msgstr "待修改" ++ ++msgid "Changes applied." ++msgstr "修改已套用" ++ ++msgid "Changes the administrator password for accessing the device" ++msgstr "修改管ç†å“¡å¯†ç¢¼" ++ ++msgid "Channel" ++msgstr "é »é“" ++ ++msgid "Check" ++msgstr "檢查" ++ ++msgid "Checksum" ++msgstr "效驗碼" ++ ++msgid "" ++"Choose the firewall zone you want to assign to this interface. Select " ++"unspecified to remove the interface from the associated zone or " ++"fill out the create field to define a new zone and attach the " ++"interface to it." ++msgstr "" ++"é¸æ“‡ä½ è¦æŒ‡å®šçµ¦é€™ä»‹é¢çš„防ç«ç‰†å€. æ’¿é¸unspecified以便從指定å€åŸŸé™¤é€™å€‹" ++"介é¢æˆ–者填寫create欄以便定義附加這個介é¢åˆ°ä¸€å€‹æ–°çš„å€åŸŸä¸Š." ++ ++msgid "" ++"Choose the network(s) you want to attach to this wireless interface or fill " ++"out the create field to define a new network." ++msgstr "" ++"é¸æ“‡ä½ è¦é™„加到無線網路介é¢çš„多個網路或者填寫create 以便定義一個新的" ++"網路." ++ ++msgid "Cipher" ++msgstr "暗號" ++ ++msgid "" ++"Click \"Generate archive\" to download a tar archive of the current " ++"configuration files. To reset the firmware to its initial state, click " ++"\"Perform reset\" (only possible with squashfs images)." ++msgstr "" ++"按下\"壓縮檔製作\"就能下載目å‰è¨­å®šæª”çš„taræ ¼å¼çš„壓縮. è¦é‡ç½®å›žå¾©å‡ºå» å€¼,按下" ++"\"執行還原\"(å¯èƒ½åªå°squashfså½±åƒæª”有效)" ++ ++msgid "Client" ++msgstr "用戶端" ++ ++msgid "Client ID to send when requesting DHCP" ++msgstr "當è¦æ±‚DHCP時è¦å‚³é€çš„用戶識別碼ID" ++ ++msgid "" ++"Close inactive connection after the given amount of seconds, use 0 to " ++"persist connection" ++msgstr "幾秒後關閉閒置的連線, 打0代表永é é€£ç·š" ++ ++msgid "Close list..." ++msgstr "關閉清單中..." ++ ++msgid "Collecting data..." ++msgstr "收集資料中..." ++ ++msgid "Command" ++msgstr "指令" ++ ++msgid "Common Configuration" ++msgstr "一般設定" ++ ++msgid "Compression" ++msgstr "壓縮" ++ ++msgid "Configuration" ++msgstr "設定" ++ ++msgid "Configuration applied." ++msgstr "啟用設定" ++ ++msgid "Configuration files will be kept." ++msgstr "設定檔將被存檔" ++ ++msgid "Confirmation" ++msgstr "å†ç¢ºèª" ++ ++msgid "Connect" ++msgstr "連線" ++ ++msgid "Connected" ++msgstr "已連線" ++ ++msgid "Connection Limit" ++msgstr "連線é™åˆ¶" ++ ++msgid "Connection to server fails when TLS cannot be used" ++msgstr "" ++ ++msgid "Connections" ++msgstr "連線數" ++ ++msgid "Country" ++msgstr "國別" ++ ++msgid "Country Code" ++msgstr "國別碼" ++ ++msgid "Cover the following interface" ++msgstr "覆蓋下列介é¢" ++ ++msgid "Cover the following interfaces" ++msgstr "覆蓋下列這些介é¢" ++ ++msgid "Create / Assign firewall-zone" ++msgstr "建立/指定防ç«ç‰†ä½œç”¨å€" ++ ++msgid "Create Interface" ++msgstr "建立介é¢" ++ ++msgid "Create a bridge over multiple interfaces" ++msgstr "在多個介é¢ä¸Šå»ºç«‹æ©‹æŽ¥" ++ ++msgid "Critical" ++msgstr "緊急" ++ ++msgid "Cron Log Level" ++msgstr "Cron的日誌級別" ++ ++msgid "Custom Interface" ++msgstr "自訂介é¢" ++ ++msgid "Custom delegated IPv6-prefix" ++msgstr "" ++ ++msgid "" ++"Customizes the behaviour of the device LEDs if possible." ++msgstr "" ++"如果å¯ä»¥çš„話,自定這個設備的動作 LEDs ." ++ ++msgid "DHCP Leases" ++msgstr "DHCP的釋放週期" ++ ++msgid "DHCP Server" ++msgstr "DHCP伺æœå™¨" ++ ++msgid "DHCP and DNS" ++msgstr "DHCP å’Œ DNS" ++ ++msgid "DHCP client" ++msgstr "DHCP用戶端" ++ ++msgid "DHCP-Options" ++msgstr "DHCPé¸é …" ++ ++msgid "DHCPv6 Leases" ++msgstr "DHCPv6版釋放時間週期" ++ ++msgid "DHCPv6 client" ++msgstr "" ++ ++msgid "DHCPv6-Mode" ++msgstr "" ++ ++msgid "DHCPv6-Service" ++msgstr "" ++ ++msgid "DNS" ++msgstr "網域å稱伺æœå™¨" ++ ++msgid "DNS forwardings" ++msgstr "DNSå°åŒ…轉發" ++ ++msgid "DNS-Label / FQDN" ++msgstr "" ++ ++msgid "DS-Lite AFTR address" ++msgstr "" ++ ++msgid "DUID" ++msgstr "DHCPç¨ç«‹å¼åˆ¥ç¢¼DUID " ++ ++msgid "Debug" ++msgstr "除錯" ++ ++msgid "Default %d" ++msgstr "é è¨­ %d" ++ ++msgid "Default gateway" ++msgstr "é è¨­åŒé“器" ++ ++msgid "Default route" ++msgstr "" ++ ++msgid "Default state" ++msgstr "é è¨­ç‹€æ…‹" ++ ++msgid "Define a name for this network." ++msgstr "自訂這個網路å稱" ++ ++msgid "" ++"Define additional DHCP options, for example " ++"\"6,192.168.2.1,192.168.2.2\" which advertises different DNS " ++"servers to clients." ++msgstr "" ++"定義é¡å¤–çš„DHCPé¸é …,例如\"6,192.168.2.1,192.168.2.2\"將會通告ä¸åŒ" ++"çš„DNS伺æœå™¨åˆ°å®¢æˆ¶ç«¯." ++ ++msgid "Delete" ++msgstr "刪除" ++ ++msgid "Delete this interface" ++msgstr "刪除這個介é¢" ++ ++msgid "Delete this network" ++msgstr "刪除這個網路" ++ ++msgid "Description" ++msgstr "æè¿°" ++ ++msgid "Design" ++msgstr "設計è¦åŠƒ" ++ ++msgid "Destination" ++msgstr "目的地" ++ ++msgid "Device" ++msgstr "設備" ++ ++msgid "Device Configuration" ++msgstr "設定設備" ++ ++msgid "Diagnostics" ++msgstr "診斷" ++ ++msgid "Dial number" ++msgstr "" ++ ++msgid "Directory" ++msgstr "目錄" ++ ++msgid "Disable" ++msgstr "關閉" ++ ++msgid "" ++"Disable DHCP for " ++"this interface." ++msgstr "" ++" å°é€™ä»‹é¢é—œé–‰ DHCP" ++ ++msgid "Disable DNS setup" ++msgstr "關閉DNS設置" ++ ++msgid "Disable HW-Beacon timer" ++msgstr "關閉硬體燈號計時器" ++ ++msgid "Disabled" ++msgstr "關閉" ++ ++msgid "Discard upstream RFC1918 responses" ++msgstr "丟棄上游RFC1918 虛擬IP網路的回應" ++ ++msgid "Displaying only packages containing" ++msgstr "僅顯示內å«çš„軟體" ++ ++msgid "Distance Optimization" ++msgstr "最佳化è·é›¢" ++ ++msgid "Distance to farthest network member in meters." ++msgstr "到最é çš„網路è·é›¢ä»¥ç±³è¡¨ç¤º." ++ ++msgid "Diversity" ++msgstr "差異" ++ ++msgid "" ++"Dnsmasq is a combined DHCP-Server and DNS-" ++"Forwarder for NAT " ++"firewalls" ++msgstr "" ++" Dnsmasq 是組åˆDHCP-伺æœå™¨ å’Œ DNS-轉發給 NAT 防ç«ç‰†ç”¨" ++ ++msgid "Do not cache negative replies, e.g. for not existing domains" ++msgstr "ä¸å¿«å–拒絕的回應,例如.ä¸å­˜åœ¨çš„網域" ++ ++msgid "Do not forward requests that cannot be answered by public name servers" ++msgstr "å°ä¸è¢«å…¬ç”¨å稱伺æœå™¨å›žæ‡‰çš„請求ä¸è½‰ç™¼" ++ ++msgid "Do not forward reverse lookups for local networks" ++msgstr "å°æœ¬åœ°ç¶²åŸŸä¸è½‰ç™¼å解æžéŽ–定" ++ ++msgid "Do not send probe responses" ++msgstr "ä¸å‚³é€æŽ¢æ¸¬å›žæ‡‰" ++ ++msgid "Domain required" ++msgstr "網域必è¦çš„" ++ ++msgid "Domain whitelist" ++msgstr "網域白åå–®" ++ ++msgid "" ++"Don't forward DNS-Requests without " ++"DNS-Name" ++msgstr "" ++"若沒 DNS-å稱的話,ä¸è¦è½‰ç™¼ DNS-請求" ++ ++msgid "Download and install package" ++msgstr "下載並安è£è»Ÿé«”包" ++ ++msgid "Download backup" ++msgstr "下載備份檔" ++ ++msgid "Dropbear Instance" ++msgstr "Dropbear SSH例å­" ++ ++msgid "" ++"Dropbear offers SSH network shell access " ++"and an integrated SCP server" ++msgstr "" ++"Dropbear æä¾› SSH 網路shell命令存å–和一個" ++"æ•´åˆçš„ SCP 伺æœå™¨" ++ ++msgid "Dual-Stack Lite (RFC6333)" ++msgstr "" ++ ++msgid "Dynamic DHCP" ++msgstr "å‹•æ…‹ DHCP" ++ ++msgid "Dynamic tunnel" ++msgstr "動態隧é“" ++ ++msgid "" ++"Dynamically allocate DHCP addresses for clients. If disabled, only clients " ++"having static leases will be served." ++msgstr "幫用戶端動態發é…DHCPä½å€. å‡å¦‚關閉的話,僅有有éœæ…‹ä½å€çš„用戶端能被æœå‹™" ++ ++msgid "EAP-Method" ++msgstr "EAPå”定驗證方å¼" ++ ++msgid "Edit" ++msgstr "編輯" ++ ++msgid "" ++"Edit the raw configuration data above to fix any error and hit \"Save\" to " ++"reload the page." ++msgstr "" ++ ++msgid "Edit this interface" ++msgstr "修改這個介é¢" ++ ++msgid "Edit this network" ++msgstr "修改這個網路" ++ ++msgid "Emergency" ++msgstr "緊急" ++ ++msgid "Enable" ++msgstr "啟用" ++ ++msgid "Enable STP" ++msgstr "啟用 STP" ++ ++msgid "Enable HE.net dynamic endpoint update" ++msgstr "啟用HE.netæœå‹™ä»£ç®¡å‹•æ…‹æ›´æ–°" ++ ++msgid "Enable IPv6 negotiation on the PPP link" ++msgstr "啟用PPP連çµä¸Šçš„IPv6交涉" ++ ++msgid "Enable Jumbo Frame passthrough" ++msgstr "啟用超大訊框é€ç©¿" ++ ++msgid "Enable NTP client" ++msgstr "起用NTP用戶功能" ++ ++msgid "Enable TFTP server" ++msgstr "啟用TFTP伺æœå™¨" ++ ++msgid "Enable VLAN functionality" ++msgstr "啟用VLAN功能" ++ ++msgid "Enable WPS pushbutton, requires WPA(2)-PSK" ++msgstr "" ++ ++msgid "Enable learning and aging" ++msgstr "啟用智慧學習功能" ++ ++msgid "Enable mirroring of incoming packets" ++msgstr "" ++ ++msgid "Enable mirroring of outgoing packets" ++msgstr "" ++ ++msgid "Enable this mount" ++msgstr "啟用掛載點" ++ ++msgid "Enable this swap" ++msgstr "啟用swap功能" ++ ++msgid "Enable/Disable" ++msgstr "啟用/關閉" ++ ++msgid "Enabled" ++msgstr "啟用" ++ ++msgid "Enables the Spanning Tree Protocol on this bridge" ++msgstr "在橋接器上啟用802.1d Spanning Treeå”定" ++ ++msgid "Encapsulation mode" ++msgstr "å°è£æ¨¡å¼" ++ ++msgid "Encryption" ++msgstr "加密" ++ ++msgid "Erasing..." ++msgstr "刪除中..." ++ ++msgid "Error" ++msgstr "錯誤" ++ ++msgid "Ethernet Adapter" ++msgstr "乙太網路å¡" ++ ++msgid "Ethernet Switch" ++msgstr "乙太交æ›å™¨" ++ ++msgid "Expand hosts" ++msgstr "延伸主機" ++ ++msgid "Expires" ++msgstr "éŽæœŸ" ++ ++#, fuzzy ++msgid "" ++"Expiry time of leased addresses, minimum is 2 minutes (2m)." ++msgstr "釋放ä½å€çš„éŽæœŸé€±æœŸ,æœ€å°‘å…©åˆ†é˜ (2m)." ++ ++msgid "External" ++msgstr "" ++ ++msgid "External system log server" ++msgstr "外部系統日誌伺æœå™¨" ++ ++msgid "External system log server port" ++msgstr "外部系統日誌伺æœå™¨åŸ è™Ÿ" ++ ++msgid "Fast Frames" ++msgstr "快速迅框群" ++ ++msgid "File" ++msgstr "檔案" ++ ++msgid "Filename of the boot image advertised to clients" ++msgstr "é–‹æ©Ÿå½±åƒæª”通知給用戶端" ++ ++msgid "Filesystem" ++msgstr "檔案系統" ++ ++msgid "Filter" ++msgstr "éŽæ¿¾å™¨" ++ ++msgid "Filter private" ++msgstr "ç§äººéŽæ¿¾å™¨" ++ ++msgid "Filter useless" ++msgstr "無用éŽæ¿¾å™¨" ++ ++msgid "Find and join network" ++msgstr "æœå°‹ä¸¦åŠ å…¥ç¶²è·¯" ++ ++msgid "Find package" ++msgstr "æœå°‹è»Ÿé«”包" ++ ++msgid "Finish" ++msgstr "完æˆ" ++ ++msgid "Firewall" ++msgstr "防ç«ç‰†" ++ ++msgid "Firewall Settings" ++msgstr "防ç«ç‰†è¨­å®š" ++ ++msgid "Firewall Status" ++msgstr "防ç«ç‰†ç‹€æ³" ++ ++msgid "Firmware Version" ++msgstr "防ç«ç‰†ç‰ˆæœ¬" ++ ++msgid "Fixed source port for outbound DNS queries" ++msgstr "外發DNS請求的固定埠號" ++ ++msgid "Flags" ++msgstr "旗標" ++ ++msgid "Flash Firmware" ++msgstr "韌體更新" ++ ++msgid "Flash image..." ++msgstr "更新映åƒæª”中..." ++ ++msgid "Flash new firmware image" ++msgstr "更新新版韌體映åƒæª”" ++ ++msgid "Flash operations" ++msgstr "執行更新" ++ ++msgid "Flashing..." ++msgstr "更新中..." ++ ++msgid "Force" ++msgstr "強制" ++ ++msgid "Force CCMP (AES)" ++msgstr "強制CCMP (AES)加密" ++ ++msgid "Force DHCP on this network even if another server is detected." ++msgstr "在網路上å³ä½¿åµæ¸¬åˆ°å…¶å®ƒä¼ºæœå™¨ä¹Ÿå¼·åˆ¶æŽ¡ç”¨DHCP的設定" ++ ++msgid "Force TKIP" ++msgstr "強制TKIP加密" ++ ++msgid "Force TKIP and CCMP (AES)" ++msgstr "強制TKIP+CCMP (AES)加密" ++ ++msgid "Forward DHCP traffic" ++msgstr "轉發DHCPæµé‡" ++ ++msgid "Forward broadcast traffic" ++msgstr "轉發廣播æµé‡" ++ ++msgid "Forwarding mode" ++msgstr "轉發模å¼" ++ ++msgid "Fragmentation Threshold" ++msgstr "分片閥值" ++ ++msgid "Frame Bursting" ++msgstr "訊框爆速" ++ ++msgid "Free" ++msgstr "空閒" ++ ++msgid "Free space" ++msgstr "剩餘空間" ++ ++msgid "GHz" ++msgstr "GHz" ++ ++msgid "GPRS only" ++msgstr "僅用GPRS" ++ ++msgid "Gateway" ++msgstr "åŒé“器" ++ ++msgid "Gateway ports" ++msgstr "åŒé“器埠號" ++ ++msgid "General Settings" ++msgstr "一般設定" ++ ++msgid "General Setup" ++msgstr "一般設置" ++ ++msgid "Generate archive" ++msgstr "製作壓縮檔" ++ ++msgid "Generic 802.11%s Wireless Controller" ++msgstr "通用 802.11%s 無線控制器" ++ ++msgid "Given password confirmation did not match, password not changed!" ++msgstr "éµå…¥çš„密碼ä¸å»åˆ,密碼將ä¸è®Šæ›´" ++ ++msgid "Global network options" ++msgstr "" ++ ++msgid "Go to password configuration..." ++msgstr "到密碼設定é " ++ ++msgid "Go to relevant configuration page" ++msgstr "到相應設定é " ++ ++msgid "Guest" ++msgstr "" ++ ++msgid "HE.net password" ++msgstr " HE.net密碼" ++ ++msgid "HE.net username" ++msgstr "" ++ ++msgid "Handler" ++msgstr "多執行緒" ++ ++msgid "Hang Up" ++msgstr "æ–·ç·š" ++ ++msgid "Heartbeat" ++msgstr "" ++ ++msgid "" ++"Here you can configure the basic aspects of your device like its hostname or " ++"the timezone." ++msgstr "在這設置基本樣貌類似åƒä¸»æ©Ÿå稱或者時å€..ç­‰" ++ ++msgid "" ++"Here you can paste public SSH-Keys (one per line) for SSH public-key " ++"authentication." ++msgstr "在這裡貼上公用SSH-Keys (æ¯è¡Œä¸€å€‹)以便驗證" ++ ++msgid "Hermes 802.11b Wireless Controller" ++msgstr "Hermes 802.11b 無線網路控制器" ++ ++msgid "Hide ESSID" ++msgstr "éš±è— ESSID" ++ ++msgid "Host entries" ++msgstr "主機項目" ++ ++msgid "Host expiry timeout" ++msgstr "éŽæœŸä¸»æ©Ÿ" ++ ++msgid "Host-IP or Network" ++msgstr "主機-IP 或網路" ++ ++msgid "Hostname" ++msgstr "主機å稱" ++ ++msgid "Hostname to send when requesting DHCP" ++msgstr "當請求DHCPæœå‹™æ™‚傳é€çš„主機å稱" ++ ++msgid "Hostnames" ++msgstr "主機å稱" ++ ++msgid "Hybrid" ++msgstr "" ++ ++msgid "IP address" ++msgstr "IPä½å€" ++ ++msgid "IPv4" ++msgstr "IPv4版" ++ ++msgid "IPv4 Firewall" ++msgstr "IPv4防ç«ç‰†" ++ ++msgid "IPv4 WAN Status" ++msgstr "IPv4寬頻連線狀態" ++ ++msgid "IPv4 address" ++msgstr "IPv4ä½å€" ++ ++msgid "IPv4 and IPv6" ++msgstr "IPv4å’ŒIPv6" ++ ++msgid "IPv4 assignment length" ++msgstr "" ++ ++msgid "IPv4 broadcast" ++msgstr "IPv4廣播" ++ ++msgid "IPv4 gateway" ++msgstr "IPv4åŒé“器" ++ ++msgid "IPv4 netmask" ++msgstr "IPv4網路é®ç½©" ++ ++msgid "IPv4 only" ++msgstr "僅用IPv4" ++ ++msgid "IPv4 prefix length" ++msgstr "IPv4å‰ç¶´é•·åº¦" ++ ++msgid "IPv4-Address" ++msgstr "IPv4-ä½å€" ++ ++msgid "IPv6" ++msgstr "IPv6版" ++ ++msgid "IPv6 Firewall" ++msgstr "IPv6防ç«ç‰†" ++ ++msgid "IPv6 Neighbours" ++msgstr "" ++ ++msgid "IPv6 Settings" ++msgstr "" ++ ++msgid "IPv6 ULA-Prefix" ++msgstr "" ++ ++msgid "IPv6 WAN Status" ++msgstr "IPv6寬頻連線狀態" ++ ++msgid "IPv6 address" ++msgstr "IPv6ä½å€" ++ ++msgid "IPv6 address delegated to the local tunnel endpoint (optional)" ++msgstr "" ++ ++msgid "IPv6 assignment hint" ++msgstr "" ++ ++msgid "IPv6 assignment length" ++msgstr "" ++ ++msgid "IPv6 gateway" ++msgstr "IPv6åŒé“器" ++ ++msgid "IPv6 only" ++msgstr "僅用IPv6" ++ ++msgid "IPv6 prefix" ++msgstr "IPv6字首" ++ ++msgid "IPv6 prefix length" ++msgstr "IPv6字首長度" ++ ++msgid "IPv6 routed prefix" ++msgstr "" ++ ++msgid "IPv6-Address" ++msgstr "IPv6-ä½å€" ++ ++msgid "IPv6-in-IPv4 (RFC4213)" ++msgstr "IPv6包覆在IPv4å…§(RFC4213)" ++ ++msgid "IPv6-over-IPv4 (6rd)" ++msgstr "IPv6凌駕IPv4外(第6版)" ++ ++msgid "IPv6-over-IPv4 (6to4)" ++msgstr "IPv6凌駕IPv4外(6轉4)" ++ ++msgid "Identity" ++msgstr "特性" ++ ++msgid "" ++"If specified, mount the device by its UUID instead of a fixed device node" ++msgstr "å‡è‹¥æŒ‡å®šçš„話, 掛載設備的UUIDç¨ç«‹è¨­å‚™è­˜åˆ¥ç¢¼å–代固定的設備節點" ++ ++msgid "" ++"If specified, mount the device by the partition label instead of a fixed " ++"device node" ++msgstr "å‡è‹¥æŒ‡å®šçš„話, 掛載設備的分割標籤å–代固定的設備節點" ++ ++msgid "If unchecked, no default route is configured" ++msgstr "如果沒打勾點é¸, å°‡ä¸æœƒè¨­ç½®é è¨­è·¯ç”±" ++ ++msgid "If unchecked, the advertised DNS server addresses are ignored" ++msgstr "如果沒打勾點é¸, 公告的DNS伺æœå™¨ä½å€å°‡è¢«å¿½è¦–" ++ ++msgid "" ++"If your physical memory is insufficient unused data can be temporarily " ++"swapped to a swap-device resulting in a higher amount of usable RAM. Be aware that swapping data is a very " ++"slow process as the swap-device cannot be accessed with the high datarates " ++"of the RAM." ++msgstr "" ++"如果你的物ç†å…§å­˜ä¸è¶³æ™‚,未使用的數據å¯ä»¥æ˜¯æš«æ™‚交æ›åˆ°å°Žè‡´æ›´é«˜çš„交æ›è¨­å‚™é‡çš„å¯ç”¨" ++"RAMå…§.請注æ„,交æ›æ•¸æ“šæ˜¯ä¸€å€‹éžå¸¸" ++"緩慢的éŽç¨‹,作為交æ›è£ç½®ä¸èƒ½ç”¨é«˜æ•¸æ“šé€ŸçŽ‡è¨ªå•è©²RAM" ++ ++msgid "Ignore Hosts files" ++msgstr "被忽視的主機檔案" ++ ++msgid "Ignore interface" ++msgstr "被忽視的介é¢" ++ ++msgid "Ignore resolve file" ++msgstr "被忽視的解æžæª”" ++ ++msgid "Image" ++msgstr "映åƒæª”" ++ ++msgid "In" ++msgstr "輸入" ++ ++msgid "Inactivity timeout" ++msgstr "é–’ç½®éŽæœŸ" ++ ++msgid "Inbound:" ++msgstr "輸入" ++ ++msgid "Info" ++msgstr "訊æ¯" ++ ++msgid "Initscript" ++msgstr "åˆå§‹åŒ–腳本" ++ ++msgid "Initscripts" ++msgstr "åˆå§‹åŒ–腳本" ++ ++msgid "Install" ++msgstr "安è£" ++ ++msgid "Install iputils-traceroute6 for IPv6 traceroute" ++msgstr "" ++ ++msgid "Install package %q" ++msgstr "安è£è»Ÿé«”包 %q" ++ ++msgid "Install protocol extensions..." ++msgstr "安è£å»¶ä¼¸å”定中..." ++ ++msgid "Installed packages" ++msgstr "安è£è»Ÿé«”包" ++ ++msgid "Interface" ++msgstr "介é¢" ++ ++msgid "Interface Configuration" ++msgstr "介é¢è¨­å®š" ++ ++msgid "Interface Overview" ++msgstr "介é¢é è¦½" ++ ++msgid "Interface is reconnecting..." ++msgstr "介é¢é‡é€£" ++ ++msgid "Interface is shutting down..." ++msgstr "介é¢æ­£åœ¨é—œé–‰ä¸­..." ++ ++msgid "Interface not present or not connected yet." ++msgstr "介é¢å°šæœªå‡ºç·šæˆ–者還沒連上" ++ ++msgid "Interface reconnected" ++msgstr "介é¢å·²é‡é€£" ++ ++msgid "Interface shut down" ++msgstr "介é¢é—œé–‰" ++ ++msgid "Interfaces" ++msgstr "介é¢" ++ ++msgid "Internal" ++msgstr "" ++ ++msgid "Internal Server Error" ++msgstr "內部伺æœå™¨ç™¼ç”ŸéŒ¯èª¤" ++ ++msgid "Invalid" ++msgstr "無效" ++ ++msgid "Invalid VLAN ID given! Only IDs between %d and %d are allowed." ++msgstr "輸入的VLAN ID無效僅有介於 %d å’Œ %d的被å…許" ++ ++msgid "Invalid VLAN ID given! Only unique IDs are allowed" ++msgstr "打入的是ä¸æ­£ç¢ºçš„VLAN ID!僅有ç¨ä¸€ç„¡äºŒçš„IDs被å…許" ++ ++msgid "Invalid username and/or password! Please try again." ++msgstr "ä¸æ­£ç¢ºçš„用戶å稱和/或者密碼!è«‹å†è©¦ä¸€æ¬¡." ++ ++#, fuzzy ++msgid "" ++"It appears that you are trying to flash an image that does not fit into the " ++"flash memory, please verify the image file!" ++msgstr "它顯示你正嘗試更新ä¸é©ç”¨æ–¼é€™å€‹flash記憶體的映åƒæª”,請檢查確èªé€™å€‹æ˜ åƒæª”" ++ ++msgid "Java Script required!" ++msgstr "需è¦Java腳本" ++ ++msgid "Join Network" ++msgstr "加入網路" ++ ++msgid "Join Network: Settings" ++msgstr "加入網路的設定" ++ ++msgid "Join Network: Wireless Scan" ++msgstr "加入網路:無線網路掃æ" ++ ++msgid "Keep settings" ++msgstr "ä¿æŒè¨­å®šå€¼" ++ ++msgid "Kernel Log" ++msgstr "核心日誌" ++ ++msgid "Kernel Version" ++msgstr "核心版本" ++ ++msgid "Key" ++msgstr "鑰匙" ++ ++msgid "Key #%d" ++msgstr "鑰匙 #%d" ++ ++msgid "Kill" ++msgstr "刪除" ++ ++msgid "L2TP" ++msgstr "L2TP" ++ ++msgid "L2TP Server" ++msgstr "L2TP伺æœå™¨" ++ ++msgid "LCP echo failure threshold" ++msgstr "LCPå”定呼å«å¤±æ•—次數門檻" ++ ++msgid "LCP echo interval" ++msgstr "LCPå”定呼å«é–“éš”" ++ ++msgid "LLC" ++msgstr "LLCé‚輯éˆçµæŽ§åˆ¶å±¤" ++ ++msgid "Label" ++msgstr "標籤" ++ ++msgid "Language" ++msgstr "語言" ++ ++msgid "Language and Style" ++msgstr "語言和風格" ++ ++msgid "Leaf" ++msgstr "" ++ ++msgid "Lease validity time" ++msgstr "租賃有效時間" ++ ++msgid "Leasefile" ++msgstr "租賃檔案" ++ ++msgid "Leasetime" ++msgstr "租賃時間" ++ ++msgid "Leasetime remaining" ++msgstr "租賃ä¿ç•™æ™‚é–“" ++ ++msgid "Leave empty to autodetect" ++msgstr "ä¿æŒç©ºç™½ä»¥ä¾¿è‡ªå‹•åµæ¸¬" ++ ++msgid "Leave empty to use the current WAN address" ++msgstr "ä¿æŒç©ºç™½ä»¥ä¾¿æŽ¡ç”¨ç¾ä»Šçš„寬頻ä½å€" ++ ++msgid "Legend:" ++msgstr "圖例:" ++ ++msgid "Limit" ++msgstr "é™åˆ¶" ++ ++msgid "Line Attenuation" ++msgstr "" ++ ++msgid "Line Speed" ++msgstr "" ++ ++msgid "Line State" ++msgstr "" ++ ++msgid "Link On" ++msgstr "éˆæŽ¥" ++ ++msgid "" ++"List of DNS servers to forward " ++"requests to" ++msgstr "列出 DNS 伺æœå™¨ä»¥ä¾¿è½‰ç™¼è«‹æ±‚" ++ ++msgid "List of domains to allow RFC1918 responses for" ++msgstr "列出å…許RFC1918文件虛擬IP回應的網域" ++ ++msgid "List of hosts that supply bogus NX domain results" ++msgstr "列出供應å½è£NX網域æˆæžœçš„主機群" ++ ++msgid "Listen only on the given interface or, if unspecified, on all" ++msgstr "åªè¨±åœ¨çµ¦äºˆçš„介é¢ä¸Šè†è½, 如果未指定, 全都å…許" ++ ++msgid "Listening port for inbound DNS queries" ++msgstr "進入的DNS請求è†è½åŸ " ++ ++msgid "Load" ++msgstr "掛載" ++ ++msgid "Load Average" ++msgstr "å¹³å‡æŽ›è¼‰" ++ ++msgid "Loading" ++msgstr "掛載中" ++ ++msgid "Local IPv4 address" ++msgstr "本地IPv4ä½å€" ++ ++msgid "Local IPv6 address" ++msgstr "本地IPv6ä½å€" ++ ++msgid "Local Startup" ++msgstr "本地啟動" ++ ++msgid "Local Time" ++msgstr "本地時å€" ++ ++msgid "Local domain" ++msgstr "本地網域" ++ ++#, fuzzy ++msgid "" ++"Local domain specification. Names matching this domain are never forwarded " ++"and are resolved from DHCP or hosts files only" ++msgstr "本地網域格å¼. 僅é™ç¬¦åˆå¾žæœªå¾žDHCP或hosts檔轉發和解æžçš„網域" ++ ++msgid "Local domain suffix appended to DHCP names and hosts file entries" ++msgstr "本地網域後綴附加倒DHCPå稱和hosts檔項目" ++ ++msgid "Local server" ++msgstr "本地伺æœå™¨" ++ ++msgid "" ++"Localise hostname depending on the requesting subnet if multiple IPs are " ++"available" ++msgstr "若有多個IPå¯ç”¨, 本地化主機å稱端看請求的å­ç¶²è·¯è€Œè¨€." ++ ++msgid "Localise queries" ++msgstr "本地化網路請求" ++ ++msgid "Locked to channel %d used by: %s" ++msgstr "" ++ ++msgid "Log output level" ++msgstr "日誌輸出層級" ++ ++msgid "Log queries" ++msgstr "日誌查詢" ++ ++msgid "Logging" ++msgstr "日誌紀錄中" ++ ++msgid "Login" ++msgstr "登入" ++ ++msgid "Logout" ++msgstr "登出" ++ ++msgid "Lowest leased address as offset from the network address." ++msgstr "最低的釋放ä½å€å¾žé€™ç¶²è·¯ä½å€çš„å移計算" ++ ++msgid "MAC-Address" ++msgstr "MAC-ä½å€" ++ ++msgid "MAC-Address Filter" ++msgstr "MAC-ä½å€éŽæ¿¾" ++ ++msgid "MAC-Filter" ++msgstr "MAC-éŽæ¿¾" ++ ++msgid "MAC-List" ++msgstr "MAC-清單" ++ ++msgid "MB/s" ++msgstr "MB/s" ++ ++msgid "MHz" ++msgstr "MHz" ++ ++msgid "MTU" ++msgstr "最大傳輸單ä½MTU" ++ ++msgid "" ++"Make sure to clone the root filesystem using something like the commands " ++"below:" ++msgstr "" ++ ++msgid "Maximum Rate" ++msgstr "最快速度" ++ ++msgid "Maximum allowed number of active DHCP leases" ++msgstr "å…許啟用DHCP釋放的最大數é‡" ++ ++msgid "Maximum allowed number of concurrent DNS queries" ++msgstr "å…許åŒæ™‚齊發的DNS請求的最大數é‡" ++ ++msgid "Maximum allowed size of EDNS.0 UDP packets" ++msgstr "å…許EDNS.0 å”定的UDPå°åŒ…最大數é‡" ++ ++msgid "Maximum amount of seconds to wait for the modem to become ready" ++msgstr "等待數據機待命的最大秒數" ++ ++msgid "Maximum hold time" ++msgstr "å¯æŒæœ‰æœ€é•·æ™‚é–“" ++ ++msgid "Maximum number of leased addresses." ++msgstr "釋放出的ä½å€ç¾¤æœ€å¤§æ•¸é‡" ++ ++msgid "Mbit/s" ++msgstr "Mbit/s" ++ ++msgid "Memory" ++msgstr "記憶體" ++ ++msgid "Memory usage (%)" ++msgstr "記憶體使用 (%)" ++ ++msgid "Metric" ++msgstr "公測單ä½" ++ ++msgid "Minimum Rate" ++msgstr "最低速度" ++ ++msgid "Minimum hold time" ++msgstr "å¯æŒæœ‰çš„最低時間" ++ ++msgid "Mirror monitor port" ++msgstr "" ++ ++msgid "Mirror source port" ++msgstr "" ++ ++msgid "Missing protocol extension for proto %q" ++msgstr "å”定 %q æ¼å¤±çš„延伸å”定" ++ ++msgid "Mode" ++msgstr "模å¼" ++ ++msgid "Model" ++msgstr "" ++ ++msgid "Modem device" ++msgstr "數據機設備" ++ ++msgid "Modem init timeout" ++msgstr "數據機åˆå§‹åŒ–終çµæ™‚é–“" ++ ++msgid "Monitor" ++msgstr "監視" ++ ++msgid "Mount Entry" ++msgstr "掛載項目" ++ ++msgid "Mount Point" ++msgstr "掛載點" ++ ++msgid "Mount Points" ++msgstr "掛載å„點" ++ ++msgid "Mount Points - Mount Entry" ++msgstr "掛載å„點 - 掛載項目" ++ ++msgid "Mount Points - Swap Entry" ++msgstr "掛載å„點 - 交æ›é …ç›®" ++ ++msgid "" ++"Mount Points define at which point a memory device will be attached to the " ++"filesystem" ++msgstr "掛載å„點定義所指定到記憶體設備將會被附載到檔案系統上" ++ ++msgid "Mount options" ++msgstr "掛載é¸é …" ++ ++msgid "Mount point" ++msgstr "掛載點" ++ ++msgid "Mounted file systems" ++msgstr "已掛載檔案系統" ++ ++msgid "Move down" ++msgstr "往下移" ++ ++msgid "Move up" ++msgstr "往上移" ++ ++msgid "Multicast Rate" ++msgstr "多點群播速度" ++ ++msgid "Multicast address" ++msgstr "多點群播ä½å€" ++ ++msgid "NAS ID" ++msgstr " 網路附存伺æœå™¨ID" ++ ++msgid "NDP-Proxy" ++msgstr "" ++ ++msgid "NTP server candidates" ++msgstr "NTP伺æœå™¨å‚™é¸" ++ ++msgid "NTP sync time-out" ++msgstr "" ++ ++msgid "Name" ++msgstr "å稱" ++ ++msgid "Name of the new interface" ++msgstr "新介é¢çš„å稱" ++ ++msgid "Name of the new network" ++msgstr "新網路的å稱" ++ ++msgid "Navigation" ++msgstr "導覽" ++ ++msgid "Netmask" ++msgstr "網路é®ç½©" ++ ++msgid "Network" ++msgstr "網路" ++ ++msgid "Network Utilities" ++msgstr "網路多項工具" ++ ++msgid "Network boot image" ++msgstr "網路開機映åƒæª”" ++ ++msgid "Network without interfaces." ++msgstr "尚無任何介é¢çš„網路." ++ ++msgid "Next »" ++msgstr "下一個 »" ++ ++msgid "No DHCP Server configured for this interface" ++msgstr "在這個介é¢å°šç„¡DHCP伺æœå™¨" ++ ++msgid "No chains in this table" ++msgstr "尚未ç¶åœ¨é€™å€‹è¡¨æ ¼ä¸­" ++ ++msgid "No files found" ++msgstr "尚未發ç¾ä»»ä½•æª”案" ++ ++msgid "No information available" ++msgstr "å°šç„¡å¯é‹ç”¨è³‡è¨Š" ++ ++msgid "No negative cache" ++msgstr "尚無拒絕的快å–" ++ ++msgid "No network configured on this device" ++msgstr "尚無網路設定在這個介é¢ä¸Š" ++ ++msgid "No network name specified" ++msgstr "尚未指定網路å稱" ++ ++msgid "No package lists available" ++msgstr "尚無列出的軟體包å¯é‹ç”¨" ++ ++msgid "No password set!" ++msgstr "尚未設定密碼!" ++ ++msgid "No rules in this chain" ++msgstr "å°šç„¡è¦å‰‡åœ¨é€™å€‹éˆæŽ¥ä¸Š" ++ ++msgid "No zone assigned" ++msgstr "尚未指定å€ç¢¼" ++ ++msgid "Noise" ++msgstr "噪音比" ++ ++msgid "Noise Margin" ++msgstr "" ++ ++msgid "Noise:" ++msgstr "噪音比:" ++ ++msgid "None" ++msgstr "ç„¡" ++ ++msgid "Normal" ++msgstr "正常" ++ ++msgid "Not Found" ++msgstr "尚未發ç¾" ++ ++msgid "Not associated" ++msgstr "尚未關è¯" ++ ++msgid "Not connected" ++msgstr "尚未連線" ++ ++msgid "Note: Configuration files will be erased." ++msgstr "注æ„:設定檔將被刪除." ++ ++msgid "Notice" ++msgstr "通知" ++ ++msgid "Nslookup" ++msgstr "DNSåµéŒ¯Nslookup" ++ ++msgid "OK" ++msgstr "è¡Œ" ++ ++msgid "OPKG-Configuration" ++msgstr "OPKG-設定值" ++ ++msgid "Off-State Delay" ++msgstr "關閉狀態延é²" ++ ++msgid "" ++"On this page you can configure the network interfaces. You can bridge " ++"several interfaces by ticking the \"bridge interfaces\" field and enter the " ++"names of several network interfaces separated by spaces. You can also use " ++"VLAN notation " ++"INTERFACE.VLANNR (e.g.: " ++"eth0.1)." ++msgstr "" ++"在這個é é¢ä½ å¯ä»¥è¨­å®šç¶²è·¯ä»‹é¢. åªè¦é»žä¸‹é€™å€‹\"介é¢ç¾¤æ©‹æŽ¥\"而且打入數個以空格分" ++"開網路介é¢çš„å稱就å¯ä»¥æ©‹æŽ¥æ•¸å€‹ä»‹é¢ç¾¤. 你也å¯ä»¥ä½¿ç”¨VLAN 符號INTERFACE.VLANNR (例.如: eth0.1)." ++ ++msgid "On-State Delay" ++msgstr "啟用狀態延é²" ++ ++msgid "One of hostname or mac address must be specified!" ++msgstr "主機å稱或macä½å€ä»»é¸ä¸€å€‹è¢«æŒ‡å®š" ++ ++msgid "One or more fields contain invalid values!" ++msgstr "有一個以上的欄ä½åŒ…å«å¤±æ•ˆæ•¸å€¼!" ++ ++msgid "One or more required fields have no value!" ++msgstr "有一個以上的欄ä½ç¼ºä¹ä»»ä½•æ•¸å€¼!" ++ ++msgid "Open list..." ++msgstr "開啟清單..." ++ ++msgid "OpenConnect (CISCO AnyConnect)" ++msgstr "" ++ ++msgid "Operating frequency" ++msgstr "" ++ ++msgid "Option changed" ++msgstr "é¸é …已變更" ++ ++msgid "Option removed" ++msgstr "é¸é …已移除" ++ ++msgid "Optional, specify to override default server (tic.sixxs.net)" ++msgstr "" ++ ++msgid "Optional, use when the SIXXS account has more than one tunnel" ++msgstr "" ++ ++msgid "Options" ++msgstr "é¸é …" ++ ++msgid "Other:" ++msgstr "其它:" ++ ++msgid "Out" ++msgstr "出" ++ ++msgid "Outbound:" ++msgstr "外連:" ++ ++msgid "Outdoor Channels" ++msgstr "室外通é“" ++ ++msgid "Output Interface" ++msgstr "" ++ ++msgid "Override MAC address" ++msgstr "覆蓋MACä½å€" ++ ++msgid "Override MTU" ++msgstr "覆蓋MTU數值" ++ ++msgid "Override the gateway in DHCP responses" ++msgstr "在DHCP回應中覆蓋åŒé“器" ++ ++msgid "" ++"Override the netmask sent to clients. Normally it is calculated from the " ++"subnet that is served." ++msgstr "覆蓋傳é€åˆ°å®¢æˆ¶ç«¯çš„網路é®ç½©. 正常來說它會計算來自魚已存å­ç¶²è·¯." ++ ++msgid "Override the table used for internal routes" ++msgstr "覆蓋之å‰å…§éƒ¨ä½¿ç”¨çš„路由表" ++ ++msgid "Overview" ++msgstr "é è¦½" ++ ++msgid "Owner" ++msgstr "æŒæœ‰è€…" ++ ++msgid "PAP/CHAP password" ++msgstr "PAP/CHAP驗證密碼" ++ ++msgid "PAP/CHAP username" ++msgstr "PAP/CHAP驗證用戶å" ++ ++msgid "PID" ++msgstr "PID碼" ++ ++msgid "PIN" ++msgstr "PIN碼" ++ ++msgid "PPP" ++msgstr "PPPå”定" ++ ++msgid "PPPoA Encapsulation" ++msgstr "PPPoAé…ç½®" ++ ++msgid "PPPoATM" ++msgstr "PPPoATM" ++ ++msgid "PPPoE" ++msgstr "PPPoE" ++ ++msgid "PPtP" ++msgstr "PPtP點å°é»žVPN虛擬ç§äººéš§é“å”定" ++ ++msgid "Package libiwinfo required!" ++msgstr "軟體包必需有libiwinfo!" ++ ++msgid "Package lists are older than 24 hours" ++msgstr "軟體包列表éŽæœŸ24å°æ™‚" ++ ++msgid "Package name" ++msgstr "軟體包å稱" ++ ++msgid "Packets" ++msgstr "å°åŒ…" ++ ++msgid "Part of zone %q" ++msgstr "å€åŸŸ %q 的部分 " ++ ++msgid "Password" ++msgstr "密碼" ++ ++msgid "Password authentication" ++msgstr "密碼驗證" ++ ++msgid "Password of Private Key" ++msgstr "ç§äººé‡‘鑰密碼" ++ ++msgid "Password successfully changed!" ++msgstr "密碼已變更æˆåŠŸ!" ++ ++msgid "Path" ++msgstr "" ++ ++msgid "Path to CA-Certificate" ++msgstr "CA-證書的路徑" ++ ++msgid "Path to Client-Certificate" ++msgstr "用戶端-證書的路徑" ++ ++msgid "Path to Private Key" ++msgstr "ç§äººé‡‘鑰的路徑" ++ ++msgid "Path to executable which handles the button event" ++msgstr "處ç†æŒ‰éµæ•ˆæžœå¯åŸ·è¡Œæª”路徑" ++ ++msgid "Peak:" ++msgstr "峰值:" ++ ++msgid "Perform reboot" ++msgstr "執行é‡é–‹" ++ ++msgid "Perform reset" ++msgstr "執行é‡ç½®" ++ ++msgid "Phy Rate:" ++msgstr "傳輸率:" ++ ++msgid "Physical Settings" ++msgstr "實體設置" ++ ++msgid "Ping" ++msgstr "Ping" ++ ++msgid "Pkts." ++msgstr "å°åŒ…數." ++ ++msgid "Please enter your username and password." ++msgstr "請輸入你的用戶å稱和密碼" ++ ++msgid "Please wait: Device rebooting..." ++msgstr "è«‹ç¨ç­‰:設備正é‡é–‹ä¸­..." ++ ++msgid "Policy" ++msgstr "ç­–ç•¥" ++ ++msgid "Port" ++msgstr "埠" ++ ++msgid "Port %d" ++msgstr "埠 %d" ++ ++msgid "Port %d is untagged in multiple VLANs!" ++msgstr "埠 %d 尚未標記在多個VLANs中!" ++ ++msgid "Port status:" ++msgstr "埠狀態:" ++ ++msgid "" ++"Presume peer to be dead after given amount of LCP echo failures, use 0 to " ++"ignore failures" ++msgstr "å‡è‹¥åœ¨çµ¦äºŽå¤šæ¬¡çš„ LCP 呼å«å¤±æ•—後終點將死, 使用0忽略失敗" ++ ++msgid "Prevents client-to-client communication" ++msgstr "防止用戶端å°ç”¨æˆ¶ç«¯çš„通訊" ++ ++msgid "Prism2/2.5/3 802.11b Wireless Controller" ++msgstr "Prism2/2.5/3 802.11b 無線控制器" ++ ++msgid "Proceed" ++msgstr "å‰é€²" ++ ++msgid "Processes" ++msgstr "執行緒" ++ ++msgid "Prot." ++msgstr "å”定." ++ ++msgid "Protocol" ++msgstr "å”定" ++ ++msgid "Protocol family" ++msgstr "å”定家æ—" ++ ++msgid "Protocol of the new interface" ++msgstr "新介é¢çš„å”定家æ—" ++ ++msgid "Protocol support is not installed" ++msgstr "支æ´çš„å”定尚未安è£" ++ ++msgid "Provide NTP server" ++msgstr "æä¾›NTP伺æœå™¨" ++ ++msgid "Provide new network" ++msgstr "æ供新網路" ++ ++msgid "Pseudo Ad-Hoc (ahdemo)" ++msgstr "å½è£Ad-Hoc (ahdemo模å¼)" ++ ++msgid "Public prefix routed to this device for distribution to clients." ++msgstr "" ++ ++msgid "Quality" ++msgstr "å“質" ++ ++msgid "RTS/CTS Threshold" ++msgstr "RTS/CTS門檻" ++ ++msgid "RX" ++msgstr "接收" ++ ++msgid "RX Rate" ++msgstr "接收速率" ++ ++msgid "RaLink 802.11%s Wireless Controller" ++msgstr "RaLink 802.11%s 無線控制器" ++ ++msgid "Radius-Accounting-Port" ++msgstr "Radius-驗証帳號-埠" ++ ++msgid "Radius-Accounting-Secret" ++msgstr "Radius-åˆæ³•å¸³è™Ÿ-密碼" ++ ++msgid "Radius-Accounting-Server" ++msgstr "Radius-åˆæ³•å¸³è™Ÿ-伺æœå™¨" ++ ++msgid "Radius-Authentication-Port" ++msgstr "Radius-驗証-埠" ++ ++msgid "Radius-Authentication-Secret" ++msgstr "Radius-驗証-密碼" ++ ++msgid "Radius-Authentication-Server" ++msgstr "Radius-驗証-伺æœå™¨" ++ ++msgid "" ++"Read /etc/ethers to configure the DHCP-Server" ++msgstr "" ++" 讀å–/etc/ethers 以便設置DHCP-伺æœå™¨" ++ ++msgid "" ++"Really delete this interface? The deletion cannot be undone!\\nYou might " ++"lose access to this device if you are connected via this interface." ++msgstr "" ++"真的è¦åˆªé™¤é€™ä»‹é¢?無法復元刪除!\n" ++"å‡å¦‚ä½ è¦é€éŽé€™å€‹ä»‹é¢é€£ç·šä½ å¯èƒ½æœƒç„¡æ³•å­˜å–這個設備." ++ ++msgid "" ++"Really delete this wireless network? The deletion cannot be undone!\\nYou " ++"might lose access to this device if you are connected via this network." ++msgstr "" ++"真的è¦åˆªé™¤é€™å€‹ç„¡ç·šç¶²è·¯?無法復元的刪除!\n" ++"å‡å¦‚你是é€éŽé€™å€‹ç¶²è·¯é€£ç·šä½ å¯èƒ½æœƒç„¡æ³•å­˜å–這個設備." ++ ++msgid "Really reset all changes?" ++msgstr "確定è¦é‡ç½®å›žå¾©åŽŸå» ?" ++ ++#, fuzzy ++msgid "" ++"Really shut down network?\\nYou might lose access to this device if you are " ++"connected via this interface." ++msgstr "" ++"真的è¦åˆªé™¤é€™å€‹ç¶²è·¯ ?\n" ++"å‡å¦‚你是é€éŽé€™å€‹ä»‹é¢é€£ç·šä½ å¯èƒ½æœƒç„¡æ³•å­˜å–這個設備." ++ ++msgid "" ++"Really shutdown interface \"%s\" ?\\nYou might lose access to this device if " ++"you are connected via this interface." ++msgstr "" ++"真的è¦é—œé–‰é€™å€‹ä»‹é¢ \"%s\" ?!\n" ++"å‡å¦‚ä½ è¦é€éŽé€™å€‹ä»‹é¢é€£ç·šä½ å¯èƒ½æœƒç„¡æ³•å­˜å–這個設備." ++ ++msgid "Really switch protocol?" ++msgstr "確定è¦æ›´æ›å”定?" ++ ++msgid "Realtime Connections" ++msgstr "å³æ™‚連線" ++ ++msgid "Realtime Graphs" ++msgstr "å³æ™‚圖表" ++ ++msgid "Realtime Load" ++msgstr "å³æ™‚負載" ++ ++msgid "Realtime Traffic" ++msgstr "å³æ™‚æµé‡" ++ ++msgid "Realtime Wireless" ++msgstr "å³æ™‚無線網路" ++ ++msgid "Rebind protection" ++msgstr "é‡æ–°ç¶è­·" ++ ++msgid "Reboot" ++msgstr "é‡é–‹æ©Ÿ" ++ ++msgid "Rebooting..." ++msgstr "é‡é–‹ä¸­..." ++ ++msgid "Reboots the operating system of your device" ++msgstr "é‡å•Ÿä½ è¨­å‚™çš„作業系統" ++ ++msgid "Receive" ++msgstr "接收" ++ ++msgid "Receiver Antenna" ++msgstr "接收天線" ++ ++msgid "Reconnect this interface" ++msgstr "é‡æ–°é€£æŽ¥é€™å€‹ä»‹é¢" ++ ++msgid "Reconnecting interface" ++msgstr "é‡é€£é€™å€‹ä»‹é¢ä¸­" ++ ++msgid "References" ++msgstr "引用" ++ ++msgid "Regulatory Domain" ++msgstr "監管網域" ++ ++msgid "Relay" ++msgstr "延é²" ++ ++msgid "Relay Bridge" ++msgstr "橋接延é²" ++ ++msgid "Relay between networks" ++msgstr "網路間的延é²" ++ ++msgid "Relay bridge" ++msgstr "橋接延é²" ++ ++msgid "Remote IPv4 address" ++msgstr "é ç«¯IPv4ä½å€" ++ ++msgid "Remove" ++msgstr "移除" ++ ++msgid "Repeat scan" ++msgstr "å†æ¬¡æŽƒæ" ++ ++msgid "Replace entry" ++msgstr "替代項目" ++ ++msgid "Replace wireless configuration" ++msgstr "替代性無線設定" ++ ++msgid "Request IPv6-address" ++msgstr "" ++ ++msgid "Request IPv6-prefix of length" ++msgstr "" ++ ++msgid "Require TLS" ++msgstr "" ++ ++msgid "Required for certain ISPs, e.g. Charter with DOCSIS 3" ++msgstr "å°ç‰¹å®šçš„ISP需è¦,例如.DOCSIS 3 加速有線電視寬頻網路" ++ ++msgid "Reset" ++msgstr "é‡ç½®" ++ ++msgid "Reset Counters" ++msgstr "é‡ç½®è¨ˆæ•¸å™¨" ++ ++msgid "Reset to defaults" ++msgstr "回復é è¨­å€¼" ++ ++msgid "Resolv and Hosts Files" ++msgstr "解æžå’ŒHosts檔案" ++ ++msgid "Resolve file" ++msgstr "解æžæª”" ++ ++msgid "Restart" ++msgstr "é‡å•Ÿ" ++ ++msgid "Restart Firewall" ++msgstr "é‡å•Ÿé˜²ç«ç‰†" ++ ++msgid "Restore backup" ++msgstr "還原之å‰å‚™ä»½è¨­å®š" ++ ++msgid "Reveal/hide password" ++msgstr "明示/éš±è— å¯†ç¢¼" ++ ++msgid "Revert" ++msgstr "回溯" ++ ++msgid "Root" ++msgstr "æ ¹" ++ ++msgid "Root directory for files served via TFTP" ++msgstr "é€éŽTFTPå­˜å–根目錄檔案" ++ ++msgid "Root preparation" ++msgstr "" ++ ++msgid "Routed IPv6 prefix for downstream interfaces" ++msgstr "" ++ ++msgid "Router Advertisement-Service" ++msgstr "" ++ ++msgid "Router Password" ++msgstr "路由器密碼" ++ ++msgid "Routes" ++msgstr "路由" ++ ++msgid "" ++"Routes specify over which interface and gateway a certain host or network " ++"can be reached." ++msgstr "路由器指定介é¢å°Žå‡ºåˆ°ç‰¹å®šä¸»æ©Ÿæˆ–者能夠到é”的網路." ++ ++msgid "Rule #" ++msgstr "è¦å‰‡ #" ++ ++msgid "Run a filesystem check before mounting the device" ++msgstr "掛載這個設備å‰å…ˆè·‘系統檢查" ++ ++msgid "Run filesystem check" ++msgstr "執行系統檢查" ++ ++msgid "" ++"SIXXS supports TIC only, for static tunnels using IP protocol 41 (RFC4213) " ++"use 6in4 instead" ++msgstr "" ++ ++msgid "SIXXS-handle[/Tunnel-ID]" ++msgstr "" ++ ++msgid "SSH Access" ++msgstr "SSHå­˜å–" ++ ++msgid "SSH-Keys" ++msgstr "SSH-金鑰" ++ ++msgid "SSID" ++msgstr "基地å°æœå‹™è¨­å®šè­˜åˆ¥ç¢¼SSID" ++ ++msgid "Save" ++msgstr "ä¿å­˜" ++ ++msgid "Save & Apply" ++msgstr "ä¿å­˜ä¸¦å•Ÿç”¨" ++ ++msgid "Save & Apply" ++msgstr "ä¿å­˜ & 啟用" ++ ++msgid "Scan" ++msgstr "掃æ" ++ ++msgid "Scheduled Tasks" ++msgstr "排程任務" ++ ++msgid "Section added" ++msgstr "新增的å€æ®µ" ++ ++msgid "Section removed" ++msgstr "å€æ®µç§»é™¤" ++ ++msgid "See \"mount\" manpage for details" ++msgstr "查看\"mount\"主é ç²å–進階資訊" ++ ++msgid "" ++"Send LCP echo requests at the given interval in seconds, only effective in " ++"conjunction with failure threshold" ++msgstr "傳é€LCP呼å«è«‹æ±‚在這個給予的秒數間隔內, 僅影響關è¯åˆ°å¤±æ•—門檻" ++ ++msgid "Separate Clients" ++msgstr "分隔用戶端" ++ ++msgid "Separate WDS" ++msgstr "分隔WDS中繼" ++ ++msgid "Server Settings" ++msgstr "伺æœå™¨è¨­å®šå€¼" ++ ++msgid "Server password" ++msgstr "" ++ ++msgid "" ++"Server password, enter the specific password of the tunnel when the username " ++"contains the tunnel ID" ++msgstr "" ++ ++msgid "Server username" ++msgstr "" ++ ++msgid "Service Name" ++msgstr "æœå‹™å稱" ++ ++msgid "Service Type" ++msgstr "æœå‹™åž‹æ…‹" ++ ++msgid "Services" ++msgstr "å„æœå‹™" ++ ++#, fuzzy ++msgid "Set up Time Synchronization" ++msgstr "安è£æ ¡æ™‚åŒæ­¥" ++ ++msgid "Setup DHCP Server" ++msgstr "安è£DHCP伺æœå™¨" ++ ++msgid "Show current backup file list" ++msgstr "顯示ç¾ä»Šçš„備份檔清單" ++ ++msgid "Shutdown this interface" ++msgstr "關閉這個介é¢" ++ ++msgid "Shutdown this network" ++msgstr "關閉這個網路" ++ ++msgid "Signal" ++msgstr "信號" ++ ++msgid "Signal:" ++msgstr "信號:" ++ ++msgid "Size" ++msgstr "大å°" ++ ++msgid "Skip" ++msgstr "è·³éŽ" ++ ++msgid "Skip to content" ++msgstr "跳到內容" ++ ++msgid "Skip to navigation" ++msgstr "跳到導覽" ++ ++msgid "Slot time" ++msgstr "æ’槽時間" ++ ++msgid "Software" ++msgstr "軟體" ++ ++msgid "Some fields are invalid, cannot save values!" ++msgstr "有些欄ä½å¤±æ•ˆ, 無法儲存數值!" ++ ++msgid "Sorry, the object you requested was not found." ++msgstr "抱歉, 你請求的這物件尚無發ç¾." ++ ++msgid "Sorry, the server encountered an unexpected error." ++msgstr "抱歉, 伺æœå™¨é­é‡éžé æœŸçš„錯誤." ++ ++#, fuzzy ++msgid "" ++"Sorry, there is no sysupgrade support present; a new firmware image must be " ++"flashed manually. Please refer to the OpenWrt wiki for device specific " ++"install instructions." ++msgstr "" ++"抱歉, 沒有sysupgrade支æ´å‡ºç¾, 新版韌體映åƒæª”必須手動更新. 請回歸OpenWrt wiki" ++"找尋特定設備安è£æŒ‡å¼•." ++ ++msgid "Sort" ++msgstr "分類" ++ ++msgid "Source" ++msgstr "來æº" ++ ++msgid "Source routing" ++msgstr "" ++ ++msgid "Specifies the button state to handle" ++msgstr "指定這個按鈕狀態以便æ“作" ++ ++msgid "Specifies the directory the device is attached to" ++msgstr "指定這個設備被附掛到那個目錄" ++ ++msgid "Specifies the listening port of this Dropbear instance" ++msgstr "指定這個 Dropbear真實è†è½åŸ " ++ ++msgid "" ++"Specifies the maximum amount of failed ARP requests until hosts are presumed " ++"to be dead" ++msgstr "指定失敗ARPå¯è«‹æ±‚的最大數é‡ç›´åˆ°é§­å®¢ä¸»æ©Ÿæ­»äº¡ç‚ºæ­¢" ++ ++msgid "" ++"Specifies the maximum amount of seconds after which hosts are presumed to be " ++"dead" ++msgstr "指定å¯è«‹æ±‚的最大秒數直到駭客主機死亡為止" ++ ++msgid "Specify the secret encryption key here." ++msgstr "指定加密金鑰在此." ++ ++msgid "Start" ++msgstr "啟用" ++ ++msgid "Start priority" ++msgstr "啟用優先權順åº" ++ ++msgid "Startup" ++msgstr "å•Ÿå‹•" ++ ++msgid "Static IPv4 Routes" ++msgstr "éœæ…‹IPv4路由" ++ ++msgid "Static IPv6 Routes" ++msgstr "éœæ…‹IPv6路由" ++ ++msgid "Static Leases" ++msgstr "éœæ…‹ç§Ÿç´„" ++ ++msgid "Static Routes" ++msgstr "éœæ…‹è·¯ç”±" ++ ++msgid "Static WDS" ++msgstr "éœæ…‹WDS" ++ ++msgid "Static address" ++msgstr "éœæ…‹ä½å€" ++ ++msgid "" ++"Static leases are used to assign fixed IP addresses and symbolic hostnames " ++"to DHCP clients. They are also required for non-dynamic interface " ++"configurations where only hosts with a corresponding lease are served." ++msgstr "" ++"éœæ…‹ç§Ÿç´„是用來指定固定的IPä½å€å’Œè¡¨ç¤ºçš„主機å稱給予DHCP用戶端. 它們也需è¦éžå‹•" ++"態介é¢è¨­å®šå€¼ä»¥ä¾¿ç²å–相應租約的主機æœå‹™." ++ ++msgid "Status" ++msgstr "狀態" ++ ++msgid "Stop" ++msgstr "åœæ­¢" ++ ++msgid "Strict order" ++msgstr "嚴謹順åº" ++ ++msgid "Submit" ++msgstr "æ交" ++ ++msgid "Swap" ++msgstr "" ++ ++msgid "Swap Entry" ++msgstr "Swap交æ›é é …ç›®" ++ ++msgid "Switch" ++msgstr "交æ›å™¨" ++ ++msgid "Switch %q" ++msgstr "交æ›å™¨ %q" ++ ++msgid "Switch %q (%s)" ++msgstr "交æ›å™¨ %q (%s)" ++ ++msgid "Switch protocol" ++msgstr "交æ›å™¨å”定" ++ ++msgid "Sync with browser" ++msgstr "åŒæ­¥ç€è¦½å™¨" ++ ++msgid "Synchronizing..." ++msgstr "åŒæ­¥ä¸­..." ++ ++msgid "System" ++msgstr "系統" ++ ++msgid "System Log" ++msgstr "系統日誌" ++ ++msgid "System Properties" ++msgstr "系統屬性" ++ ++msgid "System log buffer size" ++msgstr "系統日誌緩è¡å¤§å°" ++ ++msgid "TCP:" ++msgstr "TCP:" ++ ++msgid "TFTP Settings" ++msgstr "TFTP設定" ++ ++msgid "TFTP server root" ++msgstr "TFTP 伺æœå™¨æ ¹" ++ ++msgid "TX" ++msgstr "傳é€" ++ ++msgid "TX Rate" ++msgstr "傳é€é€Ÿåº¦" ++ ++msgid "Table" ++msgstr "表格" ++ ++msgid "Target" ++msgstr "目標" ++ ++msgid "Terminate" ++msgstr "中斷" ++ ++#, fuzzy ++msgid "" ++"The Device Configuration section covers physical settings of the " ++"radio hardware such as channel, transmit power or antenna selection which " ++"are shared among all defined wireless networks (if the radio hardware is " ++"multi-SSID capable). Per network settings like encryption or operation mode " ++"are grouped in the Interface Configuration." ++msgstr "" ++"這個Device Configuration欄ä½æœƒè¦†è“‹ç„¡ç·šå°„頻硬體的物ç†è¨­å®šå€¼,如通é“ã€" ++"傳é€åŠŸçŽ‡æˆ–者天線分享é“所有定義的無線網路(å‡å¦‚這個無線射頻硬體是多工-SSID能力" ++"çš„). æ¯å€‹ç¶²è·¯è¨­å®šåƒåŠ å¯†æˆ–æ“作模å¼æ˜¯è¢«åˆ†ç¾¤åœ¨Interface Configuration" ++"中." ++ ++msgid "" ++"The libiwinfo-lua package is not installed. You must install this " ++"component for working wireless configuration!" ++msgstr "" ++"這 libiwinfo-lua 軟體包尚未安è£. 你必須安è£é€™å€‹å…ƒä»¶ä»¥ä¾¿ç„¡ç·šç¶²è·¯è¨­å®š" ++"有作用." ++ ++msgid "" ++"The HE.net endpoint update configuration changed, you must now use the plain " ++"username instead of the user ID!" ++msgstr "" ++ ++msgid "" ++"The IPv6 prefix assigned to the provider, usually ends with ::" ++msgstr "指定到這供應商的IPv6字首, 通常用 ::çµå°¾" ++ ++msgid "" ++"The allowed characters are: A-Z, a-z, 0-9 and _" ++msgstr "" ++"所å…許的字元是: A-Z, a-z, 0-9 and " ++"_" ++ ++msgid "The configuration file could not be loaded due to the following error:" ++msgstr "" ++ ++msgid "" ++"The device file of the memory or partition (e.g." ++" /dev/sda1)" ++msgstr "" ++"è¨˜æ†¶é«”çš„è¨­å‚™æª”æˆ–è€…åˆ†å‰²å€ (e.g. /dev/" ++"sda1)" ++ ++msgid "" ++"The filesystem that was used to format the memory (e.g. ext3)" ++msgstr "" ++"這檔案系統é©ç”¨ä¾†æ ¼å¼åŒ–記憶體(例.如. " ++"ext3)" ++ ++msgid "" ++"The flash image was uploaded. Below is the checksum and file size listed, " ++"compare them with the original file to ensure data integrity.
    Click " ++"\"Proceed\" below to start the flash procedure." ++msgstr "" ++"è¦åˆ·çš„映åƒæª”已上傳.下é¢æ˜¯é€™å€‹æ ¡é©—碼和檔案大å°è©³åˆ—, 用原始檔比å°å®ƒé–€ä»¥ç¢ºä¿è³‡æ–™" ++"完整性.
    按下é¢çš„\"繼續\"便å¯ä»¥é–‹å•Ÿæ›´æ–°æµç¨‹." ++ ++msgid "The following changes have been committed" ++msgstr "接下來的修改已經被承諾" ++ ++msgid "The following changes have been reverted" ++msgstr "接下來的修改已經被回復" ++ ++msgid "The following rules are currently active on this system." ++msgstr "以下的è¦å‰‡ç¾æ­£ä½œç”¨åœ¨ç³»çµ±ä¸­." ++ ++msgid "The given network name is not unique" ++msgstr "輸入的網路å稱éžç¨ä¸€" ++ ++#, fuzzy ++msgid "" ++"The hardware is not multi-SSID capable and the existing configuration will " ++"be replaced if you proceed." ++msgstr "如果你繼續的話.這硬體並éžå¤šSSID工能並且已存的設定將會被覆蓋." ++ ++msgid "" ++"The length of the IPv4 prefix in bits, the remainder is used in the IPv6 " ++"addresses." ++msgstr "這IPv4開頭以ä½å…ƒè¨ˆçš„長度, 剩餘部分將會延用在IPv6ä½å€ä¸­." ++ ++msgid "The length of the IPv6 prefix in bits" ++msgstr "這IPv6開頭以ä½å…ƒè¨ˆçš„長度" ++ ++msgid "" ++"The network ports on this device can be combined to several VLANs in which computers can " ++"communicate directly with each other. VLANs are often used to separate different network " ++"segments. Often there is by default one Uplink port for a connection to the " ++"next greater network like the internet and other ports for a local network." ++msgstr "" ++"這設備的網路埠å¯ä»¥è¢«çµ„åˆåˆ°æ•¸å€‹ VLAN群, 以便在內的電腦å¯ä»¥ç›´æŽ¥è·Ÿåˆ¥äººäº’通. VLAN群經常用來分割網路å€æ®µ. é è¨­ç¶“常會有一個上傳" ++"埠來連接到下一個大型網路類似Intenet而其它埠則用來本地å€ç¶²ä½¿ç”¨." ++ ++msgid "The selected protocol needs a device assigned" ++msgstr "é¸åˆ°çš„å”定需è¦æŒ‡å®šåˆ°è¨­å‚™ä¸Š" ++ ++msgid "" ++"The system is erasing the configuration partition now and will reboot itself " ++"when finished." ++msgstr "系統正在刪除設定分割並且當完æˆæ™‚將自行é‡é–‹." ++ ++#, fuzzy ++msgid "" ++"The system is flashing now.
    DO NOT POWER OFF THE DEVICE!
    Wait a " ++"few minutes before you try to reconnect. It might be necessary to renew the " ++"address of your computer to reach the device again, depending on your " ++"settings." ++msgstr "" ++"系統ç¾æ­£åˆ·æ©Ÿä¸­.
    請勿關閉設備!
    等待數分é˜ç›´åˆ°ä½ é‡æ–°åœ¨é€£ç·š. å¯èƒ½éœ€" ++"è¦æ›´æ–°ä½ é›»è…¦çš„ä½å€ä»¥ä¾¿å†é€£è¨­å‚™, 端看你的設定. " ++ ++msgid "" ++"The tunnel end-point is behind NAT, defaults to disabled and only applies to " ++"AYIYA" ++msgstr "" ++ ++msgid "" ++"The uploaded image file does not contain a supported format. Make sure that " ++"you choose the generic image format for your platform." ++msgstr "" ++"以上傳的映åƒæª”ä¸åŒ…å«æ”¯æ´æ ¼å¼. 請確èªä½ é¸æ“‡çš„是é‡å°ä½ çš„å¹³å°æŽ¡ç”¨çš„通用映åƒæª”." ++ ++msgid "There are no active leases." ++msgstr "租賃尚未啟動." ++ ++msgid "There are no pending changes to apply!" ++msgstr "å°šç„¡è½å€™çš„修改被採用" ++ ++msgid "There are no pending changes to revert!" ++msgstr "å°šç„¡è½å€™çš„修改被復元!" ++ ++msgid "There are no pending changes!" ++msgstr "ç„¡è½å€™çš„修改!" ++ ++msgid "" ++"There is no device assigned yet, please attach a network device in the " ++"\"Physical Settings\" tab" ++msgstr "尚未指定設備, 請接上一個網路設備在這\"實體設置\"標籤內" ++ ++msgid "" ++"There is no password set on this router. Please configure a root password to " ++"protect the web interface and enable SSH." ++msgstr "路由器尚未設密碼. 請設定root密碼以便ä¿è­·web介é¢åŠå•Ÿç”¨SSH." ++ ++msgid "This IPv4 address of the relay" ++msgstr "IPv4ä½å€çš„轉驛" ++ ++msgid "" ++"This is a list of shell glob patterns for matching files and directories to " ++"include during sysupgrade. Modified files in /etc/config/ and certain other " ++"configurations are automatically preserved." ++msgstr "" ++"這是shell通用模å¼æ¸…單用來在系統更新時匹é…包括的檔案和目錄. 在/etc/config/ ä¿®" ++"改檔案和特定其它設定檔將會被自動ä¿ç•™." ++ ++msgid "" ++"This is either the \"Update Key\" configured for the tunnel or the account " ++"password if no update key has been configured" ++msgstr "" ++ ++msgid "" ++"This is the content of /etc/rc.local. Insert your own commands here (in " ++"front of 'exit 0') to execute them at the end of the boot process." ++msgstr "" ++"這是 /etc/rc.local 內容. 在這æ’入自己的指令 (在 'exit 0' å‰é¢)以便在開機æµç¨‹" ++"çµå°¾åŸ·è¡Œå®ƒå€‘." ++ ++msgid "" ++"This is the local endpoint address assigned by the tunnel broker, it usually " ++"ends with :2" ++msgstr "這是由通é“代ç†äººæŒ‡å®šçš„本地終端ä½å€, 通常用 :2çµå°¾." ++ ++msgid "" ++"This is the only DHCP in the local network" ++msgstr "" ++"在本地網路中 這是唯一的 DHCP" ++ ++msgid "This is the plain username for logging into the account" ++msgstr "" ++ ++msgid "" ++"This is the prefix routed to you by the tunnel broker for use by clients" ++msgstr "" ++ ++msgid "This is the system crontab in which scheduled tasks can be defined." ++msgstr "這是系統é è¨­çš„例行性工作排程." ++ ++msgid "" ++"This is usually the address of the nearest PoP operated by the tunnel broker" ++msgstr "這是由通é“代ç†äººæ“作的近端PoP通用ä½å€" ++ ++msgid "" ++"This list gives an overview over currently running system processes and " ++"their status." ++msgstr "這清單æ供目å‰æ­£åœ¨åŸ·è¡Œçš„系統的執行緒和狀態的é è¦½." ++ ++msgid "This page allows the configuration of custom button actions" ++msgstr "這一é å…許客製化按éµå‹•ä½œçš„設定" ++ ++msgid "This page gives an overview over currently active network connections." ++msgstr "這一é æ供目å‰æ­£åœ¨æ´»å‹•ä¸­ç¶²è·¯é€£ç·šçš„é è¦½." ++ ++msgid "This section contains no values yet" ++msgstr "這部分尚未有任何數值." ++ ++msgid "Time Synchronization" ++msgstr "校時åŒæ­¥" ++ ++msgid "Time Synchronization is not configured yet." ++msgstr "校時åŒæ­¥å°šæœªè¨­å®š." ++ ++msgid "Timezone" ++msgstr "時å€" ++ ++msgid "" ++"To restore configuration files, you can upload a previously generated backup " ++"archive here." ++msgstr "è¦å¾©å…ƒè¨­å®šæª”, å¯ä»¥ä¸Šå‚³ä¹‹å‰è£½ä½œçš„備份壓縮檔放這." ++ ++msgid "Total Available" ++msgstr "全部å¯ç”¨" ++ ++msgid "Traceroute" ++msgstr "路由追蹤" ++ ++msgid "Traffic" ++msgstr "æµé‡" ++ ++msgid "Transfer" ++msgstr "傳輸" ++ ++msgid "Transmission Rate" ++msgstr "傳輸速率" ++ ++msgid "Transmit" ++msgstr "å°„é »" ++ ++msgid "Transmit Power" ++msgstr "射頻功率" ++ ++msgid "Transmitter Antenna" ++msgstr "射頻天線" ++ ++msgid "Trigger" ++msgstr "觸發" ++ ++msgid "Trigger Mode" ++msgstr "觸發模å¼" ++ ++msgid "Tunnel ID" ++msgstr "通é“ID" ++ ++msgid "Tunnel Interface" ++msgstr "通é“介é¢" ++ ++msgid "Tunnel Link" ++msgstr "" ++ ++msgid "Tunnel broker protocol" ++msgstr "" ++ ++msgid "Tunnel setup server" ++msgstr "" ++ ++msgid "Tunnel type" ++msgstr "" ++ ++msgid "Turbo Mode" ++msgstr "渦輪爆è¡æ¨¡å¼" ++ ++msgid "Tx-Power" ++msgstr "傳é€-功率" ++ ++msgid "Type" ++msgstr "åž‹æ…‹" ++ ++msgid "UDP:" ++msgstr "UDP:" ++ ++msgid "UMTS only" ++msgstr "åªç”¨3G UMTS" ++ ++msgid "UMTS/GPRS/EV-DO" ++msgstr "UMTS/GPRS/EV-DO" ++ ++msgid "USB Device" ++msgstr "USB設備" ++ ++msgid "UUID" ++msgstr "設備通用唯一識別碼UUID" ++ ++msgid "Unable to dispatch" ++msgstr "無法發é€" ++ ++msgid "Unknown" ++msgstr "未知" ++ ++msgid "Unknown Error, password not changed!" ++msgstr "未知錯誤, 密碼尚未改變!" ++ ++msgid "Unmanaged" ++msgstr "éžè¨—管" ++ ++msgid "Unsaved Changes" ++msgstr "尚未存檔的修改" ++ ++msgid "Unsupported protocol type." ++msgstr "ä¸æ”¯æ´çš„å”定型態" ++ ++msgid "Update lists" ++msgstr "上傳清單" ++ ++msgid "" ++"Upload a sysupgrade-compatible image here to replace the running firmware. " ++"Check \"Keep settings\" to retain the current configuration (requires an " ++"OpenWrt compatible firmware image)." ++msgstr "" ++"上傳一個sysupgrade-相容的映åƒæª”在這以便替代正執行中的韌體. 勾é¸\"ä¿æŒè¨­å®š\"以" ++"ä¿ç•™ç›®å‰è¨­å®šå€¼(å¿…é ˆè¦æ˜¯OpenWrt相容性韌體映åƒæª”)." ++ ++msgid "Upload archive..." ++msgstr "上傳壓縮檔..." ++ ++msgid "Uploaded File" ++msgstr "檔案已上傳" ++ ++msgid "Uptime" ++msgstr "上傳花費時間" ++ ++msgid "Use /etc/ethers" ++msgstr "採用 /etc/ethers" ++ ++msgid "Use DHCP gateway" ++msgstr "使用DHCPçš„åŒé“器" ++ ++msgid "Use DNS servers advertised by peer" ++msgstr "使用終端發布的DNS伺æœå™¨" ++ ++msgid "Use ISO/IEC 3166 alpha2 country codes." ++msgstr "使用Use ISO/IEC 3166 alpha2 國碼." ++ ++msgid "Use MTU on tunnel interface" ++msgstr "在通é“介é¢ä¸Šä½¿ç”¨çš„MTU數值" ++ ++msgid "Use TTL on tunnel interface" ++msgstr "在通é“介é¢ä¸Šä½¿ç”¨çš„TTL存活時間" ++ ++msgid "Use as external overlay (/overlay)" ++msgstr "" ++ ++msgid "Use as root filesystem (/)" ++msgstr "" ++ ++msgid "Use broadcast flag" ++msgstr "當作廣播旗標" ++ ++msgid "Use builtin IPv6-management" ++msgstr "" ++ ++msgid "Use custom DNS servers" ++msgstr "使用自定的DNS伺æœå™¨" ++ ++msgid "Use default gateway" ++msgstr "使用é è¨­åŒé“器" ++ ++msgid "Use gateway metric" ++msgstr "使用åŒé“器公測數" ++ ++msgid "Use routing table" ++msgstr "使用路由表" ++ ++msgid "" ++"Use the Add Button to add a new lease entry. The MAC-Address indentifies the host, the IPv4-Address specifies to the fixed " ++"address to use and the Hostname is assigned as symbolic name to the " ++"requesting host." ++msgstr "" ++"使用 Add éµä»¥ä¾¿æ–°å¢žä¸€å€‹ç§Ÿè³ƒçš„é …ç›®. 這個 MAC-Address 標誌這" ++"個主機, the IPv4-Address 指定固定ä½å€ä»¥ä¾¿ä½¿ç”¨,Hostname 備指" ++"定當作象徵å稱到請求的主機上." ++ ++msgid "Used" ++msgstr "已使用" ++ ++msgid "Used Key Slot" ++msgstr "已使用的關éµæ’槽" ++ ++msgid "User certificate (PEM encoded)" ++msgstr "" ++ ++msgid "User key (PEM encoded)" ++msgstr "" ++ ++msgid "Username" ++msgstr "用戶å稱" ++ ++msgid "VC-Mux" ++msgstr "虛擬電路多工器VC-Mux" ++ ++msgid "VLAN Interface" ++msgstr "VLAN介é¢" ++ ++msgid "VLANs on %q" ++msgstr "VLAN 在 %q" ++ ++msgid "VLANs on %q (%s)" ++msgstr "VLAN 在 %q (%s)" ++ ++msgid "VPN Server" ++msgstr "VPN伺æœå™¨" ++ ++msgid "VPN Server port" ++msgstr "" ++ ++msgid "VPN Server's certificate SHA1 hash" ++msgstr "" ++ ++msgid "Vendor Class to send when requesting DHCP" ++msgstr "當請求DHCPå°åŒ…時è¦å‚³é€çš„製造商類別碼" ++ ++msgid "Verbose" ++msgstr "" ++ ++msgid "Verbose logging by aiccu daemon" ++msgstr "" ++ ++msgid "Verify" ++msgstr "確èª" ++ ++msgid "Version" ++msgstr "版本" ++ ++msgid "WDS" ++msgstr "無線分散系統WDS" ++ ++msgid "WEP Open System" ++msgstr "WEP 開放系統" ++ ++msgid "WEP Shared Key" ++msgstr "WEP 共享金鑰" ++ ++msgid "WEP passphrase" ++msgstr "WEP通關密碼" ++ ++msgid "WMM Mode" ++msgstr "無線多媒體機制" ++ ++msgid "WPA passphrase" ++msgstr "WPA 密碼" ++ ++msgid "" ++"WPA-Encryption requires wpa_supplicant (for client mode) or hostapd (for AP " ++"and ad-hoc mode) to be installed." ++msgstr "" ++"WPA-åŠ å¯†éœ€è¦ wpa_supplican(終端模å¼)或者hostapd熱點(å°AP或者是 ad-hoc模å¼)å·²" ++"被安è£." ++ ++msgid "" ++"Wait for NTP sync that many seconds, seting to 0 disables waiting (optional)" ++msgstr "" ++ ++msgid "Waiting for changes to be applied..." ++msgstr "等待修改被啟用..." ++ ++msgid "Waiting for command to complete..." ++msgstr "等待完整性指令..." ++ ++msgid "Warning" ++msgstr "警告" ++ ++msgid "Warning: There are unsaved changes that will be lost while rebooting!" ++msgstr "警告:é‡é–‹æ©Ÿå¾ŒæŸäº›æœªå­˜æª”的修改將會æ¼å¤±!" ++ ++msgid "Whether to create an IPv6 default route over the tunnel" ++msgstr "" ++ ++msgid "Whether to route only packets from delegated prefixes" ++msgstr "" ++ ++msgid "Width" ++msgstr "" ++ ++msgid "Wifi" ++msgstr "WIFIç„¡ç·š" ++ ++msgid "Wireless" ++msgstr "無線網路" ++ ++msgid "Wireless Adapter" ++msgstr "無線網å¡" ++ ++msgid "Wireless Network" ++msgstr "無線網路" ++ ++msgid "Wireless Overview" ++msgstr "ç„¡ç·šé è¦½" ++ ++msgid "Wireless Security" ++msgstr "無線安全" ++ ++msgid "Wireless is disabled or not associated" ++msgstr "無線被關閉或者尚未關è¯" ++ ++msgid "Wireless is restarting..." ++msgstr "ç„¡ç·šé‡å•Ÿä¸­..." ++ ++msgid "Wireless network is disabled" ++msgstr "無線網路已經被關閉" ++ ++msgid "Wireless network is enabled" ++msgstr "無線網路已啟用" ++ ++msgid "Wireless restarted" ++msgstr "無線網路已é‡å•Ÿ" ++ ++msgid "Wireless shut down" ++msgstr "無線網路關閉" ++ ++msgid "Write received DNS requests to syslog" ++msgstr "寫入已接收的DNS請求到系統日誌中" ++ ++msgid "XR Support" ++msgstr "支æ´XR無線陣列" ++ ++msgid "" ++"You can enable or disable installed init scripts here. Changes will applied " ++"after a device reboot.
    Warning: If you disable essential init " ++"scripts like \"network\", your device might become inaccessible!" ++msgstr "" ++"ä½ å¯ä»¥é–‹å•Ÿæˆ–關閉åˆå§‹åŒ–指令在這. 修改將會在設備é‡é–‹å¾Œè¢«å•Ÿç”¨.
    è­¦" ++"å‘Š: å‡å¦‚你關閉必è¦çš„åˆå§‹åŒ–腳本åƒ\"網路\", 你的設備將å¯èƒ½ç„¡æ³•å­˜å–!" ++ ++msgid "" ++"You must enable Java Script in your browser or LuCI will not work properly." ++msgstr "在ç€è¦½å™¨ä½ å¿…須啟用Java Scriptå¦å‰‡LuCI無法正常é‹ä½œ." ++ ++msgid "" ++"Your Internet Explorer is too old to display this page correctly. Please " ++"upgrade it to at least version 7 or use another browser like Firefox, Opera " ++"or Safari." ++msgstr "" ++ ++msgid "any" ++msgstr "ä»»æ„" ++ ++msgid "auto" ++msgstr "自動" ++ ++msgid "automatic" ++msgstr "" ++ ++msgid "baseT" ++msgstr "baseT" ++ ++msgid "bridged" ++msgstr "已橋接" ++ ++msgid "create:" ++msgstr "建立:" ++ ++msgid "creates a bridge over specified interface(s)" ++msgstr "在指定的介é¢ç¾¤ä¸Šå»ºç«‹æ©‹æŽ¥" ++ ++msgid "dB" ++msgstr "dB" ++ ++msgid "dBm" ++msgstr "dBm" ++ ++msgid "disable" ++msgstr "關閉" ++ ++msgid "disabled" ++msgstr "" ++ ++msgid "expired" ++msgstr "éŽæœŸ" ++ ++msgid "" ++"file where given DHCP-leases will be stored" ++msgstr "" ++"當給予DHCP-租賃將" ++"會被存檔" ++ ++msgid "forward" ++msgstr "轉發" ++ ++msgid "full-duplex" ++msgstr "全雙工" ++ ++msgid "half-duplex" ++msgstr "åŠé›™å·¥" ++ ++msgid "help" ++msgstr "幫助" ++ ++msgid "hidden" ++msgstr "éš±è—" ++ ++msgid "hybrid mode" ++msgstr "" ++ ++msgid "if target is a network" ++msgstr "å‡å¦‚目標是æŸå€‹ç¶²è·¯" ++ ++msgid "input" ++msgstr "輸入" ++ ++msgid "kB" ++msgstr "kB" ++ ++msgid "kB/s" ++msgstr "kB/s" ++ ++msgid "kbit/s" ++msgstr "kbit/s" ++ ++msgid "local DNS file" ++msgstr "本地DNS 檔案" ++ ++msgid "minimum 1280, maximum 1480" ++msgstr "" ++ ++msgid "navigation Navigation" ++msgstr "" ++ ++msgid "no" ++msgstr "ç„¡" ++ ++msgid "no link" ++msgstr "無連線" ++ ++msgid "none" ++msgstr "ç„¡" ++ ++msgid "not present" ++msgstr "" ++ ++msgid "off" ++msgstr "關閉" ++ ++msgid "on" ++msgstr "é–‹å•Ÿ" ++ ++msgid "open" ++msgstr "打開" ++ ++msgid "overlay" ++msgstr "" ++ ++msgid "relay mode" ++msgstr "" ++ ++msgid "routed" ++msgstr "路由" ++ ++msgid "server mode" ++msgstr "" ++ ++msgid "skiplink1 Skip to navigation" ++msgstr "" ++ ++msgid "skiplink2 Skip to content" ++msgstr "" ++ ++msgid "stateful-only" ++msgstr "" ++ ++msgid "stateless" ++msgstr "" ++ ++msgid "stateless + stateful" ++msgstr "" ++ ++msgid "tagged" ++msgstr "標籤" ++ ++msgid "unknown" ++msgstr "未知" ++ ++msgid "unlimited" ++msgstr "ç„¡é™" ++ ++msgid "unspecified" ++msgstr "尚未指定" ++ ++msgid "unspecified -or- create:" ++msgstr "尚未指定 - 或 -建立:" ++ ++msgid "untagged" ++msgstr "尚未標籤" ++ ++msgid "yes" ++msgstr "是的" ++ ++msgid "« Back" ++msgstr "« 倒退" ++ ++#~ msgid "" ++#~ "Always use 40MHz channels even if the secondary channel overlaps. Using " ++#~ "this option does not comply with IEEE 802.11n-2009!" ++#~ msgstr "" ++#~ "強制啟用40MHz頻寬並忽略輔助通é“é‡ç–Šã€‚æ­¤é¸é …ä¸ç›¸å®¹æ–¼IEEE 802.11n-2009!" ++ ++#~ msgid "Cached" ++#~ msgstr "已快å–" ++ ++#~ msgid "Configures this mount as overlay storage for block-extroot" ++#~ msgstr "è¦æŽ¡ç”¨block-extroot功能,設定這個掛載點當作覆蓋儲存" ++ ++#~ msgid "Force 40MHz mode" ++#~ msgstr "強制40MHz模å¼" ++ ++#~ msgid "Frequency Hopping" ++#~ msgstr "跳頻" ++ ++#~ msgid "Locked to channel %d used by %s" ++#~ msgstr "éŽ–å®šé€šé“ ç”± %s 使用的 %d " ++ ++#~ msgid "Use as root filesystem" ++#~ msgstr "當作root檔案系統" ++ ++#~ msgid "HE.net user ID" ++#~ msgstr "HE.net用戶識別碼ID" ++ ++#~ msgid "This is the 32 byte hex encoded user ID, not the login name" ++#~ msgstr "這是32å­—å…ƒ16進制用戶ID編碼,並éžç™»å…¥å稱" ++ ++#~ msgid "40MHz 2nd channel above" ++#~ msgstr "40MHz的上述第二通é“" ++ ++#~ msgid "40MHz 2nd channel below" ++#~ msgstr "40MHz的下述第二通é“" ++ ++#~ msgid "Accept router advertisements" ++#~ msgstr "接收路由器通告" ++ ++#~ msgid "Advertise IPv6 on network" ++#~ msgstr "在網路上通知IPv6" ++ ++#~ msgid "Advertised network ID" ++#~ msgstr "通知網路ID" ++ ++#~ msgid "Allowed range is 1 to 65535" ++#~ msgstr "å…許範åœç‚º1到65535" ++ ++#~ msgid "HT capabilities" ++#~ msgstr "HT頻寬能力" ++ ++#~ msgid "HT mode" ++#~ msgstr "HT頻寬模å¼" ++ ++#~ msgid "Router Model" ++#~ msgstr "路由器型號Model" ++ ++#~ msgid "Router Name" ++#~ msgstr "路由器å稱" ++ ++#~ msgid "Send router solicitations" ++#~ msgstr "傳é€è·¯ç”±å™¨é‚€è«‹å°åŒ…" ++ ++#~ msgid "Specifies the advertised preferred prefix lifetime in seconds" ++#~ msgstr "指定這個公告較愛字首的生命週期以秒表示" ++ ++#~ msgid "Specifies the advertised valid prefix lifetime in seconds" ++#~ msgstr "指定這個公告有效字首的生命週期以秒表示" ++ ++#~ msgid "Use preferred lifetime" ++#~ msgstr "使用首é¸çš„生命週期" ++ ++#~ msgid "Use valid lifetime" ++#~ msgstr "使用正確的生命週期" +diff --git a/feeds/luci/modules/luci-base/root/etc/config/luci b/feeds/luci/modules/luci-base/root/etc/config/luci +new file mode 100644 +index 0000000..baa3ac5 +--- /dev/null ++++ b/feeds/luci/modules/luci-base/root/etc/config/luci +@@ -0,0 +1,24 @@ ++config core main ++ option lang auto ++ option mediaurlbase /luci-static/bootstrap ++ option resourcebase /luci-static/resources ++ ++config extern flash_keep ++ option uci "/etc/config/" ++ option dropbear "/etc/dropbear/" ++ option openvpn "/etc/openvpn/" ++ option passwd "/etc/passwd" ++ option opkg "/etc/opkg.conf" ++ option firewall "/etc/firewall.user" ++ option uploads "/lib/uci/upload/" ++ ++config internal languages ++ ++config internal sauth ++ option sessionpath "/tmp/luci-sessions" ++ option sessiontime 3600 ++ ++config internal ccache ++ option enable 1 ++ ++config internal themes +diff --git a/feeds/luci/modules/luci-base/root/etc/config/ucitrack b/feeds/luci/modules/luci-base/root/etc/config/ucitrack +new file mode 100644 +index 0000000..cd3cb85 +--- /dev/null ++++ b/feeds/luci/modules/luci-base/root/etc/config/ucitrack +@@ -0,0 +1,57 @@ ++config network ++ option init network ++ list affects dhcp ++ list affects radvd ++ ++config wireless ++ list affects network ++ ++config firewall ++ option init firewall ++ list affects luci-splash ++ list affects qos ++ list affects miniupnpd ++ ++config olsr ++ option init olsrd ++ ++config dhcp ++ option init dnsmasq ++ list affects odhcpd ++ ++config odhcpd ++ option init odhcpd ++ ++config dropbear ++ option init dropbear ++ ++config httpd ++ option init httpd ++ ++config fstab ++ option init fstab ++ ++config qos ++ option init qos ++ ++config system ++ option init led ++ list affects luci_statistics ++ ++config luci_splash ++ option init luci_splash ++ ++config upnpd ++ option init miniupnpd ++ ++config ntpclient ++ option init ntpclient ++ ++config samba ++ option init samba ++ ++config tinyproxy ++ option init tinyproxy ++ ++config 6relayd ++ option init 6relayd +diff --git a/feeds/luci/modules/luci-base/root/lib/uci/upload/.placeholder b/feeds/luci/modules/luci-base/root/lib/uci/upload/.placeholder +new file mode 100644 +index 0000000..e69de29 +diff --git a/feeds/luci/modules/luci-base/root/sbin/luci-reload b/feeds/luci/modules/luci-base/root/sbin/luci-reload +new file mode 100755 +index 0000000..cc41da2 +--- /dev/null ++++ b/feeds/luci/modules/luci-base/root/sbin/luci-reload +@@ -0,0 +1,45 @@ ++#!/bin/sh ++. /lib/functions.sh ++ ++apply_config() { ++ config_get init "$1" init ++ config_get exec "$1" exec ++ config_get test "$1" test ++ ++ echo "$2" > "/var/run/luci-reload-status" ++ ++ [ -n "$init" ] && reload_init "$2" "$init" "$test" ++ [ -n "$exec" ] && reload_exec "$2" "$exec" "$test" ++} ++ ++reload_exec() { ++ local service="$1" ++ local ok="$3" ++ set -- $2 ++ local cmd="$1"; shift ++ ++ [ -x "$cmd" ] && { ++ echo "Reloading $service... " ++ ( $cmd "$@" ) 2>/dev/null 1>&2 ++ [ -n "$ok" -a "$?" != "$ok" ] && echo '!!! Failed to reload' $service '!!!' ++ } ++} ++ ++reload_init() { ++ [ -x /etc/init.d/$2 ] && /etc/init.d/$2 enabled && { ++ echo "Reloading $1... " ++ /etc/init.d/$2 reload >/dev/null 2>&1 ++ [ -n "$3" -a "$?" != "$3" ] && echo '!!! Failed to reload' $1 '!!!' ++ } ++} ++ ++lock "/var/run/luci-reload" ++ ++config_load ucitrack ++ ++for i in $*; do ++ config_foreach apply_config $i $i ++done ++ ++rm -f "/var/run/luci-reload-status" ++lock -u "/var/run/luci-reload" +diff --git a/feeds/luci/modules/luci-base/root/www/index.html b/feeds/luci/modules/luci-base/root/www/index.html +new file mode 100644 +index 0000000..0b5fa1d +--- /dev/null ++++ b/feeds/luci/modules/luci-base/root/www/index.html +@@ -0,0 +1,11 @@ ++ ++ ++ ++ ++ ++ ++ ++ ++LuCI - Lua Configuration Interface ++ ++ +diff --git a/feeds/luci/modules/luci-base/src/Makefile b/feeds/luci/modules/luci-base/src/Makefile +new file mode 100644 +index 0000000..7bb7f2e +--- /dev/null ++++ b/feeds/luci/modules/luci-base/src/Makefile +@@ -0,0 +1,21 @@ ++%.o: %.c ++ $(CC) $(CPPFLAGS) $(CFLAGS) $(FPIC) -c -o $@ $< ++ ++clean: ++ rm -f po2lmo parser.so version.lua *.o ++ ++po2lmo: po2lmo.o template_lmo.o ++ $(CC) $(LDFLAGS) -o $@ $^ ++ ++parser.so: template_parser.o template_utils.o template_lmo.o template_lualib.o ++ $(CC) $(LDFLAGS) -shared -o $@ $^ ++ ++version.lua: ++ ./mkversion.sh $@ $(LUCI_VERSION) ++ ++compile: parser.so version.lua ++ ++install: compile ++ mkdir -p $(DESTDIR)/usr/lib/lua/luci/template ++ cp parser.so $(DESTDIR)/usr/lib/lua/luci/template/parser.so ++ cp version.lua $(DESTDIR)/usr/lib/lua/luci/version.lua +diff --git a/feeds/luci/modules/luci-base/src/mkversion.sh b/feeds/luci/modules/luci-base/src/mkversion.sh +new file mode 100755 +index 0000000..55b0ebd +--- /dev/null ++++ b/feeds/luci/modules/luci-base/src/mkversion.sh +@@ -0,0 +1,41 @@ ++#!/bin/sh ++ ++if svn info >/dev/null 2>/dev/null; then ++ if [ "${4%%/*}" = "branches" ]; then ++ variant="LuCI ${4##*[-/]} Branch" ++ elif [ "${4%%/*}" = "tags" ]; then ++ variant="LuCI ${4##*[-/]} Release" ++ else ++ variant="LuCI Trunk" ++ fi ++elif git status >/dev/null 2>/dev/null; then ++ tag="$(git describe --tags 2>/dev/null)" ++ branch="$(git symbolic-ref --short -q HEAD 2>/dev/null)" ++ ++ if [ -n "$tag" ]; then ++ variant="LuCI $tag Release" ++ elif [ "$branch" != "master" ]; then ++ variant="LuCI ${branch##*-} Branch" ++ else ++ variant="LuCI Master" ++ fi ++else ++ variant="LuCI" ++fi ++ ++cat < $1 ++local pcall, dofile, _G = pcall, dofile, _G ++ ++module "luci.version" ++ ++if pcall(dofile, "/etc/openwrt_release") and _G.DISTRIB_DESCRIPTION then ++ distname = "" ++ distversion = _G.DISTRIB_DESCRIPTION ++else ++ distname = "OpenWrt" ++ distversion = "Development Snapshot" ++end ++ ++luciname = "$variant" ++luciversion = "${2:-Git}" ++EOF +diff --git a/feeds/luci/modules/luci-base/src/po2lmo.c b/feeds/luci/modules/luci-base/src/po2lmo.c +new file mode 100644 +index 0000000..fd927cb +--- /dev/null ++++ b/feeds/luci/modules/luci-base/src/po2lmo.c +@@ -0,0 +1,247 @@ ++/* ++ * lmo - Lua Machine Objects - PO to LMO conversion tool ++ * ++ * Copyright (C) 2009-2012 Jo-Philipp Wich ++ * ++ * Licensed under the Apache License, Version 2.0 (the "License"); ++ * you may not use this file except in compliance with the License. ++ * You may obtain a copy of the License at ++ * ++ * http://www.apache.org/licenses/LICENSE-2.0 ++ * ++ * Unless required by applicable law or agreed to in writing, software ++ * distributed under the License is distributed on an "AS IS" BASIS, ++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. ++ * See the License for the specific language governing permissions and ++ * limitations under the License. ++ */ ++ ++#include "template_lmo.h" ++ ++static void die(const char *msg) ++{ ++ fprintf(stderr, "Error: %s\n", msg); ++ exit(1); ++} ++ ++static void usage(const char *name) ++{ ++ fprintf(stderr, "Usage: %s input.po output.lmo\n", name); ++ exit(1); ++} ++ ++static void print(const void *ptr, size_t size, size_t nmemb, FILE *stream) ++{ ++ if( fwrite(ptr, size, nmemb, stream) == 0 ) ++ die("Failed to write stdout"); ++} ++ ++static int extract_string(const char *src, char *dest, int len) ++{ ++ int pos = 0; ++ int esc = 0; ++ int off = -1; ++ ++ for( pos = 0; (pos < strlen(src)) && (pos < len); pos++ ) ++ { ++ if( (off == -1) && (src[pos] == '"') ) ++ { ++ off = pos + 1; ++ } ++ else if( off >= 0 ) ++ { ++ if( esc == 1 ) ++ { ++ switch (src[pos]) ++ { ++ case '"': ++ case '\\': ++ off++; ++ break; ++ } ++ dest[pos-off] = src[pos]; ++ esc = 0; ++ } ++ else if( src[pos] == '\\' ) ++ { ++ dest[pos-off] = src[pos]; ++ esc = 1; ++ } ++ else if( src[pos] != '"' ) ++ { ++ dest[pos-off] = src[pos]; ++ } ++ else ++ { ++ dest[pos-off] = '\0'; ++ break; ++ } ++ } ++ } ++ ++ return (off > -1) ? strlen(dest) : -1; ++} ++ ++static int cmp_index(const void *a, const void *b) ++{ ++ uint32_t x = ((const lmo_entry_t *)a)->key_id; ++ uint32_t y = ((const lmo_entry_t *)b)->key_id; ++ ++ if (x < y) ++ return -1; ++ else if (x > y) ++ return 1; ++ ++ return 0; ++} ++ ++static void print_uint32(uint32_t x, FILE *out) ++{ ++ uint32_t y = htonl(x); ++ print(&y, sizeof(uint32_t), 1, out); ++} ++ ++static void print_index(void *array, int n, FILE *out) ++{ ++ lmo_entry_t *e; ++ ++ qsort(array, n, sizeof(*e), cmp_index); ++ ++ for (e = array; n > 0; n--, e++) ++ { ++ print_uint32(e->key_id, out); ++ print_uint32(e->val_id, out); ++ print_uint32(e->offset, out); ++ print_uint32(e->length, out); ++ } ++} ++ ++int main(int argc, char *argv[]) ++{ ++ char line[4096]; ++ char key[4096]; ++ char val[4096]; ++ char tmp[4096]; ++ int state = 0; ++ int offset = 0; ++ int length = 0; ++ int n_entries = 0; ++ void *array = NULL; ++ lmo_entry_t *entry = NULL; ++ uint32_t key_id, val_id; ++ ++ FILE *in; ++ FILE *out; ++ ++ if( (argc != 3) || ((in = fopen(argv[1], "r")) == NULL) || ((out = fopen(argv[2], "w")) == NULL) ) ++ usage(argv[0]); ++ ++ memset(line, 0, sizeof(key)); ++ memset(key, 0, sizeof(val)); ++ memset(val, 0, sizeof(val)); ++ ++ while( (NULL != fgets(line, sizeof(line), in)) || (state >= 2 && feof(in)) ) ++ { ++ if( state == 0 && strstr(line, "msgid \"") == line ) ++ { ++ switch(extract_string(line, key, sizeof(key))) ++ { ++ case -1: ++ die("Syntax error in msgid"); ++ case 0: ++ state = 1; ++ break; ++ default: ++ state = 2; ++ } ++ } ++ else if( state == 1 || state == 2 ) ++ { ++ if( strstr(line, "msgstr \"") == line || state == 2 ) ++ { ++ switch(extract_string(line, val, sizeof(val))) ++ { ++ case -1: ++ state = 4; ++ break; ++ default: ++ state = 3; ++ } ++ } ++ else ++ { ++ switch(extract_string(line, tmp, sizeof(tmp))) ++ { ++ case -1: ++ state = 2; ++ break; ++ default: ++ strcat(key, tmp); ++ } ++ } ++ } ++ else if( state == 3 ) ++ { ++ switch(extract_string(line, tmp, sizeof(tmp))) ++ { ++ case -1: ++ state = 4; ++ break; ++ default: ++ strcat(val, tmp); ++ } ++ } ++ ++ if( state == 4 ) ++ { ++ if( strlen(key) > 0 && strlen(val) > 0 ) ++ { ++ key_id = sfh_hash(key, strlen(key)); ++ val_id = sfh_hash(val, strlen(val)); ++ ++ if( key_id != val_id ) ++ { ++ n_entries++; ++ array = realloc(array, n_entries * sizeof(lmo_entry_t)); ++ entry = (lmo_entry_t *)array + n_entries - 1; ++ ++ if (!array) ++ die("Out of memory"); ++ ++ entry->key_id = key_id; ++ entry->val_id = val_id; ++ entry->offset = offset; ++ entry->length = strlen(val); ++ ++ length = strlen(val) + ((4 - (strlen(val) % 4)) % 4); ++ ++ print(val, length, 1, out); ++ offset += length; ++ } ++ } ++ ++ state = 0; ++ memset(key, 0, sizeof(key)); ++ memset(val, 0, sizeof(val)); ++ } ++ ++ memset(line, 0, sizeof(line)); ++ } ++ ++ print_index(array, n_entries, out); ++ ++ if( offset > 0 ) ++ { ++ print_uint32(offset, out); ++ fsync(fileno(out)); ++ fclose(out); ++ } ++ else ++ { ++ fclose(out); ++ unlink(argv[2]); ++ } ++ ++ fclose(in); ++ return(0); ++} +diff --git a/feeds/luci/modules/luci-base/src/template_lmo.c b/feeds/luci/modules/luci-base/src/template_lmo.c +new file mode 100644 +index 0000000..3d1eaf4 +--- /dev/null ++++ b/feeds/luci/modules/luci-base/src/template_lmo.c +@@ -0,0 +1,328 @@ ++/* ++ * lmo - Lua Machine Objects - Base functions ++ * ++ * Copyright (C) 2009-2010 Jo-Philipp Wich ++ * ++ * Licensed under the Apache License, Version 2.0 (the "License"); ++ * you may not use this file except in compliance with the License. ++ * You may obtain a copy of the License at ++ * ++ * http://www.apache.org/licenses/LICENSE-2.0 ++ * ++ * Unless required by applicable law or agreed to in writing, software ++ * distributed under the License is distributed on an "AS IS" BASIS, ++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. ++ * See the License for the specific language governing permissions and ++ * limitations under the License. ++ */ ++ ++#include "template_lmo.h" ++ ++/* ++ * Hash function from http://www.azillionmonkeys.com/qed/hash.html ++ * Copyright (C) 2004-2008 by Paul Hsieh ++ */ ++ ++uint32_t sfh_hash(const char *data, int len) ++{ ++ uint32_t hash = len, tmp; ++ int rem; ++ ++ if (len <= 0 || data == NULL) return 0; ++ ++ rem = len & 3; ++ len >>= 2; ++ ++ /* Main loop */ ++ for (;len > 0; len--) { ++ hash += sfh_get16(data); ++ tmp = (sfh_get16(data+2) << 11) ^ hash; ++ hash = (hash << 16) ^ tmp; ++ data += 2*sizeof(uint16_t); ++ hash += hash >> 11; ++ } ++ ++ /* Handle end cases */ ++ switch (rem) { ++ case 3: hash += sfh_get16(data); ++ hash ^= hash << 16; ++ hash ^= data[sizeof(uint16_t)] << 18; ++ hash += hash >> 11; ++ break; ++ case 2: hash += sfh_get16(data); ++ hash ^= hash << 11; ++ hash += hash >> 17; ++ break; ++ case 1: hash += *data; ++ hash ^= hash << 10; ++ hash += hash >> 1; ++ } ++ ++ /* Force "avalanching" of final 127 bits */ ++ hash ^= hash << 3; ++ hash += hash >> 5; ++ hash ^= hash << 4; ++ hash += hash >> 17; ++ hash ^= hash << 25; ++ hash += hash >> 6; ++ ++ return hash; ++} ++ ++uint32_t lmo_canon_hash(const char *str, int len) ++{ ++ char res[4096]; ++ char *ptr, prev; ++ int off; ++ ++ if (!str || len >= sizeof(res)) ++ return 0; ++ ++ for (prev = ' ', ptr = res, off = 0; off < len; prev = *str, off++, str++) ++ { ++ if (isspace(*str)) ++ { ++ if (!isspace(prev)) ++ *ptr++ = ' '; ++ } ++ else ++ { ++ *ptr++ = *str; ++ } ++ } ++ ++ if ((ptr > res) && isspace(*(ptr-1))) ++ ptr--; ++ ++ return sfh_hash(res, ptr - res); ++} ++ ++lmo_archive_t * lmo_open(const char *file) ++{ ++ int in = -1; ++ uint32_t idx_offset = 0; ++ struct stat s; ++ ++ lmo_archive_t *ar = NULL; ++ ++ if (stat(file, &s) == -1) ++ goto err; ++ ++ if ((in = open(file, O_RDONLY)) == -1) ++ goto err; ++ ++ if ((ar = (lmo_archive_t *)malloc(sizeof(*ar))) != NULL) ++ { ++ memset(ar, 0, sizeof(*ar)); ++ ++ ar->fd = in; ++ ar->size = s.st_size; ++ ++ fcntl(ar->fd, F_SETFD, fcntl(ar->fd, F_GETFD) | FD_CLOEXEC); ++ ++ if ((ar->mmap = mmap(NULL, ar->size, PROT_READ, MAP_SHARED, ar->fd, 0)) == MAP_FAILED) ++ goto err; ++ ++ idx_offset = ntohl(*((const uint32_t *) ++ (ar->mmap + ar->size - sizeof(uint32_t)))); ++ ++ if (idx_offset >= ar->size) ++ goto err; ++ ++ ar->index = (lmo_entry_t *)(ar->mmap + idx_offset); ++ ar->length = (ar->size - idx_offset - sizeof(uint32_t)) / sizeof(lmo_entry_t); ++ ar->end = ar->mmap + ar->size; ++ ++ return ar; ++ } ++ ++err: ++ if (in > -1) ++ close(in); ++ ++ if (ar != NULL) ++ { ++ if ((ar->mmap != NULL) && (ar->mmap != MAP_FAILED)) ++ munmap(ar->mmap, ar->size); ++ ++ free(ar); ++ } ++ ++ return NULL; ++} ++ ++void lmo_close(lmo_archive_t *ar) ++{ ++ if (ar != NULL) ++ { ++ if ((ar->mmap != NULL) && (ar->mmap != MAP_FAILED)) ++ munmap(ar->mmap, ar->size); ++ ++ close(ar->fd); ++ free(ar); ++ ++ ar = NULL; ++ } ++} ++ ++ ++lmo_catalog_t *_lmo_catalogs = NULL; ++lmo_catalog_t *_lmo_active_catalog = NULL; ++ ++int lmo_load_catalog(const char *lang, const char *dir) ++{ ++ DIR *dh = NULL; ++ char pattern[16]; ++ char path[PATH_MAX]; ++ struct dirent *de = NULL; ++ ++ lmo_archive_t *ar = NULL; ++ lmo_catalog_t *cat = NULL; ++ ++ if (!lmo_change_catalog(lang)) ++ return 0; ++ ++ if (!dir || !(dh = opendir(dir))) ++ goto err; ++ ++ if (!(cat = malloc(sizeof(*cat)))) ++ goto err; ++ ++ memset(cat, 0, sizeof(*cat)); ++ ++ snprintf(cat->lang, sizeof(cat->lang), "%s", lang); ++ snprintf(pattern, sizeof(pattern), "*.%s.lmo", lang); ++ ++ while ((de = readdir(dh)) != NULL) ++ { ++ if (!fnmatch(pattern, de->d_name, 0)) ++ { ++ snprintf(path, sizeof(path), "%s/%s", dir, de->d_name); ++ ar = lmo_open(path); ++ ++ if (ar) ++ { ++ ar->next = cat->archives; ++ cat->archives = ar; ++ } ++ } ++ } ++ ++ closedir(dh); ++ ++ cat->next = _lmo_catalogs; ++ _lmo_catalogs = cat; ++ ++ if (!_lmo_active_catalog) ++ _lmo_active_catalog = cat; ++ ++ return 0; ++ ++err: ++ if (dh) closedir(dh); ++ if (cat) free(cat); ++ ++ return -1; ++} ++ ++int lmo_change_catalog(const char *lang) ++{ ++ lmo_catalog_t *cat; ++ ++ for (cat = _lmo_catalogs; cat; cat = cat->next) ++ { ++ if (!strncmp(cat->lang, lang, sizeof(cat->lang))) ++ { ++ _lmo_active_catalog = cat; ++ return 0; ++ } ++ } ++ ++ return -1; ++} ++ ++static lmo_entry_t * lmo_find_entry(lmo_archive_t *ar, uint32_t hash) ++{ ++ unsigned int m, l, r; ++ uint32_t k; ++ ++ l = 0; ++ r = ar->length - 1; ++ ++ while (1) ++ { ++ m = l + ((r - l) / 2); ++ ++ if (r < l) ++ break; ++ ++ k = ntohl(ar->index[m].key_id); ++ ++ if (k == hash) ++ return &ar->index[m]; ++ ++ if (k > hash) ++ { ++ if (!m) ++ break; ++ ++ r = m - 1; ++ } ++ else ++ { ++ l = m + 1; ++ } ++ } ++ ++ return NULL; ++} ++ ++int lmo_translate(const char *key, int keylen, char **out, int *outlen) ++{ ++ uint32_t hash; ++ lmo_entry_t *e; ++ lmo_archive_t *ar; ++ ++ if (!key || !_lmo_active_catalog) ++ return -2; ++ ++ hash = lmo_canon_hash(key, keylen); ++ ++ for (ar = _lmo_active_catalog->archives; ar; ar = ar->next) ++ { ++ if ((e = lmo_find_entry(ar, hash)) != NULL) ++ { ++ *out = ar->mmap + ntohl(e->offset); ++ *outlen = ntohl(e->length); ++ return 0; ++ } ++ } ++ ++ return -1; ++} ++ ++void lmo_close_catalog(const char *lang) ++{ ++ lmo_archive_t *ar, *next; ++ lmo_catalog_t *cat, *prev; ++ ++ for (prev = NULL, cat = _lmo_catalogs; cat; prev = cat, cat = cat->next) ++ { ++ if (!strncmp(cat->lang, lang, sizeof(cat->lang))) ++ { ++ if (prev) ++ prev->next = cat->next; ++ else ++ _lmo_catalogs = cat->next; ++ ++ for (ar = cat->archives; ar; ar = next) ++ { ++ next = ar->next; ++ lmo_close(ar); ++ } ++ ++ free(cat); ++ break; ++ } ++ } ++} +diff --git a/feeds/luci/modules/luci-base/src/template_lmo.h b/feeds/luci/modules/luci-base/src/template_lmo.h +new file mode 100644 +index 0000000..f251c63 +--- /dev/null ++++ b/feeds/luci/modules/luci-base/src/template_lmo.h +@@ -0,0 +1,92 @@ ++/* ++ * lmo - Lua Machine Objects - General header ++ * ++ * Copyright (C) 2009-2012 Jo-Philipp Wich ++ * ++ * Licensed under the Apache License, Version 2.0 (the "License"); ++ * you may not use this file except in compliance with the License. ++ * You may obtain a copy of the License at ++ * ++ * http://www.apache.org/licenses/LICENSE-2.0 ++ * ++ * Unless required by applicable law or agreed to in writing, software ++ * distributed under the License is distributed on an "AS IS" BASIS, ++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. ++ * See the License for the specific language governing permissions and ++ * limitations under the License. ++ */ ++ ++#ifndef _TEMPLATE_LMO_H_ ++#define _TEMPLATE_LMO_H_ ++ ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++ ++#if (defined(__GNUC__) && defined(__i386__)) ++#define sfh_get16(d) (*((const uint16_t *) (d))) ++#else ++#define sfh_get16(d) ((((uint32_t)(((const uint8_t *)(d))[1])) << 8)\ ++ +(uint32_t)(((const uint8_t *)(d))[0]) ) ++#endif ++ ++ ++struct lmo_entry { ++ uint32_t key_id; ++ uint32_t val_id; ++ uint32_t offset; ++ uint32_t length; ++} __attribute__((packed)); ++ ++typedef struct lmo_entry lmo_entry_t; ++ ++ ++struct lmo_archive { ++ int fd; ++ int length; ++ uint32_t size; ++ lmo_entry_t *index; ++ char *mmap; ++ char *end; ++ struct lmo_archive *next; ++}; ++ ++typedef struct lmo_archive lmo_archive_t; ++ ++ ++struct lmo_catalog { ++ char lang[6]; ++ struct lmo_archive *archives; ++ struct lmo_catalog *next; ++}; ++ ++typedef struct lmo_catalog lmo_catalog_t; ++ ++ ++uint32_t sfh_hash(const char *data, int len); ++uint32_t lmo_canon_hash(const char *data, int len); ++ ++lmo_archive_t * lmo_open(const char *file); ++void lmo_close(lmo_archive_t *ar); ++ ++ ++extern lmo_catalog_t *_lmo_catalogs; ++extern lmo_catalog_t *_lmo_active_catalog; ++ ++int lmo_load_catalog(const char *lang, const char *dir); ++int lmo_change_catalog(const char *lang); ++int lmo_translate(const char *key, int keylen, char **out, int *outlen); ++void lmo_close_catalog(const char *lang); ++ ++#endif +diff --git a/feeds/luci/modules/luci-base/src/template_lualib.c b/feeds/luci/modules/luci-base/src/template_lualib.c +new file mode 100644 +index 0000000..d5c8dd6 +--- /dev/null ++++ b/feeds/luci/modules/luci-base/src/template_lualib.c +@@ -0,0 +1,179 @@ ++/* ++ * LuCI Template - Lua binding ++ * ++ * Copyright (C) 2009 Jo-Philipp Wich ++ * ++ * Licensed under the Apache License, Version 2.0 (the "License"); ++ * you may not use this file except in compliance with the License. ++ * You may obtain a copy of the License at ++ * ++ * http://www.apache.org/licenses/LICENSE-2.0 ++ * ++ * Unless required by applicable law or agreed to in writing, software ++ * distributed under the License is distributed on an "AS IS" BASIS, ++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. ++ * See the License for the specific language governing permissions and ++ * limitations under the License. ++ */ ++ ++#include "template_lualib.h" ++ ++static int template_L_do_parse(lua_State *L, struct template_parser *parser, const char *chunkname) ++{ ++ int lua_status, rv; ++ ++ if (!parser) ++ { ++ lua_pushnil(L); ++ lua_pushinteger(L, errno); ++ lua_pushstring(L, strerror(errno)); ++ return 3; ++ } ++ ++ lua_status = lua_load(L, template_reader, parser, chunkname); ++ ++ if (lua_status == 0) ++ rv = 1; ++ else ++ rv = template_error(L, parser); ++ ++ template_close(parser); ++ ++ return rv; ++} ++ ++int template_L_parse(lua_State *L) ++{ ++ const char *file = luaL_checkstring(L, 1); ++ struct template_parser *parser = template_open(file); ++ ++ return template_L_do_parse(L, parser, file); ++} ++ ++int template_L_parse_string(lua_State *L) ++{ ++ size_t len; ++ const char *str = luaL_checklstring(L, 1, &len); ++ struct template_parser *parser = template_string(str, len); ++ ++ return template_L_do_parse(L, parser, "[string]"); ++} ++ ++int template_L_utf8(lua_State *L) ++{ ++ size_t len = 0; ++ const char *str = luaL_checklstring(L, 1, &len); ++ char *res = utf8(str, len); ++ ++ if (res != NULL) ++ { ++ lua_pushstring(L, res); ++ free(res); ++ ++ return 1; ++ } ++ ++ return 0; ++} ++ ++int template_L_pcdata(lua_State *L) ++{ ++ size_t len = 0; ++ const char *str = luaL_checklstring(L, 1, &len); ++ char *res = pcdata(str, len); ++ ++ if (res != NULL) ++ { ++ lua_pushstring(L, res); ++ free(res); ++ ++ return 1; ++ } ++ ++ return 0; ++} ++ ++int template_L_striptags(lua_State *L) ++{ ++ size_t len = 0; ++ const char *str = luaL_checklstring(L, 1, &len); ++ char *res = striptags(str, len); ++ ++ if (res != NULL) ++ { ++ lua_pushstring(L, res); ++ free(res); ++ ++ return 1; ++ } ++ ++ return 0; ++} ++ ++static int template_L_load_catalog(lua_State *L) { ++ const char *lang = luaL_optstring(L, 1, "en"); ++ const char *dir = luaL_optstring(L, 2, NULL); ++ lua_pushboolean(L, !lmo_load_catalog(lang, dir)); ++ return 1; ++} ++ ++static int template_L_close_catalog(lua_State *L) { ++ const char *lang = luaL_optstring(L, 1, "en"); ++ lmo_close_catalog(lang); ++ return 0; ++} ++ ++static int template_L_change_catalog(lua_State *L) { ++ const char *lang = luaL_optstring(L, 1, "en"); ++ lua_pushboolean(L, !lmo_change_catalog(lang)); ++ return 1; ++} ++ ++static int template_L_translate(lua_State *L) { ++ size_t len; ++ char *tr; ++ int trlen; ++ const char *key = luaL_checklstring(L, 1, &len); ++ ++ switch (lmo_translate(key, len, &tr, &trlen)) ++ { ++ case 0: ++ lua_pushlstring(L, tr, trlen); ++ return 1; ++ ++ case -1: ++ return 0; ++ } ++ ++ lua_pushnil(L); ++ lua_pushstring(L, "no catalog loaded"); ++ return 2; ++} ++ ++static int template_L_hash(lua_State *L) { ++ size_t len; ++ const char *key = luaL_checklstring(L, 1, &len); ++ lua_pushinteger(L, sfh_hash(key, len)); ++ return 1; ++} ++ ++ ++/* module table */ ++static const luaL_reg R[] = { ++ { "parse", template_L_parse }, ++ { "parse_string", template_L_parse_string }, ++ { "utf8", template_L_utf8 }, ++ { "pcdata", template_L_pcdata }, ++ { "striptags", template_L_striptags }, ++ { "load_catalog", template_L_load_catalog }, ++ { "close_catalog", template_L_close_catalog }, ++ { "change_catalog", template_L_change_catalog }, ++ { "translate", template_L_translate }, ++ { "hash", template_L_hash }, ++ { NULL, NULL } ++}; ++ ++LUALIB_API int luaopen_luci_template_parser(lua_State *L) { ++ luaL_register(L, TEMPLATE_LUALIB_META, R); ++ return 1; ++} +diff --git a/feeds/luci/modules/luci-base/src/template_lualib.h b/feeds/luci/modules/luci-base/src/template_lualib.h +new file mode 100644 +index 0000000..ff7746d +--- /dev/null ++++ b/feeds/luci/modules/luci-base/src/template_lualib.h +@@ -0,0 +1,30 @@ ++/* ++ * LuCI Template - Lua library header ++ * ++ * Copyright (C) 2009 Jo-Philipp Wich ++ * ++ * Licensed under the Apache License, Version 2.0 (the "License"); ++ * you may not use this file except in compliance with the License. ++ * You may obtain a copy of the License at ++ * ++ * http://www.apache.org/licenses/LICENSE-2.0 ++ * ++ * Unless required by applicable law or agreed to in writing, software ++ * distributed under the License is distributed on an "AS IS" BASIS, ++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. ++ * See the License for the specific language governing permissions and ++ * limitations under the License. ++ */ ++ ++#ifndef _TEMPLATE_LUALIB_H_ ++#define _TEMPLATE_LUALIB_H_ ++ ++#include "template_parser.h" ++#include "template_utils.h" ++#include "template_lmo.h" ++ ++#define TEMPLATE_LUALIB_META "template.parser" ++ ++LUALIB_API int luaopen_luci_template_parser(lua_State *L); ++ ++#endif +diff --git a/feeds/luci/modules/luci-base/src/template_parser.c b/feeds/luci/modules/luci-base/src/template_parser.c +new file mode 100644 +index 0000000..0ef08c6 +--- /dev/null ++++ b/feeds/luci/modules/luci-base/src/template_parser.c +@@ -0,0 +1,419 @@ ++/* ++ * LuCI Template - Parser implementation ++ * ++ * Copyright (C) 2009-2012 Jo-Philipp Wich ++ * ++ * Licensed under the Apache License, Version 2.0 (the "License"); ++ * you may not use this file except in compliance with the License. ++ * You may obtain a copy of the License at ++ * ++ * http://www.apache.org/licenses/LICENSE-2.0 ++ * ++ * Unless required by applicable law or agreed to in writing, software ++ * distributed under the License is distributed on an "AS IS" BASIS, ++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. ++ * See the License for the specific language governing permissions and ++ * limitations under the License. ++ */ ++ ++#include "template_parser.h" ++#include "template_utils.h" ++#include "template_lmo.h" ++ ++ ++/* leading and trailing code for different types */ ++const char *gen_code[9][2] = { ++ { NULL, NULL }, ++ { "write(\"", "\")" }, ++ { NULL, NULL }, ++ { "write(tostring(", " or \"\"))" }, ++ { "include(\"", "\")" }, ++ { "write(\"", "\")" }, ++ { "write(\"", "\")" }, ++ { NULL, " " }, ++ { NULL, NULL }, ++}; ++ ++/* Simple strstr() like function that takes len arguments for both haystack and needle. */ ++static char *strfind(char *haystack, int hslen, const char *needle, int ndlen) ++{ ++ int match = 0; ++ int i, j; ++ ++ for( i = 0; i < hslen; i++ ) ++ { ++ if( haystack[i] == needle[0] ) ++ { ++ match = ((ndlen == 1) || ((i + ndlen) <= hslen)); ++ ++ for( j = 1; (j < ndlen) && ((i + j) < hslen); j++ ) ++ { ++ if( haystack[i+j] != needle[j] ) ++ { ++ match = 0; ++ break; ++ } ++ } ++ ++ if( match ) ++ return &haystack[i]; ++ } ++ } ++ ++ return NULL; ++} ++ ++struct template_parser * template_open(const char *file) ++{ ++ struct stat s; ++ struct template_parser *parser; ++ ++ if (!(parser = malloc(sizeof(*parser)))) ++ goto err; ++ ++ memset(parser, 0, sizeof(*parser)); ++ parser->fd = -1; ++ parser->file = file; ++ ++ if (stat(file, &s)) ++ goto err; ++ ++ if ((parser->fd = open(file, O_RDONLY)) < 0) ++ goto err; ++ ++ parser->size = s.st_size; ++ parser->data = mmap(NULL, parser->size, PROT_READ, MAP_PRIVATE, ++ parser->fd, 0); ++ ++ if (parser->data != MAP_FAILED) ++ { ++ parser->off = parser->data; ++ parser->cur_chunk.type = T_TYPE_INIT; ++ parser->cur_chunk.s = parser->data; ++ parser->cur_chunk.e = parser->data; ++ ++ return parser; ++ } ++ ++err: ++ template_close(parser); ++ return NULL; ++} ++ ++struct template_parser * template_string(const char *str, uint32_t len) ++{ ++ struct template_parser *parser; ++ ++ if (!str) { ++ errno = EINVAL; ++ goto err; ++ } ++ ++ if (!(parser = malloc(sizeof(*parser)))) ++ goto err; ++ ++ memset(parser, 0, sizeof(*parser)); ++ parser->fd = -1; ++ ++ parser->size = len; ++ parser->data = (char*)str; ++ ++ parser->off = parser->data; ++ parser->cur_chunk.type = T_TYPE_INIT; ++ parser->cur_chunk.s = parser->data; ++ parser->cur_chunk.e = parser->data; ++ ++ return parser; ++ ++err: ++ template_close(parser); ++ return NULL; ++} ++ ++void template_close(struct template_parser *parser) ++{ ++ if (!parser) ++ return; ++ ++ if (parser->gc != NULL) ++ free(parser->gc); ++ ++ /* if file is not set, we were parsing a string */ ++ if (parser->file) { ++ if ((parser->data != NULL) && (parser->data != MAP_FAILED)) ++ munmap(parser->data, parser->size); ++ ++ if (parser->fd >= 0) ++ close(parser->fd); ++ } ++ ++ free(parser); ++} ++ ++void template_text(struct template_parser *parser, const char *e) ++{ ++ const char *s = parser->off; ++ ++ if (s < (parser->data + parser->size)) ++ { ++ if (parser->strip_after) ++ { ++ while ((s <= e) && isspace(*s)) ++ s++; ++ } ++ ++ parser->cur_chunk.type = T_TYPE_TEXT; ++ } ++ else ++ { ++ parser->cur_chunk.type = T_TYPE_EOF; ++ } ++ ++ parser->cur_chunk.line = parser->line; ++ parser->cur_chunk.s = s; ++ parser->cur_chunk.e = e; ++} ++ ++void template_code(struct template_parser *parser, const char *e) ++{ ++ const char *s = parser->off; ++ ++ parser->strip_before = 0; ++ parser->strip_after = 0; ++ ++ if (*s == '-') ++ { ++ parser->strip_before = 1; ++ for (s++; (s <= e) && (*s == ' ' || *s == '\t'); s++); ++ } ++ ++ if (*(e-1) == '-') ++ { ++ parser->strip_after = 1; ++ for (e--; (e >= s) && (*e == ' ' || *e == '\t'); e--); ++ } ++ ++ switch (*s) ++ { ++ /* comment */ ++ case '#': ++ s++; ++ parser->cur_chunk.type = T_TYPE_COMMENT; ++ break; ++ ++ /* include */ ++ case '+': ++ s++; ++ parser->cur_chunk.type = T_TYPE_INCLUDE; ++ break; ++ ++ /* translate */ ++ case ':': ++ s++; ++ parser->cur_chunk.type = T_TYPE_I18N; ++ break; ++ ++ /* translate raw */ ++ case '_': ++ s++; ++ parser->cur_chunk.type = T_TYPE_I18N_RAW; ++ break; ++ ++ /* expr */ ++ case '=': ++ s++; ++ parser->cur_chunk.type = T_TYPE_EXPR; ++ break; ++ ++ /* code */ ++ default: ++ parser->cur_chunk.type = T_TYPE_CODE; ++ break; ++ } ++ ++ parser->cur_chunk.line = parser->line; ++ parser->cur_chunk.s = s; ++ parser->cur_chunk.e = e; ++} ++ ++static const char * ++template_format_chunk(struct template_parser *parser, size_t *sz) ++{ ++ const char *s, *p; ++ const char *head, *tail; ++ struct template_chunk *c = &parser->prv_chunk; ++ struct template_buffer *buf; ++ ++ *sz = 0; ++ s = parser->gc = NULL; ++ ++ if (parser->strip_before && c->type == T_TYPE_TEXT) ++ { ++ while ((c->e > c->s) && isspace(*(c->e - 1))) ++ c->e--; ++ } ++ ++ /* empty chunk */ ++ if (c->s == c->e) ++ { ++ if (c->type == T_TYPE_EOF) ++ { ++ *sz = 0; ++ s = NULL; ++ } ++ else ++ { ++ *sz = 1; ++ s = " "; ++ } ++ } ++ ++ /* format chunk */ ++ else if ((buf = buf_init(c->e - c->s)) != NULL) ++ { ++ if ((head = gen_code[c->type][0]) != NULL) ++ buf_append(buf, head, strlen(head)); ++ ++ switch (c->type) ++ { ++ case T_TYPE_TEXT: ++ luastr_escape(buf, c->s, c->e - c->s, 0); ++ break; ++ ++ case T_TYPE_EXPR: ++ buf_append(buf, c->s, c->e - c->s); ++ for (p = c->s; p < c->e; p++) ++ parser->line += (*p == '\n'); ++ break; ++ ++ case T_TYPE_INCLUDE: ++ luastr_escape(buf, c->s, c->e - c->s, 0); ++ break; ++ ++ case T_TYPE_I18N: ++ luastr_translate(buf, c->s, c->e - c->s, 1); ++ break; ++ ++ case T_TYPE_I18N_RAW: ++ luastr_translate(buf, c->s, c->e - c->s, 0); ++ break; ++ ++ case T_TYPE_CODE: ++ buf_append(buf, c->s, c->e - c->s); ++ for (p = c->s; p < c->e; p++) ++ parser->line += (*p == '\n'); ++ break; ++ } ++ ++ if ((tail = gen_code[c->type][1]) != NULL) ++ buf_append(buf, tail, strlen(tail)); ++ ++ *sz = buf_length(buf); ++ s = parser->gc = buf_destroy(buf); ++ ++ if (!*sz) ++ { ++ *sz = 1; ++ s = " "; ++ } ++ } ++ ++ return s; ++} ++ ++const char *template_reader(lua_State *L, void *ud, size_t *sz) ++{ ++ struct template_parser *parser = ud; ++ int rem = parser->size - (parser->off - parser->data); ++ char *tag; ++ ++ parser->prv_chunk = parser->cur_chunk; ++ ++ /* free previous string */ ++ if (parser->gc) ++ { ++ free(parser->gc); ++ parser->gc = NULL; ++ } ++ ++ /* before tag */ ++ if (!parser->in_expr) ++ { ++ if ((tag = strfind(parser->off, rem, "<%", 2)) != NULL) ++ { ++ template_text(parser, tag); ++ parser->off = tag + 2; ++ parser->in_expr = 1; ++ } ++ else ++ { ++ template_text(parser, parser->data + parser->size); ++ parser->off = parser->data + parser->size; ++ } ++ } ++ ++ /* inside tag */ ++ else ++ { ++ if ((tag = strfind(parser->off, rem, "%>", 2)) != NULL) ++ { ++ template_code(parser, tag); ++ parser->off = tag + 2; ++ parser->in_expr = 0; ++ } ++ else ++ { ++ /* unexpected EOF */ ++ template_code(parser, parser->data + parser->size); ++ ++ *sz = 1; ++ return "\033"; ++ } ++ } ++ ++ return template_format_chunk(parser, sz); ++} ++ ++int template_error(lua_State *L, struct template_parser *parser) ++{ ++ const char *err = luaL_checkstring(L, -1); ++ const char *off = parser->prv_chunk.s; ++ const char *ptr; ++ char msg[1024]; ++ int line = 0; ++ int chunkline = 0; ++ ++ if ((ptr = strfind((char *)err, strlen(err), "]:", 2)) != NULL) ++ { ++ chunkline = atoi(ptr + 2) - parser->prv_chunk.line; ++ ++ while (*ptr) ++ { ++ if (*ptr++ == ' ') ++ { ++ err = ptr; ++ break; ++ } ++ } ++ } ++ ++ if (strfind((char *)err, strlen(err), "'char(27)'", 10) != NULL) ++ { ++ off = parser->data + parser->size; ++ err = "'%>' expected before end of file"; ++ chunkline = 0; ++ } ++ ++ for (ptr = parser->data; ptr < off; ptr++) ++ if (*ptr == '\n') ++ line++; ++ ++ snprintf(msg, sizeof(msg), "Syntax error in %s:%d: %s", ++ parser->file ? parser->file : "[string]", line + chunkline, err ? err : "(unknown error)"); ++ ++ lua_pushnil(L); ++ lua_pushinteger(L, line + chunkline); ++ lua_pushstring(L, msg); ++ ++ return 3; ++} +diff --git a/feeds/luci/modules/luci-base/src/template_parser.h b/feeds/luci/modules/luci-base/src/template_parser.h +new file mode 100644 +index 0000000..2415e87 +--- /dev/null ++++ b/feeds/luci/modules/luci-base/src/template_parser.h +@@ -0,0 +1,80 @@ ++/* ++ * LuCI Template - Parser header ++ * ++ * Copyright (C) 2009 Jo-Philipp Wich ++ * ++ * Licensed under the Apache License, Version 2.0 (the "License"); ++ * you may not use this file except in compliance with the License. ++ * You may obtain a copy of the License at ++ * ++ * http://www.apache.org/licenses/LICENSE-2.0 ++ * ++ * Unless required by applicable law or agreed to in writing, software ++ * distributed under the License is distributed on an "AS IS" BASIS, ++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. ++ * See the License for the specific language governing permissions and ++ * limitations under the License. ++ */ ++ ++#ifndef _TEMPLATE_PARSER_H_ ++#define _TEMPLATE_PARSER_H_ ++ ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++ ++#include ++#include ++#include ++ ++ ++/* code types */ ++#define T_TYPE_INIT 0 ++#define T_TYPE_TEXT 1 ++#define T_TYPE_COMMENT 2 ++#define T_TYPE_EXPR 3 ++#define T_TYPE_INCLUDE 4 ++#define T_TYPE_I18N 5 ++#define T_TYPE_I18N_RAW 6 ++#define T_TYPE_CODE 7 ++#define T_TYPE_EOF 8 ++ ++ ++struct template_chunk { ++ const char *s; ++ const char *e; ++ int type; ++ int line; ++}; ++ ++/* parser state */ ++struct template_parser { ++ int fd; ++ uint32_t size; ++ char *data; ++ char *off; ++ char *gc; ++ int line; ++ int in_expr; ++ int strip_before; ++ int strip_after; ++ struct template_chunk prv_chunk; ++ struct template_chunk cur_chunk; ++ const char *file; ++}; ++ ++struct template_parser * template_open(const char *file); ++struct template_parser * template_string(const char *str, uint32_t len); ++void template_close(struct template_parser *parser); ++ ++const char *template_reader(lua_State *L, void *ud, size_t *sz); ++int template_error(lua_State *L, struct template_parser *parser); ++ ++#endif +diff --git a/feeds/luci/modules/luci-base/src/template_utils.c b/feeds/luci/modules/luci-base/src/template_utils.c +new file mode 100644 +index 0000000..3979487 +--- /dev/null ++++ b/feeds/luci/modules/luci-base/src/template_utils.c +@@ -0,0 +1,484 @@ ++/* ++ * LuCI Template - Utility functions ++ * ++ * Copyright (C) 2010 Jo-Philipp Wich ++ * ++ * Licensed under the Apache License, Version 2.0 (the "License"); ++ * you may not use this file except in compliance with the License. ++ * You may obtain a copy of the License at ++ * ++ * http://www.apache.org/licenses/LICENSE-2.0 ++ * ++ * Unless required by applicable law or agreed to in writing, software ++ * distributed under the License is distributed on an "AS IS" BASIS, ++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. ++ * See the License for the specific language governing permissions and ++ * limitations under the License. ++ */ ++ ++#include "template_utils.h" ++#include "template_lmo.h" ++ ++/* initialize a buffer object */ ++struct template_buffer * buf_init(int size) ++{ ++ struct template_buffer *buf; ++ ++ if (size <= 0) ++ size = 1024; ++ ++ buf = (struct template_buffer *)malloc(sizeof(struct template_buffer)); ++ ++ if (buf != NULL) ++ { ++ buf->fill = 0; ++ buf->size = size; ++ buf->data = malloc(buf->size); ++ ++ if (buf->data != NULL) ++ { ++ buf->dptr = buf->data; ++ buf->data[0] = 0; ++ ++ return buf; ++ } ++ ++ free(buf); ++ } ++ ++ return NULL; ++} ++ ++/* grow buffer */ ++int buf_grow(struct template_buffer *buf, int size) ++{ ++ unsigned int off = (buf->dptr - buf->data); ++ char *data; ++ ++ if (size <= 0) ++ size = 1024; ++ ++ data = realloc(buf->data, buf->size + size); ++ ++ if (data != NULL) ++ { ++ buf->data = data; ++ buf->dptr = data + off; ++ buf->size += size; ++ ++ return buf->size; ++ } ++ ++ return 0; ++} ++ ++/* put one char into buffer object */ ++int buf_putchar(struct template_buffer *buf, char c) ++{ ++ if( ((buf->fill + 1) >= buf->size) && !buf_grow(buf, 0) ) ++ return 0; ++ ++ *(buf->dptr++) = c; ++ *(buf->dptr) = 0; ++ ++ buf->fill++; ++ return 1; ++} ++ ++/* append data to buffer */ ++int buf_append(struct template_buffer *buf, const char *s, int len) ++{ ++ if ((buf->fill + len + 1) >= buf->size) ++ { ++ if (!buf_grow(buf, len + 1)) ++ return 0; ++ } ++ ++ memcpy(buf->dptr, s, len); ++ buf->fill += len; ++ buf->dptr += len; ++ ++ *(buf->dptr) = 0; ++ ++ return len; ++} ++ ++/* read buffer length */ ++int buf_length(struct template_buffer *buf) ++{ ++ return buf->fill; ++} ++ ++/* destroy buffer object and return pointer to data */ ++char * buf_destroy(struct template_buffer *buf) ++{ ++ char *data = buf->data; ++ ++ free(buf); ++ return data; ++} ++ ++ ++/* calculate the number of expected continuation chars */ ++static inline int mb_num_chars(unsigned char c) ++{ ++ if ((c & 0xE0) == 0xC0) ++ return 2; ++ else if ((c & 0xF0) == 0xE0) ++ return 3; ++ else if ((c & 0xF8) == 0xF0) ++ return 4; ++ else if ((c & 0xFC) == 0xF8) ++ return 5; ++ else if ((c & 0xFE) == 0xFC) ++ return 6; ++ ++ return 1; ++} ++ ++/* test whether the given byte is a valid continuation char */ ++static inline int mb_is_cont(unsigned char c) ++{ ++ return ((c >= 0x80) && (c <= 0xBF)); ++} ++ ++/* test whether the byte sequence at the given pointer with the given ++ * length is the shortest possible representation of the code point */ ++static inline int mb_is_shortest(unsigned char *s, int n) ++{ ++ switch (n) ++ { ++ case 2: ++ /* 1100000x (10xxxxxx) */ ++ return !(((*s >> 1) == 0x60) && ++ ((*(s+1) >> 6) == 0x02)); ++ ++ case 3: ++ /* 11100000 100xxxxx (10xxxxxx) */ ++ return !((*s == 0xE0) && ++ ((*(s+1) >> 5) == 0x04) && ++ ((*(s+2) >> 6) == 0x02)); ++ ++ case 4: ++ /* 11110000 1000xxxx (10xxxxxx 10xxxxxx) */ ++ return !((*s == 0xF0) && ++ ((*(s+1) >> 4) == 0x08) && ++ ((*(s+2) >> 6) == 0x02) && ++ ((*(s+3) >> 6) == 0x02)); ++ ++ case 5: ++ /* 11111000 10000xxx (10xxxxxx 10xxxxxx 10xxxxxx) */ ++ return !((*s == 0xF8) && ++ ((*(s+1) >> 3) == 0x10) && ++ ((*(s+2) >> 6) == 0x02) && ++ ((*(s+3) >> 6) == 0x02) && ++ ((*(s+4) >> 6) == 0x02)); ++ ++ case 6: ++ /* 11111100 100000xx (10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx) */ ++ return !((*s == 0xF8) && ++ ((*(s+1) >> 2) == 0x20) && ++ ((*(s+2) >> 6) == 0x02) && ++ ((*(s+3) >> 6) == 0x02) && ++ ((*(s+4) >> 6) == 0x02) && ++ ((*(s+5) >> 6) == 0x02)); ++ } ++ ++ return 1; ++} ++ ++/* test whether the byte sequence at the given pointer with the given ++ * length is an UTF-16 surrogate */ ++static inline int mb_is_surrogate(unsigned char *s, int n) ++{ ++ return ((n == 3) && (*s == 0xED) && (*(s+1) >= 0xA0) && (*(s+1) <= 0xBF)); ++} ++ ++/* test whether the byte sequence at the given pointer with the given ++ * length is an illegal UTF-8 code point */ ++static inline int mb_is_illegal(unsigned char *s, int n) ++{ ++ return ((n == 3) && (*s == 0xEF) && (*(s+1) == 0xBF) && ++ (*(s+2) >= 0xBE) && (*(s+2) <= 0xBF)); ++} ++ ++ ++/* scan given source string, validate UTF-8 sequence and store result ++ * in given buffer object */ ++static int _validate_utf8(unsigned char **s, int l, struct template_buffer *buf) ++{ ++ unsigned char *ptr = *s; ++ unsigned int o = 0, v, n; ++ ++ /* ascii byte without null */ ++ if ((*(ptr+0) >= 0x01) && (*(ptr+0) <= 0x7F)) ++ { ++ if (!buf_putchar(buf, *ptr++)) ++ return 0; ++ ++ o = 1; ++ } ++ ++ /* multi byte sequence */ ++ else if ((n = mb_num_chars(*ptr)) > 1) ++ { ++ /* count valid chars */ ++ for (v = 1; (v <= n) && ((o+v) < l) && mb_is_cont(*(ptr+v)); v++); ++ ++ switch (n) ++ { ++ case 6: ++ case 5: ++ /* five and six byte sequences are always invalid */ ++ if (!buf_putchar(buf, '?')) ++ return 0; ++ ++ break; ++ ++ default: ++ /* if the number of valid continuation bytes matches the ++ * expected number and if the sequence is legal, copy ++ * the bytes to the destination buffer */ ++ if ((v == n) && mb_is_shortest(ptr, n) && ++ !mb_is_surrogate(ptr, n) && !mb_is_illegal(ptr, n)) ++ { ++ /* copy sequence */ ++ if (!buf_append(buf, (char *)ptr, n)) ++ return 0; ++ } ++ ++ /* the found sequence is illegal, skip it */ ++ else ++ { ++ /* invalid sequence */ ++ if (!buf_putchar(buf, '?')) ++ return 0; ++ } ++ ++ break; ++ } ++ ++ /* advance beyound the last found valid continuation char */ ++ o = v; ++ ptr += v; ++ } ++ ++ /* invalid byte (0x00) */ ++ else ++ { ++ if (!buf_putchar(buf, '?')) /* or 0xEF, 0xBF, 0xBD */ ++ return 0; ++ ++ o = 1; ++ ptr++; ++ } ++ ++ *s = ptr; ++ return o; ++} ++ ++/* sanitize given string and replace all invalid UTF-8 sequences with "?" */ ++char * utf8(const char *s, unsigned int l) ++{ ++ struct template_buffer *buf = buf_init(l); ++ unsigned char *ptr = (unsigned char *)s; ++ unsigned int v, o; ++ ++ if (!buf) ++ return NULL; ++ ++ for (o = 0; o < l; o++) ++ { ++ /* ascii char */ ++ if ((*ptr >= 0x01) && (*ptr <= 0x7F)) ++ { ++ if (!buf_putchar(buf, (char)*ptr++)) ++ break; ++ } ++ ++ /* invalid byte or multi byte sequence */ ++ else ++ { ++ if (!(v = _validate_utf8(&ptr, l - o, buf))) ++ break; ++ ++ o += (v - 1); ++ } ++ } ++ ++ return buf_destroy(buf); ++} ++ ++/* Sanitize given string and strip all invalid XML bytes ++ * Validate UTF-8 sequences ++ * Escape XML control chars */ ++char * pcdata(const char *s, unsigned int l) ++{ ++ struct template_buffer *buf = buf_init(l); ++ unsigned char *ptr = (unsigned char *)s; ++ unsigned int o, v; ++ char esq[8]; ++ int esl; ++ ++ if (!buf) ++ return NULL; ++ ++ for (o = 0; o < l; o++) ++ { ++ /* Invalid XML bytes */ ++ if (((*ptr >= 0x00) && (*ptr <= 0x08)) || ++ ((*ptr >= 0x0B) && (*ptr <= 0x0C)) || ++ ((*ptr >= 0x0E) && (*ptr <= 0x1F)) || ++ (*ptr == 0x7F)) ++ { ++ ptr++; ++ } ++ ++ /* Escapes */ ++ else if ((*ptr == 0x26) || ++ (*ptr == 0x27) || ++ (*ptr == 0x22) || ++ (*ptr == 0x3C) || ++ (*ptr == 0x3E)) ++ { ++ esl = snprintf(esq, sizeof(esq), "&#%i;", *ptr); ++ ++ if (!buf_append(buf, esq, esl)) ++ break; ++ ++ ptr++; ++ } ++ ++ /* ascii char */ ++ else if (*ptr <= 0x7F) ++ { ++ buf_putchar(buf, (char)*ptr++); ++ } ++ ++ /* multi byte sequence */ ++ else ++ { ++ if (!(v = _validate_utf8(&ptr, l - o, buf))) ++ break; ++ ++ o += (v - 1); ++ } ++ } ++ ++ return buf_destroy(buf); ++} ++ ++char * striptags(const char *s, unsigned int l) ++{ ++ struct template_buffer *buf = buf_init(l); ++ unsigned char *ptr = (unsigned char *)s; ++ unsigned char *end = ptr + l; ++ unsigned char *tag; ++ unsigned char prev; ++ char esq[8]; ++ int esl; ++ ++ for (prev = ' '; ptr < end; ptr++) ++ { ++ if ((*ptr == '<') && ((ptr + 2) < end) && ++ ((*(ptr + 1) == '/') || isalpha(*(ptr + 1)))) ++ { ++ for (tag = ptr; tag < end; tag++) ++ { ++ if (*tag == '>') ++ { ++ if (!isspace(prev)) ++ buf_putchar(buf, ' '); ++ ++ ptr = tag; ++ prev = ' '; ++ break; ++ } ++ } ++ } ++ else if (isspace(*ptr)) ++ { ++ if (!isspace(prev)) ++ buf_putchar(buf, *ptr); ++ ++ prev = *ptr; ++ } ++ else ++ { ++ switch(*ptr) ++ { ++ case '"': ++ case '\'': ++ case '<': ++ case '>': ++ case '&': ++ esl = snprintf(esq, sizeof(esq), "&#%i;", *ptr); ++ buf_append(buf, esq, esl); ++ break; ++ ++ default: ++ buf_putchar(buf, *ptr); ++ break; ++ } ++ ++ prev = *ptr; ++ } ++ } ++ ++ return buf_destroy(buf); ++} ++ ++void luastr_escape(struct template_buffer *out, const char *s, unsigned int l, ++ int escape_xml) ++{ ++ int esl; ++ char esq[8]; ++ char *ptr; ++ ++ for (ptr = (char *)s; ptr < (s + l); ptr++) ++ { ++ switch (*ptr) ++ { ++ case '\\': ++ buf_append(out, "\\\\", 2); ++ break; ++ ++ case '"': ++ if (escape_xml) ++ buf_append(out, """, 5); ++ else ++ buf_append(out, "\\\"", 2); ++ break; ++ ++ case '\n': ++ buf_append(out, "\\n", 2); ++ break; ++ ++ case '\'': ++ case '&': ++ case '<': ++ case '>': ++ if (escape_xml) ++ { ++ esl = snprintf(esq, sizeof(esq), "&#%i;", *ptr); ++ buf_append(out, esq, esl); ++ break; ++ } ++ ++ default: ++ buf_putchar(out, *ptr); ++ } ++ } ++} ++ ++void luastr_translate(struct template_buffer *out, const char *s, unsigned int l, ++ int escape_xml) ++{ ++ char *tr; ++ int trlen; ++ ++ if (!lmo_translate(s, l, &tr, &trlen)) ++ luastr_escape(out, tr, trlen, escape_xml); ++ else ++ luastr_escape(out, s, l, escape_xml); ++} +diff --git a/feeds/luci/modules/luci-base/src/template_utils.h b/feeds/luci/modules/luci-base/src/template_utils.h +new file mode 100644 +index 0000000..32a79f9 +--- /dev/null ++++ b/feeds/luci/modules/luci-base/src/template_utils.h +@@ -0,0 +1,49 @@ ++/* ++ * LuCI Template - Utility header ++ * ++ * Copyright (C) 2010-2012 Jo-Philipp Wich ++ * ++ * Licensed under the Apache License, Version 2.0 (the "License"); ++ * you may not use this file except in compliance with the License. ++ * You may obtain a copy of the License at ++ * ++ * http://www.apache.org/licenses/LICENSE-2.0 ++ * ++ * Unless required by applicable law or agreed to in writing, software ++ * distributed under the License is distributed on an "AS IS" BASIS, ++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. ++ * See the License for the specific language governing permissions and ++ * limitations under the License. ++ */ ++ ++#ifndef _TEMPLATE_UTILS_H_ ++#define _TEMPLATE_UTILS_H_ ++ ++#include ++#include ++#include ++ ++ ++/* buffer object */ ++struct template_buffer { ++ char *data; ++ char *dptr; ++ unsigned int size; ++ unsigned int fill; ++}; ++ ++struct template_buffer * buf_init(int size); ++int buf_grow(struct template_buffer *buf, int size); ++int buf_putchar(struct template_buffer *buf, char c); ++int buf_append(struct template_buffer *buf, const char *s, int len); ++int buf_length(struct template_buffer *buf); ++char * buf_destroy(struct template_buffer *buf); ++ ++char * utf8(const char *s, unsigned int l); ++char * pcdata(const char *s, unsigned int l); ++char * striptags(const char *s, unsigned int l); ++ ++void luastr_escape(struct template_buffer *out, const char *s, unsigned int l, int escape_xml); ++void luastr_translate(struct template_buffer *out, const char *s, unsigned int l, int escape_xml); ++ ++#endif +diff --git a/feeds/luci/modules/luci-mod-admin-full/Makefile b/feeds/luci/modules/luci-mod-admin-full/Makefile +new file mode 100644 +index 0000000..66c78e2 +--- /dev/null ++++ b/feeds/luci/modules/luci-mod-admin-full/Makefile +@@ -0,0 +1,17 @@ ++# ++# Copyright (C) 2008-2014 The LuCI Team ++# ++# This is free software, licensed under the Apache License, Version 2.0 . ++# ++ ++include $(TOPDIR)/rules.mk ++ ++LUCI_TITLE:=LuCI Administration - full-featured for full control ++LUCI_DEPENDS:=+luci-base +libubus-lua ++ ++PKG_BUILD_DEPENDS:=iwinfo ++ ++include ../../luci.mk ++ ++# call BuildPackage - OpenWrt buildroot signature ++ +diff --git a/feeds/luci/modules/luci-mod-admin-full/htdocs/luci-static/resources/bandwidth.svg b/feeds/luci/modules/luci-mod-admin-full/htdocs/luci-static/resources/bandwidth.svg +new file mode 100644 +index 0000000..4f91488 +--- /dev/null ++++ b/feeds/luci/modules/luci-mod-admin-full/htdocs/luci-static/resources/bandwidth.svg +@@ -0,0 +1,16 @@ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ +diff --git a/feeds/luci/modules/luci-mod-admin-full/htdocs/luci-static/resources/connections.svg b/feeds/luci/modules/luci-mod-admin-full/htdocs/luci-static/resources/connections.svg +new file mode 100644 +index 0000000..816f7e6 +--- /dev/null ++++ b/feeds/luci/modules/luci-mod-admin-full/htdocs/luci-static/resources/connections.svg +@@ -0,0 +1,17 @@ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ +diff --git a/feeds/luci/modules/luci-mod-admin-full/htdocs/luci-static/resources/load.svg b/feeds/luci/modules/luci-mod-admin-full/htdocs/luci-static/resources/load.svg +new file mode 100644 +index 0000000..d681702 +--- /dev/null ++++ b/feeds/luci/modules/luci-mod-admin-full/htdocs/luci-static/resources/load.svg +@@ -0,0 +1,17 @@ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ +diff --git a/feeds/luci/modules/luci-mod-admin-full/htdocs/luci-static/resources/wifirate.svg b/feeds/luci/modules/luci-mod-admin-full/htdocs/luci-static/resources/wifirate.svg +new file mode 100644 +index 0000000..d3e848b +--- /dev/null ++++ b/feeds/luci/modules/luci-mod-admin-full/htdocs/luci-static/resources/wifirate.svg +@@ -0,0 +1,15 @@ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ +diff --git a/feeds/luci/modules/luci-mod-admin-full/htdocs/luci-static/resources/wireless.svg b/feeds/luci/modules/luci-mod-admin-full/htdocs/luci-static/resources/wireless.svg +new file mode 100644 +index 0000000..99d9840 +--- /dev/null ++++ b/feeds/luci/modules/luci-mod-admin-full/htdocs/luci-static/resources/wireless.svg +@@ -0,0 +1,16 @@ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ +diff --git a/feeds/luci/modules/luci-mod-admin-full/luasrc/controller/admin/filebrowser.lua b/feeds/luci/modules/luci-mod-admin-full/luasrc/controller/admin/filebrowser.lua +new file mode 100644 +index 0000000..2572615 +--- /dev/null ++++ b/feeds/luci/modules/luci-mod-admin-full/luasrc/controller/admin/filebrowser.lua +@@ -0,0 +1,9 @@ ++-- Copyright 2008 Steven Barth ++-- Copyright 2008 Jo-Philipp Wich ++-- Licensed to the public under the Apache License 2.0. ++ ++module("luci.controller.admin.filebrowser", package.seeall) ++ ++function index() ++ entry( {"admin", "filebrowser"}, template("cbi/filebrowser") ).leaf = true ++end +diff --git a/feeds/luci/modules/luci-mod-admin-full/luasrc/controller/admin/index.lua b/feeds/luci/modules/luci-mod-admin-full/luasrc/controller/admin/index.lua +new file mode 100644 +index 0000000..d00d546 +--- /dev/null ++++ b/feeds/luci/modules/luci-mod-admin-full/luasrc/controller/admin/index.lua +@@ -0,0 +1,44 @@ ++-- Copyright 2008 Steven Barth ++-- Licensed to the public under the Apache License 2.0. ++ ++module("luci.controller.admin.index", package.seeall) ++ ++function index() ++ local root = node() ++ if not root.target then ++ root.target = alias("admin") ++ root.index = true ++ end ++ ++ local page = node("admin") ++ page.target = firstchild() ++ page.title = _("Administration") ++ page.order = 10 ++ page.sysauth = "root" ++ page.sysauth_authenticator = "htmlauth" ++ page.ucidata = true ++ page.index = true ++ ++ -- Empty services menu to be populated by addons ++ entry({"admin", "services"}, firstchild(), _("Services"), 40).index = true ++ ++ entry({"admin", "logout"}, call("action_logout"), _("Logout"), 90) ++end ++ ++function action_logout() ++ local dsp = require "luci.dispatcher" ++ local utl = require "luci.util" ++ local sid = dsp.context.authsession ++ ++ if sid then ++ utl.ubus("session", "destroy", { ubus_rpc_session = sid }) ++ ++ dsp.context.urltoken.stok = nil ++ ++ luci.http.header("Set-Cookie", "sysauth=%s; expires=%s; path=%s/" %{ ++ sid, 'Thu, 01 Jan 1970 01:00:00 GMT', dsp.build_url() ++ }) ++ end ++ ++ luci.http.redirect(luci.dispatcher.build_url()) ++end +diff --git a/feeds/luci/modules/luci-mod-admin-full/luasrc/controller/admin/network.lua b/feeds/luci/modules/luci-mod-admin-full/luasrc/controller/admin/network.lua +new file mode 100644 +index 0000000..6e578e0 +--- /dev/null ++++ b/feeds/luci/modules/luci-mod-admin-full/luasrc/controller/admin/network.lua +@@ -0,0 +1,455 @@ ++-- Copyright 2008 Steven Barth ++-- Copyright 2011 Jo-Philipp Wich ++-- Licensed to the public under the Apache License 2.0. ++ ++module("luci.controller.admin.network", package.seeall) ++ ++function index() ++ local uci = require("luci.model.uci").cursor() ++ local page ++ ++ page = node("admin", "network") ++ page.target = firstchild() ++ page.title = _("Network") ++ page.order = 50 ++ page.index = true ++ ++-- if page.inreq then ++ local has_switch = false ++ ++ uci:foreach("network", "switch", ++ function(s) ++ has_switch = true ++ return false ++ end) ++ ++ if has_switch then ++ page = node("admin", "network", "vlan") ++ page.target = cbi("admin_network/vlan") ++ page.title = _("Switch") ++ page.order = 20 ++ ++ page = entry({"admin", "network", "switch_status"}, call("switch_status"), nil) ++ page.leaf = true ++ end ++ ++ ++ local has_wifi = false ++ ++ uci:foreach("wireless", "wifi-device", ++ function(s) ++ has_wifi = true ++ return false ++ end) ++ ++ if has_wifi then ++ page = entry({"admin", "network", "wireless_join"}, call("wifi_join"), nil) ++ page.leaf = true ++ ++ page = entry({"admin", "network", "wireless_add"}, call("wifi_add"), nil) ++ page.leaf = true ++ ++ page = entry({"admin", "network", "wireless_delete"}, call("wifi_delete"), nil) ++ page.leaf = true ++ ++ page = entry({"admin", "network", "wireless_status"}, call("wifi_status"), nil) ++ page.leaf = true ++ ++ page = entry({"admin", "network", "wireless_reconnect"}, call("wifi_reconnect"), nil) ++ page.leaf = true ++ ++ page = entry({"admin", "network", "wireless_shutdown"}, call("wifi_shutdown"), nil) ++ page.leaf = true ++ ++ page = entry({"admin", "network", "wireless"}, arcombine(template("admin_network/wifi_overview"), cbi("admin_network/wifi")), _("Wifi"), 15) ++ page.leaf = true ++ page.subindex = true ++ ++ if page.inreq then ++ local wdev ++ local net = require "luci.model.network".init(uci) ++ for _, wdev in ipairs(net:get_wifidevs()) do ++ local wnet ++ for _, wnet in ipairs(wdev:get_wifinets()) do ++ entry( ++ {"admin", "network", "wireless", wnet:id()}, ++ alias("admin", "network", "wireless"), ++ wdev:name() .. ": " .. wnet:shortname() ++ ) ++ end ++ end ++ end ++ end ++ ++ ++ page = entry({"admin", "network", "iface_add"}, cbi("admin_network/iface_add"), nil) ++ page.leaf = true ++ ++ page = entry({"admin", "network", "iface_delete"}, call("iface_delete"), nil) ++ page.leaf = true ++ ++ page = entry({"admin", "network", "iface_status"}, call("iface_status"), nil) ++ page.leaf = true ++ ++ page = entry({"admin", "network", "iface_reconnect"}, call("iface_reconnect"), nil) ++ page.leaf = true ++ ++ page = entry({"admin", "network", "iface_shutdown"}, call("iface_shutdown"), nil) ++ page.leaf = true ++ ++ page = entry({"admin", "network", "network"}, arcombine(cbi("admin_network/network"), cbi("admin_network/ifaces")), _("Interfaces"), 10) ++ page.leaf = true ++ page.subindex = true ++ ++ if page.inreq then ++ uci:foreach("network", "interface", ++ function (section) ++ local ifc = section[".name"] ++ if ifc ~= "loopback" then ++ entry({"admin", "network", "network", ifc}, ++ true, ifc:upper()) ++ end ++ end) ++ end ++ ++ ++ if nixio.fs.access("/etc/config/dhcp") then ++ page = node("admin", "network", "dhcp") ++ page.target = cbi("admin_network/dhcp") ++ page.title = _("DHCP and DNS") ++ page.order = 30 ++ ++ page = entry({"admin", "network", "dhcplease_status"}, call("lease_status"), nil) ++ page.leaf = true ++ ++ page = node("admin", "network", "hosts") ++ page.target = cbi("admin_network/hosts") ++ page.title = _("Hostnames") ++ page.order = 40 ++ end ++ ++ page = node("admin", "network", "routes") ++ page.target = cbi("admin_network/routes") ++ page.title = _("Static Routes") ++ page.order = 50 ++ ++ page = node("admin", "network", "diagnostics") ++ page.target = template("admin_network/diagnostics") ++ page.title = _("Diagnostics") ++ page.order = 60 ++ ++ page = entry({"admin", "network", "diag_ping"}, call("diag_ping"), nil) ++ page.leaf = true ++ ++ page = entry({"admin", "network", "diag_nslookup"}, call("diag_nslookup"), nil) ++ page.leaf = true ++ ++ page = entry({"admin", "network", "diag_traceroute"}, call("diag_traceroute"), nil) ++ page.leaf = true ++ ++ page = entry({"admin", "network", "diag_ping6"}, call("diag_ping6"), nil) ++ page.leaf = true ++ ++ page = entry({"admin", "network", "diag_traceroute6"}, call("diag_traceroute6"), nil) ++ page.leaf = true ++-- end ++end ++ ++function wifi_join() ++ local function param(x) ++ return luci.http.formvalue(x) ++ end ++ ++ local function ptable(x) ++ x = param(x) ++ return x and (type(x) ~= "table" and { x } or x) or {} ++ end ++ ++ local dev = param("device") ++ local ssid = param("join") ++ ++ if dev and ssid then ++ local cancel = (param("cancel") or param("cbi.cancel")) and true or false ++ ++ if cancel then ++ luci.http.redirect(luci.dispatcher.build_url("admin/network/wireless_join?device=" .. dev)) ++ else ++ local cbi = require "luci.cbi" ++ local tpl = require "luci.template" ++ local map = luci.cbi.load("admin_network/wifi_add")[1] ++ ++ if map:parse() ~= cbi.FORM_DONE then ++ tpl.render("header") ++ map:render() ++ tpl.render("footer") ++ end ++ end ++ else ++ luci.template.render("admin_network/wifi_join") ++ end ++end ++ ++function wifi_add() ++ local dev = luci.http.formvalue("device") ++ local ntm = require "luci.model.network".init() ++ ++ dev = dev and ntm:get_wifidev(dev) ++ ++ if dev then ++ local net = dev:add_wifinet({ ++ mode = "ap", ++ ssid = "OpenWrt", ++ encryption = "none" ++ }) ++ ++ ntm:save("wireless") ++ luci.http.redirect(net:adminlink()) ++ end ++end ++ ++function wifi_delete(network) ++ local ntm = require "luci.model.network".init() ++ local wnet = ntm:get_wifinet(network) ++ if wnet then ++ local dev = wnet:get_device() ++ local nets = wnet:get_networks() ++ if dev then ++ ntm:del_wifinet(network) ++ ntm:commit("wireless") ++ local _, net ++ for _, net in ipairs(nets) do ++ if net:is_empty() then ++ ntm:del_network(net:name()) ++ ntm:commit("network") ++ end ++ end ++ luci.sys.call("env -i /bin/ubus call network reload >/dev/null 2>/dev/null") ++ end ++ end ++ ++ luci.http.redirect(luci.dispatcher.build_url("admin/network/wireless")) ++end ++ ++function iface_status(ifaces) ++ local netm = require "luci.model.network".init() ++ local rv = { } ++ ++ local iface ++ for iface in ifaces:gmatch("[%w%.%-_]+") do ++ local net = netm:get_network(iface) ++ local device = net and net:get_interface() ++ if device then ++ local data = { ++ id = iface, ++ proto = net:proto(), ++ uptime = net:uptime(), ++ gwaddr = net:gwaddr(), ++ dnsaddrs = net:dnsaddrs(), ++ name = device:shortname(), ++ type = device:type(), ++ ifname = device:name(), ++ macaddr = device:mac(), ++ is_up = device:is_up(), ++ rx_bytes = device:rx_bytes(), ++ tx_bytes = device:tx_bytes(), ++ rx_packets = device:rx_packets(), ++ tx_packets = device:tx_packets(), ++ ++ ipaddrs = { }, ++ ip6addrs = { }, ++ subdevices = { } ++ } ++ ++ local _, a ++ for _, a in ipairs(device:ipaddrs()) do ++ data.ipaddrs[#data.ipaddrs+1] = { ++ addr = a:host():string(), ++ netmask = a:mask():string(), ++ prefix = a:prefix() ++ } ++ end ++ for _, a in ipairs(device:ip6addrs()) do ++ if not a:is6linklocal() then ++ data.ip6addrs[#data.ip6addrs+1] = { ++ addr = a:host():string(), ++ netmask = a:mask():string(), ++ prefix = a:prefix() ++ } ++ end ++ end ++ ++ for _, device in ipairs(net:get_interfaces() or {}) do ++ data.subdevices[#data.subdevices+1] = { ++ name = device:shortname(), ++ type = device:type(), ++ ifname = device:name(), ++ macaddr = device:mac(), ++ macaddr = device:mac(), ++ is_up = device:is_up(), ++ rx_bytes = device:rx_bytes(), ++ tx_bytes = device:tx_bytes(), ++ rx_packets = device:rx_packets(), ++ tx_packets = device:tx_packets(), ++ } ++ end ++ ++ rv[#rv+1] = data ++ else ++ rv[#rv+1] = { ++ id = iface, ++ name = iface, ++ type = "ethernet" ++ } ++ end ++ end ++ ++ if #rv > 0 then ++ luci.http.prepare_content("application/json") ++ luci.http.write_json(rv) ++ return ++ end ++ ++ luci.http.status(404, "No such device") ++end ++ ++function iface_reconnect(iface) ++ local netmd = require "luci.model.network".init() ++ local net = netmd:get_network(iface) ++ if net then ++ luci.sys.call("env -i /sbin/ifup %q >/dev/null 2>/dev/null" % iface) ++ luci.http.status(200, "Reconnected") ++ return ++ end ++ ++ luci.http.status(404, "No such interface") ++end ++ ++function iface_shutdown(iface) ++ local netmd = require "luci.model.network".init() ++ local net = netmd:get_network(iface) ++ if net then ++ luci.sys.call("env -i /sbin/ifdown %q >/dev/null 2>/dev/null" % iface) ++ luci.http.status(200, "Shutdown") ++ return ++ end ++ ++ luci.http.status(404, "No such interface") ++end ++ ++function iface_delete(iface) ++ local netmd = require "luci.model.network".init() ++ local net = netmd:del_network(iface) ++ if net then ++ luci.sys.call("env -i /sbin/ifdown %q >/dev/null 2>/dev/null" % iface) ++ luci.http.redirect(luci.dispatcher.build_url("admin/network/network")) ++ netmd:commit("network") ++ netmd:commit("wireless") ++ return ++ end ++ ++ luci.http.status(404, "No such interface") ++end ++ ++function wifi_status(devs) ++ local s = require "luci.tools.status" ++ local rv = { } ++ ++ local dev ++ for dev in devs:gmatch("[%w%.%-]+") do ++ rv[#rv+1] = s.wifi_network(dev) ++ end ++ ++ if #rv > 0 then ++ luci.http.prepare_content("application/json") ++ luci.http.write_json(rv) ++ return ++ end ++ ++ luci.http.status(404, "No such device") ++end ++ ++local function wifi_reconnect_shutdown(shutdown, wnet) ++ local netmd = require "luci.model.network".init() ++ local net = netmd:get_wifinet(wnet) ++ local dev = net:get_device() ++ if dev and net then ++ dev:set("disabled", nil) ++ net:set("disabled", shutdown and 1 or nil) ++ netmd:commit("wireless") ++ ++ luci.sys.call("env -i /bin/ubus call network reload >/dev/null 2>/dev/null") ++ luci.http.status(200, shutdown and "Shutdown" or "Reconnected") ++ ++ return ++ end ++ ++ luci.http.status(404, "No such radio") ++end ++ ++function wifi_reconnect(wnet) ++ wifi_reconnect_shutdown(false, wnet) ++end ++ ++function wifi_shutdown(wnet) ++ wifi_reconnect_shutdown(true, wnet) ++end ++ ++function lease_status() ++ local s = require "luci.tools.status" ++ ++ luci.http.prepare_content("application/json") ++ luci.http.write('[') ++ luci.http.write_json(s.dhcp_leases()) ++ luci.http.write(',') ++ luci.http.write_json(s.dhcp6_leases()) ++ luci.http.write(']') ++end ++ ++function switch_status(switches) ++ local s = require "luci.tools.status" ++ ++ luci.http.prepare_content("application/json") ++ luci.http.write_json(s.switch_status(switches)) ++end ++ ++function diag_command(cmd, addr) ++ if addr and addr:match("^[a-zA-Z0-9%-%.:_]+$") then ++ luci.http.prepare_content("text/plain") ++ ++ local util = io.popen(cmd % addr) ++ if util then ++ while true do ++ local ln = util:read("*l") ++ if not ln then break end ++ luci.http.write(ln) ++ luci.http.write("\n") ++ end ++ ++ util:close() ++ end ++ ++ return ++ end ++ ++ luci.http.status(500, "Bad address") ++end ++ ++function diag_ping(addr) ++ diag_command("ping -c 5 -W 1 %q 2>&1", addr) ++end ++ ++function diag_traceroute(addr) ++ diag_command("traceroute -q 1 -w 1 -n %q 2>&1", addr) ++end ++ ++function diag_nslookup(addr) ++ diag_command("nslookup %q 2>&1", addr) ++end ++ ++function diag_ping6(addr) ++ diag_command("ping6 -c 5 %q 2>&1", addr) ++end ++ ++function diag_traceroute6(addr) ++ diag_command("traceroute6 -q 1 -w 2 -n %q 2>&1", addr) ++end +diff --git a/feeds/luci/modules/luci-mod-admin-full/luasrc/controller/admin/status.lua b/feeds/luci/modules/luci-mod-admin-full/luasrc/controller/admin/status.lua +new file mode 100644 +index 0000000..1ceb24d +--- /dev/null ++++ b/feeds/luci/modules/luci-mod-admin-full/luasrc/controller/admin/status.lua +@@ -0,0 +1,153 @@ ++-- Copyright 2008 Steven Barth ++-- Copyright 2011 Jo-Philipp Wich ++-- Licensed to the public under the Apache License 2.0. ++ ++module("luci.controller.admin.status", package.seeall) ++ ++function index() ++ entry({"admin", "status"}, alias("admin", "status", "overview"), _("Status"), 20).index = true ++ entry({"admin", "status", "overview"}, template("admin_status/index"), _("Overview"), 1) ++ entry({"admin", "status", "iptables"}, call("action_iptables"), _("Firewall"), 2).leaf = true ++ entry({"admin", "status", "routes"}, template("admin_status/routes"), _("Routes"), 3) ++ entry({"admin", "status", "syslog"}, call("action_syslog"), _("System Log"), 4) ++ entry({"admin", "status", "dmesg"}, call("action_dmesg"), _("Kernel Log"), 5) ++ entry({"admin", "status", "processes"}, cbi("admin_status/processes"), _("Processes"), 6) ++ ++ entry({"admin", "status", "realtime"}, alias("admin", "status", "realtime", "load"), _("Realtime Graphs"), 7) ++ ++ entry({"admin", "status", "realtime", "load"}, template("admin_status/load"), _("Load"), 1).leaf = true ++ entry({"admin", "status", "realtime", "load_status"}, call("action_load")).leaf = true ++ ++ entry({"admin", "status", "realtime", "bandwidth"}, template("admin_status/bandwidth"), _("Traffic"), 2).leaf = true ++ entry({"admin", "status", "realtime", "bandwidth_status"}, call("action_bandwidth")).leaf = true ++ ++ entry({"admin", "status", "realtime", "wireless"}, template("admin_status/wireless"), _("Wireless"), 3).leaf = true ++ entry({"admin", "status", "realtime", "wireless_status"}, call("action_wireless")).leaf = true ++ ++ entry({"admin", "status", "realtime", "connections"}, template("admin_status/connections"), _("Connections"), 4).leaf = true ++ entry({"admin", "status", "realtime", "connections_status"}, call("action_connections")).leaf = true ++ ++ entry({"admin", "status", "nameinfo"}, call("action_nameinfo")).leaf = true ++end ++ ++function action_syslog() ++ local syslog = luci.sys.syslog() ++ luci.template.render("admin_status/syslog", {syslog=syslog}) ++end ++ ++function action_dmesg() ++ local dmesg = luci.sys.dmesg() ++ luci.template.render("admin_status/dmesg", {dmesg=dmesg}) ++end ++ ++function action_iptables() ++ if luci.http.formvalue("zero") then ++ if luci.http.formvalue("zero") == "6" then ++ luci.util.exec("ip6tables -Z") ++ else ++ luci.util.exec("iptables -Z") ++ end ++ luci.http.redirect( ++ luci.dispatcher.build_url("admin", "status", "iptables") ++ ) ++ elseif luci.http.formvalue("restart") == "1" then ++ luci.util.exec("/etc/init.d/firewall restart") ++ luci.http.redirect( ++ luci.dispatcher.build_url("admin", "status", "iptables") ++ ) ++ else ++ luci.template.render("admin_status/iptables") ++ end ++end ++ ++function action_bandwidth(iface) ++ luci.http.prepare_content("application/json") ++ ++ local bwc = io.popen("luci-bwc -i %q 2>/dev/null" % iface) ++ if bwc then ++ luci.http.write("[") ++ ++ while true do ++ local ln = bwc:read("*l") ++ if not ln then break end ++ luci.http.write(ln) ++ end ++ ++ luci.http.write("]") ++ bwc:close() ++ end ++end ++ ++function action_wireless(iface) ++ luci.http.prepare_content("application/json") ++ ++ local bwc = io.popen("luci-bwc -r %q 2>/dev/null" % iface) ++ if bwc then ++ luci.http.write("[") ++ ++ while true do ++ local ln = bwc:read("*l") ++ if not ln then break end ++ luci.http.write(ln) ++ end ++ ++ luci.http.write("]") ++ bwc:close() ++ end ++end ++ ++function action_load() ++ luci.http.prepare_content("application/json") ++ ++ local bwc = io.popen("luci-bwc -l 2>/dev/null") ++ if bwc then ++ luci.http.write("[") ++ ++ while true do ++ local ln = bwc:read("*l") ++ if not ln then break end ++ luci.http.write(ln) ++ end ++ ++ luci.http.write("]") ++ bwc:close() ++ end ++end ++ ++function action_connections() ++ local sys = require "luci.sys" ++ ++ luci.http.prepare_content("application/json") ++ ++ luci.http.write("{ connections: ") ++ luci.http.write_json(sys.net.conntrack()) ++ ++ local bwc = io.popen("luci-bwc -c 2>/dev/null") ++ if bwc then ++ luci.http.write(", statistics: [") ++ ++ while true do ++ local ln = bwc:read("*l") ++ if not ln then break end ++ luci.http.write(ln) ++ end ++ ++ luci.http.write("]") ++ bwc:close() ++ end ++ ++ luci.http.write(" }") ++end ++ ++function action_nameinfo(...) ++ local i ++ local rv = { } ++ for i = 1, select('#', ...) do ++ local addr = select(i, ...) ++ local fqdn = nixio.getnameinfo(addr) ++ rv[addr] = fqdn or (addr:match(":") and "[%s]" % addr or addr) ++ end ++ ++ luci.http.prepare_content("application/json") ++ luci.http.write_json(rv) ++end +diff --git a/feeds/luci/modules/luci-mod-admin-full/luasrc/controller/admin/system.lua b/feeds/luci/modules/luci-mod-admin-full/luasrc/controller/admin/system.lua +new file mode 100644 +index 0000000..1b38c67 +--- /dev/null ++++ b/feeds/luci/modules/luci-mod-admin-full/luasrc/controller/admin/system.lua +@@ -0,0 +1,378 @@ ++-- Copyright 2008 Steven Barth ++-- Copyright 2008-2011 Jo-Philipp Wich ++-- Licensed to the public under the Apache License 2.0. ++ ++module("luci.controller.admin.system", package.seeall) ++ ++function index() ++ local fs = require "nixio.fs" ++ ++ entry({"admin", "system"}, alias("admin", "system", "system"), _("System"), 30).index = true ++ entry({"admin", "system", "system"}, cbi("admin_system/system"), _("System"), 1) ++ entry({"admin", "system", "clock_status"}, call("action_clock_status")) ++ ++ entry({"admin", "system", "admin"}, cbi("admin_system/admin"), _("Administration"), 2) ++ ++ if fs.access("/bin/opkg") then ++ entry({"admin", "system", "packages"}, call("action_packages"), _("Software"), 10) ++ entry({"admin", "system", "packages", "ipkg"}, form("admin_system/ipkg")) ++ end ++ ++ entry({"admin", "system", "startup"}, form("admin_system/startup"), _("Startup"), 45) ++ entry({"admin", "system", "crontab"}, form("admin_system/crontab"), _("Scheduled Tasks"), 46) ++ ++ if fs.access("/sbin/block") then ++ entry({"admin", "system", "fstab"}, cbi("admin_system/fstab"), _("Mount Points"), 50) ++ entry({"admin", "system", "fstab", "mount"}, cbi("admin_system/fstab/mount"), nil).leaf = true ++ entry({"admin", "system", "fstab", "swap"}, cbi("admin_system/fstab/swap"), nil).leaf = true ++ end ++ ++ if fs.access("/sys/class/leds") then ++ entry({"admin", "system", "leds"}, cbi("admin_system/leds"), _("LED Configuration"), 60) ++ end ++ ++ entry({"admin", "system", "flashops"}, call("action_flashops"), _("Backup / Flash Firmware"), 70) ++ entry({"admin", "system", "flashops", "backupfiles"}, form("admin_system/backupfiles")) ++ ++ entry({"admin", "system", "reboot"}, call("action_reboot"), _("Reboot"), 90) ++end ++ ++function action_clock_status() ++ local set = tonumber(luci.http.formvalue("set")) ++ if set ~= nil and set > 0 then ++ local date = os.date("*t", set) ++ if date then ++ luci.sys.call("date -s '%04d-%02d-%02d %02d:%02d:%02d'" %{ ++ date.year, date.month, date.day, date.hour, date.min, date.sec ++ }) ++ end ++ end ++ ++ luci.http.prepare_content("application/json") ++ luci.http.write_json({ timestring = os.date("%c") }) ++end ++ ++function action_packages() ++ local fs = require "nixio.fs" ++ local ipkg = require "luci.model.ipkg" ++ local submit = luci.http.formvalue("submit") ++ local changes = false ++ local install = { } ++ local remove = { } ++ local stdout = { "" } ++ local stderr = { "" } ++ local out, err ++ ++ -- Display ++ local display = luci.http.formvalue("display") or "installed" ++ ++ -- Letter ++ local letter = string.byte(luci.http.formvalue("letter") or "A", 1) ++ letter = (letter == 35 or (letter >= 65 and letter <= 90)) and letter or 65 ++ ++ -- Search query ++ local query = luci.http.formvalue("query") ++ query = (query ~= '') and query or nil ++ ++ ++ -- Packets to be installed ++ local ninst = submit and luci.http.formvalue("install") ++ local uinst = nil ++ ++ -- Install from URL ++ local url = luci.http.formvalue("url") ++ if url and url ~= '' and submit then ++ uinst = url ++ end ++ ++ -- Do install ++ if ninst then ++ install[ninst], out, err = ipkg.install(ninst) ++ stdout[#stdout+1] = out ++ stderr[#stderr+1] = err ++ changes = true ++ end ++ ++ if uinst then ++ local pkg ++ for pkg in luci.util.imatch(uinst) do ++ install[uinst], out, err = ipkg.install(pkg) ++ stdout[#stdout+1] = out ++ stderr[#stderr+1] = err ++ changes = true ++ end ++ end ++ ++ -- Remove packets ++ local rem = submit and luci.http.formvalue("remove") ++ if rem then ++ remove[rem], out, err = ipkg.remove(rem) ++ stdout[#stdout+1] = out ++ stderr[#stderr+1] = err ++ changes = true ++ end ++ ++ ++ -- Update all packets ++ local update = luci.http.formvalue("update") ++ if update then ++ update, out, err = ipkg.update() ++ stdout[#stdout+1] = out ++ stderr[#stderr+1] = err ++ end ++ ++ ++ -- Upgrade all packets ++ local upgrade = luci.http.formvalue("upgrade") ++ if upgrade then ++ upgrade, out, err = ipkg.upgrade() ++ stdout[#stdout+1] = out ++ stderr[#stderr+1] = err ++ end ++ ++ ++ -- List state ++ local no_lists = true ++ local old_lists = false ++ if fs.access("/var/opkg-lists/") then ++ local list ++ for list in fs.dir("/var/opkg-lists/") do ++ no_lists = false ++ if (fs.stat("/var/opkg-lists/"..list, "mtime") or 0) < (os.time() - (24 * 60 * 60)) then ++ old_lists = true ++ break ++ end ++ end ++ end ++ ++ ++ luci.template.render("admin_system/packages", { ++ display = display, ++ letter = letter, ++ query = query, ++ install = install, ++ remove = remove, ++ update = update, ++ upgrade = upgrade, ++ no_lists = no_lists, ++ old_lists = old_lists, ++ stdout = table.concat(stdout, ""), ++ stderr = table.concat(stderr, "") ++ }) ++ ++ -- Remove index cache ++ if changes then ++ fs.unlink("/tmp/luci-indexcache") ++ end ++end ++ ++function action_flashops() ++ local sys = require "luci.sys" ++ local fs = require "nixio.fs" ++ ++ local upgrade_avail = fs.access("/lib/upgrade/platform.sh") ++ local reset_avail = os.execute([[grep '"rootfs_data"' /proc/mtd >/dev/null 2>&1]]) == 0 ++ ++ local restore_cmd = "tar -xzC/ >/dev/null 2>&1" ++ local backup_cmd = "sysupgrade --create-backup - 2>/dev/null" ++ local image_tmp = "/tmp/firmware.img" ++ ++ local function image_supported() ++ return (os.execute("sysupgrade -T %q >/dev/null" % image_tmp) == 0) ++ end ++ ++ local function image_checksum() ++ return (luci.sys.exec("md5sum %q" % image_tmp):match("^([^%s]+)")) ++ end ++ ++ local function storage_size() ++ local size = 0 ++ if fs.access("/proc/mtd") then ++ for l in io.lines("/proc/mtd") do ++ local d, s, e, n = l:match('^([^%s]+)%s+([^%s]+)%s+([^%s]+)%s+"([^%s]+)"') ++ if n == "linux" or n == "firmware" then ++ size = tonumber(s, 16) ++ break ++ end ++ end ++ elseif fs.access("/proc/partitions") then ++ for l in io.lines("/proc/partitions") do ++ local x, y, b, n = l:match('^%s*(%d+)%s+(%d+)%s+([^%s]+)%s+([^%s]+)') ++ if b and n and not n:match('[0-9]') then ++ size = tonumber(b) * 1024 ++ break ++ end ++ end ++ end ++ return size ++ end ++ ++ ++ local fp ++ luci.http.setfilehandler( ++ function(meta, chunk, eof) ++ if not fp then ++ if meta and meta.name == "image" then ++ fp = io.open(image_tmp, "w") ++ else ++ fp = io.popen(restore_cmd, "w") ++ end ++ end ++ if chunk then ++ fp:write(chunk) ++ end ++ if eof then ++ fp:close() ++ end ++ end ++ ) ++ ++ if luci.http.formvalue("backup") then ++ -- ++ -- Assemble file list, generate backup ++ -- ++ local reader = ltn12_popen(backup_cmd) ++ luci.http.header('Content-Disposition', 'attachment; filename="backup-%s-%s.tar.gz"' % { ++ luci.sys.hostname(), os.date("%Y-%m-%d")}) ++ luci.http.prepare_content("application/x-targz") ++ luci.ltn12.pump.all(reader, luci.http.write) ++ elseif luci.http.formvalue("restore") then ++ -- ++ -- Unpack received .tar.gz ++ -- ++ local upload = luci.http.formvalue("archive") ++ if upload and #upload > 0 then ++ luci.template.render("admin_system/applyreboot") ++ luci.sys.reboot() ++ end ++ elseif luci.http.formvalue("image") or luci.http.formvalue("step") then ++ -- ++ -- Initiate firmware flash ++ -- ++ local step = tonumber(luci.http.formvalue("step") or 1) ++ if step == 1 then ++ if image_supported() then ++ luci.template.render("admin_system/upgrade", { ++ checksum = image_checksum(), ++ storage = storage_size(), ++ size = (fs.stat(image_tmp, "size") or 0), ++ keep = (not not luci.http.formvalue("keep")) ++ }) ++ else ++ fs.unlink(image_tmp) ++ luci.template.render("admin_system/flashops", { ++ reset_avail = reset_avail, ++ upgrade_avail = upgrade_avail, ++ image_invalid = true ++ }) ++ end ++ -- ++ -- Start sysupgrade flash ++ -- ++ elseif step == 2 then ++ local keep = (luci.http.formvalue("keep") == "1") and "" or "-n" ++ luci.template.render("admin_system/applyreboot", { ++ title = luci.i18n.translate("Flashing..."), ++ msg = luci.i18n.translate("The system is flashing now.
    DO NOT POWER OFF THE DEVICE!
    Wait a few minutes before you try to reconnect. It might be necessary to renew the address of your computer to reach the device again, depending on your settings."), ++ addr = (#keep > 0) and "192.168.1.1" or nil ++ }) ++ fork_exec("killall dropbear uhttpd; sleep 1; /sbin/sysupgrade %s %q" %{ keep, image_tmp }) ++ end ++ elseif reset_avail and luci.http.formvalue("reset") then ++ -- ++ -- Reset system ++ -- ++ luci.template.render("admin_system/applyreboot", { ++ title = luci.i18n.translate("Erasing..."), ++ msg = luci.i18n.translate("The system is erasing the configuration partition now and will reboot itself when finished."), ++ addr = "192.168.1.1" ++ }) ++ fork_exec("killall dropbear uhttpd; sleep 1; mtd -r erase rootfs_data") ++ else ++ -- ++ -- Overview ++ -- ++ luci.template.render("admin_system/flashops", { ++ reset_avail = reset_avail, ++ upgrade_avail = upgrade_avail ++ }) ++ end ++end ++ ++function action_passwd() ++ local p1 = luci.http.formvalue("pwd1") ++ local p2 = luci.http.formvalue("pwd2") ++ local stat = nil ++ ++ if p1 or p2 then ++ if p1 == p2 then ++ stat = luci.sys.user.setpasswd("root", p1) ++ else ++ stat = 10 ++ end ++ end ++ ++ luci.template.render("admin_system/passwd", {stat=stat}) ++end ++ ++function action_reboot() ++ local reboot = luci.http.formvalue("reboot") ++ luci.template.render("admin_system/reboot", {reboot=reboot}) ++ if reboot then ++ luci.sys.reboot() ++ end ++end ++ ++function fork_exec(command) ++ local pid = nixio.fork() ++ if pid > 0 then ++ return ++ elseif pid == 0 then ++ -- change to root dir ++ nixio.chdir("/") ++ ++ -- patch stdin, out, err to /dev/null ++ local null = nixio.open("/dev/null", "w+") ++ if null then ++ nixio.dup(null, nixio.stderr) ++ nixio.dup(null, nixio.stdout) ++ nixio.dup(null, nixio.stdin) ++ if null:fileno() > 2 then ++ null:close() ++ end ++ end ++ ++ -- replace with target command ++ nixio.exec("/bin/sh", "-c", command) ++ end ++end ++ ++function ltn12_popen(command) ++ ++ local fdi, fdo = nixio.pipe() ++ local pid = nixio.fork() ++ ++ if pid > 0 then ++ fdo:close() ++ local close ++ return function() ++ local buffer = fdi:read(2048) ++ local wpid, stat = nixio.waitpid(pid, "nohang") ++ if not close and wpid and stat == "exited" then ++ close = true ++ end ++ ++ if buffer and #buffer > 0 then ++ return buffer ++ elseif close then ++ fdi:close() ++ return nil ++ end ++ end ++ elseif pid == 0 then ++ nixio.dup(fdo, nixio.stdout) ++ fdi:close() ++ fdo:close() ++ nixio.exec("/bin/sh", "-c", command) ++ end ++end +diff --git a/feeds/luci/modules/luci-mod-admin-full/luasrc/controller/admin/uci.lua b/feeds/luci/modules/luci-mod-admin-full/luasrc/controller/admin/uci.lua +new file mode 100644 +index 0000000..6de3c73 +--- /dev/null ++++ b/feeds/luci/modules/luci-mod-admin-full/luasrc/controller/admin/uci.lua +@@ -0,0 +1,64 @@ ++-- Copyright 2008 Steven Barth ++-- Copyright 2010 Jo-Philipp Wich ++-- Licensed to the public under the Apache License 2.0. ++ ++module("luci.controller.admin.uci", package.seeall) ++ ++function index() ++ local redir = luci.http.formvalue("redir", true) or ++ luci.dispatcher.build_url(unpack(luci.dispatcher.context.request)) ++ ++ entry({"admin", "uci"}, nil, _("Configuration")) ++ entry({"admin", "uci", "changes"}, call("action_changes"), _("Changes"), 40).query = {redir=redir} ++ entry({"admin", "uci", "revert"}, call("action_revert"), _("Revert"), 30).query = {redir=redir} ++ entry({"admin", "uci", "apply"}, call("action_apply"), _("Apply"), 20).query = {redir=redir} ++ entry({"admin", "uci", "saveapply"}, call("action_apply"), _("Save & Apply"), 10).query = {redir=redir} ++end ++ ++function action_changes() ++ local uci = luci.model.uci.cursor() ++ local changes = uci:changes() ++ ++ luci.template.render("admin_uci/changes", { ++ changes = next(changes) and changes ++ }) ++end ++ ++function action_apply() ++ local path = luci.dispatcher.context.path ++ local uci = luci.model.uci.cursor() ++ local changes = uci:changes() ++ local reload = {} ++ ++ -- Collect files to be applied and commit changes ++ for r, tbl in pairs(changes) do ++ table.insert(reload, r) ++ if path[#path] ~= "apply" then ++ uci:load(r) ++ uci:commit(r) ++ uci:unload(r) ++ end ++ end ++ ++ luci.template.render("admin_uci/apply", { ++ changes = next(changes) and changes, ++ configs = reload ++ }) ++end ++ ++ ++function action_revert() ++ local uci = luci.model.uci.cursor() ++ local changes = uci:changes() ++ ++ -- Collect files to be reverted ++ for r, tbl in pairs(changes) do ++ uci:load(r) ++ uci:revert(r) ++ uci:unload(r) ++ end ++ ++ luci.template.render("admin_uci/revert", { ++ changes = next(changes) and changes ++ }) ++end +diff --git a/feeds/luci/modules/luci-mod-admin-full/luasrc/model/cbi/admin_network/dhcp.lua b/feeds/luci/modules/luci-mod-admin-full/luasrc/model/cbi/admin_network/dhcp.lua +new file mode 100644 +index 0000000..49103a8 +--- /dev/null ++++ b/feeds/luci/modules/luci-mod-admin-full/luasrc/model/cbi/admin_network/dhcp.lua +@@ -0,0 +1,257 @@ ++-- Copyright 2008 Steven Barth ++-- Licensed to the public under the Apache License 2.0. ++ ++local ipc = require "luci.ip" ++ ++m = Map("dhcp", translate("DHCP and DNS"), ++ translate("Dnsmasq is a combined DHCP-Server and DNS-" .. ++ "Forwarder for NAT " .. ++ "firewalls")) ++ ++s = m:section(TypedSection, "dnsmasq", translate("Server Settings")) ++s.anonymous = true ++s.addremove = false ++ ++s:tab("general", translate("General Settings")) ++s:tab("files", translate("Resolv and Hosts Files")) ++s:tab("tftp", translate("TFTP Settings")) ++s:tab("advanced", translate("Advanced Settings")) ++ ++s:taboption("general", Flag, "domainneeded", ++ translate("Domain required"), ++ translate("Don't forward DNS-Requests without " .. ++ "DNS-Name")) ++ ++s:taboption("general", Flag, "authoritative", ++ translate("Authoritative"), ++ translate("This is the only DHCP in the local network")) ++ ++ ++s:taboption("files", Flag, "readethers", ++ translate("Use /etc/ethers"), ++ translate("Read /etc/ethers to configure the DHCP-Server")) ++ ++s:taboption("files", Value, "leasefile", ++ translate("Leasefile"), ++ translate("file where given DHCP-leases will be stored")) ++ ++s:taboption("files", Flag, "noresolv", ++ translate("Ignore resolve file")).optional = true ++ ++rf = s:taboption("files", Value, "resolvfile", ++ translate("Resolve file"), ++ translate("local DNS file")) ++ ++rf:depends("noresolv", "") ++rf.optional = true ++ ++ ++s:taboption("files", Flag, "nohosts", ++ translate("Ignore Hosts files")).optional = true ++ ++hf = s:taboption("files", DynamicList, "addnhosts", ++ translate("Additional Hosts files")) ++ ++hf:depends("nohosts", "") ++hf.optional = true ++ ++ ++s:taboption("advanced", Flag, "boguspriv", ++ translate("Filter private"), ++ translate("Do not forward reverse lookups for local networks")) ++ ++s:taboption("advanced", Flag, "filterwin2k", ++ translate("Filter useless"), ++ translate("Do not forward requests that cannot be answered by public name servers")) ++ ++ ++s:taboption("advanced", Flag, "localise_queries", ++ translate("Localise queries"), ++ translate("Localise hostname depending on the requesting subnet if multiple IPs are available")) ++ ++s:taboption("general", Value, "local", ++ translate("Local server"), ++ translate("Local domain specification. Names matching this domain are never forwarded and are resolved from DHCP or hosts files only")) ++ ++s:taboption("general", Value, "domain", ++ translate("Local domain"), ++ translate("Local domain suffix appended to DHCP names and hosts file entries")) ++ ++s:taboption("advanced", Flag, "expandhosts", ++ translate("Expand hosts"), ++ translate("Add local domain suffix to names served from hosts files")) ++ ++s:taboption("advanced", Flag, "nonegcache", ++ translate("No negative cache"), ++ translate("Do not cache negative replies, e.g. for not existing domains")) ++ ++s:taboption("advanced", Value, "serversfile", ++ translate("Additional servers file"), ++ translate("This file may contain lines like 'server=/domain/1.2.3.4' or 'server=1.2.3.4' for".. ++ "domain-specific or full upstream DNS servers.")) ++ ++s:taboption("advanced", Flag, "strictorder", ++ translate("Strict order"), ++ translate("DNS servers will be queried in the " .. ++ "order of the resolvfile")).optional = true ++ ++ ++bn = s:taboption("advanced", DynamicList, "bogusnxdomain", translate("Bogus NX Domain Override"), ++ translate("List of hosts that supply bogus NX domain results")) ++ ++bn.optional = true ++bn.placeholder = "67.215.65.132" ++ ++ ++s:taboption("general", Flag, "logqueries", ++ translate("Log queries"), ++ translate("Write received DNS requests to syslog")).optional = true ++ ++df = s:taboption("general", DynamicList, "server", translate("DNS forwardings"), ++ translate("List of DNS " .. ++ "servers to forward requests to")) ++ ++df.optional = true ++df.placeholder = "/example.org/10.1.2.3" ++ ++ ++rp = s:taboption("general", Flag, "rebind_protection", ++ translate("Rebind protection"), ++ translate("Discard upstream RFC1918 responses")) ++ ++rp.rmempty = false ++ ++ ++rl = s:taboption("general", Flag, "rebind_localhost", ++ translate("Allow localhost"), ++ translate("Allow upstream responses in the 127.0.0.0/8 range, e.g. for RBL services")) ++ ++rl:depends("rebind_protection", "1") ++ ++ ++rd = s:taboption("general", DynamicList, "rebind_domain", ++ translate("Domain whitelist"), ++ translate("List of domains to allow RFC1918 responses for")) ++ ++rd:depends("rebind_protection", "1") ++rd.datatype = "host" ++rd.placeholder = "ihost.netflix.com" ++ ++ ++pt = s:taboption("advanced", Value, "port", ++ translate("DNS server port"), ++ translate("Listening port for inbound DNS queries")) ++ ++pt.optional = true ++pt.datatype = "port" ++pt.placeholder = 53 ++ ++ ++qp = s:taboption("advanced", Value, "queryport", ++ translate("DNS query port"), ++ translate("Fixed source port for outbound DNS queries")) ++ ++qp.optional = true ++qp.datatype = "port" ++qp.placeholder = translate("any") ++ ++ ++lm = s:taboption("advanced", Value, "dhcpleasemax", ++ translate("Max. DHCP leases"), ++ translate("Maximum allowed number of active DHCP leases")) ++ ++lm.optional = true ++lm.datatype = "uinteger" ++lm.placeholder = translate("unlimited") ++ ++ ++em = s:taboption("advanced", Value, "ednspacket_max", ++ translate("Max. EDNS0 packet size"), ++ translate("Maximum allowed size of EDNS.0 UDP packets")) ++ ++em.optional = true ++em.datatype = "uinteger" ++em.placeholder = 1280 ++ ++ ++cq = s:taboption("advanced", Value, "dnsforwardmax", ++ translate("Max. concurrent queries"), ++ translate("Maximum allowed number of concurrent DNS queries")) ++ ++cq.optional = true ++cq.datatype = "uinteger" ++cq.placeholder = 150 ++ ++ ++s:taboption("tftp", Flag, "enable_tftp", ++ translate("Enable TFTP server")).optional = true ++ ++tr = s:taboption("tftp", Value, "tftp_root", ++ translate("TFTP server root"), ++ translate("Root directory for files served via TFTP")) ++ ++tr.optional = true ++tr:depends("enable_tftp", "1") ++tr.placeholder = "/" ++ ++ ++db = s:taboption("tftp", Value, "dhcp_boot", ++ translate("Network boot image"), ++ translate("Filename of the boot image advertised to clients")) ++ ++db.optional = true ++db:depends("enable_tftp", "1") ++db.placeholder = "pxelinux.0" ++ ++ ++m:section(SimpleSection).template = "admin_network/lease_status" ++ ++s = m:section(TypedSection, "host", translate("Static Leases"), ++ translate("Static leases are used to assign fixed IP addresses and symbolic hostnames to " .. ++ "DHCP clients. They are also required for non-dynamic interface configurations where " .. ++ "only hosts with a corresponding lease are served.") .. "
    " .. ++ translate("Use the Add Button to add a new lease entry. The MAC-Address " .. ++ "indentifies the host, the IPv4-Address specifies to the fixed address to " .. ++ "use and the Hostname is assigned as symbolic name to the requesting host.")) ++ ++s.addremove = true ++s.anonymous = true ++s.template = "cbi/tblsection" ++ ++name = s:option(Value, "name", translate("Hostname")) ++name.datatype = "hostname" ++name.rmempty = true ++ ++mac = s:option(Value, "mac", translate("MAC-Address")) ++mac.datatype = "list(macaddr)" ++mac.rmempty = true ++ ++ip = s:option(Value, "ip", translate("IPv4-Address")) ++ip.datatype = "or(ip4addr,'ignore')" ++ ++hostid = s:option(Value, "hostid", translate("IPv6-Suffix (hex)")) ++ ++ipc.neighbors({ family = 4 }, function(n) ++ if n.mac and n.dest then ++ ip:value(n.dest:string()) ++ mac:value(n.mac, "%s (%s)" %{ n.mac, n.dest:string() }) ++ end ++end) ++ ++function ip.validate(self, value, section) ++ local m = mac:formvalue(section) or "" ++ local n = name:formvalue(section) or "" ++ if value and #n == 0 and #m == 0 then ++ return nil, translate("One of hostname or mac address must be specified!") ++ end ++ return Value.validate(self, value, section) ++end ++ ++ ++return m +diff --git a/feeds/luci/modules/luci-mod-admin-full/luasrc/model/cbi/admin_network/hosts.lua b/feeds/luci/modules/luci-mod-admin-full/luasrc/model/cbi/admin_network/hosts.lua +new file mode 100644 +index 0000000..fafacf3 +--- /dev/null ++++ b/feeds/luci/modules/luci-mod-admin-full/luasrc/model/cbi/admin_network/hosts.lua +@@ -0,0 +1,28 @@ ++-- Copyright 2008 Steven Barth ++-- Copyright 2010-2015 Jo-Philipp Wich ++-- Licensed to the public under the Apache License 2.0. ++ ++local ipc = require "luci.ip" ++ ++m = Map("dhcp", translate("Hostnames")) ++ ++s = m:section(TypedSection, "domain", translate("Host entries")) ++s.addremove = true ++s.anonymous = true ++s.template = "cbi/tblsection" ++ ++hn = s:option(Value, "name", translate("Hostname")) ++hn.datatype = "hostname" ++hn.rmempty = true ++ ++ip = s:option(Value, "ip", translate("IP address")) ++ip.datatype = "ipaddr" ++ip.rmempty = true ++ ++ipc.neighbors({ }, function(n) ++ if n.mac and n.dest and not n.dest:is6linklocal() then ++ ip:value(n.dest:string(), "%s (%s)" %{ n.dest:string(), n.mac }) ++ end ++end) ++ ++return m +diff --git a/feeds/luci/modules/luci-mod-admin-full/luasrc/model/cbi/admin_network/iface_add.lua b/feeds/luci/modules/luci-mod-admin-full/luasrc/model/cbi/admin_network/iface_add.lua +new file mode 100644 +index 0000000..da1e140 +--- /dev/null ++++ b/feeds/luci/modules/luci-mod-admin-full/luasrc/model/cbi/admin_network/iface_add.lua +@@ -0,0 +1,92 @@ ++-- Copyright 2009-2010 Jo-Philipp Wich ++-- Licensed to the public under the Apache License 2.0. ++ ++local nw = require "luci.model.network".init() ++local fw = require "luci.model.firewall".init() ++local utl = require "luci.util" ++local uci = require "luci.model.uci".cursor() ++ ++m = SimpleForm("network", translate("Create Interface")) ++m.redirect = luci.dispatcher.build_url("admin/network/network") ++m.reset = false ++ ++newnet = m:field(Value, "_netname", translate("Name of the new interface"), ++ translate("The allowed characters are: A-Z, a-z, " .. ++ "0-9 and _" ++ )) ++ ++newnet:depends("_attach", "") ++newnet.default = arg[1] and "net_" .. arg[1]:gsub("[^%w_]+", "_") ++newnet.datatype = "uciname" ++ ++newproto = m:field(ListValue, "_netproto", translate("Protocol of the new interface")) ++ ++netbridge = m:field(Flag, "_bridge", translate("Create a bridge over multiple interfaces")) ++ ++ ++sifname = m:field(Value, "_ifname", translate("Cover the following interface")) ++ ++sifname.widget = "radio" ++sifname.template = "cbi/network_ifacelist" ++sifname.nobridges = true ++ ++ ++mifname = m:field(Value, "_ifnames", translate("Cover the following interfaces")) ++ ++mifname.widget = "checkbox" ++mifname.template = "cbi/network_ifacelist" ++mifname.nobridges = true ++ ++ ++local _, p ++for _, p in ipairs(nw:get_protocols()) do ++ if p:is_installed() then ++ newproto:value(p:proto(), p:get_i18n()) ++ if not p:is_virtual() then netbridge:depends("_netproto", p:proto()) end ++ if not p:is_floating() then ++ sifname:depends({ _bridge = "", _netproto = p:proto()}) ++ mifname:depends({ _bridge = "1", _netproto = p:proto()}) ++ end ++ end ++end ++ ++function newproto.validate(self, value, section) ++ local name = newnet:formvalue(section) ++ if not name or #name == 0 then ++ newnet:add_error(section, translate("No network name specified")) ++ elseif m:get(name) then ++ newnet:add_error(section, translate("The given network name is not unique")) ++ end ++ ++ local proto = nw:get_protocol(value) ++ if proto and not proto:is_floating() then ++ local br = (netbridge:formvalue(section) == "1") ++ local ifn = br and mifname:formvalue(section) or sifname:formvalue(section) ++ for ifn in utl.imatch(ifn) do ++ return value ++ end ++ return nil, translate("The selected protocol needs a device assigned") ++ end ++ return value ++end ++ ++function newproto.write(self, section, value) ++ local name = newnet:formvalue(section) ++ if name and #name > 0 then ++ local br = (netbridge:formvalue(section) == "1") and "bridge" or nil ++ local net = nw:add_network(name, { proto = value, type = br }) ++ if net then ++ local ifn ++ for ifn in utl.imatch( ++ br and mifname:formvalue(section) or sifname:formvalue(section) ++ ) do ++ net:add_interface(ifn) ++ end ++ nw:save("network") ++ nw:save("wireless") ++ end ++ luci.http.redirect(luci.dispatcher.build_url("admin/network/network", name)) ++ end ++end ++ ++return m +diff --git a/feeds/luci/modules/luci-mod-admin-full/luasrc/model/cbi/admin_network/ifaces.lua b/feeds/luci/modules/luci-mod-admin-full/luasrc/model/cbi/admin_network/ifaces.lua +new file mode 100644 +index 0000000..e092be6 +--- /dev/null ++++ b/feeds/luci/modules/luci-mod-admin-full/luasrc/model/cbi/admin_network/ifaces.lua +@@ -0,0 +1,517 @@ ++-- Copyright 2008 Steven Barth ++-- Copyright 2008-2011 Jo-Philipp Wich ++-- Licensed to the public under the Apache License 2.0. ++ ++local fs = require "nixio.fs" ++local ut = require "luci.util" ++local pt = require "luci.tools.proto" ++local nw = require "luci.model.network" ++local fw = require "luci.model.firewall" ++ ++arg[1] = arg[1] or "" ++ ++local has_dnsmasq = fs.access("/etc/config/dhcp") ++local has_firewall = fs.access("/etc/config/firewall") ++ ++m = Map("network", translate("Interfaces") .. " - " .. arg[1]:upper(), translate("On this page you can configure the network interfaces. You can bridge several interfaces by ticking the \"bridge interfaces\" field and enter the names of several network interfaces separated by spaces. You can also use VLAN notation INTERFACE.VLANNR (e.g.: eth0.1).")) ++m.redirect = luci.dispatcher.build_url("admin", "network", "network") ++m:chain("wireless") ++ ++if has_firewall then ++ m:chain("firewall") ++end ++ ++nw.init(m.uci) ++fw.init(m.uci) ++ ++ ++local net = nw:get_network(arg[1]) ++ ++local function backup_ifnames(is_bridge) ++ if not net:is_floating() and not m:get(net:name(), "_orig_ifname") then ++ local ifcs = net:get_interfaces() or { net:get_interface() } ++ if ifcs then ++ local _, ifn ++ local ifns = { } ++ for _, ifn in ipairs(ifcs) do ++ ifns[#ifns+1] = ifn:name() ++ end ++ if #ifns > 0 then ++ m:set(net:name(), "_orig_ifname", table.concat(ifns, " ")) ++ m:set(net:name(), "_orig_bridge", tostring(net:is_bridge())) ++ end ++ end ++ end ++end ++ ++ ++-- redirect to overview page if network does not exist anymore (e.g. after a revert) ++if not net then ++ luci.http.redirect(luci.dispatcher.build_url("admin/network/network")) ++ return ++end ++ ++-- protocol switch was requested, rebuild interface config and reload page ++if m:formvalue("cbid.network.%s._switch" % net:name()) then ++ -- get new protocol ++ local ptype = m:formvalue("cbid.network.%s.proto" % net:name()) or "-" ++ local proto = nw:get_protocol(ptype, net:name()) ++ if proto then ++ -- backup default ++ backup_ifnames() ++ ++ -- if current proto is not floating and target proto is not floating, ++ -- then attempt to retain the ifnames ++ --error(net:proto() .. " > " .. proto:proto()) ++ if not net:is_floating() and not proto:is_floating() then ++ -- if old proto is a bridge and new proto not, then clip the ++ -- interface list to the first ifname only ++ if net:is_bridge() and proto:is_virtual() then ++ local _, ifn ++ local first = true ++ for _, ifn in ipairs(net:get_interfaces() or { net:get_interface() }) do ++ if first then ++ first = false ++ else ++ net:del_interface(ifn) ++ end ++ end ++ m:del(net:name(), "type") ++ end ++ ++ -- if the current proto is floating, the target proto not floating, ++ -- then attempt to restore ifnames from backup ++ elseif net:is_floating() and not proto:is_floating() then ++ -- if we have backup data, then re-add all orphaned interfaces ++ -- from it and restore the bridge choice ++ local br = (m:get(net:name(), "_orig_bridge") == "true") ++ local ifn ++ local ifns = { } ++ for ifn in ut.imatch(m:get(net:name(), "_orig_ifname")) do ++ ifn = nw:get_interface(ifn) ++ if ifn and not ifn:get_network() then ++ proto:add_interface(ifn) ++ if not br then ++ break ++ end ++ end ++ end ++ if br then ++ m:set(net:name(), "type", "bridge") ++ end ++ ++ -- in all other cases clear the ifnames ++ else ++ local _, ifc ++ for _, ifc in ipairs(net:get_interfaces() or { net:get_interface() }) do ++ net:del_interface(ifc) ++ end ++ m:del(net:name(), "type") ++ end ++ ++ -- clear options ++ local k, v ++ for k, v in pairs(m:get(net:name())) do ++ if k:sub(1,1) ~= "." and ++ k ~= "type" and ++ k ~= "ifname" and ++ k ~= "_orig_ifname" and ++ k ~= "_orig_bridge" ++ then ++ m:del(net:name(), k) ++ end ++ end ++ ++ -- set proto ++ m:set(net:name(), "proto", proto:proto()) ++ m.uci:save("network") ++ m.uci:save("wireless") ++ ++ -- reload page ++ luci.http.redirect(luci.dispatcher.build_url("admin/network/network", arg[1])) ++ return ++ end ++end ++ ++-- dhcp setup was requested, create section and reload page ++if m:formvalue("cbid.dhcp._enable._enable") then ++ m.uci:section("dhcp", "dhcp", arg[1], { ++ interface = arg[1], ++ start = "100", ++ limit = "150", ++ leasetime = "12h" ++ }) ++ ++ m.uci:save("dhcp") ++ luci.http.redirect(luci.dispatcher.build_url("admin/network/network", arg[1])) ++ return ++end ++ ++local ifc = net:get_interface() ++ ++s = m:section(NamedSection, arg[1], "interface", translate("Common Configuration")) ++s.addremove = false ++ ++s:tab("general", translate("General Setup")) ++s:tab("advanced", translate("Advanced Settings")) ++s:tab("physical", translate("Physical Settings")) ++ ++if has_firewall then ++ s:tab("firewall", translate("Firewall Settings")) ++end ++ ++ ++st = s:taboption("general", DummyValue, "__status", translate("Status")) ++ ++local function set_status() ++ -- if current network is empty, print a warning ++ if not net:is_floating() and net:is_empty() then ++ st.template = "cbi/dvalue" ++ st.network = nil ++ st.value = translate("There is no device assigned yet, please attach a network device in the \"Physical Settings\" tab") ++ else ++ st.template = "admin_network/iface_status" ++ st.network = arg[1] ++ st.value = nil ++ end ++end ++ ++m.on_init = set_status ++m.on_after_save = set_status ++ ++ ++p = s:taboption("general", ListValue, "proto", translate("Protocol")) ++p.default = net:proto() ++ ++ ++if not net:is_installed() then ++ p_install = s:taboption("general", Button, "_install") ++ p_install.title = translate("Protocol support is not installed") ++ p_install.inputtitle = translate("Install package %q" % net:opkg_package()) ++ p_install.inputstyle = "apply" ++ p_install:depends("proto", net:proto()) ++ ++ function p_install.write() ++ return luci.http.redirect( ++ luci.dispatcher.build_url("admin/system/packages") .. ++ "?submit=1&install=%s" % net:opkg_package() ++ ) ++ end ++end ++ ++ ++p_switch = s:taboption("general", Button, "_switch") ++p_switch.title = translate("Really switch protocol?") ++p_switch.inputtitle = translate("Switch protocol") ++p_switch.inputstyle = "apply" ++ ++local _, pr ++for _, pr in ipairs(nw:get_protocols()) do ++ p:value(pr:proto(), pr:get_i18n()) ++ if pr:proto() ~= net:proto() then ++ p_switch:depends("proto", pr:proto()) ++ end ++end ++ ++ ++auto = s:taboption("advanced", Flag, "auto", translate("Bring up on boot")) ++auto.default = (net:proto() == "none") and auto.disabled or auto.enabled ++ ++delegate = s:taboption("advanced", Flag, "delegate", translate("Use builtin IPv6-management")) ++delegate.default = delegate.enabled ++ ++ ++if not net:is_virtual() then ++ br = s:taboption("physical", Flag, "type", translate("Bridge interfaces"), translate("creates a bridge over specified interface(s)")) ++ br.enabled = "bridge" ++ br.rmempty = true ++ br:depends("proto", "static") ++ br:depends("proto", "dhcp") ++ br:depends("proto", "none") ++ ++ stp = s:taboption("physical", Flag, "stp", translate("Enable STP"), ++ translate("Enables the Spanning Tree Protocol on this bridge")) ++ stp:depends("type", "bridge") ++ stp.rmempty = true ++end ++ ++ ++if not net:is_floating() then ++ ifname_single = s:taboption("physical", Value, "ifname_single", translate("Interface")) ++ ifname_single.template = "cbi/network_ifacelist" ++ ifname_single.widget = "radio" ++ ifname_single.nobridges = true ++ ifname_single.rmempty = false ++ ifname_single.network = arg[1] ++ ifname_single:depends("type", "") ++ ++ function ifname_single.cfgvalue(self, s) ++ -- let the template figure out the related ifaces through the network model ++ return nil ++ end ++ ++ function ifname_single.write(self, s, val) ++ local i ++ local new_ifs = { } ++ local old_ifs = { } ++ ++ for _, i in ipairs(net:get_interfaces() or { net:get_interface() }) do ++ old_ifs[#old_ifs+1] = i:name() ++ end ++ ++ for i in ut.imatch(val) do ++ new_ifs[#new_ifs+1] = i ++ ++ -- if this is not a bridge, only assign first interface ++ if self.option == "ifname_single" then ++ break ++ end ++ end ++ ++ table.sort(old_ifs) ++ table.sort(new_ifs) ++ ++ for i = 1, math.max(#old_ifs, #new_ifs) do ++ if old_ifs[i] ~= new_ifs[i] then ++ backup_ifnames() ++ for i = 1, #old_ifs do ++ net:del_interface(old_ifs[i]) ++ end ++ for i = 1, #new_ifs do ++ net:add_interface(new_ifs[i]) ++ end ++ break ++ end ++ end ++ end ++end ++ ++ ++if not net:is_virtual() then ++ ifname_multi = s:taboption("physical", Value, "ifname_multi", translate("Interface")) ++ ifname_multi.template = "cbi/network_ifacelist" ++ ifname_multi.nobridges = true ++ ifname_multi.rmempty = false ++ ifname_multi.network = arg[1] ++ ifname_multi.widget = "checkbox" ++ ifname_multi:depends("type", "bridge") ++ ifname_multi.cfgvalue = ifname_single.cfgvalue ++ ifname_multi.write = ifname_single.write ++end ++ ++ ++if has_firewall then ++ fwzone = s:taboption("firewall", Value, "_fwzone", ++ translate("Create / Assign firewall-zone"), ++ translate("Choose the firewall zone you want to assign to this interface. Select unspecified to remove the interface from the associated zone or fill out the create field to define a new zone and attach the interface to it.")) ++ ++ fwzone.template = "cbi/firewall_zonelist" ++ fwzone.network = arg[1] ++ fwzone.rmempty = false ++ ++ function fwzone.cfgvalue(self, section) ++ self.iface = section ++ local z = fw:get_zone_by_network(section) ++ return z and z:name() ++ end ++ ++ function fwzone.write(self, section, value) ++ local zone = fw:get_zone(value) ++ ++ if not zone and value == '-' then ++ value = m:formvalue(self:cbid(section) .. ".newzone") ++ if value and #value > 0 then ++ zone = fw:add_zone(value) ++ else ++ fw:del_network(section) ++ end ++ end ++ ++ if zone then ++ fw:del_network(section) ++ zone:add_network(section) ++ end ++ end ++end ++ ++ ++function p.write() end ++function p.remove() end ++function p.validate(self, value, section) ++ if value == net:proto() then ++ if not net:is_floating() and net:is_empty() then ++ local ifn = ((br and (br:formvalue(section) == "bridge")) ++ and ifname_multi:formvalue(section) ++ or ifname_single:formvalue(section)) ++ ++ for ifn in ut.imatch(ifn) do ++ return value ++ end ++ return nil, translate("The selected protocol needs a device assigned") ++ end ++ end ++ return value ++end ++ ++ ++local form, ferr = loadfile( ++ ut.libpath() .. "/model/cbi/admin_network/proto_%s.lua" % net:proto() ++) ++ ++if not form then ++ s:taboption("general", DummyValue, "_error", ++ translate("Missing protocol extension for proto %q" % net:proto()) ++ ).value = ferr ++else ++ setfenv(form, getfenv(1))(m, s, net) ++end ++ ++ ++local _, field ++for _, field in ipairs(s.children) do ++ if field ~= st and field ~= p and field ~= p_install and field ~= p_switch then ++ if next(field.deps) then ++ local _, dep ++ for _, dep in ipairs(field.deps) do ++ dep.deps.proto = net:proto() ++ end ++ else ++ field:depends("proto", net:proto()) ++ end ++ end ++end ++ ++ ++-- ++-- Display DNS settings if dnsmasq is available ++-- ++ ++if has_dnsmasq and net:proto() == "static" then ++ m2 = Map("dhcp", "", "") ++ ++ local has_section = false ++ ++ m2.uci:foreach("dhcp", "dhcp", function(s) ++ if s.interface == arg[1] then ++ has_section = true ++ return false ++ end ++ end) ++ ++ if not has_section and has_dnsmasq then ++ ++ s = m2:section(TypedSection, "dhcp", translate("DHCP Server")) ++ s.anonymous = true ++ s.cfgsections = function() return { "_enable" } end ++ ++ x = s:option(Button, "_enable") ++ x.title = translate("No DHCP Server configured for this interface") ++ x.inputtitle = translate("Setup DHCP Server") ++ x.inputstyle = "apply" ++ ++ elseif has_section then ++ ++ s = m2:section(TypedSection, "dhcp", translate("DHCP Server")) ++ s.addremove = false ++ s.anonymous = true ++ s:tab("general", translate("General Setup")) ++ s:tab("advanced", translate("Advanced Settings")) ++ s:tab("ipv6", translate("IPv6 Settings")) ++ ++ function s.filter(self, section) ++ return m2.uci:get("dhcp", section, "interface") == arg[1] ++ end ++ ++ local ignore = s:taboption("general", Flag, "ignore", ++ translate("Ignore interface"), ++ translate("Disable DHCP for " .. ++ "this interface.")) ++ ++ local start = s:taboption("general", Value, "start", translate("Start"), ++ translate("Lowest leased address as offset from the network address.")) ++ start.optional = true ++ start.datatype = "or(uinteger,ip4addr)" ++ start.default = "100" ++ ++ local limit = s:taboption("general", Value, "limit", translate("Limit"), ++ translate("Maximum number of leased addresses.")) ++ limit.optional = true ++ limit.datatype = "uinteger" ++ limit.default = "150" ++ ++ local ltime = s:taboption("general", Value, "leasetime", translate("Leasetime"), ++ translate("Expiry time of leased addresses, minimum is 2 minutes (2m).")) ++ ltime.rmempty = true ++ ltime.default = "12h" ++ ++ local dd = s:taboption("advanced", Flag, "dynamicdhcp", ++ translate("Dynamic DHCP"), ++ translate("Dynamically allocate DHCP addresses for clients. If disabled, only " .. ++ "clients having static leases will be served.")) ++ dd.default = dd.enabled ++ ++ s:taboption("advanced", Flag, "force", translate("Force"), ++ translate("Force DHCP on this network even if another server is detected.")) ++ ++ -- XXX: is this actually useful? ++ --s:taboption("advanced", Value, "name", translate("Name"), ++ -- translate("Define a name for this network.")) ++ ++ mask = s:taboption("advanced", Value, "netmask", ++ translate("IPv4-Netmask"), ++ translate("Override the netmask sent to clients. Normally it is calculated " .. ++ "from the subnet that is served.")) ++ ++ mask.optional = true ++ mask.datatype = "ip4addr" ++ ++ s:taboption("advanced", DynamicList, "dhcp_option", translate("DHCP-Options"), ++ translate("Define additional DHCP options, for example \"6,192.168.2.1," .. ++ "192.168.2.2\" which advertises different DNS servers to clients.")) ++ ++ for i, n in ipairs(s.children) do ++ if n ~= ignore then ++ n:depends("ignore", "") ++ end ++ end ++ ++ o = s:taboption("ipv6", ListValue, "ra", translate("Router Advertisement-Service")) ++ o:value("", translate("disabled")) ++ o:value("server", translate("server mode")) ++ o:value("relay", translate("relay mode")) ++ o:value("hybrid", translate("hybrid mode")) ++ ++ o = s:taboption("ipv6", ListValue, "dhcpv6", translate("DHCPv6-Service")) ++ o:value("", translate("disabled")) ++ o:value("server", translate("server mode")) ++ o:value("relay", translate("relay mode")) ++ o:value("hybrid", translate("hybrid mode")) ++ ++ o = s:taboption("ipv6", ListValue, "ndp", translate("NDP-Proxy")) ++ o:value("", translate("disabled")) ++ o:value("relay", translate("relay mode")) ++ o:value("hybrid", translate("hybrid mode")) ++ ++ o = s:taboption("ipv6", ListValue, "ra_management", translate("DHCPv6-Mode")) ++ o:value("", translate("stateless")) ++ o:value("1", translate("stateless + stateful")) ++ o:value("2", translate("stateful-only")) ++ o:depends("dhcpv6", "server") ++ o:depends("dhcpv6", "hybrid") ++ o.default = "1" ++ ++ o = s:taboption("ipv6", Flag, "ra_default", translate("Always announce default router"), ++ translate("Announce as default router even if no public prefix is available.")) ++ o:depends("ra", "server") ++ o:depends("ra", "hybrid") ++ ++ s:taboption("ipv6", DynamicList, "dns", translate("Announced DNS servers")) ++ s:taboption("ipv6", DynamicList, "domain", translate("Announced DNS domains")) ++ ++ else ++ m2 = nil ++ end ++end ++ ++ ++return m, m2 +diff --git a/feeds/luci/modules/luci-mod-admin-full/luasrc/model/cbi/admin_network/network.lua b/feeds/luci/modules/luci-mod-admin-full/luasrc/model/cbi/admin_network/network.lua +new file mode 100644 +index 0000000..2be88fc +--- /dev/null ++++ b/feeds/luci/modules/luci-mod-admin-full/luasrc/model/cbi/admin_network/network.lua +@@ -0,0 +1,71 @@ ++-- Copyright 2008 Steven Barth ++-- Copyright 2008 Jo-Philipp Wich ++-- Licensed to the public under the Apache License 2.0. ++ ++local fs = require "nixio.fs" ++ ++m = Map("network", translate("Interfaces")) ++m.pageaction = false ++m:section(SimpleSection).template = "admin_network/iface_overview" ++ ++-- Show ATM bridge section if we have the capabilities ++if fs.access("/usr/sbin/br2684ctl") then ++ atm = m:section(TypedSection, "atm-bridge", translate("ATM Bridges"), ++ translate("ATM bridges expose encapsulated ethernet in AAL5 " .. ++ "connections as virtual Linux network interfaces which can " .. ++ "be used in conjunction with DHCP or PPP to dial into the " .. ++ "provider network.")) ++ ++ atm.addremove = true ++ atm.anonymous = true ++ ++ atm.create = function(self, section) ++ local sid = TypedSection.create(self, section) ++ local max_unit = -1 ++ ++ m.uci:foreach("network", "atm-bridge", ++ function(s) ++ local u = tonumber(s.unit) ++ if u ~= nil and u > max_unit then ++ max_unit = u ++ end ++ end) ++ ++ m.uci:set("network", sid, "unit", max_unit + 1) ++ m.uci:set("network", sid, "atmdev", 0) ++ m.uci:set("network", sid, "encaps", "llc") ++ m.uci:set("network", sid, "payload", "bridged") ++ m.uci:set("network", sid, "vci", 35) ++ m.uci:set("network", sid, "vpi", 8) ++ ++ return sid ++ end ++ ++ atm:tab("general", translate("General Setup")) ++ atm:tab("advanced", translate("Advanced Settings")) ++ ++ vci = atm:taboption("general", Value, "vci", translate("ATM Virtual Channel Identifier (VCI)")) ++ vpi = atm:taboption("general", Value, "vpi", translate("ATM Virtual Path Identifier (VPI)")) ++ encaps = atm:taboption("general", ListValue, "encaps", translate("Encapsulation mode")) ++ encaps:value("llc", translate("LLC")) ++ encaps:value("vc", translate("VC-Mux")) ++ ++ atmdev = atm:taboption("advanced", Value, "atmdev", translate("ATM device number")) ++ unit = atm:taboption("advanced", Value, "unit", translate("Bridge unit number")) ++ payload = atm:taboption("advanced", ListValue, "payload", translate("Forwarding mode")) ++ payload:value("bridged", translate("bridged")) ++ payload:value("routed", translate("routed")) ++ m.pageaction = true ++end ++ ++local network = require "luci.model.network" ++if network:has_ipv6() then ++ local s = m:section(NamedSection, "globals", "globals", translate("Global network options")) ++ local o = s:option(Value, "ula_prefix", translate("IPv6 ULA-Prefix")) ++ o.datatype = "ip6addr" ++ o.rmempty = true ++ m.pageaction = true ++end ++ ++ ++return m +diff --git a/feeds/luci/modules/luci-mod-admin-full/luasrc/model/cbi/admin_network/proto_ahcp.lua b/feeds/luci/modules/luci-mod-admin-full/luasrc/model/cbi/admin_network/proto_ahcp.lua +new file mode 100644 +index 0000000..0818199 +--- /dev/null ++++ b/feeds/luci/modules/luci-mod-admin-full/luasrc/model/cbi/admin_network/proto_ahcp.lua +@@ -0,0 +1,67 @@ ++-- Copyright 2011 Jo-Philipp Wich ++-- Licensed to the public under the Apache License 2.0. ++ ++local map, section, net = ... ++ ++local device, apn, service, pincode, username, password ++local ipv6, maxwait, defaultroute, metric, peerdns, dns, ++ keepalive_failure, keepalive_interval, demand ++ ++ ++mca = s:taboption("ahcp", Value, "multicast_address", translate("Multicast address")) ++mca.optional = true ++mca.placeholder = "ff02::cca6:c0f9:e182:5359" ++mca.datatype = "ip6addr" ++mca:depends("proto", "ahcp") ++ ++port = s:taboption("ahcp", Value, "port", translate("Port")) ++port.optional = true ++port.placeholder = 5359 ++port.datatype = "port" ++port:depends("proto", "ahcp") ++ ++fam = s:taboption("ahcp", ListValue, "_family", translate("Protocol family")) ++fam:value("", translate("IPv4 and IPv6")) ++fam:value("ipv4", translate("IPv4 only")) ++fam:value("ipv6", translate("IPv6 only")) ++fam:depends("proto", "ahcp") ++ ++function fam.cfgvalue(self, section) ++ local v4 = m.uci:get_bool("network", section, "ipv4_only") ++ local v6 = m.uci:get_bool("network", section, "ipv6_only") ++ if v4 then ++ return "ipv4" ++ elseif v6 then ++ return "ipv6" ++ end ++ return "" ++end ++ ++function fam.write(self, section, value) ++ if value == "ipv4" then ++ m.uci:set("network", section, "ipv4_only", "true") ++ m.uci:delete("network", section, "ipv6_only") ++ elseif value == "ipv6" then ++ m.uci:set("network", section, "ipv6_only", "true") ++ m.uci:delete("network", section, "ipv4_only") ++ end ++end ++ ++function fam.remove(self, section) ++ m.uci:delete("network", section, "ipv4_only") ++ m.uci:delete("network", section, "ipv6_only") ++end ++ ++nodns = s:taboption("ahcp", Flag, "no_dns", translate("Disable DNS setup")) ++nodns.optional = true ++nodns.enabled = "true" ++nodns.disabled = "false" ++nodns.default = nodns.disabled ++nodns:depends("proto", "ahcp") ++ ++ltime = s:taboption("ahcp", Value, "lease_time", translate("Lease validity time")) ++ltime.optional = true ++ltime.placeholder = 3666 ++ltime.datatype = "uinteger" ++ltime:depends("proto", "ahcp") ++ +diff --git a/feeds/luci/modules/luci-mod-admin-full/luasrc/model/cbi/admin_network/routes.lua b/feeds/luci/modules/luci-mod-admin-full/luasrc/model/cbi/admin_network/routes.lua +new file mode 100644 +index 0000000..ac02b15 +--- /dev/null ++++ b/feeds/luci/modules/luci-mod-admin-full/luasrc/model/cbi/admin_network/routes.lua +@@ -0,0 +1,74 @@ ++-- Copyright 2008 Steven Barth ++-- Licensed to the public under the Apache License 2.0. ++ ++local wa = require "luci.tools.webadmin" ++local fs = require "nixio.fs" ++ ++m = Map("network", ++ translate("Routes"), ++ translate("Routes specify over which interface and gateway a certain host or network " .. ++ "can be reached.")) ++ ++s = m:section(TypedSection, "route", translate("Static IPv4 Routes")) ++s.addremove = true ++s.anonymous = true ++ ++s.template = "cbi/tblsection" ++ ++iface = s:option(ListValue, "interface", translate("Interface")) ++wa.cbi_add_networks(iface) ++ ++t = s:option(Value, "target", translate("Target"), translate("Host-IP or Network")) ++t.datatype = "ip4addr" ++t.rmempty = false ++ ++n = s:option(Value, "netmask", translate("IPv4-Netmask"), translate("if target is a network")) ++n.placeholder = "255.255.255.255" ++n.datatype = "ip4addr" ++n.rmempty = true ++ ++g = s:option(Value, "gateway", translate("IPv4-Gateway")) ++g.datatype = "ip4addr" ++g.rmempty = true ++ ++metric = s:option(Value, "metric", translate("Metric")) ++metric.placeholder = 0 ++metric.datatype = "range(0,255)" ++metric.rmempty = true ++ ++mtu = s:option(Value, "mtu", translate("MTU")) ++mtu.placeholder = 1500 ++mtu.datatype = "range(64,9000)" ++mtu.rmempty = true ++ ++if fs.access("/proc/net/ipv6_route") then ++ s = m:section(TypedSection, "route6", translate("Static IPv6 Routes")) ++ s.addremove = true ++ s.anonymous = true ++ ++ s.template = "cbi/tblsection" ++ ++ iface = s:option(ListValue, "interface", translate("Interface")) ++ wa.cbi_add_networks(iface) ++ ++ t = s:option(Value, "target", translate("Target"), translate("IPv6-Address or Network (CIDR)")) ++ t.datatype = "ip6addr" ++ t.rmempty = false ++ ++ g = s:option(Value, "gateway", translate("IPv6-Gateway")) ++ g.datatype = "ip6addr" ++ g.rmempty = true ++ ++ metric = s:option(Value, "metric", translate("Metric")) ++ metric.placeholder = 0 ++ metric.datatype = "range(0,65535)" -- XXX: not sure ++ metric.rmempty = true ++ ++ mtu = s:option(Value, "mtu", translate("MTU")) ++ mtu.placeholder = 1500 ++ mtu.datatype = "range(64,9000)" ++ mtu.rmempty = true ++end ++ ++ ++return m +diff --git a/feeds/luci/modules/luci-mod-admin-full/luasrc/model/cbi/admin_network/vlan.lua b/feeds/luci/modules/luci-mod-admin-full/luasrc/model/cbi/admin_network/vlan.lua +new file mode 100644 +index 0000000..40f8014 +--- /dev/null ++++ b/feeds/luci/modules/luci-mod-admin-full/luasrc/model/cbi/admin_network/vlan.lua +@@ -0,0 +1,305 @@ ++-- Copyright 2008 Steven Barth ++-- Copyright 2010-2011 Jo-Philipp Wich ++-- Licensed to the public under the Apache License 2.0. ++ ++m = Map("network", translate("Switch"), translate("The network ports on this device can be combined to several VLANs in which computers can communicate directly with each other. VLANs are often used to separate different network segments. Often there is by default one Uplink port for a connection to the next greater network like the internet and other ports for a local network.")) ++ ++local fs = require "nixio.fs" ++local switches = { } ++ ++m.uci:foreach("network", "switch", ++ function(x) ++ local sid = x['.name'] ++ local switch_name = x.name or sid ++ local has_vlan = nil ++ local has_learn = nil ++ local has_vlan4k = nil ++ local has_jumbo3 = nil ++ local has_mirror = nil ++ local min_vid = 0 ++ local max_vid = 16 ++ local num_vlans = 16 ++ local cpu_port = tonumber(fs.readfile("/proc/switch/eth0/cpuport") or 5) ++ local num_ports = cpu_port + 1 ++ ++ local switch_title ++ local enable_vlan4k = false ++ ++ -- Parse some common switch properties from swconfig help output. ++ local swc = io.popen("swconfig dev %q help 2>/dev/null" % switch_name) ++ if swc then ++ ++ local is_port_attr = false ++ local is_vlan_attr = false ++ ++ while true do ++ local line = swc:read("*l") ++ if not line then break end ++ ++ if line:match("^%s+%-%-vlan") then ++ is_vlan_attr = true ++ ++ elseif line:match("^%s+%-%-port") then ++ is_vlan_attr = false ++ is_port_attr = true ++ ++ elseif line:match("cpu @") then ++ switch_title = line:match("^switch%d: %w+%((.-)%)") ++ num_ports, cpu_port, num_vlans = ++ line:match("ports: (%d+) %(cpu @ (%d+)%), vlans: (%d+)") ++ ++ num_ports = tonumber(num_ports) or 6 ++ num_vlans = tonumber(num_vlans) or 16 ++ cpu_port = tonumber(cpu_port) or 5 ++ min_vid = 1 ++ ++ elseif line:match(": pvid") or line:match(": tag") or line:match(": vid") then ++ if is_vlan_attr then has_vlan4k = line:match(": (%w+)") end ++ ++ elseif line:match(": enable_vlan4k") then ++ enable_vlan4k = true ++ ++ elseif line:match(": enable_vlan") then ++ has_vlan = "enable_vlan" ++ ++ elseif line:match(": enable_learning") then ++ has_learn = "enable_learning" ++ ++ elseif line:match(": enable_mirror_rx") then ++ has_mirror = "enable_mirror_rx" ++ ++ elseif line:match(": max_length") then ++ has_jumbo3 = "max_length" ++ end ++ end ++ ++ swc:close() ++ end ++ ++ ++ -- Switch properties ++ s = m:section(NamedSection, x['.name'], "switch", ++ switch_title and translatef("Switch %q (%s)", switch_name, switch_title) ++ or translatef("Switch %q", switch_name)) ++ ++ s.addremove = false ++ ++ if has_vlan then ++ s:option(Flag, has_vlan, translate("Enable VLAN functionality")) ++ end ++ ++ if has_learn then ++ x = s:option(Flag, has_learn, translate("Enable learning and aging")) ++ x.default = x.enabled ++ end ++ ++ if has_jumbo3 then ++ x = s:option(Flag, has_jumbo3, translate("Enable Jumbo Frame passthrough")) ++ x.enabled = "3" ++ x.rmempty = true ++ end ++ ++ -- Does this switch support port mirroring? ++ if has_mirror then ++ s:option(Flag, "enable_mirror_rx", translate("Enable mirroring of incoming packets")) ++ s:option(Flag, "enable_mirror_tx", translate("Enable mirroring of outgoing packets")) ++ ++ local sp = s:option(ListValue, "mirror_source_port", translate("Mirror source port")) ++ local mp = s:option(ListValue, "mirror_monitor_port", translate("Mirror monitor port")) ++ ++ local pt ++ for pt = 0, num_ports - 1 do ++ local name ++ ++ name = (pt == cpu_port) and translate("CPU") or translatef("Port %d", pt) ++ ++ sp:value(pt, name) ++ mp:value(pt, name) ++ end ++ end ++ ++ -- VLAN table ++ s = m:section(TypedSection, "switch_vlan", ++ switch_title and translatef("VLANs on %q (%s)", switch_name, switch_title) ++ or translatef("VLANs on %q", switch_name)) ++ ++ s.template = "cbi/tblsection" ++ s.addremove = true ++ s.anonymous = true ++ ++ -- Filter by switch ++ s.filter = function(self, section) ++ local device = m:get(section, "device") ++ return (device and device == switch_name) ++ end ++ ++ -- Override cfgsections callback to enforce row ordering by vlan id. ++ s.cfgsections = function(self) ++ local osections = TypedSection.cfgsections(self) ++ local sections = { } ++ local section ++ ++ for _, section in luci.util.spairs( ++ osections, ++ function(a, b) ++ return (tonumber(m:get(osections[a], has_vlan4k or "vlan")) or 9999) ++ < (tonumber(m:get(osections[b], has_vlan4k or "vlan")) or 9999) ++ end ++ ) do ++ sections[#sections+1] = section ++ end ++ ++ return sections ++ end ++ ++ -- When creating a new vlan, preset it with the highest found vid + 1. ++ s.create = function(self, section, origin) ++ -- Filter by switch ++ if m:get(origin, "device") ~= switch_name then ++ return ++ end ++ ++ local sid = TypedSection.create(self, section) ++ ++ local max_nr = 0 ++ local max_id = 0 ++ ++ m.uci:foreach("network", "switch_vlan", ++ function(s) ++ if s.device == switch_name then ++ local nr = tonumber(s.vlan) ++ local id = has_vlan4k and tonumber(s[has_vlan4k]) ++ if nr ~= nil and nr > max_nr then max_nr = nr end ++ if id ~= nil and id > max_id then max_id = id end ++ end ++ end) ++ ++ m:set(sid, "device", switch_name) ++ m:set(sid, "vlan", max_nr + 1) ++ ++ if has_vlan4k then ++ m:set(sid, has_vlan4k, max_id + 1) ++ end ++ ++ return sid ++ end ++ ++ ++ local port_opts = { } ++ local untagged = { } ++ ++ -- Parse current tagging state from the "ports" option. ++ local portvalue = function(self, section) ++ local pt ++ for pt in (m:get(section, "ports") or ""):gmatch("%w+") do ++ local pc, tu = pt:match("^(%d+)([tu]*)") ++ if pc == self.option then return (#tu > 0) and tu or "u" end ++ end ++ return "" ++ end ++ ++ -- Validate port tagging. Ensure that a port is only untagged once, ++ -- bail out if not. ++ local portvalidate = function(self, value, section) ++ -- ensure that the ports appears untagged only once ++ if value == "u" then ++ if not untagged[self.option] then ++ untagged[self.option] = true ++ elseif min_vid > 0 or tonumber(self.option) ~= cpu_port then -- enable multiple untagged cpu ports due to weird broadcom default setup ++ return nil, ++ translatef("Port %d is untagged in multiple VLANs!", tonumber(self.option) + 1) ++ end ++ end ++ return value ++ end ++ ++ ++ local vid = s:option(Value, has_vlan4k or "vlan", "VLAN ID", "
    " % switch_name) ++ local mx_vid = has_vlan4k and 4094 or (num_vlans - 1) ++ ++ vid.rmempty = false ++ vid.forcewrite = true ++ vid.vlan_used = { } ++ vid.datatype = "and(uinteger,range("..min_vid..","..mx_vid.."))" ++ ++ -- Validate user provided VLAN ID, make sure its within the bounds ++ -- allowed by the switch. ++ vid.validate = function(self, value, section) ++ local v = tonumber(value) ++ local m = has_vlan4k and 4094 or (num_vlans - 1) ++ if v ~= nil and v >= min_vid and v <= m then ++ if not self.vlan_used[v] then ++ self.vlan_used[v] = true ++ return value ++ else ++ return nil, ++ translatef("Invalid VLAN ID given! Only unique IDs are allowed") ++ end ++ else ++ return nil, ++ translatef("Invalid VLAN ID given! Only IDs between %d and %d are allowed.", min_vid, m) ++ end ++ end ++ ++ -- When writing the "vid" or "vlan" option, serialize the port states ++ -- as well and write them as "ports" option to uci. ++ vid.write = function(self, section, value) ++ local o ++ local p = { } ++ ++ for _, o in ipairs(port_opts) do ++ local v = o:formvalue(section) ++ if v == "t" then ++ p[#p+1] = o.option .. v ++ elseif v == "u" then ++ p[#p+1] = o.option ++ end ++ end ++ ++ if enable_vlan4k then ++ m:set(sid, "enable_vlan4k", "1") ++ end ++ ++ m:set(section, "ports", table.concat(p, " ")) ++ return Value.write(self, section, value) ++ end ++ ++ -- Fallback to "vlan" option if "vid" option is supported but unset. ++ vid.cfgvalue = function(self, section) ++ return m:get(section, has_vlan4k or "vlan") ++ or m:get(section, "vlan") ++ end ++ ++ -- Build per-port off/untagged/tagged choice lists. ++ local pt ++ for pt = 0, num_ports - 1 do ++ local title ++ if pt == cpu_port then ++ title = translate("CPU") ++ else ++ title = translatef("Port %d", pt) ++ end ++ ++ local po = s:option(ListValue, tostring(pt), title) ++ ++ po:value("", translate("off")) ++ po:value("u", translate("untagged")) ++ po:value("t", translate("tagged")) ++ ++ po.cfgvalue = portvalue ++ po.validate = portvalidate ++ po.write = function() end ++ ++ port_opts[#port_opts+1] = po ++ end ++ ++ switches[#switches+1] = switch_name ++ end ++) ++ ++-- Switch status template ++s = m:section(SimpleSection) ++s.template = "admin_network/switch_status" ++s.switches = switches ++ ++return m +diff --git a/feeds/luci/modules/luci-mod-admin-full/luasrc/model/cbi/admin_network/wifi.lua b/feeds/luci/modules/luci-mod-admin-full/luasrc/model/cbi/admin_network/wifi.lua +new file mode 100644 +index 0000000..9a2bd5d +--- /dev/null ++++ b/feeds/luci/modules/luci-mod-admin-full/luasrc/model/cbi/admin_network/wifi.lua +@@ -0,0 +1,946 @@ ++-- Copyright 2008 Steven Barth ++-- Licensed to the public under the Apache License 2.0. ++ ++local wa = require "luci.tools.webadmin" ++local nw = require "luci.model.network" ++local ut = require "luci.util" ++local nt = require "luci.sys".net ++local fs = require "nixio.fs" ++ ++arg[1] = arg[1] or "" ++ ++m = Map("wireless", "", ++ translate("The Device Configuration section covers physical settings of the radio " .. ++ "hardware such as channel, transmit power or antenna selection which are shared among all " .. ++ "defined wireless networks (if the radio hardware is multi-SSID capable). Per network settings " .. ++ "like encryption or operation mode are grouped in the Interface Configuration.")) ++ ++m:chain("network") ++m:chain("firewall") ++m.redirect = luci.dispatcher.build_url("admin/network/wireless") ++ ++local ifsection ++ ++function m.on_commit(map) ++ local wnet = nw:get_wifinet(arg[1]) ++ if ifsection and wnet then ++ ifsection.section = wnet.sid ++ m.title = luci.util.pcdata(wnet:get_i18n()) ++ end ++end ++ ++nw.init(m.uci) ++ ++local wnet = nw:get_wifinet(arg[1]) ++local wdev = wnet and wnet:get_device() ++ ++-- redirect to overview page if network does not exist anymore (e.g. after a revert) ++if not wnet or not wdev then ++ luci.http.redirect(luci.dispatcher.build_url("admin/network/wireless")) ++ return ++end ++ ++-- wireless toggle was requested, commit and reload page ++function m.parse(map) ++ if m:formvalue("cbid.wireless.%s.__toggle" % wdev:name()) then ++ if wdev:get("disabled") == "1" or wnet:get("disabled") == "1" then ++ wnet:set("disabled", nil) ++ else ++ wnet:set("disabled", "1") ++ end ++ wdev:set("disabled", nil) ++ ++ nw:commit("wireless") ++ luci.sys.call("(env -i /bin/ubus call network reload) >/dev/null 2>/dev/null") ++ ++ luci.http.redirect(luci.dispatcher.build_url("admin/network/wireless", arg[1])) ++ return ++ end ++ Map.parse(map) ++end ++ ++m.title = luci.util.pcdata(wnet:get_i18n()) ++ ++ ++local function txpower_list(iw) ++ local list = iw.txpwrlist or { } ++ local off = tonumber(iw.txpower_offset) or 0 ++ local new = { } ++ local prev = -1 ++ local _, val ++ for _, val in ipairs(list) do ++ local dbm = val.dbm + off ++ local mw = math.floor(10 ^ (dbm / 10)) ++ if mw ~= prev then ++ prev = mw ++ new[#new+1] = { ++ display_dbm = dbm, ++ display_mw = mw, ++ driver_dbm = val.dbm, ++ driver_mw = val.mw ++ } ++ end ++ end ++ return new ++end ++ ++local function txpower_current(pwr, list) ++ pwr = tonumber(pwr) ++ if pwr ~= nil then ++ local _, item ++ for _, item in ipairs(list) do ++ if item.driver_dbm >= pwr then ++ return item.driver_dbm ++ end ++ end ++ end ++ return (list[#list] and list[#list].driver_dbm) or pwr or 0 ++end ++ ++local iw = luci.sys.wifi.getiwinfo(arg[1]) ++local hw_modes = iw.hwmodelist or { } ++local tx_power_list = txpower_list(iw) ++local tx_power_cur = txpower_current(wdev:get("txpower"), tx_power_list) ++ ++s = m:section(NamedSection, wdev:name(), "wifi-device", translate("Device Configuration")) ++s.addremove = false ++ ++s:tab("general", translate("General Setup")) ++s:tab("macfilter", translate("MAC-Filter")) ++s:tab("advanced", translate("Advanced Settings")) ++ ++--[[ ++back = s:option(DummyValue, "_overview", translate("Overview")) ++back.value = "" ++back.titleref = luci.dispatcher.build_url("admin", "network", "wireless") ++]] ++ ++st = s:taboption("general", DummyValue, "__status", translate("Status")) ++st.template = "admin_network/wifi_status" ++st.ifname = arg[1] ++ ++en = s:taboption("general", Button, "__toggle") ++ ++if wdev:get("disabled") == "1" or wnet:get("disabled") == "1" then ++ en.title = translate("Wireless network is disabled") ++ en.inputtitle = translate("Enable") ++ en.inputstyle = "apply" ++else ++ en.title = translate("Wireless network is enabled") ++ en.inputtitle = translate("Disable") ++ en.inputstyle = "reset" ++end ++ ++ ++local hwtype = wdev:get("type") ++ ++-- NanoFoo ++local nsantenna = wdev:get("antenna") ++ ++-- Check whether there are client interfaces on the same radio, ++-- if yes, lock the channel choice as these stations will dicatate the freq ++local found_sta = nil ++local _, net ++if wnet:mode() ~= "sta" then ++ for _, net in ipairs(wdev:get_wifinets()) do ++ if net:mode() == "sta" and net:get("disabled") ~= "1" then ++ if not found_sta then ++ found_sta = {} ++ found_sta.channel = net:channel() ++ found_sta.names = {} ++ end ++ found_sta.names[#found_sta.names+1] = net:shortname() ++ end ++ end ++end ++ ++if found_sta then ++ ch = s:taboption("general", DummyValue, "choice", translate("Channel")) ++ ch.value = translatef("Locked to channel %d used by: %s", ++ found_sta.channel, table.concat(found_sta.names, ", ")) ++else ++ ch = s:taboption("general", Value, "_mode_freq", '
    '..translate("Operating frequency")) ++ ch.hwmodes = iw.hwmodelist ++ ch.freqlist = iw.freqlist ++ ch.template = "cbi/wireless_modefreq" ++ ++ function ch.cfgvalue(self, section) ++ return { ++ m:get(section, "hwmode") or "", ++ m:get(section, "channel") or "auto", ++ m:get(section, "htmode") or "" ++ } ++ end ++ ++ function ch.formvalue(self, section) ++ return { ++ m:formvalue(self:cbid(section) .. ".band") or (iw.hwmodelist.g and "11g" or "11a"), ++ m:formvalue(self:cbid(section) .. ".channel") or "auto", ++ m:formvalue(self:cbid(section) .. ".htmode") or "" ++ } ++ end ++ ++ function ch.write(self, section, value) ++ m:set(section, "hwmode", value[1]) ++ m:set(section, "channel", value[2]) ++ m:set(section, "htmode", value[3]) ++ end ++end ++ ++------------------- MAC80211 Device ------------------ ++ ++if hwtype == "mac80211" then ++ if #tx_power_list > 1 then ++ tp = s:taboption("general", ListValue, ++ "txpower", translate("Transmit Power"), "dBm") ++ tp.rmempty = true ++ tp.default = tx_power_cur ++ function tp.cfgvalue(...) ++ return txpower_current(Value.cfgvalue(...), tx_power_list) ++ end ++ ++ for _, p in ipairs(tx_power_list) do ++ tp:value(p.driver_dbm, "%i dBm (%i mW)" ++ %{ p.display_dbm, p.display_mw }) ++ end ++ end ++ ++ local cl = iw and iw.countrylist ++ if cl and #cl > 0 then ++ cc = s:taboption("advanced", ListValue, "country", translate("Country Code"), translate("Use ISO/IEC 3166 alpha2 country codes.")) ++ cc.default = tostring(iw and iw.country or "00") ++ for _, c in ipairs(cl) do ++ cc:value(c.alpha2, "%s - %s" %{ c.alpha2, c.name }) ++ end ++ else ++ s:taboption("advanced", Value, "country", translate("Country Code"), translate("Use ISO/IEC 3166 alpha2 country codes.")) ++ end ++ ++ s:taboption("advanced", Value, "distance", translate("Distance Optimization"), ++ translate("Distance to farthest network member in meters.")) ++ ++ -- external antenna profiles ++ local eal = iw and iw.extant ++ if eal and #eal > 0 then ++ ea = s:taboption("advanced", ListValue, "extant", translate("Antenna Configuration")) ++ for _, eap in ipairs(eal) do ++ ea:value(eap.id, "%s (%s)" %{ eap.name, eap.description }) ++ if eap.selected then ++ ea.default = eap.id ++ end ++ end ++ end ++ ++ s:taboption("advanced", Value, "frag", translate("Fragmentation Threshold")) ++ s:taboption("advanced", Value, "rts", translate("RTS/CTS Threshold")) ++end ++ ++ ++------------------- Madwifi Device ------------------ ++ ++if hwtype == "atheros" then ++ tp = s:taboption("general", ++ (#tx_power_list > 0) and ListValue or Value, ++ "txpower", translate("Transmit Power"), "dBm") ++ ++ tp.rmempty = true ++ tp.default = tx_power_cur ++ ++ function tp.cfgvalue(...) ++ return txpower_current(Value.cfgvalue(...), tx_power_list) ++ end ++ ++ for _, p in ipairs(tx_power_list) do ++ tp:value(p.driver_dbm, "%i dBm (%i mW)" ++ %{ p.display_dbm, p.display_mw }) ++ end ++ ++ s:taboption("advanced", Flag, "diversity", translate("Diversity")).rmempty = false ++ ++ if not nsantenna then ++ ant1 = s:taboption("advanced", ListValue, "txantenna", translate("Transmitter Antenna")) ++ ant1.widget = "radio" ++ ant1.orientation = "horizontal" ++ ant1:depends("diversity", "") ++ ant1:value("0", translate("auto")) ++ ant1:value("1", translate("Antenna 1")) ++ ant1:value("2", translate("Antenna 2")) ++ ++ ant2 = s:taboption("advanced", ListValue, "rxantenna", translate("Receiver Antenna")) ++ ant2.widget = "radio" ++ ant2.orientation = "horizontal" ++ ant2:depends("diversity", "") ++ ant2:value("0", translate("auto")) ++ ant2:value("1", translate("Antenna 1")) ++ ant2:value("2", translate("Antenna 2")) ++ ++ else -- NanoFoo ++ local ant = s:taboption("advanced", ListValue, "antenna", translate("Transmitter Antenna")) ++ ant:value("auto") ++ ant:value("vertical") ++ ant:value("horizontal") ++ ant:value("external") ++ end ++ ++ s:taboption("advanced", Value, "distance", translate("Distance Optimization"), ++ translate("Distance to farthest network member in meters.")) ++ s:taboption("advanced", Value, "regdomain", translate("Regulatory Domain")) ++ s:taboption("advanced", Value, "country", translate("Country Code")) ++ s:taboption("advanced", Flag, "outdoor", translate("Outdoor Channels")) ++ ++ --s:option(Flag, "nosbeacon", translate("Disable HW-Beacon timer")) ++end ++ ++ ++ ++------------------- Broadcom Device ------------------ ++ ++if hwtype == "broadcom" then ++ tp = s:taboption("general", ++ (#tx_power_list > 0) and ListValue or Value, ++ "txpower", translate("Transmit Power"), "dBm") ++ ++ tp.rmempty = true ++ tp.default = tx_power_cur ++ ++ function tp.cfgvalue(...) ++ return txpower_current(Value.cfgvalue(...), tx_power_list) ++ end ++ ++ for _, p in ipairs(tx_power_list) do ++ tp:value(p.driver_dbm, "%i dBm (%i mW)" ++ %{ p.display_dbm, p.display_mw }) ++ end ++ ++ ant1 = s:taboption("advanced", ListValue, "txantenna", translate("Transmitter Antenna")) ++ ant1.widget = "radio" ++ ant1:depends("diversity", "") ++ ant1:value("3", translate("auto")) ++ ant1:value("0", translate("Antenna 1")) ++ ant1:value("1", translate("Antenna 2")) ++ ++ ant2 = s:taboption("advanced", ListValue, "rxantenna", translate("Receiver Antenna")) ++ ant2.widget = "radio" ++ ant2:depends("diversity", "") ++ ant2:value("3", translate("auto")) ++ ant2:value("0", translate("Antenna 1")) ++ ant2:value("1", translate("Antenna 2")) ++ ++ s:taboption("advanced", Flag, "frameburst", translate("Frame Bursting")) ++ ++ s:taboption("advanced", Value, "distance", translate("Distance Optimization")) ++ --s:option(Value, "slottime", translate("Slot time")) ++ ++ s:taboption("advanced", Value, "country", translate("Country Code")) ++ s:taboption("advanced", Value, "maxassoc", translate("Connection Limit")) ++end ++ ++ ++--------------------- HostAP Device --------------------- ++ ++if hwtype == "prism2" then ++ s:taboption("advanced", Value, "txpower", translate("Transmit Power"), "att units").rmempty = true ++ ++ s:taboption("advanced", Flag, "diversity", translate("Diversity")).rmempty = false ++ ++ s:taboption("advanced", Value, "txantenna", translate("Transmitter Antenna")) ++ s:taboption("advanced", Value, "rxantenna", translate("Receiver Antenna")) ++end ++ ++ ++----------------------- Interface ----------------------- ++ ++s = m:section(NamedSection, wnet.sid, "wifi-iface", translate("Interface Configuration")) ++ifsection = s ++s.addremove = false ++s.anonymous = true ++s.defaults.device = wdev:name() ++ ++s:tab("general", translate("General Setup")) ++s:tab("encryption", translate("Wireless Security")) ++s:tab("macfilter", translate("MAC-Filter")) ++s:tab("advanced", translate("Advanced Settings")) ++ ++s:taboption("general", Value, "ssid", translate("ESSID")) ++ ++mode = s:taboption("general", ListValue, "mode", translate("Mode")) ++mode.override_values = true ++mode:value("ap", translate("Access Point")) ++mode:value("sta", translate("Client")) ++mode:value("adhoc", translate("Ad-Hoc")) ++ ++bssid = s:taboption("general", Value, "bssid", translate("BSSID")) ++ ++network = s:taboption("general", Value, "network", translate("Network"), ++ translate("Choose the network(s) you want to attach to this wireless interface or " .. ++ "fill out the create field to define a new network.")) ++ ++network.rmempty = true ++network.template = "cbi/network_netlist" ++network.widget = "checkbox" ++network.novirtual = true ++ ++function network.write(self, section, value) ++ local i = nw:get_interface(section) ++ if i then ++ if value == '-' then ++ value = m:formvalue(self:cbid(section) .. ".newnet") ++ if value and #value > 0 then ++ local n = nw:add_network(value, {proto="none"}) ++ if n then n:add_interface(i) end ++ else ++ local n = i:get_network() ++ if n then n:del_interface(i) end ++ end ++ else ++ local v ++ for _, v in ipairs(i:get_networks()) do ++ v:del_interface(i) ++ end ++ for v in ut.imatch(value) do ++ local n = nw:get_network(v) ++ if n then ++ if not n:is_empty() then ++ n:set("type", "bridge") ++ end ++ n:add_interface(i) ++ end ++ end ++ end ++ end ++end ++ ++-------------------- MAC80211 Interface ---------------------- ++ ++if hwtype == "mac80211" then ++ if fs.access("/usr/sbin/iw") then ++ mode:value("mesh", "802.11s") ++ end ++ ++ mode:value("ahdemo", translate("Pseudo Ad-Hoc (ahdemo)")) ++ mode:value("monitor", translate("Monitor")) ++ bssid:depends({mode="adhoc"}) ++ bssid:depends({mode="sta"}) ++ bssid:depends({mode="sta-wds"}) ++ ++ mp = s:taboption("macfilter", ListValue, "macfilter", translate("MAC-Address Filter")) ++ mp:depends({mode="ap"}) ++ mp:depends({mode="ap-wds"}) ++ mp:value("", translate("disable")) ++ mp:value("allow", translate("Allow listed only")) ++ mp:value("deny", translate("Allow all except listed")) ++ ++ ml = s:taboption("macfilter", DynamicList, "maclist", translate("MAC-List")) ++ ml.datatype = "macaddr" ++ ml:depends({macfilter="allow"}) ++ ml:depends({macfilter="deny"}) ++ nt.mac_hints(function(mac, name) ml:value(mac, "%s (%s)" %{ mac, name }) end) ++ ++ mode:value("ap-wds", "%s (%s)" % {translate("Access Point"), translate("WDS")}) ++ mode:value("sta-wds", "%s (%s)" % {translate("Client"), translate("WDS")}) ++ ++ function mode.write(self, section, value) ++ if value == "ap-wds" then ++ ListValue.write(self, section, "ap") ++ m.uci:set("wireless", section, "wds", 1) ++ elseif value == "sta-wds" then ++ ListValue.write(self, section, "sta") ++ m.uci:set("wireless", section, "wds", 1) ++ else ++ ListValue.write(self, section, value) ++ m.uci:delete("wireless", section, "wds") ++ end ++ end ++ ++ function mode.cfgvalue(self, section) ++ local mode = ListValue.cfgvalue(self, section) ++ local wds = m.uci:get("wireless", section, "wds") == "1" ++ ++ if mode == "ap" and wds then ++ return "ap-wds" ++ elseif mode == "sta" and wds then ++ return "sta-wds" ++ else ++ return mode ++ end ++ end ++ ++ hidden = s:taboption("general", Flag, "hidden", translate("Hide ESSID")) ++ hidden:depends({mode="ap"}) ++ hidden:depends({mode="ap-wds"}) ++ ++ wmm = s:taboption("general", Flag, "wmm", translate("WMM Mode")) ++ wmm:depends({mode="ap"}) ++ wmm:depends({mode="ap-wds"}) ++ wmm.default = wmm.enabled ++end ++ ++ ++ ++-------------------- Madwifi Interface ---------------------- ++ ++if hwtype == "atheros" then ++ mode:value("ahdemo", translate("Pseudo Ad-Hoc (ahdemo)")) ++ mode:value("monitor", translate("Monitor")) ++ mode:value("ap-wds", "%s (%s)" % {translate("Access Point"), translate("WDS")}) ++ mode:value("sta-wds", "%s (%s)" % {translate("Client"), translate("WDS")}) ++ mode:value("wds", translate("Static WDS")) ++ ++ function mode.write(self, section, value) ++ if value == "ap-wds" then ++ ListValue.write(self, section, "ap") ++ m.uci:set("wireless", section, "wds", 1) ++ elseif value == "sta-wds" then ++ ListValue.write(self, section, "sta") ++ m.uci:set("wireless", section, "wds", 1) ++ else ++ ListValue.write(self, section, value) ++ m.uci:delete("wireless", section, "wds") ++ end ++ end ++ ++ function mode.cfgvalue(self, section) ++ local mode = ListValue.cfgvalue(self, section) ++ local wds = m.uci:get("wireless", section, "wds") == "1" ++ ++ if mode == "ap" and wds then ++ return "ap-wds" ++ elseif mode == "sta" and wds then ++ return "sta-wds" ++ else ++ return mode ++ end ++ end ++ ++ bssid:depends({mode="adhoc"}) ++ bssid:depends({mode="ahdemo"}) ++ bssid:depends({mode="wds"}) ++ ++ wdssep = s:taboption("advanced", Flag, "wdssep", translate("Separate WDS")) ++ wdssep:depends({mode="ap-wds"}) ++ ++ s:taboption("advanced", Flag, "doth", "802.11h") ++ hidden = s:taboption("general", Flag, "hidden", translate("Hide ESSID")) ++ hidden:depends({mode="ap"}) ++ hidden:depends({mode="adhoc"}) ++ hidden:depends({mode="ap-wds"}) ++ hidden:depends({mode="sta-wds"}) ++ isolate = s:taboption("advanced", Flag, "isolate", translate("Separate Clients"), ++ translate("Prevents client-to-client communication")) ++ isolate:depends({mode="ap"}) ++ s:taboption("advanced", Flag, "bgscan", translate("Background Scan")) ++ ++ mp = s:taboption("macfilter", ListValue, "macpolicy", translate("MAC-Address Filter")) ++ mp:value("", translate("disable")) ++ mp:value("allow", translate("Allow listed only")) ++ mp:value("deny", translate("Allow all except listed")) ++ ++ ml = s:taboption("macfilter", DynamicList, "maclist", translate("MAC-List")) ++ ml.datatype = "macaddr" ++ ml:depends({macpolicy="allow"}) ++ ml:depends({macpolicy="deny"}) ++ nt.mac_hints(function(mac, name) ml:value(mac, "%s (%s)" %{ mac, name }) end) ++ ++ s:taboption("advanced", Value, "rate", translate("Transmission Rate")) ++ s:taboption("advanced", Value, "mcast_rate", translate("Multicast Rate")) ++ s:taboption("advanced", Value, "frag", translate("Fragmentation Threshold")) ++ s:taboption("advanced", Value, "rts", translate("RTS/CTS Threshold")) ++ s:taboption("advanced", Value, "minrate", translate("Minimum Rate")) ++ s:taboption("advanced", Value, "maxrate", translate("Maximum Rate")) ++ s:taboption("advanced", Flag, "compression", translate("Compression")) ++ ++ s:taboption("advanced", Flag, "bursting", translate("Frame Bursting")) ++ s:taboption("advanced", Flag, "turbo", translate("Turbo Mode")) ++ s:taboption("advanced", Flag, "ff", translate("Fast Frames")) ++ ++ s:taboption("advanced", Flag, "wmm", translate("WMM Mode")) ++ s:taboption("advanced", Flag, "xr", translate("XR Support")) ++ s:taboption("advanced", Flag, "ar", translate("AR Support")) ++ ++ local swm = s:taboption("advanced", Flag, "sw_merge", translate("Disable HW-Beacon timer")) ++ swm:depends({mode="adhoc"}) ++ ++ local nos = s:taboption("advanced", Flag, "nosbeacon", translate("Disable HW-Beacon timer")) ++ nos:depends({mode="sta"}) ++ nos:depends({mode="sta-wds"}) ++ ++ local probereq = s:taboption("advanced", Flag, "probereq", translate("Do not send probe responses")) ++ probereq.enabled = "0" ++ probereq.disabled = "1" ++end ++ ++ ++-------------------- Broadcom Interface ---------------------- ++ ++if hwtype == "broadcom" then ++ mode:value("wds", translate("WDS")) ++ mode:value("monitor", translate("Monitor")) ++ ++ hidden = s:taboption("general", Flag, "hidden", translate("Hide ESSID")) ++ hidden:depends({mode="ap"}) ++ hidden:depends({mode="adhoc"}) ++ hidden:depends({mode="wds"}) ++ ++ isolate = s:taboption("advanced", Flag, "isolate", translate("Separate Clients"), ++ translate("Prevents client-to-client communication")) ++ isolate:depends({mode="ap"}) ++ ++ s:taboption("advanced", Flag, "doth", "802.11h") ++ s:taboption("advanced", Flag, "wmm", translate("WMM Mode")) ++ ++ bssid:depends({mode="wds"}) ++ bssid:depends({mode="adhoc"}) ++end ++ ++ ++----------------------- HostAP Interface --------------------- ++ ++if hwtype == "prism2" then ++ mode:value("wds", translate("WDS")) ++ mode:value("monitor", translate("Monitor")) ++ ++ hidden = s:taboption("general", Flag, "hidden", translate("Hide ESSID")) ++ hidden:depends({mode="ap"}) ++ hidden:depends({mode="adhoc"}) ++ hidden:depends({mode="wds"}) ++ ++ bssid:depends({mode="sta"}) ++ ++ mp = s:taboption("macfilter", ListValue, "macpolicy", translate("MAC-Address Filter")) ++ mp:value("", translate("disable")) ++ mp:value("allow", translate("Allow listed only")) ++ mp:value("deny", translate("Allow all except listed")) ++ ml = s:taboption("macfilter", DynamicList, "maclist", translate("MAC-List")) ++ ml:depends({macpolicy="allow"}) ++ ml:depends({macpolicy="deny"}) ++ nt.mac_hints(function(mac, name) ml:value(mac, "%s (%s)" %{ mac, name }) end) ++ ++ s:taboption("advanced", Value, "rate", translate("Transmission Rate")) ++ s:taboption("advanced", Value, "frag", translate("Fragmentation Threshold")) ++ s:taboption("advanced", Value, "rts", translate("RTS/CTS Threshold")) ++end ++ ++ ++------------------- WiFI-Encryption ------------------- ++ ++encr = s:taboption("encryption", ListValue, "encryption", translate("Encryption")) ++encr.override_values = true ++encr.override_depends = true ++encr:depends({mode="ap"}) ++encr:depends({mode="sta"}) ++encr:depends({mode="adhoc"}) ++encr:depends({mode="ahdemo"}) ++encr:depends({mode="ap-wds"}) ++encr:depends({mode="sta-wds"}) ++encr:depends({mode="mesh"}) ++ ++cipher = s:taboption("encryption", ListValue, "cipher", translate("Cipher")) ++cipher:depends({encryption="wpa"}) ++cipher:depends({encryption="wpa2"}) ++cipher:depends({encryption="psk"}) ++cipher:depends({encryption="psk2"}) ++cipher:depends({encryption="wpa-mixed"}) ++cipher:depends({encryption="psk-mixed"}) ++cipher:value("auto", translate("auto")) ++cipher:value("ccmp", translate("Force CCMP (AES)")) ++cipher:value("tkip", translate("Force TKIP")) ++cipher:value("tkip+ccmp", translate("Force TKIP and CCMP (AES)")) ++ ++function encr.cfgvalue(self, section) ++ local v = tostring(ListValue.cfgvalue(self, section)) ++ if v == "wep" then ++ return "wep-open" ++ elseif v and v:match("%+") then ++ return (v:gsub("%+.+$", "")) ++ end ++ return v ++end ++ ++function encr.write(self, section, value) ++ local e = tostring(encr:formvalue(section)) ++ local c = tostring(cipher:formvalue(section)) ++ if value == "wpa" or value == "wpa2" then ++ self.map.uci:delete("wireless", section, "key") ++ end ++ if e and (c == "tkip" or c == "ccmp" or c == "tkip+ccmp") then ++ e = e .. "+" .. c ++ end ++ self.map:set(section, "encryption", e) ++end ++ ++function cipher.cfgvalue(self, section) ++ local v = tostring(ListValue.cfgvalue(encr, section)) ++ if v and v:match("%+") then ++ v = v:gsub("^[^%+]+%+", "") ++ if v == "aes" then v = "ccmp" ++ elseif v == "tkip+aes" then v = "tkip+ccmp" ++ elseif v == "aes+tkip" then v = "tkip+ccmp" ++ elseif v == "ccmp+tkip" then v = "tkip+ccmp" ++ end ++ end ++ return v ++end ++ ++function cipher.write(self, section) ++ return encr:write(section) ++end ++ ++ ++encr:value("none", "No Encryption") ++encr:value("wep-open", translate("WEP Open System"), {mode="ap"}, {mode="sta"}, {mode="ap-wds"}, {mode="sta-wds"}, {mode="adhoc"}, {mode="ahdemo"}, {mode="wds"}) ++encr:value("wep-shared", translate("WEP Shared Key"), {mode="ap"}, {mode="sta"}, {mode="ap-wds"}, {mode="sta-wds"}, {mode="adhoc"}, {mode="ahdemo"}, {mode="wds"}) ++ ++if hwtype == "atheros" or hwtype == "mac80211" or hwtype == "prism2" then ++ local supplicant = fs.access("/usr/sbin/wpa_supplicant") ++ local hostapd = fs.access("/usr/sbin/hostapd") ++ ++ -- Probe EAP support ++ local has_ap_eap = (os.execute("hostapd -veap >/dev/null 2>/dev/null") == 0) ++ local has_sta_eap = (os.execute("wpa_supplicant -veap >/dev/null 2>/dev/null") == 0) ++ ++ if hostapd and supplicant then ++ encr:value("psk", "WPA-PSK", {mode="ap"}, {mode="sta"}, {mode="ap-wds"}, {mode="sta-wds"}) ++ encr:value("psk2", "WPA2-PSK", {mode="ap"}, {mode="sta"}, {mode="ap-wds"}, {mode="sta-wds"}) ++ encr:value("psk-mixed", "WPA-PSK/WPA2-PSK Mixed Mode", {mode="ap"}, {mode="sta"}, {mode="ap-wds"}, {mode="sta-wds"}) ++ if has_ap_eap and has_sta_eap then ++ encr:value("wpa", "WPA-EAP", {mode="ap"}, {mode="sta"}, {mode="ap-wds"}, {mode="sta-wds"}) ++ encr:value("wpa2", "WPA2-EAP", {mode="ap"}, {mode="sta"}, {mode="ap-wds"}, {mode="sta-wds"}) ++ end ++ elseif hostapd and not supplicant then ++ encr:value("psk", "WPA-PSK", {mode="ap"}, {mode="ap-wds"}) ++ encr:value("psk2", "WPA2-PSK", {mode="ap"}, {mode="ap-wds"}) ++ encr:value("psk-mixed", "WPA-PSK/WPA2-PSK Mixed Mode", {mode="ap"}, {mode="ap-wds"}) ++ if has_ap_eap then ++ encr:value("wpa", "WPA-EAP", {mode="ap"}, {mode="ap-wds"}) ++ encr:value("wpa2", "WPA2-EAP", {mode="ap"}, {mode="ap-wds"}) ++ end ++ encr.description = translate( ++ "WPA-Encryption requires wpa_supplicant (for client mode) or hostapd (for AP " .. ++ "and ad-hoc mode) to be installed." ++ ) ++ elseif not hostapd and supplicant then ++ encr:value("psk", "WPA-PSK", {mode="sta"}, {mode="sta-wds"}) ++ encr:value("psk2", "WPA2-PSK", {mode="sta"}, {mode="sta-wds"}) ++ encr:value("psk-mixed", "WPA-PSK/WPA2-PSK Mixed Mode", {mode="sta"}, {mode="sta-wds"}) ++ if has_sta_eap then ++ encr:value("wpa", "WPA-EAP", {mode="sta"}, {mode="sta-wds"}) ++ encr:value("wpa2", "WPA2-EAP", {mode="sta"}, {mode="sta-wds"}) ++ end ++ encr.description = translate( ++ "WPA-Encryption requires wpa_supplicant (for client mode) or hostapd (for AP " .. ++ "and ad-hoc mode) to be installed." ++ ) ++ else ++ encr.description = translate( ++ "WPA-Encryption requires wpa_supplicant (for client mode) or hostapd (for AP " .. ++ "and ad-hoc mode) to be installed." ++ ) ++ end ++elseif hwtype == "broadcom" then ++ encr:value("psk", "WPA-PSK") ++ encr:value("psk2", "WPA2-PSK") ++ encr:value("psk+psk2", "WPA-PSK/WPA2-PSK Mixed Mode") ++end ++ ++auth_server = s:taboption("encryption", Value, "auth_server", translate("Radius-Authentication-Server")) ++auth_server:depends({mode="ap", encryption="wpa"}) ++auth_server:depends({mode="ap", encryption="wpa2"}) ++auth_server:depends({mode="ap-wds", encryption="wpa"}) ++auth_server:depends({mode="ap-wds", encryption="wpa2"}) ++auth_server.rmempty = true ++auth_server.datatype = "host" ++ ++auth_port = s:taboption("encryption", Value, "auth_port", translate("Radius-Authentication-Port"), translatef("Default %d", 1812)) ++auth_port:depends({mode="ap", encryption="wpa"}) ++auth_port:depends({mode="ap", encryption="wpa2"}) ++auth_port:depends({mode="ap-wds", encryption="wpa"}) ++auth_port:depends({mode="ap-wds", encryption="wpa2"}) ++auth_port.rmempty = true ++auth_port.datatype = "port" ++ ++auth_secret = s:taboption("encryption", Value, "auth_secret", translate("Radius-Authentication-Secret")) ++auth_secret:depends({mode="ap", encryption="wpa"}) ++auth_secret:depends({mode="ap", encryption="wpa2"}) ++auth_secret:depends({mode="ap-wds", encryption="wpa"}) ++auth_secret:depends({mode="ap-wds", encryption="wpa2"}) ++auth_secret.rmempty = true ++auth_secret.password = true ++ ++acct_server = s:taboption("encryption", Value, "acct_server", translate("Radius-Accounting-Server")) ++acct_server:depends({mode="ap", encryption="wpa"}) ++acct_server:depends({mode="ap", encryption="wpa2"}) ++acct_server:depends({mode="ap-wds", encryption="wpa"}) ++acct_server:depends({mode="ap-wds", encryption="wpa2"}) ++acct_server.rmempty = true ++acct_server.datatype = "host" ++ ++acct_port = s:taboption("encryption", Value, "acct_port", translate("Radius-Accounting-Port"), translatef("Default %d", 1813)) ++acct_port:depends({mode="ap", encryption="wpa"}) ++acct_port:depends({mode="ap", encryption="wpa2"}) ++acct_port:depends({mode="ap-wds", encryption="wpa"}) ++acct_port:depends({mode="ap-wds", encryption="wpa2"}) ++acct_port.rmempty = true ++acct_port.datatype = "port" ++ ++acct_secret = s:taboption("encryption", Value, "acct_secret", translate("Radius-Accounting-Secret")) ++acct_secret:depends({mode="ap", encryption="wpa"}) ++acct_secret:depends({mode="ap", encryption="wpa2"}) ++acct_secret:depends({mode="ap-wds", encryption="wpa"}) ++acct_secret:depends({mode="ap-wds", encryption="wpa2"}) ++acct_secret.rmempty = true ++acct_secret.password = true ++ ++wpakey = s:taboption("encryption", Value, "_wpa_key", translate("Key")) ++wpakey:depends("encryption", "psk") ++wpakey:depends("encryption", "psk2") ++wpakey:depends("encryption", "psk+psk2") ++wpakey:depends("encryption", "psk-mixed") ++wpakey.datatype = "wpakey" ++wpakey.rmempty = true ++wpakey.password = true ++ ++wpakey.cfgvalue = function(self, section, value) ++ local key = m.uci:get("wireless", section, "key") ++ if key == "1" or key == "2" or key == "3" or key == "4" then ++ return nil ++ end ++ return key ++end ++ ++wpakey.write = function(self, section, value) ++ self.map.uci:set("wireless", section, "key", value) ++ self.map.uci:delete("wireless", section, "key1") ++end ++ ++ ++wepslot = s:taboption("encryption", ListValue, "_wep_key", translate("Used Key Slot")) ++wepslot:depends("encryption", "wep-open") ++wepslot:depends("encryption", "wep-shared") ++wepslot:value("1", translatef("Key #%d", 1)) ++wepslot:value("2", translatef("Key #%d", 2)) ++wepslot:value("3", translatef("Key #%d", 3)) ++wepslot:value("4", translatef("Key #%d", 4)) ++ ++wepslot.cfgvalue = function(self, section) ++ local slot = tonumber(m.uci:get("wireless", section, "key")) ++ if not slot or slot < 1 or slot > 4 then ++ return 1 ++ end ++ return slot ++end ++ ++wepslot.write = function(self, section, value) ++ self.map.uci:set("wireless", section, "key", value) ++end ++ ++local slot ++for slot=1,4 do ++ wepkey = s:taboption("encryption", Value, "key" .. slot, translatef("Key #%d", slot)) ++ wepkey:depends("encryption", "wep-open") ++ wepkey:depends("encryption", "wep-shared") ++ wepkey.datatype = "wepkey" ++ wepkey.rmempty = true ++ wepkey.password = true ++ ++ function wepkey.write(self, section, value) ++ if value and (#value == 5 or #value == 13) then ++ value = "s:" .. value ++ end ++ return Value.write(self, section, value) ++ end ++end ++ ++ ++if hwtype == "atheros" or hwtype == "mac80211" or hwtype == "prism2" then ++ nasid = s:taboption("encryption", Value, "nasid", translate("NAS ID")) ++ nasid:depends({mode="ap", encryption="wpa"}) ++ nasid:depends({mode="ap", encryption="wpa2"}) ++ nasid:depends({mode="ap-wds", encryption="wpa"}) ++ nasid:depends({mode="ap-wds", encryption="wpa2"}) ++ nasid.rmempty = true ++ ++ eaptype = s:taboption("encryption", ListValue, "eap_type", translate("EAP-Method")) ++ eaptype:value("tls", "TLS") ++ eaptype:value("ttls", "TTLS") ++ eaptype:value("peap", "PEAP") ++ eaptype:depends({mode="sta", encryption="wpa"}) ++ eaptype:depends({mode="sta", encryption="wpa2"}) ++ eaptype:depends({mode="sta-wds", encryption="wpa"}) ++ eaptype:depends({mode="sta-wds", encryption="wpa2"}) ++ ++ cacert = s:taboption("encryption", FileUpload, "ca_cert", translate("Path to CA-Certificate")) ++ cacert:depends({mode="sta", encryption="wpa"}) ++ cacert:depends({mode="sta", encryption="wpa2"}) ++ cacert:depends({mode="sta-wds", encryption="wpa"}) ++ cacert:depends({mode="sta-wds", encryption="wpa2"}) ++ ++ clientcert = s:taboption("encryption", FileUpload, "client_cert", translate("Path to Client-Certificate")) ++ clientcert:depends({mode="sta", encryption="wpa"}) ++ clientcert:depends({mode="sta", encryption="wpa2"}) ++ clientcert:depends({mode="sta-wds", encryption="wpa"}) ++ clientcert:depends({mode="sta-wds", encryption="wpa2"}) ++ ++ privkey = s:taboption("encryption", FileUpload, "priv_key", translate("Path to Private Key")) ++ privkey:depends({mode="sta", eap_type="tls", encryption="wpa2"}) ++ privkey:depends({mode="sta", eap_type="tls", encryption="wpa"}) ++ privkey:depends({mode="sta-wds", eap_type="tls", encryption="wpa2"}) ++ privkey:depends({mode="sta-wds", eap_type="tls", encryption="wpa"}) ++ ++ privkeypwd = s:taboption("encryption", Value, "priv_key_pwd", translate("Password of Private Key")) ++ privkeypwd:depends({mode="sta", eap_type="tls", encryption="wpa2"}) ++ privkeypwd:depends({mode="sta", eap_type="tls", encryption="wpa"}) ++ privkeypwd:depends({mode="sta-wds", eap_type="tls", encryption="wpa2"}) ++ privkeypwd:depends({mode="sta-wds", eap_type="tls", encryption="wpa"}) ++ ++ ++ auth = s:taboption("encryption", Value, "auth", translate("Authentication")) ++ auth:value("PAP") ++ auth:value("CHAP") ++ auth:value("MSCHAP") ++ auth:value("MSCHAPV2") ++ auth:depends({mode="sta", eap_type="peap", encryption="wpa2"}) ++ auth:depends({mode="sta", eap_type="peap", encryption="wpa"}) ++ auth:depends({mode="sta", eap_type="ttls", encryption="wpa2"}) ++ auth:depends({mode="sta", eap_type="ttls", encryption="wpa"}) ++ auth:depends({mode="sta-wds", eap_type="peap", encryption="wpa2"}) ++ auth:depends({mode="sta-wds", eap_type="peap", encryption="wpa"}) ++ auth:depends({mode="sta-wds", eap_type="ttls", encryption="wpa2"}) ++ auth:depends({mode="sta-wds", eap_type="ttls", encryption="wpa"}) ++ ++ ++ identity = s:taboption("encryption", Value, "identity", translate("Identity")) ++ identity:depends({mode="sta", eap_type="peap", encryption="wpa2"}) ++ identity:depends({mode="sta", eap_type="peap", encryption="wpa"}) ++ identity:depends({mode="sta", eap_type="ttls", encryption="wpa2"}) ++ identity:depends({mode="sta", eap_type="ttls", encryption="wpa"}) ++ identity:depends({mode="sta-wds", eap_type="peap", encryption="wpa2"}) ++ identity:depends({mode="sta-wds", eap_type="peap", encryption="wpa"}) ++ identity:depends({mode="sta-wds", eap_type="ttls", encryption="wpa2"}) ++ identity:depends({mode="sta-wds", eap_type="ttls", encryption="wpa"}) ++ ++ password = s:taboption("encryption", Value, "password", translate("Password")) ++ password:depends({mode="sta", eap_type="peap", encryption="wpa2"}) ++ password:depends({mode="sta", eap_type="peap", encryption="wpa"}) ++ password:depends({mode="sta", eap_type="ttls", encryption="wpa2"}) ++ password:depends({mode="sta", eap_type="ttls", encryption="wpa"}) ++ password:depends({mode="sta-wds", eap_type="peap", encryption="wpa2"}) ++ password:depends({mode="sta-wds", eap_type="peap", encryption="wpa"}) ++ password:depends({mode="sta-wds", eap_type="ttls", encryption="wpa2"}) ++ password:depends({mode="sta-wds", eap_type="ttls", encryption="wpa"}) ++end ++ ++if hwtype == "atheros" or hwtype == "mac80211" or hwtype == "prism2" then ++ local wpasupplicant = fs.access("/usr/sbin/wpa_supplicant") ++ local hostcli = fs.access("/usr/sbin/hostapd_cli") ++ if hostcli and wpasupplicant then ++ wps = s:taboption("encryption", Flag, "wps_pushbutton", translate("Enable WPS pushbutton, requires WPA(2)-PSK")) ++ wps.enabled = "1" ++ wps.disabled = "0" ++ wps.rmempty = false ++ wps:depends("encryption", "psk") ++ wps:depends("encryption", "psk2") ++ wps:depends("encryption", "psk-mixed") ++ end ++end ++ ++return m +diff --git a/feeds/luci/modules/luci-mod-admin-full/luasrc/model/cbi/admin_network/wifi_add.lua b/feeds/luci/modules/luci-mod-admin-full/luasrc/model/cbi/admin_network/wifi_add.lua +new file mode 100644 +index 0000000..96b8b4d +--- /dev/null ++++ b/feeds/luci/modules/luci-mod-admin-full/luasrc/model/cbi/admin_network/wifi_add.lua +@@ -0,0 +1,173 @@ ++-- Copyright 2009 Jo-Philipp Wich ++-- Licensed to the public under the Apache License 2.0. ++ ++local fs = require "nixio.fs" ++local nw = require "luci.model.network" ++local fw = require "luci.model.firewall" ++local uci = require "luci.model.uci".cursor() ++local http = require "luci.http" ++ ++local iw = luci.sys.wifi.getiwinfo(http.formvalue("device")) ++ ++local has_firewall = fs.access("/etc/config/firewall") ++ ++if not iw then ++ luci.http.redirect(luci.dispatcher.build_url("admin/network/wireless")) ++ return ++end ++ ++m = SimpleForm("network", translate("Join Network: Settings")) ++m.cancel = translate("Back to scan results") ++m.reset = false ++ ++function m.on_cancel() ++ local dev = http.formvalue("device") ++ http.redirect(luci.dispatcher.build_url( ++ dev and "admin/network/wireless_join?device=" .. dev ++ or "admin/network/wireless" ++ )) ++end ++ ++nw.init(uci) ++fw.init(uci) ++ ++m.hidden = { ++ device = http.formvalue("device"), ++ join = http.formvalue("join"), ++ channel = http.formvalue("channel"), ++ mode = http.formvalue("mode"), ++ bssid = http.formvalue("bssid"), ++ wep = http.formvalue("wep"), ++ wpa_suites = http.formvalue("wpa_suites"), ++ wpa_version = http.formvalue("wpa_version") ++} ++ ++if iw and iw.mbssid_support then ++ replace = m:field(Flag, "replace", translate("Replace wireless configuration"), ++ translate("An additional network will be created if you leave this unchecked.")) ++ ++ function replace.cfgvalue() return "1" end ++else ++ replace = m:field(DummyValue, "replace", translate("Replace wireless configuration")) ++ replace.default = translate("The hardware is not multi-SSID capable and the existing " .. ++ "configuration will be replaced if you proceed.") ++ ++ function replace.formvalue() return "1" end ++end ++ ++if http.formvalue("wep") == "1" then ++ key = m:field(Value, "key", translate("WEP passphrase"), ++ translate("Specify the secret encryption key here.")) ++ ++ key.password = true ++ key.datatype = "wepkey" ++ ++elseif (tonumber(m.hidden.wpa_version) or 0) > 0 and ++ (m.hidden.wpa_suites == "PSK" or m.hidden.wpa_suites == "PSK2") ++then ++ key = m:field(Value, "key", translate("WPA passphrase"), ++ translate("Specify the secret encryption key here.")) ++ ++ key.password = true ++ key.datatype = "wpakey" ++ --m.hidden.wpa_suite = (tonumber(http.formvalue("wpa_version")) or 0) >= 2 and "psk2" or "psk" ++end ++ ++newnet = m:field(Value, "_netname_new", translate("Name of the new network"), ++ translate("The allowed characters are: A-Z, a-z, " .. ++ "0-9 and _" ++ )) ++ ++newnet.default = m.hidden.mode == "Ad-Hoc" and "mesh" or "wwan" ++newnet.datatype = "uciname" ++ ++if has_firewall then ++ fwzone = m:field(Value, "_fwzone", ++ translate("Create / Assign firewall-zone"), ++ translate("Choose the firewall zone you want to assign to this interface. Select unspecified to remove the interface from the associated zone or fill out the create field to define a new zone and attach the interface to it.")) ++ ++ fwzone.template = "cbi/firewall_zonelist" ++ fwzone.default = m.hidden.mode == "Ad-Hoc" and "mesh" or "wan" ++end ++ ++function newnet.parse(self, section) ++ local net, zone ++ ++ if has_firewall then ++ local zval = fwzone:formvalue(section) ++ zone = fw:get_zone(zval) ++ ++ if not zone and zval == '-' then ++ zval = m:formvalue(fwzone:cbid(section) .. ".newzone") ++ if zval and #zval > 0 then ++ zone = fw:add_zone(zval) ++ end ++ end ++ end ++ ++ local wdev = nw:get_wifidev(m.hidden.device) ++ ++ wdev:set("disabled", false) ++ wdev:set("channel", m.hidden.channel) ++ ++ if replace:formvalue(section) then ++ local n ++ for _, n in ipairs(wdev:get_wifinets()) do ++ wdev:del_wifinet(n) ++ end ++ end ++ ++ local wconf = { ++ device = m.hidden.device, ++ ssid = m.hidden.join, ++ mode = (m.hidden.mode == "Ad-Hoc" and "adhoc" or "sta") ++ } ++ ++ if m.hidden.wep == "1" then ++ wconf.encryption = "wep-open" ++ wconf.key = "1" ++ wconf.key1 = key and key:formvalue(section) or "" ++ elseif (tonumber(m.hidden.wpa_version) or 0) > 0 then ++ wconf.encryption = (tonumber(m.hidden.wpa_version) or 0) >= 2 and "psk2" or "psk" ++ wconf.key = key and key:formvalue(section) or "" ++ else ++ wconf.encryption = "none" ++ end ++ ++ if wconf.mode == "adhoc" or wconf.mode == "sta" then ++ wconf.bssid = m.hidden.bssid ++ end ++ ++ local value = self:formvalue(section) ++ net = nw:add_network(value, { proto = "dhcp" }) ++ ++ if not net then ++ self.error = { [section] = "missing" } ++ else ++ wconf.network = net:name() ++ ++ local wnet = wdev:add_wifinet(wconf) ++ if wnet then ++ if zone then ++ fw:del_network(net:name()) ++ zone:add_network(net:name()) ++ end ++ ++ uci:save("wireless") ++ uci:save("network") ++ uci:save("firewall") ++ ++ luci.http.redirect(wnet:adminlink()) ++ end ++ end ++end ++ ++if has_firewall then ++ function fwzone.cfgvalue(self, section) ++ self.iface = section ++ local z = fw:get_zone_by_network(section) ++ return z and z:name() ++ end ++end ++ ++return m +diff --git a/feeds/luci/modules/luci-mod-admin-full/luasrc/model/cbi/admin_status/processes.lua b/feeds/luci/modules/luci-mod-admin-full/luasrc/model/cbi/admin_status/processes.lua +new file mode 100644 +index 0000000..0a6e48f +--- /dev/null ++++ b/feeds/luci/modules/luci-mod-admin-full/luasrc/model/cbi/admin_status/processes.lua +@@ -0,0 +1,34 @@ ++-- Copyright 2008 Steven Barth ++-- Copyright 2008 Jo-Philipp Wich ++-- Licensed to the public under the Apache License 2.0. ++ ++f = SimpleForm("processes", translate("Processes"), translate("This list gives an overview over currently running system processes and their status.")) ++f.reset = false ++f.submit = false ++ ++t = f:section(Table, luci.sys.process.list()) ++t:option(DummyValue, "PID", translate("PID")) ++t:option(DummyValue, "USER", translate("Owner")) ++t:option(DummyValue, "COMMAND", translate("Command")) ++t:option(DummyValue, "%CPU", translate("CPU usage (%)")) ++t:option(DummyValue, "%MEM", translate("Memory usage (%)")) ++ ++hup = t:option(Button, "_hup", translate("Hang Up")) ++hup.inputstyle = "reload" ++function hup.write(self, section) ++ null, self.tag_error[section] = luci.sys.process.signal(section, 1) ++end ++ ++term = t:option(Button, "_term", translate("Terminate")) ++term.inputstyle = "remove" ++function term.write(self, section) ++ null, self.tag_error[section] = luci.sys.process.signal(section, 15) ++end ++ ++kill = t:option(Button, "_kill", translate("Kill")) ++kill.inputstyle = "reset" ++function kill.write(self, section) ++ null, self.tag_error[section] = luci.sys.process.signal(section, 9) ++end ++ ++return f +\ No newline at end of file +diff --git a/feeds/luci/modules/luci-mod-admin-full/luasrc/model/cbi/admin_system/admin.lua b/feeds/luci/modules/luci-mod-admin-full/luasrc/model/cbi/admin_system/admin.lua +new file mode 100644 +index 0000000..1e47564 +--- /dev/null ++++ b/feeds/luci/modules/luci-mod-admin-full/luasrc/model/cbi/admin_system/admin.lua +@@ -0,0 +1,119 @@ ++-- Copyright 2008 Steven Barth ++-- Copyright 2011 Jo-Philipp Wich ++-- Licensed to the public under the Apache License 2.0. ++ ++local fs = require "nixio.fs" ++ ++m = Map("system", translate("Router Password"), ++ translate("Changes the administrator password for accessing the device")) ++ ++s = m:section(TypedSection, "_dummy", "") ++s.addremove = false ++s.anonymous = true ++ ++pw1 = s:option(Value, "pw1", translate("Password")) ++pw1.password = true ++ ++pw2 = s:option(Value, "pw2", translate("Confirmation")) ++pw2.password = true ++ ++function s.cfgsections() ++ return { "_pass" } ++end ++ ++function m.on_commit(map) ++ local v1 = pw1:formvalue("_pass") ++ local v2 = pw2:formvalue("_pass") ++ ++ if v1 and v2 and #v1 > 0 and #v2 > 0 then ++ if v1 == v2 then ++ if luci.sys.user.setpasswd(luci.dispatcher.context.authuser, v1) == 0 then ++ m.message = translate("Password successfully changed!") ++ else ++ m.message = translate("Unknown Error, password not changed!") ++ end ++ else ++ m.message = translate("Given password confirmation did not match, password not changed!") ++ end ++ end ++end ++ ++ ++if fs.access("/etc/config/dropbear") then ++ ++m2 = Map("dropbear", translate("SSH Access"), ++ translate("Dropbear offers SSH network shell access and an integrated SCP server")) ++ ++s = m2:section(TypedSection, "dropbear", translate("Dropbear Instance")) ++s.anonymous = true ++s.addremove = true ++ ++ ++ni = s:option(Value, "Interface", translate("Interface"), ++ translate("Listen only on the given interface or, if unspecified, on all")) ++ ++ni.template = "cbi/network_netlist" ++ni.nocreate = true ++ni.unspecified = true ++ ++ ++pt = s:option(Value, "Port", translate("Port"), ++ translate("Specifies the listening port of this Dropbear instance")) ++ ++pt.datatype = "port" ++pt.default = 22 ++ ++ ++pa = s:option(Flag, "PasswordAuth", translate("Password authentication"), ++ translate("Allow SSH password authentication")) ++ ++pa.enabled = "on" ++pa.disabled = "off" ++pa.default = pa.enabled ++pa.rmempty = false ++ ++ ++ra = s:option(Flag, "RootPasswordAuth", translate("Allow root logins with password"), ++ translate("Allow the root user to login with password")) ++ ++ra.enabled = "on" ++ra.disabled = "off" ++ra.default = ra.enabled ++ ++ ++gp = s:option(Flag, "GatewayPorts", translate("Gateway ports"), ++ translate("Allow remote hosts to connect to local SSH forwarded ports")) ++ ++gp.enabled = "on" ++gp.disabled = "off" ++gp.default = gp.disabled ++ ++ ++s2 = m2:section(TypedSection, "_dummy", translate("SSH-Keys"), ++ translate("Here you can paste public SSH-Keys (one per line) for SSH public-key authentication.")) ++s2.addremove = false ++s2.anonymous = true ++s2.template = "cbi/tblsection" ++ ++function s2.cfgsections() ++ return { "_keys" } ++end ++ ++keys = s2:option(TextValue, "_data", "") ++keys.wrap = "off" ++keys.rows = 3 ++keys.rmempty = false ++ ++function keys.cfgvalue() ++ return fs.readfile("/etc/dropbear/authorized_keys") or "" ++end ++ ++function keys.write(self, section, value) ++ if value then ++ fs.writefile("/etc/dropbear/authorized_keys", value:gsub("\r\n", "\n")) ++ end ++end ++ ++end ++ ++return m, m2 +diff --git a/feeds/luci/modules/luci-mod-admin-full/luasrc/model/cbi/admin_system/backupfiles.lua b/feeds/luci/modules/luci-mod-admin-full/luasrc/model/cbi/admin_system/backupfiles.lua +new file mode 100644 +index 0000000..ee2401e +--- /dev/null ++++ b/feeds/luci/modules/luci-mod-admin-full/luasrc/model/cbi/admin_system/backupfiles.lua +@@ -0,0 +1,80 @@ ++-- Copyright 2008 Steven Barth ++-- Copyright 2011 Jo-Philipp Wich ++-- Licensed to the public under the Apache License 2.0. ++ ++if luci.http.formvalue("cbid.luci.1._list") then ++ luci.http.redirect(luci.dispatcher.build_url("admin/system/flashops/backupfiles") .. "?display=list") ++elseif luci.http.formvalue("cbid.luci.1._edit") then ++ luci.http.redirect(luci.dispatcher.build_url("admin/system/flashops/backupfiles") .. "?display=edit") ++ return ++end ++ ++m = SimpleForm("luci", translate("Backup file list")) ++m:append(Template("admin_system/backupfiles")) ++ ++if luci.http.formvalue("display") ~= "list" then ++ f = m:section(SimpleSection, nil, translate("This is a list of shell glob patterns for matching files and directories to include during sysupgrade. Modified files in /etc/config/ and certain other configurations are automatically preserved.")) ++ ++ l = f:option(Button, "_list", translate("Show current backup file list")) ++ l.inputtitle = translate("Open list...") ++ l.inputstyle = "apply" ++ ++ c = f:option(TextValue, "_custom") ++ c.rmempty = false ++ c.cols = 70 ++ c.rows = 30 ++ ++ c.cfgvalue = function(self, section) ++ return nixio.fs.readfile("/etc/sysupgrade.conf") ++ end ++ ++ c.write = function(self, section, value) ++ value = value:gsub("\r\n?", "\n") ++ return nixio.fs.writefile("/etc/sysupgrade.conf", value) ++ end ++else ++ m.submit = false ++ m.reset = false ++ ++ f = m:section(SimpleSection, nil, translate("Below is the determined list of files to backup. It consists of changed configuration files marked by opkg, essential base files and the user defined backup patterns.")) ++ ++ l = f:option(Button, "_edit", translate("Back to configuration")) ++ l.inputtitle = translate("Close list...") ++ l.inputstyle = "link" ++ ++ ++ d = f:option(DummyValue, "_detected") ++ d.rawhtml = true ++ d.cfgvalue = function(s) ++ local list = io.popen( ++ "( find $(sed -ne '/^[[:space:]]*$/d; /^#/d; p' /etc/sysupgrade.conf " .. ++ "/lib/upgrade/keep.d/* 2>/dev/null) -type f 2>/dev/null; " .. ++ "opkg list-changed-conffiles ) | sort -u" ++ ) ++ ++ if list then ++ local files = { "
      " } ++ ++ while true do ++ local ln = list:read("*l") ++ if not ln then ++ break ++ else ++ files[#files+1] = "
    • " ++ files[#files+1] = luci.util.pcdata(ln) ++ files[#files+1] = "
    • " ++ end ++ end ++ ++ list:close() ++ files[#files+1] = "
    " ++ ++ return table.concat(files, "") ++ end ++ ++ return "" .. translate("No files found") .. "" ++ end ++ ++end ++ ++return m +diff --git a/feeds/luci/modules/luci-mod-admin-full/luasrc/model/cbi/admin_system/buttons.lua b/feeds/luci/modules/luci-mod-admin-full/luasrc/model/cbi/admin_system/buttons.lua +new file mode 100644 +index 0000000..6a81d71 +--- /dev/null ++++ b/feeds/luci/modules/luci-mod-admin-full/luasrc/model/cbi/admin_system/buttons.lua +@@ -0,0 +1,27 @@ ++-- Copyright 2008 Steven Barth ++-- Licensed to the public under the Apache License 2.0. ++ ++m = Map("system", translate("Buttons"), ++ translate("This page allows the configuration of custom button actions")) ++ ++s = m:section(TypedSection, "button", "") ++s.anonymous = true ++s.addremove = true ++ ++s:option(Value, "button", translate("Name")) ++ ++act = s:option(ListValue, "action", ++ translate("Action"), ++ translate("Specifies the button state to handle")) ++ ++act:value("released") ++ ++s:option(Value, "handler", ++ translate("Handler"), ++ translate("Path to executable which handles the button event")) ++ ++min = s:option(Value, "min", translate("Minimum hold time")) ++min.rmempty = true ++ ++max = s:option(Value, "max", translate("Maximum hold time")) ++max.rmempty = true +diff --git a/feeds/luci/modules/luci-mod-admin-full/luasrc/model/cbi/admin_system/crontab.lua b/feeds/luci/modules/luci-mod-admin-full/luasrc/model/cbi/admin_system/crontab.lua +new file mode 100644 +index 0000000..bef9651 +--- /dev/null ++++ b/feeds/luci/modules/luci-mod-admin-full/luasrc/model/cbi/admin_system/crontab.lua +@@ -0,0 +1,27 @@ ++-- Copyright 2008 Steven Barth ++-- Copyright 2008-2013 Jo-Philipp Wich ++-- Licensed to the public under the Apache License 2.0. ++ ++local fs = require "nixio.fs" ++local cronfile = "/etc/crontabs/root" ++ ++f = SimpleForm("crontab", translate("Scheduled Tasks"), translate("This is the system crontab in which scheduled tasks can be defined.")) ++ ++t = f:field(TextValue, "crons") ++t.rmempty = true ++t.rows = 10 ++function t.cfgvalue() ++ return fs.readfile(cronfile) or "" ++end ++ ++function f.handle(self, state, data) ++ if state == FORM_VALID then ++ if data.crons then ++ fs.writefile(cronfile, data.crons:gsub("\r\n", "\n")) ++ luci.sys.call("/usr/bin/crontab %q" % cronfile) ++ end ++ end ++ return true ++end ++ ++return f +diff --git a/feeds/luci/modules/luci-mod-admin-full/luasrc/model/cbi/admin_system/fstab.lua b/feeds/luci/modules/luci-mod-admin-full/luasrc/model/cbi/admin_system/fstab.lua +new file mode 100644 +index 0000000..d4e834d +--- /dev/null ++++ b/feeds/luci/modules/luci-mod-admin-full/luasrc/model/cbi/admin_system/fstab.lua +@@ -0,0 +1,201 @@ ++-- Copyright 2008 Steven Barth ++-- Licensed to the public under the Apache License 2.0. ++ ++require("luci.tools.webadmin") ++ ++local fs = require "nixio.fs" ++local util = require "nixio.util" ++local tp = require "luci.template.parser" ++ ++local block = io.popen("block info", "r") ++local ln, dev, devices = nil, nil, {} ++ ++repeat ++ ln = block:read("*l") ++ dev = ln and ln:match("^/dev/(.-):") ++ ++ if dev then ++ local e, s, key, val = { } ++ ++ for key, val in ln:gmatch([[(%w+)="(.-)"]]) do ++ e[key:lower()] = val ++ devices[val] = e ++ end ++ ++ s = tonumber((fs.readfile("/sys/class/block/%s/size" % dev))) ++ ++ e.dev = "/dev/%s" % dev ++ e.size = s and math.floor(s / 2048) ++ ++ devices[e.dev] = e ++ end ++until not ln ++ ++block:close() ++ ++ ++m = Map("fstab", translate("Mount Points")) ++ ++local mounts = luci.sys.mounts() ++ ++v = m:section(Table, mounts, translate("Mounted file systems")) ++ ++fs = v:option(DummyValue, "fs", translate("Filesystem")) ++ ++mp = v:option(DummyValue, "mountpoint", translate("Mount Point")) ++ ++avail = v:option(DummyValue, "avail", translate("Available")) ++function avail.cfgvalue(self, section) ++ return luci.tools.webadmin.byte_format( ++ ( tonumber(mounts[section].available) or 0 ) * 1024 ++ ) .. " / " .. luci.tools.webadmin.byte_format( ++ ( tonumber(mounts[section].blocks) or 0 ) * 1024 ++ ) ++end ++ ++used = v:option(DummyValue, "used", translate("Used")) ++function used.cfgvalue(self, section) ++ return ( mounts[section].percent or "0%" ) .. " (" .. ++ luci.tools.webadmin.byte_format( ++ ( tonumber(mounts[section].used) or 0 ) * 1024 ++ ) .. ")" ++end ++ ++ ++ ++mount = m:section(TypedSection, "mount", translate("Mount Points"), translate("Mount Points define at which point a memory device will be attached to the filesystem")) ++mount.anonymous = true ++mount.addremove = true ++mount.template = "cbi/tblsection" ++mount.extedit = luci.dispatcher.build_url("admin/system/fstab/mount/%s") ++ ++mount.create = function(...) ++ local sid = TypedSection.create(...) ++ if sid then ++ luci.http.redirect(mount.extedit % sid) ++ return ++ end ++end ++ ++ ++mount:option(Flag, "enabled", translate("Enabled")).rmempty = false ++ ++dev = mount:option(DummyValue, "device", translate("Device")) ++dev.rawhtml = true ++dev.cfgvalue = function(self, section) ++ local v, e ++ ++ v = m.uci:get("fstab", section, "uuid") ++ e = v and devices[v:lower()] ++ if v and e and e.size then ++ return "UUID: %s (%s, %d MB)" %{ tp.pcdata(v), e.dev, e.size } ++ elseif v and e then ++ return "UUID: %s (%s)" %{ tp.pcdata(v), e.dev } ++ elseif v then ++ return "UUID: %s (%s)" %{ tp.pcdata(v), translate("not present") } ++ end ++ ++ v = m.uci:get("fstab", section, "label") ++ e = v and devices[v] ++ if v and e and e.size then ++ return "Label: %s (%s, %d MB)" %{ tp.pcdata(v), e.dev, e.size } ++ elseif v and e then ++ return "Label: %s (%s)" %{ tp.pcdata(v), e.dev } ++ elseif v then ++ return "Label: %s (%s)" %{ tp.pcdata(v), translate("not present") } ++ end ++ ++ v = Value.cfgvalue(self, section) or "?" ++ e = v and devices[v] ++ if v and e and e.size then ++ return "%s (%d MB)" %{ tp.pcdata(v), e.size } ++ elseif v and e then ++ return tp.pcdata(v) ++ elseif v then ++ return "%s (%s)" %{ tp.pcdata(v), translate("not present") } ++ end ++end ++ ++mp = mount:option(DummyValue, "target", translate("Mount Point")) ++mp.cfgvalue = function(self, section) ++ if m.uci:get("fstab", section, "is_rootfs") == "1" then ++ return "/overlay" ++ else ++ return Value.cfgvalue(self, section) or "?" ++ end ++end ++ ++fs = mount:option(DummyValue, "fstype", translate("Filesystem")) ++fs.cfgvalue = function(self, section) ++ local v, e ++ ++ v = m.uci:get("fstab", section, "uuid") ++ v = v and v:lower() or m.uci:get("fstab", section, "label") ++ v = v or m.uci:get("fstab", section, "device") ++ ++ e = v and devices[v] ++ ++ return e and e.type or m.uci:get("fstab", section, "fstype") or "?" ++end ++ ++op = mount:option(DummyValue, "options", translate("Options")) ++op.cfgvalue = function(self, section) ++ return Value.cfgvalue(self, section) or "defaults" ++end ++ ++rf = mount:option(DummyValue, "is_rootfs", translate("Root")) ++rf.cfgvalue = function(self, section) ++ local target = m.uci:get("fstab", section, "target") ++ if target == "/" then ++ return translate("yes") ++ elseif target == "/overlay" then ++ return translate("overlay") ++ else ++ return translate("no") ++ end ++end ++ ++ck = mount:option(DummyValue, "enabled_fsck", translate("Check")) ++ck.cfgvalue = function(self, section) ++ return Value.cfgvalue(self, section) == "1" ++ and translate("yes") or translate("no") ++end ++ ++ ++swap = m:section(TypedSection, "swap", "SWAP", translate("If your physical memory is insufficient unused data can be temporarily swapped to a swap-device resulting in a higher amount of usable RAM. Be aware that swapping data is a very slow process as the swap-device cannot be accessed with the high datarates of the RAM.")) ++swap.anonymous = true ++swap.addremove = true ++swap.template = "cbi/tblsection" ++swap.extedit = luci.dispatcher.build_url("admin/system/fstab/swap/%s") ++ ++swap.create = function(...) ++ local sid = TypedSection.create(...) ++ if sid then ++ luci.http.redirect(swap.extedit % sid) ++ return ++ end ++end ++ ++ ++swap:option(Flag, "enabled", translate("Enabled")).rmempty = false ++ ++dev = swap:option(DummyValue, "device", translate("Device")) ++dev.cfgvalue = function(self, section) ++ local v ++ ++ v = m.uci:get("fstab", section, "uuid") ++ if v then return "UUID: %s" % v end ++ ++ v = m.uci:get("fstab", section, "label") ++ if v then return "Label: %s" % v end ++ ++ v = Value.cfgvalue(self, section) or "?" ++ e = v and devices[v] ++ if v and e and e.size then ++ return "%s (%s MB)" % {v, e.size} ++ else ++ return v ++ end ++end ++ ++return m +diff --git a/feeds/luci/modules/luci-mod-admin-full/luasrc/model/cbi/admin_system/fstab/mount.lua b/feeds/luci/modules/luci-mod-admin-full/luasrc/model/cbi/admin_system/fstab/mount.lua +new file mode 100644 +index 0000000..2652e00 +--- /dev/null ++++ b/feeds/luci/modules/luci-mod-admin-full/luasrc/model/cbi/admin_system/fstab/mount.lua +@@ -0,0 +1,149 @@ ++-- Copyright 2010 Jo-Philipp Wich ++-- Licensed to the public under the Apache License 2.0. ++ ++local fs = require "nixio.fs" ++local util = require "nixio.util" ++ ++local has_fscheck = fs.access("/usr/sbin/e2fsck") ++ ++local block = io.popen("block info", "r") ++local ln, dev, devices = nil, nil, {} ++ ++repeat ++ ln = block:read("*l") ++ dev = ln and ln:match("^/dev/(.-):") ++ ++ if dev then ++ local e, s, key, val = { } ++ ++ for key, val in ln:gmatch([[(%w+)="(.-)"]]) do ++ e[key:lower()] = val ++ end ++ ++ s = tonumber((fs.readfile("/sys/class/block/%s/size" % dev))) ++ ++ e.dev = "/dev/%s" % dev ++ e.size = s and math.floor(s / 2048) ++ ++ devices[#devices+1] = e ++ end ++until not ln ++ ++block:close() ++ ++ ++m = Map("fstab", translate("Mount Points - Mount Entry")) ++m.redirect = luci.dispatcher.build_url("admin/system/fstab") ++ ++if not arg[1] or m.uci:get("fstab", arg[1]) ~= "mount" then ++ luci.http.redirect(m.redirect) ++ return ++end ++ ++ ++ ++mount = m:section(NamedSection, arg[1], "mount", translate("Mount Entry")) ++mount.anonymous = true ++mount.addremove = false ++ ++mount:tab("general", translate("General Settings")) ++mount:tab("advanced", translate("Advanced Settings")) ++ ++ ++mount:taboption("general", Flag, "enabled", translate("Enable this mount")).rmempty = false ++ ++ ++o = mount:taboption("general", Value, "uuid", translate("UUID"), ++ translate("If specified, mount the device by its UUID instead of a fixed device node")) ++ ++for i, d in ipairs(devices) do ++ if d.uuid and d.size then ++ o:value(d.uuid, "%s (%s, %d MB)" %{ d.uuid, d.dev, d.size }) ++ elseif d.uuid then ++ o:value(d.uuid, "%s (%s)" %{ d.uuid, d.dev }) ++ end ++end ++ ++o:value("", translate("-- match by label --")) ++ ++ ++o = mount:taboption("general", Value, "label", translate("Label"), ++ translate("If specified, mount the device by the partition label instead of a fixed device node")) ++ ++o:depends("uuid", "") ++ ++for i, d in ipairs(devices) do ++ if d.label and d.size then ++ o:value(d.label, "%s (%s, %d MB)" %{ d.label, d.dev, d.size }) ++ elseif d.label then ++ o:value(d.label, "%s (%s)" %{ d.label, d.dev }) ++ end ++end ++ ++o:value("", translate("-- match by device --")) ++ ++ ++o = mount:taboption("general", Value, "device", translate("Device"), ++ translate("The device file of the memory or partition (e.g. /dev/sda1)")) ++ ++o:depends({ uuid = "", label = "" }) ++ ++for i, d in ipairs(devices) do ++ if d.size then ++ o:value(d.dev, "%s (%d MB)" %{ d.dev, d.size }) ++ else ++ o:value(d.dev) ++ end ++end ++ ++ ++o = mount:taboption("general", Value, "target", translate("Mount point"), ++ translate("Specifies the directory the device is attached to")) ++ ++o:value("/", translate("Use as root filesystem (/)")) ++o:value("/overlay", translate("Use as external overlay (/overlay)")) ++ ++ ++o = mount:taboption("general", DummyValue, "__notice", translate("Root preparation")) ++o:depends("target", "/") ++o.rawhtml = true ++o.default = [[ ++

    %s

    mkdir -p /tmp/introot
    ++mkdir -p /tmp/extroot
    ++mount --bind / /tmp/introot
    ++mount /dev/sda1 /tmp/extroot
    ++tar -C /tmp/intproot -cvf - . | tar -C /tmp/extroot -xf -
    ++umount /tmp/introot
    ++umount /tmp/extroot
    ++]] %{ ++ translate("Make sure to clone the root filesystem using something like the commands below:"), ++ ++} ++ ++ ++o = mount:taboption("advanced", Value, "fstype", translate("Filesystem"), ++ translate("The filesystem that was used to format the memory (e.g. ext3)")) ++ ++o:value("", "auto") ++ ++local fs ++for fs in io.lines("/proc/filesystems") do ++ fs = fs:match("%S+") ++ if fs ~= "nodev" then ++ o:value(fs) ++ end ++end ++ ++ ++o = mount:taboption("advanced", Value, "options", translate("Mount options"), ++ translate("See \"mount\" manpage for details")) ++ ++o.placeholder = "defaults" ++ ++ ++if has_fscheck then ++ o = mount:taboption("advanced", Flag, "enabled_fsck", translate("Run filesystem check"), ++ translate("Run a filesystem check before mounting the device")) ++end ++ ++return m +diff --git a/feeds/luci/modules/luci-mod-admin-full/luasrc/model/cbi/admin_system/fstab/swap.lua b/feeds/luci/modules/luci-mod-admin-full/luasrc/model/cbi/admin_system/fstab/swap.lua +new file mode 100644 +index 0000000..82468d5 +--- /dev/null ++++ b/feeds/luci/modules/luci-mod-admin-full/luasrc/model/cbi/admin_system/fstab/swap.lua +@@ -0,0 +1,54 @@ ++-- Copyright 2010 Jo-Philipp Wich ++-- Licensed to the public under the Apache License 2.0. ++ ++local fs = require "nixio.fs" ++local util = require "nixio.util" ++ ++local devices = {} ++util.consume((fs.glob("/dev/sd*")), devices) ++util.consume((fs.glob("/dev/hd*")), devices) ++util.consume((fs.glob("/dev/scd*")), devices) ++util.consume((fs.glob("/dev/mmc*")), devices) ++ ++local size = {} ++for i, dev in ipairs(devices) do ++ local s = tonumber((fs.readfile("/sys/class/block/%s/size" % dev:sub(6)))) ++ size[dev] = s and math.floor(s / 2048) ++end ++ ++ ++m = Map("fstab", translate("Mount Points - Swap Entry")) ++m.redirect = luci.dispatcher.build_url("admin/system/fstab") ++ ++if not arg[1] or m.uci:get("fstab", arg[1]) ~= "swap" then ++ luci.http.redirect(m.redirect) ++ return ++end ++ ++ ++mount = m:section(NamedSection, arg[1], "swap", translate("Swap Entry")) ++mount.anonymous = true ++mount.addremove = false ++ ++mount:tab("general", translate("General Settings")) ++mount:tab("advanced", translate("Advanced Settings")) ++ ++ ++mount:taboption("general", Flag, "enabled", translate("Enable this swap")).rmempty = false ++ ++ ++o = mount:taboption("general", Value, "device", translate("Device"), ++ translate("The device file of the memory or partition (e.g. /dev/sda1)")) ++ ++for i, d in ipairs(devices) do ++ o:value(d, size[d] and "%s (%s MB)" % {d, size[d]}) ++end ++ ++o = mount:taboption("advanced", Value, "uuid", translate("UUID"), ++ translate("If specified, mount the device by its UUID instead of a fixed device node")) ++ ++o = mount:taboption("advanced", Value, "label", translate("Label"), ++ translate("If specified, mount the device by the partition label instead of a fixed device node")) ++ ++ ++return m +diff --git a/feeds/luci/modules/luci-mod-admin-full/luasrc/model/cbi/admin_system/ipkg.lua b/feeds/luci/modules/luci-mod-admin-full/luasrc/model/cbi/admin_system/ipkg.lua +new file mode 100644 +index 0000000..7c6d7e1 +--- /dev/null ++++ b/feeds/luci/modules/luci-mod-admin-full/luasrc/model/cbi/admin_system/ipkg.lua +@@ -0,0 +1,64 @@ ++-- Copyright 2008 Steven Barth ++-- Copyright 2008-2011 Jo-Philipp Wich ++-- Licensed to the public under the Apache License 2.0. ++ ++local ipkgfile = "/etc/opkg.conf" ++local distfeeds = "/etc/opkg/distfeeds.conf" ++local customfeeds = "/etc/opkg/customfeeds.conf" ++ ++f = SimpleForm("ipkgconf", translate("OPKG-Configuration"), translate("General options for opkg")) ++ ++f:append(Template("admin_system/ipkg")) ++ ++t = f:field(TextValue, "lines") ++t.wrap = "off" ++t.rows = 10 ++function t.cfgvalue() ++ return nixio.fs.readfile(ipkgfile) or "" ++end ++ ++function t.write(self, section, data) ++ return nixio.fs.writefile(ipkgfile, data:gsub("\r\n", "\n")) ++end ++ ++function f.handle(self, state, data) ++ return true ++end ++ ++g = SimpleForm("distfeedconf", translate("Distribution feeds"), ++ translate("Build/distribution specific feed definitions. This file will NOT be preserved in any sysupgrade.")) ++ ++d = g:field(TextValue, "lines2") ++d.wrap = "off" ++d.rows = 10 ++function d.cfgvalue() ++ return nixio.fs.readfile(distfeeds) or "" ++end ++ ++function d.write(self, section, data) ++ return nixio.fs.writefile(distfeeds, data:gsub("\r\n", "\n")) ++end ++ ++function g.handle(self, state, data) ++ return true ++end ++ ++h = SimpleForm("customfeedconf", translate("Custom feeds"), ++ translate("Custom feed definitions, e.g. private feeds. This file can be preserved in a sysupgrade.")) ++ ++c = h:field(TextValue, "lines3") ++c.wrap = "off" ++c.rows = 10 ++function c.cfgvalue() ++ return nixio.fs.readfile(customfeeds) or "" ++end ++ ++function c.write(self, section, data) ++ return nixio.fs.writefile(customfeeds, data:gsub("\r\n", "\n")) ++end ++ ++function h.handle(self, state, data) ++ return true ++end ++ ++return f, g, h +diff --git a/feeds/luci/modules/luci-mod-admin-full/luasrc/model/cbi/admin_system/leds.lua b/feeds/luci/modules/luci-mod-admin-full/luasrc/model/cbi/admin_system/leds.lua +new file mode 100644 +index 0000000..8d9bcb1 +--- /dev/null ++++ b/feeds/luci/modules/luci-mod-admin-full/luasrc/model/cbi/admin_system/leds.lua +@@ -0,0 +1,119 @@ ++-- Copyright 2008 Steven Barth ++-- Licensed to the public under the Apache License 2.0. ++ ++m = Map("system", translate("LED Configuration"), translate("Customizes the behaviour of the device LEDs if possible.")) ++ ++local sysfs_path = "/sys/class/leds/" ++local leds = {} ++ ++local fs = require "nixio.fs" ++local util = require "nixio.util" ++ ++if fs.access(sysfs_path) then ++ leds = util.consume((fs.dir(sysfs_path))) ++end ++ ++if #leds == 0 then ++ return m ++end ++ ++ ++s = m:section(TypedSection, "led", "") ++s.anonymous = true ++s.addremove = true ++ ++function s.parse(self, ...) ++ TypedSection.parse(self, ...) ++ os.execute("/etc/init.d/led enable") ++end ++ ++ ++s:option(Value, "name", translate("Name")) ++ ++ ++sysfs = s:option(ListValue, "sysfs", translate("LED Name")) ++for k, v in ipairs(leds) do ++ sysfs:value(v) ++end ++ ++s:option(Flag, "default", translate("Default state")).rmempty = false ++ ++ ++trigger = s:option(ListValue, "trigger", translate("Trigger")) ++ ++local triggers = fs.readfile(sysfs_path .. leds[1] .. "/trigger") ++for t in triggers:gmatch("[%w-]+") do ++ trigger:value(t, translate(t:gsub("-", ""))) ++end ++ ++ ++delayon = s:option(Value, "delayon", translate ("On-State Delay")) ++delayon:depends("trigger", "timer") ++ ++delayoff = s:option(Value, "delayoff", translate ("Off-State Delay")) ++delayoff:depends("trigger", "timer") ++ ++ ++dev = s:option(ListValue, "_net_dev", translate("Device")) ++dev.rmempty = true ++dev:value("") ++dev:depends("trigger", "netdev") ++ ++function dev.cfgvalue(self, section) ++ return m.uci:get("system", section, "dev") ++end ++ ++function dev.write(self, section, value) ++ m.uci:set("system", section, "dev", value) ++end ++ ++function dev.remove(self, section) ++ local t = trigger:formvalue(section) ++ if t ~= "netdev" and t ~= "usbdev" then ++ m.uci:delete("system", section, "dev") ++ end ++end ++ ++for k, v in pairs(luci.sys.net.devices()) do ++ if v ~= "lo" then ++ dev:value(v) ++ end ++end ++ ++ ++mode = s:option(MultiValue, "mode", translate("Trigger Mode")) ++mode.rmempty = true ++mode:depends("trigger", "netdev") ++mode:value("link", translate("Link On")) ++mode:value("tx", translate("Transmit")) ++mode:value("rx", translate("Receive")) ++ ++ ++usbdev = s:option(ListValue, "_usb_dev", translate("USB Device")) ++usbdev:depends("trigger", "usbdev") ++usbdev.rmempty = true ++usbdev:value("") ++ ++function usbdev.cfgvalue(self, section) ++ return m.uci:get("system", section, "dev") ++end ++ ++function usbdev.write(self, section, value) ++ m.uci:set("system", section, "dev", value) ++end ++ ++function usbdev.remove(self, section) ++ local t = trigger:formvalue(section) ++ if t ~= "netdev" and t ~= "usbdev" then ++ m.uci:delete("system", section, "dev") ++ end ++end ++ ++for p in nixio.fs.glob("/sys/bus/usb/devices/[0-9]*/manufacturer") do ++ local id = p:match("%d+-%d+") ++ local mf = nixio.fs.readfile("/sys/bus/usb/devices/" .. id .. "/manufacturer") or "?" ++ local pr = nixio.fs.readfile("/sys/bus/usb/devices/" .. id .. "/product") or "?" ++ usbdev:value(id, "%s (%s - %s)" %{ id, mf, pr }) ++end ++ ++return m +diff --git a/feeds/luci/modules/luci-mod-admin-full/luasrc/model/cbi/admin_system/startup.lua b/feeds/luci/modules/luci-mod-admin-full/luasrc/model/cbi/admin_system/startup.lua +new file mode 100644 +index 0000000..9e19ac5 +--- /dev/null ++++ b/feeds/luci/modules/luci-mod-admin-full/luasrc/model/cbi/admin_system/startup.lua +@@ -0,0 +1,97 @@ ++-- Copyright 2008 Steven Barth ++-- Copyright 2010-2012 Jo-Philipp Wich ++-- Copyright 2010 Manuel Munz ++-- Licensed to the public under the Apache License 2.0. ++ ++local fs = require "nixio.fs" ++local sys = require "luci.sys" ++ ++local inits = { } ++ ++for _, name in ipairs(sys.init.names()) do ++ local index = sys.init.index(name) ++ local enabled = sys.init.enabled(name) ++ ++ if index < 255 then ++ inits["%02i.%s" % { index, name }] = { ++ name = name, ++ index = tostring(index), ++ enabled = enabled ++ } ++ end ++end ++ ++ ++m = SimpleForm("initmgr", translate("Initscripts"), translate("You can enable or disable installed init scripts here. Changes will applied after a device reboot.
    Warning: If you disable essential init scripts like \"network\", your device might become inaccessible!")) ++m.reset = false ++m.submit = false ++ ++ ++s = m:section(Table, inits) ++ ++i = s:option(DummyValue, "index", translate("Start priority")) ++n = s:option(DummyValue, "name", translate("Initscript")) ++ ++ ++e = s:option(Button, "endisable", translate("Enable/Disable")) ++ ++e.render = function(self, section, scope) ++ if inits[section].enabled then ++ self.title = translate("Enabled") ++ self.inputstyle = "save" ++ else ++ self.title = translate("Disabled") ++ self.inputstyle = "reset" ++ end ++ ++ Button.render(self, section, scope) ++end ++ ++e.write = function(self, section) ++ if inits[section].enabled then ++ inits[section].enabled = false ++ return sys.init.disable(inits[section].name) ++ else ++ inits[section].enabled = true ++ return sys.init.enable(inits[section].name) ++ end ++end ++ ++ ++start = s:option(Button, "start", translate("Start")) ++start.inputstyle = "apply" ++start.write = function(self, section) ++ sys.call("/etc/init.d/%s %s >/dev/null" %{ inits[section].name, self.option }) ++end ++ ++restart = s:option(Button, "restart", translate("Restart")) ++restart.inputstyle = "reload" ++restart.write = start.write ++ ++stop = s:option(Button, "stop", translate("Stop")) ++stop.inputstyle = "remove" ++stop.write = start.write ++ ++ ++ ++f = SimpleForm("rc", translate("Local Startup"), ++ translate("This is the content of /etc/rc.local. Insert your own commands here (in front of 'exit 0') to execute them at the end of the boot process.")) ++ ++t = f:field(TextValue, "rcs") ++t.rmempty = true ++t.rows = 20 ++ ++function t.cfgvalue() ++ return fs.readfile("/etc/rc.local") or "" ++end ++ ++function f.handle(self, state, data) ++ if state == FORM_VALID then ++ if data.rcs then ++ fs.writefile("/etc/rc.local", data.rcs:gsub("\r\n", "\n")) ++ end ++ end ++ return true ++end ++ ++return m, f +diff --git a/feeds/luci/modules/luci-mod-admin-full/luasrc/model/cbi/admin_system/system.lua b/feeds/luci/modules/luci-mod-admin-full/luasrc/model/cbi/admin_system/system.lua +new file mode 100644 +index 0000000..94ba805 +--- /dev/null ++++ b/feeds/luci/modules/luci-mod-admin-full/luasrc/model/cbi/admin_system/system.lua +@@ -0,0 +1,216 @@ ++-- Copyright 2008 Steven Barth ++-- Copyright 2011 Jo-Philipp Wich ++-- Licensed to the public under the Apache License 2.0. ++ ++local sys = require "luci.sys" ++local zones = require "luci.sys.zoneinfo" ++local fs = require "nixio.fs" ++local conf = require "luci.config" ++ ++local m, s, o ++local has_ntpd = fs.access("/usr/sbin/ntpd") ++ ++m = Map("system", translate("System"), translate("Here you can configure the basic aspects of your device like its hostname or the timezone.")) ++m:chain("luci") ++ ++ ++s = m:section(TypedSection, "system", translate("System Properties")) ++s.anonymous = true ++s.addremove = false ++ ++s:tab("general", translate("General Settings")) ++s:tab("logging", translate("Logging")) ++s:tab("language", translate("Language and Style")) ++ ++ ++-- ++-- System Properties ++-- ++ ++o = s:taboption("general", DummyValue, "_systime", translate("Local Time")) ++o.template = "admin_system/clock_status" ++ ++ ++o = s:taboption("general", Value, "hostname", translate("Hostname")) ++o.datatype = "hostname" ++ ++function o.write(self, section, value) ++ Value.write(self, section, value) ++ sys.hostname(value) ++end ++ ++ ++o = s:taboption("general", ListValue, "zonename", translate("Timezone")) ++o:value("UTC") ++ ++for i, zone in ipairs(zones.TZ) do ++ o:value(zone[1]) ++end ++ ++function o.write(self, section, value) ++ local function lookup_zone(title) ++ for _, zone in ipairs(zones.TZ) do ++ if zone[1] == title then return zone[2] end ++ end ++ end ++ ++ AbstractValue.write(self, section, value) ++ local timezone = lookup_zone(value) or "GMT0" ++ self.map.uci:set("system", section, "timezone", timezone) ++ fs.writefile("/etc/TZ", timezone .. "\n") ++end ++ ++ ++-- ++-- Logging ++-- ++ ++o = s:taboption("logging", Value, "log_size", translate("System log buffer size"), "kiB") ++o.optional = true ++o.placeholder = 16 ++o.datatype = "uinteger" ++ ++o = s:taboption("logging", Value, "log_ip", translate("External system log server")) ++o.optional = true ++o.placeholder = "0.0.0.0" ++o.datatype = "ip4addr" ++ ++o = s:taboption("logging", Value, "log_port", translate("External system log server port")) ++o.optional = true ++o.placeholder = 514 ++o.datatype = "port" ++ ++o = s:taboption("logging", ListValue, "conloglevel", translate("Log output level")) ++o:value(8, translate("Debug")) ++o:value(7, translate("Info")) ++o:value(6, translate("Notice")) ++o:value(5, translate("Warning")) ++o:value(4, translate("Error")) ++o:value(3, translate("Critical")) ++o:value(2, translate("Alert")) ++o:value(1, translate("Emergency")) ++ ++o = s:taboption("logging", ListValue, "cronloglevel", translate("Cron Log Level")) ++o.default = 8 ++o:value(5, translate("Debug")) ++o:value(8, translate("Normal")) ++o:value(9, translate("Warning")) ++ ++ ++-- ++-- Langauge & Style ++-- ++ ++o = s:taboption("language", ListValue, "_lang", translate("Language")) ++o:value("auto") ++ ++local i18ndir = luci.i18n.i18ndir .. "base." ++for k, v in luci.util.kspairs(conf.languages) do ++ local file = i18ndir .. k:gsub("_", "-") ++ if k:sub(1, 1) ~= "." and fs.access(file .. ".lmo") then ++ o:value(k, v) ++ end ++end ++ ++function o.cfgvalue(...) ++ return m.uci:get("luci", "main", "lang") ++end ++ ++function o.write(self, section, value) ++ m.uci:set("luci", "main", "lang", value) ++end ++ ++ ++o = s:taboption("language", ListValue, "_mediaurlbase", translate("Design")) ++for k, v in pairs(conf.themes) do ++ if k:sub(1, 1) ~= "." then ++ o:value(v, k) ++ end ++end ++ ++function o.cfgvalue(...) ++ return m.uci:get("luci", "main", "mediaurlbase") ++end ++ ++function o.write(self, section, value) ++ m.uci:set("luci", "main", "mediaurlbase", value) ++end ++ ++ ++-- ++-- NTP ++-- ++ ++if has_ntpd then ++ ++ -- timeserver setup was requested, create section and reload page ++ if m:formvalue("cbid.system._timeserver._enable") then ++ m.uci:section("system", "timeserver", "ntp", ++ { ++ server = { "0.openwrt.pool.ntp.org", "1.openwrt.pool.ntp.org", "2.openwrt.pool.ntp.org", "3.openwrt.pool.ntp.org" } ++ } ++ ) ++ ++ m.uci:save("system") ++ luci.http.redirect(luci.dispatcher.build_url("admin/system", arg[1])) ++ return ++ end ++ ++ local has_section = false ++ m.uci:foreach("system", "timeserver", ++ function(s) ++ has_section = true ++ return false ++ end) ++ ++ if not has_section then ++ ++ s = m:section(TypedSection, "timeserver", translate("Time Synchronization")) ++ s.anonymous = true ++ s.cfgsections = function() return { "_timeserver" } end ++ ++ x = s:option(Button, "_enable") ++ x.title = translate("Time Synchronization is not configured yet.") ++ x.inputtitle = translate("Set up Time Synchronization") ++ x.inputstyle = "apply" ++ ++ else ++ ++ s = m:section(TypedSection, "timeserver", translate("Time Synchronization")) ++ s.anonymous = true ++ s.addremove = false ++ ++ o = s:option(Flag, "enable", translate("Enable NTP client")) ++ o.rmempty = false ++ ++ function o.cfgvalue(self) ++ return sys.init.enabled("sysntpd") ++ and self.enabled or self.disabled ++ end ++ ++ function o.write(self, section, value) ++ if value == self.enabled then ++ sys.init.enable("sysntpd") ++ sys.call("env -i /etc/init.d/sysntpd start >/dev/null") ++ else ++ sys.call("env -i /etc/init.d/sysntpd stop >/dev/null") ++ sys.init.disable("sysntpd") ++ end ++ end ++ ++ ++ o = s:option(Flag, "enable_server", translate("Provide NTP server")) ++ o:depends("enable", "1") ++ ++ ++ o = s:option(DynamicList, "server", translate("NTP server candidates")) ++ o.datatype = "host" ++ o:depends("enable", "1") ++ ++ -- retain server list even if disabled ++ function o.remove() end ++ ++ end ++end ++ ++return m +diff --git a/feeds/luci/modules/luci-mod-admin-full/luasrc/view/admin_network/diagnostics.htm b/feeds/luci/modules/luci-mod-admin-full/luasrc/view/admin_network/diagnostics.htm +new file mode 100644 +index 0000000..05c8661 +--- /dev/null ++++ b/feeds/luci/modules/luci-mod-admin-full/luasrc/view/admin_network/diagnostics.htm +@@ -0,0 +1,111 @@ ++<%# ++ Copyright 2010 Jo-Philipp Wich ++ Licensed to the public under the Apache License 2.0. ++-%> ++ ++<%+header%> ++ ++<% ++local fs = require "nixio.fs" ++local has_ping6 = fs.access("/bin/ping6") or fs.access("/usr/bin/ping6") ++local has_traceroute6 = fs.access("/usr/bin/traceroute6") ++%> ++ ++ ++ ++ ++
    "> ++
    ++

    <%:Diagnostics%>

    ++ ++
    ++ <%:Network Utilities%> ++ ++
    ++ ++
    ++
    ++ <% if has_ping6 then %> ++ ++ ++ <% else %> ++ ++ <% end %> ++
    ++ ++
    ++
    ++ <% if has_traceroute6 then %> ++ ++ ++ <% else %> ++ ++ <% end %> ++ <% if not has_traceroute6 then %> ++

     

    ++

    <%:Install iputils-traceroute6 for IPv6 traceroute%>

    ++ <% end %> ++
    ++ ++
    ++
    ++ ++
    ++ ++

    ++ ++
    ++
    ++ ++ ++
    ++ ++<%+footer%> +diff --git a/feeds/luci/modules/luci-mod-admin-full/luasrc/view/admin_network/iface_overview.htm b/feeds/luci/modules/luci-mod-admin-full/luasrc/view/admin_network/iface_overview.htm +new file mode 100644 +index 0000000..1de3498 +--- /dev/null ++++ b/feeds/luci/modules/luci-mod-admin-full/luasrc/view/admin_network/iface_overview.htm +@@ -0,0 +1,251 @@ ++<%# ++ Copyright 2010 Jo-Philipp Wich ++ Licensed to the public under the Apache License 2.0. ++-%> ++ ++<%- ++ local ntm = require "luci.model.network".init() ++ local fwm = require "luci.model.firewall".init() ++ ++ local net ++ local ifaces = { } ++ local netlist = { } ++ for _, net in ipairs(ntm:get_networks()) do ++ if net:name() ~= "loopback" then ++ local z = fwm:get_zone_by_network(net:name()) ++ ifaces[#ifaces+1] = net:name() ++ netlist[#netlist+1] = { ++ net:name(), z and z:name() or "-", z ++ } ++ end ++ end ++ ++ table.sort(netlist, ++ function(a, b) ++ if a[2] ~= b[2] then ++ return a[2] < b[2] ++ else ++ return a[1] < b[1] ++ end ++ end) ++-%> ++ ++ ++ ++ ++ ++ ++
    ++
    ++ <%:Interface Overview%> ++ ++ ++ ++ ++ ++ ++ ++ <% ++ for i, net in ipairs(netlist) do ++ local z = net[3] ++ local c = z and z:get_color() or "#EEEEEE" ++ local t = z and translate("Part of zone %q" % z:name()) or translate("No zone assigned") ++ %> ++ ++ ++ ++ ++ ++ <% end %> ++
    <%:Network%><%:Status%><%:Actions%>
    ++
    ++
    ++ <%=net[1]:upper()%> ++
    ++
    ++
    ++ ? ++
    ++
    ++
    ++ <%:Collecting data...%> ++ ++ ++ ++ '" title="<%:Edit this interface%>" value="<%:Edit%>" id="<%=net[1]%>-ifc-edit" /> ++ '" title="<%:Delete this interface%>" value="<%:Delete%>" /> ++
    ++ ++ '" /> ++
    ++
    +diff --git a/feeds/luci/modules/luci-mod-admin-full/luasrc/view/admin_network/iface_status.htm b/feeds/luci/modules/luci-mod-admin-full/luasrc/view/admin_network/iface_status.htm +new file mode 100644 +index 0000000..8136383 +--- /dev/null ++++ b/feeds/luci/modules/luci-mod-admin-full/luasrc/view/admin_network/iface_status.htm +@@ -0,0 +1,94 @@ ++<%+cbi/valueheader%> ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
    ++
    ++ ? ++
    ++ <%:Collecting data...%> ++
    ++ ++<%+cbi/valuefooter%> +diff --git a/feeds/luci/modules/luci-mod-admin-full/luasrc/view/admin_network/lease_status.htm b/feeds/luci/modules/luci-mod-admin-full/luasrc/view/admin_network/lease_status.htm +new file mode 100644 +index 0000000..0ba334e +--- /dev/null ++++ b/feeds/luci/modules/luci-mod-admin-full/luasrc/view/admin_network/lease_status.htm +@@ -0,0 +1,118 @@ ++ ++ ++
    ++ <%:Active DHCP Leases%> ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
    <%:Hostname%><%:IPv4-Address%><%:MAC-Address%><%:Leasetime remaining%>

    <%:Collecting data...%>
    ++
    ++ ++ +diff --git a/feeds/luci/modules/luci-mod-admin-full/luasrc/view/admin_network/switch_status.htm b/feeds/luci/modules/luci-mod-admin-full/luasrc/view/admin_network/switch_status.htm +new file mode 100644 +index 0000000..b299575 +--- /dev/null ++++ b/feeds/luci/modules/luci-mod-admin-full/luasrc/view/admin_network/switch_status.htm +@@ -0,0 +1,41 @@ ++ +diff --git a/feeds/luci/modules/luci-mod-admin-full/luasrc/view/admin_network/wifi_join.htm b/feeds/luci/modules/luci-mod-admin-full/luasrc/view/admin_network/wifi_join.htm +new file mode 100644 +index 0000000..90cc4c0 +--- /dev/null ++++ b/feeds/luci/modules/luci-mod-admin-full/luasrc/view/admin_network/wifi_join.htm +@@ -0,0 +1,147 @@ ++<%# ++ Copyright 2009 Jo-Philipp Wich ++ Licensed to the public under the Apache License 2.0. ++-%> ++ ++<%- ++ ++ local sys = require "luci.sys" ++ local utl = require "luci.util" ++ ++ function guess_wifi_signal(info) ++ local scale = (100 / (info.quality_max or 100) * (info.quality or 0)) ++ local icon ++ ++ if not info.bssid or info.bssid == "00:00:00:00:00:00" then ++ icon = resource .. "/icons/signal-none.png" ++ elseif scale < 15 then ++ icon = resource .. "/icons/signal-0.png" ++ elseif scale < 35 then ++ icon = resource .. "/icons/signal-0-25.png" ++ elseif scale < 55 then ++ icon = resource .. "/icons/signal-25-50.png" ++ elseif scale < 75 then ++ icon = resource .. "/icons/signal-50-75.png" ++ else ++ icon = resource .. "/icons/signal-75-100.png" ++ end ++ ++ return icon ++ end ++ ++ function percent_wifi_signal(info) ++ local qc = info.quality or 0 ++ local qm = info.quality_max or 0 ++ ++ if info.bssid and qc > 0 and qm > 0 then ++ return math.floor((100 / qm) * qc) ++ else ++ return 0 ++ end ++ end ++ ++ function format_wifi_encryption(info) ++ if info.wep == true then ++ return "WEP" ++ elseif info.wpa > 0 then ++ return translatef("%s - %s", ++ table.concat(info.pair_ciphers, ", "), ++ table.concat(info.group_ciphers, ", "), ++ (info.wpa == 3) and translate("mixed WPA/WPA2") ++ or (info.wpa == 2 and "WPA2" or "WPA"), ++ table.concat(info.auth_suites, ", ") ++ ) ++ elseif info.enabled then ++ return "%s" % translate("unknown") ++ else ++ return "%s" % translate("open") ++ end ++ end ++ ++ local dev = luci.http.formvalue("device") ++ local iw = luci.sys.wifi.getiwinfo(dev) ++ ++ if not iw then ++ luci.http.redirect(luci.dispatcher.build_url("admin/network/wireless")) ++ return ++ end ++ ++ ++ function scanlist(times) ++ local i, k, v ++ local l = { } ++ local s = { } ++ ++ for i = 1, times do ++ for k, v in ipairs(iw.scanlist or { }) do ++ if not s[v.bssid] then ++ l[#l+1] = v ++ s[v.bssid] = true ++ end ++ end ++ end ++ ++ return l ++ end ++-%> ++ ++<%+header%> ++ ++

    <%:Join Network: Wireless Scan%>

    ++ ++
    ++
    ++ ++ ++ <% for i, net in ipairs(scanlist(3)) do net.encryption = net.encryption or { } %> ++ ++ ++ ++ ++ ++ <% end %> ++ ++
    ++ ++
    ++ <%=percent_wifi_signal(net)%>% ++
    ++
    ++ <%=net.ssid and utl.pcdata(net.ssid) or "%s" % translate("hidden")%>
    ++ Channel: <%=net.channel%> | ++ Mode: <%=net.mode%> | ++ BSSID: <%=net.bssid%> | ++ Encryption: <%=format_wifi_encryption(net.encryption)%> ++
    ++
    ++ ++ ++ ++ ++ ++ ++ <% if net.encryption.wpa then %> ++ ++ <% for _, v in ipairs(net.encryption.auth_suites) do %> ++ <% end; for _, v in ipairs(net.encryption.group_ciphers) do %> ++ <% end; for _, v in ipairs(net.encryption.pair_ciphers) do %> ++ <% end; end %> ++ ++ " /> ++ ++ ++
    ++
    ++
    ++
    ++
    ++
    " method="get"> ++ ++
    ++
    ++ ++ ++
    ++
    ++ ++<%+footer%> +diff --git a/feeds/luci/modules/luci-mod-admin-full/luasrc/view/admin_network/wifi_overview.htm b/feeds/luci/modules/luci-mod-admin-full/luasrc/view/admin_network/wifi_overview.htm +new file mode 100644 +index 0000000..4fc268e +--- /dev/null ++++ b/feeds/luci/modules/luci-mod-admin-full/luasrc/view/admin_network/wifi_overview.htm +@@ -0,0 +1,436 @@ ++<%# ++ Copyright 2008-2009 Steven Barth ++ Copyright 2008-2015 Jo-Philipp Wich ++ Licensed to the public under the Apache License 2.0. ++-%> ++ ++<%- ++ ++ local ip = require "luci.ip" ++ local fs = require "nixio.fs" ++ local utl = require "luci.util" ++ local uci = require "luci.model.uci".cursor() ++ local ntm = require "luci.model.network" ++ ++ local has_iwinfo = pcall(require, "iwinfo") ++ ++ ntm.init(uci) ++ ++ function guess_wifi_hw(dev) ++ local bands = "" ++ local ifname = dev:name() ++ local name, idx = ifname:match("^([a-z]+)(%d+)") ++ idx = tonumber(idx) ++ ++ if has_iwinfo then ++ local bl = dev.iwinfo.hwmodelist ++ if bl and next(bl) then ++ if bl.a then bands = bands .. "a" end ++ if bl.b then bands = bands .. "b" end ++ if bl.g then bands = bands .. "g" end ++ if bl.n then bands = bands .. "n" end ++ if bl.ac then bands = bands .. "ac" end ++ end ++ ++ local hw = dev.iwinfo.hardware_name ++ if hw then ++ return "%s 802.11%s" %{ hw, bands } ++ end ++ end ++ ++ -- wl.o ++ if name == "wl" then ++ local name = translatef("Broadcom 802.11%s Wireless Controller", bands) ++ local nm = 0 ++ ++ local fd = nixio.open("/proc/bus/pci/devices", "r") ++ if fd then ++ local ln ++ for ln in fd:linesource() do ++ if ln:match("wl$") then ++ if nm == idx then ++ local version = ln:match("^%S+%s+%S%S%S%S([0-9a-f]+)") ++ name = translatef( ++ "Broadcom BCM%04x 802.11 Wireless Controller", ++ tonumber(version, 16) ++ ) ++ ++ break ++ else ++ nm = nm + 1 ++ end ++ end ++ end ++ fd:close() ++ end ++ ++ return name ++ ++ -- madwifi ++ elseif name == "ath" or name == "wifi" then ++ return translatef("Atheros 802.11%s Wireless Controller", bands) ++ ++ -- ralink ++ elseif name == "ra" then ++ return translatef("RaLink 802.11%s Wireless Controller", bands) ++ ++ -- hermes ++ elseif name == "eth" then ++ return translate("Hermes 802.11b Wireless Controller") ++ ++ -- hostap ++ elseif name == "wlan" and fs.stat("/proc/net/hostap/" .. ifname, "type") == "dir" then ++ return translate("Prism2/2.5/3 802.11b Wireless Controller") ++ ++ -- dunno yet ++ else ++ return translatef("Generic 802.11%s Wireless Controller", bands) ++ end ++ end ++ ++ local devices = ntm:get_wifidevs() ++ local arpcache = { } ++ ip.neighbors({ family = 4 }, function(n) ++ if n.mac and n.dest then arpcache[n.mac:upper()] = n.dest:string() end ++ end) ++ ++ local netlist = { } ++ local netdevs = { } ++ ++ local dev ++ for _, dev in ipairs(devices) do ++ local net ++ for _, net in ipairs(dev:get_wifinets()) do ++ netlist[#netlist+1] = net:id() ++ netdevs[net:id()] = dev:name() ++ end ++ end ++-%> ++ ++<%+header%> ++ ++<% if not has_iwinfo then %> ++
    ++ <%:Package libiwinfo required!%>
    ++ <%_The libiwinfo-lua package is not installed. You must install this component for working wireless configuration!%> ++
    ++<% end %> ++ ++ ++ ++ ++

    <%:Wireless Overview%>

    ++ ++ ++ ++
    ++ ++ <% for _, dev in ipairs(devices) do local nets = dev:get_wifinets() %> ++ ++
    ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ <% if #nets > 0 then %> ++ <% for i, net in ipairs(nets) do %> ++ ++ ++ ++ ++ ++ ++ <% end %> ++ <% else %> ++ ++ ++ ++ ++ <% end %> ++ ++
    ++ <%=guess_wifi_hw(dev)%> (<%=dev:name()%>)
    ++ ++
    ++ ?device=<%=dev:name()%>'" title="<%:Find and join network%>" value="<%:Scan%>" /> ++ ?device=<%=dev:name()%>'" title="<%:Provide new network%>" value="<%:Add%>" /> ++
    ++
    ++ 0% ++
    ++ <%:Collecting data...%> ++ ++ ++ ++ '" title="<%:Delete this network%>" value="<%:Remove%>" /> ++
    ++ <%:No network configured on this device%> ++
    ++
    ++ ++ <% end %> ++ ++ ++

    <%:Associated Stations%>

    ++ ++
    ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
    <%:SSID%><%:MAC-Address%><%:IPv4-Address%><%:Signal%><%:Noise%><%:RX Rate%><%:TX Rate%>
    ++ <%:Collecting data...%> ++
    ++
    ++
    ++ ++<%+footer%> +diff --git a/feeds/luci/modules/luci-mod-admin-full/luasrc/view/admin_network/wifi_status.htm b/feeds/luci/modules/luci-mod-admin-full/luasrc/view/admin_network/wifi_status.htm +new file mode 100644 +index 0000000..fa0a97b +--- /dev/null ++++ b/feeds/luci/modules/luci-mod-admin-full/luasrc/view/admin_network/wifi_status.htm +@@ -0,0 +1,78 @@ ++<%+cbi/valueheader%> ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
    ++
    ++ 0% ++
    ++ <%:Collecting data...%> ++
    ++ ++<%+cbi/valuefooter%> +diff --git a/feeds/luci/modules/luci-mod-admin-full/luasrc/view/admin_status/bandwidth.htm b/feeds/luci/modules/luci-mod-admin-full/luasrc/view/admin_status/bandwidth.htm +new file mode 100644 +index 0000000..dbcf06b +--- /dev/null ++++ b/feeds/luci/modules/luci-mod-admin-full/luasrc/view/admin_status/bandwidth.htm +@@ -0,0 +1,302 @@ ++<%# ++ Copyright 2010 Jo-Philipp Wich ++ Licensed to the public under the Apache License 2.0. ++-%> ++ ++<%- ++ local ntm = require "luci.model.network".init() ++ ++ local dev ++ local devices = { } ++ for _, dev in luci.util.vspairs(luci.sys.net.devices()) do ++ if dev ~= "lo" and not ntm:ignore_interface(dev) then ++ devices[#devices+1] = dev ++ end ++ end ++ ++ local curdev = luci.dispatcher.context.requestpath ++ curdev = curdev[#curdev] ~= "bandwidth" and curdev[#curdev] or devices[1] ++-%> ++ ++<%+header%> ++ ++ ++ ++ ++

    <%:Realtime Traffic%>

    ++ ++
      ++ <% for _, dev in ipairs(devices) do %> ++
    • "><%=pcdata(dev)%>
    • ++ <% end %> ++
    ++ ++ ++
    -
    ++
    ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
    <%:Inbound:%>0 <%:kbit/s%>
    (0 <%:kB/s%>)
    <%:Average:%>0 <%:kbit/s%>
    (0 <%:kB/s%>)
    <%:Peak:%>0 <%:kbit/s%>
    (0 <%:kB/s%>)
    <%:Outbound:%>0 <%:kbit/s%>
    (0 <%:kB/s%>)
    <%:Average:%>0 <%:kbit/s%>
    (0 <%:kB/s%>)
    <%:Peak:%>0 <%:kbit/s%>
    (0 <%:kB/s%>)
    ++ ++<%+footer%> +diff --git a/feeds/luci/modules/luci-mod-admin-full/luasrc/view/admin_status/connections.htm b/feeds/luci/modules/luci-mod-admin-full/luasrc/view/admin_status/connections.htm +new file mode 100644 +index 0000000..64b950e +--- /dev/null ++++ b/feeds/luci/modules/luci-mod-admin-full/luasrc/view/admin_status/connections.htm +@@ -0,0 +1,375 @@ ++<%# ++ Copyright 2010 Jo-Philipp Wich ++ Licensed to the public under the Apache License 2.0. ++-%> ++ ++<%+header%> ++ ++ ++ ++ ++

    <%:Realtime Connections%>

    ++ ++
    <%:This page gives an overview over currently active network connections.%>
    ++ ++
    ++ <%:Active Connections%> ++ ++ ++
    -
    ++
    ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
    <%:UDP:%>0<%:Average:%>0<%:Peak:%>0
    <%:TCP:%>0<%:Average:%>0<%:Peak:%>0
    <%:Other:%>0<%:Average:%>0<%:Peak:%>0
    ++
    ++ ++
    ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
    <%:Network%><%:Protocol%><%:Source%><%:Destination%><%:Transfer%>
    <%:Collecting data...%>
    ++
    ++
    ++ ++<%+footer%> +diff --git a/feeds/luci/modules/luci-mod-admin-full/luasrc/view/admin_status/dmesg.htm b/feeds/luci/modules/luci-mod-admin-full/luasrc/view/admin_status/dmesg.htm +new file mode 100644 +index 0000000..a63bb71 +--- /dev/null ++++ b/feeds/luci/modules/luci-mod-admin-full/luasrc/view/admin_status/dmesg.htm +@@ -0,0 +1,12 @@ ++<%# ++ Copyright 2008 Steven Barth ++ Copyright 2008 Jo-Philipp Wich ++ Licensed to the public under the Apache License 2.0. ++-%> ++ ++<%+header%> ++

    <%:Kernel Log%>

    ++
    ++ ++
    ++<%+footer%> +diff --git a/feeds/luci/modules/luci-mod-admin-full/luasrc/view/admin_status/index.htm b/feeds/luci/modules/luci-mod-admin-full/luasrc/view/admin_status/index.htm +new file mode 100644 +index 0000000..07a96b2 +--- /dev/null ++++ b/feeds/luci/modules/luci-mod-admin-full/luasrc/view/admin_status/index.htm +@@ -0,0 +1,704 @@ ++<%# ++ Copyright 2008 Steven Barth ++ Copyright 2008-2011 Jo-Philipp Wich ++ Licensed to the public under the Apache License 2.0. ++-%> ++ ++<% ++ local fs = require "nixio.fs" ++ local util = require "luci.util" ++ local stat = require "luci.tools.status" ++ local ver = require "luci.version" ++ ++ local has_ipv6 = fs.access("/proc/net/ipv6_route") ++ local has_dhcp = fs.access("/etc/config/dhcp") ++ local has_wifi = ((fs.stat("/etc/config/wireless", "size") or 0) > 0) ++ ++ local sysinfo = luci.util.ubus("system", "info") or { } ++ local boardinfo = luci.util.ubus("system", "board") or { } ++ local unameinfo = nixio.uname() or { } ++ ++ local meminfo = sysinfo.memory or { ++ total = 0, ++ free = 0, ++ buffered = 0, ++ shared = 0 ++ } ++ ++ local swapinfo = sysinfo.swap or { ++ total = 0, ++ free = 0 ++ } ++ ++ local has_dsl = fs.access("/etc/init.d/dsl_control") ++ ++ if luci.http.formvalue("status") == "1" then ++ local ntm = require "luci.model.network".init() ++ local wan = ntm:get_wannet() ++ local wan6 = ntm:get_wan6net() ++ ++ local conn_count = tonumber(( ++ luci.sys.exec("wc -l /proc/net/nf_conntrack") or ++ luci.sys.exec("wc -l /proc/net/ip_conntrack") or ++ ""):match("%d+")) or 0 ++ ++ local conn_max = tonumber(( ++ luci.sys.exec("sysctl net.nf_conntrack_max") or ++ luci.sys.exec("sysctl net.ipv4.netfilter.ip_conntrack_max") or ++ ""):match("%d+")) or 4096 ++ ++ local rv = { ++ uptime = sysinfo.uptime or 0, ++ localtime = os.date(), ++ loadavg = sysinfo.load or { 0, 0, 0 }, ++ memory = meminfo, ++ swap = swapinfo, ++ connmax = conn_max, ++ conncount = conn_count, ++ leases = stat.dhcp_leases(), ++ leases6 = stat.dhcp6_leases(), ++ wifinets = stat.wifi_networks() ++ } ++ ++ if wan then ++ rv.wan = { ++ ipaddr = wan:ipaddr(), ++ gwaddr = wan:gwaddr(), ++ netmask = wan:netmask(), ++ dns = wan:dnsaddrs(), ++ expires = wan:expires(), ++ uptime = wan:uptime(), ++ proto = wan:proto(), ++ ifname = wan:ifname(), ++ link = wan:adminlink() ++ } ++ end ++ ++ if wan6 then ++ rv.wan6 = { ++ ip6addr = wan6:ip6addr(), ++ gw6addr = wan6:gw6addr(), ++ dns = wan6:dns6addrs(), ++ uptime = wan6:uptime(), ++ ifname = wan6:ifname(), ++ link = wan6:adminlink() ++ } ++ end ++ ++ if has_dsl then ++ local dsl_stat = luci.sys.exec("/etc/init.d/dsl_control lucistat") ++ local dsl_func = loadstring(dsl_stat) ++ rv.dsl = dsl_func() ++ end ++ ++ luci.http.prepare_content("application/json") ++ luci.http.write_json(rv) ++ ++ return ++ end ++-%> ++ ++<%+header%> ++ ++ ++ ++ ++

    <%:Status%>

    ++ ++
    ++ <%:System%> ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
    <%:Hostname%><%=luci.sys.hostname() or "?"%>
    <%:Model%><%=pcdata(boardinfo.model or boardinfo.system or "?")%>
    <%:Firmware Version%> ++ <%=pcdata(ver.distname)%> <%=pcdata(ver.distversion)%> / ++ <%=pcdata(ver.luciname)%> (<%=pcdata(ver.luciversion)%>) ++
    <%:Kernel Version%><%=unameinfo.release or "?"%>
    <%:Local Time%>-
    <%:Uptime%>-
    <%:Load Average%>-
    ++
    ++ ++
    ++ <%:Memory%> ++ ++ ++ ++ ++ ++
    <%:Total Available%>-
    <%:Free%>-
    <%:Buffered%>-
    ++
    ++ ++<% if swapinfo.total > 0 then %> ++
    ++ <%:Swap%> ++ ++ ++ ++ ++
    <%:Total Available%>-
    <%:Free%>-
    ++
    ++<% end %> ++ ++
    ++ <%:Network%> ++ ++ ++ ++ <% if has_ipv6 then %> ++ ++ <% end %> ++ ++
    <%:IPv4 WAN Status%> ++ ++ ++ ++

    ?
    <%:Collecting data...%>
    ++
    <%:IPv6 WAN Status%> ++ ++ ++ ++

    ?
    <%:Collecting data...%>
    ++
    <%:Active Connections%>-
    ++
    ++ ++<% if has_dhcp then %> ++
    ++ <%:DHCP Leases%> ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
    <%:Hostname%><%:IPv4-Address%><%:MAC-Address%><%:Leasetime remaining%>

    <%:Collecting data...%>
    ++
    ++ ++ ++<% end %> ++ ++<% if has_dsl then %> ++
    ++ <%:ADSL%> ++ ++ ++
    <%:ADSL Status%> ++ ++ ++ ++

    ?
    <%:Collecting data...%>
    ++
    ++
    ++<% end %> ++ ++<% if has_wifi then %> ++
    ++ <%:Wireless%> ++ ++ ++ ++
    <%:Collecting data...%>
    ++
    ++ ++
    ++ <%:Associated Stations%> ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
     <%:MAC-Address%><%:Network%><%:Signal%><%:Noise%><%:RX Rate%><%:TX Rate%>

    <%:Collecting data...%>
    ++
    ++<% end %> ++ ++<%- ++ local incdir = util.libpath() .. "/view/admin_status/index/" ++ if fs.access(incdir) then ++ local inc ++ for inc in fs.dir(incdir) do ++ if inc:match("%.htm$") then ++ include("admin_status/index/" .. inc:gsub("%.htm$", "")) ++ end ++ end ++ end ++-%> ++ ++<%+footer%> +diff --git a/feeds/luci/modules/luci-mod-admin-full/luasrc/view/admin_status/iptables.htm b/feeds/luci/modules/luci-mod-admin-full/luasrc/view/admin_status/iptables.htm +new file mode 100644 +index 0000000..ba2933a +--- /dev/null ++++ b/feeds/luci/modules/luci-mod-admin-full/luasrc/view/admin_status/iptables.htm +@@ -0,0 +1,149 @@ ++<%# ++ Copyright 2008-2009 Steven Barth ++ Copyright 2008-2011 Jo-Philipp Wich ++ Licensed to the public under the Apache License 2.0. ++-%> ++ ++<%- ++ ++ require "luci.sys.iptparser" ++ local wba = require "luci.tools.webadmin" ++ local fs = require "nixio.fs" ++ ++ local has_ip6tables = fs.access("/usr/sbin/ip6tables") ++ local mode = 4 ++ ++ if has_ip6tables then ++ mode = luci.dispatcher.context.requestpath ++ mode = tonumber(mode[#mode] ~= "iptables" and mode[#mode]) or 4 ++ end ++ ++ local ipt = luci.sys.iptparser.IptParser(mode) ++ ++ local rowcnt = 1 ++ function rowstyle() ++ rowcnt = rowcnt + 1 ++ return (rowcnt % 2) + 1 ++ end ++ ++ function link_target(t,c) ++ if ipt:is_custom_target(c) then ++ return '%s' %{ t:lower(), c, c } ++ end ++ return c ++ end ++ ++ function link_iface(i) ++ local net = wba.iface_get_network(i) ++ if net and i ~= "lo" then ++ return '%s' %{ ++ luci.dispatcher.build_url("admin", "network", "network", net), i ++ } ++ ++ end ++ return i ++ end ++ ++ local tables = { "Filter", "NAT", "Mangle", "Raw" } ++ if mode == 6 then ++ tables = { "Filter", "Mangle", "Raw" } ++ end ++-%> ++ ++<%+header%> ++ ++ ++ ++

    <%:Firewall Status%>

    ++ ++<% if has_ip6tables then %> ++ ++<% end %> ++ ++
    ++
    ++
    ++

    <%:Actions%>

    ++ ++

    ++ ++ <% for _, tbl in ipairs(tables) do chaincnt = 0 %> ++

    <%:Table%>: <%=tbl%>

    ++ ++ <% for _, chain in ipairs(ipt:chains(tbl)) do ++ rowcnt = 0 ++ chaincnt = chaincnt + 1 ++ chaininfo = ipt:chain(tbl, chain) ++ %> ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ <% for _, rule in ipairs(ipt:find({table=tbl, chain=chain})) do %> ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ <% end %> ++ ++ <% if rowcnt == 1 then %> ++ ++ ++ ++ <% end %> ++ <% end %> ++ ++ <% if chaincnt == 0 then %> ++ ++ ++ ++ <% end %> ++
    ++
    ++ <%:Chain%> <%=chain%> ++ (<%- if chaininfo.policy then -%> ++ <%:Policy%>: <%=chaininfo.policy%>, <%:Packets%>: <%=chaininfo.packets%>, <%:Traffic%>: <%=wba.byte_format(chaininfo.bytes)-%> ++ <%- else -%> ++ <%:References%>: <%=chaininfo.references-%> ++ <%- end -%>) ++
    <%:Rule #%><%:Pkts.%><%:Traffic%><%:Target%><%:Prot.%><%:Flags%><%:In%><%:Out%><%:Source%><%:Destination%><%:Options%>
    <%=rule.index%><%=rule.packets%><%=wba.byte_format(rule.bytes)%><%=rule.target and link_target(tbl, rule.target) or "-"%><%=rule.protocol%><%=rule.flags%><%=link_iface(rule.inputif)%><%=link_iface(rule.outputif)%><%=rule.source%><%=rule.destination%><%=#rule.options > 0 and luci.util.pcdata(table.concat(rule.options, " ")) or "-"%>
    <%:No rules in this chain%>
    <%:No chains in this table%>
    ++

    ++ <% end %> ++
    ++
    ++
    ++ ++<%+footer%> +diff --git a/feeds/luci/modules/luci-mod-admin-full/luasrc/view/admin_status/load.htm b/feeds/luci/modules/luci-mod-admin-full/luasrc/view/admin_status/load.htm +new file mode 100644 +index 0000000..d095948 +--- /dev/null ++++ b/feeds/luci/modules/luci-mod-admin-full/luasrc/view/admin_status/load.htm +@@ -0,0 +1,284 @@ ++<%# ++ Copyright 2010 Jo-Philipp Wich ++ Licensed to the public under the Apache License 2.0. ++-%> ++ ++<%+header%> ++ ++ ++ ++ ++

    <%:Realtime Load%>

    ++ ++ ++
    -
    ++
    ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
    <%:1 Minute Load:%>0<%:Average:%>0<%:Peak:%>0
    <%:5 Minute Load:%>0<%:Average:%>0<%:Peak:%>0
    <%:15 Minute Load:%>0<%:Average:%>0<%:Peak:%>0
    ++ ++<%+footer%> +diff --git a/feeds/luci/modules/luci-mod-admin-full/luasrc/view/admin_status/routes.htm b/feeds/luci/modules/luci-mod-admin-full/luasrc/view/admin_status/routes.htm +new file mode 100644 +index 0000000..82dd3a7 +--- /dev/null ++++ b/feeds/luci/modules/luci-mod-admin-full/luasrc/view/admin_status/routes.htm +@@ -0,0 +1,162 @@ ++<%# ++ Copyright 2008-2009 Steven Barth ++ Copyright 2008-2015 Jo-Philipp Wich ++ Licensed to the public under the Apache License 2.0. ++-%> ++ ++<%- ++ require "luci.tools.webadmin" ++ require "nixio.fs" ++ ++ local ip = require "luci.ip" ++ local style = true ++ local _, v ++ ++ local rtn = { ++ [255] = "local", ++ [254] = "main", ++ [253] = "default", ++ [0] = "unspec" ++ } ++ ++ if nixio.fs.access("/etc/iproute2/rt_tables") then ++ local ln ++ for ln in io.lines("/etc/iproute2/rt_tables") do ++ local i, n = ln:match("^(%d+)%s+(%S+)") ++ if i and n then ++ rtn[tonumber(i)] = n ++ end ++ end ++ end ++-%> ++ ++<%+header%> ++ ++
    ++

    <%:Routes%>

    ++
    <%:The following rules are currently active on this system.%>
    ++ ++
    ++ ARP ++
    ++ ++ ++ ++ ++ ++ ++ ++ <% ++ for _, v in ipairs(ip.neighbors({ family = 4 })) do ++ if v.mac then ++ %> ++ ++ ++ ++ ++ ++ <% ++ style = not style ++ end ++ end ++ %> ++
    <%_IPv4-Address%><%_MAC-Address%><%:Interface%>
    <%=v.dest%><%=v.mac%><%=v.dev%>
    ++
    ++
    ++
    ++ ++
    ++ <%_Active IPv4-Routes%> ++ ++
    ++ ++ ++ ++ ++ ++ ++ ++ ++ <% for _, v in ipairs(ip.routes({ family = 4, type = 1 })) do %> ++ ++ ++ ++ ++ ++ ++ ++ <% style = not style end %> ++
    <%:Network%><%:Target%><%_IPv4-Gateway%><%:Metric%><%:Table%>
    <%=luci.tools.webadmin.iface_get_network(v.dev) or v.dev%><%=v.dest%><%=v.gw%><%=v.metric or 0%><%=rtn[v.table] or v.table%>
    ++
    ++
    ++
    ++ ++ <% ++ if nixio.fs.access("/proc/net/ipv6_route") then ++ style = true ++ %> ++
    ++ <%_Active IPv6-Routes%> ++ ++
    ++ ++ ++ ++ ++ ++ ++ ++ ++ <% ++ for _, v in ipairs(ip.routes({ family = 6, type = 1 })) do ++ if v.dest and not v.dest:is6linklocal() then ++ %> ++ ++ ++ ++ ++ ++ ++ ++ <% ++ style = not style ++ end ++ end ++ %> ++
    <%:Network%><%:Target%><%:Source%><%:Metric%><%:Table%>
    <%=luci.tools.webadmin.iface_get_network(v.dev) or '(' .. v.dev .. ')'%><%=v.dest%><%=v.from%><%=v.metric or 0%><%=rtn[v.table] or v.table%>
    ++
    ++
    ++
    ++ ++
    ++ <%:IPv6 Neighbours%> ++ ++
    ++ ++ ++ ++ ++ ++ ++ <% ++ for _, v in ipairs(ip.neighbors({ family = 6 })) do ++ if v.dest and not v.dest:is6linklocal() and v.mac then ++ %> ++ ++ ++ ++ ++ ++ <% ++ style = not style ++ end ++ end ++ %> ++
    <%:IPv6-Address%><%:MAC-Address%><%:Interface%>
    <%=v.dest%><%=v.mac%><%=luci.tools.webadmin.iface_get_network(v.dev) or '(' .. v.dev .. ')'%>
    ++
    ++
    ++
    ++ <% end %> ++
    ++ ++<%+footer%> +diff --git a/feeds/luci/modules/luci-mod-admin-full/luasrc/view/admin_status/syslog.htm b/feeds/luci/modules/luci-mod-admin-full/luasrc/view/admin_status/syslog.htm +new file mode 100644 +index 0000000..40032a1 +--- /dev/null ++++ b/feeds/luci/modules/luci-mod-admin-full/luasrc/view/admin_status/syslog.htm +@@ -0,0 +1,12 @@ ++<%# ++ Copyright 2008 Steven Barth ++ Copyright 2008 Jo-Philipp Wich ++ Licensed to the public under the Apache License 2.0. ++-%> ++ ++<%+header%> ++

    <%:System Log%>

    ++
    ++ ++
    ++<%+footer%> +diff --git a/feeds/luci/modules/luci-mod-admin-full/luasrc/view/admin_status/wireless.htm b/feeds/luci/modules/luci-mod-admin-full/luasrc/view/admin_status/wireless.htm +new file mode 100644 +index 0000000..025fece +--- /dev/null ++++ b/feeds/luci/modules/luci-mod-admin-full/luasrc/view/admin_status/wireless.htm +@@ -0,0 +1,371 @@ ++<%# ++ Copyright 2011 Jo-Philipp Wich ++ Licensed to the public under the Apache License 2.0. ++-%> ++ ++<%- ++ local ntm = require "luci.model.network".init() ++ ++ local dev ++ local devices = { } ++ for _, dev in luci.util.vspairs(luci.sys.net.devices()) do ++ if dev:match("^wlan%d") or dev:match("^ath%d") or dev:match("^wl%d") then ++ devices[#devices+1] = dev ++ end ++ end ++ ++ local curdev = luci.dispatcher.context.requestpath ++ curdev = curdev[#curdev] ~= "wireless" and curdev[#curdev] or devices[1] ++-%> ++ ++<%+header%> ++ ++ ++ ++ ++

    <%:Realtime Wireless%>

    ++ ++
      ++ <% for _, dev in ipairs(devices) do %> ++
    • "><%=pcdata(dev)%>
    • ++ <% end %> ++
    ++ ++ ++
    -
    ++
    ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
    <%:Signal:%>0 <%:dBm%><%:Average:%>0 <%:dBm%><%:Peak:%>0 <%:dBm%>
    <%:Noise:%>0 <%:dBm%><%:Average:%>0 <%:dBm%><%:Peak:%>0 <%:dBm%>
    ++ ++
    ++ ++ ++
    -
    ++
    ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
    <%:Phy Rate:%>0 MBit/s<%:Average:%>0 MBit/s<%:Peak:%>0 MBit/s
    ++ ++<%+footer%> +diff --git a/feeds/luci/modules/luci-mod-admin-full/luasrc/view/admin_system/applyreboot.htm b/feeds/luci/modules/luci-mod-admin-full/luasrc/view/admin_system/applyreboot.htm +new file mode 100644 +index 0000000..15c96e3 +--- /dev/null ++++ b/feeds/luci/modules/luci-mod-admin-full/luasrc/view/admin_system/applyreboot.htm +@@ -0,0 +1,41 @@ ++<%# ++ Copyright 2008 Steven Barth ++ Copyright 2008 Jo-Philipp Wich ++ Licensed to the public under the Apache License 2.0. ++-%> ++ ++ ++ ++ <%=luci.sys.hostname()%> - <% if title then %><%=title%><% else %><%:Rebooting...%><% end %> ++ ++ ++ ++ ++ ++
    ++
    ++

    <%:System%> - <% if title then %><%=title%><% else %><%:Rebooting...%><% end %>

    ++
    ++

    ++ <% if msg then %><%=msg%><% else %><%:Changes applied.%><% end %> ++

    ++

    ++ <%:Loading%> ++ <%:Waiting for changes to be applied...%> ++

    ++
    ++
    ++
    ++ ++ +diff --git a/feeds/luci/modules/luci-mod-admin-full/luasrc/view/admin_system/backupfiles.htm b/feeds/luci/modules/luci-mod-admin-full/luasrc/view/admin_system/backupfiles.htm +new file mode 100644 +index 0000000..0a6df10 +--- /dev/null ++++ b/feeds/luci/modules/luci-mod-admin-full/luasrc/view/admin_system/backupfiles.htm +@@ -0,0 +1,10 @@ ++<%# ++ Copyright 2008 Steven Barth ++ Copyright 2008 Jo-Philipp Wich ++ Licensed to the public under the Apache License 2.0. ++-%> ++ ++ +diff --git a/feeds/luci/modules/luci-mod-admin-full/luasrc/view/admin_system/clock_status.htm b/feeds/luci/modules/luci-mod-admin-full/luasrc/view/admin_system/clock_status.htm +new file mode 100644 +index 0000000..84e1510 +--- /dev/null ++++ b/feeds/luci/modules/luci-mod-admin-full/luasrc/view/admin_system/clock_status.htm +@@ -0,0 +1,36 @@ ++<%+cbi/valueheader%> ++ ++ ++ ++<%:Collecting data...%> ++ ++ ++<%+cbi/valuefooter%> +diff --git a/feeds/luci/modules/luci-mod-admin-full/luasrc/view/admin_system/flashops.htm b/feeds/luci/modules/luci-mod-admin-full/luasrc/view/admin_system/flashops.htm +new file mode 100644 +index 0000000..bea565a +--- /dev/null ++++ b/feeds/luci/modules/luci-mod-admin-full/luasrc/view/admin_system/flashops.htm +@@ -0,0 +1,85 @@ ++<%# ++ Copyright 2008 Steven Barth ++ Copyright 2008 Jo-Philipp Wich ++ Licensed to the public under the Apache License 2.0. ++-%> ++ ++<%+header%> ++ ++

    <%:Flash operations%>

    ++ ++ ++ ++
    ++ ++
    ++ <%:Backup / Restore%> ++
    ++
    <%:Click "Generate archive" to download a tar archive of the current configuration files. To reset the firmware to its initial state, click "Perform reset" (only possible with squashfs images).%>
    ++
    ++
    ++ ++
    ++ ++
    ++
    ++ <% if reset_avail then %> ++
    ++ ++
    ++ ++
    ++
    ++ <% end %> ++
    ++
    ++
    <%:To restore configuration files, you can upload a previously generated backup archive here.%>
    ++
    ++
    ++ ++
    ++ ++ ++
    ++
    ++
    ++
    ++
    ++ ++
    ++ ++
    ++ <%:Flash new firmware image%> ++ <% if upgrade_avail then %> ++
    ++
    <%:Upload a sysupgrade-compatible image here to replace the running firmware. Check "Keep settings" to retain the current configuration (requires an OpenWrt compatible firmware image).%>
    ++
    ++
    ++ ++
    ++ ++
    ++
    ++
    ++ ++
    ++ ++ ++
    ++
    ++
    ++ <% if image_invalid then %> ++
    <%:The uploaded image file does not contain a supported format. Make sure that you choose the generic image format for your platform. %>
    ++ <% end %> ++
    ++ <% else %> ++
    <%:Sorry, there is no sysupgrade support present; a new firmware image must be flashed manually. Please refer to the OpenWrt wiki for device specific install instructions.%>
    ++ <% end %> ++
    ++ ++
    ++ ++<%+footer%> +diff --git a/feeds/luci/modules/luci-mod-admin-full/luasrc/view/admin_system/ipkg.htm b/feeds/luci/modules/luci-mod-admin-full/luasrc/view/admin_system/ipkg.htm +new file mode 100644 +index 0000000..6b812e8 +--- /dev/null ++++ b/feeds/luci/modules/luci-mod-admin-full/luasrc/view/admin_system/ipkg.htm +@@ -0,0 +1,10 @@ ++<%# ++ Copyright 2008 Steven Barth ++ Copyright 2008 Jo-Philipp Wich ++ Licensed to the public under the Apache License 2.0. ++-%> ++ ++ +diff --git a/feeds/luci/modules/luci-mod-admin-full/luasrc/view/admin_system/packages.htm b/feeds/luci/modules/luci-mod-admin-full/luasrc/view/admin_system/packages.htm +new file mode 100644 +index 0000000..fe2fe04 +--- /dev/null ++++ b/feeds/luci/modules/luci-mod-admin-full/luasrc/view/admin_system/packages.htm +@@ -0,0 +1,196 @@ ++<%# ++ Copyright 2008 Steven Barth ++ Copyright 2008-2010 Jo-Philipp Wich ++ Licensed to the public under the Apache License 2.0. ++-%> ++ ++<%- ++local opkg = require "luci.model.ipkg" ++local fs = require "nixio.fs" ++local wa = require "luci.tools.webadmin" ++local rowcnt = 1 ++ ++function rowstyle() ++ rowcnt = rowcnt + 1 ++ return (rowcnt % 2) + 1 ++end ++ ++local fstat = fs.statvfs(opkg.overlay_root()) ++local space_total = fstat and fstat.blocks or 0 ++local space_free = fstat and fstat.bfree or 0 ++local space_used = space_total - space_free ++ ++local used_perc = math.floor(0.5 + ((space_total > 0) and ((100 / space_total) * space_used) or 100)) ++local free_byte = space_free * fstat.frsize ++ ++local filter = { } ++ ++ ++local opkg_list = luci.model.ipkg.list_all ++local querypat ++if query and #query > 0 then ++ querypat = '*%s*' % query ++ opkg_list = luci.model.ipkg.find ++end ++ ++local letterpat ++if letter == 35 then ++ letterpat = "[^a-z]*" ++else ++ letterpat = string.char(letter, 42) -- 'A' '*' ++end ++ ++-%> ++ ++<%+header%> ++ ++

    <%:Software%>

    ++ ++
    ++
    ++ ++ ++ ++
    ++ ++ ++
    ++ <% if (install and next(install)) or (remove and next(remove)) or update or upgrade then %> ++
    ++ <% if #stdout > 0 then %>
    <%=pcdata(stdout)%>
    <% end %> ++ <% if #stderr > 0 then %>
    <%=pcdata(stderr)%>
    <% end %> ++
    ++ <% end %> ++ ++ <% if querypat then %> ++
    ++ <%:Displaying only packages containing%> "<%=pcdata(query)%>" ++ ++
    ++
    ++ <% end %> ++ ++ <% if no_lists or old_lists then %> ++
    ++ <% if old_lists then %> ++ <%:Package lists are older than 24 hours%> ++ <% else %> ++ <%:No package lists available%> ++ <% end %> ++ ++
    ++ <% end %> ++ ++
    ++ <%:Free space%>: <%=(100-used_perc)%>% (<%=wa.byte_format(free_byte)%>) ++
    ++
     
    ++
    ++
    ++
    ++ ++
    ++ ++
    ++ ++ ++
    ++ ++
    ++ ++ ++
    ++
    ++ ++
    ++ ++
    ++ ++ ++
    ++
    ++
    ++
    ++
    ++ ++

    <%:Status%>

    ++ ++ ++ ++ ++ <% if display ~= "available" then %> ++
    ++ ++ ++ ++ ++ ++ ++ <% local empty = true; luci.model.ipkg.list_installed(querypat, function(n, v, s, d) empty = false; filter[n] = true %> ++ ++ ++ ++ ++ ++ <% end) %> ++ <% if empty then %> ++ ++ ++ ++ ++ ++ <% end %> ++
     <%:Package name%><%:Version%>
    <%:Remove%><%=luci.util.pcdata(n)%><%=luci.util.pcdata(v)%>
     <%:none%><%:none%>
    ++
    ++ <% else %> ++
    ++ <% if not querypat then %> ++ ++
    ++ <% end %> ++ ++ ++ ++ ++ ++ ++ ++ ++ <% local empty = true; opkg_list(querypat or letterpat, function(n, v, s, d) if filter[n] then return end; empty = false %> ++ ++ ++ ++ ++ ++ ++ ++ <% end) %> ++ <% if empty then %> ++ ++ ++ ++ ++ ++ ++ ++ <% end %> ++
     <%:Package name%><%:Version%><%:Size (.ipk)%><%:Description%>
    <%:Install%><%=luci.util.pcdata(n)%><%=luci.util.pcdata(v)%><%=luci.util.pcdata(s)%><%=luci.util.pcdata(d)%>
     <%:none%><%:none%><%:none%><%:none%>
    ++ <% if not querypat then %> ++
    ++ <% end %> ++
    ++ <% end %> ++
    ++
    ++<%+footer%> +diff --git a/feeds/luci/modules/luci-mod-admin-full/luasrc/view/admin_system/reboot.htm b/feeds/luci/modules/luci-mod-admin-full/luasrc/view/admin_system/reboot.htm +new file mode 100644 +index 0000000..8076811 +--- /dev/null ++++ b/feeds/luci/modules/luci-mod-admin-full/luasrc/view/admin_system/reboot.htm +@@ -0,0 +1,25 @@ ++<%# ++ Copyright 2008 Steven Barth ++ Copyright 2008 Jo-Philipp Wich ++ Licensed to the public under the Apache License 2.0. ++-%> ++ ++<%+header%> ++

    <%:System%>

    ++

    <%:Reboot%>

    ++

    <%:Reboots the operating system of your device%>

    ++<%- ++local c = require("luci.model.uci").cursor():changes() ++if c and next(c) then ++-%> ++

    <%:Warning: There are unsaved changes that will be lost while rebooting!%>

    ++<%- ++end ++if not reboot then ++-%> ++

    <%:Perform reboot%>

    ++<%- else -%> ++

    <%:Please wait: Device rebooting...%>

    ++ ++<%- end -%> ++<%+footer%> +\ No newline at end of file +diff --git a/feeds/luci/modules/luci-mod-admin-full/luasrc/view/admin_system/upgrade.htm b/feeds/luci/modules/luci-mod-admin-full/luasrc/view/admin_system/upgrade.htm +new file mode 100644 +index 0000000..b9d4235 +--- /dev/null ++++ b/feeds/luci/modules/luci-mod-admin-full/luasrc/view/admin_system/upgrade.htm +@@ -0,0 +1,58 @@ ++<%# ++ Copyright 2008 Steven Barth ++ Copyright 2008-2009 Jo-Philipp Wich ++ Licensed to the public under the Apache License 2.0. ++-%> ++ ++<%+header%> ++ ++

    <%:Flash Firmware%> - <%:Verify%>

    ++

    ++ <%_ The flash image was uploaded. ++ Below is the checksum and file size listed, ++ compare them with the original file to ensure data integrity.
    ++ Click "Proceed" below to start the flash procedure. %> ++ ++ <% if storage > 0 and size > storage then %> ++

    ++

    <%:It appears that you are trying to ++ flash an image that does not fit into the flash memory, please verify ++ the image file! %>
    ++ <% end %> ++ ++

    ++ ++
    ++
      ++
    • <%:Checksum%>: <%=checksum%>
    • ++
    • <%:Size%>: <% ++ local w = require "luci.tools.webadmin" ++ write(w.byte_format(size)) ++ ++ if storage > 0 then ++ write(luci.i18n.translatef( ++ " (%s available)", ++ w.byte_format(storage) ++ )) ++ end ++ %>
    • ++
    • <% if keep then %> ++ <%:Configuration files will be kept.%> ++ <% else %> ++ <%:Note: Configuration files will be erased.%> ++ <% end %>
    • ++
    ++
    ++ ++
    ++
    ++ ++
    ++
    ++ ++ " /> ++ ++
    ++
    ++ ++<%+footer%> +diff --git a/feeds/luci/modules/luci-mod-admin-full/luasrc/view/admin_uci/apply.htm b/feeds/luci/modules/luci-mod-admin-full/luasrc/view/admin_uci/apply.htm +new file mode 100644 +index 0000000..4284b44 +--- /dev/null ++++ b/feeds/luci/modules/luci-mod-admin-full/luasrc/view/admin_uci/apply.htm +@@ -0,0 +1,23 @@ ++<%# ++ Copyright 2008 Steven Barth ++ Copyright 2008 Jo-Philipp Wich ++ Licensed to the public under the Apache License 2.0. ++-%> ++ ++<%+header%> ++ ++

    <%:Configuration%> / <%:Apply%>

    ++ ++<% if changes then %> ++ <%+cbi/apply_xhr%> ++ <%+admin_uci/changelog%> ++ ++ <%- cbi_apply_xhr('uci-apply', configs) -%> ++ ++

    <%:The following changes have been committed%>:

    ++ <%- uci_changelog(changes) -%> ++<% else %> ++

    <%:There are no pending changes to apply!%>

    ++<% end %> ++ ++<%+footer%> +diff --git a/feeds/luci/modules/luci-mod-admin-full/luasrc/view/admin_uci/changelog.htm b/feeds/luci/modules/luci-mod-admin-full/luasrc/view/admin_uci/changelog.htm +new file mode 100644 +index 0000000..4ed4f0a +--- /dev/null ++++ b/feeds/luci/modules/luci-mod-admin-full/luasrc/view/admin_uci/changelog.htm +@@ -0,0 +1,79 @@ ++<%# ++ Copyright 2010 Jo-Philipp Wich ++ Licensed to the public under the Apache License 2.0. ++-%> ++ ++<% export("uci_changelog", function(changes) -%> ++
    ++ <%:Legend:%> ++
    ++
      <%:Section added%>
    ++
      <%:Section removed%>
    ++
      <%:Option changed%>
    ++
      <%:Option removed%>
    ++
    ++
    ++
    ++ ++
    <% ++ local util = luci.util ++ local ret = { } ++ ++ for r, tbl in pairs(changes) do ++ for s, os in pairs(tbl) do ++ -- section add ++ if os['.type'] and os['.type'] ~= "" then ++ ret[#ret+1] = "%s.%s=%s" %{ r, s, os['.type'] } ++ for o, v in util.kspairs(os) do ++ if o:sub(1,1) ~= "." then ++ if type(v) == "table" then ++ local i ++ for i = 1, #v do ++ ret[#ret+1] = "
    %s.%s.%s+=%s" ++ %{ r, s, o, util.pcdata(v[i]) } ++ end ++ else ++ ret[#ret+1] = "
    %s.%s.%s=%s" ++ %{ r, s, o, util.pcdata(v) } ++ end ++ end ++ end ++ ret[#ret+1] = "

    " ++ ++ -- section delete ++ elseif os['.type'] and os['.type'] == "" then ++ ret[#ret+1] = "%s.%s
    " %{ r, s } ++ ++ -- modifications ++ else ++ ret[#ret+1] = "%s.%s
    " %{ r, s } ++ for o, v in util.kspairs(os) do ++ if o:sub(1,1) ~= "." then ++ if v and #v > 0 then ++ ret[#ret+1] = "" ++ if type(v) == "table" then ++ local i ++ for i = 1, #v do ++ ret[#ret+1] = "%s.%s.%s+=%s
    " ++ %{ r, s, o, util.pcdata(v[i]) } ++ end ++ ++ else ++ ret[#ret+1] = "%s.%s.%s=%s
    " ++ %{ r, s, o, util.pcdata(v) } ++ end ++ ret[#ret+1] = "
    " ++ else ++ ret[#ret+1] = "%s.%s.%s
    " %{ r, s, o } ++ end ++ end ++ end ++ ret[#ret+1] = "

    " ++ end ++ end ++ end ++ ++ write(table.concat(ret)) ++ %>
    ++
    ++<%- end) %> +diff --git a/feeds/luci/modules/luci-mod-admin-full/luasrc/view/admin_uci/changes.htm b/feeds/luci/modules/luci-mod-admin-full/luasrc/view/admin_uci/changes.htm +new file mode 100644 +index 0000000..84e2287 +--- /dev/null ++++ b/feeds/luci/modules/luci-mod-admin-full/luasrc/view/admin_uci/changes.htm +@@ -0,0 +1,43 @@ ++<%# ++ Copyright 2008 Steven Barth ++ Copyright 2008 Jo-Philipp Wich ++ Licensed to the public under the Apache License 2.0. ++-%> ++ ++<%+header%> ++ ++

    <%:Configuration%> / <%:Changes%>

    ++ ++<% if changes then %> ++ <%+admin_uci/changelog%> ++ <%- uci_changelog(changes) -%> ++<% else %> ++

    <%:There are no pending changes!%>

    ++<% end %> ++ ++
    ++ <% local r = luci.http.formvalue("redir"); if r and #r > 0 then %> ++
    ++
    ++ ++
    ++
    ++ <% end %> ++ ++
    ++
    ++ " /> ++ ++
    ++
    ++ " /> ++ ++
    ++
    ++ " /> ++ ++
    ++
    ++
    ++ ++<%+footer%> +diff --git a/feeds/luci/modules/luci-mod-admin-full/luasrc/view/admin_uci/revert.htm b/feeds/luci/modules/luci-mod-admin-full/luasrc/view/admin_uci/revert.htm +new file mode 100644 +index 0000000..d2bdc7a +--- /dev/null ++++ b/feeds/luci/modules/luci-mod-admin-full/luasrc/view/admin_uci/revert.htm +@@ -0,0 +1,27 @@ ++<%# ++ Copyright 2008 Steven Barth ++ Copyright 2008 Jo-Philipp Wich ++ Licensed to the public under the Apache License 2.0. ++-%> ++ ++<%+header%> ++ ++

    <%:Configuration%> / <%:Revert%>

    ++ ++<% if changes then %> ++ <%+cbi/apply_xhr%> ++ <%+admin_uci/changelog%> ++ ++

    <%:The following changes have been reverted%>:

    ++ <%- uci_changelog(changes) -%> ++<% else %> ++

    <%:There are no pending changes to revert!%>

    ++<% end %> ++ ++
    ++
    "> ++ ++
    ++
    ++ ++<%+footer%> +diff --git a/feeds/luci/modules/luci-mod-admin-full/luasrc/view/cbi/wireless_modefreq.htm b/feeds/luci/modules/luci-mod-admin-full/luasrc/view/cbi/wireless_modefreq.htm +new file mode 100644 +index 0000000..ac14593 +--- /dev/null ++++ b/feeds/luci/modules/luci-mod-admin-full/luasrc/view/cbi/wireless_modefreq.htm +@@ -0,0 +1,167 @@ ++<%+cbi/valueheader%> ++ ++ ++ ++ ++ ++ ++ ++
    ++ ++ ++ ++<%+cbi/valuefooter%> +diff --git a/feeds/luci/modules/luci-mod-admin-full/src/Makefile b/feeds/luci/modules/luci-mod-admin-full/src/Makefile +new file mode 100644 +index 0000000..d6ed8c6 +--- /dev/null ++++ b/feeds/luci/modules/luci-mod-admin-full/src/Makefile +@@ -0,0 +1,14 @@ ++%.o: %.c ++ $(CC) $(CPPFLAGS) $(CFLAGS) $(FPIC) -c -o $@ $< ++ ++clean: ++ rm -f luci-bwc *.o ++ ++luci-bwc: luci-bwc.o ++ $(CC) $(LDFLAGS) -o $@ $^ -ldl ++ ++compile: luci-bwc ++ ++install: compile ++ mkdir -p $(DESTDIR)/usr/bin ++ cp luci-bwc $(DESTDIR)/usr/bin/luci-bwc +diff --git a/feeds/luci/modules/luci-mod-admin-full/src/luci-bwc.c b/feeds/luci/modules/luci-mod-admin-full/src/luci-bwc.c +new file mode 100644 +index 0000000..63668d4 +--- /dev/null ++++ b/feeds/luci/modules/luci-mod-admin-full/src/luci-bwc.c +@@ -0,0 +1,778 @@ ++/* ++ * luci-bwc - Very simple bandwidth collector cache for LuCI realtime graphs ++ * ++ * Copyright (C) 2010 Jo-Philipp Wich ++ * ++ * Licensed under the Apache License, Version 2.0 (the "License"); ++ * you may not use this file except in compliance with the License. ++ * You may obtain a copy of the License at ++ * ++ * http://www.apache.org/licenses/LICENSE-2.0 ++ * ++ * Unless required by applicable law or agreed to in writing, software ++ * distributed under the License is distributed on an "AS IS" BASIS, ++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. ++ * See the License for the specific language governing permissions and ++ * limitations under the License. ++ */ ++ ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++ ++#include ++#include ++#include ++ ++#include ++#include ++ ++#define STEP_COUNT 60 ++#define STEP_TIME 1 ++#define TIMEOUT 10 ++ ++#define PID_PATH "/var/run/luci-bwc.pid" ++ ++#define DB_PATH "/var/lib/luci-bwc" ++#define DB_IF_FILE DB_PATH "/if/%s" ++#define DB_RD_FILE DB_PATH "/radio/%s" ++#define DB_CN_FILE DB_PATH "/connections" ++#define DB_LD_FILE DB_PATH "/load" ++ ++#define IF_SCAN_PATTERN \ ++ " %[^ :]:%u %u" \ ++ " %*d %*d %*d %*d %*d %*d" \ ++ " %u %u" ++ ++#define LD_SCAN_PATTERN \ ++ "%f %f %f" ++ ++ ++struct file_map { ++ int fd; ++ int size; ++ char *mmap; ++}; ++ ++struct traffic_entry { ++ uint32_t time; ++ uint32_t rxb; ++ uint32_t rxp; ++ uint32_t txb; ++ uint32_t txp; ++}; ++ ++struct conn_entry { ++ uint32_t time; ++ uint32_t udp; ++ uint32_t tcp; ++ uint32_t other; ++}; ++ ++struct load_entry { ++ uint32_t time; ++ uint16_t load1; ++ uint16_t load5; ++ uint16_t load15; ++}; ++ ++struct radio_entry { ++ uint32_t time; ++ uint16_t rate; ++ uint8_t rssi; ++ uint8_t noise; ++}; ++ ++static int readpid(void) ++{ ++ int fd; ++ int pid = -1; ++ char buf[9] = { 0 }; ++ ++ if ((fd = open(PID_PATH, O_RDONLY)) > -1) ++ { ++ if (read(fd, buf, sizeof(buf))) ++ { ++ buf[8] = 0; ++ pid = atoi(buf); ++ } ++ ++ close(fd); ++ } ++ ++ return pid; ++} ++ ++static int writepid(void) ++{ ++ int fd; ++ int wlen; ++ char buf[9] = { 0 }; ++ ++ if ((fd = open(PID_PATH, O_WRONLY | O_CREAT | O_TRUNC, 0600)) > -1) ++ { ++ wlen = snprintf(buf, sizeof(buf), "%i", getpid()); ++ write(fd, buf, wlen); ++ close(fd); ++ ++ return 0; ++ } ++ ++ return -1; ++} ++ ++static int timeout = TIMEOUT; ++static int countdown = -1; ++ ++static void reset_countdown(int sig) ++{ ++ countdown = timeout; ++ ++} ++ ++ ++static char *progname; ++static int prognamelen; ++ ++static struct iwinfo_ops *backend = NULL; ++ ++ ++static int init_directory(char *path) ++{ ++ char *p = path; ++ ++ for (p = &path[1]; *p; p++) ++ { ++ if (*p == '/') ++ { ++ *p = 0; ++ ++ if (mkdir(path, 0700) && (errno != EEXIST)) ++ return -1; ++ ++ *p = '/'; ++ } ++ } ++ ++ return 0; ++} ++ ++static int init_file(char *path, int esize) ++{ ++ int i, file; ++ char buf[sizeof(struct traffic_entry)] = { 0 }; ++ ++ if (init_directory(path)) ++ return -1; ++ ++ if ((file = open(path, O_WRONLY | O_CREAT, 0600)) >= 0) ++ { ++ for (i = 0; i < STEP_COUNT; i++) ++ { ++ if (write(file, buf, esize) < 0) ++ break; ++ } ++ ++ close(file); ++ ++ return 0; ++ } ++ ++ return -1; ++} ++ ++static inline uint32_t timeof(void *entry) ++{ ++ return ntohl(((struct traffic_entry *)entry)->time); ++} ++ ++static int update_file(const char *path, void *entry, int esize) ++{ ++ int rv = -1; ++ int file; ++ char *map; ++ ++ if ((file = open(path, O_RDWR)) >= 0) ++ { ++ map = mmap(NULL, esize * STEP_COUNT, PROT_READ | PROT_WRITE, ++ MAP_SHARED | MAP_LOCKED, file, 0); ++ ++ if ((map != NULL) && (map != MAP_FAILED)) ++ { ++ if (timeof(entry) > timeof(map + esize * (STEP_COUNT-1))) ++ { ++ memmove(map, map + esize, esize * (STEP_COUNT-1)); ++ memcpy(map + esize * (STEP_COUNT-1), entry, esize); ++ } ++ ++ munmap(map, esize * STEP_COUNT); ++ ++ rv = 0; ++ } ++ ++ close(file); ++ } ++ ++ return rv; ++} ++ ++static int mmap_file(const char *path, int esize, struct file_map *m) ++{ ++ m->fd = -1; ++ m->size = -1; ++ m->mmap = NULL; ++ ++ if ((m->fd = open(path, O_RDONLY)) >= 0) ++ { ++ m->size = STEP_COUNT * esize; ++ m->mmap = mmap(NULL, m->size, PROT_READ, ++ MAP_SHARED | MAP_LOCKED, m->fd, 0); ++ ++ if ((m->mmap != NULL) && (m->mmap != MAP_FAILED)) ++ return 0; ++ } ++ ++ return -1; ++} ++ ++static void umap_file(struct file_map *m) ++{ ++ if ((m->mmap != NULL) && (m->mmap != MAP_FAILED)) ++ munmap(m->mmap, m->size); ++ ++ if (m->fd > -1) ++ close(m->fd); ++} ++ ++static void * iw_open(void) ++{ ++ return dlopen("/usr/lib/libiwinfo.so", RTLD_LAZY); ++} ++ ++static int iw_update( ++ void *iw, const char *ifname, uint16_t *rate, uint8_t *rssi, uint8_t *noise ++) { ++ struct iwinfo_ops *(*probe)(const char *); ++ int val; ++ ++ if (!backend) ++ { ++ probe = dlsym(iw, "iwinfo_backend"); ++ ++ if (!probe) ++ return 0; ++ ++ backend = probe(ifname); ++ ++ if (!backend) ++ return 0; ++ } ++ ++ *rate = (backend->bitrate && !backend->bitrate(ifname, &val)) ? val : 0; ++ *rssi = (backend->signal && !backend->signal(ifname, &val)) ? val : 0; ++ *noise = (backend->noise && !backend->noise(ifname, &val)) ? val : 0; ++ ++ return 1; ++} ++ ++static void iw_close(void *iw) ++{ ++ void (*finish)(void); ++ ++ finish = dlsym(iw, "iwinfo_finish"); ++ ++ if (finish) ++ finish(); ++ ++ dlclose(iw); ++} ++ ++ ++static int update_ifstat( ++ const char *ifname, uint32_t rxb, uint32_t rxp, uint32_t txb, uint32_t txp ++) { ++ char path[1024]; ++ ++ struct stat s; ++ struct traffic_entry e; ++ ++ snprintf(path, sizeof(path), DB_IF_FILE, ifname); ++ ++ if (stat(path, &s)) ++ { ++ if (init_file(path, sizeof(struct traffic_entry))) ++ { ++ fprintf(stderr, "Failed to init %s: %s\n", ++ path, strerror(errno)); ++ ++ return -1; ++ } ++ } ++ ++ e.time = htonl(time(NULL)); ++ e.rxb = htonl(rxb); ++ e.rxp = htonl(rxp); ++ e.txb = htonl(txb); ++ e.txp = htonl(txp); ++ ++ return update_file(path, &e, sizeof(struct traffic_entry)); ++} ++ ++static int update_radiostat( ++ const char *ifname, uint16_t rate, uint8_t rssi, uint8_t noise ++) { ++ char path[1024]; ++ ++ struct stat s; ++ struct radio_entry e; ++ ++ snprintf(path, sizeof(path), DB_RD_FILE, ifname); ++ ++ if (stat(path, &s)) ++ { ++ if (init_file(path, sizeof(struct radio_entry))) ++ { ++ fprintf(stderr, "Failed to init %s: %s\n", ++ path, strerror(errno)); ++ ++ return -1; ++ } ++ } ++ ++ e.time = htonl(time(NULL)); ++ e.rate = htons(rate); ++ e.rssi = rssi; ++ e.noise = noise; ++ ++ return update_file(path, &e, sizeof(struct radio_entry)); ++} ++ ++static int update_cnstat(uint32_t udp, uint32_t tcp, uint32_t other) ++{ ++ char path[1024]; ++ ++ struct stat s; ++ struct conn_entry e; ++ ++ snprintf(path, sizeof(path), DB_CN_FILE); ++ ++ if (stat(path, &s)) ++ { ++ if (init_file(path, sizeof(struct conn_entry))) ++ { ++ fprintf(stderr, "Failed to init %s: %s\n", ++ path, strerror(errno)); ++ ++ return -1; ++ } ++ } ++ ++ e.time = htonl(time(NULL)); ++ e.udp = htonl(udp); ++ e.tcp = htonl(tcp); ++ e.other = htonl(other); ++ ++ return update_file(path, &e, sizeof(struct conn_entry)); ++} ++ ++static int update_ldstat(uint16_t load1, uint16_t load5, uint16_t load15) ++{ ++ char path[1024]; ++ ++ struct stat s; ++ struct load_entry e; ++ ++ snprintf(path, sizeof(path), DB_LD_FILE); ++ ++ if (stat(path, &s)) ++ { ++ if (init_file(path, sizeof(struct load_entry))) ++ { ++ fprintf(stderr, "Failed to init %s: %s\n", ++ path, strerror(errno)); ++ ++ return -1; ++ } ++ } ++ ++ e.time = htonl(time(NULL)); ++ e.load1 = htons(load1); ++ e.load5 = htons(load5); ++ e.load15 = htons(load15); ++ ++ return update_file(path, &e, sizeof(struct load_entry)); ++} ++ ++static int run_daemon(void) ++{ ++ FILE *info; ++ uint32_t rxb, txb, rxp, txp; ++ uint32_t udp, tcp, other; ++ uint16_t rate; ++ uint8_t rssi, noise; ++ float lf1, lf5, lf15; ++ char line[1024]; ++ char ifname[16]; ++ int i; ++ void *iw; ++ struct sigaction sa; ++ ++ struct stat s; ++ const char *ipc = stat("/proc/net/nf_conntrack", &s) ++ ? "/proc/net/ip_conntrack" : "/proc/net/nf_conntrack"; ++ ++ switch (fork()) ++ { ++ case -1: ++ perror("fork()"); ++ return -1; ++ ++ case 0: ++ if (chdir("/") < 0) ++ { ++ perror("chdir()"); ++ exit(1); ++ } ++ ++ close(0); ++ close(1); ++ close(2); ++ break; ++ ++ default: ++ return 0; ++ } ++ ++ /* setup USR1 signal handler to reset timer */ ++ sa.sa_handler = reset_countdown; ++ sa.sa_flags = SA_RESTART; ++ sigemptyset(&sa.sa_mask); ++ sigaction(SIGUSR1, &sa, NULL); ++ ++ /* write pid */ ++ if (writepid()) ++ { ++ fprintf(stderr, "Failed to write pid file: %s\n", strerror(errno)); ++ return 1; ++ } ++ ++ /* initialize iwinfo */ ++ iw = iw_open(); ++ ++ /* go */ ++ for (reset_countdown(0); countdown >= 0; countdown--) ++ { ++ /* alter progname for ps, top */ ++ memset(progname, 0, prognamelen); ++ snprintf(progname, prognamelen, "luci-bwc %d", countdown); ++ ++ if ((info = fopen("/proc/net/dev", "r")) != NULL) ++ { ++ while (fgets(line, sizeof(line), info)) ++ { ++ if (strchr(line, '|')) ++ continue; ++ ++ if (sscanf(line, IF_SCAN_PATTERN, ifname, &rxb, &rxp, &txb, &txp)) ++ { ++ if (strncmp(ifname, "lo", sizeof(ifname))) ++ update_ifstat(ifname, rxb, rxp, txb, txp); ++ } ++ } ++ ++ fclose(info); ++ } ++ ++ if (iw) ++ { ++ for (i = 0; i < 5; i++) ++ { ++#define iw_checkif(pattern) \ ++ do { \ ++ snprintf(ifname, sizeof(ifname), pattern, i); \ ++ if (iw_update(iw, ifname, &rate, &rssi, &noise)) \ ++ { \ ++ update_radiostat(ifname, rate, rssi, noise); \ ++ continue; \ ++ } \ ++ } while(0) ++ ++ iw_checkif("wlan%d"); ++ iw_checkif("ath%d"); ++ iw_checkif("wl%d"); ++ } ++ } ++ ++ if ((info = fopen(ipc, "r")) != NULL) ++ { ++ udp = 0; ++ tcp = 0; ++ other = 0; ++ ++ while (fgets(line, sizeof(line), info)) ++ { ++ if (strstr(line, "TIME_WAIT")) ++ continue; ++ ++ if (strstr(line, "src=127.0.0.1 ") && ++ strstr(line, "dst=127.0.0.1 ")) ++ continue; ++ ++ if (sscanf(line, "%*s %*d %s", ifname) || sscanf(line, "%s %*d", ifname)) ++ { ++ if (!strcmp(ifname, "tcp")) ++ tcp++; ++ else if (!strcmp(ifname, "udp")) ++ udp++; ++ else ++ other++; ++ } ++ } ++ ++ update_cnstat(udp, tcp, other); ++ ++ fclose(info); ++ } ++ ++ if ((info = fopen("/proc/loadavg", "r")) != NULL) ++ { ++ if (fscanf(info, LD_SCAN_PATTERN, &lf1, &lf5, &lf15)) ++ { ++ update_ldstat((uint16_t)(lf1 * 100), ++ (uint16_t)(lf5 * 100), ++ (uint16_t)(lf15 * 100)); ++ } ++ ++ fclose(info); ++ } ++ ++ sleep(STEP_TIME); ++ } ++ ++ unlink(PID_PATH); ++ ++ if (iw) ++ iw_close(iw); ++ ++ return 0; ++} ++ ++static void check_daemon(void) ++{ ++ int pid; ++ ++ if ((pid = readpid()) < 0 || kill(pid, 0) < 0) ++ { ++ /* daemon ping failed, try to start it up */ ++ if (run_daemon()) ++ { ++ fprintf(stderr, ++ "Failed to ping daemon and unable to start it up: %s\n", ++ strerror(errno)); ++ ++ exit(1); ++ } ++ } ++ else if (kill(pid, SIGUSR1)) ++ { ++ fprintf(stderr, "Failed to send signal: %s\n", strerror(errno)); ++ exit(2); ++ } ++} ++ ++static int run_dump_ifname(const char *ifname) ++{ ++ int i; ++ char path[1024]; ++ struct file_map m; ++ struct traffic_entry *e; ++ ++ check_daemon(); ++ snprintf(path, sizeof(path), DB_IF_FILE, ifname); ++ ++ if (mmap_file(path, sizeof(struct traffic_entry), &m)) ++ { ++ fprintf(stderr, "Failed to open %s: %s\n", path, strerror(errno)); ++ return 1; ++ } ++ ++ for (i = 0; i < m.size; i += sizeof(struct traffic_entry)) ++ { ++ e = (struct traffic_entry *) &m.mmap[i]; ++ ++ if (!e->time) ++ continue; ++ ++ printf("[ %u, %u, %" PRIu32 ++ ", %u, %u ]%s\n", ++ ntohl(e->time), ++ ntohl(e->rxb), ntohl(e->rxp), ++ ntohl(e->txb), ntohl(e->txp), ++ ((i + sizeof(struct traffic_entry)) < m.size) ? "," : ""); ++ } ++ ++ umap_file(&m); ++ ++ return 0; ++} ++ ++static int run_dump_radio(const char *ifname) ++{ ++ int i; ++ char path[1024]; ++ struct file_map m; ++ struct radio_entry *e; ++ ++ check_daemon(); ++ snprintf(path, sizeof(path), DB_RD_FILE, ifname); ++ ++ if (mmap_file(path, sizeof(struct radio_entry), &m)) ++ { ++ fprintf(stderr, "Failed to open %s: %s\n", path, strerror(errno)); ++ return 1; ++ } ++ ++ for (i = 0; i < m.size; i += sizeof(struct radio_entry)) ++ { ++ e = (struct radio_entry *) &m.mmap[i]; ++ ++ if (!e->time) ++ continue; ++ ++ printf("[ %u, %d, %d, %d ]%s\n", ++ ntohl(e->time), ++ e->rate, e->rssi, e->noise, ++ ((i + sizeof(struct radio_entry)) < m.size) ? "," : ""); ++ } ++ ++ umap_file(&m); ++ ++ return 0; ++} ++ ++static int run_dump_conns(void) ++{ ++ int i; ++ char path[1024]; ++ struct file_map m; ++ struct conn_entry *e; ++ ++ check_daemon(); ++ snprintf(path, sizeof(path), DB_CN_FILE); ++ ++ if (mmap_file(path, sizeof(struct conn_entry), &m)) ++ { ++ fprintf(stderr, "Failed to open %s: %s\n", path, strerror(errno)); ++ return 1; ++ } ++ ++ for (i = 0; i < m.size; i += sizeof(struct conn_entry)) ++ { ++ e = (struct conn_entry *) &m.mmap[i]; ++ ++ if (!e->time) ++ continue; ++ ++ printf("[ %u, %u, %u, %u ]%s\n", ++ ntohl(e->time), ntohl(e->udp), ++ ntohl(e->tcp), ntohl(e->other), ++ ((i + sizeof(struct conn_entry)) < m.size) ? "," : ""); ++ } ++ ++ umap_file(&m); ++ ++ return 0; ++} ++ ++static int run_dump_load(void) ++{ ++ int i; ++ char path[1024]; ++ struct file_map m; ++ struct load_entry *e; ++ ++ check_daemon(); ++ snprintf(path, sizeof(path), DB_LD_FILE); ++ ++ if (mmap_file(path, sizeof(struct load_entry), &m)) ++ { ++ fprintf(stderr, "Failed to open %s: %s\n", path, strerror(errno)); ++ return 1; ++ } ++ ++ for (i = 0; i < m.size; i += sizeof(struct load_entry)) ++ { ++ e = (struct load_entry *) &m.mmap[i]; ++ ++ if (!e->time) ++ continue; ++ ++ printf("[ %u, %u, %u, %u ]%s\n", ++ ntohl(e->time), ++ ntohs(e->load1), ntohs(e->load5), ntohs(e->load15), ++ ((i + sizeof(struct load_entry)) < m.size) ? "," : ""); ++ } ++ ++ umap_file(&m); ++ ++ return 0; ++} ++ ++ ++int main(int argc, char *argv[]) ++{ ++ int opt; ++ ++ progname = argv[0]; ++ prognamelen = -1; ++ ++ for (opt = 0; opt < argc; opt++) ++ prognamelen += 1 + strlen(argv[opt]); ++ ++ while ((opt = getopt(argc, argv, "t:i:r:cl")) > -1) ++ { ++ switch (opt) ++ { ++ case 't': ++ timeout = atoi(optarg); ++ break; ++ ++ case 'i': ++ if (optarg) ++ return run_dump_ifname(optarg); ++ break; ++ ++ case 'r': ++ if (optarg) ++ return run_dump_radio(optarg); ++ break; ++ ++ case 'c': ++ return run_dump_conns(); ++ ++ case 'l': ++ return run_dump_load(); ++ ++ default: ++ break; ++ } ++ } ++ ++ fprintf(stderr, ++ "Usage:\n" ++ " %s [-t timeout] -i ifname\n" ++ " %s [-t timeout] -r radiodev\n" ++ " %s [-t timeout] -c\n" ++ " %s [-t timeout] -l\n", ++ argv[0], argv[0], argv[0], argv[0] ++ ); ++ ++ return 1; ++} +diff --git a/feeds/luci/modules/luci-mod-admin-mini/Makefile b/feeds/luci/modules/luci-mod-admin-mini/Makefile +new file mode 100644 +index 0000000..5da4caf +--- /dev/null ++++ b/feeds/luci/modules/luci-mod-admin-mini/Makefile +@@ -0,0 +1,15 @@ ++# ++# Copyright (C) 2008-2014 The LuCI Team ++# ++# This is free software, licensed under the Apache License, Version 2.0 . ++# ++ ++include $(TOPDIR)/rules.mk ++ ++LUCI_TITLE:=LuCI Essentials - stripped down and user-friendly ++LUCI_DEPENDS:=+luci-base @BROKEN ++ ++include ../../luci.mk ++ ++# call BuildPackage - OpenWrt buildroot signature ++ +diff --git a/feeds/luci/modules/luci-mod-admin-mini/luasrc/controller/mini/index.lua b/feeds/luci/modules/luci-mod-admin-mini/luasrc/controller/mini/index.lua +new file mode 100644 +index 0000000..dd25f2c +--- /dev/null ++++ b/feeds/luci/modules/luci-mod-admin-mini/luasrc/controller/mini/index.lua +@@ -0,0 +1,39 @@ ++-- Copyright 2008 Steven Barth ++-- Copyright 2008 Jo-Philipp Wich ++-- Licensed to the public under the Apache License 2.0. ++ ++module("luci.controller.mini.index", package.seeall) ++ ++function index() ++ local root = node() ++ if not root.lock then ++ root.target = alias("mini") ++ root.index = true ++ end ++ ++ entry({"about"}, template("about")) ++ ++ local page = entry({"mini"}, alias("mini", "index"), _("Essentials"), 10) ++ page.sysauth = "root" ++ page.sysauth_authenticator = "htmlauth" ++ page.index = true ++ ++ entry({"mini", "index"}, alias("mini", "index", "index"), _("Overview"), 10).index = true ++ entry({"mini", "index", "index"}, form("mini/index"), _("General"), 1).ignoreindex = true ++ entry({"mini", "index", "luci"}, cbi("mini/luci", {autoapply=true}), _("Settings"), 10) ++ entry({"mini", "index", "logout"}, call("action_logout"), _("Logout")) ++end ++ ++function action_logout() ++ local dsp = require "luci.dispatcher" ++ local utl = require "luci.util" ++ if dsp.context.authsession then ++ utl.ubus("session", "destroy", { ++ ubus_rpc_session = dsp.context.authsession ++ }) ++ dsp.context.urltoken.stok = nil ++ end ++ ++ luci.http.header("Set-Cookie", "sysauth=; path=" .. dsp.build_url()) ++ luci.http.redirect(luci.dispatcher.build_url()) ++end +diff --git a/feeds/luci/modules/luci-mod-admin-mini/luasrc/controller/mini/network.lua b/feeds/luci/modules/luci-mod-admin-mini/luasrc/controller/mini/network.lua +new file mode 100644 +index 0000000..0b74c41 +--- /dev/null ++++ b/feeds/luci/modules/luci-mod-admin-mini/luasrc/controller/mini/network.lua +@@ -0,0 +1,12 @@ ++-- Copyright 2008 Steven Barth ++-- Copyright 2008 Jo-Philipp Wich ++-- Licensed to the public under the Apache License 2.0. ++ ++module("luci.controller.mini.network", package.seeall) ++ ++function index() ++ entry({"mini", "network"}, alias("mini", "network", "index"), _("Network"), 20).index = true ++ entry({"mini", "network", "index"}, cbi("mini/network", {autoapply=true}), _("General"), 1) ++ entry({"mini", "network", "wifi"}, cbi("mini/wifi", {autoapply=true}), _("Wifi"), 10) ++ entry({"mini", "network", "dhcp"}, cbi("mini/dhcp", {autoapply=true}), _("DHCP"), 20) ++end +diff --git a/feeds/luci/modules/luci-mod-admin-mini/luasrc/controller/mini/system.lua b/feeds/luci/modules/luci-mod-admin-mini/luasrc/controller/mini/system.lua +new file mode 100644 +index 0000000..74a5ae4 +--- /dev/null ++++ b/feeds/luci/modules/luci-mod-admin-mini/luasrc/controller/mini/system.lua +@@ -0,0 +1,235 @@ ++-- Copyright 2008 Steven Barth ++-- Copyright 2008 Jo-Philipp Wich ++-- Licensed to the public under the Apache License 2.0. ++ ++module("luci.controller.mini.system", package.seeall) ++ ++function index() ++ entry({"mini", "system"}, alias("mini", "system", "index"), _("System"), 40).index = true ++ entry({"mini", "system", "index"}, cbi("mini/system", {autoapply=true}), _("General"), 1) ++ entry({"mini", "system", "passwd"}, form("mini/passwd"), _("Admin Password"), 10) ++ entry({"mini", "system", "backup"}, call("action_backup"), _("Backup / Restore"), 80) ++ entry({"mini", "system", "upgrade"}, call("action_upgrade"), _("Flash Firmware"), 90) ++ entry({"mini", "system", "reboot"}, call("action_reboot"), _("Reboot"), 100) ++end ++ ++function action_backup() ++ local reset_avail = os.execute([[grep '"rootfs_data"' /proc/mtd >/dev/null 2>&1]]) == 0 ++ local restore_cmd = "gunzip | tar -xC/ >/dev/null 2>&1" ++ local backup_cmd = "tar -c %s | gzip 2>/dev/null" ++ ++ local restore_fpi ++ luci.http.setfilehandler( ++ function(meta, chunk, eof) ++ if not restore_fpi then ++ restore_fpi = io.popen(restore_cmd, "w") ++ end ++ if chunk then ++ restore_fpi:write(chunk) ++ end ++ if eof then ++ restore_fpi:close() ++ end ++ end ++ ) ++ ++ local upload = luci.http.formvalue("archive") ++ local backup = luci.http.formvalue("backup") ++ local reset = reset_avail and luci.http.formvalue("reset") ++ ++ if upload and #upload > 0 then ++ luci.template.render("mini/applyreboot") ++ luci.sys.reboot() ++ elseif backup then ++ local reader = ltn12_popen(backup_cmd:format(_keep_pattern())) ++ luci.http.header('Content-Disposition', 'attachment; filename="backup-%s-%s.tar.gz"' % { ++ luci.sys.hostname(), os.date("%Y-%m-%d")}) ++ luci.http.prepare_content("application/x-targz") ++ luci.ltn12.pump.all(reader, luci.http.write) ++ elseif reset then ++ luci.template.render("mini/applyreboot") ++ luci.util.exec("mtd -r erase rootfs_data") ++ else ++ luci.template.render("mini/backup", {reset_avail = reset_avail}) ++ end ++end ++ ++function action_reboot() ++ local reboot = luci.http.formvalue("reboot") ++ luci.template.render("mini/reboot", {reboot=reboot}) ++ if reboot then ++ luci.sys.reboot() ++ end ++end ++ ++function action_upgrade() ++ require("luci.model.uci") ++ ++ local tmpfile = "/tmp/firmware.img" ++ ++ local function image_supported() ++ -- XXX: yay... ++ return ( 0 == os.execute( ++ ". /lib/functions.sh; " .. ++ "include /lib/upgrade; " .. ++ "platform_check_image %q >/dev/null" ++ % tmpfile ++ ) ) ++ end ++ ++ local function image_checksum() ++ return (luci.sys.exec("md5sum %q" % tmpfile):match("^([^%s]+)")) ++ end ++ ++ local function storage_size() ++ local size = 0 ++ if nixio.fs.access("/proc/mtd") then ++ for l in io.lines("/proc/mtd") do ++ local d, s, e, n = l:match('^([^%s]+)%s+([^%s]+)%s+([^%s]+)%s+"([^%s]+)"') ++ if n == "linux" then ++ size = tonumber(s, 16) ++ break ++ end ++ end ++ elseif nixio.fs.access("/proc/partitions") then ++ for l in io.lines("/proc/partitions") do ++ local x, y, b, n = l:match('^%s*(%d+)%s+(%d+)%s+([^%s]+)%s+([^%s]+)') ++ if b and n and not n:match('[0-9]') then ++ size = tonumber(b) * 1024 ++ break ++ end ++ end ++ end ++ return size ++ end ++ ++ ++ -- Install upload handler ++ local file ++ luci.http.setfilehandler( ++ function(meta, chunk, eof) ++ if not nixio.fs.access(tmpfile) and not file and chunk and #chunk > 0 then ++ file = io.open(tmpfile, "w") ++ end ++ if file and chunk then ++ file:write(chunk) ++ end ++ if file and eof then ++ file:close() ++ end ++ end ++ ) ++ ++ ++ -- Determine state ++ local keep_avail = true ++ local step = tonumber(luci.http.formvalue("step") or 1) ++ local has_image = nixio.fs.access(tmpfile) ++ local has_support = image_supported() ++ local has_platform = nixio.fs.access("/lib/upgrade/platform.sh") ++ local has_upload = luci.http.formvalue("image") ++ ++ -- This does the actual flashing which is invoked inside an iframe ++ -- so don't produce meaningful errors here because the the ++ -- previous pages should arrange the stuff as required. ++ if step == 4 then ++ if has_platform and has_image and has_support then ++ -- Mimetype text/plain ++ luci.http.prepare_content("text/plain") ++ luci.http.write("Starting luci-flash...\n") ++ ++ -- Now invoke sysupgrade ++ local keepcfg = keep_avail and luci.http.formvalue("keepcfg") == "1" ++ local flash = ltn12_popen("/sbin/luci-flash %s %q" %{ ++ keepcfg and "-k %q" % _keep_pattern() or "", tmpfile ++ }) ++ ++ luci.ltn12.pump.all(flash, luci.http.write) ++ ++ -- Make sure the device is rebooted ++ luci.sys.reboot() ++ end ++ ++ ++ -- ++ -- This is step 1-3, which does the user interaction and ++ -- image upload. ++ -- ++ ++ -- Step 1: file upload, error on unsupported image format ++ elseif not has_image or not has_support or step == 1 then ++ -- If there is an image but user has requested step 1 ++ -- or type is not supported, then remove it. ++ if has_image then ++ nixio.fs.unlink(tmpfile) ++ end ++ ++ luci.template.render("mini/upgrade", { ++ step=1, ++ bad_image=(has_image and not has_support or false), ++ keepavail=keep_avail, ++ supported=has_platform ++ } ) ++ ++ -- Step 2: present uploaded file, show checksum, confirmation ++ elseif step == 2 then ++ luci.template.render("mini/upgrade", { ++ step=2, ++ checksum=image_checksum(), ++ filesize=nixio.fs.stat(tmpfile).size, ++ flashsize=storage_size(), ++ keepconfig=(keep_avail and luci.http.formvalue("keepcfg") == "1") ++ } ) ++ ++ -- Step 3: load iframe which calls the actual flash procedure ++ elseif step == 3 then ++ luci.template.render("mini/upgrade", { ++ step=3, ++ keepconfig=(keep_avail and luci.http.formvalue("keepcfg") == "1") ++ } ) ++ end ++end ++ ++function _keep_pattern() ++ local kpattern = "" ++ local files = luci.model.uci.cursor():get_all("luci", "flash_keep") ++ if files then ++ kpattern = "" ++ for k, v in pairs(files) do ++ if k:sub(1,1) ~= "." and nixio.fs.glob(v)() then ++ kpattern = kpattern .. " " .. v ++ end ++ end ++ end ++ return kpattern ++end ++ ++function ltn12_popen(command) ++ ++ local fdi, fdo = nixio.pipe() ++ local pid = nixio.fork() ++ ++ if pid > 0 then ++ fdo:close() ++ local close ++ return function() ++ local buffer = fdi:read(2048) ++ local wpid, stat = nixio.waitpid(pid, "nohang") ++ if not close and wpid and stat == "exited" then ++ close = true ++ end ++ ++ if buffer and #buffer > 0 then ++ return buffer ++ elseif close then ++ fdi:close() ++ return nil ++ end ++ end ++ elseif pid == 0 then ++ nixio.dup(fdo, nixio.stdout) ++ fdi:close() ++ fdo:close() ++ nixio.exec("/bin/sh", "-c", command) ++ end ++end +diff --git a/feeds/luci/modules/luci-mod-admin-mini/luasrc/model/cbi/mini/dhcp.lua b/feeds/luci/modules/luci-mod-admin-mini/luasrc/model/cbi/mini/dhcp.lua +new file mode 100644 +index 0000000..9a1c1fe +--- /dev/null ++++ b/feeds/luci/modules/luci-mod-admin-mini/luasrc/model/cbi/mini/dhcp.lua +@@ -0,0 +1,98 @@ ++-- Copyright 2008 Steven Barth ++-- Copyright 2008 Jo-Philipp Wich ++-- Licensed to the public under the Apache License 2.0. ++ ++local uci = require "luci.model.uci".cursor() ++local ipc = require "luci.ip" ++local wa = require "luci.tools.webadmin" ++local fs = require "nixio.fs" ++ ++m = Map("dhcp", "DHCP") ++ ++s = m:section(TypedSection, "dhcp", "DHCP-Server") ++s.anonymous = true ++s.addremove = false ++s.dynamic = false ++ ++s:depends("interface", "lan") ++ ++enable = s:option(ListValue, "ignore", translate("enable"), "") ++enable:value(0, translate("enable")) ++enable:value(1, translate("disable")) ++ ++start = s:option(Value, "start", translate("First leased address")) ++start.rmempty = true ++start:depends("ignore", "0") ++ ++ ++limit = s:option(Value, "limit", translate("Number of leased addresses"), "") ++limit:depends("ignore", "0") ++ ++function limit.cfgvalue(self, section) ++ local value = Value.cfgvalue(self, section) ++ ++ if value then ++ return tonumber(value) + 1 ++ end ++end ++ ++function limit.write(self, section, value) ++ value = tonumber(value) - 1 ++ return Value.write(self, section, value) ++end ++ ++limit.rmempty = true ++ ++time = s:option(Value, "leasetime") ++time:depends("ignore", "0") ++time.rmempty = true ++ ++ ++local leasefn, leasefp, leases ++uci:foreach("dhcp", "dnsmasq", ++ function(section) ++ leasefn = section.leasefile ++ end ++) ++local leasefp = leasefn and fs.access(leasefn) and io.lines(leasefn) ++if leasefp then ++ leases = {} ++ for lease in leasefp do ++ table.insert(leases, luci.util.split(lease, " ")) ++ end ++end ++ ++if leases then ++ v = m:section(Table, leases, translate("Active Leases")) ++ name = v:option(DummyValue, 4, translate("Hostname")) ++ function name.cfgvalue(self, ...) ++ local value = DummyValue.cfgvalue(self, ...) ++ return (value == "*") and "?" or value ++ end ++ ip = v:option(DummyValue, 3, translate("IPv4-Address")) ++ mac = v:option(DummyValue, 2, translate("MAC-Address")) ++ ltime = v:option(DummyValue, 1, translate("Leasetime remaining")) ++ function ltime.cfgvalue(self, ...) ++ local value = DummyValue.cfgvalue(self, ...) ++ return wa.date_format(os.difftime(tonumber(value), os.time())) ++ end ++end ++ ++s2 = m:section(TypedSection, "host", translate("Static Leases")) ++s2.addremove = true ++s2.anonymous = true ++s2.template = "cbi/tblsection" ++ ++name = s2:option(Value, "name", translate("Hostname")) ++mac = s2:option(Value, "mac", translate("MAC-Address")) ++ip = s2:option(Value, "ip", translate("IPv4-Address")) ++ ++ipc.neighbors({ family = 4 }, function(n) ++ if n.mac and n.dest then ++ ip:value(n.dest:string()) ++ mac:value(n.mac, "%s (%s)" %{ n.mac, n.dest:string() }) ++ end ++end) ++ ++return m ++ +diff --git a/feeds/luci/modules/luci-mod-admin-mini/luasrc/model/cbi/mini/index.lua b/feeds/luci/modules/luci-mod-admin-mini/luasrc/model/cbi/mini/index.lua +new file mode 100644 +index 0000000..9ecee1a +--- /dev/null ++++ b/feeds/luci/modules/luci-mod-admin-mini/luasrc/model/cbi/mini/index.lua +@@ -0,0 +1,4 @@ ++-- Copyright 2008 Steven Barth ++-- Licensed to the public under the Apache License 2.0. ++ ++return Template("mini/index") +diff --git a/feeds/luci/modules/luci-mod-admin-mini/luasrc/model/cbi/mini/luci.lua b/feeds/luci/modules/luci-mod-admin-mini/luasrc/model/cbi/mini/luci.lua +new file mode 100644 +index 0000000..a1ef0fe +--- /dev/null ++++ b/feeds/luci/modules/luci-mod-admin-mini/luasrc/model/cbi/mini/luci.lua +@@ -0,0 +1,37 @@ ++-- Copyright 2008 Steven Barth ++-- Copyright 2008 Jo-Philipp Wich ++-- Licensed to the public under the Apache License 2.0. ++ ++require "luci.config" ++local fs = require "nixio.fs" ++ ++m = Map("luci", translate("Web UI"), translate("Here you can customize the settings and the functionality of LuCI.")) ++ ++-- force reload of global luci config namespace to reflect the changes ++function m.commit_handler(self) ++ package.loaded["luci.config"] = nil ++ require "luci.config" ++end ++ ++ ++c = m:section(NamedSection, "main", "core", translate("General")) ++ ++l = c:option(ListValue, "lang", translate("Language")) ++l:value("auto") ++ ++local i18ndir = luci.i18n.i18ndir .. "base." ++for k, v in luci.util.kspairs(luci.config.languages) do ++ local file = i18ndir .. k:gsub("_", "-") ++ if k:sub(1, 1) ~= "." and fs.access(file .. ".lmo") then ++ l:value(k, v) ++ end ++end ++ ++t = c:option(ListValue, "mediaurlbase", translate("Design")) ++for k, v in pairs(luci.config.themes) do ++ if k:sub(1, 1) ~= "." then ++ t:value(v, k) ++ end ++end ++ ++return m +diff --git a/feeds/luci/modules/luci-mod-admin-mini/luasrc/model/cbi/mini/network.lua b/feeds/luci/modules/luci-mod-admin-mini/luasrc/model/cbi/mini/network.lua +new file mode 100644 +index 0000000..c895430 +--- /dev/null ++++ b/feeds/luci/modules/luci-mod-admin-mini/luasrc/model/cbi/mini/network.lua +@@ -0,0 +1,194 @@ ++-- Copyright 2008 Steven Barth ++-- Copyright 2008 Jo-Philipp Wich ++-- Licensed to the public under the Apache License 2.0. ++ ++local wa = require "luci.tools.webadmin" ++local sys = require "luci.sys" ++local fs = require "nixio.fs" ++ ++local has_pptp = fs.access("/usr/sbin/pptp") ++local has_pppoe = fs.glob("/usr/lib/pppd/*/rp-pppoe.so")() ++ ++local network = luci.model.uci.cursor_state():get_all("network") ++ ++local netstat = sys.net.deviceinfo() ++local ifaces = {} ++ ++for k, v in pairs(network) do ++ if v[".type"] == "interface" and k ~= "loopback" then ++ table.insert(ifaces, v) ++ end ++end ++ ++m = Map("network", translate("Network")) ++s = m:section(Table, ifaces, translate("Status")) ++s.parse = function() end ++ ++s:option(DummyValue, ".name", translate("Network")) ++ ++hwaddr = s:option(DummyValue, "_hwaddr", ++ translate("MAC-Address"), translate("Hardware Address")) ++function hwaddr.cfgvalue(self, section) ++ local ix = self.map:get(section, "ifname") or "" ++ local mac = fs.readfile("/sys/class/net/" .. ix .. "/address") ++ ++ if not mac then ++ mac = luci.util.exec("ifconfig " .. ix) ++ mac = mac and mac:match(" ([A-F0-9:]+)%s*\n") ++ end ++ ++ if mac and #mac > 0 then ++ return mac:upper() ++ end ++ ++ return "?" ++end ++ ++ ++s:option(DummyValue, "ipaddr", translate("IPv4-Address")) ++ ++s:option(DummyValue, "netmask", translate("IPv4-Netmask")) ++ ++ ++txrx = s:option(DummyValue, "_txrx", ++ translate("Traffic"), translate("transmitted / received")) ++ ++function txrx.cfgvalue(self, section) ++ local ix = self.map:get(section, "ifname") ++ ++ local rx = netstat and netstat[ix] and netstat[ix][1] ++ rx = rx and wa.byte_format(tonumber(rx)) or "-" ++ ++ local tx = netstat and netstat[ix] and netstat[ix][9] ++ tx = tx and wa.byte_format(tonumber(tx)) or "-" ++ ++ return string.format("%s / %s", tx, rx) ++end ++ ++errors = s:option(DummyValue, "_err", ++ translate("Errors"), translate("TX / RX")) ++ ++function errors.cfgvalue(self, section) ++ local ix = self.map:get(section, "ifname") ++ ++ local rx = netstat and netstat[ix] and netstat[ix][3] ++ local tx = netstat and netstat[ix] and netstat[ix][11] ++ ++ rx = rx and tostring(rx) or "-" ++ tx = tx and tostring(tx) or "-" ++ ++ return string.format("%s / %s", tx, rx) ++end ++ ++ ++ ++s = m:section(NamedSection, "lan", "interface", translate("Local Network")) ++s.addremove = false ++s:option(Value, "ipaddr", translate("IPv4-Address")) ++ ++nm = s:option(Value, "netmask", translate("IPv4-Netmask")) ++nm:value("255.255.255.0") ++nm:value("255.255.0.0") ++nm:value("255.0.0.0") ++ ++gw = s:option(Value, "gateway", translate("IPv4-Gateway") .. translate(" (optional)")) ++gw.rmempty = true ++dns = s:option(Value, "dns", translate("DNS-Server") .. translate(" (optional)")) ++dns.rmempty = true ++ ++ ++s = m:section(NamedSection, "wan", "interface", translate("Internet Connection")) ++s.addremove = false ++p = s:option(ListValue, "proto", translate("Protocol")) ++p.override_values = true ++p:value("none", "disabled") ++p:value("static", translate("manual")) ++p:value("dhcp", translate("automatic")) ++if has_pppoe then p:value("pppoe", "PPPoE") end ++if has_pptp then p:value("pptp", "PPTP") end ++ ++function p.write(self, section, value) ++ -- Always set defaultroute to PPP and use remote dns ++ -- Overwrite a bad variable behaviour in OpenWrt ++ if value == "pptp" or value == "pppoe" then ++ self.map:set(section, "peerdns", "1") ++ self.map:set(section, "defaultroute", "1") ++ end ++ return ListValue.write(self, section, value) ++end ++ ++if not ( has_pppoe and has_pptp ) then ++ p.description = translate("You need to install \"ppp-mod-pppoe\" for PPPoE or \"pptp\" for PPtP support") ++end ++ ++ ++ip = s:option(Value, "ipaddr", translate("IPv4-Address")) ++ip:depends("proto", "static") ++ ++nm = s:option(Value, "netmask", translate("IPv4-Netmask")) ++nm:depends("proto", "static") ++ ++gw = s:option(Value, "gateway", translate("IPv4-Gateway")) ++gw:depends("proto", "static") ++gw.rmempty = true ++ ++dns = s:option(Value, "dns", translate("DNS-Server")) ++dns:depends("proto", "static") ++dns.rmempty = true ++ ++usr = s:option(Value, "username", translate("Username")) ++usr:depends("proto", "pppoe") ++usr:depends("proto", "pptp") ++ ++pwd = s:option(Value, "password", translate("Password")) ++pwd.password = true ++pwd:depends("proto", "pppoe") ++pwd:depends("proto", "pptp") ++ ++ ++-- Allow user to set MSS correction here if the UCI firewall is installed ++-- This cures some cancer for providers with pre-war routers ++if fs.access("/etc/config/firewall") then ++ mssfix = s:option(Flag, "_mssfix", ++ translate("Clamp Segment Size"), translate("Fixes problems with unreachable websites, submitting forms or other unexpected behaviour for some ISPs.")) ++ mssfix.rmempty = false ++ ++ function mssfix.cfgvalue(self) ++ local value ++ m.uci:foreach("firewall", "forwarding", function(s) ++ if s.src == "lan" and s.dest == "wan" then ++ value = s.mtu_fix ++ end ++ end) ++ return value ++ end ++ ++ function mssfix.write(self, section, value) ++ m.uci:foreach("firewall", "forwarding", function(s) ++ if s.src == "lan" and s.dest == "wan" then ++ m.uci:set("firewall", s[".name"], "mtu_fix", value) ++ m:chain("firewall") ++ end ++ end) ++ end ++end ++ ++kea = s:option(Flag, "keepalive", translate("automatically reconnect")) ++kea:depends("proto", "pppoe") ++kea:depends("proto", "pptp") ++kea.rmempty = true ++kea.enabled = "10" ++ ++ ++cod = s:option(Value, "demand", translate("disconnect when idle for"), "s") ++cod:depends("proto", "pppoe") ++cod:depends("proto", "pptp") ++cod.rmempty = true ++ ++srv = s:option(Value, "server", translate("PPTP-Server")) ++srv:depends("proto", "pptp") ++srv.rmempty = true ++ ++ ++ ++return m +diff --git a/feeds/luci/modules/luci-mod-admin-mini/luasrc/model/cbi/mini/passwd.lua b/feeds/luci/modules/luci-mod-admin-mini/luasrc/model/cbi/mini/passwd.lua +new file mode 100644 +index 0000000..39123a7 +--- /dev/null ++++ b/feeds/luci/modules/luci-mod-admin-mini/luasrc/model/cbi/mini/passwd.lua +@@ -0,0 +1,35 @@ ++-- Copyright 2008 Steven Barth ++-- Copyright 2008 Jo-Philipp Wich ++-- Licensed to the public under the Apache License 2.0. ++ ++f = SimpleForm("password", translate("Admin Password"), translate("Change the password of the system administrator (User root)")) ++ ++pw1 = f:field(Value, "pw1", translate("Password")) ++pw1.password = true ++pw1.rmempty = false ++ ++pw2 = f:field(Value, "pw2", translate("Confirmation")) ++pw2.password = true ++pw2.rmempty = false ++ ++function pw2.validate(self, value, section) ++ return pw1:formvalue(section) == value and value ++end ++ ++function f.handle(self, state, data) ++ if state == FORM_VALID then ++ local stat = luci.sys.user.setpasswd("root", data.pw1) == 0 ++ ++ if stat then ++ f.message = translate("Password successfully changed") ++ else ++ f.errmessage = translate("Unknown Error") ++ end ++ ++ data.pw1 = nil ++ data.pw2 = nil ++ end ++ return true ++end ++ ++return f +\ No newline at end of file +diff --git a/feeds/luci/modules/luci-mod-admin-mini/luasrc/model/cbi/mini/system.lua b/feeds/luci/modules/luci-mod-admin-mini/luasrc/model/cbi/mini/system.lua +new file mode 100644 +index 0000000..b621ad0 +--- /dev/null ++++ b/feeds/luci/modules/luci-mod-admin-mini/luasrc/model/cbi/mini/system.lua +@@ -0,0 +1,76 @@ ++-- Copyright 2008 Steven Barth ++-- Licensed to the public under the Apache License 2.0. ++ ++require("luci.sys") ++require("luci.sys.zoneinfo") ++require("luci.tools.webadmin") ++require("luci.util") ++ ++ ++m = Map("system", translate("System"), translate("Here you can configure the basic aspects of your device like its hostname or the timezone.")) ++ ++s = m:section(TypedSection, "system", "") ++s.anonymous = true ++s.addremove = false ++ ++ ++local sysinfo = luci.util.ubus("system", "info") or { } ++local boardinfo = luci.util.ubus("system", "board") or { } ++ ++local uptime = sysinfo.uptime or 0 ++local loads = sysinfo.load or { 0, 0, 0 } ++local memory = sysinfo.memory or { ++ total = 0, ++ free = 0, ++ buffered = 0, ++ shared = 0 ++} ++ ++s:option(DummyValue, "_system", translate("Model")).value = boardinfo.model or "?" ++s:option(DummyValue, "_cpu", translate("System")).value = boardinfo.system or "?" ++ ++s:option(DummyValue, "_la", translate("Load")).value = ++ string.format("%.2f, %.2f, %.2f", loads[1] / 65535.0, loads[2] / 65535.0, loads[3] / 65535.0) ++ ++s:option(DummyValue, "_memtotal", translate("Memory")).value = ++ string.format("%.2f MB (%.0f%% %s, %.0f%% %s)", ++ tonumber(memory.total) / 1024 / 1024, ++ 100 * memory.buffered / memory.total, ++ tostring(translate("buffered")), ++ 100 * memory.free / memory.total, ++ tostring(translate("free")) ++) ++ ++s:option(DummyValue, "_systime", translate("Local Time")).value = ++ os.date("%c") ++ ++s:option(DummyValue, "_uptime", translate("Uptime")).value = ++ luci.tools.webadmin.date_format(tonumber(uptime)) ++ ++hn = s:option(Value, "hostname", translate("Hostname")) ++ ++function hn.write(self, section, value) ++ Value.write(self, section, value) ++ luci.sys.hostname(value) ++end ++ ++ ++tz = s:option(ListValue, "zonename", translate("Timezone")) ++tz:value("UTC") ++ ++for i, zone in ipairs(luci.sys.zoneinfo.TZ) do ++ tz:value(zone[1]) ++end ++ ++function tz.write(self, section, value) ++ local function lookup_zone(title) ++ for _, zone in ipairs(luci.sys.zoneinfo.TZ) do ++ if zone[1] == title then return zone[2] end ++ end ++ end ++ ++ AbstractValue.write(self, section, value) ++ self.map.uci:set("system", section, "timezone", lookup_zone(value) or "GMT0") ++end ++ ++return m +diff --git a/feeds/luci/modules/luci-mod-admin-mini/luasrc/model/cbi/mini/wifi.lua b/feeds/luci/modules/luci-mod-admin-mini/luasrc/model/cbi/mini/wifi.lua +new file mode 100644 +index 0000000..0729c44 +--- /dev/null ++++ b/feeds/luci/modules/luci-mod-admin-mini/luasrc/model/cbi/mini/wifi.lua +@@ -0,0 +1,362 @@ ++-- Copyright 2008 Steven Barth ++-- Copyright 2008 Jo-Philipp Wich ++-- Licensed to the public under the Apache License 2.0. ++ ++-- Data init -- ++ ++local fs = require "nixio.fs" ++local sys = require "luci.sys" ++local uci = require "luci.model.uci".cursor() ++ ++if not uci:get("network", "wan") then ++ uci:section("network", "interface", "wan", {proto="none", ifname=" "}) ++ uci:save("network") ++ uci:commit("network") ++end ++ ++local wlcursor = luci.model.uci.cursor_state() ++local wireless = wlcursor:get_all("wireless") ++local wifidevs = {} ++local ifaces = {} ++ ++for k, v in pairs(wireless) do ++ if v[".type"] == "wifi-iface" then ++ table.insert(ifaces, v) ++ end ++end ++ ++wlcursor:foreach("wireless", "wifi-device", ++ function(section) ++ table.insert(wifidevs, section[".name"]) ++ end) ++ ++ ++-- Main Map -- ++ ++m = Map("wireless", translate("Wifi"), translate("Here you can configure installed wifi devices.")) ++m:chain("network") ++ ++ ++-- Status Table -- ++s = m:section(Table, ifaces, translate("Networks")) ++ ++link = s:option(DummyValue, "_link", translate("Link")) ++function link.cfgvalue(self, section) ++ local ifname = self.map:get(section, "ifname") ++ local iwinfo = sys.wifi.getiwinfo(ifname) ++ return iwinfo and "%d/%d" %{ iwinfo.quality, iwinfo.quality_max } or "-" ++end ++ ++essid = s:option(DummyValue, "ssid", "ESSID") ++ ++bssid = s:option(DummyValue, "_bsiid", "BSSID") ++function bssid.cfgvalue(self, section) ++ local ifname = self.map:get(section, "ifname") ++ local iwinfo = sys.wifi.getiwinfo(ifname) ++ return iwinfo and iwinfo.bssid or "-" ++end ++ ++channel = s:option(DummyValue, "channel", translate("Channel")) ++function channel.cfgvalue(self, section) ++ return wireless[self.map:get(section, "device")].channel ++end ++ ++protocol = s:option(DummyValue, "_mode", translate("Protocol")) ++function protocol.cfgvalue(self, section) ++ local mode = wireless[self.map:get(section, "device")].mode ++ return mode and "802." .. mode ++end ++ ++mode = s:option(DummyValue, "mode", translate("Mode")) ++encryption = s:option(DummyValue, "encryption", translate("Encr.")) ++ ++power = s:option(DummyValue, "_power", translate("Power")) ++function power.cfgvalue(self, section) ++ local ifname = self.map:get(section, "ifname") ++ local iwinfo = sys.wifi.getiwinfo(ifname) ++ return iwinfo and "%d dBm" % iwinfo.txpower or "-" ++end ++ ++scan = s:option(Button, "_scan", translate("Scan")) ++scan.inputstyle = "find" ++ ++function scan.cfgvalue(self, section) ++ return self.map:get(section, "ifname") or false ++end ++ ++-- WLAN-Scan-Table -- ++ ++t2 = m:section(Table, {}, translate("WLAN-Scan"), translate("Wifi networks in your local environment")) ++ ++function scan.write(self, section) ++ m.autoapply = false ++ t2.render = t2._render ++ local ifname = self.map:get(section, "ifname") ++ local iwinfo = sys.wifi.getiwinfo(ifname) ++ if iwinfo then ++ local _, cell ++ for _, cell in ipairs(iwinfo.scanlist) do ++ t2.data[#t2.data+1] = { ++ Quality = "%d/%d" %{ cell.quality, cell.quality_max }, ++ ESSID = cell.ssid, ++ Address = cell.bssid, ++ Mode = cell.mode, ++ ["Encryption key"] = cell.encryption.enabled and "On" or "Off", ++ ["Signal level"] = "%d dBm" % cell.signal, ++ ["Noise level"] = "%d dBm" % iwinfo.noise ++ } ++ end ++ end ++end ++ ++t2._render = t2.render ++t2.render = function() end ++ ++t2:option(DummyValue, "Quality", translate("Link")) ++essid = t2:option(DummyValue, "ESSID", "ESSID") ++function essid.cfgvalue(self, section) ++ return self.map:get(section, "ESSID") ++end ++ ++t2:option(DummyValue, "Address", "BSSID") ++t2:option(DummyValue, "Mode", translate("Mode")) ++chan = t2:option(DummyValue, "channel", translate("Channel")) ++function chan.cfgvalue(self, section) ++ return self.map:get(section, "Channel") ++ or self.map:get(section, "Frequency") ++ or "-" ++end ++ ++t2:option(DummyValue, "Encryption key", translate("Encr.")) ++ ++t2:option(DummyValue, "Signal level", translate("Signal")) ++ ++t2:option(DummyValue, "Noise level", translate("Noise")) ++ ++ ++ ++if #wifidevs < 1 then ++ return m ++end ++ ++-- Config Section -- ++ ++s = m:section(NamedSection, wifidevs[1], "wifi-device", translate("Devices")) ++s.addremove = false ++ ++en = s:option(Flag, "disabled", translate("enable")) ++en.rmempty = false ++en.enabled = "0" ++en.disabled = "1" ++ ++function en.cfgvalue(self, section) ++ return Flag.cfgvalue(self, section) or "0" ++end ++ ++ ++local hwtype = m:get(wifidevs[1], "type") ++ ++if hwtype == "atheros" then ++ mode = s:option(ListValue, "hwmode", translate("Mode")) ++ mode.override_values = true ++ mode:value("", "auto") ++ mode:value("11b", "802.11b") ++ mode:value("11g", "802.11g") ++ mode:value("11a", "802.11a") ++ mode:value("11bg", "802.11b+g") ++ mode.rmempty = true ++end ++ ++ ++ch = s:option(Value, "channel", translate("Channel")) ++for i=1, 14 do ++ ch:value(i, i .. " (2.4 GHz)") ++end ++ ++ ++s = m:section(TypedSection, "wifi-iface", translate("Local Network")) ++s.anonymous = true ++s.addremove = false ++ ++s:option(Value, "ssid", translate("Network Name (ESSID)")) ++ ++bssid = s:option(Value, "bssid", translate("BSSID")) ++ ++local devs = {} ++luci.model.uci.cursor():foreach("wireless", "wifi-device", ++ function (section) ++ table.insert(devs, section[".name"]) ++ end) ++ ++if #devs > 1 then ++ device = s:option(DummyValue, "device", translate("Device")) ++else ++ s.defaults.device = devs[1] ++end ++ ++mode = s:option(ListValue, "mode", translate("Mode")) ++mode.override_values = true ++mode:value("ap", translate("Provide (Access Point)")) ++mode:value("adhoc", translate("Independent (Ad-Hoc)")) ++mode:value("sta", translate("Join (Client)")) ++ ++function mode.write(self, section, value) ++ if value == "sta" then ++ local oldif = m.uci:get("network", "wan", "ifname") ++ if oldif and oldif ~= " " then ++ m.uci:set("network", "wan", "_ifname", oldif) ++ end ++ m.uci:set("network", "wan", "ifname", " ") ++ ++ self.map:set(section, "network", "wan") ++ else ++ if m.uci:get("network", "wan", "_ifname") then ++ m.uci:set("network", "wan", "ifname", m.uci:get("network", "wan", "_ifname")) ++ end ++ self.map:set(section, "network", "lan") ++ end ++ ++ return ListValue.write(self, section, value) ++end ++ ++encr = s:option(ListValue, "encryption", translate("Encryption")) ++encr.override_values = true ++encr:value("none", "No Encryption") ++encr:value("wep", "WEP") ++ ++if hwtype == "atheros" or hwtype == "mac80211" then ++ local supplicant = fs.access("/usr/sbin/wpa_supplicant") ++ local hostapd = fs.access("/usr/sbin/hostapd") ++ ++ if hostapd and supplicant then ++ encr:value("psk", "WPA-PSK") ++ encr:value("psk2", "WPA2-PSK") ++ encr:value("psk-mixed", "WPA-PSK/WPA2-PSK Mixed Mode") ++ encr:value("wpa", "WPA-Radius", {mode="ap"}, {mode="sta"}) ++ encr:value("wpa2", "WPA2-Radius", {mode="ap"}, {mode="sta"}) ++ elseif hostapd and not supplicant then ++ encr:value("psk", "WPA-PSK", {mode="ap"}, {mode="adhoc"}) ++ encr:value("psk2", "WPA2-PSK", {mode="ap"}, {mode="adhoc"}) ++ encr:value("psk-mixed", "WPA-PSK/WPA2-PSK Mixed Mode", {mode="ap"}, {mode="adhoc"}) ++ encr:value("wpa", "WPA-Radius", {mode="ap"}) ++ encr:value("wpa2", "WPA2-Radius", {mode="ap"}) ++ encr.description = translate( ++ "WPA-Encryption requires wpa_supplicant (for client mode) or hostapd (for AP " .. ++ "and ad-hoc mode) to be installed." ++ ) ++ elseif not hostapd and supplicant then ++ encr:value("psk", "WPA-PSK", {mode="sta"}) ++ encr:value("psk2", "WPA2-PSK", {mode="sta"}) ++ encr:value("psk-mixed", "WPA-PSK/WPA2-PSK Mixed Mode", {mode="sta"}) ++ encr:value("wpa", "WPA-EAP", {mode="sta"}) ++ encr:value("wpa2", "WPA2-EAP", {mode="sta"}) ++ encr.description = translate( ++ "WPA-Encryption requires wpa_supplicant (for client mode) or hostapd (for AP " .. ++ "and ad-hoc mode) to be installed." ++ ) ++ else ++ encr.description = translate( ++ "WPA-Encryption requires wpa_supplicant (for client mode) or hostapd (for AP " .. ++ "and ad-hoc mode) to be installed." ++ ) ++ end ++elseif hwtype == "broadcom" then ++ encr:value("psk", "WPA-PSK") ++ encr:value("psk2", "WPA2-PSK") ++ encr:value("psk+psk2", "WPA-PSK/WPA2-PSK Mixed Mode") ++end ++ ++key = s:option(Value, "key", translate("Key")) ++key:depends("encryption", "wep") ++key:depends("encryption", "psk") ++key:depends("encryption", "psk2") ++key:depends("encryption", "psk+psk2") ++key:depends("encryption", "psk-mixed") ++key:depends({mode="ap", encryption="wpa"}) ++key:depends({mode="ap", encryption="wpa2"}) ++key.rmempty = true ++key.password = true ++ ++server = s:option(Value, "server", translate("Radius-Server")) ++server:depends({mode="ap", encryption="wpa"}) ++server:depends({mode="ap", encryption="wpa2"}) ++server.rmempty = true ++ ++port = s:option(Value, "port", translate("Radius-Port")) ++port:depends({mode="ap", encryption="wpa"}) ++port:depends({mode="ap", encryption="wpa2"}) ++port.rmempty = true ++ ++ ++if hwtype == "atheros" or hwtype == "mac80211" then ++ nasid = s:option(Value, "nasid", translate("NAS ID")) ++ nasid:depends({mode="ap", encryption="wpa"}) ++ nasid:depends({mode="ap", encryption="wpa2"}) ++ nasid.rmempty = true ++ ++ eaptype = s:option(ListValue, "eap_type", translate("EAP-Method")) ++ eaptype:value("TLS") ++ eaptype:value("TTLS") ++ eaptype:value("PEAP") ++ eaptype:depends({mode="sta", encryption="wpa"}) ++ eaptype:depends({mode="sta", encryption="wpa2"}) ++ ++ cacert = s:option(FileUpload, "ca_cert", translate("Path to CA-Certificate")) ++ cacert:depends({mode="sta", encryption="wpa"}) ++ cacert:depends({mode="sta", encryption="wpa2"}) ++ ++ privkey = s:option(FileUpload, "priv_key", translate("Path to Private Key")) ++ privkey:depends({mode="sta", eap_type="TLS", encryption="wpa2"}) ++ privkey:depends({mode="sta", eap_type="TLS", encryption="wpa"}) ++ ++ privkeypwd = s:option(Value, "priv_key_pwd", translate("Password of Private Key")) ++ privkeypwd:depends({mode="sta", eap_type="TLS", encryption="wpa2"}) ++ privkeypwd:depends({mode="sta", eap_type="TLS", encryption="wpa"}) ++ ++ ++ auth = s:option(Value, "auth", translate("Authentication")) ++ auth:value("PAP") ++ auth:value("CHAP") ++ auth:value("MSCHAP") ++ auth:value("MSCHAPV2") ++ auth:depends({mode="sta", eap_type="PEAP", encryption="wpa2"}) ++ auth:depends({mode="sta", eap_type="PEAP", encryption="wpa"}) ++ auth:depends({mode="sta", eap_type="TTLS", encryption="wpa2"}) ++ auth:depends({mode="sta", eap_type="TTLS", encryption="wpa"}) ++ ++ ++ identity = s:option(Value, "identity", translate("Identity")) ++ identity:depends({mode="sta", eap_type="PEAP", encryption="wpa2"}) ++ identity:depends({mode="sta", eap_type="PEAP", encryption="wpa"}) ++ identity:depends({mode="sta", eap_type="TTLS", encryption="wpa2"}) ++ identity:depends({mode="sta", eap_type="TTLS", encryption="wpa"}) ++ ++ password = s:option(Value, "password", translate("Password")) ++ password:depends({mode="sta", eap_type="PEAP", encryption="wpa2"}) ++ password:depends({mode="sta", eap_type="PEAP", encryption="wpa"}) ++ password:depends({mode="sta", eap_type="TTLS", encryption="wpa2"}) ++ password:depends({mode="sta", eap_type="TTLS", encryption="wpa"}) ++end ++ ++ ++if hwtype == "atheros" or hwtype == "broadcom" then ++ iso = s:option(Flag, "isolate", translate("AP-Isolation"), translate("Prevents Client to Client communication")) ++ iso.rmempty = true ++ iso:depends("mode", "ap") ++ ++ hide = s:option(Flag, "hidden", translate("Hide ESSID")) ++ hide.rmempty = true ++ hide:depends("mode", "ap") ++end ++ ++if hwtype == "mac80211" or hwtype == "atheros" then ++ bssid:depends({mode="adhoc"}) ++end ++ ++if hwtype == "broadcom" then ++ bssid:depends({mode="wds"}) ++ bssid:depends({mode="adhoc"}) ++end ++ ++ ++return m +diff --git a/feeds/luci/modules/luci-mod-admin-mini/luasrc/view/mini/applyreboot.htm b/feeds/luci/modules/luci-mod-admin-mini/luasrc/view/mini/applyreboot.htm +new file mode 100644 +index 0000000..4c53624 +--- /dev/null ++++ b/feeds/luci/modules/luci-mod-admin-mini/luasrc/view/mini/applyreboot.htm +@@ -0,0 +1,13 @@ ++<%# ++ Copyright 2008 Steven Barth ++ Copyright 2008 Jo-Philipp Wich ++ Licensed to the public under the Apache License 2.0. ++-%> ++ ++<%+header%> ++

    <%:System%>

    ++
    ++

    <% if msg then %><%=msg%><% else %><%:Changes applied.%><% end %>

    ++

    <%:Please wait: Device rebooting...%>

    ++ ++<%+footer%> +\ No newline at end of file +diff --git a/feeds/luci/modules/luci-mod-admin-mini/luasrc/view/mini/backup.htm b/feeds/luci/modules/luci-mod-admin-mini/luasrc/view/mini/backup.htm +new file mode 100644 +index 0000000..b0f52f7 +--- /dev/null ++++ b/feeds/luci/modules/luci-mod-admin-mini/luasrc/view/mini/backup.htm +@@ -0,0 +1,32 @@ ++<%# ++ Copyright 2008 Steven Barth ++ Copyright 2008 Jo-Philipp Wich ++ Licensed to the public under the Apache License 2.0. ++-%> ++ ++<%+header%> ++

    <%:System%>

    ++

    <%:Backup / Restore%>

    ++

    <%:Here you can backup and restore your configuration and - if possible - reset this device to the default settings.%>

    ++
    ++
    ++ ++
    ++ ++
    ++ ++
    ++
    <%:Backup Archive%>:
    ++
    ++ ++
    ++
    ++ ++
    ++
    ++<%+footer%> +diff --git a/feeds/luci/modules/luci-mod-admin-mini/luasrc/view/mini/index.htm b/feeds/luci/modules/luci-mod-admin-mini/luasrc/view/mini/index.htm +new file mode 100644 +index 0000000..9fb03c3 +--- /dev/null ++++ b/feeds/luci/modules/luci-mod-admin-mini/luasrc/view/mini/index.htm +@@ -0,0 +1,13 @@ ++<%# ++ Copyright 2008 Steven Barth ++ Copyright 2008 Jo-Philipp Wich ++ Licensed to the public under the Apache License 2.0. ++-%> ++ ++

    <%:Hello!%>

    ++

    <%_This is the administration area of LuCI.%>

    ++

    <%_LuCI is a free, flexible, and user friendly graphical interface for configuring OpenWrt.%>
    ++<%:On the following pages you can adjust all important settings of this device.%>

    ++

    <%:As we always want to improve this interface we are looking forward to your feedback and suggestions.%>

    ++

    <%:And now have fun with your OpenWrt device!%>

    ++

    <%_The LuCI Team%>

    +diff --git a/feeds/luci/modules/luci-mod-admin-mini/luasrc/view/mini/reboot.htm b/feeds/luci/modules/luci-mod-admin-mini/luasrc/view/mini/reboot.htm +new file mode 100644 +index 0000000..0717f68 +--- /dev/null ++++ b/feeds/luci/modules/luci-mod-admin-mini/luasrc/view/mini/reboot.htm +@@ -0,0 +1,25 @@ ++<%# ++ Copyright 2008 Steven Barth ++ Copyright 2008 Jo-Philipp Wich ++ Licensed to the public under the Apache License 2.0. ++-%> ++ ++<%+header%> ++

    <%:System%>

    ++

    <%:Reboot%>

    ++

    <%:Reboots the operating system of your device%>

    ++<%- ++local c = require("luci.model.uci").cursor():changes() ++if c and next(c) then ++-%> ++

    <%:Warning: There are unsaved changes that will be lost while rebooting!%>

    ++<%- ++end ++if not reboot then ++-%> ++

    <%:Perform reboot%>

    ++<%- else -%> ++

    <%:Please wait: Device rebooting...%>

    ++ ++<%- end -%> ++<%+footer%> +\ No newline at end of file +diff --git a/feeds/luci/modules/luci-mod-admin-mini/luasrc/view/mini/upgrade.htm b/feeds/luci/modules/luci-mod-admin-mini/luasrc/view/mini/upgrade.htm +new file mode 100644 +index 0000000..474c220 +--- /dev/null ++++ b/feeds/luci/modules/luci-mod-admin-mini/luasrc/view/mini/upgrade.htm +@@ -0,0 +1,96 @@ ++<%# ++ Copyright 2008 Steven Barth ++ Copyright 2008-2009 Jo-Philipp Wich ++ Licensed to the public under the Apache License 2.0. ++-%> ++ ++<%+header%> ++ ++

    <%:System%>

    ++

    <%:Flash Firmware%>

    ++ ++<% if step == 1 then %> ++ <% if supported then %> ++
    ++

    ++ <%:Upload an OpenWrt image file to reflash the device.%> ++ <% if bad_image then %> ++

    ++

    <%:The uploaded image file does not ++ contain a supported format. Make sure that you choose the generic ++ image format for your platform. %>
    ++ <% end %> ++

    ++
    ++ <%:Firmware image%>:
    ++ ++ ++
    ++
    ++ <% if keepavail then -%> ++ ++ <%:Keep configuration files%> ++ <% end -%> ++ ++
    ++ ++
    ++
    ++ <% else %> ++
    <%_ Sorry. ++ OpenWrt does not support a system upgrade on this platform.
    ++ You need to manually flash your device. %>
    ++ <% end %> ++<% elseif step == 2 then %> ++

    ++ <%_ The flash image was uploaded. ++ Below is the checksum and file size listed, ++ compare them with the original file to ensure data integrity.
    ++ Click "Proceed" below to start the flash procedure. %> ++ ++ <% if flashsize > 0 and filesize > flashsize then %> ++

    ++

    <%:It appears that you are trying to ++ flash an image that does not fit into the flash memory, please verify ++ the image file! %>
    ++ <% end %> ++ ++
    ++
      ++
    • <%:Checksum%>: <%=checksum%>
    • ++
    • <%:Size%>: <% ++ local w = require "luci.tools.webadmin" ++ write(w.byte_format(filesize)) ++ ++ if flashsize > 0 then ++ write(luci.i18n.translatef( ++ " (%s available)", ++ w.byte_format(flashsize) ++ )) ++ end ++ %>
    • ++
    ++

    ++
    ++
    ++ ++ " /> ++ ++
    ++
    ++ ++ " /> ++ ++
    ++
    ++<% elseif step == 3 then %> ++

    <%_ The system is flashing now.
    ++ DO NOT POWER OFF THE DEVICE!
    ++ Wait a few minutes before you try to reconnect. ++ It might be necessary to renew the address of your computer to reach the device ++ again, depending on your settings. %>

    ++ ++ ++<% end %> ++<%+footer%> ++ +diff --git a/feeds/luci/modules/luci-mod-failsafe/Makefile b/feeds/luci/modules/luci-mod-failsafe/Makefile +new file mode 100644 +index 0000000..8afc614 +--- /dev/null ++++ b/feeds/luci/modules/luci-mod-failsafe/Makefile +@@ -0,0 +1,15 @@ ++# ++# Copyright (C) 2008-2014 The LuCI Team ++# ++# This is free software, licensed under the Apache License, Version 2.0 . ++# ++ ++include $(TOPDIR)/rules.mk ++ ++LUCI_TITLE:=LuCI Fail-Safe - Fail-Safe sysupgrade module ++LUCI_DEPENDS:=+luci-base ++ ++include ../../luci.mk ++ ++# call BuildPackage - OpenWrt buildroot signature ++ +diff --git a/feeds/luci/modules/luci-mod-failsafe/luasrc/controller/failsafe/failsafe.lua b/feeds/luci/modules/luci-mod-failsafe/luasrc/controller/failsafe/failsafe.lua +new file mode 100644 +index 0000000..60caadb +--- /dev/null ++++ b/feeds/luci/modules/luci-mod-failsafe/luasrc/controller/failsafe/failsafe.lua +@@ -0,0 +1,202 @@ ++-- Copyright 2008 Steven Barth ++-- Copyright 2008-2011 Jo-Philipp Wich ++-- Copyright 2012 Daniel Golle ++-- Licensed to the public under the Apache License 2.0. ++ ++module("luci.controller.failsafe.failsafe", package.seeall) ++ ++function index() ++ local root = node() ++ if not root.target then ++ root.target = alias("failsafe") ++ root.index = true ++ end ++ ++ page = node() ++ page.lock = true ++ page.target = alias("failsafe") ++ page.subindex = true ++ page.index = false ++ ++ page = node("failsafe") ++ page.title = _("Fail-safe") ++ page.target = alias("failsafe", "flashops") ++ page.order = 5 ++ page.setuser = "root" ++ page.setgroup = "root" ++ page.index = true ++ ++ entry({"failsafe", "flashops"}, call("action_flashops"), _("Flash Firmware"), 70).index = true ++ entry({"failsafe", "reboot"}, call("action_reboot"), _("Reboot"), 90) ++end ++ ++function action_flashops() ++ local sys = require "luci.sys" ++ local fs = require "nixio.fs" ++ ++ local upgrade_avail = fs.access("/lib/upgrade/platform.sh") ++ local reset_avail = os.execute([[grep '"rootfs_data"' /proc/mtd >/dev/null 2>&1]]) == 0 ++ ++ local image_tmp = "/tmp/firmware.img" ++ ++ local function image_supported() ++ -- XXX: yay... ++ return ( 0 == os.execute( ++ ". /lib/functions.sh; " .. ++ "include /lib/upgrade; " .. ++ "platform_check_image %q >/dev/null" ++ % image_tmp ++ ) ) ++ end ++ ++ local function image_checksum() ++ return (luci.sys.exec("md5sum %q" % image_tmp):match("^([^%s]+)")) ++ end ++ ++ local function storage_size() ++ local size = 0 ++ if fs.access("/proc/mtd") then ++ for l in io.lines("/proc/mtd") do ++ local d, s, e, n = l:match('^([^%s]+)%s+([^%s]+)%s+([^%s]+)%s+"([^%s]+)"') ++ if n == "linux" or n == "firmware" then ++ size = tonumber(s, 16) ++ break ++ end ++ end ++ elseif fs.access("/proc/partitions") then ++ for l in io.lines("/proc/partitions") do ++ local x, y, b, n = l:match('^%s*(%d+)%s+(%d+)%s+([^%s]+)%s+([^%s]+)') ++ if b and n and not n:match('[0-9]') then ++ size = tonumber(b) * 1024 ++ break ++ end ++ end ++ end ++ return size ++ end ++ ++ ++ local fp ++ luci.http.setfilehandler( ++ function(meta, chunk, eof) ++ if not fp then ++ if meta and meta.name == "image" then ++ fp = io.open(image_tmp, "w") ++ end ++ end ++ if fp then ++ if chunk then ++ fp:write(chunk) ++ end ++ if eof then ++ fp:close() ++ end ++ end ++ end ++ ) ++ ++ if luci.http.formvalue("image") or luci.http.formvalue("step") then ++ -- ++ -- Initiate firmware flash ++ -- ++ local step = tonumber(luci.http.formvalue("step") or 1) ++ if step == 1 then ++ if image_supported() then ++ luci.template.render("failsafe/upgrade", { ++ checksum = image_checksum(), ++ storage = storage_size(), ++ size = (fs.stat(image_tmp, "size") or 0), ++ keep = false ++ }) ++ else ++ fs.unlink(image_tmp) ++ luci.template.render("failsafe/flashops", { ++ reset_avail = reset_avail, ++ upgrade_avail = upgrade_avail, ++ image_invalid = true ++ }) ++ end ++ -- ++ -- Start sysupgrade flash ++ -- ++ elseif step == 2 then ++ local keep = (luci.http.formvalue("keep") == "1") and "" or "-n" ++ luci.template.render("failsafe/applyreboot", { ++ title = luci.i18n.translate("Flashing..."), ++ msg = luci.i18n.translate("The system is flashing now.
    DO NOT POWER OFF THE DEVICE!
    Wait a few minutes before you try to reconnect. It might be necessary to renew the address of your computer to reach the device again, depending on your settings."), ++ addr = (#keep > 0) and "192.168.1.1" or nil ++ }) ++ fork_exec("killall dropbear uhttpd; sleep 1; /sbin/sysupgrade %s %q" %{ keep, image_tmp }) ++ end ++ else ++ -- ++ -- Overview ++ -- ++ luci.template.render("failsafe/flashops", { ++ reset_avail = reset_avail, ++ upgrade_avail = upgrade_avail ++ }) ++ end ++end ++ ++function action_reboot() ++ local reboot = luci.http.formvalue("reboot") ++ luci.template.render("failsafe/reboot", {reboot=reboot}) ++ if reboot then ++ luci.sys.reboot() ++ end ++end ++ ++function fork_exec(command) ++ local pid = nixio.fork() ++ if pid > 0 then ++ return ++ elseif pid == 0 then ++ -- change to root dir ++ nixio.chdir("/") ++ ++ -- patch stdin, out, err to /dev/null ++ local null = nixio.open("/dev/null", "w+") ++ if null then ++ nixio.dup(null, nixio.stderr) ++ nixio.dup(null, nixio.stdout) ++ nixio.dup(null, nixio.stdin) ++ if null:fileno() > 2 then ++ null:close() ++ end ++ end ++ ++ -- replace with target command ++ nixio.exec("/bin/sh", "-c", command) ++ end ++end ++ ++function ltn12_popen(command) ++ ++ local fdi, fdo = nixio.pipe() ++ local pid = nixio.fork() ++ ++ if pid > 0 then ++ fdo:close() ++ local close ++ return function() ++ local buffer = fdi:read(2048) ++ local wpid, stat = nixio.waitpid(pid, "nohang") ++ if not close and wpid and stat == "exited" then ++ close = true ++ end ++ ++ if buffer and #buffer > 0 then ++ return buffer ++ elseif close then ++ fdi:close() ++ return nil ++ end ++ end ++ elseif pid == 0 then ++ nixio.dup(fdo, nixio.stdout) ++ fdi:close() ++ fdo:close() ++ nixio.exec("/bin/sh", "-c", command) ++ end ++end +diff --git a/feeds/luci/modules/luci-mod-failsafe/luasrc/view/failsafe/applyreboot.htm b/feeds/luci/modules/luci-mod-failsafe/luasrc/view/failsafe/applyreboot.htm +new file mode 100644 +index 0000000..0c8cebc +--- /dev/null ++++ b/feeds/luci/modules/luci-mod-failsafe/luasrc/view/failsafe/applyreboot.htm +@@ -0,0 +1,41 @@ ++<%# ++ Copyright 2008 Steven Barth ++ Copyright 2008 Jo-Philipp Wich ++ Licensed to the public under the Apache License 2.0. ++-%> ++ ++ ++ ++ <%=luci.sys.hostname()%> - <% if title then %><%=title%><% else %><%:Rebooting...%><% end %> ++ ++ ++ ++ ++ ++
    ++
    ++

    <%:System%> - <% if title then %><%=title%><% else %><%:Rebooting...%><% end %>

    ++
    ++

    ++ <% if msg then %><%=msg%><% else %><%:Changes applied.%><% end %> ++

    ++

    ++ <%:Loading%> ++ <%:Waiting for changes to be applied...%> ++

    ++
    ++
    ++
    ++ ++ +diff --git a/feeds/luci/modules/luci-mod-failsafe/luasrc/view/failsafe/flashops.htm b/feeds/luci/modules/luci-mod-failsafe/luasrc/view/failsafe/flashops.htm +new file mode 100644 +index 0000000..29c4d2d +--- /dev/null ++++ b/feeds/luci/modules/luci-mod-failsafe/luasrc/view/failsafe/flashops.htm +@@ -0,0 +1,34 @@ ++<%# ++ Copyright 2008 Steven Barth ++ Copyright 2008 Jo-Philipp Wich ++ Copyright 2012 Daniel Golle ++ Licensed to the public under the Apache License 2.0. ++-%> ++ ++<%+header%> ++ ++

    <%:Flash operations%>

    ++
    ++ <%:Flash new firmware image%> ++ <% if upgrade_avail then %> ++
    ++
    <%:Upload a sysupgrade-compatible image. %>
    ++
    ++
    ++ ++
    ++ ++ ++
    ++
    ++
    ++ <% if image_invalid then %> ++
    <%:The uploaded image file does not contain a supported format. Make sure that you choose the generic image format for your platform. %>
    ++ <% end %> ++
    ++ <% else %> ++
    <%:Sorry, there is no sysupgrade support present; a new firmware image must be flashed manually. Please refer to the OpenWrt wiki for device specific install instructions.%>
    ++ <% end %> ++
    ++ ++<%+footer%> +diff --git a/feeds/luci/modules/luci-mod-failsafe/luasrc/view/failsafe/reboot.htm b/feeds/luci/modules/luci-mod-failsafe/luasrc/view/failsafe/reboot.htm +new file mode 100644 +index 0000000..189939a +--- /dev/null ++++ b/feeds/luci/modules/luci-mod-failsafe/luasrc/view/failsafe/reboot.htm +@@ -0,0 +1,18 @@ ++<%# ++ Copyright 2008 Steven Barth ++ Copyright 2008 Jo-Philipp Wich ++ Copyright 2012 Daniel Golle ++ Licensed to the public under the Apache License 2.0. ++-%> ++ ++<%+header%> ++

    <%:System%>

    ++

    <%:Reboot%>

    ++

    <%:Reboots the operating system of your device%>

    ++<%- if not reboot then -%> ++

    <%:Perform reboot%>

    ++<%- else -%> ++

    <%:Please wait: Device rebooting...%>

    ++ ++<%- end -%> ++<%+footer%> +diff --git a/feeds/luci/modules/luci-mod-failsafe/luasrc/view/failsafe/upgrade.htm b/feeds/luci/modules/luci-mod-failsafe/luasrc/view/failsafe/upgrade.htm +new file mode 100644 +index 0000000..619ed85 +--- /dev/null ++++ b/feeds/luci/modules/luci-mod-failsafe/luasrc/view/failsafe/upgrade.htm +@@ -0,0 +1,53 @@ ++<%# ++ Copyright 2008 Steven Barth ++ Copyright 2008-2009 Jo-Philipp Wich ++ Copyright 2012 Daniel Golle ++ Licensed to the public under the Apache License 2.0. ++-%> ++ ++<%+header%> ++ ++

    <%:Flash Firmware%> - <%:Verify%>

    ++

    ++ <%_ The flash image was uploaded. ++ Below is the checksum and file size listed, ++ compare them with the original file to ensure data integrity.
    ++ Click "Proceed" below to start the flash procedure. %> ++ ++ <% if storage > 0 and size > storage then %> ++

    ++

    <%:It appears that you are trying to ++ flash an image that does not fit into the flash memory, please verify ++ the image file! %>
    ++ <% end %> ++ ++

    ++ ++
    ++
      ++
    • <%:Checksum%>: <%=checksum%>
    • ++
    • <%:Size%>: <% ++ local w = require "luci.tools.webadmin" ++ write(w.byte_format(size)) ++ ++ if storage > 0 then ++ write(luci.i18n.translatef( ++ " (%s available)", ++ w.byte_format(storage) ++ )) ++ end ++ %>
    • ++
    ++
    ++ ++
    ++
    ++ ++
    ++
    ++ ++ ++
    ++
    ++ ++<%+footer%> +diff --git a/feeds/luci/modules/luci-mod-freifunk-community/Makefile b/feeds/luci/modules/luci-mod-freifunk-community/Makefile +new file mode 100644 +index 0000000..ad6c4ce +--- /dev/null ++++ b/feeds/luci/modules/luci-mod-freifunk-community/Makefile +@@ -0,0 +1,19 @@ ++# ++# Copyright (C) 2008-2014 The LuCI Team ++# ++# This is free software, licensed under the Apache License, Version 2.0 . ++# ++ ++include $(TOPDIR)/rules.mk ++ ++LUCI_TITLE:=Freifunk Community Meta-Package ++LUCI_DEPENDS:= \ ++ +iptables-mod-nat-extra +iptables-mod-ipopt +luci-app-splash \ ++ +olsrd +olsrd-mod-dyn-gw-plain +olsrd-mod-jsoninfo +olsrd-mod-nameservice \ ++ +olsrd-mod-watchdog +kmod-tun +ip +freifunk-watchdog +luci-app-olsr \ ++ +luci-app-olsr-services +freifunk-gwcheck +freifunk-mapupdate ++ ++include ../../luci.mk ++ ++# call BuildPackage - OpenWrt buildroot signature ++ +diff --git a/feeds/luci/modules/luci-mod-freifunk/Makefile b/feeds/luci/modules/luci-mod-freifunk/Makefile +new file mode 100644 +index 0000000..550db1d +--- /dev/null ++++ b/feeds/luci/modules/luci-mod-freifunk/Makefile +@@ -0,0 +1,15 @@ ++# ++# Copyright (C) 2008-2014 The LuCI Team ++# ++# This is free software, licensed under the Apache License, Version 2.0 . ++# ++ ++include $(TOPDIR)/rules.mk ++ ++LUCI_TITLE:=LuCI Freifunk module ++LUCI_DEPENDS:=+luci-mod-admin-full +luci-lib-json +freifunk-firewall +freifunk-common ++ ++include ../../luci.mk ++ ++# call BuildPackage - OpenWrt buildroot signature ++ +diff --git a/feeds/luci/modules/luci-mod-freifunk/htdocs/luci-static/flashing.html b/feeds/luci/modules/luci-mod-freifunk/htdocs/luci-static/flashing.html +new file mode 100644 +index 0000000..43e5123 +--- /dev/null ++++ b/feeds/luci/modules/luci-mod-freifunk/htdocs/luci-static/flashing.html +@@ -0,0 +1,84 @@ ++ ++ ++ ++ ++ ++ LuCI - System Upgrade ++ ++ ++ ++ ++ ++ ++ ++
    ++

    Performing Upgrade

    ++ ++

    ++ The System is flashing now. The procedure can take up to 25 minutes, ++ please be patient and wait until this page reloads itself. ++ ++
    ++ ++ Remaining time (estimated): unknown ++

    ++
    ++ ++ ++ +diff --git a/feeds/luci/modules/luci-mod-freifunk/htdocs/luci-static/resources/OSMLatLon.htm b/feeds/luci/modules/luci-mod-freifunk/htdocs/luci-static/resources/OSMLatLon.htm +new file mode 100644 +index 0000000..18be30b +--- /dev/null ++++ b/feeds/luci/modules/luci-mod-freifunk/htdocs/luci-static/resources/OSMLatLon.htm +@@ -0,0 +1,20 @@ ++ ++ ++ ++ OpenStreetMap ++ ++ ++ ++ ++ ++
    ++
    ++ Map by openstreetmap.org, License CC-BY-SA ++      ++ ++ Latitude: ++ Longitude: ++ ++
    ++ ++ +diff --git a/feeds/luci/modules/luci-mod-freifunk/htdocs/luci-static/resources/flashing.gif b/feeds/luci/modules/luci-mod-freifunk/htdocs/luci-static/resources/flashing.gif +new file mode 100644 +index 0000000000000000000000000000000000000000..e207fc56a1fcf035eba568f4ba5396f6dcd030fc +GIT binary patch +literal 4261 +zcmajgX;_kJ-^cNji&a1cMa3lt)Kb%OsZlCxE>KgmOv_5k8Yn9*YiOM^XX3&Q*U&6! +zvcjcwtR^yBb?R~}GA%7r+zJ#GmlV{jx$o|or~B3O=6R0Zov%N~_y0SCLRNE@37CKh +zMgaKq>C@cYr@2p`z@8Sy;a4*s=cZ@p3^Q|GTEn`t-GVFq4XR1~%-q{S!-AwYM=RB- +z)q_*hbH}c$Ti)p}H|RbXKE{>4o0*+kCh07y8(ERjnSM{Jo1At2<;|_uvA&UM?Zj+j +z_oU+GcvH{hkxKQz_{^==@w%?b=KiS*=*ad +z(_sbOCvR$8e|>Y~#aQNjt+Zz7(VL0a8bj^d58Xr49fJnhli_;RWOdtkag%OL|4}_Q +zGp_&GJ!IG=?;rj!d%u0+!Rv{eEn~0L`mw2x>kGPt74LT!zmwe4UTM(v4o^SrnXKvf +zaItQr;`yj%Y)08TRrP8-=iyMlZu;hnF?plz&a3fD^&^{Py_mf%*PF*wLxza+Jyu8C +zN}6<>^v=V-tIMA1p7l<>e6RoW?T3$ZpMF&gB;Oevo%)z@Uz=7vc>Cpe(k;z$N$0}T +z9d8B<_u412A838jI)A>QdC@cvWWC=+vy^sn@v= +zhYps%pD=vnU+xP#+s(`F+II0P)J$ygJ8{+E@$2e{b3N+OnabwTcekE2VCtoZ3rv7LdyQUl^#J5gPe{6X-)uz_t<6G-glhQ{+wH+VCRRj68 +zLw3j891>rf{`6{Xez(cNmxWJ8{Bu;tZ>ZtyF523;=-r7Y>lYKfwL#`|FV~0U-SiFeJNRg}g4Am~6~a +z5!iM3I09tDhxr#BO^A;j!g+jgDzr@>C%cVDLhY?KYum-KPhngIkhz2tDCv}myUbv| +zH88pb0^&pwd?N<#KOCW4USb)EUjgyu@yIoC(9=chG_=&Wmx${-6a(RJTC?Nm%`*+1 +zudJ$F2GU?I4y4umyhy&OeoMwV3&<4EihLHGBbjtX21N0q#Ro{nNg+tJ9Aji;Cd4Xa +z{3b{4iuVx#A4dUDQ3xw=5#0j#zcQHrU&i7bS1AmrLKa$*Q?O|obejoG +ziVQ$S@Jc~P6t1lvaYh!BNZA(G8iJ8C%fA3t7Qg~rJ<3&2I%ra?Ba~_ugOfKJ!hpwnVOcgtUo>9!XRi5kJ5ZFaHfgD;~lqEyS+b +z4;~t+b8Hd&u5gxvB9&;0e@LD%sPCAOU{{sH=NbN=EA3BHBF_#Of?1~dq%W5^YYGbg +zATG>U623ZffNE>xwk3g_+q9H}YG1v4mOXaZ5MTrNfu@jTHtYd2aYtSL5-pQlI+(Fa)KNLS3)7bKHOr~Fhdo|w=>3o@3; +zy=a|&Vg|#dfgRogi7il43nm+Q5^w@P&z(3U9-)v#<0tB0I>%9w)_u!v&*w&R2R7)N +z72-SA*Y#;hsFktJcUBoG)_xpGuh_iTKIZW4wm>GwN4`@cm+VUB`XtD+6hPd}A!e#z +zfn4?+EI4S5Siq?cB(jM$CxvH*F<)D@Lv);vOJe{Elg;Dj(Q~(k>FMSusUM{6-AyhiRl6Zo>;uxIFh3fT};QeyNDg7C2-&|oB#*> +z>Bb1n65>Y$5R4P*RsTLk^S~~ypP@UHbFxgERxaK!;StJeB{!7PO4N9 +zhc=L)0_0K}By%vQ?ed*`pN5xtTQpi|l8eq`NSIBjmOR?mI+wVh4OZlRlP?3ugzFx3 +z#P6{R6_gw?V;#mUwe>$0H70H)i1l)UD0diSR?FPbrTZ}_@#M@!ASE}#5zo#xu$0BQ +z`08hj;(wo#vu2@Goh~VQu^8{+f5si`iv3nkfulU7lz0c>*ckhPR1F+umO|>N3TI{D +z{M;d$L$QNs9U12ktcT0c#b!rATfQ0WDYT#+q@UX;$Ju}fwLpX`sz6Fm`r7G%CV#LZ +z*2En!P||89a~_LX+)Q!#jb_hE7HoIEwJB6n|Q_XM%jwG0SrYc)f@ow&@}3% +zO4e=CGh`l7GE%!T3N8=y6*4!&-g|L84vr+{d`_km&L;@~tX{OlN}TlI3saeH$~D8r +zV08r#4d`XZpo-Mu%}UWvLhHYyjOF=Tfs*i9_?IR<4%8A&nCip4C}dmiD|-;@C7Qt9 +zCnS1^Z2#{C|JVQiZC69Sj#Owa5@AV>MKd($QCkO+(|kHgz<=isNfcjYB+zab)q)N3 +zbH?mtE4K4B+5>IKVhWzps8?Sl)ZhdKb3kXVT&g(N;g`% +zfA-p)(L~CE%C{aZxv9ys-1ylq3eKcd6CL9?Z`%18tA5D^6?_^FxL$tQH_g*a7)o$? +zyX~lTCiWJn?Ry;_UW(dbEivI-5e7?4B;DJ2;(!Q#2aR&n)A>(9MvW15qD`~=!U^oj +z-nrMsis0UMBVwgrUqj|Mhi82(tdwFik!6+CT6HQrfKJ2>N4d1M5SW%2J6iENxleA8 +zPdLeymL+inVdTc!?7_MKm&H^DLIh+MxN$(~MKf{|e`mQio+WINiW`4ha8|n3nafz? +z#;z6m%Wx&Wx8LTk0Bz#VVze;tTbp +zn{=ieBXHRJQpofZ?n40{$e8Z6S0f7TmVx(n#iq+aPJ;~f7^olhIjSYoqhTlL9*TXU}?wm1pNn)Z!k +zoFz;bAgCkz5q3tqw4o;H*oYJkOE>`2tzkZc38lh}1vs&iU!n=dIdg!X#9Bv4Cpwr= +z=@3|Z<T(Tq2DvhLouESibXw$#iu;iR#9i_wHhMezM*1U!By((^AO`OS`jK#6D?_0)JDq> +za3JDdMoN&=!P&T`Rb;z*F$UyAdElW)5p}_oW(z8`kcdHFP6z{m`gRfKbDZ~~5Ly;$ +zwr4|tYt(3WyA{bpCCM)t;W`Z`dM!P>;cB#)99gl+FkG5*|EEyEf(s8m%(T*~U%Lf4 +zgTkeo2*C4%g1g3oX-O&4N9IIFI~Hf`k#b8-zW)OFex3%huc^a2Pbw?Y7+#AL3#u<% +z%L(FOZe+~LSyzyKV=0ixtuB>9rqLTEiXuXxhZ$*UsVJv;hfO1NqAqjP5x>wpjw!Rd +z4?VHCKn>fnSUMXGzH{14C4IwZ37f?P?7DgD3F0V@;!Fe5Pl%zPNOb`7C=M|=y+GuP +znB(oEa)&euTE|AWyGdI0ZBvV4T}c(n0X8> +z)7Z;mj%|C#ef-lOF_0!!G+Q(gntnH3Gi&(II<=fZ$yMqZ$CT$!8ei|&d!zUHuXEr3 +J1u-yK0|2#tP22zg + +literal 0 +HcmV?d00001 + +diff --git a/feeds/luci/modules/luci-mod-freifunk/htdocs/luci-static/resources/freifunk-map/node.gif b/feeds/luci/modules/luci-mod-freifunk/htdocs/luci-static/resources/freifunk-map/node.gif +new file mode 100644 +index 0000000000000000000000000000000000000000..f64ab162a451f8eb04b6b6664694b7b907f511cf +GIT binary patch +literal 209 +zcmZ?wbhEHblwgoxn8?JykoF$}7#J87|8x7fh6Fo12DlpO889<~gnqJcrZ6xu=m6P3 +z4H66tOfpmYSDt>$zj)4;Tiu^o8K20d%vnD5S?97>r?&YrV$-02q#^T$MT30IJcgEO +z>}4^>w!Py%{^^exNE0iXEt&{TzniX^HT-9tTF#*4D)o$G%JV0UuXpUd(fj<@x$pmi +H7#OSpv*u0Q + +literal 0 +HcmV?d00001 + +diff --git a/feeds/luci/modules/luci-mod-freifunk/htdocs/luci-static/resources/osm.js b/feeds/luci/modules/luci-mod-freifunk/htdocs/luci-static/resources/osm.js +new file mode 100644 +index 0000000..cae0cd6 +--- /dev/null ++++ b/feeds/luci/modules/luci-mod-freifunk/htdocs/luci-static/resources/osm.js +@@ -0,0 +1,130 @@ ++var map; ++var layer_mapnik; ++var layer_tah; ++var layer_markers; ++var PI = Math.PI; ++var latfield = ''; ++var lonfield = ''; ++var latfield_id=''; ++var lonfield_id=''; ++var centerlon = 10; ++var centerlat = 52; ++var zoom = 6; ++ ++function lon2merc(lon) { ++ return 20037508.34 * lon / 180; ++} ++ ++function lat2merc(lat) { ++ lat = Math.log(Math.tan( (90 + lat) * PI / 360)) / PI; ++ return 20037508.34 * lat; ++} ++ ++function merc2lon(lon) { ++ return lon*180/20037508.34; ++}; ++ ++function merc2lat(lat) { ++ return Math.atan(Math.exp(lat*PI/20037508.34))*360/PI-90; ++}; ++ ++OpenLayers.Control.Click = OpenLayers.Class(OpenLayers.Control, { ++ defaultHandlerOptions: { ++ 'single': true, ++ 'double': false, ++ 'pixelTolerance': 0, ++ 'stopSingle': false, ++ 'stopDouble': false ++ }, ++ ++ initialize: function(options) { ++ this.handlerOptions = OpenLayers.Util.extend( ++ {}, this.defaultHandlerOptions ++ ); ++ OpenLayers.Control.prototype.initialize.apply( ++ this, arguments ++ ); ++ this.handler = new OpenLayers.Handler.Click( ++ this, { ++ 'click': this.trigger ++ }, this.handlerOptions ++ ); ++ }, ++ ++ trigger: function(e) { ++ var lonlat = map.getLonLatFromViewPortPx(e.xy); ++ lat=merc2lat(lonlat.lat); ++ lon=merc2lon(lonlat.lon); ++ if(parent.document.getElementById(latfield_id)==null){ ++ latfield=document.getElementById('osmlat'); ++ }else{ ++ latfield=parent.document.getElementById(latfield_id); ++ } ++ if(parent.document.getElementById(lonfield_id)==null){ ++ lonfield=document.getElementById('osmlon'); ++ }else{ ++ lonfield=parent.document.getElementById(lonfield_id); ++ } ++ latfield.value = lat; ++ lonfield.value = lon; ++ } ++}); ++ ++function init(){ ++ var field = window.name.substring(0, window.name.lastIndexOf(".")); ++ if(parent.document.getElementById(field+".latfield")!=null){ ++ latfield_id = parent.document.getElementById(field+".latfield").value; ++ document.getElementById('osm').style.display="none"; ++ } ++ if(parent.document.getElementById(field+".lonfield")!=null){ ++ lonfield_id = parent.document.getElementById(field+".lonfield").value; ++ } ++ if(parent.document.getElementById(field+".centerlat")!=null){ ++ centerlat =parseFloat(parent.document.getElementById(field+".centerlat").value); ++ } ++ if(parent.document.getElementById(field+".centerlon")!=null){ ++ centerlon = parseFloat(parent.document.getElementById(field+".centerlon").value); ++ } ++ if(parent.document.getElementById(field+".zoom")!=null){ ++ zoom = parseFloat(parent.document.getElementById(field+".zoom").value); ++ } ++} ++ ++function drawmap() { ++ OpenLayers.Lang.setCode('de'); ++ mapdiv=document.getElementById('map'); ++ mapdiv.style.height=window.innerHeight+"px"; ++ mapdiv.style.width=window.innerWidth+"px"; ++ map = new OpenLayers.Map('map', { ++ projection: new OpenLayers.Projection("EPSG:900913"), ++ displayProjection: new OpenLayers.Projection("EPSG:4326"), ++ controls: [ ++ new OpenLayers.Control.Navigation(), ++ new OpenLayers.Control.PanZoomBar()], ++ maxExtent: ++ new OpenLayers.Bounds(-20037508.34,-20037508.34, 20037508.34, 20037508.34), ++ numZoomLevels: 18, ++ maxResolution: 156543, ++ units: 'meters' ++ }); ++ ++ layer_mapnik = new OpenLayers.Layer.OSM.Mapnik("Mapnik"); ++ ++ map.addLayers([layer_mapnik]); ++ var y =lat2merc(centerlat); ++ var x =lon2merc(centerlon); ++ map.setCenter(new OpenLayers.LonLat(x, y), zoom); ++ ++ // Check for geolocation support ++ if(navigator.geolocation){ ++ navigator.geolocation.getCurrentPosition(function(position){ ++ var y =lat2merc(position.coords.latitude); ++ var x =lon2merc(position.coords.longitude); ++ map.setCenter(new OpenLayers.LonLat(x, y), '17'); ++ }); ++ } ++ ++ var click = new OpenLayers.Control.Click(); ++ map.addControl(click); ++ click.activate(); ++} +diff --git a/feeds/luci/modules/luci-mod-freifunk/luasrc/controller/freifunk/freifunk.lua b/feeds/luci/modules/luci-mod-freifunk/luasrc/controller/freifunk/freifunk.lua +new file mode 100644 +index 0000000..84669dc +--- /dev/null ++++ b/feeds/luci/modules/luci-mod-freifunk/luasrc/controller/freifunk/freifunk.lua +@@ -0,0 +1,219 @@ ++-- Copyright 2008 Steven Barth ++-- Licensed to the public under the Apache License 2.0. ++ ++module("luci.controller.freifunk.freifunk", package.seeall) ++ ++function index() ++ local uci = require "luci.model.uci".cursor() ++ local page ++ ++ -- Frontend ++ page = node() ++ page.lock = true ++ page.target = alias("freifunk") ++ page.subindex = true ++ page.index = false ++ ++ page = node("freifunk") ++ page.title = _("Freifunk") ++ page.target = alias("freifunk", "index") ++ page.order = 5 ++ page.setuser = "nobody" ++ page.setgroup = "nogroup" ++ page.i18n = "freifunk" ++ page.index = true ++ ++ page = node("freifunk", "index") ++ page.target = template("freifunk/index") ++ page.title = _("Overview") ++ page.order = 10 ++ page.indexignore = true ++ ++ page = node("freifunk", "contact") ++ page.target = template("freifunk/contact") ++ page.title = _("Contact") ++ page.order = 15 ++ ++ page = node("freifunk", "status") ++ page.target = template("freifunk/public_status") ++ page.title = _("Status") ++ page.order = 20 ++ page.i18n = "base" ++ page.setuser = false ++ page.setgroup = false ++ ++ entry({"freifunk", "status.json"}, call("jsonstatus")) ++ entry({"freifunk", "status", "zeroes"}, call("zeroes"), "Testdownload") ++ ++ if nixio.fs.access("/usr/sbin/luci-splash") then ++ assign({"freifunk", "status", "splash"}, {"splash", "publicstatus"}, _("Splash"), 40) ++ end ++ ++ page = assign({"freifunk", "olsr"}, {"admin", "status", "olsr"}, _("OLSR"), 30) ++ page.setuser = false ++ page.setgroup = false ++ ++ if nixio.fs.access("/etc/config/luci_statistics") then ++ assign({"freifunk", "graph"}, {"admin", "statistics", "graph"}, _("Statistics"), 40) ++ end ++ ++ -- backend ++ assign({"mini", "freifunk"}, {"admin", "freifunk"}, _("Freifunk"), 5) ++ entry({"admin", "freifunk"}, alias("admin", "freifunk", "index"), _("Freifunk"), 5) ++ ++ page = node("admin", "freifunk") ++ page.target = template("freifunk/adminindex") ++ page.title = _("Freifunk") ++ page.order = 5 ++ ++ page = node("admin", "freifunk", "basics") ++ page.target = cbi("freifunk/basics") ++ page.title = _("Basic Settings") ++ page.order = 5 ++ ++ page = node("admin", "freifunk", "basics", "profile") ++ page.target = cbi("freifunk/profile") ++ page.title = _("Profile") ++ page.order = 10 ++ ++ page = node("admin", "freifunk", "basics", "profile_expert") ++ page.target = cbi("freifunk/profile_expert") ++ page.title = _("Profile (Expert)") ++ page.order = 20 ++ ++ page = node("admin", "freifunk", "Index-Page") ++ page.target = cbi("freifunk/user_index") ++ page.title = _("Index Page") ++ page.order = 50 ++ ++ page = node("admin", "freifunk", "contact") ++ page.target = cbi("freifunk/contact") ++ page.title = _("Contact") ++ page.order = 15 ++ ++ entry({"freifunk", "map"}, template("freifunk-map/frame"), _("Map"), 50) ++ entry({"freifunk", "map", "content"}, template("freifunk-map/map"), nil, 51) ++ entry({"admin", "freifunk", "profile_error"}, template("freifunk/profile_error")) ++end ++ ++function zeroes() ++ local string = require "string" ++ local http = require "luci.http" ++ local zeroes = string.rep(string.char(0), 8192) ++ local cnt = 0 ++ local lim = 1024 * 1024 * 1024 ++ ++ http.prepare_content("application/x-many-zeroes") ++ ++ while cnt < lim do ++ http.write(zeroes) ++ cnt = cnt + #zeroes ++ end ++end ++ ++function jsonstatus() ++ local root = {} ++ local sys = require "luci.sys" ++ local uci = require "luci.model.uci" ++ local util = require "luci.util" ++ local http = require "luci.http" ++ local json = require "luci.json" ++ local ltn12 = require "luci.ltn12" ++ local version = require "luci.version" ++ local webadmin = require "luci.tools.webadmin" ++ ++ local cursor = uci.cursor_state() ++ ++ local ffzone = webadmin.firewall_find_zone("freifunk") ++ local ffznet = ffzone and cursor:get("firewall", ffzone, "network") ++ local ffwifs = ffznet and util.split(ffznet, " ") or {} ++ ++ local sysinfo = util.ubus("system", "info") or { } ++ local boardinfo = util.ubus("system", "board") or { } ++ ++ local loads = sysinfo.load or { 0, 0, 0 } ++ ++ local memory = sysinfo.memory or { ++ total = 0, ++ free = 0, ++ shared = 0, ++ buffered = 0 ++ } ++ ++ local swap = sysinfo.swap or { ++ total = 0, ++ free = 0 ++ } ++ ++ ++ root.protocol = 1 ++ ++ root.system = { ++ uptime = { sysinfo.uptime or 0 }, ++ loadavg = { loads[1] / 65535.0, loads[2] / 65535.0, loads[3] / 65535.0 }, ++ sysinfo = { ++ boardinfo.system or "?", ++ boardinfo.model or "?", ++ memory.total, ++ 0, -- former cached memory ++ memory.buffered, ++ memory.free, ++ 0, -- former bogomips ++ swap.total, ++ 0, -- former cached swap ++ swap.free ++ }, ++ hostname = boardinfo.hostname ++ } ++ ++ root.firmware = { ++ luciname=version.luciname, ++ luciversion=version.luciversion, ++ distname=version.distname, ++ distversion=version.distversion ++ } ++ ++ root.freifunk = {} ++ cursor:foreach("freifunk", "public", function(s) ++ root.freifunk[s[".name"]] = s ++ end) ++ ++ cursor:foreach("system", "system", function(s) ++ root.geo = { ++ latitude = s.latitude, ++ longitude = s.longitude ++ } ++ end) ++ ++ root.network = {} ++ root.wireless = {devices = {}, interfaces = {}, status = {}} ++ local wifs = root.wireless.interfaces ++ local netdata = luci.sys.net.deviceinfo() or {} ++ ++ for _, vif in ipairs(ffwifs) do ++ root.network[vif] = cursor:get_all("network", vif) ++ root.wireless.devices[vif] = cursor:get_all("wireless", vif) ++ cursor:foreach("wireless", "wifi-iface", function(s) ++ if s.device == vif and s.network == vif then ++ wifs[#wifs+1] = s ++ if s.ifname then ++ local iwinfo = luci.sys.wifi.getiwinfo(s.ifname) ++ if iwinfo then ++ root.wireless.status[s.ifname] = { } ++ ++ local _, f ++ for _, f in ipairs({ ++ "channel", "txpower", "bitrate", "signal", "noise", ++ "quality", "quality_max", "mode", "ssid", "bssid", "encryption", "ifname" ++ }) do ++ root.wireless.status[s.ifname][f] = iwinfo[f] ++ end ++ end ++ end ++ end ++ end) ++ end ++ ++ http.prepare_content("application/json") ++ ltn12.pump.all(json.Encoder(root):source(), http.write) ++end +diff --git a/feeds/luci/modules/luci-mod-freifunk/luasrc/controller/freifunk/remote_update.lua b/feeds/luci/modules/luci-mod-freifunk/luasrc/controller/freifunk/remote_update.lua +new file mode 100644 +index 0000000..b317ab6 +--- /dev/null ++++ b/feeds/luci/modules/luci-mod-freifunk/luasrc/controller/freifunk/remote_update.lua +@@ -0,0 +1,52 @@ ++-- Copyright 2009 Jo-Philipp Wich ++-- Licensed to the public under the Apache License 2.0. ++ ++module("luci.controller.freifunk.remote_update", package.seeall) ++ ++function index() ++ if not nixio.fs.access("/usr/sbin/remote-update") then ++ return ++ end ++ ++ entry({"admin", "system", "remote_update"}, call("act_remote_update"), ++ _("Freifunk Remote Update"), 90) ++end ++ ++function act_remote_update() ++ if luci.http.formvalue("flash") == "1" then ++ if luci.http.formvalue("confirm") == "1" then ++ local nobackup = ( luci.http.formvalue("keepcfg") ~= "1" ) ++ local noverify = ( luci.http.formvalue("verify") ~= "1" ) ++ ++ luci.http.redirect("/luci-static/flashing.html") ++ ++ os.execute("start-stop-daemon -S -b -x /usr/sbin/remote-update -- %s%s-s 5 -y" % { ++ noverify and "-v " or "", ++ nobackup and "-n " or "" ++ }) ++ else ++ luci.template.render("freifunk/remote_update", {confirm=1}) ++ end ++ else ++ local fd = io.popen("remote-update -c") ++ local update = { } ++ ++ if fd then ++ while true do ++ local ln=fd:read("*l") ++ ++ if not ln then break ++ elseif ln:find("Local: ") then update.locvar = ln:match("Local: (%d+)") ++ elseif ln:find("Remote: ") then update.remver = ln:match("Remote: (%d+)") ++ elseif ln == "--" then update.info = "" ++ elseif update.info ~= nil then ++ update.info = update.info .. ln .. "\n" ++ end ++ end ++ ++ fd:close() ++ end ++ ++ luci.template.render("freifunk/remote_update", {update=update}) ++ end ++end +diff --git a/feeds/luci/modules/luci-mod-freifunk/luasrc/model/cbi/freifunk/basics.lua b/feeds/luci/modules/luci-mod-freifunk/luasrc/model/cbi/freifunk/basics.lua +new file mode 100644 +index 0000000..0d3d971 +--- /dev/null ++++ b/feeds/luci/modules/luci-mod-freifunk/luasrc/model/cbi/freifunk/basics.lua +@@ -0,0 +1,92 @@ ++-- Copyright 2008 Steven Barth ++-- Copyright 2011 Manuel Munz ++-- Licensed to the public under the Apache License 2.0. ++ ++local fs = require "nixio.fs" ++local util = require "luci.util" ++local uci = require "luci.model.uci".cursor() ++local profiles = "/etc/config/profile_*" ++ ++m = Map("freifunk", translate ("Community")) ++c = m:section(NamedSection, "community", "public", nil, translate("These are the basic settings for your local wireless community. These settings define the default values for the wizard and DO NOT affect the actual configuration of the router.")) ++ ++community = c:option(ListValue, "name", translate ("Community")) ++community.rmempty = false ++ ++local profile ++for profile in fs.glob(profiles) do ++ local name = uci:get_first(profile, "community", "name") or "?" ++ community:value(profile, name) ++end ++ ++ ++n = Map("system", translate("Basic system settings")) ++function n.on_after_commit(self) ++ luci.http.redirect(luci.dispatcher.build_url("admin", "freifunk", "basics")) ++end ++ ++b = n:section(TypedSection, "system") ++b.anonymous = true ++ ++hn = b:option(Value, "hostname", translate("Hostname")) ++hn.rmempty = false ++hn.datatype = "hostname" ++ ++loc = b:option(Value, "location", translate("Location")) ++loc.rmempty = false ++loc.datatype = "minlength(1)" ++ ++lat = b:option(Value, "latitude", translate("Latitude"), translate("e.g.") .. " 48.12345") ++lat.datatype = "float" ++lat.rmempty = false ++ ++lon = b:option(Value, "longitude", translate("Longitude"), translate("e.g.") .. " 10.12345") ++lon.datatype = "float" ++lon.rmempty = false ++ ++--[[ ++Opens an OpenStreetMap iframe or popup ++Makes use of resources/OSMLatLon.htm and htdocs/resources/osm.js ++]]-- ++ ++local class = util.class ++local ff = uci:get("freifunk", "community", "name") or "" ++local co = "profile_" .. ff ++ ++local deflat = uci:get_first("system", "system", "latitude") or uci:get_first(co, "community", "latitude") or 52 ++local deflon = uci:get_first("system", "system", "longitude") or uci:get_first(co, "community", "longitude") or 10 ++local zoom = 12 ++if ( deflat == 52 and deflon == 10 ) then ++ zoom = 4 ++end ++ ++OpenStreetMapLonLat = luci.util.class(AbstractValue) ++ ++function OpenStreetMapLonLat.__init__(self, ...) ++ AbstractValue.__init__(self, ...) ++ self.template = "cbi/osmll_value" ++ self.latfield = nil ++ self.lonfield = nil ++ self.centerlat = "" ++ self.centerlon = "" ++ self.zoom = "0" ++ self.width = "100%" --popups will ignore the %-symbol, "100%" is interpreted as "100" ++ self.height = "600" ++ self.popup = false ++ self.displaytext="OpenStreetMap" --text on button, that loads and displays the OSMap ++ self.hidetext="X" -- text on button, that hides OSMap ++end ++ ++ osm = b:option(OpenStreetMapLonLat, "latlon", translate("Find your coordinates with OpenStreetMap"), translate("Select your location with a mouse click on the map. The map will only show up if you are connected to the Internet.")) ++ osm.latfield = "latitude" ++ osm.lonfield = "longitude" ++ osm.centerlat = uci:get_first("system", "system", "latitude") or deflat ++ osm.centerlon = uci:get_first("system", "system", "longitude") or deflon ++ osm.zoom = zoom ++ osm.width = "100%" ++ osm.height = "600" ++ osm.popup = false ++ osm.displaytext=translate("Show OpenStreetMap") ++ osm.hidetext=translate("Hide OpenStreetMap") ++ ++return m, n +diff --git a/feeds/luci/modules/luci-mod-freifunk/luasrc/model/cbi/freifunk/contact.lua b/feeds/luci/modules/luci-mod-freifunk/luasrc/model/cbi/freifunk/contact.lua +new file mode 100644 +index 0000000..0a6995b +--- /dev/null ++++ b/feeds/luci/modules/luci-mod-freifunk/luasrc/model/cbi/freifunk/contact.lua +@@ -0,0 +1,16 @@ ++-- Copyright 2008 Steven Barth ++-- Copyright 2011 Manuel Munz ++-- Licensed to the public under the Apache License 2.0. ++ ++m = Map("freifunk", translate("Contact"), translate("Please fill in your contact details below.")) ++ ++c = m:section(NamedSection, "contact", "public", "") ++ ++c:option(Value, "nickname", translate("Nickname")) ++c:option(Value, "name", translate("Realname")) ++c:option(DynamicList, "homepage", translate("Homepage")) ++c:option(Value, "mail", translate("E-Mail")) ++c:option(Value, "phone", translate("Phone")) ++c:option(TextValue, "note", translate("Notice")).rows = 10 ++ ++return m +diff --git a/feeds/luci/modules/luci-mod-freifunk/luasrc/model/cbi/freifunk/profile.lua b/feeds/luci/modules/luci-mod-freifunk/luasrc/model/cbi/freifunk/profile.lua +new file mode 100644 +index 0000000..de7caf4 +--- /dev/null ++++ b/feeds/luci/modules/luci-mod-freifunk/luasrc/model/cbi/freifunk/profile.lua +@@ -0,0 +1,74 @@ ++-- Copyright 2011-2012 Manuel Munz ++-- Licensed to the public under the Apache License 2.0. ++ ++local uci = require "luci.model.uci".cursor() ++local ipkg = require "luci.model.ipkg" ++local community = uci:get("freifunk", "community", "name") ++ ++if community == nil then ++ luci.http.redirect(luci.dispatcher.build_url("admin", "freifunk", "profile_error")) ++ return ++else ++ community = "profile_" .. community ++ m = Map(community, translate("Community settings"), translate("These are the settings of your local community.")) ++ c = m:section(NamedSection, "profile", "community") ++ ++ local name = c:option(Value, "name", "Name") ++ name.rmempty = false ++ ++ local homepage = c:option(Value, "homepage", translate("Homepage")) ++ ++ local cc = c:option(Value, "country", translate("Country code")) ++ function cc.cfgvalue(self, section) ++ return uci:get(community, "wifi_device", "country") ++ end ++ function cc.write(self, sec, value) ++ if value then ++ uci:set(community, "wifi_device", "country", value) ++ uci:save(community) ++ end ++ end ++ ++ local ssid = c:option(Value, "ssid", translate("ESSID")) ++ ssid.rmempty = false ++ ++ local prefix = c:option(Value, "mesh_network", translate("Mesh prefix")) ++ prefix.datatype = "ip4addr" ++ prefix.rmempty = false ++ ++ local splash_net = c:option(Value, "splash_network", translate("Network for client DHCP addresses")) ++ splash_net.datatype = "ip4addr" ++ splash_net.rmempty = false ++ ++ local splash_prefix = c:option(Value, "splash_prefix", translate("Client network size")) ++ splash_prefix.datatype = "range(0,32)" ++ splash_prefix.rmempty = false ++ ++ local ipv6 = c:option(Flag, "ipv6", translate("Enable IPv6")) ++ ipv6.rmempty = true ++ ++ local ipv6_config = c:option(ListValue, "ipv6_config", translate("IPv6 Config")) ++ ipv6_config:depends("ipv6", 1) ++ ipv6_config:value("static") ++ if ipkg.installed ("auto-ipv6-ib") then ++ ipv6_config:value("auto-ipv6-random") ++ ipv6_config:value("auto-ipv6-fromv4") ++ end ++ ipv6_config.rmempty = true ++ ++ local ipv6_prefix = c:option(Value, "ipv6_prefix", translate("IPv6 Prefix"), translate("IPv6 network in CIDR notation.")) ++ ipv6_prefix:depends("ipv6", 1) ++ ipv6_prefix.datatype = "ip6addr" ++ ipv6_prefix.rmempty = true ++ ++ local vap = c:option(Flag, "vap", translate("VAP"), translate("Enable a virtual access point (VAP) by default if possible.")) ++ vap.rmempty = true ++ ++ local lat = c:option(Value, "latitude", translate("Latitude")) ++ lat.datatype = "range(-180, 180)" ++ lat.rmempty = false ++ ++ local lon = c:option(Value, "longitude", translate("Longitude")) ++ lon.rmempty = false ++ return m ++end +diff --git a/feeds/luci/modules/luci-mod-freifunk/luasrc/model/cbi/freifunk/profile_expert.lua b/feeds/luci/modules/luci-mod-freifunk/luasrc/model/cbi/freifunk/profile_expert.lua +new file mode 100644 +index 0000000..22554a6 +--- /dev/null ++++ b/feeds/luci/modules/luci-mod-freifunk/luasrc/model/cbi/freifunk/profile_expert.lua +@@ -0,0 +1,32 @@ ++-- Copyright 2011 Manuel Munz ++-- Licensed to the public under the Apache License 2.0. ++ ++local fs = require "nixio.fs" ++local uci = require "luci.model.uci".cursor() ++local community = uci:get("freifunk", "community", "name") ++ ++if community == nil then ++ luci.http.redirect(luci.dispatcher.build_url("admin", "freifunk", "profile_error")) ++ return ++else ++ community = "/etc/config/profile_" .. community ++ f = SimpleForm("community", translate("Community profile"), translate("You can manually edit the selected community profile here.")) ++ ++ t = f:field(TextValue, "cop") ++ t.rmempty = true ++ t.rows = 30 ++ function t.cfgvalue() ++ return fs.readfile(community) or "" ++ end ++ ++ function f.handle(self, state, data) ++ if state == FORM_VALID then ++ if data.cop then ++ fs.writefile(community, data.cop:gsub("\r\n", "\n")) ++ end ++ end ++ return true ++ end ++ return f ++end ++ +diff --git a/feeds/luci/modules/luci-mod-freifunk/luasrc/model/cbi/freifunk/user_index.lua b/feeds/luci/modules/luci-mod-freifunk/luasrc/model/cbi/freifunk/user_index.lua +new file mode 100644 +index 0000000..fe1d8fe +--- /dev/null ++++ b/feeds/luci/modules/luci-mod-freifunk/luasrc/model/cbi/freifunk/user_index.lua +@@ -0,0 +1,30 @@ ++local fs = require "nixio.fs" ++local file = "/www/luci-static/index_user.html" ++ ++m = Map("freifunk", translate("Edit index page"), translate("You can display additional content on the public index page by inserting valid XHTML in the form below.
    Headlines should be enclosed between <h2> and </h2>.")) ++ ++s = m:section(NamedSection, "community", "public", "") ++s.anonymous = true ++ ++di = s:option(Flag, "DefaultText", translate("Disable default content"), translate("If selected then the default content element is not shown.")) ++di.enabled = "disabled" ++di.disabled = "enabled" ++di.rmempty = false ++ ++t = s:option(TextValue, "_text") ++t.rmempty = true ++t.rows = 20 ++ ++function t.cfgvalue() ++ return fs.readfile(file) or "" ++end ++ ++function t.write(self, section, value) ++ return fs.writefile(file, value) ++end ++ ++function t.remove(self, section) ++ return fs.unlink(file) ++end ++ ++return m +diff --git a/feeds/luci/modules/luci-mod-freifunk/luasrc/view/cbi/osmll_value.htm b/feeds/luci/modules/luci-mod-freifunk/luasrc/view/cbi/osmll_value.htm +new file mode 100644 +index 0000000..78b4dff +--- /dev/null ++++ b/feeds/luci/modules/luci-mod-freifunk/luasrc/view/cbi/osmll_value.htm +@@ -0,0 +1,55 @@ ++<%# ++cc-by-sa Andreas Pittrich ++in behalf of the german pirate party (Piratenpartei) ++www.piratenpartei.de ++ ++$Id$ ++ ++-%> ++<%+cbi/valueheader%> ++ ++ <% if self:cfgvalue(section) ~= false then %> ++ <% if self.latfield and self.lonfield then %> ++ /> ++ /> ++ <% end %> ++ /> ++ /> ++ /> ++ <% end %> ++ ++ <% if self.popup then %> ++ ++ onclick=" ++ popup=window.open('/luci-static/resources/OSMLatLon.htm', '<%=cbid%>.window', 'innerWidth=<%=self.width%>, innerHeight=<%=self.height%>, location=no, menubar=no, scrollbars=no, status=no, toolbar=no'); ++ popup.focus(); ++ " ++ /> ++
    ++
    ++ <% else %> ++ ++ onclick=" ++ document.getElementById('<%=cbid..".hideosm"%>').style.display='inline'; ++ document.getElementById('<%=cbid..".displayosm"%>').style.display='none'; ++ for(var i = 0; Math.min(i, window.frames.length)!=window.frames.lengths; i++){ ++ if(frames[i].name=='<%=cbid..".iframe"%>'){ ++ document.getElementById('<%=cbid..".iframediv"%>').style.display='block'; ++ frames[i].location.href='/luci-static/resources/OSMLatLon.htm'; ++ } ++ } ++ " ++ /> ++ ++ onclick=" ++ document.getElementById('<%=cbid..".displayosm"%>').style.display='inline'; ++ document.getElementById('<%=cbid..".hideosm"%>').style.display='none'; ++ document.getElementById('<%=cbid..".iframediv"%>').style.display='none'; ++ " ++ /> ++
    ++
    " style="display:none"> ++ ++ <%end%> ++ ++<%+cbi/valuefooter%> +diff --git a/feeds/luci/modules/luci-mod-freifunk/luasrc/view/freifunk-map/frame.htm b/feeds/luci/modules/luci-mod-freifunk/luasrc/view/freifunk-map/frame.htm +new file mode 100644 +index 0000000..b2e1683 +--- /dev/null ++++ b/feeds/luci/modules/luci-mod-freifunk/luasrc/view/freifunk-map/frame.htm +@@ -0,0 +1,29 @@ ++<%+header%> ++ ++<% ++ local has_latlon = false ++ local uci = require "luci.model.uci".cursor() ++ uci:foreach("olsrd", "LoadPlugin", function(s) ++ if s.library == "olsrd_nameservice.so.0.3" and s.latlon_file then ++ has_latlon = true ++ end ++ end) ++%> ++ ++<% if has_latlon then %> ++ ++

    <%:Legend%>:

    ++
      ++
    • <%:Green%>:<%:Very good (ETX < 2)%>
    • ++
    • <%:Yellow%>:<%:Good (2 < ETX < 4)%>
    • ++
    • <%:Orange%>:<%:Still usable (4 < ETX < 10)%>
    • ++
    • <%:Red%>:<%:Bad (ETX > 10)%>
    • ++
    ++ ++<% else %> ++

    <%:Map Error%>

    ++

    <%_The OLSRd service is not configured to capture position data from the network.
    ++ Please make sure that the nameservice plugin is properly configured and that the latlon_file option is enabled.%>

    ++<% end %> ++<%+footer%> ++ +diff --git a/feeds/luci/modules/luci-mod-freifunk/luasrc/view/freifunk-map/map.htm b/feeds/luci/modules/luci-mod-freifunk/luasrc/view/freifunk-map/map.htm +new file mode 100644 +index 0000000..c3951f9 +--- /dev/null ++++ b/feeds/luci/modules/luci-mod-freifunk/luasrc/view/freifunk-map/map.htm +@@ -0,0 +1,118 @@ ++ ++ ++ ++ Map ++ ++ ++ ++ ++ ++
    ++ ++ +diff --git a/feeds/luci/modules/luci-mod-freifunk/luasrc/view/freifunk/adminindex.htm b/feeds/luci/modules/luci-mod-freifunk/luasrc/view/freifunk/adminindex.htm +new file mode 100644 +index 0000000..e0252ba +--- /dev/null ++++ b/feeds/luci/modules/luci-mod-freifunk/luasrc/view/freifunk/adminindex.htm +@@ -0,0 +1,51 @@ ++<%+header%> ++<% ++local uci = require "luci.model.uci".cursor() ++local contact = uci:get_all("freifunk", "contact") ++local contacturl = luci.dispatcher.build_url(luci.dispatcher.context.path[1], "freifunk", "contact") ++local hostname = uci:get_first ("system", "system", "hostname") ++local latitude = uci:get_first ("system", "system", "latitude") ++local longitude = uci:get_first ("system", "system", "longitude") ++local location = uci:get_first ("system", "system", "location") ++local basicsurl = luci.dispatcher.build_url(luci.dispatcher.context.path[1], "freifunk", "basics") ++local nickname, name, mail ++if not contact then ++ nickname, name, mail = "" ++else ++ nickname = contact.nickname ++ name = contact.name ++ mail = contact.mail ++end ++ ++%> ++ ++

    <%:Freifunk Overview%>

    ++ ++<%:These pages will assist you in setting up your router for Freifunk or similar wireless community networks.%> ++

    ++ ++<% if not (hostname and latitude and longitude and location) then%> ++

    ++ <%:Basic settings are incomplete. Please go to%> <%:Basic settings%> <%:and fill out all required fields.%> ++
    ++<%end%> ++

    ++ ++<% if not (nickname and name and mail) then%> ++

    ++ <%:Contact information is incomplete. Please go to%> <%:Contact%> <%:and fill out all required fields.%> ++

    ++

    ++<%end%> ++ ++<% uci:foreach("wireless", "wifi-device", function(section) ++ local device = section[".name"] ++ local url = luci.dispatcher.build_url(luci.dispatcher.context.path[1], "network", "wireless") ++ if section.diversity ~= "0" and section.disabled ~= "1" and section.type ~= "mac80211" then ++ print('
    ' .. translate("Diversity is enabled for device") .. ' ' .. section[".name"] .. '. ' ++ .. translate("Go to") .. ' ' .. translate("wireless settings") .. ' ' .. ++ translate("to disable it.") .. '

    ') ++ end ++end) %> ++ ++<%+footer%> +diff --git a/feeds/luci/modules/luci-mod-freifunk/luasrc/view/freifunk/contact.htm b/feeds/luci/modules/luci-mod-freifunk/luasrc/view/freifunk/contact.htm +new file mode 100644 +index 0000000..f7cb4a9 +--- /dev/null ++++ b/feeds/luci/modules/luci-mod-freifunk/luasrc/view/freifunk/contact.htm +@@ -0,0 +1,64 @@ ++<%# ++ Copyright 2008 Steven Barth ++ Copyright 2008 Jo-Philipp Wich ++ Copyright 2011 Manuel Munz ++ Licensed to the public under the Apache License 2.0. ++-%> ++ ++<%+header%> ++ ++<% ++local uci = require "luci.model.uci".cursor() ++local contact = uci:get_all("freifunk", "contact") ++local nickname, name, mail, phone, location, note ++local lon = uci:get_first("system", "system", "longitude") ++local lat = uci:get_first("system", "system", "latitude") ++ ++if not contact then ++ nickname, name, homepage, mail, phone, location, note = "" ++else ++ nickname = contact.nickname or "" ++ name = contact.name or "" ++ homepage = contact.homepage or {} ++ mail = contact.mail or "" ++ phone = contact.phone or "" ++ location = uci:get_first("system", "system", "location") or contact.location ++ note = contact.note or "" ++end ++%> ++ ++

    <%:Contact%>

    ++ ++
    ++<%:Operator%> ++ ++ ++ ++ ++ ++ ++
    <%:Nickname%>:<%=nickname%>
    <%:Realname%>:<%=name%>
    <%:Homepage%>: ++ <% for k, v in ipairs(homepage) do %> ++ <%=v%>
    ++ <% end %> ++
    <%:E-Mail%>:<%=mail%>
    <%:Phone%>:<%=phone%>
    ++
    ++ ++
    ++<%:Location%> ++ ++ ++ ++
    <%:Location%>:<%=location%>
    <%:Coordinates%>:<%=lat%> <%=lon%> ("><%:Show on map%>)
    ++
    ++ ++<% if note then %> ++
    ++<%:Notice%> ++ ++ ++
    <%=note%>
    ++
    ++<%end%> ++ ++<%+footer%> +diff --git a/feeds/luci/modules/luci-mod-freifunk/luasrc/view/freifunk/index.htm b/feeds/luci/modules/luci-mod-freifunk/luasrc/view/freifunk/index.htm +new file mode 100644 +index 0000000..3134f0b +--- /dev/null ++++ b/feeds/luci/modules/luci-mod-freifunk/luasrc/view/freifunk/index.htm +@@ -0,0 +1,84 @@ ++<%# ++ Copyright 2008 Steven Barth ++ Copyright 2008 Jo-Philipp Wich ++ Licensed to the public under the Apache License 2.0. ++-%> ++ ++<%+header%> ++<% ++local uci = require "luci.model.uci".cursor() ++local tpl = require "luci.template" ++local fs = require "nixio.fs" ++local ff = {} ++local ff = uci:get_all("freifunk") ++ ++if not ff or not ff.community.name then ++ community = "Freifunk" ++ DefaultText = "" ++ nickname = "No Nickname set" ++else ++ community = ff.community.name ++ DefaultText = ff.community.DefaultText ++ nickname = ff.contact.nickname ++end ++ ++local co = "profile_" .. community ++--local community = uci:get_first(co, "community", "name") or "Freifunk" ++local url = uci:get_first(co, "community", "homepage") or "http://www.freifunk.net" ++ ++ ++local usertext = fs.readfile("/www/luci-static/index_user.html") ++ ++if DefaultText ~= "disabled" then ++ ++ defaulttext = '

    '.. ++ (translate("Hello and welcome in the network of")).. ++ ' '.. ++ (community or "Freifunk Deutschland").. ++ '!

    '.. ++ translate("We are an initiative to establish a free, independent and open wireless mesh network.").. ++ '
    '.. ++ translate("This is the access point").. ++ ' '.. ++ luci.sys.hostname().. ++ '. '.. ++ translate("It is operated by").. ++ ' '.. ++ (nickname or translate("Please set your contact information")).. ++ '.

    '.. ++ translate("You can find further information about the global Freifunk initiative at").. ++ ' Freifunk.net.
    '.. ++ translate("If you are interested in our project then contact the local community").. ++ ' '..community..'.

    '.. ++ translate("Notice").. ++ ': '.. ++ translate("Internet access depends on technical and organisational conditions and may or may not work for you.").. ++ '

    ' ++end ++%> ++ ++<%=defaulttext%> ++<%=usertext%> ++ ++<% ++-- add custom widgets from view/freifunk/widgets ++local widgets = {} ++local dir = "/usr/lib/lua/luci/view/freifunk/widgets" ++ ++uci:foreach("freifunk-widgets", "widget", ++ function(s) ++ if s.enabled == "1" then ++ table.insert(widgets, s) ++ end ++ end) ++ ++for k, v in ipairs(widgets) do ++ if v['template'] and fs.access(dir .. "/" .. v['template'] .. "/main.htm") then ++ tpl.render("freifunk/widgets/" .. v['template'] .. "/main", { data = v }) ++ end ++end ++ ++%> ++<%+footer%> +diff --git a/feeds/luci/modules/luci-mod-freifunk/luasrc/view/freifunk/profile_error.htm b/feeds/luci/modules/luci-mod-freifunk/luasrc/view/freifunk/profile_error.htm +new file mode 100644 +index 0000000..984fa0a +--- /dev/null ++++ b/feeds/luci/modules/luci-mod-freifunk/luasrc/view/freifunk/profile_error.htm +@@ -0,0 +1,11 @@ ++<%+header%> ++ ++<% ++local profileurl = luci.dispatcher.build_url(luci.dispatcher.context.path[1], "freifunk", "basics") ++%> ++ ++

    <%:Error%>

    ++<%:You need to select a profile before you can edit it. To select a profile go to%> <%:Basic settings%>. ++

    ++ ++<%+footer%> +diff --git a/feeds/luci/modules/luci-mod-freifunk/luasrc/view/freifunk/public_status.htm b/feeds/luci/modules/luci-mod-freifunk/luasrc/view/freifunk/public_status.htm +new file mode 100644 +index 0000000..fc3948e +--- /dev/null ++++ b/feeds/luci/modules/luci-mod-freifunk/luasrc/view/freifunk/public_status.htm +@@ -0,0 +1,364 @@ ++<% ++local utl = require "luci.util" ++local sys = require "luci.sys" ++local twa = require "luci.tools.webadmin" ++local ip = require "luci.ip" ++ ++-- System ++ ++local sysinfo = utl.ubus("system", "info") or { } ++local boardinfo = utl.ubus("system", "board") or { } ++ ++local loads = sysinfo.load or { 0, 0, 0 } ++local meminfo = sysinfo.memory or { ++ total = 0, ++ free = 0, ++ buffered = 0, ++ shared = 0 ++} ++ ++local uptime = twa.date_format(sysinfo.uptime or 0) ++local time = os.date("%a, %d %b %Y, %H:%M:%S") ++local load = string.format("%.2f, %.2f, %.2f", loads[1] / 65535.0, loads[2] / 65535.0, loads[3] / 65535.0) ++ ++local mem = string.format( ++ "%.2f MB (%.2f %s, %.2f %s, %.2f %s)", ++ meminfo.total / 1024 / 1024, ++ (meminfo.total - meminfo.free) / 1024 / 1024, ++ tostring(i18n.translate("used")), ++ meminfo.free / 1024 / 1024, ++ tostring(i18n.translate("free")), ++ meminfo.buffered / 1024 / 1024, ++ tostring(i18n.translate("buffered")) ++) ++ ++local interval = 5 ++ ++-- wireless ++local ntm = require "luci.model.network".init() ++local devices = ntm:get_wifidevs() ++local netlist = { } ++local netdevs = { } ++local dev ++for _, dev in ipairs(devices) do ++ local net ++ for _, net in ipairs(dev:get_wifinets()) do ++ netlist[#netlist+1] = net:ifname() ++ netdevs[net:ifname()] = dev:name() ++ end ++end ++local has_iwinfo = pcall(require, "iwinfo") ++ ++ ++-- Find default routes ++ ++local _, r, def4, def6 ++ ++for _, r in ipairs(ip.routes({ type = 1, dest_exact = "0.0.0.0/0" })) do ++ def4 = { ++ gateway = r.gw:string(), ++ dest = r.dest:string(), ++ dev = r.dev, ++ metr = r.metric or 0 ++ } ++ break ++end ++ ++for _, r in ipairs(ip.routes({ type = 1, dest_exact = "::/0" })) do ++ def6 = { ++ gateway = r.gw:string(), ++ dest = r.dest:string(), ++ dev = r.dev, ++ metr = r.metric or 0 ++ } ++ break ++end ++ ++ ++if luci.http.formvalue("status") == "1" then ++ local rv = { } ++ for dev in pairs(netdevs) do ++ local j = { id = dev } ++ local iw = luci.sys.wifi.getiwinfo(dev) ++ if iw then ++ local f ++ for _, f in ipairs({ ++ "channel", "txpower", "bitrate", "signal", "noise", ++ "quality", "quality_max", "mode", "ssid", "bssid", "encryption", "ifname" ++ }) do ++ j[f] = iw[f] ++ end ++ end ++ rv[#rv+1] = j ++ end ++ ++ ++ rv[#rv+1] = { ++ time = time, ++ uptime = uptime, ++ load = load, ++ mem = mem, ++ defroutev4 = def4, ++ defroutev6 = def6 ++ } ++ ++ luci.http.prepare_content("application/json") ++ luci.http.write_json(rv) ++ return ++end ++-%> ++ ++<%+header%> ++ ++ ++ ++ ++ ++

    ++

    <%:System%>

    ++
    ++
    <%=boardinfo.system or "?"%>
    ++
    <%=boardinfo.model or "?"%>
    ++
    <%=load%>
    ++
    <%=mem%>
    ++
    <%=time%>
    ++
    <%=uptime%>
    ++
    ++
    ++ ++<% if devices[1] then %> ++ ++
    ++

    <%:Wireless Overview%>

    ++ ++ <% if not has_iwinfo then %> ++
    ++ <%:Package libiwinfo required!%>
    ++ <%_The libiwinfo package is not installed. You must install this component for working wireless configuration!%> ++
    ++ <% end %> ++ ++
    ++
    ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ <% ++ for _, dev in ipairs(devices) do ++ local net ++ for _, net in ipairs(dev:get_wifinets()) do ++ netlist[#netlist+1] = net:ifname() ++ netdevs[net:ifname()] = dev:name() ++ ++ if net.iwdata.device then ++ local signal = net.iwinfo.signal or "N/A" ++ local noise = net.iwinfo.noise or "N/A" ++ local q = net.iwinfo.quality or "0" ++ local qmax = net.iwinfo.quality_max or "100" ++ local qperc = q / qmax * 100 ++ ++ if qperc == 0 then ++ icon = "signal-none.png" ++ elseif qperc < 26 then ++ icon = "signal-0-25.png" ++ elseif qperc < 51 then ++ icon = "signal-25-50.png" ++ elseif qperc < 76 then ++ icon = "signal-50-75.png" ++ elseif qperc < 100 then ++ icon = "signal-75-100.png" ++ else ++ icon = "signal-0.png" ++ end ++ ++ signal_string = "Signal Quality" ++ ++ local ssid = net.iwinfo.ssid or "N/A" ++ local bssid = net.iwinfo.bssid or "N/A" ++ local chan = net.iwinfo.channel or "N/A" ++ local mode = net.iwinfo.mode or "N/A" ++ local txpwr = net.iwinfo.txpower or "N/A" ++ if txpwr ~= "N/A" then ++ txpwr = txpwr.." dbm" ++ end ++ local bitrate = net.iwinfo.bitrate or "N/A" ++ if bitrate ~= "N/A" then ++ bitrate = ( bitrate / 1000 ).."Mb/s" ++ end ++ local interface = net.iwinfo.ifname or "N/A" ++ %> ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ <% end ++ end ++ end %> ++
    <%:Signal%><%:Bitrate%><%:SSID%><%:BSSID%><%:Channel%><%:Mode%><%:TX%>-<%:Power%><%:Interface%>
    <%=signal_string%><%=bitrate%><%=ssid%><%=bssid%><%=chan%><%=mode%><%=txpwr%><%=interface%>
    ++
    ++
    ++
    ++<% end %> ++ ++
    ++

    <%:Default routes%>

    ++
    ++
    ++ ++<% if not def4 and not def6 then %> ++ <%:No default routes known.%> ++<%else%> ++ ++ ++ ++ ++ ++ ++ ++ ++ <% if def4 then %> ++ ++ ++ ++ ++ ++ ++ ++ <% end ++ if def6 then %> ++ ++ ++ ++ ++ ++ ++ ++ ++ <% end %> ++ ++
    <%:Network%><%:Interface%><%:Gateway%><%:Metric%>
    <%=def4.dest%><%=def4.dev%><%=def4.gateway%><%=def4.metr%>
    <%=def6.dest%><%=def6.dev%><%=def6.gateway%><%=def6.metr%>
    ++<% end %> ++
    ++
    ++
    ++<%+footer%> +diff --git a/feeds/luci/modules/luci-mod-freifunk/luasrc/view/freifunk/remote_update.htm b/feeds/luci/modules/luci-mod-freifunk/luasrc/view/freifunk/remote_update.htm +new file mode 100644 +index 0000000..83e1ee5 +--- /dev/null ++++ b/feeds/luci/modules/luci-mod-freifunk/luasrc/view/freifunk/remote_update.htm +@@ -0,0 +1,51 @@ ++<%# ++ Copyright 2008 Steven Barth ++ Copyright 2008 Jo-Philipp Wich ++ Licensed to the public under the Apache License 2.0. ++-%> ++ ++<%+header%> ++ ++

    <%:Freifunk Remote Update%>

    ++ ++

    <%:Check for new firmware versions and perform automatic updates.%>

    ++ ++<% if update then %> ++ ++ <% if update.info then %> ++ <%:Update available!%> ++

    ++
    <%=update.info%>

    ++ <% else %> ++ <%:The installed firmware is the most recent version.%> ++

    ++ <% end %> ++ ++

    ++

    ++ ++ ++
    ++

    ++ ++<% elseif confirm then %> ++ ++ <%:Update Settings%> ++

    ++ ++

    ++ ++ ++ ++ ++
    ++ ++ ++

    ++ ++ ++

    ++ ++<% end %> ++ ++<%+footer%> +diff --git a/feeds/luci/modules/luci-mod-freifunk/po/ca/freifunk.po b/feeds/luci/modules/luci-mod-freifunk/po/ca/freifunk.po +new file mode 100644 +index 0000000..338c688 +--- /dev/null ++++ b/feeds/luci/modules/luci-mod-freifunk/po/ca/freifunk.po +@@ -0,0 +1,407 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Report-Msgid-Bugs-To: \n" ++"POT-Creation-Date: 2009-06-10 03:40+0200\n" ++"PO-Revision-Date: 2014-07-18 00:15+0200\n" ++"Last-Translator: Alex \n" ++"Language-Team: LANGUAGE \n" ++"Language: ca\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n != 1);\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "BSSID" ++msgstr "BSSID" ++ ++msgid "Bad (ETX > 10)" ++msgstr "Dolent (ETX > 10)" ++ ++msgid "Basic Settings" ++msgstr "Ajusts bàsics" ++ ++msgid "Basic settings" ++msgstr "Ajusts bàsics" ++ ++msgid "Basic settings are incomplete. Please go to" ++msgstr "Els ajusts bàsics estan incomplets. Si us plau, aneu a" ++ ++msgid "Basic system settings" ++msgstr "Ajusts de sistema bàsics" ++ ++msgid "Bitrate" ++msgstr "Velocitat de bits" ++ ++msgid "Channel" ++msgstr "Canal" ++ ++msgid "Check for new firmware versions and perform automatic updates." ++msgstr "" ++"Busca versions de microprogramari noves i realitza actualitzacions " ++"automàtiques." ++ ++msgid "Client network size" ++msgstr "Mida de xarxa client" ++ ++msgid "Community" ++msgstr "Comunitat" ++ ++msgid "Community profile" ++msgstr "Perfil de comunitat" ++ ++msgid "Community settings" ++msgstr "Ajusts de comunitat" ++ ++msgid "Confirm Upgrade" ++msgstr "Confirma actualització" ++ ++msgid "Contact" ++msgstr "Contacte" ++ ++msgid "Contact information is incomplete. Please go to" ++msgstr "La informació de contacte està incompleta. Si us plau, aneu a" ++ ++msgid "Coordinates" ++msgstr "Coordenades" ++ ++msgid "Country code" ++msgstr "Codi de país" ++ ++msgid "Default routes" ++msgstr "Rutes per defecte" ++ ++msgid "Disable default content" ++msgstr "Deshabilita el contingut per defecte" ++ ++msgid "Diversity is enabled for device" ++msgstr "La diversitat està habilitada en el dispositiu" ++ ++msgid "E-Mail" ++msgstr "Adreça electrònica" ++ ++msgid "ESSID" ++msgstr "ESSID" ++ ++msgid "Edit index page" ++msgstr "Edita la pàgina d'índex" ++ ++msgid "Enable IPv6" ++msgstr "Habilita IPv6" ++ ++msgid "Enable a virtual access point (VAP) by default if possible." ++msgstr "Habilita un punt d'accés virtual (VAP) per defecte si és possible." ++ ++msgid "Error" ++msgstr "Error" ++ ++msgid "Find your coordinates with OpenStreetMap" ++msgstr "Troba les vostres coordenades amb l'OpenStreetMap" ++ ++msgid "Freifunk" ++msgstr "Freifunk" ++ ++msgid "Freifunk Overview" ++msgstr "Visió de conjunt del Freifunk" ++ ++msgid "Freifunk Remote Update" ++msgstr "Actualització remota del Freifunk" ++ ++msgid "Gateway" ++msgstr "Passarel·la" ++ ++msgid "Go to" ++msgstr "Vés a" ++ ++msgid "Good (2 < ETX < 4)" ++msgstr "Bo (2 < ETX < 4)" ++ ++msgid "Green" ++msgstr "Verd" ++ ++msgid "Hello and welcome in the network of" ++msgstr "Hola i benvingut a la xarxa de" ++ ++msgid "Hide OpenStreetMap" ++msgstr "Amaga l'OpenStreetMap" ++ ++msgid "Homepage" ++msgstr "Pàgina principal" ++ ++msgid "Hostname" ++msgstr "Nom de màquina" ++ ++msgid "IPv6 Config" ++msgstr "Configuració IPv6" ++ ++msgid "IPv6 Prefix" ++msgstr "Prefix IPv6" ++ ++msgid "IPv6 network in CIDR notation." ++msgstr "Xarxa IPv6 en notació CIDR." ++ ++msgid "If selected then the default content element is not shown." ++msgstr "Si està seleccionat, l'element de contingut per defecte no es mostra." ++ ++msgid "If you are interested in our project then contact the local community" ++msgstr "" ++"Si estàs interessat en el nostre projecte, llavors contacta la comunitat " ++"local" ++ ++msgid "Index Page" ++msgstr "Pàgina d'índex" ++ ++msgid "Interface" ++msgstr "Interfície" ++ ++msgid "" ++"Internet access depends on technical and organisational conditions and may " ++"or may not work for you." ++msgstr "" ++"L'accés a Internet depèn de les condicions tècniques i organitzatives, i pot " ++"funcionar o no per tu." ++ ++msgid "It is operated by" ++msgstr "És administrat per" ++ ++msgid "Keep configuration" ++msgstr "Manté la configuració" ++ ++msgid "Latitude" ++msgstr "Latitud" ++ ++msgid "Legend" ++msgstr "Llegenda" ++ ++msgid "Load" ++msgstr "Càrrega" ++ ++msgid "Local Time" ++msgstr "Hora local" ++ ++msgid "Location" ++msgstr "Ubicació" ++ ++msgid "Longitude" ++msgstr "Longitud" ++ ++msgid "Map" ++msgstr "Mapa" ++ ++msgid "Map Error" ++msgstr "Error de mapa" ++ ++msgid "Memory" ++msgstr "Memòria" ++ ++msgid "Mesh prefix" ++msgstr "Prefix de malla" ++ ++msgid "Metric" ++msgstr "Mètric" ++ ++msgid "Mode" ++msgstr "Mode" ++ ++msgid "Network" ++msgstr "Xarxa" ++ ++msgid "Network for client DHCP addresses" ++msgstr "Xarxa de les adreces DHCP dels clients" ++ ++msgid "Nickname" ++msgstr "Nickname" ++ ++msgid "No default routes known." ++msgstr "No es coneix cap ruta per defecte." ++ ++msgid "Notice" ++msgstr "Avís" ++ ++msgid "OLSR" ++msgstr "OLSR" ++ ++msgid "Operator" ++msgstr "Operador" ++ ++msgid "Orange" ++msgstr "Taronja" ++ ++msgid "Overview" ++msgstr "Visió de conjunt" ++ ++msgid "Package libiwinfo required!" ++msgstr "Es requereix el paquet libiwinfo!" ++ ++msgid "Phone" ++msgstr "Telèfon" ++ ++msgid "Please fill in your contact details below." ++msgstr "Si us plau, empleneu els vostres detalls de contacte a baix." ++ ++msgid "Please set your contact information" ++msgstr "Si us plau, establiu la vostra informació de contacte" ++ ++msgid "Power" ++msgstr "Potència" ++ ++msgid "Processor" ++msgstr "Processador" ++ ++msgid "Profile" ++msgstr "Perfil" ++ ++msgid "Profile (Expert)" ++msgstr "Perfil (expert)" ++ ++msgid "Realname" ++msgstr "Nom real" ++ ++msgid "Red" ++msgstr "Xarxa" ++ ++msgid "SSID" ++msgstr "SSID" ++ ++msgid "" ++"Select your location with a mouse click on the map. The map will only show " ++"up if you are connected to the Internet." ++msgstr "" ++"Seleccioneu la vostra ubicació per un clic del ratolí en el mapa. El mapa es " ++"mostra només si esteu connectat al Internet." ++ ++msgid "Show OpenStreetMap" ++msgstr "Mostra OpenStreetMap" ++ ++msgid "Show on map" ++msgstr "Mostra en mapa" ++ ++msgid "Signal" ++msgstr "Senyal" ++ ++msgid "Splash" ++msgstr "" ++ ++msgid "Start Upgrade" ++msgstr "Inicia l'actualització" ++ ++msgid "Statistics" ++msgstr "Estadístiques" ++ ++msgid "Status" ++msgstr "Estat" ++ ++msgid "Still usable (4 < ETX < 10)" ++msgstr "Encara utilitzable (4 < ETX < 10)" ++ ++msgid "System" ++msgstr "Sistema" ++ ++msgid "TX" ++msgstr "TX" ++ ++msgid "" ++"The libiwinfo package is not installed. You must install this " ++"component for working wireless configuration!" ++msgstr "" ++"El paquet libiwinfo no està instal·lat. Heu d'instal·lar aquest " ++"component per a tenir una configuració sense fil funcionant!" ++ ++msgid "" ++"The OLSRd service is not configured to capture position data from the " ++"network.
    Please make sure that the nameservice plugin is properly " ++"configured and that the latlon_file option is enabled." ++msgstr "" ++ ++msgid "The installed firmware is the most recent version." ++msgstr "El microprogramari instal·lat és la versió més recent." ++ ++msgid "" ++"These are the basic settings for your local wireless community. These " ++"settings define the default values for the wizard and DO NOT affect the " ++"actual configuration of the router." ++msgstr "" ++ ++msgid "These are the settings of your local community." ++msgstr "Aquests són els ajusts de la vostra comunitat local." ++ ++msgid "" ++"These pages will assist you in setting up your router for Freifunk or " ++"similar wireless community networks." ++msgstr "" ++ ++msgid "This is the access point" ++msgstr "Això és el punt d'accés" ++ ++msgid "Update Settings" ++msgstr "Actualitza els ajusts" ++ ++msgid "Update available!" ++msgstr "Actualització disponible!" ++ ++msgid "Uptime" ++msgstr "" ++ ++msgid "VAP" ++msgstr "" ++ ++msgid "Verify downloaded images" ++msgstr "" ++ ++msgid "Very good (ETX < 2)" ++msgstr "Molt bo (ETX < 2)" ++ ++msgid "" ++"We are an initiative to establish a free, independent and open wireless mesh " ++"network." ++msgstr "" ++"Som una iniciativa per establir una xarxa mesh lliure, independent i oberta." ++ ++msgid "Wireless Overview" ++msgstr "Visió de conjunt sense fil" ++ ++msgid "Yellow" ++msgstr "Groc" ++ ++msgid "" ++"You can display additional content on the public index page by inserting " ++"valid XHTML in the form below.
    Headlines should be enclosed between <" ++"h2> and </h2>." ++msgstr "" ++ ++msgid "" ++"You can find further information about the global Freifunk initiative at" ++msgstr "Pots trobar més informació sobre la iniciativa global Freifunk a" ++ ++msgid "You can manually edit the selected community profile here." ++msgstr "" ++ ++msgid "" ++"You need to select a profile before you can edit it. To select a profile go " ++"to" ++msgstr "" ++ ++msgid "and fill out all required fields." ++msgstr "" ++ ++msgid "buffered" ++msgstr "" ++ ++msgid "cached" ++msgstr "" ++ ++msgid "e.g." ++msgstr "" ++ ++msgid "free" ++msgstr "lliure" ++ ++msgid "to disable it." ++msgstr "" ++ ++msgid "used" ++msgstr "utilitzat" ++ ++msgid "wireless settings" ++msgstr "ajusts sense fil" +diff --git a/feeds/luci/modules/luci-mod-freifunk/po/cs/freifunk.po b/feeds/luci/modules/luci-mod-freifunk/po/cs/freifunk.po +new file mode 100644 +index 0000000..cf22c00 +--- /dev/null ++++ b/feeds/luci/modules/luci-mod-freifunk/po/cs/freifunk.po +@@ -0,0 +1,404 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"PO-Revision-Date: 2014-08-08 21:21+0200\n" ++"Last-Translator: koli \n" ++"Language-Team: none\n" ++"Language: cs\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "BSSID" ++msgstr "BSSID" ++ ++msgid "Bad (ETX > 10)" ++msgstr "Å patné (ETX > 10)" ++ ++msgid "Basic Settings" ++msgstr "Základní nastavení" ++ ++msgid "Basic settings" ++msgstr "Základní nastavení" ++ ++msgid "Basic settings are incomplete. Please go to" ++msgstr "Základní nastavení není kompletní. Prosím pÅ™ejdÄ›te na" ++ ++msgid "Basic system settings" ++msgstr "Základní nastavení systému" ++ ++msgid "Bitrate" ++msgstr "Datový tok" ++ ++msgid "Channel" ++msgstr "Kanál" ++ ++#, fuzzy ++msgid "Check for new firmware versions and perform automatic updates." ++msgstr "" ++"Zkontrolovat dostupnost nové verze firmwaru a provést automatické " ++"aktualizace." ++ ++msgid "Client network size" ++msgstr "Velikost klientské sítÄ›" ++ ++msgid "Community" ++msgstr "Komunita" ++ ++msgid "Community profile" ++msgstr "Komunitní profil" ++ ++msgid "Community settings" ++msgstr "Nastavení komunity" ++ ++msgid "Confirm Upgrade" ++msgstr "PotvrÄte upgrade" ++ ++msgid "Contact" ++msgstr "Kontakt" ++ ++msgid "Contact information is incomplete. Please go to" ++msgstr "Kontaktní informace není kompletní. Prosím pokraÄujte na" ++ ++msgid "Coordinates" ++msgstr "SouÅ™adnice" ++ ++msgid "Country code" ++msgstr "Kód zemÄ›" ++ ++msgid "Default routes" ++msgstr "Výchozí trasy" ++ ++#, fuzzy ++msgid "Disable default content" ++msgstr "Zakázat výchozí obsah" ++ ++msgid "Diversity is enabled for device" ++msgstr "" ++ ++msgid "E-Mail" ++msgstr "E-Mail" ++ ++msgid "ESSID" ++msgstr "ESSID" ++ ++msgid "Edit index page" ++msgstr "" ++ ++msgid "Enable IPv6" ++msgstr "Povolit IPv6" ++ ++msgid "Enable a virtual access point (VAP) by default if possible." ++msgstr "" ++ ++msgid "Error" ++msgstr "Chyba" ++ ++msgid "Find your coordinates with OpenStreetMap" ++msgstr "NajdÄ›te své souÅ™adnice pomocí OpenStreetMap" ++ ++msgid "Freifunk" ++msgstr "Freifunk" ++ ++msgid "Freifunk Overview" ++msgstr "Freifunk - PÅ™ehled" ++ ++msgid "Freifunk Remote Update" ++msgstr "Freifunk - Vzdálené aktualizace" ++ ++msgid "Gateway" ++msgstr "Brána" ++ ++msgid "Go to" ++msgstr "Jít na" ++ ++msgid "Good (2 < ETX < 4)" ++msgstr "Dobré (2 < ETX < 4)" ++ ++msgid "Green" ++msgstr "Zelený" ++ ++msgid "Hello and welcome in the network of" ++msgstr "Dobrý den, vítejte v síti" ++ ++msgid "Hide OpenStreetMap" ++msgstr "Skrýt OpenStreetMap" ++ ++msgid "Homepage" ++msgstr "Domovská stránka" ++ ++msgid "Hostname" ++msgstr "Hostname" ++ ++msgid "IPv6 Config" ++msgstr "Konfigurace IPv6" ++ ++msgid "IPv6 Prefix" ++msgstr "IPv6 Prefix" ++ ++msgid "IPv6 network in CIDR notation." ++msgstr "" ++ ++msgid "If selected then the default content element is not shown." ++msgstr "" ++ ++msgid "If you are interested in our project then contact the local community" ++msgstr "Pokud se zajímáte o náš projekt, kontaktujte místní komunitu" ++ ++msgid "Index Page" ++msgstr "" ++ ++msgid "Interface" ++msgstr "Rozhraní" ++ ++msgid "" ++"Internet access depends on technical and organisational conditions and may " ++"or may not work for you." ++msgstr "" ++"Přístup k Internetu závisí na technických a organizaÄních podmínkách. Může " ++"(ale nemusí) vám fungovat." ++ ++msgid "It is operated by" ++msgstr "" ++ ++msgid "Keep configuration" ++msgstr "Uchovat nastavení" ++ ++msgid "Latitude" ++msgstr "ZemÄ›pisná šířka" ++ ++msgid "Legend" ++msgstr "Legenda" ++ ++msgid "Load" ++msgstr "" ++ ++msgid "Local Time" ++msgstr "Místní Äas" ++ ++msgid "Location" ++msgstr "UmístÄ›ní" ++ ++msgid "Longitude" ++msgstr "ZemÄ›pisná délka" ++ ++msgid "Map" ++msgstr "Mapa" ++ ++msgid "Map Error" ++msgstr "Chyba mapy" ++ ++msgid "Memory" ++msgstr "Paměť" ++ ++msgid "Mesh prefix" ++msgstr "Mesh prefix" ++ ++msgid "Metric" ++msgstr "Metrika" ++ ++msgid "Mode" ++msgstr "Režim" ++ ++msgid "Network" ++msgstr "Síť" ++ ++msgid "Network for client DHCP addresses" ++msgstr "" ++ ++msgid "Nickname" ++msgstr "PÅ™ezdívka" ++ ++msgid "No default routes known." ++msgstr "Nejsou známy výchozí cesty" ++ ++msgid "Notice" ++msgstr "UpozornÄ›ní" ++ ++msgid "OLSR" ++msgstr "OLSR" ++ ++msgid "Operator" ++msgstr "Operátor" ++ ++msgid "Orange" ++msgstr "Oranžový" ++ ++msgid "Overview" ++msgstr "PÅ™ehled" ++ ++msgid "Package libiwinfo required!" ++msgstr "BalíÄek libiwinfo je vyžadován!" ++ ++msgid "Phone" ++msgstr "Telefon" ++ ++msgid "Please fill in your contact details below." ++msgstr "Prosím níže vyplňte kontaktní detaily." ++ ++msgid "Please set your contact information" ++msgstr "Prosím nastavte si vaÅ¡e kontaktní informace" ++ ++msgid "Power" ++msgstr "Výkon" ++ ++msgid "Processor" ++msgstr "Procesor" ++ ++msgid "Profile" ++msgstr "Profil" ++ ++msgid "Profile (Expert)" ++msgstr "Profil (Expert)" ++ ++msgid "Realname" ++msgstr "SkuteÄné jméno" ++ ++msgid "Red" ++msgstr "ÄŒervený" ++ ++msgid "SSID" ++msgstr "SSID" ++ ++msgid "" ++"Select your location with a mouse click on the map. The map will only show " ++"up if you are connected to the Internet." ++msgstr "" ++"Kliknutím na mapu vyberte vaÅ¡e umístÄ›ní. Mapa se zobrazí, pouze pokud jste " ++"pÅ™ipojen do sítÄ› Internet." ++ ++msgid "Show OpenStreetMap" ++msgstr "Zobrazit OpenStreetMap" ++ ++msgid "Show on map" ++msgstr "Zobrazit na mapÄ›" ++ ++msgid "Signal" ++msgstr "Signál" ++ ++msgid "Splash" ++msgstr "" ++ ++msgid "Start Upgrade" ++msgstr "Spustit aktualizaci" ++ ++msgid "Statistics" ++msgstr "Statistiky" ++ ++msgid "Status" ++msgstr "Stav" ++ ++msgid "Still usable (4 < ETX < 10)" ++msgstr "Stále použitelné (4 < ETX < 10)" ++ ++msgid "System" ++msgstr "Systém" ++ ++msgid "TX" ++msgstr "TX" ++ ++msgid "" ++"The libiwinfo package is not installed. You must install this " ++"component for working wireless configuration!" ++msgstr "" ++"BalíÄek libiwinfo není nainstalován. Je tÅ™eba ho nainstalovat, aby " ++"byla funkÄní konfigurace bezdrátové sítÄ›!" ++ ++msgid "" ++"The OLSRd service is not configured to capture position data from the " ++"network.
    Please make sure that the nameservice plugin is properly " ++"configured and that the latlon_file option is enabled." ++msgstr "" ++ ++msgid "The installed firmware is the most recent version." ++msgstr "Nainstalovaný firmware je aktuální." ++ ++msgid "" ++"These are the basic settings for your local wireless community. These " ++"settings define the default values for the wizard and DO NOT affect the " ++"actual configuration of the router." ++msgstr "" ++ ++msgid "These are the settings of your local community." ++msgstr "" ++ ++msgid "" ++"These pages will assist you in setting up your router for Freifunk or " ++"similar wireless community networks." ++msgstr "" ++ ++msgid "This is the access point" ++msgstr "To je přístupový bod (AP)" ++ ++msgid "Update Settings" ++msgstr "Nastavení aktualizace" ++ ++msgid "Update available!" ++msgstr "Aktualizace dostupná!" ++ ++msgid "Uptime" ++msgstr "Doba provozu" ++ ++msgid "VAP" ++msgstr "VAP" ++ ++msgid "Verify downloaded images" ++msgstr "" ++ ++msgid "Very good (ETX < 2)" ++msgstr "Velmi dobré (ETX < 2)" ++ ++msgid "" ++"We are an initiative to establish a free, independent and open wireless mesh " ++"network." ++msgstr "" ++ ++msgid "Wireless Overview" ++msgstr "" ++ ++msgid "Yellow" ++msgstr "Žlutý" ++ ++msgid "" ++"You can display additional content on the public index page by inserting " ++"valid XHTML in the form below.
    Headlines should be enclosed between <" ++"h2> and </h2>." ++msgstr "" ++ ++msgid "" ++"You can find further information about the global Freifunk initiative at" ++msgstr "" ++ ++msgid "You can manually edit the selected community profile here." ++msgstr "" ++ ++msgid "" ++"You need to select a profile before you can edit it. To select a profile go " ++"to" ++msgstr "" ++ ++msgid "and fill out all required fields." ++msgstr "" ++ ++msgid "buffered" ++msgstr "" ++ ++msgid "cached" ++msgstr "" ++ ++msgid "e.g." ++msgstr "např." ++ ++msgid "free" ++msgstr "" ++ ++msgid "to disable it." ++msgstr "" ++ ++msgid "used" ++msgstr "" ++ ++msgid "wireless settings" ++msgstr "nastavení bezdrátové sítě" +diff --git a/feeds/luci/modules/luci-mod-freifunk/po/de/freifunk.po b/feeds/luci/modules/luci-mod-freifunk/po/de/freifunk.po +new file mode 100644 +index 0000000..ff6e6bc +--- /dev/null ++++ b/feeds/luci/modules/luci-mod-freifunk/po/de/freifunk.po +@@ -0,0 +1,447 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Report-Msgid-Bugs-To: \n" ++"POT-Creation-Date: 2011-05-12 17:58+0200\n" ++"PO-Revision-Date: 2013-01-28 22:17+0200\n" ++"Last-Translator: DAC324 \n" ++"Language-Team: LANGUAGE \n" ++"Language: de\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n != 1);\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "BSSID" ++msgstr "BSSID" ++ ++msgid "Bad (ETX > 10)" ++msgstr "Schlecht (ETX > 10)" ++ ++msgid "Basic Settings" ++msgstr "Grundeinstellungen" ++ ++msgid "Basic settings" ++msgstr "Grundeinstellungen" ++ ++msgid "Basic settings are incomplete. Please go to" ++msgstr "Die Grundeinstellungen sind unvollständig. Bitte gehe zur Seite" ++ ++msgid "Basic system settings" ++msgstr "Grundlegende Systemeinstellungen" ++ ++msgid "Bitrate" ++msgstr "Bitrate" ++ ++msgid "Channel" ++msgstr "Kanal" ++ ++msgid "Check for new firmware versions and perform automatic updates." ++msgstr "" ++"Der Fernupdate-Mechanismus prüft nach neuen Firmware-Versionen und führt " ++"automatisierte Updates durch." ++ ++msgid "Client network size" ++msgstr "Größe des DHCP-Netzes" ++ ++msgid "Community" ++msgstr "Community" ++ ++msgid "Community profile" ++msgstr "Community Profile" ++ ++msgid "Community settings" ++msgstr "Community Einstellungen" ++ ++msgid "Confirm Upgrade" ++msgstr "Updatevorgang starten" ++ ++msgid "Contact" ++msgstr "Kontakt" ++ ++msgid "Contact information is incomplete. Please go to" ++msgstr "Die Kontaktinformationen sind unvollständig. Bitte gehe zur Seite" ++ ++msgid "Coordinates" ++msgstr "Geokoordinaten" ++ ++msgid "Country code" ++msgstr "Ländercode" ++ ++msgid "Default routes" ++msgstr "Standardrouten" ++ ++msgid "Disable default content" ++msgstr "Standardtext deaktivieren" ++ ++msgid "Diversity is enabled for device" ++msgstr "Diversity ist aktiv für das Interface" ++ ++msgid "E-Mail" ++msgstr "E-Mail" ++ ++msgid "ESSID" ++msgstr "ESSID" ++ ++msgid "Edit index page" ++msgstr "Indexseite bearbeiten" ++ ++msgid "Enable IPv6" ++msgstr "IPv6 aktivieren" ++ ++msgid "Enable a virtual access point (VAP) by default if possible." ++msgstr "" ++ ++msgid "Error" ++msgstr "Fehler" ++ ++msgid "Find your coordinates with OpenStreetMap" ++msgstr "Geokoordinaten mit OpenStreetMap ermitteln" ++ ++msgid "Freifunk" ++msgstr "Freifunk" ++ ++msgid "Freifunk Overview" ++msgstr "Freifunk Übersicht" ++ ++msgid "Freifunk Remote Update" ++msgstr "Freifunk Fernupdate" ++ ++msgid "Gateway" ++msgstr "Gateway" ++ ++msgid "Go to" ++msgstr "Gehe zu" ++ ++msgid "Good (2 < ETX < 4)" ++msgstr "Gut (2 < ETX < 4)" ++ ++msgid "Green" ++msgstr "Grün" ++ ++msgid "Hello and welcome in the network of" ++msgstr "Hallo und willkommen im Netz von" ++ ++msgid "Hide OpenStreetMap" ++msgstr "OpenStreetMap ausblenden" ++ ++msgid "Homepage" ++msgstr "Homepage" ++ ++msgid "Hostname" ++msgstr "Hostname" ++ ++msgid "IPv6 Config" ++msgstr "IPv6 Konfiguration" ++ ++msgid "IPv6 Prefix" ++msgstr "IPv6 Prefix" ++ ++msgid "IPv6 network in CIDR notation." ++msgstr "IPv6 Subnetz in CIDR-Notation" ++ ++msgid "If selected then the default content element is not shown." ++msgstr "" ++"Wird diese Option gewählt dann wird das standardmässige Inhaltselement nicht " ++"angezeigt." ++ ++msgid "If you are interested in our project then contact the local community" ++msgstr "" ++"Hast du Interesse an diesem Projekt, dann wende dich an deine lokale " ++"Gemeinschaft" ++ ++msgid "Index Page" ++msgstr "Index-Seite" ++ ++msgid "Interface" ++msgstr "Schnittstelle" ++ ++msgid "" ++"Internet access depends on technical and organisational conditions and may " ++"or may not work for you." ++msgstr "" ++"Der Internetzugang über das experimentelle Freifunknetz ist an technische " ++"und organisatorische Bedingungen geknüpft und deshalb möglicherweise nicht " ++"(immer) gewährleistet." ++ ++msgid "It is operated by" ++msgstr "Er wird betrieben von " ++ ++msgid "Keep configuration" ++msgstr "Konfigurationsdateien wiederherstellen" ++ ++msgid "Latitude" ++msgstr "Breite" ++ ++msgid "Legend" ++msgstr "Erklärung" ++ ++msgid "Load" ++msgstr "Load" ++ ++msgid "Local Time" ++msgstr "Lokale Zeit" ++ ++msgid "Location" ++msgstr "Standort" ++ ++msgid "Longitude" ++msgstr "Länge" ++ ++msgid "Map" ++msgstr "Karte" ++ ++msgid "Map Error" ++msgstr "Fehler beim Darstellen der Karte" ++ ++msgid "Memory" ++msgstr "Hauptspeicher" ++ ++msgid "Mesh prefix" ++msgstr "Prefix des Meshs" ++ ++msgid "Metric" ++msgstr "Metrik" ++ ++msgid "Mode" ++msgstr "Modus" ++ ++msgid "Network" ++msgstr "Netzwerk" ++ ++msgid "Network for client DHCP addresses" ++msgstr "Netzwerk aus dem IPs für Clients vergeben werden" ++ ++msgid "Nickname" ++msgstr "Pseudonym" ++ ++msgid "No default routes known." ++msgstr "Es sind keine Standardrouten bekannt." ++ ++msgid "Notice" ++msgstr "Notiz" ++ ++msgid "OLSR" ++msgstr "OLSR" ++ ++msgid "Operator" ++msgstr "Betreiber" ++ ++msgid "Orange" ++msgstr "Orange" ++ ++msgid "Overview" ++msgstr "Übersicht" ++ ++msgid "Package libiwinfo required!" ++msgstr "Das Paket libiwinfo wird benötigt!" ++ ++msgid "Phone" ++msgstr "Telefon" ++ ++msgid "Please fill in your contact details below." ++msgstr "Bitte gib hier deine Kontaktdaten an." ++ ++msgid "Please set your contact information" ++msgstr "Bitte gib deine Kontaktinformationen ein" ++ ++msgid "Power" ++msgstr "Power" ++ ++msgid "Processor" ++msgstr "Prozessor" ++ ++msgid "Profile" ++msgstr "Profil" ++ ++msgid "Profile (Expert)" ++msgstr "Profil (Expertenmodus)" ++ ++msgid "Realname" ++msgstr "Name" ++ ++msgid "Red" ++msgstr "Rot" ++ ++msgid "SSID" ++msgstr "SSID" ++ ++msgid "" ++"Select your location with a mouse click on the map. The map will only show " ++"up if you are connected to the Internet." ++msgstr "" ++"Wähle hier deinen Standort durch einen Mausklick aus. Die Karte funktioniert " ++"nur, wenn bereits eine Verbindung zum Internet besteht." ++ ++msgid "Show OpenStreetMap" ++msgstr "OpenStreetMap anzeigen" ++ ++msgid "Show on map" ++msgstr "Karte öffnen" ++ ++msgid "Signal" ++msgstr "Signal" ++ ++msgid "Splash" ++msgstr "Splash" ++ ++msgid "Start Upgrade" ++msgstr "Updatevorgang starten" ++ ++msgid "Statistics" ++msgstr "Statistiken" ++ ++msgid "Status" ++msgstr "Status" ++ ++msgid "Still usable (4 < ETX < 10)" ++msgstr "Noch nutzbar (4 < ETX < 10)" ++ ++msgid "System" ++msgstr "System" ++ ++msgid "TX" ++msgstr "TX" ++ ++msgid "" ++"The libiwinfo package is not installed. You must install this " ++"component for working wireless configuration!" ++msgstr "" ++"Das libiwinfo-Paket ist nicht installiert. Dieses Paket muss für " ++"eine funktionierende WLAN-Konfiguration vorhanden sein!" ++ ++msgid "" ++"The OLSRd service is not configured to capture position data from the " ++"network.
    Please make sure that the nameservice plugin is properly " ++"configured and that the latlon_file option is enabled." ++msgstr "" ++"OLSRd ist nicht dafür konfiguriert worden Geoinformationen zu speichern.
    Bitte sicherstellen dass das OLSRd-Nameservice-Plugin geladen und richtig " ++"konfiguriert wurde (Option latlon_file)." ++ ++msgid "The installed firmware is the most recent version." ++msgstr "Die installierte Firmware ist bereits die neueste Version." ++ ++msgid "" ++"These are the basic settings for your local wireless community. These " ++"settings define the default values for the wizard and DO NOT affect the " ++"actual configuration of the router." ++msgstr "" ++"Dies hier sind die Grundeinstellungen für die Freifunk Community in deiner " ++"Nachbarschaft. Diese Einstellungen legen die Standardwerte für den ffwizard " ++"fest und beeinflussen die aktuelle Konfiguration des Routers NICHT." ++ ++msgid "These are the settings of your local community." ++msgstr "Dies sind die Einstellungen für deine Freifunk Community." ++ ++msgid "" ++"These pages will assist you in setting up your router for Freifunk or " ++"similar wireless community networks." ++msgstr "" ++"Diese Seiten helfen dabei, den Router für Freifunk oder ähnliche Wireless " ++"Community Netzwerke einzurichten." ++ ++msgid "This is the access point" ++msgstr "Dies ist der Zugangspunkt " ++ ++msgid "Update Settings" ++msgstr "Einstellungen zum Update" ++ ++msgid "Update available!" ++msgstr "Update verfügbar!" ++ ++msgid "Uptime" ++msgstr "Uptime" ++ ++msgid "VAP" ++msgstr "" ++ ++msgid "Verify downloaded images" ++msgstr "Heruntergeladene Images verifizieren" ++ ++msgid "Very good (ETX < 2)" ++msgstr "Sehr gut (ETX < 2) " ++ ++msgid "" ++"We are an initiative to establish a free, independent and open wireless mesh " ++"network." ++msgstr "" ++"Wir sind eine Initiative zur Schaffung eines freien, offenen und " ++"unabhängigen Funknetzwerks auf WLAN-Basis." ++ ++msgid "Wireless Overview" ++msgstr "WLAN Übersicht" ++ ++msgid "Yellow" ++msgstr "Gelb" ++ ++msgid "" ++"You can display additional content on the public index page by inserting " ++"valid XHTML in the form below.
    Headlines should be enclosed between <" ++"h2> and </h2>." ++msgstr "" ++"Hier kann der Indexseite weiterer Inhalt hinzugefügt werden. Dazu muss " ++"gültiges XHTML verwendet werden.
    Ãœberschriften sollten zwischen den " ++"Tags <h2> und </h2> eingeschlossen werden." ++ ++msgid "" ++"You can find further information about the global Freifunk initiative at" ++msgstr "Weitere Informationen zur globalen Freifunkinitiative findest du unter" ++ ++msgid "You can manually edit the selected community profile here." ++msgstr "Hier kann das ausgewählte Community-Profil bearbeitet werden." ++ ++msgid "" ++"You need to select a profile before you can edit it. To select a profile go " ++"to" ++msgstr "" ++"Es muss ein Profil ausgewählt werden, bevor es editiert werden kann. Gehe " ++"dazu zur Seite" ++ ++msgid "and fill out all required fields." ++msgstr "und fülle alle benötigten Felder aus." ++ ++msgid "buffered" ++msgstr "gepuffert" ++ ++msgid "cached" ++msgstr "gecacht" ++ ++msgid "e.g." ++msgstr "z.B." ++ ++msgid "free" ++msgstr "ungenutzt" ++ ++msgid "to disable it." ++msgstr "um es auszuschalten." ++ ++msgid "used" ++msgstr "benutzt" ++ ++msgid "wireless settings" ++msgstr "Drahtloseinstellungen" ++ ++#~ msgid "" ++#~ "No services can be shown, because olsrd is not running or the olsrd-" ++#~ "nameservice Plugin is not loaded." ++#~ msgstr "" ++#~ "Es kann keine Liste der Dienste angezeigt werden, da olsrd nicht läuft " ++#~ "oder das nameservice plugin nicht geladen oder konfiguriert wurde." ++ ++#~ msgid "Services" ++#~ msgstr "Dienste" ++ ++#~ msgid "Source" ++#~ msgstr "Quelle" ++ ++#~ msgid "" ++#~ "The libiwinfo-lua package is not installed. You must install " ++#~ "this component for working wireless configuration!" ++#~ msgstr "" ++#~ "Das libiwinfo-lua-Paket ist nicht installiert. Das Paket muss " ++#~ "für eine funktionierende WLAN-Konfiguration installiert sein!" ++ ++#~ msgid "Url" ++#~ msgstr "Adresse" +diff --git a/feeds/luci/modules/luci-mod-freifunk/po/el/freifunk.po b/feeds/luci/modules/luci-mod-freifunk/po/el/freifunk.po +new file mode 100644 +index 0000000..95d58ea +--- /dev/null ++++ b/feeds/luci/modules/luci-mod-freifunk/po/el/freifunk.po +@@ -0,0 +1,407 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Report-Msgid-Bugs-To: \n" ++"POT-Creation-Date: 2009-05-28 02:08+0200\n" ++"PO-Revision-Date: 2012-03-18 15:11+0200\n" ++"Last-Translator: Vasilis \n" ++"Language-Team: LANGUAGE \n" ++"Language: el\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n != 1);\n" ++"X-Generator: Pootle 2.0.4\n" ++ ++msgid "BSSID" ++msgstr "BSSID" ++ ++msgid "Bad (ETX > 10)" ++msgstr "" ++ ++msgid "Basic Settings" ++msgstr "Βασικές Ρυθμίσεις" ++ ++msgid "Basic settings" ++msgstr "Βασικές Ïυθμίσεις" ++ ++msgid "Basic settings are incomplete. Please go to" ++msgstr "" ++ ++msgid "Basic system settings" ++msgstr "Βασικές Ïυθμίσεις συστήματος" ++ ++msgid "Bitrate" ++msgstr "" ++ ++msgid "Channel" ++msgstr "Κανάλι" ++ ++msgid "Check for new firmware versions and perform automatic updates." ++msgstr "" ++ ++msgid "Client network size" ++msgstr "" ++ ++msgid "Community" ++msgstr "Κοινότητα" ++ ++msgid "Community profile" ++msgstr "" ++ ++msgid "Community settings" ++msgstr "" ++ ++msgid "Confirm Upgrade" ++msgstr "" ++ ++msgid "Contact" ++msgstr "Επικοινωνία" ++ ++msgid "Contact information is incomplete. Please go to" ++msgstr "" ++ ++msgid "Coordinates" ++msgstr "Συντεταγμένες" ++ ++msgid "Country code" ++msgstr "Κωδικός xÏŽÏας" ++ ++msgid "Default routes" ++msgstr "" ++ ++msgid "Disable default content" ++msgstr "" ++ ++msgid "Diversity is enabled for device" ++msgstr "" ++ ++msgid "E-Mail" ++msgstr "Ηλ. ΤαχυδÏομείο" ++ ++msgid "ESSID" ++msgstr "ESSID" ++ ++msgid "Edit index page" ++msgstr "" ++ ++msgid "Enable IPv6" ++msgstr "" ++ ++msgid "Enable a virtual access point (VAP) by default if possible." ++msgstr "" ++ ++msgid "Error" ++msgstr "Σφάλμα" ++ ++msgid "Find your coordinates with OpenStreetMap" ++msgstr "" ++ ++msgid "Freifunk" ++msgstr "" ++ ++msgid "Freifunk Overview" ++msgstr "" ++ ++msgid "Freifunk Remote Update" ++msgstr "" ++ ++msgid "Gateway" ++msgstr "ΠÏλη" ++ ++msgid "Go to" ++msgstr "" ++ ++msgid "Good (2 < ETX < 4)" ++msgstr "" ++ ++msgid "Green" ++msgstr "" ++ ++msgid "Hello and welcome in the network of" ++msgstr "Γεια σας και καλώς ήλθατε στο δίκτυο" ++ ++msgid "Hide OpenStreetMap" ++msgstr "" ++ ++msgid "Homepage" ++msgstr "" ++ ++msgid "Hostname" ++msgstr "" ++ ++msgid "IPv6 Config" ++msgstr "" ++ ++msgid "IPv6 Prefix" ++msgstr "" ++ ++msgid "IPv6 network in CIDR notation." ++msgstr "" ++ ++msgid "If selected then the default content element is not shown." ++msgstr "" ++ ++msgid "If you are interested in our project then contact the local community" ++msgstr "Αν ενδιαφέÏεστε για το έÏγο μας, επικοινωνήστε με την τοπική κοινότητα" ++ ++msgid "Index Page" ++msgstr "" ++ ++msgid "Interface" ++msgstr "Διεπαφή" ++ ++msgid "" ++"Internet access depends on technical and organisational conditions and may " ++"or may not work for you." ++msgstr "" ++"Η Ï€Ïόσβαση στο διαδίκτυο εξαÏτάται από τις τεχνικές και τις οÏγανωτικές " ++"συνθήκες και μποÏεί να λειτουÏγεί ή όχι για σας." ++ ++msgid "It is operated by" ++msgstr "ΔιαχειÏίζεται από" ++ ++msgid "Keep configuration" ++msgstr "" ++ ++msgid "Latitude" ++msgstr "ΓεωγÏαφικό πλάτος" ++ ++msgid "Legend" ++msgstr "" ++ ++msgid "Load" ++msgstr "" ++ ++msgid "Local Time" ++msgstr "Τοπική ÎÏα" ++ ++msgid "Location" ++msgstr "Τοποθεσία" ++ ++msgid "Longitude" ++msgstr "ΓεωγÏαφικό μήκος" ++ ++msgid "Map" ++msgstr "ΧάÏτης" ++ ++msgid "Map Error" ++msgstr "" ++ ++msgid "Memory" ++msgstr "Μνήμη" ++ ++msgid "Mesh prefix" ++msgstr "" ++ ++msgid "Metric" ++msgstr "" ++ ++msgid "Mode" ++msgstr "" ++ ++msgid "Network" ++msgstr "Δίκτυο" ++ ++msgid "Network for client DHCP addresses" ++msgstr "" ++ ++msgid "Nickname" ++msgstr "Ψευδώνυμο" ++ ++msgid "No default routes known." ++msgstr "" ++ ++msgid "Notice" ++msgstr "Σημείωση" ++ ++msgid "OLSR" ++msgstr "OLSR" ++ ++msgid "Operator" ++msgstr "" ++ ++msgid "Orange" ++msgstr "" ++ ++msgid "Overview" ++msgstr "" ++ ++msgid "Package libiwinfo required!" ++msgstr "" ++ ++msgid "Phone" ++msgstr "Τηλέφωνο" ++ ++msgid "Please fill in your contact details below." ++msgstr "" ++ ++msgid "Please set your contact information" ++msgstr "" ++ ++msgid "Power" ++msgstr "" ++ ++msgid "Processor" ++msgstr "ΕπεξεÏγαστής" ++ ++msgid "Profile" ++msgstr "" ++ ++msgid "Profile (Expert)" ++msgstr "" ++ ++msgid "Realname" ++msgstr "Ονοματεπώνυμο" ++ ++msgid "Red" ++msgstr "" ++ ++msgid "SSID" ++msgstr "SSID" ++ ++msgid "" ++"Select your location with a mouse click on the map. The map will only show " ++"up if you are connected to the Internet." ++msgstr "" ++ ++msgid "Show OpenStreetMap" ++msgstr "" ++ ++msgid "Show on map" ++msgstr "" ++ ++msgid "Signal" ++msgstr "Σήμα" ++ ++msgid "Splash" ++msgstr "" ++ ++msgid "Start Upgrade" ++msgstr "" ++ ++msgid "Statistics" ++msgstr "Στατιστικά" ++ ++msgid "Status" ++msgstr "" ++ ++msgid "Still usable (4 < ETX < 10)" ++msgstr "" ++ ++msgid "System" ++msgstr "ΣÏστημα" ++ ++msgid "TX" ++msgstr "" ++ ++msgid "" ++"The libiwinfo package is not installed. You must install this " ++"component for working wireless configuration!" ++msgstr "" ++ ++msgid "" ++"The OLSRd service is not configured to capture position data from the " ++"network.
    Please make sure that the nameservice plugin is properly " ++"configured and that the latlon_file option is enabled." ++msgstr "" ++ ++msgid "The installed firmware is the most recent version." ++msgstr "" ++ ++msgid "" ++"These are the basic settings for your local wireless community. These " ++"settings define the default values for the wizard and DO NOT affect the " ++"actual configuration of the router." ++msgstr "" ++ ++msgid "These are the settings of your local community." ++msgstr "Αυτές είναι οι Ïυθμίσεις της τοπικής σας κοινότητας." ++ ++msgid "" ++"These pages will assist you in setting up your router for Freifunk or " ++"similar wireless community networks." ++msgstr "" ++"Αυτές οι σελίδες θα σας βοηθήσουν να Ïυθμίσετε το δÏομολογητή σας για το " ++"Freifunk ή παÏόμοια ασÏÏματα κοινοτικά δίκτυα." ++ ++msgid "This is the access point" ++msgstr "Αυτό είναι το access point" ++ ++msgid "Update Settings" ++msgstr "" ++ ++msgid "Update available!" ++msgstr "" ++ ++msgid "Uptime" ++msgstr "" ++ ++msgid "VAP" ++msgstr "" ++ ++msgid "Verify downloaded images" ++msgstr "" ++ ++msgid "Very good (ETX < 2)" ++msgstr "" ++ ++msgid "" ++"We are an initiative to establish a free, independent and open wireless mesh " ++"network." ++msgstr "" ++"Είμαστε μία Ï€Ïωτοβουλία για την εδÏαίωση ενός ελεÏθεÏου, ανεξάÏτητου και " ++"Î±Î½Î¿Î¹Ï‡Ï„Î¿Ï Î±ÏƒÏÏματου mesh δικτÏου." ++ ++msgid "Wireless Overview" ++msgstr "" ++ ++msgid "Yellow" ++msgstr "" ++ ++msgid "" ++"You can display additional content on the public index page by inserting " ++"valid XHTML in the form below.
    Headlines should be enclosed between <" ++"h2> and </h2>." ++msgstr "" ++ ++msgid "" ++"You can find further information about the global Freifunk initiative at" ++msgstr "" ++"ΜποÏείτε να βÏείτε πεÏισσότεÏες πληÏοφοÏίες για την παγκόσμια Ï€Ïωτοβουλία " ++"Freifunk στο" ++ ++msgid "You can manually edit the selected community profile here." ++msgstr "" ++ ++msgid "" ++"You need to select a profile before you can edit it. To select a profile go " ++"to" ++msgstr "" ++ ++msgid "and fill out all required fields." ++msgstr "" ++ ++msgid "buffered" ++msgstr "" ++ ++msgid "cached" ++msgstr "" ++ ++msgid "e.g." ++msgstr "Ï€.χ." ++ ++msgid "free" ++msgstr "" ++ ++msgid "to disable it." ++msgstr "" ++ ++msgid "used" ++msgstr "" ++ ++msgid "wireless settings" ++msgstr "" ++ ++#~ msgid "Source" ++#~ msgstr "Πηγή" +diff --git a/feeds/luci/modules/luci-mod-freifunk/po/en/freifunk.po b/feeds/luci/modules/luci-mod-freifunk/po/en/freifunk.po +new file mode 100644 +index 0000000..bf99116 +--- /dev/null ++++ b/feeds/luci/modules/luci-mod-freifunk/po/en/freifunk.po +@@ -0,0 +1,400 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Report-Msgid-Bugs-To: \n" ++"POT-Creation-Date: 2009-06-30 06:42+0200\n" ++"PO-Revision-Date: 2009-07-06 23:21+0200\n" ++"Last-Translator: Jo-Philipp Wich \n" ++"Language-Team: LANGUAGE \n" ++"Language: \n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"X-Generator: Pootle 1.1.0\n" ++ ++msgid "BSSID" ++msgstr "" ++ ++msgid "Bad (ETX > 10)" ++msgstr "" ++ ++msgid "Basic Settings" ++msgstr "" ++ ++msgid "Basic settings" ++msgstr "" ++ ++msgid "Basic settings are incomplete. Please go to" ++msgstr "" ++ ++msgid "Basic system settings" ++msgstr "" ++ ++msgid "Bitrate" ++msgstr "" ++ ++msgid "Channel" ++msgstr "" ++ ++msgid "Check for new firmware versions and perform automatic updates." ++msgstr "Check for new firmware versions and perform automatic updates." ++ ++msgid "Client network size" ++msgstr "" ++ ++msgid "Community" ++msgstr "" ++ ++msgid "Community profile" ++msgstr "" ++ ++msgid "Community settings" ++msgstr "" ++ ++msgid "Confirm Upgrade" ++msgstr "" ++ ++msgid "Contact" ++msgstr "" ++ ++msgid "Contact information is incomplete. Please go to" ++msgstr "" ++ ++msgid "Coordinates" ++msgstr "Coordinates" ++ ++msgid "Country code" ++msgstr "" ++ ++msgid "Default routes" ++msgstr "" ++ ++msgid "Disable default content" ++msgstr "" ++ ++msgid "Diversity is enabled for device" ++msgstr "" ++ ++msgid "E-Mail" ++msgstr "E-Mail" ++ ++msgid "ESSID" ++msgstr "" ++ ++msgid "Edit index page" ++msgstr "" ++ ++msgid "Enable IPv6" ++msgstr "" ++ ++msgid "Enable a virtual access point (VAP) by default if possible." ++msgstr "" ++ ++msgid "Error" ++msgstr "" ++ ++msgid "Find your coordinates with OpenStreetMap" ++msgstr "" ++ ++msgid "Freifunk" ++msgstr "" ++ ++msgid "Freifunk Overview" ++msgstr "" ++ ++msgid "Freifunk Remote Update" ++msgstr "Freifunk Remote Update" ++ ++msgid "Gateway" ++msgstr "" ++ ++msgid "Go to" ++msgstr "" ++ ++msgid "Good (2 < ETX < 4)" ++msgstr "" ++ ++msgid "Green" ++msgstr "" ++ ++msgid "Hello and welcome in the network of" ++msgstr "Hello and welcome in the network of" ++ ++msgid "Hide OpenStreetMap" ++msgstr "" ++ ++msgid "Homepage" ++msgstr "" ++ ++msgid "Hostname" ++msgstr "Hostname" ++ ++msgid "IPv6 Config" ++msgstr "" ++ ++msgid "IPv6 Prefix" ++msgstr "" ++ ++msgid "IPv6 network in CIDR notation." ++msgstr "" ++ ++msgid "If selected then the default content element is not shown." ++msgstr "" ++ ++msgid "If you are interested in our project then contact the local community" ++msgstr "If you are interested in our project then contact the local community" ++ ++msgid "Index Page" ++msgstr "" ++ ++msgid "Interface" ++msgstr "" ++ ++msgid "" ++"Internet access depends on technical and organisational conditions and may " ++"or may not work for you." ++msgstr "" ++"Internet access depends on technical and organisational conditions and may " ++"or may not work for you." ++ ++msgid "It is operated by" ++msgstr "It is operated by" ++ ++msgid "Keep configuration" ++msgstr "Keep configuration" ++ ++msgid "Latitude" ++msgstr "" ++ ++msgid "Legend" ++msgstr "" ++ ++msgid "Load" ++msgstr "" ++ ++msgid "Local Time" ++msgstr "" ++ ++msgid "Location" ++msgstr "Location" ++ ++msgid "Longitude" ++msgstr "" ++ ++msgid "Map" ++msgstr "" ++ ++msgid "Map Error" ++msgstr "" ++ ++msgid "Memory" ++msgstr "Memory" ++ ++msgid "Mesh prefix" ++msgstr "" ++ ++msgid "Metric" ++msgstr "" ++ ++msgid "Mode" ++msgstr "" ++ ++msgid "Network" ++msgstr "" ++ ++msgid "Network for client DHCP addresses" ++msgstr "" ++ ++msgid "Nickname" ++msgstr "Nickname" ++ ++msgid "No default routes known." ++msgstr "" ++ ++msgid "Notice" ++msgstr "Notice" ++ ++msgid "OLSR" ++msgstr "" ++ ++msgid "Operator" ++msgstr "" ++ ++msgid "Orange" ++msgstr "" ++ ++msgid "Overview" ++msgstr "" ++ ++msgid "Package libiwinfo required!" ++msgstr "" ++ ++msgid "Phone" ++msgstr "Phone" ++ ++msgid "Please fill in your contact details below." ++msgstr "" ++ ++msgid "Please set your contact information" ++msgstr "" ++ ++msgid "Power" ++msgstr "" ++ ++msgid "Processor" ++msgstr "" ++ ++msgid "Profile" ++msgstr "" ++ ++msgid "Profile (Expert)" ++msgstr "" ++ ++msgid "Realname" ++msgstr "Realname" ++ ++msgid "Red" ++msgstr "" ++ ++msgid "SSID" ++msgstr "" ++ ++msgid "" ++"Select your location with a mouse click on the map. The map will only show " ++"up if you are connected to the Internet." ++msgstr "" ++ ++msgid "Show OpenStreetMap" ++msgstr "" ++ ++msgid "Show on map" ++msgstr "" ++ ++msgid "Signal" ++msgstr "" ++ ++msgid "Splash" ++msgstr "" ++ ++msgid "Start Upgrade" ++msgstr "Start Upgrade" ++ ++msgid "Statistics" ++msgstr "" ++ ++msgid "Status" ++msgstr "" ++ ++msgid "Still usable (4 < ETX < 10)" ++msgstr "" ++ ++msgid "System" ++msgstr "" ++ ++msgid "TX" ++msgstr "" ++ ++msgid "" ++"The libiwinfo package is not installed. You must install this " ++"component for working wireless configuration!" ++msgstr "" ++ ++msgid "" ++"The OLSRd service is not configured to capture position data from the " ++"network.
    Please make sure that the nameservice plugin is properly " ++"configured and that the latlon_file option is enabled." ++msgstr "" ++ ++msgid "The installed firmware is the most recent version." ++msgstr "The installed firmware is the most recent version." ++ ++msgid "" ++"These are the basic settings for your local wireless community. These " ++"settings define the default values for the wizard and DO NOT affect the " ++"actual configuration of the router." ++msgstr "" ++ ++msgid "These are the settings of your local community." ++msgstr "" ++ ++msgid "" ++"These pages will assist you in setting up your router for Freifunk or " ++"similar wireless community networks." ++msgstr "" ++ ++msgid "This is the access point" ++msgstr "This is the access point" ++ ++msgid "Update Settings" ++msgstr "Update Settings" ++ ++msgid "Update available!" ++msgstr "Update available!" ++ ++msgid "Uptime" ++msgstr "" ++ ++msgid "VAP" ++msgstr "" ++ ++msgid "Verify downloaded images" ++msgstr "Verify downloaded images" ++ ++msgid "Very good (ETX < 2)" ++msgstr "" ++ ++msgid "" ++"We are an initiative to establish a free, independent and open wireless mesh " ++"network." ++msgstr "" ++"We are an initiative to establish a free, independent and open wireless mesh " ++"network." ++ ++msgid "Wireless Overview" ++msgstr "" ++ ++msgid "Yellow" ++msgstr "" ++ ++msgid "" ++"You can display additional content on the public index page by inserting " ++"valid XHTML in the form below.
    Headlines should be enclosed between <" ++"h2> and </h2>." ++msgstr "" ++ ++msgid "" ++"You can find further information about the global Freifunk initiative at" ++msgstr "" ++"You can find further information about the global Freifunk initiative at" ++ ++msgid "You can manually edit the selected community profile here." ++msgstr "" ++ ++msgid "" ++"You need to select a profile before you can edit it. To select a profile go " ++"to" ++msgstr "" ++ ++msgid "and fill out all required fields." ++msgstr "" ++ ++msgid "buffered" ++msgstr "" ++ ++msgid "cached" ++msgstr "" ++ ++msgid "e.g." ++msgstr "" ++ ++msgid "free" ++msgstr "" ++ ++msgid "to disable it." ++msgstr "" ++ ++msgid "used" ++msgstr "" ++ ++msgid "wireless settings" ++msgstr "" +diff --git a/feeds/luci/modules/luci-mod-freifunk/po/es/freifunk.po b/feeds/luci/modules/luci-mod-freifunk/po/es/freifunk.po +new file mode 100644 +index 0000000..7242268 +--- /dev/null ++++ b/feeds/luci/modules/luci-mod-freifunk/po/es/freifunk.po +@@ -0,0 +1,417 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Report-Msgid-Bugs-To: \n" ++"POT-Creation-Date: 2009-06-10 03:41+0200\n" ++"PO-Revision-Date: 2014-06-15 13:16+0200\n" ++"Last-Translator: José Vicente \n" ++"Language-Team: LANGUAGE \n" ++"Language: es\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n != 1);\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "BSSID" ++msgstr "BSSID" ++ ++msgid "Bad (ETX > 10)" ++msgstr "Malo (ETX > 10)" ++ ++msgid "Basic Settings" ++msgstr "Configuración básica" ++ ++msgid "Basic settings" ++msgstr "Configuración básica" ++ ++msgid "Basic settings are incomplete. Please go to" ++msgstr "Configuración básica incompleta. Por favor, vaya a" ++ ++msgid "Basic system settings" ++msgstr "Configuración básica del sistema" ++ ++msgid "Bitrate" ++msgstr "Bitrate" ++ ++msgid "Channel" ++msgstr "Canal" ++ ++msgid "Check for new firmware versions and perform automatic updates." ++msgstr "" ++"Comprobar nuevas versiones de firmware y realizar actualizaciones " ++"automáticas." ++ ++msgid "Client network size" ++msgstr "Tamaño de la red cliente" ++ ++msgid "Community" ++msgstr "Comunidad" ++ ++msgid "Community profile" ++msgstr "Perfil de la comunidad" ++ ++msgid "Community settings" ++msgstr "Configuración de la comunidad" ++ ++msgid "Confirm Upgrade" ++msgstr "Confirmar actualización" ++ ++msgid "Contact" ++msgstr "Contacto" ++ ++msgid "Contact information is incomplete. Please go to" ++msgstr "La información de contacto no está completa. Por favor, vaya a" ++ ++msgid "Coordinates" ++msgstr "Coordenadas" ++ ++msgid "Country code" ++msgstr "Código de país" ++ ++msgid "Default routes" ++msgstr "Rutas por defecto" ++ ++msgid "Disable default content" ++msgstr "Desactive contenido por defecto" ++ ++msgid "Diversity is enabled for device" ++msgstr "Diversidad activar para el dispositivo" ++ ++msgid "E-Mail" ++msgstr "E-Mail" ++ ++msgid "ESSID" ++msgstr "ESSID" ++ ++msgid "Edit index page" ++msgstr "Editar índice" ++ ++msgid "Enable IPv6" ++msgstr "Activar IPv6" ++ ++msgid "Enable a virtual access point (VAP) by default if possible." ++msgstr "Activa un punto virtual de acceso (VAP) por dehecto si es posible." ++ ++msgid "Error" ++msgstr "Error" ++ ++msgid "Find your coordinates with OpenStreetMap" ++msgstr "Busca sus coordenadas con OpenStreetMap" ++ ++msgid "Freifunk" ++msgstr "Freifunk" ++ ++msgid "Freifunk Overview" ++msgstr "Resumen de Freifunk" ++ ++msgid "Freifunk Remote Update" ++msgstr "Actualización remota de Freifunk" ++ ++msgid "Gateway" ++msgstr "Pasarela" ++ ++msgid "Go to" ++msgstr "Ir a" ++ ++msgid "Good (2 < ETX < 4)" ++msgstr "Bueno (2 < ETX < 4)" ++ ++msgid "Green" ++msgstr "Verde" ++ ++msgid "Hello and welcome in the network of" ++msgstr "Hola y bienvenido a la red de" ++ ++msgid "Hide OpenStreetMap" ++msgstr "Ocultar OpenStreetMap" ++ ++msgid "Homepage" ++msgstr "Página inicial" ++ ++msgid "Hostname" ++msgstr "Nombre de máquina" ++ ++msgid "IPv6 Config" ++msgstr "Configuración de IPv6" ++ ++msgid "IPv6 Prefix" ++msgstr "Prefijo IPv6" ++ ++msgid "IPv6 network in CIDR notation." ++msgstr "Red IPv6 en notación CIDR." ++ ++msgid "If selected then the default content element is not shown." ++msgstr "No mostrar el contenido por defecto." ++ ++msgid "If you are interested in our project then contact the local community" ++msgstr "" ++"Si se encuentra interesado en nuestro proyecto contacte, por favor, con su " ++"comunidad local mas cercana" ++ ++msgid "Index Page" ++msgstr "Ãndice" ++ ++msgid "Interface" ++msgstr "Interfaz" ++ ++msgid "" ++"Internet access depends on technical and organisational conditions and may " ++"or may not work for you." ++msgstr "" ++"El acceso a Internet depende de condiciones tanto técnicas como " ++"organizativas por lo que puede no funcionarle." ++ ++msgid "It is operated by" ++msgstr "Administrado por" ++ ++msgid "Keep configuration" ++msgstr "Mantener configuración" ++ ++msgid "Latitude" ++msgstr "Latitud" ++ ++msgid "Legend" ++msgstr "Leyenda" ++ ++msgid "Load" ++msgstr "Carga" ++ ++msgid "Local Time" ++msgstr "Hora local" ++ ++msgid "Location" ++msgstr "Lugar" ++ ++msgid "Longitude" ++msgstr "Longitud" ++ ++msgid "Map" ++msgstr "Mapa" ++ ++msgid "Map Error" ++msgstr "Error en el map" ++ ++msgid "Memory" ++msgstr "Memoria" ++ ++msgid "Mesh prefix" ++msgstr "Prefijo mesh" ++ ++msgid "Metric" ++msgstr "Métrica" ++ ++msgid "Mode" ++msgstr "Modo" ++ ++msgid "Network" ++msgstr "Red" ++ ++msgid "Network for client DHCP addresses" ++msgstr "Red para las direcciones DHCP de los clientes" ++ ++msgid "Nickname" ++msgstr "Apodo" ++ ++msgid "No default routes known." ++msgstr "Sin rutas por defecto." ++ ++msgid "Notice" ++msgstr "Aviso" ++ ++msgid "OLSR" ++msgstr "OLSR" ++ ++msgid "Operator" ++msgstr "Administrador" ++ ++msgid "Orange" ++msgstr "Naranja" ++ ++msgid "Overview" ++msgstr "Repaso" ++ ++msgid "Package libiwinfo required!" ++msgstr "¡Es necesario el paquete libiwinfo!" ++ ++msgid "Phone" ++msgstr "Teléfono" ++ ++msgid "Please fill in your contact details below." ++msgstr "Por favor, introduzca sus datos de contacto." ++ ++msgid "Please set your contact information" ++msgstr "Por favor, configure su información de contacto" ++ ++msgid "Power" ++msgstr "Potencia" ++ ++msgid "Processor" ++msgstr "Procesador" ++ ++msgid "Profile" ++msgstr "Perfil" ++ ++msgid "Profile (Expert)" ++msgstr "Perfil (experto)" ++ ++msgid "Realname" ++msgstr "Nombre real" ++ ++msgid "Red" ++msgstr "Rojo" ++ ++msgid "SSID" ++msgstr "SSID" ++ ++msgid "" ++"Select your location with a mouse click on the map. The map will only show " ++"up if you are connected to the Internet." ++msgstr "" ++"Elija su posición pulsando el ratón sobre el mapa. El mapa solo aparecerá si " ++"está conectado a internet." ++ ++msgid "Show OpenStreetMap" ++msgstr "Mostrar OpenStreetMap" ++ ++msgid "Show on map" ++msgstr "Mostrar en el mapa" ++ ++msgid "Signal" ++msgstr "Señal" ++ ++msgid "Splash" ++msgstr "Presentación" ++ ++msgid "Start Upgrade" ++msgstr "Iniciar actualización" ++ ++msgid "Statistics" ++msgstr "Estadísticas" ++ ++msgid "Status" ++msgstr "Estado" ++ ++msgid "Still usable (4 < ETX < 10)" ++msgstr "Aún utilizable (4 < ETX < 10)" ++ ++msgid "System" ++msgstr "Sistema" ++ ++msgid "TX" ++msgstr "TX" ++ ++msgid "" ++"The libiwinfo package is not installed. You must install this " ++"component for working wireless configuration!" ++msgstr "" ++"El paquete libiwinfo no está instalado. ¡Debe instalarlo para que " ++"funcione la red inalámbrica!" ++ ++msgid "" ++"The OLSRd service is not configured to capture position data from the " ++"network.
    Please make sure that the nameservice plugin is properly " ++"configured and that the latlon_file option is enabled." ++msgstr "" ++"El servicio OLSRd no está configurado para tomar los datos de posición desde " ++"la red.
    Asegúrese de que el plugin \"nameservice\" está bien " ++"configurado y que la opción latlon_file está marcada." ++ ++msgid "The installed firmware is the most recent version." ++msgstr "El firmare instalado está en la versión más reciente." ++ ++msgid "" ++"These are the basic settings for your local wireless community. These " ++"settings define the default values for the wizard and DO NOT affect the " ++"actual configuration of the router." ++msgstr "" ++"Configuración básica de su comunidad inalámbrica. Aquí puede definir los " ++"valores por defecto para el asistente SIN afectar a la configuración del " ++"router." ++ ++msgid "These are the settings of your local community." ++msgstr "Configuración de su comunidad local." ++ ++msgid "" ++"These pages will assist you in setting up your router for Freifunk or " ++"similar wireless community networks." ++msgstr "" ++"Configuración de su router para Freifunk o redes comunitarias similares." ++ ++msgid "This is the access point" ++msgstr "Este es el punto de acceso" ++ ++msgid "Update Settings" ++msgstr "Actualizar configuración" ++ ++msgid "Update available!" ++msgstr "¡Actualización disponible!" ++ ++msgid "Uptime" ++msgstr "Tiempo activo" ++ ++msgid "VAP" ++msgstr "VAP" ++ ++msgid "Verify downloaded images" ++msgstr "Verificar las descargas" ++ ++msgid "Very good (ETX < 2)" ++msgstr "Muy bueno (ETX < 2)" ++ ++msgid "" ++"We are an initiative to establish a free, independent and open wireless mesh " ++"network." ++msgstr "" ++"Somos una iniciativa que pretende crear una red libre, independiente y " ++"abierta utilizando una red mesh inalámbrica." ++ ++msgid "Wireless Overview" ++msgstr "Resumen de red inalámbrica" ++ ++msgid "Yellow" ++msgstr "Amarillo" ++ ++msgid "" ++"You can display additional content on the public index page by inserting " ++"valid XHTML in the form below.
    Headlines should be enclosed between <" ++"h2> and </h2>." ++msgstr "" ++"Puede mostrar más contenido en el índice público poniendo XHTML válido en " ++"este formulario.
    Las cabeceras deben ir entre <h2> y </h2>." ++ ++msgid "" ++"You can find further information about the global Freifunk initiative at" ++msgstr "Puede obtener información acerca de la iniciativa global Freifunk en" ++ ++msgid "You can manually edit the selected community profile here." ++msgstr "Edite el perfil comunitario local." ++ ++msgid "" ++"You need to select a profile before you can edit it. To select a profile go " ++"to" ++msgstr "Elija un perfil para editarlo. Para elegir el perfil vaya a" ++ ++msgid "and fill out all required fields." ++msgstr "y rellene los campos requeridos." ++ ++msgid "buffered" ++msgstr "en búfer" ++ ++msgid "cached" ++msgstr "en caché" ++ ++msgid "e.g." ++msgstr "ej." ++ ++msgid "free" ++msgstr "libre" ++ ++msgid "to disable it." ++msgstr "para desactivarlo." ++ ++msgid "used" ++msgstr "usado" ++ ++msgid "wireless settings" ++msgstr "configuración inalámbrica" +diff --git a/feeds/luci/modules/luci-mod-freifunk/po/fr/freifunk.po b/feeds/luci/modules/luci-mod-freifunk/po/fr/freifunk.po +new file mode 100644 +index 0000000..028a2ce +--- /dev/null ++++ b/feeds/luci/modules/luci-mod-freifunk/po/fr/freifunk.po +@@ -0,0 +1,395 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Report-Msgid-Bugs-To: \n" ++"POT-Creation-Date: 2009-05-19 19:36+0200\n" ++"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" ++"Last-Translator: FULL NAME \n" ++"Language-Team: LANGUAGE \n" ++"Language: \n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"X-Generator: Translate Toolkit 1.1.1\n" ++ ++msgid "BSSID" ++msgstr "" ++ ++msgid "Bad (ETX > 10)" ++msgstr "" ++ ++msgid "Basic Settings" ++msgstr "" ++ ++msgid "Basic settings" ++msgstr "" ++ ++msgid "Basic settings are incomplete. Please go to" ++msgstr "" ++ ++msgid "Basic system settings" ++msgstr "" ++ ++msgid "Bitrate" ++msgstr "" ++ ++msgid "Channel" ++msgstr "" ++ ++msgid "Check for new firmware versions and perform automatic updates." ++msgstr "" ++ ++msgid "Client network size" ++msgstr "" ++ ++msgid "Community" ++msgstr "" ++ ++msgid "Community profile" ++msgstr "" ++ ++msgid "Community settings" ++msgstr "" ++ ++msgid "Confirm Upgrade" ++msgstr "" ++ ++msgid "Contact" ++msgstr "" ++ ++msgid "Contact information is incomplete. Please go to" ++msgstr "" ++ ++msgid "Coordinates" ++msgstr "" ++ ++msgid "Country code" ++msgstr "" ++ ++msgid "Default routes" ++msgstr "" ++ ++msgid "Disable default content" ++msgstr "" ++ ++msgid "Diversity is enabled for device" ++msgstr "" ++ ++msgid "E-Mail" ++msgstr "" ++ ++msgid "ESSID" ++msgstr "" ++ ++msgid "Edit index page" ++msgstr "" ++ ++msgid "Enable IPv6" ++msgstr "" ++ ++msgid "Enable a virtual access point (VAP) by default if possible." ++msgstr "" ++ ++msgid "Error" ++msgstr "" ++ ++msgid "Find your coordinates with OpenStreetMap" ++msgstr "" ++ ++msgid "Freifunk" ++msgstr "" ++ ++msgid "Freifunk Overview" ++msgstr "" ++ ++msgid "Freifunk Remote Update" ++msgstr "" ++ ++msgid "Gateway" ++msgstr "" ++ ++msgid "Go to" ++msgstr "" ++ ++msgid "Good (2 < ETX < 4)" ++msgstr "" ++ ++msgid "Green" ++msgstr "" ++ ++msgid "Hello and welcome in the network of" ++msgstr "" ++ ++msgid "Hide OpenStreetMap" ++msgstr "" ++ ++msgid "Homepage" ++msgstr "" ++ ++msgid "Hostname" ++msgstr "" ++ ++msgid "IPv6 Config" ++msgstr "" ++ ++msgid "IPv6 Prefix" ++msgstr "" ++ ++msgid "IPv6 network in CIDR notation." ++msgstr "" ++ ++msgid "If selected then the default content element is not shown." ++msgstr "" ++ ++msgid "If you are interested in our project then contact the local community" ++msgstr "" ++ ++msgid "Index Page" ++msgstr "" ++ ++msgid "Interface" ++msgstr "" ++ ++msgid "" ++"Internet access depends on technical and organisational conditions and may " ++"or may not work for you." ++msgstr "" ++ ++msgid "It is operated by" ++msgstr "" ++ ++msgid "Keep configuration" ++msgstr "" ++ ++msgid "Latitude" ++msgstr "" ++ ++msgid "Legend" ++msgstr "" ++ ++msgid "Load" ++msgstr "" ++ ++msgid "Local Time" ++msgstr "" ++ ++msgid "Location" ++msgstr "" ++ ++msgid "Longitude" ++msgstr "" ++ ++msgid "Map" ++msgstr "" ++ ++msgid "Map Error" ++msgstr "" ++ ++msgid "Memory" ++msgstr "" ++ ++msgid "Mesh prefix" ++msgstr "" ++ ++msgid "Metric" ++msgstr "" ++ ++msgid "Mode" ++msgstr "" ++ ++msgid "Network" ++msgstr "" ++ ++msgid "Network for client DHCP addresses" ++msgstr "" ++ ++msgid "Nickname" ++msgstr "" ++ ++msgid "No default routes known." ++msgstr "" ++ ++msgid "Notice" ++msgstr "" ++ ++msgid "OLSR" ++msgstr "" ++ ++msgid "Operator" ++msgstr "" ++ ++msgid "Orange" ++msgstr "" ++ ++msgid "Overview" ++msgstr "" ++ ++msgid "Package libiwinfo required!" ++msgstr "" ++ ++msgid "Phone" ++msgstr "" ++ ++msgid "Please fill in your contact details below." ++msgstr "" ++ ++msgid "Please set your contact information" ++msgstr "" ++ ++msgid "Power" ++msgstr "" ++ ++msgid "Processor" ++msgstr "" ++ ++msgid "Profile" ++msgstr "" ++ ++msgid "Profile (Expert)" ++msgstr "" ++ ++msgid "Realname" ++msgstr "" ++ ++msgid "Red" ++msgstr "" ++ ++msgid "SSID" ++msgstr "" ++ ++msgid "" ++"Select your location with a mouse click on the map. The map will only show " ++"up if you are connected to the Internet." ++msgstr "" ++ ++msgid "Show OpenStreetMap" ++msgstr "" ++ ++msgid "Show on map" ++msgstr "" ++ ++msgid "Signal" ++msgstr "" ++ ++msgid "Splash" ++msgstr "" ++ ++msgid "Start Upgrade" ++msgstr "" ++ ++msgid "Statistics" ++msgstr "" ++ ++msgid "Status" ++msgstr "" ++ ++msgid "Still usable (4 < ETX < 10)" ++msgstr "" ++ ++msgid "System" ++msgstr "" ++ ++msgid "TX" ++msgstr "" ++ ++msgid "" ++"The libiwinfo package is not installed. You must install this " ++"component for working wireless configuration!" ++msgstr "" ++ ++msgid "" ++"The OLSRd service is not configured to capture position data from the " ++"network.
    Please make sure that the nameservice plugin is properly " ++"configured and that the latlon_file option is enabled." ++msgstr "" ++ ++msgid "The installed firmware is the most recent version." ++msgstr "" ++ ++msgid "" ++"These are the basic settings for your local wireless community. These " ++"settings define the default values for the wizard and DO NOT affect the " ++"actual configuration of the router." ++msgstr "" ++ ++msgid "These are the settings of your local community." ++msgstr "" ++ ++msgid "" ++"These pages will assist you in setting up your router for Freifunk or " ++"similar wireless community networks." ++msgstr "" ++ ++msgid "This is the access point" ++msgstr "" ++ ++msgid "Update Settings" ++msgstr "" ++ ++msgid "Update available!" ++msgstr "" ++ ++msgid "Uptime" ++msgstr "" ++ ++msgid "VAP" ++msgstr "" ++ ++msgid "Verify downloaded images" ++msgstr "" ++ ++msgid "Very good (ETX < 2)" ++msgstr "" ++ ++msgid "" ++"We are an initiative to establish a free, independent and open wireless mesh " ++"network." ++msgstr "" ++ ++msgid "Wireless Overview" ++msgstr "" ++ ++msgid "Yellow" ++msgstr "" ++ ++msgid "" ++"You can display additional content on the public index page by inserting " ++"valid XHTML in the form below.
    Headlines should be enclosed between <" ++"h2> and </h2>." ++msgstr "" ++ ++msgid "" ++"You can find further information about the global Freifunk initiative at" ++msgstr "" ++ ++msgid "You can manually edit the selected community profile here." ++msgstr "" ++ ++msgid "" ++"You need to select a profile before you can edit it. To select a profile go " ++"to" ++msgstr "" ++ ++msgid "and fill out all required fields." ++msgstr "" ++ ++msgid "buffered" ++msgstr "" ++ ++msgid "cached" ++msgstr "" ++ ++msgid "e.g." ++msgstr "" ++ ++msgid "free" ++msgstr "" ++ ++msgid "to disable it." ++msgstr "" ++ ++msgid "used" ++msgstr "" ++ ++msgid "wireless settings" ++msgstr "" +diff --git a/feeds/luci/modules/luci-mod-freifunk/po/he/freifunk.po b/feeds/luci/modules/luci-mod-freifunk/po/he/freifunk.po +new file mode 100644 +index 0000000..3dfdefd +--- /dev/null ++++ b/feeds/luci/modules/luci-mod-freifunk/po/he/freifunk.po +@@ -0,0 +1,394 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"PO-Revision-Date: 2013-01-22 02:48+0200\n" ++"Last-Translator: citizen.amitai \n" ++"Language-Team: none\n" ++"Language: he\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n != 1);\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "BSSID" ++msgstr "BSSID" ++ ++msgid "Bad (ETX > 10)" ++msgstr "חלש" ++ ++msgid "Basic Settings" ++msgstr "הגדרות בסיס" ++ ++msgid "Basic settings" ++msgstr "הגדרות בסיס" ++ ++msgid "Basic settings are incomplete. Please go to" ++msgstr "×œ× ×¡×™×™×ž×ª להגדיר ×ת הגדרות הבסיס. תחזור ל" ++ ++msgid "Basic system settings" ++msgstr "הגדרות מערכת" ++ ++msgid "Bitrate" ++msgstr "קצב העברה" ++ ++msgid "Channel" ++msgstr "ערוץ" ++ ++msgid "Check for new firmware versions and perform automatic updates." ++msgstr "בדוק ×× ×§×™×™× ×’×¨×¡×ª חומרה חדשה ובצע עדכון ×וטומטי" ++ ++msgid "Client network size" ++msgstr "גודל הרשת" ++ ++msgid "Community" ++msgstr "קהילה" ++ ++msgid "Community profile" ++msgstr "פרופיל הקהילה" ++ ++msgid "Community settings" ++msgstr "הגדרות קהילה" ++ ++msgid "Confirm Upgrade" ++msgstr "×שר שדרוג" ++ ++msgid "Contact" ++msgstr "צור קשר" ++ ++msgid "Contact information is incomplete. Please go to" ++msgstr "" ++ ++msgid "Coordinates" ++msgstr "" ++ ++msgid "Country code" ++msgstr "קוד מדינה" ++ ++msgid "Default routes" ++msgstr "" ++ ++msgid "Disable default content" ++msgstr "" ++ ++msgid "Diversity is enabled for device" ++msgstr "" ++ ++msgid "E-Mail" ++msgstr "×ימייל" ++ ++msgid "ESSID" ++msgstr "ESSID" ++ ++msgid "Edit index page" ++msgstr "ערוך דף ×ינדקס" ++ ++msgid "Enable IPv6" ++msgstr "" ++ ++msgid "Enable a virtual access point (VAP) by default if possible." ++msgstr "" ++ ++msgid "Error" ++msgstr "שגי××”" ++ ++msgid "Find your coordinates with OpenStreetMap" ++msgstr "×ž×¦× ×ת ×”×ž×™×§×•× ×©×œ×š ×¢× OpenStreetMap" ++ ++msgid "Freifunk" ++msgstr "×ריג" ++ ++msgid "Freifunk Overview" ++msgstr "סקירה כללית על ×ריג" ++ ++msgid "Freifunk Remote Update" ++msgstr "עדכון מרחוק " ++ ++msgid "Gateway" ++msgstr "שער" ++ ++msgid "Go to" ++msgstr "עבור ×ל" ++ ++msgid "Good (2 < ETX < 4)" ++msgstr "טוב" ++ ++msgid "Green" ++msgstr "ירוק" ++ ++msgid "Hello and welcome in the network of" ++msgstr "×©×œ×•× ×•×‘×¨×•×š ×”×‘× ×œ×¨×©×ª " ++ ++msgid "Hide OpenStreetMap" ++msgstr "הסתר OpenStreetMap" ++ ++msgid "Homepage" ++msgstr "דף הבית" ++ ++msgid "Hostname" ++msgstr "×©× ×ž×—×©×‘" ++ ++msgid "IPv6 Config" ++msgstr "" ++ ++msgid "IPv6 Prefix" ++msgstr "" ++ ++msgid "IPv6 network in CIDR notation." ++msgstr "" ++ ++msgid "If selected then the default content element is not shown." ++msgstr "×× ×ž×¡×•×ž×Ÿ, תוכן ברירת המחדל ×œ× ×™×•×¤×™×¢" ++ ++msgid "If you are interested in our project then contact the local community" ++msgstr "×× ×”× ×›× ×ž×¢×•× ×™×™× ×™× ×‘×¤×¨×•×™×™×§×˜ שלנו ×× × ×¦×¨×• קשר ×¢× ×”×§×”×™×œ×” ב×זורכ×" ++ ++msgid "Index Page" ++msgstr "" ++ ++msgid "Interface" ++msgstr "ממשק" ++ ++msgid "" ++"Internet access depends on technical and organisational conditions and may " ++"or may not work for you." ++msgstr "" ++ ++msgid "It is operated by" ++msgstr "×–×” מופעל ×¢\"×™" ++ ++msgid "Keep configuration" ++msgstr "שמור הגדרות" ++ ++msgid "Latitude" ++msgstr "רוחב" ++ ++msgid "Legend" ++msgstr "" ++ ++msgid "Load" ++msgstr "טען" ++ ++msgid "Local Time" ++msgstr "זמן מקומי" ++ ++msgid "Location" ++msgstr "מיקו×" ++ ++msgid "Longitude" ++msgstr "×ורך" ++ ++msgid "Map" ++msgstr "מפה" ++ ++msgid "Map Error" ++msgstr "שגי×ת מפה" ++ ++msgid "Memory" ++msgstr "זכרון" ++ ++msgid "Mesh prefix" ++msgstr "" ++ ++msgid "Metric" ++msgstr "" ++ ++msgid "Mode" ++msgstr "מצב" ++ ++msgid "Network" ++msgstr "רשת" ++ ++msgid "Network for client DHCP addresses" ++msgstr "" ++ ++msgid "Nickname" ++msgstr "כינוי" ++ ++msgid "No default routes known." ++msgstr "" ++ ++msgid "Notice" ++msgstr "" ++ ++msgid "OLSR" ++msgstr "" ++ ++msgid "Operator" ++msgstr "" ++ ++msgid "Orange" ++msgstr "" ++ ++msgid "Overview" ++msgstr "סקירה" ++ ++msgid "Package libiwinfo required!" ++msgstr "" ++ ++msgid "Phone" ++msgstr "" ++ ++msgid "Please fill in your contact details below." ++msgstr "" ++ ++msgid "Please set your contact information" ++msgstr "×× × ×”×–×™× ×• פרטי יצירת קשר" ++ ++msgid "Power" ++msgstr "×›×—" ++ ++msgid "Processor" ++msgstr "מעבד" ++ ++msgid "Profile" ++msgstr "" ++ ++msgid "Profile (Expert)" ++msgstr "פרופיל (מומחה)" ++ ++msgid "Realname" ++msgstr "×©× ×מיתי" ++ ++msgid "Red" ++msgstr "×דו×" ++ ++msgid "SSID" ++msgstr "SSID" ++ ++msgid "" ++"Select your location with a mouse click on the map. The map will only show " ++"up if you are connected to the Internet." ++msgstr "" ++ ++msgid "Show OpenStreetMap" ++msgstr "פתח OpenStreetMap" ++ ++msgid "Show on map" ++msgstr "הצג על גבי מפה" ++ ++msgid "Signal" ++msgstr "×ות" ++ ++msgid "Splash" ++msgstr "" ++ ++msgid "Start Upgrade" ++msgstr "התחל שדרוג" ++ ++msgid "Statistics" ++msgstr "סטטיסטיקה" ++ ++msgid "Status" ++msgstr "סטטוס" ++ ++msgid "Still usable (4 < ETX < 10)" ++msgstr "מתפקד" ++ ++msgid "System" ++msgstr "מערכת" ++ ++msgid "TX" ++msgstr "TX" ++ ++msgid "" ++"The libiwinfo package is not installed. You must install this " ++"component for working wireless configuration!" ++msgstr "" ++ ++msgid "" ++"The OLSRd service is not configured to capture position data from the " ++"network.
    Please make sure that the nameservice plugin is properly " ++"configured and that the latlon_file option is enabled." ++msgstr "" ++ ++msgid "The installed firmware is the most recent version." ++msgstr "" ++ ++msgid "" ++"These are the basic settings for your local wireless community. These " ++"settings define the default values for the wizard and DO NOT affect the " ++"actual configuration of the router." ++msgstr "" ++ ++msgid "These are the settings of your local community." ++msgstr "" ++ ++msgid "" ++"These pages will assist you in setting up your router for Freifunk or " ++"similar wireless community networks." ++msgstr "" ++ ++msgid "This is the access point" ++msgstr "" ++ ++msgid "Update Settings" ++msgstr "" ++ ++msgid "Update available!" ++msgstr "" ++ ++msgid "Uptime" ++msgstr "" ++ ++msgid "VAP" ++msgstr "" ++ ++msgid "Verify downloaded images" ++msgstr "" ++ ++msgid "Very good (ETX < 2)" ++msgstr "" ++ ++msgid "" ++"We are an initiative to establish a free, independent and open wireless mesh " ++"network." ++msgstr "יוזמה לביסוס רשת ×ריג ×ל-חוטית שתהיה חינמית, נגישה, ועצמ×ית" ++ ++msgid "Wireless Overview" ++msgstr "סקירת הרשת ×”×לחוטית" ++ ++msgid "Yellow" ++msgstr "צהוב" ++ ++msgid "" ++"You can display additional content on the public index page by inserting " ++"valid XHTML in the form below.
    Headlines should be enclosed between <" ++"h2> and </h2>." ++msgstr "" ++ ++msgid "" ++"You can find further information about the global Freifunk initiative at" ++msgstr "" ++ ++msgid "You can manually edit the selected community profile here." ++msgstr "" ++ ++msgid "" ++"You need to select a profile before you can edit it. To select a profile go " ++"to" ++msgstr "" ++ ++msgid "and fill out all required fields." ++msgstr "" ++ ++msgid "buffered" ++msgstr "" ++ ++msgid "cached" ++msgstr "" ++ ++msgid "e.g." ++msgstr "" ++ ++msgid "free" ++msgstr "" ++ ++msgid "to disable it." ++msgstr "" ++ ++msgid "used" ++msgstr "" ++ ++msgid "wireless settings" ++msgstr "" +diff --git a/feeds/luci/modules/luci-mod-freifunk/po/hu/freifunk.po b/feeds/luci/modules/luci-mod-freifunk/po/hu/freifunk.po +new file mode 100644 +index 0000000..71829ef +--- /dev/null ++++ b/feeds/luci/modules/luci-mod-freifunk/po/hu/freifunk.po +@@ -0,0 +1,392 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Last-Translator: Automatically generated\n" ++"Language-Team: none\n" ++"Language: \n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n != 1);\n" ++ ++msgid "BSSID" ++msgstr "" ++ ++msgid "Bad (ETX > 10)" ++msgstr "" ++ ++msgid "Basic Settings" ++msgstr "" ++ ++msgid "Basic settings" ++msgstr "" ++ ++msgid "Basic settings are incomplete. Please go to" ++msgstr "" ++ ++msgid "Basic system settings" ++msgstr "" ++ ++msgid "Bitrate" ++msgstr "" ++ ++msgid "Channel" ++msgstr "" ++ ++msgid "Check for new firmware versions and perform automatic updates." ++msgstr "" ++ ++msgid "Client network size" ++msgstr "" ++ ++msgid "Community" ++msgstr "" ++ ++msgid "Community profile" ++msgstr "" ++ ++msgid "Community settings" ++msgstr "" ++ ++msgid "Confirm Upgrade" ++msgstr "" ++ ++msgid "Contact" ++msgstr "" ++ ++msgid "Contact information is incomplete. Please go to" ++msgstr "" ++ ++msgid "Coordinates" ++msgstr "" ++ ++msgid "Country code" ++msgstr "" ++ ++msgid "Default routes" ++msgstr "" ++ ++msgid "Disable default content" ++msgstr "" ++ ++msgid "Diversity is enabled for device" ++msgstr "" ++ ++msgid "E-Mail" ++msgstr "" ++ ++msgid "ESSID" ++msgstr "" ++ ++msgid "Edit index page" ++msgstr "" ++ ++msgid "Enable IPv6" ++msgstr "" ++ ++msgid "Enable a virtual access point (VAP) by default if possible." ++msgstr "" ++ ++msgid "Error" ++msgstr "" ++ ++msgid "Find your coordinates with OpenStreetMap" ++msgstr "" ++ ++msgid "Freifunk" ++msgstr "" ++ ++msgid "Freifunk Overview" ++msgstr "" ++ ++msgid "Freifunk Remote Update" ++msgstr "" ++ ++msgid "Gateway" ++msgstr "" ++ ++msgid "Go to" ++msgstr "" ++ ++msgid "Good (2 < ETX < 4)" ++msgstr "" ++ ++msgid "Green" ++msgstr "" ++ ++msgid "Hello and welcome in the network of" ++msgstr "" ++ ++msgid "Hide OpenStreetMap" ++msgstr "" ++ ++msgid "Homepage" ++msgstr "" ++ ++msgid "Hostname" ++msgstr "" ++ ++msgid "IPv6 Config" ++msgstr "" ++ ++msgid "IPv6 Prefix" ++msgstr "" ++ ++msgid "IPv6 network in CIDR notation." ++msgstr "" ++ ++msgid "If selected then the default content element is not shown." ++msgstr "" ++ ++msgid "If you are interested in our project then contact the local community" ++msgstr "" ++ ++msgid "Index Page" ++msgstr "" ++ ++msgid "Interface" ++msgstr "" ++ ++msgid "" ++"Internet access depends on technical and organisational conditions and may " ++"or may not work for you." ++msgstr "" ++ ++msgid "It is operated by" ++msgstr "" ++ ++msgid "Keep configuration" ++msgstr "" ++ ++msgid "Latitude" ++msgstr "" ++ ++msgid "Legend" ++msgstr "" ++ ++msgid "Load" ++msgstr "" ++ ++msgid "Local Time" ++msgstr "" ++ ++msgid "Location" ++msgstr "" ++ ++msgid "Longitude" ++msgstr "" ++ ++msgid "Map" ++msgstr "" ++ ++msgid "Map Error" ++msgstr "" ++ ++msgid "Memory" ++msgstr "" ++ ++msgid "Mesh prefix" ++msgstr "" ++ ++msgid "Metric" ++msgstr "" ++ ++msgid "Mode" ++msgstr "" ++ ++msgid "Network" ++msgstr "" ++ ++msgid "Network for client DHCP addresses" ++msgstr "" ++ ++msgid "Nickname" ++msgstr "" ++ ++msgid "No default routes known." ++msgstr "" ++ ++msgid "Notice" ++msgstr "" ++ ++msgid "OLSR" ++msgstr "" ++ ++msgid "Operator" ++msgstr "" ++ ++msgid "Orange" ++msgstr "" ++ ++msgid "Overview" ++msgstr "" ++ ++msgid "Package libiwinfo required!" ++msgstr "" ++ ++msgid "Phone" ++msgstr "" ++ ++msgid "Please fill in your contact details below." ++msgstr "" ++ ++msgid "Please set your contact information" ++msgstr "" ++ ++msgid "Power" ++msgstr "" ++ ++msgid "Processor" ++msgstr "" ++ ++msgid "Profile" ++msgstr "" ++ ++msgid "Profile (Expert)" ++msgstr "" ++ ++msgid "Realname" ++msgstr "" ++ ++msgid "Red" ++msgstr "" ++ ++msgid "SSID" ++msgstr "" ++ ++msgid "" ++"Select your location with a mouse click on the map. The map will only show " ++"up if you are connected to the Internet." ++msgstr "" ++ ++msgid "Show OpenStreetMap" ++msgstr "" ++ ++msgid "Show on map" ++msgstr "" ++ ++msgid "Signal" ++msgstr "" ++ ++msgid "Splash" ++msgstr "" ++ ++msgid "Start Upgrade" ++msgstr "" ++ ++msgid "Statistics" ++msgstr "" ++ ++msgid "Status" ++msgstr "" ++ ++msgid "Still usable (4 < ETX < 10)" ++msgstr "" ++ ++msgid "System" ++msgstr "" ++ ++msgid "TX" ++msgstr "" ++ ++msgid "" ++"The libiwinfo package is not installed. You must install this " ++"component for working wireless configuration!" ++msgstr "" ++ ++msgid "" ++"The OLSRd service is not configured to capture position data from the " ++"network.
    Please make sure that the nameservice plugin is properly " ++"configured and that the latlon_file option is enabled." ++msgstr "" ++ ++msgid "The installed firmware is the most recent version." ++msgstr "" ++ ++msgid "" ++"These are the basic settings for your local wireless community. These " ++"settings define the default values for the wizard and DO NOT affect the " ++"actual configuration of the router." ++msgstr "" ++ ++msgid "These are the settings of your local community." ++msgstr "" ++ ++msgid "" ++"These pages will assist you in setting up your router for Freifunk or " ++"similar wireless community networks." ++msgstr "" ++ ++msgid "This is the access point" ++msgstr "" ++ ++msgid "Update Settings" ++msgstr "" ++ ++msgid "Update available!" ++msgstr "" ++ ++msgid "Uptime" ++msgstr "" ++ ++msgid "VAP" ++msgstr "" ++ ++msgid "Verify downloaded images" ++msgstr "" ++ ++msgid "Very good (ETX < 2)" ++msgstr "" ++ ++msgid "" ++"We are an initiative to establish a free, independent and open wireless mesh " ++"network." ++msgstr "" ++ ++msgid "Wireless Overview" ++msgstr "" ++ ++msgid "Yellow" ++msgstr "" ++ ++msgid "" ++"You can display additional content on the public index page by inserting " ++"valid XHTML in the form below.
    Headlines should be enclosed between <" ++"h2> and </h2>." ++msgstr "" ++ ++msgid "" ++"You can find further information about the global Freifunk initiative at" ++msgstr "" ++ ++msgid "You can manually edit the selected community profile here." ++msgstr "" ++ ++msgid "" ++"You need to select a profile before you can edit it. To select a profile go " ++"to" ++msgstr "" ++ ++msgid "and fill out all required fields." ++msgstr "" ++ ++msgid "buffered" ++msgstr "" ++ ++msgid "cached" ++msgstr "" ++ ++msgid "e.g." ++msgstr "" ++ ++msgid "free" ++msgstr "" ++ ++msgid "to disable it." ++msgstr "" ++ ++msgid "used" ++msgstr "" ++ ++msgid "wireless settings" ++msgstr "" +diff --git a/feeds/luci/modules/luci-mod-freifunk/po/it/freifunk.po b/feeds/luci/modules/luci-mod-freifunk/po/it/freifunk.po +new file mode 100644 +index 0000000..26610f7 +--- /dev/null ++++ b/feeds/luci/modules/luci-mod-freifunk/po/it/freifunk.po +@@ -0,0 +1,422 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Report-Msgid-Bugs-To: \n" ++"POT-Creation-Date: 2009-06-10 03:40+0200\n" ++"PO-Revision-Date: 2014-07-19 16:27+0200\n" ++"Last-Translator: clagir \n" ++"Language-Team: LANGUAGE \n" ++"Language: it\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n != 1);\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "BSSID" ++msgstr "BSSID" ++ ++msgid "Bad (ETX > 10)" ++msgstr "Difettoso (ETX > 10)" ++ ++msgid "Basic Settings" ++msgstr "Impostazioni Base" ++ ++msgid "Basic settings" ++msgstr "Impostazioni Base" ++ ++msgid "Basic settings are incomplete. Please go to" ++msgstr "Le impostazioni base sono incomplete. Si prega di andare a" ++ ++msgid "Basic system settings" ++msgstr "Impostazioni Base del Sistema" ++ ++msgid "Bitrate" ++msgstr "Bitrate" ++ ++msgid "Channel" ++msgstr "Canale" ++ ++msgid "Check for new firmware versions and perform automatic updates." ++msgstr "" ++"Verificare la presenza di nuove versioni del firmware ed eseguire gli " ++"aggiornamenti automatici." ++ ++msgid "Client network size" ++msgstr "Dimensione Rete Client" ++ ++msgid "Community" ++msgstr "Comunità" ++ ++msgid "Community profile" ++msgstr "Profilo Comunità" ++ ++msgid "Community settings" ++msgstr "Impostazioni Comunità" ++ ++msgid "Confirm Upgrade" ++msgstr "Conferma Aggiornamento" ++ ++msgid "Contact" ++msgstr "Contatto" ++ ++msgid "Contact information is incomplete. Please go to" ++msgstr "Le informazioni di contatto sono incomplete. Si prega di andare a" ++ ++msgid "Coordinates" ++msgstr "Coordinate" ++ ++msgid "Country code" ++msgstr "Codice Nazione" ++ ++msgid "Default routes" ++msgstr "Instradamenti Predefiniti" ++ ++msgid "Disable default content" ++msgstr "Disattivare contenuto predefinito" ++ ++msgid "Diversity is enabled for device" ++msgstr "La diversità è abilitata per il dispositivo" ++ ++msgid "E-Mail" ++msgstr "E-Mail" ++ ++msgid "ESSID" ++msgstr "ESSID" ++ ++msgid "Edit index page" ++msgstr "Modifica indice pagina" ++ ++msgid "Enable IPv6" ++msgstr "Attiva IPv6" ++ ++msgid "Enable a virtual access point (VAP) by default if possible." ++msgstr "Attiva un access point virtuale (VAP) di default se possibile" ++ ++msgid "Error" ++msgstr "Errore" ++ ++msgid "Find your coordinates with OpenStreetMap" ++msgstr "Trova le coordinate con OpenStreetMap" ++ ++msgid "Freifunk" ++msgstr "Freifunk" ++ ++msgid "Freifunk Overview" ++msgstr "Panoramica Freifunk" ++ ++msgid "Freifunk Remote Update" ++msgstr "Aggiornamento Remoto Freifunk" ++ ++msgid "Gateway" ++msgstr "Gateway" ++ ++msgid "Go to" ++msgstr "Vai a" ++ ++msgid "Good (2 < ETX < 4)" ++msgstr "Buono (2 < ETX < 4)" ++ ++msgid "Green" ++msgstr "Verde" ++ ++msgid "Hello and welcome in the network of" ++msgstr "Ciao e benvenuto nella rete di" ++ ++msgid "Hide OpenStreetMap" ++msgstr "Nascondi OpenStreetMap" ++ ++msgid "Homepage" ++msgstr "Homepage" ++ ++msgid "Hostname" ++msgstr "Nome Host" ++ ++msgid "IPv6 Config" ++msgstr "Configura IPv6" ++ ++msgid "IPv6 Prefix" ++msgstr "Prefisso IPv6" ++ ++msgid "IPv6 network in CIDR notation." ++msgstr "Rete IPv6 in notazione CIDR." ++ ++msgid "If selected then the default content element is not shown." ++msgstr "" ++"Se selezionata, l'elemento di contenuto predefinito non viene visualizzato." ++ ++msgid "If you are interested in our project then contact the local community" ++msgstr "Se siete interessati al nostro progetto, contattare la comunità locale" ++ ++msgid "Index Page" ++msgstr "Indice Pagina" ++ ++msgid "Interface" ++msgstr "Interfaccia" ++ ++msgid "" ++"Internet access depends on technical and organisational conditions and may " ++"or may not work for you." ++msgstr "" ++"L'accesso a Internet dipende dalle condizioni tecniche e organizzative e può " ++"o non può funzionare per voi." ++ ++msgid "It is operated by" ++msgstr "E' gestito da" ++ ++msgid "Keep configuration" ++msgstr "Mantieni configurazione" ++ ++msgid "Latitude" ++msgstr "Latitudine" ++ ++msgid "Legend" ++msgstr "Legenda" ++ ++msgid "Load" ++msgstr "Carica" ++ ++msgid "Local Time" ++msgstr "Ora Locale" ++ ++msgid "Location" ++msgstr "Posizione" ++ ++msgid "Longitude" ++msgstr "Longitudine" ++ ++msgid "Map" ++msgstr "Mappa" ++ ++msgid "Map Error" ++msgstr "Errore Mappa" ++ ++msgid "Memory" ++msgstr "Memoria" ++ ++msgid "Mesh prefix" ++msgstr "Prefisso Rete" ++ ++msgid "Metric" ++msgstr "Metrica" ++ ++msgid "Mode" ++msgstr "Modalità" ++ ++msgid "Network" ++msgstr "Rete" ++ ++msgid "Network for client DHCP addresses" ++msgstr "Rete per indirizzi Client DHCP" ++ ++msgid "Nickname" ++msgstr "Nome Nick" ++ ++msgid "No default routes known." ++msgstr "Nessun instradamento predefinito conosciuto." ++ ++msgid "Notice" ++msgstr "Avviso" ++ ++msgid "OLSR" ++msgstr "OLSR" ++ ++msgid "Operator" ++msgstr "Operatore" ++ ++msgid "Orange" ++msgstr "Arancio" ++ ++msgid "Overview" ++msgstr "Panoramica" ++ ++msgid "Package libiwinfo required!" ++msgstr "Il pacchetto libiwinfo è richiesto!" ++ ++msgid "Phone" ++msgstr "Telefono" ++ ++msgid "Please fill in your contact details below." ++msgstr "Inserisci i tuoi dati di contatto qui sotto." ++ ++msgid "Please set your contact information" ++msgstr "Vi preghiamo di impostare le informazioni di contatto" ++ ++msgid "Power" ++msgstr "Potenza" ++ ++msgid "Processor" ++msgstr "Processore" ++ ++msgid "Profile" ++msgstr "Profilo" ++ ++msgid "Profile (Expert)" ++msgstr "Profilo (Esperto)" ++ ++msgid "Realname" ++msgstr "Nome Reale" ++ ++msgid "Red" ++msgstr "Rosso" ++ ++msgid "SSID" ++msgstr "SSID" ++ ++msgid "" ++"Select your location with a mouse click on the map. The map will only show " ++"up if you are connected to the Internet." ++msgstr "" ++"Selezionare la propria posizione con un clic del mouse sulla mappa. La mappa " ++"viene visualizzata solo se si è connessi a Internet." ++ ++msgid "Show OpenStreetMap" ++msgstr "Mostra OpenStreetMap" ++ ++msgid "Show on map" ++msgstr "Mostra sulla mappa" ++ ++msgid "Signal" ++msgstr "Segnale" ++ ++msgid "Splash" ++msgstr "Splash" ++ ++msgid "Start Upgrade" ++msgstr "Avvia Aggiornamento" ++ ++msgid "Statistics" ++msgstr "Statistiche" ++ ++msgid "Status" ++msgstr "Stato" ++ ++msgid "Still usable (4 < ETX < 10)" ++msgstr "Ancora utilizzabile (4 < ETX < 10)" ++ ++msgid "System" ++msgstr "Sistema" ++ ++msgid "TX" ++msgstr "TX" ++ ++msgid "" ++"The libiwinfo package is not installed. You must install this " ++"component for working wireless configuration!" ++msgstr "" ++"Il pacchetto libiwinfo non è installato. Si deve installare questo " ++"componente per usare di configurazione wireless!" ++ ++msgid "" ++"The OLSRd service is not configured to capture position data from the " ++"network.
    Please make sure that the nameservice plugin is properly " ++"configured and that the latlon_file option is enabled." ++msgstr "" ++"Il servizio OLSRd non è configurato per acquisire i dati di posizione della " ++"rete.
    Assicurarsi che il plugin nameservice sia configurato " ++"correttamente e che l'opzione latlon_file è abilitata." ++ ++msgid "The installed firmware is the most recent version." ++msgstr "Il firmware installato è la versione più recente." ++ ++msgid "" ++"These are the basic settings for your local wireless community. These " ++"settings define the default values for the wizard and DO NOT affect the " ++"actual configuration of the router." ++msgstr "" ++"Queste sono le impostazioni di base per la vostra comunità locale wireless. " ++"Queste impostazioni definiscono i valori predefiniti per la procedura " ++"guidata e non influenzano la configurazione attuale del router." ++ ++msgid "These are the settings of your local community." ++msgstr "Queste sono le impostazioni della vostra comunità locale." ++ ++msgid "" ++"These pages will assist you in setting up your router for Freifunk or " ++"similar wireless community networks." ++msgstr "" ++"Queste pagine vi aiuteranno a configurare il router per Freifunk o reti " ++"wireless della comunità simile." ++ ++msgid "This is the access point" ++msgstr "Questo è il punto di accesso" ++ ++msgid "Update Settings" ++msgstr "Aggiorna impostazioni" ++ ++msgid "Update available!" ++msgstr "Aggiornamento disponibile!" ++ ++msgid "Uptime" ++msgstr "Tempo di attività" ++ ++msgid "VAP" ++msgstr "VAP" ++ ++msgid "Verify downloaded images" ++msgstr "Verifica delle immagini scaricate" ++ ++msgid "Very good (ETX < 2)" ++msgstr "Molto buono (ETX < 2)" ++ ++msgid "" ++"We are an initiative to establish a free, independent and open wireless mesh " ++"network." ++msgstr "" ++"Siamo un'iniziativa per creare una rete libera, indipendente e aperto " ++"wireless mesh." ++ ++msgid "Wireless Overview" ++msgstr "Panoramica Wireless" ++ ++msgid "Yellow" ++msgstr "Giallo" ++ ++msgid "" ++"You can display additional content on the public index page by inserting " ++"valid XHTML in the form below.
    Headlines should be enclosed between <" ++"h2> and </h2>." ++msgstr "" ++"È possibile visualizzare contenuti aggiuntivi nella pagina indice pubblica " ++"inserendo XHTML valida nel modulo sottostante.
    I titoli dovrebbero " ++"essere racchiusi tra <h2> e </h2>." ++ ++msgid "" ++"You can find further information about the global Freifunk initiative at" ++msgstr "" ++"È possibile trovare ulteriori informazioni sull'iniziativa Freifunk globale a" ++ ++msgid "You can manually edit the selected community profile here." ++msgstr "" ++"È possibile modificare manualmente il profilo selezionato della comunità qui" ++ ++msgid "" ++"You need to select a profile before you can edit it. To select a profile go " ++"to" ++msgstr "" ++"È necessario selezionare un profilo prima di poterlo modificare. Per " ++"selezionare un profilo andare a" ++ ++msgid "and fill out all required fields." ++msgstr "e compilare tutti i campi richiesti." ++ ++msgid "buffered" ++msgstr "buffered" ++ ++msgid "cached" ++msgstr "in memoria cache" ++ ++msgid "e.g." ++msgstr "es." ++ ++msgid "free" ++msgstr "libero" ++ ++msgid "to disable it." ++msgstr "per disattivarlo." ++ ++msgid "used" ++msgstr "usato" ++ ++msgid "wireless settings" ++msgstr "Impostazioni Wireless" +diff --git a/feeds/luci/modules/luci-mod-freifunk/po/ja/freifunk.po b/feeds/luci/modules/luci-mod-freifunk/po/ja/freifunk.po +new file mode 100644 +index 0000000..028a2ce +--- /dev/null ++++ b/feeds/luci/modules/luci-mod-freifunk/po/ja/freifunk.po +@@ -0,0 +1,395 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Report-Msgid-Bugs-To: \n" ++"POT-Creation-Date: 2009-05-19 19:36+0200\n" ++"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" ++"Last-Translator: FULL NAME \n" ++"Language-Team: LANGUAGE \n" ++"Language: \n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"X-Generator: Translate Toolkit 1.1.1\n" ++ ++msgid "BSSID" ++msgstr "" ++ ++msgid "Bad (ETX > 10)" ++msgstr "" ++ ++msgid "Basic Settings" ++msgstr "" ++ ++msgid "Basic settings" ++msgstr "" ++ ++msgid "Basic settings are incomplete. Please go to" ++msgstr "" ++ ++msgid "Basic system settings" ++msgstr "" ++ ++msgid "Bitrate" ++msgstr "" ++ ++msgid "Channel" ++msgstr "" ++ ++msgid "Check for new firmware versions and perform automatic updates." ++msgstr "" ++ ++msgid "Client network size" ++msgstr "" ++ ++msgid "Community" ++msgstr "" ++ ++msgid "Community profile" ++msgstr "" ++ ++msgid "Community settings" ++msgstr "" ++ ++msgid "Confirm Upgrade" ++msgstr "" ++ ++msgid "Contact" ++msgstr "" ++ ++msgid "Contact information is incomplete. Please go to" ++msgstr "" ++ ++msgid "Coordinates" ++msgstr "" ++ ++msgid "Country code" ++msgstr "" ++ ++msgid "Default routes" ++msgstr "" ++ ++msgid "Disable default content" ++msgstr "" ++ ++msgid "Diversity is enabled for device" ++msgstr "" ++ ++msgid "E-Mail" ++msgstr "" ++ ++msgid "ESSID" ++msgstr "" ++ ++msgid "Edit index page" ++msgstr "" ++ ++msgid "Enable IPv6" ++msgstr "" ++ ++msgid "Enable a virtual access point (VAP) by default if possible." ++msgstr "" ++ ++msgid "Error" ++msgstr "" ++ ++msgid "Find your coordinates with OpenStreetMap" ++msgstr "" ++ ++msgid "Freifunk" ++msgstr "" ++ ++msgid "Freifunk Overview" ++msgstr "" ++ ++msgid "Freifunk Remote Update" ++msgstr "" ++ ++msgid "Gateway" ++msgstr "" ++ ++msgid "Go to" ++msgstr "" ++ ++msgid "Good (2 < ETX < 4)" ++msgstr "" ++ ++msgid "Green" ++msgstr "" ++ ++msgid "Hello and welcome in the network of" ++msgstr "" ++ ++msgid "Hide OpenStreetMap" ++msgstr "" ++ ++msgid "Homepage" ++msgstr "" ++ ++msgid "Hostname" ++msgstr "" ++ ++msgid "IPv6 Config" ++msgstr "" ++ ++msgid "IPv6 Prefix" ++msgstr "" ++ ++msgid "IPv6 network in CIDR notation." ++msgstr "" ++ ++msgid "If selected then the default content element is not shown." ++msgstr "" ++ ++msgid "If you are interested in our project then contact the local community" ++msgstr "" ++ ++msgid "Index Page" ++msgstr "" ++ ++msgid "Interface" ++msgstr "" ++ ++msgid "" ++"Internet access depends on technical and organisational conditions and may " ++"or may not work for you." ++msgstr "" ++ ++msgid "It is operated by" ++msgstr "" ++ ++msgid "Keep configuration" ++msgstr "" ++ ++msgid "Latitude" ++msgstr "" ++ ++msgid "Legend" ++msgstr "" ++ ++msgid "Load" ++msgstr "" ++ ++msgid "Local Time" ++msgstr "" ++ ++msgid "Location" ++msgstr "" ++ ++msgid "Longitude" ++msgstr "" ++ ++msgid "Map" ++msgstr "" ++ ++msgid "Map Error" ++msgstr "" ++ ++msgid "Memory" ++msgstr "" ++ ++msgid "Mesh prefix" ++msgstr "" ++ ++msgid "Metric" ++msgstr "" ++ ++msgid "Mode" ++msgstr "" ++ ++msgid "Network" ++msgstr "" ++ ++msgid "Network for client DHCP addresses" ++msgstr "" ++ ++msgid "Nickname" ++msgstr "" ++ ++msgid "No default routes known." ++msgstr "" ++ ++msgid "Notice" ++msgstr "" ++ ++msgid "OLSR" ++msgstr "" ++ ++msgid "Operator" ++msgstr "" ++ ++msgid "Orange" ++msgstr "" ++ ++msgid "Overview" ++msgstr "" ++ ++msgid "Package libiwinfo required!" ++msgstr "" ++ ++msgid "Phone" ++msgstr "" ++ ++msgid "Please fill in your contact details below." ++msgstr "" ++ ++msgid "Please set your contact information" ++msgstr "" ++ ++msgid "Power" ++msgstr "" ++ ++msgid "Processor" ++msgstr "" ++ ++msgid "Profile" ++msgstr "" ++ ++msgid "Profile (Expert)" ++msgstr "" ++ ++msgid "Realname" ++msgstr "" ++ ++msgid "Red" ++msgstr "" ++ ++msgid "SSID" ++msgstr "" ++ ++msgid "" ++"Select your location with a mouse click on the map. The map will only show " ++"up if you are connected to the Internet." ++msgstr "" ++ ++msgid "Show OpenStreetMap" ++msgstr "" ++ ++msgid "Show on map" ++msgstr "" ++ ++msgid "Signal" ++msgstr "" ++ ++msgid "Splash" ++msgstr "" ++ ++msgid "Start Upgrade" ++msgstr "" ++ ++msgid "Statistics" ++msgstr "" ++ ++msgid "Status" ++msgstr "" ++ ++msgid "Still usable (4 < ETX < 10)" ++msgstr "" ++ ++msgid "System" ++msgstr "" ++ ++msgid "TX" ++msgstr "" ++ ++msgid "" ++"The libiwinfo package is not installed. You must install this " ++"component for working wireless configuration!" ++msgstr "" ++ ++msgid "" ++"The OLSRd service is not configured to capture position data from the " ++"network.
    Please make sure that the nameservice plugin is properly " ++"configured and that the latlon_file option is enabled." ++msgstr "" ++ ++msgid "The installed firmware is the most recent version." ++msgstr "" ++ ++msgid "" ++"These are the basic settings for your local wireless community. These " ++"settings define the default values for the wizard and DO NOT affect the " ++"actual configuration of the router." ++msgstr "" ++ ++msgid "These are the settings of your local community." ++msgstr "" ++ ++msgid "" ++"These pages will assist you in setting up your router for Freifunk or " ++"similar wireless community networks." ++msgstr "" ++ ++msgid "This is the access point" ++msgstr "" ++ ++msgid "Update Settings" ++msgstr "" ++ ++msgid "Update available!" ++msgstr "" ++ ++msgid "Uptime" ++msgstr "" ++ ++msgid "VAP" ++msgstr "" ++ ++msgid "Verify downloaded images" ++msgstr "" ++ ++msgid "Very good (ETX < 2)" ++msgstr "" ++ ++msgid "" ++"We are an initiative to establish a free, independent and open wireless mesh " ++"network." ++msgstr "" ++ ++msgid "Wireless Overview" ++msgstr "" ++ ++msgid "Yellow" ++msgstr "" ++ ++msgid "" ++"You can display additional content on the public index page by inserting " ++"valid XHTML in the form below.
    Headlines should be enclosed between <" ++"h2> and </h2>." ++msgstr "" ++ ++msgid "" ++"You can find further information about the global Freifunk initiative at" ++msgstr "" ++ ++msgid "You can manually edit the selected community profile here." ++msgstr "" ++ ++msgid "" ++"You need to select a profile before you can edit it. To select a profile go " ++"to" ++msgstr "" ++ ++msgid "and fill out all required fields." ++msgstr "" ++ ++msgid "buffered" ++msgstr "" ++ ++msgid "cached" ++msgstr "" ++ ++msgid "e.g." ++msgstr "" ++ ++msgid "free" ++msgstr "" ++ ++msgid "to disable it." ++msgstr "" ++ ++msgid "used" ++msgstr "" ++ ++msgid "wireless settings" ++msgstr "" +diff --git a/feeds/luci/modules/luci-mod-freifunk/po/ms/freifunk.po b/feeds/luci/modules/luci-mod-freifunk/po/ms/freifunk.po +new file mode 100644 +index 0000000..262991d +--- /dev/null ++++ b/feeds/luci/modules/luci-mod-freifunk/po/ms/freifunk.po +@@ -0,0 +1,391 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Last-Translator: Automatically generated\n" ++"Language-Team: none\n" ++"Language: \n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++ ++msgid "BSSID" ++msgstr "" ++ ++msgid "Bad (ETX > 10)" ++msgstr "" ++ ++msgid "Basic Settings" ++msgstr "" ++ ++msgid "Basic settings" ++msgstr "" ++ ++msgid "Basic settings are incomplete. Please go to" ++msgstr "" ++ ++msgid "Basic system settings" ++msgstr "" ++ ++msgid "Bitrate" ++msgstr "" ++ ++msgid "Channel" ++msgstr "" ++ ++msgid "Check for new firmware versions and perform automatic updates." ++msgstr "" ++ ++msgid "Client network size" ++msgstr "" ++ ++msgid "Community" ++msgstr "" ++ ++msgid "Community profile" ++msgstr "" ++ ++msgid "Community settings" ++msgstr "" ++ ++msgid "Confirm Upgrade" ++msgstr "" ++ ++msgid "Contact" ++msgstr "" ++ ++msgid "Contact information is incomplete. Please go to" ++msgstr "" ++ ++msgid "Coordinates" ++msgstr "" ++ ++msgid "Country code" ++msgstr "" ++ ++msgid "Default routes" ++msgstr "" ++ ++msgid "Disable default content" ++msgstr "" ++ ++msgid "Diversity is enabled for device" ++msgstr "" ++ ++msgid "E-Mail" ++msgstr "" ++ ++msgid "ESSID" ++msgstr "" ++ ++msgid "Edit index page" ++msgstr "" ++ ++msgid "Enable IPv6" ++msgstr "" ++ ++msgid "Enable a virtual access point (VAP) by default if possible." ++msgstr "" ++ ++msgid "Error" ++msgstr "" ++ ++msgid "Find your coordinates with OpenStreetMap" ++msgstr "" ++ ++msgid "Freifunk" ++msgstr "" ++ ++msgid "Freifunk Overview" ++msgstr "" ++ ++msgid "Freifunk Remote Update" ++msgstr "" ++ ++msgid "Gateway" ++msgstr "" ++ ++msgid "Go to" ++msgstr "" ++ ++msgid "Good (2 < ETX < 4)" ++msgstr "" ++ ++msgid "Green" ++msgstr "" ++ ++msgid "Hello and welcome in the network of" ++msgstr "" ++ ++msgid "Hide OpenStreetMap" ++msgstr "" ++ ++msgid "Homepage" ++msgstr "" ++ ++msgid "Hostname" ++msgstr "" ++ ++msgid "IPv6 Config" ++msgstr "" ++ ++msgid "IPv6 Prefix" ++msgstr "" ++ ++msgid "IPv6 network in CIDR notation." ++msgstr "" ++ ++msgid "If selected then the default content element is not shown." ++msgstr "" ++ ++msgid "If you are interested in our project then contact the local community" ++msgstr "" ++ ++msgid "Index Page" ++msgstr "" ++ ++msgid "Interface" ++msgstr "" ++ ++msgid "" ++"Internet access depends on technical and organisational conditions and may " ++"or may not work for you." ++msgstr "" ++ ++msgid "It is operated by" ++msgstr "" ++ ++msgid "Keep configuration" ++msgstr "" ++ ++msgid "Latitude" ++msgstr "" ++ ++msgid "Legend" ++msgstr "" ++ ++msgid "Load" ++msgstr "" ++ ++msgid "Local Time" ++msgstr "" ++ ++msgid "Location" ++msgstr "" ++ ++msgid "Longitude" ++msgstr "" ++ ++msgid "Map" ++msgstr "" ++ ++msgid "Map Error" ++msgstr "" ++ ++msgid "Memory" ++msgstr "" ++ ++msgid "Mesh prefix" ++msgstr "" ++ ++msgid "Metric" ++msgstr "" ++ ++msgid "Mode" ++msgstr "" ++ ++msgid "Network" ++msgstr "" ++ ++msgid "Network for client DHCP addresses" ++msgstr "" ++ ++msgid "Nickname" ++msgstr "" ++ ++msgid "No default routes known." ++msgstr "" ++ ++msgid "Notice" ++msgstr "" ++ ++msgid "OLSR" ++msgstr "" ++ ++msgid "Operator" ++msgstr "" ++ ++msgid "Orange" ++msgstr "" ++ ++msgid "Overview" ++msgstr "" ++ ++msgid "Package libiwinfo required!" ++msgstr "" ++ ++msgid "Phone" ++msgstr "" ++ ++msgid "Please fill in your contact details below." ++msgstr "" ++ ++msgid "Please set your contact information" ++msgstr "" ++ ++msgid "Power" ++msgstr "" ++ ++msgid "Processor" ++msgstr "" ++ ++msgid "Profile" ++msgstr "" ++ ++msgid "Profile (Expert)" ++msgstr "" ++ ++msgid "Realname" ++msgstr "" ++ ++msgid "Red" ++msgstr "" ++ ++msgid "SSID" ++msgstr "" ++ ++msgid "" ++"Select your location with a mouse click on the map. The map will only show " ++"up if you are connected to the Internet." ++msgstr "" ++ ++msgid "Show OpenStreetMap" ++msgstr "" ++ ++msgid "Show on map" ++msgstr "" ++ ++msgid "Signal" ++msgstr "" ++ ++msgid "Splash" ++msgstr "" ++ ++msgid "Start Upgrade" ++msgstr "" ++ ++msgid "Statistics" ++msgstr "" ++ ++msgid "Status" ++msgstr "" ++ ++msgid "Still usable (4 < ETX < 10)" ++msgstr "" ++ ++msgid "System" ++msgstr "" ++ ++msgid "TX" ++msgstr "" ++ ++msgid "" ++"The libiwinfo package is not installed. You must install this " ++"component for working wireless configuration!" ++msgstr "" ++ ++msgid "" ++"The OLSRd service is not configured to capture position data from the " ++"network.
    Please make sure that the nameservice plugin is properly " ++"configured and that the latlon_file option is enabled." ++msgstr "" ++ ++msgid "The installed firmware is the most recent version." ++msgstr "" ++ ++msgid "" ++"These are the basic settings for your local wireless community. These " ++"settings define the default values for the wizard and DO NOT affect the " ++"actual configuration of the router." ++msgstr "" ++ ++msgid "These are the settings of your local community." ++msgstr "" ++ ++msgid "" ++"These pages will assist you in setting up your router for Freifunk or " ++"similar wireless community networks." ++msgstr "" ++ ++msgid "This is the access point" ++msgstr "" ++ ++msgid "Update Settings" ++msgstr "" ++ ++msgid "Update available!" ++msgstr "" ++ ++msgid "Uptime" ++msgstr "" ++ ++msgid "VAP" ++msgstr "" ++ ++msgid "Verify downloaded images" ++msgstr "" ++ ++msgid "Very good (ETX < 2)" ++msgstr "" ++ ++msgid "" ++"We are an initiative to establish a free, independent and open wireless mesh " ++"network." ++msgstr "" ++ ++msgid "Wireless Overview" ++msgstr "" ++ ++msgid "Yellow" ++msgstr "" ++ ++msgid "" ++"You can display additional content on the public index page by inserting " ++"valid XHTML in the form below.
    Headlines should be enclosed between <" ++"h2> and </h2>." ++msgstr "" ++ ++msgid "" ++"You can find further information about the global Freifunk initiative at" ++msgstr "" ++ ++msgid "You can manually edit the selected community profile here." ++msgstr "" ++ ++msgid "" ++"You need to select a profile before you can edit it. To select a profile go " ++"to" ++msgstr "" ++ ++msgid "and fill out all required fields." ++msgstr "" ++ ++msgid "buffered" ++msgstr "" ++ ++msgid "cached" ++msgstr "" ++ ++msgid "e.g." ++msgstr "" ++ ++msgid "free" ++msgstr "" ++ ++msgid "to disable it." ++msgstr "" ++ ++msgid "used" ++msgstr "" ++ ++msgid "wireless settings" ++msgstr "" +diff --git a/feeds/luci/modules/luci-mod-freifunk/po/no/freifunk.po b/feeds/luci/modules/luci-mod-freifunk/po/no/freifunk.po +new file mode 100644 +index 0000000..62df8b9 +--- /dev/null ++++ b/feeds/luci/modules/luci-mod-freifunk/po/no/freifunk.po +@@ -0,0 +1,430 @@ ++msgid "" ++msgstr "" ++"Last-Translator: Lars Hardy \n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++ ++msgid "BSSID" ++msgstr "BSSID" ++ ++msgid "Bad (ETX > 10)" ++msgstr "" ++ ++msgid "Basic Settings" ++msgstr "Grunnleggende Innstillinger" ++ ++msgid "Basic settings" ++msgstr "Grunnleggende innstillinger" ++ ++msgid "Basic settings are incomplete. Please go to" ++msgstr "Grunnleggende innstillinger er mangelfull. Gå til" ++ ++msgid "Basic system settings" ++msgstr "Grunnleggende system innstillinger" ++ ++msgid "Bitrate" ++msgstr "Bithastighet" ++ ++msgid "Channel" ++msgstr "Kanal" ++ ++msgid "Check for new firmware versions and perform automatic updates." ++msgstr "Se etter nye firmware-versjoner og utfør automatiske oppdatering." ++ ++msgid "Client network size" ++msgstr "Klient nettverk størrelse" ++ ++msgid "Community" ++msgstr "Sted" ++ ++msgid "Community profile" ++msgstr "Sted profil" ++ ++msgid "Community settings" ++msgstr "Sted innstillinger" ++ ++msgid "Confirm Upgrade" ++msgstr "Bekreft Oppgradering" ++ ++msgid "Contact" ++msgstr "Kontakt" ++ ++msgid "Contact information is incomplete. Please go to" ++msgstr "Kontaktinformasjonen er mangelfull. Gå til" ++ ++msgid "Coordinates" ++msgstr "Koordinater" ++ ++msgid "Country code" ++msgstr "Landskode" ++ ++msgid "Default routes" ++msgstr "Standard ruter" ++ ++msgid "Disable default content" ++msgstr "Deaktiver standard innhold" ++ ++msgid "Diversity is enabled for device" ++msgstr "Antennevariasjon er aktivert på enhet" ++ ++msgid "E-Mail" ++msgstr "E-Post" ++ ++msgid "ESSID" ++msgstr "ESSID" ++ ++msgid "Edit index page" ++msgstr "Rediger indeks side" ++ ++msgid "Enable IPv6" ++msgstr "" ++ ++msgid "Enable a virtual access point (VAP) by default if possible." ++msgstr "" ++ ++msgid "Error" ++msgstr "Feil" ++ ++msgid "Find your coordinates with OpenStreetMap" ++msgstr "Finn koordinatene dine med OpenStreetMap" ++ ++msgid "Freifunk" ++msgstr "Freifunk" ++ ++msgid "Freifunk Overview" ++msgstr "Freifunk Oversikt" ++ ++msgid "Freifunk Remote Update" ++msgstr "Freifunk Fjernkontrollert Oppgradering" ++ ++msgid "Gateway" ++msgstr "Gateway" ++ ++msgid "Go to" ++msgstr "Gå til" ++ ++msgid "Good (2 < ETX < 4)" ++msgstr "" ++ ++msgid "Green" ++msgstr "" ++ ++msgid "Hello and welcome in the network of" ++msgstr "Hei og velkommen til nettverket av" ++ ++msgid "Hide OpenStreetMap" ++msgstr "Skjul OpenStreetMap" ++ ++msgid "Homepage" ++msgstr "Hjemmeside" ++ ++msgid "Hostname" ++msgstr "Vertsnavn" ++ ++msgid "IPv6 Config" ++msgstr "" ++ ++msgid "IPv6 Prefix" ++msgstr "" ++ ++msgid "IPv6 network in CIDR notation." ++msgstr "" ++ ++msgid "If selected then the default content element is not shown." ++msgstr "Om valgt vises ikke det vanlige innholdselementet" ++ ++msgid "If you are interested in our project then contact the local community" ++msgstr "" ++"Hvis du er interessert i prosjektet vårt så ta kontakt med en lokale gruppe " ++"på" ++ ++msgid "Index Page" ++msgstr "Indeks Side" ++ ++msgid "Interface" ++msgstr "Grensesnitt" ++ ++msgid "" ++"Internet access depends on technical and organisational conditions and may " ++"or may not work for you." ++msgstr "" ++"Internett tilgang er avhengig av tekniske og organisatoriske forhold, defor " ++"er det ikke sikkert det fungerer for deg." ++ ++msgid "It is operated by" ++msgstr "Det drives av" ++ ++msgid "Keep configuration" ++msgstr "Behold konfigurasjonen" ++ ++msgid "Latitude" ++msgstr "Breddegrad" ++ ++msgid "Legend" ++msgstr "" ++ ++msgid "Load" ++msgstr "Last" ++ ++msgid "Local Time" ++msgstr "Lokal Tid" ++ ++msgid "Location" ++msgstr "Sted" ++ ++msgid "Longitude" ++msgstr "Lengdegrad" ++ ++msgid "Map" ++msgstr "Kart" ++ ++msgid "Map Error" ++msgstr "Kart Feil" ++ ++msgid "Memory" ++msgstr "Minne" ++ ++msgid "Mesh prefix" ++msgstr "Mesh prefiks" ++ ++msgid "Metric" ++msgstr "Metrisk" ++ ++msgid "Mode" ++msgstr "Modus" ++ ++msgid "Network" ++msgstr "Nettverk" ++ ++msgid "Network for client DHCP addresses" ++msgstr "Nettverk for klient DHCP adresser" ++ ++msgid "Nickname" ++msgstr "Kallenavn" ++ ++msgid "No default routes known." ++msgstr "Ingen standard rute er kjent" ++ ++msgid "Notice" ++msgstr "Merknad" ++ ++msgid "OLSR" ++msgstr "OLSR" ++ ++msgid "Operator" ++msgstr "" ++ ++msgid "Orange" ++msgstr "" ++ ++msgid "Overview" ++msgstr "Oversikt" ++ ++msgid "Package libiwinfo required!" ++msgstr "Pakken libiwinfo er nødvendig!" ++ ++msgid "Phone" ++msgstr "Telefon" ++ ++msgid "Please fill in your contact details below." ++msgstr "Vennligst fyll ut skjema nedenfor." ++ ++msgid "Please set your contact information" ++msgstr "Vennligst oppgi din kontaktinformasjon" ++ ++msgid "Power" ++msgstr "Styrke" ++ ++msgid "Processor" ++msgstr "Prosessor" ++ ++msgid "Profile" ++msgstr "Profil" ++ ++msgid "Profile (Expert)" ++msgstr "Profil (Ekspert)" ++ ++msgid "Realname" ++msgstr "Virkelig Navn" ++ ++msgid "Red" ++msgstr "" ++ ++msgid "SSID" ++msgstr "SSID" ++ ++msgid "" ++"Select your location with a mouse click on the map. The map will only show " ++"up if you are connected to the Internet." ++msgstr "" ++"Velg din posisjon med et museklikk på kartet. Kartet vises bare om du er " ++"koblet til internett." ++ ++msgid "Show OpenStreetMap" ++msgstr "Vis OpenStreetMap" ++ ++msgid "Show on map" ++msgstr "" ++ ++msgid "Signal" ++msgstr "Signal" ++ ++msgid "Splash" ++msgstr "" ++ ++msgid "Start Upgrade" ++msgstr "Start Oppgradering" ++ ++msgid "Statistics" ++msgstr "Statistikk" ++ ++msgid "Status" ++msgstr "Status" ++ ++msgid "Still usable (4 < ETX < 10)" ++msgstr "" ++ ++msgid "System" ++msgstr "System" ++ ++msgid "TX" ++msgstr "TX" ++ ++msgid "" ++"The libiwinfo package is not installed. You must install this " ++"component for working wireless configuration!" ++msgstr "" ++ ++msgid "" ++"The OLSRd service is not configured to capture position data from the " ++"network.
    Please make sure that the nameservice plugin is properly " ++"configured and that the latlon_file option is enabled." ++msgstr "" ++"OLSRd tjenesten er ikke konfigurert til å hente posisjons data fra " ++"nettverket.
    Kontroller at navnetjener pluginen er riktig konfigurert og " ++"at latlon_file alternativet er aktivert." ++ ++msgid "The installed firmware is the most recent version." ++msgstr "Den installerte firmware er den nyeste versjonen." ++ ++msgid "" ++"These are the basic settings for your local wireless community. These " ++"settings define the default values for the wizard and DO NOT affect the " ++"actual configuration of the router." ++msgstr "" ++"Dette er de grunnleggende innstillinger for det lokale trådløse stedet. " ++"Disse innstillingene definerer standard verdiene for veiviseren og vil " ++"derfor IKKE gjøre noen endringer på ruteren." ++ ++msgid "These are the settings of your local community." ++msgstr "Dette er innstillingene for det lokale stedet" ++ ++msgid "" ++"These pages will assist you in setting up your router for Freifunk or " ++"similar wireless community networks." ++msgstr "" ++"Disse sidene vil hjelpe deg med å sette opp ruteren til for Freifunk og " ++"lignende trådløse nettverk." ++ ++msgid "This is the access point" ++msgstr "Dette er aksess punktet" ++ ++msgid "Update Settings" ++msgstr "Oppdater Innstillingene" ++ ++msgid "Update available!" ++msgstr "Oppdatering tilgjengelig!" ++ ++msgid "Uptime" ++msgstr "Oppetid" ++ ++msgid "VAP" ++msgstr "" ++ ++msgid "Verify downloaded images" ++msgstr "Verifiser nedlastede filer" ++ ++msgid "Very good (ETX < 2)" ++msgstr "" ++ ++msgid "" ++"We are an initiative to establish a free, independent and open wireless mesh " ++"network." ++msgstr "" ++"Vi er et initiativ for å etablere fri, uavhengig og åpne trådløse mesh-" ++"nettverk." ++ ++msgid "Wireless Overview" ++msgstr "Trådløs Oversikt" ++ ++msgid "Yellow" ++msgstr "" ++ ++msgid "" ++"You can display additional content on the public index page by inserting " ++"valid XHTML in the form below.
    Headlines should be enclosed between <" ++"h2> and </h2>." ++msgstr "" ++"Du kan vise ytterligere innhold på den offentlige side ved å legge til " ++"gyldig XHTML med form som vist under.
    Overskrifter bør legges mellom " ++"<h2> og </h2>." ++ ++msgid "" ++"You can find further information about the global Freifunk initiative at" ++msgstr "Du kan finne mere informasjon om den globale Freifunk initiativ på" ++ ++msgid "You can manually edit the selected community profile here." ++msgstr "Du kan manuelt endre den valgte stedsprofilen here" ++ ++msgid "" ++"You need to select a profile before you can edit it. To select a profile go " ++"to" ++msgstr "" ++"Du må velge en profil før du kan endre den. For å velge en profil går du til" ++ ++msgid "and fill out all required fields." ++msgstr "og fylle ut alle nødvendige felt" ++ ++msgid "buffered" ++msgstr "bufret" ++ ++msgid "cached" ++msgstr "hurtigbufret" ++ ++msgid "e.g." ++msgstr "f.eks." ++ ++msgid "free" ++msgstr "tilgjengelig" ++ ++msgid "to disable it." ++msgstr "å deaktivere det" ++ ++msgid "used" ++msgstr "brukt" ++ ++msgid "wireless settings" ++msgstr "trådløse innstillinger" ++ ++#~ msgid "" ++#~ "No services can be shown, because olsrd is not running or the olsrd-" ++#~ "nameservice Plugin is not loaded." ++#~ msgstr "" ++#~ "Ingen tjenester kan vises her, dette kan være pga. at olsrd ikke kjører " ++#~ "eller fordi olsrd-navnetjener plugin ikke er lastet." ++ ++#~ msgid "Services" ++#~ msgstr "Tjenester" ++ ++#~ msgid "Source" ++#~ msgstr "Kilde" ++ ++#~ msgid "" ++#~ "The libiwinfo-lua package is not installed. You must install " ++#~ "this component for working wireless configuration!" ++#~ msgstr "" ++#~ "Pakken libiwinfo-lua er ikke installert. Du må installere denne " ++#~ "pakken for å kunne konfigurerer trådløse enheter!" ++ ++#~ msgid "Url" ++#~ msgstr "Url" +diff --git a/feeds/luci/modules/luci-mod-freifunk/po/pl/freifunk.po b/feeds/luci/modules/luci-mod-freifunk/po/pl/freifunk.po +new file mode 100644 +index 0000000..ac46e1f +--- /dev/null ++++ b/feeds/luci/modules/luci-mod-freifunk/po/pl/freifunk.po +@@ -0,0 +1,422 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"PO-Revision-Date: 2014-04-23 19:16+0200\n" ++"Last-Translator: goodgod261 \n" ++"Language-Team: none\n" ++"Language: pl\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 " ++"|| n%100>=20) ? 1 : 2);\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "BSSID" ++msgstr "BSSID" ++ ++msgid "Bad (ETX > 10)" ++msgstr "Błąd (Etx > 10)" ++ ++msgid "Basic Settings" ++msgstr "Ustawienia Podstawowe" ++ ++msgid "Basic settings" ++msgstr "Ustawienia podstawowe" ++ ++msgid "Basic settings are incomplete. Please go to" ++msgstr "Niekompletne ustawienia podstawowe. Proszę uzupełnić" ++ ++msgid "Basic system settings" ++msgstr "Podstawowe ustawienia systemu" ++ ++msgid "Bitrate" ++msgstr "Bitrate" ++ ++msgid "Channel" ++msgstr "Kanał" ++ ++msgid "Check for new firmware versions and perform automatic updates." ++msgstr "Automatycznie sprawdź i uaktualnij wersję firmware`u" ++ ++msgid "Client network size" ++msgstr "Rozmiar sieci klientów" ++ ++msgid "Community" ++msgstr "Społeczność" ++ ++msgid "Community profile" ++msgstr "Profil w społeczności" ++ ++msgid "Community settings" ++msgstr "Ustawienia społeczności" ++ ++msgid "Confirm Upgrade" ++msgstr "Potwierdź uaktualnienie" ++ ++msgid "Contact" ++msgstr "Dane kontaktowe" ++ ++msgid "Contact information is incomplete. Please go to" ++msgstr "Dane kontaktowe są niekompletne. Proszę uzupełnij je" ++ ++msgid "Coordinates" ++msgstr "Współrzędne" ++ ++msgid "Country code" ++msgstr "Prefiks kraju" ++ ++msgid "Default routes" ++msgstr "Domyślne trasy (routes)" ++ ++msgid "Disable default content" ++msgstr "Wyłącz domyślną zawartość" ++ ++# Nie przetłumaczymy tego lepiej. ++msgid "Diversity is enabled for device" ++msgstr "Różnorodność jest włączona dla urządzenia" ++ ++msgid "E-Mail" ++msgstr "E-Mail" ++ ++msgid "ESSID" ++msgstr "Nazwa sieci (ESSID)" ++ ++msgid "Edit index page" ++msgstr "Edytuj stronę główną" ++ ++msgid "Enable IPv6" ++msgstr "Włącz IPv6" ++ ++msgid "Enable a virtual access point (VAP) by default if possible." ++msgstr "" ++ ++msgid "Error" ++msgstr "Błąd" ++ ++msgid "Find your coordinates with OpenStreetMap" ++msgstr "Znajdź swoje współrzędne w OpenStreetMap" ++ ++msgid "Freifunk" ++msgstr "Freifunk" ++ ++msgid "Freifunk Overview" ++msgstr "Przegląd sieci Freifunk" ++ ++msgid "Freifunk Remote Update" ++msgstr "Zdalna aktualizacja Freifunk" ++ ++msgid "Gateway" ++msgstr "Brama" ++ ++msgid "Go to" ++msgstr "Przejdź do" ++ ++msgid "Good (2 < ETX < 4)" ++msgstr "Dobrze (2 < ETX < 4)" ++ ++msgid "Green" ++msgstr "Zielone" ++ ++msgid "Hello and welcome in the network of" ++msgstr "Cześć! Witamy w sieci" ++ ++msgid "Hide OpenStreetMap" ++msgstr "Ukryj OpenStreetMap" ++ ++msgid "Homepage" ++msgstr "Strona domowa" ++ ++msgid "Hostname" ++msgstr "Nazwa hosta" ++ ++msgid "IPv6 Config" ++msgstr "Konfiguracja IPv6" ++ ++msgid "IPv6 Prefix" ++msgstr "Prefiks IPv6" ++ ++msgid "IPv6 network in CIDR notation." ++msgstr "Sieć IPv6 w notacji CIDR" ++ ++msgid "If selected then the default content element is not shown." ++msgstr "Jeśli zaznaczone domyślna zawartość nie jest widoczna" ++ ++msgid "If you are interested in our project then contact the local community" ++msgstr "" ++"Jeśli jesteś zainteresowany projektem kontaktuj się z lokalna społecznością " ++"Freifunk" ++ ++msgid "Index Page" ++msgstr "Strona początkowa" ++ ++msgid "Interface" ++msgstr "Interfejs" ++ ++msgid "" ++"Internet access depends on technical and organisational conditions and may " ++"or may not work for you." ++msgstr "" ++"Dostęp do internetu zależy od warunków technicznych i organizacyjnych, i " ++"dlatego może nie działać." ++ ++msgid "It is operated by" ++msgstr "Jest zarządzany przez" ++ ++msgid "Keep configuration" ++msgstr "Zachowaj konfigurację" ++ ++msgid "Latitude" ++msgstr "Szerokość" ++ ++msgid "Legend" ++msgstr "Legenda" ++ ++msgid "Load" ++msgstr "Obciążenie" ++ ++msgid "Local Time" ++msgstr "Czas Lokalny" ++ ++# Może ktoś ma lepsze słowo? ++msgid "Location" ++msgstr "Lokacja" ++ ++msgid "Longitude" ++msgstr "Długość" ++ ++msgid "Map" ++msgstr "Mapa" ++ ++msgid "Map Error" ++msgstr "Błąd Mapy" ++ ++msgid "Memory" ++msgstr "Pamięć" ++ ++# Dosłownie prefiks kraty ++msgid "Mesh prefix" ++msgstr "Prefiks komórki" ++ ++msgid "Metric" ++msgstr "Metryka" ++ ++msgid "Mode" ++msgstr "Tryb" ++ ++msgid "Network" ++msgstr "Sieć" ++ ++msgid "Network for client DHCP addresses" ++msgstr "Sieć dla adresów klienta DHCP" ++ ++msgid "Nickname" ++msgstr "Twoja ksywka" ++ ++msgid "No default routes known." ++msgstr "Nie są znane żadne domyślne ścieżki routingu." ++ ++msgid "Notice" ++msgstr "Uwaga" ++ ++msgid "OLSR" ++msgstr "OLSR" ++ ++msgid "Operator" ++msgstr "Zarządca" ++ ++msgid "Orange" ++msgstr "Pomarańczowe" ++ ++msgid "Overview" ++msgstr "Przegląd" ++ ++msgid "Package libiwinfo required!" ++msgstr "Wymagany pakiet libiwinfo !" ++ ++msgid "Phone" ++msgstr "Telefon" ++ ++msgid "Please fill in your contact details below." ++msgstr "Proszę uzupełnij dane kontaktowe poniżej." ++ ++msgid "Please set your contact information" ++msgstr "Proszę uzupełnić swoje dane kontaktowe" ++ ++msgid "Power" ++msgstr "Moc" ++ ++msgid "Processor" ++msgstr "Procesor" ++ ++msgid "Profile" ++msgstr "Profil" ++ ++msgid "Profile (Expert)" ++msgstr "Profil (tryb eksperta)" ++ ++msgid "Realname" ++msgstr "Imię i Nazwisko (prawdziwe)" ++ ++msgid "Red" ++msgstr "Czerwone" ++ ++msgid "SSID" ++msgstr "SSID" ++ ++msgid "" ++"Select your location with a mouse click on the map. The map will only show " ++"up if you are connected to the Internet." ++msgstr "" ++"Proszę zaznaczyć swoją lokację na mapie. Mapa jest pokazywana tylko jeśli " ++"masz dostęp do internetu." ++ ++msgid "Show OpenStreetMap" ++msgstr "Pokaż OpenStreetMap" ++ ++msgid "Show on map" ++msgstr "Pokaż na mapie" ++ ++msgid "Signal" ++msgstr "Sygnał" ++ ++msgid "Splash" ++msgstr "Splash" ++ ++msgid "Start Upgrade" ++msgstr "Zacznij aktualizację" ++ ++msgid "Statistics" ++msgstr "Statystyki" ++ ++msgid "Status" ++msgstr "Status" ++ ++msgid "Still usable (4 < ETX < 10)" ++msgstr "Cały Czas do użycia (4 < ETX < 10)" ++ ++msgid "System" ++msgstr "System" ++ ++msgid "TX" ++msgstr "TX" ++ ++msgid "" ++"The libiwinfo package is not installed. You must install this " ++"component for working wireless configuration!" ++msgstr "" ++"Pakiet libiwinfo nie jest zainstalowany. Musisz go zainstalować, " ++"aby konfiguracja sieci bezprzewodowej mogła być uaktywniona!" ++ ++msgid "" ++"The OLSRd service is not configured to capture position data from the " ++"network.
    Please make sure that the nameservice plugin is properly " ++"configured and that the latlon_file option is enabled." ++msgstr "" ++"Usługa OLSRd nie jest skonfigurowana do pozyskiwania nazwy z sieci.
    " ++"Proszę się upewnić, że plugin nameservice jest poprawnie skonfigurowany, " ++"oraz opcja użycia pliku latlon_file jest zaznaczona." ++ ++msgid "The installed firmware is the most recent version." ++msgstr "Zainstalowany firmware jest aktualny." ++ ++msgid "" ++"These are the basic settings for your local wireless community. These " ++"settings define the default values for the wizard and DO NOT affect the " ++"actual configuration of the router." ++msgstr "" ++"Są to podstawowe ustawienia dla twojej lokalnej bezprzewodowej społeczności. " ++"Te ustawienia określają domyślne wartości dla kreatora i NIE MAJĄ wpływu na " ++"aktualną konfigurację routera." ++ ++msgid "These are the settings of your local community." ++msgstr "To są ustawienia twojej lokalnej społeczności (community)." ++ ++msgid "" ++"These pages will assist you in setting up your router for Freifunk or " ++"similar wireless community networks." ++msgstr "" ++"Te strony pomogą ci skonfigurować twój router do sieci Freifunk, lub innej " ++"sieci społecznościowej ." ++ ++msgid "This is the access point" ++msgstr "To jest punk dostępowy (AP)" ++ ++msgid "Update Settings" ++msgstr "Uaktualnij ustawienia" ++ ++msgid "Update available!" ++msgstr "Aktualizacja dostępna!!!" ++ ++msgid "Uptime" ++msgstr "Aktualizacja" ++ ++msgid "VAP" ++msgstr "" ++ ++msgid "Verify downloaded images" ++msgstr "Sprawdź pobrane obrazy" ++ ++msgid "Very good (ETX < 2)" ++msgstr "Bardzo Dobrze (ETX < 2)" ++ ++msgid "" ++"We are an initiative to establish a free, independent and open wireless mesh " ++"network." ++msgstr "" ++"Jesteśmy inicjatywą na rzecz ustanowienia wolnej, niezależnej i otwartej " ++"bezprzewodowej siatki kratowej." ++ ++msgid "Wireless Overview" ++msgstr "Przegląd Ustawień WiFi" ++ ++msgid "Yellow" ++msgstr "Żółty" ++ ++msgid "" ++"You can display additional content on the public index page by inserting " ++"valid XHTML in the form below.
    Headlines should be enclosed between <" ++"h2> and </h2>." ++msgstr "" ++"Można wyświetlić dodatkową zawartość na publicznej stronie indeksu " ++"wstawiając poprawny XHTML do formularza poniżej.
    Nagłówki powinny być " ++"zamkniÄ™te tagami <h2> i </h2>." ++ ++msgid "" ++"You can find further information about the global Freifunk initiative at" ++msgstr "" ++"Możesz znaleźć wiÄ™cej informacji o naszej globalnej inicjatywie Freifunk na" ++ ++msgid "You can manually edit the selected community profile here." ++msgstr "Możesz rÄ™cznie edytować wybrany profil spoÅ‚ecznoÅ›ci tutaj" ++ ++msgid "" ++"You need to select a profile before you can edit it. To select a profile go " ++"to" ++msgstr "" ++"Aby edytować profil musisz go najpierw zaznaczyć. Zaznacz profil aby " ++"kontynuować" ++ ++msgid "and fill out all required fields." ++msgstr "i wypeÅ‚nij wszystkie wymagane pola." ++ ++msgid "buffered" ++msgstr "buforowany" ++ ++msgid "cached" ++msgstr "cachowany" ++ ++msgid "e.g." ++msgstr "np." ++ ++msgid "free" ++msgstr "darmowy" ++ ++msgid "to disable it." ++msgstr "aby wyÅ‚Ä…czyć" ++ ++msgid "used" ++msgstr "używany" ++ ++msgid "wireless settings" ++msgstr "ustawienia sieci bezprzewodowej" +diff --git a/feeds/luci/modules/luci-mod-freifunk/po/pt-br/freifunk.po b/feeds/luci/modules/luci-mod-freifunk/po/pt-br/freifunk.po +new file mode 100644 +index 0000000..a906a93 +--- /dev/null ++++ b/feeds/luci/modules/luci-mod-freifunk/po/pt-br/freifunk.po +@@ -0,0 +1,447 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Report-Msgid-Bugs-To: \n" ++"POT-Creation-Date: 2009-06-10 03:41+0200\n" ++"PO-Revision-Date: 2014-06-21 19:00+0200\n" ++"Last-Translator: Éder \n" ++"Language-Team: LANGUAGE \n" ++"Language: pt_BR\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n > 1);\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "BSSID" ++msgstr "BSSID" ++ ++msgid "Bad (ETX > 10)" ++msgstr "Mal (ETX > 10)" ++ ++msgid "Basic Settings" ++msgstr "Configurações Básicas" ++ ++msgid "Basic settings" ++msgstr "Configurações básicas" ++ ++msgid "Basic settings are incomplete. Please go to" ++msgstr "As configurações básicas estão incompletas. Por favor vá para" ++ ++msgid "Basic system settings" ++msgstr "Configurações básicas do sistema" ++ ++msgid "Bitrate" ++msgstr "Taxa de bit" ++ ++msgid "Channel" ++msgstr "Canal" ++ ++msgid "Check for new firmware versions and perform automatic updates." ++msgstr "" ++"Verifique a existência de novas versões e realize a atualização " ++"automaticamente." ++ ++msgid "Client network size" ++msgstr "Tamanho da rede dos clientes" ++ ++msgid "Community" ++msgstr "Comunidade" ++ ++msgid "Community profile" ++msgstr "Perfil da comunidade" ++ ++msgid "Community settings" ++msgstr "Configurações da comunidade" ++ ++msgid "Confirm Upgrade" ++msgstr "Confirmar a atualização" ++ ++msgid "Contact" ++msgstr "Contato" ++ ++msgid "Contact information is incomplete. Please go to" ++msgstr "A informação de contato está incompleta. Por favor, vá para" ++ ++msgid "Coordinates" ++msgstr "Coordenadas" ++ ++msgid "Country code" ++msgstr "Código do país" ++ ++msgid "Default routes" ++msgstr "Rotas padrão" ++ ++msgid "Disable default content" ++msgstr "Desabilitar o conteúdo padrão" ++ ++msgid "Diversity is enabled for device" ++msgstr "A diversidade está habilitada neste dispositivo" ++ ++msgid "E-Mail" ++msgstr "E-mail" ++ ++msgid "ESSID" ++msgstr "ESSID" ++ ++msgid "Edit index page" ++msgstr "Edita a página índice" ++ ++msgid "Enable IPv6" ++msgstr "Habilitar IPv6" ++ ++# 20140621: edersg: tradução ++msgid "Enable a virtual access point (VAP) by default if possible." ++msgstr "Habilitar um ponto de acesso virtual (VAP) por padrão, se possível" ++ ++msgid "Error" ++msgstr "Erro" ++ ++msgid "Find your coordinates with OpenStreetMap" ++msgstr "Encontre sua coordenada com o OpenStreetMap" ++ ++msgid "Freifunk" ++msgstr "Freifunk" ++ ++msgid "Freifunk Overview" ++msgstr "Visão Geral do Freifunk" ++ ++msgid "Freifunk Remote Update" ++msgstr "Atualização Remota do Freifunk" ++ ++msgid "Gateway" ++msgstr "Roteador" ++ ++msgid "Go to" ++msgstr "Vá para" ++ ++msgid "Good (2 < ETX < 4)" ++msgstr "Bom (2 < ETX < 4)" ++ ++msgid "Green" ++msgstr "Verde" ++ ++msgid "Hello and welcome in the network of" ++msgstr "Olá e seja bem-vindo à rede do" ++ ++msgid "Hide OpenStreetMap" ++msgstr "Esconder o OpenStreetMap" ++ ++msgid "Homepage" ++msgstr "Página" ++ ++msgid "Hostname" ++msgstr "Nome do equipamento" ++ ++msgid "IPv6 Config" ++msgstr "Configuração IPv6" ++ ++msgid "IPv6 Prefix" ++msgstr "Prefixo IPv6" ++ ++msgid "IPv6 network in CIDR notation." ++msgstr "Rede IPv6 em notação CIDR." ++ ++msgid "If selected then the default content element is not shown." ++msgstr "Se selecionado, o conteúdo padrão não é mostrado." ++ ++msgid "If you are interested in our project then contact the local community" ++msgstr "" ++"Se estiver interessado no nosso projeto, entre em contacto com a comunidade " ++"local" ++ ++msgid "Index Page" ++msgstr "Página Ãndice" ++ ++msgid "Interface" ++msgstr "Interface" ++ ++msgid "" ++"Internet access depends on technical and organisational conditions and may " ++"or may not work for you." ++msgstr "" ++"O acesso à Internet depende de fatores técnicos e organizacionais, e pode " ++"funcionar ou não no seu caso." ++ ++msgid "It is operated by" ++msgstr "É operado por" ++ ++msgid "Keep configuration" ++msgstr "Manter a configuração" ++ ++msgid "Latitude" ++msgstr "Latitude" ++ ++msgid "Legend" ++msgstr "Legenda" ++ ++msgid "Load" ++msgstr "Carregar" ++ ++msgid "Local Time" ++msgstr "Horário Local" ++ ++msgid "Location" ++msgstr "Localização" ++ ++msgid "Longitude" ++msgstr "Longitude" ++ ++msgid "Map" ++msgstr "Mapa" ++ ++msgid "Map Error" ++msgstr "Erro do Mapa" ++ ++msgid "Memory" ++msgstr "Memória" ++ ++msgid "Mesh prefix" ++msgstr "Prefixo da rede em malha" ++ ++msgid "Metric" ++msgstr "Métrica" ++ ++msgid "Mode" ++msgstr "Modo" ++ ++msgid "Network" ++msgstr "Rede" ++ ++msgid "Network for client DHCP addresses" ++msgstr "Rede para os endereços dos clientes DHCP" ++ ++msgid "Nickname" ++msgstr "Apelido" ++ ++msgid "No default routes known." ++msgstr "Nenhuma rota padrão conhecida." ++ ++msgid "Notice" ++msgstr "Aviso" ++ ++msgid "OLSR" ++msgstr "OLSR" ++ ++msgid "Operator" ++msgstr "Operador" ++ ++msgid "Orange" ++msgstr "Laranja" ++ ++msgid "Overview" ++msgstr "Visão Geral" ++ ++msgid "Package libiwinfo required!" ++msgstr "O pacote libiwinfo é necessário!" ++ ++msgid "Phone" ++msgstr "Telefone" ++ ++msgid "Please fill in your contact details below." ++msgstr "Por favor, preencha seus detalhes de contato abaixo." ++ ++msgid "Please set your contact information" ++msgstr "Por favor, defina a informação de contato" ++ ++msgid "Power" ++msgstr "Potência" ++ ++msgid "Processor" ++msgstr "Processador" ++ ++msgid "Profile" ++msgstr "Perfil" ++ ++msgid "Profile (Expert)" ++msgstr "Perfil (Especialista)" ++ ++msgid "Realname" ++msgstr "Nome Real" ++ ++msgid "Red" ++msgstr "Vermelho" ++ ++msgid "SSID" ++msgstr "SSID" ++ ++msgid "" ++"Select your location with a mouse click on the map. The map will only show " ++"up if you are connected to the Internet." ++msgstr "" ++"Selecione a sua localização com o mouse clicando no mapa. O mapa irá mostrar " ++"se você está conectado na internet." ++ ++msgid "Show OpenStreetMap" ++msgstr "Mostrar o OpenStreetMap" ++ ++msgid "Show on map" ++msgstr "Mostrar no mapa" ++ ++msgid "Signal" ++msgstr "Sinal" ++ ++msgid "Splash" ++msgstr "Splash" ++ ++msgid "Start Upgrade" ++msgstr "Iniciar a Atualização" ++ ++msgid "Statistics" ++msgstr "Estatística" ++ ++msgid "Status" ++msgstr "Estado" ++ ++msgid "Still usable (4 < ETX < 10)" ++msgstr "Ainda usável (4 < ETX < 10)" ++ ++msgid "System" ++msgstr "Sistema" ++ ++msgid "TX" ++msgstr "TX" ++ ++msgid "" ++"The libiwinfo package is not installed. You must install this " ++"component for working wireless configuration!" ++msgstr "" ++"O pacote libiwinfo não está instalado. Você precisa instalar este " ++"componente para ter uma configuração sem fio funcional!" ++ ++msgid "" ++"The OLSRd service is not configured to capture position data from the " ++"network.
    Please make sure that the nameservice plugin is properly " ++"configured and that the latlon_file option is enabled." ++msgstr "" ++"O serviço OLSRd não está configurado para capturar os dados de posição da " ++"rede.
    Por favor, garnta que o plugin nameservice está corretametne " ++"configurado e que a opção latlon_file está habilitada." ++ ++msgid "The installed firmware is the most recent version." ++msgstr "O firmware instalado é a última versão." ++ ++msgid "" ++"These are the basic settings for your local wireless community. These " ++"settings define the default values for the wizard and DO NOT affect the " ++"actual configuration of the router." ++msgstr "" ++"Estas são as configurações básicas para a comunidade sem fio local. Estas " ++"configurações definem os valores padrão para o assistente e NÃO afetam a " ++"configuração atual do roteador." ++ ++msgid "These are the settings of your local community." ++msgstr "Estas são as configurações da sua comunidade local." ++ ++msgid "" ++"These pages will assist you in setting up your router for Freifunk or " ++"similar wireless community networks." ++msgstr "" ++"Esta página ajudará você na configuração do seu roteador Freifunk ou de " ++"redes comunitárias sem fio similares." ++ ++msgid "This is the access point" ++msgstr "Este é o ponto de acesso " ++ ++msgid "Update Settings" ++msgstr "Configurações da Atualização" ++ ++msgid "Update available!" ++msgstr "Existe uma atualização disponível!" ++ ++msgid "Uptime" ++msgstr "Tempo de atividade" ++ ++# 20140621: edersg: tradução ++msgid "VAP" ++msgstr "VAP" ++ ++msgid "Verify downloaded images" ++msgstr "Verifique as imagens baixadas" ++ ++msgid "Very good (ETX < 2)" ++msgstr "Muito bom (ETX < 2)" ++ ++msgid "" ++"We are an initiative to establish a free, independent and open wireless mesh " ++"network." ++msgstr "" ++"Somos uma iniciativa para implementação de uma rede sem fio em malha livre, " ++"independente e não-comercial." ++ ++msgid "Wireless Overview" ++msgstr "Visão Geral da Rede Sem Fio" ++ ++msgid "Yellow" ++msgstr "Amarelo" ++ ++msgid "" ++"You can display additional content on the public index page by inserting " ++"valid XHTML in the form below.
    Headlines should be enclosed between <" ++"h2> and </h2>." ++msgstr "" ++"Você pode mostrar conteúdo adicional na página índice pública inserindo " ++"XHTML válido no formulário abaixo.
    As manchetes devem ficam entre <" ++"h2> e </h2>." ++ ++msgid "" ++"You can find further information about the global Freifunk initiative at" ++msgstr "" ++"Você pode encontrar mais informações sobre a iniciativa global Freifunk em" ++ ++msgid "You can manually edit the selected community profile here." ++msgstr "Você pode editar manualmente o perfil da comunidade selecionada aqui." ++ ++msgid "" ++"You need to select a profile before you can edit it. To select a profile go " ++"to" ++msgstr "" ++"Você precisa selecionar um perfil antes de poder editá-lo. Para selecionar " ++"um perfil, vá para" ++ ++msgid "and fill out all required fields." ++msgstr "e preencher todos os campos obrigatórios." ++ ++msgid "buffered" ++msgstr "no Buffer" ++ ++msgid "cached" ++msgstr "no Cache" ++ ++msgid "e.g." ++msgstr "ex:" ++ ++msgid "free" ++msgstr "livre" ++ ++msgid "to disable it." ++msgstr "para desabilitá-lo." ++ ++msgid "used" ++msgstr "usado" ++ ++msgid "wireless settings" ++msgstr "configurações da rede sem fio" ++ ++#~ msgid "" ++#~ "No services can be shown, because olsrd is not running or the olsrd-" ++#~ "nameservice Plugin is not loaded." ++#~ msgstr "" ++#~ "Nenhum serviço pode ser mostrado porque o olsrd não está rodando ou o " ++#~ "plugin do olsrd-nameservice não está carregado." ++ ++#~ msgid "Services" ++#~ msgstr "Serviços" ++ ++#~ msgid "Source" ++#~ msgstr "Origem" ++ ++#~ msgid "" ++#~ "The libiwinfo-lua package is not installed. You must install " ++#~ "this component for working wireless configuration!" ++#~ msgstr "" ++#~ "O pacote libiwinfo-lua não está instalado. Você deve instalar " ++#~ "este componente para ter uma configuração sem fio funcional!" ++ ++#~ msgid "Url" ++#~ msgstr "URL" +diff --git a/feeds/luci/modules/luci-mod-freifunk/po/pt/freifunk.po b/feeds/luci/modules/luci-mod-freifunk/po/pt/freifunk.po +new file mode 100644 +index 0000000..b5b822b +--- /dev/null ++++ b/feeds/luci/modules/luci-mod-freifunk/po/pt/freifunk.po +@@ -0,0 +1,401 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Report-Msgid-Bugs-To: \n" ++"POT-Creation-Date: 2009-05-26 19:03+0200\n" ++"PO-Revision-Date: 2009-05-19 17:33+0200\n" ++"Last-Translator: Jose Monteiro \n" ++"Language-Team: LANGUAGE \n" ++"Language: \n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"X-Generator: Pootle 1.1.0\n" ++ ++msgid "BSSID" ++msgstr "" ++ ++msgid "Bad (ETX > 10)" ++msgstr "" ++ ++msgid "Basic Settings" ++msgstr "" ++ ++msgid "Basic settings" ++msgstr "" ++ ++msgid "Basic settings are incomplete. Please go to" ++msgstr "" ++ ++msgid "Basic system settings" ++msgstr "" ++ ++msgid "Bitrate" ++msgstr "" ++ ++msgid "Channel" ++msgstr "" ++ ++msgid "Check for new firmware versions and perform automatic updates." ++msgstr "" ++ ++msgid "Client network size" ++msgstr "" ++ ++msgid "Community" ++msgstr "" ++ ++msgid "Community profile" ++msgstr "" ++ ++msgid "Community settings" ++msgstr "" ++ ++msgid "Confirm Upgrade" ++msgstr "" ++ ++msgid "Contact" ++msgstr "" ++ ++msgid "Contact information is incomplete. Please go to" ++msgstr "" ++ ++msgid "Coordinates" ++msgstr "Coordenadas" ++ ++msgid "Country code" ++msgstr "" ++ ++msgid "Default routes" ++msgstr "" ++ ++msgid "Disable default content" ++msgstr "" ++ ++msgid "Diversity is enabled for device" ++msgstr "" ++ ++msgid "E-Mail" ++msgstr "email" ++ ++msgid "ESSID" ++msgstr "" ++ ++msgid "Edit index page" ++msgstr "" ++ ++msgid "Enable IPv6" ++msgstr "" ++ ++msgid "Enable a virtual access point (VAP) by default if possible." ++msgstr "" ++ ++msgid "Error" ++msgstr "" ++ ++msgid "Find your coordinates with OpenStreetMap" ++msgstr "" ++ ++msgid "Freifunk" ++msgstr "" ++ ++msgid "Freifunk Overview" ++msgstr "" ++ ++msgid "Freifunk Remote Update" ++msgstr "" ++ ++msgid "Gateway" ++msgstr "" ++ ++msgid "Go to" ++msgstr "" ++ ++msgid "Good (2 < ETX < 4)" ++msgstr "" ++ ++msgid "Green" ++msgstr "" ++ ++msgid "Hello and welcome in the network of" ++msgstr "Olá e benvindo à rede " ++ ++msgid "Hide OpenStreetMap" ++msgstr "" ++ ++msgid "Homepage" ++msgstr "" ++ ++msgid "Hostname" ++msgstr "" ++ ++msgid "IPv6 Config" ++msgstr "" ++ ++msgid "IPv6 Prefix" ++msgstr "" ++ ++msgid "IPv6 network in CIDR notation." ++msgstr "" ++ ++msgid "If selected then the default content element is not shown." ++msgstr "" ++ ++msgid "If you are interested in our project then contact the local community" ++msgstr "" ++"Se estiver interessado no nosso projecto, entre em contacto com a sua " ++"comunidade local" ++ ++msgid "Index Page" ++msgstr "" ++ ++msgid "Interface" ++msgstr "" ++ ++msgid "" ++"Internet access depends on technical and organisational conditions and may " ++"or may not work for you." ++msgstr "" ++"O acesso à Internet depende de factores técnicos e organizacionais, e pode " ++"funcionar ou não no seu caso." ++ ++msgid "It is operated by" ++msgstr "É operado por " ++ ++msgid "Keep configuration" ++msgstr "" ++ ++msgid "Latitude" ++msgstr "" ++ ++msgid "Legend" ++msgstr "" ++ ++msgid "Load" ++msgstr "" ++ ++msgid "Local Time" ++msgstr "" ++ ++msgid "Location" ++msgstr "Localização" ++ ++msgid "Longitude" ++msgstr "" ++ ++msgid "Map" ++msgstr "" ++ ++msgid "Map Error" ++msgstr "" ++ ++msgid "Memory" ++msgstr "Memória" ++ ++msgid "Mesh prefix" ++msgstr "" ++ ++msgid "Metric" ++msgstr "" ++ ++msgid "Mode" ++msgstr "" ++ ++msgid "Network" ++msgstr "" ++ ++msgid "Network for client DHCP addresses" ++msgstr "" ++ ++msgid "Nickname" ++msgstr "Nome curto (nick)" ++ ++msgid "No default routes known." ++msgstr "" ++ ++msgid "Notice" ++msgstr "Notas" ++ ++msgid "OLSR" ++msgstr "" ++ ++msgid "Operator" ++msgstr "" ++ ++msgid "Orange" ++msgstr "" ++ ++msgid "Overview" ++msgstr "" ++ ++msgid "Package libiwinfo required!" ++msgstr "" ++ ++msgid "Phone" ++msgstr "Telefone" ++ ++msgid "Please fill in your contact details below." ++msgstr "" ++ ++msgid "Please set your contact information" ++msgstr "" ++ ++msgid "Power" ++msgstr "" ++ ++msgid "Processor" ++msgstr "" ++ ++msgid "Profile" ++msgstr "" ++ ++msgid "Profile (Expert)" ++msgstr "" ++ ++msgid "Realname" ++msgstr "Nome" ++ ++msgid "Red" ++msgstr "" ++ ++msgid "SSID" ++msgstr "" ++ ++msgid "" ++"Select your location with a mouse click on the map. The map will only show " ++"up if you are connected to the Internet." ++msgstr "" ++ ++msgid "Show OpenStreetMap" ++msgstr "" ++ ++msgid "Show on map" ++msgstr "" ++ ++msgid "Signal" ++msgstr "" ++ ++msgid "Splash" ++msgstr "" ++ ++msgid "Start Upgrade" ++msgstr "" ++ ++msgid "Statistics" ++msgstr "" ++ ++msgid "Status" ++msgstr "" ++ ++msgid "Still usable (4 < ETX < 10)" ++msgstr "" ++ ++msgid "System" ++msgstr "" ++ ++msgid "TX" ++msgstr "" ++ ++msgid "" ++"The libiwinfo package is not installed. You must install this " ++"component for working wireless configuration!" ++msgstr "" ++ ++msgid "" ++"The OLSRd service is not configured to capture position data from the " ++"network.
    Please make sure that the nameservice plugin is properly " ++"configured and that the latlon_file option is enabled." ++msgstr "" ++ ++msgid "The installed firmware is the most recent version." ++msgstr "" ++ ++msgid "" ++"These are the basic settings for your local wireless community. These " ++"settings define the default values for the wizard and DO NOT affect the " ++"actual configuration of the router." ++msgstr "" ++ ++msgid "These are the settings of your local community." ++msgstr "" ++ ++msgid "" ++"These pages will assist you in setting up your router for Freifunk or " ++"similar wireless community networks." ++msgstr "" ++ ++msgid "This is the access point" ++msgstr "Este é o ponto de acesso " ++ ++msgid "Update Settings" ++msgstr "" ++ ++msgid "Update available!" ++msgstr "" ++ ++msgid "Uptime" ++msgstr "" ++ ++msgid "VAP" ++msgstr "" ++ ++msgid "Verify downloaded images" ++msgstr "" ++ ++msgid "Very good (ETX < 2)" ++msgstr "" ++ ++msgid "" ++"We are an initiative to establish a free, independent and open wireless mesh " ++"network." ++msgstr "" ++"Somos uma iniciativa para implementação de uma rede livre, independente e " ++"não-comercial." ++ ++msgid "Wireless Overview" ++msgstr "" ++ ++msgid "Yellow" ++msgstr "" ++ ++msgid "" ++"You can display additional content on the public index page by inserting " ++"valid XHTML in the form below.
    Headlines should be enclosed between <" ++"h2> and </h2>." ++msgstr "" ++ ++msgid "" ++"You can find further information about the global Freifunk initiative at" ++msgstr "Pode encontrar mais informações sobre a iniciativa global Freifunk em " ++ ++msgid "You can manually edit the selected community profile here." ++msgstr "" ++ ++msgid "" ++"You need to select a profile before you can edit it. To select a profile go " ++"to" ++msgstr "" ++ ++msgid "and fill out all required fields." ++msgstr "" ++ ++msgid "buffered" ++msgstr "" ++ ++msgid "cached" ++msgstr "" ++ ++msgid "e.g." ++msgstr "" ++ ++msgid "free" ++msgstr "" ++ ++msgid "to disable it." ++msgstr "" ++ ++msgid "used" ++msgstr "" ++ ++msgid "wireless settings" ++msgstr "" +diff --git a/feeds/luci/modules/luci-mod-freifunk/po/ro/freifunk.po b/feeds/luci/modules/luci-mod-freifunk/po/ro/freifunk.po +new file mode 100644 +index 0000000..408abd8 +--- /dev/null ++++ b/feeds/luci/modules/luci-mod-freifunk/po/ro/freifunk.po +@@ -0,0 +1,395 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"PO-Revision-Date: 2014-06-29 19:53+0200\n" ++"Last-Translator: xxvirusxx \n" ++"Language-Team: none\n" ++"Language: ro\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=3; plural=(n==1 ? 0 : (n==0 || (n%100 > 0 && n%100 < " ++"20)) ? 1 : 2);;\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "BSSID" ++msgstr "BSSID" ++ ++msgid "Bad (ETX > 10)" ++msgstr "" ++ ++msgid "Basic Settings" ++msgstr "Setări de bază" ++ ++msgid "Basic settings" ++msgstr "Setări de bază" ++ ++msgid "Basic settings are incomplete. Please go to" ++msgstr "Setările de bază sunt incomplete. Mergi la" ++ ++msgid "Basic system settings" ++msgstr "" ++ ++msgid "Bitrate" ++msgstr "" ++ ++msgid "Channel" ++msgstr "Canal" ++ ++msgid "Check for new firmware versions and perform automatic updates." ++msgstr "" ++ ++msgid "Client network size" ++msgstr "" ++ ++msgid "Community" ++msgstr "Comunitate" ++ ++msgid "Community profile" ++msgstr "" ++ ++msgid "Community settings" ++msgstr "" ++ ++msgid "Confirm Upgrade" ++msgstr "" ++ ++msgid "Contact" ++msgstr "Contact" ++ ++msgid "Contact information is incomplete. Please go to" ++msgstr "" ++ ++msgid "Coordinates" ++msgstr "Coordonate" ++ ++msgid "Country code" ++msgstr "" ++ ++msgid "Default routes" ++msgstr "" ++ ++msgid "Disable default content" ++msgstr "" ++ ++msgid "Diversity is enabled for device" ++msgstr "" ++ ++msgid "E-Mail" ++msgstr "" ++ ++msgid "ESSID" ++msgstr "" ++ ++msgid "Edit index page" ++msgstr "" ++ ++msgid "Enable IPv6" ++msgstr "Activează IPv6" ++ ++msgid "Enable a virtual access point (VAP) by default if possible." ++msgstr "" ++ ++msgid "Error" ++msgstr "Eroare" ++ ++msgid "Find your coordinates with OpenStreetMap" ++msgstr "" ++ ++msgid "Freifunk" ++msgstr "" ++ ++msgid "Freifunk Overview" ++msgstr "" ++ ++msgid "Freifunk Remote Update" ++msgstr "" ++ ++msgid "Gateway" ++msgstr "" ++ ++msgid "Go to" ++msgstr "Du-te la" ++ ++msgid "Good (2 < ETX < 4)" ++msgstr "" ++ ++msgid "Green" ++msgstr "Verde" ++ ++msgid "Hello and welcome in the network of" ++msgstr "" ++ ++msgid "Hide OpenStreetMap" ++msgstr "" ++ ++msgid "Homepage" ++msgstr "" ++ ++msgid "Hostname" ++msgstr "" ++ ++msgid "IPv6 Config" ++msgstr "" ++ ++msgid "IPv6 Prefix" ++msgstr "" ++ ++msgid "IPv6 network in CIDR notation." ++msgstr "" ++ ++msgid "If selected then the default content element is not shown." ++msgstr "" ++ ++msgid "If you are interested in our project then contact the local community" ++msgstr "" ++ ++msgid "Index Page" ++msgstr "" ++ ++msgid "Interface" ++msgstr "Interfaţă" ++ ++msgid "" ++"Internet access depends on technical and organisational conditions and may " ++"or may not work for you." ++msgstr "" ++ ++msgid "It is operated by" ++msgstr "" ++ ++msgid "Keep configuration" ++msgstr "Păstrează configuraţia" ++ ++msgid "Latitude" ++msgstr "Latitudine" ++ ++msgid "Legend" ++msgstr "Legendă" ++ ++msgid "Load" ++msgstr "Încarcă" ++ ++msgid "Local Time" ++msgstr "Oră locală" ++ ++msgid "Location" ++msgstr "Locaţie" ++ ++msgid "Longitude" ++msgstr "Longitudine" ++ ++msgid "Map" ++msgstr "Hartă" ++ ++msgid "Map Error" ++msgstr "Eroare hartă" ++ ++msgid "Memory" ++msgstr "Memorie" ++ ++msgid "Mesh prefix" ++msgstr "" ++ ++msgid "Metric" ++msgstr "" ++ ++msgid "Mode" ++msgstr "Mod" ++ ++msgid "Network" ++msgstr "Reţea" ++ ++msgid "Network for client DHCP addresses" ++msgstr "" ++ ++msgid "Nickname" ++msgstr "Poreclă" ++ ++msgid "No default routes known." ++msgstr "" ++ ++msgid "Notice" ++msgstr "" ++ ++msgid "OLSR" ++msgstr "" ++ ++msgid "Operator" ++msgstr "" ++ ++msgid "Orange" ++msgstr "Portocaliu" ++ ++msgid "Overview" ++msgstr "" ++ ++msgid "Package libiwinfo required!" ++msgstr "" ++ ++msgid "Phone" ++msgstr "Telefon" ++ ++msgid "Please fill in your contact details below." ++msgstr "" ++ ++msgid "Please set your contact information" ++msgstr "" ++ ++msgid "Power" ++msgstr "Putere" ++ ++msgid "Processor" ++msgstr "Procesor" ++ ++msgid "Profile" ++msgstr "Profil" ++ ++msgid "Profile (Expert)" ++msgstr "" ++ ++msgid "Realname" ++msgstr "Nume real" ++ ++msgid "Red" ++msgstr "Roşu" ++ ++msgid "SSID" ++msgstr "SSID" ++ ++msgid "" ++"Select your location with a mouse click on the map. The map will only show " ++"up if you are connected to the Internet." ++msgstr "" ++ ++msgid "Show OpenStreetMap" ++msgstr "" ++ ++msgid "Show on map" ++msgstr "Arată pe hartă" ++ ++msgid "Signal" ++msgstr "Semnal" ++ ++msgid "Splash" ++msgstr "" ++ ++msgid "Start Upgrade" ++msgstr "" ++ ++msgid "Statistics" ++msgstr "Statistici" ++ ++msgid "Status" ++msgstr "Stare" ++ ++msgid "Still usable (4 < ETX < 10)" ++msgstr "" ++ ++msgid "System" ++msgstr "" ++ ++msgid "TX" ++msgstr "" ++ ++msgid "" ++"The libiwinfo package is not installed. You must install this " ++"component for working wireless configuration!" ++msgstr "" ++ ++msgid "" ++"The OLSRd service is not configured to capture position data from the " ++"network.
    Please make sure that the nameservice plugin is properly " ++"configured and that the latlon_file option is enabled." ++msgstr "" ++ ++msgid "The installed firmware is the most recent version." ++msgstr "Firmware-ul instalat este cea mai recentă versiune." ++ ++msgid "" ++"These are the basic settings for your local wireless community. These " ++"settings define the default values for the wizard and DO NOT affect the " ++"actual configuration of the router." ++msgstr "" ++ ++msgid "These are the settings of your local community." ++msgstr "" ++ ++msgid "" ++"These pages will assist you in setting up your router for Freifunk or " ++"similar wireless community networks." ++msgstr "" ++ ++msgid "This is the access point" ++msgstr "" ++ ++msgid "Update Settings" ++msgstr "" ++ ++msgid "Update available!" ++msgstr "" ++ ++msgid "Uptime" ++msgstr "" ++ ++msgid "VAP" ++msgstr "" ++ ++msgid "Verify downloaded images" ++msgstr "" ++ ++msgid "Very good (ETX < 2)" ++msgstr "" ++ ++msgid "" ++"We are an initiative to establish a free, independent and open wireless mesh " ++"network." ++msgstr "" ++ ++msgid "Wireless Overview" ++msgstr "" ++ ++msgid "Yellow" ++msgstr "Galben" ++ ++msgid "" ++"You can display additional content on the public index page by inserting " ++"valid XHTML in the form below.
    Headlines should be enclosed between <" ++"h2> and </h2>." ++msgstr "" ++ ++msgid "" ++"You can find further information about the global Freifunk initiative at" ++msgstr "" ++ ++msgid "You can manually edit the selected community profile here." ++msgstr "" ++ ++msgid "" ++"You need to select a profile before you can edit it. To select a profile go " ++"to" ++msgstr "" ++ ++msgid "and fill out all required fields." ++msgstr "ÅŸi completaÅ£i toate câmpurile" ++ ++msgid "buffered" ++msgstr "" ++ ++msgid "cached" ++msgstr "" ++ ++msgid "e.g." ++msgstr "ex." ++ ++msgid "free" ++msgstr "liber" ++ ++msgid "to disable it." ++msgstr "" ++ ++msgid "used" ++msgstr "folosit" ++ ++msgid "wireless settings" ++msgstr "setări wireless" +diff --git a/feeds/luci/modules/luci-mod-freifunk/po/ru/freifunk.po b/feeds/luci/modules/luci-mod-freifunk/po/ru/freifunk.po +new file mode 100644 +index 0000000..0943a3b +--- /dev/null ++++ b/feeds/luci/modules/luci-mod-freifunk/po/ru/freifunk.po +@@ -0,0 +1,451 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: LuCI: freifunk\n" ++"Report-Msgid-Bugs-To: \n" ++"POT-Creation-Date: 2009-05-19 19:36+0200\n" ++"PO-Revision-Date: 2013-09-06 09:41+0200\n" ++"Last-Translator: datasheet \n" ++"Language-Team: Russian \n" ++"Language: ru\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%" ++"10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" ++"X-Generator: Pootle 2.0.6\n" ++"X-Poedit-SourceCharset: UTF-8\n" ++ ++msgid "BSSID" ++msgstr "BSSID" ++ ++msgid "Bad (ETX > 10)" ++msgstr "Плохой (ETX > 10)" ++ ++msgid "Basic Settings" ++msgstr "Базовые наÑтройки" ++ ++msgid "Basic settings" ++msgstr "Базовые наÑтройки" ++ ++msgid "Basic settings are incomplete. Please go to" ++msgstr "Базовые наÑтройки не верны. ПожалуйÑта, перейдите в" ++ ++msgid "Basic system settings" ++msgstr "ОÑновные наÑтройки ÑиÑтемы" ++ ++msgid "Bitrate" ++msgstr "СкороÑÑ‚ÑŒ" ++ ++msgid "Channel" ++msgstr "Канал" ++ ++msgid "Check for new firmware versions and perform automatic updates." ++msgstr "" ++"Проверить наличие новой верÑии прошивки и выполнить автоматичеÑкое " ++"обновление." ++ ++msgid "Client network size" ++msgstr "Размер клиентÑкой Ñети" ++ ++msgid "Community" ++msgstr "СообщеÑтво" ++ ++msgid "Community profile" ++msgstr "Профиль ÑообщеÑтва" ++ ++msgid "Community settings" ++msgstr "ÐаÑтройки ÑообщеÑтва" ++ ++msgid "Confirm Upgrade" ++msgstr "Подтвердить обновление" ++ ++msgid "Contact" ++msgstr "ÐšÐ¾Ð½Ñ‚Ð°ÐºÑ‚Ð½Ð°Ñ Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ" ++ ++msgid "Contact information is incomplete. Please go to" ++msgstr "ÐšÐ¾Ð½Ñ‚Ð°ÐºÑ‚Ð½Ð°Ñ Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð½Ðµ верна. ПожалуйÑта, перейдите в" ++ ++msgid "Coordinates" ++msgstr "Координаты" ++ ++msgid "Country code" ++msgstr "Код Ñтраны" ++ ++msgid "Default routes" ++msgstr "Маршруты по умолчанию" ++ ++msgid "Disable default content" ++msgstr "Запретить контент по умолчанию" ++ ++msgid "Diversity is enabled for device" ++msgstr "ÐеопределенноÑÑ‚ÑŒ пути включена" ++ ++msgid "E-Mail" ++msgstr "Эл. почта" ++ ++msgid "ESSID" ++msgstr "ESSID" ++ ++msgid "Edit index page" ++msgstr "Редактировать главную Ñтраницу" ++ ++msgid "Enable IPv6" ++msgstr "Включить IPv6" ++ ++msgid "Enable a virtual access point (VAP) by default if possible." ++msgstr "" ++ ++msgid "Error" ++msgstr "Ошибка" ++ ++msgid "Find your coordinates with OpenStreetMap" ++msgstr "Ðайдите Ñвои координаты Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ OpenStreetMap" ++ ++msgid "Freifunk" ++msgstr "Freifunk" ++ ++msgid "Freifunk Overview" ++msgstr "Обзор Freifunk" ++ ++msgid "Freifunk Remote Update" ++msgstr "Удалённое обновление Freifunk" ++ ++msgid "Gateway" ++msgstr "Шлюз" ++ ++msgid "Go to" ++msgstr "Перейти" ++ ++msgid "Good (2 < ETX < 4)" ++msgstr "Хороший (2 < ETX < 4)" ++ ++#, fuzzy ++msgid "Green" ++msgstr "Зелёный" ++ ++msgid "Hello and welcome in the network of" ++msgstr "ЗдравÑтвуйте и добро пожаловать в Ñеть" ++ ++msgid "Hide OpenStreetMap" ++msgstr "Скрыть OpenStreetMap" ++ ++msgid "Homepage" ++msgstr "ДомашнÑÑ Ñтраница" ++ ++msgid "Hostname" ++msgstr "Ð˜Ð¼Ñ Ñ…Ð¾Ñта" ++ ++#, fuzzy ++msgid "IPv6 Config" ++msgstr "ÐšÐ¾Ð½Ñ„Ð¸Ð³ÑƒÑ€Ð°Ñ†Ð¸Ñ IPv6" ++ ++msgid "IPv6 Prefix" ++msgstr "ÐŸÑ€ÐµÑ„Ð¸ÐºÑ IPv6" ++ ++msgid "IPv6 network in CIDR notation." ++msgstr "Сеть IPv6 в CIDR-нотации" ++ ++msgid "If selected then the default content element is not shown." ++msgstr "ЕÑли выбрано, Ñодержимое по умолчанию не будет показано." ++ ++msgid "If you are interested in our project then contact the local community" ++msgstr "" ++"ЕÑли вы заинтереÑованы в нашем проекте, ÑвÑжитеÑÑŒ Ñ Ð¼ÐµÑтным ÑообщеÑтвом" ++ ++msgid "Index Page" ++msgstr "Ð“Ð»Ð°Ð²Ð½Ð°Ñ Ñтраница" ++ ++msgid "Interface" ++msgstr "ИнтерфейÑ" ++ ++msgid "" ++"Internet access depends on technical and organisational conditions and may " ++"or may not work for you." ++msgstr "" ++"ДоÑтуп в интернет завиÑит от техничеÑких и организационных уÑловий и может " ++"быть не доÑтупен Ð´Ð»Ñ Ð²Ð°Ñ." ++ ++# It - access point ++msgid "It is operated by" ++msgstr "Она управлÑетÑÑ" ++ ++msgid "Keep configuration" ++msgstr "Сохранить конфигурацию" ++ ++msgid "Latitude" ++msgstr "Широта" ++ ++msgid "Legend" ++msgstr "ÐадпиÑÑŒ" ++ ++msgid "Load" ++msgstr "Загрузка" ++ ++msgid "Local Time" ++msgstr "МеÑтное времÑ" ++ ++msgid "Location" ++msgstr "МеÑтоположение" ++ ++msgid "Longitude" ++msgstr "Долгота" ++ ++msgid "Map" ++msgstr "Карта" ++ ++msgid "Map Error" ++msgstr "Ошибка карты" ++ ++msgid "Memory" ++msgstr "ПамÑÑ‚ÑŒ" ++ ++msgid "Mesh prefix" ++msgstr "ÐŸÑ€ÐµÑ„Ð¸ÐºÑ Ñчейки" ++ ++msgid "Metric" ++msgstr "Метрика" ++ ++msgid "Mode" ++msgstr "Режим" ++ ++msgid "Network" ++msgstr "Сеть" ++ ++msgid "Network for client DHCP addresses" ++msgstr "Сеть Ð´Ð»Ñ ÐºÐ»Ð¸ÐµÐ½Ñ‚Ñких DHCP-адреÑов" ++ ++msgid "Nickname" ++msgstr "ПÑевдоним" ++ ++msgid "No default routes known." ++msgstr "Маршруты по умолчанию не извеÑтны." ++ ++msgid "Notice" ++msgstr "Внимание" ++ ++msgid "OLSR" ++msgstr "OLSR" ++ ++msgid "Operator" ++msgstr "Оператор" ++ ++#, fuzzy ++msgid "Orange" ++msgstr "Оранжевый" ++ ++msgid "Overview" ++msgstr "Обзор" ++ ++msgid "Package libiwinfo required!" ++msgstr "ТребуетÑÑ libiwinfo!" ++ ++msgid "Phone" ++msgstr "Телефон" ++ ++msgid "Please fill in your contact details below." ++msgstr "ПожалуйÑта, введите вашу контактную информацию." ++ ++msgid "Please set your contact information" ++msgstr "ПожалуйÑта, введите вашу контактную информацию" ++ ++msgid "Power" ++msgstr "Питание" ++ ++msgid "Processor" ++msgstr "ПроцеÑÑор" ++ ++msgid "Profile" ++msgstr "Профиль" ++ ++msgid "Profile (Expert)" ++msgstr "Профиль (ÑкÑперт)" ++ ++msgid "Realname" ++msgstr "ИмÑ" ++ ++#, fuzzy ++msgid "Red" ++msgstr "КраÑный" ++ ++msgid "SSID" ++msgstr "SSID" ++ ++msgid "" ++"Select your location with a mouse click on the map. The map will only show " ++"up if you are connected to the Internet." ++msgstr "" ++"Укажите ваше меÑтоположение на карте Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ щелчка мыши. Карта будет " ++"показана только еÑли вы подключены к интернету." ++ ++msgid "Show OpenStreetMap" ++msgstr "Показать карту OpenStreetMap" ++ ++msgid "Show on map" ++msgstr "Показать на карте" ++ ++msgid "Signal" ++msgstr "Сигнал" ++ ++msgid "Splash" ++msgstr "Splash-Ñкран" ++ ++msgid "Start Upgrade" ++msgstr "Ðачать обновление" ++ ++msgid "Statistics" ++msgstr "СтатиÑтика" ++ ++msgid "Status" ++msgstr "СтатуÑ" ++ ++msgid "Still usable (4 < ETX < 10)" ++msgstr "" ++ ++msgid "System" ++msgstr "СиÑтема" ++ ++msgid "TX" ++msgstr "TX" ++ ++msgid "" ++"The libiwinfo package is not installed. You must install this " ++"component for working wireless configuration!" ++msgstr "" ++"Пакет libiwinfo-lua не уÑтановлен. Ð”Ð»Ñ Ð²ÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ Ð½Ð°Ñтроек " ++"беÑпроводных Ñетей, вам необходимо уÑтановить Ñтот компонент!" ++ ++msgid "" ++"The OLSRd service is not configured to capture position data from the " ++"network.
    Please make sure that the nameservice plugin is properly " ++"configured and that the latlon_file option is enabled." ++msgstr "" ++"Ð¡ÐµÑ€Ð²Ð¸Ñ OLSRd не Ñконфигурирован на получение данных о меÑтоположении из Ñети." ++"
    ПожалуйÑта, удоÑтоверьтеÑÑŒ, что модуль проÑтранÑтва имён наÑтроен " ++"правильно и что Ð¾Ð¿Ñ†Ð¸Ñ latlon_file включена." ++ ++msgid "The installed firmware is the most recent version." ++msgstr "УÑтановлена прошивка Ñамой поÑледней верÑии." ++ ++msgid "" ++"These are the basic settings for your local wireless community. These " ++"settings define the default values for the wizard and DO NOT affect the " ++"actual configuration of the router." ++msgstr "" ++"Это базовые наÑтройки вашего ÑообщеÑтва. Они определÑÑŽÑ‚ Ñтандартные " ++"наÑтройки Ð´Ð»Ñ Ð¼Ð°Ñтера уÑтановки и ÐЕ влиÑÑŽÑ‚ на конечную конфигурацию " ++"маршрутизатора." ++ ++msgid "These are the settings of your local community." ++msgstr "Это наÑтройки Ð´Ð»Ñ Ð²Ð°ÑˆÐµÐ³Ð¾ ÑообщеÑтва." ++ ++msgid "" ++"These pages will assist you in setting up your router for Freifunk or " ++"similar wireless community networks." ++msgstr "" ++"Эти Ñтраницы помогут наÑтроить ваш маршрутизатор Ð´Ð»Ñ Freifunk или подобной " ++"беÑпроводной Ñети." ++ ++msgid "This is the access point" ++msgstr "Это - точка доÑтупа" ++ ++msgid "Update Settings" ++msgstr "ÐаÑтройки обновлениÑ" ++ ++msgid "Update available!" ++msgstr "ДоÑтупно обновление!" ++ ++msgid "Uptime" ++msgstr "Ð’Ñ€ÐµÐ¼Ñ Ñ€Ð°Ð±Ð¾Ñ‚Ñ‹" ++ ++msgid "VAP" ++msgstr "" ++ ++msgid "Verify downloaded images" ++msgstr "ПроверÑÑ‚ÑŒ загруженные образы" ++ ++msgid "Very good (ETX < 2)" ++msgstr "Очень хороший (ETX < 2)" ++ ++msgid "" ++"We are an initiative to establish a free, independent and open wireless mesh " ++"network." ++msgstr "" ++"Мы - Ñто ÑообщеÑтво, цель которого Ñоздать беÑплатную, незавиÑимую и " ++"открытую беÑпроводную ÑчеиÑтую Ñеть." ++ ++msgid "Wireless Overview" ++msgstr "Обзор беÑпроводных Ñетей" ++ ++#, fuzzy ++msgid "Yellow" ++msgstr "Жёлтый" ++ ++msgid "" ++"You can display additional content on the public index page by inserting " ++"valid XHTML in the form below.
    Headlines should be enclosed between <" ++"h2> and </h2>." ++msgstr "" ++"У Ð²Ð°Ñ ÐµÑÑ‚ÑŒ возможноÑÑ‚ÑŒ уÑтановить дополнительное Ñодержимое публичной " ++"Ñтраницы, вÑтавив ÑоответÑтвующий XHTML-код в форму.
    Заголовки должны " ++"быть заключены между <h2> и </h2>." ++ ++msgid "" ++"You can find further information about the global Freifunk initiative at" ++msgstr "Ð’Ñ‹ можете найти дополнительную информацию о Freifunk по адреÑу" ++ ++msgid "You can manually edit the selected community profile here." ++msgstr "ЗдеÑÑŒ вы можете редактировать выбранный профиль ÑообщеÑтва." ++ ++msgid "" ++"You need to select a profile before you can edit it. To select a profile go " ++"to" ++msgstr "" ++"Ðеобходимо выбрать профиль перед его редактированием. Чтобы выбрать профиль, " ++"перейдите в" ++ ++msgid "and fill out all required fields." ++msgstr "и заполните вÑе необходимые полÑ." ++ ++msgid "buffered" ++msgstr "буферизировано" ++ ++msgid "cached" ++msgstr "кÑшировано" ++ ++msgid "e.g." ++msgstr "напр." ++ ++msgid "free" ++msgstr "Ñвободно" ++ ++msgid "to disable it." ++msgstr "чтобы выключить." ++ ++msgid "used" ++msgstr "иÑпользовано" ++ ++msgid "wireless settings" ++msgstr "наÑтройки беÑпроводной Ñети" ++ ++#~ msgid "" ++#~ "No services can be shown, because olsrd is not running or the olsrd-" ++#~ "nameservice Plugin is not loaded." ++#~ msgstr "" ++#~ "Ð¡ÐµÑ€Ð²Ð¸Ñ Ð½Ðµ может быть показан, так как oslrd не запущен или модуль olsrd-" ++#~ "nameservice не загружен." ++ ++#~ msgid "Services" ++#~ msgstr "Службы" ++ ++#~ msgid "Source" ++#~ msgstr "ИÑточник" ++ ++#~ msgid "" ++#~ "The libiwinfo-lua package is not installed. You must install " ++#~ "this component for working wireless configuration!" ++#~ msgstr "" ++#~ "Пакет libiwinfo-lua не уÑтановлен. Вам необходимо уÑтановить " ++#~ "Ñтот компонент Ð´Ð»Ñ Ð½Ð°Ñтройки беÑпроводной Ñети!" ++ ++#~ msgid "Url" ++#~ msgstr "Url" +diff --git a/feeds/luci/modules/luci-mod-freifunk/po/sk/freifunk.po b/feeds/luci/modules/luci-mod-freifunk/po/sk/freifunk.po +new file mode 100644 +index 0000000..343f022 +--- /dev/null ++++ b/feeds/luci/modules/luci-mod-freifunk/po/sk/freifunk.po +@@ -0,0 +1,391 @@ ++msgid "" ++msgstr "" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Last-Translator: Automatically generated\n" ++"Language-Team: none\n" ++"MIME-Version: 1.0\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n" ++ ++msgid "BSSID" ++msgstr "" ++ ++msgid "Bad (ETX > 10)" ++msgstr "" ++ ++msgid "Basic Settings" ++msgstr "" ++ ++msgid "Basic settings" ++msgstr "" ++ ++msgid "Basic settings are incomplete. Please go to" ++msgstr "" ++ ++msgid "Basic system settings" ++msgstr "" ++ ++msgid "Bitrate" ++msgstr "" ++ ++msgid "Channel" ++msgstr "" ++ ++msgid "Check for new firmware versions and perform automatic updates." ++msgstr "" ++ ++msgid "Client network size" ++msgstr "" ++ ++msgid "Community" ++msgstr "" ++ ++msgid "Community profile" ++msgstr "" ++ ++msgid "Community settings" ++msgstr "" ++ ++msgid "Confirm Upgrade" ++msgstr "" ++ ++msgid "Contact" ++msgstr "" ++ ++msgid "Contact information is incomplete. Please go to" ++msgstr "" ++ ++msgid "Coordinates" ++msgstr "" ++ ++msgid "Country code" ++msgstr "" ++ ++msgid "Default routes" ++msgstr "" ++ ++msgid "Disable default content" ++msgstr "" ++ ++msgid "Diversity is enabled for device" ++msgstr "" ++ ++msgid "E-Mail" ++msgstr "" ++ ++msgid "ESSID" ++msgstr "" ++ ++msgid "Edit index page" ++msgstr "" ++ ++msgid "Enable IPv6" ++msgstr "" ++ ++msgid "Enable a virtual access point (VAP) by default if possible." ++msgstr "" ++ ++msgid "Error" ++msgstr "" ++ ++msgid "Find your coordinates with OpenStreetMap" ++msgstr "" ++ ++msgid "Freifunk" ++msgstr "" ++ ++msgid "Freifunk Overview" ++msgstr "" ++ ++msgid "Freifunk Remote Update" ++msgstr "" ++ ++msgid "Gateway" ++msgstr "" ++ ++msgid "Go to" ++msgstr "" ++ ++msgid "Good (2 < ETX < 4)" ++msgstr "" ++ ++msgid "Green" ++msgstr "" ++ ++msgid "Hello and welcome in the network of" ++msgstr "" ++ ++msgid "Hide OpenStreetMap" ++msgstr "" ++ ++msgid "Homepage" ++msgstr "" ++ ++msgid "Hostname" ++msgstr "" ++ ++msgid "IPv6 Config" ++msgstr "" ++ ++msgid "IPv6 Prefix" ++msgstr "" ++ ++msgid "IPv6 network in CIDR notation." ++msgstr "" ++ ++msgid "If selected then the default content element is not shown." ++msgstr "" ++ ++msgid "If you are interested in our project then contact the local community" ++msgstr "" ++ ++msgid "Index Page" ++msgstr "" ++ ++msgid "Interface" ++msgstr "" ++ ++msgid "" ++"Internet access depends on technical and organisational conditions and may " ++"or may not work for you." ++msgstr "" ++ ++msgid "It is operated by" ++msgstr "" ++ ++msgid "Keep configuration" ++msgstr "" ++ ++msgid "Latitude" ++msgstr "" ++ ++msgid "Legend" ++msgstr "" ++ ++msgid "Load" ++msgstr "" ++ ++msgid "Local Time" ++msgstr "" ++ ++msgid "Location" ++msgstr "" ++ ++msgid "Longitude" ++msgstr "" ++ ++msgid "Map" ++msgstr "" ++ ++msgid "Map Error" ++msgstr "" ++ ++msgid "Memory" ++msgstr "" ++ ++msgid "Mesh prefix" ++msgstr "" ++ ++msgid "Metric" ++msgstr "" ++ ++msgid "Mode" ++msgstr "" ++ ++msgid "Network" ++msgstr "" ++ ++msgid "Network for client DHCP addresses" ++msgstr "" ++ ++msgid "Nickname" ++msgstr "" ++ ++msgid "No default routes known." ++msgstr "" ++ ++msgid "Notice" ++msgstr "" ++ ++msgid "OLSR" ++msgstr "" ++ ++msgid "Operator" ++msgstr "" ++ ++msgid "Orange" ++msgstr "" ++ ++msgid "Overview" ++msgstr "" ++ ++msgid "Package libiwinfo required!" ++msgstr "" ++ ++msgid "Phone" ++msgstr "" ++ ++msgid "Please fill in your contact details below." ++msgstr "" ++ ++msgid "Please set your contact information" ++msgstr "" ++ ++msgid "Power" ++msgstr "" ++ ++msgid "Processor" ++msgstr "" ++ ++msgid "Profile" ++msgstr "" ++ ++msgid "Profile (Expert)" ++msgstr "" ++ ++msgid "Realname" ++msgstr "" ++ ++msgid "Red" ++msgstr "" ++ ++msgid "SSID" ++msgstr "" ++ ++msgid "" ++"Select your location with a mouse click on the map. The map will only show " ++"up if you are connected to the Internet." ++msgstr "" ++ ++msgid "Show OpenStreetMap" ++msgstr "" ++ ++msgid "Show on map" ++msgstr "" ++ ++msgid "Signal" ++msgstr "" ++ ++msgid "Splash" ++msgstr "" ++ ++msgid "Start Upgrade" ++msgstr "" ++ ++msgid "Statistics" ++msgstr "" ++ ++msgid "Status" ++msgstr "" ++ ++msgid "Still usable (4 < ETX < 10)" ++msgstr "" ++ ++msgid "System" ++msgstr "" ++ ++msgid "TX" ++msgstr "" ++ ++msgid "" ++"The libiwinfo package is not installed. You must install this " ++"component for working wireless configuration!" ++msgstr "" ++ ++msgid "" ++"The OLSRd service is not configured to capture position data from the " ++"network.
    Please make sure that the nameservice plugin is properly " ++"configured and that the latlon_file option is enabled." ++msgstr "" ++ ++msgid "The installed firmware is the most recent version." ++msgstr "" ++ ++msgid "" ++"These are the basic settings for your local wireless community. These " ++"settings define the default values for the wizard and DO NOT affect the " ++"actual configuration of the router." ++msgstr "" ++ ++msgid "These are the settings of your local community." ++msgstr "" ++ ++msgid "" ++"These pages will assist you in setting up your router for Freifunk or " ++"similar wireless community networks." ++msgstr "" ++ ++msgid "This is the access point" ++msgstr "" ++ ++msgid "Update Settings" ++msgstr "" ++ ++msgid "Update available!" ++msgstr "" ++ ++msgid "Uptime" ++msgstr "" ++ ++msgid "VAP" ++msgstr "" ++ ++msgid "Verify downloaded images" ++msgstr "" ++ ++msgid "Very good (ETX < 2)" ++msgstr "" ++ ++msgid "" ++"We are an initiative to establish a free, independent and open wireless mesh " ++"network." ++msgstr "" ++ ++msgid "Wireless Overview" ++msgstr "" ++ ++msgid "Yellow" ++msgstr "" ++ ++msgid "" ++"You can display additional content on the public index page by inserting " ++"valid XHTML in the form below.
    Headlines should be enclosed between <" ++"h2> and </h2>." ++msgstr "" ++ ++msgid "" ++"You can find further information about the global Freifunk initiative at" ++msgstr "" ++ ++msgid "You can manually edit the selected community profile here." ++msgstr "" ++ ++msgid "" ++"You need to select a profile before you can edit it. To select a profile go " ++"to" ++msgstr "" ++ ++msgid "and fill out all required fields." ++msgstr "" ++ ++msgid "buffered" ++msgstr "" ++ ++msgid "cached" ++msgstr "" ++ ++msgid "e.g." ++msgstr "" ++ ++msgid "free" ++msgstr "" ++ ++msgid "to disable it." ++msgstr "" ++ ++msgid "used" ++msgstr "" ++ ++msgid "wireless settings" ++msgstr "" +diff --git a/feeds/luci/modules/luci-mod-freifunk/po/sv/freifunk.po b/feeds/luci/modules/luci-mod-freifunk/po/sv/freifunk.po +new file mode 100644 +index 0000000..cf42fa1 +--- /dev/null ++++ b/feeds/luci/modules/luci-mod-freifunk/po/sv/freifunk.po +@@ -0,0 +1,392 @@ ++msgid "" ++msgstr "" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Last-Translator: Automatically generated\n" ++"Language-Team: none\n" ++"Language: sv\n" ++"MIME-Version: 1.0\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=(n != 1);\n" ++ ++msgid "BSSID" ++msgstr "" ++ ++msgid "Bad (ETX > 10)" ++msgstr "" ++ ++msgid "Basic Settings" ++msgstr "" ++ ++msgid "Basic settings" ++msgstr "" ++ ++msgid "Basic settings are incomplete. Please go to" ++msgstr "" ++ ++msgid "Basic system settings" ++msgstr "" ++ ++msgid "Bitrate" ++msgstr "" ++ ++msgid "Channel" ++msgstr "" ++ ++msgid "Check for new firmware versions and perform automatic updates." ++msgstr "" ++ ++msgid "Client network size" ++msgstr "" ++ ++msgid "Community" ++msgstr "" ++ ++msgid "Community profile" ++msgstr "" ++ ++msgid "Community settings" ++msgstr "" ++ ++msgid "Confirm Upgrade" ++msgstr "" ++ ++msgid "Contact" ++msgstr "" ++ ++msgid "Contact information is incomplete. Please go to" ++msgstr "" ++ ++msgid "Coordinates" ++msgstr "" ++ ++msgid "Country code" ++msgstr "" ++ ++msgid "Default routes" ++msgstr "" ++ ++msgid "Disable default content" ++msgstr "" ++ ++msgid "Diversity is enabled for device" ++msgstr "" ++ ++msgid "E-Mail" ++msgstr "" ++ ++msgid "ESSID" ++msgstr "" ++ ++msgid "Edit index page" ++msgstr "" ++ ++msgid "Enable IPv6" ++msgstr "" ++ ++msgid "Enable a virtual access point (VAP) by default if possible." ++msgstr "" ++ ++msgid "Error" ++msgstr "" ++ ++msgid "Find your coordinates with OpenStreetMap" ++msgstr "" ++ ++msgid "Freifunk" ++msgstr "" ++ ++msgid "Freifunk Overview" ++msgstr "" ++ ++msgid "Freifunk Remote Update" ++msgstr "" ++ ++msgid "Gateway" ++msgstr "" ++ ++msgid "Go to" ++msgstr "" ++ ++msgid "Good (2 < ETX < 4)" ++msgstr "" ++ ++msgid "Green" ++msgstr "" ++ ++msgid "Hello and welcome in the network of" ++msgstr "" ++ ++msgid "Hide OpenStreetMap" ++msgstr "" ++ ++msgid "Homepage" ++msgstr "" ++ ++msgid "Hostname" ++msgstr "" ++ ++msgid "IPv6 Config" ++msgstr "" ++ ++msgid "IPv6 Prefix" ++msgstr "" ++ ++msgid "IPv6 network in CIDR notation." ++msgstr "" ++ ++msgid "If selected then the default content element is not shown." ++msgstr "" ++ ++msgid "If you are interested in our project then contact the local community" ++msgstr "" ++ ++msgid "Index Page" ++msgstr "" ++ ++msgid "Interface" ++msgstr "" ++ ++msgid "" ++"Internet access depends on technical and organisational conditions and may " ++"or may not work for you." ++msgstr "" ++ ++msgid "It is operated by" ++msgstr "" ++ ++msgid "Keep configuration" ++msgstr "" ++ ++msgid "Latitude" ++msgstr "" ++ ++msgid "Legend" ++msgstr "" ++ ++msgid "Load" ++msgstr "" ++ ++msgid "Local Time" ++msgstr "" ++ ++msgid "Location" ++msgstr "" ++ ++msgid "Longitude" ++msgstr "" ++ ++msgid "Map" ++msgstr "" ++ ++msgid "Map Error" ++msgstr "" ++ ++msgid "Memory" ++msgstr "" ++ ++msgid "Mesh prefix" ++msgstr "" ++ ++msgid "Metric" ++msgstr "" ++ ++msgid "Mode" ++msgstr "" ++ ++msgid "Network" ++msgstr "" ++ ++msgid "Network for client DHCP addresses" ++msgstr "" ++ ++msgid "Nickname" ++msgstr "" ++ ++msgid "No default routes known." ++msgstr "" ++ ++msgid "Notice" ++msgstr "" ++ ++msgid "OLSR" ++msgstr "" ++ ++msgid "Operator" ++msgstr "" ++ ++msgid "Orange" ++msgstr "" ++ ++msgid "Overview" ++msgstr "" ++ ++msgid "Package libiwinfo required!" ++msgstr "" ++ ++msgid "Phone" ++msgstr "" ++ ++msgid "Please fill in your contact details below." ++msgstr "" ++ ++msgid "Please set your contact information" ++msgstr "" ++ ++msgid "Power" ++msgstr "" ++ ++msgid "Processor" ++msgstr "" ++ ++msgid "Profile" ++msgstr "" ++ ++msgid "Profile (Expert)" ++msgstr "" ++ ++msgid "Realname" ++msgstr "" ++ ++msgid "Red" ++msgstr "" ++ ++msgid "SSID" ++msgstr "" ++ ++msgid "" ++"Select your location with a mouse click on the map. The map will only show " ++"up if you are connected to the Internet." ++msgstr "" ++ ++msgid "Show OpenStreetMap" ++msgstr "" ++ ++msgid "Show on map" ++msgstr "" ++ ++msgid "Signal" ++msgstr "" ++ ++msgid "Splash" ++msgstr "" ++ ++msgid "Start Upgrade" ++msgstr "" ++ ++msgid "Statistics" ++msgstr "" ++ ++msgid "Status" ++msgstr "" ++ ++msgid "Still usable (4 < ETX < 10)" ++msgstr "" ++ ++msgid "System" ++msgstr "" ++ ++msgid "TX" ++msgstr "" ++ ++msgid "" ++"The libiwinfo package is not installed. You must install this " ++"component for working wireless configuration!" ++msgstr "" ++ ++msgid "" ++"The OLSRd service is not configured to capture position data from the " ++"network.
    Please make sure that the nameservice plugin is properly " ++"configured and that the latlon_file option is enabled." ++msgstr "" ++ ++msgid "The installed firmware is the most recent version." ++msgstr "" ++ ++msgid "" ++"These are the basic settings for your local wireless community. These " ++"settings define the default values for the wizard and DO NOT affect the " ++"actual configuration of the router." ++msgstr "" ++ ++msgid "These are the settings of your local community." ++msgstr "" ++ ++msgid "" ++"These pages will assist you in setting up your router for Freifunk or " ++"similar wireless community networks." ++msgstr "" ++ ++msgid "This is the access point" ++msgstr "" ++ ++msgid "Update Settings" ++msgstr "" ++ ++msgid "Update available!" ++msgstr "" ++ ++msgid "Uptime" ++msgstr "" ++ ++msgid "VAP" ++msgstr "" ++ ++msgid "Verify downloaded images" ++msgstr "" ++ ++msgid "Very good (ETX < 2)" ++msgstr "" ++ ++msgid "" ++"We are an initiative to establish a free, independent and open wireless mesh " ++"network." ++msgstr "" ++ ++msgid "Wireless Overview" ++msgstr "" ++ ++msgid "Yellow" ++msgstr "" ++ ++msgid "" ++"You can display additional content on the public index page by inserting " ++"valid XHTML in the form below.
    Headlines should be enclosed between <" ++"h2> and </h2>." ++msgstr "" ++ ++msgid "" ++"You can find further information about the global Freifunk initiative at" ++msgstr "" ++ ++msgid "You can manually edit the selected community profile here." ++msgstr "" ++ ++msgid "" ++"You need to select a profile before you can edit it. To select a profile go " ++"to" ++msgstr "" ++ ++msgid "and fill out all required fields." ++msgstr "" ++ ++msgid "buffered" ++msgstr "" ++ ++msgid "cached" ++msgstr "" ++ ++msgid "e.g." ++msgstr "" ++ ++msgid "free" ++msgstr "" ++ ++msgid "to disable it." ++msgstr "" ++ ++msgid "used" ++msgstr "" ++ ++msgid "wireless settings" ++msgstr "" +diff --git a/feeds/luci/modules/luci-mod-freifunk/po/tr/freifunk.po b/feeds/luci/modules/luci-mod-freifunk/po/tr/freifunk.po +new file mode 100644 +index 0000000..f485e01 +--- /dev/null ++++ b/feeds/luci/modules/luci-mod-freifunk/po/tr/freifunk.po +@@ -0,0 +1,392 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Last-Translator: Automatically generated\n" ++"Language-Team: none\n" ++"Language: \n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=1; plural=0;\n" ++ ++msgid "BSSID" ++msgstr "" ++ ++msgid "Bad (ETX > 10)" ++msgstr "" ++ ++msgid "Basic Settings" ++msgstr "" ++ ++msgid "Basic settings" ++msgstr "" ++ ++msgid "Basic settings are incomplete. Please go to" ++msgstr "" ++ ++msgid "Basic system settings" ++msgstr "" ++ ++msgid "Bitrate" ++msgstr "" ++ ++msgid "Channel" ++msgstr "" ++ ++msgid "Check for new firmware versions and perform automatic updates." ++msgstr "" ++ ++msgid "Client network size" ++msgstr "" ++ ++msgid "Community" ++msgstr "" ++ ++msgid "Community profile" ++msgstr "" ++ ++msgid "Community settings" ++msgstr "" ++ ++msgid "Confirm Upgrade" ++msgstr "" ++ ++msgid "Contact" ++msgstr "" ++ ++msgid "Contact information is incomplete. Please go to" ++msgstr "" ++ ++msgid "Coordinates" ++msgstr "" ++ ++msgid "Country code" ++msgstr "" ++ ++msgid "Default routes" ++msgstr "" ++ ++msgid "Disable default content" ++msgstr "" ++ ++msgid "Diversity is enabled for device" ++msgstr "" ++ ++msgid "E-Mail" ++msgstr "" ++ ++msgid "ESSID" ++msgstr "" ++ ++msgid "Edit index page" ++msgstr "" ++ ++msgid "Enable IPv6" ++msgstr "" ++ ++msgid "Enable a virtual access point (VAP) by default if possible." ++msgstr "" ++ ++msgid "Error" ++msgstr "" ++ ++msgid "Find your coordinates with OpenStreetMap" ++msgstr "" ++ ++msgid "Freifunk" ++msgstr "" ++ ++msgid "Freifunk Overview" ++msgstr "" ++ ++msgid "Freifunk Remote Update" ++msgstr "" ++ ++msgid "Gateway" ++msgstr "" ++ ++msgid "Go to" ++msgstr "" ++ ++msgid "Good (2 < ETX < 4)" ++msgstr "" ++ ++msgid "Green" ++msgstr "" ++ ++msgid "Hello and welcome in the network of" ++msgstr "" ++ ++msgid "Hide OpenStreetMap" ++msgstr "" ++ ++msgid "Homepage" ++msgstr "" ++ ++msgid "Hostname" ++msgstr "" ++ ++msgid "IPv6 Config" ++msgstr "" ++ ++msgid "IPv6 Prefix" ++msgstr "" ++ ++msgid "IPv6 network in CIDR notation." ++msgstr "" ++ ++msgid "If selected then the default content element is not shown." ++msgstr "" ++ ++msgid "If you are interested in our project then contact the local community" ++msgstr "" ++ ++msgid "Index Page" ++msgstr "" ++ ++msgid "Interface" ++msgstr "" ++ ++msgid "" ++"Internet access depends on technical and organisational conditions and may " ++"or may not work for you." ++msgstr "" ++ ++msgid "It is operated by" ++msgstr "" ++ ++msgid "Keep configuration" ++msgstr "" ++ ++msgid "Latitude" ++msgstr "" ++ ++msgid "Legend" ++msgstr "" ++ ++msgid "Load" ++msgstr "" ++ ++msgid "Local Time" ++msgstr "" ++ ++msgid "Location" ++msgstr "" ++ ++msgid "Longitude" ++msgstr "" ++ ++msgid "Map" ++msgstr "" ++ ++msgid "Map Error" ++msgstr "" ++ ++msgid "Memory" ++msgstr "" ++ ++msgid "Mesh prefix" ++msgstr "" ++ ++msgid "Metric" ++msgstr "" ++ ++msgid "Mode" ++msgstr "" ++ ++msgid "Network" ++msgstr "" ++ ++msgid "Network for client DHCP addresses" ++msgstr "" ++ ++msgid "Nickname" ++msgstr "" ++ ++msgid "No default routes known." ++msgstr "" ++ ++msgid "Notice" ++msgstr "" ++ ++msgid "OLSR" ++msgstr "" ++ ++msgid "Operator" ++msgstr "" ++ ++msgid "Orange" ++msgstr "" ++ ++msgid "Overview" ++msgstr "" ++ ++msgid "Package libiwinfo required!" ++msgstr "" ++ ++msgid "Phone" ++msgstr "" ++ ++msgid "Please fill in your contact details below." ++msgstr "" ++ ++msgid "Please set your contact information" ++msgstr "" ++ ++msgid "Power" ++msgstr "" ++ ++msgid "Processor" ++msgstr "" ++ ++msgid "Profile" ++msgstr "" ++ ++msgid "Profile (Expert)" ++msgstr "" ++ ++msgid "Realname" ++msgstr "" ++ ++msgid "Red" ++msgstr "" ++ ++msgid "SSID" ++msgstr "" ++ ++msgid "" ++"Select your location with a mouse click on the map. The map will only show " ++"up if you are connected to the Internet." ++msgstr "" ++ ++msgid "Show OpenStreetMap" ++msgstr "" ++ ++msgid "Show on map" ++msgstr "" ++ ++msgid "Signal" ++msgstr "" ++ ++msgid "Splash" ++msgstr "" ++ ++msgid "Start Upgrade" ++msgstr "" ++ ++msgid "Statistics" ++msgstr "" ++ ++msgid "Status" ++msgstr "" ++ ++msgid "Still usable (4 < ETX < 10)" ++msgstr "" ++ ++msgid "System" ++msgstr "" ++ ++msgid "TX" ++msgstr "" ++ ++msgid "" ++"The libiwinfo package is not installed. You must install this " ++"component for working wireless configuration!" ++msgstr "" ++ ++msgid "" ++"The OLSRd service is not configured to capture position data from the " ++"network.
    Please make sure that the nameservice plugin is properly " ++"configured and that the latlon_file option is enabled." ++msgstr "" ++ ++msgid "The installed firmware is the most recent version." ++msgstr "" ++ ++msgid "" ++"These are the basic settings for your local wireless community. These " ++"settings define the default values for the wizard and DO NOT affect the " ++"actual configuration of the router." ++msgstr "" ++ ++msgid "These are the settings of your local community." ++msgstr "" ++ ++msgid "" ++"These pages will assist you in setting up your router for Freifunk or " ++"similar wireless community networks." ++msgstr "" ++ ++msgid "This is the access point" ++msgstr "" ++ ++msgid "Update Settings" ++msgstr "" ++ ++msgid "Update available!" ++msgstr "" ++ ++msgid "Uptime" ++msgstr "" ++ ++msgid "VAP" ++msgstr "" ++ ++msgid "Verify downloaded images" ++msgstr "" ++ ++msgid "Very good (ETX < 2)" ++msgstr "" ++ ++msgid "" ++"We are an initiative to establish a free, independent and open wireless mesh " ++"network." ++msgstr "" ++ ++msgid "Wireless Overview" ++msgstr "" ++ ++msgid "Yellow" ++msgstr "" ++ ++msgid "" ++"You can display additional content on the public index page by inserting " ++"valid XHTML in the form below.
    Headlines should be enclosed between <" ++"h2> and </h2>." ++msgstr "" ++ ++msgid "" ++"You can find further information about the global Freifunk initiative at" ++msgstr "" ++ ++msgid "You can manually edit the selected community profile here." ++msgstr "" ++ ++msgid "" ++"You need to select a profile before you can edit it. To select a profile go " ++"to" ++msgstr "" ++ ++msgid "and fill out all required fields." ++msgstr "" ++ ++msgid "buffered" ++msgstr "" ++ ++msgid "cached" ++msgstr "" ++ ++msgid "e.g." ++msgstr "" ++ ++msgid "free" ++msgstr "" ++ ++msgid "to disable it." ++msgstr "" ++ ++msgid "used" ++msgstr "" ++ ++msgid "wireless settings" ++msgstr "" +diff --git a/feeds/luci/modules/luci-mod-freifunk/po/uk/freifunk.po b/feeds/luci/modules/luci-mod-freifunk/po/uk/freifunk.po +new file mode 100644 +index 0000000..5abfa11 +--- /dev/null ++++ b/feeds/luci/modules/luci-mod-freifunk/po/uk/freifunk.po +@@ -0,0 +1,393 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Last-Translator: Automatically generated\n" ++"Language-Team: none\n" ++"Language: \n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n" ++"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" ++ ++msgid "BSSID" ++msgstr "" ++ ++msgid "Bad (ETX > 10)" ++msgstr "" ++ ++msgid "Basic Settings" ++msgstr "" ++ ++msgid "Basic settings" ++msgstr "" ++ ++msgid "Basic settings are incomplete. Please go to" ++msgstr "" ++ ++msgid "Basic system settings" ++msgstr "" ++ ++msgid "Bitrate" ++msgstr "" ++ ++msgid "Channel" ++msgstr "" ++ ++msgid "Check for new firmware versions and perform automatic updates." ++msgstr "" ++ ++msgid "Client network size" ++msgstr "" ++ ++msgid "Community" ++msgstr "" ++ ++msgid "Community profile" ++msgstr "" ++ ++msgid "Community settings" ++msgstr "" ++ ++msgid "Confirm Upgrade" ++msgstr "" ++ ++msgid "Contact" ++msgstr "" ++ ++msgid "Contact information is incomplete. Please go to" ++msgstr "" ++ ++msgid "Coordinates" ++msgstr "" ++ ++msgid "Country code" ++msgstr "" ++ ++msgid "Default routes" ++msgstr "" ++ ++msgid "Disable default content" ++msgstr "" ++ ++msgid "Diversity is enabled for device" ++msgstr "" ++ ++msgid "E-Mail" ++msgstr "" ++ ++msgid "ESSID" ++msgstr "" ++ ++msgid "Edit index page" ++msgstr "" ++ ++msgid "Enable IPv6" ++msgstr "" ++ ++msgid "Enable a virtual access point (VAP) by default if possible." ++msgstr "" ++ ++msgid "Error" ++msgstr "" ++ ++msgid "Find your coordinates with OpenStreetMap" ++msgstr "" ++ ++msgid "Freifunk" ++msgstr "" ++ ++msgid "Freifunk Overview" ++msgstr "" ++ ++msgid "Freifunk Remote Update" ++msgstr "" ++ ++msgid "Gateway" ++msgstr "" ++ ++msgid "Go to" ++msgstr "" ++ ++msgid "Good (2 < ETX < 4)" ++msgstr "" ++ ++msgid "Green" ++msgstr "" ++ ++msgid "Hello and welcome in the network of" ++msgstr "" ++ ++msgid "Hide OpenStreetMap" ++msgstr "" ++ ++msgid "Homepage" ++msgstr "" ++ ++msgid "Hostname" ++msgstr "" ++ ++msgid "IPv6 Config" ++msgstr "" ++ ++msgid "IPv6 Prefix" ++msgstr "" ++ ++msgid "IPv6 network in CIDR notation." ++msgstr "" ++ ++msgid "If selected then the default content element is not shown." ++msgstr "" ++ ++msgid "If you are interested in our project then contact the local community" ++msgstr "" ++ ++msgid "Index Page" ++msgstr "" ++ ++msgid "Interface" ++msgstr "" ++ ++msgid "" ++"Internet access depends on technical and organisational conditions and may " ++"or may not work for you." ++msgstr "" ++ ++msgid "It is operated by" ++msgstr "" ++ ++msgid "Keep configuration" ++msgstr "" ++ ++msgid "Latitude" ++msgstr "" ++ ++msgid "Legend" ++msgstr "" ++ ++msgid "Load" ++msgstr "" ++ ++msgid "Local Time" ++msgstr "" ++ ++msgid "Location" ++msgstr "" ++ ++msgid "Longitude" ++msgstr "" ++ ++msgid "Map" ++msgstr "" ++ ++msgid "Map Error" ++msgstr "" ++ ++msgid "Memory" ++msgstr "" ++ ++msgid "Mesh prefix" ++msgstr "" ++ ++msgid "Metric" ++msgstr "" ++ ++msgid "Mode" ++msgstr "" ++ ++msgid "Network" ++msgstr "" ++ ++msgid "Network for client DHCP addresses" ++msgstr "" ++ ++msgid "Nickname" ++msgstr "" ++ ++msgid "No default routes known." ++msgstr "" ++ ++msgid "Notice" ++msgstr "" ++ ++msgid "OLSR" ++msgstr "" ++ ++msgid "Operator" ++msgstr "" ++ ++msgid "Orange" ++msgstr "" ++ ++msgid "Overview" ++msgstr "" ++ ++msgid "Package libiwinfo required!" ++msgstr "" ++ ++msgid "Phone" ++msgstr "" ++ ++msgid "Please fill in your contact details below." ++msgstr "" ++ ++msgid "Please set your contact information" ++msgstr "" ++ ++msgid "Power" ++msgstr "" ++ ++msgid "Processor" ++msgstr "" ++ ++msgid "Profile" ++msgstr "" ++ ++msgid "Profile (Expert)" ++msgstr "" ++ ++msgid "Realname" ++msgstr "" ++ ++msgid "Red" ++msgstr "" ++ ++msgid "SSID" ++msgstr "" ++ ++msgid "" ++"Select your location with a mouse click on the map. The map will only show " ++"up if you are connected to the Internet." ++msgstr "" ++ ++msgid "Show OpenStreetMap" ++msgstr "" ++ ++msgid "Show on map" ++msgstr "" ++ ++msgid "Signal" ++msgstr "" ++ ++msgid "Splash" ++msgstr "" ++ ++msgid "Start Upgrade" ++msgstr "" ++ ++msgid "Statistics" ++msgstr "" ++ ++msgid "Status" ++msgstr "" ++ ++msgid "Still usable (4 < ETX < 10)" ++msgstr "" ++ ++msgid "System" ++msgstr "" ++ ++msgid "TX" ++msgstr "" ++ ++msgid "" ++"The libiwinfo package is not installed. You must install this " ++"component for working wireless configuration!" ++msgstr "" ++ ++msgid "" ++"The OLSRd service is not configured to capture position data from the " ++"network.
    Please make sure that the nameservice plugin is properly " ++"configured and that the latlon_file option is enabled." ++msgstr "" ++ ++msgid "The installed firmware is the most recent version." ++msgstr "" ++ ++msgid "" ++"These are the basic settings for your local wireless community. These " ++"settings define the default values for the wizard and DO NOT affect the " ++"actual configuration of the router." ++msgstr "" ++ ++msgid "These are the settings of your local community." ++msgstr "" ++ ++msgid "" ++"These pages will assist you in setting up your router for Freifunk or " ++"similar wireless community networks." ++msgstr "" ++ ++msgid "This is the access point" ++msgstr "" ++ ++msgid "Update Settings" ++msgstr "" ++ ++msgid "Update available!" ++msgstr "" ++ ++msgid "Uptime" ++msgstr "" ++ ++msgid "VAP" ++msgstr "" ++ ++msgid "Verify downloaded images" ++msgstr "" ++ ++msgid "Very good (ETX < 2)" ++msgstr "" ++ ++msgid "" ++"We are an initiative to establish a free, independent and open wireless mesh " ++"network." ++msgstr "" ++ ++msgid "Wireless Overview" ++msgstr "" ++ ++msgid "Yellow" ++msgstr "" ++ ++msgid "" ++"You can display additional content on the public index page by inserting " ++"valid XHTML in the form below.
    Headlines should be enclosed between <" ++"h2> and </h2>." ++msgstr "" ++ ++msgid "" ++"You can find further information about the global Freifunk initiative at" ++msgstr "" ++ ++msgid "You can manually edit the selected community profile here." ++msgstr "" ++ ++msgid "" ++"You need to select a profile before you can edit it. To select a profile go " ++"to" ++msgstr "" ++ ++msgid "and fill out all required fields." ++msgstr "" ++ ++msgid "buffered" ++msgstr "" ++ ++msgid "cached" ++msgstr "" ++ ++msgid "e.g." ++msgstr "" ++ ++msgid "free" ++msgstr "" ++ ++msgid "to disable it." ++msgstr "" ++ ++msgid "used" ++msgstr "" ++ ++msgid "wireless settings" ++msgstr "" +diff --git a/feeds/luci/modules/luci-mod-freifunk/po/vi/freifunk.po b/feeds/luci/modules/luci-mod-freifunk/po/vi/freifunk.po +new file mode 100644 +index 0000000..8076d61 +--- /dev/null ++++ b/feeds/luci/modules/luci-mod-freifunk/po/vi/freifunk.po +@@ -0,0 +1,398 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Report-Msgid-Bugs-To: \n" ++"POT-Creation-Date: 2009-08-16 06:58+0200\n" ++"PO-Revision-Date: 2009-08-15 11:56+0200\n" ++"Last-Translator: Stefan Pirwitz \n" ++"Language-Team: LANGUAGE \n" ++"Language: \n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"X-Generator: Pootle 1.1.0\n" ++ ++msgid "BSSID" ++msgstr "" ++ ++msgid "Bad (ETX > 10)" ++msgstr "" ++ ++msgid "Basic Settings" ++msgstr "" ++ ++msgid "Basic settings" ++msgstr "" ++ ++msgid "Basic settings are incomplete. Please go to" ++msgstr "" ++ ++msgid "Basic system settings" ++msgstr "" ++ ++msgid "Bitrate" ++msgstr "" ++ ++msgid "Channel" ++msgstr "" ++ ++msgid "Check for new firmware versions and perform automatic updates." ++msgstr "Kiểm tra các phiên bản phần cứng má»›i và thá»±c hiện tá»± Ä‘á»™ng cập nhật." ++ ++msgid "Client network size" ++msgstr "" ++ ++msgid "Community" ++msgstr "" ++ ++msgid "Community profile" ++msgstr "" ++ ++msgid "Community settings" ++msgstr "" ++ ++msgid "Confirm Upgrade" ++msgstr "" ++ ++msgid "Contact" ++msgstr "" ++ ++msgid "Contact information is incomplete. Please go to" ++msgstr "" ++ ++msgid "Coordinates" ++msgstr "Tá»a Ä‘á»™" ++ ++msgid "Country code" ++msgstr "" ++ ++msgid "Default routes" ++msgstr "" ++ ++msgid "Disable default content" ++msgstr "" ++ ++msgid "Diversity is enabled for device" ++msgstr "" ++ ++msgid "E-Mail" ++msgstr "E-mail" ++ ++msgid "ESSID" ++msgstr "" ++ ++msgid "Edit index page" ++msgstr "" ++ ++msgid "Enable IPv6" ++msgstr "" ++ ++msgid "Enable a virtual access point (VAP) by default if possible." ++msgstr "" ++ ++msgid "Error" ++msgstr "" ++ ++msgid "Find your coordinates with OpenStreetMap" ++msgstr "" ++ ++msgid "Freifunk" ++msgstr "" ++ ++msgid "Freifunk Overview" ++msgstr "" ++ ++msgid "Freifunk Remote Update" ++msgstr "Freifunk cập nhật từ xa" ++ ++msgid "Gateway" ++msgstr "" ++ ++msgid "Go to" ++msgstr "" ++ ++msgid "Good (2 < ETX < 4)" ++msgstr "" ++ ++msgid "Green" ++msgstr "" ++ ++msgid "Hello and welcome in the network of" ++msgstr "Xin chào và chào mừng gia nhập mạng lÆ°á»›i của" ++ ++msgid "Hide OpenStreetMap" ++msgstr "" ++ ++msgid "Homepage" ++msgstr "" ++ ++msgid "Hostname" ++msgstr "Hostname" ++ ++msgid "IPv6 Config" ++msgstr "" ++ ++msgid "IPv6 Prefix" ++msgstr "" ++ ++msgid "IPv6 network in CIDR notation." ++msgstr "" ++ ++msgid "If selected then the default content element is not shown." ++msgstr "" ++ ++msgid "If you are interested in our project then contact the local community" ++msgstr "" ++"Nếu bạn quan tâm đến đỠán của chúng tôi, hãy liên hệ cá»™ng đồng địa phÆ°Æ¡ng" ++ ++msgid "Index Page" ++msgstr "" ++ ++msgid "Interface" ++msgstr "" ++ ++msgid "" ++"Internet access depends on technical and organisational conditions and may " ++"or may not work for you." ++msgstr "" ++"Truy cập Internet phù thuá»™c vào kỹ thật và Ä‘iá»u kiện tổ chức và có thể hoạt " ++"Ä‘á»™ng hoặc không hoạt Ä‘á»™ng cho bạn" ++ ++msgid "It is operated by" ++msgstr "Nó hoạt Ä‘á»™ng bởi " ++ ++msgid "Keep configuration" ++msgstr "Giữ cấu hình" ++ ++msgid "Latitude" ++msgstr "" ++ ++msgid "Legend" ++msgstr "" ++ ++msgid "Load" ++msgstr "" ++ ++msgid "Local Time" ++msgstr "" ++ ++msgid "Location" ++msgstr "Äịa chỉ" ++ ++msgid "Longitude" ++msgstr "" ++ ++msgid "Map" ++msgstr "" ++ ++msgid "Map Error" ++msgstr "" ++ ++msgid "Memory" ++msgstr "Bá»™ nhá»›" ++ ++msgid "Mesh prefix" ++msgstr "" ++ ++msgid "Metric" ++msgstr "" ++ ++msgid "Mode" ++msgstr "" ++ ++msgid "Network" ++msgstr "" ++ ++msgid "Network for client DHCP addresses" ++msgstr "" ++ ++msgid "Nickname" ++msgstr "Tên" ++ ++msgid "No default routes known." ++msgstr "" ++ ++msgid "Notice" ++msgstr "Chú ý" ++ ++msgid "OLSR" ++msgstr "" ++ ++msgid "Operator" ++msgstr "" ++ ++msgid "Orange" ++msgstr "" ++ ++msgid "Overview" ++msgstr "" ++ ++msgid "Package libiwinfo required!" ++msgstr "" ++ ++msgid "Phone" ++msgstr "Äiện thoại" ++ ++msgid "Please fill in your contact details below." ++msgstr "" ++ ++msgid "Please set your contact information" ++msgstr "" ++ ++msgid "Power" ++msgstr "" ++ ++msgid "Processor" ++msgstr "" ++ ++msgid "Profile" ++msgstr "" ++ ++msgid "Profile (Expert)" ++msgstr "" ++ ++msgid "Realname" ++msgstr "Tên thật " ++ ++msgid "Red" ++msgstr "" ++ ++msgid "SSID" ++msgstr "" ++ ++msgid "" ++"Select your location with a mouse click on the map. The map will only show " ++"up if you are connected to the Internet." ++msgstr "" ++ ++msgid "Show OpenStreetMap" ++msgstr "" ++ ++msgid "Show on map" ++msgstr "" ++ ++msgid "Signal" ++msgstr "" ++ ++msgid "Splash" ++msgstr "" ++ ++msgid "Start Upgrade" ++msgstr "Bắt đầu cập nhật " ++ ++msgid "Statistics" ++msgstr "" ++ ++msgid "Status" ++msgstr "" ++ ++msgid "Still usable (4 < ETX < 10)" ++msgstr "" ++ ++msgid "System" ++msgstr "" ++ ++msgid "TX" ++msgstr "" ++ ++msgid "" ++"The libiwinfo package is not installed. You must install this " ++"component for working wireless configuration!" ++msgstr "" ++ ++msgid "" ++"The OLSRd service is not configured to capture position data from the " ++"network.
    Please make sure that the nameservice plugin is properly " ++"configured and that the latlon_file option is enabled." ++msgstr "" ++ ++msgid "The installed firmware is the most recent version." ++msgstr "Phần cứng được cài đặt là phiên bản má»›i nhất." ++ ++msgid "" ++"These are the basic settings for your local wireless community. These " ++"settings define the default values for the wizard and DO NOT affect the " ++"actual configuration of the router." ++msgstr "" ++ ++msgid "These are the settings of your local community." ++msgstr "" ++ ++msgid "" ++"These pages will assist you in setting up your router for Freifunk or " ++"similar wireless community networks." ++msgstr "" ++ ++msgid "This is the access point" ++msgstr "Äây là Ä‘iểm truy cập " ++ ++msgid "Update Settings" ++msgstr "Cập nhật cài đặt" ++ ++msgid "Update available!" ++msgstr "Cập nhật sẵn có!" ++ ++msgid "Uptime" ++msgstr "" ++ ++msgid "VAP" ++msgstr "" ++ ++msgid "Verify downloaded images" ++msgstr "Xác minh hình ảnh đã tải" ++ ++msgid "Very good (ETX < 2)" ++msgstr "" ++ ++msgid "" ++"We are an initiative to establish a free, independent and open wireless mesh " ++"network." ++msgstr "Chúng tôi là phát triển mạng lÆ°á»›i nguồn mở không dây đầu tiên" ++ ++msgid "Wireless Overview" ++msgstr "" ++ ++msgid "Yellow" ++msgstr "" ++ ++msgid "" ++"You can display additional content on the public index page by inserting " ++"valid XHTML in the form below.
    Headlines should be enclosed between <" ++"h2> and </h2>." ++msgstr "" ++ ++msgid "" ++"You can find further information about the global Freifunk initiative at" ++msgstr "Bạn có thể tìm thấy thông tin vá» Freifunk toàn cầu tại " ++ ++msgid "You can manually edit the selected community profile here." ++msgstr "" ++ ++msgid "" ++"You need to select a profile before you can edit it. To select a profile go " ++"to" ++msgstr "" ++ ++msgid "and fill out all required fields." ++msgstr "" ++ ++msgid "buffered" ++msgstr "" ++ ++msgid "cached" ++msgstr "" ++ ++msgid "e.g." ++msgstr "" ++ ++msgid "free" ++msgstr "" ++ ++msgid "to disable it." ++msgstr "" ++ ++msgid "used" ++msgstr "" ++ ++msgid "wireless settings" ++msgstr "" +diff --git a/feeds/luci/modules/luci-mod-freifunk/po/zh-cn/freifunk.po b/feeds/luci/modules/luci-mod-freifunk/po/zh-cn/freifunk.po +new file mode 100644 +index 0000000..2d58b16 +--- /dev/null ++++ b/feeds/luci/modules/luci-mod-freifunk/po/zh-cn/freifunk.po +@@ -0,0 +1,403 @@ ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Report-Msgid-Bugs-To: \n" ++"POT-Creation-Date: 2009-06-10 03:40+0200\n" ++"PO-Revision-Date: 2014-06-22 14:33+0200\n" ++"Last-Translator: phantasm131 \n" ++"Language-Team: LANGUAGE \n" ++"Language: zh_CN\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=1; plural=0;\n" ++"X-Generator: Pootle 2.0.6\n" ++ ++msgid "BSSID" ++msgstr "BSSID" ++ ++msgid "Bad (ETX > 10)" ++msgstr "错误(ETX>10)" ++ ++msgid "Basic Settings" ++msgstr "基础设置" ++ ++msgid "Basic settings" ++msgstr "基础设置" ++ ++msgid "Basic settings are incomplete. Please go to" ++msgstr "基础设置ä¸å®Œæ•´ï¼Œè¯·è½¬åˆ°" ++ ++msgid "Basic system settings" ++msgstr "基础系统设置" ++ ++msgid "Bitrate" ++msgstr "速率" ++ ++msgid "Channel" ++msgstr "频é“" ++ ++msgid "Check for new firmware versions and perform automatic updates." ++msgstr "检查新的固件版本并自动å‡çº§ã€‚" ++ ++msgid "Client network size" ++msgstr "客户端网络容é‡" ++ ++msgid "Community" ++msgstr "群组" ++ ++msgid "Community profile" ++msgstr "群组é…置文件" ++ ++msgid "Community settings" ++msgstr "群组设置" ++ ++msgid "Confirm Upgrade" ++msgstr "确认å‡çº§" ++ ++msgid "Contact" ++msgstr "è”系人" ++ ++msgid "Contact information is incomplete. Please go to" ++msgstr "è”系人信æ¯ä¸å…¨ã€‚请继续填写" ++ ++msgid "Coordinates" ++msgstr "ä½ç½®" ++ ++msgid "Country code" ++msgstr "国家代ç " ++ ++msgid "Default routes" ++msgstr "缺çœè·¯ç”±" ++ ++msgid "Disable default content" ++msgstr "ç¦ç”¨é»˜è®¤å†…容" ++ ++msgid "Diversity is enabled for device" ++msgstr "å¯ç”¨å¤šé‡è®¾å¤‡" ++ ++msgid "E-Mail" ++msgstr "电å­é‚®ä»¶" ++ ++msgid "ESSID" ++msgstr "ESSID" ++ ++msgid "Edit index page" ++msgstr "编辑索引页" ++ ++msgid "Enable IPv6" ++msgstr "å¯ç”¨IPv6" ++ ++msgid "Enable a virtual access point (VAP) by default if possible." ++msgstr "å¯ç”¨ä¸€ä¸ªè™šæ‹ŸæŽ¥å…¥ç‚¹ï¼ˆå¦‚æžœå¯ä»¥çš„è¯ï¼‰" ++ ++msgid "Error" ++msgstr "错误" ++ ++msgid "Find your coordinates with OpenStreetMap" ++msgstr "使用OpenStreetMap查找ä½ç½®åæ ‡" ++ ++msgid "Freifunk" ++msgstr "Freifunk" ++ ++msgid "Freifunk Overview" ++msgstr "Freifunk简介" ++ ++msgid "Freifunk Remote Update" ++msgstr "Freifunk远程更新" ++ ++msgid "Gateway" ++msgstr "网关" ++ ++msgid "Go to" ++msgstr "去" ++ ++msgid "Good (2 < ETX < 4)" ++msgstr "好(2libiwinfo
    package is not installed. You must install this " ++"component for working wireless configuration!" ++msgstr " libiwinfo 包没有安装。进行无线é…置您必须安装此组件ï¼" ++ ++msgid "" ++"The OLSRd service is not configured to capture position data from the " ++"network.
    Please make sure that the nameservice plugin is properly " ++"configured and that the latlon_file option is enabled." ++msgstr "" ++"没有é…ç½®OLSRd从网络获å–ä½ç½®æ•°æ®ã€‚
    请确ä¿æ­£ç¡®é…置域åæœåŠ¡æ’件,且 " ++"latlon_file 选项被å¯ç”¨ã€‚" ++ ++msgid "The installed firmware is the most recent version." ++msgstr "所安装固件为最新版本。" ++ ++msgid "" ++"These are the basic settings for your local wireless community. These " ++"settings define the default values for the wizard and DO NOT affect the " ++"actual configuration of the router." ++msgstr "" ++"这些基本设置为您本地的无线社区。这些设置定义为å‘导默认值并ä¸ä¼šå½±å“路由器的实" ++"é™…é…置。" ++ ++msgid "These are the settings of your local community." ++msgstr "当地社区设置。" ++ ++msgid "" ++"These pages will assist you in setting up your router for Freifunk or " ++"similar wireless community networks." ++msgstr "这些页é¢å°†å¸®åŠ©ä½ è®¾ç½®è·¯ç”±å™¨Freifunk或类似的无线社区网络。" ++ ++msgid "This is the access point" ++msgstr "AP" ++ ++msgid "Update Settings" ++msgstr "å‡çº§è®¾ç½®" ++ ++msgid "Update available!" ++msgstr "å¯ç”¨æ›´æ–°ï¼" ++ ++msgid "Uptime" ++msgstr "正常è¿è¡Œæ—¶é—´" ++ ++msgid "VAP" ++msgstr "VAP" ++ ++msgid "Verify downloaded images" ++msgstr "校验下载的镜åƒåŒ…" ++ ++msgid "Very good (ETX < 2)" ++msgstr "éžå¸¸å¥½ï¼ˆETX<2)" ++ ++msgid "" ++"We are an initiative to establish a free, independent and open wireless mesh " ++"network." ++msgstr "我们倡议建立一个自由,独立和开放的无线mesh网络。" ++ ++msgid "Wireless Overview" ++msgstr "无线概è¦" ++ ++msgid "Yellow" ++msgstr "黄色" ++ ++msgid "" ++"You can display additional content on the public index page by inserting " ++"valid XHTML in the form below.
    Headlines should be enclosed between <" ++"h2> and </h2>." ++msgstr "" ++"å¯ä»¥æ˜¾ç¤ºæ›´å¤šçš„内容,对公众的索引页下é¢çš„表格中æ’入有效的XHTML。
    标题应放" ++"在<H2>å’Œ</ H2>中" ++ ++msgid "" ++"You can find further information about the global Freifunk initiative at" ++msgstr "ä½ å¯ä»¥æ‰¾åˆ°æ›´å¤šæœ‰å…³å…¨çƒFreifunk活动的信æ¯" ++ ++msgid "You can manually edit the selected community profile here." ++msgstr "您å¯ä»¥åœ¨è¿™é‡Œæ‰‹åŠ¨ç¼–辑所选社区é…置文件。" ++ ++msgid "" ++"You need to select a profile before you can edit it. To select a profile go " ++"to" ++msgstr "编辑它之å‰ï¼Œä½ éœ€è¦é€‰æ‹©ä¸€ä¸ªé…置文件。选择é…置文件" ++ ++msgid "and fill out all required fields." ++msgstr "填写所有必填字段。" ++ ++msgid "buffered" ++msgstr "已缓存" ++ ++msgid "cached" ++msgstr "已暂存" ++ ++msgid "e.g." ++msgstr "例如:" ++ ++msgid "free" ++msgstr "空闲" ++ ++msgid "to disable it." ++msgstr "ç¦ç”¨å®ƒã€‚" ++ ++msgid "used" ++msgstr "å ç”¨" ++ ++msgid "wireless settings" ++msgstr "无线设置" +diff --git a/feeds/luci/modules/luci-mod-freifunk/po/zh-tw/freifunk.po b/feeds/luci/modules/luci-mod-freifunk/po/zh-tw/freifunk.po +new file mode 100644 +index 0000000..51432e2 +--- /dev/null ++++ b/feeds/luci/modules/luci-mod-freifunk/po/zh-tw/freifunk.po +@@ -0,0 +1,390 @@ ++msgid "" ++msgstr "" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Last-Translator: Automatically generated\n" ++"Language-Team: none\n" ++"MIME-Version: 1.0\n" ++"Content-Transfer-Encoding: 8bit\n" ++ ++msgid "BSSID" ++msgstr "" ++ ++msgid "Bad (ETX > 10)" ++msgstr "" ++ ++msgid "Basic Settings" ++msgstr "" ++ ++msgid "Basic settings" ++msgstr "" ++ ++msgid "Basic settings are incomplete. Please go to" ++msgstr "" ++ ++msgid "Basic system settings" ++msgstr "" ++ ++msgid "Bitrate" ++msgstr "" ++ ++msgid "Channel" ++msgstr "" ++ ++msgid "Check for new firmware versions and perform automatic updates." ++msgstr "" ++ ++msgid "Client network size" ++msgstr "" ++ ++msgid "Community" ++msgstr "" ++ ++msgid "Community profile" ++msgstr "" ++ ++msgid "Community settings" ++msgstr "" ++ ++msgid "Confirm Upgrade" ++msgstr "" ++ ++msgid "Contact" ++msgstr "" ++ ++msgid "Contact information is incomplete. Please go to" ++msgstr "" ++ ++msgid "Coordinates" ++msgstr "" ++ ++msgid "Country code" ++msgstr "" ++ ++msgid "Default routes" ++msgstr "" ++ ++msgid "Disable default content" ++msgstr "" ++ ++msgid "Diversity is enabled for device" ++msgstr "" ++ ++msgid "E-Mail" ++msgstr "" ++ ++msgid "ESSID" ++msgstr "" ++ ++msgid "Edit index page" ++msgstr "" ++ ++msgid "Enable IPv6" ++msgstr "" ++ ++msgid "Enable a virtual access point (VAP) by default if possible." ++msgstr "" ++ ++msgid "Error" ++msgstr "" ++ ++msgid "Find your coordinates with OpenStreetMap" ++msgstr "" ++ ++msgid "Freifunk" ++msgstr "" ++ ++msgid "Freifunk Overview" ++msgstr "" ++ ++msgid "Freifunk Remote Update" ++msgstr "" ++ ++msgid "Gateway" ++msgstr "" ++ ++msgid "Go to" ++msgstr "" ++ ++msgid "Good (2 < ETX < 4)" ++msgstr "" ++ ++msgid "Green" ++msgstr "" ++ ++msgid "Hello and welcome in the network of" ++msgstr "" ++ ++msgid "Hide OpenStreetMap" ++msgstr "" ++ ++msgid "Homepage" ++msgstr "" ++ ++msgid "Hostname" ++msgstr "" ++ ++msgid "IPv6 Config" ++msgstr "" ++ ++msgid "IPv6 Prefix" ++msgstr "" ++ ++msgid "IPv6 network in CIDR notation." ++msgstr "" ++ ++msgid "If selected then the default content element is not shown." ++msgstr "" ++ ++msgid "If you are interested in our project then contact the local community" ++msgstr "" ++ ++msgid "Index Page" ++msgstr "" ++ ++msgid "Interface" ++msgstr "" ++ ++msgid "" ++"Internet access depends on technical and organisational conditions and may " ++"or may not work for you." ++msgstr "" ++ ++msgid "It is operated by" ++msgstr "" ++ ++msgid "Keep configuration" ++msgstr "" ++ ++msgid "Latitude" ++msgstr "" ++ ++msgid "Legend" ++msgstr "" ++ ++msgid "Load" ++msgstr "" ++ ++msgid "Local Time" ++msgstr "" ++ ++msgid "Location" ++msgstr "" ++ ++msgid "Longitude" ++msgstr "" ++ ++msgid "Map" ++msgstr "" ++ ++msgid "Map Error" ++msgstr "" ++ ++msgid "Memory" ++msgstr "" ++ ++msgid "Mesh prefix" ++msgstr "" ++ ++msgid "Metric" ++msgstr "" ++ ++msgid "Mode" ++msgstr "" ++ ++msgid "Network" ++msgstr "" ++ ++msgid "Network for client DHCP addresses" ++msgstr "" ++ ++msgid "Nickname" ++msgstr "" ++ ++msgid "No default routes known." ++msgstr "" ++ ++msgid "Notice" ++msgstr "" ++ ++msgid "OLSR" ++msgstr "" ++ ++msgid "Operator" ++msgstr "" ++ ++msgid "Orange" ++msgstr "" ++ ++msgid "Overview" ++msgstr "" ++ ++msgid "Package libiwinfo required!" ++msgstr "" ++ ++msgid "Phone" ++msgstr "" ++ ++msgid "Please fill in your contact details below." ++msgstr "" ++ ++msgid "Please set your contact information" ++msgstr "" ++ ++msgid "Power" ++msgstr "" ++ ++msgid "Processor" ++msgstr "" ++ ++msgid "Profile" ++msgstr "" ++ ++msgid "Profile (Expert)" ++msgstr "" ++ ++msgid "Realname" ++msgstr "" ++ ++msgid "Red" ++msgstr "" ++ ++msgid "SSID" ++msgstr "" ++ ++msgid "" ++"Select your location with a mouse click on the map. The map will only show " ++"up if you are connected to the Internet." ++msgstr "" ++ ++msgid "Show OpenStreetMap" ++msgstr "" ++ ++msgid "Show on map" ++msgstr "" ++ ++msgid "Signal" ++msgstr "" ++ ++msgid "Splash" ++msgstr "" ++ ++msgid "Start Upgrade" ++msgstr "" ++ ++msgid "Statistics" ++msgstr "" ++ ++msgid "Status" ++msgstr "" ++ ++msgid "Still usable (4 < ETX < 10)" ++msgstr "" ++ ++msgid "System" ++msgstr "" ++ ++msgid "TX" ++msgstr "" ++ ++msgid "" ++"The libiwinfo package is not installed. You must install this " ++"component for working wireless configuration!" ++msgstr "" ++ ++msgid "" ++"The OLSRd service is not configured to capture position data from the " ++"network.
    Please make sure that the nameservice plugin is properly " ++"configured and that the latlon_file option is enabled." ++msgstr "" ++ ++msgid "The installed firmware is the most recent version." ++msgstr "" ++ ++msgid "" ++"These are the basic settings for your local wireless community. These " ++"settings define the default values for the wizard and DO NOT affect the " ++"actual configuration of the router." ++msgstr "" ++ ++msgid "These are the settings of your local community." ++msgstr "" ++ ++msgid "" ++"These pages will assist you in setting up your router for Freifunk or " ++"similar wireless community networks." ++msgstr "" ++ ++msgid "This is the access point" ++msgstr "" ++ ++msgid "Update Settings" ++msgstr "" ++ ++msgid "Update available!" ++msgstr "" ++ ++msgid "Uptime" ++msgstr "" ++ ++msgid "VAP" ++msgstr "" ++ ++msgid "Verify downloaded images" ++msgstr "" ++ ++msgid "Very good (ETX < 2)" ++msgstr "" ++ ++msgid "" ++"We are an initiative to establish a free, independent and open wireless mesh " ++"network." ++msgstr "" ++ ++msgid "Wireless Overview" ++msgstr "" ++ ++msgid "Yellow" ++msgstr "" ++ ++msgid "" ++"You can display additional content on the public index page by inserting " ++"valid XHTML in the form below.
    Headlines should be enclosed between <" ++"h2> and </h2>." ++msgstr "" ++ ++msgid "" ++"You can find further information about the global Freifunk initiative at" ++msgstr "" ++ ++msgid "You can manually edit the selected community profile here." ++msgstr "" ++ ++msgid "" ++"You need to select a profile before you can edit it. To select a profile go " ++"to" ++msgstr "" ++ ++msgid "and fill out all required fields." ++msgstr "" ++ ++msgid "buffered" ++msgstr "" ++ ++msgid "cached" ++msgstr "" ++ ++msgid "e.g." ++msgstr "" ++ ++msgid "free" ++msgstr "" ++ ++msgid "to disable it." ++msgstr "" ++ ++msgid "used" ++msgstr "" ++ ++msgid "wireless settings" ++msgstr "" +diff --git a/feeds/luci/modules/luci-mod-rpc/Makefile b/feeds/luci/modules/luci-mod-rpc/Makefile +new file mode 100644 +index 0000000..e64c86c +--- /dev/null ++++ b/feeds/luci/modules/luci-mod-rpc/Makefile +@@ -0,0 +1,15 @@ ++# ++# Copyright (C) 2008-2014 The LuCI Team ++# ++# This is free software, licensed under the Apache License, Version 2.0 . ++# ++ ++include $(TOPDIR)/rules.mk ++ ++LUCI_TITLE:=LuCI RPC - JSON-RPC API ++LUCI_DEPENDS:=+luci-lib-json ++ ++include ../../luci.mk ++ ++# call BuildPackage - OpenWrt buildroot signature ++ +diff --git a/feeds/luci/modules/luci-mod-rpc/luasrc/controller/rpc.lua b/feeds/luci/modules/luci-mod-rpc/luasrc/controller/rpc.lua +new file mode 100644 +index 0000000..759bb74 +--- /dev/null ++++ b/feeds/luci/modules/luci-mod-rpc/luasrc/controller/rpc.lua +@@ -0,0 +1,161 @@ ++-- Copyright 2008 Steven Barth ++-- Copyright 2008 Jo-Philipp Wich ++-- Licensed to the public under the Apache License 2.0. ++ ++local require = require ++local pairs = pairs ++local print = print ++local pcall = pcall ++local table = table ++ ++module "luci.controller.rpc" ++ ++function index() ++ local function authenticator(validator, accs) ++ local auth = luci.http.formvalue("auth", true) ++ if auth then -- if authentication token was given ++ local sdat = (luci.util.ubus("session", "get", { ubus_rpc_session = auth }) or { }).values ++ if sdat then -- if given token is valid ++ if sdat.user and luci.util.contains(accs, sdat.user) then ++ return sdat.user, auth ++ end ++ end ++ end ++ luci.http.status(403, "Forbidden") ++ end ++ ++ local rpc = node("rpc") ++ rpc.sysauth = "root" ++ rpc.sysauth_authenticator = authenticator ++ rpc.notemplate = true ++ ++ entry({"rpc", "uci"}, call("rpc_uci")) ++ entry({"rpc", "fs"}, call("rpc_fs")) ++ entry({"rpc", "sys"}, call("rpc_sys")) ++ entry({"rpc", "ipkg"}, call("rpc_ipkg")) ++ entry({"rpc", "auth"}, call("rpc_auth")).sysauth = false ++end ++ ++function rpc_auth() ++ local jsonrpc = require "luci.jsonrpc" ++ local http = require "luci.http" ++ local sys = require "luci.sys" ++ local ltn12 = require "luci.ltn12" ++ local util = require "luci.util" ++ ++ local loginstat ++ ++ local server = {} ++ server.challenge = function(user, pass) ++ local sid, token, secret ++ ++ local config = require "luci.config" ++ ++ if sys.user.checkpasswd(user, pass) then ++ local sdat = util.ubus("session", "create", { timeout = config.sauth.sessiontime }) ++ if sdat then ++ sid = sdat.ubus_rpc_session ++ token = sys.uniqueid(16) ++ secret = sys.uniqueid(16) ++ ++ http.header("Set-Cookie", "sysauth="..sid.."; path=/") ++ util.ubus("session", "set", { ++ ubus_rpc_session = sid, ++ values = { ++ user = user, ++ token = token, ++ secret = secret ++ } ++ }) ++ end ++ end ++ ++ return sid and {sid=sid, token=token, secret=secret} ++ end ++ ++ server.login = function(...) ++ local challenge = server.challenge(...) ++ return challenge and challenge.sid ++ end ++ ++ http.prepare_content("application/json") ++ ltn12.pump.all(jsonrpc.handle(server, http.source()), http.write) ++end ++ ++function rpc_uci() ++ if not pcall(require, "luci.model.uci") then ++ luci.http.status(404, "Not Found") ++ return nil ++ end ++ local uci = require "luci.jsonrpcbind.uci" ++ local jsonrpc = require "luci.jsonrpc" ++ local http = require "luci.http" ++ local ltn12 = require "luci.ltn12" ++ ++ http.prepare_content("application/json") ++ ltn12.pump.all(jsonrpc.handle(uci, http.source()), http.write) ++end ++ ++function rpc_fs() ++ local util = require "luci.util" ++ local io = require "io" ++ local fs2 = util.clone(require "nixio.fs") ++ local jsonrpc = require "luci.jsonrpc" ++ local http = require "luci.http" ++ local ltn12 = require "luci.ltn12" ++ ++ function fs2.readfile(filename) ++ local stat, mime = pcall(require, "mime") ++ if not stat then ++ error("Base64 support not available. Please install LuaSocket.") ++ end ++ ++ local fp = io.open(filename) ++ if not fp then ++ return nil ++ end ++ ++ local output = {} ++ local sink = ltn12.sink.table(output) ++ local source = ltn12.source.chain(ltn12.source.file(fp), mime.encode("base64")) ++ return ltn12.pump.all(source, sink) and table.concat(output) ++ end ++ ++ function fs2.writefile(filename, data) ++ local stat, mime = pcall(require, "mime") ++ if not stat then ++ error("Base64 support not available. Please install LuaSocket.") ++ end ++ ++ local file = io.open(filename, "w") ++ local sink = file and ltn12.sink.chain(mime.decode("base64"), ltn12.sink.file(file)) ++ return sink and ltn12.pump.all(ltn12.source.string(data), sink) or false ++ end ++ ++ http.prepare_content("application/json") ++ ltn12.pump.all(jsonrpc.handle(fs2, http.source()), http.write) ++end ++ ++function rpc_sys() ++ local sys = require "luci.sys" ++ local jsonrpc = require "luci.jsonrpc" ++ local http = require "luci.http" ++ local ltn12 = require "luci.ltn12" ++ ++ http.prepare_content("application/json") ++ ltn12.pump.all(jsonrpc.handle(sys, http.source()), http.write) ++end ++ ++function rpc_ipkg() ++ if not pcall(require, "luci.model.ipkg") then ++ luci.http.status(404, "Not Found") ++ return nil ++ end ++ local ipkg = require "luci.model.ipkg" ++ local jsonrpc = require "luci.jsonrpc" ++ local http = require "luci.http" ++ local ltn12 = require "luci.ltn12" ++ ++ http.prepare_content("application/json") ++ ltn12.pump.all(jsonrpc.handle(ipkg, http.source()), http.write) ++end +diff --git a/feeds/luci/modules/luci-mod-rpc/luasrc/jsonrpc.lua b/feeds/luci/modules/luci-mod-rpc/luasrc/jsonrpc.lua +new file mode 100644 +index 0000000..c7f0254 +--- /dev/null ++++ b/feeds/luci/modules/luci-mod-rpc/luasrc/jsonrpc.lua +@@ -0,0 +1,83 @@ ++-- Copyright 2008 Steven Barth ++-- Copyright 2008 Jo-Philipp Wich ++-- Licensed to the public under the Apache License 2.0. ++ ++module("luci.jsonrpc", package.seeall) ++require "luci.json" ++ ++function resolve(mod, method) ++ local path = luci.util.split(method, ".") ++ ++ for j=1, #path-1 do ++ if not type(mod) == "table" then ++ break ++ end ++ mod = rawget(mod, path[j]) ++ if not mod then ++ break ++ end ++ end ++ mod = type(mod) == "table" and rawget(mod, path[#path]) or nil ++ if type(mod) == "function" then ++ return mod ++ end ++end ++ ++function handle(tbl, rawsource, ...) ++ local decoder = luci.json.Decoder() ++ local stat = luci.ltn12.pump.all(rawsource, decoder:sink()) ++ local json = decoder:get() ++ local response ++ local success = false ++ ++ if stat then ++ if type(json.method) == "string" ++ and (not json.params or type(json.params) == "table") then ++ local method = resolve(tbl, json.method) ++ if method then ++ response = reply(json.jsonrpc, json.id, ++ proxy(method, unpack(json.params or {}))) ++ else ++ response = reply(json.jsonrpc, json.id, ++ nil, {code=-32601, message="Method not found."}) ++ end ++ else ++ response = reply(json.jsonrpc, json.id, ++ nil, {code=-32600, message="Invalid request."}) ++ end ++ else ++ response = reply("2.0", nil, ++ nil, {code=-32700, message="Parse error."}) ++ end ++ ++ return luci.json.Encoder(response, ...):source() ++end ++ ++function reply(jsonrpc, id, res, err) ++ require "luci.json" ++ id = id or luci.json.null ++ ++ -- 1.0 compatibility ++ if jsonrpc ~= "2.0" then ++ jsonrpc = nil ++ res = res or luci.json.null ++ err = err or luci.json.null ++ end ++ ++ return {id=id, result=res, error=err, jsonrpc=jsonrpc} ++end ++ ++function proxy(method, ...) ++ local res = {luci.util.copcall(method, ...)} ++ local stat = table.remove(res, 1) ++ ++ if not stat then ++ return nil, {code=-32602, message="Invalid params.", data=table.remove(res, 1)} ++ else ++ if #res <= 1 then ++ return res[1] or luci.json.null ++ else ++ return res ++ end ++ end ++end +diff --git a/feeds/luci/modules/luci-mod-rpc/luasrc/jsonrpcbind/uci.lua b/feeds/luci/modules/luci-mod-rpc/luasrc/jsonrpcbind/uci.lua +new file mode 100644 +index 0000000..284801e +--- /dev/null ++++ b/feeds/luci/modules/luci-mod-rpc/luasrc/jsonrpcbind/uci.lua +@@ -0,0 +1,83 @@ ++-- Copyright 2008 Steven Barth ++-- Copyright 2008 Jo-Philipp Wich ++-- Licensed to the public under the Apache License 2.0. ++ ++local uci = require "luci.model.uci".cursor() ++local ucis = require "luci.model.uci".cursor_state() ++local table = require "table" ++ ++ ++module "luci.jsonrpcbind.uci" ++_M, _PACKAGE, _NAME = nil, nil, nil ++ ++function add(config, ...) ++ uci:load(config) ++ local stat = uci:add(config, ...) ++ return uci:save(config) and stat ++end ++ ++function apply(config) ++ return uci:apply(config) ++end ++ ++function changes(...) ++ return uci:changes(...) ++end ++ ++function commit(config) ++ return uci:load(config) and uci:commit(config) ++end ++ ++function delete(config, ...) ++ uci:load(config) ++ return uci:delete(config, ...) and uci:save(config) ++end ++ ++function delete_all(config, ...) ++ uci:load(config) ++ return uci:delete_all(config, ...) and uci:save(config) ++end ++ ++function foreach(config, stype) ++ uci:load(config) ++ local sections = {} ++ ++ return uci:foreach(config, stype, function(section) ++ table.insert(sections, section) ++ end) and sections ++end ++ ++function get(config, ...) ++ uci:load(config) ++ return uci:get(config, ...) ++end ++ ++function get_all(config, ...) ++ uci:load(config) ++ return uci:get_all(config, ...) ++end ++ ++function get_state(config, ...) ++ ucis:load(config) ++ return ucis:get(config, ...) ++end ++ ++function revert(config) ++ return uci:load(config) and uci:revert(config) ++end ++ ++function section(config, ...) ++ uci:load(config) ++ return uci:section(config, ...) and uci:save(config) ++end ++ ++function set(config, ...) ++ uci:load(config) ++ return uci:set(config, ...) and uci:save(config) ++end ++ ++function tset(config, ...) ++ uci:load(config) ++ return uci:tset(config, ...) and uci:save(config) ++end ++ +diff --git a/feeds/luci/protocols/luci-proto-3g/Makefile b/feeds/luci/protocols/luci-proto-3g/Makefile +new file mode 100644 +index 0000000..d1d5455 +--- /dev/null ++++ b/feeds/luci/protocols/luci-proto-3g/Makefile +@@ -0,0 +1,14 @@ ++# ++# Copyright (C) 2008-2014 The LuCI Team ++# ++# This is free software, licensed under the Apache License, Version 2.0 . ++# ++ ++include $(TOPDIR)/rules.mk ++ ++LUCI_TITLE:=Support for 3G ++LUCI_DEPENDS:=+comgt ++ ++include ../../luci.mk ++ ++# call BuildPackage - OpenWrt buildroot signature +diff --git a/feeds/luci/protocols/luci-proto-3g/luasrc/model/cbi/admin_network/proto_3g.lua b/feeds/luci/protocols/luci-proto-3g/luasrc/model/cbi/admin_network/proto_3g.lua +new file mode 100644 +index 0000000..1b2e23c +--- /dev/null ++++ b/feeds/luci/protocols/luci-proto-3g/luasrc/model/cbi/admin_network/proto_3g.lua +@@ -0,0 +1,147 @@ ++-- Copyright 2011 Jo-Philipp Wich ++-- Licensed to the public under the Apache License 2.0. ++ ++local map, section, net = ... ++ ++local device, apn, service, pincode, username, password, dialnumber ++local ipv6, maxwait, defaultroute, metric, peerdns, dns, ++ keepalive_failure, keepalive_interval, demand ++ ++ ++device = section:taboption("general", Value, "device", translate("Modem device")) ++device.rmempty = false ++ ++local device_suggestions = nixio.fs.glob("/dev/tty[A-Z]*") ++ or nixio.fs.glob("/dev/tts/*") ++ ++if device_suggestions then ++ local node ++ for node in device_suggestions do ++ device:value(node) ++ end ++end ++ ++ ++service = section:taboption("general", Value, "service", translate("Service Type")) ++service:value("", translate("-- Please choose --")) ++service:value("umts", "UMTS/GPRS") ++service:value("umts_only", translate("UMTS only")) ++service:value("gprs_only", translate("GPRS only")) ++service:value("evdo", "CDMA/EV-DO") ++ ++ ++apn = section:taboption("general", Value, "apn", translate("APN")) ++ ++ ++pincode = section:taboption("general", Value, "pincode", translate("PIN")) ++ ++ ++username = section:taboption("general", Value, "username", translate("PAP/CHAP username")) ++ ++ ++password = section:taboption("general", Value, "password", translate("PAP/CHAP password")) ++password.password = true ++ ++dialnumber = section:taboption("general", Value, "dialnumber", translate("Dial number")) ++dialnumber.placeholder = "*99***1#" ++ ++if luci.model.network:has_ipv6() then ++ ++ ipv6 = section:taboption("advanced", ListValue, "ipv6") ++ ipv6:value("auto", translate("Automatic")) ++ ipv6:value("0", translate("Disabled")) ++ ipv6:value("1", translate("Manual")) ++ ipv6.default = "auto" ++ ++end ++ ++ ++maxwait = section:taboption("advanced", Value, "maxwait", ++ translate("Modem init timeout"), ++ translate("Maximum amount of seconds to wait for the modem to become ready")) ++ ++maxwait.placeholder = "20" ++maxwait.datatype = "min(1)" ++ ++ ++defaultroute = section:taboption("advanced", Flag, "defaultroute", ++ translate("Use default gateway"), ++ translate("If unchecked, no default route is configured")) ++ ++defaultroute.default = defaultroute.enabled ++ ++ ++metric = section:taboption("advanced", Value, "metric", ++ translate("Use gateway metric")) ++ ++metric.placeholder = "0" ++metric.datatype = "uinteger" ++metric:depends("defaultroute", defaultroute.enabled) ++ ++ ++peerdns = section:taboption("advanced", Flag, "peerdns", ++ translate("Use DNS servers advertised by peer"), ++ translate("If unchecked, the advertised DNS server addresses are ignored")) ++ ++peerdns.default = peerdns.enabled ++ ++ ++dns = section:taboption("advanced", DynamicList, "dns", ++ translate("Use custom DNS servers")) ++ ++dns:depends("peerdns", "") ++dns.datatype = "ipaddr" ++dns.cast = "string" ++ ++ ++keepalive_failure = section:taboption("advanced", Value, "_keepalive_failure", ++ translate("LCP echo failure threshold"), ++ translate("Presume peer to be dead after given amount of LCP echo failures, use 0 to ignore failures")) ++ ++function keepalive_failure.cfgvalue(self, section) ++ local v = m:get(section, "keepalive") ++ if v and #v > 0 then ++ return tonumber(v:match("^(%d+)[ ,]+%d+") or v) ++ end ++end ++ ++function keepalive_failure.write() end ++function keepalive_failure.remove() end ++ ++keepalive_failure.placeholder = "0" ++keepalive_failure.datatype = "uinteger" ++ ++ ++keepalive_interval = section:taboption("advanced", Value, "_keepalive_interval", ++ translate("LCP echo interval"), ++ translate("Send LCP echo requests at the given interval in seconds, only effective in conjunction with failure threshold")) ++ ++function keepalive_interval.cfgvalue(self, section) ++ local v = m:get(section, "keepalive") ++ if v and #v > 0 then ++ return tonumber(v:match("^%d+[ ,]+(%d+)")) ++ end ++end ++ ++function keepalive_interval.write(self, section, value) ++ local f = tonumber(keepalive_failure:formvalue(section)) or 0 ++ local i = tonumber(value) or 5 ++ if i < 1 then i = 1 end ++ if f > 0 then ++ m:set(section, "keepalive", "%d %d" %{ f, i }) ++ else ++ m:del(section, "keepalive") ++ end ++end ++ ++keepalive_interval.remove = keepalive_interval.write ++keepalive_interval.placeholder = "5" ++keepalive_interval.datatype = "min(1)" ++ ++ ++demand = section:taboption("advanced", Value, "demand", ++ translate("Inactivity timeout"), ++ translate("Close inactive connection after the given amount of seconds, use 0 to persist connection")) ++ ++demand.placeholder = "0" ++demand.datatype = "uinteger" +diff --git a/feeds/luci/protocols/luci-proto-ipv6/Makefile b/feeds/luci/protocols/luci-proto-ipv6/Makefile +new file mode 100644 +index 0000000..e749bc9 +--- /dev/null ++++ b/feeds/luci/protocols/luci-proto-ipv6/Makefile +@@ -0,0 +1,14 @@ ++# ++# Copyright (C) 2008-2014 The LuCI Team ++# ++# This is free software, licensed under the Apache License, Version 2.0 . ++# ++ ++include $(TOPDIR)/rules.mk ++ ++LUCI_TITLE:=Support for DHCPv6/6in4/6to4/6rd/DS-Lite/aiccu ++LUCI_DEPENDS:= ++ ++include ../../luci.mk ++ ++# call BuildPackage - OpenWrt buildroot signature +diff --git a/feeds/luci/protocols/luci-proto-ipv6/luasrc/model/cbi/admin_network/proto_464xlat.lua b/feeds/luci/protocols/luci-proto-ipv6/luasrc/model/cbi/admin_network/proto_464xlat.lua +new file mode 100644 +index 0000000..5a37582 +--- /dev/null ++++ b/feeds/luci/protocols/luci-proto-ipv6/luasrc/model/cbi/admin_network/proto_464xlat.lua +@@ -0,0 +1,33 @@ ++-- Copyright 2011 Jo-Philipp Wich ++-- Copyright 2013 Steven Barth ++-- Licensed to the public under the Apache License 2.0. ++ ++local map, section, net = ... ++local tunlink, defaultroute, metric, mtu ++ ++section:taboption("general", Value, "ip6prefix", ++ translate("NAT64 Prefix"), translate("Leave empty to autodetect")) ++ ++tunlink = section:taboption("advanced", DynamicList, "tunlink", translate("Tunnel Link")) ++tunlink.template = "cbi/network_netlist" ++tunlink.nocreate = true ++ ++ ++defaultroute = section:taboption("advanced", Flag, "defaultroute", ++ translate("Default gateway"), ++ translate("If unchecked, no default route is configured")) ++ ++defaultroute.default = defaultroute.enabled ++ ++ ++metric = section:taboption("advanced", Value, "metric", ++ translate("Use gateway metric")) ++ ++metric.placeholder = "0" ++metric.datatype = "uinteger" ++metric:depends("defaultroute", defaultroute.enabled) ++ ++ ++mtu = section:taboption("advanced", Value, "mtu", translate("Use MTU on tunnel interface")) ++mtu.placeholder = "1280" ++mtu.datatype = "max(9200)" +diff --git a/feeds/luci/protocols/luci-proto-ipv6/luasrc/model/cbi/admin_network/proto_6in4.lua b/feeds/luci/protocols/luci-proto-ipv6/luasrc/model/cbi/admin_network/proto_6in4.lua +new file mode 100644 +index 0000000..88dfe09 +--- /dev/null ++++ b/feeds/luci/protocols/luci-proto-ipv6/luasrc/model/cbi/admin_network/proto_6in4.lua +@@ -0,0 +1,102 @@ ++-- Copyright 2011 Jo-Philipp Wich ++-- Licensed to the public under the Apache License 2.0. ++ ++local map, section, net = ... ++ ++local ipaddr, peeraddr, ip6addr, tunnelid, username, password ++local defaultroute, metric, ttl, mtu ++ ++ ++ipaddr = s:taboption("general", Value, "ipaddr", ++ translate("Local IPv4 address"), ++ translate("Leave empty to use the current WAN address")) ++ ++ipaddr.datatype = "ip4addr" ++ ++ ++peeraddr = s:taboption("general", Value, "peeraddr", ++ translate("Remote IPv4 address"), ++ translate("This is usually the address of the nearest PoP operated by the tunnel broker")) ++ ++peeraddr.rmempty = false ++peeraddr.datatype = "ip4addr" ++ ++ ++ip6addr = s:taboption("general", Value, "ip6addr", ++ translate("Local IPv6 address"), ++ translate("This is the local endpoint address assigned by the tunnel broker, it usually ends with :2")) ++ ++ip6addr.datatype = "ip6addr" ++ ++ ++local ip6prefix = s:taboption("general", Value, "ip6prefix", ++ translate("IPv6 routed prefix"), ++ translate("This is the prefix routed to you by the tunnel broker for use by clients")) ++ ++ip6prefix.datatype = "ip6addr" ++ ++ ++local update = section:taboption("general", Flag, "_update", ++ translate("Dynamic tunnel"), ++ translate("Enable HE.net dynamic endpoint update")) ++ ++update.enabled = "1" ++update.disabled = "0" ++ ++function update.write() end ++function update.remove() end ++function update.cfgvalue(self, section) ++ return (tonumber(m:get(section, "tunnelid")) ~= nil) ++ and self.enabled or self.disabled ++end ++ ++ ++tunnelid = section:taboption("general", Value, "tunnelid", translate("Tunnel ID")) ++tunnelid.datatype = "uinteger" ++tunnelid:depends("_update", update.enabled) ++ ++ ++username = section:taboption("general", Value, "username", ++ translate("HE.net username"), ++ translate("This is the plain username for logging into the account")) ++ ++username:depends("_update", update.enabled) ++username.validate = function(self, val, sid) ++ if type(val) == "string" and #val == 32 and val:match("^[a-fA-F0-9]+$") then ++ return nil, translate("The HE.net endpoint update configuration changed, you must now use the plain username instead of the user ID!") ++ end ++ return val ++end ++ ++ ++password = section:taboption("general", Value, "password", ++ translate("HE.net password"), ++ translate("This is either the \"Update Key\" configured for the tunnel or the account password if no update key has been configured")) ++ ++password.password = true ++password:depends("_update", update.enabled) ++ ++ ++defaultroute = section:taboption("advanced", Flag, "defaultroute", ++ translate("Default gateway"), ++ translate("If unchecked, no default route is configured")) ++ ++defaultroute.default = defaultroute.enabled ++ ++ ++metric = section:taboption("advanced", Value, "metric", ++ translate("Use gateway metric")) ++ ++metric.placeholder = "0" ++metric.datatype = "uinteger" ++metric:depends("defaultroute", defaultroute.enabled) ++ ++ ++ttl = section:taboption("advanced", Value, "ttl", translate("Use TTL on tunnel interface")) ++ttl.placeholder = "64" ++ttl.datatype = "range(1,255)" ++ ++ ++mtu = section:taboption("advanced", Value, "mtu", translate("Use MTU on tunnel interface")) ++mtu.placeholder = "1280" ++mtu.datatype = "max(9200)" +diff --git a/feeds/luci/protocols/luci-proto-ipv6/luasrc/model/cbi/admin_network/proto_6rd.lua b/feeds/luci/protocols/luci-proto-ipv6/luasrc/model/cbi/admin_network/proto_6rd.lua +new file mode 100644 +index 0000000..708a9c5 +--- /dev/null ++++ b/feeds/luci/protocols/luci-proto-ipv6/luasrc/model/cbi/admin_network/proto_6rd.lua +@@ -0,0 +1,72 @@ ++-- Copyright 2011-2012 Jo-Philipp Wich ++-- Licensed to the public under the Apache License 2.0. ++ ++local map, section, net = ... ++ ++local ipaddr, peeraddr, ip6addr, tunnelid, username, password ++local defaultroute, metric, ttl, mtu ++ ++ ++ipaddr = s:taboption("general", Value, "ipaddr", ++ translate("Local IPv4 address"), ++ translate("Leave empty to use the current WAN address")) ++ ++ipaddr.datatype = "ip4addr" ++ ++ ++peeraddr = s:taboption("general", Value, "peeraddr", ++ translate("Remote IPv4 address"), ++ translate("This IPv4 address of the relay")) ++ ++peeraddr.rmempty = false ++peeraddr.datatype = "ip4addr" ++ ++ ++ip6addr = s:taboption("general", Value, "ip6prefix", ++ translate("IPv6 prefix"), ++ translate("The IPv6 prefix assigned to the provider, usually ends with ::")) ++ ++ip6addr.rmempty = false ++ip6addr.datatype = "ip6addr" ++ ++ ++ip6prefixlen = s:taboption("general", Value, "ip6prefixlen", ++ translate("IPv6 prefix length"), ++ translate("The length of the IPv6 prefix in bits")) ++ ++ip6prefixlen.placeholder = "16" ++ip6prefixlen.datatype = "range(0,128)" ++ ++ ++ip6prefixlen = s:taboption("general", Value, "ip4prefixlen", ++ translate("IPv4 prefix length"), ++ translate("The length of the IPv4 prefix in bits, the remainder is used in the IPv6 addresses.")) ++ ++ip6prefixlen.placeholder = "0" ++ip6prefixlen.datatype = "range(0,32)" ++ ++ ++ ++defaultroute = section:taboption("advanced", Flag, "defaultroute", ++ translate("Default gateway"), ++ translate("If unchecked, no default route is configured")) ++ ++defaultroute.default = defaultroute.enabled ++ ++ ++metric = section:taboption("advanced", Value, "metric", ++ translate("Use gateway metric")) ++ ++metric.placeholder = "0" ++metric.datatype = "uinteger" ++metric:depends("defaultroute", defaultroute.enabled) ++ ++ ++ttl = section:taboption("advanced", Value, "ttl", translate("Use TTL on tunnel interface")) ++ttl.placeholder = "64" ++ttl.datatype = "range(1,255)" ++ ++ ++mtu = section:taboption("advanced", Value, "mtu", translate("Use MTU on tunnel interface")) ++mtu.placeholder = "1280" ++mtu.datatype = "max(9200)" +diff --git a/feeds/luci/protocols/luci-proto-ipv6/luasrc/model/cbi/admin_network/proto_6to4.lua b/feeds/luci/protocols/luci-proto-ipv6/luasrc/model/cbi/admin_network/proto_6to4.lua +new file mode 100644 +index 0000000..50a7069 +--- /dev/null ++++ b/feeds/luci/protocols/luci-proto-ipv6/luasrc/model/cbi/admin_network/proto_6to4.lua +@@ -0,0 +1,37 @@ ++-- Copyright 2011 Jo-Philipp Wich ++-- Licensed to the public under the Apache License 2.0. ++ ++local map, section, net = ... ++ ++local ipaddr, defaultroute, metric, ttl, mtu ++ ++ ++ipaddr = section:taboption("general", Value, "ipaddr", ++ translate("Local IPv4 address"), ++ translate("Leave empty to use the current WAN address")) ++ ++ipaddr.datatype = "ip4addr" ++ ++defaultroute = section:taboption("advanced", Flag, "defaultroute", ++ translate("Use default gateway"), ++ translate("If unchecked, no default route is configured")) ++ ++defaultroute.default = defaultroute.enabled ++ ++ ++metric = section:taboption("advanced", Value, "metric", ++ translate("Use gateway metric")) ++ ++metric.placeholder = "0" ++metric.datatype = "uinteger" ++metric:depends("defaultroute", defaultroute.enabled) ++ ++ ++ttl = section:taboption("advanced", Value, "ttl", translate("Use TTL on tunnel interface")) ++ttl.placeholder = "64" ++ttl.datatype = "range(1,255)" ++ ++ ++mtu = section:taboption("advanced", Value, "mtu", translate("Use MTU on tunnel interface")) ++mtu.placeholder = "1280" ++mtu.datatype = "max(9200)" +diff --git a/feeds/luci/protocols/luci-proto-ipv6/luasrc/model/cbi/admin_network/proto_aiccu.lua b/feeds/luci/protocols/luci-proto-ipv6/luasrc/model/cbi/admin_network/proto_aiccu.lua +new file mode 100644 +index 0000000..9315dc2 +--- /dev/null ++++ b/feeds/luci/protocols/luci-proto-ipv6/luasrc/model/cbi/admin_network/proto_aiccu.lua +@@ -0,0 +1,136 @@ ++-- Copyright 2015 Paul Oranje ++-- Licensed to the public under the Apache License 2.0. ++ ++local map, section, net = ... ++ ++-- config read by /lib/netifd/proto/aiccu.sh ++local username, password, protocol, server, tunnelid, ip6prefix, requiretls, nat, heartbeat, ++ verbose, ntpsynctimeout, ip6addr, sourcerouting, defaultroute ++ ++-- generic parameters ++local metric, ttl, mtu ++ ++ ++username = section:taboption("general", Value, "username", ++ translate("Server username"), ++ translate("SIXXS-handle[/Tunnel-ID]")) ++username.datatype = "string" ++ ++password = section:taboption("general", Value, "password", ++ translate("Server password"), ++ translate("Server password, enter the specific password of the tunnel when the username contains the tunnel ID")) ++password.datatype = "string" ++password.password = true ++ ++ ++--[[ SIXXS supports only TIC as tunnel broker protocol, no use setting it. ++protocol = section:taboption("general", ListValue, "protocol", ++ translate("Tunnel broker protocol"), ++ translate("SIXXS supports TIC only, for static tunnels using IP protocol 41 (RFC4213) use 6in4 instead")) ++ ++protocol:value("tic", "TIC") ++protocol:value("tsp", "TSP") ++protocol:value("l2tp", "L2TP") ++protocol.default = "tic" ++protocol.optional = true ++--]] ++ ++ ++server = section:taboption("general", Value, "server", ++ translate("Tunnel setup server"), ++ translate("Optional, specify to override default server (tic.sixxs.net)")) ++server.datatype = "host" ++server.optional = true ++ ++ ++tunnelid = section:taboption("general", Value, "tunnelid", ++ translate("Tunnel ID"), ++ translate("Optional, use when the SIXXS account has more than one tunnel")) ++tunnelid.datatype = "string" ++tunnelid.optional = true ++ ++ ++local ip6prefix = section:taboption("general", Value, "ip6prefix", ++ translate("IPv6 prefix"), ++ translate("Routed IPv6 prefix for downstream interfaces")) ++ip6prefix.datatype = "ip6addr" ++ip6prefix.optional = true ++ ++ ++heartbeat = s:taboption("general", ListValue, "heartbeat", ++ translate("Tunnel type"), ++ translate("Also see Tunneling Comparison on SIXXS")) ++heartbeat:value("0", translate("AYIYA")) ++heartbeat:value("1", translate("Heartbeat")) ++heartbeat.default = "0" ++ ++ ++nat = section:taboption("general", Flag, "nat", ++ translate("Behind NAT"), ++ translate("The tunnel end-point is behind NAT, defaults to disabled and only applies to AYIYA")) ++nat.optional = true ++nat.default = nat.disabled ++ ++ ++requiretls = section:taboption("general", Flag, "requiretls", ++ translate("Require TLS"), ++ translate("Connection to server fails when TLS cannot be used")) ++requiretls.optional = true ++requiretls.default = requiretls.disabled ++ ++ ++verbose = section:taboption("advanced", Flag, "verbose", ++ translate("Verbose"), ++ translate("Verbose logging by aiccu daemon")) ++verbose.optional = true ++verbose.default = verbose.disabled ++ ++ ++ntpsynctimeout = section:taboption("advanced", Value, "ntpsynctimeout", ++ translate("NTP sync time-out"), ++ translate("Wait for NTP sync that many seconds, seting to 0 disables waiting (optional)")) ++ntpsynctimeout.datatype = "uinteger" ++ntpsynctimeout.placeholder = "90" ++ntpsynctimeout.optional = true ++ ++ ++ip6addr = section:taboption("advanced", Value, "ip6addr", ++ translate("Local IPv6 address"), ++ translate("IPv6 address delegated to the local tunnel endpoint (optional)")) ++ip6addr.datatype = "ip6addr" ++ip6addr.optional = true ++ ++ ++defaultroute = section:taboption("advanced", Flag, "defaultroute", ++ translate("Default route"), ++ translate("Whether to create an IPv6 default route over the tunnel")) ++defaultroute.default = defaultroute.enabled ++defaultroute.optional = true ++ ++ ++sourcerouting = section:taboption("advanced", Flag, "sourcerouting", ++ translate("Source routing"), ++ translate("Whether to route only packets from delegated prefixes")) ++sourcerouting.default = sourcerouting.enabled ++sourcerouting.optional = true ++ ++ ++metric = section:taboption("advanced", Value, "metric", ++ translate("Use gateway metric")) ++metric.datatype = "uinteger" ++metric.placeholder = "0" ++metric:depends("defaultroute", defaultroute.enabled) ++ ++ ++ttl = section:taboption("advanced", Value, "ttl", ++ translate("Use TTL on tunnel interface")) ++ttl.datatype = "range(1,255)" ++ttl.placeholder = "64" ++ ++ ++mtu = section:taboption("advanced", Value, "mtu", ++ translate("Use MTU on tunnel interface"), ++ translate("minimum 1280, maximum 1480")) ++mtu.datatype = "range(1280,1480)" ++mtu.placeholder = "1280" ++ +diff --git a/feeds/luci/protocols/luci-proto-ipv6/luasrc/model/cbi/admin_network/proto_dhcpv6.lua b/feeds/luci/protocols/luci-proto-ipv6/luasrc/model/cbi/admin_network/proto_dhcpv6.lua +new file mode 100644 +index 0000000..c843161 +--- /dev/null ++++ b/feeds/luci/protocols/luci-proto-ipv6/luasrc/model/cbi/admin_network/proto_dhcpv6.lua +@@ -0,0 +1,58 @@ ++-- Copyright 2013 Steven Barth ++-- Licensed to the public under the Apache License 2.0. ++ ++local map, section, net = ... ++ ++ ++local o = section:taboption("general", ListValue, "reqaddress", ++ translate("Request IPv6-address")) ++o:value("try") ++o:value("force") ++o:value("none", "disabled") ++o.default = "try" ++ ++ ++o = section:taboption("general", Value, "reqprefix", ++ translate("Request IPv6-prefix of length")) ++o:value("auto", translate("automatic")) ++o:value("no", translate("disabled")) ++o:value("48") ++o:value("52") ++o:value("56") ++o:value("60") ++o:value("64") ++o.default = "auto" ++ ++ ++o = section:taboption("advanced", Flag, "defaultroute", ++ translate("Use default gateway"), ++ translate("If unchecked, no default route is configured")) ++o.default = o.enabled ++ ++ ++o = section:taboption("advanced", Flag, "peerdns", ++ translate("Use DNS servers advertised by peer"), ++ translate("If unchecked, the advertised DNS server addresses are ignored")) ++o.default = o.enabled ++ ++ ++o = section:taboption("advanced", Value, "ip6prefix", ++ translate("Custom delegated IPv6-prefix")) ++o.dataype = "ip6addr" ++ ++ ++o = section:taboption("advanced", DynamicList, "dns", ++ translate("Use custom DNS servers")) ++o:depends("peerdns", "") ++o.datatype = "list(ip6addr)" ++o.cast = "string" ++ ++ ++o = section:taboption("advanced", Value, "clientid", ++ translate("Client ID to send when requesting DHCP")) ++ ++luci.tools.proto.opt_macaddr(section, ifc, translate("Override MAC address")) ++ ++o = section:taboption("advanced", Value, "mtu", translate("Override MTU")) ++o.placeholder = "1500" ++o.datatype = "max(9200)" +diff --git a/feeds/luci/protocols/luci-proto-ipv6/luasrc/model/cbi/admin_network/proto_dslite.lua b/feeds/luci/protocols/luci-proto-ipv6/luasrc/model/cbi/admin_network/proto_dslite.lua +new file mode 100644 +index 0000000..9069ff0 +--- /dev/null ++++ b/feeds/luci/protocols/luci-proto-ipv6/luasrc/model/cbi/admin_network/proto_dslite.lua +@@ -0,0 +1,53 @@ ++-- Copyright 2011 Jo-Philipp Wich ++-- Copyright 2013 Steven Barth ++-- Licensed to the public under the Apache License 2.0. ++ ++local map, section, net = ... ++ ++local peeraddr, ip6addr ++local tunlink, defaultroute, metric, ttl, mtu ++ ++ ++ ++ ++peeraddr = section:taboption("general", Value, "peeraddr", ++ translate("DS-Lite AFTR address")) ++ ++peeraddr.rmempty = false ++peeraddr.datatype = "ip6addr" ++ ++ip6addr = section:taboption("general", Value, "ip6addr", ++ translate("Local IPv6 address"), ++ translate("Leave empty to use the current WAN address")) ++ ++ip6addr.datatype = "ip6addr" ++ ++ ++tunlink = section:taboption("advanced", DynamicList, "tunlink", translate("Tunnel Link")) ++tunlink.template = "cbi/network_netlist" ++tunlink.nocreate = true ++ ++ ++defaultroute = section:taboption("advanced", Flag, "defaultroute", ++ translate("Default gateway"), ++ translate("If unchecked, no default route is configured")) ++ ++defaultroute.default = defaultroute.enabled ++ ++ ++metric = section:taboption("advanced", Value, "metric", ++ translate("Use gateway metric")) ++ ++metric.placeholder = "0" ++metric.datatype = "uinteger" ++metric:depends("defaultroute", defaultroute.enabled) ++ ++ ++ttl = section:taboption("advanced", Value, "ttl", translate("Use TTL on tunnel interface")) ++ttl.placeholder = "64" ++ttl.datatype = "range(1,255)" ++ ++ ++mtu = section:taboption("advanced", Value, "mtu", translate("Use MTU on tunnel interface")) ++mtu.placeholder = "1280" ++mtu.datatype = "max(9200)" +diff --git a/feeds/luci/protocols/luci-proto-ipv6/luasrc/model/cbi/admin_network/proto_hnet.lua b/feeds/luci/protocols/luci-proto-ipv6/luasrc/model/cbi/admin_network/proto_hnet.lua +new file mode 100644 +index 0000000..2ed34fa +--- /dev/null ++++ b/feeds/luci/protocols/luci-proto-ipv6/luasrc/model/cbi/admin_network/proto_hnet.lua +@@ -0,0 +1,37 @@ ++-- Copyright 2013 Steven Barth ++-- Licensed to the public under the Apache License 2.0. ++ ++local map, section, net = ... ++ ++local mode = section:taboption("general", ListValue, "mode", translate("Category")) ++mode:value("auto", translate("Automatic")) ++mode:value("external", translate("External")) ++mode:value("internal", translate("Internal")) ++mode:value("leaf", translate("Leaf")) ++mode:value("guest", translate("Guest")) ++mode:value("adhoc", translate("Ad-Hoc")) ++mode:value("hybrid", translate("Hybrid")) ++mode.default = "auto" ++ ++ ++ ++local plen = section:taboption("advanced", Value, "ip6assign", translate("IPv6 assignment length"), ++ translate("Assign a part of given length of every public IPv6-prefix to this interface")) ++plen.datatype = "max(128)" ++plen.default = "64" ++ ++section:taboption("advanced", Value, "link_id", translate("IPv6 assignment hint"), ++ translate("Assign prefix parts using this hexadecimal subprefix ID for this interface.")) ++ ++plen = section:taboption("advanced", Value, "ip4assign", translate("IPv4 assignment length")) ++plen.datatype = "max(32)" ++plen.default = "24" ++ ++local o = section:taboption("advanced", Value, "dnsname", translate("DNS-Label / FQDN")) ++o.default = map.name ++ ++luci.tools.proto.opt_macaddr(section, ifc, translate("Override MAC address")) ++ ++o = section:taboption("advanced", Value, "mtu", translate("Override MTU")) ++o.placeholder = "1500" ++o.datatype = "max(9200)" +diff --git a/feeds/luci/protocols/luci-proto-ipv6/luasrc/model/cbi/admin_network/proto_map.lua b/feeds/luci/protocols/luci-proto-ipv6/luasrc/model/cbi/admin_network/proto_map.lua +new file mode 100644 +index 0000000..2f8108e +--- /dev/null ++++ b/feeds/luci/protocols/luci-proto-ipv6/luasrc/model/cbi/admin_network/proto_map.lua +@@ -0,0 +1,88 @@ ++-- Copyright 2011 Jo-Philipp Wich ++-- Copyright 2013 Steven Barth ++-- Licensed to the public under the Apache License 2.0. ++ ++local map, section, net = ... ++ ++local peeraddr, ip6addr ++local tunlink, defaultroute, metric, ttl, mtu ++ ++ ++maptype = section:taboption("general", ListValue, "type", translate("Type")) ++maptype:value("map-e", "MAP-E") ++maptype:value("map-t", "MAP-T") ++maptype:value("lw4o6", "LW4over6") ++ ++ ++peeraddr = section:taboption("general", Value, "peeraddr", ++ translate("BR / DMR / AFTR")) ++ ++peeraddr.rmempty = false ++peeraddr.datatype = "ip6addr" ++ ++ ++ipaddr = section:taboption("general", Value, "ipaddr", ++ translate("IPv4 prefix")) ++ipaddr.datatype = "ip4addr" ++ ++ ++ip4prefixlen = s:taboption("general", Value, "ip4prefixlen", ++ translate("IPv4 prefix length"), ++ translate("The length of the IPv4 prefix in bits, the remainder is used in the IPv6 addresses.")) ++ ++ip4prefixlen.placeholder = "32" ++ip4prefixlen.datatype = "range(0,32)" ++ ++ip6addr = s:taboption("general", Value, "ip6prefix", ++ translate("IPv6 prefix"), ++ translate("The IPv6 prefix assigned to the provider, usually ends with ::")) ++ ++ip6addr.rmempty = false ++ip6addr.datatype = "ip6addr" ++ ++ ++ip6prefixlen = s:taboption("general", Value, "ip6prefixlen", ++ translate("IPv6 prefix length"), ++ translate("The length of the IPv6 prefix in bits")) ++ ++ip6prefixlen.placeholder = "16" ++ip6prefixlen.datatype = "range(0,64)" ++ ++ ++s:taboption("general", Value, "ealen", ++ translate("EA-bits length")).datatype = "range(0,16)" ++ ++s:taboption("general", Value, "psidlen", ++ translate("PSID-bits length")).datatype = "range(0,16)" ++ ++s:taboption("general", Value, "offset", ++ translate("PSID offset")).datatype = "range(0,16)" ++ ++tunlink = section:taboption("advanced", DynamicList, "tunlink", translate("Tunnel Link")) ++tunlink.template = "cbi/network_netlist" ++tunlink.nocreate = true ++ ++ ++defaultroute = section:taboption("advanced", Flag, "defaultroute", ++ translate("Default gateway"), ++ translate("If unchecked, no default route is configured")) ++ ++defaultroute.default = defaultroute.enabled ++ ++ ++metric = section:taboption("advanced", Value, "metric", ++ translate("Use gateway metric")) ++ ++metric.placeholder = "0" ++metric.datatype = "uinteger" ++metric:depends("defaultroute", defaultroute.enabled) ++ ++ ++ttl = section:taboption("advanced", Value, "ttl", translate("Use TTL on tunnel interface")) ++ttl.placeholder = "64" ++ttl.datatype = "range(1,255)" ++ ++ ++mtu = section:taboption("advanced", Value, "mtu", translate("Use MTU on tunnel interface")) ++mtu.placeholder = "1280" ++mtu.datatype = "max(9200)" +diff --git a/feeds/luci/protocols/luci-proto-ipv6/luasrc/model/network/proto_4x6.lua b/feeds/luci/protocols/luci-proto-ipv6/luasrc/model/network/proto_4x6.lua +new file mode 100644 +index 0000000..d876d69 +--- /dev/null ++++ b/feeds/luci/protocols/luci-proto-ipv6/luasrc/model/network/proto_4x6.lua +@@ -0,0 +1,63 @@ ++-- Copyright 2011 Jo-Philipp Wich ++-- Copyright 2013 Steven Barth ++-- Licensed to the public under the Apache License 2.0. ++ ++local netmod = luci.model.network ++ ++local _, p ++for _, p in ipairs({"dslite", "map", "464xlat"}) do ++ ++ local proto = netmod:register_protocol(p) ++ ++ function proto.get_i18n(self) ++ if p == "dslite" then ++ return luci.i18n.translate("Dual-Stack Lite (RFC6333)") ++ elseif p == "map" then ++ return luci.i18n.translate("MAP / LW4over6") ++ elseif p == "464xlat" then ++ return luci.i18n.translate("464XLAT (CLAT)") ++ end ++ end ++ ++ function proto.ifname(self) ++ return p .. "-" .. self.sid ++ end ++ ++ function proto.opkg_package(self) ++ if p == "dslite" then ++ return "ds-lite" ++ elseif p == "map" then ++ return "map-t" ++ elseif p == "464xlat" then ++ return "464xlat" ++ end ++ end ++ ++ function proto.is_installed(self) ++ return nixio.fs.access("/lib/netifd/proto/" .. p .. ".sh") ++ end ++ ++ function proto.is_floating(self) ++ return true ++ end ++ ++ function proto.is_virtual(self) ++ return true ++ end ++ ++ function proto.get_interfaces(self) ++ return nil ++ end ++ ++ function proto.contains_interface(self, ifname) ++ return (netmod:ifnameof(ifc) == self:ifname()) ++ end ++ ++ if p == "dslite" then ++ netmod:register_pattern_virtual("^ds-%w") ++ elseif p == "map" then ++ netmod:register_pattern_virtual("^map-%w") ++ elseif p == "464xlat" then ++ netmod:register_pattern_virtual("^464-%w") ++ end ++end +diff --git a/feeds/luci/protocols/luci-proto-ipv6/luasrc/model/network/proto_6x4.lua b/feeds/luci/protocols/luci-proto-ipv6/luasrc/model/network/proto_6x4.lua +new file mode 100644 +index 0000000..d267ce9 +--- /dev/null ++++ b/feeds/luci/protocols/luci-proto-ipv6/luasrc/model/network/proto_6x4.lua +@@ -0,0 +1,50 @@ ++-- Copyright 2011 Jo-Philipp Wich ++-- Licensed to the public under the Apache License 2.0. ++ ++local netmod = luci.model.network ++ ++local _, p ++for _, p in ipairs({"6in4", "6to4", "6rd"}) do ++ ++ local proto = netmod:register_protocol(p) ++ ++ function proto.get_i18n(self) ++ if p == "6in4" then ++ return luci.i18n.translate("IPv6-in-IPv4 (RFC4213)") ++ elseif p == "6to4" then ++ return luci.i18n.translate("IPv6-over-IPv4 (6to4)") ++ elseif p == "6rd" then ++ return luci.i18n.translate("IPv6-over-IPv4 (6rd)") ++ end ++ end ++ ++ function proto.ifname(self) ++ return p .. "-" .. self.sid ++ end ++ ++ function proto.opkg_package(self) ++ return p ++ end ++ ++ function proto.is_installed(self) ++ return nixio.fs.access("/lib/netifd/proto/" .. p .. ".sh") ++ end ++ ++ function proto.is_floating(self) ++ return true ++ end ++ ++ function proto.is_virtual(self) ++ return true ++ end ++ ++ function proto.get_interfaces(self) ++ return nil ++ end ++ ++ function proto.contains_interface(self, ifname) ++ return (netmod:ifnameof(ifc) == self:ifname()) ++ end ++ ++ netmod:register_pattern_virtual("^%s-%%w" % p) ++end +diff --git a/feeds/luci/protocols/luci-proto-ipv6/luasrc/model/network/proto_aiccu.lua b/feeds/luci/protocols/luci-proto-ipv6/luasrc/model/network/proto_aiccu.lua +new file mode 100644 +index 0000000..5896a27 +--- /dev/null ++++ b/feeds/luci/protocols/luci-proto-ipv6/luasrc/model/network/proto_aiccu.lua +@@ -0,0 +1,49 @@ ++-- Copyright 2015 Paul Oranje ++-- Licensed to the public under GPLv2 ++ ++local netmod = luci.model.network ++local interface = luci.model.network.interface ++ ++local proto = netmod:register_protocol("aiccu") ++ ++function proto.get_i18n(self) ++ return luci.i18n.translate("AICCU (SIXXS)") ++end ++ ++function proto.ifname(self) ++ return "aiccu-" .. self.sid ++end ++ ++function proto.get_interface(self) ++ return interface(self:ifname(), self) ++end ++ ++function proto.is_installed(self) ++ return nixio.fs.access("/lib/netifd/proto/aiccu.sh") ++end ++ ++function proto.opkg_package(self) ++ return "aiccu" ++end ++ ++function proto.is_floating(self) ++ return true ++end ++ ++function proto.is_virtual(self) ++ return true ++end ++ ++function proto.get_interfaces(self) ++ return nil ++end ++ ++function proto.contains_interface(self, ifname) ++ if self:is_floating() then ++ return (netmod:ifnameof(ifc) == self:ifname()) ++ else ++ return netmod.protocol.contains_interface(self, ifc) ++ end ++end ++ ++netmod:register_pattern_virtual("^aiccu-%%w") +diff --git a/feeds/luci/protocols/luci-proto-ipv6/luasrc/model/network/proto_dhcpv6.lua b/feeds/luci/protocols/luci-proto-ipv6/luasrc/model/network/proto_dhcpv6.lua +new file mode 100644 +index 0000000..0b45dad +--- /dev/null ++++ b/feeds/luci/protocols/luci-proto-ipv6/luasrc/model/network/proto_dhcpv6.lua +@@ -0,0 +1,16 @@ ++-- Copyright 2013 Jo-Philipp Wich ++-- Licensed to the public under the Apache License 2.0. ++ ++local proto = luci.model.network:register_protocol("dhcpv6") ++ ++function proto.get_i18n(self) ++ return luci.i18n.translate("DHCPv6 client") ++end ++ ++function proto.is_installed(self) ++ return nixio.fs.access("/lib/netifd/proto/dhcpv6.sh") ++end ++ ++function proto.opkg_package(self) ++ return "odhcp6c" ++end +diff --git a/feeds/luci/protocols/luci-proto-ipv6/luasrc/model/network/proto_hnet.lua b/feeds/luci/protocols/luci-proto-ipv6/luasrc/model/network/proto_hnet.lua +new file mode 100644 +index 0000000..f525061 +--- /dev/null ++++ b/feeds/luci/protocols/luci-proto-ipv6/luasrc/model/network/proto_hnet.lua +@@ -0,0 +1,16 @@ ++-- Copyright 2014 Steven Barth ++-- Licensed to the public under the Apache License 2.0. ++ ++local proto = luci.model.network:register_protocol("hnet") ++ ++function proto.get_i18n(self) ++ return luci.i18n.translate("Automatic Homenet (HNCP)") ++end ++ ++function proto.is_installed(self) ++ return nixio.fs.access("/lib/netifd/proto/hnet.sh") ++end ++ ++function proto.opkg_package(self) ++ return "hnet-full" ++end +diff --git a/feeds/luci/protocols/luci-proto-openconnect/Makefile b/feeds/luci/protocols/luci-proto-openconnect/Makefile +new file mode 100644 +index 0000000..31f5274 +--- /dev/null ++++ b/feeds/luci/protocols/luci-proto-openconnect/Makefile +@@ -0,0 +1,14 @@ ++# ++# Copyright (C) 2008-2014 The LuCI Team ++# ++# This is free software, licensed under the Apache License, Version 2.0 . ++# ++ ++include $(TOPDIR)/rules.mk ++ ++LUCI_TITLE:=Support for OpenConnect VPN ++LUCI_DEPENDS:=+openconnect ++ ++include ../../luci.mk ++ ++# call BuildPackage - OpenWrt buildroot signature +diff --git a/feeds/luci/protocols/luci-proto-openconnect/luasrc/model/cbi/admin_network/proto_openconnect.lua b/feeds/luci/protocols/luci-proto-openconnect/luasrc/model/cbi/admin_network/proto_openconnect.lua +new file mode 100644 +index 0000000..4ed34ae +--- /dev/null ++++ b/feeds/luci/protocols/luci-proto-openconnect/luasrc/model/cbi/admin_network/proto_openconnect.lua +@@ -0,0 +1,86 @@ ++-- Copyright 2014 Nikos Mavrogiannopoulos ++-- Licensed to the public under the Apache License 2.0. ++ ++local map, section, net = ... ++ ++local server, username, password, cert, ca ++local oc_cert_file, oc_key_file, oc_ca_file ++ ++local ifc = net:get_interface():name() ++ ++oc_cert_file = "/etc/openconnect/user-cert-" .. ifc .. ".pem" ++oc_key_file = "/etc/openconnect/user-key-" .. ifc .. ".pem" ++oc_ca_file = "/etc/openconnect/ca-" .. ifc .. ".pem" ++ ++server = section:taboption("general", Value, "server", translate("VPN Server")) ++server.datatype = "host" ++ ++port = section:taboption("general", Value, "port", translate("VPN Server port")) ++port.placeholder = "443" ++port.datatype = "port" ++ ++ifname = section:taboption("general", Value, "interface", translate("Output Interface")) ++ifname.template = "cbi/network_netlist" ++ ++defaultroute = section:taboption("advanced", Flag, "defaultroute", ++ translate("Use default gateway"), ++ translate("If unchecked, no default route is configured")) ++ ++defaultroute.default = defaultroute.enabled ++ ++ ++metric = section:taboption("advanced", Value, "metric", ++ translate("Use gateway metric")) ++ ++metric.placeholder = "0" ++metric.datatype = "uinteger" ++metric:depends("defaultroute", defaultroute.enabled) ++ ++section:taboption("general", Value, "serverhash", translate("VPN Server's certificate SHA1 hash")) ++ ++section:taboption("general", Value, "authgroup", translate("AuthGroup")) ++ ++username = section:taboption("general", Value, "username", translate("Username")) ++password = section:taboption("general", Value, "password", translate("Password")) ++password.password = true ++ ++ ++cert = section:taboption("advanced", Value, "usercert", translate("User certificate (PEM encoded)")) ++cert.template = "cbi/tvalue" ++cert.rows = 10 ++ ++function cert.cfgvalue(self, section) ++ return nixio.fs.readfile(oc_cert_file) ++end ++ ++function cert.write(self, section, value) ++ value = value:gsub("\r\n?", "\n") ++ nixio.fs.writefile(oc_cert_file, value) ++end ++ ++cert = section:taboption("advanced", Value, "userkey", translate("User key (PEM encoded)")) ++cert.template = "cbi/tvalue" ++cert.rows = 10 ++ ++function cert.cfgvalue(self, section) ++ return nixio.fs.readfile(oc_key_file) ++end ++ ++function cert.write(self, section, value) ++ value = value:gsub("\r\n?", "\n") ++ nixio.fs.writefile(oc_key_file, value) ++end ++ ++ ++ca = section:taboption("advanced", Value, "ca", translate("CA certificate; if empty it will be saved after the first connection.")) ++ca.template = "cbi/tvalue" ++ca.rows = 10 ++ ++function ca.cfgvalue(self, section) ++ return nixio.fs.readfile(oc_ca_file) ++end ++ ++function ca.write(self, section, value) ++ value = value:gsub("\r\n?", "\n") ++ nixio.fs.writefile(oc_ca_file, value) ++end +diff --git a/feeds/luci/protocols/luci-proto-openconnect/luasrc/model/network/proto_openconnect.lua b/feeds/luci/protocols/luci-proto-openconnect/luasrc/model/network/proto_openconnect.lua +new file mode 100644 +index 0000000..0af77d0 +--- /dev/null ++++ b/feeds/luci/protocols/luci-proto-openconnect/luasrc/model/network/proto_openconnect.lua +@@ -0,0 +1,45 @@ ++-- Copyright 2012 David Woodhouse ++-- Licensed to the public under the Apache License 2.0. ++ ++local netmod = luci.model.network ++local interface = luci.model.network.interface ++local proto = netmod:register_protocol("openconnect") ++ ++function proto.get_i18n(self) ++ return luci.i18n.translate("OpenConnect (CISCO AnyConnect)") ++end ++ ++function proto.ifname(self) ++ return "vpn-" .. self.sid ++end ++ ++function proto.get_interface(self) ++ return interface(self:ifname(), self) ++end ++ ++function proto.opkg_package(self) ++ return "openconnect" ++end ++ ++function proto.is_installed(self) ++ return nixio.fs.access("/lib/netifd/proto/openconnect.sh") ++end ++ ++function proto.is_floating(self) ++ return true ++end ++ ++function proto.is_virtual(self) ++ return true ++end ++ ++function proto.get_interfaces(self) ++ return nil ++end ++ ++function proto.contains_interface(self, ifc) ++ return (netmod:ifnameof(ifc) == self:ifname()) ++ ++end ++ ++netmod:register_pattern_virtual("^vpn-%w") +diff --git a/feeds/luci/protocols/luci-proto-ppp/Makefile b/feeds/luci/protocols/luci-proto-ppp/Makefile +new file mode 100644 +index 0000000..70db744 +--- /dev/null ++++ b/feeds/luci/protocols/luci-proto-ppp/Makefile +@@ -0,0 +1,14 @@ ++# ++# Copyright (C) 2008-2014 The LuCI Team ++# ++# This is free software, licensed under the Apache License, Version 2.0 . ++# ++ ++include $(TOPDIR)/rules.mk ++ ++LUCI_TITLE:=Support for PPP/PPPoE/PPPoA/PPtP ++LUCI_DEPENDS:= ++ ++include ../../luci.mk ++ ++# call BuildPackage - OpenWrt buildroot signature +diff --git a/feeds/luci/protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_l2tp.lua b/feeds/luci/protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_l2tp.lua +new file mode 100644 +index 0000000..523ef1b +--- /dev/null ++++ b/feeds/luci/protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_l2tp.lua +@@ -0,0 +1,61 @@ ++-- Copyright 2011 Jo-Philipp Wich ++-- Licensed to the public under the Apache License 2.0. ++ ++local map, section, net = ... ++ ++local server, username, password ++local ipv6, defaultroute, metric, peerdns, dns, mtu ++ ++ ++server = section:taboption("general", Value, "server", translate("L2TP Server")) ++server.datatype = "host" ++ ++ ++username = section:taboption("general", Value, "username", translate("PAP/CHAP username")) ++ ++ ++password = section:taboption("general", Value, "password", translate("PAP/CHAP password")) ++password.password = true ++ ++if luci.model.network:has_ipv6() then ++ ++ ipv6 = section:taboption("advanced", ListValue, "ipv6") ++ ipv6:value("auto", translate("Automatic")) ++ ipv6:value("0", translate("Disabled")) ++ ipv6:value("1", translate("Manual")) ++ ipv6.default = "auto" ++ ++end ++ ++defaultroute = section:taboption("advanced", Flag, "defaultroute", ++ translate("Use default gateway"), ++ translate("If unchecked, no default route is configured")) ++ ++defaultroute.default = defaultroute.enabled ++ ++ ++metric = section:taboption("advanced", Value, "metric", ++ translate("Use gateway metric")) ++ ++metric.placeholder = "0" ++metric.datatype = "uinteger" ++metric:depends("defaultroute", defaultroute.enabled) ++ ++ ++peerdns = section:taboption("advanced", Flag, "peerdns", ++ translate("Use DNS servers advertised by peer"), ++ translate("If unchecked, the advertised DNS server addresses are ignored")) ++ ++peerdns.default = peerdns.enabled ++ ++ ++dns = section:taboption("advanced", DynamicList, "dns", ++ translate("Use custom DNS servers")) ++ ++dns:depends("peerdns", "") ++dns.datatype = "ipaddr" ++dns.cast = "string" ++ ++mtu = section:taboption("advanced", Value, "mtu", translate("Override MTU")) ++mtu.placeholder = "1500" ++mtu.datatype = "max(9200)" +diff --git a/feeds/luci/protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_ppp.lua b/feeds/luci/protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_ppp.lua +new file mode 100644 +index 0000000..b14db59 +--- /dev/null ++++ b/feeds/luci/protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_ppp.lua +@@ -0,0 +1,127 @@ ++-- Copyright 2011 Jo-Philipp Wich ++-- Licensed to the public under the Apache License 2.0. ++ ++local map, section, net = ... ++ ++local device, username, password ++local ipv6, defaultroute, metric, peerdns, dns, ++ keepalive_failure, keepalive_interval, demand, mtu ++ ++ ++device = section:taboption("general", Value, "device", translate("Modem device")) ++device.rmempty = false ++ ++local device_suggestions = nixio.fs.glob("/dev/tty*S*") ++ or nixio.fs.glob("/dev/tts/*") ++ ++if device_suggestions then ++ local node ++ for node in device_suggestions do ++ device:value(node) ++ end ++end ++ ++ ++username = section:taboption("general", Value, "username", translate("PAP/CHAP username")) ++ ++ ++password = section:taboption("general", Value, "password", translate("PAP/CHAP password")) ++password.password = true ++ ++ ++if luci.model.network:has_ipv6() then ++ ++ ipv6 = section:taboption("advanced", ListValue, "ipv6") ++ ipv6:value("auto", translate("Automatic")) ++ ipv6:value("0", translate("Disabled")) ++ ipv6:value("1", translate("Manual")) ++ ipv6.default = "auto" ++ ++end ++ ++ ++defaultroute = section:taboption("advanced", Flag, "defaultroute", ++ translate("Use default gateway"), ++ translate("If unchecked, no default route is configured")) ++ ++defaultroute.default = defaultroute.enabled ++ ++ ++metric = section:taboption("advanced", Value, "metric", ++ translate("Use gateway metric")) ++ ++metric.placeholder = "0" ++metric.datatype = "uinteger" ++metric:depends("defaultroute", defaultroute.enabled) ++ ++ ++peerdns = section:taboption("advanced", Flag, "peerdns", ++ translate("Use DNS servers advertised by peer"), ++ translate("If unchecked, the advertised DNS server addresses are ignored")) ++ ++peerdns.default = peerdns.enabled ++ ++ ++dns = section:taboption("advanced", DynamicList, "dns", ++ translate("Use custom DNS servers")) ++ ++dns:depends("peerdns", "") ++dns.datatype = "ipaddr" ++dns.cast = "string" ++ ++ ++keepalive_failure = section:taboption("advanced", Value, "_keepalive_failure", ++ translate("LCP echo failure threshold"), ++ translate("Presume peer to be dead after given amount of LCP echo failures, use 0 to ignore failures")) ++ ++function keepalive_failure.cfgvalue(self, section) ++ local v = m:get(section, "keepalive") ++ if v and #v > 0 then ++ return tonumber(v:match("^(%d+)[ ,]+%d+") or v) ++ end ++end ++ ++keepalive_failure.placeholder = "0" ++keepalive_failure.datatype = "uinteger" ++ ++ ++keepalive_interval = section:taboption("advanced", Value, "_keepalive_interval", ++ translate("LCP echo interval"), ++ translate("Send LCP echo requests at the given interval in seconds, only effective in conjunction with failure threshold")) ++ ++function keepalive_interval.cfgvalue(self, section) ++ local v = m:get(section, "keepalive") ++ if v and #v > 0 then ++ return tonumber(v:match("^%d+[ ,]+(%d+)")) ++ end ++end ++ ++function keepalive_interval.write(self, section, value) ++ local f = tonumber(keepalive_failure:formvalue(section)) or 0 ++ local i = tonumber(value) or 5 ++ if i < 1 then i = 1 end ++ if f > 0 then ++ m:set(section, "keepalive", "%d %d" %{ f, i }) ++ else ++ m:del(section, "keepalive") ++ end ++end ++ ++keepalive_interval.remove = keepalive_interval.write ++keepalive_failure.write = keepalive_interval.write ++keepalive_failure.remove = keepalive_interval.write ++keepalive_interval.placeholder = "5" ++keepalive_interval.datatype = "min(1)" ++ ++ ++demand = section:taboption("advanced", Value, "demand", ++ translate("Inactivity timeout"), ++ translate("Close inactive connection after the given amount of seconds, use 0 to persist connection")) ++ ++demand.placeholder = "0" ++demand.datatype = "uinteger" ++ ++ ++mtu = section:taboption("advanced", Value, "mtu", translate("Override MTU")) ++mtu.placeholder = "1500" ++mtu.datatype = "max(9200)" +diff --git a/feeds/luci/protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_pppoa.lua b/feeds/luci/protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_pppoa.lua +new file mode 100644 +index 0000000..8f463e5 +--- /dev/null ++++ b/feeds/luci/protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_pppoa.lua +@@ -0,0 +1,133 @@ ++-- Copyright 2011 Jo-Philipp Wich ++-- Licensed to the public under the Apache License 2.0. ++ ++local map, section, net = ... ++ ++local encaps, atmdev, vci, vpi, username, password ++local ipv6, defaultroute, metric, peerdns, dns, ++ keepalive_failure, keepalive_interval, demand, mtu ++ ++ ++encaps = section:taboption("general", ListValue, "encaps", translate("PPPoA Encapsulation")) ++encaps:value("vc", "VC-Mux") ++encaps:value("llc", "LLC") ++ ++ ++atmdev = section:taboption("general", Value, "atmdev", translate("ATM device number")) ++atmdev.default = "0" ++atmdev.datatype = "uinteger" ++ ++ ++vci = section:taboption("general", Value, "vci", translate("ATM Virtual Channel Identifier (VCI)")) ++vci.default = "35" ++vci.datatype = "uinteger" ++ ++ ++vpi = section:taboption("general", Value, "vpi", translate("ATM Virtual Path Identifier (VPI)")) ++vpi.default = "8" ++vpi.datatype = "uinteger" ++ ++ ++username = section:taboption("general", Value, "username", translate("PAP/CHAP username")) ++ ++ ++password = section:taboption("general", Value, "password", translate("PAP/CHAP password")) ++password.password = true ++ ++ ++if luci.model.network:has_ipv6() then ++ ++ ipv6 = section:taboption("advanced", ListValue, "ipv6") ++ ipv6:value("auto", translate("Automatic")) ++ ipv6:value("0", translate("Disabled")) ++ ipv6:value("1", translate("Manual")) ++ ipv6.default = "auto" ++ ++end ++ ++ ++defaultroute = section:taboption("advanced", Flag, "defaultroute", ++ translate("Use default gateway"), ++ translate("If unchecked, no default route is configured")) ++ ++defaultroute.default = defaultroute.enabled ++ ++ ++metric = section:taboption("advanced", Value, "metric", ++ translate("Use gateway metric")) ++ ++metric.placeholder = "0" ++metric.datatype = "uinteger" ++metric:depends("defaultroute", defaultroute.enabled) ++ ++ ++peerdns = section:taboption("advanced", Flag, "peerdns", ++ translate("Use DNS servers advertised by peer"), ++ translate("If unchecked, the advertised DNS server addresses are ignored")) ++ ++peerdns.default = peerdns.enabled ++ ++ ++dns = section:taboption("advanced", DynamicList, "dns", ++ translate("Use custom DNS servers")) ++ ++dns:depends("peerdns", "") ++dns.datatype = "ipaddr" ++dns.cast = "string" ++ ++ ++keepalive_failure = section:taboption("advanced", Value, "_keepalive_failure", ++ translate("LCP echo failure threshold"), ++ translate("Presume peer to be dead after given amount of LCP echo failures, use 0 to ignore failures")) ++ ++function keepalive_failure.cfgvalue(self, section) ++ local v = m:get(section, "keepalive") ++ if v and #v > 0 then ++ return tonumber(v:match("^(%d+)[ ,]+%d+") or v) ++ end ++end ++ ++keepalive_failure.placeholder = "0" ++keepalive_failure.datatype = "uinteger" ++ ++ ++keepalive_interval = section:taboption("advanced", Value, "_keepalive_interval", ++ translate("LCP echo interval"), ++ translate("Send LCP echo requests at the given interval in seconds, only effective in conjunction with failure threshold")) ++ ++function keepalive_interval.cfgvalue(self, section) ++ local v = m:get(section, "keepalive") ++ if v and #v > 0 then ++ return tonumber(v:match("^%d+[ ,]+(%d+)")) ++ end ++end ++ ++function keepalive_interval.write(self, section, value) ++ local f = tonumber(keepalive_failure:formvalue(section)) or 0 ++ local i = tonumber(value) or 5 ++ if i < 1 then i = 1 end ++ if f > 0 then ++ m:set(section, "keepalive", "%d %d" %{ f, i }) ++ else ++ m:del(section, "keepalive") ++ end ++end ++ ++keepalive_interval.remove = keepalive_interval.write ++keepalive_failure.write = keepalive_interval.write ++keepalive_failure.remove = keepalive_interval.write ++keepalive_interval.placeholder = "5" ++keepalive_interval.datatype = "min(1)" ++ ++ ++demand = section:taboption("advanced", Value, "demand", ++ translate("Inactivity timeout"), ++ translate("Close inactive connection after the given amount of seconds, use 0 to persist connection")) ++ ++demand.placeholder = "0" ++demand.datatype = "uinteger" ++ ++ ++mtu = section:taboption("advanced", Value, "mtu", translate("Override MTU")) ++mtu.placeholder = "1500" ++mtu.datatype = "max(9200)" +diff --git a/feeds/luci/protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_pppoe.lua b/feeds/luci/protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_pppoe.lua +new file mode 100644 +index 0000000..5a05cd2 +--- /dev/null ++++ b/feeds/luci/protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_pppoe.lua +@@ -0,0 +1,127 @@ ++-- Copyright 2011 Jo-Philipp Wich ++-- Licensed to the public under the Apache License 2.0. ++ ++local map, section, net = ... ++ ++local username, password, ac, service ++local ipv6, defaultroute, metric, peerdns, dns, ++ keepalive_failure, keepalive_interval, demand, mtu ++ ++ ++username = section:taboption("general", Value, "username", translate("PAP/CHAP username")) ++ ++ ++password = section:taboption("general", Value, "password", translate("PAP/CHAP password")) ++password.password = true ++ ++ ++ac = section:taboption("general", Value, "ac", ++ translate("Access Concentrator"), ++ translate("Leave empty to autodetect")) ++ ++ac.placeholder = translate("auto") ++ ++ ++service = section:taboption("general", Value, "service", ++ translate("Service Name"), ++ translate("Leave empty to autodetect")) ++ ++service.placeholder = translate("auto") ++ ++ ++if luci.model.network:has_ipv6() then ++ ++ ipv6 = section:taboption("advanced", ListValue, "ipv6") ++ ipv6:value("auto", translate("Automatic")) ++ ipv6:value("0", translate("Disabled")) ++ ipv6:value("1", translate("Manual")) ++ ipv6.default = "auto" ++ ++end ++ ++ ++defaultroute = section:taboption("advanced", Flag, "defaultroute", ++ translate("Use default gateway"), ++ translate("If unchecked, no default route is configured")) ++ ++defaultroute.default = defaultroute.enabled ++ ++ ++metric = section:taboption("advanced", Value, "metric", ++ translate("Use gateway metric")) ++ ++metric.placeholder = "0" ++metric.datatype = "uinteger" ++metric:depends("defaultroute", defaultroute.enabled) ++ ++ ++peerdns = section:taboption("advanced", Flag, "peerdns", ++ translate("Use DNS servers advertised by peer"), ++ translate("If unchecked, the advertised DNS server addresses are ignored")) ++ ++peerdns.default = peerdns.enabled ++ ++ ++dns = section:taboption("advanced", DynamicList, "dns", ++ translate("Use custom DNS servers")) ++ ++dns:depends("peerdns", "") ++dns.datatype = "ipaddr" ++dns.cast = "string" ++ ++ ++keepalive_failure = section:taboption("advanced", Value, "_keepalive_failure", ++ translate("LCP echo failure threshold"), ++ translate("Presume peer to be dead after given amount of LCP echo failures, use 0 to ignore failures")) ++ ++function keepalive_failure.cfgvalue(self, section) ++ local v = m:get(section, "keepalive") ++ if v and #v > 0 then ++ return tonumber(v:match("^(%d+)[ ,]+%d+") or v) ++ end ++end ++ ++keepalive_failure.placeholder = "0" ++keepalive_failure.datatype = "uinteger" ++ ++ ++keepalive_interval = section:taboption("advanced", Value, "_keepalive_interval", ++ translate("LCP echo interval"), ++ translate("Send LCP echo requests at the given interval in seconds, only effective in conjunction with failure threshold")) ++ ++function keepalive_interval.cfgvalue(self, section) ++ local v = m:get(section, "keepalive") ++ if v and #v > 0 then ++ return tonumber(v:match("^%d+[ ,]+(%d+)")) ++ end ++end ++ ++function keepalive_interval.write(self, section, value) ++ local f = tonumber(keepalive_failure:formvalue(section)) or 0 ++ local i = tonumber(value) or 5 ++ if i < 1 then i = 1 end ++ if f > 0 then ++ m:set(section, "keepalive", "%d %d" %{ f, i }) ++ else ++ m:del(section, "keepalive") ++ end ++end ++ ++keepalive_interval.remove = keepalive_interval.write ++keepalive_failure.write = keepalive_interval.write ++keepalive_failure.remove = keepalive_interval.write ++keepalive_interval.placeholder = "5" ++keepalive_interval.datatype = "min(1)" ++ ++ ++demand = section:taboption("advanced", Value, "demand", ++ translate("Inactivity timeout"), ++ translate("Close inactive connection after the given amount of seconds, use 0 to persist connection")) ++ ++demand.placeholder = "0" ++demand.datatype = "uinteger" ++ ++ ++mtu = section:taboption("advanced", Value, "mtu", translate("Override MTU")) ++mtu.placeholder = "1500" ++mtu.datatype = "max(9200)" +diff --git a/feeds/luci/protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_pptp.lua b/feeds/luci/protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_pptp.lua +new file mode 100644 +index 0000000..d81db1f +--- /dev/null ++++ b/feeds/luci/protocols/luci-proto-ppp/luasrc/model/cbi/admin_network/proto_pptp.lua +@@ -0,0 +1,106 @@ ++-- Copyright 2011-2012 Jo-Philipp Wich ++-- Licensed to the public under the Apache License 2.0. ++ ++local map, section, net = ... ++ ++local server, username, password ++local defaultroute, metric, peerdns, dns, ++ keepalive_failure, keepalive_interval, demand, mtu ++ ++ ++server = section:taboption("general", Value, "server", translate("VPN Server")) ++server.datatype = "host" ++ ++ ++username = section:taboption("general", Value, "username", translate("PAP/CHAP username")) ++ ++ ++password = section:taboption("general", Value, "password", translate("PAP/CHAP password")) ++password.password = true ++ ++ ++defaultroute = section:taboption("advanced", Flag, "defaultroute", ++ translate("Use default gateway"), ++ translate("If unchecked, no default route is configured")) ++ ++defaultroute.default = defaultroute.enabled ++ ++ ++metric = section:taboption("advanced", Value, "metric", ++ translate("Use gateway metric")) ++ ++metric.placeholder = "0" ++metric.datatype = "uinteger" ++metric:depends("defaultroute", defaultroute.enabled) ++ ++ ++peerdns = section:taboption("advanced", Flag, "peerdns", ++ translate("Use DNS servers advertised by peer"), ++ translate("If unchecked, the advertised DNS server addresses are ignored")) ++ ++peerdns.default = peerdns.enabled ++ ++ ++dns = section:taboption("advanced", DynamicList, "dns", ++ translate("Use custom DNS servers")) ++ ++dns:depends("peerdns", "") ++dns.datatype = "ipaddr" ++dns.cast = "string" ++ ++ ++keepalive_failure = section:taboption("advanced", Value, "_keepalive_failure", ++ translate("LCP echo failure threshold"), ++ translate("Presume peer to be dead after given amount of LCP echo failures, use 0 to ignore failures")) ++ ++function keepalive_failure.cfgvalue(self, section) ++ local v = m:get(section, "keepalive") ++ if v and #v > 0 then ++ return tonumber(v:match("^(%d+)[ ,]+%d+") or v) ++ end ++end ++ ++keepalive_failure.placeholder = "0" ++keepalive_failure.datatype = "uinteger" ++ ++ ++keepalive_interval = section:taboption("advanced", Value, "_keepalive_interval", ++ translate("LCP echo interval"), ++ translate("Send LCP echo requests at the given interval in seconds, only effective in conjunction with failure threshold")) ++ ++function keepalive_interval.cfgvalue(self, section) ++ local v = m:get(section, "keepalive") ++ if v and #v > 0 then ++ return tonumber(v:match("^%d+[ ,]+(%d+)")) ++ end ++end ++ ++function keepalive_interval.write(self, section, value) ++ local f = tonumber(keepalive_failure:formvalue(section)) or 0 ++ local i = tonumber(value) or 5 ++ if i < 1 then i = 1 end ++ if f > 0 then ++ m:set(section, "keepalive", "%d %d" %{ f, i }) ++ else ++ m:del(section, "keepalive") ++ end ++end ++ ++keepalive_interval.remove = keepalive_interval.write ++keepalive_failure.write = keepalive_interval.write ++keepalive_failure.remove = keepalive_interval.write ++keepalive_interval.placeholder = "5" ++keepalive_interval.datatype = "min(1)" ++ ++ ++demand = section:taboption("advanced", Value, "demand", ++ translate("Inactivity timeout"), ++ translate("Close inactive connection after the given amount of seconds, use 0 to persist connection")) ++ ++demand.placeholder = "0" ++demand.datatype = "uinteger" ++ ++ ++mtu = section:taboption("advanced", Value, "mtu", translate("Override MTU")) ++mtu.placeholder = "1500" ++mtu.datatype = "max(9200)" +diff --git a/feeds/luci/protocols/luci-proto-ppp/luasrc/model/network/proto_ppp.lua b/feeds/luci/protocols/luci-proto-ppp/luasrc/model/network/proto_ppp.lua +new file mode 100644 +index 0000000..e84658c +--- /dev/null ++++ b/feeds/luci/protocols/luci-proto-ppp/luasrc/model/network/proto_ppp.lua +@@ -0,0 +1,88 @@ ++-- Copyright 2011 Jo-Philipp Wich ++-- Licensed to the public under the Apache License 2.0. ++ ++local netmod = luci.model.network ++ ++local _, p ++for _, p in ipairs({"ppp", "pptp", "pppoe", "pppoa", "3g", "l2tp"}) do ++ ++ local proto = netmod:register_protocol(p) ++ ++ function proto.get_i18n(self) ++ if p == "ppp" then ++ return luci.i18n.translate("PPP") ++ elseif p == "pptp" then ++ return luci.i18n.translate("PPtP") ++ elseif p == "3g" then ++ return luci.i18n.translate("UMTS/GPRS/EV-DO") ++ elseif p == "pppoe" then ++ return luci.i18n.translate("PPPoE") ++ elseif p == "pppoa" then ++ return luci.i18n.translate("PPPoATM") ++ elseif p == "l2tp" then ++ return luci.i18n.translate("L2TP") ++ end ++ end ++ ++ function proto.ifname(self) ++ return p .. "-" .. self.sid ++ end ++ ++ function proto.opkg_package(self) ++ if p == "ppp" then ++ return p ++ elseif p == "3g" then ++ return "comgt" ++ elseif p == "pptp" then ++ return "ppp-mod-pptp" ++ elseif p == "pppoe" then ++ return "ppp-mod-pppoe" ++ elseif p == "pppoa" then ++ return "ppp-mod-pppoa" ++ elseif p == "l2tp" then ++ return "xl2tpd" ++ end ++ end ++ ++ function proto.is_installed(self) ++ if p == "pppoa" then ++ return (nixio.fs.glob("/usr/lib/pppd/*/pppoatm.so")() ~= nil) ++ elseif p == "pppoe" then ++ return (nixio.fs.glob("/usr/lib/pppd/*/rp-pppoe.so")() ~= nil) ++ elseif p == "pptp" then ++ return (nixio.fs.glob("/usr/lib/pppd/*/pptp.so")() ~= nil) ++ elseif p == "3g" then ++ return nixio.fs.access("/lib/netifd/proto/3g.sh") ++ elseif p == "l2tp" then ++ return nixio.fs.access("/lib/netifd/proto/l2tp.sh") ++ else ++ return nixio.fs.access("/lib/netifd/proto/ppp.sh") ++ end ++ end ++ ++ function proto.is_floating(self) ++ return (p ~= "pppoe") ++ end ++ ++ function proto.is_virtual(self) ++ return true ++ end ++ ++ function proto.get_interfaces(self) ++ if self:is_floating() then ++ return nil ++ else ++ return netmod.protocol.get_interfaces(self) ++ end ++ end ++ ++ function proto.contains_interface(self, ifc) ++ if self:is_floating() then ++ return (netmod:ifnameof(ifc) == self:ifname()) ++ else ++ return netmod.protocol.contains_interface(self, ifc) ++ end ++ end ++ ++ netmod:register_pattern_virtual("^%s-%%w" % p) ++end +diff --git a/feeds/luci/protocols/luci-proto-relay/Makefile b/feeds/luci/protocols/luci-proto-relay/Makefile +new file mode 100644 +index 0000000..d9c04f7 +--- /dev/null ++++ b/feeds/luci/protocols/luci-proto-relay/Makefile +@@ -0,0 +1,14 @@ ++# ++# Copyright (C) 2008-2014 The LuCI Team ++# ++# This is free software, licensed under the Apache License, Version 2.0 . ++# ++ ++include $(TOPDIR)/rules.mk ++ ++LUCI_TITLE:=Support for relayd pseudo bridges ++LUCI_DEPENDS:=+relayd ++ ++include ../../luci.mk ++ ++# call BuildPackage - OpenWrt buildroot signature +diff --git a/feeds/luci/protocols/luci-proto-relay/luasrc/model/cbi/admin_network/proto_relay.lua b/feeds/luci/protocols/luci-proto-relay/luasrc/model/cbi/admin_network/proto_relay.lua +new file mode 100644 +index 0000000..3381d85 +--- /dev/null ++++ b/feeds/luci/protocols/luci-proto-relay/luasrc/model/cbi/admin_network/proto_relay.lua +@@ -0,0 +1,68 @@ ++-- Copyright 2011 Jo-Philipp Wich ++-- Licensed to the public under the Apache License 2.0. ++ ++local map, section, net = ... ++ ++local ipaddr, network ++local forward_bcast, forward_dhcp, gateway, expiry, retry, table ++ ++ ++ipaddr = section:taboption("general", Value, "ipaddr", ++ translate("Local IPv4 address"), ++ translate("Address to access local relay bridge")) ++ ++ipaddr.datatype = "ip4addr" ++ ++ ++network = s:taboption("general", DynamicList, "network", translate("Relay between networks")) ++network.widget = "checkbox" ++network.exclude = arg[1] ++network.template = "cbi/network_netlist" ++network.nocreate = true ++network.nobridges = true ++network.novirtual = true ++network:depends("proto", "relay") ++ ++ ++forward_bcast = section:taboption("advanced", Flag, "forward_bcast", ++ translate("Forward broadcast traffic")) ++ ++forward_bcast.default = forward_bcast.enabled ++ ++ ++forward_dhcp = section:taboption("advanced", Flag, "forward_dhcp", ++ translate("Forward DHCP traffic")) ++ ++forward_dhcp.default = forward_dhcp.enabled ++ ++ ++gateway = section:taboption("advanced", Value, "gateway", ++ translate("Use DHCP gateway"), ++ translate("Override the gateway in DHCP responses")) ++ ++gateway.datatype = "ip4addr" ++gateway:depends("forward_dhcp", forward_dhcp.enabled) ++ ++ ++expiry = section:taboption("advanced", Value, "expiry", ++ translate("Host expiry timeout"), ++ translate("Specifies the maximum amount of seconds after which hosts are presumed to be dead")) ++ ++expiry.placeholder = "30" ++expiry.datatype = "min(1)" ++ ++ ++retry = section:taboption("advanced", Value, "retry", ++ translate("ARP retry threshold"), ++ translate("Specifies the maximum amount of failed ARP requests until hosts are presumed to be dead")) ++ ++retry.placeholder = "5" ++retry.datatype = "min(1)" ++ ++ ++table = section:taboption("advanced", Value, "table", ++ translate("Use routing table"), ++ translate("Override the table used for internal routes")) ++ ++table.placeholder = "16800" ++table.datatype = "range(0,65535)" +diff --git a/feeds/luci/protocols/luci-proto-relay/luasrc/model/network/proto_relay.lua b/feeds/luci/protocols/luci-proto-relay/luasrc/model/network/proto_relay.lua +new file mode 100644 +index 0000000..5d40fc7 +--- /dev/null ++++ b/feeds/luci/protocols/luci-proto-relay/luasrc/model/network/proto_relay.lua +@@ -0,0 +1,149 @@ ++-- Copyright 2011 Jo-Philipp Wich ++-- Licensed to the public under the Apache License 2.0. ++ ++local netmod = luci.model.network ++local device = luci.util.class(netmod.interface) ++ ++netmod:register_pattern_virtual("^relay-%w") ++ ++local proto = netmod:register_protocol("relay") ++ ++function proto.get_i18n(self) ++ return luci.i18n.translate("Relay bridge") ++end ++ ++function proto.ifname(self) ++ return "relay-" .. self.sid ++end ++ ++function proto.opkg_package(self) ++ return "relayd" ++end ++ ++function proto.is_installed(self) ++ return nixio.fs.access("/etc/init.d/relayd") ++end ++ ++function proto.is_floating(self) ++ return true ++end ++ ++function proto.is_virtual(self) ++ return true ++end ++ ++function proto.get_interface(self) ++ return device(self.sid, self) ++end ++ ++function proto.get_interfaces(self) ++ if not self.ifaces then ++ local ifs = { } ++ local _, net, dev ++ ++ for net in luci.util.imatch(self:_get("network")) do ++ net = netmod:get_network(net) ++ if net then ++ dev = net:get_interface() ++ if dev then ++ ifs[dev:name()] = dev ++ end ++ end ++ end ++ ++ for dev in luci.util.imatch(self:_get("ifname")) do ++ dev = netmod:get_interface(dev) ++ if dev then ++ ifs[dev:name()] = dev ++ end ++ end ++ ++ self.ifaces = { } ++ ++ for _, dev in luci.util.kspairs(ifs) do ++ self.ifaces[#self.ifaces+1] = dev ++ end ++ end ++ ++ return self.ifaces ++end ++ ++function proto.uptime(self) ++ local net ++ local upt = 0 ++ for net in luci.util.imatch(self:_get("network")) do ++ net = netmod:get_network(net) ++ if net then ++ upt = math.max(upt, net:uptime()) ++ end ++ end ++ return upt ++end ++ ++ ++function device.__init__(self, ifname, network) ++ self.ifname = ifname ++ self.network = network ++end ++ ++function device.type(self) ++ return "tunnel" ++end ++ ++function device.is_up(self) ++ if self.network then ++ local _, dev ++ for _, dev in ipairs(self.network:get_interfaces()) do ++ if not dev:is_up() then ++ return false ++ end ++ end ++ return true ++ end ++ return false ++end ++ ++function device._stat(self, what) ++ local v = 0 ++ if self.network then ++ local _, dev ++ for _, dev in ipairs(self.network:get_interfaces()) do ++ v = v + dev[what](dev) ++ end ++ end ++ return v ++end ++ ++function device.rx_bytes(self) return self:_stat("rx_bytes") end ++function device.tx_bytes(self) return self:_stat("tx_bytes") end ++function device.rx_packets(self) return self:_stat("rx_packets") end ++function device.tx_packets(self) return self:_stat("tx_packets") end ++ ++function device.mac(self) ++ if self.network then ++ local _, dev ++ for _, dev in ipairs(self.network:get_interfaces()) do ++ return dev:mac() ++ end ++ end ++end ++ ++function device.ipaddrs(self) ++ local addrs = { } ++ if self.network then ++ addrs[1] = luci.ip.IPv4(self.network:_get("ipaddr")) ++ end ++ return addrs ++end ++ ++function device.ip6addrs(self) ++ return { } ++end ++ ++function device.shortname(self) ++ return "%s %q" % { luci.i18n.translate("Relay"), self.ifname } ++end ++ ++function device.get_type_i18n(self) ++ return luci.i18n.translate("Relay Bridge") ++end +diff --git a/feeds/luci/themes/luci-theme-bootstrap/Makefile b/feeds/luci/themes/luci-theme-bootstrap/Makefile +new file mode 100644 +index 0000000..c4e684e +--- /dev/null ++++ b/feeds/luci/themes/luci-theme-bootstrap/Makefile +@@ -0,0 +1,14 @@ ++# ++# Copyright (C) 2008-2014 The LuCI Team ++# ++# This is free software, licensed under the Apache License, Version 2.0 . ++# ++ ++include $(TOPDIR)/rules.mk ++ ++LUCI_TITLE:=Bootstrap Theme (default) ++LUCI_DEPENDS:= ++ ++include ../../luci.mk ++ ++# call BuildPackage - OpenWrt buildroot signature +diff --git a/feeds/luci/themes/luci-theme-bootstrap/htdocs/luci-static/bootstrap/cascade.css b/feeds/luci/themes/luci-theme-bootstrap/htdocs/luci-static/bootstrap/cascade.css +new file mode 100644 +index 0000000..b19a6a0 +--- /dev/null ++++ b/feeds/luci/themes/luci-theme-bootstrap/htdocs/luci-static/bootstrap/cascade.css +@@ -0,0 +1,1950 @@ ++/*! ++ * LuCI Bootstrap Theme ++ * Copyright 2012 Nut & Bolt ++ * By David Menting ++ * Based on Bootstrap v1.4.0 ++ * ++ * Copyright 2011 Twitter, Inc ++ * Licensed under the Apache License v2.0 ++ * http://www.apache.org/licenses/LICENSE-2.0 ++ * ++ * Designed and built with all the love in the world @twitter by @mdo and @fat. ++ */ ++/* Reset.less ++ * Props to Eric Meyer (meyerweb.com) for his CSS reset file. We're using an adapted version here that cuts out some of the reset HTML elements we will never need here (i.e., dfn, samp, etc). ++ * ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- */ ++html { ++ margin: 0; ++ padding: 0; ++} ++ ++body { ++ margin: 0; ++ padding: 5px; ++} ++ ++h1, h2, h3, h4, h5, h6, p, pre, a, abbr, acronym, code, del, em, img, q, s, ++small, strike, strong, sub, sup, tt, var, dd, dl, dt, li, ol, ul, fieldset, ++form, label, legend, button, table, caption, tbody, tfoot, thead, tr, th, td { ++ margin: 0; ++ padding: 0; ++ border: 0; ++ font-weight: normal; ++ font-style: normal; ++ font-size: 100%; ++ line-height: 1; ++ font-family: inherit; ++} ++ ++abbr[title], acronym[title] { ++ border-bottom: 1px dotted; ++ cursor: help; ++} ++ ++table { ++ border-collapse: collapse; ++ border-spacing: 0; ++} ++ ++ol, ul { ++ list-style: none; ++} ++ ++q:before, ++q:after, ++blockquote:before, ++blockquote:after { ++ content: ""; ++} ++ ++html { ++ overflow-y: scroll; ++ font-size: 100%; ++ -webkit-text-size-adjust: 100%; ++ -ms-text-size-adjust: 100%; ++} ++ ++a:focus { ++ outline: thin dotted; ++} ++ ++a:hover, a:active { ++ outline: 0; ++} ++ ++article, ++aside, ++details, ++figcaption, ++figure, ++footer, ++header, ++hgroup, ++nav, ++section { ++ display: block; ++} ++ ++sub, sup { ++ font-size: 75%; ++ line-height: 0; ++ position: relative; ++ vertical-align: baseline; ++} ++ ++sup { ++ top: -0.5em; ++} ++ ++sub { ++ bottom: -0.25em; ++} ++ ++img { ++ border: 0; ++ -ms-interpolation-mode: bicubic; ++} ++ ++button, ++input, ++select, ++option, ++textarea { ++ font-size: 100%; ++ margin: 0; ++ -webkit-box-sizing: border-box; ++ -moz-box-sizing: border-box; ++ box-sizing: border-box; ++ vertical-align: baseline; ++ *vertical-align: middle; ++} ++ ++button, input { ++ line-height: normal; ++ *overflow: visible; ++} ++ ++button::-moz-focus-inner, input::-moz-focus-inner { ++ border: 0; ++ padding: 0; ++} ++ ++button, ++input[type="button"], ++input[type="reset"], ++input[type="submit"] { ++ cursor: pointer; ++ -webkit-appearance: button; ++} ++ ++input[type="search"] { ++ -webkit-appearance: textfield; ++ -webkit-box-sizing: content-box; ++ -moz-box-sizing: content-box; ++ box-sizing: content-box; ++} ++ ++input[type="search"]::-webkit-search-decoration { ++ -webkit-appearance: none; ++} ++ ++textarea { ++ overflow: auto; ++ vertical-align: top; ++} ++ ++/* ++ * Scaffolding ++ * Basic and global styles for generating a grid system, structural layout, and page templates ++ * ------------------------------------------------------------------------------------------- */ ++body { ++ background-color: #ffffff; ++ margin: 0; ++ font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; ++ font-size: 13px; ++ font-weight: normal; ++ line-height: 18px; ++ color: #404040; ++ padding-top: 58px; ++} ++ ++.container { ++ width: 100%; ++ max-width: 940px; ++ margin-left: auto; ++ margin-right: auto; ++ zoom: 1; ++} ++ ++.container:before, .container:after { ++ display: table; ++ content: ""; ++ zoom: 1; ++} ++ ++.container:after { ++ clear: both; ++} ++ ++a { ++ color: #0069d6; ++ text-decoration: none; ++ line-height: inherit; ++ font-weight: inherit; ++} ++ ++a:hover { ++ color: #00438a; ++ text-decoration: underline; ++} ++ ++.pull-right { ++ float: right; ++} ++ ++.pull-left { ++ float: left; ++} ++ ++/* Typography.less ++ * Headings, body text, lists, code, and more for a versatile and durable typography system ++ * ---------------------------------------------------------------------------------------- */ ++p, ++.cbi-map-descr, ++.cbi-section-descr { ++ font-size: 13px; ++ font-weight: normal; ++ line-height: 18px; ++ margin-bottom: 9px; ++} ++ ++p small { ++ font-size: 11px; ++ color: #bfbfbf; ++} ++ ++h1, ++h2, ++h3, ++h4, ++h5, ++h6 { ++ font-weight: bold; ++ color: #404040; ++} ++ ++h1 small, ++h2 small, ++h3 small, ++h4 small, ++h5 small, ++h6 small { ++ color: #bfbfbf; ++} ++ ++h1 { ++ margin-bottom: 18px; ++ font-size: 30px; ++ line-height: 36px; ++} ++ ++h1 small { ++ font-size: 18px; ++} ++ ++h2 { ++ font-size: 24px; ++ line-height: 36px; ++} ++ ++h2 small { ++ font-size: 14px; ++} ++ ++h3, ++h4, ++h5, ++h6 { ++ line-height: 36px; ++} ++ ++h3 { ++ font-size: 18px; ++} ++ ++h3 small { ++ font-size: 14px; ++} ++ ++h4 { ++ font-size: 16px; ++} ++ ++h4 small { ++ font-size: 12px; ++} ++ ++h5 { ++ font-size: 14px; ++} ++ ++h6 { ++ font-size: 13px; ++ color: #bfbfbf; ++ text-transform: uppercase; ++} ++ ++ul, ol { ++ margin: 0 0 18px 25px; ++} ++ ++ul ul, ++ul ol, ++ol ol, ++ol ul { ++ margin-bottom: 0; ++} ++ ++ul { ++ list-style: disc; ++} ++ ++ol { ++ list-style: decimal; ++} ++ ++li { ++ line-height: 18px; ++ color: #808080; ++} ++ ++ul.unstyled { ++ list-style: none; ++ margin-left: 0; ++} ++ ++dl { ++ margin-bottom: 18px; ++} ++ ++dl dt, dl dd { ++ line-height: 18px; ++} ++ ++dl dt { ++ font-weight: bold; ++} ++ ++dl dd { ++ margin-left: 9px; ++} ++ ++hr { ++ margin: 20px 0 19px; ++ border: 0; ++ border-bottom: 1px solid #eee; ++} ++ ++strong { ++ font-style: inherit; ++ font-weight: bold; ++} ++ ++em { ++ font-style: italic; ++ font-weight: inherit; ++ line-height: inherit; ++} ++ ++small { font-size: 0.9em } ++ ++address { ++ display: block; ++ line-height: 18px; ++ margin-bottom: 18px; ++} ++ ++code, pre { ++ padding: 0 3px 2px; ++ font-family: Monaco, Andale Mono, Courier New, monospace; ++ font-size: 12px; ++ -webkit-border-radius: 3px; ++ -moz-border-radius: 3px; ++ border-radius: 3px; ++} ++ ++code { ++ background-color: #fee9cc; ++ color: rgba(0, 0, 0, 0.75); ++ padding: 1px 3px; ++} ++ ++pre { ++ background-color: #f5f5f5; ++ display: block; ++ padding: 8.5px; ++ margin: 0 0 18px; ++ line-height: 18px; ++ font-size: 12px; ++ border: 1px solid #ccc; ++ border: 1px solid rgba(0, 0, 0, 0.15); ++ -webkit-border-radius: 3px; ++ -moz-border-radius: 3px; ++ border-radius: 3px; ++ white-space: pre; ++ white-space: pre-wrap; ++ word-wrap: break-word; ++} ++ ++/* Forms.less ++ * Base styles for various input types, form layouts, and states ++ * ------------------------------------------------------------- */ ++form { ++ margin-bottom: 18px; ++} ++ ++fieldset { ++ margin-bottom: 9px; ++ padding-top: 9px; ++} ++ ++fieldset legend { ++ display: block; ++ font-size: 19.5px; ++ line-height: 1; ++ color: #404040; ++ padding-top: 20px; ++ *padding: 0 0 5px 0px; ++ /* IE6-7 */ ++ ++ *line-height: 1.5; ++ /* IE6-7 */ ++ ++} ++form .cbi-tab-descr { ++ line-height: 18px; ++ margin-bottom: 18px; ++} ++ ++form .clearfix, ++form .cbi-value { ++ margin-bottom: 18px; ++ zoom: 1; ++ overflow: hidden; ++} ++ ++form .clearfix:before, form .clearfix:after, ++form .cbi-value:before, form .cbi-value:after { ++ display: table; ++ content: ""; ++ zoom: 1; ++} ++ ++form .clearfix:after ++form .cbi-value:after { ++ clear: both; ++} ++ ++label, ++input, ++select, ++textarea { ++ font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; ++ font-size: 13px; ++ font-weight: normal; ++ line-height: normal; ++} ++ ++form .input, ++form .cbi-value-field { ++ margin-left: 200px; ++} ++ ++form .cbi-value label.cbi-value-title { ++ padding-top: 6px; ++ font-size: 13px; ++ line-height: 18px; ++ float: left; ++ width: 180px; ++ text-align: right; ++ color: #404040; ++} ++ ++input[type=checkbox], input[type=radio] { ++ cursor: pointer; ++} ++ ++input, ++textarea, ++select, ++.uneditable-input { ++ display: inline-block; ++ width: 210px; ++ height: 30px; ++ padding: 4px; ++ font-size: 13px; ++ line-height: 18px; ++ color: #808080; ++ border: 1px solid #ccc; ++ -webkit-border-radius: 3px; ++ -moz-border-radius: 3px; ++ border-radius: 3px; ++} ++ ++select { ++ padding: initial; ++} ++ ++input[type=checkbox], input[type=radio] { ++ width: auto; ++ height: auto; ++ padding: 0; ++ margin: 3px 0; ++ *margin-top: 0; ++ /* IE6-7 */ ++ ++ line-height: normal; ++ border: none; ++} ++ ++input[type=file] { ++ background-color: #ffffff; ++ padding: initial; ++ border: initial; ++ line-height: initial; ++ -webkit-box-shadow: none; ++ -moz-box-shadow: none; ++ box-shadow: none; ++ width: auto !important; ++} ++ ++input[type=button], input[type=reset], input[type=submit] { ++ width: auto; ++ height: auto; ++} ++ ++select, input[type=file] { ++ *height: auto; ++ *margin-top: 4px; ++ /* For IE7, add top margin to align select with labels */ ++} ++ ++select[multiple] { ++ height: inherit; ++ background-color: #ffffff; ++} ++ ++textarea { ++ height: auto; ++} ++ ++.uneditable-input { ++ background-color: #ffffff; ++ display: block; ++ border-color: #eee; ++ -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.025); ++ -moz-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.025); ++ box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.025); ++ cursor: not-allowed; ++} ++ ++::-moz-placeholder { ++ color: #bfbfbf; ++} ++ ++::-webkit-input-placeholder { ++ color: #bfbfbf; ++} ++ ++input, textarea { ++ -webkit-transition: border linear 0.2s, box-shadow linear 0.2s; ++ -moz-transition: border linear 0.2s, box-shadow linear 0.2s; ++ -ms-transition: border linear 0.2s, box-shadow linear 0.2s; ++ -o-transition: border linear 0.2s, box-shadow linear 0.2s; ++ transition: border linear 0.2s, box-shadow linear 0.2s; ++ -webkit-box-shadow: inset 0 1px 3px rgba(0, 0, 0, 0.1); ++ -moz-box-shadow: inset 0 1px 3px rgba(0, 0, 0, 0.1); ++ box-shadow: inset 0 1px 3px rgba(0, 0, 0, 0.1); ++} ++ ++input:focus, textarea:focus { ++ outline: 0; ++ border-color: rgba(82, 168, 236, 0.8); ++ -webkit-box-shadow: inset 0 1px 3px rgba(0, 0, 0, 0.1), 0 0 8px rgba(82, 168, 236, 0.6); ++ -moz-box-shadow: inset 0 1px 3px rgba(0, 0, 0, 0.1), 0 0 8px rgba(82, 168, 236, 0.6); ++ box-shadow: inset 0 1px 3px rgba(0, 0, 0, 0.1), 0 0 8px rgba(82, 168, 236, 0.6); ++} ++ ++input[type=file]:focus, input[type=checkbox]:focus, select:focus { ++ -webkit-box-shadow: none; ++ -moz-box-shadow: none; ++ box-shadow: none; ++ outline: 1px dotted #666; ++} ++ ++form .clearfix.error > label, form .clearfix.error .help-block, form .clearfix.error .help-inline { ++ color: #b94a48; ++} ++ ++form .clearfix.error input, form .clearfix.error textarea { ++ color: #b94a48; ++ border-color: #ee5f5b; ++} ++ ++form .clearfix.error input:focus, form .clearfix.error textarea:focus { ++ border-color: #e9322d; ++ -webkit-box-shadow: 0 0 6px #f8b9b7; ++ -moz-box-shadow: 0 0 6px #f8b9b7; ++ box-shadow: 0 0 6px #f8b9b7; ++} ++ ++form .clearfix.error .input-prepend .add-on, form .clearfix.error .input-append .add-on { ++ color: #b94a48; ++ background-color: #fce6e6; ++ border-color: #b94a48; ++} ++ ++form .clearfix.warning > label, form .clearfix.warning .help-block, form .clearfix.warning .help-inline { ++ color: #c09853; ++} ++ ++form .clearfix.warning input, form .clearfix.warning textarea { ++ color: #c09853; ++ border-color: #ccae64; ++} ++ ++form .clearfix.warning input:focus, form .clearfix.warning textarea:focus { ++ border-color: #be9a3f; ++ -webkit-box-shadow: 0 0 6px #e5d6b1; ++ -moz-box-shadow: 0 0 6px #e5d6b1; ++ box-shadow: 0 0 6px #e5d6b1; ++} ++ ++form .clearfix.warning .input-prepend .add-on, form .clearfix.warning .input-append .add-on { ++ color: #c09853; ++ background-color: #d2b877; ++ border-color: #c09853; ++} ++ ++form .clearfix.success > label, form .clearfix.success .help-block, form .clearfix.success .help-inline { ++ color: #468847; ++} ++ ++form .clearfix.success input, form .clearfix.success textarea { ++ color: #468847; ++ border-color: #57a957; ++} ++ ++form .clearfix.success input:focus, form .clearfix.success textarea:focus { ++ border-color: #458845; ++ -webkit-box-shadow: 0 0 6px #9acc9a; ++ -moz-box-shadow: 0 0 6px #9acc9a; ++ box-shadow: 0 0 6px #9acc9a; ++} ++ ++form .clearfix.success .input-prepend .add-on, form .clearfix.success .input-append .add-on { ++ color: #468847; ++ background-color: #bcddbc; ++ border-color: #468847; ++} ++ ++input[disabled], ++select[disabled], ++textarea[disabled], ++input[readonly], ++select[readonly], ++textarea[readonly] { ++ background-color: #f5f5f5; ++ border-color: #ddd; ++} ++ ++.actions, ++.cbi-page-actions { ++ background: #f5f5f5; ++ margin-bottom: 18px; ++ padding: 17px 20px 18px 150px; ++ border-top: 1px solid #ddd; ++ -webkit-border-radius: 0 0 3px 3px; ++ -moz-border-radius: 0 0 3px 3px; ++ border-radius: 0 0 3px 3px; ++ text-align: right; ++} ++ ++.actions .secondary-action, ++.cbi-page-actions .secondary-action{ ++ float: right; ++} ++ ++.actions .secondary-action a, ++.cbi-page-actions .secondary-action a { ++ line-height: 30px; ++} ++ ++.actions .secondary-action a:hover, ++.cbi-page-actions .secondary-action a:hover { ++ text-decoration: underline; ++} ++ ++.help-inline, .help-block { ++ font-size: 13px; ++ line-height: 18px; ++ color: #bfbfbf; ++} ++ ++.help-inline { ++ padding-left: 5px; ++ *position: relative; ++ /* IE6-7 */ ++ ++ *top: -5px; ++ /* IE6-7 */ ++ ++} ++ ++.help-block { ++ display: block; ++ max-width: 600px; ++} ++ ++/* ++ * Tables.less ++ * Tables for, you guessed it, tabular data ++ * ---------------------------------------- */ ++table { ++ width: 100%; ++ margin-bottom: 18px; ++ padding: 0; ++ font-size: 13px; ++ border-collapse: collapse; ++} ++ ++table th, table td { ++ padding: 10px 10px 9px; ++ line-height: 18px; ++ text-align: left; ++} ++ ++table th { ++ padding-top: 9px; ++ font-weight: bold; ++ vertical-align: middle; ++} ++ ++table td { ++ vertical-align: top; ++ border-top: 1px solid #ddd; ++} ++ ++table tbody th { ++ border-top: 1px solid #ddd; ++ vertical-align: top; ++} ++ ++/* Patterns.less ++ * Repeatable UI elements outside the base styles provided from the scaffolding ++ * ---------------------------------------------------------------------------- */ ++header { ++ height: 40px; ++ position: fixed; ++ top: 0; ++ left: 0; ++ right: 0; ++ z-index: 10000; ++ overflow: visible; ++ color: #BFBFBF; ++} ++ ++header a { ++ color: #bfbfbf; ++ text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); ++} ++ ++header h3 a:hover, header .brand:hover, header ul .active > a { ++ background-color: #333; ++ background-color: rgba(255, 255, 255, 0.05); ++ color: #ffffff; ++ text-decoration: none; ++} ++ ++header h3 { ++ position: relative; ++} ++ ++header h3 a, header .brand { ++ float: left; ++ display: block; ++ padding: 8px 20px 12px; ++ margin-left: -20px; ++ color: #ffffff; ++ font-size: 20px; ++ font-weight: 200; ++ line-height: 1; ++} ++ ++header p { ++ margin: 0; ++ line-height: 40px; ++} ++ ++header .fill { ++ background-color: #222; ++ background-color: #222222; ++ background-repeat: repeat-x; ++ background-image: -khtml-gradient(linear, left top, left bottom, from(#333333), to(#222222)); ++ background-image: -moz-linear-gradient(top, #333333, #222222); ++ background-image: -ms-linear-gradient(top, #333333, #222222); ++ background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #333333), color-stop(100%, #222222)); ++ background-image: -webkit-linear-gradient(top, #333333, #222222); ++ background-image: -o-linear-gradient(top, #333333, #222222); ++ background-image: linear-gradient(top, #333333, #222222); ++ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#333333', endColorstr='#222222', GradientType=0); ++ -webkit-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.25), inset 0 -1px 0 rgba(0, 0, 0, 0.1); ++ -moz-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.25), inset 0 -1px 0 rgba(0, 0, 0, 0.1); ++ box-shadow: 0 1px 3px rgba(0, 0, 0, 0.25), inset 0 -1px 0 rgba(0, 0, 0, 0.1); ++ padding: 0 5px; ++} ++ ++header div > ul, .nav { ++ display: block; ++ float: left; ++ margin: 0 10px 0 0; ++ position: relative; ++ left: 0; ++} ++ ++header div > ul > li, .nav > li { ++ display: block; ++ float: left; ++} ++ ++header div > ul a, .nav a { ++ display: block; ++ float: none; ++ padding: 10px 10px 11px; ++ line-height: 19px; ++ text-decoration: none; ++} ++ ++header div > ul a:hover, .nav a:hover { ++ color: #ffffff; ++ text-decoration: none; ++} ++ ++header div > ul .active > a, .nav .active > a { ++ background-color: #222; ++ background-color: rgba(0, 0, 0, 0.5); ++} ++ ++header div > ul.secondary-nav, .nav.secondary-nav { ++ float: right; ++ margin-left: 10px; ++ margin-right: 0; ++} ++ ++header div > ul.secondary-nav .menu-dropdown, ++.nav.secondary-nav .menu-dropdown, ++header div > ul.secondary-nav .dropdown-menu, ++.nav.secondary-nav .dropdown-menu { ++ right: 0; ++ border: 0; ++} ++ ++header div > ul a.menu:hover, ++.nav a.menu:hover, ++header div > ul li.open .menu, ++.nav li.open .menu, ++header div > ul .dropdown-toggle:hover, ++.nav .dropdown-toggle:hover, ++header div > ul .dropdown.open .dropdown-toggle, ++.nav .dropdown.open .dropdown-toggle { ++ background: #444; ++ background: rgba(255, 255, 255, 0.05); ++} ++ ++header div > ul .menu-dropdown, ++.nav .menu-dropdown, ++header div > ul .dropdown-menu, ++.nav .dropdown-menu { ++ background-color: #333; ++} ++ ++header div > ul .menu-dropdown a.menu, ++.nav .menu-dropdown a.menu, ++header div > ul .dropdown-menu a.menu, ++.nav .dropdown-menu a.menu, ++header div > ul .menu-dropdown .dropdown-toggle, ++.nav .menu-dropdown .dropdown-toggle, ++header div > ul .dropdown-menu .dropdown-toggle, ++.nav .dropdown-menu .dropdown-toggle { ++ color: #ffffff; ++} ++ ++header div > ul .menu-dropdown a.menu.open, ++.nav .menu-dropdown a.menu.open, ++header div > ul .dropdown-menu a.menu.open, ++.nav .dropdown-menu a.menu.open, ++header div > ul .menu-dropdown .dropdown-toggle.open, ++.nav .menu-dropdown .dropdown-toggle.open, ++header div > ul .dropdown-menu .dropdown-toggle.open, ++.nav .dropdown-menu .dropdown-toggle.open { ++ background: #444; ++ background: rgba(255, 255, 255, 0.05); ++} ++ ++header div > ul .menu-dropdown li a, ++.nav .menu-dropdown li a, ++header div > ul .dropdown-menu li a, ++.nav .dropdown-menu li a { ++ color: #999; ++ text-shadow: 0 1px 0 rgba(0, 0, 0, 0.5); ++} ++ ++header div > ul .menu-dropdown li a:hover, ++.nav .menu-dropdown li a:hover, ++header div > ul .dropdown-menu li a:hover, ++.nav .dropdown-menu li a:hover { ++ background-color: #191919; ++ background-repeat: repeat-x; ++ background-image: -khtml-gradient(linear, left top, left bottom, from(#292929), to(#191919)); ++ background-image: -moz-linear-gradient(top, #292929, #191919); ++ background-image: -ms-linear-gradient(top, #292929, #191919); ++ background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #292929), color-stop(100%, #191919)); ++ background-image: -webkit-linear-gradient(top, #292929, #191919); ++ background-image: -o-linear-gradient(top, #292929, #191919); ++ background-image: linear-gradient(top, #292929, #191919); ++ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#292929', endColorstr='#191919', GradientType=0); ++ color: #ffffff; ++} ++ ++header div > ul .menu-dropdown .active a, ++.nav .menu-dropdown .active a, ++header div > ul .dropdown-menu .active a, ++.nav .dropdown-menu .active a { ++ color: #ffffff; ++} ++ ++header div > ul .menu-dropdown .divider, ++.nav .menu-dropdown .divider, ++header div > ul .dropdown-menu .divider, ++.nav .dropdown-menu .divider { ++ background-color: #222; ++ border-color: #444; ++} ++ ++header ul .menu-dropdown li a, header ul .dropdown-menu li a { ++ padding: 4px 15px; ++} ++ ++li.menu, .dropdown { ++ position: relative; ++} ++ ++a.menu:after, .dropdown-toggle:after { ++ width: 0; ++ height: 0; ++ display: inline-block; ++ content: "↓"; ++ text-indent: -99999px; ++ vertical-align: top; ++ margin-top: 8px; ++ margin-left: 4px; ++ border-left: 4px solid transparent; ++ border-right: 4px solid transparent; ++ border-top: 4px solid #ffffff; ++ filter: alpha(opacity=50); ++ -khtml-opacity: 0.5; ++ -moz-opacity: 0.5; ++ opacity: 0.5; ++} ++ ++.menu-dropdown, .dropdown-menu { ++ background-color: #ffffff; ++ float: left; ++ position: absolute; ++ top: 40px; ++ left: -9999px; ++ z-index: 900; ++ min-width: 160px; ++ max-width: 220px; ++ _width: 160px; ++ margin-left: 0; ++ margin-right: 0; ++ padding: 6px 0; ++ zoom: 1; ++ border-color: #999; ++ border-color: rgba(0, 0, 0, 0.2); ++ border-style: solid; ++ border-width: 0 1px 1px; ++ -webkit-border-radius: 0 0 6px 6px; ++ -moz-border-radius: 0 0 6px 6px; ++ border-radius: 0 0 6px 6px; ++ -webkit-box-shadow: 0 2px 4px rgba(0, 0, 0, 0.2); ++ -moz-box-shadow: 0 2px 4px rgba(0, 0, 0, 0.2); ++ box-shadow: 0 2px 4px rgba(0, 0, 0, 0.2); ++ -webkit-background-clip: padding-box; ++ -moz-background-clip: padding-box; ++ background-clip: padding-box; ++} ++ ++.menu-dropdown li, .dropdown-menu li { ++ float: none; ++ display: block; ++ background-color: none; ++} ++ ++.menu-dropdown .divider, .dropdown-menu .divider { ++ height: 1px; ++ margin: 5px 0; ++ overflow: hidden; ++ background-color: #eee; ++ border-bottom: 1px solid #ffffff; ++} ++ ++header .dropdown-menu a, .dropdown-menu a { ++ display: block; ++ padding: 4px 15px; ++ clear: both; ++ font-weight: normal; ++ line-height: 18px; ++ color: #808080; ++ text-shadow: 0 1px 0 #ffffff; ++} ++ ++header .dropdown-menu a:hover, ++.dropdown-menu a:hover, ++header .dropdown-menu a.hover, ++.dropdown-menu a.hover { ++ background-color: #dddddd; ++ background-repeat: repeat-x; ++ background-image: -khtml-gradient(linear, left top, left bottom, from(#eeeeee), to(#dddddd)); ++ background-image: -moz-linear-gradient(top, #eeeeee, #dddddd); ++ background-image: -ms-linear-gradient(top, #eeeeee, #dddddd); ++ background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #eeeeee), color-stop(100%, #dddddd)); ++ background-image: -webkit-linear-gradient(top, #eeeeee, #dddddd); ++ background-image: -o-linear-gradient(top, #eeeeee, #dddddd); ++ background-image: linear-gradient(top, #eeeeee, #dddddd); ++ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#eeeeee', endColorstr='#dddddd', GradientType=0); ++ color: #404040; ++ text-decoration: none; ++ -webkit-box-shadow: inset 0 1px 0 rgba(0, 0, 0, 0.025), inset 0 -1px rgba(0, 0, 0, 0.025); ++ -moz-box-shadow: inset 0 1px 0 rgba(0, 0, 0, 0.025), inset 0 -1px rgba(0, 0, 0, 0.025); ++ box-shadow: inset 0 1px 0 rgba(0, 0, 0, 0.025), inset 0 -1px rgba(0, 0, 0, 0.025); ++} ++ ++.open .menu, ++.dropdown.open .menu, ++.open .dropdown-toggle, ++.dropdown.open .dropdown-toggle { ++ color: #ffffff; ++ background: #ccc; ++ background: rgba(0, 0, 0, 0.3); ++} ++ ++.open .menu-dropdown, ++.dropdown.open .menu-dropdown, ++.open .dropdown-menu, ++.dropdown.open .dropdown-menu { ++ left: 0; ++} ++ ++.dropdown:hover ul.dropdown-menu { ++ left: 0; ++} ++ ++.dropdown-menu .dropdown-menu { ++ position: absolute; ++ left: 159px; ++} ++ ++.dropdown-menu li { ++ position: relative; ++} ++ ++.tabs, .cbi-tabmenu { ++ margin: 0 0 18px; ++ padding: 0; ++ list-style: none; ++ zoom: 1; ++} ++ ++.tabs:before, ++.cbi-tabmenu:before, ++.tabs:after, ++.cbi-tabmenu:after { ++ display: table; ++ content: ""; ++ zoom: 1; ++} ++ ++.tabs:after, .cbi-tabmenu:after { ++ clear: both; ++} ++ ++.tabs > li, .cbi-tabmenu > li { ++ float: left; ++} ++ ++.tabs > li > a, .cbi-tabmenu > li > a { ++ display: block; ++} ++ ++.tabs, ++.cbi-tabmenu { ++ border-color: #ddd; ++ border-style: solid; ++ border-width: 0 0 1px; ++} ++ ++.tabs > li, ++.cbi-tabmenu > li { ++ position: relative; ++ margin-bottom: -1px; ++} ++ ++.tabs > li > a, ++.cbi-tabmenu > li > a { ++ padding: 0 15px; ++ margin-right: 2px; ++ line-height: 34px; ++ border: 1px solid transparent; ++ -webkit-border-radius: 4px 4px 0 0; ++ -moz-border-radius: 4px 4px 0 0; ++ border-radius: 4px 4px 0 0; ++} ++ ++.tabs > li > a:hover, ++.cbi-tabmenu > li > a:hover { ++ text-decoration: none; ++ background-color: #eee; ++ border-color: #eee #eee #ddd; ++} ++ ++.tabs .active > a, .tabs .active > a:hover, ++.cbi-tabmenu .active > a, .cbi-tabmenu .active > a:hover, ++.cbi-tab > a:link, .cbi-tab > a:hover { ++ color: #808080; ++ background-color: #ffffff; ++ border: 1px solid #ddd; ++ border-bottom-color: transparent; ++ cursor: default; ++} ++ ++.tabs .menu-dropdown, .tabs .dropdown-menu, ++.cbi-tabmenu .menu-dropdown, .cbi-tabmenu .dropdown-menu { ++ top: 35px; ++ border-width: 1px; ++ -webkit-border-radius: 0 6px 6px 6px; ++ -moz-border-radius: 0 6px 6px 6px; ++ border-radius: 0 6px 6px 6px; ++} ++ ++.tabs a.menu:after, .tabs .dropdown-toggle:after, ++.cbi-tabmenu a.menu:after, .cbi-tabmenu .dropdown-toggle:after { ++ border-top-color: #999; ++ margin-top: 15px; ++ margin-left: 5px; ++} ++ ++.tabs li.open.menu .menu, .tabs .open.dropdown .dropdown-toggle, ++.cbi-tabmenu li.open.menu .menu, .cbi-tabmenu .open.dropdown .dropdown-toggle { ++ border-color: #999; ++} ++ ++.tabs li.open a.menu:after, .tabs .dropdown.open .dropdown-toggle:after, ++.cbi-tabmenu li.open a.menu:after, .cbi-tabmenu .dropdown.open .dropdown-toggle:after { ++ border-top-color: #555; ++} ++ ++.tab-content > .tab-pane, ++.tab-content > div { ++ display: none; ++} ++ ++.tab-content > .active { ++ display: block; ++} ++ ++.breadcrumb { ++ padding: 7px 14px; ++ margin: 0 0 18px; ++ background-color: #f5f5f5; ++ background-repeat: repeat-x; ++ background-image: -khtml-gradient(linear, left top, left bottom, from(#ffffff), to(#f5f5f5)); ++ background-image: -moz-linear-gradient(top, #ffffff, #f5f5f5); ++ background-image: -ms-linear-gradient(top, #ffffff, #f5f5f5); ++ background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #ffffff), color-stop(100%, #f5f5f5)); ++ background-image: -webkit-linear-gradient(top, #ffffff, #f5f5f5); ++ background-image: -o-linear-gradient(top, #ffffff, #f5f5f5); ++ background-image: linear-gradient(top, #ffffff, #f5f5f5); ++ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffff', endColorstr='#f5f5f5', GradientType=0); ++ border: 1px solid #ddd; ++ -webkit-border-radius: 3px; ++ -moz-border-radius: 3px; ++ border-radius: 3px; ++ -webkit-box-shadow: inset 0 1px 0 #ffffff; ++ -moz-box-shadow: inset 0 1px 0 #ffffff; ++ box-shadow: inset 0 1px 0 #ffffff; ++} ++ ++.breadcrumb li { ++ display: inline; ++ text-shadow: 0 1px 0 #ffffff; ++} ++ ++.breadcrumb .divider { ++ padding: 0 5px; ++ color: #bfbfbf; ++} ++ ++.breadcrumb .active a { ++ color: #404040; ++} ++ ++footer { ++ margin-top: 17px; ++ padding-top: 17px; ++ border-top: 1px solid #eee; ++} ++ ++.btn.danger, ++.alert-message.danger, ++.btn.danger:hover, ++.alert-message.danger:hover, ++.btn.error, ++.alert-message.error, ++.btn.error:hover, ++.alert-message.error:hover, ++.btn.success, ++.alert-message.success, ++.btn.success:hover, ++.alert-message.success:hover, ++.btn.info, ++.alert-message.info, ++.btn.info:hover, ++.alert-message.info:hover { ++ color: #ffffff; ++} ++ ++.btn .close, .alert-message .close { ++ font-family: Arial, sans-serif; ++ line-height: 18px; ++} ++ ++.btn.danger, ++.alert-message.danger, ++.btn.error, ++.alert-message.error { ++ background-color: #c43c35; ++ background-repeat: repeat-x; ++ background-image: -khtml-gradient(linear, left top, left bottom, from(#ee5f5b), to(#c43c35)); ++ background-image: -moz-linear-gradient(top, #ee5f5b, #c43c35); ++ background-image: -ms-linear-gradient(top, #ee5f5b, #c43c35); ++ background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #ee5f5b), color-stop(100%, #c43c35)); ++ background-image: -webkit-linear-gradient(top, #ee5f5b, #c43c35); ++ background-image: -o-linear-gradient(top, #ee5f5b, #c43c35); ++ background-image: linear-gradient(top, #ee5f5b, #c43c35); ++ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ee5f5b', endColorstr='#c43c35', GradientType=0); ++ text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); ++ border-color: #c43c35 #c43c35 #882a25; ++ border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); ++} ++ ++.btn.success, .alert-message.success { ++ background-color: #57a957; ++ background-repeat: repeat-x; ++ background-image: -khtml-gradient(linear, left top, left bottom, from(#62c462), to(#57a957)); ++ background-image: -moz-linear-gradient(top, #62c462, #57a957); ++ background-image: -ms-linear-gradient(top, #62c462, #57a957); ++ background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #62c462), color-stop(100%, #57a957)); ++ background-image: -webkit-linear-gradient(top, #62c462, #57a957); ++ background-image: -o-linear-gradient(top, #62c462, #57a957); ++ background-image: linear-gradient(top, #62c462, #57a957); ++ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#62c462', endColorstr='#57a957', GradientType=0); ++ text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); ++ border-color: #57a957 #57a957 #3d773d; ++ border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); ++} ++ ++.btn.info, .alert-message.info { ++ background-color: #339bb9; ++ background-repeat: repeat-x; ++ background-image: -khtml-gradient(linear, left top, left bottom, from(#5bc0de), to(#339bb9)); ++ background-image: -moz-linear-gradient(top, #5bc0de, #339bb9); ++ background-image: -ms-linear-gradient(top, #5bc0de, #339bb9); ++ background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #5bc0de), color-stop(100%, #339bb9)); ++ background-image: -webkit-linear-gradient(top, #5bc0de, #339bb9); ++ background-image: -o-linear-gradient(top, #5bc0de, #339bb9); ++ background-image: linear-gradient(top, #5bc0de, #339bb9); ++ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#5bc0de', endColorstr='#339bb9', GradientType=0); ++ text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); ++ border-color: #339bb9 #339bb9 #22697d; ++ border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); ++} ++ ++.btn, ++.cbi-button { ++ cursor: pointer; ++ display: inline-block; ++ background-color: #e6e6e6; ++ background-repeat: no-repeat; ++ background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ffffff), color-stop(25%, #ffffff), to(#e6e6e6)); ++ background-image: -webkit-linear-gradient(#ffffff, #ffffff 25%, #e6e6e6); ++ background-image: -moz-linear-gradient(top, #ffffff, #ffffff 25%, #e6e6e6); ++ background-image: -ms-linear-gradient(#ffffff, #ffffff 25%, #e6e6e6); ++ background-image: -o-linear-gradient(#ffffff, #ffffff 25%, #e6e6e6); ++ background-image: linear-gradient(#ffffff, #ffffff 25%, #e6e6e6); ++ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffff', endColorstr='#e6e6e6', GradientType=0); ++ padding: 5px 14px 6px; ++ text-shadow: 0 1px 1px rgba(255, 255, 255, 0.75); ++ color: #333; ++ font-size: 13px; ++ line-height: normal; ++ border: 1px solid #ccc; ++ border-bottom-color: #bbb; ++ -webkit-border-radius: 4px; ++ -moz-border-radius: 4px; ++ border-radius: 4px; ++ -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05); ++ -moz-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05); ++ box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05); ++} ++ ++.btn:hover, ++.cbi-button:hover { ++ color: #333; ++ text-decoration: none; ++} ++ ++.btn:focus, ++.cbi-button:focus { ++ outline: 1px dotted #666; ++} ++ ++.btn.primary, ++.cbi-page-actions .cbi-button-apply, ++.cbi-page-actions .cbi-button-save, ++.cbi-page-actions .cbi-button-reset { ++ color: #ffffff; ++ padding: 5px 14px 6px; ++ background-color: #0064cd; ++ background-repeat: repeat-x; ++ background-image: -khtml-gradient(linear, left top, left bottom, from(#049cdb), to(#0064cd)); ++ background-image: -moz-linear-gradient(top, #049cdb, #0064cd); ++ background-image: -ms-linear-gradient(top, #049cdb, #0064cd); ++ background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #049cdb), color-stop(100%, #0064cd)); ++ background-image: -webkit-linear-gradient(top, #049cdb, #0064cd); ++ background-image: -o-linear-gradient(top, #049cdb, #0064cd); ++ background-image: linear-gradient(top, #049cdb, #0064cd); ++ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#049cdb', endColorstr='#0064cd', GradientType=0); ++ text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); ++ border-color: #0064cd #0064cd #003f81; ++ border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); ++} ++ ++.cbi-input-invalid, ++.cbi-value-error input { ++ color: #FF0000; ++ border-color: #FF0000; ++} ++ ++.cbi-button-up, ++.cbi-input-up { ++ background-position: center center; ++ background-image: url('../resources/cbi/up.gif'), -webkit-gradient(linear, 0 0, 0 100%, from(#ffffff), color-stop(25%, #ffffff), to(#e6e6e6)); ++ background-image: url('../resources/cbi/up.gif'), -webkit-linear-gradient(#ffffff, #ffffff 25%, #e6e6e6); ++ background-image: url('../resources/cbi/up.gif'), -moz-linear-gradient(top, #ffffff, #ffffff 25%, #e6e6e6); ++ background-image: url('../resources/cbi/up.gif'), -ms-linear-gradient(#ffffff, #ffffff 25%, #e6e6e6); ++ background-image: url('../resources/cbi/up.gif'), -o-linear-gradient(#ffffff, #ffffff 25%, #e6e6e6); ++ background-image: url('../resources/cbi/up.gif'), linear-gradient(#ffffff, #ffffff 25%, #e6e6e6); ++} ++ ++.cbi-button-down, ++.cbi-input-down { ++ background-position: center center; ++ background-image: url('../resources/cbi/down.gif'), -webkit-gradient(linear, 0 0, 0 100%, from(#ffffff), color-stop(25%, #ffffff), to(#e6e6e6)); ++ background-image: url('../resources/cbi/down.gif'), -webkit-linear-gradient(#ffffff, #ffffff 25%, #e6e6e6); ++ background-image: url('../resources/cbi/down.gif'), -moz-linear-gradient(top, #ffffff, #ffffff 25%, #e6e6e6); ++ background-image: url('../resources/cbi/down.gif'), -ms-linear-gradient(#ffffff, #ffffff 25%, #e6e6e6); ++ background-image: url('../resources/cbi/down.gif'), -o-linear-gradient(#ffffff, #ffffff 25%, #e6e6e6); ++ background-image: url('../resources/cbi/down.gif'), linear-gradient(#ffffff, #ffffff 25%, #e6e6e6); ++} ++ ++.cbi-button-find, ++.cbi-input-find { ++ background-position: 6px center, left top; ++ padding-left: 28px; ++ background-image: url('../resources/cbi/find.gif'), -webkit-gradient(linear, 0 0, 0 100%, from(#ffffff), color-stop(25%, #ffffff), to(#e6e6e6)); ++ background-image: url('../resources/cbi/find.gif'), -webkit-linear-gradient(#ffffff, #ffffff 25%, #e6e6e6); ++ background-image: url('../resources/cbi/find.gif'), -moz-linear-gradient(top, #ffffff, #ffffff 25%, #e6e6e6); ++ background-image: url('../resources/cbi/find.gif'), -ms-linear-gradient(#ffffff, #ffffff 25%, #e6e6e6); ++ background-image: url('../resources/cbi/find.gif'), -o-linear-gradient(#ffffff, #ffffff 25%, #e6e6e6); ++ background-image: url('../resources/cbi/find.gif'), linear-gradient(#ffffff, #ffffff 25%, #e6e6e6); ++} ++ ++.cbi-button-add, ++.cbi-input-add { ++ background-position: 6px center, left top; ++ padding-left: 28px; ++ background-image: url('../resources/cbi/add.gif'), -webkit-gradient(linear, 0 0, 0 100%, from(#ffffff), color-stop(25%, #ffffff), to(#e6e6e6)); ++ background-image: url('../resources/cbi/add.gif'), -webkit-linear-gradient(#ffffff, #ffffff 25%, #e6e6e6); ++ background-image: url('../resources/cbi/add.gif'), -moz-linear-gradient(top, #ffffff, #ffffff 25%, #e6e6e6); ++ background-image: url('../resources/cbi/add.gif'), -ms-linear-gradient(#ffffff, #ffffff 25%, #e6e6e6); ++ background-image: url('../resources/cbi/add.gif'), -o-linear-gradient(#ffffff, #ffffff 25%, #e6e6e6); ++ background-image: url('../resources/cbi/add.gif'), linear-gradient(#ffffff, #ffffff 25%, #e6e6e6); ++} ++ ++.cbi-button-apply, ++.cbi-input-apply { ++ background-position: 6px center, left top; ++ padding-left: 28px; ++ background-image: url('../resources/cbi/apply.gif'), -webkit-gradient(linear, 0 0, 0 100%, from(#ffffff), color-stop(25%, #ffffff), to(#e6e6e6)); ++ background-image: url('../resources/cbi/apply.gif'), -webkit-linear-gradient(#ffffff, #ffffff 25%, #e6e6e6); ++ background-image: url('../resources/cbi/apply.gif'), -moz-linear-gradient(top, #ffffff, #ffffff 25%, #e6e6e6); ++ background-image: url('../resources/cbi/apply.gif'), -ms-linear-gradient(#ffffff, #ffffff 25%, #e6e6e6); ++ background-image: url('../resources/cbi/apply.gif'), -o-linear-gradient(#ffffff, #ffffff 25%, #e6e6e6); ++ background-image: url('../resources/cbi/apply.gif'), linear-gradient(#ffffff, #ffffff 25%, #e6e6e6); ++} ++ ++.cbi-button-reset, ++.cbi-input-reset { ++ background-position: 6px center, left top; ++ padding-left: 28px; ++ background-image: url('../resources/cbi/reset.gif'), -webkit-gradient(linear, 0 0, 0 100%, from(#ffffff), color-stop(25%, #ffffff), to(#e6e6e6)); ++ background-image: url('../resources/cbi/reset.gif'), -webkit-linear-gradient(#ffffff, #ffffff 25%, #e6e6e6); ++ background-image: url('../resources/cbi/reset.gif'), -moz-linear-gradient(top, #ffffff, #ffffff 25%, #e6e6e6); ++ background-image: url('../resources/cbi/reset.gif'), -ms-linear-gradient(#ffffff, #ffffff 25%, #e6e6e6); ++ background-image: url('../resources/cbi/reset.gif'), -o-linear-gradient(#ffffff, #ffffff 25%, #e6e6e6); ++ background-image: url('../resources/cbi/reset.gif'), linear-gradient(#ffffff, #ffffff 25%, #e6e6e6); ++} ++ ++.cbi-button-edit, ++.cbi-input-edit { ++ background-position: 6px center, left top; ++ padding-left: 28px; ++ background-image: url('../resources/cbi/edit.gif'), -webkit-gradient(linear, 0 0, 0 100%, from(#ffffff), color-stop(25%, #ffffff), to(#e6e6e6)); ++ background-image: url('../resources/cbi/edit.gif'), -webkit-linear-gradient(#ffffff, #ffffff 25%, #e6e6e6); ++ background-image: url('../resources/cbi/edit.gif'), -moz-linear-gradient(top, #ffffff, #ffffff 25%, #e6e6e6); ++ background-image: url('../resources/cbi/edit.gif'), -ms-linear-gradient(#ffffff, #ffffff 25%, #e6e6e6); ++ background-image: url('../resources/cbi/edit.gif'), -o-linear-gradient(#ffffff, #ffffff 25%, #e6e6e6); ++ background-image: url('../resources/cbi/edit.gif'), linear-gradient(#ffffff, #ffffff 25%, #e6e6e6); ++} ++ ++.cbi-button-remove, ++.cbi-input-remove { ++ background-position: 6px center, left top; ++ padding-left: 28px; ++ background-image: url('../resources/cbi/remove.gif'), -webkit-gradient(linear, 0 0, 0 100%, from(#ffffff), color-stop(25%, #ffffff), to(#e6e6e6)); ++ background-image: url('../resources/cbi/remove.gif'), -webkit-linear-gradient(#ffffff, #ffffff 25%, #e6e6e6); ++ background-image: url('../resources/cbi/remove.gif'), -moz-linear-gradient(top, #ffffff, #ffffff 25%, #e6e6e6); ++ background-image: url('../resources/cbi/remove.gif'), -ms-linear-gradient(#ffffff, #ffffff 25%, #e6e6e6); ++ background-image: url('../resources/cbi/remove.gif'), -o-linear-gradient(#ffffff, #ffffff 25%, #e6e6e6); ++ background-image: url('../resources/cbi/remove.gif'), linear-gradient(#ffffff, #ffffff 25%, #e6e6e6); ++} ++ ++.cbi-button-reload, ++.cbi-input-reload { ++ background-position: 6px center, left top; ++ padding-left: 28px; ++ background-image: url('../resources/cbi/reload.gif'), -webkit-gradient(linear, 0 0, 0 100%, from(#ffffff), color-stop(25%, #ffffff), to(#e6e6e6)); ++ background-image: url('../resources/cbi/reload.gif'), -webkit-linear-gradient(#ffffff, #ffffff 25%, #e6e6e6); ++ background-image: url('../resources/cbi/reload.gif'), -moz-linear-gradient(top, #ffffff, #ffffff 25%, #e6e6e6); ++ background-image: url('../resources/cbi/reload.gif'), -ms-linear-gradient(#ffffff, #ffffff 25%, #e6e6e6); ++ background-image: url('../resources/cbi/reload.gif'), -o-linear-gradient(#ffffff, #ffffff 25%, #e6e6e6); ++ background-image: url('../resources/cbi/reload.gif'), linear-gradient(#ffffff, #ffffff 25%, #e6e6e6); ++} ++ ++.cbi-button-link, ++.cbi-input-link { ++ background-position: 6px center, left top; ++ padding-left: 28px; ++ background-image: url('../resources/cbi/link.gif'), -webkit-gradient(linear, 0 0, 0 100%, from(#ffffff), color-stop(25%, #ffffff), to(#e6e6e6)); ++ background-image: url('../resources/cbi/link.gif'), -webkit-linear-gradient(#ffffff, #ffffff 25%, #e6e6e6); ++ background-image: url('../resources/cbi/link.gif'), -moz-linear-gradient(top, #ffffff, #ffffff 25%, #e6e6e6); ++ background-image: url('../resources/cbi/link.gif'), -ms-linear-gradient(#ffffff, #ffffff 25%, #e6e6e6); ++ background-image: url('../resources/cbi/link.gif'), -o-linear-gradient(#ffffff, #ffffff 25%, #e6e6e6); ++ background-image: url('../resources/cbi/link.gif'), linear-gradient(#ffffff, #ffffff 25%, #e6e6e6); ++} ++ ++.cbi-button-download, ++.cbi-input-download { ++ background-position: 6px center, left top; ++ padding-left: 28px; ++ background-image: url('../resources/cbi/download.gif'), -webkit-gradient(linear, 0 0, 0 100%, from(#ffffff), color-stop(25%, #ffffff), to(#e6e6e6)); ++ background-image: url('../resources/cbi/download.gif'), -webkit-linear-gradient(#ffffff, #ffffff 25%, #e6e6e6); ++ background-image: url('../resources/cbi/download.gif'), -moz-linear-gradient(top, #ffffff, #ffffff 25%, #e6e6e6); ++ background-image: url('../resources/cbi/download.gif'), -ms-linear-gradient(#ffffff, #ffffff 25%, #e6e6e6); ++ background-image: url('../resources/cbi/download.gif'), -o-linear-gradient(#ffffff, #ffffff 25%, #e6e6e6); ++ background-image: url('../resources/cbi/download.gif'), linear-gradient(#ffffff, #ffffff 25%, #e6e6e6); ++} ++ ++.btn.active, .btn:active { ++ -webkit-box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.25), 0 1px 2px rgba(0, 0, 0, 0.05); ++ -moz-box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.25), 0 1px 2px rgba(0, 0, 0, 0.05); ++ box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.25), 0 1px 2px rgba(0, 0, 0, 0.05); ++} ++ ++.btn.disabled { ++ cursor: default; ++ background-image: none; ++ filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); ++ filter: alpha(opacity=65); ++ -khtml-opacity: 0.65; ++ -moz-opacity: 0.65; ++ opacity: 0.65; ++ -webkit-box-shadow: none; ++ -moz-box-shadow: none; ++ box-shadow: none; ++} ++ ++.btn[disabled] { ++ cursor: default; ++ background-image: none; ++ filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); ++ filter: alpha(opacity=65); ++ -khtml-opacity: 0.65; ++ -moz-opacity: 0.65; ++ opacity: 0.65; ++ -webkit-box-shadow: none; ++ -moz-box-shadow: none; ++ box-shadow: none; ++} ++ ++.btn.large { ++ font-size: 15px; ++ line-height: normal; ++ padding: 9px 14px 9px; ++ -webkit-border-radius: 6px; ++ -moz-border-radius: 6px; ++ border-radius: 6px; ++} ++ ++.btn.small { ++ padding: 7px 9px 7px; ++ font-size: 11px; ++} ++ ++/* Button icons for specific pages */ ++.Startup .cbi-section-table input.cbi-input-apply, ++.Startup .cbi-section-table input.cbi-button-apply { ++ background-image: url("../resources/cbi/apply.gif"); ++ background-position: 7px 4px; ++ padding: 3px 9px 3px 27px; ++} ++ ++.Processes .cbi-section-table input.cbi-input-reload, ++.Startup .cbi-section-table input.cbi-input-reload { ++ background-image: url("../resources/cbi/reload.gif"); ++ background-position: 7px 4px; ++ padding: 3px 9px 3px 27px; ++} ++ ++.Processes .cbi-section-table input.cbi-input-remove, ++.Processes .cbi-section-table div.cbi-section-remove input, ++.Startup .cbi-section-table input.cbi-input-remove, ++.Startup .cbi-section-table div.cbi-section-remove input { ++ background-image: url("../resources/cbi/remove.gif"); ++ background-position: 7px 4px; ++ padding: 3px 9px 3px 27px; ++} ++ ++.Processes .cbi-section-table input.cbi-input-reset, ++.Processes .cbi-section-table input.cbi-button-reset, ++.Startup .cbi-section-table input.cbi-input-reset, ++.Startup .cbi-section-table input.cbi-button-reset { ++ background-image: url("../resources/cbi/reset.gif"); ++ background-position: 7px 4px; ++ padding: 3px 9px 3px 27px; ++} ++ ++.Startup .cbi-section-table input.cbi-input-save, ++.Startup .cbi-section-table input.cbi-button-save { ++ background-image: url("../resources/cbi/save.gif"); ++ background-position: 7px 4px; ++ padding: 3px 9px 3px 27px; ++} ++ ++:root .alert-message, :root .btn { ++ border-radius: 0 0; ++} ++ ++button.btn::-moz-focus-inner, input[type=submit].btn::-moz-focus-inner { ++ padding: 0; ++ border: 0; ++} ++ ++.close { ++ float: right; ++ color: #000000; ++ font-size: 20px; ++ font-weight: bold; ++ line-height: 13.5px; ++ text-shadow: 0 1px 0 #ffffff; ++ filter: alpha(opacity=25); ++ -khtml-opacity: 0.25; ++ -moz-opacity: 0.25; ++ opacity: 0.25; ++} ++ ++.close:hover { ++ color: #000000; ++ text-decoration: none; ++ filter: alpha(opacity=40); ++ -khtml-opacity: 0.4; ++ -moz-opacity: 0.4; ++ opacity: 0.4; ++} ++ ++.alert-message { ++ position: relative; ++ padding: 7px 15px; ++ margin-bottom: 18px; ++ color: #404040; ++ background-color: #eedc94; ++ background-repeat: repeat-x; ++ background-image: -khtml-gradient(linear, left top, left bottom, from(#fceec1), to(#eedc94)); ++ background-image: -moz-linear-gradient(top, #fceec1, #eedc94); ++ background-image: -ms-linear-gradient(top, #fceec1, #eedc94); ++ background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #fceec1), color-stop(100%, #eedc94)); ++ background-image: -webkit-linear-gradient(top, #fceec1, #eedc94); ++ background-image: -o-linear-gradient(top, #fceec1, #eedc94); ++ background-image: linear-gradient(top, #fceec1, #eedc94); ++ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fceec1', endColorstr='#eedc94', GradientType=0); ++ text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); ++ border-color: #eedc94 #eedc94 #e4c652; ++ border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); ++ text-shadow: 0 1px 0 rgba(255, 255, 255, 0.5); ++ border-width: 1px; ++ border-style: solid; ++ -webkit-border-radius: 4px; ++ -moz-border-radius: 4px; ++ border-radius: 4px; ++ -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.25); ++ -moz-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.25); ++ box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.25); ++} ++ ++.alert-message .close { ++ margin-top: 1px; ++ *margin-top: 0; ++} ++ ++.alert-message a { ++ font-weight: bold; ++ color: #404040; ++} ++ ++.alert-message.danger p a, ++.alert-message.error p a, ++.alert-message.success p a, ++.alert-message.info p a { ++ color: #ffffff; ++} ++ ++.alert-message h5 { ++ line-height: 18px; ++} ++ ++.alert-message p { ++ margin-bottom: 0; ++} ++ ++.alert-message div { ++ margin-top: 5px; ++ margin-bottom: 2px; ++ line-height: 28px; ++} ++ ++.alert-message .btn { ++ -webkit-box-shadow: 0 1px 0 rgba(255, 255, 255, 0.25); ++ -moz-box-shadow: 0 1px 0 rgba(255, 255, 255, 0.25); ++ box-shadow: 0 1px 0 rgba(255, 255, 255, 0.25); ++} ++ ++.label { ++ padding: 1px 3px 2px; ++ font-size: 9.75px; ++ font-weight: bold; ++ color: #ffffff !important; ++ text-transform: uppercase; ++ white-space: nowrap; ++ background-color: #bfbfbf; ++ -webkit-border-radius: 3px; ++ -moz-border-radius: 3px; ++ border-radius: 3px; ++ text-shadow: none; ++} ++ ++a.label:link, ++a.label:visited { ++ color: #ffffff; ++} ++ ++a.label:hover { ++ text-decoration: none; ++} ++ ++.label.important { ++ background-color: #c43c35; ++} ++ ++.label.warning { ++ background-color: #f89406; ++} ++ ++.label.success { ++ background-color: #46a546; ++} ++ ++.label.notice { ++ background-color: #62cffc; ++} ++ ++/* LuCI specific items */ ++.hidden { display: none } ++ ++#memtotal > div, ++#memfree > div, ++#memcache > div, ++#membuff > div, ++#conns > div { ++ border: 1px solid #CCCCCC; ++ border-radius: 3px 3px 3px 3px; ++ color: #808080; ++ display: inline-block; ++ font-size: 13px; ++ height: 22 dpx; ++ line-height: 18px; ++} ++ ++#xhr_poll_status { ++ cursor: pointer; ++} ++ ++form.inline { display: inline } ++ ++header .pull-right { padding-top: 8px; } ++ ++#modemenu li:last-child span.divider { display: none } ++ ++#syslog { width: 100%; } ++ ++.cbi-section-table tbody tr:nth-child(odd) td, .cbi-section-table tbody tr:nth-child(odd) th { ++ background-color: #f9f9f9; ++} ++ ++.cbi-section-table tbody tr:hover td, .cbi-section-table tbody tr:hover th { ++ background-color: #f5f5f5; ++} ++ ++.cbi-section-table tr.cbi-section-table-descr th { ++ font-weight: normal; ++} ++ ++.left { text-align: left !important; } ++ ++.right { text-align: right !important; } ++ ++.cbi-value-field { line-height: 1.5em; } ++ ++.cbi-value-field input[type=checkbox], ++.cbi-value-field input[type=radio] { ++ margin-top: 8px; ++ margin-right: 6px; ++} ++ ++table table td, ++.cbi-value-field table td { ++ border: none; ++} ++ ++table.cbi-section-table input, ++table.cbi-section-table textarea, ++table.cbi-section-table select { ++ width: auto; ++} ++ ++table.cbi-section-table td.cbi-section-table-cell { ++ white-space: nowrap; ++ text-align: right; ++} ++ ++table.cbi-section-table td.cbi-section-table-cell select { ++ width: inherit; ++} ++ ++.cbi-value-description { display: inline; } ++ ++.cbi-value-description img { vertical-align: middle; } ++ ++.cbi-section-error { ++ border: 1px solid #FF0000; ++ border-radius: 3px; ++ background-color: #FCE6E6; ++ padding: 5px; ++} ++ ++.cbi-section-error ul { margin: 0 0 0 20px; } ++ ++.cbi-section-error ul li { ++ color: #FF0000; ++ font-weight: bold; ++} ++ ++.ifacebox { ++ background-color: #FFFFFF; ++ border: 1px solid #CCCCCC; ++ margin: 0 10px; ++ text-align: center; ++ white-space: nowrap; ++ background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ffffff), color-stop(25%, #ffffff), to(#e6e6e6)); ++ background-image: -webkit-linear-gradient(#ffffff, #ffffff 25%, #e6e6e6); ++ background-image: -moz-linear-gradient(top, #ffffff, #ffffff 25%, #e6e6e6); ++ background-image: -ms-linear-gradient(#ffffff, #ffffff 25%, #e6e6e6); ++ background-image: -o-linear-gradient(#ffffff, #ffffff 25%, #e6e6e6); ++ background-image: linear-gradient(#ffffff, #ffffff 25%, #e6e6e6); ++ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffff', endColorstr='#e6e6e6', GradientType=0); ++ text-shadow: 0 1px 1px rgba(255, 255, 255, 0.75); ++ -webkit-border-radius: 4px; ++ -moz-border-radius: 4px; ++ border-radius: 4px; ++ -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05); ++ -moz-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05); ++ box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05); ++} ++ ++.ifacebox .ifacebox-head { ++ border-bottom: 1px solid #CCCCCC; ++ padding: 2px; ++} ++ ++.ifacebox .ifacebox-body { ++ padding: 6px; ++} ++ ++.ifacebadge { ++ display: inline-block; ++ white-space: nowrap; ++ background-color: #FFFFFF; ++ border: 1px solid #CCCCCC; ++ padding: 2px; ++ margin-left: 2px; ++ background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ffffff), color-stop(25%, #ffffff), to(#e6e6e6)); ++ background-image: -webkit-linear-gradient(#ffffff, #ffffff 25%, #e6e6e6); ++ background-image: -moz-linear-gradient(top, #ffffff, #ffffff 25%, #e6e6e6); ++ background-image: -ms-linear-gradient(#ffffff, #ffffff 25%, #e6e6e6); ++ background-image: -o-linear-gradient(#ffffff, #ffffff 25%, #e6e6e6); ++ background-image: linear-gradient(#ffffff, #ffffff 25%, #e6e6e6); ++ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffff', endColorstr='#e6e6e6', GradientType=0); ++ text-shadow: 0 1px 1px rgba(255, 255, 255, 0.75); ++ -webkit-border-radius: 4px; ++ -moz-border-radius: 4px; ++ border-radius: 4px; ++ -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05); ++ -moz-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05); ++ box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05); ++} ++ ++.ifacebadge-active { ++ border-color: #000000; ++ font-weight: bold; ++} ++ ++.zonebadge { ++ padding: 2px; ++ border-radius: 4px; ++ display: inline-block; ++ white-space: nowrap; ++ color: #666666; ++ text-shadow: 0 1px 1px rgba(255, 255, 255, 0.75); ++ cursor: pointer; ++} ++ ++.zonebadge > em, ++.zonebadge > strong { ++ margin: 5px; ++ display: inline-block; ++} ++ ++.zonebadge input { ++ width: 6em; ++} ++ ++.zonebadge-empty { ++ border: 1px dashed #AAAAAA; ++ color: #AAAAAA; ++ font-style: italic; ++ font-size: smaller; ++} ++ ++div.cbi-value var, ++td.cbi-value-field var { ++ font-style: italic; ++ color: #0069D6; ++} ++ ++.uci-change-list { ++ font-family: monospace; ++} ++ ++.uci-change-list ins, ++.uci-change-legend-label ins { ++ text-decoration: none; ++ border: 1px solid #00FF00; ++ background-color: #CCFFCC; ++ display: block; ++ padding: 2px; ++} ++ ++.uci-change-list del, ++.uci-change-legend-label del { ++ text-decoration: none; ++ border: 1px solid #FF0000; ++ background-color: #FFCCCC; ++ display: block; ++ font-style: normal; ++ padding: 2px; ++} ++ ++.uci-change-list var, ++.uci-change-legend-label var { ++ text-decoration: none; ++ border: 1px solid #CCCCCC; ++ background-color: #EEEEEE; ++ display: block; ++ font-style: normal; ++ padding: 2px; ++} ++ ++.uci-change-list var ins, ++.uci-change-list var del { ++ /*display: inline;*/ ++ border: none; ++ white-space: pre; ++ font-style: normal; ++ padding: 0px; ++} ++ ++.uci-change-legend { ++ padding: 5px; ++} ++ ++.uci-change-legend-label { ++ width: 150px; ++ float: left; ++} ++ ++.uci-change-legend-label > ins, ++.uci-change-legend-label > del, ++.uci-change-legend-label > var { ++ float: left; ++ margin-right: 4px; ++ width: 10px; ++ height: 10px; ++ display: block; ++} ++ ++.uci-change-legend-label var ins, ++.uci-change-legend-label var del { ++ line-height: 6px; ++ border: none; ++} +diff --git a/feeds/luci/themes/luci-theme-bootstrap/htdocs/luci-static/bootstrap/favicon.ico b/feeds/luci/themes/luci-theme-bootstrap/htdocs/luci-static/bootstrap/favicon.ico +new file mode 100644 +index 0000000000000000000000000000000000000000..77a138ba0c53da3f891857646887710d4b472fdd +GIT binary patch +literal 1150 +zcmZQzU<5(|0R}M0U}0bo1F|%L7$l?s#Ef7P$NwD5 +zyD&e$2Aer)Damoz)Z-BQhHeH9btry7RT$l_@13qXDgni$+neEMN>FdArv +z0lGQBFs%lPtwI-v>Tv?n|DhPfWM1mmXwsh<2>{OOVxp*g!w@ +zqKiTG6Xkx8S{(YJ#vmwkbwIoQ(e*=B!~Bd+gY5bTGY4TZ#0^ONRX{enUXU0V0QLV( +zPE1sV@sVhl9&mgiiG!HP;ejTF!iAZEi$+n5hl8yD3NCej>=_t7@G~$xU}j)Az{tSR +l0L0A?85r0SfW?IY1cTV^K(P)%28J8b3=GeoL-c_30szk#m9qc< + +literal 0 +HcmV?d00001 + +diff --git a/feeds/luci/themes/luci-theme-bootstrap/htdocs/luci-static/bootstrap/html5.js b/feeds/luci/themes/luci-theme-bootstrap/htdocs/luci-static/bootstrap/html5.js +new file mode 100644 +index 0000000..1ec510f +--- /dev/null ++++ b/feeds/luci/themes/luci-theme-bootstrap/htdocs/luci-static/bootstrap/html5.js +@@ -0,0 +1,3 @@ ++// HTML5 Shiv v3 | @jon_neal @afarkas @rem | MIT/GPL2 Licensed ++// Uncompressed source: https://github.com/aFarkas/html5shiv ++(function(a,b){function f(a){var c,d,e,f;b.documentMode>7?(c=b.createElement("font"),c.setAttribute("data-html5shiv",a.nodeName.toLowerCase())):c=b.createElement("shiv:"+a.nodeName);while(a.firstChild)c.appendChild(a.childNodes[0]);for(d=a.attributes,e=d.length,f=0;f7?e[g][e[g].length-1]=e[g][e[g].length-1].replace(d,'$1font[data-html5shiv="$2"]'):e[g][e[g].length-1]=e[g][e[g].length-1].replace(d,"$1shiv\\:$2"),e[g]=e[g].join("}");return e.join("{")}var c=function(a){return a.innerHTML="",a.childNodes.length===1}(b.createElement("a")),d=function(a,b,c){return b.appendChild(a),(c=(c?c(a):a.currentStyle).display)&&b.removeChild(a)&&c==="block"}(b.createElement("nav"),b.documentElement,a.getComputedStyle),e={elements:"abbr article aside audio bdi canvas data datalist details figcaption figure footer header hgroup mark meter nav output progress section summary time video".split(" "),shivDocument:function(a){a=a||b;if(a.documentShived)return;a.documentShived=!0;var f=a.createElement,g=a.createDocumentFragment,h=a.getElementsByTagName("head")[0],i=function(a){f(a)};c||(e.elements.join(" ").replace(/\w+/g,i),a.createElement=function(a){var b=f(a);return b.canHaveChildren&&e.shivDocument(b.document),b},a.createDocumentFragment=function(){return e.shivDocument(g())});if(!d&&h){var j=f("div");j.innerHTML=["x"].join(""),h.insertBefore(j.lastChild,h.firstChild)}return a}};e.shivDocument(b),a.html5=e;if(c||!a.attachEvent)return;a.attachEvent("onbeforeprint",function(){if(a.html5.supportsXElement||!b.namespaces)return;b.namespaces.shiv||b.namespaces.add("shiv");var c=-1,d=new RegExp("^("+a.html5.elements.join("|")+")$","i"),e=b.getElementsByTagName("*"),g=e.length,j,k=i(h(function(a,b){var c=[],d=a.length;while(d)c.unshift(a[--d]);d=b.length;while(d)c.unshift(b[--d]);c.sort(function(a,b){return a.sourceIndex-b.sourceIndex}),d=c.length;while(d)c[--d]=c[d].styleSheet;return c}(b.getElementsByTagName("style"),b.getElementsByTagName("link"))));while(++c ++ Copyright 2008 Jo-Philipp Wich ++ Copyright 2012 David Menting ++ Licensed to the public under the Apache License 2.0. ++-%> ++ ++<% ++ local ver = require "luci.version" ++ local disp = require "luci.dispatcher" ++ local request = disp.context.path ++ local category = request[1] ++ local tree = disp.node() ++ local categories = disp.node_childs(tree) ++%> ++ ++
    ++
    ++ ++ ++ +diff --git a/feeds/luci/themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm b/feeds/luci/themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm +new file mode 100644 +index 0000000..f4a6810 +--- /dev/null ++++ b/feeds/luci/themes/luci-theme-bootstrap/luasrc/view/themes/bootstrap/header.htm +@@ -0,0 +1,204 @@ ++<%# ++ Copyright 2008 Steven Barth ++ Copyright 2008 Jo-Philipp Wich ++ Copyright 2012 David Menting ++ Licensed to the public under the Apache License 2.0. ++-%> ++ ++<% ++ local sys = require "luci.sys" ++ local util = require "luci.util" ++ local http = require "luci.http" ++ local disp = require "luci.dispatcher" ++ ++ local boardinfo = util.ubus("system", "board") ++ ++ local request = disp.context.path ++ local request2 = disp.context.request ++ ++ local category = request[1] ++ local cattree = category and disp.node(category) ++ ++ local leaf = request2[#request2] ++ ++ local tree = disp.node() ++ local node = disp.context.dispatched ++ ++ local categories = disp.node_childs(tree) ++ ++ local c = tree ++ local i, r ++ ++ -- tag all nodes leading to this page ++ for i, r in ipairs(request) do ++ if c.nodes and c.nodes[r] then ++ c = c.nodes[r] ++ c._menu_selected = true ++ end ++ end ++ ++ -- send as HTML5 ++ http.prepare_content("text/html") ++ ++ local function nodeurl(prefix, name, query) ++ local url = controller .. prefix .. name .. "/" ++ if query then ++ url = url .. http.build_querystring(query) ++ end ++ return pcdata(url) ++ end ++ ++ local function subtree(prefix, node, level) ++ if not level then ++ level = 1 ++ end ++ ++ local childs = disp.node_childs(node) ++ if #childs > 0 then ++ ++ if level > 2 then ++%> ++
      ++ <% ++ end ++ ++ local selected_node ++ local selected_name ++ local i, v ++ ++ for i, v in ipairs(childs) do ++ local nnode = node.nodes[v] ++ if nnode._menu_selected then ++ selected_node = nnode ++ selected_name = v ++ end ++ if level > 2 then ++ %> ++
    • ++ <%=striptags(translate(nnode.title))%> ++
    • ++ <% end ++ end ++ ++ if level > 2 then ++ %> ++
    ++<% end ++ ++ if selected_node then ++ subtree(prefix .. selected_name .. "/", selected_node, level + 1) ++ end ++ end ++ end ++-%> ++ ++ ++ ++ ++ <%=striptags( (boardinfo.hostname or "?") .. ( (node and node.title) and ' - ' .. translate(node.title) or '')) %> - LuCI ++ ++ ++ ++ ++ ++ <% if node and node.css then %> ++ <% end -%> ++ <% if css then %> ++ <% end -%> ++ ++ ++ ++ ++
    ++
    ++
    ++ <%=boardinfo.hostname or "?"%> ++ ++ ++ <% ++ -- calculate the number of unsaved changes ++ if tree.nodes[category] and tree.nodes[category].ucidata then ++ local ucichanges = 0 ++ ++ for i, j in pairs(require("luci.model.uci").cursor():changes()) do ++ for k, l in pairs(j) do ++ for m, n in pairs(l) do ++ ucichanges = ucichanges + 1; ++ end ++ end ++ end ++ %> ++
    ++ <% if ucichanges > 0 then %> ++ <%:Unsaved Changes%>: <%=ucichanges%> ++ <% end %> ++ ++
    ++ <% end %> ++
    ++
    ++
    ++ ++<%- if luci.sys.process.info("uid") == 0 and luci.sys.user.getuser("root") and not luci.sys.user.getpasswd("root") then -%> ++
    ++
    ++

    <%:No password set!%>

    ++ <%:There is no password set on this router. Please configure a root password to protect the web interface and enable SSH.%>
    ++ "><%:Go to password configuration...%> ++
    ++
    ++<%- end -%> ++ ++
    ++<% if category then subtree("/" .. category .. "/", cattree) end %> +diff --git a/feeds/luci/themes/luci-theme-bootstrap/root/etc/uci-defaults/luci-theme-bootstrap b/feeds/luci/themes/luci-theme-bootstrap/root/etc/uci-defaults/luci-theme-bootstrap +new file mode 100755 +index 0000000..09299e0 +--- /dev/null ++++ b/feeds/luci/themes/luci-theme-bootstrap/root/etc/uci-defaults/luci-theme-bootstrap +@@ -0,0 +1,7 @@ ++#!/bin/sh ++uci batch <<-EOF ++ set luci.themes.Bootstrap=/luci-static/bootstrap ++ set luci.main.mediaurlbase=/luci-static/bootstrap ++ commit luci ++EOF ++exit 0 +diff --git a/feeds/luci/themes/luci-theme-freifunk-bno/Makefile b/feeds/luci/themes/luci-theme-freifunk-bno/Makefile +new file mode 100644 +index 0000000..1491a97 +--- /dev/null ++++ b/feeds/luci/themes/luci-theme-freifunk-bno/Makefile +@@ -0,0 +1,14 @@ ++# ++# Copyright (C) 2008-2014 The LuCI Team ++# ++# This is free software, licensed under the Apache License, Version 2.0 . ++# ++ ++include $(TOPDIR)/rules.mk ++ ++LUCI_TITLE:=Freifunk Berlin Nordost Theme ++LUCI_DEPENDS:= ++ ++include ../../luci.mk ++ ++# call BuildPackage - OpenWrt buildroot signature +diff --git a/feeds/luci/themes/luci-theme-freifunk-bno/htdocs/luci-static/freifunk-bno/cascade.css b/feeds/luci/themes/luci-theme-freifunk-bno/htdocs/luci-static/freifunk-bno/cascade.css +new file mode 100644 +index 0000000..4f89b2d +--- /dev/null ++++ b/feeds/luci/themes/luci-theme-freifunk-bno/htdocs/luci-static/freifunk-bno/cascade.css +@@ -0,0 +1,872 @@ ++* { ++ margin: 0; ++ padding: 0; ++} ++ ++body { ++ background-color: #ffffff; ++ color: #ffffff; ++ font-family: Verdana, Arial, sans-serif; ++ font-size: 100%; ++ line-height: 100%; ++ background-image: url(images/main-back.png); ++ background-repeat: repeat-x; ++ background-position: left bottom; ++ } ++#all { ++ margin: 0px; ++ padding: 0px; ++ min-height: 800px; ++} ++ ++code { ++ font-family: monospace; ++ white-space: pre; ++} ++ ++a:link, a:visited { ++ color:#000000; ++ font-weight:bold; ++ text-decoration:none; ++ } ++a:hover { ++ color:#333333; ++ font-weight:bold; ++ } ++ ++/* Custom*/ ++ #wrapper ++{ ++ width: 95%; ++ color: #333333; ++ margin-left: auto; ++ margin-right: auto; ++/* background-image: url(images/corner-left.gif); */ ++/* background-repeat: no-repeat; */ ++/* background-position: left bottom; */ ++ background-color: #FffdF4; ++ min-width: 710px; ++ min-height: 710px; ++} ++#main { ++ clear: both; ++ width: 100%; ++ margin: 0; ++ padding: 0; ++ color: #333333; ++/* background-image: url(images/corner-right.gif); */ ++/* background-repeat: no-repeat; */ ++/* background-position: right bottom; */ ++ min-height: 710px; ++} ++ ++div#maincontent ul { ++ margin-left: 2em; ++} ++ ++.warning { ++ color: red !important; ++ font-weight: bold; ++} ++ ++.clear { ++ clear: both; ++ height: 1px; ++} ++ ++.hidden { ++ display: none; ++} ++ ++.error { ++ color: #ff0000; ++} ++ ++#header ++{ ++ padding: 0px; ++ height: 100px; ++} ++#headerleft ++{ ++ height: 100px; ++ background-color: #FFFfff; ++ background-image: url(images/header-left.gif); ++ background-repeat: no-repeat; ++ background-position: left top; ++} ++#headerright ++{ ++ height: 100px; ++ background-color: #FFfffF; ++ ++ margin-left: 5px; ++ background-image: url(images/header-right.gif); ++ background-repeat: no-repeat; ++ background-position: right top; ++} ++ ++#headerback ++{ ++ margin-right: 5px; ++ height: 100px; ++ background-color: #FFfffF; ++ background-image: url(images/header-back.gif); ++ background-repeat: repeat-x; ++ background-position: left top; ++} ++#schriftzug { ++ font-size : 1.5em; ++ text-align:left; ++ margin-bottom: 7px; ++ margin-top: 7px; ++ float:left; ++ width: 450px; ++} ++ ++#schriftzug a:hover{ ++ background-color:transparent; ++} ++#logo{ ++ margin-top: 5px; ++ float:right; ++ width: 115px; ++} ++ ++.pathbar { ++ display: none; ++} ++ ++.menubar { ++ width: 100%; ++ min-height: 1.8em; ++ background: #ffffff; ++ color: #000000; ++ border-top:0.4em solid #DC0067; ++} ++ ++.mainmenu { ++ float: left; ++ width: auto; ++ min-height: 1.8em; ++ background: #ffffff; ++ color: #000000; ++} ++.modemenu li { ++ border-top:0.3em solid #DC0067; ++ margin-left: 0.3em; ++ margin-top: -0.3em; ++} ++.mainmenu div { ++ float: left; ++ border-top:0.3em solid #DC0067; ++ margin-right: 0.3em; ++ margin-top: -0.3em; ++} ++.mainmenu div.preactive { ++ border-top: 0.3em solid #FFCB05; ++ margin-top: -0.2em; ++} ++ ++.mainmenu li { ++ white-space: nowrap; ++} ++ ++.mainmenu div ul { ++ display: none; ++ position: absolute; ++ background: #ffffff; ++ color: #000000; ++ border-width: 0 1px 1px 1px; ++ border-style: solid; ++ border-color: #444444; ++ list-style-type: none; ++} ++ ++.mainmenu ul li:hover > ul, ++.mainmenu div:hover > ul { ++ display: block; ++} ++ ++.mainmenu ul li > ul { ++ left: 100%; ++ margin-top: -1.8em; ++ border-width: 1px; ++} ++ ++.modemenu a, ++.mainmenu a { ++ display: block; ++ padding: 0.2em; ++ color: #000000; ++ text-decoration: none; ++ font-size: 70%; ++ font-weight: bold; ++} ++ ++ ++.modemenu .active a { ++ color: #000000; ++ font-weight: bold; ++ border-top:0.3em solid #FFCB05; ++ margin-top: -0.2em; ++} ++.mainmenu .active a{ ++ color: #000000; ++ font-weight: bold; ++ border-top:0.2em solid #FFCB05; ++} ++.mainmenu li > span:active { ++ background-color: #FFE990; ++} ++ ++.mainmenu li:hover > span > a, ++.mainmenu div:hover > a { ++color: #ffffff; ++background-color: #FFCB05; ++} ++ ++ ++.modemenu a:focus, ++.mainmenu a:focus { ++ color: #000000; ++} ++ ++.mainmenu a:hover, ++.modemenu a:hover { ++color: #ffffff; ++background-color: #FFCB05; ++} ++ ++.mainmenu div.preactive > a { ++ color: #DC0067; ++ font-weight: bold; ++} ++.mainmenu div.preactive > a:hover, ++.mainmenu div.preactive > a:focus { ++ color: #ffffff; ++ font-weight: bold; ++} ++ ++.modemenu ul { ++ width: auto; ++ background: #000000; ++ color: #ffffff; ++ list-style-type: none; ++} ++ ++.modemenu li { ++ float: right; ++ ++} ++ ++#maincontent { ++ clear: both; ++ width: 98%; ++ margin: 0 auto; ++ padding: 0.5em; ++ background: #FFF4BE; ++ color: #000000; ++ font-size: 80%; ++ border-top:1px solid #D2A800; ++} ++ ++#maincontent h2 { ++ margin: 0.25em 0 0.5em 0; ++ font-size: 150%; ++ font-weight: normal; ++} ++ ++#maincontent h3 { ++ margin: 0.5em 0; ++ font-size: 120%; ++ font-weight: normal; ++ text-decoration: underline; ++} ++ ++#maincontent p { ++ margin-bottom: 1em; ++} ++ ++.cbi-section { ++ margin-bottom: 0.5em; ++ padding: 0.5em 1em; ++ border: 1px dotted #D2A800; ++ background-color: #FFE990; ++} ++ ++.cbi-section legend { ++ font-size: 110%; ++ font-weight: bold; ++ height: 1em; ++ padding: 0 0.25em; ++ color: #555555; ++} ++ ++.cbi-section h2 { ++ margin: 0em 0 0.5em -0.5em !important; ++} ++ ++.cbi-section h3 { ++ height: 1.5em; ++ font-size: 90%; ++ color: #555555; ++} ++ ++.cbi-section-descr { ++ margin-bottom: 0.5em; ++ font-size: 95%; ++} ++ ++.cbi-title-ref { ++ color: inherit; ++ text-decoration: none; ++ padding-right: 18px; ++ background: url('../resources/cbi/link.gif') no-repeat scroll right center; ++ background-color: inherit; ++} ++ ++input[type=submit], ++input[type=reset], ++input[type=image], ++label { ++ cursor: pointer; ++} ++ ++select, ++input, ++textarea { ++ background: #FffdF4; ++ color: #000000; ++ border-width: 1px; ++ border-color: #000000; ++} ++ ++input[type=image] { ++ border: none; ++} ++ ++ ++input:focus, ++input:hover, ++select:focus, ++select:hover, ++textarea:focus, ++textarea:hover { ++ background-color: #FFF4BE; ++} ++ ++select, ++input[type=text], ++input[type=password] { ++ width: 20em; ++} ++ ++td select, ++td input[type=text], ++td input[type=password] { ++ width: 99%; ++} ++ ++img.cbi-image-button { ++ cursor: pointer; ++ margin: 0 2px; ++ vertical-align: middle; ++} ++ ++input.cbi-input-user { ++ background: url('../resources/cbi/user.gif') no-repeat scroll 1px center; ++ background-color: inherit; ++ padding-left: 17px; ++} ++ ++input.cbi-input-password { ++ background: url('../resources/cbi/key.gif') no-repeat scroll 1px center; ++ background-color: inherit; ++ padding-left: 17px; ++} ++ ++input.cbi-input-find { ++ background: url('../resources/cbi/find.gif') no-repeat scroll 1px center; ++ background-color: inherit; ++ padding-left: 17px; ++} ++ ++input.cbi-input-reload { ++ background: url('../resources/cbi/reload.gif') no-repeat scroll 1px center; ++ background-color: inherit; ++ padding-left: 17px; ++} ++ ++input.cbi-input-add, ++input.cbi-button-add { ++ background: url('../resources/cbi/add.gif') no-repeat scroll 1px center; ++ background-color: inherit; ++ padding-left: 17px; ++ padding-right: 1px; ++} ++ ++input.cbi-input-fieldadd, ++input.cbi-button-fieldadd { ++ background: url(../resources/cbi/fieldadd.gif) no-repeat scroll 1px center; ++ background-color: inherit; ++ padding-left: 17px; ++ padding-right: 1px; ++} ++ ++input.cbi-input-reset, ++input.cbi-button-reset { ++ background: url('../resources/cbi/reset.gif') no-repeat scroll 1px center; ++ background-color: inherit; ++ padding-left: 17px; ++ padding-right: 1px; ++} ++ ++input.cbi-input-save, ++input.cbi-button-save { ++ background: url('../resources/cbi/save.gif') no-repeat scroll 1px center; ++ background-color: inherit; ++ padding-left: 17px; ++ padding-right: 1px; ++} ++ ++input.cbi-input-apply, ++input.cbi-button-apply { ++ background: url('../resources/cbi/apply.gif') no-repeat scroll 1px center; ++ background-color: inherit; ++ padding-left: 17px; ++ padding-right: 1px; ++} ++ ++input.cbi-input-remove, ++div.cbi-section-remove input { ++ background: url('../resources/cbi/remove.gif') no-repeat scroll 1px center; ++ background-color: inherit; ++ padding-left: 17px; ++ padding-right: 1px; ++} ++ ++input.cbi-button-up { ++ background-image: url('../resources/cbi/up.gif'); ++ padding-left: 11px; ++ padding-right: 1px; ++} ++ ++input.cbi-button-down { ++ background-image: url('../resources/cbi/down.gif'); ++ padding-left: 11px; ++ padding-right: 1px; ++} ++ ++input.cbi-button-edit { ++ background-image: url('../resources/cbi/edit.gif'); ++ color: #000000; ++ padding-left: 17px; ++ padding-right: 1px; ++} ++ ++input.cbi-button-reload { ++ background-image: url('../resources/cbi/reload.gif'); ++ color: #000000; ++ padding-left: 17px; ++ padding-right: 1px; ++} ++ ++input.cbi-button-reset { ++ background-image: url('../resources/cbi/reset.gif'); ++ color: #000000; ++ padding-left: 17px; ++ padding-right: 1px; ++} ++ ++input.cbi-button-remove { ++ background-image: url('../resources/cbi/remove.gif'); ++ color: #000000; ++ padding-left: 17px; ++ padding-right: 1px; ++} ++ ++.cbi-input-invalid { ++ background-image: url('../resources/cbi/reset.gif'); ++ background-repeat: no-repeat; ++ background-position: right; ++ color: #FF0000 !important; ++ border-color: #FF0000; ++} ++ ++div.cbi-section-remove input { ++ border-bottom: none; ++} ++ ++textarea { ++ margin-left: -1px; ++ margin-bottom: 0.5em; ++} ++ ++form > div > input[type=submit], ++form > div > input[type=reset] { ++ float: right; ++ margin-left: 0.5em; ++} ++ ++table.smalltext { ++background-color: #FFCB05; ++ border-top: 1px solid #666666; ++ border-right: 1px solid #666666; ++ border-bottom: 1px solid #666666; ++ font-size: 90%; ++ width: 80%; ++ margin-left: auto; ++ margin-right: auto; ++ border-collapse: collapse; ++} ++ ++table.smalltext tr:hover td { ++background-color: #FFE990; ++} ++ ++table.smalltext tr th { ++ padding: 0 0.25em; ++ border-left: 1px solid #666666; ++ text-align: left; ++} ++ ++table.smalltext tr td { ++ padding: 0 0.25em; ++ border-top: 1px solid #666666; ++ border-left: 1px solid #666666; ++} ++ ++.cbi-rowstyle-1 { ++ background-color: #FFF4BE; ++} ++ ++.cbi-rowstyle-2 { ++} ++ ++table.cbi-section-table .cbi-section-table-cell { ++ padding: 3px; ++ white-space: nowrap; ++} ++ ++div.cbi-value { ++ clear: left; ++ vertical-align: middle; ++ padding-left: 0.25em; ++ border-bottom: 1px dotted #FFCB05; ++} ++ ++div.cbi-value:hover { ++ background: #FFF4BE; ++} ++ ++div.cbi-value:last-child { ++ border: none; ++} ++ ++.cbi-value-title { ++ float: left; ++ width: 40%; ++} ++ ++div.cbi-value-field { ++ width: 58%; ++ margin: 0.25em 0 0.25em 40%; ++} ++ ++div.cbi-value-description { ++ font-size: 90%; ++} ++ ++div.cbi-value-field > div.cbi-value-description { ++ display: none; ++} ++ ++div.cbi-value:hover div.cbi-value-field > div.cbi-value-description { ++ display: block; ++ color: #ffffff; ++ background-color: #FFCB05; ++} ++ ++option:active, ++option:before, ++option:after, ++option:focus, ++option:hover { ++ color: #ffffff; ++ background-color: #EEBA00; ++ background: url(images/bgoption.png); ++} ++ ++div.cbi-section-create { ++ clear: left; ++ white-space: nowrap; ++} ++ ++div.cbi-map-descr { ++ margin-bottom: 1em; ++} ++ ++div.cbi-optionals { ++ margin: 0.5em 0; ++ padding: 0 0.25em; ++} ++ ++div.cbi-section-remove { ++ float: right; ++} ++ ++.cbi-section-node { ++ clear: both; ++ border: 1px dotted #FFCB05; ++ padding-bottom: 0; ++} ++ ++.cbi-section-node div.cbi-section-table-row { ++ margin: 0.25em; ++} ++ ++table.cbi-section-table { ++ width: 100%; ++ font-size: 95%; ++} ++ ++table.cbi-section-table th, ++table.cbi-section-table td { ++ text-align: center; ++} ++ ++tr.cbi-section-table-descr th { ++ font-weight: normal; ++ font-size: 90%; ++} ++ ++td.cbi-section-table-optionals { ++ text-align: left !important; ++ padding-top: 1em; ++} ++ ++.cbi-value-helpicon img { ++ vertical-align: bottom; ++} ++ ++div.cbi-error { ++ font-size: 95%; ++ font-weight: bold; ++ color: #FF0000; ++} ++ ++td.cbi-value-error { ++ border-color: red !important; ++} ++ ++.cbi-value-error input, ++.cbi-value-error select { ++ color: red !important; ++ background-color: #FFCCCC; ++} ++ ++.cbi-section-error { ++ color: red; ++ font-size: 95%; ++ border: 1px dotted red; ++ margin: 3px; ++ padding: 3px; ++} ++ ++ul.cbi-apply { ++ font-size: 90%; ++} ++ ++ul.cbi-tabmenu { ++ padding: 3px 0; ++ margin-left: 0 !important; ++ margin-bottom: -1px; ++ list-style-type: none; ++} ++ ++ul.cbi-tabmenu li.cbi-tab, ++ul.cbi-tabmenu li.cbi-tab-disabled { ++ display: inline; ++ margin: 0; ++} ++ ++ul.cbi-tabmenu li.cbi-tab a, ++ul.cbi-tabmenu li.cbi-tab-disabled a { ++ text-decoration: none; ++ padding: 3px 7px; ++ margin-right: 3px; ++ border: 1px outset #000; ++ border-bottom: none; ++ background-color: #eee; ++ color: #bbb; ++} ++ ++ul.cbi-tabmenu li.cbi-tab-highlighted a { ++ color: #000; ++ background-color: #FFEEAA; ++} ++ ++ul.cbi-tabmenu li a:hover { ++ color: #000; ++} ++ ++ul.cbi-tabmenu li.cbi-tab a { ++ position: relative; ++ top: 1px; ++ padding-top: 4px; ++ color: #000; ++ background-color: #fff; ++} ++ ++div.cbi-tab-descr { ++ background-image: url(/luci-static/resources/cbi/help.gif); ++ background-position: 0.25em 50%; ++ background-repeat: no-repeat; ++ border-bottom: 1px solid #ccc; ++ margin: 0.25em 0.25em 2em; ++ padding: 0.5em 0.5em 0.5em 2em; ++} ++ ++ ++.left { ++ text-align: left !important; ++} ++ ++.right { ++ text-align: right !important; ++} ++ ++.luci { ++ position: fixed; ++ bottom: 0; ++ left: 0; ++ text-align: right; ++} ++ ++.luci a { ++ color: #666666; ++ text-decoration: none; ++ font-size: 70%; ++} ++ ++.inline { ++ display: inline; ++} ++ ++.error500 { ++ white-space: normal; ++ border: 1px dotted #FF0000; ++ background-color: #FFFFFF; ++ padding: 0.5em; ++} ++ ++/* obligatory IE6 Voodoo Code */ ++* html body { ++ padding-left: 50% !important; ++} ++ ++* html div#header { ++ margin-left: -100% !important; ++} ++ ++* html div.menubar { ++ margin-left: -100% !important; ++ width: 200% !important; ++} ++ ++* html div#maincontent { ++ margin-left: -80% !important; ++ width: 160% !important; ++} ++ ++* html div.mainmenu div.hover ul, ++* html div.mainmenu div li.hover ul, ++* html div.mainmenu div li li.hover ul, ++* html div.mainmenu div li li li.hover ul, ++* html div.mainmenu div li li li li.hover ul { ++ display: block !important; ++ margin-left: 3em; ++} ++ ++* html div.mainmenu div.hover ul { ++ margin-left: 0; ++} ++ ++* html div.mainmenu .hover ul ul, ++* html div.mainmenu .hover ul ul ul, ++* html div.mainmenu .hover ul ul ul ul, ++* html div.mainmenu .hover ul ul ul ul ul { ++ display: none !important; ++} ++ ++* html div.mainmenu li { ++ height: 1em !important; ++ width: 10em !important; ++} ++ ++* html .mainmenu { ++ height: 1.8em; ++} ++ ++* html div.cbi-value-description { ++ margin-left: 40%; ++} ++ ++ ++.ifacebox { ++ background-color: #FFFFFF; ++ border: 1px solid #CCCCCC; ++ margin: 0 10px; ++ text-align: center; ++ white-space: nowrap; ++} ++ ++.ifacebox .ifacebox-head { ++ border-bottom: 1px solid #CCCCCC; ++ padding: 2px; ++} ++ ++.ifacebox .ifacebox-body { ++ padding: 2px; ++} ++ ++ ++.ifacebadge { ++ background-color: #FFFFFF; ++ border: 1px solid #CCCCCC; ++ padding: 2px; ++ margin-left: 2px; ++ display: inline-block; ++} ++ ++.ifacebadge-active { ++ border-color: #000000; ++ font-weight: bold; ++} ++ ++ ++.zonebadge { ++ padding: 2px; ++ display: inline-block; ++ white-space: nowrap; ++ cursor: pointer; ++} ++ ++.zonebadge em, ++.zonebadge strong { ++ margin: 3px; ++ display: inline-block; ++} ++ ++.zonebadge input { ++ width: 6em; ++ height: 1.5em; ++} ++ ++.zonebadge-empty { ++ border: 1px dashed #AAAAAA; ++ color: #AAAAAA; ++ font-style: italic; ++ font-size: smaller; ++} +diff --git a/feeds/luci/themes/luci-theme-freifunk-bno/htdocs/luci-static/freifunk-bno/images/bgoption.png b/feeds/luci/themes/luci-theme-freifunk-bno/htdocs/luci-static/freifunk-bno/images/bgoption.png +new file mode 100644 +index 0000000000000000000000000000000000000000..6fd1e2f34787b200eb425e42fb98c75b039163e2 +GIT binary patch +literal 141 +zcmeAS@N?(olHy`uVBq!ia0vp^j3CUx1|;Q0k92}K#X;^)4C~IxyaaOClDyqr82*Fc +zg1yTp14TFsJR*yMv=#_6DqH@!17xt5c>21s-{2Gz=HriQFMb9T;`MZK4B@z*T(N!D +bLwg3cy-YKE&k4N(N-%i3`njxgN@xNAizFlF + +literal 0 +HcmV?d00001 + +diff --git a/feeds/luci/themes/luci-theme-freifunk-bno/htdocs/luci-static/freifunk-bno/images/favicon.ico b/feeds/luci/themes/luci-theme-freifunk-bno/htdocs/luci-static/freifunk-bno/images/favicon.ico +new file mode 100644 +index 0000000000000000000000000000000000000000..7247cfac5fe279cf3e12c965f53483196bfb0e2f +GIT binary patch +literal 5310 +zcmeHJd2AGA6n}uYe@I#)M*vMg2#O-0f)-FIh+q(ng4H&}NJygr4G0#oh0<*)Edo`b +z6iWb+044>R6hb106t=XbT-CN%OS^OJebMf2ce|avW_;6GrrVuqHT-FIc4qVDeQ$o> +zo8P+zU=aQ$OaS~J17#xtMgzbUyif)6@e=fpc7y`lUuE9%751GY^f^H10)yvPp!bY7 +zXmXv8h8g|T!Iw-MfY=O_1TJpzEs)haT+x<~CX-iu8-XkYW(P3adrp*5$OM8nge6Q% +zga7Co7U^~X!P?}fD!Zc%vVeO1V`|z;Ds?(NH=P-`k4c$KEto_sG1w)uf+uttKq7CF +zMp0-z-}Ma;89<1ur)}PaT3gm`TlO^l?LF@OqYT@D&I9UJzN`6+_pH}fY;+epI|~jt +za)4Y1T769)$K+eoAMX4L+O`1o>j+ax*t1>dYV8V0X2%v-aS8o&>3Ws-J^rU=wWbUw +z8ovHd;jlIMGl7JI#Hlq730V}*u5ut(815K-cSGPnvUwzB^oDvP5@Qp6n_b(U^{PHv +zBg)qcUEcvI#}`+RSUiQg$SWM0Wj?;hDn~%gXDtpg6jWTgSLVgE%mhkt6_uK;*M*_ +z(KBXh19ar2q8~J}LC`QzNy48D+@awjF|>;53@UiSySev96B|YeuYj-!ekRS1<&P!# +zK@z=gnK2qxlmlT7E@p3czc=TI9_i5#iz!(sWiR@Pn +zSxNO~sHA$4r7f;dOPdsuq%PC>;bg&KgcZTDWnp`nl13WJeR6-`5((G(IxlX4%HK)3 +zJyYRZI+ZMV*lERni1-PcNar=b+#W6w{o>=2?C3bp!d~rGAh9uGK8yJIKrbCb+OD%Q +zb4+U{mVD9wtMssHoq|0;NxjQb%bM=6Efrn33-+|lK+buMXs=W7f1kmP2@}gdl5>GL +zY4s}N7n$6W-gKAs+In)bQOEHL`GA(6G~0y~s-&T+=frSd&|;-aAkjhyLC`>U+;Fq^ +zJPQ7chLs(@7w($iA_bS}m+Q@VD+7oqE*^K^2`k_PdA`v4FFm$lowFwOL4U}o=Uv<~ +zX!{a~qjM}sezYa84Z$I8`FvZnGDfc5?W)@|kPjzPY*0ZJ0ge6Vb71En)e +z*e(iydUJRi|3FYG9yow%cJ_-OXbCPFOKcg6Gp6jLmQ68(s9Ou>W-ZLSZug_&3%!iTHI)D>L<|pTK0N@GXAc?I#nr!b&3Ur +z{l9G4Ks=Z7-WBP3wkdYdxOBm)Z3_4sQjCkIl0QD|2{=X->6Mh{-m#C(AU}GXIK9Ni +zTYJNS4O64;kjzk^e8F7CIlJBZ6X>y_;b$1~+-X*5^3qd{$2~Y?am=lMl3w^0^_ZF{ +znrN)q;xwQ1@jQQPtKk3N6RY3gmWBYgfjy9 +z%u>-SC(-Xtr{J*mfY-C;2MgRJ_n&BAHJHeFzEA)8<7bb(S)sDzyI^!M0WgPg7fiN% +z;iSLsVU?;7DmUC7Mprii;Woy`NRFnc!Re1fABzIV98MzKt8kd$t-U!ie35M=WZ*ne +zM2=D73@uNy;|KZPXN2i#x*ehSMv=SWm?z}#jeg97;w`U9Xyv4$)s|=i4lgFv^gzGM+9>UGb +xQE>^Gst_zl41wwwZqP!WAC%7Xx^(4+t>|f78D}8QK%9X%191l84E$dh_y^c+g?9h| + +literal 0 +HcmV?d00001 + +diff --git a/feeds/luci/themes/luci-theme-freifunk-bno/htdocs/luci-static/freifunk-bno/images/header-back.gif b/feeds/luci/themes/luci-theme-freifunk-bno/htdocs/luci-static/freifunk-bno/images/header-back.gif +new file mode 100644 +index 0000000000000000000000000000000000000000..21fe02b1e9af89e64fea086b438e20e68b391927 +GIT binary patch +literal 127 +zcmZ?wbhEHbWMxQU*v!E2|NsA=KYzY?^XA5l8~@KR?A^O}&YU?-O-*@ud5MXM3>ZN1 +zCku-R!+!=HkPOHS1{R$OCp=g0wRnAY_x}WqzLd;)8LQUic&i!oocWx1+ijk>jr||{ +P#sCQoF-DIR76xkomfbH1 + +literal 0 +HcmV?d00001 + +diff --git a/feeds/luci/themes/luci-theme-freifunk-bno/htdocs/luci-static/freifunk-bno/images/header-left.gif b/feeds/luci/themes/luci-theme-freifunk-bno/htdocs/luci-static/freifunk-bno/images/header-left.gif +new file mode 100644 +index 0000000000000000000000000000000000000000..a3258ccb6d2f6809c591cdcf5694b6d9557c0feb +GIT binary patch +literal 293 +zcmZ?wbhEHbWMxQUxXQrr|Ns9#fByXb{rlIiUq65T{Qmv>=g*%%eE9JG{rh+C-o1JA +z=EaK_PoF-0`0(M~yLWHiym{lsjk9OZ{y)QT^ytweM~)mgaA51!ty{KiS+Qcp!i5Vb +zO`0@u;>7m$_J)Rr($dnBl9G&!3P#h)xJA`Jf-bU>DX{KUZKkR+M{QLX+`uh6$`T6(v_x1Jl^z`)e^YifV +z@b2#J?Ck96>FMa`=;h_*$$O;Js +L%*+7K&p`k?3O3Jl + +literal 0 +HcmV?d00001 + +diff --git a/feeds/luci/themes/luci-theme-freifunk-bno/htdocs/luci-static/freifunk-bno/images/logo.gif b/feeds/luci/themes/luci-theme-freifunk-bno/htdocs/luci-static/freifunk-bno/images/logo.gif +new file mode 100644 +index 0000000000000000000000000000000000000000..ff00d6ddb8051a28a4430977069e240b8a0a741b +GIT binary patch +literal 2415 +zcmV-#36Sb0Nep)b8~ai%d_rlGwy@6rKP3+{O{;o +zo#i!6_3zgI;A{G_5K~iA;xB`YjEw1Cb^p;I^|#de(Z98|wciw6`PS$E_}%fH#M{%b +z;wMz|i6mxbX6tIE_2r~{dwciy_xk9b{qXjgnVIKLfZr8#zP`TUCw}vmbojoV?B>ko +z=H^ODO7HLQqm4TM+Dz+OJM^s1_s8D<&l>r(Gymw4>S2}t|Nq6s#pz5!@|&RM-^Ty+ +z%lqK%%*@Q>Jd523Vy>>PT3TA~i@Dyl8TOw&goK3UL2&0tS?q9x>R3?x;?bFznc*Q< +z-QC^o;HhS2X3og8?R&87W?SiHqu?KT=1i3T)in0L%tAs!@}kH3^xFUKt^ebD|M}(T +zKuG-N@a%J}{`dO-@w@SVDgD3-@0^tGd28^LzupdJ_Lv?2{rBT4U--`A?sszg;MLp# +zXzgb;`SaQIueJ8Q*xd+g{p5!rC|J+yo5D={Dvfm4V!bm_qSW5Q2j%!C^>o^ynBcTEMi)VQ~NrsN8_0bb-KR +z7bKGUx!?z!m>KR`I7HIrTn4z3LWqE;;pm(*3-)07 +zfLH^!8E$r*x$!N?fHCewU~_>aL$#}tBA{)0L5PeeI4ErFcA(qDHwnHZNRYz{Ow{fS +zvZXeqlx(y)Bsf@r1%o@};Ji#gbJTP4Qd4&INJ(Hf)C_&9e0*mG-iiwxV%|CH?$-lz +ztr$Qf(heMn59TG{#aQr=pa48SB*DQGF`Xa~I4=+}5-Xl$uv$d!P%*$CHTf_Bfe0R0 +zpb68(gxxn#loEn#o>)){3h#(<$3-Wo@kJSEy&)nzVkohLd^Ncflq42-(uIUBlz<@r +z9x&~Ygn97Tu_HWha1cgJQ+`u|Bt$gEiBv8;FxfzM{PDyS?V&Y8mhX(QzydJ^362OU +z4G~J6(B)u59%4YJ0h=r_!A49;y#wY06cz#-5o1Et#us_!Pz0dv6!GH#ci@58J0c+2 +zmLUwJWI>)~_>dGhhv`5lu!sA +zFXov*4NxVJ1tM7xH_!wb0LDoSP<>G?v66&0h(SsY +zqyS8Kt>=y&p9Bk!59>mAYXpO2fMftrF?rDi3oP}Hxt*X3PaMRN@PnN11i&T#ix!88 +zmT4C)umid7`05F>G0Gsr9amt{8&oL;U{!2rVF6PZ9c1KA8?Ef>%^PN1IshJM8T2VM +zI-vCdObE~P&a<9m0nZGz!9=MyI*cR$3#Bv)PZ9LWu(CT1eA2+yGF)&RS|XIf0uT>D +z$3;vRm;etLA|q16s_&R^B}{5S_scSpAOW2ia=>K99DTl1Mkm9vB!d|-fjkgo%t#XN +z#xN~lfOqfsV1yxAmrl`g5Yrw!43wf5N3g+00|P>pgbXI;38o{G +zzz7`%Fj>(A-tQ2x(!2vu{Eh|-2oV!~Xbt&@Bn0P)M|Ip};l(>Tc)*SS!IHnDgaa}C +z5oyK*AUPLWP?j;aJ6rSv!9~==140@x*$iC^T*_Lcz|jUhB(56>5F9s*;=gxz!BkwB +z5f%oRwo_LJ>gBd!Yv=AVm +z8)ATo(&%!48}MOQQ2HO2ev!QwYUm<3APoS$LA;Cf?He@kgAAVX!f&t-GQz{4>n`#K +zG9*9`Mks(79(0q76sj9wh(QM~GQuk6zAhVLFfTV5!ixUDEPs5P~a$39B4N(Mg$fK0AAzV +zLKe|NfKk0;m=~GaFaJe|ZHX@jopK~R0`P!=7$+t{kf=AH;VwapAX(fXf=3790t~%F +znisi(Ou2EbYz^X8Cq?NN)(MUhpz|FwItnT6Su8_P7^f$_*V50WE%nsYDM|D?%JfYY)gu +zHzWy_`*r0GV67sZBw;5`i~vcFYykiiYYDW7m6-WU<*mBZBAjvqfCSJ%36eSxHGI>U +zZoF2JJfVjReFF%>h%7i{Hq8lYQ$-f-1PJ!S)d7+rs>HlQJuw)e3ArK)ZGQcWpZ +zbB+vf0BT1w&Gg|SaD8@08v5aOsgBH@@^DCk-4_i3;%wksb +hD?l)cN7F(Tg_SflMzDxRJOUb&ummPFG3G!306PKJT{Qpz + +literal 0 +HcmV?d00001 + +diff --git a/feeds/luci/themes/luci-theme-freifunk-bno/htdocs/luci-static/freifunk-bno/images/main-back.png b/feeds/luci/themes/luci-theme-freifunk-bno/htdocs/luci-static/freifunk-bno/images/main-back.png +new file mode 100644 +index 0000000000000000000000000000000000000000..34aca44e01c12fa9f63dcce8d5c6fa529133f7b2 +GIT binary patch +literal 404 +zcmeAS@N?(olHy`uVBq!ia0vp^j6gJjgAK^akKnouq*#ibJVQ8upoSx*1IXtr@Q5sC +zU|@R#!i;jI7N$T!$r9IylHmNblJdl&REF~Ma=pyF?Be9af>gcyqV(DCY@~q33VOOY +zhFJ7oo#US1*U2@MYIb&nx +z7j1L=e0@Pc&DB5mntZq4Js@bC&FSr-N*r-~Y8NIoEjYmfrKd +z_U%)X*5(#16DjY_@(guPnRKW$R-Q*OXZOm757+u=rXG_xAIFiH?Dg`X#N*4s47dFx +zIgcJzzxUer|Ln$^J%4Y0d1lb2aKO$)b$h#;a7e>W&pfXgvBM|I7I5XnXu`k$nvB_Im$2>s^}-3_%7@S3j3^P6OUSZOE3oj^sirQ(63eK*9x>V0d0SV +zHhIv`UTA|0Z8Srx)zE4cw3G`i{<3OkADgLbH+392uJSg{FNbCMKW>M`+>( +zG~on|*+65~&N^beqI$cUpj_yr^Y7O4HN=YLNC0wQB6(NwH9gUQsO#l(}o;MLWZ`ySm8SYW%l_ +zZnpWF3C?j>#v;4TC$}|f-@Z-Ny0cUG`zSBdLIPV+JIM6TKnX0mz|4_`AN^XxrVFw9 +z&9cVYYi)IN#BU6$Qe9+Ha?N%photgRBFz2p^BDLq4Wnr +z0gw2NG9DOmus#fPCkfjqIi)NtB!c%)_-8-;Lw&GU@8Y84XUh(G{Mk0^3;63H_2c7L +ztO9y$jjH6M*{D!e@Aq5K+c8roqSD^( +z8fGD`rHe7;bw%dDY;J|-RU}Ebv|9OC2iN>le(ewRj2ZP_8;=qsH2p|xTqP8rJ1`dG +zlF`5Ye!jS5n@Gq`_UAmLVAcNP=^tOzhAhRN%Tm;u7(V%f_x;td@>O$7psiEy{oN{H)HP<{lU*yyqbKc +zumZ7X_IRte6c#D*-~D}DZR543Yf}aHm;3{tGReb%HJKo=EeLZX_+Q?^x? +z7JEu{Z*BWxf%j^IKvi*RsMoCU*Phw>uFj6#(T5d}k4qVyc&GDezOsK6Ur{r_u{pnK +zqXAiJzcD+jeRSyAD1(1kI5vDE>yY==U5uT#Igx_xbFZD6-R;>?fkD*Fty +zz>y7I^=Xgpd&M^ohuG+F|B|%vKpb@FC>*M9&p}1YDh_-~NH-8Ft)v`m%%4BhQd=AI +zgftM~G>cg=y@dqE|6ZAJ8DBoF#IWRM^CtC025yP?o{2S*fixQM1`Ki8R*IUGCE=n_~fQECq +zEYp3}VCV03zi&4cG%f-%UPcV;$3^YS!0m<2$-@}@TtP)NQSfO2Uy_;&VvlJ1`Lt*# +znek&rP%9t64qgO8JfOd{@LE3MLZYjo!l9aUQ{zDjE7QM1;z+x=no~C2`__@q_H7=H-)Sa4zMLtpF87Y`354aC8hf~({;LO{y{*_9 +zo0imruRM|0+Vup48j +zMRMRKFfv7D=`w=f)%mEZYP$$wvcz0cN&8_8EJ3FK@uM-EqJR@z+~s0v4umNsp4l?e +zj+l;jRG2vAdg>KU{(`iDX^VtEx_!T*1^Qqs +z0D5wuSfrI5kb}E*qcci~d#TD{Hs8)Dsd`pLrReO#QgapC&e~1+3a@w(RQ{<|~( +zL7D5a%aL-}4>v7XprWU8faN>Y&17*k@Xh}fY>X?4Z<&!>fn?$h+6bYThQ@4D5>>ZR9ZWbfS@aw1pd^u)pczx=e +zAoD8_7MAYZQB>vUjm`R5i8m(&a`${DQ8t|?UoBl;hU-sGxXh(D%_=Rz3uTDtKujOq +z5QhlbCn&8lHN+J;sX&rlatc_L(8aap7ei!zb0Ny`+dV;YRP=49XKzGxkk+D3xMk0y +zEoVOe`N?@CdwXS>`$?%}UBm_5en3TT+%REAJEoD?;@rsk^m{fUq>HI_T_>fCa}=&m +zylClZ$0;L$k|AL);4L;ZE9qT2`&&|P99XLEj2d0_^~1Omf<(Nn6r``0? +z@P=2r@z#hRO{|kB*A|WYtK`*RU(0Vl=P8u_cx3I+XSQ`eO%6vfCXBPbSI+mF%G^z{ +zeu;LybJz3kY2S)3P05b)r?_5fK~NY5Qm5s3Mt>*>k0(H8(8U@_Y!+9Sw!g-^`Bk8`D-+u|IWL>tl;n*s%OIh +z37|u>>h8vaNZxz^4U3dqb6XR*dJ7S}TO3ZEkDNr1r{=`lG>k9mga+3wkS{Dhlfdp +zr|2Lt7^gpl(FO!Dqv61R=)iG-hSH>%5F)nSDDw>JEG_B+G89WDp`_1Qwb74ndzQ`n +z(uZKGCHG9zX-YM;gYI;gUSymNblq}1 +zXvB8poD@@AkLj}DZ#L}l&c);Yb1HF|Nn2xjT_v1wXBY>=g`~YQGGZ`WQKzLt8n$Ej +zr0)xq#0Cd5ziWpVZ&U9q_@Wn>n$nRpsaRD8t)75>C{4*xq308VGwhhRm=tZjSk?mR +z{c|th5-84Ek3q%81nW^S!1_Z;Op*(bL4!y1Fk4P+kRE*)NgBOJ9lMtpq8CLgv``Et +zD6rznrHK;0a3LPC=pI1^2h%OO_SdA_rF0@f({5QM{;(TE7YX?DgF!VI9FE<&8nH{b +z|6R&amdBz=06q`G7grWF{~F9UPQ*M;?yV~p`2C!X*SBZTGm=);!jm}(a<)E~2uLb2 +z4xxusRI-pBhADz%rTVDtIiy)g3U)2AyD$)ogL@8BpG&3SV??eg14$f`qic0uC)r{# +z)~zkEbvq`;{Tv3DO0NUAu@5{?-K20+879E-2oi%%W0)f!r&+p=pqdZ?RC5mOwjENz +z1}3=X0A~R)Cw~er!~98R95*wqjzr)j<5Z9di%11P%{`Jun9Y=~20|G?1Y=R!PGUJl +zmz?y%@WOIWW%>mHLCnKwB2p2T`R8sX8o=Xl@cdHi*qv ++ Copyright 2008 Jo-Philipp Wich ++ Licensed to the public under the Apache License 2.0. ++-%> ++ ++
    ++
    ++ ++ ++ ++
    ++ <% local ver = require "luci.version" -%> ++ Powered by <%= ver.luciname %> (<%= ver.luciversion %>) ++
    ++
    ++
    ++ ++ ++ ++ ++ ++ ++ +diff --git a/feeds/luci/themes/luci-theme-freifunk-bno/luasrc/view/themes/freifunk-bno/header.htm b/feeds/luci/themes/luci-theme-freifunk-bno/luasrc/view/themes/freifunk-bno/header.htm +new file mode 100644 +index 0000000..d108a08 +--- /dev/null ++++ b/feeds/luci/themes/luci-theme-freifunk-bno/luasrc/view/themes/freifunk-bno/header.htm +@@ -0,0 +1,209 @@ ++<%# ++ Copyright 2008 Steven Barth ++ Copyright 2008 Jo-Philipp Wich ++ Licensed to the public under the Apache License 2.0. ++-%> ++ ++<% ++require("luci.sys") ++require("luci.util") ++ ++local boardinfo = luci.util.ubus("system", "board") ++ ++local request = require("luci.dispatcher").context.path ++local category = request[1] ++local tree = luci.dispatcher.node() ++local cattree = category and luci.dispatcher.node(category) ++local node = luci.dispatcher.context.dispatched ++ ++local c = tree ++for i,r in ipairs(request) do ++ if c.nodes and c.nodes[r] then ++ c = c.nodes[r] ++ c._menu_selected = true ++ end ++end ++ ++require("luci.http").prepare_content("text/html") ++ ++-%> ++ ++ ++ ++ ++ ++ ++ <% if node and node.css then %><% end %> ++ <% if css then %> ++ <% end -%> ++ ++ ++ ++ ++ <%=striptags( (boardinfo.hostname or "?") .. ( (node and node.title) and ' - ' .. translate(node.title) or '')) %> - LuCI ++ ++ ++ ++ ++
    ++
    ++ ++
    ++<%- if luci.sys.user.getuser("root") and not luci.sys.user.getpasswd("root") then -%> ++
    ++ <%:No password set!%>
    ++ <%:There is no password set on this router. Please configure a root password to protect the web interface and enable SSH.%> ++
    ++<%- end -%> ++
    ++ ++ ++ ++ ++
    ++<%:Path%>: <% ++local c = tree ++local url = controller ++for k,v in pairs(request) do ++ if c.nodes and c.nodes[v] then ++ c = c.nodes[v] ++ url = url .. "/" .. v ++ %><%=pcdata(striptags(translate(c.title) or v))%> <% if k ~= #request then %>» <% end ++ end ++end ++%> ++
    ++ ++ ++
    ++ ++
    ++ ++ <% ++ if tree.nodes[category] and tree.nodes[category].ucidata then ++ local ucic = 0 ++ ++ for i, j in pairs(require("luci.model.uci").cursor():changes()) do ++ for k, l in pairs(j) do ++ for m, n in pairs(l) do ++ ucic = ucic + 1; ++ end ++ end ++ end ++ %> ++ ++ <% end %> ++ ++
    ++
    ++ ++
    ++<% if category ~= "freifunk" and category ~= "splash" then %> ++ ++<% end %> +diff --git a/feeds/luci/themes/luci-theme-freifunk-bno/root/etc/uci-defaults/luci-theme-freifunk-bno b/feeds/luci/themes/luci-theme-freifunk-bno/root/etc/uci-defaults/luci-theme-freifunk-bno +new file mode 100755 +index 0000000..a19f2bb +--- /dev/null ++++ b/feeds/luci/themes/luci-theme-freifunk-bno/root/etc/uci-defaults/luci-theme-freifunk-bno +@@ -0,0 +1,6 @@ ++#!/bin/sh ++uci batch <<-EOF ++ set luci.themes.Freifunk_BNO=/luci-static/freifunk-bno ++ set luci.main.mediaurlbase=/luci-static/freifunk-bno ++ commit luci ++EOF +diff --git a/feeds/luci/themes/luci-theme-freifunk-generic/Makefile b/feeds/luci/themes/luci-theme-freifunk-generic/Makefile +new file mode 100644 +index 0000000..2fc62fd +--- /dev/null ++++ b/feeds/luci/themes/luci-theme-freifunk-generic/Makefile +@@ -0,0 +1,14 @@ ++# ++# Copyright (C) 2008-2014 The LuCI Team ++# ++# This is free software, licensed under the Apache License, Version 2.0 . ++# ++ ++include $(TOPDIR)/rules.mk ++ ++LUCI_TITLE:=Freifunk Generic Theme ++LUCI_DEPENDS:= ++ ++include ../../luci.mk ++ ++# call BuildPackage - OpenWrt buildroot signature +diff --git a/feeds/luci/themes/luci-theme-freifunk-generic/htdocs/luci-static/freifunk-generic/bg.jpg b/feeds/luci/themes/luci-theme-freifunk-generic/htdocs/luci-static/freifunk-generic/bg.jpg +new file mode 100644 +index 0000000000000000000000000000000000000000..822527ead873a1e8e33f55fb22df23314a8a8ddb +GIT binary patch +literal 354 +zcmb7;J8l9o5QhKRhrL)R*uwI{l4y|-#EU@U23SH`B~%m?9DuV>=SV4Xh&-CqT*BC- +zNko+yY4q!#Zyx^Le?xBD=N3eSr;zYp*nnj@%QMDu#yKm56r$4+`mWcNr5+4QZA|qr +zt*g=G-k9-XJefT<^JZ8tS4+E^+Q!Bu#5os*=nK)em8tB%!@oim$pMs-LZT>D^i=j5_0 +RhvV_b31jVEYGkPW#|2ttEi3>4 + +literal 0 +HcmV?d00001 + +diff --git a/feeds/luci/themes/luci-theme-freifunk-generic/htdocs/luci-static/freifunk-generic/cascade.css b/feeds/luci/themes/luci-theme-freifunk-generic/htdocs/luci-static/freifunk-generic/cascade.css +new file mode 100644 +index 0000000..ed97427 +--- /dev/null ++++ b/feeds/luci/themes/luci-theme-freifunk-generic/htdocs/luci-static/freifunk-generic/cascade.css +@@ -0,0 +1,1072 @@ ++@charset "utf-8"; ++ ++@media all { ++ ++html { ++ min-height: 100%; ++ height: auto; ++} ++ ++body { ++ color: #ccc; ++ background:#e5eef5 url(bg.jpg) repeat-x top left; ++ font-family: Verdana, Arial, sans-serif; ++ font-size: 100%; ++ line-height: 100%; ++ padding-bottom: 1.5em; ++} ++ ++html, body { ++ height: 99%; ++} ++ ++* { ++ margin: 0; ++ padding: 0; ++} ++ ++abbr, ++acronym { ++ font-style: normal; ++ font-variant: normal; ++} ++ ++abbr[title], ++acronym[title] { ++ border-bottom: 1px dotted; ++ cursor: help; ++} ++ ++a:link abbr[title], ++a:visited abbr[title], ++a:link acronym[title], ++a:visited acronym[title] { ++ cursor: pointer; ++} ++ ++code { ++ font-family: monospace; ++ white-space: pre; ++} ++ ++#maincontent ul { ++ margin-left: 2em; ++} ++ ++.warning { ++ color: red; ++ background-color: white; ++ font-weight: bold; ++ text-decoration: blink; ++} ++ ++.clear { ++ clear: both; ++} ++ ++a img { ++ border: 0; ++} ++ ++.skiplink, ++.navigation, ++.hidden { ++ position: absolute; ++ left: -1000px; ++ top: -1000px; ++ width: 0px; ++ height: 0px; ++ overflow: hidden; ++ display: inline; ++} ++ ++.error { ++ color: #f00; ++ background-color: white; ++} ++ ++.errorbox { ++ border: 1px solid #F00; ++ background-color: #FCC; ++ padding: 5px; ++} ++ ++ ++.ifacebox { ++ background-color: #FFFFFF; ++ border: 1px solid #CCCCCC; ++ margin: 0 10px; ++ text-align: center; ++ white-space: nowrap; ++} ++ ++.ifacebox .ifacebox-head { ++ border-bottom: 1px solid #CCCCCC; ++ padding: 2px; ++} ++ ++.ifacebox .ifacebox-body { ++ padding: 2px; ++} ++ ++ ++.ifacebadge { ++ background-color: #FFFFFF; ++ border: 1px solid #CCCCCC; ++ padding: 2px; ++ margin-left: 2px; ++ display: inline-block; ++} ++ ++.ifacebadge-active { ++ border-color: #000000; ++ font-weight: bold; ++} ++ ++ ++.zonebadge { ++ padding: 2px; ++ display: inline-block; ++ white-space: nowrap; ++ cursor: pointer; ++} ++ ++.zonebadge em, ++.zonebadge strong { ++ margin: 3px; ++ display: inline-block; ++} ++ ++.zonebadge input { ++ width: 6em; ++ height: 1.5em; ++} ++ ++.zonebadge-empty { ++ border: 1px dashed #AAAAAA; ++ color: #AAAAAA; ++ font-style: italic; ++ font-size: smaller; ++} ++ ++ ++#header { ++ height: auto; ++ background: #FFF url(header.jpg) repeat-x left bottom; ++ color: #ccc; ++ font-weight: bold; ++ text-align:right; ++} ++ ++.header_left img { ++ padding: 10px 10px 0px 10px; ++ margin-bottom: 10px; ++} ++ ++.header_banner { ++ overflow:hidden; ++ padding-bottom: 6px; ++ text-align:left; ++} ++ ++.header_banner img{ ++ padding: 0px; ++} ++ ++.header_left{ ++ text-align:left; ++ max-width: 50%; ++ float:left; ++} ++ ++.header_left a{ ++ color: #dc0067; ++ font: bold 36px Helvetica; ++ text-decoration: none; ++} ++ ++#header h1, ++.header_right { ++ max-width: 45%; ++ text-align: right; ++ font-size: 70%; ++ font-weight: normal; ++ line-height: 160%; ++ float:right; ++ padding: 10px 10px 0 0; ++} ++ ++ul.dropdowns { ++ float: left; ++ margin: 0; ++ padding: 0; ++ width: auto; ++ list-style: none; ++} ++ ++html>body ul.dropdowns { ++ position: relative; ++} ++ ++ul.dropdowns li, ++ul.dropdowns ul { ++ margin: 0; ++ padding: 0; ++ list-style: none; ++} ++ ++ul.dropdowns li { ++ float: left; ++ position: relative; ++ white-space: nowrap; ++} ++ ++ul.dropdowns li ul { ++ position: absolute; ++ z-index: 1000; ++ top: auto; ++ min-width: 10em; ++} ++ ++ul.dropdowns li li { ++ float: none; ++ position: relative; ++} ++ ++ul.dropdowns li a { ++ display: block; ++} ++ ++ul.dropdowns ul li ul { ++ top: 0; ++} ++ ++ul.dropdowns li ul, ++ul.dropdowns li.over ul ul, ++ul.dropdowns li.focus ul ul, ++ul.dropdowns li:hover ul ul, ++ul.dropdowns li.over ul ul ul, ++ul.dropdowns li.focus ul ul ul, ++ul.dropdowns li:hover ul ul ul, ++ul.dropdowns li.over ul ul ul ul, ++ul.dropdowns li.focus ul ul ul ul, ++ul.dropdowns li:hover ul ul ul ul { ++ left: -3000px; ++} ++ ++ul.dropdowns li.over ul, ++ul.dropdowns li.focus ul, ++ul.dropdowns li:hover ul { ++ left: 0; ++} ++ ++ul.dropdowns ul li.over ul, ++ul.dropdowns ul li.focus ul, ++ul.dropdowns ul li:hover ul, ++ul.dropdowns ul ul li.over ul, ++ul.dropdowns ul ul li.focus ul, ++ul.dropdowns ul ul li:hover ul, ++ul.dropdowns ul ul ul li.over ul, ++ul.dropdowns ul ul ul li.focus ul, ++ul.dropdowns ul ul ul li:hover ul { ++ left: 100%; ++} ++ ++#xhr_poll_status { ++ cursor: pointer; ++} ++ ++#xhr_poll_status #xhr_poll_status_off { ++ font-weight: bold; ++ color: #FF0000; ++} ++ ++#xhr_poll_status #xhr_poll_status_on { ++ font-weight: bold; ++ color: #00FF00; ++} ++ ++#menubar { ++ position: relative; ++ width: 100%; ++ background: #FFF; ++ color: #004a9c; ++ border-bottom: 1px dotted #5A5A5A; ++} ++#menubar .warning { ++ color: red; ++ background-color: #FFF; ++} ++ ++#menubar ul.dropdowns { ++ min-height: 1.8em; ++ background: #FFF; ++ color: #004a9c; ++} ++ ++#menubar ul.dropdowns li ul { ++ background: #FFF; ++ color: #004a9c; ++ border-width: 0 1px 1px 1px; ++ border-style: dotted; ++ border-color: #5a5a5a; ++} ++ ++#menubar ul.dropdowns ul li ul { ++ border-width: 1px; ++} ++ ++html #menubar a:link, ++html #menubar a:visited { ++ position: relative; ++ display: block; ++ padding: 0.5em; ++ background: #FFF; ++ color: #004a9c; ++ text-decoration: none; ++ font-size: 80%; ++ font-weight: normal; ++} ++ ++html #menubar a:link:hover, ++html #menubar a:visited:hover, ++html #menubar a:link:active, ++html #menubar a:visited:active, ++#menubar a:link:focus, ++#menubar a:visited:focus { ++ background: #F2F2F2; ++ color: #e60076; ++} ++ ++html #menubar a:link.active, ++html #menubar a:visited.active, ++html #menubar a:link.preactive, ++html #menubar a:visited.preactive { ++ background: #FFF; ++ color: #e60076; ++} ++ ++html #menubar a:link.warning, ++html #menubar a:visited.warning { ++ background: #FFF; ++ color: red; ++ font-weight: bold; ++ text-decoration: blink; ++} ++ ++#menubar ul.dropdowns li.over>a, ++#menubar ul.dropdowns li.focus>a, ++#menubar ul.dropdowns li:hover>a { ++} ++ ++.lang_de #submenu_mini_system { min-width: 13.3em; } ++* html .lang_de #submenu_mini_system { width: 13.3em; } ++ ++.lang_pt-br #submenu_mini_network { min-width: 14em; } ++* html .lang_pt-br #submenu_mini_network { width: 14em; } ++ ++.lang_pt-br #submenu_mini_system { min-width: 11.5em; } ++* html .lang_pt-br #submenu_mini_system { width: 11.5em; } ++ ++.lang_ru #submenu_mini_system { min-width: 18em; } ++* html .lang_ru #submenu_mini_system { width: 18em; } ++ ++.lang_pt-br #submenu_admin_index { min-width: 11em; } ++* html .lang_pt-br #submenu_admin_index { width: 11em; } ++ ++.lang_ru #submenu_admin_index { min-width: 15.5em; } ++* html .lang_ru #submenu_admin_index { width: 15.5em; } ++ ++.lang_ru #submenu_admin_status { min-width: 10.5em; } ++* html .lang_ru #submenu_admin_status { width: 10.5em; } ++ ++.lang_de #submenu_admin_system { min-width: 13.3em; } ++* html .lang_de #submenu_admin_system { width: 13.3em; } ++ ++.lang_fr #submenu_admin_system { min-width: 14.5em; } ++* html .lang_fr #submenu_admin_system { width: 14.5em; } ++ ++.lang_pt-br #submenu_admin_system { min-width: 11.5em; } ++* html .lang_pt-br #submenu_admin_system { width: 11.5em; } ++ ++.lang_ru #submenu_admin_system { min-width: 18em; } ++* html .lang_ru #submenu_admin_system { width: 18em; } ++ ++#submenu_admin_services_chillispot { min-width: 15.5em; } ++* html #submenu_admin_services_chillispot { width: 15.5em; } ++ ++#submenu_admin_services_coovachilli { min-width: 15em; } ++* html #submenu_admin_services_coovachilli { width: 15em; } ++ ++.lang_ru #submenu_admin_network_routes { min-width: 15.3em; } ++* html .lang_ru #submenu_admin_network_routes { width: 15.3em; } ++ ++#submenu_admin_network_firewall { min-width: 14em; } ++* html #submenu_admin_network_firewall { width: 14em; } ++ ++.lang_de #submenu_admin_network_firewall { min-width: 16.5em; } ++* html .lang_de #submenu_admin_network_firewall { width: 16.5em; } ++ ++.lang_pt-br #submenu_admin_network_firewall { min-width: 15em; } ++* html .lang_pt-br #submenu_admin_network_firewall { width: 15em; } ++ ++#modemenu { ++/* width: auto;*/ ++ background: #000; ++ color: #fff; ++ list-style: none; ++ margin-right: 1px; ++} ++ ++#modemenu li { ++ float: right; ++ list-style: none; ++} ++ ++#savemenu { ++ float: right; ++ margin-right: 2em; ++} ++ ++.lang_de #submenu_admin_uci { ++ width: 12em; ++} ++ ++.lang_ru #submenu_admin_uci { ++ width: 11.5em; ++} ++ ++textarea#syslog { ++ width: 98%; ++ min-height: 500px; ++ border: 3px solid #ccc; ++ padding: 5px; ++ font-family: monospace; ++} ++ ++ ++#maincontent { ++ clear: both; ++ width: 90%; ++ margin: 0 auto; ++ padding: 0.5em; ++ color: #000; ++ font-size: 80%; ++} ++ ++#maincontent h2 { ++ font:normal bold 150% "Trebuchet MS", Verdana, sans-serif; ++ margin: 0.25em 0 0.7em 0; ++ border-bottom: 1px solid; ++ padding: 10px 0 4px 0; ++ color: #404040; ++} ++ ++#maincontent h3 { ++ margin: 0.5em 0 1.1em 0; ++ font:italic bold 125% "Trebuchet MS", Verdana, sans-serif; ++ color: #404040; ++} ++ ++#maincontent p { ++ margin-bottom: 1em; ++} ++ ++.cbi-section { ++ margin-bottom: 0.5em; ++ padding: 0.5em 1em; ++ border: 1px dotted #555; ++ background-color: #fff; ++ color: #000; ++} ++ ++.cbi-section legend { ++ font-size: 110%; ++ font-weight: bold; ++ height: 1em; ++ padding: 0.5em 0.25em; ++ background-color: transparent; ++ color: #404040 ; ++} ++ ++.cbi-section h2 { ++ margin: 0em 0 0.5em -0.5em !important; ++} ++ ++.cbi-section h3 { ++ text-decoration: none !important; ++ font-weight: bold !important; ++ color: #555 !important; ++ margin: 0.25em !important; ++ font-size: 100% !important; ++} ++ ++.cbi-section-descr { ++ margin-bottom: 0.5em; ++ font-size: 95%; ++} ++ ++.cbi-title-ref { ++ color: inherit; ++ text-decoration: none; ++ padding-right: 18px; ++ background: url('../resources/cbi/link.gif') no-repeat scroll right center; ++ background-color: inherit; ++} ++ ++ul.cbi-apply { ++ font-size: 90%; ++} ++ ++ul.cbi-tabmenu { ++ padding: 3px 0; ++ margin-left: 0 !important; ++ margin-bottom: -1px; ++ list-style-type: none; ++} ++ ++ul.cbi-tabmenu li.cbi-tab, ++ul.cbi-tabmenu li.cbi-tab-disabled { ++ display: inline; ++ margin: 0; ++} ++ ++ul.cbi-tabmenu li.cbi-tab a, ++ul.cbi-tabmenu li.cbi-tab-disabled a { ++ text-decoration: none; ++ padding: 3px 7px; ++ margin-right: 3px; ++ border: 1px dotted #bbb; ++ border-bottom: none; ++ background-color: #eee; ++ color: #bbb; ++} ++ ++ul.cbi-tabmenu li.cbi-tab-highlighted a { ++ color: #000; ++ background-color: #FFEEAA; ++} ++ ++ul.cbi-tabmenu li a:hover { ++ color: #000; ++} ++ ++ul.cbi-tabmenu li.cbi-tab a { ++ position: relative; ++ top: 1px; ++ padding-top: 4px; ++ color: #000; ++ background-color: #fff; ++} ++ ++div.cbi-tab-descr { ++ background-image: url(/luci-static/resources/cbi/help.gif); ++ background-position: 0.25em 50%; ++ background-repeat: no-repeat; ++ border-bottom: 1px solid #ccc; ++ margin: 0.25em 0.25em 2em; ++ padding: 0.5em 0.5em 0.5em 2em; ++} ++ ++input[type=submit], ++input[type=reset], ++input[type=image], ++input[type=button] { ++ cursor: pointer; ++} ++ ++select, ++input, ++textarea { ++ background: #fff; ++ color: #000; ++ border: 1px solid #cccccc; ++} ++ ++input[type=image] { ++ border: none; ++} ++ ++input:focus, ++input:hover, ++select:focus, ++select:hover, ++textarea:focus, ++textarea:hover { ++ background-color: #fff; ++ color: #000; ++} ++ ++select, ++input[type=text], ++input[type=password] { ++ width: 20em; ++} ++ ++td select, ++td input[type=text], ++td input[type=password] { ++ width: 99%; ++} ++ ++img.cbi-image-button { ++ cursor: pointer; ++ margin: 0 2px; ++ vertical-align: middle; ++} ++ ++input.cbi-input-user { ++ background: url('../resources/cbi/user.gif') no-repeat scroll 1px center; ++ background-color: inherit; ++ color: #000; ++ text-indent: 17px; ++} ++ ++input.cbi-input-password { ++ background: url('../resources/cbi/key.gif') no-repeat scroll 1px center; ++ background-color: inherit; ++ color: #000; ++ text-indent: 17px; ++} ++ ++input.cbi-input-find, ++input.cbi-button-find { ++ background: url('../resources/cbi/find.gif') no-repeat scroll 1px center; ++ background-color: inherit; ++ color: #000; ++ padding-left: 17px; ++ border: none; ++} ++ ++input.cbi-input-reload { ++ background: url('../resources/cbi/reload.gif') no-repeat scroll 1px center; ++ background-color: inherit; ++ color: #000; ++ padding-left: 17px; ++} ++ ++input.cbi-button{ ++ margin-top: 1.3em; ++} ++ ++input.cbi-input-add, ++input.cbi-button-add { ++ background: url('../resources/cbi/add.gif') no-repeat scroll 1px center; ++ background-color: inherit; ++ color: #000; ++ padding: 0 1px 0 17px; ++ border: 1px solid #FFF; ++} ++ ++input.cbi-input-fieldadd, ++input.cbi-button-fieldadd { ++ background: url(../resources/cbi/fieldadd.gif) no-repeat scroll 1px center; ++ background-color: inherit; ++ color: #000; ++ padding: 0 1px 0 17px; ++} ++ ++input.cbi-input-reset, ++input.cbi-button-reset { ++ background: url('../resources/cbi/reset.gif') no-repeat scroll 1px center; ++ background-color: inherit; ++ color: #000; ++ padding: 0 1px 0 17px; ++} ++ ++ ++} ++ ++input.cbi-input-save, ++input.cbi-button-save { ++ background: url('../resources/cbi/save.gif') no-repeat scroll 1px center; ++ background-color: inherit; ++ color: #000; ++ padding: 0 1px 0 17px; ++} ++ ++input.cbi-input-apply, ++input.cbi-button-apply { ++ background: url('../resources/cbi/apply.gif') no-repeat scroll 1px center; ++ background-color: inherit; ++ color: #000; ++ padding: 0 1px 0 17px; ++} ++ ++input.cbi-input-link, ++input.cbi-button-link { ++ background: url('../resources/cbi/link.gif') no-repeat scroll 1px center; ++ background-color: inherit; ++ color: #000; ++ padding: 0 1px 0 17px; ++ border: none; ++} ++ ++input.cbi-input-download, ++input.cbi-button-download { ++ background: url('../resources/cbi/download.gif') no-repeat scroll 1px center; ++ background-color: inherit; ++ color: #000; ++ padding: 0 1px 0 17px; ++ border: none; ++} ++ ++input.cbi-input-remove, ++div.cbi-section-remove input { ++ background: url('../resources/cbi/remove.gif') no-repeat scroll 1px center; ++ background-color: inherit; ++ color: #000; ++ padding: 0 1px 0 17px; ++ border: 1px solid #fff; ++} ++ ++input.cbi-button-up { ++ background-image: url('../resources/cbi/up.gif'); ++ padding: 0 1px 0 11px; ++} ++ ++input.cbi-button-down { ++ background-image: url('../resources/cbi/down.gif'); ++ padding: 0 1px 0 11px; ++} ++ ++input.cbi-button-edit { ++ background: url('../resources/cbi/edit.gif') no-repeat scroll 1px center; ++ color: #000000; ++ padding: 0 1px 0 17px; ++} ++ ++input.cbi-button-reload { ++ background: url('../resources/cbi/reload.gif') no-repeat scroll 1px center; ++ color: #000000; ++ padding: 0 1px 0 17px; ++} ++ ++input.cbi-button-remove { ++ background: url('../resources/cbi/remove.gif') no-repeat scroll 1px center; ++ color: #000000; ++ padding: 0 1px 0 17px; ++} ++ ++.cbi-input-invalid { ++ background-image: url('../resources/cbi/reset.gif'); ++ background-repeat: no-repeat; ++ background-position: right; ++ color: #FF0000 !important; ++ border-color: #FF0000; ++} ++ ++div.cbi-section-remove input { ++ border-bottom: none; ++} ++ ++textarea { ++ margin-left: -1px; ++ margin-bottom: 0.5em; ++} ++ ++form > div > input[type=submit], ++form > div > input[type=reset] { ++ float: right; ++ margin-left: 0.5em; ++} ++ ++table td, ++table th { ++ color: #000; ++} ++ ++table.smalltext { ++ background: #f5f5f5; ++ color: #000; ++ border: 1px solid #666; ++ font-size: 90%; ++ width: 80%; ++ margin-left: auto; ++ margin-right: auto; ++ border-collapse: collapse; ++} ++ ++table.smalltext tr:hover td { ++ background-color: #bbddee; ++ color: #000; ++} ++ ++table.smalltext tr th { ++ padding: 0 0.25em; ++ border-left: 1px dotted #666; ++ text-align: left; ++} ++ ++table.smalltext tr td { ++ padding: 0.2em; ++ border-top: 1px dotted #666; ++ border-left: 1px dotted #666; ++} ++ ++table.cbi-section-table .cbi-rowstyle-1 { ++ background-color: #f1f6fa; ++ color: #000; ++} ++ ++table.cbi-section-table .cbi-rowstyle-1:hover, ++table.cbi-section-table .cbi-rowstyle-2:hover { ++ background-color: #b2c8d4; ++ color: #000000; ++} ++ ++table.cbi-section-table .cbi-section-table-cell { ++ padding: 3px; ++ white-space: nowrap; ++} ++ ++.cbi-section .cbi-rowstyle-1 h3 { ++ background-color: #f1f6fa; ++ color: #555; ++} ++ ++.cbi-rowstyle-2 { ++ color: #000; ++} ++ ++div.cbi-value { ++ clear: left; ++ vertical-align: middle; ++ padding-left: 0.25em; ++ border-bottom: 1px dotted #bbb; ++} ++ ++div.cbi-value:hover { ++ background: #f8f8f8; ++ color: #000; ++} ++ ++.cbi-value-title { ++ float: left; ++ width: 40%; ++ line-height: 1.8em; ++} ++ ++div.cbi-value-field { ++ width: 58%; ++ margin-left: 40%; ++ padding: 0.25em 0; ++} ++ ++div.cbi-value-description { ++ font-size: 90%; ++ display: inline; ++} ++ ++div.cbi-section-create { ++ clear: left; ++ white-space: nowrap; ++ vertical-align: top; ++} ++ ++div.cbi-tblsection-create { ++ border-bottom: 1px dotted #bbb; ++} ++ ++div.cbi-section-create .cbi-button { ++ margin: 0.25em; ++} ++ ++input.cbi-section-create-name { ++ margin-right: -0.25em; ++ border: 1px solid #999; ++} ++ ++div.cbi-map-descr { ++ margin-bottom: 1em; ++} ++ ++div.cbi-optionals { ++ padding: 0.25em; ++ border-bottom: 1px dotted #bbb; ++} ++ ++div.cbi-section-remove { ++ float: right; ++} ++ ++.cbi-section-node { ++ clear: both; ++ border: 1px dotted #bbb; ++ border-bottom: none; ++ padding-bottom: 0; ++} ++ ++.cbi-section-node table div { ++ padding-bottom: 0; ++ border-bottom: none; ++} ++ ++.cbi-section-node div.cbi-section-table-row { ++ margin: 0.25em; ++} ++ ++table.cbi-section-table { ++ width: 100%; ++ font-size: 95%; ++} ++ ++table.cbi-section-table th, ++table.cbi-section-table td { ++ text-align: center; ++} ++ ++tr.cbi-section-table-descr th { ++ font-weight: bold; ++ font-size: 90%; ++} ++ ++td.cbi-section-table-optionals { ++ text-align: left !important; ++ padding-top: 1em; ++} ++ ++.cbi-value-helpicon img { ++ vertical-align: bottom; ++} ++ ++div.cbi-error { ++ font-size: 95%; ++ font-weight: bold; ++ color: #f00; ++ background-color: #fff; ++} ++ ++td.cbi-value-error { ++ border-color: red; ++} ++ ++.cbi-value-error input, ++.cbi-value-error select { ++ color: red; ++ background-color: #fcc; ++} ++ ++.cbi-section-error { ++ color: red; ++ background-color: white; ++ font-size: 95%; ++ border: 1px dotted red; ++ margin: 3px; ++ padding: 3px; ++} ++ ++.left { ++ text-align: left !important; ++} ++ ++.right { ++ text-align: right !important; ++} ++ ++.footer, .push { ++ height: 2em; ++} ++ ++.footer { ++ width: 99%; ++ padding: 0.3em; ++} ++ ++ ++.wrapper { ++ min-height: 100%; ++ height: auto !important; ++ height: 100%; ++ margin: 0 auto -2em; ++} ++ ++.luci a:link, ++.luci a:visited, ++.exectime { ++ color: #666; ++ text-decoration: none; ++ font-size: 70%; ++} ++ ++.inline { ++ display: inline; ++} ++ ++.error500 { ++ white-space: normal; ++ border: 1px dotted #f00; ++ background-color: #fff; ++ color: #000; ++ padding: 0.5em; ++} ++ ++.uci-change-list { ++ font-family: monospace; ++} ++ ++.uci-change-list ins, ++.uci-change-legend-label ins { ++ text-decoration: none; ++ border: 1px solid #00FF00; ++ background-color: #CCFFCC; ++ display: block; ++ padding: 2px; ++} ++ ++.uci-change-list del, ++.uci-change-legend-label del { ++ text-decoration: none; ++ border: 1px solid #FF0000; ++ background-color: #FFCCCC; ++ display: block; ++ font-style: normal; ++ padding: 2px; ++} ++ ++.uci-change-list var, ++.uci-change-legend-label var { ++ text-decoration: none; ++ border: 1px solid #CCCCCC; ++ background-color: #EEEEEE; ++ display: block; ++ font-style: normal; ++ padding: 2px; ++} ++ ++.uci-change-list var ins, ++.uci-change-list var del { ++ /*display: inline;*/ ++ border: none; ++ white-space: pre; ++ font-style: normal; ++ padding: 0px; ++} ++ ++.uci-change-legend { ++ padding: 5px; ++} ++ ++.uci-change-legend-label { ++ width: 150px; ++ float: left; ++ font-size: 80%; ++} ++ ++.uci-change-legend-label>ins, ++.uci-change-legend-label>del, ++.uci-change-legend-label>var { ++ float: left; ++ margin-right: 4px; ++ width: 10px; ++ height: 10px; ++ display: block; ++} ++ ++.uci-change-legend-label var ins, ++.uci-change-legend-label var del { ++ line-height: 6px; ++ border: none; ++} ++ ++} +diff --git a/feeds/luci/themes/luci-theme-freifunk-generic/htdocs/luci-static/freifunk-generic/header.jpg b/feeds/luci/themes/luci-theme-freifunk-generic/htdocs/luci-static/freifunk-generic/header.jpg +new file mode 100644 +index 0000000000000000000000000000000000000000..2fde5a21254674636804e41c7e655640ed869184 +GIT binary patch +literal 316 +zcmex=C;D_qT>vO401iL^37`N%C;<>kaNP@F1^@^Nfj7PV +zFGxV7gha#yz#FS7HGq(S5J*BuLJB0J_}Ap7L_`cAfr4l_#FXK*o}_fJJ2qjQ;u0#h +z;qMA>y)4pCPWiyaEvaf?==G-l%g8?p0ssN=KSBPBoA@LkAOY!(^#K$>03^H-hlG@f +z1o%G`fEx}dF^3oljWXQEGwfX1jl_iP{jypr9JMWN6*DiOnZ4VVe>1)J$&aF4nb6Wxe1 +z-*l#RR$O)%>M1%*8+%oH>mY4DiYXpShO4}}nzi!|&fID56D$_pVxn;3j(0RMzY-Z5 +ze0@RCSi*`H@3WyAf&+Jgb9enUysU!)-mp22N%RV>9Uw>R5$4@f7WlTQ=&~BH$%TwE +zTQgywQuw|lCkf_uhz1snXu2>jr9%0ujTz!#V6S3rO$7Z^g|gV@+|r_ECU3u8-1^@p +z_=m*e)jrBp@cad@^-|$Ziwml}a=pr#qq4XhS%k8OFnKo0;FTLvgEdTMfNN`Kk`o`)(&PB~~ +zqubRl^IK)#+Ft$4!k6K7Da{{(LQGQ8?l=yGFl^B*RffO2(Ot;$gubKb^R2o>3TMI0POkNbO}gb*t6%?Flxn_n8VNQy|?I +z0MyreL`t~sV2QVN=8F8qZM3K+E846-pkL`9zD5q*6%zf_gVDZEQU$pE;F;2Gs(qf- +zRv`@!HO6uKjzL175QoP6M*E!OFKy%8LHc?hC7)jdS|NE+*>5j-n`5-Bo)>>TmhHJ? +zn9sQ2Yj)d6uZ>9%pv*hZ9vU>U6D6vlJTGv9o>AhWRje;*o*QU~qTWN_;RKQPHfwWf +z<*r#TtDH?*DUnjK(_ucgKC?n^sy^mZ1qbad4{>c1eQLyTS5>&tK1N_xqvX#B@N8?P +zTMf_iT(U2N=1?cH&O@*Hij}tSY=P$8-270CfH`dFh~q@lpzx7PU=gc`5^bmQiH7-X +zdLW0!zY~JYK+N35Y4fRs=^e$<1kD-)UgB0Y#U-#cI~)9r6*R|7L2?Qc)HED0+eqX6 +zA-PQn0=XSyqpEr(pICT*uWW_;i7&6^U;E}Ihdq~rXpGZQpU +zdrFDC@+2#0{!97xxc3@ue$gxUfM(-zoK$i~MHBV-%~mTzc(bK7u|6s;l^L(c`guN) +z3yO$!DV^vOPkDL*nSC8zMtRSWxX`y%-yAh+QwU9)tYqeYX+H`ewNDIX=!16!H=NzEjC;~M!wz-QvXxTDs8>%rn{&Ay*d$c +zE-T@?my&2F1HtUDzTukDqcq%oFRJlQEmWY0kGvQSOs6i)U6sy|o=v-1KA4Bct5(A2 +zuD&Jl8T`h4Mb`5S(Dlm&y&)RWI8otq`vn9m6`2xvZ)a$^S_&nQqv3?RO|r=?0k`<= +z($4sn3Dsz4)nDwrerJ>O*qu^zI2>q@DME3#JV3zNMT}2*{xy}y)T@AiTh#LZ>P(b3Et;ovJJH;1FRrKRP2W=rq^EgwGqV9FAur<;m@-x +zNx{iOjAG0{Q3g8&dwI|+Gsdy;umb_HcM7LX?@KDYV7e^B%9i{krSc_ZQyIaID`NRN +z%|3p?9BYC=7U=o6&$*XNWzaei`fP{W%)>hvk8RDXs948HwQQ+$9tabaDzGcw2|dWX +z7sGkq`5P3Y+*T6N)ZHtfkl8uX{L52f7rMfKdjP-5wHcFs4S=)-k!j)=;^&sAuL0pr +zGRX0azKeFpAy99^nc*p8~C5x86ZZ!YBwBUKDB^jy53iGf~ +zzytmqe#_~DjPh-9HI8g`K{&N+bg7EI+C^=(qN!^AJ-F#xzLN652eVWVQ7=#jwXqEH +z2v*C|JF;OJ5HqtF%utS39K*c9v<|tLILY`ZD88s623F>IrKqS!)cEuSf3E5Q`@T;N +z*XyUW9hSG1$~hWyi(+c)TkV2~5SUw2Ld|*Rr-{~8ebI0OVFd+qE*B;A^eKvY5B>XG +zv*AY|RXFMyqpV!-pDcj}DJs{Yy8&)`j@#|2u+)j+#>V=XC->Ibq1gPVVsS7MZk^~} +z`;y=T<)(uv&c4}hdm(WZ{7>T8rzPG@k2}74LwoFtXzo72fc1rzyOX5bJ};ge3E$eXkpx<+<%I<5 +zzlwTZ+~;EPLVeUKI>-mhTpQx-tX??d*kUn>yAvHls@wxW8E$62}i3Fcv)8La0Wxl!*(8B=*Zu6 +z38i2W*_823o30T5$~+^j^3;wvfv9ys`+$3swGslUkqZ@Ow|6=u-8YRf^&qP-#0<<- +z039j0fonW*URFUHS7WGt3IEY8?E9+Emmu{G3CD_TeAWBHgS^LE6e;auVQbz%9X`jGp +zm4d5EGDG0yC?|_O(T2gIBHN!o@d1ce*2eu88mMjO!5)3t#Gd`Fk!_gu=m>CMUiKRB +zG~2qc3}&Q7kj)pjJE`mIgO3HXXb3vG@;tz;Sp_^zH!+aVwzUb0Y2lu~0=I^I8w;+v +z27I#$!C9(a0|b@ME>lgW&=MCGfAW;_K6~mxhFTx+kR#^w}Wjz(0V#xVwZ+EIBb&@xyK;5!M +z=@zMvLsZMvnFvtLV(Ovr;0K58Vc)z}2VY|9Gd?rMrN&<_;wiA&cYo&BKQHyb&m{73 +zQ7|w^`br&BkSTkQ0@XoM*sO#S$70PqgAiQc2e#aC1`pi0wU{(pFqJ|bM^y0I&y)6I +zi9)6kCTMUxPTjBg=SQGU&XTVmPc?`7T>vl%8%j__-+DyOahTCRx{_PaV&Tf8lUL@i +zZp7G#&aW+QV^Q4^LPfV;z_45}Le=@n$%EDO~w@$Y|EFk4IpQ +zt=TrZ;}uixj+wd#cm70?*L$redayGw)?`*@Zv-iEPKP^llcBtAuC2s&x4R(VMNa7+ +z>z<>M%ZXcu`d_Wx4zKQdjZH4M_DF-uB>y+#c45rq71A=L*gN!uRs6%ca@xr{)NXPy +zrEhR_jGe`^ibamv*tXE!Tj;F;9rgHceUV8Jqp@gpm*xhe$wWe8A&0#12>4u^lU%L^ +z`YZj&STm3#sFBy=CC;#0Wg{ziFbf5Y+0s7pagzwWo>YP#P@dfFJqTe}7|Z(p#e}L8Pv+HZhy3N_c+cWB|0BQ{ +zHfdMfd8Pd8J=l`vnD)@7T`V<>{7~GFf-dFM8vdGYhBacOE +zGW4OA9Z!{IFU-)>&iCii-P{M|Nb$AOE2ez~8EGF-ucfDjng5Hl#Qeq-O9)SNE;fu1BKg>0gy +zPPxEyN>|xZHw}?}no^{r{*}|WzOJ49)u<_bz1aF+J@B;6%LiSW&b?yGjy-am?}6OE2K+q#H7K}3c~JjR +zKD=l>q~^QSZr<9G?@=nHjCcXXK<380zV5h~H`nirO;pLRPhG%w|*ObHush~G^D=Vp4_yp1w7U3<^} +zftD^f++hdXzaiVW0g0AZeoEZFf(sd$-S286W^;F{&NTqe8 +zJI`Z<3>Hq|+3$wLis)0Pp7M&xXL~|6M#>KyaxR*_w93>eR!0O(2mw!r2C7!MSrMNu +zS$rPd4vx5VDld^RYTdGD7Ya!;J+=wQyJeM-Iq^#*l$v;XG-&S6X80z_gnvx8u!j}> +zf>C{b$6v8H>J^< +zCpY8vq`b5Fz2>GiT2R>+9?jY-f?#MmOKm@9`fQ?P^Z;{QOpOuw$hKb&{rUg?$LPHN`5&dNoc;g+ + +literal 0 +HcmV?d00001 + +diff --git a/feeds/luci/themes/luci-theme-freifunk-generic/htdocs/luci-static/freifunk-generic/mobile.css b/feeds/luci/themes/luci-theme-freifunk-generic/htdocs/luci-static/freifunk-generic/mobile.css +new file mode 100644 +index 0000000..37d77b4 +--- /dev/null ++++ b/feeds/luci/themes/luci-theme-freifunk-generic/htdocs/luci-static/freifunk-generic/mobile.css +@@ -0,0 +1,59 @@ ++#header{ ++ padding-left:0px !important; ++ padding-bottom:24px; ++} ++ ++.header_left{ ++ max-width: 100%; ++} ++ ++#mainlogo { ++ max-width: 90%; ++} ++ ++#content { ++ margin-left:0px !important; ++} ++ ++#maincontent{ ++ font-size:1.2em; ++ line-height:1.5em; ++} ++ ++input[type=submit], ++.cbi-button, ++.cbi-button-reset, ++.cbi-button-save{ ++ display:inline !important; ++ float:none !important; ++ padding:10px 30px !important; ++ margin: 10px 10px 10px 0 !important; ++} ++ ++.cbi-input-text, ++.cbi-input-select, ++.cbi-input-user, ++.cbi-input-password{ ++ display:block !important; ++ margin: 0 !important; ++ padding:0 !important; ++} ++ ++.cbi-value-field{ ++ margin:0 !important; ++ margin-bottom: 1em !important; ++ width:100% !important; ++} ++ ++.cbi-section legend{ ++ white-space:normal !important; ++} ++ ++.cbi-value-title{ ++ font-weight:bold; ++ float:none !important; ++} ++ ++img { ++ max-width:100%; ++} +diff --git a/feeds/luci/themes/luci-theme-freifunk-generic/htdocs/luci-static/freifunk-generic/smallscreen.css b/feeds/luci/themes/luci-theme-freifunk-generic/htdocs/luci-static/freifunk-generic/smallscreen.css +new file mode 100644 +index 0000000..660cd8d +--- /dev/null ++++ b/feeds/luci/themes/luci-theme-freifunk-generic/htdocs/luci-static/freifunk-generic/smallscreen.css +@@ -0,0 +1,3 @@ ++.header_right { ++ display:none; ++} +diff --git a/feeds/luci/themes/luci-theme-freifunk-generic/luasrc/view/themes/freifunk-generic/footer.htm b/feeds/luci/themes/luci-theme-freifunk-generic/luasrc/view/themes/freifunk-generic/footer.htm +new file mode 100644 +index 0000000..540df71 +--- /dev/null ++++ b/feeds/luci/themes/luci-theme-freifunk-generic/luasrc/view/themes/freifunk-generic/footer.htm +@@ -0,0 +1,30 @@ ++<%# ++ Copyright 2008 Steven Barth ++ Copyright 2008 Jo-Philipp Wich ++ Licensed to the public under the Apache License 2.0. ++-%> ++ ++<% ++ local ver = require "luci.version" ++ ++ local xtime ++ if exectime then ++ xtime = (string.format("%.2fs", os.clock() - exectime)) ++ end ++%> ++ ++
    ++
    ++
    ++
    ++ ++ ++ ++ ++ ++ +diff --git a/feeds/luci/themes/luci-theme-freifunk-generic/luasrc/view/themes/freifunk-generic/header.htm b/feeds/luci/themes/luci-theme-freifunk-generic/luasrc/view/themes/freifunk-generic/header.htm +new file mode 100644 +index 0000000..20a41be +--- /dev/null ++++ b/feeds/luci/themes/luci-theme-freifunk-generic/luasrc/view/themes/freifunk-generic/header.htm +@@ -0,0 +1,223 @@ ++<%# ++ Copyright 2008 Steven Barth ++ Copyright 2008-2011 Jo-Philipp Wich ++ Licensed to the public under the Apache License 2.0. ++-%> ++ ++<% ++ local fs = require "nixio.fs" ++ local sys = require "luci.sys" ++ local util = require "luci.util" ++ local http = require "luci.http" ++ local disp = require "luci.dispatcher" ++ local version = require "luci.version" ++ ++ local sysinfo = util.ubus("system", "info") or { } ++ local loadinfo = sysinfo.load or { 0, 0, 0 } ++ local boardinfo = util.ubus("system", "board") or { } ++ ++ local request = disp.context.path ++ local category = request[1] ++ local cattree = category and disp.node(category) ++ ++ local tree = disp.node() ++ local node = disp.context.dispatched ++ ++ local categories = disp.node_childs(tree) ++ ++ local c = tree ++ local i, r ++ ++ -- tag all nodes leading to this page ++ for i, r in ipairs(request) do ++ if c.nodes and c.nodes[r] then ++ c = c.nodes[r] ++ c._menu_selected = true ++ end ++ end ++ ++ local uci = require "luci.model.uci".cursor() ++ local ff = uci:get("freifunk", "community", "name") or "" ++ local co = "profile_" .. ff ++ local community = uci:get_first(co, "community", "name") or "Freifunk" ++ local hp = uci:get_first(co, "community", "homepage") or "http://www.freifunk.net" ++ local logo = "/luci-static/freifunk-generic/logo.jpg" ++ local banner = false ++ local show_comm = true ++ ++ local file ++ for file in fs.glob("/www/luci-static/resources/custom_logo.*") do ++ logo = string.gsub(file, "/www", "") ++ break ++ end ++ ++ for file in fs.glob("/www/luci-static/resources/custom_logo_only.*") do ++ logo = string.gsub(file, "/www", "") ++ show_comm = false ++ break ++ end ++ ++ for file in fs.glob("/www/luci-static/resources/custom_header.*") do ++ logo = string.gsub(file, "/www", "") ++ show_comm = false ++ banner = true ++ end ++-%> ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++<% if node and node.css then %> ++<% end -%> ++<% if css then %> ++<% end -%> ++ ++ ++ ++<%=striptags( (boardinfo.hostname or "?") .. ( (node and node.title) and ' - ' .. translate(tostring(node.title)) or '')) %> - LuCI ++ ++ ++ ++ ++
    ++ ++ ++ ++<%- if luci.sys.process.info("uid") == 0 and luci.sys.user.getuser("root") and not luci.sys.user.getpasswd("root") then -%> ++
    ++ <%:No password set!%>
    ++ <%:There is no password set on this router. Please configure a root password to protect the web interface and enable SSH.%> ++
    ++<%- end -%> ++ ++ ++ ++ ++ ++<%- ++ local function submenu(prefix, node) ++ local childs = disp.node_childs(node) ++ if #childs > 0 then ++%> ++ ++<% ++ end ++ end ++%> ++ ++ ++
    ++<% if category ~= "freifunk" and category ~= "splash" then %> ++ ++<% end %> +diff --git a/feeds/luci/themes/luci-theme-freifunk-generic/root/etc/uci-defaults/luci-theme-freifunk-generic b/feeds/luci/themes/luci-theme-freifunk-generic/root/etc/uci-defaults/luci-theme-freifunk-generic +new file mode 100644 +index 0000000..017e7f7 +--- /dev/null ++++ b/feeds/luci/themes/luci-theme-freifunk-generic/root/etc/uci-defaults/luci-theme-freifunk-generic +@@ -0,0 +1,5 @@ ++uci batch <<-EOF ++ set luci.themes.Freifunk_Generic=/luci-static/freifunk-generic ++ set luci.main.mediaurlbase=/luci-static/freifunk-generic ++ commit luci ++EOF +diff --git a/feeds/luci/themes/luci-theme-material/Makefile b/feeds/luci/themes/luci-theme-material/Makefile +new file mode 100755 +index 0000000..5bc16eb +--- /dev/null ++++ b/feeds/luci/themes/luci-theme-material/Makefile +@@ -0,0 +1,14 @@ ++# ++# Copyright (C) 2008-2014 The LuCI Team ++# ++# This is free software, licensed under the Apache License, Version 2.0 . ++# ++ ++include $(TOPDIR)/rules.mk ++ ++LUCI_TITLE:=Material Theme ++LUCI_DEPENDS:= ++ ++include ../../luci.mk ++ ++# call BuildPackage - OpenWrt buildroot signature +diff --git a/feeds/luci/themes/luci-theme-material/htdocs/luci-static/material/css/style.css b/feeds/luci/themes/luci-theme-material/htdocs/luci-static/material/css/style.css +new file mode 100755 +index 0000000..058d3ed +--- /dev/null ++++ b/feeds/luci/themes/luci-theme-material/htdocs/luci-static/material/css/style.css +@@ -0,0 +1,1384 @@ ++/** ++ * Material is a clean HTML5 theme for LuCI. It is based on luci-theme-bootstrap and MUI ++ * ++ * luci-theme-material ++ * Copyright 2015 Lutty Yang ++ * ++ * Have a bug? Please create an issue here on GitHub! ++ * https://github.com/LuttyYang/luci-theme-material/issues ++ * ++ * luci-theme-bootstrap: ++ * Copyright 2008 Steven Barth ++ * Copyright 2008 Jo-Philipp Wich ++ * Copyright 2012 David Menting ++ * ++ * MUI: ++ * https://github.com/muicss/mui ++ * ++ * Licensed to the public under the Apache License 2.0 ++ */ ++ ++/* ++ * Font generate by Icomoon ++ */ ++@font-face { ++ font-family: 'icomoon'; ++ src: url('../fonts/font.eot'); ++ src: url('../fonts/font.eot') format('embedded-opentype'), ++ url('../fonts/font.ttf') format('truetype'), ++ url('../fonts/font.woff') format('woff'), ++ url('../fonts/font.svg') format('svg'); ++ font-weight: normal; ++ font-style: normal; ++} ++ ++.cbi-button-up, ++.cbi-button-down, ++.cbi-value-helpicon, ++.showSide, ++.main > .loading > span { ++ font-family: 'icomoon' !important; ++ speak: none; ++ font-style: normal !important; ++ font-weight: normal !important; ++ font-variant: normal !important; ++ text-transform: none !important; ++ line-height: 1; ++ ++ -webkit-font-smoothing: antialiased; ++ -moz-osx-font-smoothing: grayscale; ++} ++ ++* { ++ margin: 0; ++ padding: 0; ++ box-sizing: border-box; ++} ++ ++.h1, .h2, .h3, .h4, .h5, .h6, h1, h2, h3, h4, h5, h6 { ++ font-family: inherit; ++ font-weight: 500; ++ line-height: 1.1; ++ color: inherit; ++} ++ ++html, body { ++ margin: 0px; ++ padding: 0px; ++ height: 100%; ++ font-family: "Helvetica Neue", Helvetica, Microsoft Yahei, Hiragino Sans GB, WenQuanYi Micro Hei, sans-serif; ++} ++ ++select { ++ padding: 0.36rem 0.8rem; ++ color: #555; ++ background-color: #fff; ++ background-image: none; ++ border: 1px solid #ccc; ++} ++ ++input { ++ padding: 0.36rem 0.5rem; ++} ++ ++code { ++ color: #0099CC; ++} ++ ++abbr { ++ color: #0099CC; ++ text-decoration: underline; ++ cursor: help; ++} ++ ++header, .main { ++ width: 100%; ++ position: absolute; ++} ++ ++header { ++ height: 4rem; ++ box-shadow: 0 2px 5px rgba(0, 0, 0, .26); ++ transition: box-shadow .2s; ++ float: left; ++ position: fixed; ++ z-index: 101; ++} ++ ++footer{ ++ text-align: right; ++ padding: 1rem; ++ color: #aaa; ++ font-size: 0.8rem; ++ text-shadow: 0px 0px 2px #BBB; ++} ++ ++footer > a{ ++ color: #aaa; ++ text-decoration: none; ++} ++ ++.main { ++ top: 4rem; ++ bottom: 0rem; ++} ++ ++.main > .loading{ ++ position: fixed; ++ width: 100%; ++ height: 100%; ++ z-index: 1000; ++ display: block; ++ background-color: rgb(240, 240, 240); ++} ++ ++.main > .loading > span{ ++ display: block; ++ text-align: center; ++ margin-top: 2rem; ++ color: #888; ++ font-size: 1.3rem; ++} ++ ++.main > .loading > span:before{ ++ content: "\e603"; ++ -webkit-animation: anim-rotate 2s infinite linear; ++ animation: anim-rotate 2s infinite linear; ++ margin-right: 0.2rem; ++} ++ ++@-webkit-keyframes anim-rotate { ++ 0% { ++ -webkit-transform:rotate(0); ++ transform:rotate(0); ++ } ++ 100% { ++ -webkit-transform:rotate(360deg); ++ transform:rotate(360deg); ++ } ++} ++ ++@keyframes anim-rotate { ++ 0% { ++ -webkit-transform:rotate(0); ++ -ms-transform:rotate(0); ++ transform:rotate(0); ++ } ++ 100% { ++ -webkit-transform:rotate(360deg); ++ -ms-transform:rotate(360deg); ++ transform:rotate(360deg) ++ } ++} ++ ++.main-left { ++ float: left; ++ width: 15%; ++ width: calc(0% + 17rem); ++ height: 100%; ++ overflow-y: auto; ++ background-color: white; ++} ++ ++.main-right { ++ width: 85%; ++ width: calc(100% - 17rem); ++ float: right; ++ overflow-y: auto; ++ height: 100%; ++ background-color: #EEE; ++} ++ ++.pull-right { ++ float: right; ++} ++ ++.pull-left { ++ float: left; ++} ++ ++header { ++ background: #0099CC; ++ color: white; ++} ++ ++header > .container { ++ margin-top: 0.5rem; ++ padding: 0.5rem 1rem 0 1rem; ++} ++ ++header > .container > .brand { ++ font-size: 1.5rem; ++ color: white; ++ text-decoration: none; ++ cursor: default; ++ vertical-align: text-bottom; ++} ++ ++.warning { ++ background-color: #FF7D60 !important; ++ color: #FFF; ++} ++ ++.errorbox, ++.alert-message { ++ margin: 2rem 0 0 0; ++ padding: 2rem; ++ border: 0; ++ font-weight: normal; ++ font-style: normal; ++ line-height: 1; ++ font-family: inherit; ++ min-width: inherit; ++ overflow: auto; ++ border-radius: 0; ++ background-color: #FFF; ++ box-shadow: 0 2px 2px 0 rgba(0, 0, 0, .16), 0 0 2px 0 rgba(0, 0, 0, .12); ++} ++ ++.errorbox { ++ color: #fff; ++ background-color: #f0ad4e; ++ border-color: #eea236; ++} ++ ++#maincontent > .container > div:nth-child(1).alert-message.warning > a { ++ font: inherit; ++ overflow: visible; ++ text-transform: none; ++ display: inline-block; ++ margin-bottom: 0; ++ font-weight: 400; ++ text-align: center; ++ white-space: nowrap; ++ vertical-align: middle; ++ touch-action: manipulation; ++ cursor: pointer; ++ -webkit-user-select: none; ++ -moz-user-select: none; ++ -ms-user-select: none; ++ user-select: none; ++ background-image: none; ++ min-width: 6rem; ++ padding: 0.5rem 1rem; ++ font-size: 1.1rem; ++ line-height: 1.42857143; ++ color: #fff; ++ background-color: #5bc0de; ++ border-color: #46b8da; ++ margin-top: 2rem; ++ text-decoration: inherit; ++} ++ ++.main > .main-left > .nav { ++ margin-top: 0.5rem; ++} ++ ++.main > .main-left > .nav > li a { ++ color: #404040; ++ display: block; ++} ++ ++.main > .main-left > .nav > li:nth-last-child(1) { ++ margin-top: 2rem; ++ font-size: 1.2rem; ++} ++ ++.main > .main-left > .nav > li { ++ padding: 0.5rem 1rem; ++ cursor: pointer; ++} ++ ++.main > .main-left > .nav > .slide { ++ padding: 0; ++} ++ ++.main > .main-left > .nav > .slide > ul { ++ display: none; ++} ++ ++.main > .main-left > .nav > .slide > .menu { ++ display: block; ++ padding: 0.5rem 1rem; ++ text-decoration: none; ++ cursor: default; ++ font-size: 1.2rem; ++} ++ ++.main > .main-left > .nav > li:hover, ++.main > .main-left > .nav > .slide > .menu:hover { ++ background: #D4D4D4; ++} ++ ++.main > .main-left > .nav > .slide:hover { ++ background: none; ++} ++ ++.main > .main-left > .nav > .slide > .slide-menu > li { ++ padding: 0.4rem 2rem; ++} ++ ++.main > .main-left > .nav > .slide > .slide-menu > .active { ++ background-color: #0099CC; ++} ++ ++.main > .main-left > .nav > .slide > .slide-menu > li > a { ++ text-decoration: none; ++ white-space: nowrap; ++} ++ ++.main > .main-left > .nav > .slide > .slide-menu > .active > a { ++ color: white; ++} ++ ++.main > .main-left > .nav > .slide > .slide-menu > li:hover { ++ background: #D4D4D4; ++} ++ ++.main > .main-left > .nav > .slide > .slide-menu > .active:hover { ++ background-color: #0099CC; ++ cursor: hand; ++} ++ ++li { ++ list-style-type: none; ++} ++ ++#maincontent > .container { ++ margin: 0 2rem 1rem 2rem; ++} ++ ++h1 { ++ font-size: 4rem; ++ padding-bottom: 10px; ++ border-bottom: 1px solid #eee; ++} ++ ++h2 { ++ margin: 2rem 0 0 0; ++ font-size: 2.5rem; ++ padding-bottom: 10px; ++ border-bottom: 1px solid #eee; ++} ++ ++h3 { ++ margin: 2rem 0 0 0; ++ font-size: 2rem; ++ padding-bottom: 10px; ++} ++ ++h4 { ++ ++} ++ ++fieldset { ++ margin: 2rem 0 0 0; ++ padding: 2rem; ++ border: 0; ++ font-weight: normal; ++ font-style: normal; ++ line-height: 1; ++ font-family: inherit; ++ ++ min-width: inherit; ++ overflow: auto; ++ ++ border-radius: 0; ++ background-color: #FFF; ++ box-shadow: 0 2px 2px 0 rgba(0, 0, 0, .16), 0 0 2px 0 rgba(0, 0, 0, .12); ++} ++ ++fieldset > legend { ++ display: none !important; ++} ++ ++fieldset > fieldset { ++ margin: 0; ++ padding: 0; ++ border: none; ++ box-shadow: none; ++} ++ ++.panel-title { ++ width: 100%; ++ display: block; ++ line-height: 1; ++ color: #404040; ++ font-size: 1.9rem; ++ padding-bottom: 2rem; ++ border-bottom: 1px solid #eee; ++} ++ ++table { ++ border-spacing: 0; ++ border-collapse: collapse; ++ width: 100%; ++ border: 1px solid #eee; ++} ++ ++table > tbody > tr > td, table > tbody > tr > th, table > tfoot > tr > td, table > tfoot > tr > th, table > thead > tr > td, table > thead > tr > th { ++ padding: 8px; ++ line-height: 1.42857143; ++ border-top: 1px solid #ddd; ++ ++ white-space: nowrap; ++} ++ ++.cbi-section-table-cell { ++ text-align: center; ++} ++ ++.cbi-section-table-row { ++ text-align: center; ++} ++ ++fieldset > table > tbody > tr:nth-of-type(odd) { ++ background-color: #f9f9f9; ++} ++ ++/* fix progress bar */ ++#memfree > div, ++#membuff > div, ++#conns > div, ++#memtotal > div { ++ width: 100% !important; ++ height: 1.4rem !important; ++} ++ ++#memfree > div > div, ++#membuff > div > div, ++#conns > div > div, ++#memtotal > div > div { ++ height: 1.4rem !important; ++ background-color: #0099CC !important; ++} ++ ++/* fix multiple table */ ++ ++table table { ++ border: none; ++} ++ ++.cbi-value-field table { ++ border: none; ++} ++ ++td > table > tbody > tr > td { ++ border: none; ++} ++ ++.cbi-value-field > table > tbody > tr > td { ++ border: none; ++} ++ ++/* button style */ ++ ++.cbi-button { ++ font: inherit; ++ overflow: visible; ++ text-transform: none; ++ display: inline-block; ++ margin-bottom: 0; ++ font-weight: 400; ++ text-align: center; ++ white-space: nowrap; ++ vertical-align: middle; ++ touch-action: manipulation; ++ cursor: pointer; ++ -webkit-user-select: none; ++ -moz-user-select: none; ++ -ms-user-select: none; ++ user-select: none; ++ background-image: none; ++ border: 1px solid transparent; ++ color: #333; ++ background-color: #fff; ++ border-color: #ccc; ++ min-width: 6rem; ++ padding: 0.5rem 1rem; ++ font-size: 1.1rem; ++ line-height: 1.42857143; ++} ++ ++.cbi-button-reset, ++.cbi-input-remove { ++ color: #fff; ++ background-color: #f0ad4e; ++ border-color: #eea236; ++} ++ ++.cbi-input-save, ++.cbi-button-add, ++.cbi-button-save, ++.cbi-button-find, ++.cbi-input-reload, ++.cbi-button-reload { ++ color: #fff !important; ++ background-color: #337ab7 !important; ++ border-color: #2e6da4 !important; ++} ++ ++.cbi-input-apply, ++.cbi-button-apply, ++.cbi-button-edit { ++ color: #fff !important; ++ background-color: #5bc0de !important; ++ border-color: #46b8da !important; ++} ++ ++.cbi-input-reset, ++.cbi-button-remove { ++ color: #fff !important; ++ background-color: #d9534f !important; ++ border-color: #d43f3a !important; ++} ++ ++/* table */ ++ ++.tabs { ++ margin: 0 -2rem; ++ padding-left: 0.5rem; ++ background-color: #FFFFFF; ++} ++ ++.cbi-tabmenu > li, ++.tabs > li { ++ display: inline-block; ++ padding: 0.9rem 0rem; ++} ++ ++.cbi-tabmenu > li > a, ++.tabs > li > a { ++ text-decoration: none; ++ color: #404040; ++ padding: 0.9rem 1.5rem; ++} ++ ++.tabs > li[class~="active"], ++.tabs > li:hover { ++ cursor: pointer; ++ background-color: white; ++ border-bottom: 0.2rem solid #0099CC; ++ color: #0099CC; ++} ++ ++.tabs > li[class~="active"] > a { ++ color: #0099cc; ++} ++ ++.tabs > li:hover { ++ border-bottom: 0.2rem solid #C9C9C9; ++} ++ ++.cbi-tabmenu { ++ border-top: 1px solid #D4D4D4; ++ border-left: 1px solid #D4D4D4; ++ border-right: 1px solid #D4D4D4; ++} ++ ++.cbi-tabmenu > li:hover { ++ background-color: #F1F1F1; ++} ++ ++.cbi-tabmenu > li[class~="cbi-tab"] { ++ background-color: white; ++} ++ ++.cbi-tabmenu { ++ background-color: #D4D4D4; ++} ++ ++.cbi-section-node-tabbed { ++ padding: 0; ++ margin-top: 0; ++ border-bottom: 1px solid #D4D4D4; ++ border-left: 1px solid #D4D4D4; ++ border-right: 1px solid #D4D4D4; ++} ++ ++.cbi-tabcontainer > .cbi-value:nth-of-type(2n) { ++ background-color: #f9f9f9; ++} ++ ++.cbi-value-field, ++.cbi-value-description { ++ display: table-cell; ++} ++ ++.cbi-value-helpicon > img { ++ display: none; ++} ++ ++.cbi-value-helpicon:before { ++ content: "\f059"; ++} ++ ++.cbi-value-description { ++ font-size: small; ++ opacity: 0.5; ++ padding: 0.5rem 0 0 0; ++} ++ ++.cbi-value-title { ++ word-wrap: break-word; ++ padding-top: 0.6rem; ++ width: 23rem; ++ float: left; ++ text-align: right; ++ padding-right: 2rem; ++ display: table-cell; ++} ++ ++.cbi-value { ++ padding: 1rem; ++} ++ ++.cbi-section-table-descr > .cbi-section-table-cell, ++.cbi-section-table-titles > .cbi-section-table-cell { ++ border: none; ++} ++ ++.cbi-rowstyle-2 { ++ background-color: #eee; ++} ++ ++.cbi-section-table .cbi-section-table-titles .cbi-section-table-cell { ++ width: auto !important; ++} ++ ++/* desc */ ++.cbi-section-descr, ++.cbi-map-descr { ++ padding: 0.5rem; ++ color: #999; ++} ++ ++/* luci */ ++ ++.hidden { ++ display: none ++} ++ ++.left { ++ text-align: left !important; ++} ++ ++.right { ++ text-align: right !important; ++} ++ ++.inline { ++ display: inline-block; ++} ++ ++.cbi-page-actions { ++ border-top: 1px solid #eee; ++ padding-top: 2rem; ++ text-align: right; ++} ++ ++/* input */ ++.cbi-value input[type="password"], ++.cbi-value input[type="text"] { ++ padding: 0.36rem 1rem; ++ color: #555; ++ min-width: 15rem; ++ background-color: #fff; ++ background-image: none; ++ border: 1px solid #ccc; ++ margin-bottom: 0.3rem; ++} ++ ++.cbi-value-field input[type="password"], ++.cbi-value-field input[type="text"] { ++ padding: 0.36rem 1rem; ++ color: #555; ++ background-color: #fff; ++ background-image: none; ++ border: 1px solid #ccc; ++} ++ ++/* select */ ++.cbi-value-field .cbi-input-select { ++ width: 95%; ++ min-width: 15rem; ++ padding: 0.36rem 0.8rem; ++ color: #555; ++ background-color: #fff; ++ background-image: none; ++ border: 1px solid #ccc; ++} ++ ++.ifacebadge { ++ display: inline-block; ++ min-width: 8rem; ++ border: 1px solid #CCCCCC; ++ padding: 0.5rem 1rem; ++ -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05); ++ -moz-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05); ++ box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05); ++} ++ ++.ifacebadge > img { ++ float: right; ++ margin-left: 0.3rem; ++} ++ ++/*textarea*/ ++ ++.cbi-input-textarea { ++ width: 100%; ++ min-height: 16rem; ++ padding: 1rem; ++ font-size: 0.9rem; ++ font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; ++ color: black; ++} ++ ++#syslog { ++ width: 100%; ++ min-height: 15rem; ++ padding: 1rem; ++ font-size: smaller; ++ color: #5F5F5F; ++ ++ margin-bottom: 20px; ++ border-radius: 0; ++ background-color: #FFF; ++ box-shadow: 0 2px 2px 0 rgba(0, 0, 0, .16), 0 0 2px 0 rgba(0, 0, 0, .12); ++ border: none; ++} ++ ++/* change */ ++ ++.uci-change-list { ++ font-family: monospace; ++} ++ ++.uci-change-list ins, ++.uci-change-legend-label ins { ++ text-decoration: none; ++ border: 1px solid #00FF00; ++ background-color: #CCFFCC; ++ display: block; ++ padding: 2px; ++} ++ ++.uci-change-list del, ++.uci-change-legend-label del { ++ text-decoration: none; ++ border: 1px solid #FF0000; ++ background-color: #FFCCCC; ++ display: block; ++ font-style: normal; ++ padding: 2px; ++} ++ ++.uci-change-list var, ++.uci-change-legend-label var { ++ text-decoration: none; ++ border: 1px solid #CCCCCC; ++ background-color: #EEEEEE; ++ display: block; ++ font-style: normal; ++ padding: 2px; ++} ++ ++.uci-change-list var ins, ++.uci-change-list var del { ++ border: none; ++ white-space: pre; ++ font-style: normal; ++ padding: 0px; ++} ++ ++.uci-change-legend { ++ padding: 5px; ++} ++ ++.uci-change-legend-label { ++ width: 150px; ++ float: left; ++} ++ ++.uci-change-legend-label > ins, ++.uci-change-legend-label > del, ++.uci-change-legend-label > var { ++ float: left; ++ margin-right: 4px; ++ width: 10px; ++ height: 10px; ++ display: block; ++} ++ ++.uci-change-legend-label var ins, ++.uci-change-legend-label var del { ++ line-height: 6px; ++ border: none; ++} ++ ++.uci-change-list var, ++.uci-change-list del, ++.uci-change-list ins { ++ padding: 0.5rem; ++} ++ ++/* other fix */ ++#iwsvg, ++#iwsvg2, ++#bwsvg { ++ border: 1px solid #D4D4D4 !important; ++ border-top: none !important; ++} ++ ++.ifacebox { ++ border: 1px solid #999; ++ background-color: #f9f9f9; ++} ++ ++.cbi-image-button { ++ margin-left: 0.5rem; ++} ++ ++.zonebadge { ++ padding: 0.2rem 0.5rem; ++ display: inline-block; ++ cursor: pointer; ++} ++ ++.zonebadge > .ifacebadge { ++ padding: 0.2rem 1rem; ++ margin: 0.3rem; ++ border: 1px solid #6C6C6C; ++} ++ ++.zonebadge > input[type="text"] { ++ padding: 0.16rem 1rem; ++ min-width: 10rem; ++ margin-top: 0.3rem; ++} ++ ++.cbi-value-field .cbi-input-checkbox, ++.cbi-value-field .cbi-input-radio { ++ margin-top: 1rem; ++} ++ ++.cbi-section-table-row > .cbi-value-field .cbi-input-select { ++ min-width: 7rem; ++} ++ ++.cbi-section-create > .cbi-button-add { ++ margin: 0.5rem; ++} ++ ++div.cbi-value var, td.cbi-value-field var { ++ font-style: italic; ++ color: #0069D6; ++} ++ ++small { ++ font-size: smaller; ++ white-space: normal; ++} ++ ++.cbi-button-up, ++.cbi-button-down { ++ display: inline-block; ++ min-width: 0; ++ padding: 0.2rem 0.3rem; ++ font-size: 1.3rem; ++} ++ ++#diag-rc-output > pre { ++ background-color: #f5f5f5; ++ display: block; ++ padding: 8.5px; ++ margin: 0 0 18px; ++ line-height: 1.5rem; ++ -moz-border-radius: 3px; ++ white-space: pre-wrap; ++ word-wrap: break-word; ++ font-size: 1.5rem; ++ color: #404040; ++} ++ ++input[name="ping"], ++input[name="traceroute"], ++input[name="nslookup"] { ++ width: 80%; ++} ++ ++header > .container > .pull-right > * { ++ position: relative; ++ top: 0.45rem; ++ cursor: pointer; ++} ++ ++#xhr_poll_status > .label.success { ++ background-color: #14CE14; ++} ++ ++.label { ++ padding: 0.3rem 0.8rem; ++ font-size: 1rem; ++ font-weight: bold; ++ color: #ffffff !important; ++ text-transform: uppercase; ++ white-space: nowrap; ++ background-color: #bfbfbf; ++ -webkit-border-radius: 3px; ++ -moz-border-radius: 3px; ++ border-radius: 3px; ++ text-shadow: none; ++ text-decoration: none; ++} ++ ++.notice { ++ background-color: #5BC0DE; ++} ++ ++.showSide { ++ display: none; ++} ++ ++.darkMask { ++ width: 100%; ++ height: 100%; ++ position: fixed; ++ background-color: rgba(0, 0, 0, 0.56); ++ content: ""; ++ z-index: 99; ++ display: none; ++} ++ ++/* fix Main Login*/ ++.node-main-login > .main > .main-left { ++ display: none; ++} ++ ++.node-main-login > .main > .main-right { ++ width: 100%; ++} ++ ++.node-main-login > .main fieldset { ++ padding: 0; ++ margin-bottom: 1rem; ++ display: inline; ++ background: none; ++ border: none; ++ box-shadow: none; ++} ++ ++.node-main-login > .main .cbi-value-title { ++ width: 7rem; ++} ++ ++.node-main-login > .main #maincontent { ++ ++ text-align: center; ++} ++ ++.node-main-login > .main .container { ++ display: inline-block; ++ padding: 2rem 4rem; ++ margin-top: 2rem !important; ++ background-color: #FFF; ++ box-shadow: 0 2px 2px 0 rgba(0, 0, 0, .16), 0 0 2px 0 rgba(0, 0, 0, .12); ++ text-align: left; ++} ++ ++.node-main-login > .main form > div:nth-last-child(1) { ++ float: right; ++} ++ ++.node-main-login footer{ ++ bottom: 0; ++ position: absolute; ++ width: 100%; ++} ++ ++/* fix status overview */ ++ ++.node-status-overview > .main fieldset:nth-child(4) td:nth-child(2){ ++ white-space: normal; ++} ++ ++ ++/* fix status processes */ ++ ++.node-status-processes > .main table tr td:nth-child(3) { ++ white-space: normal; ++} ++ ++.node-status-firewall > .main fieldset li { ++ display: inline-block; ++} ++ ++.node-status-firewall > .main fieldset li > a { ++ font: inherit; ++ overflow: visible; ++ text-transform: none; ++ margin-bottom: 0; ++ font-weight: 400; ++ text-align: center; ++ white-space: nowrap; ++ vertical-align: middle; ++ touch-action: manipulation; ++ cursor: pointer; ++ -webkit-user-select: none; ++ -moz-user-select: none; ++ -ms-user-select: none; ++ user-select: none; ++ background-image: none; ++ border: 1px solid transparent; ++ color: #333; ++ min-width: 6rem; ++ padding: 0.5rem 1rem; ++ font-size: 1.1rem; ++ line-height: 1.42857143; ++ background-color: #f0ad4e; ++ border-color: #eea236; ++ ++ color: #fff; ++ text-decoration: none; ++} ++ ++/* fix system reboot */ ++ ++.node-system-reboot > .main > .main-right p, ++.node-system-reboot > .main > .main-right h3 { ++ padding-left: 2rem; ++} ++ ++.node-system-reboot > .main > .main-right p > a { ++ margin-top: 2rem; ++ text-decoration: none; ++ font: inherit; ++ overflow: visible; ++ text-transform: none; ++ display: inline-block; ++ margin-bottom: 0; ++ font-weight: 400; ++ text-align: center; ++ white-space: nowrap; ++ vertical-align: middle; ++ touch-action: manipulation; ++ cursor: pointer; ++ -webkit-user-select: none; ++ -moz-user-select: none; ++ -ms-user-select: none; ++ user-select: none; ++ background-image: none; ++ border: 1px solid transparent; ++ min-width: 6rem; ++ padding: 0.5rem 1rem; ++ font-size: 1.1rem; ++ line-height: 1.42857143; ++ text-decoration: none; ++ color: #fff; ++ background-color: #d9534f !important; ++ border-color: #d43f3a !important; ++} ++ ++/* fix Services Network Shares*/ ++.node-services-network_shares > .main .cbi-tabcontainer:nth-child(3) .cbi-value-title { ++ margin-bottom: 1rem; ++} ++ ++.node-services-network_shares > .main .cbi-tabcontainer:nth-child(3) .cbi-value-field { ++ display: list-item; ++} ++ ++.node-services-network_shares > .main .cbi-tabcontainer:nth-child(3) .cbi-value-description { ++ padding-top: 1rem; ++} ++ ++/* fix System Software*/ ++.node-system-software > .main table tr td:nth-child(4) { ++ white-space: normal; ++ font-size: small; ++ color: #404040; ++} ++ ++.node-system-software > .main .cbi-tabmenu > li > a, .tabs > li > a { ++ padding: 0.5rem 1rem; ++} ++ ++.node-system-software > .main .cbi-value > pre { ++ background-color: #eee; ++ padding: 0.5rem; ++ overflow: auto; ++} ++ ++.cbi-tabmenu + .cbi-section { ++ margin-top: 0; ++} ++ ++.node-status-firewall fieldset, ++.node-system-software fieldset, ++.node-system-backup_flash_firmware fieldset { ++ margin-top: 0; ++} ++ ++.node-status-firewall .cbi-tabmenu, ++.node-system-software .cbi-tabmenu, ++.node-system-backup_flash_firmware .cbi-tabmenu { ++ border: none; ++ box-shadow: 0 2px 2px 0 rgba(0, 0, 0, .16), 0 0 2px 0 rgba(0, 0, 0, .12); ++} ++ ++/* language fix */ ++body.lang_pl.node-main-login .cbi-value-title { ++ width: 12rem; ++} ++ ++@media screen and (max-width: 1600px) { ++ .main-left { ++ width: calc(0% + 15rem); ++ } ++ ++ .main-right { ++ width: calc(100% - 15rem); ++ } ++ ++ .cbi-button { ++ padding: 0.3rem 0.6rem; ++ font-size: 1rem; ++ line-height: 1.5; ++ } ++ ++ header > .container > .pull-right > * { ++ top: 0.35rem; ++ } ++ ++ .label { ++ padding: 0.2rem 0.6rem; ++ } ++ ++ .cbi-value-title { ++ width: 15rem; ++ } ++ ++ fieldset { ++ padding: 1rem; ++ } ++ ++ .cbi-input-textarea { ++ font-size: smaller; ++ } ++ ++ .node-status-firewall > .main fieldset li > a { ++ padding: 0.3rem 0.6rem; ++ } ++} ++ ++@media screen and (max-width: 1280px) { ++ header { ++ height: 3.5rem; ++ } ++ ++ header > .container { ++ margin-top: 0.25rem; ++ } ++ ++ .main { ++ top: 3.5rem; ++ } ++ ++ .main-left { ++ width: calc(0% + 13rem); ++ } ++ ++ .main-right { ++ width: calc(100% - 13rem); ++ } ++ ++ .cbi-tabmenu > li > a, .tabs > li > a { ++ padding: 0.2rem 0.5rem; ++ } ++ ++ .panel-title { ++ font-size: 1.3rem; ++ padding-bottom: 1rem; ++ } ++ ++ table { ++ font-size: 0.8rem !important; ++ } ++ ++ .main > .main-left > .nav > li, ++ .main > .main-left > .nav > li a, ++ .main > .main-left > .nav > .slide > .menu { ++ font-size: 1.1rem; ++ } ++ ++ .main > .main-left > .nav > .slide > .slide-menu > li > a { ++ font-size: 0.9rem; ++ } ++} ++ ++@media screen and (max-width: 992px) { ++ .main-left { ++ width: 0; ++ position: fixed; ++ z-index: 100; ++ } ++ ++ .main-right { ++ width: 100%; ++ } ++ ++ .showSide { ++ padding: 0.1rem; ++ margin-right: 0.5rem; ++ display: inline-block; ++ } ++ ++ .showSide:before { ++ content: "\e20e"; ++ font-size: 1.7rem; ++ } ++ ++ .node-main-login .showSide { ++ display: none !important; ++ } ++ ++ .cbi-value-title { ++ width: 9rem; ++ padding-right: 1rem; ++ } ++ ++ .node-network-diagnostics > .main .cbi-map fieldset > div * { ++ width: 100% !important; ++ } ++ ++ .node-network-diagnostics > .main .cbi-map fieldset > div input[type="text"] { ++ margin: 3rem 0 0 0 !important; ++ } ++ ++ .node-network-diagnostics > .main .cbi-map fieldset > div:nth-child(4) input[type="text"] { ++ margin: 0 !important; ++ } ++ ++ .node-network-diagnostics > .main .cbi-map fieldset > div select, ++ .node-network-diagnostics > .main .cbi-map fieldset > div input[type="button"] { ++ margin: 1rem 0 0 0; ++ } ++ ++ .node-network-diagnostics > .main .cbi-map fieldset > div { ++ width: 100% !important; ++ } ++ ++ #diag-rc-output > pre { ++ font-size: 1.2rem; ++ } ++ ++ .node-main-login > .main .cbi-value-title { ++ text-align: left; ++ } ++} ++ ++@media screen and (max-width: 480px) { ++ fieldset { ++ padding: 1rem; ++ margin: 1rem 0 0 0; ++ } ++ ++ .tabs { ++ margin: 0 -1rem; ++ } ++ ++ #maincontent > .container { ++ margin: 0 1rem 1.5rem 1rem; ++ } ++ ++ .main > .main-left > .nav > .slide > .menu { ++ font-size: 1.3rem; ++ } ++ ++ .main > .main-left > .nav > .slide > .slide-menu > li > a { ++ font-size: 1.1rem; ++ } ++ ++ .cbi-value-title { ++ width: 100%; ++ min-width: 0rem !important; ++ display: block; ++ margin-top: 1rem; ++ margin-bottom: 0.5rem; ++ text-align: left; ++ } ++ ++ .cbi-value-field, .cbi-value-description { ++ width: 100%; ++ } ++ ++ .cbi-value > .cbi-value-field { ++ display: inline-block; ++ } ++ ++ .cbi-tabmenu > li, .tabs > li { ++ padding: 0.6rem 0rem; ++ } ++ ++ .cbi-tabmenu > li > a, .tabs > li > a { ++ padding: 0.2rem 0.3rem; ++ font-size: 0.9rem; ++ } ++ ++ .cbi-page-actions > div > input { ++ display: none; ++ } ++ ++ .node-main-login > .main .container { ++ padding: 0.5rem 1rem 2rem 1rem; ++ } ++ ++ .node-main-login > .main .cbi-value { ++ padding: 0; ++ } ++ ++ .node-main-login > .main form > div:nth-last-child(1) { ++ margin-top: 2rem; ++ } ++ ++ .node-main-login > .main .cbi-value-title { ++ width: 100% !important; ++ font-size: 1.2rem; ++ } ++ ++ .node-main-login > .main fieldset { ++ margin: 0; ++ padding: 0.5rem; ++ } ++ ++ h2 { ++ font-size: 2rem; ++ } ++ ++ .tabs > li > a { ++ font-size: 0.9rem; ++ } ++ ++ select, ++ input { ++ font-size: 0.9rem; ++ } ++ ++ .mobile-hide { ++ display: none; ++ } ++ ++ .panel-title { ++ font-size: 1.4rem; ++ padding-bottom: 1rem; ++ } ++ ++ .node-system-software > .main .cbi-value.cbi-value-last > div { ++ width: 100% !important; ++ } ++ ++ .node-system-software > .main .cbi-value .cbi-value-field input { ++ width: 100%; ++ } ++} +diff --git a/feeds/luci/themes/luci-theme-material/htdocs/luci-static/material/favicon.ico b/feeds/luci/themes/luci-theme-material/htdocs/luci-static/material/favicon.ico +new file mode 100755 +index 0000000000000000000000000000000000000000..b407d18455773a185059628e632e60c06d6eb858 +GIT binary patch +literal 2462 +zcmcJR&yEaH6o*e6F|iOUG9fZOLP&@Rv5;U2&*0w!;0>@EGb?OJyuet^Lm<@5WC)%> +zkg%GqrA0^izRtZ-om6$ws{JP4+;h*l=U2CGb=OQpkDs}@;CDYB?~d3X5yyd4oCfnl +zQEO2_{uO*pd}Hi_UInNEw%|dE&oM3}4l_=IeJ4P#cTj-Wx)0ajZQ?p(S9uM+zd!+R +z;6|ck+y`BBl4j4l?(e>39j4{~8n1hh&!;5zKDx>?*ZVTOhx+rKXD`V97nvAJBYkDKK6(zC8zOb&vd$Aubw;!E%;jrG`CeXYHE +z=rxJ-*noU4#^$Cay}a-2Z#-@P|G9s^3nko27HrO^a0Qz7YtEW$Tsx_D(r^bpz%#fCM-#^8thvUu|04Hz3ZB4A*hmvOF=_Uh3l-%EGlBRqt87^TcB!2LW2|K51tM-tY}S#!-Qm>ahj$|IU(b`hS!7WmH3|G(t-zctsm +zwo%LJk~7t>=v9Lu#>!e5Gf}NnqiiyV!O~(3E&xaWo8#PG*^VF8qxilw8$V<3F#iYk +Cvy_7X + +literal 0 +HcmV?d00001 + +diff --git a/feeds/luci/themes/luci-theme-material/htdocs/luci-static/material/fonts/font.eot b/feeds/luci/themes/luci-theme-material/htdocs/luci-static/material/fonts/font.eot +new file mode 100644 +index 0000000000000000000000000000000000000000..9e6ffc9b826cb39a58e56359d6b8b922a4b07364 +GIT binary patch +literal 1912 +zcmah~Ur1Y582`?_x%Vc~T>r!*OpT4P8o`m;m_K$==`c84Z6{8{+A(HKZlhvuY>cgr +zKFA)%(1*FfM*FnUZZIZ{J&ZBvpfZF#Y)@lIVSRG2hwi1Y4#u`F`<;8QXe6-ja?bgE +zzwN>ij! +zo>pmzGE@TNr8Jlltw75)0Xj=z>Nm6}M}y=6>u7^S>VN6wGm(a7S2vh%P-e4*%<|74 +z-T45bcKGFdW@Q;|Bm8Z&_WaWN)fd`ZeusaHNO&->WpYaP$#+CHu8YruP`(wvhyN-3 +z)ANP$nqL?8;r{@?cd3}o2=nYs_)p+_3z@ZLe9%0RR1ZI(XA0Ww7af1Ye-<&`S}v}X +zF;AHMCGRIuyn~rYh<#h&Z+ypW*>5z!99(zI7^Yoq=ZPL)7I!PVbY4V3=V9`>F2E}z +z8jskHKC=}KRXf?}74Xf-hKS{56ga3mP!HbyReXH8^0ZRngTXngI9B<^|Cj$y|Mga> +z;R}pA9?uwniV?%;hGTu$Jc)CL^hp0d9A5GarZvNJ<6ufi3Gpco?d=T-GZmvH1`UH| +zm}{8N!4f`UZ>U1NTNno5ddx?}-q;a0gdKdb1FJ*sPETj7DTdm^s|}H!LSzj^@e}6Xo3K +zXf!%Jyy+jD4Tn>yMB=%*RO-r=RBGa)o-oe4%#d}+m|4=Q~$QQ44QKuG~z>i4Xv1q8Lj|COk&su!m +zB#R{CF*mpnCZx!x7-pM@8!0(V$8jZ+b@ar1M!vd&d^FFaIShFeNRsTjU4j|Sd#3{Z +zXChnUcGm@);*d_c-5qUSPhEZ6>5dLdQtxVZJDg384u_&VOeQt$##&BG!nEAl4Grj% +zf?bkj$zHI_k|f*NMx?LL=UZ2u=WI$ybv3ANugm3X>D=4hK9vL(>`jZV6X?ab{kvf)^jN}pSC8R2xdumC)3 +zVG%fPVH@zOg(aM_9t+FhFId=#{kw^X%;o^2qQ}GnaNfcq@UVq#z&9-{;jj-_SO!03 +zVJAiDPgt_+pY=D^L-I_h!b%DZS?d0}MTT%Y6XQicBm +D*A6pu + +literal 0 +HcmV?d00001 + +diff --git a/feeds/luci/themes/luci-theme-material/htdocs/luci-static/material/fonts/font.svg b/feeds/luci/themes/luci-theme-material/htdocs/luci-static/material/fonts/font.svg +new file mode 100644 +index 0000000..d38d057 +--- /dev/null ++++ b/feeds/luci/themes/luci-theme-material/htdocs/luci-static/material/fonts/font.svg +@@ -0,0 +1,16 @@ ++ ++ ++ ++Generated by IcoMoon ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ +\ No newline at end of file +diff --git a/feeds/luci/themes/luci-theme-material/htdocs/luci-static/material/fonts/font.ttf b/feeds/luci/themes/luci-theme-material/htdocs/luci-static/material/fonts/font.ttf +new file mode 100644 +index 0000000000000000000000000000000000000000..84669323e9ddfdca80c91416b6d4fe31ea1829ab +GIT binary patch +literal 1748 +zcmah}U1%d!6h3n&Gn1cY`jbCwn>0i)RYHn=Nd(_}VjX(rt? +z-ECzbiVq^~gR7wIJ}Ik$SP&mXgcU4O@Ijw^C=2dW1t0Wf!4*VZ<9BDKw5tWraPR%j +zch0@%%sF?41R`?L28k4Z?)j66)(&?+m@hHriq*pM5AWT1he+s#-Y6GVma(=$zlqge +zURuBMOt<$}=(mX2y^2;SDaD815ZSn2x&lJ^TKpFJN6=4Hs*Sav&i0^x2YqmLYKX+Z +zh4)?i>i(NQi4QI{A2plC?(n|zF-~ay82lsnd+=JP)cPs*9gSyfz$B1>-K|G#j3{&3 +za6R<@9}b5+fwX3MZ5)CURiZq_(cRrqHrq5-65u1iXN>y@0f&$Yu-(xnaWfkO;Qq)* +z#NF5yH`q4b*n#elr`Ok;YENPI@o7V(M{qI++s^0z-kX`(%jfy~2$ZLw_^~)dT}1uS +z0rN>EGwI<(fDgaVtH^j5jW5RI*{t6`F;QxqJJ%>pOeB+IW1GQ|xmYZh%VeIK&*d&( +z&gJGW%*>3B-$2WWnmaZ^=Q=5cP!W|W1*=Ev4Ne;?! +z)Dy)zd{P0UUVRb1o7d6YhB`8mB)e{xAja}mPdI)uu{C9PpS39tsmJ39b@_d+maY?_ +zkmb_i?(jIA?QIT+qTJ7BHSPLZNy|dC(%N+m=)h}3M^?w~_ggCg@Q$N?gdbxG{B +zx-Tq&<|jJo3a&GkgUE(rO)7n2#T7^aXXe0w=PWD&r!8y)UbV1p!rv)lfjj9+m((_t< +zWuc~rPsQT+HZ`i#3LId-Ij1N_@nd%#OHOO$)ulomK{X`0N=sCr`mvsqHN6ooYr0l1 +zG_+E9emy)@ter=0F`6`DHxRvyV{{{<0yVIfz|GS-<|*R^&YLfQ9MQz1E%`702g#=) +A_5c6? + +literal 0 +HcmV?d00001 + +diff --git a/feeds/luci/themes/luci-theme-material/htdocs/luci-static/material/fonts/font.woff b/feeds/luci/themes/luci-theme-material/htdocs/luci-static/material/fonts/font.woff +new file mode 100644 +index 0000000000000000000000000000000000000000..00cf84ea037c9748eba8fced0acff7dd29c12b2f +GIT binary patch +literal 1824 +zcmah~U1%d!6h3z*Gn1dq^e2DXHffq}n?fO*P4m+=ZK*U=>UMvqZE#n_rpav5(j>cS +zx@~12iVq^~gR7vpPs*;oSP-8?SivF%AM{D2EZCG7&Rrx~vs#LD8 +z6G>0NAK>b*2>Z*`Jo2P*_+G9;iM>+Jt)s5=Jp7=pDwQg^vIY+G*{fXdJZt;odUXZ8 +zDo8Q&L?BVT%Wji|-tGur!++fv+0Qh@Y&`XZu+|ff4#$ZeUJ-X2yEHCB!7-gTOi&;6 +zDnMO`aoh#Vv%1Jayytdm1tWk99y$)y!#92uA6{uZZZr@haQ1(2tnt17cmHqxn;lZi +z$L30U;t9iuVRnmN#h?YE)H%Ji~}l4#fh3$L$@8 +zB@^+8(AyRp6H=J9PPd>@Tz*hhgR$y%{W5Pf*FI~Y9^ +z+n%yI&s!9m)a`NwI=vppsm{}ZfSGd2+3vF0+gfclML9^PHEnIZprs*NVSP;l`k-u; +zWLdJ7t+FJ^R<;=%9Q64%RQoxL5>}lps>|ziI$L`}{T`#RqrJ^xmt|E|ogPm| +zCrxYtUNy0VFSW^2&zRUw +zae99-UoBUw6a?this[a+this.length]:this[a]:d.call(this)},pushStack:function(a){var b=m.merge(this.constructor(),a);return b.prevObject=this,b.context=this.context,b},each:function(a,b){return m.each(this,a,b)},map:function(a){return this.pushStack(m.map(this,function(b,c){return a.call(b,c,b)}))},slice:function(){return this.pushStack(d.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(a){var b=this.length,c=+a+(0>a?b:0);return this.pushStack(c>=0&&b>c?[this[c]]:[])},end:function(){return this.prevObject||this.constructor(null)},push:f,sort:c.sort,splice:c.splice},m.extend=m.fn.extend=function(){var a,b,c,d,e,f,g=arguments[0]||{},h=1,i=arguments.length,j=!1;for("boolean"==typeof g&&(j=g,g=arguments[h]||{},h++),"object"==typeof g||m.isFunction(g)||(g={}),h===i&&(g=this,h--);i>h;h++)if(null!=(e=arguments[h]))for(d in e)a=g[d],c=e[d],g!==c&&(j&&c&&(m.isPlainObject(c)||(b=m.isArray(c)))?(b?(b=!1,f=a&&m.isArray(a)?a:[]):f=a&&m.isPlainObject(a)?a:{},g[d]=m.extend(j,f,c)):void 0!==c&&(g[d]=c));return g},m.extend({expando:"jQuery"+(l+Math.random()).replace(/\D/g,""),isReady:!0,error:function(a){throw new Error(a)},noop:function(){},isFunction:function(a){return"function"===m.type(a)},isArray:Array.isArray||function(a){return"array"===m.type(a)},isWindow:function(a){return null!=a&&a==a.window},isNumeric:function(a){return!m.isArray(a)&&a-parseFloat(a)+1>=0},isEmptyObject:function(a){var b;for(b in a)return!1;return!0},isPlainObject:function(a){var b;if(!a||"object"!==m.type(a)||a.nodeType||m.isWindow(a))return!1;try{if(a.constructor&&!j.call(a,"constructor")&&!j.call(a.constructor.prototype,"isPrototypeOf"))return!1}catch(c){return!1}if(k.ownLast)for(b in a)return j.call(a,b);for(b in a);return void 0===b||j.call(a,b)},type:function(a){return null==a?a+"":"object"==typeof a||"function"==typeof a?h[i.call(a)]||"object":typeof a},globalEval:function(b){b&&m.trim(b)&&(a.execScript||function(b){a.eval.call(a,b)})(b)},camelCase:function(a){return a.replace(o,"ms-").replace(p,q)},nodeName:function(a,b){return a.nodeName&&a.nodeName.toLowerCase()===b.toLowerCase()},each:function(a,b,c){var d,e=0,f=a.length,g=r(a);if(c){if(g){for(;f>e;e++)if(d=b.apply(a[e],c),d===!1)break}else for(e in a)if(d=b.apply(a[e],c),d===!1)break}else if(g){for(;f>e;e++)if(d=b.call(a[e],e,a[e]),d===!1)break}else for(e in a)if(d=b.call(a[e],e,a[e]),d===!1)break;return a},trim:function(a){return null==a?"":(a+"").replace(n,"")},makeArray:function(a,b){var c=b||[];return null!=a&&(r(Object(a))?m.merge(c,"string"==typeof a?[a]:a):f.call(c,a)),c},inArray:function(a,b,c){var d;if(b){if(g)return g.call(b,a,c);for(d=b.length,c=c?0>c?Math.max(0,d+c):c:0;d>c;c++)if(c in b&&b[c]===a)return c}return-1},merge:function(a,b){var c=+b.length,d=0,e=a.length;while(c>d)a[e++]=b[d++];if(c!==c)while(void 0!==b[d])a[e++]=b[d++];return a.length=e,a},grep:function(a,b,c){for(var d,e=[],f=0,g=a.length,h=!c;g>f;f++)d=!b(a[f],f),d!==h&&e.push(a[f]);return e},map:function(a,b,c){var d,f=0,g=a.length,h=r(a),i=[];if(h)for(;g>f;f++)d=b(a[f],f,c),null!=d&&i.push(d);else for(f in a)d=b(a[f],f,c),null!=d&&i.push(d);return e.apply([],i)},guid:1,proxy:function(a,b){var c,e,f;return"string"==typeof b&&(f=a[b],b=a,a=f),m.isFunction(a)?(c=d.call(arguments,2),e=function(){return a.apply(b||this,c.concat(d.call(arguments)))},e.guid=a.guid=a.guid||m.guid++,e):void 0},now:function(){return+new Date},support:k}),m.each("Boolean Number String Function Array Date RegExp Object Error".split(" "),function(a,b){h["[object "+b+"]"]=b.toLowerCase()});function r(a){var b="length"in a&&a.length,c=m.type(a);return"function"===c||m.isWindow(a)?!1:1===a.nodeType&&b?!0:"array"===c||0===b||"number"==typeof b&&b>0&&b-1 in a}var s=function(a){var b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u="sizzle"+1*new Date,v=a.document,w=0,x=0,y=ha(),z=ha(),A=ha(),B=function(a,b){return a===b&&(l=!0),0},C=1<<31,D={}.hasOwnProperty,E=[],F=E.pop,G=E.push,H=E.push,I=E.slice,J=function(a,b){for(var c=0,d=a.length;d>c;c++)if(a[c]===b)return c;return-1},K="checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",L="[\\x20\\t\\r\\n\\f]",M="(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+",N=M.replace("w","w#"),O="\\["+L+"*("+M+")(?:"+L+"*([*^$|!~]?=)"+L+"*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|("+N+"))|)"+L+"*\\]",P=":("+M+")(?:\\((('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|((?:\\\\.|[^\\\\()[\\]]|"+O+")*)|.*)\\)|)",Q=new RegExp(L+"+","g"),R=new RegExp("^"+L+"+|((?:^|[^\\\\])(?:\\\\.)*)"+L+"+$","g"),S=new RegExp("^"+L+"*,"+L+"*"),T=new RegExp("^"+L+"*([>+~]|"+L+")"+L+"*"),U=new RegExp("="+L+"*([^\\]'\"]*?)"+L+"*\\]","g"),V=new RegExp(P),W=new RegExp("^"+N+"$"),X={ID:new RegExp("^#("+M+")"),CLASS:new RegExp("^\\.("+M+")"),TAG:new RegExp("^("+M.replace("w","w*")+")"),ATTR:new RegExp("^"+O),PSEUDO:new RegExp("^"+P),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+L+"*(even|odd|(([+-]|)(\\d*)n|)"+L+"*(?:([+-]|)"+L+"*(\\d+)|))"+L+"*\\)|)","i"),bool:new RegExp("^(?:"+K+")$","i"),needsContext:new RegExp("^"+L+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+L+"*((?:-\\d)?\\d*)"+L+"*\\)|)(?=[^-]|$)","i")},Y=/^(?:input|select|textarea|button)$/i,Z=/^h\d$/i,$=/^[^{]+\{\s*\[native \w/,_=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,aa=/[+~]/,ba=/'|\\/g,ca=new RegExp("\\\\([\\da-f]{1,6}"+L+"?|("+L+")|.)","ig"),da=function(a,b,c){var d="0x"+b-65536;return d!==d||c?b:0>d?String.fromCharCode(d+65536):String.fromCharCode(d>>10|55296,1023&d|56320)},ea=function(){m()};try{H.apply(E=I.call(v.childNodes),v.childNodes),E[v.childNodes.length].nodeType}catch(fa){H={apply:E.length?function(a,b){G.apply(a,I.call(b))}:function(a,b){var c=a.length,d=0;while(a[c++]=b[d++]);a.length=c-1}}}function ga(a,b,d,e){var f,h,j,k,l,o,r,s,w,x;if((b?b.ownerDocument||b:v)!==n&&m(b),b=b||n,d=d||[],k=b.nodeType,"string"!=typeof a||!a||1!==k&&9!==k&&11!==k)return d;if(!e&&p){if(11!==k&&(f=_.exec(a)))if(j=f[1]){if(9===k){if(h=b.getElementById(j),!h||!h.parentNode)return d;if(h.id===j)return d.push(h),d}else if(b.ownerDocument&&(h=b.ownerDocument.getElementById(j))&&t(b,h)&&h.id===j)return d.push(h),d}else{if(f[2])return H.apply(d,b.getElementsByTagName(a)),d;if((j=f[3])&&c.getElementsByClassName)return H.apply(d,b.getElementsByClassName(j)),d}if(c.qsa&&(!q||!q.test(a))){if(s=r=u,w=b,x=1!==k&&a,1===k&&"object"!==b.nodeName.toLowerCase()){o=g(a),(r=b.getAttribute("id"))?s=r.replace(ba,"\\$&"):b.setAttribute("id",s),s="[id='"+s+"'] ",l=o.length;while(l--)o[l]=s+ra(o[l]);w=aa.test(a)&&pa(b.parentNode)||b,x=o.join(",")}if(x)try{return H.apply(d,w.querySelectorAll(x)),d}catch(y){}finally{r||b.removeAttribute("id")}}}return i(a.replace(R,"$1"),b,d,e)}function ha(){var a=[];function b(c,e){return a.push(c+" ")>d.cacheLength&&delete b[a.shift()],b[c+" "]=e}return b}function ia(a){return a[u]=!0,a}function ja(a){var b=n.createElement("div");try{return!!a(b)}catch(c){return!1}finally{b.parentNode&&b.parentNode.removeChild(b),b=null}}function ka(a,b){var c=a.split("|"),e=a.length;while(e--)d.attrHandle[c[e]]=b}function la(a,b){var c=b&&a,d=c&&1===a.nodeType&&1===b.nodeType&&(~b.sourceIndex||C)-(~a.sourceIndex||C);if(d)return d;if(c)while(c=c.nextSibling)if(c===b)return-1;return a?1:-1}function ma(a){return function(b){var c=b.nodeName.toLowerCase();return"input"===c&&b.type===a}}function na(a){return function(b){var c=b.nodeName.toLowerCase();return("input"===c||"button"===c)&&b.type===a}}function oa(a){return ia(function(b){return b=+b,ia(function(c,d){var e,f=a([],c.length,b),g=f.length;while(g--)c[e=f[g]]&&(c[e]=!(d[e]=c[e]))})})}function pa(a){return a&&"undefined"!=typeof a.getElementsByTagName&&a}c=ga.support={},f=ga.isXML=function(a){var b=a&&(a.ownerDocument||a).documentElement;return b?"HTML"!==b.nodeName:!1},m=ga.setDocument=function(a){var b,e,g=a?a.ownerDocument||a:v;return g!==n&&9===g.nodeType&&g.documentElement?(n=g,o=g.documentElement,e=g.defaultView,e&&e!==e.top&&(e.addEventListener?e.addEventListener("unload",ea,!1):e.attachEvent&&e.attachEvent("onunload",ea)),p=!f(g),c.attributes=ja(function(a){return a.className="i",!a.getAttribute("className")}),c.getElementsByTagName=ja(function(a){return a.appendChild(g.createComment("")),!a.getElementsByTagName("*").length}),c.getElementsByClassName=$.test(g.getElementsByClassName),c.getById=ja(function(a){return o.appendChild(a).id=u,!g.getElementsByName||!g.getElementsByName(u).length}),c.getById?(d.find.ID=function(a,b){if("undefined"!=typeof b.getElementById&&p){var c=b.getElementById(a);return c&&c.parentNode?[c]:[]}},d.filter.ID=function(a){var b=a.replace(ca,da);return function(a){return a.getAttribute("id")===b}}):(delete d.find.ID,d.filter.ID=function(a){var b=a.replace(ca,da);return function(a){var c="undefined"!=typeof a.getAttributeNode&&a.getAttributeNode("id");return c&&c.value===b}}),d.find.TAG=c.getElementsByTagName?function(a,b){return"undefined"!=typeof b.getElementsByTagName?b.getElementsByTagName(a):c.qsa?b.querySelectorAll(a):void 0}:function(a,b){var c,d=[],e=0,f=b.getElementsByTagName(a);if("*"===a){while(c=f[e++])1===c.nodeType&&d.push(c);return d}return f},d.find.CLASS=c.getElementsByClassName&&function(a,b){return p?b.getElementsByClassName(a):void 0},r=[],q=[],(c.qsa=$.test(g.querySelectorAll))&&(ja(function(a){o.appendChild(a).innerHTML="",a.querySelectorAll("[msallowcapture^='']").length&&q.push("[*^$]="+L+"*(?:''|\"\")"),a.querySelectorAll("[selected]").length||q.push("\\["+L+"*(?:value|"+K+")"),a.querySelectorAll("[id~="+u+"-]").length||q.push("~="),a.querySelectorAll(":checked").length||q.push(":checked"),a.querySelectorAll("a#"+u+"+*").length||q.push(".#.+[+~]")}),ja(function(a){var b=g.createElement("input");b.setAttribute("type","hidden"),a.appendChild(b).setAttribute("name","D"),a.querySelectorAll("[name=d]").length&&q.push("name"+L+"*[*^$|!~]?="),a.querySelectorAll(":enabled").length||q.push(":enabled",":disabled"),a.querySelectorAll("*,:x"),q.push(",.*:")})),(c.matchesSelector=$.test(s=o.matches||o.webkitMatchesSelector||o.mozMatchesSelector||o.oMatchesSelector||o.msMatchesSelector))&&ja(function(a){c.disconnectedMatch=s.call(a,"div"),s.call(a,"[s!='']:x"),r.push("!=",P)}),q=q.length&&new RegExp(q.join("|")),r=r.length&&new RegExp(r.join("|")),b=$.test(o.compareDocumentPosition),t=b||$.test(o.contains)?function(a,b){var c=9===a.nodeType?a.documentElement:a,d=b&&b.parentNode;return a===d||!(!d||1!==d.nodeType||!(c.contains?c.contains(d):a.compareDocumentPosition&&16&a.compareDocumentPosition(d)))}:function(a,b){if(b)while(b=b.parentNode)if(b===a)return!0;return!1},B=b?function(a,b){if(a===b)return l=!0,0;var d=!a.compareDocumentPosition-!b.compareDocumentPosition;return d?d:(d=(a.ownerDocument||a)===(b.ownerDocument||b)?a.compareDocumentPosition(b):1,1&d||!c.sortDetached&&b.compareDocumentPosition(a)===d?a===g||a.ownerDocument===v&&t(v,a)?-1:b===g||b.ownerDocument===v&&t(v,b)?1:k?J(k,a)-J(k,b):0:4&d?-1:1)}:function(a,b){if(a===b)return l=!0,0;var c,d=0,e=a.parentNode,f=b.parentNode,h=[a],i=[b];if(!e||!f)return a===g?-1:b===g?1:e?-1:f?1:k?J(k,a)-J(k,b):0;if(e===f)return la(a,b);c=a;while(c=c.parentNode)h.unshift(c);c=b;while(c=c.parentNode)i.unshift(c);while(h[d]===i[d])d++;return d?la(h[d],i[d]):h[d]===v?-1:i[d]===v?1:0},g):n},ga.matches=function(a,b){return ga(a,null,null,b)},ga.matchesSelector=function(a,b){if((a.ownerDocument||a)!==n&&m(a),b=b.replace(U,"='$1']"),!(!c.matchesSelector||!p||r&&r.test(b)||q&&q.test(b)))try{var d=s.call(a,b);if(d||c.disconnectedMatch||a.document&&11!==a.document.nodeType)return d}catch(e){}return ga(b,n,null,[a]).length>0},ga.contains=function(a,b){return(a.ownerDocument||a)!==n&&m(a),t(a,b)},ga.attr=function(a,b){(a.ownerDocument||a)!==n&&m(a);var e=d.attrHandle[b.toLowerCase()],f=e&&D.call(d.attrHandle,b.toLowerCase())?e(a,b,!p):void 0;return void 0!==f?f:c.attributes||!p?a.getAttribute(b):(f=a.getAttributeNode(b))&&f.specified?f.value:null},ga.error=function(a){throw new Error("Syntax error, unrecognized expression: "+a)},ga.uniqueSort=function(a){var b,d=[],e=0,f=0;if(l=!c.detectDuplicates,k=!c.sortStable&&a.slice(0),a.sort(B),l){while(b=a[f++])b===a[f]&&(e=d.push(f));while(e--)a.splice(d[e],1)}return k=null,a},e=ga.getText=function(a){var b,c="",d=0,f=a.nodeType;if(f){if(1===f||9===f||11===f){if("string"==typeof a.textContent)return a.textContent;for(a=a.firstChild;a;a=a.nextSibling)c+=e(a)}else if(3===f||4===f)return a.nodeValue}else while(b=a[d++])c+=e(b);return c},d=ga.selectors={cacheLength:50,createPseudo:ia,match:X,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(a){return a[1]=a[1].replace(ca,da),a[3]=(a[3]||a[4]||a[5]||"").replace(ca,da),"~="===a[2]&&(a[3]=" "+a[3]+" "),a.slice(0,4)},CHILD:function(a){return a[1]=a[1].toLowerCase(),"nth"===a[1].slice(0,3)?(a[3]||ga.error(a[0]),a[4]=+(a[4]?a[5]+(a[6]||1):2*("even"===a[3]||"odd"===a[3])),a[5]=+(a[7]+a[8]||"odd"===a[3])):a[3]&&ga.error(a[0]),a},PSEUDO:function(a){var b,c=!a[6]&&a[2];return X.CHILD.test(a[0])?null:(a[3]?a[2]=a[4]||a[5]||"":c&&V.test(c)&&(b=g(c,!0))&&(b=c.indexOf(")",c.length-b)-c.length)&&(a[0]=a[0].slice(0,b),a[2]=c.slice(0,b)),a.slice(0,3))}},filter:{TAG:function(a){var b=a.replace(ca,da).toLowerCase();return"*"===a?function(){return!0}:function(a){return a.nodeName&&a.nodeName.toLowerCase()===b}},CLASS:function(a){var b=y[a+" "];return b||(b=new RegExp("(^|"+L+")"+a+"("+L+"|$)"))&&y(a,function(a){return b.test("string"==typeof a.className&&a.className||"undefined"!=typeof a.getAttribute&&a.getAttribute("class")||"")})},ATTR:function(a,b,c){return function(d){var e=ga.attr(d,a);return null==e?"!="===b:b?(e+="","="===b?e===c:"!="===b?e!==c:"^="===b?c&&0===e.indexOf(c):"*="===b?c&&e.indexOf(c)>-1:"$="===b?c&&e.slice(-c.length)===c:"~="===b?(" "+e.replace(Q," ")+" ").indexOf(c)>-1:"|="===b?e===c||e.slice(0,c.length+1)===c+"-":!1):!0}},CHILD:function(a,b,c,d,e){var f="nth"!==a.slice(0,3),g="last"!==a.slice(-4),h="of-type"===b;return 1===d&&0===e?function(a){return!!a.parentNode}:function(b,c,i){var j,k,l,m,n,o,p=f!==g?"nextSibling":"previousSibling",q=b.parentNode,r=h&&b.nodeName.toLowerCase(),s=!i&&!h;if(q){if(f){while(p){l=b;while(l=l[p])if(h?l.nodeName.toLowerCase()===r:1===l.nodeType)return!1;o=p="only"===a&&!o&&"nextSibling"}return!0}if(o=[g?q.firstChild:q.lastChild],g&&s){k=q[u]||(q[u]={}),j=k[a]||[],n=j[0]===w&&j[1],m=j[0]===w&&j[2],l=n&&q.childNodes[n];while(l=++n&&l&&l[p]||(m=n=0)||o.pop())if(1===l.nodeType&&++m&&l===b){k[a]=[w,n,m];break}}else if(s&&(j=(b[u]||(b[u]={}))[a])&&j[0]===w)m=j[1];else while(l=++n&&l&&l[p]||(m=n=0)||o.pop())if((h?l.nodeName.toLowerCase()===r:1===l.nodeType)&&++m&&(s&&((l[u]||(l[u]={}))[a]=[w,m]),l===b))break;return m-=e,m===d||m%d===0&&m/d>=0}}},PSEUDO:function(a,b){var c,e=d.pseudos[a]||d.setFilters[a.toLowerCase()]||ga.error("unsupported pseudo: "+a);return e[u]?e(b):e.length>1?(c=[a,a,"",b],d.setFilters.hasOwnProperty(a.toLowerCase())?ia(function(a,c){var d,f=e(a,b),g=f.length;while(g--)d=J(a,f[g]),a[d]=!(c[d]=f[g])}):function(a){return e(a,0,c)}):e}},pseudos:{not:ia(function(a){var b=[],c=[],d=h(a.replace(R,"$1"));return d[u]?ia(function(a,b,c,e){var f,g=d(a,null,e,[]),h=a.length;while(h--)(f=g[h])&&(a[h]=!(b[h]=f))}):function(a,e,f){return b[0]=a,d(b,null,f,c),b[0]=null,!c.pop()}}),has:ia(function(a){return function(b){return ga(a,b).length>0}}),contains:ia(function(a){return a=a.replace(ca,da),function(b){return(b.textContent||b.innerText||e(b)).indexOf(a)>-1}}),lang:ia(function(a){return W.test(a||"")||ga.error("unsupported lang: "+a),a=a.replace(ca,da).toLowerCase(),function(b){var c;do if(c=p?b.lang:b.getAttribute("xml:lang")||b.getAttribute("lang"))return c=c.toLowerCase(),c===a||0===c.indexOf(a+"-");while((b=b.parentNode)&&1===b.nodeType);return!1}}),target:function(b){var c=a.location&&a.location.hash;return c&&c.slice(1)===b.id},root:function(a){return a===o},focus:function(a){return a===n.activeElement&&(!n.hasFocus||n.hasFocus())&&!!(a.type||a.href||~a.tabIndex)},enabled:function(a){return a.disabled===!1},disabled:function(a){return a.disabled===!0},checked:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&!!a.checked||"option"===b&&!!a.selected},selected:function(a){return a.parentNode&&a.parentNode.selectedIndex,a.selected===!0},empty:function(a){for(a=a.firstChild;a;a=a.nextSibling)if(a.nodeType<6)return!1;return!0},parent:function(a){return!d.pseudos.empty(a)},header:function(a){return Z.test(a.nodeName)},input:function(a){return Y.test(a.nodeName)},button:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&"button"===a.type||"button"===b},text:function(a){var b;return"input"===a.nodeName.toLowerCase()&&"text"===a.type&&(null==(b=a.getAttribute("type"))||"text"===b.toLowerCase())},first:oa(function(){return[0]}),last:oa(function(a,b){return[b-1]}),eq:oa(function(a,b,c){return[0>c?c+b:c]}),even:oa(function(a,b){for(var c=0;b>c;c+=2)a.push(c);return a}),odd:oa(function(a,b){for(var c=1;b>c;c+=2)a.push(c);return a}),lt:oa(function(a,b,c){for(var d=0>c?c+b:c;--d>=0;)a.push(d);return a}),gt:oa(function(a,b,c){for(var d=0>c?c+b:c;++db;b++)d+=a[b].value;return d}function sa(a,b,c){var d=b.dir,e=c&&"parentNode"===d,f=x++;return b.first?function(b,c,f){while(b=b[d])if(1===b.nodeType||e)return a(b,c,f)}:function(b,c,g){var h,i,j=[w,f];if(g){while(b=b[d])if((1===b.nodeType||e)&&a(b,c,g))return!0}else while(b=b[d])if(1===b.nodeType||e){if(i=b[u]||(b[u]={}),(h=i[d])&&h[0]===w&&h[1]===f)return j[2]=h[2];if(i[d]=j,j[2]=a(b,c,g))return!0}}}function ta(a){return a.length>1?function(b,c,d){var e=a.length;while(e--)if(!a[e](b,c,d))return!1;return!0}:a[0]}function ua(a,b,c){for(var d=0,e=b.length;e>d;d++)ga(a,b[d],c);return c}function va(a,b,c,d,e){for(var f,g=[],h=0,i=a.length,j=null!=b;i>h;h++)(f=a[h])&&(!c||c(f,d,e))&&(g.push(f),j&&b.push(h));return g}function wa(a,b,c,d,e,f){return d&&!d[u]&&(d=wa(d)),e&&!e[u]&&(e=wa(e,f)),ia(function(f,g,h,i){var j,k,l,m=[],n=[],o=g.length,p=f||ua(b||"*",h.nodeType?[h]:h,[]),q=!a||!f&&b?p:va(p,m,a,h,i),r=c?e||(f?a:o||d)?[]:g:q;if(c&&c(q,r,h,i),d){j=va(r,n),d(j,[],h,i),k=j.length;while(k--)(l=j[k])&&(r[n[k]]=!(q[n[k]]=l))}if(f){if(e||a){if(e){j=[],k=r.length;while(k--)(l=r[k])&&j.push(q[k]=l);e(null,r=[],j,i)}k=r.length;while(k--)(l=r[k])&&(j=e?J(f,l):m[k])>-1&&(f[j]=!(g[j]=l))}}else r=va(r===g?r.splice(o,r.length):r),e?e(null,g,r,i):H.apply(g,r)})}function xa(a){for(var b,c,e,f=a.length,g=d.relative[a[0].type],h=g||d.relative[" "],i=g?1:0,k=sa(function(a){return a===b},h,!0),l=sa(function(a){return J(b,a)>-1},h,!0),m=[function(a,c,d){var e=!g&&(d||c!==j)||((b=c).nodeType?k(a,c,d):l(a,c,d));return b=null,e}];f>i;i++)if(c=d.relative[a[i].type])m=[sa(ta(m),c)];else{if(c=d.filter[a[i].type].apply(null,a[i].matches),c[u]){for(e=++i;f>e;e++)if(d.relative[a[e].type])break;return wa(i>1&&ta(m),i>1&&ra(a.slice(0,i-1).concat({value:" "===a[i-2].type?"*":""})).replace(R,"$1"),c,e>i&&xa(a.slice(i,e)),f>e&&xa(a=a.slice(e)),f>e&&ra(a))}m.push(c)}return ta(m)}function ya(a,b){var c=b.length>0,e=a.length>0,f=function(f,g,h,i,k){var l,m,o,p=0,q="0",r=f&&[],s=[],t=j,u=f||e&&d.find.TAG("*",k),v=w+=null==t?1:Math.random()||.1,x=u.length;for(k&&(j=g!==n&&g);q!==x&&null!=(l=u[q]);q++){if(e&&l){m=0;while(o=a[m++])if(o(l,g,h)){i.push(l);break}k&&(w=v)}c&&((l=!o&&l)&&p--,f&&r.push(l))}if(p+=q,c&&q!==p){m=0;while(o=b[m++])o(r,s,g,h);if(f){if(p>0)while(q--)r[q]||s[q]||(s[q]=F.call(i));s=va(s)}H.apply(i,s),k&&!f&&s.length>0&&p+b.length>1&&ga.uniqueSort(i)}return k&&(w=v,j=t),r};return c?ia(f):f}return h=ga.compile=function(a,b){var c,d=[],e=[],f=A[a+" "];if(!f){b||(b=g(a)),c=b.length;while(c--)f=xa(b[c]),f[u]?d.push(f):e.push(f);f=A(a,ya(e,d)),f.selector=a}return f},i=ga.select=function(a,b,e,f){var i,j,k,l,m,n="function"==typeof a&&a,o=!f&&g(a=n.selector||a);if(e=e||[],1===o.length){if(j=o[0]=o[0].slice(0),j.length>2&&"ID"===(k=j[0]).type&&c.getById&&9===b.nodeType&&p&&d.relative[j[1].type]){if(b=(d.find.ID(k.matches[0].replace(ca,da),b)||[])[0],!b)return e;n&&(b=b.parentNode),a=a.slice(j.shift().value.length)}i=X.needsContext.test(a)?0:j.length;while(i--){if(k=j[i],d.relative[l=k.type])break;if((m=d.find[l])&&(f=m(k.matches[0].replace(ca,da),aa.test(j[0].type)&&pa(b.parentNode)||b))){if(j.splice(i,1),a=f.length&&ra(j),!a)return H.apply(e,f),e;break}}}return(n||h(a,o))(f,b,!p,e,aa.test(a)&&pa(b.parentNode)||b),e},c.sortStable=u.split("").sort(B).join("")===u,c.detectDuplicates=!!l,m(),c.sortDetached=ja(function(a){return 1&a.compareDocumentPosition(n.createElement("div"))}),ja(function(a){return a.innerHTML="","#"===a.firstChild.getAttribute("href")})||ka("type|href|height|width",function(a,b,c){return c?void 0:a.getAttribute(b,"type"===b.toLowerCase()?1:2)}),c.attributes&&ja(function(a){return a.innerHTML="",a.firstChild.setAttribute("value",""),""===a.firstChild.getAttribute("value")})||ka("value",function(a,b,c){return c||"input"!==a.nodeName.toLowerCase()?void 0:a.defaultValue}),ja(function(a){return null==a.getAttribute("disabled")})||ka(K,function(a,b,c){var d;return c?void 0:a[b]===!0?b.toLowerCase():(d=a.getAttributeNode(b))&&d.specified?d.value:null}),ga}(a);m.find=s,m.expr=s.selectors,m.expr[":"]=m.expr.pseudos,m.unique=s.uniqueSort,m.text=s.getText,m.isXMLDoc=s.isXML,m.contains=s.contains;var t=m.expr.match.needsContext,u=/^<(\w+)\s*\/?>(?:<\/\1>|)$/,v=/^.[^:#\[\.,]*$/;function w(a,b,c){if(m.isFunction(b))return m.grep(a,function(a,d){return!!b.call(a,d,a)!==c});if(b.nodeType)return m.grep(a,function(a){return a===b!==c});if("string"==typeof b){if(v.test(b))return m.filter(b,a,c);b=m.filter(b,a)}return m.grep(a,function(a){return m.inArray(a,b)>=0!==c})}m.filter=function(a,b,c){var d=b[0];return c&&(a=":not("+a+")"),1===b.length&&1===d.nodeType?m.find.matchesSelector(d,a)?[d]:[]:m.find.matches(a,m.grep(b,function(a){return 1===a.nodeType}))},m.fn.extend({find:function(a){var b,c=[],d=this,e=d.length;if("string"!=typeof a)return this.pushStack(m(a).filter(function(){for(b=0;e>b;b++)if(m.contains(d[b],this))return!0}));for(b=0;e>b;b++)m.find(a,d[b],c);return c=this.pushStack(e>1?m.unique(c):c),c.selector=this.selector?this.selector+" "+a:a,c},filter:function(a){return this.pushStack(w(this,a||[],!1))},not:function(a){return this.pushStack(w(this,a||[],!0))},is:function(a){return!!w(this,"string"==typeof a&&t.test(a)?m(a):a||[],!1).length}});var x,y=a.document,z=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/,A=m.fn.init=function(a,b){var c,d;if(!a)return this;if("string"==typeof a){if(c="<"===a.charAt(0)&&">"===a.charAt(a.length-1)&&a.length>=3?[null,a,null]:z.exec(a),!c||!c[1]&&b)return!b||b.jquery?(b||x).find(a):this.constructor(b).find(a);if(c[1]){if(b=b instanceof m?b[0]:b,m.merge(this,m.parseHTML(c[1],b&&b.nodeType?b.ownerDocument||b:y,!0)),u.test(c[1])&&m.isPlainObject(b))for(c in b)m.isFunction(this[c])?this[c](b[c]):this.attr(c,b[c]);return this}if(d=y.getElementById(c[2]),d&&d.parentNode){if(d.id!==c[2])return x.find(a);this.length=1,this[0]=d}return this.context=y,this.selector=a,this}return a.nodeType?(this.context=this[0]=a,this.length=1,this):m.isFunction(a)?"undefined"!=typeof x.ready?x.ready(a):a(m):(void 0!==a.selector&&(this.selector=a.selector,this.context=a.context),m.makeArray(a,this))};A.prototype=m.fn,x=m(y);var B=/^(?:parents|prev(?:Until|All))/,C={children:!0,contents:!0,next:!0,prev:!0};m.extend({dir:function(a,b,c){var d=[],e=a[b];while(e&&9!==e.nodeType&&(void 0===c||1!==e.nodeType||!m(e).is(c)))1===e.nodeType&&d.push(e),e=e[b];return d},sibling:function(a,b){for(var c=[];a;a=a.nextSibling)1===a.nodeType&&a!==b&&c.push(a);return c}}),m.fn.extend({has:function(a){var b,c=m(a,this),d=c.length;return this.filter(function(){for(b=0;d>b;b++)if(m.contains(this,c[b]))return!0})},closest:function(a,b){for(var c,d=0,e=this.length,f=[],g=t.test(a)||"string"!=typeof a?m(a,b||this.context):0;e>d;d++)for(c=this[d];c&&c!==b;c=c.parentNode)if(c.nodeType<11&&(g?g.index(c)>-1:1===c.nodeType&&m.find.matchesSelector(c,a))){f.push(c);break}return this.pushStack(f.length>1?m.unique(f):f)},index:function(a){return a?"string"==typeof a?m.inArray(this[0],m(a)):m.inArray(a.jquery?a[0]:a,this):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(a,b){return this.pushStack(m.unique(m.merge(this.get(),m(a,b))))},addBack:function(a){return this.add(null==a?this.prevObject:this.prevObject.filter(a))}});function D(a,b){do a=a[b];while(a&&1!==a.nodeType);return a}m.each({parent:function(a){var b=a.parentNode;return b&&11!==b.nodeType?b:null},parents:function(a){return m.dir(a,"parentNode")},parentsUntil:function(a,b,c){return m.dir(a,"parentNode",c)},next:function(a){return D(a,"nextSibling")},prev:function(a){return D(a,"previousSibling")},nextAll:function(a){return m.dir(a,"nextSibling")},prevAll:function(a){return m.dir(a,"previousSibling")},nextUntil:function(a,b,c){return m.dir(a,"nextSibling",c)},prevUntil:function(a,b,c){return m.dir(a,"previousSibling",c)},siblings:function(a){return m.sibling((a.parentNode||{}).firstChild,a)},children:function(a){return m.sibling(a.firstChild)},contents:function(a){return m.nodeName(a,"iframe")?a.contentDocument||a.contentWindow.document:m.merge([],a.childNodes)}},function(a,b){m.fn[a]=function(c,d){var e=m.map(this,b,c);return"Until"!==a.slice(-5)&&(d=c),d&&"string"==typeof d&&(e=m.filter(d,e)),this.length>1&&(C[a]||(e=m.unique(e)),B.test(a)&&(e=e.reverse())),this.pushStack(e)}});var E=/\S+/g,F={};function G(a){var b=F[a]={};return m.each(a.match(E)||[],function(a,c){b[c]=!0}),b}m.Callbacks=function(a){a="string"==typeof a?F[a]||G(a):m.extend({},a);var b,c,d,e,f,g,h=[],i=!a.once&&[],j=function(l){for(c=a.memory&&l,d=!0,f=g||0,g=0,e=h.length,b=!0;h&&e>f;f++)if(h[f].apply(l[0],l[1])===!1&&a.stopOnFalse){c=!1;break}b=!1,h&&(i?i.length&&j(i.shift()):c?h=[]:k.disable())},k={add:function(){if(h){var d=h.length;!function f(b){m.each(b,function(b,c){var d=m.type(c);"function"===d?a.unique&&k.has(c)||h.push(c):c&&c.length&&"string"!==d&&f(c)})}(arguments),b?e=h.length:c&&(g=d,j(c))}return this},remove:function(){return h&&m.each(arguments,function(a,c){var d;while((d=m.inArray(c,h,d))>-1)h.splice(d,1),b&&(e>=d&&e--,f>=d&&f--)}),this},has:function(a){return a?m.inArray(a,h)>-1:!(!h||!h.length)},empty:function(){return h=[],e=0,this},disable:function(){return h=i=c=void 0,this},disabled:function(){return!h},lock:function(){return i=void 0,c||k.disable(),this},locked:function(){return!i},fireWith:function(a,c){return!h||d&&!i||(c=c||[],c=[a,c.slice?c.slice():c],b?i.push(c):j(c)),this},fire:function(){return k.fireWith(this,arguments),this},fired:function(){return!!d}};return k},m.extend({Deferred:function(a){var b=[["resolve","done",m.Callbacks("once memory"),"resolved"],["reject","fail",m.Callbacks("once memory"),"rejected"],["notify","progress",m.Callbacks("memory")]],c="pending",d={state:function(){return c},always:function(){return e.done(arguments).fail(arguments),this},then:function(){var a=arguments;return m.Deferred(function(c){m.each(b,function(b,f){var g=m.isFunction(a[b])&&a[b];e[f[1]](function(){var a=g&&g.apply(this,arguments);a&&m.isFunction(a.promise)?a.promise().done(c.resolve).fail(c.reject).progress(c.notify):c[f[0]+"With"](this===d?c.promise():this,g?[a]:arguments)})}),a=null}).promise()},promise:function(a){return null!=a?m.extend(a,d):d}},e={};return d.pipe=d.then,m.each(b,function(a,f){var g=f[2],h=f[3];d[f[1]]=g.add,h&&g.add(function(){c=h},b[1^a][2].disable,b[2][2].lock),e[f[0]]=function(){return e[f[0]+"With"](this===e?d:this,arguments),this},e[f[0]+"With"]=g.fireWith}),d.promise(e),a&&a.call(e,e),e},when:function(a){var b=0,c=d.call(arguments),e=c.length,f=1!==e||a&&m.isFunction(a.promise)?e:0,g=1===f?a:m.Deferred(),h=function(a,b,c){return function(e){b[a]=this,c[a]=arguments.length>1?d.call(arguments):e,c===i?g.notifyWith(b,c):--f||g.resolveWith(b,c)}},i,j,k;if(e>1)for(i=new Array(e),j=new Array(e),k=new Array(e);e>b;b++)c[b]&&m.isFunction(c[b].promise)?c[b].promise().done(h(b,k,c)).fail(g.reject).progress(h(b,j,i)):--f;return f||g.resolveWith(k,c),g.promise()}});var H;m.fn.ready=function(a){return m.ready.promise().done(a),this},m.extend({isReady:!1,readyWait:1,holdReady:function(a){a?m.readyWait++:m.ready(!0)},ready:function(a){if(a===!0?!--m.readyWait:!m.isReady){if(!y.body)return setTimeout(m.ready);m.isReady=!0,a!==!0&&--m.readyWait>0||(H.resolveWith(y,[m]),m.fn.triggerHandler&&(m(y).triggerHandler("ready"),m(y).off("ready")))}}});function I(){y.addEventListener?(y.removeEventListener("DOMContentLoaded",J,!1),a.removeEventListener("load",J,!1)):(y.detachEvent("onreadystatechange",J),a.detachEvent("onload",J))}function J(){(y.addEventListener||"load"===event.type||"complete"===y.readyState)&&(I(),m.ready())}m.ready.promise=function(b){if(!H)if(H=m.Deferred(),"complete"===y.readyState)setTimeout(m.ready);else if(y.addEventListener)y.addEventListener("DOMContentLoaded",J,!1),a.addEventListener("load",J,!1);else{y.attachEvent("onreadystatechange",J),a.attachEvent("onload",J);var c=!1;try{c=null==a.frameElement&&y.documentElement}catch(d){}c&&c.doScroll&&!function e(){if(!m.isReady){try{c.doScroll("left")}catch(a){return setTimeout(e,50)}I(),m.ready()}}()}return H.promise(b)};var K="undefined",L;for(L in m(k))break;k.ownLast="0"!==L,k.inlineBlockNeedsLayout=!1,m(function(){var a,b,c,d;c=y.getElementsByTagName("body")[0],c&&c.style&&(b=y.createElement("div"),d=y.createElement("div"),d.style.cssText="position:absolute;border:0;width:0;height:0;top:0;left:-9999px",c.appendChild(d).appendChild(b),typeof b.style.zoom!==K&&(b.style.cssText="display:inline;margin:0;border:0;padding:1px;width:1px;zoom:1",k.inlineBlockNeedsLayout=a=3===b.offsetWidth,a&&(c.style.zoom=1)),c.removeChild(d))}),function(){var a=y.createElement("div");if(null==k.deleteExpando){k.deleteExpando=!0;try{delete a.test}catch(b){k.deleteExpando=!1}}a=null}(),m.acceptData=function(a){var b=m.noData[(a.nodeName+" ").toLowerCase()],c=+a.nodeType||1;return 1!==c&&9!==c?!1:!b||b!==!0&&a.getAttribute("classid")===b};var M=/^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,N=/([A-Z])/g;function O(a,b,c){if(void 0===c&&1===a.nodeType){var d="data-"+b.replace(N,"-$1").toLowerCase();if(c=a.getAttribute(d),"string"==typeof c){try{c="true"===c?!0:"false"===c?!1:"null"===c?null:+c+""===c?+c:M.test(c)?m.parseJSON(c):c}catch(e){}m.data(a,b,c)}else c=void 0}return c}function P(a){var b;for(b in a)if(("data"!==b||!m.isEmptyObject(a[b]))&&"toJSON"!==b)return!1; ++ ++return!0}function Q(a,b,d,e){if(m.acceptData(a)){var f,g,h=m.expando,i=a.nodeType,j=i?m.cache:a,k=i?a[h]:a[h]&&h;if(k&&j[k]&&(e||j[k].data)||void 0!==d||"string"!=typeof b)return k||(k=i?a[h]=c.pop()||m.guid++:h),j[k]||(j[k]=i?{}:{toJSON:m.noop}),("object"==typeof b||"function"==typeof b)&&(e?j[k]=m.extend(j[k],b):j[k].data=m.extend(j[k].data,b)),g=j[k],e||(g.data||(g.data={}),g=g.data),void 0!==d&&(g[m.camelCase(b)]=d),"string"==typeof b?(f=g[b],null==f&&(f=g[m.camelCase(b)])):f=g,f}}function R(a,b,c){if(m.acceptData(a)){var d,e,f=a.nodeType,g=f?m.cache:a,h=f?a[m.expando]:m.expando;if(g[h]){if(b&&(d=c?g[h]:g[h].data)){m.isArray(b)?b=b.concat(m.map(b,m.camelCase)):b in d?b=[b]:(b=m.camelCase(b),b=b in d?[b]:b.split(" ")),e=b.length;while(e--)delete d[b[e]];if(c?!P(d):!m.isEmptyObject(d))return}(c||(delete g[h].data,P(g[h])))&&(f?m.cleanData([a],!0):k.deleteExpando||g!=g.window?delete g[h]:g[h]=null)}}}m.extend({cache:{},noData:{"applet ":!0,"embed ":!0,"object ":"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"},hasData:function(a){return a=a.nodeType?m.cache[a[m.expando]]:a[m.expando],!!a&&!P(a)},data:function(a,b,c){return Q(a,b,c)},removeData:function(a,b){return R(a,b)},_data:function(a,b,c){return Q(a,b,c,!0)},_removeData:function(a,b){return R(a,b,!0)}}),m.fn.extend({data:function(a,b){var c,d,e,f=this[0],g=f&&f.attributes;if(void 0===a){if(this.length&&(e=m.data(f),1===f.nodeType&&!m._data(f,"parsedAttrs"))){c=g.length;while(c--)g[c]&&(d=g[c].name,0===d.indexOf("data-")&&(d=m.camelCase(d.slice(5)),O(f,d,e[d])));m._data(f,"parsedAttrs",!0)}return e}return"object"==typeof a?this.each(function(){m.data(this,a)}):arguments.length>1?this.each(function(){m.data(this,a,b)}):f?O(f,a,m.data(f,a)):void 0},removeData:function(a){return this.each(function(){m.removeData(this,a)})}}),m.extend({queue:function(a,b,c){var d;return a?(b=(b||"fx")+"queue",d=m._data(a,b),c&&(!d||m.isArray(c)?d=m._data(a,b,m.makeArray(c)):d.push(c)),d||[]):void 0},dequeue:function(a,b){b=b||"fx";var c=m.queue(a,b),d=c.length,e=c.shift(),f=m._queueHooks(a,b),g=function(){m.dequeue(a,b)};"inprogress"===e&&(e=c.shift(),d--),e&&("fx"===b&&c.unshift("inprogress"),delete f.stop,e.call(a,g,f)),!d&&f&&f.empty.fire()},_queueHooks:function(a,b){var c=b+"queueHooks";return m._data(a,c)||m._data(a,c,{empty:m.Callbacks("once memory").add(function(){m._removeData(a,b+"queue"),m._removeData(a,c)})})}}),m.fn.extend({queue:function(a,b){var c=2;return"string"!=typeof a&&(b=a,a="fx",c--),arguments.lengthh;h++)b(a[h],c,g?d:d.call(a[h],h,b(a[h],c)));return e?a:j?b.call(a):i?b(a[0],c):f},W=/^(?:checkbox|radio)$/i;!function(){var a=y.createElement("input"),b=y.createElement("div"),c=y.createDocumentFragment();if(b.innerHTML="
    a",k.leadingWhitespace=3===b.firstChild.nodeType,k.tbody=!b.getElementsByTagName("tbody").length,k.htmlSerialize=!!b.getElementsByTagName("link").length,k.html5Clone="<:nav>"!==y.createElement("nav").cloneNode(!0).outerHTML,a.type="checkbox",a.checked=!0,c.appendChild(a),k.appendChecked=a.checked,b.innerHTML="",k.noCloneChecked=!!b.cloneNode(!0).lastChild.defaultValue,c.appendChild(b),b.innerHTML="",k.checkClone=b.cloneNode(!0).cloneNode(!0).lastChild.checked,k.noCloneEvent=!0,b.attachEvent&&(b.attachEvent("onclick",function(){k.noCloneEvent=!1}),b.cloneNode(!0).click()),null==k.deleteExpando){k.deleteExpando=!0;try{delete b.test}catch(d){k.deleteExpando=!1}}}(),function(){var b,c,d=y.createElement("div");for(b in{submit:!0,change:!0,focusin:!0})c="on"+b,(k[b+"Bubbles"]=c in a)||(d.setAttribute(c,"t"),k[b+"Bubbles"]=d.attributes[c].expando===!1);d=null}();var X=/^(?:input|select|textarea)$/i,Y=/^key/,Z=/^(?:mouse|pointer|contextmenu)|click/,$=/^(?:focusinfocus|focusoutblur)$/,_=/^([^.]*)(?:\.(.+)|)$/;function aa(){return!0}function ba(){return!1}function ca(){try{return y.activeElement}catch(a){}}m.event={global:{},add:function(a,b,c,d,e){var f,g,h,i,j,k,l,n,o,p,q,r=m._data(a);if(r){c.handler&&(i=c,c=i.handler,e=i.selector),c.guid||(c.guid=m.guid++),(g=r.events)||(g=r.events={}),(k=r.handle)||(k=r.handle=function(a){return typeof m===K||a&&m.event.triggered===a.type?void 0:m.event.dispatch.apply(k.elem,arguments)},k.elem=a),b=(b||"").match(E)||[""],h=b.length;while(h--)f=_.exec(b[h])||[],o=q=f[1],p=(f[2]||"").split(".").sort(),o&&(j=m.event.special[o]||{},o=(e?j.delegateType:j.bindType)||o,j=m.event.special[o]||{},l=m.extend({type:o,origType:q,data:d,handler:c,guid:c.guid,selector:e,needsContext:e&&m.expr.match.needsContext.test(e),namespace:p.join(".")},i),(n=g[o])||(n=g[o]=[],n.delegateCount=0,j.setup&&j.setup.call(a,d,p,k)!==!1||(a.addEventListener?a.addEventListener(o,k,!1):a.attachEvent&&a.attachEvent("on"+o,k))),j.add&&(j.add.call(a,l),l.handler.guid||(l.handler.guid=c.guid)),e?n.splice(n.delegateCount++,0,l):n.push(l),m.event.global[o]=!0);a=null}},remove:function(a,b,c,d,e){var f,g,h,i,j,k,l,n,o,p,q,r=m.hasData(a)&&m._data(a);if(r&&(k=r.events)){b=(b||"").match(E)||[""],j=b.length;while(j--)if(h=_.exec(b[j])||[],o=q=h[1],p=(h[2]||"").split(".").sort(),o){l=m.event.special[o]||{},o=(d?l.delegateType:l.bindType)||o,n=k[o]||[],h=h[2]&&new RegExp("(^|\\.)"+p.join("\\.(?:.*\\.|)")+"(\\.|$)"),i=f=n.length;while(f--)g=n[f],!e&&q!==g.origType||c&&c.guid!==g.guid||h&&!h.test(g.namespace)||d&&d!==g.selector&&("**"!==d||!g.selector)||(n.splice(f,1),g.selector&&n.delegateCount--,l.remove&&l.remove.call(a,g));i&&!n.length&&(l.teardown&&l.teardown.call(a,p,r.handle)!==!1||m.removeEvent(a,o,r.handle),delete k[o])}else for(o in k)m.event.remove(a,o+b[j],c,d,!0);m.isEmptyObject(k)&&(delete r.handle,m._removeData(a,"events"))}},trigger:function(b,c,d,e){var f,g,h,i,k,l,n,o=[d||y],p=j.call(b,"type")?b.type:b,q=j.call(b,"namespace")?b.namespace.split("."):[];if(h=l=d=d||y,3!==d.nodeType&&8!==d.nodeType&&!$.test(p+m.event.triggered)&&(p.indexOf(".")>=0&&(q=p.split("."),p=q.shift(),q.sort()),g=p.indexOf(":")<0&&"on"+p,b=b[m.expando]?b:new m.Event(p,"object"==typeof b&&b),b.isTrigger=e?2:3,b.namespace=q.join("."),b.namespace_re=b.namespace?new RegExp("(^|\\.)"+q.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,b.result=void 0,b.target||(b.target=d),c=null==c?[b]:m.makeArray(c,[b]),k=m.event.special[p]||{},e||!k.trigger||k.trigger.apply(d,c)!==!1)){if(!e&&!k.noBubble&&!m.isWindow(d)){for(i=k.delegateType||p,$.test(i+p)||(h=h.parentNode);h;h=h.parentNode)o.push(h),l=h;l===(d.ownerDocument||y)&&o.push(l.defaultView||l.parentWindow||a)}n=0;while((h=o[n++])&&!b.isPropagationStopped())b.type=n>1?i:k.bindType||p,f=(m._data(h,"events")||{})[b.type]&&m._data(h,"handle"),f&&f.apply(h,c),f=g&&h[g],f&&f.apply&&m.acceptData(h)&&(b.result=f.apply(h,c),b.result===!1&&b.preventDefault());if(b.type=p,!e&&!b.isDefaultPrevented()&&(!k._default||k._default.apply(o.pop(),c)===!1)&&m.acceptData(d)&&g&&d[p]&&!m.isWindow(d)){l=d[g],l&&(d[g]=null),m.event.triggered=p;try{d[p]()}catch(r){}m.event.triggered=void 0,l&&(d[g]=l)}return b.result}},dispatch:function(a){a=m.event.fix(a);var b,c,e,f,g,h=[],i=d.call(arguments),j=(m._data(this,"events")||{})[a.type]||[],k=m.event.special[a.type]||{};if(i[0]=a,a.delegateTarget=this,!k.preDispatch||k.preDispatch.call(this,a)!==!1){h=m.event.handlers.call(this,a,j),b=0;while((f=h[b++])&&!a.isPropagationStopped()){a.currentTarget=f.elem,g=0;while((e=f.handlers[g++])&&!a.isImmediatePropagationStopped())(!a.namespace_re||a.namespace_re.test(e.namespace))&&(a.handleObj=e,a.data=e.data,c=((m.event.special[e.origType]||{}).handle||e.handler).apply(f.elem,i),void 0!==c&&(a.result=c)===!1&&(a.preventDefault(),a.stopPropagation()))}return k.postDispatch&&k.postDispatch.call(this,a),a.result}},handlers:function(a,b){var c,d,e,f,g=[],h=b.delegateCount,i=a.target;if(h&&i.nodeType&&(!a.button||"click"!==a.type))for(;i!=this;i=i.parentNode||this)if(1===i.nodeType&&(i.disabled!==!0||"click"!==a.type)){for(e=[],f=0;h>f;f++)d=b[f],c=d.selector+" ",void 0===e[c]&&(e[c]=d.needsContext?m(c,this).index(i)>=0:m.find(c,this,null,[i]).length),e[c]&&e.push(d);e.length&&g.push({elem:i,handlers:e})}return h]","i"),ha=/^\s+/,ia=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi,ja=/<([\w:]+)/,ka=/\s*$/g,ra={option:[1,""],legend:[1,"
    ","
    "],area:[1,"",""],param:[1,"",""],thead:[1,"","
    "],tr:[2,"","
    "],col:[2,"","
    "],td:[3,"","
    "],_default:k.htmlSerialize?[0,"",""]:[1,"X
    ","
    "]},sa=da(y),ta=sa.appendChild(y.createElement("div"));ra.optgroup=ra.option,ra.tbody=ra.tfoot=ra.colgroup=ra.caption=ra.thead,ra.th=ra.td;function ua(a,b){var c,d,e=0,f=typeof a.getElementsByTagName!==K?a.getElementsByTagName(b||"*"):typeof a.querySelectorAll!==K?a.querySelectorAll(b||"*"):void 0;if(!f)for(f=[],c=a.childNodes||a;null!=(d=c[e]);e++)!b||m.nodeName(d,b)?f.push(d):m.merge(f,ua(d,b));return void 0===b||b&&m.nodeName(a,b)?m.merge([a],f):f}function va(a){W.test(a.type)&&(a.defaultChecked=a.checked)}function wa(a,b){return m.nodeName(a,"table")&&m.nodeName(11!==b.nodeType?b:b.firstChild,"tr")?a.getElementsByTagName("tbody")[0]||a.appendChild(a.ownerDocument.createElement("tbody")):a}function xa(a){return a.type=(null!==m.find.attr(a,"type"))+"/"+a.type,a}function ya(a){var b=pa.exec(a.type);return b?a.type=b[1]:a.removeAttribute("type"),a}function za(a,b){for(var c,d=0;null!=(c=a[d]);d++)m._data(c,"globalEval",!b||m._data(b[d],"globalEval"))}function Aa(a,b){if(1===b.nodeType&&m.hasData(a)){var c,d,e,f=m._data(a),g=m._data(b,f),h=f.events;if(h){delete g.handle,g.events={};for(c in h)for(d=0,e=h[c].length;e>d;d++)m.event.add(b,c,h[c][d])}g.data&&(g.data=m.extend({},g.data))}}function Ba(a,b){var c,d,e;if(1===b.nodeType){if(c=b.nodeName.toLowerCase(),!k.noCloneEvent&&b[m.expando]){e=m._data(b);for(d in e.events)m.removeEvent(b,d,e.handle);b.removeAttribute(m.expando)}"script"===c&&b.text!==a.text?(xa(b).text=a.text,ya(b)):"object"===c?(b.parentNode&&(b.outerHTML=a.outerHTML),k.html5Clone&&a.innerHTML&&!m.trim(b.innerHTML)&&(b.innerHTML=a.innerHTML)):"input"===c&&W.test(a.type)?(b.defaultChecked=b.checked=a.checked,b.value!==a.value&&(b.value=a.value)):"option"===c?b.defaultSelected=b.selected=a.defaultSelected:("input"===c||"textarea"===c)&&(b.defaultValue=a.defaultValue)}}m.extend({clone:function(a,b,c){var d,e,f,g,h,i=m.contains(a.ownerDocument,a);if(k.html5Clone||m.isXMLDoc(a)||!ga.test("<"+a.nodeName+">")?f=a.cloneNode(!0):(ta.innerHTML=a.outerHTML,ta.removeChild(f=ta.firstChild)),!(k.noCloneEvent&&k.noCloneChecked||1!==a.nodeType&&11!==a.nodeType||m.isXMLDoc(a)))for(d=ua(f),h=ua(a),g=0;null!=(e=h[g]);++g)d[g]&&Ba(e,d[g]);if(b)if(c)for(h=h||ua(a),d=d||ua(f),g=0;null!=(e=h[g]);g++)Aa(e,d[g]);else Aa(a,f);return d=ua(f,"script"),d.length>0&&za(d,!i&&ua(a,"script")),d=h=e=null,f},buildFragment:function(a,b,c,d){for(var e,f,g,h,i,j,l,n=a.length,o=da(b),p=[],q=0;n>q;q++)if(f=a[q],f||0===f)if("object"===m.type(f))m.merge(p,f.nodeType?[f]:f);else if(la.test(f)){h=h||o.appendChild(b.createElement("div")),i=(ja.exec(f)||["",""])[1].toLowerCase(),l=ra[i]||ra._default,h.innerHTML=l[1]+f.replace(ia,"<$1>")+l[2],e=l[0];while(e--)h=h.lastChild;if(!k.leadingWhitespace&&ha.test(f)&&p.push(b.createTextNode(ha.exec(f)[0])),!k.tbody){f="table"!==i||ka.test(f)?""!==l[1]||ka.test(f)?0:h:h.firstChild,e=f&&f.childNodes.length;while(e--)m.nodeName(j=f.childNodes[e],"tbody")&&!j.childNodes.length&&f.removeChild(j)}m.merge(p,h.childNodes),h.textContent="";while(h.firstChild)h.removeChild(h.firstChild);h=o.lastChild}else p.push(b.createTextNode(f));h&&o.removeChild(h),k.appendChecked||m.grep(ua(p,"input"),va),q=0;while(f=p[q++])if((!d||-1===m.inArray(f,d))&&(g=m.contains(f.ownerDocument,f),h=ua(o.appendChild(f),"script"),g&&za(h),c)){e=0;while(f=h[e++])oa.test(f.type||"")&&c.push(f)}return h=null,o},cleanData:function(a,b){for(var d,e,f,g,h=0,i=m.expando,j=m.cache,l=k.deleteExpando,n=m.event.special;null!=(d=a[h]);h++)if((b||m.acceptData(d))&&(f=d[i],g=f&&j[f])){if(g.events)for(e in g.events)n[e]?m.event.remove(d,e):m.removeEvent(d,e,g.handle);j[f]&&(delete j[f],l?delete d[i]:typeof d.removeAttribute!==K?d.removeAttribute(i):d[i]=null,c.push(f))}}}),m.fn.extend({text:function(a){return V(this,function(a){return void 0===a?m.text(this):this.empty().append((this[0]&&this[0].ownerDocument||y).createTextNode(a))},null,a,arguments.length)},append:function(){return this.domManip(arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=wa(this,a);b.appendChild(a)}})},prepend:function(){return this.domManip(arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=wa(this,a);b.insertBefore(a,b.firstChild)}})},before:function(){return this.domManip(arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this)})},after:function(){return this.domManip(arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this.nextSibling)})},remove:function(a,b){for(var c,d=a?m.filter(a,this):this,e=0;null!=(c=d[e]);e++)b||1!==c.nodeType||m.cleanData(ua(c)),c.parentNode&&(b&&m.contains(c.ownerDocument,c)&&za(ua(c,"script")),c.parentNode.removeChild(c));return this},empty:function(){for(var a,b=0;null!=(a=this[b]);b++){1===a.nodeType&&m.cleanData(ua(a,!1));while(a.firstChild)a.removeChild(a.firstChild);a.options&&m.nodeName(a,"select")&&(a.options.length=0)}return this},clone:function(a,b){return a=null==a?!1:a,b=null==b?a:b,this.map(function(){return m.clone(this,a,b)})},html:function(a){return V(this,function(a){var b=this[0]||{},c=0,d=this.length;if(void 0===a)return 1===b.nodeType?b.innerHTML.replace(fa,""):void 0;if(!("string"!=typeof a||ma.test(a)||!k.htmlSerialize&&ga.test(a)||!k.leadingWhitespace&&ha.test(a)||ra[(ja.exec(a)||["",""])[1].toLowerCase()])){a=a.replace(ia,"<$1>");try{for(;d>c;c++)b=this[c]||{},1===b.nodeType&&(m.cleanData(ua(b,!1)),b.innerHTML=a);b=0}catch(e){}}b&&this.empty().append(a)},null,a,arguments.length)},replaceWith:function(){var a=arguments[0];return this.domManip(arguments,function(b){a=this.parentNode,m.cleanData(ua(this)),a&&a.replaceChild(b,this)}),a&&(a.length||a.nodeType)?this:this.remove()},detach:function(a){return this.remove(a,!0)},domManip:function(a,b){a=e.apply([],a);var c,d,f,g,h,i,j=0,l=this.length,n=this,o=l-1,p=a[0],q=m.isFunction(p);if(q||l>1&&"string"==typeof p&&!k.checkClone&&na.test(p))return this.each(function(c){var d=n.eq(c);q&&(a[0]=p.call(this,c,d.html())),d.domManip(a,b)});if(l&&(i=m.buildFragment(a,this[0].ownerDocument,!1,this),c=i.firstChild,1===i.childNodes.length&&(i=c),c)){for(g=m.map(ua(i,"script"),xa),f=g.length;l>j;j++)d=i,j!==o&&(d=m.clone(d,!0,!0),f&&m.merge(g,ua(d,"script"))),b.call(this[j],d,j);if(f)for(h=g[g.length-1].ownerDocument,m.map(g,ya),j=0;f>j;j++)d=g[j],oa.test(d.type||"")&&!m._data(d,"globalEval")&&m.contains(h,d)&&(d.src?m._evalUrl&&m._evalUrl(d.src):m.globalEval((d.text||d.textContent||d.innerHTML||"").replace(qa,"")));i=c=null}return this}}),m.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(a,b){m.fn[a]=function(a){for(var c,d=0,e=[],g=m(a),h=g.length-1;h>=d;d++)c=d===h?this:this.clone(!0),m(g[d])[b](c),f.apply(e,c.get());return this.pushStack(e)}});var Ca,Da={};function Ea(b,c){var d,e=m(c.createElement(b)).appendTo(c.body),f=a.getDefaultComputedStyle&&(d=a.getDefaultComputedStyle(e[0]))?d.display:m.css(e[0],"display");return e.detach(),f}function Fa(a){var b=y,c=Da[a];return c||(c=Ea(a,b),"none"!==c&&c||(Ca=(Ca||m("

    ++ ++Main]] ++ for _, test in { ++ { "Get", "test_main.lua", {ab = "cd", ef = "gh"} }, ++ { "Cookies", "test_cookies.lua", }, ++ { "FileSystem", "test_fs.lua", }, ++ { "Libraries", "test_lib.lua", }, ++ { "Session", "test_session.lua", }, ++ { "Variables", "test_variables.lp", }, ++ } do ++ put (string.format (' · %s', ++ mkurlpath (test[2], test[3]), test[1])) ++ end ++ put [[ ++]] ++end) +diff --git a/feeds/luci/libs/luci-lib-nixio/axTLS/www/lua/overview.lp b/feeds/luci/libs/luci-lib-nixio/axTLS/www/lua/overview.lp +new file mode 100644 +index 0000000..4d17002 +--- /dev/null ++++ b/feeds/luci/libs/luci-lib-nixio/axTLS/www/lua/overview.lp +@@ -0,0 +1,64 @@ ++ ++ ++CGILua installation overview ++ ++ ++

    "> ++
    ++

    <%:Diagnostics%>

    ++ ++
    ++ <%:Network Utilities%> ++ ++
    ++ ++
    ++
    ++ <% if has_ping6 then %> ++ ++ ++ <% else %> ++ ++ <% end %> ++
    ++ ++
    ++
    ++ <% if has_traceroute6 then %> ++ ++ ++ <% else %> ++ ++ <% end %> ++ <% if not has_traceroute6 then %> ++

     

    ++

    <%:Install iputils-traceroute6 for IPv6 traceroute%>

    ++ <% end %> ++
    ++ ++
    ++
    ++ ++
    ++ ++

    ++ ++
    ++
    ++ ++ ++